gsoap-2.8.28/0000755000175000017500000000000012653650174012275 5ustar ellertellertgsoap-2.8.28/license.pdf0000644000175000017500000021361512653650160014415 0ustar ellertellert%PDF-1.4 % 3 0 obj << /Length 2924 /Filter /FlateDecode >> stream xڭZIs8WHUEp[gܕę;9t@jJTTRܕ\b_8[Ј0,q" cBx^}XX{m]#< B|A)IM(`Fbb'TznjgSل$!WGW$bCL~HLKˍ˺X'sXW[3jwEYf(ȸ^G8>KRB1d9ldB]ftt<%,ƒȫإoq7n6V*fk/2xM{upEA_G"clm__|“xqgd 촼oGk刭^kEDġ'<(efJ/(WSᙄGs<ǖIsB:ZW;Ws20&Υ "FPOaҺh.9FR"gAx!?rVjSSkӲ9'I<;byfa@ds)iӚQ#we#\т(^(!X|;6wl(wxx3ysow?ʼn<B(ma4cn3d "ĖzlMBDL<̴HYZc3 Fx`pX#-lM2 Jbv0O): x_0iwW d=&Rxu`;.AM*jmUT#lztjw\ښk¢Zu(jW;g}XպMg̏ʐ(w6:X|)Ru&E_bhQJ$BSAXw+UIyo~}p{~>3x3╘=DXqg  Հk4HN1ڵu^2;U%1)5kdm\}l «ȂRR: w}{rV2m,$$f%6?"f|h6JQ&J["˯_4SoL̄7HN*nxB3ձ&;u܌ԑQ"ac/M J2.qzXhҼĺ ١LOޜL?#EDLcRּm`moțxcNN ,f [.[ӄ1a1fȆͨ4ڲ7e!׹^[&gk1M_ڹM\Bky{'M+ b>6ځXr;tL5RەFԪֻ?."~ ]V-rQ;0 իpzuu9%kuh6r<: rTs Uf6]go-,r}%z1{ݍ',t4F P":1A:(TU7_7źl NKo :6O40[$n ?-Vg.h T BKCqS\[4ugbU!IM*YfSӐץ_& X'+m3v@ύxdst^h|(ts^e殶O;a.R~?6_LM覵kYzBlU]ߦ_ak&74[{q#m.鈵VOBjX'ɸjq]x@6'-_̤3~'6Oj4U̸&"_9s{/%_:A)gIQG2rR).s=>ndaCe{L@rƔ!=ye_]TLTUˮ--etmi3mY$Y;KٌwVK5h~VR"3Q_u7Ζ^ʹ+VҡlF4qHwPxB3Hky_+Z)d8eЛA:*(;p,6g|*(2OШ{&$8"1mQnmk3;y͉+X,,\6?-^=K`{.VڢJ1sCv觱^LM"A["bkb&]nd{Om]4XeM<{N&B.h͂! ݃}?' endstream endobj 2 0 obj << /Type /Page /Contents 3 0 R /Resources 1 0 R /MediaBox [0 0 612 792] /Parent 13 0 R >> endobj 1 0 obj << /Font << /F32 6 0 R /F33 9 0 R /F36 12 0 R >> /ProcSet [ /PDF /Text ] >> endobj 16 0 obj << /Length 2945 /Filter /FlateDecode >> stream xڵYYs~ׯK*`L,ykM,9Ȃ#׀:U 1sMo^e~vU?0S>tx6YC#v\otx7M^ ׿Q "$* Q*o^ޮU=c'Zy" D?SZGspJU}oJyTUIWE3uȣO&YzǺk9V48Ym(>]Q ti` խPU;MyvFE;Jm:svMZ^!oLJ3a⍻V}mﱕb|I?<'sc&dFW֟@$U*MʋcLArj*dPEL0:5(-ٖIL-5nY(KLGǒ]c;CGQdbN,s®cu[ iDBsui ÀvAVYo@`uqTXy=bhuEܯ*M}X,F N{ӎfjg -(`0.75_4fa7x n60o% ;/I2TK8~w7%|xs&<sl;n8m)?N!XɘFbj!aeڡ9^FťĔH"~z&@NJ仪Hu}5h"ؿ8퇑|۲;j灕I-pݜ1V"ܫRB7iG!b<96Q`j` Ǒ'|lY/wS{ G鲪Ctm a`=tL'tYV/gSA槩 gqGwKpfHZk"UX0}"ȧbY$3rRj3B[Z^Ot)v4c_ =Z1f(f4t~aF|x#?M[@ nu5(eDjd?@6\3 @.$"al0@<8 9le`,Ӎ#ivڈGnjBR"eGКzQd컏?t^ ow/A:׏>q-z7 b*9wwvm\Fhm! n6DXYHܖr8HT8Z_JT0Q'p/G.}=*8®OkvP1b-&b9®/ԗF#Hè;FLq/lRRPTӃ # \BGO!lH T}q_|ll[`B'+0c4Lt,zJ-bS,~K$N" =2j)VBi3{՟!x̰ kvKDu68&)uh['3!M*t)aba , ȱuz9#4^qa.B_s+N;Dć|@Hnߩ ԼͲUcHpVKU;ܯ95oa/9 H-PD b9\ ,}r+64],#D' Ƃ#ҎKM&oآ0hõSX'PcepGgЫ4`oT˘:,,s47ڒ7bdqz1rہp"._L(<Ϗ |. ÜaMDG©絈%X8$1'_w*9;1-\"4u9^Bf*ؘ߅T&&8ގu4fdcOרٟo?(8w_!#43WҾF_? w{]3*(Mٖd걔Z^L?Ǡ&8HDw'1忘Xc \A&4ܢ endstream endobj 15 0 obj << /Type /Page /Contents 16 0 R /Resources 14 0 R /MediaBox [0 0 612 792] /Parent 13 0 R >> endobj 14 0 obj << /Font << /F32 6 0 R /F33 9 0 R >> /ProcSet [ /PDF /Text ] >> endobj 19 0 obj << /Length 3798 /Filter /FlateDecode >> stream xڥ˒>_5U;4y\o6ɺıR}Hj,E$}W" h4o>>|Wcvy'f˓ ] 4cZ5QzNuŽٷ͹;uI_?~ ZEydVhtFfOQ?j_f"@TF!A#qD+p.^tDU3N@uNvIߵ/HI%*HL qLD^`F=Gn14仦Qfu2<먆GO$YXxb/:?JʽGl2Y$Q`x( %\8^@'q9! qv7 p _ @e`}4n@'G3r$f \|Z=$;--8Tck!TLC-r]No\ڦ,=Gpq.KSw0'mOH o4'=QHr&B|,Y-:Uՠ-ëuw:-Owc.UX{qTǖ@;g[[axRU 8H3#4M}xApv%Fio?pC<}v/?ߝT0Orhϓ2 21Q9o xwhдœ!QBL?lOr }k!) z?% u)aPs`o<m͜4?.K~RĢhOBRCkWW9Ù Av6$hEQCT7g/A:"  T(a|f4qp_uleq%@ uZc -N|j|쀳<ݽ\cEw/x B ,>s=VvhEe:YihtaDrH<yd }y0i֑a c^\-*>%S;>>ю"H;I=Km:OL=i<ퟠV0YEA bb0מ D1FhtŹf&y3lmf%MT/aŁp:_c-upwLY3* "R͡D* q^nGVt8tg;k&kmE`SLvI۱%沥U|hpd#Q(T- !aё#j̓DIO T@zyK_0:yj9Z1rSjf_CH ORxHW 7/5D`E),S σ4oF.*@9 ӘXHz#T27q#2*q3 C{=Uܨ0b7HV`~IdzjЙ3p2ZRlsSrPfvh dǍ뚩%#fwǜ:l"7(2SgO=L"2 L:Q nF+ wa9f`!?4ߕ YЁ)'œ*r}# #DVz38BSYn;<IQϏ#2~f"NPG.ZүDK(ܹ/1@t!{gpkfFIzv V'T<-eE=atlpS6"ףn]}!,'BX ;;v:#xʄZ$K{٣#+3$ϩƁϬi%<ҭO8dysc%33tHM0t  0q%d K$8 D:_Zm7 >m|Obc[޺$XhGpZ`]KlWeJ;*gYp^ٚJJ % /|z}>ͅ"ĜƧX='1rkaJ xb ة{B;'&UAF_Htb=7o _=4Xr兽hquTW_[:_NOmx&1ktV bS+s@N//y- .Ebx+mi`J?m!4: DGH=!9?(_IJ\F٤ +kؚRRT:fZ$A2C#X߮Ilü K-6א5.86^:B2L2$]lќ@. z $%|*VWij!1%(3BN}#ޭAOn46UX[_=^?KJJi]P1#&G嫩((rٿKuSw چCWα$DG!x<iǡ6ӹ'PH8A=*脊2 y8G#C #!D4$"ЏO%ڈJ [>s)|ƯLs52%A ٜv[gc ͊ͱGg|"֕X1Kp_EgtbIQJlS1Z, =GLfi@3μS +vqYrѨ>'ӼɆS4Hc'sj 2:Ps( n{vޚ!M,v{P:ǼOq󞹌i[Qzr8,FsE-Vۗ#s N )V5c^o6Ψa.2ճ#CZߺ+&[,t$:wa"tF|"s0\ m`v< (A/CV~)rlXRJ7,Y&EhnR.ENDT4aiV@y>%8%VH)K73ˣ1lH`i\,<]ҺrgWIG|ۯG#ʮD*7+?g3֝g endstream endobj 18 0 obj << /Type /Page /Contents 19 0 R /Resources 17 0 R /MediaBox [0 0 612 792] /Parent 13 0 R >> endobj 17 0 obj << /Font << /F33 9 0 R /F32 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 22 0 obj << /Length 2922 /Filter /FlateDecode >> stream xڥv_Gq](yb@h`'svA(D<ԭ^˛_l6Ͼ]֭oa6 m{j[X D3ÿ7M=p]"e` 6OZ D,3&2>+[PRH(jn`jJYV]L_ˈtC›pycƭtCAp1pw!st[>\0ۅxdg:?}%azfmPCK@"$, -G qpD붾k<|*hR4KqN=c_v3ojg]I#8OHj~_0|S K9Z>ȚDdyN{-rt4|Mч6R/jKAo<QUTÙV[i$  TiZlfEw&,- жK *k0U+=ń//\FӋ?ʚZMi5xYV0$*Uk)0Ȃ7+hMMIp#T ZPpdPxk7IޅqJG:@L ہI,ԥ94ȞNA/m T+` AMg4H :PZh3j?n_quZWJsVڪ-:ɰ,3 gk )Pۭ=R^ZL.?5YFÆBťqz%otVM&wu6C!sEdrf?yexU`&&69 ;c WH+3bN >cḒj7u3}W՞eV${aO!JOԌ6L/Ak6&_&ov!ᷚT@By9 *#8R9&6' @ZH828@p+!dKfKRV=.pH/V VykW)z]iϔu Wzm܆ttRDdAo4gQ U Hf5S/>KL c`&msQE Cg~)O8pHRPB+ņ&(f,5e[NEyB %K RacJ&7m=]T,1R5~P*mZɯ~U{W~MG iw^<-{<ߙhbۗb{(z rwb4[~K{8l@LB, ,Q1dq|oF?}aS41c=Ȃ?aT]&]sY6 .W޹x@S[gj) b=Em*En' aFaO9a?ї[fwi!Z়^e;3ZnY4^MG2Z '8jGaw^ X Ch p\A3-dz;k%i e1(@&!g{8~)ålτm(G1=4xL[.FYG# U̦$0NW E[ 1z& A\:4>_$q64yNeY 2 yw<X*R_suq\Z-k(Ӯo4~s_ib Ï w!i`E)Ռfhq =/ɿ L Ma#R  ]a ph!0'PfL}90^略L']?fc!D6>R8^= ˖m@MS>w endstream endobj 21 0 obj << /Type /Page /Contents 22 0 R /Resources 20 0 R /MediaBox [0 0 612 792] /Parent 13 0 R >> endobj 20 0 obj << /Font << /F32 6 0 R /F33 9 0 R >> /ProcSet [ /PDF /Text ] >> endobj 25 0 obj << /Length 3198 /Filter /FlateDecode >> stream xڍv8r`7$`mY8 ?llJ*[%!u{n/ жL×lKߵ:F)7%'*~deyVq̭|qc}cϗyD@!l)#[E5﹧Գz6C'hÜa&j%XL-V8>HGp5OIҷ-c `91{1^l_x1&š]mP:<H?t.1e0:y zY42?0_-?Mp$P#=B -PWAI H[ffy`[*Vu]R),TeZmb۳6ȄD(P`%(b\--gVtH [<';/Ќ`'E &yRl'perEn2U K,kfɜ[-Ǔ 7PӠc+hKq-bжEg{4NX¶~Vh̹NO ΘULZb3 t8k)/KqDgIi#*89E&}3&EЊQ=;"no%cJ8Lj2J[C^L-9v 9e qVWyGcRX,Y}fWq Ղ<.SAbrf0hй 3p=]o p(2{˳Za9ydXss0"5x"YIjtU?%lj$%ڤd}9/pKEC!AaH0ьE&ktZ#p؇,W9h öy#t ]&Ceco?q4}2G%K };Ө+%e1ݻXsXLJ"֬Vz|8.wI6+PCDeU6;N[zGcG⟤5 +rāM,oWfc3P !&lsf8B,LRXcKjCV=-](_Wó:#lI7o{9G&Цk1~[ub/re|ч7ZNI5enyx١UN,l<&HOۮcaKwooՆ1#8呕5-+?b|ǎԶ{^!.沋JRpՑN0"5^4ᷲ:2ȃ;|<9{&¶k1/%1D^ rlA#HhJf[I9p%!(A*g녦~Y, GoжL; {w8Bϓ.&3: tZWCqGBr׈!8Tό)Q?3ڿ!wv+wC O2x+mTD@dX8V9lL'49S(#(7)muǡ9Mb{6JRޡƱ<vM#.S "jϬYŌ~>Hx'+@es!s%8݆@nCIdWW ܷ ^q:싗,'O^f av\рUD8YG#ʈMԂǴ;b$0z+9 j (HNA_Jf\R!=Y fsUޖxN2 7ՎW,ڄ噖GD4f#w:a¡$U=u;F]] 3ިӼ[ߙ7I8? Q4mE1t>_Q]En-Зhy ʝ=GqILQx ] W:jƄ}rY)X 6ctަ1owyO0D>Vf7߬Лm6q&"WxNyϠgGu|q)w{ܼ\+[@~Vz ^=d@KA4V 50!9RCI/G{fJ`z3x8QM+/ec-4/,W7&5_/:AMThM = V~Mjݠcwe,='׆Zv_j endstream endobj 24 0 obj << /Type /Page /Contents 25 0 R /Resources 23 0 R /MediaBox [0 0 612 792] /Parent 13 0 R >> endobj 23 0 obj << /Font << /F33 9 0 R /F32 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 28 0 obj << /Length 2815 /Filter /FlateDecode >> stream xMwH_{1Ms"$1?^w0]l<'+ L{%JRI*U͵l6Q|?TEխQ}KySi-y($?|Zʦ!}"֤ou'4#(Z4td V?"B#8TG#Ƅtw5~7RGc0Wk&ltiAW28",ʼn;?m]rdc*<~CWK?. 9хs!& 9*| H}tU ~3Ƥ5}g 9>~*§n&P6ύ]67#b3:pFs23fC|àS:'YY) ROLH늮j?S10L3G ︁ Ccr^|:b#࢘62u[Q(^~:.ѻ Uڪl{4U'o=ql|v]k-i&rGNWߐ2 4[1t=AJjL kBRpX~,4n 1vPͤ4@n:o|&-zf23yMdq V.ֲJiӔ$>' 1s7jR𹯐iٌ%!.b ˊ:O;T(B&CK8 ljڢ,ED.6=. Hp"wMNhl|UaJ~sAV}ĈQPтPAt\,O߬h9 x&ۤG{znlŐ/A(j:Ħ-ݴ7bFoJވx*ݛJ`9$ݖOMTݷi'cO&]f9rj[k Ot\qeD'"؏p1 dP~|;_AfY.@0'E.A^kJsdPdM' pUȏ0Lb7m׫ N#.5{NZͥ*);P@Ev$G[ox nȤY3?fW3 [Y.\$:S4oQ9Դ'"tn8MzJߟh#i.b#}j(S IbOTk<`vuz Cב%YR~OVP&Wd-!dτ}JTr6>j^ޟ<$w%RG#҆|%7yK`S-VY Aȇb&?L!= 'zݩajyE~naDSVIj- kJyA!2EUw:O(¨kِq$\*GR"<]< TA7;! 7X85^hj|Wp-Iw8uxR\8kRy|?Emk sA,Űe?⑺bL-h YP)O_bLU@SC&~Wz0'>U+.28.[JCdf&(xnu!nl/ ߽ nJb=FQ{2Sޠ+O&bly-:{D# }]e{k s s>s`t#OB$? ?S-mjK:SK }:jfS=0 U{7^*qMҋ3E 2?|ʅ$f~x#+^iȱHe"`nj*Tb ;O;A ({]_GW3j\q+&3ԴGt/V<R4f~ī2L!n~9}T.ftk:K0QEW;TsuOqИKǚH)NPIAS =|=P#Lݜ<EgUx`yKy\/P-[WgV;/ C+j-%Qt섄`oCK|C[rK'ƻd+(j3{"aPPhj Eښp #g Y n`jo`< |}bv1>yDId4(ّ'r~$k䞈ԑ[L UM{MQgڳ`tIht3;_[{?D%}.: 1')ᎨB=q5E>{i:S VraJfD endstream endobj 27 0 obj << /Type /Page /Contents 28 0 R /Resources 26 0 R /MediaBox [0 0 612 792] /Parent 13 0 R >> endobj 26 0 obj << /Font << /F33 9 0 R /F32 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 29 0 obj << /Type /Encoding /Differences [ 0 /.notdef 1/dotaccent/fi/fl/fraction/hungarumlaut/Lslash/lslash/ogonek/ring 10/.notdef 11/breve/minus 13/.notdef 14/Zcaron/zcaron/caron/dotlessi/dotlessj/ff/ffi/ffl/notequal/infinity/lessequal/greaterequal/partialdiff/summation/product/pi/grave/quotesingle/space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/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/quoteleft/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 127/.notdef 128/Euro/integral/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron/guilsinglleft/OE/Omega/radical/approxequal 144/.notdef 147/quotedblleft/quotedblright/bullet/endash/emdash/tilde/trademark/scaron/guilsinglright/oe/Delta/lozenge/Ydieresis 160/.notdef 161/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 11 0 obj << /Length1 1612 /Length2 9044 /Length3 532 /Length 9892 /Filter /FlateDecode >> stream xtePݶ&AChqw$hp@qBp Cp ; {uΟtUW{ɳ79x8Ej` *¡ q<dAp0"g@V9%#"":z8mlfM=66Z,VTVy!#uxq<@^>!SAaM`xyV5;FO-sy2y%Ϯh!VO?nKg'UO ע@ KXxiFϐQWrOjl2hUb ΚчF=׬[}$L퉠_YTY: ضL>K׋:RYA1ZziF=qtKxcTM܂_@XsysK4&+3p_/R:^YRjq(hڼL30 H]pq. 0RZီ1;`h*zՋs]P 2֛N܌7-_69z?68R2}ז׈hK9. XL =} !L. v&b%-K;~jf,:+-L,sI &0 n2pld^M}pjwk4`w݃+g)c ۉMX GDEVdޟ)q>aWJq> Tswk|%ms F *mˇA=CzDϝr߲^-_Bj%@B[Yy/ROnsޡCэd#r<ܑ}j~+NB QJu:%ݔS9Srɹ<5,Ͳa[+f>Ζn8WWf| ?ECBy;{Jal'ϕ/8S㼂Sܚ4mNY i0DYRm-SGqÆ(,ɣ/Fdfa?8l0kAq- f{eFiQVY< V8wzio]au G ވ~4eޙCz("(ڞe *W=[؉?( ymܤַ;306,W8ݪFm6WEoh%hYt w'n7dhRCs$x.`!aYSM%>)Pk'Тקlv97ܥprTsfEԜmv߳3~zXR=3##8u|-_ݏg}?`ҹAK:xs(̣5$}% VHDiPKSgKsInd05"S\Ipb7}2rQ-+IP*wׯc iհ#[*qmvJeUyaZ4h\N=ϼ{jLtLE%îN?6 lxpg"l! I)ϬU4]Yo|,\B YlmI. ݠSNlef47 h36}SkS)Ѫ~cLl 1r`rCr6$(sAlIsO$/IšȔa{ӛfa ĵ|=sl qǢJg ŵw?LHݕKj_xl8>-OSK _GxDq "(NrF=dҚ_h×v<~lqx+{LB)!M݋ SSNjSajv93Iؙ<Kqe~)): q^ɬBL6Y1Lrv  V`?^`ҾS6! U)gEEq3,n~]y.\%+p er:\s"gƘ "& 4ڬxD ^,DdBC$/jxcܵ_p&p!f3X  ')+7vw${s o8L>l31au`3(:B(Bi^Z:se6@0װh?X[%[ؠ=\f3]2hK ,Qf>˛f8V?2Jv L@j;\yhw3VIe;@`=@s_Ju}#?#Y&NٜD &Ź[I-R둖#=35'}/G8zͳdkiS>eu5{d~WCrzY'ޣ[zZ(aoؾ,r (o^%(6ӯ?F; `-!cYJsI4=-ɯ}Z60Ak~r>a:x,tSk@!Y9Or:˄V % ,IXUzjUV-^skǽUh-8Ola =ô&"Ư̙sњOz;rڞse (g!`>f1vr>n$(2HRҵRZ { t!:H@ ѼIfo?]&yɺ~>SlS.@<x;P8l:XcRûqdHC3T^?Q\{ :bC3ymeJZ~V&AZyޕhnPz2lޕ#w<"xA:}ji}\{ٳ}J-kB}c. Fu[΍wčSX?yz,.Ń+aYV ?~Npү7^H#DuS^ \((2$9"YnYҶ1j^Kn]"f/ƴX0 qUھT6ỴHxBʄjB?%,zj'6wp>c7 ޕm79P ,<j*FDW=Oz6Y.QHW* BFhzbؽKEk哓5c%(]ۮϚO 5y'gk'RcubpgMIj 6 *m&ڑNJ$;Fx$ئ0( nJ^(|׬`! ({{_T;N 6i358tE,(M ߠ+԰>WNA}0H.=7}K|f.ٰuM^Ԩ/$, ?uO%BBpFc<+o3gIpx(L"}uS8=p"$ 'RQ冮Wv Dh_JIQdeyxF.Re05)vxFQՑOcm, Wsl&މbn,n%OuS_EV!Ȕ9> %XFJ9S˞˼ z3&)$_qPDٍOK~ůKǴ]^qm*ў7J {ÄWٱ^.ZDP:&n~"e_-슜!EѸC,ȳmB8=`&aBbz$Œ]Ѵ伬>H ڲ|h@ c#M^bschUg[uOO Gᬖ=e6hxnb sktH6DB0*ڝșG?bUt[dٲe"1OT=ߊ9mRHN"}}\p-6m,ȐGxRMBX]<CyjqqAn&h?)38̰;ZTMWo<3γq oѳW@F)s: CZ).sѱ}"@ʰ=v7|1`9ف0}C-_i^f0wmƨSd ޓ|i0 Dn-Rޞak"1JʏOjP)Av[N-MEMx#ՔOiÁTGeα^ڔatmL6Fyͱ9>4=ZwN.4 õ;ӥSKʥ%&ICc_1?ZT?Xk]qG aTQs6K$2*`;.7,?ccZ f%Hooliqme'l.쭁Ht(y؈ -]lrH(d2oPSv{1v&Ma%)Azؖ' N^RT֢3 =ߴ&Ǽ_clz2oGd2 C r,+Rt*s/z7Jش4Qu X 'i$TcfOMoE mxC)az`~9_;4dOqϐ? 90y\9H~Iz}<-nnz%)p*K@Q^K㰞B4Qw\` xx/X'u'DBkx0ϮsKrпC9:Y%K.9$R'KG$ @}0>_zhRnO3%&b5Zӹqͤ*70@`KFb5C&z78L67c^GgDiC5ܐh-f*EƊTub}yŽa&ruoO5Һz[њa?lt΄!, T;MS~|鳊&q؝2ƈQ0biJ0>٢h if˪ 1HcS46X1// yb۪D maYePo 齜oB;%j[K :`W+.ԹxL}pdҺMzBgfPu` 쿼QhiB`ۗ#Xt:ޔ*Zݘ0hHFj_*jLl/:$nMiQޙ|-E-%:e[t(37p{zt|4*.٤uFgіE+:%YπdOf.`c(vpTh|JI/4GxG֌'.3 2|ƞOg>}L߮?owg/`Saxl">&Ubv`!9w3\9\'3GkowWNH*~<߈Gp.O|=ό<\zy N"@~$gѹ^j=K@ JeFf ~Ԯm9CiBAlF:QjA*ꑖ:[AI &SUvp_6rKegRweEeky@B8/3IRk[4p?<>D\w7jV1hc|'\{>b%4} 2 Og'")s鮂5aVݣ'_n/ ux!V@R5.8ˏ,UK#%.SL.4[we~LT+m|iPM=~iI gFh-͡M{lz,Z ?bS|Iæҗc<8|%3KF*i=M(.9TŐ~_|Me|CH׻eJ:$H+FZEۊ1Uԡ:EUQ]T%<2lW)XЬ0VVٲ  -jh䃰;%i/3 "`z b<*3

1oggB!Ps$ov?mSz0USFLQ-[r9S|[gEMd=_[$OF?@MvAeRw AKG Q4۝@HK,4lp1+*Y"PYiI%+"NJ7D;y{EmF]g(_KݕX]V\ #Y̮.443b"6 `B6OXڃ̝Psg; endstream endobj 12 0 obj << /Type /Font /Subtype /Type1 /Encoding 29 0 R /FirstChar 46 /LastChar 119 /Widths 30 0 R /BaseFont /VKWOVG+NimbusMonL-Regu /FontDescriptor 10 0 R >> endobj 10 0 obj << /Ascent 625 /CapHeight 557 /Descent -147 /FontName /VKWOVG+NimbusMonL-Regu /ItalicAngle 0 /StemV 41 /XHeight 426 /FontBBox [-12 -237 650 811] /Flags 4 /CharSet (/period/slash/two/a/b/c/d/e/g/h/i/l/m/n/o/p/r/s/t/u/v/w) /FontFile 11 0 R >> endobj 30 0 obj [600 600 0 0 600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 600 600 600 600 600 0 600 600 600 0 0 600 600 600 600 600 0 600 600 600 600 600 600 ] endobj 8 0 obj << /Length1 1630 /Length2 18356 /Length3 532 /Length 19270 /Filter /FlateDecode >> stream xڬctem& wl6bVcgǩضm۶m;}q?c59^Jƶ@ [=3@񇭵-௜\h23y@c`#ڹ9T?ԩiiS ?4=MmVv@_kGe 2ḼQE%MiI*@ht0(9Z̍6@j?92vF݀F@Tt;g# [? +!;ۿulAFv ߨJbdf'_5䯥?%Kd`n]A2 f`4mL3: /?:KvvVn2acf7 ?"mcb `f?t@5ꟙhǨ` @2 B -de``wc Y4V?ks+V;4o[mLRo+Xdd01۳UmV6zf&S1376t+FY/CRqFux3spY޿ q߄ @u31ϓ15gtA6 Q998%_ oq@#E[#TP vธvo7@z<*.mr@IS}n,+ʮ$e./R< 6N?Fb3y-H-&?ޠ &X^=Q:`=!y%Ec4䟞Q?=R t@fEÒ:C"Rg j{DaIh9U&33I4?G-H9`=7PZI_Р2OH;*$;Yw)f4q>W 4Zk˺3Clԋvq ϊ r5B1Z>I^-;X]Vޢ=\ A[YE$uIxxlUbW0 A`S9YlBQ{IˆKgqfTW 8=@dH;W]yxS@=(\ǰ`tWBs q ӕu ^QQYJzڐd+&?Ź*e%,MssYSub6{$EO̟Oܦn7`yRMx!5̐"?aMU3 i3QH C4Nj{Qo7ffQƽ-,G=Gg&!$)qg!m/˪ T`@q뇯vj`Cu`MXk/eEDH[}H<_c݁G@&\'FHL#kfCW32(ĜBϮ>}5wjˠr34=T!4ݓЮ H',YQC7)p(wEߖxtark`! Pc R:olBX5O)N 5͓Ohg+lI|+-=:skhrpS$'|r{̩1N4Hl`J؃~Ӫk 7= ;M sL'hd ZO<ʛ4,޾nAy>泶@HƇWtqy?7_ӕd''X37@UI/%14Mv,x y>+;}eY־ǟ[qg^ 'gZ~8ԄBQeZ5F((lvT7b4ɷ~E*.#ihۗGIjsA^ [A  gw~30tTG]o:%i'' sR`nL+ m{ZM+AXlf˗Nn'UZ7䟦{uS*lAOD9*vp@'!`nGb:I &GQtGJWL-?%0SD#rIZeq.cc3]'Gݟ .1ɢ Xkj*(||}JсX&>{|"g)H/|RcobF0=dFK7'c**Ӎ(DӸM76oL#~ ,-mQGJ+^⬸]P ~'Urn]Z "4L_(jO ŽҐ)h8gTpx_:o-5giFyR}=}ٜQ>U-ْALόTz~gքr̪;wR/Ó.f̜}g4ROVطŮǪv!@ɵ5Z̈ zP˸0`r0PDduyx&-xH E9huƆ:ȋ:@Lq>!м&Fe$]s 6uddM~852˹&t:cmSh vXq il L~9x=_Q'hc1 |v]z5fল~Uf@Nlܱ-N8 oW-1)Jbmu' TJ'ijtfsktHմP.biݸI-E~A 7foxbz_[ѵ|ˇ \􍕋Ѧ B_ژeQ 򒌬tkp tw'pJlSe5D6JK)plGq>̤ "O 6ǘ#6TFې $:wc]+Cr_fА]3~&t9Q$O>* 2v =ܰjXagɸex&Ŧcy{'1kbWFwBHNs%9 3C}@ w[ P"N(2XL!XwVrD-Њz $[.9Ѥd]n4ԄOtfM#ۼEI}AKɷ E3-/ אQƒxrNX T! _$mC}~8O~I&x8eS-I#pv2e09`@+Av(TWVV+tQ I}@VWꜭ ʟ~~#RYfY|&UgTðk8<!D{wYEжȉ?| /70UeB ~˽=P:ׇYKNbn8jc[wȬ=o%ܳBxzm5gpD{WV:2W]iEؖFޏ޴a{ ٤ƍ2#M,'Ti/4sW; Zw $G}bٌc5W_[{Vq*Z>qHDZaBfplĜN|Pt~h)*1XѠNfK<_ 6ÌE#X{b8gw=4O(t$K`[6Pq+!`=oT) cs, `C ᕎV3?N**e}3ƋoSRONdy4-ƕPG"2/yľoqD;^ܖתCKaw%W[tMx㮝D9xFhr Y 5JHݠfFˤ0Cs,; ]-Rbz6HդӕMW,~jj<ÔԎ)}R&e|gǬ[Ic?6\a0"i:PC2sDR1Y4sƁ|?btgo$HMY%>:ɾZj֢+5xDK᩺h$ ]Γ~tRi rgW֖b;Wxf"*m0jw b")톮/<} >|ʛm W8urI4ݫR 3[mA2vr),=n)1P4JWy V5oUW8aroi3|ŗ$Fް$:CUnuO8KPj^Li9iZAjBm}_(h :]Nޫ9~ˌ¼w#/kLt2~D!VS淡v].vUn54QDiվ{:D9[1o]CdDU$z(楃@dg6܃\` /ub'׽QSV0Od۠]DײcAIש3ڨ`à d)'`* 2jrQH:\KXlpE{ 3-Q{-ߦJoz09:,ٚMPegxII$d,p+44M!--P9.O$"?eAG\fg}D4 lIZya&w4&n M e/H13䖽Y({3 12HkTv$ z9Djj;Ħk֦3wW NN,t+ӵrrhUA_t ghoK,Pڸ=r:X(K§(]+<Ъյs)2M B33Q\4{Azuq{繄#XLNFS\&]* y@_({80w_qzjAsEDc ZtN\;e?or{!|}q1ټHsfΜCޠ0$= .8FbUǬ |ٹ8sI%8n-}s̎KNTBa7mJR4P_&u9G&a%H/YaIEhd}]#is d2I@pR^mqa}U"cJ To߿~ɸ#Ҏ)@3=g/+@AdogcQ$\M*=R1§!XɌ@pX4* !c!3jc GFk?K>}sl3.E!'I95gtR}o.`zKP/S%faoKz{tIP,KE;yэ G~*Hl7f5o~.]-c XMDpUyw~#铒#ƇR{җ[cRJlӲz簾3q?߇KoLpe慑m"4s""!hv+wʋum dx~vБGӥGCD<>*{6v̝z"#BGdɡ|tR]F D+|R+كaB[p{`(< ;$^ ' smnրTy7?5Gh< hG5*9zK UfW)j~Jʀvjb6*v*Nf,$RivIJ|:Ʀ$阊z)nl?qFXݬ `rs7z'P:%?_ U9ͅaޣ?u4S* 1H"&g6Jl:\zN 0ހr 7n&㝭"xJAo=2F.˴ 5|\hKO`=a`q. m)Fbj]Rl݌6oM譂q.ue5`:Mӂ=UrјB+;r$;qׄ 8ZݸaYkn SI+G ]TQ˰l$8|S,*7ky c$؄17] ̻[4,:_TF(# ?-aM7'ץ/*%.sEgTnZlVESH5p0rm͚s)d ۪(vkI*dBS@VvC mTP&U7[摍x7u70*;*W4~gh-j<١@6I]/B->eܯg56W|$!j*% ]k7KYTNHeA}I( &87kOR晉d +b>"]EI7 9xCFE Ar0)Woۻ l"r;ݮ[]IS&t DNc*Dl+"1ɠf #碃eK`_!qݷLJe#g A, hڋuF~a`A@3y*дV*5cQZH,ZTd$i2Bynz5FD3sLIyG$~Qr7b r^|#feZӗ]V'B5)ړy6^5(kBa 1'+%GE/RɥúX+jGI%G#=SÄK]LLƾLܥOh f9PWB, ˔m OvsݔYc drX8_`%Q-3tϢGfvW #l5ޑ_'mbDl0/[H銼9]rӯݴ$T~[n[2, `8)睗Qpg("F3o/^k:B|JIC]0YT~B.yL :^{-p,6Afs[ab=՟9J C~aĿ"uojefpI5p(FNsMLĦy l)LƝiS o?HQJ$jH d!xKo̸}Cp#m]ًêaRǟA1u0N}WJ7E!c͝mIh}@WEb}Q~E17/&,FװmǔmRU!eH[@<owIPh4c/˔G+faoW!0YrRDXow3cln'i. >t|j /mgz_͂<u* kZ6O 1~snPzzyzj4B6I$GKH℈è.m'Ef)mmB6~egJ֡V$dɎD\sqԇWXfr6Z^; <ђ$'-'wEE0~DP]HJt3OEzlc:KEH`iݐYq~3;kwFW.|s[5(e EvY@'| 0Eg ;Vp3lVXL~U{Ton8=NIXWT)M7GorC]]..Xm,z "%'4sDkظA%x]|L3߻3%l#s^[=|ސֻ ;~MW??RժG`dEkF WUI&m}ѣ4L͎|1 U*2&NM+ q9f:IOShՀ^oڰb&f~M%[_ b(<>Tdg>K.PQC7f^5cGlvif1ΌŜR ]fO\F9&J5qzޫ%'T CАc n oxj.d-SXf1 l[(x,~"{n`.0<6}$~k6 p+X((9uC"7> 2dlimXFew07 U vm\(4s&B;2*# F"LW8}$gu/sf(񲺄~?D3&yYz z} x]g'In~53a䛩U1r ,IyAW2UWkc%H7QI},J+ :fC@ oKpYb`Za<~<3`7}kM a:%**-.DMs$shu@\|3-;M\ "Z1C};)P·*p&9XdX#H]A|59k`L&ʗoBͮ_%k;w9|Ut[bl#m/܎a7tFbj;^\P"ukQDJ'WCөCcpF3ڼAH]Xw} d͹lHCL!9 ]8IDHu[[3SaEh.oz`蔌\_"5H1ӈYN@}3͠+ "g?ePDxy8#I8W~S"ʣQU0U?Bfu 9JɊC"sK}&[p2 烰̲!\2p5hkp*%]hFeNœ\9]N5D07$0Lsdt R]1VR2(3?RԾ1KH #bH4qlh_8e5WUgU,pfC8B,LG úوmC/ u_ћL1Bc1lc`q4{ ܀kBТנA/0BVQ)Ns 4=l2&Nl(h93\gQj`,UlDn|ٷF,G @iZC KI+H gDoe^"Q~2X՟l_ujHHiGs#&px܂ꝇoGcr(Ԗ'm= qIqr 3goaݤdӨW2*ܸb<%>#`!t/#>ܷp$ӝZ[BNWBB`%f9 xngU(p3~}a:ԥF 2j6q 8N.=$3||iWU`-y 9MA%wdF>?,!wC*S."z Қ9 >b|s0+Eu kĵ6IQ6WGny[4=۞{zM[' )G ! RhVyLыY7%š #d;įfdX9_FѺI]<״PYKf/ yI0钊H9KNr=IhzouV6cWf[ *˵_{E,!XE9A~88AB d!MT  krc]b~K}*min5uÂƳcUI#> J[~P.Q W4tXLn9Lw;w=k(y1c&7ߣߌ{!0/+K:}#JE\ض}BsT1Y(ҮZIі(Dϖ;}`.EDԀe0n}?VgxTܓuuF"0ƞφ\/ 9OܷBcCm+ XbxJM(i=?vgPx#JPK4:H9'1Rܟ[1˵R siocr>)Sk4TsX)"Dw& 1"эDsதk#U.- S$(NS&`9X9Y1U )Cf̱A= !r߮[_O.ͤ  arQ*WDv{:Qf|xbd=nN(οGoeH%ެgIs3ЉtuD_x9 >οO]JՅZO#Ab`͡}#c߄͉̀ȾœE15HpTT,OI ^1IMI(ny+UQg !H%7Ţb7Yr_Ȱ"@pJd rK1kz-q@% VD ƓVLcsa'K8Ob9D]b03YX_g[rj.ݧ<ꫵT~Aԯ#Hi|OQs"i~cd۬:s@~̝›_i{]A*251"=qk_ %%^U"mLvl_BDP/$ˮZ->_T( K:i''$_o蘿9O Љc-ZpQvxqzn(J/s\A0P>?6.+oC$o$zh3"Ձ@.Kh%#Z뤵/P^wZ)^ QGH?{ _~+>& w׋>FT\.S1;9]!OMfGDVNU44!s4Mb+rzTѱ &'Q@9!bgqP/3jhj*FF-UA<]t1EW r,6dUWM ɽ$>ǐ^? ȷ^2W#s/ۛ㈘2VG &@h0zBe9uyYؠ19@/jB~p u ,93K7|Bp!o)D O!Ublxp}OXݺYv}~aYS̚M616|lO(Ws tv1n}(m*9n!vG2 ~WmTY1|Y7.á-%`4-σxc 3.7cT4-WY"̺5䯐,eCo{/'-4hhG@~؅IAxG?@Ӛ-JbYs4#/I3`m_ !LRrIxv{RC<&iN#$b78T==&PEsO.y,on*6RJB/RRn^xN\Ӑs5>j؈N|iRX5yNimYEAGג0Ka x,WޒVBHaT%9W mu*i/W<%{jW![&&f+6{ ]8d# Ro]~A\:b{:Tp\R[L=B3§͈,Vwa'8OxH(nAN*}-d2 iYm;h1nyCdL$wSȒrN=i谥ozS(Aq}Y%uhhi_7ZrFgEs}pM$ X86K>r4۞͇vaV&چc0 ܤAc-Eo3wXf#R 5er0WgpcT[Q73܉M:Myi,OE8amrVcSDZ:#V}=gy(,F.p7;viN' &-S4|.]7:#<}'X֞J᫜hQ&<ѣ~t}OO;9]}c x \)(>*-Ïf8V50|i{GE35ALuP-z7N]am{? xt׃іYGMX@0 .NWڮ㚲%΢l ­{DphS ZT˟nፉ jh'4MApv9"ݷUءzZw Fv&DRP0yz1|F0bYa'4E=.a%o昜8xwIc5OSgv6EJO:w3K+2s6Ftvڻ-s9K8 l@1o!?>KupqB&0[uw͗ݏzaxXn#b?v1eo,6Cu$ݙXSpe'fGۼ/ˮƲ=i<nMw(ip쐹XM&ti }&P%νZaRhfv\()X"tE`&kq'wdVқNƓ 䫶7B*Sv4״O,:P^-_urqjX 69#k?G6u^v5Gh~>fbNg(ޒјiHZ2[ֳqxJ=Y|.{eKՖ oYHqf;cma4:DxcU30ꂽ_!&帅mUq%Rv--ЛW{#)۱s գ-S< ˤQS"W-8ģ+7- "Fz`H=oWmذaQBkY xp60sRe՛3sNug=!5b6('}0Udp.G62Ră#gYã{3!6( %Q~ wVV#Ky*\g,q- &B}' U-mYR/MfW>NIFG̨BWmT%s_^ A+[ \^" ?D7gkkp`b3,x"7|pnK5엷O݅p=f&,DSRw(Sסnw|/qh/E_;sτ8g!0&-}9njsKs7\[9f (f>}G:%h IGgAR+ôA7mߣFW˘ƪ@k@T-*ǁS&3'^ڞi8淳*D?wnf9BŷCPm/ry}y噕 a5oQ`4J֒^8ŶFզK5]ݲmo'rTzV/g-yܨ1Uܹ$.9jť8:V8jTҕC$+)RaA PB~se?xJJƍ6=_7R߃{kC&cǐaͬ'rG]O0[;c? u(%XMLK33sj+EkItż2G.{N},?;Y.2=tG{/w-kl(ǫ^@!c%a͗@]BR:0)svsFZ6y7(")m,8ngd l0"#YE$-e: -޽sA7 yf ^4o;+wK㝶a*zƥ]?R(L6cC/hΫמS~'x9_FZyy3܇=Lژ(6[p1QKlkSݼ E= h$ ~؟ 'T;DCY1 ΗFyyª B>5XSjnY^CS#Cr>q}1[׻<5x&vJ`~-+鳤o@gwoyx!"& { ^]Jw9P)x7%" Gfpd6]tՋ k94W nz<WplEM_ 8:͆@?=4?w+׊}< qX8#;A YLZ0͇hљ?W"j8}v#LRQ<(ʓ H Տ\Ou L>cU4vK6 SS67~ս:ሾOz ?{Ix*4>VPNurvz7=w ڶ>{~C~j[GSxEzBg)bX%ե 8E6 G8B8܂u >Xok,JcŚJz7d}몲OXa Ʌ)kϜCԗM.S)Gb,WT sv u[y -#.E.S1.:Z 5TiɱYB~MWj>^X+0|ed\I>)F> endobj 7 0 obj << /Ascent 678 /CapHeight 651 /Descent -216 /FontName /KDRGFK+NimbusRomNo9L-Regu /ItalicAngle 0 /StemV 85 /XHeight 450 /FontBBox [-168 -281 1000 924] /Flags 4 /CharSet (/fi/percent/quoteright/parenleft/parenright/comma/hyphen/period/slash/zero/one/two/three/four/five/six/eight/nine/colon/semicolon/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/bracketright/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/quotedblleft/quotedblright/endash) /FontFile 8 0 R >> endobj 31 0 obj [556 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 833 0 333 333 333 0 0 250 333 250 278 500 500 500 500 500 500 500 0 500 500 278 278 0 0 0 0 0 722 667 667 722 611 556 722 722 333 389 722 611 889 722 722 556 722 667 556 611 722 722 944 722 722 611 333 0 333 0 0 0 444 500 444 500 444 333 500 500 278 278 500 278 778 500 500 500 500 333 389 278 500 500 722 500 500 444 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 444 444 0 500 ] endobj 5 0 obj << /Length1 1626 /Length2 15057 /Length3 532 /Length 15934 /Filter /FlateDecode >> stream xeP$ܲ%S@5Z@5и6.w#93s'gz*"j\+(J2eUF3;3#+ /@dcFюGQhs PR9Av@^& 4Xyxx(bv Kg7MZzz0N [@k;{_DU l 1%emE):@ h t4(XL S`n`jgk5'X"Nc=7 n :ڀƶglٚZC_FSsrv2u;VU7OgKcj;v#L]i_0 ['3Z&@o`pqZ#/?>KʶWrvZ3!i]5nb?|@ 柝K`4G`Vs[@2_"Y -bmhlw>2ƶ @CbH1Y{%hMيYgߑZF$h r6[׿f@Gk-)?,AVo?+տ3˪o*]g5{+ vf;KS_@qV0vvt?N F쟵Qu65i<4EX[3 \sxR\r8ľA0߿ڮ/-|&qcPhǚ'xGCAۗEElP~u(ɢq7͠ x֟5˓=ij}v'Z#FmUPt!!}N<%+2UCzW,n[ 9o˹6^GIKf]lh`xƙWejlj G ~N f Ba,V0e-_gJ1!&'D+&1AHJ A6tM%n{ 1Y|HPCi(CGd2]jIke&JHw;z ekjry@OmGAƨ$S=KC4 L^Me+,bm$~ ycykx!I ,ӢqAM ֳ;+11p dЫYQn\Q"jz %PR Q:8` P#Z[/J[2(-YRMbY{hY!w%g7O/pJ™_emzI Xٻ7^4L"Lڧ}CST2Q,+0G ~W{6Bc f\W=a4]\$ 5V%ԊB{2IλlUJRV=Z87֋?i+wz$ŕKXJcC(8v?ӆLU'Bx>Ťi/T?[U3;zZ2DwݥeHg/2>zovb[V57"Sq~OYƌƷR4Gjт_1bf@U!*S|b'yvt8>/wG {*%P`_h7=~I~-+*qa6qdǑ"{2]b`>ql:]LEݭ R?Y-R dݢ{tc[pԏ]9UMi>D-E3js5WLE9 kbrt`sاډdH5=yUu+Tu9,{gzۈ"&0U=5NUrxUk9Dr=T8쟌︖U^M٬.H/M1I . :"à H=ĉ>?aS_ I/% ͭ{ڂ6w'+L*rdG/^(t4>@jY&,Jä=[إ䘑WDVbHny~KcZyi*4p/Z`a&К[_Ymɏ>KH@&RpcY]j»J7Q-jb3I>9hlC¼7- ^6X-~VA~NŖ1HM ?M/J3Ln d l2iuvCfu)\fYb[7D.W#BɒnS=%^@\U\xsb/~YNS^ DIwEq 0 [5jP {W3Y9~um5G;ﻕms&zo`[JoB"9`BQPiK/@KR@ ظYPF̵ ?7o %I0f3`^պ40JR E玍avA4HAZ)eFW%MHoq7ebF-벣!,3gNKJ^ jᗁur\@q=U2&ڋ:aCt;â\LI^M]8|:ٹ@PF6-.# rbzKm PYC я72oSS N}N)k;1E7CoU`kۓ[DB'Fimv5K>'4x-=DQ~U!HR5Qb+t~#J8cQi˘SOh]mfŗqPu_+g ~c6&b5) [N\3F׶ab#|UsVn+XE;ABzéGrt GV~ӥ463bI jnxfTS! 7~QCޮ}S%D"j.pδ 8&BɲP`֑y:`L0F9b Aers}٠q+vL,CrM\vG~1hOPIh yTm;p@Kܯf`WN󏪣#;(ػ׭[SA= J]*;OSMURvr9q'_ u$6֝Y`GCGk7s#x:貽 -_mi$ͦ rx 9," ,T6_^Ϛ A 8-jt.is;JMTر FQƼ-N2X;Nmgȣ -1pRC+Y9x~3E3^bſ,8]IA $>ii~IX'ᔕ h4l QT-ѱÕ-7BD"404B0P9h߸M||+5>~+UQbȂ؆:ŭba)d)0)!W"4YAed d\ >Y+}pk)t;GUoo%6d.r?S} d:- ņ [.1>Bdy%8w!%tu 4,7.Ϛ*(`O5?ỆxdDyANޥ, +y/5"Äj^n:^60)g~8|c9 L 0INY"GY/`+: (|-欁tw7 ͆:c~S9=TU k/-1-@ZxqkYSCTufoߔb?(4N P/WE[cWd|3( hP1{x2Ws[\g̈́N6Խ/s6NZ;yX9TNڍNӢqgެI]P\Jkn3Hb`V{"p^ݝrKfs^۰1l ]gh[zh{'"[vm,{ Ԓ{C=4NPmƓz1;vke%8n<~^w$1~ofl]Vtw_ ̙<cDY/FF\"Z[$<BRqt꜐t&,2/9U/hw-U_+tH4MݢNN-~h2?!32i2Ʈ0#Q\=no,B84mpl>[z`Z]*U5䫆GP8D[Em9wv9/8y^>p R8a029.ePakG"b>|>8QW]&†O&k!x1+*V;s8=FbI΋j =-K8[pU Bbj-;r>BZ|TY9r H(#r%6hcKI=2 }`'BcӺAǏ?u8h+_QFѦ*wWоɌ12d )/noA8,:Pf~;9qv- (,M[S 'ER6&` ґŞe |7JgzFk *1b dGW]X>🖮UC2&_EJ^0 ŠH7*' `.aؑ4=& J~V$U Qr g"G8ň3zpMOO_tŌ_Gw^::洂D]iKT5\tڏ%uy,5p x^c0'OG AdU<=6yA6?aY0]n1Ɏm/~|{;pLXxgh$8jIٺlKn+K^QGz]|Cġq4q++ron fX ǒ*mZF=43}S4I#/VT=@攂I?FAG\8'65`/`a\xs*-֭=HݙUM#0ĎL61=)YnX-AnY$ %- rVJq>>γ7R#YL)J4Ga3'FT꧈vG+Z*|qy[ک[~1~_J ƈ~KʁXpH5ePI7ٌfrSgNYvdR1}tf,#TBnkA_r.JX}ZduA=  ;4 (L&__~V%| ~7YʝM">V6~ a!Ze]FXHC^ 77᪉ s)g|e dz>x=j ;;(mʼn'W"G54<-!x=Bu᱌Lz&Y&*<R~OxsbarJZ7 7cKDj$j`qҦ ^u7~ 9ӋdȈuNŋ0d-BE |rl/^Ǵwu׃gnv }>~_ݵI.Nx)FSb9s,*j(Ox{Rz&<~C+XT3] VѭrlF䆂yw"ɤ=S(iz !ʇ&v_:Y?TZqKЕ7zR-ePnY& 9rcKB-j}pwTnlɹIA\U/#^ ;C1zX>viXEzxbeyx^$S tY BqXcҺ'C9\l6u}x4)H47 !597=,\5ș J]+[V-O xxm>*C ar/|r8(Fpᔇߞ7>wEb5|rx_!k\D epYf"&+5eѰ"d#m$NȄTaW-ЉSR@E#Z.-!U!aTʟ-tNTv/'B_qkO` :,̿SN5fd .l\x+xΠ\VMU:}|Ggf$("A”N¡+;HM!?dhv{(0 ׍]v_/"~UB{:CCXI{0O%82XnF%ز.cWR _LpGI( udBWuDu6.?X ɚtTw55/J\uL@'h|@MR s3\ L{}dqڠƙjTFuh7P4`Ph%<>hj F& A/Fyt^|.?!>ސ(=$-4[5rsR:GD͖<-v~f!q0zytk9K2Uo'NS|5\?=Xڝc ~; K4+E]%c<.=< s5CxJm']}hQa? A,aԶ3mŐ[wSIPDd "q/sK|O/\3Kqë?E*RP (ڼt ʫT'6G V.9x4AOm>jt d cBL|OQ/ $n1,lq2:KKs MVwзK\RmT.pUp,gD\=E6jOc-I`Ύ3VX9iw)oU-OV.u;Q &Xhe+ z"R3Ѹ2qU6Z[N?|Lau !{0~;glx\מ?d%1:US)|E7z|I Caȡp {Swj zBecXyF1A꽵P)(е _JMóM̾B47Y*(#60q5nj c|e[3, aucefKR7a.^_6cבU+UnRLsﬡxр:(k8Rx*G. Q-w'`2Ō$ܮkĥ1j8~ۯPwCԩ2`8>&'drd#/d3*۩V;@[lV&'h #G9t 0!Hy #a-QylkFou:n)NA˽?Tt gfyUEh+~h1_H03=ŀY_?>BO]Q2wrgϒʊ6rέ[ [wdqYmB,Ӗ2 k(׊}]m$d*\ae!'laR9#Ŵؙo¥ԠwY+7/ {%V+o1ߔ|H6?B,8[}ők;YUiܦxf@b,d^ IH sM[o?a 3bV߮3~ 06}dp6j^O5ndxّ;3>EWχ Pn@t"2i(m{bg7mYГab) oqYHp0ex3Zn榟,_`W: q0ez o-\7=Gi}YmiǛփ&\ iry7mʦ} U@|؀E&cv ?}\pm˂˥on9Y(ùxrk*|`|RV~Y-e-{ib~'CZ/3'<ie Z} !x`[Nn[:;zB>|Ϻ ('@5tfb4PCc^!e_"\HtKS#|9s=Vj4\tH϶1\G$vgnEeXLla`M'`n9TtD)f0 ;yu12$2}rn8m6R^vQشW3⮏febˢ5{[5ӗ0խ2;x\AXXwV@8]6,fnUi> S}I0y1~,DHuC'q_#l4b*׋+GޢWf1#F ᚗ ⩬·pz;-yuIcEjj5|3RLDu6jVnz wUi7+W_*A1B|s)?C;%FC"Հ`u#`BWuXpvâ`R|/ޠTZ[q7N|Oj×%+h^rQA>Yٻ}ag ~]Ƒ!3?-QU-yyGr]X7bSnl:Ug%Vn3bMYSS'_'V3M9aVXoCf[f}Эߖ$HJdNS|­kz6Mߍ61~"HdyzWl"Lv7xD xi3 _9uSlZeib%c'Dɜ" |HYN:F)+,O}J4tjpi]u[}qDJ ~븨As3C9'"GF:MȌD̨Yą,ˆGt{-G~Eĉ:ZfQa.>TiMi N[?ZCtd亰 2E ZMg*vFAf0/R {{=YTʰ r&JgXsOʈ,A|)O'/QGj)O+Hoȧ?%!붊J%LVs9~al.NTŝfE8vcܒ +'50#ޅWI)=QOٱdp̉VHW FUkzY&" jwٺ{*f:k~ן y/v7\aQE2n~no`3NC3cSx0ՄnLer`{D[6#ccށv]Oү#N)W6VNeDѯ呦`~F(52qHs#ĜzZW4jS^|̐ g2PUA?Vjuc=+8V ov1 %*p:mo= Һ^ uei upo#&5U3ɧkc&4e[e.]q?05ߐ;ѓ? Zj xں^|.<2* X\=bN-zL`Hw)owʎ߮M-j,\T6s*P[|ziZ@-Sņ}۫8,!!mw7f/r5o#$מ3v96,OG^ VWQEu64!aY)bH˾Ԙ)<ʶ%tk2 ?2D(=C< 6+z,vQzkq nI@a^lL@m)J(d*UE.PK[70l਴p̜;r"_m㟩|E FPZm&"-MɇP7 j ;in 溧4gLzcNX%tki#b>{h;iFܴ"-#]9U4ZdOFڻfB=XTp/ j=!c@$`H>q5{E[ˈzz F~{[JnFw1dOF)y-sI%Ȋzj|"U$j:&:ط,ADcң%oy[޽X󱰎j:yjjbDJ.1zuU _U6UЁ]ud@@r ľ#\-vq=zkӄdA#Fx3$˰*O9Oc,s"N{4-t)_~nyLҗfAM'hHٰkR[%|~$(p'2J7/(o}a3t-ن]Y~C'N G0-n RrkΌ䲯nJ<_Zg)R<&n yT{c7캷EQxkhlS`wkiXVQq'6`k*W Dvij~4NdCIj"l5j/Ի; |h͍"?uH|1l<^-ꗀM7m"f379tt?C8#IW{uP7$]?ɟ(5=їudhwjQ^ҜZ֓χh8})WأPiRțCfhS^QF~Dʎ`1UiP]s%4ā0iE\*BN:MD gVG4 10)23E!Q-9} v WYw%AykcC‹{GKZRb1|ӯl9.DŽfmϢ3  .#{E&@sJݖon6~ "}X>⇿dLO9Wzp0%%ZuaqC[b"7=•įnnꓶ^V˕?LxMd*5YZL/V"=5?zORƮ1JK'>a݉Ol氡(uZ[xۖeȿǏ(F)Xn=1=fFZ>3c7 4 g 0}"ur7E=N7B1~K7;]e4 f_Ί|dCGХCj.EC5o?4&&'ިn ^4xŭN2j8J2-3Jj yد  >:r3I*N1gR#KW[)V%9%p̗ȦSV8X= hYuE}ی/M[A$uYx 8 2_#f;^3 ;Β+nay5~e Uu `͞#h%1iLn{rLu.>ɘRCaU*t82N|/׭z0FG[d fFcO*kqHGIlbm:P'!RR%/+F,;l\Y7b!~^uȍ(IQ1eLESh{$niphF-t8&qI3a)sus܁,i3WQ%.|‡줌YobMӷZŠWa*DgI)D5 ! &{Xj5 }'XX\!<òFe16I:w ~Cp`N}jGbv3{"0R]q*y %m I~`Ȃ=4n i>Qgm*r|;("{VQ^ޒy|##%/ɔs>ۛƠ*%4#'3_!E.Oj*Wq"Tg6ZU@"$|C۶4"J*dAX+Hs> endobj 4 0 obj << /Ascent 690 /CapHeight 690 /Descent -209 /FontName /QQLJSA+NimbusRomNo9L-Medi /ItalicAngle 0 /StemV 140 /XHeight 461 /FontBBox [-168 -341 1000 960] /Flags 4 /CharSet (/fi/parenleft/parenright/period/zero/one/two/three/four/five/six/seven/eight/nine/A/B/C/D/E/F/G/H/I/L/M/N/O/P/R/S/T/U/V/W/X/Y/a/b/c/d/e/f/g/h/i/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/quotedblleft/quotedblright) /FontFile 5 0 R >> endobj 32 0 obj [556 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 333 333 0 0 0 0 250 0 500 500 500 500 500 500 500 500 500 500 0 0 0 0 0 0 0 722 667 722 722 667 611 778 778 389 0 0 667 944 722 778 611 0 722 556 667 722 722 1000 722 722 0 0 0 0 0 0 0 500 556 444 556 444 333 500 556 278 0 556 278 833 556 500 556 556 444 389 333 556 500 722 500 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 500 ] endobj 13 0 obj << /Type /Pages /Count 6 /Kids [2 0 R 15 0 R 18 0 R 21 0 R 24 0 R 27 0 R] >> endobj 33 0 obj << /Type /Catalog /Pages 13 0 R >> endobj 34 0 obj << /Producer (pdfeTeX-1.30.4) /Creator (TeX) /CreationDate (D:20150810093635-04'00') /PTEX.Fullbanner (This is pdfeTeX, Version 3.141592-1.30.4-2.2 (Web2C 7.5.5) kpathsea version 3.5.5) >> endobj xref 0 35 0000000000 65535 f 0000003123 00000 n 0000003018 00000 n 0000000015 00000 n 0000069515 00000 n 0000053293 00000 n 0000069348 00000 n 0000052325 00000 n 0000032767 00000 n 0000052158 00000 n 0000032299 00000 n 0000022119 00000 n 0000032132 00000 n 0000070359 00000 n 0000006347 00000 n 0000006239 00000 n 0000003214 00000 n 0000010413 00000 n 0000010305 00000 n 0000006427 00000 n 0000013603 00000 n 0000013495 00000 n 0000010493 00000 n 0000017069 00000 n 0000016961 00000 n 0000013683 00000 n 0000020152 00000 n 0000020044 00000 n 0000017149 00000 n 0000020232 00000 n 0000032556 00000 n 0000052822 00000 n 0000069921 00000 n 0000070452 00000 n 0000070503 00000 n trailer << /Size 35 /Root 33 0 R /Info 34 0 R /ID [<86C647F2B5BD2DDB5E3D30EE3622C3A6> <86C647F2B5BD2DDB5E3D30EE3622C3A6>] >> startxref 70708 %%EOF gsoap-2.8.28/config.h.in0000644000175000017500000001511012653650144014313 0ustar ellertellert/* config.h.in. Generated from configure.ac by autoheader. */ /* Define to 1 if you have the `alarm' function. */ #undef HAVE_ALARM /* Define to 1 if you have the header file. */ #undef HAVE_ARPA_INET_H /* Define to 1 if you have the header file. */ #undef HAVE_CTYPE_H /* Define to 1 if you have the header file. */ #undef HAVE_ERRNO_H /* Define to 1 if you have the header file. */ #undef HAVE_FCNTL_H /* Define to 1 if you have the header file. */ #undef HAVE_FLOAT_H /* Define to 1 if you have the `ftime' function. */ #undef HAVE_FTIME /* Define to 1 if you have the `gethostbyname_r' function. */ #undef HAVE_GETHOSTBYNAME_R /* Define to 1 if you have the `gettimeofday' function. */ #undef HAVE_GETTIMEOFDAY /* Define to 1 if you have the `gmtime' function. */ #undef HAVE_GMTIME /* Define to 1 if you have the `gmtime_r' function. */ #undef HAVE_GMTIME_R /* Define to 1 if you have the header file. */ #undef HAVE_GNUTLS_GNUTLS_H /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* isinf */ #undef HAVE_ISINF /* isnan */ #undef HAVE_ISNAN /* Define to 1 if you have the header file. */ #undef HAVE_LIMITS_H /* Define to 1 if you have the `localtime_r' function. */ #undef HAVE_LOCALTIME_R /* Define to 1 if your system has a GNU libc compatible `malloc' function, and to 0 otherwise. */ #undef HAVE_MALLOC /* Define to 1 if you have the header file. */ #undef HAVE_MATH_H /* Define to 1 if you have the `mbtowc' function. */ #undef HAVE_MBTOWC /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the `memset' function. */ #undef HAVE_MEMSET /* Define to 1 if you have the header file. */ #undef HAVE_NETDB_H /* Define to 1 if you have the header file. */ #undef HAVE_NETINET_IN_H /* Define to 1 if you have the header file. */ #undef HAVE_OPENSSL_SSL_H /* Define to 1 if you have the `poll' function. */ #undef HAVE_POLL /* Define to 1 if you have the header file. */ #undef HAVE_POLL_H /* Define to 1 if you have the `random' function. */ #undef HAVE_RANDOM /* Define to 1 if you have the `select' function. */ #undef HAVE_SELECT /* Define to 1 if you have the `snprintf' function. */ #undef HAVE_SNPRINTF /* Define to 1 if you have the `socket' function. */ #undef HAVE_SOCKET /* Define to 1 if you have the `sprintf_l' function. */ #undef HAVE_SPRINTF_L /* Define to 1 if you have the `sscanf' function. */ #undef HAVE_SSCANF /* Define to 1 if you have the `sscanf_l' function. */ #undef HAVE_SSCANF_L /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the `strchr' function. */ #undef HAVE_STRCHR /* Define to 1 if you have the `strerror' function. */ #undef HAVE_STRERROR /* Define to 1 if you have the `strerror_r' function. */ #undef HAVE_STRERROR_R /* Define to 1 if you have the `strftime' function. */ #undef HAVE_STRFTIME /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the `strlcpy' function. */ #undef HAVE_STRLCPY /* Define to 1 if you have the `strrchr' function. */ #undef HAVE_STRRCHR /* Define to 1 if you have the `strstr' function. */ #undef HAVE_STRSTR /* Define to 1 if you have the `strtod' function. */ #undef HAVE_STRTOD /* Define to 1 if you have the `strtod_l' function. */ #undef HAVE_STRTOD_L /* Define to 1 if you have the `strtof' function. */ #undef HAVE_STRTOF /* Define to 1 if you have the `strtof_l' function. */ #undef HAVE_STRTOF_L /* Define to 1 if you have the `strtol' function. */ #undef HAVE_STRTOL /* Define to 1 if you have the `strtold' function. */ #undef HAVE_STRTOLD /* Define to 1 if you have the `strtold_l' function. */ #undef HAVE_STRTOLD_L /* Define to 1 if you have the `strtoll' function. */ #undef HAVE_STRTOLL /* Define to 1 if you have the `strtoul' function. */ #undef HAVE_STRTOUL /* Define to 1 if you have the `strtoull' function. */ #undef HAVE_STRTOULL /* Define to 1 if `tm_gmtoff' is a member of `struct tm'. */ #undef HAVE_STRUCT_TM_TM_GMTOFF /* Define to 1 if `__tm_gmtoff' is a member of `struct tm'. */ #undef HAVE_STRUCT_TM___TM_GMTOFF /* Define to 1 if you have the header file. */ #undef HAVE_SYS_INTTYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SOCKET_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TIMEB_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TIME_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the `timegm' function. */ #undef HAVE_TIMEGM /* Define to 1 if you have the header file. */ #undef HAVE_TIME_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to 1 if you have the `wctomb' function. */ #undef HAVE_WCTOMB /* Define to 1 if you have the header file. */ #undef HAVE_XLOCALE_H /* Define to 1 if you have the header file. */ #undef HAVE_ZLIB_H /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Define as the return type of signal handlers (`int' or `void'). */ #undef RETSIGTYPE /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Define to 1 if you can safely include both and . */ #undef TIME_WITH_SYS_TIME /* Define to 1 if your declares `struct tm'. */ #undef TM_IN_SYS_TIME /* Version number of package */ #undef VERSION /* Define to 1 if `lex' declares `yytext' as a `char *' by default, not a `char[]'. */ #undef YYTEXT_POINTER /* Define to empty if `const' does not conform to ANSI C. */ #undef const /* Define to rpl_malloc if the replacement function should be used. */ #undef malloc /* Define to `unsigned int' if does not define. */ #undef size_t gsoap-2.8.28/depcomp0000755000175000017500000002752512653650144013662 0ustar ellertellert#! /bin/sh # depcomp - compile a program generating dependencies as side-effects # Copyright 1999, 2000 Free Software Foundation, Inc. # 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, 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., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # `libtool' can also be set to `yes' or `no'. depfile=${depfile-`echo "$object" | sed 's,\([^/]*\)$,.deps/\1,;s/\.\([^.]*\)$/.P\1/'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ## The second -e expression handles DOS-style file names with drive letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the `deleted header file' problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. tr ' ' ' ' < "$tmpdepfile" | ## Some versions of gcc put a space before the `:'. On the theory ## that the space means something, we add a space to the output as ## well. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like `#:fec' to the end of the # dependency line. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ tr ' ' ' ' >> $depfile echo >> $depfile # The second pass generates a dummy entry for each header file. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> $depfile else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. This file always lives in the current directory. # Also, the AIX compiler puts `$object:' at the start of each line; # $object doesn't have directory information. stripped=`echo "$object" | sed -e 's,^.*/,,' -e 's/\(.*\)\..*$/\1/'` tmpdepfile="$stripped.u" outname="$stripped.o" if test "$libtool" = yes; then "$@" -Wc,-M else "$@" -M fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi if test -f "$tmpdepfile"; then # Each line is of the form `foo.o: dependent.h'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile" sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; tru64) # The Tru64 AIX compiler uses -MD to generate dependencies as a side # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in `foo.d' instead, so we check for that too. # Subdirectories are respected. tmpdepfile1="$object.d" tmpdepfile2=`echo "$object" | sed -e 's/.o$/.d/'` if test "$libtool" = yes; then "$@" -Wc,-MD else "$@" -MD fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi if test -f "$tmpdepfile1"; then tmpdepfile="$tmpdepfile1" else tmpdepfile="$tmpdepfile2" fi if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" # That's a space and a tab in the []. sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the proprocessed file to stdout, regardless of -o, # because we must use -o when running libtool. test -z "$dashmflag" && dashmflag=-M ( IFS=" " case " $* " in *" --mode=compile "*) # this is libtool, let us make it quiet for arg do # cycle over the arguments case "$arg" in "--mode=compile") # insert --quiet before "--mode=compile" set fnord "$@" --quiet shift # fnord ;; esac set fnord "$@" "$arg" shift # fnord shift # "$arg" done ;; esac "$@" $dashmflag | sed 's:^[^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" ) & proc=$! "$@" stat=$? wait "$proc" if test "$stat" != 0; then exit $stat; fi rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" tr ' ' ' ' < "$tmpdepfile" | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) # X makedepend ( shift cleared=no for arg in "$@"; do case $cleared in no) set ""; shift cleared=yes esac case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift;; -*) ;; *) set fnord "$@" "$arg"; shift;; esac done obj_suffix="`echo $object | sed 's/^.*\././'`" touch "$tmpdepfile" ${MAKEDEPEND-makedepend} 2>/dev/null -o"$obj_suffix" -f"$tmpdepfile" "$@" ) & proc=$! "$@" stat=$? wait "$proc" if test "$stat" != 0; then exit $stat; fi rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" tail +3 "$tmpdepfile" | tr ' ' ' ' | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the proprocessed file to stdout, regardless of -o, # because we must use -o when running libtool. ( IFS=" " case " $* " in *" --mode=compile "*) for arg do # cycle over the arguments case $arg in "--mode=compile") # insert --quiet before "--mode=compile" set fnord "$@" --quiet shift # fnord ;; esac set fnord "$@" "$arg" shift # fnord shift # "$arg" done ;; esac "$@" -E | sed -n '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | sed '$ s: \\$::' > "$tmpdepfile" ) & proc=$! "$@" stat=$? wait "$proc" if test "$stat" != 0; then exit $stat; fi rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the proprocessed file to stdout, regardless of -o, # because we must use -o when running libtool. ( IFS=" " case " $* " in *" --mode=compile "*) for arg do # cycle over the arguments case $arg in "--mode=compile") # insert --quiet before "--mode=compile" set fnord "$@" --quiet shift # fnord ;; esac set fnord "$@" "$arg" shift # fnord shift # "$arg" done ;; esac "$@" -E | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile" ) & proc=$! "$@" stat=$? wait "$proc" if test "$stat" != 0; then exit $stat; fi rm -f "$depfile" echo "$object : \\" > "$depfile" . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" echo " " >> "$depfile" . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 gsoap-2.8.28/config.status.old0000755000175000017500000013727312653650144015601 0ustar ellertellert#! /bin/sh # Generated by configure. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=${CONFIG_SHELL-/bin/sh} ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then set -o posix fi DUALCASE=1; export DUALCASE # for MKS sh # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # Work around bugs in pre-3.0 UWIN ksh. $as_unset ENV MAIL MAILPATH PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. for as_var in \ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else $as_unset $as_var fi done # Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi # Name of the executable. as_me=`$as_basename "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)$' \| \ . : '\(.\)' 2>/dev/null || echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } /^X\/\(\/\/\)$/{ s//\1/; q; } /^X\/\(\/\).*/{ s//\1/; q; } s/.*/./; q'` # PATH needs CR, and LINENO needs CR and PATH. # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" || { # Find who we are. Look in the path if we contain no path at all # relative or not. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5 echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;} { (exit 1); exit 1; }; } fi case $CONFIG_SHELL in '') as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for as_base in sh bash ksh sh5; do case $as_dir in /*) if ("$as_dir/$as_base" -c ' as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } CONFIG_SHELL=$as_dir/$as_base export CONFIG_SHELL exec "$CONFIG_SHELL" "$0" ${1+"$@"} fi;; esac done done ;; esac # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line before each line; the second 'sed' does the real # work. The second script uses 'N' to pair each line-number line # with the numbered line, and appends trailing '-' during # substitution so that $LINENO is not a special case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) sed '=' <$as_myself | sed ' N s,$,-, : loop s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, t loop s,-$,, s,^['$as_cr_digits']*\n,, ' >$as_me.lineno && chmod +x $as_me.lineno || { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5 echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;} { (exit 1); exit 1; }; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensible to this). . ./$as_me.lineno # Exit status is that of the last command. exit } case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in *c*,-n*) ECHO_N= ECHO_C=' ' ECHO_T=' ' ;; *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; *) ECHO_N= ECHO_C='\c' ECHO_T= ;; esac if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file echo >conf$$.file if ln -s conf$$.file conf$$ 2>/dev/null; then # We could just check for DJGPP; but this test a) works b) is more generic # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). if test -f conf$$.exe; then # Don't use ln at all; we don't have any links as_ln_s='cp -p' else as_ln_s='ln -s' fi elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.file if mkdir -p . 2>/dev/null; then as_mkdir_p=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_executable_p="test -f" # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" # IFS # We need space, tab and new line, in precisely that order. as_nl=' ' IFS=" $as_nl" # CDPATH. $as_unset CDPATH exec 6>&1 # Open the log real soon, to keep \$[0] and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. Logging --version etc. is OK. exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX } >&5 cat >&5 <<_CSEOF This file was extended by gsoap $as_me 2.7, which was generated by GNU Autoconf 2.59. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ _CSEOF echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5 echo >&5 config_files=" Makefile gsoap.pc gsoap++.pc gsoapck.pc gsoapck++.pc gsoapssl.pc gsoapssl++.pc gsoap/Makefile gsoap/src/Makefile gsoap/wsdl/Makefile gsoap/samples/Makefile gsoap/samples/calc/Makefile gsoap/samples/calc++/Makefile gsoap/samples/dime/Makefile gsoap/samples/dom/Makefile gsoap/samples/events/Makefile gsoap/samples/events++/Makefile gsoap/samples/factory/Makefile gsoap/samples/factorytest/Makefile gsoap/samples/gmt/Makefile gsoap/samples/googleapi/Makefile gsoap/samples/hello/Makefile gsoap/samples/httpcookies/Makefile gsoap/samples/lu/Makefile gsoap/samples/magic/Makefile gsoap/samples/mashup/Makefile gsoap/samples/mashup++/Makefile gsoap/samples/mtom/Makefile gsoap/samples/mtom-stream/Makefile gsoap/samples/polytest/Makefile gsoap/samples/roll/Makefile gsoap/samples/router/Makefile gsoap/samples/rss/Makefile gsoap/samples/ssl/Makefile gsoap/samples/udp/Makefile gsoap/samples/varparam/Makefile gsoap/samples/wsa/Makefile gsoap/samples/wsse/Makefile gsoap/samples/xml-rpc/Makefile" config_headers=" config.h" config_commands=" depfiles" ac_cs_usage="\ \`$as_me' instantiates files from templates according to the current configuration. Usage: $0 [OPTIONS] [FILE]... -h, --help print this help, then exit -V, --version print version number, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to ." ac_cs_version="\ gsoap config.status 2.7 configured by ./configure, generated by GNU Autoconf 2.59, with options \"'--enable-samples'\" Copyright (C) 2003 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." srcdir=. INSTALL="/usr/bin/install -c" # If no file are specified by the user, then we need to provide default # value. By we need to know if files were specified by the user. ac_need_defaults=: while test $# != 0 do case $1 in --*=*) ac_option=`expr "x$1" : 'x\([^=]*\)='` ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'` ac_shift=: ;; -*) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; *) # This is not an option, so the user has probably given explicit # arguments. ac_option=$1 ac_need_defaults=false;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --vers* | -V ) echo "$ac_cs_version"; exit 0 ;; --he | --h) # Conflict between --help and --header { { echo "$as_me:$LINENO: error: ambiguous option: $1 Try \`$0 --help' for more information." >&5 echo "$as_me: error: ambiguous option: $1 Try \`$0 --help' for more information." >&2;} { (exit 1); exit 1; }; };; --help | --hel | -h ) echo "$ac_cs_usage"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift CONFIG_FILES="$CONFIG_FILES $ac_optarg" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" ac_need_defaults=false;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1 Try \`$0 --help' for more information." >&5 echo "$as_me: error: unrecognized option: $1 Try \`$0 --help' for more information." >&2;} { (exit 1); exit 1; }; } ;; *) ac_config_targets="$ac_config_targets $1" ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi if $ac_cs_recheck; then echo "running /bin/sh ./configure " '--enable-samples' $ac_configure_extra_args " --no-create --no-recursion" >&6 exec /bin/sh ./configure '--enable-samples' $ac_configure_extra_args --no-create --no-recursion fi # # INIT-COMMANDS section. # AMDEP_TRUE="" ac_aux_dir="." for ac_config_target in $ac_config_targets do case "$ac_config_target" in # Handling of arguments. "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;; "gsoap.pc" ) CONFIG_FILES="$CONFIG_FILES gsoap.pc" ;; "gsoap++.pc" ) CONFIG_FILES="$CONFIG_FILES gsoap++.pc" ;; "gsoapck.pc" ) CONFIG_FILES="$CONFIG_FILES gsoapck.pc" ;; "gsoapck++.pc" ) CONFIG_FILES="$CONFIG_FILES gsoapck++.pc" ;; "gsoapssl.pc" ) CONFIG_FILES="$CONFIG_FILES gsoapssl.pc" ;; "gsoapssl++.pc" ) CONFIG_FILES="$CONFIG_FILES gsoapssl++.pc" ;; "gsoap/Makefile" ) CONFIG_FILES="$CONFIG_FILES gsoap/Makefile" ;; "gsoap/src/Makefile" ) CONFIG_FILES="$CONFIG_FILES gsoap/src/Makefile" ;; "gsoap/wsdl/Makefile" ) CONFIG_FILES="$CONFIG_FILES gsoap/wsdl/Makefile" ;; "gsoap/samples/Makefile" ) CONFIG_FILES="$CONFIG_FILES gsoap/samples/Makefile" ;; "gsoap/samples/calc/Makefile" ) CONFIG_FILES="$CONFIG_FILES gsoap/samples/calc/Makefile" ;; "gsoap/samples/calc++/Makefile" ) CONFIG_FILES="$CONFIG_FILES gsoap/samples/calc++/Makefile" ;; "gsoap/samples/dime/Makefile" ) CONFIG_FILES="$CONFIG_FILES gsoap/samples/dime/Makefile" ;; "gsoap/samples/dom/Makefile" ) CONFIG_FILES="$CONFIG_FILES gsoap/samples/dom/Makefile" ;; "gsoap/samples/events/Makefile" ) CONFIG_FILES="$CONFIG_FILES gsoap/samples/events/Makefile" ;; "gsoap/samples/events++/Makefile" ) CONFIG_FILES="$CONFIG_FILES gsoap/samples/events++/Makefile" ;; "gsoap/samples/factory/Makefile" ) CONFIG_FILES="$CONFIG_FILES gsoap/samples/factory/Makefile" ;; "gsoap/samples/factorytest/Makefile" ) CONFIG_FILES="$CONFIG_FILES gsoap/samples/factorytest/Makefile" ;; "gsoap/samples/gmt/Makefile" ) CONFIG_FILES="$CONFIG_FILES gsoap/samples/gmt/Makefile" ;; "gsoap/samples/googleapi/Makefile" ) CONFIG_FILES="$CONFIG_FILES gsoap/samples/googleapi/Makefile" ;; "gsoap/samples/hello/Makefile" ) CONFIG_FILES="$CONFIG_FILES gsoap/samples/hello/Makefile" ;; "gsoap/samples/httpcookies/Makefile" ) CONFIG_FILES="$CONFIG_FILES gsoap/samples/httpcookies/Makefile" ;; "gsoap/samples/lu/Makefile" ) CONFIG_FILES="$CONFIG_FILES gsoap/samples/lu/Makefile" ;; "gsoap/samples/magic/Makefile" ) CONFIG_FILES="$CONFIG_FILES gsoap/samples/magic/Makefile" ;; "gsoap/samples/mashup/Makefile" ) CONFIG_FILES="$CONFIG_FILES gsoap/samples/mashup/Makefile" ;; "gsoap/samples/mashup++/Makefile" ) CONFIG_FILES="$CONFIG_FILES gsoap/samples/mashup++/Makefile" ;; "gsoap/samples/mtom/Makefile" ) CONFIG_FILES="$CONFIG_FILES gsoap/samples/mtom/Makefile" ;; "gsoap/samples/mtom-stream/Makefile" ) CONFIG_FILES="$CONFIG_FILES gsoap/samples/mtom-stream/Makefile" ;; "gsoap/samples/polytest/Makefile" ) CONFIG_FILES="$CONFIG_FILES gsoap/samples/polytest/Makefile" ;; "gsoap/samples/roll/Makefile" ) CONFIG_FILES="$CONFIG_FILES gsoap/samples/roll/Makefile" ;; "gsoap/samples/router/Makefile" ) CONFIG_FILES="$CONFIG_FILES gsoap/samples/router/Makefile" ;; "gsoap/samples/rss/Makefile" ) CONFIG_FILES="$CONFIG_FILES gsoap/samples/rss/Makefile" ;; "gsoap/samples/ssl/Makefile" ) CONFIG_FILES="$CONFIG_FILES gsoap/samples/ssl/Makefile" ;; "gsoap/samples/udp/Makefile" ) CONFIG_FILES="$CONFIG_FILES gsoap/samples/udp/Makefile" ;; "gsoap/samples/varparam/Makefile" ) CONFIG_FILES="$CONFIG_FILES gsoap/samples/varparam/Makefile" ;; "gsoap/samples/wsa/Makefile" ) CONFIG_FILES="$CONFIG_FILES gsoap/samples/wsa/Makefile" ;; "gsoap/samples/wsse/Makefile" ) CONFIG_FILES="$CONFIG_FILES gsoap/samples/wsse/Makefile" ;; "gsoap/samples/xml-rpc/Makefile" ) CONFIG_FILES="$CONFIG_FILES gsoap/samples/xml-rpc/Makefile" ;; "depfiles" ) CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 echo "$as_me: error: invalid argument: $ac_config_target" >&2;} { (exit 1); exit 1; }; };; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason to put it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Create a temporary directory, and hook for its removal unless debugging. $debug || { trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 trap '{ (exit 1); exit 1; }' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" } || { tmp=./confstat$$-$RANDOM (umask 077 && mkdir $tmp) } || { echo "$me: cannot create a temporary directory in ." >&2 { (exit 1); exit 1; } } # # CONFIG_FILES section. # # No need to generate the scripts if there are no CONFIG_FILES. # This happens for instance when ./config.status config.h if test -n "$CONFIG_FILES"; then # Protect against being on the right side of a sed subst in config.status. sed 's/,@/@@/; s/@,/@@/; s/,;t t$/@;t t/; /@;t t$/s/[\\&,]/\\&/g; s/@@/,@/; s/@@/@,/; s/@;t t$/,;t t/' >$tmp/subs.sed <<\CEOF s,@SHELL@,/bin/sh,;t t s,@PATH_SEPARATOR@,:,;t t s,@PACKAGE_NAME@,gsoap,;t t s,@PACKAGE_TARNAME@,gsoap,;t t s,@PACKAGE_VERSION@,2.7,;t t s,@PACKAGE_STRING@,gsoap 2.7,;t t s,@PACKAGE_BUGREPORT@,,;t t s,@exec_prefix@,${prefix},;t t s,@prefix@,/usr/local,;t t s,@program_transform_name@,s,x,x,,;t t s,@bindir@,${exec_prefix}/bin,;t t s,@sbindir@,${exec_prefix}/sbin,;t t s,@libexecdir@,${exec_prefix}/libexec,;t t s,@datadir@,${prefix}/share,;t t s,@sysconfdir@,${prefix}/etc,;t t s,@sharedstatedir@,${prefix}/com,;t t s,@localstatedir@,${prefix}/var,;t t s,@libdir@,${exec_prefix}/lib,;t t s,@includedir@,${prefix}/include,;t t s,@oldincludedir@,/usr/include,;t t s,@infodir@,${prefix}/info,;t t s,@mandir@,${prefix}/man,;t t s,@build_alias@,,;t t s,@host_alias@,,;t t s,@target_alias@,,;t t s,@DEFS@,-DHAVE_CONFIG_H,;t t s,@ECHO_C@,,;t t s,@ECHO_N@,-n,;t t s,@ECHO_T@,,;t t s,@LIBS@,,;t t s,@INSTALL_PROGRAM@,${INSTALL},;t t s,@INSTALL_SCRIPT@,${INSTALL},;t t s,@INSTALL_DATA@,${INSTALL} -m 644,;t t s,@PACKAGE@,gsoap,;t t s,@VERSION@,2.7,;t t s,@ACLOCAL@,${SHELL} /Users/engelen/Projects/gsoap/gsoap-2.7/missing --run aclocal-1.6,;t t s,@AUTOCONF@,${SHELL} /Users/engelen/Projects/gsoap/gsoap-2.7/missing --run autoconf,;t t s,@AUTOMAKE@,${SHELL} /Users/engelen/Projects/gsoap/gsoap-2.7/missing --run automake-1.6,;t t s,@AUTOHEADER@,${SHELL} /Users/engelen/Projects/gsoap/gsoap-2.7/missing --run autoheader,;t t s,@MAKEINFO@,${SHELL} /Users/engelen/Projects/gsoap/gsoap-2.7/missing --run makeinfo,;t t s,@AMTAR@,${SHELL} /Users/engelen/Projects/gsoap/gsoap-2.7/missing --run tar,;t t s,@install_sh@,/Users/engelen/Projects/gsoap/gsoap-2.7/install-sh,;t t s,@STRIP@,,;t t s,@ac_ct_STRIP@,,;t t s,@INSTALL_STRIP_PROGRAM@,${SHELL} $(install_sh) -c -s,;t t s,@AWK@,awk,;t t s,@SET_MAKE@,,;t t s,@build@,i386-apple-darwin8.11.1,;t t s,@build_cpu@,i386,;t t s,@build_vendor@,apple,;t t s,@build_os@,darwin8.11.1,;t t s,@host@,i386-apple-darwin8.11.1,;t t s,@host_cpu@,i386,;t t s,@host_vendor@,apple,;t t s,@host_os@,darwin8.11.1,;t t s,@CXX@,g++,;t t s,@CXXFLAGS@,-g -O2,;t t s,@LDFLAGS@,,;t t s,@CPPFLAGS@,,;t t s,@ac_ct_CXX@,g++,;t t s,@EXEEXT@,,;t t s,@OBJEXT@,o,;t t s,@DEPDIR@,.deps,;t t s,@am__include@,include,;t t s,@am__quote@,,;t t s,@AMDEP_TRUE@,,;t t s,@AMDEP_FALSE@,#,;t t s,@AMDEPBACKSLASH@,\,;t t s,@CXXDEPMODE@,depmode=gcc3,;t t s,@CC@,gcc,;t t s,@CFLAGS@,-g -O2,;t t s,@ac_ct_CC@,gcc,;t t s,@CCDEPMODE@,depmode=gcc3,;t t s,@LEX@,flex,;t t s,@LEXLIB@,-lfl,;t t s,@LEX_OUTPUT_ROOT@,lex.yy,;t t s,@YACC@,bison -y,;t t s,@CPP@,gcc -E,;t t s,@RANLIB@,ranlib,;t t s,@ac_ct_RANLIB@,ranlib,;t t s,@LN_S@,ln -s,;t t s,@SAMPLE_EXTRA_LIBS@,,;t t s,@platform@,MACOSX,;t t s,@EGREP@,grep -E,;t t s,@LIBOBJS@,,;t t s,@DEBUG_COMPILE_TRUE@,#,;t t s,@DEBUG_COMPILE_FALSE@,,;t t s,@SOAPCPP2_DEBUG@,,;t t s,@SOAPCPP2_IMPORTPATH@,-DSOAPCPP_IMPORT_PATH="\"${prefix}/share/gsoap/import\"",;t t s,@WSDL2H_IMPORTPATH@,-DWSDL_IMPORT_PATH="\"${prefix}/share/gsoap/WS\"",;t t s,@SOAPCPP2_NONAMESPACES@,,;t t s,@WSDL2H_EXTRA_FLAGS@,-DWITH_OPENSSL -DWITH_GZIP,;t t s,@WSDL2H_EXTRA_LIBS@,-lssl -lcrypto -lz,;t t s,@WSDL2H_SOAP_CPP_LIB@,libgsoapssl++.a,;t t s,@ENABLE_SAMPLES_TRUE@,,;t t s,@ENABLE_SAMPLES_FALSE@,#,;t t s,@ENABLE_SAMPLES@,,;t t s,@SAMPLE_DIRS@,. samples,;t t s,@LEX_DEFINE@,-DWITH_FLEX,;t t s,@LEX_FLAGS@,-l,;t t s,@BISON_DEFINE@,-DWITH_BISON,;t t s,@YACC_LIB@,,;t t s,@LTLIBOBJS@,,;t t CEOF # Split the substitutions into bite-sized pieces for seds with # small command number limits, like on Digital OSF/1 and HP-UX. ac_max_sed_lines=48 ac_sed_frag=1 # Number of current file. ac_beg=1 # First line for current file. ac_end=$ac_max_sed_lines # Line after last line for current file. ac_more_lines=: ac_sed_cmds= while $ac_more_lines; do if test $ac_beg -gt 1; then sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag else sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag fi if test ! -s $tmp/subs.frag; then ac_more_lines=false else # The purpose of the label and of the branching condition is to # speed up the sed processing (if there are no `@' at all, there # is no need to browse any of the substitutions). # These are the two extra sed commands mentioned above. (echo ':t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed if test -z "$ac_sed_cmds"; then ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" else ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" fi ac_sed_frag=`expr $ac_sed_frag + 1` ac_beg=$ac_end ac_end=`expr $ac_end + $ac_max_sed_lines` fi done if test -z "$ac_sed_cmds"; then ac_sed_cmds=cat fi fi # test -n "$CONFIG_FILES" for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". case $ac_file in - | *:- | *:-:* ) # input from stdin cat >$tmp/stdin ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; * ) ac_file_in=$ac_file.in ;; esac # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. ac_dir=`(dirname "$ac_file") 2>/dev/null || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` { if $as_mkdir_p; then mkdir -p "$ac_dir" else as_dir="$ac_dir" as_dirs= while test ! -d "$as_dir"; do as_dirs="$as_dir $as_dirs" as_dir=`(dirname "$as_dir") 2>/dev/null || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` done test ! -n "$as_dirs" || mkdir $as_dirs fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} { (exit 1); exit 1; }; }; } ac_builddir=. if test "$ac_dir" != .; then ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A "../" for each directory in $ac_dir_suffix. ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` else ac_dir_suffix= ac_top_builddir= fi case $srcdir in .) # No --srcdir option. We are building in place. ac_srcdir=. if test -z "$ac_top_builddir"; then ac_top_srcdir=. else ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` fi ;; [\\/]* | ?:[\\/]* ) # Absolute path. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ;; *) # Relative path. ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_builddir$srcdir ;; esac # Do not use `cd foo && pwd` to compute absolute paths, because # the directories may not exist. case `pwd` in .) ac_abs_builddir="$ac_dir";; *) case "$ac_dir" in .) ac_abs_builddir=`pwd`;; [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; *) ac_abs_builddir=`pwd`/"$ac_dir";; esac;; esac case $ac_abs_builddir in .) ac_abs_top_builddir=${ac_top_builddir}.;; *) case ${ac_top_builddir}. in .) ac_abs_top_builddir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; esac;; esac case $ac_abs_builddir in .) ac_abs_srcdir=$ac_srcdir;; *) case $ac_srcdir in .) ac_abs_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; esac;; esac case $ac_abs_builddir in .) ac_abs_top_srcdir=$ac_top_srcdir;; *) case $ac_top_srcdir in .) ac_abs_top_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; esac;; esac case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_builddir$INSTALL ;; esac if test x"$ac_file" != x-; then { echo "$as_me:$LINENO: creating $ac_file" >&5 echo "$as_me: creating $ac_file" >&6;} rm -f "$ac_file" fi # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ if test x"$ac_file" = x-; then configure_input= else configure_input="$ac_file. " fi configure_input=$configure_input"Generated from `echo $ac_file_in | sed 's,.*/,,'` by configure." # First look for the input files in the build tree, otherwise in the # src tree. ac_file_inputs=`IFS=: for f in $ac_file_in; do case $f in -) echo $tmp/stdin ;; [\\/$]*) # Absolute (can't be DOS-style, as IFS=:) test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } echo "$f";; *) # Relative if test -f "$f"; then # Build tree echo "$f" elif test -f "$srcdir/$f"; then # Source tree echo "$srcdir/$f" else # /dev/null tree { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } fi;; esac done` || { (exit 1); exit 1; } sed "/^[ ]*VPATH[ ]*=/{ s/:*\$(srcdir):*/:/; s/:*\${srcdir}:*/:/; s/:*@srcdir@:*/:/; s/^\([^=]*=[ ]*\):*/\1/; s/:*$//; s/^[^=]*=[ ]*$//; } :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s,@configure_input@,$configure_input,;t t s,@srcdir@,$ac_srcdir,;t t s,@abs_srcdir@,$ac_abs_srcdir,;t t s,@top_srcdir@,$ac_top_srcdir,;t t s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t s,@builddir@,$ac_builddir,;t t s,@abs_builddir@,$ac_abs_builddir,;t t s,@top_builddir@,$ac_top_builddir,;t t s,@abs_top_builddir@,$ac_abs_top_builddir,;t t s,@INSTALL@,$ac_INSTALL,;t t " $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out rm -f $tmp/stdin if test x"$ac_file" != x-; then mv $tmp/out $ac_file else cat $tmp/out rm -f $tmp/out fi done # # CONFIG_HEADER section. # # These sed commands are passed to sed as "A NAME B NAME C VALUE D", where # NAME is the cpp macro being defined and VALUE is the value it is being given. # # ac_d sets the value in "#define NAME VALUE" lines. ac_dA='s,^\([ ]*\)#\([ ]*define[ ][ ]*\)' ac_dB='[ ].*$,\1#\2' ac_dC=' ' ac_dD=',;t' # ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE". ac_uA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' ac_uB='$,\1#\2define\3' ac_uC=' ' ac_uD=',;t' for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". case $ac_file in - | *:- | *:-:* ) # input from stdin cat >$tmp/stdin ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; * ) ac_file_in=$ac_file.in ;; esac test x"$ac_file" != x- && { echo "$as_me:$LINENO: creating $ac_file" >&5 echo "$as_me: creating $ac_file" >&6;} # First look for the input files in the build tree, otherwise in the # src tree. ac_file_inputs=`IFS=: for f in $ac_file_in; do case $f in -) echo $tmp/stdin ;; [\\/$]*) # Absolute (can't be DOS-style, as IFS=:) test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } # Do quote $f, to prevent DOS paths from being IFS'd. echo "$f";; *) # Relative if test -f "$f"; then # Build tree echo "$f" elif test -f "$srcdir/$f"; then # Source tree echo "$srcdir/$f" else # /dev/null tree { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } fi;; esac done` || { (exit 1); exit 1; } # Remove the trailing spaces. sed 's/[ ]*$//' $ac_file_inputs >$tmp/in # Handle all the #define templates only if necessary. if grep "^[ ]*#[ ]*define" $tmp/in >/dev/null; then # If there are no defines, we may have an empty if/fi : cat >$tmp/defines.sed <$tmp/out rm -f $tmp/in mv $tmp/out $tmp/in cat >$tmp/defines.sed <$tmp/out rm -f $tmp/in mv $tmp/out $tmp/in fi # grep # Handle all the #undef templates cat >$tmp/undefs.sed <$tmp/out rm -f $tmp/in mv $tmp/out $tmp/in cat >$tmp/undefs.sed <$tmp/out rm -f $tmp/in mv $tmp/out $tmp/in cat >$tmp/undefs.sed <$tmp/out rm -f $tmp/in mv $tmp/out $tmp/in # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ if test x"$ac_file" = x-; then echo "/* Generated by configure. */" >$tmp/config.h else echo "/* $ac_file. Generated by configure. */" >$tmp/config.h fi cat $tmp/in >>$tmp/config.h rm -f $tmp/in if test x"$ac_file" != x-; then if diff $ac_file $tmp/config.h >/dev/null 2>&1; then { echo "$as_me:$LINENO: $ac_file is unchanged" >&5 echo "$as_me: $ac_file is unchanged" >&6;} else ac_dir=`(dirname "$ac_file") 2>/dev/null || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` { if $as_mkdir_p; then mkdir -p "$ac_dir" else as_dir="$ac_dir" as_dirs= while test ! -d "$as_dir"; do as_dirs="$as_dir $as_dirs" as_dir=`(dirname "$as_dir") 2>/dev/null || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` done test ! -n "$as_dirs" || mkdir $as_dirs fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} { (exit 1); exit 1; }; }; } rm -f $ac_file mv $tmp/config.h $ac_file fi else cat $tmp/config.h rm -f $tmp/config.h fi # Run the commands associated with the file. case $ac_file in config.h ) # update the timestamp echo 'timestamp for config.h' >"./stamp-h1" ;; esac done # # CONFIG_COMMANDS section. # for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue ac_dest=`echo "$ac_file" | sed 's,:.*,,'` ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_dir=`(dirname "$ac_dest") 2>/dev/null || $as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_dest" : 'X\(//\)[^/]' \| \ X"$ac_dest" : 'X\(//\)$' \| \ X"$ac_dest" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$ac_dest" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` { if $as_mkdir_p; then mkdir -p "$ac_dir" else as_dir="$ac_dir" as_dirs= while test ! -d "$as_dir"; do as_dirs="$as_dir $as_dirs" as_dir=`(dirname "$as_dir") 2>/dev/null || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` done test ! -n "$as_dirs" || mkdir $as_dirs fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} { (exit 1); exit 1; }; }; } ac_builddir=. if test "$ac_dir" != .; then ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A "../" for each directory in $ac_dir_suffix. ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` else ac_dir_suffix= ac_top_builddir= fi case $srcdir in .) # No --srcdir option. We are building in place. ac_srcdir=. if test -z "$ac_top_builddir"; then ac_top_srcdir=. else ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` fi ;; [\\/]* | ?:[\\/]* ) # Absolute path. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ;; *) # Relative path. ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_builddir$srcdir ;; esac # Do not use `cd foo && pwd` to compute absolute paths, because # the directories may not exist. case `pwd` in .) ac_abs_builddir="$ac_dir";; *) case "$ac_dir" in .) ac_abs_builddir=`pwd`;; [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; *) ac_abs_builddir=`pwd`/"$ac_dir";; esac;; esac case $ac_abs_builddir in .) ac_abs_top_builddir=${ac_top_builddir}.;; *) case ${ac_top_builddir}. in .) ac_abs_top_builddir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; esac;; esac case $ac_abs_builddir in .) ac_abs_srcdir=$ac_srcdir;; *) case $ac_srcdir in .) ac_abs_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; esac;; esac case $ac_abs_builddir in .) ac_abs_top_srcdir=$ac_top_srcdir;; *) case $ac_top_srcdir in .) ac_abs_top_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; esac;; esac { echo "$as_me:$LINENO: executing $ac_dest commands" >&5 echo "$as_me: executing $ac_dest commands" >&6;} case $ac_dest in depfiles ) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # So let's grep whole file. if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then dirpart=`(dirname "$mf") 2>/dev/null || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` else continue fi grep '^DEP_FILES *= *[^ #]' < "$mf" > /dev/null || continue # Extract the definition of DEP_FILES from the Makefile without # running `make'. DEPDIR=`sed -n -e '/^DEPDIR = / s///p' < "$mf"` test -z "$DEPDIR" && continue # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n -e '/^U = / s///p' < "$mf"` test -d "$dirpart/$DEPDIR" || mkdir "$dirpart/$DEPDIR" # We invoke sed twice because it is the simplest approach to # changing $(DEPDIR) to its actual value in the expansion. for file in `sed -n -e ' /^DEP_FILES = .*\\\\$/ { s/^DEP_FILES = // :loop s/\\\\$// p n /\\\\$/ b loop p } /^DEP_FILES = / s/^DEP_FILES = //p' < "$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`(dirname "$file") 2>/dev/null || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` { if $as_mkdir_p; then mkdir -p $dirpart/$fdir else as_dir=$dirpart/$fdir as_dirs= while test ! -d "$as_dir"; do as_dirs="$as_dir $as_dirs" as_dir=`(dirname "$as_dir") 2>/dev/null || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` done test ! -n "$as_dirs" || mkdir $as_dirs fi || { { echo "$as_me:$LINENO: error: cannot create directory $dirpart/$fdir" >&5 echo "$as_me: error: cannot create directory $dirpart/$fdir" >&2;} { (exit 1); exit 1; }; }; } # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done ;; esac done { (exit 0); exit 0; } gsoap-2.8.28/INSTALL.txt0000644000175000017500000001652512653650160014150 0ustar ellertellert================================================================================ INSTALLATION ================================================================================ See README.txt for an overview of the gSOAP software and more details on the installation in case of a problem. This part explains how gSOAP is built on your platform. Using Autoconf/Automake ----------------------- Requirements to configure and build the package with autoconf/automake: 1. Automake tools (make and GNU m4) to configure and build 2. Bison http://www.gnu.org/software/bison or the alternative Yacc 3. Flex http://flex.sourceforge.net 4a. either OpenSSL (for optional HTTPS) http://www.openssl.org 4b. or GNUTLS (for optional HTTPS) http://www.gnu.org/software/gnutls/ 4c. or disable SSL support (./configure --disable-ssl) 5. Zlib (optional, to support compression) http://www.zlib.net 6. Pthreads or win32 threads (optional) See Installation Instructions below. I do not have/want Automake! What should I do? ---------------------------------------------- No problem. If autoconf/automake are not available or if 'configure' and 'make' fail for some reason, you can still build the 'soapcpp2' and 'wsdl2h' tools with the provided generic makefiles. To do so, use the command line to run 'make' with generic makefiles: $ cd gsoap/src $ make -f MakefileManual $ cd gsoap/wsdl $ make -f MakefileManual This builds 'soapcpp' with 'gcc' and 'wsdl2h' with 'g++' and installs the binaries in gsoap/bin. Move them to a bin directory or include them in your executable path. To build 'wsdl2h' with HTTPS enabled (assuming OpenSSL is installed), use: $ cd gsoap/wsdl $ make -f MakefileManual secure To compile with a different compiler instead of GCC, for example 'clang', use: $ cd gsoap/src $ make CC=clang -f MakefileManual $ cd gsoap/wsdl $ make CC=clang CPP=clang++ -f MakefileManual secure Some systems may require additional libraries to build 'wsdl2h', for example Sun OS: $ cd gsoap/wsdl $ make CC=CC CPP=CC SOCKLIB='-lsocket -lnsl -lxnet' -f MakefileManual secure The above commands to build 'soapcpp2' assume you have Bison and Flex installed. To use Yacc instead, please use: $ cd gsoap/src $ make YACC='yacc -d -v -s soapcpp2_yacc' CMFLAGS='-DWITH_YACC -DWITH_FLEX' -f MakefileManual If you do not have the Bison tool, please download and install it from here: http://www.gnu.org/software/bison/ If you do not have the Flex tool, please download and install it from here: http://flex.sourceforge.net For your project builds, use the stdsoap2.c and stdsoap2.cpp sources rather than the libgsoap libs, as the libs are not built. To enable SSL, GZIP, HTTP cookies, IPv6 support, and/or force C locale usage, use the compiler flags: -DWITH_OPENSSL to enable SSL, link with OpenSSL -DWITH_GNUTLS to enable SSL, link with GNUTLS -DWITH_GZIP to enable compression, link with Zlib -DWITH_COOKIES to enable HTTP cookies -DWITH_IPV6 to enable IPv6 -DWITH_C_LOCALE to force C locale Note: these flags when set must be used to compile ALL your sources to ensure consistency. What if I cannot install Bison and Flex? ---------------------------------------- Included in gsoap/src are the flex-generated file 'lex.yy.c' and bison-generated files 'soapcpp2_yacc.tab.h' and 'soapcpp2_yacc.tab.c'. These files may suffice (no guarantee however) to build 'soapcpp2' as follows: $ cd gsoap/src $ make -f MakefileManual soapcpp2 In case the files 'lex.yy.c', 'soapcpp2_yacc.tab.h', and 'soapcpp2_yacc.tab.c' were deleted in a prior build run, please unarchive the gSOAP package again to retrieve these original files. Windows Users ------------- Win32 binaries and project code is included in this package. Win32 users can start right away without autoconf/automake. The 'soapcpp2.exe' binary compiler and 'wsdl2h.exe' WSDL parser are included in 'gsoap/bin/win32', see also the 'gsoap/VisualStudio2005' folder for the tool project files. The 'soapcpp2.exe' and 'wsdl2h.exe' tools are command-line based and should be invoked from within the IDE to process WSDL, XSD, and gSOAP service specification header files: .wsdl .xsd --> wsdl2h.exe --> .h (special .h formatted with gSOAP annotations) .h --> soapcpp2.exe --> .h .c .cpp .xml ... Win32 build needs "ws2_32.lib". To do this in Visual Studio C++ 6.0, go to "Project", "settings", select the "Link" tab (the project file needs to be selected in the file view) and add "ws2_32.lib" to the "Object/library modules" entry Visual Studio 2005: you must install the Platform SDK (R2) Dependences (stdsoap2.h and stdsoap2.c/.cpp include specific comments on this): winsock2.h ws2tcpip.h ws2spi.h Ws2_32.lib Please note that the package includes mvc makefiles to build 'soapcpp2.exe' and 'wsdl2h.exe': gsoap/src/Make_mvc.mak gsoap/wsdl/Make_mvc.mak Symbian ------- Symbian instructions and example code is located in 'gsoap/Symbian'. Palm ---- Palm OS support is no longer available for this release. The latest stable release with Palm OS support is gSOAP 2.7.8c. Tandem NonStop -------------- See gsoap/TandemNonStop for instructions. Installation Instructions ------------------------- To build gSOAP on your platform using autoconf/automake, please enter the following commands: $ ./configure $ make $ make install This will install the executables and libraries on your system (and you need root access to do so). To build without the default OpenSSL SSL/TLS support, use: $ ./configure --disable-ssl $ make $ make install To build with GNUTLS SSL/TLS support, use: $ ./configure --enable-gnutls $ make $ make install IMPORTANT: the WS-Security WSSE plugin requires OpenSSL and will not build with GNUTLS. This limitation is being addressed, so please check future 2.8.x releases. To configure and build the examples, use the --enable-samples option: $ ./configure --enable-samples To configure and build the libraries in DEBUG mode, which produces 'SENT.log', 'RECV.log' and 'TEST.log' files for message logs and gSOAP engine event logs, use: $ ./configure --enable-debug To enable IPV6 support, use: $ ./configure --enable-ipv6 If you do not want the libraries to depend on a global namespace table (.nsmap file content), use: $ ./configure --disable-namespaces However, you MUST set a namespace table at runtime with soap_set_namespaces() right after initialization with soap_init() or soap_new() to ensure that a namespace mapping table is used by the engine context. If you want to install the executables in your local folder, enter: $ ./configure $ make $ make install exec_prefix=$HOME Summary ------- To build your projects, you need the following executables: wsdl2h the gSOAP WSDL/schema parser and code generator soapcpp2 the gSOAP stub/skeleton/serialization generator Pre-built executables of these for select platforms can be found in gsoap/bin. You also need the following libraries (built from stdsoap2.c[pp]): libgsoap++.a C++ runtime libgsoapck++.a C++ runtime with HTTP cookie support libgsoapssl++.a C++ runtime with cookies, zlib, and SSL libgsoap.a C runtime libgsoapck.a C runtime with HTTP cookie support libgsoapssl.a C runtime with cookies, zlib, and SSL Or you can use the stdsoap2.c and stdsoap2.cpp source directly, but you need to use the propoer -DWITH_X flags to enable support for 'X' (see above). This version of gSOAP requires SSL support with OpenSSL 0.9.6 or later. gsoap-2.8.28/gsoapssl++.pc.in0000644000175000017500000000055212653650160015204 0ustar ellertellertprefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: GSoap Description: SOAP C++ Web Services with SSL, ZLIB, DOM, and cookies Version: @VERSION@ Requires: Libs: -L${libdir} -lgsoapssl++ Libs.private: @SAMPLE_SSL_LIBS@ @SAMPLE_EXTRA_LIBS@ Cflags: @SOAPCPP2_IPV6@ @WSDL2H_EXTRA_FLAGS@ -DWITH_DOM -DWITH_COOKIES -I${includedir} gsoap-2.8.28/Makefile.in0000644000175000017500000007331412653650160014345 0ustar ellertellert# Makefile.in generated by automake 1.14 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ ####### This is the input file for automake, which will generate Makefile.in ########## VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = . DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/configure $(am__configure_deps) \ $(srcdir)/config.h.in mkinstalldirs $(srcdir)/gsoap.pc.in \ $(srcdir)/gsoap++.pc.in $(srcdir)/gsoapck.pc.in \ $(srcdir)/gsoapck++.pc.in $(srcdir)/gsoapssl.pc.in \ $(srcdir)/gsoapssl++.pc.in compile config.guess config.sub \ depcomp install-sh missing ylwrap ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = gsoap.pc gsoap++.pc gsoapck.pc gsoapck++.pc \ gsoapssl.pc gsoapssl++.pc CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgconfigdir)" DATA = $(pkgconfig_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ cscope distdir dist dist-all distcheck am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \ $(LISP)config.h.in # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags CSCOPE = cscope DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__post_remove_distdir = $(am__remove_distdir) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best DIST_TARGETS = dist-gzip distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ STRIP = @STRIP@ VERSION = @VERSION@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = gsoap CLEANFILES = *~ VERYVERYCLEANFILES = *~ configure Makefile.in compile config.guess config.sub config.log autoscan.log \ depcomp install-sh missing mkinstalldirs stamp-h.in config.h.in \ aclocal.m4 *.cache Makefile AUTOMAKE_OPTIONS = foreign 1.4 pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = gsoap.pc gsoap++.pc gsoapck.pc gsoapck++.pc gsoapssl.pc gsoapssl++.pc EXTRA_DIST = gsoap.pc.in gsoap++.pc.in gsoapck.pc.in gsoapck++.pc.in gsoapssl.pc.in gsoapssl++.pc.in all: config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: am--refresh: Makefile @: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): config.h: stamp-h1 @test -f $@ || rm -f stamp-h1 @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1 stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status @rm -f stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status config.h $(srcdir)/config.h.in: $(am__configure_deps) ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f stamp-h1 touch $@ distclean-hdr: -rm -f config.h stamp-h1 gsoap.pc: $(top_builddir)/config.status $(srcdir)/gsoap.pc.in cd $(top_builddir) && $(SHELL) ./config.status $@ gsoap++.pc: $(top_builddir)/config.status $(srcdir)/gsoap++.pc.in cd $(top_builddir) && $(SHELL) ./config.status $@ gsoapck.pc: $(top_builddir)/config.status $(srcdir)/gsoapck.pc.in cd $(top_builddir) && $(SHELL) ./config.status $@ gsoapck++.pc: $(top_builddir)/config.status $(srcdir)/gsoapck++.pc.in cd $(top_builddir) && $(SHELL) ./config.status $@ gsoapssl.pc: $(top_builddir)/config.status $(srcdir)/gsoapssl.pc.in cd $(top_builddir) && $(SHELL) ./config.status $@ gsoapssl++.pc: $(top_builddir)/config.status $(srcdir)/gsoapssl++.pc.in cd $(top_builddir) && $(SHELL) ./config.status $@ install-pkgconfigDATA: $(pkgconfig_DATA) @$(NORMAL_INSTALL) @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \ done uninstall-pkgconfigDATA: @$(NORMAL_UNINSTALL) @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscope: cscope.files test ! -s cscope.files \ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) clean-cscope: -rm -f cscope.files cscope.files: clean-cscope cscopelist cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -rm -f cscope.out cscope.in.out cscope.po.out cscope.files distdir: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__post_remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__post_remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__post_remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__post_remove_distdir) dist-tarZ: distdir @echo WARNING: "Support for shar distribution archives is" \ "deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__post_remove_distdir) dist-shar: distdir @echo WARNING: "Support for distribution archives compressed with" \ "legacy program 'compress' is deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__post_remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__post_remove_distdir) dist dist-all: $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' $(am__post_remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir) chmod u+w $(distdir) mkdir $(distdir)/_build $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build \ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__post_remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile $(DATA) config.h installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(pkgconfigdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-hdr distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-pkgconfigDATA @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) install-data-hook install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-pkgconfigDATA .MAKE: $(am__recursive_targets) all install-am install-data-am \ install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ am--refresh check check-am clean clean-cscope clean-generic \ cscope cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \ dist-gzip dist-lzip dist-shar dist-tarZ dist-xz dist-zip \ distcheck distclean distclean-generic distclean-hdr \ distclean-tags distcleancheck distdir distuninstallcheck dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-data-hook install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgconfigDATA install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags tags-am uninstall uninstall-am \ uninstall-pkgconfigDATA .PHONY: backup install-data-hook: echo "+--------------------------------------------------------+"; \ echo "| You now have successfully built and installed gsoap. |"; \ echo "| |"; \ echo "| You can link your programs with -lgsoap++ for |"; \ echo "| C++ projects created with soapcpp2 and you can link |"; \ echo "| with -lgsoap for C projects generated with soapcpp2 -c |"; \ echo "| |"; \ echo "| There are also corresponding libraries for SSL and |"; \ echo "| zlib compression support (-lgsoapssl and lgsoapssl++) |"; \ echo "| which require linking -lssl -lcrypto -lz |"; \ echo "| |"; \ echo "| Thanks for using gsoap. |"; \ echo "| |"; \ echo "| http://sourceforge.net/projects/gsoap2 |"; \ echo "+--------------------------------------------------------+"; reallyveryveryclean: $(MAKE) distclean for file in $(VERYVERYCLEANFILES);do rm -rf $(VERYVERYCLEANFILES);done; backup: $(MAKE) clean $(MAKE) distclean CURRENTDIR=`pwd` && \ BACKUPDIR=`basename $$CURRENTDIR` && \ cd .. && \ tar -czhf $$BACKUPDIR.tgz $$BACKUPDIR && \ cd $$BACKUPDIR && \ ls -l $$CURRENTDIR.tgz # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.28/ylwrap0000755000175000017500000001531212653650160013536 0ustar ellertellert#! /bin/sh # ylwrap - wrapper for lex/yacc invocations. scriptversion=2013-01-12.17; # UTC # Copyright (C) 1996-2013 Free Software Foundation, Inc. # # Written by Tom Tromey . # # 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, 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, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . get_dirname () { case $1 in */*|*\\*) printf '%s\n' "$1" | sed -e 's|\([\\/]\)[^\\/]*$|\1|';; # Otherwise, we want the empty string (not "."). esac } # guard FILE # ---------- # The CPP macro used to guard inclusion of FILE. guard () { printf '%s\n' "$1" \ | sed \ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' \ -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g' \ -e 's/__*/_/g' } # quote_for_sed [STRING] # ---------------------- # Return STRING (or stdin) quoted to be used as a sed pattern. quote_for_sed () { case $# in 0) cat;; 1) printf '%s\n' "$1";; esac \ | sed -e 's|[][\\.*]|\\&|g' } case "$1" in '') echo "$0: No files given. Try '$0 --help' for more information." 1>&2 exit 1 ;; --basedir) basedir=$2 shift 2 ;; -h|--h*) cat <<\EOF Usage: ylwrap [--help|--version] INPUT [OUTPUT DESIRED]... -- PROGRAM [ARGS]... Wrapper for lex/yacc invocations, renaming files as desired. INPUT is the input file OUTPUT is one file PROG generates DESIRED is the file we actually want instead of OUTPUT PROGRAM is program to run ARGS are passed to PROG Any number of OUTPUT,DESIRED pairs may be used. Report bugs to . EOF exit $? ;; -v|--v*) echo "ylwrap $scriptversion" exit $? ;; esac # The input. input=$1 shift # We'll later need for a correct munging of "#line" directives. input_sub_rx=`get_dirname "$input" | quote_for_sed` case $input in [\\/]* | ?:[\\/]*) # Absolute path; do nothing. ;; *) # Relative path. Make it absolute. input=`pwd`/$input ;; esac input_rx=`get_dirname "$input" | quote_for_sed` # Since DOS filename conventions don't allow two dots, # the DOS version of Bison writes out y_tab.c instead of y.tab.c # and y_tab.h instead of y.tab.h. Test to see if this is the case. y_tab_nodot=false if test -f y_tab.c || test -f y_tab.h; then y_tab_nodot=true fi # The parser itself, the first file, is the destination of the .y.c # rule in the Makefile. parser=$1 # A sed program to s/FROM/TO/g for all the FROM/TO so that, for # instance, we rename #include "y.tab.h" into #include "parse.h" # during the conversion from y.tab.c to parse.c. sed_fix_filenames= # Also rename header guards, as Bison 2.7 for instance uses its header # guard in its implementation file. sed_fix_header_guards= while test $# -ne 0; do if test x"$1" = x"--"; then shift break fi from=$1 # Handle y_tab.c and y_tab.h output by DOS if $y_tab_nodot; then case $from in "y.tab.c") from=y_tab.c;; "y.tab.h") from=y_tab.h;; esac fi shift to=$1 shift sed_fix_filenames="${sed_fix_filenames}s|"`quote_for_sed "$from"`"|$to|g;" sed_fix_header_guards="${sed_fix_header_guards}s|"`guard "$from"`"|"`guard "$to"`"|g;" done # The program to run. prog=$1 shift # Make any relative path in $prog absolute. case $prog in [\\/]* | ?:[\\/]*) ;; *[\\/]*) prog=`pwd`/$prog ;; esac dirname=ylwrap$$ do_exit="cd '`pwd`' && rm -rf $dirname > /dev/null 2>&1;"' (exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 mkdir $dirname || exit 1 cd $dirname case $# in 0) "$prog" "$input" ;; *) "$prog" "$@" "$input" ;; esac ret=$? if test $ret -eq 0; then for from in * do to=`printf '%s\n' "$from" | sed "$sed_fix_filenames"` if test -f "$from"; then # If $2 is an absolute path name, then just use that, # otherwise prepend '../'. case $to in [\\/]* | ?:[\\/]*) target=$to;; *) target=../$to;; esac # Do not overwrite unchanged header files to avoid useless # recompilations. Always update the parser itself: it is the # destination of the .y.c rule in the Makefile. Divert the # output of all other files to a temporary file so we can # compare them to existing versions. if test $from != $parser; then realtarget=$target target=tmp-`printf '%s\n' "$target" | sed 's|.*[\\/]||g'` fi # Munge "#line" or "#" directives. Don't let the resulting # debug information point at an absolute srcdir. Use the real # output file name, not yy.lex.c for instance. Adjust the # include guards too. sed -e "/^#/!b" \ -e "s|$input_rx|$input_sub_rx|" \ -e "$sed_fix_filenames" \ -e "$sed_fix_header_guards" \ "$from" >"$target" || ret=$? # Check whether files must be updated. if test "$from" != "$parser"; then if test -f "$realtarget" && cmp -s "$realtarget" "$target"; then echo "$to is unchanged" rm -f "$target" else echo "updating $to" mv -f "$target" "$realtarget" fi fi else # A missing file is only an error for the parser. This is a # blatant hack to let us support using "yacc -d". If -d is not # specified, don't fail when the header file is "missing". if test "$from" = "$parser"; then ret=1 fi fi done fi # Remove the directory. cd .. rm -rf $dirname exit $ret # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: gsoap-2.8.28/install-sh0000755000175000017500000001273612653650160014305 0ustar ellertellert#!/bin/sh # # install - install a program, script, or datafile # This comes from X11R5 (mit/util/scripts/install.sh). # # Copyright 1991 by the Massachusetts Institute of Technology # # Permission to use, copy, modify, distribute, and sell this software and its # documentation for any purpose is hereby granted without fee, provided that # the above copyright notice appear in all copies and that both that # copyright notice and this permission notice appear in supporting # documentation, and that the name of M.I.T. not be used in advertising or # publicity pertaining to distribution of the software without specific, # written prior permission. M.I.T. makes no representations about the # suitability of this software for any purpose. It is provided "as is" # without express or implied warranty. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. It can only install one file at a time, a restriction # shared with many OS's install programs. # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit="${DOITPROG-}" # put in absolute paths if you don't have them in your path; or use env. vars. mvprog="${MVPROG-mv}" cpprog="${CPPROG-cp}" chmodprog="${CHMODPROG-chmod}" chownprog="${CHOWNPROG-chown}" chgrpprog="${CHGRPPROG-chgrp}" stripprog="${STRIPPROG-strip}" rmprog="${RMPROG-rm}" mkdirprog="${MKDIRPROG-mkdir}" transformbasename="" transform_arg="" instcmd="$mvprog" chmodcmd="$chmodprog 0755" chowncmd="" chgrpcmd="" stripcmd="" rmcmd="$rmprog -f" mvcmd="$mvprog" src="" dst="" dir_arg="" while [ x"$1" != x ]; do case $1 in -c) instcmd="$cpprog" shift continue;; -d) dir_arg=true shift continue;; -m) chmodcmd="$chmodprog $2" shift shift continue;; -o) chowncmd="$chownprog $2" shift shift continue;; -g) chgrpcmd="$chgrpprog $2" shift shift continue;; -s) stripcmd="$stripprog" shift continue;; -t=*) transformarg=`echo $1 | sed 's/-t=//'` shift continue;; -b=*) transformbasename=`echo $1 | sed 's/-b=//'` shift continue;; *) if [ x"$src" = x ] then src=$1 else # this colon is to work around a 386BSD /bin/sh bug : dst=$1 fi shift continue;; esac done if [ x"$src" = x ] then echo "install: no input file specified" exit 1 else true fi if [ x"$dir_arg" != x ]; then dst=$src src="" if [ -d $dst ]; then instcmd=: chmodcmd="" else instcmd=mkdir fi else # Waiting for this to be detected by the "$instcmd $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if [ -f $src -o -d $src ] then true else echo "install: $src does not exist" exit 1 fi if [ x"$dst" = x ] then echo "install: no destination specified" exit 1 else true fi # If destination is a directory, append the input filename; if your system # does not like double slashes in filenames, you may need to add some logic if [ -d $dst ] then dst="$dst"/`basename $src` else true fi fi ## this sed command emulates the dirname command dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` # Make sure that the destination directory exists. # this part is taken from Noah Friedman's mkinstalldirs script # Skip lots of stat calls in the usual case. if [ ! -d "$dstdir" ]; then defaultIFS=' ' IFS="${IFS-${defaultIFS}}" oIFS="${IFS}" # Some sh's can't handle IFS=/ for some reason. IFS='%' set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` IFS="${oIFS}" pathcomp='' while [ $# -ne 0 ] ; do pathcomp="${pathcomp}${1}" shift if [ ! -d "${pathcomp}" ] ; then $mkdirprog "${pathcomp}" else true fi pathcomp="${pathcomp}/" done fi if [ x"$dir_arg" != x ] then $doit $instcmd $dst && if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi else # If we're going to rename the final executable, determine the name now. if [ x"$transformarg" = x ] then dstfile=`basename $dst` else dstfile=`basename $dst $transformbasename | sed $transformarg`$transformbasename fi # don't allow the sed command to completely eliminate the filename if [ x"$dstfile" = x ] then dstfile=`basename $dst` else true fi # Make a temp file name in the proper directory. dsttmp=$dstdir/#inst.$$# # Move or copy the file name to the temp name $doit $instcmd $src $dsttmp && trap "rm -f ${dsttmp}" 0 && # and set any options; do chmod last to preserve setuid bits # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $instcmd $src $dsttmp" command. if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && # Now rename the file to the real destination. $doit $rmcmd -f $dstdir/$dstfile && $doit $mvcmd $dsttmp $dstdir/$dstfile fi && exit 0 gsoap-2.8.28/makemake0000755000175000017500000000117612653650160013776 0ustar ellertellert#! /bin/sh aclocal autoheader rm -f missing automake --add-missing autoconf automake ./configure --enable-samples rm -f gsoap/wsdl/wsdlC.cpp rm -f gsoap/wsdl/*.o rm -f gsoap/src/*.o rm -f gsoap/samples/*/*.o rm -f gsoap/samples/*/soapH.h rm -f gsoap/samples/*/soapC.* rm -f gsoap/samples/databinding/addressC.cpp rm -f gsoap/samples/chaining/envC.c rm -f gsoap/samples/chaining/qServerLib.c rm -f gsoap/samples/chaining/cServerLib.c rm -f gsoap/samples/chaining++/envC.cpp rm -f gsoap/samples/chaining++/QuotequoteService.cpp rm -f gsoap/samples/chaining++/CalccalcService.cpp echo "Please run the following command now:" echo "make" gsoap-2.8.28/missing0000755000175000017500000001533112653650160013672 0ustar ellertellert#! /bin/sh # Common wrapper for a few potentially missing GNU programs. scriptversion=2012-06-26.16; # UTC # Copyright (C) 1996-2013 Free Software Foundation, Inc. # Originally written by Fran,cois Pinard , 1996. # 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, 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, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try '$0 --help' for more information" exit 1 fi case $1 in --is-lightweight) # Used by our autoconf macros to check whether the available missing # script is modern enough. exit 0 ;; --run) # Back-compat with the calling convention used by older automake. shift ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due to PROGRAM being missing or too old. Options: -h, --help display this help and exit -v, --version output version information and exit Supported PROGRAM values: aclocal autoconf autoheader autom4te automake makeinfo bison yacc flex lex help2man Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and 'g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: unknown '$1' option" echo 1>&2 "Try '$0 --help' for more information" exit 1 ;; esac # Run the given program, remember its exit status. "$@"; st=$? # If it succeeded, we are done. test $st -eq 0 && exit 0 # Also exit now if we it failed (or wasn't found), and '--version' was # passed; such an option is passed most likely to detect whether the # program is present and works. case $2 in --version|--help) exit $st;; esac # Exit code 63 means version mismatch. This often happens when the user # tries to use an ancient version of a tool on a file that requires a # minimum version. if test $st -eq 63; then msg="probably too old" elif test $st -eq 127; then # Program was missing. msg="missing on your system" else # Program was found and executed, but failed. Give up. exit $st fi perl_URL=http://www.perl.org/ flex_URL=http://flex.sourceforge.net/ gnu_software_URL=http://www.gnu.org/software program_details () { case $1 in aclocal|automake) echo "The '$1' program is part of the GNU Automake package:" echo "<$gnu_software_URL/automake>" echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/autoconf>" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; autoconf|autom4te|autoheader) echo "The '$1' program is part of the GNU Autoconf package:" echo "<$gnu_software_URL/autoconf/>" echo "It also requires GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; esac } give_advice () { # Normalize program name to check for. normalized_program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` printf '%s\n' "'$1' is $msg." configure_deps="'configure.ac' or m4 files included by 'configure.ac'" case $normalized_program in autoconf*) echo "You should only need it if you modified 'configure.ac'," echo "or m4 files included by it." program_details 'autoconf' ;; autoheader*) echo "You should only need it if you modified 'acconfig.h' or" echo "$configure_deps." program_details 'autoheader' ;; automake*) echo "You should only need it if you modified 'Makefile.am' or" echo "$configure_deps." program_details 'automake' ;; aclocal*) echo "You should only need it if you modified 'acinclude.m4' or" echo "$configure_deps." program_details 'aclocal' ;; autom4te*) echo "You might have modified some maintainer files that require" echo "the 'automa4te' program to be rebuilt." program_details 'autom4te' ;; bison*|yacc*) echo "You should only need it if you modified a '.y' file." echo "You may want to install the GNU Bison package:" echo "<$gnu_software_URL/bison/>" ;; lex*|flex*) echo "You should only need it if you modified a '.l' file." echo "You may want to install the Fast Lexical Analyzer package:" echo "<$flex_URL>" ;; help2man*) echo "You should only need it if you modified a dependency" \ "of a man page." echo "You may want to install the GNU Help2man package:" echo "<$gnu_software_URL/help2man/>" ;; makeinfo*) echo "You should only need it if you modified a '.texi' file, or" echo "any other file indirectly affecting the aspect of the manual." echo "You might want to install the Texinfo package:" echo "<$gnu_software_URL/texinfo/>" echo "The spurious makeinfo call might also be the consequence of" echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" echo "want to install GNU make:" echo "<$gnu_software_URL/make/>" ;; *) echo "You might have modified some files without having the proper" echo "tools for further handling them. Check the 'README' file, it" echo "often tells you about the needed prerequisites for installing" echo "this package. You may also peek at any GNU archive site, in" echo "case some other package contains this missing '$1' program." ;; esac } give_advice "$1" | sed -e '1s/^/WARNING: /' \ -e '2,$s/^/ /' >&2 # Propagate the correct exit status (expected to be 127 for a program # not found, 63 for a program that failed due to version mismatch). exit $st # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: gsoap-2.8.28/gsoapck.pc.in0000644000175000017500000000046212653650160014652 0ustar ellertellertprefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: GSoap Description: SOAP C Web Services with Cookies Enabled Version: @VERSION@ Requires: Libs: -L${libdir} -lgsoapck Libs.private: @SAMPLE_EXTRA_LIBS@ Cflags: @SOAPCPP2_IPV6@ -DWITH_COOKIES -DWITH_DOM -I${includedir} gsoap-2.8.28/stamp-h.in0000644000175000017500000000001212653650160014162 0ustar ellertellerttimestamp gsoap-2.8.28/.xpce/0000755000175000017500000000000012653650144013307 5ustar ellertellertgsoap-2.8.28/.xpce/Geometry.cnf0000644000175000017500000000106012653650144015567 0ustar ellertellert/* XPCE configuration file for "persistent_frame" Saved Sun Jan 24 21:48:13 2010 by engelen */ configversion(1). [persistent_frame]. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Option lines starting with a `%' indicate % % the value is equal to the application default. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /* (X-)geometry for persistent frames */ history/geometry/pui_manual = '880x413+91+-1'. /* Sub-window layout for persistent frames */ history/subwindow_layout/pui_manual = layout(*, [*, layout(*, [200, *]), *]). gsoap-2.8.28/config.guess.old0000755000175000017500000012706312653650144015400 0ustar ellertellert#! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, # Inc. timestamp='2007-07-22' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA # 02110-1301, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Per Bothner . # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and # exits with 0. Otherwise, it exits with 1. # # The plan is that this can be called by configure scripts if you # don't specify an explicit build system type. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep __ELF__ >/dev/null then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` exit ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm:riscos:*:*|arm:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep __LP64__ >/dev/null then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) case ${UNAME_MACHINE} in pc98) echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:[3456]*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; EM64T | authenticamd) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; arm*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; cris:Linux:*:*) echo cris-axis-linux-gnu exit ;; crisv32:Linux:*:*) echo crisv32-axis-linux-gnu exit ;; frv:Linux:*:*) echo frv-unknown-linux-gnu exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; mips:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips #undef mipsel #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mipsel #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips #else CPU= #endif #endif EOF eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' /^CPU/{ s: ::g p }'`" test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips64 #undef mips64el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mips64el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips64 #else CPU= #endif #endif EOF eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' /^CPU/{ s: ::g p }'`" test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; or32:Linux:*:*) echo or32-unknown-linux-gnu exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-gnu exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-gnu exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-gnu ;; PA8*) echo hppa2.0-unknown-linux-gnu ;; *) echo hppa-unknown-linux-gnu ;; esac exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-gnu exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-gnu exit ;; x86_64:Linux:*:*) echo x86_64-unknown-linux-gnu exit ;; xtensa:Linux:*:*) echo xtensa-unknown-linux-gnu exit ;; i*86:Linux:*:*) # The BFD linker knows what the default object file format is, so # first see if it will tell us. cd to the root directory to prevent # problems with other programs or directories called `ld' in the path. # Set LC_ALL=C to ensure ld outputs messages in English. ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ | sed -ne '/supported targets:/!d s/[ ][ ]*/ /g s/.*supported targets: *// s/ .*// p'` case "$ld_supported_targets" in elf32-i386) TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" ;; a.out-i386-linux) echo "${UNAME_MACHINE}-pc-linux-gnuaout" exit ;; coff-i386) echo "${UNAME_MACHINE}-pc-linux-gnucoff" exit ;; "") # Either a pre-BFD a.out linker (linux-gnuoldld) or # one that does not give us useful --help. echo "${UNAME_MACHINE}-pc-linux-gnuoldld" exit ;; esac # Determine whether the default compiler is a.out or elf eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include #ifdef __ELF__ # ifdef __GLIBC__ # if __GLIBC__ >= 2 LIBC=gnu # else LIBC=gnulibc1 # endif # else LIBC=gnulibc1 # endif #else #if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC) LIBC=gnu #else LIBC=gnuaout #endif #endif #ifdef __dietlibc__ LIBC=dietlibc #endif EOF eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' /^LIBC/{ s: ::g p }'`" test x"${LIBC}" != x && { echo "${UNAME_MACHINE}-pc-linux-${LIBC}" exit } test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; } ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i386. echo i386-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown case $UNAME_PROCESSOR in unknown) UNAME_PROCESSOR=powerpc ;; esac echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NSE-?:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix\n"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; c34*) echo c34-convex-bsd exit ;; c38*) echo c38-convex-bsd exit ;; c4*) echo c4-convex-bsd exit ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: gsoap-2.8.28/autom4te.cache/0000755000175000017500000000000012653650144015076 5ustar ellertellertgsoap-2.8.28/autom4te.cache/output.30000644000175000017500000070200112653650144016522 0ustar ellertellert@%:@! /bin/sh @%:@ Guess values for system-dependent variables and create Makefiles. @%:@ Generated by GNU Autoconf 2.69 for gsoap 2.8. @%:@ @%:@ @%:@ Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. @%:@ @%:@ @%:@ This configure script is free software; the Free Software Foundation @%:@ gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in @%:@( *posix*) : set -o posix ;; @%:@( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in @%:@( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in @%:@(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in @%:@ (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in @%:@( *posix*) : set -o posix ;; @%:@( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in @%:@( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in @%:@ (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## @%:@ as_fn_unset VAR @%:@ --------------- @%:@ Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset @%:@ as_fn_set_status STATUS @%:@ ----------------------- @%:@ Set @S|@? to STATUS, without forking. as_fn_set_status () { return $1 } @%:@ as_fn_set_status @%:@ as_fn_exit STATUS @%:@ ----------------- @%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } @%:@ as_fn_exit @%:@ as_fn_mkdir_p @%:@ ------------- @%:@ Create "@S|@as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } @%:@ as_fn_mkdir_p @%:@ as_fn_executable_p FILE @%:@ ----------------------- @%:@ Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } @%:@ as_fn_executable_p @%:@ as_fn_append VAR VALUE @%:@ ---------------------- @%:@ Append the text in VALUE to the end of the definition contained in VAR. Take @%:@ advantage of any shell optimizations that allow amortized linear growth over @%:@ repeated appends, instead of the typical quadratic growth present in naive @%:@ implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append @%:@ as_fn_arith ARG... @%:@ ------------------ @%:@ Perform arithmetic evaluation on the ARGs, and store the result in the @%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments @%:@ must be portable across @S|@(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith @%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] @%:@ ---------------------------------------- @%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are @%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the @%:@ script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } @%:@ as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in @%:@((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIB@&t@OBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='gsoap' PACKAGE_TARNAME='gsoap' PACKAGE_VERSION='2.8' PACKAGE_STRING='gsoap 2.8' PACKAGE_BUGREPORT='' PACKAGE_URL='' ac_unique_file="gsoap/stdsoap2.cpp" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_header_list= ac_func_list= ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS YACC_LIB BISON_DEFINE LEX_FLAGS LEX_DEFINE SAMPLE_DIRS ENABLE_SAMPLES ENABLE_SAMPLES_FALSE ENABLE_SAMPLES_TRUE WSDL2H_SOAP_CPP_LIB SAMPLE_SSL_LIBS SAMPLE_INCLUDES WSDL2H_EXTRA_LIBS WSDL2H_EXTRA_FLAGS SOAPCPP2_IPV6 SOAPCPP2_NONAMESPACES WSDL2H_IMPORTPATH SOAPCPP2_IMPORTPATH SOAPCPP2_DEBUG DEBUG_COMPILE_FALSE DEBUG_COMPILE_TRUE LIB@&t@OBJS EGREP GREP platform SAMPLE_EXTRA_LIBS LN_S RANLIB CPP YFLAGS YACC LEXLIB LEX_OUTPUT_ROOT LEX am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE ac_ct_CC CFLAGS CC am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CXX CPPFLAGS LDFLAGS CXXFLAGS CXX host_os host_vendor host_cpu host build_os build_vendor build_cpu build AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_silent_rules enable_dependency_tracking enable_debug enable_namespaces enable_ipv6 with_openssl enable_ssl enable_gnutls enable_samples ' ac_precious_vars='build_alias host_alias target_alias CXX CXXFLAGS LDFLAGS LIBS CPPFLAGS CCC CC CFLAGS YACC YFLAGS CPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures gsoap 2.8 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX @<:@@S|@ac_default_prefix@:>@ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX @<:@PREFIX@:>@ By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root @<:@DATAROOTDIR/doc/gsoap@:>@ --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of gsoap 2.8:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") --enable-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build --enable-debug add debug symbols for debugging --disable-namespaces compile library without namespaces --enable-ipv6 compile library with IPv6 support --disable-ssl build without SSL/TLS --enable-gnutls build with GNUTLS SSL/TLS --enable-samples enable compile for the gsoap samples Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-openssl=DIR openssl installation prefix Some influential environment variables: CXX C++ compiler command CXXFLAGS C++ compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CC C compiler command CFLAGS C compiler flags YACC The `Yet Another Compiler Compiler' implementation to use. Defaults to the first program found out of: `bison -y', `byacc', `yacc'. YFLAGS The list of arguments that will be passed by default to @S|@YACC. This script will default YFLAGS to the empty string to avoid a default value of `-d' given by some make applications. CPP C preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF gsoap configure 2.8 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## @%:@ ac_fn_cxx_try_compile LINENO @%:@ ---------------------------- @%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } @%:@ ac_fn_cxx_try_compile @%:@ ac_fn_c_try_compile LINENO @%:@ -------------------------- @%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } @%:@ ac_fn_c_try_compile @%:@ ac_fn_c_try_link LINENO @%:@ ----------------------- @%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } @%:@ ac_fn_c_try_link @%:@ ac_fn_c_try_cpp LINENO @%:@ ---------------------- @%:@ Try to preprocess conftest.@S|@ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } @%:@ ac_fn_c_try_cpp @%:@ ac_fn_c_try_run LINENO @%:@ ---------------------- @%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. Assumes @%:@ that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } @%:@ ac_fn_c_try_run @%:@ ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES @%:@ ------------------------------------------------------- @%:@ Tests whether HEADER exists, giving a warning if it cannot be compiled using @%:@ the include files in INCLUDES and setting the cache variable VAR @%:@ accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 @%:@include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } @%:@ ac_fn_c_check_header_mongrel @%:@ ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES @%:@ ------------------------------------------------------- @%:@ Tests whether HEADER exists and can be compiled using the include files in @%:@ INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 @%:@include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } @%:@ ac_fn_c_check_header_compile @%:@ ac_fn_c_check_type LINENO TYPE VAR INCLUDES @%:@ ------------------------------------------- @%:@ Tests whether TYPE exists after having included INCLUDES, setting cache @%:@ variable VAR accordingly. ac_fn_c_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof ($2)) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else eval "$3=yes" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } @%:@ ac_fn_c_check_type @%:@ ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES @%:@ ---------------------------------------------------- @%:@ Tries to find if the field MEMBER exists in type AGGR, after including @%:@ INCLUDES, setting cache variable VAR accordingly. ac_fn_c_check_member () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5 $as_echo_n "checking for $2.$3... " >&6; } if eval \${$4+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main () { static $2 ac_aggr; if (ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$4=yes" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main () { static $2 ac_aggr; if (sizeof ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$4=yes" else eval "$4=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$4 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } @%:@ ac_fn_c_check_member @%:@ ac_fn_c_check_func LINENO FUNC VAR @%:@ ---------------------------------- @%:@ Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } @%:@ ac_fn_c_check_func cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by gsoap $as_me 2.8, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in @%:@(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi as_fn_append ac_header_list " sys/time.h" as_fn_append ac_header_list " unistd.h" as_fn_append ac_func_list " alarm" # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu am__api_version='1.14' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in @%:@(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null @%:@ Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='gsoap' VERSION='2.8' cat >>confdefs.h <<_ACEOF @%:@define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar pax cpio none' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 fi fi # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac # AC_CONFIG_HEADERS([config.h]) ac_config_headers="$ac_config_headers config.h" # we use subdirs. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi # Checks for programs. ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler works" >&5 $as_echo_n "checking whether the C++ compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C++ compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler default output file name" >&5 $as_echo_n "checking for C++ compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C++ compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf @%:@ Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi depcc="$CXX" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CXX_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 $as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $@%:@ != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 $as_echo_n "checking whether $CC understands -c and -o together... " >&6; } if ${am_cv_prog_cc_c_o+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 $as_echo "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi for ac_prog in flex lex do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_LEX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$LEX"; then ac_cv_prog_LEX="$LEX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_LEX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi LEX=$ac_cv_prog_LEX if test -n "$LEX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LEX" >&5 $as_echo "$LEX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$LEX" && break done test -n "$LEX" || LEX=":" if test "x$LEX" != "x:"; then cat >conftest.l <<_ACEOF %% a { ECHO; } b { REJECT; } c { yymore (); } d { yyless (1); } e { /* IRIX 6.5 flex 2.5.4 underquotes its yyless argument. */ yyless ((input () != 0)); } f { unput (yytext[0]); } . { BEGIN INITIAL; } %% #ifdef YYTEXT_POINTER extern char *yytext; #endif int main (void) { return ! yylex () + ! yywrap (); } _ACEOF { { ac_try="$LEX conftest.l" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$LEX conftest.l") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking lex output file root" >&5 $as_echo_n "checking lex output file root... " >&6; } if ${ac_cv_prog_lex_root+:} false; then : $as_echo_n "(cached) " >&6 else if test -f lex.yy.c; then ac_cv_prog_lex_root=lex.yy elif test -f lexyy.c; then ac_cv_prog_lex_root=lexyy else as_fn_error $? "cannot find output from $LEX; giving up" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_root" >&5 $as_echo "$ac_cv_prog_lex_root" >&6; } LEX_OUTPUT_ROOT=$ac_cv_prog_lex_root if test -z "${LEXLIB+set}"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking lex library" >&5 $as_echo_n "checking lex library... " >&6; } if ${ac_cv_lib_lex+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_LIBS=$LIBS ac_cv_lib_lex='none needed' for ac_lib in '' -lfl -ll; do LIBS="$ac_lib $ac_save_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ `cat $LEX_OUTPUT_ROOT.c` _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_lex=$ac_lib fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext test "$ac_cv_lib_lex" != 'none needed' && break done LIBS=$ac_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lex" >&5 $as_echo "$ac_cv_lib_lex" >&6; } test "$ac_cv_lib_lex" != 'none needed' && LEXLIB=$ac_cv_lib_lex fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether yytext is a pointer" >&5 $as_echo_n "checking whether yytext is a pointer... " >&6; } if ${ac_cv_prog_lex_yytext_pointer+:} false; then : $as_echo_n "(cached) " >&6 else # POSIX says lex can declare yytext either as a pointer or an array; the # default is implementation-dependent. Figure out which it is, since # not all implementations provide the %pointer and %array declarations. ac_cv_prog_lex_yytext_pointer=no ac_save_LIBS=$LIBS LIBS="$LEXLIB $ac_save_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define YYTEXT_POINTER 1 `cat $LEX_OUTPUT_ROOT.c` _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_prog_lex_yytext_pointer=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_yytext_pointer" >&5 $as_echo "$ac_cv_prog_lex_yytext_pointer" >&6; } if test $ac_cv_prog_lex_yytext_pointer = yes; then $as_echo "@%:@define YYTEXT_POINTER 1" >>confdefs.h fi rm -f conftest.l $LEX_OUTPUT_ROOT.c fi if test "$LEX" = :; then LEX=${am_missing_run}flex fi for ac_prog in 'bison -y' byacc do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_YACC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$YACC"; then ac_cv_prog_YACC="$YACC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_YACC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi YACC=$ac_cv_prog_YACC if test -n "$YACC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $YACC" >&5 $as_echo "$YACC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$YACC" && break done test -n "$YACC" || YACC="yacc" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@ifdef __STDC__ @%:@ include @%:@else @%:@ include @%:@endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@ifdef __STDC__ @%:@ include @%:@else @%:@ include @%:@endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi #AM_PROG_LIBTOOL { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 $as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 $as_echo "no, using $LN_S" >&6; } fi for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done # AC_DECL_YYTEXT SAMPLE_EXTRA_LIBS="-lm" # Platform-specific Makefile setup case "${host}" in *-*-solaris*) platform=SUN_OS SAMPLE_EXTRA_LIBS="-lxnet -lsocket -lnsl -lm" WSDL2H_EXTRA_LIBS="-lxnet -lsocket -lnsl -lrt" ;; *-*-sysv5*) platform=UNIXWARE ;; *-*-UnixWare*) platform=UNIXWARE ;; *-*-unixware*) platform=UNIXWARE ;; *-*-sco3.2v5*) platform=OPENSERVER SAMPLE_EXTRA_LIBS="-lsocket -lm" ;; *-*-linux*) platform=LINUX # if test x$debug = xtrue; then # CFLAGS="-g" #don't want the -O2 for debugging. # else # CFLAGS="-O2" #don't want the -g for release compile. # fi ;; *-*-cygwin*) platform=CYGWIN ;; *-*-mingw*) platform=MINGW SAMPLE_EXTRA_LIBS="-lws2_32 -lkernel32 -luser32 -lgdi32 -lm" WSDL2H_EXTRA_LIBS="-lws2_32 -lkernel32 -luser32 -lgdi32 -lm" ;; *-*-freebsd*) platform=FREEBSD ;; *-*-openbsd*) platform=OPENBSD ;; *-*-irix*) platform=IRIX ;; *-*-aix*) platform=AIX case "${host}" in *-*-aix4.1*) osver=AIX41;; *-*-aix4.2*) osver=AIX42;; *-*-aix4.3*) osver=AIX43;; *-*-aix4.*) osver=AIX43;; *-*-aix5.2) osver=AIX52;; *-*-aix5.3) osver=AIX53;; *-*-aix6.1) osver=AIX61;; esac ;; *-sequent-*) platform=PTX ;; *-*-hp*) platform=HP_UX ; case "${host}" in *-*-hpux11*) osver=HPUX11;; *-*-hpux10*) osver=HPUX10;; *) osver=HPUX11;; esac ;; *-*-mvs*) platform=OS390 ;; *-*-os400*) platform=OS400 ;; *-*-OS400*) platform=OS400 ;; *-*-osf*) platform=TRU64 ;; *-apple-*) platform=MACOSX # Appease 10.7 Lion (OpenSSL deprecated) CXXFLAGS="-Wno-deprecated-declarations" CFLAGS="-Wno-deprecated-declarations" ;; *-nto-qnx) platform=QNX SAMPLE_EXTRA_LIBS="-lsocket -lm" ;; *) platform=UNKNOWN ;; esac # Checks for header files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "@%:@define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF @%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in arpa/inet.h xlocale.h errno.h fcntl.h ctype.h limits.h float.h math.h netdb.h netinet/in.h stdlib.h string.h strings.h stdint.h inttypes.h time.h sys/inttypes.h sys/socket.h sys/types.h sys/time.h sys/timeb.h unistd.h poll.h openssl/ssl.h gnutls/gnutls.h zlib.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF @%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done # Checks for typedefs, structures, and compiler characteristics. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 $as_echo_n "checking for an ANSI C-conforming const... " >&6; } if ${ac_cv_c_const+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __cplusplus /* Ultrix mips cc rejects this sort of thing. */ typedef int charset[2]; const charset cs = { 0, 0 }; /* SunOS 4.1.1 cc rejects this. */ char const *const *pcpcc; char **ppc; /* NEC SVR4.0.2 mips cc rejects this. */ struct point {int x, y;}; static struct point const zero = {0,0}; /* AIX XL C 1.02.0.0 rejects this. It does not let you subtract one const X* pointer from another in an arm of an if-expression whose if-part is not a constant expression */ const char *g = "string"; pcpcc = &g + (g ? g-g : 0); /* HPUX 7.0 cc rejects these. */ ++pcpcc; ppc = (char**) pcpcc; pcpcc = (char const *const *) ppc; { /* SCO 3.2v4 cc rejects this sort of thing. */ char tx; char *t = &tx; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; if (s) return 0; } { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ int x[] = {25, 17}; const int *foo = &x[0]; ++foo; } { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ typedef const int *iptr; iptr p = 0; ++p; } { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ struct s { int j; const int *ap[3]; } bx; struct s *b = &bx; b->j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; if (!foo) return 0; } return !cs[0] && !zero.x; #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_const=yes else ac_cv_c_const=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 $as_echo "$ac_cv_c_const" >&6; } if test $ac_cv_c_const = no; then $as_echo "@%:@define const /**/" >>confdefs.h fi ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" if test "x$ac_cv_type_size_t" = xyes; then : else cat >>confdefs.h <<_ACEOF @%:@define size_t unsigned int _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5 $as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; } if ${ac_cv_header_time+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { if ((struct tm *) 0) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_time=yes else ac_cv_header_time=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5 $as_echo "$ac_cv_header_time" >&6; } if test $ac_cv_header_time = yes; then $as_echo "@%:@define TIME_WITH_SYS_TIME 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether struct tm is in sys/time.h or time.h" >&5 $as_echo_n "checking whether struct tm is in sys/time.h or time.h... " >&6; } if ${ac_cv_struct_tm+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { struct tm tm; int *p = &tm.tm_sec; return !p; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_struct_tm=time.h else ac_cv_struct_tm=sys/time.h fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_struct_tm" >&5 $as_echo "$ac_cv_struct_tm" >&6; } if test $ac_cv_struct_tm = sys/time.h; then $as_echo "@%:@define TM_IN_SYS_TIME 1" >>confdefs.h fi ac_fn_c_check_member "$LINENO" "struct tm" "tm_gmtoff" "ac_cv_member_struct_tm_tm_gmtoff" " #include #include " if test "x$ac_cv_member_struct_tm_tm_gmtoff" = xyes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_STRUCT_TM_TM_GMTOFF 1 _ACEOF fi ac_fn_c_check_member "$LINENO" "struct tm" "__tm_gmtoff" "ac_cv_member_struct_tm___tm_gmtoff" " #include #include " if test "x$ac_cv_member_struct_tm___tm_gmtoff" = xyes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_STRUCT_TM___TM_GMTOFF 1 _ACEOF fi # Checks for library functions. for ac_header in $ac_header_list do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF @%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in $ac_func_list do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF @%:@define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working mktime" >&5 $as_echo_n "checking for working mktime... " >&6; } if ${ac_cv_func_working_mktime+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_working_mktime=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Test program from Paul Eggert and Tony Leneis. */ #ifdef TIME_WITH_SYS_TIME # include # include #else # ifdef HAVE_SYS_TIME_H # include # else # include # endif #endif #include #include #ifdef HAVE_UNISTD_H # include #endif #ifndef HAVE_ALARM # define alarm(X) /* empty */ #endif /* Work around redefinition to rpl_putenv by other config tests. */ #undef putenv static time_t time_t_max; static time_t time_t_min; /* Values we'll use to set the TZ environment variable. */ static const char *tz_strings[] = { (const char *) 0, "TZ=GMT0", "TZ=JST-9", "TZ=EST+3EDT+2,M10.1.0/00:00:00,M2.3.0/00:00:00" }; #define N_STRINGS (sizeof (tz_strings) / sizeof (tz_strings[0])) /* Return 0 if mktime fails to convert a date in the spring-forward gap. Based on a problem report from Andreas Jaeger. */ static int spring_forward_gap () { /* glibc (up to about 1998-10-07) failed this test. */ struct tm tm; /* Use the portable POSIX.1 specification "TZ=PST8PDT,M4.1.0,M10.5.0" instead of "TZ=America/Vancouver" in order to detect the bug even on systems that don't support the Olson extension, or don't have the full zoneinfo tables installed. */ putenv ((char*) "TZ=PST8PDT,M4.1.0,M10.5.0"); tm.tm_year = 98; tm.tm_mon = 3; tm.tm_mday = 5; tm.tm_hour = 2; tm.tm_min = 0; tm.tm_sec = 0; tm.tm_isdst = -1; return mktime (&tm) != (time_t) -1; } static int mktime_test1 (time_t now) { struct tm *lt; return ! (lt = localtime (&now)) || mktime (lt) == now; } static int mktime_test (time_t now) { return (mktime_test1 (now) && mktime_test1 ((time_t) (time_t_max - now)) && mktime_test1 ((time_t) (time_t_min + now))); } static int irix_6_4_bug () { /* Based on code from Ariel Faigon. */ struct tm tm; tm.tm_year = 96; tm.tm_mon = 3; tm.tm_mday = 0; tm.tm_hour = 0; tm.tm_min = 0; tm.tm_sec = 0; tm.tm_isdst = -1; mktime (&tm); return tm.tm_mon == 2 && tm.tm_mday == 31; } static int bigtime_test (int j) { struct tm tm; time_t now; tm.tm_year = tm.tm_mon = tm.tm_mday = tm.tm_hour = tm.tm_min = tm.tm_sec = j; now = mktime (&tm); if (now != (time_t) -1) { struct tm *lt = localtime (&now); if (! (lt && lt->tm_year == tm.tm_year && lt->tm_mon == tm.tm_mon && lt->tm_mday == tm.tm_mday && lt->tm_hour == tm.tm_hour && lt->tm_min == tm.tm_min && lt->tm_sec == tm.tm_sec && lt->tm_yday == tm.tm_yday && lt->tm_wday == tm.tm_wday && ((lt->tm_isdst < 0 ? -1 : 0 < lt->tm_isdst) == (tm.tm_isdst < 0 ? -1 : 0 < tm.tm_isdst)))) return 0; } return 1; } static int year_2050_test () { /* The correct answer for 2050-02-01 00:00:00 in Pacific time, ignoring leap seconds. */ unsigned long int answer = 2527315200UL; struct tm tm; time_t t; tm.tm_year = 2050 - 1900; tm.tm_mon = 2 - 1; tm.tm_mday = 1; tm.tm_hour = tm.tm_min = tm.tm_sec = 0; tm.tm_isdst = -1; /* Use the portable POSIX.1 specification "TZ=PST8PDT,M4.1.0,M10.5.0" instead of "TZ=America/Vancouver" in order to detect the bug even on systems that don't support the Olson extension, or don't have the full zoneinfo tables installed. */ putenv ((char*) "TZ=PST8PDT,M4.1.0,M10.5.0"); t = mktime (&tm); /* Check that the result is either a failure, or close enough to the correct answer that we can assume the discrepancy is due to leap seconds. */ return (t == (time_t) -1 || (0 < t && answer - 120 <= t && t <= answer + 120)); } int main () { time_t t, delta; int i, j; /* This test makes some buggy mktime implementations loop. Give up after 60 seconds; a mktime slower than that isn't worth using anyway. */ alarm (60); for (;;) { t = (time_t_max << 1) + 1; if (t <= time_t_max) break; time_t_max = t; } time_t_min = - ((time_t) ~ (time_t) 0 == (time_t) -1) - time_t_max; delta = time_t_max / 997; /* a suitable prime number */ for (i = 0; i < N_STRINGS; i++) { if (tz_strings[i]) putenv ((char*) tz_strings[i]); for (t = 0; t <= time_t_max - delta; t += delta) if (! mktime_test (t)) return 1; if (! (mktime_test ((time_t) 1) && mktime_test ((time_t) (60 * 60)) && mktime_test ((time_t) (60 * 60 * 24)))) return 1; for (j = 1; ; j <<= 1) if (! bigtime_test (j)) return 1; else if (INT_MAX / 2 < j) break; if (! bigtime_test (INT_MAX)) return 1; } return ! (irix_6_4_bug () && spring_forward_gap () && year_2050_test ()); } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_working_mktime=yes else ac_cv_func_working_mktime=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_working_mktime" >&5 $as_echo "$ac_cv_func_working_mktime" >&6; } if test $ac_cv_func_working_mktime = no; then case " $LIB@&t@OBJS " in *" mktime.$ac_objext "* ) ;; *) LIB@&t@OBJS="$LIB@&t@OBJS mktime.$ac_objext" ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking return type of signal handlers" >&5 $as_echo_n "checking return type of signal handlers... " >&6; } if ${ac_cv_type_signal+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { return *(signal (0, 0)) (0) == 1; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_type_signal=int else ac_cv_type_signal=void fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_signal" >&5 $as_echo "$ac_cv_type_signal" >&6; } cat >>confdefs.h <<_ACEOF @%:@define RETSIGTYPE $ac_cv_type_signal _ACEOF for ac_func in strftime do : ac_fn_c_check_func "$LINENO" "strftime" "ac_cv_func_strftime" if test "x$ac_cv_func_strftime" = xyes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_STRFTIME 1 _ACEOF else # strftime is in -lintl on SCO UNIX. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for strftime in -lintl" >&5 $as_echo_n "checking for strftime in -lintl... " >&6; } if ${ac_cv_lib_intl_strftime+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char strftime (); int main () { return strftime (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_strftime=yes else ac_cv_lib_intl_strftime=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_strftime" >&5 $as_echo "$ac_cv_lib_intl_strftime" >&6; } if test "x$ac_cv_lib_intl_strftime" = xyes; then : $as_echo "@%:@define HAVE_STRFTIME 1" >>confdefs.h LIBS="-lintl $LIBS" fi fi done for ac_func in random gettimeofday ftime localtime_r timegm gmtime gmtime_r memset select socket snprintf strchr strerror strerror_r strlcpy strrchr strstr strtol strtoul strtoll strtoull strtold strtod strtof strtold_l strtod_l strtof_l sscanf sscanf_l snprintf sprintf_l wctomb mbtowc poll do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF @%:@define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done # Checks for isnan and isinf ac_fn_c_check_func "$LINENO" "isnan" "ac_cv_func_isnan" if test "x$ac_cv_func_isnan" = xyes; then : has_isnan=1; $as_echo "@%:@define HAVE_ISNAN 1" >>confdefs.h else has_isnan=0 fi ac_fn_c_check_func "$LINENO" "isinf" "ac_cv_func_isinf" if test "x$ac_cv_func_isinf" = xyes; then : has_isinf=1; $as_echo "@%:@define HAVE_ISINF 1" >>confdefs.h else has_isinf=0 fi # check for macro isnan in math if test $has_isnan = 0; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for macro isnan" >&5 $as_echo_n "checking for macro isnan... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { { int foo; foo = isnan(0); } ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : has_isnan=1 else has_isnan=0 fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test $has_isnan = 1; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "@%:@define HAVE_ISNAN 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi # check for macro isinf in math if test $has_isinf = 0; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for macro isinf" >&5 $as_echo_n "checking for macro isinf... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { { int foo; foo = isinf(0); } ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : has_isinf=1 else has_isinf=0 fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test $has_isinf = 1; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "@%:@define HAVE_ISINF 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi # Function test depending on platform # AIX Has incompatible gethostbyname_r if test $platform != AIX -a $platform != TRU64; then for ac_func in gethostbyname_r do : ac_fn_c_check_func "$LINENO" "gethostbyname_r" "ac_cv_func_gethostbyname_r" if test "x$ac_cv_func_gethostbyname_r" = xyes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_GETHOSTBYNAME_R 1 _ACEOF fi done for ac_header in stdlib.h do : ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" if test "x$ac_cv_header_stdlib_h" = xyes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_STDLIB_H 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU libc compatible malloc" >&5 $as_echo_n "checking for GNU libc compatible malloc... " >&6; } if ${ac_cv_func_malloc_0_nonnull+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_malloc_0_nonnull=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined STDC_HEADERS || defined HAVE_STDLIB_H # include #else char *malloc (); #endif int main () { return ! malloc (0); ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_malloc_0_nonnull=yes else ac_cv_func_malloc_0_nonnull=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_malloc_0_nonnull" >&5 $as_echo "$ac_cv_func_malloc_0_nonnull" >&6; } if test $ac_cv_func_malloc_0_nonnull = yes; then : $as_echo "@%:@define HAVE_MALLOC 1" >>confdefs.h else $as_echo "@%:@define HAVE_MALLOC 0" >>confdefs.h case " $LIB@&t@OBJS " in *" malloc.$ac_objext "* ) ;; *) LIB@&t@OBJS="$LIB@&t@OBJS malloc.$ac_objext" ;; esac $as_echo "@%:@define malloc rpl_malloc" >>confdefs.h fi fi # the debug build options adds symbols to compiler output (-g for g++) @%:@ Check whether --enable-debug was given. if test "${enable_debug+set}" = set; then : enableval=$enable_debug; case "${enableval}" in yes) debug=true ;; no) debug=false ;; *) as_fn_error $? "bad value ${enableval} for --enable-debug" "$LINENO" 5 ;; esac else debug=false fi if test x$debug = xtrue; then DEBUG_COMPILE_TRUE= DEBUG_COMPILE_FALSE='#' else DEBUG_COMPILE_TRUE='#' DEBUG_COMPILE_FALSE= fi if test x$debug = xtrue; then SOAPCPP2_DEBUG="-DDEBUG" ##define DEBUG for debugging else SOAPCPP2_DEBUG= fi # set the default soapcpp2 import path SOAPCPP2_IMPORTPATH="-DSOAPCPP2_IMPORT_PATH=\"\\\"${datadir}/gsoap/import\\\"\"" #SOAPCPP2_IMPORTPATH="-DSOAPCPP2_IMPORT_PATH=\"\\\"`pwd`/gsoap/import\\\"\"" # set the default wsdl2h import path WSDL2H_IMPORTPATH="-DWSDL2H_IMPORT_PATH=\"\\\"${datadir}/gsoap/WS\\\"\"" #WSDL2H_IMPORTPATH="-DWSDL2H_IMPORT_PATH=\"\\\"`pwd`/gsoap/WS\\\"\"" # the disable-namespaces option adds the -DWITH_NONAMESPACES to the # library compilation thus disabling namespaces @%:@ Check whether --enable-namespaces was given. if test "${enable_namespaces+set}" = set; then : enableval=$enable_namespaces; with_namespaces="$enable_ns" else with_namespaces="yes" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for disable namespaces in library" >&5 $as_echo_n "checking for disable namespaces in library... " >&6; } if test "x$with_namespaces" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SOAPCPP2_NONAMESPACES="-DWITH_NONAMESPACES" ##define to remove nsmap link dependence fi # the enable-ipv6 option adds the -DWITH_IPV6 to the # library compilation thus enabling IPv6 @%:@ Check whether --enable-ipv6 was given. if test "${enable_ipv6+set}" = set; then : enableval=$enable_ipv6; with_ipv6="$enable_ipv6" else with_ipv6="no" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for enable ipv6 in library" >&5 $as_echo_n "checking for enable ipv6 in library... " >&6; } if test "x$with_ipv6" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SOAPCPP2_IPV6="-DWITH_IPV6 -DWITH_NO_IPV6_V6ONLY" ##define to add IPv6 support else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # the OpenSSL installation prefix path @%:@ Check whether --with-openssl was given. if test "${with_openssl+set}" = set; then : withval=$with_openssl; OPENSSL=$withval fi # the disable-ssl option removes the dependence on OpenSSL @%:@ Check whether --enable-ssl was given. if test "${enable_ssl+set}" = set; then : enableval=$enable_ssl; with_openssl="$enable_openssl" else with_openssl="yes" fi # the enable-gnutls option enables GNUTLS in favor of OpenSSL @%:@ Check whether --enable-gnutls was given. if test "${enable_gnutls+set}" = set; then : enableval=$enable_gnutls; with_gnutls="$enable_gnutls" else with_gnutls="no" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for disable openssl in library" >&5 $as_echo_n "checking for disable openssl in library... " >&6; } if test "x$with_openssl" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for enable gnutls in library" >&5 $as_echo_n "checking for enable gnutls in library... " >&6; } if test "x$with_gnutls" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } WSDL2H_EXTRA_FLAGS="-DWITH_GNUTLS -DWITH_GZIP" WSDL2H_EXTRA_LIBS="${WSDL2H_EXTRA_LIBS} -lgnutls -lgcrypt -lgpg-error -lz" SAMPLE_INCLUDES= SAMPLE_SSL_LIBS="-lgnutls -lgcrypt -lgpg-error -lz" WSDL2H_SOAP_CPP_LIB="libgsoapssl++.a" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } WSDL2H_EXTRA_FLAGS="-DWITH_OPENSSL -DWITH_GZIP" # an ugly hack to get httpda and md5evp plugins to conditionally # compile with wsdl2h when OPENSSL is available WSDL2H_EXTRA_LIBS="${WSDL2H_EXTRA_LIBS} ../plugin/httpda.c ../plugin/md5evp.c ../plugin/threads.c -lssl -lcrypto -lz" SAMPLE_INCLUDES= SAMPLE_SSL_LIBS="-lssl -lcrypto -lz" WSDL2H_SOAP_CPP_LIB="libgsoapssl++.a" fi if test -n "$OPENSSL"; then WSDL2H_EXTRA_FLAGS="-I${OPENSSL}/include ${WSDL2H_EXTRA_FLAGS}" WSDL2H_EXTRA_LIBS="-L${OPENSSL}/lib ${WSDL2H_EXTRA_LIBS}" SAMPLE_INCLUDES="-I${OPENSSL}/include" SAMPLE_SSL_LIBS="-L${OPENSSL}/lib ${SAMPLE_SSL_LIBS}" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } WSDL2H_EXTRA_FLAGS= SAMPLE_SSL_LIBS= SAMPLE_INCLUDES= WSDL2H_SOAP_CPP_LIB="libgsoap++.a" fi # enable the compile of the samples @%:@ Check whether --enable-samples was given. if test "${enable_samples+set}" = set; then : enableval=$enable_samples; case "${enableval}" in yes) samples=true ;; no) samples=false ;; *) as_fn_error $? "bad value ${enableval} for --enable-samples" "$LINENO" 5 ;; esac else samples=false fi if test x$samples = xtrue; then ENABLE_SAMPLES_TRUE= ENABLE_SAMPLES_FALSE='#' else ENABLE_SAMPLES_TRUE='#' ENABLE_SAMPLES_FALSE= fi if test x$samples = xtrue; then SAMPLE_DIRS=". samples" else SAMPLE_DIRS= fi if test x$LEX = xflex; then LEX_DEFINE=-DWITH_FLEX LEX_FLAGS="-l" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: No 'flex' command detected on current path: trying existing scanner" >&5 $as_echo "$as_me: WARNING: No 'flex' command detected on current path: trying existing scanner" >&2;} LEX_DEFINE=-DWITH_LEX LEX_FLAGS= fi # check if we must define -DWITH_BISON if test "$YACC" = "bison -y"; then BISON_DEFINE=-DWITH_BISON YACC_LIB= else BISON_DEFINE=-DWITH_YACC YACC_LIB="-ly" fi ac_config_files="$ac_config_files Makefile gsoap.pc gsoap++.pc gsoapck.pc gsoapck++.pc gsoapssl.pc gsoapssl++.pc gsoap/Makefile gsoap/src/Makefile gsoap/wsdl/Makefile gsoap/samples/Makefile gsoap/samples/autotest/Makefile gsoap/samples/calc/Makefile gsoap/samples/calc++/Makefile gsoap/samples/chaining/Makefile gsoap/samples/chaining++/Makefile gsoap/samples/databinding/Makefile gsoap/samples/dime/Makefile gsoap/samples/dom/Makefile gsoap/samples/oneway/Makefile gsoap/samples/oneway++/Makefile gsoap/samples/factory/Makefile gsoap/samples/factorytest/Makefile gsoap/samples/gmt/Makefile gsoap/samples/googleapi/Makefile gsoap/samples/hello/Makefile gsoap/samples/httpcookies/Makefile gsoap/samples/lu/Makefile gsoap/samples/magic/Makefile gsoap/samples/mashup/Makefile gsoap/samples/mashup++/Makefile gsoap/samples/mtom/Makefile gsoap/samples/mtom-stream/Makefile gsoap/samples/polytest/Makefile gsoap/samples/primes/Makefile gsoap/samples/roll/Makefile gsoap/samples/router/Makefile gsoap/samples/rss/Makefile gsoap/samples/ssl/Makefile gsoap/samples/template/Makefile gsoap/samples/udp/Makefile gsoap/samples/varparam/Makefile gsoap/samples/wsa/Makefile gsoap/samples/wsrm/Makefile gsoap/samples/wsse/Makefile gsoap/samples/xml-rpc-json/Makefile gsoap/samples/rest/Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= for ac_i in : $LIB@&t@OBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIB@&t@OBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs { $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 $as_echo_n "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 $as_echo "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${DEBUG_COMPILE_TRUE}" && test -z "${DEBUG_COMPILE_FALSE}"; then as_fn_error $? "conditional \"DEBUG_COMPILE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_SAMPLES_TRUE}" && test -z "${ENABLE_SAMPLES_FALSE}"; then as_fn_error $? "conditional \"ENABLE_SAMPLES\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in @%:@( *posix*) : set -o posix ;; @%:@( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in @%:@( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in @%:@(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH @%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] @%:@ ---------------------------------------- @%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are @%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the @%:@ script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } @%:@ as_fn_error @%:@ as_fn_set_status STATUS @%:@ ----------------------- @%:@ Set @S|@? to STATUS, without forking. as_fn_set_status () { return $1 } @%:@ as_fn_set_status @%:@ as_fn_exit STATUS @%:@ ----------------- @%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } @%:@ as_fn_exit @%:@ as_fn_unset VAR @%:@ --------------- @%:@ Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset @%:@ as_fn_append VAR VALUE @%:@ ---------------------- @%:@ Append the text in VALUE to the end of the definition contained in VAR. Take @%:@ advantage of any shell optimizations that allow amortized linear growth over @%:@ repeated appends, instead of the typical quadratic growth present in naive @%:@ implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append @%:@ as_fn_arith ARG... @%:@ ------------------ @%:@ Perform arithmetic evaluation on the ARGs, and store the result in the @%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments @%:@ must be portable across @S|@(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in @%:@((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null @%:@ as_fn_mkdir_p @%:@ ------------- @%:@ Create "@S|@as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } @%:@ as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi @%:@ as_fn_executable_p FILE @%:@ ----------------------- @%:@ Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } @%:@ as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by gsoap $as_me 2.8, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ gsoap config.status 2.8 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../@%:@@%:@ /;s/...$/ @%:@@%:@/;p;x;p;x' <<_ASBOX @%:@@%:@ Running $as_me. @%:@@%:@ _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "gsoap.pc") CONFIG_FILES="$CONFIG_FILES gsoap.pc" ;; "gsoap++.pc") CONFIG_FILES="$CONFIG_FILES gsoap++.pc" ;; "gsoapck.pc") CONFIG_FILES="$CONFIG_FILES gsoapck.pc" ;; "gsoapck++.pc") CONFIG_FILES="$CONFIG_FILES gsoapck++.pc" ;; "gsoapssl.pc") CONFIG_FILES="$CONFIG_FILES gsoapssl.pc" ;; "gsoapssl++.pc") CONFIG_FILES="$CONFIG_FILES gsoapssl++.pc" ;; "gsoap/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/Makefile" ;; "gsoap/src/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/src/Makefile" ;; "gsoap/wsdl/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/wsdl/Makefile" ;; "gsoap/samples/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/Makefile" ;; "gsoap/samples/autotest/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/autotest/Makefile" ;; "gsoap/samples/calc/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/calc/Makefile" ;; "gsoap/samples/calc++/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/calc++/Makefile" ;; "gsoap/samples/chaining/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/chaining/Makefile" ;; "gsoap/samples/chaining++/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/chaining++/Makefile" ;; "gsoap/samples/databinding/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/databinding/Makefile" ;; "gsoap/samples/dime/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/dime/Makefile" ;; "gsoap/samples/dom/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/dom/Makefile" ;; "gsoap/samples/oneway/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/oneway/Makefile" ;; "gsoap/samples/oneway++/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/oneway++/Makefile" ;; "gsoap/samples/factory/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/factory/Makefile" ;; "gsoap/samples/factorytest/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/factorytest/Makefile" ;; "gsoap/samples/gmt/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/gmt/Makefile" ;; "gsoap/samples/googleapi/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/googleapi/Makefile" ;; "gsoap/samples/hello/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/hello/Makefile" ;; "gsoap/samples/httpcookies/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/httpcookies/Makefile" ;; "gsoap/samples/lu/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/lu/Makefile" ;; "gsoap/samples/magic/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/magic/Makefile" ;; "gsoap/samples/mashup/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/mashup/Makefile" ;; "gsoap/samples/mashup++/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/mashup++/Makefile" ;; "gsoap/samples/mtom/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/mtom/Makefile" ;; "gsoap/samples/mtom-stream/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/mtom-stream/Makefile" ;; "gsoap/samples/polytest/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/polytest/Makefile" ;; "gsoap/samples/primes/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/primes/Makefile" ;; "gsoap/samples/roll/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/roll/Makefile" ;; "gsoap/samples/router/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/router/Makefile" ;; "gsoap/samples/rss/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/rss/Makefile" ;; "gsoap/samples/ssl/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/ssl/Makefile" ;; "gsoap/samples/template/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/template/Makefile" ;; "gsoap/samples/udp/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/udp/Makefile" ;; "gsoap/samples/varparam/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/varparam/Makefile" ;; "gsoap/samples/wsa/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/wsa/Makefile" ;; "gsoap/samples/wsrm/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/wsrm/Makefile" ;; "gsoap/samples/wsse/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/wsse/Makefile" ;; "gsoap/samples/xml-rpc-json/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/xml-rpc-json/Makefile" ;; "gsoap/samples/rest/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/rest/Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi gsoap-2.8.28/autom4te.cache/traces.20000644000175000017500000013766712653650144016466 0ustar ellertellertm4trace:/usr/local/share/aclocal-1.14/amversion.m4:20: -1- AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.14' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.14], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) m4trace:/usr/local/share/aclocal-1.14/amversion.m4:37: -1- AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.14])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) m4trace:/usr/local/share/aclocal-1.14/auxdir.m4:52: -1- AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) m4trace:/usr/local/share/aclocal-1.14/cond.m4:32: -1- AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ([2.52])dnl m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) m4trace:/usr/local/share/aclocal-1.14/depend.m4:156: -1- AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], [$1], [CXX], [depcc="$CXX" am_compiler_list=], [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], [$1], [UPC], [depcc="$UPC" am_compiler_list=], [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) m4trace:/usr/local/share/aclocal-1.14/depend.m4:166: -1- AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) m4trace:/usr/local/share/aclocal-1.14/depend.m4:189: -1- AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE([dependency-tracking], [dnl AS_HELP_STRING( [--enable-dependency-tracking], [do not reject slow dependency extractors]) AS_HELP_STRING( [--disable-dependency-tracking], [speeds up one-time build])]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) m4trace:/usr/local/share/aclocal-1.14/depout.m4:61: -1- AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ]) m4trace:/usr/local/share/aclocal-1.14/depout.m4:75: -1- AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) m4trace:/usr/local/share/aclocal-1.14/init.m4:167: -1- AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.65])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [AC_DIAGNOSE([obsolete], [$0: two- and three-arguments forms are deprecated.]) m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if( m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) AM_MISSING_PROG([AUTOCONF], [autoconf]) AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) AM_MISSING_PROG([AUTOHEADER], [autoheader]) AM_MISSING_PROG([MAKEINFO], [makeinfo]) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # AC_SUBST([mkdir_p], ['$(MKDIR_P)']) # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES([CC])], [m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES([CXX])], [m4_define([AC_PROG_CXX], m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) AC_REQUIRE([AM_SILENT_RULES])dnl dnl The testsuite driver may need to know about EXEEXT, so add the dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) fi fi]) m4trace:/usr/local/share/aclocal-1.14/init.m4:194: -1- AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) m4trace:/usr/local/share/aclocal-1.14/install-sh.m4:21: -1- AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST([install_sh])]) m4trace:/usr/local/share/aclocal-1.14/lead-dot.m4:19: -1- AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) m4trace:/usr/local/share/aclocal-1.14/lex.m4:19: -1- AC_DEFUN([AM_PROG_LEX], [AC_PREREQ([2.50])dnl AC_REQUIRE([AM_MISSING_HAS_RUN])dnl AC_REQUIRE([AC_PROG_LEX])dnl if test "$LEX" = :; then LEX=${am_missing_run}flex fi]) m4trace:/usr/local/share/aclocal-1.14/make.m4:49: -1- AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) m4trace:/usr/local/share/aclocal-1.14/missing.m4:14: -1- AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) m4trace:/usr/local/share/aclocal-1.14/missing.m4:38: -1- AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= AC_MSG_WARN(['missing' script is too old or missing]) fi ]) m4trace:/usr/local/share/aclocal-1.14/obsolete.m4:15: -1- AC_DEFUN([AM_CONFIG_HEADER], [AC_DIAGNOSE([obsolete], ['$0': this macro is obsolete. You should use the 'AC][_CONFIG_HEADERS' macro instead.])dnl AC_CONFIG_HEADERS($@)]) m4trace:/usr/local/share/aclocal-1.14/obsolete.m4:24: -1- AC_DEFUN([AM_PROG_CC_STDC], [AC_PROG_CC am_cv_prog_cc_stdc=$ac_cv_prog_cc_stdc AC_DIAGNOSE([obsolete], ['$0': this macro is obsolete. You should simply use the 'AC][_PROG_CC' macro instead. Also, your code should no longer depend upon 'am_cv_prog_cc_stdc', but upon 'ac_cv_prog_cc_stdc'.])]) m4trace:/usr/local/share/aclocal-1.14/obsolete.m4:27: -1- AC_DEFUN([AM_C_PROTOTYPES], [AC_FATAL([automatic de-ANSI-fication support has been removed])]) m4trace:/usr/local/share/aclocal-1.14/obsolete.m4:28: -1- AU_DEFUN([fp_C_PROTOTYPES], [AM_C_PROTOTYPES]) m4trace:/usr/local/share/aclocal-1.14/obsolete.m4:28: -1- AC_DEFUN([fp_C_PROTOTYPES], [AC_DIAGNOSE([obsolete], [The macro `fp_C_PROTOTYPES' is obsolete. You should run autoupdate.])dnl AM_C_PROTOTYPES]) m4trace:/usr/local/share/aclocal-1.14/options.m4:12: -1- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) m4trace:/usr/local/share/aclocal-1.14/options.m4:18: -1- AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), [1])]) m4trace:/usr/local/share/aclocal-1.14/options.m4:24: -1- AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) m4trace:/usr/local/share/aclocal-1.14/options.m4:30: -1- AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) m4trace:/usr/local/share/aclocal-1.14/prog-cc-c-o.m4:44: -1- AC_DEFUN([_AM_PROG_CC_C_O], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([compile])dnl AC_LANG_PUSH([C])dnl AC_CACHE_CHECK( [whether $CC understands -c and -o together], [am_cv_prog_cc_c_o], [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i]) if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi AC_LANG_POP([C])]) m4trace:/usr/local/share/aclocal-1.14/prog-cc-c-o.m4:47: -1- AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) m4trace:/usr/local/share/aclocal-1.14/runlog.m4:17: -1- AC_DEFUN([AM_RUN_LOG], [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD (exit $ac_status); }]) m4trace:/usr/local/share/aclocal-1.14/sanity.m4:82: -1- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi if test "$[2]" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT([yes]) # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi AC_CONFIG_COMMANDS_PRE( [AC_MSG_CHECKING([that generated files are newer than configure]) if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi AC_MSG_RESULT([done])]) rm -f conftest.file ]) m4trace:/usr/local/share/aclocal-1.14/silent.m4:60: -1- AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [dnl AS_HELP_STRING( [--enable-silent-rules], [less verbose build output (undo: "make V=1")]) AS_HELP_STRING( [--disable-silent-rules], [verbose build output (undo: "make V=0")])dnl ]) case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; esac dnl dnl A few 'make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. dnl See automake bug#9928 and bug#10237. am_make=${MAKE-make} AC_CACHE_CHECK([whether $am_make supports nested variables], [am_cv_make_support_nested_variables], [if AS_ECHO([['TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi]) if test $am_cv_make_support_nested_variables = yes; then dnl Using '$V' instead of '$(V)' breaks IRIX make. AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AC_SUBST([AM_V])dnl AM_SUBST_NOTMAKE([AM_V])dnl AC_SUBST([AM_DEFAULT_V])dnl AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) m4trace:/usr/local/share/aclocal-1.14/strip.m4:28: -1- AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) m4trace:/usr/local/share/aclocal-1.14/substnot.m4:12: -1- AC_DEFUN([_AM_SUBST_NOTMAKE]) m4trace:/usr/local/share/aclocal-1.14/substnot.m4:17: -1- AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) m4trace:/usr/local/share/aclocal-1.14/tar.m4:132: -1- AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar], [# The POSIX 1988 'ustar' format is defined with fixed-size fields. # There is notably a 21 bits limit for the UID and the GID. In fact, # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 # and bug#13588). am_max_uid=2097151 # 2^21 - 1 am_max_gid=$am_max_uid # The $UID and $GID variables are not portable, so we need to resort # to the POSIX-mandated id(1) utility. Errors in the 'id' calls # below are definitely unexpected, so allow the users to see them # (that is, avoid stderr redirection). am_uid=`id -u || echo unknown` am_gid=`id -g || echo unknown` AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) if test $am_uid -le $am_max_uid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) if test $am_gid -le $am_max_gid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi], [pax], [], [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_$1-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) m4trace:configure.ac:2: -1- m4_pattern_forbid([^_?A[CHUM]_]) m4trace:configure.ac:2: -1- m4_pattern_forbid([_AC_]) m4trace:configure.ac:2: -1- m4_pattern_forbid([^LIBOBJS$], [do not use LIBOBJS directly, use AC_LIBOBJ (see section `AC_LIBOBJ vs LIBOBJS']) m4trace:configure.ac:2: -1- m4_pattern_allow([^AS_FLAGS$]) m4trace:configure.ac:2: -1- m4_pattern_forbid([^_?m4_]) m4trace:configure.ac:2: -1- m4_pattern_forbid([^dnl$]) m4trace:configure.ac:2: -1- m4_pattern_forbid([^_?AS_]) m4trace:configure.ac:2: -1- m4_pattern_allow([^SHELL$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PATH_SEPARATOR$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_NAME$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_VERSION$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_STRING$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_URL$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^exec_prefix$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^prefix$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^program_transform_name$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^bindir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^sbindir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^libexecdir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^datarootdir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^datadir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^sysconfdir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^sharedstatedir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^localstatedir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^includedir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^oldincludedir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^docdir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^infodir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^htmldir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^dvidir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^pdfdir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^psdir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^libdir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^localedir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^mandir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_NAME$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_VERSION$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_STRING$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_URL$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^DEFS$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^ECHO_C$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^ECHO_N$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^ECHO_T$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^LIBS$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^build_alias$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^host_alias$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^target_alias$]) m4trace:configure.ac:3: -1- AM_INIT_AUTOMAKE([foreign]) m4trace:configure.ac:3: -1- m4_pattern_allow([^AM_[A-Z]+FLAGS$]) m4trace:configure.ac:3: -1- AM_SET_CURRENT_AUTOMAKE_VERSION m4trace:configure.ac:3: -1- AM_AUTOMAKE_VERSION([1.14]) m4trace:configure.ac:3: -1- _AM_AUTOCONF_VERSION([2.69]) m4trace:configure.ac:3: -1- m4_pattern_allow([^INSTALL_PROGRAM$]) m4trace:configure.ac:3: -1- m4_pattern_allow([^INSTALL_SCRIPT$]) m4trace:configure.ac:3: -1- m4_pattern_allow([^INSTALL_DATA$]) m4trace:configure.ac:3: -1- m4_pattern_allow([^am__isrc$]) m4trace:configure.ac:3: -1- _AM_SUBST_NOTMAKE([am__isrc]) m4trace:configure.ac:3: -1- m4_pattern_allow([^CYGPATH_W$]) m4trace:configure.ac:3: -1- _AM_SET_OPTIONS([foreign]) m4trace:configure.ac:3: -1- _AM_SET_OPTION([foreign]) m4trace:configure.ac:3: -2- _AM_MANGLE_OPTION([foreign]) m4trace:configure.ac:3: -1- m4_pattern_allow([^PACKAGE$]) m4trace:configure.ac:3: -1- m4_pattern_allow([^VERSION$]) m4trace:configure.ac:3: -1- _AM_IF_OPTION([no-define], [], [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])]) m4trace:configure.ac:3: -2- _AM_MANGLE_OPTION([no-define]) m4trace:configure.ac:3: -1- m4_pattern_allow([^PACKAGE$]) m4trace:configure.ac:3: -1- m4_pattern_allow([^VERSION$]) m4trace:configure.ac:3: -1- AM_SANITY_CHECK m4trace:configure.ac:3: -1- AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) m4trace:configure.ac:3: -1- AM_MISSING_HAS_RUN m4trace:configure.ac:3: -1- AM_AUX_DIR_EXPAND m4trace:configure.ac:3: -1- m4_pattern_allow([^ACLOCAL$]) m4trace:configure.ac:3: -1- AM_MISSING_PROG([AUTOCONF], [autoconf]) m4trace:configure.ac:3: -1- m4_pattern_allow([^AUTOCONF$]) m4trace:configure.ac:3: -1- AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) m4trace:configure.ac:3: -1- m4_pattern_allow([^AUTOMAKE$]) m4trace:configure.ac:3: -1- AM_MISSING_PROG([AUTOHEADER], [autoheader]) m4trace:configure.ac:3: -1- m4_pattern_allow([^AUTOHEADER$]) m4trace:configure.ac:3: -1- AM_MISSING_PROG([MAKEINFO], [makeinfo]) m4trace:configure.ac:3: -1- m4_pattern_allow([^MAKEINFO$]) m4trace:configure.ac:3: -1- AM_PROG_INSTALL_SH m4trace:configure.ac:3: -1- m4_pattern_allow([^install_sh$]) m4trace:configure.ac:3: -1- AM_PROG_INSTALL_STRIP m4trace:configure.ac:3: -1- m4_pattern_allow([^STRIP$]) m4trace:configure.ac:3: -1- m4_pattern_allow([^INSTALL_STRIP_PROGRAM$]) m4trace:configure.ac:3: -1- m4_pattern_allow([^MKDIR_P$]) m4trace:configure.ac:3: -1- m4_pattern_allow([^mkdir_p$]) m4trace:configure.ac:3: -1- m4_pattern_allow([^AWK$]) m4trace:configure.ac:3: -1- m4_pattern_allow([^SET_MAKE$]) m4trace:configure.ac:3: -1- AM_SET_LEADING_DOT m4trace:configure.ac:3: -1- m4_pattern_allow([^am__leading_dot$]) m4trace:configure.ac:3: -1- _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) m4trace:configure.ac:3: -2- _AM_MANGLE_OPTION([tar-ustar]) m4trace:configure.ac:3: -1- _AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])]) m4trace:configure.ac:3: -2- _AM_MANGLE_OPTION([tar-pax]) m4trace:configure.ac:3: -1- _AM_PROG_TAR([v7]) m4trace:configure.ac:3: -1- m4_pattern_allow([^AMTAR$]) m4trace:configure.ac:3: -1- m4_pattern_allow([^am__tar$]) m4trace:configure.ac:3: -1- m4_pattern_allow([^am__untar$]) m4trace:configure.ac:3: -1- _AM_IF_OPTION([no-dependencies], [], [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES([CC])], [m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES([CXX])], [m4_define([AC_PROG_CXX], m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) m4trace:configure.ac:3: -2- _AM_MANGLE_OPTION([no-dependencies]) m4trace:configure.ac:3: -1- AM_SILENT_RULES m4trace:configure.ac:3: -1- m4_pattern_allow([^AM_V$]) m4trace:configure.ac:3: -1- AM_SUBST_NOTMAKE([AM_V]) m4trace:configure.ac:3: -1- _AM_SUBST_NOTMAKE([AM_V]) m4trace:configure.ac:3: -1- m4_pattern_allow([^AM_DEFAULT_V$]) m4trace:configure.ac:3: -1- AM_SUBST_NOTMAKE([AM_DEFAULT_V]) m4trace:configure.ac:3: -1- _AM_SUBST_NOTMAKE([AM_DEFAULT_V]) m4trace:configure.ac:3: -1- m4_pattern_allow([^AM_DEFAULT_VERBOSITY$]) m4trace:configure.ac:3: -1- m4_pattern_allow([^AM_BACKSLASH$]) m4trace:configure.ac:3: -1- _AM_SUBST_NOTMAKE([AM_BACKSLASH]) m4trace:configure.ac:5: -1- m4_pattern_allow([^build$]) m4trace:configure.ac:5: -1- m4_pattern_allow([^build_cpu$]) m4trace:configure.ac:5: -1- m4_pattern_allow([^build_vendor$]) m4trace:configure.ac:5: -1- m4_pattern_allow([^build_os$]) m4trace:configure.ac:5: -1- m4_pattern_allow([^host$]) m4trace:configure.ac:5: -1- m4_pattern_allow([^host_cpu$]) m4trace:configure.ac:5: -1- m4_pattern_allow([^host_vendor$]) m4trace:configure.ac:5: -1- m4_pattern_allow([^host_os$]) m4trace:configure.ac:8: -1- AM_CONFIG_HEADER([config.h]) m4trace:configure.ac:8: -1- _m4_warn([obsolete], ['AM_CONFIG_HEADER': this macro is obsolete. You should use the 'AC_CONFIG_HEADERS' macro instead.], [/usr/local/share/aclocal-1.14/obsolete.m4:15: AM_CONFIG_HEADER is expanded from... configure.ac:8: the top level]) m4trace:configure.ac:11: -1- m4_pattern_allow([^SET_MAKE$]) m4trace:configure.ac:13: -1- m4_pattern_allow([^CXX$]) m4trace:configure.ac:13: -1- m4_pattern_allow([^CXXFLAGS$]) m4trace:configure.ac:13: -1- m4_pattern_allow([^LDFLAGS$]) m4trace:configure.ac:13: -1- m4_pattern_allow([^LIBS$]) m4trace:configure.ac:13: -1- m4_pattern_allow([^CPPFLAGS$]) m4trace:configure.ac:13: -1- m4_pattern_allow([^CXX$]) m4trace:configure.ac:13: -1- m4_pattern_allow([^ac_ct_CXX$]) m4trace:configure.ac:13: -1- m4_pattern_allow([^EXEEXT$]) m4trace:configure.ac:13: -1- m4_pattern_allow([^OBJEXT$]) m4trace:configure.ac:13: -1- _AM_DEPENDENCIES([CXX]) m4trace:configure.ac:13: -1- AM_SET_DEPDIR m4trace:configure.ac:13: -1- m4_pattern_allow([^DEPDIR$]) m4trace:configure.ac:13: -1- AM_OUTPUT_DEPENDENCY_COMMANDS m4trace:configure.ac:13: -1- AM_MAKE_INCLUDE m4trace:configure.ac:13: -1- m4_pattern_allow([^am__include$]) m4trace:configure.ac:13: -1- m4_pattern_allow([^am__quote$]) m4trace:configure.ac:13: -1- AM_DEP_TRACK m4trace:configure.ac:13: -1- AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) m4trace:configure.ac:13: -1- m4_pattern_allow([^AMDEP_TRUE$]) m4trace:configure.ac:13: -1- m4_pattern_allow([^AMDEP_FALSE$]) m4trace:configure.ac:13: -1- _AM_SUBST_NOTMAKE([AMDEP_TRUE]) m4trace:configure.ac:13: -1- _AM_SUBST_NOTMAKE([AMDEP_FALSE]) m4trace:configure.ac:13: -1- m4_pattern_allow([^AMDEPBACKSLASH$]) m4trace:configure.ac:13: -1- _AM_SUBST_NOTMAKE([AMDEPBACKSLASH]) m4trace:configure.ac:13: -1- m4_pattern_allow([^am__nodep$]) m4trace:configure.ac:13: -1- _AM_SUBST_NOTMAKE([am__nodep]) m4trace:configure.ac:13: -1- m4_pattern_allow([^CXXDEPMODE$]) m4trace:configure.ac:13: -1- AM_CONDITIONAL([am__fastdepCXX], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3]) m4trace:configure.ac:13: -1- m4_pattern_allow([^am__fastdepCXX_TRUE$]) m4trace:configure.ac:13: -1- m4_pattern_allow([^am__fastdepCXX_FALSE$]) m4trace:configure.ac:13: -1- _AM_SUBST_NOTMAKE([am__fastdepCXX_TRUE]) m4trace:configure.ac:13: -1- _AM_SUBST_NOTMAKE([am__fastdepCXX_FALSE]) m4trace:configure.ac:14: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:14: -1- m4_pattern_allow([^CFLAGS$]) m4trace:configure.ac:14: -1- m4_pattern_allow([^LDFLAGS$]) m4trace:configure.ac:14: -1- m4_pattern_allow([^LIBS$]) m4trace:configure.ac:14: -1- m4_pattern_allow([^CPPFLAGS$]) m4trace:configure.ac:14: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:14: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:14: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:14: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:14: -1- m4_pattern_allow([^ac_ct_CC$]) m4trace:configure.ac:14: -1- _AM_PROG_CC_C_O m4trace:configure.ac:14: -1- AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) m4trace:configure.ac:14: -1- _AM_DEPENDENCIES([CC]) m4trace:configure.ac:14: -1- m4_pattern_allow([^CCDEPMODE$]) m4trace:configure.ac:14: -1- AM_CONDITIONAL([am__fastdepCC], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3]) m4trace:configure.ac:14: -1- m4_pattern_allow([^am__fastdepCC_TRUE$]) m4trace:configure.ac:14: -1- m4_pattern_allow([^am__fastdepCC_FALSE$]) m4trace:configure.ac:14: -1- _AM_SUBST_NOTMAKE([am__fastdepCC_TRUE]) m4trace:configure.ac:14: -1- _AM_SUBST_NOTMAKE([am__fastdepCC_FALSE]) m4trace:configure.ac:15: -1- AM_PROG_CC_C_O m4trace:configure.ac:16: -1- AM_PROG_LEX m4trace:configure.ac:16: -1- m4_pattern_allow([^LEX$]) m4trace:configure.ac:16: -1- m4_pattern_allow([^LEX_OUTPUT_ROOT$]) m4trace:configure.ac:16: -1- m4_pattern_allow([^LEXLIB$]) m4trace:configure.ac:16: -1- m4_pattern_allow([^YYTEXT_POINTER$]) m4trace:configure.ac:17: -1- m4_pattern_allow([^YACC$]) m4trace:configure.ac:17: -1- m4_pattern_allow([^YACC$]) m4trace:configure.ac:17: -1- m4_pattern_allow([^YFLAGS$]) m4trace:configure.ac:18: -1- m4_pattern_allow([^CPP$]) m4trace:configure.ac:18: -1- m4_pattern_allow([^CPPFLAGS$]) m4trace:configure.ac:18: -1- m4_pattern_allow([^CPP$]) m4trace:configure.ac:19: -1- m4_pattern_allow([^RANLIB$]) m4trace:configure.ac:21: -1- m4_pattern_allow([^LN_S$]) m4trace:configure.ac:22: -1- m4_pattern_allow([^AWK$]) m4trace:configure.ac:90: -1- m4_pattern_allow([^SAMPLE_EXTRA_LIBS$]) m4trace:configure.ac:91: -1- m4_pattern_allow([^platform$]) m4trace:configure.ac:94: -1- m4_pattern_allow([^GREP$]) m4trace:configure.ac:94: -1- m4_pattern_allow([^EGREP$]) m4trace:configure.ac:94: -1- m4_pattern_allow([^STDC_HEADERS$]) m4trace:configure.ac:98: -1- m4_pattern_allow([^const$]) m4trace:configure.ac:99: -1- m4_pattern_allow([^size_t$]) m4trace:configure.ac:100: -1- m4_pattern_allow([^TIME_WITH_SYS_TIME$]) m4trace:configure.ac:101: -1- m4_pattern_allow([^TM_IN_SYS_TIME$]) m4trace:configure.ac:106: -1- m4_pattern_allow([^HAVE_STRUCT_TM_TM_GMTOFF$]) m4trace:configure.ac:106: -1- m4_pattern_allow([^HAVE_STRUCT_TM___TM_GMTOFF$]) m4trace:configure.ac:109: -1- AC_DEFUN([_AC_Header_sys_time_h], [m4_divert_text([INIT_PREPARE], [AS_VAR_APPEND([ac_header_list], [" sys/time.h"])]) _AC_HEADERS_EXPANSION]) m4trace:configure.ac:109: -1- AC_DEFUN([_AC_Header_unistd_h], [m4_divert_text([INIT_PREPARE], [AS_VAR_APPEND([ac_header_list], [" unistd.h"])]) _AC_HEADERS_EXPANSION]) m4trace:configure.ac:109: -1- AC_DEFUN([_AC_Func_alarm], [m4_divert_text([INIT_PREPARE], [AS_VAR_APPEND([ac_func_list], [" alarm"])]) _AC_FUNCS_EXPANSION]) m4trace:configure.ac:109: -1- m4_pattern_allow([^LIB@&t@OBJS$]) m4trace:configure.ac:110: -1- _m4_warn([obsolete], [The macro `AC_TYPE_SIGNAL' is obsolete. You should run autoupdate.], [../../lib/autoconf/types.m4:759: AC_TYPE_SIGNAL is expanded from... configure.ac:110: the top level]) m4trace:configure.ac:110: -1- m4_pattern_allow([^RETSIGTYPE$]) m4trace:configure.ac:111: -1- m4_pattern_allow([^HAVE_STRFTIME$]) m4trace:configure.ac:111: -1- m4_pattern_allow([^HAVE_STRFTIME$]) m4trace:configure.ac:115: -1- m4_pattern_allow([^HAVE_ISNAN$]) m4trace:configure.ac:116: -1- m4_pattern_allow([^HAVE_ISINF$]) m4trace:configure.ac:124: -1- m4_pattern_allow([^HAVE_ISNAN$]) m4trace:configure.ac:136: -1- m4_pattern_allow([^HAVE_ISINF$]) m4trace:configure.ac:145: -1- m4_pattern_allow([^HAVE_GETHOSTBYNAME_R$]) m4trace:configure.ac:146: -1- m4_pattern_allow([^HAVE_STDLIB_H$]) m4trace:configure.ac:146: -1- m4_pattern_allow([^HAVE_MALLOC$]) m4trace:configure.ac:146: -1- m4_pattern_allow([^HAVE_MALLOC$]) m4trace:configure.ac:146: -1- m4_pattern_allow([^LIB@&t@OBJS$]) m4trace:configure.ac:146: -1- m4_pattern_allow([^malloc$]) m4trace:configure.ac:157: -1- AM_CONDITIONAL([DEBUG_COMPILE], [test x$debug = xtrue]) m4trace:configure.ac:157: -1- m4_pattern_allow([^DEBUG_COMPILE_TRUE$]) m4trace:configure.ac:157: -1- m4_pattern_allow([^DEBUG_COMPILE_FALSE$]) m4trace:configure.ac:157: -1- _AM_SUBST_NOTMAKE([DEBUG_COMPILE_TRUE]) m4trace:configure.ac:157: -1- _AM_SUBST_NOTMAKE([DEBUG_COMPILE_FALSE]) m4trace:configure.ac:163: -1- m4_pattern_allow([^SOAPCPP2_DEBUG$]) m4trace:configure.ac:168: -1- m4_pattern_allow([^SOAPCPP2_IMPORTPATH$]) m4trace:configure.ac:173: -1- m4_pattern_allow([^WSDL2H_IMPORTPATH$]) m4trace:configure.ac:181: -1- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... ../../lib/autoconf/general.m4:1472: AC_ARG_ENABLE is expanded from... configure.ac:181: the top level]) m4trace:configure.ac:190: -1- m4_pattern_allow([^SOAPCPP2_NONAMESPACES$]) m4trace:configure.ac:198: -1- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... ../../lib/autoconf/general.m4:1472: AC_ARG_ENABLE is expanded from... configure.ac:198: the top level]) m4trace:configure.ac:207: -1- m4_pattern_allow([^SOAPCPP2_IPV6$]) m4trace:configure.ac:220: -1- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... ../../lib/autoconf/general.m4:1472: AC_ARG_ENABLE is expanded from... configure.ac:220: the top level]) m4trace:configure.ac:227: -1- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... ../../lib/autoconf/general.m4:1472: AC_ARG_ENABLE is expanded from... configure.ac:227: the top level]) m4trace:configure.ac:263: -1- m4_pattern_allow([^WSDL2H_EXTRA_FLAGS$]) m4trace:configure.ac:264: -1- m4_pattern_allow([^WSDL2H_EXTRA_LIBS$]) m4trace:configure.ac:265: -1- m4_pattern_allow([^SAMPLE_INCLUDES$]) m4trace:configure.ac:266: -1- m4_pattern_allow([^SAMPLE_SSL_LIBS$]) m4trace:configure.ac:267: -1- m4_pattern_allow([^WSDL2H_SOAP_CPP_LIB$]) m4trace:configure.ac:277: -1- AM_CONDITIONAL([ENABLE_SAMPLES], [test x$samples = xtrue]) m4trace:configure.ac:277: -1- m4_pattern_allow([^ENABLE_SAMPLES_TRUE$]) m4trace:configure.ac:277: -1- m4_pattern_allow([^ENABLE_SAMPLES_FALSE$]) m4trace:configure.ac:277: -1- _AM_SUBST_NOTMAKE([ENABLE_SAMPLES_TRUE]) m4trace:configure.ac:277: -1- _AM_SUBST_NOTMAKE([ENABLE_SAMPLES_FALSE]) m4trace:configure.ac:278: -1- m4_pattern_allow([^ENABLE_SAMPLES$]) m4trace:configure.ac:285: -1- m4_pattern_allow([^SAMPLE_DIRS$]) m4trace:configure.ac:295: -1- m4_pattern_allow([^LEX_DEFINE$]) m4trace:configure.ac:296: -1- m4_pattern_allow([^LEX_FLAGS$]) m4trace:configure.ac:297: -1- m4_pattern_allow([^LEXLIB$]) m4trace:configure.ac:307: -1- m4_pattern_allow([^BISON_DEFINE$]) m4trace:configure.ac:308: -1- m4_pattern_allow([^YACC_LIB$]) m4trace:configure.ac:353: -1- m4_pattern_allow([^LIB@&t@OBJS$]) m4trace:configure.ac:353: -1- m4_pattern_allow([^LTLIBOBJS$]) m4trace:configure.ac:353: -1- AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"]) m4trace:configure.ac:353: -1- m4_pattern_allow([^am__EXEEXT_TRUE$]) m4trace:configure.ac:353: -1- m4_pattern_allow([^am__EXEEXT_FALSE$]) m4trace:configure.ac:353: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_TRUE]) m4trace:configure.ac:353: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_FALSE]) m4trace:configure.ac:353: -1- _AC_AM_CONFIG_HEADER_HOOK(["$ac_file"]) m4trace:configure.ac:353: -1- _AM_OUTPUT_DEPENDENCY_COMMANDS gsoap-2.8.28/autom4te.cache/requests0000644000175000017500000003527712653650172016713 0ustar ellertellert# This file was generated. # It contains the lists of macros which have been traced. # It can be safely removed. @request = ( bless( [ '0', 1, [ '/usr/local/share/autoconf' ], [ '/usr/local/share/autoconf/autoconf/autoconf.m4f', '-', '/usr/local/share/aclocal-1.14/internal/ac-config-macro-dirs.m4', '/usr/local/share/aclocal-1.14/amversion.m4', '/usr/local/share/aclocal-1.14/auxdir.m4', '/usr/local/share/aclocal-1.14/cond.m4', '/usr/local/share/aclocal-1.14/depend.m4', '/usr/local/share/aclocal-1.14/depout.m4', '/usr/local/share/aclocal-1.14/init.m4', '/usr/local/share/aclocal-1.14/install-sh.m4', '/usr/local/share/aclocal-1.14/lead-dot.m4', '/usr/local/share/aclocal-1.14/lex.m4', '/usr/local/share/aclocal-1.14/make.m4', '/usr/local/share/aclocal-1.14/missing.m4', '/usr/local/share/aclocal-1.14/obsolete.m4', '/usr/local/share/aclocal-1.14/options.m4', '/usr/local/share/aclocal-1.14/prog-cc-c-o.m4', '/usr/local/share/aclocal-1.14/runlog.m4', '/usr/local/share/aclocal-1.14/sanity.m4', '/usr/local/share/aclocal-1.14/silent.m4', '/usr/local/share/aclocal-1.14/strip.m4', '/usr/local/share/aclocal-1.14/substnot.m4', '/usr/local/share/aclocal-1.14/tar.m4', 'configure.in' ], { 'm4_pattern_forbid' => 1, 'AM_SET_CURRENT_AUTOMAKE_VERSION' => 1, '_AM_SET_OPTION' => 1, 'AC_DEFUN' => 1, 'AM_INIT_AUTOMAKE' => 1, 'AM_AUTOMAKE_VERSION' => 1, 'AM_MISSING_HAS_RUN' => 1, 'AM_SUBST_NOTMAKE' => 1, 'AM_MISSING_PROG' => 1, 'AM_OUTPUT_DEPENDENCY_COMMANDS' => 1, 'AC_DEFUN_ONCE' => 1, '_AM_CONFIG_MACRO_DIRS' => 1, 'AM_PROG_INSTALL_STRIP' => 1, '_m4_warn' => 1, 'AM_SANITY_CHECK' => 1, 'AM_SILENT_RULES' => 1, 'include' => 1, '_AM_PROG_TAR' => 1, 'AM_AUX_DIR_EXPAND' => 1, 'AM_DEP_TRACK' => 1, 'AM_CONFIG_HEADER' => 1, '_AM_SET_OPTIONS' => 1, 'AM_RUN_LOG' => 1, '_AM_OUTPUT_DEPENDENCY_COMMANDS' => 1, 'AM_PROG_CC_STDC' => 1, 'AM_PROG_LEX' => 1, 'AC_CONFIG_MACRO_DIR' => 1, '_AM_IF_OPTION' => 1, 'AM_C_PROTOTYPES' => 1, '_AM_SUBST_NOTMAKE' => 1, '_AM_AUTOCONF_VERSION' => 1, 'AM_PROG_CC_C_O' => 1, 'm4_pattern_allow' => 1, '_AM_MANGLE_OPTION' => 1, 'AM_CONDITIONAL' => 1, 'AM_SET_LEADING_DOT' => 1, 'AC_CONFIG_MACRO_DIR_TRACE' => 1, 'AM_SET_DEPDIR' => 1, '_AM_DEPENDENCIES' => 1, 'm4_include' => 1, 'fp_C_PROTOTYPES' => 1, 'AM_PROG_INSTALL_SH' => 1, '_AM_PROG_CC_C_O' => 1, '_AC_AM_CONFIG_HEADER_HOOK' => 1, 'AU_DEFUN' => 1, 'AM_MAKE_INCLUDE' => 1 } ], 'Autom4te::Request' ), bless( [ '1', 1, [ '/usr/local/share/autoconf' ], [ '/usr/local/share/autoconf/autoconf/autoconf.m4f', 'aclocal.m4', 'configure.in' ], { 'AM_PROG_F77_C_O' => 1, '_LT_AC_TAGCONFIG' => 1, 'm4_pattern_forbid' => 1, 'AC_INIT' => 1, 'AC_CANONICAL_TARGET' => 1, '_AM_COND_IF' => 1, 'AC_CONFIG_LIBOBJ_DIR' => 1, 'AC_SUBST' => 1, 'AM_EXTRA_RECURSIVE_TARGETS' => 1, 'AC_CANONICAL_HOST' => 1, 'AC_FC_SRCEXT' => 1, 'AC_PROG_LIBTOOL' => 1, 'AM_PROG_MKDIR_P' => 1, 'AM_INIT_AUTOMAKE' => 1, 'AC_CONFIG_SUBDIRS' => 1, 'AM_PATH_GUILE' => 1, 'AM_AUTOMAKE_VERSION' => 1, 'LT_CONFIG_LTDL_DIR' => 1, 'AC_CONFIG_LINKS' => 1, 'AC_REQUIRE_AUX_FILE' => 1, 'LT_SUPPORTED_TAG' => 1, 'm4_sinclude' => 1, 'AM_MAINTAINER_MODE' => 1, 'AM_NLS' => 1, 'AC_FC_PP_DEFINE' => 1, 'AM_GNU_GETTEXT_INTL_SUBDIR' => 1, '_m4_warn' => 1, 'AM_MAKEFILE_INCLUDE' => 1, 'AM_PROG_CXX_C_O' => 1, '_AM_MAKEFILE_INCLUDE' => 1, '_AM_COND_ENDIF' => 1, 'AM_ENABLE_MULTILIB' => 1, 'AM_SILENT_RULES' => 1, 'AM_PROG_MOC' => 1, 'AC_CONFIG_FILES' => 1, 'LT_INIT' => 1, 'include' => 1, 'AM_GNU_GETTEXT' => 1, 'AM_PROG_AR' => 1, 'AC_LIBSOURCE' => 1, 'AC_CANONICAL_BUILD' => 1, 'AM_PROG_FC_C_O' => 1, 'AC_FC_FREEFORM' => 1, 'AC_FC_PP_SRCEXT' => 1, 'AH_OUTPUT' => 1, 'AC_CONFIG_AUX_DIR' => 1, '_AM_SUBST_NOTMAKE' => 1, 'm4_pattern_allow' => 1, 'AM_PROG_CC_C_O' => 1, 'sinclude' => 1, 'AM_CONDITIONAL' => 1, 'AC_CANONICAL_SYSTEM' => 1, 'AM_XGETTEXT_OPTION' => 1, 'AC_CONFIG_HEADERS' => 1, 'AC_DEFINE_TRACE_LITERAL' => 1, 'AM_POT_TOOLS' => 1, 'm4_include' => 1, '_AM_COND_ELSE' => 1, 'AC_SUBST_TRACE' => 1 } ], 'Autom4te::Request' ), bless( [ '2', 1, [ '/usr/local/share/autoconf' ], [ '/usr/local/share/autoconf/autoconf/autoconf.m4f', '-', '/usr/local/share/aclocal-1.14/internal/ac-config-macro-dirs.m4', '/usr/local/share/aclocal-1.14/amversion.m4', '/usr/local/share/aclocal-1.14/auxdir.m4', '/usr/local/share/aclocal-1.14/cond.m4', '/usr/local/share/aclocal-1.14/depend.m4', '/usr/local/share/aclocal-1.14/depout.m4', '/usr/local/share/aclocal-1.14/init.m4', '/usr/local/share/aclocal-1.14/install-sh.m4', '/usr/local/share/aclocal-1.14/lead-dot.m4', '/usr/local/share/aclocal-1.14/lex.m4', '/usr/local/share/aclocal-1.14/make.m4', '/usr/local/share/aclocal-1.14/missing.m4', '/usr/local/share/aclocal-1.14/obsolete.m4', '/usr/local/share/aclocal-1.14/options.m4', '/usr/local/share/aclocal-1.14/prog-cc-c-o.m4', '/usr/local/share/aclocal-1.14/runlog.m4', '/usr/local/share/aclocal-1.14/sanity.m4', '/usr/local/share/aclocal-1.14/silent.m4', '/usr/local/share/aclocal-1.14/strip.m4', '/usr/local/share/aclocal-1.14/substnot.m4', '/usr/local/share/aclocal-1.14/tar.m4', 'configure.ac' ], { 'm4_pattern_forbid' => 1, 'AM_SET_CURRENT_AUTOMAKE_VERSION' => 1, '_AM_SET_OPTION' => 1, 'AC_DEFUN' => 1, 'AM_INIT_AUTOMAKE' => 1, 'AM_AUTOMAKE_VERSION' => 1, 'AM_MISSING_HAS_RUN' => 1, 'AM_SUBST_NOTMAKE' => 1, 'AM_MISSING_PROG' => 1, 'AM_OUTPUT_DEPENDENCY_COMMANDS' => 1, 'AC_DEFUN_ONCE' => 1, '_AM_CONFIG_MACRO_DIRS' => 1, 'AM_PROG_INSTALL_STRIP' => 1, '_m4_warn' => 1, 'AM_SANITY_CHECK' => 1, 'AM_SILENT_RULES' => 1, 'include' => 1, '_AM_PROG_TAR' => 1, 'AM_AUX_DIR_EXPAND' => 1, 'AM_DEP_TRACK' => 1, 'AM_CONFIG_HEADER' => 1, '_AM_SET_OPTIONS' => 1, 'AM_RUN_LOG' => 1, '_AM_OUTPUT_DEPENDENCY_COMMANDS' => 1, 'AM_PROG_CC_STDC' => 1, 'AM_PROG_LEX' => 1, 'AC_CONFIG_MACRO_DIR' => 1, '_AM_IF_OPTION' => 1, 'AM_C_PROTOTYPES' => 1, '_AM_SUBST_NOTMAKE' => 1, '_AM_AUTOCONF_VERSION' => 1, 'AM_PROG_CC_C_O' => 1, 'm4_pattern_allow' => 1, '_AM_MANGLE_OPTION' => 1, 'AM_CONDITIONAL' => 1, 'AM_SET_LEADING_DOT' => 1, 'AC_CONFIG_MACRO_DIR_TRACE' => 1, 'AM_SET_DEPDIR' => 1, '_AM_DEPENDENCIES' => 1, 'm4_include' => 1, 'fp_C_PROTOTYPES' => 1, 'AM_PROG_INSTALL_SH' => 1, '_AM_PROG_CC_C_O' => 1, '_AC_AM_CONFIG_HEADER_HOOK' => 1, 'AU_DEFUN' => 1, 'AM_MAKE_INCLUDE' => 1 } ], 'Autom4te::Request' ), bless( [ '3', 1, [ '/usr/local/share/autoconf' ], [ '/usr/local/share/autoconf/autoconf/autoconf.m4f', 'aclocal.m4', 'configure.ac' ], { 'AM_PROG_F77_C_O' => 1, '_LT_AC_TAGCONFIG' => 1, 'm4_pattern_forbid' => 1, 'AC_INIT' => 1, 'AC_CANONICAL_TARGET' => 1, '_AM_COND_IF' => 1, 'AC_CONFIG_LIBOBJ_DIR' => 1, 'AC_SUBST' => 1, 'AM_EXTRA_RECURSIVE_TARGETS' => 1, 'AC_CANONICAL_HOST' => 1, 'AC_FC_SRCEXT' => 1, 'AC_PROG_LIBTOOL' => 1, 'AM_PROG_MKDIR_P' => 1, 'AM_INIT_AUTOMAKE' => 1, 'AC_CONFIG_SUBDIRS' => 1, 'AM_PATH_GUILE' => 1, 'AM_AUTOMAKE_VERSION' => 1, 'LT_CONFIG_LTDL_DIR' => 1, 'AC_CONFIG_LINKS' => 1, 'AC_REQUIRE_AUX_FILE' => 1, 'LT_SUPPORTED_TAG' => 1, 'm4_sinclude' => 1, 'AM_MAINTAINER_MODE' => 1, 'AM_NLS' => 1, 'AC_FC_PP_DEFINE' => 1, 'AM_GNU_GETTEXT_INTL_SUBDIR' => 1, '_m4_warn' => 1, 'AM_MAKEFILE_INCLUDE' => 1, 'AM_PROG_CXX_C_O' => 1, '_AM_MAKEFILE_INCLUDE' => 1, '_AM_COND_ENDIF' => 1, 'AM_ENABLE_MULTILIB' => 1, 'AM_SILENT_RULES' => 1, 'AM_PROG_MOC' => 1, 'AC_CONFIG_FILES' => 1, 'LT_INIT' => 1, 'include' => 1, 'AM_GNU_GETTEXT' => 1, 'AM_PROG_AR' => 1, 'AC_LIBSOURCE' => 1, 'AC_CANONICAL_BUILD' => 1, 'AM_PROG_FC_C_O' => 1, 'AC_FC_FREEFORM' => 1, 'AC_FC_PP_SRCEXT' => 1, 'AH_OUTPUT' => 1, 'AC_CONFIG_AUX_DIR' => 1, '_AM_SUBST_NOTMAKE' => 1, 'm4_pattern_allow' => 1, 'AM_PROG_CC_C_O' => 1, 'sinclude' => 1, 'AM_CONDITIONAL' => 1, 'AC_CANONICAL_SYSTEM' => 1, 'AM_XGETTEXT_OPTION' => 1, 'AC_CONFIG_HEADERS' => 1, 'AC_DEFINE_TRACE_LITERAL' => 1, 'AM_POT_TOOLS' => 1, 'm4_include' => 1, '_AM_COND_ELSE' => 1, 'AC_SUBST_TRACE' => 1 } ], 'Autom4te::Request' ) ); gsoap-2.8.28/autom4te.cache/traces.10000644000175000017500000014267112653650144016454 0ustar ellertellertm4trace:configure.in:2: -1- AC_INIT([gsoap], [2.8]) m4trace:configure.in:2: -1- m4_pattern_forbid([^_?A[CHUM]_]) m4trace:configure.in:2: -1- m4_pattern_forbid([_AC_]) m4trace:configure.in:2: -1- m4_pattern_forbid([^LIBOBJS$], [do not use LIBOBJS directly, use AC_LIBOBJ (see section `AC_LIBOBJ vs LIBOBJS']) m4trace:configure.in:2: -1- m4_pattern_allow([^AS_FLAGS$]) m4trace:configure.in:2: -1- m4_pattern_forbid([^_?m4_]) m4trace:configure.in:2: -1- m4_pattern_forbid([^dnl$]) m4trace:configure.in:2: -1- m4_pattern_forbid([^_?AS_]) m4trace:configure.in:2: -1- AC_SUBST([SHELL]) m4trace:configure.in:2: -1- AC_SUBST_TRACE([SHELL]) m4trace:configure.in:2: -1- m4_pattern_allow([^SHELL$]) m4trace:configure.in:2: -1- AC_SUBST([PATH_SEPARATOR]) m4trace:configure.in:2: -1- AC_SUBST_TRACE([PATH_SEPARATOR]) m4trace:configure.in:2: -1- m4_pattern_allow([^PATH_SEPARATOR$]) m4trace:configure.in:2: -1- AC_SUBST([PACKAGE_NAME], [m4_ifdef([AC_PACKAGE_NAME], ['AC_PACKAGE_NAME'])]) m4trace:configure.in:2: -1- AC_SUBST_TRACE([PACKAGE_NAME]) m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_NAME$]) m4trace:configure.in:2: -1- AC_SUBST([PACKAGE_TARNAME], [m4_ifdef([AC_PACKAGE_TARNAME], ['AC_PACKAGE_TARNAME'])]) m4trace:configure.in:2: -1- AC_SUBST_TRACE([PACKAGE_TARNAME]) m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) m4trace:configure.in:2: -1- AC_SUBST([PACKAGE_VERSION], [m4_ifdef([AC_PACKAGE_VERSION], ['AC_PACKAGE_VERSION'])]) m4trace:configure.in:2: -1- AC_SUBST_TRACE([PACKAGE_VERSION]) m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_VERSION$]) m4trace:configure.in:2: -1- AC_SUBST([PACKAGE_STRING], [m4_ifdef([AC_PACKAGE_STRING], ['AC_PACKAGE_STRING'])]) m4trace:configure.in:2: -1- AC_SUBST_TRACE([PACKAGE_STRING]) m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_STRING$]) m4trace:configure.in:2: -1- AC_SUBST([PACKAGE_BUGREPORT], [m4_ifdef([AC_PACKAGE_BUGREPORT], ['AC_PACKAGE_BUGREPORT'])]) m4trace:configure.in:2: -1- AC_SUBST_TRACE([PACKAGE_BUGREPORT]) m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) m4trace:configure.in:2: -1- AC_SUBST([PACKAGE_URL], [m4_ifdef([AC_PACKAGE_URL], ['AC_PACKAGE_URL'])]) m4trace:configure.in:2: -1- AC_SUBST_TRACE([PACKAGE_URL]) m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_URL$]) m4trace:configure.in:2: -1- AC_SUBST([exec_prefix], [NONE]) m4trace:configure.in:2: -1- AC_SUBST_TRACE([exec_prefix]) m4trace:configure.in:2: -1- m4_pattern_allow([^exec_prefix$]) m4trace:configure.in:2: -1- AC_SUBST([prefix], [NONE]) m4trace:configure.in:2: -1- AC_SUBST_TRACE([prefix]) m4trace:configure.in:2: -1- m4_pattern_allow([^prefix$]) m4trace:configure.in:2: -1- AC_SUBST([program_transform_name], [s,x,x,]) m4trace:configure.in:2: -1- AC_SUBST_TRACE([program_transform_name]) m4trace:configure.in:2: -1- m4_pattern_allow([^program_transform_name$]) m4trace:configure.in:2: -1- AC_SUBST([bindir], ['${exec_prefix}/bin']) m4trace:configure.in:2: -1- AC_SUBST_TRACE([bindir]) m4trace:configure.in:2: -1- m4_pattern_allow([^bindir$]) m4trace:configure.in:2: -1- AC_SUBST([sbindir], ['${exec_prefix}/sbin']) m4trace:configure.in:2: -1- AC_SUBST_TRACE([sbindir]) m4trace:configure.in:2: -1- m4_pattern_allow([^sbindir$]) m4trace:configure.in:2: -1- AC_SUBST([libexecdir], ['${exec_prefix}/libexec']) m4trace:configure.in:2: -1- AC_SUBST_TRACE([libexecdir]) m4trace:configure.in:2: -1- m4_pattern_allow([^libexecdir$]) m4trace:configure.in:2: -1- AC_SUBST([datarootdir], ['${prefix}/share']) m4trace:configure.in:2: -1- AC_SUBST_TRACE([datarootdir]) m4trace:configure.in:2: -1- m4_pattern_allow([^datarootdir$]) m4trace:configure.in:2: -1- AC_SUBST([datadir], ['${datarootdir}']) m4trace:configure.in:2: -1- AC_SUBST_TRACE([datadir]) m4trace:configure.in:2: -1- m4_pattern_allow([^datadir$]) m4trace:configure.in:2: -1- AC_SUBST([sysconfdir], ['${prefix}/etc']) m4trace:configure.in:2: -1- AC_SUBST_TRACE([sysconfdir]) m4trace:configure.in:2: -1- m4_pattern_allow([^sysconfdir$]) m4trace:configure.in:2: -1- AC_SUBST([sharedstatedir], ['${prefix}/com']) m4trace:configure.in:2: -1- AC_SUBST_TRACE([sharedstatedir]) m4trace:configure.in:2: -1- m4_pattern_allow([^sharedstatedir$]) m4trace:configure.in:2: -1- AC_SUBST([localstatedir], ['${prefix}/var']) m4trace:configure.in:2: -1- AC_SUBST_TRACE([localstatedir]) m4trace:configure.in:2: -1- m4_pattern_allow([^localstatedir$]) m4trace:configure.in:2: -1- AC_SUBST([includedir], ['${prefix}/include']) m4trace:configure.in:2: -1- AC_SUBST_TRACE([includedir]) m4trace:configure.in:2: -1- m4_pattern_allow([^includedir$]) m4trace:configure.in:2: -1- AC_SUBST([oldincludedir], ['/usr/include']) m4trace:configure.in:2: -1- AC_SUBST_TRACE([oldincludedir]) m4trace:configure.in:2: -1- m4_pattern_allow([^oldincludedir$]) m4trace:configure.in:2: -1- AC_SUBST([docdir], [m4_ifset([AC_PACKAGE_TARNAME], ['${datarootdir}/doc/${PACKAGE_TARNAME}'], ['${datarootdir}/doc/${PACKAGE}'])]) m4trace:configure.in:2: -1- AC_SUBST_TRACE([docdir]) m4trace:configure.in:2: -1- m4_pattern_allow([^docdir$]) m4trace:configure.in:2: -1- AC_SUBST([infodir], ['${datarootdir}/info']) m4trace:configure.in:2: -1- AC_SUBST_TRACE([infodir]) m4trace:configure.in:2: -1- m4_pattern_allow([^infodir$]) m4trace:configure.in:2: -1- AC_SUBST([htmldir], ['${docdir}']) m4trace:configure.in:2: -1- AC_SUBST_TRACE([htmldir]) m4trace:configure.in:2: -1- m4_pattern_allow([^htmldir$]) m4trace:configure.in:2: -1- AC_SUBST([dvidir], ['${docdir}']) m4trace:configure.in:2: -1- AC_SUBST_TRACE([dvidir]) m4trace:configure.in:2: -1- m4_pattern_allow([^dvidir$]) m4trace:configure.in:2: -1- AC_SUBST([pdfdir], ['${docdir}']) m4trace:configure.in:2: -1- AC_SUBST_TRACE([pdfdir]) m4trace:configure.in:2: -1- m4_pattern_allow([^pdfdir$]) m4trace:configure.in:2: -1- AC_SUBST([psdir], ['${docdir}']) m4trace:configure.in:2: -1- AC_SUBST_TRACE([psdir]) m4trace:configure.in:2: -1- m4_pattern_allow([^psdir$]) m4trace:configure.in:2: -1- AC_SUBST([libdir], ['${exec_prefix}/lib']) m4trace:configure.in:2: -1- AC_SUBST_TRACE([libdir]) m4trace:configure.in:2: -1- m4_pattern_allow([^libdir$]) m4trace:configure.in:2: -1- AC_SUBST([localedir], ['${datarootdir}/locale']) m4trace:configure.in:2: -1- AC_SUBST_TRACE([localedir]) m4trace:configure.in:2: -1- m4_pattern_allow([^localedir$]) m4trace:configure.in:2: -1- AC_SUBST([mandir], ['${datarootdir}/man']) m4trace:configure.in:2: -1- AC_SUBST_TRACE([mandir]) m4trace:configure.in:2: -1- m4_pattern_allow([^mandir$]) m4trace:configure.in:2: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_NAME]) m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_NAME$]) m4trace:configure.in:2: -1- AH_OUTPUT([PACKAGE_NAME], [/* Define to the full name of this package. */ @%:@undef PACKAGE_NAME]) m4trace:configure.in:2: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_TARNAME]) m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) m4trace:configure.in:2: -1- AH_OUTPUT([PACKAGE_TARNAME], [/* Define to the one symbol short name of this package. */ @%:@undef PACKAGE_TARNAME]) m4trace:configure.in:2: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_VERSION]) m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_VERSION$]) m4trace:configure.in:2: -1- AH_OUTPUT([PACKAGE_VERSION], [/* Define to the version of this package. */ @%:@undef PACKAGE_VERSION]) m4trace:configure.in:2: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_STRING]) m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_STRING$]) m4trace:configure.in:2: -1- AH_OUTPUT([PACKAGE_STRING], [/* Define to the full name and version of this package. */ @%:@undef PACKAGE_STRING]) m4trace:configure.in:2: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_BUGREPORT]) m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) m4trace:configure.in:2: -1- AH_OUTPUT([PACKAGE_BUGREPORT], [/* Define to the address where bug reports for this package should be sent. */ @%:@undef PACKAGE_BUGREPORT]) m4trace:configure.in:2: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_URL]) m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_URL$]) m4trace:configure.in:2: -1- AH_OUTPUT([PACKAGE_URL], [/* Define to the home page for this package. */ @%:@undef PACKAGE_URL]) m4trace:configure.in:2: -1- AC_SUBST([DEFS]) m4trace:configure.in:2: -1- AC_SUBST_TRACE([DEFS]) m4trace:configure.in:2: -1- m4_pattern_allow([^DEFS$]) m4trace:configure.in:2: -1- AC_SUBST([ECHO_C]) m4trace:configure.in:2: -1- AC_SUBST_TRACE([ECHO_C]) m4trace:configure.in:2: -1- m4_pattern_allow([^ECHO_C$]) m4trace:configure.in:2: -1- AC_SUBST([ECHO_N]) m4trace:configure.in:2: -1- AC_SUBST_TRACE([ECHO_N]) m4trace:configure.in:2: -1- m4_pattern_allow([^ECHO_N$]) m4trace:configure.in:2: -1- AC_SUBST([ECHO_T]) m4trace:configure.in:2: -1- AC_SUBST_TRACE([ECHO_T]) m4trace:configure.in:2: -1- m4_pattern_allow([^ECHO_T$]) m4trace:configure.in:2: -1- AC_SUBST([LIBS]) m4trace:configure.in:2: -1- AC_SUBST_TRACE([LIBS]) m4trace:configure.in:2: -1- m4_pattern_allow([^LIBS$]) m4trace:configure.in:2: -1- AC_SUBST([build_alias]) m4trace:configure.in:2: -1- AC_SUBST_TRACE([build_alias]) m4trace:configure.in:2: -1- m4_pattern_allow([^build_alias$]) m4trace:configure.in:2: -1- AC_SUBST([host_alias]) m4trace:configure.in:2: -1- AC_SUBST_TRACE([host_alias]) m4trace:configure.in:2: -1- m4_pattern_allow([^host_alias$]) m4trace:configure.in:2: -1- AC_SUBST([target_alias]) m4trace:configure.in:2: -1- AC_SUBST_TRACE([target_alias]) m4trace:configure.in:2: -1- m4_pattern_allow([^target_alias$]) m4trace:configure.in:3: -1- AM_INIT_AUTOMAKE([subdir-objects]) m4trace:configure.in:3: -1- m4_pattern_allow([^AM_[A-Z]+FLAGS$]) m4trace:configure.in:3: -1- AM_AUTOMAKE_VERSION([1.14]) m4trace:configure.in:3: -1- AC_REQUIRE_AUX_FILE([install-sh]) m4trace:configure.in:3: -1- AC_SUBST([INSTALL_PROGRAM]) m4trace:configure.in:3: -1- AC_SUBST_TRACE([INSTALL_PROGRAM]) m4trace:configure.in:3: -1- m4_pattern_allow([^INSTALL_PROGRAM$]) m4trace:configure.in:3: -1- AC_SUBST([INSTALL_SCRIPT]) m4trace:configure.in:3: -1- AC_SUBST_TRACE([INSTALL_SCRIPT]) m4trace:configure.in:3: -1- m4_pattern_allow([^INSTALL_SCRIPT$]) m4trace:configure.in:3: -1- AC_SUBST([INSTALL_DATA]) m4trace:configure.in:3: -1- AC_SUBST_TRACE([INSTALL_DATA]) m4trace:configure.in:3: -1- m4_pattern_allow([^INSTALL_DATA$]) m4trace:configure.in:3: -1- AC_SUBST([am__isrc], [' -I$(srcdir)']) m4trace:configure.in:3: -1- AC_SUBST_TRACE([am__isrc]) m4trace:configure.in:3: -1- m4_pattern_allow([^am__isrc$]) m4trace:configure.in:3: -1- _AM_SUBST_NOTMAKE([am__isrc]) m4trace:configure.in:3: -1- AC_SUBST([CYGPATH_W]) m4trace:configure.in:3: -1- AC_SUBST_TRACE([CYGPATH_W]) m4trace:configure.in:3: -1- m4_pattern_allow([^CYGPATH_W$]) m4trace:configure.in:3: -1- AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME']) m4trace:configure.in:3: -1- AC_SUBST_TRACE([PACKAGE]) m4trace:configure.in:3: -1- m4_pattern_allow([^PACKAGE$]) m4trace:configure.in:3: -1- AC_SUBST([VERSION], ['AC_PACKAGE_VERSION']) m4trace:configure.in:3: -1- AC_SUBST_TRACE([VERSION]) m4trace:configure.in:3: -1- m4_pattern_allow([^VERSION$]) m4trace:configure.in:3: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE]) m4trace:configure.in:3: -1- m4_pattern_allow([^PACKAGE$]) m4trace:configure.in:3: -1- AH_OUTPUT([PACKAGE], [/* Name of package */ @%:@undef PACKAGE]) m4trace:configure.in:3: -1- AC_DEFINE_TRACE_LITERAL([VERSION]) m4trace:configure.in:3: -1- m4_pattern_allow([^VERSION$]) m4trace:configure.in:3: -1- AH_OUTPUT([VERSION], [/* Version number of package */ @%:@undef VERSION]) m4trace:configure.in:3: -1- AC_REQUIRE_AUX_FILE([missing]) m4trace:configure.in:3: -1- AC_SUBST([ACLOCAL]) m4trace:configure.in:3: -1- AC_SUBST_TRACE([ACLOCAL]) m4trace:configure.in:3: -1- m4_pattern_allow([^ACLOCAL$]) m4trace:configure.in:3: -1- AC_SUBST([AUTOCONF]) m4trace:configure.in:3: -1- AC_SUBST_TRACE([AUTOCONF]) m4trace:configure.in:3: -1- m4_pattern_allow([^AUTOCONF$]) m4trace:configure.in:3: -1- AC_SUBST([AUTOMAKE]) m4trace:configure.in:3: -1- AC_SUBST_TRACE([AUTOMAKE]) m4trace:configure.in:3: -1- m4_pattern_allow([^AUTOMAKE$]) m4trace:configure.in:3: -1- AC_SUBST([AUTOHEADER]) m4trace:configure.in:3: -1- AC_SUBST_TRACE([AUTOHEADER]) m4trace:configure.in:3: -1- m4_pattern_allow([^AUTOHEADER$]) m4trace:configure.in:3: -1- AC_SUBST([MAKEINFO]) m4trace:configure.in:3: -1- AC_SUBST_TRACE([MAKEINFO]) m4trace:configure.in:3: -1- m4_pattern_allow([^MAKEINFO$]) m4trace:configure.in:3: -1- AC_SUBST([install_sh]) m4trace:configure.in:3: -1- AC_SUBST_TRACE([install_sh]) m4trace:configure.in:3: -1- m4_pattern_allow([^install_sh$]) m4trace:configure.in:3: -1- AC_SUBST([STRIP]) m4trace:configure.in:3: -1- AC_SUBST_TRACE([STRIP]) m4trace:configure.in:3: -1- m4_pattern_allow([^STRIP$]) m4trace:configure.in:3: -1- AC_SUBST([INSTALL_STRIP_PROGRAM]) m4trace:configure.in:3: -1- AC_SUBST_TRACE([INSTALL_STRIP_PROGRAM]) m4trace:configure.in:3: -1- m4_pattern_allow([^INSTALL_STRIP_PROGRAM$]) m4trace:configure.in:3: -1- AC_REQUIRE_AUX_FILE([install-sh]) m4trace:configure.in:3: -1- AC_SUBST([MKDIR_P]) m4trace:configure.in:3: -1- AC_SUBST_TRACE([MKDIR_P]) m4trace:configure.in:3: -1- m4_pattern_allow([^MKDIR_P$]) m4trace:configure.in:3: -1- AC_SUBST([mkdir_p], ['$(MKDIR_P)']) m4trace:configure.in:3: -1- AC_SUBST_TRACE([mkdir_p]) m4trace:configure.in:3: -1- m4_pattern_allow([^mkdir_p$]) m4trace:configure.in:3: -1- AC_SUBST([AWK]) m4trace:configure.in:3: -1- AC_SUBST_TRACE([AWK]) m4trace:configure.in:3: -1- m4_pattern_allow([^AWK$]) m4trace:configure.in:3: -1- AC_SUBST([SET_MAKE]) m4trace:configure.in:3: -1- AC_SUBST_TRACE([SET_MAKE]) m4trace:configure.in:3: -1- m4_pattern_allow([^SET_MAKE$]) m4trace:configure.in:3: -1- AC_SUBST([am__leading_dot]) m4trace:configure.in:3: -1- AC_SUBST_TRACE([am__leading_dot]) m4trace:configure.in:3: -1- m4_pattern_allow([^am__leading_dot$]) m4trace:configure.in:3: -1- AC_SUBST([AMTAR], ['$${TAR-tar}']) m4trace:configure.in:3: -1- AC_SUBST_TRACE([AMTAR]) m4trace:configure.in:3: -1- m4_pattern_allow([^AMTAR$]) m4trace:configure.in:3: -1- AC_SUBST([am__tar]) m4trace:configure.in:3: -1- AC_SUBST_TRACE([am__tar]) m4trace:configure.in:3: -1- m4_pattern_allow([^am__tar$]) m4trace:configure.in:3: -1- AC_SUBST([am__untar]) m4trace:configure.in:3: -1- AC_SUBST_TRACE([am__untar]) m4trace:configure.in:3: -1- m4_pattern_allow([^am__untar$]) m4trace:configure.in:3: -1- AM_SILENT_RULES m4trace:configure.in:3: -1- AC_SUBST([AM_V]) m4trace:configure.in:3: -1- AC_SUBST_TRACE([AM_V]) m4trace:configure.in:3: -1- m4_pattern_allow([^AM_V$]) m4trace:configure.in:3: -1- _AM_SUBST_NOTMAKE([AM_V]) m4trace:configure.in:3: -1- AC_SUBST([AM_DEFAULT_V]) m4trace:configure.in:3: -1- AC_SUBST_TRACE([AM_DEFAULT_V]) m4trace:configure.in:3: -1- m4_pattern_allow([^AM_DEFAULT_V$]) m4trace:configure.in:3: -1- _AM_SUBST_NOTMAKE([AM_DEFAULT_V]) m4trace:configure.in:3: -1- AC_SUBST([AM_DEFAULT_VERBOSITY]) m4trace:configure.in:3: -1- AC_SUBST_TRACE([AM_DEFAULT_VERBOSITY]) m4trace:configure.in:3: -1- m4_pattern_allow([^AM_DEFAULT_VERBOSITY$]) m4trace:configure.in:3: -1- AC_SUBST([AM_BACKSLASH]) m4trace:configure.in:3: -1- AC_SUBST_TRACE([AM_BACKSLASH]) m4trace:configure.in:3: -1- m4_pattern_allow([^AM_BACKSLASH$]) m4trace:configure.in:3: -1- _AM_SUBST_NOTMAKE([AM_BACKSLASH]) m4trace:configure.in:5: -1- AC_CANONICAL_HOST m4trace:configure.in:5: -1- AC_CANONICAL_BUILD m4trace:configure.in:5: -1- AC_REQUIRE_AUX_FILE([config.sub]) m4trace:configure.in:5: -1- AC_REQUIRE_AUX_FILE([config.guess]) m4trace:configure.in:5: -1- AC_SUBST([build], [$ac_cv_build]) m4trace:configure.in:5: -1- AC_SUBST_TRACE([build]) m4trace:configure.in:5: -1- m4_pattern_allow([^build$]) m4trace:configure.in:5: -1- AC_SUBST([build_cpu], [$[1]]) m4trace:configure.in:5: -1- AC_SUBST_TRACE([build_cpu]) m4trace:configure.in:5: -1- m4_pattern_allow([^build_cpu$]) m4trace:configure.in:5: -1- AC_SUBST([build_vendor], [$[2]]) m4trace:configure.in:5: -1- AC_SUBST_TRACE([build_vendor]) m4trace:configure.in:5: -1- m4_pattern_allow([^build_vendor$]) m4trace:configure.in:5: -1- AC_SUBST([build_os]) m4trace:configure.in:5: -1- AC_SUBST_TRACE([build_os]) m4trace:configure.in:5: -1- m4_pattern_allow([^build_os$]) m4trace:configure.in:5: -1- AC_SUBST([host], [$ac_cv_host]) m4trace:configure.in:5: -1- AC_SUBST_TRACE([host]) m4trace:configure.in:5: -1- m4_pattern_allow([^host$]) m4trace:configure.in:5: -1- AC_SUBST([host_cpu], [$[1]]) m4trace:configure.in:5: -1- AC_SUBST_TRACE([host_cpu]) m4trace:configure.in:5: -1- m4_pattern_allow([^host_cpu$]) m4trace:configure.in:5: -1- AC_SUBST([host_vendor], [$[2]]) m4trace:configure.in:5: -1- AC_SUBST_TRACE([host_vendor]) m4trace:configure.in:5: -1- m4_pattern_allow([^host_vendor$]) m4trace:configure.in:5: -1- AC_SUBST([host_os]) m4trace:configure.in:5: -1- AC_SUBST_TRACE([host_os]) m4trace:configure.in:5: -1- m4_pattern_allow([^host_os$]) m4trace:configure.in:8: -1- _m4_warn([obsolete], ['AM_CONFIG_HEADER': this macro is obsolete. You should use the 'AC_CONFIG_HEADERS' macro instead.], [aclocal.m4:766: AM_CONFIG_HEADER is expanded from... configure.in:8: the top level]) m4trace:configure.in:8: -1- AC_CONFIG_HEADERS([config.h]) m4trace:configure.in:11: -1- AC_SUBST([SET_MAKE]) m4trace:configure.in:11: -1- AC_SUBST_TRACE([SET_MAKE]) m4trace:configure.in:11: -1- m4_pattern_allow([^SET_MAKE$]) m4trace:configure.in:13: -1- AC_SUBST([CXX]) m4trace:configure.in:13: -1- AC_SUBST_TRACE([CXX]) m4trace:configure.in:13: -1- m4_pattern_allow([^CXX$]) m4trace:configure.in:13: -1- AC_SUBST([CXXFLAGS]) m4trace:configure.in:13: -1- AC_SUBST_TRACE([CXXFLAGS]) m4trace:configure.in:13: -1- m4_pattern_allow([^CXXFLAGS$]) m4trace:configure.in:13: -1- AC_SUBST([LDFLAGS]) m4trace:configure.in:13: -1- AC_SUBST_TRACE([LDFLAGS]) m4trace:configure.in:13: -1- m4_pattern_allow([^LDFLAGS$]) m4trace:configure.in:13: -1- AC_SUBST([LIBS]) m4trace:configure.in:13: -1- AC_SUBST_TRACE([LIBS]) m4trace:configure.in:13: -1- m4_pattern_allow([^LIBS$]) m4trace:configure.in:13: -1- AC_SUBST([CPPFLAGS]) m4trace:configure.in:13: -1- AC_SUBST_TRACE([CPPFLAGS]) m4trace:configure.in:13: -1- m4_pattern_allow([^CPPFLAGS$]) m4trace:configure.in:13: -1- AC_SUBST([CXX]) m4trace:configure.in:13: -1- AC_SUBST_TRACE([CXX]) m4trace:configure.in:13: -1- m4_pattern_allow([^CXX$]) m4trace:configure.in:13: -1- AC_SUBST([ac_ct_CXX]) m4trace:configure.in:13: -1- AC_SUBST_TRACE([ac_ct_CXX]) m4trace:configure.in:13: -1- m4_pattern_allow([^ac_ct_CXX$]) m4trace:configure.in:13: -1- AC_SUBST([EXEEXT], [$ac_cv_exeext]) m4trace:configure.in:13: -1- AC_SUBST_TRACE([EXEEXT]) m4trace:configure.in:13: -1- m4_pattern_allow([^EXEEXT$]) m4trace:configure.in:13: -1- AC_SUBST([OBJEXT], [$ac_cv_objext]) m4trace:configure.in:13: -1- AC_SUBST_TRACE([OBJEXT]) m4trace:configure.in:13: -1- m4_pattern_allow([^OBJEXT$]) m4trace:configure.in:13: -1- AC_SUBST([DEPDIR], ["${am__leading_dot}deps"]) m4trace:configure.in:13: -1- AC_SUBST_TRACE([DEPDIR]) m4trace:configure.in:13: -1- m4_pattern_allow([^DEPDIR$]) m4trace:configure.in:13: -1- AC_SUBST([am__include]) m4trace:configure.in:13: -1- AC_SUBST_TRACE([am__include]) m4trace:configure.in:13: -1- m4_pattern_allow([^am__include$]) m4trace:configure.in:13: -1- AC_SUBST([am__quote]) m4trace:configure.in:13: -1- AC_SUBST_TRACE([am__quote]) m4trace:configure.in:13: -1- m4_pattern_allow([^am__quote$]) m4trace:configure.in:13: -1- AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) m4trace:configure.in:13: -1- AC_SUBST([AMDEP_TRUE]) m4trace:configure.in:13: -1- AC_SUBST_TRACE([AMDEP_TRUE]) m4trace:configure.in:13: -1- m4_pattern_allow([^AMDEP_TRUE$]) m4trace:configure.in:13: -1- AC_SUBST([AMDEP_FALSE]) m4trace:configure.in:13: -1- AC_SUBST_TRACE([AMDEP_FALSE]) m4trace:configure.in:13: -1- m4_pattern_allow([^AMDEP_FALSE$]) m4trace:configure.in:13: -1- _AM_SUBST_NOTMAKE([AMDEP_TRUE]) m4trace:configure.in:13: -1- _AM_SUBST_NOTMAKE([AMDEP_FALSE]) m4trace:configure.in:13: -1- AC_SUBST([AMDEPBACKSLASH]) m4trace:configure.in:13: -1- AC_SUBST_TRACE([AMDEPBACKSLASH]) m4trace:configure.in:13: -1- m4_pattern_allow([^AMDEPBACKSLASH$]) m4trace:configure.in:13: -1- _AM_SUBST_NOTMAKE([AMDEPBACKSLASH]) m4trace:configure.in:13: -1- AC_SUBST([am__nodep]) m4trace:configure.in:13: -1- AC_SUBST_TRACE([am__nodep]) m4trace:configure.in:13: -1- m4_pattern_allow([^am__nodep$]) m4trace:configure.in:13: -1- _AM_SUBST_NOTMAKE([am__nodep]) m4trace:configure.in:13: -1- AC_SUBST([CXXDEPMODE], [depmode=$am_cv_CXX_dependencies_compiler_type]) m4trace:configure.in:13: -1- AC_SUBST_TRACE([CXXDEPMODE]) m4trace:configure.in:13: -1- m4_pattern_allow([^CXXDEPMODE$]) m4trace:configure.in:13: -1- AM_CONDITIONAL([am__fastdepCXX], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3]) m4trace:configure.in:13: -1- AC_SUBST([am__fastdepCXX_TRUE]) m4trace:configure.in:13: -1- AC_SUBST_TRACE([am__fastdepCXX_TRUE]) m4trace:configure.in:13: -1- m4_pattern_allow([^am__fastdepCXX_TRUE$]) m4trace:configure.in:13: -1- AC_SUBST([am__fastdepCXX_FALSE]) m4trace:configure.in:13: -1- AC_SUBST_TRACE([am__fastdepCXX_FALSE]) m4trace:configure.in:13: -1- m4_pattern_allow([^am__fastdepCXX_FALSE$]) m4trace:configure.in:13: -1- _AM_SUBST_NOTMAKE([am__fastdepCXX_TRUE]) m4trace:configure.in:13: -1- _AM_SUBST_NOTMAKE([am__fastdepCXX_FALSE]) m4trace:configure.in:14: -1- AC_SUBST([CC]) m4trace:configure.in:14: -1- AC_SUBST_TRACE([CC]) m4trace:configure.in:14: -1- m4_pattern_allow([^CC$]) m4trace:configure.in:14: -1- AC_SUBST([CFLAGS]) m4trace:configure.in:14: -1- AC_SUBST_TRACE([CFLAGS]) m4trace:configure.in:14: -1- m4_pattern_allow([^CFLAGS$]) m4trace:configure.in:14: -1- AC_SUBST([LDFLAGS]) m4trace:configure.in:14: -1- AC_SUBST_TRACE([LDFLAGS]) m4trace:configure.in:14: -1- m4_pattern_allow([^LDFLAGS$]) m4trace:configure.in:14: -1- AC_SUBST([LIBS]) m4trace:configure.in:14: -1- AC_SUBST_TRACE([LIBS]) m4trace:configure.in:14: -1- m4_pattern_allow([^LIBS$]) m4trace:configure.in:14: -1- AC_SUBST([CPPFLAGS]) m4trace:configure.in:14: -1- AC_SUBST_TRACE([CPPFLAGS]) m4trace:configure.in:14: -1- m4_pattern_allow([^CPPFLAGS$]) m4trace:configure.in:14: -1- AC_SUBST([CC]) m4trace:configure.in:14: -1- AC_SUBST_TRACE([CC]) m4trace:configure.in:14: -1- m4_pattern_allow([^CC$]) m4trace:configure.in:14: -1- AC_SUBST([CC]) m4trace:configure.in:14: -1- AC_SUBST_TRACE([CC]) m4trace:configure.in:14: -1- m4_pattern_allow([^CC$]) m4trace:configure.in:14: -1- AC_SUBST([CC]) m4trace:configure.in:14: -1- AC_SUBST_TRACE([CC]) m4trace:configure.in:14: -1- m4_pattern_allow([^CC$]) m4trace:configure.in:14: -1- AC_SUBST([CC]) m4trace:configure.in:14: -1- AC_SUBST_TRACE([CC]) m4trace:configure.in:14: -1- m4_pattern_allow([^CC$]) m4trace:configure.in:14: -1- AC_SUBST([ac_ct_CC]) m4trace:configure.in:14: -1- AC_SUBST_TRACE([ac_ct_CC]) m4trace:configure.in:14: -1- m4_pattern_allow([^ac_ct_CC$]) m4trace:configure.in:14: -1- AC_REQUIRE_AUX_FILE([compile]) m4trace:configure.in:14: -1- AC_SUBST([CCDEPMODE], [depmode=$am_cv_CC_dependencies_compiler_type]) m4trace:configure.in:14: -1- AC_SUBST_TRACE([CCDEPMODE]) m4trace:configure.in:14: -1- m4_pattern_allow([^CCDEPMODE$]) m4trace:configure.in:14: -1- AM_CONDITIONAL([am__fastdepCC], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3]) m4trace:configure.in:14: -1- AC_SUBST([am__fastdepCC_TRUE]) m4trace:configure.in:14: -1- AC_SUBST_TRACE([am__fastdepCC_TRUE]) m4trace:configure.in:14: -1- m4_pattern_allow([^am__fastdepCC_TRUE$]) m4trace:configure.in:14: -1- AC_SUBST([am__fastdepCC_FALSE]) m4trace:configure.in:14: -1- AC_SUBST_TRACE([am__fastdepCC_FALSE]) m4trace:configure.in:14: -1- m4_pattern_allow([^am__fastdepCC_FALSE$]) m4trace:configure.in:14: -1- _AM_SUBST_NOTMAKE([am__fastdepCC_TRUE]) m4trace:configure.in:14: -1- _AM_SUBST_NOTMAKE([am__fastdepCC_FALSE]) m4trace:configure.in:15: -1- AM_PROG_CC_C_O m4trace:configure.in:16: -1- AC_SUBST([LEX]) m4trace:configure.in:16: -1- AC_SUBST_TRACE([LEX]) m4trace:configure.in:16: -1- m4_pattern_allow([^LEX$]) m4trace:configure.in:16: -1- AC_SUBST([LEX_OUTPUT_ROOT], [$ac_cv_prog_lex_root]) m4trace:configure.in:16: -1- AC_SUBST_TRACE([LEX_OUTPUT_ROOT]) m4trace:configure.in:16: -1- m4_pattern_allow([^LEX_OUTPUT_ROOT$]) m4trace:configure.in:16: -1- AC_SUBST([LEXLIB]) m4trace:configure.in:16: -1- AC_SUBST_TRACE([LEXLIB]) m4trace:configure.in:16: -1- m4_pattern_allow([^LEXLIB$]) m4trace:configure.in:16: -1- AC_DEFINE_TRACE_LITERAL([YYTEXT_POINTER]) m4trace:configure.in:16: -1- m4_pattern_allow([^YYTEXT_POINTER$]) m4trace:configure.in:16: -1- AH_OUTPUT([YYTEXT_POINTER], [/* Define to 1 if `lex\' declares `yytext\' as a `char *\' by default, not a `char@<:@@:>@\'. */ @%:@undef YYTEXT_POINTER]) m4trace:configure.in:17: -1- AC_SUBST([YACC]) m4trace:configure.in:17: -1- AC_SUBST_TRACE([YACC]) m4trace:configure.in:17: -1- m4_pattern_allow([^YACC$]) m4trace:configure.in:17: -1- AC_SUBST([YACC]) m4trace:configure.in:17: -1- AC_SUBST_TRACE([YACC]) m4trace:configure.in:17: -1- m4_pattern_allow([^YACC$]) m4trace:configure.in:17: -1- AC_SUBST([YFLAGS]) m4trace:configure.in:17: -1- AC_SUBST_TRACE([YFLAGS]) m4trace:configure.in:17: -1- m4_pattern_allow([^YFLAGS$]) m4trace:configure.in:18: -1- AC_SUBST([CPP]) m4trace:configure.in:18: -1- AC_SUBST_TRACE([CPP]) m4trace:configure.in:18: -1- m4_pattern_allow([^CPP$]) m4trace:configure.in:18: -1- AC_SUBST([CPPFLAGS]) m4trace:configure.in:18: -1- AC_SUBST_TRACE([CPPFLAGS]) m4trace:configure.in:18: -1- m4_pattern_allow([^CPPFLAGS$]) m4trace:configure.in:18: -1- AC_SUBST([CPP]) m4trace:configure.in:18: -1- AC_SUBST_TRACE([CPP]) m4trace:configure.in:18: -1- m4_pattern_allow([^CPP$]) m4trace:configure.in:19: -1- AC_SUBST([RANLIB]) m4trace:configure.in:19: -1- AC_SUBST_TRACE([RANLIB]) m4trace:configure.in:19: -1- m4_pattern_allow([^RANLIB$]) m4trace:configure.in:21: -1- AC_SUBST([LN_S], [$as_ln_s]) m4trace:configure.in:21: -1- AC_SUBST_TRACE([LN_S]) m4trace:configure.in:21: -1- m4_pattern_allow([^LN_S$]) m4trace:configure.in:22: -1- AC_SUBST([AWK]) m4trace:configure.in:22: -1- AC_SUBST_TRACE([AWK]) m4trace:configure.in:22: -1- m4_pattern_allow([^AWK$]) m4trace:configure.in:90: -1- AC_SUBST([SAMPLE_EXTRA_LIBS]) m4trace:configure.in:90: -1- AC_SUBST_TRACE([SAMPLE_EXTRA_LIBS]) m4trace:configure.in:90: -1- m4_pattern_allow([^SAMPLE_EXTRA_LIBS$]) m4trace:configure.in:91: -1- AC_SUBST([platform]) m4trace:configure.in:91: -1- AC_SUBST_TRACE([platform]) m4trace:configure.in:91: -1- m4_pattern_allow([^platform$]) m4trace:configure.in:94: -1- AC_SUBST([GREP]) m4trace:configure.in:94: -1- AC_SUBST_TRACE([GREP]) m4trace:configure.in:94: -1- m4_pattern_allow([^GREP$]) m4trace:configure.in:94: -1- AC_SUBST([EGREP]) m4trace:configure.in:94: -1- AC_SUBST_TRACE([EGREP]) m4trace:configure.in:94: -1- m4_pattern_allow([^EGREP$]) m4trace:configure.in:94: -1- AC_DEFINE_TRACE_LITERAL([STDC_HEADERS]) m4trace:configure.in:94: -1- m4_pattern_allow([^STDC_HEADERS$]) m4trace:configure.in:94: -1- AH_OUTPUT([STDC_HEADERS], [/* Define to 1 if you have the ANSI C header files. */ @%:@undef STDC_HEADERS]) m4trace:configure.in:95: -1- AH_OUTPUT([HAVE_ARPA_INET_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_ARPA_INET_H]) m4trace:configure.in:95: -1- AH_OUTPUT([HAVE_XLOCALE_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_XLOCALE_H]) m4trace:configure.in:95: -1- AH_OUTPUT([HAVE_ERRNO_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_ERRNO_H]) m4trace:configure.in:95: -1- AH_OUTPUT([HAVE_FCNTL_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_FCNTL_H]) m4trace:configure.in:95: -1- AH_OUTPUT([HAVE_LIMITS_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_LIMITS_H]) m4trace:configure.in:95: -1- AH_OUTPUT([HAVE_NETDB_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_NETDB_H]) m4trace:configure.in:95: -1- AH_OUTPUT([HAVE_NETINET_IN_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_NETINET_IN_H]) m4trace:configure.in:95: -1- AH_OUTPUT([HAVE_STDLIB_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_STDLIB_H]) m4trace:configure.in:95: -1- AH_OUTPUT([HAVE_STRING_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_STRING_H]) m4trace:configure.in:95: -1- AH_OUTPUT([HAVE_STRINGS_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_STRINGS_H]) m4trace:configure.in:95: -1- AH_OUTPUT([HAVE_STDINT_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_STDINT_H]) m4trace:configure.in:95: -1- AH_OUTPUT([HAVE_INTTYPES_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_INTTYPES_H]) m4trace:configure.in:95: -1- AH_OUTPUT([HAVE_TIME_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_TIME_H]) m4trace:configure.in:95: -1- AH_OUTPUT([HAVE_SYS_INTTYPES_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_SYS_INTTYPES_H]) m4trace:configure.in:95: -1- AH_OUTPUT([HAVE_SYS_SOCKET_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_SYS_SOCKET_H]) m4trace:configure.in:95: -1- AH_OUTPUT([HAVE_SYS_TYPES_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_SYS_TYPES_H]) m4trace:configure.in:95: -1- AH_OUTPUT([HAVE_SYS_TIME_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_SYS_TIME_H]) m4trace:configure.in:95: -1- AH_OUTPUT([HAVE_SYS_TIMEB_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_SYS_TIMEB_H]) m4trace:configure.in:95: -1- AH_OUTPUT([HAVE_UNISTD_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_UNISTD_H]) m4trace:configure.in:95: -1- AH_OUTPUT([HAVE_POLL_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_POLL_H]) m4trace:configure.in:95: -1- AH_OUTPUT([HAVE_OPENSSL_SSL_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_OPENSSL_SSL_H]) m4trace:configure.in:95: -1- AH_OUTPUT([HAVE_GNUTLS_GNUTLS_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_GNUTLS_GNUTLS_H]) m4trace:configure.in:95: -1- AH_OUTPUT([HAVE_ZLIB_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_ZLIB_H]) m4trace:configure.in:95: -1- AH_OUTPUT([HAVE_SYS_TYPES_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_SYS_TYPES_H]) m4trace:configure.in:95: -1- AH_OUTPUT([HAVE_SYS_STAT_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_SYS_STAT_H]) m4trace:configure.in:95: -1- AH_OUTPUT([HAVE_STDLIB_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_STDLIB_H]) m4trace:configure.in:95: -1- AH_OUTPUT([HAVE_STRING_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_STRING_H]) m4trace:configure.in:95: -1- AH_OUTPUT([HAVE_MEMORY_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_MEMORY_H]) m4trace:configure.in:95: -1- AH_OUTPUT([HAVE_STRINGS_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_STRINGS_H]) m4trace:configure.in:95: -1- AH_OUTPUT([HAVE_INTTYPES_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_INTTYPES_H]) m4trace:configure.in:95: -1- AH_OUTPUT([HAVE_STDINT_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_STDINT_H]) m4trace:configure.in:95: -1- AH_OUTPUT([HAVE_UNISTD_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_UNISTD_H]) m4trace:configure.in:98: -1- AC_DEFINE_TRACE_LITERAL([const]) m4trace:configure.in:98: -1- m4_pattern_allow([^const$]) m4trace:configure.in:98: -1- AH_OUTPUT([const], [/* Define to empty if `const\' does not conform to ANSI C. */ @%:@undef const]) m4trace:configure.in:99: -1- AC_DEFINE_TRACE_LITERAL([size_t]) m4trace:configure.in:99: -1- m4_pattern_allow([^size_t$]) m4trace:configure.in:99: -1- AH_OUTPUT([size_t], [/* Define to `unsigned int\' if does not define. */ @%:@undef size_t]) m4trace:configure.in:100: -1- AC_DEFINE_TRACE_LITERAL([TIME_WITH_SYS_TIME]) m4trace:configure.in:100: -1- m4_pattern_allow([^TIME_WITH_SYS_TIME$]) m4trace:configure.in:100: -1- AH_OUTPUT([TIME_WITH_SYS_TIME], [/* Define to 1 if you can safely include both and . */ @%:@undef TIME_WITH_SYS_TIME]) m4trace:configure.in:101: -1- AC_DEFINE_TRACE_LITERAL([TM_IN_SYS_TIME]) m4trace:configure.in:101: -1- m4_pattern_allow([^TM_IN_SYS_TIME$]) m4trace:configure.in:101: -1- AH_OUTPUT([TM_IN_SYS_TIME], [/* Define to 1 if your declares `struct tm\'. */ @%:@undef TM_IN_SYS_TIME]) m4trace:configure.in:106: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRUCT_TM_TM_GMTOFF]) m4trace:configure.in:106: -1- m4_pattern_allow([^HAVE_STRUCT_TM_TM_GMTOFF$]) m4trace:configure.in:106: -1- AH_OUTPUT([HAVE_STRUCT_TM_TM_GMTOFF], [/* Define to 1 if `tm_gmtoff\' is a member of `struct tm\'. */ @%:@undef HAVE_STRUCT_TM_TM_GMTOFF]) m4trace:configure.in:106: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRUCT_TM___TM_GMTOFF]) m4trace:configure.in:106: -1- m4_pattern_allow([^HAVE_STRUCT_TM___TM_GMTOFF$]) m4trace:configure.in:106: -1- AH_OUTPUT([HAVE_STRUCT_TM___TM_GMTOFF], [/* Define to 1 if `__tm_gmtoff\' is a member of `struct tm\'. */ @%:@undef HAVE_STRUCT_TM___TM_GMTOFF]) m4trace:configure.in:109: -1- AH_OUTPUT([HAVE_SYS_TIME_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_SYS_TIME_H]) m4trace:configure.in:109: -1- AH_OUTPUT([HAVE_UNISTD_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_UNISTD_H]) m4trace:configure.in:109: -1- AH_OUTPUT([HAVE_ALARM], [/* Define to 1 if you have the `alarm\' function. */ @%:@undef HAVE_ALARM]) m4trace:configure.in:109: -1- AC_SUBST([LIB@&t@OBJS], ["$LIB@&t@OBJS mktime.$ac_objext"]) m4trace:configure.in:109: -1- AC_SUBST_TRACE([LIB@&t@OBJS]) m4trace:configure.in:109: -1- m4_pattern_allow([^LIB@&t@OBJS$]) m4trace:configure.in:109: -1- AC_LIBSOURCE([mktime.c]) m4trace:configure.in:110: -1- _m4_warn([obsolete], [The macro `AC_TYPE_SIGNAL' is obsolete. You should run autoupdate.], [../../lib/autoconf/types.m4:759: AC_TYPE_SIGNAL is expanded from... configure.in:110: the top level]) m4trace:configure.in:110: -1- AC_DEFINE_TRACE_LITERAL([RETSIGTYPE]) m4trace:configure.in:110: -1- m4_pattern_allow([^RETSIGTYPE$]) m4trace:configure.in:110: -1- AH_OUTPUT([RETSIGTYPE], [/* Define as the return type of signal handlers (`int\' or `void\'). */ @%:@undef RETSIGTYPE]) m4trace:configure.in:111: -1- AH_OUTPUT([HAVE_STRFTIME], [/* Define to 1 if you have the `strftime\' function. */ @%:@undef HAVE_STRFTIME]) m4trace:configure.in:111: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRFTIME]) m4trace:configure.in:111: -1- m4_pattern_allow([^HAVE_STRFTIME$]) m4trace:configure.in:111: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRFTIME]) m4trace:configure.in:111: -1- m4_pattern_allow([^HAVE_STRFTIME$]) m4trace:configure.in:112: -1- AH_OUTPUT([HAVE_RANDOM], [/* Define to 1 if you have the `random\' function. */ @%:@undef HAVE_RANDOM]) m4trace:configure.in:112: -1- AH_OUTPUT([HAVE_GETTIMEOFDAY], [/* Define to 1 if you have the `gettimeofday\' function. */ @%:@undef HAVE_GETTIMEOFDAY]) m4trace:configure.in:112: -1- AH_OUTPUT([HAVE_FTIME], [/* Define to 1 if you have the `ftime\' function. */ @%:@undef HAVE_FTIME]) m4trace:configure.in:112: -1- AH_OUTPUT([HAVE_LOCALTIME_R], [/* Define to 1 if you have the `localtime_r\' function. */ @%:@undef HAVE_LOCALTIME_R]) m4trace:configure.in:112: -1- AH_OUTPUT([HAVE_TIMEGM], [/* Define to 1 if you have the `timegm\' function. */ @%:@undef HAVE_TIMEGM]) m4trace:configure.in:112: -1- AH_OUTPUT([HAVE_GMTIME], [/* Define to 1 if you have the `gmtime\' function. */ @%:@undef HAVE_GMTIME]) m4trace:configure.in:112: -1- AH_OUTPUT([HAVE_GMTIME_R], [/* Define to 1 if you have the `gmtime_r\' function. */ @%:@undef HAVE_GMTIME_R]) m4trace:configure.in:112: -1- AH_OUTPUT([HAVE_MEMSET], [/* Define to 1 if you have the `memset\' function. */ @%:@undef HAVE_MEMSET]) m4trace:configure.in:112: -1- AH_OUTPUT([HAVE_SELECT], [/* Define to 1 if you have the `select\' function. */ @%:@undef HAVE_SELECT]) m4trace:configure.in:112: -1- AH_OUTPUT([HAVE_SOCKET], [/* Define to 1 if you have the `socket\' function. */ @%:@undef HAVE_SOCKET]) m4trace:configure.in:112: -1- AH_OUTPUT([HAVE_SNPRINTF], [/* Define to 1 if you have the `snprintf\' function. */ @%:@undef HAVE_SNPRINTF]) m4trace:configure.in:112: -1- AH_OUTPUT([HAVE_STRCHR], [/* Define to 1 if you have the `strchr\' function. */ @%:@undef HAVE_STRCHR]) m4trace:configure.in:112: -1- AH_OUTPUT([HAVE_STRERROR], [/* Define to 1 if you have the `strerror\' function. */ @%:@undef HAVE_STRERROR]) m4trace:configure.in:112: -1- AH_OUTPUT([HAVE_STRERROR_R], [/* Define to 1 if you have the `strerror_r\' function. */ @%:@undef HAVE_STRERROR_R]) m4trace:configure.in:112: -1- AH_OUTPUT([HAVE_STRRCHR], [/* Define to 1 if you have the `strrchr\' function. */ @%:@undef HAVE_STRRCHR]) m4trace:configure.in:112: -1- AH_OUTPUT([HAVE_STRSTR], [/* Define to 1 if you have the `strstr\' function. */ @%:@undef HAVE_STRSTR]) m4trace:configure.in:112: -1- AH_OUTPUT([HAVE_STRTOL], [/* Define to 1 if you have the `strtol\' function. */ @%:@undef HAVE_STRTOL]) m4trace:configure.in:112: -1- AH_OUTPUT([HAVE_STRTOUL], [/* Define to 1 if you have the `strtoul\' function. */ @%:@undef HAVE_STRTOUL]) m4trace:configure.in:112: -1- AH_OUTPUT([HAVE_STRTOLL], [/* Define to 1 if you have the `strtoll\' function. */ @%:@undef HAVE_STRTOLL]) m4trace:configure.in:112: -1- AH_OUTPUT([HAVE_STRTOULL], [/* Define to 1 if you have the `strtoull\' function. */ @%:@undef HAVE_STRTOULL]) m4trace:configure.in:112: -1- AH_OUTPUT([HAVE_STRTOLD], [/* Define to 1 if you have the `strtold\' function. */ @%:@undef HAVE_STRTOLD]) m4trace:configure.in:112: -1- AH_OUTPUT([HAVE_STRTOD], [/* Define to 1 if you have the `strtod\' function. */ @%:@undef HAVE_STRTOD]) m4trace:configure.in:112: -1- AH_OUTPUT([HAVE_STRTOF], [/* Define to 1 if you have the `strtof\' function. */ @%:@undef HAVE_STRTOF]) m4trace:configure.in:112: -1- AH_OUTPUT([HAVE_STRTOLD_L], [/* Define to 1 if you have the `strtold_l\' function. */ @%:@undef HAVE_STRTOLD_L]) m4trace:configure.in:112: -1- AH_OUTPUT([HAVE_STRTOD_L], [/* Define to 1 if you have the `strtod_l\' function. */ @%:@undef HAVE_STRTOD_L]) m4trace:configure.in:112: -1- AH_OUTPUT([HAVE_STRTOF_L], [/* Define to 1 if you have the `strtof_l\' function. */ @%:@undef HAVE_STRTOF_L]) m4trace:configure.in:112: -1- AH_OUTPUT([HAVE_SSCANF], [/* Define to 1 if you have the `sscanf\' function. */ @%:@undef HAVE_SSCANF]) m4trace:configure.in:112: -1- AH_OUTPUT([HAVE_SSCANF_L], [/* Define to 1 if you have the `sscanf_l\' function. */ @%:@undef HAVE_SSCANF_L]) m4trace:configure.in:112: -1- AH_OUTPUT([HAVE_SPRINTF_L], [/* Define to 1 if you have the `sprintf_l\' function. */ @%:@undef HAVE_SPRINTF_L]) m4trace:configure.in:112: -1- AH_OUTPUT([HAVE_WCTOMB], [/* Define to 1 if you have the `wctomb\' function. */ @%:@undef HAVE_WCTOMB]) m4trace:configure.in:112: -1- AH_OUTPUT([HAVE_MBTOWC], [/* Define to 1 if you have the `mbtowc\' function. */ @%:@undef HAVE_MBTOWC]) m4trace:configure.in:112: -1- AH_OUTPUT([HAVE_POLL], [/* Define to 1 if you have the `poll\' function. */ @%:@undef HAVE_POLL]) m4trace:configure.in:115: -1- AC_DEFINE_TRACE_LITERAL([HAVE_ISNAN]) m4trace:configure.in:115: -1- m4_pattern_allow([^HAVE_ISNAN$]) m4trace:configure.in:115: -1- AH_OUTPUT([HAVE_ISNAN], [/* isnan */ @%:@undef HAVE_ISNAN]) m4trace:configure.in:116: -1- AC_DEFINE_TRACE_LITERAL([HAVE_ISINF]) m4trace:configure.in:116: -1- m4_pattern_allow([^HAVE_ISINF$]) m4trace:configure.in:116: -1- AH_OUTPUT([HAVE_ISINF], [/* isinf */ @%:@undef HAVE_ISINF]) m4trace:configure.in:124: -1- AC_DEFINE_TRACE_LITERAL([HAVE_ISNAN]) m4trace:configure.in:124: -1- m4_pattern_allow([^HAVE_ISNAN$]) m4trace:configure.in:124: -1- AH_OUTPUT([HAVE_ISNAN], [/* isnan */ @%:@undef HAVE_ISNAN]) m4trace:configure.in:136: -1- AC_DEFINE_TRACE_LITERAL([HAVE_ISINF]) m4trace:configure.in:136: -1- m4_pattern_allow([^HAVE_ISINF$]) m4trace:configure.in:136: -1- AH_OUTPUT([HAVE_ISINF], [/* isinf */ @%:@undef HAVE_ISINF]) m4trace:configure.in:145: -1- AH_OUTPUT([HAVE_GETHOSTBYNAME_R], [/* Define to 1 if you have the `gethostbyname_r\' function. */ @%:@undef HAVE_GETHOSTBYNAME_R]) m4trace:configure.in:145: -1- AC_DEFINE_TRACE_LITERAL([HAVE_GETHOSTBYNAME_R]) m4trace:configure.in:145: -1- m4_pattern_allow([^HAVE_GETHOSTBYNAME_R$]) m4trace:configure.in:146: -1- AH_OUTPUT([HAVE_STDLIB_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_STDLIB_H]) m4trace:configure.in:146: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STDLIB_H]) m4trace:configure.in:146: -1- m4_pattern_allow([^HAVE_STDLIB_H$]) m4trace:configure.in:146: -1- AC_DEFINE_TRACE_LITERAL([HAVE_MALLOC]) m4trace:configure.in:146: -1- m4_pattern_allow([^HAVE_MALLOC$]) m4trace:configure.in:146: -1- AH_OUTPUT([HAVE_MALLOC], [/* Define to 1 if your system has a GNU libc compatible `malloc\' function, and to 0 otherwise. */ @%:@undef HAVE_MALLOC]) m4trace:configure.in:146: -1- AC_DEFINE_TRACE_LITERAL([HAVE_MALLOC]) m4trace:configure.in:146: -1- m4_pattern_allow([^HAVE_MALLOC$]) m4trace:configure.in:146: -1- AC_SUBST([LIB@&t@OBJS], ["$LIB@&t@OBJS malloc.$ac_objext"]) m4trace:configure.in:146: -1- AC_SUBST_TRACE([LIB@&t@OBJS]) m4trace:configure.in:146: -1- m4_pattern_allow([^LIB@&t@OBJS$]) m4trace:configure.in:146: -1- AC_LIBSOURCE([malloc.c]) m4trace:configure.in:146: -1- AC_DEFINE_TRACE_LITERAL([malloc]) m4trace:configure.in:146: -1- m4_pattern_allow([^malloc$]) m4trace:configure.in:146: -1- AH_OUTPUT([malloc], [/* Define to rpl_malloc if the replacement function should be used. */ @%:@undef malloc]) m4trace:configure.in:157: -1- AM_CONDITIONAL([DEBUG_COMPILE], [test x$debug = xtrue]) m4trace:configure.in:157: -1- AC_SUBST([DEBUG_COMPILE_TRUE]) m4trace:configure.in:157: -1- AC_SUBST_TRACE([DEBUG_COMPILE_TRUE]) m4trace:configure.in:157: -1- m4_pattern_allow([^DEBUG_COMPILE_TRUE$]) m4trace:configure.in:157: -1- AC_SUBST([DEBUG_COMPILE_FALSE]) m4trace:configure.in:157: -1- AC_SUBST_TRACE([DEBUG_COMPILE_FALSE]) m4trace:configure.in:157: -1- m4_pattern_allow([^DEBUG_COMPILE_FALSE$]) m4trace:configure.in:157: -1- _AM_SUBST_NOTMAKE([DEBUG_COMPILE_TRUE]) m4trace:configure.in:157: -1- _AM_SUBST_NOTMAKE([DEBUG_COMPILE_FALSE]) m4trace:configure.in:163: -1- AC_SUBST([SOAPCPP2_DEBUG]) m4trace:configure.in:163: -1- AC_SUBST_TRACE([SOAPCPP2_DEBUG]) m4trace:configure.in:163: -1- m4_pattern_allow([^SOAPCPP2_DEBUG$]) m4trace:configure.in:168: -1- AC_SUBST([SOAPCPP2_IMPORTPATH]) m4trace:configure.in:168: -1- AC_SUBST_TRACE([SOAPCPP2_IMPORTPATH]) m4trace:configure.in:168: -1- m4_pattern_allow([^SOAPCPP2_IMPORTPATH$]) m4trace:configure.in:173: -1- AC_SUBST([WSDL2H_IMPORTPATH]) m4trace:configure.in:173: -1- AC_SUBST_TRACE([WSDL2H_IMPORTPATH]) m4trace:configure.in:173: -1- m4_pattern_allow([^WSDL2H_IMPORTPATH$]) m4trace:configure.in:181: -1- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... ../../lib/autoconf/general.m4:1472: AC_ARG_ENABLE is expanded from... configure.in:181: the top level]) m4trace:configure.in:190: -1- AC_SUBST([SOAPCPP2_NONAMESPACES]) m4trace:configure.in:190: -1- AC_SUBST_TRACE([SOAPCPP2_NONAMESPACES]) m4trace:configure.in:190: -1- m4_pattern_allow([^SOAPCPP2_NONAMESPACES$]) m4trace:configure.in:198: -1- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... ../../lib/autoconf/general.m4:1472: AC_ARG_ENABLE is expanded from... configure.in:198: the top level]) m4trace:configure.in:207: -1- AC_SUBST([SOAPCPP2_IPV6]) m4trace:configure.in:207: -1- AC_SUBST_TRACE([SOAPCPP2_IPV6]) m4trace:configure.in:207: -1- m4_pattern_allow([^SOAPCPP2_IPV6$]) m4trace:configure.in:220: -1- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... ../../lib/autoconf/general.m4:1472: AC_ARG_ENABLE is expanded from... configure.in:220: the top level]) m4trace:configure.in:227: -1- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... ../../lib/autoconf/general.m4:1472: AC_ARG_ENABLE is expanded from... configure.in:227: the top level]) m4trace:configure.in:264: -1- AC_SUBST([WSDL2H_EXTRA_FLAGS]) m4trace:configure.in:264: -1- AC_SUBST_TRACE([WSDL2H_EXTRA_FLAGS]) m4trace:configure.in:264: -1- m4_pattern_allow([^WSDL2H_EXTRA_FLAGS$]) m4trace:configure.in:265: -1- AC_SUBST([WSDL2H_EXTRA_LIBS]) m4trace:configure.in:265: -1- AC_SUBST_TRACE([WSDL2H_EXTRA_LIBS]) m4trace:configure.in:265: -1- m4_pattern_allow([^WSDL2H_EXTRA_LIBS$]) m4trace:configure.in:266: -1- AC_SUBST([SAMPLE_INCLUDES]) m4trace:configure.in:266: -1- AC_SUBST_TRACE([SAMPLE_INCLUDES]) m4trace:configure.in:266: -1- m4_pattern_allow([^SAMPLE_INCLUDES$]) m4trace:configure.in:267: -1- AC_SUBST([SAMPLE_SSL_LIBS]) m4trace:configure.in:267: -1- AC_SUBST_TRACE([SAMPLE_SSL_LIBS]) m4trace:configure.in:267: -1- m4_pattern_allow([^SAMPLE_SSL_LIBS$]) m4trace:configure.in:268: -1- AC_SUBST([WSDL2H_SOAP_CPP_LIB]) m4trace:configure.in:268: -1- AC_SUBST_TRACE([WSDL2H_SOAP_CPP_LIB]) m4trace:configure.in:268: -1- m4_pattern_allow([^WSDL2H_SOAP_CPP_LIB$]) m4trace:configure.in:278: -1- AM_CONDITIONAL([ENABLE_SAMPLES], [test x$samples = xtrue]) m4trace:configure.in:278: -1- AC_SUBST([ENABLE_SAMPLES_TRUE]) m4trace:configure.in:278: -1- AC_SUBST_TRACE([ENABLE_SAMPLES_TRUE]) m4trace:configure.in:278: -1- m4_pattern_allow([^ENABLE_SAMPLES_TRUE$]) m4trace:configure.in:278: -1- AC_SUBST([ENABLE_SAMPLES_FALSE]) m4trace:configure.in:278: -1- AC_SUBST_TRACE([ENABLE_SAMPLES_FALSE]) m4trace:configure.in:278: -1- m4_pattern_allow([^ENABLE_SAMPLES_FALSE$]) m4trace:configure.in:278: -1- _AM_SUBST_NOTMAKE([ENABLE_SAMPLES_TRUE]) m4trace:configure.in:278: -1- _AM_SUBST_NOTMAKE([ENABLE_SAMPLES_FALSE]) m4trace:configure.in:279: -1- AC_SUBST([ENABLE_SAMPLES]) m4trace:configure.in:279: -1- AC_SUBST_TRACE([ENABLE_SAMPLES]) m4trace:configure.in:279: -1- m4_pattern_allow([^ENABLE_SAMPLES$]) m4trace:configure.in:286: -1- AC_SUBST([SAMPLE_DIRS]) m4trace:configure.in:286: -1- AC_SUBST_TRACE([SAMPLE_DIRS]) m4trace:configure.in:286: -1- m4_pattern_allow([^SAMPLE_DIRS$]) m4trace:configure.in:296: -1- AC_SUBST([LEX_DEFINE]) m4trace:configure.in:296: -1- AC_SUBST_TRACE([LEX_DEFINE]) m4trace:configure.in:296: -1- m4_pattern_allow([^LEX_DEFINE$]) m4trace:configure.in:297: -1- AC_SUBST([LEX_FLAGS]) m4trace:configure.in:297: -1- AC_SUBST_TRACE([LEX_FLAGS]) m4trace:configure.in:297: -1- m4_pattern_allow([^LEX_FLAGS$]) m4trace:configure.in:298: -1- AC_SUBST([LEXLIB]) m4trace:configure.in:298: -1- AC_SUBST_TRACE([LEXLIB]) m4trace:configure.in:298: -1- m4_pattern_allow([^LEXLIB$]) m4trace:configure.in:308: -1- AC_SUBST([BISON_DEFINE]) m4trace:configure.in:308: -1- AC_SUBST_TRACE([BISON_DEFINE]) m4trace:configure.in:308: -1- m4_pattern_allow([^BISON_DEFINE$]) m4trace:configure.in:309: -1- AC_SUBST([YACC_LIB]) m4trace:configure.in:309: -1- AC_SUBST_TRACE([YACC_LIB]) m4trace:configure.in:309: -1- m4_pattern_allow([^YACC_LIB$]) m4trace:configure.in:353: -1- AC_CONFIG_FILES([ Makefile \ gsoap.pc gsoap++.pc gsoapck.pc gsoapck++.pc gsoapssl.pc gsoapssl++.pc \ gsoap/Makefile \ gsoap/src/Makefile \ gsoap/wsdl/Makefile \ gsoap/samples/Makefile \ gsoap/samples/autotest/Makefile \ gsoap/samples/calc/Makefile \ gsoap/samples/calc++/Makefile \ gsoap/samples/chaining/Makefile \ gsoap/samples/chaining++/Makefile \ gsoap/samples/databinding/Makefile \ gsoap/samples/dime/Makefile \ gsoap/samples/dom/Makefile \ gsoap/samples/oneway/Makefile \ gsoap/samples/oneway++/Makefile \ gsoap/samples/factory/Makefile \ gsoap/samples/factorytest/Makefile \ gsoap/samples/gmt/Makefile \ gsoap/samples/googleapi/Makefile \ gsoap/samples/hello/Makefile \ gsoap/samples/httpcookies/Makefile \ gsoap/samples/lu/Makefile \ gsoap/samples/magic/Makefile \ gsoap/samples/mashup/Makefile \ gsoap/samples/mashup++/Makefile \ gsoap/samples/mtom/Makefile \ gsoap/samples/mtom-stream/Makefile \ gsoap/samples/polytest/Makefile \ gsoap/samples/primes/Makefile \ gsoap/samples/roll/Makefile \ gsoap/samples/router/Makefile \ gsoap/samples/rss/Makefile \ gsoap/samples/ssl/Makefile \ gsoap/samples/template/Makefile \ gsoap/samples/udp/Makefile \ gsoap/samples/varparam/Makefile \ gsoap/samples/wsa/Makefile \ gsoap/samples/wsrm/Makefile \ gsoap/samples/wsse/Makefile \ gsoap/samples/xml-rpc-json/Makefile gsoap/samples/rest/Makefile ]) m4trace:configure.in:354: -1- AC_SUBST([LIB@&t@OBJS], [$ac_libobjs]) m4trace:configure.in:354: -1- AC_SUBST_TRACE([LIB@&t@OBJS]) m4trace:configure.in:354: -1- m4_pattern_allow([^LIB@&t@OBJS$]) m4trace:configure.in:354: -1- AC_SUBST([LTLIBOBJS], [$ac_ltlibobjs]) m4trace:configure.in:354: -1- AC_SUBST_TRACE([LTLIBOBJS]) m4trace:configure.in:354: -1- m4_pattern_allow([^LTLIBOBJS$]) m4trace:configure.in:354: -1- AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"]) m4trace:configure.in:354: -1- AC_SUBST([am__EXEEXT_TRUE]) m4trace:configure.in:354: -1- AC_SUBST_TRACE([am__EXEEXT_TRUE]) m4trace:configure.in:354: -1- m4_pattern_allow([^am__EXEEXT_TRUE$]) m4trace:configure.in:354: -1- AC_SUBST([am__EXEEXT_FALSE]) m4trace:configure.in:354: -1- AC_SUBST_TRACE([am__EXEEXT_FALSE]) m4trace:configure.in:354: -1- m4_pattern_allow([^am__EXEEXT_FALSE$]) m4trace:configure.in:354: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_TRUE]) m4trace:configure.in:354: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_FALSE]) m4trace:configure.in:354: -1- AC_SUBST_TRACE([top_builddir]) m4trace:configure.in:354: -1- AC_SUBST_TRACE([top_build_prefix]) m4trace:configure.in:354: -1- AC_SUBST_TRACE([srcdir]) m4trace:configure.in:354: -1- AC_SUBST_TRACE([abs_srcdir]) m4trace:configure.in:354: -1- AC_SUBST_TRACE([top_srcdir]) m4trace:configure.in:354: -1- AC_SUBST_TRACE([abs_top_srcdir]) m4trace:configure.in:354: -1- AC_SUBST_TRACE([builddir]) m4trace:configure.in:354: -1- AC_SUBST_TRACE([abs_builddir]) m4trace:configure.in:354: -1- AC_SUBST_TRACE([abs_top_builddir]) m4trace:configure.in:354: -1- AC_SUBST_TRACE([INSTALL]) m4trace:configure.in:354: -1- AC_SUBST_TRACE([MKDIR_P]) gsoap-2.8.28/autom4te.cache/output.00000644000175000017500000070172312653650144016531 0ustar ellertellert@%:@! /bin/sh @%:@ Guess values for system-dependent variables and create Makefiles. @%:@ Generated by GNU Autoconf 2.69 for gsoap 2.8. @%:@ @%:@ @%:@ Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. @%:@ @%:@ @%:@ This configure script is free software; the Free Software Foundation @%:@ gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in @%:@( *posix*) : set -o posix ;; @%:@( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in @%:@( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in @%:@(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in @%:@ (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in @%:@( *posix*) : set -o posix ;; @%:@( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in @%:@( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in @%:@ (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## @%:@ as_fn_unset VAR @%:@ --------------- @%:@ Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset @%:@ as_fn_set_status STATUS @%:@ ----------------------- @%:@ Set @S|@? to STATUS, without forking. as_fn_set_status () { return $1 } @%:@ as_fn_set_status @%:@ as_fn_exit STATUS @%:@ ----------------- @%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } @%:@ as_fn_exit @%:@ as_fn_mkdir_p @%:@ ------------- @%:@ Create "@S|@as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } @%:@ as_fn_mkdir_p @%:@ as_fn_executable_p FILE @%:@ ----------------------- @%:@ Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } @%:@ as_fn_executable_p @%:@ as_fn_append VAR VALUE @%:@ ---------------------- @%:@ Append the text in VALUE to the end of the definition contained in VAR. Take @%:@ advantage of any shell optimizations that allow amortized linear growth over @%:@ repeated appends, instead of the typical quadratic growth present in naive @%:@ implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append @%:@ as_fn_arith ARG... @%:@ ------------------ @%:@ Perform arithmetic evaluation on the ARGs, and store the result in the @%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments @%:@ must be portable across @S|@(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith @%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] @%:@ ---------------------------------------- @%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are @%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the @%:@ script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } @%:@ as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in @%:@((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIB@&t@OBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='gsoap' PACKAGE_TARNAME='gsoap' PACKAGE_VERSION='2.8' PACKAGE_STRING='gsoap 2.8' PACKAGE_BUGREPORT='' PACKAGE_URL='' ac_unique_file="gsoap/stdsoap2.cpp" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_header_list= ac_func_list= ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS YACC_LIB BISON_DEFINE LEX_FLAGS LEX_DEFINE SAMPLE_DIRS ENABLE_SAMPLES ENABLE_SAMPLES_FALSE ENABLE_SAMPLES_TRUE WSDL2H_SOAP_CPP_LIB SAMPLE_SSL_LIBS SAMPLE_INCLUDES WSDL2H_EXTRA_LIBS WSDL2H_EXTRA_FLAGS SOAPCPP2_IPV6 SOAPCPP2_NONAMESPACES WSDL2H_IMPORTPATH SOAPCPP2_IMPORTPATH SOAPCPP2_DEBUG DEBUG_COMPILE_FALSE DEBUG_COMPILE_TRUE LIB@&t@OBJS EGREP GREP platform SAMPLE_EXTRA_LIBS LN_S RANLIB CPP YFLAGS YACC LEXLIB LEX_OUTPUT_ROOT LEX am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE ac_ct_CC CFLAGS CC am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CXX CPPFLAGS LDFLAGS CXXFLAGS CXX host_os host_vendor host_cpu host build_os build_vendor build_cpu build AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_silent_rules enable_dependency_tracking enable_debug enable_namespaces enable_ipv6 with_openssl enable_ssl enable_gnutls enable_samples ' ac_precious_vars='build_alias host_alias target_alias CXX CXXFLAGS LDFLAGS LIBS CPPFLAGS CCC CC CFLAGS YACC YFLAGS CPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures gsoap 2.8 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX @<:@@S|@ac_default_prefix@:>@ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX @<:@PREFIX@:>@ By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root @<:@DATAROOTDIR/doc/gsoap@:>@ --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of gsoap 2.8:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") --enable-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build --enable-debug add debug symbols for debugging --disable-namespaces compile library without namespaces --enable-ipv6 compile library with IPv6 support --disable-ssl build without SSL/TLS --enable-gnutls build with GNUTLS SSL/TLS --enable-samples enable compile for the gsoap samples Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-openssl=DIR openssl installation prefix Some influential environment variables: CXX C++ compiler command CXXFLAGS C++ compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CC C compiler command CFLAGS C compiler flags YACC The `Yet Another Compiler Compiler' implementation to use. Defaults to the first program found out of: `bison -y', `byacc', `yacc'. YFLAGS The list of arguments that will be passed by default to @S|@YACC. This script will default YFLAGS to the empty string to avoid a default value of `-d' given by some make applications. CPP C preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF gsoap configure 2.8 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## @%:@ ac_fn_cxx_try_compile LINENO @%:@ ---------------------------- @%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } @%:@ ac_fn_cxx_try_compile @%:@ ac_fn_c_try_compile LINENO @%:@ -------------------------- @%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } @%:@ ac_fn_c_try_compile @%:@ ac_fn_c_try_link LINENO @%:@ ----------------------- @%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } @%:@ ac_fn_c_try_link @%:@ ac_fn_c_try_cpp LINENO @%:@ ---------------------- @%:@ Try to preprocess conftest.@S|@ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } @%:@ ac_fn_c_try_cpp @%:@ ac_fn_c_try_run LINENO @%:@ ---------------------- @%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. Assumes @%:@ that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } @%:@ ac_fn_c_try_run @%:@ ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES @%:@ ------------------------------------------------------- @%:@ Tests whether HEADER exists, giving a warning if it cannot be compiled using @%:@ the include files in INCLUDES and setting the cache variable VAR @%:@ accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 @%:@include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } @%:@ ac_fn_c_check_header_mongrel @%:@ ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES @%:@ ------------------------------------------------------- @%:@ Tests whether HEADER exists and can be compiled using the include files in @%:@ INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 @%:@include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } @%:@ ac_fn_c_check_header_compile @%:@ ac_fn_c_check_type LINENO TYPE VAR INCLUDES @%:@ ------------------------------------------- @%:@ Tests whether TYPE exists after having included INCLUDES, setting cache @%:@ variable VAR accordingly. ac_fn_c_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof ($2)) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else eval "$3=yes" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } @%:@ ac_fn_c_check_type @%:@ ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES @%:@ ---------------------------------------------------- @%:@ Tries to find if the field MEMBER exists in type AGGR, after including @%:@ INCLUDES, setting cache variable VAR accordingly. ac_fn_c_check_member () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5 $as_echo_n "checking for $2.$3... " >&6; } if eval \${$4+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main () { static $2 ac_aggr; if (ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$4=yes" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main () { static $2 ac_aggr; if (sizeof ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$4=yes" else eval "$4=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$4 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } @%:@ ac_fn_c_check_member @%:@ ac_fn_c_check_func LINENO FUNC VAR @%:@ ---------------------------------- @%:@ Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } @%:@ ac_fn_c_check_func cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by gsoap $as_me 2.8, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in @%:@(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi as_fn_append ac_header_list " sys/time.h" as_fn_append ac_header_list " unistd.h" as_fn_append ac_func_list " alarm" # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu am__api_version='1.14' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in @%:@(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null @%:@ Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='gsoap' VERSION='2.8' cat >>confdefs.h <<_ACEOF @%:@define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar pax cpio none' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 fi fi # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac # AC_CONFIG_HEADERS([config.h]) ac_config_headers="$ac_config_headers config.h" # we use subdirs. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi # Checks for programs. ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler works" >&5 $as_echo_n "checking whether the C++ compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C++ compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler default output file name" >&5 $as_echo_n "checking for C++ compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C++ compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf @%:@ Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi depcc="$CXX" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CXX_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 $as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $@%:@ != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 $as_echo_n "checking whether $CC understands -c and -o together... " >&6; } if ${am_cv_prog_cc_c_o+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 $as_echo "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi for ac_prog in flex lex do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_LEX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$LEX"; then ac_cv_prog_LEX="$LEX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_LEX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi LEX=$ac_cv_prog_LEX if test -n "$LEX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LEX" >&5 $as_echo "$LEX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$LEX" && break done test -n "$LEX" || LEX=":" if test "x$LEX" != "x:"; then cat >conftest.l <<_ACEOF %% a { ECHO; } b { REJECT; } c { yymore (); } d { yyless (1); } e { /* IRIX 6.5 flex 2.5.4 underquotes its yyless argument. */ yyless ((input () != 0)); } f { unput (yytext[0]); } . { BEGIN INITIAL; } %% #ifdef YYTEXT_POINTER extern char *yytext; #endif int main (void) { return ! yylex () + ! yywrap (); } _ACEOF { { ac_try="$LEX conftest.l" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$LEX conftest.l") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking lex output file root" >&5 $as_echo_n "checking lex output file root... " >&6; } if ${ac_cv_prog_lex_root+:} false; then : $as_echo_n "(cached) " >&6 else if test -f lex.yy.c; then ac_cv_prog_lex_root=lex.yy elif test -f lexyy.c; then ac_cv_prog_lex_root=lexyy else as_fn_error $? "cannot find output from $LEX; giving up" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_root" >&5 $as_echo "$ac_cv_prog_lex_root" >&6; } LEX_OUTPUT_ROOT=$ac_cv_prog_lex_root if test -z "${LEXLIB+set}"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking lex library" >&5 $as_echo_n "checking lex library... " >&6; } if ${ac_cv_lib_lex+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_LIBS=$LIBS ac_cv_lib_lex='none needed' for ac_lib in '' -lfl -ll; do LIBS="$ac_lib $ac_save_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ `cat $LEX_OUTPUT_ROOT.c` _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_lex=$ac_lib fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext test "$ac_cv_lib_lex" != 'none needed' && break done LIBS=$ac_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lex" >&5 $as_echo "$ac_cv_lib_lex" >&6; } test "$ac_cv_lib_lex" != 'none needed' && LEXLIB=$ac_cv_lib_lex fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether yytext is a pointer" >&5 $as_echo_n "checking whether yytext is a pointer... " >&6; } if ${ac_cv_prog_lex_yytext_pointer+:} false; then : $as_echo_n "(cached) " >&6 else # POSIX says lex can declare yytext either as a pointer or an array; the # default is implementation-dependent. Figure out which it is, since # not all implementations provide the %pointer and %array declarations. ac_cv_prog_lex_yytext_pointer=no ac_save_LIBS=$LIBS LIBS="$LEXLIB $ac_save_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define YYTEXT_POINTER 1 `cat $LEX_OUTPUT_ROOT.c` _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_prog_lex_yytext_pointer=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_yytext_pointer" >&5 $as_echo "$ac_cv_prog_lex_yytext_pointer" >&6; } if test $ac_cv_prog_lex_yytext_pointer = yes; then $as_echo "@%:@define YYTEXT_POINTER 1" >>confdefs.h fi rm -f conftest.l $LEX_OUTPUT_ROOT.c fi if test "$LEX" = :; then LEX=${am_missing_run}flex fi for ac_prog in 'bison -y' byacc do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_YACC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$YACC"; then ac_cv_prog_YACC="$YACC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_YACC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi YACC=$ac_cv_prog_YACC if test -n "$YACC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $YACC" >&5 $as_echo "$YACC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$YACC" && break done test -n "$YACC" || YACC="yacc" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@ifdef __STDC__ @%:@ include @%:@else @%:@ include @%:@endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@ifdef __STDC__ @%:@ include @%:@else @%:@ include @%:@endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi #AM_PROG_LIBTOOL { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 $as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 $as_echo "no, using $LN_S" >&6; } fi for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done # AC_DECL_YYTEXT SAMPLE_EXTRA_LIBS="-lm" # Platform-specific Makefile setup case "${host}" in *-*-solaris*) platform=SUN_OS SAMPLE_EXTRA_LIBS="-lxnet -lsocket -lnsl -lm" WSDL2H_EXTRA_LIBS="-lssl -lcrypto -lz -lsocket -lxnet -lnsl -lrt" ;; *-*-sysv5*) platform=UNIXWARE ;; *-*-UnixWare*) platform=UNIXWARE ;; *-*-unixware*) platform=UNIXWARE ;; *-*-sco3.2v5*) platform=OPENSERVER SAMPLE_EXTRA_LIBS="-lsocket -lm" ;; *-*-linux*) platform=LINUX # if test x$debug = xtrue; then # CFLAGS="-g" #don't want the -O2 for debugging. # else # CFLAGS="-O2" #don't want the -g for release compile. # fi ;; *-*-cygwin*) platform=CYGWIN ;; *-*-mingw*) platform=MINGW SAMPLE_EXTRA_LIBS="-lws2_32 -lkernel32 -luser32 -lgdi32 -lm" WSDL2H_EXTRA_LIBS="-lssl -lcrypto -lws2_32 -lkernel32 -luser32 -lgdi32 -lm" ;; *-*-freebsd*) platform=FREEBSD ;; *-*-openbsd*) platform=OPENBSD ;; *-*-irix*) platform=IRIX ;; *-*-aix*) platform=AIX case "${host}" in *-*-aix4.1*) osver=AIX41;; *-*-aix4.2*) osver=AIX42;; *-*-aix4.3*) osver=AIX43;; *-*-aix4.*) osver=AIX43;; *-*-aix5.2) osver=AIX52;; *-*-aix5.3) osver=AIX53;; *-*-aix6.1) osver=AIX61;; esac ;; *-sequent-*) platform=PTX ;; *-*-hp*) platform=HP_UX ; case "${host}" in *-*-hpux11*) osver=HPUX11;; *-*-hpux10*) osver=HPUX10;; *) osver=HPUX11;; esac ;; *-*-mvs*) platform=OS390 ;; *-*-os400*) platform=OS400 ;; *-*-OS400*) platform=OS400 ;; *-*-osf*) platform=TRU64 ;; *-apple-*) platform=MACOSX # Appease 10.7 Lion (OpenSSL deprecated) CXXFLAGS="-Wno-deprecated-declarations" CFLAGS="-Wno-deprecated-declarations" ;; *-nto-qnx) platform=QNX SAMPLE_EXTRA_LIBS="-lsocket -lm" ;; *) platform=UNKNOWN ;; esac # Checks for header files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "@%:@define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF @%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in arpa/inet.h xlocale.h errno.h fcntl.h limits.h netdb.h netinet/in.h stdlib.h string.h strings.h stdint.h inttypes.h time.h sys/inttypes.h sys/socket.h sys/types.h sys/time.h sys/timeb.h unistd.h poll.h openssl/ssl.h gnutls/gnutls.h zlib.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF @%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done # Checks for typedefs, structures, and compiler characteristics. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 $as_echo_n "checking for an ANSI C-conforming const... " >&6; } if ${ac_cv_c_const+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __cplusplus /* Ultrix mips cc rejects this sort of thing. */ typedef int charset[2]; const charset cs = { 0, 0 }; /* SunOS 4.1.1 cc rejects this. */ char const *const *pcpcc; char **ppc; /* NEC SVR4.0.2 mips cc rejects this. */ struct point {int x, y;}; static struct point const zero = {0,0}; /* AIX XL C 1.02.0.0 rejects this. It does not let you subtract one const X* pointer from another in an arm of an if-expression whose if-part is not a constant expression */ const char *g = "string"; pcpcc = &g + (g ? g-g : 0); /* HPUX 7.0 cc rejects these. */ ++pcpcc; ppc = (char**) pcpcc; pcpcc = (char const *const *) ppc; { /* SCO 3.2v4 cc rejects this sort of thing. */ char tx; char *t = &tx; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; if (s) return 0; } { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ int x[] = {25, 17}; const int *foo = &x[0]; ++foo; } { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ typedef const int *iptr; iptr p = 0; ++p; } { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ struct s { int j; const int *ap[3]; } bx; struct s *b = &bx; b->j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; if (!foo) return 0; } return !cs[0] && !zero.x; #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_const=yes else ac_cv_c_const=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 $as_echo "$ac_cv_c_const" >&6; } if test $ac_cv_c_const = no; then $as_echo "@%:@define const /**/" >>confdefs.h fi ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" if test "x$ac_cv_type_size_t" = xyes; then : else cat >>confdefs.h <<_ACEOF @%:@define size_t unsigned int _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5 $as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; } if ${ac_cv_header_time+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { if ((struct tm *) 0) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_time=yes else ac_cv_header_time=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5 $as_echo "$ac_cv_header_time" >&6; } if test $ac_cv_header_time = yes; then $as_echo "@%:@define TIME_WITH_SYS_TIME 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether struct tm is in sys/time.h or time.h" >&5 $as_echo_n "checking whether struct tm is in sys/time.h or time.h... " >&6; } if ${ac_cv_struct_tm+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { struct tm tm; int *p = &tm.tm_sec; return !p; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_struct_tm=time.h else ac_cv_struct_tm=sys/time.h fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_struct_tm" >&5 $as_echo "$ac_cv_struct_tm" >&6; } if test $ac_cv_struct_tm = sys/time.h; then $as_echo "@%:@define TM_IN_SYS_TIME 1" >>confdefs.h fi ac_fn_c_check_member "$LINENO" "struct tm" "tm_gmtoff" "ac_cv_member_struct_tm_tm_gmtoff" " #include #include " if test "x$ac_cv_member_struct_tm_tm_gmtoff" = xyes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_STRUCT_TM_TM_GMTOFF 1 _ACEOF fi ac_fn_c_check_member "$LINENO" "struct tm" "__tm_gmtoff" "ac_cv_member_struct_tm___tm_gmtoff" " #include #include " if test "x$ac_cv_member_struct_tm___tm_gmtoff" = xyes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_STRUCT_TM___TM_GMTOFF 1 _ACEOF fi # Checks for library functions. for ac_header in $ac_header_list do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF @%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in $ac_func_list do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF @%:@define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working mktime" >&5 $as_echo_n "checking for working mktime... " >&6; } if ${ac_cv_func_working_mktime+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_working_mktime=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Test program from Paul Eggert and Tony Leneis. */ #ifdef TIME_WITH_SYS_TIME # include # include #else # ifdef HAVE_SYS_TIME_H # include # else # include # endif #endif #include #include #ifdef HAVE_UNISTD_H # include #endif #ifndef HAVE_ALARM # define alarm(X) /* empty */ #endif /* Work around redefinition to rpl_putenv by other config tests. */ #undef putenv static time_t time_t_max; static time_t time_t_min; /* Values we'll use to set the TZ environment variable. */ static const char *tz_strings[] = { (const char *) 0, "TZ=GMT0", "TZ=JST-9", "TZ=EST+3EDT+2,M10.1.0/00:00:00,M2.3.0/00:00:00" }; #define N_STRINGS (sizeof (tz_strings) / sizeof (tz_strings[0])) /* Return 0 if mktime fails to convert a date in the spring-forward gap. Based on a problem report from Andreas Jaeger. */ static int spring_forward_gap () { /* glibc (up to about 1998-10-07) failed this test. */ struct tm tm; /* Use the portable POSIX.1 specification "TZ=PST8PDT,M4.1.0,M10.5.0" instead of "TZ=America/Vancouver" in order to detect the bug even on systems that don't support the Olson extension, or don't have the full zoneinfo tables installed. */ putenv ((char*) "TZ=PST8PDT,M4.1.0,M10.5.0"); tm.tm_year = 98; tm.tm_mon = 3; tm.tm_mday = 5; tm.tm_hour = 2; tm.tm_min = 0; tm.tm_sec = 0; tm.tm_isdst = -1; return mktime (&tm) != (time_t) -1; } static int mktime_test1 (time_t now) { struct tm *lt; return ! (lt = localtime (&now)) || mktime (lt) == now; } static int mktime_test (time_t now) { return (mktime_test1 (now) && mktime_test1 ((time_t) (time_t_max - now)) && mktime_test1 ((time_t) (time_t_min + now))); } static int irix_6_4_bug () { /* Based on code from Ariel Faigon. */ struct tm tm; tm.tm_year = 96; tm.tm_mon = 3; tm.tm_mday = 0; tm.tm_hour = 0; tm.tm_min = 0; tm.tm_sec = 0; tm.tm_isdst = -1; mktime (&tm); return tm.tm_mon == 2 && tm.tm_mday == 31; } static int bigtime_test (int j) { struct tm tm; time_t now; tm.tm_year = tm.tm_mon = tm.tm_mday = tm.tm_hour = tm.tm_min = tm.tm_sec = j; now = mktime (&tm); if (now != (time_t) -1) { struct tm *lt = localtime (&now); if (! (lt && lt->tm_year == tm.tm_year && lt->tm_mon == tm.tm_mon && lt->tm_mday == tm.tm_mday && lt->tm_hour == tm.tm_hour && lt->tm_min == tm.tm_min && lt->tm_sec == tm.tm_sec && lt->tm_yday == tm.tm_yday && lt->tm_wday == tm.tm_wday && ((lt->tm_isdst < 0 ? -1 : 0 < lt->tm_isdst) == (tm.tm_isdst < 0 ? -1 : 0 < tm.tm_isdst)))) return 0; } return 1; } static int year_2050_test () { /* The correct answer for 2050-02-01 00:00:00 in Pacific time, ignoring leap seconds. */ unsigned long int answer = 2527315200UL; struct tm tm; time_t t; tm.tm_year = 2050 - 1900; tm.tm_mon = 2 - 1; tm.tm_mday = 1; tm.tm_hour = tm.tm_min = tm.tm_sec = 0; tm.tm_isdst = -1; /* Use the portable POSIX.1 specification "TZ=PST8PDT,M4.1.0,M10.5.0" instead of "TZ=America/Vancouver" in order to detect the bug even on systems that don't support the Olson extension, or don't have the full zoneinfo tables installed. */ putenv ((char*) "TZ=PST8PDT,M4.1.0,M10.5.0"); t = mktime (&tm); /* Check that the result is either a failure, or close enough to the correct answer that we can assume the discrepancy is due to leap seconds. */ return (t == (time_t) -1 || (0 < t && answer - 120 <= t && t <= answer + 120)); } int main () { time_t t, delta; int i, j; /* This test makes some buggy mktime implementations loop. Give up after 60 seconds; a mktime slower than that isn't worth using anyway. */ alarm (60); for (;;) { t = (time_t_max << 1) + 1; if (t <= time_t_max) break; time_t_max = t; } time_t_min = - ((time_t) ~ (time_t) 0 == (time_t) -1) - time_t_max; delta = time_t_max / 997; /* a suitable prime number */ for (i = 0; i < N_STRINGS; i++) { if (tz_strings[i]) putenv ((char*) tz_strings[i]); for (t = 0; t <= time_t_max - delta; t += delta) if (! mktime_test (t)) return 1; if (! (mktime_test ((time_t) 1) && mktime_test ((time_t) (60 * 60)) && mktime_test ((time_t) (60 * 60 * 24)))) return 1; for (j = 1; ; j <<= 1) if (! bigtime_test (j)) return 1; else if (INT_MAX / 2 < j) break; if (! bigtime_test (INT_MAX)) return 1; } return ! (irix_6_4_bug () && spring_forward_gap () && year_2050_test ()); } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_working_mktime=yes else ac_cv_func_working_mktime=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_working_mktime" >&5 $as_echo "$ac_cv_func_working_mktime" >&6; } if test $ac_cv_func_working_mktime = no; then case " $LIB@&t@OBJS " in *" mktime.$ac_objext "* ) ;; *) LIB@&t@OBJS="$LIB@&t@OBJS mktime.$ac_objext" ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking return type of signal handlers" >&5 $as_echo_n "checking return type of signal handlers... " >&6; } if ${ac_cv_type_signal+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { return *(signal (0, 0)) (0) == 1; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_type_signal=int else ac_cv_type_signal=void fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_signal" >&5 $as_echo "$ac_cv_type_signal" >&6; } cat >>confdefs.h <<_ACEOF @%:@define RETSIGTYPE $ac_cv_type_signal _ACEOF for ac_func in strftime do : ac_fn_c_check_func "$LINENO" "strftime" "ac_cv_func_strftime" if test "x$ac_cv_func_strftime" = xyes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_STRFTIME 1 _ACEOF else # strftime is in -lintl on SCO UNIX. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for strftime in -lintl" >&5 $as_echo_n "checking for strftime in -lintl... " >&6; } if ${ac_cv_lib_intl_strftime+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char strftime (); int main () { return strftime (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_strftime=yes else ac_cv_lib_intl_strftime=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_strftime" >&5 $as_echo "$ac_cv_lib_intl_strftime" >&6; } if test "x$ac_cv_lib_intl_strftime" = xyes; then : $as_echo "@%:@define HAVE_STRFTIME 1" >>confdefs.h LIBS="-lintl $LIBS" fi fi done for ac_func in random gettimeofday ftime localtime_r timegm gmtime gmtime_r memset select socket snprintf strchr strerror strerror_r strrchr strstr strtol strtoul strtoll strtoull strtold strtod strtof strtold_l strtod_l strtof_l sscanf sscanf_l sprintf_l wctomb mbtowc poll do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF @%:@define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done # Checks for isnan and isinf ac_fn_c_check_func "$LINENO" "isnan" "ac_cv_func_isnan" if test "x$ac_cv_func_isnan" = xyes; then : has_isnan=1; $as_echo "@%:@define HAVE_ISNAN 1" >>confdefs.h else has_isnan=0 fi ac_fn_c_check_func "$LINENO" "isinf" "ac_cv_func_isinf" if test "x$ac_cv_func_isinf" = xyes; then : has_isinf=1; $as_echo "@%:@define HAVE_ISINF 1" >>confdefs.h else has_isinf=0 fi # check for macro isnan in math if test $has_isnan = 0; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for macro isnan" >&5 $as_echo_n "checking for macro isnan... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { { int foo; foo = isnan(0); } ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : has_isnan=1 else has_isnan=0 fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test $has_isnan = 1; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "@%:@define HAVE_ISNAN 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi # check for macro isinf in math if test $has_isinf = 0; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for macro isinf" >&5 $as_echo_n "checking for macro isinf... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { { int foo; foo = isinf(0); } ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : has_isinf=1 else has_isinf=0 fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test $has_isinf = 1; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "@%:@define HAVE_ISINF 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi # Function test depending on platform # AIX Has incompatible gethostbyname_r if test $platform != AIX -a $platform != TRU64; then for ac_func in gethostbyname_r do : ac_fn_c_check_func "$LINENO" "gethostbyname_r" "ac_cv_func_gethostbyname_r" if test "x$ac_cv_func_gethostbyname_r" = xyes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_GETHOSTBYNAME_R 1 _ACEOF fi done for ac_header in stdlib.h do : ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" if test "x$ac_cv_header_stdlib_h" = xyes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_STDLIB_H 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU libc compatible malloc" >&5 $as_echo_n "checking for GNU libc compatible malloc... " >&6; } if ${ac_cv_func_malloc_0_nonnull+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_malloc_0_nonnull=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined STDC_HEADERS || defined HAVE_STDLIB_H # include #else char *malloc (); #endif int main () { return ! malloc (0); ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_malloc_0_nonnull=yes else ac_cv_func_malloc_0_nonnull=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_malloc_0_nonnull" >&5 $as_echo "$ac_cv_func_malloc_0_nonnull" >&6; } if test $ac_cv_func_malloc_0_nonnull = yes; then : $as_echo "@%:@define HAVE_MALLOC 1" >>confdefs.h else $as_echo "@%:@define HAVE_MALLOC 0" >>confdefs.h case " $LIB@&t@OBJS " in *" malloc.$ac_objext "* ) ;; *) LIB@&t@OBJS="$LIB@&t@OBJS malloc.$ac_objext" ;; esac $as_echo "@%:@define malloc rpl_malloc" >>confdefs.h fi fi # the debug build options adds symbols to compiler output (-g for g++) @%:@ Check whether --enable-debug was given. if test "${enable_debug+set}" = set; then : enableval=$enable_debug; case "${enableval}" in yes) debug=true ;; no) debug=false ;; *) as_fn_error $? "bad value ${enableval} for --enable-debug" "$LINENO" 5 ;; esac else debug=false fi if test x$debug = xtrue; then DEBUG_COMPILE_TRUE= DEBUG_COMPILE_FALSE='#' else DEBUG_COMPILE_TRUE='#' DEBUG_COMPILE_FALSE= fi if test x$debug = xtrue; then SOAPCPP2_DEBUG="-DDEBUG" ##define DEBUG for debugging else SOAPCPP2_DEBUG= fi # set the default soapcpp2 import path SOAPCPP2_IMPORTPATH="-DSOAPCPP_IMPORT_PATH=\"\\\"${datadir}/gsoap/import\\\"\"" #SOAPCPP2_IMPORTPATH="-DSOAPCPP2_IMPORT_PATH=\"\\\"`pwd`/gsoap/import\\\"\"" # set the default wsdl2h import path WSDL2H_IMPORTPATH="-DWSDL_IMPORT_PATH=\"\\\"${datadir}/gsoap/WS\\\"\"" #WSDL2H_IMPORTPATH="-DWSDL2H_IMPORT_PATH=\"\\\"`pwd`/gsoap/WS\\\"\"" # the disable-namespaces option adds the -DWITH_NONAMESPACES to the # library compilation thus disabling namespaces @%:@ Check whether --enable-namespaces was given. if test "${enable_namespaces+set}" = set; then : enableval=$enable_namespaces; with_namespaces="$enable_ns" else with_namespaces="yes" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for disable namespaces in library" >&5 $as_echo_n "checking for disable namespaces in library... " >&6; } if test "x$with_namespaces" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SOAPCPP2_NONAMESPACES="-DWITH_NONAMESPACES" ##define to remove nsmap link dependence fi # the enable-ipv6 option adds the -DWITH_IPV6 to the # library compilation thus enabling IPv6 @%:@ Check whether --enable-ipv6 was given. if test "${enable_ipv6+set}" = set; then : enableval=$enable_ipv6; with_ipv6="yes" else with_ipv6="$disable_ipv6" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for enable ipv6 in library" >&5 $as_echo_n "checking for enable ipv6 in library... " >&6; } if test "x$with_ipv6" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SOAPCPP2_IPV6="-DWITH_IPV6 -DWITH_NO_IPV6_V6ONLY" ##define to add IPv6 support else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # the OpenSSL installation prefix path @%:@ Check whether --with-openssl was given. if test "${with_openssl+set}" = set; then : withval=$with_openssl; OPENSSL=$withval fi # the disable-ssl option removes the dependence on OpenSSL @%:@ Check whether --enable-ssl was given. if test "${enable_ssl+set}" = set; then : enableval=$enable_ssl; with_openssl="$enable_openssl" else with_openssl="yes" fi # the enable-gnutls option enables GNUTLS in favor of OpenSSL @%:@ Check whether --enable-gnutls was given. if test "${enable_gnutls+set}" = set; then : enableval=$enable_gnutls; with_gnutls="yes" else with_gnutls="$disable_gnutls" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for disable openssl in library" >&5 $as_echo_n "checking for disable openssl in library... " >&6; } if test "x$with_openssl" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for enable gnutls in library" >&5 $as_echo_n "checking for enable gnutls in library... " >&6; } if test "x$with_gnutls" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } WSDL2H_EXTRA_FLAGS="-DWITH_GNUTLS -DWITH_GZIP" WSDL2H_EXTRA_LIBS="-lgnutls -lgcrypt -lgpg-error -lz" SAMPLE_INCLUDES= SAMPLE_SSL_LIBS="-lgnutls -lgcrypt -lgpg-error -lz" WSDL2H_SOAP_CPP_LIB="libgsoapssl++.a" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } WSDL2H_EXTRA_FLAGS="-DWITH_OPENSSL -DWITH_GZIP" # an ugly hack to get httpda and md5evp plugins to conditionally # compile with wsdl2h when OPENSSL is available WSDL2H_EXTRA_LIBS="../plugin/httpda.c ../plugin/md5evp.c -lssl -lcrypto -lz" SAMPLE_INCLUDES= SAMPLE_SSL_LIBS="-lssl -lcrypto -lz" WSDL2H_SOAP_CPP_LIB="libgsoapssl++.a" fi if test -n "$OPENSSL"; then WSDL2H_EXTRA_FLAGS="-I${OPENSSL}/include ${WSDL2H_EXTRA_FLAGS}" WSDL2H_EXTRA_LIBS="-L${OPENSSL}/lib ${WSDL2H_EXTRA_LIBS}" SAMPLE_INCLUDES="-I${OPENSSL}/include" SAMPLE_SSL_LIBS="-L${OPENSSL}/lib ${SAMPLE_SSL_LIBS}" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } WSDL2H_EXTRA_FLAGS= WSDL2H_EXTRA_LIBS= SAMPLE_SSL_LIBS= SAMPLE_INCLUDES= WSDL2H_SOAP_CPP_LIB="libgsoap++.a" fi # enable the compile of the samples @%:@ Check whether --enable-samples was given. if test "${enable_samples+set}" = set; then : enableval=$enable_samples; case "${enableval}" in yes) samples=true ;; no) samples=false ;; *) as_fn_error $? "bad value ${enableval} for --enable-samples" "$LINENO" 5 ;; esac else samples=false fi if test x$samples = xtrue; then ENABLE_SAMPLES_TRUE= ENABLE_SAMPLES_FALSE='#' else ENABLE_SAMPLES_TRUE='#' ENABLE_SAMPLES_FALSE= fi if test x$samples = xtrue; then SAMPLE_DIRS=". samples" else SAMPLE_DIRS= fi if test x$LEX = xflex; then LEX_DEFINE=-DWITH_FLEX LEX_FLAGS="-l" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: No 'flex' command detected on current path: trying existing scanner" >&5 $as_echo "$as_me: WARNING: No 'flex' command detected on current path: trying existing scanner" >&2;} LEX_DEFINE=-DWITH_LEX LEX_FLAGS= fi # check if we must define -DWITH_BISON if test "$YACC" = "bison -y"; then BISON_DEFINE=-DWITH_BISON YACC_LIB= else BISON_DEFINE=-DWITH_YACC YACC_LIB="-ly" fi ac_config_files="$ac_config_files Makefile gsoap.pc gsoap++.pc gsoapck.pc gsoapck++.pc gsoapssl.pc gsoapssl++.pc gsoap/Makefile gsoap/src/Makefile gsoap/wsdl/Makefile gsoap/samples/Makefile gsoap/samples/autotest/Makefile gsoap/samples/calc/Makefile gsoap/samples/calc++/Makefile gsoap/samples/chaining/Makefile gsoap/samples/chaining++/Makefile gsoap/samples/databinding/Makefile gsoap/samples/dime/Makefile gsoap/samples/dom/Makefile gsoap/samples/oneway/Makefile gsoap/samples/oneway++/Makefile gsoap/samples/factory/Makefile gsoap/samples/factorytest/Makefile gsoap/samples/gmt/Makefile gsoap/samples/googleapi/Makefile gsoap/samples/hello/Makefile gsoap/samples/httpcookies/Makefile gsoap/samples/lu/Makefile gsoap/samples/magic/Makefile gsoap/samples/mashup/Makefile gsoap/samples/mashup++/Makefile gsoap/samples/mtom/Makefile gsoap/samples/mtom-stream/Makefile gsoap/samples/polytest/Makefile gsoap/samples/primes/Makefile gsoap/samples/roll/Makefile gsoap/samples/router/Makefile gsoap/samples/rss/Makefile gsoap/samples/ssl/Makefile gsoap/samples/template/Makefile gsoap/samples/udp/Makefile gsoap/samples/varparam/Makefile gsoap/samples/wsa/Makefile gsoap/samples/wsrm/Makefile gsoap/samples/wsse/Makefile gsoap/samples/xml-rpc-json/Makefile gsoap/samples/rest/Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= for ac_i in : $LIB@&t@OBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIB@&t@OBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs { $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 $as_echo_n "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 $as_echo "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${DEBUG_COMPILE_TRUE}" && test -z "${DEBUG_COMPILE_FALSE}"; then as_fn_error $? "conditional \"DEBUG_COMPILE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_SAMPLES_TRUE}" && test -z "${ENABLE_SAMPLES_FALSE}"; then as_fn_error $? "conditional \"ENABLE_SAMPLES\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in @%:@( *posix*) : set -o posix ;; @%:@( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in @%:@( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in @%:@(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH @%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] @%:@ ---------------------------------------- @%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are @%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the @%:@ script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } @%:@ as_fn_error @%:@ as_fn_set_status STATUS @%:@ ----------------------- @%:@ Set @S|@? to STATUS, without forking. as_fn_set_status () { return $1 } @%:@ as_fn_set_status @%:@ as_fn_exit STATUS @%:@ ----------------- @%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } @%:@ as_fn_exit @%:@ as_fn_unset VAR @%:@ --------------- @%:@ Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset @%:@ as_fn_append VAR VALUE @%:@ ---------------------- @%:@ Append the text in VALUE to the end of the definition contained in VAR. Take @%:@ advantage of any shell optimizations that allow amortized linear growth over @%:@ repeated appends, instead of the typical quadratic growth present in naive @%:@ implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append @%:@ as_fn_arith ARG... @%:@ ------------------ @%:@ Perform arithmetic evaluation on the ARGs, and store the result in the @%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments @%:@ must be portable across @S|@(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in @%:@((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null @%:@ as_fn_mkdir_p @%:@ ------------- @%:@ Create "@S|@as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } @%:@ as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi @%:@ as_fn_executable_p FILE @%:@ ----------------------- @%:@ Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } @%:@ as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by gsoap $as_me 2.8, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ gsoap config.status 2.8 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../@%:@@%:@ /;s/...$/ @%:@@%:@/;p;x;p;x' <<_ASBOX @%:@@%:@ Running $as_me. @%:@@%:@ _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "gsoap.pc") CONFIG_FILES="$CONFIG_FILES gsoap.pc" ;; "gsoap++.pc") CONFIG_FILES="$CONFIG_FILES gsoap++.pc" ;; "gsoapck.pc") CONFIG_FILES="$CONFIG_FILES gsoapck.pc" ;; "gsoapck++.pc") CONFIG_FILES="$CONFIG_FILES gsoapck++.pc" ;; "gsoapssl.pc") CONFIG_FILES="$CONFIG_FILES gsoapssl.pc" ;; "gsoapssl++.pc") CONFIG_FILES="$CONFIG_FILES gsoapssl++.pc" ;; "gsoap/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/Makefile" ;; "gsoap/src/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/src/Makefile" ;; "gsoap/wsdl/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/wsdl/Makefile" ;; "gsoap/samples/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/Makefile" ;; "gsoap/samples/autotest/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/autotest/Makefile" ;; "gsoap/samples/calc/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/calc/Makefile" ;; "gsoap/samples/calc++/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/calc++/Makefile" ;; "gsoap/samples/chaining/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/chaining/Makefile" ;; "gsoap/samples/chaining++/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/chaining++/Makefile" ;; "gsoap/samples/databinding/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/databinding/Makefile" ;; "gsoap/samples/dime/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/dime/Makefile" ;; "gsoap/samples/dom/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/dom/Makefile" ;; "gsoap/samples/oneway/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/oneway/Makefile" ;; "gsoap/samples/oneway++/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/oneway++/Makefile" ;; "gsoap/samples/factory/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/factory/Makefile" ;; "gsoap/samples/factorytest/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/factorytest/Makefile" ;; "gsoap/samples/gmt/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/gmt/Makefile" ;; "gsoap/samples/googleapi/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/googleapi/Makefile" ;; "gsoap/samples/hello/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/hello/Makefile" ;; "gsoap/samples/httpcookies/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/httpcookies/Makefile" ;; "gsoap/samples/lu/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/lu/Makefile" ;; "gsoap/samples/magic/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/magic/Makefile" ;; "gsoap/samples/mashup/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/mashup/Makefile" ;; "gsoap/samples/mashup++/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/mashup++/Makefile" ;; "gsoap/samples/mtom/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/mtom/Makefile" ;; "gsoap/samples/mtom-stream/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/mtom-stream/Makefile" ;; "gsoap/samples/polytest/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/polytest/Makefile" ;; "gsoap/samples/primes/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/primes/Makefile" ;; "gsoap/samples/roll/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/roll/Makefile" ;; "gsoap/samples/router/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/router/Makefile" ;; "gsoap/samples/rss/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/rss/Makefile" ;; "gsoap/samples/ssl/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/ssl/Makefile" ;; "gsoap/samples/template/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/template/Makefile" ;; "gsoap/samples/udp/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/udp/Makefile" ;; "gsoap/samples/varparam/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/varparam/Makefile" ;; "gsoap/samples/wsa/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/wsa/Makefile" ;; "gsoap/samples/wsrm/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/wsrm/Makefile" ;; "gsoap/samples/wsse/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/wsse/Makefile" ;; "gsoap/samples/xml-rpc-json/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/xml-rpc-json/Makefile" ;; "gsoap/samples/rest/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/rest/Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi gsoap-2.8.28/autom4te.cache/output.10000644000175000017500000070172312653650144016532 0ustar ellertellert@%:@! /bin/sh @%:@ Guess values for system-dependent variables and create Makefiles. @%:@ Generated by GNU Autoconf 2.69 for gsoap 2.8. @%:@ @%:@ @%:@ Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. @%:@ @%:@ @%:@ This configure script is free software; the Free Software Foundation @%:@ gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in @%:@( *posix*) : set -o posix ;; @%:@( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in @%:@( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in @%:@(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in @%:@ (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in @%:@( *posix*) : set -o posix ;; @%:@( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in @%:@( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in @%:@ (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## @%:@ as_fn_unset VAR @%:@ --------------- @%:@ Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset @%:@ as_fn_set_status STATUS @%:@ ----------------------- @%:@ Set @S|@? to STATUS, without forking. as_fn_set_status () { return $1 } @%:@ as_fn_set_status @%:@ as_fn_exit STATUS @%:@ ----------------- @%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } @%:@ as_fn_exit @%:@ as_fn_mkdir_p @%:@ ------------- @%:@ Create "@S|@as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } @%:@ as_fn_mkdir_p @%:@ as_fn_executable_p FILE @%:@ ----------------------- @%:@ Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } @%:@ as_fn_executable_p @%:@ as_fn_append VAR VALUE @%:@ ---------------------- @%:@ Append the text in VALUE to the end of the definition contained in VAR. Take @%:@ advantage of any shell optimizations that allow amortized linear growth over @%:@ repeated appends, instead of the typical quadratic growth present in naive @%:@ implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append @%:@ as_fn_arith ARG... @%:@ ------------------ @%:@ Perform arithmetic evaluation on the ARGs, and store the result in the @%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments @%:@ must be portable across @S|@(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith @%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] @%:@ ---------------------------------------- @%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are @%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the @%:@ script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } @%:@ as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in @%:@((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIB@&t@OBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='gsoap' PACKAGE_TARNAME='gsoap' PACKAGE_VERSION='2.8' PACKAGE_STRING='gsoap 2.8' PACKAGE_BUGREPORT='' PACKAGE_URL='' ac_unique_file="gsoap/stdsoap2.cpp" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_header_list= ac_func_list= ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS YACC_LIB BISON_DEFINE LEX_FLAGS LEX_DEFINE SAMPLE_DIRS ENABLE_SAMPLES ENABLE_SAMPLES_FALSE ENABLE_SAMPLES_TRUE WSDL2H_SOAP_CPP_LIB SAMPLE_SSL_LIBS SAMPLE_INCLUDES WSDL2H_EXTRA_LIBS WSDL2H_EXTRA_FLAGS SOAPCPP2_IPV6 SOAPCPP2_NONAMESPACES WSDL2H_IMPORTPATH SOAPCPP2_IMPORTPATH SOAPCPP2_DEBUG DEBUG_COMPILE_FALSE DEBUG_COMPILE_TRUE LIB@&t@OBJS EGREP GREP platform SAMPLE_EXTRA_LIBS LN_S RANLIB CPP YFLAGS YACC LEXLIB LEX_OUTPUT_ROOT LEX am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE ac_ct_CC CFLAGS CC am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CXX CPPFLAGS LDFLAGS CXXFLAGS CXX host_os host_vendor host_cpu host build_os build_vendor build_cpu build AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_silent_rules enable_dependency_tracking enable_debug enable_namespaces enable_ipv6 with_openssl enable_ssl enable_gnutls enable_samples ' ac_precious_vars='build_alias host_alias target_alias CXX CXXFLAGS LDFLAGS LIBS CPPFLAGS CCC CC CFLAGS YACC YFLAGS CPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures gsoap 2.8 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX @<:@@S|@ac_default_prefix@:>@ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX @<:@PREFIX@:>@ By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root @<:@DATAROOTDIR/doc/gsoap@:>@ --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of gsoap 2.8:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") --enable-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build --enable-debug add debug symbols for debugging --disable-namespaces compile library without namespaces --enable-ipv6 compile library with IPv6 support --disable-ssl build without SSL/TLS --enable-gnutls build with GNUTLS SSL/TLS --enable-samples enable compile for the gsoap samples Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-openssl=DIR openssl installation prefix Some influential environment variables: CXX C++ compiler command CXXFLAGS C++ compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CC C compiler command CFLAGS C compiler flags YACC The `Yet Another Compiler Compiler' implementation to use. Defaults to the first program found out of: `bison -y', `byacc', `yacc'. YFLAGS The list of arguments that will be passed by default to @S|@YACC. This script will default YFLAGS to the empty string to avoid a default value of `-d' given by some make applications. CPP C preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF gsoap configure 2.8 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## @%:@ ac_fn_cxx_try_compile LINENO @%:@ ---------------------------- @%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } @%:@ ac_fn_cxx_try_compile @%:@ ac_fn_c_try_compile LINENO @%:@ -------------------------- @%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } @%:@ ac_fn_c_try_compile @%:@ ac_fn_c_try_link LINENO @%:@ ----------------------- @%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } @%:@ ac_fn_c_try_link @%:@ ac_fn_c_try_cpp LINENO @%:@ ---------------------- @%:@ Try to preprocess conftest.@S|@ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } @%:@ ac_fn_c_try_cpp @%:@ ac_fn_c_try_run LINENO @%:@ ---------------------- @%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. Assumes @%:@ that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } @%:@ ac_fn_c_try_run @%:@ ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES @%:@ ------------------------------------------------------- @%:@ Tests whether HEADER exists, giving a warning if it cannot be compiled using @%:@ the include files in INCLUDES and setting the cache variable VAR @%:@ accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 @%:@include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } @%:@ ac_fn_c_check_header_mongrel @%:@ ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES @%:@ ------------------------------------------------------- @%:@ Tests whether HEADER exists and can be compiled using the include files in @%:@ INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 @%:@include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } @%:@ ac_fn_c_check_header_compile @%:@ ac_fn_c_check_type LINENO TYPE VAR INCLUDES @%:@ ------------------------------------------- @%:@ Tests whether TYPE exists after having included INCLUDES, setting cache @%:@ variable VAR accordingly. ac_fn_c_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof ($2)) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else eval "$3=yes" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } @%:@ ac_fn_c_check_type @%:@ ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES @%:@ ---------------------------------------------------- @%:@ Tries to find if the field MEMBER exists in type AGGR, after including @%:@ INCLUDES, setting cache variable VAR accordingly. ac_fn_c_check_member () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5 $as_echo_n "checking for $2.$3... " >&6; } if eval \${$4+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main () { static $2 ac_aggr; if (ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$4=yes" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main () { static $2 ac_aggr; if (sizeof ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$4=yes" else eval "$4=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$4 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } @%:@ ac_fn_c_check_member @%:@ ac_fn_c_check_func LINENO FUNC VAR @%:@ ---------------------------------- @%:@ Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } @%:@ ac_fn_c_check_func cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by gsoap $as_me 2.8, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in @%:@(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi as_fn_append ac_header_list " sys/time.h" as_fn_append ac_header_list " unistd.h" as_fn_append ac_func_list " alarm" # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu am__api_version='1.14' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in @%:@(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null @%:@ Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='gsoap' VERSION='2.8' cat >>confdefs.h <<_ACEOF @%:@define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar pax cpio none' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 fi fi # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac # AC_CONFIG_HEADERS([config.h]) ac_config_headers="$ac_config_headers config.h" # we use subdirs. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi # Checks for programs. ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler works" >&5 $as_echo_n "checking whether the C++ compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C++ compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler default output file name" >&5 $as_echo_n "checking for C++ compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C++ compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf @%:@ Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi depcc="$CXX" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CXX_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 $as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $@%:@ != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 $as_echo_n "checking whether $CC understands -c and -o together... " >&6; } if ${am_cv_prog_cc_c_o+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 $as_echo "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi for ac_prog in flex lex do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_LEX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$LEX"; then ac_cv_prog_LEX="$LEX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_LEX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi LEX=$ac_cv_prog_LEX if test -n "$LEX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LEX" >&5 $as_echo "$LEX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$LEX" && break done test -n "$LEX" || LEX=":" if test "x$LEX" != "x:"; then cat >conftest.l <<_ACEOF %% a { ECHO; } b { REJECT; } c { yymore (); } d { yyless (1); } e { /* IRIX 6.5 flex 2.5.4 underquotes its yyless argument. */ yyless ((input () != 0)); } f { unput (yytext[0]); } . { BEGIN INITIAL; } %% #ifdef YYTEXT_POINTER extern char *yytext; #endif int main (void) { return ! yylex () + ! yywrap (); } _ACEOF { { ac_try="$LEX conftest.l" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$LEX conftest.l") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking lex output file root" >&5 $as_echo_n "checking lex output file root... " >&6; } if ${ac_cv_prog_lex_root+:} false; then : $as_echo_n "(cached) " >&6 else if test -f lex.yy.c; then ac_cv_prog_lex_root=lex.yy elif test -f lexyy.c; then ac_cv_prog_lex_root=lexyy else as_fn_error $? "cannot find output from $LEX; giving up" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_root" >&5 $as_echo "$ac_cv_prog_lex_root" >&6; } LEX_OUTPUT_ROOT=$ac_cv_prog_lex_root if test -z "${LEXLIB+set}"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking lex library" >&5 $as_echo_n "checking lex library... " >&6; } if ${ac_cv_lib_lex+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_LIBS=$LIBS ac_cv_lib_lex='none needed' for ac_lib in '' -lfl -ll; do LIBS="$ac_lib $ac_save_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ `cat $LEX_OUTPUT_ROOT.c` _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_lex=$ac_lib fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext test "$ac_cv_lib_lex" != 'none needed' && break done LIBS=$ac_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lex" >&5 $as_echo "$ac_cv_lib_lex" >&6; } test "$ac_cv_lib_lex" != 'none needed' && LEXLIB=$ac_cv_lib_lex fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether yytext is a pointer" >&5 $as_echo_n "checking whether yytext is a pointer... " >&6; } if ${ac_cv_prog_lex_yytext_pointer+:} false; then : $as_echo_n "(cached) " >&6 else # POSIX says lex can declare yytext either as a pointer or an array; the # default is implementation-dependent. Figure out which it is, since # not all implementations provide the %pointer and %array declarations. ac_cv_prog_lex_yytext_pointer=no ac_save_LIBS=$LIBS LIBS="$LEXLIB $ac_save_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define YYTEXT_POINTER 1 `cat $LEX_OUTPUT_ROOT.c` _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_prog_lex_yytext_pointer=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_yytext_pointer" >&5 $as_echo "$ac_cv_prog_lex_yytext_pointer" >&6; } if test $ac_cv_prog_lex_yytext_pointer = yes; then $as_echo "@%:@define YYTEXT_POINTER 1" >>confdefs.h fi rm -f conftest.l $LEX_OUTPUT_ROOT.c fi if test "$LEX" = :; then LEX=${am_missing_run}flex fi for ac_prog in 'bison -y' byacc do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_YACC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$YACC"; then ac_cv_prog_YACC="$YACC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_YACC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi YACC=$ac_cv_prog_YACC if test -n "$YACC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $YACC" >&5 $as_echo "$YACC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$YACC" && break done test -n "$YACC" || YACC="yacc" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@ifdef __STDC__ @%:@ include @%:@else @%:@ include @%:@endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@ifdef __STDC__ @%:@ include @%:@else @%:@ include @%:@endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi #AM_PROG_LIBTOOL { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 $as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 $as_echo "no, using $LN_S" >&6; } fi for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done # AC_DECL_YYTEXT SAMPLE_EXTRA_LIBS="-lm" # Platform-specific Makefile setup case "${host}" in *-*-solaris*) platform=SUN_OS SAMPLE_EXTRA_LIBS="-lxnet -lsocket -lnsl -lm" WSDL2H_EXTRA_LIBS="-lssl -lcrypto -lz -lsocket -lxnet -lnsl -lrt" ;; *-*-sysv5*) platform=UNIXWARE ;; *-*-UnixWare*) platform=UNIXWARE ;; *-*-unixware*) platform=UNIXWARE ;; *-*-sco3.2v5*) platform=OPENSERVER SAMPLE_EXTRA_LIBS="-lsocket -lm" ;; *-*-linux*) platform=LINUX # if test x$debug = xtrue; then # CFLAGS="-g" #don't want the -O2 for debugging. # else # CFLAGS="-O2" #don't want the -g for release compile. # fi ;; *-*-cygwin*) platform=CYGWIN ;; *-*-mingw*) platform=MINGW SAMPLE_EXTRA_LIBS="-lws2_32 -lkernel32 -luser32 -lgdi32 -lm" WSDL2H_EXTRA_LIBS="-lssl -lcrypto -lws2_32 -lkernel32 -luser32 -lgdi32 -lm" ;; *-*-freebsd*) platform=FREEBSD ;; *-*-openbsd*) platform=OPENBSD ;; *-*-irix*) platform=IRIX ;; *-*-aix*) platform=AIX case "${host}" in *-*-aix4.1*) osver=AIX41;; *-*-aix4.2*) osver=AIX42;; *-*-aix4.3*) osver=AIX43;; *-*-aix4.*) osver=AIX43;; *-*-aix5.2) osver=AIX52;; *-*-aix5.3) osver=AIX53;; *-*-aix6.1) osver=AIX61;; esac ;; *-sequent-*) platform=PTX ;; *-*-hp*) platform=HP_UX ; case "${host}" in *-*-hpux11*) osver=HPUX11;; *-*-hpux10*) osver=HPUX10;; *) osver=HPUX11;; esac ;; *-*-mvs*) platform=OS390 ;; *-*-os400*) platform=OS400 ;; *-*-OS400*) platform=OS400 ;; *-*-osf*) platform=TRU64 ;; *-apple-*) platform=MACOSX # Appease 10.7 Lion (OpenSSL deprecated) CXXFLAGS="-Wno-deprecated-declarations" CFLAGS="-Wno-deprecated-declarations" ;; *-nto-qnx) platform=QNX SAMPLE_EXTRA_LIBS="-lsocket -lm" ;; *) platform=UNKNOWN ;; esac # Checks for header files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "@%:@define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF @%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in arpa/inet.h xlocale.h errno.h fcntl.h limits.h netdb.h netinet/in.h stdlib.h string.h strings.h stdint.h inttypes.h time.h sys/inttypes.h sys/socket.h sys/types.h sys/time.h sys/timeb.h unistd.h poll.h openssl/ssl.h gnutls/gnutls.h zlib.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF @%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done # Checks for typedefs, structures, and compiler characteristics. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 $as_echo_n "checking for an ANSI C-conforming const... " >&6; } if ${ac_cv_c_const+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __cplusplus /* Ultrix mips cc rejects this sort of thing. */ typedef int charset[2]; const charset cs = { 0, 0 }; /* SunOS 4.1.1 cc rejects this. */ char const *const *pcpcc; char **ppc; /* NEC SVR4.0.2 mips cc rejects this. */ struct point {int x, y;}; static struct point const zero = {0,0}; /* AIX XL C 1.02.0.0 rejects this. It does not let you subtract one const X* pointer from another in an arm of an if-expression whose if-part is not a constant expression */ const char *g = "string"; pcpcc = &g + (g ? g-g : 0); /* HPUX 7.0 cc rejects these. */ ++pcpcc; ppc = (char**) pcpcc; pcpcc = (char const *const *) ppc; { /* SCO 3.2v4 cc rejects this sort of thing. */ char tx; char *t = &tx; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; if (s) return 0; } { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ int x[] = {25, 17}; const int *foo = &x[0]; ++foo; } { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ typedef const int *iptr; iptr p = 0; ++p; } { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ struct s { int j; const int *ap[3]; } bx; struct s *b = &bx; b->j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; if (!foo) return 0; } return !cs[0] && !zero.x; #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_const=yes else ac_cv_c_const=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 $as_echo "$ac_cv_c_const" >&6; } if test $ac_cv_c_const = no; then $as_echo "@%:@define const /**/" >>confdefs.h fi ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" if test "x$ac_cv_type_size_t" = xyes; then : else cat >>confdefs.h <<_ACEOF @%:@define size_t unsigned int _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5 $as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; } if ${ac_cv_header_time+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { if ((struct tm *) 0) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_time=yes else ac_cv_header_time=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5 $as_echo "$ac_cv_header_time" >&6; } if test $ac_cv_header_time = yes; then $as_echo "@%:@define TIME_WITH_SYS_TIME 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether struct tm is in sys/time.h or time.h" >&5 $as_echo_n "checking whether struct tm is in sys/time.h or time.h... " >&6; } if ${ac_cv_struct_tm+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { struct tm tm; int *p = &tm.tm_sec; return !p; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_struct_tm=time.h else ac_cv_struct_tm=sys/time.h fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_struct_tm" >&5 $as_echo "$ac_cv_struct_tm" >&6; } if test $ac_cv_struct_tm = sys/time.h; then $as_echo "@%:@define TM_IN_SYS_TIME 1" >>confdefs.h fi ac_fn_c_check_member "$LINENO" "struct tm" "tm_gmtoff" "ac_cv_member_struct_tm_tm_gmtoff" " #include #include " if test "x$ac_cv_member_struct_tm_tm_gmtoff" = xyes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_STRUCT_TM_TM_GMTOFF 1 _ACEOF fi ac_fn_c_check_member "$LINENO" "struct tm" "__tm_gmtoff" "ac_cv_member_struct_tm___tm_gmtoff" " #include #include " if test "x$ac_cv_member_struct_tm___tm_gmtoff" = xyes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_STRUCT_TM___TM_GMTOFF 1 _ACEOF fi # Checks for library functions. for ac_header in $ac_header_list do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF @%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in $ac_func_list do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF @%:@define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working mktime" >&5 $as_echo_n "checking for working mktime... " >&6; } if ${ac_cv_func_working_mktime+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_working_mktime=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Test program from Paul Eggert and Tony Leneis. */ #ifdef TIME_WITH_SYS_TIME # include # include #else # ifdef HAVE_SYS_TIME_H # include # else # include # endif #endif #include #include #ifdef HAVE_UNISTD_H # include #endif #ifndef HAVE_ALARM # define alarm(X) /* empty */ #endif /* Work around redefinition to rpl_putenv by other config tests. */ #undef putenv static time_t time_t_max; static time_t time_t_min; /* Values we'll use to set the TZ environment variable. */ static const char *tz_strings[] = { (const char *) 0, "TZ=GMT0", "TZ=JST-9", "TZ=EST+3EDT+2,M10.1.0/00:00:00,M2.3.0/00:00:00" }; #define N_STRINGS (sizeof (tz_strings) / sizeof (tz_strings[0])) /* Return 0 if mktime fails to convert a date in the spring-forward gap. Based on a problem report from Andreas Jaeger. */ static int spring_forward_gap () { /* glibc (up to about 1998-10-07) failed this test. */ struct tm tm; /* Use the portable POSIX.1 specification "TZ=PST8PDT,M4.1.0,M10.5.0" instead of "TZ=America/Vancouver" in order to detect the bug even on systems that don't support the Olson extension, or don't have the full zoneinfo tables installed. */ putenv ((char*) "TZ=PST8PDT,M4.1.0,M10.5.0"); tm.tm_year = 98; tm.tm_mon = 3; tm.tm_mday = 5; tm.tm_hour = 2; tm.tm_min = 0; tm.tm_sec = 0; tm.tm_isdst = -1; return mktime (&tm) != (time_t) -1; } static int mktime_test1 (time_t now) { struct tm *lt; return ! (lt = localtime (&now)) || mktime (lt) == now; } static int mktime_test (time_t now) { return (mktime_test1 (now) && mktime_test1 ((time_t) (time_t_max - now)) && mktime_test1 ((time_t) (time_t_min + now))); } static int irix_6_4_bug () { /* Based on code from Ariel Faigon. */ struct tm tm; tm.tm_year = 96; tm.tm_mon = 3; tm.tm_mday = 0; tm.tm_hour = 0; tm.tm_min = 0; tm.tm_sec = 0; tm.tm_isdst = -1; mktime (&tm); return tm.tm_mon == 2 && tm.tm_mday == 31; } static int bigtime_test (int j) { struct tm tm; time_t now; tm.tm_year = tm.tm_mon = tm.tm_mday = tm.tm_hour = tm.tm_min = tm.tm_sec = j; now = mktime (&tm); if (now != (time_t) -1) { struct tm *lt = localtime (&now); if (! (lt && lt->tm_year == tm.tm_year && lt->tm_mon == tm.tm_mon && lt->tm_mday == tm.tm_mday && lt->tm_hour == tm.tm_hour && lt->tm_min == tm.tm_min && lt->tm_sec == tm.tm_sec && lt->tm_yday == tm.tm_yday && lt->tm_wday == tm.tm_wday && ((lt->tm_isdst < 0 ? -1 : 0 < lt->tm_isdst) == (tm.tm_isdst < 0 ? -1 : 0 < tm.tm_isdst)))) return 0; } return 1; } static int year_2050_test () { /* The correct answer for 2050-02-01 00:00:00 in Pacific time, ignoring leap seconds. */ unsigned long int answer = 2527315200UL; struct tm tm; time_t t; tm.tm_year = 2050 - 1900; tm.tm_mon = 2 - 1; tm.tm_mday = 1; tm.tm_hour = tm.tm_min = tm.tm_sec = 0; tm.tm_isdst = -1; /* Use the portable POSIX.1 specification "TZ=PST8PDT,M4.1.0,M10.5.0" instead of "TZ=America/Vancouver" in order to detect the bug even on systems that don't support the Olson extension, or don't have the full zoneinfo tables installed. */ putenv ((char*) "TZ=PST8PDT,M4.1.0,M10.5.0"); t = mktime (&tm); /* Check that the result is either a failure, or close enough to the correct answer that we can assume the discrepancy is due to leap seconds. */ return (t == (time_t) -1 || (0 < t && answer - 120 <= t && t <= answer + 120)); } int main () { time_t t, delta; int i, j; /* This test makes some buggy mktime implementations loop. Give up after 60 seconds; a mktime slower than that isn't worth using anyway. */ alarm (60); for (;;) { t = (time_t_max << 1) + 1; if (t <= time_t_max) break; time_t_max = t; } time_t_min = - ((time_t) ~ (time_t) 0 == (time_t) -1) - time_t_max; delta = time_t_max / 997; /* a suitable prime number */ for (i = 0; i < N_STRINGS; i++) { if (tz_strings[i]) putenv ((char*) tz_strings[i]); for (t = 0; t <= time_t_max - delta; t += delta) if (! mktime_test (t)) return 1; if (! (mktime_test ((time_t) 1) && mktime_test ((time_t) (60 * 60)) && mktime_test ((time_t) (60 * 60 * 24)))) return 1; for (j = 1; ; j <<= 1) if (! bigtime_test (j)) return 1; else if (INT_MAX / 2 < j) break; if (! bigtime_test (INT_MAX)) return 1; } return ! (irix_6_4_bug () && spring_forward_gap () && year_2050_test ()); } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_working_mktime=yes else ac_cv_func_working_mktime=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_working_mktime" >&5 $as_echo "$ac_cv_func_working_mktime" >&6; } if test $ac_cv_func_working_mktime = no; then case " $LIB@&t@OBJS " in *" mktime.$ac_objext "* ) ;; *) LIB@&t@OBJS="$LIB@&t@OBJS mktime.$ac_objext" ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking return type of signal handlers" >&5 $as_echo_n "checking return type of signal handlers... " >&6; } if ${ac_cv_type_signal+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { return *(signal (0, 0)) (0) == 1; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_type_signal=int else ac_cv_type_signal=void fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_signal" >&5 $as_echo "$ac_cv_type_signal" >&6; } cat >>confdefs.h <<_ACEOF @%:@define RETSIGTYPE $ac_cv_type_signal _ACEOF for ac_func in strftime do : ac_fn_c_check_func "$LINENO" "strftime" "ac_cv_func_strftime" if test "x$ac_cv_func_strftime" = xyes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_STRFTIME 1 _ACEOF else # strftime is in -lintl on SCO UNIX. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for strftime in -lintl" >&5 $as_echo_n "checking for strftime in -lintl... " >&6; } if ${ac_cv_lib_intl_strftime+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char strftime (); int main () { return strftime (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_strftime=yes else ac_cv_lib_intl_strftime=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_strftime" >&5 $as_echo "$ac_cv_lib_intl_strftime" >&6; } if test "x$ac_cv_lib_intl_strftime" = xyes; then : $as_echo "@%:@define HAVE_STRFTIME 1" >>confdefs.h LIBS="-lintl $LIBS" fi fi done for ac_func in random gettimeofday ftime localtime_r timegm gmtime gmtime_r memset select socket snprintf strchr strerror strerror_r strrchr strstr strtol strtoul strtoll strtoull strtold strtod strtof strtold_l strtod_l strtof_l sscanf sscanf_l sprintf_l wctomb mbtowc poll do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF @%:@define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done # Checks for isnan and isinf ac_fn_c_check_func "$LINENO" "isnan" "ac_cv_func_isnan" if test "x$ac_cv_func_isnan" = xyes; then : has_isnan=1; $as_echo "@%:@define HAVE_ISNAN 1" >>confdefs.h else has_isnan=0 fi ac_fn_c_check_func "$LINENO" "isinf" "ac_cv_func_isinf" if test "x$ac_cv_func_isinf" = xyes; then : has_isinf=1; $as_echo "@%:@define HAVE_ISINF 1" >>confdefs.h else has_isinf=0 fi # check for macro isnan in math if test $has_isnan = 0; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for macro isnan" >&5 $as_echo_n "checking for macro isnan... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { { int foo; foo = isnan(0); } ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : has_isnan=1 else has_isnan=0 fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test $has_isnan = 1; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "@%:@define HAVE_ISNAN 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi # check for macro isinf in math if test $has_isinf = 0; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for macro isinf" >&5 $as_echo_n "checking for macro isinf... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { { int foo; foo = isinf(0); } ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : has_isinf=1 else has_isinf=0 fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test $has_isinf = 1; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "@%:@define HAVE_ISINF 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi # Function test depending on platform # AIX Has incompatible gethostbyname_r if test $platform != AIX -a $platform != TRU64; then for ac_func in gethostbyname_r do : ac_fn_c_check_func "$LINENO" "gethostbyname_r" "ac_cv_func_gethostbyname_r" if test "x$ac_cv_func_gethostbyname_r" = xyes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_GETHOSTBYNAME_R 1 _ACEOF fi done for ac_header in stdlib.h do : ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" if test "x$ac_cv_header_stdlib_h" = xyes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_STDLIB_H 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU libc compatible malloc" >&5 $as_echo_n "checking for GNU libc compatible malloc... " >&6; } if ${ac_cv_func_malloc_0_nonnull+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_malloc_0_nonnull=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined STDC_HEADERS || defined HAVE_STDLIB_H # include #else char *malloc (); #endif int main () { return ! malloc (0); ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_malloc_0_nonnull=yes else ac_cv_func_malloc_0_nonnull=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_malloc_0_nonnull" >&5 $as_echo "$ac_cv_func_malloc_0_nonnull" >&6; } if test $ac_cv_func_malloc_0_nonnull = yes; then : $as_echo "@%:@define HAVE_MALLOC 1" >>confdefs.h else $as_echo "@%:@define HAVE_MALLOC 0" >>confdefs.h case " $LIB@&t@OBJS " in *" malloc.$ac_objext "* ) ;; *) LIB@&t@OBJS="$LIB@&t@OBJS malloc.$ac_objext" ;; esac $as_echo "@%:@define malloc rpl_malloc" >>confdefs.h fi fi # the debug build options adds symbols to compiler output (-g for g++) @%:@ Check whether --enable-debug was given. if test "${enable_debug+set}" = set; then : enableval=$enable_debug; case "${enableval}" in yes) debug=true ;; no) debug=false ;; *) as_fn_error $? "bad value ${enableval} for --enable-debug" "$LINENO" 5 ;; esac else debug=false fi if test x$debug = xtrue; then DEBUG_COMPILE_TRUE= DEBUG_COMPILE_FALSE='#' else DEBUG_COMPILE_TRUE='#' DEBUG_COMPILE_FALSE= fi if test x$debug = xtrue; then SOAPCPP2_DEBUG="-DDEBUG" ##define DEBUG for debugging else SOAPCPP2_DEBUG= fi # set the default soapcpp2 import path SOAPCPP2_IMPORTPATH="-DSOAPCPP_IMPORT_PATH=\"\\\"${datadir}/gsoap/import\\\"\"" #SOAPCPP2_IMPORTPATH="-DSOAPCPP2_IMPORT_PATH=\"\\\"`pwd`/gsoap/import\\\"\"" # set the default wsdl2h import path WSDL2H_IMPORTPATH="-DWSDL_IMPORT_PATH=\"\\\"${datadir}/gsoap/WS\\\"\"" #WSDL2H_IMPORTPATH="-DWSDL2H_IMPORT_PATH=\"\\\"`pwd`/gsoap/WS\\\"\"" # the disable-namespaces option adds the -DWITH_NONAMESPACES to the # library compilation thus disabling namespaces @%:@ Check whether --enable-namespaces was given. if test "${enable_namespaces+set}" = set; then : enableval=$enable_namespaces; with_namespaces="$enable_ns" else with_namespaces="yes" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for disable namespaces in library" >&5 $as_echo_n "checking for disable namespaces in library... " >&6; } if test "x$with_namespaces" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SOAPCPP2_NONAMESPACES="-DWITH_NONAMESPACES" ##define to remove nsmap link dependence fi # the enable-ipv6 option adds the -DWITH_IPV6 to the # library compilation thus enabling IPv6 @%:@ Check whether --enable-ipv6 was given. if test "${enable_ipv6+set}" = set; then : enableval=$enable_ipv6; with_ipv6="yes" else with_ipv6="$disable_ipv6" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for enable ipv6 in library" >&5 $as_echo_n "checking for enable ipv6 in library... " >&6; } if test "x$with_ipv6" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SOAPCPP2_IPV6="-DWITH_IPV6 -DWITH_NO_IPV6_V6ONLY" ##define to add IPv6 support else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # the OpenSSL installation prefix path @%:@ Check whether --with-openssl was given. if test "${with_openssl+set}" = set; then : withval=$with_openssl; OPENSSL=$withval fi # the disable-ssl option removes the dependence on OpenSSL @%:@ Check whether --enable-ssl was given. if test "${enable_ssl+set}" = set; then : enableval=$enable_ssl; with_openssl="$enable_openssl" else with_openssl="yes" fi # the enable-gnutls option enables GNUTLS in favor of OpenSSL @%:@ Check whether --enable-gnutls was given. if test "${enable_gnutls+set}" = set; then : enableval=$enable_gnutls; with_gnutls="yes" else with_gnutls="$disable_gnutls" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for disable openssl in library" >&5 $as_echo_n "checking for disable openssl in library... " >&6; } if test "x$with_openssl" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for enable gnutls in library" >&5 $as_echo_n "checking for enable gnutls in library... " >&6; } if test "x$with_gnutls" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } WSDL2H_EXTRA_FLAGS="-DWITH_GNUTLS -DWITH_GZIP" WSDL2H_EXTRA_LIBS="-lgnutls -lgcrypt -lgpg-error -lz" SAMPLE_INCLUDES= SAMPLE_SSL_LIBS="-lgnutls -lgcrypt -lgpg-error -lz" WSDL2H_SOAP_CPP_LIB="libgsoapssl++.a" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } WSDL2H_EXTRA_FLAGS="-DWITH_OPENSSL -DWITH_GZIP" # an ugly hack to get httpda and md5evp plugins to conditionally # compile with wsdl2h when OPENSSL is available WSDL2H_EXTRA_LIBS="../plugin/httpda.c ../plugin/md5evp.c -lssl -lcrypto -lz" SAMPLE_INCLUDES= SAMPLE_SSL_LIBS="-lssl -lcrypto -lz" WSDL2H_SOAP_CPP_LIB="libgsoapssl++.a" fi if test -n "$OPENSSL"; then WSDL2H_EXTRA_FLAGS="-I${OPENSSL}/include ${WSDL2H_EXTRA_FLAGS}" WSDL2H_EXTRA_LIBS="-L${OPENSSL}/lib ${WSDL2H_EXTRA_LIBS}" SAMPLE_INCLUDES="-I${OPENSSL}/include" SAMPLE_SSL_LIBS="-L${OPENSSL}/lib ${SAMPLE_SSL_LIBS}" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } WSDL2H_EXTRA_FLAGS= WSDL2H_EXTRA_LIBS= SAMPLE_SSL_LIBS= SAMPLE_INCLUDES= WSDL2H_SOAP_CPP_LIB="libgsoap++.a" fi # enable the compile of the samples @%:@ Check whether --enable-samples was given. if test "${enable_samples+set}" = set; then : enableval=$enable_samples; case "${enableval}" in yes) samples=true ;; no) samples=false ;; *) as_fn_error $? "bad value ${enableval} for --enable-samples" "$LINENO" 5 ;; esac else samples=false fi if test x$samples = xtrue; then ENABLE_SAMPLES_TRUE= ENABLE_SAMPLES_FALSE='#' else ENABLE_SAMPLES_TRUE='#' ENABLE_SAMPLES_FALSE= fi if test x$samples = xtrue; then SAMPLE_DIRS=". samples" else SAMPLE_DIRS= fi if test x$LEX = xflex; then LEX_DEFINE=-DWITH_FLEX LEX_FLAGS="-l" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: No 'flex' command detected on current path: trying existing scanner" >&5 $as_echo "$as_me: WARNING: No 'flex' command detected on current path: trying existing scanner" >&2;} LEX_DEFINE=-DWITH_LEX LEX_FLAGS= fi # check if we must define -DWITH_BISON if test "$YACC" = "bison -y"; then BISON_DEFINE=-DWITH_BISON YACC_LIB= else BISON_DEFINE=-DWITH_YACC YACC_LIB="-ly" fi ac_config_files="$ac_config_files Makefile gsoap.pc gsoap++.pc gsoapck.pc gsoapck++.pc gsoapssl.pc gsoapssl++.pc gsoap/Makefile gsoap/src/Makefile gsoap/wsdl/Makefile gsoap/samples/Makefile gsoap/samples/autotest/Makefile gsoap/samples/calc/Makefile gsoap/samples/calc++/Makefile gsoap/samples/chaining/Makefile gsoap/samples/chaining++/Makefile gsoap/samples/databinding/Makefile gsoap/samples/dime/Makefile gsoap/samples/dom/Makefile gsoap/samples/oneway/Makefile gsoap/samples/oneway++/Makefile gsoap/samples/factory/Makefile gsoap/samples/factorytest/Makefile gsoap/samples/gmt/Makefile gsoap/samples/googleapi/Makefile gsoap/samples/hello/Makefile gsoap/samples/httpcookies/Makefile gsoap/samples/lu/Makefile gsoap/samples/magic/Makefile gsoap/samples/mashup/Makefile gsoap/samples/mashup++/Makefile gsoap/samples/mtom/Makefile gsoap/samples/mtom-stream/Makefile gsoap/samples/polytest/Makefile gsoap/samples/primes/Makefile gsoap/samples/roll/Makefile gsoap/samples/router/Makefile gsoap/samples/rss/Makefile gsoap/samples/ssl/Makefile gsoap/samples/template/Makefile gsoap/samples/udp/Makefile gsoap/samples/varparam/Makefile gsoap/samples/wsa/Makefile gsoap/samples/wsrm/Makefile gsoap/samples/wsse/Makefile gsoap/samples/xml-rpc-json/Makefile gsoap/samples/rest/Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= for ac_i in : $LIB@&t@OBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIB@&t@OBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs { $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 $as_echo_n "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 $as_echo "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${DEBUG_COMPILE_TRUE}" && test -z "${DEBUG_COMPILE_FALSE}"; then as_fn_error $? "conditional \"DEBUG_COMPILE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_SAMPLES_TRUE}" && test -z "${ENABLE_SAMPLES_FALSE}"; then as_fn_error $? "conditional \"ENABLE_SAMPLES\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in @%:@( *posix*) : set -o posix ;; @%:@( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in @%:@( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in @%:@(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH @%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] @%:@ ---------------------------------------- @%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are @%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the @%:@ script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } @%:@ as_fn_error @%:@ as_fn_set_status STATUS @%:@ ----------------------- @%:@ Set @S|@? to STATUS, without forking. as_fn_set_status () { return $1 } @%:@ as_fn_set_status @%:@ as_fn_exit STATUS @%:@ ----------------- @%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } @%:@ as_fn_exit @%:@ as_fn_unset VAR @%:@ --------------- @%:@ Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset @%:@ as_fn_append VAR VALUE @%:@ ---------------------- @%:@ Append the text in VALUE to the end of the definition contained in VAR. Take @%:@ advantage of any shell optimizations that allow amortized linear growth over @%:@ repeated appends, instead of the typical quadratic growth present in naive @%:@ implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append @%:@ as_fn_arith ARG... @%:@ ------------------ @%:@ Perform arithmetic evaluation on the ARGs, and store the result in the @%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments @%:@ must be portable across @S|@(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in @%:@((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null @%:@ as_fn_mkdir_p @%:@ ------------- @%:@ Create "@S|@as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } @%:@ as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi @%:@ as_fn_executable_p FILE @%:@ ----------------------- @%:@ Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } @%:@ as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by gsoap $as_me 2.8, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ gsoap config.status 2.8 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../@%:@@%:@ /;s/...$/ @%:@@%:@/;p;x;p;x' <<_ASBOX @%:@@%:@ Running $as_me. @%:@@%:@ _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "gsoap.pc") CONFIG_FILES="$CONFIG_FILES gsoap.pc" ;; "gsoap++.pc") CONFIG_FILES="$CONFIG_FILES gsoap++.pc" ;; "gsoapck.pc") CONFIG_FILES="$CONFIG_FILES gsoapck.pc" ;; "gsoapck++.pc") CONFIG_FILES="$CONFIG_FILES gsoapck++.pc" ;; "gsoapssl.pc") CONFIG_FILES="$CONFIG_FILES gsoapssl.pc" ;; "gsoapssl++.pc") CONFIG_FILES="$CONFIG_FILES gsoapssl++.pc" ;; "gsoap/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/Makefile" ;; "gsoap/src/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/src/Makefile" ;; "gsoap/wsdl/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/wsdl/Makefile" ;; "gsoap/samples/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/Makefile" ;; "gsoap/samples/autotest/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/autotest/Makefile" ;; "gsoap/samples/calc/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/calc/Makefile" ;; "gsoap/samples/calc++/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/calc++/Makefile" ;; "gsoap/samples/chaining/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/chaining/Makefile" ;; "gsoap/samples/chaining++/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/chaining++/Makefile" ;; "gsoap/samples/databinding/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/databinding/Makefile" ;; "gsoap/samples/dime/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/dime/Makefile" ;; "gsoap/samples/dom/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/dom/Makefile" ;; "gsoap/samples/oneway/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/oneway/Makefile" ;; "gsoap/samples/oneway++/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/oneway++/Makefile" ;; "gsoap/samples/factory/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/factory/Makefile" ;; "gsoap/samples/factorytest/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/factorytest/Makefile" ;; "gsoap/samples/gmt/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/gmt/Makefile" ;; "gsoap/samples/googleapi/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/googleapi/Makefile" ;; "gsoap/samples/hello/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/hello/Makefile" ;; "gsoap/samples/httpcookies/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/httpcookies/Makefile" ;; "gsoap/samples/lu/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/lu/Makefile" ;; "gsoap/samples/magic/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/magic/Makefile" ;; "gsoap/samples/mashup/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/mashup/Makefile" ;; "gsoap/samples/mashup++/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/mashup++/Makefile" ;; "gsoap/samples/mtom/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/mtom/Makefile" ;; "gsoap/samples/mtom-stream/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/mtom-stream/Makefile" ;; "gsoap/samples/polytest/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/polytest/Makefile" ;; "gsoap/samples/primes/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/primes/Makefile" ;; "gsoap/samples/roll/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/roll/Makefile" ;; "gsoap/samples/router/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/router/Makefile" ;; "gsoap/samples/rss/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/rss/Makefile" ;; "gsoap/samples/ssl/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/ssl/Makefile" ;; "gsoap/samples/template/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/template/Makefile" ;; "gsoap/samples/udp/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/udp/Makefile" ;; "gsoap/samples/varparam/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/varparam/Makefile" ;; "gsoap/samples/wsa/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/wsa/Makefile" ;; "gsoap/samples/wsrm/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/wsrm/Makefile" ;; "gsoap/samples/wsse/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/wsse/Makefile" ;; "gsoap/samples/xml-rpc-json/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/xml-rpc-json/Makefile" ;; "gsoap/samples/rest/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/rest/Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi gsoap-2.8.28/autom4te.cache/traces.00000644000175000017500000013772312653650144016455 0ustar ellertellertm4trace:/usr/local/share/aclocal-1.14/amversion.m4:20: -1- AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.14' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.14], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) m4trace:/usr/local/share/aclocal-1.14/amversion.m4:37: -1- AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.14])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) m4trace:/usr/local/share/aclocal-1.14/auxdir.m4:52: -1- AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) m4trace:/usr/local/share/aclocal-1.14/cond.m4:32: -1- AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ([2.52])dnl m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) m4trace:/usr/local/share/aclocal-1.14/depend.m4:156: -1- AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], [$1], [CXX], [depcc="$CXX" am_compiler_list=], [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], [$1], [UPC], [depcc="$UPC" am_compiler_list=], [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) m4trace:/usr/local/share/aclocal-1.14/depend.m4:166: -1- AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) m4trace:/usr/local/share/aclocal-1.14/depend.m4:189: -1- AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE([dependency-tracking], [dnl AS_HELP_STRING( [--enable-dependency-tracking], [do not reject slow dependency extractors]) AS_HELP_STRING( [--disable-dependency-tracking], [speeds up one-time build])]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) m4trace:/usr/local/share/aclocal-1.14/depout.m4:61: -1- AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ]) m4trace:/usr/local/share/aclocal-1.14/depout.m4:75: -1- AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) m4trace:/usr/local/share/aclocal-1.14/init.m4:167: -1- AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.65])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [AC_DIAGNOSE([obsolete], [$0: two- and three-arguments forms are deprecated.]) m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if( m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) AM_MISSING_PROG([AUTOCONF], [autoconf]) AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) AM_MISSING_PROG([AUTOHEADER], [autoheader]) AM_MISSING_PROG([MAKEINFO], [makeinfo]) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # AC_SUBST([mkdir_p], ['$(MKDIR_P)']) # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES([CC])], [m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES([CXX])], [m4_define([AC_PROG_CXX], m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) AC_REQUIRE([AM_SILENT_RULES])dnl dnl The testsuite driver may need to know about EXEEXT, so add the dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) fi fi]) m4trace:/usr/local/share/aclocal-1.14/init.m4:194: -1- AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) m4trace:/usr/local/share/aclocal-1.14/install-sh.m4:21: -1- AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST([install_sh])]) m4trace:/usr/local/share/aclocal-1.14/lead-dot.m4:19: -1- AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) m4trace:/usr/local/share/aclocal-1.14/lex.m4:19: -1- AC_DEFUN([AM_PROG_LEX], [AC_PREREQ([2.50])dnl AC_REQUIRE([AM_MISSING_HAS_RUN])dnl AC_REQUIRE([AC_PROG_LEX])dnl if test "$LEX" = :; then LEX=${am_missing_run}flex fi]) m4trace:/usr/local/share/aclocal-1.14/make.m4:49: -1- AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) m4trace:/usr/local/share/aclocal-1.14/missing.m4:14: -1- AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) m4trace:/usr/local/share/aclocal-1.14/missing.m4:38: -1- AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= AC_MSG_WARN(['missing' script is too old or missing]) fi ]) m4trace:/usr/local/share/aclocal-1.14/obsolete.m4:15: -1- AC_DEFUN([AM_CONFIG_HEADER], [AC_DIAGNOSE([obsolete], ['$0': this macro is obsolete. You should use the 'AC][_CONFIG_HEADERS' macro instead.])dnl AC_CONFIG_HEADERS($@)]) m4trace:/usr/local/share/aclocal-1.14/obsolete.m4:24: -1- AC_DEFUN([AM_PROG_CC_STDC], [AC_PROG_CC am_cv_prog_cc_stdc=$ac_cv_prog_cc_stdc AC_DIAGNOSE([obsolete], ['$0': this macro is obsolete. You should simply use the 'AC][_PROG_CC' macro instead. Also, your code should no longer depend upon 'am_cv_prog_cc_stdc', but upon 'ac_cv_prog_cc_stdc'.])]) m4trace:/usr/local/share/aclocal-1.14/obsolete.m4:27: -1- AC_DEFUN([AM_C_PROTOTYPES], [AC_FATAL([automatic de-ANSI-fication support has been removed])]) m4trace:/usr/local/share/aclocal-1.14/obsolete.m4:28: -1- AU_DEFUN([fp_C_PROTOTYPES], [AM_C_PROTOTYPES]) m4trace:/usr/local/share/aclocal-1.14/obsolete.m4:28: -1- AC_DEFUN([fp_C_PROTOTYPES], [AC_DIAGNOSE([obsolete], [The macro `fp_C_PROTOTYPES' is obsolete. You should run autoupdate.])dnl AM_C_PROTOTYPES]) m4trace:/usr/local/share/aclocal-1.14/options.m4:12: -1- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) m4trace:/usr/local/share/aclocal-1.14/options.m4:18: -1- AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), [1])]) m4trace:/usr/local/share/aclocal-1.14/options.m4:24: -1- AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) m4trace:/usr/local/share/aclocal-1.14/options.m4:30: -1- AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) m4trace:/usr/local/share/aclocal-1.14/prog-cc-c-o.m4:44: -1- AC_DEFUN([_AM_PROG_CC_C_O], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([compile])dnl AC_LANG_PUSH([C])dnl AC_CACHE_CHECK( [whether $CC understands -c and -o together], [am_cv_prog_cc_c_o], [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i]) if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi AC_LANG_POP([C])]) m4trace:/usr/local/share/aclocal-1.14/prog-cc-c-o.m4:47: -1- AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) m4trace:/usr/local/share/aclocal-1.14/runlog.m4:17: -1- AC_DEFUN([AM_RUN_LOG], [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD (exit $ac_status); }]) m4trace:/usr/local/share/aclocal-1.14/sanity.m4:82: -1- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi if test "$[2]" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT([yes]) # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi AC_CONFIG_COMMANDS_PRE( [AC_MSG_CHECKING([that generated files are newer than configure]) if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi AC_MSG_RESULT([done])]) rm -f conftest.file ]) m4trace:/usr/local/share/aclocal-1.14/silent.m4:60: -1- AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [dnl AS_HELP_STRING( [--enable-silent-rules], [less verbose build output (undo: "make V=1")]) AS_HELP_STRING( [--disable-silent-rules], [verbose build output (undo: "make V=0")])dnl ]) case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; esac dnl dnl A few 'make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. dnl See automake bug#9928 and bug#10237. am_make=${MAKE-make} AC_CACHE_CHECK([whether $am_make supports nested variables], [am_cv_make_support_nested_variables], [if AS_ECHO([['TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi]) if test $am_cv_make_support_nested_variables = yes; then dnl Using '$V' instead of '$(V)' breaks IRIX make. AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AC_SUBST([AM_V])dnl AM_SUBST_NOTMAKE([AM_V])dnl AC_SUBST([AM_DEFAULT_V])dnl AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) m4trace:/usr/local/share/aclocal-1.14/strip.m4:28: -1- AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) m4trace:/usr/local/share/aclocal-1.14/substnot.m4:12: -1- AC_DEFUN([_AM_SUBST_NOTMAKE]) m4trace:/usr/local/share/aclocal-1.14/substnot.m4:17: -1- AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) m4trace:/usr/local/share/aclocal-1.14/tar.m4:132: -1- AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar], [# The POSIX 1988 'ustar' format is defined with fixed-size fields. # There is notably a 21 bits limit for the UID and the GID. In fact, # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 # and bug#13588). am_max_uid=2097151 # 2^21 - 1 am_max_gid=$am_max_uid # The $UID and $GID variables are not portable, so we need to resort # to the POSIX-mandated id(1) utility. Errors in the 'id' calls # below are definitely unexpected, so allow the users to see them # (that is, avoid stderr redirection). am_uid=`id -u || echo unknown` am_gid=`id -g || echo unknown` AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) if test $am_uid -le $am_max_uid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) if test $am_gid -le $am_max_gid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi], [pax], [], [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_$1-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) m4trace:configure.in:2: -1- m4_pattern_forbid([^_?A[CHUM]_]) m4trace:configure.in:2: -1- m4_pattern_forbid([_AC_]) m4trace:configure.in:2: -1- m4_pattern_forbid([^LIBOBJS$], [do not use LIBOBJS directly, use AC_LIBOBJ (see section `AC_LIBOBJ vs LIBOBJS']) m4trace:configure.in:2: -1- m4_pattern_allow([^AS_FLAGS$]) m4trace:configure.in:2: -1- m4_pattern_forbid([^_?m4_]) m4trace:configure.in:2: -1- m4_pattern_forbid([^dnl$]) m4trace:configure.in:2: -1- m4_pattern_forbid([^_?AS_]) m4trace:configure.in:2: -1- m4_pattern_allow([^SHELL$]) m4trace:configure.in:2: -1- m4_pattern_allow([^PATH_SEPARATOR$]) m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_NAME$]) m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_VERSION$]) m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_STRING$]) m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_URL$]) m4trace:configure.in:2: -1- m4_pattern_allow([^exec_prefix$]) m4trace:configure.in:2: -1- m4_pattern_allow([^prefix$]) m4trace:configure.in:2: -1- m4_pattern_allow([^program_transform_name$]) m4trace:configure.in:2: -1- m4_pattern_allow([^bindir$]) m4trace:configure.in:2: -1- m4_pattern_allow([^sbindir$]) m4trace:configure.in:2: -1- m4_pattern_allow([^libexecdir$]) m4trace:configure.in:2: -1- m4_pattern_allow([^datarootdir$]) m4trace:configure.in:2: -1- m4_pattern_allow([^datadir$]) m4trace:configure.in:2: -1- m4_pattern_allow([^sysconfdir$]) m4trace:configure.in:2: -1- m4_pattern_allow([^sharedstatedir$]) m4trace:configure.in:2: -1- m4_pattern_allow([^localstatedir$]) m4trace:configure.in:2: -1- m4_pattern_allow([^includedir$]) m4trace:configure.in:2: -1- m4_pattern_allow([^oldincludedir$]) m4trace:configure.in:2: -1- m4_pattern_allow([^docdir$]) m4trace:configure.in:2: -1- m4_pattern_allow([^infodir$]) m4trace:configure.in:2: -1- m4_pattern_allow([^htmldir$]) m4trace:configure.in:2: -1- m4_pattern_allow([^dvidir$]) m4trace:configure.in:2: -1- m4_pattern_allow([^pdfdir$]) m4trace:configure.in:2: -1- m4_pattern_allow([^psdir$]) m4trace:configure.in:2: -1- m4_pattern_allow([^libdir$]) m4trace:configure.in:2: -1- m4_pattern_allow([^localedir$]) m4trace:configure.in:2: -1- m4_pattern_allow([^mandir$]) m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_NAME$]) m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_VERSION$]) m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_STRING$]) m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_URL$]) m4trace:configure.in:2: -1- m4_pattern_allow([^DEFS$]) m4trace:configure.in:2: -1- m4_pattern_allow([^ECHO_C$]) m4trace:configure.in:2: -1- m4_pattern_allow([^ECHO_N$]) m4trace:configure.in:2: -1- m4_pattern_allow([^ECHO_T$]) m4trace:configure.in:2: -1- m4_pattern_allow([^LIBS$]) m4trace:configure.in:2: -1- m4_pattern_allow([^build_alias$]) m4trace:configure.in:2: -1- m4_pattern_allow([^host_alias$]) m4trace:configure.in:2: -1- m4_pattern_allow([^target_alias$]) m4trace:configure.in:3: -1- AM_INIT_AUTOMAKE([subdir-objects]) m4trace:configure.in:3: -1- m4_pattern_allow([^AM_[A-Z]+FLAGS$]) m4trace:configure.in:3: -1- AM_SET_CURRENT_AUTOMAKE_VERSION m4trace:configure.in:3: -1- AM_AUTOMAKE_VERSION([1.14]) m4trace:configure.in:3: -1- _AM_AUTOCONF_VERSION([2.69]) m4trace:configure.in:3: -1- m4_pattern_allow([^INSTALL_PROGRAM$]) m4trace:configure.in:3: -1- m4_pattern_allow([^INSTALL_SCRIPT$]) m4trace:configure.in:3: -1- m4_pattern_allow([^INSTALL_DATA$]) m4trace:configure.in:3: -1- m4_pattern_allow([^am__isrc$]) m4trace:configure.in:3: -1- _AM_SUBST_NOTMAKE([am__isrc]) m4trace:configure.in:3: -1- m4_pattern_allow([^CYGPATH_W$]) m4trace:configure.in:3: -1- _AM_SET_OPTIONS([subdir-objects]) m4trace:configure.in:3: -1- _AM_SET_OPTION([subdir-objects]) m4trace:configure.in:3: -2- _AM_MANGLE_OPTION([subdir-objects]) m4trace:configure.in:3: -1- m4_pattern_allow([^PACKAGE$]) m4trace:configure.in:3: -1- m4_pattern_allow([^VERSION$]) m4trace:configure.in:3: -1- _AM_IF_OPTION([no-define], [], [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])]) m4trace:configure.in:3: -2- _AM_MANGLE_OPTION([no-define]) m4trace:configure.in:3: -1- m4_pattern_allow([^PACKAGE$]) m4trace:configure.in:3: -1- m4_pattern_allow([^VERSION$]) m4trace:configure.in:3: -1- AM_SANITY_CHECK m4trace:configure.in:3: -1- AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) m4trace:configure.in:3: -1- AM_MISSING_HAS_RUN m4trace:configure.in:3: -1- AM_AUX_DIR_EXPAND m4trace:configure.in:3: -1- m4_pattern_allow([^ACLOCAL$]) m4trace:configure.in:3: -1- AM_MISSING_PROG([AUTOCONF], [autoconf]) m4trace:configure.in:3: -1- m4_pattern_allow([^AUTOCONF$]) m4trace:configure.in:3: -1- AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) m4trace:configure.in:3: -1- m4_pattern_allow([^AUTOMAKE$]) m4trace:configure.in:3: -1- AM_MISSING_PROG([AUTOHEADER], [autoheader]) m4trace:configure.in:3: -1- m4_pattern_allow([^AUTOHEADER$]) m4trace:configure.in:3: -1- AM_MISSING_PROG([MAKEINFO], [makeinfo]) m4trace:configure.in:3: -1- m4_pattern_allow([^MAKEINFO$]) m4trace:configure.in:3: -1- AM_PROG_INSTALL_SH m4trace:configure.in:3: -1- m4_pattern_allow([^install_sh$]) m4trace:configure.in:3: -1- AM_PROG_INSTALL_STRIP m4trace:configure.in:3: -1- m4_pattern_allow([^STRIP$]) m4trace:configure.in:3: -1- m4_pattern_allow([^INSTALL_STRIP_PROGRAM$]) m4trace:configure.in:3: -1- m4_pattern_allow([^MKDIR_P$]) m4trace:configure.in:3: -1- m4_pattern_allow([^mkdir_p$]) m4trace:configure.in:3: -1- m4_pattern_allow([^AWK$]) m4trace:configure.in:3: -1- m4_pattern_allow([^SET_MAKE$]) m4trace:configure.in:3: -1- AM_SET_LEADING_DOT m4trace:configure.in:3: -1- m4_pattern_allow([^am__leading_dot$]) m4trace:configure.in:3: -1- _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) m4trace:configure.in:3: -2- _AM_MANGLE_OPTION([tar-ustar]) m4trace:configure.in:3: -1- _AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])]) m4trace:configure.in:3: -2- _AM_MANGLE_OPTION([tar-pax]) m4trace:configure.in:3: -1- _AM_PROG_TAR([v7]) m4trace:configure.in:3: -1- m4_pattern_allow([^AMTAR$]) m4trace:configure.in:3: -1- m4_pattern_allow([^am__tar$]) m4trace:configure.in:3: -1- m4_pattern_allow([^am__untar$]) m4trace:configure.in:3: -1- _AM_IF_OPTION([no-dependencies], [], [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES([CC])], [m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES([CXX])], [m4_define([AC_PROG_CXX], m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) m4trace:configure.in:3: -2- _AM_MANGLE_OPTION([no-dependencies]) m4trace:configure.in:3: -1- AM_SILENT_RULES m4trace:configure.in:3: -1- m4_pattern_allow([^AM_V$]) m4trace:configure.in:3: -1- AM_SUBST_NOTMAKE([AM_V]) m4trace:configure.in:3: -1- _AM_SUBST_NOTMAKE([AM_V]) m4trace:configure.in:3: -1- m4_pattern_allow([^AM_DEFAULT_V$]) m4trace:configure.in:3: -1- AM_SUBST_NOTMAKE([AM_DEFAULT_V]) m4trace:configure.in:3: -1- _AM_SUBST_NOTMAKE([AM_DEFAULT_V]) m4trace:configure.in:3: -1- m4_pattern_allow([^AM_DEFAULT_VERBOSITY$]) m4trace:configure.in:3: -1- m4_pattern_allow([^AM_BACKSLASH$]) m4trace:configure.in:3: -1- _AM_SUBST_NOTMAKE([AM_BACKSLASH]) m4trace:configure.in:5: -1- m4_pattern_allow([^build$]) m4trace:configure.in:5: -1- m4_pattern_allow([^build_cpu$]) m4trace:configure.in:5: -1- m4_pattern_allow([^build_vendor$]) m4trace:configure.in:5: -1- m4_pattern_allow([^build_os$]) m4trace:configure.in:5: -1- m4_pattern_allow([^host$]) m4trace:configure.in:5: -1- m4_pattern_allow([^host_cpu$]) m4trace:configure.in:5: -1- m4_pattern_allow([^host_vendor$]) m4trace:configure.in:5: -1- m4_pattern_allow([^host_os$]) m4trace:configure.in:8: -1- AM_CONFIG_HEADER([config.h]) m4trace:configure.in:8: -1- _m4_warn([obsolete], ['AM_CONFIG_HEADER': this macro is obsolete. You should use the 'AC_CONFIG_HEADERS' macro instead.], [/usr/local/share/aclocal-1.14/obsolete.m4:15: AM_CONFIG_HEADER is expanded from... configure.in:8: the top level]) m4trace:configure.in:11: -1- m4_pattern_allow([^SET_MAKE$]) m4trace:configure.in:13: -1- m4_pattern_allow([^CXX$]) m4trace:configure.in:13: -1- m4_pattern_allow([^CXXFLAGS$]) m4trace:configure.in:13: -1- m4_pattern_allow([^LDFLAGS$]) m4trace:configure.in:13: -1- m4_pattern_allow([^LIBS$]) m4trace:configure.in:13: -1- m4_pattern_allow([^CPPFLAGS$]) m4trace:configure.in:13: -1- m4_pattern_allow([^CXX$]) m4trace:configure.in:13: -1- m4_pattern_allow([^ac_ct_CXX$]) m4trace:configure.in:13: -1- m4_pattern_allow([^EXEEXT$]) m4trace:configure.in:13: -1- m4_pattern_allow([^OBJEXT$]) m4trace:configure.in:13: -1- _AM_DEPENDENCIES([CXX]) m4trace:configure.in:13: -1- AM_SET_DEPDIR m4trace:configure.in:13: -1- m4_pattern_allow([^DEPDIR$]) m4trace:configure.in:13: -1- AM_OUTPUT_DEPENDENCY_COMMANDS m4trace:configure.in:13: -1- AM_MAKE_INCLUDE m4trace:configure.in:13: -1- m4_pattern_allow([^am__include$]) m4trace:configure.in:13: -1- m4_pattern_allow([^am__quote$]) m4trace:configure.in:13: -1- AM_DEP_TRACK m4trace:configure.in:13: -1- AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) m4trace:configure.in:13: -1- m4_pattern_allow([^AMDEP_TRUE$]) m4trace:configure.in:13: -1- m4_pattern_allow([^AMDEP_FALSE$]) m4trace:configure.in:13: -1- _AM_SUBST_NOTMAKE([AMDEP_TRUE]) m4trace:configure.in:13: -1- _AM_SUBST_NOTMAKE([AMDEP_FALSE]) m4trace:configure.in:13: -1- m4_pattern_allow([^AMDEPBACKSLASH$]) m4trace:configure.in:13: -1- _AM_SUBST_NOTMAKE([AMDEPBACKSLASH]) m4trace:configure.in:13: -1- m4_pattern_allow([^am__nodep$]) m4trace:configure.in:13: -1- _AM_SUBST_NOTMAKE([am__nodep]) m4trace:configure.in:13: -1- m4_pattern_allow([^CXXDEPMODE$]) m4trace:configure.in:13: -1- AM_CONDITIONAL([am__fastdepCXX], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3]) m4trace:configure.in:13: -1- m4_pattern_allow([^am__fastdepCXX_TRUE$]) m4trace:configure.in:13: -1- m4_pattern_allow([^am__fastdepCXX_FALSE$]) m4trace:configure.in:13: -1- _AM_SUBST_NOTMAKE([am__fastdepCXX_TRUE]) m4trace:configure.in:13: -1- _AM_SUBST_NOTMAKE([am__fastdepCXX_FALSE]) m4trace:configure.in:14: -1- m4_pattern_allow([^CC$]) m4trace:configure.in:14: -1- m4_pattern_allow([^CFLAGS$]) m4trace:configure.in:14: -1- m4_pattern_allow([^LDFLAGS$]) m4trace:configure.in:14: -1- m4_pattern_allow([^LIBS$]) m4trace:configure.in:14: -1- m4_pattern_allow([^CPPFLAGS$]) m4trace:configure.in:14: -1- m4_pattern_allow([^CC$]) m4trace:configure.in:14: -1- m4_pattern_allow([^CC$]) m4trace:configure.in:14: -1- m4_pattern_allow([^CC$]) m4trace:configure.in:14: -1- m4_pattern_allow([^CC$]) m4trace:configure.in:14: -1- m4_pattern_allow([^ac_ct_CC$]) m4trace:configure.in:14: -1- _AM_PROG_CC_C_O m4trace:configure.in:14: -1- AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) m4trace:configure.in:14: -1- _AM_DEPENDENCIES([CC]) m4trace:configure.in:14: -1- m4_pattern_allow([^CCDEPMODE$]) m4trace:configure.in:14: -1- AM_CONDITIONAL([am__fastdepCC], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3]) m4trace:configure.in:14: -1- m4_pattern_allow([^am__fastdepCC_TRUE$]) m4trace:configure.in:14: -1- m4_pattern_allow([^am__fastdepCC_FALSE$]) m4trace:configure.in:14: -1- _AM_SUBST_NOTMAKE([am__fastdepCC_TRUE]) m4trace:configure.in:14: -1- _AM_SUBST_NOTMAKE([am__fastdepCC_FALSE]) m4trace:configure.in:15: -1- AM_PROG_CC_C_O m4trace:configure.in:16: -1- AM_PROG_LEX m4trace:configure.in:16: -1- m4_pattern_allow([^LEX$]) m4trace:configure.in:16: -1- m4_pattern_allow([^LEX_OUTPUT_ROOT$]) m4trace:configure.in:16: -1- m4_pattern_allow([^LEXLIB$]) m4trace:configure.in:16: -1- m4_pattern_allow([^YYTEXT_POINTER$]) m4trace:configure.in:17: -1- m4_pattern_allow([^YACC$]) m4trace:configure.in:17: -1- m4_pattern_allow([^YACC$]) m4trace:configure.in:17: -1- m4_pattern_allow([^YFLAGS$]) m4trace:configure.in:18: -1- m4_pattern_allow([^CPP$]) m4trace:configure.in:18: -1- m4_pattern_allow([^CPPFLAGS$]) m4trace:configure.in:18: -1- m4_pattern_allow([^CPP$]) m4trace:configure.in:19: -1- m4_pattern_allow([^RANLIB$]) m4trace:configure.in:21: -1- m4_pattern_allow([^LN_S$]) m4trace:configure.in:22: -1- m4_pattern_allow([^AWK$]) m4trace:configure.in:90: -1- m4_pattern_allow([^SAMPLE_EXTRA_LIBS$]) m4trace:configure.in:91: -1- m4_pattern_allow([^platform$]) m4trace:configure.in:94: -1- m4_pattern_allow([^GREP$]) m4trace:configure.in:94: -1- m4_pattern_allow([^EGREP$]) m4trace:configure.in:94: -1- m4_pattern_allow([^STDC_HEADERS$]) m4trace:configure.in:98: -1- m4_pattern_allow([^const$]) m4trace:configure.in:99: -1- m4_pattern_allow([^size_t$]) m4trace:configure.in:100: -1- m4_pattern_allow([^TIME_WITH_SYS_TIME$]) m4trace:configure.in:101: -1- m4_pattern_allow([^TM_IN_SYS_TIME$]) m4trace:configure.in:106: -1- m4_pattern_allow([^HAVE_STRUCT_TM_TM_GMTOFF$]) m4trace:configure.in:106: -1- m4_pattern_allow([^HAVE_STRUCT_TM___TM_GMTOFF$]) m4trace:configure.in:109: -1- AC_DEFUN([_AC_Header_sys_time_h], [m4_divert_text([INIT_PREPARE], [AS_VAR_APPEND([ac_header_list], [" sys/time.h"])]) _AC_HEADERS_EXPANSION]) m4trace:configure.in:109: -1- AC_DEFUN([_AC_Header_unistd_h], [m4_divert_text([INIT_PREPARE], [AS_VAR_APPEND([ac_header_list], [" unistd.h"])]) _AC_HEADERS_EXPANSION]) m4trace:configure.in:109: -1- AC_DEFUN([_AC_Func_alarm], [m4_divert_text([INIT_PREPARE], [AS_VAR_APPEND([ac_func_list], [" alarm"])]) _AC_FUNCS_EXPANSION]) m4trace:configure.in:109: -1- m4_pattern_allow([^LIB@&t@OBJS$]) m4trace:configure.in:110: -1- _m4_warn([obsolete], [The macro `AC_TYPE_SIGNAL' is obsolete. You should run autoupdate.], [../../lib/autoconf/types.m4:759: AC_TYPE_SIGNAL is expanded from... configure.in:110: the top level]) m4trace:configure.in:110: -1- m4_pattern_allow([^RETSIGTYPE$]) m4trace:configure.in:111: -1- m4_pattern_allow([^HAVE_STRFTIME$]) m4trace:configure.in:111: -1- m4_pattern_allow([^HAVE_STRFTIME$]) m4trace:configure.in:115: -1- m4_pattern_allow([^HAVE_ISNAN$]) m4trace:configure.in:116: -1- m4_pattern_allow([^HAVE_ISINF$]) m4trace:configure.in:124: -1- m4_pattern_allow([^HAVE_ISNAN$]) m4trace:configure.in:136: -1- m4_pattern_allow([^HAVE_ISINF$]) m4trace:configure.in:145: -1- m4_pattern_allow([^HAVE_GETHOSTBYNAME_R$]) m4trace:configure.in:146: -1- m4_pattern_allow([^HAVE_STDLIB_H$]) m4trace:configure.in:146: -1- m4_pattern_allow([^HAVE_MALLOC$]) m4trace:configure.in:146: -1- m4_pattern_allow([^HAVE_MALLOC$]) m4trace:configure.in:146: -1- m4_pattern_allow([^LIB@&t@OBJS$]) m4trace:configure.in:146: -1- m4_pattern_allow([^malloc$]) m4trace:configure.in:157: -1- AM_CONDITIONAL([DEBUG_COMPILE], [test x$debug = xtrue]) m4trace:configure.in:157: -1- m4_pattern_allow([^DEBUG_COMPILE_TRUE$]) m4trace:configure.in:157: -1- m4_pattern_allow([^DEBUG_COMPILE_FALSE$]) m4trace:configure.in:157: -1- _AM_SUBST_NOTMAKE([DEBUG_COMPILE_TRUE]) m4trace:configure.in:157: -1- _AM_SUBST_NOTMAKE([DEBUG_COMPILE_FALSE]) m4trace:configure.in:163: -1- m4_pattern_allow([^SOAPCPP2_DEBUG$]) m4trace:configure.in:168: -1- m4_pattern_allow([^SOAPCPP2_IMPORTPATH$]) m4trace:configure.in:173: -1- m4_pattern_allow([^WSDL2H_IMPORTPATH$]) m4trace:configure.in:181: -1- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... ../../lib/autoconf/general.m4:1472: AC_ARG_ENABLE is expanded from... configure.in:181: the top level]) m4trace:configure.in:190: -1- m4_pattern_allow([^SOAPCPP2_NONAMESPACES$]) m4trace:configure.in:198: -1- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... ../../lib/autoconf/general.m4:1472: AC_ARG_ENABLE is expanded from... configure.in:198: the top level]) m4trace:configure.in:207: -1- m4_pattern_allow([^SOAPCPP2_IPV6$]) m4trace:configure.in:220: -1- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... ../../lib/autoconf/general.m4:1472: AC_ARG_ENABLE is expanded from... configure.in:220: the top level]) m4trace:configure.in:227: -1- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... ../../lib/autoconf/general.m4:1472: AC_ARG_ENABLE is expanded from... configure.in:227: the top level]) m4trace:configure.in:264: -1- m4_pattern_allow([^WSDL2H_EXTRA_FLAGS$]) m4trace:configure.in:265: -1- m4_pattern_allow([^WSDL2H_EXTRA_LIBS$]) m4trace:configure.in:266: -1- m4_pattern_allow([^SAMPLE_INCLUDES$]) m4trace:configure.in:267: -1- m4_pattern_allow([^SAMPLE_SSL_LIBS$]) m4trace:configure.in:268: -1- m4_pattern_allow([^WSDL2H_SOAP_CPP_LIB$]) m4trace:configure.in:278: -1- AM_CONDITIONAL([ENABLE_SAMPLES], [test x$samples = xtrue]) m4trace:configure.in:278: -1- m4_pattern_allow([^ENABLE_SAMPLES_TRUE$]) m4trace:configure.in:278: -1- m4_pattern_allow([^ENABLE_SAMPLES_FALSE$]) m4trace:configure.in:278: -1- _AM_SUBST_NOTMAKE([ENABLE_SAMPLES_TRUE]) m4trace:configure.in:278: -1- _AM_SUBST_NOTMAKE([ENABLE_SAMPLES_FALSE]) m4trace:configure.in:279: -1- m4_pattern_allow([^ENABLE_SAMPLES$]) m4trace:configure.in:286: -1- m4_pattern_allow([^SAMPLE_DIRS$]) m4trace:configure.in:296: -1- m4_pattern_allow([^LEX_DEFINE$]) m4trace:configure.in:297: -1- m4_pattern_allow([^LEX_FLAGS$]) m4trace:configure.in:298: -1- m4_pattern_allow([^LEXLIB$]) m4trace:configure.in:308: -1- m4_pattern_allow([^BISON_DEFINE$]) m4trace:configure.in:309: -1- m4_pattern_allow([^YACC_LIB$]) m4trace:configure.in:354: -1- m4_pattern_allow([^LIB@&t@OBJS$]) m4trace:configure.in:354: -1- m4_pattern_allow([^LTLIBOBJS$]) m4trace:configure.in:354: -1- AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"]) m4trace:configure.in:354: -1- m4_pattern_allow([^am__EXEEXT_TRUE$]) m4trace:configure.in:354: -1- m4_pattern_allow([^am__EXEEXT_FALSE$]) m4trace:configure.in:354: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_TRUE]) m4trace:configure.in:354: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_FALSE]) m4trace:configure.in:354: -1- _AC_AM_CONFIG_HEADER_HOOK(["$ac_file"]) m4trace:configure.in:354: -1- _AM_OUTPUT_DEPENDENCY_COMMANDS gsoap-2.8.28/autom4te.cache/output.20000644000175000017500000070200112653650144016521 0ustar ellertellert@%:@! /bin/sh @%:@ Guess values for system-dependent variables and create Makefiles. @%:@ Generated by GNU Autoconf 2.69 for gsoap 2.8. @%:@ @%:@ @%:@ Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. @%:@ @%:@ @%:@ This configure script is free software; the Free Software Foundation @%:@ gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in @%:@( *posix*) : set -o posix ;; @%:@( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in @%:@( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in @%:@(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in @%:@ (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in @%:@( *posix*) : set -o posix ;; @%:@( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in @%:@( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in @%:@ (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## @%:@ as_fn_unset VAR @%:@ --------------- @%:@ Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset @%:@ as_fn_set_status STATUS @%:@ ----------------------- @%:@ Set @S|@? to STATUS, without forking. as_fn_set_status () { return $1 } @%:@ as_fn_set_status @%:@ as_fn_exit STATUS @%:@ ----------------- @%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } @%:@ as_fn_exit @%:@ as_fn_mkdir_p @%:@ ------------- @%:@ Create "@S|@as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } @%:@ as_fn_mkdir_p @%:@ as_fn_executable_p FILE @%:@ ----------------------- @%:@ Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } @%:@ as_fn_executable_p @%:@ as_fn_append VAR VALUE @%:@ ---------------------- @%:@ Append the text in VALUE to the end of the definition contained in VAR. Take @%:@ advantage of any shell optimizations that allow amortized linear growth over @%:@ repeated appends, instead of the typical quadratic growth present in naive @%:@ implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append @%:@ as_fn_arith ARG... @%:@ ------------------ @%:@ Perform arithmetic evaluation on the ARGs, and store the result in the @%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments @%:@ must be portable across @S|@(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith @%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] @%:@ ---------------------------------------- @%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are @%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the @%:@ script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } @%:@ as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in @%:@((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIB@&t@OBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='gsoap' PACKAGE_TARNAME='gsoap' PACKAGE_VERSION='2.8' PACKAGE_STRING='gsoap 2.8' PACKAGE_BUGREPORT='' PACKAGE_URL='' ac_unique_file="gsoap/stdsoap2.cpp" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_header_list= ac_func_list= ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS YACC_LIB BISON_DEFINE LEX_FLAGS LEX_DEFINE SAMPLE_DIRS ENABLE_SAMPLES ENABLE_SAMPLES_FALSE ENABLE_SAMPLES_TRUE WSDL2H_SOAP_CPP_LIB SAMPLE_SSL_LIBS SAMPLE_INCLUDES WSDL2H_EXTRA_LIBS WSDL2H_EXTRA_FLAGS SOAPCPP2_IPV6 SOAPCPP2_NONAMESPACES WSDL2H_IMPORTPATH SOAPCPP2_IMPORTPATH SOAPCPP2_DEBUG DEBUG_COMPILE_FALSE DEBUG_COMPILE_TRUE LIB@&t@OBJS EGREP GREP platform SAMPLE_EXTRA_LIBS LN_S RANLIB CPP YFLAGS YACC LEXLIB LEX_OUTPUT_ROOT LEX am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE ac_ct_CC CFLAGS CC am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CXX CPPFLAGS LDFLAGS CXXFLAGS CXX host_os host_vendor host_cpu host build_os build_vendor build_cpu build AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_silent_rules enable_dependency_tracking enable_debug enable_namespaces enable_ipv6 with_openssl enable_ssl enable_gnutls enable_samples ' ac_precious_vars='build_alias host_alias target_alias CXX CXXFLAGS LDFLAGS LIBS CPPFLAGS CCC CC CFLAGS YACC YFLAGS CPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures gsoap 2.8 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX @<:@@S|@ac_default_prefix@:>@ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX @<:@PREFIX@:>@ By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root @<:@DATAROOTDIR/doc/gsoap@:>@ --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of gsoap 2.8:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") --enable-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build --enable-debug add debug symbols for debugging --disable-namespaces compile library without namespaces --enable-ipv6 compile library with IPv6 support --disable-ssl build without SSL/TLS --enable-gnutls build with GNUTLS SSL/TLS --enable-samples enable compile for the gsoap samples Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-openssl=DIR openssl installation prefix Some influential environment variables: CXX C++ compiler command CXXFLAGS C++ compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CC C compiler command CFLAGS C compiler flags YACC The `Yet Another Compiler Compiler' implementation to use. Defaults to the first program found out of: `bison -y', `byacc', `yacc'. YFLAGS The list of arguments that will be passed by default to @S|@YACC. This script will default YFLAGS to the empty string to avoid a default value of `-d' given by some make applications. CPP C preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF gsoap configure 2.8 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## @%:@ ac_fn_cxx_try_compile LINENO @%:@ ---------------------------- @%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } @%:@ ac_fn_cxx_try_compile @%:@ ac_fn_c_try_compile LINENO @%:@ -------------------------- @%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } @%:@ ac_fn_c_try_compile @%:@ ac_fn_c_try_link LINENO @%:@ ----------------------- @%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } @%:@ ac_fn_c_try_link @%:@ ac_fn_c_try_cpp LINENO @%:@ ---------------------- @%:@ Try to preprocess conftest.@S|@ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } @%:@ ac_fn_c_try_cpp @%:@ ac_fn_c_try_run LINENO @%:@ ---------------------- @%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. Assumes @%:@ that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } @%:@ ac_fn_c_try_run @%:@ ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES @%:@ ------------------------------------------------------- @%:@ Tests whether HEADER exists, giving a warning if it cannot be compiled using @%:@ the include files in INCLUDES and setting the cache variable VAR @%:@ accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 @%:@include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } @%:@ ac_fn_c_check_header_mongrel @%:@ ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES @%:@ ------------------------------------------------------- @%:@ Tests whether HEADER exists and can be compiled using the include files in @%:@ INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 @%:@include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } @%:@ ac_fn_c_check_header_compile @%:@ ac_fn_c_check_type LINENO TYPE VAR INCLUDES @%:@ ------------------------------------------- @%:@ Tests whether TYPE exists after having included INCLUDES, setting cache @%:@ variable VAR accordingly. ac_fn_c_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof ($2)) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else eval "$3=yes" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } @%:@ ac_fn_c_check_type @%:@ ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES @%:@ ---------------------------------------------------- @%:@ Tries to find if the field MEMBER exists in type AGGR, after including @%:@ INCLUDES, setting cache variable VAR accordingly. ac_fn_c_check_member () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5 $as_echo_n "checking for $2.$3... " >&6; } if eval \${$4+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main () { static $2 ac_aggr; if (ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$4=yes" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main () { static $2 ac_aggr; if (sizeof ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$4=yes" else eval "$4=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$4 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } @%:@ ac_fn_c_check_member @%:@ ac_fn_c_check_func LINENO FUNC VAR @%:@ ---------------------------------- @%:@ Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } @%:@ ac_fn_c_check_func cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by gsoap $as_me 2.8, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in @%:@(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi as_fn_append ac_header_list " sys/time.h" as_fn_append ac_header_list " unistd.h" as_fn_append ac_func_list " alarm" # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu am__api_version='1.14' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in @%:@(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null @%:@ Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='gsoap' VERSION='2.8' cat >>confdefs.h <<_ACEOF @%:@define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar pax cpio none' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 fi fi # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac # AC_CONFIG_HEADERS([config.h]) ac_config_headers="$ac_config_headers config.h" # we use subdirs. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi # Checks for programs. ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler works" >&5 $as_echo_n "checking whether the C++ compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C++ compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler default output file name" >&5 $as_echo_n "checking for C++ compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C++ compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf @%:@ Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi depcc="$CXX" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CXX_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 $as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $@%:@ != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 $as_echo_n "checking whether $CC understands -c and -o together... " >&6; } if ${am_cv_prog_cc_c_o+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 $as_echo "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi for ac_prog in flex lex do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_LEX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$LEX"; then ac_cv_prog_LEX="$LEX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_LEX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi LEX=$ac_cv_prog_LEX if test -n "$LEX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LEX" >&5 $as_echo "$LEX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$LEX" && break done test -n "$LEX" || LEX=":" if test "x$LEX" != "x:"; then cat >conftest.l <<_ACEOF %% a { ECHO; } b { REJECT; } c { yymore (); } d { yyless (1); } e { /* IRIX 6.5 flex 2.5.4 underquotes its yyless argument. */ yyless ((input () != 0)); } f { unput (yytext[0]); } . { BEGIN INITIAL; } %% #ifdef YYTEXT_POINTER extern char *yytext; #endif int main (void) { return ! yylex () + ! yywrap (); } _ACEOF { { ac_try="$LEX conftest.l" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$LEX conftest.l") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking lex output file root" >&5 $as_echo_n "checking lex output file root... " >&6; } if ${ac_cv_prog_lex_root+:} false; then : $as_echo_n "(cached) " >&6 else if test -f lex.yy.c; then ac_cv_prog_lex_root=lex.yy elif test -f lexyy.c; then ac_cv_prog_lex_root=lexyy else as_fn_error $? "cannot find output from $LEX; giving up" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_root" >&5 $as_echo "$ac_cv_prog_lex_root" >&6; } LEX_OUTPUT_ROOT=$ac_cv_prog_lex_root if test -z "${LEXLIB+set}"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking lex library" >&5 $as_echo_n "checking lex library... " >&6; } if ${ac_cv_lib_lex+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_LIBS=$LIBS ac_cv_lib_lex='none needed' for ac_lib in '' -lfl -ll; do LIBS="$ac_lib $ac_save_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ `cat $LEX_OUTPUT_ROOT.c` _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_lex=$ac_lib fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext test "$ac_cv_lib_lex" != 'none needed' && break done LIBS=$ac_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lex" >&5 $as_echo "$ac_cv_lib_lex" >&6; } test "$ac_cv_lib_lex" != 'none needed' && LEXLIB=$ac_cv_lib_lex fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether yytext is a pointer" >&5 $as_echo_n "checking whether yytext is a pointer... " >&6; } if ${ac_cv_prog_lex_yytext_pointer+:} false; then : $as_echo_n "(cached) " >&6 else # POSIX says lex can declare yytext either as a pointer or an array; the # default is implementation-dependent. Figure out which it is, since # not all implementations provide the %pointer and %array declarations. ac_cv_prog_lex_yytext_pointer=no ac_save_LIBS=$LIBS LIBS="$LEXLIB $ac_save_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define YYTEXT_POINTER 1 `cat $LEX_OUTPUT_ROOT.c` _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_prog_lex_yytext_pointer=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_yytext_pointer" >&5 $as_echo "$ac_cv_prog_lex_yytext_pointer" >&6; } if test $ac_cv_prog_lex_yytext_pointer = yes; then $as_echo "@%:@define YYTEXT_POINTER 1" >>confdefs.h fi rm -f conftest.l $LEX_OUTPUT_ROOT.c fi if test "$LEX" = :; then LEX=${am_missing_run}flex fi for ac_prog in 'bison -y' byacc do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_YACC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$YACC"; then ac_cv_prog_YACC="$YACC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_YACC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi YACC=$ac_cv_prog_YACC if test -n "$YACC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $YACC" >&5 $as_echo "$YACC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$YACC" && break done test -n "$YACC" || YACC="yacc" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@ifdef __STDC__ @%:@ include @%:@else @%:@ include @%:@endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@ifdef __STDC__ @%:@ include @%:@else @%:@ include @%:@endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi #AM_PROG_LIBTOOL { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 $as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 $as_echo "no, using $LN_S" >&6; } fi for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done # AC_DECL_YYTEXT SAMPLE_EXTRA_LIBS="-lm" # Platform-specific Makefile setup case "${host}" in *-*-solaris*) platform=SUN_OS SAMPLE_EXTRA_LIBS="-lxnet -lsocket -lnsl -lm" WSDL2H_EXTRA_LIBS="-lxnet -lsocket -lnsl -lrt" ;; *-*-sysv5*) platform=UNIXWARE ;; *-*-UnixWare*) platform=UNIXWARE ;; *-*-unixware*) platform=UNIXWARE ;; *-*-sco3.2v5*) platform=OPENSERVER SAMPLE_EXTRA_LIBS="-lsocket -lm" ;; *-*-linux*) platform=LINUX # if test x$debug = xtrue; then # CFLAGS="-g" #don't want the -O2 for debugging. # else # CFLAGS="-O2" #don't want the -g for release compile. # fi ;; *-*-cygwin*) platform=CYGWIN ;; *-*-mingw*) platform=MINGW SAMPLE_EXTRA_LIBS="-lws2_32 -lkernel32 -luser32 -lgdi32 -lm" WSDL2H_EXTRA_LIBS="-lws2_32 -lkernel32 -luser32 -lgdi32 -lm" ;; *-*-freebsd*) platform=FREEBSD ;; *-*-openbsd*) platform=OPENBSD ;; *-*-irix*) platform=IRIX ;; *-*-aix*) platform=AIX case "${host}" in *-*-aix4.1*) osver=AIX41;; *-*-aix4.2*) osver=AIX42;; *-*-aix4.3*) osver=AIX43;; *-*-aix4.*) osver=AIX43;; *-*-aix5.2) osver=AIX52;; *-*-aix5.3) osver=AIX53;; *-*-aix6.1) osver=AIX61;; esac ;; *-sequent-*) platform=PTX ;; *-*-hp*) platform=HP_UX ; case "${host}" in *-*-hpux11*) osver=HPUX11;; *-*-hpux10*) osver=HPUX10;; *) osver=HPUX11;; esac ;; *-*-mvs*) platform=OS390 ;; *-*-os400*) platform=OS400 ;; *-*-OS400*) platform=OS400 ;; *-*-osf*) platform=TRU64 ;; *-apple-*) platform=MACOSX # Appease 10.7 Lion (OpenSSL deprecated) CXXFLAGS="-Wno-deprecated-declarations" CFLAGS="-Wno-deprecated-declarations" ;; *-nto-qnx) platform=QNX SAMPLE_EXTRA_LIBS="-lsocket -lm" ;; *) platform=UNKNOWN ;; esac # Checks for header files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "@%:@define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF @%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in arpa/inet.h xlocale.h errno.h fcntl.h ctype.h limits.h float.h math.h netdb.h netinet/in.h stdlib.h string.h strings.h stdint.h inttypes.h time.h sys/inttypes.h sys/socket.h sys/types.h sys/time.h sys/timeb.h unistd.h poll.h openssl/ssl.h gnutls/gnutls.h zlib.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF @%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done # Checks for typedefs, structures, and compiler characteristics. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 $as_echo_n "checking for an ANSI C-conforming const... " >&6; } if ${ac_cv_c_const+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __cplusplus /* Ultrix mips cc rejects this sort of thing. */ typedef int charset[2]; const charset cs = { 0, 0 }; /* SunOS 4.1.1 cc rejects this. */ char const *const *pcpcc; char **ppc; /* NEC SVR4.0.2 mips cc rejects this. */ struct point {int x, y;}; static struct point const zero = {0,0}; /* AIX XL C 1.02.0.0 rejects this. It does not let you subtract one const X* pointer from another in an arm of an if-expression whose if-part is not a constant expression */ const char *g = "string"; pcpcc = &g + (g ? g-g : 0); /* HPUX 7.0 cc rejects these. */ ++pcpcc; ppc = (char**) pcpcc; pcpcc = (char const *const *) ppc; { /* SCO 3.2v4 cc rejects this sort of thing. */ char tx; char *t = &tx; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; if (s) return 0; } { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ int x[] = {25, 17}; const int *foo = &x[0]; ++foo; } { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ typedef const int *iptr; iptr p = 0; ++p; } { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ struct s { int j; const int *ap[3]; } bx; struct s *b = &bx; b->j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; if (!foo) return 0; } return !cs[0] && !zero.x; #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_const=yes else ac_cv_c_const=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 $as_echo "$ac_cv_c_const" >&6; } if test $ac_cv_c_const = no; then $as_echo "@%:@define const /**/" >>confdefs.h fi ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" if test "x$ac_cv_type_size_t" = xyes; then : else cat >>confdefs.h <<_ACEOF @%:@define size_t unsigned int _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5 $as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; } if ${ac_cv_header_time+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { if ((struct tm *) 0) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_time=yes else ac_cv_header_time=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5 $as_echo "$ac_cv_header_time" >&6; } if test $ac_cv_header_time = yes; then $as_echo "@%:@define TIME_WITH_SYS_TIME 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether struct tm is in sys/time.h or time.h" >&5 $as_echo_n "checking whether struct tm is in sys/time.h or time.h... " >&6; } if ${ac_cv_struct_tm+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { struct tm tm; int *p = &tm.tm_sec; return !p; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_struct_tm=time.h else ac_cv_struct_tm=sys/time.h fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_struct_tm" >&5 $as_echo "$ac_cv_struct_tm" >&6; } if test $ac_cv_struct_tm = sys/time.h; then $as_echo "@%:@define TM_IN_SYS_TIME 1" >>confdefs.h fi ac_fn_c_check_member "$LINENO" "struct tm" "tm_gmtoff" "ac_cv_member_struct_tm_tm_gmtoff" " #include #include " if test "x$ac_cv_member_struct_tm_tm_gmtoff" = xyes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_STRUCT_TM_TM_GMTOFF 1 _ACEOF fi ac_fn_c_check_member "$LINENO" "struct tm" "__tm_gmtoff" "ac_cv_member_struct_tm___tm_gmtoff" " #include #include " if test "x$ac_cv_member_struct_tm___tm_gmtoff" = xyes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_STRUCT_TM___TM_GMTOFF 1 _ACEOF fi # Checks for library functions. for ac_header in $ac_header_list do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF @%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in $ac_func_list do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF @%:@define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working mktime" >&5 $as_echo_n "checking for working mktime... " >&6; } if ${ac_cv_func_working_mktime+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_working_mktime=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Test program from Paul Eggert and Tony Leneis. */ #ifdef TIME_WITH_SYS_TIME # include # include #else # ifdef HAVE_SYS_TIME_H # include # else # include # endif #endif #include #include #ifdef HAVE_UNISTD_H # include #endif #ifndef HAVE_ALARM # define alarm(X) /* empty */ #endif /* Work around redefinition to rpl_putenv by other config tests. */ #undef putenv static time_t time_t_max; static time_t time_t_min; /* Values we'll use to set the TZ environment variable. */ static const char *tz_strings[] = { (const char *) 0, "TZ=GMT0", "TZ=JST-9", "TZ=EST+3EDT+2,M10.1.0/00:00:00,M2.3.0/00:00:00" }; #define N_STRINGS (sizeof (tz_strings) / sizeof (tz_strings[0])) /* Return 0 if mktime fails to convert a date in the spring-forward gap. Based on a problem report from Andreas Jaeger. */ static int spring_forward_gap () { /* glibc (up to about 1998-10-07) failed this test. */ struct tm tm; /* Use the portable POSIX.1 specification "TZ=PST8PDT,M4.1.0,M10.5.0" instead of "TZ=America/Vancouver" in order to detect the bug even on systems that don't support the Olson extension, or don't have the full zoneinfo tables installed. */ putenv ((char*) "TZ=PST8PDT,M4.1.0,M10.5.0"); tm.tm_year = 98; tm.tm_mon = 3; tm.tm_mday = 5; tm.tm_hour = 2; tm.tm_min = 0; tm.tm_sec = 0; tm.tm_isdst = -1; return mktime (&tm) != (time_t) -1; } static int mktime_test1 (time_t now) { struct tm *lt; return ! (lt = localtime (&now)) || mktime (lt) == now; } static int mktime_test (time_t now) { return (mktime_test1 (now) && mktime_test1 ((time_t) (time_t_max - now)) && mktime_test1 ((time_t) (time_t_min + now))); } static int irix_6_4_bug () { /* Based on code from Ariel Faigon. */ struct tm tm; tm.tm_year = 96; tm.tm_mon = 3; tm.tm_mday = 0; tm.tm_hour = 0; tm.tm_min = 0; tm.tm_sec = 0; tm.tm_isdst = -1; mktime (&tm); return tm.tm_mon == 2 && tm.tm_mday == 31; } static int bigtime_test (int j) { struct tm tm; time_t now; tm.tm_year = tm.tm_mon = tm.tm_mday = tm.tm_hour = tm.tm_min = tm.tm_sec = j; now = mktime (&tm); if (now != (time_t) -1) { struct tm *lt = localtime (&now); if (! (lt && lt->tm_year == tm.tm_year && lt->tm_mon == tm.tm_mon && lt->tm_mday == tm.tm_mday && lt->tm_hour == tm.tm_hour && lt->tm_min == tm.tm_min && lt->tm_sec == tm.tm_sec && lt->tm_yday == tm.tm_yday && lt->tm_wday == tm.tm_wday && ((lt->tm_isdst < 0 ? -1 : 0 < lt->tm_isdst) == (tm.tm_isdst < 0 ? -1 : 0 < tm.tm_isdst)))) return 0; } return 1; } static int year_2050_test () { /* The correct answer for 2050-02-01 00:00:00 in Pacific time, ignoring leap seconds. */ unsigned long int answer = 2527315200UL; struct tm tm; time_t t; tm.tm_year = 2050 - 1900; tm.tm_mon = 2 - 1; tm.tm_mday = 1; tm.tm_hour = tm.tm_min = tm.tm_sec = 0; tm.tm_isdst = -1; /* Use the portable POSIX.1 specification "TZ=PST8PDT,M4.1.0,M10.5.0" instead of "TZ=America/Vancouver" in order to detect the bug even on systems that don't support the Olson extension, or don't have the full zoneinfo tables installed. */ putenv ((char*) "TZ=PST8PDT,M4.1.0,M10.5.0"); t = mktime (&tm); /* Check that the result is either a failure, or close enough to the correct answer that we can assume the discrepancy is due to leap seconds. */ return (t == (time_t) -1 || (0 < t && answer - 120 <= t && t <= answer + 120)); } int main () { time_t t, delta; int i, j; /* This test makes some buggy mktime implementations loop. Give up after 60 seconds; a mktime slower than that isn't worth using anyway. */ alarm (60); for (;;) { t = (time_t_max << 1) + 1; if (t <= time_t_max) break; time_t_max = t; } time_t_min = - ((time_t) ~ (time_t) 0 == (time_t) -1) - time_t_max; delta = time_t_max / 997; /* a suitable prime number */ for (i = 0; i < N_STRINGS; i++) { if (tz_strings[i]) putenv ((char*) tz_strings[i]); for (t = 0; t <= time_t_max - delta; t += delta) if (! mktime_test (t)) return 1; if (! (mktime_test ((time_t) 1) && mktime_test ((time_t) (60 * 60)) && mktime_test ((time_t) (60 * 60 * 24)))) return 1; for (j = 1; ; j <<= 1) if (! bigtime_test (j)) return 1; else if (INT_MAX / 2 < j) break; if (! bigtime_test (INT_MAX)) return 1; } return ! (irix_6_4_bug () && spring_forward_gap () && year_2050_test ()); } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_working_mktime=yes else ac_cv_func_working_mktime=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_working_mktime" >&5 $as_echo "$ac_cv_func_working_mktime" >&6; } if test $ac_cv_func_working_mktime = no; then case " $LIB@&t@OBJS " in *" mktime.$ac_objext "* ) ;; *) LIB@&t@OBJS="$LIB@&t@OBJS mktime.$ac_objext" ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking return type of signal handlers" >&5 $as_echo_n "checking return type of signal handlers... " >&6; } if ${ac_cv_type_signal+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { return *(signal (0, 0)) (0) == 1; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_type_signal=int else ac_cv_type_signal=void fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_signal" >&5 $as_echo "$ac_cv_type_signal" >&6; } cat >>confdefs.h <<_ACEOF @%:@define RETSIGTYPE $ac_cv_type_signal _ACEOF for ac_func in strftime do : ac_fn_c_check_func "$LINENO" "strftime" "ac_cv_func_strftime" if test "x$ac_cv_func_strftime" = xyes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_STRFTIME 1 _ACEOF else # strftime is in -lintl on SCO UNIX. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for strftime in -lintl" >&5 $as_echo_n "checking for strftime in -lintl... " >&6; } if ${ac_cv_lib_intl_strftime+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char strftime (); int main () { return strftime (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_strftime=yes else ac_cv_lib_intl_strftime=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_strftime" >&5 $as_echo "$ac_cv_lib_intl_strftime" >&6; } if test "x$ac_cv_lib_intl_strftime" = xyes; then : $as_echo "@%:@define HAVE_STRFTIME 1" >>confdefs.h LIBS="-lintl $LIBS" fi fi done for ac_func in random gettimeofday ftime localtime_r timegm gmtime gmtime_r memset select socket snprintf strchr strerror strerror_r strlcpy strrchr strstr strtol strtoul strtoll strtoull strtold strtod strtof strtold_l strtod_l strtof_l sscanf sscanf_l snprintf sprintf_l wctomb mbtowc poll do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF @%:@define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done # Checks for isnan and isinf ac_fn_c_check_func "$LINENO" "isnan" "ac_cv_func_isnan" if test "x$ac_cv_func_isnan" = xyes; then : has_isnan=1; $as_echo "@%:@define HAVE_ISNAN 1" >>confdefs.h else has_isnan=0 fi ac_fn_c_check_func "$LINENO" "isinf" "ac_cv_func_isinf" if test "x$ac_cv_func_isinf" = xyes; then : has_isinf=1; $as_echo "@%:@define HAVE_ISINF 1" >>confdefs.h else has_isinf=0 fi # check for macro isnan in math if test $has_isnan = 0; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for macro isnan" >&5 $as_echo_n "checking for macro isnan... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { { int foo; foo = isnan(0); } ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : has_isnan=1 else has_isnan=0 fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test $has_isnan = 1; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "@%:@define HAVE_ISNAN 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi # check for macro isinf in math if test $has_isinf = 0; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for macro isinf" >&5 $as_echo_n "checking for macro isinf... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { { int foo; foo = isinf(0); } ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : has_isinf=1 else has_isinf=0 fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test $has_isinf = 1; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "@%:@define HAVE_ISINF 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi # Function test depending on platform # AIX Has incompatible gethostbyname_r if test $platform != AIX -a $platform != TRU64; then for ac_func in gethostbyname_r do : ac_fn_c_check_func "$LINENO" "gethostbyname_r" "ac_cv_func_gethostbyname_r" if test "x$ac_cv_func_gethostbyname_r" = xyes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_GETHOSTBYNAME_R 1 _ACEOF fi done for ac_header in stdlib.h do : ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" if test "x$ac_cv_header_stdlib_h" = xyes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_STDLIB_H 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU libc compatible malloc" >&5 $as_echo_n "checking for GNU libc compatible malloc... " >&6; } if ${ac_cv_func_malloc_0_nonnull+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_malloc_0_nonnull=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined STDC_HEADERS || defined HAVE_STDLIB_H # include #else char *malloc (); #endif int main () { return ! malloc (0); ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_malloc_0_nonnull=yes else ac_cv_func_malloc_0_nonnull=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_malloc_0_nonnull" >&5 $as_echo "$ac_cv_func_malloc_0_nonnull" >&6; } if test $ac_cv_func_malloc_0_nonnull = yes; then : $as_echo "@%:@define HAVE_MALLOC 1" >>confdefs.h else $as_echo "@%:@define HAVE_MALLOC 0" >>confdefs.h case " $LIB@&t@OBJS " in *" malloc.$ac_objext "* ) ;; *) LIB@&t@OBJS="$LIB@&t@OBJS malloc.$ac_objext" ;; esac $as_echo "@%:@define malloc rpl_malloc" >>confdefs.h fi fi # the debug build options adds symbols to compiler output (-g for g++) @%:@ Check whether --enable-debug was given. if test "${enable_debug+set}" = set; then : enableval=$enable_debug; case "${enableval}" in yes) debug=true ;; no) debug=false ;; *) as_fn_error $? "bad value ${enableval} for --enable-debug" "$LINENO" 5 ;; esac else debug=false fi if test x$debug = xtrue; then DEBUG_COMPILE_TRUE= DEBUG_COMPILE_FALSE='#' else DEBUG_COMPILE_TRUE='#' DEBUG_COMPILE_FALSE= fi if test x$debug = xtrue; then SOAPCPP2_DEBUG="-DDEBUG" ##define DEBUG for debugging else SOAPCPP2_DEBUG= fi # set the default soapcpp2 import path SOAPCPP2_IMPORTPATH="-DSOAPCPP2_IMPORT_PATH=\"\\\"${datadir}/gsoap/import\\\"\"" #SOAPCPP2_IMPORTPATH="-DSOAPCPP2_IMPORT_PATH=\"\\\"`pwd`/gsoap/import\\\"\"" # set the default wsdl2h import path WSDL2H_IMPORTPATH="-DWSDL2H_IMPORT_PATH=\"\\\"${datadir}/gsoap/WS\\\"\"" #WSDL2H_IMPORTPATH="-DWSDL2H_IMPORT_PATH=\"\\\"`pwd`/gsoap/WS\\\"\"" # the disable-namespaces option adds the -DWITH_NONAMESPACES to the # library compilation thus disabling namespaces @%:@ Check whether --enable-namespaces was given. if test "${enable_namespaces+set}" = set; then : enableval=$enable_namespaces; with_namespaces="$enable_ns" else with_namespaces="yes" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for disable namespaces in library" >&5 $as_echo_n "checking for disable namespaces in library... " >&6; } if test "x$with_namespaces" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SOAPCPP2_NONAMESPACES="-DWITH_NONAMESPACES" ##define to remove nsmap link dependence fi # the enable-ipv6 option adds the -DWITH_IPV6 to the # library compilation thus enabling IPv6 @%:@ Check whether --enable-ipv6 was given. if test "${enable_ipv6+set}" = set; then : enableval=$enable_ipv6; with_ipv6="$enable_ipv6" else with_ipv6="no" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for enable ipv6 in library" >&5 $as_echo_n "checking for enable ipv6 in library... " >&6; } if test "x$with_ipv6" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SOAPCPP2_IPV6="-DWITH_IPV6 -DWITH_NO_IPV6_V6ONLY" ##define to add IPv6 support else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # the OpenSSL installation prefix path @%:@ Check whether --with-openssl was given. if test "${with_openssl+set}" = set; then : withval=$with_openssl; OPENSSL=$withval fi # the disable-ssl option removes the dependence on OpenSSL @%:@ Check whether --enable-ssl was given. if test "${enable_ssl+set}" = set; then : enableval=$enable_ssl; with_openssl="$enable_openssl" else with_openssl="yes" fi # the enable-gnutls option enables GNUTLS in favor of OpenSSL @%:@ Check whether --enable-gnutls was given. if test "${enable_gnutls+set}" = set; then : enableval=$enable_gnutls; with_gnutls="$enable_gnutls" else with_gnutls="no" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for disable openssl in library" >&5 $as_echo_n "checking for disable openssl in library... " >&6; } if test "x$with_openssl" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for enable gnutls in library" >&5 $as_echo_n "checking for enable gnutls in library... " >&6; } if test "x$with_gnutls" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } WSDL2H_EXTRA_FLAGS="-DWITH_GNUTLS -DWITH_GZIP" WSDL2H_EXTRA_LIBS="${WSDL2H_EXTRA_LIBS} -lgnutls -lgcrypt -lgpg-error -lz" SAMPLE_INCLUDES= SAMPLE_SSL_LIBS="-lgnutls -lgcrypt -lgpg-error -lz" WSDL2H_SOAP_CPP_LIB="libgsoapssl++.a" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } WSDL2H_EXTRA_FLAGS="-DWITH_OPENSSL -DWITH_GZIP" # an ugly hack to get httpda and md5evp plugins to conditionally # compile with wsdl2h when OPENSSL is available WSDL2H_EXTRA_LIBS="${WSDL2H_EXTRA_LIBS} ../plugin/httpda.c ../plugin/md5evp.c ../plugin/threads.c -lssl -lcrypto -lz" SAMPLE_INCLUDES= SAMPLE_SSL_LIBS="-lssl -lcrypto -lz" WSDL2H_SOAP_CPP_LIB="libgsoapssl++.a" fi if test -n "$OPENSSL"; then WSDL2H_EXTRA_FLAGS="-I${OPENSSL}/include ${WSDL2H_EXTRA_FLAGS}" WSDL2H_EXTRA_LIBS="-L${OPENSSL}/lib ${WSDL2H_EXTRA_LIBS}" SAMPLE_INCLUDES="-I${OPENSSL}/include" SAMPLE_SSL_LIBS="-L${OPENSSL}/lib ${SAMPLE_SSL_LIBS}" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } WSDL2H_EXTRA_FLAGS= SAMPLE_SSL_LIBS= SAMPLE_INCLUDES= WSDL2H_SOAP_CPP_LIB="libgsoap++.a" fi # enable the compile of the samples @%:@ Check whether --enable-samples was given. if test "${enable_samples+set}" = set; then : enableval=$enable_samples; case "${enableval}" in yes) samples=true ;; no) samples=false ;; *) as_fn_error $? "bad value ${enableval} for --enable-samples" "$LINENO" 5 ;; esac else samples=false fi if test x$samples = xtrue; then ENABLE_SAMPLES_TRUE= ENABLE_SAMPLES_FALSE='#' else ENABLE_SAMPLES_TRUE='#' ENABLE_SAMPLES_FALSE= fi if test x$samples = xtrue; then SAMPLE_DIRS=". samples" else SAMPLE_DIRS= fi if test x$LEX = xflex; then LEX_DEFINE=-DWITH_FLEX LEX_FLAGS="-l" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: No 'flex' command detected on current path: trying existing scanner" >&5 $as_echo "$as_me: WARNING: No 'flex' command detected on current path: trying existing scanner" >&2;} LEX_DEFINE=-DWITH_LEX LEX_FLAGS= fi # check if we must define -DWITH_BISON if test "$YACC" = "bison -y"; then BISON_DEFINE=-DWITH_BISON YACC_LIB= else BISON_DEFINE=-DWITH_YACC YACC_LIB="-ly" fi ac_config_files="$ac_config_files Makefile gsoap.pc gsoap++.pc gsoapck.pc gsoapck++.pc gsoapssl.pc gsoapssl++.pc gsoap/Makefile gsoap/src/Makefile gsoap/wsdl/Makefile gsoap/samples/Makefile gsoap/samples/autotest/Makefile gsoap/samples/calc/Makefile gsoap/samples/calc++/Makefile gsoap/samples/chaining/Makefile gsoap/samples/chaining++/Makefile gsoap/samples/databinding/Makefile gsoap/samples/dime/Makefile gsoap/samples/dom/Makefile gsoap/samples/oneway/Makefile gsoap/samples/oneway++/Makefile gsoap/samples/factory/Makefile gsoap/samples/factorytest/Makefile gsoap/samples/gmt/Makefile gsoap/samples/googleapi/Makefile gsoap/samples/hello/Makefile gsoap/samples/httpcookies/Makefile gsoap/samples/lu/Makefile gsoap/samples/magic/Makefile gsoap/samples/mashup/Makefile gsoap/samples/mashup++/Makefile gsoap/samples/mtom/Makefile gsoap/samples/mtom-stream/Makefile gsoap/samples/polytest/Makefile gsoap/samples/primes/Makefile gsoap/samples/roll/Makefile gsoap/samples/router/Makefile gsoap/samples/rss/Makefile gsoap/samples/ssl/Makefile gsoap/samples/template/Makefile gsoap/samples/udp/Makefile gsoap/samples/varparam/Makefile gsoap/samples/wsa/Makefile gsoap/samples/wsrm/Makefile gsoap/samples/wsse/Makefile gsoap/samples/xml-rpc-json/Makefile gsoap/samples/rest/Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= for ac_i in : $LIB@&t@OBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIB@&t@OBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs { $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 $as_echo_n "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 $as_echo "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${DEBUG_COMPILE_TRUE}" && test -z "${DEBUG_COMPILE_FALSE}"; then as_fn_error $? "conditional \"DEBUG_COMPILE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_SAMPLES_TRUE}" && test -z "${ENABLE_SAMPLES_FALSE}"; then as_fn_error $? "conditional \"ENABLE_SAMPLES\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in @%:@( *posix*) : set -o posix ;; @%:@( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in @%:@( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in @%:@(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH @%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] @%:@ ---------------------------------------- @%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are @%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the @%:@ script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } @%:@ as_fn_error @%:@ as_fn_set_status STATUS @%:@ ----------------------- @%:@ Set @S|@? to STATUS, without forking. as_fn_set_status () { return $1 } @%:@ as_fn_set_status @%:@ as_fn_exit STATUS @%:@ ----------------- @%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } @%:@ as_fn_exit @%:@ as_fn_unset VAR @%:@ --------------- @%:@ Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset @%:@ as_fn_append VAR VALUE @%:@ ---------------------- @%:@ Append the text in VALUE to the end of the definition contained in VAR. Take @%:@ advantage of any shell optimizations that allow amortized linear growth over @%:@ repeated appends, instead of the typical quadratic growth present in naive @%:@ implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append @%:@ as_fn_arith ARG... @%:@ ------------------ @%:@ Perform arithmetic evaluation on the ARGs, and store the result in the @%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments @%:@ must be portable across @S|@(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in @%:@((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null @%:@ as_fn_mkdir_p @%:@ ------------- @%:@ Create "@S|@as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } @%:@ as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi @%:@ as_fn_executable_p FILE @%:@ ----------------------- @%:@ Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } @%:@ as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by gsoap $as_me 2.8, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ gsoap config.status 2.8 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../@%:@@%:@ /;s/...$/ @%:@@%:@/;p;x;p;x' <<_ASBOX @%:@@%:@ Running $as_me. @%:@@%:@ _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "gsoap.pc") CONFIG_FILES="$CONFIG_FILES gsoap.pc" ;; "gsoap++.pc") CONFIG_FILES="$CONFIG_FILES gsoap++.pc" ;; "gsoapck.pc") CONFIG_FILES="$CONFIG_FILES gsoapck.pc" ;; "gsoapck++.pc") CONFIG_FILES="$CONFIG_FILES gsoapck++.pc" ;; "gsoapssl.pc") CONFIG_FILES="$CONFIG_FILES gsoapssl.pc" ;; "gsoapssl++.pc") CONFIG_FILES="$CONFIG_FILES gsoapssl++.pc" ;; "gsoap/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/Makefile" ;; "gsoap/src/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/src/Makefile" ;; "gsoap/wsdl/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/wsdl/Makefile" ;; "gsoap/samples/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/Makefile" ;; "gsoap/samples/autotest/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/autotest/Makefile" ;; "gsoap/samples/calc/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/calc/Makefile" ;; "gsoap/samples/calc++/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/calc++/Makefile" ;; "gsoap/samples/chaining/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/chaining/Makefile" ;; "gsoap/samples/chaining++/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/chaining++/Makefile" ;; "gsoap/samples/databinding/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/databinding/Makefile" ;; "gsoap/samples/dime/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/dime/Makefile" ;; "gsoap/samples/dom/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/dom/Makefile" ;; "gsoap/samples/oneway/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/oneway/Makefile" ;; "gsoap/samples/oneway++/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/oneway++/Makefile" ;; "gsoap/samples/factory/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/factory/Makefile" ;; "gsoap/samples/factorytest/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/factorytest/Makefile" ;; "gsoap/samples/gmt/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/gmt/Makefile" ;; "gsoap/samples/googleapi/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/googleapi/Makefile" ;; "gsoap/samples/hello/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/hello/Makefile" ;; "gsoap/samples/httpcookies/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/httpcookies/Makefile" ;; "gsoap/samples/lu/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/lu/Makefile" ;; "gsoap/samples/magic/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/magic/Makefile" ;; "gsoap/samples/mashup/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/mashup/Makefile" ;; "gsoap/samples/mashup++/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/mashup++/Makefile" ;; "gsoap/samples/mtom/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/mtom/Makefile" ;; "gsoap/samples/mtom-stream/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/mtom-stream/Makefile" ;; "gsoap/samples/polytest/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/polytest/Makefile" ;; "gsoap/samples/primes/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/primes/Makefile" ;; "gsoap/samples/roll/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/roll/Makefile" ;; "gsoap/samples/router/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/router/Makefile" ;; "gsoap/samples/rss/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/rss/Makefile" ;; "gsoap/samples/ssl/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/ssl/Makefile" ;; "gsoap/samples/template/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/template/Makefile" ;; "gsoap/samples/udp/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/udp/Makefile" ;; "gsoap/samples/varparam/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/varparam/Makefile" ;; "gsoap/samples/wsa/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/wsa/Makefile" ;; "gsoap/samples/wsrm/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/wsrm/Makefile" ;; "gsoap/samples/wsse/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/wsse/Makefile" ;; "gsoap/samples/xml-rpc-json/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/xml-rpc-json/Makefile" ;; "gsoap/samples/rest/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/rest/Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi gsoap-2.8.28/autom4te.cache/traces.30000644000175000017500000014414212653650144016451 0ustar ellertellertm4trace:configure.ac:2: -1- AC_INIT([gsoap], [2.8]) m4trace:configure.ac:2: -1- m4_pattern_forbid([^_?A[CHUM]_]) m4trace:configure.ac:2: -1- m4_pattern_forbid([_AC_]) m4trace:configure.ac:2: -1- m4_pattern_forbid([^LIBOBJS$], [do not use LIBOBJS directly, use AC_LIBOBJ (see section `AC_LIBOBJ vs LIBOBJS']) m4trace:configure.ac:2: -1- m4_pattern_allow([^AS_FLAGS$]) m4trace:configure.ac:2: -1- m4_pattern_forbid([^_?m4_]) m4trace:configure.ac:2: -1- m4_pattern_forbid([^dnl$]) m4trace:configure.ac:2: -1- m4_pattern_forbid([^_?AS_]) m4trace:configure.ac:2: -1- AC_SUBST([SHELL]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([SHELL]) m4trace:configure.ac:2: -1- m4_pattern_allow([^SHELL$]) m4trace:configure.ac:2: -1- AC_SUBST([PATH_SEPARATOR]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([PATH_SEPARATOR]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PATH_SEPARATOR$]) m4trace:configure.ac:2: -1- AC_SUBST([PACKAGE_NAME], [m4_ifdef([AC_PACKAGE_NAME], ['AC_PACKAGE_NAME'])]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([PACKAGE_NAME]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_NAME$]) m4trace:configure.ac:2: -1- AC_SUBST([PACKAGE_TARNAME], [m4_ifdef([AC_PACKAGE_TARNAME], ['AC_PACKAGE_TARNAME'])]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([PACKAGE_TARNAME]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) m4trace:configure.ac:2: -1- AC_SUBST([PACKAGE_VERSION], [m4_ifdef([AC_PACKAGE_VERSION], ['AC_PACKAGE_VERSION'])]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([PACKAGE_VERSION]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_VERSION$]) m4trace:configure.ac:2: -1- AC_SUBST([PACKAGE_STRING], [m4_ifdef([AC_PACKAGE_STRING], ['AC_PACKAGE_STRING'])]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([PACKAGE_STRING]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_STRING$]) m4trace:configure.ac:2: -1- AC_SUBST([PACKAGE_BUGREPORT], [m4_ifdef([AC_PACKAGE_BUGREPORT], ['AC_PACKAGE_BUGREPORT'])]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([PACKAGE_BUGREPORT]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) m4trace:configure.ac:2: -1- AC_SUBST([PACKAGE_URL], [m4_ifdef([AC_PACKAGE_URL], ['AC_PACKAGE_URL'])]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([PACKAGE_URL]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_URL$]) m4trace:configure.ac:2: -1- AC_SUBST([exec_prefix], [NONE]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([exec_prefix]) m4trace:configure.ac:2: -1- m4_pattern_allow([^exec_prefix$]) m4trace:configure.ac:2: -1- AC_SUBST([prefix], [NONE]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([prefix]) m4trace:configure.ac:2: -1- m4_pattern_allow([^prefix$]) m4trace:configure.ac:2: -1- AC_SUBST([program_transform_name], [s,x,x,]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([program_transform_name]) m4trace:configure.ac:2: -1- m4_pattern_allow([^program_transform_name$]) m4trace:configure.ac:2: -1- AC_SUBST([bindir], ['${exec_prefix}/bin']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([bindir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^bindir$]) m4trace:configure.ac:2: -1- AC_SUBST([sbindir], ['${exec_prefix}/sbin']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([sbindir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^sbindir$]) m4trace:configure.ac:2: -1- AC_SUBST([libexecdir], ['${exec_prefix}/libexec']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([libexecdir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^libexecdir$]) m4trace:configure.ac:2: -1- AC_SUBST([datarootdir], ['${prefix}/share']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([datarootdir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^datarootdir$]) m4trace:configure.ac:2: -1- AC_SUBST([datadir], ['${datarootdir}']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([datadir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^datadir$]) m4trace:configure.ac:2: -1- AC_SUBST([sysconfdir], ['${prefix}/etc']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([sysconfdir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^sysconfdir$]) m4trace:configure.ac:2: -1- AC_SUBST([sharedstatedir], ['${prefix}/com']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([sharedstatedir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^sharedstatedir$]) m4trace:configure.ac:2: -1- AC_SUBST([localstatedir], ['${prefix}/var']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([localstatedir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^localstatedir$]) m4trace:configure.ac:2: -1- AC_SUBST([includedir], ['${prefix}/include']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([includedir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^includedir$]) m4trace:configure.ac:2: -1- AC_SUBST([oldincludedir], ['/usr/include']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([oldincludedir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^oldincludedir$]) m4trace:configure.ac:2: -1- AC_SUBST([docdir], [m4_ifset([AC_PACKAGE_TARNAME], ['${datarootdir}/doc/${PACKAGE_TARNAME}'], ['${datarootdir}/doc/${PACKAGE}'])]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([docdir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^docdir$]) m4trace:configure.ac:2: -1- AC_SUBST([infodir], ['${datarootdir}/info']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([infodir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^infodir$]) m4trace:configure.ac:2: -1- AC_SUBST([htmldir], ['${docdir}']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([htmldir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^htmldir$]) m4trace:configure.ac:2: -1- AC_SUBST([dvidir], ['${docdir}']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([dvidir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^dvidir$]) m4trace:configure.ac:2: -1- AC_SUBST([pdfdir], ['${docdir}']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([pdfdir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^pdfdir$]) m4trace:configure.ac:2: -1- AC_SUBST([psdir], ['${docdir}']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([psdir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^psdir$]) m4trace:configure.ac:2: -1- AC_SUBST([libdir], ['${exec_prefix}/lib']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([libdir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^libdir$]) m4trace:configure.ac:2: -1- AC_SUBST([localedir], ['${datarootdir}/locale']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([localedir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^localedir$]) m4trace:configure.ac:2: -1- AC_SUBST([mandir], ['${datarootdir}/man']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([mandir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^mandir$]) m4trace:configure.ac:2: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_NAME]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_NAME$]) m4trace:configure.ac:2: -1- AH_OUTPUT([PACKAGE_NAME], [/* Define to the full name of this package. */ @%:@undef PACKAGE_NAME]) m4trace:configure.ac:2: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_TARNAME]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) m4trace:configure.ac:2: -1- AH_OUTPUT([PACKAGE_TARNAME], [/* Define to the one symbol short name of this package. */ @%:@undef PACKAGE_TARNAME]) m4trace:configure.ac:2: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_VERSION]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_VERSION$]) m4trace:configure.ac:2: -1- AH_OUTPUT([PACKAGE_VERSION], [/* Define to the version of this package. */ @%:@undef PACKAGE_VERSION]) m4trace:configure.ac:2: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_STRING]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_STRING$]) m4trace:configure.ac:2: -1- AH_OUTPUT([PACKAGE_STRING], [/* Define to the full name and version of this package. */ @%:@undef PACKAGE_STRING]) m4trace:configure.ac:2: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_BUGREPORT]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) m4trace:configure.ac:2: -1- AH_OUTPUT([PACKAGE_BUGREPORT], [/* Define to the address where bug reports for this package should be sent. */ @%:@undef PACKAGE_BUGREPORT]) m4trace:configure.ac:2: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_URL]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_URL$]) m4trace:configure.ac:2: -1- AH_OUTPUT([PACKAGE_URL], [/* Define to the home page for this package. */ @%:@undef PACKAGE_URL]) m4trace:configure.ac:2: -1- AC_SUBST([DEFS]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([DEFS]) m4trace:configure.ac:2: -1- m4_pattern_allow([^DEFS$]) m4trace:configure.ac:2: -1- AC_SUBST([ECHO_C]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([ECHO_C]) m4trace:configure.ac:2: -1- m4_pattern_allow([^ECHO_C$]) m4trace:configure.ac:2: -1- AC_SUBST([ECHO_N]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([ECHO_N]) m4trace:configure.ac:2: -1- m4_pattern_allow([^ECHO_N$]) m4trace:configure.ac:2: -1- AC_SUBST([ECHO_T]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([ECHO_T]) m4trace:configure.ac:2: -1- m4_pattern_allow([^ECHO_T$]) m4trace:configure.ac:2: -1- AC_SUBST([LIBS]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([LIBS]) m4trace:configure.ac:2: -1- m4_pattern_allow([^LIBS$]) m4trace:configure.ac:2: -1- AC_SUBST([build_alias]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([build_alias]) m4trace:configure.ac:2: -1- m4_pattern_allow([^build_alias$]) m4trace:configure.ac:2: -1- AC_SUBST([host_alias]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([host_alias]) m4trace:configure.ac:2: -1- m4_pattern_allow([^host_alias$]) m4trace:configure.ac:2: -1- AC_SUBST([target_alias]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([target_alias]) m4trace:configure.ac:2: -1- m4_pattern_allow([^target_alias$]) m4trace:configure.ac:3: -1- AM_INIT_AUTOMAKE([foreign]) m4trace:configure.ac:3: -1- m4_pattern_allow([^AM_[A-Z]+FLAGS$]) m4trace:configure.ac:3: -1- AM_AUTOMAKE_VERSION([1.14]) m4trace:configure.ac:3: -1- AC_REQUIRE_AUX_FILE([install-sh]) m4trace:configure.ac:3: -1- AC_SUBST([INSTALL_PROGRAM]) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([INSTALL_PROGRAM]) m4trace:configure.ac:3: -1- m4_pattern_allow([^INSTALL_PROGRAM$]) m4trace:configure.ac:3: -1- AC_SUBST([INSTALL_SCRIPT]) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([INSTALL_SCRIPT]) m4trace:configure.ac:3: -1- m4_pattern_allow([^INSTALL_SCRIPT$]) m4trace:configure.ac:3: -1- AC_SUBST([INSTALL_DATA]) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([INSTALL_DATA]) m4trace:configure.ac:3: -1- m4_pattern_allow([^INSTALL_DATA$]) m4trace:configure.ac:3: -1- AC_SUBST([am__isrc], [' -I$(srcdir)']) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([am__isrc]) m4trace:configure.ac:3: -1- m4_pattern_allow([^am__isrc$]) m4trace:configure.ac:3: -1- _AM_SUBST_NOTMAKE([am__isrc]) m4trace:configure.ac:3: -1- AC_SUBST([CYGPATH_W]) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([CYGPATH_W]) m4trace:configure.ac:3: -1- m4_pattern_allow([^CYGPATH_W$]) m4trace:configure.ac:3: -1- AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME']) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([PACKAGE]) m4trace:configure.ac:3: -1- m4_pattern_allow([^PACKAGE$]) m4trace:configure.ac:3: -1- AC_SUBST([VERSION], ['AC_PACKAGE_VERSION']) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([VERSION]) m4trace:configure.ac:3: -1- m4_pattern_allow([^VERSION$]) m4trace:configure.ac:3: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE]) m4trace:configure.ac:3: -1- m4_pattern_allow([^PACKAGE$]) m4trace:configure.ac:3: -1- AH_OUTPUT([PACKAGE], [/* Name of package */ @%:@undef PACKAGE]) m4trace:configure.ac:3: -1- AC_DEFINE_TRACE_LITERAL([VERSION]) m4trace:configure.ac:3: -1- m4_pattern_allow([^VERSION$]) m4trace:configure.ac:3: -1- AH_OUTPUT([VERSION], [/* Version number of package */ @%:@undef VERSION]) m4trace:configure.ac:3: -1- AC_REQUIRE_AUX_FILE([missing]) m4trace:configure.ac:3: -1- AC_SUBST([ACLOCAL]) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([ACLOCAL]) m4trace:configure.ac:3: -1- m4_pattern_allow([^ACLOCAL$]) m4trace:configure.ac:3: -1- AC_SUBST([AUTOCONF]) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([AUTOCONF]) m4trace:configure.ac:3: -1- m4_pattern_allow([^AUTOCONF$]) m4trace:configure.ac:3: -1- AC_SUBST([AUTOMAKE]) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([AUTOMAKE]) m4trace:configure.ac:3: -1- m4_pattern_allow([^AUTOMAKE$]) m4trace:configure.ac:3: -1- AC_SUBST([AUTOHEADER]) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([AUTOHEADER]) m4trace:configure.ac:3: -1- m4_pattern_allow([^AUTOHEADER$]) m4trace:configure.ac:3: -1- AC_SUBST([MAKEINFO]) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([MAKEINFO]) m4trace:configure.ac:3: -1- m4_pattern_allow([^MAKEINFO$]) m4trace:configure.ac:3: -1- AC_SUBST([install_sh]) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([install_sh]) m4trace:configure.ac:3: -1- m4_pattern_allow([^install_sh$]) m4trace:configure.ac:3: -1- AC_SUBST([STRIP]) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([STRIP]) m4trace:configure.ac:3: -1- m4_pattern_allow([^STRIP$]) m4trace:configure.ac:3: -1- AC_SUBST([INSTALL_STRIP_PROGRAM]) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([INSTALL_STRIP_PROGRAM]) m4trace:configure.ac:3: -1- m4_pattern_allow([^INSTALL_STRIP_PROGRAM$]) m4trace:configure.ac:3: -1- AC_REQUIRE_AUX_FILE([install-sh]) m4trace:configure.ac:3: -1- AC_SUBST([MKDIR_P]) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([MKDIR_P]) m4trace:configure.ac:3: -1- m4_pattern_allow([^MKDIR_P$]) m4trace:configure.ac:3: -1- AC_SUBST([mkdir_p], ['$(MKDIR_P)']) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([mkdir_p]) m4trace:configure.ac:3: -1- m4_pattern_allow([^mkdir_p$]) m4trace:configure.ac:3: -1- AC_SUBST([AWK]) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([AWK]) m4trace:configure.ac:3: -1- m4_pattern_allow([^AWK$]) m4trace:configure.ac:3: -1- AC_SUBST([SET_MAKE]) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([SET_MAKE]) m4trace:configure.ac:3: -1- m4_pattern_allow([^SET_MAKE$]) m4trace:configure.ac:3: -1- AC_SUBST([am__leading_dot]) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([am__leading_dot]) m4trace:configure.ac:3: -1- m4_pattern_allow([^am__leading_dot$]) m4trace:configure.ac:3: -1- AC_SUBST([AMTAR], ['$${TAR-tar}']) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([AMTAR]) m4trace:configure.ac:3: -1- m4_pattern_allow([^AMTAR$]) m4trace:configure.ac:3: -1- AC_SUBST([am__tar]) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([am__tar]) m4trace:configure.ac:3: -1- m4_pattern_allow([^am__tar$]) m4trace:configure.ac:3: -1- AC_SUBST([am__untar]) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([am__untar]) m4trace:configure.ac:3: -1- m4_pattern_allow([^am__untar$]) m4trace:configure.ac:3: -1- AM_SILENT_RULES m4trace:configure.ac:3: -1- AC_SUBST([AM_V]) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([AM_V]) m4trace:configure.ac:3: -1- m4_pattern_allow([^AM_V$]) m4trace:configure.ac:3: -1- _AM_SUBST_NOTMAKE([AM_V]) m4trace:configure.ac:3: -1- AC_SUBST([AM_DEFAULT_V]) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([AM_DEFAULT_V]) m4trace:configure.ac:3: -1- m4_pattern_allow([^AM_DEFAULT_V$]) m4trace:configure.ac:3: -1- _AM_SUBST_NOTMAKE([AM_DEFAULT_V]) m4trace:configure.ac:3: -1- AC_SUBST([AM_DEFAULT_VERBOSITY]) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([AM_DEFAULT_VERBOSITY]) m4trace:configure.ac:3: -1- m4_pattern_allow([^AM_DEFAULT_VERBOSITY$]) m4trace:configure.ac:3: -1- AC_SUBST([AM_BACKSLASH]) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([AM_BACKSLASH]) m4trace:configure.ac:3: -1- m4_pattern_allow([^AM_BACKSLASH$]) m4trace:configure.ac:3: -1- _AM_SUBST_NOTMAKE([AM_BACKSLASH]) m4trace:configure.ac:5: -1- AC_CANONICAL_HOST m4trace:configure.ac:5: -1- AC_CANONICAL_BUILD m4trace:configure.ac:5: -1- AC_REQUIRE_AUX_FILE([config.sub]) m4trace:configure.ac:5: -1- AC_REQUIRE_AUX_FILE([config.guess]) m4trace:configure.ac:5: -1- AC_SUBST([build], [$ac_cv_build]) m4trace:configure.ac:5: -1- AC_SUBST_TRACE([build]) m4trace:configure.ac:5: -1- m4_pattern_allow([^build$]) m4trace:configure.ac:5: -1- AC_SUBST([build_cpu], [$[1]]) m4trace:configure.ac:5: -1- AC_SUBST_TRACE([build_cpu]) m4trace:configure.ac:5: -1- m4_pattern_allow([^build_cpu$]) m4trace:configure.ac:5: -1- AC_SUBST([build_vendor], [$[2]]) m4trace:configure.ac:5: -1- AC_SUBST_TRACE([build_vendor]) m4trace:configure.ac:5: -1- m4_pattern_allow([^build_vendor$]) m4trace:configure.ac:5: -1- AC_SUBST([build_os]) m4trace:configure.ac:5: -1- AC_SUBST_TRACE([build_os]) m4trace:configure.ac:5: -1- m4_pattern_allow([^build_os$]) m4trace:configure.ac:5: -1- AC_SUBST([host], [$ac_cv_host]) m4trace:configure.ac:5: -1- AC_SUBST_TRACE([host]) m4trace:configure.ac:5: -1- m4_pattern_allow([^host$]) m4trace:configure.ac:5: -1- AC_SUBST([host_cpu], [$[1]]) m4trace:configure.ac:5: -1- AC_SUBST_TRACE([host_cpu]) m4trace:configure.ac:5: -1- m4_pattern_allow([^host_cpu$]) m4trace:configure.ac:5: -1- AC_SUBST([host_vendor], [$[2]]) m4trace:configure.ac:5: -1- AC_SUBST_TRACE([host_vendor]) m4trace:configure.ac:5: -1- m4_pattern_allow([^host_vendor$]) m4trace:configure.ac:5: -1- AC_SUBST([host_os]) m4trace:configure.ac:5: -1- AC_SUBST_TRACE([host_os]) m4trace:configure.ac:5: -1- m4_pattern_allow([^host_os$]) m4trace:configure.ac:8: -1- _m4_warn([obsolete], ['AM_CONFIG_HEADER': this macro is obsolete. You should use the 'AC_CONFIG_HEADERS' macro instead.], [aclocal.m4:766: AM_CONFIG_HEADER is expanded from... configure.ac:8: the top level]) m4trace:configure.ac:8: -1- AC_CONFIG_HEADERS([config.h]) m4trace:configure.ac:11: -1- AC_SUBST([SET_MAKE]) m4trace:configure.ac:11: -1- AC_SUBST_TRACE([SET_MAKE]) m4trace:configure.ac:11: -1- m4_pattern_allow([^SET_MAKE$]) m4trace:configure.ac:13: -1- AC_SUBST([CXX]) m4trace:configure.ac:13: -1- AC_SUBST_TRACE([CXX]) m4trace:configure.ac:13: -1- m4_pattern_allow([^CXX$]) m4trace:configure.ac:13: -1- AC_SUBST([CXXFLAGS]) m4trace:configure.ac:13: -1- AC_SUBST_TRACE([CXXFLAGS]) m4trace:configure.ac:13: -1- m4_pattern_allow([^CXXFLAGS$]) m4trace:configure.ac:13: -1- AC_SUBST([LDFLAGS]) m4trace:configure.ac:13: -1- AC_SUBST_TRACE([LDFLAGS]) m4trace:configure.ac:13: -1- m4_pattern_allow([^LDFLAGS$]) m4trace:configure.ac:13: -1- AC_SUBST([LIBS]) m4trace:configure.ac:13: -1- AC_SUBST_TRACE([LIBS]) m4trace:configure.ac:13: -1- m4_pattern_allow([^LIBS$]) m4trace:configure.ac:13: -1- AC_SUBST([CPPFLAGS]) m4trace:configure.ac:13: -1- AC_SUBST_TRACE([CPPFLAGS]) m4trace:configure.ac:13: -1- m4_pattern_allow([^CPPFLAGS$]) m4trace:configure.ac:13: -1- AC_SUBST([CXX]) m4trace:configure.ac:13: -1- AC_SUBST_TRACE([CXX]) m4trace:configure.ac:13: -1- m4_pattern_allow([^CXX$]) m4trace:configure.ac:13: -1- AC_SUBST([ac_ct_CXX]) m4trace:configure.ac:13: -1- AC_SUBST_TRACE([ac_ct_CXX]) m4trace:configure.ac:13: -1- m4_pattern_allow([^ac_ct_CXX$]) m4trace:configure.ac:13: -1- AC_SUBST([EXEEXT], [$ac_cv_exeext]) m4trace:configure.ac:13: -1- AC_SUBST_TRACE([EXEEXT]) m4trace:configure.ac:13: -1- m4_pattern_allow([^EXEEXT$]) m4trace:configure.ac:13: -1- AC_SUBST([OBJEXT], [$ac_cv_objext]) m4trace:configure.ac:13: -1- AC_SUBST_TRACE([OBJEXT]) m4trace:configure.ac:13: -1- m4_pattern_allow([^OBJEXT$]) m4trace:configure.ac:13: -1- AC_SUBST([DEPDIR], ["${am__leading_dot}deps"]) m4trace:configure.ac:13: -1- AC_SUBST_TRACE([DEPDIR]) m4trace:configure.ac:13: -1- m4_pattern_allow([^DEPDIR$]) m4trace:configure.ac:13: -1- AC_SUBST([am__include]) m4trace:configure.ac:13: -1- AC_SUBST_TRACE([am__include]) m4trace:configure.ac:13: -1- m4_pattern_allow([^am__include$]) m4trace:configure.ac:13: -1- AC_SUBST([am__quote]) m4trace:configure.ac:13: -1- AC_SUBST_TRACE([am__quote]) m4trace:configure.ac:13: -1- m4_pattern_allow([^am__quote$]) m4trace:configure.ac:13: -1- AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) m4trace:configure.ac:13: -1- AC_SUBST([AMDEP_TRUE]) m4trace:configure.ac:13: -1- AC_SUBST_TRACE([AMDEP_TRUE]) m4trace:configure.ac:13: -1- m4_pattern_allow([^AMDEP_TRUE$]) m4trace:configure.ac:13: -1- AC_SUBST([AMDEP_FALSE]) m4trace:configure.ac:13: -1- AC_SUBST_TRACE([AMDEP_FALSE]) m4trace:configure.ac:13: -1- m4_pattern_allow([^AMDEP_FALSE$]) m4trace:configure.ac:13: -1- _AM_SUBST_NOTMAKE([AMDEP_TRUE]) m4trace:configure.ac:13: -1- _AM_SUBST_NOTMAKE([AMDEP_FALSE]) m4trace:configure.ac:13: -1- AC_SUBST([AMDEPBACKSLASH]) m4trace:configure.ac:13: -1- AC_SUBST_TRACE([AMDEPBACKSLASH]) m4trace:configure.ac:13: -1- m4_pattern_allow([^AMDEPBACKSLASH$]) m4trace:configure.ac:13: -1- _AM_SUBST_NOTMAKE([AMDEPBACKSLASH]) m4trace:configure.ac:13: -1- AC_SUBST([am__nodep]) m4trace:configure.ac:13: -1- AC_SUBST_TRACE([am__nodep]) m4trace:configure.ac:13: -1- m4_pattern_allow([^am__nodep$]) m4trace:configure.ac:13: -1- _AM_SUBST_NOTMAKE([am__nodep]) m4trace:configure.ac:13: -1- AC_SUBST([CXXDEPMODE], [depmode=$am_cv_CXX_dependencies_compiler_type]) m4trace:configure.ac:13: -1- AC_SUBST_TRACE([CXXDEPMODE]) m4trace:configure.ac:13: -1- m4_pattern_allow([^CXXDEPMODE$]) m4trace:configure.ac:13: -1- AM_CONDITIONAL([am__fastdepCXX], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3]) m4trace:configure.ac:13: -1- AC_SUBST([am__fastdepCXX_TRUE]) m4trace:configure.ac:13: -1- AC_SUBST_TRACE([am__fastdepCXX_TRUE]) m4trace:configure.ac:13: -1- m4_pattern_allow([^am__fastdepCXX_TRUE$]) m4trace:configure.ac:13: -1- AC_SUBST([am__fastdepCXX_FALSE]) m4trace:configure.ac:13: -1- AC_SUBST_TRACE([am__fastdepCXX_FALSE]) m4trace:configure.ac:13: -1- m4_pattern_allow([^am__fastdepCXX_FALSE$]) m4trace:configure.ac:13: -1- _AM_SUBST_NOTMAKE([am__fastdepCXX_TRUE]) m4trace:configure.ac:13: -1- _AM_SUBST_NOTMAKE([am__fastdepCXX_FALSE]) m4trace:configure.ac:14: -1- AC_SUBST([CC]) m4trace:configure.ac:14: -1- AC_SUBST_TRACE([CC]) m4trace:configure.ac:14: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:14: -1- AC_SUBST([CFLAGS]) m4trace:configure.ac:14: -1- AC_SUBST_TRACE([CFLAGS]) m4trace:configure.ac:14: -1- m4_pattern_allow([^CFLAGS$]) m4trace:configure.ac:14: -1- AC_SUBST([LDFLAGS]) m4trace:configure.ac:14: -1- AC_SUBST_TRACE([LDFLAGS]) m4trace:configure.ac:14: -1- m4_pattern_allow([^LDFLAGS$]) m4trace:configure.ac:14: -1- AC_SUBST([LIBS]) m4trace:configure.ac:14: -1- AC_SUBST_TRACE([LIBS]) m4trace:configure.ac:14: -1- m4_pattern_allow([^LIBS$]) m4trace:configure.ac:14: -1- AC_SUBST([CPPFLAGS]) m4trace:configure.ac:14: -1- AC_SUBST_TRACE([CPPFLAGS]) m4trace:configure.ac:14: -1- m4_pattern_allow([^CPPFLAGS$]) m4trace:configure.ac:14: -1- AC_SUBST([CC]) m4trace:configure.ac:14: -1- AC_SUBST_TRACE([CC]) m4trace:configure.ac:14: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:14: -1- AC_SUBST([CC]) m4trace:configure.ac:14: -1- AC_SUBST_TRACE([CC]) m4trace:configure.ac:14: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:14: -1- AC_SUBST([CC]) m4trace:configure.ac:14: -1- AC_SUBST_TRACE([CC]) m4trace:configure.ac:14: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:14: -1- AC_SUBST([CC]) m4trace:configure.ac:14: -1- AC_SUBST_TRACE([CC]) m4trace:configure.ac:14: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:14: -1- AC_SUBST([ac_ct_CC]) m4trace:configure.ac:14: -1- AC_SUBST_TRACE([ac_ct_CC]) m4trace:configure.ac:14: -1- m4_pattern_allow([^ac_ct_CC$]) m4trace:configure.ac:14: -1- AC_REQUIRE_AUX_FILE([compile]) m4trace:configure.ac:14: -1- AC_SUBST([CCDEPMODE], [depmode=$am_cv_CC_dependencies_compiler_type]) m4trace:configure.ac:14: -1- AC_SUBST_TRACE([CCDEPMODE]) m4trace:configure.ac:14: -1- m4_pattern_allow([^CCDEPMODE$]) m4trace:configure.ac:14: -1- AM_CONDITIONAL([am__fastdepCC], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3]) m4trace:configure.ac:14: -1- AC_SUBST([am__fastdepCC_TRUE]) m4trace:configure.ac:14: -1- AC_SUBST_TRACE([am__fastdepCC_TRUE]) m4trace:configure.ac:14: -1- m4_pattern_allow([^am__fastdepCC_TRUE$]) m4trace:configure.ac:14: -1- AC_SUBST([am__fastdepCC_FALSE]) m4trace:configure.ac:14: -1- AC_SUBST_TRACE([am__fastdepCC_FALSE]) m4trace:configure.ac:14: -1- m4_pattern_allow([^am__fastdepCC_FALSE$]) m4trace:configure.ac:14: -1- _AM_SUBST_NOTMAKE([am__fastdepCC_TRUE]) m4trace:configure.ac:14: -1- _AM_SUBST_NOTMAKE([am__fastdepCC_FALSE]) m4trace:configure.ac:15: -1- AM_PROG_CC_C_O m4trace:configure.ac:16: -1- AC_SUBST([LEX]) m4trace:configure.ac:16: -1- AC_SUBST_TRACE([LEX]) m4trace:configure.ac:16: -1- m4_pattern_allow([^LEX$]) m4trace:configure.ac:16: -1- AC_SUBST([LEX_OUTPUT_ROOT], [$ac_cv_prog_lex_root]) m4trace:configure.ac:16: -1- AC_SUBST_TRACE([LEX_OUTPUT_ROOT]) m4trace:configure.ac:16: -1- m4_pattern_allow([^LEX_OUTPUT_ROOT$]) m4trace:configure.ac:16: -1- AC_SUBST([LEXLIB]) m4trace:configure.ac:16: -1- AC_SUBST_TRACE([LEXLIB]) m4trace:configure.ac:16: -1- m4_pattern_allow([^LEXLIB$]) m4trace:configure.ac:16: -1- AC_DEFINE_TRACE_LITERAL([YYTEXT_POINTER]) m4trace:configure.ac:16: -1- m4_pattern_allow([^YYTEXT_POINTER$]) m4trace:configure.ac:16: -1- AH_OUTPUT([YYTEXT_POINTER], [/* Define to 1 if `lex\' declares `yytext\' as a `char *\' by default, not a `char@<:@@:>@\'. */ @%:@undef YYTEXT_POINTER]) m4trace:configure.ac:17: -1- AC_SUBST([YACC]) m4trace:configure.ac:17: -1- AC_SUBST_TRACE([YACC]) m4trace:configure.ac:17: -1- m4_pattern_allow([^YACC$]) m4trace:configure.ac:17: -1- AC_SUBST([YACC]) m4trace:configure.ac:17: -1- AC_SUBST_TRACE([YACC]) m4trace:configure.ac:17: -1- m4_pattern_allow([^YACC$]) m4trace:configure.ac:17: -1- AC_SUBST([YFLAGS]) m4trace:configure.ac:17: -1- AC_SUBST_TRACE([YFLAGS]) m4trace:configure.ac:17: -1- m4_pattern_allow([^YFLAGS$]) m4trace:configure.ac:18: -1- AC_SUBST([CPP]) m4trace:configure.ac:18: -1- AC_SUBST_TRACE([CPP]) m4trace:configure.ac:18: -1- m4_pattern_allow([^CPP$]) m4trace:configure.ac:18: -1- AC_SUBST([CPPFLAGS]) m4trace:configure.ac:18: -1- AC_SUBST_TRACE([CPPFLAGS]) m4trace:configure.ac:18: -1- m4_pattern_allow([^CPPFLAGS$]) m4trace:configure.ac:18: -1- AC_SUBST([CPP]) m4trace:configure.ac:18: -1- AC_SUBST_TRACE([CPP]) m4trace:configure.ac:18: -1- m4_pattern_allow([^CPP$]) m4trace:configure.ac:19: -1- AC_SUBST([RANLIB]) m4trace:configure.ac:19: -1- AC_SUBST_TRACE([RANLIB]) m4trace:configure.ac:19: -1- m4_pattern_allow([^RANLIB$]) m4trace:configure.ac:21: -1- AC_SUBST([LN_S], [$as_ln_s]) m4trace:configure.ac:21: -1- AC_SUBST_TRACE([LN_S]) m4trace:configure.ac:21: -1- m4_pattern_allow([^LN_S$]) m4trace:configure.ac:22: -1- AC_SUBST([AWK]) m4trace:configure.ac:22: -1- AC_SUBST_TRACE([AWK]) m4trace:configure.ac:22: -1- m4_pattern_allow([^AWK$]) m4trace:configure.ac:90: -1- AC_SUBST([SAMPLE_EXTRA_LIBS]) m4trace:configure.ac:90: -1- AC_SUBST_TRACE([SAMPLE_EXTRA_LIBS]) m4trace:configure.ac:90: -1- m4_pattern_allow([^SAMPLE_EXTRA_LIBS$]) m4trace:configure.ac:91: -1- AC_SUBST([platform]) m4trace:configure.ac:91: -1- AC_SUBST_TRACE([platform]) m4trace:configure.ac:91: -1- m4_pattern_allow([^platform$]) m4trace:configure.ac:94: -1- AC_SUBST([GREP]) m4trace:configure.ac:94: -1- AC_SUBST_TRACE([GREP]) m4trace:configure.ac:94: -1- m4_pattern_allow([^GREP$]) m4trace:configure.ac:94: -1- AC_SUBST([EGREP]) m4trace:configure.ac:94: -1- AC_SUBST_TRACE([EGREP]) m4trace:configure.ac:94: -1- m4_pattern_allow([^EGREP$]) m4trace:configure.ac:94: -1- AC_DEFINE_TRACE_LITERAL([STDC_HEADERS]) m4trace:configure.ac:94: -1- m4_pattern_allow([^STDC_HEADERS$]) m4trace:configure.ac:94: -1- AH_OUTPUT([STDC_HEADERS], [/* Define to 1 if you have the ANSI C header files. */ @%:@undef STDC_HEADERS]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_ARPA_INET_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_ARPA_INET_H]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_XLOCALE_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_XLOCALE_H]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_ERRNO_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_ERRNO_H]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_FCNTL_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_FCNTL_H]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_CTYPE_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_CTYPE_H]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_LIMITS_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_LIMITS_H]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_FLOAT_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_FLOAT_H]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_MATH_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_MATH_H]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_NETDB_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_NETDB_H]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_NETINET_IN_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_NETINET_IN_H]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_STDLIB_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_STDLIB_H]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_STRING_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_STRING_H]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_STRINGS_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_STRINGS_H]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_STDINT_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_STDINT_H]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_INTTYPES_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_INTTYPES_H]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_TIME_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_TIME_H]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_SYS_INTTYPES_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_SYS_INTTYPES_H]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_SYS_SOCKET_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_SYS_SOCKET_H]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_SYS_TYPES_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_SYS_TYPES_H]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_SYS_TIME_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_SYS_TIME_H]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_SYS_TIMEB_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_SYS_TIMEB_H]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_UNISTD_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_UNISTD_H]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_POLL_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_POLL_H]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_OPENSSL_SSL_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_OPENSSL_SSL_H]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_GNUTLS_GNUTLS_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_GNUTLS_GNUTLS_H]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_ZLIB_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_ZLIB_H]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_SYS_TYPES_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_SYS_TYPES_H]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_SYS_STAT_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_SYS_STAT_H]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_STDLIB_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_STDLIB_H]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_STRING_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_STRING_H]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_MEMORY_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_MEMORY_H]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_STRINGS_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_STRINGS_H]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_INTTYPES_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_INTTYPES_H]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_STDINT_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_STDINT_H]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_UNISTD_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_UNISTD_H]) m4trace:configure.ac:98: -1- AC_DEFINE_TRACE_LITERAL([const]) m4trace:configure.ac:98: -1- m4_pattern_allow([^const$]) m4trace:configure.ac:98: -1- AH_OUTPUT([const], [/* Define to empty if `const\' does not conform to ANSI C. */ @%:@undef const]) m4trace:configure.ac:99: -1- AC_DEFINE_TRACE_LITERAL([size_t]) m4trace:configure.ac:99: -1- m4_pattern_allow([^size_t$]) m4trace:configure.ac:99: -1- AH_OUTPUT([size_t], [/* Define to `unsigned int\' if does not define. */ @%:@undef size_t]) m4trace:configure.ac:100: -1- AC_DEFINE_TRACE_LITERAL([TIME_WITH_SYS_TIME]) m4trace:configure.ac:100: -1- m4_pattern_allow([^TIME_WITH_SYS_TIME$]) m4trace:configure.ac:100: -1- AH_OUTPUT([TIME_WITH_SYS_TIME], [/* Define to 1 if you can safely include both and . */ @%:@undef TIME_WITH_SYS_TIME]) m4trace:configure.ac:101: -1- AC_DEFINE_TRACE_LITERAL([TM_IN_SYS_TIME]) m4trace:configure.ac:101: -1- m4_pattern_allow([^TM_IN_SYS_TIME$]) m4trace:configure.ac:101: -1- AH_OUTPUT([TM_IN_SYS_TIME], [/* Define to 1 if your declares `struct tm\'. */ @%:@undef TM_IN_SYS_TIME]) m4trace:configure.ac:106: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRUCT_TM_TM_GMTOFF]) m4trace:configure.ac:106: -1- m4_pattern_allow([^HAVE_STRUCT_TM_TM_GMTOFF$]) m4trace:configure.ac:106: -1- AH_OUTPUT([HAVE_STRUCT_TM_TM_GMTOFF], [/* Define to 1 if `tm_gmtoff\' is a member of `struct tm\'. */ @%:@undef HAVE_STRUCT_TM_TM_GMTOFF]) m4trace:configure.ac:106: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRUCT_TM___TM_GMTOFF]) m4trace:configure.ac:106: -1- m4_pattern_allow([^HAVE_STRUCT_TM___TM_GMTOFF$]) m4trace:configure.ac:106: -1- AH_OUTPUT([HAVE_STRUCT_TM___TM_GMTOFF], [/* Define to 1 if `__tm_gmtoff\' is a member of `struct tm\'. */ @%:@undef HAVE_STRUCT_TM___TM_GMTOFF]) m4trace:configure.ac:109: -1- AH_OUTPUT([HAVE_SYS_TIME_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_SYS_TIME_H]) m4trace:configure.ac:109: -1- AH_OUTPUT([HAVE_UNISTD_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_UNISTD_H]) m4trace:configure.ac:109: -1- AH_OUTPUT([HAVE_ALARM], [/* Define to 1 if you have the `alarm\' function. */ @%:@undef HAVE_ALARM]) m4trace:configure.ac:109: -1- AC_SUBST([LIB@&t@OBJS], ["$LIB@&t@OBJS mktime.$ac_objext"]) m4trace:configure.ac:109: -1- AC_SUBST_TRACE([LIB@&t@OBJS]) m4trace:configure.ac:109: -1- m4_pattern_allow([^LIB@&t@OBJS$]) m4trace:configure.ac:109: -1- AC_LIBSOURCE([mktime.c]) m4trace:configure.ac:110: -1- _m4_warn([obsolete], [The macro `AC_TYPE_SIGNAL' is obsolete. You should run autoupdate.], [../../lib/autoconf/types.m4:759: AC_TYPE_SIGNAL is expanded from... configure.ac:110: the top level]) m4trace:configure.ac:110: -1- AC_DEFINE_TRACE_LITERAL([RETSIGTYPE]) m4trace:configure.ac:110: -1- m4_pattern_allow([^RETSIGTYPE$]) m4trace:configure.ac:110: -1- AH_OUTPUT([RETSIGTYPE], [/* Define as the return type of signal handlers (`int\' or `void\'). */ @%:@undef RETSIGTYPE]) m4trace:configure.ac:111: -1- AH_OUTPUT([HAVE_STRFTIME], [/* Define to 1 if you have the `strftime\' function. */ @%:@undef HAVE_STRFTIME]) m4trace:configure.ac:111: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRFTIME]) m4trace:configure.ac:111: -1- m4_pattern_allow([^HAVE_STRFTIME$]) m4trace:configure.ac:111: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRFTIME]) m4trace:configure.ac:111: -1- m4_pattern_allow([^HAVE_STRFTIME$]) m4trace:configure.ac:112: -1- AH_OUTPUT([HAVE_RANDOM], [/* Define to 1 if you have the `random\' function. */ @%:@undef HAVE_RANDOM]) m4trace:configure.ac:112: -1- AH_OUTPUT([HAVE_GETTIMEOFDAY], [/* Define to 1 if you have the `gettimeofday\' function. */ @%:@undef HAVE_GETTIMEOFDAY]) m4trace:configure.ac:112: -1- AH_OUTPUT([HAVE_FTIME], [/* Define to 1 if you have the `ftime\' function. */ @%:@undef HAVE_FTIME]) m4trace:configure.ac:112: -1- AH_OUTPUT([HAVE_LOCALTIME_R], [/* Define to 1 if you have the `localtime_r\' function. */ @%:@undef HAVE_LOCALTIME_R]) m4trace:configure.ac:112: -1- AH_OUTPUT([HAVE_TIMEGM], [/* Define to 1 if you have the `timegm\' function. */ @%:@undef HAVE_TIMEGM]) m4trace:configure.ac:112: -1- AH_OUTPUT([HAVE_GMTIME], [/* Define to 1 if you have the `gmtime\' function. */ @%:@undef HAVE_GMTIME]) m4trace:configure.ac:112: -1- AH_OUTPUT([HAVE_GMTIME_R], [/* Define to 1 if you have the `gmtime_r\' function. */ @%:@undef HAVE_GMTIME_R]) m4trace:configure.ac:112: -1- AH_OUTPUT([HAVE_MEMSET], [/* Define to 1 if you have the `memset\' function. */ @%:@undef HAVE_MEMSET]) m4trace:configure.ac:112: -1- AH_OUTPUT([HAVE_SELECT], [/* Define to 1 if you have the `select\' function. */ @%:@undef HAVE_SELECT]) m4trace:configure.ac:112: -1- AH_OUTPUT([HAVE_SOCKET], [/* Define to 1 if you have the `socket\' function. */ @%:@undef HAVE_SOCKET]) m4trace:configure.ac:112: -1- AH_OUTPUT([HAVE_SNPRINTF], [/* Define to 1 if you have the `snprintf\' function. */ @%:@undef HAVE_SNPRINTF]) m4trace:configure.ac:112: -1- AH_OUTPUT([HAVE_STRCHR], [/* Define to 1 if you have the `strchr\' function. */ @%:@undef HAVE_STRCHR]) m4trace:configure.ac:112: -1- AH_OUTPUT([HAVE_STRERROR], [/* Define to 1 if you have the `strerror\' function. */ @%:@undef HAVE_STRERROR]) m4trace:configure.ac:112: -1- AH_OUTPUT([HAVE_STRERROR_R], [/* Define to 1 if you have the `strerror_r\' function. */ @%:@undef HAVE_STRERROR_R]) m4trace:configure.ac:112: -1- AH_OUTPUT([HAVE_STRLCPY], [/* Define to 1 if you have the `strlcpy\' function. */ @%:@undef HAVE_STRLCPY]) m4trace:configure.ac:112: -1- AH_OUTPUT([HAVE_STRRCHR], [/* Define to 1 if you have the `strrchr\' function. */ @%:@undef HAVE_STRRCHR]) m4trace:configure.ac:112: -1- AH_OUTPUT([HAVE_STRSTR], [/* Define to 1 if you have the `strstr\' function. */ @%:@undef HAVE_STRSTR]) m4trace:configure.ac:112: -1- AH_OUTPUT([HAVE_STRTOL], [/* Define to 1 if you have the `strtol\' function. */ @%:@undef HAVE_STRTOL]) m4trace:configure.ac:112: -1- AH_OUTPUT([HAVE_STRTOUL], [/* Define to 1 if you have the `strtoul\' function. */ @%:@undef HAVE_STRTOUL]) m4trace:configure.ac:112: -1- AH_OUTPUT([HAVE_STRTOLL], [/* Define to 1 if you have the `strtoll\' function. */ @%:@undef HAVE_STRTOLL]) m4trace:configure.ac:112: -1- AH_OUTPUT([HAVE_STRTOULL], [/* Define to 1 if you have the `strtoull\' function. */ @%:@undef HAVE_STRTOULL]) m4trace:configure.ac:112: -1- AH_OUTPUT([HAVE_STRTOLD], [/* Define to 1 if you have the `strtold\' function. */ @%:@undef HAVE_STRTOLD]) m4trace:configure.ac:112: -1- AH_OUTPUT([HAVE_STRTOD], [/* Define to 1 if you have the `strtod\' function. */ @%:@undef HAVE_STRTOD]) m4trace:configure.ac:112: -1- AH_OUTPUT([HAVE_STRTOF], [/* Define to 1 if you have the `strtof\' function. */ @%:@undef HAVE_STRTOF]) m4trace:configure.ac:112: -1- AH_OUTPUT([HAVE_STRTOLD_L], [/* Define to 1 if you have the `strtold_l\' function. */ @%:@undef HAVE_STRTOLD_L]) m4trace:configure.ac:112: -1- AH_OUTPUT([HAVE_STRTOD_L], [/* Define to 1 if you have the `strtod_l\' function. */ @%:@undef HAVE_STRTOD_L]) m4trace:configure.ac:112: -1- AH_OUTPUT([HAVE_STRTOF_L], [/* Define to 1 if you have the `strtof_l\' function. */ @%:@undef HAVE_STRTOF_L]) m4trace:configure.ac:112: -1- AH_OUTPUT([HAVE_SSCANF], [/* Define to 1 if you have the `sscanf\' function. */ @%:@undef HAVE_SSCANF]) m4trace:configure.ac:112: -1- AH_OUTPUT([HAVE_SSCANF_L], [/* Define to 1 if you have the `sscanf_l\' function. */ @%:@undef HAVE_SSCANF_L]) m4trace:configure.ac:112: -1- AH_OUTPUT([HAVE_SNPRINTF], [/* Define to 1 if you have the `snprintf\' function. */ @%:@undef HAVE_SNPRINTF]) m4trace:configure.ac:112: -1- AH_OUTPUT([HAVE_SPRINTF_L], [/* Define to 1 if you have the `sprintf_l\' function. */ @%:@undef HAVE_SPRINTF_L]) m4trace:configure.ac:112: -1- AH_OUTPUT([HAVE_WCTOMB], [/* Define to 1 if you have the `wctomb\' function. */ @%:@undef HAVE_WCTOMB]) m4trace:configure.ac:112: -1- AH_OUTPUT([HAVE_MBTOWC], [/* Define to 1 if you have the `mbtowc\' function. */ @%:@undef HAVE_MBTOWC]) m4trace:configure.ac:112: -1- AH_OUTPUT([HAVE_POLL], [/* Define to 1 if you have the `poll\' function. */ @%:@undef HAVE_POLL]) m4trace:configure.ac:115: -1- AC_DEFINE_TRACE_LITERAL([HAVE_ISNAN]) m4trace:configure.ac:115: -1- m4_pattern_allow([^HAVE_ISNAN$]) m4trace:configure.ac:115: -1- AH_OUTPUT([HAVE_ISNAN], [/* isnan */ @%:@undef HAVE_ISNAN]) m4trace:configure.ac:116: -1- AC_DEFINE_TRACE_LITERAL([HAVE_ISINF]) m4trace:configure.ac:116: -1- m4_pattern_allow([^HAVE_ISINF$]) m4trace:configure.ac:116: -1- AH_OUTPUT([HAVE_ISINF], [/* isinf */ @%:@undef HAVE_ISINF]) m4trace:configure.ac:124: -1- AC_DEFINE_TRACE_LITERAL([HAVE_ISNAN]) m4trace:configure.ac:124: -1- m4_pattern_allow([^HAVE_ISNAN$]) m4trace:configure.ac:124: -1- AH_OUTPUT([HAVE_ISNAN], [/* isnan */ @%:@undef HAVE_ISNAN]) m4trace:configure.ac:136: -1- AC_DEFINE_TRACE_LITERAL([HAVE_ISINF]) m4trace:configure.ac:136: -1- m4_pattern_allow([^HAVE_ISINF$]) m4trace:configure.ac:136: -1- AH_OUTPUT([HAVE_ISINF], [/* isinf */ @%:@undef HAVE_ISINF]) m4trace:configure.ac:145: -1- AH_OUTPUT([HAVE_GETHOSTBYNAME_R], [/* Define to 1 if you have the `gethostbyname_r\' function. */ @%:@undef HAVE_GETHOSTBYNAME_R]) m4trace:configure.ac:145: -1- AC_DEFINE_TRACE_LITERAL([HAVE_GETHOSTBYNAME_R]) m4trace:configure.ac:145: -1- m4_pattern_allow([^HAVE_GETHOSTBYNAME_R$]) m4trace:configure.ac:146: -1- AH_OUTPUT([HAVE_STDLIB_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_STDLIB_H]) m4trace:configure.ac:146: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STDLIB_H]) m4trace:configure.ac:146: -1- m4_pattern_allow([^HAVE_STDLIB_H$]) m4trace:configure.ac:146: -1- AC_DEFINE_TRACE_LITERAL([HAVE_MALLOC]) m4trace:configure.ac:146: -1- m4_pattern_allow([^HAVE_MALLOC$]) m4trace:configure.ac:146: -1- AH_OUTPUT([HAVE_MALLOC], [/* Define to 1 if your system has a GNU libc compatible `malloc\' function, and to 0 otherwise. */ @%:@undef HAVE_MALLOC]) m4trace:configure.ac:146: -1- AC_DEFINE_TRACE_LITERAL([HAVE_MALLOC]) m4trace:configure.ac:146: -1- m4_pattern_allow([^HAVE_MALLOC$]) m4trace:configure.ac:146: -1- AC_SUBST([LIB@&t@OBJS], ["$LIB@&t@OBJS malloc.$ac_objext"]) m4trace:configure.ac:146: -1- AC_SUBST_TRACE([LIB@&t@OBJS]) m4trace:configure.ac:146: -1- m4_pattern_allow([^LIB@&t@OBJS$]) m4trace:configure.ac:146: -1- AC_LIBSOURCE([malloc.c]) m4trace:configure.ac:146: -1- AC_DEFINE_TRACE_LITERAL([malloc]) m4trace:configure.ac:146: -1- m4_pattern_allow([^malloc$]) m4trace:configure.ac:146: -1- AH_OUTPUT([malloc], [/* Define to rpl_malloc if the replacement function should be used. */ @%:@undef malloc]) m4trace:configure.ac:157: -1- AM_CONDITIONAL([DEBUG_COMPILE], [test x$debug = xtrue]) m4trace:configure.ac:157: -1- AC_SUBST([DEBUG_COMPILE_TRUE]) m4trace:configure.ac:157: -1- AC_SUBST_TRACE([DEBUG_COMPILE_TRUE]) m4trace:configure.ac:157: -1- m4_pattern_allow([^DEBUG_COMPILE_TRUE$]) m4trace:configure.ac:157: -1- AC_SUBST([DEBUG_COMPILE_FALSE]) m4trace:configure.ac:157: -1- AC_SUBST_TRACE([DEBUG_COMPILE_FALSE]) m4trace:configure.ac:157: -1- m4_pattern_allow([^DEBUG_COMPILE_FALSE$]) m4trace:configure.ac:157: -1- _AM_SUBST_NOTMAKE([DEBUG_COMPILE_TRUE]) m4trace:configure.ac:157: -1- _AM_SUBST_NOTMAKE([DEBUG_COMPILE_FALSE]) m4trace:configure.ac:163: -1- AC_SUBST([SOAPCPP2_DEBUG]) m4trace:configure.ac:163: -1- AC_SUBST_TRACE([SOAPCPP2_DEBUG]) m4trace:configure.ac:163: -1- m4_pattern_allow([^SOAPCPP2_DEBUG$]) m4trace:configure.ac:168: -1- AC_SUBST([SOAPCPP2_IMPORTPATH]) m4trace:configure.ac:168: -1- AC_SUBST_TRACE([SOAPCPP2_IMPORTPATH]) m4trace:configure.ac:168: -1- m4_pattern_allow([^SOAPCPP2_IMPORTPATH$]) m4trace:configure.ac:173: -1- AC_SUBST([WSDL2H_IMPORTPATH]) m4trace:configure.ac:173: -1- AC_SUBST_TRACE([WSDL2H_IMPORTPATH]) m4trace:configure.ac:173: -1- m4_pattern_allow([^WSDL2H_IMPORTPATH$]) m4trace:configure.ac:181: -1- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... ../../lib/autoconf/general.m4:1472: AC_ARG_ENABLE is expanded from... configure.ac:181: the top level]) m4trace:configure.ac:190: -1- AC_SUBST([SOAPCPP2_NONAMESPACES]) m4trace:configure.ac:190: -1- AC_SUBST_TRACE([SOAPCPP2_NONAMESPACES]) m4trace:configure.ac:190: -1- m4_pattern_allow([^SOAPCPP2_NONAMESPACES$]) m4trace:configure.ac:198: -1- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... ../../lib/autoconf/general.m4:1472: AC_ARG_ENABLE is expanded from... configure.ac:198: the top level]) m4trace:configure.ac:207: -1- AC_SUBST([SOAPCPP2_IPV6]) m4trace:configure.ac:207: -1- AC_SUBST_TRACE([SOAPCPP2_IPV6]) m4trace:configure.ac:207: -1- m4_pattern_allow([^SOAPCPP2_IPV6$]) m4trace:configure.ac:220: -1- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... ../../lib/autoconf/general.m4:1472: AC_ARG_ENABLE is expanded from... configure.ac:220: the top level]) m4trace:configure.ac:227: -1- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... ../../lib/autoconf/general.m4:1472: AC_ARG_ENABLE is expanded from... configure.ac:227: the top level]) m4trace:configure.ac:263: -1- AC_SUBST([WSDL2H_EXTRA_FLAGS]) m4trace:configure.ac:263: -1- AC_SUBST_TRACE([WSDL2H_EXTRA_FLAGS]) m4trace:configure.ac:263: -1- m4_pattern_allow([^WSDL2H_EXTRA_FLAGS$]) m4trace:configure.ac:264: -1- AC_SUBST([WSDL2H_EXTRA_LIBS]) m4trace:configure.ac:264: -1- AC_SUBST_TRACE([WSDL2H_EXTRA_LIBS]) m4trace:configure.ac:264: -1- m4_pattern_allow([^WSDL2H_EXTRA_LIBS$]) m4trace:configure.ac:265: -1- AC_SUBST([SAMPLE_INCLUDES]) m4trace:configure.ac:265: -1- AC_SUBST_TRACE([SAMPLE_INCLUDES]) m4trace:configure.ac:265: -1- m4_pattern_allow([^SAMPLE_INCLUDES$]) m4trace:configure.ac:266: -1- AC_SUBST([SAMPLE_SSL_LIBS]) m4trace:configure.ac:266: -1- AC_SUBST_TRACE([SAMPLE_SSL_LIBS]) m4trace:configure.ac:266: -1- m4_pattern_allow([^SAMPLE_SSL_LIBS$]) m4trace:configure.ac:267: -1- AC_SUBST([WSDL2H_SOAP_CPP_LIB]) m4trace:configure.ac:267: -1- AC_SUBST_TRACE([WSDL2H_SOAP_CPP_LIB]) m4trace:configure.ac:267: -1- m4_pattern_allow([^WSDL2H_SOAP_CPP_LIB$]) m4trace:configure.ac:277: -1- AM_CONDITIONAL([ENABLE_SAMPLES], [test x$samples = xtrue]) m4trace:configure.ac:277: -1- AC_SUBST([ENABLE_SAMPLES_TRUE]) m4trace:configure.ac:277: -1- AC_SUBST_TRACE([ENABLE_SAMPLES_TRUE]) m4trace:configure.ac:277: -1- m4_pattern_allow([^ENABLE_SAMPLES_TRUE$]) m4trace:configure.ac:277: -1- AC_SUBST([ENABLE_SAMPLES_FALSE]) m4trace:configure.ac:277: -1- AC_SUBST_TRACE([ENABLE_SAMPLES_FALSE]) m4trace:configure.ac:277: -1- m4_pattern_allow([^ENABLE_SAMPLES_FALSE$]) m4trace:configure.ac:277: -1- _AM_SUBST_NOTMAKE([ENABLE_SAMPLES_TRUE]) m4trace:configure.ac:277: -1- _AM_SUBST_NOTMAKE([ENABLE_SAMPLES_FALSE]) m4trace:configure.ac:278: -1- AC_SUBST([ENABLE_SAMPLES]) m4trace:configure.ac:278: -1- AC_SUBST_TRACE([ENABLE_SAMPLES]) m4trace:configure.ac:278: -1- m4_pattern_allow([^ENABLE_SAMPLES$]) m4trace:configure.ac:285: -1- AC_SUBST([SAMPLE_DIRS]) m4trace:configure.ac:285: -1- AC_SUBST_TRACE([SAMPLE_DIRS]) m4trace:configure.ac:285: -1- m4_pattern_allow([^SAMPLE_DIRS$]) m4trace:configure.ac:295: -1- AC_SUBST([LEX_DEFINE]) m4trace:configure.ac:295: -1- AC_SUBST_TRACE([LEX_DEFINE]) m4trace:configure.ac:295: -1- m4_pattern_allow([^LEX_DEFINE$]) m4trace:configure.ac:296: -1- AC_SUBST([LEX_FLAGS]) m4trace:configure.ac:296: -1- AC_SUBST_TRACE([LEX_FLAGS]) m4trace:configure.ac:296: -1- m4_pattern_allow([^LEX_FLAGS$]) m4trace:configure.ac:297: -1- AC_SUBST([LEXLIB]) m4trace:configure.ac:297: -1- AC_SUBST_TRACE([LEXLIB]) m4trace:configure.ac:297: -1- m4_pattern_allow([^LEXLIB$]) m4trace:configure.ac:307: -1- AC_SUBST([BISON_DEFINE]) m4trace:configure.ac:307: -1- AC_SUBST_TRACE([BISON_DEFINE]) m4trace:configure.ac:307: -1- m4_pattern_allow([^BISON_DEFINE$]) m4trace:configure.ac:308: -1- AC_SUBST([YACC_LIB]) m4trace:configure.ac:308: -1- AC_SUBST_TRACE([YACC_LIB]) m4trace:configure.ac:308: -1- m4_pattern_allow([^YACC_LIB$]) m4trace:configure.ac:352: -1- AC_CONFIG_FILES([ Makefile \ gsoap.pc gsoap++.pc gsoapck.pc gsoapck++.pc gsoapssl.pc gsoapssl++.pc \ gsoap/Makefile \ gsoap/src/Makefile \ gsoap/wsdl/Makefile \ gsoap/samples/Makefile \ gsoap/samples/autotest/Makefile \ gsoap/samples/calc/Makefile \ gsoap/samples/calc++/Makefile \ gsoap/samples/chaining/Makefile \ gsoap/samples/chaining++/Makefile \ gsoap/samples/databinding/Makefile \ gsoap/samples/dime/Makefile \ gsoap/samples/dom/Makefile \ gsoap/samples/oneway/Makefile \ gsoap/samples/oneway++/Makefile \ gsoap/samples/factory/Makefile \ gsoap/samples/factorytest/Makefile \ gsoap/samples/gmt/Makefile \ gsoap/samples/googleapi/Makefile \ gsoap/samples/hello/Makefile \ gsoap/samples/httpcookies/Makefile \ gsoap/samples/lu/Makefile \ gsoap/samples/magic/Makefile \ gsoap/samples/mashup/Makefile \ gsoap/samples/mashup++/Makefile \ gsoap/samples/mtom/Makefile \ gsoap/samples/mtom-stream/Makefile \ gsoap/samples/polytest/Makefile \ gsoap/samples/primes/Makefile \ gsoap/samples/roll/Makefile \ gsoap/samples/router/Makefile \ gsoap/samples/rss/Makefile \ gsoap/samples/ssl/Makefile \ gsoap/samples/template/Makefile \ gsoap/samples/udp/Makefile \ gsoap/samples/varparam/Makefile \ gsoap/samples/wsa/Makefile \ gsoap/samples/wsrm/Makefile \ gsoap/samples/wsse/Makefile \ gsoap/samples/xml-rpc-json/Makefile gsoap/samples/rest/Makefile ]) m4trace:configure.ac:353: -1- AC_SUBST([LIB@&t@OBJS], [$ac_libobjs]) m4trace:configure.ac:353: -1- AC_SUBST_TRACE([LIB@&t@OBJS]) m4trace:configure.ac:353: -1- m4_pattern_allow([^LIB@&t@OBJS$]) m4trace:configure.ac:353: -1- AC_SUBST([LTLIBOBJS], [$ac_ltlibobjs]) m4trace:configure.ac:353: -1- AC_SUBST_TRACE([LTLIBOBJS]) m4trace:configure.ac:353: -1- m4_pattern_allow([^LTLIBOBJS$]) m4trace:configure.ac:353: -1- AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"]) m4trace:configure.ac:353: -1- AC_SUBST([am__EXEEXT_TRUE]) m4trace:configure.ac:353: -1- AC_SUBST_TRACE([am__EXEEXT_TRUE]) m4trace:configure.ac:353: -1- m4_pattern_allow([^am__EXEEXT_TRUE$]) m4trace:configure.ac:353: -1- AC_SUBST([am__EXEEXT_FALSE]) m4trace:configure.ac:353: -1- AC_SUBST_TRACE([am__EXEEXT_FALSE]) m4trace:configure.ac:353: -1- m4_pattern_allow([^am__EXEEXT_FALSE$]) m4trace:configure.ac:353: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_TRUE]) m4trace:configure.ac:353: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_FALSE]) m4trace:configure.ac:353: -1- AC_SUBST_TRACE([top_builddir]) m4trace:configure.ac:353: -1- AC_SUBST_TRACE([top_build_prefix]) m4trace:configure.ac:353: -1- AC_SUBST_TRACE([srcdir]) m4trace:configure.ac:353: -1- AC_SUBST_TRACE([abs_srcdir]) m4trace:configure.ac:353: -1- AC_SUBST_TRACE([top_srcdir]) m4trace:configure.ac:353: -1- AC_SUBST_TRACE([abs_top_srcdir]) m4trace:configure.ac:353: -1- AC_SUBST_TRACE([builddir]) m4trace:configure.ac:353: -1- AC_SUBST_TRACE([abs_builddir]) m4trace:configure.ac:353: -1- AC_SUBST_TRACE([abs_top_builddir]) m4trace:configure.ac:353: -1- AC_SUBST_TRACE([INSTALL]) m4trace:configure.ac:353: -1- AC_SUBST_TRACE([MKDIR_P]) gsoap-2.8.28/configure.scan0000644000175000017500000000344312653650144015125 0ustar ellertellert# Process this file with autoconf to produce a configure script. AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS) AC_CONFIG_SRCDIR([config.h.in]) AC_CONFIG_HEADER([config.h]) # Checks for programs. AC_PROG_CXX AC_PROG_CC AC_PROG_INSTALL AC_PROG_LN_S AC_PROG_MAKE_SET AC_PROG_AWK AC_PROG_CPP AC_PROG_LEX AC_PROG_RANLIB AC_PROG_YACC # Checks for libraries. # FIXME: Replace `main' with a function in `-le': AC_CHECK_LIB([e], [main]) # FIXME: Replace `main' with a function in `-lgsoap': AC_CHECK_LIB([gsoap], [main]) # FIXME: Replace `main' with a function in `-links': AC_CHECK_LIB([inks], [main]) # FIXME: Replace `main' with a function in `-lm': AC_CHECK_LIB([m], [main]) # Checks for header files. AC_HEADER_STDC AC_CHECK_HEADERS([arpa/inet.h errno.h fcntl.h limits.h netdb.h netinet/in.h stddef.h stdlib.h string.h strings.h sys/socket.h sys/time.h unistd.h]) # Checks for typedefs, structures, and compiler characteristics. AC_C_CONST AC_TYPE_SIZE_T AC_HEADER_TIME AC_STRUCT_TM # Checks for library functions. AC_FUNC_MALLOC AC_FUNC_MKTIME AC_TYPE_SIGNAL AC_FUNC_STRFTIME AC_FUNC_STRTOD AC_CHECK_FUNCS([gethostbyname localtime_r memset pow select socket strchr strerror strrchr strstr strtol strtoul]) AC_CONFIG_FILES([Makefile soapcpp2/Makefile soapcpp2/samples/Makefile soapcpp2/samples/calc/Makefile soapcpp2/samples/dime/Makefile soapcpp2/samples/factory/Makefile soapcpp2/samples/factorytest/Makefile soapcpp2/samples/mybubble/Makefile soapcpp2/samples/quote/Makefile soapcpp2/samples/quote2/Makefile soapcpp2/samples/quote3/Makefile soapcpp2/samples/quotex/Makefile soapcpp2/src/Makefile]) AC_OUTPUT gsoap-2.8.28/mkinstalldirs0000755000175000017500000000132212653650160015074 0ustar ellertellert#! /bin/sh # mkinstalldirs --- make directory hierarchy # Author: Noah Friedman # Created: 1993-05-16 # Public domain # $Id: mkinstalldirs,v 1.13 1999/01/05 03:18:55 bje Exp $ errstatus=0 for file do set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` shift pathcomp= for d do pathcomp="$pathcomp$d" case "$pathcomp" in -* ) pathcomp=./$pathcomp ;; esac if test ! -d "$pathcomp"; then echo "mkdir $pathcomp" mkdir "$pathcomp" || lasterr=$? if test ! -d "$pathcomp"; then errstatus=$lasterr fi fi pathcomp="$pathcomp/" done done exit $errstatus # mkinstalldirs ends here gsoap-2.8.28/config.guess0000644000175000017500000013135512653650144014617 0ustar ellertellert#! /bin/sh # Attempt to guess a canonical system name. # Copyright 1992-2014 Free Software Foundation, Inc. timestamp='2014-01-01' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # 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, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # # Originally written by Per Bothner. # # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD # # Please send patches with a ChangeLog entry to config-patches@gnu.org. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright 1992-2014 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown case "${UNAME_SYSTEM}" in Linux|GNU|GNU/*) # If the system lacks a compiler, then just pick glibc. # We could probably try harder. LIBC=gnu eval $set_cc_for_build cat <<-EOF > $dummy.c #include #if defined(__UCLIBC__) LIBC=uclibc #elif defined(__dietlibc__) LIBC=dietlibc #else LIBC=gnu #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` ;; esac # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:Bitrig:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE} exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 exit $exitcode ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm*:riscos:*:*|arm*:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux${UNAME_RELEASE} exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build SUN_ARCH="i386" # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH="x86_64" fi fi echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` case ${UNAME_PROCESSOR} in amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW64*:*) echo ${UNAME_MACHINE}-pc-mingw64 exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; i*:MSYS*:*) echo ${UNAME_MACHINE}-pc-msys exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; authenticamd | genuineintel | EM64T) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; 8664:Windows_NT:*) echo x86_64-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; aarch64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC="gnulibc1" ; fi echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arc:Linux:*:* | arceb:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo ${UNAME_MACHINE}-unknown-linux-${LIBC} else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi else echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf fi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; cris:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; crisv32:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; frv:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; hexagon:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:Linux:*:*) echo ${UNAME_MACHINE}-pc-linux-${LIBC} exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } ;; or1k:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; or32:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; padre:Linux:*:*) echo sparc-unknown-linux-${LIBC} exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-${LIBC} exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-${LIBC} ;; PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; *) echo hppa-unknown-linux-${LIBC} ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-${LIBC} exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-${LIBC} exit ;; ppc64le:Linux:*:*) echo powerpc64le-unknown-linux-${LIBC} exit ;; ppcle:Linux:*:*) echo powerpcle-unknown-linux-${LIBC} exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux-${LIBC} exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; tile*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-${LIBC} exit ;; x86_64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configury will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; x86_64:Haiku:*:*) echo x86_64-unknown-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown eval $set_cc_for_build if test "$UNAME_PROCESSOR" = unknown ; then UNAME_PROCESSOR=powerpc fi if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then case $UNAME_PROCESSOR in i386) UNAME_PROCESSOR=x86_64 ;; powerpc) UNAME_PROCESSOR=powerpc64 ;; esac fi fi elif test "$UNAME_PROCESSOR" = i386 ; then # Avoid executing cc on OS X 10.9, as it ships with a stub # that puts up a graphical alert prompting to install # developer tools. Any system running Mac OS X 10.7 or # later (Darwin 11 and later) is required to have a 64-bit # processor. This is not true of the ARM version of Darwin # that Apple uses in portable devices. UNAME_PROCESSOR=x86_64 fi echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NEO-?:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk${UNAME_RELEASE} exit ;; NSE-*:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; i*86:AROS:*:*) echo ${UNAME_MACHINE}-pc-aros exit ;; x86_64:VMkernel:*:*) echo ${UNAME_MACHINE}-unknown-esx exit ;; esac eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix\n"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; c34*) echo c34-convex-bsd exit ;; c38*) echo c38-convex-bsd exit ;; c4*) echo c4-convex-bsd exit ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: gsoap-2.8.28/changelog.md0000644000175000017500000016752512653650144014563 0ustar ellertellert [![Go down](images/go-down.png) Go down](#latest) to view the latest changes Version 1.1 (1/1/2000) --- - Added typedef conventions. - Added enumerations. - Added hexBinary encoding. - Added base64 encoding. - Enable pass by reference operator (&) for output parameter. - Enable specification of methods in classes. Version 1.2 (9/9/2001) --- - Added WSDL generator. Version 1.2w (9/14/2001) --- - Win32 port. - Fixed a socket communication problem in win32 version. - Added namespace name pattern matching to ease validation. Version 1.2.1 (10/24/2001) --- - Added chunked HTTP 1.1 transfer support. - Improved buffering. - Fixed a problem with nested vector allocation. Version 1.2.2 (11/2/2001) --- - Support for special XML element names with dots, underscores, and center dots (see documentation section 5.3). - Fixed a decoding problem with dynamic array of pointers to polymorphic objects. - Fixed an encoding problem with enumerations. - Added a "safe-mode" flag to disable serialization of multi-referenced objects with `soap_disable_href = 1;` - You can set this global flag anywere in the code, but at least before serialization is performed. It will disable the use of href attributes when sending multi-reference data. Instead, the data is copied in the payload. When set, this flag will hang the serializer when sending cyclic data structures. Version 1.2.3 (12/5/2001) --- - Added bool type encoding/decoding. - Added dynamic multi-dimensional arrays. - Added support for primitive polymorphic types. - Added full support for CDATA content decoding. - More convenient customization of SOAP Headers and Faults. No separate soapheader.h and soapfault.h files required (and therefore no .cpp files have to be created for these). Instead, the compiler generates customized SOAP Header and SOAP Fault marshalling routines when struct/class `SOAP_ENV__Fault` and/or `SOAP_ENV__Header` are specified in the header file input to the compiler. - On demand generation of the marshalling routines for the primitive types, which reduces the size of the executables. - Fixed a WSDL incompatibility problem in the WSDL generator. - Improved decoding of multi-reference elements (no xsi:type required anymore in receiving message so gSOAP does not break). - Improved support for encoding/decoding indirect data (e.g. pointers to pointers to data). - Improved encoding of data with the same pointers to shared data but with the shared data declared with different XML schema types (formerly encoded as multi-reference data which could cause type incmpatibilities at the receiving side). For example, in the declarations `typedef char *xsd__NCName; xsd__NCName *s="SOAP"; char *t = s;` the pointers s and t point to the same data, but will not be encoded as multi-reference data since the types are different. - Added flag `soap_enable_null = 1;` - When set, all NULL pointers will be explicitly encoded. By default, NULL pointers are omitted from the SOAP payload. For example, with this flag set all NULL strings and other NULL pointer data will appear as nil values in the SOAP payload. - Added flag: `soap_enable_embedding = 1;` - When set, multi-reference data will be encoded inline which will guarantee the exact preservation of the structure of the data transmitted. However, some SOAP implementations do not support embedding inline multi-reference data although this encoding style is likely to be included in future verions of the SOAP protocol. The flag is useful when creating C++ applications that need to communicate data to eachother and the data structures need to be preserved. Setting this flag may cause a duplication of multi-reference data by the receiver created with the SOAP stub compiler when the data is part of a struct/class or array. The data is not copied by the receiver when the struct/class or arrays use pointers to the data type. - Added the ability to declare virtual destructors. - Fixed a compilation error with fixed-size array of pointers. - Fixed a problem with padding in Base64 (en/de)coding. - Fixed XML entity decoding (hexadecimal). - Added encoding of sparse arrays. A sparse array MUST be declared as a (fixed-size of dynamic) array of pointers. NULL pointer values are omitted from the output and SOAP-ENC:position attributes are used for non-NULL elements. - Changed `soap_put` and `soap_get` functions to include explicit schema type parameters. This fixed a problem with Web services that need to return typedef-ed XML schema types The new stdsoap.cpp and stdsoap.h files are incompatible with the previous version(s). - Added the ability to ignore the names of accessors when decoding fields through the use of a leading underscore (`_`) in a field name. For example: `ns__mymethod(xsd__string in, xsd__string &_return);` - When used to invoke a remote method, the actual element name of the remote return parameter used by the service is insignificant. - Improved memory management. Added new function: `soap_destroy()` to remove all class instances. - Improved documentation. - Added `time_t` type support, but still need to add encoding/decoding routines to the runtime (next version). - Added `wchar_t` type support, but still need to add encoding/decoding routines to the runtime (next version). Version 1.2.4 (12/17/2001) --- - Added support for wide character strings (`wchar_t*`). - Added support for `time_t` type. - Added support for SOAP literal encoding. - Fixed an obscure bug in the deserialization of data from the SOAP4R toolkit that caused the deserializer to hang. - Fixed a problem with the `soap_disable_href` flag. - Fixed a problem with the position attributes in sparse multi-dimensional arrays. - Fixed a problem with the generation of .nsmap files. - Fixed a problem with mixed content decoding in strings. Version 1.2.5 (12/27/2001) --- - Fixed a memory leak in the block allocation scheme used for strings, hexBinary, and base64 types. - Fixed a bug in the WSDL generator for fixed-size arrays. - Fixed a problem with the use of trailing underscores in field names in struct/class declarations. Version 1.2.6 (1/25/2002) --- - Improved portability. - Improved id/href hash table efficiency and storage. - Improved namespace URI matching with wildcards. - Improved stand-alone deployment. - Added `soap_disable_response_count` flag. - Fixed operator declaration parsing (cast operators). - Fixed a WSDL generator bug for output parameters and enumeration types. - Renamed function `soap_return_fault()` into `soap_send_fault()`. Version 2.0 (2/2/2002) --- - Rewrote the compiler (soapcpp2) and the run-time engine libraries to create a thread safe implementation. Versions 1.2.7 and 2.0.1 (2/11/2002) --- - Added new soapcpp2 compiler options (-h -c -d -p). - Added optional specification of service name, location, and namespace URI in header file. - Improved interoperability. Versions 1.2.8 and 2.0.2 (2/24/2002) --- - Added function callbacks to support customized I/O and HTTP operations. This allows for plug-in HTTP code, NSAPI interface code, reading/writing from/to files or string buffers, etc. - Added HTTP 1.0/1.1 keep-alive support. - Added HTTP 1.1 chunked transfer support. - Added `soap_disable_request_count` flag. - Added `soap_enable_array_overflow` flag. - Added type naming conventions to serialize elements without generating `xsi:type` attributes. - Fixed a fixed-size array decoding problem (type mismatch). - Fixed `` print bug in the WSDL generators. Versions 1.3 and 2.1 (3/10/2002) --- - Added client-side SSL (HTTPS) support (thanks to Massimo Cafaro for his suggestions). - Added a naming convention for dynamic array `__ptr` fields which enables the naming of the XML tags of array elements. - Added WSDL Header and Fault schema generation. - Improved doc/literal encoding style. - Improved WSDL service/schema namespace generation. - Fixed `SOAP-ENV:Header` to be self contained. - Fixed WSDL generation of xsd schema types declared as string. - Fixed a method overriding type clash for derived classes. - Fixed spurious occurrence of `id="-1"` with `soap_enable_null` flag enabled. - Fixed a front-end gSOAP compiler problem with forward and cyclic struct declarations. Versions 1.3.1 and 2.1.1 (3/25/2002) --- - Added header file source constructs to support transient data types and transient struct/class fields to control gSOAP's code generatiion window for (de)serialization routines. - Added callback for handling XML elements that are ignored on the receiving side (e.g. because of schema type problems). This feature is intended to enhance the reliability of services/clients. - Added server-side SSL support and included an example multi-threaded stand-alone SSL secure SOAP server example. - Added proxy server support. - Improved message logging in gSOAP 2.1.1 (thanks to Jessie Ragsdale for his suggestions). - Fixed WSDL generation for dynamic arrays. - Fixed deserialization of empty multi-ref derived class instances. Versions 1.3.2 and 2.1.2 (4/15/2002) --- - Added socket timeout management. - Added optional client and server cookie support. - Added support for `maxOccurs="unbounded"` for arbitrary elements in complexTypes (not just limited to SOAP arrays). - Improved generation of schema `` definitions to allow XML validation in the presence of class overriding. - Fixed ULONG64 type handling. - Fixed light validation problem (now rejects invalid XML schema URIs). - Fixed a deserialization type mismatch with typedef-ed pointer primitives. - Fixed WSDL and schema interoperability problems. Versions 1.3.3 and 2.1.3 (4/27/2002) --- - Added `mustUnderstand` declaration qualifier for SOAP Header processing. - Added `soap.actor` attribute for SOAP Header processing. - Added method-header-part directive to identify methods with header message associations (WSDL requirement). - Added bitmask (de)serialization. - Added FastCGI support. - Improved DLL build support (gSOAP 2.1.3 only). - Improved WinCE support (gSOAP 2.1.3 only, thanks to Sean Ryan for his suggestions). - Improved Mac OS X support. - WSDL generator improvements and fixes. - Workaround a bug in .NET SOAP Headers (non-unique id name values in .NET). - Fixed `disable_href=1` bug. - Fixed XML in string parsing code generation problem. Versions 1.3.4 and 2.1.4 (6/9/2002) --- - Added non-blocking `soap_accept()` with timeout management. - Added support for SOAP Header and Fault declared as classes. - Added syntax for `extern` declarations for transient types and fields. - Added support for SOAP Headers in SOAP Fault messages. - Added one-way SOAP messages (2.1.4 only). - Added support for user-defined (de)serializers (2.1.4 only). - Improved object memory management. - Improved support for AIX and HP platforms. - Fixed proxy server connect bug. - Fixed an OpenSSL bug. - Fixed `soap_instantiate_ClassX()` derived class allocation problem. - Fixed generation of spurious .xsd files when lots of trailing underscores are used by identifiers in the header file. - Fixed syntax error that occured with header files containing cyclic class declarations. - Fixed 'class in struct' and 'vector of classes' VMT initialization bugs. Version 2.1.5 (6/22/2002) --- - Added non-blocking remote method calls (not supported in win32 version). - Added specification of default values for struct/class fields. - Added specification of minOccurs and maxOccurs for struct/class fields. - Added support for the resolution operator `::` in identifiers. - Added abstract method declaration support. - Fixed WSDL generation of SOAP doc/lit. - Fixed `WITH_FASTCGI` option. Version 2.1.6 (7/10/2002) --- - Added DIME attachment support. - Added win32 non-blocking sockets. - Changed `"%lld"` and `"%llu"` format strings into `"%I64d"` and `"%I64u"` format string for win32. - Improved I/O. - Fixed multi-dimensional dynamic array (de)serialization. - Fixed WSDL enum and header namespace generation. Version 2.1.7 (8/6/2002) --- - Added generation of example SOAP/XML request and response messages by the compiler. - Added RSA to SSL stack. - Added two callbacks to the HTTP stack for efficient handling of HTTP headers in Apache-mod and IIS. - Added compiler option -m (malloc() memory control) and updated doc on memory allocation policies. - Added compiler option -i to support #include and #define directives. - Improved HTTP cookie support to handle new and old cookie protocols. - Improved external class (de)serialization support (std::string example is included). - Fixed a SSL+proxy connect problem. - Fixed uninitialized '//gsoap..executable:' string which caused sporadic exits. - Fixed XML literal string encoding problem introduced with DIME. - Fixed and removed WSDL duplicate response elements. - Fixed LONG64 and ULONG64 types for WinCE. Version 2.1.8 (8/28/2002) --- - Added client-side proxy class source code generation. - Added `soap.enable_strict` flag to enable very strict validation of messages (unknown namespace URIs and XML elements are not allowed). - Added `soap.socket_flags` to control socket send and recv flags, e.g. to disable broken pipe signals (`soap.socket_flags=MSG_NOSIGNAL`). - Added `//gsoap ns service method-action` header file directive. - Added server-side `soap_receiver_fault()` and `soap_sender_fault()` functions to return SOAP 1.1 and SOAP 1.2 faults. - Added seeding of the PRNG for SSL. - Added soapcpp2 compiler option '-2' to automate SOAP 1.2 support (SOAP 1.2 features are Beta-release). - Changed keep-alive support (see docs). - Improved WSDL output. - Workaround Bison 1.6 for win32 bug in gSOAP win32 version. - Fixed a wild-card matching bug in `soap_tag_cmp()`. - Fixed a string deserialization problem. - Fixed a deserialization bug that can occur in a client-server combination with gSOAP and Apache Axis. Version 2.1.9 (9/08/2002) --- - Added HTTP proxy authentication. - Added plug-in registry (Beta). - Changed compiler exit status for compilation errors. - Fixed stdin/stdout binary mode for DIME transfer with gSOAP for win32. - Fixed win32 soapcpp2.exe bug in .res.xml file generation. Version 2.1.10 (10/14/2002) --- - Added `//gsoap ns service method-documentation:` directive. - Added provision for additional documentation text with `//gsoap ns service name:` directive. - Added #import pragma to (recursively) import gSOAP header files. - Added plugin features and included a plugin example in 'extras' directory. - Added automake/autoconf to generic gSOAP package (thanks to Christian Aberger). - Added `-DWITH_LOCALTIME` compilation option to control `time_t` (de)serialization. - Changed `time_t` (de)serialization (now uses timegm() and gmtime() to handle UTC). Found that mktime() library call is buggy on some systems. - Improved and reorganized package directory structure. - Fixed DDL linkage problem with instantiate/delete routines dealing with class instance memory management. - Fixed compilation problem with Sun Workshop CC compiler and other compilers that adopt a specfic class VMT structure that could break object (de)serializers. - Fixed bug in WSDL generator with multiple service namespaces. Version 2.1.11 (11/10/2002) --- - Added a multi-functional SOAP router application (message forwarding and message relay server). - Added keep-alive support for asynchronous one-way messages. - Improved parsing and handling of function prototypes and class methods. - Improved modular design to enable the compilation and linkage of multiple client and service modules. - Improved user-defined SOAP Fault detail handling. - Fixed `SSL_accept` bug. - Fixed serialization of pointers to dynamic arrays with multi-references. Version 2.2 (12/12/2002) --- - Added XML attribute (de)serialization support. - Added XSD QName parsing and conversion support (`typedef char *xsd__QName`). - Added compression support (`-DWITH_ZLIB` requires Zlib). - Changed and improved transport and encoding settings by splitting up sending and receiving side flags into separate sets. Deprecated `soap.enable_X` and `soap.disable_X` flags. - Improved keep-alive support (automatic client and server sides). - Fixed a bug in mustUnderstand handling. - Fixed a sporadic crash of the gSOAP compiler under win32. - Fixed user-defined SOAP Fault output in WSDL generator. Version 2.2.1 (12/18/2002) --- - Added callbacks to enable custom streaming of DIME attachments. - Fixed broken serialization of pointers to dynamic arrays with NULL `__ptr`. - Fixed some WSDL issues. Version 2.2.2 (1/25/2003) --- - Added gzip support (`-DWITH_GZIP` requires Zlib). - Added `faccept()` callback. - Improved HTTP chunking. - Fixed OpenSSL and `accept_timeout` (OpenSSL requires blocking sockets). - Fixed HTTP header buffering. - Fixed UTF8 decoding of a subset of characters (2-octet UTF). - Fixed `operator==` parsing. - Fixed a couple of WSDL issues. Version 2.2.3 (3/2/2003) --- - Added server-side HTTP basic authentication. - Improved speed. - Improved Tru64 portability. - Changed `fpost()` function callback signature: added `int port` argument and added port number to the Host: HTTP header. - Fixed memory leak in SSL connect when using OpenSSL DH. - Fixed custom (de)serializer definitions parsing. - Fixed a gzip/deflate bug with large transfers. - Fixed use of `ftime()` for `time_t` (de)serialization with timezones. - Fixed a problem with concurrent access to global namespace table by multiple threads. - Fixed crash with //gsoap name directive. - Fixed deserialization bug with multi-ref object encoding by Apache Axis. Version 2.3.1-8 (9/24/2003) --- - Updated SOAP 1.2 support (implements the SOAP 1.2 recommendation). - Added STL container support and built-in `std::string` encoding. - Added stand-alone Web server example to serve static and dynamic pages with a new HTTP GET plugin. - Added `void*` (de)serialization, e.g. useful to support polymorphism with C applications and as an alternative to union types. - Added XML DOM parser to support SOAP document encoding and for mixing of application data (de)serialization within an XML DOM. - Added `WITH_LEAN` and `WITH_LEANER` compilation flags to improve support for small-memory devices such as WinCE and Palm. - Added `SOAP_XML_CANONICAL` flag for canonical XML output (XML-C14N support and SOAP 1.2 normalization support). - Added `//gsoap ns method-encoding:` directive. - Added `//gsoap ns schema import:` directive. - Added optional class getter and setter methods for object (de)serialization. - Added `volatile` qualifier to indicate that certain type declarations should be treated 'as-is' when types are declared externally (e.g. part of a library). - Added a new string notation for declarations to specify simpleType restriction patterns. - Added soapcpp2 -I option to indicate #import path. - Added support for (de)serialization of application data to C++ iostreams. - Added `fsslauth()` callback. - Added HTTP code error values. - Added `SOAP_MALLOC` and `SOAP_FREE` macros to replace `malloc()` and `free()`. - Added `soap_strdup(soap, string)` to copy strings in gSOAP's memory space. - Added chunked streaming DIME output (thanks to J. Li for his suggestions). - Added `SOAP_SOCKET` for win32 support (thanks to B. Gille for his suggestions). - Added `SO_LINGER` support with `soap.connect_flags`. - Added support for iso-8859-1 encoded XML parsing (default is utf8). - Added #module directive to build shared libraries. - Added C++ namespaces support to enable the compilation and linkage of multiple client and service codes. - Added `WITH_CASEINSENSITIVETAGS` compilation flag to enable case insensitive XML parsing. - Improved WSDL types schema output. - Improved custom (de)serialization (note: extras/stringtest example has been changed). - Improved SOAP literal encoding. - Improved speed. - Improved HTTP1.0/1.1 support. - Removed `soap.defaultNamespace` in favor of automatic SOAP literal output based on `soap.encodingStyle` value. - Fixed GMT to DST localtime conversion, but still issues with Sun Solaris. - Fixed dynamic array `__offset` handling. - Fixed class definition order. - Fixed sporadic memory leak in HTTP cookie reader. - Fixed multi-threaded server-side OpenSSL initialization. - Fixed enumeration-based XML attribute deserialiation. - Fixed SOAP-ENC:position attribute placement when arrays of pointers are mixed with nillable data. - Fixed crash when parsing incorrect SOAP/XML attribute content. Version 2.4 (12/20/2003) --- - New WSDL parser and importer with improved support for SOAP document style and literal encoding. - Added optional full schema validation (partial by default). Use `SOAP_XML_STRICT` flag. - Added SSL session caching. - Added `soap_set_namespaces()` to switch namespace tables. - Fixed plugin memory leak. REQUIRED CHANGE to plugin allocation and copying. - Fixed server-side blocking SSL accept. Version 2.4.1 (01/07/2004) --- - Changed `_USCORE_` and `_DOT_` naming conventions into `_USCORE` and `_DOT` to improve name mapping. - Updated DOM parser (integrated into core gSOAP library). - Improved WSDL parser and included several new features. - Fixed WSDL schema import and WSDL literal output. Version 2.5 (01/28/2004) --- - Changed default encoding to SOAP RPC literal, as mandated by WS-I Basic Profile 1.0a and best practices. - Added soapcpp2 compiler option -e for backward compatibility to gSOAP 2.4.1 and earlier that use SOAP RPC encoding defaults (helpful when migrating gSOAP projects to 2.5). - Added automatic compiler-side WS-I Basic Profile 1.0a compliance warnings (warns before deployment). - Added `fget()` callback for HTTP GET responses. - Added IPv6 support contributed by Wind River Systems. - Added VxWorks support contributed by Wind River Systems. - Improved SOAP Fault handling. - Improved interop with Axis RPC encoded response messages. - Fixed `std::string` xsi:type attribute value. - Fixed gSOAP 2.4 problems with serialization of enumeration values outside enumeration range. - Fixed gSOAP 2.4 Pocket PC build problem. - Fixed wsdl2h SOAP Fault and Header output. Version 2.5.1 (02/12/2004) --- - Improved WSDL output and WS-I BP1.0a compliance. - Improved WSDL parser stability. - Fixed problem parsing empty xsd:base64Binary elements. - Fixed VxWorks and TRU64 portability issues. - Fixed HTTP 400 error problem. - Fixed soapcpp2 2.5 stability problem with one-way messages. Version 2.5.2 (02/23/2004) --- - Fixed WSDL generation warnings. - Fixed LONG64 problem for PalmOS. - Fixed module build link problem and 'components' example. Version 2.6.0 (03/28/2004) --- - Changed default style to doc/lit. - Improved doc/lit WSDL handling. - Improved soapcpp2 sample SOAP/XML message output. - Added proxy support for wsdl2h. - Fixed CONNECT method for proxy+SSL+gzip. Version 2.6.1 (06/07/2004) --- - Added optional multibyte character support. - Improved WSDL output. - Fixed STL container multi-ref deserialization problem with missing data. - Fixed doc/lit server code generation from doc/lit WSDL definitions. Version 2.6.2 (06/12/2004) --- - Added Matlab(tm) code output (documentation is not availabel yet). - Improved wsdl2h output for schema facets. - Updated dom.cpp. - Changed wsdl2h `std::string*` to `std::string` generation (to avoid double pointers `std::string**`). To obtain old behavior, add entry `xsd:string = | std::string* | std::string*` to typemap.dat. - Fixed wsdl2h handling of ``. - Fixed wsdl2h handling of empty namespaces and absent targetNamespace schema attributes. - Fixed MB char handling. Version 2.7.0a/b/c/d/e/f (09/10/2004, 2/1/2005) --- - Added multipart/related support for SOAP with MIME attachments (SwA). - Added API functions for DIME open and closed layout support. - Added `//gsoap schema elementForm:` and `//gsoap schema attributeForm` directives. - Added `fclosesocket`, `fshutdownsocket`, `fpoll`, `fserveloop` callbacks. - Added `soap.authrealm` string attribute to set basic authentication realm. - Added `soap.prolog` string attribute to output optional XML prolog with processing instructions and directives. - Added soapcpp2 option -t. - Added wsdl2h options -e and -i. - Added Palm OS and Symbian instructions and examples. - Added xml-rpc support and examples. - New `mod_gsoap` directory with modules for Apache 1.x/2.x, IIS, and WinInet - Improved XML validation with `SOAP_XML_STRICT` flag. - Improved memory footprint (reduced code size and reduced serialization overhead). - Improved runtime id-ref serialization and deserialization. - Improved wsdl2h translation. - Updated dom.cpp. - Updated webserver.c. - Fixed issues with namespace qualification in doc/lit messages. - Fixed `SOAP_HREF` error. - Fixed proxy+SSL+zlib+chunking. - Fixed SSL `select()` polling in `frecv()`. - Fixed wsdl2h multidimensional SOAP arrays generate problem. Version 2.7.1 (03/31/2005) --- - Added new style of C++ proxy/object generation (objects derived from soap struct), enabled with soapcpp2 option -i. - Added new features to wsdl2h generation to enable user-defined class/struct extensions such as member data and functions which are declared in typemap.dat. - Added MIME multipart/form-data parsing to support HTTP POST HTML form handling (example included in samples/webserver). - Added built-in memory leak detection enabled with `-DDEBUG`. - Added UDDI v2 API and examples. - Added 'WS' directory with WS protocols, such as WS-Addressing. This part will mature as more WS protocols will be added over time. - Added `fseterror()` callback. - Improved wsdl2h code output. - Enhanced Web server sample code, and httpget and logging plugins. - Fixed base64/hexBinary XML attribute serialization. - Fixed a missing min/maxOccurs check for validation. Version 2.7.2 (05/11/2005) --- - Added SOAP-over-UDP IPv4/IPv6 support with examples. - Added UDDI v2 API publish example. - Improved wsdl2h parser accepting multiple WSDL/XSD files from the command line. - Fixed wsdl2h schema import from included schema bug. - Fixed SOAP 1.2 Fault Subcode handling. Version 2.7.3 (06/27/2005) --- - Added MTOM attachment support. - Added 'plugin' directory with example plug-ins. - Added 'import' directory for commonly #import-ed files such as stlvector.h. - Added HTTP digest authentication plug-in 'plugins/httpda.h'. - Added new import feature to wsdl2h using `ns=URI` convention for typemap.dat files, which enables wsdl2h to parse a WSDL that imports known WSDLs/schemas such as XOP, XML MIME, and WS-Addressing without actually reading the imported WSDL/schemas. - Added soapcpp2 options -C and -S to generate client- or server-only codes. - Added multi-path support for soappcpp2 option -I. - Added C and C++ examples to combine multiple clients and services into one executable, see the samples/components directory in the package. - Improved soapcpp2 option -e to generate SOAP RPC encoding style client/server codes by default (instead of document/literal by default). - Fixed wsdl2h circular import of schemas. - Fixed attributeGroup handling in wsdl2h. - Fixed soapcpp2 handling of 'invisible' tags, e.g. `__any`, that should only be populated after all else failed to match the delivered XML content. - Fixed validation of numeric enum constants with `SOAP_XML_STRICT` validation. - Fixed engine's spurious log file generation issue. Version 2.7.4 (07/24/2005) --- - Added union serialization. - Added `//gsoap ... type-documentation:` directive. - Added `//gsoap ... method-mime-type:` directive. - Added wsdl2h option -g for generating global element/attribute declarations for building modular .h files. - Added wsdl2 option -y for generating typedef synonyms for structs and enums, with improved handling of typedefs by soapcpp2. - Added wsdl2 option -u to disable union generation for xs:choice. - Improved wsdl2h documentation generation. - Improved wsdl2h and soapcpp2 MIME bindings. - Improved dynamic memory allocation in engine with look-aside buffering. - Fixed wsdl2h xs:complexContent/extension/attributeGroup translation. - Fixed wsdl2h xs:choice with min/maxOccurs != 1 translation. - Fixed wsdl2h soap:body parts attribute. Version 2.7.5 (08/01/2005) --- - Added xs:redefine support to wsdl2h. - Added HTML POST application/x-www-form-urlencoded plugin httpform.c (demo samples/webserver). - Improved wsdl2h output. - Fixed wsdl2h handling of duplicate values in single enum list. Version 2.7.6 revision a/b/c/d/e (08/19/2005-02/18/06) --- - Added WS-Security authentication, tokens, and signatures with new 'wsse' plugin, see documentation in 'doc' directory and 'samples/wsse'. - Added 'doc' directory for documentation and moved soapdoc2.html and soapdoc2.pdf. - Added `SOAP_XML_INDENT` flag. - Added `soap_sender_fault_subcode()` and `soap_receiver_fault_subcode()` for SOAP 1.2 subcodes. - Added `WITH_DOM` compile flag to enable flushing serialized and deserialized data to DOM (as well as a stream). - Added soapcpp2 option -L. - Added soapcpp2 option -a. - Added wsdl2h option -a (for backward compatibility). - Added wsdl2h option -d. - Added `WITH_TCPFIN` comile flag to enable optional shutdown with how=1 (TCPFIN) after final sends to force EOF on other side (used to be the default behavior). - Added schema substitutionGroup support. - Added `soap_ssl_init()`. - Improved DOM implementation and documentation. - Improved AS400 portability. - Improved schema choice support. - Fixed wsdl2h multiple schema include issue. - Fixed `soaps2dateTime` and `soap_timegm` functions when `timegm` is not available. - Fixed exc-c14n formatting. - Fixed SOAP 1.2 fault handling. - Fixed missing `soap_flag___item2` issue. - Fixed partial MIME boundary parsing issue. - Fixed base64 parsing with `WITH_FAST`. - Fixed MIME encoding of `\r\r` sequence. - Fixed QName normalization issue. - Fixed relative path schema import. - Fixed MTOM cid matching with URL encoded IDs. - Fixed wide-character (`wchar_t*`) XML attribute handling. - Fixed `std::vector` element id-ref ordering in deserializer. Version 2.7.7 (04/07/2006) --- - Added streaming MTOM support (see also example in samples/mtom-stream). - Added `long double` serialization support with custom serializer (`custom/long_double.h`). - Added automatic detection of application's `soap_malloc()` data overruns in `-DDEBUG` mode. - Improved `time_t` and `struct tm` (`custom/struct_tm.h`) serialization. - Fixed issue with a wrongly generated namespace map entry. - Fixed PalmOS socket connection issues. - Fixed XML attributes with bitmask enumeration (`enum*`) values. Version 2.7.8 revisions a/b/c (06/05/2006-06/24/2006)) --- - Added X509 extension checks. - Added advanced MTOM streaming features. - Added WS-Addressing plugin and demo. - Moved soapcpp2 and wsdl2h to bin directory. - Improved SOAP1.2 MTOM interop. - Changed `soap_send_empty_response` function signature (additional status argument) for HTTP optional response binding. - Changed `fmimewriteopen()` callback signature. - Fixed wsdl2h top-level element and complexType name clash issue. - Fixed HTTP chunking with empty response message body. - Fixed WSSE digest authentication. - Fixed WSDL response element output. - Fixed SOAP 1.2 `` handling with `SOAP_XML_STRICT` flag. - Fixed WSSE signed response messages. - Fixed Win32 max open connection exceeded checking. - Fixed xsi:type matching for `__name` fields, which required a signature change of `soap_element_begin_in()` with an additional 'type' parameter (affecting custom deserializers, see custom dir). Version 2.7.9 revisions a/b/c/d/e/f/g/h/i/j/k/l (10/24/2006-09/26/2007) --- - Added wsdl2h option -j to omit the generation of SOAP Header and Faults for customization of these. - Added wsdl2h option -q to generate C++ namespace qualified header files. - Added `SOAP_SSLv3`, `SOAP_TLSv1`, `SOAP_SSL_SKIP_HOST_CHECK` flags. - Added file input and output specifications (with `<` and `>`) to wsdl2h's typemap.dat to specify input and output for wsdl2h. - Added WS-Addressing 2005/03 support. - Added function `soap_free(soap)` that executes `soap_done(soap); free(soap)` and renamed previous `soap_free()` to `soap_temp_free()`. - Added wsdl2h option `-_` to translate `_USCORE`. - Added xsd:anyAttribute (using DOM parser) with wsdl2h option -d. - Added multi-WSDL types section schema component merging. - Added TCP keep-alive settings. - Added QName list normalization. - Changed soapcpp2 default rule for generating attribute form qualified to unqualified. - Improved wsdl2h SOAP Fault coding. - Improved performance and stability. - Improved portability. - Improved wsdl2h empty namespace handling ("" namespace). - Improved wsdl2h and schema conversion to C and C++. - Improved SSL timeouts and error handling. - Improved soapcpp2 option -i (generate proxy and service classes). - Improved class instance initialization. - Improved use of IPv6. - Improved proxy and server code output for soapcpp2 option -i. - Improved soapcpp2 code output with additional exception checks. - Fixed MIME/MTOM start id handling (SOAP message no longer required to be first attachment). - Fixed WS-Security wsse plugin canonicalization format issue. - Fixed ZIP content remainder parsing (CRC check). - Fixed WSA API handling of messages with MIME/DIME attachments. - Fixed wsdl2h `` relative path includes. - Fixed `_XML` literal string parsing of root attributes. Version 2.7.10 (01/27/2008) --- - Combined pre-built win32, Linux i386, and Mac universal binaries into a single software distribution package to streamline the distribution. - Added new Web service examples and removed XMethods dependence. - Added soapcpp2 option -qname for automatic C++ namespace qualification. - Added HTTP PUT, DELETE, HEAD callback support. - Added ability to derive classes from soap struct (in gSOAP header files). - Updated certificates and fixed cacerts.c. - Improved soapcpp2 option -i proxy/server object generation. - Improved socket timeout handling. - Improved HTTP chunking handling and efficiency. - Improved web server implementation. - Improved soapcpp2 and wsdl2h warning and error reporting. - Fixed dom parser handling of default xml namespace bindings. - Fixed wsdl2h default ("") namespace handling. Version 2.7.11 (07/26/2008) --- - Added new wsseapi signature verification API functions. - Added mutability property of `SOAP_ENV__Header` and `SOAP_ENV__Fault` struct to allow consistent redefinitions and on-the-fly member additions. - Added wsdl2h -r option parameter for web proxy access. - Added MINGW portability. - Added configure option --disable-openssl to build wsdl2h and libraries without OpenSSL. - Added `WITH_C_LOCALE` compilation flag to enable the use of `c_locale` and local-specific numeric conversion routines. - Added WS-Addressing metadata (wsam) support. - Fixed xml:lang in SOAP 1.2 SOAP-ENV:Text. - Fixed XML literal strings with maxOccurs="unbounded" - Fixed SSL connection engine issue. - Fixed RPC literal part name handling issue. - Fixed in update: SSL alloc/free issue and s2dateTime. Version 2.7.12 (10/01/2008) --- - Added multi-endpoint connect capability. Endpoint string can be a space-separated list of endpoint URLs, where each URL is tried in turn. - Added `SOAP_SSL_NO_DEFAULT_CA_PATH` option. - Fixed SSL connect issue when the SSL handshake or network connection fails. - Fixed xsi:nil handling for strings (NULL vs. "") in case of empty elements. - Fixed DOM xmlns="" namespace issue in XML output. - Fixed `IP_MULTICAST_TTL` failure to compile. - Fixed non-critical WSSE API `soap_wsse_verify_nested` code. Version 2.7.13 (03/21/2009) --- - Improved wsdl2h code output. - Updated gsoapWinInet. - Updated DOM xmlns namespace binding handling. - Fixed OpenSSL memory leak. Version 2.7.14 (09/07/2009) --- - Added support for `poll()` to replace `select()` to prevent `FD_EXCEEDED`. - Fixed enum local simpleType restriction attribute initialization. - Fixed utf8 string parsing issue when first char in CDATA could cause problems. - Fixed UDP IPv6 multicast-unicast exchange. - Fixed gzip end-of-stream check. - Fixed wsdl2h portType operation-input/output matching to ensure operations can be safely overloaded. Version 2.7.15 (11/07/2009) --- - Added `soap_read_X()` and `soap_write_X()` macros to simplify object reading and writing. - Fixed `soap_new_X()` functions compilation problem. - Fixed SSL session in context copy. - Fixed win32 `select()` in `tcp_select()`. - Fixed wstrings in unions. - Fixed preservation of CDATA sections in literal XML strings. Version 2.7.16 (04/05/2010) --- - Added soapcpp2 option -T to generate auto-test echo server code with an example in samples/autotest based on 294 patterns for data binding W3C workgroup. - Added soapcpp2 option -b to serialize byte arrays char[] as fixed-size strings (array of xsd:byte otherwise). - Added xsd:duration serializer: import custom/duration.h. - Added gsoap header syntax '$' type qualifier to indicate special struct/class members (array length, union discriminators). - Added "colon notation" to attach XML prefixes to C/C++ names without changing the names, an alternative to the `ns__` prefix notation by writing `ns:name` instead of `ns__name` where the former stands for just `name` to the C/C++ compiler. - Added wsdl2h options -z# for backward compatibility flags (-z1, -z2). - Added `SOAP_XML_IGNORENS` to optionally ignore XML namespaces. - Added WS-ReliableMessaging plugin. - Added custom xsd:duration serializer. - Added WSSE plugin `soap_wsse_set_wsu_id()` to simplify signing of elements (sets the wsu:Id of a given element tag name). - Improved handling of struct/class member name clashes resulting from XML schemas definitions. - Improved SOAP RPC ecoding response element tag acceptance. - Improved VxWorks compatibility. - Fixed FastCGI SOAP/XML processing with MIME attachments. - Fixed `typedef std::string XML`, for literal XML serialization problem. - Fixed a rare incorrect well-formedness error when xmlns default namespaces are absent. - Fixed a zlib compression error when obsolete crc check is used. - Fixed WS-Addressing HTTPS message relay (OpenSSL crash). Version 2.7.17 (05/10/2010) --- - Added WS-Policy 1.2 and 1.5, WS-SecurityPolicy 1.2 support for wsdl2h. - Improved WS-ReliableMessaging interop and verified MT-safety. - Improved WS-Security WSSE plugin documentation. - Fixed soapcpp2 line number error reporting. - Fixed WSSE plugin `soap_wsse_set_wsu_id()`. - Fixed wsdl2h cycle problem with recursive xs:include and xs:import. - Fixed enum translation of enum symbols with colons. - Fixed `std::wstring` used as XML attribute value UTF8 encoding (internal stdsoap2 API changed). Version 2.8.0 (09/20/2010) --- - Added wsdl2h option -W: suppress warnings. - Added wsdl2h option -i: for advanced uses only to skip schema imports. - Added automatic xsi:nil output for NULL pointer members when minOccurs>0 (member has '1' occurence annotation). - Improved wstring and `wchar_t*` handling when `wchar_t` is less than 4 bytes. - Improved use of custom serializers in builds. - Fixed wsdl2h type mapping of nested xs:sequence and xs:choice. - Fixed soapcpp2 handling of extension base qualified elements and derived type unqualified elements. - Fixed WSRM message resend buffer leak. - Licensing change for reasons of consistency and transparency: the soapcpp2 tool (2.8.0 and up) is licensed under the same conditions as the wsdl2h tool, which means that soapcpp2 is no longer covered by the gSOAP public license. Version 2.8.1 (01/14/2011) --- - Added WS-Security WSSE plugin-integrated streaming XML encryption. - Added WS-Security WSSE plugin `soap_wsse_sign_only()`. - Added soapcpp2 -f flag to split large output source code files into parts. - Fixed C++ mapping of xs:sequence maxOccurs>1. Version 2.8.2 (04/17/2011) --- - Added soapcpp2 -j option to generate C++ proxies and services in alternative format to the -i option. - Fixed wsdl2h issue with optional elements with default value. - Fixed cyclic WSDL import dependences in wsdl2h. - Fixed WSRM server-side fault state handing. - Fixed leading unicode character parsing and conversion issue in literal XML strings. Version 2.8.3 (06/24/2011) --- - Added soapcpp2 -y option to generate C/C++ type access information to the generated sample XML messages, allowing for the verification of C/C++ data access to the actual XML content. - Added JSON serialization support in place of XML-RPC serialization, see the XML-RPC content in the samples folder. - Improved DOM processing (an optional feature). - Fixed bugs, compilation and porting issues. Version 2.8.4 (10/24/2011) --- - Added NTLM support (enabled with `-DWITH_NTLM`, requires libntlm). - Added WS-Discovery 1.1 support (see doc/wsdd and plugin/wsddapi.h and wsddapi.c). - Added `//gsoap` typed directive to control xsi:type attribuation per namespace. - Added `SOAP_XML_NOTYPE` flag to disable xsi:type attributes. - Improved WS-Security encryption (AES, `soap_wsse_add_EncryptedKey_encrypt_only`). - Improved HTTP proxy authentication support (digest and NTLM). - Fixed bugs and portability issues. Version 2.8.5 (11/19/2011) --- - Fixed build issues with WS-Discovery. - Fixed HTTP basic auth crash. - Fixed `WITH_COMPAT` and `WITH_C_LOCALE`. - Fixed wsdl2h output for XSD abstract element extraneous ';'. Version 2.8.6 (12/14/2011) --- - Improved WS-Security compatibility. - Fixed multi and cyclic WSDL import. - Fixed tags of qualified referenced elements. - Fixed C builds for improved portability. Version 2.8.7 (02/07/2012) --- - Added new REST examples. - Added versioning checks to ensure project builds are consistent. - Improved interoperability of wsdl2h output wrt. to element qualification. - Renamed `-DTANDEM` to `-DTANDEM_NONSTOP` to prevent naming conflicts. - Fixed WS-Discovery URL. - Fixed soapcpp2 option -i and -j server chaining. Version 2.8.8 (02/20/2012) --- - Added REST plugin (httppost.c) enhancements and examples. - Added static version checks to prevent linkage to old incompatible libraries that could lead to runtime failures. Version 2.8.9 (06/10/2012) --- - Added examples to interoperate with WCF basicHttp, basicTransportSecurity, basicMessageSecurity, and wsDualHttp. - Added soapcpp2 option -A for service dispatching based on Action values only. - Added wsdl2h option -z3. - Added wsse support for WS-SecureConversation. - Added wsrm5 WS-ReliableMessaging 1.0 2005. - Added iOS plugin with examples. - Improved WS-Policy analysis and reporting. - Fixed and improved wsse plugin for WS-Security interoperability with WCF and other implementations (required a small API change). - Fixed HTTP headers for NTLM. - Fixed httpda plugin OpenSSL init crash in md5evp.c. Version 2.8.10 (08/16/2012) --- - Added soapcpp2 -Q option (C++ namespaces). - Added wsdl2h -b option (bi-directional operations for duplex services). - Updated WS-Addressing and WS-ReliableMessaging plugins, documentation, and examples. Version 2.8.11 (10/14/2012) --- - Added soapcpp2 -0 option to remove SOAP bindings when applicable. - Changed wsdl2h output for the few cases that multiple service bindings are defined, use wsdl2h -Nns for backward compatibility. - Improved DOM processing. - Improved C++0x/C++11 compatibility. - Fixed httpda plugin crash. - Fixed wsdl2h processing of xs:group maxOccurs=unbounded. - Fixed `mod_gsoap` plugin compilation issues. - Fixed literal XML UTF8 (UTF8 is now retained with `SOAP_C_UTFSTRING`). Version 2.8.12 (12/8/2012) --- - Added WSDL 2.0 support to wsdl2h. - Added //gsoap method-protocol directive. - Improved XML REST support, soapcpp2 -0 option for "no-SOAP" services. - Improved class instantiation with `soap_new_X`, `soap_new_set_X`, `soap_new_req_X`. - Improved soapcpp2 -b option. - Improved WCF WS-Addressing interop (duplex) channel. - Changed code to normalize in/out MEP for solicit-response messaging. - Fixed client-side OpenSSL host check that is known to crash in OpenSSL. Version 2.8.13 (1/21/2013) --- - Improved XML-RPC/JSON API and documentation, with one change: now must use `SOAP_C_UTFSTRING` to hold UTF8 in 8-bit strings. - Improved VxWorks compatibility. - Updated `soap_read_X` and `soap_write_X` to serialize object graphs with SOAP encoding enabled: use `soap_set_version(soap, V)` with V=0 (no SOAP), V=1 (SOAP1.1), V=2 (SOAP1.2). - Fixed broken WSDL `` nested schema XSD import. - Fixed operation action overriding by input/output SOAP action. - Deprecated old-style C++ service proxies and objects (use soapcpp2 -z1 flag to generate). Version 2.8.14 (2/4/2013) --- - Added explanation of wsdl2h option -Nname which is used to generate a service (and its prefix name) for each service binding (bindings are collected in one service by default). - Fixed PRId64 formatting. - Fixed broken MIME with doc/lit (when SOAP encodingStyle is not used). Version 2.8.15 (5/12/2013) --- - Added wsdl2h option -R for auto-generation of REST-based service operations (also added examples/rest example). - Change `soap_read_X()` and `soap_write_X()` to prevent removal of HTTP headers after calling `soap_connect()`. - Fixed automatic detection of DIME/MIME transfers. - Fixed HTTP 1.0 chunking issue. - Fixed HTTP digest authentication with DIME/MIME transfers. - Fixed OpenSSL subject alt name check. - Fixed HTTP 100 message handling issue. Version 2.8.16 (8/12/2013) --- - Improved support for Android platform. - Improved WCF interop duplex messaging requiring ChannelInstances. - Fixed complexType restriction of schema types with redefined attributes in wsdl2h output. - Fixed wcf/WS/DualHttp example (wrong use of `send_X()` replaced by `X()` for client-side operations X, to allow HTTP keep-alive to be used). - Fixed use of sprintf's that trigger Valgrind and Fortify warnings. - Fixed parsing character strings from CDATA sections ending in ']'. - Fixed DOM output for `SOAP_XML_CANONICAL` c14n normalization of xmlns namespace bindings. Version 2.8.17r (12/1/2013) --- - Added WS-RM message queueing option for WS-RM NoDiscard. - Added wsdl2h option -r for authorized web access and proxy access. - Improved C++11 compatibility. - Improved ISO compatibility (compile -pedantic). - Improved I/O timeouts timing accuracy in the presence of EINTR interrupts (set `SOAP_MAXEINTR`). - Fixed in 2.8.17r: fixed socket timeout issue. Version 2.8.18 (8/24/2014) --- - Added xs:precision and xs:scale support. - Added support for BPEL PartnerLink and VariableProperties to wsdl2h in support of BPEL projects. - Added soapcpp -z2 flag for backward compatibility with to 2.7.x: omit XML output of elements for pointers that are NULL even when minOccurs=1 (required). - Changed wsdl2h C++ output to always generate pass-by-reference response parameters (disable with -z6). - Improved WS-RM interoperability. - Fixed message part elements and types in default (xmlns="") namespace. - Fixed `&#;`-entity code conversion bug in XML attribute deserialization. - Fixed wsdl2h nested simpleType restriction with itemTypes. - Fixed wsdl2h substitutionGroup element in other namespace. - Fixed `` strict validation. - Fixed timeout/EINTR issue. Version 2.8.19 (11/8/2014) --- - Added string validation callbacks fsvalidate and fwvalidate for regex pattern-based validation of strings and wide strings against XML schema regex patterns. - Fixed `` strict validation with `minOccurs="0"` element(s). - Fixed `TCP_FASTOPEN` with UDP. - Fixed MTOM Content-Disposition ID overriding problem. - AIX portability fixes. Version 2.8.20 (11/30/2014) --- - Added XML 1.1 control char encoding support. - Fixed C/C++ compiler warnings. Version 2.8.21 (12/05/2014) --- - Added `-DWITH_REPLACE_ILLEGAL_UTF8` compilation option to replace UTF8 content that is outside the allowed range of XML 1.0. - Improved WS-RM (memory usage). - Fixed additional C/C++ compiler warnings. - Fixed `strftime` `%F` and `%T` use (removed). Version 2.8.22 (4/12/2015) --- - Added XSD 1.1 support (xs:override, xs:defaultAttributes, xs:targetNamespace on element and attribute declarations, and other additions). - Added import/wsdd5.h to support WS-Discovery 1.0 with WS-Addressing 2005/08 (typemap.dat now sets wsdd5.h instead of wsdd10.h by default). - Improved portability, including Solaris and AIX porting. - Improved option -R is now required to enable REST WSDL bindings and non-HTTP transport (in addition to enabling REST WSDL operations). - Fixed wsdl2h handling of xs:redefine. - Fixed deep class inherited `xsd__anyType` deserializer issue causing serialization and validation errors. - Fixed `std::vector*` deserialization bug that occurs under very specific circumstances. - Fixed wsdd plugin `SOAP_WSDD_APP_MAX_DELAY`. - Fixed wsse/smdevp memory leak. Version 2.8.23 (8/17/2015) --- - Added TLS SNI. - Added Unicode C++11 identifier support to soapcpp2, supported directly by UTF8 encoding and the UCN `\uNNNN` extension of identifier naming in the C99/C98++ standards. - Added wsdl2h option -U to allow UTF8-encoded Unicode C/C++ identifiers upon mapping universal XML tag names to C/C++ identifier names (this is a C++ standard-dependent and compiler-dependent feature). - Replaced C lib functions `memcpy`, `memmove`, `strcpy`, `strcat`, `strncpy`, `strncat`, `sscanf`, `sprintf` by more secure alternatives when available on target platform. - Updated OpenSSL and GNUTLS integration. - Fixed soapcpp2 SOAP RPC literal WSDL output (supported are SOAP RPC encoded, RPC literal, document literal, and REST). - Fixed C++ struct soap context constructor memory leak when `WITH_GZIP` is enabled and changed struct soap context allocation in C++. - Fixed redundant call to `OpenSSL_add_all_digests()`, since `OpenSSL_add_all_algorithms()` already adds digests. This caused issues on certain platforms with OpenSSL 1.0.1 and higher. - Fixed missing client-side `soap_recv_fault` with empty doc/lit responses. - Fixed missing `` tag in soapcpp2 WSDL/XSD output. Version 2.8.24r (11/01/2015) --- - Added soapcpp2 option `-c++11`, enabling support for C++11 syntax and features, including: - scoped enumerations (`enum class`) with underlying types (`enum class : type` is 8, 16, 32, or 64 signed int); - serialization of smart pointers `std::shared_ptr` and `std::unique_ptr` (and deprecated `std::auto_ptr` if needed); - virtual method `final` and `override` syntax; - `nullptr` constant member initializer. - More efficient C++11 STL vector, list, and deque deserialization code based on `emplace_back()`. - Added `xsd__date` custom serializer `custom/struct_tm_date.h` to bind `struct tm` to `xsd:date`. - Added `xsd__time` custom serializer `custom/long_time.h` to bind `ULONG64` to `xsd:time` with microsecond precision. - Added `xsd__duration` custom serializer `custom/chrono_duration.h` to bind C++11 `std::chrono::nanoseconds` to `xsd:duration`. - Added `xsd__dateTime` custom serializer `custom/chrono_time_point.h` to bind C++11 `std::chrono::time_point` to `xsd:dateTime`. - Added TLS/SSL flags `SOAP_TLSv1_0`, `SOAP_TLSv1_1`, and `SOAP_TLSv1_2` to limit TLS protocol selections. - Added SHA224/SHA384 digest options, ECDSA (requires OpenSSL 0.9.8 or later), and HMACOutputLength truncation (within limits) to WSSE. - Added Galois counter mode (GCM) authenticated encryption to WSSE with AES128/AES192/AES256, requires OpenSSL 1.0.2 or later. - Added the concept of "mutable" structs and classes, which allow for incremental compile-time addition of new members to the struct/class, which gives them a tuple-like behavior with the tuple being populated in distinct parts of the soapcpp2 input source. This is similar to the way the `SOAP_ENV__Header` struct was already handled. This is not a standard C/C++ feature. - Added `$CONTAINER = name` and `$POINTER = name` definitions to `typemap.dat` for specifying the C++ container to use (`std::vector` by default) and C++11 smart pointer to use (no smart pointer by default), see [databindings](www.genivia.com/doc/databinding/html). - Improved soapcpp2 input source code analysis and C/C++ syntax coverage. - Improved soapcpp2 output WSDL and XSD with added root-level elements and attributes on demand, see [databindings](www.genivia.com/doc/databinding/html). - Improved efficiency and case coverage of SOAP encoded messages with id-ref anchors using redesigned pre- and post node graph construction analysis algorithms (`soap_id_enter`, `soap_id_forward`, `soap_id_lookup`, and `soap_update_pointers` have changed). - Improved cyclic data structure detection and XML rendering with non-SOAP-encoded literal style (and/or the `SOAP_XML_TREE` flag) to prune cycles from trees. `SOAP_XML_TREE` produces XML document "trees" rather than id-ref XML graphs. Graphs are produced with SOAP encoding or with the `SOAP_XML_GRAPH` flag. - Improved primitive `union` members access in C++ by removing unnecessary pointers. - Improved checking of signatures in WSSE plugin. - Updated soapcpp2 `size_t` mapping to transient (non-serializable) type. The wsdl2h tool does not generate `size_t`. If `size_t` is used in your header files for soapcpp2, then use `unsigned long` to replace `size_t`, which replicates the old `size_t` mapping to `unsigned long` (beware, this is not portable). - Updated `xsi:nil` serialization rules for pointer-type struct/class members, by forcing `xsi:nil="true"` element output for required **nillable** elements (no longer requiring the `SOAP_XML_NIL` flag). - Updated wsdl2h Nillable optional element annotations (i.e.g for `nillable=true` and `minOccurs>0`), now requiring inbound elements with `xsi:nil` or validation error. NULL pointer-based outbound nillable elements with `minOccurs>0` are now serialized with `xsi:nil="true"`, see above. - Updated dateTime content validation with `SOAP_XML_STRICT`, otherwise accepts ISO8601 variants. - Fixed `SOAP_UNION_name_type_member` macro constants for C++ namespace `name` (wsdl2h option `-qname` to ensure that the generated macro names are unique. - Fixed attribute serialization when attribute of type `std::string` has a default value while actual value is set to "" (empty). - Fixed class inheritance from base class `soap_dom_element` (declared in `dom.h`) which should include the content of the DOM node(s) together with the (de)serialized content of the derived class instance. - Fixed default/fixed values of element/attribute references to global elements/attributes with global default/fixed values. - Fixed `xs:group` and `ex:substitutionGroup` element namespace prefix qualifications of struct and classe members. - Fixed deserialization of nested `xs:sequence` class pointers to NULL (structs are OK) when `xs:sequence` is optional and sequence data is not present on the inbound stream. - Fixed missing `custom/struct_timeval.c` inbound microsecond fraction of `xsd:dateTime` values. - Fixed `typedef` of a custom serializer type. - Fixed `typedef` pointer type use in `@type` attribute declarations. - Fixed linking against newer EVP functions in older OpenSSL versions to compile WSSE plugin. - Fixed WSSE decryption with HTTP-chunked and fragmented messages in transport. Version 2.8.25 (11/11/2015) --- - Added `xsd__decimal` custom serializer `custom/float128.h` to bind `` quad precision float `__float128` to `xsd:decimal`. - Added group circular reference detection to wsdl2h. Generates code for circular group references that is safe to use, but with loss of occurrence validation constraints, if any are present. - Updated and improved XML-RPC and JSON implementation with wider `_int`, now 64 bit, while keeping XML-RPC type `_i4` to just 32 bit. Existing project C code that uses the XML-RPC and JSON plugin SHOULD be updated to use `_i4` (`int`) instead of `_int` when `_int` is still used as a 32 bit `int` in their project. - Fixed strict validation of empty elements unless the element is href/ref-attributed with SOAP encoding (this validation check was temporarily lost in the 2.8.24r release). - Fixed missing `#include ` for smart pointers. - Fixed float type minInclusive and maxInclusive fractional bounds validation. - Fixed compilation issues when C++ namespaces (soapcpp2 option `-q`) are used with custom serializers. - Fixed wsdl2h option `-p`, which may cause type name clashes with generated C++ `xsd__anyType` wrapper classes for simple types. Version 2.8.26 (11/30/2015) --- - Added new C/C++ XML-RPC and JSON APIs `xml-rpc.c` and `json.c[pp]` to simplify JSON and XML-RPC in C and C++. The old `json_c.h` and `json_c.c` are deprecated and removed in favor of the improved APIs `json.h` and `json.c[pp]`. - Added a `jsoncpp` code generator that takes a JSON sample document and renders it in JSON API code for C or C++. The `jsoncpp` tool is also located in `gsoap/samples/xml-rpc-json` with the XML-RPC and JSON APIs and samples. - Added `xsd__integer` customer serializer `custom/int128.h` to bind big int `__int128_t` to `xsd:integer`. - Added floating point exclusive range bounds notation to gSOAP header file syntax, with `<` on the side of `:` for an exclusive bound (`min <: max` makes `min` exclusive, `min <:< max` makes both exclusive, and `min :< max` makes `max` exclusive), while keeping `min : max` for inclusive bounds. - Added C++11 syntax for struct/class member initialization with `{ initval }`, which has an identical effect as declaring members with `= initval` initializers. This works in C and C++. - Added HTTP2 support to WinInet plugin. - Expanded [XML-RPC and JSON documentation](http://www.genivia.com/doc/xml-rpc-json/html). - Expanded [Data Bindings documentation](http://www.genivia.com/doc/databinding/html). - Improved wsdl2h schema import processing when WSDL and XSD have the same namespace and xs:import is used instead of xs:include to populate the schema. - Improved wsdl2h output for integer enumeration constants, omits trailing underscores for pseudo-numeric enum constants, updated soapcpp2 to accept duplicate enum constants in different enum lists when their values are the same. - Fixed `soap_del_string` crash in `char*` string deletion. - Fixed soapcpp2 option `-s` by enforcing `SOAP_XML_STRICT` on the body of inbound messages for client and server. - Fixed a rare issue where elements end up missing in a substitutionGroup when several WSDLs with the same namespace are imported into one WSDL. - Fixed strict validation rejection of empty element body when empty when permitted. Version 2.8.27 (12/7/2015) --- - Added JSONPath code generation to `jsoncpp` in `gsoap/samples/xml-rpc-json` with new option `-p`. Supports C++ (and C in the next release). - Improved JSON API functionality and robustness. - Improved substitutionGroup union member: removed prefix `__` from member name and removed rogue `;`. - Fixed `WITH_NOIDREF` broken `iht` initialization introduced in 2.8.25/26, which may lead to a crash. Version 2.8.28 (02/01/2016) {#latest} --- - Added many new API functions to a fully redisigned XML DOM API v5 for C and C++ with new DOM API documentation. The redesigned DOM API v5 is mostly backward compatible to DOM API v4, but with DOM string `data` members changed to `text` members. Many API functions are added to define a clean interface without having to use the DOM structure data members. The `soap_dom_next_element()` function now takes a second parameter that is an element pointer to stop deep traversal at (use NULL for old behavior). See updated [XML DOM and XPath documentation](http://www.genivia.com/doc/dom/html) for details. - Added C serialization to/from strings with new C `soap` struct members `const char *soap::is` input string to parse from and `const char **soap:os` pointer to string that is set by the engine to point to the output. Note that C++ code is unchanged and the `soap::is` and `soap::os` are still members pointers to `istream` and `ostream` streams (use `std::stringstream` for input/output from/to strings). - Added JSON API C function `set_size` to set/change array sizes and JSON API C function `set_struct` to create an empty JSON object. - Improved `jsoncpp` command line tool to generate JSONPath C code and improved overall to generate more compact code. - Improved `SOAP_DEFAULTNS` flag to emit XML default namespace declarations. - Improved strictness of XML verification under default settings (i.e. without requiring `SOAP_XML_STRICT`). - Changed string deserialization when XML content with tags is encountered: XML tags are no longer parsed as part of strings. You must use `XML` string type to parse literal XML content or use DOM. - Fixed C++ JSON/XML-RPC API `time_t` type usage to `ULONG64` to ensure portability. This affects the `value(time_t)` constructor, the `value::operator=(time_t)` assignment operator, and `value::operator time_t()` cast, which have been replaced by versions using `ULONG64`. To use these in C++ for `time_t` ISO 8601 date time serialization, simply cast `time_t` values to `ULONG64` values. - Fixed gsoapWinInet.cpp:243, `pDst` should be `a_pDst`. - Fixed `SSL_set_tlsext_host_name` call for OpenSSL 0.9.8f. - Fixed `soap_instantiate` of smart pointer when instantiating derived class by xsi:type. - Fixed friend `__declspec(dllexport)` declarations in generated classes. [![Go up](images/go-up.png) To top](changelog.html) gsoap-2.8.28/config.sub0000755000175000017500000010530112653650144014255 0ustar ellertellert#! /bin/sh # Configuration validation subroutine script. # Copyright 1992-2013 Free Software Foundation, Inc. timestamp='2013-04-24' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # 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, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # Please send patches with a ChangeLog entry to config-patches@gnu.org. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright 1992-2013 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ knetbsd*-gnu* | netbsd*-gnu* | \ kopensolaris*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; android-linux) os=-linux-android basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray | -microblaze*) os= basic_machine=$1 ;; -bluegene*) os=-cnk ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*178) os=-lynxos178 ;; -lynx*5) os=-lynxos5 ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | aarch64 | aarch64_be \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arceb \ | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ | avr | avr32 \ | be32 | be64 \ | bfin \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | epiphany \ | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipsr5900 | mipsr5900el \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ | nios | nios2 | nios2eb | nios2el \ | ns16k | ns32k \ | open8 \ | or1k | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pyramid \ | rl78 | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu \ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ | we32k \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; c54x) basic_machine=tic54x-unknown ;; c55x) basic_machine=tic55x-unknown ;; c6x) basic_machine=tic6x-unknown ;; m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip) basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; strongarm | thumb | xscale) basic_machine=arm-unknown ;; xgate) basic_machine=$basic_machine-unknown os=-none ;; xscaleeb) basic_machine=armeb-unknown ;; xscaleel) basic_machine=armel-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | aarch64-* | aarch64_be-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hexagon-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ | microblaze-* | microblazeel-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipsr5900-* | mipsr5900el-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ | nios-* | nios2-* | nios2eb-* | nios2el-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ | pyramid-* \ | rl78-* | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ | tahoe-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile*-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aros) basic_machine=i386-pc os=-aros ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; bluegene*) basic_machine=powerpc-ibm os=-cnk ;; c54x-*) basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c55x-*) basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c6x-*) basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c90) basic_machine=c90-cray os=-unicos ;; cegcc) basic_machine=arm-unknown os=-cegcc ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16 | cr16-*) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dicos) basic_machine=i686-pc os=-dicos ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; microblaze*) basic_machine=microblaze-xilinx ;; mingw64) basic_machine=x86_64-pc os=-mingw64 ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; msys) basic_machine=i386-pc os=-msys ;; mvs) basic_machine=i370-ibm os=-mvs ;; nacl) basic_machine=le32-unknown os=-nacl ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; neo-tandem) basic_machine=neo-tandem ;; nse-tandem) basic_machine=nse-tandem ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc | ppcbe) basic_machine=powerpc-unknown ;; ppc-* | ppcbe-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos | rdos64) basic_machine=x86_64-pc os=-rdos ;; rdos32) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; strongarm-* | thumb-*) basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tile*) basic_machine=$basic_machine-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; xscale-* | xscalee[bl]-*) basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; z80-*-coff) basic_machine=z80-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -auroraux) os=-auroraux ;; -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ | -sym* | -kopensolaris* | -plan9* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -bitrig* | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* | -cegcc* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-musl* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -nacl*) ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; hexagon-*) os=-elf ;; tic54x-*) os=-coff ;; tic55x-*) os=-coff ;; tic6x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or1k-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -cnk*|-aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: gsoap-2.8.28/NOTES.txt0000644000175000017500000000470612653650160013730 0ustar ellertellert DISTRIBUTION NOTES To install gSOAP, unpack the archive. You will get the following files: README.txt read this first LICENSE.txt licensing information, please read INSTALL.txt installation instructions NOTES.txt this file license.pdf gSOAP public license APPLICABLE TO SOME PARTS, see LICENSE.txt factsheet.pdf Quick overview of facts and features The 'gsoap' folder contains essential source code for the run-time libraries: stdsoap2.h header file for stdsoap2.c[pp] stdsoap2.c C library with the gSOAP engine, this is the source for libgsoap stdsoap2.cpp C++ library (functionality identical to stdsoap2.c) dom.c C DOM parser dom.cpp C++ DOM parser (functionality identical to dom.c) and the following folders: bin pre-built binaries of wsdl2h and soapcpp2 for Mac OS and Windows doc documentation, including the user guide samples examples import #import-ed header files for soapcpp2 compiler plugin plug-ins for advanced features custom custom serializers for various data types mod_gsoap Apache mod_gsoap, IIS, and WinInet support extras contributed extras src soapcpp2 tool source files wsdl wsdl2h tool source files for WSDL and XSD translation WS WS-typemap.dat and WS-* protocol schemas for plug-in development uddi2 UDDI v2 Palm Palm OS support (deprecated) Symbian Symbian OS support TandemNonStop Tandem NonStop OS support VisualStudio2005 To build soapcpp2 and wsdl2h for MS VS platforms 2005 and up The SOAP/XML client/server examples, XML-RPC, JSON, RSS, DOM parsing, WS-Security, SOAP/XML auto-testing services, XML databindings, and other examples of advanced features are available in the 'samples' subdirectory. The 'gsoap_mod' directory includes Apache 1.x and 2.0 mods for gSOAP, IIS, and WinInet support. WinInet allows gsoap to use the WinInet API instead of calls to the socket API. The primary benefit of this arrangement is that "if IE works, your program will work". There is no need to read proxy settings from the registry, deal with proxy configuration scripts, etc. Changes in the "Internet Options" dialog box will immediately take effect in your program. Additionally, this will allow gsoap to handle forms of authentication not yet supported natively, such as NTLM (Integrated Windows Authentication), etc. Contributions are included in the 'extras' directory. All contributions are covered by the gSOAP public license, unless specifically stated otherwise in the contributed file(s). gsoap-2.8.28/factsheet.pdf0000644000175000017500000120330112653650144014733 0ustar ellertellert%PDF-1.3 % 4 0 obj << /Length 5 0 R /Filter /FlateDecode >> stream x]v7rMr6d9j$Ҷ{mrɉdK)Z)JPЍF E>GAw _Bϻ]YվuShL ][w?o˧|q_ <5>QpcxS S365 #o4PUO8[Ź iQơLkCM?M;u~,_#];4]SS3 XOM6U rY9hƪIԧ0@Zh-ibfEe9ًT^ޔO//ߔ_=)/+?T} H4 )4@E ?hM?ݳWOy_\=)\^-GˉLVI u~hݏ:ro?4t{\rwgr7'Q66&~A/!-T1ȟ3Sy[4u=0ʦ8IJJ0TK"ЖC\/sjǨb_Np0o=I}d)!Z_[ŎHTx+."/s"Xs:G!b_"wrCYRh:+5#;;Wy;NDRoh7D$ IFR.՛[^FQ !Cu.N1S<$<)/mcPk9[bNIo*1IÔvtQ/*Ǘ.[^"&sy]+h#rh=-?‰ Q7و8]Mrcl#F7ـ5GӦifpz G=6 UbGkWꚋg0c4@:Pj‰Px~!GB*RUP}3^Xw :*~KXG׼+4':@/vj7=!8"4"x"EaQDz#RzK<1~SD8,ҦNz z2>HY IeEqqwS;(BGrܒDEt jJmO]Sþ2C+[g5NJf؏0LhMdWLe=kL^˻7Om-ޖg~)?E6' "[{a=6(c- gh (&WrifKqMPm&"}W)m9`%:Lu )r(}Vǰ"G啱}2u!{" s8;҄4.@96RWrmu`Ǵq,?ܝd*[SZ|lfYH)Soz DUdzX}= *):2JT_x_*) Gq!-k(Y`TdoqC}RZ|>?2d&C \:1V:][B@K|ni 1Ms/ |(w#`vyxf@fXQ+`GO1t^`P[Zt {pdiDP&[WMMu>|&zc:Kz/H4r]ٷsZv([0WGP#q(~CczFXl;رǔ3z8E%4;g91}=ˁTvfPyC3 y*='$Փ v謬:*1AsDKm2M)/,3;\L#L\(]}lf!Pd/ewŎnk엚;o߽猼+jW,1|,אi9% HA)(\nj(Q"i캺YHqt;m{ Χa*Y`؆uc56k#0[::ȃFA}?؉l}_#er,jGt/@a3;e)&J/7o~[^|y|ݗϟm؏2ؿ ksUn-gLOmUiyV7Դ/!ʝjle[oɧ :!K%n˫W^3iImm Ӑz3%Jڤy35N_ .{DfR48CTN 쟳"xWXX)KN"4EXr-N,} &H@#QyM$C$zCK\Bme-<ć)Ȃ6=0]&]c_w%-bI=iESwo? 5=2Ī<#up9p'V)}@ss`A:]!ZZ%"T+W\NM >ТBFQj'ٞ]nFh i>}Cއ-TӈSy#b֘ `fWa z:Xy@_4 ӄ@_]yf1ӗk! ڝa!uRGS ;-l7r4vzcv᩷( r /Di-*gkgAQnmSgs򣒲iB(iAx)+!7' ?7Wlߑ0jJ*n4d;AFI zi$Xʙȸ8'2 IjD D1Jer&P9h.Ʊ`ӈPhu7t+|8E4 ^XdFe @%$بl"Q+ '$D/7UG1¿!HH7A-QL_.QD# dG:N" 'K~u땀~'( $^Cg|c"wG_AKȮA>~z: WAmQT@-=QݠjJU~u7GQ5Xx֢ ŚGDƣ@XuǙ%)t+rkH1>:: Sx,gT~><I /㵞8<17LGcVVRϯT09)Mc$ бƠވEx ITiYNKg"YB:S8%Yl @#mBmG66ly-l?hȃa'iy&}.˻ٲc ; :(q fXf?`kOP[ ){ GeNԠduskfN`I_qtJEǠbGQHiNkqzloKsSSi GW+4d/v-ncuTZ4Փo-(]|$:Ud@(S:5˅Uxq}ǞfZϢͅt7*uDğA_ו(y'Rʷ]}  "ݺqʑ>v+s(NEQq^J wh'x~'<F̓7ȭI*ubVʿ2f5.i/xe +D^c=Hb`u N*Qd(jYU 튈.3瞭EkԅM& ][Pu2Yk4Oزf>_GfyVXh&Oi81].f=DhOmw1Հ(v閚 C:j[S:[,LeUnjŦ5$ޯU8.[q!9x~9:c3i^Mb796{ nT ֓z=Ϗ~d'spM@emv5q: &@նa ҜC{am8E4akVYJ/`E.D#:ó}:,6LQ[v@~6AJ}yeɇ_h^m‘&@6h>Ԟ,Bmzeqn ˰~u ؔF@#P:yg:m^YxM#{h̿4o~mp"Џê><)w/wu3//&_DĴEPE}$t0#1G7}rMѢ C]OzrN}0#5~o=.}4s꾗V Kwm8f-tuH50`gz ;c˩D{zËf,bxMhb P΋.*ubEfg3@,Q9K'f'q"KZ}w?? μ{y_?8a$3iGs:aQ&u#34|g $Y[r |ܰ5]? ̑,a9T/7˱}>ql~=p yZ^[*G nX魼+y[P] :4wk2"`6%sܬDRFB 5|Wc^x"O7=p Z/wM9'\&l++ ? +RNC@TXH>O.N]Ё.m #dqTpTDg( !f{B?(NH؇ RiDe^GL5~.A~;4pv, Ņz29jxm ޶k`f''1F?|sI~@c"-j?D)[` ZrD4= t} f_!!|52god9lF(>hJ!//le%[Sx{pc_|Nvߺӂ9R}}*$KB-ҁjZ i5ro ?xr9\6\X1+7*mE3hYH9ptB_.wLfě9"Q%Hz%ޱM"IXӡf|P0p %8F0oD?ȥpq 卄 rDRx"EMT<^UE-Q{eh 'OG\UGZuQɹ Xƕ-oQ8hZgEh{ǿy6b^YUbj^kBէ> endobj 6 0 obj << /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /ColorSpace << /Cs2 8 0 R /Cs1 7 0 R >> /ExtGState << /Gs1 30 0 R /Gs2 31 0 R >> /Font << /TT4 20 0 R /TT6 22 0 R /G1 23 0 R /TT8 27 0 R /TT1 9 0 R /TT2 10 0 R >> /XObject << /Im6 28 0 R /Im5 24 0 R /Im1 11 0 R /Im2 13 0 R /Im3 15 0 R /Im4 17 0 R >> >> endobj 28 0 obj << /Length 29 0 R /Type /XObject /Subtype /Image /Width 1024 /Height 332 /Interpolate true /ColorSpace 32 0 R /Intent /Perceptual /BitsPerComponent 8 /Filter /DCTDecode >> stream JFIFHH XICC_PROFILE HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmExifMM*JR(iZHH02310100LC     C   L" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?aݧ6>=w;3HKo|!Z`@4؂7+ %ezWiy.{m5cvӆXC]ڥkӱ'<rx't~JEr5 Zm۟!Ez#9?7_&kP \W to*ST[Ϛ5+8v t/_xI"+u,:һmf']RxQkZk>+'B~`3TP0w纨.W"-6wЅ|?oe]5FH"l@Q?&[,s|)&x !RX85_5F2漚-T}o5j=^UҮ~9#?ΧUWz8vp?g\mΛjʑ5Afv@̹PVti9Vfa?X/\[Vu؁3 I9J%R\rrjnVΔQNGd^a ~xdɀrruSCcd=ZxZ-b)"WBytW 2vW\g9)ntI$?:%xok =oQ!;?5~k@+^ U&\ 85Faqk7߈b>eDln˞=Nr̄cO0I@{y'YFڲgˉc|`~u1ϗg/ksk+mX {QX^) r7 uJ؈kD2yN(֠bY TΥiJ&L*Q2;]lh#|YvcT%\[:9+h]6wιNʲ]N6F\DExU5NWHۉ? ^9Cx21^Mx~鱷b 6o!w"kꭾMh4N+WE@$\g5Yl2k) ITY0(?ZF4nnT~5`X)!GΙ~4ï(yC2) f'єswU"̋`|6Д|i}T|E#?;HY"PV<;?1T? HݢAmhE^ٶ؛X?s*9i>qmvڋ@f;]-D29a)r:vk@>kSQ+?j=N(@jW}.$\_WGcCOQQBqB?mz>M=.orikb?JSo(?/TGZ*uJHHndz[v?Iƺc?#1PIñ_%?nvՙ|?WJ[ȏ Ui>"hp.c~/ݰcu! ѭ}O~-Ѭide^y{EN?IB>kTŠE?_o:/#Fē]^4eO+ZP =]s :xz<3U}'C^jzyܷ5̛-l;iJ׿i#icHOR\uO~ $z5|D5^i.M"?55Tϸ|?Lnd~`Ϳx~OkNu{MpeϽxS)4˖LoJsNڮY+H[rLߝH /w"Eg?S'ڰok s޼*z ^nJ5{z<>WCZ|L@=SFs\-jbYBҼ<;.A5/gxSwgJ hV?{{$h%m+p~|IGb}+,\a_ʼh䝟SI'k<7|Tn?7)#}>ظ~Uc>n|8y)z3^CO?~'Ӯ $pk4X`RD1_Lh߲%tT,<]:x]ViJ INf_)f*1 cA?vexD 09#^vU0xSīf Fz [jIYa\38?-Cq:ʪ<$vrfF*sַhh 8A5AgdRpx-(%AUw&}oœxE^&>qּosGXTW@>~MjnÃfJo7M56reJ,=е*x(@߭Sq/r*v?C5/7qW|P &h >S3_x㟊%Dv ]_wv5!C'5R=\'.ݽE! }YMX<z!X$ck KRos]/F`4*qӊ>l2*~_d#psLMRSk|BGbxrpwm$*-< W;=k*j^~.ߋKb<DG`0?k[9ootg?jfj~cch| 07AP?_Ҿo>X[,>i?؃GW7w;38ʾ,*|uy~2`rz5Uǧ| orm"c)pңm㊐G_Ed|P>rO`y4yCp}Mm 9S"vqVv,sN)6 d"<'299ޚ1+7 SžU<ڵ.péTru8`z3|0=r+=c唒*\᳐T97Ra }̨mHICʐmG/i?+rc$u6OS"Nw c1=Gjܜ·Of@Wp$:暹aݩ~Boى9o@-+wYXI=mn`\XgzaT^)kcVՏ<~QJ#_q;ھ׬İ/01H:dVTeκuqgnٕp xA5 0+̪B٫ކUm<zҹbк2tݸz0?5JJpg֤QD9)([[rO`fz s ڦA;3 º DDCuVS 7F] MNcB792| `=koW2GATt&ހHwod[KN3Y׊6vo?`[WQ|:V9n~Ѡs$W]&z~ׇ,$3dZ'϶'a/٪3%l~U^q_=$3ϵ}+>G,p b^wG|͵ŊMo;k R@׻`8UVBmlhů>?ҟz&xCo9,%#WԬu4z_^ ~ ~f}u7OXx~fT(J=%~T:g7oϽ[}>vF*uپ~i-)RC;PY o_zjw_Q[mM'%+4oC,~˗#=+x cW %p[MZ;sVa-GkLޯ}+ٴH/앤Kb6&G֧Zi.i# Ƶnop+g|q'$Yyf|Ym 4 sھ/ ެbtjU4Û-A>6?=A Z{"s}jYtw.3=$̫| M-.,y`H3ڹq_S4uy-Jk/I9[޾}RqɆʬ>bÒxqʾũ\*fO@>b+җt:>]2,\n-"q־43FhE|,qpW6mc^ijq-7^/ ˸<5E`K9ȯ$'~5} թRgR2_'4'hkõm7уu ,#!x+)-ڇ:l5fWZ+p+WZcyEuԣ7cRo[P1\`E}(%X]6@mͬgtZ>o0r}x'WQOqnqV❮l%d\+FC If7JTZ׍>daJWZX^|t&Nޤ9f7(5e99x4$LU ~>WG;3t9ހ*~-\P*<7bGp8I#*sMR|#u=~%p6ZhwW+REx_o4`bMWl YYNGe9$gOX|{>}}﷍ɯ:Ak^UfXҰfb/#"|U/YXجPb4y)X!@(G.<̣"W>GB*,ZQ4xw!wX>>$<==GUt,=+`Ԧsgo3nkyCD^p6f`MY=7~A=8;lܠ#~,mdoq)4?폌ցڣ@}bϧ1'NC?emdh_F7N=:WÝJM'ƞ W1K/85%mY_6m>r*F1TR]SP ʏZmv3 K+dRR?Ӯ!0̚5Ěav"<)?JtJ-u>QU _c?2muan?A]7C =52D_͆<B ~%Z~ մch *~dS?¾R$mY~~7PZ|0R]kҶ0W9;B7GN*%gԺΗgc N d\]msf '6\svǴrOeBB#>5mbԨQ6 0Y+E9?ZѾ'jl' ׎xmjϧ>Z=J=cI ϟ]7$KB?85MݿV>>܂J8Ȩ*xca|O&. T ǵz> ms6v}0Eu,D$%cX*wN$`cdL$*5oJqQMp\nNw"@T.$(OZ+gw5VL)RxA^}C:."Y+Nj&kJXcB8wt^$Y3q{T"<9nJԊL fv2#9MW2! nʴM=E/W1ҟ%S3-N>mRvt \yMD.JNF*yɶrJ=z.WjkRҧ(=ԡۗP=[SYrv确 :[H ^6I?Y8Q7EΞ|< f^<3Uq |+ii̥rz27I>״E ~ץ#!˖1m#Ѓ:H&o*[d{Ú͹o۷' Wϝm5U#XI$K+|y!kQt#)CM ]⫘>Tt1z'謴mCaXk}e6o&S'6>ak_÷Nm1Wn"<$ˇh㡑ud>Y]+zyq_'^x}70h_5&vɕDx>#*NoYtR#K>W*~)Y,Hfw3ZE06GXdD- j' szNW(k7EmںitOGJ}tĈH>$Qu9FΥ8ּɦJt5zDūˎcIIj5fSǰ|$@ y8+mg2~b]qM8{j7ob1uue-OtJ9>t f?Ҭ 7l8GiV < ȤʾR/]nHѽRF~{|ogW 圱=޽'^Zxw{ɪ];B]=[mJz߈!еR[Ê[Ϗj~֡u+lњ٢ f.!d`pAIRң>­xmDGUҹc+JoF5!mKZoKq3< Cą +Fp+ٜt80=&}To,VE$[a$LvGxV\qj=Jbpgpw2pX,y^[[rU#bevjcj[q/tm>$4+_RxwWD4eeكtؾ$D| %TU=q\8O+FOi-Ϗ'<73FN@(.Y( xNkU<-_$lZk^ /~Ĭ9+ tu%Ni.ΟibZ(jsZ4v(㹍vF-tUH.;5tͮNUEMR8Pn<Zr\ v^X]ر_QX׈=B!G^|\):0U߃6PWZkQU@Vu0u^FXYh:RC *=?h XeI=C+ j;0$J+(e,izPë]S[Fs{Ec9f*h Ie8i[D{:}+vzMY;07]H 5/`TC$9z:ZًJ;-5?$CzV֛4zK뺽{ND1tMx[s?lu9֨{߂-ƘbPf,k<=Y8q^'t2RAJb-<o- R=fs˱Ͻs^" Rf+۳^0Xy}N[#j/YYܑzѷwZLc9 ȯ^9'{w#ZcƟ)$6Q+fb:+UL:R{!:=W&.cFu=1^i@ i?5m Y]!Xנ_5K S;~.x~u).|qjs&~i tbC9sF/B}pZaytPLWL՟/-f0\o L&G'v҂Rv#/ɱ䐚ݞSl!Nk'9+7wW 8UdԢa^w if+8C%vuOv0klFgR#Q FSkГwg:沾cTӣTj+6d iJ-o _Xva';P¼Ųɩ\u^tڠ{W-,wQZ~5 E5c`@)CA 4#j}@ٿëTk2 XA-+W+_cS_e.>* ^G idlS^pUp]Zsm>t>Eɥ=E34,:8#6Ii[2Dl%7vbYyuVXBGg*կ}~G.|:*Gt|F-P⹳abPN}AR2eF1@׵cFiȿIu;ޝp ѱWlh` 921_>|G ;WfN^\Ӂ~ٚHB#]kzqY],jwdcc^)ӡfdU|WWɥudtğ+`9+(4]Pnlrk|CoV/Ö/ "~16xbPuhH%kDee[:+ʎ.)ڌ[]},4y/.7VhL=ҹoRӼe]|ϡzÚ3qXWwm G"άr Ĺ< (C_h}-/z>\*9?yV$a _nW7:[{f`pS5Ꮓ d$p;Ed,*?+ ַmۖZNӆQ|hyle2m[kռ4IYV O)ƻ]WLJ5hK[!L$hLP 5^Ěo8ApGt +C2n5L[PW}Exorš= c1X.Hrϑ,3ou:ޯV_Mk1!۶IoɒHsOO*]#E|֯u,uh*s")j׎ [\ƻLg'+/Mr=_ֶ̦K(/!o=#YO563s l"z+VII` ZӤ)8{U#x4Qd{w,ÌvױxcNL^k&܆ӝ>/dvR.DZ5sJVB-s~_J4Bݥ=+f-FG ZNjo5f~՞&>S`}Zj5bӜ #mXWx[ӌ(~|.c rISfh&6⽹ՙK kӤ^8[kwyş!6`3_c^4',,w 5/ع[}vS*RR'{Rrêk P)Jm1=p1Vtj-Ȕe/OSn>OΪ\kikV-LozeXCT}g QH_>-G-܅ bNk⦬vFRV!8pkXeuvQ;-c孝c^|sjT|^m737U}=Y,H:vY]#-_5j-gs.x9:d5e2~T|K䉷QIc /-+a_]O2ckm2EMa5~-ηuKB*gf!>}6 ć- }/xw_I k irTXg-J?e|_'t3>!='|{Tձudp:SE 9-ȡRq.M-)ϵc:*.:ź5sj=ȩI𮪹ʡ>-qV:7yשMйe|9扞u-k5hOZ|I[&٦fP NԵ}YV,ѥu9ds*p*HPD鎢 AW j988O$j2 Td9v9V>zzk'G7t!w^E_!//Csnl\k'4!Z4s>ͼ7pku!cMtS2v)\/L{1}xiw`F} xG3ZSڼU5yQ9`~ku{٣v50POs^{ZM36ӎkwS=C2t|Gqq9$ZҩyQEZ^r| yϽaxo \jrG"\5EF 'E#Ӽb%NGp4}knHqx]l֕#{+}#& \{{ɆUs_!(;L,#q'̦ R-rUo\\}Ky:\xMލ?k>Ts-{HOf'q;kf72p* x:R+='p,A$Wx"Rn;ש SRgȣUkqҹl>k|zbWh5KW"})@FN WZ*v[PiXvI&!ܳ ϸjiyt}F|í{ xǥxǵ{F3|/ީtu)D˃r+ZЉ.֟(tzt)HuzbP=5b$@hjyj<`DJ͍$j2ּ ;AiiJ2c^ J<mi夳hf)>Wؕ&̳k%{5^_ yCgSA+'CVԼ={km,S4:g%fc헴g /F[>}NY}SE>{s}6v[< `𕚫ldr+Ƒt+Ȩ}w*j!C-+$]$\,x}%WWP}G}q <(Ѻe^/r; 6zbA̱9S{O} +Ƣ<㥑7E[ ^q_/AOar]j<Wo-F[{+m2Ym#8hDIsySGyAtl-VD7c+BKh:G9k>__F\w|̧u7iOc>FO{s὘ܓ[/`QQ^d+˟csyTTmǞ_qeEOQ^wIuS,MG\Z֖hM%'1ibq8wY[˄*Rώ>$-Uˤ"D 2zz`c ~#'2`$qh>ק\0ѼbB]7|X4(x} |3Mé||CqgZ1E(-!8?l+q*^Y| xu n>>mW8{>Ե9QV[R0pk̼)44H[b1xx <ӦU,{y"c/1>^}ԝgݧ׿:=V [OIҬpzZWºݗy,J=+ nQas,G{۩8TxlTcqt_ }|v𥤄Et=`jX<;>#ԍ|EIʜe[pjp3^Aǵym2,w|:ǻ9zc|g#5 mH#+~k2}v8BX +=zвЋ:Ա2EC>$3Hckc$ƃ9c+OjW2i iJvKvncF\0QT}'B.-OY_gg{WxZ*\3y:8<+Fܾ"O,7*+>> ⿉vךf2O+ m,{㰯9cSylziIyG}:vIyEU2te6~Lc.]IhM\_7+?as+4gi_ms d^N3V5(95_ )En}٣-2[":u⌛ԑ~7>7U.e-6le H>ޔL4^')1Lc6<†3H}k)'vsϾ&WMELgJ<^=z!! OpkCźuǭyRV{Qg̶>2Ɖ=j$UO1\8,]/ݚ?k~ c39-R;-mV28qqj\ȋ[XoMޤ֦6ַ$Juk献 ;[5 '('Ԍz8F&9I[t}NjKCCV,$ ׹-"|-j'z?H :JiOˌpZݰ潲ݚz?!F{*H6bOzI]XWB'_չ˂0bUc_E唥$As[iޜ׮h8fWk3KlIHoj.܄b1r6jN~ȳ}X+/4w8nA> w 7dVGwzⱵoP10|g83/ŞVdYGJ_hd*΢`39L3Gf̻W(WB[3OY*|ԑj-4d\Ҿ1]:(WS_F/WöCGD }i60$ufGB}0V͎.,ڬ{(TkCP]ĊbxO/J}I$C\v5⿵GϣNvfJQgVs>Z{ȴ &!TEG2Mg+8I$Ҵl{W9f8"Oҡs]2ívV~$ F ~}>Sפ?, yDEג6הYQ] [Uس܎ka< \4C= ;h\¾oC/ D&u|"i&FSi2Mn񚼰`UǥxnYmbzV-ZOIb'^ɭOVKfUcǭu6:dkx?I+%&%̉Siٞ!Źzor]<Ȗkћkּ}gF!iwl̠}kx(6Lb.#1]X|Jp%{W iׅYf\zf[;MФ.Z"S潧*>4ңW59M J݁M\݇EpmԈ83ֵu;`SWgdZKN+3R sy,sҿ:ZCF{tzgoϭXP+ѫC3ޮZ![4^Q_QmyWY1E6Wr#+nl5$<0KFᷞ#/?ޗ諺r5:<;C^y" {xwO?aOx5k.vR,p8b_x=ޭ}[\JHz6T'Q)0zf> [HHz>qg^H m4-Jړ=+sDN;nr$+JA-BUASiCR7|_/[v0dWo.0 B12{"ֹ%9Tvm}kO@?0ҾhS=ۓQ%+N\Ew}>&{J~+vdh0'We-7U s??8;E?:q;>д{>Sy)"P V5}jkl8_+};| 1_FxÛ_Rۉ$>S ka`>.$̱8Ht]Zy FhMclQ#yaՁA׽|pKZxk.m>4YOBmZ1t %$Tg_:CF%mf9y~FuU//-$լy~EdڼT!= jME24 V@:_څ\I"(i,dF3 CK BּlDU-7g1I(-wv#oÝM+a8;Ш+/r՘G/!8?J5i|PN]h:,6Ѵv:W_2r{(0XNkwm< vZolȊr=[mZ(VDUS r:C^c?^iGa*O }Mg Kv01ӛgkV3MA/S4 o&GuP9XT~TZ߁WI+l6Ąu%y`:fs,<_{wsҼ\W+c]$_xm&>x)eS-Xtkĥ\֯c~&x{^9\}*k+-kSdȶ8l5ᥗmp0ޕW m4eiä1b>V5\yq_P.VZ_ yT2+o|YY Ke֠H6WxE/;iN~S8tΧ<é¨_PAr+19fZwG>3 õ)^VkALx''5|ijVb/;ʲHgbyDQ5|2=CWsk-fcik_d8^N bU|Tc2]EF9?u-#xDf۵a'W-ۛ9.!ױAS^emAr-)%CK if2vxv^cT?v<[w#/(`)sI#g,Q_\[$E-kb9iܸb0N+jN3|ONT-%9}k7/gw+%s9>Эi \pGZy8ez<'.mnZɷbDE'Ue~mwi$N9x/̾"!W4uEZwṴJpY9eu%Зmu=Gb{ժsx_~NzW6k*gAng3[ɐp+/Dk``5y⹤em3 d׉k@,Y5WxcC,m oM8M ݲk^<TbYm f lS+sJzt=YQ#O-zGʽb⊰ZUY&N؞f/O L]SB*{8^={cQV1I yd[XˬG+_jWs^e61X0 e؊1S]5 c\v5^I޹mrL۹~UFk ;reٺs[_?ii+iNw\n+*hFuʀB}zW6WSF㟋$i^rMmi?"ʢg33\FӼo"]t*XT?>i-Y#G؟-u)SNwp0ZRo3E _|U=^ܛu~psI+pU>W^g?-r_ -:;'fEc]w$'¿%!wge6꙳@bN §O@O֭Xٙiֹ?AXf$lWX]SA{M7bO-H̯{ Ely^_žVv:Wc&rI8۞~]x!\q_DxJJCs{a ˹SG+p4mOJO]KqS|o<_LϙEusx+M+0@ښu:lw*2A_|^Z 8,OֿD>TOmyWz'+XÕ{56x}kV9%B+q,. s\'QӊtTF2U@Kn bHBsU/`2'!Gjmx32SGhcM\6i-e;hBWz_Dw;豭+5rT"I^$fOQx8tԏַ1s|]NHV&~$cM(TFWtմȜ8;+_tq#S!|A-iXýg\0SgšHׂN+jdS|V˰<"]4|3 _j̫ ~uWrCoIK+tDyQ㊫zf]S :mTy< ZjxY3$F+jmv[5rYJzWx1ɭ8VSAcw}ک /kez͌ukV b+SR "+N2]E42^ox"F$g_ ʿ-}?xx¶2 `~sշ俺{bU \-i~x\t&f/ב_$( |ksc %k4 C˰(S+g:c5tz?ZVZcV1b/>١PgAZνIr(csN缏9졧x%--|v^ /mun=A4ĈO|?kZBA|d>Ur9j>Jt.,<ꎣp'u)uqak+p5,z,渏>3n֘za!x9$e#<.uYgtۚoE`S#h*y9cvl=xC&%Dé iQkzwLu5>#i\~_?AIՍ84m\a֤,y'Meb\"$'ЭcK{Jc|zЯX~9,Zؐ^n?ڭm7NҔaC{G4{锬˃56lFO g?/WV[G!A; Dg-q`,Ο)nr`%_&>X1Y!cQ^m.]icw)>k|wl'kaNu8 ,^:tZGS#խzN^|@t s*2k߈X- l*jpInTki{H*!.-u(2:_5ojOɯ|gGG )Z0H+D:y"k#ލÏ$H M&?it4(m/& Zf'S:2dp5O_G?S\M72DbH$_况t!֖,m{U?#fH>*1k6|>f8DZ./gIwJiI%D7?}Ԥ2ȠH@< \Es,N;q}t{I8*e*$_WZMgҚXToKuTp3pi$~U6̻R=ꌑa!`duF6={{ԦӺ42MThs:U) #'ͣE2 u;vy@Ob^>_ֹrGU'(,'m~ήc}!PO$c]K 8Ahmg#;W4)=ڳ2Ab*}Ҵ#SZiX.: Hp{WN{eZZMR#hns^&fyU?F#wps{[6|E_3ͩX얚',JV{͖։GJPyh6rmd\qOëD'Wo^ڬ9iltgtRˤR4H~SU.W$5d2ynt2lm)ln^SҼ)cgoXT(1V-:MET֗2T<+5ӭ͓Q˥M;ҥVJ HwJ)N1H1]ΛqBM"T^˜֒7p.4Jq`$^֋2UBE2>AAhЩiOj`zbY[Mm)|lW΄^7\s_7VҎ[F@q+Rqbahomu ??t+f.rz |U #ߕsXsw?5%zr٤#s\e_ !hĻB88wuUa2^/%RR&Nͽ֛掣7zCq)G|ey[CD;ályq2x__J5IUG,@dz#uwjbEb3^^|lddNe xe}3^*}k߃!9B`/_]oVwm.~XiZ>+ FWKsl% U/ ulIǭt[`æ:S}~k;nw[A'8mmP 0z ]В4^M2t|*aHa\="J׭%kE7,UgQn{.?硩Ɔs暸d]qs˸bQƏ82Pxv5^+Ȫv9p? ZrFZ? &pWd}+:gBvi´,RvD #8 lɤS=kAu[}\. 1ֺgMZSg?:&X^ $~!Zز\;?A%B9wWݟ oo|VʴzqTZ|/k7>,Pm֯8R8JɨݭEc^i\4*DʟOG.▔BqeLckM.<>{_KOّ@ZhN6cxEI?ݪ_ o<1 r(붨|ϦMkwaV{$4.3O{7/bYR|ʚ; H煪zs0ܚ2yrt6::4q?0n¶]Yl9sX f+j [gVWh?0 ֆUj5?ekO-OOwƋV]_LӇ|(t?V1qXb*=#RR,ݑZU2aI oƇ}-rӀѾK0aP0S2Zl_# V3 QF}{ZzxOQm$0,:ײ^\ .= }I~˫Zy^@q yҞ_7 S^6}O :tʥs!\Ov\rkXE_C¶VF\. 9m1k25^JǕQkfqǽTZY_4[N( g㔥^,:.kح$3:sX6B9zfӛhgsZ; 蘪nk1k u&*> $z⽃:}Ҍqώpk>jOa"Fvc0]FyQTv0'^L/5VӨ.yoL4؁\w>,ģ\ĿݤEf=1_/ըMy a1YsM}GZDF8 ?Fm5z4X~&5 fծX<0Ykk~i4,E>/ qb"&-} 7Ƨ_Q*2h~c%+v6UgO+[ 鳂dtż{'6ۜ$IFsYn%'+g\U; }~۱0*{vz?ë1,I$W+־Nh7eGկfix&V2Etw&O\Hṓx=(t$CQEgˢDmWa֯%PYG>շP-l0q]Ǜ-V8NM+IGK^|LD`Z޹5+gcHa&g\Bpsp:ɹ̃\r4ƽdxxMOǫ7n&o>*n/}uD*~  ?g)Sš+<Ȟ`W? b1xXe1 #9N<:,!@=9u|`b~˓ ctⳬJV~A59~B-Ñ\N9jY`f'ӽR wk샴 ccFdltj=b܉l̻4Bg<#O,;tܷ=ZHibIhC<@V' >j7\5NW9wtnۂǯ^ka0UtڴQF'f -Gf6+UBIƒZV`ā<0Iɜa־z1izƓذ^5kmp~v&5iMɳ -$y'qZK}>qI%%;^xNfRz՛yS%rz5jD}VԜ3j`?9S#n?r{YCDt{8reDUoCƬeO)H1qRaMhsE'1ک^XQ5e%To/$q='UX#Mc- d961pQe=Y0TKvCte"s>}Wڎ)P O$zףNn5"*J.3`ڮ2Hp3X wrQfW-(#,kO;wu{آbg\]yt|ssl mr➚*vwgӤADqW~ 4uJ󼳀}^5KG_;[42S)Iqc_xoųE<ӧ:eq-UlfF;]45OOb5Oja$D\z\Z)C(T6H=ED9VyVFdި \)XvהI:f3ֽ%׳^]Y& Hk߀OmYķ,{RAk֪ޮc$"t6|KV7?(.r+vmy% Fk8uw'8>~̾'mH q^v?Ѽ4hƧ+WGx/?+t׎j[9"(4O3槼(cExXb^^Nj~YWׄ43[6Xd niڀyuf jKXIn7moek9o$(0(` 4}E;]>X[m^4^ƐFYkͫK* u [zͷ k3~3xXԮrWF(\NS?8]<\1psCFxiQnzozl0c!m.І~j8>hi<;#Ʌqϥ>xOEF]Bm! DzUfLkeYV$}ndo/uuO͖:]w_!d<{:ːe)JΟZ/y']7YOz+\{hVVKWEaj^lFWI^ϝ.O,效5ꐗ:3lNt 1X]yr# ^n(pzk"g=V=vϽp\ x$6k 쯪wgQ7uL9q ,:+3 @Ţ]~#d 5fm.Y7ջpұ%,Qyar=i`(&C gV+gnJu E%%ZpΧGs{ Cj1_7~zOA(B}1'J&0ez<{#2H~R}Yk-q4R>|04Z35\ir&(k%QO5%ЉW.=ZYugN_6QUJ{Wý:#;RAd\S)o;k:xeu+FVylJTui>Z~)= Aֳ4^~й%~eC0lS?:7]dFb:yԱS}ײzn8H's #:Xg-E`tMî L:uE( <]r8 κB\lVQ*958ԥ:m xYۈ:cڵHϖzf* ^F"hJf1Nr{V ف.\䒢2.UoQoBjnJ<A$sN#9N+lEz88:35J.Zv;yɪԮرhۜ5z\#ɾy.f 'w:$b+ClFwOI77Qœ3qtUU+;Ö)E?i𺱏o.?ռmŘ' Wia9#2<=sSھzҎ5R\^ #2Jv]]}oaS)=xX1'UBɉҔfM)?skhed _:^(k[_Y\<1+/ٯcz+y5 Uu9{NJiIҺ(d85ZfmL|\7<__B/m} %X|^rj0r4g__S|U3Fd)־BM[SKR h3Ԛܒ/ xe]ϥp"[J5ukXQ`Vy]=khavz>Z^F*su&[|MI 36kng2I%oÊ[N?qsE߽r7f / Ǧk ^;Sp˞Yml i>Y xCv vCPu-![FT986¦n&Q#8OXhWF⍬J~=MrƛxXu#e)B;=ڀpOk#_ ]kL"ܮdilcrw*qj$uT"d\Z,_5l!u#ָ[(9UnZN|#>(Jy$5oMxH@:_-ţo s^cy[+۷73ד18'N|p:jpi6۫Gݷ'}H<ǧDjkWq+ {Gn*X·9'Ry=W']dz51\%LFJ9JI`>JOj/7>?ϴ4YXB=X`Wk~h:蹒Y3^y7[]7T[rJhrRbkKhj/>l*0^* ~9p)C}L9bܞZ%ijтY>l3 ߴBxs [ںѢ{ٮIy2뺱eG-.2סO%zX-ٲͨ0wp:eL4[cuPON-e= ucF"Pǝ5sh}η27Ev&H5Pwʽ9-|YzoHђXxԍU9=Oj5K>$fq_9{fٷviөGX;1V>Կg_Ok߳6hKZ?\-䀏S]6k(̨:We,Io3~xKc\փX%u^+b)&fk?pu8Hg7)'5Iʕӕ.Y}gs%2ækfy58ѧЩu>} J[}vWhc9qብY{6)#(i0j.F=ifn,IN[.l۫믇H#ңW ;Jc+<z$KqV,﶐wT䘣g8qV"\$ )\W~yo5]汩[m> 5ڨ-'h[\d 0U5)\^qY3rB`z՘ r9Mn29DC)u_UٯOZLwYҜԛ&f-pbmp~2u#ٯCF/gޱ3FryaO;\ w(ՍՑjMB~\-T`0VSfVQE| '"ßR+<5Ηڵa&Nָ+ͦx5rk\V;XC=+#? U*sw T*H~y[{SMz^9go/ sYw$ ZBq@+Ϝj<ʪ%,]N?R?}_+aVQWju~]6?d iB5\vSiR-#ݼqc7z^;S7ןҹ?|<3G5<׌5K)PҺߍz7g6HEʼncWa"d~oϭ?%x4&{İi1yak-N cOTtԴhRHp<;6Cm6pOZ% $p+r(N}e)+U[5,ᛜճPy7 5,Bx[ƂUf!ujxϭy/mQҽp$QW+2saxQs5N:=.jJO򯷓*nzykgv:uE}YBKHzWA᠁n8w@}W4aʑh` "3vֻI1W*c9V}?}srUz֎SG.ﰟZ<GK7?}_"-ژP (?wZОg%X_Sψ4;ǎ=F9[Ѽ]4#ˑVw2rw,k*3SEӫ(>[k >rŰ]ڵ8 g5kvr{ӳК~E$::ղN& gΞ*[ki9U{IL,LWW"DY',*h<7]ΉW,L"Fe5.// -}g:Y]hpѲw^jR|eaӁTޓD}LU]U18ǡ 7QB>R4/°n%7,YIZǞ('u-bཤ7' .}jǍu)H͛?;~u%Ytc;m;V>֎c/`mt\zWqM31rS]˫O%=_"$[{wŦxJjjs >S85ؗɻ45S>F:w~ k## ^E?x͜۴G whyw&5QǨ928cK Y=IZV"kCZw|82®OZ2 p]`ݫ;&|JdN{VOb:Ѥt fRnJVki0N_SCt I*,$T먀GJfu8xʞ7+Ԏ]:VܶoNxȤk{7\I)~=ah*0[!pʙnsL$)8N1wzE@,pGu4 M8?Ms֘s֜GT|qT'ߊGwstɻ,{ԑZZt)m7ү {KF g1=1VmJLt_fR<!F\Ԯ 3\%W2TUJWPM9'-iO94k65ٔ>56R _W ?vQ$t՘C$maF|~ۯc}{1|<"3ѓ¾C +Vb]+CxIMlKujqs^ܪG9!LUKH4}RAey5vO5ˑW5r TVU!F^k̯@(q>NUn%K s,jy~4AmddW,ꨝ4:>6f.2xG0%ܳªb%l, L3JqJ< Seyr+%{'F=Ev n&)#?t>x˧,k3.k3,د4lc5:x/X`zZh¤6e':Sx C=|wy*bƾ,vn-|#xT8+"0~jǟ(ڿ>St>E/k>GL(&<#zU3Ç+.'@yP+S̀ Ev)hsw^1SՆrU[-=*XƼM()+u. `p G>/QqXzϊmtd{HQxb?xbuݹKu8潌DjJ53Ĥঽv<=~FijzC]nbNH[C gŢ-LKFޞnH*ХU+֚o{5QvTao6#֝d'-+uK)8\5hBrH`1^yl=G.]FW}O ]. oc0߅Q^ZܤSPmݹ*Αs.4t))'nJ1^[&Mg]Mym\ ^jOI*b g4-qx:N(D?C^e{.ž^k2IY47qUsޤ%@px5FY!< I`lkP dM)'ajZIrq5Rz79'+|W s]a[9'?A;w=~8e'DRؓŗ)ޟgvǙ G 6m&Jv?" ?F5+}]/xGCA(W@~;j!R!i>bQfF0oROf9OG\9eSufmn׎jb {e}2X}J=-\־ sYMיxp4ڍ5x~UIT5^vHGNyXM KU%]W)YY.BZd`Jnx_Ri`5'Q X*?ZcH4gf ?\Y _GF1SJ +Rz_=qV̓DAVpur]VWTLzt2`:UyT[̮d %&j)JےFsSpxtizKXYd=JAii:Xxui~}H-/?bBԺL{qSq\%d> 4[uȐ`KY~ֲѱɐ3MX Su<ձ攆Aث+й5,|⾤ۀÊ~,/Fa]>XWbJOǍidlT|cc}{ji!F+N&%67^AVCz֒|.fw>FHYSU/tF>s[w4[5h[K"K&<|v7";K7aR*k>v`}zTmzF\xXbM@n)]|dNۚS\|=9d }U:biҨ8547ZZV+# {1. UԬ"ӮT9 -WS4א0W@=Mw:/ƻ <:Ն`٩H+4oqHTJߝvoĝ:.d5'qʜG]oj[A0`W+(oiqW5ՌgF++'i񅽅yOz?ڿNBM;>Ɓ BPH%i y"Ե> {3IJ9F|xgB{ pM|ѥMherzW?6rRF$Ӈ*ͥvg7E$R}k5όyƢo3ǥmj;9-V=KPkY}W{5b+uu9O-{ŸZKPgNOgU8Vὦ̯3\֥CGO '_A_<%ǭEh}޹|GѾ'xaV%rOuh⪫IVkO+?):42g~DHR5#xyzooƌqJ~͢q}hp.!B-5ϊ7M+Q va@"{޽⬾uj(ؐSOaRt:tNdZD(2sEgbÜd49rsUHj:D"GX8mԹ] GAU8Z$mvjS8%8Ӛ+N+,JΦf*ڶUn$Kp('5T s߼Rq^u[u9}kqs#Y}c2lĜOZ)OQX> ˮAg/tdR)}h Q^nHAR]ca?JA'j-2+IP?g=w'L2aQY5B7Tug^9?kWd̓U- ȭ]$cx'+ţ-ǎsq^7Vp[?4_ 8(#6 ^?l=zK5xGlɴj .6^fv#s_]JfqѵV}WAܵ<` y5$1/UqIޕrRH)1Sȥ-c z╇rXjP197O XpXK9"Ͷ@WEt9fwo6&ϣӔں`<Vt3F]xW̌fՔlC'5Lc`o'MUE.6}3R𦟨UP8~eFv}kŝ>W|Ӊ*x$ȡa)B<$\ױ>H4ϏZm0FƨޢL>=qXxu]h<œ,l 0tۖLz֚ӠW=}f+a^1xhFOBh?j:K"5;6? m ??pZӒZ28\?4֤y8ٟGVt'S$U +̦Gf/I#B՘! UmCVD4>SewfMk*AN,wRo&"q\HS{@s<[}k|3![t0իѭ5m:op[˙B,F6z1?I}Vx+k̾5GjPZ9WZ_NKB8k jگcv( K;y=cIۼKfUIb4Wj.;CYQPjAozer CroVg$MX6 PVW*Р9w:J8şԠVԕ5\)KJ +2 C&wKm|ReAm:"iWqI_}TaGPƣ9SLl SUQk!5fzҋSZv(&:W5\ YkI_'o]{נxgDOY@TI$`c^5^wyrM{;Axt1mi>"?q _(xOŗ>`C&a_ {:Cbp0Uv37mHH |خ/ h~ P SUhYrH/n=xFIs;qO37d麭΁rc?4o]-%r8\uEr=+h3{VZkzFOh#.: C]Ə/ K :T(A}o~_?`V{Woj|zqTuAKό/v qھa ,Hǭw{ۜ0$#|] [a+vE=+OP/.IVT%>^_G}}7}1 SĚ|?DfOkkE=V=ׇvnss9gkˢbͲw3[~)21~??]&|]"BGԏ{N]Io[=̧!)'E3q,ί1Sٿcʨ{ $#-^u@tYST-n~ /T1ǿkSH q덧Ip^3E W}OF:4u)n/;b+W^c93|8񽾁Oo.u_u֑/wtOb2 (su/V<2xH%xb daєk11JXYi%7'-5 2; W7 Ơ+A/4OROOqR[7E:澹/GZ# ^h-ճ{z8>zrٯg,3cSR-E{L:z[)R3uN 4b0qfjre}+FWڙ=Ԧ>Y\ZTvV5vbkzAq> mx/r0H~,I]x W:_D'*.qΣf>**Wfn-o"[} iGq!v҉E`|W+x;UK Q;H#]jaG |3iy/ĝ8YKAoNk ukG-B. ךxòLNw`Rxqe`"n0{kB@j;QgB 1Mc^G8'A-:/&4D:]HfCu\)EKP+׮emFmayt?wK425=@"62s\rݪvyڹ]bm"i'mNkƚߑnwZ\56AUN# 7m}u$ՏҾ&sK=gxF_t3Ond zf]N+| fGWk豕9)/Bvosq!mz;fjSEdaܞAXP.Wat㯯]F?v{ke)KW\ZKJSK`Uղv%g֊I'" &3NU朊Fx 9qSy`4AW8G4J #m('u+40r4"Hw'=-&i1YRT2kx$KDr><9&W3LCWKc\VVo|nYiP eǥte{=-ǥtRpau9Vqkg.5Ss8)((֤o3-vj7qYPVekG cV5PtHO)v@5c֔uW $MBRA v }@Ri6ۏ2Aa+Do.60~4QFcªI F|H6qIB]([se"%p"ڹl  cjdj|\.xGB𢌳 m"RE=TB֬?&E^3V4'VDӏh7z趐榴Z&x='_r#\+ס0xp+-x'p9u 5ux.XB{xB? ؾd5gROjb[5G F^׽R:<5:u*n1d'_1w[Du k+p7wE뭖A}o|ut'p8>-j~/Չ3sW<1D#9A5O`ik\{r8$ȥOD$:YW oXZmEGZM𥦉/U ǥ 'd|usH[K0j|)tIU~SҽsXQM_6zٵDgj=gY#诀?0Ez&<@AdW~ >-&6,2վ(_-öPfGsδXrȕq+F|BkmXT޷à+չnEf73d ZY`vG"¤YJo*v溭}SHOtJZ} ;5&~'ܼ ?moCp!W˿ R[W2ǖL>ua>gyQƗţ-m%eתA>o&|ǿ3Iul7vW 7|F-~R1M]:4ѴWp֓kvjat@I Vl'p8Z*9˪3R$T*MKWz*GGNOg޵/ꬴ$ WһZՔ:Keb~fɯ!W|Uk Ir{r+46OQPwOc(6g2? ;^h'ҽe$t,rP^ge"S}󩩰GWbg5F=rɵ!N_[<+a^㨖it2Ǹy,5+eKrtԎ$? uXy|irM?2|Uc/^N'Ly,y["񏁮YZ־-:B/s_xEu(@x|f)A~Z?G|9X(ATq}Dbh+Q{z>-bfٯKKuo[H;[oY;}WϮG~F-KEm]>Uܗ ÿ|sKפЯZLa.DF yo|V~-xsuދu]YZRa?oO<|sԟ⹭U<׃xSkX=ѣ[/O-ϼjߌ1kZB[d?9#5iS[ 9+hl|W9iP2l" vvxL!U4[q]X 0Wm i-D2 [#ұĩ+)iٟG,S^Z]5fHmLv) rv5^)MX01פj#,W%]8Rrpz`k+-W@zξ[+k2ZR%{ Om W3* (m>>|%mԐ$TckH϶mnH~k[F *^JN1Z팪Y{imڽjTS牍ɻM{v 0}>h"68#tBUwV*Nqkiϛ/m<vBW [⺘ulqBoT{|G~Dmzu^Y(26NNH5R W+'=Njկ|,H8yu2'ˏη|Gn:WlP5-X]xjTq0Su&q~=/rQ S\ ŘrO$_Q0T*>H^<`_,wW~ٮ2M}G$lm:yhYZ|O QP)n r[ګ^jg>/mia8T.ۏrjj--pWMLd ]@'8+VF~niZnץ!L]6m z8so !2ADJٱҼHr9:ԼcʼAcfq}Ό-LD4tcm&ȗw?n7sMyN^c&j/ʸ+j.Rp}O]ӥsլ@E + W/ٔ?ިVVZ V97О+;xs(.C®Z;BmAAYuwǚG!<l3Z ᝛|3O֡89ju272mZ{wPl W4{KUvF+ Jyc*OulCn#8J%;\iQ_iH9*: fxkޤEfρY-z屚θ_qRG74>+5_&_k?} *\7Wٻ_[ўlrgml\wu;hv8 mnbXyljw zTqWdy QVgMk2Y1b`k^ك.+͔؛$X$qLsҮ@rd\ :kchkTaWрkv 83Hҹ u52Yԛ6ǚ-l^\RŧÀ >G&54=#zFQpb_i]@Qgԥ%ò-!`fLѰzb^`{ecctN=T3zքVP??2r) e/n; W>v_JEՌsϸ\vG%Z8Jxȫ6yCoSui ] S_*Pɮ^f})7soh&|?i/۾5*i}6@5rVyc"~uYTQ:&7F[+i1àY=*xkQ|3<{O?j7ҕ8K6uOBG,%)" Iy6a Z@Y0~?I_/LqVc& hL1_Ji$D! )Kw&Wy5W4Vwg+7y G>3YnVdY,VL0}ohnL^LpΜyL']wluO9#;s$aVo=:_oy{W _Q_ bH\ԃRBz3GT+ X!E|s/&O4I^_h#.gq?cxQ[#swWT)pC֩V Xl]B[ `y5x;Ե-qПFS^˦|ˢe隖?8d$I+FQOЪrW<sҭxh 2̄-C|:T2*,CzWg#O}OTvvJdR8YM(Q"=6C kOè^P/ݏ 5 vӤYiL~%OeSSUQ]*\C pUbaװxlżTHvaF2^^ZTmD\G &~6TusGmHUpA*+NZ1xYvܷ>#?+ [&vi7Mxѽ+!ek31_g"u52tY:>n?qG~z];A:![{qRT^_]2]a^N&麄%ݻsXr3_K |aJMQJUѵ(nmf߇ Cqz[nmff_ s|Lߌ4ۭ#YWIEE% ھG bVRjMi*u-os+ JEgƶ^`\9bC^%2|\Iw&$wt=6JOW _&5Rx}ygM”}߯Y|}Ib3v#S63ЏZ?þFB'Ҽ7j𶡣g1`1=qc8rUh:uGy3lSYQĻ>knj|%j9g !P{aot89q^*-Ks+2;k$yA~W_~σsCα$/wHvPǓ^=E6Jq}@+8X;ZI)hy: ٮUcaG?Aun!=vLtrtԹUλp7!Hc I֮MBzFf (z"ŬIAִuC SSX^#~ çiWN*砯敋K^.d.rrj~N3,X|((zcԎkOMMgRMo[ыiQӏxv4^Y 4Ǹ7Gw}+N?:pC~W|sILF;+be{=|?T$K4{rˀH!d !:NsvUa"zchch!|,̺'+;BEK hÎOoq7iwBUhɾ<ļI ?*ӥKpʳPi܅kgI߹e[;컷'»˺ t G[rPFsypөw'&>uf!uDשؼavWϿ ] m^a-.8veuV[s|/VΎ+Fb Z6rˁ(iͲ4ߏJOYBa|N]NtQO]5J*}My|C-TTUuaF ?c."SC.,tؼk+4,H tȬA{:«MV̖F'=!}xHE0KZ<R&#O5k?4>#l> l T+G /iER緼o\2k15 > YkJeZuI g5u1ؚ9gL@5tפÈzƷ DmZ> Ĭnw y)T{8M+ŗ],^đ._Wvs^_qfiiCz>?Jx]"¥$TK!vА`ǓQzV;TlwWn:TmjلsP7'4 ̣,oo 5lV9v<ըcHM&VӾ2[c*v~џuk OyVU5_o?es0=jj|J>ҞtO̸1T/{}^i q5u.;A)v~LG M(dxs_Gv 52gY,WR0m?z޴(kRdw=~zpø{:JZ3_:DI-}_×B)3Bk=kRHDl*81{5a|]i=؁]߀i5HHI`Ee+{[j&+cs qW=.N\s1k~ jv$?{JwĞfx3e^Jk%Wt4k{R$sz_>$!CUk>i:%={mZ"q_ApӇ*~ycIFkdՀrE77Z[y?1s^a\"S\$kNS 5Z<'qOSFtR0jkOSLvlw)2R(&8nP&SY<ڜ´ 9Sղ֟!^-eDHcWox `&亹;s1*_chlgnj-K@eeGrk~1icvzj 2FMg~-bTњkz͎ $lבxm*C+=}koYeY|1)%f}>1UtJAf5]IÐeXc3貨bQ$P{!N¯x# Qp?@j{,VHG3C{Y.Eg WExo⹙K ݕmt P=H-˜JTezRk7a.s7|AreѴnDQxLM.?)qnC@qx>0<[xx$[ֽ6ZEe!ss壜#jj'JSŷk1myP$fڣzst5X;u?Pn⻭f% D|_Xm"2GBqP[^OI%"|8kvN5 5%Q=#5_i xCNM¿ҽ*7ޥsx_ُ^&Qң 6HNԊRTqݤT||a7WiHEDźOC=\؊ҽ|s\,~4cE} x ,ƞ0ɷ֠Ebl$z6y;R7hXZa*b5FM__>l6V$}+Ƨ[ɚY\%\Գ+/Vcv=O``?|D8 uUQ=[y~LaA߀2#EL֩(3uAS]tIfPȶc;uic%`d(4~_%)_}8rAisIb]>~Uo2Ci0a-Kx{-.'lu#V-Q^$۵`\xxgMry4PCČ9qڬh\3~8:I@@-Ȇ$ssXGṥJcV0ZDyyg+֓R<ЄL zؓSežR\}+|whRc'@6ǂ?k˩:\Kc{*Iwg)1iݷϹꭓlVZRr~RRQWh|mYZTy#nbdP䞵8"lͷ! e[$-.wj}+&+tO 둥% #5+҃иZ- u\"T11eAWK4iP0g@޺t]&BVe [ҩ7?=] $ yPE.#PVy}R;tqO3Riq〠sTo /fM:$u5.6Wp!_;EcYˎe2sX*gs<%qW-&i,a&ƾ1mڸKSK` i:mD6\[ ?G0F1|x%)$#۳U)YJ'D)g\kņB# cL6q.hl.mH,RvNaޙ <]JߋSm3ķ.CW+2Ǻ@׌hRжcbY *ϚglEt}/>#[Tvܪk2:f;t鳮d`ncW9crNVʛ=R8^mwo_։ZfB:n1qvhq䋋=.aJKQ\U)7ZZ签^&>p TSu3\vC#bSԂ(憿sY Ӕ!ϵ>V;_*x"Y.NV`z|{ (Y!s{r=E>moju+H̊ǣnܥs/W|SӼ3}˥xHFϰG`~K|.7ig#$]D|pL\+)svamdEЁzW׋4|?⛀T&S~xMmGF688ȯ/m~wcp"j^G jgkKºg-cFnb8gG#%Lk0PZZ>ǣro xDebcWJ n^7ZxxRcyy`sܥZQXr)tFt'Iq.%+}/nsNP5j8;֡F|Ҽ[ &8q^(5.7i8 ꕟH-"[ .:ܜwv)_Cǩ_ 6xiFg +޴):\ !ֽ>u0I+>fءV~ _UnVGVQó 5sFA"3)Ҽ7.H3/YqܸkHG˷8'4RTk^u3zo\ 19z/3jx0?z!|Gw]+<$yјײxgŶ:HYK:=RVmc=Ɵn.Z02+ bFsO@Uu5 E$y1x96nxv51qfk/KC r=_%6*U>՝sxBQѢ'\d]DۂHمFU`:zbZUƣl|R湏ٷ㶥sь3c&I J|ԥ{I4}n~eSwgIjRua n3޿C~~6^?ҭ剾fkʾ)gZP'9` cREzZV _OK+gMUၛSS_6 F7klutz.Ij eLƼ^[^'kTERĕT(l.]VWՅkF'>j0T'2`k 0||JrnڢGҨf5l7+[@衯.&aG,*ԚjjbQ5ي\8poC¾%ZԤHCzkĵdz,>o>_@RRHw^I f{!vyy#QQ)!Рn,rXWm~uO _È^gndϝ `-ZuPLdT?k]so_S݆u Aj =Z ][%aY 5)-n䱗hm۔76yk|Mt#@g猨/VP|J= N/i{bT-xTrQ4Ǎ|/abe \ 5{d?ѵ-a1cċ0oάx hWvy|ն~c>3W|SstG+&{}FmIkpўU&Rw8 O!`wm Dg|"o|tgIZm=QcjZulVŀ1⽫vӂDGZɟa%C{iSvrr?ufPI*C?=ѩ5}sㄺvk] xPwt{CxHھUWc:ι^4A_8'V{?W8\2׽FZFp*RG.%=9W 99e_WV'mH.y=(R'5Kaw7GQ^#ǣ1o`N$^1]e$(99O-\R=M3e㓞ΣMSWXkT]kTXp~_"GDBLo[|,.:4ּSRy%RO$ⓖ)$9/Ϭ5ĆIUWprI[VF kbĮq).[EtD2梿E^mb}jw~WvZs}YC41I#9*ml~&o[t+n'1$bAQxN޵| =Niaj?\8NLI*:* 4ۺG?t~> O(18o1 pz ?^W-֭+H J~8LMVzYi{%a/1_/YF7M_&;uc~t,2}X>/n8HOUqB99pw5TmzPVNLfj$-f&(Gd#pVޭz.X2rN)藚6`!KOj>t+sT֪++szxWvB];nj|H,JZz#,(*&h C&~Ҿ.rk>+3sP[G-""3WZ\J8"$dP:?0^H_W<Խ',2nPޖp$O6܃Tq01Wn>M3; sڼOMNEv^+zG$gNP}Or~5n# i(TZ .u%ЖYI ȓnL~n1lN+n/Yc0u5% 9!s+e$0H5kOoy'sCm; B@|?q rXkV$fF?am#Epo:IUUs*{e+ [SNSFR6WՊYѾsV`x4_=3r*yXrN7MJ*e;դd2(zTUHQVH̬0íRnRRr¶u5a_p!Ԣ鷱%} hl6 nVOFLqձ*ՔIjޝ6-5-L:h%aozÆ@\אrzx(ӫUk/G\JɦW(i3}ɷMDc~%4~$~k05xϊaH<ڴKjwb6CTaest~pz5rnz 0"ԴY!Ҡ11Xu[\[*3x?\yBq y>;%-vx?ccJwŸEk{ۢN yt?hbha5b_dpXZ,^Kh|}N+珊:g4wo6) \Y8]í>2"H׭:!MBFyaQo6{rH{J46SAoq%i+u w+" Q6!V[u9exlv*],NegJ:'| xi#-l%k}/$QFO7V-qU-4'fJSZ{ܻ I}mAOwYn OM}{EVQq+|-G眖oCR+q#NYcǚ'! F/95|#}=^NRkz6Ӧ, 35O"OWҸv?'2F2{5F2ލ)Hf>Z"/c/} MGvq"'!e\:c/Z<3>xwsu^ЭbrWuG`W[ia=iy?g cQX‘FgdCl港NdٕO`:גx/wrs.X~ L\ϲ,GBU3I[]4 sk"{9hAl Y؛Fy7+W͑l֥8jx+@Ǔ+ҭi<+Хp+إ%RS kK*7QJ}8A^} UCi_3濉Hx@ù+PddzGiNΉƼ⽤k30C.?^ $H>l}:4ӹM$ywbc_Ӆ>35tخ,1 L+> 7l*$gaWTױCCJkYj ]SN-}DQ^_$;hF ,xԓ8=.DS-owi(hߡNW?쑸UjS[xKv235JyMfEݰT >л=k>\3H/<^6ϿJ#l=zxw&5ףhx.2'I;FyR)ޥ {dr3Z WiA+ł5vқ]NVj*vK[s1nw5e]}g5ު OWSf..1FI$oʩxTgS#' _ƸjS=MsuU5!.tHyc^m*rV\4Ө8\ʼ+_uZo<4jνvsر+TQfI\,S0&þkQd]:|(IerF2V8B•p,T\z6\"jgHUEڛl zUUϿJϹC#z֝|TA8Jnڟ#3qdB,(=h2K휟ic0zG*(#ϷZ)<="j~z׫#?jڕ)cחtQW?4Z9 >1K[Dvy;5|YۂTr[/ Y =FFqǠֳS~-|҆g$q[]: \D $ҹ[؍Ω :9=I;Zqnt>H4ԓqT젗^դL,*գ]7H2Z|YCOmָ;~KU$/*[r߻2|2Vc+F}z¸ M?Hxa}|>BZxv|AuxBE~USDUVP@I!C_RƯi$dtǷQO2bNj֓!bOB~"a<ֻ ,I 5+d˜8a].T8yK3czq]WTk k}ʺ)s4Ā:=#!LJi+2146I}S, `WX)|0I34mODW=csr߻RMkǨ]J G_O|--ZX6h1v4621Kyy.$Sqm Wv;Fs_f}s㎟oI"6`pkw<Ϙ>5.И_܊(nQEQElR캲|>jWxysHצǓ }wb=gfE~UL.Zo8:ֱJ:d* *wMe'varװ;͎=Ť,׫|>uxyt;9J[uj׌T21_q~5Y~/*]M5˝د3SR;l봧4G <222px,l.5+_ <+]Ͻ \ xkWCG<ޱt'uy+;#dϣN-QҾ6b%,0A|/j0 \]kT&g= IexVgwl׋5ԥ$o[ /#vj>0%ܧ̹.7i&cWhgS0KJ4s߃'+`CTWxOa~,m˪ ?cߜ,ס[QϚ$1xrrQuYcf@}k"Ʒ\ʤS5]B uB a+ f_Wӫ&|YD_dPyhxC#^Y¾Ҿx+AX L1Jc :Yu&$[̦];AXEyF ϭzjjV*+$I"2[]hSbyq+;5d9椵K+|P#!+̀߭uo3=N_4I0޵J !&2N^Zxl>\Y G SWҹ@;W/a_sVLBݺJc9oAS+Pxz? X>0UO V\ j$tʫ jgRp1NiKkZO;~W]L7B:T^a1A5O#Qr)zާ_Q gd pT͉[˜R}\kZM mgYA D`vȹZ:EQ@Q@Q@UO}WTYYz|V/*R~@ mYspq5ED\<`c׬m$ce򎦼ǵ85X79 9V*\(֚ߕ4z|ѠX^C_VչFx|U-ɤ;&?^_^~KNdoƮ摫?@fllpOּS-ͱ_*56֫xv0@%č1?_~.X[șF|4qTip L18/ (#lɵjMWl ̪Gjt\M8.UQT/O XOw۫ c3+h(a(NqA|8ODLM7B| 3WS&T#V@Ecm՛}ņҜ"2|SCaHd\ːw 2?x.1v@2J Z?ebjَdvWQ hQs,=Gx sӏBigg({e{*i6wlU3G֜cGp{_Bn5ʁĿsop˞kYݹ)Zm)\|T z}'HM-í·?BO5HCdd9 WxSWMǞt\}pk1]Ω;>ǺO\Y?T-_5 ZywEv"|? }*ŢXP WU:59H7QXhC.2XSj$EY9z04}n#Xiq̱B\|;QClxаrAMJ~g,,. &E$mp{Wovi̜b2vۏxø$\GNyv i~ZPi,93SF6w= V GҼL'LP |\`쎿Myu3+\TGKm Bz5nw\V$xAcr62@ +.-D~5 pvb ĜͽуޥɡF9]b> WAj<\~Z0G@AfHtSYv2J9v4hmAԎkR1ճғVfcݱQw' y< 13; W˅S^o l+rv<-Nbr$%0^2]ΥewץnizŨFlTi |>]>i6=]G `;mBFGJ)dwsĖ'YwmMhqW~9<$-bdF,7⭳&%yLyz\# D!kBr GecY蟙cD:q|TNc=?xUFYbߙ+>! ^l;86rKH2 MJEF+A2+p4oP媠ȹ[FfUdV=k7&ADqVVQ=*cq9cJ f̜Bk҅NHrōH|2'ɩaWaR r`z}+Jx29O|һ磷sQ]N Ijr-8;sBXfo#FW6WyZ'*Of}EjD-J3}KJ.9Ep^ ԍÌ˴½G Nmv=JnMK6.b_%w dnA&H.a]X)rVM1GQ|='Y4ZWm-# \4lLk]SP%C C*&~g֭>D>l+ ]}o ksn*J_2H% r1WM+2Vѡhsۋ.>ym>Ig4J!E(RǀOҤ{B 'ٛî$Qb;TZL61<'7FX^gJc`eh=J'c)|G-+1 I5k Yd>VQҾmD\Ak~x~H#q=`*\Mq9bf亞ccs*$\WUxY-“1h>.eبr_z6x7Ew%5_AXRF!U օyex1xT폠Kos, ҼRdǑ޹V©П%-J߆z+$7> 0}k73`_q/PV@r>bjldz^nu T9 My7d+5߉s\i0= sHV|ZY%ڡ2* zWvH@1|OXxk|YDl#5\bxյ'%EWM;MKu5|{ZƦ-X+:Ʊ+آiev 2g|oՍiS3j?A oz&(QXI-ǕXtFeGz=۾NU `!ԓw,ǭOrwF`Y۠=f]Z躯%Y+-|__^F =z*G~:~x~7 *`?tD:dVXwc`V Av1X@-rE}/v4@HއkR/٣:O.hf=n~cϜ ׎|ZOsvT2S88Zr,Yd11oݱ9Xv `4UzE?Y+; C$W躊BmӺG~85[BiO,rzfٜĮ"KLV<㷇mq[ )}KdG+ ($I[vgOr)`⇇#?cՍ ȼw6kK Lf?®?ƽ|_vK^Eu+tkaaxnkD>\>j<<@$F++3xrv Cs\oCzp5ivl~Z'|Yi{_p=b2atFH,x.^GA`a/{I75n3U8;uFӻ/b3CT5% 9EhIcV}t'Q(p9=K!$$}bI_$w}!>H䲮EsC*kqY4]36AUrZ;T}qڸy7T6 [q8t mpb nRv5W-Og?ޮ~D2=qWgsmޕSά<\# :nPcۧU7 /.,Vͻ2B7{r\GP#%WW):d=ɜ 8^7ʹr}v6PH.z+؋\O/gM~847!Sq]ô[nG G' -mFg% 5Xv1ʯӹWxMDl-QrE?I+{[=<#MrG&(7|̊eBӭewy$D}8J4PmT4VI=&n ~]~?#m6]x[NROm$b]`4,QOV#-ྐA?JƹYdcs-߉xYm/J3dgL)+ے9e-<>$8D^(9So_Lf[[6sƤUju qhܭs퇆`^[^i$0F&uO +p|ԩ(Ue&p- +^ի}:3La WCQu 7N<LW$ ڶ2j'%,<#ȴ%D|˝jL"r+2KYMRե5usGƯ%j{xҝ}!X rſDA61KQ"կEwnCVmSM7Jȹmk)Gʹ} %҈[F<ǟo[x09Sc~$Z]>źVj&uw_ũ]BَE>j,`9n_M,YY:5 oZ?1Iv^ |qT|G]]9q] ʦcέc?=t{,ܚFXJ#<爛ط^k|QKD9_f ,.<P{JwCs8+Qg%re5>1{c\ט'ŹVVs׮jj{(Vm UeGC>cQ}kE-]y>:7} v샍r+~*x>|_3PSᔥJx0Ȓ8b9w wCvyPk Ҭa՟}\x_}DV-tQ^Sڒ)-JxhƧ2+VXh-~=VoQVt:WGa=>lU`WUaM?49b3]쭔[ xy2I\{:0I(hяy>-<$.-ov6~]xեYE / @kj >+èGA^|n[#/ #?f׆[rȊ܆a^q03{˦))j}miv5_ )). F"d(O_P6Aw@tS8a{1bO_BI4yx&:tI]3f޻Y_B+g u]C:,ET~I ̇ݚe݋7"~OpsS螩>ۧ嶕/LUsgND:~zϛ:FK}Rp͊ n .XIKI .qkJV/>cy$Iy;qÏ +xAk1$!Ljr@~ta׼'pI8ejxzB{;M|)|,m=rZ(x<贤ۍzW9 KE3].皜V5耈z(ǻyJS= wT*d5/Jgc1*Z\ZO#Jz.Pϥl\B\gdJ޵dytRNX+yyToߒ:{sU/~xrkZg3''#\Υ-uG2ck_.n;-slܒ՝qZB8Q{VT tⱮFBSEYw$RYk$ޔ'F޳U>Y^ Ci^+u^=ӾmexG$_Zskq,jیE_G>z*99w|%ʻ"Ѵ?1E+VonrX|ƪW0Th|vT>)iY~EFZ0kOmܑ_LYw5tk5KݜLʲcѷS~ &m`<]p*?J?<;2reҏ5J#= ɦW/F|}xiYT5>[9l)jS-՜R_ϙt.RO΄՝p#Hd?!-^i8enZnи?ңyF${ҢϢbwqVwFx1_Kjz_:FW? -ljO?+RwS endstream endobj 29 0 obj 81755 endobj 24 0 obj << /Length 25 0 R /Type /XObject /Subtype /Image /Width 1832 /Height 473 /Interpolate true /ColorSpace 33 0 R /Intent /RelativeColorimetric /SMask 34 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xwT`G7hb, (HE)"*"*R)RH., owk3s]+Wٙs}?3}1sο                                                                                           E… [lY`ĉ_6k֬AoFիVZ?UVMXvm҇~ؾ}AMz'UdOw^<@@@@HZ`߾}7~衇.BVO\uU"=zhҥ     `@NNΰa'ZoFO n~{رPQ     H 33e˖wW'ڵJ4^C@@@@4 ߿馛|%v;ZjEء[@@@@/cՔ]wեK'O @@@@P"0a„ *{\RV:{l%t    a8sLN,@wٿO9G@@@@ikڴi2eM/mkݺǥ0    N 4߾=ASW\ѲeӧOn0    *pa.]ObҾ"} @@@@@ ,C.AkѣGXƉ    A1"$wu]ӧO›6@@@@@e?#~Ȱٳc!    ͛_vea N+ԩxvE@@@@͛wO Br֭[@@@@@ yF9/ pJ/@@@@@w~4%x}s0@@@@,Э[ҥKկ~5zhS     `T"#oh{c     ۷-[6:<<''ô     *0y2eȋi9^n̴n@@@@H( . +b̘1 '@@@@@> ("_~iqC     P/ %eu)fxM|x~?7YFU1A~}',s>N֎#+Pѳ7Ł?iBI3~dyl'#.R \-y*i?Vݒxn%K 2-E8wSO=,W^{5zuc6䮶]Łaomu1 FAYA}f6Vt9 Iךּ! 3cNe*A/1t"Ӟ,TRwq?_nVZu}cǎ2e7i$СCvשSg[}kbx@5o_"wMpUjv1jC$ g:tN77y$ȩ|SY:m/[ X)ț=T :je|)zԨQ&p5׼_|HVL֭[Ǎg+-\uUV}{9/\Џ(@׊/v+$e8Oş!E ½H6st*$A=5`.e!U7;XfKsa豖uWhO= BQol&3=\ҥ=}_4 ]rqrהvR_ avI?,M hz7-' OM36} dUג̒,(QRQ\4[(ͽ۴g% >[o͜.\0aBժUԾ?C%ftrWo@VC"w9 @`l>b] B[ ]rRn:)иd5˔^,,sĴ0q*Tg*c zq  fu6}ðv?W_˕=ƛ|8T2l/=,ɚ.]Z\7=z8On۶Zٻϻ,]c䮶5`.jI 6be`N%9/AU㵜% jakۨfmCa>^V]S@]E2lGTt,<Ϳ-={[o-2H\{i`aR wMW-ۓw̛ܵx4bi,CjLi@H-`trPRj^Zg5S&byWMɳCm|e*^tq l&OZj?Sq+yCSĕ.qi|棏>7dZV#@o"wUߋ 87"=@H;w@׹M<f6sם;9g#ꪳ'9i3,S~zer&k_~{6mOƏN3˖-3U< Ec䮞ldH*:g?MjFrWvuM`|PXorbR3n܌J*|gK8HU7 H#pO>7͆+77nFw}7Nx͹kٲe9 w}]myczmu:$w5aiYytL^gڽYijfJ&5g qj)p7]jժ|j|\z3g2(y4FwgC1I ]cf I4nlT*U;ܮĮ]/ՒhW:Uv8lzj+gյzB^}'-S;|iٳC9]_9RNw~[T)qe`]1r`)Z3-w-<{Y*o.LlJ T^suV6.+n9cmnlVnjneFYۨ&o=zpfgg}տou9GW c$w ׍i퐻53wsܢ䃈ܵd# @xF&k9%+^+s6Xu%ҬlWe+[H|].92СC$@\[ ROpq'0h7Frנ~ݘ-VcsWqHWhK| &Ո @oOOf:sU[P35OV]K,SҸd]baѣeʔۦMnݺzop>jr`-MsWq ~x+6fRj|MFkܒUW#>]&PpjvSLfCR8{y^qf^[񭖿G}x=f5~ joܯfRK٪a׌ ;w^ve}&woΨ-rWq@K~DrWގGC Oto ΍(.GFq?xFG1\k- M҇Ce{E,˯\|cǎ&rT{ァej>%k"^C@8źr1rWgȘH Յ?Ke?yONsϫy埻$Pva4 wmydQ_^j6XvGWo9d<]ovvdnݺFS\ŊOP2eΞ=k$ wMk4w-xcUlRUW6} P0kxʛqR5=6QX5G7|SqdY#GT}ȴU *n>388{s҈/򞠑t, K+7ZdAoT~*s;+VTzaֶbVLE:,^*N*6(]#.I-mp=A%T;Kђ-oN '卻ZlmlLUW5%+jtIPXKU!D|/U\Yev6L,мyss'W (X#274;nx㗭i-fUkPηC{[m3"F*44{n9mjT?/ګYu061ࢂs%Xf`8;w/Ws=5LbT`릛nJTvT @.H pZx.&8y)Z Z#SntG7vo./z==FĪl4Of[ [~Nob.H/X ddd( ]EGcǎE>XΝ;e˖[?(@ &M!8*n)p i3bl=$N¾IdXFϿ7[ xv)]_ @b)H]'(DHfi2S2srW3H %([x;?k~FQcXhoUWP@kKc;X\8%҂s<ʗ/&wꪫΝ;fjƎrWt@Uٛw3S⌮Yi L,zբ[* ^c{oDw6}&)v*{vfp_fG.7^F 鱰nVti5Zd2rWet@Rsױs?lw{&{zjy4IrW&Ko$ze_{7%ZK M6%K~6ߞN]3as˗ ]E/W'2F@JmB ^@j{='x!whJ޻|)[&x3w*jt?g?z}KV]gЙԕZqǮ'I(@ҥ;H\ "@ 䮁0) H=iMR3Wq Ekw}GrWS`K$̔:{Wߤj~\堖iΓps`+5Ryiܻ@dQ)n-{ˮ3wt|J䮭[S'"GrWPl$r`tӗn>1੫1ET>iF- K.Sby[* ӻb(V]#ŨșknI?c[@voYMi& 8)*k }fƔjŏVL E0 &P!Zש6RbmRFqZlYjDg JW\Ae[ *6JrSr-.1L w5yv- Rf|axUrd-k|:? 6rWgǨHq$53cj>H&_h2c &UB9+v8OݦpP}`n4tR5k c/@jQRsr5f!qagqZ^}~9yElf΋U8)~Z޴Qxa>%9Eh+Qp-bSDxVYcWM:uT ;58ƭN(8L/b[t'r0 xZM;}b|=?#>sw)(HV"YxR@K<.2~6ڙ:_৤dm?`ucjrӧO[ EX$@jdQs?{bɞ)^\vuVL7dB$&̂556 Rqb*|'cG+Xu&Wȿ{';AE]Ԥ-n}ĢZ}cfd5n@߮I/ܦe&C㨓:(%["kD*X +="юe] w߿/GjA~-Mtioa`~- ;wx3hșQO5 w5vjL+1j-Ѳ/k2KSW͢Hs׹+wzp]*ѧ@<:]Q(ތU1ݑ;w+ߺ巢%>Xы_Pd#]L2+XLZ@z}%҅-7w*l253D'u6NJ%5kdQu3I u-%w8˛.e_8qFQ%2j;"}qɮl?n#M;5#fI67JUרO1OM d5NЈ8WW- %]?CЌeڴi r뮻Xd #w%wMѲ=_Z[:;:uW>}!i$5*@v 7Q(r ._]1˽:KP%kt+WI,ڬ&%fʎUW;v0e6)]7a7:ܑ5@L"p{~%Uٲ"ǷFfݦYmOvOk!2rkP)Ę2d4kac _}!_+HA >q*8JBv~|?Y;_T:zlBHa{o*]&w%wb wǹE>O_z9#' *6J/-c]}gwu#Pů5[ v >[Ykz7Mgu ~ ʳB_OT@Y\ __o\ܳ,A=&w5j3tV>]Zq\k!= H;d7 pc3okRD7u½J좵WŖ2SֹzˡDƏU[0g2F3֘ u*@^\ZܕU1],^^"w h gSVbNX坢~q%]N>]e ;> 3Sw -Pv{*؏92GV]gǁ^j6Xe-qv{G=%\䮟ܕU͑rȒrWG ۞|_Sz}Vq%J=]8 Kq,.7{x\:m\f'hjcFwjXu8I 6&XUz齎͘=&}W%QkÆ \W䮺%wkR 8A[͠{h|M_3AI: SlPZYەQ\(FÙamAёbV]N>Ue?cۗ%:҅8jX_ fM==NYS{@Hc]N]*r[UY|'`xv'\+,W VEczc٪e2vĪک=cXbl7pif涘e(bS-;^)]˖-k Hux&VLZ8 O{F{~Nj$άqKjmz3&-/s_7'nJ䮢}If]]ruGxy/Ur<M,Uo?Wl:3G:iA )pSQИ%NW_TƏr`811 _@@ruz/UM 5>S޵A Z^rss3fH\-Zq@jqnrN|Ֆ%c*w;7+CB|LFm5Yz!d=,^+</'_g'*Su]V-'`Më)Tkjʢ)Ԧe9 @(W]htZLk#=ZܕՊ5z%O1ǹE s~V vr@ r@ @fYS;~A4w'KJ͚#k\Q;d,G1mt]\&}]DV[\9kJ-]]<2c"we1G?&+p*( }[پNNVˮϻnݓ$Md%7dl5}fCdO 6#tEEn:tZa"\샧m?_re$]]8\]#kxj]8M.ܵPӴYdU#' |$w9AN`DWFdBˈ.ݢef){#bյ}Д+anaԨ=Ӽ)7Fkq-[*]E۷oчQ5^6FUw ~n\%6FaS. e:vL,q,SKt!wؓW`uf*UƊ'6}Nw])j.jr~YB8 2w ꂊ3"!]x}_.1g&Xj 7Ef$C(]3'0s^ܨJgĢgfn6.p(J`- < ?[բ+ f6mRl>T殝F,Y-#@xrW1w;z>gM<:rQjGлQ6/E`ڌTϩYBTd}', Q]d>I̠ Xu͟#+*}8WKŗĭZ)s_+,U+t! `D *w[pGF_OLH/ k b.$NK%Pk^%Ç+]SNX0Mմ Fϸ+I_ɞl5*KM'wֶ1 sgc5:G/nդ@:MHΓĖ :6ʆv )Ъ,e>efP@8]9rטX~-_-f9%grט#I,8K^~e'}ZO]"uԺHjt_R8)*͆$԰!ⶒ e]lRYz5*!6rװ85M5~F=]!gqebH^6?&wGK'޲jrTb֋_|u~5{/ŰάqM]ą xI=l$5,wW@h]9+ OKeyf(=U7-&zZ'whP%I;?`|J]l|+\`;֟=^u[U4v-5VeK:64{M7)^˔)s-tӕ ۼynՍyd &=+>[]|e!wMpX EL_pW.}á)w8y3@R`M-{E-x^_͛+]EGjrIOXʗ/rwX5" [55 dL*^`䮉[^%e\_Ԗ *qʝA'ᯏf Dϳh V`a%[wիWD_˗/6Ǝx;vtǯ24bTripthE]KI`ڎ۷W+쪧nݺlvZrN:C6Jtl6Wm1)lF1|3'Vl:sq}q'ܰ&sþ~1F]>=v7M`[I7yLPQѣG/29_uV#u^dZ7 wMj|=ѴWkRG;5a(Lqh!V['#-6#SYU7̳\w:L@8?O00yJ*)xA-//鍊nR!3y3״OaTBZorH`W;9g cH" "YS Y{Yg8> /Vd»+X"^z}9ĉT0nݺ?O F]~]S[OOş)~5#ĴHL[NcѼKV,{弧jyB8 8Vdx>"pjv:ѾFG}U]}۶mMY .,U91qV6ɾ:"w wMϿ7@㹜]S>Bڑg1lTjEjmD?#qQ98Vdx>"F$iѣY/UrȌ[WyV)(~߾}7p)[E 䮁0) L'v~/]nC1g_s"̕Tpa=؋`-'#{UCp4dOX|Ȼ"LСC3]͜ wn9 rWG -0 ֓"۟9s-@n ?i7= l{A)xywRY#gwhrh7:j#w  ^z-̍v3.~D "A@ \ШJ}պ:S`k D_Ν;gϲ;| 7G]5|+c75퓻xThl@#>]) 3fU:?_x!a/pdA٪$-J4k@ FwmSM~_gKU<"P(@*HrUeE`2L nh>w`U0l},bK .ԛo "Ό2ee/]Ν; 7G]5cGk45BK$Z4@>3-]%ܥģՐ 8R}63w(U3#ѽJ,W_՛/:X TM4Ѯ- 裏* w5g.$䮲X >1#DM$j%)܂"kI,eIC(IO`ߴ:!q%Z(J_@\hk5! 7q!l߾]] gw]VLE:,@fr~9Nɶ.]!{!-L R%Nm*VPMwvRCKܠC"tۧ¬`РA&䮢;vhIٻw+s&U<%@jtPL]MWWvF`GʎHq? 3^ nH&0|]=fB`C % g4 2-͛qslz-V ]>w@U$fɺr/!wUy@--zk`Lm9^vnH&0gƬ$~ymBWTOeXx޽W]u9_m)fa͛7w2GoϷZU殒~lKr.@xVl:Pf^"wU|H@,"f1-}ճd@L# :?xO"d+nI yq#W%YùwPDӣ˰I +Əo#~_9o<19Z5߶6E}Uɷ{=P͠tٛSF5dq^U)8g$Ԥ73z,bZϽ6>S?VRŴPS\SB:|;@>CL @s6|wr!/jq4[X#$NI'`ڦ1IܺD5Xu\C۶iޫb5I9^m1<K_B EIȑ#MMKK33q-̮M61˯c?z/ڒUWG ,,&dF_d 6]`uufF9E*cZ];-cyɒ%J23zU+~w?ܹE^{hW_};4u6̯yӚ"w;#'0]#$Iy#g^|z\j;-'ޜ&;WeY*4JO6xj+'_t1R_W~ 6lX#%`ҤI/@57rW32oU/7y\p]!@#ǥIfF,=vwLUױ Ma86fo K3JFƦх]yUV5jh8p`"5SD-[T#C/j]: ^]uzz&5Y ^z(a_I˫~/f H6}GBNEdžʼn BoSz|A}qc͙ZǍ״iӻ| ==prU׽䮁eo5pr&ԴHL)N/ǛjyXu j*`M@f ߪ^&:ij-O?3f̲e˒#7o^BnGZl3g(8TB]Y*ME8IcG䮒Zq$.e]JfOX1av*XD4>2^05s]Ge GKk׮-SLtg_sSO=%_|{ďO>,JV#d- J wYrU']a #8"ЈO tepVdg{nh9yhEW lvX/W[ w y&~l]ફZfK!cjYؕuJ9ԍ}@jL^I;[4qG!)DhxM _ +}8T#][-k)^RuN-N(x%[+=H_"-Hf/ p]zy݆Uq~Z5y#]7Gv=O`|QBz@ 5Vlkj;+wؗo;O, ^5݋Ǯ )WձcG[My|rֽ]'Vh}Y w5I0 ֻj ` Tp}6g@ucL/2&Ɨڶm7Nw/Æ f1c?z/ڒU~/\ *q!w2SoC`Qai ćɋ).ʙ- oQnY\xyg 9\߿ٽm֬mt %+@f kɎwS~uE~όI̘HN@ѵ}jek[U=Bӣ{Y6?Zgjf3fݦi[l+T}24jkJ؏䮆(ܵ>}]:4%V$rWT*"HE}t =}7sv=z[UK#;]]J@HZ@YslIVwh߾}W i1 wYf5V]e{ř%5Y >{z%cU7TGG"5 C+cN9Gn^lwފE+N/4ii wYfU[]K$2g]N4ū9JH豯^qgks3HךּLa42E2=UVa53˷K3Z3fW\Q\jڅ vhP\rט5ֱ]h5EumoUm1BBAnveD S ??U.zcfCU7Qo+[ąkHޥlr;z^& _F ]w^n[ʘY4Y5zu1]͟ %-6>C`QsD,zH<@=|w%F}cI\f Q޽;yFǓ'O8/@YZ|@j[9*BewY%w-ߺ'I2 شӤkvGcR`Mή;jV'ˤqZg>m%w0~yyy*T3~o?<rս濑]͟*]]yj.4Ƨ#R`Mͺ#{i*l4㽎rL/ƬVZE<$Pt鴴4%SJ' ƬHj/,r( nuzI]7];,(ITOU"uIZ`5{~߄eRLѴg1z:=v<|6OF7|+?)rWe]?G+<{M{;יWI0DIcӮSl` Դs .Ǡ+5maMt|P)So߾'xT/|ԩ[oShK"})@̛ i3Z=_{䮩͈i{6#ԓ_[(j' R+(RUH$mfb"DgX]\wLYFdk/J*%#{ gW]uUzzz <\rWc|/c wof$Oyb `3< ztNY(7ZTɱgώg{c gwuW8c`G#dgg! wUVk75s6_Mޒ١jM .#XuK$zZv!J6PhR1KA]'|_Sa\u&{h:rWy -$w5pŦx[orפݘةd٠)+(QUD"{7XfW'Zz${ܫ\|!|IzlN9ιY܈6n(>r+T?$) 䮒gC%w5Mj%[cgm/E5Y3'0s^*5 j+_Oj5XuXs %nG\`ϑ<+Bij&Ɲ'xDiii]w]hCԤ~-;6'"    B ??iӦ\v A+.,Ю];@@@@@ );vTT)AΗ.첷~ȑ#Ia1     Xr~i8#QW^}֭     ) X"+k;"    @ 6K ψ6jh׮] Xx @@@@) .m_wuf۷o瓋@@@@@ƍX*nUr3gzw`K@@@@@ X}m۶lٲ=P׮]?!    ) lܸUVwq]/'\SwvD@@@@;vիWŊ 33ثW^8p     ܹs?gy檫қ^s5/h%K M!    ֭[׿ >eʔ^{O?tӦM yfk@@@@@@!4'|RzG}[n˓c[oUdjφ`#G     V:t\bŋgqM0ҥKK6mɱb8                                                                                                                                       v?:{) @@@@@Rq(CƲǛ t lYSh]@@@@@0 ϱnbaO? cG@@@@ܞbZ|W'.eA@@@@B%p,3?btjO>pCu,Th @@@@(R@0n3˷_O I@@@@p[`ܯdFn?qno}0:@@@@8w ڶfEǧsh|#    c+i> OSSho9v81@@@@,p4BoŨw[a>;    ^np7 6[` @@@@fvì`WnÒ"    `f>txq+v(O     fVr҄%ݛ#F    Vuì`WqO,\A     7 6rYY'^t`    (` M_5o>'@@@@@Foll<@@@@\aV,2@@@@@pY~ @@@@.fr-.     `@holL;@@@@0+5R0#    aV$#oi?)@p@Q?mC@J^='}z&|5~/neq"N', ,u?cm}D)@KծZ@p^@|ӼagNS{h߮sQ9N3myHmlG@0k^jLν@@t D4sRkʕ"A@p kv2Vb&@rdI ,Wz- ka5H+d_wc(Qѯ ЗJ~]N2A! GMkq dIIC F-Ƹ.xﺻdl"A !O@ET"pg!ڏ+hd DbA@RP)lI SZY(cz(J>#M'g%tA@(' ; ~i܄ `J . dE@IA@(h&,x1vPᇿfJ" PCS67SQl»֐^!A@0# ԇy* kj^XV7zR VA' woPՌ<A@!QCZ) |"" $G`ʧC׿5z/~ |A!` XIuWC 9$[A@B@j/V(d)X[*c_ҋA ^Gь̪4S1»AE$A@# G1A#@Gk.t ?٘W-S,! kqt P4,m0 Z4A*" >' @ld ()A`ծXV:] )iSC"Ԇ2SxWK C |*,lwS)Ѫ5RŔ| . $A O@&kwA@>)"@a! OaH+tŲ_iQa DD#] @Og) '`V Ձ#ylP)ZA =I >5@q Y0/v\q ]H-BD˄ut@Sa|@N&RxB " ;B}C*  2ؠ$iA U4=W1^O?~~6,!jhFQp64 k»֨^$A@C@0d$^" Sx%sA@pGg)vWE{I `PxW% @MF@RwA GhA@]~pHxx-"o @r(FUQi$A@"@@"hD PS&2 5]kx E@PY߽T S^.A@B} j)H(2P4$,L" DB@q+oXxH}I  x~?_ GA!A@(w-9AJTsF*y푔    ]&o @eKʏR7?A@A@A@@@xhG P(cY@+0aYEs12ϼikS$,    ]-   d%)A@xה4!   XwM/]qj  w %Kv`譎^a3ߔ>ݢ/F7vw!_F|DzfR"bMSH ȅ)u+[! f=hPguqϹF-ܱ~k?3o.~lȜV#l)ƽǿ#x(zٸZMhs1{A{&:MX9rN6z4TcG?shg[8vո,i;vU'.߳COV [ 'FQ/ x{=/Ǡbh{^1+v9|*O+uq~ܒݮnW'/CO#hlē-l,nJF!Kph# swUżs(}̧=JV /[x t~̕6Wbv'DM2F.uIbIwSL`cș](t(u{NZD'5HU{NPQtSK!T`KU$7$a !-X(T.%g6AB}4Tµ/~3˨}]-uf&".E6jbpYpϿ QF9R =<9G\g>dT$i7Dr2Fv 1~.?^`?v}Q]F-]H!V]+7naC׫t'=Vkwџ;>AߕhŽU 79wwZfw?n1wѭnRXUB -SCŰKqQ V{UpZAR;mkKMG_gh/_xX|Ws|Ix mh0NGx*.kCzإƓ*[8k';G*(^b+.cl9\ʮȇąx[KnRG-aZK[햢&OtXxݔ0 dHX^Xцxh 3y$.<<,K tQpyqD槄w>+vf;LXd1y!'oo? 45vca@zgw + :޼;_oâ˫]eۗp޿e)`/%,Vٯ cVo|ui\^ xҧ"yW4HaXxַX5eV(g~Ua|4PN9 ` \w_ V=` ĸVbfUAΰGzg~bPv&s G 6 ؈A CVoh7`'lUm?\m'++e є=eMVuB]J `Sɓ,$ۆ/{[, 49]iCߠ6Gf ?12{0os0mkpàgN] %s`E蟑*k f|>q@ɂZl2=p=K?L[86Cb>kL=x/rCw0L%ޮct0߁+E"?lG1aXqE_τɠqkar::qvh%{M#{'/r,{*CT|wXM*2Y?Ҝ tj T*:P']O_SMj gs8_@o=Vqal ],$@{\ vXuZW/wA | rjp>V\|~3;`IO|sa¢%Pv6h1͍k}D8 @_v+[+|caC{%רReMo] f8 'y'ay$"RS5;:= CxXEp,m- O:?0:%7xIᎡV%LSxW /2kJX)pt`_zDph@5 0}ءcԠvƓG}/^g8QuoZ.+`CUޅ]4IYJ]OTmh;\PH{Nj9kOqGU'5Ԕwb?,(3@&@ExcI1wGĸ׈ջmJi w_'Q|_/w;_:~u:@`iu:: J"sد88YW1 t͢;fƊi_+ΧkweTG\a7Tμf3UOl.'/V=z۝9aX0c*!ėyۛ[GxW]3`m昼.R05q.yW% F*P",`թ Pd` uJ륱/a,>)`B3z WKLxרwq:3 Qswi_k޵ ; wSTb-t:pk'@e?KyJB]]բP~-eƻNZ[ gp& C-;xN9 a(Ğ r"4 ?Wc=w[bȞ쉏X~Q Qѳ7G&=+mL(k?`*Jcat`o 9UMͯԘ~ӄwEޕx K?4 b܁%q |#@a4'ax l6R! x'*stJ" -BQsCs`~aa]`c\Zs}P͕5< P;5끁yWۇ&jvE#g؝K]a!=ŐF ]o7'S.UTQtxd\a9cQiZ49:ac<@^v~TU.c#9Y 8I:0bwS^el:Y*h8]}| [h^rƻȗG؈YϿ-,A%`&~VFVkl eF>.lNR5|Q.Z0y>ae)ftTmY0,#U3 e.gٷPxW|16 C ͜s{K@?y$]=xaC@; 훀7%V`}` )扦cUn ǕUg5+Z^F# 4@w5⤹㙟wG38l[7)}'MlHAgi]xרȻV礴@ahqq,cVGx8xS6>=%M 8[?jrh 棓:y׻%W$U Lְ)^ GةE,lCh`vތ@ʟ=zа-k7х[Z Uy.IU{ĹNQJgxt)ӨM"{?QBxW'. r K/r]5M8u[HWQSuCzTp}OL ;\0`%kb]r_{L2z|Gڑc_v rw{Cܨ2k`qhvSQ° "a1G{,v8awJA»[Ű .\XrΈy/8*cŮerxOe-~ BʟEڅ.qm^T >T/;rфŷzN%tPpum)JItbEjZ7֌ ޕ^O},@æ5ו;ODԆɅ[9p2͆,1%kV<\w MWheO4ouuQ+5^ 3i*f( ?jXl~+842*D&YxJUaT#RLЎWo kN Z`ajRX᨝w:Kڭ ̕7[1-~tË]/+,&Ur6@3WT#0~Yc203Qut E{|'SJPʪowwt5wC>˨L 0kt@> / b+!NӠF arR!.0)wYw O< A' :aa80i9zLcu*Kب2 Y;LZy3mS Ē2ir#NsH]S9ќ8<ü˟cVlML0UJiXTO#S7DAx.c1veQwN00=~~ֹ>`s֚9.9]YHjQCeE0OذU.-ǫ 퇝)1=? Գ*Z`ѯˠIȮv`vƾwb5w ym~DҫW"9?Gk`U/xm u,1x4 Rj,AAg- cIλ2++ ˑ1=w(UF6`bs]?'s.zoJþVGO|< "%F*}#+0)0eTQt"axkƁ/)]V c)&  j z|}rȃJX YIT >v&+D+*!iA6aг@z5#+W=D. v}'.H)ֱL)Ԉ08^)j_}Jh* U eMIm~RP»fERKwc6 ޵" f-LJuxkQ 9~J9a3, rovy[[[y eI79!}U ZdKU|ؗV?j8Uw54T=Y6؆hZM6w[y+տ*1C-]tR^ftg/UvG#ʳXH晋7"Ǔ3ؑ O/uz鈯{8y-Qp(} ww͖c(m8Ҝ*8AMQ1$TkFxWT]/O3WY.67{1+Xp}EЏKw54h.HGK[Wlj͸%-& O_@xר !:gc% 3QkX010"}-I]4h\v˚ƻ/cPH8eV 施']xeZq*Ll.R3eH"w AR[<SV1}S1/M某/@s7?@]mѴ() 40ŸѣdE 0]O:M*OOxjjK7.q+\̈́1 9j6MǪݚv_pF#HGElO=wELho]3;yjS* 4@ 0ROtQ*H{[]50.Mqo?t,]Ze2mTGB`K0xW V»Fy,<| a|PWҬwQ$Bg@t@B3WZ1pb7/^}%?)$KmOYϲk +ӮHO~1ӂ arF.lj5/:LxWڠy D^ui۷Ʃyo5hr3۾bAI6kQo ,\RS((+]w25+U %أ.$y|Ȼ>}Y:kPpӝkl=ȁ:u5v1Dr$L @yӄamJ&:ᤒ¾r{OU8/Mi)~٥By=,Ĩ. bHPVP7=+D xG"APR''jThSzԦl ٢dCƴKVͰ!+@]f`c uMhIfڌrfŀ@)W?TD?QUε G8UE 0m~$_+q<kaj8s縑'5XA0ubtH/&| Rڂ=s&}*oGZl#"[B봷C*ш+!@QzQXxj";O5 jޕ'p)ٮ}卻 M@@xW(Pc´zXCBk8̌ӏ~Ȼw0V36< _ tOuC uL/wxRݨș }^4b?V =%,ao8d8&V/ 2_[VV 1]$(kimx¨s ^@q{Ce'+ђwU*0J^N l"ͼ+h&:t<ȃE]?rdj D%@쎧!jo9+`f( 4 &\Pv13!)FB'\{heт=lkP91c 6l܎}\BMQͤoوDӔ."fEhR&&7Hx 'X!a+/V@ Ss5 c5JVƁ] `N7Ȝ{CvB%!2F "]v%perVKr̾ƀtZXWXcf'E_e]swj{!FЦJ*}iΖ "/njTvZ+,Wu&K4qj06e؋Eۍ[=`\]X񋹙̵cyz.oȷ[!ޣ%)n|p&K_^RuaY YGPŇVPr&pL4 h{̉Wێ|L hY&+ڂwE>PPb8.f޵LOƾz5?Up1ũu~л]na!ĸb 0?sɻ?:uTZ-VÐkE}Le5aO$bj-Sri=E~;b9/0 0!6'XE+*C9P6CB ,.F$&8-5XFY#PZ!A!TKixx]3ߔY Z҃xd?1f{``͵Cj, >dh9R Eg92@-Xo{>mF4;Y%FSGn;p:0&^ӊKv_eaoƃ҉M*D~ zQ@=4& 2DJ)=i'1;9ha쿞k5]ҭllbqؼő7}~ Fh*v1:XI8UKսJW;ӍL8J*0o>.h>5)x;Ha'OhUNUʮ(j5/åMm0੕SxWwՌІY`5/CXYwln/7G^ɨ̽xeqؗmkAJlo)W"(g+ʕioaH%U4 F߲+{fX]A+Sbg~)*6յ2Kn +2SAk b7eF3mvcV^V K5+x08k  ^v_ Lxרz)i[:1Y>ft{y] # ܄ӫFB3r[>}90a70Bx ˇ=/fos*»w}x#} 8#)0ZZSq>형X VTV+C2JD ] QG j ĹkPa7qX'T>:sû u NyzM݈Cvټ4(7+.%s;Z 0+Oj:6 W®W$ v$ai9*OXF@B?x1w+. ?ݼda0 )$&lV2G6%84i ׀TA֟ha𮚑ء}fC࠰axahMTY6yzui_5M1jDԲbDI%Î/F)6SRmJm zR/=ԢJ?HF!w kǖ3ε1L7mgLXTw &{i62hcxqh0N8co%[M\͠(f9V'$y -kEs+ wXn e;h#JӠY[F.#sBU_`FB]̼FwDJ2˩> Dot]%^!T!ޏeUece9<+X9]Nqy=5鏔8%G!Ybv _uX8|o'Pl$_˅j*t_\]Ż@͢rKHt(n~p* +zw*+6ޕB25RQỠw0^1&ʱibwB*Ǵo#_K7N\vjc}hT4O5d`~7yXxs"JR?UCwr֨\z]WB?*RAΰa!i:0 d0WbT 0iyiH{X2Hꔰv.3b͗RfdJQ~<-_I|^BT$i@B J+.?> _ʅ:<dTqz}sf܋Q l-RsxW\W<##* o26=PKs$,~wTl,+UMo_ K,3aEPл(ѬG t*+~b/a+k+NS\Ԃ,ɌQ4@Rˮ^kxfnq^ M^jҡ }8LdP yh\6yWxk4٭ P[88ZI85ğ^t.iv9ڨl#A"o&"I51l5߾Tf-]%s0/ʲ:p_)g/p:o,/f溌VL,[/LOX{"E,ð'X 6X]aeC ~HIģIࣵT~N^o4J4'/fEY0UI0zNw6f2|ZC].5w*퇌f.@}YgW啒Ï4U׼+tJiX^Z״^[qe{j:(vИO}=NU/gN=k%Lm7,0W-KX8X 62W;B+OeCBduwE] \7-]pUVog%ml]yj kx6X檂JD޺]vQ)6xӰAҵs^~x)U&OiQ_8:ZJOX>#(*p*a9ej!tPzC=B0$=!a^ٰ^^ñlHm%vl(׸mm"iw CFůzα͋O%@ AwOs7j7n-/jMjeMҞ@Y Pf~hDQo$_l=QW_@3׼+Јfa^g,ES ]y v(jG2VqJ΄00iVKY(ހ.h;aEQxWO&)?n1P ڻx@h-F9W^QSE,jx6xib[vx[Eu8l&[2kQt$6#ݥ0v$ eCQK*C qAqIa;yX.V8Ǽs/%I3FunP"~ =pcN `StXT >aB%~ц_B;:p}lpRR(M\uØe6/#t/f1}WW]k1Z'EĽoϥ۰dC Чv ‡_%.OZmj^#$bhR.=,FP͇aT6e ClW4ZG3*X; VjDeW3\yfL5Wwt#%:s%;o+:e}HKd\}U])$65EH6 aӬv$,»fUMѥ]ѻW270}`qQj0I0xwdeɿw-=Gglv?{ޕڑW/(ўkV J", {F؆ۜrZj'ٷj`UAahˀûhBVD>1, :;Ob) CJN]C_dzO:nGIةt7nQJ{`ྚ XCUwsM+|Qw5OOԸ+z,KIJ ऀvW̏6bؤ@sTNy[LV¼6Ի{M-w6}ܸOaEL@JɁ$R$1,cP筵r 9rH%ܙEՄw5uچxWӁ 5*ap ӎSaB7 *H/}' m'$i3y[aI=)9 b=m\0>aݪa]怶 !2vHMr/Q=2^pܠB SWPfO$zYԻ&J?gkȓ*8U1'\b~yGJG8dT@e q[+],IQyneͼ7ӱRӴ!OoAI޽QBVwNyWj6 hs7(3k5Mlb%=nQyקq-歷';h@UB€CGT;;k~s $DbJm5gUs0xw̷u~Bؑx»7mU+:UyMy۰5C F_+ OLj>6qyþ"b+q P덻NG}awU ]7;iZ9QM{\.;֧ܺaPղe@ ]Z:6,IFF.cC%-K:h'LǔxWP1NK_g<ќjU]f=R̦X\#zPe| zR+N`C>c[X"OFՏO+PhM~aJ6q1O[;d86W4c&,֬ZmVsx׭a!#NX UXJ |3*0IXxWKe@ ]aTullB-IF1 =WHbs]]{W4jѥ-5,~@$y3oFhaxx]p`4u,یĻ^+?'?^*yES4ʢ5wQC#RR˻sY͇Gs塥^HB֌zj;]#w5L Wpp0̀i -FW_tQ* `5 [3M7+hclwGfΪ&nCX'Ka#]2𮰼V^1qlˡA>jc_Q9㖨jJewMHoj1SiߦŻR*xd~6x|Y»Ȼj"ޗO/E7829sǻD%Fc^LFn,ٰj Xm,F3{M»AȻ(Fڝk.3|tSex;,;NQ}z2ξ+3pG[!sO;lH ;7h/+5B" +t˚ \a@m{Ӏ+ؽgb7`e(vƂp>ŻNYT9c$ɪXyeۏ=mRtͣK&rF*!+84Yb5fo0YvJ`g>5j4gce`^Fo2mTbЛ`<ʻj^b'Qyn|}_ @l*dԾgr͚Gu_q5+Hrg7Ɓ6"0Ę*> ygQ|G?L4WF=ݲ)ݜFxW3>jD ͼ+v޲7_ Com)NP` +|y?7YP;P.lPuT5]#[|+5;. هȥBop{nT tZ 0xN,pjweX5b yŸi];&؃S)wn}P*5wvH<j+ :]yZOw(CO{ d 9>}F!pbb6 cT>v%ȻR;y5Sxʻk@X 2)ZؙhW> 9qvG;Uێp | lf4 RW»Fxǿa1w'pRn#-jNa@^făzWY^;Nc2G{B֜ypjyǪ\>=}gcТ]0&i.wpł-\57&wp1Lޕzc\h`b|:rx Gb\E[ME`N5jR.1*I/yp9qEAeEꦃ&bb : !4@v#JW؅*[Q<;w]񠣽øy[͍k> lhs;1 .g] MfiRE})W~5.rWuwj1hVXF`0v5.7AoyTne6P&XỎ%Eҕ1r|u:]6hRR5(qqm@l"A0o ㋆w}m)\́WABa].R\ k_ZehLFQP *Y9:#],iQ,1E j'Q 8yh}^?l"¦ -5GEJywhLFQ.Ho8UE% 5ȀG»]w:pzA͍k4^N#]¥JXxWCK  B| I c]1œtŰwDqU Ld<4#Džf|~?çkO7_ w=w:.o2p9uJ7_ʖq W%J,ohO^6)Gi]7?KC4Ew˪#q]{TH:wŽ<5[(u1$^R~T ֫͠O6gͧ(&y{yRi~sJIO 2MߐAxWCS j#wS ;_0wܶc Bljh>$sgC=  `; Wx_9qaĈhgYvSȻȰً-J,e3)޵Ez)E BGkwZDR|}o>x (V':h^PW2N_ĹjwEm'U0~{9:ȴ񮵚flL?g"V7[\?ǩЯ,wwZ86ƻsJZ};aٶsT8Mc pvOb޳(|ס 㬥؅H56FxWC J[=>1jQIbv[X*\pvyFMcEɍ=Y.Ά;꣋`s_҉qx׾VG:az}'8|βK',."]:erjJh*@M,z߹ Pb]`p@[%2!Ï=x~@]{ּx )mǬT-$fI%ot5 +Lf!w5*ޕ.ѝxGvpk`zkm{Od?=]](ILzxW V=׮ => b޻ޮ95Z&0B|»3l96l0jg+ڙ{ }TÁG--=GSpaUN/~"F% jFѾ+&z5kA X5睞 [xWU),/uhۄ!'Z4)ϺWRu,׽gẺ (s23VX4|xo6[Ht=6!$ wrp hUb<.Lj+<}ptbܑQ+O6$!WFQ=04⩅^`XJȚɻN^W:D | tʹ4RYkЧ ,7^$l,(i_n;,f|O!%^E/,[բ7ЋyB$,8Imb c`cDRįV P~S3C ̨NIjT=J+kx.&#ޭ)ዺߕHH ?-yq9l܂~X»F0m+={MCIMOJKޕVGv2AXU3kbCIZƾ5C*FyZ fAy͞DF` {# SŻ0ˣuƓE &λ~1 s.6RpƄ;t RaHn-\QMlc￴SŻB6H]Jm񠣨U6Ϛɻn?|mFwՇ7Hm0ywq\zH+][uJ0F1ڑhAqT[=2g2*rV}I~ҝ J[&)Z{o *)m'-鵠E[5 +27rfzО>wM+h~g5i]qw;GYCgxWcӴai,`P~VׁUtM]*sq?'fH CYs^]ou\Sr\ey~FpmXm?HD҆S3qƻB}KU  Лk& Us HCixxߠQcn0DI +I\]z)5Z]6\zx(i OI4PS`Ka`T3Z]w1C{dHx <-,-ml4&/kxW\/ynV^V}yƘ{aɼܪn7>[?Uy»F3mk.KԜKf Z]R qoU2~BOJ-z)PRXHޥB5~9&fڲ]>1sbX>cfo Hd|;ֽbnJAt&F1$Oh7}lȒ355MNx-"!mrFq dldnfc`o=4LQ$hbwD[g$?EƘ=RbܪGѩvqf[e1Ol]6_JxWQ>^fOhD[xҿ>37HMλLxץ' knb f~jw/cI& n]v: Ș1V蕨iY Ϸr~kw)=n[DVL hׂڄש ڿK7cļ|t#e#J3|H'^>){"5\i]=]}² 5 Btd jG]p)M.Pp0øؠk]\eW2[?Frq JZu#0Ѧ'/D.; Yм+n QfQ&<}%iFnwF ]]5Z<ԩ(@ĨA 5G='bժ58l{4%'"Uk6ZP@R^x*Ą fiF 6V]gph} ُl(/L>u)\wET2 R"p?&Ib(9_UeIutj&&A-( 9y ʬr ޵G G;/۷[qԬͭ\嵜OjG1o=h֑1,k$0󮌇ުXo}bOĸ_VkQqt{k][B UO_{໑A@*\[VbvdH/M KwwKhÌ.Y-h_-Jj\M AnަV^n1Ys[nX HHd[+Gӑb)yԦҬM}rޕ,רO4&&(DؑAD3w.I˻[9  u{Wa.`ph-&L6X^kN2wi5&%M3ABo?a@tBr-#T uLλRB6ꞒE5U+1ļ4WlT)6av{J08IxלGrWլ̎#tyٰ߯t6Y 1k-b¥-+]#wfx޺ ;REZq0^ =-:,,k2a)]6PB| KyW9[]m֣V £'/ Sý94m+o*;yhˉI_絓 rUwz?qeT%y6È$/70e,4I ?]~P/Wlvh癋 V3y0ǻR@0/lt70^w}K6P`n/v\wቆ,8CG&#iZU \ J0Z%( RfU!_i3/WNR`7q4? o}w0--" o,sLJxW֌ڜ/[VLa^yW((* yU_@j|FL[9ɪj-gx{O+ོ+<򇚷$\">mi+c$woe?W7mEYYczd)ڟ ]YIciu7Zm}zL[ͫs|՟lICKd  x+\5[o Ԃ.*I%dKޕEx*N1(P@Ŷ;tž^4-퓤Xj=ZqEcoE?òM{t!V%!{~~]is8ۥNZ!'Y95 U8<sMTÁ1%+Hs89Q"„ w]1;WP7 }p% ] ]6"ҏ^ptBz72oc?#HonC@W[2]\LOxh9m2޾7j)]9-+w? wW`LрrN]7y3piY\#m6x1f ;MޱF;]BI]M*aJŒ˹; $m2v֞!BOF{qߌwPlFϤP\͢t^i_#MFeE&rNKnmoVɦ |C{E8M\bVj[u*YӉhh*ОK/*sC%-.;:F n pX +}MP0@c'hW S;oT?»wEli=Er:l|˝qq")k2Ե^1G  ؼk<)?Y$ƞw^v?JKD8[i`*_cKA0 MZ(i.J|rQJx[qϟ^[喨]d@>!2hY6a ]*]b͐0651+УujZp#Ʀkn }z}#X?X%{>BK8' h&eeE6Q.1+JB\byI;[X4#UC%$*D*c%pXC㾆ԇH-ﺭ0HC3V,`ٶs`Ci4 gXK uuw{9vp[iƄ??-݇{%;>4,eEͤyWxQc {@:DǑz (wtі̙W*yK 0dl_n1Tm뢊䆽m$_42e+Ьf8MxW?&昔u.4064$8 Ay[|lS%6Z5xrݸR@ sfi؄w w_^:^jNM?4iej ]XQwlTCux\ۤT4I,=51tSj E`{n0.G[e49qȁH?V_"}t,KDGDB5%+d" z6f7}= yneHaCwx(Sz{0t\Đ w][q h* ;qqS-]x^,v?Q<{N ƙk1c/Ps`$Ҭ»FE,%giC=zAK¸Č毆YuÚk'AJ]&f!NP< jwin»wEs,p pSHhu:x#aue M騷 ؼ+%2n.1Zu] 2^wcª<ؔ-21wҩ ^sK8-޵τU+8Nq}! 5Zh0=HjIbֲrnPJ6Nwq%.減͘S]s[DE{Us#=m=&* @JxWH@tqLp.tE }[(죠V,h˶Ӓ};b +u<5/ϔN\4*`]ࡕz賑UniMcSxяe:]o{gEq?%$טŬ$jVD^75p/ 6 °30,(IQtoT|pjSU]z)eSlTx~ĪʹYI4%EWjsikK)x]~>D6ZQ=MuW5%Zʢ~~b9iQ<L7ȵ:M/\Fݵvg-g}jv8m $nϞ3?rEu>+jFDxŰ˹DIʵtYk}թ:,W˾Gby\MIkSM~L߭ړ,|읞 ^@ze+Z?}hȋ]U9KQoFFoKݩv+[%ܢ击^փܘ I6]SRvW7eHG.vRc  .u.TAtFgFZ *k#:r"|WF0r_Tv*)Eެԑa)Ub27VzQw"KCG٧idfqmr{ C%YGI^Uά*JwU߭Z^OC"wܠY^ZtGY<C-`wisS#({8}n&c8y8񑔒o(qk_O]uQ2Oٌi@P@5^" A1PQO`|M]='~l>|ΫB:_sӮ|_}ڳJ]?\hwV eAp!:Z!*^|EJTK(nU5Aw 3:{x*o*_Dێo/]-n40U'l+MwU~f`zŠ GN]t_rRwЇ_?S?5[)(T5}|6N[ tbVM&DaXpeTaxvpa+SOUܪJ"rE h->ZH) k܆TQ2Θ yi+RWؕZh{`ZLe?Z3%A6#U J.ح˫N#WM_]+GwKG,P/ /o=ثNhX<}e5^-i]Q>uOxU~➫e:׾i8Q@S?'SԈ&?>l*f^~of/e? ]돞UsxD:w)wⶃg^c?MZΞ ]tvP{ EDhu7ev=dPsg@8cs9gyGu;A)Ӹ; RX M _2UE;t׸ +MwUqr~7M[5ωڰ|,%W[K~*%]/}UԼtWeXg xٌa.(h۞zz+k鮪M^p[ zks>/0k؊[M] Waoڥ*cx]}@tnwZ$ÓG#ߣLpz{(C>UabKvh"WQ4[_4,*Pwe&g)}\ԥMeH67 zEkpbrx 0qВ̳傀$kY4 Ʉ4 Uo˃|*IIv[NRg/LI9%գ-.l;q}u׽mi ehi@N,[ZjG{g% nGs?˒b.e۷L,#Ky |W=vpCF6r{vr{ƷuWOc;rF'?8i2MgY{$Lo?cT\Awщwa98y2%%i ѥum%MU3+z0Tz}M/UzcݼnoYU*Z t:|7kXu9EC|3'y2_gŝۚ=GrxYҢ_>aSc}smi 7oIK !]Oo.ū_ő6mo$zȹktyW.ͻ-%*sUZy~6H6ĉ禌QQ(Tl:d k+g jW <`ΉeUs7+,[ eyJ&N ȶ8cסكxs|vSn Xo\K6hR%͟5 ]ɾ̾c5ynP5>:y#Ufq(\Lsc.ߌtrA9hMP+F_ *DweFI]R&+U*:SE3|krل$}䚭^7Un9tCc ǝ''`z/ɁI7[ɗn?%dʶUm*#?d~ ojG梻*Z+m̑eF`bh[p_q,U Y6k~PqUd#Oc0kI]k}Y\Xӌ(K!ǓI =t_?JE+Y,tJŔBpTw|X|^XIՊ0ʛ >{x=FwK/e*)Vco/d"}O3f[&7݇hߨIeZsb42*/k,uWUw}F:(*}+^ZP49{(U9ab˷72ýQp(S;7wDZ]y/?vFwKbuWDFcMv,Cd^p@B{gk\N' Cvf%+nz(f̷}v{ǘ>n*˙π]S(e@ D be2:R3%lwr[a{ZU6?}^H6Vg`oTXn+dl&,nGw (o^Gʡ[+y]cu ?R/G`3 lZ 44e{NRz  ] |d%~ GcfZw44zV%V"ƔOwR_3H@旱(7v0ܮ4 U4[Augiiaea j~i*lݎ#v=͉ {?]ԨJ^4IC>SφLUmOzk ͧe2uy` &FLZZ +iR|~ui/Z0')/:]mqЂSS'kشY0zcTV wr9`*v#)-ɃZ=FtnNlzEFJb-퀾>yNa803vT Mj0 c/\R'ˌ&(=glYL%[Dn>hcl*+Ww>gKV03xUp_#VbIYuܘJQT"i،BrncbW#g.RD_!V)PZ/GzN1]=I\4͖胉Jq:g}R~zZ+:#ɳ/I=|2qH3W,YqoP˹ 䐜с}^(f|f{dƾ'A8y%|q6abҌwX߷zM^X]e*A{5x0_) >+#r^ɜVlfPP#WL_-NcYL.[i)s[2|Uyъd| >Q+b)on8w33P^XW<=%TlO=%Wڙ@qV PB v_)/>~v)y\{LN_m *;5$~o2$Q׷:)FGk%t=Y{ϓL%%cH*!%Qr5Xc贺/Ѽ{O݉;W{π* k~4a7ntن V$ EQ; *WO+yѵ[ Zx{:tKuǗ9 Zʉ$ 2" #X~5q)_SսS_ΐkCC"hmPhi=}k,Є6R;u;,]TڣAċ{reO#9Qshϯ`X6_&_4i&kY0u'%7W"sv)}Hkٜz|ƽGM^%%_gŵXE:=lwO% 5`:%^ Ku52~@AA-!Y Iuk.b~}4kC]:M)Sp ~b6EvPsq];C-wj9@/Bezܣ%'^;qڋPŚ,E6VIFէulvNaA5-vy=V=unl/; Z97[˞͖=,iA'hO}ٴPam  xW6yn"wUN'Vifcl:t\aw ' < ȒSS]mpw27ݱmygnXhΖxyR%9WCfѵDr+1gjdB/Og"4V|kd4km^^ PО 4K Z/P뒳[𓬼x.#͒MB4Pӝ.ҘΘ7DI3@O_:th?- C)ՂiE/= +b_Q#Ъ,Xl(ˠ!YB@~Jڋj}ˤ.^7v=uEe5zY%I@_$EQF-غ2qn2{5,S$GHI }+H҄yDԕA7^])Zgn$In _C~#%M]:=MoЬ5;4ǔ_VD!ZuI(Ivpڰy[4,ήj.X>5JʖRp$DNUҽDO R)b-0֞bUu9GUm=#ʢ&rO]due $CZ:WK#l0e:7&֪^[hF;4BIPg%sI+v6(\L֌:7v:@'|PfXYhOlpmjaWEhDW6rq_g3"@V#Оd觓kº;ҎWG^ȳr W2un @ @ q2O1.Af|4}5q`J_r @ @ @ O&UziË0vdGyj+ @ @ dw"c8iu,~f`0Z'Wv_׫x1 @ @ @N _ى;xęlՕV?N1 @ @ N`惮`1@ @ @Hu2&k(  @ @}]˨f/U9D$ @ @b1rIg"> gbf@ @ @~DьzvuŇx @ @ %p?}Fh,Eu{B~@ @ @n :q_#u,]mA @ @HFKw==g֟HV| @ @ Whʨnբ_fJ!@ @ "CYl#@<=ڷo *,@ @ @ȍk_MZ7UxgSϭ$@ @ @ Sk5z^97a-7Ztoaҭr(9 @ @ 8p},osj#|bi뷵#Xs-&C @ @(/cgv> stream x]YpyvUJ򐇼18eَdeٖLKe[mQ⁽]"uaܝk @[-:EI$@޻eII;+JU{`f4ꫩFoOwwŋ1` 0c1` 0c1` 0c1` 0c1` 0c1` 0c1` 0c1` 0c1` 0ƀ|B# E^ #LdL*:K,G atp6̗b+ΰl_(  anwc'BAKs#M(Yl= b:UDEXѿ_ޱlxt)֩T yݤf[[*7/_TbcU]I𮣡ݯh#_߫]ɌO()O}96~VKxmV+F3g#(jUnb%o_ۯ[O_ssƕ}@.6K2RQFmvy-ڥt KaFUb}p#BQ^J@P>Ivd<|P@N>>:Kkcԉͻ׿G{`:*HkxdZر;ܛ<7MmMdDi-̰Gȷ: f\]7 NoW-p)lɓ_·OŋݗsR!Lxp:\>g<@Hnߌລb8+b=_b~>_bɜ{m9bgKch-h*mܚAĆ7˃Ӹ^*(}V*خ*}C')6's |;I:L|ځ mj % j%،K>[|T`$6͚Ўn kO*M2`M29'5N_s?|j{2׶ƿQi@LS!䝚QEdm 5>2@5N r`ڟ,]}_\&U lI\6bãv%O:4s~lO/˾x%UܢZ6?.'a2(0?^JR/Wq Ugj֙#9*t@02wC¼G,\(uIsi)+.i#೴L`&EňXF~im O^isC'3C$ ܉˪F\4@- cVrbapg- Xpf2sIUGj`eeWl+2Ҡ7b*]¢Cœ=7EP_|2;x{?pC)T_Bh_zn`ѓLl_ZFtj˦PthЩ+Et`K0f{[7I}Lʨj9ldLnJTbxUnoAɊjN n)j&;Up ^=Jzrx0{"wMFӱBl t䣃yF1v[vuQLHѡسQf|5'jW4peҸ+S;,7=QG7"Q0CTJfZ$UnɄ§(FJ$ْc% eԥk:W1舍u+jtID4y/,|w>{ .͝CM..zZPwB_12>[Ahl`|>8Zl$d̕4x*x7:.P;17%9zt[:ë/JikzI̓TPC:OGU8KpA^wP簉W7J.LѫrltӡzWkJMϡ%62n 9V 2Peƻ36tjA!+{ &B-lưj\3+kUp)JC'zJ"&5)z̈jf&*C1T^P0= d͂U4^iRLD"0k(qV] 1'T r,V]O,B-*"z\0C(>nbR (/ P&uk:LF:8 9 ~b%{`j !smzܚqE&g%Hl-lmZ Ԣ'$E2~]t cBz3!^Ǘdr_ZRp d@͡) _#Xp8LW1yPtry B_K5b}m lk(X%VN-AiƈOm b%wT{c: yIk7\?u@+ pP+;8M$C†ؠXNj-7 Ok- cntqCFNZtS4Ba=V]Ǯ}ܷ^U7EN\_o6vf<^UhZC-5Luz$܌`o9 M36nB8`g>._.^;'QHZ8M;'x[cg$q?”w,m*,l=P6R<ІJHSb ua+iM]izjJSy:09/~LC/P?¨ DQ3j'wsUV<TDl**.}XM5u驧+M9i-mOrlwΗ~4Z j"5WZ׃dbq!' : +Gy5R;17<-J-q+Y"N uA!i4a.1 {388!|5wahgp COBj kٮT1E 7! @lwے TlVЉj1Llb깃dwwg_M'O|j^w>@ĖPj6'5 4̈́,{·!r yCudJlRk,ڙ|FUlYzMA,&@W%,i,߿o|^c d՝khI}#NDlꧫoEx+e =mF{䖫Ȉ_Gl?:f*۹yMl< /~!}9uIo#+Mzr9^ [V2`FHf&~;44=5r8i8Am2GyR5H]u5#$L HM1_*<ꤏws WbC|kRa.q 66)9h3(}x &&"rNXZFc Vc!Utc.(k&q+LtH1Ϡs%+ #Q`Lwq18C'u53* AڽzђC)=9ARpz! كZ('P cgxYLR%ri<D&ND%'"Bd[( gL!fq,"0X@-*Z9]D !o2frȀŢ$?X)X_?o&ȥupM`V̲on& 焐rgHY:1>2BLqΞ&Y,&ZCF/dԃbK8:@*l4U#Y|XMާVǔvMHf'b҅L2BwuYpvRnh0S(|bM:gsCLLȓM|-Iv&0߽;ۛSG ?~Go>7>3z,|] *X7G V#QLz-x=YPvRdJ6茄DĆ%+ Ԝ@6*hZ!DΞ|敖ZU&6qc='t)-mAhW"G;;8Fqc[綦 [Gjlšmdj:=(R- =QqmuËono9<Ef5*Q6,02uLltFh]ׄa>l jĆvb]"cêw$94=8S2qR-d#)YOd J1tc!a"٭g,^l*rO?/L N)ڙVQ)frSj>E%$iuubWwG֘*66qLP%kO4cp^AQn)3<*7Kl tws|Ǯpޛ"ʑ=G/ؼäahNe&+|LTU*64<ffFkvJpb$[:Ig7-@!~ 𽻆ߑet B-6ZCޤfkX4͉4cHu2.6訇WUMLStJN_CX:AL%w`;/ἅV v9|76ͣkUlP(S'6ҙA¹WM;iu5u6_ [ f=O $z6zwɺb3'32oleʹ4Y+zZ4@rӄn!H<>%^iјm dPSVTl8AɌlfNlI:!zUL >R&MT_Y TnP(xI Y#-f`/(1|[tGda7S2nb.,ԻU_m yCgFpȻSDZЕ_9Xvӑ7'3~pE=h5_. W"Z/e"GlX! s ~ }yX GONgݏQ;#8D$N9L+UrT\)8%UEjF ՘(VF+Ÿ%:b`=Q iCkЪ̯VJk8b#y8욲8 >\[1励)Z]ƘyfTq4z5hr^Gj׿n4C|;]Ԃ {3G>Р5Lc@F]Ѱv;j["vc"N,F RvX>PlĆ}*f>\Oˀz[w.`FW 0alnNa?B`.c&cK[CU pϟ̢ {X5FɢNCm7Yp3P`gn"7bb& b4b2DV,bU>da+m18"e pdۚ[0]sDYQ_76ѽĆU`L66Z$ bö*v /w?|{L]bQPW쭆q$HlVKhảޱ) d)WbA뺱 eF(æ޺*wS*Lµ?=Ѐod `^6])?8k@Տ/ҖW7428Z8}6hg&ҵ?;#o(_2FKPaS+L"dvꫪmՃt"Kh-:K7>V KT0QdֶI]٦ț,Egwc{2 w#ߞ&rLw_;x^ޏmqw$0ltV,G > stream xYeŎ/=IOIҷEߋNP@1S` 2?_uvCqZB/v G}؟v -[`nv -[`nv -[`n/ ;wcW_}+d!drן9sgsAJ?\|~r}Q+NhjJt9[駟EC\σgþ _~_|=< 99[o>h-=G_|n:5\cW7~N8~"T1Gq;/ag}[bh}W<eN_;n6zq8SO=ŖQ)[ҧCXIÁ+6G՘iFwlԛ^k$T~m]愯<򈊵{V Hk[ s;+gpYء=|I|dc.s pQ2t&@+dnS(>TasHA&y^}Uz'* x2ku?Zc76) /^L-n2y=M0ف0 |Wv -*ϴm|JOʍd%ٴ8lwgOBO>Bcg}6Z o]-p[o}ක:{r'mfZ=Om`77;iA>EgJCMGvXc#` :6LJ8AS7׿ll<)ehaW\b!l#_e\nO50 AUTm2Wp?ÜU ~ cϕ,3Jf`8???()j8`C—~U$NH`X`w,P= 8#’"0\{:h#1B֤'Ϟ=mĻp#2Tv^SrӒtvaTgg V^pts+ֳ0+rB*G몂6`)[M > P5}0{}4 C4GD>SsY#P8h`Db^<ၘhx2 N >T)qD|[;y`Kl֨"X)WNh|_EQjhz1hwѿ#+0ln7H)&:s NhL`mAm0\9kA(>8WuI# `/q>'I]tPBV$00U qE9N73Ua[&(Ĩ C"P*v#O(8 h4@L",kD&$!1:D PJ'ެ"q\83E&AN4ImH mOFDCF$P]씿 p <|AS[z' 8 GїN^~|@ 㢚hrrIKq"J&4T~+j-1; !vqFB8Tb`ɖr>$d<^];&W!&o)4VmUf\|Db25NVǀca;{Ml7sI6-YK ɵͩل*ϔ\ RYWОV65JsD<[ VDw !>D9s91dJkL#RjRG3[ u̹i,g 2sgհ(P 54p2 ;PdBV02H#1%e(H,i }?xj @ą)SƑ,sYp¯oyE)C1JN }Ɩ%H'^ 2Eټ2ˎ`θkcB-_W m9jJz% lj"g=Nbm c[bmԻWԛ"[qYkȄtĶGd6i,J&-$#M,g+cjA,B}sGqnQ&!4"1Aiр̉MD0X!tbR!IS]iF%B"S(Lb 1gi%>r ?}MMGk- Q~Ҍbdp ^4ɍ؛Rkk fYIkhB:[F2gü\*fBhN{^/+ NM+[l11lC mڍ"r.kJKfl=ћJsm g!*Opܶ g(KcJۢT)ʊ$Ke ^b%P)fUx[Ì̒Y\Nvw}qJ%fXrl:7m|QsY gGAmWb9fq?ܨoLI~ehM+jDV[EyjJ,Yc׮'V^ n!1xIy%ƇA$FlO&RE8)WM-r0'}5єRV Q^IGqw㦐ZVdm4Ұ|#^9`MPL4iAVBݒ2~圢M=$ctfT '%yvp䚶<9UX wjbV_#?i.ՊԶSM =Mfm]ITacc@W6<>Tj=ۄ=hmčCF!b`g*X (jlW ~l^ <0nF KU]2VsFOX*'&mzj˼Drsd me^S&"BEܪՔ pF^LovJ#nork TM k̥qV䆲ɐl?*z5&m'~޴5-Zo2U+e,Uc'>5 mX u话WW,GJg8J {.-)Fu%{ 4KO<;%Lrr| 8 ᗍu# Yb0+2fٴJLQ{F\aɿ1zt ĕ_>H/z]yͤa۩qː}sf}t1GͷL#:Hc"IjZE4JE G敡0=8LLҜ!$ }ZEWYh8XdCObiUQJ]T+9?BNP BkQCFԮn8o6G/HL]uxhyRh'BoUH^XUDFcg%Yj߉$y)P9/V%NϏ(D"z} ")@٧P(k[ic 8?ckM" Ƥ!k=_9!!!~q;tN2JrŜX'FF{^9*=liP(-kMTPtp:)bĘe4e:LЍ7;nNUYi& թ<-&"akP0g )6}_hOMpF*U<3Q`ȩ%DƳCӈrH[IVSȖjVٚ,#/1$~ F%iohOkRƇW*eN"UcEi!prg M'rR5\03bbЁ 1*Lb64)|H^\WTyqs:vFT-X5; 3 2F(H+Q_۱!*J%BgmZ*}ŭ#]mĀn6nފF yQ8wa! LW[5C^W'>jrۨ?03[Gپi)r`n+1q|`qzJ2cB4OYJIrT9הKVFkŰ3Y PF\ѳgQ,q!7E[L"ڲ:0K 2!p1V2"<-gc!i%16d$SD~ kL+s/g `)u] b47OZwA%_D2$E 1wT,,FgYl{1SH̥H*Jwg/K8R $S;  PǹxWK@``$9N  xF p2b: CB!ʈ= |{p6h/ 'M=<.j-[`nv -[`nv -[`nv s,2 endstream endobj 14 0 obj 6105 endobj 15 0 obj << /Length 16 0 R /Type /XObject /Subtype /Image /Width 202 /Height 60 /Interpolate true /ColorSpace 42 0 R /Intent /RelativeColorimetric /SMask 43 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x}xTU?U!NˤgJ +6,EEV]EQPJ !@ NS3Lzo 3w& χ3}s=w{=7SL~&%0)I LJ`Ri D;xu`#=j[ti{mwOw{&s7=$)f13gzqāu3 +8qZ0pa^_ FYw;ݝ<|Uqmd7% 8ĉćޛtcOzqM+x7MW[RuG>b랲ƟSտ1MחN[}~<_~d;#)>LFU_ڲ]c2h,u4x45S&{>'{I/W兢U/zZ7*^{[?}oVO?9xL`MXY]&)2s%|͚5MvבQcn>gf,~${_gO=_񷗫VVں]7oXO7ll߷|?mٽq{jRқ/UhuiYӧϕ:clW.[13γxEaEK XCyrU_^~UoMKk^}jͺ7߯Y$67~߾#%!/;\-.)Je*F؜_uj le7,ѧ_x75Uo}}ŵϼRrU*_+<7*V?k|_~CU~howw$ JtU5rUefn4[=~% t7DO( K5ZmcSesRY-(\uX&P+L=RVYyw>O6|]'4>50Hɕ =+ʕԧVm;쭓41|RV6$6)d|Bl|sS22 )LӶ7 4{}(ze˟yYʵO|㺨]CC֒R@s".}3z[!իWm3rr `oW7454676464457TUj** Ui8/0=#+5-#+;L$JstGh5Q+_x]}gtVuumGGptUTT*m ;#dN 74ίoכ=Q:|'Nƞ:}y>वgDV\ƬWl1{R]Vલruu垪C'or܉qJ$UVpBP9?U G#Tx^;TVrKJX29KH*s!*n'|QC ˭K;ohg֝v- 0}Brl=!e\ȼ;#Z 5 :kY,Z[Ư. l|gKg1~Q'ؾ]{%B끝Q "G*rʁ=995##VQkjjH ;*(꺎@(\bca) p{vwu =}MOoFK~wG;C/k2Ju#XkHZYHfG0p Ʃ1N~%d>'n@5 9!U#*gp:`| :^n(]M%xR(1r(NJjy<;T,(1"&{bRrFfw@ iniB/78HEPP TJUhZݍ?-=}mGcުUS{:y#"5J@P=6Oe[9#Hk.MBD%B;x+cA \={?Y'i]ܙi*1tؔi WԠ^-zbx.dtKLk۸5<CDS&U2-[F8*ZZ}Cڑʡ!]_S[ߨh:1%%- ŒL,a;W]]D'VU@!"H]UEV@ [ 8 :<< >44 rkW5(n{OtuL} (܃~&:QB#,YVT!thϞ0a\ g GP2L+ zOLs@L=&F.@5`9@ye^XY`H&w1JP?_z#mұYfK!kĥ78 5}'\2QsV&Mm{jvjW,2;.fxzzD-(;'іk:`C'$, B7GȅzOڪ|ǝӁ#ǰT 8px=8@ɝro2E $%ԇVqgX9aTD_If 5a3=dXaiŤe.#f::CePmٳкm}dW jhBV󵬾^RT{is/rWdyPwq/U-` ,/z% YaK N x$ oDʕ+.*h??F&馭Yku;sY0 Js2}ᢻb6 nx]4g 5\ۘr2F3P}E =@x-yr΀'TY{ZRXVS.t4;a!f۱gme.T=0RY+f <sw9rɑĆN8iBXBHMeЉ/wuJOYHڦ[QE/~Qg#M +O:T/J33Urc$㊏r39T{3ta6BZF~@2(J>xǢmݎOItBDɜ&cXYTJXf7'5sye2#ʌu”6qW:jn=z؄ 73]fj`(Hlݕ~A}ce_W=3< He@`/‘{er/:onnc@bjWW'uR+WUv P>KYa{qa7 HFYݠ$=NŢ*f 0z\L F؎nYA  6Ps)QKYyklٺ3Y}yf0xepC*[(8b-g s.?9T0#&qCO^ ,ֆfa80DPVkk+Vʺ/o}𶎶f?YZo5wo}KG||]c9,[- gX-$pUY=<Px~d&Z J;WV`8IWnG25!It@ "&{fzg ̂-P!Ztb`+f |/X ?K#\RIAOy78鉾aѽC#CCHe`+WFam fU+)OQKVT!շ+gZ XVlk6FheR9_c (xG ^ }` S,ZN զue'b,Y!EYko{I^LhD@KPѕ}tl>Aoc"x74g3#}يƒ21׵Σ *Cg@_-?Po/E59/v/p9ndPr]zuf²# X΋)~atBIbƢbV4C#7P#b Z%4ƵnWqtQn'=ALJ_CI&1)HgӮ`$`'$GxN3/`Рo g xхp ?%$)8v|'Tbty F'ï7TJiN


WWU#WVag$O"gM.ԢUL EJe^Vxs8s)V@ DR… 5#.%st\,^ۛKav$5ꏸ* GNK $oA.7B,U/1^lA _WpUK1T$и; W 0EXK0Vrճ\3q~a^kFG}qm 8|Pfs LbiDz xcAք*-ޡXJ.ObW lUo&rCr}(rrHq8B/`Y |bჾ%vGsn!ЂrpM! -/H̠}v<0YaZ%h_9l`ɀ8_<ݓC܇8TqC(M @DLh}dYq0K7bx#Q B0y̒1<4a7>!YsDsՁs2ВN/Hܪ8xL#֏LH`,C4&HhYp~kCZ&#2Lw"P A?+00|bYy…s?˛*MUEQ4 .'RXF$!|0I Qn8@Vi7.9YEsD7&1G>$Xġh)s'D=}`L 3]}rC2xJ穂W̑ x!ڨ/U 0 P$ NllKDzjCwqfX*'T$E0𑸊C` ?!NUTuu>l7 wHh,'M= Jf&=xs8I1^Se.tk ;d|o<. :W7.XUR=VZxe\OtSXįk:@-|]YjaM<~Vi M@_T[ '#]e0A,|"*hI`_k7ygH cd2¾j+] !adb 7Bc6"g //cgzpd`"ZH{+Ec!Ɂ7 hNvbQ%JBy|Y\b?=CJ FއO0,6?m[Y*Mr5E)ZPalj]BB277ʻqD$%Dd[$,Sa-+ݭy)7'3kNPy4PȢVWJ5_*Tf?aA+ Y bلۊ 7p՞Ӎ;ou# )lqn2iIJ?^ %J'ZMPd! {*r4ie}&AH$ 5CCHo+**kIV}Do`7/ū K=xE = ^2eS,1P8#zAYI9H*䌫 bbn+N\ 7xOXftYe 3$ 횣1zX\C;dݫ;:/u1[_#8d.X^*u{s 5L`! w7B2,-4≜X +(>c*wU &7"ڎ=DdM%:(W1%kAY%Y0"@H&s'ܗ`d @y2eRp\p/ś/ +(-UC_ D++*%\Y| KE̬l ˿6fFY{d Tw@buW Iʛ[X4`p{H`!'N|@!킇4PGܯ OD./c˸a!̱J= -OصM)0v,J*BW_6 J@6lG(3#RW:d/o@KX҅=]fr\0eRyb`7_xĈ%^hc'Zih}JŤ ::6=#;R*쮾z"==spV?K5vtk K@z8~ ty$()9,~(o#{,~r#>2hI=Iy @b9yEsjH8~<{/ɕIқ(!P " - de` deU|; n7 dü?~c,~bɊ{Wh>\>j^K.Q 1B+H[X/jZ]Ko~ԁJ]`&.$+*sWH'U'hWuͭ29,ozrI{\;ǟK.yT{XHPa- S?>{ M>9sOXh {C 5M1132&1fw:# \ѭ&[}I)/ÿ"+oС&{|@1 F' ,YQ-}\h$E$7剩x]*^k'@K"s_l";l-mv'P-7C~lIU ws*YΜsWxْGKcKZS&/|Ef^ᅗ&mʑ7;08*Zbck\BF "%bg\}y]5_(CAsR<'aQ=V~RU8u͛0>ݼekJjzo@uMlCb 6+RCZHFv3/20xR_귫غr.  E'7tce5}E:[m3bx;ܑ'6m./8e۶tњ!/(lTHoD+RŐsp+ఇΩ㽂vd'> stream xyUǿV}RiJ(RH,ٲ~-)J (EHHQBK(Խw;sg>sY?O TtтG33HQ_ɉ0nܸxz۶m["}yfΜyԮ]N:j:C222|[%R;^oz^lYRBiȪw, z&]ʯV*)s^'YGwx(7k aG?w)~u%xhnsJe[oU9|w}'PJy#F%`F7(E.Y.-XM <6m:\s{Mj~B%.i٧lIDnؐ3@fe`o?'pBfOa9U#V] ?T05#Ը/?_|+x8ٹsL5rV,Z'kVEMjK>`t_+3i$5k֯_6nxƌIM ?y.R=|LN?t =z\tEG _#,]:Mϒ|X.^vVZzCϾ}zi!=k,{APOx~WC.06gx@hѢ-ZXb3Θ?CUI?3_["[5M:y[ѕ O-`6_}V=ӬY^zɎ-|~g\nQ8㇋/Vrɤ͐|~&fXy g]cڕ;ld̑K,L0B'jݦ}mٶڵ3f !bOBxeG qճP:tׯߨQH:た^{2ƅyg&"(Ҽys)1Bߓ |ɵ^ˬǍ7zGydvavB-IȆMY}jSSS=jڴi(B04h,rrrYUV3Hڒ̊Z{gQ)W93jsXF ʕ+*x%B_ލO>;y /p޼ywuJv6joJ %Ppd?jtؑq5<G{Of/OozztiġڿЄXzrbO8QGYx(V _~s1Yge7~v*^GK6gTK|ٺGa;WU6-.{5\#8x.ڵkUR+*\'-3wljШQ#g[ucu5ϭW̌I&$ H 4L#Tz$K?d]N) k7r 2]K 15[mٮ)s=|:op'//kA> 69TWO:?ʉ߲eKsaɓRw iǏ @,\ 9k| mb,#nж`~8W*HyH,:᪂*Lv(61_[nJ@K 뮓lfy;x ТxywJOVPv衇*9F[!ygԩwy'lz9%?#YNm<}P•խ[W2v؁3G}$eB{'xaYG5Q-[򯺅+nJw>`TVq|IY܋>[. /lٲK. NlB+'~.CHɡ4R 6#dRqx챿j̏>ƉB A $.~,+|Q9T~Mf>jC-(ݸ՗p18A;K#o߾r0^8e.0\K s#7~x nSRrme<~?ݹnxFaOFY(([6oެ[ N:~pC{9~r> `mX8q:t@ bu ~P(9wP] {dn\lVHF#KwJ^'Qqa`T9>dR)fY WJ NLs=W:l;w4H8)2/n` Hҷ㉬0Դ* ~֭[w#NN5ҪU+0|p. $D%.$'6WkD"R%\bb\u_1v 0rփ>4R2h%5 $\C J$;w k2\9g^sv$a^ E&ntʔ)X’SNRDbdwJ㎓fKP\#4) GT"-w^J%T_*kHN#ERLzWMaɧ7t ?uX~I̤&0^N:ȺD1Z6^SJk. gaTzCkH!н{I1FE8qO׈s H].>J€ͼNPkk@d'j9Q[:;n A)![So!T09q d?(Yfk&+oe'SH#(v NpC ےƫ1Zu cQ$;\9(;e.?A A?ͻv]U˩үeso^6hٮWd_F? 5\мUyvslРԯ` `̨uC9ۙ%J+7ΛSNs=Vb*&դC hH0A1jkl4;!Ӹ#fpdOyL &Lu`H(̶Gv* 6^ ׫vG>Zl~&P!R?,:Mv͓bީvO,$w݊MFx"^=XެM_Vü+o 3X5V}(U)Hp9}P !m$YI7er<;`YIjJH Ӹ#7pңQOEU[xzL_>X1%ҫ݂7 ߓh-[x3+pG$,KNX~8 *d4{eQ߉L@ `(fsQe2?[j%82M(\-9*i t~Jɑeofe|9ݨC(ubue*W$U7ذ{Ur0E⺘!E~SBVX!9{4oWijÉna6):E[) 02;|[Ht+oڛR;X+ M;V4g//7?PntvYfWn IS#י$5q?)P8Ŀ3]p┃plrK/UWٛKW-~6ɻ|w٘>ON%FwџHlpY-հyNlcߒ}Wv/@'B2VNz~~Q3kd|L!rTHV^ KKM%Sy>% B[r};yU,Z<~U4oQqbh bd|9Ѭ)))/\nM)8M}uVJ B澳yPV1&UQ])sN%LDCZ6G#AKg]OG@J#J J+|r>_!#_+=甡%;}_{^pCʁTygY:D5Q@S<۫ZInt3ɼVJ~U*r[BYEKiy_) MҁP9ՠ(ع95MP"^:00b9+"3)H9B#Fkӻq\g$%D~>/&g*@+.y4#*$:%N(+/*:Bըbʗl\-"ClJ9Tŵlh |Zoݼٵr ?2P( H8?xK_vE{o6yVΚ-.&&f([AK6} '((V g~WCrCi+{74Qq?f7Ii Xxʶ$1s/\l׉/,?$DUoĂ3|!%уA]"O$9s'x\1SBA\g-CHMf6K[Nzrp"+?AD~uתxp,!$v76+ҕBc4%m-~~I7w.J6nawG>]oy.F-Hxw}by? pBm!%=(|gF9"i|J=D*iTe9- y;bbuG>B /.1D%+' S T(c7O?eȱ*)/ukd۶m۷Sa(**?M*6$RPPj8=ȆPDc)~,WԄ~ JɎ2wPlH_7/lؘ8Fʖa10Sp P5F$g-aUVjVd endstream endobj 18 0 obj 6031 endobj 46 0 obj << /Length 47 0 R /Type /XObject /Subtype /Image /Width 192 /Height 48 /ColorSpace /DeviceGray /Interpolate true /BitsPerComponent 8 /Filter /FlateDecode >> stream xZmpV>IIBHA#!H4jH)V0*8@[U'"؎QEmeԒ LZ0B bRCsʹ3{>9gw~LKVdw ^ifrCDm=5+O.+|HPM V|"vSH8+W}pO͐=!IRfJ!V PS/J;$[_":_݌EVMDk~+̳[-NzKSmYag_%0^,;22Z@eOkЬNF. czG]{NO#҅^4zG۲Kco?v~$1&r$'?9YV<|y~Gl4s#R)\~a8^tG6tw<酛Bs;-t|?_qv1V;>O &O78jޛdxVCu&%av7T/3h˳ؾ)  q<=ߎqj#V;xU3?{ϳ%Jx ۝U_^]":PHh~lrs"Lg^}Ul^M|* `?O?= ~R],? "gc_a@~rH~XxN}In1 t ASC0x1vnO1jN}9mVeҐiY̛kW_sL=.ZKmw ou#cT_oxTw'-Ȕj" Y6G/D/+Uf%q`nZاkp8f}I?o!~/6㹺qoi`7ٯM1v?f1zn&^&&m|,FJ$2gz$_~a0UudST=iM5° $hw" O GY" 'yn oCUTftֵ?t=,Q<4?̿A* jji;B[:aO-Iq8 snӿÃ@^,g@7Kf$Z뿔rIŚ#Va1-;6U(5cAߍ~CI)a*x͗ :' Ɵﱑ?IWp>Wrn"k 0mQdtc駟i0-J,5lb6hإ)^{ uh]7Rzz?;N.DFN*+30=ytm4R|sy%tؓ1Zy^6ZtT5[£'I٬?+vㄾ%<δG,i1Oq!!5H[wܪHǼ(Cij3wM}tr?g? /$;I"BEQޮ/BQ!թek@3Yc$x|yNHEgeO]5ubrj~<o73?ב=ڒolv{]]WɿH Ec`΁L6MnXw0ў2ޏkO>gxן&K3/'(Agy*QZ? {x Vk3~UeU?fAi\EL}*\f6nZ Fyi{w&5PJoQpk0H.O6$Q4.lz-yĿp1cvX>kIt$9q6Z[OTcfw| i>'ʼ\QjbFFgvɿ`Z^UٿggF́CD(K(k<x? 4gT9,8 d 3G$TMFs 3{X'|rظ / d[П+@hѥX#CEk7:BKfqFqwJ endstream endobj 47 0 obj 2540 endobj 37 0 obj << /Length 38 0 R /Type /XObject /Subtype /Image /Width 207 /Height 144 /ColorSpace /DeviceGray /Interpolate true /BitsPerComponent 8 /Filter /FlateDecode >> stream x\klE{+J ?$QRyc}4?HT#/ $"ja Mi$%Vh4- }@Z;3gvs[{dΏ939s{iJŀb@1P (ŀb@1P (ŀb@1P @ZPcxCG4-8>} l.$'/ P][X%IrBrǧalpΐR:MkᠮsXbm5wAh=IH/'㮖E8j%9i)j=Rߢ0꾝yRۣ8lܛ{h,ja@qjr!+ߧ#Š [€[RY,̰ 2~.ox/C<^3|3>h;|?&=9Œ rHf@79zt{<ɤՈ497HObc%pyղJhkp߱Rvr6#,׃:S>bmɶ(-?`xBFswh*:7:ylO;3ƞ< (su(MwZxh?tehF?8`S6(:􌦥^b"ӆV}aM`}hf[lVu1viZ%wkp+ʹ~u֦ 0]+1lZcRu`Yִor6cPe x ɖ篣O;M{ߍe^c}+gu4C'ϷZ:`I5P ?p;lx J/-~ Hh襧VҞ?մ jGfEd@J듩^Я:p7c m=BƓ16iڄ̈nj Dl+P̓MK!݊&}dS rFe'Hgĝ֚B;s"<^o&'0OO'W;@4 魦e#~KVGL}2t73B4]QPyЛ$7,&*ʼHѠ- ͖,xkNVh)͉u jn.p>4T&"gS9TA5f&w' $rV3T,blH59=x5JlWOMc+ 7r0}al23S 9t.gMws)!WwrˑnrP{fx#4AͰ% 1@g5=uz $6v]`LXS08xωKzC[x}ؙx~Ŋـ$9l59xrCۦM\pR3p!}¿C VidxMp9 pFqH5S9t8ysgMC\CM.|5nl]&BǮl/#Mز%s*SM̺ ڶirޡ2nrOBg(_]MN>i |\>r Fgkx E$rf"^Vv.GN |G=xw0` lw }@qpDWw /vC6Vb@1P (ŀb@1P (ŀb@1P (ۏ= endstream endobj 38 0 obj 2151 endobj 40 0 obj << /Length 41 0 R /Type /XObject /Subtype /Image /Width 256 /Height 61 /ColorSpace /DeviceGray /Interpolate true /BitsPerComponent 8 /Filter /FlateDecode >> stream xZ 啾5/BXm͈cTQ4 ⌉QhpttQ\@ H١( ^-w/U^9xN挞{{u@,WBP8EZ\9NLY1JԚzWaPRV1 010z)ߦպ; r&.SТBL؉H q Q/jgpܹ=zsQyх$M2!NhǕpeS[b1F SD0opvp0Aiޱ) :/T3|ZRǵKg2G)LcVC痿vw{,C#CzqGp)Z~W :zQ Onª¥|PB?+7+\?mMht}n-=7KLٜ^\zX=Vx W'9ɸn&sB.d$yKߓ\~a!'XE/X9qlF'.gVtgbA39E%%N'^.5fT 28ǣY 75өb5gM6ƴJUIˋqXc(+d[UtlPtu:;guHMLԸ]NJ鼎<Yl!Ur+N=]3FO߀j0."w"Bֈ%cg=M߆D*Z~a%J,dM˞<@bw}ȶb c*xE?yfߖρ:*lY}xy֣&c6ϳ.K="cN`鬱#m٘J%r ZonKLߥ`CK,b?f#׊a;V:'CE=d˭T9 kؐ& O'9^̲8|WAJ5T??"?n8k$Y立 yI4cDFTq O;K1M ߚIc!Lq}f8:h.eZGZ9^{id]א/k ۵V3me[|V"䝝jNץ,1+p."V[v>^}#ݜXҟGQ8Cjwl0Ek/Y xDڐd=5o'z5PĽ>jt Կx["~hDWfC !w`ݲ F^z? 4ʫ՚CZzA1fp^V{vp-#4Ȏ1ġ}It_,ݗ-cĬȣmQ<+)9Z?:#q`0[Tb|xd&gCL'`.7DmA&j6Ι0=7Q).aJi ~3.VV1>KuP(GaW,2XsIz6i>[ ;d F 'S\!}v#O79&>kv^'_q >lBQE&"-Bimbӈ2%qr۬2vˏjx`ڂNaLJ;3CxC45eU)ű2,2扳*Iby|~ ɘO޶Lfw|kIHW=ofBmaM%c.'y;jc[G-6:CFϯă}ȃpw,{=T?hgMIߑH1릝 4*POYCw1'9uJ>LA;>} 7?=-M0r4+AH.G|&bx&ejީpNrޡؿmQA:b:C" -6ßh/1A/+wŻ_ܞa54/5T@ wlDʣ[LADh;ӣfIixԓȇtI.N`Z>6ϟ 7G G3<JH;h2rmT}-lqp>%z!dK MAIƯBn9+9#F1 =ThCTiS" g!3Fމ|tWtT>j$EKZfZ/7L7JyF֬$5pXSFOWqvv(G;  hHJ܄. J]K?-ʷ&͎C@oS_AaքRv`ɚYz!cfNH|k92ʴX28>zR-zbhxfQXaTz\B퓝cmH/ ٩XRIVV9'/NwS˞Ԗ [m1YZNjd9|a>f܌EQ0ڰFxʟ$I<7ݑSo \T{NOղpPLDRR+ݾ5BXBZF1m`wl6˸3>E[RHS@L}E"4:I.!G'@n_+\LAZ 4A֨/ q^ӒAh2/ )\b(ip HqÀ [43:<'A8#* 5-Kwq$Է5uF~}F12U c!ۨ\)(ƥ QyuKE< j cFU#`\^#KϱՈBu!{!8&2CAB??$PM+>V|뿫/˷ rO%K M,ߵβejhJ!]V){ƳɀCs09\ռ;4fA?k&6Bޡk|(dTѡ#b捫CM&`だ хwz$rνc+o#raS> stream x}8/]%]mF"@H $@H $@H $@H $@H $@H $@H $@H $@H $@H $@H $@H $@H $@H $@H $`@H_urH $Hл2H $p[Q@@H +%^DH $'-ԟK!$z%@H @˛t@H tދiby$[ 4CAH _M j $N]/0M@H':?*FH ?@˯GH $s 4?,FH H $[ 4῕-EH O`L@H Pͯ "$w'0!ݙ=@H J9_ {"$7'0ק͹;@H D}/YK"$&0׫9@H @y+"$&0uׯs _:/F_OKij3?Z.JU=uj;Iـlnә4[*,{> S{ɾ a* :@wUC]a$Zqrb@i<Ȉuڜ4u4roGvכ ޑ1@?+cw'`O00|J%mj>heo%!ceiؐiZuֲE6jS}ufmB2"\9 {ؽDs½77EӨ MuKKo{-!Ȕ 7]iy+в =aˆ3_!Fe6*ܷxr[4z(8 uDR%6B~Nl[`><4 Ҩ)G^hN/\tνi7svĹ7TBvn\a|ZU97%GfmsМ1ss}GJ|aOT3:">,oD+5g\:Ź280BMET^7 !;u ykxL ,qQMe}#@vV9QGȍy)FNsPG*3)Z7!^sw Y<@x߅9!b'j7C*HőR9^gN8]ANDg†$7_TM ͐tш=xo?QoP? KS飊EMwf2M1xjiǽ|0"B{ w=k 1 w4m67>*=T_ A:ظA@=b.!5-а.u pItuwX^SaOKy\rmПC <@s*!2w$ #`:=N=żEĘf擆uyRH7Ȁ9ܐ4g1!3F\#ˆA$ClGU0'^1eROwƠ?Jݶ2(6zLpF`hg4YN2ɪh4t,Pchܦ3]E!J6/< 3膻5cQϑo2ѪlTut0Ncdܧ3]G!߭J:/5n<*Y!7a(QOQn"٢.?kiz|_bب3^H&!mJݓ>3wXg~O ` "/iުvu媅JÀ4rݠ ->[Ǝ7 !;h,A"2^=_)ǖw8=f>؊ZYr@z0" aKsѼa I1hX#CӇw!=NWܤ}ІC 9A=⭜V[!ӷ:PV6h;E2CVwД`Hd8t8% ly 9m U`jc-7BcRMə#_{M];ΐ a!:-tBH!@s=o7!5"ORX!.]nA,tb~3!?Րe_'\y+}}$xy=@M&کM^V eӆXC*ei}bڴA48#){2O#~rtX,fg[b=GN!ÎƯCYE@3͜6Q7!& Acc(;4޺َ }!d9; ZBȰ-3PV!y͔oBnJ<%v$|V]ѓB~-ꅲϛ7ko|CL8$rd(xϣ+s*lr Yy,iW^C~KCYAbM5W7!Q =@#S72P^F.D}w]BNR`} ٭)?{ eJџ7kd$ RSKSIH?/I*2Q^ 7ExNYNw(ixٗqzfc%^-S ,?ݙb?W/S%/"+-"/^i}jOW*]6o#moV qzn[':hMzӆ]+*ߴVp0W{)s(9刅9J${eul⁤H^]Q[Tn7V|r|bqA^IEܡPYk a RLjuedU1kTiBp?-~\ϠH+|bT/1͢w"s{I?D;jQ㍈)_!~wZU얾Xy.ZQלzx05ٸZuю2*~v ;j\K7}^OHCxxKØ J!=z'P7!0؊H7>ƯJ)IյFI9S^nФP.+{*ls @K *wKb+CB.SϿHMDs`xN|RKddp K bJ4GOn`tȸ&&ſ v*VwN] K= M*g-Ŧ)Vy9&'KܤPyd|aZr)\;"myZUNJK!3VfUn%@)6i)F)= GUvQƨ0s&Y1 .C0 (K\كeBՖ +׋̦Txe?EEFZ1ڬ*) ǎ;K s'ݬ "QA~UTnof+vy{\WDEnTo3@OK!1J!F<6*JJC[cn\i7+ˑZuMۨM*w-K(.+ 27*T60_pOK15R1&2,7RSksn[!a7+ɇKRuM!]M*M* .+2*w*T޷v X LTU[lErW1w𔮛heIQI,J&/&6_^VZ }Ν M i)*Fy=*)r\LErOU34ZksϩY)V\PxY,Q!.NE_*g%z9 ܓL]:5*e$ٻk;ZwSIr^Q#uOqyoNh!;KDIIp|[OP~]۩\SC7XjgK2%V5$f]\jm̉☗S/p2;ܫPydt`R;r{d)S=uv,n?>gܬtC.UrEG"ֵұ6V2L(y;粊N~üJ] HI-tUHFڜq0cGc{mf{Z0r%Z%Zڤr[rF5͸q*[ܬPydpJe+6QL)ˮ(:"Zk3 bnV',,OOյڤr{Xx♗*Q7p̬TxXL:vmuژjBj*ⱽAS fe{rܺjkg^z*8k*VMW6^RmP{26ZyQrrl| h=tc_z^b-AŘKڪr{[X|YnT!߬kJ٢{堵Y[w!ȸIL$ſۏ=7f' S$HU#UGYLJfe2q\vY&ܘ\8x]h( ԁ)7%\nO&sNX×w2nm#]}d{*"?aIBdڜIZ%AYup5%@5GT Υ]ֱk;ӺB!]-Xڂ%fB5t04'Ȉ1ݬRJLc ^,j 50ZhȢIKV qI);9QEϙU")_OG]_bm{]|J ^$RH Zc5 Զx_JbqNT*H1pݬRY@h֥ ]TTnK9(ypPʪwf\*j>oHZUIY)ƟU\F )kjm-˖eV&/e٫`uxZVIY#_a77* KAhե gmR-ٲlʵkBMXƭ e ^_/M +ŔIX!U\"]i pHFg-rkmE+'[c DJ6!8jxw}x9PliΞ+'4P.Qn^{p] *pxO>K?r TzeyGtJ'CT+4ZyO%}!}f5ccwH3`4B{0VRh7ux`5  49OYvXnGd|s/Zc{CKF{ꁅ[2h9EO(&8c][o*}scs\MW m1}݂6Pw'Ϝ!"hŽQF+yq^ nVq&-ZbBkA:!ԉSB_?>SXȊg\_>Y jNh3 =vVS'N ~4g([a#M ٦YMŝjPh#Q =vRKgˇ\ JG a}QBf51 wV0L3>+z1-r6h!e }*7CD7aaLWB'{L*zANbڴIB!ӯƗ0>KWXÅO턌jYMÝLu5O,d޸B Ϛ!f 2>hx݆gqK󗼭6jaw\04iӞ m恞4Vxuxm#9nV77!3y|Pꍏ\}ax%Uoήt^B;ꎅݡ.W4];`œW$BWL5ɭ!3ٕ~9OGn*A$퀝Q툽&)STo\oq5.Zf|; t;G!3-8s P޽AڄzsHzI,ח6Vdsըlh!Ci\ ֩c#+_e@EL $Bu!Z [kMUn5rA3^S@/lSGL䑢5)U\3 p!: MXlWFOb*Y2 *,dwKUͣgBi꺹왟quEs Ί]cP66.,GG'ڶ<Ս}Ts vw f!KBYyyО/{]y E&Y ϻ8i{en7 5]?'`|- !L~Z4鬿|O/W Y8.1do.<6MչmYߤԤ6:3ݠ㈬("<ƈ7;0L:7m?O[ݥZ`]K`Τ*zo #jȚ/?- Y߀]Jޞ@|X\j䴬ԯrCk7bq}lFB3o4[5hM^ˤ.*ߵ'ѹzXnx}ss%_E.&n_|@x~Koɣh^}UxTnb't|M5Oq}{Yews;;D7?4穝*񩳐3߯5kt <14hǯ ,@h x5_K@Ѥ}@E^HVHmx)/X$RZ/-maZH?rhY OI׵\ X  x$j7z5ǒuqHrhX JHץL X$ $rVyK񿑀I߈["? Oו< X*+K$n_3} h?TX5PH rPKt]$ H?cB/'𝿕tx$'xR1!$Hr`U g> ߋvX;!7y}b2~AQG@bw麘MA&~4aY0^O`__0Q{#N RaPt]< I tHοW䡚 Ho u$ [@H '5>f $Nޞb"H $K`P|n'LBH $0161/@H <6@H`zmRmW"$x>IoE"@H;nzM"$x+wcxkEH $pcE7r @H kӑ@H ܜțfkGH $B}@H Gh~U> C@H @˛r@Ha@H ߔ+$@'`*7H $K@yUg@H SbC@H @\$|!$x-M FH $v?CH $@H $@H $@H $@H $@?5tE\%Km$* |b>ΧSz̍8鄔nN@ =n҃iH1]` _<:& SG5A sO d/`Y?A A`n1Kr6hpS`Y?9?5ém1/K*5W]$%-Vuk޷Pp_zU{-R^+㯤5=f ˆ`_/*mvkflHHpR0N|M/j$or]/ sDV]|:A_ 6Z?@-i%P?|?@~ɰPF-Wyf+h"' ?*Q}2&TNnl~8 N?3K30EJ ?~=&bH`o`Y?s<ĞěO0bΦF:?3#grnb?c[19̽m[dﶨ;7\.OOGf؏6<3|2Ȉ[W痓ydwH-CGrt[䀝tq>I#_n__N#1 mvj1d'~eu~9GvG2~$GEة O4d?s9`&?cO{҈[W痓ydwH-CGrt[䀝tq>I#_n__N#1 mvj1d'BH }2ޓF|h!$tot,."@GRM΋0 $ oνE{0 $ |?a2X!7?x Xlq(E|b `\]ɤ[S!zo[gcCS f a7SG,^M@|Br1Sf,$ɈHT1ΞA%-SƪV4J 51^%9>ZuV oL%bB0VӎK7fjx\V9TPR|y4WhP Gӊ=ʒ/2KVM-IUGIWbL[GƓ D\M@>ũ[& ☪WRE&XDG=Gt8>L֪qHb2^!WY7ʖqYSW O"c l ^OCT2`jϖHL^LxPUvOaUu SB{,ѳe E eOT8Upھ^`>Z jQ4 tLkOwÕ>#%ڠ y./MkF<'L,f$ƛn'!% f'l2Tpu:g\ pp h4N{FoF} !ظEO*ff$}n'(!i.)7^/Q+€&-ܐ㨗įtS됥 لPnzpe.i͑YP\}g-ޞë"sXĄ*'`R+\#vTj["XQeʮrHJ;XT Հj`̿|da:j%HY)C'Ԃ懁I:rM"X-^K[eYOÀU|JcټGYf-%υ Hnq*҂VRegS#vJ N"tЮm1--ƱBO" #=8I֙Ƃ3OUy%-,X6[hM'  ȥ? pC+}O>u#Ҙ tu?KtԔI=Hlf> }-*5!dž]M3'@B7EQsh%ˆlahHc?)o@.i`ZI84 .at28M[LiY(i{LsR)oiG+㐾tH5fLUlVEj&i&C頄Q7 i@٨p0tgOtCޤdhh:JDI9DZ0ڸ +8Vb~t9a3Vp(b6"5@/Mi^S}83P)5 ĭln,q _iI&]USݟs9 e^;c1Q* sHi+أ-TsLc۔n85'V1}rUko;(J#'HtNc ;̹&u0gV"O+Gi&K3PM>$JM[,ٜ҂=6[5O ĉOʬiUGuÈHǴӀN_rɦrԭCX- 0!Bk3_cr#Z N[%j0DIR<5@4vz)5 Wժc[ui$=ah//D"kR:D 4fPЅ 1~f8K#`bav (Qˤޓ6Kt]ۧfNo j:[zlAml]#ڌQH$6|Oʟð(@w7VD~-CvGx_F/0?Mge3 smBGvL)/CE)5 W*cl^mk1&t2<(2Ó!5&ԄG" WwBbw@93E@&Xnn5W辋; Py (T@ @ H1@u -3ό1h@'S g4Czt 49AKն6r 5fOLś`߻t9 xSBRf6V蠋7 s2$VO^sklTC >NEgޱ1OTgH=ʌ1 ޯ& r)y|$+z؆a\[FDi1EPKXxEŋTW[ouS|Z*^R"|Au*ǩl;WCɖJRg O3x#tvEA7{xeC%=qMxZn bhւ-vO(>=]7 k2V6n*4$79)!uǪL!qZ!]"joUnѦ!:&PyOw{ӳ paRj@USF]nivpZMۍ,=?E| Rt *rsK<1Y夤Mg:)8v·Lq!o2U?g q"P^o~vFtHP9 S1A(nґ$ekBeS9_rv|7N!22J\EݮWG"kTr{WRmchaH )U!i=Q5|?TRRTӍ6S%:O3װ@]oA5ygJ8ǥQlTl[3|Bo6mA9 R( R@kPjV˷nybu)B,Oj%<t$"(IX@*$-NҊMv$z>nWd,i1J./}O^~f$쬓Q.02xxksƷ؆.9 =A4֣.TW۴)tTPF{½gDK"xg\E{hVOM>S= YsRpAc\ 5{٘d2^>qF]X5B(K]\Kp.QԥpOZצ[1G쇊9e!+b(% fϘ5QͬZUǼ4x6Ky"9C:*y?4"CI!+TUǼTQru638f΁)YX|,rYlf [7`xo䪍@fxJHXx"-="jRN-ڱg Y9 ml ](QUpȼh3>,e(V9Qr'F#3kS`J9&/۠%OHr3˫,~5öl ? yzxLu\~uz#kZ`Erl|Qw<20{(RQr/ ".fp(xИLQ ґU5#wB#]z%J^B=O$Jص0)(+6Wтp,-kY\v#jCrXùErv*uTm&bLF(d0k@P0QCJ )]38ToKkyH>N^))^'mw5ݺ!c糓PwS0cF!m X>ZqeuUiRY-rvWsE|^ Fydǘ{(ْsW0LYeFɅ37!5'e=SSΔB *t^}3ᎃ5]+\aT>/XTr}N6s3fc` , X*akQV8X Jy"ybs+)Z(yϳ S:Kgg#&hW {]96M6&uh!5Ƨ90 P T,F{һ9}XCE7n ˿AFzO.chCNMϔNifO.Ǝt9P.pɦO~t:4s20Ӝ Tjuu쮥ӳŻ.RG핾qAf.dʩ- SI >L 4~zpJ\p;ؑn5ץc.iÏn^fN\&|ZJ`0VUnD@Ss)J߸C/NBW$7 I'^H'5aM&gNb .nmHU̱ lG7aC;'A. ּK=OxO`X'`.RG핾qV 1 %>,h<3b]; u~ءn9*lsoE *}𣛰ס`!OkG݀h Xgƻn|dYNJy"V[-O&P$g:!cIFzr#rM=e"sqB\Dt* [Dڄ,9;07k6Rߓ6yk aB ?]ȯ+}j cJ,Y =嘱0rUIL(9?'W.P\-Jp;r]"|{rb9gk Ou)-t9=/繋Q{oܡBm~>C %RB> 䏲)3dBU͜,_2>躚uY%uQu*5kSW(٪%2m&dɆ) qPgûj3#r|_s)J߸Cڂ} ं|UWd,;9u]ep}.]:H R'Aӫ5Nl6Gxi؄,9;= t.=gMs̳9]yJS}hQ:h.R},j cnJH Wa\['8\3 DT]dP٭7 p;Vr\"xmBlѝDbf`L< m-cS:┦b?]$9^|g'r* 9Ы5N~R[( δtQ9f5͙1.:%2m&dɆ)C$0,a: ֬Mh ֒x6C֔)d&LP*Jqp46*:O&ߝN^3a?z)Oj}&3J.u3m?>i@ssDYMsfANg#Y YsGrסjn41P'hXT` Li+Uj.j ?NglTtL;iDMLQJ{_5QrLOʄb|fd`ԅ ||SW9Ud˗|9Ÿ?'~t)'@|Qݘd~)y6&z]uέY]#j#+!ަqvhAus+̳idBnHz%~;KF8axA`ňR|䑬 |8U(L( ԧU0J.ԆSB=cz8Iq8ez;Kzj=Slݣ}GoU !@I` h%sͦTw);4.:MsC; SKv.[p 5)T!)wEz {nB+ *380JES0AKHqHA%߮u_)j{-*']~fxᕚB87xۙ#MuځλeR_m*wՍϒbRoT_-'FcWJMxgPFg +c SmO<! ]{,is7yl+RKL%zMc=֣\蔶#~dVp~! _![:+Α<m+|Sb(Ez^En_^rL~)N"F;ZfOemNx>|O`,Bج;AuaZ'~N8[;JF׽H ))ҚL!½d mT0T*Q%%^ e8R,h#] q06D!Z".2Vo ".&v;2! yQuqh"h$gگyEM(r$ W'}hJ:0VE#u{w&|B<˻#%~+-/'ࢵUZhBҡnqRg.|ZY|Z:p.n oka(n5mi!~jt\ r§?F8#k02m;A+k/H+N;bq^D\]XGF)7JV`u V(H{o&"Bo D)V D+18 M!ͩ)`ݽ.h ѝUq5ɝӕ5{L$Y╊S*Ռͬ\|z'_ S"ϣTh"o~:(!Մ ̩ 3SȢgt*QB9MfFкG+goVhz#l&wů˱0RI jy"d2>o*J Ϧ9D|Tj@rە .\u F3seiʅTp`0d㋓l5'"paOV@ެFشM}] _/`'c b≈b5㼴f0mT3*]rWP /(ʹ@oGʍު!L*~Va^`)2Qhc 8Ćww/_! >]VBN8J;3s@U!ϵHHWV45֨fv, 1`T)G=lId{"]Ht-б$V [ &>hG,WDT-˟2ft5&^sb:1'e 濦p6v ƁYmjyiхH;9(t=jvieH!Sڊ"n ґz?JZ=# WbG(FA O9 @ϻͩ&!6{ \b=bī GLi&O x-Pa-DF Sog~cBtkޏdVՄ-Ƒ MaF_)x>:aل,|l|oRw,>ew¯iRV]p1T%Jt "B%o1&)KId2 Z50;֓!*e/1%Yr!6| >`*q%JEM^/x2')3Λk9 AS:!t*dT!A:ҵ@G 3X##j`w' a3l6G!6| X$>` +{y%#4xUea9QqDY,UL`O)KIhzV!Q7[>"jH'(;4XOXfd? 6KVkLJ8:yNENְW pČ v@֨}Șj=㼵kV*tQo}t,uB&ɬA5]3סsqg@*!5N {LxOzJ;/Y{)h&2Ζ 6K{<'t Ȍ.S-F,G9S tdT IB .Jù3!ηjL? lQl' PU""#ZQ EkNiOtRKusҍ8ҵJ;`_-JkQ[ȬA5Iuגj::p.. ]/~}.4VrNczr P2]69է>Aff Dyԡc]wCm'3iH ' YˢPJù3vB6gfŻM)3ޓ۵-Q Ry9b&4b6˦:4jg#,CU4SZҎMvN}f.28Ȟb=+|vδYiѮ,o{8_t 1V!(ӎ|J[e"D]+qܛJB`[AeJ+{y,Q['^,%9 סsqπ?h#%fb]E&$3=:6X^ [Pl-$h؄055@.VqUZdNVUʫe"W*% N?=4P<ϢMt5q+lu qj-n=|:ˆ](f]ITfs=S,zfT!$b3&#֯4v Md&orlYh$ȴJ0y(#Xe'ި &׆tYG7aC⪟hqɦz]AS2{yHuPՙw@p-#\4Шn gq(ӪA3Q"K8ERPƶ{jd E.h$qu+H / |Zbe\y9&fn]jgs+$[FV9{jju4U+{-OX/7WdŠ*%>CaF`$QsˆU /h$} LJN;Hn6g{zg#|QNSA˅-GHtdMJnh(-m\.(2?Cf>OHaReQ9'tP8~Yj>Gù}:]q/Q29'ɸWB;!Od.>Tipʰ kAV v| sv*ӤH(@:2u&PBp, :JPsŠETt{;aC}:kQdzN☲R NR.MT2\{#;dNuClo)2U({y%-?Gv֎I@jZ*\鳇#opLS^FK'YAB5N*‘sE괐U]7Kx%bnm%L\YNةrtȤZHbuh!!ف";#v6V-S- 84UC2=U9A$qиȹfPN mBU/UuR`k%vbZb,gЯMWLXq^7-(w9Ueϣ\e^ g\9W˻ s?uvWF7͕ l'PUL=jzKx*25fP.$.SA]e.l"`lN4-~sJ!2ׂ$ 毷cFIoJ~*mR88IJpj'sE y1zkZ=(x;1|\]IEVVҥ@|7Y4caL[iy"].t5/ #5H $-5Wm xY"$]. |I("$7]rI("$W]* +r((!$w]*RK;p *H $4edN+@H /N@{b 4H $=u]@ $@@P!8"$]wH $߈"T $' ߟ6@H $P%N0.H $@뮷 H $HoE#¸"$ ^_/d@H ފEeqGH $7`߈[ $  @H$@^z׿@H $ &j,"H $PkR*H $Z_&:@H ?@u@H 8 4+%@H ʿ8BH $O@~]@"$@H $@H $@H $@H $@H $@H $@H $@H $@H $@H $@H $@H $@H $@H $@H`R޳ endstream endobj 35 0 obj 26483 endobj 43 0 obj << /Length 44 0 R /Type /XObject /Subtype /Image /Width 202 /Height 60 /ColorSpace /DeviceGray /Interpolate true /BitsPerComponent 8 /Filter /FlateDecode >> stream xXyPUU?(J*f ``P@ehepiQP --Dp_'rԬl-7pI2Ss!Jv}}Ofs;;ws92 <2xڸCĻGH#w{zesYԟzY!Sq= s"ewf'\KmpDNh5wm~GkLaZ̕6Yu2Cc0):Z!ghjdM _h'eGЫ̸"+ƎRkr\l|[8t8{KRg fyFءNVG1逰K1P:&'FҟB;FOKH@P v΃׹Hm?D9}"8,r[ 4$wE)|- lNV(ۤ]tG e+uN;[dIފ')#ɕx :^o/"=NQ!&EҴ$g*juvy0 ˯JJRcrMJs?͏ MjlwF HnX Ojʤ 4dcP E9\O#c)lI G` QMZţsv2։df"yxOҜU>V;_})`h@xH6 Abt!ا+jL"rQ叢|B[2|D5TBxw؛$+?$L2NÐ&saߍui7Pq"P 鵛bv*Ǥ \3E[or'2YS#Œu`AJ;^ =5^y0_aW)=15}Upalc%b]+3As*=J4,tv* =5Ƹ&c$)@)ҴُWA  PiQo.pMqqHGj!ay[MHTj jS ,K nQݽ%ڳa%LKV- !|"C-(q T\u" ^nb _i~F+ڇEY(2!)q(g$3ǰcs璼R4k,e9w|&\4qk+lH= Ͳғ+?Vtn]FPK#'[_B: endstream endobj 44 0 obj 2056 endobj 30 0 obj << /Type /ExtGState /AAPL:AA false >> endobj 31 0 obj << /Type /ExtGState /AAPL:AA true >> endobj 48 0 obj << /Length 49 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xUoT>oR? XGůUS[IJ*$:7鶪O{7@Hkk?<kktq݋m6nƶد-mR;`zv x#=\% oYRڱ#&?>ҹЪn_;j;$}*}+(}'}/LtY"$].9⦅%{_a݊]hk5'SN{<_ t jM{-4%TńtY۟R6#v\喊x:'HO3^&0::m,L%3:qVE t]~Iv6Wٯ) |ʸ2]G4(6w‹$"AEv m[D;Vh[}چN|3HS:KtxU'D;77;_"e?Yqx endstream endobj 49 0 obj 1047 endobj 7 0 obj [ /ICCBased 48 0 R ] endobj 50 0 obj << /Length 51 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xwTl/]"e齷.H& KYe7D"V$(bh(+X "J F;'Nw>}w(!a@P"f'0D6p(h@_63u_ -Z[3C+K;?r!YLD)c#c1 ʪ2N|bO h{yIHD.VV>RV:|{ [RF ”"MF1L1[Te'Jx%C%_%RJ#4GcӸu:(G73%Ie%e{SC add1T4UT*TTTUzUUUoScemUkS{Q7UPWߣ~A}b}9Հ5L5"5iјi<9Ъ:5MvhWh~Tfz1U.椎NTgNΌ|ݵͺHz,T NI}mPw ,tӆF -5j4oL50^l\k|g24mr6u0M713fͱBZA EEŰ%2res+}VV(٬Ԗk[c{Îjgʮ=~mCNNb&q'}d]N,:+Uʺuv^|o]5˟[7wM׍mȝ}CǃQSϓY9eu빷ػ{^>*}7l6 8`k`f 7!p2)hEPW0%8*:Qi8# z<ἶ0-AQ#p5#m"GvGѢG.7xt~g|LbLCtOlyPU܊|BLB}&:$%Zh`EꋲJO$O&&N~ rRSvLrgIsKۖ6^>!` /22fLge̜͊j&d'g* 3]9Z99"3Qhh'\(wanLHyy5yoc( z.ٴdloaqu.Yf WB+SVv[UjtCkHk2zmWbuj.Y￾HH\4uލ6W|ĺ})76T}39usocٞ---zl=TX|d[ fEqūI/WWA!1TRվS疝ӫox4صin={j-n`[k k+x\S-ۆzEjpjh8qn6Ik:8w7ޜw[nn?uݼ3V/~ڟM~nr:53(ѽȳ_ry?ZrL{퓓~מ.x:LlfW_w=7~oLM˃_uNO=|zfڛCoYož_Cggg endstream endobj 51 0 obj 2615 endobj 36 0 obj [ /ICCBased 50 0 R ] endobj 52 0 obj << /Length 53 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xUoT>oR? XGůUS[IJ*$:7鶪O{7@Hkk?<kktq݋m6nƶد-mR;`zv x#=\% oYRڱ#&?>ҹЪn_;j;$}*}+(}'}/LtY"$].9⦅%{_a݊]hk5'SN{<_ t jM{-4%TńtY۟R6#v\喊x:'HO3^&0::m,L%3:qVE t]~Iv6Wٯ) |ʸ2]G4(6w‹$"AEv m[D;Vh[}چN|3HS:KtxU'D;77;_"e?Yqx endstream endobj 53 0 obj 1047 endobj 39 0 obj [ /ICCBased 52 0 R ] endobj 54 0 obj << /Length 55 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xwTl/]"e齷.H& KYe7D"V$(bh(+X "J F;'Nw>}w(!a@P"f'0D6p(h@_63u_ -Z[3C+K;?r!YLD)c#c1 ʪ2N|bO h{yIHD.VV>RV:|{ [RF ”"MF1L1[Te'Jx%C%_%RJ#4GcӸu:(G73%Ie%e{SC add1T4UT*TTTUzUUUoScemUkS{Q7UPWߣ~A}b}9Հ5L5"5iјi<9Ъ:5MvhWh~Tfz1U.椎NTgNΌ|ݵͺHz,T NI}mPw ,tӆF -5j4oL50^l\k|g24mr6u0M713fͱBZA EEŰ%2res+}VV(٬Ԗk[c{Îjgʮ=~mCNNb&q'}d]N,:+Uʺuv^|o]5˟[7wM׍mȝ}CǃQSϓY9eu빷ػ{^>*}7l6 8`k`f 7!p2)hEPW0%8*:Qi8# z<ἶ0-AQ#p5#m"GvGѢG.7xt~g|LbLCtOlyPU܊|BLB}&:$%Zh`EꋲJO$O&&N~ rRSvLrgIsKۖ6^>!` /22fLge̜͊j&d'g* 3]9Z99"3Qhh'\(wanLHyy5yoc( z.ٴdloaqu.Yf WB+SVv[UjtCkHk2zmWbuj.Y￾HH\4uލ6W|ĺ})76T}39usocٞ---zl=TX|d[ fEqūI/WWA!1TRվS疝ӫox4صin={j-n`[k k+x\S-ۆzEjpjh8qn6Ik:8w7ޜw[nn?uݼ3V/~ڟM~nr:53(ѽȳ_ry?ZrL{퓓~מ.x:LlfW_w=7~oLM˃_uNO=|zfڛCoYož_Cggg endstream endobj 55 0 obj 2615 endobj 33 0 obj [ /ICCBased 54 0 R ] endobj 56 0 obj << /Length 57 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xwTl/]"e齷.H& KYe7D"V$(bh(+X "J F;'Nw>}w(!a@P"f'0D6p(h@_63u_ -Z[3C+K;?r!YLD)c#c1 ʪ2N|bO h{yIHD.VV>RV:|{ [RF ”"MF1L1[Te'Jx%C%_%RJ#4GcӸu:(G73%Ie%e{SC add1T4UT*TTTUzUUUoScemUkS{Q7UPWߣ~A}b}9Հ5L5"5iјi<9Ъ:5MvhWh~Tfz1U.椎NTgNΌ|ݵͺHz,T NI}mPw ,tӆF -5j4oL50^l\k|g24mr6u0M713fͱBZA EEŰ%2res+}VV(٬Ԗk[c{Îjgʮ=~mCNNb&q'}d]N,:+Uʺuv^|o]5˟[7wM׍mȝ}CǃQSϓY9eu빷ػ{^>*}7l6 8`k`f 7!p2)hEPW0%8*:Qi8# z<ἶ0-AQ#p5#m"GvGѢG.7xt~g|LbLCtOlyPU܊|BLB}&:$%Zh`EꋲJO$O&&N~ rRSvLrgIsKۖ6^>!` /22fLge̜͊j&d'g* 3]9Z99"3Qhh'\(wanLHyy5yoc( z.ٴdloaqu.Yf WB+SVv[UjtCkHk2zmWbuj.Y￾HH\4uލ6W|ĺ})76T}39usocٞ---zl=TX|d[ fEqūI/WWA!1TRվS疝ӫox4صin={j-n`[k k+x\S-ۆzEjpjh8qn6Ik:8w7ޜw[nn?uݼ3V/~ڟM~nr:53(ѽȳ_ry?ZrL{퓓~מ.x:LlfW_w=7~oLM˃_uNO=|zfڛCoYož_Cggg endstream endobj 57 0 obj 2615 endobj 42 0 obj [ /ICCBased 56 0 R ] endobj 58 0 obj << /Length 59 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xwTSϽ7" %z ;HQIP&vDF)VdTG"cE b PQDE݌k 5ޚYg}׺PtX4X\XffGD=HƳ.d,P&s"7C$ E6<~&S2)212 "įl+ɘ&Y4Pޚ%ᣌ\%g|eTI(L0_&l2E9r9hxgIbטifSb1+MxL 0oE%YmhYh~S=zU&ϞAYl/$ZUm@O ޜl^ ' lsk.+7oʿ9V;?#I3eE妧KD d9i,UQ h A1vjpԁzN6p\W p G@ K0ށiABZyCAP8C@&*CP=#t] 4}a ٰ;GDxJ>,_“@FXDBX$!k"EHqaYbVabJ0՘cVL6f3bձX'?v 6-V``[a;p~\2n5׌ &x*sb|! ߏƿ' Zk! $l$T4QOt"y\b)AI&NI$R$)TIj"]&=&!:dGrY@^O$ _%?P(&OJEBN9J@y@yCR nXZOD}J}/G3ɭk{%Oחw_.'_!JQ@SVF=IEbbbb5Q%O@%!BӥyҸM:e0G7ӓ e%e[(R0`3R46i^)*n*|"fLUo՝mO0j&jajj.ϧwϝ_4갺zj=U45nɚ4ǴhZ ZZ^0Tf%9->ݫ=cXgN].[7A\SwBOK/X/_Q>QG[ `Aaac#*Z;8cq>[&IIMST`ϴ kh&45ǢYYF֠9<|y+ =X_,,S-,Y)YXmĚk]c}džjcΦ浭-v};]N"&1=xtv(}'{'IߝY) Σ -rqr.d._xpUەZM׍vm=+KGǔ ^WWbj>:>>>v}/avO8 FV> 2 u/_$\BCv< 5 ]s.,4&yUx~xw-bEDCĻHGKwFGEGME{EEKX,YFZ ={$vrK .3\rϮ_Yq*©L_wד+]eD]cIIIOAu_䩔)3ѩiB%a+]3='/40CiU@ёL(sYfLH$%Y jgGeQn~5f5wugv5k֮\۹Nw]m mHFˍenQQ`hBBQ-[lllfjۗ"^bO%ܒY}WwvwXbY^Ю]WVa[q`id2JjGէ{׿m>PkAma꺿g_DHGGu;776ƱqoC{P38!9 ҝˁ^r۽Ug9];}}_~imp㭎}]/}.{^=}^?z8hc' O*?f`ϳgC/Oϩ+FFGGόzˌㅿ)ѫ~wgbk?Jި9mdwi獵ޫ?cǑOO?w| x&mf endstream endobj 59 0 obj 2612 endobj 8 0 obj [ /ICCBased 58 0 R ] endobj 60 0 obj << /Length 61 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xwTSϽ7" %z ;HQIP&vDF)VdTG"cE b PQDE݌k 5ޚYg}׺PtX4X\XffGD=HƳ.d,P&s"7C$ E6<~&S2)212 "įl+ɘ&Y4Pޚ%ᣌ\%g|eTI(L0_&l2E9r9hxgIbטifSb1+MxL 0oE%YmhYh~S=zU&ϞAYl/$ZUm@O ޜl^ ' lsk.+7oʿ9V;?#I3eE妧KD d9i,UQ h A1vjpԁzN6p\W p G@ K0ށiABZyCAP8C@&*CP=#t] 4}a ٰ;GDxJ>,_“@FXDBX$!k"EHqaYbVabJ0՘cVL6f3bձX'?v 6-V``[a;p~\2n5׌ &x*sb|! ߏƿ' Zk! $l$T4QOt"y\b)AI&NI$R$)TIj"]&=&!:dGrY@^O$ _%?P(&OJEBN9J@y@yCR nXZOD}J}/G3ɭk{%Oחw_.'_!JQ@SVF=IEbbbb5Q%O@%!BӥyҸM:e0G7ӓ e%e[(R0`3R46i^)*n*|"fLUo՝mO0j&jajj.ϧwϝ_4갺zj=U45nɚ4ǴhZ ZZ^0Tf%9->ݫ=cXgN].[7A\SwBOK/X/_Q>QG[ `Aaac#*Z;8cq>[&IIMST`ϴ kh&45ǢYYF֠9<|y+ =X_,,S-,Y)YXmĚk]c}džjcΦ浭-v};]N"&1=xtv(}'{'IߝY) Σ -rqr.d._xpUەZM׍vm=+KGǔ ^WWbj>:>>>v}/avO8 FV> 2 u/_$\BCv< 5 ]s.,4&yUx~xw-bEDCĻHGKwFGEGME{EEKX,YFZ ={$vrK .3\rϮ_Yq*©L_wד+]eD]cIIIOAu_䩔)3ѩiB%a+]3='/40CiU@ёL(sYfLH$%Y jgGeQn~5f5wugv5k֮\۹Nw]m mHFˍenQQ`hBBQ-[lllfjۗ"^bO%ܒY}WwvwXbY^Ю]WVa[q`id2JjGէ{׿m>PkAma꺿g_DHGGu;776ƱqoC{P38!9 ҝˁ^r۽Ug9];}}_~imp㭎}]/}.{^=}^?z8hc' O*?f`ϳgC/Oϩ+FFGGόzˌㅿ)ѫ~wgbk?Jި9mdwi獵ޫ?cǑOO?w| x&mf endstream endobj 61 0 obj 2612 endobj 32 0 obj [ /ICCBased 60 0 R ] endobj 62 0 obj << /Length 63 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xwTl/]"e齷.H& KYe7D"V$(bh(+X "J F;'Nw>}w(!a@P"f'0D6p(h@_63u_ -Z[3C+K;?r!YLD)c#c1 ʪ2N|bO h{yIHD.VV>RV:|{ [RF ”"MF1L1[Te'Jx%C%_%RJ#4GcӸu:(G73%Ie%e{SC add1T4UT*TTTUzUUUoScemUkS{Q7UPWߣ~A}b}9Հ5L5"5iјi<9Ъ:5MvhWh~Tfz1U.椎NTgNΌ|ݵͺHz,T NI}mPw ,tӆF -5j4oL50^l\k|g24mr6u0M713fͱBZA EEŰ%2res+}VV(٬Ԗk[c{Îjgʮ=~mCNNb&q'}d]N,:+Uʺuv^|o]5˟[7wM׍mȝ}CǃQSϓY9eu빷ػ{^>*}7l6 8`k`f 7!p2)hEPW0%8*:Qi8# z<ἶ0-AQ#p5#m"GvGѢG.7xt~g|LbLCtOlyPU܊|BLB}&:$%Zh`EꋲJO$O&&N~ rRSvLrgIsKۖ6^>!` /22fLge̜͊j&d'g* 3]9Z99"3Qhh'\(wanLHyy5yoc( z.ٴdloaqu.Yf WB+SVv[UjtCkHk2zmWbuj.Y￾HH\4uލ6W|ĺ})76T}39usocٞ---zl=TX|d[ fEqūI/WWA!1TRվS疝ӫox4صin={j-n`[k k+x\S-ۆzEjpjh8qn6Ik:8w7ޜw[nn?uݼ3V/~ڟM~nr:53(ѽȳ_ry?ZrL{퓓~מ.x:LlfW_w=7~oLM˃_uNO=|zfڛCoYož_Cggg endstream endobj 63 0 obj 2615 endobj 45 0 obj [ /ICCBased 62 0 R ] endobj 65 0 obj << /Length 66 0 R /Filter /FlateDecode >> stream x]ے}(\[_KQ4M[hlHȒGS-{@D0b#r{ШD"H$Pտ7fڮ}SC_U~UMS_ߛ+<4t mx}Wpuv?h . ~o5?75-0jͰꫛڷCVuk77um:@m{ɶvk[`rxm_W  18[8$]ICcI'Di"H*0fT yo(UT Lf-%4aC*Wڪ40Nx (O S!Gr@ cG*#*#%bI8 B"B(2,P#,L8UMm頴J`cgg(NclώQ>W_36P՘F1ZYC^Q cWJyea^vJ/rNL~JLĄrAnF)TH(}R3SUsY!R%=ao(rPItBJ Xyuk%͉Y 9CApI%LtsR eU~|e no(&8_9['!])}_. X+[ihʍX,? {hѻ򡢰\i*lUj͚# "YJLDO(cK†e>jl2bmj clc.L2KӔLN[ TB8QG( q4-Cl87S)ŮJF7|je0:)ٷ;|3E/ૐR(ڂ.OHmL Nȸ.UX8HqR.:];\H|0Ztt"x:>5̠Z3/袟[[C 3|AI( n޴$_ C@NЬq͊۲Ep4ZnfmBs*ugQ-C7?V)x2%VqEiVcg{bԓ$]Y<^vAF7awÿp`[ݹIRcN3KF:]H^?I2HB !5,աiz7D#f:~bjzNWE[H3GIZ&ᖞl#Tt(nYv r  |JT((;vB18#ńpI媸$al.! С2<UN 0sLWdz\̸̌D'J%AG S$G~b\3A<|t[4~AHCWÝ1?4!>򱎭*Q&`:TI\mvlP5_ꬔ Ny)th^MJE!D,."K&"k]1x릜MK"Lg>fI63 xGas1Tm'5 vǐej9#6S1F4cA.#Ql}q-_Ӵ l]+.dB7 EbRUz bBe%8-%JUa|Z Y:B9.u4wDOMGk(OSMg} }# ]4;f¾_P=%m6t)2v냬zY۟=amuvvf6r@@ٟ=amloNfoOJ~߬Fϯ+'a?R8o"چ&0$K`t*j T940-QETPDmvq@r۟n,ԋSd=T)Vbl +@*PLmֻݡ ҇?bh Vɵ'~ bȴތ nc$LBo'M7WBkw9k1A}udd\R2ZF'9HJI\$X qQ"6bgf.N](Ϛ,S\lo&٫ ")o&k\w⊻J 34=W\EuMg(nShQ51EHSc$CDC0 MKq2_-۾Yߧ A38m2,(uCtLL6wsZh],qғfeăi6m\Sd4-Mt?`wjlK-9p5QnfuA7 IiԆtiIщeDϣ.s w5,Sw$\1K7&:u͆˘q"w 1@Q~P~Nޜ]+Eh uŌeL>FВ+~4Ӯ *I$m"jG[l/ߊ,DB  #d|.1XE]㓓| j+P@*|~CE܄3,+'c|[%Mg5xe=9zglߟ:ޗ*+;nfވ7~XXop%l$݃cG(pnnN WM-,)*_N1œ:dX>HW$еAH{2i5~zy3USjL#dU`1M8kh.ˤR濘&*!(~@ɚllҒW5ܙ|64ڡ}fGyvmن-Jszl5m!߰u1Cv׺!`_{vF4h8ַՁ vs#v?Gyl 8!wH(b9D4-EhȦeZ<Nbl?dylŒ1p<x˄"?y~8ْY!rJO:~1Ҹн4P)GZTmD`SwxbL9|"Ȉ~4X7Ȉ#[D"ZvsX3LDF1ZfDdMp˹he҉E(&;q$1ˌ#Vg M9ңN2ӑ[p|(߬D!N'F H"˓vtTj!|2ߌrX- 2W :Fv  c(^kiz f%긻Q39X K(OofbYvze0|F/ 32j .KM?O[0hץU}lׁSBi]#%Ҕ9&I$rJlחt1~vSeg$mc I+9>X"*A(D wW@`8ө6r V<N2CW_i#%&Ρ~E<)FsީR /[T2PI v҄j"XWS"TS/Ahz384e`k̿iHLD=_μhpᰶ84uqZʥA|\h 5|MOB*P9k@00;^xFJ6[=A7/,rbI͏Bݴ mƣ-@e#Q  w[!Ql..ל#"l þ9*+upw *G@8 (s̎ wk;gREDFի9p0XdW) bAVE0U|SoT<X( xؒPݕYA5s:O<+Rj,Ob_!+4}CB t6SDlB"zwZu4/1/ +c”K:D?sה@*(tu'*ZBe;18xqGѣnp;"{* >REPCY"h>+]ݵTLԙ@Կ-6ȴ.@ 0p6<ֹp^er;) jMʐfcK.Hvվ t|$yNNF(mzERVEQEɏ.AҾV܇>ЃP =$8 ׶vd[bKolvd0Vװ uX293d_ NDn5 ~ :;NA5FetTF*9.7q!Xix-֥YF+ZD1mT,q$s`JEn0Up Bj}-XOݨԸ!,m$4#Ό[l|ddtTiE yo(s)ohh=h. B.t烾HQjjdiHA҈nщJ2⅊ۤp4S"v\\a\Kẑ\g..T RH V\ȩmb.I46.xBJ)DBM>Bh*4*H!c YHu!6)Zd$Bi(\ì"祬dwm}\,|m};J#7F'E[̨cAP }9/A4C=r_ 0CP\8{oh7l0BcPnA@4"_'- 82L~e`y'UlEY*9EGM%@1,KJM) 'wQVQWRaQXՅOx!p,R(ꄙDdA06RZ݀13Y2T%$4B%IZXjn5ՠ视 ) *=Q]{䣰%dD}S;+ zw{:MTH&P.D,jwؠUD^eGa+̤t 傠t 8BGݒ:-~ԓX,G)$ktE&%u~(55ř s+ģf"YR4]3N!%a ?-A‹\]zS7T1< 7̘U328l @23s!ؘ9@:&xF"߄AJE' b^%Be:OM,:O@⹼XYG*iDDn3(Dp H؄gʰS<O Jco;%pQC$iEm Fd*ot̏/0rka_( oV1OL}R#TYn&#>w;*~yyjk ||r``xA@{_Ag/6pnfTc1 7t\9{qqA !_Vt̾gT͞ڐ: ^›Jc1Y^̸5/ 4 =)>qb;p-S`c:tE[ƘYwɋc|7EO |RJ]~ 1EQ1˥zd˄AiN6E:&lfaPp&b5 ~)k%2XG*@RbflLWW'gT#&vZ 7-yc2Ô%HOD#pԒO'L@_GRXL@!pWcir,ݶ8+ R߸5׉fV#3HVp\j4{OR3}Ԍ~ ^_h)1! J/ʥQDDzMt/¶&- 13ٌԴO@6BK1`%d-A@< m gJZ>.uqQHƺ`TnL7ı B`]Ė`I&/)F 5!'{?j0w,$!t6#̊pGF]9Kw7n\z $2N S ɭ_12't5Ღ;ɭR-qIIe-*2G;&UfbZ.)J?Z+JBjsa!;=I>c*VXv.3= +RX'6I\~r#A⢓v^r˿0il;j\^[MGMш#}c\Ko ʣdw]M^XIS~KCAL|^oa8ж{pϖra6n#G;ae%y\mrFN`T,Z"&6a7jsE6|bֹ3%ݩ#dt1^zSN;+-IJ}J|TNοeFںgUa2!.eoah{۹Jw4>f+P+"uyU/yWyK lI+z6-vV~zx\o@Q;p<jQlV89}~7,#LE Wbkz0O&!qy4^\$[ly^&\7ȫ3VCXdid N@3ϺxrLFKc$'N/7! B%fN~%NJ ?;Q}ݏ0Oxvt}p=p 8&*CcF)]D&tltq.AL-uJ_|< -: #@/&,v㺓%Q%nm,">R{RpcK4c2(gKĥn)/|%J5Ԓi DGp 9ճunR"@Ge'n&GjI~Dz& b3.jJ~8cyCN_lN"܇jUQp>柆x"TX<$H+r?1Q>pA~"YU~1ONv~]d8D,ɸdVQEwOFN{4#̒"TnUxgViz=ޙg|jqaypK ;Gdqg-I5M%Z`u'ffC ,:e~}b^09E nqܘ}wh[PxJ2$ԛs햒!"g]30{3f;vkI5dRP>Ǝ=H#6&0]z$tC8<. PTͯmQr;5>:FBTcTIB[Tu4/ǻ7m=7=FtO8.}x?]тmo #ΝW"ŭPѷ1mw'|h8^GPU~@0CmmQlXp!JEn=B,,eZ , IpCϠkVI& ou^59hpC-޸9\t6P3@-nhخL R( \ydl{w yF?A&45Sqr${0nM=_> endobj 67 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs2 8 0 R /Cs1 7 0 R >> /ExtGState << /Gs1 30 0 R /Gs2 31 0 R >> /Font << /G1 23 0 R /TT6 22 0 R /TT10 69 0 R /TT1 9 0 R /TT2 10 0 R /TT4 20 0 R /TT9 68 0 R /TT11 70 0 R >> >> endobj 3 0 obj << /Type /Pages /MediaBox [0 0 720 540] /Count 2 /Kids [ 2 0 R 64 0 R ] >> endobj 71 0 obj << /Type /Catalog /Pages 3 0 R /Version /1.4 >> endobj 20 0 obj << /Type /Font /Subtype /TrueType /BaseFont /CMGNJP+Wingdings-Regular /FontDescriptor 72 0 R /ToUnicode 73 0 R /FirstChar 33 /LastChar 34 /Widths [ 891 786 ] >> endobj 73 0 obj << /Length 74 0 R /Filter /FlateDecode >> stream x]n D|CK/JɇU~Aa|wVZ3o`X~_z2&֤Fgm鼟g-B0A% &x,[2u21~>Cä{Uf^ސvEjD4&'di\$Co=0Z}S?`i> endobj 75 0 obj << /Length 76 0 R /Length1 4108 /Filter /FlateDecode >> stream xW}pT?M6&$eѼ噀d %.Iv aQv7  "DAMh%uFT-A ӡ؎eF-kq*ц ڿNν{6rR7 oY$\ ܲef!"i5m%jMǶնZmfoj_yYٱePoC loC mAAA9m7CCA@_>} m҇m8hK6Eֆ6fC 1G?BOCoABAn֕:rsl^IS{n%QIv(JMIT+dDI)ިNV'j.5SuiʪrT2&!jf!d }>ҚV^͌V%5hixţn#&|{t{#+ϫWq *dsHA;k@)xޤMޤ-`G<@`;~f&pJHJxzDݞHu"7S}\$vK"S62&oBB3$1B(Pyqv`<;Ki=YO͙LQ ~KqOC[OQCz 4LegуZ'13Ǒ=Bk>kC?eEna 7GA'$*<@{=Fg̻PE6 >g#^Fu!}D`% أu#grƪbVZ:FŞ@\Qu#O Js9J0R f۩#f! 㬉-eI֏9 w`M:yȰLyVQ["&FEt X0Ft%=B{+{sL:KEN5Umg;=Wn `1wm{{;( a6 »»b/ω$&JȹrWq(딝ʯg7fP>xy60yvQڵ7 26dSjY-D e& K; .C>dg7\2%W5fO3U~?8 9DF! !K;pJ8+`ߜmbLO/\"i4.mK=s8#҈1e^t+[ !*"y}>AeULH Pa<]g.Ob[S jZA;JkC1km:ԣ'.GKzkleb0KEz> {iipX_Ǩa;U][1Gq+=w @Z̀H<MảDP - {0k=Ы4-( J1qgҴ [3zޞ;͚0h6ϑI ccQC@K, c[j'r)d@_6\J2;Ό;m;ftY_^jfH78c-f ^Ta6mh0Z_4 vTҵAGE dr,voӧ'EbfU=bNfdMXrA?aMa(>BR|9y92qr{Tq>!DC-ʛhknx|ZJX]MFpxDlp;k.= <6=nigXTcƄDO끬Ļ]nQ!*|nԍ?KyIc19Q-mYٞ"O[nNH[6G1Yo][YLʑhTHTrDv7SFH~%MiL/JԩSoUC9 +=;V,#kF>.[X^י Op88|@{`53U[%/duG#JZ0 >ٕLa.nF4*nvrk_(@3AmiokYhu7nkx_}匯LD5X|5M%mku{ endstream endobj 76 0 obj 2687 endobj 27 0 obj << /Type /Font /Subtype /TrueType /BaseFont /OEJPCF+Menlo-Regular /FontDescriptor 77 0 R /ToUnicode 78 0 R /FirstChar 33 /LastChar 36 /Widths [ 602 602 602 602 ] >> endobj 78 0 obj << /Length 79 0 R /Filter /FlateDecode >> stream x]Pj0+m% |胺[ZA- Y>Rzϭ5TFcuŭA! 8*ڨxg޳ݶD[;:$Yb`wn} v_.woF(q$޿3BV@#P"RTHi\|0vB&RU2t }WRd hB<%z2nx'*6tG~@RZcqW|J$Dy endstream endobj 79 0 obj 250 endobj 77 0 obj << /Type /FontDescriptor /FontName /OEJPCF+Menlo-Regular /Flags 5 /FontBBox [-558 -375 718 1041] /ItalicAngle 0 /Ascent 928 /Descent -236 /CapHeight 729 /StemV 99 /XHeight 547 /StemH 83 /AvgWidth 602 /MaxWidth 602 /FontFile2 80 0 R >> endobj 80 0 obj << /Length 81 0 R /Length1 5180 /Filter /FlateDecode >> stream xX{SǵEbk-ٖ,$b[24vcl01CG I0K 4KKHˣ : YZB %fyd) $%aW }xOW3g3ܹYHնHVXe$GlAW\NyKT(tve-ҊNTeZtLgWHtKʮTXuuHhǮ`YY$o!c=m$DWBgb ђI:B[Ҹt8Ol~%ɓ_ Hۏo6ܠXҝ(9p3>,F܇>jX3P&}p3>ykNԨe>m&*M#Sď},[%5j2m̋d khp ~| _]ľըxj WtMp5,~\)fW>çpCrMoᯗ_R;7O>6O8|l8|#p,v:|G7 7{v{S{}/(w9] ;w)p;N ) '9= '6: ^xÛ4vk^ QïTp;fvtGFH3 #80ĆA/#y:'bR;oM_r7?8a/Sݣc<˞^sxSOf',xB ?K]~N~ag<a6†9lõmk~a+[Gb Uv6&TljXpxC:an"[r֮ek9\xj5{9ⰲGVj`e+aEX\Gq^aiW[]b?,aülDBV-ܝ模y ~pw*n]~Ns94p08 өMpL+ljj'LdS8LFir;ԠT3LFEu&MԱI0)&* 1TV* T(J *VC8FPJfT0!Fvqx*u [JyXXwW6l'z=x8Ao rpnhC%OJ8Bΐ_3F~6!1^~5FGnW&kB="O$yGnҍA?Grl$_%r7W΅%i0Nv#NdHp+";+f@\e;z =˾Br1^i,Gh0l~. Ȑ@,"Y )dH1/jD[-+ҽb΅Qad 9 Գl<u~(+$\Ǻo8"gxA~. !P޻j9~xyfƊՠa%̧1kXn&A>#Md;?B9T0oj=h}|Oj(oݼY(YSYHm3Hu6ZʆF_I"+j́֨u^uP;hvTz癆]]㋔niћ1RsO2=VkdauAE Tìo7Ykg[;-Sl* b? 7oMMwS| %ʪhfqVc W7m6k$:Z6ۚJ}+Rwaf"f Ƭ.qmK6GIࠄhE̓GB)("PĈ~P`H66}[HmM^̰e4r2ql, W;uNSEy[O c&<8Ex”7sot?]@8^ED-ݓXB>s[L2׋}_B #ọ̑ Wv{3i#ߐpGLuR>XJ W1Xt:J\V |H.iyy@0Eg@ˊ`w9q 'h2TZF5uݞ/ Γ1eZPcŋ&ٷIA U*d +K8"Sƀ_:9áBOa}*K}`-/EEM΂‚WRg B)43f|ji Z̓d'[|K299&j.))++-le%g{-XF'B:H$2$`1E~^f>O{(̔"1eb(I-9YTpj=\֢Y\MkD|ӧ5#V[5Ϛ?6d2LLoϛ糼ݾH͘1$lݵkPJ7;ZX:4s֬C~fO'NO34Z6XVD1}8fLM}ڼ| !϶/XTřNsjN3oG|/#7 4ϗ?J)S\_'hEt"NSJ'fFMqOX[߱`咶 'h endstream endobj 81 0 obj 3611 endobj 69 0 obj << /Type /Font /Subtype /TrueType /BaseFont /QDOOTN+Geneva /FontDescriptor 82 0 R /Encoding /MacRomanEncoding /FirstChar 46 /LastChar 46 /Widths [ 303 ] >> endobj 82 0 obj << /Type /FontDescriptor /FontName /QDOOTN+Geneva /Flags 32 /FontBBox [-808 -456 1686 1223] /ItalicAngle 0 /Ascent 1000 /Descent -250 /CapHeight 758 /StemV 99 /Leading 83 /XHeight 545 /StemH 76 /AvgWidth -487 /MaxWidth 1716 /FontFile2 83 0 R >> endobj 83 0 obj << /Length 84 0 R /Length1 5036 /Filter /FlateDecode >> stream xXpT{~$@#.\1##!!Bw$ j@`cKU.iZƉRҎ0jVHg+B42{~wkgo2DsiN'9ޓZ@s+)I$=wGS|z坻wzk$t#V 5~ jݹyR  ?9> ^F@P){v9+P-sOdDb -eC[! ڔv;svLrc[ ]ޒё*4g 2:4\˓ 3A(%Nb*bd_kc`;kؓHP4k, r}K@ ;I$)hTݯȾR܂aAqT~.7,Z`sP'؛)8 cȉ9KpleʭlC<lK0w@qw)7Aj9$WR̸ R )HY\],OH,.& ϫ a .p'Sqy8{Z5 ]XA'XA\~DwLO]-J[`yf`[!y=kԇe_PeaoUB|?./O ɋah~\Y-7feV缾UǪcxJ|m T!0hA;޽7סh/RDɳ(9K^0ㄙis/M>zF:Htΰ =Mu2YꅾWHi65q֒E>2 -lpJL&NIZ;aH6> 1Be:!*J-''dr` 7.$彐ПiU&zٓy6&,n*&ɦBS9:q)'ѭUGw3̀a%y"Ȃ[("bD<"uI:44q$Iv'Gj&Z h'A="w+S}v_z /G=x]a=e37`zCcϲ#x!cX,0C s 7mųȣ(5IQf'OQJ#͈_3Cxx ^8-Bi jM䃦fs9k06YܖnKrr2wo鄱wmcT}zb>~.xEe}W:l@!G<.7Rl1pI4Jﰐ؈XYNn[Jc}} `e?d]*F&Ob"sŅE7TE^ /w=g9Yٳ2fHOZ&I|?莐.9n+ %AHW O j]W!=)g lJ9j n?h?ՂѮ5ڒ`2*z(>{WYH}1_[b,Cz oܲNU8#|z5 |~CS`KgUvJ}saYT*VtLAשXwFCΙ-ZKxk@03zsȕ`m iUmYW䊉XQڀB?uO  |δEO*؎Bi~50ק64U_۸hG?]S?ZE䆋tj(E^JSКSc5v+ h"+(ּ1F 2 ! l0)T`Ӕا>p$<)1>%k>,|;ҥXz,S* E}zǦy8>^UnJxh;sC +=/N3 !9uE3k:h4X \;a"q <O4W <q Y p+P]mOn|8^?·NV#k{n$ko(•SNp|~}MNoEp Exݔ"\ }}^O^![8odF!Z6%!ZAG ;ړf13ɔ/ gLK|rL|ͷCO[IyxyߜКrx8/aETC8xb#{l;b#ًױtSNN.5A]VnحE51w:Ns$@i(eMތOhwMuȮȾ0J 9p/L endstream endobj 84 0 obj 3025 endobj 68 0 obj << /Type /Font /Subtype /TrueType /BaseFont /SNDLMP+Garamond-Italic /FontDescriptor 85 0 R /Encoding /MacRomanEncoding /FirstChar 32 /LastChar 121 /Widths [ 250 219 0 0 0 0 0 219 0 0 0 0 219 260 219 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 760 0 0 0 0 573 0 0 323 0 0 0 0 781 677 531 0 0 500 583 0 0 0 0 646 0 302 0 302 0 0 0 406 406 271 406 292 219 323 417 229 208 521 219 625 427 354 406 427 302 292 250 427 344 531 500 333 ] >> endobj 85 0 obj << /Type /FontDescriptor /FontName /SNDLMP+Garamond-Italic /Flags 96 /FontBBox [-217 -256 1010 913] /ItalicAngle -6 /Ascent 862 /Descent -263 /CapHeight 654 /StemV 0 /XHeight 410 /AvgWidth 324 /MaxWidth 1000 /FontFile2 86 0 R >> endobj 86 0 obj << /Length 87 0 R /Length1 24000 /Filter /FlateDecode >> stream x `ŕ7^Lsjf4)4stOݲlK%cKX|6 2&`qKDbg6I6  CBɐ7=3U]U]]{w߰^D"qQ$k ;ܙ}o1C2(BԾ᭻2ڸa`0>t#bH웦 }r0lX>컯ض!S>ё;ݐNoX({R}-BJo#C"bz><D։_k^r_~VL9\&j+ h#@s sM 5>sdd[[Yx+ʸRT.U+#d'!#Hm??7ĕtEtnoF)(GqƉ 7q38=0:?@Ӯ' u@mRetF(yfA\<8exMKg|r@$whX(;=Ag} <5EFdc_b^b"< w]/en9 mm\Np?_*eRt9̵Y }؋ހ+Is3#:!LGviS4_V:L?{"?%F<8m~w Ӯ7s\: 8}$JOž~PG#p`|םԞi4,h4gΛGgHmg][%7Ix"ahs9izsӮ=/G0h Q6=O!M ɛA3=i,H{!|bzDSL{NdCE |ysxHOϞ}zD I[~jz$ *g]LSCT:">14;# Yi+{q5=2Cy|O>x\}g ̽.4yt:8:0 9ado>syDn`ʥjڼ.3ޢܨkdFҥ`nYSBj뮳 dU7U2rT"mJtuiNw`3),mK{{QX!ܶty[]a]Or.(pL.pL.p CcO X&ںz&{ |vo۔˽,F,BR˥h5eE0{KJbQX&kěP K uT N.v>ӚKn /F.5. ˡPA 4GߍNH@r P۔W*w/pzz{N龸|?;=9}%sJ2σCR(îFOcp|[ΡqύTd?,y.>?JfFh?z#Z Aqtp[痣Q>1>`Pˠ;$Ec*\ ܇$9+h@#;O4/Ϳ @oPJQ{ {AgE >>Ӏ}RʃH2q-j a(:z }mx?nU6mj^K^ cz'zIi^B?C* s 7ПЇc@$Öp?fI|7>S</;g7t[ߝ13jPU@0F]֣!؆7Vpv0V䙽)oz FIM`=z͢`?D e5Ppڌ8#0FV:&܂R x-l]xYnw#>y 4~__q} PFx`"Jk!ƈ}aE/xH;!d' LJ;Oȟo0Pfsa*aj+u#uu(tƴ,:FKG?ds9<0` gٓ|0w I$+藤6ȝo:b%A&\dq/~^qɃ^BLAbx'"G߅# W% hnN$ >rf;,l2=j*N`" )_c{*?E}yҾo |*8eR8O%E(9JⵒwW;sO}z w=5+;<w4@ wʺ=ݩƝ' EiWEiNY}qc 3Dc4ǩV_CjU2Z'`xzS~)$!\/3Oeܛvaɻfxt]z78g6RSܩ&_TKּ ~gJY/u~閽 jW~LY7ړS/\cvdo/4m[^RwX#41tL o#SJ_o~,Z3mkς8nM'{|;8mDwi-|&/zgFVQk>9'Rz8XꑯeJ[@ M/O/?WM!f# GNJr@.TnTND)l=L-F/ɋj62*V`=iψ:ؙڻ'F٧dJKg.,1])iL. L'nl''f^smm)-̟;ljw#A*ʌƔeBk-q&xd4?yp 4\/0Ͱ͘RǑ8xFނDd]I} b /"ZCCX6 s:rj/v*A-4B&^F8&@[P)_@[zp=\My+pBnC^RkE2[}ZG(x ?clל26-6",f8߀OwR,u9jRߨWۥ}IS~X7 ?0`7s,_nu1.g ދn,E->J`N{i|0jQ<{ 5w *P %O }PS7ySF;\ih]b CEMOz^`(Z':F%|(HQ)5 urTƨ{(5Bri7Lx7~%<-EzRFɫ\ ҆DEGYet-.w7 f6 z^+X,цu'Þ 1xWyUg7}˥XWoST@XC y3 CrN;K,t YHqi4T?TO>5Z,оנ_} W+0uEeGE  cdg7nH86eT b7)4 }BD>䘛;Q&"] x|lVgͩͩYZDZ T?!`]x~0t~O>UYY9soΫV. qb##k[8p!f1??yZ1mL+kvr⎉:&| œC˗+&E;&Nf&) Gȇm$Vj\}qb?'FȒUߛxNLN?&ߝTX&*_#1 )yaen/s4/Brs.KT 7^#aZ#kU `ꋬ1 Ux$-iXLHbBfL3,ia5[.ld12> h&•R-@4к f6AEy.}WA$R\h)Z!!!n z{a@kVƯhj3fYP~L`RŴ_wUšULDvPC*^F\=6J`Yžozxg']:Na$*͏$`Ng9V4h|ej |@tMA. T]HSsb^ k)%Q V03PT) c"ǒm_RSiuA2xAJHSųH,B { k< fM*N4N0H]@ЭxVRT4UjOI-s^O1W?R`6 ۶K F\KC+/Zq{5{L5 5pf͚ݥxT`8<#&uMC7L2[E#N _f %D ElJ6a㗼w`6Fw:~1wnp{9\`@3>Ozجt czKKW{4Ph,}kRn0 F ssiP8?(&=fz_ҷRI@!R }46)AQR$* !z?2#3d!1WR ќ65rzq5&KzL"y0@J.p9iU l_e|۝͙ ;*|L<6t<ʺMR*kl$+ ?)6`Wsfw@+{`:f\IjQއ+ś.dw>0[䞕+Vvw{/O$K*&;.߈M8Dz4dNB~}/8~_ZVl-,uc Fy,9Qg,՜j/˵˞} τ o|1+F#CM |xa ŹJEp"(0@zl @屫ωnoԨ0 ` !46ez ) ;ǰnK]K<4#2'Mt0`A!?a/kSr9 c` Y & et~Ph9VyORFX.xXΡhTe6ʢZOa4 ^]Tq3jƤ-š!qc͆--B?M @6ؠjJAy :g m=ѡREf8H 4`Kigҟڒcgq*XQz_S9*NG gq/—KS )!_@/TڌCNT+V}- f ^EE(ECH|1CMw%PќI2r,UJ%>mEU;Yv(!6 VlָX:&#ΫY,YXriY- 3aH,SN>abO!сD#(%ЎH^TTt"۟eWm;|T[4=rt7zQ|EИsp{W+:oJ댕ybYڞ[s`oP}wt1RA1̿G@jA*iEps#HU„ }\B爿#w1E+&/''ʎ`GiGs`,xs;;^ rI9Ӭ\b[gL9Co~?4ܬjn^Zli^0[PH@B .lPc =$/] OE;<mk067w,/.ꕽN@dj;9&Y'S&MHf5A*"l]2|knRz.ΛG ܽSơoFe&C E ˳ +:kXE:Wi1 uI?.h_QJY^s3e՘^gܘS$ӷ~JtЎ0֭7HtOD[~pf2*8*9ޡPDh" )v\F 4AC+X910Z1:E8*abVRW2kQVaOr 0ϒGVVɣr-9u,El8G-ͣbX1o b|/\ ث͠LFl/h_`%$̸q V ,AH P>JU;4MLȂw껝Չ;+rT|i\vczIt٭OP} NV-W{vUYyڐ'&+h@Ȏ-/j,B.MRP$Esek据POXU14:aN_GSǻ{-zIs`˰Y J~Fbl!b%V2!X(v|n7]r]4+i|ɕ^(^^;[Җ"i&o̵ϢOJ?*n\C#ǥ FKF-K3hM$*m2sȪT: !L# e%GlKL +G'iS$ *ϵTqGIopYF=28m4V/~4+ ݼ/ٴ7H7f8- zΩ$Y5@)̮cn4 p6XCM )*./ +ndTL!ԠHU+Y:3?b꼀oQ: ݱCCqõbmKIxW*6uLW UEM*ZHQB>_ا2WHJD:Q@e#F&J.G3xW>|4||t{,4̽ ,ty%*ݰ<0߲-\I%&dϚ䱖K0`{lɸZ F^ɊV.[ͥ3xƎ++MN7ܾu9@#\V. `u q/涹wB5sDREBS۶.r _>l'-F#NÊHpFќ dkTu:m^Qᬣ6m[˳"yheB ?PxԂ-_C,>bKbq2 zL A`rdlJwZ2$dؘKUk|/j8C(5p:햒,ORHNˤ!96ɪr;49e:_M/+i[=*ekzߜ8v\TXBnN477k,Of']IOқEr;C&Dֺ‚!Vp1Lt!i:b\$TRTk^jf&E(h9% Ih|aB$cǒ{XI4afbJD )Q;l}0 P&j¤&ej%qנ]!րB4h}FwԶD<4\2T)sg].=k.::&`ʩb6waypn<ªnHPJ˂bG5j.4-8{ܜ87dNArYB/W)~SCQ9ńZ@LW%uQWF >/L8u:3xhHR >7A̚zz c_e8EH)Z2K2%3Ҹ6@IU;[;KgMk {; j&{oZn8bbtk}<9?X3Tt-Il*e.lFhvUzȇɫhacTy*2"lfkZR tElMEkkZm_ZwC[Ӷl=O)isLa_3*XQ'*`fJ,O@|%W$]1dJ,i%l0> m)/o d] Y+4פܣFkSsjWS*ZAId'Z-Ly%n-!e_daQO7K Tk@sIevn2ߨɊ'~/s`0+}K*B*`y6<{gA23s?ꀪM7YVͱ$x?@=DyIIml+\d}rzX̲+ *ѦݾlدkͻFLI䋊1EW_?ڥZR;7LtygFw|rnid,XD*D$ %R@B9)s3*Dv7{9HdHqR,@Y`UOEG$TaF3{'WK޸S!3+:+XX[U٦UT 7d5渝c1)_" { ѹA2K4wZqm7,V6Jq/x̮ghDJ%Rj@Dg?ayDiK>N:XBd~x3h{HWj]iS994Q/.uOl)id'/yzA/Bn=*k.&4ɘ 2(G@ɐ >$Y. }+ Wٵ1mՆJhN6g鎾 > 9CV ypks؃ì&yפn{~fwY8]gtKTנ-'ϲ "/J_а%Wѫ*W_Bŏ_UQZ7iUj{= mXu&w YN$M1),BϭT\UҚk'V.1\$RjaѶj)E'gI<>Zs( )+6gɓ;+JoXK^B,Yk2+ZJ+6fA枕 wՕٛ)΂'a_ Bgw%%wEsQ RQ4YpF$̒QZ$2HFjddjk1pn&;- 8ݘ6Xʲe&=:Qk'{ yvItծUbCmxԍR\Yo;˚ֶʨ/tWl6oy"*[ j7(U4_:қ9ӿ뢞UAo= |C;6"nxRfSsLZjy9K!KUqФ߿~ 'x?_NK-z\[y %i 4J%61Y2IȖ0)H=%܁GNF]DAgPJkW%|^Ax$=h!u(sjƓ9k(ܒlZt69_P2: ,ƨEd݉S ::kP45_qrEP5np.TqgŦζ%á5Cj6R%ՁJZעkյu%ANL%.YkZkbʃϧ7^p1u7L٨l\VURn֐VNʴޥ-koOWKf'k4=&=&u'bZ+Gb舋IF[C[_6qIVH J⦡;nZޫa45$mbDLG¡P~MfVMc"3;Ow;K :}u b Hv_):n]H%_gJ+ @XjFjn9Zs5k.ּY$Uk^_ <,OMy!)36LK2MiA z I4KCu0!$ Y!k.mQ3^uױ&`4j/X糸*v $g^~_sSzӻ7U]59d9e0Bۆ:J^xNAIXiDhu-ƱDY|O^ì]5U+ SceA&Ë ^ uzQWkr߫O_r̝֟5ʙ _3 #Mmm9>%r^c}niDZrsڽ}>Kt/?כz_*Pr6FB& x>(4&`O$ 3S"2TF=$%'1*K +/4PUౠ"! NΎKkIV 1r9%̦qG̑uxiBX $^ nfO+ug;Q:[1})e,RB|zipa7nQPd0fW]؝X+lܹ^Agm¶Wad]_&# !r=1޼oW{&Փ&_Y^٤aͦM~u֭,R%?}m ص"oLRSTcX=Y]#)of`'K #"\T"Ɏƪ*dJ/5/m7-Gj:!ָELl`$[CӰ0^H3\=2=yjD`Uʪ%U[>b$u3;iKiN!ӹI9yz YIkvTDbI&e uaepb[ͭ,ٔ&2r= y-*7ҐГ}^or,jS9=ͲqǓ~IB7f;|@Jm|4M~ƱfH2s[H>yt.7rqi^1 q r!Zԉwji!dȟ͖:3"Q́(N)t;T T}+ ,Ȯo>uaW3L9%Q !bXZVSL[ IaD%ȠVK- J"yaAJ!c[{nQc/jͬpt:U0"ͅo3:lm]:%4 qr DWZS8ad+Ew\₽l52[!ǽJ_-a/Sd)ZKrDyyKNKn[LM7F9|γ \f , Hn[F}7 cy2_{k HN'>ecuL 'Qc$TA>Hg OODB/|'aNrr~K& .֙wvtK<< "y+夅=Wf% _)Jj>'XpB}6G`?|敒OK J ("KɌiͶ$TsCmK@eP'1>%x?ر즶iVCVjԻʳjͪus}Xѓ2aھB>s{޾ZiuU~5j֬67i0 XK,])l`+C6'lM6%&ˢh?,1x].3Lԝ"~ẽ@{_?ۘu$^P9c.KBZ}"+j{r#וTV<(YU\FAwy[X2;PA!aHį tx? "I@HiM]YP__|QTC'&CZ؝rR endstream endobj 87 0 obj 18802 endobj 23 0 obj << /Type /Font /Subtype /Type0 /Encoding /Identity-H /DescendantFonts [88 0 R] /BaseFont /NPNLLO+MS-PGothic /ToUnicode 89 0 R >> endobj 89 0 obj << /Length 90 0 R /Filter /FlateDecode >> stream x]j }^,IlReK!i$1yf sΙ=uD(ރS=F0d,8hgm8wvt4 v%4c'8|]LoF(YۂƑ{UE;M&nGrU|n:"GKA YSjgZ-C]׻im+%owrQaFc6& DUY|ZIcTk06O)@? endstream endobj 90 0 obj 265 endobj 88 0 obj << /Type /Font /Subtype /CIDFontType2 /BaseFont /NPNLLO+MS-PGothic /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> /W 91 0 R /DW 1000 /FontDescriptor 92 0 R /CIDToGIDMap 93 0 R >> endobj 91 0 obj [ ] endobj 92 0 obj << /Type /FontDescriptor /FontName /NPNLLO+MS-PGothic /Flags 4 /FontBBox [-121 -137 996 859] /ItalicAngle 0 /Ascent 859 /Descent -141 /CapHeight 680 /StemV 0 /XHeight 449 /AvgWidth 418 /MaxWidth 1000 /FontFile2 94 0 R >> endobj 94 0 obj << /Length 95 0 R /Length1 3464 /Filter /FlateDecode >> stream x}[lWǿszfgڛuxNNFJR\Z&*BBM*$ UHHOTfP|6]ƵϓCOCOl(p/~"ً~°> 2ίfئp]afotya[W*hן:p=~enz|s4N4ISTi:mmԠ&mYg>yoc l}Y Ib;sY_p;?㯲??f|[糆뾷goÉE7nܢSgԙ[l8ًg#{f쥳ot.`fm@}Mz >깃o5*VdMxf[텞6 }*t7NǎwZw,MK/^;io>Z)*>LhGn>E'DW#c@L XL A<Ч4d6jc~bMXJACI=][] 3Ӄ[?{o_;I@NiV6&mY <0wm@e.ecUDq G/b7 o@u'`/ PU \C@00r $GQ =T[N'SxqB\>윛ls-8Mo~DOpL؊ÕPMh!)fI6O:f'w_o͑|gnFRi6΂J-6͆&nBAcP[f7*i%qY̚`G$SJFۮe3,ҚqX}-La/2 =qJJ.)eDl,;PX!-h+5%QE`cm1,USO 9@G Vu/|wJ ^wLo\lvIb3{Y=щ%iF 62>IɗKXfl-g0>{̔zx!&QrI#Pf^,tz} {.vu]7ЂNee3K|2<PCYJoK(8+h+Z[B DDrҘ mlDosm# GX͙JxqKN55+1rJ I阅'VP!۵#ԒZJ4Zp(͔J "f5…h#ETrF2(!JDZ/N,SgC5 ӤN~&a =B.}>?IVOo>?xapúiY&ۖKsVm~iBS۷|xǖ,~ y#帒[;p߽^3׿מ7un:72BMFʮgN#mDM"tu[~oA uda_tߟiVIRT~A C"*i2YG0H(d@Ve24lbZQۉ;Q7SsbچuQ0Db ɠLLpз5G&zPR96¼\eȗ((D݊2KLr>OF6RLL!$<3%Wp 3)TieX9 M>nPE!B|!x+peXIJ(4$1v%=Ʈsc"I&,} α*)de2΍'F>Dm&A5ɻyPoup׻їZ#Sl7w> stream xй00Y4щҜ]( @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @x,?L= endstream endobj 96 0 obj 199 endobj 70 0 obj << /Type /Font /Subtype /TrueType /BaseFont /TUNCXU+Garamond /FontDescriptor 97 0 R /Encoding /MacRomanEncoding /FirstChar 32 /LastChar 32 /Widths [ 250 ] >> endobj 97 0 obj << /Type /FontDescriptor /FontName /TUNCXU+Garamond /Flags 32 /FontBBox [-139 -263 1006 913] /ItalicAngle 0 /Ascent 862 /Descent -263 /CapHeight 640 /StemV 0 /XHeight 399 /AvgWidth 387 /MaxWidth 1021 /FontFile2 98 0 R >> endobj 98 0 obj << /Length 99 0 R /Length1 4488 /Filter /FlateDecode >> stream x}X tɋlbg 7q# cavC $P*Bi7nZm6>BX%x<~3pDmgy̽-[;(zI }MW4FzhͶՖB"16˖C۸c-F@wvDm.–uŝ]=g^ߠ7n^3nwYn>)+ό[c7ٛ^;crV_LzԴPjCoubo`^yc[WNH NN'縛m[N)1 U: X}ZGVj+3Oޏ0R)ó%Ky \Ԧ =Th/Sj#bm,l׶M%]IސH>4ɓIG$K&I1=W!zE] n 703ƒHرkT\+XWWP%9+l8m0],Wf99SZɕ|jitZ>&3JtX!^88ؔ"DהE \踀oc}fyHMԢY ]6:IM$&6ɲdQ_د/@xx Āz A 6mTڤ&6ɴ&!0px8<<\4+/#/#Qࣕ`?VugCăĽD3ƙXL,gȪ|YY[ 72 !ZoԨppo57ӌl6GPE[vs4{_(4*hq5warʩuXUT%N9ک=LOwx9̿~Y!ԸҦxV&=)|ku»GEb)2#0GWY_Yo˜IP玛 󸏲&yOziX%0g=^Uvlk%sO(Х@to?H7;u#8zi~"5NSQ85azz I44u`M !4&p kHmny ֍3=@;Zll)N*2z}NY5UR2KCWN[18+.zKZ5uWS˩PuuTIu@FfqxÖ2DǡPNi!i+blKsʹ:i/Ʀs"΋Lf#ѕ#*䰀/M͸tF16N;nDCߡ" 9fC/ҫ.GEcn6yXkbl9,Şe8{󩼒W|O'qlz;SOr,p;R?JҰsg>j ES*5,btjV`5hAwN|oXY?S__hN&82|VZp/g0kgaead؋e3s ƱIEp_7(F+u/>_2aP+4 1W8nCxZxߔBZS<* $ϋwRX")=&,wΑ5MI| n? a !/ gM>$Cw"ɉȨn6nf1q$ wB ;GȺwJu8ލ7TH LP}x7}4vq=0F7: u6;Q-gyh^{}muճ]SYzfyYiI6ã*WM.ZxWr'dgefN! 8pTjF T[Ҕ(O)rC5EaSx궧~ɓy4Bk& G[kBqoxr x< ;TETѼ34UVF#2f3k,7ps0Fc7Z4tEm7ZMn'TYa5ZA\z!5N1zá>ub077]k B1FXMcoVVOFk?BzZzB x|A{U3A+7BR2uth~S٠Z2 ZÓ*Z~5> endobj 100 0 obj << /Type /FontDescriptor /FontName /PCLPAV+Geneva /Flags 32 /FontBBox [-808 -456 1686 1223] /ItalicAngle 0 /Ascent 1000 /Descent -250 /CapHeight 758 /StemV 99 /Leading 83 /XHeight 545 /StemH 76 /AvgWidth -487 /MaxWidth 1716 /FontFile2 101 0 R >> endobj 101 0 obj << /Length 102 0 R /Length1 25664 /Filter /FlateDecode >> stream x| xUwV,ݝNwg=$$daK!AZ@,4TF 28GC@ A̸!"#( BwsysVݪܳsnZE F#&L7)KqSL"NsE\B9'R!v]K﷼PSEϝ'"u sGƉNnɀLY~)]wOSiLS]'[PW#zlR# I= 1p\;Uy'=ה_^]z*= (P.q\%QyJ;*"k2PAg0,;{q-U AbD*)̄|ȉ_=ݖ킋ˁ.gY9 J\%Jq\9B9^sx,ymp}kmؽz jzA~EHDhdسI!'{6im]_|J;_cdɶ76N@v*mvZ6Sd l ~&n:*MJnMOݚЦ߶ Q퀔}[ fz&{jLn]W?p˵` j}:ԶnԖxJ]{3z]I.gxJecΔkK22ϔҚ}s+ny]o޵<,+S׻*L L9SyWБ{4?A-\x`\u ^f4>]`-ԁ^2ԈZQԉ{TqEm}oDZ]HU w5};$8ی~2 nE[qgz愶A@Eϡ&'93}.x>T6P]A8e#Zn~wuל́o>}:Ns8:BBNo wv ]wSBK072UE͡:w'i t +<9 }܊#wB@FLSyT1una$ٍܜ.kWy>~*t'< M˨ X-I w3l:F`xwWm0k,J]N G#+3 { i7tuq ,1܌Ļ!waA~ԔD(?GϤ433 2sfNo %<'qߵ (ԊT #s s" ņp:΂_)Ux, (P4SKʤJ?:sQ-L¯ fe 7Ne5H <Ϝc¯}᪸9ȵpGoEB5'+ (dl'5UJp3}q -!j9zf'Bq#wz9>Ó+/EsVtdGk8uc y? ؙ(%+?$g$'%}O匋vm(d4HzVUϱ MaZ)jMne|AH3NLV*M7.R{#--*BEi2ϥh?#ROr\3> wl3J]x~FSҴT|PiRA\AM܊NY2 $-ZҲV-2uh&-깣ySoWl£]3[ahkoꑦcrfgڔխxDY!)m.=oKKm{TB6da_Zj]Դ4JV[>UT'ڔPöt 2LNjUyxf4͚ w4QKm|4n-L)kFM.WR+tOOn};vCG&] >棦cMR_T+<̦[L>yH޴)=ǭ))00M0[еbDNZj}kgjFT]5}07n7u2* ##u# ɁVj2re,s=,ƿ^2ۊ˵u0iR#Ո?\i;*==vE~f)*٩p" G9r{9@jfh,SAr6cyǠ~x{ŠWd\T^T^d(..Tr䒱 Ղlzntl.ݖҳ_[~ Rɰ \"y(+ހZFOs2/eXp);aSCQ}p69|(M2٤?<xW=8'ۘS98+l+7Zq?e(:';ssF:L2s|ôΥ۾XSjg^hi Y# 9;ij w=U~y߄v1 c~3,|/g 8io*zᎾ2*T?{–q鷏NBGhz~H3[B]h]aG)TV䨩nsz*mUePR p%xh7wlρp^Od@5r`j8XlQՈ5Raj8SiXZ".֨*# 2v'Hv)wz`e *){x+'xwΣ/l9r +/VrswBxgDvF wwN Xc0Yшku[Sb,K2b*e1p[Fc9 njS'c!(S1EoOY>/]@ҧ>ͤp3#|Eh4VPg#}0[jzqQZE ØBXES$j@;X"~ EП UClezY=8\=񭂼矃A;X.g>A=<*h~m`sYjf-ܷ2iXzЫb?gEϊ=tt򆕊T,G]cQٓq߱C8T=OQ8U!g(6=̓4lx;Iن WlKҩ+0-@\% @|etVV[UiXi0 ,%87/7'"!{ɡG,ݖ3?(Pònw o'=<#4M-QVce_F-sNXZYȻ3EEwrZMMNMOXz&1leĨ샖f.e2ve Iz?K*si쨅iٱ"lϾl>ЕKSBT/8=)^ feԦdgZNtm@tZ[lRҐ?6JC4YHq qNV&qV@j#wlsTO3n /:?`W_ S;a__q+G% Σn''rQ3b{S oVD #-~KhӀRXm;Wa-j(No>'=st*EE=%=^ELz8&|,oRv>hzq}Zs3'4 ~/̌^hrM\iaq`:]@e,ifFl$Lڳ"%=?'"\ Kd-TyAB/iUcO) EeئJCf=lE8ad[Y  u|:r  M?%w~vRh }DDqt6Q'c伵ޝt4|oe$&,\m.797eKw2dq\LaOm eFUZm+=ټ> 8>k *P$/+|^IM8\,\hr^e8??eC4SYFE< ۑ;3JAuf( 8DJ+/ل3g1߳?.[Mɚ )N</Ự$±bƨM8&>=Vf6%#ckPUV44Q H}z(l @tX*Hw u4 cQ*x]4cҏ7p7*e3G^] 88y>  xΗWϲ:0NW0zi^0RܿZ%S?5 -41yP&5iTÙF4:HCi*ظi8u"pO>& qv9r0B wb E>E S_-QM1EUvYXU)ow죳X *j::w[2v̱̌ʇbxtր.v8t].}id)MGyJ'`NؚQ ;K8W h֛ f+׷9}L)oL^'YdGqJ$M"\*pA5˙%_J$0ɺ)8CMn tWL CȽc<`6ڿ2RKQXq hpD$I[D=b\ BA,f#IT|5K{ o=|O<}3k6IyU Y=#o +zWwm%d(wayuW7:t1SkMXմpUӤ[nu}X3~zV4ȷ"QDV1ʡsHӈcYJED!SJ]NC4>bMQq'@^Vdbl T v@bI~D+h` RfДV+Z ;}. e!s3e}ht?*;|~[)HWϕy.o=$/SiՍFz: EtQh&jnl> (>0ƛj66BV#ETQ1) Q; Q>#GoT|'O]1`0@F$"?o`f>{5lb9g*ǰ荩HjwT<yɋzT+WKl4S0]pXstu/ű'z| {l!'9yQ#6;G!@\ D.ʓv:P"D3 bQpD8mˊTͲ̊7YO3z*۪akGb9 70%;NV )E^6`i TaA% "ԘC+l 5GϬ8T`o~5Jxߌ5׈b̜g3U>ŀO"Do^5]ȥ$gUXCWO&2iUR6Ѱ,d`Yzts@t4t(s)_ $2çŸt}{f~|l»}~e9VwvbBg5 'Rd=)#ĹH @8_g }~7N9~h}7חCYB̺UzVM@ggPw Tl  nGS0 oSQ_3}Jasv5} ĔELҵÇj^ m|Ul㏉x b.$>EN-~ ?/vo>c`B@ A*0EDs,rX=C Q *NA;܄ R}$)V2 8K=X5B+P*LD4u(;t ^ccQl $ 9Z!VN0'O<`Nk#ĕ0%Cth9,IF.Z|rZ CN24 = t>C5X^0t0 )B߉ShU![qe;ԛB{2#~̌Y. CFى3vXئW+4!qqwgBW-j!Tݯ_|Pv~ٸԢk?'&:bPh fK5 ]IH0l4u|V:$x\*xA6 _d + z71Cˊ /,c$@V`c8cSq Q=-V$(@Y'_J  ;mF33EoW-ӛW+[w>gVd[7m8f=3j?{xz^3x-,-Z`onqf? Ԃt>;6ˆ7ذv!PT 3Kq[~s̥  u`. a=jA)0IP^Ip(m|}|z_ou[:x#trزOWnozYv>/V?Ľy<Hq9s[чrDQ49܎SxS_#ý*!pJpy% >h .3B?u;vZg,SD.'+,Y% $AdੀqYn^g򒘊Y#T:.fdM@VvTϰsٱ=ያ9檪g~zZ ?3~BBf@3ʹt[p½D_sq݉g0x1 a%D*w@u!LT_K`3r7,Q x(  fs zp=nx"xp9tkC(0W_ >)H P}Gɗ9lb11 U[T-m焃A8\8͟hO~2d`A~vqr\DS9ǼIObJ&oT+ XLgnP2Ă+L?~$btq"cuz _2w!}օcbhU ƧHQܾ|9 ޼['BN\+ (rKcqA DLs.}g":zg`bZcc&_#Oʦ=T9bʶpU3l]ٲqÒoZ 0n7Bԑre)TF: Fr6ypT^6 Ucǭ6^pDowN'&ݟx;W <1T@%FĪV`oq3LmM@Vq3f(_q꧃Z1So_Qmhi UN.|I#g_ޘaDv[2E_T?j0yiuFǟ/D`"CqsjWrz)JrY}ܝ3Z/E]C@o^_!-NPl*8;N +DzW`LzxYzNip ; wsGJɓd4[ -F1*tV]k%`!@LdI2x-Fk!% D M8;2dDZC - qY JBSw A7k/\~i;z:l~ D o]t4Y6'=FfykUIR),Rwy> i]` ÎGF hsۼT1U/ӎs݊  /)ksh7Řhbm.l捀ZFŅL`w[ @&AJae72tG"u޿{mCgn>v}LX"k!TK@ΈtnҸp jY++e99\Uba*uoI DTL(b/ IItyhYV !5mwIU p}9"D܇әJ{a8Aʐ}kZ;T]5cST;W +q8!#Дؘ_? h9E, -sscZNJsbX^w}`x%Q. j:.F]W@mT`bT)` T&ɏx?(M0 D?EARjMWz՞BYɊ t M!B:yp$9A}NЉ`X Ƃ}=c:6|5mЋqAy Y4HCjʚ'Lsb|cVFGZ*ޅ)څq}.x!H:.ax'|"g 'Ji!,($ڋZ \ZVvĴ L>P`tc:Rnq4쬭NM7cmi5O*9#j7g hE/˕0w.-143Yt 8az`bZmX_=qn [Y])p3&`fv+Kuƨwיׅw//DM 7kH6: -^EgOܬF!WD%` ~pO.?Y' d႟,\IW[.Ha|>s>9s'l9p`c8!E $|$q7@hpSc%lK!=aȰ8DCQ-[0^zrOAph7l6+JZNn(꘨犢~~-I =!zՙ~fФyL5'| /K;&˞0t_Gn`b8b\j4MdWV4iV$REiω^ܴN2sZS?B$Šlt=0=k!T[X CN<%Y LkxfѣKZs{̮f,nk=D_r-q:]Z$= 5& iJmX"!0+Ul;̅ݐb/(J "g5*IR( CJb4 T3k(d7GtUtv?yDQ~c„:jiw.#^E$"~'B6dlD"*f7-vf;4|99LѴK џM)xLaz̶3mga;)}! [啫@GM2a Gr6T&x}}׵d 9܁gS0H 1`#6g3R_,ze4Pa qtV>⽆uZ VX0=S³guJOtH7oZΰgO4_ᯨ4i}m.&6ӏI ¼^Zk>H*QM3@d08A9e  x= NkLqUB\ձHE,J/Ѱ +8yH#V@Y7MWuVN5ـQ~m_G@q"aB=w$$C@8{RE )혔ۡxa}>s웭_2={ҵԙ' A5N!o6[FD8ʢ"/VA%r1@2Ϩ\O2_sТ928Q#[ |]*G; LZ?vZ)NJxeW1pm$=E7G~>OAEM81 g-E P)=x+ڄ7Q[iBϢ=x,,ۮo 'D!4,8DSgRi@m3#u`X ~tGeA7Pu%A0 PLY JkHQwAL<vro?NȢ3+*g0i׏מrcQsB M.N3T2T2_QuUNcq*T}0%Tj.ѧJ2a4GNP`p {-\Da:zZhass3 +̯e nDA'z\I)i)}\9RlM6[Wמ– v:s\ N¤iK,́V%M]U٫r$mIޖ-}[ƶ-[r L z 8ȽvXȜ1BOF,CF\)kQ=/u/Ry)+9HKʆrLdy[#re3VH0˿i5+=ryG^u|3x? +|<>:_n^-{ؓO> 7|z6|pkpyGGk_˸kP,S@OrDD§q E-^BoЗČ[倗O97y݇1,H 5=4M{qNm;ݕmDѝz,`h-tfn&9#w~m7 v݆mvA"f VY%U@Q  -P oF<Z>-@-_W4EY7\pvKOcED)< b774m^ )u-p8 -xɷz[K~]i(ȷ÷GQh4_.ƣjT&D:tAC0d?rRшFRQ{wmrBePAi.(P@yY(% ePAi.(P@yY( РHP\P2PF@ e( ri( (2P&C(B9=(g\&VP$(.(Pd(#L2J PvAir{PBL E1F^u_W=W=W]Iپy[ޗ֫ޫƸ}Fz^^^^^uнny_^z~zAz^^uW^꥽ezՉ'ҫ>W]MYҿ:47?D^Q nLu}|:Y|sjzէѫ>W}Zzm^;{gUի>W^u>-㻻W}n^u%&x.u^u=oy^^E{՗/Uֺ~kUHR! endstream endobj 102 0 obj 17922 endobj 10 0 obj << /Type /Font /Subtype /TrueType /BaseFont /GZAELO+Geneva /FontDescriptor 103 0 R /ToUnicode 104 0 R /FirstChar 33 /LastChar 34 /Widths [ 333 0 ] >> endobj 104 0 obj << /Length 105 0 R /Filter /FlateDecode >> stream x]1o w~ōxꀐT<`8[Hx/P7:{KґO 9VNĹmOUBfߖsGcȒxó vciץJx)A#c73#Ȋ:}S[Dȍ2qd%lhBFU $ځaܓmU}_勏JvemjR>VC,qp endstream endobj 105 0 obj 224 endobj 103 0 obj << /Type /FontDescriptor /FontName /GZAELO+Geneva /Flags 4 /FontBBox [-808 -456 1686 1223] /ItalicAngle 0 /Ascent 1000 /Descent -250 /CapHeight 758 /StemV 99 /Leading 83 /XHeight 545 /StemH 76 /AvgWidth -487 /MaxWidth 1716 /FontFile2 106 0 R >> endobj 106 0 obj << /Length 107 0 R /Length1 5000 /Filter /FlateDecode >> stream xX}pT?KdI>v.1F>bXݍ#t!KP [LӢ5Nΐl,a8J[-X :vb 8{s=w۶{v):HM]wXRє9-s)A$]w'2v"ۻwo;> ]-XsFO@[ t^K tMcc;D }gvk#)NSr?G>'$R>>SѬwe,%?YbY4$%evIf'2TYOeNy)?F:彪Sn@^,;e))ϦN2)(7)<rW'="T6e٦ `$S2o74\HՐHeOCR*`%u^_Zb)5 |NM )7͞NC3 t$Lr/͊R*#}ryG ?$Sk\>"3L{)yqF@wDC-4(Jr!7+7y[w;fd]bغm݊{-מcwاڧ'v] v禍~,ZFV'VYw` bƱlfBٽ!bpȩ4F5рe=pd6s&/A[nSͥݦY]FR^1 #dKq `pH-ġAਈ,I8-3 R8[LVa$@YQ00PLLUL -0@ V<}A- +ׁ]}X9lwU_5\]}Jf_UT6<`AݻŊ!;hR#D 8aFqXKQzS?l'=HPRtz&A[I~Ft5Ѫ>OH{i8dpFQ'con# l#u 6>,Fċvczr2zpTLe)x:B#q}͂N8%`iOt^i.Isq3zڰaH6~8. uBB8*&R=ghF` 7歐N_hUFzS6",n*~!ɖbK51z3B rny7-]$ٙث,x!SY_>7Je c,44vj3Ӄ{G2gg<쾌z^tze^Vj6GI˞cB:Ž71I a\B1*n[gAj)OK=M5rbюUR&Di <0/N-b7!jVXmb[X":~ҧ(؄+ +ϝBBpH8,^Eˑ鸘@jG:x(^8-biKn-q3Vk5cؼ.[vv62qs,z^ļCA:zotYIBxLGob|6] ieQ({VX-`^Qmf ba?th_]Tq/\0U4Os v͚;#gc)'emV$ ?Ӻj*??a~PInk@sr)nl2{3|h ,YrPO'9u>ƃǸkp]W8^ėPi b'V$t,àtKCSfSؘZYJ]w 18f UK<{mC pS}"˼U3יV0zpWhkA^wD\sfft\ь7jX/&4Ǭe:uuSc?q?MSpH[Jt_L*j7{B#JRIޜTBJ ֵTdR(ɈC_nE!Hx5,rnMOF`aۘPS -Z~m AL*vI$6u{ :|^ ,~Y 0I&|}L& |gxl1A84G[M-MT ܶv7>[FJx{_S77qO'D>W'D8t׌ 'o5fo"|ǍD"j ^ W}s^O̓󐕦B7KL$&- [Ɵe2R( i'IB,BͶ_ŃO[iusB+*+.bo骘]^:~1frGP`mR_prw'>ZWlZ\]+O.* {u-H endstream endobj 107 0 obj 2991 endobj 22 0 obj << /Type /Font /Subtype /TrueType /BaseFont /UWWWVY+Helvetica /FontDescriptor 108 0 R /ToUnicode 109 0 R /FirstChar 33 /LastChar 33 /Widths [ 139 ] >> endobj 109 0 obj << /Length 110 0 R /Filter /FlateDecode >> stream x]n D|C3BREmT'aj@k|J=쁙y0,?w 0u.a%0> endobj 111 0 obj << /Length 112 0 R /Length1 5068 /Filter /FlateDecode >> stream xX{pE[9M9䤮5tue]k,|W(n";LUDr(*{ݧW_1e9,{_YO~:?^Ǘp si+($`M7&PlP lkQ8){PEm[QDR~X}l[Brx{%e9*]y`+o;?^a/'w3dT t#j3تN@ (QvF<,i>dTQô~h X7v ^vᨴE? x(y(մ},d N1S35CTYD(;0\V6.P$,τ[OąJqtΙ'7hd,db[)N /m.A}4K}6݁Ɓ/ rce|VSk!Xg9z* t IJY.` PX kc('-,B%& B)Ą7'a7yIHyR m:=(IK yb}};VEg$6 +fjb~HX].E*q8O(n8IaU\I̷Wt?H>rɿNeE[XTX?3I[ő?!/79qcdgeHdIOdZ0~ʪ^558ZND72JK*ݘ}_9\V;tnz)g@N]mvEQixbfѣ˞kO i9CB~89+LM:l'2y2NE`֭No5glN Ǭ>x,5(>x![ *Fi EnhWU5kjڊ$y,@4`Do(/FCg M -הoTV8>(y*`~PY)@9ˋ: ]b">[ F;x `zy57`8`K(_)hj1<21<}$ Õ) ̕p K3M9@]&玄ac y?4Sh[ ]&#ba uE?Ë1pipR]b121|$ Gp(t+9>Ű7O E.]yMI&sAƕ/ HwʃP?>"4D47cA# :m{!"d{tGO2dYY|ToS_5 2n q&VQVQe%0|%g`StBюhw[S9(OF&wtNzf endstream endobj 112 0 obj 2719 endobj 113 0 obj (Mac OS X 10.9.5 Quartz PDFContext) endobj 114 0 obj (PowerPoint) endobj 115 0 obj (D:20150906171832Z00'00') endobj 116 0 obj () endobj 117 0 obj [ ] endobj 1 0 obj << /Producer 113 0 R /Creator 114 0 R /CreationDate 115 0 R /ModDate 115 0 R /Keywords 116 0 R /AAPL:Keywords 117 0 R >> endobj xref 0 118 0000000000 65535 f 0000326752 00000 n 0000007587 00000 n 0000261440 00000 n 0000000022 00000 n 0000007567 00000 n 0000007691 00000 n 0000231692 00000 n 0000244000 00000 n 0000300146 00000 n 0000319156 00000 n 0000159864 00000 n 0000168259 00000 n 0000168280 00000 n 0000174605 00000 n 0000174626 00000 n 0000185103 00000 n 0000185125 00000 n 0000191386 00000 n 0000000000 00000 n 0000261594 00000 n 0000000000 00000 n 0000323012 00000 n 0000292816 00000 n 0000089993 00000 n 0000159842 00000 n 0000000000 00000 n 0000265145 00000 n 0000008010 00000 n 0000089971 00000 n 0000230414 00000 n 0000230468 00000 n 0000246772 00000 n 0000238451 00000 n 0000201448 00000 n 0000228124 00000 n 0000234467 00000 n 0000194159 00000 n 0000196502 00000 n 0000235675 00000 n 0000196523 00000 n 0000201427 00000 n 0000241227 00000 n 0000228146 00000 n 0000230393 00000 n 0000249548 00000 n 0000191407 00000 n 0000194138 00000 n 0000230521 00000 n 0000231671 00000 n 0000231728 00000 n 0000234446 00000 n 0000234504 00000 n 0000235654 00000 n 0000235712 00000 n 0000238430 00000 n 0000238488 00000 n 0000241206 00000 n 0000241264 00000 n 0000243979 00000 n 0000244036 00000 n 0000246751 00000 n 0000246809 00000 n 0000249527 00000 n 0000261098 00000 n 0000249585 00000 n 0000261076 00000 n 0000261205 00000 n 0000273214 00000 n 0000269645 00000 n 0000296529 00000 n 0000261530 00000 n 0000262105 00000 n 0000261771 00000 n 0000262085 00000 n 0000262347 00000 n 0000265124 00000 n 0000265672 00000 n 0000265326 00000 n 0000265652 00000 n 0000265923 00000 n 0000269624 00000 n 0000269817 00000 n 0000270078 00000 n 0000273193 00000 n 0000273656 00000 n 0000273901 00000 n 0000292794 00000 n 0000293322 00000 n 0000292961 00000 n 0000293302 00000 n 0000293544 00000 n 0000293564 00000 n 0000296234 00000 n 0000293801 00000 n 0000296213 00000 n 0000296509 00000 n 0000296703 00000 n 0000296940 00000 n 0000300125 00000 n 0000300855 00000 n 0000301118 00000 n 0000319133 00000 n 0000319645 00000 n 0000319322 00000 n 0000319624 00000 n 0000319907 00000 n 0000322990 00000 n 0000323500 00000 n 0000323179 00000 n 0000323479 00000 n 0000323752 00000 n 0000326563 00000 n 0000326585 00000 n 0000326638 00000 n 0000326668 00000 n 0000326711 00000 n 0000326731 00000 n trailer << /Size 118 /Root 71 0 R /Info 1 0 R /ID [ ] >> startxref 326888 %%EOF gsoap-2.8.28/gsoap.pc.in0000644000175000017500000000041412653650160014331 0ustar ellertellertprefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: GSoap Description: SOAP C Web Services Version: @VERSION@ Requires: Libs: -L${libdir} -lgsoap Libs.private: @SAMPLE_EXTRA_LIBS@ Cflags: @SOAPCPP2_IPV6@ -DWITH_DOM -I${includedir} gsoap-2.8.28/gsoapssl.pc.in0000644000175000017500000000054612653650160015061 0ustar ellertellertprefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: GSoap Description: SOAP C Web Services with SSL, ZLIB, DOM, and cookies Version: @VERSION@ Requires: Libs: -L${libdir} -lgsoapssl Libs.private: @SAMPLE_SSL_LIBS@ @SAMPLE_EXTRA_LIBS@ Cflags: @SOAPCPP2_IPV6@ @WSDL2H_EXTRA_FLAGS@ -DWITH_DOM -DWITH_COOKIES -I${includedir} gsoap-2.8.28/README.txt0000644000175000017500000003644212653650160013777 0ustar ellertellert================================================================================ Thanks for using gSOAP! The gSOAP toolkit provides a cross-platform software development toolkit for C and C++ server and client Web service applications, and simplifies the overall use of XML in any type of application. The toolkit supports SOAP 1.1/1.2 RPC encoding and document/literal styles, WSDL 1.1, MTOM/MIME/DIME attachments (streaming), SOAP-over-UDP, request-response and one-way messaging. The toolkit also supports WS-Addressing and WS-Security, with several other WS-* available or under development. See the official open-source gSOAP website http://gsoap2.sourceforge.net for project status and latest news. * The gSOAP 'soapcpp2' compiler and code generator and 'stdsoap2' runtime engine are stable since version release 2.1.3. * The gSOAP 'wsdl2h' WSDL/schema parser and code generator is stable since wsdl2h version release 1.1.0. The 'wsdl2h' tool fully supports WSDL 1.1, XML schemas, WS-Policy, and other WS-* protocols (details in the fact sheet). The software is provided "as is", without any warranty. However, gSOAP has been extensively field-tested in production-quality software development. We continue to improve gSOAP and add new features. See NOTES.txt for distributed notes and an overview of the package contents. See INSTALL.txt for installation instructions. See LICENSE.txt for software licensing. ================================================================================ WHAT'S COOL? ================================================================================ The gSOAP 'wsdl2h' tool is a gSOAP application itself, which demonstrates the capabilities of the generic XML handling by the toolkit to parse WSDL, XML schemas, and SOAP/XML. The gSOAP toolkit supports streaming technologies to expedite SOAP/XML and MTOM/MIME attachment transfers of potentially unlimited data lengths. The gSOAP toolkit is the only toolkit that supports the serialization of native C and C++ data types directly in XML. You can use it to export and import your application data in XML without having to write wrapper routines. The gSOAP toolkit ensures as small memory footprint. XML is a processed as a transient format and not buffered. Many optimizations have been applied to reduce resource requirements and to expedite XML parsing. The gSOAP toolkit provides stand-alone HTTP(S) web server functionality as well as Apache mod and IIS hooks (located in gsoap/mod_gsoap). Also CGI and FastCGI are supported. A web server example demonstrating the stand-alone functionality is included in the package. ================================================================================ FEATURES ================================================================================ XML data binding tools for C/C++ XML schema <=> C/C++ type binding means XML and C/C++ data is type safe XML streaming auto-serialization of C/C++ data (with optional use of DOM) XML-RPC from/to JSON from/to C/C++ serialization (also in streaming mode) No need to alter C/C++ types for serialization (declare type as 'volatile') WSDL 1.1/2.0, XSD 1.0/1.1, SOAP 1.1/1.2 compliant REST HTTP(S) 1.0/1.1 operations (GET,PUT,POST etc) for XML, JSON, etc Send and recieve XML over sockets, file FD, and C++ streams WS-I Basic Profile 1.0a, 1.1, and 1.2 compliant W3C schema patterns for data binding full test pattern coverage RSS 0.91, 0.92, 2.0 XML support MIME and MTOM attachment support (also in streaming mode) WS-Security XML authentication, signatures, encryption (also in streaming mode) WS-Policy 1.2, 1.5 and WS-SecurityPolicy 1.2 compliant WS-Addressing 2003/03, 2004/03, 2005/03 compliant WS-ReliableMessaging 1.0 and 1.1 compliant WS-Discovery 1.0/1.1 UDDI v2 API NTLM authentication HTTP basic and digest authentication SSL/TLS communications with SSL session caching (OpenSSL or GNUTLS) Proxy and proxy authentication support Compression (HTTP compression and zlib) IPv4 and IPv6, including direct TCP and UDP data transfer SOAP-over-UDP Apache 1.x and 2.0 modules IIS (ISAPI) and WinInet modules CGI and FastCGI support Stand-alone Web server included (multithreaded, SSL, compression) Integrated memory management with deallocation and leak detection Plug-ins for additional capabilities Internationalization/localization support (UTF8, UCS4, MB encodings, etc) WSDL/XSD conversion to C or C++ and vice versa Portable to small devices (WinCE, Palm, Symbian, VxWorks, Andriod, iPhone) Auto-test server code generation for (dummy) server testing Automatic XML document and message generation from WSDL and XSD C/C++ (cyclic) object graph auto-serialization (with SOAP id-href encoding) STL container auto-serialization and custom C++ container auto-serialization Over 40 example client and server applications included ================================================================================ PACKAGE ================================================================================ This distribution package contains platform-independent source code. Pre-built 'soapcpp2' and 'wsdl2h' binaries are included for the following platforms: * Win32 i386 compatible * MAC OS X The binaries are located in 'gsoap/bin'. Important: these 'wsdl2h' binaries use the default configuration without SSL support (no HTTPS site access). To configure and build the toolkit binaries and libraries, please see the installation instructions in the 'INSTALLATION' section below. ================================================================================ GETTING STARTED ================================================================================ Follow the installation instructions in INSTALL.txt first. The gSOAP 'wsdl2h' tool converts WSDLs into a gSOAP header file for processing with the gSOAP code gnerator 'soapcpp2' to generate XML serialization, stubs, and skeletons code to build Web services applications. Use 'wsdl2h' followed by 'soapcpp2' to translate an entire set of WSDL and XML schemas into representative C or C++ data structures and associated XML parsers. You can also use the gSOAP 'soapcpp2' tool directly on existing C/C++ data structure declarations to create XML serialization routines for these types to simplify the storage of data in XML. Example translation of WSDL to code in two steps: $ wsdl2h -s -o calc.h http://www.cs.fsu.edu/~engelen/calc.wsdl $ soapcpp2 -CL -I/path/to/gsoap/import calc.h The 'calc.h' header file contains the services and XML schema types represented in C/C++, together with other useful information copied from the WSDL related to the service. Run Doxygen on it to generate a nice set of pages. Do not include the wsdl2h-generated 'calc.h' header file directly into your code (the declarations are replicated in the generated code). The header file is processed by the gSOAP stub compiler 'soapcpp2' to generate the following files for your project: soapClient.cpp client-side stub routines for service invocation soapServer.cpp server-side skeleton routines for server development soapC.cpp C/C++ parameter marshalling code calc.nsmap An XML-to-C/C++ namespare mapping table To compile a client, all you need to do is to compile and link 'soapC.cpp', 'soapClient.cpp', and 'stdsoap2.cpp' (or the installed libgsoap++, see INSTALLATION) with your code. To access the service in your code: #include "soapH.h" #include "calc.nsmap" main() { struct soap *soap = soap_new(); // alloc 'soap' engine context double result; if (soap_call_ns2__add(soap, NULL, NULL, 1.0, 2.0, result) == SOAP_OK) std::cout << "The sum of 1.0 and 2.0 is " << result << std::endl; else soap_stream_fault(soap, std::cerr); soap_destroy(soap); // dealloc serialization data soap_end(soap); // dealloc temp data soap_free(soap); // dealloc 'soap' engine context } First, this imports all soapcpp-generated definitions and the namespace mapping table. Then the soap_call_ns2__add() invokes the service. This function is generated from the calc.h file by soapcpp2. The calc.h file includes instructions on what functions to call. To develop a C++ client application based on C++ proxy objects rather than C-like functions, use 'soapcpp2' option -j: $ wsdl2h -s -o calc.h http://www.cs.fsu.edu/~engelen/calc.wsdl $ soapcpp2 -j -CL -I/path/to/gsoap/import calc.h This generates 'soapcalcProxy.h' and 'soapcalcProxy.cpp' with a calcProxy class with service methods that you can use to invoke services. For example: #include "soapcalcProxy.h" #include "calc.nsmap" main() { calcProxy service; double result; if (service.add(1.0, 2.0, result) == SOAP_OK) std::cout << "The sum of 1.0 and 2.0 is " << result << std::endl; else service.soap_stream_fault(std::cerr); service.destroy(); // dealloc serialization and temp data } Compile the above program and link with 'soapC.cpp', 'soapcalcProxy.cpp', and 'stdsoap2.cpp' (or -lgsoap++). To develop a C client, use 'wsdl2h' option -c to generate pure C code. There are many options that you can use depending on the need to develop C applications, C++ with or without STL, or C++ proxy and server objects. In addition, the XML schema type mapping is defined by 'typemap.dat', located in the project root and 'WS' folders. The 'typemap.dat' file is used to customize the 'wsdl2h' output. It is important to use this file for larger projects that depend in WS-* protocols, such as WS-Addressing and WS-Security. More information about the 'wsdl2h' and 'soapcpp2' tools and their options can be found in the gSOAP documentation and the Quick How-To page on the gSOAP Web site, see: http://gsoap2.sourceforge.net See also the 'gsoap/wsdl/README.txt' for more details on the WSDL parser and installation. The 'gsoap/bin' folder includes pre-built 'soapcpp2' and 'wsdlh2' executables for various platforms. ================================================================================ BUILD NOTES ================================================================================ QNX On QNX the bison.simple file is located in $QNX_HOST/usr/share/bison.simple Update your .profile to include: export BISON_SIMPLE=$QNX_HOST/usr/share/bison/bison.simple export BISON_HAIRY=$QNX_HOST/usr/share/bison/bison.hairy WIN32 Bison 1.6 can crash on Win32 systems if YYINITDEPTH is too small Compile with /DYYINITDEPTH=5000 ================================================================================ CHANGELOG ================================================================================ Visit http://www.cs.fsu.edu/~engelen/changelog.html to view the latest changes. ================================================================================ LICENSE ================================================================================ See LICENSE.txt ================================================================================ COPYRIGHT ================================================================================ Copyright (C) 2000-2015 Robert van Engelen, Genivia, Inc. All Rights Reserved. ================================================================================ USE RESTRICTIONS ================================================================================ You may not: (i) transfer rights to gSOAP or claim authorship; or (ii) remove any product identification, copyright, proprietary notices or labels from gSOAP. ================================================================================ WARRANTY ================================================================================ GENIVIA INC. EXPRESSLY DISCLAIMS ALL WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY, OF FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY RIGHTS, AND ANY WARRANTY THAT MAY ARISE BY REASON OF TRADE USAGE, CUSTOM, OR COURSE OF DEALING. WITHOUT LIMITING THE FOREGOING, YOU ACKNOWLEDGE THAT THE SOFTWARE IS PROVIDED "AS IS" AND THAT GENIVIA INC. DO NOT WARRANT THE SOFTWARE WILL RUN UNINTERRUPTED OR ERROR FREE. LIMITED LIABILITY: THE ENTIRE RISK AS TO RESULTS AND PERFORMANCE OF THE SOFTWARE IS ASSUMED BY YOU. UNDER NO CIRCUMSTANCES WILL GENIVIA INC. BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES OF ANY KIND OR NATURE WHATSOEVER, WHETHER BASED ON CONTRACT, WARRANTY, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, ARISING OUT OF OR IN ANY WAY RELATED TO THE SOFTWARE, EVEN IF GENIVIA INC. HAS BEEN ADVISED ON THE POSSIBILITY OF SUCH DAMAGE OR IF SUCH DAMAGE COULD HAVE BEEN REASONABLY FORESEEN, AND NOTWITHSTANDING ANY FAILURE OF ESSENTIAL PURPOSE OF ANY EXCLUSIVE REMEDY PROVIDED. SUCH LIMITATION ON DAMAGES INCLUDES, BUT IS NOT LIMITED TO, DAMAGES FOR LOSS OF GOODWILL, LOST PROFITS, LOSS OF DATA OR SOFTWARE, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION OR IMPAIRMENT OF OTHER GOODS. IN NO EVENT WILL GENIVIA INC. BE LIABLE FOR THE COSTS OF PROCUREMENT OF SUBSTITUTE SOFTWARE OR SERVICES. YOU ACKNOWLEDGE THAT THIS SOFTWARE IS NOT DESIGNED FOR USE IN ON-LINE EQUIPMENT IN HAZARDOUS ENVIRONMENTS SUCH AS OPERATION OF NUCLEAR FACILITIES, AIRCRAFT NAVIGATION OR CONTROL, OR LIFE-CRITICAL APPLICATIONS. GENIVIA INC. EXPRESSLY DISCLAIM ANY LIABILITY RESULTING FROM USE OF THE SOFTWARE IN ANY SUCH ON-LINE EQUIPMENT IN HAZARDOUS ENVIRONMENTS AND ACCEPTS NO LIABILITY IN RESPECT OF ANY ACTIONS OR CLAIMS BASED ON THE USE OF THE SOFTWARE IN ANY SUCH ON-LINE EQUIPMENT IN HAZARDOUS ENVIRONMENTS BY YOU. FOR PURPOSES OF THIS PARAGRAPH, THE TERM "LIFE-CRITICAL APPLICATION" MEANS AN APPLICATION IN WHICH THE FUNCTIONING OR MALFUNCTIONING OF THE SOFTWARE MAY RESULT DIRECTLY OR INDIRECTLY IN PHYSICAL INJURY OR LOSS OF HUMAN LIFE. ================================================================================ EXTERNAL THIRD-PARTY LIBRARIES ================================================================================ The gSOAP toolkit is self-contained and does not require any third-party software to run in its standard configuration. When compression and SSL encryption are required the Zlib and OpenSSL libraries must be installed. To build the gSOAP 'soapcpp2' compiler, you must have Bison and Flex installed or the older Yacc and Lex equivalents. Note that licensing differs for Flex versus Lex, and Bison versus Yacc. Win32 builds of clients and services requires winsock.dll. To do this in Visual C++ 6.0, go to "Project", "settings", select the "Link" tab (the project file needs to be selected in the file view) and add "wsock32.lib" to the "Object/library modules" entry. The distribution contains a Visual Studio 2005 project example in the 'samples/calc_vs2005' folder with the necessary project settings to link libraries and automatically invoke to soapcpp2 compiler as a custom build. ================================================================================ DISCLAIMER ================================================================================ WE PROVIDE YOU WITH "REAL-WORLD" EXAMPLES BUT WE CANNOT GUARANTEE THAT ALL CLIENT EXAMPLES CAN CONNECT TO THIRD PARTY WEB SERVICES WHEN THESE SERVICES ARE DOWN OR HAVE BEEN REMOVED. ================================================================================ gsoap-2.8.28/gsoap++.pc.in0000644000175000017500000000042012653650160014454 0ustar ellertellertprefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: GSoap Description: SOAP C++ Web Services Version: @VERSION@ Requires: Libs: -L${libdir} -lgsoap++ Libs.private: @SAMPLE_EXTRA_LIBS@ Cflags: @SOAPCPP2_IPV6@ -DWITH_DOM -I${includedir} gsoap-2.8.28/gsoap/0000755000175000017500000000000012654077575013417 5ustar ellertellertgsoap-2.8.28/gsoap/ios_plugin/0000755000175000017500000000000012653650146015555 5ustar ellertellertgsoap-2.8.28/gsoap/ios_plugin/ios_plugin/0000744000175000017500000000000012653650150017716 5ustar ellertellertgsoap-2.8.28/gsoap/ios_plugin/ios_plugin/docs/0000744000175000017500000000000012654077575020665 5ustar ellertellertgsoap-2.8.28/gsoap/ios_plugin/ios_plugin/docs/geoip-result.eps0000644000175000017500000532625412653650146024026 0ustar ellertellert%!PS-Adobe-3.0 EPSF-3.0 %%Creator: (ImageMagick) %%Title: (geoip-result.eps) %%CreationDate: (2012-06-08T01:00:35-04:00) %%BoundingBox: 0 0 400 582 %%HiResBoundingBox: 0 0 399.95 582 %%DocumentData: Clean7Bit %%LanguageLevel: 1 %%Pages: 1 %%EndComments %%BeginDefaults %%EndDefaults %%BeginProlog % % Display a color image. The image is displayed in color on % Postscript viewers or printers that support color, otherwise % it is displayed as grayscale. % /DirectClassPacket { % % Get a DirectClass packet. % % Parameters: % red. % green. % blue. % length: number of pixels minus one of this color (optional). % currentfile color_packet readhexstring pop pop compression 0 eq { /number_pixels 3 def } { currentfile byte readhexstring pop 0 get /number_pixels exch 1 add 3 mul def } ifelse 0 3 number_pixels 1 sub { pixels exch color_packet putinterval } for pixels 0 number_pixels getinterval } bind def /DirectClassImage { % % Display a DirectClass image. % systemdict /colorimage known { columns rows 8 [ columns 0 0 rows neg 0 rows ] { DirectClassPacket } false 3 colorimage } { % % No colorimage operator; convert to grayscale. % columns rows 8 [ columns 0 0 rows neg 0 rows ] { GrayDirectClassPacket } image } ifelse } bind def /GrayDirectClassPacket { % % Get a DirectClass packet; convert to grayscale. % % Parameters: % red % green % blue % length: number of pixels minus one of this color (optional). % currentfile color_packet readhexstring pop pop color_packet 0 get 0.299 mul color_packet 1 get 0.587 mul add color_packet 2 get 0.114 mul add cvi /gray_packet exch def compression 0 eq { /number_pixels 1 def } { currentfile byte readhexstring pop 0 get /number_pixels exch 1 add def } ifelse 0 1 number_pixels 1 sub { pixels exch gray_packet put } for pixels 0 number_pixels getinterval } bind def /GrayPseudoClassPacket { % % Get a PseudoClass packet; convert to grayscale. % % Parameters: % index: index into the colormap. % length: number of pixels minus one of this color (optional). % currentfile byte readhexstring pop 0 get /offset exch 3 mul def /color_packet colormap offset 3 getinterval def color_packet 0 get 0.299 mul color_packet 1 get 0.587 mul add color_packet 2 get 0.114 mul add cvi /gray_packet exch def compression 0 eq { /number_pixels 1 def } { currentfile byte readhexstring pop 0 get /number_pixels exch 1 add def } ifelse 0 1 number_pixels 1 sub { pixels exch gray_packet put } for pixels 0 number_pixels getinterval } bind def /PseudoClassPacket { % % Get a PseudoClass packet. % % Parameters: % index: index into the colormap. % length: number of pixels minus one of this color (optional). % currentfile byte readhexstring pop 0 get /offset exch 3 mul def /color_packet colormap offset 3 getinterval def compression 0 eq { /number_pixels 3 def } { currentfile byte readhexstring pop 0 get /number_pixels exch 1 add 3 mul def } ifelse 0 3 number_pixels 1 sub { pixels exch color_packet putinterval } for pixels 0 number_pixels getinterval } bind def /PseudoClassImage { % % Display a PseudoClass image. % % Parameters: % class: 0-PseudoClass or 1-Grayscale. % currentfile buffer readline pop token pop /class exch def pop class 0 gt { currentfile buffer readline pop token pop /depth exch def pop /grays columns 8 add depth sub depth mul 8 idiv string def columns rows depth [ columns 0 0 rows neg 0 rows ] { currentfile grays readhexstring pop } image } { % % Parameters: % colors: number of colors in the colormap. % colormap: red, green, blue color packets. % currentfile buffer readline pop token pop /colors exch def pop /colors colors 3 mul def /colormap colors string def currentfile colormap readhexstring pop pop systemdict /colorimage known { columns rows 8 [ columns 0 0 rows neg 0 rows ] { PseudoClassPacket } false 3 colorimage } { % % No colorimage operator; convert to grayscale. % columns rows 8 [ columns 0 0 rows neg 0 rows ] { GrayPseudoClassPacket } image } ifelse } ifelse } bind def /DisplayImage { % % Display a DirectClass or PseudoClass image. % % Parameters: % x & y translation. % x & y scale. % label pointsize. % image label. % image columns & rows. % class: 0-DirectClass or 1-PseudoClass. % compression: 0-none or 1-RunlengthEncoded. % hex color packets. % gsave /buffer 512 string def /byte 1 string def /color_packet 3 string def /pixels 768 string def currentfile buffer readline pop token pop /x exch def token pop /y exch def pop x y translate currentfile buffer readline pop token pop /x exch def token pop /y exch def pop currentfile buffer readline pop token pop /pointsize exch def pop /Times-Roman findfont pointsize scalefont setfont x y scale currentfile buffer readline pop token pop /columns exch def token pop /rows exch def pop currentfile buffer readline pop token pop /class exch def pop currentfile buffer readline pop token pop /compression exch def pop class 0 gt { PseudoClassImage } { DirectClassImage } ifelse } bind def %%EndProlog %%Page: 1 1 %%PageBoundingBox: 0 0 400 582 userdict begin DisplayImage 0 0 399.95 581.927 12.000000 400 582 0 0 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000838383C4C4C4DCDCDCE2E2E2E2E2E2E2E2E2E2E2E2E2E2E2 E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2 E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2 E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2 E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2 E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2 E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2 E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2 E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2 E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2 E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2 E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2 E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2 E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2 E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2 E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2 E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2 E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2 E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2 E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2 E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2 E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2 E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2 E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2 E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2DBDBDBC5C5C5848484000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000848484D2D2D2D6D6D6D1D1D1CFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCF CFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCF CFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCF CFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCF CFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCF CFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCF CFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCF CFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCF CFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCF CFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCF CFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCF CFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCF CFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCF CFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCF CFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCF CFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCF CFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCF CFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCF CFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCF CFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCF CFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCF CFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCF CFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCF CFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCF CFCFCFCFCFCFCFCFCFCFCFCFCFCFCFD1D1D1D6D6D6D2D2D2848484000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000BEBEBED0D0D0 CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD CDCDCDCDCDCDCDCDCDCDCDCDD0D0D0BCBCBC000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CDCDCDCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CACACAD1D1D1E4E4E4E4E4E4E3E4E3E2E3E2E0E1E0DFE0DFD6D7D6D5D5D5C8C8C8CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCDCDCD000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CCCCCCCACACACACACACACACACACACACACACACACACACACACA C9C9C9C5C5C5BEBEBEB1AAAA9064667C3B3E7933357933357B3A3E906466B1AAAABEBEBEC5C5C5 C9C9C9CACACACACACACACACACACACACACACACACACACACACAC9C9C9C5C5C5BEBEBEB6AAA9A86162 A23536A32D2DA32D2DA23536A86162B6AAA9BEBEBEC5C5C5C9C9C9CACACACACACACACACACACACA CACACACACACACACACAC9C9C9C7C7C7C3C3C3B7B7B7979797888888868887878786868686979797 B7B7B7C3C3C3C7C7C7C9C9C9CACACACACACACACACACACACACACACACACACACACACACACACACACACA CACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACA CACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACA CACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACA CACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACA CACACACACACACACACACACACACACACACACACACACACACACACACACACACACACAC8C8C8D4D4D4E7E7E7 E7E7E7E5E6E5E4E5E4E3E4E3E2E3E2DBDBDBD1D2D1D7D7D7C8C8C8CACACACACACACACACACACACA CACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACA CACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACA CACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACA CACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACA CACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACA CACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACA CACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACA CACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACA CACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACA CACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACA CACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACA CACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACA CACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACCCCCC 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C3C3C3BABABA9C7F82 74232980313494484CA36567A3646794474B7F30347423279C7F82BABABAC3C3C3C8C8C8C8C8C8 C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C3C3C3BABABAAD817DA3271EAD392EBD564AC67169C7726B BD574BAE3B2FA3271EAD817DBABABAC3C3C3C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8 C5C5C5C0C0C0A5A5A58484849090909C9C9BA6A6A5A4A4A49A9A998E8E8E828282A5A5A5C0C0C0 C5C5C5C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8 C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8 C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8 C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8 C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8 C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C6C6C6D5D6D6E8E9E8E8E9E8E7E9E8E7E7E7 E5E6E5E4E5E4E0E0E0C4C5C4D7D7D7D6D7D6C6C6C6C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8 C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8 C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8 C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8 C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8 C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8 C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8 C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8 C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8 C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8 C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8 C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8 C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8 C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000C6C6C6 C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6BCBCBC9C8081761C2393252EBC4349E18F93 F8DFDFF8DCDDE08B8FBC3F4793252C761C239C8081BCBCBCC6C6C6C6C6C6C6C6C6C6C6C6C6C6C6 C6C6C6C6C6C6BCBCBCAC827EA82712BC421CD8713CE9AD86F7E8D8F7EADAEBB08BD9723FBC431C A82712AC827EBCBCBCC6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6BFBFBFA5A5A58A8A8A 9A9B9AB1B1B0C6C7C5D6D6D4D4D4D3C4C4C2AFAFAE9A9A9A8A8A8AA5A5A5BFBFBFC6C6C6C6C6C6 C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6 C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6 C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6 C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6 C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6 C6C6C6C6C6C6C6C6C6C6C6C6C4C4C4D8D8D8EBECEBEBECEBEAEAEAE8E9E8E7E9E8E7E8E7E3E5E4 BDBFBEE4E4E4DDDDDDD7D8D7C5C5C5C6C6C6C6C6C6C6C6C6C6C6C6C6C6BC8A654747658ABFC6C6 C6C6C6C6C6C6C6C6C6C6C6B57B503E6B8EAEAA8E6B3D5D85BCC6C6C6C6C6C6C6C6C6C6C6C6C6C6 C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6 C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6 C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6 C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6 C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6 C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6 C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6 C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6 C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6 C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6 C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6 C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000C4C4C4C4C4C4C4C4C4C4C4C4 C4C4C4C4C4C4C4C4C4C4C4C4AFA8A87C242C9C1B25CC142BE42E3CF2676FF9A6A9F9A4A7F1646A E42A3BCC14299C1B257C242CAFA8A8C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4B2A8A7 AA3314C14A0CE07214E88936EFAA6CF5D0ACF5D1AEEFAC70E98A37E07217C14A0CAA3314B2A8A7 C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4B4B4B4939393A3A3A3B7B7B7C0C0BFC7C7C6 CECECDCDCDCCC4C4C4BFBFBFB7B7B7A3A3A3939393B4B4B4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4 C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4 C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4 C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4 C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4 C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4 C4C4C4C2C2C2DADBDAEDEEEDE4E5E4E0E0E0EBECEBEAEBEAE5E3E4E4E5E4C4C4C4E4E4E4D7D7D9 D7D7D9E2E3E2C4C4C4C4C4C4C4C4C4C4C4C4C4C4C7AC854E00002693B4C4C4C4C4C4C4C4C4C4C4 BEA57C0000008AB3C3A77B35000077B9C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4 C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4 C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4 C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4 C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4 C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4 C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4 C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4 C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4 C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4 C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4 C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4838383C4C4C4C4C4C4C4C4C4 C4C4C4C4C4C4C4C4C4C4C4C4000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1 C1C1C196686C8E1F26D20A26EA0023F60027FD2B3DFF5760FF545DFD293AF60027EA0023D20A26 8E1F2696686CC1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1AB6E5DB64410E67E1BEC8C27 F09935F4A84FF6BB72F6BB73F3A950F09A36EC8C27E67E1BB64410AB6E5DC1C1C1C1C1C1C1C1C1 C1C1C1C1C1C1C1C1C1C1C1C1A3A3A3A3A3A3BABABABEBEBEBFBFBFC2C2C2C5C7C6C6C6C5C2C2C2 BFBFBFBEBEBEBABABAA3A3A3A3A3A3C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1 C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1 C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1 C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1 C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1 C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1BFBFBFDCDCDC F0F0F0F0F0F0EFEFEFEDEEEDE9E9E9B3A4A6E9EBEAAEAEAEA9AAA9A0A1A0999999CBCBCBC1C1C1 C1C1C1C1C1C1C1C1C1C1C1C1CABF9F2700004A80A3C1C1C1C1C1C1C1C1C1956626002775BFC8C3 CAD2D9DADAD3C5C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1 C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1 C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1 C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1 C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1 C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1 C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1 C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1 C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1 C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1 C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1ACACAC3B3B3B 110F110B0B0B2B2B2B878787C1C1C1989898222222C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1 C1C1C1000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000BFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBF9D3F46BB1929 EB0025FC0024FF0024FF0029FF1933FF1933FF0529FF0026FC0026EB0227BB19299D4147BFBFBF BFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBA5C27D46D1CEE942FF3A43BF7AF45FAB84DFCBE57 FCBE55FAB84DF7AF45F3A43BEE942FD46D1CBA5C28BFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBF BFBFBF9E9E9EB0B0B0BEBEBEC1C1C1C2C2C2C3C3C3C5C5C5C4C4C4C3C3C3C2C2C2C1C1C1BEBEBE B0B0B09E9E9EBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBF BFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBF BFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBF BFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBF BFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBF BFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBDBDBDDFDFDFF2F2F2F2F2F2F0F2F1 F0F0F0DCCED0C4858ADDD4D2EBEBEBD4D5D4D2D3D2ADADADD7D7D9BFBFBFBFBFBFBFBFBFBFBFBF BFBFBFBFC4C48C4E0000256BAFBFBFBFBFBFBFBCA15200004E8CB1C4BFBFA4805A224C7CB6BFBF BFBFBFBFB29D613B000000000000227292ACBFBFBFA17C4D224577B2BFBFBFBFBFAF926C22003B 85A8B9BFBFBFBFB9A1542222779DB6BFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBF BFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBF BFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBF BFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBF BFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBF BFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBF BFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBF BFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBF BFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBF BFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFAFAFAF1D1D1D2525252D2D2D2D2D2D282828 1919195252522222223B3B3BBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 BDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDAA2633D21A2DFA1630FF1E33FF2639 FF2E3EFF3342FF3544FF3040FF2A3BFF2336FA1932D21A2EAA2633BDBDBDBDBDBDBDBDBDBDBDBD BDBDBDBDBDBDBDBDBDC6631CE1892EF4A941F9B94BFDC354FFCA59FFCD5BFFCD5BFFCA59FDC453 F9B94DF4A941E1892EC6631CBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBD9F9F9FB7B7B7 C0C0C0C3C3C3C4C4C4C6C6C6C7C7C7C7C7C7C6C6C6C4C4C4C3C3C3C0C0C0B7B7B79F9F9FBDBDBD BDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBD BDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBD BDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBD BDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBD BDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBD BDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBBBBBBDFE0DFF4F5F4F4F5F4F3F3F3DADDE1847B8EEBE7E9 DC8C93ECEDEDECEDEDEBEBEBD7D8D7D7D8D7BDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBFBC9D6D 000000799FB7BDBDBDB0956B0000279DBCC6BDBDBDA27434002574B7BDBDBDBDA65A0000004C80 B5C5C19F80560000238CADBDB5986C0000258FADBDBDBDB77E4800000000497FA1BDBDBDB09265 000043AABFC0BDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBD BDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBD BDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBD BDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBD BDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBD BDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBD BDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBD BDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBD BDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBD BDBDBDBDBDBDBDBDBDBDBDBD5D5D5D8A8A8ACDCDCDC9C9C98E8E8E343434343434262626313131 404040BDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBD000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000BABABABABABABABABA BABABABABABABABABABABABABABABAB02F3BD92737FF3340FF3E4AFF4A54FF565FFF6269FF636A FF5A62FF4D57FF414DFF3644DA2B39AF333CBABABABABABABABABABABABABABABABABABABABABA C76B25E4983BF9BA4EFDC85AFFD160FFD764FFDC69FFDC69FFD864FFD260FDC85AF9BA4FE4983B C76B25BABABABABABABABABABABABABABABABABABABABABAA0A0A0B8B8B8C3C3C3C5C5C5C8C8C8 CACACACCCCCCCCCCCCCACACAC8C8C8C5C5C5C3C3C3B8B8B8A0A0A0BABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABAB8B8B8E2E2E2F6F6F6B8B5AEB6B5BCDACB65898984BEC6C3BA7E7BC0ABAABCBAB0 A3A2A0ECEDEDD9DAD9BABABABABABABABABABABABABABABABABABABFC1AA4D000025638FBABABA 84500000438AC1BFBABABABAA17A3500257AB4BABAB19973000000668DA5AFA8ACB0A98D260000 6C96AEBFBEA23600005885A7BAB7973F0000000000003F79B7BABA845000005E98C4BCBABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABA707070CACACABDBDBDBEBEBECBCBCB999999393939393939393939434343BABABABABABA BABABABABABABABABABABABABABABA000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8 B8B8B8B8B8B8B5565CD3343FFF4A55FF5961FF696FFF797EFF878BFF878BFF7C81FF6D73FF5D65 FF4E58D33842B6575DB8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8C27A42DF9A44FBC65A FFD364FFDC69FFE36EFFE773FFE873FFE36FFFDC69FFD564FCC75ADF9B44C27A42B8B8B8B8B8B8 B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8A4A4A4B6B6B6C4C4C4C8C8C8CBCBCBCECECECFCFCFCFCFCF CECECECBCBCBC8C8C8C5C5C5B6B6B6A4A4A4B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8 B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8 B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8 B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8 B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8 B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B6B6B6 E3E5E4F8F9F8E6D7C2E7D065D1B145EDDABBE8C377DEBE9BA0949AEADBAABCAA8AEFEFEFDBDBDB B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8BAC29F6C260000579BA9943E0000659CB5BAB8B8 B8B8B8A07835002578B2B8B8B5A37E00000000000000000000000000002680A1B3B8BBBE894200 0058849E8D63000072AEA67E00003F95A29448000072A7BAB8B8B8B8B8B8B8B8B8B8B8B8B8B8B8 B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8 B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8 B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8 B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8 B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8 B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8 B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8 B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8 B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8AAAAAAB8B8B8 B8B8B8B8B8B8ABABAB5B5B5B3E3E3E3E3E3E3E3E3E474747B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8 B8B8B8B8B8B8000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6BA8486 BE3C43FF5E66FF7076FF8286FF9497FFA0A3FFA1A3FF9699FF8589FF757AFF6369BE3F45BA8487 B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6BC9274CF8F43FCCD61FFDC6AFFE36FFFE975 FFEE79FFEE7AFFEA76FFE370FFDC6AFBCE61D08F41BC9274B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6 B6B6B6B6B6B6ADADADACACACC4C4C4CACACACDCDCDD0D0D0D2D2D2D2D2D2D0D0D0CDCDCDCACACA C4C4C4ACACACADADADB6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6 B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6 B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6 B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6 B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6 B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B4B4B4E6E6E6FAFAFAF5F5F3 DDBE26CCCBCFF0F1F1F5F5F4EBECEC8E9196BEBFBDEDEDEDF1F1F1DEDEDEB6B6B6B6B6B6B6B6B6 B6B6B6B6B6B6B6B6B6B6B6B6BDAC8800000022220000004CA5BEBCB6B6B6B6B6B69E7834002578 B0B6B6AF9A7200000078A9C9D3D3D3D3D3D3D3D3D2C9C1B9B6B6B8B08C5D0000243100004278A8 C1BFA6420000233023000055ACBFBAB6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6 B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6 B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6 B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6 B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6 B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6 B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6 B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6 B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6 B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6BBBBBBB6B6B6B6B6B6959595252525 3A3A3A4141414141414141414A4A4AB6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3BEB5B5BC5C62DD6569FF8488 FF9699FFA5A7FFAFB1FFAFB1FFA6A9FF999CFF878BDF696DBC6064BEB5B5B3B3B3B3B3B3B3B3B3 B3B3B3B3B3B3B3B3B3B3B3B3BDB7B4C68A46E2B55AFFE06FFFE775FFED79FFF07CFFEF7CFFEE7A FFE876FFE170E2B65AC68B46BDB7B4B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B7B7B7 A8A8A8BCBCBCCBCBCBCECECED1D1D1D2D2D2D2D2D2D1D1D1CECECECBCBCBBCBCBCA8A8A8B7B7B7 B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3 B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3 B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3 B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3 B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3 B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B1B1B1E7E7E7FCFCFCC8C385B3AA93E1E1E1F9F9F9 F9F9F9F7F8F7F4F4F4C3AE90F2F2F1F4F4F4E0E0E0B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3 B3B3B3B5BDB5712600000000266394BFB5B3B3B3B3B3B3B39C7734002477ADB3B3B6BCB1630000 0000498193A1AAAAA79A938C93A4ADB3B3B3BBB49326000000000086ADB8B3B4B8864B00000000 266A9CBDB4B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3 B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3 B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3 B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3 B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3 B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3 B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3 B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3 B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3 B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B4B4B4B3B3B3B3B3B3B9B9B9CECECED1D1D1D1D1D1D1D1D1 D1D1D1D0D0D0B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000B0B0B0B0B0B0 B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B2B2B2C1A1A3C46D6FE68D90FFA1A4FFAFB1FFB7B9 FFB8BAFFB1B3FFA3A5E69092C67073C2A2A3B2B2B2B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0 B0B0B0B2B2B2BEA998C9984DE7C666FFE877FFED7BFFF07CFFEF7CFFEE7BFEE877E7C867CA994F BEA998B2B2B2B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B1B1B1B3B3B3ACACACC1C1C1 CDCDCDD0D0D0D2D2D2D2D2D2D0D0D0CDCDCDC1C1C1ACACACB3B3B3B1B1B1B0B0B0B0B0B0B0B0B0 B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0 B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0 B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0 B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0 B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0 B0B0B0B0B0B0B0B0B0AEAEAEE9E9E9FDFDFDBAB6B3CBCBCCFCFCFCFBFBFBFAFAFAF9F9F9F9F9F9 C9C1B6D7D7D4F5F5F5E1E1E1B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B6AB8B5C 0000007BA1B4B0B0B0B0B0B0B0B0B09B7B3F003476ABB0B0B0B1B8C9C2AB6A4100000000000000 0000007096A9B0B0B0B0B6B476350000256AB0B9B2B0B0B2AC8E5C00000081A5B6B0B0B0B0B0B0 B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0 B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0 B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0 B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0 B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0 B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0 B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0 B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0 B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0 B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0 B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000AFAFAFAFAFAFAFAFAFAFAFAFAFAFAF AFAFAFAFAFAFAFAFAFADADADBBBBBBC3A4A5C6797DDB9C9EEEABADF7B3B4F7B3B5EEACAEDC9E9F C77D80C3A4A5BBBBBBADADADAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFADADADBBBBBB BEAB9AC79B56DCBD65EED671F8E277F7E378EFD872DDBE66C89D58BEAB9ABBBBBBADADADAFAFAF AFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFADADADB5B5B5B5B5B5ADADADBBBBBBC6C6C6CBCBCB CBCBCBC6C6C6BCBCBCADADADB5B5B5B5B5B5ADADADAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAF AFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAF AFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAF AFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAF AFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAF AFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAF ADADADEAEAEAFFFFFFFFFFFFFEFEFEFDFDFDFCFDFDFCFDFCFBFBFBFAFAFAF9F9F9F8F8F8F8F8F8 E4E4E4AFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFB9C2CACFCFCFC5BCB4AFAFAF AFAFAFAFAFAFBBC4CDCFCDC5B3AFAFAFAFAFAFB4BBC8CCCFC8C5C1C1C1C5CCCFCFC5BBB3AFAFAF AFAFB4C6CDCFCFCEC8B6AFAFAFAFAFB7C1CACFCFCFC4BBB3AFAFAFAFAFAFAFAFAFAFAFAFAFAFAF AFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAF AFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAF AFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAF AFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAF AFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAF AFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAF AFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAF AFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAF AFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAF AFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAF AFAFAFAFAFAFAFAFAF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000ADADADADADADADADADADADADADADADADADADADADADADADAD ACACACACACACBABABACBC3C4C19394C7898CD19497D19598C78B8CC29394CBC3C4BABABAACACAC ACACACADADADADADADADADADADADADADADADADADADADADADACACACACACACBABABACAC5C2BA9F81 C29D64D2AB60D1AC61C39F65BA9F82CAC5C2BABABAACACACACACACADADADADADADADADADADADAD ADADADADADADADADADACACACACACACB5B5B5BDBDBDB2B2B2AFAFAFB2B2B2B2B2B2AFAFAFB2B2B2 BDBDBDB5B5B5ACACACACACACADADADADADADADADADADADADADADADADADADADADADADADADADADAD ADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADAD ADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADAD ADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADAD ADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADAD ADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADABABABEAEAEAFFFFFF FFFFFFFFFFFFFFFFFFFEFEFEFEFEFEFDFDFDFCFDFCFBFCFBFAFAFAF9F9F9E5E5E5ADADADADADAD ADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADAD ADADADADADADADADADADADADADADADB0B1B2B2B2B1AEADADADADADADADADADADADADADADADADAD ADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADAD ADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADAD ADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADAD ADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADAD ADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADAD ADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADAD ADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADAD ADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADAD ADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADAD ADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADAD ADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADAD 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000ABABABABABABABABABABABABABABABABABABABABABABABABABABABA9A9A9ABABAB B0B0B0BFBFBFCBCBCBD0D0D0D0D0D0CBCBCBBFBFBFB0B0B0ABABABA9A9A9ABABABABABABABABAB ABABABABABABABABABABABABABABABABABABA9A9A9ABABABB0B0B0BFBFBFCBCBCBD0D0D0D0D0D0 CBCBCBBFBFBFB0B0B0ABABABA9A9A9ABABABABABABABABABABABABABABABABABABABABABABABAB ABABABAAAAAAAAAAAAAEAEAEB7B7B7BEBEBEC1C1C1C1C1C1BEBEBEB7B7B7AEAEAEAAAAAAAAAAAA ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABAB818181737373737373737373737373 7373737373737373737373737373737373737373738C8C8CABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000A9A9A9 A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A8A8A8A9A9A9A9A9A9ABABAB ABABABABABABABABABA9A9A9A9A9A9A8A8A8A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9 A9A9A9A9A9A9A9A9A9A9A9A9A8A8A8A9A9A9A9A9A9ABABABABABABABABABABABABA9A9A9A9A9A9 A8A8A8A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9 A8A8A8A9A9A9A9A9A9AAAAAAAAAAAAA9A9A9A9A9A9A8A8A8A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9 A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9 A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9 A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9 A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9 A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9 A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9 A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9 A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9 A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9 A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9 A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9 A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9 A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9 A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9 A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9 A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9 A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9 A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9 A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9 A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000A8A8A8A8A8A8A8A8A8A8A8A8 A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8 A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8 A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8 A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8 A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8 A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8 A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8 A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8 A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8 A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8 A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8 A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8 A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8 A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8 A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8 A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8 A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8 A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8 A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8 A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8 A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8 A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8 A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8 A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8 A8A8A8A8A8A8A8A8A8A8A8A8000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000515151515151515151515151515151515151515151 515151515151515151515151515151515151515151515151515151515151515151515151515151 515151515151515151515151515151515151515151515151515151515151515151515151515151 515151515151515151515151515151515151515151515151515151515151515151515151515151 515151515151515151515151515151515151515151515151515151515151515151515151515151 515151515151515151515151515151515151515151515151515151515151515151515151515151 515151515151515151515151515151515151515151515151515151515151515151515151515151 515151515151515151515151515151515151515151515151515151515151515151515151515151 515151515151515151515151515151515151515151515151515151515151515151515151515151 515151515151515151515151515151515151515151515151515151515151515151515151515151 515151515151515151515151515151515151515151515151515151515151515151515151515151 515151515151515151515151515151515151515151515151515151515151515151515151515151 515151515151515151515151515151515151515151515151515151515151515151515151515151 515151515151515151515151515151515151515151515151515151515151515151515151515151 515151515151515151515151515151515151515151515151515151515151515151515151515151 515151515151515151515151515151515151515151515151515151515151515151515151515151 515151515151515151515151515151515151515151515151515151515151515151515151515151 515151515151515151515151515151515151515151515151515151515151515151515151515151 515151515151515151515151515151515151515151515151515151515151515151515151515151 515151515151515151515151515151515151515151515151515151515151515151515151515151 515151515151515151515151515151515151515151515151515151515151515151515151515151 515151515151515151515151515151515151515151515151515151515151515151515151515151 515151515151515151515151515151515151515151515151515151515151515151515151515151 515151515151515151515151515151515151515151515151515151515151515151515151515151 515151515151515151515151515151515151515151515151515151515151515151515151515151 515151000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000F1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FB F1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FB F1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FB F1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FB F1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FB F1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FB F1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FB F1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FB F1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FB F1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FB F1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FB F1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FB F1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FB F1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FB F1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FB F1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FB F1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FB F1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FB F1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FB F1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FB F1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FB F1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FB F1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FB F1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FB F1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBEFF7F9EFF7F9000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9 EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9 EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9 EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9 EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9 EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9 EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9 EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9 EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9 EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9 EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9 EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9 EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9 EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9 EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9 EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9 EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9 EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9 EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9 EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9 EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9 EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9 EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9 EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9 EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000EDF6F8EDF6F8EDF6F8 EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8 EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8 EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8 EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8 EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8 EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8 EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8 EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8 EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8 EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8 EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8 EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8 EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8 EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8 EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8 EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8 EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8 EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8 EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8 EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8 EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8 EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8 EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8 EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8 EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7 ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7 ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7 ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7 ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7 ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7 ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7 ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7 ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7 ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7 ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7 ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7 ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7 ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7 ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7 ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7 ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7 ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7 ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7 ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7 ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7 ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7 ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7 ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7 ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7 ECF3F7ECF3F7000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4 EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4 EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4 EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4 EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4 EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4 EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4 EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4 EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4 EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4 EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4 EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4 EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4 EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4 EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4 EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4 EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4 EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4 EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4 EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4 EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4 EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4 EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4 EAF2F479829649556F49556F49556F49556F49556F49556F49556F49556F49556F49556F363E53 38425649556F49556F49556F49556F49556F798296EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2 E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2 E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2 E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2 E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2 E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2 E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2 E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2 E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2 E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2 E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2 E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2 E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2 E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2 E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2 E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2 E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2 E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2 E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2 E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2 E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2 E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2 E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2505B748CEE71 57E83357E83357E83357E83357E83357E83357E83352D82F22620E2A611B6AEA4B57E83357E833 57E83357E8338DEF71505B74E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000E4EDEFE4EDEF E4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEF E4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEF E4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEF E4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEF E4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEF E4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEF E4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEF E4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEF E4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEF E4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEF E4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEF E4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEF E4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEF E4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEF E4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEF E4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEF E4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEF E4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEF E4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEF E4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEF E4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEF E4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEF E4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEF59647BC4FEAAAEFE8AAEFE8AAEFE8A AEFE8AAEFE8AAEFE8A7AB4600F1A0A1B2815B4F099AEFE8AAEFE8AAEFE8AAEFE8AAEFE8AC4FEAA 59647BE4EDEFE4EDEFE4EDEFE4EDEFE4EDEF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000E3EAEDE3EAEDE3EAEDE3EAEDE3EAED E3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAED E3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAED E3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAED E3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAED E3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAED E3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAED E3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAED E3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAED E3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAED E3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAED E3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAED E3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAED E3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAED E3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAED E3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAED E3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAED E3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAED E3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAED E3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAED E3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAED E3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAED E3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAED E3EAEDE3EAEDE3EAEDE3EAEDE3EAED636D83D1FFB3C2FF96C2FF96C2FF96C2FF96AFEA87455F33 000000000000728D60C3FF98C2FF96C2FF96C2FF96C2FF96C2FF96D2FFB3636D838188989CA4B2 E3EAEDE3EAEDE3EAED000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000E1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EB E1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EB E1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EB E1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EB E1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EB E1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EB E1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EB E1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EB E1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EB E1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EB E1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EB E1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EB E1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EB E1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EB E1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EB E1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EB E1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EB E1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EB E1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EB E1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EB E1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EB E1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EB E1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EB E1E7EBE1E7EB6C7589B4FF9497FF6997FF6997FF6987E45D28481A000000000000000000000000 00000026481887E45D97FF6997FF6997FF69B4FF946C7589EDF1F3717A8DE1E7EBE1E7EBE1E7EB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8 DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8 DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8 DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8 DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8 DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8 DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8 DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8 DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8 DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8 DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8 DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8 DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8 DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8 DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8 DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8 DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8 DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8 DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8 DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8 DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8 DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8 DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8767F92 7FE65E41DC0E41DC0E41DC0E4DDE257EE5638CE874497E3C00000000000030542671CF594DDE25 41DC0E41DC0E41DC0E7EE75E767F9296A0AD5D687FDDE4E8DDE4E8DDE4E8000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000DAE3E6 DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6 DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6 DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6 DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6 DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6 DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6 DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6 DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6 DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6 DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6 DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6 DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6 DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6 DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6 DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6 DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6 DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6 DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6 DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6 DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6 DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6 DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6 DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E680879853D43900C30000C300 00C30000C30000C30000B800021E020315044697404BD14200C60000C30000C30000C30000C300 53D43980879846556E8791A1DAE3E6DAE3E6DAE3E6000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000D6E0E3D6E0E3D6E0E3D6E0E3 D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3 D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3 D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3 D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3 D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3 D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3 D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3 D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3 D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3 D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3 D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3 D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3 D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3 D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3 D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3 D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3 D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3 D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3 D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3 D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3 D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3 D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3 D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E38890A048BE3600A50000A50000A50000A50000A500 00420022501F58B4520DAF1600A50000A50000A50000A50000A50000A50048BE368890A0E7EDEF DEE5E9D6E0E3D6E0E3D6E0E3000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1 D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1 D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1 D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1 D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1 D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1 D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1 D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1 D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1 D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1 D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1 D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1 D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1 D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1 D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1 D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1 D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1 D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1 D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1 D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1 D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1 D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1 D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1 D5DCE1D5DCE1D5DCE19097A660C94A00B50000B50000B50000B500008E003C953854C54B00B700 00B50000B50000B50000B50000B50000B50000B5005FCA4A9097A6D5DCE1D5DCE1D5DCE1D5DCE1 D5DCE1000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000D2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADD D2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADD D2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADD D2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADD D2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADD D2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADD D2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADD D2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADD D2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADD D2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADD D2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADD D2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADD D2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADD D2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADD D2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADD D2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADD D2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADD D2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADD D2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADD D2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADD D2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADD D2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADD D2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADD AFB6BE979DAA979DAA979DAA979DAA979DAA9DA3B0A1A6B2979DAA979DAA979DAA979DAA979DAA 979DAA979DAA979DAA979DAA979DAAAFB6BED2DADDD2DADDD2DADDD2DADDD2DADD000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 D1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DB D1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DB D1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DB D1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DB D1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DB D1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DB D1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DB D1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DB D1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DB D1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DB D1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DB D1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DB D1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DB D1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DB D1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DB D1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DB D1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DB D1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DB D1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DB D1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DB D1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DB D1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DB D1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBE2E6E8E9ECEEE9ECEE E9ECEEE9ECEEE9ECEEE9ECEEE9ECEEE9ECEEE9ECEEE9ECEEE9ECEEE9ECEEE9ECEEE9ECEEE9ECEE E9ECEEE9ECEEE2E6E8D1D8DBD1D8DBD1D8DBD1D8DBD1D8DB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CDD6D8CDD6D8CDD6D8 CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8 CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8 CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8 CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8 CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8 CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8 CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8 CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8 CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8 CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8 CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8 CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8 CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8 CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8 CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8 CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8 CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8 CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8 CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8 CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8 CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8 CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8 CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8 CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8 CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7 CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7 CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7 CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7 CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7 CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7 CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7 CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7 CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7 CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7 CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7 CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7 CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7 CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7 CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7 CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7 CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7 CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7 CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7 CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7 CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7 CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7 CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7 CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7 CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7 CAD4D7CAD4D7000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5 C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5 C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5 C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5 C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5 C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5 C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5 C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5 C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5 C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5 C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5 C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5 C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5 C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5 C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5 C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5 C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5 C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5 C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5 C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5 C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5 C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5 C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5 C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5 C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3 C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3 C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3 C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3 C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3 C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3 C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3 C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3 C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3 C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3 C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3 C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3 C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3 C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3 C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3 C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3 C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3 C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3 C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3 C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3 C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3 C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3 C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3 C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3 C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000006D767C6D767C 6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C 6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C 6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C 6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C 6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C 6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C 6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C 6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C 6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C 6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C 6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C 6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C 6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C 6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C 6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C 6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C 6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C 6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C 6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C 6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C 6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C 6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C 6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C 6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C 6D767C6D767C6D767C6D767C6D767C6D767C000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBB3B6BA9299A4828B99798493798493 798493798493798493798493798493798493798493798493798493798493798493798493798493 798493798493798493798493798493798493798493798493798493798493798493798493798493 798493798493798493798493798493798493798493798493798493798493798493798493798493 798493798493798493798493798493798493798493798493798493798493798493798493798493 798493798493798493798493798493798493798493798493798493798493798493798493798493 798493798493798493798493798493798493798493798493798493798493798493798493798493 798493798493798493798493798493798493798493798493798493798493798493798493798493 798493798493798493798493798493798493798493798493798493798493798493798493798493 798493798493798493798493798493798493798493798493798493798493798493798493798493 798493798493798493798493798493798493798493798493798493798493798493798493798493 798493798493798493798493798493798493798493798493798493798493798493798493798493 7984937984937984937984937984937984937984937984937984937F89979098A2AEB1B7CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBC6C6C79CA2AA7F87928D909599999BA1A1A1A2A2A2A3A3A3A3A3A3A3A3A3 A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3 A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3 A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3 A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3 A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3 A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3 A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3 A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3 A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3 A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3 A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3 A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A1A1A19B9B9C909296828993969DA6B7B9BDCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB A0A5AD8A8F96AAAAAABCBCBCC8C8C8CECECED0D0D0D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1 D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1 D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1 D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1 D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1 D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1 D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1 D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1 D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1 D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1 D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1 D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1 D1D1D1D0D0D0CFCFCFCACACABFBFBFAEAEAE909398818B98C6C6C7CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBB3B6BA89909AB1B1B2CECECE E1E1E1EAEAEAEEEEEEEFEFEFF0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0EFEFEFEEEEEE EBEBEBE3E3E3D3D3D3B9B9B990959BA7ABB2CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB9CA2ABA3A5A8CECECEE9E9E9F7F7F7FCFCFCFEFEFE FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFDFDFDF9F9F9EDEDED D5D5D5B0B1B18D96A1CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB979EA7BABABBE1E1E1F7F7F7FEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFAFAFAE7E7E7C6C6C6959BA4 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBC5C5C5C3C3C3CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBC5C5C5C3C3C3 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 999FA8CACACAEBEBEBFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEEFEFEFD1D1D19BA1A8CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB9C9C9C0000005E5E5ECBCBCB CBCBCB6D6D6D000000000000000000000000000000060606242424797979C9C9C9CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBBABABA030303000000919191 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB3F3F3F212121 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB3F3F3F212121CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB9FA5ADCFCFCFEEEEEE FEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1D5D5D5A1A5ACCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB9C9C9C0000005E5E5ECBCBCBCBCBCB6D6D6D000000 4747476565656565656464644D4D4D1B1B1B000000646464CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB727272000000000000484848CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB3F3F3F212121CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB3F3F3F212121CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBA2A7AFD0D0D0EFEFEFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFF3F3F3D6D6D6A3A7ADCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB9C9C9C0000005E5E5ECBCBCBCBCBCB6D6D6D000000909090CBCBCBCBCBCB CBCBCBCBCBCBC1C1C11B1B1B040404C7C7C7CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB262626272727323232080808C2C2C2CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB3F3F3F212121CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB3F3F3F212121CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBA3A8AFD1D1D1F0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F3F3D6D6D6 A5A9AFCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 9C9C9C0000005E5E5ECBCBCBCBCBCB6D6D6D000000909090CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 434343000000AFAFAFCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBA5A5A5 000000717171797979000000818181CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB9C9C9C464646222222 4949499898983F3F3F212121CBCBCBCBCBCBCBCBCB9C9C9C4646462222224949499898983F3F3F 212121CBCBCBCBCBCB565656646464AFAFAF4F4F4F3B3B3BCBCBCBCBCBCBBBBBBB525252242424 222222555555B2B2B2CBCBCBCBCBCBCBCBCBC3C3C36363631F1F1F0E0E0E2D2D2D767676CBCBCB CBCBCBCBCBCBC3C3C36363631F1F1F0E0E0E2D2D2D767676CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBA5AAB0D1D1D1F0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F3F3D6D6D6A6AAB0CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB9C9C9C0000005E5E5E CBCBCBCBCBCB6D6D6D000000909090CBCBCBCBCBCBCBCBCBCBCBCBC2C2C20B0B0B020202C5C5C5 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB595959020202B8B8B8BBBBBB 030303373737CBCBCBCBCBCBCBCBCBCBCBCB9494940606061111114C4C4C3C3C3C060606171717 212121CBCBCBCBCBCB9494940606061111114C4C4C3C3C3C060606171717212121CBCBCBCBCBCB 2929292E2E2E191919010101464646CBCBCBB0B0B01717170C0C0C5151514E4E4E111111131313 A6A6A6CBCBCBCBCBCB4949490505054A4A4A5E5E5E1D1D1D0000006C6C6CCBCBCBCBCBCB494949 0505054A4A4A5E5E5E1D1D1D0000006C6C6CCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBA6ABB1D1D1D1 F0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F3F3D6D6D6A6AAAFCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB9C9C9C0000005E5E5ECBCBCBCBCBCB6D6D6D 0000007C7C7CAEAEAEAEAEAEACACAC8585853F3F3F000000474747CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBC7C7C71111113A3A3ACBCBCBCBCBCB3A3A3A020202B7B7B7 CBCBCBCBCBCBCACACA212121161616B6B6B6CBCBCBCBCBCB7B7B7B000000212121CBCBCBCACACA 212121161616B6B6B6CBCBCBCBCBCB7B7B7B000000212121CBCBCBCBCBCB292929000000424242 AFAFAFCBCBCBCBCBCB444444020202ADADADCBCBCBCBCBCBAFAFAF0E0E0E3B3B3BCBCBCBC2C2C2 010101505050CBCBCBCBCBCBCBCBCB3E3E3E1F1F1FCBCBCBC2C2C2010101505050CBCBCBCBCBCB CBCBCB3E3E3E1F1F1FCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBA7ABB2D1D1D1F0F0F0FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFF3F3F3D6D6D6A7ABB0CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB9C9C9C0000005E5E5ECBCBCBCBCBCB6D6D6D000000000000000000 000000000000000000000000313131B9B9B9CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB8C8C8C000000848484CBCBCBCBCBCB808080000000717171CBCBCBCBCBCB9B9B9B 000000707070CBCBCBCBCBCBCBCBCBCACACA1A1A1A212121CBCBCB9B9B9B000000707070CBCBCB CBCBCBCBCBCBCACACA1A1A1A212121CBCBCBCBCBCB292929000000B3B3B3CBCBCBCBCBCBB8B8B8 0000003A3A3ACBCBCBCBCBCBCBCBCBCBCBCB4A4A4A030303BEBEBEBDBDBD000000191919B7B7B7 CBCBCBCBCBCBC2C2C2B7B7B7CBCBCBBDBDBD000000191919B7B7B7CBCBCBCBCBCBC2C2C2B7B7B7 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBA8ACB2D1D1D1F0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F3F3 D6D6D6A9ACB1CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB9C9C9C0000005E5E5ECBCBCBCBCBCB6D6D6D0000005858587B7B7B7B7B7B7B7B7B838383 A3A3A3C8C8C8CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB404040 0000006B6B6B727272727272676767000000272727CBCBCBCBCBCB7B7B7B000000989898CBCBCB CBCBCBCBCBCBCBCBCB3C3C3C212121CBCBCB7B7B7B000000989898CBCBCBCBCBCBCBCBCBCBCBCB 3C3C3C212121CBCBCBCBCBCB292929242424CBCBCBCBCBCBCBCBCB9999990000002B2B2B4F4F4F 4F4F4F4F4F4F4F4F4F2B2B2B000000A5A5A5CBCBCB5454540000000303033333336A6A6AAAAAAA CBCBCBCBCBCBCBCBCB5454540000000303033333336A6A6AAAAAAACBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBA9ADB3D1D1D1F0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F3F3D6D6D6A9ACB1CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB9C9C9C000000 5E5E5ECBCBCBCBCBCB6D6D6D000000909090CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBBBBBBB040404000000000000000000 000000000000000000000000A9A9A9CBCBCB6B6B6B0000009C9C9CCBCBCBCBCBCBCBCBCBCBCBCB 434343212121CBCBCB6B6B6B0000009C9C9CCBCBCBCBCBCBCBCBCBCBCBCB434343212121CBCBCB CBCBCB2929292A2A2ACBCBCBCBCBCBCBCBCB8888880000002626263D3D3D3D3D3D3D3D3D3D3D3D 3D3D3D3D3D3DABABABCBCBCBCBCBCB9D9D9D4F4F4F141414000000000000515151CBCBCBCBCBCB CBCBCB9D9D9D4F4F4F141414000000000000515151CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBABAFB5 D1D1D1F0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F3F3D6D6D6AAADB2CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB9C9C9C0000005E5E5ECBCBCBCBCBCB 6D6D6D000000909090CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB7474740000008A8A8AC2C2C2C2C2C2C2C2C2C2C2C28B8B8B 000000606060CBCBCB8484840000006D6D6DCBCBCBCBCBCBCBCBCBCBCBCB2D2D2D212121CBCBCB 8484840000006D6D6DCBCBCBCBCBCBCBCBCBCBCBCB2D2D2D212121CBCBCBCBCBCB2929292A2A2A CBCBCBCBCBCBCBCBCBA1A1A1000000595959CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCACACACBCBCB CBCBCBCACACACBCBCBCBCBCBCBCBCBA0A0A02D2D2D000000A1A1A1CBCBCBCACACACBCBCBCBCBCB CBCBCBA0A0A02D2D2D000000A1A1A1CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBABAFB4D1D1D1F0F0F0FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFF3F3F3D6D6D6ABAEB3CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB9C9C9C0000005E5E5ECBCBCBCBCBCB6D6D6D000000909090 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB2727270F0F0FC7C7C7CBCBCBCBCBCBCBCBCBCBCBCBC7C7C70C0C0C171717CACACA ACACAC0000003B3B3BCBCBCBCBCBCBCBCBCBB1B1B1020202212121CBCBCBACACAC0000003B3B3B CBCBCBCBCBCBCBCBCBB1B1B1020202212121CBCBCBCBCBCB2929292A2A2ACBCBCBCBCBCBCBCBCB C1C1C1090909202020CBCBCBCBCBCBCBCBCBCBCBCB373737111111C8C8C88A8A8A000000969696 CBCBCBCBCBCBCBCBCB8282820000009090908A8A8A000000969696CBCBCBCBCBCBCBCBCB828282 000000909090CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBACB0B5D1D1D1F0F0F0FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF F3F3F3D6D6D6ACAFB4CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB9C9C9C0000005E5E5ECBCBCBCBCBCB6D6D6D000000909090CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBA7A7A7000000 535353CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB4B4B4B000000999999CBCBCB4A4A4A000000 696969B1B1B1A1A1A1272727090909212121CBCBCBCBCBCB4A4A4A000000696969B1B1B1A1A1A1 272727090909212121CBCBCBCBCBCB2929292A2A2ACBCBCBCBCBCBCBCBCBCBCBCB6C6C6C000000 616161B1B1B1AFAFAF5B5B5B0000006E6E6ECBCBCBBBBBBB0B0B0B2E2E2EA9A9A9C6C6C6A1A1A1 2626260B0B0BBBBBBBBBBBBB0B0B0B2E2E2EA9A9A9C6C6C6A1A1A12626260B0B0BBBBBBBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBADB1B6D1D1D1F0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F3F3D6D6D6ADB0B4 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB9C9C9C 0000005E5E5ECBCBCBCBCBCB6D6D6D000000909090CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB5B5B5B0000009C9C9CCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB8F8F8F0000004F4F4FCBCBCBC0C0C0404040000000000000000000 595959515151212121CBCBCBCBCBCBC0C0C0404040000000000000000000595959515151212121 CBCBCBCBCBCB2929292A2A2ACBCBCBCBCBCBCBCBCBCBCBCBC7C7C7636363020202000000000000 0D0D0D6D6D6DCACACACBCBCBCBCBCB8A8A8A0F0F0F000000000000000000131313909090CBCBCB CBCBCB8A8A8A0F0F0F000000000000000000131313909090CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB AEB1B7D1D1D1F0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F3F3D6D6D6ADB0B4CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBAFAFAF939393BABABACBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBAFAFAF939393BABABACBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBBCBCBC959595969696BFBFBFCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBBFBFBF9C9C9C8888889D9D9DC2C2C2CBCBCBCBCBCBCBCBCBCBCBCBBFBFBF 9C9C9C8888889D9D9DC2C2C2CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBAFB2B7D1D1D1F0F0F0 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFF3F3F3D6D6D6AEB1B5CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBAFB2B7D1D1D1F0F0F0FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFF3F3F3D6D6D6AEB1B5CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBB0B3B8D1D1D1F0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F3F3D6D6D6 AFB2B5CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBB1B4B9D1D1D1F0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F3F3D6D6D6B0B3B6CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBB2B5B9D0D0D0 EFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F3F3D6D6D6B0B3B6CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBB4B7BBCCCDCDEEEEEEFEFEFEFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFF1F1F1D5D5D5B0B3B7CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBB9BBBEC4C5C6EBEBEBFDFDFDFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEEFEFEF CECECEB3B6BACBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBC3C4C5B6B8BBE0E0E0F7F7F7FEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFAFAFAE7E7E7BCBDC0BFC0C2CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB BEBFC2BFC1C4E9E9E9F7F7F7FCFCFCFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFEFEFEFDFDFDF9F9F9EDEDEDC9CBCBB4B7BBC9C9C9CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBC9C9C9BEBFC2BBBDBF D2D4D5E3E4E4EEEEEEEFEFEFF0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0EFEFEFEEEEEE E7E7E8D6D7D7BFC1C3BCBDC0C5C5C6CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBC4C4C6BBBDBFB7B9BDB5B7BB B5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BB B5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BB B5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BB B5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BB B5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BB B5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BB B5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BB B5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BB B5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BB B5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BB B5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BB B5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB7B9BDBBBDC0C3C4C5 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBC1C1C1B3B3B3A8A8A8A3A3A39E9E9E9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9E9E9EA3A3A3A8A8A8B3B3B3C1C1C1CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBC3C3C3 ADADADA8A8A8CACACAEBEBEBF5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F5F5EBEBEBCACACAA8A8A8ADADADC3C3C3CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBBEBEBEA2A2A2D2D2D2FEFEFEFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFED2D2D29F9F9FC1C1C1CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBC1C1C19D9D9DE6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFE9E9E99D9D9DBEBEBECBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB C4C4C49F9F9FE9E9E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFE6E6E6A2A2A2C3C3C3CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBADADADD2D2D2FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF D2D2D2ADADADCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBC1C1C1A8A8A8FEFEFEFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEA8A8A8C1C1C1 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBB3B3B3CACACAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCACACAB3B3B3CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB A8A8A8EBEBEBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBEBEBA8A8A8CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBA3A3A3F5F5F5FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFF5F5F5A3A3A3CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB9E9E9EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 9D9D9DCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB9D9D9DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D9D9DCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB9D9D9DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D9D9DCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB9D9D9DFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF7588AD5E749F5E749F5E749F5E749F5E749F5E749F7F91B2FFFFFF4E67964E6795EAEDF2 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFA8B4CB5E749FA3B0C8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F9FB 94A3BF576F9B3A568A576F9B8092B3E6E9F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEAEDF3E2E6EEF6F7F9 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF9D9D9DCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB9D9D9DFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E6796324F85 324F85324F85324F85324F85324F855B729DFFFFFF324F85324F85E6EAF0FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F9FBC 324F85899AB9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F9FB566E9A324F85324F85324F85 324F85324F85445E90D5DBE6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF687DA5324F85BAC4D6FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF9D9D9DCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB9D9D9DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E6796324F8592A1BECED5E2CED5E2 CED5E2CED5E2D9DEE8FFFFFFDBE0E9DBE0E9FAFBFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F9FBC324F85899AB9FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9EACC5324F85345186AAB6CCF0F2F6D4DAE5526B98324F85 6379A2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF687DA5324F85BAC4D6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D9D9DCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB9D9D9DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E6796324F85B0BBD0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF657BA3647AA3ECEFF4FDFDFE677CA4677CA4D2D9E47387AC4E67968496B6D7DDE7FFFFFF FFFFFFFFFFFFAFBACF5D749E4E67958B9BBA8B9BBA324F85899AB9FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFEFEFE3E598C324F858294B4FFFFFFFFFFFFFFFFFFD1D7E3324F85324F85E9ECF2FFFFFF EAEDF3788BAF4A64933D588B5E749FB6C0D3FFFFFFFFFFFFBEC7D8647AA3909FBCFFFFFFFFFFFF CCD3E0647AA38496B6FFFFFFFDFDFE677CA4677CA4D2D9E47387AC4E67968496B6D7DDE7FFFFFF 8899B8425D8F324F855D749EA7B3CAF7F8FA647AA36D82A8D8DDE87286AB91A1BD91A1BD647AA3 A4B1C8FFFFFFFFFFFFDADFE8647AA36E82A8FDFDFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D9D9DCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB9D9D9D FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF4E6796324F8594A3BFD1D7E3D1D7E3D1D7E3D1D7E3F9FAFBFFFFFF324F85324F85 E6EAF0FDFDFE324F85324F85415C8E566E9A345186324F85435E8FFAFAFCFFFFFFABB7CD324F85 324F853F5A8D335085365387324F85899AB9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6E9F0324F85 324F85B9C3D5FFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFEFEFEFFFFFFF1F3F6445E90324F853A568A 516997324F85324F85A5B2C9FFFFFFA9B5CC324F856B80A6FFFFFFFFFFFFBCC5D7324F855C739E FFFFFFFDFDFE324F85324F85415C8E566E9A345186324F85435E8FFAFAFC7B8EB13E5A8C324F85 536B999DABC5F5F6F9324F85385488476191324F858697B7AEB9CF324F854E6796FFFFFFFFFFFF 98A7C2324F857C8FB1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D9D9DCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB9D9D9DFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E6796 324F85324F85324F85324F85324F85324F85E6E9F0FFFFFF324F85324F85E6EAF0FDFDFE324F85 324F85A8B5CBFFFFFFDDE2EA324F85324F85DEE2EBFFFFFF455F90324F858D9DBBF8F9FBE3E7EE 425C8E324F85899AB9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7CFDD324F85324F85EEF0F4FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93A2BE324F855A719CF1F3F6FFFFFFA7B3CA324F85 3E598CF6F7F9A9B5CC324F856B80A6FFFFFFFFFFFFBCC5D7324F855C739EFFFFFFFDFDFE324F85 324F85A8B5CBFFFFFFDDE2EA324F85324F85DEE2EBFFFFFF687DA5324F85BAC4D6FFFFFFF5F6F9 324F85324F856F84A9D6DCE7F0F2F6F2F3F7375388324F85DDE2EAFFFFFF5D749E324F85C6CEDD FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF9D9D9DCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB9D9D9DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E6796324F85667BA48798B7 8798B78798B78798B7F0F2F6FFFFFF324F85324F85E6EAF0FDFDFE324F85324F85E6E9F0FFFFFF FFFFFF3E5A8C324F85D4DAE5EAEDF3324F85324F85E7EAF1FFFFFFFFFFFF8496B6324F85899AB9 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0D6E3324F85324F85F2F4F7FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF647AA3324F859AA8C3FFFFFFFFFFFFF2F3F7345186324F85D4DAE5A9B5CC 324F856B80A6FFFFFFFFFFFFBCC5D7324F855C739EFFFFFFFDFDFE324F85324F85E6E9F0FFFFFF FFFFFF3E5A8C324F85D4DAE5FFFFFF687DA5324F85BAC4D6FFFFFFF5F6F9324F85324F85D8DDE8 FFFFFFFFFFFFFFFFFF7588AD324F859EACC5EEF0F4335085455F90FCFCFDFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D9D9D CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB9D9D9DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E6796324F85B0BBD0FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF324F85324F85E6EAF0FDFDFE324F85324F85F1F3F6FFFFFFFFFFFF405B8D324F85 D4DAE5DEE2EB324F85335085F4F6F8FFFFFFFFFFFF8899B8324F85899AB9FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFEEF1F5324F85324F85CBD2E0FFFFFFFFFFFFFFFFFFF0F2F68496B68496B6ECEFF4 5D749E324F85A7B3CAFFFFFFFFFFFFF9FAFB395589324F85CDD4E1A9B5CC324F856B80A6FFFFFF FFFFFFB6C0D3324F855C739EFFFFFFFDFDFE324F85324F85F1F3F6FFFFFFFFFFFF405B8D324F85 D4DAE5FFFFFF687DA5324F85BAC4D6FFFFFFF5F6F9324F85324F85F2F4F7FFFFFFFFFFFFFFFFFF BFC8D9324F855F759FB4BED2324F858C9CBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D9D9DCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 9D9D9DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF4E6796324F85B0BBD0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF324F85 324F85E6EAF0FDFDFE324F85324F85F1F3F6FFFFFFFFFFFF405B8D324F85D4DAE5F8F9FB345186 324F85BFC8D9FFFFFFFCFCFD506997324F85899AB9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 647AA3324F855F759FF2F4F7FFFFFFF5F6F98596B6324F854A6393FEFEFE8294B4324F856D82A8 FFFFFFFFFFFFC8D0DE324F85345186EEF1F5BEC7D8324F85546C99FFFFFFFFFFFF8C9CBB324F85 5C739EFFFFFFFDFDFE324F85324F85F1F3F6FFFFFFFFFFFF405B8D324F85D4DAE5FFFFFF687DA5 324F85BAC4D6FFFFFFF5F6F9324F85324F85F4F6F8FFFFFFFFFFFFFFFFFFFAFBFC415C8E324F85 657BA3324F85D6DCE7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D9D9DCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB9D9D9DFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 4E6796324F85B0BBD0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF324F85324F85E6EAF0FDFDFE 324F85324F85F1F3F6FFFFFFFFFFFF405B8D324F85D4DAE5FFFFFF8394B5324F853653877B8DB0 4E6795324F85324F85899AB9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDADFE8375388324F85 445E906E82A83D588B324F85324F85BFC8D9FFFFFFDEE3EB355186324F855D749E8193B4395589 324F858495B5FFFFFFE2E6EE324F85324F855C739E798CAF355186324F855C739EFFFFFFFDFDFE 324F85324F85F1F3F6FFFFFFFFFFFF405B8D324F85D4DAE5FFFFFF7084AA324F85687DA5C1CADA F5F6F9324F85324F85F4F6F8FFFFFFFFFFFFFFFFFFFFFFFF8697B7324F85324F85526B98FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF9D9D9DCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB9D9D9DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E6796324F85B0BBD0 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF324F85324F85E6EAF0FDFDFE324F85324F85F1F3F6 FFFFFFFFFFFF405B8D324F85D4DAE5FFFFFFF3F5F86E82A8324F85324F85526B988D9DBB324F85 899AB9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDADFE8566E9B324F85324F85324F85 466090BAC4D6FFFFFFFFFFFFFFFFFFC5CDDC435E8F324F85324F85324F858092B3F6F8FAFFFFFF FFFFFF99A8C2365387324F854862929BA9C3324F855C739EFFFFFFFDFDFE324F85324F85F1F3F6 FFFFFFFFFFFF405B8D324F85D4DAE5FFFFFFBDC6D7395589324F857D8FB1F5F6F9324F85324F85 F4F6F8FFFFFFFFFFFFFFFFFFFFFFFFD1D7E3324F85324F859CAAC4FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 9D9D9DCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB9D9D9DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7EAF1DEE3EBFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFECEFF4CBD2E0DDE2EAFAFBFCFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFCFCFDE0E4ECD1D8E4F2F4F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAFAFC E4E8EFFBFCFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFBFCFDECEFF4F4F6F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFAFBFC365287335085E7EAF1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D9D9DCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB9D9D9DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBCC5D77387AC 324F856D82A8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D9D9DCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB9E9E9EFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E82A8324F853D588BD6DCE7FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF9E9E9ECBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBA3A3A3F5F5F5FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0E4ECD6DCE7F4F6F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF F5F5F5A3A3A3CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBA8A8A8EBEBEBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBEBEBA8A8A8CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBB3B3B3CACACAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCACACAB3B3B3CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBC1C1C1 A8A8A8FEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFEFEFEA8A8A8C1C1C1CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBADADADD2D2D2FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF D2D2D2ADADADCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBC4C4C4A2A2A2E6E6E6FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9E9E99F9F9FC4C4C4CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBBEBEBE9D9D9DE9E9E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6E6E69D9D9DC1C1C1CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBC1C1C19F9F9FD2D2D2FEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FEFEFED2D2D2A2A2A2BEBEBECBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBC4C4C4ADADADA8A8A8CACACAEBEBEBF5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F5F5EBEBEBCACACAA8A8A8ADADADC4C4C4 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB C1C1C1B3B3B3A8A8A8A3A3A39E9E9E9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9E9E9EA3A3A3A8A8A8B3B3B3C1C1C1CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF end %%PageTrailer %%Trailer %%EOF gsoap-2.8.28/gsoap/ios_plugin/ios_plugin/docs/calc-result.eps0000644000175000017500000732265312653650146023626 0ustar ellertellert%!PS-Adobe-3.0 EPSF-3.0 %%Creator: (ImageMagick) %%Title: (calc-result.eps) %%CreationDate: (2012-06-08T01:00:12-04:00) %%BoundingBox: 0 0 414 770 %%HiResBoundingBox: 0 0 413.948 770 %%DocumentData: Clean7Bit %%LanguageLevel: 1 %%Pages: 1 %%EndComments %%BeginDefaults %%EndDefaults %%BeginProlog % % Display a color image. The image is displayed in color on % Postscript viewers or printers that support color, otherwise % it is displayed as grayscale. % /DirectClassPacket { % % Get a DirectClass packet. % % Parameters: % red. % green. % blue. % length: number of pixels minus one of this color (optional). % currentfile color_packet readhexstring pop pop compression 0 eq { /number_pixels 3 def } { currentfile byte readhexstring pop 0 get /number_pixels exch 1 add 3 mul def } ifelse 0 3 number_pixels 1 sub { pixels exch color_packet putinterval } for pixels 0 number_pixels getinterval } bind def /DirectClassImage { % % Display a DirectClass image. % systemdict /colorimage known { columns rows 8 [ columns 0 0 rows neg 0 rows ] { DirectClassPacket } false 3 colorimage } { % % No colorimage operator; convert to grayscale. % columns rows 8 [ columns 0 0 rows neg 0 rows ] { GrayDirectClassPacket } image } ifelse } bind def /GrayDirectClassPacket { % % Get a DirectClass packet; convert to grayscale. % % Parameters: % red % green % blue % length: number of pixels minus one of this color (optional). % currentfile color_packet readhexstring pop pop color_packet 0 get 0.299 mul color_packet 1 get 0.587 mul add color_packet 2 get 0.114 mul add cvi /gray_packet exch def compression 0 eq { /number_pixels 1 def } { currentfile byte readhexstring pop 0 get /number_pixels exch 1 add def } ifelse 0 1 number_pixels 1 sub { pixels exch gray_packet put } for pixels 0 number_pixels getinterval } bind def /GrayPseudoClassPacket { % % Get a PseudoClass packet; convert to grayscale. % % Parameters: % index: index into the colormap. % length: number of pixels minus one of this color (optional). % currentfile byte readhexstring pop 0 get /offset exch 3 mul def /color_packet colormap offset 3 getinterval def color_packet 0 get 0.299 mul color_packet 1 get 0.587 mul add color_packet 2 get 0.114 mul add cvi /gray_packet exch def compression 0 eq { /number_pixels 1 def } { currentfile byte readhexstring pop 0 get /number_pixels exch 1 add def } ifelse 0 1 number_pixels 1 sub { pixels exch gray_packet put } for pixels 0 number_pixels getinterval } bind def /PseudoClassPacket { % % Get a PseudoClass packet. % % Parameters: % index: index into the colormap. % length: number of pixels minus one of this color (optional). % currentfile byte readhexstring pop 0 get /offset exch 3 mul def /color_packet colormap offset 3 getinterval def compression 0 eq { /number_pixels 3 def } { currentfile byte readhexstring pop 0 get /number_pixels exch 1 add 3 mul def } ifelse 0 3 number_pixels 1 sub { pixels exch color_packet putinterval } for pixels 0 number_pixels getinterval } bind def /PseudoClassImage { % % Display a PseudoClass image. % % Parameters: % class: 0-PseudoClass or 1-Grayscale. % currentfile buffer readline pop token pop /class exch def pop class 0 gt { currentfile buffer readline pop token pop /depth exch def pop /grays columns 8 add depth sub depth mul 8 idiv string def columns rows depth [ columns 0 0 rows neg 0 rows ] { currentfile grays readhexstring pop } image } { % % Parameters: % colors: number of colors in the colormap. % colormap: red, green, blue color packets. % currentfile buffer readline pop token pop /colors exch def pop /colors colors 3 mul def /colormap colors string def currentfile colormap readhexstring pop pop systemdict /colorimage known { columns rows 8 [ columns 0 0 rows neg 0 rows ] { PseudoClassPacket } false 3 colorimage } { % % No colorimage operator; convert to grayscale. % columns rows 8 [ columns 0 0 rows neg 0 rows ] { GrayPseudoClassPacket } image } ifelse } ifelse } bind def /DisplayImage { % % Display a DirectClass or PseudoClass image. % % Parameters: % x & y translation. % x & y scale. % label pointsize. % image label. % image columns & rows. % class: 0-DirectClass or 1-PseudoClass. % compression: 0-none or 1-RunlengthEncoded. % hex color packets. % gsave /buffer 512 string def /byte 1 string def /color_packet 3 string def /pixels 768 string def currentfile buffer readline pop token pop /x exch def token pop /y exch def pop x y translate currentfile buffer readline pop token pop /x exch def token pop /y exch def pop currentfile buffer readline pop token pop /pointsize exch def pop /Times-Roman findfont pointsize scalefont setfont x y scale currentfile buffer readline pop token pop /columns exch def token pop /rows exch def pop currentfile buffer readline pop token pop /class exch def pop currentfile buffer readline pop token pop /compression exch def pop class 0 gt { PseudoClassImage } { DirectClassImage } ifelse } bind def %%EndProlog %%Page: 1 1 %%PageBoundingBox: 0 0 414 770 userdict begin DisplayImage 0 0 413.948 769.904 12.000000 414 770 0 0 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000019191F1F1E213131343F414445464B 494B4E4C4E514C4E51484B4E4A4B4E46484D46484B47474A424348424247454748464647434547 4343474242434343454747484545474545484444464343474545474343454143453F3F413E3E40 3E3E4038383C36363B3535393434393535372E2E30303033303033313131363336333336333333 3436362F2F2F2D2F2F2F2F2F2D2D2D2424272222252222221D20201B1B1B1B1B1B161618161616 0E0E0E030305030303000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000141414434345282A2E44454C494A524B4D544D4F554F5158 4F51574D4F554E51564E4F564E50564F51575052574F515851535952545A53555953555A54565B 57585D56585C55585B575B5E58595D595B605C5E62595B5F585A60575A5F595B61595A61585960 575961575961595C6256585F55565C585A60585B60575A5F5A5C62595C61595C615B5D625B5C62 5B5C625C5D62595B61575A61575A5F56585C54565B53555955565C54555B52545946484E303233 24242819191C141416000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000001A1A1A4342442223263F404543444A41434942454A43474B424549424449 42444942444943454A43464A4145484042473F41474042474243494144493F444941444943454A 3F444841434845464B45474B45474B43454A43464A42454A42444A43454B43464C43454A424448 4244494143484143483F424742444A3F43493F42483F44493F43483F42483F41473E40463E4047 3E40473E40463E40473E41463D3F463C3E443A3D433B3E443B3E433639402C2E331E1F22171818 3838390F0F0F000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000004040408080B0A0A0A0D0D0D0E0E0E0B0B0B070707040404 000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000808080D0D0D2020223A3A3C 4648495353585A5B5F64666867686D67676A65676B69696C6A6A6E6D6E706D6E716E7072707173 6C6C6F6B6C6F6F6F716E6F706D6F716D6E716E6F716F70716D6D706E6E70707171707172727272 6E70716B6C6E706E717171726E70727071717172726D6E716E70717071727070726D6D706D6E70 6E6E716E70726E6E726E6E717070716F6F707173737070716F6F6F6F6F6F6F6F70717174717174 7070737071737070736F6F716F6F706F6F706F70717173757173747070706F6F706F6F71707174 6E6F706D6F706D6F6F6E6F707173747171737070716F6F717071736E6F707071746F70716F7071 717272727273727374737274727276727376727376737476737476727274727273727374717273 727273727373727274727273727374727274717172717272727374727274727273707172727274 7272747273767071727070727071727071727071726E7172727374727274727274717273707172 7172727172737172737073747374757071747373757373757174757071756F70746F7071717274 7172747172747172727173747272737273757272736E6F727172727274757272736F71726D6E71 6D6E6F6D6D716F6F727170726F70716F70726F72727273757373757375757475767172736D6E72 6E717370717365686A5C5D6067686B696B6E676A6E6B6D706B6D706A6C6F6A6C6F6C6D706D6E72 6E6F726B6C6F6B6D706B6C6F6A6C6F696A6E6A6C706A6B6F696B6F696B6E696C6F696B6E646669 6A6C6F6A6B6E686A6D696A6D67696C66696B676A6D66686C626468616266626468636568646568 6365696364686263676264676063676063666062665E5F645E60655C5E625B5E625A5C61585B5F 575B5F585B5F56585C54565B5153584D4E544B4E53494B513F41472B2C2F2525264748481E2121 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000404040707071414142626263D3D3F 5454565E5F626B6B6E7577787C7E817F7F828081848484888181847C7D8175777A6F7073646667 5A5D5D5253554345453739392828282121211515181414141111141111111111111515151C1C1C 1C1C1E26262833333537373946484859595C6C6E6F7A7D7F7F818482848787898C87898C85868A 8385888384878182858283867F808482828482818581838682838682848782838686878A86878A 848588858689858689858588848588818184828385848587868788858688858588838486838486 838487848487858588858788868688838486858688858488858588828485818385818284858486 848487848486838586848586868688848586828385838485838385878789858688838586868789 868688848587868688858688848789878688858688858688848587868789848588828486838486 838587838486868688868688848688868789848686858789858689848688858688868789868789 86888A86878986888A87888A88898B898A8B86888A85868987898B86888986888987898A878989 87888A86878988898B87888B85878A87878B88898B88888B86878985868888898B87898B87898B 84858884858887888A86888A85868886888A88898A87888A88898B87878988898A88898B878789 87888A888A8B88898B88898B89898B88888B888A8B88898C87888B86888A86898B86888A86878A 86878A888A8C87888B89898C868789858889898A8C898B8C87888A868789878889888A8C888A8C 898B8C87888986888987888988898B88898C898A8C898C8D88898B86878986888A87898B848588 8686878A8B8C86878982858786898A86878988898B858789888A8A86878987888A87888A868789 88898A86878985878883858788888A87878989888B898A8B85888987898A87878886878A858788 86888A87888A85878884868785878986878986878986878985868886878886878988898B88898B 86878987888988888A86878988888B85888A868789868789818486838687848687838486848688 8485868585888485878384858081847F818481838577797A73767876797B787A7C6B6C6F595D60 5153544546482F2F2F1C1F1F0F0F0F080808000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000A0A0A1B1B1B3B3B3B505254686A6B79797D8182848A8A8D8C8D909090938F9092 8D8E8F89898C87888986878987888B8686898585888484868587898A8C8E8D8F918D90928E8F93 8F8F929192949090938E8E9287888C86868985868886878986868889898B8D8F918B8C8F8E8F91 8D8E91908F949394969090938B8C8F87878A86888A86888A84868885868882838584858786878A 8A898C868789858689868889898A8D87888A88888B85878A87878986878988888B858789858587 88898B89898B8A8A8D898A8C8A8B8D8A8A8C8A8A8D8A8A8D8A8B8E88898B898A8C8B8B8D8A8A8C 8A8A8C8B8B8C89898C898A8C8A8B8C8A8A8C898A8C898A8C87888B88898B8B8C8E898A8B87888A 88898A88898B89898C88888A89898C898A8C89898B8A8B8D87898B8A8B8C89898C89898C8A8A8C 8A8B8D89898C88898B89898B88898B8B8B8E8B8B8E8C8D8F8A8A8D898A8D8B8A8C8B8B8D898A8C 8B8B8D8B8B8D8B8C8E8D8D8E8C8C8E8C8D908B8B8E8C8C8F8C8A8D8A8B8D8B8C8E8D8D8F8C8D8F 8B8C8D8B8B8E8C8D8F8D8E908B8D8F8C8D8E8D8E908C8D8F8D8E8F8D8D8F8B8B8D8D8E8F8C8D8F 8D8E8F8D8E8F8D8D908D8D908D8D8F8F8E908D8D8F8E8E918C8D8F8D8E908C8D8E8C8C8E8B8C8D 8D8E908D8D8F8C8D8E8F8F918D8D8F8E8F908E8E908E8D8F8D8E8F8F8E908D8D8F8E8F908E8E8F 8D8E8F8F8F908D8D8F8D8D908E8F908F90918D8E908C8D8F8C8C8F8C8D8F8D8E8F8C8C8F8E8F90 8C8D8F8D8E908D8D8F8E8E8F8E8E8F8C8E8F8B8C8E8D8D8E8C8D8E8D8E908C8D8E8D8E8F8E8F90 8B8D8E8C8C8E8D8D8E8C8E8F8D8E8E8D8E908D8E8F8C8C8E8C8C8E8C8D8F8D8D8F8F8F90909092 9190918E8F908D8E908D8C8E8D8E908D8E908E8F908D8E908E8E908D8E8F8E8F8F8D8E8F8F8F90 8E8E8F8D8D8E8D8D8F8F8F918F8F928D8D8F8C8D8F8F8F918F8E908D8E8F8D8D8E8D8D8F8E8E90 8D8E8F8D8D8F8D8F908E8F908F8E8F8E8E908D8D8F8D8E8F8D8E8F8C8D8F8D8D8F8B8D8E8C8D8E 8E8E908C8D8E8C8D8E8A8B8C8B8B8C8C8D8E8B8C8E8C8B8D8C8C8D8A8A8C8A8A8D88898B868888 88898A8A8A8C89898B87898B888A8C8688898A8A8C88898B88898A86888985878986888B858789 86898A848788797C7D6C6F715A5D5D4648482B2E2E111114080808000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000A0A0E2121214444445D6060 7273748484878B8C8F9192948E90918C8C8F898B8D89898B88888B88888B8B8C8E8B8B8D8D8E8F 90909291929493949592939597989998989A95969796959798989A93949692929597979A98989B 9597989594979A9A9C9E9EA099999A98989A9A9B9D9D9C9F96989995969898979A939395959597 96969795969894949695959897989898989899999C9A9A9C95959798989995969798989A9A999B 9696989695989C9C9E9A9A9C9A9A9B97989A96979898999A97989A9B9B9C98989A9F9FA0A1A0A2 A1A0A1A0A0A09F9FA0A09FA0A1A1A1A09FA0A09FA09FA0A0A09FA0A0A0A0A09F9F9F9F9FA09F9F A0A0A09F9F9F9F9F9FA09F9FA09F9FA09FA09F9FA0A0A1A1A0A0A09FA0A09F9FA0A09FA09FA0A0 A1A0A1A09F9F9F9F9F9E9E9F9F9F9FA0A0A0A0A0A09FA0A09F9E9F9F9F9FA0A0A1A0A0A09F9FA0 9F9FA0A0A0A1A09FA09F9FA0A09FA0A0A0A1A09FA0A19FA1A09FA09F9F9F9F9FA0A09FA0A0A0A0 A09F9F9F9F9FA09FA0A0A0A1A0A0A0A1A0A1A09FA0A09FA0A0A0A1A1A0A1A0A0A0A0A0A0A0A0A0 A0A0A0A1A1A1A09FA0A0A0A0A09F9FA0A0A09FA0A0A09F9FA0A0A09F9F9F9F9FA0A09FA0A0A0A0 A0A0A0A0A0A0A1A0A1A19FA0A1A0A1A0A1A09FA0A09F9FA0A1A0A1A1A0A0A09FA0A0A0A0A1A0A0 A1A0A0A1A0A0A09FA0A0A0A0A19FA09F9EA09E9E9FA09FA0A09FA09FA0A0A09FA0A09F9FA09FA0 A0A0A0A0A0A0A0A1A0A09FA0A0A0A19F9F9FA0A09FA0A0A09F9F9F9F9F9FA1A0A1A1A1A0A1A0A1 A0A0A0A0A0A19F9FA09F9F9F9F9FA0A1A1A09E9D9F9F9EA0A1A0A19FA0A0A1A1A0A09FA0A09FA0 A0A1A0A1A0A0A09FA0A1A0A0A09FA09F9F9FA1A1A19F9EA0A09F9FA0A0A1A1A0A1A1A1A0A0A0A0 A0A0A0A1A0A19F9F9FA0A0A0A0A0A0A2A1A2A1A1A1A1A0A0A0A0A1A1A0A1A0A0A0A09F9FA1A1A0 A1A1A1A0A0A1A0A0A19F9FA0A0A0A1A1A1A1A1A1A1A1A0A0A1A1A0A1A0A1A1A0A1A1A1A1A0A0A0 A0A0A19FA0A0A1A0A1A0A0A1A1A0A0A0A0A0A0A0A09F9FA1A0A0A19FA09F9F9F9EA1A1A2A0A0A0 A0A0A09FA09F9F9FA0A09FA1A09FA0A1A0A19F9F9F9F9FA0A09FA09E9E9F9E9E9F9D9E9F9F9E9F 9D9D9D9A9A9C9798989596979595979292958F8F918C8C8E898A8B878889858688858687858688 87888A8A8C8E8C8D8E90919385878A787A7C66666852555537373918181B080808000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 0000000000000000000000001212153737395454566F70728283858A8B8D8D8E908B8C8F8A8B8E 898A8C88878A88898A8A8A8B9191939695989A9A9C9E9FA09F9FA0A3A3A4A2A2A3A1A0A2A09FA0 9E9D9E9897989594958D8D8D8685858382837D7C7E7575786E6E706C6C6E67696B6060625A5A5C 5A5A5D5A5B5C535456525355525355555557535455545557545557545457565658555657545556 555557555557565656565557545457565658555557545357545557525355565658555457525354 555657575758545457565658545456545555545556565758565658585758575858575758565758 565758565758565757565757565657565859575757565757575758565859585959575758575758 575759575858585759565656575859585859575858575859585859575758585959585859585758 58585957575958575957585858595957585957585A575859565757575758585759565858575758 575858565657565657575758565758565758565657555656565658555757565657565657555657 555657555657565657555557545556555757545557535456555556555657545556545556555557 535355535556535455545556535456545556565657535456555657555556545556545557555556 535455535455565658555656555556565657565656555557545556555556565556555556535356 555456555556555657515254515253545556555556545555545556555556555557545556545456 535355555557555556555556545658555656535556555557575657565757575758555657555658 525456525455565758565656545656545456555657555557545556555658555657555657555657 565657555556555556545456565757545557555557545556565757545657555556555658555657 545555555556545556555657555658545657545556555556555657545557555657555557555658 565757555657545556565657555657555557565758565759565757565757555658575758565757 56565757575956585857575958585957585958585A57585958595A58595A58595A58595A58595A 595A5B5C5C5E5C5C5E5E60616162626565666969696F6E6F7373747677787D7D7D838282878888 8C8C8C9595959998979C9C9DA1A0A0A2A2A2A1A2A2A1A1A29D9D9F999A9B9595979091938A8B8D 86878A86878888888989898B8A8B8D898C8E8688897B7C7F63636646464A272727070707000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 0000000000000000000000000000000000000000000000000000000000000000000000000B0B0B 373739615F617D7C8089898B8E90918D8D8F8A8A8D8A8B8C86878A89888B8D8D8F92929398989A 9E9FA0A0A0A2A3A2A39E9F9F9A99998E8D8E7B7A7B6D6E6E5E5F61515254444549383A3D313336 282A2F2224281A1C21191C2215171F11151C0D12170A0D120A0D13070A1006090F060910060A10 060A10060A1006090F060A10060A10060A10060A1006071004060F06070D06070D04060D03060D 04060D03060D03060D02060D03090D03070D03060D02070D03060D02060C02060C03060D03060C 03060D03071002060D02030A01030A02050C03060C02050A01050A02060D03060C03060D04070D 02060D03060D02060A02050A03060C03060A02060C02050A03060D03060D03060D03060D02060C 03060D02030A02060A03070D02060C02030A02050A02060C03060D03070D03060D03070D040910 04060F02060C02060D03060D03060D03070D03060D01050A02030901050701050A02070D03070D 02060D02060C02060D02090D03070D02050D02030C02060C03070D02060C02060C02030C02050A 03070D03070F02060D02060D02060D02050C02050A02060D02060D02060C02050A02060A02060D 02050C02060C02060D03060D03060D02060D02070D02060C01050A01050A02050C01030A01030A 03070F02060D02050C02050C02030A01030A02060D02060A03060C02050C02060C02050C02050C 02060D01050D01050C01020A02050C02060D01030A02060D03070F02050C01030A01030C02050A 02050A02060C03070D02060D02060D02060D02060C01030A02050A02060D02060C01030A01050C 04091003060D02060D02050D01060A02060C02060C04070F03070F02060D02060D02070D02060D 02050C02050A02060C03060D03060D02060C03060C02070F02050A02050C02050A01050A02060A 02060D02060A02030A03070F02060C02030A03060D03070F03060D02050C02060C02060C02060D 02060D02060A01060A02050A02050C02060D03070D02060D02060C02060A01030901020902060D 02060D02050A03060F04070D03070F03070F03060D02060C02060C02050A02060D02060D01050A 01050A03070F02060D04060D06090F060A0F06070F080A0F0B0F141010151515181C1D20232629 2D2F323B3C3F48494B5454566161637372737F7F7F8D8D8C9897979F9E9FA3A3A3A0A1A19C9D9D 969798909191898A8C88898A87888987898B8A8A8C8B8B8E7D8082696A6B4C4D4D262626000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 0000000000000000000000000000000000000000000000001414144D4D4F7373768283868E8F92 8F8E9089898B898A8D89898B8E8D8F8D8D8F9393959C9C9EA0A0A19A9A9B8C8C8D7E7E7E666668 4F50533B3D3E2B2D301F212716191F10141A0F141913161D161B22181D2420252A262A312C3037 36393F3C3E4642444B494C514D5054505357575A5E5A5D625E61655F626660626763666A66696C 686B6E696B6F696D70696C70696C70696B6F696B6F696C70696B6E696B6F686B6F686A6E686A6E 696C6F696C6F696D70696D6F696D6F696C6F696D6F696D6F696B6E696C70696B70696C6F6A6D71 696C6F686A6E686B6E696B6E696B6E686B6E686B6E696C6F696C6F696B6E696C70696C70696C70 696C6F686A6C686A6F696B6F686B6E686B6E696C6F696C6F696C6F696C70696B6F696B6E696B70 686B6D696B6F696C6F696B6E686A6D696B6F696B6F696C706A6D706A6C706A6E716A6C71696B6F 696B6F696B6F686B6E696C6F696C70696C6E676B6D67696C67696C676B6E696C6F686B6E676B6D 676A6D696C6F696C6F686B6E676A6E676A6D696C6F676A6D686A6D686A6D676A6D676A6D686B6E 686B6F676A6E676A6E67696E66696D676A6D686A6E676A6D66696C66696C676A6D67696E66696D 66696C66696D676A6D676A6D67696D676A6D66696B66696B66696D65686C64676A676A6D676A6E 65686C66686D66686C65686B66686C66696C66696C66696D66696D66686D65676B65686C66696D 66696C65676C65686B676A6E66696C66686D676A6E66696D66696C66696D66686B66686C66686C 676A6C66696D676A6D66696C66696D64676B66686B676A6C66696C66696D676A6D676A6D676A6E 676A6D676A6D676A6C686A6D676A6D686B6E686B6E676A6E676A6E696C6F696C70676A6D66686C 67696D686A6E676A6D676A6D67696D686B6F676A6D67696D67696D66696B66696D676A6E676A6D 66686C67696E676A6D66696C676A6D686B6E696C6E686B6E676A6D676A6D676A6D696B6F686A6D 676A6D676A6D676A6D686A6E686B6E686A6E676B6D676B6E67696D66696C676A6D686B6E67696D 686B6E686B6E696C6F696B6F686B6F676A6D676A6D676A6D64666B6164686063675F62665F6267 5C5F6457595E4F52574B4E53484A4F3F4247373A3F32363A292B30212328191E2313181E0F141B 080D130609100609100A0C131113181B1D22292C2E3D3E3F5152536768677E7E7E9191919E9E9E A3A3A39E9FA099999A8F90918A8A8A89898A87888A8A8B8C86888977787B6061654042420B0B0B 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 0000000000000000000000001F1F226060617A7A7C8484878B8B8F8B8B8D8B8D8D898A8B8A8B8C 8C8D8F9494969A9B9D9797998687876E6E6F51515333353720212416181E14171E171B221D2228 26293030343A3B3F444A4D51575A5D6265676F7274777A7D7F828487898A8C8D8F939596969798 9B9B9C9EA0A0A0A2A2A4A5A5A6A7A7A9AAA9ABABABACADADAEAEAFB0B0B0B0B1B1B1B2B2B2B3B3 B2B4B4B3B5B4B4B5B5B5B6B6B5B7B7B6B7B7B6B7B7B6B8B7B6B8B8B7B8B8B7B8B8B7B8B8B7B8B8 B7B8B8B7B9B9B7B9B9B7B9B8B7B9B8B7B9B9B7B9B9B7B9B9B7B9B8B7B9B9B7B9B9B7B9B9B7B9B8 B7B8B8B7B8B8B7B8B8B6B8B8B6B7B7B5B7B6B5B7B6B5B6B6B5B6B6B4B5B5B4B5B5B3B5B5B4B5B5 B3B5B5B3B5B4B4B5B5B4B5B5B3B5B4B4B5B5B4B6B6B4B6B6B4B5B5B4B5B5B5B5B6B5B6B6B4B5B5 B4B5B5B5B6B6B5B6B6B5B6B6B4B6B5B5B6B6B5B6B5B5B6B6B4B6B5B5B5B5B5B5B5B5B6B6B5B6B5 B5B6B6B4B6B5B5B6B5B5B5B5B4B6B6B4B5B5B4B6B5B4B6B5B4B5B5B4B5B5B4B5B5B4B5B5B4B5B5 B3B5B5B3B5B4B4B5B5B4B5B5B4B5B5B3B5B4B3B5B4B3B5B4B3B5B5B3B5B4B2B4B4B2B3B3B3B4B4 B2B4B3B2B4B3B2B4B4B2B4B4B2B4B3B2B4B3B2B3B3B2B3B3B2B3B3B2B3B3B2B3B3B1B3B3B2B3B3 B2B3B3B1B3B3B1B3B3B1B3B2B1B3B3B2B3B3B1B2B2B2B3B3B2B3B3B2B3B3B1B3B2B1B3B2B1B3B2 B1B3B3B2B4B3B2B3B3B1B3B2B2B4B2B2B4B3B1B3B3B1B3B3B1B3B3B2B3B3B2B4B3B2B3B3B2B3B3 B2B3B3B2B3B3B2B4B4B2B4B3B2B3B3B2B4B4B2B4B4B2B4B4B2B4B4B2B3B3B2B4B4B2B4B4B2B4B3 B3B4B3B2B4B4B3B4B4B3B4B4B2B4B3B3B4B4B3B4B4B3B5B5B3B5B4B3B5B4B3B5B5B3B5B5B4B6B5 B3B5B5B3B5B5B4B5B5B4B5B5B4B5B5B3B5B5B4B5B5B4B5B5B4B5B5B4B5B5B4B5B5B3B5B5B4B5B5 B4B5B5B4B5B5B3B5B5B3B5B5B4B5B5B3B5B5B3B5B5B3B5B5B4B5B5B4B5B5B3B5B5B3B5B4B4B5B5 B3B5B5B3B5B5B3B5B5B3B5B5B3B5B5B4B5B5B4B5B5B4B5B5B4B5B5B4B5B5B4B6B5B4B5B5B5B5B5 B5B6B6B4B6B6B4B6B5B4B6B5B4B6B6B4B6B6B5B6B5B4B6B5B5B6B6B5B6B6B5B6B6B5B6B6B4B6B5 B5B6B5B4B6B6B5B6B6B4B6B6B5B5B5B5B5B5B4B4B4B4B3B4B3B4B3B3B3B3B2B2B2B2B2B2B0B0B0 AEAEAEADADAEADADADA9AAAAA6A7A7A4A5A69E9FA1989A9A919394888A8C7F808371747864666B 55585C44474D33363D23262E1519220C1317070D130A0D1311141A21232738393B545555707171 8C8C8C9D9D9DA1A1A19B9A9B919192898A8B86878988878A8587897F82836F70724A4D4E0F0F0F 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 1F1F1F67676A8586878A8B8C8C8C8E8C8C8F8D8C8E8D8D8F8D8D9091919498989A9696977B7B7C 56565836383B1F2126181D211C212721242A2A2D333A3C434B4D545B5E636A6D70777A7C838687 8B8E8E93949498999A9C9D9EA0A1A1A3A4A4A5A6A7A8A8A9AAABACACADAEAEB0B0B2B2B3B3B5B6 B5B7B8B8B9B9B9BAB9BBBCBCBCBDBCBEBFBEBFBFC0C0C1C1C1C1C1C1C2C1C2C3C2C2C4C4C3C5C4 C4C5C5C5C6C6C6C6C6C6C7C7C6C7C7C6C8C7C7C7C7C7C8C8C7C7C8C7C7C8C7C8C8C7C8C8C7C8C8 C8C8C8C7C8C8C8C8C8C8C9C9C7C8C8C7C9C9C8C8C8C8C8C8C8C8C8C7C8C8C7C8C8C7C8C8C7C7C8 C6C7C7C6C7C7C6C6C6C5C5C5C4C5C5C3C4C4C3C4C4C3C3C3C2C3C3C2C3C3C2C2C2C2C2C2C2C2C2 C1C2C2C1C2C2C1C2C2C1C2C2C1C2C2C1C2C2C2C2C2C1C2C2C1C2C2C2C2C2C1C2C2C1C2C2C2C2C2 C2C2C2C2C2C2C1C2C2C1C2C3C2C3C3C1C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C1C2C2C1C2C2 C1C2C2C1C2C2C1C2C2C2C2C2C1C2C2C1C2C2C1C2C2C1C2C2C1C2C2C1C2C2C1C2C2C1C2C2C1C1C1 C0C1C1C0C1C1C0C1C1C0C1C1C0C1C1C0C1C1C0C1C1C0C1C1C0C0C0BFC0C0BFC0C0C0C0C0BFC0C0 BFC0C0BFC0C0BFC0C0BFC0C0BFC0C0BFBFBFBFBFC0BFC0BFBEBFBFBEBFBFBEBFC0BEBFBFBFBFBF BEBFBFBEBFBFBEBFBFBEBFBFBEBFBFBEBFBFBEBFBFBEBFBFBEBFBFBEBFBFBEBFBFBEBFBFBEBFBF BEBFBFBEBFBFBEBFBFBEBFBFBEBFBFBEBFBFBEBFBFBEBFBFBEBFBFBFBFBFBEBFBFBEBFBFBFBFC0 BFC0C0BFBFBFBFBFBFBFC0C0BFC0C0BFC0C0BFC0C0BFC0C0BFC0C0BFC0C0BFC0C0BFC0C0BFC0C0 BFC0C0C0C0C0C0C1C1C0C0C0BFC0C1C0C1C1C0C1C1C0C1C1C1C1C1C1C1C2C1C1C2C1C1C2C1C1C2 C1C2C2C1C2C2C1C1C1C1C1C2C1C1C2C1C2C2C1C2C2C1C2C2C1C1C2C1C2C2C1C2C2C1C2C2C1C2C2 C1C2C2C1C2C2C1C2C2C1C2C2C1C2C2C1C2C2C1C2C2C1C2C2C1C2C2C1C2C2C1C2C2C1C2C2C1C2C2 C1C2C2C1C2C2C1C2C2C1C2C2C1C2C2C1C2C2C1C2C2C2C3C3C2C3C3C1C2C3C2C3C3C2C3C3C2C3C3 C2C3C3C2C3C3C2C3C3C2C3C3C2C3C3C2C3C3C2C3C3C2C3C3C2C3C3C2C3C3C2C3C3C2C3C3C2C3C3 C2C3C3C2C3C3C2C3C3C2C3C3C2C2C2C1C2C2C1C2C2C0C2C2C1C2C2C0C1C1C1C0C0C1C1C1C0C1C1 BFC1C1C0C1C1BFC1C1BFBFBFBFBFBFBEBEBEBCBDBDBBBBBBB9B9B9B6B7B7B2B3B3AEAFAFA7A9A9 9FA0A19495978486897175775E6165474A5132363C1F222B0D1019070D130D10171B1D21363839 59595A7D7D7D9595969E9FA09B9B9B90909189898B8485868081837D7F807071744E4E510D0D0D 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 0000000000000000000000000000000000000000000000000000001212155F6162828385878789 88898A8A8A8C8E8E8F8E8E90908F919595969393957F7F815757592E31331A1D21191D24292C32 373A3F464A4E55585C64676A7376798385878E8F90949596999A9B9D9F9FA1A3A4A5A6A7A9AAAA ABADADAEAFB0B1B2B2B3B4B5B5B6B7B7B8B9B9BABBBBBCBDBCBDBEBEC0BFC0C1C1C2C2C2C3C4C4 C4C5C5C5C5C5C6C7C7C6C7C7C8C8C9C7C9C9C8C8C8CAC9C9CBCACACACBCCCACBCBCBCBCCCCCDCD CDCDCDCDCECECDCECECDCECECDCECECECECECECECECDCECECECECECECECECECFCFCECFCFCECFCF CECFCFCECFCFCECFCFCECFCFCECFCFCECFCFCECFCFCECECECECECECECECECECECECDCDCDCCCDCD CBCCCCCACCCCCACBCBC9CACAC9C9C9C9C9C9C8C9C9C8C8C8C7C8C8C7C8C8C7C7C7C7C8C8C7C7C7 C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C8C8C7C8C8C7C8C8C7C7C7C7C8C8C7C7C7C7C7C7C7C7C7 C7C7C7C7C7C7C7C7C7C7C7C7C7C8C8C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7 C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C6C7C7C6C7C7C6C7C7C6C7C7C6C7C7C6C7C7C6C6C6C6C7C7 C6C6C6C5C6C6C6C6C6C6C6C6C5C6C6C5C6C6C5C6C6C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C4C5C5 C5C5C5C4C5C5C5C5C5C5C5C5C4C4C4C4C5C5C4C4C4C3C4C4C4C4C4C4C4C4C3C4C4C4C4C4C4C4C4 C3C4C4C4C4C4C3C4C4C4C4C4C4C4C4C4C4C4C3C4C4C4C4C4C4C4C4C3C4C4C4C4C4C4C4C4C3C4C4 C4C4C4C3C4C4C4C4C4C3C4C4C3C4C4C4C5C5C4C4C4C4C4C4C4C5C5C4C4C4C4C4C4C4C5C5C5C5C5 C4C5C5C4C5C5C5C5C5C5C5C5C4C5C5C5C5C5C5C6C6C5C6C6C5C5C5C5C5C5C5C5C5C5C5C5C5C6C6 C5C6C6C5C6C6C6C6C6C6C6C6C6C7C7C6C6C6C6C7C7C6C7C7C6C7C7C7C7C7C7C7C7C6C7C7C6C7C7 C7C8C8C7C8C8C6C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C8C8C7C7C7C7C8C8C7C7C7C7C7C7C7C7C7 C7C7C7C6C7C7C7C8C8C7C7C7C7C7C7C7C7C7C7C8C8C7C7C7C7C7C7C7C8C8C7C7C7C7C7C7C7C7C7 C7C7C7C7C8C8C7C8C8C7C8C8C7C8C8C8C8C8C7C8C8C7C8C8C8C8C8C8C8C8C8C8C8C8C8C8C7C8C8 C8C8C8C7C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C9C9C8C8C8C8C9C9C8C8C8C8C9C9C8C8C8C8C8C8 C8C8C8C8C8C8C8C8C8C8C9C9C8C8C8C8C8C8C8C8C8C8C8C8C8C9C9C8C8C8C9C9C9C9CACACACACA CACBCBCBCBCBCACBCBCACBCBC9C9C9C8C8C9C7C7C7C5C6C6C3C4C4C0C1C1BDBEBEBABBBCB8B9B9 B4B5B6B0B1B2ACACADA3A3A59697988486886E717454595C3A3E441F22290D1018070A120E1216 282A2D5253557C7D7D9696979E9D9D959595898A8A8182837B7C7D7B7C7D717274434347040404 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 0000000000000000000000000000000808084C4D4F7C7C808384888484878A898B8E8E8F909092 9292939595968B8B8C6968693A3B3C1D1F221E202530343A43464D515458616468717375828384 8E8F909798999D9E9FA0A1A1A3A4A4A7A8AAABACADAEB0B1B2B3B3B4B5B5B5B6B7B7B7B8B9B9BA BABBBCBBBCBDBDBDBEBEBFBFBFC0C1C0C1C1C1C2C2C3C4C4C4C4C5C5C5C5C6C6C6C6C7C7C7C7C8 C7C8C8C7C8C8C9C9C9C8C8C9C8C8C9C9C9C9C9CACACACACACACBCBCACBCBCBCCCCCCCDCDCDCDCD CCCDCDCCCDCDCCCDCDCCCDCDCCCDCDCDCDCDCDCDCDCDCDCDCDCECECECECECDCECECECECECECECE CECECECECECECECECECECFCFCDCECECDCECECDCDCDCDCDCDCCCDCDCCCDCDCBCCCCCACBCBCACBCB C9C9C9C9C9C9C8C8C8C7C7C7C6C7C7C6C7C7C6C6C6C5C6C6C5C6C6C5C6C6C5C6C6C5C6C6C5C6C6 C5C6C6C6C6C6C5C6C6C5C6C6C6C6C6C5C6C6C5C6C6C5C6C6C5C6C6C5C6C6C6C6C6C6C6C6C5C6C6 C6C6C6C6C6C6C6C6C6C5C6C6C5C6C6C5C6C6C5C6C6C5C6C6C5C6C6C5C6C6C5C6C6C6C6C6C5C6C6 C5C6C6C5C6C6C5C6C6C5C5C5C5C5C5C5C5C5C4C5C5C5C5C5C4C5C5C5C5C5C4C4C4C4C5C5C4C5C5 C4C5C5C4C4C4C3C4C4C3C4C4C3C4C4C3C4C4C3C3C3C3C3C3C3C4C4C3C4C4C3C3C3C3C3C3C3C3C3 C2C3C3C2C3C3C2C3C3C2C3C3C2C2C2C1C2C2C2C3C3C2C2C2C2C2C2C1C2C2C2C2C2C2C2C2C2C2C2 C1C2C2C2C2C2C2C2C2C2C2C2C1C3C3C2C2C2C2C3C3C2C2C2C2C2C2C2C2C2C2C3C3C2C3C3C2C2C2 C2C2C2C1C2C2C1C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C3C3C2C2C2C2C3C3C2C3C3C3C4C4C2C4C4 C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C4C4C3C3C3C3C4C4C3C3C3C3C3C3C4C4C4C4C4C4 C4C4C4C4C4C4C4C5C5C4C5C5C4C5C5C4C5C5C5C5C5C5C6C6C5C5C5C5C5C5C5C6C6C5C5C5C5C5C5 C5C6C6C5C5C5C5C5C5C5C5C5C5C6C6C5C6C6C5C6C6C5C6C6C5C5C5C5C6C6C5C5C5C5C5C5C5C6C6 C5C6C6C5C6C6C5C6C6C5C5C5C5C6C6C5C6C6C5C6C6C5C6C6C5C6C6C5C6C6C5C6C6C5C5C5C6C6C6 C5C6C6C5C6C6C6C6C6C6C6C6C6C6C6C5C6C6C6C7C7C6C7C7C6C7C7C6C7C7C6C7C7C6C7C7C6C7C7 C6C7C7C6C7C7C6C7C7C6C7C7C6C7C7C6C7C7C6C6C6C6C7C7C6C6C6C6C7C7C6C7C7C6C7C7C6C7C7 C7C7C7C6C7C7C6C6C6C6C7C7C6C7C7C7C7C7C7C7C7C7C7C7C9C9C9C9CACACBCBCBCCCCCCCDCDCD CDCDCDCDCECECDCECDCDCECECDCDCDCCCECECBCCCCCACBCBC9CACAC8C9C8C6C7C7C2C3C4C0C1C1 BCBCBDB9B8BAB5B5B6B1B2B2ADAEAEA4A5A696989980838465686B474A4F292D3512171E04090F 0D0F142E30325E5F5F8A898A9D9C9D9898988D8E8F7F808178797B7B7C7F6B6B6D313133000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 0000000000002525286F707287878B81828487888A8B8B8D8D8D8F9393949393948282835B5B5D 3031341F23252E323646494F55585D6365697577798788899495969B9C9C9FA1A2A3A5A5A6A8A9 ABABACAFB0B0B1B2B3B2B3B5B5B6B7B7B8B8B9B9B9BABBBBBABBBABBBBBCBBBCBCBDBCBEBEBEBF BFC0C0C0C1C1C1C1C2C1C2C3C3C3C4C3C4C4C4C4C5C4C5C6C6C6C6C6C6C7C6C7C7C6C6C6C6C6C6 C7C7C7C7C7C7C7C7C7C7C7C7C8C8C8C7C9C9C8C8C8C9C9C9C9CACACAC9C9CACACACAC9C9C9CACA CACACACACACACACACACBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCCCCCBCBCBCBCBCBCBCCCCCBCBCB CBCCCCCBCBCBCBCBCBCBCBCBCACBCBCACACACACACACACACAC9C9C9C8C8C8C7C8C8C7C7C7C6C6C6 C6C6C6C6C5C5C5C5C5C4C5C5C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4 C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4 C4C4C4C4C4C4C4C4C4C3C4C4C4C3C3C3C4C4C3C4C4C4C4C4C3C4C4C2C4C4C2C4C4C3C3C3C2C3C3 C2C3C3C3C3C3C2C3C3C2C3C3C3C3C3C1C2C2C2C2C2C2C3C3C1C2C2C2C2C2C1C1C1C2C2C2C2C2C2 C0C1C1C0C0C0C0C1C1C0C0C0C0C0C0C0C0C0BFC0C0C0C0C0C0C0C0BFBFBFBFBFBFC0BFBFBFBFBF BFBFBFBEBFBFBEBFBFBFBFBFBEBFBFBEBEBEBEBEBEBEBFBFBEBEBEBEBFBFBEBEBEBEBEBEBEBEBE BEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBDBEBEBEBEBE BEBEBEBEBEBEBEBEBEBEBEBEBFBFBFBFBFBFBEBFBFBEBFBFBFBFBFBEBFBFBFBFBFBFBFBFBFBFBF BFBFBFBFBFBFBFC0C0BFBFBFBFC0C0BFBFBFC0C0C0C0C0C0BFC1C1C0C0C0C0C0C0C0C1C1C1C1C1 C1C1C1C2C1C1C1C2C2C1C2C2C1C1C1C2C2C2C2C2C2C2C2C2C2C2C2C2C3C3C2C2C2C1C2C2C1C3C3 C1C2C2C2C2C2C2C2C2C2C3C3C2C2C2C2C2C2C1C2C2C2C3C3C3C3C3C2C3C3C2C2C2C2C2C2C2C3C3 C2C2C2C2C3C3C3C3C3C3C2C2C2C3C3C2C2C2C2C3C3C2C2C2C3C2C2C3C3C3C2C2C2C2C3C3C3C3C3 C3C3C3C2C3C3C3C3C3C3C3C3C2C4C4C3C3C3C3C3C3C3C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4 C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C5C4C4C4C4C4C4C4C4 C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C6C6C6C6C7C7C7C8C8C9C9C9C9C9C9CBCACACBCCCCCCCCCC CCCDCDCDCDCDCDCECECDCDCDCDCDCDCDCDCDCCCDCDCCCCCCCBCCCCCBCCCCCACBCBC8C8C9C7C7C7 C4C4C4BFC0C1BBBDBEB6B8B9B3B5B5B0B1B1A8AAAA9B9D9D85888A676A6E46484D282B310D1218 03070D1A1D204C4C4E7E7E809899999899998B8D8E7C7D7E7D7D7F8384875C5C5F0F1212000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000070707505253 8182858485888585868C8D8E9090929494969393957E7E7F5656572E3032292C3140424853565A 5D60646E71738385859395959C9D9EA0A0A1A4A4A5A8A9A9ACACADAFB0B0B0B1B2B2B2B3B4B4B5 B6B6B7B7B8B8B8B9B9B9BABABBBBBBBCBDBCBDBDBDBEBFBEBEBFBFBEBFC0BFC0C0C1C0C2C2C2C1 C2C3C2C4C4C3C3C5C4C4C4C4C4C5C5C5C5C6C5C6C6C6C6C6C6C6C6C6C6C6C6C5C6C5C5C5C5C5C5 C5C5C5C5C6C6C6C6C6C6C6C6C5C7C7C6C7C7C6C6C6C6C6C6C6C6C6C6C7C7C7C6C6C6C6C6C6C7C7 C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C8C8C8C8C8C7C7C7C8C8C8C7C8C8C8C8C8C7C7C7C7C7C7 C7C8C8C7C7C7C7C7C7C7C7C7C6C7C7C6C6C6C6C6C6C5C6C6C6C5C5C5C5C5C4C4C4C3C3C3C4C4C4 C3C4C4C3C3C3C3C4C4C3C3C3C2C2C2C3C3C3C3C3C3C2C3C3C3C3C3C3C3C3C2C3C3C2C3C3C2C3C3 C3C4C4C3C4C4C3C4C4C4C4C4C3C4C4C3C3C3C3C4C4C3C3C3C3C3C3C3C4C4C3C3C3C3C4C4C3C4C4 C3C3C3C3C3C3C4C4C4C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C2C3C3 C3C3C3C1C2C2C2C2C2C2C2C2C1C1C1C2C2C2C2C2C2C1C2C2C2C2C2C1C1C1C1C1C1C1C1C1C1C1C1 C1C1C1C0C1C1C1C1C1C1C0C0C0C1C1C0C1C1C0C0C0C0C0C0C0C0C0C1C0C0C0C0C0C0C0C0BFC0C0 BFC0C0C0C0C0BFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBEBFBFBFBFBFBEBEBEBEBFBF BFBFBFBFBFBFBFBFBFBEBFBFBFBFBFBFBFBFBFBFBFBEBFBFBEBFBFBEBEBEBEBEBEBFBFBFBFBFBF BFBFBFBFBFBFBFBFBFBEBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFC0C0C0C0C0C0BFC0C0C0C0C0 BFC0C0BFC0C0C0C0C0BFC0C0C0C0C0C0C0C0C0C1C1C0C0C0C0C1C1C0C0C0C1C1C1C1C1C1C2C2C2 C2C2C2C1C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C3C3C2C2C2C2C3C3C2C3C3C2C2C2C2C2C2 C3C2C2C2C2C2C2C2C2C2C2C2C2C2C2C3C2C2C3C3C3C2C3C3C1C2C2C2C2C2C2C2C2C2C2C2C0C2C2 C2C2C2C2C2C2C1C2C2C2C2C2C1C2C2C2C2C2C2C2C2C2C2C2C2C2C2C1C2C2C2C2C2C2C2C2C2C2C2 C2C2C2C2C2C2C2C3C3C3C3C3C2C2C2C2C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3 C2C2C2C2C2C2C2C2C2C2C2C2C3C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2 C2C2C2C3C3C3C2C2C2C2C2C2C4C4C4C4C4C4C5C5C5C6C6C6C7C8C8C8C8C8C8C8C8C9C9C9CACACA CACACBCBCCCCCBCBCBCCCCCDCCCCCDCCCCCCCDCCCDCCCCCDCBCBCCCCCCCCCBCCCCC9CACAC8C9C9 C7C8C8C5C6C6C2C3C3BDBEBFB8B8B9B3B4B4AEAFAEA6A6A79798997E80835D5F63383C41171B21 0609101214183F404279797B9C9B9C9A9B9A898B8B787A7B828385787A7C363838000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 0000000000000000000000000000000000000000000000001A1A1A6D6D70888A8C8384868B8B8D 8C8C8E92919398989A8586875D5E5F37393A323538474A4F5A5D6264666B7677788B8D8C999A9A 9FA09FA2A3A4A5A7A7A9ABAAACADAEAEB0B0B0B1B1B2B2B2B4B4B4B6B5B6B7B6B8B7B8B9B8B9B9 BABABABABBBBBCBCBDBCBDBDBDBDBDBEBDBEBFC0BFC0C0C0C1C0C0C1C1C1C2C2C2C3C3C3C4C4C4 C4C5C5C6C6C6C6C6C7C8C8C8C9C9C9C9C9C9C9C9C9CACACACBCACBCCCCCCCCCCCCCCCCCCCECECE CECECECFCFCFCFD0D0D1D0D0D1D1D1D2D2D2D2D2D2D4D4D4D4D4D4D4D4D4D5D5D5D5D5D5D6D6D6 D5D5D5D6D6D6D7D7D7D8D7D7D8D8D8D9D9D9D9D9D9D8D8D8D9D9D9D9D9D9D9D9D9DAD9D9D8D8D8 DADADAD9D9D9D9D9D9D9D9D9D9D9D9D8D9D9D9D8D8D9D8D8D7D7D7D8D8D8D8D8D8D8D7D7D8D8D8 D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D7D7D7D7D7D8D8D8D8D8D8 D7D7D7D7D7D7D7D6D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D6D6D6 D6D6D6D5D5D5D5D5D5D6D6D6D6D6D6D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5 D4D4D4D4D4D4D5D5D5D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D3D3D3D3D3D3D3D3D3D2D2D2D3D3D3 D2D2D2D2D2D2D2D2D2D2D2D2D1D1D1D2D2D2D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1 D1D1D1D0D0D0D0D0D0D0D0D0D1D1D1D0D0D0D0D0D0D0D0D0D0D0D0D1D1D1D0D0D0D0D0D0D0D0D0 D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0 D0D0D0D1D1D1D1D1D1D1D1D1D1D1D1D2D2D2D0D0D0D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1 D2D2D2D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D2D2D2D3D3D3D2D2D2D2D2D2D2D3D3D3D3D3D3D3D3 D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3 D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4 D3D3D3D4D4D4D3D4D4D4D4D4D4D4D4D4D4D4D4D4D4D3D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4 D4D4D4D5D5D5D4D4D4D4D4D4D5D5D5D6D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5 D5D5D5D5D5D5D6D5D5D5D6D6D6D6D6D5D6D6D6D6D6D6D6D6D5D5D5D5D5D5D6D6D6D6D6D6D6D6D6 D5D5D5D6D6D6D6D6D6D6D6D6D7D7D7D7D7D7D7D7D7D6D6D6D5D5D5D4D4D4D2D2D3D1D1D2D0D0D0 CECECECDCDCDCCCCCCCBCBCBCACBCAC9C9C9CACACACBCBCBCBCBCCCBCCCCCBCCCCCBCCCCCBCBCB C9CAC9C7C8C8C4C5C5BFC0C1BABABAB5B5B5AFB0B0A8A9A99D9D9E87888A686A6D44494D1E2228 03070D1013184244457F7F809E9E9E9495968081827E7F808082855153540A0A0A000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 0000000000000000000000000000003A3A3D7F7F82898B8D8686898C8C8F8F8E9098979A929294 6767684243443E42444C50555A5D62686A6E7A7B7C8E90909C9C9CA0A2A1A2A3A3A6A6A7AAAAAB ADADACADADADAEAEAEAFAFB0B0B0B1B2B3B2B3B4B4B6B6B6B9B9B8BABBBBBDBEBEC1C1C1C5C5C5 C9C9C9CCCCCCCFCFCED1D1D1D4D4D4D8D8D6D9D8D8DBDBDCDCDCDCDEDEDEDFDFE0E0E0E0E1E1E1 E2E2E2E2E2E2E2E2E2E2E2E2E1E1E1E0E0E0DFDFDFDEDEDEDDDDDEDBDBDBDADADADADADAD9D9D9 D8D8D8D5D5D5D3D3D3D2D2D2D0D0D0CECECECECECECCCCCCCBCBCBC9C9C9C8C8C8C6C6C6C4C4C4 C3C3C3C1C1C1C0C0C0BEBEBEBBBBBBBCBCBCBABABAB7B7B7B8B8B8B8B8B8B7B7B7B4B4B4B3B3B3 B3B3B3B3B3B3B1B1B1ADADADADADADADADADADADADABABABA7A7A7A8A8A8A8A8A8A8A8A8A3A3A3 A3A3A3A3A3A3A3A3A3A1A1A19F9F9F9F9F9F9E9E9E9F9F9F9B9B9B999999999999979797959594 9595959595959594949595959595959595959595959594949594949595959393938F8F8F8F8F8F 8F8F8F9090909090908F8F8F8F8F8F9090909090908F8F8F8F8F8F8F8F8F8F8F8F8E8E8E8F8F8F 8F8F8F8F8F8F8F8F8F8F8F8F8E8E8E8E8E8E8D8D8D888888898989898989888888888888898989 898989898989888888898888888888888888888888888888888888888888888888888888888888 878787888887888888878787878787878787878787888888888888878787878787878787878787 878787878787878787878686878787878787878787878787868686878787868686868686878787 878787868686868686878787868686888888878787888888878787888888888888888888878787 878787888888878787878787888888888888888888888888888888888888888888888888888888 888888888888888888898989898989898989898989888888888888888888888888898989898989 8989898888888989898888888B8B8B8E8E8E8C8C8C8E8E8E8D8D8D8D8D8D8E8E8E8D8D8D8E8E8E 8E8E8E8E8E8E8D8D8D8D8D8D8D8D8D8D8D8D8E8E8E8E8E8E8D8D8D8E8E8E8D8D8D8D8D8D8E8E8E 8E8E8E8E8E8E929292939292939292929292929292929292939393979797989898979797979797 9797979B9B9B9D9D9D9C9C9C9C9C9C9C9C9C9F9F9FA1A1A1A1A1A1A2A2A2A6A6A6A7A7A7AAAAAA AAAAAAAEAEAEB3B3B3B7B7B7BCBCBCC3C3C3C9C9C9CFCFCFD5D5D5DBDBDADFDFDFE2E2E2E4E4E4 E5E5E5E4E4E4E1E2E2DEDEDEDADADAD6D6D7D2D2D2CECECFCCCCCCCACACBCBCBCBCACBCBCACBCB C9CACAC7C8C8C4C5C5C1C2C2BBBCBCB4B5B6ADAFAFA6A6A69B9B9C87898A6B6D70464A4D1F2429 04090D1215184F4F508D8E8E9E9EA08687877B7D7E7D80825F6363151518000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 0000000000004D4F50868789888A8B8688888C8C8E9091929796987C7B7D4E4F504446474F5254 5A5D6066696C787A7C8E8F909B9B9B9FA09FA1A2A2A5A4A5A6A6A7A8A8A9ABACACB0B0B0B4B3B3 BAB8B9BFBFBFC4C4C5CACACACECFCED1D1D1D3D3D2D3D3D3D4D4D4D2D2D2D0D0D0CDCDCDC9C9CA C6C6C6C3C3C2BFBFBEB9B9B8B3B3B3AEAEAFA8A8A8A2A2A29D9D9E9898989494948D8D8D888888 8383847E7E7E7878787272726E6E6E696A6A6666666161615E5E5E5959595656565353534F4F4F 4D4D4D4848484848484343434343434040403E3E3E3C3C3C3A3A3A393939363636353535323232 3030302F2F2F2C2C2C2D2D2D2A2A2A282828282828282828282829262626252626262626252525 2424242121212020202020201F1F201E1E1E1D1D1D1D1D1D1D1D1D1C1C1C191919191919191919 1A1A1A181818161616181818171717181818151515151515161616151515141414151514141414 141414131313131313131313131313131212131212131313131414101010101010101010101010 101010101010101010121313121212101010101010101010101010101010101010101010101010 1210121010101010101010101010101010100F0F0F1010101010101010100F0F100F0F100F0F10 1010100F0F0F0F0F0F0D0D0D0D0D0D0F0D0D0F0F0F0D0D0D0D0D0D0F0F0F0F0F0F0F0F0F0F0F0F 0D0D0D0D0F0F0F0F0F0F0F0F0D0D0D0D0D0D0D0F0F0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D 0D0D0D0D0C0C0D0D0D0D0D0D0D0D0D0D0D0D0F0F0F1010100F0F0F0F0F0F0F0F0F0F0F0F0D0D0D 0F0F0F0D0D0D0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0D0D0D0D0F0F0F0F0F0F0F0F 0D0D0F0D0F0F0D0D0D0D0D0D1010100F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F10 1010101010100F0F100F0F0F101010101010101010101010101010121212121212121212101010 121212101010131313151515141414151515141414151515151515151515151515161616141414 151515161616161616161616161616161616171717171717161616161616171717171717181818 1919191919191918181919191818181919191919191A1A1A1B1B1B1A1A1A1A1A1A1B1B1B1C1C1C 1C1C1C1D1D1D1C1C1C1B1C1B1D1D1D1F1F1F1E1E1E1F1F1F222222222222242424262626292929 2C2C2C3030303434343C3C3B4242424B4C4B5555545F5F5F6B6B6B777777868686949494A3A3A3 B4B3B3C3C3C3CFCFD0DDDDDDE4E4E5E8E8E9E9E9E9E5E5E5E0E0E0D8D9D9D1D2D1CCCCCCC8C8C8 C7C6C6C4C5C5C2C4C3BFC0C1B9B9BAB1B2B3AAAAABA1A2A396989883848666686B43454A1B2025 080A1026282B6C6C6E9B9B9B929293797B7C7A7D7E6B6E6F2E2E2E000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000404045B5D5D 88898B8485888787898D8C8F8F9091949596666666474848515255575B5F6062667476788B8C8C 9798989C9C9C9F9F9FA5A5A6ABABACB2B2B1B6B5B7BABBBBBEBFBFBEBFBEBBBBBAB8B7B7B0B1B1 A7A7A79B9B9A8E8E8E8282827777776C6C6C6262625959595151514747474140413A3939313030 2727271F1F1F1A1A1A1414140F0F0F0A0A0A060606020202000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000010101000101010100010202030303 030505030503030503030303030303030303030305030505030505030505030505050505050505 030505030505030305050505030505030505030505030505030505030505030505030503030505 030505030505050503030505030505030505030503030503050605050605050605050505030305 050305050305050305030305030303030305030305030305030303030303030305030303020303 030305030305030303020203020303030303030203020203020303030303020203020202020202 020203020203020202020202000000000000000000000000000000000000000000000000000000 000000000000000000000000000000010000000000000000010000000000010100010100010000 010100010000010101010101010000000000000000000000000000000000010001000101010102 010101020202000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000303030A0A0A1414142020202C2C2C 3B3B3A4C4C4C5F5F5F7575758F9090AAAAAAC1C1C1D4D4D4E0E0E0E5E5E5E1E1E1D9D9D9CFCECE C6C7C7C0C0C0BCBCBDB8B8B9B4B4B5ACADAEA4A5A69A9B9B8E8E8F7B7C7E5E61633B3E4415181E 0E12164646468D8D8C9C9B9C7F7F807A7C7D77787A434343000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 00000000000000000000000000000000000000000000000007070A646568858789838385878789 8B8B8E9393958B8B8D595A5A5051525C5E615B5E616B6C6E8484859394949C9C9BA3A3A3AAABAB ADADAEABABACA5A5A59A9A9A8E8E8E7E7E7E6D6D6D5959594A49493C3C3C3031302626261E1E1E 1818181515151414141212120D0D0D060606000000000000000000000000000000060606171616 2525253637374545445756546564626D6C6A7A78768482818A89898F8E8C91908E969493989795 9696939D9C99A2A19FA19F9EA7A5A2B0AEABAFADAAB0ADAAB0ADAAB0ADAAAFAEAAB0AEAAAFAEAB B0AEABB0AEABB0AEABB0AEABB0AEABB0AEABB3B1AEB5B2B0B5B2B0B5B2B0B5B3B0B5B3B0B5B2B0 B5B3B0B5B3B0B5B2B0B5B2B0B5B3B0B5B2B0B5B2B0B5B2B0B5B2B0B5B2B0B9B7B3BAB8B6B9B8B5 B9B7B5B9B7B5B9B8B5B9B8B5BAB8B5B9B8B5B9B8B5B9B8B5B9B8B5B9B8B5B9B8B5B9B8B5B9B8B4 B9B8B4B9B8B5B9B8B4B9B8B4B9B8B4B9B8B4B9B7B4B9B7B4B9B7B4BAB8B5BFBCB9BFBDBABFBDB9 BFBDB9C0BDB9BFBDB9BFBDB9BFBDB9BFBDB9BFBCB9BFBCB9BFBDBABFBCB9BFBDB9BFBCB9BFBCB9 BFBDB9BFBCB9BFBCBABFBCB9BFBDB9BFBCB9BFBCBABFBDBABFBDB9BEBDB9BFBDB9BFBDBABFBDB9 BFBDB9BEBDB9BEBCB9BEBCB9BEBCB9BEBCB9BFBCBABFBCBABFBCBABFBCBABFBCBABFBCBABFBCBA C0BDBABFBCBABEBCB9BEBCBABFBCBABFBDBABFBCB9BFBCB9BFBCBABEBCBABFBCB9BFBCBABFBCBA BFBDBABFBCBABFBCB9BFBCBABEBCBABEBDBABFBCBABFBCBABEBDBABFBDBABFBDBABEBDBABEBDBA BEBDB8BDBAB7B8B6B3B8B6B3B8B6B3B8B6B4B8B6B4B8B6B4B9B7B5B9B7B5B9B7B5B9B7B5B9B7B5 B9B7B5B9B7B5B9B7B5BAB7B5B9B7B5B9B7B5BAB7B5B9B7B5BAB7B5BAB7B5BAB7B5BAB7B5BAB7B5 B9B7B5BAB7B5BAB7B5B9B7B5B9B7B4B8B6B4B8B6B4B8B6B4B9B7B4B8B6B4B9B7B4B9B7B4BAB7B5 B8B6B3B4B1AEB4B1AFB4B1AFB4B1AFB4B1AFB4B1AFB4B2AFB4B2AFB4B2AFB4B3AFB3B1AEAFADAB AFAEABAFADAAAFADAAAFADABAFAEABAFADABAFAEABAFAEABB0AEABAEADAAA4A2A0A4A2A0A4A2A0 A4A2A0A3A3A0A3A29FA4A2A0A4A2A0A4A2A0A4A2A0A3A2A09C9B999A99979A99979A99979A9997 9A99979A99979A99979B9A989B99979B9A9795949292919092929092929091918F9494919A9997 9B99979B99979B9A989B9A989C9B9996969494939192918F8E8D8B8A8A888484827877756F6E6C 6766655B5A594A4A493D3D3C2E2D2C1D1D1C0C0D0C010101000000000000000000000000000000 0001010707071010101A1A1A2828283B3B3B565656767676969697B5B5B4CCCCCCD8D8D7D6D6D6 CDCDCDBFC0C0B6B7B7B0B1B1AAABABA5A5A69B9C9D9091918284856D6F715152552C30330D1016 282A2B7878799D9D9E7E81827B7B7E7F7F804B4B4D000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 00000000000000000000000000000009090964656A8486888182848585878A8A8C959497818182 52525258595B5E5F635F616476797A8F908F9B9B9BA1A2A29F9FA09494948181816B6B6C585858 4646463737382C2C2B2222221C1B1B1717171515151314141313131413131616161515150F0F0D 0606060202020709091B1B1B3B3A3A5B5B5A7C7B7A9E9B99B6B4B1CAC9C6DCDAD7E7E4E0ECEBEA EFEFEFF3F3F2F6F5F5F7F7F7FAF9F8FCFCFAFDFDFAFEFEF9FEFEF9FFFEF9FFFEF9FFFEF9FFFEF9 FFFEFAFFFDFAFFFDF9FFFDF9FFFEFAFFFEFAFFFEF9FFFEF9FFFEF9FFFEF9FFFEF9FFFEF9FFFEF9 FFFEF9FFFEF9FFFEF9FFFDF9FFFDF9FFFDF9FFFDF9FFFDF9FFFDF9FFFDF9FFFDF9FFFDF9FFFDF9 FFFDF9FFFDF9FFFDF9FFFDF9FFFDF9FFFDF9FFFDF9FFFDF9FFFDF9FFFDF9FFFDF9FFFDF9FFFDF9 FFFDF9FFFDF9FFFDF9FFFDF9FFFDF9FFFDF9FFFDF9FFFDF9FFFDF9FFFDF9FFFDF9FFFDF9FFFDF9 FFFDF9FFFDF9FFFDF9FFFDF9FFFDF9FFFDF9FFFDF9FFFDF9FFFDF7FFFCF8FFFDF7FFFDF7FFFDF8 FFFDF7FFFDF8FFFDF8FFFDF8FFFDF7FFFDF7FFFDF8FFFDF8FFFDF7FFFDF8FFFDF7FFFDF8FFFDF8 FFFDF8FFFDF7FFFDF7FFFDF8FFFDF8FFFDF8FFFDF8FFFDF8FFFDF8FFFDF8FFFDF8FFFDF8FFFDF8 FFFDF8FFFDF8FFFDF8FFFDF8FFFDF8FFFDF8FFFDF8FFFDF8FFFDF8FFFDF8FFFDF8FFFCF8FFFDF8 FFFDF8FFFDF8FFFDF8FFFCF8FFFDF8FFFDF8FFFDF8FFFDF8FFFDF8FFFDF8FFFDF8FFFCF8FFFDF8 FFFDF8FFFDF8FFFDF8FFFDF8FFFDF8FFFDF8FFFCF8FFFCF8FFFCF8FFFCF8FFFCF8FFFDF8FFFCF8 FFFDF9FFFDF9FFFDF9FFFDF9FFFDF9FFFDF9FFFDF9FFFDF9FFFDF9FFFDF9FFFDF9FFFDF9FFFDF9 FFFDF9FFFDF9FFFDF9FFFDF9FFFDF9FFFDF9FFFDF9FFFDF9FFFDF9FFFDF9FFFDF9FFFDF9FFFDF8 FFFDF8FFFDF9FFFDF9FFFDF9FFFDF9FFFDF9FFFDF9FFFDF9FFFDF9FFFDF9FFFDF9FFFDF9FFFDF9 FFFDF9FFFDF9FFFDF9FFFDF9FFFDF9FFFDF9FFFDF9FFFDF9FFFDF9FFFDF9FFFDF9FFFEF9FFFEF9 FFFEF9FFFEF9FFFEF9FFFDF9FFFEF9FFFEF9FFFEF9FFFDF8FFFDF9FFFDF9FFFDF9FFFDF9FFFEF9 FFFEFAFFFDF9FFFDF9FFFDF9FFFDF9FFFDF9FFFDF9FFFDF9FFFDF9FFFDF9FFFDF9FFFDF9FFFDF9 FFFDF9FFFDF9FFFDF9FFFDF9FEFDF9FEFDFAFEFEFAFEFDFAFDFDF9FEFDF9FFFDF9FFFDF9FFFDF9 FFFDF9FFFDF9FFFDF9FEFEF8FEFEF9FDFDF9FDFDF9FCFCF9FBFBF9F9F8F7F7F7F6F5F5F5F3F2F2 EFEFEFECECEBE9E7E5E1DEDAD2CFCCC0BFBDADABA792908E73727050504F2E2D2D101010000000 000000000000020202090A0A0C0C0D0D0D0D1615142524243D3D3E5F6060838383A3A3A3BBBBBB C6C6C5BFC0C0B4B5B5A9ABABA2A3A39A9B9B9092928586887273765E5F6340424715181D17181C 6060629A9A9C85868774777A787A7E444649000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 0000000000000C0C0C696A6D8183868081838384868A8B8C96959879797A4F50515C5E605B5D60 6466688585879796979393948383856B6B6C5353544242423636362E2F2E2928292323231E1E1F 1C1C1B191A191919191818181919191919191818171010100909090F0D0D2B2A2A5857578C8A89 B9B7B5DBD9D5F2F0EDF7F7F6FAFAFAFDFDFAFFFCF8FCF9F6FBF8F4F9F6F2F7F4F0F6F3EFF6F3EF F5F2EFF5F2EFF5F2EFF5F3EFF5F3EFF5F2EEF5F2EEF5F2EFF5F2EFF5F2EEF6F3EFF6F3EFF6F3EF F5F2EFF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EE F5F2EEF5F2EEF5F3EFF5F3EFF5F3EFF5F3EFF5F3EFF5F3EFF5F3EFF5F3EFF5F3EFF5F3EFF5F3EF F5F3EFF5F3EFF5F3EFF5F3EFF5F3EFF5F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EF F6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EF F6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EF F6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EF F6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EF F6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EF F6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EF F6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EF F6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EF F6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EF F6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF5F3EFF5F3EFF5F3EF F5F3EFF5F3EFF5F3EFF5F3EFF5F3EFF5F3EFF5F3EFF5F2EFF5F2EEF5F2EEF5F2EEF5F2EEF5F2EE F5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EF F6F3EFF6F3EFF6F3EFF6F3EFF5F2EFF5F2EFF5F2EFF5F2EFF5F2EFF5F2EFF5F2EFF5F2EFF6F3EF F5F2EFF6F3EFF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EFF5F2EFF5F2EFF6F3EFF6F3EF F6F3EFF6F3EFF5F2EEF5F2EEF5F3EEF5F3EFF6F3EFF5F2EEF5F2EFF5F3EFF6F3EFF6F3EFF7F4F1 F8F6F2FAF7F3FCF9F5FEFBF7FFFEF9FDFCFAFAF9F9F6F6F5EFEDE8D8D6D1B6B4B2898886565655 2828270C0C0C0202020505050D0D0D1010100F0F0D1212101717172424253E3D3E616060858585 A2A3A3B1B1B1AFAFB0A4A4A599999A9090918586877878796264684E515425282C0F12174C4D4D 95969687898B73767674767946464B000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000C0C0C 68686D8081848585878788898C8D8F9696987171734E4F505B5E605A5D607072738A8A8B838383 69696A5050513F403F3838373434342F2F2F2929282323231E1E1D1C1B1B1B1A1A191A191A1A1A 1919191616171212120D0D0D1616163B3B3A777776B8B7B4EBE9E4FEFDFAFEFEFDFFFDF9FBF8F4 F5F2EEF3F1EDF3F0ECF4F1EDF5F2EEF4F1EDF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EF F6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EF F6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EF F6F3EFF6F3EFF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EE F5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EE F5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EE F5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EE F5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EE F5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EE F5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EE F5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EE F5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EE F5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EE F5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EE F5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EE F5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EF F6F3EFF5F3EFF5F2EFF5F2EFF5F2EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EF F6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EF F6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EF F6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EF F5F2EEF4F1EDF5F2EEF4F1EDF3F0ECF3F0ECF6F3EFFBF8F4FFFDFAFEFEFDFEFDFAECE9E5BDBCBA 7F7E7D4141411414140605050707060F0D0D13121216151518181819191A212121323333515252 7878789695969FA0A09C9C9D91919284858578797A656769585A5D2F3236080A0F3C3E3F8F9091 8C8E8E747777727477444445000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 00000000000000000000000000000000000000000000000000000007070A6B6B6D828385838284 82838487888A9191936D6E6F4E504F595B5E5A5C5F6E6F707576765B5C5C4546473C3B3C393A3A 3736372F2F2F2626261F20201C1C1C1C1B1B1B1B1A1B1B1A1C1C1B1B1B1B1515150D0F0F101010 2E2D2D6E6E6DB9B8B7F3F1EDFFFFFFFFFEFDFAF8F3F4F1EDF2EFEBF3F0ECF5F2EEF6F3EFF6F3EF F5F2EEF5F2EEF4F1EEF4F1EDF5F2EEF5F2EEF5F2EFF5F2EEF6F3EFF6F3EFF6F3EFF6F3EFF6F3EF F6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EF F7F4F0F7F4F0F7F4F0F7F4F0F7F4F0F8F5F1F8F5F1F8F5F1F8F5F1F8F5F1F8F5F1F8F5F1F8F5F1 F8F5F1F8F5F1F8F5F1F8F5F1F8F5F1F8F5F1F8F5F1F8F5F1F8F5F1F8F5F1F8F5F1F8F5F1F8F5F1 F8F5F1F8F5F1F8F5F1F8F5F1F8F5F1F8F6F1F9F6F2F9F6F2F9F6F2F9F6F2F9F6F2F9F6F2F9F6F2 F9F6F2F9F6F2F9F6F2F9F6F2F9F6F2F9F6F2F9F6F2F8F7F2F8F7F2F8F6F2F8F7F2F8F7F2F8F7F2 F8F6F2F8F7F2F8F7F2F8F7F2F8F7F2F8F7F2F8F7F2F8F7F2F8F6F2F9F6F2F9F6F2F9F6F2F9F6F2 F9F6F2F9F6F2F9F6F2F9F6F2F9F6F2F9F6F2F9F6F2F9F6F2F9F6F2F9F6F2F9F6F2F9F6F2F9F6F2 F9F6F2F9F6F2F9F6F2F9F6F2F9F6F2F9F6F2F9F6F2F9F6F2F9F6F2F9F6F2F9F6F2F9F6F2F9F6F2 F9F6F2F9F6F2F9F6F2F9F6F2F9F6F2F9F6F2F9F6F2F9F6F2F9F6F2F9F6F2F9F6F2F9F6F2F9F6F2 F9F6F2F9F6F2F9F6F2F9F6F2F9F6F2F9F6F2F9F6F2F9F6F2F9F6F2F9F6F2F9F6F2F9F6F2F9F6F2 F9F6F2F9F6F2F9F6F2F9F6F2F9F6F2F9F6F2F9F6F2F9F6F2F9F6F2F9F6F2F9F6F2F9F6F2F9F6F2 F9F6F2F9F6F2F9F6F2F9F6F2F9F6F2F9F6F2F9F6F2F8F7F2F9F6F2F9F6F2F9F6F2F9F6F2F9F6F2 F9F6F2F9F6F2F9F6F2F9F6F2F9F6F2F9F6F2F9F6F2F9F6F2F9F6F2F9F6F2F9F6F2F9F6F2F9F6F2 F9F6F2F9F6F2F9F6F2F9F6F2F9F6F2F9F6F2F8F5F1F8F5F1F8F5F1F8F5F1F8F5F1F8F5F1F8F5F1 F8F5F1F8F5F1F8F5F1F8F5F1F8F5F1F8F5F1F8F5F1F8F5F1F8F5F1F8F5F1F7F4F1F8F5F1F7F5F1 F7F4F1F7F4F1F7F4F1F7F4F0F7F4F0F7F4F0F7F4F0F7F4F0F7F4F0F6F3EFF6F3EFF6F3EFF6F3F0 F7F4F0F6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF5F2EFF5F3EFF5F3EF F6F3EFF6F3EFF6F3EFF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF5F2EE F5F2EEF5F2EDF4F1EDF4F1EDF4F1EDF5F2EEF5F2EEF5F2EEF5F2EEF5F2EEF6F3EFF6F3EFF6F3EF F6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF5F2EEF3F0ECF2EFEBF3F0ECF9F6F2FFFEFCFFFFFFFCF9F5 C9C9C67D7D7C3735350F0D0D0303030A0A0A121212171717191A191D1E1E1F1F20252525363636 56575679797A8E8E8F8F8F90858687787A7B656768585A5C34373B0A0D133233358989888B8B8C 727476727375424244000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 0000000000000000000000000000000000000404046868698584878384868486878A8A8B8E8F90 6666684D4D505A5C6054565A5B5C5E5555554243433C3D3D3C3D3D3738372E2E2E2626261F1F1F 1C1C1C1C1B1B1C1B1B1B1B1A1C1C1B1D1D1C1515140A0A0A151414454543939291E2DFDCFFFFFF FFFFFFFAF7F3F3F0EBF2EFEBF5F2EEF6F3EFF6F3EFF4F1EEF4F1EDF5F2EEF6F4EFF9F7F2FBF9F5 FDFBF9FEFCFAFFFFFCFFFFFCFFFFFCFFFFFCFFFFFCFFFFFCFFFFFCFFFFFCFFFFFCFFFFFCFFFFFC FFFFFBFFFFFBFFFFFBFFFFFBFFFFFBFFFFFBFFFFFBFFFFFBFFFFFBFFFFFBFFFFFBFFFEFAFFFEFA FFFEFAFFFFFAFFFEFAFFFEF9FFFEFAFFFEFAFFFEFAFFFEFAFFFEFAFFFEFAFFFEFAFFFDF9FFFDF9 FFFDF9FFFDF9FFFDF9FFFDF9FFFDF9FFFDF9FFFDF9FFFCF9FFFCF8FFFCF8FFFCF8FFFCF8FFFCF8 FFFCF8FFFCF8FFFDF8FEFBF8FEFBF7FEFBF7FEFBF7FEFBF7FEFBF7FEFBF7FEFBF7FEFBF7FEFBF7 FEFBF7FEFBF7FEFBF7FEFBF7FDFAF7FBFAF6FCFAF6FCFBF6FCFAF6FCFAF6FCFAF6FCFBF6FCFAF7 FCFAF6FCFAF6FCFAF6FCFAF7FCFAF6FCFAF6FCFBF7FAF9F5F9F8F5F9F8F5F9F8F5F9F8F4F9F9F4 F9F8F4F9F9F4F9F8F5F9F8F4F9F9F5F9F9F5F9F8F5F9F8F4F9F8F5F9F9F5F9F8F4F9F9F5F9F9F5 F9F8F5F9F8F5F9F8F5F9F9F5F9F8F5F9F9F4F9F9F4F9F9F4F9F8F5F9F9F5F9F8F5F9F8F4F9F8F4 F9F8F5F9F9F5F9F9F5F9F8F5F9F8F4F9F8F5F9F9F4F9F9F4F9F9F5F9F8F5F9F8F5F9F9F5F9F8F5 F9F8F5F9F9F4F9F9F5F9F8F5F9F8F5F9F9F5F9F8F5F9F9F4F9F9F5F9F9F5F9F8F5F9F9F5F9F9F5 F9F9F4F9F9F5F9F9F4F9F9F5F9F9F5F9F9F4F9F9F4F9F9F5F9F9F4F9F9F5F9F9F4F9F9F5F9F9F5 F9F9F5F9F9F5F9F9F5F9F8F4FAF9F4FCFAF6FCFBF6FCFBF7FCFBF6FCFBF6FCFBF6FCFBF6FCFBF7 FCFBF7FCFBF6FCFBF6FCFAF6FCFBF6FEFBF7FFFCF8FEFBF7FEFCF7FFFCF8FEFCF8FEFBF8FEFBF8 FEFCF8FEFCF7FEFCF8FEFCF8FFFCF8FFFCF8FFFDF8FFFDF8FFFCF8FFFDF8FFFDF9FFFDF9FFFDF8 FFFDF8FFFDF9FFFDF8FFFDF9FFFEF9FFFDF9FFFDF9FFFDF9FFFDF9FFFEFAFFFEFAFFFEF9FFFDF9 FFFDF9FFFEFAFFFFFAFFFFFAFFFFFBFFFFFAFFFFFAFFFFFBFFFFFBFFFFFBFFFFFAFFFFFBFFFFFC FFFFFBFFFFFBFFFFFBFFFFFBFFFFFCFFFFFCFFFFFCFFFFFCFFFFFCFFFFFCFFFFFCFFFFFCFFFFFC FFFFFBFFFFFBFFFFFBFFFFFCFFFFFBFFFFFBFFFFFCFFFFFBFFFFFAFFFEFBFFFEFAFFFEFAFFFDFA FEFCF9FEFCF9FDFBF8FCFBF7FCFAF6FBF8F4FAF7F3F8F5F2F6F4EFF5F2EEF4F1EDF3F1ECF4F1ED F5F2EEF5F3EEF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF5F2EEF3F0ECF2EFEBF8F5F1FFFFFEFFFFFF F5F1EFA9A7A65554531817180303030A0A0A1515151617171A1A1A2020202425242525262E2E2E 4546466666677F7F808384857A7B7C67696A5D5E60393C400A0C1030303185848588888A737576 7374773C3C3D000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 0000000000000000000000005B5B5E8483868080838687898A8B8C8F8E9069686A4D4F50575A5E 44474A4344474243443D3E3E3E3F3F3A3A3930302F2626261F1F1F1C1C1D1D1C1C1D1C1C1C1B1B 1C1B1B1E1E1D1919180909071210104E4D4CA7A6A5F4F2EEFFFFFFFFFEFBF5F2EDF2EFEBF4F1ED F7F4F0F5F2EEF3F1ECF3F1ECF8F5F2FCFBF8FFFFFCFFFFFFFFFFFDFFFDF7F4F3EFE7E7E5DCDCDB D2D0CFCBC8C6C2C0BDB5B4B2B2B0AFB1AEACAEADACB2B0ADB2B1AEB2B1AEB3B0AEB0AFAEAEADAA AEADACB0ADAAAFAEAAAEADABAAA8A6ABA8A6AAAAA6AAA9A6A9A7A4A5A3A1A4A3A0A4A3A0A4A29F A4A39F9D9B999B99979B9B989C9A979D9B979D9A989D9A989C9A9794929092928E91908F938F8E 93918E92928E93918E93908F92908E8F8E8B8D8C8A8E8D8A8D8D8A8E8D8B8E8D8B8F8D8A8E8D8B 8E8D8A8A8987888684888784878784878685898784898785888684898785888683888783888685 8887868887848686837F7E7E7F7E7D807F7C827F7D807F7C807E7C817F7D817F7C827F7D807E7D 807E7D817F7C807F7D807E7E81807E7B7877777574777574777674777674777775777674777674 777673777574787673777574777673777674787574777675777574787673787673787674777674 777774777774777573777674777575787674777774767674787674787674777674777574777575 787573777573777674777674767674777674777674777774767574777673777674777674777774 787675777674787575777775777673777674777775787773777674777673777775777774787674 777674787674787673777674787774787674787674767573787674787674787773777673787775 777674777673787775807E7D82817E817F7E807E7E81807E7F7F7D7F7F7D807F7E817F7E817F7D 817F7D81817D82817E8886858887868887868A8885898785898785898784888885888786898787 8988858987868D8B888E8C8A8F8D8A8F8D8C8F8D8A8E8D8B8E8B8A8E8B898E8D8A8F8D8A8F8D8B 8E8D8A918F8C91908E928F8E928F8E918F8E9593919A99969A97969997959897959897959F9F9B A2A29FA2A19FA1A09CA19F9BA3A29EA8A7A4A9A7A5A8A7A4A7A6A3A7A6A2AAA9A7ACABA9ACACA9 ADACAAACABA9AFACABB0AFADB0AFADB0AFADB6B4B1B9B8B6B9B7B4BDBCB8C0BFBCC1BFBBC6C3C0 C8C5C3C8C5C2CBC9C6CCCAC6CDCCC9CECECAD2D2CDD4D3D1D6D5D3D8D7D6DBDAD9DDDDDDDFDFDF E4E3E3EBEAE9F0F0EDF7F6F2FDFBF8FFFEFAFFFFFDFFFFFFFFFFFFFFFFFCFEFCF9FAF7F4F6F3F0 F3F1ECF3F0ECF4F1EDF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF3F0EBF3F0EBFCF9F6FFFFFF FFFFFCBDBBBA5F5D5C1616160303031314141819181616161A1A1A2121212727282929292E2E2F 4141425E5F5F757677797A7A6B6C6D5E5F613A3D420A0D132E30318585868587897174776F7273 2F2F31000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 0000004B4B4E7F80828282848485878586888F90916B6B6B4E4F505254573233393233353F4041 4141413D3D3D3434342A292A2121211E1E1E1D1D1D1D1C1C1D1C1C1C1B1C1D1C1E1F1E1E0F0D0D 0C0A0C464443A4A2A2F4F2EFFFFFFFFDFBF7F3F0ECF3F0ECF7F4F0F7F4F0F3F0ECF3F0ECFAF7F3 FFFFFEFFFFFFFFFFFDF1F0EED5D4D4BCBBB89F9B9B817F7D68676552524E41413E3431322A2929 242324191A1B161716171517171416181717181818191917191719161817161516161218181616 171617151616151016151314141715151514141313121414101310121212101010121210101010 0F0D0C0C0F0C0D0D0D0F100D0D10100F0C0F0F0D100A0C0A090C0A0A090A090709090A0A0A0C0A 090D0A0A0A0A070A0A0A0A0909070A0A090909090609090A0A0A0A0C090C090A0A070A0A070A09 090A07060906070A0907070A0A07090A090906060709060707060709070707070A070A0D090709 070709050607060306060606060606060905060606060507060705060606060306060506060605 050606050307060606050506060302010602020203020303030505020303030205030303030306 030503020203030302020303060502060303050206060203050203030203030502030602020502 030503060205050206050303020502020202030302060505030506020602050205030203020205 020205050602030505050306050202020602020602030202020302020602050205060206030505 030205020503020503010205060203050502050602020303020603020303030203030206030202 030302030203050506020305030305020205050305050202020203030303030502020202020303 020306050607060605060506050306060705050705030605060606050606060605050702060705 060606060707050706060A090A0707060A09070906070A06060A0907090909060A070707070709 0C0A0A0A0A0A09070A090A0A07090A090A090906070A06090A0A0A0A0A090A0A070A07090A0A07 090C0A0A0A0A0A0A0A0A0A0A0C0C0C0D0F0D0D0D0D0F0D0D0C0D0F0C0D0D10101010121010130F 0F100F100D10131010121413121412131512121215131413161414131714131616171516171616 1715161617171418161715161B1A1A1B1C1D1E1D1D22201F222121222221252526272427292727 2B28292929282B2C2A2C2C2D3231303534353838383C3A3A413E3D4242404545434E4D4B585855 62615D6F6E6C7D7B7A8B8B88A09D9BB4B2B0C6C5C2D8D8D6EBEBE8FCFBF7FFFFFFFFFFFFFFFFFF FDFBF7F6F3F0F2EFEBF4F1EDF6F3EFF6F3EFF6F3EFF6F3EFF6F3EFF4F1EDF2EFEBF9F7F4FFFFFF FDFBF7B3B3B14C4B490607070A0C0C1B1B1B1717171818171C1C1B2323232A2B2B2D2D2E313232 4344455E5F607071726C6E6E61636537393D080D103334358787887D8182707273686A6C19191B 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF0000000000000000000000000000000000000000000000000000003B3B3D7D7D83 8080848686888585878D8E906F70714B4C4D484B4D25272B2D2E314141413F4040393939302F2F 2525251F1F1F1D1D1D1D1D1D1E1E1E1D1D1C1D1C1C2120201A19190907072E2D2C91908EE6E6E5 FFFFFFFDFBF8F3F1ECF3F1ECF7F4F0F6F3EFF2EFEBF5F2EEFFFEFBFFFFFFFFFEF9DCDBD8B0AEAE 8382815D5C5C3B3A3B2424221715150C0A0A060607050605060603060606070606070706070A0A 090A070A0D0A0A090A090A0A09090C0A0A0A090A090A0C090A090A0A09090A0A0C0A090D090707 0A09090A0A07090C0A0A09070A09090D0C0A090C0C0A090A0A0A0D0A0C0A0D0D0A0E0A0A0C0A0A 0A0A0A0A0A0D0A0C0C0D0A0C0D0C0C0C0D0A0D0D0F0D0D0D0C0A0C0A0C0D0A0C0D0D0D0C0A0C0D 0A0C0D0D0A0D0D0C0D0D0A0C0D0A0C0D0A0D0D0D0D0C0C0D0D0D0D0A0A0C0A0D0D0D0D0D090C0C 0D0D0A100D0D0D0C100D0D0F0D0C0C0C0A0C0A0D0D0C0C100D0D0D0A0F0D0D0D0F0F0D0F0D0D0D 100D0D0D100D0D0F0D0D0D0D0F0D0D0D0D0F0D0D100D0C0D0D0D0D0F0D0D100D0D0D0D0D0D0C0D 0D0D0D0F100D0D0F0C0F100D0F0D0D0F0F0D0D100D0D0F0D0D0D0D0F0D0D0F0F100D100D0C0D0D 0F0D0F0F0C0D0F100D0F0F0F100D0F0D0D0F0D100D0D0D0D0F0C0D0F0D0D0D100D0F0F0F100D0D 0D0D10100D0F0D0D0C0D0C0F0D0F0D0D0D0D0F0D0D0F0F0D0C0F0D0F0D100C0D0F0F0D0F100F0D 0D0D0D100D100D0D0D0D0C0C0D100F0D0D0F100D0F0F0F0D0F0C0D0D0D100D0D100D0D0F0D0D10 0D0D0D0D0D0F0C0C0D0D0D10100D0D0D0F0D0D100D0F0D0D100D0F0F0D100F0D0C0D0F0D0D0D0D 100F0F0D0F0F0D0D0D100D100F0F0D0F0D0C0C0C0D0D0D0C0D100D0F0D0D0D100F0D0D0D0C0F0F 0F0D0F0D0D0D0D0D0D0D0F0D0F100D0F0F0F0F0C0F0D0D0F0F0D0D0D100C0D0D0C0D0D0D0A0D0A 0D0C0D0D0C0D0D0D0D0A0D0D0D0F0D0D0D0F0C0D0D0C0D0C0D0D0D0C0D0D0C0C0C0D0C0D0D0D0D 0D0C0C0C0D0D0A0D0D0D0D0A0D0C0D0D0C0D0C0D0D0D0D0D0D0D0A0D0D0D0D0A0C0D0C0C0A0D0D 0D0C0C0F0D0A0C0C0D0A0A0A0A0A0C0D0C0C0C0D0C0C0C0A0C0A0D0A090A0A0A0A090A0C0A0A0D 0D0C0D0A0A070C0D090A0A0A0A0A0D0A0C0A0A090A0C0C0A0A0A0A0A090A0C0C0A0A0A090A0A0A 0909090A060A090A0907070609070A0A0707070606070606060706050606060707060606060606 0507060606050606060606070606060606060706070507030205050505050305030606060A0907 090A0A0F0D0D1514151E1E1F2D2D2C3E3E3B55555371736E93918EB4B0AED4D4D2F3F2EFFFFFFF FFFFFFFFFEFAF6F3EFF2EFEBF4F1EDF6F3EFF6F3EFF6F3EFF6F3EFF4F1EEF3F0EBFAF7F3FFFFFF EBEBEA8E8D8C1E1E1E0302031B1B1B1A1B1A1919181B1B1A1E1F1F2727272E2E2F303031363738 494B4B6163626B6C6D6162642E30340D0F133739398586877A7D7C7275745B5E610B0B0E000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 00000000000000000000000000000000000000000000000020202078777B838286838385878788 8E8E8F79797948494A4041431E20242C2D2F4142413D3E3E3636362A2A2A2222221F1F1F1E1E1E 1E1E1E1D1D1D1D1D1D1E1E1E222222100F0F1010106E6C6AD4D4D1FFFFFCFEFCF9F5F3EEF3F1EC F6F3F0F6F3EFF2EFEBF6F3EFFFFFFFFFFFFFE2DFDCA4A1A06B68693F3D3F2321221010100A0A09 09070606090A0A0A0C0D0A0D0D0D0D0F0D0D0D0D100F0F0D0F0D0A100D0F0D0D0F0D0D100F0F0F 0F0F0D0D0C0D0D0F0D0F100D0F0D0D0D0D0D0D0D0C0D0D0D0D100F0D0D0F0D0D0D0D0F0D0F0D0D 0F0F0D0F0D0D0F0D0D0D0F0D0D10100D0D0D0F0C0F0D0F0D0F0D0C0D0D0F0D0D0F0D0D0F0D0D10 0D0D0D0D0F0F0F0D0D0D0D0C0F100D0B100D0F0D0C0D0D0D0C0C0D0F0D0D0D100D0C0D0C0D0A0F 0F100D10100D100D100D0D0D100D0C0C0D0D0D0F0C0C0D0D0B0F0D0C0D0D0C0D0D0D0D0C100D10 0D0F0D100D0C0F0F0A0D0D0D0D0D0D0D0F0D0D0D0F0D0D0C100D0D0D0F0D0C0F0D0F0D0F0F0D0D 0F0F0F0D0F0F0D0D0F0F0D0D0D0A0F0D0D0D0D100F0D0F0F0D0A0D0C0D0D0D0D0F0D0F100D0D0D 0D0D0C0F0D0D0D0F0D0F100D0F0D0F10100F0D100F0F0F0D0D0D0D0D0D0D0D0D0C0D0F0F0F100C 0F0F0D0D0D0F0F0C0D0C0F0D0D0D0F0F0D0D0F0D0D0F0D0D0D0F0D0D100D0D0D100D0D0F100D0D 0F0D0D0D0D0D0D0C0D0D0A0F0D0D0D0D0F0F0C0D0D0F0D0D0F0D0D0F0D0D0F0D0D0C0C0D0F0D0D 0D0D0D0D0D0C0F0D0F0F0A0D0D0D0D0D0F0D0D0D0F0D0F0F0F0D0D0D0D0D0D0D0F0D0A0D0F0D0D 0D0F0A0D0D0D0D0D0F0F0D0D0D100D0F0F0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D 0D0F0F0D0C0D0C0D0C0D0F0C0C0D0D0F0F0C0F0D0D0D0D0D0D100D0F0C0D0D0D0D0F0F0F0F0D0D 0F100F0D100F0A0D0C0F0D0D0D0C0D0F0D0D0F0D0D0C0D0D0D0D0D0D0D0D0D0D0F0D0D100D0D0D 0D0D0D0F0D0D0D0C0D0D0D100D0D0D0D0F0C100F0D0C0F0F0D0C0F0D0D0C0D0A0D100D0D0D0D0D 0C100D0F0D0A0D0D0F0D0D0F0D0D100D0D0D0F0F0C0B0F0F0A0D0F0D0D0F0C0D0D0D0D0D0F0D0D 0D0D0F0F0C0D0D0C0F0D0C0F0D0D0D0D0D0D0D0F0D0D0C0C0F0D0F0D0F0F0F0D0F0D0D0F0F0D0F 10100D0D0F0F0F0D0D0D0D0F0C0D0D100D0D0F0D0F0D100D0D0D0D0C0F0D0F100F100D0D0D0C0D 0C0D0D0F0D0D0F0D0F0D0D0D0D0F0F0F0F100D0F0D0F0D0D0F0F0D0D100D10100F0D0D0C100D0D 10100F100D0D0F0F0D0F0F0F0F0D0F0F100D0D0F0F0D0C0D0D0D0D0F0F0D0D0F0D0A0D0C0D0A0C 0D0A0A090A0907060A0606090707090D0D0C1713152421223B3A36595A5683847FB4B2B1E6E5E1 FFFFFEFFFFFFFAF8F4F2EFEBF4F1EDF6F3EFF6F3EFF6F3EFF6F3EFF4F1EDF5F2EDFDFBF8FFFFFD C6C6C54B49480303021818171D1D1C1B1A191B1B1B1D1C1C2322222C2C2C3132323334343D3D3F 52525268686A606163282A2F1014184242438B8C8D777879727476525353040404000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 0000000000000000000000000000000707076C6E6F8384858284858685878B8B8D858585444445 3A3D401F2124292A2C3D3F3F3A3B3A3333332727272020201E1F1F1E1F1E1E1E1E1E1E1E1D1D1D 2020201E1E1E090909353533ADACAAF5F4F3FFFDF9F7F4F0F4F1EDF6F3EFF6F3EFF3F0ECF5F2EE FFFFFFFFFDF9C7C5C3797975413F3F201F1E100F120C0A0C0A0A0A0D0C0C0F0D0A0D0D0C0D0D0D 0C0D0D0D0D0C0D0D0D0D0D0F100D0D0D0D0C100D0C100D0D0A0D0F0D0D100D0C0D0F0D0D0D0D0F 0D0F0D0F0F0D0D0D0D0C0D0F0D0D0D0D0D0D0F100C0C0D0C0D0D0F0D0D0D0D0D0F0D0D0D0C0F0D 0C0D0F0C0D0D0D0D0D100D0F0D0D0D100F0D0F0F0C0C0D0D0D0C0F0D0C0F100D0D0F0C0D0B0F0D 0D0D0D0D0C0C0D0F0D0D0F100D0F0C0D0D0D100D0F0F0F100D0D0D0D0D0D0D0D0D0D0A10100D0F 0F0D0D0F0C0D100D0D0D0D0D0D0F0C0D100F0D0F0D0D0D0A0C0F0F0D0D0F0D0D0D0D100D0F0F0C 0F0F0C0D0A0D0D0D0F0F100F0D100F0D0D0F0C0D0C0C0F0C0C0D0D0F0C100F0D0D0D0F0F0D0D0F 0A0D0F0D0C0F100D0D0D10100D0F100C0D0D0D0D0F0D0F0D0D0F0D0F0D0D0C0A0D0D0D0D0D0D0D 0B100D0D0F0D0F0D0F0D100F0F0D0D0D0D0D0F0F0D100F0F0D0F0F0D0F0D0D0C0D100D0D0F0D0D 0D0C100D0D0D0D0D0D0D100D0D0D0D0D0D0D10100D0D100D0F0F100D0D0F0F0C0D100D100F0D0D 0C0A0D0D0D0D100D0D0D100F100D0F0D0D0D0D0D0F0F0D0D0F0D0D100F0D0F0F0D0F0D0D0D0F0F 0D0D0F0D0D0F0D0D100D0D0F100D0D100D0D100D0D0D0D0C0F0D0A0F0D0D0D0F0A100F0C0D0D0D 0D0D0F0F0D0F0F0D0F0F0F0D0D0F0F0C0D0C0C0D0C0C0F0D0F0F0F0D100D0C100D0D0F0D0D0D0D 0D0D100D0D0F0F0D0F0F0D0D0F0D0D0F0D0D0D0D0D0F0D0D0D0D100C0F0F0F0F10100D0F100F0F 0D0D0D0C0C0D0C0D0D0D0D0D0D0D0D0F0C0D0F0C0D0D0D0D0D0F0D0D0D0F100D0D0D0D0D101010 0F0C100D0D0D0D0D0F10100F0D0F0D0D0D0F0D0F0D100D0F100D0F0D0D0D0D100D0F0D0A100D0C 0D0D0F0C0D0F10100D0F0F0D0D0D100A0D0D0F0D0D0D0D0D0D0D0F0D0D0F0D0D0D0D0D0F100C0D 0F0C0D100D0D0D0F0F0D100D0D0F0D0D100F0D10100D0F0D0D0D0C0F0D0D100C0F0F0D0D10100D 0F0D0D0D0F0F0D0D0C0D0A0D0F0D0F0F0D100F0D0C0D0D0C0F100F100D100D0D0D0D0D0D0F0D10 0F0D0D0D0F0D10100D10100F100D0D0D0D0C0D0D0D0D0F0F0D0D0F0D0D0F0D0D100D0F0F0D0D0C 0F0D0D0D0D0C0F0C0D0D0D0D0D0D0F0D0D0D0F0C0F0F0D0D0D0D100D0F0D0C0D0D0D0D0F0F100D 110F0C0F0D100C100C0A0D0C0C0A0C0A0C0A0A0C0D0D0F0F171815272626444342757571B4B4B4 F4F2ECFFFFFFFBF9F6F3F0EBF4F1EEF6F3EFF6F3EFF6F3EFF6F3EFF4F1EDF8F5F1FFFFFEE9E9E9 7473700C0A0A1615151E1D1D1C1C1C1C1C1C1D1C1C21212129292931313135353538393A444446 6364655A5B5D20232715181C5152538C8D8E707375737475424242000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 0000000000000000005050548283877F7F808585858A8A8C8D8D8E41424330323525262A252729 3B3B3D3738392F302F2524241F20201F1F1F1E1E1E1E1E1E1E1E1E1E1E1E212121191919101010 6D6C6AE1E0DFFFFEFAF7F5F1F5F2EEF5F2EEF6F3EFF4F1EEF3F1ECFEFCFAFDFCF9BCBAB7615F5D 2B2B2B19181610100F0D0A0D0D0A0D0D0D0D0F10100F0D0D0D0D0C0D0D0D0D0D0D0D0D0D0D0F0D 0D0C0D0C0D0D0D0A0D0F0D0D0D0D0D0C0C0D0D0C0D0D0D0C0C0A0C100D0D0F0C0D0C0D0D0D0D0F 0F0D0D0D0D0D0D0D0D0D0C100C0D0D0C0D0C0D0D0C100D0D0F0D0F0A0D0C0A0D0C0D0A0C0D0D0D 0D0D0D0D0D0D0D0F0D0F0D0C0D0F0D0F0A0D0D0D0F0D0D100F0D0F0D0D0D0D0D0D0D0D0F0D0D0D 0C0D0D0D0F0F0D0D0D0C0D0F0D0D0D0F0D0D0D0D100D0D0D0C0D0A0F0C0C0F0D0D0D0C0F0D0D0F 0D0C100D0D100D0D0D0C0D0C0D0D0D0F0A0D0F0C0D0D0D0F0D0D0D0F100D0F0D0D0C0A0D0C0D0D 0D0F0D0C0D0D0D0F0D0D0D0D0C0C0D0D0C0D0C0D0D0D0C0D0D0F0D0C0F0F0A0C0D0C0C0D0F0D0C 10100D100D0D0D0C0C0D0D0D0D0D0D0D0D0F0D0D0D0C0D0D0A0D0D0D0C0F0F0D0D0A0D0D0D0C0C 0D0D0D0F0C0F0D0C0D0C0F0D0D10100F0D0D0D0D0D0D0D0A0D0D0A0F0D0D0F0D0F0F0D0D0D0F0C 0D0F0C0D0D0F0C0F0D0C0D0D0D0D0F0D0D0D0D0C0D0D0D0F0D0D0D0D0D0D0D0C0C0D0D0C0D100D 0C0D0C0F0D0F0D0C0D0D0D0A0D0D0D0D0C0C0F0C0D0D0D0D0F0F0D10100D0C0D0D0C0F0D0F0D0D 0D0D0D0C0D0D0D0D100D0C0D0F0D0D0F0D0F0D0D0D0D0D0C100D0D0F0C0D0D0D0D0D0C0F0D0C0D 0F0D0D0D0D0D0D0F0C0F100D0D0A0D0F0F0D0D0D0D0D0D0D0D0D0C0D0D0C0D0D0C0D0D0F0D0D0F 0F0D0D0D0F0D0B100D0D0D0D100D0F0C0F0D0A0D0D0C0D0D0D0D0F0D0D100F0D0F0D0F0D0C0D0D 0D0F0D0F0F0C0D0D0D0C0D0D0D0D0D0F0D0D0F0D0C0D0D0D100D0F0F0C0F0D0D0D0D0D100F0D0D 100F0D0D100D0C0D0D0C0F0D0D0D0D0D0D0D0D0F0D0D0F0A0D0F0F0C0D0D0D0C0A0D0F0C0D0D0D 0C0F0F0C0D0F0D0D0D0D0D0F0D0D0A0F0D0D0D0F0C0D0D0C0D0D0D0D0D0D0D0D0D0D0D0F0D0D0D 0F0D0D0C0F0D0F0D0D0D0D0D0D0D0F0D0D0D0D0D0D0C0D0D0D0D0D0F0D0D0D0D0D0D0D120F100C 0D0F0C0F0D0F100D0D100D0F0D0D0D0F0C0D0D0D0D100D0D0F0D0F0D0F0C100F0D0F0D0D0D0D0D 0F0D0D0D100D0D0C0F0C0C0D0D0D0D0D0D100D0D0D0F0F0F0D100F0D0D0F0D0D0D0D0D0A0F0F0D 0D0F0F0D0D0F0D0D0D0F0F0D100F100F0F0F0D100F0D0F0D0D0D100D0F0D0D0F0D0C100D0F0D0F 0F0D0C0D0F0D0F0D0D0D0D0C0D0C0D0A0D0D0C0C0C0C0D0D1010101918172325254A4A478E8E8B E1DEDBFFFFFFFAF9F5F3F0ECF5F2EEF6F3EFF6F3EFF6F3EFF5F2EEF4F2EEFCFAF6F7F7F6999897 1918181514151F1E1E1D1D1D1D1D1E1E1E1E2020202627272E302F3535363637383C3D3E606160 4C4E50181C201C1E206464648587896D7071666B6C222424000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 2F2F2F7D7E837C7C808181838586879393954B4B4C2325282B2E312123253739393536372C2C2C 2223231F1F201F1F1F1F1F1F1F1F1F1E1E1E1E1E1E20201F131313252525A2A29FF8F8F8FBF9F5 F5F3EFF5F2EEF6F3EFF6F3EFF4F2EDFAF8F5FBFBFBC8C6C25E5C5B22222117171712100F0C0C0C 0C0C0C0D0F0D0D0F0F0D0D0D0D0C0D0D0F0D0D0D0D0B0F0D0C0C0F0D0D0F0D0F0C0D0F0D0F0D0C 0D0D0D0F0D0D0F0F0A0F0D0D0D0F0D0F0D0F0F0D0C0D0D0D100D0D0D0D0D0D100C0C0F0D0C0D0D 0C0D0D0C0F0D0C0D0D0D0D0D100D0D0F0C0C0F0C0C0D0C0D0D0D0D0D0F0D0F0F0D0D0D0F0D100A 0C0C0F0A0D0D0C0D0D0C0C0D0D0D0D0C0D0F0C0D0C0D0D0D0D0D0D0D0D0F0C0C0D0D0A0F0C0C0C 0D0F0C0D0F0F0D0F0D0C0D0D0D0F0D0D100C0D0A0D0D0D0F0D0D0D0C0D100F0D0D0D0D0D0D0D0D 0F0D0D0C0D0C0F0D0D0F0D0D0F0D0D0F0D0F0D0C0F0D0F0A0D0D0A0F0D0D0D0D0D0C0D0C0C0D0D 0D0D0D0A0D0D0C0F0D0F0D0D0D0D0D0C0D10100D0D0D0D0D0D0F0D0F0C0F0F0D0D0C0D0D0D0D10 0D0C0D0D0F0D0D100D0C0C0D0C0D0F0F0D0D100D0D0D0C0D0D0D0F0D0D0F0F0C0D0F0D0C0D0D0D 0C0D0D0F100D0F0D0D0F0C0D0C0D0D0A0F0C0D0F0D0D0D0D0A0D0D0C0C0D0D0F0D0D0F100C0D0D 0D0D0D0F0D0F0D0A100D0D0D0C0D0C0A0F0D0D100C0C0D0C0D0D0D0D0F0C100D0D0D0D0D0D0A0D 0D0D0D0C0D0F0D0D0D0D0D0D0D0C0D0F0D0D0D0A0D0C0D0A0D0D0F0D100D0C0F0D0D0D0D0D0C0D 0F0C0F0C0C0C0D0D0C0F0D0D0D0D0C100F0D0D0C0D0D0D0D0D0D0D0D0D0D0F0D0D0D0D0A0D0D0D 0D0F0D0D0D0D100D0D0D0C0F0D0D0D0D0D0D0C0C0D0D0D0D0D0D0D0A0D0D0A0D0A0D0D0D0F0F0D 0A0D0D0D0D0D0C0D0D0D0D0C0D0F0D0D0C0D0D0D100D0D0F0D0C0D0F0D0C0A0D0D0D100F0F0F0F 0D0D0F0D0D0C0D0D0D0D0C0D0F0D0C0D0C0F0D0F0D0D0D0D0D0D0D0C0D0D0D0F0D0D0F0C0D0D0D 0D0D0D0D100C0D0D0D0D0D0C0C0D0D0D0D0D100D0F0E0A0C0D0D0D0C0D0F0D0D0F0C0D0D0D0D0D 0D0C0D0D0D0D0A0A0D0D0A100D0D0D0D0D0D0C0F0D0C0D0C0F0D0C0D0D0D0D0C0C0F0C0D0F0C0D 0C0D0D0D0C0D0C0D0F0D0D0D0F0D0D100D0D0D0F0D0C0A0D0D0D0A0D0D0D0D0D0F0F0F0D0F0C0D 0D0C0F0D0D0A0D0D0C0F0D0C0D0F0D0A0D0D0D0D0D0C0C0D0A0C0A0D0D0D0D0D0D0C0D0D0D0D0D 0A0D0C0D0D0D0D0D0A0D0D0D0D0D0D0A0D0C100D0D0F0F0C0D0F0D0D0D0D0D0D0D0F0D0D0C0D0D 0D0D0C0A0D0D0D100F0D100C0D0F0C0D0D0D0D0C0D0F0D0C0D0F0C0C0F0D0D0D0D100D0F0D0A0F 0D0C0D0C0D0D0D0D0C0D0F0D0F0F0A0F0D0D0A0F0D0C0D0A0F100F1415141A1917373432807F7E DEDCDAFCFCFCF8F5F1F5F2EEF6F3EFF6F3EFF6F3EFF6F3EFF5F2EDF7F4F1FCFCFCABABA9222223 1616171E1E1E1D1E1E1E1E1E1E1E1E20201F2525252D2D2E343435373838393A3A5B5C5C3A3C40 15191D26282A7575767D7E7F696C6C585D5D090909000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF0000000000000000000000000000000000000000000000000000000909097575767F8082 7F7F807C7C7E8E8E906565671D20212E30331F22253334363434342A2A2B2122211F1F201F1F1F 1F1F1F1F1F1F1F1F1F1E1F201E1E1E101312414040CDCBCAFEFEFDF5F2EEF4F1EDF6F3EFF6F3EF F5F2EEF7F5F1FFFDFAE1E0DF787473211F1E1515141413130C0C0A0D0C0A0D0F0F0C0C0D0C0C0D 0A0D0C0D0D0D0F0D0C0C0D0A0D0D0C0D0C0A0A0D0C0D0D100C0D0D0D0F0D0D0D0A0D0A0A0C0A0D 0C0C0D0C0C0D0D0D0D0D0D0C0D0C0D0D0D0D0F0D0C0D100C0C0D0D0D0C0C0D0D0D0D100D0C0D0D 0D0F100D0A0A0D0C0D0D0A0D0D0C0A0F0D0D0D0D0D0D0D0C0D0D0D0D0C0D0F0D0D0D0C0D0A0F0C 0D0D0C0D0D0D0C0F0D0D0C0F0D0C0F0D0D0A0D0D0C0F0F0D0D0C0D0D100F0D0D0C0D0D0A0D0D0D 0C0C0D0D0C0D100D0D0D100D100F0D0C0D0D0F0C0D0D0D0F0D0C0D0C0D0D0D100D0D0F0D0D0C0D 0D0D0D0F0D0C0D0D0D0C0D0C0D0D0D0D0D0D0D0F0D0C0F0D0C0D0C0D0C0D0D0D0F0F0D0F0F0D0D 0D0F0C0D0D0C100D0F0F0A0F0D0D0D0F0D0D0D0D0D0D0D0D0D0D0D0D0F0C0D100D0D0D0D0D0D0D 0D100D0D0D100D0F0D0D0D0A0D0A0D0A0A0C0C0F0D0D100D0D0D0C0D0C0A0D0D0D0C0D0C0F0D0C 0F0C0F0D0D0F0D0D0D0D0C0D0F0C0D0D0C100D0D0F0D0D0D0F0D0D0F0D0C0D0F0D0D0D0C0C0F0F 0D0F0F0A0C0A0D0D0F0D0C0F0D0D0F0C0D0D0D0D0D0D0F0D0A0D0D0D0C0D0D0C0C0D0D0C100D0D 0D0D0D0D0F0D0D0D0D0F0D0D100D0F0D0D0D0D100D0D0D100F0C0F0F0D0D0D0F0C0D0D0C0D0F0D 0D0F0D0D0D0D0D0D0F0D100D0F0D100C0D0D0D0D0C0F0D0F0D0C0D0D0D0D0D0D100F0F0D0C0F0D 0D0D0D0C0F0D0D0D0A0D0D0D0F0F0D0D0F0D0D0F0D0D0D10100D0D0F0D0C0D0C0D0D0F0F0D0D0F 0D0C0F0D0F0F0D100F0D100D0D0D0D0D0D0D0D0F0D0F0D0D0D0D0F0D0D0D0D0C0F0D0D0D0D0C0D 0D0A0C0C0F0D0D0D0D0D0D0D0F0D0D0D0C0D0D100F100D0F0D0D0D0D0D0F0C0D0F0C0D0D0F0F0D 0D0D0D0D0C0F0D0D0D0D0D0C0F0C0D0C0D0D0A0D0D0D0D100D0D0D0D0D0D0D0D100E0A0D0D0D0F 0D0D0D0A0C0D0D0D0D0D0D0D0D0D0D0D100D0D0C0D0D0C0D0D0D0D0D0D0C0D0C0D0D0D0F0F0D0D 0D0D0D0D0D0D0D0D0C0D0D0D0D0D0D0F0D0D0D0D0C0F0C0F0D0D0D0D0A0D0D0A0F0D0D0F0D0D0D 0D100C0D0D0D0C0D0D0C0A0D0D0D0F0D0F0F0C0D0A0C0F0D0D0F0F0F0D0D0F0D0D0F0D0D0C0F0D 0C0D0D0F0C0D0D0D0F0F0C0C0F0D0D0D0D0C0A0D0D0D0D0D0D0D100F0D0F0F0F0C0D0D0D0C0D0D 0C0D0D0D0D0F0C100C0D0D0C0F0F0D0F0F0D0D0D0C0D0D0D0D0D0D0D0D0F0A0D0D0D0D0D0F0F10 100D0C0D0F0C0D0F0D0D0A0F0D0C100C0D0D0C0F0C0D0F0D0F100F151715151515302C2E8E8A89 E9E7E6FEFCF8F6F4F0F5F2EEF6F3EFF6F3EFF6F3EFF5F2EEF3F0ECFEFEFDBABAB8292929171718 1F1F1F1E1E1E1F1F1F1F1F1F1F1F1F2424242C2C2C343435363738373839535556292D2F14171B 383A3B8080817476776E6F70454646000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 0000000000000000000000000000000000000000000000005555578584887E7E817C7C8088888A 7E7D7F2628292C2E302223262D2D2F3332332929292021211E1F201F1F1F1F1F1F1F1F1F1F1F1F 2020201D1D1D1314145A5B59E6E7E5FFFEFDF2EFEBF5F2EEF6F3EFF5F2EEF5F2EEFDFAF6F5F4F4 ABA9A73635341210141715160D0D0C0A0A0A0F0D0D0C0D0F0D0C0D0C0D0C0C0F0D0A0D0D0C0D0A 0D0F0C0C0C0D0F0D0C0D0D0C0D0C0C0D0D0D0C0C0A0D0D0D0C0D0C0C0A0C0D0D0C0A0D0F0C0D0D 0D0D0C0D0C0D0D0D0C0D0D0D0D0C0D0F0D0D0F0D0D0D0C0C0A0D0A0D0D0D0D0D0A0D0D0D0C0A0D 0C0C0D0F0D0D0D0F0C0D0C0D0D0C100C0C100D0D0C0F0D0A0D0D0D0D0D0F0C0D0D0C0D0C0C0D0F 0C0D0D0D0D0D0F0D0F0D0D0D0D0D0D0D0D0C0F0C0D0D0D0C0D0D0D0D0D0D0D0C0C0D0D0F0D0D0D 0D0D0C0D0C0D0D0D0D0D0D0D0D0D0C0F0F0D0D0D0D0D0F100D0D100D0C0D0D0C0D0D0F0D0C0D0D 0C0A0A0D0C0D0D0F0A0D0D0D0D0C0F0D0D0D0D0D0F0D0D0D0D0D0D0D0C0C0F0D0C0A0D0D0D0D0C 0D0A0D0D0C0D0C0D0D0C0D0C0D0D0D0D0C0D0D0D0D0F0D0D0F0F0C0D0D0D0D0C0D0C0D0C0D100D 0D100D0D0D0F0F0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0F0D0D0F0F0D0D0D0D0F0D0C0F0C10 0D0F0D0F0D0D0D0D0C0F0D0D0D100D0D0D0D0D0D0F0D0D0D0D0C0D0F0F0D0D0D0C0D0C0D0D0D0D 0D0D0F0F0F0D0D0D0D0D0F0D0C0F0D0A0C0D0A0D0D0D100D0F0D0D0D0D0D0D0F0D0D0D0D0D0D0A 0A0D0C0C0D0C0D0D0C0D0D0D0C0F0D0D0A0D0D0D0D0D0D0D0D0D0F0D0D0D0D0D0F0D100D0C100D 0D0D0D0D0D0D0D0F0F0C0F0F0D0D0C0D0D0C0D0F0D0D0D100C0C0F0D0A0D0F0D0C0D0A0D0D0D0C 0C0D0D0F0D0C0C0F0D0C0D0D0D0C0C0D0C0D0D0C0D0D0F0D0D0D0D0D0D100D0C0D0D0D0D0D0D0F 0C0D0F0D0D0C0F0F0C0C0F0C0D0F0D0D0C0D0D0D0D0D0D0D100D0D0D0D0D0D0D0F0D0D0D0D0D0D 0F0D0D0D0D0C0D0D0D0D0C0C0F0D0C0F0D0C0F0D0D0F0D0D0D0D0D0D0C100D0D0D0D0A0D0F0D0F 0D0F0D0C0D0C0D0A0D0D0D0D0C0D0C0C0D0D0D100A0D0F0D0D0D0D0C0F0F0D0C0F0D0D0D0D0D0D 0A0D0D0C0D0D0D0D0D0D0D0A0D100D0F100D0C0C0D0D0C0D0C0D0D0F0F0F0F0D0D0D0D0C0F0D0D 0D0F0D0D0F0D0C0C0D0D0C0F0D100F0D0D0C0D0D0D0D0D0D0A0F0D0A0F0D0C0D0C0F0D0D0D0D0D 100D0F0D0D0F0D0C0D0D0A0F0D0D0D0F0F0D0F0D0C0D0F0D0D100D0D0F0D0D0D0C0D0D0D0D0D0F 0D0C0D0D0C0C0D0D0D0F0D0D0D0D0F0D0A0F0D0D100B0F0D0D0D0C0C0C0D0D0F0D10100D0F0F0D 0D0D0D100D0D0D0F0D0D0C0D0F0D0C0F0D0D0D0A100F0D0C0D0C0D0D0D0C0D0D0D0D0D0C0F0D0C 0D0D0C0D0D0C0D0D0C0F0A0F0F0C0C0D0F0D0D0C0D0C0A0D100F10151616121314424141B6B3B1 F7F6F4FCFAF6F5F2EEF5F2EEF6F3EFF6F3EFF6F3EFF3F0ECFFFFFEBFBFBD2C2A2B161617202021 1E1E1E1F1F1F1F1F1F1F1F202323242B2B2B333334333536393B3B4446471D2024181B1E4F5050 818182696B6D646768232323000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 0000000000000000000000000000001F1F1F78787C78777A8080828282848B8B8D3F4040232526 25282B2528293131322626272020211F1F201F1F201F1F1F1F1F1F1E1F1F2121201E1D1D141414 6D6D6CF5F4F2FEFDFBF1EFEAF6F3EFF6F3EFF5F2EEF5F2EEFFFFFCE1E0E0757370161716101313 1013130A0C090D0D0C0D0D0D0C0C0D0C0D0D0C0C0D0C0A0D0C0D0C0D0F0D0C0D0D0C0D0D0D0C0D 0D0D0C0C0D0D0D0D0D0D0D0D0D0D0D0F0D0C0F0C0D0A0C0D0A0D0D0D0D0D0D0D0A0C0C0D0D0A0D 0D0D0D0D0D0A0C0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0C0D0C0D0D0D0D0C0D0C0C0A0C0D0D0D0D 0D0C0D0C0C0D0C0D0D0D0F0F0D0C0D0D0A0C0D0D0C0D0D0D0D0F0D0D0D100D0D0D0C0D0D0C0D0D 0C0F0D0C0D0C0D0D0D0F0C0C0D0A0F0D0C0D0D0A0D0D0D0D0D0D0D0C0C0D0C0A0C0D0C0D0D0D0D 0C0D0D0C0D0D0D0D0C0D0D0D0C0D0A0D0D0C0D0C0C0D0D0D0F0D0F0D0C0C0D0C0D0D0D0D0D0F0D 0D0F0D0C0D0D0C0D0A0D0D0C0D0D0C0C0F0D0D0D0D0D0D0C0D0C0C0D0D0F0D0A0D0D0D0C0D0D0D 0D0D0C0A0D0C0D0D0D0D0C0D0A0A0D0D0D0D0D0A0D0D0A0D0F0D0D0D0D0D0D0C0D0D0C0C0D0C0D 0D100D0C0C0F0D0D0D0D0D0F0D0C0D0C0D0C0D0D0D0D0D0D0C0C0D0D0D0D0D0D0C0F0D100D0D0D 0D0C0D0D0D0D0C0D0D0D0D0F0C0C0F0C0D0D0D0C0C0F0F0D0D0C0D0C0C0A0F0F0D0D0D0D0D0D0A 0D0D0D0D0D0C0D0D0D0D0D0D0D0D0D0D0D0D0D0F0C0C0D0F0D0D0F0D0D0D0D0D0D0C0D0D0C0D0F 0D0D0D0D0D0F0D0A0D0D0D0C0D0A0D0D0C0D0D0F0C0D0C0D0D0D0D0D0D0F0D0C0D0D0C0D0C0D0D 0D0D0D0F0D0D0F0D0D0D0D0D0C0C0D0D0D0D0D100D0F0D0D0D0C0D0D0D0C0C0A0A0D0C0D0F0D0D 0C0D0F0B0F100D0C0C0D0C0D0D0C0F0D0D0D0C0D0C0F0C0F0C0D0F0C0D0D0D0A0D0C0C0D0F0F0D 0F0F0D0D0C0C0F0C0C0C0D0D0D0D0F0D0D0F0D0D0D0D0F0D0C0D0D0A0C0D0C0C0F0D0C0D0D0D0D 0D0D0D0C0C0D0D0D0D0D100D0D0D0C0C0D0C0D0C0A0F0D0C0C0D0D0D0D0F0D0F0D0D0D0C0D0D0D 0D0C0A0F0D0D0F0D0D0D0D0A0F0D0C0D0D0A0D0F0A0C0F0D0C0D0C0D0D0D0D0D0D0C0F0D0D0D0D 0D0D0F0D0D0D0D0D0C0D0D0D0D0D0D0D0D0C100D100D0D0D0D0C0F0C0D0F0D0D0C0F0F0D0A0D0C 0D0A0C0F0D0F0B0F0D0D0D0D0D0C0D0A0D0D0D100D0D0D0D0A0C0D0D0D0F0D0D0F0F0D0D0D0C0D 0C0D0D0D0D0C0C0F0D0D0F0D0D0D0A0D0A0A0F0D0C0D0D0D0D100D0D0F0D0F0D0D0D0A0D0C0D0F 0D0C0D0F0D0D0D0F0D0D0F0F0D0D0D0C0D0C0D0C0D0D0D0D0F0D0D0C0D0D0D0F0A0D0D0F0D0C0D 0D0D0D0F0D0D0D0D0A0D0D0D0C0A0D0C0D0D0D0D0D0D0D0D0D0D0D0D0F0D0D0D0D0D0F0C0C0C0D 0D0C0A0F0D0C0F0D0D0D0D0D0D0D0D0F0D0D0D0D0C0D0D0C1114131213121E1D1C7C7977E5E4E1 FFFFFAF5F3EEF4F1EDF6F3EFF6F3EFF6F3EFF2EFEAFFFFFFBFBEBD2928281515152222221F1F1F 1F1F1F1F1F201F20202223232C2C2D3333343333343E3F40383A3C15181D21222369686877777A 646569595B5E040404000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 00000000000000000061636475757978787B7D7D7F8D8D8E6161611E1F20282A2D2124252E2F2F 2526261F20201F201F1F1F1F1E1F1F1E1F1F1E1E1E2121211F1F1E121212737271FBFBF7FCFAF7 F1EEEAF6F4F0F6F3EFF3F0ECF7F4F0FFFFFFCAC9C74A48480D100D1614140C0A0C090A0A0C0D0A 0C0C0C0D0C0C0D0A0C0D0D0A0D0C0D0A0C0D0D0C0A0C0D0A0D0A0A0D0D0A0D0D0F0C0C0D0D0D0D 0D0D100D0D0D0D0C0D0D0D0D0E0A0C0D0D0F0D0D0D0A0D0C0D0D0C0D0D0D0D0D0D0F0D0D0A0D0A 0D0D0D0D0A0F0D0D0C0D0D0C0D0D0D0D0D0D0D0D0D0C0F0D0D0C0A0D0C0D0D0D0D0D0C0C0D0C0D 0D0D0C0D0F0C0D0D0D0C0C0D0C0D0D0A0C0A0D0D0D0F0D100F0D0D0D0D0C0D0C0D0D0D0D0F0C0D 0D0C0D0F0D0C0F0D0D0D0D0D0D0D0D0D0D0C0D0C0C0D0D0A0D0C0A0D0A0D0C0D0D0D0D0D0C0D0D 0D0D0C0D0D0D0D0D0C0D0A0D0D0D0D0D0D0C0D0C0D0D0D0C0E0C0A0C0F0D0A0D0A0C0C0D0D0D0C 0D0D0D0D0D0D0D0C0D0C0C0D0D0D0D0D0D0C0D0C0A0C0C0D0D0D0F0D0C0C0D0D0C0D0D0C0D0D0A 0D0D0D0C0C0D0D0C0D0D0C0F0D0A0C0D0D0F0D0D0A0C0D0C0D0A0D0D0C0D0D0D0C0A0F0A0A0D0D 0D0D0F0C0D0D0D0D0A0D0D0C0C0D0F0D0D0D0D0A0D0C0D0D0D0C0D0D0D0D0D0D0C0A0D0D0C0C0D 0C0A0C0D0D0D0D0C0D0C0A0D0D0C0D0D0D0D0A0D0D0C0D0D0C0C0C0D0D0D0D0D0D0A0D0D0D0C0D 0F0D0A0D0D0A0F0C0D0D0F0D0D0D0D0D0A0C0D0D0D0D0A0D0D0C0D0D0D0D0D0D0D0D0D0C0C0C0D 0D0D0D0F0D0D0F0C0D0D0D0A0F0D0D0D0D0C0D0D0C0D0C0D0F0A0D0D0A0D0D0D0D0A0C0C0D0C0D 0D0C0C0D0C0D0D0D0D0C0D0D0A0C0D0D0D0D0D0A0D0C0D0D0A0A0C0C0A0C0D0D0F0D0D0D0D0D0C 0C0D0C0D0D0C0D0D0A0A0D0C0C0D0D0C0C0C0C0D0C0D0D0D0A0D0D0A0D0D0D0D0D0C0C0D0D0D0D 0D0D0A0D0D0D0D0D0D0A0D0F0D0D0D0D0F0C0D0D0C0C0D0D0C0D0D0A0A0D0D0D0D0C0C0A0A0C0D 0D0C0D0C0D0D0C0F0D0A0D0C0D0C0D0D0D0A0C0D0C0A0D0C0D0D0D0D0D0D0D0A0C0C0D0D0D0C0C 0D0C0A0A0C0C0D0D0C0D0D0C0C0D0D0A0C0D0C0A0F0D0D0D0D0D0C0D0D0D0D100D0D0F0D0D0D0D 0D0A0D0C0D0C0F0D0C0D0C0D0D0D0F0D0C0D0F0D0C0D0D0D0D0C0D0D0C0C0D0D0D0D0D0D0D0D0D 0D0C0D0D0D0D0D0D0D0C0C0D0D0D0C0D0A0C0D0D0D0D0F0D0C0C0D0D0C0C0C0D0D0D0D0C0D0D0C 0A0D0F0D0D0D0D0C0D0F0C0D0D0D0D0C0D0F0C0D0D0D0D0C0D0D0D0D0D0D0C0D0D0D0D0F0D0C0D 0C0C0A0D0D0A0D0D0A0C0D0D0D0D0A0D0D0D0D0D0D0A0C0C0C0A0D0D0D0D0D0D0C0D0D0D0B0F0D 0D0D0D0F0D0D0D0C0D0C0F0D0D0D0D0C0D0D0D0D0C100D0D0D0F0D0D0D0C0D0C0D0C0C0D0C0C0D 0D0D0C0D0D0D0D0D0D0C0C0D0D0D0D0F0D0D090A070C0D0D1516140F0F0D504E4CCDCCC8FFFFFF F7F4F0F3F1ECF6F3EFF6F3EFF6F3EFF2EFEBFFFFFFB9B9B82424241515152122231F1F201F2020 1F20202020202324242C2D2D323234343436404042292B2F1114163839397A79796A6B6D646868 39393B000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 30303278797C7777797B7C7E8282857C7C7D2D2D2F2325272224272829292626251E1F1F1F1F1F 1F1E1F1F1F1F1D1D1F1E1E1E1F1F1F1D1D1D101010747472FAF9F6FBF8F5F2EFEBF6F4F0F6F3EF F3F0ECF8F5F1FFFFFFB3B2AF3232310F0F0F1310120A0A0A0D0D0D0C0D0D0A0C0D0D0A0D0D0C0A 0C0D0C0C0C0A0C0A0A0C0F0A0C0A0D0C0A0C0D0C0C0C0C0A0C0C0F0C0C0D0E0A0C0A0D0D0D0D0C 0C0D0D0C0D0D0D0A0C0D0C0C0D0D0D0A0D0D0C0D0D0D0D0C0D0D0D0D0D0D0C0D0C0C0C0D0D0C0C 0D0D0D0D0D0C0D0D0C0D0D0D0D0C0D0F0D0C0D0A0D0D0D0A0D0D0D0D0D0D0D0D0D0D0D0D0D0C0C 0D0D0D0D0D0D0D0D0D0A0C0C0D0C0D0D0F0C0C0C0D0D0C0C0D0D0D0D0D0D0F0D0D0C0D0D0D0D0D 0D0D0D0C0D0D0D0D0D0A0C0C0C0D0C0C0D0D0D0D0D0C0C0D0D0D0C0D0D0C0D0D0C0D0D0D0D0D0D 0D0D0D100D0D0D0D0F0C0D0C0D0D0D0C0D0F0C0D0D0D0C0D0D0C0C0F0D0F0D0F0D0D0C0C0D0D0C 0D0C0D0D0D0D0D0D0D0D0C0D0D0D0D0D0C0D0C0D0C0D0C0D0C0D0C0C0D0C0E0A0C0D0A0D0D0D0D 0D0C0D0D0C0D0D0C0D0C0D0D0C0D0C0A0D0A0D0D0D0D0D0D0C0C0C0C0D0C0D0C0D0D0C0F0D0D0D 0D0D0A0D0D0C0D0D0A0C0D0D0D0D0F0D0D0D0D0D100C0D0C0C0D0D0C0C0C0D0D0A0D0C0A0D0C0D 0C0D0D0C0D0D0C0D0D0D0D0D0F0D0C0D0D0D0C0C0A0D0D0D0C0D100C0D0D0C0D0C0D0D0D0C0C0D 0C0D0D0A0A0D0D0D0C0D0D0C0D0D0C0D0D0D0C0C0C0C0C0D0C0D0C0C0D0C0A0C0D0D0D0D0C0D0D 0D0D0D0D0D0A0D0C0D0F0C0C0D0C0D0D0D0C0D0D0C0D0A0F0D0D0D0A0D0D0D0C0D0D0C0C0D0C0C 0D0F0D0D0D0D0D0C0D0D0A0F0D0C0D0D0C0D0D0A0C0D0A0C0D0D0C0F0D0C0C0D0A0D0C0A0D0D0C 0C0D0D0C0A0C0D0D0C0D0D0A0C0D0A0D0D0C0D0C0D0A0D0D0C0D0D0D0C0D0C0D0D0D0D0C0F0D0C 0D0D0D0D0D0F0C0D0D0D0D0A0C0A0D0D0C0D0D0D0D0D0F0A0D0D0D0A0D0D090C0D0D0F0D0C0C0C 0D0C0D0D0C0D0F0C0D0F0D0D0C0D0D0D0D0F0D0D0D0C0C0D0D0A0D0C0D0D0D0C0C0D0D0A0A0A0C 0C0A0D0D0D0D0C0C0D0D0C0D0D0D0D0D0D0D0D0D0A0C0C0C0A0D0F0C0D0C0C0D0D0D0D0D0F0D0D 0D0C0D0C0A0C0D0D0C0C0A0D0C0D0C0D0F0A0D0D0C0D0C0D0C0D0C0D100D0D0D0D0C0C0A0D0D0D 0D0C0A0D0C0D0C0D0D0D0A0D0D0C0F0D0D0D0D0C0D0D0D0D0C0F0F0C0D0D0D0F0C0D0C0C0F0C0C 0D0D0D0D0F0D0D0D0C0D0C0C0D0D0D0C0D0D0A0D0D0D0D0D0D0C0D0F0D0D0C0D0C0D0D0A0D0D0A 0A0F0C0A0C0D0D0A0C0D0D0C0D0D0D0C0D0A0D0D0D0F0D0D0D0F0D0C0D0D0C0D0D0C0D0D0F0D0D 0D0D0D0D0F0D0D0D0D0A0D0C0C0C0D0D0A0A0D0C0C0C0C0D0D0D0D0C0D0D0C0A0D0D0D0D0D0D0C 0C0C0D0A0C0D0D0C0C0D0D0D0F0D0C0D0D0D0A0A0C1414120F0F0F363233B3B2AFFFFFFFF9F7F3 F3F0ECF6F3EFF6F3EFF6F3EFF4F2ECFFFFFFB1B1AF222221151616202121202021202121212121 2020202324232C2D2E313133373638383B3C1D2024141619595A597677786063645D5E5F060606 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF00000000000000000000000000000000000000000000000000000064656978797A 7D7F7F8181828484874D4D4F1C1E1F26272B2123252424241E1E1F1E1F1F1E1F1F1E1E1E1E1E1E 1E1E1E1E1F1F1C1D1D1010106C6C6BF6F6F2FCF9F5F2EFECF6F3EFF6F3EFF3F0ECF9F6F2FFFFFF A19F9F2624240F10100F0D0F0D090A0D0D0C0C0C0C0A0A0D0D0C0D0D0C0D0C0D0A0A0F0C0D0D0D 0C0D0A0C0D0D0A0A0D0A0A0D0D0C0D0D0D0C0C0D0C0D0D0C0D0A0D0D0C0C0A0D0A0A0A0A0C0C0D 0C0D0D0A0D0C0C0C0C0D0C0D0D0D0C0D0C0A0C0C0C0C0A0D0C0C0D0D0D0D0D0D0C0C0D0D0C0D0D 0C0C0D0D0D0D0D0A0C0C0D0D0D0D0D0D0C0C0C0D0D0C0D0D0C0C0C0D0A0C0C0A0A0A0D0C0C0C0C 0D0F0D0D0D0A0C0D0D0C0F0D0A0C0D0C0F0D0C0C0C0A0D0D0D0F0C0D0D0D0D0D0D0C0A0A0C0D0D 0C0A0A0C0C0C0C0D0D0C0C0D0D0C0D0D0D0D0D0A0A0D0C0C0D0C0A0D0D0C0D0D0D0C0A0D0C0D0C 0D0D0D0D0D0D0D0D0A0C0D0C0C0D0D0C0D0C0F0C0A0C0D0D0A0D0D0C0A0D0D0C0D0D0D0A0D0D0D 0D0D0D0D0C0C0C0D0D0C0D0D0D0D0C0D0F0D0D0D0C0C0D0D0C0C0D0A0C0D0D0C0D0D0C0D0F0D0C 0D0D0D0D0D0C0C0D0D0C0D0A0C0D0D0D0C0D0D0C0D0D0C0F0D0D0D0D0D0C0F0C0D0D0D0C0C0D0C 0D0D0C0C0D0D0D0D0D100D0C0D0D0C0D0C0C0C0D0D0D0D0A0C0D0C0D0D0C0D0D0D0D0D0D0D0D0D 0C0D0D0D0D0D0C0D0C0C0D0C0D0C0D0D0D0C0D0C0D0F0A0D0D0D0A0C0D0D0C0D0D080D0C0C0C0D 0C0D0D0A0D0D0D0D0D0D0D0A0C0F0D0D0D0D0A0A0D0C0C0D0C0D0D0C0A0A0A0C0D0D0C0F0D0C0D 0C0D0C0F0D0A0D0D0C0D0A0D0D0D0D0D0D0F0D0D0C0C0D0C0C0D0D0D0D0D0D0D0C0D0C0D0C0C0D 0D0D0D0D0A0D0D0A0D0D0D0D0D0D0A0D0D0D0D0D0A0D0D0C0D0D0D0D0D0D0F0D0D0D0A0D0D0C0D 0F0F0D0D0A0D0D0C0D0F0D0C0C0D0D0C0D0D0D0D0C0D0D0A0D0D0C0D0D0F0D0D0D0F0D0C0D0C0D 0A0D0D0D0D0D0C0C0D0C0A0D0D0D0D0D0D0D0F0D0A0D0D0D0C0D0C0C0F0D0D0C0C0D0A0D0D0D0D 0F0D0D0D0C0C0D0C0D0D0C0F0C0F0F0D0D0D0F0D0C0D0C0D0D0C0D0D0C0C0C0A0C0D0D0D0C0C0D 0D0C0C0D0C0D0D0D0D0D0D0D0D0A100C0C0D0D0C0F0C0A0D0C0D0D0D0D0C0D0D0D0D0C0D0C0C0D 0D0C0C0C0A0D0A0D0C0C0C0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0D0D0D0D0D0D0D0C0F0D0C 0D0D0D0D0D0C0C0C0D0C0D0D0A0D0A0D0D0D0D0F0D0D0C0F0D0D0D0A0D0C0F0D0C0D0D0C0C0D0D 0C0C0C0D0D0C0C0D0D0C0C0C0A0D0C0D0C0D0C0C0D0D0D0D0C0C0C0C0D0D0C0D0D0A0D0D0D0D0D 0D0A0D0D0D0C0D0D0D0D0D0C0D0C0D0D0D0D0A0C0C0C0C0C0C0D0A0C0D0D0D0F0D0D0D0D0C0D0D 0C0D0D0C0D0A0D0D0C0C0D0D0D0A0C0D0D0D0F0D0D0D0D0D0F0A0F0A0D0D0C0D0D0D0D0D0C0D0D 0D0C0D100D0D0F0D0D0D0D0D0D0C0D09090A100D0D100F0F252626A3A29FFFFFFFF9F7F4F3F0EC F6F3EFF6F3EFF5F2EFF6F4EFFFFFFFA9A8A62B2C2B1B1B1D1F1E1F202020212121212121202120 2424242C2C2D313133393A3B2E313314171C2A2B2D7172726A6B6C626466414343000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 00000000000000000000000000000000000000000000000035353874757979797A83848588888B 7474762627272224252224262121221F1F1F1E1E1F1E1E1F1E1E1E1E1E1E1E1E1E1D1D1E1D1C1D 1B1C1B6B6A68EDEDEBFDFBF7F3F1ECF6F3EFF6F3EFF3F0ECF8F5F2FFFFFF9B9C98201D1E100D0F 0C0C0D0A0A0C0F0C0D0C0A0A0A0C0C0C0C0A0D0A0C0D0D0C0D0D0C0A0F0D0F0C0D0D0A0C0C0C0C 0A0A0A0A0C0C0D0A0D0D0A0D0C0D0A0D0D0D0D0C0D0D0C0C0A0C0C0A0C0A0D0D0D0C0D0D0C0C0C 0C0D0A0C0C0A0D0C0A0C0C0C0C0D0D0D0A0D0A0A0F0F0D0C0D0D0C0D0C0C0D0D0C0D0D0D0D0D0D 0D0D0D0A0D0C0C0D0A0A0A0D0A0D0D0A0C0A0D0D0C0D0D0D0D0C0D0C0D0D0A0C0C0D0D0C0D0D0C 0C0C0C0D0D0C0A0D0C0C0D0D0C0D0A0A0A0C0A0D0D0C0C0D0D0D0D0C0C0A0D0D0C0A0C0D0D0C0C 0D0D0A0C0D0A0A0D0A0C0C0A0A0C0A0D0D0A0C0D0D0C0D0A0C0C0D0C0C0A0C0D0D0C0C0C0A0C0A 0A0C0D0D0D0D0D0C0D0D0D0C0C0A0A0C0D0D0D0D0D0C0A0D0C0A0F0C0D0C0A0C0C0C0D0C0D0C0C 0D0D0D0C0D0C0D0D0D0C0D0D0C0D0C0C0D0C0A0C0D0A0A0D0C0C0C0D0D0C0C0C0A0D0F0C0D0D0A 0D0C0D0A0D0C0D0C0A0D0D0F0C0D0C0D0C0D0A0D0D0C0D0D0D0C0D0C0C0D0C0C0D0C0D0F0D0D0D 0D0A0C0C0C0A0C0D0A0D0C0C0D0C0D0D0C0C0A0C0D0D0C0C0C0D0C0D0C0D0C0D0C0C0D0C0C0D0D 0A0A0D0D0C0C0A0C0D0A0D0D0C0D0D0C0C0C0A0A0C0D0C0D0D0C0C0A0D0D0D0C0C0A0C0D0C0D0D 0C0C0C0D0C0A0D0D0D0C0D0D0A0A0C0C0A0D0C0F0C0D0A0A0D0D0C0A0D0C0D0A0C0C0D0D0C0D0A 0D0C0C0C0C0C0D0D0D0D0D0D0D0D0A0A0A0D0A0D0D0C0D0D0D0D0D0D0A0C0D0D0D0A0D0C0D0C0D 0D0C0D0A0C0D0A0D0A0C0D0A0C0C0A0D0D0D0D0C0D0C0F0D0D0D0D0C0C0A0C0C0C0C0D0C0D0C0C 0D0D0D0D0D0D0A0C0D0A0D0D0F0C0C0D0D0C0D0D0D0D0D0F0D0C0D0D0D0D0C0D0D0C0D0F0D0C0D 0D0C0D0D0C0C0D0D0D0D0A0D0D0C0A0D0F0D0C0D0D0C0C0D0D0D0D0D0A0D0C0D0D0D0D0D0D0D0D 0D0C0D0C0C0C0D0C0F0D0D0A0D0C0A0D0D0D0D0C0D0D0C0F0A0C0D0C0D0D0D0C0D0D0D0D0D0A0D 0C0D0D0C0D0D0D0A100D0D0D0D0D0D0D0D0C0C0C0C0C0A0C0D0D0C0D0A0D0C0D0D0C0D0D0D0C0F 0A0D0D0C0A0D0C0C0C0D0D0C0F0A0D0D0C0A0C0D0C0C0A0D0D0D0C0D0C0D0E0A0A0C0C0A0C0D0D 0D0D0F0C0F0D0C0D0A0C0D0D0D0D0C0D0D0C0D0A0D0D0D0D0D0C0C0D0D0D0C0D0C0A0D0C0A0C0D 0C0C0C0D0A0C0D0D0D0D0D0D0C0D0D0C0D0A0C0D0D0D0D0D0C0D0D0C0D0C0D0D0C0C0D0D0D0A0D 0F0D0D0D0D0D0C0D0D0C0C0D0C0D0D0C0D0D0D0D0D0D0C0D0D100C0D0D0D0D0C0D0D0A0D0A0C0C 0D0D0D0D0D0C0D0D0C0D0A0D0D0D0A0F0C0C0D0D0F0C0D0D0D0D0D0D0D0D0D0C0D0D0D0D0D0D0D 0D0D0D0A0D0D0C0A0C0D0C0D0C0C0D0D0D0D0F0D10201F1D9A9796FFFFFFF9F7F3F4F1EDF6F3EF F6F3EFF5F2EEF9F6F2FFFDF9A3A29F403F3E2626261D1D1D202120212121212121212121252625 2C2D2D33343534363823272B1213174D4D4D747675636566585A5D090909000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 0000000000000000000000000000000000006464697576797B7D7E8484858C8B8D4F4F511A1A1C 26282B1E1E1F1E1E1F1E1E1E1E1E1E1E1E1E1E1E1E1E1E1F1C1D1D1E1F1F2C2C2C6B6B69E5E3E0 FFFCF8F4F1EDF6F3EFF6F3EFF5F2EEF7F4F0FFFFFFA1A09F211F1E0F0D0F0D0D0A0A0D0A0C0D0D 0A0C0A0D0A0C0C0D0A0D0C0C0A0C0D0C0A0C0C0A0A0A0C0C0D0C0A0D0C0D0C0A0D0D0D0C0D0C0C 0D0C0D0A0A0D0A0C0C0D0D0D0D0A0C0C0A0D0D0D0D0D0C0C0C0C0D0D0C0C0D0D0C0D0C0A0C0C0A 0A0A0C0C0D0C0C0C0D0D0D0D0C0A0D0C0C0D0D0D0D0C0C0C0D0A0A0D0D0A0A0D0D0D0D0D0D0D0C 0D0A0D0A0C0A0A0D0C0C0D0C0D0D0C0D0D0D0D0A0C0C0A0D0C0C0D0F0C0C0D0D0D0A0D0C0C0F0C 0D0C0C0D0C0D0D0D0D0A0D0C0C0C0C0C0D0C0D0C0D0C0C0A0C0D0A0C0C0C0C0C0D0C0C0C0C0D0C 0D0D0C0D0D0D0A0D0C0D0D0C0C0D0D0D0D0C0D0C0A0D0C0C0D0C0D0C0D0C0D0D0C0C0C0C0D0C0C 0D0C0D0D0D0D0D0A0D0D0D0C0D0C0A0D0D0D0D0D0D0D0C0F0D0D0D0C0C0C0D0A0D0C0D0C0F0C0C 0C0D0C0D0C0D0D0D0A0A0D0A0D0C0D0A0A0C0A0C0A0D0C0C0C0D0C0D0C0C0A0C0D0C0D0D0C0D0D 0D0C0D0D0C0D0D0D0A0C0D0C0C0C0D0D0D0D0D0D0D0C0D0A0A0A0D0A0D0D0C0D0D0D0D0C0C0C0D 0C0C0D0C0D0A0C0C0A0D0D0F0C0D0D0D0C0A0D0D0A0C0C0A0C0D0D0A0C0C0A0D0D0D0C0D0D0C0D 0C0A0C0C0A0C0D0D0C0D0D0A0C0D0C0C0D0A0D0C0D0D0D0A0C0C0D0D0A0A0D0C0D0C0D0D0D0D0D 0A0D0D0C0D0D0C0D0C0A0D0A0A0D0A0A0C0D0D0C0C0C0D0D0D0C0A0C0D0A0C0D0C0C0D0F0C0C0C 0D0A0A0D0D0C0A0C0C0D0D0D0A0D0D0C0C0D0A0D0D0D0C0C0D0A0D0C0A0A0D0D0A0D0D0C0C0C0A 0C0D0D0D0C0C0C0A0D0D0D0D0A0A0C0C0D0A0C0D0D0C0C0C0A0D0C0C0D0D0D0C0C0A0C0A0D0A0A 0F0C0D0D0C100D0C0D0C0D0C0A0D0D0C0D0D0D0A0A0D0D0C0C0D0D0C0C0C0C0C0D0A0D0D0D0D0D 0C0C0D0D0A0D0A0A0A0D0D0A0D0A0C0A0C0D0C0A0D0C0D0D0C0D0D0D0C0D0D0C0C0C0D0A0C0C0C 0D0A0D0A0C0C0C0C0D0D0D0D0C0A0D0D0A0D0C0D0C0D0D0D0D0C0D0D0C0D0D0D0A0C0C0D0D0A0D 0F0D0A0D0D090C0C0C0C0D0C0D0A0C0D0C0C0D0D0C0C0C0C0C0C0D0C0D0C0C0A0D0C0A0A0D0C0C 0A0D0D0C0C0D0D0A0D0D0D0D0D0D0C0D0C0C0E0A0A0C0C0C0C0D0D0D0C0A0D0A0D0C0C0D0D0D0C 0C0D0D0A0D0D0D0A0A0A0C0C0D0C0A0D0C0D0D0A0D0C0D0A0D0C0A0D0C0D0D0D0D0C0D0D0A0D0C 0A0C0D0C0D0A0D0D0C0D0A0C0D0C0C0A0A0C0C0D0C0C0D0A0C0A0A0D0D0D0C0C0F0C0C0D0D0C0C 0A0C0A0D0D0D0D0D0D0D0D0C0C0D0D0D0D0C0D0A0D0D0D0A0C0C0D0D0D0D0D0C0D0C0C0C0D0C0D 0C0C0F0A0D0D0A0C0C0D0D0C0D0D0D0D0C0D0D0D0C0C0C0C0A0C0F0D0C0D0D0C0D0C0A0C0D0C0C 0A0A0D0D0D0A0A0D0D0C0A0A0C0A0C0D0F101E1E1D999896FFFFFDF7F5F1F5F2EEF6F3EFF6F3EF F4F1EDFBF8F4F6F3EF9897945252513332321F1F1F2020202122212122212222212526262C2E2E 3435362B2D311A1C20212324676A69676A695D60613D3E40000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 0000000000000000002C2C2E73767876787B7C7C7F82838579787A2728292022241E20221D1D1D 1D1E1E1E1E1E1E1E1E1E1E1E1E1E1E1C1C1D2020213E3D3C6E6C6AD3D0CDFFFDF8F5F2EEF6F3EF F6F3EFF5F2EEF6F3EFFFFFFEB2B1AE252523100F0D0C0A0A0C0A0C0C0C0A0C0C0A0A0D0C0A0A0C 0C0A0C0C0C0C0D0D0A0C0D0A0C0D0A0C0C0A0D0D0A0A0C0A0A0C0A0C0A0C0D0C0C0D0A0A0C0C0C 0C0A0C0A0A0C0A0A0D0D0C0C0D0D0D0D0C0D0C0A0C0D0A0D0C0C0A0A0C0C0A0D0D0C0C0A0C0D0A 0A0D0C0D0D0C0C0C0D0D0C0D0D0D0D0C0D0D0A0C0C0C0A0C0D0C0C0A0D0C0C0D0D0D0A0A0D0A0C 0D0A0D0D0C0D0D0D0C0C0C0A0D0D0D0A0A0D0A0C0D0C0D0A0A0D0D0D0C0C0A0D0C0A0A0C0D0C0C 0C0D0A0A0A0D0C0D0D0D0C0C0C0C0C0C0A0C0A0A0C0C0D0A0C0D0D0D090D0C0C0C0C0D0C0D0D0A 0D0C0D0D0C0C0C0C0C0D0D0D0D0D0D0C0C0D0C0D0D0A0A0C0A0A0D0D0A0D0C0C0C0D0D0A0A0C0A 0D0A0D0D0D0D0D0D0A0C0D0C0D0C0F0D0D0D0D0C0C0C0A0D0A0D0D0D0C0D0D0C0C0A0D0C0A0D0C 0D0D0A0A0A0D0D0D0A0D0C0C0D0A0C0D0C0D0D0C0D0C0A0D0A0C0D0C0C0D0C0D0D0D0C0C0D0D0A 0D0C0D0C0A0C0A0D0A0D0C0A0D0C0D0D0D0D0C0C0D0C0C0D0D0D0C0D0C0A0D0D0C0A0D0D0A0D0A 0D0D0A0C0D0C0C0D0C0A0D0D0D0D0D0D0C0C0C0D0D0C0D0D0A0C0C0C0A0A0D0D0D0C0A0C0F0A0D 0F0C0A0C0C0C0C0D0D0F0D0C0D0C0C0C0D0C0A0C0C0D0D0C0C0D0D0A0C0D0C0D0D0C0D0A0D0C0C 0D0D0D0C0C0D0D0D0A0D0D0D0C0D0D0D0F0D0D0D0C0D0A0D0D0C0D0D0D0D0D0C0D0C0C0D0C0D0D 0A0D0C0A0D0A0C0A0C0D0A0D0D0C0C0C0D0D0C0C0D0D0D0C0C0C0D0D0D0C0C0A0C0D0C0C0C0C0D 0D0C0D0D0C0C0A0D0D0A0D0D0C0C0A0D0C0C0C0D0A0C0D0D0C0A0D0D0D0A0C0C0C0C0D0D0A0C0D 0C0A0C0C0A0C0C0A0C0D0D0D0C0C0C0C0C0C0A0A0C0D0C0A0A0A0A0A0C0C0A0A0A0C0A0D0D0D0D 0D0D0D0D0C0D0D0D0C0A0D0D0D0C0C0D0D0A0C0C0C0C0D0D0A0F0C0C0D0A0C0D0C0D0C0C0D0C0D 0F0D0C0D0C0C0A0C0D0C0D0A0C0A0A0D0A0C0D0D0C0D0A0D0C0D0C0C0C0D0D0C0D0D0D0A0A0D0C 0D0C0D0C0A0C0C0A0C0D0D0D0A0D0A0D0A0D0D0A0C0C0C0A0D0C0D0D0C0D0D0D0C0D0D0D0D0D0D 0D0A0D0C0C0D0C0C0C0D0C0D0F0D0C0A0D0C0D0C0D0D0C0D0C0C0D0C0D0A0D0C0A0D0A0C0D0D0D 0C0F0D0C0D0C0C0D0A0C0D0A0A0A0D0D0D0C0C0D0C0D0A0D0C0C0D0C0C0D0C0C0A0D0D0A0D0C0C 0D0D0D0C0C0C0D0A0C0D0C0C0A0A0D0A0D0D0D0D0C0F0D0D0D0A0D0C0D0D0C0D0C0A0D0D0C0D0D 0D0C0D0D0C0A0A0C0D0A0D0D0C0C0C0D0D0A0A0A0D0D0C0C0D0C0C0C0C0A0C0D0C0A0D0C0C0A0C 0D0A0C0C0D0C0D0C0D0D0D0D0C0D0C0D0C0C0C0A0D0C0D0F0A0A0D0A0A0D0D0D0C0C0C0D0C0D0C 0A0D0A0D0D0D0C0C0C0A0A0D1210101F1D1CA3A29FFFFFFAF6F4F0F5F2EEF6F3EFF6F3EFF4F1ED FFFCF8E4E1DD8686835E5D5C3C3C3A2222222020202122212122212122212727272E2F302E2F31 22262A1216184445457073725F626357585A060606000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 00000058595C76787A7B7B7D7E7E8081818350515218191A2424261A191A1D1D1E1D1D1E1D1E1E 1D1E1E1E1E1E1D1D1E232323494848706E6DB9B7B3FBF9F4F8F5F1F5F2EEF6F3EFF6F3EFF5F2EE FFFFFBCBCAC72F302E0F0F0F0D0D0A0A0A0A0C0A0A0A0A0D0A0C0D0A0A0A0A0C0C090C0D0C0C0A 0A0C0A0C0D0D0C0D0A0D0A0C0A0A0C0A0A0D0A0C0A0C090A0D0A0A0C0C0A0D0A0C0A0C0D0C0A0D 0D0A0D0C0D0A0A0A0C0A0A0D0A0C0D0C0A0C0D0C0A0C0C0D0A0A0A0C0C0A0A0A0A0C0A0A0C0D0C 0D0C0C0A0C0C0A0A0A0C0D0D0A0D0D0C0A0A0C0A0A0D0A0C0D0D0C0C0A0A0C0C0A0D0C0D0C0C0D 0D0D0A0A0D0D0A0D0C0A0D0D0C0C0D0D0C0A0D0C0A0C0A0D0A0A0D0C0C0A0A0C0A0C0D0D0D0C0D 0D0D0A0A0A0D0A0C0C0D0C0A0C0C0C0D0A0C0A0A0C0C0C0D0C0C0D0C0C0D0C0A0A0C0A0C0D0A0A 0D0D0D0A0A0C0C0A0D0D0D0D0D0D0C0D0F0C0C0C0C0C0A0C0C0D0D0C0D0D0D0C0A0C0A0A0C0C0C 0A0A0C0A0A0A090A0A0A0C0C0D0F0D0D0D0D0A0D0A0D0D0C0D0A0C0C0D0A0A0A0D0C0A0C0C0A0C 0A0C0D0C0C0C0D0C0D0D0C0C0D0A0D0C0A0D0C0C0D0D0D0C0D0C0A0D0A0C0A0C0C0A0C0D0C0A0C 0C0C0C0E0A0A0D0A0A0D0A0D0D0C0C0A0D0A0C0D0C0A0C0C0D0C0C0A0C090A0D0D0A0D0D0D0D0C 0A0A0C0A0A0D0C0C0C0A0C0C0D0A0D0A0C0C0A0C0A0C0D0A0C0C0D0D0A0C0C0C0D0C0C0A0D0A0D 0D0A0C0A0C0D0A0D0D0A0C0D0D0D0D0C0C0A0D0C0D0C0C0A0A0C0C0A0F0C0A0C0D0D0A0D0D0A0D 0D0D0C0D0D0D0C0C0C0D0D0D0C0C0D0C0D0C0D0D0A0C0D0A0C0C0D0A0D0D0D0D0D0D0D0A0A0A0D 0D0A0C0C0C0C0D0A0C0C0D0A0A0C0C0C0D0A0A0D0A090A0D0A0D0C0D0A0C0D0C0A0A0F0A0C0C0A 0C0A0C0A0D0A0C0C0A0D0D0C0D0A0D0A0D0C0D0D0A0C0D0C0C0D0A0C0D0A0C0D0A0C0A0D0A0A0D 0A0A0A0A0C0C0D0D0D0A0C0D0C0D0C0C0A0D0A0C0D0D0C0D0D0D0C0D0D0C0D0C0D0C0C0C0A0D0C 0C0D0C0C0A0D0C0C0C0C0D0D0D0D0D0A0A0D0C0D0C0D0D0C0D0A0C0D0D0D0D0C0D0C0A0D0C0D0A 0A0C0D0C0D0C0D0C0D0D0A0C0C0A0C0A0C0C0C0D0D0C0D0D0A0D0D0C0C0C0C0D0D0C0D0C0C0C0D 0D0D0D0D0C0A0C0D0C0F0D0D0C0A0C0A0C0D0D0A0C0D0D0A0D0D0C0D0C0D0C0D0C0D0D0C0D0D0D 0D0C0C0E0A0C0D0D0D0C0C0D0C0D0C0C0C0C0C0A0C0D0C0D0C0D0C0C0C0C0C0D0A0A0C0C0C0D0C 0C0D0D0D0D0C0D0D0C0A0C0D0C0C0C0A0C0A0A0D0A0D0D0C0C0A0C0D0D0C0D0C0D0D0D0C0C0A0D 0C0D0C0B0F0D0D0D0D0D0C0D0D0C0D0D0D0D0A0D0F0A0A0D0A0A0A0A0D0D0C0C0D0D0D0C0D0C0A 0D0D0A0C0F0C0C0C0A0D0C0D0C0D0A0D0C0D0D0D0D0C0A0C0D0C0A0C0D0A0A0A0C0C0A0A0C0A0C 0D0A0D0D0D0C0D0C0D0A0D0C0C0D0D0A0A0D0C0C0D0D0D0D0A0A0D0C0D0D0C0C0C0D0D0A0C0D0C 0C0C0D0A0A0C0C0A0C141410222121B7B4B3FFFDF9F5F2EEF6F3EFF6F3EFF6F3EFF7F4F0FFFDF9 C7C6C27776736463624140402323232121212121222122212223212727272D2E2F25282A1B1E21 2122236768676265655D6062333535000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000171717707073 77787A7F7E8081818379797B292A2B1F20211D1D1F1B1B1B1D1D1E1D1D1E1D1E1E1E1E1E1D1D1D 2525254E4E4D72716F9C9A97EEEBE8FCF9F5F5F2EEF6F3EFF6F3EFF5F2EEFBF9F6E3E2E1494949 0D0D0D0F0F0C0909090D0A0C0A0A0A0A0A0D0A0A0C0D0A0A0C0A0C0D0C0D0A0C0A0C0C0A0C0A0D 0A0A0A0C0C0A0D0D0D090A0C0D0C0A0A0C0A0A0C0A0D0A0D0A0A0C0A0C0C0D0A0A0C0A0D0A0C0D 0A0A0C0C090D0C0A0C0A0A0C0C0D0C0A0D0C0C0C0A0A0D090D0C0A0C0A0C0C0C0D0D0A0A0A0C0A 0A0C0A0A0C0C0A0D0A0C0C0C0C0C0C0A0A0A0D0D0C0C0A0A0A0A0A0D0D0D0A0A0C0A0A0A0C0A0A 0A0A0A0A0A0A0D0A0C0A0C0A0C0C0A0A0A0D0A0D0D0C0A0D0A0C0A0A0A0D0A0C0D0C0A0A0D0A0C 0C0A0D0C0C0C0A0C0A0C0C0C0A0D0A0A0C0C0A0D0A0A0A0A0D0C0D0C0C0C0A0C0A0D0C0A0C0A0C 0D0A0A0C0C0C0C0A0A0D0A0A0D0D0C0C0C0D0C0D0C0D0C0C0D09090C0D0A0D0A0A0A0C0D0D0A0C 0C0A0A0A0C0A0A0D0C0A0A0C0C0C0A0C0A0A0C0C0D0D0C0D0D0A0C0A0A0C0D0D0D0D0A0D0C0C0A 0D0D0C0C0D0A0D0C0C0A0A0D0D0D0D0A0C0D0A0C0D0C0A0A0D0A0C0D0A0D0D0D0C0A0C0C0C0D0A 0C0D0A0D0D0A0D0C0C0C0D0C0D0D0C0D0C0A0D0C0D0C0C0A0A0D0A090D0C0C0A0D0C0A0A0C0D0D 0C0D0C0A0C0A0C0D0C0D0A0D0C0C0C0C0A0A0A0C0A0D0C0A0C0A0A0A0A0A0C0C0D0A0A0D0A0C0D 0D0A0C0A0A0D0A0D0D0C0A0C0A0A0D0A0A0C0D0D0C0C0C0C0D0A0A0A0A0C0D0D0A0C0D0A0C0D0D 0C0A0D0C0C0D0A0A0D0A0C0C0C0D0A0C0C0A0D0D0A0C0C0C0D0C0D0C0C0A0C0A0D0A0C0A0C0D0A 0D0A0C0D0D090D0C0C0D090D0C0D0A0C0C0D0C0A0D0C0C0C0D0C0A090D0A0A0D0C0D0D0D0A0C0C 0C0A0D0A0C0A0A0C0A0A0A0C0C0A0C0C0D0D0C0C0C0C0C0C0C0D0A0A0D0C0C0D0C0C0C0A0C0A0D 0C0D0D0A0C0D0D0D0C0C0A0D0D0A0D0D0A0C0C0A0C0D0D0D0C0D0C0D0D0A0C0D0C0A0A0A0D0A0C 0D0D0A0C0C0C0A0C0D0C0D0C0D0C0C0C0D0C0C0A0A0C0C0A0C0C0C0C0A0D0A0C0A0C0C0D0A0A0A 0D0D0C0C0D0A0A0A0A0C0C0A0C090A0A0A0F0C0A0D0C0C0C0D0C0D0D0C0C0D0A0C0C0C0D0C0A0D 0D0A0C0C0C0A0C0D0D0C0C0A0C0D0C0A0C0A0C0C0C0D0C0C0C0C0D0C0D0A0C0A0D0A0D0D0D0D0A 0C0D0D0C0D0C0D0A0C0D0C0C0D0A0A0D0C0A0C0C0A0A0D0C0A0C0C0A0A0C0D0D0D0A0C0C0A0C0C 0A0D0A0A0D0C0C0D0C0A0C090D0D0C0D0D0A0A0C0D0C0D0D0A0C0C0A0A0C0A0D0D0A0C0C0A0D0C 0A0C0C0C0A0A0D0C0C0A0D0C0A0C0D0A0A0D0C0C0A0A0C0C0D0A0C0C0C0D0A0C0D0D0C0C0A0D0C 0C0A0A0D0D0D0D0D0C0D0D0C0D0F0D0C0C0A0D0A0D0C0C0C0D0D0C0C0C0C0A0D0A0A0C0A0C0C0C 0A0C0C0C0C0D0A0C0A0D0D0C0F0A0D0D0C0D0C0D0A0D0C0C0A0D0C0D0D0D0C0C0C0C0D0F0C0A0D 0A0A0C0A0F0C1415142F2D2ECFCDCAFEFCF7F5F2EEF6F3EFF6F3EFF5F2EEF9F6F2FAF7F3A3A19F 6E6D6C64636242424225252421212121212121222122222229282929292B222527151719474647 6B6D6E5D6163505455000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 0000000000000000000000000000000000000000000000000000004A4A4B797A7D797A7C7E7F80 8686875E5D5E18191A2123231919191D1C1D1D1D1D1D1D1E1E1E1E1D1D1E2424244D4D4C747272 868582D3D0CEFFFCF8F5F2EEF6F3EFF6F3EFF6F3EFF7F4F0F8F7F57775750D0D0F121210090707 0D0A0A0C0C0A0A0A0A0A0A0C0A0A0A0C0A0A0C0C0C0C0A0A0C0A0A0A0C090D0C0A0C0C0A0A0A0A 0C0C0A0A0A0C0A0C0A0A0C0A0A0C0A0A0C0C0A0D0C0C0D0A0A0A0C0A0A0D0C0C0A0D0D0A0A0A0D 0A0A0C0A0A0D0D0C0C0C0C0C0A0C0A0A0A0A0D0C0A0D0C0A0C0C0D0A0C0A0A0C0A0C0A0C0A0C0C 0C0A0A0D0A0A0D0A0D0A0A0C0A0A0A0D0C0A0C0A0A0A0D0C0A0C0C0C0A0A0C0A0C0A0A0C0A0D0A 0C0D0A0A0A0A0A0C0A0C0C0D0C0A0A0A0A0D0A0A0C0A0C0D0D0D0C0A0A0A0A0A0A0A0C0C0A0A0C 0C0D0D0C0A0C0A0A0C0C0D0A0A0C0A0C0A0A0A0A0C0C0C0A0C0D0C0C0A0A0A0C0A0A0A0C0A0D0C 0A0A0A0A0C0A0A0A0C0A0C0C0D0D0A0C0A0A0C0C0A0A0A0A0C0C0A0C0C0D0D0D0C0C0C0A0A0A0A 0C0A0C0D0C0C0D0C0C0D0A0A0C0D0D0D0D0C0A0C0A0C0C0A0C0A0C0C0C0A0A0A0C0C0A0A0D0C0A 0C0C0C0C0C0D0C0A0C0A0D0C0A0C0D0A0A0A0C0C0A0D0C0C0A0A0A0C0A0D0C0A0A0A0A0C0C0A0C 0D0D0C0C0C0C0D0C0A0C0C0A0C0A0C0D0C0A0C0A0C0A090A0D0D0C0D0A0C0C0A0C0A0C0A0C0C0A 0C0D0C0A0C0D0C0A0A0C0A0A0C0A0A0D0C0A0C0A0A0C0C0A0A0A0A0A0A0D0A0C0D0D0C0C0D0A0C 0A0A0C0C0D0A0A0A0C0C0A0C0C0C0C0C0A0D0D0D0D0D0C0C0A0A0A0C0C0A090C0D0A0A0C0D0A0D 0C0C0C0A0C0C0A0A0C0D0C0C0D0C0A0A0C0A0A0D0C0A0D0A0C0D0A0A0A0A0D0C0A0C0C0C0D0C0A 0C0C0A0A0A0D0A0A0C0D0A0C0D0C0C0A0D0A0C0D0C0C0C0C0A0A0C0D0C0C0C0A0A0D0A0D0C0C0C 0A0A0A0A0A0C0C0C0C0C0A0D0D0A0C0D0A0C0A0D0C0C0D0A0A0A0C0C0C0A0C0D0D0A0A0D0D0A0D 0D0C0C0C0C0C0C0D0D0C0A0C0C0A0C0D0C0D0C0C0D0C0D0A0D0A0A0A0C0C0D0A0C0A0C0C0C0C0C 0D0C0C0C0C0C0C0A0D0A0C0C0C0A0A0C0C0A0C0D0D0C0C0D0D0C0C0D0D0D0C0A0A0D0A0A0D0C0A 0A0D0A0C0D0C0C0A0A0C0C0C0D0A0D0D0A0C0A0C0D0D0A0A0D0C0A0A0D0D0A0A0C0D0A0D0C0C0C 0D0A0D0A0D0C0D0A0C0C0A0A0A0C0A0C0C0D0C0D0C0A0C0A0A0A0D0C0C0A0C0C0A0C0A0C0C0C0C 0C0C0C0A0C0A0A0C0A0A0A0C0C0D0C0D0D0C0C0A0C0A0C0D0A0A0C0A0A0D0C0A0A0C0C0A0A0C0C 0D0D0C0C0D0A0C0D0C0D0C0D0C0A0D0C0C0A0D0D0C0A0A0A0C0A0D0C0C0C0C0C0D0A0D0C0A0D0C 0C0C0C0A0D0A0A0D0C0D0C0D0D0C0A0C0C0D0A0D0D0A0A0D0A0D0D0A0D0C0C0D0C0C0D0C0C0C0D 0D0D0C0D0C0A0A0D0C0A0C0D0D0A0D0D0D0A0A0C0C0D0D0D0C0D0C0A0C0A0C0D0C0A0C0C0A0C0A 0C0C0A0C0D0A0D0D0D0D0A0D0D0A0C0A0A0C0C0D0C0C0A0D0D0A0C0C0D0D0D0D0D0D0D0C0C0A09 0F0F0D151514464745E8E8E5F9F7F4F5F2EEF6F3EFF6F3EFF4F1EDFEFDF8E1DFDB8482816C6B6A 60605F4141402424242020202122212121212323222728292124251A1D1F23252566696A606465 5E61621E2020000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 00000000000000000000000000000000000006060668686B7A7A7D7B7B7D818183848485383738 1B1B1D1B1C1C1A1A191D1C1C1D1C1C1D1D1D1C1D1D2222224A4A4772716F7C7B79AEACA9FBF9F4 F8F5F1F5F2EEF6F3EFF6F3EFF3F0EDFFFFFCAEACAB15151415131407070A0C0A0C0A0A0A0A0A0A 0A0A0C0A0A0A0C0C0A0A0A0A0A0A0A0A0A0C0A0C0D0A0C0A0A0A0C0A0A0A0A0A0D090A0A0A0C0A 0D0A0C0D0A0C0A0A0A0A0C0A0A0C0C0A0A0C0A0A0A0A0A0A0A0D0A0A0A0C0A0C0C0D0A0A0A0A0A 0A0A0A0A0A0A0D0C0A0A0C0A0C0A0C0A0C090A0A0A0A0A0C0A0C0C0C0A0C0A0A0A0A0C0A0A0C0C 0A0A0C0A0D0D0A0A0C0C0A0A0A0A0A0A0C0A0A0C0A0C0A0D0C0A0A0C0D0A0D0D0A0A0A0C0A0C0C 0A0C0A0C0A0A0D0A0C0C0A0A0D0A0A0D0C0A0A0D0C0C0C0D0A0A0A0C0A0A0C0A0C0A0D0C0A0C0C 0C0A0C0D0C0C0A0A0A0C0A0A0A0C0C0C0C0D0C0C0A0A090A090A0C0A0C0D0C0C0C0A0A0C0A0A0A 0D0A0A0D0A0C0C0A0A0C0C0C0A0D0C0A0A0A0C0A0D0C090D0D0A0A0A0A0D0C0A0D0C0D0D0C0C0A 0A0D0A0D0C0A0D0D0A0C0A0A0D0C0A0C0C0A0A0C0C0A0A0C0D0A0A0D0A0D0C0A0D0A0A0D0A0D0C 0D0A0C0A0C0A0C0C0C0A0C0C0A0A0C0C0C0A0A0A090A0C0C0A0A0D0A0D0A0A0D0A0A0C0A0C0A0A 0D0A0A0C0C0A0A0D0A0C0A0A0A0A0D0A0A0A0A0A0C0A0C0C0C0A0A0D0C0A0C0D0A0C0C0D0C0C0D 0A0D0A0C0C0C0D0A0C0C0A0D0A0D0A0A0D0A0A0C0A0C0A0C0A0A0A0D0D0A0C0C0C0C0A0A0C0D0A 0D0D0A0D0C0C0C0A0D0D0D0C0A0D0C0A0C0D0A0A0C0A0A0C0A0A0A0A0A0A0C0A0A0A0C0C0A0D0C 0C0A0A0C0A0C0C0A0C0C0A0C0C0C0C0D0C0A0C0A0A0C0A0A0C0C0A0C0D0A0C0A0A0A0C0C0A0A0C 0D0C0C0D090A0C0A090A0C0C0A0A0A0C0D0A0A0D0A0D0D0A0C0D090D0D0A0C0D0D0D0C0D0A0A0D 0A0C0D0D0D0C0D0A0C0A0C0A0C0D0A0C0D0A0A0D0A0A0C0C0A0A0C0C0A0D0A0A0A0C0C0A0C0A0A 0A0C0A0A0C0A0A0A0A0A0C0C0C0A0A0D0C0A0D0D0A0C0C0C0C0A0D0A0C0C0A0D0A0C0D0D0A0A0D 0A0A0C0C0A0D0C0A0A0A0A0C0C0A0A0A0D0C0C0D0D0D0A0D0A0A0A0A0C0A0C0D0A0A0C0C0C0C0D 0A0C0D0C0A0C0D0C0C0C0A0C0C0A0A0A0D0A0C0D0C0C0D0D0C0C0A0C0C0A0A0C0C0D0A0C0A0C0C 0D0C0A0C0C0C0A0C0A0C0C0D0A0C0C0C0C0D0C0A0A0A0C0A0D0A0D0C0A0C0D0A0D0C0C0C090C0A 0C0C0A0C0A0A0A0A0C0C0C0A0C0A0A0D0D0A0C0D0A0D0C0C0D0C0C0C0C0C0C0C0C0C0D0C0A0C0A 0C0C0A0A0C0C0C0A0C0D0D090C0D0A0A0A0A0A0C0D0C0C0D0C0C0D0D0D0D0A0C0C0D0C0A0A0C0C 0A0C0A0D0A0C0C0A0C0C0A0D0C0C0D0C0A0A0A0C0C0C0D0C0D0C0D0D0A0D0C0A0C0C0C0C0C0A0C 0C0C0D0C0A0A0A0A0A0C0C0C0C0D0A0C0C0D0A0C0C0C0A0A0C0C0D0A0A0A0A0A0A0C0D0C0C0C0C 0A0D0C0C0C0C0A0C0C0A0A0D0D0C0A0C0C0A0C0D0D0D0C0A0D0A0C0C0A0A0D0D0C090909131314 121213706F6DFBFBFAF5F2EEF5F2EEF6F3EFF5F2EEF5F2EEFFFEFAB8B5B27371716968675C5B5B 3C3C3B2221222021202121212120202324242223251F212416181B525352686B6A5E6363484B4B 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000272729787A7D79797C7C7B7E8383856F6F711C1D1D1E1F1F171818 1C1B1C1D1B1C1D1E1E1C1C1D1F20204242416C6B697A78778D8B89E2DFDBFFFDF8F4F1EDF6F3EF F6F3EFF5F2EEF9F7F4E2E3E13535351312120A0A0A0A0A0C0A0A0A0A0C0A0A0A0A0A0A0A0A0A0C 0C0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0C0C0A0A0A0A0C0A0C0A0C0A0A0C0A0A 0A0A0C0D0C0A0D0A0A0A0A0A0C0A0A0A0A0A0A0A0C0D0A0C0A0A0C0C0A0A0C0A0A0A0A0A0C0C0A 0A0A0A0A0A0A0C0C0A0A0C0A0A0A0A0A0A0A0C0A0D0A0A0A0C0C0A0A0A0A0A0C0C0A0C0C0C0A0A 0A0A0A0A0C0C0A0A0C0A0A0C0A0A0A0A0A0D0D0C0A0C0A0A0C0A0A0C0A0A0A0C0A0C0A0C0C0A0A 0A0A0A0A0C0A0C0A0A0A0C0A0A0A0A0A0C0C0A0C0D0A0A0A0D0A0C0A0C0C0A0A0C0C0A0C0C090A 0A0A0A0A0C0C0A0A0A0A0A0A0A090A0A0C090A0A0D0C0C0A0A0A0A0A0A0A0C0C0C0D0A0A0D0C0C 0A0A0A0A0C0C0A0A0C0A0A0A0D0A0A0A0A0A0C0A0A0A0A0A0A0D0A0A0C0A0A0C0C0A0C0C0A0A0A 0A0C0A0A0C0A0C0C090C0C0C0A0A0A0A0C0C0D0A0A0A0C0A0C0C0A0A0C0A0A0A0A0D0A0C0C0D0C 0D0A0A0C0A0C0C0D0D0A0C0C0A0C0A0A0C0A0A0C0C0A0D0A0A0A0A0A0C0A0D0D0A0A0A0A0D0A0A 0C0A0C0C0C0C0A0A0C0C0A0D0C0C0A0D0C0A0A0A0A0C0C0C0C0A0A0A0C0C0C0C0C0A0C0D0A0C0C 0A0C0A0A0C0C0A0A0A0C0A0A0D0A0A0C0A0A0A0C0C0C0C0A0A0A0A0C0C0C0A0A0C0C0A0C0C0C0A 0A0D0A0A0D0A0C0C0C0A0C0A0C0A0C0A0C0A0C0A0C0A0A0A0A0A0A0A0A0A0D0A0C0C0A0A0C0A0A 0A0A0C0C0C0D0C0C0C0D0D0A0C0D0A0C0D0C0C0C0C0A0A090A0A0D0A0A0C0C0A0C0C0A0C0C0A0A 0A0D0C0A0A0D0D0D0C0C0A0C0A0A0A0C0D0C0A0D0C0C0A0C0A0A0A0A0A0C0D0C0C0C0A0A0C0A0C 0A0D0A0A0C0C0C0C0A0A0A0C0A0C0A0A0C0C0C0A0A0C0C0A0C0A0A0A0C0C0C0A0C0A0A0C0A0D0A 0A0C0A0C0A0C0C0A0D0C0A0C0A0A0A0C0A0A0C0A0A0C0C0A0A0C0A0A0C0A0C0C0C0A0A0A0C0A0A 0D0A0A0A0D0C0D0C0A0C0C0D0D0D0C0D0A0C0A0A0C0C0A0C0C0A0D0A0C0A0A0A0A0A0A0D0A0C0D 0D0A0A0A0C0A0A0A0C0D0C0A0C0A0D0C0A0C0D0C0A0D0C0A0C0D0A0C0D0A0A0A0A0C0A0A0C0A0A 0A0D0A0A0A0A0A0A0A0C0C0A0D0A0C0A0A0D0A0A0C0A0C0C0A0A0D0D0C0A0C0C0C0C0A0D0D0C0A 0C0A0A0A0A0D0A0A0C0C0C0A0C0C0A0C0D0A0A0C0C0A0D0A0C0A0C0A0A0C0C0A0C0C0A0C0C0A0A 0C0C0A0A0A0C0C0A0A0C0A0A0C0A0C0A0A0C0A0C0C0C0C0D0C0C0A0C0A0A0D0A0D0D0A0A0A0C0C 0A0A0A0A0C0C0C0D0C0A0D0A0C0D0A0C0C0C0C0A0C0D0C0C0A0C0A0A0C0C0D0A0D0A0A0D0D0A0D 0D0C0A0A0C0C0D0A0A0A0A0A0A0D0D0A0C0A0A0A0C0A0A0D0A0A0C0C0A0C0D0A0C0A0C0C0A0C0C 0A0C0A0A0C0C0A0A0A0A0C0A0C0C0A0A0C0A0C0C0C0C0C0D0C0C0C0D0F0D090706171516181918 ABA9A6FFFFFFF2EFECF6F3EFF6F3EFF5F2EEFCF9F5EDEBE68D8B886E6E6C656462565555363535 1F2020202121212121202120212222202225181A1D3433336D6D6C5F62625B5E60060606000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 0000000000005151547E808378787B7C7C808585884C4C4D1718161C1C1C1919191C1B1C1D1D1E 1C1D1D1C1C1C3939396362607775747F7D7CB4B1AFFEFBF8F6F3F0F5F2EEF6F3EFF6F3EFF3F0EB FFFFFF7A7B7910100F10100F0607070A090A0A0C0A0A0A0A0A0A0A0A0A0A0A0A0A090A0C0A090A 0A0A0A0A090A0A0A0A0C0A0A0C0A0A0A0A0A0A0A090C0A0A0C0A0A0A0C0A0A0C0A0C0A0A0C0A0C 0C0A0A0A0C0A0A0A0A0A0A0A0A0A0C0A0A0A0C0A0A0A0A0C0C0A0A0A0A0A0A0C0A0A0C0A0C0A0A 0A0A0A0A0C0C0A0C0C0C0C0A0C0C0C0C0A0A0A0A0A0A0C0C090A0A0A0A0A0A0A0C0A0A0A0A0C0C 0C0A0C0A0A0C0C0C0C0A0A0C0A0A0C0C0A0C0A0C0A0C0A0C0C0A0D0A0A0C0C0C0C0A0A0A0A0C0A 0C0C0A0A0A0A0A0A0C0C0A0A0A0A0C0A0A0A0A0A0A0C0A0A0C0A0A0A0D0C0C0A0A0A0A090C0A0A 0A0C0C0A0C0A0A0A0A0A0C0A0C0A0A0A0A0A0C0A0C0C0A0A0C0C0A0C0A0A0A0A0C0A0A0A0C0A0A 0A0A0C0C0A0A0A0A0C0A0A0A0A0A0C0A0A0A0A0C0A0C0A0A0C0A0A0A0A0A0A0A0A0A0A0A0C0C0C 0A0A0C0A0A0C0A0A0C0A0A0A090A0A0C0A0A0A0C0A0C0A0A0D0A090A0C0A0A0C0A0D0C0C0C0A0A 0A0A0A0A0A0A0A0C0A0C0A0C0C0C0C0A0C0A0C0A0C0A0C0A0A0A0C0A0A0C0A0A0C0A0C0A0A0C0A 0A0A0A0A0C0C0A0C0A0A0C0C0A0A0D0A090A0C0A0A0A0A0A0A0A0C0A0A0A0C0A0A090C0A090A0A 0C0A0C0C0A0A0C0C0A0A0A0A0A0A0C0A0A0A0C0A0A0D0C0A0C0C0D0A0A0C0A0A090A0C090A0D0A 0A0C0A0A0A090A0C0A0A0C0C0A0A0A0A0A0C0C0A0A0C0A0A0A0A0A0C0C0C0A0A0A0A0A0A0C0A0A 0D0A0C0C0D0A0A0C0A0C0C0A0D0D0A0A0A0A0A0C0D0A0A0C0A0A0A0A0A0A0A0A0C0A0C0C0A0C0A 0D0C0C0A0A0C0A0C0C0A0C0A0A0A0A0A0A0A0C090A0C0A0D0D0C0A0A090A0A090A0A0A0A0A0C0A 0A0C0A0C0A0C0C0A0C0A0A0A0A0C0A0A0A0A0A0C0A0A0C0C0D0A0A0A0A0A0D0A0A0C0A0A0D0A0A 0A0C0A0A0C0C0C0A0A0A0C0C0C0C0A0A0C0C0A0C0C0A0A0A0C0A090A0A0A0A0C0C0D0C0A0C0D0D 0C0C0A0D0A0A0C0A0C0C0A0C0C0A0C0A0A0C0C0A0A0C0D0A0A0C0C0C0C0C0A0C0A0A0A0A0A0A0A 0A0A0C0C0A0C0A0A0A0A0C0D0C0C0C0A0A0C0C0A0C0A0C0A0A0A0C0C0C0C0A0C0A0A0C0A0A0A0C 0A0C0C0C0A0A0A0A0A0C0C0C0A0A0A0A0A0C0A0A0A0C0C0C0C0A0A0A0A0A0A0A0C0C0A0C0C0C0C 0C0A0C0C090D0A0A0A0A0C0D0A0C0D0D0C0C0A0A0D0A0A0A0A0C0C0A0A0A0A0A0A0A0A0D0C0A0A 0A0A0A0A0A0C0C0A0A0A0A0A0C0A0A0A090A0A0A0A0C0A0A0D0A0A0C0C0C0A0C0A0C0A0A0A0D0A 0C0D0A0C0C0A0A0D0C0D0A0A0C0A0A0D0C0A0C0A0C0A0C0D0A0D0A0A0C0A0C0C0D0D0A0C0A0A0A 0C0A0C0A0C0A0A0C0A0A0C0A0D0C0A0C0C0C0A0C0C0A0A0C0C0A0A0A0A0A0C0A0D0A0C0A0C0D0C 0C0A0D0C0D0C0A0A0C0A0A0C0A0C0A0C0C0D0A0A0D0C0A0C0D0A0A090707171615363436E4E3E2 FAF9F7F3F0ECF6F3EFF6F3EFF4F1EDFFFEFABDBBB87474726B6A695F5E5E4D4D4C2C2C2D1E1E1F 2020211F20202020201F1F221C1E211C1C1E5D5E5F636766606463262828000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000090909 6F6E737D7D807776797E7E818180832D2D2D1A1A1A1818191B1B1B1C1C1D1C1D1E1B1B1B2D2D2E 5858566E6E6C7B7B798D8B8AE1DFDCFEFBF7F4F1EDF6F3EFF6F3EFF3F0ECFCFBFAD0CFCC242424 1414150607060C0C0C0A090C0A0A0A0A090A0A0A0A0A0A0C0A0A0C090A0C0A0A0A0A0C0A0A0A0A 0A0A0A0A0A0A0A0C0A0A0A0A0A0A0A0A0A0A0C0A0A0A0C0A0A0A0C0A0A0A0A0A0C0A0C0A0A0C0A 0A0A0A0A0A0A0A0C0A090A0A0A0C0A0C0A0C0A0A0A0A0A0C0A0A0A0C0C0A0A0A090C0A0A0C0A0D 0A0A0A0A0C0C0A0A0A0C0A0A0C0C0A0A0A0A090A0A0A0A0A0A0C0A09090A0A0A0C0A0A090A0A0A 0A0A0A0A0A0A0A0A0A0A0A0A0A0C0C0A0A0A0A090D0A0C0C0A0A0A0A0A0A0A0A0C0A0C0A0A0A0A 0C0A0A0A0A0A090A0A09090C0A0A0A0A0A090C0A0A0C0A0A0A0A0A0C0A0A0A0C0C0A0C0A0A0A0A 0A0A0A0C0A0A0A0A0A0C0C0A0C0A0A0A0A0A0A0C0A0A0A0A0A0C0A0A0A0C0C0A0A0A0A0C0C0A0A 0A0A0C0A090A0A0A0A0C0A0C0A0A0A0A0C0A0A0A0C0A0C0A0A0A0A0A0A0C0A0C0A0A0A0C0C0A0A 0A0C0A0A0C0A0C0A0C0C0A0A090C0A0C0C0A0D0A0A0A0A0A0A0A0A0A0C0C0A0C0C0A0A0A0C0C0A 0A0C0A0A0C0C0A0C0A0C0A0C0A0A0C0C0A0C0C0A0A0A0A0D0A0A0D0A0C0A0A0A0A0A0D0A0C0C0A 090A0A0A0C0A0A0A0D0A0A0A0A0C0A0A0A0C0A0A0C0C0A0C0A090C0A0A0C090A0A0C0A0C0C0A0A 0A0A0A0A0A0A0A0A0A0A0C0A0A0A0A0A0A0A0A0A0C090A0C0A0A0A0A0A090C0A0C0A0A0C0C0C0A 0C0A0A0A0A0A0A0A0A0A0C0A0A0C0A0C0A0A0A0A0A0A0A0A0C0C0A0A0C0A0C0A0C0A0A0A0A0A0A 0C0A0A0A0A0A0C0A0C0C0C0C0A0A0C0A0C0A0A0A0A0A0A0A0A0A0C0C0A0C0C0A0A0A0A0A0A0C0A 090C0A0A0A0C0C0A0A0A0C0A0A0C0C0C0A0C0C0C0C0C0A0A0A0A0A0A0A0C0A0C090C0A0A0A0C0A 0C0A0A0A0A0A0A0A090A0C0A0C0C0A0A0A0A0C0A0C0C0A0C0A0A0A0A0A0A0C0A0A0C0A0A0A0C0A 0A0C0A0C0C0A0A0A0A0C0C0D0A0C0A080C0C0A0A0A0C0A0A0A0C0A0C0C0A0C0A0C0A0D0A0A0A0A 0A0A0C0A0C0A0C0C0A0A0A0A080C0A0A0C0A0A0C0A0A0A0A0A0A0A0A0A0C0A0A0C0A0A0A0C0A09 0A0C0A0A0A0C0A0A0C0A0A0A0A0A0A0C0A0D0A0D0A0A0C0A0A0A0C0A0C0A0A0C0A0A0A0A0A0C0A 0A0C0C0A0C0A0C0C0A0A0A0A0C0D0A0A0D0C0A0A0C0C0A0C0A0A0C0A0A0A0C0A0A0A0A0A0D0A0C 0A0C0C0A0C0D0C0A0D0D0A0C0C0A0C0A0A0C0A0A0A0C0D090C0A090A0C0A0C0C0A0A0C0A0A0C0C 0C0C0A0C0C0A0C0A0A0A090A0C0A0A0C0A0C0C0C0A0A0D090C0A0A0A0A0A0A0A0C0A0A0A0C0A0A 0C0C0A0C0A0C0A0A0A0C0A0A0D0A0A0C0A0A0C0C090C0C0A0D0A0C0A0A0C0A0A0A0A0C0A0C0C09 0A0A0A0C0A0A0A0C0A0A0A0A0A0C0A0C0D0A0A0A0C0C0A0A0A0A0A0A0A0A0C0C0A0C0A0D0C0A0C 0A0C0D0A0A0C0C0C0A0A0A0A0A0A0A0A0A0D0D0C0C0A0A0A0D0D0D171514767574FFFFFFF5F2EE F6F3EFF6F3EFF5F2EEFAF8F3EDEAE6898886706F6E6463615756564343422524261D1E1F1F1F21 1E1F201D1D1E1E1E22171819414342636665606464494B4B000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF0000000000000000000000000000000000000000000000000000001D1D207E7F80797B7D 78777A8382846C6B6D1C1C1B1B1B1B1818181D1C1C1E1E1F1C1C1C2424244B4B4A666664757472 7F7E7CAEACAAFCFAF5F6F3EFF6F3EFF6F3EFF6F3EFF5F2EDFFFFFE6566641514140A0A0A0A0A09 0A0A0A0A0A0A0C0A0A0A0A090A0A0A0A0A0A0A0A0A0A0A0A0A0A090C0A0A0C0C0A0A0A0A0A0C0A 090A0A0A090C0A0A0A090A0A0A0A0A0A0A0A0A0A0C0A0A0A090A090A0A090A0A0A0A0A0A0A0A0A 0D0A0A0A0A0C090C0A0A0C0A0A0A0C0A0A0A0A0A0A0A0A0A0A0A0A0C0A0A0C0A0A0A0A0A090A0A 0A0A0C0A0A0A0A0A0A0A0A0C0A0A0A0A0A0A0A0A090A0A0A090C0A0C0A090A0A090A0A0A0A0A0A 0C0C0A0C0A0A0A0A0A0A0C0A0A0A0A0A0A0A0A0A090A0A0A0A0A0C0A0A0A0A0A0A0A0A0A0A0C0C 0A0A0C090A0A0C0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0C0A0C0C0A0A0A0C0A0A090A0A0C0C0A 0A0A0A0C0A0A0A0A0C0C0C0C0C0A0A0A0A0C0A0A0C0C0A0A0A0D0A0A090C0A0A0C0C0A0A0A0909 0C090A0A0A0C0A0A0A0A0C0A0A0A0C0D0A0A0A0A0C0A0A0C0C0A0A0A0C0A0A0A0A0C0A0A0C0A0C 0D0A0C0A0C0A0A0A0A0C0A0A0C0A0A0A0A0A0A0A0C0A0A0A0A0A0A0A0A0C0A0C0C0A0C0A0A0C0C 0A0A0A0A0A0C0C0A0A0C0A0A0C0C0A0C0A0A0A0A0D0A0A0A0C0A0C0C0C0A0A0A0A0A0A0C0A0A0A 0A0A0A0A0C0A090A0A0A0A0A0A0A0A0A0C0C0A0A0A0C0A0A0A0A0A0A0C0A0A090A0A0C0C0A0A0A 0A0A0A0C0A0A0A0C0A0A0C0D0A0A0A0C0A0A0A0A0A0C0D0A0A0D0C0A0A0C0A0A0A0A0A0C0A0A0C 0C0A0A0A0C0A0A0A0A0A0D0A0A0C0A0A0A0A0A0A0C0A0D0C0A0D0C0A0A0A0A0C0C0A0A0A0A0A0A 0A0A0C0A0A0A0C0A0A0D0C0C0C0A0C0A0A0C0C0A0A0C0A0C0C0A0A0C0A0A0C0A090A0A0A0C0A0C 0D0A0A0A0A0A0A0A0A0A0A0A0A0A0A090A0A0C090C0C0A0A0C0A0A0C0A0A0A0A0C0C0A0A0A0C0C 0A0C0C0C0C0A0C0C0C0A0A0A0C0A0A0A0A0A0A0A0A0C0A0A0A0A0A0A0A0C0A0A0C0A0A0A0D0A0A 0A0A0A0C0A0C0C0A0C090C0A0A0C0C0C0A0A0C0A0A0A0A0A0A07090C0C0C0C0C0C0A0A0A0A0A0A 0A0A0A0A0A0A0A0A0A0A0A090A0A0A0C0C0C0C0A0C0A0C0C0A0C0A0A0A0A0A0C0A0A0A0A0A0A0A 0C0A0A0C0A0A0C0C0A0A0C0C0C0C0A0A0A0A0A090C0A0A0A0A0A0A090C0C0A0D0A0A0D0C0A0A0A 0C0A0A0C0C0A0A0C0A0A0D0A0A0C0A0A0A0C0A0A0A0A0C0A0A0A0A0A090A0C0A0A0C0A0C0A0C0A 0A090C0A0A0A0A0A0A0A0A0C0C0A0A0C0A0A0C0A0C0A0C0A0A0A0A0A0C0C0A0C0A0A0A0C0D0C09 0A0A090A0A0C0C0C0A0A0A0C0A0A0C0A0A090C0A0A0A0A0A0A0A0A0A0A0C0A0D0A0C0C0A0A0A0A 0A0A0A0A0A0A0C0C0A0C0A0A0A0A0C0A0C0A0C0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0C0C0D0A 0C0A0A0C0C0C0A0A0A0C0A0A0C0A0A0A0A0A0C0C0A0C0C0A0A0C0A0A0A0A0A0A0C0C0A0A0C0C0A 0A0A0C0A0A0A0D0A0A090C0C0A0C0A0C0D0C0A09071012102B2A29C8C7C4FFFEFDF2EFEBF6F3EF F6F3EFF4F1EDFFFCF8B5B3B07472716B6A695C5B5A504F4F3736362021211E1F201E1F201D1D1E 1D1D1F181A1B2D2D2E6365655E62625C5D5E060606000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 0000000000000000000000000000000000000000000000004646498283867677797A797B838386 4B4C4D161716191A1A1B1A1B1D1D1E1C1C1D1D1E1E3A3A395C5B5B6B6A687B7A77898886D8D6D3 FFFCF7F5F2EEF6F3EFF6F3EFF2EFEBFEFDFCC6C5C42424241012100706070C0A0A0A0A0A0A0A07 0A0A090A0A0A0A0A0A0A0A0A0C0A0C0A0A0A0A0A090A0A090A0A0A0A090A0A0A0A0A0A090A0A0A 0A0A0A0A0A0A0A0A0A070A0A0A0A0A0A0A0A0A0A0A0A0C0A0A0C0A0A0A0A0A0A0A0A0A090A0A0A 0A0A0A0A0A0C0A0A0A0A0A0A0C090A09090A0A0A0A0A0A0A090A0A0A0A0A0A0A0A0A0A0C0A0A0A 090A0A0A0A0A0C090A0A0A0A0A0A0A0A0A090A0A0D0A0A0A0A0A0A090A0A0A0A0A0A0A0A0A0A0A 0A0A0A0A0A0C090A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A090A0C090A0A0A0A0A0C0A0A0C0A0A 0A0C0A0A0C0A0A0A0A0A0A0A0A0A0A0A0A0A0C0A0A0C0A0A0A0A0A0A0A0C0A0A0C0A0A0A090A0A 0A0A0C0A0A0C0A0A0A0C0C0A0A0A0A0A0A090A0A0A090A090A0A0A0A0A0A0A0C0D0A0A0C090A0A 0A0A0A09090A0A0C0A0C0A0A0C0A0A0A0A0A0A0A0A0A0A0C0A090A0A0A0A0A0A0A0A0A0A0A0A0A 0C0C09090C0A0A0A0A0A0A0C0A0A0A0C0A0A0A0A0C0A0A0A0A0A0A0C0A0A0A090A090A0A0A0C09 0A0C0A0A0C0A0A0A0A0A0C0A090A0C0A0A090A0A0A0A0A0A0A0A0A0C0A0A0A0A0A090A0C0A0A0A 0A0A0A0A0A0C0A0A0A0A0A0A0A0D0A0A0A090A0A0A090A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A 0C0A0A0A0A0C0A0C0A0A0A0A0A0A0A0A0C0C0A0A0C0A0A0A090C0A0C0A0A0A090A0A090A0A0A0A 0A0A0A0A0C0A0A0A0A0A0A0A0A0A0A0C0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A090A0C0A090A0A 0A0A0A0A0A0A0A0A0A0A0C0A090A0A09090A0A0A0A0A0A0A0A0A0A0A0A0A0A0C0A0A0A0A0A0A0A 0A0A0A090A0A0A0A0A0A0A090D0A0A0C0A0A0A0A0A090A0A0A0A0C0C0A0C0A0A0A0A0A0C0A0A0A 0A0A0A0A0A0C0A0A0A0A0A0A0A0A0A0A0C0A0A0A0A0A0D0C0A0C0A0A0A0A0A0A0A0A0A0A0A0A0A 0C0A0A0A0A0A0A0A0A0A0A0A0A0A0C0A0A0A0A0A0A0A0A0A0A0C0A0A0A0A0C0A0A0A0A0A0A0A0A 0A0A0A0A0C0A090A0A0A0A0C0A0A0A0A0A090C0C0A0A0A0A090A0A0A0A0C0A0A0C0A0A0A0A0A0A 0A0A0A0A0D0A0A0A0A0A0A0A0C0A0A0D0A0A0A0A0A0A0C0C0A0C0A0C0C0A0A0C0A0A0A0A0A0A0C 0A0A0A0A0A0A0A0A0C0A0A0A0C0C0A0A0A0A0A0A090A0A0A0A0A0C0A0A0A0C0A0C0A0A0C0A0A0A 0A0A0C0C0A0A0A0A0A0A0A0C0C0A0C0A0A0A0A0A0A0A0A0A0A0A0C0A0A0A0A0D0A0C0C0A0C0A0A 0A0A0A0A0C0A090A0A0A0A0C0A0A0A0C0A0A0A0A0A0C0A0A0C0A0C0C0A0D0A0A0A0A0C0A0C0A0A 0A0D0D0C0A0C0A0A0A090A0A0A0C0A0A0C0C0A0A0A0C0A0A0A0A0C0A0A0C0C0C0A0D0D0A0A0A0A 0A0A0A0A0A0A0A0A090C0C090C0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0C0D0C0A0C0A 0A0A0A0A0D0A0C0C0A0A0A0C0C0A0C0A0A0A141514666565FEFDFAF8F6F1F5F2EEF6F3EFF4F1EE FBF8F4E1DFDB81807E706F6E62615F5554544746462B2C2C1E1F201F1F201E1E1F1B1B1C1B1B1D 1D1D20575959626464666869191919000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 0000000000000000000000000000000000005E5F6285868B7676787B7A7D7B7B7D323131171717 1818181B1B1B1D1C1C1B1B1C2B2B2B4E4E4D62616071706F7F7E7BA2A09EF6F3EFF7F4F0F6F3EF F6F3EFF5F2EEF5F3EEFFFFFF6B696A151516090A090A0C0A0A0A0A0A090A09090A0A0A090A0A09 0A0C0A0A0A0A0A0A0A0A0A0A0A0C0C0A0A0A0A09090A0A0A0A0A0A0A09090A0A090A090A0A0A0A 0A0C0A0A0C0A0A0A0C0C090A0A0A0A090A0A0A0A0A0A090A0A0A0A0A0A0A0A0A090A0A0A0A0A0C 0A0A0A0A090A0A09090A0A0A0A0A0A0A0A0C0A0909090A090A0A0A0A0A0A0A0A090A0A0A0A0A0A 0C0A0A0A0A090A0A0A0A09090A090A0A0A0A090A0A0A0A0A090A0A0A0A0A0A0A090A0A090A090A 0C090A0A0A0A0A0A0A0A0A0D0A0A0A0A0A0A090A0A0A090A0A0A0A0A090A0A090A090A090A090A 0A090A0A0A0A090A0A0A0A090A0A0A0A0A0A0A0C0A0A0A0A0A0A0A0A090A0A090A0A0A0A0A0A0A 0A0A0A0A0A0C0A0A0A0A0A090A0A090A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0C0A0A0A0A 0A0A0A0A0A0A0A0A0A0A0A090A09090A0A0A0A0A0D0A0A0A0A0A0A0A0A090A0A09090C0A0A0A09 0A0C0A0A0A0A0A0C0A090A0A0A0C0A0C0C0A0A0A0C0A0A0A0A0A090A090A0A0A0A0A0A0A0A0A0A 0A0A0A0A0A0A0A0A090A0A0A0A0A0A0A0A0A0C0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A 0A0A0A0A0A0A0A0A0A0A0A0A070A0A0A0A0A0A0A0A0C0C0A0A0C090A0A090A0A0C09090A07090A 0A0A0A0A0A0A0A0A0A0A0A0C0A0A0A0A090A0C0A0A0A0A0A0A0A0A0C0A09090A0A0A0A0A0A0A0A 0A0A0A0A0A0C0A0A0A0A0A0A0A0A0A0A0C090A0A0A0A0A0A090A0A09090A0A0A0A0A0A090A0A09 0A0A0A0A0A090A0A0A0A0A0A090A0A0A0A090A0A0A0A0A0A0A0A0A090A0A0A0A090A0C0A0A0A0A 0C0A0A0C0A0A090A0A0A0A09090C0A09090A0A090A0A0A0A0A0A0C0A0C0A0A0A0A0C0A0C0A0C0A 0A070A0A0A0A0A0A0A0A0A0A0C090A0A0A0A0A0A0A0A0D0A0C0C0A0A090A0A0A0A0A0A0A0A0A0A 0C0A0A0A0A0A0A0A0A0C0A0A0C0C0A0A0A0A0A0C0A0A0A0A0A0A090A0A0C0A0C0A0A0C0A0A0A0A 0A0A0A0A0A090A0A0A0A090A090A0A0C0A0A0A0A0A0A0A0A090A0A090A0A0C0A0A0A0A0A0C0A0A 0A090A090A0A0A0A0A0A0A0A0A09090A0A090A0A0A0A0A0A0A0A0A0A0A0C0A0A0A0A0A0A0A0A0A 0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0C0C0C0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A 090A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A090A0A0A0C0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A 0A0A0A0A090A0A0A0A0A0A0C0A0A0A0A0A0A0A090A0A0A0A0A0A0C0A0A0A0A090A0A0A0A0A0A0C 0A0A0A090A0A0A0A0A0A0A0A0A0A0A0C0A0A0C0A0A0A0A0A0C0A0A0A0A0A0A0A090A0A0A0A0A0A 0A0A0A0A0A0A0A0A090A0A0A0D0A0A0A0A0A090A0A0A0D0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A 0A0A0A0A0A0A0A0A0A0A0A0A0C0C0D2B2B2BC1C0BFFFFFFEF3F0EBF6F3EFF6F3EFF5F2EEF9F6F2 A1A09D72716F6867655958574F4E4E3B3A3A2323241F20201E201F1B1B1C1B1C1D18181A464646 636363676B6B3D3F3F000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 0000000000000000000A0A0A79797B8586897474767D7C7E6B6B6C20201F1719181919191B1B1B 1B1B1B2221213E3E3D585857666663797776838280C5C3C0FDFAF6F4F1EDF6F3EFF6F3EFF3F0EC FFFEFECFCFCD2F302F0D100D0907060A0A0A0A0A0A090A0A0A090A0A090A0A0A090A0A0A0A0A09 0A0A0A0A0A0A0A0A0A090A0C090A0A0A0A0A0A0A090A090A0A0A0A090A0A0A090A0A0A0A090A07 0A0A0A09090A0A0A090A0A0A090A0A0A0A0A0A0A0A0A0A0A0C0A090A090A0A0A090A0A0A0A0A0A 0A0A0A090A0A0A0A0A09090A0A0A0A0A0A0A0A0A0A090A0A0A0A0A0A0A0A0A090A0A0A0A0A0A0A 0A0A0A0A0A0A0A0A0A0A090A0A0A0A0C0A0A0A090A0A0A0A0A0A0A0A0A0A0A0A090A0A0A0A0A0A 0A0A0A0A0A0C0A0A0A0A0A090A0A0A0A0C0A0A0A0A0A0A0A0A0A0A090A0A0A0A0A0A0A0A0A0A0A 0A0A0A0A0A090A0A090A0A0A09090A0A090A090A0A0A0A0A0A0A0A0A0A090A0A0A0C0A0A0A0A0A 0A0A0C0A090A0A0A0A0A0A0A0A0A0A090A0A090A0A0A0A090A090A0A0A0A0A0A0A0A0A0A0A090A 0A0A0A0A0A0A0A0A0A0A090A0A0A0A0A0A0A0A0909090A0A0A0A0C09090A0A0A0A090A09090A09 0A0A0A0A0A0A0A0A0A0A0A090A0A0A0A0A0A0A0A0A09090A090A0A0A0A0A0A0A0A0A0A0A0A0A0A 0D0C0A0A0A0A0A090A0A09070A0A0A0A090C0A090A0A0A090A0A0A090A0A0A090A0A0A0A0A0A0A 0A0A0A0A09090A0A090A0A0A0A0A0A0A0A0A0A0A090A0A0A0A0A0A0A0A0A0A0A0A090A0A070906 0A0A0A0A0A0A0A090A0A0A0A0A0A0A0C0A090A0A0A0C0A090A0A0A0A0A0A0A0A0A0A0A0C0A0A0A 090A090A0A0A0C0A070A0A0A0A0A0A070A0A090A0A0C090A0A0A0A0A0A0A0A0A0A0A0A0A0C090C 0A0A0A0A0A0A0C0A0A090A0A0A0A0A0A0A0A090A0A0A0A0A0A0A0A0A0A0A0A090A0A0A0A0A0A0A 0A0A0A0A090A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0C0A0A0A0A0C0A090C0A0A0A 0A0A0A0A0A0A0A0A0A0A090A0A0A0A0A0A0A090A0C0A0C0A0A0A0C0A0A0A0A0A0A0A0A090A0A0A 0A0A0A0A0A0A0C0A0C0A0A0A0A0C090A0A0A0A0A0A090A0A0A0A0A0A0A0A0A0A0A0C0C0A0A0A0A 0A0A0A0A090A0A0A0A0A0A0A0A0A0C0A0A0C0A0A0A0A0A0A0A0A09090A0A0A0A0A0A0A0A0A0A0A 0A0A0A0A0A0A0A090A0A0A090A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0C0A0A0A0A0A0C0A0A0A0A0A 0A0A0A0A0A0A0A0A0A0A0A0C0A0A0C0A0A090A0A0A0A0A0A0A0A09090A0A090A0A0A0A0A0A0A0A 0A0A090A0C0A0A0C0A0A0A090A0A0A0C0A0C0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A 0A0A0C0C0A0A0A0C0A0C0A0C0A0A0A0A0A0A0A0A0A0A0A0A0C0D0A0A090A0A090A090A0A0A0A0A 0A0A0A0A0A0A0A090A0C0A0A0A0A0A0A0A0C0A0A0D0A0A0A0C0A0A0A0A0A0A090C0A0A0A0A0A0A 0A0A0A0A0A0C0C0A0A0C0A0C0A0A0C0A0A0A0A0C0A0C0A0A0C0A0A0A0A070A0A090A0A0C0A090A 0A0A0A0A0A0A0A0909131313737371FFFEFCF9F6F2F5F2EEF6F3EFF4F1EDFCF9F5C8C6C3777674 6D6C6B5D5C5B50514F4545452D2D2E1E1F201E1F201B1C1C1A1B1B171619343435626464646769 545657000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 0000001D1D1D8C8C8E7C7D7F7071737F80825656571718161919191A1A1A1C1B1C1C1B1C2F2F2E 4B4A4A5C5B5B6C6B697E7C7B908E8DE4E1DEFAF7F3F5F2EEF6F3EFF6F3EFF5F2EDFFFFFF878584 1817180A07090C0A090A0A0A090A0A0A0A0A0A0A090A0A09090A07070A090A090A0A090A0A0A0A 0A0A0A090A0A0A0A0A0A0A0A0A0909090A0A0A0A090A0A090A0A0A0909090A09090A090A0A0A09 0A090A090A090A090A090A0A09090A0A090A0A0A090A0A0A0A0A0A0A0A090A0A0A0A0A0A090A0A 0A090A090A090A0A0A090A0A0A0A0A0A0A090A0A0A0A0909090A0A0A0A0A09090A0A0A0A0A0A0A 0A0A0A0A090A0A090A09090A0A090A090909090A0A0A0A0A0A0A0A0A0A0A0A090A090A0A0A0A0A 0A0A0A0A0A0A090A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0C0A0A0A0A0A0A090A0A0A0A0A0A0A0A 0A0A0A0A0A090A0A0A090A0A090A0A0A0A0A0A0C0A0A0A0A090A0A0A0A0A0A0A0A070A0A090A0A 0A0A0A0A0A090A090A0A0A0C0A0A0A0A09090A0A0A0A090A0A0A0A0A0A0A0A0A0A090A0A0A0A09 0A090A0A0A0C0A0A090A0A090A090A0A0A0A0A0A0A0A0A0A0C0A0A090A0A0A090A0C0A0A0A0A0A 0A0A0A0A0A090A0A090A0A0A0A0909090A090A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A 090A0A090A0A0A0A0A0A0A090A0A0A0A0A0A090A0A0C090A0A0A0A0A0A0A090A0A0A0A0A090A0A 0A0A0A0A0A0A0A090A0C0A090A090A0A0A0A0A0A0A0C0A0A0A0A0A0A0A0A0A0A0A0A090A0A0A09 0A0A0A090A0A0A0A0A0A0A0A0A090A070A0A0C0A0C0A0A090A0A0A0A0A0A070A0A090A090A0A0A 090A0A0A0A0A0A0A0A090A0A0A0A0A090909090A0A090A0A0A0A0A0A0A0A0A0A0A090C0A0A0A0A 0A0A0A090A0A0A0A0C0A090A0A0A0A0A090A0A090A0A0A0A0A0A0A0A09090A0A0A0A0A0A0A0A0A 0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0C0A0A0A0C0A0A0A0A0A090A0C0A0A 0A0A0A0A0A0A0A0A0A090A0A0A0A090A0A0C09090A090A0A090A0A0A0A0A0A0A0A0A0A0A090A0A 0A0A0C0A0A0A0A0A0A0A0A0A0A0A0C0A0A0A0A0A0A0A090A0A0A090A09090A090A0A0A090A0A0A 0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0C0C0A0A0A0A0A0A0A0A0A0A090A0A090C0A0A0A0A0A 0A0A0A0A0A090A0A0A0A0A0A090A090A0A0A0A0A0A0A0A090A0C0A0C0A0A0A0A0C0A0A0A090A0A 090A0A0A090A0A0C0A0A0A090A0A0A0A0C0A090A0A090A0A090A0A0A0A0A090A0A090A0A0C0A0A 0C0C0A0C0A0A0A0A09090A0A0A0A0A0A0A0A0A0A0C0C0A0C0A0A0A0A0A0A0A0A0C0A0A0A0A0A0A 0C0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0C0A0C0A0A0A0A0C0A0A0A0A0C0A0A090A0A090C0A0A 0A0A0A0A0A0A0A090A0C0A0A0A0A0C090A0A0A0A0A090A0A0A0A0A0A0A0C090A0A0A090A0A0A0C 0C0A0A0A0A0A0A0A0A0C0A0A0A0A0A0A0A090C09090C0A0A0A0A0A0A0A0A07090A0A0A090C0A0A 0C0A090C0A073C3B39D4D4D4FFFFFEF3F0ECF6F3EFF5F2EEF9F6F2E9E6E2888785706F6D626260 5353524A4A4A3A39392223231D1E1E1C1E1E191A1B181718242525595C5B616565676A6B0B0B0B 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000003C3C3C 9595987676797374757C7D7F3F3F40151515191A1A1A1A1B1B1A1B2122223D3C3C53525160605F 737270807F7CA6A4A2F5F2EFF6F3EFF6F3EFF6F3EFF3F1ECFEFCF8EDEBE84948460F0D0D07070A 0A0A0A09090A0A0A09090A070A0A0A0909090A09070A090A0A090A0A0907090A090909090A090A 0A0A09090A0A090A0A0A0A0A0A0A0A0909090A0A090A0A0A0A0A0A0A0A09090A090A090A090A0A 09090A090A0A0A0A0A090A0A0A0A0A09090A090A0A090A0A0A0909090A09090A090A0A0A0A0A0A 0A0A0A0A0A0A0A0A0A0A090A090A0A090909090A09090A0A0A0A0A09090A0A0A070A070A0A0A0A 090A0A0A0A0A0A0A090A090A070A0A090A0A0A070A0A0A09090A0A0A0A0A0A0A0A0A090A090A07 0A09090A0A0C090909070A070A0A0A0A0A0A0A0A0A0A0A0A090A0A0A0A0A0A0A0A0A0A090A0A0A 0A0A0A0A090A0A09090A0A090A09090A090A0A0A0A0A0A0A090A0A070A0A0A0A090A0A070A0A09 0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A090A0A0A0A0A0A0A0A0A090A0A0A0A0A090C0A090A 0A0A0A0A0A0A0A0A090A0A070C0A0A0A0A0A0A0A0A0A0A0C0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A 0A0909090A0A090C0A0A0A0A090A0A0A0A0A0A0A0A0A0A0A0A0A09090A0A090A0A0A0A0A0A0A0A 0A0A0A0A0A0A0A0A0A0C0A0A0A0A0A0A0A0C0A0A0A0A0A09090A0A0A0A0A0A0A0A0A0A0A0A0A0A 0A0A0A0A090A0A0A090A0A0A0A0A0A0A0A0A0A0A0A0A0A090A0A0A0A0A0A0A090A0A0A0A0C0A0A 0A0A0C0A0A0A0A0A090A0A0A0A0A0A0A0A0A090A0A0A0A0A0A090C0A090C0C0A0A090A090A090A 0A090A0A0A0A0A0A0A090A0A070A0A0A09090A07090A090A0A0A0C090A0A090A0A090A0A0A090C 090A0C0C0A0A0A090A0A0A0C0A0A0C0A0A0A0A0A0A0A0A090A0A0A0A0A090A0A0A0A0A0A0A0A0A 0A0A0A0A0A0A0A0A0A090A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A090A0A090A0A0A0A0A0A090A0A 0A0A0A0A0A090A0A0A090A0A0A0A09090A090A0A0A0A090A0A0A0A0A0A090A0A0A0A0A0A0A090A 0A0A0A0A0A0A09090A0A0A0A0A0A0A09090A0A0A0A0A090A0A0A0A0A0A0A090A0A090A090A0A0A 0A090A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0C0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A090A 0A0A0A0A0A0A0A0A090A0A0A0A090A0A090A0A0A0C0A090A0A0A0C090A0C090A0A0A0A0A090A0A 0A090A0A0A0A0A0A0A0A09070A0A0A09090A090A0A0A090A0A070A0C0A0A0A0A0A0A090A0A0A0A 090A0A0A0A0A0A0A0A0A0A0A0A0C0A0A0A0A0A0A0A0C0A090A0C0A0A0A0A0A0A090A090A0A0A0A 0A0A0A0A0A090A0A0A090A0A0A0A090A0A070A0C0A0A0A0A0C0A090A0A0A0A0A090A09090A0A0A 0A0A0A0A0A0A0A0A0A0A090A0A0A0A0A0A0A09090A0A0A0A0A0A0A0A0A0A0C0A0A0A0A0A0A0A0A 0A09070A0A0A0A090A090C0A090C0A0A0A0A0A0A0A0A0A0A0A0A070A0A0A0A0A0A0A0A0A090909 1816179A9897FFFFFFF6F3EFF6F3EFF6F3EFF6F3EFF7F4F0A5A4A16F6E6D6968675857564C4C4B 4342412C2C2C1D1E1F1D1D1F1A1A1B18191A1B1B1C4C4E4D6164646E7072171717000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 0000000000000000000000000000000000000000000000000000000000005A5A5A949698727375 7677797475782B2C2C141515191A1A1A1A1A1C1B1B2D2D2D464545565654656564797877838280 C2BFBDFBF8F5F4F1EDF6F3EFF6F3EFF3F0EBFFFFFFB4B4B12423220707070909090A090A0A0909 090A09090A0A090909090A0909090A09090A070A0A0A0A090A0909090A0A0A0A0A0A0A0A09090A 090A090A0A0A0909090A0A0A0A0A090A0709070A09090A0A090A0A0A0909090A090A0A0A0A090A 0A0A0A0A0A0A0A0A0A0A09090A0A0A070909090A0A0A0A0A0A09090A090A09090A0A0A090A0A0A 0A090A0A090A0A0A090A0A09090A0A090A0A090A0A0A0A0A09090A0A0A090A0A0A090909090A0A 0A0A0A0A0909090A09090A0A090A0A0A09090A0A0A0A090A0A0A0A090A0A0A0A09090A0A0A090A 0A0909090A0A0A09090909090A0A0A0A090A090A0A0A0A0A090A0A070A0A09090A09090A0A0909 090A0A090A0909090A0A0A090A09090A0A0A090A090A090A0A0A0A0909090A090A090A0A0A0A0A 090A090A09090A070A0A090A0A0A0A0A090A0A0A0A0A0A0A0A09090A090A0A09090A0A0A0A0A0A 0A0A0A0A0A0A0A0A090A090A0A07090A0A090A0A0A0A0A0A0A09090A090A0A0A090A0A0909090A 090A0A0A090A09090A0A090A0A09090A0A0A0A09070A0A07090A0A0A0A0A0A090A090A0A090A0A 0A0A0A0A0909090A09090A090A0A0A090A0A0A0A090A0A0A090A0A0A0A0A090A090A0A0A0A0A0A 0A090A0A090A0A0A0A0A0A0A0A0A0A090A090A0A0A0A090A0A090A0A090A090A090A0A0A090A0A 0A0A0A0A0A0A0A0A0A090C090A0A0A0A0A090A0A0A0A0A090A0A090A0A0A0A09090A0A0A090909 0A070A0A0A09090A090A0A0A0A0A0A0A090A0C090A0A0A090A090C0A0A0A0A0A0A0A0A0A0A0A0A 0A09090A0A0A090A0A0A0A0A0A0A090A0A0A0A0A0A0A0A0A0A0A0A09090A0A0A0A070A0A0A0A0A 0A0A0A0A0A0A0A0A0A090A0A090A090A0A090A09090A0A090A0A0A0A0A0A0A0A0A0A0A0A0A090A 0A090A0A0A0A0A0A0A0A0A090A0A0A0A0A0A090A0A090A090A0A0A0A0A0A0A0A0A0A090A0C0A0A 0A0A0A090A09090A090A0A0A0A090A0A0A0A090A0909090C0A0A0A0A090A0A0A090A0A090C090A 0A0A0A0907090A0A0A0A0A0A09090A0A0A0A090A090A0A0A0A0A0A0A090A0A09090A0A0A090A0A 0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A090A0A0A0A0A0A0A0A0A0A0A0A0A0A090A0A0A090A 090A0A0A090A0A0A0A090A090A0A090A090A0A0A0A0A0A0C0A0A0A090A0A0A0C0A0A0A0A0A0A0A 0A0A0A0A0A0A09090A090A0A07090A0A0A0A0A090A0A0C0A0A0A090A0A0A0A0A0A0A0A0A0A0A0A 0A0A0A0A0A090A0A0A0A0A09090A0A0A090A090A0A0A0A0A090A0A090A0A0A090A090A090A0A0A 0A0A0A0A090A0A0A0A0A0A0A0A0A0A0A0A0A090A090A0A090A0A0709090A0A0A0A0A0A0A0A0A0A 09090A0A090A0A0A0A090A0A0A0A090A0A0A0A0A0A0A0A0A090A0A0A070A0A0A0A0906075E5C5C F3F2EEFDFBF7F5F2EEF6F3EFF5F2EEFBF8F4C7C4C27473716D6C6B5C5C5C4F4F4F454544353635 2122231D1D1E1B1B1C18191A1515163F3F405D6061717575383A38000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 0000000000000000000000000000000000000000000303037174759092947071727A7B7D6B6C6E 1E1E1F1516161819191919192020203737374B4A4B5A5A596C6B6A7D7C7B8A8987DCD9D6FAF7F3 F5F2EEF6F3EFF5F2EEF7F4F0FFFEFD7B7B77101010060607090A0A090A07090909090907090A09 0709090909070707090909070A070A0909090709090A090A090A090A090A0907090A07090A0A09 090A090909090A09090A0A09090A09090907090A09090A0A090A0A0A09090909070A09090A0A09 0A090A0A0A070A0A0A09090A0A090A0A090A090A09090A090A0909090A0909090A070A0A0A0A0A 0A0A0A0A0A0A090A090A090A090A0A090A0A09090A0A09090A0A0A0A07090A0909070A0A0A090A 09090A0A090A0A0A0A0A09090A09090A09090A09090A0A0A0A0A0A090A0A090A0A0909090A0A0C 09090909090A0A0A0909090A0A090A0A0A09090A090A0A0A0A0A0A0A0A09090A090909090A0A0A 090A090A090A0A0A0A07090A0A090A0A0A0A090A0A09090A090A0A09090A0A09090A0A0A090A09 0A0A0A0A090A0A090A0A0A0A0A0A0A0A090A0A0A0A0A0A090A0A0A0A090A0A090A090A0A09090A 09090909090A0A0A0A0A09090A0A090A0A0A0A0A090A0A090A0A0A0A0A0A0A09090A0A0A0A0A0A 090A0A090A0A0A0A0A0A0A09090A09090A0A0A0A0A0A0A09090A0A090A09090A090A0A0A09090A 09090A09090A0A0A090A09070A0909090A0A070A0A090A0A090A0A0A09090A070A0A090A09070A 0A09090A0A0A0A090A0A0A0A0A0A0A090A0A0A0A090A09090A0A090A0A0A0A090A0A090A090A0A 070A09090A070A0A0A0A0A0A090A0A0A0A090A0A090A0A090A0A090A0A090A0A070A0A0A0A0A0A 090A09090A0A0A0A0A0A090A0A0707090A0A090A0A0A0A0A0A0A0A0A0A0A0909090A090A0A090A 0A0A09090A0A0A090A0A0A0A0A090909090A0A090A090A0A09090A090A09090A0A090A0A0A0A09 0A090A0A090A0A0A090A0A09070A0A090A0A09090A0A0A0A0A0A0A0A09090A0A0A0A0A0A0A0A09 0909090A0A090A090A0A090A0A0A0A0A0A0A090A0A09090A09090A090A090A0A0A0A0A0A0A0A09 0A09090A0A0A0A0A0A09090A090A090A07090A090A0A090A090907090A0A0A0A0A0A0907090909 0A090A0A090A0A090A0A0A0A0A09090A0A090A0A090A09090A0A0A070A090A0A0A090A070A0A0A 0A090A0A0A0A0909090A090A0A0A0A0A0A09090A090A0A0A0A0A0A0A0A090A0A0A090A0A09090A 090A090A0A0A0A0A0A0907090A090A0A070A09090A0A0A0A0A0A0A0A090A0A0A0A090A09090A09 09070909090A09090A0A09090A0A0A09090A0A090A0A0A0A0A0A090A0A090A0A0A070A0A0A0C0A 0A0A0A0A0A0A0A090A090A0A090C0A0A09090A0A0A0A0A090A090A0A0A0A0A0A0A0A0A090A090A 0A09090A0A0A0909090A090A0A0A090C090A0A0A09090A0A0A090A090A0A0A090A0A090A0A090A 0A090A0A0A0A0A0A0A0A09090A0A0A0A0A0A0A0A0A090A0A0A0A090505062E2F2DCAC9C8FFFFFE F4F1EDF6F3EFF5F2EEFAF7F3E1DEDB81807D6E6D6C6260605252524747463C3C3C2728271D1D1D 1C1C1C181819141414303030575B5B6E7372545654000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 0000000000000000000000000000000A0A0A8687898B8B8D6F6F717E7F825C5C5E161617171818 1819191A1A1A2929293E3E3E4F4D4E605F5E7271707E7D7D9A9896EEEBE7F7F4F0F5F2EEF6F3EF F3F0ECFFFDFAEAE9E64A4A49060707090A090A0A090A0907090A0A0A090A0A090909070A090909 0A090A0709070A09070909090709090A090A0909090909090909090909090A07090A0909070907 070909090A070707070909090A0A090A0A090A09090A090A0909090909070909090A0709090A09 09090A07090A0909090909090A090A0A0909090A090A0A07090A0907090907090909070A0A0909 0A090A0A070A0707090907090A0A09090A0A090A09090A0A07070A090A09090A0A0A09090A0909 0A09090A090A0909090907090A0A09090A0A09090A0A090A070909090A0A09090A090A09070909 0A090A0A090A070A090909070A0A090A0A0A090A090A0A090A090A090A0A09090A090909090709 09090A0A0A09090A0909090909070A09070A0A09090A0A0A0A0A0A0A0A090A090A090A09090909 09090A090907090A0A0A0A0A0A0A0909090A0907070A070A0909090A0A0A0A0A0A090A0A090A09 0A090A0A09070A0A0A0A0A090A0A090A070A0A09090A090A0A070A09090909090A0A09090A0A09 09090A0A09070A0A0907090A09090A0A090A0A090A0A0A09070A0A09090A090A0A0A0A0A0A0A0A 0A090A0909070A0A0A09070A0A0A0A0A0A0A0A0A0A0A090A09090A090A090A0A0A0A0A090A090A 090A0A0A0A090A09090A0A09090909090A0A0A0A0A0A0A070A090A090A0C0A0A09090A0A0A0A0A 090A090A0A090A0A0909090A0A0A0A0A0A0A0A0A090A0A0A090909090A0A07090A0A090A0A0A0A 090A0A0A0A0A090A090A0A0A0909090A0A0A0A090A0909090A090A0A0A090A0A0A090A0A0A0A0A 0A0A0A0A0A0A090A090A09090C090A0A0A09090A0A0A09090A0A0A0A090A0A0A0A090909090A0A 0A0A0A0A0A0A070A0A090A0A0A0A0A0A0A0A0A0A090A070A0A0A090A0A0A0A0A070909090A0A09 09090909090909090A09090A0A0A0A0A0A0A09090A0A0A0A09090909090A0A0A0A090A090A0A07 0A0A0A0A0A0A090A0A090A09090A0A0A0A0A0A090A09070A0A0909070A070A0A070A0A0909090A 0A0A0A0A0A090A09090A0A0A0A09090A09090A090709090A090A0A0709090A09090A090A090A0A 090A0A090A0A0A0A0909090A090909090A0A090A090A0A070A0A0A0A0A0A090A0A0A0A0A0A0909 0A090A090A0A0A090A0A090A0A0A090A0A0A0A090A070A0A09090A090A0A090A090A0A0A0A0A0A 0A0A09090A090A0A0A09090A0A0A0A0A0A09090A0A0A090A0A0A0A0A0A0A09090A0A090A07090A 0A0A0A0A0A09090A0A0A090A0A0A0A0A0A090A0A090A0A090A0A090A0A0A0A09070A090A09090A 0A0A0A090A090A0A0A0A09090A09090A0A090A0A090A0A0A090A0A0A0A090A0A09090A0A090909 0A0A090A0A0A0A090A0A0A0A0A09090A0A090909090709091010109D9C99FFFFFDF6F4EFF6F3EF F6F3EFF8F5F1F1EEEA9694926E6D6C6765655656554949483F3F3F2E2E2E1E1E1E1C1B1C181919 1414142424245153546D70716A6B6B030303000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 0000000000000000001818189A9A9C838284706F727F7F824747471313131718181A191A1D1E1E 313131424241545352666564777675817F7DAFACAAF7F4F0F5F2EFF6F3EFF6F3EFF3F0ECFFFFFF C0C0BE292728060605090A090909090A0A07070909090A090909090709090A0707090907090A07 090909070909090A09090909090A090A07090A0A090A0A07090909070A0709090907090A0A0907 09070909070709090A090A09070A07090A0A0A090A09090909090709090A09090907090907090A 090709090A0A0A0A0909090A0A09090909090A090A09090A0709090A0909090909090A07090A09 0707090A090A090A0A0A0A0A0909090A09090909090A09090A090A090A0A090909090909090909 0A0A0A090A070A0A090909090A090A090A090A0A0909090A090A0A0A0A090709090907090A0A0A 0907090909070A0A090A090909090A090907090A070909090A0A090A0A0A090709070909090A09 0A0A0A0907070A0A0909070A0A070A0A0909090909070A0A090A090A090A0A0A0A090A090A0909 0A0909090A09070A0A070A090A07070A09090A09090A090909090907090909090A090A09090A07 09090909090A09090A09070709070A0909090A090A090A0A090A090909090A09090A09090A0709 0A070A070909090A09070A0709090909090A070A090A0A0A0A090A0A09090A09090A0A0A0A0A09 0709090A09090A09090909090A0909090A0A070A0909090A0A09090A090A09070909090A09070A 090909090A0A090709090A0A0909070907070A0A0909090A0A090A0A0A090909090A090A09090A 0A090A0A0A090A090A09090A090A0A090A090A09090A0A0A090909090A0A0A09090A070909090A 0A090A0909090A070A090A0909090A0A0A09090A090A0A0A0A09090A0A090A0A0909090A0A090A 090A070A090A0A090A0A0909090909090A070A0709090A0A090909090A0A090A0A09090A0A0909 0A090909090A09090A0A090909090A09090A0A090A0A09090909090A0A0A0909090A0A0A090A07 0A090A0A0A0A090909090909070A0A090A0A090A0A090A07090A0909090A0909070909090A0A09 090A0909090A090A09090A09090A090A0909090A0A090A090A090909090A0A0A0A09090A0A090A 0909090A0A090909090909070A0A070A0A0A0A090907090A090A0909090A0A0A090A0A090A0A09 0A0A0A0A09090A0A0A0A09090909070909090907070A09090A070A090909090A0A090A0A0A0A09 0A0A090A0A090909090A0A090A0A09070A09090A0909090A0A090A090A09090A090A090A0A0A0A 090A0A090A0A0A0A0A0A0A0A0A090A0A090A09090A0A090A090A0907090A090A0A0A090A0A0A0A 090A0A09090A0A090A090A0A09090A0A0A0A0A070A0A0A090A0A070A0A0A0A090A090A090A0A07 0A090A0A0A0A0A0A0A0A0A0909090A0A0A090A0A0A090A0A09090A09090A0A0A0A090A09090709 0A0909090A0A07090A0A0A070A0A070C0A0A0605066D6C6AF7F6F3FAF8F4F5F2EDF6F3EFF6F3EF F9F6F2AFADAB706F6D6A6A695B5A5A4D4D4C4140413636362222231B1B1C1919191414151C1D1D 484B4C65696A7577760B0808000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 0000002F2F31A1A1A37B7C7D7172747C7D7F363637121212171717191919232424373737454544 5959586A6A697C7B79838280C4C1BFFBF8F4F6F3EFF6F3EFF5F2EEF6F3EFFFFFFF969492131212 06060607090709070709090909070A090907070909090A07090909090907090A09090907090A0A 090A09070707070A07070909090A070A090909070709090907090A090709090A0A090A0A090709 0A0A09090707070909070A09090909090907070907090707090A07070709090709070909090909 09090907090909070A090A090A0909090A0A0A0A09090A09070907070A07090A0A090909090A09 09070A090707090709090A0A0A070909090A07090907090A090A09090A090A090A090909090A07 070909090A07090707090907090A0A0A090A09090909070A09070909090A090A090A0907090909 0A0A0909090909090907090A0A0909090A0A0A090909090907090A0907070A09070909090A0909 090A07090A09090709090A090A09070709070A0A09090A090909090A0A0A09090909090A0A0909 0909090909090909090907090A090A09090A0707070909090A090909090909090A090909070909 0709090909070A07090A090A090A09070909090907090A0A090709090A070A090A0909090A0907 090909070909090A0A090A09090A090909070A0A0907090909070A090909090A09090709090A0A 09090A0A0A0709090909090907090A090A090909090909090909070A0A090907070A0A0A090A0A 0A09090A07090A0A090909090909090909090909090909070A090909090A09070909090A090A09 0709090909090A09090909090907090A09090A0A090A090A090A090A0909090A0A0A09090A0907 0A070A090909070A0909090A0909090909070A07090909090A090909070A0709090A0909070A09 09090A0A0A0A0A090909090909070A09090907090909070909090A0907090A0709090709070709 09090A0909090A0A090A0909090909090A09090A0909090907070A090A0A0A0A07090A0909090A 090A0A0A09090A0A09090909090A0A0A090A0A090A0A0A0A090909090A090909090909090A0A09 09090709090909090A09090907090A0A090909090909090909090A09090A090909070909090909 090A070909090A09090A0909090909090A0707090909090A0909090907070909090A090A090909 0A0909090A09090A090A09090A09090909090909090909090A0A090909090A09090909090A0909 0A0A090A0909090A0A0909070909070A070A0907090909070909070A090A09090A0A090A0A0909 0A090A0909090A09070A0A09090909090A0909090707090909090A0A0A0A0907070A0A070A0A09 0A09090707090707090A09090A090A0A090A090A0A090A090A090A090A07090707090709090909 09090A0A090A0A09070A09090A0A0A0A0A09090A0A0A090A0A0A090A090909090A0A0A0A090A0A 090A090909090909090A0A09030202444241DFDFDEFEFCF8F5F2EDF6F3EFF6F3EFFBF8F4C6C4C1 7675736D6D6B5E5F5E50514F4443433B39392728281C1C1D191A1A1616161718183E41415A5E60 808182131515000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000484748 A4A4A674757877777A77787A2829291313131818181A1A1A2A292A3A3A3A4A4A48605E5D6F6E6D 7F7E7C8A8987D6D4D1FAF7F3F5F2EEF6F3EFF4F1EDFBF9F5F9F9F56A6A68060606070909060709 090909090709090609070907090909090709090909070709090909090909070909070707090909 090A07070709090909070907090709090709070909090909090909090909090709090909070707 07090709090A09070707070709090A070709090909090A0909070709090A07070909070A07090A 09090907070909090907090709090909090907070907070A090709090909090909090709070909 0A0A0909090909070907090A090907090A0709090909090A0909090909090A0A0A090909090A09 0909090909070909090A0A09090A09090709090707090909090909070709090A09090A09070907 090A090A09090A0909090A090909090A0A09070A09090909090A0A090A090A0909090709070907 070A090909070A070A0A0A090A0909090A0A0A070909090A070909090A09090909090707090909 090A09090909070A0909090909090A090907090A090909090A090909090A09090A090A090A0A09 0A090A090A090709090909090A090A0A0A090907090709090909070A090A09090A09090A0A0A09 0A0A09090909070A090909090A0909090A0A090A0909070709070909090907090909090A090A09 09090A09090A0909090A0A0909090A09090A0909090A09090A0709090A090909090A070A090909 090709090709090A0A090709070A090909090A0A090A090909090A070A0A090909090A09090A07 09090707090909090909090A0909070A090907090A0907090A0A09090909070907090907070709 0A09090909090909090A070909090909090A090A09070909090909090A09090909070909090909 09090A0A09090A0A090909090A09090909090909090A0A090A0909090707090907090A0A0A090A 0A0709090A090909090709070909090A0A0A07090A0A09090A0A0A090909090A0A090909090A0A 0A09090909090907070A0909090A0907090909070709090709090A090909090A0A0909090A090A 0A090A090A0907090907060909070A0A090A090A0A09090A090907090907090909090A06090909 0A090A09090A070909090A09090909070A0909090A09090907070909070A09090907090A090A0A 0909090A0A0A090A0909090A090A0A09090909090A0707090707090A0A090A070A0A090909090A 090A09090909090A090A09090A0909090909090A09090A0A090A0709070A0909090A07090A0A09 070A07070909090A0909090909090909090A0A0A0A0A0A090909090A09090A0A0A090907090907 090909090A090909090909090A09090909090A0A09090A0709090A0A0A0A0909090A0909090909 0907090A0A090A09090A0A0A060A090707090A090A0A0A090A090909090A0A0907090A0A090909 0A0A09090A09050306232222C7C4C2FFFFFAF6F3EFF6F3EFF6F3EFFAF8F3DAD7D4807F7E6F6E6D 6361605454524646463A3A3A2D2D2D1D1E1E1A1A1A17171715141536393955595A808284252323 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000636364A3A3A5707172 7A7B7D6A6B6D1F1F1E1616151818181D1D1D2F2F2F3D3C3D4F4F4F63626173727082807E959391 E4E1DFF9F6F2F6F3EFF6F3EFF4F1EDFFFDFAE1E0E0474644020202090707070909090909090907 07090909090707090A0709090909070709070707090909090709090709070907070907090A0907 090906090709090709070909090707090707070907070909090909090707090709070707090709 09090707070909070907090909090907070A0907070709090707070907070909070909090A0A09 09090909090909090A070A090909070A090909070909070709090A090909070907090907070909 0907090709070909090A090909090A09090907090907090709090A090909070909090A0A0A0907 0709070909070907090909070A090709070909090707090909090909070A090909090A0A090A09 0A07090909090A090A07090A090A070909090907090A090A09090A0907070709070907090A0909 0709070909070909090909090A0A0A090A090909090909090907090A0907090909090A09070907 090A0909090907090A0909090909090909090A09070909090909090A09090A0A0A0909090A0907 09090909090A09090909090A090909090907090A0A0A0A0A090909090A09070A09090909090709 090A070909090A07090909070907090A09070907090709090709090707090909090A09090A090A 090A0A0A0A0A09090A090A090909090A090709090A09090907090909090A070909090709090709 0909090907090A0909090A0A0A0A090A09090909090A07090A090909070A090909090A090A090A 090A0A070909090A090A09090A090A090A090A0909090A0A0A0A090909090A0907090909090909 070A09090909090A090A0A090909090709090A09090A09090A070909090907090A0A0A090A090A 090909090A090909090A09090909090A090A0709090907090A09090A090A090A0A090A09090909 090909090A090909090A0909090907070A070A0A070909070A090907090A090909090909090907 07090907090707090A0A070A090A09090A0909090A09090907070A0909090909090909090A090A 0A070A09070909090909090909090A090909090909090A090A09090A0A090A090A0A0A0909090A 0A0A090709090A0A0A09090909090909070709090909090A09090909070A0A09090A090709090A 06090709090909070A09070A07090A090A0909090909090709090A0907090A0907090907090909 0A09090909090A0707090A09090909090A0907070907090A0909090A09090A0A0909090909090A 0A070A0909070909090A09070A0A07090A09090A0909090A090909090A0A0A0A0A090A09090907 09090A090A070909090A09070909090907090A09090A0909090A09090909090909090909090A09 09090A09090A090A0A0A090A090909070A090A090A0909090709090A09090A0907090909090709 090709100D0FA5A4A1FFFEFAF7F4F0F6F3EFF6F3EFF9F6F2E8E5E18F8E8B70706F676565575756 4949493C3D3D3030301F2020191A1A1718181212123031315256567D8082474747000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 0000000000000000000000000000000000000000000303037979799E9EA16C6D707E7F81605F61 191819161716181918212122323332403F3F565555686765777674848280A19F9DEEEBE7F8F5F1 F6F3EFF6F3EFF4F1EDFFFFFEC7C6C52B292803030309090A090909070909090907090909090909 070707060907060A07090707070707090706070709090707070909070907090707070907070707 06090707090907090907090907070709070707070A0A0709070907060709070907060909090907 0907070709090907070706070707070707060709090909070709070709090A0909090907070907 090707070909060909090707090909090709090909070907090707070909090909090906090707 07090909070A09090907090709090709070909070709090709090909070909090A070A0A090707 0707070707090909070909090909070909090909090909070709070907090909070909070A0709 0A070907090907070909090A070709070909090A090907090909070707090A0907090707070909 0707090909090909070707090909090A0909090709090707090909090909090909090909090709 09070907090709090909090A090709090709090907090709090909070A09090909090907070907 0909070909070909070909070709090909070909090609090907070709090907070A0909070909 090709070907070A07090A0909070909090A090A0909090909070A0A090909090709070907090A 090909090909090A0909090907090907090909090A0A0A070909070A0909090909090909090909 09090A0907090907090909090907090909070A090A09070909090A09090A090709090A090A0909 0709090909090A070A0A0A09090A07090907090A090A0909090909090909070709090909090A09 0A0909090909070A0A0A0A09090A0A07090909090A090A0909090A0A0909090909090709090907 090907090909090A090A0907090909090707070909090709070A070909090A0A09090709090A09 09090A090709090909090A09070A0709090909070A0A0709090909090909090909070909090909 0A090909070909070A0709090907070909070907070909070909090707090A09090A0907070909 09070A090909090A09090909090709090909070709090909070A09090909090709090709090709 0A090A0907090709060909090909070A0A070A0909090709090909090909090909090909090909 0A09090909090707090909090909090709090A0A090909090A090A09090A0909090909070A0909 090A090A090909090909090909090A0909070909090909090909090709090907090A070A0A090A 070A070A0909090709070909090909090A090909090A090907090907090707090909090909090A 09090A0907070709090A09090A0A070A0A0709090909070909090A09090A070909070A09090907 09090909090A0A090909090A090A0A090907090909090A0909090909090909070909090A050605 82817EFAFAF6F8F5F1F5F2EEF6F3EFF8F5F1F1EFEB9E9D9A7372716B6A6A5A59594D4C4C3F3F40 33333423232419181A1819191213122828284C4E507D81815D5D5D000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 00000000000000000000000000000005050588888899999A6F70727F7F82505051161615161617 1919192626263333334343425A5A596A69687C7B79868584AEADAAF4F1EDF7F4F0F6F3EFF6F3EF F6F3EFFFFFFEACAAA8161615050505070707070907070909090707070709090909070A09070709 060907060709060707060707070706070707070909070907070707070706070909090707090907 090709090709090709090907060707070907090707070707090709070907070709070909070907 090907070707070707070707090709070907070909070707070707070707090909090709070709 070709090907070709070907070709070707070707060707090909090707070709070907090907 0A0709070907090709070707060907090907070707090707090907070909090707070909070907 07070909090709090709090707090909090907090709070709070A090709090709090907070909 0706090709070909090707070907090909090A0909090909090709070609070909070909090709 070907090709090709070A0909070909070906090A090709090707070709090709090709090707 0A07090607090A070907070907070709070907070707090707070A070909070709090709090A07 0909070709070909070909090907070A07090A090707070707090909090A07070A090707090909 09070A0A090A0A0709090909070909090909070907090909090909070709070709090907070707 090709090909070709090A0907090709090909070909090709090909070909090707090A060909 09090907090A0909090A0909070907090A0909090A0A07090907070909090907090907090A0907 070909070709090709070909090909090909090709090707090709090707070909070709090707 0A09090A0909090909090909090909090909090907090709090707070709090707090907090707 0907090909070709090909070A0907090909090707070706090A09090709070909070909090909 07090909090907070907070909070909090909090909070709070709070909070707070A09090A 070709090909090907070A07070907090909070709090909070A07090907070709090707090909 0907090907090909070709090A0909070907090909070909070709090909090A09090706090907 090707090909090909090907070707090909090909090A0909090909090909090A070907070909 0707090907070909070709070909090907090907070909090A09070A0909090709090907090A09 090907090907090709090907070A0A0909090907070707070907090909070A0909070907070907 0709090A09090707070909090A090909070709070907090709090A070907060709090909090909 070907090909070907090709090707090909070907090709090709090909090907070909090909 0907070709090709090A0909070707090A0A07090A09090709070709090901020262615EF0F0EF F9F6F3F5F2EEF6F3EFF8F5F1F7F4F0AFACAA7574736E6D6C5D5C5A4F4F4E424242353536272727 1A1A1B18191913131320202041444575797A6C6C6C000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 0000000000000000000B0B0B9899999293936E6E718080834545461213131617171A1A1A282828 3536354948485E5D5C6D6C6A807F7D898886BCBAB6F7F4F0F7F4F0F6F3EFF6F3EFF8F6F1FFFFFA 8D8C890A0A0A060606060707070706070707060707070707070706070709070909070707070707 090707070707070707070909090707090909090909090909070909070707090707090907090709 070909070907090707070709090907070707090709090909060709070907070707070909090907 060707070707090909090907090907070707070707070909090709090707090907070909070709 070907070909090909090709070907070907070709090707070907070709090707090709070909 090907090907070709070707070706090709090609070707070906070709070709070709070707 07070707070709070709070707090607090709070907070909070707070907090A0709090A0709 070909070909070707070906070907090609070707060707090907070707090909090709070909 070909090909090907070709090909090907070707070909070709090909090909090909090907 09090909090907090709090907070909090707070A060909070907070909070907090909070709 0909070707090909090707090909090909070709070907090907090A0707090909070907090909 0907090909070707090907090909090909090907090709070909070907090A0709090709090909 0A09090A09090709090A0909090909070707090709070907090909090909090907070A09070707 09070A090909070909070709070909090709090909090907070707070909090906090709090907 0907070709090707090906090A0909090907090907070909090709070707090709070707090707 07070709070907090909090709090909090A0907070709070907090909090A0707070709090909 0709070707070709090907090907090709090909090907070A0707090909070907070909070709 090A07070A0907090707070909070A0A090A090909070709070707090707090909090707090909 0709090907070707090909090909090907070707090709090909070A0709090709090907090A07 0909070907090909090A0909090909090907070909090909070909090909070909090909090709 0A070707070907090707090A090909070707070707070709070709070709090707070709070907 090A090909070909090907090907070707070907090909070709070A0909090709090707070707 0907090A0907090909090707070907090707090709060707070909070909070909090A09090707 070909070707090707090709070909090A07090907070909090707070709070909070A07070909 0709090907070907070907070A0907090907070907090909090907070A09090707090707090909 090907090707090707090707090907070907090909070A09020101454543E5E5E3FAF8F4F5F2EE F6F3EFF7F4F0F9F6F3BEBBB97A787771706F605F5E515150454645373738292A2A1C1C1D171718 1212131B1C1C3E43436D7070818181030303000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000151515A2A2A3898A8B6F71737B7C7E39393A1313121818171C1C1D2C2C2C3939394E4D4C 61605F706F6E8483818D8C8AC7C5C1F8F6F1F7F4F0F6F3EFF5F2EEFAF8F4F9F8F3716F6E020202 070707060607090907070707070707070706070709070709070706090706070907090707070707 070707070707070707070707070709070909090907070607070707070907070909070707070707 090907090909090909070707070707090709070709070707070609070909090909060707090909 090907070709070707070906090909070707070707070709070707090709070607090707070709 070707070907070909070707090707070707070707070907090709090707090909090707070706 090609090A09090907070709070909070707090907090909070907070709090707090707070709 090907090709090907060709070707070A0907070709070909090907070709090707070709090A 0907090707070907070707070907070A0909070709070707090707070709090907070907090709 070707070909090907070909090707090707070609070709070707090907090909090907090707 0709070909090A070A090709090909090707090907090907070709070909090909070707070709 070A09070A0709070709070907090907090A090907070907090909090907090909090707090709 07070A090907090707090707090907090A07090A090707070909070709090A09070A0707090909 0A090907090909090709090907090A090909070909070907090909070907090707090907070709 0A070709090909090909090A0907070907090707090907090A0907070907070A09070909090907 090907090709090707070709070909070907090909070707090907090907090907070709070907 0909090907090907090909090707070909070909090709090707090707070A0707090707090709 070707090907090707070909090906090707090709090707090909060909090909070707070707 0909070709070709090907090909090909070707070909070707060909070707090907070A0709 0909090907090909090709070707070709070707090A09090909090709090709070909090A0707 07070907070909070707090907090707090909070909090907090A07090A090909090909070907 07070707090907070909070907070909070907070909070709090A090709090709090907090709 090909070A07090909070907070709070709090707090909070907070707090707070707070A09 0709090A070909090909090A090709070707090909090709090907070707070909090909090907 0A0709070907070A07090709070709090909070907090709070707070707070709070909090707 0A0907090909070709070707070A07090707070909090A09070909090707090707090909090907 0709090707070709090707090709090707090202022D2E2DDAD8D5FEFBF7F6F3EFF6F3EFF6F3EF FBF8F4CCC9C77F7F7C7373726463625553544948483A3A3B2D2D2D1E1E1F181819131414171818 3A3D3F696C6E898A8B060606000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000232323 AAA9AA8587897676787676783030311212121818181F1F202E2E2E3C3C3C525252646362757372 86868392918FD1CECBF9F6F3F6F3EFF6F3EFF5F2EEFBF9F7ECEBEA5A5756020100090909070706 070907070707090706070709070707070907070709070707070707070707060707070707070707 090707070706070709070907070706070907070706070607070707070707070706060706070906 070707090709070707090709070707070707070709070709060709070707090709070707070709 070707090607070907070709070909070709070607090707070909070907070907090907090607 090709070709090707070907090707070609090707070707070709070607070707070709090907 070907070709090909070909090707070907070707070909090707090709070709090907090707 0709090907070707090907070707090907090609070907090909090709070707070A0907090707 070707070907070706090707090709090707070907070909090707070707070709070707090707 070707070609090909090707070907090707090709090909090709070707070907070907060709 09060A0A0709090706090707090707070709070707070709070707070706070707070907070707 090709060709070709070907070709090909070707070907090907090709090707070709090707 07070907090607090709070709090A090909090909070907090707090709090907090707090709 070909070707090909090A07070707070909070709070907070709070707090909090709090707 09070907090709090909090A090907090707090907090907070709070909090909090909070909 090707090909090A090709090909090707070907090709090909090707090909090A0707070907 070707090707070909070707070909070906070909070707090709070609090709090909070707 090706070909070907070907070707090707070709090909090907090909070909070706070A07 070907070709070909070906090909090707070906070706090709090907070709070907090709 090909070707070909070707070907090707070907090709070906090907070707070909090707 090709070706090709090707070707070907070707060707070707070707090707090709090707 090707070907070707090707090707060907070706070909070707090907070709070709090909 090907090707070907070907070707090909090706090907090707070707070909090909070909 0A070909070707070A0707070A0709090909070907070707070907070907070909070909090709 070707090706090909070907090707060707070707070709070709070907090707090907060906 07090609070709090709090709070909060707090A07090909090709090909070909090A090707 070707090907090A0A0907090605061D1D1DC8C6C4FFFCF9F5F2EEF6F3EFF6F3EFFBF8F4D7D6D2 8886857674736767665656554A4A493E3D3D2F2F30212022171819151516151515353637606466 8D8E8F0A0A0A000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000333333B0AEB0808184 77777A7171722A2A2A131313171818212120303030413F3F555555666564777675898886979593 D8D5D2FAF7F3F6F3EFF6F3EFF5F2EDFDFBF7E0DFDF434241000100090707090707060907070707 070907090707070707070709070607090607090709070609070707070707070606070707070707 060707070707060607060707070606070606070607060707070609060707070706090606070707 070609070607070606070707070707070707060607070707060707070907070607070606070607 070607070609070607060709090707070607060907070607070607070707070707090707070609 070709070707070609090707070709090907060609090707070706070707070607090707070709 070707060709070909090907090706090707070909070707070907090709070907070909090707 070707070609090707070707060707070707090707070907090707070707070907070707090707 070706070707090909070706070707090709070709090707090609070609070906090707060607 090707060906070707070907090709070907090707060707070907070709070707070907060709 070706070906070907090707090707090907070707090907070906090607070709070707060907 090907060907070907090907090607090707070907070709090707070707070907070707090907 090607070706070707070709070709070909070706070907090907090706070707070609070907 090709090909090907090707090709090907070707070909070909070907070709090909090709 090907090709070909060709090707090907090709090909090707070709070909090909070907 090707060707070709090609070707090707060907070707070707070907090707090709070707 090907060909070907090706070907090907090907090907070709070707070709090907070709 090707060709070706070707090909090707090907070707090706070907090709070707070707 090907070707090707070907090906090707070609070707090909090709090707070707090706 0907070909090909070707070707090706070909070709090907090907090A0707070707070907 09070707070907070707070706090707070907070909090906090607070707070709090709060A 070909090907090909060709070907090709090909070607090909090909090706070707070709 070707090909070909090907070707070607070707060907090707070709070707070707090706 070709090909070707070907070707090907070907090707090709090707070907070707070707 070709090909090707070707070707070607090709070707070909070909060706090706070906 090707090707090709090607070707090709090709070609070707090707070709070907090707 070A06060906060607121210B5B4B1FFFCF9F6F3EFF6F3EFF6F3EFFBF8F4E0DEDA908E8D787675 6A69695858574C4C4B3F3F3F30313123242318191A1516181315152D2E2F575C5D929493161614 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000434343B0AFAF7C7D7F7777796A6A6B 2323241313151918192123223131314342425958576967667A7A798B8B899D9B99DEDCD9F9F6F2 F6F3EFF6F3EFF5F2EDFFFDF8D6D5D3323232010102070709090707060707060707070707070607 060607060707070707070606070709070609060707070606070606060707060707070607090606 060606060707070707090706070607060707070709070906090707060609060609070707060607 070707060706060606070707070607070707070707060606070706070606070707070607070607 060607060707060607070607070606070606060607060607070706060607070607070607070606 070707060906060707070706060606060707070607070709060606070707070707060607060707 070907070607070706060907070909090707070707070609060907060907070607060907070707 070709090709070607070707070707070709090707070707060707060706070909090707090707 070907070707070907070607090607070607070707070707090906090707060709070609090706 070709070909070707070607070707070707070607070707090909090907070607090707090707 060707070707090707070707070709070907070706070707090707070907090709090707070709 070707070707070609070607090706090607070907070906070907070707070707070609070706 090707070607070707090707090707090909070709070707090707090607070906070607070707 090707090707070907070707090709090709070907060607090707070907070907070707090706 090609060709070907070707060907090607070707090706060706070907060607070707070907 070906070909070707090907060707070706090907070707070707070709070709060709060707 070607070909070707070909070909090909090707060707060906070706090907070709070707 070706090909090909070909070707070709070606070707070707070909090909070707070707 090907060706060707070709060707070707070707090609070707070706070707090709070907 070707070707070707090609090709070707070707070907070909070709090709090706090707 07070607090607070707070706070907070706090606070706090607090709060A070707070707 070707070709070709090607070609070609090707070706070606070707070709070709070707 070709090707090707070607090707070707090909070907070709070707070707090606070907 090707070707070707070909090707070707090907070909090909090909070709090707070707 070706090707070707070707070907070709090909070709060706090909070707070707070907 070707070607070709090607070709070609070909070707070609070906070707070706060606 0707060A0A09A3A19EFFFDF8F6F4EFF6F3EFF6F3EFFBF8F4E8E5E19998967A79776D6C6B5B5B5A 4F4E4E424242323333242525171819141618101313292B2B515554959695262624000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000545452B0B0B079797C7A797B6362641F1E1F141516 1A1A1A2324243434344646455B5A5A6B6A697E7C7B8E8D8BA2A09EE4E1DEF9F6F2F6F3EFF6F3EF F6F3EFFFFFFACCC9C6252424020202070606060609070607070606070707060707070607070706 070706070707070907060909070607070706070707070607070706070607070707070707070707 070707070607070707070706070707070706060607060607070707060606070706070607070607 070707060706070707070707090707070606070607070707070706070707070707060707070707 070707060707070707070707060707060707070707070706070706070707070707070906060707 070606070707070706070607070707060709060707090707060707060709070709070706070607 070707070707060707060707070607070707070709060707070709060707070706060707070607 070707070609070709070707060707070707060706060707070707070707070706070707090707 070907090709070709070706070707070907090707070607070707060707070709090707070707 070707070706070707090607070707070707070707070707060707070707090907090707070707 070706090906090709070909070709070907090707090907070709070907070706090706070709 070709090707090907090709090709070709060707070907090907070709090709070707070707 070707090707070707070707070907070707070707090707090907060707070707070707070607 070707070707070709090707090607070707070709070709070707070707060707070607070707 070709070707060907070607070707070606070707070707070607070707060706070707090907 090709070709070606070707090707070709060909070707070707070707070707070709090909 060909060709060607090706090707070907070707090707070706070707090709070707070909 070709070707070709090909070707070907070707070707070707090706090709070707070706 060607060707070709070707090707090607070706070707090706070607070707090706070607 070707090709070707070706070707060907070709070707070907070907070707070907070707 070609070707070707070707070707070609070707090707090707070707070607070906070907 090707070707060707070707070707070607070709070709070907070907090707070707070707 070707070707070907090907070707060707090707070707070707070707090709090707060707 060907070709070707090907090907090707070709070707070909070709060707070707090709 070907070707070707070907070907090707070707070707070909090707090609070707090707 070907060709090707070707070907070906070607070707070707090709070707070706060505 93908FFCFCF8F6F3EFF6F3EFF5F2EEFAF7F3EEEBE7A2A19E7C7B7B716F6F5E5D5C505050444444 343535262727191A1B1516171012132729294E5352979999333333000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 0000000000000000000000005E5E5FAFB0B178787A7978795C5C5D1B1B1B1616151B1B1B252525 3737374949485D5D5D6D6C6B817E7D91908EA5A3A1E5E2DFF9F6F2F6F3EFF6F3EFF6F3EFFFFFFB C1BEBB1C1B1B020202060606070607060706060607070607070707070607070607060706070606 070707060706060606070706070707060607070706060707070606060707070607070707070707 070706060606060707070709070707070607070607090707070707060707070707070607060606 070707070707070706060707070706070707070707070907070707070707070606070707070706 060707070707090706060706070707070707060606070907070707060706070607070607060707 070707070706060607070706090706090909070707060607060707070607060707070707070707 070707070706060706060607070707070606070707060706090707070707070707070707070707 070607070707070707060706070707090607060707070707070707070707090707060607070607 070706070707070706070706070707070707070906070707070707070907070707070607070706 070707060707070706070706070707060607070707070707070707070707070707060707070707 070706060607070607070707070707070707070606070706070706060606070606060606070606 060607060606060606070706060707070607070606060706060706060706070707070606070707 070707070707070707070707070707060707070607070707070607070707070707070706070707 070707060707090709090707070707070907070706070707070707070707070907090707090907 070707090907070707090707090707070709070909090907060709090707090707090709070909 090707070909070907070707070907070707070707070707070709070707070607070707060706 070707060707070707070607060707070707060707060707070707090707060607070707070709 060707070707090706070707070707090707090707070606070607070707070706090707090709 070907070707070706090907070707070609070707070706070707070706070706070707070606 070607070707070707060607070707070907070707070707070709060707070707060709060709 070706070707060709070707070707070707060707060707070607070707070707070706070706 060707070707060707070707070707070707070707070707070707070707070707070707070707 070707070707070707070707070907070707070907070707060607060606060706060707060707 070707070707060706070707070606070707090907060709070907070906060707070707070906 060707070909070709090707070707090707070707070707070707070707090707070907070707 0707070706070707070707070709070709070707070709070707070909090202027D7D7CF8F8F7 F6F3EFF6F3EFF6F3EFFAF7F3F0EEEAA9A7A57F7E7E74727260605F53535245454537383829292A 1B1B1C151617101012202222474D4C959898393939000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 0000000000006F6F70ADAEAE76767879797A5252531717171617171B1B1B2727283939394B4B4B 605F5F706F6E83818093918FAAA8A5E8E5E1F9F6F2F6F3EFF6F3EFF6F3EFFFFFFBB4B3AF141313 050303070606070607070907070607070606070606070707060706070607060706070606070706 060707060607070607060706070607060607070606060706060707070607060606070706060707 060607070606070707070606070706060706070706060607060607070607070706070707060607 070706060607070707070707070707070707070706070607070707060706070706060707070707 070707070707070707060606070707070707070606070606070706090907070906060706060706 070607070707060706070607070706070707060606060706070707070707070607070609070706 070706070707070707090707070707070907070707070607070706070709060706070706060707 070707060706070707070707060707070707070607070706070706070707060706060607060707 070709070707070907070707070709070707060707070707070706070607070607090707070706 070606060907070909060609060706060706070707070607070707070607090707070706060707 0709060609070706070607070606060606070A0A0A0A0A0C0A0C0A0A0A0A0A0A0A0A0A0A0A0A0A 09090A0A0A0A09090A0A0909090907070909070907070707070907070707060607060607070607 060606070707060607070606060607060607070609060606060606060707060607070707070707 070706060606060606060606060606060606060606060606060606060506060606060505060606 060505060505050505050506050506060505030506060505060606050506060605060605050505 060606070709070707060606070707070707070707070707070707070706070707090707070707 070607060706070707060607070606070607070706060707060707070707070707070706060707 070707060707070707070707060606070606070606070706070607070909060907060707070707 070607070606070707070607070707070706090707070706070606070707070606070606070607 070707070607070707060707070707060706070607090607060606070707070707060707070607 070706070606070707060706070707070707060707070607070707060707070709070707090707 070706070607060607070706070707070707070706070907070706070607070607090707060707 060607070707060706070707090706070706090606070706060706070706070707060707070607 070607090707070707070707070707070607070909060706070706070707060607070606070707 090609090607070707070707070709070707070706060707070606070607070707070607070707 070707070907070706070709070709070609070707070909010001747371F6F6F5F6F3EFF6F3EF F6F3EFF9F6F2F5F2EEB3B1AF8281807676746362625454544747473839392A2B2B1B1C1D151617 1010101E2020434747919392494949000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 737373AEAEAE7474767776784E4E4F1616171718181C1C1D2A2A2A3A3A3A4D4D4D61616071716F 868583949391AEACAAEDEAE7F8F5F1F6F3EFF6F3EFF7F4F0FFFFFBAAA9A60D0D0D050503060606 070707060607070607070607060706060706060607070706060707070607070707070706070607 060606060607070607060607070707060706070607070607060606070607060707070706070606 070706060606070607060707070707070606060706060707070607060707070706070606070707 070707070607070707060607060607070607070606070906060707070607070706060607070606 060707060607070707060607070606070706060607070707070606070606060606070707070706 070706060607060707070607060607070707070707070706060606070707060706070706070706 060606070606060607060707070707070707070706090707070607070707070707060706060606 060707060606060706060606060706070906070707070707070707070707070707070607070607 090707060607060707070607070607060606060607060707070606070706060706060606060707 060606060707070607070607060706070606060707060707070707070706070706060707070706 07070709090A0F100F181B1A2020212223232123242223242324242324242325242024241F2423 2023242023232023212123221F23211F21211F22211E21211F20211F1F211F20211F20201E2121 1F21221F20211F21211E20211F20211F20201F20201F21201F20201E21201F21201F201F1E201F 1E1F201D1F1F1D1F201D1F1F1C1E1E1C1F1E1D1E1E1C1D1D1B1D1C191C1C1A1B1B191C1C191C1C 1A1C1A1B1C1B1A1C1B1A1C1B1A1C1B1A1D1C1A1B1C191B1B191B1C181B1A1415150C0C0C050606 060606090607070907070906070706070607070907060706070707060607070707070706060707 070607070707060706070707070607060606070907070707060707060707070607060707060706 070606070707070707090706060707070707070706060607070706060707070709090707060707 060706070606060607060606070607070706070607070707060607070606060606060707060707 070606060707070706060707070606070707070707070707070606070607070607070707070606 060706070607070607070607070707070709070707070707070707070707070707070707070707 070707070707070607070707070707070606070707070707070707070907070706060707070707 070607070707070706060707060607070707060707070707070707070707070607070606070707 070706060706070707070606070606060707060706060607070707070707060606060906070707 070707060707070707070707070606060707070706060606070607060706060607070707060907 070706060706070706060706070707070907010101686764F3F3F1F6F3F0F6F3EFF6F3EFF9F6F2 F5F3EEB6B5B2868583797877676666565555484848393A3A2B2C2C1C1D1D1516171010121A1C1C 3C42428C8E8F5A5A59000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000767676ABABAC 75757779797A4B4B4B1616151818181D1D1D2C2C2D3B3B3B4F4F4F636261737271888684969592 B1AFACEDEBE6F8F5F1F6F3EFF6F3EFF7F4F0FFFFFAA6A5A20D0D0D050505060606070606060707 070607060607060607070707060606070706070707060707070706070707060607070606070706 070706070707070707060606060606060607060607070707070607060606070707060707070606 060707070607060706070707070707060706070706070706060606070607070706070707070606 060607060707060607070606060706060707070607060707070706060607060606070707060706 070606070707070707060607060609060709060606070706070706060707070707090707060706 060707060606070707060706060707070606060606070706060607070707060607070706070606 070607070706070607070707070607060707070706070607070607070706060607060707060707 060706070707070706070606070707070706060707070609070607070706070706060607070706 070706060706070606070707070707060706060606060607070606060606060607070607060606 0706070707070707070707070607070606070706060707070707060606060606090A0A0A161719 21232323252524262625282726282926292A272A2A272A29262A2A252828242929252A2926292A 252A29262A2B252A2A25292A272A2C262A2B26292A27292A26282926282A282B2B272A2A26292A 27282B282A2B272A2A272A2A272A2A272B29282B2B262A2B27292A272A2A272929282A2B272A2A 272A2A28282A27292B262A2A272B2A272929282A2A272A29262929272A29262A2A262A28272A2C 26292B262A2A262A2B25292B27292B26292A272A2B26292B272929242525191A19090909060606 070707060607070606070706070707060707060607060707060707060707070706060706070607 060606060607070607060606070606070706060706070707070606070707070707070607070707 070606070607070706070606070606060606060706070706070706060606060606070706070607 060707060706060607070707070606070707070707060706060707060607070707060607070706 060707070606070707070709070707070606060706070606070707070606070706070707070607 070707070707070607070607070707070706070606070707070706070606070706060606070607 060607070606070606060607070706070707060706070707070607060706060607070707070606 060707070707060707070707070706070707070607060706060907060707060707060706070707 070706070706070706070707060707060707060706070707070606060707070707070706070707 060606070706060706060706070706070707060606060707070607070707060707070706070707 060707070606060907070907000001565554EFEFEEF7F4F0F6F3EFF6F3EFF8F5F1F8F5F1BFBCBA 8988877B7A796868675757564A4A493C3C3C2D2E2E1D1F1F1517181210131A1A1B383D3E888D8C 656565000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000828384A8A7A8737374777879 4344451515151A1A1A1E1E1F2E2E2E3C3C3D525252646462757473898786989794B3B1AEEEEBE7 F8F5F1F6F3EFF6F3EFF7F4F0FFFEFAA09F9C0C0A0A050606060606060607060606060606060607 060607060607070707060607060606070606060607070606070706060606060707060607070706 060707070606060707060706070706060606070607070607060606070606060607060606060707 060606070706060606060706070607060606060606070607060707070706060606070607070707 060607070706070606070707060606070607060607070607070707060606060606070706070707 070707060707060606070606060707070707070607070606070606070709070607070707060607 070706070606070707060706060707060707060706060706060707070606070706070607070707 070707070706070706060607070706060606070606060707060606070706060606070707060607 060607060706070706060606060706070707060707060706060706060606070607060606060706 060707070606060607060706060707070707070707060607070706070707060607070706060707 07070706060707070607070907060706070707070706070707090A1517191F2324202324222324 2325252124252223261F22231E21241E20221F20231F21231D20231E20211F20221E20221E1E21 1D20221D1F221F1F221E20231D1F201F20231D1F201D1F211D1E211D1E1F1E1D201E1E211D2021 1E21221F20221D1E201C1E201D1E201D1F221E1F221C1D201D1E202020231E20221F1F211D1E21 1D1F211E1F201E20211F20221F1E211D1E1F1D1E1F1E20211C1D1F1B1C1E1E20231A1B1F1B1C1E 1D1E221A1C1F1C1E201E20221F20241E1F232021222324242627271E22210A0A0A050605060707 070606060707070706070707060607060707070606070707060607060706070707070707070606 070706070706060607060607070706070607060606070706060706070707060707070706070607 070707070707070707070606070707060706060607060606060606060707070607070707060707 070606070707070606060706070607070606060707070606070607070707060606060607060706 070707070706060707070707070607060607070607070606070707070707060606070606070707 070906060706070606070607060607070707070607060707060707060706060706060906070607 070707060707070607070707070706070707060606070606060707070706070706070606060706 070707060707060606060706070606070606060606060707060707070706060606070606070707 060606070606060707070706060706070606070707060607060706060607060707060606060707 070706070607060607070706060606060706070607060707060607070607060706060707060607 070706070909000000525250EEEEEDF7F4F0F6F3EFF6F3EFF7F4F0FAF7F3C7C4C18C8B897D7C7B 6A69685959584B4B4B3D3D3E2F2F301E1F1F161617121213171718393C3D8A8C8B727272000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 0000000000000000000000000000000000000404048D8C8DA5A4A6727275777678414142151516 1A1A1B2020202F2F303D3C3C5252526464637676748989879A9896B4B2AFEDEAE7F8F5F1F6F3EF F6F3EFF7F4F0FFFEFA9B9997090909060606060607060606060607070607070606070707060606 060606070706070706070607060606060606060606060606060607060706060706070706060606 060606060606060606070606070607060607060606060606070606060606070707060707060606 060606060706060607060707060606060606060606060606070606060706070606070607060706 060606060707060607070607060706060706060706060606060606070607070706070606060606 070707060606060707070607070707060706060606060707060607070707060706070607060707 070607060606060606060706060606070607060706070707060707070606060607060707070607 070707060607060706070707070707060606060607070707070706070606070606070707060607 060606070607070707060707060707070706060706060706070907070707060706070606070607 070607060706070607060607070606060607070607060707070607070707070707070606060606 0706070606060606060606060706070607071313131C1E201B1F201E1F20191C1D141418121216 121415101416121214101013101015101214101214101013121013121014101012121214101214 1210131012151212141010131012141010151010151010140F1014101015131215111216101215 101013101014101013101215101013121214101013101014101014101014101215101014101214 101215121316121214101013101013101215101014101014121215101214121015101014121316 1012141010131010141010141313151616181C1D1F2628291E2121060706060606060607070607 070706070706060706070707070606060606060706070606070607070706070707070707070706 070707070606060706070706070707070706060607070607060707060706070607070707060607 070706060607070707060606070607060707070607070707060706070707070606060707070706 070706060707060606060606070706060609070706070606070707070707070606070707070707 060707070707070707070607070706070607070606070707070607060706060707070706060606 060707070707060706070706070607060706070706060606060706070706060607070706070706 070707060707070706070706060706070607060707060706070707060606060706070707070706 060706060706070707070607070607070607060606060606070707070607060707060607070706 070707060706060707070707060709070707070707070707070607060606060706070706070607 070707070707060707060606060707070707070707060607060706070606070607070706070907 0000004D4D4BEDEDEAF8F5F1F6F3EFF6F3EFF7F4F0FAF7F3C7C5C3908E8D81807E6E6D6C5A5A5B 4C4D4D3D3E3E2F30301F20201517171212131617183236378386877B7A7A000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 0000000000000000000E0E100C0C10807E80A5A5A67171747777793E3E3F1515151C1C1C212222 3030313D3D3D5453546565647777758C8A899B9A98B5B3B0EDEBE7F8F5F1F6F3EFF6F3EFF7F4F0 FFFDF9989794070707050606060606060606060606060607060606060606070706060706060606 070707060606060607060606070707060707060706070706060606070607060706070706070606 060606060606060607060606060706060606070606070707060707060607060607060606060606 060706070606060606070607060707060606060606060606060606060706060706060606060606 060606060607060607060607060606060606060606070706060606060606060606070707070607 060606060707070706060706060707060707060707060606070707060606060707060607070607 060606070706070607070607070707060707070607070707070706070606060607070607070706 060606060706070607060607070606070707070706060606060606060606060607070707070606 060706070707060607070606070606070707070706070606070607070607070607070707060607 070606070607060607070607060606070707060706070707060707060707060607070706070606 060606070607060606090A0A181A1B1D1E1F1D1E1F1416170A0C100A0C100F0F13111315101215 101215111017111217131316121315111315141315141314131314141414131315121216121217 141416131314121315121316131417121316121216121216121417131316121316121315121316 111415121315121315131416131315131416131315131316131416131316131417131316121315 121316131315121415121315121315121316121316111315131316121315131417121315141417 1213151012151213140D0F100F0F121E2022292F2E131514030503070709070606060706070707 070607070707070607060607070707070606060607060707070706070706060706060707070607 070707060707070607060606070707060607060706070707070607070606070606060606070707 070606060706070706070706060607060607060707070607070707060606070606060707060707 070707060607070707070607070706060706070707070707060706070707070706070706070607 060707060707060607060606070707070707060607060607060706070607070707060706060706 060607070707070706070707060607060706070706070607070707060706070606060707070606 070706070707070707060707060707060606070706060707070607070707070706060707060706 070607070606060606070707070606070707060706070607070707060706060606060607070707 070707070706070606070607070707070706070706070707060707070607070709060607060607 060706060607070707070607070707060607060607070706070707060607070707010101464543 EBEAE7F8F5F1F6F3EFF6F3EFF7F4F0FAF7F3CAC8C59391908282806F6F6F5D5D5C4F4F4E3F3F40 3131312121221616171313151515162E35357E8284828082000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 0E0E123F40473230396264669E9E9E7374757475763838391516161D1E1E2424243132323D3E3E 5655556766667877778D8A8B9D9C9AB6B4B2EEEBE7F8F5F1F6F3EFF6F3EFF7F4F0FFFDF9979693 060606060605070606060606060606070606060606060707060606060607060607060606060606 060606060606060606060606060707060606060606070606070606060606060606060607060606 060706060707060606060606060607060706060607070707070606060706060606060607060607 060706060706060706060607060606060607070606060607070607060607060607070706060707 060706070606060606060706070607060607060606060706060607070607060707060606070606 060606060706060606060606060607060606060606070607060606070706060606070607070707 060706060607070707060606060706060606060607060607060706070606070607070607070707 060606070707060607060606060606060606070607070707070607070707060607060607060707 060707070706070706060706060607060607060606060607060707060706070706070707070606 070707070607070706060707060707070606060606060706060707070607060607070707070707 0606060D0D0D1B1E1F1B1F201D1E1F0D0F100A0A0F0D0D12101014101014131214121214111317 101215101216101217121217121215121214131214141314131414121014131315141315121216 131316121216121217121315121214121317131317111316131215131215121314131315131215 131316131315131214131315141314131315121215131417131316141316131217121215121215 131316121315131316131216121316131216121316121216111316131414131417111315101214 1113151012130D0D101617192E33341E2122050503070706060707070707070707060607070606 070706070606060707070606070607070706070706070607070607070607070706070606070707 060707070607070707070706070606070607060707060707060607070707060706070706070607 060607070907070706070607070606060607060607070606060707070607070707060707070707 060607060706060607070706070607060607060707060606060606070707070706060607070706 060706060706070707070706070706090707070707070707060707060607070707070706060707 060707070606060707070707070606060706070607070607070707070607060707070707060606 070706060706070607070607070607070706070607060707060706070707070707070607070707 070707060607060606070707060606070706070607070606070607070607070707060606060606 070707060707070606060607070707060707060707070607070607070707070706060606070707 0606070606070707060607070706060706070607070709070609070202023C3C3BE8E6E2F9F7F2 F6F3EFF6F3EFF6F3EFFAF7F2CECBC9959493848382706F6F5F5F5E50514F404040323233222324 171818131415141414313737808484828181000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF0000000000000000000000000000000000000000000000000000002C2C2E8A898F 7C7A8167686A8687867777797272743636371616161E1E1E2425253032323F3E3D575756676766 7978768D8B8A9D9C9AB6B5B2EEEBE7F8F6F2F6F3EFF6F3EFF7F5F0FFFDF9959492060505050505 060606060606060606070606060606060707060606060706060607060606060606060606060606 060606060606060606070606060606060606060606060606070607060607060606060706060606 060606060606060606060606060606060606060607060706070606060606060706060706060706 060606060606060606060606070606060606060606060607060607060706060706060607060606 060606060706060606060606060606070706060606060606060606070606060606070606060606 060606060606070606060606060606060606070607070707070606070606070606060607060606 060606060606060607060606060607070606060706060606060606060606060606060606060606 060606060606060606060606070706060706060606060606060606070706060606070606060606 060706070607070606060606070606060606060706070606070607060606060606060606060607 0707070706060606060606060607060606060606060606060606060607060606060606060F1010 1B20211C20211C1E200D0D120C0C100D0C100F1013121213131314121215121317121315101315 111317111216121216131316111216121217121314131314141314131414141317121317121317 131216131315131314131315121417121316131316121216111315131417121216131316141416 121315121416141315131316131316131316141518131417131317131317131315131316131316 131417121315121316131316121318131317151417151415131314111315111315101013100F12 100F1215181A313537242628060606060606060607060606060606060606060706060607060606 070606060607060606060607060606060707060606070706060607060606060606060607060606 060606070607070707060606060606060606060606070706070607060707060606060707060607 060607060706060706070606060706060707060607060706060606070606060606070706060607 070607060606060706060706060607070706070706060607060606060607060606060707060707 060606060606060606070606060606060706070606060607060607060706060606070607060707 060706060606070706070707060706060706070607070706060607060607060606060606060606 060706060707060706060607060606070606070606070606060606060706060606060707070706 070607060606060607060607060606070707070707070606060607070607070707060706070706 060606070606060607070606060706060606060706060706060607060606070606060606060607 060607060606060606060706060606060909070607020202343334E2E1DFFAF7F3F6F3EFF6F3EF F7F4F0FBF8F4D4D1CE9998958685847372705F6060505150424242323133222324171818131314 141415333736808483818181000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 0000000000000000000000000000000000000000000000000000003B3D3E98979D8D8B916A6B6E 6D6E727A797D7170723534351617181E1E1F2425263131323F3E3F5656556767657A78778E8C8B 9E9D9BB8B6B3EEEBE7F9F6F2F6F3EFF6F3EFF8F5F1FFFDF892918F050505050606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060607060606060606060606060606060606060606060606060606060606 060607060606060606060606060606070607060606060607060606060606060606060607060607 060606060606060606060606060606060606060606060606070606060606060606060607060606 060606060606060606060607060606060606060606060606060607060606060606060606060606 070606060606060606060606060606060606070606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060706060706060606060606 060606060606060606060606070606060606070606070606060606060606060606070606060606 060607070607060606060606060607060606060606070706060606060606060606070606060606 0606060607060606060606060606070706070707060606060606060606060D0F102223271F2224 2224270D0F10060709101015101015101014121214121216101016111216101215111216111217 111216111217101214121214121015121314121215131213141415121316121215121316131316 131315131214121216101215111216121315101016111017121316121314131314121214101214 101314131315121214121215121316131316121216121316121316121215121215111216121215 1213151213151213171010161212151012131012131212151012131010141313160A0A0C141518 313538212326060606060606060606060606060606060606060606060606060606070606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606070607060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060706060606060606060606060606 060706060606060606060607060706060606060607060606060606060606060606060606060606 060706060606060606060606060607060606060606060606070606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060607060606060606 060606060606060606060606060606060606060606060706060606060606060606060606060606 060606060706060606060606060606060606060606060606060606070606060606060606060606 060606060607060606060607060607070606070706060606060606060606060606060606060607 060606060607060707060607070706020201323232E3E1DEFAF7F3F6F3EFF6F3EFF6F3EFFCF9F5 D8D6D29C9B9988878675747361616152525242424232333424252518191A1414161414142E3131 7A7D7D828484000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 00000000000000000000000000000000000000000039393B64656D63636A56585B68696D79787C 7271743635371717181F1F1F2726273131323F403F5757566968667A7A798F8D8B9F9D9BB8B6B2 EEEBE7F9F6F2F6F3EFF6F3EFF8F5F1FFFCF8908E8D030203060506060606060606060606060606 060706060606060606060606060606060606060606060606060706060607060606060606060606 060606060606060606060606060606060606060606060606060606070706060606070606070606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060607060606060606060706060606060606060606060606060606070606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060706060606060606060606060606060606060606060606060606060606060606 070606060706060607060606060606060606060606070606060706060606060606060606060606 060606060606060606060606060607060607060606060706070606060606060606060606060607 060606060606060606060606060606060706060606060606060606060606060606060606060706 060606060606060606060606060606060606060606060606090A0A2A2A2E25282A282A2F2F2E35 0606070100020D0C10101014131318121419111317121317131417131316131315131417131419 131417131417131418141419131518141417151516141417131318131418141518131418151519 15151915151815151814141713141913141A141518151517151516151516161517151618151517 16151815161914151914151914151915171A14161B16161A151619161619141519141517131315 14141714141A1415191416171514171414181314161010130202030D0F12393C42303339191B1E 050303060606060606060606060606060606060606060606060606060607060606060706070706 060606060606060606060606060707060607060606070606070606060606060606070606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060706060706060606060606060706060606060606060606060607060606060706060706 060606060606060606060706060606060706060606060606060607060607060606060606060606 060607060606060606060606060606060606070606060606060606060606060606060606060606 060607060606060606060606060606060606060606060606060606060606060606060606060606 060606060607060607060606060606060606060606060606060606060606060706060706060606 060606060606060606060606060706060606060606060706070606060606060606070606060606 060606060606060606060706060606060606060606060606060606060606060606060606070606 070706060606060606010202323232E2E0DDFAF7F3F6F3EFF6F3EFF6F3F0FBF8F4D9D7D39F9E9C 8A89877675746262625353534343433333342526271819191515171313142C2F2E7B7E7D818282 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 0000000000000000000000000000002A2C2C2C2C312F31364546486A6B6D78797C737375353536 1718182021202728273131313F3F3F5857566867667A79788E8E8C9F9D9BB8B6B3EEEBE7F9F6F2 F6F3EFF6F3EFF8F5F1FFFCF88E8D8B030302060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606070606060606060606060606 060606060606060606060606070606060606060606060606060606060606060606060606060606 060606070606060606060606060606060606060706060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060706060606060606 060606060606060606060606060606060606060606060606060606060607060606060606060606 060706060606060706060706060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060607060606060606060606060606070606060606 060606060606060607060607060606060606060606060706060606060606060606070606060707 060606060606060606060606070606060606060606060607060606060607060606060606060606 0606060606060606070606060606060707070303031F202340424B31353E60627074747D3E3F42 2021251A181E19191C1B1C201D1B231D1F231F20221E1E222021242020251D1D231D1E241B1B23 1C1D241D1D231D1F221D1D211E1F211C1D211F1F241F1F221E1E211D1D211A1A1F18181F1A1B1F 1A1B1D1B1B1E191B1F1C1D211D1D211B1B1E1C1C1E1B1B1D1A191C19191D19191E1A1A1E1A1A1E 181A1F191A1E1B1C1F1A1B1E18191C191A1C191A1E16191E18191C191A1C18181B18181C17171E 16181C14151914141914151A1414181B1B1D3E3F427B7D86676974393D43121214020202070707 060606060706060606060606060606060606060606060606060606060606060606060606060606 060606060606060607060606060606070706060606060606060606060606060606070606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060706060706060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060706060606060606060606060606060606060606060606060706060706060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060607060606060606060606060706060606060606060606060606060606060606070606060606 060606060606060606060606060606060607060607060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606070606060606060707 060606010101313231E2E0DDFAF7F3F6F3EFF6F3EFF6F4F0FBF8F4D9D6D3A09F9D8C8B8A777776 64646355545544444433333527262719191A151616131414282C2C7B7D7D838381000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 00000000000000000030303025262A1F2024404044696A6D7778796F7071313232171919202121 2727283030313E3F3F5656566766657B7A798F8E8C9F9E9DB8B6B4EEEBE7F9F6F2F6F3EFF6F3EF F8F5F1FFFCF88C8B88020202060606060606060607060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606070606060606060606060606070606 060606060606060606060606060706060607060606060606060606060606060607060606060606 060606070606060606070606060606060606060606060606060606060606060606060706060606 060606060606060606060706060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060706060606060606060606060606060606060606060606 060606060606060607060607060606060606060606060606060606060606060606060607060607 060606060606060606060606060606060606060606070607060606060606060606060706060706 060606070606060606070706060606070606070607060606070606060606060606060606060606 0606060606060606060606060607060305063C3E4463656F696E779C9EA9AEAEBAA7A7B29E9FA8 9C9DA6A1A1ABA2A2ACA4A4AEA0A0AAA0A0ABA3A4AEA2A5AFA4A4AFA2A3ADA1A2ABA3A3ACA2A2AB A1A2AAA2A4AAA2A4ABA0A0A9A3A3ABA2A1A9A5A4ACA4A4ADA1A1A9A0A0A89FA0A8A0A1A9A2A3AB A0A0A9A0A1AAA2A3ABA0A0A8A1A1A8A0A0A7A2A1A89F9FA69D9EA49E9FA69C9EA59D9EA59D9DA4 9E9FA59C9EA49B9CA397989F9A9BA29B9EA49B9DA49D9EA59C9DA39D9DA49B9BA39B9CA39A9CA2 96979E97989E9B9BA3A2A3ABAEAFB8989AA47476803B3D44020202060606060607060606060607 060606060607060606060606060606060606060606070607060606060606060606060606060606 060606060606060606060706060606060607060606060606060606060606060606060606060606 060606060606060606060606060607060606060606060606060606070606060606060606060606 060606060606060606060606070606060606060606060606060606060606060606070606070606 060606060606060606060606060706060706060606060606060606060606060606060606060607 060606070606060606060606060606060706060606060606060606060606060606060606060606 060606060606060606060606060606060606070606060606060606060607060606060606070606 060606060606060606060606060606060606060606060606060606060606060606060606060606 070607070606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606070707060606010101 313230E2E0DCFAF7F3F6F3EFF6F3EFF7F4F0FBF8F4D9D7D3A2A09D8E8C8B787878646464555555 434445333334272628191A1B16171714141425292B757A7A828282000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 00000035363826262B2221274242466B6A6D79787B70707230313118191A212121282828313133 4040405757566767667A7A788F8D8B9F9E9CB8B6B4EEEBE7F9F6F2F6F3EFF6F3EFF8F5F1FEFCF8 8B8987010202050606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060706060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060706060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060706060606060606060606060606060606 060606070606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060706070606060606060606060606060606060606060606060706060606 060606060606060606060606060606060606060706060606060606060606060606060606060606 060606060606060606060606060606060606070606060606060606060606060606060606060607 0606060606060607070706060606064B4D54878A968E929B9498A39FA3AEA4A6B2A6A8B3A8AAB4 A8AAB4A7A9B2A6A7B0A7A8B2ABACB6ABACB5AAABB4A8AAB3A9AAB3A9AAB3AAABB2A7A9B1AAABB3 AAACB5A9AAB4A9AAB3ABABB5A9ABB4A7A9B3ACACB7ABABB5AAAAB4AAACB6A9AAB3AAABB5AAABB5 AAABB5ABACB6ACAEB7A8ABB5AAAAB5ADADB5ACADB5ACACB6ACACB6AAAAB6AAABB6A9ACB5AAABB4 AAAAB5AAABB6A9AAB3ABADB5AAACB6A9ACB5ACADB6ABABB6AAACB6AAACB6AAAAB5ABADB5A9ACB5 A8A9B4A0A3AF959AA491969F63676D0D0D0F020202070707060606060606060606060606060606 060706060606060606060606060607060606060606060606060606060606060606060606060606 060606060706060606070606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606070606060606060606060606060606060706060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606070706060606060606060606060606060607060606060606 060606060606070607060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060607070606060606060606060606 060607060606060606060706060606060606060706060606070607060606060606060606060606 060606070606070606060606060606060606070606060706060606060606060606060606060606 07060606060606060606060706070606070606060606060607060606060602020131312FE0DFDC FAF7F3F6F3EFF6F3EFF7F4F0FBF8F4DAD8D4A3A29F8E8D8C7B7A79666665545455454546343435 2627271B1B1B161717131314272B2B767979828181000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000003A3A3C 25242A2221274545486C6C7079797C71717130313218191A212222282828303031414141575756 6666657B7B798F8D8B9F9D9BB8B6B4EDEAE6F8F5F1F6F3EFF6F3EFF8F5F1FEFCF88A8986010202 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606070606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606070606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606070606060606060606060706060606 060606060606060606060606060606070606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060706060606060606060607060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 06060607060709090902050531333674757C90939F989DA99A9FAA9A9DA9999EA79A9DA79F9FAB 9D9EAA9B9EA99D9FAAA1A3AD9FA1ABA0A4AC9EA2AA9FA3ACA1A3ACA1A1ACA0A1AC9FA3ADA0A4AD 9EA0ABA2A3AE9FA1AC9EA0AAA2A4AFA5A7B1A4A5B1A0A0ADA3A4AEA3A5AF9FA1ADA1A4AEA2A5B0 A2A6AFA0A4ADA2A5AEA2A3ADA0A4ADA1A5AF9FA4AEA0A3AEA1A3AEA2A5AEA1A4AD9CA0ABA1A2AE A2A4AE9FA2ACA0A4AF9FA3ACA1A4AD9EA2ADA1A4AEA1A4ADA1A2AEA1A2AA9D9FA89FA2AD9B9FAB 9496A065676C131213020201070909060606060606060606060606060606060606060606060606 060606060606060606060606060606060706060606060606060606060606060606060606060607 060606060606060606060706060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060706060606060606060606060606 060606060606060606060606060606060606060606060606060606070606060606060606060606 060606060606060606060606060606060606060606060606060606060606060607060606060606 060606060606060606060606060606060606060606060606060606060606060606060606070606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060706060706060606060606060606060606060606060606060606060606060606 060606060606060606070606060606060606060606060606060606060606060606060607060606 060706060606060606060606060606060606070707060606010101313130E0DFDCFAF7F3F6F3EF F6F3EFF6F3F0FBF8F4DAD8D4A4A2A18F8E8D7B7A796666655555554544453333342727281B1C1B 161717131414242828737676828181000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 00000000000000000000000000000000000000000000000000000000000038383925262A222126 4747496B6B6E79797B707071302F301A1A1B2323222729283031324141425857576666657B7A79 908E8DA09E9CB8B6B4EDEAE6F8F5F1F6F3EFF6F3EFF8F5F1FEFBF7898785010202060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060706060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606070606060606060606060606 060606060606060606060606060606060706060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0707070A0A0A0000000202021B1D1E3435373A3C3E383A3D37383B35363936383938383B353739 363739393A3C36383A37393B38393B38383B393A3D3A3C3E3A3B3E3B3C3F3D3E403B3C3E3D3E41 3E3D403E3E413F41443F40444041453D3F434040434141453C3D423F41454041463F4045404245 414346404145414246434548414346424347414347434548434549414346414246424346404347 42444844464A44474B42444844474845474944474B45484C45484B444849393A3E1B1A1C000000 020202070707060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060706060606060606060606060606060606070606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060706060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060607060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606010101313130E0DFDCFAF7F3F6F3EFF6F3EFF6F3EF FBF8F4DCD9D6A5A4A2908F8E7C7B7A6767675555544545453334342727281B1B1D161717121313 25292B75787A818182000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 0000000000000000000000000000000000000000000000002F2F3227272C2221264545486A696D 77777A6E6E702E30311A1B1C23232528292A3031324141425757586766657978778F8E8DA09E9C B8B6B4EDEBE6F8F6F1F6F3EFF6F3EFF8F6F1FDFBF7888684020102060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060706060606060606060606060606060607060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060706060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 070909060706000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000060606070909060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606070606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606070606060606060606060706060606 06060606060607060606060601010131312FE1DFDBFAF7F3F6F3EFF6F3EFF6F3EFFBF8F4DCDAD6 A7A5A391908E7B7B7A6868675554544545453233342627281C1C1E171718141414282E2D777B7B 828282000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 00000000000000000000000000000000000032323327272B23232647474A6D6E7079787B6D6C6F 2F30301B1C1E24242729292A3031334041415858586666657A79778E8E8B9F9E9BB8B6B3EDEAE6 F8F5F1F6F3EFF6F3EFF8F6F2FDFCF7868583010202060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060607060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 07070709090A0A09090A090A0A0A0A090A0A09090A090A0A0A090A09090A0A0A0A0A090A090A0A 090A0A090A0A090A0A0A0A0A0A0A0A09090A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0909090A0A0A0A 0A090A0A0A0A0A0A0A090A0A0A0A0A0A0A0A0A0A0A0A0A0A090A090A0A0A0A0A0A0A0A0A0A0A0A 0A09090A0A0A0A0A0A0A0A0A0A0A0909090A0909090A0A0A0A090A0A0A0A0A090A0A0A0A090A0A 090A0A0A0A0A0A090A0A090A0A0A0A090A0A0A0A0A090707060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060707060607010101313231E2DFDDFAF7F3F6F3EFF6F3EFF6F3EFFBF8F4DCDAD7A7A6A491908E 7D7C7B6867665555544545453333342527261B1C1D171718131414282D2C757979858382000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 00000000000000000000000032323527272B2221254646496D6E70797A7C6E6F703131311D1E1F 25262729292B31313441424458585A6666657978778F8D8BA09E9CB7B5B4EDEBE6F8F6F1F6F3EF F5F2EEF8F5F1FCFCF7858581020202060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060607060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060605060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060605060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606070706060606 010101313231E2E0DDFAF7F3F6F3EFF6F3EFF6F3EFFBF8F4DDDAD6A7A6A49190907C7B7A676766 5354534544453132332626261C1D1E161718121313292F2E737778828181000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 00000000000032353626272A21222546474A6E6F717A7A7C6F71723232331D1F2027282928292B 3132344243455758596767677979788D8C8B9F9D9BB7B5B3EDEAE6F8F5F1F6F3EFF5F2EEF8F5F1 FCFBF7848381010102060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060706060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606070606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606010101313130 E2E0DCFAF7F3F6F3EFF6F3EFF6F3EFFAF8F3DDDBD7A9A7A59392907D7C7B676666535353434444 3131322626281C1D1F171819141414292F2F757A79818181000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 35353725262A2021244547497071727878796E6F703232331E1F2128292B292A2C313235434446 5859596868687A78788C8B8B9D9C9AB7B4B2EDEAE6F8F5F1F6F3EFF5F2EEF8F5F1FBFAF6838280 020101060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606070707060606010101313030E2E0DCFAF7F3 F6F3EFF6F3EFF7F4F0FAF7F3DCDAD7A9A7A592918F7C7C7B666666535454424343303031242527 1C1D1E161819131314282D2D767B7A828281000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 00000000000000000000000000000000000000000000000000000000000000000038383925262A 21212547474A737274797A7B706F713233341F2123282A2C292B2E3133374446485A5B5C676867 7878778C8A8A9D9B99B6B4B1ECEAE6F8F5F1F6F3EFF5F2EEF8F5F1FBFAF682807E000101060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606010101313231E2E0DDFAF7F3F6F3EFF6F3EF F7F4F0F9F7F2DBD8D4A9A7A49391907D7C7B6767675454544242432F30312424251B1C1D161618 121213262B29727676818282000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 00000000000000000000000000000000000000000000000000000039393C26262A21222548494C 7172757B7B7C6F6F703232342022242A2C2E2A2D30323439454649595A5B6867687877778B8A89 9C9B99B6B4B2EDEAE6F8F6F1F6F3EFF5F2EEF8F5F1FBFAF6817F7D010101060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606070606070606060606060606060606060606060606 060606060606060606060707060606010101313231E2E0DCFAF7F3F6F3EFF6F3EFF7F4F0F9F7F2 DBD8D5A9A7A69392917C7C7B6767665554544242442E2F2F2424261C1C1E171819121314242929 737776828181000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 0000000000000000000000000000000000000000003C3C3D27262A21212547484C7373767B7B7D 6E6E703233342123262B2D2F2A2D2F32343844454859595A6667677877788B8A899C9B99B6B4B1 EDEAE7F9F6F2F6F3EFF5F2EEF8F5F1FBFAF6807E7C010001060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606070606060606060606060606060606060606 060606070707060607010100313231E2E0DDFAF7F3F6F3EFF6F3EFF7F4F0F9F7F2DBD8D4A9A7A5 9392907D7B7A6867675555544142422E2E2F2425261B1D1E161819121213252829767979838383 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 0000000000000000000000000000003D3F4026262A2223264A4C4E73737479797B6E6D6F343436 2123252A2C302A2C3131333644454958595C6767677778778A89889B9998B6B4B2EEEBE7F9F6F2 F6F3EFF5F2EEF8F6F2FAFAF67E7C7B000001060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606070606 060606010101313231E2E0DDFAF7F3F6F3EFF6F3EFF7F4F0F9F7F2DBD8D5A9A7A69392917D7C7B 6867675454544243432D2F2F2324261B1C1E171819121314232728767979858585000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 00000000000000000040404126262A2121274B4B4E74747578797A6D6E6F3334352023252B2E30 2C2E3333363A44464A585A5C6666677877778B8A889B9A98B5B3B1EDEAE7F9F6F2F6F3EFF5F2EE F8F6F2FAF9F57D7C79000100060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606010101 323231E2E0DDFAF7F3F6F3EFF6F3EFF7F4F0F9F6F2DBD8D4A9A7A69391907C7B7B666666535453 4141422D2D2E2223241B1C1D161719101212272B2C737776828382000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 0000003F3F412426292221264C4D4F7475767A7B7C6F70723334352223272B2D302B2F3233373B 44464A585A5B6565667776768B8A899A9A97B6B4B2EEEBE7F9F6F2F6F3EFF5F2EEF8F6F2F9F9F5 7B7978000000060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606010101323232E2E0DD FAF7F3F6F3EFF6F3EFF7F4F0F9F7F2D9D6D2A9A7A59292907B7C7B6767675353544141412C2D2E 2122241B1B1D161719121213242728737778838383000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF0000000000000000000000000000000000000000000000000000000000000000003D3D3E 2627292222254D4E507677797A7B7C7170723435362223262B2E302B2E3133363944474A595B5C 6566667676748A89889B9998B5B3B1EDEBE7F9F6F2F6F3EFF5F2EEF8F6F2F9F8F57A7877000000 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606010101313231E2E0DDFAF7F3F6F3EF F6F3EFF7F4F0F9F7F2D9D6D2A9A7A59291907C7C7B6767675252534040412C2D2E2124261A1C1E 161719121013252828707574828382000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 0000000000000000000000000000000000000000000000000000000000003C3C3F27262A222225 4D4D5078787B7B7A7B7171713434352122252B2D302A2E3232363A45474B585A5B646566757474 8887869A9896B4B2AFEDEAE6F9F6F2F6F3EFF5F2EEF8F6F2F9F8F5787675000000060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606000101323232E2E0DDFAF7F3F6F3EFF6F3EFF7F4F0 F9F7F2D9D6D2A9A7A59392917C7A7B6667675353544041412C2D2F2124261B1D1F151719101214 272B2B747977838585000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 0000000000000000000000000000000000000000000000003E3E3F2727292222254E4F517A797C 7B7B7D717172333336212326292B2E292C3131353B44464A57585B656667757574888786989796 B3B3B0EEEBE7F8F5F2F6F3EFF5F2EEF8F6F2F7F7F4767473000000060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606010001323132E2E0DDFAF7F3F6F3EFF6F3EFF7F4F0F9F6F2D9D7D3 A9A8A59392907B7A7A6766665252534041402A2B2D2122241A1C1E141619101012272C2C777C7C 838585000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 0000000000000000000000000000000000003F3F402525282121255051547F7E817B7B7D6F6F71 3434362124272A2C2D292B2F31333944454958595C656567757675878786979695B4B2B0EEEBE7 F8F5F1F6F3EFF5F2EEF8F6F2F7F6F4757372000000060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 070606060706010101323232E2E0DDFAF7F3F6F3EFF6F3EFF7F4F0F9F6F2D9D6D3A9A7A5939290 7C7B7B6666665151513F3F402A2A2C202123191D1E14171A101213272B2B757A7A858585000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 0000000000000000000000003E3E4123232520202253545783818578787A707072363638222327 2B2D302A2D3131353845474A595A5D646566747474878685989694B4B2B0EEEBE7F8F5F1F6F3EF F5F2EEF8F6F2F7F6F4757271000000060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 010101323232E2E0DDFAF7F3F6F3EFF6F3EFF6F3EFF9F6F2D7D5D1AAA8A69492917C7C7C676767 5151514040412B2C2D2022231C1D1F17181B101013252929767979838383000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 0000000000003F3F402020201C1C1D56575A868689767678706F713535382123282A2C31282B30 30333743464A57595C636465747373878685969594B4B1AFEEEBE7F8F5F1F6F3EFF5F2EEF9F6F2 F7F6F473726F000000060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606010101323232 E2E0DDFAF7F3F6F3EFF6F3EFF6F3EFF9F6F2D7D5D1AAA9A79393917D7C7B666666515151404041 2B2C2D2022241B1E1F16191B101013262927777A79838583000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 4040401B1A1D1716196162639190917473767071723335361E21252A2C31282B30303338424549 57575A636465737373868584969493B3B2AFEEEBE7F8F5F1F6F3EFF5F2EEF9F6F2F6F6F472716F 000000060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606010101323232E2E0DDFAF7F3 F6F3EFF6F3EFF6F3EFF9F6F2D7D5D2A9A8A69493927D7C7B6564645151523F4041292A2C202225 1A1C1F151719101012252726757776858585000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 00000000000000000000000000000000000000000000000000000000000000000041414218181A 110F1277797A97989A7373767273733334361F2024292B302A2D32313539434649575859646465 737474858584949493B3B2AFEEEBE7F8F5F1F6F3EFF5F2EEF9F6F3F6F6F371706E000000060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606010101323232E2E0DDFAF7F3F6F3EFF6F3EF F6F3EFF8F6F1D8D5D2A9A8A69392917C7B7B6564645151523F40412A2B2D1F2023191B1D151719 101013292C2B777B79858585000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 0000000000000000000000000000000000000000000000000000003F3F3F1210121919199B9B9C 99999B7373767474753435361E2023282A2F282A2E30343844474A575759626364737373858584 949393B3B1AFEFECE8F8F5F1F6F3EFF5F2EEF9F6F3F6F5F3706E6C000000060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606010101333232E2E0DDFAF7F3F6F3EFF6F3EFF6F3F0F9F6F2 D8D6D3ABA8A79492917C7B7A6363635151514041422A2B2D1E1F221B1C1D1517190F1010252927 7A7E7E868787000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000171717030305262626B3B3B3949395737276 7273753535381E202427292D26292E31343845474B575659626365737373858585959391B2B1AE EEECE8F8F5F1F6F3EFF5F2EEF9F6F3F6F5F36F6D6D000000060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606010100333231E3E1DEFAF7F3F6F3EFF6F3EFF6F3EFF8F6F1D7D5D2ABA9A7 9493917B7A7A6464655051523F4041292A2C1F20221B1C1E1617191010122428297A7F7E878987 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000090909B6B6B5929293737575727375343536 1F212627282D28292E31333944464A57595A646466717372848383939291B1B0ADEEECE8F8F5F1 F6F3EFF5F2EEF8F6F3F5F4F26D6C6B000000060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606010101333232E3E1DEFAF7F3F6F3EFF6F3EFF6F3EFF8F5F1D7D4D1AAA8A79492917B7C7A 6464655152534041422A2A2C1F21221B1B1F15171A0F1010272B2C757B79858585000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 0000000000000000000000000000000C0C0EB4B4B49394937373757172723534361E202626292E 25272D2E303642464857595B64646571717183828191908FB1B0ACEEEBE8F8F5F1F6F3EFF5F2EE F8F6F3F5F4F36D6C6A000000060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606010101 323232E3E1DEFAF7F3F6F3EFF6F3EFF6F3EFF8F5F1D7D4D1A9A8A79393927C7B7A666665515252 3F404228292B1E20221A1B1D15171A0F1010262928797D7A868686000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 0000000000000000000E0E0EB4B5B49494947574767374753435371D1E24282A2F25292E2D3035 42444856575A63636672727283828291908FB0AFACEEEBE8F8F5F1F6F3EFF5F2EEF8F6F2F4F4F2 6B6A68000000060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606010101323232E3E1DE FAF7F3F6F3EFF6F3EFF6F3EFF8F5F1D7D4D2AAA9A79393917B7A796666665252533F4041292B2D 1F2123191C1D1416190F1012282C2C797C7C878786000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 0000000E0E0EB5B5B59393937372747373753535371C1E2126282E262A2F2F3236434548555759 63636571717182828190908EB1AFADEFECE8F8F5F1F6F3EFF5F2EEF8F6F2F4F3F26A6867000000 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606010101323232E3E1DEFAF7F3F6F3EF F6F3EFF6F3EFF8F5F2D7D4D1AAA9A79493927B7B7B6565655252534041422A2B2D202123191C1D 1416190F10102C2E2E797B7C858585000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 0000000000000000000000000000000000000000000000000000000000000000000000000E0E0E B5B5B59392927474767373743536371E1F2425282C24282E30333844464958595C646566717172 8181818E8F8DAFADACEEECE8F8F5F1F6F3EFF5F2EEF8F6F2F3F3F2686765000000060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606010101323232E3E1DEFAF7F3F6F3EFF6F3EFF6F3EF F8F5F1D7D4D1AAA9A79493927D7C7B6565655051523F4041292B2D2021231A1C1D14161A0D0F10 282D2D7B7E7F878789000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 0000000000000000000000000000000000000000000000000000000000000F0F0FB6B7B7979798 7776787373743436371E1F2425282C23272B31333846494C57595B6364667171738180808E8C8C AFADABEEECE8F8F5F1F6F3EFF5F2EEF8F6F2F3F3F2686765000000060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606010101323232E3E1DEFAF7F3F6F3EFF6F3EFF7F4F0F8F5F1D6D3D0 AAA9A89494927D7C7B6666665252533F4042292B2D2020231A1B1D14161A0D0F10272C297D8182 878787000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 0000000000000000000000000000000000000000000000000F0F0FB6B6B6959597757677757577 3435361C1E20262A2D25282D31343A47494D56585A6263657071728181808E8D8CB0ADABEFECE8 F8F5F1F6F3EFF5F2EEF8F6F2F3F2F1676664000000060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606010101323232E3E1DEFAF7F3F6F3EFF6F3EFF6F4EFF8F5F1D6D3D1AAA9A8949392 7C7C7C6665675252543F4042292A2C1E20221A1B1E15181B0F10122426287D8181878787000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 0000000000000000000000000000000000000F0F0FB7B7B79595957474777676773635371C1D20 25272B24272C31343945484B5657596162636F6F6F80807F8D8C8BAEACAAEEEBE8F8F5F1F6F3EF F5F2EEF8F6F2F3F2F1676664000000060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 010101323232E3E1DEFAF7F3F6F3EFF6F3EFF7F4F0F8F5F1D6D3D0ABA9A89493927C7B7B666667 5152533F4041292A2C2022241A1C1E1416190D10102426287C7E7F898989000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 0000000000000000000000000F0F0FB7B7B79797977777787272743334351A1C1E25262A24272C 30333845474A56585A6162646F6E6F7F80808B8B8BAEACABF0EDE9F8F5F1F6F3EFF5F2EEF8F6F3 F2F2F0666462000000060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606010101323232 E3E1DEFAF7F3F6F3EFF6F3EFF6F3EFF8F5F1D7D4D1AAA9A79493927D7C7B6666665051523F3F41 292B2D1F2123191A1D15161A0D0F10282D2D7D7F81878789000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 0000000000000F0F0FB7B7B89695957575767373753334361B1D2124262924272B30333745474A 5657596162646F70717F7F7F8B8A8AAEADABF0EDE9F8F5F1F6F3EFF5F2EEF8F6F3F2F2F0656461 000000060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606010101323232E3E1DEFAF7F3 F6F3EFF6F3EFF7F4F0F8F5F1D6D3D0AAA9A79594927B7C7B6565665152533F4142292A2C1E2022 1A1A1E14161A0D0F10272D2C7A7C7E878687000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 0D0D0FB8B8B79796987674787777773637391D202423242A22262A2F3236444649575759616264 6F70707E7D7E8A8A89AEACAAF0EDE9F8F5F1F6F3EFF5F2EEF8F6F3F2F2F0646361000000060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606010101323232E3E1DEFAF7F3F6F3EFF6F3EF F7F4F0F8F5F1D5D3D0AAA9A79695937C7B7C6464655050523D3E40292A2D1F2023191B1E13161A 0F1012272D2B7B807F898789000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 0000000000000000000000000000000000000000000000000000000000000000000F0D0FB8B8B8 96959772727476767737373B1E202525292E22262B30323745484B57585A6263656F6F707E7D7D 8A8989ADADAAEFEDE9F8F5F1F6F3EFF5F2EEF9F6F3F1F1F0636260000000060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606010101323232E3E1DEFAF7F3F6F3EFF6F3EFF7F4F0F8F5F1 D5D3D0AAA9A79494937D7C7B6565655050513D3E40292A2C1F20241A1C1F15171A0D0F12262D2C 7C827F898987000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 0000000000000000000000000000000000000000000000000000000D0D0DB8B8B8979698727374 7676763637381D2024262A2F23262D31333747484D58585B6162646F706F7F7F7E8A8988ADACAA EFEDE9F8F5F1F6F3EFF5F2EEF9F6F3F0F0EF62615F000000060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606010101333232E3E1DEFAF7F3F6F3EFF6F3EFF7F4F0F8F5F1D6D3D0ABA9A8 9494947C7D7B6566665052523F4042292B2D1E2124181B1E1516190D1010252C2B7A7F7E898989 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 0000000000000000000000000000000000000000000D0D0FB8B8B9969698737577767676353537 1B1E2225282F24282D31343848494E585A5C6163646E6E6F7E7E7E8A8988AEACABF0EDE9F8F5F1 F6F3EFF5F2EEF9F6F3F1F0EF61605F000000060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606010101323232E3E1DEFAF7F3F6F3EFF6F3EFF6F4EFF8F5F1D6D3D1ABA9A79694937D7D7C 656566525254404143292A2C1E2021191C1E13161A0D0F10292E2F797C7E878786000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 0000000000000000000000000000000D0D0DB8B8B99696997474777777783637381B1D2024272C 23272C323539484B4F58595B6162636E6E6F7D7E7E888886ADACAAF0EEE9F8F5F1F6F3EFF5F2EE F9F6F3F1F0EF61605F000000060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606010101 323232E3E1DEFAF7F3F6F3EFF6F3EFF6F3F0F8F5F1D5D4D0AAA9A79594937C7B7C656565525254 3F4042292B2D1E2022191C1F1316190D0F10292E30828485898989000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 0000000000000000000D0D0DB8B9B998989B7575787676773536381B1D1F23262A22252A33363A 494B5058585B6161636D6E6F7D7E7E888787ADABA9F0EEE9F8F5F1F6F3EFF5F2EEF9F6F3F0F0EF 5F5F5D000000060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606010101323232E3E1DE FAF7F3F6F3EFF6F3EFF7F4F0F8F5F1D5D3CFAAA9A89595947D7C7B656567525354414144292B2E 1E2023191B1F1316190D0F10292D2E7E82828A8A8A000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 0000000D0D0DB8B9B8999A9D7475777373733436371B1D2223242A22252A33353A494A4D595A5C 6263656E6E6E7D7D7D878687ADAAA9F1EEEAF8F6F1F6F3EFF5F2EEF9F6F3F0EFEE5F5E5D000000 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606010101323232E3E1DEFAF7F3F6F3EF F6F3EFF7F4F0F8F5F1D5D3D0AAA9A79494927B7B7B6565665252534041422B2C2E1F2024191B1D 1315190D0F122B2F2E8184848B8A8B000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000D0D0D B8B8B998999D7575787575753435371D1F2324272B2226293234394A4B4E595A5B6263656E6F71 7E7D7E878686ACAAA8F1EEEAF8F6F1F6F3EFF5F2EEF9F6F3F0F0EE5F5F5D000000060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606010101313131E2E1DEFAF7F3F6F3EFF6F3EFF6F4EF F8F5F1D5D3D1AAA8A79493937C7B7C6566665152523F40412A2B2D1E2024191B1D1315180D0F10 292E2E7D8180898989000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 0000000000000000000000000000000000000000000000000000000000000D0D0DB9B9B899989A 77777878777937373A1B1D2223272C22242B3334394A4B4E595A5C6363666F6F6F7E7E7E868585 ACAAA8F1EEEAF8F5F1F6F3EFF5F2EEF9F6F3EFEFEE5D5C5B000000060606060606060606060606 060606060606060606060605060505060505060505060505060505060505060505060505060505 060505060505060505060505060505060505060505060505060505060505060505060505060505 060505060505060505060505060505060505060505060505060505060505060505060505060505 060505060505060505060505060505060505060505060505060505060505060505060505060505 060505060505060505060505060505060505060505060505060505060505060505060505060505 060505060505060505060505060505060505060505060505060505060505060505060505060505 060505060505060505060505060505060505060505060505060505060505060505060505060505 060505060505060505060505060505060505060505060505060505060505060505060505060505 060505060505060505060505060505060505060505060505060505060505060505060505060505 060505060505060505060505060505060505060505060505060505060505060505060505060505 060505060505060505060505060505060505060505060505060505060505060505060505060505 060505060505060505060505060505060505060505060505060505060505060505060505060505 060505060505060505060505060505060505060505060505060505060505060505060505060505 060505060505060505060505060505060505060505060505060505060505060505060505060505 060505060505060505060505060505060505060505060505060505060505060505060505060505 060505060505060505060505060505060505060505060505060505060505060505060505060505 060505060505060505060505060505060505060505060505060505060505060505060505060505 060505060505060505060505060505060505060505060505060505060505060505060505060505 060505060505060505060505060505060505060505060505060505060505060505060505060505 060505060505060505060505060505060505060505060505060505060505060505060505060505 060505060505060505060505060505060505060505060505060505060505060505060505060505 060505060505060505060505060505060505060505060505060505060505060505060505060505 060505060505060505060505060505060505060505060505060505060505060505060505060505 060505060505060505060505060505060505060505060505060505060505060505060505060505 060505060505060505060505060505060505060505060505060605060606060606060606060606 060606060606060606060606010101343434E3E1DFF9F7F2F6F3EFF6F3EFF6F4EFF8F5F1D5D3D0 AAA9A79493927B7A7A6565655153533E4042282B2D1E2124191B1F1315190D0F122B2F2F828483 8A8989000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 0000000000000000000000000000000000000000000000000D0D0DB9B9B898989973747579797A 39393C1A1C2024272C23262D33353B4B4C505A5B5E6264666E6E6F7D7B7B858482ABAAA8F1EEEA F8F5F1F6F3EFF5F2EEF9F6F3EFEFEE5D5C5B000000060606060606060606060606060606050303 050303050505050503050503050503050503050503050503050503050503050503050503050503 050503050503050503050503050503050503050503050503050503050503050503050503050503 050503050503050503050503050503050503050503050503050503050503050503050503050503 050503050503050503050503050503050503050503050503050503050503050503050503050503 050503050503050503050503050503050503050503050503050503050503050503050503050503 050503050503050503050503050503050503050503050503050503050503050503050503050503 050503050503050503050503050503050503050503050503050503050503050503050503050503 050503050503050503050503050503050503050503050503050503050503050503050503050503 050503050503050503050503050503050503050503050503050503050503050503050503050503 050503050503050503050503050503050503050503050503050503050503050503050503050503 050503050503050503050503050503050503050503050503050503050503050503050503050503 050503050503050503050503050503050503050503050503050503050503050503050503050503 050503050503050503050503050503050503050503050503050503050503050503050503050503 050503050503050503050503050503050503050503050503050503050503050503050503050503 050503050503050503050503050503050503050503050503050503050503050503050503050503 050503050503050503050503050503050503050503050503050503050503050503050503050503 050503050503050503050503050503050503050503050503050503050503050503050503050503 050503050503050503050503050503050503050503050503050503050503050503050503050503 050503050503050503050503050503050503050503050503050503050503050503050503050503 050503050503050503050503050503050503050503050503050503050503050503050503050503 050503050503050503050503050503050503050503050503050503050503050503050503050503 050503050503050503050503050503050503050503050503050503050503050503050503050503 050503050503050503050503050503050503050503050503050503050503050503050503050503 050503050503050503050503050503050503050503050503050503050503050503050503050503 050503050503050503050503050503050503050505050303050303060505060606060606060606 060606060606000000363636E4E3E0F9F7F2F6F3EFF6F3EFF6F4EFF8F5F1D5D3D1AAA9A7959392 7C7B7B6565655051523E3F4128292D1E2123191B1F13151A0D0D10292E2E8385858B8B8B000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 0000000000000000000000000000000000000D0D0DB9B9B999999B72737577797938393B1C1E21 23242B22242A33373B4B4D515A5C5E6365666E6E6F7C7C7C848483AAAAA7F1EEEAF8F5F1F6F3EF F5F2EEF9F6F3EFEFEE5D5C5B0000000606060606060606060606060503030709090E1014101519 111519111519111519111519111519111519111519111519111519111519111519111519111519 111519111519111519111519111519111519111519111519111519111519111519111519111519 111519111519111519111519111519111519111519111519111519111519111519111519111519 111519111519111519111519111519111519111519111519111519111519111519111519111519 111519111519111519111519111519111519111519111519111519111519111519111519111519 111519111519111519111519111519111519111519111519111519111519111519111519111519 111519111519111519111519111519111519111519111519111519111519111519111519111519 111519111519111519111519111519111519111519111519111519111519111519111519111519 111519111519111519111519111519111519111519111519111519111519111519111519111519 111519111519111519111519111519111519111519111519111519111519111519111519111519 111519111519111519111519111519111519111519111519111519111519111519111519111519 111519111519111519111519111519111519111519111519111519111519111519111519111519 111519111519111519111519111519111519111519111519111519111519111519111519111519 111519111519111519111519111519111519111519111519111519111519111519111519111519 111519111519111519111519111519111519111519111519111519111519111519111519111519 111519111519111519111519111519111519111519111519111519111519111519111519111519 111519111519111519111519111519111519111519111519111519111519111519111519111519 111519111519111519111519111519111519111519111519111519111519111519111519111519 111519111519111519111519111519111519111519111519111519111519111519111519111519 111519111519111519111519111519111519111519111519111519111519111519111519111519 111519111519111519111519111519111519111519111519111519111519111519111519111519 111519111519111519111519111519111519111519111519111519111519111519111519111519 111519111519111519111519111519111519111519111519111519111519111519111519111519 111519111519111519111519111519111519111519111519111519111519111519111519111519 1115191115191115191115191115180F13160A0A0A030303050505060606060606060606060606 000000363636E4E3E0F9F7F2F6F3EFF6F3EFF6F4EFF8F5F1D5D3D0A9A8A69393927B7B7B656565 5050513D3E40282B2D1F2124191C1F1216190D0D10282C2F8084848A8A89000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 0000000000000000000000000D0D0DBBBBBA99999A74757778787938393B1C1D2323242A212429 34373C4A4C505B5C5E6464666F6F707D7D7D858485AAAAA8F1EEEAF8F5F1F6F3EFF5F2EEF9F6F3 EEEEED5C5B5A0000000606060606060606060503030D0F121920271E262D1E272E1E262F1E262F 1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F 1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F 1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F 1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F 1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F 1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F 1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F 1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F 1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F 1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F 1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F 1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F 1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F 1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F 1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F 1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F 1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F 1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F 1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F 1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F 1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F 1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F 1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F 1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F1E262F 1E262F1E262F1E272E1E262E1B2229101417050303060605060606060606060606000000363636 E4E3E0F9F7F2F6F3EFF6F3EFF6F4EFF8F5F1D5D3D1A9A8A69292917A797A6566665153543F4041 28292B1F22251A1C1E1214170D0F102C30318183848B8B8A000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 0000000000000D0D0DBBBAB99A9A9A76757879787937383A1B1E2224282C22262A33363B4C4E51 5B5D5F6465676E6E6F7D7D7D848484ABAAA8F1EEEAF8F5F1F6F3EFF5F2EEF9F6F3EEEEED5C5B5A 0000000606060606060503020A0D0D1C232A1E262E1D252C1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1E242D1D262D0F1214030302060606060606060606000000363636E4E3E0F9F7F2 F6F3EFF6F3EFF6F3F0F8F5F1D6D3D0A9A8A69392917B79796465655053543E414227292B1F2124 181B1F1214180D0F122C31308185858D8D8D000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 0C0C0CBAB9B999999A7271757877783737391C1E2323262C22262B32363A4C4E525D5D61666669 6F70707D7D7C838483ABAAA9F2EFEBF8F6F1F6F3EFF5F2EEF9F7F3EDEEEC5B5A58000000060606 060506050303161C201D262D1C232A1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C232A1D262C1A2127060607050505060606060606000000363635E4E3E0F9F7F2F6F3EFF6F3EF F6F3F0F8F5F1D6D4D0A8A7A69291907A7A7A6566665152533E4042282A2D1D1E23171A1F131519 0C0D102C30308185858B8B8B000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000242424BCBCBC 9B9B9D75757875757737393A1B1E2323242B22242A34373C4D4E525C5D606666686F70707D7C7C 838383ABAAA8F2EFEBF9F6F2F6F3EFF5F2EEF9F7F3EDEDEC59585700000006060605030307070A 1B21291D252C1C242B353636696C6D777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C 777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C 777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C 777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C 777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C 777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C 777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C 777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C 777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C 777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C 777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C 777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C 777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C 777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C 777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C 777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C 777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C 777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C 777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C 777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C 777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C 777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C 777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C 777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C 777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C777B7C696C6D3536361C242B1D242B 1D242C0D0F10030202060607060606000000373735E6E4E1F9F6F2F6F3EFF6F3EFF6F3EFF8F5F1 D6D4D0A8A6A591908F7A7979646565505153404143292A2D1D1F23181B1D1215190D0F102F3232 87898A8D8D8E000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000404244404144B9B7B89E9DA078797A 7776773737381C1D2122242B20232833373A4C4E515D5D5F6666686F70707C7C7C828281ACA9A8 F2EFECF9F6F2F6F3EFF5F2EEF9F7F3EDEDEC595857000000060606050303090A0A1B22291D252C 1C242B6A6C6E767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B 767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B 767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B 767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B 767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B 767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B 767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B 767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B 767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B 767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B 767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B 767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B 767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B 767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B 767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B 767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B 767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B 767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B 767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B 767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B 767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B 767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B 767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B 767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B 767A7B767A7B767A7B767A7B767A7B767A7B767A7B767A7B696B6D1C242B1C242B1C242C0E1013 0302020606070606060000003A3A39E6E6E2F9F6F2F6F3EFF6F3EFF6F4EFF8F5F1D5D3D0A8A7A5 9191907978786364645051533F4042292B2E1D2023181B1E1214180D0F122B2F2F8185858D8E8E 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 0000000000000000000000000000000303036061666C6B71B5B4B59F9E9F77777979797937383A 1B1D222224292123273235384C4D515C5D5F6667697071727D7D7D838283ABAAA8F2EFEBF9F6F2 F6F3EFF5F2EEF9F7F3EDEDEC585755000000060606050303090A0A1B22291D252C1C242B75797B 75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B 75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B 75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B 75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B 75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B 75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B 75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B 75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B 75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B 75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B 75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B 75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B 75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B 75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B 75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B 75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B 75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B 75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B 75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B 75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B 75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B 75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B 75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B 75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B75797B 75797B75797B75797B75797B75797B75797B75797B1C242B1C242B1C242C0E1013030202060607 0606060000003A3A39E6E5E2F9F6F2F6F3EFF6F3EFF6F3EFF8F5F1D6D3D0A7A6A590908F797878 6363654E4F513E3F41292B2E1F2124181A1E12161A0D0F122B2E2E8185858B8B8B000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000030303858689ABAAADB1AFB19A9A9D7575777B7B7C393A3B1B1E22222529 2123273235394D4E525C5D606566696F6F707C7C7C828382AAA9A8F2EFECF9F6F2F6F3EFF5F2EE F9F7F3EDEDEC585755000000060606050303090A0A1B22291D252C1C242B74787A74787A74787A 74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A 74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A 737779686B6C63666771747674787A74787A74787A74787A74787A74787A74787A74787A74787A 74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A707375 686B6D6D717274787A74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A 74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A 74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A 74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A 74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A 74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A 74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A 74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A 74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A6C70716B6F70 6B6F706B6F706F727474787A74787A74787A74787A6F72746B6F706B6F7070747674787A74787A 74787A6C6F716B6F706B6F7073777974787A74787A74787A74787A74787A74787A74787A74787A 74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A 74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A 74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A 74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A 74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A 74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A 74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A 74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A 74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A74787A 74787A74787A74787A74787A74787A1C242B1C242B1C242C0E1013030202060607060606000000 3A3A39E6E5E2F9F6F2F6F3EFF6F3EFF6F3EFF8F5F1D5D3D0A7A6A5919090797979646465505052 3E4042282A2C1F2225191C2013171B0E10132C30318587878E8E8E000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 0000000303037C7D82828086A6A5A69E9EA0747576797A7A38393B1A1E2123262D22242A35373B 4E51545E5F616666677070717C7C7B828180ABAAA8F2F0ECF9F6F2F6F3EFF5F2EEF9F7F3EDEDEC 575755000000060606050303090A0A1B22291D252C1C242B737778737778737778737778737778 737778737778737778737778737778737778737778737778737778737778737778737778737778 737778737778042A65042964042863737778737778737778737778737778585A5B282828212121 2121212121213738386B6E70737778737778737778737778737778737778737778737778737778 737778737778737778737778737778737778737778737778737778737778525456212121444546 737677737778737778737778737778737778737778737778737778737778737778737778737778 7377787377787377787377787377787377787377787377787377787377787377787377785F686F 3F52652B41611E3662112B62112B621E36622C41613F52655E686F737778707577737778737778 737778737778737778737778737778737778737778737778737778737778737778737778737778 737778737778737778737778737778737778737778737778737778737778737778737778737778 7377787377787377787377787377787377787377787377787377787377784547480C0C0C555759 7377787377787377785254551A1B1C0A0A0A191A1B4D4F50737778737778737778737778737778 737778737778676A6B2425260C0D0D13131334363771757673777873777861646520212109090A 16181837393A7276777377787377787377787377787377787377780E0F10020202020202020202 0303031D1E1E4244457174767377782B2C2C0202020202023334357377787377786C6F70030303 02020202020266696B737778737778737778737778737778737778737778737778737778737778 737778737778737778737778737778737778737778737778737778737778737778737778737778 737778737778737778737778737778737778737778737778737778737778737778737778737778 737778737778737778737778737778737778737778737778737778737778737778737778737778 737778737778737778737778737778737778737778737778737778737778737778737778737778 737778737778737778737778737778737778737778737778737778737778737778737778737778 737778737778737778737778737778737778737778737778737778737778737778737778737778 737778737778737778737778737778737778737778737778737778737778737778737778737778 7377787377787377787377787377783439411F242F1E232E1E232E1E232E1E232E1E232E1E232E 1E232E1E232E1E232E1E232E1E232E1E232E1E232E1E232E1E232E1E232E343941737778737778 7377787377787377781C242B1C242B1C242C0E10130302020606070606060000003A3A39E6E5E2 F9F6F2F6F3EFF6F3EFF6F3EFF8F5F1D5D3D0A7A6A59190907978786363644F50513D3F4027292B 1E20231A1C201216190E101227292C8485868E8E8D000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000060606 5C5D6039393E9D9D9EA1A0A27474767C7D7D3B3C3F1B1E2123272B22252936383D4F51545D5E60 6666677070707C7C7C828281ADABA9F3F0ECF8F6F1F6F3EFF5F2EEF9F7F3ECECEB555553000000 060606050303090A0A1B22291D252C1C242B727577727577727577727577727577727577727577 727577727577727577727577727577727577727577727577727577727577727577727577727577 0E466F1356740D436F727577727577727577727577585B5C212121202020363636474747323232 2020202A2B2B6E7273727577727577727577727577727577727577727577727577727577727577 7275777275777275777275777275777275777275777275776163644747475A5B5B727577727577 727577727577727577727577727577727577727577727577727577727577727577727577727577 72757772757772757772757772757772757772757772757760696F2C44600D2A60012B64093668 0D436C0B4A700B4A700D436C093668012B640C2A602C4360606A6F727577727577727577727577 727577727577727577727577727577727577727577727577727577727577727577727577727577 727577727577727577727577727577727577727577727577727577727577727577727577727577 72757772757772757772757772757771747647494A343636070808000000505252727577727577 5C5F6002020203030328282804040402020256595A727577727577727577727577727577717576 1213130101011F1F1F10101001010133343572757766696A0A0A0A0303032F2F2F1D1D1D010101 3234357275777275777275777275777275777275770D0D0D0000002929293535352C2C2C0B0B0B 0101013A3C3D7275772A2A2A000000030303171818727577727577515354000000030303000000 656869727577727577727577727577727577727577727577727577727577727577727577727577 727577727577727577727577727577727577727577727577727577727577727577727577727577 727577727577727577727577727577727577727577727577727577727577727577727577727577 727577727577727577727577727577727577727577727577727577727577727577727577727577 727577727577727577727577727577727577727577727577727577727577727577727577727577 727577727577727577727577727577727577727577727577727577727577727577727577727577 727577727577727577727577727577727577727577727577727577727577727577727577727577 727577727577727577727577727577727577727577727577727577727577727577727577727577 72757772757772757720252F486E34386B1D386B1D386B1D386B1D386B1D386B1D386B1D386B1D 386B1D386B1D386B1D386B1D386B1D386B1D386B1D49703420252F727577727577727577727577 7275771C242B1C242B1C242C0E10130302020606070606060000003A3A39E6E5E2F9F6F2F6F3EF F6F3EFF6F3EFF8F5F1D5D3D0A7A5A491908E7877786364644E50513C3E3F27292C1E2023191D20 13171B0E10132D2E3087898A8E8E8E000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF0000000000000000000000000000000000000000000000000000000606065758571F2024 9D9D9FA2A2A37474767B7A7C3A3B3E1C1E2323272B21242936383D5051545D5D5E6566676F6F6F 7C7B7B828181ADAAA9F3F0ECF8F6F1F6F3EFF5F2EEF9F7F3ECECEB555453000000060606050303 090A0A1B22291D252C1C242B707475707475707475707475707475707475707475707475707475 707475707475707475707475707475707475707475042A650429640427637074750F4D71145D76 0E49707074757074757074756D7173282828202020575757717272707273717272333333202020 5254557074755355563334342A2A2A38393A4E50516F73757074754243443435365F62643B3C3D 484A4B4243443435365F62643B3C3D484A4B585A5B3435354E4F507074756E72744A4C4D2E2F2F 2A2B2B3B3C3C676A6C707475555758343536565859464748343535707475707475707475707475 7074757074757074757074757074754E5D681A3460012D651851712B61764B6D7965757C767C7F 767C7F66767C4B6D792B6176195171012E651A34604E5D68707475707475707475707475707475 707475707475707475707475707475707475707475707475707475707475707475707475707475 707475707475707475707475707475707475707475707475707475707475707475707475707475 7074757074757074756C70720C0D0D0C0C0C0303030000004F51517074757074752F3131000000 4A4A4A7072724E4E4E010101292A2B7074756C6F713F4142404243707475535657000000242424 7071716E6F6F0505050808086C70713F42430000002828287072737071710A0A0A0303036A6E6F 7074757074757074757074757074750D0D0D00000058595A7072737072724343430000001B1B1C 707475292A2A0000001919190202026B6F70707475363738090909111111000000646768707475 707475707475707475707475707475707475707475707475707475707475707475707475707475 707475707475707475707475707475707475707475707475707475707475707475707475707475 707475707475707475707475707475707475707475707475707475707475707475707475707475 707475707475707475707475707475707475707475707475707475707475707475707475707475 707475707475707475707475707475707475707475707475707475707475707475707475707475 707475707475707475707475707475707475707475707475707475707475707475707475707475 707475707475707475707475707475707475707475707475707475707475707475707475707475 707475707475707475707475707475707475707475707475707475707475707475707475707475 70747524293362794F587A3F587A3F587A3F587A3F587A3F587A3F587A3F587A3F587A3F587A3F 587A3F587A3F587A3F587A3F587A3F637B502429337074757074757074757074757074751C242B 1C242B1C242C0E10130302020606070606060000003A3A39E7E5E2F9F6F2F6F3EFF6F3EFF6F3EF F8F5F1D5D3D0A6A5A3908F8E7876776262624E4F513C3D40282A2D1E2023191C1F13171B0E1014 2E30308789888E8E8E000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 0000000000000000000000000000000000000000000000000606065959591D1E229A9B9EA1A2A2 7171737A7A7A393A3C1C1F2222262C20232835383B5051535D5D5E6667687070717D7C7C838282 ACABAAF3F0ECF8F6F1F6F3EFF5F2EEF9F7F3ECECEB535452000000060606050303090A0A1B2229 1D252C1C242B6F72746F72746F72746F72746F72746F72746F72746F72746F72746F72746F7274 6F72746F72746F72746F72746F72740E466F1357740C436F6F72740E4970125B750C476F6F7274 6F72746F72746164652121212424246F71726F72746F72746F72747172727171716F7172595C5D 2121212222223233332525252020204F50516F72743232322020202B2B2B202020444545323232 2020202B2B2B2020204445455052522020204243436F72734243442020202323232B2B2B202020 2A2A2A686C6D4C4D4E2020202B2B2B202020292A2A6F72746F72746F72746F72746F72746F7274 6F72746F7374737677213B63083D6B2F6376536F797C7D7D7577787275766F73746F7374727576 7577787C7D7D536F79306376083D6B213B637376777073746F72746F72746F72746F72746F7274 6F72746F72746F72746F72746F72746F72746F72746F72746F72746F72746F72746F72746F7274 6F72746F72746F72746F72746F72746F72746F72746F72746F72746F72746F72746F72746F7274 6F72746E72737273737273732425250000004E50516F72746F72741C1C1C0000005E60606F7274 6062630202021515156F727466696A0000000101016F72743F40410000003939396E71736E7273 1616160000005E6163353536000000393A3A6F72746E717311111100000056595A6F72746F7274 6F72746F72746F72740D0D0D00000057595A6F72746F72743A3B3C0000001E1F1F6F7274292A2A 0000003233330101015154556F72741C1C1D2223231212120000006366676F72746F72746F7274 6F72746F72746F72746F72746F72746F72746F72746F72746F72746F72746F72746F72746F7274 6F72746F72746F72746F72746F72746F72746F72746F72746F72746F72746F72746F72746F7274 6F72746F72746F72746F72746F72746F72746F72746F72746F72746F72746F72746F72746F7274 6F72746F72746F72746F72746F72746F72746F72746F72746F72746F72746F72746F72746F7274 6F72746F72746F72746F72746F72746F72746F72746F72746F72746F72746F72746F72746F7274 6F72746F72746F72746F72746F72746F72746F72746F72746F72746F72746F72746F72746F7274 6F72746F72746F72746F72746F72746F72746F72746F72746F72746F72746F72746F72746F7274 6F72746F72746F72746F72746F72746F72746F72746F72746F72746F72746F72746F7274292D37 687D55627E46627E46627E46627E46627E46627E46627E46627E46627E46627E46627E46627E46 627E46627E46627E466A7E55292D37373A424649506F72746F72746F72741C242B1C242B1C242C 0E10130302020606070606060000003C3C3CE9E7E3F9F6F2F6F3EFF6F3EFF6F3EFF8F5F1D5D3CF A6A5A390908F7979796362634F50523C3E4026282C1E21251A1C1F13171B0F10152D2E2F868888 8E8E8E000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 0000000000000000000000000000000000000606065858581E1E219A9A9CA2A2A472737378797A 393A3D1B1F2322272B1F22253436394F50535C5D5F6667687070717D7C7C828281ACABA9F3F0EC F8F6F1F6F3EFF5F2EEF9F7F3EBEBEA535351000000060606050303090A0A1B22291D252C1C242B 6D70726D70726D70726D70726D70726D70726D70726D70726D70726D70726D70726D7072052B64 0428630427636D70720F4C70145C760D49706D70720C466F1059750B446F6D70726D70726D7072 5557582121212E2E2E6D70726D70726D70726D70726D70726D70726D70724C4D4E3232325C5C5C 7071714C4C4C2020203F40406D70723232322020203131325E5E5E696A6B323232202020313132 5E5E5E696A6B50515220202041424266696B2222222323236B6B6B7171723D3D3D2020204D4F50 4C4D4E2020202424245555556666666D70726D70726D70726D70726D70726D70726D70726D7072 7476777C7C7D305A7368757A7275775260692C415F14295C061C5D061C5D14295C2C415F526069 73757768757A305A737C7C7D7476776D70726D70726D70726D70726D70726D70726D70726D7072 6D70726D70726D70726D70726D70726D70726D70726D70726D70726D70726D70726D70726D7072 6D70726D70726D70726D70726D70726D70726D70726D70726D70726D70726D70726D70726D7072 6D70726D70722323240000004D4F506D70726D70721212120000006163646D7072646768020202 0B0B0B6D7072686A6C2222222323236D70723536360000003E3F3F6D6F716D70721B1C1C000000 5456584646470000001415155B5D5F4648490101010000004F51526D70726D70726D70726D7072 6D70720D0D0D0000002627283133332526270505050000003636376D707229292A00000048494A 030303383A3A6B6E700404043B3C3C1112120000006264666D70726D70726D70726D70726D7072 6D70726D70726D70726D70726D70726D70726D70726D70726D70726D70726D70726D70726D7072 6D70726D70726D70726D70726D70726D70726D70726D70726D70726D70726D70726D70726D7072 6D70726D70726D70726D70726D70726D70726D70726D70726D70726D70726D70726D70726D7072 6D70726D70726D70726D70726D70726D70726D70726D70726D70726D70726D70726D70726D7072 6D70726D70726D70726D70726D70726D70726D70726D70726D70726D70726D70726D70726D7072 6D70726D70726D70726D70726D70726D70726D70726D70726D70726D70726D70726D70726D7072 6D70726D70726D70726D70726D70726D70726D70726D70726D70726D70726D70726D70726D7072 6D70726D70726D70726D70726D70726D70726D70726D70726D70726D70722D313A5C7A45507A31 507A31507A31507A31507A31507A31507A31507A31507A31507A31507A31507A31507A31507A31 507A315C7B452D313A7476772F333C6C6F716D70726D70721C242B1C242B1C242C0E1013030202 0606070606060000003E3E3DE9E7E4F9F6F2F6F3EFF6F3EFF6F3EFF9F6F2D5D3D0A6A5A38F8F8F 7979796363654E4F503D3F4127292D1E21251A1B2012161A0E10142B2C2D8586878E8E8E000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 0000000000000000000000000505055858581F1F209B9A9CA4A4A773737579797B393A3E1B1F24 24272B2123283436394F50535D5E606565676F70707C7D7C828282ADABAAF3F0ECF8F6F1F6F3EF F5F2EEF9F7F4EBEBEA535350000000060606050303090A0A1B22291D252C1C242B6B6F716B6F71 6B6F716B6F716B6F716B6F716B6F716B6F716B6F716B6F716B6F716B6F710F466F1356740C436F 6B6F710D4970125B750C466F6B6F710A436E0E577409406D6B6F716B6F716B6F7157595A212121 2C2C2C6B6F716B6F716B6F716B6F716B6F716B6F716B6F716D6F715F6061464848373839242425 2020203D3D3E6B6F713232322020205656576C6E706C6F713232322020205656576C6E706C6F71 4F5151202020414142595B5D2020202828283D3E3F3D3E3F3333332020203A3B3B4C4D4D202020 3C3C3C6E70716C6F706B6F716B6F716B6F716B6F716B6F716B6F716B6F716B6F716B6F71757778 7A7B7C5B6770384B620F275E012764033D6B014B71014B71023C6B0127640F275E374B625B6770 7A7B7C7577786B6F716B6F716B6F716B6F716B6F716B6F716B6F716B6F716B6F716B6F716B6F71 6B6F716B6F716B6F716B6F716B6F716B6F716B6F716B6F716B6F716B6F716B6F716B6F716B6F71 6B6F716B6F716B6F716B6F716B6F716B6F716B6F716B6F716B6F716B6F716B6F716B6F716B6F71 2323240000004C4E4F6B6F716B6F711212120000005F62636B6F716164660202020C0C0C6B6F71 6B6E706F70716F70716B6F713536360000003D3E3E6B6E706B6F711B1B1B0000005456576A6C6D 1515150000000101010101010202020000005658596B6F716B6F716B6F716B6F716B6F710D0D0D 0000000101010101010101010A0A0A2B2B2B686A6A6B6F712929290000004A4C4C1919191E1F1F 5457590000005354551112120000006063646B6F716B6F716B6F716B6F716B6F716B6F716B6F71 6B6F716B6F716B6F716B6F716B6F716B6F716B6F716B6F716B6F716B6F716B6F716B6F716B6F71 6B6F716B6F716B6F716B6F716B6F716B6F716B6F716B6F716B6F716B6F716B6F716B6F716B6F71 6B6F716B6F716B6F716B6F716B6F716B6F716B6F716B6F716B6F716B6F716B6F716B6F716B6F71 6B6F716B6F716B6F716B6F716B6F716B6F716B6F716B6F716B6F716B6F716B6F716B6F716B6F71 6B6F716B6F716B6F716B6F716B6F716B6F716B6F716B6F716B6F716B6F716B6F716B6F716B6F71 6B6F716B6F716B6F716B6F716B6F716B6F716B6F716B6F716B6F716B6F716B6F716B6F716B6F71 6B6F716B6F716B6F716B6F716B6F716B6F716B6F716B6F716B6F716B6F716B6F716B6F716B6F71 6B6F716B6F716B6F716B6F716B6F716B6F716B6F716B6F7132363F436A2C316514316514316514 316514316514316514316514316514316514316514316514316514316514316514316514436C2B 32363F44484F262A356A6E706B6F716B6F711C242B1C242B1C242C0E1013030202060607060606 0000003D3D3CE8E7E4F9F6F2F6F3EFF6F3EFF6F3EFF9F6F2D5D2D0A5A3A28E8E8D777778616263 4E4F513C3F4127292B1D1F23181B2013171A0F10142629288285848E8F8E000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 0000000000000505055959581D1D219A9A9CA4A4A57475777E7C7F3C3C3E1A1D2124272C212429 35373B5153565E5F61656566706E6F7D7C7C828281ACABA8F3F0ECF9F6F2F6F3EFF5F2EEFAF7F4 EAEAE9525050000000060606050303090A0A1B22291D252C1C242B696E6F696E6F696E6F696E6F 696E6F696E6F696E6F696E6F042963042763042662696E6F104B70135C760D4870696E6F0C446F 1058750A416D696E6F093E6D0B5373083C6B696E6F696E6F696E6F606364212121232323666A6B 696E6F696E6F696E6F50535443454555595A4B4E4F2122222626263B3C3C4040402020203D3D3E 696E6F3232322020205E6061696E6F696E6F3232322020205E6061696E6F696E6F4F5051202020 4041425457582020202727273637373637373637373737374748484B4C4D202020454546696E6F 696E6F696E6F696E6F696E6F696E6F696E6F696E6F696E6F696E6F696E6F696E6F6D7172737677 17316209456E2B5B74536D7A6F787D6F787D536C792B5B7409456E1630627175766D7172696E6F 696E6F696E6F696E6F696E6F696E6F696E6F696E6F696E6F696E6F696E6F696E6F696E6F696E6F 696E6F696E6F696E6F696E6F696E6F696E6F696E6F696E6F696E6F696E6F696E6F696E6F696E6F 696E6F696E6F696E6F696E6F696E6F696E6F696E6F696E6F696E6F696E6F696E6F232323000000 4B4E4E696E6F696E6F1B1B1B000000585B5C696E6F5A5E5F020202151515696E6F696E6F696E6F 696E6F696E6F3E4040000000353737686D6E696E6F1515150000005C5F60696D6F6B6C6C3E3E3E 2E2E2E4848481A1A1A000000646869696E6F696E6F696E6F696E6F696E6F0D0D0D000000414141 5454545B5B5B6F70706E6F70696D6F696E6F282929000000494B4B3131310606063A3C3D010101 666A6B1112120000005E6263696E6F696E6F696E6F696E6F696E6F696E6F696E6F696E6F696E6F 696E6F696E6F696E6F696E6F696E6F696E6F696E6F696E6F696E6F696E6F696E6F696E6F696E6F 696E6F696E6F696E6F696E6F696E6F696E6F696E6F696E6F696E6F696E6F696E6F696E6F696E6F 696E6F696E6F696E6F696E6F696E6F696E6F696E6F696E6F696E6F696E6F696E6F696E6F696E6F 696E6F696E6F696E6F696E6F696E6F696E6F696E6F696E6F696E6F696E6F696E6F696E6F696E6F 696E6F696E6F696E6F696E6F696E6F696E6F696E6F696E6F696E6F696E6F696E6F696E6F696E6F 696E6F696E6F696E6F696E6F696E6F696E6F696E6F696E6F696E6F696E6F696E6F696E6F696E6F 696E6F696E6F696E6F696E6F696E6F696E6F696E6F696E6F696E6F696E6F696E6F696E6F696E6F 696E6F696E6F696E6F696E6F696E6F696E6F373A4233601E1B56061B56061B56061B56061B5606 1B56061B56061B56061B56061B56061B56061B56061B56061B56061B560633601D373A421D222D 3B3F46696E6F696E6F696E6F1C242B1C242B1C242C0E10130302020606070606060000003D3D3C E8E7E4F9F6F2F6F3EFF6F3EFF6F3EFF9F6F2D5D3D0A5A4A28E8D8D7676766162624F50523C3F41 25282A1D1F23181A1F13161C0F1014272E2C868B898F9191000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 0505055959591F1F219A9A9BA3A3A37273747D7D7E3B3C3D1C1E2322252A20222737393D515256 5E5E606666677070717C7C7C838282ADABA9F3F0ECF9F6F2F6F3EFF5F2EEFAF7F4EAEAE951504F 000000060606050303090A0A1B22291D252C1C242B676C6E676C6E676C6E676C6E676C6E676C6E 676C6E676C6E0C416E1152730C3E6D676C6E0E456F1058750B416E676C6E0A3D6D0C5373083A6B 676C6E07376A094F7205376A676C6E676C6E676C6E686C6D2D2D2D202020434546676C6E676C6E 5E6264262626212121575A5B2D2E2F2020206060606E6F704748482020203D3D3D676C6E323232 2020205C5F60676C6E676C6E3232322020205C5F60676C6E676C6E4E50502020204041415D6061 2020202626266B6D6D6E6F706667675C5D5D6365664A4C4C202020454647676C6E676C6E676C6E 676C6E676C6E676C6E676C6E676C6E676C6E676C6E676C6E676C6E676C6E7275767B7C7E3C5B73 7B7C7D707374696D6F696D6F7073747B7C7D3C5B737B7C7E727576676C6E676C6E676C6E676C6E 676C6E676C6E676C6E676C6E676C6E676C6E676C6E676C6E676C6E676C6E676C6E676C6E676C6E 676C6E676C6E676C6E676C6E676C6E676C6E676C6E676C6E676C6E676C6E676C6E676C6E676C6E 676C6E676C6E676C6E676C6E676C6E676C6E676C6E676C6E676C6E2323230000004A4D4E676C6E 676C6E2D2E2E000000444647676C6E474A4B010101272727676C6E676B6D5F63655F6365676C6E 4E5051000000222223666B6D64696A04040404040465696B5C61624447485456576D6F70686A6B 0A0A0A090909686C6E676C6E676C6E676C6E676C6E676C6E0D0D0D0000005356566A6D6F696D6F 676B6D676C6E676C6E676C6E282929000000484A4B48494A000000111111161616676B6D121213 0000005D6062676C6E676C6E676C6E676C6E676C6E676C6E676C6E676C6E676C6E676C6E676C6E 676C6E676C6E676C6E676C6E676C6E676C6E676C6E676C6E676C6E676C6E676C6E676C6E676C6E 676C6E676C6E676C6E676C6E676C6E676C6E676C6E676C6E676C6E676C6E676C6E676C6E676C6E 676C6E676C6E676C6E676C6E676C6E676C6E676C6E676C6E676C6E676C6E676C6E676C6E676C6E 676C6E676C6E676C6E676C6E676C6E676C6E676C6E676C6E676C6E676C6E676C6E676C6E676C6E 676C6E676C6E676C6E676C6E676C6E676C6E676C6E676C6E676C6E676C6E676C6E676C6E676C6E 676C6E676C6E676C6E676C6E676C6E676C6E676C6E676C6E676C6E676C6E676C6E676C6E676C6E 676C6E676C6E676C6E676C6E676C6E676C6E676C6E676C6E676C6E676C6E676C6E676C6E676C6E 676C6E676C6E676C6E676C6E3B3F462C541B144604144604144604144604144604144604144604 1446041446041446041446041446041446041446041446042C541A3B3F467073746B6E70676C6E 676C6E676C6E1C242B1C242B1C242C0E10130302020606070606060000003E3D3CE9E7E4F9F6F2 F6F3EFF6F3EFF6F3EFF9F6F2D5D4D0A4A4A28E8E8D7777775F60614C4D4F3C3D4027292D1C1F22 181B1E14171C0E1014272C29888C8A919291000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000050505585858 1E1E209D9D9EA2A2A37172747C7D7D393A3B1B1E2222252A212428373A3D5051545D5E60666768 7171727D7C7C838282ACABAAF3F0ECF8F6F1F6F3EFF5F2EEFAF7F4EAEAE951504F000000060606 050303090A0A1B22291D252C1C242B666A6C666A6C666A6C666A6C04225E02205D021F5C666A6C 0C3F6D1055740B3C6D666A6C0C3B6B0D4F7208366A666A6C073369094970053067666A6C052E66 06446F042D65666A6C666A6C666A6C66696C565657202020212121323334363838222323202020 373737696B6D363636202020484A4B4E50512828282020203C3C3D666A6C3232322020205B5D5F 666A6C666A6C3232322020205B5D5F666A6C666A6C4E4F50202020404141676A6C313131202020 3A3B3C484A4B2A2A2A2121215557594A4B4C202020454646666A6C666A6C666A6C666A6C666A6C 666A6C666A6C666A6C666A6C666A6C666A6C666A6C666A6C666A6C717375787A7A4C59662B3E5C 0D20590D20592B3E5C4C5966787A7A717375666A6C666A6C666A6C666A6C666A6C666A6C666A6C 666A6C666A6C666A6C666A6C666A6C666A6C666A6C666A6C666A6C666A6C666A6C666A6C666A6C 666A6C666A6C666A6C666A6C666A6C666A6C666A6C666A6C666A6C666A6C666A6C666A6C666A6C 666A6C666A6C666A6C666A6C666A6C666A6C666A6C2323230000004A4C4D666A6C666A6C4F5051 0000001010113B3D3F1212120101014A4B4C666A6C5E6164010202020303666A6C686B6C080808 020202353738242626000000272727666A6C6366690A0B0B0808083C3E3F2123230101013C3C3C 666A6C666A6C666A6C666A6C666A6C666A6C0D0D0D000000525456666A6C666A6C666A6C666A6C 666A6C666A6C28282900000047494A5C5E600000000000002E2F2F666A6C1212120000005C5F61 666A6C666A6C666A6C666A6C666A6C666A6C666A6C666A6C666A6C666A6C666A6C666A6C666A6C 666A6C666A6C666A6C666A6C666A6C666A6C666A6C666A6C666A6C666A6C666A6C666A6C666A6C 666A6C666A6C666A6C666A6C666A6C666A6C666A6C666A6C666A6C666A6C666A6C666A6C666A6C 666A6C666A6C666A6C666A6C666A6C666A6C666A6C666A6C666A6C666A6C666A6C666A6C666A6C 666A6C666A6C666A6C666A6C666A6C666A6C666A6C666A6C666A6C666A6C666A6C666A6C666A6C 666A6C666A6C666A6C666A6C666A6C666A6C666A6C666A6C666A6C666A6C666A6C666A6C666A6C 666A6C666A6C666A6C666A6C666A6C666A6C666A6C666A6C666A6C666A6C666A6C666A6C666A6C 666A6C666A6C666A6C666A6C666A6C666A6C666A6C666A6C666A6C666A6C666A6C666A6C666A6C 666A6C666A6C3F434A3459221D4F0B1D4F0B1D4F0B1D4F0B1D4F0B1D4F0B1D4F0B1D4F0B1D4F0B 1D4F0B1D4F0B1D4F0B1D4F0B1D4F0B1D4F0B345B223F434A666A6C666A6C666A6C666A6C666A6C 1C242B1C242B1C242C0E10130302020606070606060000003D3E3CE8E6E4F9F6F2F6F3EFF6F3EF F6F3EFF9F6F2D5D3D0A3A2A18D8D8C7676755E5E5F4C4D4F3C3E4026282B1D2024191C2014171B 0E10132F31318C8E8C8D8E8E000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 0000000000000000000000000000000000000000000000000000000505055959591E1E1F9A9A9C A2A1A47576777E7E7F3B3B3D1A1C2023272B21242836383C5050535C5D5F6767687171727D7D7D 828282ABABA8F2F0ECF8F6F2F6F3EFF5F2EEFAF7F4EAEAE9504E4D000000060606050303090A0A 1B22291D252C1C242B65686A65686A65686A65686A0A2F670C416E082C6565686A0A3268093B6C 082F6665686A082B6507356A05276365686A042361042E6703216065686A021F5E022865021E5D 65686A65686A65686A65686A696B6D5656562626262020202020202020203C3C3C67686964686A 5859592828282121212626264747472020202D2D2D6367693232322020205A5C5E65686A65686A 3232322020205A5C5E65686A65686A4D4E4F20202040404164686A646465323232202020212121 2222224B4B4B686A6C494B4B20202045454665686A65686A65686A65686A65686A65686A65686A 65686A65686A65686A65686A65686A65686A65686A65686A6B6E6F707374112D60003B68003B68 112D607073746B6E6F65686A65686A65686A65686A65686A65686A65686A65686A65686A65686A 65686A65686A65686A65686A65686A65686A65686A65686A65686A65686A65686A65686A65686A 65686A65686A65686A65686A65686A65686A65686A65686A65686A65686A65686A65686A65686A 65686A65686A65686A65686A65686A222323000000494B4C65686A65686A686B6C363636010101 010101010101303030696B6C65686A5E606200000001010165686A64686A555555080808010101 01010116161663646565686A65686A4849490B0B0B010101020303272727696B6C65686A65686A 65686A65686A65686A65686A0D0D0D00000051535465686A65686A65686A65686A65686A65686A 28282900000047484965686A0A0A0A00000045464765686A1212120000005B5E5F65686A65686A 65686A65686A65686A65686A65686A65686A65686A65686A65686A65686A65686A65686A65686A 65686A65686A65686A65686A65686A65686A65686A65686A65686A65686A65686A65686A65686A 65686A65686A65686A65686A65686A65686A65686A65686A65686A65686A65686A65686A65686A 65686A65686A65686A65686A65686A65686A65686A65686A65686A65686A65686A65686A65686A 65686A65686A65686A65686A65686A65686A65686A65686A65686A65686A65686A65686A65686A 65686A65686A65686A65686A65686A65686A65686A65686A65686A65686A65686A65686A65686A 65686A65686A65686A65686A65686A65686A65686A65686A65686A65686A65686A65686A65686A 65686A65686A65686A65686A65686A65686A65686A65686A65686A65686A65686A65686A65686A 50535843464B42464B42464B42464B42464B42464B42464B42464B42464B42464B42464B42464B 42464B42464B42464B42464B43464B50535865686A65686A65686A65686A65686A1C242B1C242B 1C242C0E10130302020606070606060000003E3E3DE9E8E4F9F6F2F6F3EFF6F3EFF6F3EFF9F6F2 D6D4D1A5A4A38E8E8E7777776060614C4E4F3C3D40282A2D1C1F23171A1F14161B0F10142F3232 878A89918F8F000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 0000000000000000000000000000000000000000000505055858581F1F1F9E9D9FA3A4A6767678 7B7A7C3A3A3C191B1F23262A21232736373C4F50535C5D5E6566677070717D7D7E838282ADABA9 F3F0ECF8F6F1F6F3EFF5F2EEFAF7F4EAEAE94F4F4D000000060606050303090A0A1B22291D252C 1C242B646769646769646769646769727374727374727374646769727374727374727374646769 727374727374727374646769727374727374727374646769727374727374727374646769646769 646769646769646769686B6C7171716767675F5F5F6C6C6C6D6E6F656869646769686A6B707171 6565657171716B6D6E7373737071716367686F707073737366696A6467696467696F7070737373 66696A6467696467696A6C6D7373736C6E6E64676965686A6F70706969696363636F6F6F6A6C6D 6467696A6C6D7373736B6D6E646769646769646769646769646769646769646769646769646769 6467696467696467696467696467696467696467697173747B7C7D1532651532657B7C7D717374 646769646769646769646769646769646769646769646769646769646769646769646769646769 646769646769646769646769646769646769646769646769646769646769646769646769646769 646769646769646769646769646769646769646769646769646769646769646769646769646769 6467696467696467696D6E6E717171686A6B6467696467696467696A6C6C6C6C6C5B5B5B6B6B6B 6B6C6D63676864676965686971717171717164676964676967696B6E6E6E5E5E5E6363636E6F6F 646869646769646769696A6B6E6F6F5B5B5B6A6A6A6C6D6E636768646769646769646769646769 6467696467696F6F6F71717166696A6467696467696467696467696467696467696C6E6E717171 67696A6467696F7070717171686A6B6467696F7070717171656869646769646769646769646769 646769646769646769646769646769646769646769646769646769646769646769646769646769 646769646769646769646769646769646769646769646769646769646769646769646769646769 646769646769646769646769646769646769646769646769646769646769646769646769646769 646769646769646769646769646769646769646769646769646769646769646769646769646769 646769646769646769646769646769646769646769646769646769646769646769646769646769 646769646769646769646769646769646769646769646769646769646769646769646769646769 646769646769646769646769646769646769646769646769646769646769646769646769646769 6467696467696467696467696467696467696467696467696467696467696467696E7071717273 717273717273717273717273717273717273717273717273717273717273717273717273717273 7172737172737172736E70716467696467696467696467696467691C242B1C242B1C242C0E1013 030202060607060606000000414140EAE9E5F9F6F2F6F3EFF6F3EFF6F3F0F9F6F2D6D4D1A4A3A2 8E8E8E7676765F60614C4C4E3B3D3E25282C1D1F24171A1E13161B0F10152C2E2F888B89919191 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000050505595A591F1E1E9E9D9EA6A6A87474767B7C7B3B3C3D 1A1D212224281F212535373B4F50535C5C5E656566706F707D7D7E838382ADACAAF3F0ECF8F6F1 F6F3EFF5F2EEFAF7F4EAEAE94F4F4D000000060606050303090A0A1B22291D252C1C242B626667 626667626667626667626667626667626667626667626667626667626667626667626667626667 626667626667626667626667626667626667626667626667626667626667626667626667626667 62666762666761656764676865686A626668626667626667626667626667616567646869616567 626667626667626667626667626667626667626667626667626667626667626667626667626667 626667626667626667626667626667626667626667646768656869626667626667626667626667 626667626667626667626667626667626667626667626667626667626667626667626667626667 6266676266676266676266676266676266677475767B7D7E7B7D7E747576626667626667626667 626667626667626667626667626667626667626667626667626667626667626667626667626667 626667626667626667626667626667626667626667626667626667626667626667626667626667 626667626667626667626667626667626667626667626667626667626667626667626667626667 626667626667626667626667626667626667626667626667626667656869626667626667626667 626667626667626667626667626667626667626667616567646769636768626667626667626667 626667626667616567656869626667626667626667626667626667626667626667626667626667 626667626667626667626667626667626667626667626667626667626667626667626667626667 626667626667626667626667626667626667626667626667626667626667626667626667626667 626667626667626667626667626667626667626667626667626667626667626667626667626667 626667626667626667626667626667626667626667626667626667626667626667626667626667 626667626667626667626667626667626667626667626667626667626667626667626667626667 626667626667626667626667626667626667626667626667626667626667626667626667626667 626667626667626667626667626667626667626667626667626667626667626667626667626667 626667626667626667626667626667626667626667626667626667626667626667626667626667 626667626667626667626667626667626667626667626667626667626667626667626667626667 626667626667626667626667626667626667626667626667626667626667626667626667626667 626667626667626667626667626667626667626667626667626667626667626667626667626667 6266676266676266676266676266676266676266671C242B1C242B1C242C0E1013030202060607 06060600000042413FEAE9E4F9F6F2F6F3EFF6F3EFF6F3F0F9F6F2D6D4D1A5A3A18C8C8C747575 5E5E5F4A4C4D3A3B3E28292F1F2126181B2013161C0F10152B2C2F888989919191000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 0000000000000000000505055A5B5A1F1F209F9E9FA5A5A67576787B7A7B3C3D3F1C1F2222262A 20232737383D4F50535C5B5D6565667070707D7D7D838382ADACAAF3F0ECF8F6F1F6F3EFF5F2EE FAF7F4EAE9E94E4D4C000000060606050303090A0A1B22291D252C1C242B606566606566606566 606566606566606566606566606566606566606566606566606566606566606566606566606566 606566606566606566606566606566606566606566606566606566606566606566606566606566 606566606566606566606566606566606566606566606566606566606566606566606566606566 606566606566606566606566606566606566606566606566606566606566606566606566606566 606566606566606566606566606566606566606566606566606566606566606566606566606566 606566606566606566606566606566606566606566606566606566606566606566606566606566 606566606566606566606566606566606566606566606566606566606566606566606566606566 606566606566606566606566606566606566606566606566606566606566606566606566606566 606566606566606566606566606566606566606566606566606566606566606566606566606566 606566606566606566606566606566606566606566606566606566606566606566606566606566 606566606566606566606566606566606566606566606566606566606566606566606566606566 606566606566606566606566606566606566606566606566606566606566606566606566606566 606566606566606566606566606566606566606566606566606566606566606566606566606566 606566606566606566606566606566606566606566606566606566606566606566606566606566 606566606566606566606566606566606566606566606566606566606566606566606566606566 606566606566606566606566606566606566606566606566606566606566606566606566606566 606566606566606566606566606566606566606566606566606566606566606566606566606566 606566606566606566606566606566606566606566606566606566606566606566606566606566 606566606566606566606566606566606566606566606566606566606566606566606566606566 606566606566606566606566606566606566606566606566606566606566606566606566606566 606566606566606566606566606566606566606566606566606566606566606566606566606566 606566606566606566606566606566606566606566606566606566606566606566606566606566 606566606566606566606566606566606566606566606566606566606566606566606566606566 606566606566606566606566606566606566606566606566606566606566606566606566606566 6065666065666065666065666065661C242B1C242B1C242C0E1013030202060607060606000000 42413FEAE9E4F9F6F2F6F3EFF6F3EFF6F4F0F9F6F3D7D4D1A3A2A18C8C8B7575755E5F604B4C50 3C3D4028292E1E2025191C2013161C0F101525282B898B8A929291000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 0000000505055A5A5A202023A1A0A1A4A4A578797A7C7C7C3B3D3D1C1F2223262B21232736383B 4D4E515B5C5D656667706F707D7C7D848383ADACAAF3F0ECF8F6F1F6F3EFF5F2EEFAF7F4E9E9E8 4D4C4B000000060606050303090A0A1B22291D252C1C242B5F63655F63655F63655F63655F6365 5F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F6365 5F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F6365 5F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F6365 5F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F6365 5F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F6365 5F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F6365 5F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F6365 5F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F6365 5F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F6365 5F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F6365 5F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F6365 5F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F6365 5F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F6365 5F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F6365 5F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F6365 5F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F6365 5F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F6365 5F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F6365 5F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F6365 5F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F6365 5F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F6365 5F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F6365 5F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F6365 5F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F63655F6365 5F63655F63655F63651C242B1C242B1C242C0E101303020206060706060600000042413FEAE9E4 F9F6F2F6F3EFF6F3EFF6F4F0F9F6F3D7D4D2A3A2A18A8C8B7475765F60614B4D503A3D3F25272B 1E2124181B2012151B0E1014282E2F8A8D8E929392000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000050505 595858201F21A19FA1A0A1A478787B7F7F803C3C3D1A1E2123262A1F222535373A4D4E505C5B5D 6565667170707F7E7D858484AEACABF3F0ECF8F5F1F6F3EFF5F2EEFAF7F4E9E9E84D4C4B000000 060606050303090A0A1B22291D252C1C242B5E62645E62645E62645E62645E62645E62645E6264 5E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E6264 5E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E6264 5E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E6264 5E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E6264 5E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E6264 5E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E6264 5E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E6264 5E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E6264 5E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E6264 5E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E6264 5E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E6264 5E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E6264 5E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E6264 5E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E6264 5E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E6264 5E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E6264 5E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E6264 5E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E6264 5E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E6264 5E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E6264 5E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E6264 5E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E6264 5E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E6264 5E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E62645E6264 5E62641C242B1C242B1C242C0E101303020206060706060600000042413FEAE9E4F9F6F2F6F3EF F6F3EFF7F4F0FAF7F3D7D5D1A2A19F8A8A8A7574755E5E614C4E503B3C3E26282B1C1F22171A1F 13161C0E10142B2F308C8E8F929292000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 0000000000000000000000000000000000000000000000000000000000000505055959591F1F1F A09FA1A1A1A37576787D7E7E3C3C3D1A1D202225281F22243537394E4E515C5C5E656567706F70 7F7F7F858584AEADABF3F0EDF8F5F1F6F3EFF5F2EEFAF7F4E9E9E84D4B4B000000060606050303 090A0A1B22291D252C1C242B2E31342E31342E31342E31342E31342E31342E31342E31342E3134 2E31342E31342E31342E31342F32352F32352F32352F32352F32352F32352F32352F32352F3235 2F32352F32352F32352F32352F32352F32352F32352F32352F32352F32352F32352F32352F3235 2F32352F32352F32352F32352F32352F32352F32352F32352F32352F32352F32352F32352F3235 2F32352F32352F32352F32352F32352F32352F32352F32352F32352F32352F32352F32352F3235 2F32352F32352F32352F32352F32352F32352F32352F32352F32352F32352F32352F32352F3235 2F32352F32352F32352F32352F32352F32352F32352F32352F32352F32352F32352F32352F3235 2F32352F32352F32352F32352F32352F32352F32352F32352F32352F32352F32352F32352F3235 2F32352F32352F32352F32352F32352F32352F32352F32352F32352F32352F32352F32352F3235 2F32352F32352F32352F32352F32352F32352F32352F32352F32352F32352F32352F32352F3235 2F32352F32352F32352F32352F32352F32352F32352F32352F32352F32352F32352F32352F3235 2F32352F32352F32352F32352F32352F32352F32352F32352F32352F32352F32352F32352F3235 2F32352F32352F32352F32352F32352F32352F32352F32352F32352F32352F32352F32352F3235 2F32352F32352F32352F32352F32352F32352F32352F32352F32352F32352F32352F32352F3235 2F32352F32352F32352F32352F32352F32352F32352F32352F32352F32352F32352F32352F3235 2F32352F32352F32352F32352F32352F32352F32352F32352F32352F32352F32352F32352F3235 2F32352F32352F32352F32352F32352F32352F32352F32352F32352F32352F32352F32352F3235 2F32352F32352F32352F32352F32352F32352F32352F32352F32352F32352F32352F32352F3235 2F32352F32352F32352F32352F32352F32352F32352F32352F32352F32352F32352F32352F3235 2F32352F32352F32352F32352F32352F32352F32352F32352F32352F32352F32352F32352F3235 2F32352F32352F32352F32352F32352F32352F32352F32352F32352F32352F32352F32352F3235 2F32352F32352F32352F32352F32352F32352F32352F32352F32352F32352F32352F32352F3235 2F32352F32352F32352F32352F32352F32352F32352F32352F32352F32352F32352F32352F3235 2F32352F32352F32352F32352F32352F32352F32352F32352F32352F32352F32352F32352F3235 2F32352F32352F32352F32352F32352F32352F32352F32352F32352F32352F32352F32351C242B 1C242B1C242C0E101303020206060706060600000042413FEAE9E5F9F6F2F6F3EFF6F3EFF7F4F0 FAF7F3D7D5D2A3A2A08B8B8A7574745D5E604C4D4F3A3C3F25292D1D1F24181B1F12161B0D1014 2C2F2F888A8A919191000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000050505595958232223A3A3A5A1A1A1 7676787F7F803D3D3F1C1F2322252920232636383A4D4D505B5C5D6565667170707F7F7F868585 AFADACF3F0EDF8F5F1F6F3EFF5F2EEFAF7F4E8E8E84A4A4A000000060606050303090A0A1B2229 1D252C1C242B606060606060606060606060606060606060606060606060606060606060606060 6060606060606060605F5F5F5F5F5F5F5F5F5F5F5F6060605F5F5F6060606060606060605F5F5F 606060606060606060606060606060606060606060606060606060606060606060606060606060 606060606060606060606060606060606060606060606060606060606060616161606060606060 606060616161616161616161616161616161616161616161616161616161616161616161616161 616161616161616161616161616161616161616161616161616161626262616161626262626262 616161626262626262626262626262626262626262626262626262626262626262626262626262 626262626262626262626262626262626262626262626262626262626262626262626262626262 626262626262626262626262626262626262626262626262626262626262626262626262626262 626262626262626262626262626262626262626262626262636363626262626262626262636363 626262626262636363626262636363636363626262636363636363636363626262636363636363 626262636363636363636363626262636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363626262636363626262636363 626262636363636363626262636363626262626262626262626262636363626262626262636363 626262626262626262626262626262626262626262626262626262626262626262626262626262 626262626262626262626262626262626262626262626262626262626262626262626262626262 626262626262626262626262626262626262626262626262626262626262626262626262626262 626262626262626262626262626262626262626262626262626262626262626262626262616161 626262626262616161626262616161616161616161616161616161616161616161616161616161 616161616161616161616161616161616161616161616161616161616161616161616161606060 606060616161606060606060606060606060606060606060606060606060606060606060606060 6060606060606060606060606060606060606060605F5F5F6060606060606060605F5F5F606060 6060606060606060605F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F 5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F1C242B1C242B1C242C 0E1013030202060607060606000000444442EBEAE6F9F6F2F6F3EFF6F3EFF7F4F0F9F7F2D7D5D2 A3A1A08A8B897374745D5E5F4A4C4E3A3D3F25282C1E2125191D2113171C0E1015282B2C888A8B 929292000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 0000000000000000000000000000000000000505055A5A59252425A6A7A79F9FA07675777F7F80 3D3E3E1C1E2124262A22242736383B4D4D505C5C5C666566727172807F7F868586AFAEACF3F1ED F8F5F1F6F3EFF5F2EEFAF7F4E8E8E84A4A49000000060606050303090A0A1B22291D252C1C242B 606060606060606060606060606060606060606060606060606060606060606060606060606060 606060606060606060606060606060616161616161606060606060616161606060606060616161 616161616161616161616161616161616161616161616161616161616161616161616161616161 616161616161616161616161616161616161616161616161626262616161626262626262626262 626262626262626262626262626262626262626262626262626262626262626262626262626262 626262626262626262626262636363636363636363636363626262636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363646464646464646464636363646464636363646464636363 646464646464646464646464646464646464646464646464646464646464646464646464646464 646464646464646464646464646464646464646464646464646464646464646464646464646464 646464646464646464646464646464646464646464646464646464646464646464646464646464 646464646464646464646464646464646464646464646464646464646464646464646464646464 646464646464646464646464646464646464646464636363646464646464646464646464646464 636363636363636363646464636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363626262626262626262626262636363626262626262626262626262626262626262626262 626262626262626262626262626262626262626262626262616161626262616161626262616161 616161626262616161616161616161616161616161616161616161616161616161616161616161 616161616161616161616161616161616161616161616161606060616161606060606060606060 616161606060606060606060606060606060606060606060606060606060606060606060606060 6060606060606060606060606060606060606060606060601C242B1C242B1C242C0E1013030202 060607060606000000454442EBEAE6F9F6F2F6F3EFF6F3EFF7F4F0F9F7F2D7D5D1A3A1A08A8A8B 7373745D5F604B4C4E3A3D3F24282B1E2125181C1F13171C0E101526292B8B8E8D939393000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 0000000000000000000000000505055A5A59262527ABAAAC9FA0A17574767C7C7E3C3C3D1C1E20 24272A22252836383B4D4E505C5B5C676667737273808180878685AFADACF3F0EDF8F5F1F6F3EF F5F2EEFAF7F4E8E8E84A4A49000000060606050303090A0A1B22291D252C1C242B606060606060 606060606060606060606060606060606060606060606060606060606060606060606060606060 606060606060616161616161616161616161616161606060606060616161616161616161616161 616161616161616161616161616161616161616161616161616161616161616161626262616161 616161616161616161626262626262626262626262626262626262626262626262626262626262 626262626262626262626262626262626262626262626262626262626262626262626262626262 626262636363636363626262636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363646464646464636363636363 646464646464636363646464646464646464646464646464646464646464646464646464646464 646464646464646464646464646464646464646464646464646464646464646464646464646464 646464646464646464646464646464646464646464646464646464646464646464646464646464 646464646464646464646464646464646464646464646464646464646464646464646464646464 646464646464646464646464646464646464646464646464646464646464646464646464646464 646464646464646464646464646464646464646464646464646464646464646464646464636363 646464646464636363636363646464636363646464646464636363646464636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363626262636363636363626262626262626262626262626262626262626262626262626262 626262626262626262626262626262626262626262626262626262626262616161616161616161 626262626262626262616161616161616161616161616161616161616161616161616161616161 616161616161616161616161616161616161616161616161616161616161616161606060606060 606060606060606060606060606060606060606060606060606060606060606060606060606060 6060606060606060606060606060606060601C242B1C242B1C242C0E1013030202060607060606 000000454442EBEAE6F9F6F2F6F3EFF6F3EFF7F4F0F9F6F2D7D5D1A1A1A08B8B8B7373755C5D5F 494C4D393B3D2426291D1F23181A1E12161C0E10152C2F308E908E939392000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000050505595958262627ACACAEA0A1A27677797D7D7E3B3B3D1B1E21242629222427 36383B4D4E505D5C5D676768737373818080878686B0AEADF3F0EDF8F5F1F6F3EFF5F2EEFAF8F4 E7E8E7494947000000060606050303090A0A1B22291D252C1C242B606060606060606060606060 606060606060606060606060606060606060606060606060606060606060606060606060616161 616161616161606060606060606060616161616161616161616161616161616161616161616161 616161616161616161616161616161616161616161616161616161616161616161616161626262 616161616161616161626262626262626262626262626262626262626262626262626262626262 626262626262626262626262626262636363636363636363636363626262626262636363626262 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 646464636363636363646464636363636363646464646464636363646464646464646464646464 646464646464646464646464646464646464646464646464646464646464646464646464646464 646464646464646464646464646464646464646464646464646464646464646464646464646464 646464646464646464646464646464646464646464646464656565646464656565646464646464 646464656565646464646464646464646464646464646464646464646464646464646464646464 646464646464646464646464646464646464646464646464646464646464646464646464646464 646464646464646464646464646464646464646464646464646464646464646464646464646464 646464646464646464636363646464646464636363646464636363646464636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363626262636363626262626262626262626262626262626262626262626262 626262626262626262626262626262626262626262626262626262626262626262616161616161 616161616161626262616161616161616161616161616161616161616161616161616161616161 616161616161616161616161616161616161606060606060606060616161616161606060616161 616161606060606060616161616161606060606060606060606060606060606060606060606060 6060606060606060606060601C242B1C242B1C242C0E1013030202060607060606000000454442 EBEAE6F9F6F2F6F3EFF6F3EFF7F4F0F9F6F2D7D5D2A1A1A0898B8A7373745E5F604B4C4F393B3F 2326291D2023191D2115181F0E1015282C2C8F918F939292000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 050505545554282729AAACAD9E9FA37574787D7E7E3D3E3F1E1F2324272A21252637383A4D4D4F 5D5D5E676868737474818181888787B1AFADF4F1EDF8F5F1F6F3EFF5F2EEFAF8F4E7E7E7484747 000000060606050303090A0A1B22291D252C1C242B606060606060606060606060606060606060 606060606060606060606060606060606060606060606060616161616161606060606060606060 606060616161606060616161616161616161616161616161616161616161616161616161616161 616161616161616161616161626262616161616161616161616161626262626262626262626262 626262626262626262626262626262626262626262626262626262626262626262626262626262 626262626262636363626262636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363646464646464636363646464 636363646464646464636363646464646464646464646464646464646464646464646464646464 646464646464646464646464646464646464646464646464646464646464646464646464646464 646464656565646464646464646464646464646464646464646464656565646464646464646464 646464656565656565656565646464646464656565656565656565646464646464656565646464 646464656565646464646464646464656565656565656565646464646464656565656565646464 646464646464646464646464646464656565646464646464646464646464646464646464646464 646464646464646464646464646464646464646464646464646464646464646464646464646464 646464646464646464646464646464646464636363646464636363646464636363646464636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 626262636363636363626262626262626262636363626262626262626262626262626262626262 626262626262626262626262626262626262626262626262626262616161626262626262626262 616161616161626262626262616161616161616161616161616161616161616161616161616161 616161616161616161616161616161616161616161616161616161616161616161606060616161 616161616161606060606060606060606060606060606060606060606060606060606060606060 6060606060601C242B1C242B1C242C0E1013030202060607060606000000454442EBEAE6F9F6F2 F6F3EFF6F3EFF7F4F0F9F6F2D7D5D2A1A19F8989887373745D5E604A4C4F393B3D23262A1C1E22 181B2015181E0E1014282D2B8F908F939292000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000050505545555 2A292BACACADA2A2A378797C7C7C7C3B3C3D1E1F2325282B22242837383B4E4E505E5D5E686868 747473828181898988B1B0AEF3F1ECF8F5F1F6F3EFF5F2EEFAF8F4E7E7E7484847000000060606 050303090A0A1B22291D252C1C242B606060606060606060606060606060606060606060606060 606060606060606060606060606060606060616161606060616161616161616161616161616161 616161616161616161616161616161616161616161616161616161616161616161616161616161 616161616161616161616161616161616161626262626262626262626262626262626262626262 626262626262626262626262626262626262626262626262626262626262626262626262626262 636363626262636363626262636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 646464636363636363636363646464636363646464646464646464646464646464646464646464 646464646464646464646464646464646464646464646464646464646464646464646464646464 646464646464646464646464646464646464646464656565646464656565656565646464646464 646464646464656565646464656565646464656565656565656565656565656565656565656565 656565656565656565656565656565646464656565656565656565656565656565646464656565 656565656565646464646464656565656565646464656565656565656565656565646464656565 646464646464656565656565646464656565646464646464656565646464646464656565646464 646464646464646464646464646464646464646464646464646464646464646464646464646464 646464646464646464646464646464646464646464636363636363646464636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363626262626262626262626262626262626262626262626262626262626262 626262626262626262626262626262626262626262626262626262626262626262626262616161 616161616161616161616161616161616161616161616161616161616161616161616161616161 616161616161616161616161616161616161606060606060606060606060606060606060606060 606060606060616161606060606060606060606060606060606060606060606060606060606060 1C242B1C242B1C242C0E1013030202060607060606000000454442EBEAE6F9F6F2F6F3EFF6F3EF F7F4F0F9F6F2D7D4D2A1A09F8989897272745D5D604B4D4F393C3F24262B1C1E24171A1E14181D 0F12152D2F2F8D8F8F939292000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 0000000000000000000000000000000000000000000000000000000303055252522A2A2AADAEAE A1A1A1797A7C7D7E7E3B3C3D1E202325272B22252938393C4E4E515E5D5F686869757474838282 898A89B2B1AFF3F1ECF8F5F1F6F3EFF5F2EEFAF8F4E7E7E7484746000000060606050303090A0A 1B22291D252C1C242B606060606060606060606060606060606060606060606060606060606060 606060606060616161616161616161616161616161616161616161616161616161616161616161 616161616161616161616161616161616161616161616161616161616161616161616161626262 626262616161616161626262626262616161626262626262626262626262626262626262626262 626262626262626262626262626262626262636363626262636363636363626262636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363646464646464646464636363636363 646464636363636363646464646464646464646464646464646464646464646464646464646464 646464646464646464646464646464646464646464646464646464646464646464646464656565 646464656565646464646464646464656565646464656565646464656565656565656565656565 656565656565656565656565656565656565656565656565656565656565656565656565656565 656565656565656565656565656565656565656565656565656565656565656565656565656565 656565656565656565656565656565656565656565656565656565656565656565656565656565 656565656565656565656565646464656565656565646464656565646464646464656565656565 646464646464646464656565646464646464646464646464646464646464646464646464646464 646464646464646464646464646464646464646464646464646464646464636363646464636363 646464636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 626262636363636363636363636363626262626262626262626262626262626262626262626262 626262626262626262626262626262626262626262616161616161616161616161626262616161 626262626262616161616161616161616161616161616161616161616161616161616161616161 616161616161616161616161616161616161616161606060606060616161616161606060606060 6060606060606060606060606060606060606060606060606060606060606060601C242B1C242B 1C242C0E1013030202060607060606000000464543EBEAE7F9F6F2F6F3EFF6F3EFF7F4F0F9F6F2 D6D4D2A0A09F8A89887373745E5E604A4C4D393C3F25282D1D2025181C2015181E0F1015282B2B 8F9090939595000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 0000000000000000000000000000000000000000000303035455542A2A2AAEADAE9E9EA2777779 7D7D7E3B3C3D1E202326272C232628383A3D4F4E505E5D5E6969697675768383838A8989B3B1AF F3F1ECF8F5F1F6F3EFF5F2EEFAF8F4E7E7E6464544000000060606050303090A0A1B22291D252C 1C242B606060606060606060606060606060606060606060606060606060606060606060616161 616161616161606060616161616161616161616161616161616161616161616161616161616161 616161616161616161616161616161616161616161616161616161626262626262616161626262 616161626262626262626262626262626262626262626262626262626262626262626262626262 626262636363626262626262636363626262636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363646464636363636363646464646464646464636363646464646464646464 646464646464646464646464646464646464646464646464646464646464646464646464646464 646464646464646464646464656565656565646464646464656565646464656565656565656565 656565656565656565656565656565656565656565656565656565656565656565656565656565 656565656565656565656565656565656565656565656565656565656565656565656565656565 656565656565656565656565656565656565656565656565656565656565656565656565656565 656565656565656565656565656565656565656565656565656565656565656565656565656565 656565656565656565656565656565656565656565656565656565656565656565656565646464 646464656565656565646464646464656565656565646464646464646464646464646464646464 646464646464646464646464646464646464646464646464646464636363646464636363646464 646464636363636363646464646464636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363626262626262626262626262626262626262626262 626262626262626262626262626262626262626262626262626262626262616161626262616161 616161616161616161616161616161616161616161616161616161616161616161616161616161 616161616161616161616161616161616161616161606060616161606060616161616161606060 6060606060606060606060606060606060606060606060606060601C242B1C242B1C242C0E1013 030202060607060606000000474745ECEBE8F8F5F1F6F3EFF6F3EFF7F4F0F9F7F2D7D5D2A0A09F 898A897373745C5E604A4C4D393B3E25282B1B2023181C2014171D0E1014282C2D8F9093959595 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 0000000000000000000000000000000305055D5D5C2B2A2AB0AFAF9F9EA177777A7F7F813C3C3E 1D202227282C242528393A3D4F4E505D5D5E6A69697575758584848C8A8BB4B1AFF3F0ECF8F5F1 F6F3EFF5F2EEFAF8F4E6E6E6464644000000060606050303090A0A1B22291D252C1C242B606060 606060606060606060616161606060606060606060616161616161616161616161616161616161 616161616161616161616161616161616161616161616161616161616161616161616161616161 616161616161616161626262626262616161616161616161616161626262626262626262626262 626262626262626262626262626262626262626262626262626262626262626262626262636363 626262636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363646464636363646464646464646464646464646464646464646464646464646464 646464646464646464646464646464646464646464656565646464646464646464646464656565 656565646464656565656565656565656565656565656565656565656565656565656565656565 656565656565656565656565656565656565656565656565656565656565656565656565656565 656565656565656565656565656565656565656565656565656565656565656565656565656565 656565656565656565656565656565656565656565656565656565656565656565656565656565 656565656565656565656565656565656565656565656565656565656565656565656565656565 656565656565656565656565656565656565656565656565656565656565656565656565656565 656565656565646464656565656565646464656565646464646464646464646464646464646464 646464646464646464646464646464646464646464646464646464646464646464646464646464 646464646464646464646464646464636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363626262626262626262636363626262626262626262626262626262626262626262 626262626262626262626262626262626262626262626262626262616161626262616161626262 626262616161616161616161616161616161616161616161616161616161616161616161616161 616161616161616161616161616161616161606060606060616161606060616161606060606060 6060606060606060606060606060606060606060601C242B1C242B1C242C0E1013030202060607 060606000000474645ECEBE8F8F5F1F6F3EFF6F3EFF7F4F0F9F7F2D8D5D2A09F9E888888717273 5C5E604A4B4E383A3D2326291C1F23181B1F15181F1012182B2F2F8D8E90939393000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 0000000000000000000303035756552D2C2CB1B1B19FA0A07776798080803E3E3F1E1E2126272A 2526293A3B3E4E4F515E5E5F6A6A6B7776778584848C8B8BB4B2B1F3F0ECF8F5F1F6F3EFF5F2EE FAF8F4E6E6E6464544000000060606050303090A0A1B22291D252C1C242B606060606060606060 606060606060606060606060616161606060606060616161606060616161616161616161616161 616161616161616161616161616161616161616161616161616161616161616161616161626262 616161616161626262616161616161626262626262626262626262626262626262626262626262 626262626262626262626262626262626262636363626262626262636363626262626262636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363646464636363646464646464646464 646464646464646464646464646464646464646464646464646464646464646464646464646464 646464646464646464646464656565656565656565656565656565646464656565656565656565 656565656565656565656565656565656565656565656565656565656565656565656565656565 656565656565656565656565656565656565656565656565656565656565666666656565656565 666666656565666666666666656565666666656565666666666666666666656565666666656565 656565666666666666666666656565656565666666666666666666666666666666666666656565 656565656565656565656565656565656565656565656565656565656565656565656565656565 656565656565656565656565656565656565656565656565656565656565656565656565656565 656565656565656565646464656565656565656565656565656565646464646464646464646464 646464646464646464646464646464646464646464646464646464646464646464646464646464 646464646464646464646464636363636363646464646464636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363626262636363626262626262626262626262626262626262626262 626262626262626262626262626262626262626262626262626262616161616161616161616161 616161616161616161616161616161616161616161616161616161616161616161616161616161 616161616161616161616161606060616161616161616161616161616161616161616161616161 6060606060606060606060606060601C242B1C242B1C242C0E1013030202060607060606000000 474645ECEBE8F8F5F1F6F3EFF6F3EFF7F4F0F9F7F2D7D5D29F9F9F8988897172735B5D5E494A4D 383B3D23272B1B1E22171B1F15191F101216292E2B8C908F939596000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000504F4E2D2E2DB1B1B1A1A2A37877797D7D7D3E3E3E1E1F2225262A2324273A3A3D 4F4F505D5D5E6A696A7776778585858C8C8CB4B3B1F3F0EDF8F5F1F6F3EFF5F2EEFAF8F4E6E6E5 454443000000060606050303090A0A1B22291D252C1C242B606060606060616161606060606060 616161606060606060616161606060616161616161616161616161616161616161616161616161 616161616161616161616161616161616161616161616161626262626262616161616161616161 626262626262626262626262626262626262626262626262626262626262626262626262626262 626262626262626262626262636363626262626262626262626262636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 646464636363646464636363636363646464646464646464646464646464646464646464646464 646464646464646464646464646464646464646464646464646464646464646464646464656565 646464656565656565656565656565656565656565656565656565656565656565656565656565 656565656565656565656565656565656565656565656565656565656565666666666666666666 656565666666666666666666666666666666666666656565666666656565666666656565666666 666666666666656565666666666666666666666666666666656565666666666666666666666666 666666666666666666666666656565656565656565666666666666666666666666666666656565 666666666666666666656565666666656565656565656565656565666666656565656565666666 656565656565656565656565656565656565656565656565656565656565656565656565656565 656565656565656565656565656565656565656565646464656565646464646464646464646464 656565646464656565646464646464646464646464646464646464646464646464646464646464 646464646464646464646464636363646464646464636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363626262636363626262636363626262626262626262626262 626262626262626262626262626262626262626262626262626262616161616161616161616161 616161616161616161616161616161616161616161616161616161616161616161616161616161 616161616161616161616161616161616161606060616161606060606060606060606060606060 6060606060606060601C242B1C242B1C242C0E1013030202060607060606000000474645ECEBE8 F8F5F1F6F3EFF6F3EFF7F4F0F9F7F2D7D4D29F9E9E8887887171725B5C5E49494C393B3F25282D 1C1E23191D2113171D0D0F13262B28919491969696000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 514F502D2D2EB2B2B2A0A0A27677797F7F803F3F401D1F2226262A2325283A3B3D4F4E505E5F5E 6A6A697876778685858C8C8BB5B3B1F4F1EDF8F5F1F6F3EFF5F2EEFAF8F4E6E6E5454443000000 060606050303090A0A1B22291D252C1C242B606060606060606060606060616161616161606060 616161616161616161616161616161616161616161616161616161616161616161616161616161 616161616161616161616161616161616161616161616161616161626262626262626262626262 626262626262626262626262626262626262626262626262626262626262626262626262626262 636363626262636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363646464636363 646464646464646464646464646464646464646464646464646464646464646464646464646464 646464646464646464646464646464656565656565656565656565656565656565656565656565 656565656565656565656565656565656565656565656565656565656565656565656565656565 656565656565656565656565656565656565656565666666656565666666666666666666666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666656565666666666666666666666666666666666666666666 656565656565656565666666666666656565656565656565656565656565656565656565656565 656565656565656565656565656565656565656565656565656565656565656565646464646464 646464646464646464646464656565646464646464646464646464646464646464646464646464 646464646464646464646464646464646464636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363626262626262626262626262626262626262626262 626262626262626262626262626262626262626262626262616161616161616161616161616161 616161616161616161616161616161616161616161616161616161616161616161616161616161 616161616161616161616161606060616161616161606060616161616161606060606060606060 6161611C242B1C242B1C242C0E1013030202060607060606000000474645ECEBE8F8F5F1F6F3EF F6F3EFF7F4F0FAF7F3D7D4D19F9E9D8787867071725A5B5C484A4C373A3D25282D1D1F24171B20 14171D0E10142B2E2E959595969696000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 0000000000000000000000000000000000000000000000000000000000000000005251512E2E2D B1B2B2A0A0A37675777E7E7F3E3D3E1C1E2126272B2524293A3B3D5050525F5F5F6A6A6A767776 8585848C8C8BB5B4B1F3F1EDF8F5F1F6F3EFF5F2EEFAF8F4E6E6E5454443000000060606050303 090A0A1B22291D252C1C242B606060606060616161606060606060616161606060616161606060 616161616161616161616161616161616161616161616161616161616161616161616161616161 616161616161616161616161626262616161626262616161626262626262626262626262626262 626262626262626262626262626262626262626262626262626262626262636363636363626262 626262636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363646464646464646464646464646464 646464646464646464646464646464646464646464646464646464646464656565646464656565 656565646464646464656565656565656565656565656565656565656565656565656565656565 656565656565656565656565656565656565656565656565656565666666666666666666666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666656565666666666666666666656565656565666666656565656565656565656565656565 656565656565656565656565656565656565656565656565656565656565656565656565656565 656565646464646464646464646464646464646464646464646464646464646464646464646464 646464646464646464646464646464636363646464646464636363636363646464646464636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363626262636363626262626262626262636363626262626262626262626262 626262626262626262626262626262626262626262616161616161616161626262626262616161 626262616161616161616161616161616161616161616161616161616161616161616161616161 6161616161616161616161616161616060606161616161616060606060606060606161611C242B 1C242B1C242C0E1013030202060607060606000000474645ECEBE8F8F5F1F6F3EFF6F3EFF7F4F0 FAF7F3D7D4D29E9D9D8787887171725A5B5D48494B383A3D24272C1B1E2316191E14171D0E1216 272C2B919392969696000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 0000000000000000000000000000000000000000000000000000005F5D5D313030B2B2B3A0A0A4 79787B7C7C7D3B3C3E1E1F232526292526293B3C3E4F50515D5E5F6A6A6B7776778585858D8C8C B5B4B2F3F1EDF8F5F1F6F3EFF5F2EEFAF8F4E6E6E4454442000000060606050303090A0A1B2229 1D252C1C242B606060616161616161606060616161606060616161616161616161616161616161 616161616161616161616161616161616161616161616161616161616161616161616161626262 626262616161626262626262626262626262626262626262626262626262626262626262626262 626262626262626262636363626262636363636363626262636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 646464646464646464646464646464646464646464646464646464646464646464646464646464 646464646464646464646464646464646464656565646464656565656565656565646464656565 656565656565656565656565656565656565656565656565656565656565656565656565656565 656565656565656565666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666656565666666666666656565656565666666666666656565656565 656565656565656565656565656565656565656565656565656565656565656565656565656565 656565656565656565656565646464646464646464646464646464646464646464646464646464 646464646464646464646464646464646464646464646464636363636363636363646464636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363626262626262626262626262636363626262626262626262626262 626262626262626262626262626262626262626262616161626262626262616161626262616161 616161616161616161616161616161616161616161616161616161616161616161616161616161 6161616161616161616161616161616060606161616161616060606161611C242B1C242B1C242C 0E1013030202060607060606000000494847ECECE8F8F5F1F6F3EFF6F3EFF7F4F0FAF7F3D6D5D2 9D9C9B868686707071595B5C474A4C383B3F23262B1B1E23191C2214171D0D0F12272D2C919393 969696000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 0000000000000000000000000000000000000000005C5C5C302F31B3B2B4A1A1A5797B7C7F7E7F 3D3D3E1D1F2124272A26272A3C3D3F5051535E5E5F6A6A6B7878788685858D8C8CB5B4B2F4F1ED F8F5F1F6F3EFF5F2EEFAF8F4E5E5E4444341000000060606050303090A0A1B22291D252C1C242B 606060616161616161606060606060616161616161616161616161616161616161616161616161 616161616161616161616161616161616161616161616161616161626262626262616161616161 626262626262626262626262626262626262626262626262626262626262626262626262636363 636363626262626262636363626262636363636363626262636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363646464646464636363646464 646464646464646464646464646464646464646464646464646464646464656565656565646464 646464656565656565656565656565656565646464656565656565656565656565656565656565 656565656565656565656565656565656565656565666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666666666666666666666656565 666666656565656565656565656565656565656565656565656565656565656565656565656565 656565646464656565656565656565646464646464646464646464646464646464646464646464 646464646464646464646464646464646464646464636363636363646464636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363626262626262626262626262626262626262626262626262626262 626262626262626262626262626262626262626262616161626262616161616161626262616161 616161616161616161616161616161616161616161616161616161616161616161616161616161 6161616161616161616161616161616060606161616060601C242B1C242B1C242C0E1013030202 0606070606060000004A4947ECECE8F8F5F1F6F3EFF6F3EFF7F4F0FAF7F3D6D4D29C9C9B858686 6F707158595B47494C383A3E26292D1C1E23181B2114181E0D0F132E3130929394969696000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 0000000000000000000000000000005B5B5C303031B3B3B3A0A0A178797A7D7E7F3B3C3D1D1D1F 25272A25272A3D3E405152545F5F5F6A6A6B7877788686868D8D8CB6B5B2F4F1EDF8F5F1F6F3EF F5F2EEFAF8F4E5E5E4444341000000060606050303090A0A1B22291D252C1C242B616161616161 616161616161616161616161616161616161616161616161616161616161616161616161616161 616161616161616161616161616161626262626262616161626262616161626262626262626262 626262626262626262626262626262626262626262626262626262626262626262626262626262 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363646464636363636363636363646464646464646464646464646464646464 646464646464646464646464646464646464646464646464646464646464656565656565656565 656565656565656565656565656565656565656565656565656565656565656565656565666666 656565656565666666656565666666656565666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 656565666666656565656565656565656565656565656565656565656565656565656565656565 656565656565656565656565656565656565646464646464646464646464646464646464646464 646464646464646464646464646464646464646464646464636363636363636363636363646464 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363626262636363636363626262626262626262626262626262626262626262626262626262 626262626262626262626262626262626262626262626262616161626262616161616161616161 616161616161616161616161616161616161616161616161616161616161616161616161616161 6161616161616161616060606161616060601C242B1C242B1C242C0E1013030202060607060606 0000004A4947ECECE8F8F5F1F6F3EFF6F3EFF7F4F0FAF7F3D7D4D19B9A998584856F707158595B 47494D37393C24262B1B1D22171B1F15181F0D10152D303098999A969696000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000606160303031B4B4B49D9D9F7A7B7D8080813A3A3B1C1D20252629262729 3E3E415252535F5F606A6A6C7777788685858E8D8CB7B5B3F4F1EDF8F5F1F6F3EFF5F2EEFAF8F4 E5E5E4444341000000060606050303090A0A1B22291D252C1C242B616161616161616161616161 616161616161616161616161616161616161616161616161616161616161616161616161616161 626262616161616161626262616161626262626262626262626262626262626262626262626262 626262626262626262626262626262626262636363636363626262626262636363636363626262 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363646464646464646464646464646464646464646464646464646464646464 646464646464646464646464646464656565656565656565656565656565656565656565656565 656565656565656565656565656565656565666666656565656565656565666666656565656565 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666656565656565656565656565656565656565656565656565656565656565656565656565 656565656565656565656565656565656565656565656565646464646464646464646464646464 646464646464646464646464646464646464646464646464636363646464646464646464646464 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363626262626262636363626262626262626262626262626262626262626262 626262626262626262626262626262626262626262616161616161616161616161626262616161 616161616161616161616161616161616161616161616161616161616161616161616161616161 6161616161616060606161611C242B1C242B1C242C0E10130302020606070606060000004A4947 ECECE8F8F5F1F6F3EFF6F3EFF7F4F0FAF7F3D5D3D19A99998383836D6F70585A5C484A4E36393B 23262A1D1F24191C2114171D0E1015272B2B909192969696000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 0000005E5E5E303030B6B6B69E9E9F79787A7F7F803B3C3D1D1E2125272926262A3E3F41535354 6161616B6B6C7876788685858D8D8CB7B5B3F4F1EDF8F5F1F6F3EFF5F2EEFAF8F5E5E5E4424141 000000060606050303090A0A1B22291D252C1C242B616161616161616161616161616161616161 616161616161616161616161616161616161616161616161616161616161616161616161616161 616161626262616161626262626262626262626262626262626262626262626262626262626262 626262636363626262636363626262636363636363626262636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363646464636363646464 646464646464646464646464646464646464646464646464646464646464646464646464646464 656565656565646464656565656565656565656565656565656565656565656565656565656565 656565656565656565666666666666656565666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666676767666666666666666666666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666656565656565666666656565656565656565656565656565656565656565 656565656565656565656565656565656565656565656565646464646464646464646464646464 646464646464646464646464646464646464646464646464646464646464646464636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 626262636363636363636363626262626262626262626262626262626262626262626262626262 626262626262626262626262626262626262616161616161616161616161616161616161616161 616161616161616161616161616161616161616161616161616161616161616161616161606060 6161616161611C242B1C242B1C242C0E10130302020606070606060000004A4947ECECE8F8F5F1 F6F3EFF6F3EFF7F4F0FAF7F3D5D3D19A99988282826B6D6E57595B46484B37393C24282C1D2024 191D2215191F0D1014272B2D929493979797000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000525152 363536B7B7B89F9EA079787A7D7E7F393A3B1C1E2126282B26262A4041435454566161616B6B6B 7776778686858E8C8CB6B4B2F4F2EDF8F5F1F6F3EFF5F2EEFBF9F5E5E5E3424140000000060606 050303090A0A1B22291D252C1C242B616161616161616161616161616161616161616161616161 616161616161616161616161616161616161626262616161616161616161616161626262626262 626262626262626262626262626262626262626262626262626262626262626262626262626262 626262636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363646464636363636363646464646464646464646464646464 646464646464646464646464646464646464646464656565656565656565656565656565656565 656565656565656565656565656565656565656565656565656565666666656565656565656565 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666676767676767666666666666666666666666666666666666676767666666 666666666666676767666666666666676767666666666666676767666666676767666666666666 666666676767676767676767676767676767666666676767666666666666676767666666666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666656565656565666666656565656565656565656565656565656565656565 656565656565656565656565656565656565656565656565646464646464656565656565646464 646464646464646464646464646464646464646464646464646464636363646464636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363626262626262626262626262626262626262626262 626262626262626262626262626262616161626262616161616161626262616161616161616161 616161616161616161616161616161616161616161616161616161616161606060616161606060 1C242B1C242B1C242C0E10130302020606070606060000004A4947ECECE8F8F5F1F6F3EFF6F3EF F7F4F0FAF8F3D5D3D09999998283846B6C6E56575946494B35383B24272C1D2026191C22151920 0D1015282C2F949597989898000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 0000000000000000000000000000000000000000000000000000000000004E4E4E414142BCBCBD 9D9E9F78797B8081813B3B3C1C1E1F25272A27282B4142445554566262636C6B6D787878878787 8C8C8BB5B4B2F5F2EDF8F5F1F6F3EFF5F2EEFAF9F5E5E5E3424140000000060606050303090A0A 1B22291D252C1C242B616161616161616161616161616161616161616161616161616161616161 616161616161616161616161626262616161626262626262626262626262626262626262626262 626262626262626262626262626262626262626262626262626262626262626262636363626262 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 646464646464636363646464646464646464646464646464646464646464646464646464646464 646464646464646464656565646464656565656565656565656565656565656565656565656565 656565656565656565656565656565666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666676767676767666666666666666666666666676767666666666666 676767676767676767676767676767676767676767676767676767676767676767676767676767 676767676767676767676767676767676767676767676767676767676767676767676767676767 676767676767676767676767676767676767666666666666676767676767666666676767676767 676767676767666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666656565666666656565656565656565656565656565656565 656565656565656565656565656565656565646464646464656565656565656565646464646464 646464646464646464646464646464646464646464646464646464646464646464646464636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363626262626262626262636363626262626262626262626262626262626262626262 626262626262626262626262626262616161616161616161616161616161616161616161616161 6161616161616161616161616161616161616161616161616161616161616161611C242B1C242B 1C242C0E10130302020606060606060000004B4B48EDEDE9F8F5F1F6F3EFF6F3EFF7F4F0FAF8F3 D5D3D09898988182836C6C6F56585A45484A34383B22262A1A1D2116181E13161C0D1015282C2E 949596969796000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 0000000000000000000000000000000000000000000000003E3E3E4B4A4BBFBFC09B9B9B777779 8282823C3C3D1B1B1E25272A26292B4244455555566161636D6E6E79797A8786878C8B8BB6B4B2 F5F2EDF8F5F1F6F3EFF5F2EEFBF9F5E4E4E241403F000000060606050303090A0A1B22291D252C 1C242B616161616161616161616161616161616161616161616161616161616161616161616161 616161616161616161626262626262626262626262626262626262626262626262626262626262 626262626262626262626262626262626262636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363646464636363636363646464646464 646464646464646464646464646464646464646464646464646464646464656565656565646464 656565656565656565656565656565656565656565656565656565656565656565656565666666 656565656565666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666676767666666676767676767676767676767666666676767676767676767676767676767 676767676767676767676767676767676767676767676767676767676767676767676767676767 676767676767676767676767676767676767676767676767676767676767676767676767676767 676767676767676767676767676767676767676767676767676767676767676767676767676767 676767666666666666676767666666676767676767676767676767676767666666666666666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666656565656565656565656565656565 656565656565656565656565656565656565656565656565646464646464646464646464646464 646464646464646464646464646464646464646464646464646464646464646464636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 626262636363626262636363626262626262626262626262626262626262626262626262626262 626262626262626262626262626262616161626262626262616161626262616161616161616161 6161616161616161616161616161616161616161616161616161611C242B1C242B1C242C0E1013 0302020606060606060000004C4B4AEDEDEAF8F5F1F6F3EFF6F3EFF7F4F0FAF8F3D5D3D0989897 8182826B6C6E55575A44454833373A222629191D21161A1E12151B0B0D1225292D949596969796 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 0000000000000000000000000000000000002B2B2B585758BCBCBD9C9C9E79797B807F81393A3B 191B1E24252926272A4444465656576262636D6C6E7778788685858C8B8CB6B4B3F5F2EDF8F5F1 F6F3EFF5F2EEFBF9F5E4E4E2413F3E000000060606050303090A0A1B22291D252C1C242B616161 616161616161616161616161616161616161616161616161616161626262626262626262616161 626262626262626262626262626262626262626262626262626262626262626262626262626262 626262626262636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363646464636363636363646464636363646464646464646464646464 646464646464646464646464646464656565646464646464646464656565656565656565656565 656565656565656565656565656565656565656565656565656565666666656565666666666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666666666666666666666676767 666666666666666666666666676767676767676767676767676767676767676767676767676767 676767676767676767676767676767676767676767676767676767676767676767676767676767 676767676767676767676767676767676767676767676767676767676767676767676767676767 676767676767676767676767676767676767676767676767676767676767676767676767676767 676767676767676767676767676767676767676767676767676767676767676767676767676767 676767676767676767676767676767676767676767676767676767666666676767666666666666 666666666666666666666666666666676767666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666656565656565666666656565 656565656565656565656565656565656565656565656565646464656565656565656565646464 646464646464646464646464646464646464646464646464646464646464636363646464636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 626262636363626262626262626262626262626262626262626262626262626262626262626262 626262626262626262626262616161616161616161616161616161616161626262616161616161 6161616161616161616161616161616161616161611C242B1C242B1C242C0E1013030202060606 0606060000004C4B49EDEDEAF8F5F1F6F3EFF6F3EFF7F4F0FBF8F4D4D3CF9796968180826B6C6D 54545743444733363922242B1B1E24181C2014171D0D0D13272C2F95989A9A9898000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 0000000000000000000000001818186A6969BBBBBBA0A0A17B7B7D8080813B3B3B191A1C232427 25272A4445475656576261636D6C6D7877788786858C8B8BB6B3B2F5F2EDF8F5F1F6F3EFF5F2EE FBF9F5E4E4E2403F3E000000060606050303090A0A1B22291D252C1C242B616161616161616161 616161616161616161616161616161616161626262626262616161626262616161626262626262 626262626262626262626262626262626262626262626262626262626262636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363646464646464646464646464646464646464646464646464646464646464646464646464 646464646464656565646464646464656565656565656565656565656565656565656565656565 656565656565656565656565666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666676767676767676767676767 676767676767666666676767676767676767676767676767676767676767676767676767676767 676767676767676767676767676767676767676767676767676767686868676767676767686868 686868676767676767676767676767686868686868686868686868686868676767676767676767 686868676767676767676767686868676767676767676767676767676767676767676767686868 676767676767676767676767676767686868676767676767676767676767676767676767676767 676767676767676767676767676767676767676767676767676767676767676767676767676767 676767666666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666656565656565666666656565 656565656565656565656565656565656565656565656565656565656565656565646464656565 656565646464646464646464646464646464646464646464646464646464646464646464646464 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 626262626262626262636363626262626262626262626262626262626262626262626262626262 626262626262616161626262626262616161626262616161616161616161616161616161616161 6161616161616161616161616161611C242B1C242B1C242C0E1013030202060606060606000000 4C4B4AEDEDEAF8F5F1F6F3EFF6F3EFF7F4F0FAF8F3D4D3D09697967E7F7F696A6B545658424546 32343822262A191E23181C2115191F0D1015272D2E939799989798000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000050505727272BCBDBC9F9DA07C7C7F7F8080393A3B191B1D23262725262A434446 5756576261636E6E6E7977788685858C8B8AB5B3B2F5F2EEF8F5F1F6F3EFF5F2EEFBF9F5E4E4E2 403F3E000000060606050303090A0A1B22291D252C1C242B616161616161616161616161616161 616161616161616161616161626262616161616161626262626262626262626262626262626262 626262626262626262626262626262626262626262626262636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363646464646464646464 646464646464646464646464646464646464646464646464646464646464656565656565656565 656565656565656565656565656565656565656565656565656565656565656565656565666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666676767676767666666676767676767676767676767 676767676767676767676767676767676767676767676767676767676767676767676767676767 686868686868676767686868686868686868676767686868686868686868686868676767686868 686868686868686868686868686868686868686868686868686868686868686868686868686868 686868686868686868686868686868686868686868686868686868686868676767676767676767 686868686868676767686868686868686868676767686868676767686868676767676767676767 676767676767676767676767676767676767676767676767676767676767676767676767676767 676767676767676767666666676767666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666656565666666656565666666656565 656565656565656565656565656565656565656565656565656565656565656565656565646464 646464646464646464646464646464646464646464646464646464646464646464646464646464 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363626262 636363636363636363636363626262626262626262626262626262626262626262626262626262 616161626262616161626262616161626262626262616161616161616161616161616161616161 6161616161616161611C242B1C242B1C242C0E10130302020606060606060000004C4B4AEDEDEA F8F5F1F6F3EFF6F3EFF7F4F0FBF8F4D4D2CF9595957D7E7E68686A54565743464932353A222429 1B1D23181C2115191F0D10142C31319A9C9B989797000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 0000006E6E70C3C3C49D9C9C7D7C7F7D7E7F35363718191C24252925272B444446565657616162 6F6F707978788685858C8B8BB5B4B2F5F2EEF8F5F1F6F3EFF5F2EEFCF9F5E3E3E03E3E3D000000 060606050303090A0A1B22291D252C1C242B616161616161616161616161616161616161616161 616161616161626262616161626262626262626262626262626262626262626262626262626262 626262626262626262636363626262626262626262636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363646464636363646464646464646464646464 646464646464646464646464646464646464646464646464656565656565656565656565656565 656565656565656565656565656565656565656565656565666666666666666666666666666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666676767676767676767676767 676767676767676767676767676767676767676767676767676767676767676767676767676767 676767676767686868676767686868676767686868676767686868686868686868686868686868 686868686868686868686868686868686868686868686868686868686868686868686868686868 686868686868686868686868686868686868686868686868686868686868686868686868686868 686868686868686868686868686868686868686868686868686868686868686868686868686868 686868686868686868686868686868686868686868686868686868686868686868676767676767 686868676767676767676767686868676767676767676767676767676767676767676767676767 676767676767676767676767666666666666676767676767666666676767666666666666666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666666666656565666666656565 656565656565656565656565656565656565656565656565656565646464656565656565656565 646464646464646464646464646464646464646464646464646464646464646464646464646464 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363626262636363626262626262626262626262626262626262626262626262626262 626262626262626262626262626262626262616161626262616161616161616161616161616161 6161611C242B1C242B1C242C0E10130302020606060606060000004C4B4AEDEDEAF8F5F1F6F3EF F6F3EFF7F4F0FBF8F4D3D1D09594957E7E7E67696A53555743454732343822252A191D2116191E 12161C0D10142B3130989B9A979797000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 0000000000000000000000000000000000000000000000000000000000000000000000006F6F71 D4D3D39999987E7D7E7E7E7E35363717181B22242826282A4444465756586262636F6F7079797A 8585858B8B8AB5B3B1F5F2EEF8F5F1F6F3EFF5F2EEFBF9F5E3E3E03F3E3D000000060606050303 090A0A1B22291D252C1C242B616161616161616161616161616161616161626262616161626262 626262626262626262626262626262626262626262626262626262626262626262626262626262 626262626262626262636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 646464646464636363636363636363646464646464646464646464646464646464646464646464 646464656565646464656565656565656565656565656565656565656565656565656565656565 656565656565656565656565666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666666666676767666666676767666666666666676767676767676767676767676767676767 676767676767676767676767676767676767676767676767676767686868676767676767686868 686868686868686868686868686868686868686868686868686868686868686868686868686868 686868686868686868686868686868686868686868686868686868686868686868696969686868 686868686868686868686868686868686868686868696969686868686868696969686868686868 696969686868686868686868686868686868686868686868686868686868686868686868686868 686868686868686868686868686868686868686868686868686868686868686868686868686868 676767686868686868686868676767676767676767676767676767676767676767676767676767 676767676767676767676767676767676767676767676767666666676767666666666666666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666666666666666666666656565 656565656565656565656565656565656565656565656565656565656565656565656565646464 646464646464646464646464646464646464646464646464646464646464636363636363646464 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363626262 626262626262626262626262626262626262626262626262626262626262626262626262626262 6262626161616262626161616161616161616161616161616161616161616161616161611C242B 1C242B1C242C0E10130302020606060606060000004C4B49EDEDEAF8F5F1F6F3EFF6F3EFF7F4F0 FBF8F4D4D2D09594957D7D7E67696A535558424446333539222428181C1F14181C1115190F1015 2D3232959898979696000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 0000000000000000000000000000000000000000000000000000000000004A4A4CD4D4D3979798 7C7B7D7E7F7F34363816181B21232724272A4545485756586261626E6E6F7A797A8685858B8A8A B6B4B2F5F2EDF8F5F1F6F3EFF5F2EEFCF9F5E3E3E03E3E3C000000060606050303090A0A1B2229 1D252C1C242B616161616161616161616161626262616161626262616161626262626262626262 626262626262626262626262626262626262626262626262626262626262626262626262636363 626262636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363646464636363646464 636363646464646464646464646464646464646464646464646464646464646464656565656565 646464656565656565656565656565656565656565656565656565656565656565666666666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666666666676767676767666666 676767676767676767676767676767676767676767676767676767676767676767676767676767 676767676767686868686868676767676767676767686868686868686868686868686868686868 686868686868686868686868686868686868686868686868686868686868686868686868686868 686868686868686868686868696969696969686868696969696969696969686868696969696969 686868696969696969696969696969696969696969686868696969696969696969686868696969 686868696969696969686868696969696969686868696969686868696969686868686868686868 686868686868686868686868686868686868686868686868686868686868686868686868686868 686868686868686868686868686868686868686868686868676767676767676767676767676767 676767676767676767676767676767676767676767676767676767676767666666676767666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666666666656565666666666666 656565656565656565656565656565656565656565656565656565646464646464656565646464 646464646464646464646464646464646464646464646464646464636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363626262626262626262 636363626262626262626262626262626262626262626262626262626262626262626262626262 6161616161616262626262626161616262626161616161616161616161611C242B1C242B1C242C 0E10130302020606060606060000004E4D4CEDEDEAF8F5F1F6F3EFF6F3EFF7F4F0FBF8F4D3D1CE 9394937D7D7E66666952545642454833363A212327181C2016191D14181D0E12152B302F989B9B 989898000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 0000000000000000000000000000000000000000000000001F1F21CDCDCD98989A7A7C7C808181 35363816171922242725282B4646485756586161626F6E6E79797B84858689898AB5B4B2F5F2ED F8F5F1F6F3EFF5F2EEFCF9F5E3E3E03E3D3C000000060606050303090A0A1B22291D252C1C242B 616161616161616161616161626262626262626262626262626262626262626262626262626262 626262626262626262626262626262626262636363626262636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363646464646464646464646464646464 646464646464646464646464646464646464646464646464656565656565656565656565656565 656565656565656565656565656565656565656565656565656565666666666666666666666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666676767676767676767676767676767676767676767676767 676767676767676767676767676767676767686868676767676767676767686868686868676767 686868686868686868686868686868686868686868686868686868686868686868686868686868 686868686868686868686868686868696969696969686868696969686868696969696969696969 696969696969696969696969696969696969696969696969696969696969696969696969696969 696969696969696969696969696969696969696969696969696969696969696969696969696969 696969696969696969696969696969696969696969696969696969696969696969696969686868 686868686868696969696969686868686868696969686868696969686868686868686868686868 686868686868686868686868686868686868686868686868686868686868676767676767676767 686868676767676767676767676767676767676767676767676767676767676767676767676767 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666666666666666656565656565 656565656565656565656565656565656565656565656565656565656565656565656565646464 646464646464646464646464646464646464646464646464636363646464646464636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363626262626262626262626262 626262626262626262626262626262626262626262626262626262626262626262626262616161 6161616161616262626262626161616262626161616161611C242B1C242B1C242C0E1013030202 0606060606060000004E4D4CEDEDEAF8F5F1F6F3EFF6F3EFF7F4F0FBF8F4D2D1CE9293927C7C7D 67676852555741434831343822252A1B1E24181C2315181E0D0F13282F2E999B9B9A989A000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 0000000000000000000000000000000000000F0F0FCACACB999A9C797A7B7C7C7D333436161719 2022252426294545475656586060626E6E6E7A7A7A848585898989B5B4B2F5F2EDF8F5F1F6F3EF F5F2EEFCF9F5E2E2E03D3C3B000000060606050303090A0A1B22291D252C1C242B626262616161 616161626262616161616161626262626262626262626262626262626262626262626262626262 626262636363626262636363636363636363636363626262636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 6363636363636363636363636363636464646464645C5C5C4848484848484848484B4B4B646464 646464646464646464646464656565646464656565656565656565656565656565656565656565 6565656565656565656666665959593838382B2B2B1D1D1D2020202E2E2E414141646464666666 666666666666666666666666575757404040404040414141666666666666666666666666666666 666666676767676767666666666666676767676767676767676767676767676767676767676767 676767676767676767676767676767686868686868686868686868686868686868686868686868 6868686868686868686868686868686868686868686969695151514C4C4C4C4C4C5B5B5B696969 696969696969696969696969696969696969696969696969696969696969696969696969696969 696969696969696969696969696969696969696969696969696969696969696969696969696969 6868685656564444443232323737374A4A4A5E5E5E696969696969696969696969696969696969 696969696969696969696969696969696969696969696969696969696969696969696969696969 6969695050504C4C4C4C4C4C5B5B5B686868696969696969686868696969686868686868686868 686868686868686868686868686868686868686868686868686868676767686868686868676767 6767676767676767676767676767676767676767676767676767675D5D5D4A4A4A4A4A4A4C4C4C 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666666666666666656565666666 656565656565656565656565656565656565656565656565656565656565656565646464656565 646464646464646464646464646464646464646464646464636363646464646464646464636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363626262626262626262626262 636363626262626262626262626262626262626262626262626262626262626262616161626262 6262626161616161616161616161616161611C242B1C242B1C242C0E1013030202060606060606 0000004E4D4BEDEDEAF8F5F1F6F3EFF6F3EFF6F3F0FAF8F3D2D0CD9393927C7D7E67686A525455 42444732353A2224291B1F25181A2211131C0C0D10272D2B969999989898000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000111111C9CACA999A9B7B7B7D7D7D7E323435141619202126232528 4446485656586160626D6D6E7A7A7A868686898888B6B3B2F5F2EDF8F5F1F6F3EFF5F2EEFCF9F5 E3E2E03E3C3C000000060606050303090A0A1B22291D252C1C242B626262616161626262626262 626262626262626262626262626262626262626262626262626262626262626262626262626262 636363626262626262636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363646464636363646464646464323232010101010101010101010101575757646464646464 656565656565656565656565656565656565656565656565656565656565666666666666656565 6262623030300303030101010101010000000000000101010101010E0E0E464646666666666666 6666666666663E3E3E010101010101020202666666666666676767676767666666676767676767 676767676767676767676767676767676767676767676767686868676767676767676767686868 686868686868686868686868686868686868686868686868686868686868686868686868686868 696969696969696969696969696969696969101010010101010101393939696969696969696969 696969696969696969696969696969696969696969696969696969696969696969696969696969 696969696969696969696969696969696969696969696969696969696969595959171717010101 0101010101010101010101010101010E0E0E525252696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969690E0E0E 010101010101393939696969696969696969696969696969696969696969686868696969686868 686868686868686868686868686868686868686868686868686868686868686868686868686868 676767686868676767686868676767676767676767414141010101010101040404676767666666 676767676767676767676767666666666666666666666666666666666666666666666666666666 6666666666665050504F4F4F4F4F4F5E5E5E666666666666666666666666666666666666666666 656565666666656565656565656565656565656565656565656565656565656565646464656565 646464646464646464646464646464646464646464646464636363636363646464636363646464 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363626262626262636363636363626262 626262626262626262626262626262626262626262626262626262626262626262626262626262 6262626161616161616161611C242B1C242B1C242C0E10130302020606060606060000004E4D4B EDEDEAF8F5F1F6F3EFF6F3EFF6F3F0FAF8F3D0CFCD9393937B7C7D65676850525442444732363B 22252A191F2316191F13171D0D1015252B29969A999A9A9A000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000111111CACACA9B9B9C7C7C7E828282343536121518202225242628454648565759 6160626D6C6D797979868686898889B6B4B3F5F2EEF8F5F1F6F3EFF5F2EEFCF9F5E2E2E03E3C3B 000000060606050303090A0A1B22291D252C1C242B616161626262626262626262626262626262 626262626262626262626262626262626262626262626262636363626262636363636363636363 626262636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363646464 6464646464646464640F0F0F000000000000000000000000353535656565656565656565656565 6565656565656565656565656565656565656565656666666666666565656666662C2C2C010101 0000000000000000000000000000000000000000000000000202024A4A4A666666666666666666 3E3E3E000000000000010101666666666666666666676767676767676767676767676767676767 676767676767676767676767676767686868686868686868686868686868686868686868686868 686868686868686868696969686868686868686868696969686868696969696969696969696969 6969696969696969696969690F0F0F000000000000383838696969696969696969696969696969 696969696969696969696969696969696969696969696969696969696969696969696969696969 696969696969696969696969696969696969696969424242040404000000000000000000000000 000000000000000000000000040404444444696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969690D0D0D000000000000 383838696969696969696969696969696969696969696969696969696969696969686868686868 686868696969686868686868686868686868686868686868686868686868686868686868686868 686868686868676767676767676767414141000000000000030303676767676767676767676767 676767666666676767666666666666666666666666666666666666666666666666666666666666 030303010101010101454545666666666666666666666666666666666666666666666666656565 656565666666656565656565656565656565656565656565656565656565656565646464646464 646464646464646464646464646464646464646464646464646464646464636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363626262636363636363636363636363626262 626262626262626262626262626262626262626262626262626262626262616161626262626262 6161616161611C242B1C242B1C242C0E10130302020606060606060000004E4D4CEDEDEAF8F5F1 F6F3EFF6F3EFF6F3F0FAF8F3D0CFCC9192927C7C7D6668695152553F424531343822262B1B1F25 15181D13171C0D1215282E2E9699999A9A9A000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 111111CACACB9C9C9C7B7C7C7B7C7C3233331416182022252426294546485656586060636C6C6D 787878868686898989B6B4B3F5F2EEF8F5F1F6F3EFF5F2EEFCF9F5E2E2DE3B3B3A000000060606 050303090A0A1B22291D252C1C242B626262616161626262626262626262626262626262626262 626262626262626262626262626262626262626262636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363646464636363646464646464646464646464 4F4F4F000000000000000000000000000000121212656565656565656565656565656565656565 6565656565656565656565656666666666666666666666664D4D4D010101000000000000111111 2F2F2F4747473D3D3D2626260101010000000000000606066060606666666767674A4A4A1E1E1E 1E1E1E1F1F1F676767676767676767676767676767676767676767676767676767686868676767 676767686868686868686868686868686868686868686868686868686868686868686868686868 696969696969696969696969696969696969696969696969696969696969696969696969696969 6969696969690F0F0F000000000000383838696969696969696969696969696969696969696969 696969696969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969695C5C5C0404040000000000000000001111112929292D2D2D1A1A1A 000000000000000000010101454545696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969690D0D0D000000000000383838696969 696969696969696969696969696969696969696969696969696969696969696969696969696969 696969696969696969686868696969686868686868686868686868686868686868686868686868 686868686868676767414141000000000000030303676767676767676767676767676767676767 676767676767676767666666666666676767666666666666666666666666666666020202000000 000000444444666666666666666666666666666666666666666666666666666666666666656565 656565656565656565656565656565656565656565656565656565656565656565656565646464 646464646464646464646464646464646464646464646464646464646464636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363626262636363626262 626262626262626262626262626262626262626262626262626262626262626262626262616161 1C242B1C242B1C242C0E10130302020606060606060000004E4D4BEDEDEAF8F5F1F6F3EFF6F3EF F6F3F0FAF8F3D0CECC9292917C7C7D6666685052544042462F31372124291B1D2415191E12161B 0E1015292F2F96999A9A9A98000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000111111CCCCCD 9A9A9B797A7B7E7D7E31333413151920222525262A4646495555576061626B6B6C787778868585 898788B6B5B3F5F2EEF8F5F1F6F3EFF5F2EEFCF9F5E2E2DE3B3B3A000000060606050303090A0A 1B22291D252C1C242B626262616161626262626262626262626262626262626262626262626262 626262626262626262636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 6363636363636464646363636363636464646464646464646464646464646464642C2C2C000000 000000030303000000000000000000525252656565656565656565656565656565656565656565 6565656666666666666666666666666666663232320000000000000E0E0E626262666666666666 666666666666404040000000000000000000484848666666676767676767676767676767676767 676767676767676767676767676767676767676767676767686868676767686868686868686868 686868686868686868686868666666686868686868696969696969696969696969696969696969 696969696969696969696969696969676767696969696969696969696969696969696969696969 0F0F0F000000000000383838696969696969696969696969696969696969696969636363696969 6969696969696969696969696A6A6A696969696969696969696969696969696969696969696969 6969696A6A6A1F1F1F0000000000000000003030306A6A6A6A6A6A6A6A6A696969484848010101 0000000000000C0C0C676767696969696969696969696969696969696969656565696969696969 6969696969696969696969696969696969690D0D0D000000000000383838696969696969696969 696969696969696969696969676767676767696969696969696969696969696969696969696969 696969696969696969686868696969686868696969686868686868686868686868686868686868 686868414141000000000000030303676767686868686868676767676767676767676767676767 636363676767676767676767676767666666666666666666666666020202000000000000454545 666666666666666666666666666666666666666666666666616161585858656565666666666666 656565656565656565656565656565656565656565656565656565656565656565646464616161 646464646464646464646464646464646464646464646464646464646464636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363626262636363626262626262626262626262 6262626262626262626262626262626262626262626262626262626161616262621C242B1C242B 1C242C0E10130302020606060606060000004F4E4CEDEDEAF8F5F1F6F3EFF6F3EFF6F3F0FAF8F3 D1CFCD9291917A7A7B6566685153554345483134392224291B1E23171C2112161C0D0F13282E2E 989A9A9A9A98000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000111111CBCBCC9A9A9D7A7A7B 7E7F7F32333513151820222424262A45474A5556586060626C6B6C787778868585888888B5B4B2 F5F3EEF8F5F1F6F3EFF5F2EEFCF9F5E2E2DE3B3B3A000000060606050303090A0A1B22291D252C 1C242B626262626262626262626262626262626262626262626262626262626262626262636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363646464636363 6363636464646464646464646464646464646464646464646363630A0A0A0000000000002E2E2E 0505050000000000002F2F2F656565656565656565656565656565666666666666666666666666 666666666666666666666666212121000000000000202020656565666666666666666666666666 6363631010100C0C0C0C0C0C3A3A3A666666676767484848181818181818181818676767676767 6868681A1A1A1A1A1A1A1A1A5454544C4C4C2727270A0A0A0B0B0B2727275353536868685B5B5B 2727270F0F0F0303031313134545456969696969696969696969693E3E3E181818181818343434 6262623030300B0B0B0202021010102C2C2C6262626969696969696969696969690F0F0F000000 0000003838386969696969696969696969695252521D1D1D0B0B0B0202020909091E1E1E3F3F3F 6969696969696A6A6A6A6A6A6969696A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A4E4E4E 0000000000000000001E1E1E6969696A6A6A6A6A6A6969696A6A6A696969252525000000000000 0000005151516A6A6A6A6A6A6A6A6A3F3F3F1B1B1B0B0B0B0202020404041010103131315D5D5D 6969696969696969696A6A6A0D0D0D0000000000003838386969696969696969696969695F5F5F 2929291212120303030303030D0D0D2B2B2B595959696969696969696969666666181818181818 181818494949696969696969696969696969212121181818181818404040686868686868414141 0000000000000303036868686868686767676868686868683D3D3D1A1A1A0A0A0A020202040404 1010103030305A5A5A6767676767673434342424240101010000000000001818182424244B4B4B 6666666666666666665D5D5D2626260E0E0E0202020101010505051515153B3B3B656565666666 6666666565656565654040401717171717172E2E2E6262623A3A3A191919070707656565646464 646464646464646464646464646464646464646464636363636363636363646464636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363626262626262626262626262 6262626262626262626262626262626262626262626262626262621C242B1C242B1C242C0E1013 030202060606060606000000504F4CEEEDEBF8F5F1F6F3EFF6F3EFF6F3EFFBF8F4D0CECC919191 7B7B7B6667695254564345483134372224291B1E25181B2112161C0B0D122D32309A9D9B9A9A9A 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000111111CCCCCC99999B79797B7E7E7E313133 121417202225232629444648555658605F626B6B6C787778868585898889B6B4B3F5F3EEF8F5F1 F6F3EFF5F2EEFCF9F5E2E1DE3B3A39000000060606050303090A0A1B22291D252C1C242B626262 626262626262626262626262626262626262626262626262636363626262626262626262636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363646464646464646464 646464646464646464646464646464656565474747010101000000000000525252242424000000 0000000C0C0C646464656565656565666666666666666666666666666666666666666666666666 6666666666662E2E2E000000000000040404484848666666666666666666666666666666666666 6666666666666666666767676767673E3E3E000000000000010101676767686868676767000000 0000000000003434340202020101010000000000000101010C0C0C555555101010010101000000 0000000000000101013B3B3B6969696969696969693232320000000000001F1F1F191919010101 0000000000000000000101010D0D0D5757576969696969696969690F0F0F000000000000383838 6A6A6A6A6A6A6969693636360202020000000000000000000000000000000101012B2B2B696969 6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A383838000000000000 0000004C4C4C6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A5B5B5B363636363636363636565656 6A6A6A6969692020200101010000000000000000000000000000000101010B0B0B585858696969 6A6A6A6A6A6A0D0D0D0000000000003838386969696969696969694E4E4E090909010101000000 000000000000000000010101030303505050696969696969656565000000000000000000404040 6969696969696969696969690B0B0B000000000000343434686868696969414141000000000000 030303686868686868686868666666202020010101000000000000000000000000000000010101 0A0A0A5656566767671919190101010000000000000000000000000101013D3D3D666666666666 4E4E4E0B0B0B010101000000000000000000000000000000010101212121606060666666656565 6666663636360000000000001D1D1D262626010101000000050505656565656565646464646464 646464646464646464646464646464646464646464646464636363646464646464636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363626262626262626262626262626262 6262626262626262626262626262626262626262621C242B1C242B1C242C0E1013030202060606 060606000000504F4CEEEDEBF8F5F1F6F3EFF6F3EFF6F3EFFAF7F4CFCDCA9091907B7C7C67686A 5356584245473134392122291B1D23181B2112171C0B0D122B2E309C9FA09A9A9A000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000111111CCCCCC98989A7B7B7C7F7F7F323234121518202124 2426294546485555575F5F616B6B6D787778858485898888B6B4B3F5F3EEF8F5F1F6F3EFF5F2EE FCF9F5E1E1DD3A3938000000060606050303090A0A1B22291D252C1C242B626262626262626262 626262626262626262626262636363626262626262636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363646464646464646464646464646464646464646464 6464646464646565656565652525250101010000000F0F0F656565444444010101000000000000 4B4B4B656565666666666666666666666666666666666666666666666666666666666666666666 4343430000000000000000000101010E0E0E2929294343435B5B5B676767676767676767676767 6767676767676767673E3E3E000000000000010101676767686868686868000000000000000000 0101010101010D0D0D0101010000000000000000000202020000000909090B0B0B000000000000 000000080808666666696969696969323232000000000000000000000000000000070707000000 0000000000000000001A1A1A6A6A6A6969696969690F0F0F0000000000003838386A6A6A6A6A6A 4E4E4E0101010000000000000101011B1B1B0505050000000000000101012E2E2E6A6A6A6A6A6A 6A6A6A6A6A6A6B6B6B6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A282828000000000000010101696969 6B6B6B6A6A6A6A6A6A6A6A6A6B6B6B6A6A6A6A6A6A6969696A6A6A6969696A6A6A6A6A6A4F4F4F 0101010000000000000707072222221515150101010000000000002626266969696A6A6A6A6A6A 0D0D0D0000000000003838386A6A6A6A6A6A6464640B0B0B0000000000000000000C0C0C060606 0000000000000000000A0A0A646464696969666666000000000000000000404040696969696969 6969696969690B0B0B000000000000343434686868696969424242000000000000030303686868 6868686868684D4D4D010101000000000000070707212121141414010101000000000000252525 6666662F2F2F1C1C1C0101010000000000001313131C1C1C484848666666616161090909000000 0000000000001313131E1E1E0A0A0A0000000000000000002C2C2C666666666666666666363636 000000000000060606010101000000000000050505656565656565646464646464646464656565 646464646464646464646464646464646464646464646464636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363626262636363626262626262626262626262626262626262 6262626262626262626262626262621C242B1C242B1C242C0E1013030202060606060606000000 504F4CEEEDEBF8F5F1F6F3EFF6F3EFF6F3EFFAF7F3CFCDCB9191907B7C7C666769525356404346 32353A212429191D22161A1E11161B0D10152B2F2E9B9C9C9A9A9A000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000121212CCCCCC98989A78797B7A797B3030331314181E2023232528454648 555557605F616C6C6D787779858584898888B6B5B4F5F3EEF8F5F1F6F3EFF5F2EEFCF9F5E1E1DD 3A3938000000060606050303090A0A1B22291D252C1C242B626262626262626262626262626262 626262626262636363636363636363626262636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363646464646464646464646464646464646464646464656565646464656565 6565656060600505050000000000002F2F2F656565606060040404000000000000292929666666 6666666666666666666666666666666666666666666666666666666666666666666464641F1F1F 0000000000000000000000000101010101010101010F0F0F2E2E2E525252676767676767676767 6767673F3F3F0000000000000101016868686868686868680000000000000000000F0F0F5D5D5D 6868685C5C5C0909090000000000000000003535356868686868682D2D2D000000000000000000 5050506969696969693232320000000000000000001616165858586868685E5E5E181818000000 0000000000004A4A4A6A6A6A6A6A6A0F0F0F0000000000003838386A6A6A696969121212000000 0000001616165E5E5E6969696464642727270000000000000606066565656A6A6A6B6B6B6B6B6B 6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B1818180000000000000C0C0C6B6B6B6B6B6B6B6B6B 6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B2B2B2B010101000000 2020206767676A6A6A6969692626260000000000000F0F0F6969696A6A6A6A6A6A0D0D0D000000 0000003838386A6A6A6A6A6A333333010101000000000000454545696969646464333333000000 0000000000004B4B4B696969666666000000000000000000404040696969696969696969696969 0B0B0B000000000000343434686868696969424242000000000000030303696969686868686868 2A2A2A0101010000001F1F1F6565656767676767672525250000000000000E0E0E666666666666 666666020202000000000000444444666666666666666666333333000000000000010101464646 646464656565626262202020000000000000030303575757666666666666363636000000000000 0000000000002424243B3B3B454545656565656565656565656565656565656565646464646464 646464646464646464646464646464646464646464646464646464646464636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363626262626262626262636363626262626262626262626262 6262626262626262621C242B1C242B1C242C0E1013030202060606060606000000504F4CEEEDEB F8F5F1F6F3EFF6F3EFF6F3EFFAF7F3CFCDCA9291917C7D7D666769525356434448323438222529 191D2216191D14171E0E10162B2F309A9B9C9A9A9A000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000121212CCCBCC9A999C797A7C7B7C7C3031331115181E202424252846474A565657605F61 6C6C6E787879848484888888B6B5B4F5F3EEF8F5F1F6F3EFF5F2EEFCF9F5E1E1DD393938000000 060606050303090A0A1B22291D252C1C242B626262626262626262626262626262626262626262 636363626262626262636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363646464 646464646464646464646464646464646464646464646464656565656565656565656565414141 0000000000000000005050506565656565651F1F1F000000000000070707636363666666666666 6666666666666666666666666666666666666666666666666666666666666161612A2A2A030303 0000000000000000000000000000000000000101010101012B2B2B6868686868686868683F3F3F 000000000000010101686868686868686868000000000000000000313131696969696969696969 2323230000000000000202026565656969696969695454540000000000000000004A4A4A696969 6969693232320000000000000101015B5B5B6969696A6A6A6A6A6A555555000000000000000000 3131316A6A6A6A6A6A0F0F0F0000000000003838386B6B6B5D5D5D000000000000000000454545 6969696B6B6B6B6B6B5A5A5A0000000000000000004545456B6B6B6B6B6B6B6B6B6B6B6B6B6B6B 6B6B6B6B6B6B6B6B6B6B6B6B0C0C0C0000000000001414146B6B6B6B6B6B6B6B6B6B6B6B6B6B6B 6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B4A4A4A4343434343435B5B5B6B6B6B 6B6B6B6969691A1A1A0000000000000606066969696B6B6B6B6B6B0E0E0E000000000000383838 6B6B6B6A6A6A1111110101010000002020206969696A6A6A6A6A6A686868191919141414141414 3F3F3F6A6A6A6666660000000000000000004040406969696969696969696969690B0B0B000000 000000343434686868696969424242000000000000030303696969696969696969494949414141 414141595959686868686868666666191919000000000000060606666666686868676767020202 0000000000004545456767676767676767670C0C0C000000000000232323666666666666666666 6666665B5B5B020202000000000000343434666666666666363636000000000000000000353535 646464646464656565656565656565656565656565656565656565656565646464646464646464 646464646464646464646464646464646464646464646464636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363626262626262626262626262626262 6262621C242B1C242B1C242C0E1013030202060606060606000000504F4CEEEDEBF8F5F1F6F3EF F6F3EFF6F3EFFAF7F3CFCDCB9292927D7D7D6668685254554345473133372224281A1D22171A20 14181E0D1015282E2F97999A9C9B9B000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000121212 CCCCCD9B9B9C7A7B7D7E7E7E3031331215181D202323252845474A555558605F626D6D6E787778 858484888888B6B5B4F5F3EEF8F5F1F6F3EFF5F2EEFCF9F5E1E0DC383836000000060606050303 090A0A1B22291D252C1C242B626262626262626262626262626262626262636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363646464646464636363646464646464 6464646464646464646464646464646464646565656565656565656565651E1E1E000000000000 0D0D0D6666666666666666663F3F3F000000000000000000464646666666666666666666666666 666666666666666666666666666666666666666666676767666666656565606060454545282828 0F0F0F0000000000000000000000000000000101013939396868686868683F3F3F000000000000 0101016969696868686969690000000000000000003F3F3F6969696969696969692F2F2F000000 0000001010106767676969696969695D5D5D0000000000000000004747476A6A6A6A6A6A323232 0000000000000E0E0E6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A0808080000000000002222226B6B6B 6B6B6B0F0F0F0000000000003939396B6B6B4F4F4F000000000000000000222222252525252525 2525252525250404040000000000002E2E2E6B6B6B6C6C6C6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B 6C6C6C6C6C6C1717170000000000000C0C0C6B6B6B6C6C6C6C6C6C6B6B6B6C6C6C6B6B6B6B6B6B 6B6B6B6C6C6C6B6B6B6B6B6B6B6B6B6C6C6C6A6A6A6B6B6B5656563C3C3C282828191919060606 0000000000000000000606066A6A6A6B6B6B6B6B6B0E0E0E0000000000003939396B6B6B696969 0202020000000000003535356A6A6A6A6A6A6A6A6A6A6A6A6969696969696969696969696A6A6A 6767670000000000000000004040406969696969696969696969690B0B0B000000000000343434 6868686969694242420000000000000303036969696969696969696969696868685454543A3A3A 272727191919060606000000000000000000060606666666676767676767020202000000000000 454545676767676767626262020202000000000000404040666666666666666666666666666666 131313000000000000242424666666666666363636000000000000000000585858656565666666 656565656565656565656565656565656565656565656565646464656565646464646464646464 646464646464646464646464646464646464636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 6363636363636363636363636262626363636262626262626262626262626262626262621C242B 1C242B1C242C0E101303020206060606060600000051504DEEEEECF8F5F1F6F3EFF6F3EFF6F3EF FAF7F3D0CDCB9393937C7E7F67696A5355564244473134372224281A1D21171A2013151E0A0D13 272E2B9B9D9C9A9A9A000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000121212CBCBCB979899 7A7B7C7B7B7B2F30311115171E202423262946484A5656586160636D6D6F777778848484898A8A B8B6B5F5F3EEF8F5F1F6F3EFF5F2EEFCF9F5E0E0DC383836000000060606050303090A0A1B2229 1D252C1C242B626262626262626262626262636363626262636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363646464646464646464646464646464646464646464646464646464646464 6464646464646464646464646565656565656565655C5C5C010101000000000000111111313131 313131313131292929000000000000000000232323656565666666666666666666666666666666 6666666666666666666666666666666767676767676767676767676666666666666666665E5E5E 4343431E1E1E0000000000000000000C0C0C6767676868683F3F3F000000000000010101696969 696969696969000000000000000000404040696969696969696969313131000000000000121212 6868686969696969695D5D5D0000000000000000004848486A6A6A6A6A6A323232000000000000 1E1E1E6A6A6A6A6A6A6A6A6A6B6B6B6A6A6A1E1E1E0000000000001818186B6B6B6B6B6B0F0F0F 0000000000003939396B6B6B414141000000000000000000010101010101010101010101010101 0000000000000000002929296C6C6C6C6C6C6B6B6B6C6C6C6C6C6C6B6B6B6C6C6C6C6C6C6C6C6C 2727270000000000000101016A6A6A6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6767671F1F1F010101010101010101000000000000040404000000 0000000606066A6A6A6B6B6B6B6B6B0E0E0E0000000000003939396B6B6B5F5F5F000000000000 0000004343436B6B6B6B6B6B6B6B6B6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A676767000000 0000000000004141416A6A6A6A6A6A6A6A6A6969690B0B0B000000000000353535686868696969 4242420000000000000303036969696969696969696464641E1E1E010101010101010101000000 000000040404000000000000060606676767686868686868020202000000000000454545676767 6767675454540202020000000000004B4B4B6666666767676666666666666666661E1E1E010101 000000161616666666666666363636000000000000040404656565666666666666666666666666 656565656565656565656565656565656565656565656565646464646464656565646464646464 646464646464646464646464646464636363636363646464636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 6363636363636363636262626262626262626262626262626262626262621C242B1C242B1C242C 0E101303020206060606060600000051504EEEEEECF8F5F1F6F3EFF6F3EFF6F3EFFAF7F3CFCDCB 9392937E7E7F696B6D555759444649303337202326191C2116191F13161D0A0C10292E2C9C9E9D 9B9B9B000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000121212CDCDCD989999797A7B7A7B7B 3031301213171F212423262946484A5656586161646D6D6E7877788584858A8989B8B6B5F6F3EF F8F5F1F6F3EFF5F2EEFCF9F5E0DFDC383736000000060606050303090A0A1B22291D252C1C242B 626262636363626262636363636363626262636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 646464646464646464636363646464646464646464646464646464646464646464656565656565 6565656565656565656565656565653A3A3A000000000000000000000000010101010101010101 0101010000000000000000000303035F5F5F666666666666666666666666666666666666666666 666666676767676767474747454545454545565656676767676767686868686868676767676767 1C1C1C0000000000000000005F5F5F6969693F3F3F000000000000010101696969696969696969 0000000000000000004040406969696969696969693131310000000000001212126868686A6A6A 6969695E5E5E0000000000000000004848486A6A6A6A6A6A3232320000000000001B1B1B6A6A6A 6B6B6B6B6B6B6B6B6B6B6B6B0E0E0E0000000000002323236B6B6B6B6B6B101010000000000000 3939396C6C6C474747000000000000010101303030303030303030303030303030303030303030 3030304646466C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C363636000000 0000000000004F4F4F6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C4A4A4A0E0E0E0E0E0E0E0E0E 5252526C6C6C2020200101010000000101011C1C1C3939395050503F3F3F000000000000060606 6A6A6A6C6C6C6B6B6B0E0E0E0000000000003939396B6B6B6363630000000000000000003D3D3D 6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6A6A6A6A6A6A676767000000000000000000 4141416A6A6A6A6A6A6A6A6A6A6A6A060606000000000000353535686868696969424242000000 0000000303036969696969696969691F1F1F0101010000000101011C1C1C3838384E4E4E3D3D3D 0000000000000606066767676868686868680202020000000000004646466767676767675D5D5D 0202020000000000004444446767676767676767676666666666661717170101010000001F1F1F 6666666666663636360000000000000B0B0B666666666666666666666666656565666666656565 656565656565656565656565656565656565656565656565646464646464656565646464646464 646464646464646464636363646464646464646464636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 6262626363636363636262626262626262626262626262621C242B1C242B1C242C0E1013030202 06060606060600000051504EEEEEECF8F5F1F6F3EFF6F3EFF6F3EFFAF7F3CFCDCB9493937E7F7F 6A6C6D56575B4446493235391F2226181C2015181D13171D0B0F132B30309B9E9D9A9B9A000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000121212CDCDCD9B9B9B78797A79797B2F2F31111317 1E20222325284747495556586161636D6D6F777778848484898989B8B7B5F6F3EFF8F5F1F6F3EF F6F3EFFDFAF6E0DFDB363535000000060606050303090A0A1B22291D252C1C242B626262626262 626262626262636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363646464636363636363 646464646464646464646464646464646464646464646464646464646464656565656565656565 656565656565656565161616000000000000000000000000000000000000000000000000000000 0000000000000000003F3F3F666666666666666666666666676767676767676767676767676767 6767671111110101010101011B1B1B6767676868686868686868686868686868683C3C3C000000 0000000000006161616868683F3F3F000000000000010101696969696969696969000000000000 0000004040406969696969696969693131310000000000001212126868686A6A6A6A6A6A5E5E5E 0000000000000000004848486B6B6B6A6A6A3333330000000000000A0A0A6A6A6A6B6B6B6B6B6B 6B6B6B5D5D5D0000000000000000003131316B6B6B6B6B6B1010100000000000003939396C6C6C 5858580000000000000000005F5F5F6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C525252000000000000000000 1A1A1A6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C161616000000000000060606696969656565 0000000000000000003434346B6B6B6B6B6B6C6C6C3838380000000000000606066B6B6B6C6C6C 6C6C6C0E0E0E0000000000003939396C6C6C6C6C6C0606060000000000002E2E2E6B6B6B6B6B6B 6B6B6B6A6A6A2C2C2C2828282828284949496B6B6B6A6A6A0101010000000000003737376A6A6A 6A6A6A6A6A6A5E5E5E000000000000000000353535686868696969424242000000000000030303 696969696969626262000000000000000000323232686868686868696969363636000000000000 060606676767686868686868020202000000000000464646676767686868686868070707000000 0000002F2F2F6767676767676767676666666363630707070000000000002F2F2F666666666666 3636360000000000000B0B0B666666666666666666666666666666666666666666656565656565 656565656565656565656565656565656565656565646464656565656565646464646464646464 646464646464646464646464636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 6262626363636363636262626363636262621C242B1C242B1C242C0E1013030202060606060606 00000051504EEEEEECF8F5F1F6F3EFF6F3EFF6F3EFFAF7F3CFCECB9494947F80806A6A6C56575A 45474A35373B212327181C1F15191D13181F0D1016292E2F9B9E9E9B9C9B000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000121212CCCCCC9C9C9E78787C7A797A2D2F2F0F12151D1F23242528 4747495657586161636E6D6F787778848484888889B8B6B6F6F3EFF8F5F1F6F3EFF6F3EFFDFAF6 E0DFDB373535000000060606050303090A0A1B22291D252C1C242B636363626262626262636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363646464646464646464 646464646464646464656565646464646464656565656565656565656565656565656565666666 5757570000000000000000001B1B1B373737373737373737373737373737373737020202000000 0000001C1C1C666666666666666666666666676767676767676767676767676767676767262626 0000000000000000004848486868686868686868686868685F5F5F151515000000000000101010 6767676969693F3F3F000000000000010101696969696969696969000000000000000000404040 6969696969696A6A6A3131310000000000001212126969696A6A6A6A6A6A5E5E5E000000000000 0000004949496B6B6B6A6A6A3333330000000000000000003C3C3C6B6B6B6C6C6C6B6B6B373737 0000000000000000004646466C6C6C6C6C6C1010100000000000003939396C6C6C686868010101 0000000000003333336B6B6B6C6C6C6C6C6C5D5D5D1C1C1C1B1B1B1B1B1B4E4E4E6C6C6C6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C212121000000000000000000252525 6767676C6C6C6C6C6C6A6A6A3030300000000000000000002929296C6C6C505050000000000000 0000005A5A5A6C6C6C6C6C6C6C6C6C1B1B1B0000000000000606066B6B6B6C6C6C6C6C6C0E0E0E 0000000000003939396C6C6C6C6C6C1919190000000000000C0C0C6363636B6B6B6C6C6C505050 0101010101010101014848486B6B6B6B6B6B0808080000000000001F1F1F6A6A6A6B6B6B6A6A6A 3434340000000000000000003535356969696A6A6A424242000000000000030303696969696969 4E4E4E0000000000000000005757576969696969696868681A1A1A000000000000060606686868 696969686868020202000000000000424242686868686868686868232323000000000000070707 5C5C5C6767676767676767673737370000000000000000004A4A4A666666666666363636000000 0000000B0B0B666666666666666666666666666666666666666666666666666666656565656565 656565656565656565656565656565646464646464656565646464646464646464646464646464 646464646464646464646464636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 6363636363636262626262621C242B1C242B1C242C0E101303020206060606060600000051504E EEEEECF8F5F1F6F3EFF6F3EFF6F3EFFAF7F3CFCECB9394937E7E7F6A6B6C56585A474A4C34373A 2122281A1D2218192115191F0D1015272D2C9C9F9C9C9C9C000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000121212CCCCCD9A9A9B78797A7A7A7C2D2D2E1113161E202323242746474A565759 6161626D6D6E7877788584858A8989B9B7B4F6F3EFF8F5F1F6F3EFF6F3EFFDFAF6E0DFDB373535 000000060606050303090A0A1B22291D252C1C242B626262636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363646464646464646464646464646464646464646464646464 646464656565656565656565656565656565656565656565656565656565666666343434000000 0000000000004D4D4D6565656565656565656565656565656565651C1C1C000000000000010101 5D5D5D666666666666676767676767676767676767676767676767676767515151020202000000 0000000101011A1A1A2C2C2C2F2F2F2121210909090000000000000000003C3C3C686868696969 3F3F3F0000000000000101016969696969696969690000000000000000004141416969696A6A6A 6A6A6A3131310000000000001212126969696A6A6A6B6B6B5F5F5F0000000000000000004A4A4A 6B6B6B6B6B6B3333330000000000000000000202021B1B1B363636232323010101000000000000 1010106969696C6C6C6C6C6C1010100000000000003A3A3A6C6C6C6C6C6C353535000000000000 0101012525254444443333330C0C0C0000000000000606066363636C6C6C6C6C6C6C6C6C6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C5C5C5C0202020000000000000101010707071C1C1C 1E1E1E0B0B0B0101010000000000000D0D0D6464646C6C6C5C5C5C0000000000000000002B2B2B 5F5F5F4D4D4D2626260000000000000000000404046B6B6B6C6C6C6C6C6C0E0E0E000000000000 3939396C6C6C6C6C6C4B4B4B0101010000000000001313133939392D2D2D080808000000000000 0E0E0E6666666B6B6B6B6B6B1F1F1F0000000000000000001F1F1F3434341E1E1E010101000000 0000000000003535356969696A6A6A434343000000000000030303696969696969595959000000 0000000000002A2A2A5D5D5D4A4A4A252525000000000000000000040404686868696969696969 0606060000000000001D1D1D4242425858586868685858580101010000000000000A0A0A323232 3D3D3D2424240101010000000000001B1B1B6666666666666666663636360000000000000B0B0B 666666666666666666666666666666666666666666666666666666666666656565656565656565 656565656565656565656565656565656565656565646464656565646464646464646464646464 646464646464646464636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 6262626262621C242B1C242B1C242C0E101303020206060606060600000051504EEEEEECF8F5F1 F6F3EFF6F3EFF6F3EFFAF7F3CFCECB9494948080816C6D6E57585A46484A3336392022281A1B22 181B2115181F0D0F13232B299C9F9D9E9C9C000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 121212CDCECE9B9C9E7778797878792C2E2E1214171D1F2223242847484A5657596161636D6D6E 797878858585898889B9B6B5F6F3EFF8F5F1F6F3EFF6F3EFFDFAF6E0DEDA363534000000060606 050303090A0A1B22291D252C1C242B636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 646464636363646464646464646464646464646464646464646464656565646464656565656565 6565656565656565656565656565656565656565656666666666660F0F0F0000000000000B0B0B 6363636666666666666666666666666666666666663B3B3B0000000000000000003B3B3B676767 6767676767676767676767676767676868686767676868686868683E3E3E000000000000000000 000000010101010101010101000000000000000000252525686868696969696969404040000000 0000000101016969696969696969690000000000000000004141416A6A6A6A6A6A6A6A6A313131 0000000000001212126969696B6B6B6B6B6B5F5F5F0000000000000000004A4A4A6B6B6B6C6C6C 3333330000000000000C0C0C0606060000000101010101010000000000000202024B4B4B6C6C6C 6C6C6C6C6C6C1010100000000000003A3A3A6C6C6C6C6C6C696969161616000000000000010101 0101010101010000000000000303034949496D6D6D6D6D6D6C6C6C6D6D6D6D6D6D6D6D6D6D6D6D 6C6C6C6D6D6D6D6D6D6D6D6D6D6D6D4C4C4C0A0A0A000000000000000000000000000000000000 0000000000000707075555556D6D6D6D6D6D6C6C6C151515000000000000010101010101010101 0101011212120000000000000101016767676C6C6C6C6C6C0E0E0E0000000000003A3A3A6C6C6C 6C6C6C6C6C6C2020200000000000000000000101010101010000000000000707075151516B6B6B 6C6C6C6C6C6C4F4F4F020202000000000000000000010101000000080808101010000000000000 3636366969696A6A6A4343430000000000000303036A6A6A6A6A6A696969151515000000000000 010101010101010101010101111111000000000000010101636363696969696969212121000000 0000000000000101013E3E3E686868686868363636000000000000000000010101010101010101 0000000000000A0A0A5555556767676767676666663636360000000000000B0B0B666666666666 666666666666666666666666666666666666666666666666666666656565656565656565656565 656565656565656565656565656565646464656565656565656565646464646464646464646464 646464646464636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363636363636363626262626262 1C242B1C242B1C242C0E101303020206060606060600000051504EEEEEECF8F5F1F6F3EFF6F3EF F6F3EFFAF7F3CECCC99393938081826C6B6E56575A474A4C36393C202228191C2116191F13151D 0B0D10272D2C9FA2A39C9C9B000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000121212CECDCE 9D9D9F7B7C7D7B7A7B2E2F301114171D212323252947494B57585A6262646D6C6F787879858585 898888B8B6B5F6F3EFF8F5F1F6F3EFF6F3EFFDFAF6DFDDDA353333000000060606050303090A0A 1B22291D252C1C242B636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363636363646464646464636363646464 646464646464646464646464646464646464656565646464646464656565656565656565656565 6565656666666565656666666666666666665050500202020000000000002C2C2C656565666666 6666666666666666666666666666665B5B5B000000000000000000161616676767676767676767 6767676767676767676868686868686868686868686767675353531F1F1F000000000000000000 0000000000000000000E0E0E444444676767696969696969696969404040000000000000010101 6969696969696A6A6A0000000000000000004141416A6A6A6A6A6A6A6A6A323232000000000000 1212126969696B6B6B6B6B6B5F5F5F0000000000000000004A4A4A6C6C6C6C6C6C333333000000 0000001818184F4F4F1616160000000000000000000D0D0D5252526C6C6C6C6C6C6C6C6C6C6C6C 1010100000000000003A3A3A6C6C6C6C6C6C6C6C6C686868363636040404000000000000000000 0000001414145959596C6C6C6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D 6D6D6D6D6D6D6D6D6D6D6D6D626262202020010101000000000000000000000000000000282828 6363636D6D6D6D6D6D6D6D6D6D6D6D5D5D5D1717170000000000000000000808083737375F5F5F 0000000000000000003636366C6C6C6C6C6C0E0E0E0000000000003A3A3A6C6C6C6C6C6C6C6C6C 6A6A6A3434340101010000000000000000000000001212125B5B5B6C6C6C6C6C6C6C6C6C6C6C6C 6C6C6C4949490D0D0D0000000000000000001C1C1C5A5A5A1B1B1B0000000000003636366A6A6A 6B6B6B4343430000000000000303036A6A6A6A6A6A6A6A6A5A5A5A161616000000000000000000 0707073636365C5C5C000000000000000000353535696969696969525252121212000000000000 0000003E3E3E6969696868686767674B4B4B0A0A0A0000000000000000000000000000001F1F1F 5D5D5D6767676767676767676767673737370000000000000B0B0B666666666666666666666666 666666666666666666666666666666666666666666666666666666666666656565656565656565 656565656565656565656565656565656565656565646464646464646464646464646464646464 646464646464646464636363636363636363636363636363636363636363636363636363636363 6363636363636363636363636363636363636363636363636363636363636363631C242B1C242B 1C242C0E101303020206060606060600000051504FEEEEECF8F5F1F6F3EFF6F3EFF6F3EFFAF7F3 CFCDCA9493948180826B6C6E56585A484A4C36393C222429191C2115191E15181F0B0D13282D2C 9E9FA09B9B9B000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000121212CECECE9B9B9D7A7A7C 7778792F2F301215171E202423262947494B5757596161646C6D6E7878798584858A8889BAB8B6 F6F4EFF8F5F1F6F3EFF6F3EFFDFAF6DFDDDA353334000000060606050303090A0A1B22291D252C 1C242B636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363636363636363636363646464646464646464646464646464646464646464 646464646464656565656565656565656565656565656565656565656565656565656565666666 666666666666666666666666666666666666646464646464656565666666666666666666666666 666666666666676767666666646464656565656565666666676767676767676767686868686868 6868686868686868686868686868686969696969696868685E5E5E5050504343433D3D3D4B4B4B 5959596666666868686969696969696969696969696868686767676868686767676A6A6A6A6A6A 6A6A6A6868686868686868686A6A6A6A6A6A6B6B6B6A6A6A6A6A6A6969696969696A6A6A6B6B6B 6B6B6B6B6B6B6C6C6C6A6A6A6A6A6A6A6A6A6B6B6B6C6C6C6C6C6C333333000000000000181818 6C6C6C6B6B6B5F5F5F4A4A4A5D5D5D6B6B6B6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6B6B6B6A6A6A 6A6A6A6C6C6C6D6D6D6D6D6D6D6D6D6D6D6D6C6C6C6666665555554343434D4D4D6060606C6C6C 6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6E6E6E6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6E6E6E6D6D6D 6D6D6D6D6D6D6D6D6D6C6C6C6868685656564343433F3F3F5151516262626C6C6C6D6D6D6D6D6D 6D6D6D6E6E6E6D6D6D6D6D6D6C6C6C5555554646465858586A6A6A6C6C6C6D6D6D6B6B6B6B6B6B 6B6B6B6C6C6C6D6D6D6D6D6D6C6C6C6B6B6B6B6B6B6C6C6C6D6D6D6C6C6C6C6C6C6C6C6C6B6B6B 6565655353534141414A4A4A5F5F5F6B6B6B6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6B6B6B 6B6B6B5F5F5F5151515F5F5F6B6B6B6B6B6B6B6B6B6969696969696A6A6A6B6B6B6B6B6B6A6A6A 6969696969696969696A6A6A6A6A6A6A6A6A6A6A6A696969535353444444555555676767696969 696969676767676767676767686868696969696969696969686868606060585858585858626262 6969696969696868686868686666665959594747473E3E3E4E4E4E5F5F5F666666686868676767 676767676767676767666666646464646464656565666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666656565656565656565656565 656565656565656565656565646464646464646464646464646464646464646464646464636363 636363646464646464646464636363636363636363636363636363636363636363636363636363 6363636363636363636363636363636363636363636363636363631C242B1C242B1C242C0E1013 030202060606060606000000525150EEEEECF8F5F1F6F3EFF6F3EFF6F3EFFAF7F3CFCDCB959495 8180816C6C6F585A5C474A4C35383B202227171A1F15181E14181F0D0F142326279B9C9D9C9E9C 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000121212CECECD9B9A9C797A7B797A7A2E2E2F 1213171F212424262A484A4B5757596061636C6D6E787778848384898888BAB8B6F6F3EFF8F5F1 F6F3EFF6F3EFFDFAF6DFDDDA353334000000060606050303090A0A1B22291D252C1C242B636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 636363636363636363646464636363636363646464646464646464646464646464646464656565 656565656565656565656565656565656565656565656565656565666666666666656565666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 676767676767676767676767676767676767686868686868686868686868686868686868686868 686868686868696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A 6A6A6A6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6C6C6C6B6B6B6C6C6C6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C3333330000000000001919196C6C6C6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6D6D6D6D6D6D6C6C6C6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D 6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E 6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E 6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E 6E6E6E6E6E6E6D6D6D6E6E6E6E6E6E6E6E6E6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D 6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6C6C6C6D6D6D 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6B6B6B6B6B6B6B6B6B6B6B6B 6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A 6A6A6A696969696969696969696969696969696969696969696969696969696969696969696969 696969696969696969686868686868686868686868686868686868686868676767686868676767 676767676767676767676767666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666656565656565656565656565 656565656565656565656565646464646464656565646464646464646464646464646464646464 636363636363646464636363636363636363636363636363636363636363636363636363636363 6363636363636363636363636363636363636363631C242B1C242B1C242C0E1013030202060606 060606000000525150EEEEECF8F5F1F6F3EFF6F3EFF6F3EFFAF7F3CECDCA9494948181826E6F71 5A5C5D494C4F37393D202328181C2015191D13161C0B0D132528289D9F9D9C9E9C000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000121212CECDCE99989A797A7B7879792C2D2E1113181E2023 23252848484B5757586160636D6D6F777778848384898988BAB8B7F6F3EFF8F5F1F6F3EFF6F3EF FDFAF6DFDDDA343332000000060606050303090A0A1B22291D252C1C242B636363636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 646464646464646464646464646464646464646464646464646464656565656565656565656565 656565656565656565656565656565656565656565666666666666666666666666666666666666 666666666666666666666666666666666666666666666666676767676767676767676767676767 676767676767676767686868676767686868686868686868686868686868686868696969696969 696969696969696969696969696969696969696969696969696969696969696969696969696969 6969696969696A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6B6B6B6B6B6B 6B6B6B6B6B6B6B6B6B6B6B6B6C6C6C6B6B6B6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C3333330000000000001919196C6C6C6C6C6C6D6D6D6D6D6D 6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D 6E6E6E6D6D6D6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E 6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E 6E6E6E6E6E6E6F6F6F6F6F6F6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E 6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6D6D6D6D6D6D 6E6E6E6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D 6D6D6D6D6D6D6D6D6D6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6B6B6B6B6B6B6C6C6C6B6B6B6B6B6B6B6B6B 6B6B6B6B6B6B6B6B6B6B6B6B6A6A6A6B6B6B6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A 6A6A6A696969696969696969696969696969696969696969696969696969696969696969696969 696969696969686868686868686868686868686868686868686868676767686868676767676767 676767676767676767666666676767676767666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666656565666666656565656565 656565656565656565646464646464656565646464646464646464646464646464646464646464 646464646464636363636363636363636363636363636363636363636363636363636363636363 6363636363636363636363636363631C242B1C242B1C242C0E1013030202060606060606000000 525150EEEEECF8F5F1F6F3EFF6F3EFF6F3EFFAF7F3CFCDCB9595958282846E70715A5C5C494B4F 37393D2122291B1D23171A1F12161C0B0D122B2D2EA0A2A09C9C9C000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000121212CDCECD9B9B9B78797A7777792C2D2F1215181E2023222528484849 5656586060626D6D6E78787A848485898988BAB8B6F6F3EFF8F5F1F6F3EFF6F3EFFDFAF6DEDCD9 323231000000060606050303090A0A1B22291D252C1C242B636363636363636363636363636363 636363636363636363636363636363636363636363636363636363646464646464646464646464 646464646464646464646464646464646464646464646464656565656565656565656565656565 656565666666656565666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666676767676767676767676767676767676767686868 676767686868686868686868686868686868686868696969686868696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696A6A6A6A6A6A6A6A6A 6A6A6A6A6A6A6A6A6A6A6A6A6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6C6C6C6B6B6B 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C 6C6C6C6C6C6C6C6C6C3333330000000000001919196D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D 6D6D6D6D6D6D6D6D6D6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E 6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E 6E6E6E6E6E6E6E6E6E6E6E6E6F6F6F6F6F6F6F6F6F6F6F6F6E6E6E6F6F6F6E6E6E6F6F6F6F6F6F 6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6E6E6E6E6E6E6F6F6F 6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E 6E6E6E6E6E6E6E6E6E6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D 6D6D6D6D6D6D6D6D6D6C6C6C6C6C6C6D6D6D6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6B6B6B6C6C6C6C6C6C6B6B6B6B6B6B 6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A 696969696969696969696969696969696969696969696969696969696969696969696969696969 696969696969696969686868686868686868686868686868676767686868676767676767676767 676767676767676767676767676767666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666656565656565656565656565656565656565 656565656565646464656565646464646464646464646464646464646464646464636363636363 636363636363636363636363636363636363636363636363636363636363636363636363636363 6363636363636363631C242B1C242B1C242C0E101303020206060606060600000052514FEEEEEC F8F5F1F6F3EFF6F3EFF6F3EFF9F7F2CFCDCA9695948182826D6E705B5B5C4A4B4E35383B202228 191B2316191F13171C0B0D12292E2EA0A1A19E9E9E000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000121212CECECE9A9A9B7C7C7D79797B2B2C2D1214171F212424262946484A565658606062 6E6D6F787879848384898888BAB9B7F6F3EFF8F5F1F6F3EFF6F3EFFDFAF6DEDCD9333231000000 060606050303090A0A1B22291D252C1C242B636363636363636363636363636363636363636363 636363636363636363636363636363636363636363636363646464646464646464646464646464 646464646464656565656565646464656565656565656565656565656565656565656565656565 656565666666666666666666666666666666666666666666666666666666666666666666666666 666666666666676767676767676767676767676767676767676767676767676767686868686868 686868686868696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A 6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6C6C6C6B6B6B6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C 6D6D6D3434340000000000001919196D6D6D6D6D6D6D6D6D6D6D6D6E6E6E6D6D6D6D6D6D6E6E6E 6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6F6F6F6E6E6E6E6E6E 6E6E6E6E6E6E6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F 6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F 6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F 6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E 6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6D6D6D6E6E6E6E6E6E6D6D6D6D6D6D6D6D6D6D6D6D 6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6B6B6B 6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A696969 696969696969696969696969696969696969696969696969696969696969696969696969696969 696969686868686868696969686868686868686868686868686868676767676767676767676767 676767676767676767676767666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666656565656565656565656565656565656565 656565656565646464646464646464646464646464646464646464646464636363636363636363 646464636363636363636363636363636363636363636363636363636363636363636363636363 6363631C242B1C242B1C242C0E101303020206060606060600000052514FEEEEECF8F5F1F6F3EF F6F3EFF6F3EFFAF7F3CFCCCB9595948181816D6F705A5C5E4B4D5036393C212228191D22161820 13161D0E1014272D2D9D9FA19E9E9E000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000121212 CECECE9E9D9E7E7E817677762B2C2D1315191E202424272A47494B5656586060626E6D6F787779 848384898889BBB9B6F6F3EFF8F5F1F6F3EFF6F3EFFDFAF6DEDCD9333231000000060606050303 090A0A1B22291D252C1C242B636363636363636363636363636363636363636363636363636363 636363636363636363646464636363646464646464646464646464646464646464646464656565 646464656565656565656565656565656565656565656565656565666666666666666666666666 666666666666666666666666666666666666666666666666666666666666666666676767676767 676767676767676767676767676767676767686868686868686868686868686868686868686868 696969696969696969696969696969696969696969696969696969696969696969696969696969 6A6A6A6969696A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6B6B6B6B6B6B6B6B6B 6B6B6B6B6B6B6B6B6B6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6A6A6A 6868686868686A6A6A6D6D6D6D6D6D6D6D6D6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E 6E6E6E6E6E6E6F6F6F6F6F6F6F6F6F6E6E6E6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F 6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F 6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F 6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F 6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6E6E6E 6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6D6D6D6D6D6D6D6D6D 6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6B6B6B 6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6A6A6A6B6B6B6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A 696969696969696969696969696969696969696969696969696969696969696969696969696969 696969696969686868686868686868686868686868686868686868676767676767676767676767 676767676767676767676767666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666656565656565656565656565656565656565656565 656565656565656565646464646464646464646464646464646464646464636363646464646464 6363636363636363636363636363636363636363636363636363636363636363636363631C242B 1C242B1C242C0E1013030202060606060606000000535250EEEEECF7F4F1F6F3EFF6F3EFF6F3EF FAF7F3CECCCA9695948282826E6E6F5A5C5D4A4B4E36383C22262B1D2025191C2214171E0D1015 27302F9DA1A29E9E9E000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000121212CDCDCD9C9B9D 8080827676762A2B2D1315191E212425282A47494B5655586060626E6D6F78787A848485888888 BAB8B6F6F3EFF8F5F1F6F3EFF6F3EFFDFAF6DEDCD9323131000000060606050303090A0A1B2229 1D252C1C242B636363636363636363636363636363636363636363636363636363636363636363 636363646464636363646464646464646464646464646464656565656565656565656565656565 656565656565656565656565656565656565666666666666666666666666666666666666666666 666666666666666666666666666666666666666666676767676767676767676767676767676767 676767676767686868676767686868686868686868686868696969686868696969696969696969 6969696969696969696969696969696969696969696969696969696A6A6A6969696A6A6A6A6A6A 6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C 6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6E6E6E6D6D6D6D6D6D6D6D6D 6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6F6F6F6F6F6F 6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F 6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F 6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F 6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F 6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6E6E6E 6F6F6F6F6F6F6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6D6D6D6E6E6E 6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6C6C6C6C6C6C6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6B6B6B6C6C6C 6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A 6A6A6A696969696969696969696969696969696969696969696969696969696969696969696969 696969696969696969686868686868686868686868686868676767686868676767676767676767 676767676767676767676767666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666656565656565656565656565656565656565 656565646464646464646464646464646464646464646464646464646464636363636363636363 6363636363636363636363636363636363636363636363636363636363631C242B1C242B1C242C 0E1013030202060606060606000000535250EEEEEDF7F4F1F6F3EFF6F3EFF6F3EFFAF7F3CECCC9 9493938182826E6E705A5B5D4A4C4E36383C212328191C1F15191D11151C0D0D13272D2D9DA0A0 9E9E9E000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000121212CFCECE9C9C9E797A7B797979 2B2C2D13151A1F212424272A47484B5655586060626D6D6F79787A848485898888BBB9B7F6F4F0 F8F5F1F6F3EFF6F3EFFDFAF6DDDBD8313030000000060606050303090A0A1B22291D252C1C242B 636363636363636363636363636363636363636363636363636363636363636363636363646464 646464646464646464646464646464656565646464646464656565656565656565656565656565 656565656565666666666666666666666666666666666666666666666666666666666666666666 666666666666676767676767676767666666676767676767676767676767676767676767676767 686868686868686868686868696969686868696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A 6A6A6A6A6A6A6B6B6B6B6B6B6B6B6B6B6B6B6C6C6C6B6B6B6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6D6D6D6D6D6D6D6D6D 6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E 6E6E6E6F6F6F6E6E6E6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F 6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F 6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F 7070706F6F6F6F6F6F6F6F6F6F6F6F7070706F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F 6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F 6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F 6F6F6F6F6F6F6E6E6E6F6F6F6F6F6F6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E 6E6E6E6E6E6E6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6C6C6C6C6C6C6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6B6B6B 6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6A6A6A6B6B6B6B6B6B6A6A6A6A6A6A6A6A6A6A6A6A696969 6969696A6A6A696969696969696969696969696969696969696969696969696969696969696969 696969686868686868686868686868686868686868686868686868676767676767676767676767 676767666666676767676767666666666666666666666666666666666666666666666666666666 666666666666666666666666666666656565656565656565656565656565656565656565646464 646464646464646464646464646464646464646464646464646464646464636363636363636363 6363636363636363636363636363636363636363636363631C242B1C242B1C242C0E1013030202 060606060606000000535250EEEEEDF7F4F1F6F3EFF6F3EFF6F3EFFAF7F3CECDCA949493818283 6E6F6F5A5B5D4A4B4E383A3E212328181C2116191F13161C0B0D12272C2CA2A4A59E9E9E000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000121212CECDCE99989B79797B797A7A2B2C2E121419 1F212524262948484B5756596261626D6D6E79797A858485898888BAB9B7F6F4F0F8F5F1F6F3EF F6F3EFFDFAF6DDDBD8313030000000060606050303090A0A1B22291D252C1C242B636363636363 636363636363636363636363636363646464636363646464646464646464646464646464646464 646464646464646464656565656565656565656565656565656565656565656565656565656565 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666676767676767676767676767676767676767686868686868686868686868686868686868 686868696969696969696969696969696969696969696969696969696969696969696969696969 6969696969696A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B 6B6B6B6B6B6B6B6B6B6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6E6E6E 6D6D6D6D6D6D6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6F6F6F6F6F6F6F6F6F 6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F 6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F707070707070 707070707070707070707070707070707070707070707070707070707070707070707070707070 707070707070707070707070707070707070707070707070707070707070707070707070707070 7070707070707070707070707070706F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F 6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F 6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E 6E6E6E6D6D6D6D6D6D6D6D6D6E6E6E6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6C6C6C6C6C6C6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6B6B6B 6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A 6A6A6A696969696969696969696969696969696969696969696969696969696969696969696969 696969686868686868686868686868686868686868686868676767686868676767676767676767 676767676767676767666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666656565666666656565656565656565656565656565656565 646464646464646464646464646464646464646464646464646464636363636363636363636363 6363636363636363636363636363636363631C242B1C242B1C242C0E1013030202060606060606 000000535250EEEEEDF7F4F1F6F3EFF6F3EFF6F3EFFAF7F3CECCCA9495948080816C6D6D5A5C5D 4A4C4E37393C22252A1B1E23171A2013161D0D0F14262C2DA1A5A59F9F9F000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000121212CECECE95959879787A787979292B2D1114181E212525272A 48484B5756586261636D6D6F787779838384888788BAB8B7F6F3F0F8F5F1F6F3EFF6F3EFFDFAF6 DDDBD8313030000000060606050303090A0A1B22291D252C1C242B636363636363636363636363 636363636363646464636363636363646464646464646464646464646464646464646464656565 646464656565656565656565656565656565656565666666666666656565666666666666666666 666666666666666666666666666666666666666666666666666666676767666666676767676767 676767676767676767686868676767686868686868686868686868686868686868696969696969 6969696969696969696969696969696969696969696969696969696969696A6A6A6969696A6A6A 6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C 6D6D6D6C6C6C6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E 6E6E6E6E6E6E6E6E6E6F6F6F6F6F6F6E6E6E6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F 6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F707070 6F6F6F6F6F6F707070707070707070707070707070707070707070707070707070707070707070 707070707070707070707070707070707070707070707070717171707070707070707070707070 707070707070707070707070707070707070707070707070707070707070707070707070707070 7070707070707070707070707070707070707070707070707070707070706F6F6F6F6F6F707070 6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F 6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6E6E6E6F6F6F6E6E6E6E6E6E6E6E6E 6E6E6E6E6E6E6D6D6D6E6E6E6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C 6C6C6C6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A 6A6A6A696969696969696969696969696969696969696969696969696969696969696969696969 686868696969686868686868686868686868676767686868686868676767676767676767676767 676767666666676767666666666666666666666666666666666666666666666666666666666666 666666666666666666656565656565656565656565656565656565656565656565646464656565 646464646464646464646464646464646464646464636363646464636363636363636363636363 6363636363636363636363631C242B1C242B1C242C0E1013030202060606060606000000535250 EEEEEDF7F4F1F6F3EFF6F3EFF7F4F0F9F6F2CDCCC99595958181826D6E6F5B5C5D4A4B4E343739 22242A1B1F23171A1F12151B0B0D10282E2FA2A5A59E9E9F000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000121212CFCFCF9C9C9D7B7A7C78787A2A2B2D1113161E202325272B48494C575759 6060626D6C6E787879848384878787BAB9B7F6F4F0F8F5F1F6F3EFF6F3EFFDFAF6DDDBD8313030 000000060606050303090A0A1B22291D252C1C242B636363636363636363636363636363636363 636363636363636363646464646464646464646464646464646464646464646464656565656565 656565656565656565656565656565666666666666666666666666666666666666666666666666 666666666666666666666666666666666666676767676767676767676767676767676767676767 676767686868686868686868686868686868686868696969696969696969696969696969696969 6969696969696969696969696969696969696969696A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A 6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6D6D6D6D6D6D6D6D6D 6D6D6D6D6D6D6D6D6D6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6F6F6F6F6F6F 6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F 6F6F6F6F6F6F6F6F6F7070707070706F6F6F707070707070707070707070707070707070707070 707070707070707070707070707070707070707070717171707070717171717171717171717171 717171717171707070717171717171717171717171717171717171717171717171717171717171 717171717171717171717171717171707070717171717171717171717171707070707070717171 707070707070707070707070707070707070707070707070707070707070707070707070707070 7070706F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F 6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6E6E6E6E6E6E6E6E6E 6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C 6C6C6C6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6A6A6A6A6A6A6A6A6A6A6A6A696969 696969696969696969696969696969696969696969696969696969696969696969696969686868 686868686868686868686868686868686868686868676767676767676767676767676767676767 676767666666676767666666666666666666666666666666666666666666666666666666666666 666666656565666666656565656565656565656565656565656565656565656565656565646464 646464646464646464646464646464646464646464646464636363636363636363636363636363 6363636363631C242B1C242B1C242C0E1013030202060606060606000000535250EEEEEDF7F4F1 F6F3EFF6F3EFF6F3EFFAF7F3CECCC99494938183836E6F71595B5D4A4C4F37393C2225291E2125 191C2113151E0B0F13262E2BA0A4A39E9E9E000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 121212D0D0D09C9B9B79797A777779292B2D1215161D1F2224272A49494C5656586161626C6C6E 78787A838384878787B9B8B7F6F3F0F8F5F1F6F3EFF6F3EFFDFAF6DDDBD7302F2E000000060606 050303090A0A1B22291D252C1C242B636363636363636363636363636363636363636363646464 646464646464646464646464646464646464646464656565656565656565656565656565656565 656565666666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666676767676767676767676767676767676767676767686868686868 686868686868686868696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6B6B6B6B6B6B6A6A6A6B6B6B 6B6B6B6B6B6B6B6B6B6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6E6E6E6E6E6E 6E6E6E6E6E6E6E6E6E6E6E6E6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F 6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F707070707070707070 707070707070707070707070707070707070707070707070707070707070717171717171717171 717171717171717171717171717171717171717171717171717171717171717171717171717171 717171717171717171717171717171717171717171717171717171717171717171717171717171 717171717171717171717171717171717171717171717171717171717171717171717171717171 717171717171707070707070717171707070717171707070707070707070707070707070707070 7070707070707070707070707070707070707070707070706F6F6F6F6F6F6F6F6F6F6F6F6F6F6F 6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6E6E6E6E6E6E6E6E6E 6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C 6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6A6A6A6A6A6A6A6A6A6A6A6A696969 696969696969696969696969696969696969696969696969696969696969696969696969696969 686868686868686868686868686868686868686868686868676767676767676767676767676767 676767666666666666666666666666666666666666666666666666666666666666666666666666 666666666666656565656565656565656565656565656565646464656565656565646464646464 646464646464646464646464636363646464636363646464636363636363636363636363636363 1C242B1C242B1C242C0E1013030202060606060606000000535250EEEEEDF7F4F1F6F3EFF6F3EF F6F3EFFAF7F3CDCBCA9393948383836E7071585A5C4A4C4D36383D2224291D2024171C2115171F 0D0D13252D2BA1A6A4A09F9F000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000191919D3D2D2 9B9B9E7C7C80787878292A2C1215171D1F2224262949494C5657586262646D6D6F777878838384 868687BBB8B7F6F3F0F8F5F1F6F3EFF6F3EFFDFAF6DDDAD72F2E2D000000060606050303090A0A 1B22291D252C1C242B636363636363636363636363636363646464646464646464646464646464 646464646464646464656565656565656565656565656565656565666666656565656565666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 676767676767676767676767676767686868686868686868686868686868686868696969686868 696969696969696969696969696969696969696969696969696969696969696969696969696969 6969696A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C 6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6E6E6E6D6D6D6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E 6E6E6E6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F 6F6F6F6F6F6F7070706F6F6F707070707070707070707070707070707070707070707070707070 707070717171707070717171707070717171717171717171717171717171717171717171717171 717171717171717171727272727272717171717171717171727272727272727272717171727272 727272727272717171727272727272727272727272727272727272727272727272727272727272 727272717171717171717171717171717171727272727272717171717171717171717171717171 717171717171717171717171717171717171717171717171717171717171707070717171717171 7070707070707070707070707070707070707070706F6F6F7070707070706F6F6F6F6F6F6F6F6F 6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6E6E6E6E6E6E 6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C 6B6B6B6C6C6C6B6B6B6B6B6B6B6B6B6B6B6B6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A696969 6A6A6A696969696969696969696969696969696969696969696969696969696969686868696969 686868686868686868686868686868686868686868676767676767676767676767676767676767 676767666666666666666666666666666666666666666666666666666666666666666666666666 666666666666656565656565656565656565656565656565656565656565646464646464646464 6464646464646464646464646363636363636363636363636363636363636363631C242B1C242B 1C242C0E1013030202060606060606000000535250EEEEEDF7F4F0F6F3EFF6F3EFF6F3EFFAF7F3 CDCBC99493938283836E6F71595B5C494B4D34373A22252A1B1F24181B2011151C0D0D142B2F30 9FA2A1A09E9E000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000373737D7D6D79B999D7E7F83 7677772B2C2D1115161C202124272948484C57575A6262646C6C6E787778838484868687BBB8B8 F7F4F0F8F5F1F6F3EFF6F3EFFDFAF6DDDAD72F2E2D000000060606050303090A0A1B22291D252C 1C242B636363636363646464646464646464646464646464646464646464646464646464646464 656565656565656565656565656565656565656565656565656565666666666666666666666666 666666666666666666666666666666666666666666666666676767666666666666676767676767 676767676767676767676767686868686868686868686868686868686868686868696969696969 6969696969696969696969696969696969696969696969696969696A6A6A6A6A6A6A6A6A6A6A6A 6A6A6A6A6A6A6A6A6A6A6A6A6B6B6B6B6B6B6B6B6B6B6B6B6C6C6C6B6B6B6C6C6C6C6C6C6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D 6D6D6D6E6E6E6D6D6D6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6F6F6F6F6F6F6F6F6F6F6F6F 6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F 6F6F6F707070707070707070707070707070717171707070707070717171717171717171717171 717171717171717171717171717171727272717171717171717171717171727272727272727272 727272727272727272727272727272727272727272727272727272727272727272727272727272 727272727272727272727272727272727272727272727272727272727272727272727272727272 727272727272727272727272727272727272727272727272727272727272727272717171727272 727272717171717171717171717171717171717171717171717171717171717171717171717171 7171717171717070707070707070707070707070707070707070707070706F6F6F6F6F6F6F6F6F 6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F 6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D 6D6D6D6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C 6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A 6A6A6A696969696969696969696969696969696969696969696969696969696969696969696969 686868686868686868686868686868686868676767676767676767676767676767666666666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 666666666666656565656565656565656565656565656565646464646464646464646464646464 6464646464646464646464646464646363636363636363636363631C242B1C242B1C242C0E1013 030202060606060606000000545251EFEEEDF7F4F0F6F3EFF6F3EFF6F4EFFAF7F3CDCAC8929392 8181816D6E6F595C5D4B4D4F34383B2225281B1E22161A1E13161D0E1015282E2E9FA1A0A0A09F 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 0000000000000000000000000000000000000000004E4E4FDADADB9A9A9D7B7B7E7878792A2B2C 1114171D202224262847494C57565A6262646C6C6E777778838384878686BBBAB8F7F4F0F8F5F1 F6F3EFF6F3EFFDFAF6DDDAD72F2E2D000000060606050303090A0A1B22291D252C1C242B636363 636363646464646464646464646464646464646464646464646464646464656565656565656565 656565656565656565656565656565666666666666666666666666666666666666666666666666 666666666666666666666666666666676767676767666666676767676767676767676767676767 686868686868686868686868686868686868696969696969696969696969696969696969696969 6969696969696969696969696969696969696A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A 6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6E6E6E6E6E6E6E6E6E 6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F 6F6F6F6F6F6F6F6F6F6F6F6F7070706F6F6F707070707070707070707070707070707070707070 707070717171717171717171717171717171717171717171717171717171717171727272727272 727272727272727272727272727272727272727272727272727272727272727272727272727272 727272727272727272727272727272727272727272727272727272727272727272727272727272 727272727272727272727272727272727272727272727272727272727272727272727272727272 727272727272727272727272727272727272727272727272727272727272727272727272727272 727272727272727272717171727272727272727272717171717171717171717171717171717171 7171717070707171717070707070707070707070707070707070707070707070707070706F6F6F 6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F 6F6F6F6E6E6E6F6F6F6E6E6E6E6E6E6E6E6E6E6E6E6D6D6D6E6E6E6D6D6D6D6D6D6D6D6D6D6D6D 6D6D6D6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6B6B6B 6C6C6C6B6B6B6B6B6B6B6B6B6B6B6B6A6A6A6B6B6B6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A696969 696969696969696969696969696969696969696969696969696969696969696969696969686868 686868686868686868686868676767686868676767676767676767676767676767676767666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 656565656565656565656565656565656565656565646464646464656565646464646464646464 6464646464646363636363636363636363636363631C242B1C242B1C242C0E1013030202060606 060606000000545251EFEEEDF7F4F0F6F3EFF6F3EFF6F3EFFAF7F3CDCBC89392928080826D6E6F 5B5C5E4C4E50373A3E24272C1D2125181B2014171D0D0F13292E2CA1A5A29FA09F000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000757575DCDDDD9796997C7B7D7A7A7B2B2B2D1113171E2123 24262948494C57575B6262646C6C6D777777838383878687BBBAB8F7F4F0F8F5F1F6F3EFF6F3EF FDFAF6DCD9D62E2E2D000000060606050303090A0A1B22291D252C1C242B646464636363646464 646464646464646464646464646464646464646464656565646464656565656565656565656565 656565666666666666666666666666666666666666666666666666666666666666666666666666 666666676767666666676767676767676767676767676767676767676767686868686868686868 686868686868696969696969696969696969696969696969696969696969696969696969696969 6969696A6A6A6969696A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B 6B6B6B6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C 6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E 6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F 7070706F6F6F707070707070707070707070707070717171717171717171717171717171717171 717171717171717171717171717171717171717171727272727272727272727272727272727272 727272727272727272727272727272727272727272727272727272727272727272727272727272 727272727272727272727272727272727272727272727272727272727272727272727272727272 727272727272727272727272727272727272727272727272727272727272727272727272727272 727272727272727272727272727272727272727272727272727272727272727272727272727272 727272727272727272727272727272727272727272717171717171717171717171717171717171 717171717171717171717171707070707070707070707070707070707070707070707070707070 6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F 6F6F6F6F6F6F6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6D6D6D6D6D6D6D6D6D6D6D6D6C6C6C 6D6D6D6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C 6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A696969696969 696969696969696969696969696969696969696969696969696969696969696969696969696969 686868686868686868686868686868676767676767676767676767676767666666666666676767 666666666666666666666666666666666666666666666666666666666666666666656565666666 656565656565656565656565656565656565656565646464646464646464646464646464646464 6464646464646363636363636363631C242B1C242B1C242C0E1013030202060606060606000000 545251EFEEEDF7F4F0F6F3EFF6F3EFF6F3EFFAF7F4CDCCCA9292928080816C6E6E5A5C5D4A4C4F 373A3D23272D1D2026191C2111151C0B0D122E3130A1A4A29F9F9F000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000818181D3D3D39A999B7A7A7C7A7A7B292A2C1114181D202424262B49494D 58585B6363646E6D6E787778838384878687BBBAB8F7F4F0F8F5F1F6F3EFF6F3EFFDFAF6DBD9D5 2D2C2C000000060606050303090A0A1B22291D252C1C242B646464646464646464646464646464 646464646464646464646464656565656565656565656565656565656565666666666666656565 666666666666666666666666666666666666666666666666666666666666666666666666666666 676767676767676767676767676767686868686868686868686868686868686868686868696969 6969696969696969696969696969696969696969696969696969696969696A6A6A6969696A6A6A 6A6A6A6A6A6A6A6A6A6B6B6B6A6A6A6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6C6C6C6C6C6C6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6D6D6D6D6D6D6D6D6D6D6D6D 6D6D6D6D6D6D6D6D6D6E6E6E6E6E6E6E6E6E6E6E6E6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F 6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F707070707070707070707070707070 707070707070717171717171717171717171717171717171717171717171717171727272727272 727272727272727272727272727272727272727272727272727272727272727272727272727272 727272727272727272727272727272727272727272727272727272727272727272727272737373 727272737373737373737373737373737373737373737373737373737373737373737373737373 727272737373727272727272737373737373737373737373727272727272737373727272727272 727272727272727272727272727272727272727272727272727272727272727272727272727272 727272727272727272727272727272727272727272727272727272727272717171717171727272 717171717171717171717171717171717171707070707070707070707070707070707070707070 6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F 6F6F6F6F6F6F6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D 6D6D6D6D6D6D6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6B6B6B 6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A696969696969 696969696969696969696969696969696969696969696969696969696969686868686868686868 686868686868686868686868676767676767676767676767676767676767666666666666666666 666666666666666666666666666666666666666666666666666666666666666666656565656565 656565656565656565656565656565646464646464656565646464646464646464646464646464 6464646363636363631C242B1C242B1C242C0E1013030202060606060606000000545251EFEEED F7F4F0F6F3EFF6F3EFF6F3EFFAF7F3CDCCC99192927F80806C6C6D585A5C4A4C4F373A3D23262B 1B1E24171A2013161D0E10152C2F30A2A5A4A0A09F000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 0303037A7A7AC9C9C8A1A0A278797B7A7A7B292A2C1214181E20232426294A4A4D58585B636265 6E6E70787778848384888688BBB9B8F7F4F0F8F5F1F6F3EFF6F3EFFDFAF6DBD9D52D2C2C000000 060606050303090A0A1B22291D252C1C242B636363646464646464646464646464646464646464 646464646464656565656565656565656565656565656565656565666666666666666666666666 666666666666666666666666666666666666666666666666666666666666676767676767676767 676767676767676767686868686868686868686868686868686868696969696969696969696969 6969696969696969696969696969696969696969696969696A6A6A6A6A6A6A6A6A6A6A6A6A6A6A 6A6A6A6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6E6E6E6E6E6E6E6E6E 6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F 6F6F6F6F6F6F6F6F6F6F6F6F707070707070707070707070707070707070707070717171717171 717171717171717171717171717171727272717171727272727272727272727272727272727272 727272727272727272727272727272727272727272727272727272727272727272727272727272 727272727272727272737373737373737373737373737373737373737373737373737373737373 737373737373737373737373737373737373737373737373737373737373737373737373737373 737373737373737373737373737373737373737373737373737373737373737373737373737373 737373737373737373737373727272727272737373727272727272727272727272727272727272 727272727272727272727272727272727272727272727272727272727272727272727272717171 717171727272717171717171717171717171707070717171707070707070707070707070707070 7070707070707070707070706F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F 6F6F6F6F6F6F6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D 6D6D6D6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C 6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A696969696969 696969696969696969696969696969696969696969696969696969696969686868686868686868 686868686868676767686868676767676767676767676767676767666666666666666666666666 666666666666666666666666666666666666666666666666666666666666666666656565656565 656565656565656565656565656565646464646464646464646464646464646464646464646464 6464641C242B1C242B1C242C0E1013030202060606060606000000545251EFEEEDF7F4F0F6F3EF F6F3EFF6F3EFFAF7F3CDCCC99091907E80806C6C6D585B5D4A4D50373A3E23242C1B1D23171A20 13171D0D0F132C2F2FA2A4A3A2A0A0000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000131313747474 C6C5C79E9EA178797C77787A29292B1214191E20232325284A4A4E58585B6262656E6E7079797A 848384888788BCBAB9F7F4F0F8F5F1F6F3EFF6F3EFFDFAF6DBD9D52D2C2C000000060606050303 090A0A1B22291D252C1C242B646464646464646464646464646464656565646464656565656565 656565656565656565656565656565656565666666666666666666666666666666666666666666 666666666666666666666666666666666666666666676767676767676767676767686868686868 686868686868686868686868686868696969696969696969696969696969696969696969696969 6969696969696969696969696969696A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6B6B6B6B6B6B 6B6B6B6B6B6B6B6B6B6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C 6C6C6C6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6F6F6F6E6E6E 6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F707070 707070707070707070707070707070717171717171717171717171717171717171717171727272 717171727272727272727272727272727272727272727272727272727272727272727272727272 727272727272727272727272727272727272737373727272737373737373737373737373737373 737373737373737373737373737373737373737373737373737373737373747474737373747474 737373747474737373737373747474747474747474747474747474747474747474747474747474 747474747474747474747474747474747474737373737373737373737373737373737373737373 737373737373737373737373737373737373737373727272737373727272727272727272727272 727272727272727272727272727272727272727272727272727272727272727272727272727272 727272727272727272717171717171717171717171717171707070717171707070707070707070 7070707070706F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F 6F6F6F6F6F6F6F6F6F6F6F6F6E6E6E6E6E6E6E6E6E6E6E6E6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D 6D6D6D6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6B6B6B 6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A696969696969696969 696969696969696969696969696969696969696969696969696969686868686868686868686868 686868686868686868686868676767676767676767676767676767676767666666666666666666 666666666666666666666666666666666666666666666666666666656565656565656565656565 6565656565656565656464646565656464646464646464646464646464646363636363631C242B 1C242B1C242C0E1013030202060606060606000000545351EFEFEDF7F4F0F6F3EFF6F3EFF6F3EF FAF7F3CDCCC99292918080816C6C6D585B5C494C4F34373B2225291B1D22171A2015191F0E1014 2D312FA0A2A09F9F9F000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000282828656565C7C7C8A3A3A4 7B7B7D777778292A2C1215181E202524272A4B4B4E59595C6464666F6F7179797A868485888789 BCBAB9F7F4F1F7F5F0F6F3EFF6F3EFFDFAF6DBD9D52D2C2C000000060606050303090A0A1B2229 1D252C1C242B646464646464646464646464656565656565656565656565656565656565656565 656565656565666666666666666666666666666666666666666666666666666666666666666666 666666666666666666676767676767676767676767676767676767686868676767686868686868 686868686868696969696969696969696969696969696969696969696969696969696969696969 6969696969696A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6B6B6B6B6B6B6B6B6B6B6B6B6C6C6C6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6D6D6D6D6D6D 6D6D6D6D6D6D6D6D6D6E6E6E6E6E6E6E6E6E6E6E6E6F6F6F6E6E6E6F6F6F6F6F6F6F6F6F6F6F6F 6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F707070707070707070707070707070717171 707070717171717171717171717171717171717171717171727272727272727272727272727272 727272727272727272727272727272727272727272727272727272737373737373737373727272 737373737373737373737373737373737373737373737373737373737373737373737373747474 747474747474747474747474747474747474747474747474747474747474747474747474747474 747474747474747474747474747474747474747474747474747474747474747474747474747474 747474747474747474747474747474747474747474747474747474747474747474747474747474 737373737373737373737373737373737373737373737373737373737373737373737373737373 727272727272727272727272727272727272727272727272727272727272727272727272727272 727272727272727272727272717171717171717171717171717171717171707070707070707070 7070707070707070707070706F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F 6F6F6F6F6F6F6F6F6F6F6F6F6E6E6E6E6E6E6E6E6E6E6E6E6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D 6D6D6D6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6B6B6B6C6C6C 6B6B6B6B6B6B6B6B6B6B6B6B6A6A6A6B6B6B6A6A6A6A6A6A6A6A6A6A6A6A696969696969696969 696969696969696969696969696969696969696969696969686868696969686868686868686868 686868676767676767676767676767676767676767676767676767666666666666666666666666 666666666666666666666666666666666666666666666666666666666666656565656565656565 6565656565656464646464646464646464646464646464646464646464641C242B1C242B1C242C 0E1013030202060606060606000000545250EFEEEDF7F4F0F6F3EFF6F3EFF6F3EFFAF7F3CCCBC8 9292908081806C6E6E585A5C4A4C4E36383C23242B1D1F25171A2014171E0D10152F3333A4A5A5 9F9F9F000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 0000000000000000000000000000000000000000003737375A5A59C9CACAA2A2A37D7C7D787877 2B2C2D1316191F202425262A4B4C4E59595C6463666F6F707A797A858484888888BDBBB9F7F4F0 F8F5F1F6F3EFF6F3EFFDFAF6DBD8D52B2B2B000000060606050303090A0A1B22291D252C1C242B 646464646464646464646464646464656565656565656565656565656565656565656565666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 676767676767676767676767686868676767686868686868686868686868686868696969696969 6969696969696969696969696969696969696969696969696969696969696A6A6A6A6A6A6A6A6A 6A6A6A6A6A6A6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6D6D6D6C6C6C6D6D6D6D6D6D6D6D6D6D6D6D6E6E6E6E6E6E 6E6E6E6E6E6E6E6E6E6F6F6F6E6E6E6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F 6F6F6F7070706F6F6F6F6F6F707070707070707070717171717171707070717171717171717171 717171727272727272727272727272727272727272727272727272727272727272727272727272 727272727272727272737373737373737373737373737373737373737373737373737373737373 747474747474747474747474747474747474747474747474747474747474747474747474747474 747474747474747474747474757575757575747474757575757575757575757575757575757575 757575757575757575757575757575757575757575757575757575757575757575757575747474 747474757575757575747474747474747474747474747474747474747474747474747474747474 747474747474747474747474737373737373737373737373737373737373737373737373737373 737373737373727272737373727272727272727272727272727272727272727272727272727272 727272727272727272727272717171717171717171717171717171717171717171707070707070 7070707070707070707070706F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F 6F6F6F6F6F6F6F6F6F6E6E6E6F6F6F6E6E6E6E6E6E6E6E6E6E6E6E6D6D6D6D6D6D6D6D6D6D6D6D 6D6D6D6D6D6D6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6B6B6B 6B6B6B6B6B6B6B6B6B6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6969696A6A6A696969696969696969 696969696969696969696969696969696969696969696969686868686868686868686868686868 686868676767676767676767676767676767676767676767666666666666666666666666666666 666666666666666666666666666666666666666666666666666666656565656565656565656565 6565656565656565656464646464646464646464646464641C242B1C242B1C242C0E1013030202 060606060606000000545350EFEFEDF7F4F0F6F3EFF6F3EFF6F3EFFAF7F3CDCBC99091917F8081 6D6E6F595A5B494B4E35373B22262B1B1E24181B2114171E0D0F13292D2FA2A5A8A0A0A0000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000494947504E4ECAC9CA9E9FA2767679797A7A2C2E2E131519 1E212425272B4B4C4F595A5C6363676F6F717A797B858585888888BDBBB9F7F4F1F7F5F0F6F3EF F6F3EFFDFAF6DAD8D42A2A2A000000060606050303090A0A1B22291D252C1C242B646464646464 656565656565646464656565656565656565656565656565666666656565666666666666666666 666666666666666666666666666666666666666666666666676767676767676767676767676767 676767676767676767686868686868686868686868696969686868696969696969696969696969 6969696969696969696969696969696969696969696A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6B6B6B 6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C 6C6C6C6D6D6D6C6C6C6D6D6D6D6D6D6D6D6D6D6D6D6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6F6F6F 6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F707070 707070707070707070707070717171717171717171717171717171717171727272727272727272 727272727272727272727272727272727272727272727272727272737373737373737373727272 737373737373737373737373737373747474747474747474737373747474747474747474747474 747474747474747474747474757575747474757575757575757575757575757575757575757575 757575757575757575757575757575757575757575757575757575757575757575757575757575 757575757575757575757575757575757575757575757575757575757575757575757575757575 757575757575757575757575757575757575757575757575747474747474757575757575747474 747474747474747474747474747474747474747474737373747474737373747474737373737373 737373737373737373727272727272737373727272727272727272727272727272727272727272 727272727272727272727272727272727272717171717171717171717171717171717171707070 7070707070707070707070706F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F 6F6F6F6E6E6E6F6F6F6F6F6F6E6E6E6E6E6E6E6E6E6E6E6E6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6B6B6B 6B6B6B6B6B6B6B6B6B6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6969696A6A6A696969696969696969 696969696969696969696969696969696969696969696969686868686868686868686868686868 676767676767676767676767676767666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666656565656565656565656565656565 6464646464646565656464646464646464641C242B1C242B1C242C0E1013030202060606060606 000000545350EFEFEDF7F4F0F6F3EFF6F3EFF6F3EFFAF7F3CDCBC89292918080806C6D6E585A5D 484A4D34363A25272B1D1F26181B2013171C0C0D122B2E2FA3A6A7A0A0A0000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 0000000000000000005C5C5C423F40C3C2C3A2A2A478797C78797A2A2A2D1213181F2225282A2D 4B4C4F595A5D6464677070727B7A7C868586898989BDBCBAF7F4F1F7F5F0F6F3EFF6F3EFFDFAF6 DAD8D42A2A2A000000060606050303090A0A1B22291D252C1C242B646464646464646464656565 656565656565656565656565656565656565666666666666666666666666666666666666666666 666666666666666666666666666666666666676767676767676767676767676767676767686868 686868686868686868686868686868696969696969696969696969696969696969696969696969 6969696969696969696A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6B6B6B6B6B6B6B6B6B6B6B6B 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6D6D6D 6D6D6D6D6D6D6D6D6D6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6F6F6F6F6F6F6F6F6F6F6F6F 6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F707070707070707070707070707070717171707070 707070717171717171717171717171727272727272727272727272727272727272727272727272 727272727272727272727272727272727272727272737373737373737373737373737373747474 747474747474747474747474747474747474747474747474757575757575757575747474757575 757575757575757575757575757575757575757575757575757575757575757575757575757575 757575757575757575757575757575757575757575757575757575757575757575757575757575 757575757575757575757575757575757575757575757575757575757575757575757575757575 757575757575757575757575757575757575757575757575757575757575757575757575757575 747474757575747474747474747474747474747474747474747474747474747474747474737373 737373737373737373737373737373737373737373737373727272727272727272727272727272 727272727272727272727272727272727272717171717171717171717171717171717171717171 7070707070707070707070707070706F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F 6F6F6F6F6F6F6F6F6F6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6D6D6D6D6D6D6D6D6D6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6B6B6B6B6B6B 6B6B6B6B6B6B6B6B6B6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A696969696969696969696969 696969696969696969696969696969696969696969696969686868686868686868686868676767 686868676767676767676767676767676767666666666666666666666666666666666666666666 666666666666666666666666666666656565656565656565656565656565656565656565656565 6565656565656464646464641C242B1C242B1C242C0E1013030202060606060606000000545250 EFEEEDF7F4F0F6F3EFF6F3EFF6F3EFFAF7F3CDCAC89290917F7F7F6C6C6D595B5C494C4E35383C 24272C1D1F24181B2012161C0D0F132D3031A1A3A2A29F9F000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 0000006060603E3D3EBEBEBEA2A1A37B7C7C797A7B27282A1213181E202425282C4D4E505A5A5D 6363677070727A797C868586898A8ABFBCBAF8F5F1F7F4F0F6F3EFF6F3EFFDFAF6DAD8D42A2A2A 000000060606050303090A0A1B22291D252C1C242B646464646464656565656565656565656565 656565656565656565666666666666666666666666666666666666666666666666666666666666 666666666666666666676767676767676767676767676767676767686868686868686868686868 6868686969696969696969696969696969696969696969696969696969696969696969696A6A6A 6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6C6C6C6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D 6D6D6D6E6E6E6E6E6E6E6E6E6E6E6E6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F 6F6F6F6F6F6F707070707070707070707070707070707070717171717171717171717171717171 727272717171727272727272727272727272727272727272727272727272727272727272727272 737373727272737373737373737373737373737373747474747474737373747474747474747474 747474747474747474757575757575757575757575757575757575757575757575757575757575 757575757575757575757575757575757575757575757575757575757575757575757575757575 757575757575757575757575757575757575757575767676757575757575757575757575757575 757575757575757575757575757575757575757575757575757575757575757575757575757575 757575757575757575757575757575757575757575757575757575757575757575757575757575 757575757575757575757575757575747474747474747474747474747474747474747474737373 747474737373737373737373737373737373727272737373727272727272727272727272727272 727272727272727272727272727272727272727272727272717171717171717171717171717171 7070707070707070707070707070707070706F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F 6F6F6F6F6F6F6F6F6F6E6E6E6E6E6E6E6E6E6E6E6E6D6D6D6E6E6E6D6D6D6D6D6D6D6D6D6D6D6D 6D6D6D6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6B6B6B6B6B6B 6B6B6B6B6B6B6B6B6B6A6A6A6A6A6A6A6A6A6A6A6A6969696969696A6A6A696969696969696969 696969696969696969696969696969686868686868686868686868686868686868686868676767 676767676767676767676767676767666666666666666666666666666666666666666666666666 666666666666666666666666666666656565666666656565656565656565656565656565656565 6464646464641C242B1C242B1C242C0E1013030202060606060606000000545250EFEEEDF7F4F0 F6F3EFF6F3EFF6F3EFFAF7F3CCCBC9919091807F806E6E6F5A5C5D4B4D5037393D23272C1B1E24 171A1F13151D0D10142C3131A2A7A5A2A0A0000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000005A5A5B 3A3A3BC0C0C09E9F9F797B7A78797A28292B1214171D1F2425272B4E4E505A5B5D656568707072 7A7A7B8685868A8A8ABFBEBCF8F5F1F7F4F0F6F3EFF6F3EFFDFBF7DAD7D32A2929000000060606 050303090A0A1B22291D252C1C242B646464646464656565656565656565656565656565656565 666666666666666666666666666666666666666666666666666666666666666666676767666666 676767676767676767676767676767686868686868686868686868686868686868696969696969 6969696969696969696969696969696969696969696969696969696969696969696A6A6A6A6A6A 6A6A6A6A6A6A6A6A6A6B6B6B6B6B6B6B6B6B6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6E6E6E6E6E6E6E6E6E6E6E6E 6F6F6F6E6E6E6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F7070706F6F6F707070 707070707070707070707070717171717171717171717171717171727272727272727272727272 727272727272727272727272727272727272727272737373737373737373737373737373737373 737373737373747474747474747474747474747474747474747474747474747474757575757575 757575757575757575757575757575757575757575757575757575757575757575757575757575 757575757575757575757575757575767676757575767676757575767676767676767676767676 767676767676767676767676767676767676767676767676767676767676767676767676767676 767676767676767676767676767676767676767676767676767676767676767676767676757575 757575757575757575757575757575757575757575757575757575757575757575757575757575 757575757575757575757575757575757575747474747474747474747474747474747474747474 747474747474737373737373737373737373737373737373737373737373727272727272727272 727272727272727272727272727272727272727272727272717171717171717171717171717171 7070707070707070707070707070706F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F 6F6F6F6F6F6F6F6F6F6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6D6D6D6D6D6D6D6D6D6D6D6D6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6B6B6B6B6B6B6B6B6B6B6B6B 6B6B6B6B6B6B6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A696969696969696969696969696969696969 696969696969696969696969696969696969686868686868686868686868676767686868676767 676767676767676767676767676767666666666666666666666666666666666666666666666666 666666666666666666666666656565666666656565656565656565656565656565656565656565 1C242B1C242B1C242C0E1013030202060606060606000000545351EFEFEDF7F4F0F6F3EFF6F3EF F6F3EFFAF7F3CCCAC89291917F7F7F6B6D6E5A5C5E4B4C4F36373C23282B1D1F2518192112161C 0D10132E3234A3A6A7A0A2A0000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000585758393A3AC1C1C1 A5A6A77A7C7C7978792A2A2B1315181D202326292C4E4F515A5B5D6665687070727A7A7C868685 8B8A8AC0BFBDF8F5F1F7F4F0F6F3EFF6F3EFFEFBF7D8D6D2282828000000060606050303090A0A 1B22291D252C1C242B656565656565656565656565656565656565656565666666666666666666 666666666666666666666666666666666666666666666666666666676767676767676767676767 676767676767676767686868686868686868686868686868696969686868696969696969696969 6969696969696969696969696969696969696A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6B6B6B6B6B6B 6B6B6B6B6B6B6B6B6B6B6B6B6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C 6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6F6F6F6F6F6F 6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F7070706F6F6F707070707070707070707070707070 717171717171717171717171717171717171727272727272727272727272727272727272727272 727272727272727272727272737373737373737373737373737373737373737373747474747474 747474747474747474747474747474757575757575757575757575757575757575757575757575 757575757575757575757575757575757575757575757575767676767676757575767676767676 767676767676767676767676767676767676767676767676767676767676767676767676767676 777777767676767676767676767676767676767676767676767676767676767676767676777777 767676777777767676767676767676767676767676767676767676767676767676767676767676 767676767676767676757575757575757575757575757575757575757575757575757575757575 757575757575757575757575757575757575757575757575757575757575747474747474747474 747474747474747474737373747474737373737373737373737373727272727272727272727272 727272727272727272727272727272727272727272727272717171717171717171717171717171 7070707070707070707070707070707070707070706F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F 6F6F6F6F6F6F6F6F6F6E6E6E6E6E6E6E6E6E6E6E6E6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6B6B6B6B6B6B6B6B6B6B6B6B 6B6B6B6A6A6A6B6B6B6A6A6A6A6A6A6A6A6A6A6A6A696969696969696969696969696969696969 696969696969696969696969696969686868686868686868686868676767686868676767676767 676767676767676767676767666666666666666666666666666666666666666666666666666666 6666666666666666666666666565656565656565656565656565656464646464641C242B1C242B 1C242C0E1013030202060606060606000000545352EFEEEDF7F4F0F6F3EFF6F3EFF6F3EFFAF7F3 CCCAC892908F7F80806B6D6D595B5D4A4C5036383D24272C1D1F25181B2112161C0A0D122B3032 A0A3A5A09FA0000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000504F52383839C2C1C2A6A5A6797A7B 77767927282B1315181E202226292C4E50525A5C5E6665687070727B7B7B8787878B8B8BC0BFBD F8F5F1F7F4F0F6F3EFF6F3EFFEFBF7D8D6D2282828000000060606050303090A0A1B22291D252C 1C242B656565656565656565656565656565656565666666666666666666666666666666666666 666666666666666666666666666666666666676767666666676767676767676767676767686868 676767686868686868686868696969696969696969696969696969696969696969696969696969 6969696A6A6A6969696A6A6A6969696A6A6A6A6A6A6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6D6D6D6D6D6D6D6D6D6D6D6D 6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F 6F6F6F6F6F6F6F6F6F6F6F6F707070707070707070707070717171717171717171717171717171 717171727272727272727272727272727272727272727272727272727272737373737373737373 737373737373737373737373737373747474747474747474747474747474747474757575757575 757575757575757575757575757575757575757575757575757575757575757575757575757575 757575757575767676767676767676767676767676767676767676767676777777767676777777 777777767676767676777777777777777777777777777777777777777777777777777777777777 777777777777777777777777777777777777777777777777777777777777777777777777777777 777777777777777777777777777777777777777777767676777777767676767676777777767676 767676767676767676767676767676767676767676767676757575757575757575757575757575 757575757575757575757575757575757575757575757575757575757575757575747474747474 747474747474747474747474737373737373737373737373737373737373727272727272727272 727272727272727272727272727272727272727272727272717171717171717171717171717171 7070707070707070707070707070706F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F 6F6F6F6F6F6F6F6F6F6E6E6E6E6E6E6E6E6E6E6E6E6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6B6B6B6B6B6B6B6B6B6B6B6B 6B6B6B6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A696969696969696969696969696969696969 696969696969686868696969686868686868686868686868686868686868686868676767676767 676767676767676767666666666666666666666666666666666666666666666666666666666666 6666666666666565656666666565656565656565656565656565651C242B1C242B1C242C0E1013 030202060606060606000000545352EFEEEDF7F4F0F6F3EFF6F3EFF6F3EFFAF7F3CBCAC7919090 7F80806B6C6D585A5B4A4B4E36383C25282D1D1F24171A2012151B0B0D122D3032A7A8ABA3A3A2 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 0000000000000000000000000000000000005E5E60383838C2C1C2A6A5A67A7A7C78787828292C 1315181E202426282C4E50525A5C5D6464677070727C7C7D8787888B8C8CC0BFBDF7F5F0F7F4F0 F6F3EFF6F3EFFEFBF7D8D6D2282828000000060606050303090A0A1B22291D252C1C242B656565 656565656565656565656565666666666666666666666666666666666666666666666666666666 666666666666666666676767676767676767676767676767676767676767686868686868686868 6868686868686868686969696969696969696969696969696969696969696969696969696A6A6A 6A6A6A6A6A6A6A6A6A6A6A6A6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6C6C6C6C6C6C6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6D6D6D6D6D6D6D6D6D6D6D6D6E6E6E6E6E6E 6E6E6E6E6E6E6E6E6E6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F707070 707070707070707070707070707070717171717171717171717171727272727272727272727272 727272727272727272727272727272727272737373727272737373737373737373737373747474 747474747474747474747474747474747474757575757575757575757575757575757575757575 757575757575757575757575757575757575767676757575767676767676767676767676767676 767676767676777777767676767676777777777777777777777777777777777777777777777777 777777777777777777777777777777787878777777777777787878787878787878777777777777 787878787878787878787878777777787878777777777777777777787878777777777777787878 777777777777777777777777777777777777777777777777777777777777777777777777777777 767676767676767676767676767676767676767676767676767676767676757575757575767676 757575757575757575757575757575757575757575757575757575757575757575747474757575 747474747474747474747474747474747474737373737373737373737373727272727272727272 727272727272727272727272727272727272727272727272717171717171717171717171717171 7070707070707070707070707070706F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F 6F6F6F6F6F6F6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6D6D6D6D6D6D6D6D6D6C6C6C6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B 6B6B6B6A6A6A6A6A6A6A6A6A6A6A6A696969696969696969696969696969696969696969696969 696969696969696969686868686868686868686868686868686868676767676767676767676767 676767666666666666666666666666666666666666666666666666666666666666666666666666 6666666565656565656565656565656565656565651C242B1C242B1C242C0E1013030202060606 060606000000545352EFEEEDF7F4F0F6F3EFF6F3EFF6F3EFFAF7F3CCCBC89293918080806B6C6D 58595B494B4E36383C25272C1C1E24171A1F13161C0D0F132B2E2FA5A6A6A2A2A2000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000626062373737C2C3C2A4A4A7777879797A79292A2B1315191E2024 27292D4E4F525A5B5E6564677170737D7D7E8887888B8C8CC1BFBEF8F5F1F7F4F0F6F3EFF6F3EF FEFBF7D8D6D2282828000000060606050303090A0A1B22291D252C1C242B656565656565656565 656565666666666666666666666666666666666666666666666666666666666666666666676767 676767676767676767676767676767686868676767686868686868686868686868696969696969 6969696969696969696969696969696969696969696969696A6A6A6969696A6A6A6A6A6A6A6A6A 6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C 6C6C6C6C6C6C6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6F6F6F 6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F707070707070707070707070707070 707070717171717171717171717171717171727272727272727272727272727272727272727272 727272727272727272737373737373737373737373737373737373747474747474747474747474 747474757575757575757575757575757575757575757575757575757575757575757575757575 767676757575767676767676767676767676767676767676767676767676777777777777777777 777777777777777777777777777777777777787878777777787878787878787878787878787878 787878787878787878787878787878787878787878787878787878787878787878787878787878 787878787878787878787878787878787878787878787878787878787878787878787878787878 787878787878787878787878787878787878787878777777777777777777777777777777777777 777777777777777777767676767676767676777777767676767676767676767676767676757575 767676757575757575757575757575757575757575757575757575757575757575757575757575 747474747474747474747474747474747474737373737373737373737373727272737373727272 727272727272727272727272727272727272727272727272717171717171717171717171717171 7171717070707070707070706F6F6F7070706F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F 6F6F6F6F6F6F6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6D6D6D6D6D6D6D6D6D6C6C6C6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6B6B6B6C6C6C6B6B6B6B6B6B6A6A6A6A6A6A 6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A696969696969696969696969696969696969696969696969 696969686868686868686868686868686868676767686868686868676767676767676767676767 676767666666666666666666666666666666666666666666666666666666666666666666666666 6666666565656565656565656565651C242B1C242B1C242C0E1013030202060606060606000000 545352EFEEEDF7F4F0F6F3EFF6F3EFF6F3EFFAF7F3CCCBC992929180807F6C6D6E585B5C484A4D 373A3C25282D1D1F24181B2013151D0D0F13303331A5A7A6A2A2A2000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000636364383736C2C2C1A6A6A778797B78787A2A2B2D1316181E2023282A2E505154 5A5A5D6565677272747D7C7F8887878C8C8CC1C0BEF8F5F1F7F4F0F6F3EFF6F3EFFEFBF7D8D5D2 282727000001060606050303090A0A1B22291D252C1C242B656565656565666666656565666666 666666666666666666666666666666666666666666666666666666676767676767676767676767 676767676767686868686868686868686868686868686868686868696969696969696969696969 6969696969696969696969696969696969696A6A6A6A6A6A6A6A6A6A6A6A6B6B6B6B6B6B6B6B6B 6B6B6B6B6B6B6B6B6B6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6D6D6D 6D6D6D6D6D6D6D6D6D6E6E6E6E6E6E6E6E6E6E6E6E6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F 6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F707070707070707070707070717171717171717171717171 727272717171727272727272727272727272727272727272727272727272727272727272737373 737373737373737373747474747474747474747474747474747474747474757575757575757575 757575757575757575757575757575757575757575767676767676767676767676767676767676 767676767676777777777777777777777777777777777777777777777777777777777777787878 787878787878787878787878787878787878787878787878787878787878787878787878787878 787878787878787878787878787878787878787878787878787878787878787878787878787878 787878787878787878787878787878787878787878787878787878787878787878787878787878 787878787878787878787878787878787878787878787878787878787878777777787878777777 777777777777777777777777777777777777777777767676767676767676767676767676767676 767676757575767676757575757575757575757575757575757575757575757575757575757575 747474747474747474747474747474737373747474737373737373737373737373737373727272 727272727272727272727272727272727272727272727272727272727272717171717171707070 7171717070707070707070707070706F6F6F7070706F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F 6F6F6F6F6F6F6E6E6E6E6E6E6E6E6E6E6E6E6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6C6C6C6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6A6A6A 6A6A6A6A6A6A6A6A6A6969696A6A6A696969696969696969696969696969696969696969696969 696969696969686868686868686868686868676767686868676767676767676767676767666666 666666666666666666666666666666666666666666666666666666666666666666666666666666 6565656565656565651C242B1C242B1C242C0E1013030202060606060606000000545352EFEEED F7F4F0F6F3EFF6F3EFF6F3EFFAF7F3CCCBC99292928182826D6E6F5B5C5E4A4B4F35393C24272C 1E2025181B2111141B0D10142C3131A0A3A6A3A3A3000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 636267383738C3C2C3A7A5A77C7C7E79797B28292B1214181E212427292D5051535A5B5D656567 7272757D7D7F8886888C8B8BC2C0BEF8F6F1F7F4F0F6F3EFF6F3EFFEFBF7D7D5D1272826000001 060606050303090A0A1B22291D252C1C242B666666666666666666666666666666666666666666 666666666666666666666666666666666666676767676767676767676767676767676767676767 676767686868686868686868686868686868696969696969696969696969696969696969696969 6969696969696A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6D6D6D6D6D6D6D6D6D6D6D6D 6D6D6D6E6E6E6E6E6E6E6E6E6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F 6F6F6F6F6F6F707070707070707070717171707070717171717171717171717171727272727272 727272727272727272727272727272727272737373737373737373737373737373737373737373 747474747474747474747474757575757575757575757575757575757575757575757575757575 757575757575767676767676767676767676767676767676767676767676777777777777777777 777777777777777777787878777777787878787878787878787878787878787878787878787878 787878787878787878787878787878787878787878787878787878787878787878787878787878 787878787878787878787878797979787878787878787878787878787878787878787878787878 787878787878787878787878787878787878787878787878787878787878787878787878787878 787878787878787878787878787878787878787878787878787878787878787878787878787878 787878777777787878777777777777777777777777777777777777767676767676767676767676 767676767676767676757575757575757575757575757575757575757575757575757575757575 757575747474747474747474747474747474747474737373737373737373737373737373737373 727272727272727272727272727272727272727272727272717171717171717171717171717171 7171717171717070707070707070707070706F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F 6F6F6F6E6E6E6E6E6E6E6E6E6E6E6E6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6C6C6C6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6B6B6B6C6C6C6B6B6B6B6B6B6B6B6B6A6A6A6A6A6A 6A6A6A6A6A6A6A6A6A696969696969696969696969696969696969696969696969696969696969 686868686868686868686868686868686868676767676767676767676767676767666666676767 666666666666666666666666666666666666666666666666666666666666656565656565656565 6565651C242B1C242B1C242C0E1013030202060606060606000000545352EFEEEDF7F4F0F6F3EF F6F3EFF6F3EFFAF7F3CCCAC79292928182836D6F705B5C5F4A4C4E373A3D24282C1E2027181B21 12151B0D1013272C2BA4A5A6A3A3A3000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 0000000000000000000000000000000000000000000000000000000000000000005E5E5D323134 C3C2C3A9A8A97A7B7C7A7B7D29292B1215181D202327292C505154595A5D6464677272747D7C7E 8886878C8B8CC3C1BFF8F5F1F7F4F0F6F3EFF6F3EFFEFBF7D7D5D1272826000001060606050303 090A0A1B22291D252C1C242B656565666666666666666666666666666666666666666666666666 666666666666666666666666676767676767676767676767676767686868686868686868686868 686868686868686868696969696969696969696969696969696969696969696969696969696969 6A6A6A6A6A6A6A6A6A6A6A6A6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6C6C6C6C6C6C6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6D6D6D6D6D6D6D6D6D6D6D6D6E6E6E6E6E6E6E6E6E 6E6E6E6E6E6E6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F707070707070707070 707070707070717171717171717171717171727272727272727272727272727272727272727272 727272727272737373737373737373737373737373747474747474747474747474747474747474 757575757575757575757575757575757575757575757575757575757575757575767676767676 767676767676777777767676777777777777777777777777777777777777777777787878787878 787878787878787878787878787878787878787878787878787878787878787878787878787878 787878787878787878787878797979797979787878797979797979797979797979797979797979 797979797979797979797979797979797979797979797979797979797979797979797979797979 797979797979797979797979797979797979797979787878797979797979787878787878787878 787878787878787878787878787878787878787878787878787878787878787878787878787878 787878787878787878787878777777777777777777777777777777777777777777777777767676 767676767676767676767676767676757575757575757575757575757575757575757575757575 757575747474757575747474747474747474747474747474737373737373737373737373727272 727272727272727272727272727272727272727272727272727272717171717171717171717171 7070707070707070707070707070706F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F 6F6F6F6E6E6E6E6E6E6E6E6E6E6E6E6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6C6C6C6C6C6C6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6B6B6B6B6B6B6B6B6B6B6B6B6A6A6A6A6A6A6A6A6A 6A6A6A6969696A6A6A696969696969696969696969696969696969696969696969696969686868 686868686868686868686868686868676767676767676767676767676767676767666666666666 6666666666666666666666666666666666666666666666666666666666666666666565651C242B 1C242B1C242C0E1013030202060606060606000000545352EFEEEDF7F4F0F6F3EFF6F3EFF6F3EF FAF7F3CCCBC89393928283846D6E70595A5D4A4B4D37393D25282D1E2026191C2113161C0D0F12 282E2CA7A9A7A3A3A3000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000626362323133C1BFC1AAA9AB 787A7C79797B2B2B2D1314181D1F23282A2D5051545A5B5E6665687272737D7C7D8886888C8B8B C3C1BFF8F5F1F7F4F0F6F3EFF6F3EFFEFBF7D7D5D1272826000001060606050303090A0A1B2229 1D252C1C242B666666666666666666666666666666666666666666666666666666666666666666 666666666666676767676767676767676767686868686868686868686868686868686868696969 6969696969696969696969696969696969696969696969696969696969696A6A6A6A6A6A6A6A6A 6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C 6C6C6C6C6C6C6C6C6C6D6D6D6D6D6D6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6F6F6F6F6F6F6F6F6F 6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F707070707070707070717171717171717171 717171727272717171727272727272727272727272727272727272727272727272727272737373 737373737373737373747474747474747474747474757575747474757575757575757575757575 757575757575757575757575757575767676767676767676767676767676777777767676777777 777777777777777777777777787878787878787878787878787878787878787878787878787878 787878787878787878787878787878787878787878787878787878797979797979797979797979 7979797979797979797979797979797979797979797A7A7A7979797979797979797A7A7A797979 7979797979797979797A7A7A7979797979797979797A7A7A797979797979797979797979797979 797979797979797979797979797979797979797979797979797979797979797979797979797979 797979797979797979787878787878787878787878787878787878787878787878787878787878 787878787878787878787878787878787878787878777777777777777777777777767676767676 767676767676767676767676767676767676757575757575757575757575757575757575757575 757575757575747474747474747474747474747474747474737373737373737373737373727272 727272727272727272727272727272727272727272727272727272717171717171717171717171 7171717070707070707070706F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F 6F6F6F6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6D6D6D6D6D6D6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6B6B6B6B6B6B6B6B6B6B6B6B6A6A6A6A6A6A6A6A6A6A6A6A 6A6A6A696969696969696969696969696969696969696969696969696969686868696969696969 686868686868686868686868676767676767676767676767676767676767666666666666666666 6666666666666666666666666666666666666666666666666666666565651C242B1C242B1C242C 0E1013030202060606060606000000545252EFEEEDF7F4F0F6F3EFF6F3EFF6F4EFFAF7F3CCCAC8 9292918082826C6D6D595B5D4C4D5036393C24282D1D1F24181B2012161B0D0F132E3332A6A9A7 A29F9F000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 0000000000000000000000000000000000000000005C5C5C303030BABABBA9A8AC78787A79797A 2A2B2D1416191E202427282D5152555B5B5E67676A7171737C7B7C8786888C8A8CC4C1BFF8F5F1 F7F4F0F6F3EFF6F3EFFEFBF7D7D5D1272826000101060606050303090A0A1B22291D252C1C242B 666666666666666666666666666666666666666666666666666666666666666666666666676767 676767676767676767686868686868686868686868686868686868686868696969696969696969 6969696969696969696969696969696969696969696A6A6A6A6A6A6A6A6A6B6B6B6B6B6B6B6B6B 6B6B6B6B6B6B6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6D6D6D6D6D6D 6D6D6D6D6D6D6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F 6F6F6F6F6F6F6F6F6F707070707070707070707070717171717171717171717171727272727272 727272727272727272727272727272727272727272727272737373737373737373747474737373 747474747474747474757575757575757575757575757575757575757575757575757575757575 757575767676767676767676767676767676777777777777777777777777777777787878777777 787878787878787878787878787878787878787878787878787878787878787878787878787878 7878787878787979797979797979797979797979797979797979797979797979797979797A7A7A 7A7A7A7A7A7A7A7A7A7979797A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A 7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A 7A7A7A7A7A7A7A7A7A7979797A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A797979797979797979 797979797979797979797979797979797979787878787878787878787878787878787878787878 787878787878787878787878787878787878787878787878787878777777777777777777777777 777777767676767676767676767676767676767676757575757575757575757575757575757575 757575757575757575747474747474747474747474737373737373737373737373737373737373 737373727272727272727272727272727272727272727272727272717171717171717171717171 7171717070707070707070707070706F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6E6E6E 6E6E6E6E6E6E6E6E6E6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6B6B6B6B6B6B6B6B6B6B6B6B6A6A6A6A6A6A6A6A6A6A6A6A 6969696A6A6A696969696969696969696969696969696969696969696969696969686868686868 686868686868676767676767676767676767676767676767666666666666666666666666666666 6666666666666666666666666666666666666666666565651C242B1C242B1C242C0E1013030202 060606060606000000545252EFEEEDF7F4F0F6F3EFF6F3EFF6F4EFFAF7F3CCCAC8929393808181 6D6E6E5B5C5E4B4D4F37393D22272B1B2023171B2014171D0D10142C3131A9ABABA3A3A3000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 0000000000000000000000000000005E5E5E2B2C2DB8B8B9AEADB078787A77777928292D141519 1E212526272B5152555A5B5E67676A7271737B7A7C8785878B8A8BC3C2C0F8F5F1F7F4F0F6F3EF F6F3EFFEFBF7D6D3D0262625000100060606050303090A0A1B22291D252C1C242B666666666666 666666666666666666666666666666666666666666666666666666676767676767676767676767 686868686868686868686868686868686868696969696969696969696969696969696969696969 6969696969696969696A6A6A6A6A6A6A6A6A6A6A6A6B6B6B6B6B6B6B6B6B6B6B6B6C6C6C6C6C6C 6B6B6B6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D 6E6E6E6E6E6E6E6E6E6E6E6E6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F707070 707070707070717171717171717171717171717171727272727272727272727272727272727272 727272727272727272737373737373737373737373737373747474747474747474747474757575 757575757575757575757575757575757575757575757575757575757575767676767676767676 767676767676777777777777777777777777777777777777787878787878787878787878787878 787878787878787878787878787878787878797979797979797979797979797979797979797979 7979797979797979797A7A7A7979797979797A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A 7A7A7A7A7A7A7B7B7B7A7A7A7A7A7A7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7A7A7A 7B7B7B7B7B7B7A7A7A7B7B7B7B7B7B7B7B7B7B7B7B7A7A7A7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B 7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7979797A7A7A797979 797979797979797979797979797979797979797979797979787878797979787878787878787878 787878787878787878787878787878787878787878787878787878777777777777777777777777 777777767676767676767676767676767676767676757575757575757575757575757575757575 757575757575757575747474747474747474747474747474737373737373737373737373737373 727272727272727272727272727272727272727272727272717171717171717171707070717171 7070707070707070706F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6E6E6E 6E6E6E6E6E6E6E6E6E6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6C6C6C6C6C6C6C6C6C6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6A6A6A6A6A6A6A6A6A6A6A6A 696969696969696969696969696969696969696969696969696969686868686868686868686868 686868686868676767676767676767676767676767676767666666666666666666666666666666 6666666666666666666666666666666666661C242B1C242B1C242C0E1013030202060606060606 000000545252EFEEEDF7F4F0F6F3EFF6F3EFF6F4EFFAF7F3CCCAC89292928182826E6E6F5C5C5E 4C4E5037393D22262B1B2023171B1F13161C0D10132B2F31A7A8AAA3A3A3000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 0000000000000000006363632B2B2BB9B8B9AEAEAE7A7A7B78787A292B2C1316191E202325282B 5052545B5C5F67666A7272747B7B7C8785878B8B8BC4C2C0F8F5F1F7F4F0F6F3EFF6F3EFFEFBF7 D6D3D0262625000100060606050303090A0A1B22291D252C1C242B666666666666666666666666 666666666666666666666666666666676767676767676767676767676767686868676767686868 686868686868696969696969696969696969696969696969696969696969696969696969696969 6A6A6A6A6A6A6A6A6A6A6A6A6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6C6C6C6C6C6C6C6C6C6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6D6D6D6C6C6C6D6D6D6D6D6D6D6D6D6E6E6E6E6E6E6E6E6E6E6E6E 6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F707070707070707070707070 717171717171717171727272727272727272727272727272727272727272727272727272737373 737373737373737373747474737373747474747474747474757575757575757575757575757575 757575757575757575757575757575767676767676767676777777777777777777777777777777 777777777777787878787878787878787878787878787878787878787878787878787878787878 7878787979797979797979797979797979797979797A7A7A7979797979797A7A7A7A7A7A7A7A7A 7A7A7A7A7A7A7A7A7A7A7A7A7B7B7B7A7A7A7B7B7B7B7B7B7A7A7A7B7B7B7B7B7B7B7B7B7B7B7B 7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B 7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B 7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7A7A7A7B7B7B7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A 7A7A7A797979797979797979797979797979797979797979797979797979797979787878787878 787878787878787878787878787878787878787878787878787878787878777777777777777777 777777777777777777767676767676767676767676767676767676757575757575757575757575 757575757575757575747474747474747474747474737373737373737373737373737373737373 727272727272727272727272727272727272727272727272727272717171717171717171707070 7070707070707070707070706F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6E6E6E6E6E6E 6E6E6E6E6E6E6D6D6D6D6D6D6D6D6D6D6D6D6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6B6B6B6B6B6B6B6B6B6A6A6A6A6A6A6A6A6A6A6A6A696969696969 696969696969696969696969696969696969696969696969696969686868686868686868686868 676767686868676767676767676767676767666666676767666666666666666666666666666666 6666666666666666666666661C242B1C242B1C242C0E1013030202060606060606000000545252 EFEEEDF7F4F0F6F3EFF6F3EFF6F4EFFAF7F3CCCAC89292928282836F70705B5C5E4C4E50393C3F 24272D1D1F24181B2013171C0C0D12272C2DA6AAA9A4A4A3000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000605F602B2C2DB8B7B9ADAEAE7879797A7A7B28292C1215191D202426282B5052545B5C5F 6766697271737C7B7D8685878A8B8CC4C2C0F8F5F1F7F4F0F6F3EFF6F3EFFEFBF7D6D3D0262625 000100060606050303090A0A1B22291D252C1C242B666666666666666666666666666666666666 666666666666676767676767676767676767676767676767686868686868686868696969686868 6969696969696969696969696969696969696969696969696969696969696A6A6A6A6A6A6A6A6A 6A6A6A6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C 6C6C6C6C6C6C6D6D6D6D6D6D6D6D6D6D6D6D6E6E6E6E6E6E6E6E6E6E6E6E6F6F6F6F6F6F6F6F6F 6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F707070707070707070707070707070717171717171717171 727272727272727272727272727272727272727272727272727272737373737373737373737373 747474747474747474747474747474757575757575757575757575757575757575757575757575 767676767676767676767676767676777777777777777777777777777777787878787878787878 787878787878787878787878787878787878787878787878787878797979797979797979797979 7979797A7A7A7979797A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7B7B7B7A7A7A7B7B7B7B7B7B7B7B7B 7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B 7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B 7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B 7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7A7A7A 7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A797979797979797979797979797979797979797979 787878787878787878787878787878787878787878787878787878787878787878777777777777 777777777777777777777777767676767676767676767676757575757575757575757575757575 757575757575757575757575747474747474747474747474747474737373737373737373737373 727272727272727272727272727272727272727272727272717171717171717171707070707070 7070707070707070706F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6E6E6E6E6E6E 6E6E6E6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C 6C6C6C6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A696969 696969696969696969696969696969696969696969696969686868686868686868686868676767 686868676767676767676767676767666666676767666666666666666666666666666666666666 6666666666661C242B1C242B1C242C0E1013030202060606060606000000545251EFEEEDF7F4F0 F6F3EFF6F3EFF6F4EFFAF7F3CCCBC99393928283836E6F715C5D5F4D4F51373A3D23272C1D2025 181B2013171C0F10152C3130A4A8A6A3A3A3000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000636363 29292AB1B2B3AAAAAC77777979797B292A2D1315191D202425272A4F51545B5C5F676668717173 7B7C7D8686878B8A8AC3C2C0F8F5F1F7F4F0F6F3EFF6F3EFFEFBF7D6D3D0262625000100060606 050303090A0A1B22291D252C1C242B666666666666666666666666666666666666676767676767 676767676767676767676767676767686868686868686868686868686868696969696969696969 6969696969696969696969696969696969696969696A6A6A6A6A6A6A6A6A6A6A6A6B6B6B6B6B6B 6B6B6B6B6B6B6B6B6B6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6D6D6D6D6D6D 6D6D6D6D6D6D6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F 6F6F6F6F6F6F6F6F6F707070707070717171707070717171717171727272727272727272727272 727272727272727272727272737373737373737373737373747474747474747474747474747474 757575757575757575757575757575757575757575767676757575757575767676767676767676 777777777777777777777777787878787878787878787878787878787878787878787878787878 7878787878787979797979797979797979797979797979797979797A7A7A7A7A7A7A7A7A7A7A7A 7A7A7A7A7A7A7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B 7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7C7C7C7B7B7B 7B7B7B7B7B7B7C7C7C7C7C7C7B7B7B7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7B7B7B7C7C7C 7B7B7B7C7C7C7C7C7C7B7B7B7C7C7C7C7C7C7B7B7B7C7C7C7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B 7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B 7B7B7B7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A797979797979797979 797979797979787878787878787878787878787878787878787878787878787878777777787878 777777777777777777767676767676767676767676767676757575757575757575757575757575 757575757575757575747474747474747474747474747474737373737373737373737373727272 727272727272727272727272727272727272727272717171717171717171707070707070707070 7070707070706F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6E6E6E6E6E6E6E6E6E 6E6E6E6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C 6C6C6C6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A696969696969 696969696969696969696969696969696969696969696969686868686868686868686868676767 676767676767676767676767666666666666666666666666666666666666666666666666666666 1C242B1C242B1C242C0E1013030202060606060606000000565452EFEFEEF7F4F0F6F3EFF6F3EF F6F4EFFAF7F3CCCBC99394938282836E6F705B5D604D4F51383C3E24272B1D2025171A1F14171D 0D10142E3130A6A7A6A2A0A0000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000646464282827AFAFB0 AEADB07A7A7D7A7B7C292A2C1316181E202425262A5051545C5B5E6766697171737A7A7B858586 89898AC4C1C0F8F5F1F7F4F0F6F3EFF6F3EFFEFBF7D5D3D0262625000100060606050303090A0A 1B22291D252C1C242B666666666666666666666666666666666666666666676767676767676767 676767676767686868686868686868686868686868696969696969696969696969696969696969 6969696969696969696969696A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6B6B6B6B6B6B6B6B6B6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6D6D6D6D6D6D6D6D6D6E6E6E 6E6E6E6E6E6E6E6E6E6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F707070707070 707070707070717171717171717171727272727272727272727272727272727272727272727272 727272727272737373737373747474747474747474747474747474747474757575757575757575 757575757575757575757575767676767676767676767676767676767676777777777777777777 777777787878787878787878787878787878787878787878787878787878787878797979797979 7979797979797979797A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7B7B7B7B7B7B7B7B7B7B7B7B 7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7C7C7C 7C7C7C7B7B7B7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C 7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C 7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C 7C7C7C7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B 7B7B7B7B7B7B7B7B7B7B7B7B7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A797979797979797979 797979797979797979787878787878787878787878787878787878787878787878777777787878 777777777777777777767676767676767676767676767676757575757575757575757575757575 757575757575757575747474747474747474747474747474747474737373737373737373727272 727272727272727272727272727272727272727272727272717171717171717171707070707070 7070707070706F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6E6E6E6E6E6E6E6E6E6E6E6E 6E6E6E6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C 6C6C6C6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6A6A6A6A6A6A6A6A6A696969696969696969696969 696969696969696969696969696969696969686868686868686868686868676767686868676767 6767676767676767676767676666666666666666666666666666666666666666661C242B1C242B 1C242C0E1013030202060606060606000000585756F0F0EEF7F4F0F6F3EFF6F3EFF6F4EFF9F7F3 CCCBC89393938383837070715D5E604C4E50383B3E23262C1D2025171A2013161D0E10152C2E2D A4A5A6A3A3A3000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000646464272828AFB0B1AFAFB278797B 7C7C7D2A2B2D1215191D20242426295051545B5B5E6666687170727A797B84848589898AC3C1C1 F8F5F2F7F4F0F6F3EFF6F3EFFEFBF7D4D2CE252424000001060606050303090A0A1B22291D252C 1C242B666666666666666666666666666666666666676767676767676767676767686868686868 686868686868686868686868686868696969696969696969696969696969696969696969696969 6A6A6A6A6A6A6A6A6A6A6A6A6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6C6C6C6C6C6C6C6C6C6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6E6E6E6E6E6E6E6E6E6E6E6E 6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F707070707070707070707070707070717171 717171717171717171727272727272727272727272727272727272737373727272737373737373 737373747474747474747474747474757575757575757575757575757575757575757575757575 767676767676767676767676767676777777777777787878777777787878787878787878787878 7878787878787878787878787878787979797979797979797979797979797A7A7A7A7A7A7A7A7A 7A7A7A7A7A7A7A7A7A7B7B7B7B7B7B7A7A7A7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B 7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C 7C7C7C7C7C7C7D7D7D7D7D7D7C7C7C7C7C7C7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D 7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D 7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C 7C7C7C7C7C7C7B7B7B7C7C7C7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B 7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A797979797979 797979797979797979797979787878787878787878787878787878787878787878787878787878 777777777777777777777777767676767676767676767676757575757575757575757575757575 757575757575757575757575747474747474747474747474737373737373737373737373737373 727272727272727272727272727272727272717171717171717171717171717171707070707070 7070706F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E 6D6D6D6D6D6D6D6D6D6D6D6D6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C 6B6B6B6B6B6B6B6B6B6B6B6B6A6A6A6A6A6A6A6A6A6A6A6A696969696969696969696969696969 696969696969696969696969686868686868686868686868686868686868676767676767676767 6767676767676666666666666666666666666666666666666666661C242B1C242B1C242C0E1013 030202060606060606000000585655F0EFEEF7F4F0F6F3EFF6F3EFF6F4EFF9F7F3CBCAC8959594 8384847070715D5E604D5052373A3E24282C1E2126191D2214171E0E10152B2E2FA3A5A4A3A3A3 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000626263282828B1B1B2AEAEB2797A7D7A7A7B292A2C 1315191D20222426295152545B5C5E6666687070727A797A838384888789C3C1BFF8F5F1F7F4F0 F6F3EFF6F3EFFEFBF7D4D2CE252424000001060606050303090A0A1B22291D252C1C242B666666 666666666666666666676767666666676767676767676767676767686868686868686868686868 6969696868686969696969696969696969696969696969696969695D5F614E50574449513F454E 3F454E3F454E40464E40464E40464E40464E40464F40464F40464F40464F40464F41474F41474F 41474F41474F414750414750414750414750414850414850414850414850424851424851424952 424952424952424952434952434952434952434952434952434A53434A53434A53444A53434A53 444A53444A53444A53444A53444B54454C54454C54464C54464C54464C54464C54464D55464D55 464D55464D55464D55464D56464D56464D56474E56474E56474E56474E56474E56474E57474E57 484F57484F57484F57484F58484F58484F59484F58484F59484F59495059495059495059495059 49505949505949505949505A49505A4A515A4A515A4A515A4A515A4A515A4A515A4A515A4A515B 4A515B4A515B4A515B4A515B4A515B4A525B4A525B4A525B4A525B4A525B4F555D585C636A6C70 7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D 7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7E7E7E7D7D7D7D7D7D7E7E7E7D7D7D7E7E7E 7D7D7D7D7D7D7E7E7E7E7E7E7D7D7D7E7E7E7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D 7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7C7C7C 7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B 7B7B7B7B7B7B6C6E71595D6450565E4A515B4A515A4A515A4A515A4A515A4A515A49505A49505A 49505A49505A495059495059495059495059495059495059484F59484F59484F59484F58484F58 484F58484F58484F57484F57484F57474E57474E56474E56474E56474E56474E56474E56464D56 464D56464D56464D55464D55464D55464D55464D55464C54464C54464C54464C54464C54454C54 454C54454C54454B53454B53454B53454B53454B53444B53444B53444B53444A52444A52444A52 444A52434A52434A52434A52434A52434951434951434951424950424950424950424950424950 42485042485042485042484F42484F42484F42484F42484F41474F41474F41474F41474F41474E 41474E41474E40464E40464E40464E40464E40464E43494F4A4F545A5C5F696969696969696969 696969696969696969696969686868686868686868686868686868686868676767676767676767 6767676666666666666666666666666666666666661C242B1C242B1C242C0E1013030202060606 060606000000585655F0EFEEF7F4F0F6F3EFF6F3EFF7F4F0F9F7F2CCCAC89594948384846F6F70 5C5E5F4D5051383A3D23262A1D2024181B2012161C0E10142B2F2FA5A7A6A3A3A3000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000606060292929B0B0B1B1B0B4797A7E78797A29292C1315181D1F22 2426295151545C5C5E6565686F6F7278797B828384878789C4C1C1F8F5F2F7F4F0F6F3EFF6F3EF FEFBF7D4D2CE252424000001060606050303090A0A1B22291D252C1C242B666666666666676767 666666676767676767676767676767676767686868686868686868686868686868696969696969 69696969696969696969696969696967676751545944484E4D4F525555565959595B5B5B5B5B5B 5B5B5B5B5B5B5B5B5B5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5D5D5D5D5D5D 5D5D5D5D5D5D5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5F5F5F5F5F5F5F5F5F 5F5F5F5F5F5F606060606060606060606060606060606060616161616161616161626262626262 626262626262626262626262626262626262636363636363636363636363636363636363636363 646464646464646464646464646464656565656565656565656565656565656565656565656565 666666666666666666666666666666676767676767676767676767676767676767676767676767 676767686868686868686868686868686868696969696969696969696969696969696969696969 696969696969696969696969696969696A6A696A6A6969696565655D5E6151565C5D6167707274 7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7E7E7E7D7D7D7D7D7D7E7E7E7E7E7E7E7E7E 7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E 7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E 7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D 7D7D7D7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7B7B7B787879606469 4F545B5A5C5F626263676767686868696969696969696969686868686868686868686868686868 676767676767676767676767676767676767676767676767676767676767666666666666656565 656565656565656565656565656565656565656565656565656565646464646464646464646464 636363636363636363636363636363636363636363626262626262626262626262626262626262 626262626262626262616161616161606060606060606060606060606060606060606060606060 5F5F5F5F5F5F5F5F5F5F5F5F5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5D5D5D 5D5D5D5D5D5D5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5B5B5B5B5B5B 5B5B5B5B5B5B5B5B5B5B5B5B5959595656574F505345494E4E52575F6062696969696969696969 696969696969696969696969686868686868686868676767676767676767676767676767676767 6767676666666666666666666666661C242B1C242B1C242C0E1013030202060606060606000000 585655F0EFEEF7F4F0F6F3EFF6F3EFF7F4F0F9F6F2CBC9C79493938484846F70725C5E604E5051 36393B22262A1B1E2416191E11151B0E0F142B2D2CA4A5A3A3A3A3000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000626262292929B1B0B0ACABAF78777B79797B2A2A2C1314161D202325272B505254 5C5C5E66666870707279797C828283888889C5C2C1F9F6F2F7F4F0F6F3EFF6F3EFFEFBF7D4D2CE 252424000001060606050303090A0A1B22291D252C1C242B666666666666666666676767676767 676767676767686868676767686868686868686868686868696969696969696969696969696969 69696969696969696954575A4A4D515E5E5E6969696F6F6F737373757575757575757575757575 767676767676767676767676777777777777777777777777787878787878787878787878787878 7878787878787878787979797979797979797A7A7A7A7A7A7A7A7A7A7A7A7B7B7B7B7B7B7B7B7B 7B7B7B7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7D7D7D7C7C7C7D7D7D7D7D7D7E7E7E 7E7E7E7E7E7E7E7E7E7F7F7F7F7F7F7F7F7F7F7F7F808080808080808080808080808080808080 818181818181818181818181818181828282828282828282828282828282838383838383838383 848484848484848484848484858585858585858585858585858585858585858585858585858585 858585868686868686868686868686868686868686878787878787878787878787888888888888 8888888888888888888989898787878787878484847D7D7D7272725D5F634F555E7A7A7A7D7D7D 7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E 7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E 7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E 7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7D7D7D7D7D7D7D7D7D7D7D7D 7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7C7C7C7D7D7D7C7C7C7C7C7C62656A575A5F6E6E6E7A7A7A 818181858585868686868686868686868686868686868686858585858585858585858585858585 858585858585858585858585848484858585848484848484848484848484838383838383838383 828282828282828282828282818181818181818181808080808080808080808080808080808080 8080808080808080807F7F7F7F7F7F7F7F7F7F7F7F7E7E7E7E7E7E7E7E7E7D7D7D7D7D7D7D7D7D 7D7D7D7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7B7B7B7B7B7B7B7B7B 7A7A7A7A7A7A7A7A7A797979797979797979797979797979787878787878787878787878787878 787878787878777777777777777777767676777777767676767676767676757575757575757575 7575757474747373737070706A6A6A61616150515343484F676767696969696969696969696969 696969696969686868686868686868686868676767686868676767676767676767676767676767 6666666666666666661C242B1C242B1C242C0E1013030202060606060606000000585655F0EFEE F7F4F0F6F3EFF6F3EFF7F4F0F9F6F3CAC8C69493938585847071745E5F624F5153383A3D23262B 1C1E23171A2013171C0D0F12292D2DA3A5A5A3A3A3000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 636362282728B1B1B1AEAEAE7979797B7B7D2A2B2D1416171C1E2025262A5151555B5B5E656668 7070727A7A7C828282878688C4C2C0F9F6F2F7F4F0F6F3EFF6F3EFFEFBF7D3D1CD242324010101 060606050303090A0A1B22291D252C1C242B666666676767676767676767676767676767686868 686868686868686868686868696969686868696969696969696969696969696969696969696969 5D5E614A4E536363637373737D7D7D828282858585868686878787878787878787878787878787 8787878888888888888888888888888989898989898989898A8A8A8989898A8A8A8A8A8A8B8B8B 8B8B8B8B8B8B8B8B8B8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8D8D8D8D8D8D8D8D8D8E8E8E8E8E8E 8E8E8E8E8E8E8F8F8F8F8F8F8F8F8F8F8F8F909090909090909090919191919191919191919191 929292929292929292939393939393939393939393949494949494949494959595959595959595 959595969696969696969696969696969696969696969696969696979797979797979797979797 9898989898989898989898989898989999999999999999999999999A9A9A9A9A9A9A9A9A9A9A9A 9A9A9A9A9A9A9B9B9B9B9B9B9B9B9B9B9B9B9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9D9D9D 9D9D9D9D9D9D9C9C9C9C9C9C9B9B9B9494948B8B8B7A7A7A5C5F63686A6F7E7E7E7E7E7E7E7E7E 7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E 7E7E7E7E7E7E7F7F7F7E7E7E7E7E7E7E7E7E7F7F7F7F7F7F7E7E7E7E7E7E7F7F7F7E7E7E7F7F7F 7F7F7F7F7F7F7F7F7F7E7E7E7F7F7F7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E 7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E 7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7C7C7C6E7072565A617373738686869292929898989A9A9A 9A9A9A9B9B9B9B9B9B9B9B9B9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9999999A9A9A999999999999 999999999999989898989898989898979797979797979797979797969696969696969696969696 969696969696969696969696969696959595959595959595959595949494949494949494939393 939393939393939393929292929292929292919191919191919191919191919191909090909090 9090909090908F8F8F8F8F8F8E8E8E8E8E8E8E8E8E8D8D8D8D8D8D8D8D8D8D8D8D8C8C8C8C8C8C 8C8C8C8C8C8C8C8C8C8B8B8B8B8B8B8B8B8B8A8A8A8A8A8A8A8A8A8A8A8A898989898989898989 898989888888888888888888888888878787878787878787878787878787878787878787868686 8484848383837E7E7E7575756767674D505357595D696969696969696969696969696969696969 696969686868686868686868686868686868686868676767676767676767676767666666666666 6666661C242B1C242B1C242C0E1013030202060606060606000000585656F0F0EFF7F4F0F6F3EF F6F3EFF7F4F0FAF7F3CAC9C69392928484837273745F60634F5053383A3E22242B1B1E23171B20 12171B0D1012292D2FA4A5A7A3A3A4000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000646363282829 B0B0B1B2B3B27B7B7C7B7C7D2A2B2C14161A1B1D1F2326295252555C5C5F6564686F6F7179797B 818182878688C4C3C1F9F6F2F7F4F0F6F3EFF6F3EFFEFBF7D2D0CD242324010101060606050303 090A0A1B22291D252C1C242B666666676767676767676767676767676767676767686868686868 68686868686868686869696969696969696969696969696969696969696969696951555A5A5B5D 7373738282828989898D8D8D8E8E8E8F8F8F8F8F8F909090909090909090909090909090919191 919191929292929292929292929292929292939393939393939393949494949494949494949494 959595959595959595959595969696969696969696979797979797979797979797979797989898 9898989999999898989999999999999999999A9A9A9A9A9A9A9A9A9A9A9A9B9B9B9B9B9B9B9B9B 9C9C9C9C9C9C9D9D9D9C9C9C9D9D9D9D9D9D9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9F9F9F9F9F9F 9F9F9FA0A0A0A0A0A0A0A0A0A0A0A0A1A1A1A1A1A1A1A1A1A1A1A1A2A2A2A2A2A2A2A2A2A2A2A2 A2A2A2A2A2A2A3A3A3A3A3A3A3A3A3A4A4A4A4A4A4A4A4A4A5A5A5A4A4A4A5A5A5A5A5A5A5A5A5 A5A5A5A5A5A5A5A5A5A6A6A6A6A6A6A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A8A8A8 A7A7A7A7A7A7A7A7A7A4A4A49C9C9C8C8C8C747474585E657E7E7E7E7E7E7E7E7E7E7E7E7E7E7E 7E7E7E7E7E7E7E7E7E7E7E7E7F7F7F7E7E7E7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F 7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F 7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7E7E7E7F7F7F 7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E 7E7E7E7D7D7D7E7E7E7D7D7D5F63696A6B6D868686989898A2A2A2A4A4A4A5A5A5A6A6A6A5A5A5 A6A6A6A5A5A5A5A5A5A5A5A5A5A5A5A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A3A3A3A3A3A3 A3A3A3A2A2A2A2A2A2A2A2A2A2A2A2A1A1A1A1A1A1A1A1A1A1A1A1A0A0A0A0A0A0A0A0A0A0A0A0 9F9F9F9F9F9F9F9F9F9F9F9F9E9E9E9E9E9E9E9E9E9E9E9E9D9D9D9D9D9D9D9D9D9D9D9D9C9C9C 9C9C9C9C9C9C9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9A9A9A9A9A9A9A9A9A999999999999999999 989898989898989898989898979797979797969696969696969696969696969696959595959595 959595959595949494949494949494949494939393939393939393929292929292929292929292 9191919191919191919191919090909090909090908F8F8F9090908F8F8F8F8F8F8D8D8D8D8D8D 8B8B8B848484767676626262494E54696969696969696969696969696969696969696969696969 6868686868686868686868686767676767676767676767676767676666666666666666661C242B 1C242B1C242C0E10130302020606060606060000005B5A59F1F0EFF6F4F0F6F3EFF6F3EFF7F4F0 F9F6F2CBCAC79494938585857172735D5F604E5052373B3D23242C1D1F25181B2112151B0D1013 2B2F30A5A6A6A3A4A3000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 0000000000000000000000000000000000000000000000000000006362632B2A2AB0B0B0AFAFB2 7C7C7F7B7B7C2A2B2C1315191B1D212426295151545B5B5E6564676F6F7178797B818082868587 C4C2C1F9F6F2F7F4F0F6F3EFF6F3EFFEFBF7D2D0CD242324010101060606050303090A0A1B2229 1D252C1C242B666666676767676767676767676767686868686868686868686868696969696969 6969696969696969696969696969696969696969696969696A6A6A5054596767687D7D7D898989 8E8E8E8F8F8F8F8F8F9090908F8F8F909090909090909090909090919191919191929292929292 929292929292939393939393939393939393939393949494949494949494959595959595959595 969696969696969696969696979797979797979797989898989898989898989898989898999999 9999999999999A9A9A9A9A9A9A9A9A9A9A9A9B9B9B9B9B9B9B9B9B9B9B9B9C9C9C9C9C9C9D9D9D 9D9D9D9D9D9D9D9D9D9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9F9F9F9F9F9F9F9F9FA0A0A0A0A0A0 A0A0A0A1A1A1A1A1A1A1A1A1A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A3A3A3A3A3A3A3A3A3A3A3A3 A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A5A5A5A5A5A5A5A5A5A5A5A5A6A6A6A6A6A6A6A6A6A6A6A6 A6A6A6A6A6A6A7A7A7A7A7A7A7A7A7A8A8A8A7A7A7A7A7A7A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8 A9A9A9A8A8A8A6A6A69999998383835E62687F7F7F7E7E7E7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F 7F7F7F7F7F7F8080808080807F7F7F808080808080808080808080808080808080808080808080 808080808080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080807F7F7F7F7F7F8080807F7F7F7F7F7F7F7F7F7F7F7F7F7F7F 7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E 7E7E7E7E7E7E5D62687A7A7A929292A2A2A2A6A6A6A7A7A7A7A7A7A7A7A7A6A6A6A6A6A6A6A6A6 A6A6A6A6A6A6A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A4A4A4A4A4A4A4A4A4A4A4A4A3A3A3A3A3A3 A3A3A3A3A3A3A2A2A2A2A2A2A2A2A2A1A1A1A1A1A1A1A1A1A1A1A1A0A0A0A0A0A0A0A0A0A0A0A0 9F9F9FA0A0A09F9F9F9F9F9F9E9E9E9E9E9E9E9E9E9E9E9E9D9D9D9D9D9D9D9D9D9D9D9D9C9C9C 9C9C9C9C9C9C9C9C9C9B9B9B9B9B9B9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A999999999999999999 989898989898989898989898979797979797969696969696969696969696959595959595959595 959595949494949494949494949494939393939393939393929292929292929292929292929292 9191919191919090909090909090909090909090909090908F8F8F8F8F8F8F8F8F8D8D8D8B8B8B 8181816E6E6E4F52576A6A6A696969696969696969696969696969696969696969696969696969 6868686868686868686767676767676767676767676767676666666767671C242B1C242B1C242C 0E10130302020606060606060000005D5B59F1F0EFF6F4F0F6F3EFF6F3EFF7F4F0F9F7F2CBC9C7 9494938585847272745F60614F5153383B3F22272B1B1F24171A2011151C0D0F132B2F30A4A7A9 A4A3A4000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000636363292829AFAEAFB1AFB37C7B7F7C7C7E 2A2B2D1315181A1C202325285050545B5B5E6463676F6E7179797B818182858586C4C2C1F9F6F2 F7F4F0F6F3EFF6F3EFFEFBF7D2D0CD242324010101060606050303090A0A1B22291D252C1C242B 676767676767676767676767686868686868686868686868696969686868696969696969696969 6969696969696969696969696969696A6A6A6A6A6A5054596F6F6F8484848D8D8D8F8F8F8F8F8F 8F8F8F909090909090909090909090919191919191919191919191929292929292929292929292 939393939393939393949494949494949494959595959595959595969696959595969696969696 9797979797979797979797979898989797979898989898989999999999999999999999999A9A9A 9A9A9A9A9A9A9A9A9A9B9B9B9B9B9B9B9B9B9C9C9C9C9C9C9C9C9C9D9D9D9D9D9D9D9D9D9E9E9E 9E9E9E9E9E9E9E9E9E9F9F9F9F9F9F9F9F9F9F9F9FA0A0A0A0A0A0A0A0A0A1A1A1A1A1A1A1A1A1 A1A1A1A2A2A2A2A2A2A2A2A2A2A2A2A3A3A3A3A3A3A3A3A3A3A3A3A4A4A4A4A4A4A4A4A4A4A4A4 A5A5A5A5A5A5A5A5A5A5A5A5A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A7A7A7A7A7A7A7A7A7A7A7A7 A7A7A7A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A9A9A9A8A8A8A9A9A9A9A9A9A9A9A9A9A9A9AAAAAA A8A8A89F9F9F8C8C8C62666B7F7F7F7F7F7F7F7F7F7F7F7F808080808080808080808080808080 808080808080808080808080808080808080808080808080818181808080808080818181808080 808080808080808080818181808080808080818181808080808080808080808080818181808080 808080808080808080808080808080808080808080808080808080808080808080808080808080 7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E 5F63688585859B9B9BA7A7A7A8A8A8A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A6A6A6A6A6A6A6A6A6 A6A6A6A6A6A6A6A6A6A5A5A5A5A5A5A5A5A5A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A3A3A3 A3A3A3A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A1A1A1A1A1A1A1A1A1A1A1A1A0A0A0A0A0A0A0A0A0 9F9F9F9F9F9F9F9F9F9F9F9F9E9E9E9E9E9E9E9E9E9D9D9D9D9D9D9D9D9D9D9D9D9C9C9C9C9C9C 9C9C9C9C9C9C9B9B9B9B9B9B9B9B9B9A9A9A9A9A9A9A9A9A9A9A9A999999999999989898989898 989898979797979797979797979797979797969696969696969696969696959595959595959595 949494949494949494939393939393939393939393939393929292929292929292919191919191 9191919191919191919090909090909090909090908F8F8F8F8F8F8F8F8F8D8D8D858585747474 5256596A6A6A696969696969696969696969696969696969696969696969686868686868686868 6868686868686767676767676767676767676767676666661C242B1C242B1C242C0E1013030202 0606060606060000005C5B59F1F0EFF6F4F0F6F3EFF6F3EFF7F4F0F9F7F2CBC9C6939492848483 7273736061644F5154383B3E22262B1B1E23171A1F12161C0D0F13303133A3A5A7A3A3A3000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000636363282829AFAEAFB1B0B47A7A7E7A7A7C292A2D14161A 1A1D1F2225275151545B5B5E6463666F6F7279797C808081848485C4C2C0F9F6F2F7F4F0F6F3EF F6F3EFFEFBF7D2D0CD242323010101060606050303090A0A1B22291D252C1C242B676767676767 676767676767686868686868686868686868696969696969696969696969696969696969696969 6969696969696969696969696A6A6A53565B7373738585858E8E8E8F8F8F8F8F8F909090909090 909090909090919191919191919191929292929292929292929292939393939393939393939393 949494949494949494949494959595959595959595969696969696969696969696979797979797 9797979898989898989898989898989999999999999999999A9A9A9A9A9A9A9A9A9A9A9A9B9B9B 9B9B9B9B9B9B9C9C9C9C9C9C9C9C9C9C9C9C9D9D9D9D9D9D9D9D9D9D9D9D9E9E9E9E9E9E9E9E9E 9F9F9F9F9F9F9F9F9FA0A0A0A0A0A0A0A0A0A1A1A1A1A1A1A1A1A1A2A2A2A2A2A2A2A2A2A2A2A2 A2A2A2A3A3A3A3A3A3A3A3A3A3A3A3A4A4A4A4A4A4A4A4A4A4A4A4A5A5A5A5A5A5A5A5A5A6A6A6 A5A5A5A6A6A6A6A6A6A6A6A6A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A8A8A8A8A8A8A8A8A8 A9A9A9A8A8A8A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0A0A0 8E8E8E66696E808080808080808080808080808080808080808080818181808080818181818181 818181818181818181818181818181818181818181818181818181818181818181818181818181 818181818181818181818181818181818181818181818181818181818181818181818181818181 818181818181818181818181818181818181808080808080808080808080808080808080808080 8080807F7F7F8080807F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7E7E7E7E7E7E62666C898989 9D9D9DA8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A6A6A6A7A7A7 A6A6A6A6A6A6A6A6A6A5A5A5A5A5A5A5A5A5A5A5A5A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A3A3A3 A3A3A3A2A2A2A2A2A2A2A2A2A2A2A2A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A0A0A0A0A0A0A0A0A0 9F9F9F9F9F9F9F9F9F9F9F9F9E9E9E9E9E9E9E9E9E9D9D9D9D9D9D9D9D9D9C9C9C9D9D9D9C9C9C 9C9C9C9B9B9B9B9B9B9B9B9B9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A999999999999999999989898 989898989898979797979797979797979797969696969696969696959595959595959595949494 949494949494939393939393939393939393939393929292929292929292929292919191919191 9191919191919090909090909090908F8F8F8F8F8F8F8F8F8F8F8F86868676767655575B6A6A6A 696969696969696969696969696969696969696969696969696969696969686868686868686868 6868686767676767676767676767676767671C242B1C242B1C242C0E1013030202060606060606 0000005B5B59F0F0EFF6F4F0F6F3EFF6F3EFF7F4F0F9F7F2CAC9C79494948685867273735F6163 4F5154383B3F23262B1D2025171B2013161C0D0F152F3132A7A8A8A3A3A3000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000636362282829B0AFB0B3B3B47C7B7E78777A28282B14161A1B1D20222427 4F50545B5B5D6564666F6E7178797A7F807F848484C4C2C1F9F6F2F7F4F0F6F3EFF6F3EFFEFBF7 D1CFCC232322010101060606050303090A0A1B22291D252C1C242B676767676767686868686868 686868686868686868696969696969696969696969696969696969696969696969696969696969 6969696A6A6A6A6A6A56595C7575758686868F8F8F8F8F8F909090909090909090909090919191 919191919191919191929292929292929292939393939393939393939393949494949494949494 949494959595959595969696969696969696969696979797979797979797979797989898989898 9898989999999999999999999999999A9A9A9A9A9A9A9A9A9B9B9B9B9B9B9B9B9B9C9C9C9C9C9C 9C9C9C9C9C9C9C9C9C9D9D9D9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9F9F9F9F9F9F9F9F9F9F9F9F A0A0A0A0A0A0A0A0A0A1A1A1A1A1A1A1A1A1A2A2A2A2A2A2A2A2A2A2A2A2A3A3A3A3A3A3A3A3A3 A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A5A5A5A5A5A5A5A5A5A5A5A5A6A6A6A6A6A6A6A6A6A7A7A7 A7A7A7A7A7A7A7A7A7A7A7A7A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A9A9A9A9A9A9A9A9A9A9A9A9 A9A9A9A9A9A9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABABABABABABABABABA3A3A38F8F8F686B6F 818181808080818181818181818181818181818181818181818181818181818181818181818181 818181818181818181818181818181818181818181818181818181818181818181818181818181 818181818181818181818181818181818181818181818181818181818181818181818181818181 818181818181818181818181818181818181818181818181818181818181808080818181808080 8080808080808080808080808080807F7F7F7F7F7F7F7F7F7F7F7F65686E8A8A8A9E9E9EA9A9A9 A9A9A9A9A9A9A9A9A9A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7 A6A6A6A6A6A6A6A6A6A5A5A5A5A5A5A5A5A52C469C2C469B2C469BA4A4A4A4A4A4A3A3A3A3A3A3 A3A3A3A3A3A3A3A3A3A2A2A2A2A2A2A2A2A2A1A1A1A1A1A1A1A1A1A1A1A1A0A0A0A0A0A0A0A0A0 9F9F9F9F9F9F9F9F9F9E9E9E9E9E9E9E9E9E9D9D9D9D9D9D9D9D9D9D9D9D9C9C9C9C9C9C9C9C9C 9C9C9C9B9B9B9B9B9B9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A999999999999989898989898989898 989898979797979797979797969696969696969696969696959595959595959595949494949494 949494949494939393939393939393929292929292929292929292919191919191919191919191 9090909090909090909090908F8F8F8F8F8F8F8F8F88888878787857595C6A6A6A6A6A6A6A6A6A 696969696969696969696969696969696969696969686868696969686868686868686868686868 6767676767676767676767671C242B1C242B1C242C0E10130302020606060606060000005C5B59 F1F0EFF6F4F0F6F3EFF6F3EFF7F4F0F9F7F2CBC9C69595948687877273745E5F614F5152383B3E 22242B1D2025171C2014171D0D1013303335ADADADA6A4A4000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000636363262626AAAAABB3B3B47B7D7F797A7B28292A1316181B1E202224275051545B5A5D 6564676F6F7177777A7E7F7F848484C5C3C1F9F7F3F7F4F0F6F3EFF6F3EFFEFBF7D1CFCC232322 010101060606050303090A0A1B22291D252C1C242B676767676767686868686868686868686868 6969696969696969696969696969696969696969696969696969696969696A6A6A6A6A6A6A6A6A 6B6B6B575A5D7575758787878F8F8F909090909090909090909090919191919191919191929292 929292929292929292939393939393939393939393949494949494949494959595959595959595 959595969696969696969696969696979797979797979797989898989898989898999999999999 9999999999999A9A9A9A9A9A9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9C9C9C9C9C9C9C9C9C9D9D9D 9D9D9D9D9D9D9E9E9E9E9E9E9F9F9F9F9F9F9F9F9FA0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0 A1A1A1A1A1A1A1A1A1A2A2A2A2A2A2A3A3A3A3A3A3A3A3A3A4A4A4A3A3A3A4A4A4A4A4A4A4A4A4 A4A4A4A5A5A5A5A5A5A5A5A5A6A6A6A6A6A6A6A6A6A6A6A6A7A7A7A7A7A7A7A7A7A7A7A7A8A8A8 A8A8A8A8A8A8A8A8A8A8A8A8A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9AAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAABABABABABABABABABABABABACACACACACACA4A4A49090906A6C70818181818181 818181818181818181818181818181818181818181818181818181818181818181818181818181 818181818181828282828282828282828282828282828282828282828282828282828282828282 828282828282828282818181828282828282828282828282818181818181818181818181818181 818181818181818181818181818181818181818181818181818181818181818181818181808080 818181808080808080808080808080808080808080666A6E8B8B8B9F9F9FAAAAAAAAAAAAA9A9A9 A9A9A9A9A9A9A9A9A9A8A8A8A9A9A9A8A8A8A8A8A8A8A8A8A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7 A6A6A6A6A6A6A6A6A6A6A6A62B459D2A459C2A459CA5A5A5A4A4A4A4A4A4A4A4A4A3A3A3A3A3A3 A3A3A3A2A2A2A3A3A3A2A2A2A2A2A2A1A1A1A1A1A1A1A1A1A1A1A1A0A0A0A0A0A0A0A0A0A0A0A0 9F9F9F9F9F9F9F9F9F9E9E9E9E9E9E9E9E9E9D9D9D9D9D9D9D9D9D9D9D9D9C9C9C9C9C9C9B9B9B 9C9C9C9B9B9B9B9B9B9A9A9A9A9A9A9A9A9A9A9A9A999999999999989898989898989898989898 979797979797979797969696979797969696969696959595959595959595949494949494949494 949494939393939393939393929292939393929292929292929292919191919191909090909090 9090909090909090909090908F8F8F888888787878585A5D6A6A6A6A6A6A6A6A6A6A6A6A696969 696969696969696969696969696969696969696969686868686868686868686868686868676767 6767676767671C242B1C242B1C242C0E10130302020606060606060000005C5B59F1F0EFF6F4F0 F6F3EFF6F3EFF7F4F0F9F7F2CBC9C79594948687867272725F60624F5053383A3E2224291D1F24 17181F12151C0B0F122E3132A9AAABA6A4A4000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000646464 252425A8A7A8B8B9BA7B7B7E79787B29292B131618191B1E2023265051535A5A5C6565676F6E71 7776787E7E7F848385C5C3C1F9F7F3F7F4F0F6F3EFF6F3EFFEFBF7D1CFCC232322010101060606 050303090A0A1B22291D252C1C242B676767686868686868686868686868696969696969696969 6969696969696969696969696969696969696969696A6A6A6A6A6A6A6A6A6A6A6A6B6B6B575A5D 757575878787909090909090909090909090909090919191919191929292929292929292929292 939393939393939393939393949494949494959595959595959595959595959595969696969696 9696969696969797979797979797979898989898989999999999999999999A9A9A9A9A9A9A9A9A 9A9A9A9B9B9B9B9B9B9B9B9B9B9B9B9C9C9C9C9C9C9C9C9C9D9D9D9D9D9D9D9D9D9E9E9E9E9E9E 9E9E9E9E9E9E9F9F9F9F9F9FA0A0A0A0A0A0A0A0A0A0A0A0A1A1A1A1A1A1A1A1A1A1A1A1A2A2A2 A2A2A2A2A2A2A3A3A3A3A3A3A3A3A3A3A3A3A4A4A4A4A4A4A4A4A4A4A4A4A5A5A5A5A5A5A5A5A5 A6A6A6A6A6A6A6A6A6A7A7A7A7A7A7A7A7A7A7A7A7A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A9A9A9 A9A9A9A9A9A9A9A9A9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABABABABABABABABABABABABABABAB ABABABACACACACACACACACACACACACACACACA4A4A49191916B6E72818181818181818181818181 818181818181828282818181828282828282828282828282828282828282828282828282828282 828282828282838383828282828282838383838383838383838383838383828282828282828282 828282828282828282828282828282828282828282828282828282828282828282828282828282 828282818181818181818181818181818181818181818181818181818181818181818181818181 818181808080818181818181808080686B6F8C8C8CA0A0A0ABABABABABABAAAAAAAAAAAAAAAAAA AAAAAAA9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A8A8A8A8A8A8A8A8A8A7A7A7A7A7A7A7A7A7A7A7A7 A7A7A7A6A6A62B459D2B459D2A459CA5A5A5A5A5A5A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4 A3A3A3A3A3A3A2A2A2A2A2A2A2A2A2A2A2A2A1A1A1A1A1A1A0A0A0A0A0A0A0A0A0A0A0A09F9F9F 9F9F9F9F9F9F9F9F9F9E9E9E9E9E9E9E9E9E9D9D9D9D9D9D9C9C9C9D9D9D9C9C9C9C9C9C9C9C9C 9B9B9B9B9B9B9A9A9A9A9A9A9A9A9A9A9A9A999999999999999999999999989898989898989898 979797979797979797969696969696969696959595959595959595959595959595949494949494 939393939393939393939393929292929292929292919191919191919191919191909090909090 909090909090909090888888787878585B5E6A6A6A6A6A6A6A6A6A6A6A6A696969696969696969 696969696969696969696969696969696969686868686868686868686868686868676767676767 1C242B1C242B1C242C0E10130302020606060606060000005E5C5BF1F1EFF6F4F0F6F3EFF6F3EF F7F4F0F9F6F3C9C8C69595948786857273755F606250515337393E23262B1D1F2418192112151C 0B0D10303433AAADADA4A4A3000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000646464252425A5A3A4 B6B5B77D7D8078787926272915161A191B1D21232550515359595B6564656F6E707676787D7D7F 838384C4C2C1F9F6F3F7F4F0F6F3EFF6F3EFFEFBF7D1CFCC232322010101060606050303090A0A 1B22291D252C1C242B676767686868686868686868696969696969696969696969696969696969 6969696969696969696969696A6A6A6A6A6A6A6A6A6A6A6A6B6B6B6B6B6B585B5D757575878787 909090909090909090919191919191919191929292929292929292939393939393939393939393 949494949494949494959595959595959595959595959595969696969696979797979797979797 9797979898989898989898989999999999999999999999999A9A9A9A9A9A9A9A9A9B9B9B9B9B9B 9B9B9B9C9C9C9C9C9C9C9C9C9C9C9C9D9D9D9D9D9D9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9F9F9F 9F9F9F9F9F9FA0A0A0A0A0A0A0A0A0A1A1A1A1A1A1A1A1A1A2A2A2A2A2A2A2A2A2A3A3A3A3A3A3 A3A3A3A3A3A3A4A4A4A4A4A4A4A4A4A4A4A4A5A5A5A5A5A5A6A6A6A6A6A6A6A6A6A7A7A7A7A7A7 A7A7A7A7A7A7A7A7A7A7A7A7A8A8A8A8A8A8A9A9A9A9A9A9A9A9A9A9A9A9A8A8A8878787727272 A1A1A1AAAAAAAAAAAAABABABABABABABABABABABABA6A6A68282827A7A7AA5A5A5ACACACACACAC ACACACADADADADADADADADADA5A5A59191916C6E72828282828282828282828282828282828282 828282828282828282838383828282828282838383838383838383838383838383838383838383 838383838383838383838383838383838383838383838383838383838383838383838383838383 838383838383838383838383838383838383828282838383828282828282838383828282828282 828282828282828282828282828282828282818181818181818181818181818181818181818181 818181818181818181696C708D8D8DA1A1A1ABABABABABABABABABABABABAAAAAAA5A5A5808080 797979A2A2A2AAAAAAA9A9A9A9A9A9A9A9A9A8A8A8A8A8A88B8B8B7E7E7E7E7E7E7E7E7E8A8A8A 2B459D2B459D2B459DA6A6A6A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A4A4A4A4A4A4A4A4A4A4A4A4 A3A3A3A3A3A3A2A2A2A2A2A2A2A2A2A1A1A1A1A1A1A1A1A1A0A0A0A0A0A0A0A0A09F9F9F9F9F9F 9F9F9F9F9F9F9E9E9E9E9E9E9E9E9E9E9E9E9D9D9D9D9D9D9C9C9C9C9C9C9C9C9C9C9C9C9B9B9B 9B9B9B9B9B9B9A9A9A9A9A9A9A9A9A999999999999999999999999989898989898979797979797 979797979797979797969696969696959595959595959595959595949494949494949494949494 939393939393939393929292929292929292919191919191919191919191909090909090909090 8F8F8F888888787878595B5E6B6B6B6A6A6A6A6A6A6A6A6A696969696969696969696969696969 6969696969696969696969696868686868686868686868686868686868686767671C242B1C242B 1C242C0E1013030202060606060606000000615F5DF2F1F0F6F4F0F6F3EFF6F3EFF7F4F0FAF7F3 CAC9C6959494878687757576606164505154383B3F22262B1B1F25191A2212161D0B0D102B2F2E A9ACABA6A6A4000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000646464222324A3A2A3B7B5B77B7C7F 78787926272915171A1A1B1E21232650515459595B6463656E6D6F7676777D7D7F838384C4C3C1 F9F7F3F7F4F0F6F3EFF6F3EFFEFBF7D0CDCA222121010101060606050303090A0A1B22291D252C 1C242B686868686868686868686868696969696969696969696969696969696969696969696969 6969696A6A6A6A6A6A6A6A6A6B6B6B6B6B6B6B6B6B6B6B6B595B5E757575878787909090909090 919191919191919191919191929292929292929292939393939393939393939393949494949494 949494949494959595959595959595969696969696979797979797979797989898989898989898 9898989898989999999999999A9A9A9A9A9A9A9A9A9A9A9A9B9B9B9B9B9B9C9C9C9B9B9B9C9C9C 9C9C9C9C9C9C9D9D9D9D9D9D9D9D9D9E9E9E9E9E9E9E9E9E9F9F9F9F9F9F9F9F9FA0A0A0A0A0A0 A0A0A0A1A1A1A1A1A1A1A1A1A2A2A2A2A2A2A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A4A4A4A4A4A4 A4A4A4A5A5A5A5A5A5A5A5A5A5A5A5A6A6A6A6A6A6A6A6A6A6A6A6A7A7A7A7A7A7A7A7A7A8A8A8 A8A8A8A8A8A8A8A8A8A9A9A9A9A9A9A9A9A9A9A9A9AAAAAA4545451616163333330A0A0A616161 ABABABABABABABABABACACACA8A8A82F2F2F1D1D1D2E2E2E080808878787ADADADADADADADADAD ADADADAEAEAEA6A6A69292926C6F72828282828282838383838383838383838383838383838383 838383838383838383838383838383838383848484848484838383848484848484848484848484 848484848484848484848484848484848484848484848484848484848484848484848484838383 848484848484838383838383838383838383838383838383838383838383838383828282838383 828282828282828282828282828282828282828282828282818181818181818181818181818181 8181816A6D728D8D8DA1A1A1ACACACACACACABABABABABABA7A7A72F2F2F1D1D1D2D2D2D070707 838383AAAAAAA9A9A9A9A9A9A9A9A9A8A8A82828281111111313131313134040402B469E2B469E 2B469EA7A7A7A6A6A6A6A6A6A5A5A5A5A5A5A5A5A5A5A5A5A4A4A4A4A4A4A4A4A4A4A4A4A3A3A3 A3A3A3A3A3A3A2A2A2A2A2A2A2A2A2A1A1A1A1A1A1A1A1A1A1A1A1A0A0A0A0A0A09F9F9F9F9F9F 9F9F9F9F9F9F9E9E9E9E9E9E9D9D9D9D9D9D9D9D9D9D9D9D9C9C9C9C9C9C9B9B9B9B9B9B9B9B9B 9B9B9B9A9A9A9A9A9A9A9A9A9A9A9A999999999999999999989898989898989898979797979797 979797979797969696969696969696959595959595949494949494949494939393939393939393 939393939393929292929292929292919191919191919191919191919191909090909090898989 787878595B5E6B6B6B6A6A6A6B6B6B6A6A6A6A6A6A6A6A6A696969696969696969696969696969 6969696969696969696868686868686868686868686868686868681C242B1C242B1C242C0E1013 030202060606060606000000615F5DF2F1F0F6F4F0F6F3EFF6F3EFF7F4F0FAF7F3CAC8C6949393 8786877474755F6264505356383B3F22252A1E2026191C2212161C0C0D122D302EA8A8A8A7A7A6 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 0000000000000000000000000000000000006464642121229E9FA0B9B9BA7B7A7D78787A262628 1416191A1B1F2223274F50535A5A5C6564666E6D6E7575767C7C7F828284C3C2C1F9F6F3F7F4F0 F6F3EFF5F2EFFEFBF7CFCDC9222120010102060606050303090A0A1B22291D252C1C242B686868 6868686868686969696868686969696969696969696969696969696969696969696A6A6A6A6A6A 6A6A6A6A6A6A6B6B6B6B6B6B6B6B6B6C6C6C5A5C5F767676878787919191919191919191919191 929292929292929292929292939393939393939393939393939393949494949494959595959595 959595959595969696969696969696979797979797989898989898989898989898989898999999 9999999999999A9A9A9A9A9A9B9B9B9B9B9B9B9B9B9B9B9B9C9C9C9C9C9C9C9C9C9D9D9D9D9D9D 9E9E9E9E9E9E9E9E9E9E9E9E9F9F9F9F9F9F9F9F9FA0A0A0A0A0A0A0A0A0A1A1A1A1A1A1A1A1A1 A1A1A1A2A2A2A2A2A2A2A2A2A3A3A3A3A3A3A3A3A3A4A4A4A4A4A4A4A4A4A5A5A5A5A5A5A5A5A5 A5A5A5A6A6A6A6A6A6A6A6A6A7A7A7A7A7A7A7A7A7A7A7A7A8A8A8A8A8A8A8A8A8A8A8A8A9A9A9 A9A9A9A9A9A9AAAAAAAAAAAAAAAAAA949494070707929292A9A9A96B6B6B171717ACACACACACAC ACACACADADAD838383161616A2A2A2ABABAB4A4A4A4A4A4AAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE A6A6A69393936E7073838383838383838383848484838383838383838383848484848484848484 848484848484848484848484848484848484848484848484848484848484848484848484848484 8484848484848484848484848484842F2F2F2D2D2D737373848484848484848484848484848484 848484848484848484848484848484848484848484848484838383838383838383838383838383 8383838383838282828383838282828282828282828282828282828282828181818181816B6E72 8E8E8EA2A2A2ACACACADADADACACACACACAC828282161616A2A2A2A9A9A9494949494949AAAAAA AAAAAAAAAAAAAAAAAAA9A9A91010109F9F9FA7A7A7A6A6A6A6A6A62B469F2B469E2B469EA7A7A7 A7A7A7A6A6A6A6A6A6A6A6A6A5A5A5A5A5A5A5A5A5A5A5A5A4A4A4A4A4A4A4A4A4A4A4A4A3A3A3 A3A3A3A3A3A3A2A2A2A2A2A2A1A1A1A1A1A1A1A1A1A0A0A0A0A0A0A0A0A09F9F9F9F9F9F9F9F9F 9F9F9F9F9F9F9E9E9E9E9E9E9E9E9E9D9D9D9D9D9D9D9D9D9C9C9C9C9C9C9B9B9B9B9B9B9B9B9B 9A9A9A9A9A9A9A9A9A9A9A9A999999999999989898989898989898989898979797979797979797 969696969696969696969696959595959595959595949494949494939393939393939393939393 9393939292929292929292929292929191919191919191919090909090908989897979795B5C5F 6B6B6B6B6B6B6B6B6B6A6A6A6A6A6A6A6A6A6A6A6A696969696969696969696969696969696969 6969696969696969696868686868686868686868681C242B1C242B1C242C0E1013030202060606 060606000000605E5DF1F1F0F6F4F0F6F3EFF6F3EFF7F4F0F9F7F3CAC8C6949493858585727273 5F6262505356383A3F22262A1E2025181A2214171D0D0F142F3031A8A8A8A4A4A6000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000646464212021A2A1A3BCBABB7A787D767678272728141618191A1F 2123264F5053595A5C6564666E6D6E7574767C7B7D828182C4C1C0F9F6F2F7F4F0F6F3EFF5F2EF FEFBF7CFCDC9212120010102060606050303090A0A1B22291D252C1C242B686868686868696969 6969696969696969696969696969696969696969696969696969696A6A6A6A6A6A6B6B6B6B6B6B 6B6B6B6B6B6B6C6C6C6B6B6B5B5C5F767676878787919191919191919191919191929292929292 929292929292939393939393939393949494949494959595959595959595959595969696969696 9696969696969797979797979797979898989898989898989999999999999999999A9A9A9A9A9A 9A9A9A9B9B9B9B9B9B9B9B9B9C9C9C9C9C9C9C9C9C9D9D9D9D9D9D9D9D9D9E9E9E9E9E9E9E9E9E 9E9E9E9F9F9FA0A0A09F9F9FA0A0A0A0A0A0A1A1A1A1A1A1A1A1A1A1A1A1A2A2A2A2A2A2A3A3A3 A3A3A3A3A3A3A3A3A3A4A4A4A4A4A4A4A4A4A5A5A5A5A5A5A6A6A6A5A5A5A6A6A6A6A6A6A6A6A6 A7A7A7A7A7A7A7A7A7A7A7A7A8A8A8A8A8A8A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9AAAAAAAAAAAA AAAAAAAAAAAAABABAB7676762F2F2FAAAAAAACACAC9C9C9C0000009E9E9EACACACADADADADADAD 7676765B5B5BABABABAEAEAE626262303030AEAEAEAEAEAEAFAFAFAFAFAFAFAFAFA7A7A7939393 6F7174848484848484848484848484848484848484848484848484848484848484848484848484 848484848484848484848484848484848484848484848484848484848484848484848484848484 8484848484848484840404040101016B6B6B848484848484848484848484848484848484848484 848484848484848484848484848484848484848484848484848484848484848484848484848484 8383838383838383838383838383838383838282828282828282828282826C6F738E8E8EA3A3A3 ADADADADADADADADADADADAD7676765A5A5AACACACACACAC616161303030ABABABABABABABABAB AAAAAAA2A2A2121212AAAAAAA7A7A7A9A9A9A9A9A92B47A02B469F2B469FA8A8A8A7A7A7A7A7A7 A7A7A7A6A6A6A6A6A6A6A6A6A5A5A5A5A5A5A5A5A5A4A4A4A4A4A4A4A4A4A4A4A4A3A3A3A3A3A3 A3A3A3A3A3A3A2A2A2A2A2A2A1A1A1A1A1A1A1A1A1A1A1A1A0A0A0A0A0A0A0A0A09F9F9F9F9F9F 9F9F9F9E9E9E9E9E9E9E9E9E9D9D9D9D9D9D9D9D9D9C9C9C9C9C9C9C9C9C9B9B9B9B9B9B9B9B9B 9A9A9A9A9A9A9A9A9A9A9A9A999999999999989898989898989898979797979797979797979797 969696969696969696969696959595959595949494949494949494939393939393939393939393 9292929292929292929191919191919191919191919191918989897979795A5C5F6B6B6B6B6B6B 6B6B6B6B6B6B6A6A6A6A6A6A6A6A6A696969696969696969696969696969696969696969696969 6969696969696969696868686868681C242B1C242B1C242C0E1013030202060606060606000000 615F5DF2F1F0F6F4F0F6F3EFF6F3EFF7F4F0F9F7F3CAC8C6939392848483717271606263505253 383A3E22262B1D1F24181B2011151B0B0D102F3133A9ABACA3A4A3000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 0000000000005F5F60201F20ADADADB8B6BA7B7C7F777778262629141519171A1D222527505254 5A595D6565676E6E707675777C7B7C818081C4C2C1FAF7F3F7F4F0F6F3EFF5F2EFFEFBF7CFCDC9 212120010102060606050303090A0A1B22291D252C1C242B686868686868696969696969696969 6969696969696969696969696969696A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6B6B6B6B6B6B6C6C6C 6C6C6C6C6C6C5C5D60777777888888919191919191919191929292929292929292929292939393 939393939393949494949494959595959595959595959595969696969696969696979797979797 9797979797979898989898989898989999999999999999999A9A9A9A9A9A9B9B9B9B9B9B9B9B9B 9B9B9B9C9C9C9C9C9C9C9C9C9C9C9C9D9D9D9D9D9D9E9E9E9E9E9E9E9E9E9F9F9F9F9F9F9F9F9F A0A0A0A0A0A0A0A0A0A1A1A1A1A1A1A1A1A1A2A2A2A2A2A2A2A2A2A2A2A2A3A3A3A3A3A3A4A4A4 A4A4A4A4A4A4A5A5A5A5A5A5A5A5A5A5A5A5A6A6A6A6A6A6A6A6A6A6A6A6A7A7A7A7A7A7A8A8A8 A8A8A8A8A8A8A8A8A8A9A9A9A9A9A9A9A9A9AAAAAAAAAAAAAAAAAAAAAAAAABABABABABABABABAB ABABABABABABAAAAAAACACACABABAB5151512D2D2DADADADADADADAEAEAEAEAEAEADADADADADAD 8D8D8D525252131313828282AFAFAFAFAFAFB0B0B0B0B0B0B0B0B0A8A8A8949494707275848484 848484848484848484848484848484848484848484848484848484858585858585848484858585 858585858585858585858585858585858585858585858585858585858585858585858585858585 8585850303030000006B6B6B858585858585858585858585858585858585858585848484848484 848484848484848484848484848484848484848484848484848484848484848484848484848484 8484848383838484848383838383838383838383838282826E70748E8E8EA3A3A3AEAEAEAEAEAE ADADADADADADACACACACACAC8C8C8C5151511313137E7E7EACACACACACACABABABABABAB8E8E8E 0C0C0C1D1D1D1616163939398686862B47A02B469F2B469FA8A8A8A8A8A8A7A7A7A7A7A7A7A7A7 A7A7A7A6A6A6A6A6A6A6A6A6A5A5A5A5A5A5A5A5A5A5A5A5A4A4A4A3A3A3A3A3A3A3A3A3A3A3A3 A3A3A3A2A2A2A2A2A2A2A2A2A1A1A1A1A1A1A1A1A1A0A0A0A0A0A0A0A0A0A0A0A09F9F9F9E9E9E 9E9E9E9E9E9E9E9E9E9D9D9D9D9D9D9D9D9D9C9C9C9C9C9C9C9C9C9B9B9B9B9B9B9B9B9B9A9A9A 9A9A9A9A9A9A999999999999999999989898989898989898989898979797979797979797969696 969696969696959595959595959595959595949494949494939393939393939393939393939393 9292929292929292929191919191919191918989897979795B5D606C6C6C6B6B6B6B6B6B6B6B6B 6A6A6A6A6A6A6A6A6A6A6A6A696969696969696969696969696969696969696969696969686868 6868686868686868681C242B1C242B1C242C0E1013030202060606060606000000615E5DF2F1F0 F6F4F0F6F3EFF6F3EFF7F4F0F9F7F2C9C8C6939292848483727373606263515255393C3F22252A 1D1F25171A2011151B0B0D102C2E30A4A6A7A4A4A4000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 5A5A5A1C1C1DB5B5B5B5B6B87C7D8177777825262815161917181C2224285152555A5A5D656467 6E6E707575777B7B7C808081C5C2C0FAF7F3F7F4F0F6F3EFF5F2EEFEFBF7CFCDC9222120010102 060606050303090A0A1B22291D252C1C242B686868696969696969696969696969696969696969 6969696969696A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6B6B6B6B6B6B6B6B6B6C6C6C6C6C6C6C6C6C 5C5D60767676888888919191919191929292929292939393939393939393939393949494949494 949494959595959595959595959595959595969696979797969696979797979797979797989898 9898989999999999999999999999999A9A9A9A9A9A9B9B9B9B9B9B9B9B9B9B9B9B9C9C9C9C9C9C 9C9C9C9C9C9C9D9D9D9D9D9D9E9E9E9E9E9E9F9F9F9F9F9F9F9F9F9F9F9FA0A0A0A0A0A0A0A0A0 A1A1A1A1A1A1A1A1A1A2A2A2A2A2A2A2A2A2A3A3A3A3A3A3A3A3A3A4A4A4A4A4A4A4A4A4A5A5A5 A5A5A5A5A5A5A5A5A5A6A6A6A6A6A6A6A6A6A7A7A7A7A7A7A7A7A7A8A8A8A8A8A8A8A8A8A8A8A8 A9A9A9A9A9A9AAAAAAAAAAAAAAAAAAAAAAAAABABABABABABABABABACACACACACACACACACACACAC ACACAC868686282828363636989898AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAFAFAF9595955E5E5E 2525253F3F3FB0B0B0B0B0B0B0B0B0B0B0B0B1B1B1A8A8A8949494717376848484848484848484 848484858585858585858585858585858585858585858585858585858585858585858585858585 868686858585868686868686868686868686868686858585707070505050505050505050010101 000000404040505050505050656565858585868686858585858585868686858585858585858585 858585858585848484858585848484858585848484848484848484848484848484848484848484 8484848484848484848484848383838383836E71748F8F8FA4A4A4AFAFAFAEAEAEAEAEAEAEAEAE AEAEAEADADAD9393935D5D5D2424243E3E3EACACACACACACACACACABABAB939393595959A3A3A3 A6A6A65959591010102C47A12B47A02B47A0A9A9A9A8A8A8A8A8A8A8A8A8A7A7A7A7A7A7A7A7A7 A7A7A7A6A6A6A6A6A6A5A5A5A5A5A5A5A5A5A5A5A5A4A4A4A4A4A4A4A4A4A3A3A3A3A3A3A3A3A3 A3A3A3A2A2A2A2A2A2A1A1A1A1A1A1A1A1A1A0A0A0A0A0A0A0A0A0A0A0A09F9F9F9F9F9F9F9F9F 9E9E9E9E9E9E9D9D9D9D9D9D9D9D9D9D9D9D9C9C9C9C9C9C9B9B9B9B9B9B9B9B9B9A9A9A9A9A9A 9A9A9A9A9A9A999999999999999999989898989898979797979797979797979797969696969696 959595959595959595959595959595949494949494939393939393939393939393939393929292 9292929191919191919191918A8A8A7979795C5E606C6C6C6B6B6B6B6B6B6B6B6B6B6B6B6A6A6A 6A6A6A6A6A6A6A6A6A696969696969696969696969696969696969696969696969696969686868 6868681C242B1C242B1C242C0E101303020206060606060600000061605DF2F2F0F6F4F0F6F3EF F6F3EFF7F4F0F9F6F2C9C7C5939392858484737576606363505355383B3F22252A1B1F26171A21 13161D0B0D122F3232A8ACABA6A4A6000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 0000000000000000000000000000000000000000000000000000000000000000004B4C4C1A1A1A B7B7B7B8B7BA7F7F8276757725262715161A18191D2224275252555B595D6464686E6E71767577 7B7A7C808081C5C2C0FAF7F3F7F4F0F6F3EFF5F2EEFFFCF8CDCCC8212020010201060606050303 090A0A1B22291D252C1C242B696969696969696969696969696969696969696969696969696969 6A6A6A6A6A6A6A6A6A6A6A6A6B6B6B6B6B6B6B6B6B6B6B6B6C6C6C6C6C6C6C6C6C5D5E61777777 888888919191929292929292929292939393939393939393939393949494949494959595959595 959595959595959595969696969696969696979797979797979797989898989898999999999999 9999999A9A9A9A9A9A9A9A9A9B9B9B9B9B9B9B9B9B9C9C9C9C9C9C9C9C9C9D9D9D9D9D9D9D9D9D 9E9E9E9E9E9E9E9E9E9F9F9F9F9F9F9F9F9FA0A0A0A0A0A0A0A0A0A0A0A0A1A1A1A1A1A1A1A1A1 A2A2A2A2A2A2A3A3A3A3A3A3A3A3A3A4A4A4A4A4A4A4A4A4A5A5A5A5A5A5A5A5A5A6A6A6A6A6A6 A6A6A6A7A7A7A7A7A7A7A7A7A7A7A7A8A8A8A8A8A8A8A8A8A9A9A9A9A9A9A9A9A9AAAAAAAAAAAA AAAAAAAAAAAAABABABABABABABABABACACACACACACACACACADADADADADADADADAD656565222222 818181AEAEAEAEAEAEAEAEAEAEAEAEAFAFAFAFAFAF7D7D7D8B8B8BAFAFAFB0B0B0979797000000 A6A6A6B1B1B1B1B1B1B1B1B1B1B1B1A8A8A8959595727477848484858585858585858585858585 858585858585858585868686868686868686868686868686868686868686868686868686868686 868686878787868686868686868686878787515151000000000000000000000000000000000000 000000000000353535868686868686868686868686868686868686868686868686868686868686 868686858585858585858585858585858585858585848484858585848484848484848484848484 848484848484848484848484707276909090A5A5A5AFAFAFAFAFAFAFAFAFAEAEAE7E7E7E8A8A8A AEAEAEADADAD949494030303A2A2A2ADADADACACACACACACA7A7A7A7A7A7ABABABABABAB9E9E9E 0404042C47A12C47A12B47A0A9A9A9A9A9A9A9A9A9A8A8A8A8A8A8A8A8A8A7A7A7A7A7A7A7A7A7 A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A5A5A5A4A4A4A4A4A4A4A4A4A4A4A4A3A3A3A3A3A3A3A3A3 A2A2A2A2A2A2A2A2A2A1A1A1A1A1A1A1A1A1A0A0A0A0A0A0A0A0A09F9F9F9F9F9F9F9F9F9E9E9E 9E9E9E9D9D9D9D9D9D9D9D9D9D9D9D9C9C9C9C9C9C9C9C9C9B9B9B9B9B9B9B9B9B9A9A9A9A9A9A 999999999999999999989898989898989898989898979797979797979797969696969696969696 959595959595959595949494949494949494939393939393939393939393929292929292919191 9292929191918A8A8A7A7A7A5C5E616C6C6C6C6C6C6C6C6C6B6B6B6B6B6B6B6B6B6B6B6B6A6A6A 6A6A6A6A6A6A6A6A6A6969696969696969696969696969696969696969696969696969691C242B 1C242B1C242C0E1013030202060606060606000000636160F2F2F1F6F4F0F6F3EFF6F3EFF7F4F0 F9F6F2C9C6C5949293878686757576616363515353393C3E22252A1D2025181B2012151B0D0F13 353738A9ABACA6A6A4000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000343337242425C9C8CAB0AFB3 7D7E8174747523242714161A191B1E2325295354575C5C5F6464676D6D707676777B7B7C807F80 C4C2C0FAF7F3F7F4F0F6F3EFF5F2EEFFFCF8CDCBC8212020010201060606050303090A0A1B2229 1D252C1C242B6969696969696969696969696969696969696969696969696A6A6A6A6A6A6A6A6A 6B6B6B6B6B6B6B6B6B6B6B6B6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C5D5F62777777888888919191 929292929292939393939393939393939393949494949494949494959595959595959595969696 9696969696969696969797979797979898989898989898989999999999999999999999999A9A9A 9A9A9A9B9B9B9B9B9B9B9B9B9C9C9C9C9C9C9C9C9C9C9C9C9D9D9D9D9D9D9E9E9E9E9E9E9E9E9E 9F9F9F9F9F9F9F9F9FA0A0A0A0A0A0A0A0A0A1A1A1A1A1A1A2A2A2A2A2A2A2A2A2A3A3A3A3A3A3 A3A3A3A3A3A3A4A4A4A4A4A4A4A4A4A5A5A5A5A5A5A6A6A6A6A6A6A6A6A6A7A7A7A7A7A7A7A7A7 A7A7A7A8A8A8A8A8A8A8A8A8A9A9A9A9A9A9AAAAAAAAAAAAAAAAAAAAAAAAABABABABABABABABAB ABABABACACACACACACACACACACACACACACACADADADADADAD858585181818A2A2A2ADADADAFAFAF AFAFAFAFAFAFA1A1A1878787B0B0B06F6F6F303030A3A3A3B1B1B1717171252525B1B1B1B1B1B1 B1B1B1B1B1B1B2B2B2A9A9A9959595737578858585868686868686868686868686868686868686 868686868686878787878787878787878787878787878787878787878787878787878787878787 8787878787878787878787876363632C2C2C2C2C2C2C2C2C0000000000002323232C2C2C2C2C2C 505050878787878787878787878787878787868686878787878787868686868686868686868686 868686868686868686868686868686868686858585858585858585848484848484848484848484 848484848484707376909090A5A5A5B0B0B0B0B0B0B0B0B0B0B0B06F6F6F303030A3A3A3AFAFAF 6F6F6F262626ADADAD9F9F9F848484ADADAD7676761D1D1DA5A5A5ACACAC6262622D2D2D2C47A2 2C47A22C47A1AAAAAAAAAAAAA9A9A9A9A9A9A8A8A8A8A8A8A8A8A8A7A7A7A7A7A7A7A7A7A7A7A7 A7A7A7A6A6A6A6A6A6A6A6A6A5A5A5A5A5A5A4A4A4A4A4A4A4A4A4A3A3A3A3A3A3A3A3A3A2A2A2 A2A2A2A2A2A2A1A1A1A1A1A1A1A1A1A0A0A0A0A0A0A0A0A09F9F9F9F9F9F9E9E9E9E9E9E9E9E9E 9E9E9E9D9D9D9D9D9D9C9C9C9C9C9C9C9C9C9C9C9C9B9B9B9B9B9B9B9B9B9A9A9A9A9A9A999999 999999999999999999989898989898989898979797979797969696979797969696969696959595 959595959595959595949494949494939393939393939393939393929292929292929292919191 8A8A8A7A7A7A5E5F626C6C6C6C6C6C6C6C6C6B6B6B6B6B6B6B6B6B6B6B6B6A6A6A6A6A6A6A6A6A 6A6A6A6969696969696969696969696969696969696969696969696868681C242B1C242B1C242C 0E1013030202060606060606000000636260F2F2F1F6F4F0F6F3EFF6F3EFF7F4F0F9F6F2C9C7C5 929291868685747475606263515355393B3F22262B1E2025191D2312161C0D0F122F3233AAABAC A6A6A4000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 00000000000000000000000000000000000000000016161A272727CECDCDB1AFB27E7F81737374 242325151619181B1E2426295455585D5D606464676C6D6F7675777B7A7C7F8080C4C2C0FAF7F3 F7F4F0F6F3EFF5F2EEFFFCF8CDCBC8212020010201060606050303090A0A1B22291D252C1C242B 6969696969696969696969696969696969696969696969696A6A6A6A6A6A6A6A6A6A6A6A6B6B6B 6B6B6B6B6B6B6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C5D5F62787878898989929292929292939393 939393939393939393949494949494949494959595959595959595969696969696979797979797 9797979797979898989898989898989898989999999999999999999A9A9A9A9A9A9B9B9B9B9B9B 9B9B9B9B9B9B9C9C9C9C9C9C9D9D9D9D9D9D9D9D9D9E9E9E9E9E9E9E9E9E9F9F9F9F9F9F9F9F9F A0A0A0A0A0A0A0A0A0A1A1A1A1A1A1A1A1A1A2A2A2A2A2A2A3A3A3A3A3A3A3A3A3A4A4A4A4A4A4 A4A4A4A5A5A5A5A5A5A5A5A5A5A5A5A6A6A6A6A6A6A7A7A7A7A7A7A7A7A7A7A7A7A8A8A8A8A8A8 A9A9A9A9A9A9A9A9A9A9A9A9AAAAAAAAAAAAAAAAAAABABABABABABACACACACACACACACACACACAC ADADADADADADADADADADADADAEAEAEAEAEAE575757000000030303030303030303030303989898 7B7B7B101010B0B0B0A7A7A72727270A0A0A1D1D1D2A2A2A858585B2B2B2B2B2B2B2B2B2B2B2B2 B2B2B2AAAAAA969696747678868686868686868686868686868686878787878787878787878787 878787878787878787878787878787878787878787878787878787878787878787878787878787 8787878787878686868686868686868686860303030000006C6C6C868686868686868686878787 878787878787878787878787878787878787878787878787878787878787878787868686878787 868686868686868686868686868686868686858585858585858585858585858585848484858585 727478919191A5A5A5B1B1B1B0B0B0B0B0B0B0B0B0A7A7A72727270909091D1D1D2A2A2A828282 AEAEAE797979101010ADADADACACAC3B3B3B1C1C1C1B1B1B1313138484842C48A32C47A22C47A2 AAAAAAAAAAAAAAAAAAAAAAAAA9A9A9A9A9A9A9A9A9A8A8A8A8A8A8A8A8A8A7A7A7A7A7A7A7A7A7 A6A6A6A6A6A6A5A5A5A5A5A5A5A5A5A5A5A5A4A4A4A4A4A4A4A4A4A3A3A3A3A3A3A3A3A3A2A2A2 A2A2A2A1A1A1A1A1A1A1A1A1A1A1A1A0A0A0A0A0A09F9F9F9F9F9F9F9F9F9F9F9F9E9E9E9D9D9D 9D9D9D9D9D9D9C9C9C9C9C9C9C9C9C9B9B9B9B9B9B9B9B9B9B9B9B9A9A9A9A9A9A9A9A9A999999 999999989898989898989898979797979797979797979797979797969696969696959595959595 9595959595959494949494949393939393939393939292929292929292929292928A8A8A7A7A7A 5E5F626C6C6C6C6C6C6C6C6C6C6C6C6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6A6A6A6A6A6A696969 6A6A6A6969696969696969696969696969696969696969691C242B1C242B1C242C0E1013030202 060606060606000000636260F2F2F1F6F4F0F6F3EFF6F3EFF7F4F0F9F6F2C9C7C5939392858686 747575616363525355393B3F2123281B1E2316191E12151C0B0F142D3032AAABACA7A7A7000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 0000000000000000000000000000000000000C0C0CCCCCCBB3B2B27D7D8173737424252615161A 191B1F2325295455585D5C606464676D6D6F7575767A7A7B7F7F7FC4C2C0FAF7F3F7F4F0F6F3EF F5F2EEFFFCF8CDCCC8212020010201060606050303090A0A1B22291D252C1C242B696969696969 6969696969696969696969696A6A6A6A6A6A6A6A6A6A6A6A6B6B6B6B6B6B6B6B6B6C6C6C6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C5D5F62787878898989929292939393939393939393949494 949494949494949494959595959595959595969696969696979797979797979797979797979797 9898989898989999999999999999999A9A9A9A9A9A9A9A9A9B9B9B9B9B9B9C9C9C9B9B9B9C9C9C 9C9C9C9D9D9D9D9D9D9D9D9D9E9E9E9E9E9E9F9F9F9F9F9F9F9F9FA0A0A0A0A0A0A0A0A0A1A1A1 A1A1A1A1A1A1A2A2A2A2A2A2A2A2A2A3A3A3A3A3A3A4A4A4A4A4A4A4A4A4A4A4A4A5A5A5A5A5A5 A6A6A6A6A6A6A6A6A6A6A6A6A7A7A7A7A7A7A7A7A7A8A8A8A8A8A8A9A9A9A9A9A9A9A9A9AAAAAA AAAAAAAAAAAAAAAAAAABABABABABABABABABACACACACACACACACACADADADADADADADADADADADAD AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEACACACACACACACACACADADADADADADB0B0B0B0B0B0AEAEAE B1B1B1B1B1B1AEAEAE9999999E9E9EB0B0B0B2B2B2B2B2B2B2B2B2B3B3B3B3B3B3B3B3B3ABABAB 979797747679878787878787878787878787878787878787878787878787878787878787878787 878787878787878787888888888888878787888888888888888888888888888888888888888888 8888888888888888888888880303030000006E6E6E888888888888888888888888888888878787 878787888888878787878787878787878787878787878787878787878787878787878787878787 878787878787868686868686878787868686868686868686868686858585858585727478929292 A6A6A6B1B1B1B1B1B1B1B1B1B0B0B0B0B0B0ADADAD9797979B9B9BADADADAEAEAEAFAFAFAEAEAE ACACACAEAEAEAEAEAEACACACA2A2A2929292A8A8A8ACACAC2C48A32C48A32C47A2ABABABABABAB ABABABAAAAAAA9A9A9AAAAAAAAAAAAA9A9A9A9A9A9A8A8A8A8A8A8A7A7A7A7A7A7A7A7A7A7A7A7 A6A6A6A6A6A6A6A6A6A5A5A5A5A5A5A4A4A4A4A4A4A4A4A4A3A3A3A3A3A3A3A3A3A2A2A2A2A2A2 A2A2A2A1A1A1A1A1A1A0A0A0A0A0A0A0A0A09F9F9F9F9F9F9F9F9F9E9E9E9E9E9E9E9E9E9D9D9D 9D9D9D9D9D9D9C9C9C9C9C9C9C9C9C9B9B9B9B9B9B9B9B9B9A9A9A9A9A9A9A9A9A999999999999 989898999999989898989898979797979797979797969696969696959595959595959595959595 9494949494949393939393939393939393939393939292929292928B8B8B7A7A7A5E5F626C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6B6B6B6B6B6B6B6B6B6B6B6B6A6A6A6A6A6A6A6A6A696969696969 6969696969696969696969696969696969691C242B1C242B1C242C0E1013030202060606060606 00000063615FF2F2F1F6F4F0F6F3EFF6F3EFF7F4F0F9F6F2C8C6C4939291868585747675616363 525454393C3F2122291B1E24171A1F12161C0E1015313534ADAFAFA7A7A7000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 0000000000000000000000000A0A0ACCCCCCB3B3B57D7D8071717222242614171B181A1D232529 5454585C5C5F6464676D6D6F7574767A797B7F7F80C5C2C1FAF7F3F7F4F0F6F3EFF5F2EEFFFCF8 CDCBC8201F1F010101060606050303090A0A1B22291D252C1C242B696969696969696969696969 6969696969696A6A6A6A6A6A6A6A6A6B6B6B6B6B6B6B6B6B6B6B6B6C6C6C6C6C6C6C6C6C6C6C6C 6C6C6C6C6C6C6D6D6D5E6063787878898989939393939393939393949494949494949494949494 959595959595969696969696969696979797969696979797979797989898989898989898999999 9999999999999999999A9A9A9A9A9A9B9B9B9B9B9B9B9B9B9C9C9C9C9C9C9D9D9D9D9D9D9D9D9D 9D9D9D9E9E9E9E9E9E9F9F9F9F9F9F9F9F9F9F9F9FA0A0A0A0A0A0A1A1A1A1A1A1A2A2A2A2A2A2 A2A2A2A3A3A3A3A3A3A3A3A3A4A4A4A4A4A4A4A4A4A5A5A5A5A5A5A5A5A5A6A6A6A6A6A6A6A6A6 A7A7A7A7A7A7A7A7A7A8A8A8A8A8A8A8A8A8A9A9A9A9A9A9AAAAAAAAAAAAAAAAAAAAAAAAABABAB ABABABABABABACACACACACACACACACADADADADADADADADADAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AFAFAFAFAFAFB0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B1B1B1B1B1B1B1B1B1B1B1B1B2B2B2B2B2B2 B2B2B2B2B2B2B2B2B2B3B3B3B3B3B3B3B3B3B3B3B3B4B4B4B4B4B4B4B4B4ABABAB98989875777A 878787878787878787878787878787878787878787878787888888888888888888888888888888 888888888888888888888888888888888888888888898989888888898989888888888888888888 8989898989890303030000006E6E6E898989888888888888888888888888888888888888888888 888888888888888888888888888888878787878787878787878787878787878787878787878787 878787878787878787878787878787868686868686868686868686747679929292A7A7A7B2B2B2 B2B2B2B2B2B2B1B1B1B1B1B1B1B1B1B1B1B1B0B0B0B0B0B0B0B0B0AFAFAFAFAFAFAFAFAFAFAFAF AFAFAFAEAEAEAEAEAEADADADADADADADADAD2C48A42C48A32C48A3ACACACABABABABABABABABAB AAAAAAAAAAAAAAAAAAAAAAAAA9A9A9A8A8A8A8A8A8A8A8A8A8A8A8A7A7A7A7A7A7A7A7A7A7A7A7 A6A6A6A6A6A6A6A6A6A5A5A5A5A5A5A4A4A4A4A4A4A4A4A4A3A3A3A3A3A3A3A3A3A2A2A2A2A2A2 A1A1A1A1A1A1A1A1A1A0A0A0A0A0A09F9F9F9F9F9F9F9F9F9E9E9E9E9E9E9E9E9E9E9E9E9D9D9D 9D9D9D9D9D9D9C9C9C9C9C9C9C9C9C9B9B9B9B9B9B9A9A9A9A9A9A999999999999999999999999 989898989898989898979797979797979797969696969696969696959595959595959595949494 9494949494949494949393939393939292929292928B8B8B7A7A7A5E60626C6C6C6C6C6C6C6C6C 6C6C6C6C6C6C6B6B6B6C6C6C6B6B6B6B6B6B6B6B6B6A6A6A6A6A6A6A6A6A696969696969696969 6969696969696969696969691C242B1C242B1C242C0E1013030202060606060606000000636161 F2F2F1F6F4F0F6F3EFF6F3EFF7F4F0F9F6F2C7C6C4929190858585747576626465525455393B3F 2122291C1E2518192113171C0D10132F3432ACAFAEA7A7A7000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 0000000000000C0C0CCCCCCEB1B0B47C7D806F717221232516181C191A1D2225285354585C5D60 6364676D6E717574777A797B7F7E7FC5C3C1FAF7F3F7F4F0F6F3EFF5F2EEFFFCF7CCCAC71F1E1E 010101060606050303090A0A1B22291D252C1C242B6969696969696969696969696969696A6A6A 6A6A6A6A6A6A6B6B6B6B6B6B6B6B6B6B6B6B6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C 6C6C6C5F61637878788A8A8A939393939393949494949494949494959595959595959595959595 969696969696969696979797979797979797989898989898989898999999999999999999999999 9A9A9A9A9A9A9B9B9B9B9B9B9B9B9B9C9C9C9C9C9C9C9C9C9D9D9D9E9E9E9E9E9E9E9E9E9E9E9E 9E9E9E9F9F9F9F9F9FA0A0A0A0A0A0A0A0A0A1A1A1A1A1A1A1A1A1A2A2A2A2A2A2A3A3A3A3A3A3 A3A3A3A4A4A4A4A4A4A4A4A4A5A5A5A5A5A5A6A6A6A6A6A6A6A6A6A6A6A6A7A7A7A7A7A7A8A8A8 A8A8A8A8A8A8A9A9A9A9A9A9A9A9A9AAAAAAAAAAAAABABABABABABABABABABABABACACACACACAC ACACACACACACADADADADADADADADADAEAEAEAEAEAEAEAEAEAFAFAFAFAFAFB0B0B0AFAFAFB0B0B0 B0B0B0B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B2B2B2B2B2B2B2B2B2B2B2B2B3B3B3B3B3B3B3B3B3 B3B3B3B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B5B5B5B5B5B5ACACAC98989876787A878787888888 888888888888888888888888888888888888888888898989898989898989898989898989898989 898989898989898989898989898989898989898989898989898989898989898989898989898989 878787878787898989898989898989898989898989898989898989898989898989898989898989 888888888888888888888888888888888888888888878787888888878787878787878787878787 87878787878787878787878787878787878786868674767A929292A7A7A7B3B3B3B2B2B2B2B2B2 B2B2B2B2B2B2B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B0B0B0B0B0B0AFAFAFB0B0B0AFAFAFAEAEAE AFAFAFAEAEAEAEAEAEAEAEAE2C48A42C48A42C48A4ACACACACACACACACACABABABABABABABABAB AAAAAAAAAAAAAAAAAAA9A9A9A9A9A9A9A9A9A9A9A9A8A8A8A8A8A8A7A7A7A7A7A7A7A7A7A6A6A6 A6A6A6A6A6A6A5A5A5A5A5A5A5A5A5A4A4A4A4A4A4A3A3A3A3A3A3A3A3A3A2A2A2A2A2A2A2A2A2 A1A1A1A1A1A1A0A0A0A0A0A0A0A0A09F9F9F9F9F9F9F9F9F9E9E9E9E9E9E9E9E9E9E9E9E9D9D9D 9D9D9D9C9C9C9C9C9C9B9B9B9B9B9B9B9B9B9A9A9A9A9A9A999999999999999999999999989898 989898989898979797979797979797969696969696969696959595959595959595959595949494 9494949393939393939393939393938B8B8B7A7A7A5F61636C6C6C6C6C6C6C6C6C6C6C6C6C6C6C 6C6C6C6C6C6C6B6B6B6B6B6B6B6B6B6B6B6B6A6A6A6A6A6A6A6A6A696969696969696969696969 6969696969691C242B1C242B1C242C0E1013030202060606060606000000636160F2F2F1F6F4F0 F6F3EFF6F3EFF7F4F0F9F6F2C7C6C4929291868686757677636566535456383B3F2123281B1D23 16171F12151C0E10142D3231A7A9A9A7A7A7000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 0A0A0CCDCDCEB3B2B57E7E8172737422232515161A191B1E24272A54555A5B5C5F6465686D6D71 7473777878797D7E7EC4C2C0FAF7F3F7F4F0F6F3EFF5F2EEFFFCF7CCCAC71F1E1E010101060606 050303090A0A1B22291D252C1C242B6969696969696969696969696A6A6A6A6A6A6A6A6A6A6A6A 6B6B6B6B6B6B6B6B6B6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6D6D6D5F6164 7878788A8A8A939393939393949494949494949494959595959595959595969696969696969696 9797979797979797979797979898989898989898989999999999999999999A9A9A9A9A9A9B9B9B 9B9B9B9C9C9C9C9C9C9C9C9C9C9C9C9D9D9D9D9D9D9E9E9E9E9E9E9E9E9E9F9F9F9F9F9F9F9F9F A0A0A0A0A0A0A0A0A0A1A1A1A1A1A1A2A2A2A2A2A2A3A3A3A3A3A3A3A3A3A3A3A3A4A4A4A4A4A4 A4A4A4A5A5A5A5A5A5A6A6A6A6A6A6A6A6A6A7A7A7A7A7A7A7A7A7A8A8A8A8A8A8A9A9A9A9A9A9 A9A9A9AAAAAAAAAAAAAAAAAAABABABABABABABABABACACACACACACADADADADADADADADADADADAD AEAEAEAEAEAEAEAEAEAEAEAEAFAFAFAFAFAFAFAFAFB0B0B0B0B0B0B0B0B0B1B1B1B1B1B1B1B1B1 B1B1B1B1B1B1B2B2B2B2B2B2B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B4B4B4B4B4B4B4B4B4B4B4B4 B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B6B6B6ADADAD999999787A7C888888888888888888888888 8989898989898989898989898989898989898989898989898A8A8A8A8A8A8A8A8A8A8A8A8A8A8A 8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A 8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8989898A8A8A898989898989898989898989 898989898989898989898989888888888888888888888888888888888888878787888888888888 87878787878787878787878787878776787B939393A8A8A8B4B4B4B3B3B3B3B3B3B3B3B3B2B2B2 B2B2B2B2B2B2B2B2B2B2B2B2B1B1B1B1B1B1B0B0B0B0B0B0B0B0B0AFAFAFAFAFAFAFAFAFAFAFAF AFAFAFAEAEAEACACAEABABADABABADADADADACACACADADADACACACACACACABABABABABABAAAAAA AAAAAAAAAAAAAAAAAAA9A9A9A9A9A9A9A9A9A8A8A8A8A8A8A8A8A8A7A7A7A7A7A7A6A6A6A6A6A6 A6A6A6A5A5A5A5A5A5A4A4A4A4A4A4A4A4A4A4A4A4A3A3A3A3A3A3A3A3A3A2A2A2A2A2A2A1A1A1 A1A1A1A0A0A0A0A0A0A0A0A09F9F9F9F9F9F9F9F9F9F9F9F9E9E9E9E9E9E9D9D9D9D9D9D9C9C9C 9C9C9C9C9C9C9B9B9B9B9B9B9B9B9B9A9A9A9A9A9A9999999A9A9A999999989898989898989898 989898979797979797979797969696969696969696959595959595949494949494949494949494 9393939393939393938C8C8C7A7A7A6062636C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C 6B6B6B6B6B6B6B6B6B6B6B6B6A6A6A6A6A6A6A6A6A696969696969696969696969696969696969 1C242B1C242B1C242C0E1013030202060606060606000000666462F3F3F2F6F3F0F6F3EFF6F3EF F7F4F0F9F6F2C6C5C49293928787857677786162645253553A3C402224291C1E24171A2013161D 0D10132E3232A4A6A7A7A7A7000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 0000000000000000000000000000000000000000000000000000000000000000000A0A0DCDCDCD B3B3B67E7E8274727421222514171B191B1E26282A54565A5B5C5F6565686D6D70737375777879 7B7C7DC4C2C1FAF7F4F7F4F0F6F3EFF5F2EEFFFCF7CDCAC71F1E1E010101060606050303090A0A 1B22291D252C1C242B6969696969696969696969696A6A6A6A6A6A6B6B6B6B6B6B6B6B6B6B6B6B 6B6B6B6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6D6D6D6C6C6C6D6D6D5F61637878788A8A8A 939393949494949494949494959595959595959595959595969696969696979797979797979797 9898989898989898989999999999999A9A9A9A9A9A9A9A9A9B9B9B9B9B9B9B9B9B9C9C9C9C9C9C 9C9C9C9C9C9C9D9D9D9D9D9D9D9D9D9E9E9E9E9E9E9F9F9F9F9F9FA0A0A0A0A0A0A0A0A0A1A1A1 A1A1A1A1A1A1A2A2A2A2A2A2A3A3A3A3A3A3A3A3A3A3A3A3A4A4A4A4A4A4A5A5A5A5A5A5A6A6A6 A6A6A6A6A6A6A7A7A7A7A7A7A8A8A8A8A8A8A8A8A8A8A8A8A9A9A9A9A9A9A9A9A9AAAAAAAAAAAA ABABABABABABABABABABABABACACACACACACACACACADADADADADADAEAEAEAEAEAEAEAEAEAEAEAE AFAFAFAFAFAFAFAFAFB0B0B0B0B0B0B1B1B1B1B1B1B1B1B1B1B1B1B2B2B2B2B2B2B2B2B2B3B3B3 B3B3B3B3B3B3B3B3B3B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B5B5B5B5B5B5B5B5B5B5B5B5B6B6B6 B6B6B6B6B6B6B6B6B6B6B6B6ADADAD999999787A7D8989898989898989898989898989898A8A8A 8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A 8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A 8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8989898A8A8A 8A8A8A898989898989898989898989898989898989898989888888888888888888888888888888 88888887878787878776787B939393A8A8A8B4B4B4B4B4B4B3B3B3B3B3B3B3B3B3B3B3B3B2B2B2 B2B2B2B2B2B2B2B2B2B2B2B2B1B1B1B1B1B1B1B1B1B0B0B0B0B0B0B0B0B0AFAFAFAFAFAFAFAFAF AEAEAEAEAEAEAEAEAEAEAEAEADADADADADADACACACACACACACACACABABABABABABABABABAAAAAA AAAAAAAAAAAAAAAAAAA9A9A9A9A9A9A8A8A8A8A8A8A8A8A8A7A7A7A7A7A7A7A7A7A6A6A6A6A6A6 A5A5A5A5A5A5A4A4A4A4A4A4A4A4A4A3A3A3A3A3A3A3A3A3A2A2A2A2A2A2A2A2A2A1A1A1A1A1A1 A1A1A1A0A0A0A0A0A09F9F9F9F9F9F9F9F9F9F9F9F9E9E9E9E9E9E9D9D9D9D9D9D9C9C9C9C9C9C 9C9C9C9C9C9C9B9B9B9B9B9B9A9A9A9A9A9A9A9A9A999999999999989898989898989898989898 979797979797969696969696969696959595959595959595959595949494949494949494939393 9393938C8C8C7A7A7A6062636D6D6D6D6D6D6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C 6B6B6B6B6B6B6B6B6B6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6969696969696969691C242B1C242B 1C242C0E1013030202060606060606000000676663F3F3F2F6F3F0F6F3EFF6F3EFF7F4F0F9F6F2 C6C5C39493938687867677776162645253563A3B3F2122281D1F25181A1F12141D0E10142F3333 A7A9ABA7A7A7000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 0000000000000000000000000000000000000000000000000000000B0B0DCDCDCDB1B1B37A7A7D 74727522222515171B1A1B1F27282B54555A5B5C606465686C6E6F7273747877797D7D7EC4C2C0 FAF7F3F7F4F0F6F3EFF5F2EEFFFCF7CCCAC71F1E1E010101060606050303090A0A1B22291D252C 1C242B6969696969696A6A6A6A6A6A6A6A6A6A6A6A6B6B6B6B6B6B6B6B6B6B6B6B6C6C6C6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6D6D6D6D6D6D6D6D6D6D6D6D626466757676898989929292949494 949494949494959595959595969696969696969696979797979797979797989898989898989898 9999999999999999999A9A9A9A9A9A9A9A9A9B9B9B9B9B9B9C9C9C9C9C9C9C9C9C9C9C9C9D9D9D 9E9E9E9E9E9E9E9E9E9F9F9F9F9F9F9F9F9F9F9F9FA0A0A0A1A1A1A0A0A0A1A1A1A1A1A1A2A2A2 A2A2A2A2A2A2A3A3A3A3A3A3A4A4A4A4A4A4A5A5A5A5A5A5A5A5A5A6A6A6A6A6A6A6A6A6A7A7A7 A7A7A7A8A8A8A8A8A8A8A8A8A9A9A9A9A9A9A9A9A9AAAAAAAAAAAAAAAAAAABABABABABABACACAC ACACACACACACADADADADADADADADADAEAEAEAEAEAEAEAEAEAEAEAEAFAFAFAFAFAFB0B0B0B0B0B0 B0B0B0B0B0B0B1B1B1B1B1B1B1B1B1B2B2B2B2B2B2B2B2B2B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3 B4B4B4B4B4B4B4B4B4B4B4B4B5B5B5B5B5B5B5B5B5B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6 B7B7B7B7B7B7ADADAD999999787A7D8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A 8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8B8B8B8A8A8A8A8A8A 8B8B8B8B8B8B8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8B8B8B8B8B8B8A8A8A8A8A8A8A8A8A8B8B8B 8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A 8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A898989898989898989898989888888888888888888888888 888888797B7E919191A8A8A8B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B3B3B3B4B4B4B3B3B3B3B3B3 B3B3B3B2B2B2B2B2B2B2B2B2B2B2B2B1B1B1B1B1B1B0B0B0B0B0B0B0B0B0AFAFAFAFAFAFAFAFAF AEAEAEAEAEAEAEAEAEADADADADADADADADADADADADACACACACACACABABABABABABABABABAAAAAA AAAAAAAAAAAAAAAAAAA9A9A9A9A9A9A8A8A8A8A8A8A7A7A7A7A7A7A7A7A7A6A6A6A6A6A6A6A6A6 A5A5A5A5A5A5A5A5A5A4A4A4A4A4A4A3A3A3A3A3A3A2A2A2A2A2A2A2A2A2A1A1A1A1A1A1A1A1A1 A0A0A0A0A0A0A0A0A09F9F9F9F9F9F9E9E9E9E9E9E9E9E9E9D9D9D9D9D9D9C9C9C9C9C9C9C9C9C 9B9B9B9B9B9B9B9B9B9B9B9B9A9A9A9A9A9A999999999999999999989898989898979797979797 9797979797979696969696969696969595959595959595959494949494949494949393938B8B8B 7B7B7B6062646D6D6D6D6D6D6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6B6B6B6B6B6B 6B6B6B6A6A6A6B6B6B6A6A6A6A6A6A6969696969696969696969691C242B1C242B1C242C0E1013 030202060606060606000000676663F3F3F2F6F3F0F6F3EFF6F3EFF7F4F0F9F6F2C8C6C4939292 868686747574606263525456383B3F2122291C1E24181B2112151B0E1014303435ABAEAEA7A7A7 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 0000000000000000000000000000000000000000000B0B0DCECECEB3B3B37D7D81747374222325 15171B181A1D26272B54555A5C5D616464676C6C6E72727479787B7E7D7EC4C2C1FAF7F4F7F4F0 F6F3EFF5F2EEFEFBF7CBC9C51E1E1D010102060606050303090A0A1B22291D252C1C242B696969 6969696A6A6A6A6A6A6A6A6A6B6B6B6B6B6B6B6B6B6C6C6C6B6B6B6C6C6C6C6C6C6C6C6C6C6C6C 6C6C6C6C6C6C6D6D6D6D6D6D6D6D6D6E6E6E646567707071878787939393949494949494959595 959595959595969696969696979797979797979797989898989898989898989898999999999999 9A9A9A9A9A9A9A9A9A9B9B9B9B9B9B9B9B9B9C9C9C9C9C9C9D9D9D9D9D9D9D9D9D9E9E9E9E9E9E 9F9F9F9F9F9F9F9F9F9F9F9FA0A0A0A0A0A0A1A1A1A1A1A1A2A2A2A2A2A2A2A2A2A2A2A2A3A3A3 A3A3A3A4A4A4A4A4A4A4A4A4A5A5A5A5A5A5A6A6A6A6A6A6A6A6A6A7A7A7A7A7A7A8A8A8A8A8A8 A9A9A9A9A9A9A9A9A9A9A9A9AAAAAAAAAAAAAAAAAAABABABABABABACACACACACACACACACADADAD ADADADADADADAEAEAEAEAEAEAEAEAEAFAFAFAFAFAFB0B0B0B0B0B0B0B0B0B0B0B0B1B1B1B1B1B1 B1B1B1B2B2B2B2B2B2B3B3B3B3B3B3B3B3B3B3B3B3B4B4B4B4B4B4B4B4B4B4B4B4B5B5B5B5B5B5 B5B5B5B5B5B5B6B6B6B6B6B6B6B6B6B6B6B6B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B6B6B6 ACACAC9595957A7C7F8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8B8B8B 8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B 8C8C8C8B8B8B8C8C8C8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B 8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A 8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8989898989898989898989898888888989897C7D7F 8A8B8CA7A7A7B3B3B3B5B5B5B5B5B5B5B5B5B5B5B5B4B4B4B4B4B4B4B4B4B3B3B3B3B3B3B3B3B3 B3B3B3B2B2B2B2B2B2B2B2B2B2B2B2B1B1B1B1B1B1B0B0B0B0B0B0B0B0B0AFAFAFAFAFAFAFAFAF AEAEAEAEAEAEAEAEAEADADADADADADACACACACACACACACACACACACACACACABABABAAAAAAAAAAAA AAAAAAA9A9A9A9A9A9A9A9A9A9A9A9A8A8A8A8A8A8A7A7A7A7A7A7A7A7A7A6A6A6A6A6A6A5A5A5 A5A5A5A5A5A5A4A4A4A4A4A4A3A3A3A3A3A3A3A3A3A2A2A2A2A2A2A2A2A2A1A1A1A1A1A1A1A1A1 A0A0A09F9F9FA0A0A09F9F9F9E9E9E9E9E9E9E9E9E9D9D9D9D9D9D9C9C9C9C9C9C9C9C9C9B9B9B 9B9B9B9B9B9B9A9A9A9A9A9A999999999999999999999999989898989898979797979797979797 9797979696969696969696969595959595959595959494949494949393938A8A8A777777616365 6D6D6D6D6D6D6D6D6D6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6B6B6B6B6B6B6B6B6B6B6B6B 6A6A6A6A6A6A6A6A6A6A6A6A6969696969696969691C242B1C242B1C242C0E1013030202060606 060606000000676663F3F3F2F6F3F0F6F3EFF6F3EFF7F4F0F8F5F2C7C5C3939392878888757676 606162525456373A3E2022271B1E2316191F13151D0E10152D3132A8ABABA8A8A8000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 0000000000000000000000000000000B0B0BCECDCDB3B2B67E7E8271707220212316171B191A1D 25272A5555595D5D616463676C6D6F72737479787A7E7D7EC4C2C1FAF7F4F7F4F0F6F3EFF5F2EE FEFBF7CBC9C51E1E1D010102060606050303090A0A1B22291D252C1C242B6969696A6A6A6A6A6A 6A6A6A6B6B6B6B6B6B6B6B6B6B6B6B6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C 6D6D6D6D6D6D6E6E6E6E6E6E696A6A6465678282828F8F8F939393959595959595969696969696 9696969696969797979797979797979898989898989999999999999999999A9A9A9A9A9A9A9A9A 9B9B9B9B9B9B9C9C9C9C9C9C9D9D9D9C9C9C9D9D9D9E9E9E9E9E9E9E9E9E9E9E9E9F9F9F9F9F9F A0A0A0A0A0A0A0A0A0A1A1A1A1A1A1A2A2A2A2A2A2A2A2A2A3A3A3A3A3A3A3A3A3A4A4A4A4A4A4 A4A4A4A5A5A5A5A5A5A6A6A6A7A7A7A6A6A6A7A7A7A7A7A7A8A8A8A8A8A8A9A9A9A9A9A9A9A9A9 AAAAAAAAAAAAAAAAAAABABABABABABABABABACACACACACACADADADADADADADADADAEAEAEAEAEAE AEAEAEAFAFAFAFAFAFAFAFAFB0B0B0B0B0B0B1B1B1B1B1B1B1B1B1B1B1B1B2B2B2B2B2B2B3B3B3 B3B3B3B3B3B3B3B3B3B3B3B3B4B4B4B4B4B4B4B4B4B4B4B4B5B5B5B5B5B5B5B5B5B6B6B6B6B6B6 B6B6B6B6B6B6B7B7B7B7B7B7B7B7B7B8B8B8B8B8B8B8B8B8B8B8B8B7B7B7B4B4B4A6A6A6858688 8282848A8A8A8A8A8A8A8A8A8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B 8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C 8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C 8C8C8C8B8B8B8C8C8C8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8A8A8A8A8A8A8A8A8A8A8A8A 8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8989898989898384847D7E80A1A1A1 B0B0B0B5B5B5B6B6B6B6B6B6B5B5B5B5B5B5B5B5B5B4B4B4B4B4B4B4B4B4B4B4B4B3B3B3B3B3B3 B2B2B2B3B3B3B2B2B2B1B1B1B1B1B1B1B1B1B0B0B0B0B0B0B0B0B0B0B0B0AFAFAFAFAFAFAFAFAF AEAEAEAEAEAEAEAEAEADADADADADADADADADACACACACACACACACACABABABABABABAAAAAAAAAAAA AAAAAAA9A9A9A9A9A9A8A8A8A8A8A8A8A8A8A8A8A8A7A7A7A6A6A6A6A6A6A6A6A6A5A5A5A5A5A5 A4A4A4A4A4A4A4A4A4A4A4A4A3A3A3A3A3A3A2A2A2A2A2A2A1A1A1A1A1A1A1A1A1A1A1A1A0A0A0 A0A0A09F9F9F9F9F9F9F9F9F9E9E9E9E9E9E9E9E9E9D9D9D9C9C9C9C9C9C9C9C9C9B9B9B9B9B9B 9B9B9B9B9B9B9A9A9A999999999999999999999999989898989898979797979797979797979797 969696969696959595959595959595949494939393919191858585696A6C6768696E6E6E6D6D6D 6D6D6D6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B 6A6A6A6A6A6A6A6A6A6A6A6A6969691C242B1C242B1C242C0E1013030202060606060606000000 686663F3F3F2F6F3F0F6F3EFF6F3EFF7F4F0F9F6F2C6C4C3939292888788757677616263545657 383A3E1F21261B1E2316191F12141B0D0F132F3434ABAEAFA7A7A7000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 0000000000000000000D0D0DCDCDCDB1B1B58181846F6F701E202215161B191B20282A2D545559 5D5D616463676C6D6F72737678787B7C7D7EC4C2C1FAF7F4F7F4F0F6F3EFF5F2EEFEFBF7CBC9C5 1E1E1D010102060606050303090A0A1B22291D252C1C242B6A6A6A6A6A6A6A6A6A6A6A6A6B6B6B 6B6B6B6B6B6B6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6D6D6D6D6D6D6D6D6D 6E6E6E6E6E6E6F6F6F68686A6C6D6F888888909090939393949494969696969696969696979797 9797979898989898989898989898989999999999999999999A9A9A9A9A9A9B9B9B9B9B9B9B9B9B 9C9C9C9C9C9C9C9C9C9D9D9D9E9E9E9E9E9E9E9E9E9F9F9F9F9F9F9F9F9FA0A0A0A0A0A0A1A1A1 A1A1A1A1A1A1A1A1A1A2A2A2A3A3A3A3A3A3A3A3A3A3A3A3A4A4A4A4A4A4A5A5A5A5A5A5A5A5A5 A6A6A6A6A6A6A7A7A7A7A7A7A8A8A8A8A8A8A8A8A8A9A9A9A9A9A9AAAAAAAAAAAAAAAAAAABABAB ABABABABABABACACACACACACADADADADADADADADADAEAEAEAEAEAEAFAFAFAEAEAEAFAFAFAFAFAF B0B0B0B0B0B0B0B0B0B1B1B1B1B1B1B1B1B1B2B2B2B2B2B2B2B2B2B3B3B3B3B3B3B3B3B3B4B4B4 B4B4B4B4B4B4B5B5B5B5B5B5B5B5B5B5B5B5B6B6B6B6B6B6B6B6B6B6B6B6B7B7B7B7B7B7B7B7B7 B7B7B7B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B7B7B7B4B4B4ACACAC9092927B7D808A8A8A8B8B8B 8B8B8B8B8B8B8B8B8B8B8B8B8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8D8D8D 8D8D8D8C8C8C8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D 8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8C8C8C8C8C8C8C8C8C 8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B 8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A898989818284858789A7A7A7B1B1B1 B4B4B4B5B5B5B6B6B6B6B6B6B5B5B5B5B5B5B5B5B5B5B5B5B4B4B4B4B4B4B3B3B3B3B3B3B3B3B3 B3B3B3B2B2B2B2B2B2B2B2B2B1B1B1B1B1B1B1B1B1B1B1B1B0B0B0B0B0B0AFAFAFAFAFAFAFAFAF AEAEAEAEAEAEAEAEAEADADADADADADADADADACACACACACACABABABABABABABABABAAAAAAAAAAAA A9A9A9A9A9A9A9A9A9A8A8A8A8A8A8A7A7A7A7A7A7A7A7A7A6A6A6A6A6A6A6A6A6A5A5A5A5A5A5 A4A4A4A4A4A4A3A3A3A3A3A3A3A3A3A2A2A2A2A2A2A1A1A1A1A1A1A1A1A1A0A0A0A0A0A0A0A0A0 9F9F9F9F9F9F9F9F9F9E9E9E9E9E9E9D9D9D9D9D9D9D9D9D9C9C9C9C9C9C9C9C9C9B9B9B9B9B9B 9A9A9A9A9A9A9A9A9A999999999999999999989898989898989898979797979797969696969696 9595959595959494949494949090908989897475756264666D6D6D6E6E6E6D6D6D6D6D6D6D6D6D 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6B6B6B6B6B6B6B6B6B6A6A6A6A6A6A 6A6A6A6969696969691C242B1C242B1C242C0E1013030202060606060606000000676663F3F3F1 F6F3F0F6F3EFF6F3EFF7F4F0F8F6F1C6C4C2939292888687757476616263545557383A3F202227 1C1D2317181F13141A0B0F10313838B0B3B3A7A7A7000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 0000000D0D0DCECECEB1AFB18280837575741F1F2114161A181A1E2A2B2E5455585D5D61656467 6E6E7173737678787A7D7C7DC4C1C0FAF7F3F7F4F0F6F3EFF5F2EEFEFBF7CAC9C51D1E1D010102 060606050303090A0A1B22291D252C1C242B6A6A6A6A6A6A6A6A6A6B6B6B6B6B6B6B6B6B6B6B6B 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6D6D6D6D6D6D6D6D6D6E6E6E6E6E6E6E6E6E 6F6F6F6E6E6E68686A696A6B797A7B8585858C8C8C8C8C8C8D8D8D8E8E8E8E8E8E8F8F8F8F8F8F 8F8F8F909090909090909090909090919191919191929292929292929292939393939393939393 949494959595949494959595969696969696969696969696969696979797979797979797989898 9898989898989999999A9A9A9A9A9A9A9A9A9B9B9B9B9B9B9B9B9B9B9B9B9C9C9C9C9C9C9D9D9D 9D9D9D9E9E9E9E9E9E9E9E9E9F9F9F9F9F9F9F9F9FA0A0A0A0A0A0A1A1A1A1A1A1A2A2A2A2A2A2 A2A2A2A2A2A2A3A3A3A3A3A3A4A4A4A4A4A4A4A4A4A5A5A5A5A5A5A5A5A5A5A5A5A6A6A6A6A6A6 A6A6A6A7A7A7A7A7A7A7A7A7A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A9A9A9A9A9A9AAAAAAAAAAAA AAAAAAABABABABABABABABABABABABACACACACACACACACACADADADADADADADADADADADADADADAD AEAEAEAEAEAEADADADACACACA7A7A89A9B9B88898B8182848787878B8B8B8C8C8C8C8C8C8C8C8C 8C8C8C8C8C8C8C8C8C8C8C8C8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D 8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D 8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D 8D8D8D8D8D8D8D8D8D8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8B8B8B8B8B8B8B8B8B 8B8B8B8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A888888818284838485959797A3A3A3ABABAB ABABABACACACABABABABABABAAAAAAAAAAAAAAAAAAAAAAAAA9A9A9A9A9A9A8A8A8A9A9A9A8A8A8 A8A8A8A8A8A8A7A7A7A7A7A7A6A6A6A6A6A6A6A6A6A6A6A6A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5 A4A4A4A3A3A3A4A4A4A3A3A3A3A3A3A2A2A2A2A2A2A2A2A2A1A1A1A1A1A1A1A1A1A0A0A0A0A0A0 A0A0A09F9F9F9F9F9F9E9E9E9E9E9E9D9D9D9D9D9D9C9C9C9C9C9C9B9B9B9B9B9B9B9B9B9A9A9A 9A9A9A9A9A9A999999999999989898989898989898979797979797969696969696969696969696 969696959595959595959595949494949494949494939393939393929292929292929292919191 9191919191919090909090908F8F8F8F8F8F8F8F8F8E8E8E8E8E8E8E8E8E8E8E8E8D8D8D8C8C8C 8B8B8B8787877C7C7C6C6D6E6767696B6B6C6E6E6E6E6E6E6E6E6E6D6D6D6D6D6D6D6D6D6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6B6B6B6B6B6B6B6B6B6A6A6A6A6A6A6A6A6A6A6A6A 6A6A6A1C242B1C242B1C242C0E1013030202060606060606000000676663F3F3F2F6F3F0F6F3EF F6F3EFF7F4F0F8F6F1C5C4C1929291868686757475626364545557383A3E2022281C1E24181921 13151B0F12152C3332A6A8A8A8A8A7000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF0000000000000000000000000000000000000000000000000000000000000000000B0B0B CECECFB2B2B47E7E8274737420212315151B181A1D27292D5555595D5D606564676D6E71727476 77777A7B7B7DC4C1C0FAF7F3F7F4F0F6F3EFF5F2EEFEFBF7CBC9C51E1E1D010102060606050303 090A0A1B22291D252C1C242B6A6A6A6A6A6A6B6B6B6B6B6B6B6B6B6B6B6B6C6C6C6C6C6C6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6D6D6D6D6D6D6D6D6D6E6E6E6E6E6E6E6E6E6F6F6F6F6F6F6F6F6F 6F6F6F6C6C6D67686A666769646567646567646668646668646668656669656669656669666769 66676966676966686A66686A67686B67686B67686B68696B68696B686A6C686A6C686A6C696A6D 696A6D6A6B6E6A6B6E6A6C6E6A6C6E6A6C6E6A6C6E6B6C6F6B6C6F6B6C6F6C6D706C6E706C6E70 6C6E706D6E716D6E716E6F726E6F726E6F726E70726E70726E70726F7073707174707174707174 707174707274707274717275717275727376727376727476727476727476737477737477737477 74757874757874757874767975777A76777A76777A76777A77787B77787B77797C77797C77797C 77797C78797C78797C78797C797A7D797A7D797A7D797B7E797B7E797B7E7A7B7E7A7B7E7A7B7E 7B7C7F7B7C7F7B7C7F7B7C7F7B7D807B7D807B7D807B7D807C7D807C7D807C7D807D7E817D7E81 7D7E817D7E817E80838182848687878C8C8C8C8C8C8C8C8C8C8C8C8D8D8D8D8D8D8D8D8D8D8D8D 8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D 8D8D8D8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8D8D8D8E8E8E8E8E8E8E8E8E 8E8E8E8D8D8D8E8E8E8E8E8E8E8E8E8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D 8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8B8B8B8B8B8B 8B8B8B8B8B8B8B8B8B8B8B8B8A8A8A8A8A8A8A8A8A8686877F80827E7F827B7D807B7C7F7B7C7F 7B7C7F7B7C7F7A7B7E7A7B7E7A7B7E797B7E797B7E797B7E797B7E797A7D797A7D78797C78797C 78797C78797C77797C77787B77787B77787B76777A76777A76777A76777A75777A75777A757679 757679757679747578747578747578737577737577737577737477737477727376727376727376 7173757173757172757172757071747071746F71736F71736F71736F70736F70736F70736E6F72 6E6F726D6F716D6F716D6E716D6E716D6E716C6D706C6D706C6D706B6D6F6B6C6F6B6C6F6B6C6F 6B6C6F6A6B6E6A6B6E6A6B6E696B6D696A6C696A6C696A6C696A6C68696C68696C68696C67696B 67696B67686A67686A67686A66676A66676A66676A656769656769656668656668656668656668 67686A6B6B6C6F6F6F6F6F6F6F6F6F6E6E6E6E6E6E6E6E6E6E6E6E6D6D6D6D6D6D6C6C6C6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6B6B6B6B6B6B6B6B6B6B6B6B6A6A6A6A6A6A6A6A6A1C242B 1C242B1C242C0E10130302020606060606060000006A6866F4F4F2F6F3F0F6F3EFF6F3EFF7F5F0 F8F6F1C5C3C1919090868685757475616264545657383A3E1F20261B1E2317171F13131B0E1014 343937ADAFAEA7A7A7000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 0000000000000000000000000000000000000000000000000000000000000D0D0DCECECEB4B4B5 8282857170721E1F2114171B181A1E26282C5655595D5D606564686E6E717373757777797B7B7B C3C1BFFAF7F3F7F4F0F6F3EFF5F2EEFEFBF7C9C8C51D1E1C010102060606050303090A0A1B2229 1D252C1C242B6A6A6A6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C 6D6D6D6D6D6D6D6D6D6D6D6D6E6E6E6E6E6E6E6E6E6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F 707070707070717171717171717171717171727272727272727272727272727272727272737373 737373747474747474747474757575757575757575757575757575767676767676767676777777 7777777878787878787878787878787878787979797979797A7A7A7A7A7A7A7A7A7B7B7B7B7B7B 7B7B7B7B7B7B7B7B7B7C7C7C7C7C7C7D7D7D7D7D7D7D7D7D7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E 7F7F7F7F7F7F808080808080808080818181818181818181818181828282828282828282838383 838383838383848484848484848484848484848484858585858585858585868686868686878787 878787878787878787878787878787888888888888888888888888898989898989898989898989 8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8C8C8C 8C8C8C8C8C8C8D8D8D8C8C8C8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D 8D8D8D8D8D8D8D8D8D8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E 8E8E8E8E8E8E8E8E8E8F8F8F8E8E8E8E8E8E8F8F8F8E8E8E8E8E8E8F8F8F8E8E8E8F8F8F8E8E8E 8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8D8D8D8D8D8D8D8D8D8D8D8D 8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C 8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A898989898989 898989898989888888888888888888888888878787878787878787878787878787878787868686 868686868686858585848484848484848484848484848484848484838383838383828282828282 8282828181818181818181818181818181818181818080808080807F7F7F7F7F7F7F7F7F7E7E7E 7E7E7E7E7E7E7E7E7E7D7D7D7D7D7D7D7D7D7C7C7C7C7C7C7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B 7A7A7A7A7A7A7A7A7A797979787878787878787878787878787878787878777777777777767676 767676767676757575757575757575757575757575747474747474747474737373737373727272 7272727272727272727272727272727171717171717171717070707070707070706F6F6F6F6F6F 6F6F6F6F6F6F6F6F6F6F6F6F6E6E6E6E6E6E6E6E6E6D6D6D6D6D6D6C6C6C6C6C6C6C6C6C6C6C6C 6C6C6C6C6C6C6C6C6C6B6B6B6B6B6B6B6B6B6B6B6B6A6A6A6A6A6A6A6A6A1C242B1C242B1C242C 0E10130302020606060606060000006A6867F4F4F2F6F3F0F6F3EFF6F3EFF7F5F0F8F6F1C4C2C0 91908F868685757675616364545657383A3E1F21271B1E2317182012121A0E10142F3636ADB0B0 A8A7A7000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 0000000000000000000000000000000000000000000000000D0D0DCFCECEB6B5B58080826B6C6D 1E1F2014161B16181C292B2E5556595D5C5F6564686E6E717272757675787A797AC2C1BFFAF7F3 F7F4F0F6F3EFF5F2EEFFFCF8C8C7C41D1D1B020201060606050303090A0A1B22291D252C1C242B 6A6A6A6B6B6B6B6B6B6B6B6B6B6B6B6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6D6D6D6D6D6D6D6D6D 6D6D6D6E6E6E6E6E6E6E6E6E6E6E6E6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F707070707070707070 717171717171717171727272727272727272727272727272737373737373737373747474747474 757575757575757575757575757575757575767676767676767676777777787878787878787878 7878787878787878787979797979797A7A7A7A7A7A7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7C7C7C 7C7C7C7C7C7C7D7D7D7D7D7D7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7F7F7F7F7F7F7F7F7F808080 808080818181818181818181818181818181828282828282838383838383838383848484848484 848484848484848484858585858585858585858585868686868686878787878787878787878787 8787878787878888888888888888888989898989898989898A8A8A8A8A8A8A8A8A8A8A8A8A8A8A 8A8A8A8A8A8A8A8A8A8B8B8B8B8B8B8B8B8B8C8C8C8C8C8C8C8C8C8C8C8C8D8D8D8D8D8D8D8D8D 8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E 8E8E8E8E8E8E8E8E8E8E8E8E8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F 8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F 8F8F8F8F8F8F8E8E8E8F8F8F8F8F8F8F8F8F8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8D8D8D 8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8C8C8C8C8C8C8C8C8C8C8C8C 8C8C8C8B8B8B8B8B8B8B8B8B8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A898989 898989898989898989888888888888888888878787878787878787878787878787868686868686 868686858585858585848484848484848484848484848484848484838383838383838383828282 8282828181818181818181818181818181818080808080807F7F7F7F7F7F7F7F7F7E7E7E7E7E7E 7E7E7E7E7E7E7E7E7E7D7D7D7D7D7D7D7D7D7C7C7C7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B 7A7A7A797979797979797979787878787878787878787878787878777777777777777777767676 767676757575757575757575757575757575747474747474747474737373737373727272727272 7272727272727272727272727171717171717171717070707070706F6F6F6F6F6F6F6F6F6F6F6F 6F6F6F6F6F6F6E6E6E6E6E6E6E6E6E6D6D6D6D6D6D6D6D6D6D6D6D6C6C6C6C6C6C6C6C6C6C6C6C 6C6C6C6C6C6C6C6C6C6B6B6B6B6B6B6B6B6B6A6A6A6A6A6A1C242B1C242B1C242C0E1013030202 0606060606060000006A6866F4F4F2F6F3F0F6F3EFF6F3EFF7F5F0F8F6F1C4C1BF919190878786 75757562646453555736393C1F21271C1D22171A1F12151C0E1014303439ADAEB1A7A7A7000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 0000000000000000000000000000000000000D0D0DCECFCFB6B5B68180837070721F202013161A 16191C2A2C2F5655595D5C5F6464676D6D70737273757576797879C3C1BEFAF7F4F7F4F0F6F3EF F5F2EEFEFCF7C9C8C51D1D1C010101060606050303090A0A1B22291D252C1C242B6A6A6A6B6B6B 6B6B6B6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6D6D6D6D6D6D6D6D6D6D6D6D6E6E6E 6E6E6E6E6E6E6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F707070707070707070717171717171 727272727272727272727272727272727272737373737373747474747474757575757575757575 757575757575757575767676767676767676777777777777787878787878787878787878787878 7979797979797A7A7A7A7A7A7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7C7C7C7C7C7C7D7D7D 7D7D7D7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7F7F7F808080808080818181818181818181 818181818181828282828282828282838383838383838383848484848484848484848484848484 858585858585868686868686868686878787878787878787878787878787878787888888898989 8989898989898989898A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8B8B8B8B8B8B8B8B8B 8B8B8B8C8C8C8C8C8C8C8C8C8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D 8D8D8D8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8F8F8F8E8E8E8E8E8E8F8F8F8F8F8F8F8F8F8F8F8F 8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F 8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F 8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8E8E8E8F8F8F8F8F8F8E8E8E8E8E8E8E8E8E 8E8E8E8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8C8C8C 8C8C8C8C8C8C8B8B8B8B8B8B8B8B8B8B8B8B8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A898989 898989898989888888898989888888888888878787878787878787878787878787878787868686 858585858585848484858585848484848484848484848484838383838383838383828282828282 8181818181818181818181818181818181818080808080807F7F7F7F7F7F7E7E7E7E7E7E7E7E7E 7E7E7E7E7E7E7D7D7D7D7D7D7C7C7C7C7C7C7C7C7C7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7A7A7A 7A7A7A797979797979797979787878787878787878787878777777777777767676767676757575 767676757575757575757575757575747474747474737373737373737373727272727272727272 7272727272727171717171717171717171717070707070707070706F6F6F6F6F6F6F6F6F6F6F6F 6F6F6F6E6E6E6E6E6E6E6E6E6D6D6D6D6D6D6D6D6D6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C 6C6C6C6C6C6C6B6B6B6B6B6B6B6B6B6A6A6A1C242B1C242B1C242C0E1013030202060606060606 0000006A6867F4F4F2F6F3F0F6F3EFF6F3EFF7F5F0F8F6F1C3C2C0939291868686747474616363 555659373A3D1F22261C1D2316191E13141C0F1215313639ABADAEA7A7A7000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 0000000000000000000000000D0D0DCFCFCFB2B1B37E7D807271731F202113151A16181D2A2B2F 5656595E5D606464666C6C6E727273757576787879C3C1BFFBF8F4F7F4F0F6F3EFF5F2EEFEFBF7 C9C8C51D1D1C010101060606050303090A0A1B22291D252C1C242B6B6B6B6B6B6B6B6B6B6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6D6D6D6D6D6D6D6D6D6E6E6E6E6E6E6E6E6E6E6E6E 6F6F6F6F6F6F6F6F6F6F6F6F707070707070707070707070717171717171717171727272727272 727272727272727272737373737373747474747474747474757575757575757575757575757575 7575757676767777777777777777777878787878787878787878787878787979797979797A7A7A 7A7A7A7A7A7A7B7B7B7B7B7B7B7B7B7B7B7B7C7C7C7C7C7C7C7C7C7D7D7D7D7D7D7E7E7E7E7E7E 7E7E7E7E7E7E7E7E7E7F7F7F7F7F7F7F7F7F808080808080818181818181818181818181828282 828282828282838383848484848484848484848484848484848484858585858585858585868686 868686878787878787878787878787878787878787888888888888888888898989898989898989 8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8B8B8B8B8B8B8B8B8B8C8C8C8C8C8C8C8C8C8C8C8C 8C8C8C8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8E8E8E8E8E8E8E8E8E8E8E8E8F8F8F 8E8E8E8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F 8F8F8F9090909090908F8F8F8F8F8F909090909090909090909090909090909090909090909090 9090908F8F8F9090909090909090909090909090909090908F8F8F8F8F8F8F8F8F8F8F8F8F8F8F 8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F 8E8E8E8E8E8E8E8E8E8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8C8C8C8C8C8C 8C8C8C8C8C8C8C8C8C8B8B8B8B8B8B8B8B8B8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A 898989898989898989888888888888878787878787878787878787878787878787868686868686 858585858585858585848484848484848484848484848484838383838383828282828282828282 8181818181818181818181818080808080808080807F7F7F7F7F7F7F7F7F7E7E7E7E7E7E7E7E7E 7D7D7D7D7D7D7D7D7D7D7D7D7C7C7C7C7C7C7B7B7B7B7B7B7B7B7B7B7B7B7A7A7A7A7A7A7A7A7A 797979797979797979787878787878787878777777777777777777777777767676757575757575 757575757575757575757575747474747474737373737373737373727272727272727272727272 7272727272727171717171717070707070707070706F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F 6E6E6E6E6E6E6E6E6E6E6E6E6D6D6D6D6D6D6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6B6B6B 6B6B6B6B6B6B6B6B6B6B6B6B1C242B1C242B1C242C0E10130302020606060606060000006A6866 F4F4F2F6F3F0F6F3EFF6F3EFF8F5F1F8F5F1C3C1BF929190878786747474616364565758383A3E 1F22261B1E24171A1F12141A0F1015313637AEB2B1AAAAA8000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 0000000000000D0D0DCFCFD0B5B5B78382846E6E6F1D1E2014151916191C292C305556595D5D60 6363656D6B6D727173757476777779C3C0C0FBF8F4F7F4F0F6F3EFF5F2EEFEFBF7C9C7C41D1D1C 010201060606050303090A0A1B22291D252C1C242B6B6B6B6B6B6B6B6B6B6C6C6C6C6C6C6C6C6C 6C6C6C6C6C6C6D6D6D6D6D6D6D6D6D6D6D6D6E6E6E6E6E6E6E6E6E6F6F6F6F6F6F6F6F6F6F6F6F 6F6F6F6F6F6F707070707070707070717171717171727272727272727272727272727272727272 737373737373737373747474747474747474757575757575757575757575757575767676767676 7777777777777777777878787878787878787878787979797979797A7A7A7A7A7A7A7A7A7B7B7B 7B7B7B7B7B7B7B7B7B7C7C7C7C7C7C7D7D7D7D7D7D7D7D7D7E7E7E7E7E7E7E7E7E7E7E7E7F7F7F 7F7F7F808080808080808080818181818181818181818181818181828282828282838383838383 838383848484848484848484848484858585858585858585868686868686868686878787878787 8787878787878787878787878888888989898989898989898989898A8A8A8A8A8A8A8A8A8A8A8A 8A8A8A8B8B8B8B8B8B8B8B8B8B8B8B8C8C8C8C8C8C8C8C8C8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D 8D8D8D8D8D8D8D8D8D8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F 8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F909090909090909090909090909090909090909090909090 909090909090909090909090909090919191919191919191919191919191919191919191909090 919191909090919191909090919191909090909090909090909090909090909090909090909090 9090908F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F 8F8F8F8F8F8F8E8E8E8E8E8E8E8E8E8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8C8C8C 8C8C8C8C8C8C8C8C8C8C8C8C8B8B8B8B8B8B8B8B8B8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A 898989898989898989888888888888878787878787878787878787878787868686868686868686 868686858585848484848484848484848484848484838383838383828282828282818181818181 8181818181818181818181818080808080807F7F7F7F7F7F7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E 7D7D7D7D7D7D7D7D7D7C7C7C7C7C7C7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7A7A7A7A7A7A797979 797979797979787878787878787878787878777777777777777777767676767676757575757575 757575757575747474747474747474737373737373737373727272727272727272727272727272 7272727171717171717070707070707070706F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6E6E6E6E6E6E 6E6E6E6E6E6E6D6D6D6D6D6D6D6D6D6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6B6B6B 6B6B6B6B6B6B1C242B1C242B1C242C0E1013030202060606060606000000696866F4F3F2F6F3F0 F6F3EFF6F3EFF8F5F1F8F5F1C2C1BF91929087868575757662646456575838393C1F20251B1E22 16191E11141A0D1013313735AEB0AFA8A8AA000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 0D0D0DCFCFCFB5B5B68282847071721E1E2113151916181C2A2C305555595D5D5F6363666D6B6F 727174747476777678C2C0BFFBF8F4F7F4F0F6F3EFF5F2EEFEFBF7C9C7C41D1D1C010201060606 050303090A0A1B22291D252C1C242B6B6B6B6B6B6B6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C 6C6C6C6D6D6D6D6D6D6E6E6E6E6E6E6E6E6E6E6E6E6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F 707070707070717171717171727272727272727272727272727272727272737373737373737373 747474747474757575757575757575757575757575767676767676777777777777777777787878 7878787878787878787979797979797A7A7A7979797A7A7A7A7A7A7B7B7B7B7B7B7B7B7B7B7B7B 7C7C7C7C7C7C7C7C7C7D7D7D7D7D7D7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7F7F7F7F7F7F808080 818181818181818181818181818181818181828282828282828282838383848484848484848484 848484858585848484858585868686868686868686868686878787878787878787878787888888 8888888888888989898989898989898A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8B8B8B8B8B8B8B8B8B 8C8C8C8C8C8C8C8C8C8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8E8E8E8E8E8E8E8E8E 8E8E8E8E8E8E8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F909090909090 909090909090909090909090909090909090919191919191919191919191919191919191919191 919191919191919191919191919191919191929292929292929292929292929292919191919191 919191919191919191919191919191919191919191919191919191919191909090909090909090 9090909090909090909090909090908F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F 8F8F8F8F8F8F8E8E8E8E8E8E8E8E8E8E8E8E8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D 8D8D8D8C8C8C8C8C8C8C8C8C8B8B8B8B8B8B8B8B8B8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A898989 898989898989888888888888878787878787878787878787878787878787868686868686858585 858585858585848484848484848484848484838383838383828282828282828282828282818181 8181818181818181818080808080808080807F7F7F7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7D7D7D 7D7D7D7C7C7C7C7C7C7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7A7A7A7A7A7A797979797979 787878787878787878787878787878777777777777777777767676767676757575757575757575 757575757575747474747474747474737373737373727272727272727272727272727272727272 7171717171717070707070706F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6E6E6E6E6E6E6E6E6E 6E6E6E6D6D6D6D6D6D6D6D6D6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6B6B6B6B6B6B6B6B6B 1C242B1C242B1C242C0E10130302020606060606060000006B6A69F5F4F3F6F3F0F6F3EFF6F3EF F8F5F1F8F5F1C2C1BF92919086868674757562646457585937383B1D20241A1D22161A1E12161A 0D0F13313636AFB0AFA7A7A7000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF0000000000000000000000000000000000000000000000000000000000000D0D0DCECDCD B3B1B18181837271721E1F2013151815171B292B2E5655595D5C5F6463676D6C70717174737375 767577C2BFBEFBF8F4F7F4F0F6F3EFF5F2EEFFFCF8C6C6C21B1B1A010101060606050303090A0A 1B22291D252C1C242B6B6B6B6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6D6D6D6D6D6D 6D6D6D6E6E6E6E6E6E6E6E6E6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F707070707070717171 717171717171727272727272727272727272727272737373737373737373747474747474747474 757575757575757575767676767676767676767676777777777777787878787878787878787878 7878787979797979797979797A7A7A7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7C7C7C7C7C7C7D7D7D 7D7D7D7D7D7D7E7E7E7E7E7E7E7E7E7E7E7E7F7F7F7F7F7F808080808080808080818181818181 818181818181828282828282828282838383838383848484848484848484848484858585858585 858585868686868686868686878787878787878787878787888888888888888888898989898989 8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8B8B8B8B8B8B8B8B8B8C8C8C8C8C8C8D8D8D8C8C8C 8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8F8F8F8F8F8F 8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F909090909090909090909090919191919191919191 919191919191919191919191919191929292919191929292929292929292929292929292929292 929292929292929292929292929292929292929292929292929292929292929292929292929292 929292929292929292929292929292929292919191919191919191919191919191919191919191 9191919090909191919090909090909090909090908F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F 8F8F8F8F8F8F8F8F8F8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D 8D8D8D8C8C8C8C8C8C8C8C8C8B8B8B8B8B8B8B8B8B8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A 898989888888888888888888888888878787878787878787878787878787868686868686858585 858585858585848484848484848484848484838383838383828282828282828282818181818181 8181818181818080808080807F7F7F7F7F7F7F7F7F7E7E7E7E7E7E7E7E7E7E7E7E7D7D7D7D7D7D 7D7D7D7C7C7C7C7C7C7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7A7A7A7A7A7A797979797979797979 787878787878787878777777777777777777767676767676767676757575757575757575757575 757575747474747474747474737373737373727272727272727272727272727272717171717171 7070707070707070706F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6E6E6E6E6E6E6E6E6E6E6E6E 6D6D6D6D6D6D6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6B6B6B6B6B6B1C242B1C242B 1C242C0E10130302020606060606060000006C6C69F5F4F3F6F3F0F6F3EFF6F3EFF8F5F1F8F5F1 C2C1BF91919185858574757661636354555735373A1D1F241A1D2116191E12151B0F12152D3536 ADB0B2ABAAAA000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 0000000000000000000000000000000000000000000000000000000D0D0DCECECFB3B3B47E7E81 6E6E711E1F2113151814171B282A2D5655595C5B5E6463676D6C6F717173737375757678C2C0BF FBF8F4F7F4F0F6F3EFF5F2EEFFFCF8C6C5C21B1B1A010201060606050303090A0A1B22291D252C 1C242B6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6D6D6D6D6D6D6D6D6D6E6E6E6E6E6E 6E6E6E6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F707070707070707070717171717171727272 727272727272727272727272727272737373737373747474747474747474757575757575757575 757575767676767676767676777777777777777777787878787878787878787878797979797979 7A7A7A7A7A7A7A7A7A7B7B7B7B7B7B7B7B7B7B7B7B7C7C7C7C7C7C7D7D7D7D7D7D7E7E7E7E7E7E 7E7E7E7E7E7E7E7E7E7F7F7F7F7F7F808080808080808080818181818181818181818181828282 828282838383838383848484848484848484848484848484858585858585858585868686878787 8787878787878787878787878787878888888888888989898989898989898A8A8A8A8A8A8A8A8A 8A8A8A8A8A8A8A8A8A8B8B8B8B8B8B8B8B8B8C8C8C8C8C8C8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D 8D8D8D8D8D8D8E8E8E8E8E8E8F8F8F8E8E8E8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F 909090909090909090909090909090919191919191919191919191919191919191929292929292 929292929292929292929292929292929292929292929292929292929292929292929292929292 929292929292929292929292929292929292929292929292929292929292929292929292929292 929292929292929292929292929292929292929292929292929292929292929292919191919191 9191919191919191919191919191919090909090909090908F8F8F8F8F8F8F8F8F8F8F8F8F8F8F 8F8F8F8F8F8F8F8F8F8F8F8F8E8E8E8E8E8E8E8E8E8E8E8E8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D 8C8C8C8C8C8C8C8C8C8B8B8B8B8B8B8B8B8B8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A898989 898989898989888888888888878787878787878787878787878787868686868686858585858585 858585848484848484848484848484848484838383838383828282828282818181818181818181 8181818181818080807F7F7F7F7F7F7F7F7F7E7E7E7E7E7E7E7E7E7E7E7E7D7D7D7D7D7D7D7D7D 7C7C7C7C7C7C7B7B7B7B7B7B7B7B7B7B7B7B7A7A7A7A7A7A7A7A7A797979797979787878787878 787878787878787878777777777777767676767676767676757575757575757575757575757575 747474747474737373737373737373727272727272727272727272727272717171717171717171 7070707070707070706F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6E6E6E6E6E6E6E6E6E6D6D6D6D6D6D 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6B6B6B1C242B1C242B1C242C0E1013 0302020606060606060000006C6B69F5F4F3F6F3F0F6F3EFF6F3EFF8F5F1F8F5F1C2C1BE919090 86858674757561636354565737393B1C1E23191C2114171C12141A0D0F132F3838ABB1B1A8A7A7 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 0000000000000000000000000000000000000000000D0D0DCFD0D0B5B4B58383846F70711D1E20 13151914161A2A2B2F5654595C5B5E6464676C6B6E707173727375757677C2C0BEFBF8F4F7F4F0 F6F3EFF5F2EEFFFCF8C6C5C21B1B1A010201060606050303090A0A1B22291D252C1C242B6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6D6D6D6D6D6D6E6E6E6E6E6E6E6E6E6E6E6E6F6F6F 6F6F6F6F6F6F6F6F6F6F6F6F707070707070717171707070717171717171727272727272727272 727272727272737373737373747474747474747474757575757575757575757575767676767676 7777777777777777777777777878787878787878787878787979797979797979797A7A7A7A7A7A 7B7B7B7B7B7B7B7B7B7B7B7B7C7C7C7C7C7C7D7D7D7D7D7D7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E 7F7F7F7F7F7F808080808080818181818181818181818181818181828282828282838383838383 838383848484848484848484848484858585858585868686868686868686878787878787878787 8787878787878888888888888989898989898A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8B8B8B 8B8B8B8C8C8C8C8C8C8C8C8C8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8E8E8E8E8E8E8E8E8E 8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F909090909090909090909090919191909090 919191919191919191929292929292929292929292929292929292929292929292929292929292 929292929292929292929292929292929292939393939393939393929292939393939393939393 939393939393939393939393939393939393939393939393939393939393929292939393929292 929292929292929292929292929292929292929292929292929292929292929292929292929292 9292929292929191919191919191919090909191919090909090909090909090908F8F8F8F8F8F 8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8E8E8E8E8E8E8E8E8E8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D 8C8C8C8C8C8C8C8C8C8B8B8B8B8B8B8B8B8B8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A898989898989 898989888888888888878787878787878787878787878787878787868686868686868686858585 858585848484848484848484848484838383838383828282828282828282818181818181818181 8080808080807F7F7F7F7F7F7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7D7D7D7D7D7D7D7D7D7C7C7C 7C7C7C7B7B7B7B7B7B7B7B7B7B7B7B7A7A7A7A7A7A7A7A7A7A7A7A797979787878787878787878 787878787878777777777777767676767676767676757575757575757575757575747474747474 747474737373737373727272727272727272727272727272727272717171717171717171707070 7070706F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6E6E6E6E6E6E6E6E6E6D6D6D6D6D6D6D6D6D 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6B6B6B1C242B1C242B1C242C0E1013030202060606 0606060000006C6B68F5F4F3F6F3F0F6F3EFF6F3EFF8F5F1F8F5F1C2C0BD908F8E858685757675 62636356575936393C1C1F23191C2015191D11131A0E1014313738A8ACADA8A8A7000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 0000000000000000000000000000000D0D0DCECECFB1B1B3838385706F701E1F2112141716181C 2B2E325555595D5C5F6463676B6A6E707073737374747475C1BFBEFBF8F4F7F4F0F6F3EFF5F2EE FFFCF8C6C5C21B1B1A010201060606050303090A0A1B22291D252C1C242B6C6C6C6C6C6C6C6C6C 6C6C6C6C6C6C6C6C6C6D6D6D6D6D6D6E6E6E6E6E6E6E6E6E6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F 6F6F6F707070707070717171707070717171717171727272727272727272727272737373737373 737373747474747474757575757575757575757575757575757575767676767676777777777777 7777777878787878787878787878787979797979797A7A7A7A7A7A7B7B7B7B7B7B7B7B7B7B7B7B 7B7B7B7C7C7C7C7C7C7D7D7D7D7D7D7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7F7F7F7F7F7F808080 808080818181818181818181818181828282828282828282838383848484848484848484848484 848484848484858585858585868686868686878787878787878787878787888888888888888888 8888888989898989898A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8B8B8B8B8B8B8C8C8C8C8C8C8C8C8C 8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8E8E8E8E8E8E8E8E8E8F8F8F8F8F8F8F8F8F8F8F8F 8F8F8F8F8F8F8F8F8F909090909090909090909090919191919191919191919191919191929292 929292929292929292929292929292929292929292929292929292929292939393939393939393 939393939393939393939393939393939393939393939393949494949494949494949494949494 949494939393939393949494949494949494939393939393939393939393939393939393939393 939393939393939393939393939393929292929292929292929292929292929292929292929292 9292929292929292929191919191919191919191919090909090909090909090908F8F8F8F8F8F 8F8F8F8F8F8F8F8F8F8F8F8F8E8E8E8E8E8E8E8E8E8E8E8E8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D 8D8D8D8C8C8C8C8C8C8C8C8C8B8B8B8B8B8B8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A898989898989 888888888888888888878787878787878787878787878787868686868686868686858585848484 848484848484848484848484838383838383828282828282818181818181818181818181818181 8080808080807F7F7F7F7F7F7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7D7D7D7D7D7D7C7C7C7B7B7B 7B7B7B7B7B7B7B7B7B7B7B7B7A7A7A7A7A7A7A7A7A797979797979787878787878787878787878 777777777777777777767676767676757575757575757575757575757575747474747474747474 737373737373727272727272727272727272727272717171717171717171717171707070707070 6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6E6E6E6E6E6E6D6D6D6D6D6D6D6D6D6D6D6D6C6C6C6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6B6B6B1C242B1C242B1C242C0E1013030202060606060606000000 6C6B69F5F4F3F6F3F0F6F3EFF6F3EFF8F5F1F8F5F1C1BFBD8F8E8E848383747474616363565759 37393C1D20241A1D2116191E12151A0D0F132D3334AAADAEA7A8A7000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 0000000000000000000D0D0DD0D0D0B5B4B68181856C6C6E1B1B1D13151915171B2B2C3056565A 5E5D606363666A6B6E706F72717173737474C1BFBEFBF8F4F7F4F0F6F3EFF5F2EEFFFCF8C6C5C2 1B1B1A010201060606050303090A0A1B22291D252C1C242B6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C 6D6D6D6D6D6D6D6D6D6E6E6E6E6E6E6E6E6E6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F707070 707070717171717171717171727272727272727272727272727272737373737373747474747474 747474757575757575757575757575757575767676767676767676777777787878787878787878 7878787878787979797979797979797A7A7A7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7C7C7C 7D7D7D7D7D7D7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7F7F7F7F7F7F808080808080818181818181 818181818181828282828282838383838383838383848484848484848484848484858585858585 8686868686868686868787878787878787878787878888888888888989898989898989898A8A8A 8A8A8A8A8A8A8A8A8A8A8A8A8B8B8B8B8B8B8B8B8B8C8C8C8C8C8C8D8D8D8D8D8D8D8D8D8D8D8D 8D8D8D8D8D8D8E8E8E8E8E8E8E8E8E8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F909090909090 909090909090919191919191919191929292929292929292929292929292929292929292929292 929292929292929292939393939393939393939393939393949494949494949494949494949494 949494949494949494949494949494949494959595959595959595949494959595949494949494 959595949494949494949494949494949494949494949494949494949494949494949494949494 949494939393939393939393939393939393929292929292929292929292929292929292929292 9292929292929292929292929191919191919191919191919090909090909090909090908F8F8F 8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8E8E8E8E8E8E8E8E8E8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D 8D8D8D8C8C8C8C8C8C8B8B8B8B8B8B8B8B8B8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A898989898989 888888888888888888878787878787878787878787868686868686868686858585858585848484 848484848484848484838383838383828282828282818181818181818181818181818181808080 8080808080807F7F7F7E7E7E7E7E7E7E7E7E7E7E7E7D7D7D7D7D7D7D7D7D7C7C7C7C7C7C7B7B7B 7B7B7B7B7B7B7B7B7B7A7A7A7A7A7A7A7A7A797979787878787878787878787878787878787878 777777777777767676767676757575757575757575757575757575747474747474737373737373 7373737272727272727272727272727272727171717171717070707070707070707070706F6F6F 6F6F6F6F6F6F6F6F6F6F6F6F6E6E6E6E6E6E6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6C6C6C6C6C6C 6C6C6C6C6C6C6C6C6C1C242B1C242B1C242C0E10130302020606060606060000006C6B68F5F4F3 F6F3F0F6F3EFF6F3EFF8F5F1F8F5F1C1BEBD908F8F85848473747361636356575936383B1B1E22 181A2014171C12151A0D0D13313637AEB1AFA8A8A7000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 0000000D0D0DD0D0CFB7B5B68383866C6C6D1B1C2013151915171A2B2C2F56565A5D5D61636367 6A6A6D6F6F716F7172727173C0BEBCFBF8F4F7F4F0F6F3EFF5F2EEFFFCF8C6C5C21B1B1A010202 060606050303090A0A1B22291D252C1C242B6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6D6D6D6D6D6D 6D6D6D6E6E6E6E6E6E6E6E6E6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F707070707070717171717171 717171717171727272727272727272727272727272737373737373747474747474757575757575 757575757575757575767676767676777777777777777777787878787878787878787878787878 7979797A7A7A7A7A7A7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7C7C7C7C7C7C7D7D7D7D7D7D7E7E7E 7E7E7E7E7E7E7E7E7E7E7E7E7F7F7F7F7F7F808080808080818181818181818181818181818181 828282838383838383838383848484848484848484848484858585858585858585868686878787 8787878787878787878787878888888888888989898989898A8A8A8A8A8A8A8A8A8A8A8A8A8A8A 8B8B8B8B8B8B8B8B8B8C8C8C8C8C8C8C8C8C8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8E8E8E8E8E8E 8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F909090909090919191919191919191919191 919191929292929292929292929292929292929292929292929292939393939393939393939393 939393949494949494949494949494949494949494949494949494959595959595959595959595 959595959595959595959595959595959595959595959595959595959595959595959595959595 959595959595959595959595959595959595959595959595959595959595949494949494949494 949494949494949494949494949494949494939393939393939393939393929292929292929292 9292929292929292929292929292929292929191919191919191919090909090909090908F8F8F 8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8E8E8E8E8E8E8E8E8E8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D 8D8D8D8C8C8C8C8C8C8B8B8B8B8B8B8B8B8B8A8A8A8A8A8A8A8A8A8A8A8A898989898989898989 888888888888888888878787878787878787868686868686868686858585858585848484848484 848484848484838383838383828282828282828282818181818181818181818181808080808080 7F7F7F7F7F7F7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7D7D7D7D7D7D7C7C7C7C7C7C7B7B7B7B7B7B 7B7B7B7B7B7B7A7A7A7A7A7A797979797979787878787878787878787878787878777777777777 777777767676767676757575757575757575757575757575747474747474747474737373727272 7272727272727272727272727272727171717171717171717070706F6F6F7070706F6F6F6F6F6F 6F6F6F6F6F6F6F6F6F6E6E6E6E6E6E6D6D6D6D6D6D6D6D6D6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C 6C6C6C1C242B1C242B1C242C0E10130302020606060606060000006D6C69F5F4F3F6F3F0F6F3EF F6F3EFF8F5F1F8F5F1C0BEBC8E8F8E84848475757662636457585935373B1B1D22191B1F15171B 12151A0E1014303535ADAEAFA8A7A7000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000D0D0D D1CFD0B6B6B88686897171711D1D2012131716171B2A2C2E5555595C5D606364676A6B6D6E6E70 6F7072706F71C0BCBBFBF8F4F7F4F0F6F3EFF5F3EEFFFCF8C5C3C11A1919020202060606050303 090A0A1B22291D252C1C242B6C6C6C6C6C6C6C6C6C6C6C6C6D6D6D6D6D6D6D6D6D6E6E6E6E6E6E 6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F707070707070717171717171717171717171727272 727272727272727272737373737373737373737373747474747474757575757575757575757575 7676767676767777777777777777777878787878787878787878787979797979797A7A7A7A7A7A 7A7A7A7B7B7B7B7B7B7B7B7B7B7B7B7C7C7C7C7C7C7D7D7D7D7D7D7E7E7E7E7E7E7E7E7E7E7E7E 7F7F7F7F7F7F808080808080808080818181818181818181818181828282828282838383838383 838383848484848484848484848484858585868686868686868686878787878787878787878787 8787878888888888888989898989898A8A8A8A8A8A8A8A8A8A8A8A8B8B8B8B8B8B8B8B8B8C8C8C 8C8C8C8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8E8E8E8E8E8E8E8E8E8E8E8E8F8F8F8F8F8F8F8F8F 8F8F8F8F8F8F909090909090909090919191919191919191919191929292929292929292929292 929292929292929292939393939393939393939393939393949494949494949494949494959595 949494959595959595959595959595959595959595959595959595959595959595959595959595 959595959595959595959595959595959595959595959595959595959595959595959595959595 959595959595959595959595959595959595959595959595959595959595959595959595959595 959595949494949494949494949494949494949494939393939393939393939393929292939393 929292929292929292929292929292929292919191919191919191909090909090909090909090 8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8E8E8E8E8E8E8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D 8D8D8D8C8C8C8B8B8B8B8B8B8B8B8B8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A898989898989888888 888888878787878787878787878787878787868686868686868686858585858585848484848484 8484848383838383838383838282828282828181818181818181818181818080808080807F7F7F 7F7F7F7E7E7E7E7E7E7E7E7E7E7E7E7D7D7D7D7D7D7D7D7D7C7C7C7C7C7C7B7B7B7B7B7B7B7B7B 7B7B7B7A7A7A7A7A7A797979797979797979787878787878787878787878777777777777767676 767676767676757575757575757575757575747474747474737373737373737373727272727272 7272727272727272727171717171717171717070707070706F6F6F6F6F6F6F6F6F6F6F6F6F6F6F 6F6F6F6F6F6F6E6E6E6E6E6E6D6D6D6D6D6D6D6D6D6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C1C242B 1C242B1C242C0E10130302020606060606060000006F6E6BF5F5F3F6F3EFF6F3EFF6F3EFF8F5F1 F7F5F0BEBEBB8E8E8D86868575757662646557585835363A1A1D22191C2015171B13151A0D1012 2F3332B0B1B0AAAAAA000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 0000000000000000000000000000000000000000000000000000000000000D0D0DD1D1D1B7B6B9 8585877172731E1F2111141715161A292B2E5454585B5C5F6263666A6A6D6F6D706F6F716F6E71 BFBDBCFBF8F4F7F4F0F6F3EFF5F3EEFFFCF8C5C3C11A1919020202060606050303090A0A1B2229 1D252C1C242B6C6C6C6C6C6C6D6D6D6D6D6D6D6D6D6D6D6D6E6E6E6E6E6E6E6E6E6E6E6E6F6F6F 6F6F6F6F6F6F6F6F6F707070707070707070717171717171717171727272727272727272727272 727272737373737373747474747474747474757575757575757575757575757575767676767676 7777777777777878787878787878787878787878787979797979797A7A7A7A7A7A7B7B7B7B7B7B 7B7B7B7B7B7B7C7C7C7C7C7C7D7D7D7D7D7D7D7D7D7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7F7F7F 808080808080818181818181818181818181828282828282838383838383848484848484848484 848484848484858585858585868686878787878787878787878787878787888888888888898989 8989898989898A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8B8B8B8B8B8B8C8C8C8C8C8C8D8D8D8D8D8D 8D8D8D8D8D8D8D8D8D8E8E8E8E8E8E8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F909090909090 919191919191919191919191919191929292929292929292929292929292929292939393939393 939393939393949494949494949494949494949494959595959595959595959595959595959595 959595959595959595959595959595969696959595959595959595969696969696969696969696 969696969696969696969696969696969696969696969696969696969696969696969696969696 969696969696969696969696959595959595959595959595959595959595959595959595959595 959595959595959595959595949494949494949494939393939393949494939393939393939393 929292929292929292929292929292929292929292919191919191909090909090909090909090 8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8E8E8E8E8E8E8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D 8D8D8D8C8C8C8B8B8B8B8B8B8B8B8B8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A898989898989888888 888888878787878787878787878787878787868686868686858585848484848484848484848484 8383838383838383838282828282828181818181818181818181818080808080808080807F7F7F 7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7D7D7D7D7D7D7C7C7C7C7C7C7B7B7B7B7B7B7B7B7B7B7B7B 7A7A7A7A7A7A797979797979797979787878787878787878787878777777777777767676767676 767676757575757575757575757575747474747474737373737373737373727272727272727272 7272727272727171717171717171717070707070707070706F6F6F6F6F6F6F6F6F6F6F6F6E6E6E 6F6F6F6E6E6E6E6E6E6D6D6D6D6D6D6D6D6D6D6D6D6C6C6C6C6C6C6C6C6C1C242B1C242B1C242C 0E10130302020606060606060000006F6E6BF5F5F3F6F3EFF6F3EFF6F3EFF8F5F1F7F4F0BEBDBB 8F8E8D8786857475766163645557583435381B1D20191B1F14171A1115180D0F102E3332AEB0AF A8A8A8000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 0000000000000000000000000000000000000000000000000D0D0DD1D1D2B8B7B8858686707172 1E1F2212131715171B282A2E5353575C5D5F636466696A6D6E6E706F6E716E6E70BFBDBCFBF8F4 F7F4F0F6F3EFF5F3EEFFFCF8C5C3C11A1919020202060606050303090A0A1B22291D252C1C242B 6C6C6C6C6C6C6D6D6D6D6D6D6D6D6D6D6D6D6E6E6E6E6E6E6E6E6E6F6F6F6F6F6F6F6F6F6F6F6F 6F6F6F6F6F6F707070717171717171717171717171727272727272727272727272737373737373 737373747474747474757575757575757575757575757575767676767676777777777777777777 7878787878787878787878787979797979797A7A7A7A7A7A7B7B7B7B7B7B7B7B7B7B7B7B7C7C7C 7C7C7C7D7D7D7D7D7D7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7F7F7F7F7F7F808080818181818181 818181818181818181828282828282838383838383848484848484848484848484848484858585 8686868686868787878787878787878787878888888888888888888989898989898A8A8A8A8A8A 8A8A8A8A8A8A8A8A8A8B8B8B8B8B8B8C8C8C8C8C8C8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D 8E8E8E8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F909090909090909090919191919191929292 929292929292929292929292929292939393929292939393939393949494949494949494949494 949494959595959595959595959595959595959595959595959595959595969696969696959595 959595969696969696969696969696969696969696969696979797979797969696979797979797 979797979797979797979797979797979797979797979797979797969696969696979797969696 969696969696969696969696969696969696969696959595959595959595959595959595959595 959595959595959595959595959595959595959595949494949494949494939393939393939393 9292929393939292929292929292929292929292929292929191919191919191919090908F8F8F 8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8E8E8E8E8E8E8D8D8D8E8E8E8D8D8D8D8D8D8D8D8D8D8D8D 8C8C8C8C8C8C8B8B8B8B8B8B8B8B8B8A8A8A8A8A8A8A8A8A8A8A8A898989898989888888888888 878787878787878787878787878787868686868686858585848484848484848484848484848484 8383838383838282828282828181818181818181818181818080808080807F7F7F7F7F7F7E7E7E 7E7E7E7E7E7E7E7E7E7D7D7D7D7D7D7D7D7D7C7C7C7C7C7C7B7B7B7B7B7B7B7B7B7B7B7B7A7A7A 7A7A7A797979797979787878787878787878787878777777777777777777767676767676757575 757575757575757575757575747474747474737373737373737373727272727272727272727272 7171717171717171717070707070707070706F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6E6E6E 6E6E6E6D6D6D6D6D6D6D6D6D6D6D6D6C6C6C6C6C6C6C6C6C1C242B1C242B1C242C0E1013030202 0606060606060000006E6E6BF5F5F3F6F3EFF6F3EFF6F3EFF8F5F1F7F5F0BEBDBA8F8E8C868584 7676766264655657583335371A1C1F181B1E1518191114170D10122F3536ADB0B1AAAAAA000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 0000000000000000000000000000000000000D0D0DD1D1D1B6B7B98687886F70701C1C1F131519 15161A292A2E5354575C5D606363666A6A6D6E6E706F6E706F6D70C0BDBCFBF8F4F7F4F0F6F3EF F5F3EEFFFCF8C5C3C1191919020202060606050303090A0A1B22291D252C1C242B6C6C6C6C6C6C 6D6D6D6D6D6D6D6D6D6E6E6E6E6E6E6E6E6E6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F707070 707070717171717171717171727272727272727272727272737373737373737373747474747474 757575757575757575757575757575767676767676777777777777787878787878787878787878 7878787979797979797A7A7A7A7A7A7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7C7C7C7D7D7D7D7D7D 7D7D7D7E7E7E7E7E7E7E7E7E7E7E7E7F7F7F7F7F7F808080808080808080818181818181818181 828282838383838383848484848484848484848484848484858585858585858585868686878787 8787878787878787878888888888888888888989898989898A8A8A8A8A8A8A8A8A8A8A8A8B8B8B 8B8B8B8B8B8B8C8C8C8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8E8E8E8E8E8E8F8F8F8F8F8F8F8F8F 8F8F8F8F8F8F8F8F8F909090909090909090919191919191929292929292929292929292929292 929292929292939393939393949494949494949494949494949494959595959595959595959595 959595959595959595959595959595969696969696969696969696969696969696969696979797 979797979797979797979797979797979797979797979797989898979797979797989898989898 989898989898989898989898989898979797989898979797979797979797979797979797979797 979797979797979797969696969696969696969696969696969696969696969696959595969696 959595959595959595959595959595959595959595949494949494949494949494949494939393 939393929292929292929292929292929292929292929292919191919191919191909090909090 8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8E8E8E8E8E8E8E8E8E8D8D8D8D8D8D8D8D8D8D8D8D8C8C8C 8C8C8C8C8C8C8B8B8B8B8B8B8A8A8A8A8A8A8A8A8A8A8A8A898989898989898989888888888888 878787878787878787878787868686858585858585858585848484848484848484848484838383 8383838383838282828181818181818181818181818080808080807F7F7F7F7F7F7E7E7E7E7E7E 7E7E7E7E7E7E7D7D7D7D7D7D7D7D7D7C7C7C7C7C7C7B7B7B7B7B7B7B7B7B7B7B7B7A7A7A7A7A7A 797979797979787878787878787878787878787878777777767676767676767676757575757575 757575757575757575747474747474737373737373737373727272727272727272727272717171 7171717171717070707070707070706F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6E6E6E6E6E6E6E6E6E 6E6E6E6D6D6D6D6D6D6C6C6C6C6C6C6C6C6C1C242B1C242B1C242C0E1013030202060606060606 0000006F6E6BF5F5F3F6F3EFF6F3EFF6F3EFF8F5F1F7F4F0BDBBB98F8E8E868584767575646465 565758343539191B20181A1E14161B1013170F101431373AABADB1ABABAB000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 0000000000000000000000000D0D0DD2D2D3B6B5B78383856C6D6E1B1C1E13141815161A2B2B2F 5454565C5D5F6262656A696C6D6D706E6E706E6D6FBFBDBBFBF8F4F7F4F0F6F3EFF5F3EEFFFCF8 C5C3C11A1919020202060606050303090A0A1B22291D252C1C242B6C6C6C6D6D6D6D6D6D6D6D6D 6D6D6D6E6E6E6E6E6E6E6E6E6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F707070707070717171717171 717171727272727272727272727272727272737373737373747474747474747474757575757575 757575767676767676767676777777777777777777787878787878787878787878797979797979 7979797A7A7A7B7B7B7B7B7B7B7B7B7B7B7B7C7C7C7C7C7C7C7C7C7D7D7D7D7D7D7E7E7E7E7E7E 7E7E7E7E7E7E7F7F7F7F7F7F808080808080818181818181818181818181828282838383828282 838383848484848484848484848484858585858585868686868686878787878787878787878787 8888888888888989898989898A8A8A8A8A8A8A8A8A8A8A8A8B8B8B8B8B8B8B8B8B8C8C8C8C8C8C 8C8C8C8D8D8D8D8D8D8D8D8D8D8D8D8E8E8E8E8E8E8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F909090 909090919191919191919191919191929292929292929292929292929292939393939393939393 939393949494949494949494959595959595959595959595959595959595959595969696969696 969696969696969696969696979797979797979797979797979797979797979797989898989898 989898989898989898989898989898989898989898989898989898989898989898989898989898 989898989898989898989898989898989898989898989898989898989898989898989898989898 989898979797989898979797979797979797979797979797979797969696969696969696969696 959595959595959595959595959595959595959595959595949494949494949494939393939393 939393939393929292929292929292929292929292919191919191919191919191909090909090 8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8E8E8E8E8E8E8D8D8D8D8D8D8D8D8D8D8D8D8C8C8C8C8C8C 8C8C8C8B8B8B8B8B8B8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A898989898989888888888888878787 878787878787878787878787868686858585858585848484848484848484848484838383838383 8383838282828181818181818181818181818080808080807F7F7F7F7F7F7F7F7F7E7E7E7E7E7E 7E7E7E7D7D7D7D7D7D7C7C7C7C7C7C7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7A7A7A7A7A7A797979 797979787878787878787878787878787878777777767676767676767676757575757575757575 757575747474747474737373737373737373727272727272727272727272727272727272717171 7171717070707070707070706F6F6F6F6F6F6F6F6F6F6F6F6E6E6E6E6E6E6E6E6E6D6D6D6D6D6D 6D6D6D6D6D6D6D6D6D6C6C6C1C242B1C242B1C242C0E10130302020606060606060000006F6D6B F5F5F3F6F3EFF6F3EFF6F3EFF8F5F1F7F5F0BCBCB98E8E8D868583767676646666565758343538 1A1C20181A1F14161B1014180C0D12313537AFB2B3ABABAB000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 0000000000000D0D0DD2D2D2B6B5B78383866E6E711C1C1F12131616171B2B2E315353555C5C5E 62626469696C6D6D726E6D706E6D6EBFBCBBFBF8F4F7F4F0F6F3EFF6F3EFFFFCF8C3C2C0181817 020202060606050303090A0A1B22291D252C1C242B6C6C6C6D6D6D6D6D6D6D6D6D6E6E6E6E6E6E 6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F707070707070707070717171717171727272727272 727272727272727272737373737373737373747474757575757575757575757575757575767676 7676767676767777777777777878787878787878787878787979797979797A7A7A7A7A7A7B7B7B 7B7B7B7B7B7B7B7B7B7B7B7B7C7C7C7C7C7C7D7D7D7D7D7D7E7E7E7E7E7E7E7E7E7E7E7E7F7F7F 808080808080808080818181818181818181818181828282828282838383838383848484848484 848484858585858585858585868686868686878787878787878787878787888888888888898989 8989898A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8B8B8B8C8C8C8C8C8C8D8D8D8D8D8D8D8D8D8D8D8D 8D8D8D8D8D8D8E8E8E8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F909090909090919191919191 929292929292929292929292929292929292939393939393939393949494949494949494949494 959595959595959595959595959595959595969696969696969696969696969696979797979797 979797979797989898989898979797989898989898989898989898989898989898989898989898 989898989898989898989898989898989898989898989898989898989898989898989898989898 989898989898989898989898989898989898989898989898989898989898989898989898989898 989898989898989898989898979797979797979797979797979797979797969696969696969696 969696959595959595959595959595959595959595959595949494949494949494949494939393 939393939393929292929292929292929292929292929292919191919191919191909090909090 8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8E8E8E8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8C8C8C8C8C8C 8B8B8B8B8B8B8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A898989898989888888888888878787878787 878787878787868686868686858585848484848484848484848484848484838383838383828282 8282828181818181818181818181818080808080807F7F7F7F7F7F7F7F7F7E7E7E7E7E7E7E7E7E 7D7D7D7D7D7D7C7C7C7C7C7C7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7A7A7A797979797979797979 787878787878787878787878777777777777767676767676767676757575757575757575757575 747474747474747474737373737373727272727272727272727272727272717171717171717171 7070707070707070706F6F6F6F6F6F6F6F6F6F6F6F6E6E6E6E6E6E6E6E6E6D6D6D6D6D6D6D6D6D 6C6C6C6C6C6C1C242B1C242B1C242C0E10130302020606060606060000006E6D6AF5F5F3F6F3EF F6F3EFF6F3EFF8F5F1F7F4F0BCBBB98E8E8C848382757576636566555758343639191C20181A1F 14181C1014190D10132E3334ACAFAFABAAAA000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 0D0D0DD1D1D1B7B6B88282846D6D6F1D1E2012131615171A2A2C305353555B5B5D6161636A696C 6E6E726E6D706D6C6DBFBDBBFBF8F4F7F4F0F6F3EFF6F3EFFFFCF8C2C2C0181818020202060606 050303090A0A1B22291D252C1C242B6D6D6D6D6D6D6D6D6D6E6E6E6E6E6E6F6F6F6F6F6F6F6F6F 6F6F6F6F6F6F6F6F6F707070707070707070717171717171727272727272727272727272727272 737373737373737373747474747474747474757575757575757575767676767676767676777777 7777777878787878787878787878787878787979797A7A7A7A7A7A7A7A7A7B7B7B7B7B7B7B7B7B 7B7B7B7C7C7C7D7D7D7D7D7D7D7D7D7E7E7E7E7E7E7E7E7E7E7E7E7F7F7F7F7F7F808080808080 818181818181818181828282828282828282838383838383848484848484848484848484858585 8585858686868686868787878787878787878787878888888888888989898989898A8A8A8A8A8A 8A8A8A8A8A8A8B8B8B8B8B8B8C8C8C8C8C8C8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8E8E8E8E8E8E 8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F909090909090919191919191929292929292929292929292 929292929292939393939393939393949494949494949494959595959595959595959595959595 959595969696969696969696969696979797979797979797979797989898979797989898989898 989898989898989898989898989898989898989898989898989898999999999999999999999999 999999999999999999999999999999999999999999999999999999999999999999999999999999 999999999999999999999999999999999999989898989898989898989898989898989898989898 989898989898989898989898989898989898989898989898979797979797979797969696969696 969696969696959595959595959595959595959595959595959595949494949494949494939393 9393939292929292929292929292929292929292929292929191919191919090909090908F8F8F 8F8F8F8F8F8F8F8F8F8E8E8E8E8E8E8E8E8E8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8C8C8C8C8C8C 8B8B8B8B8B8B8A8A8A8A8A8A8A8A8A8A8A8A898989898989888888888888878787878787878787 878787878787868686868686858585848484848484848484848484838383838383828282828282 8282828181818181818181818080808080807F7F7F7F7F7F7F7F7F7E7E7E7E7E7E7E7E7E7D7D7D 7D7D7D7C7C7C7C7C7C7B7B7B7B7B7B7B7B7B7B7B7B7A7A7A7A7A7A7A7A7A797979787878787878 787878787878787878777777777777767676767676757575757575757575757575757575747474 747474737373737373737373727272727272727272727272727272717171717171707070707070 7070706F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6E6E6E6E6E6E6D6D6D6D6D6D6D6D6D6D6D6D6C6C6C 1C242B1C242B1C242C0E1013030202060606060606000000706F6DF5F5F4F6F3EFF6F3EFF6F3EF F8F5F1F7F4F0BCBBB98D8D8C84858276757663656655575835373A1A1D22191C2116191E0F1218 0B0D10323837ABAEB0A8A7A8000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF0000000000000000000000000000000000000000000000000000000000000D0D0DD3D2D2 B4B3B47C7D7E6F6F701E1F211213171416192C2D315354555B5A5C6160626A6A6C6E6F726E6C70 6D6C6EBFBDBBFBF8F4F7F4F0F6F3EFF6F3EFFFFCF8C2C2C0181818020202060606050303090A0A 1B22291D252C1C242B6D6D6D6D6D6D6E6E6E6E6E6E6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F 6F6F6F707070707070707070717171727272727272727272727272727272727272737373737373 747474747474757575757575757575757575757575767676767676777777777777777777787878 7878787878787878787979797A7A7A7A7A7A7A7A7A7B7B7B7B7B7B7B7B7B7B7B7B7C7C7C7C7C7C 7D7D7D7D7D7D7D7D7D7E7E7E7E7E7E7E7E7E7F7F7F7F7F7F808080808080818181818181818181 818181828282828282838383838383848484848484848484848484858585868686868686868686 8787878787878787878787878888888989898989898989898A8A8A8A8A8A8A8A8A8A8A8A8B8B8B 8B8B8B8C8C8C8C8C8C8D8D8D8D8D8D8D8D8D8D8D8D8E8E8E8E8E8E8F8F8F8F8F8F8F8F8F8F8F8F 8F8F8F909090909090919191919191919191929292929292929292929292929292929292939393 949494949494949494949494959595959595959595959595959595959595959595969696969696 979797979797979797979797979797989898989898989898989898989898989898989898989898 9898989898989898989999999999999999999999999999999999999999999A9A9A9A9A9A9A9A9A 9999999A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A999999 9A9A9A9A9A9A9A9A9A999999999999999999999999999999999999999999999999999999999999 989898989898989898989898989898989898989898989898979797979797979797969696969696 979797969696959595969696959595959595959595959595959595949494949494949494949494 9393939292929292929292929292929292929292929191919191919191919090909090908F8F8F 8F8F8F8F8F8F8F8F8F8F8F8F8E8E8E8E8E8E8D8D8D8D8D8D8D8D8D8D8D8D8C8C8C8C8C8C8B8B8B 8B8B8B8A8A8A8A8A8A8A8A8A8A8A8A898989898989888888888888878787878787878787878787 868686868686858585858585848484848484848484848484838383838383828282828282818181 8181818181818181818080808080807F7F7F7F7F7F7E7E7E7E7E7E7E7E7E7E7E7E7D7D7D7D7D7D 7C7C7C7C7C7C7B7B7B7B7B7B7B7B7B7B7B7B7A7A7A7A7A7A7A7A7A797979787878787878787878 787878787878777777767676767676767676757575757575757575757575757575747474737373 737373737373737373727272727272727272727272717171717171707070707070707070707070 6F6F6F6F6F6F6F6F6F6F6F6F6E6E6E6E6E6E6E6E6E6D6D6D6D6D6D6D6D6D6D6D6D1C242B1C242B 1C242C0E101303020206060606060600000072706EF6F5F4F6F3EFF6F3EFF6F3EFF8F5F1F7F4F0 BBBAB68C8C8B868585767777626465555758343539191C21181B2015181D0F10180B0D10323536 ACB0B1AAAAAA000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 0000000000000000000000000000000000000000000000000000000D0D0DD3D3D4B6B4B7808183 6C6D6D1C1D1F12141715171B2D30335354555B5A5D616062696A6D6E6F736D6C706D6C6EBEBDBB FBF8F4F7F4F0F6F3EFF6F3EFFFFCF8C2C2C0181818020202060606050303090A0A1B22291D252C 1C242B6D6D6D6E6E6E6E6E6E6E6E6E6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F707070707070 707070717171717171717171727272727272727272737373737373737373737373747474747474 757575757575757575757575757575767676777777777777787878787878787878787878787878 7979797979797A7A7A7A7A7A7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7C7C7C7D7D7D7D7D7D7E7E7E 7E7E7E7E7E7E7E7E7E7F7F7F7F7F7F808080808080818181818181818181818181828282828282 838383838383848484848484848484848484858585858585868686868686878787878787878787 8787878888888888888989898989898A8A8A8A8A8A8A8A8A8B8B8B8B8B8B8C8C8C8C8C8C8D8D8D 8D8D8D8D8D8D8D8D8D8D8D8D8E8E8E8E8E8E8E8E8E8F8F8F8F8F8F8F8F8F8F8F8F909090909090 909090919191929292929292929292929292929292939393939393949494949494949494959595 959595959595959595959595959595969696969696969696969696979797979797979797989898 989898989898989898989898989898989898989898999999999999999999999999999999999999 9999999A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9B9B9B9A9A9A9B9B9B9B9B9B 9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9A9A9A9B9B9B9B9B9B9B9B9B9A9A9A9A9A9A 9B9B9B9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A999999999999999999999999999999 999999989898999999989898989898989898989898989898989898979797979797979797979797 969696969696969696959595959595959595959595959595959595949494949494949494949494 9393939393939292929292929292929292929292929191919191919191919090909090908F8F8F 8F8F8F8F8F8F8E8E8E8E8E8E8E8E8E8D8D8D8D8D8D8D8D8D8D8D8D8C8C8C8C8C8C8B8B8B8B8B8B 8B8B8B8A8A8A8A8A8A8A8A8A898989898989888888888888888888878787878787878787868686 868686868686858585848484848484848484848484838383838383828282828282818181818181 8181818181818080808080807F7F7F7F7F7F7E7E7E7E7E7E7E7E7E7E7E7E7D7D7D7D7D7D7C7C7C 7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7A7A7A7A7A7A797979797979787878787878787878787878 787878777777777777767676757575757575757575757575757575757575747474747474737373 7373737272727272727272727272727272727171717171717070707070706F6F6F6F6F6F6F6F6F 6F6F6F6F6F6F6F6F6F6E6E6E6E6E6E6E6E6E6E6E6E6D6D6D6D6D6D1C242B1C242B1C242C0E1013 030202060606060606000000716F6DF6F5F4F6F3EFF6F3EFF6F3EFF8F6F1F6F3F0BBBAB88D8D8C 86868676767562646557595A343639191C20181B1F14171B1013180C0D10343635B0B3B3AAA8A8 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 0000000000000000000000000000000000000000000D0D0DD3D3D3B5B5B67D7E816B6B6B1C1C1E 12141916181C2D2F325353565B5A5C61606269696C6E6E706C6C6F6C6C6FBFBDBBFBF8F4F7F4F0 F6F3EFF6F3EFFFFCF8C2C2C0181818020202060606050303090A0A1B22291D252C1C242B6D6D6D 6E6E6E6E6E6E6E6E6E6E6E6E6F6F6F6F6F6F6F6F6F6F6F6F707070707070707070717171717171 717171727272727272727272727272727272737373737373747474747474757575757575757575 7575757676767676767777777777777777777878787878787878787878787979797979797A7A7A 7A7A7A7A7A7A7B7B7B7B7B7B7B7B7B7C7C7C7C7C7C7D7D7D7D7D7D7E7E7E7E7E7E7E7E7E7E7E7E 7E7E7E7F7F7F808080808080808080818181818181818181828282828282838383838383848484 848484848484848484858585858585868686868686878787878787878787888888888888888888 8989898989898A8A8A8A8A8A8A8A8A8B8B8B8B8B8B8C8C8C8C8C8C8D8D8D8D8D8D8D8D8D8D8D8D 8D8D8D8E8E8E8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F909090909090919191919191929292929292 929292929292929292939393939393939393949494949494949494959595959595959595959595 959595969696969696969696979797979797979797989898989898989898989898989898989898 9898989898989999999999999999999999999A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9B9B9B 9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B 9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B 9B9B9B9B9B9B9A9A9A9B9B9B9B9B9B9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A999999999999 999999999999999999989898989898989898989898989898989898989898989898979797979797 969696969696969696969696969696959595959595959595959595949494949494949494939393 9393939393939292929292929292929292929191919191919191919090909090908F8F8F8F8F8F 8F8F8F8F8F8F8E8E8E8E8E8E8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8C8C8C8C8C8C8B8B8B8A8A8A 8A8A8A8A8A8A8A8A8A898989898989898989888888878787878787878787878787868686868686 858585858585848484848484848484848484838383838383828282828282818181818181818181 8181818080808080807F7F7F7F7F7F7E7E7E7E7E7E7E7E7E7E7E7E7D7D7D7C7C7C7C7C7C7C7C7C 7B7B7B7B7B7B7B7B7B7A7A7A7A7A7A7A7A7A797979797979787878787878787878787878777777 777777777777767676767676757575757575757575757575747474747474737373737373727272 7272727272727272727272727171717171717171717070707070707070706F6F6F6F6F6F6F6F6F 6F6F6F6F6F6F6E6E6E6E6E6E6D6D6D6D6D6D6D6D6D1C242B1C242B1C242C0E1013030202060606 06060600000072706EF6F5F4F6F3EFF6F3EFF6F3EFF8F5F1F7F4F0BBB9B78D8D8B868485757574 616464575757343537191A1F17191E14161B1113190D0F12303334B0B2B3ABABAA000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 0000000000000000000000000000000D0D0DD2D3D2B5B4B57D7D816A696A1B1C1E131519141619 292B2E5455575B5A5C61606369686B6C6C6E6D6E6E6C6C6EBFBDBCFBF9F5F7F4F0F6F3EFF6F3EF FFFCF8C2C1BF181717020202060606050303090A0A1B22291D252C1C242B6D6D6D6E6E6E6E6E6E 6E6E6E6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F707070707070717171717171717171727272727272 727272727272737373737373737373747474747474747474757575757575757575757575767676 7676767777777777777878787878787878787878787878787979797979797A7A7A7A7A7A7B7B7B 7B7B7B7B7B7B7B7B7B7C7C7C7D7D7D7D7D7D7D7D7D7E7E7E7E7E7E7E7E7E7E7E7E7F7F7F808080 808080808080818181818181818181828282828282838383838383848484848484848484848484 8585858585858686868686868787878787878787878787878888888989898989898989898A8A8A 8A8A8A8A8A8A8B8B8B8B8B8B8C8C8C8C8C8C8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8E8E8E8F8F8F 8F8F8F8F8F8F8F8F8F909090909090909090919191919191929292929292929292929292929292 939393939393949494949494949494959595959595959595959595969696969696969696979797 979797979797979797989898989898989898989898989898989898999999989898999999999999 9999999999999A9A9A9A9A9A9A9A9A9B9B9B9B9B9B9A9A9A9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B 9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9C9C9C9B9B9B 9C9C9C9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9C9C9C9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B 9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A 999999999999999999989898989898989898989898989898989898989898989898989898979797 979797969696969696969696959595959595959595959595959595959595949494949494949494 9393939292929292929292929292929292929191919191919090909090909090908F8F8F8F8F8F 8F8F8F8F8F8F8E8E8E8E8E8E8D8D8D8D8D8D8D8D8D8D8D8D8C8C8C8C8C8C8B8B8B8B8B8B8A8A8A 8A8A8A8A8A8A8A8A8A898989898989888888888888878787878787878787868686868686858585 858585848484848484848484848484838383838383828282828282818181818181818181818181 8080807F7F7F7F7F7F7E7E7E7E7E7E7E7E7E7E7E7E7D7D7D7D7D7D7D7D7D7C7C7C7B7B7B7B7B7B 7B7B7B7B7B7B7A7A7A7A7A7A797979797979797979787878787878787878787878777777777777 767676767676757575757575757575757575757575747474747474737373737373727272727272 7272727272727272727171717171717171717070707070706F6F6F6F6F6F6F6F6F6F6F6F6F6F6F 6E6E6E6E6E6E6E6E6E6D6D6D6D6D6D1C242B1C242B1C242C0E1013030202060606060606000000 71706DF6F5F4F6F3EFF6F3EFF6F3EFF8F6F1F6F4F0BAB8B58C8B8A858484757676636565575957 333437181B1F17182014171D1113170C0D10313536AFB3B2AAAAA8000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 0000000000000000000D0D0DD4D3D4B6B4B67E7D806C6D6D1C1E2014151812141827292C545557 5A595B62616369686B6C6C6E6C6D6F6B6C6EBEBCBBFBF8F5F7F4F0F6F3EFF6F3EFFFFCF8C1BFBD 171615020202060606050303090A0A1B22291D252C1C242B6D6D6D6E6E6E6E6E6E6F6F6F6F6F6F 6F6F6F6F6F6F6F6F6F6F6F6F707070707070707070717171727272727272727272727272727272 737373737373737373747474757575757575757575757575757575767676767676777777777777 7777777878787878787878787878787979797979797A7A7A7A7A7A7B7B7B7B7B7B7B7B7B7B7B7B 7C7C7C7D7D7D7D7D7D7D7D7D7E7E7E7E7E7E7E7E7E7E7E7E7F7F7F7F7F7F808080808080818181 818181818181818181828282838383838383848484848484848484848484858585858585868686 8686868787878787878787878888888888888888888989898A8A8A8A8A8A8A8A8A8A8A8A8B8B8B 8B8B8B8C8C8C8C8C8C8D8D8D8D8D8D8D8D8D8D8D8D8E8E8E8E8E8E8F8F8F8F8F8F8F8F8F8F8F8F 909090909090919191919191919191929292929292929292929292939393939393939393949494 949494959595959595959595959595969696969696969696969696969696979797979797989898 9898989898989898989898989898989898989999999999999A9A9A9A9A9A9A9A9A9A9A9A9B9B9B 9A9A9A9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9C9C9C9B9B9B 9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C 9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9B9B9B9B9B9B 9C9C9C9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9A9A9A9A9A9A9A9A9A9A9A9A 9A9A9A999999999999999999989898989898989898989898989898989898989898979797979797 979797969696969696969696959595959595959595959595959595949494949494939393939393 9393939393939292929292929292929292929191919191919090909090908F8F8F8F8F8F8F8F8F 8F8F8F8E8E8E8E8E8E8D8D8D8D8D8D8D8D8D8D8D8D8C8C8C8C8C8C8B8B8B8A8A8A8A8A8A8A8A8A 8A8A8A8A8A8A898989888888888888888888878787878787878787868686868686868686858585 848484848484848484848484838383838383828282818181818181818181818181818181808080 8080807F7F7F7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7D7D7D7D7D7D7C7C7C7B7B7B7B7B7B7B7B7B 7B7B7B7A7A7A7A7A7A797979797979787878787878787878787878787878777777777777767676 767676757575757575757575757575747474747474737373737373737373727272727272727272 7272727272727171717171717171717070707070706F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6E6E6E 6E6E6E6E6E6E6D6D6D1C242B1C242B1C242C0E1013030202060606060606000000716F6DF6F5F4 F6F3EFF6F3EFF6F3EFF9F6F2F6F4EFBAB9B58B8B8A848583767776636564585959343639171A1E 161A1E14181C0F12170C0D1234393AACAEAEA8A8A7000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 0000000D0D0DD3D2D3B6B4B4807E816E6E701E1F21131519121317282A2E5555585A595B626164 69696C6D6D6F6C6D6F6C6D6EBFBDBCFBF8F4F7F4F0F6F3EFF6F3EFFFFCF8C1BFBD171615020202 060606050303090A0A1B22291D252C1C242B6E6E6E6E6E6E6E6E6E6F6F6F6F6F6F6F6F6F6F6F6F 6F6F6F707070707070707070717171727272727272727272727272727272737373737373737373 747474747474757575757575757575757575757575767676767676777777777777787878787878 7878787878787979797979797A7A7A7A7A7A7A7A7A7B7B7B7B7B7B7B7B7B7B7B7B7C7C7C7D7D7D 7D7D7D7E7E7E7E7E7E7E7E7E7E7E7E7F7F7F808080808080808080818181818181818181818181 828282838383838383848484848484848484848484858585858585868686868686878787878787 8787878888888888888989898989898A8A8A8A8A8A8A8A8A8A8A8A8B8B8B8B8B8B8C8C8C8C8C8C 8D8D8D8D8D8D8D8D8D8D8D8D8E8E8E8E8E8E8F8F8F8F8F8F8F8F8F8F8F8F909090909090919191 919191929292929292929292929292939393939393939393949494949494959595959595959595 959595959595969696969696969696979797979797979797989898989898989898989898989898 9999999999999999999999999A9A9A9A9A9A9A9A9A9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B 9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9C9C9C9C9C9C9C9C9C9C9C9C9D9D9D9C9C9C9C9C9C9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9C9C9C9D9D9D9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C 9B9B9B9C9C9C9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9A9A9A 9A9A9A9A9A9A9A9A9A999999999999999999989898989898989898989898989898979797979797 979797969696969696969696959595959595959595959595959595949494949494939393939393 9393939292929292929292929292929191919191919090909090908F8F8F8F8F8F8F8F8F8F8F8F 8E8E8E8E8E8E8E8E8E8D8D8D8D8D8D8D8D8D8D8D8D8C8C8C8B8B8B8B8B8B8A8A8A8A8A8A8A8A8A 8A8A8A898989888888888888888888878787878787878787868686868686858585858585858585 8484848484848484848383838282828282828181818181818181818181818080808080807F7F7F 7F7F7F7E7E7E7E7E7E7E7E7E7E7E7E7D7D7D7D7D7D7C7C7C7C7C7C7B7B7B7B7B7B7B7B7B7B7B7B 7A7A7A7A7A7A797979797979787878787878787878787878777777777777767676767676757575 757575757575757575747474747474747474737373737373737373727272727272727272727272 7171717171717171717070707070707070706F6F6F6F6F6F6F6F6F6F6F6F6E6E6E6E6E6E6E6E6E 6D6D6D1C242B1C242B1C242C0E101303020206060606060600000073716FF6F6F4F6F3EFF6F3EF F6F3EFF8F6F1F6F4F0B9B8B68C8C8B848483767674646564595A5A34353817181F16191D13161B 1012180D0F10323636ACAEAFAAA8A8000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000D0D0D D4D3D3B6B6B77D7E816A6B6D1C1E2114151912141728292D5655585B595C6363656B6A6E6E6D70 6D6D6F6C6B6EBEBCBCFBF8F5F7F4F0F6F3EFF6F3EFFFFCF8C1BFBD171615020202060606050303 090A0A1B22291D252C1C242B6E6E6E6E6E6E6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F707070707070 717171717171717171727272727272727272727272737373737373737373737373747474757575 757575757575757575757575767676767676777777777777787878787878787878787878797979 7979797A7A7A7A7A7A7B7B7B7B7B7B7B7B7B7B7B7B7C7C7C7C7C7C7C7C7C7D7D7D7E7E7E7E7E7E 7E7E7E7E7E7E7F7F7F7F7F7F808080818181818181818181818181828282828282828282838383 848484848484848484848484858585858585868686868686878787878787878787878787888888 8888888989898A8A8A8A8A8A8A8A8A8A8A8A8B8B8B8B8B8B8C8C8C8D8D8D8D8D8D8D8D8D8D8D8D 8D8D8D8E8E8E8E8E8E8F8F8F8F8F8F8F8F8F8F8F8F909090919191919191929292929292929292 929292929292939393939393939393949494949494959595959595959595959595959595969696 969696979797979797989898989898989898989898989898999999999999999999999999999999 9A9A9A9A9A9A9A9A9A9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9C9C9C9B9B9B9C9C9C9C9C9C 9C9C9C9C9C9C9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9E9E9E9E9E9E9E9E9E 9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E 9E9E9E9E9E9E9E9E9E9D9D9D9E9E9E9E9E9E9D9D9D9D9D9D9D9D9D9D9D9D9C9C9C9D9D9D9C9C9C 9C9C9C9C9C9C9C9C9C9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9A9A9A 9A9A9A9A9A9A9A9A9A999999999999989898989898989898989898989898989898989898979797 979797979797969696969696959595959595959595959595959595949494939393939393939393 9292929292929292929292929292929191919191919090908F8F8F8F8F8F8F8F8F8F8F8F8F8F8F 8E8E8E8E8E8E8D8D8D8D8D8D8D8D8D8D8D8D8C8C8C8B8B8B8B8B8B8A8A8A8A8A8A8A8A8A8A8A8A 898989888888888888888888878787878787878787878787868686858585858585848484848484 8484848383838383838383838282828282828181818181818181818080808080807F7F7F7F7F7F 7E7E7E7E7E7E7E7E7E7E7E7E7D7D7D7C7C7C7C7C7C7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7A7A7A 7A7A7A797979797979787878787878787878787878777777767676767676767676767676757575 757575757575747474747474747474737373737373737373727272727272727272727272717171 7171717171717070707070706F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6E6E6E6E6E6E6D6D6D1C242B 1C242B1C242C0E101303020206060606060600000073726FF6F6F4F6F3EFF6F3EFF6F3EFF9F6F2 F6F3F0B8B7B48B8A89858483757675626463585959333538181B20171A1F15151D1113190E1012 303434ABACAEABAAAA000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 0000000000000000000000000000000000000000000000000000000000000D0D0DD4D4D4B4B4B6 7C7C7E6A6A6C1C1D1F141519121417282A2D5454575B5A5D6463666B6B6D6E6E706D6D6E6D6C6E BFBDBCFBF9F4F7F4F0F6F3EFF6F3EFFFFCF8C1BFBD171615020202060606050303090A0A1B2229 1D252C1C242B6E6E6E6E6E6E6F6F6F6F6F6F6F6F6F6F6F6F707070707070707070717171717171 717171727272727272727272727272727272737373737373747474747474757575757575757575 7575757575757676767777777777777878787878787878787878787878787979797979797A7A7A 7A7A7A7B7B7B7B7B7B7B7B7B7C7C7C7C7C7C7C7C7C7D7D7D7E7E7E7E7E7E7E7E7E7E7E7E7F7F7F 7F7F7F7F7F7F808080818181818181818181818181828282828282838383838383848484848484 8484848585858585858686868686868787878787878787878787878888888888888989898A8A8A 8A8A8A8A8A8A8A8A8A8B8B8B8C8C8C8C8C8C8D8D8D8D8D8D8D8D8D8D8D8D8E8E8E8E8E8E8F8F8F 8F8F8F8F8F8F8F8F8F8F8F8F909090919191919191929292929292929292929292939393939393 939393949494959595959595959595959595959595959595969696969696979797979797989898 9898989898989898989898989898989999999999999999999A9A9A9A9A9A9A9A9A9B9B9B9B9B9B 9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9C9C9C9C9C9C9C9C9C9C9C9C9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E 9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E 9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9D9D9D9E9E9E9D9D9D9D9D9D9D9D9D 9D9D9D9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B 9B9B9B9A9A9A999999999999999999999999999999989898989898989898989898989898979797 969696969696969696969696959595959595959595959595959595949494949494939393939393 9292929292929292929292929191919191919090909090908F8F8F8F8F8F8F8F8F8F8F8F8E8E8E 8E8E8E8D8D8D8D8D8D8D8D8D8C8C8C8C8C8C8C8C8C8B8B8B8A8A8A8A8A8A8A8A8A8A8A8A898989 898989888888888888878787878787878787868686868686858585858585848484848484848484 8484848383838282828282828181818181818181818181818080808080807F7F7F7F7F7F7E7E7E 7E7E7E7E7E7E7E7E7E7D7D7D7D7D7D7C7C7C7B7B7B7B7B7B7B7B7B7B7B7B7A7A7A7A7A7A797979 797979787878787878787878787878777777777777777777767676767676757575757575757575 757575747474747474747474737373727272727272727272727272727272717171717171717171 7070707070706F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6E6E6E6E6E6E1C242B1C242B1C242C 0E101303020206060606060600000074726FF6F6F4F6F3EFF6F3EFF6F3EFF9F6F2F6F3EFB9B7B5 8B8A8A84838274747363646358585934353816181D15181D13151A1014180D0F13333438B2B2B5 AAA8A7000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 0000000000000000000000000000000000000000000000000D0D0DD3D3D3B3B1B37D7D806A6A6D 1D1E20131519121317292A2E5454575C5B5E6463666B6B6E6F6F726D6E6F6D6D6EBFBEBCFBF8F4 F7F4F0F6F3EFF6F3EFFFFCF8C1BFBD171615020202060606050303090A0A1B22291D252C1C242B 6E6E6E6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F707070707070707070717171717171727272727272 727272727272737373737373737373747474747474747474757575757575757575757575767676 7676767777777777777878787878787878787878787979797979797A7A7A7A7A7A7B7B7B7B7B7B 7B7B7B7B7B7B7C7C7C7C7C7C7D7D7D7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7F7F7F808080808080 818181818181818181818181828282828282838383848484848484848484848484858585858585 8686868686868787878787878787878888888888888888888989898A8A8A8A8A8A8A8A8A8A8A8A 8B8B8B8B8B8B8C8C8C8D8D8D8D8D8D8D8D8D8D8D8D8E8E8E8E8E8E8F8F8F8F8F8F8F8F8F8F8F8F 8F8F8F909090919191919191929292929292929292929292939393939393949494949494959595 959595959595959595959595969696969696979797979797979797979797989898989898989898 9999999999999999999999999A9A9A9A9A9A9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B 9C9C9C9C9C9C9C9C9C9C9C9C9D9D9D9C9C9C9D9D9D9D9D9D9D9D9D9E9E9E9E9E9E9E9E9E9E9E9E 9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E 9E9E9E9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E 9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9D9D9D9D9D9D 9D9D9D9D9D9D9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B 9A9A9A9A9A9A9A9A9A999999999999999999999999989898989898989898989898979797979797 979797969696969696959595959595959595959595959595949494949494939393939393939393 9292929292929292929191919191919090909090908F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8D8D8D 8D8D8D8D8D8D8D8D8D8D8D8D8C8C8C8C8C8C8B8B8B8B8B8B8A8A8A8A8A8A8A8A8A898989898989 888888888888878787878787878787868686868686858585858585848484848484848484838383 8383838282828282828181818181818181818181818080808080807F7F7F7F7F7F7E7E7E7E7E7E 7E7E7E7D7D7D7D7D7D7C7C7C7C7C7C7B7B7B7B7B7B7B7B7B7B7B7B7A7A7A7A7A7A797979797979 787878787878787878787878777777777777767676767676757575757575757575757575757575 747474747474737373737373727272727272727272727272727272717171717171717171707070 6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6E6E6E6F6F6F6E6E6E1C242B1C242B1C242C0E1013030202 06060606060600000073726FF6F6F4F6F3EFF6F3EFF6F3EFF9F6F2F6F3EFB9B8B58C8B8A848381 75767563656558585934363817181D17181C14161A1113190D0D102F3236ADAFB2A8AAA8000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 0000000000000000000000000000000000000D0D0DD5D4D4B7B6B87D7D826A6B6D1C1E20131519 131417292B2F5455585D5B606462666B6B6D6F6F726D6E706E6E6FC1BFBDFCF9F5F7F4F0F6F3EF F6F3EFFFFCF8C0BFBD151515020202060606050303090A0A1B22291D252C1C242B6E6E6E6F6F6F 6F6F6F6F6F6F6F6F6F707070707070707070707070717171727272727272727272727272727272 727272737373747474747474747474757575757575757575757575767676767676777777777777 7878787878787878787878787979797979797A7A7A7A7A7A7B7B7B7B7B7B7B7B7B7B7B7B7C7C7C 7C7C7C7D7D7D7D7D7D7E7E7E7E7E7E7E7E7E7E7E7E7F7F7F7F7F7F808080808080818181818181 818181828282828282838383838383848484848484848484848484858585868686868686878787 8787878787878787878888888888888989898A8A8A8A8A8A8A8A8A8A8A8A8B8B8B8C8C8C8C8C8C 8C8C8C8D8D8D8D8D8D8D8D8D8E8E8E8F8F8F8F8F8F8F8F8F8F8F8F909090909090909090919191 929292929292929292929292929292939393939393949494959595959595959595959595959595 959595969696969696979797979797989898989898989898989898989898999999999999999999 9A9A9A9A9A9A9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9C9C9C9C9C9C9C9C9C9D9D9D 9D9D9D9D9D9D9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9F9F9F 9E9E9E9F9F9F9E9E9E9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F 9F9F9F9F9F9F9F9F9FA0A0A0A0A0A09F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F 9F9F9F9F9F9F9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9C9C9C9C9C9C9C9C9C9C9C9C9B9B9B9B9B9B9B9B9B9B9B9B 9B9B9B9A9A9A9A9A9A999999999999999999989898989898989898989898989898979797979797 979797969696969696959595959595959595959595949494949494939393939393929292929292 9292929292929191919191919191919090909090908F8F8F8F8F8F8F8F8F8E8E8E8E8E8E8D8D8D 8D8D8D8D8D8D8C8C8C8C8C8C8B8B8B8B8B8B8A8A8A8A8A8A8A8A8A8A8A8A898989898989888888 888888878787878787878787868686868686858585848484848484848484848484838383838383 8282828282828181818181818181818181818080807F7F7F7F7F7F7E7E7E7E7E7E7E7E7E7E7E7E 7D7D7D7D7D7D7C7C7C7C7C7C7B7B7B7B7B7B7B7B7B7B7B7B7A7A7A797979797979797979787878 787878787878787878777777777777767676767676757575757575757575757575747474747474 737373737373727272727272727272727272727272727272717171717171717171707070707070 6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6E6E6E1C242B1C242B1C242C0E1013030202060606060606 000000747270F6F6F4F6F3EFF6F3EFF6F3EFF9F6F2F6F3EFB7B6B58A8A89848482757573636363 58595A33343818191E17181D14161A1012170D0F12303436ABADAFAAAAA8000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 0000000000000000000000000D0D0DD5D4D5B7B6B67C7C7E68696B1C1D211316191314182A2C2F 5555595D5C606363656B6B6D6F6F726F6E716F6E71C0BEBEFBF8F5F7F4F0F6F3EFF6F3EFFFFCF8 BFBEBC151514020202060606050303090A0A1B22291D252C1C242B6E6E6E6F6F6F6F6F6F6F6F6F 6F6F6F6F6F6F707070707070717171727272727272727272727272727272737373737373737373 747474747474757575757575757575757575767676767676777777777777777777787878787878 7878787979797979797979797A7A7A7A7A7A7B7B7B7B7B7B7B7B7B7B7B7B7C7C7C7C7C7C7D7D7D 7E7E7E7E7E7E7E7E7E7E7E7E7F7F7F7F7F7F808080818181818181818181818181828282828282 838383838383848484848484848484848484858585868686868686878787878787878787878787 8888888989898989898A8A8A8A8A8A8A8A8A8A8A8A8B8B8B8B8B8B8C8C8C8D8D8D8D8D8D8D8D8D 8D8D8D8E8E8E8E8E8E8F8F8F8F8F8F8F8F8F8F8F8F909090919191919191929292929292929292 929292939393939393949494949494949494959595959595959595969696969696969696979797 9797979898989898989898989898989898989999999999999999999A9A9A9A9A9A9B9B9B9B9B9B 9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9C9C9C9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9E9E9E9E9E9E 9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0 A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A09F9F9F9F9F9F9F9F9F 9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E 9E9E9E9D9D9D9D9D9D9D9D9D9D9D9D9C9C9C9C9C9C9C9C9C9C9C9C9B9B9B9B9B9B9B9B9B9B9B9B 9B9B9B9A9A9A9A9A9A999999999999999999989898989898989898989898989898979797979797 969696969696959595959595959595959595949494949494939393939393939393929292929292 9292929191919191919090909090908F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8E8E8E8D8D8D8D8D8D 8D8D8D8D8D8D8C8C8C8C8C8C8B8B8B8A8A8A8A8A8A8A8A8A8A8A8A898989898989888888888888 878787878787878787878787868686858585858585848484848484848484838383838383828282 8282828181818181818181818181818080807F7F7F7F7F7F7E7E7E7E7E7E7E7E7E7D7D7D7D7D7D 7D7D7D7C7C7C7C7C7C7B7B7B7B7B7B7B7B7B7A7A7A7A7A7A7A7A7A797979787878787878787878 787878777777777777777777767676757575757575757575757575757575747474747474737373 7373737272727272727272727272727272727272727171717070707070707070706F6F6F6F6F6F 6F6F6F6F6F6F6F6F6F6F6F6F1C242B1C242B1C242C0E1013030202060606060606000000747270 F6F6F4F6F3EFF6F3EFF6F3EFF9F6F2F6F3EFB6B5B388898783838174737361636358595A323438 17191E16191E14151A101016090C0D383B3AB6B7B7A7A7A6000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 0000000000000D0D0DD4D4D3B7B6B77C7B826666681B1D1F14161A1113172A2C2F5556595E5D60 6463666B6B6D6F6F716F6F716E6E70C0BEBCFBF8F4F7F4F0F6F3EFF6F3EFFFFCF8BFBEBC141514 020202060606050303090A0A1B22291D252C1C242B6F6F6F6F6F6F6F6F6F6F6F6F707070707070 707070717171717171717171727272727272727272727272727272737373737373747474757575 757575757575757575767676767676767676777777777777787878787878787878787878797979 7979797A7A7A7A7A7A7B7B7B7B7B7B7B7B7B7B7B7B7C7C7C7C7C7C7D7D7D7E7E7E7E7E7E7E7E7E 7E7E7E7F7F7F7F7F7F808080808080818181818181818181828282828282838383838383848484 848484848484858585858585868686868686878787878787878787878787888888898989898989 8A8A8A8A8A8A8A8A8A8A8A8A8B8B8B8C8C8C8C8C8C8C8C8C8D8D8D8D8D8D8D8D8D8E8E8E8E8E8E 8F8F8F8F8F8F8F8F8F909090909090919191919191929292929292929292929292939393939393 949494949494959595959595959595959595969696969696979797979797979797989898989898 9898989898989999999999999999999A9A9A9A9A9A9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9C9C9C 9C9C9C9C9C9C9C9C9C9D9D9D9D9D9D9D9D9D9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E 9E9E9E9E9E9E9F9F9F9F9F9F9F9F9F9F9F9F9F9F9FA0A0A0A0A0A0A0A0A0A0A0A0A1A1A1A1A1A1 A0A0A0A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1 A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0 9F9F9FA0A0A09F9F9F9F9F9F9F9F9F9F9F9F9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E 9E9E9E9E9E9E9E9E9E9D9D9D9D9D9D9C9C9C9C9C9C9C9C9C9C9C9C9B9B9B9B9B9B9B9B9B9B9B9B 9B9B9B9A9A9A9A9A9A999999999999999999989898989898989898989898989898979797969696 969696959595959595959595959595959595949494949494939393929292929292929292929292 9292929191919191919090909090908F8F8F8F8F8F8F8F8F8F8F8F8E8E8E8D8D8D8D8D8D8D8D8D 8D8D8D8C8C8C8B8B8B8B8B8B8A8A8A8A8A8A8A8A8A8A8A8A898989898989888888878787878787 878787878787868686868686858585848484848484848484848484838383838383828282828282 8181818181818181818080808080807F7F7F7F7F7F7E7E7E7E7E7E7E7E7E7D7D7D7D7D7D7C7C7C 7C7C7C7B7B7B7B7B7B7B7B7B7B7B7B7A7A7A7A7A7A797979797979787878787878787878787878 787878777777767676767676757575757575757575757575747474747474737373737373727272 7272727272727272727272727272727171717171717171717070707070706F6F6F6F6F6F6F6F6F 6F6F6F6F6F6F1C242B1C242B1C242C0E1013030202060606060606000000747270F6F6F4F6F3EF F6F3EFF6F3EFF9F6F2F6F3EFB6B4B2898887838180737372636363585A5B32343816191E16181E 13171B1012180B0D10313536B1B2B2A7A7A7000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 10100DD5D5D5B3B2B57C7C816A6A6A1B1D1F1415191313172B2C305656595D5C5F6464676A6A6D 706E70707072707071C0BDBCFBF8F4F7F4F0F6F3EFF6F3EFFFFCF8BFBEBC141514020202060606 050303090A0A1B22291D252C1C242B6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F707070717171717171 727272717171727272727272727272727272737373737373747474747474757575757575757575 7575757676767676767777777777777878787878787878787878787979797979797A7A7A7A7A7A 7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7C7C7C7D7D7D7D7D7D7E7E7E7E7E7E7E7E7E7E7E7E7F7F7F 7F7F7F808080818181818181818181818181828282828282838383838383848484848484858585 8585858585858686868686868787878787878787878888888989898989898989898A8A8A8A8A8A 8A8A8A8B8B8B8B8B8B8C8C8C8D8D8D8D8D8D8D8D8D8D8D8D8E8E8E8E8E8E8F8F8F8F8F8F8F8F8F 909090909090919191919191929292929292929292929292939393939393949494949494959595 959595959595959595969696969696979797979797989898989898989898989898999999999999 9999999A9A9A9A9A9A9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9C9C9C9C9C9C9C9C9C9D9D9D 9D9D9D9D9D9D9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F A0A0A0A0A0A0A0A0A0A0A0A0A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1 A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1 A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A0A0A0A0A0A0 A0A0A0A0A0A0A0A0A09F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9E9E9E9F9F9F9E9E9E9E9E9E9E9E9E 9E9E9E9E9E9E9E9E9E9D9D9D9D9D9D9D9D9D9C9C9C9C9C9C9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B 9B9B9B9A9A9A999999999999999999999999989898989898989898989898979797979797979797 969696959595959595959595959595959595949494949494939393929292929292929292929292 9191919191919090909090908F8F8F8F8F8F8F8F8F8E8E8E8E8E8E8D8D8D8D8D8D8D8D8D8D8D8D 8C8C8C8B8B8B8B8B8B8A8A8A8A8A8A8A8A8A898989898989898989888888878787878787878787 868686868686868686858585858585848484848484848484838383828282828282818181818181 8181818181818080808080807F7F7F7F7F7F7E7E7E7E7E7E7E7E7E7E7E7E7D7D7D7C7C7C7C7C7C 7B7B7B7B7B7B7B7B7B7B7B7B7A7A7A797979797979797979787878787878787878787878777777 767676767676767676757575757575757575757575747474747474737373737373727272727272 7272727272727272727272727171717171717070707070706F6F6F6F6F6F6F6F6F6F6F6F6F6F6F 1C242B1C242B1C242C0E1013030202060606060606000000747370F6F6F5F6F3EFF6F3EFF6F3EF F9F6F2F5F3EEB5B3B187878682828074737362636357585A32343715181E16181D14161B0F1219 0B0D10313637AEB1B3A7A7A7000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF00000000000000000000000000000000000000000000000000000000000010100DD5D6D5 B5B5B77C7D806A6C6B1D1E201315191213172C2D315656595D5D5F6565686A6A6C6F6F71717174 717173BFBDBCFBF8F4F7F4F0F6F3EFF6F3EFFFFCF8BFBEBC141514020202060606050303090A0A 1B22291D252C1C242B6F6F6F6F6F6F6F6F6F707070707070717171717171717171727272727272 727272727272727272737373737373737373747474747474757575757575757575767676767676 7676767777777777777878787878787878787878787979797A7A7A7A7A7A7A7A7A7B7B7B7B7B7B 7B7B7B7C7C7C7C7C7C7D7D7D7D7D7D7E7E7E7E7E7E7E7E7E7E7E7E7F7F7F7F7F7F808080808080 818181818181818181828282838383838383848484848484848484848484858585858585868686 8787878787878787878888888888888989898989898989898A8A8A8A8A8A8A8A8A8B8B8B8C8C8C 8C8C8C8D8D8D8D8D8D8D8D8D8D8D8D8E8E8E8E8E8E8F8F8F8F8F8F8F8F8F909090909090919191 919191929292929292929292929292939393949494949494959595959595959595959595969696 9696969797979797979797979898989898989898989898989999999999999A9A9A9A9A9A9A9A9A 9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9C9C9C9C9C9C9D9D9D9D9D9D9D9D9D9E9E9E9E9E9E9E9E9E 9E9E9E9E9E9E9E9E9E9F9F9F9F9F9F9F9F9F9F9F9F9F9F9FA0A0A0A0A0A0A0A0A0A1A1A1A1A1A1 A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1 A1A1A1A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A1A1A1A1A1A1A1A1A1A1A1A1A2A2A2A1A1A1 A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1 A0A0A0A0A0A0A0A0A0A0A0A0A0A0A09F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9E9E9E9E9E9E9E9E9E 9E9E9E9E9E9E9E9E9E9D9D9D9D9D9D9D9D9D9C9C9C9C9C9C9C9C9C9B9B9B9B9B9B9B9B9B9B9B9B 9A9A9A9A9A9A9A9A9A999999999999999999989898989898989898979797979797969696969696 969696959595959595959595949494949494939393939393929292929292929292929292919191 9191919090909090908F8F8F8F8F8F8F8F8F8F8F8F8E8E8E8D8D8D8D8D8D8D8D8D8D8D8D8C8C8C 8B8B8B8B8B8B8A8A8A8A8A8A8A8A8A898989898989888888888888878787878787878787878787 868686858585858585848484848484848484848484838383828282828282818181818181818181 8080808080807F7F7F7F7F7F7F7F7F7E7E7E7E7E7E7E7E7E7D7D7D7D7D7D7C7C7C7C7C7C7B7B7B 7B7B7B7B7B7B7A7A7A7A7A7A797979797979797979787878787878787878777777777777767676 767676757575757575757575757575757575747474747474737373737373727272727272727272 7272727272727171717171717070707070707070706F6F6F6F6F6F6F6F6F6F6F6F1C242B1C242B 1C242C0E1013030202060606060606000000747471F6F6F5F6F3EFF6F3EFF6F3EFF9F6F2F6F3EF B5B3B186868580807F72727263646557595B31343614161C15171C1314191012190A0C0F2E3334 B1B4B6A8A8A8000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 0000000000000000000000000000000000000000000000000000000D0D0DD4D4D5B7B6B87C7B80 6768691D1E1F1315191315192E30345656585F5F616665686A6B6D6F7073727275717073C0BDBC FBF8F4F7F4F0F6F3EFF6F3EFFFFCF8BFBEBC151514020202060606050303090A0A1B22291D252C 1C242B6F6F6F6F6F6F707070707070707070707070717171717171727272727272727272727272 737373737373737373747474747474757575757575757575757575767676767676777777777777 7777777373736C6C6C696969656565636363646464646464656565656565656565656565666666 6767676767676767676767676868686868686868686868686969696969696A6A6A6A6A6A6A6A6A 6B6B6B6B6B6B6B6B6B6C6C6C6C6C6C6D6D6D6D6D6D6D6D6D6D6D6D6E6E6E6E6E6E6F6F6F6F6F6F 6F6F6F707070707070707070717171717171727272727272727272727272737373737373737373 747474747474757575757575757575767676767676767676767676777777777777787878787878 7878787979797979797A7A7A7A7A7A7A7A7A7A7A7A7B7B7B7B7B7B7B7B7B7B7B7B7C7C7C7C7C7C 7D7D7D7D7D7D7D7D7D7D7D7D7E7E7E7E7E7E7E7E7E7E7E7E7F7F7F7F7F7F7F7F7F7F7F7F808080 808080808080808080818181818181818181828282828282828282828282828282828282828282 838383838383838383838383838383838383838383838383848484848484848484848484858585 858585858585858585858585858585858585858585858585858585858585858585858585858585 858585858585858585858585858585858585868686858585858585858585858585858585858585 858585858585858585858585858585858585858585858585858585858585848484858585848484 848484848484838383838383838383838383838383838383838383838383828282828282828282 8282828282828282828181818181818181818080808080808080808080807F7F7F7F7F7F7F7F7F 7F7F7F7E7E7E7E7E7E7E7E7E7E7E7E7D7D7D7D7D7D7D7D7D7D7D7D7C7C7C7C7C7C7B7B7B7B7B7B 7B7B7B7B7B7B7A7A7A7A7A7A7A7A7A7A7A7A797979797979787878787878787878777777777777 767676767676767676767676757575757575757575747474747474737373737373737373727272 7272727272727272727171717171717070707070707070706F6F6F6F6F6F6F6F6F6F6F6F6E6E6E 6D6D6D6D6D6D6D6D6D6D6D6D6C6C6C6C6C6C6B6B6B6B6B6B6B6B6B6A6A6A6A6A6A6A6A6A696969 696969686868686868686868686868676767676767676767676767666666666666656565656565 6464646464646464646363636363636565656868686C6C6C737373777777777777767676767676 757575757575757575757575747474747474737373737373737373727272727272727272727272 7171717171717070707070707070706F6F6F6F6F6F6F6F6F6F6F6F1C242B1C242B1C242C0E1013 030202060606060606000000747471F6F6F5F6F3EFF6F3EFF6F3EFF9F6F2F6F3EFB3B1AF868584 807F7F71727162646555575931333514171D16181D1316190F12180C0D102F3332B2B5B4AAAAA8 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 0000000000000000000000000000000000000000000D1010D5D3D4B5B4B58180836A6A6C1C1C1F 13141814151A2F313557575A6160636665686B6B6E717074727276717173BFBDBBFBF8F4F7F4F0 F6F3EFF6F3EFFFFCF8BEBDBB141313020202060606050303090A0A1B22291D252C1C242B6F6F6F 6F6F6F6F6F6F707070707070717171717171717171727272727272727272727272737373737373 7474747474747474747575757575757575757575757676767777777777777373736A6A6A696969 8080809494949F9F9FA3A3A3A3A3A3A3A3A3A4A4A4A4A4A4A5A5A5A6A6A6A6A6A6A7A7A7A7A7A7 A8A8A8A8A8A8A9A9A9A9A9A9AAAAAAAAAAAAABABABACACACACACACADADADAEAEAEAEAEAEAEAEAE B0B0B0B0B0B0B0B0B0B1B1B1B2B2B2B2B2B2B3B3B3B3B3B3B4B4B4B4B4B4B5B5B5B6B6B6B6B6B6 B7B7B7B7B7B7B8B8B8B8B8B8B9B9B9BABABABABABABBBBBBBCBCBCBCBCBCBDBDBDBDBDBDBEBEBE BEBEBEBFBFBFC0C0C0C0C0C0C1C1C1C1C1C1C1C1C1C3C3C3C3C3C3C3C3C3C4C4C4C5C5C5C5C5C5 C6C6C6C6C6C6C7C7C7C7C7C7C8C8C8C8C8C8C9C9C9C9C9C9CACACACBCBCBCBCBCBCBCBCBCCCCCC CCCCCCCDCDCDCDCDCDCECECECECECECFCFCFCFCFCFD0D0D0D0D0D0CFCFCFD0D0D0D0D0D0D1D1D1 D1D1D1D1D1D1D2D2D2D2D2D2D2D2D2D3D3D3D3D3D3D3D3D3D4D4D4D4D4D4D4D4D4D4D4D4D5D5D5 D5D5D5D6D6D6D6D6D6D6D6D6D6D6D6D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D8D8D8D8D8D8 D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9 D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9 D9D9D9D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D6D6D6 D6D6D6D6D6D6D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D4D4D4D4D4D4D4D4D4D3D3D3D3D3D3D3D3D3 D2D2D2D2D2D2D1D1D1D2D2D2D1D1D1D1D1D1D0D0D0D0D0D0CFCFCFCFCFCFCECECECECECECECECE CDCDCDCDCDCDCCCCCCCCCCCCCCCCCCCBCBCBCACACACACACAC9C9C9C9C9C9C9C9C9C8C8C8C7C7C7 C7C7C7C6C6C6C6C6C6C5C5C5C5C5C5C4C4C4C3C3C3C3C3C3C3C3C3C2C2C2C2C2C2C1C1C1C0C0C0 BFBFBFBFBFBFBFBFBFBEBEBEBDBDBDBDBDBDBDBDBDBCBCBCBBBBBBBABABABABABAB9B9B9B9B9B9 B8B8B8B8B8B8B7B7B7B6B6B6B6B6B6B5B5B5B4B4B4B4B4B4B3B3B3B3B3B3B2B2B2B1B1B1B1B1B1 B1B1B1B0B0B0AFAFAFAFAFAFAEAEAEAEAEAEADADADACACACACACACABABABABABABAAAAAAAAAAAA A9A9A9A8A8A8A8A8A8A7A7A7A7A7A7A6A6A6A6A6A6A5A5A5A5A5A5A4A4A4A3A3A3A3A3A3A3A3A3 A2A2A2A2A2A2A1A1A19D9D9D939393808080696969696969737373777777767676757575757575 757575757575757575747474747474737373737373727272727272727272727272727272717171 7171717070707070706F6F6F6F6F6F6F6F6F6F6F6F1C242B1C242B1C242C0E1013030202060606 060606000000747471F6F6F5F6F3EFF6F3EFF6F3EFF9F6F2F6F3EFB2B1AF8483837F7E7E737372 63646453555832333615181D16181D14161A0F10170C0D12333435B1B2B2A7A7A7000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 0000000000000000000000000000000D0D0DD4D4D4B4B3B67C7D806B6B6C1C1D1F13151914161A 2D30345A5A5D6262646666686D6D70717174727275727173C0BDBCFBF8F4F7F4F0F6F3EFF6F3EF FFFCF8BDBCBA131213020202060606050303090A0A1B22291D252C1C242B6F6F6F6F6F6F707070 707070707070717171717171727272727272727272727272737373737373747474747474747474 7575757575757575757575757676767676767777777171716565658383839F9F9FA0A0A0A2A2A2 A2A2A2A3A3A3A3A3A3A4A4A4A4A4A4A5A5A5A5A5A5A6A6A6A7A7A7A7A7A7A7A7A7A8A8A8A9A9A9 A9A9A9AAAAAAAAAAAAABABABABABABACACACADADADADADADAEAEAEAEAEAEAFAFAFAFAFAFB0B0B0 B1B1B1B1B1B1B2B2B2B2B2B2B3B3B3B4B4B4B4B4B4B5B5B5B6B6B6B6B6B6B7B7B7B7B7B7B8B8B8 B8B8B8B9B9B9BABABABABABABBBBBBBBBBBBBCBCBCBCBCBCBDBDBDBEBEBEBEBEBEBFBFBFC0C0C0 C0C0C0C1C1C1C1C1C1C2C2C2C2C2C2C3C3C3C4C4C4C4C4C4C5C5C5C5C5C5C6C6C6C7C7C7C7C7C7 C7C7C7C8C8C8C8C8C8C9C9C9C9C9C9CACACACACACACBCBCBCBCBCBCCCCCCCCCCCCCDCDCDCDCDCD CECECECFCFCFCFCFCFCFCFCFD0D0D0D0D0D0D0D0D0D1D1D1D1D1D1D2D2D2D2D2D2D3D3D3D3D3D3 D4D4D4D4D4D4D4D4D4D5D5D5D5D5D5D5D5D5D6D6D6D6D6D6D6D6D6D7D7D7D7D7D7D7D7D7D7D7D7 D8D8D8D8D8D8D8D8D8D8D8D8D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9DADADADADADADADADA DADADADADADADADADADADADADBDBDBDADADADBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDB DBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDADADADBDBDBDADADADADADADADADA DADADADADADADADADADADADADADADAD9D9D9D9D9D9D9D9D9D9D9D9D8D8D8D8D8D8D8D8D8D8D8D8 D7D7D7D8D8D8D7D7D7D7D7D7D6D6D6D6D6D6D6D6D6D5D5D5D5D5D5D5D5D5D4D4D4D4D4D4D4D4D4 D3D3D3D3D3D3D2D2D2D2D2D2D2D2D2D1D1D1D1D1D1D0D0D0D0D0D0D0D0D0CFCFCFCFCFCFCECECE CECECECECECECDCDCDCDCDCDCCCCCCCBCBCBCBCBCBCACACACACACAC9C9C9C9C9C9C8C8C8C8C8C8 C8C8C8C7C7C7C7C7C7C6C6C6C5C5C5C5C5C5C4C4C4C3C3C3C3C3C3C2C2C2C2C2C2C1C1C1C1C1C1 C0C0C0C0C0C0BFBFBFBEBEBEBEBEBEBEBEBEBDBDBDBCBCBCBCBCBCBBBBBBBABABABABABAB9B9B9 B9B9B9B8B8B8B7B7B7B7B7B7B6B6B6B6B6B6B5B5B5B4B4B4B4B4B4B3B3B3B3B3B3B2B2B2B1B1B1 B1B1B1B0B0B0B0B0B0AFAFAFAFAFAFAEAEAEADADADACACACACACACACACACABABABAAAAAAAAAAAA A9A9A9A9A9A9A8A8A8A7A7A7A7A7A7A7A7A7A6A6A6A5A5A5A5A5A5A4A4A4A4A4A4A3A3A3A3A3A3 A2A2A2A2A2A2A1A1A1A1A1A19F9F9F848484636363727272767676767676767676757575757575 757575747474747474747474737373727272727272727272727272727272727272717171707070 7070707070706F6F6F6F6F6F6F6F6F1C242B1C242B1C242C0E1013030202060606060606000000 747471F6F6F5F6F3EFF6F3EFF6F3EFF9F6F2F5F3EFB1B0AF8382837F7E7E727272626463545657 31323514151B15161B1314180F10140C0D0F343337B1B0B2A7A7A7000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000101010D5D5D5B1B1B47C7C806867671A1A1D14161915171B2F32365A5A5D 6262646767696E6D70727074737175727172C0BDBBFBF8F4F7F4F0F6F3EFF6F3EFFFFCF8BDBCBA 131213020202060606050303090A0A1B22291D252C1C242B6F6F6F707070707070707070717171 717171717171727272727272727272727272737373737373747474747474757575757575757575 757575757575767676777777727272636363909090A1A1A1A1A1A1A2A2A2A2A2A2A2A2A2A3A3A3 A4A4A4A4A4A4A5A5A5A5A5A5A6A6A6A7A7A7A7A7A7A7A7A7A8A8A8A8A8A8A9A9A9AAAAAAAAAAAA ABABABABABABACACACADADADADADADAEAEAEAEAEAEAFAFAFB0B0B0B0B0B0B1B1B1B1B1B1B2B2B2 B3B3B3B3B3B3B4B4B4B4B4B4B5B5B5B6B6B6B6B6B6B6B6B6B7B7B7B8B8B8B9B9B9B9B9B9B9B9B9 BABABABBBBBBBBBBBBBCBCBCBCBCBCBDBDBDBEBEBEBEBEBEBFBFBFC0C0C0C0C0C0C1C1C1C1C1C1 C2C2C2C2C2C2C3C3C3C4C4C4C4C4C4C4C4C4C5C5C5C6C6C6C6C6C6C7C7C7C7C7C7C8C8C8C9C9C9 C9C9C9CACACACACACACACACACBCBCBCCCCCCCCCCCCCDCDCDCDCDCDCDCDCDCECECECFCFCFCFCFCF CFCFCFD0D0D0D0D0D0D1D1D1D1D1D1D2D2D2D2D2D2D2D2D2D3D3D3D3D3D3D4D4D4D4D4D4D5D5D5 D5D5D5D5D5D5D6D6D6D6D6D6D6D6D6D7D7D7D7D7D7D7D7D7D7D7D7D8D8D8D8D8D8D8D8D8D9D9D9 D9D9D9D9D9D9D9D9D9D9D9D9DADADADADADADADADADADADADBDBDBDBDBDBDBDBDBDBDBDBDBDBDB DBDBDBDBDBDBDBDBDBDCDCDCDCDCDCDCDCDCDCDCDCDBDBDBDCDCDCDCDCDCDCDCDCDCDCDCDCDCDC DCDCDCDCDCDCDBDBDBDCDCDCDCDCDCDCDCDCDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDB DBDBDBDADADADADADADADADADADADADADADAD9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D8D8D8D8D8D8 D8D8D8D8D8D8D7D7D7D7D7D7D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D5D5D5D5D5D5D4D4D4D4D4D4 D4D4D4D3D3D3D3D3D3D2D2D2D1D1D1D1D1D1D1D1D1D1D1D1D0D0D0CFCFCFCFCFCFCFCFCFCECECE CECECECDCDCDCDCDCDCCCCCCCCCCCCCBCBCBCBCBCBCACACAC9C9C9C9C9C9C9C9C9C8C8C8C8C8C8 C7C7C7C6C6C6C6C6C6C5C5C5C5C5C5C4C4C4C3C3C3C3C3C3C2C2C2C2C2C2C1C1C1C1C1C1C0C0C0 C0C0C0BFBFBFBEBEBEBEBEBEBDBDBDBDBDBDBCBCBCBCBCBCBBBBBBBABABABABABAB9B9B9B8B8B8 B8B8B8B7B7B7B7B7B7B6B6B6B6B6B6B5B5B5B4B4B4B3B3B3B3B3B3B2B2B2B1B1B1B1B1B1B1B1B1 B0B0B0B0B0B0AFAFAFAEAEAEAEAEAEADADADADADADACACACABABABABABABAAAAAAAAAAAAA9A9A9 A8A8A8A8A8A8A7A7A7A7A7A7A6A6A6A6A6A6A5A5A5A5A5A5A4A4A4A4A4A4A3A3A3A3A3A3A2A2A2 A2A2A2A1A1A1A0A0A0A0A0A0919191626262707070767676767676757575757575757575757575 747474747474737373737373727272727272727272727272717171717171717171707070707070 6F6F6F6F6F6F6F6F6F1C242B1C242B1C242C0E1013030202060606060606000000747471F6F6F5 F6F3EFF6F3EFF6F3EFF9F6F2F5F2EEB0AFAD8282827E7E7D7071706061625255552F3133131519 15171B1215190F10160A0C0F333538B4B6B8A6A6A4000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000101010D5D5D5B3B3B47E7E826768681B1C1E13151813161B3032365A5B5E63636568696A 6E6E72727175727174737274C1BEBDFBF8F4F7F4F0F6F3EFF6F3EFFFFCF8BDBCBA131213020202 060606050303090A0A1B22291D252C1C242B6F6F6F707070707070717171717171717171727272 727272727272727272737373737373747474747474747474757575757575757575757575767676 767676747474636363929292A0A0A0A1A1A1A1A1A1A2A2A2A2A2A2A3A3A3A4A4A4A4A4A4A5A5A5 A5A5A5A5A5A5A6A6A6A7A7A7A7A7A7A8A8A8A9A9A9A9A9A9A9A9A9AAAAAAAAAAAAABABABACACAC ACACACADADADAEAEAEAEAEAEAFAFAFAFAFAFB0B0B0B0B0B0B1B1B1B2B2B2B2B2B2B3B3B3B3B3B3 B4B4B4B5B5B5B5B5B5B6B6B6B7B7B7B7B7B7B8B8B8B8B8B8B9B9B9B9B9B9BABABABBBBBBBBBBBB BCBCBCBDBDBDBDBDBDBEBEBEBEBEBEBFBFBFC0C0C0C0C0C0C1C1C1C1C1C1C2C2C2C2C2C2C3C3C3 C3C3C3C4C4C4C5C5C5C5C5C5C6C6C6C6C6C6C7C7C7C7C7C7C8C8C8C9C9C9C9C9C9CACACACACACA CBCBCBCBCBCBCCCCCCCCCCCCCDCDCDCDCDCDCECECECFCFCFCFCFCFCFCFCFD0D0D0D0D0D0D1D1D1 D1D1D1D1D1D1D2D2D2D2D2D2D3D3D3D3D3D3D4D4D4D4D4D4D5D5D5D5D5D5D6D6D6D5D5D5D6D6D6 D7D7D7D6D6D6D7D7D7D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D9D9D9D9D9D9D9D9D9D9D9D9DADADA DADADADADADADADADADBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDCDCDCDCDCDCDCDCDCDCDCDCDCDCDC DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDDDDDDDDDDDDDDDDDDDDDDDDDCDCDCDDDDDDDDDDDD DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDBDBDB DBDBDBDBDBDBDBDBDBDADADADADADADADADADADADAD9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D8D8D8 D8D8D8D8D8D8D8D8D8D7D7D7D6D6D6D6D6D6D6D6D6D5D5D5D6D6D6D5D5D5D5D5D5D4D4D4D4D4D4 D3D3D3D3D3D3D2D2D2D2D2D2D2D2D2D1D1D1D0D0D0D0D0D0D0D0D0CFCFCFCFCFCFCECECECECECE CDCDCDCDCDCDCDCDCDCCCCCCCBCBCBCBCBCBCACACACACACAC9C9C9C9C9C9C8C8C8C8C8C8C7C7C7 C6C6C6C6C6C6C6C6C6C4C4C4C4C4C4C4C4C4C3C3C3C3C3C3C2C2C2C1C1C1C1C1C1C0C0C0BFBFBF BFBFBFBEBEBEBDBDBDBDBDBDBCBCBCBCBCBCBBBBBBBBBBBBBABABAB9B9B9B9B9B9B8B8B8B8B8B8 B7B7B7B7B7B7B6B6B6B5B5B5B4B4B4B4B4B4B3B3B3B3B3B3B2B2B2B2B2B2B1B1B1B1B1B1B0B0B0 AFAFAFAEAEAEAEAEAEAEAEAEADADADACACACACACACABABABABABABAAAAAAAAAAAAA9A9A9A9A9A9 A8A8A8A7A7A7A7A7A7A6A6A6A6A6A6A5A5A5A5A5A5A4A4A4A3A3A3A3A3A3A2A2A2A2A2A2A2A2A2 A1A1A1A0A0A0A0A0A08E8E8E666666727272767676757575757575757575757575747474747474 7474747373737272727272727272727272727272727171717171717171717070707070706F6F6F 6F6F6F1C242B1C242B1C242C0E1013030202060606060606000000747472F6F6F5F6F3EFF6F3EF F5F3EFF9F6F2F5F2EEAFAFAC8181817D7D7D7071705F616053545730323514151A15161B121518 1012170A0C1033393AB6BABBA7A8A7000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000101010 D6D6D6B2B2B57C7D806767681A1B1D13161913151A3032365B5B5E64646669696B6F6E72737275 737274737273C1BFBCFBF8F4F7F4F0F6F3EFF6F3EFFFFCF8BDBCBA131213020202060606050303 090A0A1B22291D252C1C242B707070707070707070717171717171727272727272727272727272 7272727373737373737474747474747575757575757575757575757676767676767777776A6A6A 848484A0A0A0A1A1A1A1A1A1A1A1A1A2A2A2A2A2A2A3A3A3A4A4A4A4A4A4A5A5A5A5A5A5A6A6A6 A7A7A7A7A7A7A8A8A8A8A8A8A9A9A9A9A9A9AAAAAAAAAAAAABABABABABABACACACADADADADADAD AEAEAEAFAFAFAFAFAFAFAFAFB0B0B0B1B1B1B2B2B2B2B2B2B2B2B2B3B3B3B4B4B4B4B4B4B5B5B5 B6B6B6B6B6B6B7B7B7B8B8B8B8B8B8B9B9B9B9B9B9BABABABABABABBBBBBBCBCBCBDBDBDBDBDBD BEBEBEBEBEBEBFBFBFBFBFBFC0C0C0C1C1C1C1C1C1C2C2C2C3C3C3C3C3C3C3C3C3C4C4C4C4C4C4 C5C5C5C6C6C6C6C6C6C7C7C7C7C7C7C9C9C9C9C9C9C9C9C9CACACACACACACBCBCBCCCCCCCCCCCC CDCDCDCDCDCDCECECECECECECECECECFCFCFD0D0D0D0D0D0D1D1D1D1D1D1D1D1D1D2D2D2D2D2D2 D3D3D3D3D3D3D3D3D3D4D4D4D4D4D4D5D5D5D5D5D5D6D6D6D6D6D6D6D6D6D7D7D7D7D7D7D8D8D8 D8D8D8D8D8D8D9D9D9D9D9D9D9D9D9D9D9D9DADADADADADADADADADADADADBDBDBDBDBDBDBDBDB DBDBDBDBDBDBDCDCDCDCDCDCDCDCDCDCDCDCDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD DDDDDDDDDDDDDDDDDDDDDDDDDEDEDEDDDDDDDDDDDDDEDEDEDDDDDDDEDEDEDDDDDDDDDDDDDDDDDD DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDCDCDCDCDCDCDCDCDCDCDCDCDBDBDB DBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDADADADADADADADADADADADAD9D9D9D9D9D9D9D9D9D9D9D9 D8D8D8D8D8D8D7D7D7D7D7D7D7D7D7D7D7D7D6D6D6D5D5D5D5D5D5D5D5D5D5D5D5D4D4D4D3D3D3 D3D3D3D3D3D3D2D2D2D2D2D2D1D1D1D1D1D1D1D1D1D0D0D0D0D0D0CFCFCFCECECECECECECECECE CDCDCDCCCCCCCCCCCCCBCBCBCBCBCBCBCBCBCACACAC9C9C9C9C9C9C8C8C8C8C8C8C7C7C7C6C6C6 C6C6C6C6C6C6C5C5C5C4C4C4C4C4C4C3C3C3C3C3C3C2C2C2C1C1C1C1C1C1C0C0C0BFBFBFBFBFBF BEBEBEBEBEBEBDBDBDBCBCBCBCBCBCBBBBBBBABABABABABAB9B9B9B9B9B9B8B8B8B7B7B7B7B7B7 B6B6B6B6B6B6B5B5B5B5B5B5B4B4B4B3B3B3B3B3B3B2B2B2B1B1B1B1B1B1B0B0B0B0B0B0AFAFAF AFAFAFAEAEAEADADADADADADACACACABABABABABABAAAAAAAAAAAAA9A9A9A8A8A8A8A8A8A7A7A7 A7A7A7A7A7A7A6A6A6A5A5A5A5A5A5A4A4A4A4A4A4A3A3A3A2A2A2A2A2A2A1A1A1A1A1A1A0A0A0 A0A0A09F9F9F838383696969767676767676757575757575757575747474747474737373737373 7373737272727272727272727272727272727171717171717070707070706F6F6F6F6F6F1C242B 1C242B1C242C0E1013030202060606060606000000757472F7F6F5F6F3EFF6F3EFF5F3EFF9F6F2 F5F2EEADADAA7F807E7D7D7C6F6F6E5E61605354562F303413141A15161B1214190E10160B0D10 303337ADB0B4A4A4A4000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000101010D5D5D5B3B4B7 7D7E7E65646519191C14161913151A2F31355B5C5E65646769696B6F6E71737276747376747274 C1BEBBFBF8F4F7F4F0F6F3EFF6F3EFFFFCF8BDBCBA131213020202060606050303090A0A1B2229 1D252C1C242B707070707070707070717171717171727272727272727272727272727272737373 7373737474747474747575757575757575757575757676767676767272726969699F9F9FA0A0A0 A1A1A1A1A1A1A2A2A2A2A2A2A3A3A3A3A3A3A4A4A4A5A5A5A5A5A5A5A5A5A6A6A6A7A7A7A7A7A7 A8A8A8A8A8A8A9A9A9AAAAAAAAAAAAABABABABABABACACACACACACADADADAEAEAEAEAEAEAFAFAF B0B0B0B0B0B0B1B1B1B2B2B2B2B2B2B2B2B2B3B3B3B4B4B4B4B4B4B5B5B5B6B6B6B6B6B6B7B7B7 B7B7B7B8B8B8B8B8B8B9B9B9BABABABBBBBBBBBBBBBBBBBBBCBCBCBDBDBDBEBEBEBEBEBEBFBFBF BFBFBFC0C0C0C0C0C0C1C1C1C1C1C1C2C2C2C3C3C3C3C3C3C4C4C4C5C5C5C5C5C5C6C6C6C7C7C7 C7C7C7C8C8C8C8C8C8C9C9C9C9C9C9CACACACACACACBCBCBCBCBCBCCCCCCCDCDCDCDCDCDCECECE CECECECFCFCFCFCFCFD0D0D0D0D0D0D1D1D1D1D1D1D2D2D2D2D2D2D2D2D2D3D3D3D3D3D3D4D4D4 D4D4D4D5D5D5D5D5D5D6D6D6D6D6D6D6D6D6D7D7D7D7D7D7D7D7D7D8D8D8D8D8D8D9D9D9D9D9D9 D9D9D9DADADADADADADADADADADADADBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDCDCDCDCDCDCDCDCDC DCDCDCDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDEDEDEDEDEDEDDDDDDDEDEDEDEDEDEDEDEDE DEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDE DEDEDEDDDDDDDEDEDEDEDEDEDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDCDCDCDCDCDCDCDCDC DCDCDCDCDCDCDBDBDBDBDBDBDBDBDBDBDBDBDADADADADADADADADADADADAD9D9D9D9D9D9D8D8D8 D8D8D8D8D8D8D8D8D8D7D7D7D7D7D7D6D6D6D6D6D6D6D6D6D5D5D5D5D5D5D4D4D4D4D4D4D4D4D4 D3D3D3D3D3D3D2D2D2D2D2D2D1D1D1D0D0D0D0D0D0CFCFCFCFCFCFCFCFCFCECECECDCDCDCDCDCD CDCDCDCCCCCCCBCBCBCBCBCBCACACACACACAC9C9C9C9C9C9C8C8C8C7C7C7C7C7C7C6C6C6C6C6C6 C6C6C6C5C5C5C4C4C4C4C4C4C3C3C3C2C2C2C2C2C2C1C1C1C1C1C1C0C0C0BFBFBFBFBFBFBEBEBE BDBDBDBDBDBDBCBCBCBCBCBCBBBBBBBBBBBBBABABAB9B9B9B9B9B9B8B8B8B7B7B7B7B7B7B6B6B6 B6B6B6B5B5B5B4B4B4B4B4B4B3B3B3B2B2B2B2B2B2B1B1B1B0B0B0B0B0B0AFAFAFAFAFAFAEAEAE AEAEAEADADADACACACACACACABABABABABABAAAAAAAAAAAAA9A9A9A8A8A8A8A8A8A7A7A7A7A7A7 A6A6A6A5A5A5A5A5A5A4A4A4A4A4A4A4A4A4A3A3A3A2A2A2A2A2A2A1A1A1A1A1A1A0A0A0A0A0A0 9E9E9E696969727272767676757575757575757575757575747474747474747474737373737373 7272727272727272727272727272727171717171717070707070706F6F6F1C242B1C242B1C242C 0E1013030202060606060606000000747472F6F6F6F6F3EFF6F3EFF5F2EFF9F6F2F5F2EEACABA8 7D7E7C7D7C7C6F6F6F5D605F5354542E303312131814151A1213180F10160D0D10313537B1B4B7 A3A4A3000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000101010D7D6D7AFB0B37C7C80686768 19191B1415191214183032355C5D6066666869696A6F6E70747276747477737374C0BEBBFBF8F4 F7F4F0F6F3EFF6F3EFFFFCF8BDBBBA131313020202060606050303090A0A1B22291D252C1C242B 707070707070717171717171727272727272727272727272727272737373737373747474747474 7575757575757575757575757676767676767676766C6C6C7E7E7EA0A0A0A1A1A1A1A1A1A2A2A2 A2A2A2A3A3A3A3A3A3A4A4A4A4A4A4A5A5A5A5A5A5A6A6A6A7A7A7A7A7A7A8A8A8A8A8A8A9A9A9 A9A9A9AAAAAAABABABABABABACACACACACACADADADADADADAEAEAEAFAFAFAFAFAFB0B0B0B0B0B0 B1B1B1B1B1B1B2B2B2B3B3B3B4B4B4B4B4B4B5B5B5B5B5B5B6B6B6B7B7B7B7B7B7B8B8B8B8B8B8 B9B9B9BABABABABABABBBBBBBCBCBCBCBCBCBDBDBDBDBDBDBEBEBEBFBFBFBFBFBFC0C0C0C0C0C0 C1C1C1C2C2C2C2C2C2C3C3C3C4C4C4C4C4C4C5C5C5C5C5C5C6C6C6C7C7C7C7C7C7C8C8C8C8C8C8 C9C9C9C9C9C9CACACACACACACBCBCBCCCCCCCCCCCCCDCDCDCDCDCDCECECECECECECFCFCFCFCFCF D0D0D0D0D0D0D1D1D1D1D1D1D2D2D2D2D2D2D3D3D3D3D3D3D4D4D4D4D4D4D4D4D4D5D5D5D5D5D5 D6D6D6D6D6D6D6D6D6D7D7D7D7D7D7D8D8D8D8D8D8D9D9D9D9D9D9D9D9D9D9D9D9DADADADADADA DBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDCDCDCDCDCDCDCDCDCDCDCDCDDDDDDDDDDDDDDDDDDDDDDDD DEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDFDFDFDEDEDEDFDFDFDFDFDFDFDFDFDFDFDF DFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDEDEDE DFDFDFDFDFDFDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDCDCDC DCDCDCDCDCDCDCDCDCDBDBDBDBDBDBDBDBDBDBDBDBDADADADADADADADADAD9D9D9D9D9D9D8D8D8 D8D8D8D8D8D8D7D7D7D7D7D7D7D7D7D6D6D6D6D6D6D6D6D6D5D5D5D4D4D4D4D4D4D4D4D4D3D3D3 D3D3D3D2D2D2D2D2D2D1D1D1D1D1D1D0D0D0D0D0D0CFCFCFCFCFCFCECECECECECECDCDCDCDCDCD CCCCCCCCCCCCCBCBCBCBCBCBCACACAC9C9C9C9C9C9C8C8C8C8C8C8C7C7C7C6C6C6C6C6C6C5C5C5 C5C5C5C4C4C4C4C4C4C3C3C3C2C2C2C2C2C2C1C1C1C0C0C0C0C0C0BFBFBFBFBFBFBEBEBEBEBEBE BDBDBDBCBCBCBCBCBCBBBBBBBABABABABABAB9B9B9B9B9B9B8B8B8B7B7B7B6B6B6B6B6B6B5B5B5 B5B5B5B4B4B4B3B3B3B3B3B3B2B2B2B2B2B2B1B1B1B0B0B0B0B0B0AFAFAFAFAFAFAEAEAEADADAD ADADADACACACACACACABABABAAAAAAAAAAAAA9A9A9A9A9A9A8A8A8A8A8A8A7A7A7A7A7A7A6A6A6 A5A5A5A5A5A5A4A4A4A4A4A4A3A3A3A2A2A2A2A2A2A2A2A2A1A1A1A1A1A1A0A0A09F9F9F7E7E7E 6C6C6C767676757575757575757575757575757575747474747474737373737373727272727272 7272727272727272727171717171717070707070706F6F6F1C242B1C242B1C242C0E1013030202 060606060606000000757472F7F6F6F6F3EFF6F3EFF5F2EEF9F6F2F5F2EEABABA87D7E7C7B7B7A 6D6D6F5E60605152532C2E3112151914151A1213180F10160A0C10313536B4B8B6A6A7A6000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000101010D5D6D5B1B1B37C7C7E64656718191B141518 1314193132365D5E616665686A696C6F6F71747476757477767477C1C0BEFBF8F4F7F4F0F6F3EF F6F3EFFFFDF9BCBAB9121212020202060606050303090A0A1B22291D252C1C242B707070717171 717171727272727272727272727272727272737373737373737373747474757575757575757575 757575767676767676767676777777686868939393A1A1A1A1A1A1A1A1A1A2A2A2A2A2A2A3A3A3 A4A4A4A4A4A4A5A5A5A6A6A6A6A6A6A6A6A6A7A7A7A7A7A7A8A8A8A9A9A9A9A9A9AAAAAAABABAB ABABABACACACACACACADADADADADADAEAEAEAEAEAEAFAFAFB0B0B0B0B0B0B1B1B1B1B1B1B2B2B2 B3B3B3B3B3B3B4B4B4B5B5B5B5B5B5B6B6B6B6B6B6B7B7B7B8B8B8B8B8B8B9B9B9BABABABABABA BBBBBBBBBBBBBCBCBCBCBCBCBEBEBEBEBEBEBEBEBEBFBFBFC0C0C0C0C0C0C1C1C1C1C1C1C2C2C2 C3C3C3C4C4C4C4C4C4C4C4C4C6C6C6C6C6C6C6C6C6C7C7C7C7C7C7C8C8C8C9C9C9C9C9C9CACACA CACACACBCBCBCBCBCBCCCCCCCDCDCDCDCDCDCECECECECECECFCFCFD0D0D0D0D0D0D0D0D0D1D1D1 D1D1D1D2D2D2D2D2D2D3D3D3D3D3D3D4D4D4D4D4D4D5D5D5D5D5D5D5D5D5D6D6D6D6D6D6D7D7D7 D7D7D7D8D8D8D8D8D8D9D9D9D9D9D9D9D9D9D9D9D9DADADADADADADBDBDBDBDBDBDBDBDBDBDBDB DCDCDCDCDCDCDDDDDDDCDCDCDDDDDDDDDDDDDDDDDDDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDE DFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFE0E0E0E0E0E0E0E0E0E0E0E0DFDFDFE0E0E0 DFDFDFE0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0DFDFDFE0E0E0DFDFDFE0E0E0DFDFDFDFDFDF DFDFDFDFDFDFDEDEDEDFDFDFDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDDDDDDDDDDDDDDDDDDDDDDDD DCDCDCDCDCDCDCDCDCDBDBDBDBDBDBDBDBDBDBDBDBDADADADADADADADADAD9D9D9D9D9D9D8D8D8 D8D8D8D8D8D8D7D7D7D7D7D7D6D6D6D6D6D6D6D6D6D6D6D6D5D5D5D4D4D4D4D4D4D3D3D3D3D3D3 D3D3D3D2D2D2D1D1D1D1D1D1D0D0D0D0D0D0D0D0D0CFCFCFCECECECECECECDCDCDCDCDCDCDCDCD CBCBCBCBCBCBCBCBCBCACACACACACAC9C9C9C8C8C8C8C8C8C7C7C7C6C6C6C6C6C6C5C5C5C5C5C5 C4C4C4C4C4C4C3C3C3C2C2C2C1C1C1C1C1C1C1C1C1BFBFBFBFBFBFBFBFBFBEBEBEBDBDBDBDBDBD BCBCBCBBBBBBBBBBBBBABABAB9B9B9B9B9B9B8B8B8B8B8B8B7B7B7B6B6B6B6B6B6B5B5B5B5B5B5 B4B4B4B4B4B4B3B3B3B2B2B2B2B2B2B1B1B1B0B0B0B0B0B0AFAFAFAEAEAEAEAEAEADADADACACAC ACACACABABABABABABABABABAAAAAAA9A9A9A8A8A8A8A8A8A7A7A7A7A7A7A6A6A6A6A6A6A5A5A5 A5A5A5A4A4A4A4A4A4A3A3A3A3A3A3A2A2A2A1A1A1A1A1A1A1A1A1A0A0A0929292676767767676 767676767676757575757575757575757575747474737373737373727272727272727272727272 7272727171717171717070707070706F6F6F1C242B1C242B1C242C0E1013030202060606060606 000000757473F7F6F5F6F3EFF6F3EFF5F2EEF9F6F2F5F2EEABABA87D7D7C7A7A796E6E6D5F6060 5051522B2E3112151814151A1213180F10150C0D10303435AFB1B3A6A4A6000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000101010D6D7D6B3B2B47D7C7E61636417171A131519131518333438 5D5D606665676A6A6C707073747376767679777679C2BFBEFBF8F4F7F4F0F6F3EFF6F3EFFFFDF9 BCBAB9121212020202060606050303090A0A1B22291D252C1C242B707070717171717171727272 727272727272727272727272737373737373737373747474757575757575757575757575767676 7676767676767777776565659C9C9CA1A1A1A1A1A1A2A2A2A2A2A2A3A3A3A3A3A3A4A4A4A5A5A5 A5A5A5A6A6A6A6A6A6A7A7A7A7A7A7A8A8A8A8A8A8A9A9A9A9A9A9AAAAAAABABABABABABACACAC ACACACADADADAEAEAEAEAEAEAFAFAFAFAFAFB0B0B0B0B0B0B1B1B1B2B2B2B2B2B2B3B3B3B4B4B4 B4B4B4B5B5B5B6B6B6B6B6B6B7B7B7B7B7B7B8B8B8B9B9B9B9B9B9BABABABBBBBBBBBBBBBCBCBC BDBDBDBDBDBDBEBEBEBEBEBEBFBFBFC0C0C0C0C0C0C1C1C1C2C2C2C2C2C2C3C3C3C3C3C3C4C4C4 C4C4C4C5C5C5C6C6C6C7C7C7C7C7C7C7C7C7C8C8C8C9C9C9C9C9C9CACACACBCBCBCBCBCBCCCCCC CCCCCCCDCDCDCDCDCDCECECECFCFCFCFCFCFCFCFCFD0D0D0D0D0D0D1D1D1D2D2D2D2D2D2D2D2D2 D3D3D3D3D3D3D4D4D4D5D5D5D5D5D5D6D6D6D6D6D6D7D7D7D7D7D7D7D7D7D7D7D7D8D8D8D9D9D9 D9D9D9D9D9D9D9D9D9DADADADADADADBDBDBDBDBDBDBDBDBDCDCDCDCDCDCDCDCDCDCDCDCDDDDDD DDDDDDDDDDDDDEDEDEDEDEDEDEDEDEDEDEDEDFDFDFDEDEDEDFDFDFDFDFDFDFDFDFDFDFDFE0E0E0 E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0 E1E1E1E0E0E0E1E1E1E1E1E1E1E1E1E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0DFDFDFE0E0E0 DFDFDFDFDFDFDFDFDFDFDFDFDEDEDEDFDFDFDEDEDEDEDEDEDEDEDEDEDEDEDDDDDDDDDDDDDDDDDD DDDDDDDCDCDCDCDCDCDCDCDCDBDBDBDBDBDBDBDBDBDADADADADADADADADAD9D9D9D9D9D9D8D8D8 D8D8D8D8D8D8D7D7D7D6D6D6D6D6D6D6D6D6D5D5D5D5D5D5D4D4D4D4D4D4D4D4D4D3D3D3D3D3D3 D2D2D2D2D2D2D1D1D1D1D1D1D0D0D0CFCFCFCFCFCFCECECECECECECDCDCDCDCDCDCCCCCCCCCCCC CBCBCBCACACACACACACACACAC9C9C9C8C8C8C8C8C8C7C7C7C6C6C6C6C6C6C5C5C5C5C5C5C4C4C4 C3C3C3C3C3C3C2C2C2C2C2C2C1C1C1C0C0C0C0C0C0BFBFBFBEBEBEBEBEBEBDBDBDBDBDBDBCBCBC BBBBBBBBBBBBBABABABABABAB8B8B8B8B8B8B8B8B8B7B7B7B7B7B7B6B6B6B5B5B5B4B4B4B4B4B4 B3B3B3B2B2B2B2B2B2B1B1B1B0B0B0B0B0B0AFAFAFAFAFAFAEAEAEAEAEAEADADADACACACACACAC ABABABABABABAAAAAAAAAAAAA9A9A9A8A8A8A8A8A8A7A7A7A7A7A7A6A6A6A5A5A5A5A5A5A4A4A4 A4A4A4A3A3A3A3A3A3A2A2A2A2A2A2A1A1A1A0A0A0A0A0A09D9D9D646464767676767676767676 757575757575757575757575747474737373737373737373727272727272727272727272717171 7171717171717070707070701C242B1C242B1C242C0E1013030202060606060606000000757472 F7F6F6F6F3EFF6F3EFF5F2EEF9F6F2F4F1EDAAAAA67C7C7B7A7B796D6E6D5D5E5F5151522B2D31 11141913161B1114191012170D0F12313636AFB1B3A4A4A6000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000101010D7D6D5B3B2B4807E8163626418181A1416191214183333385D5D60666567 6A6A6C70707374747776777A787679C2C0BDFBF8F4F7F4F0F6F3EFF6F3EFFFFDF9BCBAB9121212 020202060606050303090A0A1B22291D252C1C242B707070717171717171727272727272727272 727272727272737373737373747474747474757575757575757575757575767676767676777777 7777776363639F9F9FA1A1A1A1A1A1A2A2A2A3A3A3A3A3A3A1A1A19C9C9C9696969191918E8E8E 8D8D8D8E8E8E8F8F8F8F8F8F8F8F8F8F8F8F909090909090919191919191929292939393939393 9494949494949595959595959595959696969797979898989898989999999999999A9A9A9A9A9A 9A9A9A9B9B9B9B9B9B9C9C9C9D9D9D9D9D9D9E9E9E9F9F9F9F9F9FA0A0A0A0A0A0A0A0A0A0A0A0 A1A1A1A2A2A2A3A3A3A3A3A3A4A4A4A4A4A4A5A5A5A6A6A6A6A6A6A6A6A6A7A7A7A7A7A7A7A7A7 A8A8A8A9A9A9A9A9A9AAAAAAABABABABABABACACACACACACACACACADADADADADADAEAEAEAEAEAE AFAFAFAFAFAFB0B0B0B0B0B0B1B1B1B1B1B1B1B1B1B2B2B2B2B2B2B3B3B3B3B3B3B4B4B4B4B4B4 B5B5B5B5B5B5B6B6B6B6B6B6B6B6B6B7B7B7B7B7B7B7B7B7B7B7B7B8B8B8B9B9B9BABABABABABA BABABABBBBBBBBBBBBBBBBBBBCBCBCBCBCBCBCBCBCBDBDBDBDBDBDBDBDBDBEBEBEBEBEBEBEBEBE BEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBFBFBFBEBEBEBFBFBFBFBFBFBFBFBFC0C0C0BFBFBFC0C0C0 BFBFBFC0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0BFBFBFC0C0C0BFBFBFBFBFBF BFBFBFBFBFBFBEBEBEBFBFBFBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBDBDBDBDBDBD BDBDBDBCBCBCBCBCBCBBBBBBBBBBBBBBBBBBBBBBBBBABABABABABABABABAB9B9B9B9B9B9B8B8B8 B8B8B8B7B7B7B7B7B7B7B7B7B6B6B6B6B6B6B5B5B5B5B5B5B5B5B5B4B4B4B4B4B4B3B3B3B3B3B3 B2B2B2B2B2B2B1B1B1B1B1B1B0B0B0B0B0B0B0B0B0AFAFAFAFAFAFAEAEAEADADADADADADACACAC ACACACACACACABABABABABABAAAAAAAAAAAAA9A9A9A8A8A8A8A8A8A7A7A7A6A6A6A6A6A6A6A6A6 A6A6A6A5A5A5A4A4A4A3A3A3A3A3A3A3A3A3A2A2A2A1A1A1A1A1A1A0A0A0A0A0A0A0A0A09F9F9F 9F9F9F9E9E9E9D9D9D9D9D9D9C9C9C9B9B9B9B9B9B9A9A9A9A9A9A9A9A9A999999999999989898 979797979797969696959595959595959595959595949494939393939393929292919191919191 9090909090908F8F8F8F8F8F8F8F8F8E8E8E8E8E8E8E8E8E8D8D8D8D8D8D9191919595959C9C9C A1A1A1A2A2A2A2A2A2A1A1A1A1A1A1A0A0A0A0A0A0626262777777767676767676757575757575 757575757575747474747474737373737373737373727272727272727272727272717171717171 7070707070701C242B1C242B1C242C0E1013030202060606060606000000757473F7F6F5F6F3EF F6F3EFF5F2EEF9F6F2F4F2EDA8A8A67A7A79797A786C6E6F5E5F605253532C2E3011131913151A 1113180F10160D0D10323736B3B4B5A7A7A7000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 101010D7D6D6B5B5B7807E8263636517181914171912151A3233385D5C606666696C6B6E717174 76757878777A78777AC4C1BFFBF8F4F7F4F0F6F3EFF6F3EFFFFDF9BCBAB9121212020202060606 050303090A0A1B22291D252C1C242B717171717171717171727272727272727272727272737373 737373747474747474747474757575757575757575757575767676777777777777777777636363 9F9F9FA1A1A1A1A1A1A2A2A2A1A1A19B9B9B8E8E8EA7A7A8CACBCED9D9DDE7E8EDE8E9EEE8E9EE E8E9EEE8E9EEE8EAEEE8EAEEE8E9EEE9EAEFE9EAEFE9EAEFE9EAEFE9EBEFE9EAEFE9EBEFE9EAEF E9EBEFE9EBEFE9EAEFE9EAEFE9EBEFE9EAEFE9EAEFE9EBEFE9EBEFE9EAEFE9EAEFE9EAEFE9EBEF E9EBEFE9EAEFE9EAEFE9EAEFE9EBEFE9EBEFE9EBEFE9EAEFE9EAEFE9EAEFE9EBEFE9EBEFE9EBEF E9EBEFE9EBEFE9EBEFE9EBEFE9EBEFE9EBEFE9EBEFE9EAEFE9EBEFE9EBEFE9EBEFE9EAEFE9EBEF E9EBEFE9EBEFE9EBEFE9EBEFE9EAEFE9EBEFE9EBEFE9EAEFE9EBEFE9EBEFE9EAEFE9EBEFE9EBEF E9EAEFE9EAEFE9EAEFE9EAEFE9EAEFE9EBEFE9EAEFE9EAEFE9EBEFE9EAEFE9EAEFE9EBEFEAECF0 EAECF0EAECF0EAECF0EAEBF0EAEBF0EAECF0EAEBF0EAEBF0EAEBF0E9EBEFE9EBEFE9EAEFE9EAEF E9EBEFE9EBEFE9EAEFE9EBEFE9EBEFE9EAEFE9EBEFE9EBEFE9EAEFE9EAEFE9EAEFE9EAEFE9EAEF E9EAEFE9EAEFE9EAEFE9EAEFE9EAEFE9EAEFE9EAEFE9EBEFE9EAEFE9EAEFE9EBEFE9EBEFE9EAEF E9EAEFE9EAEFE9EAEFE9EAEFE9EAEFE9EAEFE9EAEFE9EAEFE9EAEFE9EBEFE9EAEFE9EBEFE9EAEF E9EAEFE9EAEFE9EAEFE9EBEFE9EAEFE9EAEFE9EBEFE9EAEFE9EAEFE9EBEFE9EAEFE9EAEFE9EBEF E9EBEFE9EAEFE9EAEFE9EAEFE9EBEFE9EAEFE9EAEFE9EBEFE9EBEFE9EBEFE9EAEFE9EAEFE9EBEF E9EAEFE9EBEFE9EBEFE9EBEFE9EBEFE9EAEFE9EAEFE9EBEFE9EBEFE9EBEFE9EBEFE9EBEFE9EBEF E9EBEFE9EAEFE9EBEFE9EAEFE9EBEFE8EAEEE8EAEEE8EAEEE8EAEEE8E9EEE8EAEEE8E9EEE8E9EE E8E9EEE8E9EEE8EAEEE8E9EEE8EAEEE8E9EEE8EAEEE8EAEEE8EAEEE8EAEEE8E9EEE8EAEEE8EAEE E8EAEEE8EAEEE8EAEEE8EAEEE8EAEEE8EAEEE8EAEEE8E9EEE8E9EEE8E9EEE8EAEEE8EAEEE8E9EE E8E9EEE8E9EEE8E9EEE8E9EEE8E9EEE8E9EEE8E9EEE8E9EEE8E9EEE8E9EEE8E9EEE8E9EEE8E9EE E8E9EEE8E9EEE8E9EEE8E9EEE8E9EEE8E9EEE8EAEEE8EAEEE8EAEEE8EAEEE8E9EEE8E9EEE8E9EE E8E9EEE8E9EEE8EAEEE8E9EEE8E9EEE8E9EEE8E9EEE8E9EEE8E9EEE8E9EEE8E9EEE8E9EEE7E8ED E7E8EDE7E8EDE7E9EDE7E8EDE7E8EDE7E8EDE7E9ECE6E7ECD8D8DCC8C9CCA7A7A88F8F8F9B9B9B A0A0A0A1A1A1A1A1A1A0A0A0A0A0A0626262777777767676767676757575757575757575757575 757575747474747474737373737373727272727272727272727272717171717171707070707070 1C242B1C242B1C242C0E1013030202060606060606000000757574F7F7F5F6F3EFF6F3EFF5F2EE F9F6F2F4F2EDA8A7A67A7B7A797A796C6D6D6062605456562F30321213181415191114170E1016 0B0D10323737B1B5B6A7A7A7000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000101010D7D6D7 B3B2B47E7E8163636318191B14161A14151A3335395E5D616767696B6B6E72727576757878777A 79787BC3C1BFFBF8F4F7F4F0F6F3EFF6F3EFFFFDF9BCBAB9121212020202060606050303090A0A 1B22291D252C1C242B717171717171717171727272727272727272727272737373737373747474 747474757575757575757575757575767676767676777777777777787878636363A0A0A0A1A1A1 A2A2A29F9F9F959595949595D7D8DCE5E7ECE2E4E9E1E3E8DFE1E7DFE1E7DFE1E7DFE1E7DFE1E7 DFE1E7DFE1E7DFE1E7DFE1E7DFE1E7DFE1E7DFE1E7DFE1E7DFE1E7DFE1E7DFE1E7DFE1E7DFE1E7 DFE1E7DFE1E7DFE1E7DFE1E7DFE1E7DFE1E7DFE1E7DFE1E7DFE1E7DFE1E7DFE1E7DFE1E7DFE1E7 DFE1E7DFE1E7DFE1E7DFE1E7DFE1E7DFE1E7DFE1E7DFE1E7DFE1E7DFE1E7E0E2E8E0E2E8E0E2E8 E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8 E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8 E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8 E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8 E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E1E3E9E1E3E9E1E3E9E1E3E9 E1E3E9E1E3E9E1E3E9E1E3E9E1E3E9E1E3E9E1E3E9E1E3E9E1E3E9E1E3E9E1E3E9E1E3E9E1E3E9 E1E3E9E1E3E9E1E3E9E1E3E9E1E3E9E1E3E9E1E3E9E1E3E9E1E3E9E1E3E9E1E3E9E1E3E9E1E3E9 E1E3E9E1E3E9E1E3E9E1E3E9E1E3E9E1E3E9E1E3E9E1E3E9E1E3E9E1E3E9E1E3E9E1E3E9E1E3E9 E1E3E9E1E3E9E1E3E9E1E3E9E1E3E9E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8 E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8 E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8 E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8 E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8E0E2E8 E0E2E8E0E2E8E0E2E8DFE1E7DFE1E7DFE1E7DFE1E7DFE1E7DFE1E7DFE1E7DFE1E7DFE1E7DFE1E7 DFE1E7DFE1E7DFE1E7DFE1E7DFE1E7DFE1E7DFE1E7DFE1E7DFE1E7DFE1E7DFE1E7DFE1E7DFE1E7 DFE1E7DFE1E7DFE1E7DFE1E7DFE1E7DFE1E7DFE1E7DFE1E7DFE1E7DFE1E7DFE1E7DFE1E7DFE1E7 DFE1E7DFE1E7DFE1E7DFE1E7DFE1E7DFE1E7E1E3E8E2E4E9E4E6EBD6D7DB9495959494949F9F9F A1A1A1A1A1A1A0A0A0626262777777777777767676767676757575757575757575757575747474 7474747474747373737272727272727272727272727272727171717171717070701C242B1C242B 1C242C0E1013030202060606060606000000757474F7F6F5F6F3EFF6F3EFF5F2EEF9F6F2F4F2ED A8A7A67A7A7A7979786B6D6D5F626155565531333511141813161A1113180E10150C0D10343738 B4B9B9A3A4A4000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000101010D7D5D7B1B0B37C7D80 6363641A1A1D15161915161A35353A5E5D6168676A6C6C6E73727577767878777A79797BC4C3C0 FBF8F4F7F4F0F6F3EFF6F3EFFFFDF9BCBAB7121210020202060606050303090A0A1B22291D252C 1C242B717171727272727272727272727272727272737373737373747474747474747474757575 757575757575757575767676767676777777787878787878646464A0A0A0A1A1A19E9E9E8F8F8F B3B3B6E3E4E8E0E2E7DDDFE5C7CBD6AEB2C2A1A8B89199AC929AAD9199AD939BAD929AAD929AAD 929AAD929AAD9199AD9199AD9199AD929AAD929AAD929AAD929AAD929AAD929AAD929AAD939BAE 939BAE949CAF939BAE929AAE929AAE939CAE949CAF939BAE949CAF949CAF949CAF949CAF939BAE 939BAE939BAF949CAF949CAF949CAF949CAF959DAF949CAF949CAF949CAF949CAF949CAF949CAF 949CAF939BAF959DB0959DB0959DB0959DB0969EB0959DB0959DB0959DB0959DB0959DB0959DB0 959DB0969EB0969EB1969EB1969EB1969EB0979FB2979FB2979FB2979FB2959DB1979FB2979FB1 979FB1979FB1969EB1969EB1979FB1969EB1969EB1959DB1969EB1969EB1969EB1969EB1979FB2 979FB2979FB2979FB2979FB2979FB2979FB2979FB2979FB2979FB2979FB2979FB2969EB2979FB2 969EB298A0B397A0B2979FB298A0B397A0B298A0B3979FB297A0B2979FB298A0B3979FB2969EB2 969EB2979FB2979FB2979FB298A0B3979FB3979FB3979FB3979FB3979FB3979FB3979FB3979FB3 98A0B398A0B398A0B398A0B3979FB3979FB398A0B3979FB398A0B398A1B398A1B398A0B399A1B3 99A1B499A1B499A1B498A0B399A1B4979FB2969EB298A0B397A0B2979FB2969EB2969EB2969EB2 979FB2969EB2979FB2979FB2979FB2979FB298A0B2979FB2969EB2979FB2979FB2979FB2979FB2 979FB2979FB298A0B2969EB2979FB2979FB2979FB2979FB299A0B4979FB2979FB2979FB2969EB1 969EB1969EB1969EB1979FB2979FB2969EB1969EB1969EB1969EB1969EB1959DB1979FB1969EB1 979FB1969EB1969EB1969EB1959DB0949CB0959DB0959DB0959DB0959DB0959DB0959DB0959DB0 969EB0959DB0959DB0959DB0949CB0959DB0959DB0949CAF939BAF939BAF959DB0959DB0949CAF 959DB0959DB0959DB0959DB0959DB0949CAF949CAF949CAF939BAE939BAE939BAE939BAE939BAE 939BAE939BAE939BAE939BAE929AAE929AAE939BAE929AAE939BAE939BAE939BAE9199AD929AAD 9199AD929AAD929AAD9199AD929AAD929AAD929AAD939BAE929BAD929AAD929AAD939BAE929BAD 929BAD919AAC929AADA0A7B8ADB1C1C6CAD5DDDFE5E0E2E7E4E5E9B3B3B68F8F8F9E9E9EA1A1A1 A1A1A1626262777777777777777777767676757575757575757575757575757575747474737373 7373737272727272727272727272727272727171717171717171711C242B1C242B1C242C0E1013 030202060606060606000000757574F7F7F5F6F3EFF6F3EFF5F2EEF9F6F2F5F2EEA7A6A4787878 7777776B6C6C5F61605254532F32331112171214191012170E10150D0D10373A3BB2B4B6A6A6A4 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000101010D7D7D7B2B2B47C7C806162621A1B1C 15161A15161A3435395F5E6168676A6D6C6F74737578777979787A7A797AC5C3C1FBF8F5F7F4F0 F6F3EFF6F3EFFFFDF8BBBAB7101210020202060606050303090A0A1B22291D252C1C242B717171 717171727272727272727272727272737373737373747474747474757575757575757575757575 757575767676777777777777787878787878646464A0A0A0A0A0A0919191BDBDC0E3E5EADDDFE5 D1D4DDA1A6B89096AB8F96AB8F96AB8F96AB8F96AB8E96AA8F96AB9198AC9198AC9097AC9198AC 9198AC9097AC9198AC9097AC9097AC9097AC9198AC9097AC9097AC9097AC9097AC9299AD9097AC 9198AD9198AD929AAE9198AD929AAE929AAE9198AD9299AD9198AD9198AD9299AD9299AD939AAE 939AAE939AAE939AAE9299AE9299AE939AAE9299AE939AAE9299AE9299AE9299AE939AAE9299AE 949BAF949BAF949BAF949BAF949BAF949BAF949BAF949BAF939AAF939AAF949BAF949BAF949BAF 949BAF949CB0949BAF949BAF959CB0959CB0949BB0959CB0949BB0959DB1949BB0959CB0959DB1 959CB0959CB0959CB0959CB0949BB0959CB0959CB0949BB0949BB0969DB1969DB1969DB1969DB1 959CB1969DB1959CB1969DB1969DB1969DB1959CB1959CB1969DB1969DB1969DB1969EB2969DB1 969DB1959CB1969DB1969DB1969DB1959CB1969DB1959CB1959CB1959CB1959CB1959CB1959CB1 959CB1959CB1959CB1969DB2969DB2959DB1969DB2969DB2969DB2979EB2959DB1969DB2969DB2 979EB2969DB2979EB2969DB2969DB2979EB2959DB1969DB2969DB2969DB2979FB3979EB2979EB2 959CB1979EB2979FB3979EB2959CB1959CB1959CB1959CB1969DB1959CB1959CB1969DB1959CB1 959CB1969DB1969DB1959CB1969DB1969DB1959CB1959CB1959CB1969DB1959CB1959CB1969DB1 959CB1969DB1959CB1969DB1959CB1959CB1969EB2949BB0969DB1969DB1959CB0949BB0959DB1 959CB0959DB1959DB1959CB0959CB0959CB0959CB0959CB0959CB0959CB0959CB0959CB0959CB0 959CB0959CB0959CB0939AAF939AAF949BAF949BAF949BAF949BAF949BAF949BAF949BAF949BAF 949BAF9299AE9299AE9299AE949BAF9299AE939AAE939AAE939AAE939AAE939AAE939BAF939AAE 9299AE9299AE9299AE939AAE9299AD939AAE939AAE9299AD9299AD9198AD9299AD9198AD9198AD 9299AD9198AD9299AD9198AD9198AD9097AC9097AC9097AC9097AC9198AC9097AC9097AC9097AC 9097AC9097AC9097AC9198AC9199AD9198AC9097AC8F97AB9198AC8F96AB9097AB8F96AB9097AB 8F96AB8F96AB8F96AB9097ACA1A6B8D1D5DDDDDFE5E2E4E9BCBCBF9090909F9F9FA1A1A1626262 777777777777777777767676757575757575757575757575757575747474747474737373737373 7272727272727272727272727272727171717171711C242B1C242B1C242C0E1013030202060606 060606000000757574F7F7F5F6F3EFF6F3EFF5F2EEF9F6F2F4F1EDA6A4A57777767678756B6B6C 5E5F605354553031350F10151213171112160E10140D0D10313338B3B5B9A7A7A7000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000101010D7D6D7B1B0B17B7B7E5F61611A1A1C15151A131519 35363A5E5E6168666A6D6C6F73737577777979797B7B7A7CC5C3C0FBF8F4F7F4F0F6F3EFF6F3EF FFFDF8BBBAB7101210020202060606050303090A0A1B22291D252C1C242B717171727272727272 727272727272737373737373737373747474757575757575757575757575767676767676767676 777777787878787878787878646464A1A1A1969696A7A8AAE0E2E8DDDEE5BABECB9097AC8D95A9 8D95AA8C95A98D95AA8D95AA8D95AA8D95AA8C95A98D95AA8E96AB8E96AB8E96AB8E96AB8E96AB 8E96AB8E96AB8D96AA8D96AA8E96AB8E96AB8D96AA8D96AA8E96AB8E96AB8F96AB8F97AB9097AC 9097AC9097AC8F97AB9098AC8F97AB9097AC9097AC9097AC9097AC9097AC9098AC8E97AB9198AD 9198AD9198AD9098AD9098AD9098AD9198AD9098AD9098AD9098AD9098AD9098AD9098AD9098AD 9198AD9199AE9199AE9299AE929AAE9199AE9299AE9299AE9299AE9299AE9299AE9299AE9199AD 9299AE929AAE929AAE939AAF939AAF939AAF939AAF939AAF939BAF939AAF929AAF929AAF929AAF 939AAF929AAF929AAF929AAF929AAF929AAF929AAF929AAF929AAF939BB0939BB0939BB0939BB0 939BB0939BB0939BB0949BB0949BB0939BAF949BB0949BB0949BB0949BB0949BB0949BB0949BB0 949BB0939BAF949BB0949BB0939BAF949BB0949BB0939BAF939BB0939BAF949CB1949CB1949CB1 949CB1949CB1939CB0949CB1939CB0949CB1939CB0939CB0949CB1949CB1939CB0949CB1949CB1 939CB0939CB0949CB0959CB1959CB1949CB0949CB0959CB1959CB1959CB1949CB0949CB0949CB0 959CB1959CB1959CB1959CB1949BB0949BB0949BB0949BB0939BB0949BB0939BB0939BB0939BB0 939BB0939BB0929BAF949BB0949BB0939BB0939BB0939BB0939BB0949BB0939BB0939BB0939BB0 949BB0949BB0939BB0939BB0949CB0939AAF939AAF939AAF939BAF939AAF939AAF939BAF939AAF 939AAF939BAF939AAF929AAF939BAF939AAF929AAF929AAF939AAF939AAF939AAF9299AE9199AE 9299AE9199AE9199AE9199AE9199AE9299AE9299AE9199AE9199AE9199AE9199AE9199AE9199AE 9098AD9098AD9198AD9198AD9198AD9098AC9198AD9198AD9198AD9198AD9198AD9198AD9198AD 9098AC9199AD8F97AC8F97AB9097AC8F97AC9097AC8F97AC8F97AC8F97AC8F97AC8E97AB8E97AB 8E97AB8E97AB8F97AC8E96AB8D96AA8E96AB8E96AB8F96AB8F96AB8D96AA8F96AB8E96AB8E96AB 8E96AA8F96AB8F96AB8E96AA8E96AA8F96AB8D95A98E95AA8E95AA8D95A98E95AA8D95A98E95AA 8C95A98D95A98E95AA9198ACBABECBDDDEE5E0E3E8A6A7A9979898A1A1A1636363787878777777 777777767676767676757575757575757575757575747474747474747474737373737373727272 7272727272727272727171717171711C242B1C242B1C242C0E1013030202060606060606000000 757573F7F7F5F6F3EFF6F3EFF5F2EEF9F6F2F4F1EDA5A4A277777576767569696A5E5E5F515253 3032351113171315191213170E10150F1012313236ADAFB3A7A7A7000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000101010D6D7D7B0B0B17E7E8061626319191D15171B13161935373A5D5E61 6767696D6D6F7473767878797A7A7C7C7A7DC6C3C1FBF8F4F7F4F0F6F3EFF6F3EFFFFDF8BBBAB7 101210020202060606050303090A0A1B22291D252C1C242B727272727272727272727272727272 727272737373737373747474757575757575757575757575767676767676767676777777787878 7878787878786464649D9D9D8A8A8ADBDDE1DCDEE4C1C5D18A92A88A92A88A92A88A92A88B93A8 8A92A88A92A88A92A88A92A88B93A88A92A88B93A88A92A88A92A88A92A88B93A98B93A98C94A9 8B93A98B93A98B93A98B93A98B93A98C94A98C94A88C94A88B93A98B93A98E95AA8E95AA8D95A9 8D95A98D95A98D95A98D95AA8D95A98D95AA8C94AA8C94AA8E95AA8F96AB8D95AA8D95AA8D95AB 8D95AB8D95AB8D95AB8E96AB8E96AB8E96AB8D95AB8D95AB8D95AB8E96AB8E96AB8D95AB8D95AB 8D95AB8F97AC8F97AC8F97AB8E96AC9097AC9097AC9097AC9097AC8F97AC9097AC9097AC9097AC 9198AD9098AC9198AD9198AD9098AD9198AD9098AC9098AD9098AC9098AD8F97AD8F97AD9098AD 9098AD9098AD9098AD9098AD9098AD8F97AD8F97AD8F97AD9199AE9098AE9199AE9098AE9199AE 9199AE9199AE9199AE9199AE9098AE9299AE9098AE9299AE9299AE9299AE9199AD9199AD9199AD 9199AD9299AE9299AE9098AE9098AE9199AD9199AE929AAE9098AE9098AE9098AE929AAF9199AF 9199AF9199AF9199AF9199AF9199AF9199AF9199AF8C95AC8791A98791A98791A98791A98892A9 8790A88892A98D96AC929AAE929AAE939AAF9199AF929AAE929AAE9199AF929AAE929AAE929AAE 929AAE929AAE929AAE9098AE9199AE9199AE9098AE9098AE9199AE9199AE9098AE9098AE9199AE 9098AE9098AE9098AE9098AE9098AE9098AE9199AE9199AE9098AE9098AE9199AE9098AE9199AE 9299AE9299AE9199AE9199AD9198AD9098AC9198AD9198AD9198AD9198AD9198AD9198AD9198AD 9198AD9198AD8F97AD9198AD9098AD9098AD9098AD8F97AC8E96AC8F97AC8F97AC8F97AC8E96AC 8E96AC8F97AC8F97AC8E96AC8F97AC8F97AC8E96AC8E96AC8E96AC8D95AB8E96AB8F97AB8F96AB 8E96AA8F96AB8F96AB8F96AB8F96AB8E96AA8F96AB8F96AB8F96AB8F96AB8E96AA8F96AB8E96AA 8F96AB8C94AA8D95A98C94AA8C94AA8E95AA8C94AA8C94AA8C94AA8D95AA8C94AA8C94AA8B93A9 8C94A98B93A98B93A98B93A98B93A98B93A98B93A98C94A88B93A98C94A98C94A88B93A98C94A8 8C94A88C94A88C94A88C94A88C94A88B93A78B93A78B93A78B93A78A92A88B93A78B93A78A92A8 8A92A88991A78A92A8C0C5D0DCDEE4D8D9DE8C8C8D9D9D9D636363787878787878787878777777 767676767676757575757575757575757575747474747474737373727272727272727272727272 7272727171717171711C242B1C242B1C242C0E1013030202060606060606000000757474F7F6F5 F6F3EFF6F3EFF4F1EDF9F6F2F3F1EDA4A3A17778777676766969695D5E5E525353313235111318 14161A1314190F10150D0D1036383AB1B2B4A7A7A7000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000101010D7D7D7ADADAE7C7D7E64646517181B13151914171B36373B5C5C5F6666686D6E70 747577797A7C7B7A7E7C7B7CC7C4C2FBF9F4F6F4EFF6F3EFF6F3EFFFFDF8BBBAB7101210020202 060606050303090A0A1B22291D252C1C242B727272727272727272727272727272737373737373 747474747474757575757575757575757575767676777777777777777777787878787878787878 636363969696A7A8A9DCDDE4D9DCE2929AAE8890A68890A58890A68890A58890A58890A58890A5 8890A68890A68890A58890A58890A68890A68890A68890A68991A78991A68991A68991A78991A6 8991A68991A78991A78991A68991A68991A78991A78991A78A92A78B93A88A92A88A92A88A92A8 8A92A88A92A88A92A88A92A78A92A88A93A88A92A88A92A88A92A78B94A98B93A98B94A98B93A9 8B93A98B93A98B93A98B93A98B93A98B93A88B94A98B93A98B93A98B93A98B94A98B93A98C95AA 8C94AA8C95AA8C94AA8C95AA8C95AA8C94AA8C94A98C94AA8C94AA8C94AA8C94AA8D95AA8C94AA 8D95AB8D95AB8D95AB8D96AB8D95AB8D95AB8D95AB8D95AB8D95AB8D95AB8D95AB8D95AB8D95AB 8D95AB8D95AA8D95AB8D95AB8E96AC8E96AC8E96AC8E96AC8E96AC8E97AC8E96AC8E96AC8E96AB 8E96AC8E96AC8E96AC8E96AC8E96AC8E96AC8E96AB8E96AC8E96AC8E96AB8F97AC8E96AC8E96AC 8E96AB8E96AC8E96AB8E96AB8F97AD8F97AC8D96AB8F97AC8F97AD8F97AD8F97AC8F97AD8F97AD 8F97AD8F97AD8F97AD8F97AC8F97AD858EA67A85A07A85A07A85A17A85A17A85A17A85A07A85A1 858EA68F98AD8F97AC8F97AD8F97AD8F97AC8F97AD8F97AC8F97AC8F97AC8F97AC8F97AD8F97AD 8F97AD8E96AC8E96AC8E96AC8E96AC8E97AC8E97AC8E96AC8E96AB8E97AC8E96AC8E96AB8E96AB 8E97AC8E96AC8E96AB8E96AB8E96AC8E96AC8E97AC8E96AC8E96AC8E96AC8E96AB8E96AB8E96AC 8E96AC8F97AC8D95AB8D95AB8D95AB8D95AB8D95AB8E96AB8D95AB8E96AB8D95AB8D96AB8E96AB 8D95AB8D95AB8D95AB8D95AB8D95AB8C94AA8C94AA8C94AA8C94AA8C94AA8C94AA8C94AA8C95AA 8C94AA8C94AA8C94AA8C94AA8C94AA8C94A98C95AA8B93A98B93A98B93A98B93A98B94A98B93A9 8B93A98B94A98B93A98B93A98B93A98C94A98B93A98B93A98B93A98B93A98A92A88A93A88A92A7 8A92A78A92A78A92A88A92A88A92A78A92A78A92A78A92A78A92A78A92A88991A68991A78991A7 8991A78991A68991A68991A68991A78991A68991A78991A78991A68991A78991A68890A58890A5 8890A58890A68890A58890A68890A68890A58890A68890A68890A68890A68890A58890A58890A6 8890A5949BAED9DCE2DCDEE4A7A8A9969696626262787878787878777777777777767676767676 757575757575757575757575747474747474737373737373737373727272727272727272727272 7171711C242B1C242B1C242C0E1013030202060606060606000000767574F7F7F5F6F3EFF5F2EE F5F2EEF9F6F2F4F1EDA3A3A1757574757674696B675E5F5F515355313437101217131419111418 0F10160D0D10313638B0B3B4A7A7A7000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000101010 D6D5D6AEAEB17D7E8164646519191B15161A14161A38393D5C5D606666696E6D707475777A7B7D 7C7B7E7D7C7CC7C4C2FBF8F4F6F3EFF6F3EFF6F3EFFFFCF8BBB9B7101210020202060606050303 090A0A1B22291D252C1C242B727272727272727272727272737373737373747474747474757575 7575757575757575757575757676767777777777777878787878787878787777776262628F8F8F C4C5C8DADDE3BDC2CD858EA4848DA3848DA3848DA3848DA3858DA3858EA4858EA4858EA4848DA3 858EA4858EA4858EA4858EA4848DA3858EA4858EA4858EA4858EA4858EA4868FA5868FA5868FA5 868FA5868FA5868FA5868FA5878FA5868FA5868FA5868FA5868FA5868FA5878FA58790A68790A6 8790A68790A68890A68890A68790A68790A68890A68790A68890A68790A68790A68891A78891A7 8991A78891A78891A78891A78790A68891A78991A78891A78891A78991A78991A78891A78A92A8 8992A88992A88A92A88A92A88A92A88A92A88A92A88A92A88B94A98A92A88992A88A92A88A93A9 8B93A98A93A98A93A98B93A98B93A98A93A98A93A98A93A98B93A98B93A98A93A98B93A98B93A9 8A93A98A93A98A93A98B94AA8B94AA8B94AA8B94AA8B94AA8B94AA8B94AA8C94AA8C94AA8B94AA 8B94AA8C94AA8B94AA8B94AA8B94AA8C94AA8B94AA8C94AA8B94AA8B94AA8B94AA8B94AA8A93A9 8A93A98B94AA8B94AA8B94AA8D95AB8C95AB8C95AB8D95AB8C95AB8C95AB8C95AB8C95AB8C95AB 8C95AB8C95AB8C95AB8891A8838DA6838DA6848DA6838DA6838DA6828CA5838DA68891A88C95AB 8C95AB8C95AB8B94AA8B94AA8C95AB8B94AA8C95AB8C95AB8C95AB8C95AB8C95AB8C95AB8B94AA 8B94AA8B94AA8A93A98C94AA8C94AA8C94AA8C94AA8B94AA8B94AA8C94AA8B94AA8C94AA8B94AA 8B94AA8B94AA8B94AA8C94AA8B94AA8C94AA8B94AA8B94AA8C94AA8C94AA8B94AA8B94AA8A93A9 8A93A98B93A98A93A98A93A98B93A98B93A98A93A98A93A98A93A98B93A98A93A98B93A98B93A9 8B93A98A93A98B93A98992A88A92A88992A88A92A88992A88992A88992A88A92A88992A88A92A8 8A92A88992A88992A88991A78891A78891A78891A78991A78991A78991A78891A78891A78A93A8 8891A78891A78891A78991A78890A68890A68790A68790A68790A68890A68890A68790A68890A6 8790A68790A68790A68790A6868FA5868FA5868FA5868FA5868FA5868FA5868FA5868FA5868FA5 868FA5868FA5868FA5868FA5868FA5848DA3858EA4858EA4858EA4858EA4858EA4858EA4858EA4 858EA4858EA4858EA4858EA4858EA4858EA4838CA2848DA3848DA3848DA3848DA3848DA3848DA3 BBC0CCDADDE3C4C5C88F8F8F616161777777787878777777777777777777767676757575757575 7575757575757474747474747373737373737373737272727272727272727272727272721C242B 1C242B1C242C0E1013030202060606060606000000767574F7F7F5F6F3EFF6F3EFF4F1EDF9F6F2 F3F0ECA3A2A07474747473726868665D5F5E5152533032360F12181214191013190E10150D0F12 323538B2B5B7A7A7A7000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000101010D5D4D5AFAEB2 7D7D8062626319191C15171A15171B38393D5D5D606866696E6D707475777C7B7D7C7B7E7D7B7D C8C5C2FBF8F4F6F3EFF6F3EFF6F3EFFFFCF8BBB9B6101010020202060606050303090A0A1B2229 1D252C1C242B727272727272727272727272737373737373747474747474757575757575757575 757575767676767676777777777777787878787878787878777777626262888888D3D5DBDADDE3 A1A7B8828BA2818AA1818AA1818AA1828BA1818AA1818AA1818AA1818AA1818AA1828BA2828BA2 838BA2828BA2828BA2838CA2838CA2828BA2828AA1828BA2828BA2838CA2828BA2838CA2838CA3 838CA3848DA3848DA3838CA3838CA3848DA3838CA3848DA3838CA3838CA3848DA3848DA4848DA4 858EA4848DA4858EA4858EA4858EA4858EA4858EA4848DA4858EA4848DA4858EA4868FA5858EA5 868FA5868FA5858EA5868FA58790A6868FA5868FA5868FA5868FA5868FA58790A6868FA68891A7 868FA68790A6868FA6868FA68790A68790A68790A68790A68790A68790A68790A68790A68891A7 8891A78790A78790A78790A78891A78790A78891A78891A78790A78891A78891A78790A78891A7 8891A78992A88992A88992A88891A88992A88891A88891A88891A88891A88992A88891A88992A8 8992A88891A88992A88992A88891A88992A88992A88891A88891A88891A88891A88891A88992A8 8891A88992A88992A88891A88992A98992A98992A98992A98992A98992A98A93A98992A98992A9 8992A98790A8858FA7858FA7858FA78690A78690A7858FA7858FA78790A88992A98A93A98992A9 8992A98991A88A93A98A93A98A93A98992A98992A88992A98992A88A93A98891A88891A88891A8 8992A88891A88992A88891A88992A88992A88992A88992A88891A88891A88992A88992A88891A8 8992A88891A88992A88992A88992A88992A88891A88891A88992A88891A78790A78891A78790A7 8891A78891A78891A78891A78891A78891A78891A78891A78891A78891A78891A78891A7868FA6 8790A68790A6868FA68790A68790A68790A6868FA68790A68790A6868FA6868FA68790A68790A6 858EA5868FA5868FA5868FA5868FA5858EA5868FA58790A6858EA5868FA5868FA5868FA5858EA4 858EA4858EA4848DA4848DA4848DA4858EA4858EA4848DA4858EA4848DA4848DA4858EA4848DA4 838CA3838CA3838CA3838CA3848DA3848DA3848DA3838CA3838CA3848DA3838CA3838CA2828BA2 838CA2828BA2828BA2828BA2828BA2828BA2838CA2828BA2838CA2828BA2828BA2828BA2828BA2 818AA18189A0818AA1818AA1818AA1818AA1828BA1818AA1818AA1818AA1818AA1A0A6B7DADDE3 D4D6DC878787616161777777787878787878777777777777767676767676757575757575757575 7474747474747474747373737373737373737272727272727272727272721C242B1C242B1C242C 0E1013030202060606060606000000767574F7F7F5F6F3EFF5F2EEF5F2EEF8F5F2F2EFECA2A1A1 7474757373726668675D5D5D5051522F32360F10161213171012170D10140D0F12323435ADAFB2 A7A7A7000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000101010D6D6D6AEADB07C7C7E606062 17181A14161914161B3B3B3F5F5F6168676A6E6D6F7475777C7B7E7D7B7E7F7C7CC8C5C3FBF8F4 F6F3EFF6F3EFF6F3EFFFFCF8BAB8B4101010020202060606050303090A0A1B22291D252C1C242B 727272727272727272727272737373747474747474747474757575757575757575757575767676 767676777777787878787878787878787878777777606060818181D8DAE0D9DCE28E95A980879F 7E879F7F879F80879F80879F80879F80879F80879F7E879F7F879F8088A08088A08188A08088A0 8088A08188A07F88A07F88A08188A08188A08188A08088A08088A08088A08289A18189A18189A1 8289A18189A18289A18289A18189A1828AA18289A18289A1838AA2838AA2828AA2838AA2828AA2 838AA2828AA2838AA2828AA2838AA2838AA2838AA2838AA2838AA2848BA3848BA3848BA3848BA3 848BA3838BA3848BA3848CA3848BA3848BA3848BA3848BA3858CA4858DA4858CA4858CA4858CA4 858CA4858CA4858CA4858CA4858CA4858CA4858CA4858CA4848CA4868DA5868DA5868DA5868DA5 868DA5868DA5868EA5868DA5868DA5868DA5868DA5868DA5868EA5868DA5868DA5878EA6878EA6 878EA6878EA6878EA6878EA6878EA6878FA6878EA6878EA6878EA6878EA6878EA6868EA6868EA6 878EA6868EA6878EA6878EA6878EA6868EA6868EA6878EA6878EA6878EA6868EA6868EA6878FA7 888FA7878FA7878FA7878FA7878FA7888FA7888FA7878FA7878FA7888FA7888FA7888FA77C86A1 727C9A717C9A717C9A717C9A717C9A727C9A727C9A7D86A1878FA7878FA7878FA7878FA7888FA7 888FA7878FA7878FA7878FA7878FA7888FA7878FA7878FA7878FA7878FA7878EA6878EA6878EA6 878EA6878EA6878EA6878FA6878EA6878EA6878EA6878EA6868EA6878EA6878EA6878EA6878EA6 868EA6878EA6878EA6878EA6878EA6878EA6878EA6878EA6878EA6868DA5868DA5868DA5868DA5 858DA5868DA5868DA5868DA5868DA5868DA5868DA5868EA5868EA5868DA5858CA4858DA4858CA4 858CA4848CA4858DA4858CA4858CA4858CA4858DA4858CA4858CA4858CA4858CA4858CA4848BA3 848BA3838BA3838BA3848BA3848BA3838BA3848BA3848BA3848BA3848BA3848BA3838BA3838AA2 838BA2838AA2838AA2828AA2838AA2828AA2828AA2838AA2828AA2828AA2838AA2838AA28289A1 8189A18189A18289A18189A18289A18189A18189A18189A18189A18289A18188A08088A08188A0 8188A08188A08188A08088A08088A08188A08188A08188A08088A08088A08188A08088A07F879F 7F879F7F879F80879F7F879F7F879F7F879F7F879F80879F7F879F8B93A7D9DCE2D9DBE2818181 5F5F5F767676787878787878787878777777767676767676757575757575757575757575747474 7474747373737373737272727272727272727272727272721C242B1C242B1C242C0E1013030202 060606060606000000767575F7F7F6F5F2EEF5F2EEF4F1EDF8F5F1F2EFECA09F9F727273737373 6768675C5C5C5151523033351012171314191012170E10160C0D10313433B2B4B6AAA8A8000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000101010D5D5D7B0B0B17C7D815E5F6018191B15171C 14161C3E3E4160606268676A6E6E6F7677797D7D7F7D7C7F7F7C7EC8C5C3FBF8F4F6F3EFF6F3EF F6F3EFFFFCF8BAB8B5101010020202060606050303090A0A1B22291D252C1C242B727272727272 727272737373737373747474747474757575757575757575757575767676767676777777777777 7878787878787878787777777676766060607E7E7ED9DCE2D8DBE1828BA17B849C7B849C7B849C 7B849C7B849C7B859C7C859D7C859D7C859D7C859D7C859D7B859C7B859C7C859D7C859D7C859D 7C859D7D869E7C869D7E869E7D859D7D869E7D869E7D859D7D869E7C859C7E869E7E869E7E869E 7E869E7E869E7E869E7E869E7E869E7E869E7E869E7E869E7E869E7F879F7F879F7F879F8088A0 7F879F7F879F8088A07F879F7F879F7F88A07F88A07F879F7F879F7F88A07E889F8088A08189A1 8189A18089A17F889F8089A18088A08088A08088A08189A1828AA28189A18189A1828AA2828AA2 828AA28189A1828AA28189A1828AA28189A18189A1828AA2838BA3828AA2828AA2838BA3828AA2 828AA2828AA2828AA2828AA2828AA2838BA3828AA2818AA1828AA2828AA2848CA4828BA3848CA4 848CA4838BA3848CA4838BA3838BA3828BA2828BA2848CA4838BA3828BA2848CA4828BA2838BA3 838BA3838BA3838BA3828BA2838BA3838BA3838BA3838BA3828BA2828BA2858DA5848CA4848DA5 838CA3848CA4848DA5848CA4848CA4848DA5848DA5848CA4848CA4848DA57B869F747E9A737E9B 737E9B737E99747E9A747E9A737E997B859E858DA5838CA3848CA4848CA4838CA3858DA5848CA4 838CA3848CA4848CA4848CA4848CA4848CA4838BA3838BA3838BA3838BA3838BA3838BA3848CA4 838CA4838BA3828BA2838BA3838BA3838BA3848CA4848CA4838CA4828BA2838BA3838BA3838BA3 848CA4838BA3838BA3848CA4838BA3838BA3818AA1828AA2828AA2828AA2838BA3828AA2828AA2 838BA3828AA2838BA3828AA2838BA3838BA3828AA28189A18189A18189A1828AA2828AA2818AA2 8189A1818AA2828AA28189A18189A1818AA28089A18089A18089A18088A08088A08088A08088A0 8088A08088A07F889F8189A18088A08088A08088A07F879F8088A07E879E7F879F7F879F7F879F 7F879F7F879F8088A07F879F7F879F8088A07F879F7E869E7D869D7E869E7E869E7E869E7E869E 7E869E7E879F7E879F7D869D7D869E7E869E7D859D7D859D7D859D7C859C7D859D7C859C7D859D 7D859D7D859D7D859D7D859D7D859D7B849B7C849C7B849B7C849C7C849C7C849C7C849C7B849B 7C849C7C849C7C849C7D859D7C849C7C849C7B839B7C859CD8DBE1D8DBE17D7D7D5E5E5E757575 777777787878787878777777777777767676767676757575757575757575757575747474747474 7373737373737373737272727272727272721C242B1C242B1C242C0E1013030202060606060606 000000767575F7F7F6F5F2EEF5F2EEF3F0ECF8F6F1F2EFEBA09F9D7373717473736666665B5C5B 5053543033351112181215191213180D0F150C0D10333637B2B5B5A8A7A7000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000101010D7D7D7B0B0AF7D808161626315171916171C13151B3B3C3E 605F6268676A6F6F7178777A7C7D7F7E7D7F807D80C9C6C4FBF8F4F6F3EFF6F3EFF6F3EFFFFCF8 BAB8B4101010020202060606050303090A0A1B22291D252C1C242B727272727272727272737373 737373747474747474757575757575757575757575767676767676777777787878787878787878 7878787878787575755F5F5F7B7B7BD7DAE0D7DAE079829978809977809878809978809979819A 79819A78819979819A79819A79819A78819979819A7A829B78819979819A79819A79819A7A829B 7A829B7A829B7B839C7A829B7A829B7A829B7A829B7A829B7A839C7A839C7B849D7B849D7B849D 7B849D7B849D7B849D7B849D7C849D7C849D7B839C7B849D7B849D7D859E7C849D7D859E7C859E 7C859E7D859E7C859E7C849D7C849D7D859E7D859E7D859E7D859E7E869F7E869F7E869F7E869F 7D859E7E869F7E869F7D859E7E869F7D869F7D869F7F87A07E87A07E87A07F87A07E87A07E87A0 7F87A07F87A07F87A07F87A07F87A07E87A07F87A08088A18088A17F88A18088A18088A18088A1 8088A17F87A08088A17F87A08088A17F87A07F88A18088A17F87A08189A28088A18088A18189A2 8189A28088A18189A28189A28089A28089A28189A28089A28089A28189A28089A28089A28089A2 8089A28089A28089A28089A28189A28089A2818AA3818AA3818AA38189A2828AA3818AA3818AA3 8189A2818AA3818AA38189A28189A2818AA38189A28189A2828AA38089A18189A28189A28189A2 8189A2818AA3818AA3818AA3818AA3818AA3828AA3818AA3828AA3818AA3818AA3818AA3818AA3 818AA3818AA3818AA3818AA3818AA3818AA3818AA38089A28089A28088A18189A28089A28088A1 8189A28088A18189A28189A28189A28088A18088A18089A28088A18189A28189A28088A18189A2 8189A28089A28189A27F88A17F88A18088A18088A18088A17F88A17F88A18088A17F88A18088A1 7F88A18088A18088A18088A18088A17F87A07E869F7F87A07E87A07F87A07F87A07F87A07F87A0 7E869F7F87A07F87A07F87A07E869F7E869F7E869F7E869F7E869F7D859E7E869F7E869F7D869F 7D869F7D869F7E869F7D869F7C859E7C859E7C859E7C859E7C859E7C859E7D859E7C859E7C849D 7C859E7C859E7D859E7B849D7B839C7B849D7B849D7B849D7B849D7B849D7C849D7C849D7C849D 7B839C7A839B7B839C7A829B7A829B7B839C7A839C7A839C7A839C7A839C7A839C79829A7B839C 7A839C79829B7A829B7A829B79819A79819A79829B79829B79819A7A829B79829B79829B79829B 78819A79819A78819A78819A78819A78819AD7DAE0D7DAE07B7B7B5C5C5C757575777777787878 787878777777777777777777767676757575757575757575757575747474747474737373737373 7272727272727272727272721C242B1C242B1C242C0E1013030202060606060606000000767575 F7F7F5F5F2EEF4F1EEF4F1EDF8F6F1F1EEEB9F9E9C7171707171716665655C5D5C5154542E3233 1010171214181113180D0D140C0D10323738B0B4B6A8A8A7000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000101010DAD9D9AEAEB07D7D8162636415161A13151A1213193B3B3E605F6368676A 6F6F7278787A7D7C7F7D7D7F817E80CAC6C4FBF8F4F6F3EFF6F3EFF6F3EFFFFCF8BAB8B4101010 020202060606050303090A0A1B22291D252C1C242B727272727272737373737373737373747474 747474757575757575757575767676767676777777777777777777787878787878787878777777 7575755D5D5D787878D6D9E0D6D9E0778198757E97757E97757F97757E97757E97757E97757E97 757E97767F98767F98778199768098757E98767F98767F98767F98778199767F98767F98767F98 77809977819977819977809977809977809977819977819978809977809978829A78809978829A 79819A78829A78829A78819A78829A78819A78819A79839B79839B79839B79839B79829B79839B 79829B79839B79829B79829B79829B7A849C79829B7A849C7A849C7A839C7A839C7B839C7A849C 7A849C7A839C7A849C7A849C7B859D7B859D7B859D7B859D7B859D7C849D7B859D7B849D7B859D 7B859D7B859D7B849D7B849D7C869E7C869E7C869E7C869E7C859E7C869E7C869E7C869E7C869E 7D879F7C859E7C859E7C869E7C869E7C859E7C859E7D879F7E88A07D879F7D879F7D879F7D879F 7D879F7D869F7D879F7D869F7D869F7D879F7D879F7D869F7D869F7D879F7D879F7D869F7D869F 7D869F7D869F7E88A07D869F7E88A07D869F7E87A07E87A07E87A07E87A07E87A07E87A07E87A0 7E87A07E87A07E87A07E87A07E88A07E87A07E87A07E87A07E88A07E87A07E87A07E88A07E88A0 7E87A07D86A07E87A07E87A07E88A07E87A07F87A07E88A07F87A07E87A07F87A07F87A07F87A0 7E88A07E87A07E87A07D869F7D869F7F89A17D869F7D879F7D869F7D879F7D879F7D869F7D879F 7D879F7D869F7D869F7D879F7D879F7D869F7D869F7D879F7D879F7E88A07E869F7D879F7D879F 7D879F7C859E7D879F7C859E7D859E7C869E7C869E7C869E7D859E7D859E7C869E7C869E7D879F 7C869E7C869E7C869E7C869E7B859D7B859D7B849D7B859D7C869E7B859D7B859D7B859D7B859D 7B859D7C869E7B859D7B859D7A849C7A849C7A849C7A849C7A849C7A839C7A849C7A849C7A849C 7A849C7A829B7A849C7A849C79829B79839B79839B7A829B7A829B79839B7A829B79819A79839B 78819A78829A78829A78829A78829A78829A78829A78819A78819A77809977809977809978829A 778099778099778099778199778099767F99778099778099778199767F98767F98767E98767F98 767F98767F98777F98777F98767F98767E98768098757E97768098768098757E97767E97757E97 757E97757E97757E97757F97D6D9E0D6D9E07878785B5B5B747474777777787878787878787878 777777767676767676767676757575757575757575747474747474747474737373737373727272 7272727272721C242B1C242B1C242C0E1013030202060606060606000000767575F7F7F6F5F2EE F4F1EDF3F0EDF8F5F1F1EFEB9D9C9B6E6D6D6F6E6E6565675B5C5C4F53532E3135101018121319 1014180E0F150C0C0F353738AEB2B4A7A6A7000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 101010D7D7D7ACACAD7B7A7D60606115161913161A14151A3D3D4260606368686B706F7279787B 7D7D7F7E7D80817F81C9C7C5FBF8F4F6F3EFF6F3EFF6F3EFFFFCF8BAB8B4101010020202060606 050303090A0A1B22291D252C1C242B727272727272737373737373747474747474747474757575 7575757575757676767676767777777777777878787878787878787878787777777474745C5C5C 777777D4D8E0D4D8E0737C96717B95717A95717B95717B95717B95717A95717A95717A95717A95 717B95717A95717B95717B95727C96727B96747D96747D96717B95737C96737C96737C96737C96 737C96747D97747D97757E97757E97757E97757E97757E97757E97747D97747D97757E97747D97 767F98767F98757E98767F98757E98767F98767F9877819A767F98767F9877819A767F99778099 767F99767F99778099778099778099778099778099767F9977809978819A78819A78819A78819A 78819A78819A78819A77809A79839C78819A79829B79829B79829B79829B79829B79829B79829B 79829B79829B79829B79829B79829B78819B7A839C7A839C7A839C79829C7A849D7A839C7A839C 7A839C7A839C7A839C7A839C7A839C7A839C7A839D7B849D7A839D7B849D7B849D7B849D7B849D 7B849D7A839D7B859E7B849D7A839D7B849D7A839D7B849D7B849D7B849D7A839D7A839D7B849D 7B849D7A839D7A839D7A839D7C859E7B849E7B849E7C859E7C859E7C859E7C859E7B849E7B849E 7B849E7C859E7C859E7B849E7C859E7B849E7B849E7B849E7B849E7B849E7C859E7B849E7C859E 7C859E7B849E7B849E7A849E7B849E7B849E7B849E7C859E7C859E7C859E7B849E7C859E7C859E 7C859E7B849D7B849D7B849D7B849D7A839D7B849D7B849D7B849D7A839D7B849D7B849D7B849D 7B849D7B849D7B849D7A839D7A839D7B859E7B849D7A839D7B849D7A839D7A839C7A839C7A839C 7A839C7A839C7A839C7A839C7A849D7A839C7A839C7A839C7A839C79829C7A849D79829B79829B 79839C79829B79829B79829B79829B79829B79829B79839C78819B79839C79829B78819A78819A 78819A78819A78819A78819A77809A78819A77809A78819A78819A778099778099778099778099 778099767F99778099778099778099778099778099767F98767F98757E98767F98767F98768099 767F98757E98768099767F98757E97747D97737D97747D97747D97747D97747D97757E97747D97 747D97747D97747D97737C96747D96737C96737C96747D96737C96737C96747D96737C96737C96 737C96727B95727B95737C95727B95727B95727B95737C95727B95737C95727B95727B95727B95 727B94717A94D5D8E0D5D8E07777775B5B5B747474767676787878787878787878777777777777 767676767676757575757575757575747474747474737373737373727272727272727272727272 1C242B1C242B1C242C0E1013030202060606060606000000767575F7F7F5F4F1EDF4F1EDF3F0EC F8F5F1F1EEEB9C9B9A6E6E6D717070656565595C5B4F53532E30340F10171114190F12180E0F16 0D0D10323739B2B4B7A8A7A7000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000101010D6D7D7 B0AEB37E808261626116161913151914161A3A3B3F61616469696B70707279797B7D7D7F7F7E80 838081CBC7C5FBF8F4F6F3EFF6F3EFF6F3EFFFFCF8BAB8B4101010020202060606050303090A0A 1B22291D252C1C242B727272727272737373737373747474747474757575757575757575757575 7676767676767777777878787878787878787878787979797777777474745E5E5E747474D3D6DE D3D6DE6F79926D77916D76916D77916D77916D76916D76916E79936E79936D77916D77916D7791 6D78926E78926E79936E78926E78926F7A946E77926E79936E79936E78926E79936E79936F7A94 717B956F7A946F7A946F7A946F7A946F7A946F79936F79936F7A946F7A94707B95707B95707B95 727C96727C96707B95707B95707B95707B95707B95717C96737D97717C96737D97717B95717C96 717C96717B95717C96717C96717C96717C96747E98747E98727D97727D97727D97727D97727D97 747E98747E98747E98737E98737E98757F99757F99757F99757F99737E98737E98737E98737E98 757F99737E98737E9876809A747F9976809A747F99747E98747F99747F99747F9976809A76809A 747F9976809A747F9975809A77819B75809A757F9977819B75809A75809A75809A77819B77819B 75809A75809A75809A75809A75809A757F99757F99757F9975809A757F9975809A75809A76809A 76819B76819B76809A76819B78829C76819B76819B76809A76819B76819B76809A76809A76819B 76819B76809A76819B76819B76819B76809A76819B76819B76819B76819B76809A76819B76809A 76819B76819B76819B76819B76809A76809A76819B76819B78829C76819B76819B76819B76819B 77819B757F9975809A75809A75809A75809A757F9975809A75809A78829C75809A75809A75809A 75809A75809A75809A75809A757F9975809A75809A75809A77819B75809A747F99747F99747F99 747F99747F99747F99747F99747F99747F99747F9976809A76809A76809A737E98757F99757F99 737E98757F99737E98737E98757F99757F99737E98737E98757F99737E98747E98747E98727D97 747E98727D97727D97727D97727C96747E98727D97717C96717C96737D97717C96737D97717C96 717C96717C96717C96717C96717C96717B95727C96707A94727C96707B95707B95707B95707B95 707B95707B95707B956F7A946F79936F7A946F7A946F7A946F79936F7A946F79936F7A946F7A94 6F79936F7A946E79936E79936E79936E79936E79936E79936E79936E78926E7892707A946F7993 6D77916D78926D77916D78926D78926D78926D78926D78926D78926D77916F79936D78926C7690 D3D6DED3D7DF7373735C5C5C737373777777787878787878787878787878777777777777767676 7575757575757575757575757474747474747474747373737272727272727272721C242B1C242B 1C242C0E1013030202060606060606000000767575F7F7F5F4F1EDF4F1EDF3F0EDF7F5F0F0EDEA 9C9A996F6E6D707070656565595B5B5053522E32340F10161112171112180E0F140C0D10333839 B4B7B8ABAAAA000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000101010D7D6D7ADACB07C7D81 63646316171B13151A15161B3E3F426161636A696C7270737A797B7D7D7E7F7E80838082CBC7C6 FBF8F4F6F3EFF6F3EFF6F3EFFFFDF8BAB7B3101010020202060606050303090A0A1B22291D252C 1C242B727272727272737373737373747474747474757575757575757575757575767676777777 7777777878787878787878787878787979797878787474746161616B6B6BD2D5DED2D5DD6C7590 6A738F6A738F6A738F6A738F6B74906B74906B74906B74906A758F6B75906B74906B74906B7490 6B74906B74906C75916A758F6C75916C75916B76906C75916C76916C75916C75916C75916B7690 6B76906D76926D77926D76926D77926D77926D77926D77926D77926D78926D77926E78936E7893 6E77936E78936E79936E79936E79936E78936E77936E77936F78946F78946F78946F78946F7993 6F78946F78946F79946F7894707A956E7993707995707995707A95707B95707A95707995727C97 707A95707A95707B95717C96717B96717C96717B96717C96717B96717B96717C96717C96717B96 717B96717B96727D97727C97727B97727B97727B97727B97727B97727C97727B97727B97727B97 727C97727C97737E98737C98737D98737C98737C98737D98737D98737E98737D98737C98737E98 737D98737E98737D98737D98737D98737D98737D98737D98737D97737D98737D97747E99747E99 747D99747E98737E98737E98747E99747D99747D99747D99737E98747E99747E99747D99747D99 747D99747D99747D99737E98747D99747D99747E99747E99747D99747D99747E98747E99747E99 747E99747E99747E98747D99747D99747E98747E99747E99747E98747E99737E98737D98737D98 737C98737D98737D98737C98737E98737D98737C98737D98737D98737D98737D98737C98737E98 737C98737C98737C98737D98737D98737E98737D98727C96727D97727C97727D97727D97727D97 727C96727C97727D97727D97727C97727D97727D97717C96717B96717A96717A96717B96717A96 717B96717B96727D98717A96717A96707A95707A95707995707995707B95707A95707995707A95 707A95707A95707A95707A957079956F78946F78946F78946F79946F7A946F79946F79946F7A94 6F79946E78936E79936E78936E79936E78936E78926E78936E79936E78936E77936D76926D7692 6D76926D76926D76926D76926D77926C77916D76926C76906D76926D76926C76906B76906B7690 6C77916C76916C76916C76916C76916C76916C76916B75906B75906B75906B75906B758F6B7590 6B76906B75906A748E6B75906B76906A748F6A748F6A758F69748E6A748E69748ED2D5DED2D5DE 6B6B6B606060737373777777787878787878787878787878777777767676767676757575757575 7575757575757474747474747373737373737373737272727272721C242B1C242B1C242C0E1013 030202060606060606000000767575F7F7F5F4F1EDF4F1EDF3F0ECF8F5F1F0EEE99B98986F6D6D 6F7070636465595B5C5053532E31330F10161113181010160D10160A0C10333737B5B6B5ABAAAA 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000101010D7D8D8AEACAF7A7A7B605F6016171B 13151A14161A3D3E436061646A696C7271747A797B7E7D7F807F80838183CBC7C5FBF8F4F6F3EF F6F3EFF6F3EFFFFDF9B9B6B210100F020203060606050303090A0A1B22291D252C1C242B727272 737373737373747474747474757575757575757575757575757575767676777777777777787878 7878787878787878787979797878787474746565655C5C5CD1D4DDD1D4DD67718E656F8C66708C 646F8B66708C656F8C656F8C67718D68728E67718D66708D67718D68728E67718D67718D67718D 67718D67718D67718E69738F68728E68728E68728E68728E68728E68728E68728E68728E69738F 6A74906A74906A749069738F6A749069738F69738F69738F69738F6B75916B75916B75916A7490 6B75916A74906A74906B75916B75916B75916B75916A74906B75916C76926C76926C76926C7692 6B75916C76926B75916D76936B75916C76926E77946D77936D77936C76926D77936E77946D7793 6D77936C76926E78946E78946F78956D77936E78946E78946D77936D77936D77936E78946E7894 6D77936E78946F79956F79956F79956F79956E78946F79956F79956E78946D77947079966F7995 6F79956F7995707A966F7995707A96707A966F7995707A96707A96707A966F79956F7995707A96 707A966F7995707A966F79956F7995707A966F7995707A96707A96707A96707A96707A96707A96 707A96707A966F7996717B97717B97707A96707A96707A96707A96717B97707A96707A96707A96 707A96707A96717B97707A96717B976F7996707A96707A96707A96707A96707A96707A96707A96 707A96717B96717B97707A96707A96717B97707A96707A96707A96717B976F79956F79956F7995 707A96707A96707A966F7995707A96707A96707A966F7995707A96707A966F79956F79956F7995 6F7995707A966F7995707A966F79956E78946F79956F79956E78946E78946F79956F79956F7994 6F79956F79956F79956E78946E78946D77936F78956E78946E78946E78946E78946F78956E7894 6E78946E78946F78956C76926D77936D77936C76926D77936D77936D77936D77936D77936C7692 6B75916C76926C76926C76926B75916B75916C76926B75916C76926B75916C76926A74906B7591 6A74906B75916B75916A74906A74906A74906B75916B759169739069738F69738F69738F6A7490 69738F6A749069738F69738F6A749069738F68728E69738F68728E67718E67718E69738F69738F 68728E68728E69738F66708D68728E68728E66708D67718D67718D67718D67718D67718D68728E 67718D66708C66708C67718D67718D656F8C66708C66708C67718DD1D4DDD1D4DD5C5C5C636363 737373777777797979787878787878787878777777777777767676767676757575757575757575 7575757474747474747373737373737272727272721C242B1C242B1C242C0E1013030202060606 060606000000767575F7F7F5F4F1EDF4F1EDF3F0ECF8F5F1F0EDEA9998966E6D6C6F706F646464 595B5C4D51512D30320E10161113181012160E0F15090A0F333738BABBBBA8A8A8000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000101010D7D6D7ADACAF7C7C7E5D5E5E14161913151A14161A 3C3D416061646A696C7371747B7A7C7F7E80818083848283CCC9C5FBF8F4F6F3EFF6F3EFF6F3EF FFFDF9B9B6B210100F020203060606050303090A0A1B22291D252C1C242B727272737373737373 747474747474757575757575757575757575767676777777777777777777787878787878787878 7979797979797878787474746969694D4D4DCFD3DBCFD3DB65708C626D89636E8A646F8B636E8A 636E8A626D89626D89636E8A636E8A636E8A636E8A636E8A646F8B646F8B646F8B646F8B646F8B 646F8B636E8A65708C646F8B65708C66708D66708D66708D67718D66708D66708D66708D66708D 67718E66718D66718D68728E67718E67718E68728E67718E67718E67718E68728F68728F68728F 68728F67728E68728F69738F68728F68728F68728F6973906973906A7490697390697390697390 6A74906973906973906A74906A74916A74916A74916A74916B75916A74916B75916A74916A7491 6A74916B75926B75926C76926B75926B75926C76926C76926C76926B75926B75926B75926C7693 6B76926C76936B76926D77936D77936D77936C76936C76936D77936D77936C76936C76936C7693 6D77946E78946E78946D77946D77946C77936C77936D77946D77946D77946D77946D77946D7794 6D77946D77946D77946D77946C77936D77946C77936D78946E78956E78956F79956E78956E7895 6E78956E78956D78946D78946D78946D78946C769242495A43495A6C76926D78946D78946E7895 6D78946E78956E78956E78956E78956E78956D78946E78956D78946E78956D78946D78946E7895 6E78956E78956F79956E78956E78956D78946F79956E78956D77946D77946D77946D77946D7794 6D77946E78946D77946C77936C77936E78946E78946D77946D77946D77946D77946D77946D7794 6C77936C76936B76926C76936C76936C76936C76936D77936C76936B76926C76936C76936D7793 6C76936B76926A75916B75926C76926C76926C76926B75926A75916B75926B75926C76926B7592 6A74916B75916B75916A74916A74916A74916974906A74916974906A74916973906A74906A7490 69739069739069739069739069739068738F69739069739068728F68728F68728F68728F68728F 67728E68728F69738F68728F67718E66718D67718E67718E66718D67718E67718E67718E66718D 66718D66708D66708D66708D66708D67718D65708C66708D66708D66708D66708D646F8B646F8B 656F8C646F8B656F8C656F8C656F8C656F8C646F8B66708C636E8A636E8A656F8B646E8B636E8A 646E8B646E8B646E8B646E8B636E8A616C88636D8AD0D3DCD0D3DC4C4C4C696969747474777777 797979787878787878787878777777777777767676767676757575757575757575757575747474 7373737373737373737272727272721C242B1C242B1C242C0E1013030202060606060606000000 767575F7F7F5F4F1EDF3F0EDF3F0ECF8F5F1EFECE99897946D6C6B6F6F6E656464575A594C504F 2D30320E10161012171012170D0D14090A0D353B3AB8BBB9AAA8A8000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000101010D8D7D8ABABAD7B7B7D5D5E5E14161815171C15161B3D4042616265 6B696D7370747A7A7C7F7E80818083848283CCC9C6FBF8F4F6F3EFF6F3EFF6F3EFFFFDF9B8B6B2 10100F020203060606050303090A0A1B22291D252C1C242B727272737373747474747474747474 757575757575757575757575767676777777777777787878787878787878787878797979797979 7878787474746E6E6E4F4F4FCDD1D9CED2DA606C88606B875E6A86606B87616C88616C895F6B87 616C89616C88606B88616C88616C88616C88616C88626D8A626D8A626D89626D89626D89626D8A 626D89626D89626D89626D89626D8A636E8A636E8A636E8A636E8A636E8A626D8A646F8C646F8C 646F8B646F8B646F8B646F8C646F8B646F8B646F8C646F8B65708D65708D646F8C65708D65708C 515A712D323F171920191C232B303D5A637C65708C65708D66718E66718D66718E66718E66718D 66718D66718D50596F24283214171D191C232D323F5C657F67728E67728F67728E687390586179 2D313E16191F181B222D323F5B647E68739068739068738F68739059627A2D323E16191F191B22 2E333F5C657E68739069749169749069749059627A2D323E16191F191B222E33405D667F6A7591 6A75926A75926A75915A637B2E323F17191F191B222E33405D667F6A75926A75916A75926A7591 5962792E323F191B211A1D243035415E68806B76926974916B76936B76926B76926B76926B7692 6A75926B76936B76926B76934E56696364647273786D78936B76926B76926B76936B76936B7693 6B7692535C72262A3416191F1B1E253035425F69836B76936A75926B76926B76926B76926B7692 6B76926B76925962792A2E39292D38292D38292D38292D38292D38373C4B6A75916A75926A7592 5A637A2E323E181A211A1C242F34415D667F6A75916A75926A75926A75915A637A2E323F171A21 1A1C242F34415C657E69749069749069749069749059627A2D323E171A211A1C242E33405C657F 69749168739068738F68738F5861792D313E171A21191C242E33405B647D68739067728E67728F 67728E5760792C313D171921191C242E33405A637D66718D67728F66718D66718D66718D66718E 66718D66718D66718E65708C66718E65708C65708D65708C65708C65708D65708D65708D65708D 65708D646F8B636E8B646F8B646F8C636E8B646F8B646F8B646F8B646F8B636E8A626D8A636E8A 636E8B626D8A626D8A636E8A636E8A626D8A626D89626D89626D89636E8B626D89626D8A626D8A 626D89626D8A616C88626D8A616C88616C88616C88616C88616C89616C89616C88616C89616C88 606B87606B87606B875F6A87606B87CFD2DBCED1DA4D4D4D6E6E6E737373777777797979787878 787878787878787878777777767676767676757575757575757575757575757575747474747474 7373737272727272721C242B1C242B1C242C0E1013030202060606060606000000767575F7F7F5 F3F1EDF3F1EDF2F0ECF7F5F1EFEBE99896946C6C6B6D6E6E6363645558584C4F4F2D2F320F1217 1113181012170D0F150A0C0F313738B6B8B7A8A7A7000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000101010D6D5D6ABABAC7C7D7D5F5F5F15151815161C14161B4041446162646B6A6D737275 7B797B807F81828083848182CBC8C4FBF8F4F6F3EFF6F3EFF6F3EFFFFDF9B9B6B310100F020203 060606050303090A0A1B22291D252C1C242B737373737373747474747474757575757575757575 7575757676767676767777777777777878787878787878787979797979797A7A7A787878747474 6E6E6E565656C3C7D1C8CCD5535F7E5662815C67855C67855D68855D68855D68865D68865D6886 5D68865D68865D68855D68865C67845D68865E69865E69865F6A875E69865D68855E69865D6885 5E69865E69865E69865F6A875E69865F6A875F6A875E69865E69865E69865E69865F6A875F6A87 606B88606B885F6A87606B88616C895F6A87606B885F6A87606B88606B884B546A3838398D8D8D C5C5C5C0C0C09393932323244A5268626D8A626D8A616C89626D8A626D8A626D8A626D8A444B5F 3A3B3BA6A6A6CCCCCCC1C1C18F8F8F202123525C75626D8A626D8A525B73313133929292C8C8C8 C3C3C39090902A2B2E565E77646F8C646F8C525B73313133929292C8C8C8C3C3C39090902A2B2E 565E77646F8C65708D545D74313133929292C8C8C8C3C3C39090902A2B2E58607966718E66718E 535C74313133929292C8C8C8C3C3C39090902A2B2E58607965708D65708D525B73313234919192 C4C4C4C0C0C08E8E8E292A2D58617A66718E66718E66718E67728F66718E66718E66718E66718E 67728F66718E64676DFDFDFDD3D4D867728F66718E66718E67728F66718E66718E464E613A3B3B A5A5A5C9C9C9BEBEBF8D8D8D21222457607966718E66718E66718E66718E66718E67728F66718E 6066759C9C9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D87888B66718E66718E535C73313134919192 C5C5C5C0C0C08D8E8E2A2B2F58617A66718E66718E535C73313134919192C5C5C5C0C0C08D8E8E 2A2B2F576079646F8C646F8C515A72313134919192C5C5C5C0C0C08D8E8E2A2B2F565F78646F8C 65708D515A72313134919192C5C5C5C0C0C08D8E8E2A2B2F555E77636E8B646F8C505870303134 919192C5C5C5C0C0C08D8E8E2A2B2F545E77636E8B616C89626D8A616C89636E8B626D8A626D8A 616C89616C89606B88616C89616C89616C89616C89606B88616C89616C89626D8A606B885F6A87 5F6A875F6A87606B88606B885F6A875F6A87606B885F6A875F6A875E69865F6A875E69865F6A87 5E69865E69865D68855F6A875E69865C67845D68855D68855D68855E69865D68855E69865E6986 5D68855C67845C67845C67845D68855C67845C67845D68855D68855D68855D68855D68855C6784 5B668356617F505D7BC8CCD5C3C7D15454546E6E6E737373777777797979787878787878787878 787878777777777777767676757575757575757575757575747474747474747474737373737373 7272721C242B1C242B1C242C0E1013030202060606060606000000767575F7F7F4F3F0ECF3F0EC F2EFEBF7F4F0EEEBE99795946B6A696C6B6C6162625458584A4E502B30310E1016101017101217 0D0D130C0D10323638B3B4B3AAA8A8000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000101010 D6D5D6ADABAD7D7C7E5F5F6016161915171C13161A3D3E416263656C6A6E7472757C797B807F81 828184858183CBC8C4FBF8F4F6F3EFF6F3EFF6F3EFFFFDF9B9B6B310100F020203060606050303 090A0A1B22291D252C1C242B737373737373747474747474757575757575757575767676767676 7676767777777777777878787878787878787979797979797A7A7A7878787474746E6E6E585858 BEC3CEBDC2CD3240643341653442663A486B424E704753754D5A79535F7E596482596482596482 5964825964835964825964825964825964825A65835A65835A65835A65835A65835A65845A6583 5A66845B67855A66845C68865B67855B67855B67855B67855B67855B67855B67855C68865C6886 5C68865C68865D69875C68865C68865C68865D69875D6987494B50F1F1F1FFFFFFFFFFFFFFFFFF FFFFFFF4F4F4494A4D5D69875E6A885E6A885E6A885E6A885F6B895C6885555758FDFDFDFFFFFF FFFFFFFFFFFFFFFFFFF0F0F043464F606C8A5F6B89474A51E9E9E9FFFFFFFFFFFFFFFFFFFFFFFF E3E3E3464A54616D8B616D8B474A52E9E9E9FFFFFFFFFFFFFFFFFFFFFFFFE3E3E3464A55616D8B 616D8B484B52E9E9E9FFFFFFFFFFFFFFFFFFFFFFFFE3E3E3464A55626E8C626E8C484B52E9E9E9 FFFFFFFFFFFFFFFFFFFFFFFFE3E3E3464A55626E8C626E8C474A52E8E8E8FDFDFDFEFEFEFEFEFE FDFDFDDFDFDF444853636F8C636F8D636F8D636F8D636F8D636F8D636F8D636F8D636F8D5B6682 ABACADFFFFFF9FA6B7636F8D636F8D636F8D636F8D636F8D616D8A555658F9F9F9FEFEFEFEFEFE FEFEFEFDFDFDEDEDED41444E636F8D64708E636F8D636F8D636F8D636F8D636F8D7E828CFCFCFC FEFEFEFEFEFEFEFEFEFEFEFEFEFEFED6D8DC626E8C626E8C474A52E6E6E6FDFDFDFEFEFEFEFEFE FDFDFDE0E0E0444853636F8D626E8C474A52E6E6E6FDFDFDFEFEFEFEFEFEFDFDFDE0E0E0434752 616D8B626E8C464952E6E6E6FDFDFDFEFEFEFEFEFEFDFDFDE0E0E0434752616D8B606C8A464951 E6E6E6FDFDFDFEFEFEFEFEFEFDFDFDE0E0E0434752606C8A5F6B89464951E6E6E6FDFDFDFEFEFE FEFEFEFDFDFDE0E0E04246515E6A885F6B895E6A885E6A885E6A885E6A885E6A885D69875D6987 5D69875E6A885E6A885D69875D69875D69875D69875C68865D69875D69875C68865C68865C6886 5C68865D69875C68865C68865B67855B67855B67855B67855B67855B67855B67855B67855A6684 5A66845A66845A66845A66845A66845A66845A66845A6684596583596583596583596583596583 5965835965835965835965835965835965835662804E597A485476434F713C486C364367354266 313F63BEC2CDBFC3CE5757576E6E6E737373787878797979797979787878787878787878787878 7777777676767676767575757575757575757575757474747474747373737373737272721C242B 1C242B1C242C0E1013030202060606060606000000767675F7F7F5F3F0EDF3F0ECF2EFEBF7F5F0 EEECE79593926968676C6B696061615457594A4E4F2A2F300D0F150F12160E10150D0D130C0D10 353839B1B2B3A8A8A8000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000101010D8D7D7ADACAC 7C7B7E60606115161914161B13161B3B3C406262656C6B6E7371747B797B817F82838184868384 CDCAC7FBF8F4F6F3EFF6F3EFF6F3EFFFFDF8B8B5B2100F0F020303060606050303090A0A1B2229 1D252C1C242B737373737373747474747474757575757575757575767676767676767676777777 7878787878787878787878787979797A7A7A7A7A7A7979797474746E6E6E585858BFC3CEBEC2CD 27355A2A385E303E64303E64303E64303E64313F6533406633416639456A3E4A6E414E71485476 4B5779515D7D566280566280566280566280576381586482576381586482576381566281586482 5864825763815864825965835864825965835864825965835965835965835A66845A66845A6684 5965835A66845A66845A6684596583545F7CCCCCCEFEFEFEE4E6E8939BAEA4AABBECEDEEFEFEFF DDDDDD4F59735C68865B67855B67855C68865C68864F5972E7E7E8FEFEFED3D5DB8C94A9A5ACBC FCFCFDFFFFFFAFB0B25D698856617CB1B1B1FEFEFEEDEEEF8E97AC949CAFF3F3F4FFFFFF9F9FA0 5B678457627DB1B1B1FEFEFEEDEEF08E97AB959DB0F3F3F4FFFFFF9F9FA05B678457637EB1B1B1 FEFEFEEDEEEF8F98AC949CAFF3F3F4FFFFFF9F9FA05C6885586380B1B1B1FEFEFEEDEEF09098AD 959DB1F3F3F4FFFFFF9F9FA05C688558637FB1B1B1FFFFFFECEDEF9099AD939BB0F4F4F5FFFFFF 9F9FA05D6987616D8B606C8A606C8A606C8A606C8A606C8A606C8A616D8B464D5DF6F7F7F8F8F9 6A7693616D8B606C8A606C8A616D8B616D8B535D76ECECECFFFFFFD3D5DB8D96ABA6ACBDFDFDFE FFFFFFB1B1B3606C8A616D8B616D8B616D8B606C8A606C8A616D8B93959AFEFEFECDCFD4A9B0C0 A9B0C0A9B0C0A9B0C09AA2B5616D8B58637FB4B4B4FEFEFEECEDEF8E96AC939BB0F4F4F5FFFFFF 9F9FA05C688557637EB4B4B4FEFEFEECEDEF8E96AC939BAFF4F4F5FFFFFF9F9FA05B678457627D B4B4B4FEFEFEECEDEF8D96AB929AAEF4F4F5FFFFFF9F9FA05B678457627EB4B4B4FEFEFEECEDEE 8C94A9929AAEF4F4F5FFFFFF9F9FA059658256617CB4B4B4FEFEFEECEDEE8B93A99199ADF4F4F5 FFFFFF9F9FA05965825C68865B67855C68865C68865B67855C68865B67855B67855A66845A6684 5A66845B67855A66845B67855B67855A66845965835965835A66845A66845A6684596583596583 596583586482586482586482596583596583596583586482586482576381576381576381576381 576381586482576381586482576381566280576381566280576381576381515C7C4C5879485476 414E703E4A6E39466B324066324066324066313F65313F65313F65313F652B395F253359BEC2CD BFC3CE5757576E6E6E747474787878797979797979787878787878787878787878777777767676 7676767676767575757575757575757474747474747373737373737272721C242B1C242B1C242C 0E1013030202060606060606000000767675F7F7F4F3F0ECF2EFECF2EFEBF7F4F1EFECE893928F 6867666D6B6A6161625557584B4F4F2B2E2F0C0D120F10160D0F140B0D120C0D10373C3AB3B5B8 A7A6A7000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000101010D6D6D6AAA9A97C7C7D5D5E5F 14151814161A1315193B3D416363666D6B6E7472757D7A7C828082838284868484CDC9C7FBF8F4 F6F3EFF6F3EFF6F3EFFFFCF8B6B4B0100F0F020303060606050303090A0A1B22291D252C1C242B 737373747474747474757575757575757575757575767676767676777777777777787878787878 7878787979797979797A7A7A7A7A7A7979797474746E6E6E595959BEC3CEBEC3CE2B375D263359 2633592A375D2E3B61303D63313E64313E64313E64323F65323F65323F65323F65323F65323F65 323F653744693A476B404E704552734855764F5A7A515D7D556180556180556180556180556180 566180556180566281566281576281576281566281556180566281576281576382586382576382 586382576382576382545D77FBFBFCFFFFFF8C93A55964835864839598A1FEFEFEFFFFFF5F677D 5964835864835965845965845A6584717A93FDFDFEFFFFFF8089A1596584596482C0C1C3FEFEFE DCDCDF5A6685525A70F8F8F8FFFFFF999EAB5B66855B6786A5A8B2FEFEFEF0F0F0515B74535B70 F8F8F8FFFFFF999EAB5D68875C6887A5A8B3FEFEFEF0F0F0525C75545B71F8F8F8FFFFFF999EAB 5C68875C6887A5A9B3FEFEFEF0F0F0525C75545C72F8F8F8FFFFFF9A9FAC5E69885C6887A5A9B3 FEFEFEF0F0F0535D76535B71F8F8F8FFFFFF999EAB606C8A5F6B8AA7ABB4FFFFFFEFEFEF576079 5D69885F6A895E6A895E6A895F6A895D69885E6A895F6A8976777CFDFDFDBFC2CA5F6A895F6A89 5E6A895E6A895F6A895E6A89737D96FFFFFFFFFFFF828CA35E6A895E6A88C3C3C5FEFEFEDADBDD 5E6A895F6A895E6A895E6A895F6A895E6A895E6A89A9AAADFEFEFE9095A241495E394052495268 5F6A885F6A895D6988545C72F9F9F9FFFFFF999EAB5E6A895E6A89A7ABB4FEFEFEEFEFEF535D76 545C72F9F9F9FFFFFF999EAB5D69885E6988A7AAB4FEFEFEEFEFEF525C75545B71F9F9F9FFFFFF 989DAA5E69885D6988A7AAB4FEFEFEEFEFEF515B74515A6FF9F9F9FFFFFF989DAA5C68875C6887 A6AAB3FEFEFEEFEFEF515A74525A6FF9F9F9FFFFFF979DAA5B67865A6685A6A9B3FEFEFEEFEFEF 5059735965845965845965845A6584586483586483566280525D7A535E7B545E7B535E7B525D7A 535E7B535E7B525D7A525D7A566280586382576382586382576382576382566281556180576281 55618056628157628156628157628154607F55618055618054607F566180556180556180556180 515C7C4E5A7A495576455273404E703A476B384469334065323F65323F65323F65323F65323F65 323F65313E64313E64313E64303D632E3B612A375D26335926335928355BBEC3CEBEC3CE575757 6E6E6E7474747878787A7A7A797979797979787878787878787878777777777777767676757575 7575757575757575757474747474747373737373737272721C242B1C242B1C242C0E1013030202 060606060606000000767675F7F7F4F3F0ECF2F0ECF1EFEBF7F4F0EEEBE791908F6565666C6A6C 605F615657594B4F4F2B2E2F0D0D131010150D0F130C0D120B0D10333837B6B8B7AAA8A8000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000101010D7D7D7AEADB27E7E825F5D5D15151915171C 14161A3C3E426463666E6C6E7573767D7B7E828083848284868484CDC9C7FBF8F4F6F3EFF6F3EF F6F3EFFFFCF8B6B4B00F0F0F030303060606050303090A0A1B22291D252C1C242B737373747474 747474757575757575757575757575767676767676777777777777787878787878787878797979 7979797A7A7A7A7A7A7979797474746E6E6E595959BDC2CDBDC2CD27355A253459243358233257 223156223156223156223156223156223156223156223156223156223156223156223156223156 2332572332572332572332572332572332572332572A385C2A385C313E623442653845673D496B 3E4B6C465271465271465272465272465272465272465271475373475373475373475373475373 475373616B86BBC0CBBCC1CC5F69844753734652717A7C7FFDFDFDFFFFFF6B748C495575485474 485474485473495574525D7A6C768F6C768F45506D1F243212151CCCCCCCFFFFFFAEB1BD495575 636979FDFDFDFFFFFF6F768A4A56754955757B8291FDFDFEFFFFFF575F72646A79FDFDFDFFFFFF 70768A4B57764A56767C8291FDFDFEFFFFFF575F72646A7AFDFDFDFFFFFF70768A4A56764A5675 7C8291FDFDFEFFFFFF585F73646A7AFDFDFDFFFFFF70778B4B57774B57777C8392FDFDFEFFFFFF 585F73646A7AFDFDFDFFFFFF6E768A4C58784B57777E8493FFFFFFFFFFFF5A62764B57774B5776 4B57764B57774B57774B57764B57763F4963CBCBCBFEFEFE7D859C4B57774B57764B57764B5777 4B57774B577755607D717A94717A9448536F21273413161ECFCFCFFEFEFEADB2BD4B57764B5777 4B57774B57774B57774B57774B5777C4C4C5FEFEFE4F4F515353536868693E3E3F14171F434D6A 4B5777646A7AFFFFFFFFFFFF6E768A4B57774B57777E8493FDFDFEFFFFFF586074646A7AFFFFFF FFFFFF6E75894A56764A56767E8392FDFDFEFFFFFF585F74646A7AFFFFFFFFFFFF6D75884A5676 4A56767D8391FDFDFEFFFFFF575F73636979FFFFFFFFFFFF6D75884955754A56757D8392FDFDFE FFFFFF575F73636979FFFFFFFFFFFF6D74884854744854737D8391FDFDFEFFFFFF565E72495574 485473485474485474475372475372323A4E1010110F0F100F0F100F0F100F0F100F0F100F0F10 0F0F100F0F103D4762475373475373475373475373475373465272465271465272465272465271 4652714652724450703F4C6D3D496B384567344163323F622B395D2B395D243358243358243358 243357243357233257223156223156223156223156223156223156223156223156223156223156 22315622315622315623325723325724335826355A253459BEC2CDBEC2CD5757576E6E6E747474 7878787A7A7A797979797979787878787878787878777777777777767676767676757575757575 7575757575757474747474747373737373731C242B1C242B1C242C0E1013030202060606060606 000000767575F7F7F3F2F0EBF2EFEBF1EFEBF7F4F0EDEBE791908E6665646B6B6A605F61565859 4D51512C302F0D0D140F10160F10160D0D140B0D10313835B1B2B2A7A6A7000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000101010D9D8D9ADACAE7B7B7D5F5D5E15161914161B12141A3E3E43 6564666E6C6E7673767E7C7F828184848284868485CCC9C6FBF8F4F6F3EFF6F3EFF6F3EFFFFCF8 B7B4B00F0F0F020303060606050303090A0A1B22291D252C1C242B747474747474747474757575 7575757575757575757676767777777777777878787878787878787878787979797979797A7A7A 7A7A7A7979797474746E6E6E595959BDC2CDBDC2CD27355B243359243359243359243359243359 24335924335924335924335924335925345A25345A25345A26355A26355A26355A26355A26355A 26355A26355A27365B27365B27365B27365B27365B27365B27365B27365B27365B27365B27365B 28375C2E3D60303E623543653543653B486A3C496B3E4B6C424F70424F70485575495675495675 4956754956754855754551701C202ADDDDDDFFFFFFF8F8F9535F7D4956764A57764A5776495676 4A57764956764956764956764C566F909090C6C6C6FEFEFEEFEFF0636C834B5877727783FDFDFD FFFFFF646D834A57774B5877717889FDFDFDFFFFFF656C7C727784FDFDFDFFFFFF656F844B5878 4C5978717889FDFDFDFFFFFF656C7C727884FDFDFDFFFFFF6670854C59794D5A7971788AFDFDFD FFFFFF656C7C737884FDFDFDFFFFFF656F854D5A794C597972798AFDFDFDFFFFFF666D7D737885 FDFDFDFFFFFF6670864E5B7A4D5A7A72798AFFFFFFFFFFFF686F7F4E5B7A4D5A7A4D5A7A4D5A7A 4C59794D5A7A4D5A7A494E5AFEFEFEE8E9EB4F5C7C4D5A7A4E5B7A4D5A7A4D5A7A4D5A7A4C5979 4E5B7A4E5A7A4E5A7A4F59728E8E8FC4C4C4FEFEFEEFEFF0646D844D5A7A4D5A7A4E5B7A4D5A7A 4E5B7A4E5B7A4B5777E2E2E2FEFEFEEFEFEFFCFCFCFDFDFDFCFCFCC1C1C12D303A4E5B7A737885 FFFFFFFFFFFF636D844D5A794C597972798AFDFDFDFFFFFF656C7C737884FFFFFFFFFFFF636D83 4D5A794D5A7971788AFDFDFDFFFFFF656C7C737884FFFFFFFFFFFF626B824B58784B5878717889 FDFDFDFFFFFF656C7C727884FFFFFFFFFFFF636C824B58784B5877717889FDFDFDFFFFFF656C7B 727783FFFFFFFFFFFF626B814B58774A5777717889FDFDFDFFFFFF646B7B4956764A5776495676 4A57764956764A5776787D8BF9F9F9FBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFB 5B647B495675475474424F70424F703E4B6C3C496B3A486A344265354365303E622F3E6227365B 27365B27365B27365B27365B27365B27365B27365B27365B27365B27365B26355A26355A26355A 26355A26355A26355A26355A26355A26355A26355A253459253459253459253459253459253459 253459253459253459253459253459243358BDC2CDBDC2CD5757576E6E6E7474747979797A7A7A 797979797979787878787878787878777777777777777777767676767676757575757575757575 7474747474747474747373731C242B1C242B1C242C0E1013030202060606060606000000767675 F7F7F3F2EFECF2EFECF1EEEBF7F5F0EDEAE6918F8D6565656C6B6B605F6157595A5053542D3033 0D0D130F12160D10160B0D120B0D12363C3BB5B6B5A7A6A7000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000101010D7D7D8ADADAE7D7C7E5E5E5F1517191316181315193F40456564666E6C6E 7675777E7D7F828183848284888485CDCAC6FBF8F4F6F3EFF6F3EFF6F3EFFFFCF8B7B4B00F0F0D 020303060606050303090A0A1B22291D252C1C242B737373747474747474757575757575757575 7676767676767777777777777878787878787878787878787979797A7A7A7A7A7A7B7B7B797979 7474746E6E6E595959BDC1CCBDC1CC263459233157243258243258253359253359253359253359 25335925335925335925335925335925335925335925335926345A26345A26345A26345A26345A 26345A26345A26345A26345A26345A27355B27355B27355B27355B27355B27355B27355B27355B 27355B28365C28365C28365C28365C28365C28365C28365C29365C2A375D2C3A5F2E3D612F3E62 2C375613161CA6A6A7FDFDFDFFFFFFA7ADBC414E70475374475475475475475475475475475475 475475475475616B85FDFDFDFEFEFEFFFFFFCACACA313339485474838794FDFDFDFFFFFF59627A 485576485576666D7FFDFDFDFFFFFF767D8D848995FDFDFDFFFFFF59637A495677495677666E80 FDFDFDFFFFFF767D8D848995FDFDFDFFFFFF5A647B4A57784A5778676E81FDFDFDFFFFFF777D8E 848996FDFDFDFFFFFF5B647B4A57784A5778676E81FDFDFDFFFFFF777D8E848996FDFDFDFFFFFF 5B647C4B58794B5879676F81FFFFFFFFFFFF7980904B58794B58794B58794B57784B58794B5879 4955768E8F90FFFFFFA7ABB94B58794B58794B58794B58794B58794B58794B58794B58794B5879 4B5879656F89FDFDFDFEFEFEFFFFFFCACACA2F31374A55764B58794B58794B58794B58794B5879 4C5877FDFEFEFFFFFFF7F8F9C3C7D3EFF0F3FFFFFFFEFEFEB1B1B144506E848996FFFFFFFFFFFF 5761794A57784A5778676E81FDFDFDFFFFFF777D8E848996FFFFFFFFFFFF5761794A57784A5778 676E81FDFDFDFFFFFF767D8D848995FFFFFFFFFFFF566078495677495677666E80FDFDFDFFFFFF 767D8D848895FFFFFFFFFFFF565F78485576485576666D7FFDFDFDFFFFFF767C8C848895FFFFFF FFFFFF565F78475475475475656C7FFDFDFDFFFFFF757C8C475475475475475475475475475475 475475838A9DFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B567429375D 28365C28365C28365C28365C28365C28365C28365C27355B27355B27355B27355B27355B27355B 27355B27355B27355B26345A26345A26345A26345A26345A26345A26345A26345A26345A253359 253359253359253359253359253359253359253359253359253359253359253359253359243258 243258243258243258243258BDC1CCBDC1CC5858586E6E6E7474747979797A7A7A7A7A7A797979 787878787878787878787878777777767676767676757575757575757575757575747474747474 7373737373731C242B1C242B1C242C0E1013030202060606060606000000767675F7F6F3F2EFEB F2EFEBF1EEEAF7F4F0EDEAE6908E8C6565656B69696060605658594E52522B2D300C0D120F1015 0E10150C0D120A0D10363A3DB6B8B8A6A4A4000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 101010D9D8D9ADACAF807E8261606114151813151A1315193D3E436564666F6D6F7774777E7D7F 828284848385878485CDC9C7FBF8F4F6F3EFF6F3EFF6F3EFFFFCF8B7B4B10F0F0F020303060606 050303090A0A1B22291D252C1C242B737373747474747474757575757575757575767676767676 7777777777777878787878787878787878787979797A7A7A7A7A7A7B7B7B7979797474746F6F6F 595959BCC1CCBCC1CC243359213057213057213057223158223158223158223158223158223158 223158223158223158223158223158223158233259233259233259233259233259233259233259 23325923325923325924335A24335A24335A24335A24335A24335A24335A24335A24335A25345B 25345B25345B25345B25345B25345B25345B27355B28365C26355C26355C1D2845292A2DD4D4D4 FFFFFFFFFFFFA2A9B928375E27365D27365D27365D2B395F2E3B61303E6334426633406539466A 4551739098ACB3B8C6FCFCFCFFFFFFD0D0D03D47637D8393FDFDFEFFFFFF5A6277475374475374 676D7EFDFDFDFFFFFF71788B7E8493FDFDFEFFFFFF5B6378485475485475676D7EFDFDFDFFFFFF 70778A7F8493FDFDFEFFFFFF596278495576485475686E7FFDFDFDFFFFFF70788B7F8594FDFDFE FFFFFF5B6378495576495576676E7EFDFDFDFFFFFF70788B808594FDFDFEFFFFFF5C6479495576 475475676E7FFFFFFFFFFFFF737A8E4955764754754855764A5677485577485577363F57E7E7E7 FFFFFF67718E4654754A56774A56774A56774A56774A56774A5677485576485576485577545F7F 9AA1B3B9BDCAFDFDFDFEFEFECCCDCD3E49644A56774A56774A5677485577495576505B7B9BA0B3 A1A8B9707A944B5777525D7DCDCED3FEFEFFFEFEFE4951687E8493FFFFFFFFFFFF576076495576 495576676E7EFDFDFDFFFFFF70788C7F8594FFFFFFFFFFFF586076495576485475686E7EFDFDFD FFFFFF71788B7F8493FFFFFFFFFFFF586076485475485475686E7EFDFDFDFFFFFF70778A7F8493 FFFFFFFFFFFF565E74475374475374666D7EFDFDFDFFFFFF70778A7E8393FFFFFFFFFFFF565E74 424F703F4C6F63697AFDFDFDFFFFFF676F843442663442662E3B612F3D622B395F29375D3F4C6E 67718B66708C65708C66708C66708C66708C66708C66708C66708C313E6327355B27355B25345B 27355B27355B27355B27355B25345B24335A26345A26345A26345A24335A26345A26345A26345A 26345A253359253359253359253359253359253359253359253359253359253359243258243258 243258243258243258243258243258243258243258243258243258243258233157213057233157 213057233157BDC1CCBDC1CC5757576E6E6E7474747979797A7A7A7A7A7A797979797979787878 787878787878777777777777767676767676757575757575757575757575747474747474737373 1C242B1C242B1C242C0E1013030202060606060606000000767575F7F6F2F2EFEBF2EFEBF1EEEA F7F4F0ECE9E68E8D8C6464636A6A695F5F6056585A5154542B2E300D0D130F10160F10150B0D12 0B0F12353C3DB4B6B7A7A7A7000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000101010D7D6D7 A7A8AA7D7C7E60605F13151813151A14151A404044656466706D6F7776787E7E80828385848385 888486CCC9C6FBF8F4F6F3EFF6F3EFF6F3EFFFFDF8B7B4B10F0D0F020303060606050303090A0A 1B22291D252C1C242B747474747474757575757575757575757575767676767676777777787878 7878787878787878787979797979797A7A7A7B7B7B7B7B7B7979797474746F6F6F595959BCC0CB BCC0CC233258202F56202F56213057213057213057213057213057213057213057213057213057 213057213057213057213057223158223158223158223158223158223158223158223158223158 23325923325923325923325923325923325923325923325923325924335A24335A24335A24335A 24335A24335A24335A24335A24335A25345B25345B1D2949414243EDEDEDFFFFFFF9FAFB868FA5 27365C26355C26355C26355C26355C26355C26355C26355C17213903040602030625335827365D 27365D9195A0FEFEFEFFFFFF434D665E677FFDFDFDFFFFFF4F56692D3B612D3B61626976FDFDFD FFFFFF57617C677086FDFDFDFFFFFF555C6E3A476B3E4B6E686D79FDFDFDFFFFFF636D8670788D FDFDFDFFFFFF5B6172424F714350726B6F7CFDFDFDFFFFFF636D8670788DFDFDFDFFFFFF5B6172 4552744451736A6F7BFDFDFDFFFFFF636D8670788DFDFDFDFFFFFF5B61724451734350726A6F7B FFFFFFFFFFFF6771894552744552744653754451734552744451735B5F67FFFFFFCFD1D6475476 4552744552744552744552744552744552744653752A334805050805060A424F6F465375475475 9C9FA8FEFEFEFEFEFE565E7445527445527445527445527445527436415C293144293043434F70 435072435072868A94FDFDFEFFFFFF68708670788DFFFFFFFFFFFF585F704552744451736A6F7B FDFDFDFFFFFF646E8770788DFFFFFFFFFFFF585E6F4451734350726A6F7BFDFDFDFFFFFF636D86 6F778CFFFFFFFFFFFF555C6D3E4B6E3D4A6D686D79FDFDFDFFFFFF5B6580697187FFFFFFFFFFFF 505769344266314065626775FDFDFDFFFFFF525D795F677FFFFFFFFFFFFF49516427365D27365D 606573FDFDFDFFFFFF4D587526355C26355C26355C26355C26355C26355C1A253F05070C05070B 05070B05070B05070B05070B05070B05070B05070B1F2C4E24335A24335A24335A24335A24335A 24335A24335A24335A24335A233259233259233259233259233259233259233259233259223158 223158223158223158223158223158223158223158223158223158213057213057213057213057 213057213057213057213057213057213057213057213057202F56202F56202F56202F56202F56 BCC0CCBCC0CC5858586E6E6E7474747979797A7A7A7A7A7A797979797979787878787878787878 7878787777777676767676767575757575757575757575757474747474747373731C242B1C242B 1C242C0E1013030202060606060606000000767575F7F6F2F2EFEBF1EEEAF0EDE9F6F4EFECE9E6 8F8D8D6563646969686161615658595153542A2E310B0D130F10160E10150C0C100B0D10343A3A B2B4B4A6A6A6000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000101010D9D9DAACAAAD7E7C7C 605F5F13141714161A1315194141446564656F6D6F7676797F7E82848385858386878484CCC8C6 FBF8F4F6F3EFF6F3EFF6F3EFFFFCF8B5B3B00F0D0F030303060606050303090A0A1B22291D252C 1C242B747474747474757575757575757575757575767676767676777777777777787878787878 7979797979797A7A7A7A7A7A7B7B7B7B7B7B7979797474746F6F6F595959BBC0CBBBC0CB233158 202E56202E56202E56212F56212F56212F56212F56212F56212F56212F56212F56212F56212F56 212F56223057223057223057223057223057223057223057223057223057223057233158233158 233158233158233158233158233158233158233158243259243259243259243259243259243259 24325924325925335A25335A25335A383B42F6F6F6FFFFFFE1E2E64E566E1E29471D28471D2847 23305526345B1218290D1321131A2D26345B747B8FEFEFF0EEEEEE232C4427355C253258707177 FDFDFDFFFFFF56607D495576FCFDFDFFFFFF676A7028365D27355B7B7C81FDFDFDFEFEFE39466A 4A5677FCFDFDFFFFFF686A7129375E28365C7B7C81FDFDFDFEFEFE3A476B4B5777FCFDFDFFFFFF 686A712E3C622D3B607B7D81FDFDFDFEFEFE44517354607FFDFDFDFFFFFF6A6D7239476A374568 7C7E82FDFDFDFEFEFE495676586382FDFDFDFFFFFF6B6D733E4B6E3D4A6D7D7E83FFFFFFFEFEFE 505C7C3E4B6F3E4B6F3E4B6F3E4B6E4350723D4869ACACADFFFFFF8C93A7434F72445072424E71 435072445072435072435072435072848B9CF1F1F1EEEEEE323A4E435072404C6D74767AFDFDFD FFFFFF6B748D4350721E2333181D291F25373E4B6F565E726F6F6F6F6F6F2931453E4B6F384465 808185FDFDFDFFFFFF5C6784596482FFFFFFFFFFFF676A7038466A3745687D7F82FDFDFDFEFEFE 44517354607FFFFFFFFFFFFF66696F313E642D3B607C7E81FDFDFDFEFEFE3A476B4B5777FFFFFF FFFFFF65676E29375E28365C7C7D81FDFDFDFEFEFE3A476B4A5677FFFFFFFFFFFF64676D28365D 27355B7C7D81FDFDFDFEFEFE39466A495576FFFFFFFFFFFF64676D27355C26345A7B7D81FDFDFD FEFEFE37446826345B26345B26345B26345B26345B26345B62687AE4E4E5E6E6E6E6E6E6E6E6E6 E6E6E6E6E6E6E6E6E6E6E6E6E6E6E63E496526345A243259243259243259243259243259243259 243259243259233158233158233158233158233158233158233158233158233158223057223057 223057223057223057223057223057223057223057223057212F56212F56212F56212F56212F56 212F56212F56212F56212F56212F56212F56212F56202E55202E55202E55202E55BCC0CBBCC0CB 5858586F6F6F7474747979797B7B7B7A7A7A7A7A7A797979787878787878787878787878777777 7676767676767575757575757575757575757575757474747373731C242B1C242B1C242C0E1013 030202060606060606000000767575F7F6F2F1EFEAF1EEEAF0EDE9F6F3EFEBE9E58E8C8B646363 6A69686160605657594F5354282B2E0A0C120F10150D10140C0C120C0D1033393AACAEAFA2A0A0 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000101010D7D7D8A7A6AA828083606061141416 13151914141A3E3F436764676F6E70767578807F81848487848385878585CDCAC7FBF8F4F6F3EF F6F3EFF6F3EFFFFDF9B4B1AE0D0D0D030303060606050303090A0A1B22291D252C1C242B747474 757575757575757575757575757575767676777777777777787878787878787878787878797979 7979797A7A7A7A7A7A7B7B7B7979797575756F6F6F595959BBBFCBBBBFCB2130561E2D541E2D54 1E2D541E2D541E2D541E2D541E2D541E2D541F2E551F2E55212F57212F57212F57212F57212F57 212F57212F57212F57223058223058223058223058223058223058223058223058233159233159 23315923315923315923315923315923315923315923315924325A24325A24325A24325A24325A 24325A24325A202D52C8C8C9FEFEFEF4F4F44F4F4F38383837373737373737373727314C25335B 8C8D8F9F9FA082838826345C4A5677FCFCFDFFFFFF606061080A120D0F11C5C5C5FEFEFEFBFBFC 34416628365DD9DADEFFFFFFBBBBBB06080D08090ECCCCCCFEFEFECACCD228365E29375ED9DADE FFFFFFBBBBBB06080D08090ECCCCCCFEFEFECACCD229375F2A385FD9DADEFFFFFFBBBBBB06080D 080A0ECCCCCCFEFEFECACCD22A38602B3960D9DBDEFFFFFFBBBBBB06080D080A0ECCCCCCFEFEFE CACCD22A38602B3961D9DBDEFFFFFFBBBBBB06080E080A0FCCCCCCFFFFFFC9CCD22E3C632B3961 2B39612B39612B39612B3961293047F8F8F8F6F7F737446A2B39612B39612B39612B39612B3961 2B39612B39612B39614F5B7CFFFFFFFFFFFF5D5D5F090B140E0F11C8C8C8FEFEFEFBFBFC38456B 2B39618D8E929F9FA08184882B396169728DFDFDFDFDFDFD696969080A11171819CFCFCFFEFEFE ECEDEF2F3C642B3961DCDEE0FFFFFFBABABA06080D080A0ECFCFCFFEFEFEC9CBD22A38602B3960 DCDEE0FFFFFFBABABA06080D080A0ECFCFCFFEFEFEC9CBD229375F2A385FDCDDE0FFFFFFBABABA 06080D080A0ECFCFCFFEFEFEC9CBD228365E29375EDCDDE0FFFFFFBABABA06080D08090ECFCFCF FEFEFEC9CBD127355D28365DDCDDE0FFFFFFBABABA06080D07090ECFCFCFFEFEFEC9CBD126345C 26345C26345C26345C26345C26345C25335B6F768CFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF444F6E25335A24325A24325A24325A24325A24325A233159233159233159 233159233159233159233159233159233159233159223058223058223058223058223058223058 223058223058212F57212F57212F57212F57212F57212F57212F57212F57212F57212F57202E56 202E56202E56202E56202E56202E56202E56202E56202E56202E56BBC0CBBBC0CB5858586F6F6F 7474747979797B7B7B7A7A7A7A7A7A797979787878787878787878787878777777777777767676 7575757575757575757575757575757474747373731C242B1C242B1C242C0E1013030202060606 060606000000767575F7F6F2F0EDE9F1EEEAF0EDE9F5F2EEEAE7E48D8C8A6665636A6867616060 5657574E5253282B2F0A0C100E10160E10160B0D130D1013343A39AEB0B0A4A3A3000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000101010D8D7D7A9A8AA7D7C805F5F5F151517141619121418 3E3E426766686F6E71767578807F82858486858385898787CECBC8FBF8F4F6F3EFF6F3EFF6F3EF FFFDF9B4B1AE0D0D0D030303060606050303090A0A1B22291D252C1C242B747474757575757575 7575757575757676767676767777777777777878787878787878787878787979797A7A7A7A7A7A 7B7B7B7B7B7B7979797575756F6F6F595959BBBFCBBBBFCB2030551D2D531D2D531D2D531D2D53 1D2D531D2D531D2D531D2D531E2E541E2E541E2E541E2E541E2E541F2E551E2E541E2E541F2E55 1F2E55202F56202F56202F56202F56202F56202F56202F56202F56213057213057213057213057 213057213057213057213057213057223158223158223158223158223158223158223158223158 2B344DFCFCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B637724335ADCDEDFFFFFFF CBCCCE24335A24335AD6DAE0FFFFFFFDFDFDCFCFCFF1F1F1FFFFFFFFFFFF9CA3B425345B25345B 848DA2FDFDFEFFFFFFDEDEDEE4E4E4FFFFFFFFFFFF757F9826355C26355C858DA3FDFDFEFFFFFF DEDEDEE4E4E4FFFFFFFFFFFF767F9827365D27365D858EA3FDFEFEFFFFFFDEDEDEE4E4E4FFFFFF FFFFFF76809928375E28375E868EA4FDFEFEFFFFFFDEDEDEE4E4E4FFFFFFFFFFFF76809928375E 28375E868EA4FDFEFEFFFFFFDEDEDEE4E4E4FFFFFFFFFFFF7680992A396029385F29385F29385F 29385F29385F6F7175FFFFFFB0B4BE29385F29385F29385F29385F29385F29385F29385F29385F 29385F2A395FDBDDE3FFFFFFFBFBFBCCCCCCEDEDEDFEFEFEFFFFFF9DA4B629385F29385FDEDFE0 FDFDFDCACACC29385F314065DCDFE3FFFFFFFDFDFDD1D1D1F3F3F3FEFEFEFFFFFF818AA028375E 28375E8890A6FDFEFEFEFEFEDBDBDBE1E1E1FEFEFEFFFFFF757F9828375E28375E8890A6FDFEFE FEFEFEDBDBDBE1E1E1FEFEFEFFFFFF757E9727365D27365D8790A5FDFEFEFEFEFEDBDBDBE1E1E1 FEFEFEFFFFFF747E9726355C26355C878FA5FDFDFEFEFEFEDBDBDBE1E1E1FEFEFEFFFFFF737D96 25345B25345B868FA4FDFDFEFEFEFEDBDBDBE1E1E1FEFEFEFFFFFF737C9624335A24335A24335A 24335A24335A24335A24335A465373858DA3868EA3868EA3868EA3868EA3868EA3868EA3858EA3 858EA3313F63223158223158223158223158223158223158223158213057213057213057213057 213057213057213057213057213057202F56202F56202F56202F56202F56202F56202F56202F56 1F2E551F2E551F2E551F2E551F2E551F2E551F2E551F2E551F2E551F2E551E2D541E2D541E2D54 1E2D541E2D541E2D541E2D541E2D541E2D541E2D54BBBFCBBBBFCB5858586E6E6E747474797979 7B7B7B7A7A7A7A7A7A797979797979787878787878787878777777777777767676767676757575 7575757575757474747474747373731C242B1C242B1C242C0E1013030202060606060606000000 767575F7F5F2F0EDE9F0EDE9EFECE8F5F2EFEAE6E48E8B8B6764656A68696161615657584F5152 282B2E0A0A100E10150D0F150B0C120D1014323838ADB0B1A7A7A7000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000121212D6D7D7A8A7AA7B7A7B5F5D5F15151914161A1114183F3F43676768 6F6F71777679807F82848385848485898787CECBC8FBF8F4F6F3EFF6F3EFF6F3EFFFFDF9B4B1AE 0D0D0D030303060606050303090A0A1B22291D252C1C242B747474757575757575757575757575 7676767676767777777777777878787878787878787979797979797A7A7A7A7A7A7B7B7B7B7B7B 7A7A7A7575756F6F6F595959BABFCBBABFCB202F551D2C531D2C531D2C531D2C531D2D531D2D53 1D2D531D2D531E2E541E2E541E2E541E2E541E2E541E2E541E2E541E2E541E2E541E2E541F2F55 1F2F551F2F551F2F551F2F551F2F551F2F551F2F55203056203056203056203056203056203056 20305620305620305621315721315721315721315721315721315721315721315767728CFDFDFD FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF626D8824345AE0E2E8FFFFFFD1D4DD233359 233359334265C6CAD4FDFDFEFFFFFFFFFFFFFCFCFD9AA2B32B3A5F24345A24345A24345A939CAE FAFBFBFFFFFFFFFFFFFAFAFB868FA527375C25355B25355B25355B949CAFFAFBFBFFFFFFFFFFFF FAFAFB8790A528385D26365C26365C26365C959DAFFAFBFBFFFFFFFFFFFFFAFAFB8790A629395E 27375D27375D27375D959DB0FAFBFBFFFFFFFFFFFFFAFAFB8790A629395E27375D27375D28385E 969EB0FAFBFBFFFFFFFFFFFFFAFAFB8891A62A3A5F28385E28385E28385E28385E28385E28385E D1D4DCFFFFFF626E8A28385E28385E28385E28385E28385E28385E28385E28385E28385E28385E 3B486CC8CDD6FEFEFEFEFEFEFFFFFFFCFCFD9DA5B62F3E6228385E28385EE4E6EBFFFFFFD1D5DD 28385E28385E485676C9CDD7FFFFFFFEFEFEFFFFFFF9F9FA8790A529395F27375D27375D29385E 969EB1FBFCFCFEFEFEFFFFFFFAFAFB8991A728385E27375D27375D29385E969EB1FBFCFCFEFEFE FFFFFFFAFAFB8991A627375D26365C26365C28375D969EB0FBFCFCFEFEFEFFFFFFFAFAFB8890A6 26365C25355B25355B27365C959DB0FBFCFCFEFEFEFFFFFFFAFAFB8890A625355B24345A24345A 26355B959DAFFBFCFCFEFEFEFFFFFFF9FAFB8890A524345A233359233359233359233359233359 233359233359233358243359243359243359243359243359243359243359243359233258213157 213157213157213157213157213157213157213157203056203056203056203056203056203056 2030562030562030561F2F551F2F551F2F551F2F551F2F551F2F551F2F551F2F551F2F551E2E54 1E2E541E2E541E2E541E2E541E2E541E2E541E2E541E2E541E2E541D2D531D2D531D2D531D2D53 1D2D531D2D531D2D531D2D531D2D53BBBFCBBBBFCB5858586F6F6F7474747979797B7B7B7A7A7A 7A7A7A797979797979787878787878787878777777777777767676767676757575757575757575 7575757474747474741C242B1C242B1C242C0E1013030202060606060606000000777676F7F5F2 F0EDE9F0EDE9EFECE8F6F3EFEAE8E38D8B8A6664646A69696161625557584D51522A2C2F0A0A10 0F10150E10160D0D130C0D12343A3CB1B4B4A3A3A3000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000101012D7D8DAA6A7A97E7C7D5E5E5E15151714151A1215194242466767686F6F70787779 807F818483858584858A8787CECBC8FBF8F4F6F3EFF6F3EFF6F3EFFFFDF9B4B1AE0D0D0D030303 060606050303090A0A1B22291D252C1C242B747474757575757575757575757575767676777777 7777777878787878787878787878787979797A7A7A7A7A7A7B7B7B7B7B7B7B7B7B7A7A7A757575 707070595959BABFCBBABFCB202F551D2C531D2C531D2C531D2C531D2C531D2C531D2C531E2D54 1E2D541E2D541E2D541E2D541E2D541E2D541E2D541E2D541E2D541F2E551F2E551F2E551F2E55 1F2E551F2E551F2E551F2E55202F56202F56202F56202F56202F56202F56202F56202F56202F56 213057213057213057213057213057213057213057213057213057213057223158223158223158 223158223158223158223158223158223158233259233259233259233259233259233259233259 233259303F63596482525E7D313F6424335A24335A24335A24335A24335A25345B2B3A6054607F 515D7C2B395F25345B25345B25345B25345B25345B25345B2C3B6155617F525E7D2C3A6026355C 26355C26355C26355C26355C26355C2C3B61566280535F7E2D3B6127365D27365D27365D27365D 27365D27365D2D3C62566280535F7E2D3B6127365D27365D27365D28375E28375E28375E2E3D63 576281535F7E2E3C6228375E28375E28375E28375E28375E28375E28375E28375E28375E28375E 28375E28375E28375E28375E28375E28375E28375E28375E28375E28375E28375E28375E28375E 3442675C678555618033416628375E28375E28375E28375E28375E28375E28375E28375E28375E 28375E28375E47547565708C535F7E303E6428375E28375E28375E28375E27365D27365D2D3C62 566280535F7E2C3A6027365D27365D27365D27365D27365D27365D2D3C62566280535F7E2C3A60 26355C26355C26355C26355C26355C26355C2C3B6155617F525E7D2B395F26355C25345B25345B 25345B25345B25345B2B3A6054607F515D7C2A385E25345B25345B24335A24335A24335A24335A 2A395F545F7E505C7B29375D24335A24335A233259233259233259233259233259233259233259 223158223158223158223158223158223158223158223158223158223158213057213057213057 213057213057213057213057213057202F56202F56202F56202F56202F56202F56202F56202F56 202F56202F561F2E551F2E551F2E551F2E551F2E551F2E551F2E551F2E551E2D541E2D541E2D54 1E2D541E2D541E2D541E2D541E2D541E2D541E2D541D2C531D2C531D2C531D2C531D2C531D2C53 1D2C531D2C531D2C53BABFCBBABFCB5858586F6F6F7575757979797B7B7B7A7A7A7A7A7A797979 797979787878787878787878787878777777767676767676757575757575757575757575747474 7474741C242B1C242B1C242C0E1013030202060606060606000000797978F7F6F2F0EDE9EFEDE9 EFECE8F4F1EEEAE7E38E8A896764646A69686162615557594D5051292A2D0A0C100E10160E1016 0B0D120C0D12343A3BB7BABAA7A7A7000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000101010 D7D8D7A9A8AA807E805F5F5F15161912151A17181D45464A676769706F71797779817F81838284 8584858A8988CFCBC9FBF8F4F6F3EFF6F3EFF6F3EFFFFDF9B4B1AE0D0D0D030303060606050303 090A0A1B22291D252C1C242B747474757575757575757575767676767676777777777777787878 7878787878787878787979797A7A7A7A7A7A7B7B7B7B7B7B7B7B7B797979757575707070595959 BABFCABABFCA1F2E541C2B521C2B521C2B521C2B521C2B521C2B521C2B521D2C531D2C531D2C53 1D2C531D2C531D2C531D2C531D2C531D2C531D2C531E2D541E2D541E2D541E2D541E2D541E2D54 1E2D541E2D541F2E551F2E551F2E551F2E551F2E551F2E551F2E551F2E551F2E55202F56202F56 202F56202F56202F56202F56202F56202F56202F56213057213057213057213057213057213057 213057213057213057213057223158223158223158223158223158223158223158233259233259 23325923325923325923325923325923325923325923325924335A24335A24335A24335A24335A 24335A24335A24335A24335A24335A24335A25345B25345B25345B25345B25345B25345B25345B 25345B25345B25345B26355C26355C26355C26355C26355C26355C26355C26355C26355C26355C 26355C26355C26355C26355C26355C26355C27365D27365D27365D27365D27365D27365D27365D 27365D27365D27365D27365D27365D27365D27365D27365D27365D27365D27365D27365D27365D 27365D27365D27365D27365D27365D27365D27365D27365D27365D27365D27365D27365D28375E 28375E27365D27365D27365D27365D27365D27365D27365D27365D27365D27365D27365D27365D 28365D28375E28375E27365D27365D27365D27365D27365D27365D26355C26355C27365D27365D 26355C26355C26355C26355C26355C26355C26355C26355C27365D27365D26355C26355C25345B 25345B25345B25345B25345B25345B26355C26355C25345B25345B24335A24335A24335A24335A 24335A24335A25345B25345B24335A24335A24335A23325923325923325923325923325924335A 24335A233259233259233259223158223158223158223158223158223158223158213057213057 213057213057213057213057213057213057213057202F56202F56202F56202F56202F56202F56 202F56202F56202F56202F561F2E551F2E551F2E551F2E551F2E551F2E551F2E551F2E551F2E55 1E2D541E2D541E2D541E2D541E2D541E2D541E2D541E2D541D2C531D2C531D2C531D2C531D2C53 1D2C531D2C531D2C531D2C531D2C531C2B521C2B521C2B521C2B521C2B521C2B521C2B521C2B52 1C2B52BABFCABABFCA5858586F6F6F7474747979797B7B7B7B7B7B7A7A7A7A7A7A797979797979 7878787878787878787777777777777676767676767575757575757575757474747474741C242B 1C242B1C242C0E1013030202060606060606000000797878F7F4F1EFECE9EFECE8EEEBE7F5F2EE EAE7E38E8C896564636969686061615456574C505026292B0B0D121012181012170D0D140D1012 313636ACB0B2A7A7A7000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000101010D8D8D9A8A8A8 7E7D7E60606114151812141916171C47484B68686A706F727A7779817F818382848585868B8988 CECAC8FBF8F4F6F3EFF6F3EFF6F3F0FFFDF9B3B1AE0D0D0D030303060606050303090A0A1B2229 1D252C1C242B757575757575757575757575767676767676777777777777787878787878787878 7878787979797A7A7A7A7A7A7B7B7B7B7B7B7B7B7B7A7A7A7575757070705A5A5ABABFCABABFCA 1E2D531B2A511C2B521C2B521C2B521C2B521C2B521C2B521C2B521C2B521C2B521C2B521D2C53 1D2C531D2C531D2C531D2C531D2C531E2D541E2D541E2D541E2D541E2D541E2D541E2D541E2D54 1F2E551F2E551F2E551F2E551F2E551F2E551F2E551F2E551F2E55202F56202F56202F56202F56 202F56202F56202F56202F56202F56213057213057213057213057213057213057213057213057 213057223158223158223158223158223158223158223158223158233259233259233259233259 23325923325923325923325923325924335A24335A24335A24335A24335A24335A24335A24335A 24335A24335A24335A25345B25345B25345B25345B25345B25345B25345B25345B25345B25345B 26355C26355C26355C26355C26355C26355C26355C26355C26355C26355C26355C26355C26355C 26355C26355C26355C27365D27365D27365D27365D27365D27365D27365D27365D27365D27365D 27365D27365D27365D27365D27365D27365D27365D27365D27365D27365D27365D27365D27365D 27365D27365D27365D27365D27365D27365D27365D27365D27365D27365D27365D27365D27365D 27365D27365D27365D27365D27365D27365D27365D27365D27365D27365D27365D27365D27365D 27365D27365D27365D27365D27365D27365D27365D27365D27365D26355C26355C26355C26355C 26355C26355C26355C26355C26355C26355C26355C26355C26355C26355C26355C25345B25345B 25345B25345B25345B25345B25345B25345B25345B25345B24335A24335A24335A24335A24335A 24335A24335A24335A24335A24335A24335A233259233259233259233259233259233259233259 233259233259223158223158223158223158223158223158223158223158223158213057213057 213057213057213057213057213057213057202F56202F56202F56202F56202F56202F56202F56 202F56202F561F2E551F2E551F2E551F2E551F2E551F2E551F2E551F2E551F2E551E2D541E2D54 1E2D541E2D541E2D541E2D541E2D541E2D541D2C531D2C531D2C531D2C531D2C531D2C531D2C53 1D2C531D2C531D2C531C2B521C2B521C2B521C2B521C2B521C2B521C2B521C2B521C2B52BABFCA BABFCA5858586F6F6F7575757979797B7B7B7B7B7B7A7A7A7A7A7A797979787878787878787878 7878787777777777777676767676767575757575757575757575757474741C242B1C242B1C242C 0E1013030202060606060606000000797878F7F5F1EFECE9EFECE8EEEBE7F4F1EDE9E6E28E8B88 6765646A6B6B6060605355564D5251292C2E0D0D141012180F12180D0D140E1012333938ADAFB1 A3A3A3000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000121212D6D5D6A5A4A67D7C7E605F60 13151713161A14161B46474969686A7070727A777A817F818383858685878A8889CECBC8FBF8F4 F6F3EFF6F3F0F6F3EFFFFDF9B4B1AF0D0D0D030303060606050303090A0A1B22291D252C1C242B 757575757575757575757575767676767676777777787878787878787878787878797979797979 7A7A7A7B7B7B7B7B7B7B7B7B7B7B7B7A7A7A7575757070705A5A5ABABFCABABFCA1E2D531B2A51 1C2B521C2B521C2B521C2B521C2B521C2B521C2B521C2B521C2B521C2B521D2C531D2C531D2C53 1D2C531D2C531D2C531D2C531D2C531E2D541E2D541E2D541E2D541E2D541E2D541E2D541E2D54 1E2D541F2E551F2E551F2E551F2E551F2E551F2E551F2E551F2E551F2E551F2E55202F56202F56 202F56202F56202F56202F56202F56202F56213057213057213057213057213057213057213057 213057223158223158223158223158223158223158223158223158223158233259233259233259 23325923325923325923325923325923325923325924335A24335A24335A24335A24335A24335A 24335A24335A24335A24335A25345B25345B25345B25345B25345B25345B25345B25345B25345B 25345B25345B25345B25345B26355C26355C26355C26355C26355C26355C26355C26355C26355C 26355C26355C26355C26355C26355C26355C26355C26355C26355C27365D27365D27365D27365D 27365D27365D27365D27365D27365D27365D27365D27365D27365D27365D27365D27365D27365D 27365D27365D27365D27365D27365D27365D27365D27365D27365D27365D27365D27365D27365D 27365D27365D27365D27365D27365D27365D27365D27365D27365D27365D27365D26355C26355C 26355C26355C26355C26355C26355C26355C26355C26355C26355C26355C26355C26355C26355C 26355C26355C26355C25345B25345B25345B25345B25345B25345B25345B25345B25345B25345B 25345B25345B25345B24335A24335A24335A24335A24335A24335A24335A24335A24335A233259 233259233259233259233259233259233259233259233259233259223158223158223158223158 223158223158223158223158223158223158213057213057213057213057213057213057213057 213057202F56202F56202F56202F56202F56202F56202F56202F56202F561F2E551F2E551F2E55 1F2E551F2E551F2E551F2E551F2E551F2E551E2D541E2D541E2D541E2D541E2D541E2D541E2D54 1E2D541E2D541D2C531D2C531D2C531D2C531D2C531D2C531D2C531D2C531C2B521C2B521C2B52 1C2B521C2B521C2B521C2B521C2B521C2B521C2B521B2A511B2A511B2A51BABFCABABFCA585858 7070707575757979797B7B7B7B7B7B7A7A7A7A7A7A797979797979787878787878787878787878 7777777777777676767575757575757575757575757474741C242B1C242B1C242C0E1013030202 060606060606000000797878F7F4F1EFECE8EEEBE8EEEBE7F4F1EEE8E6E28D8C8A6766656B6B6A 6161625356574D5150282A2D0A0A100F10160D10140D0D130E1015343C3BB0B3B4A3A2A3000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000121210D7D6D8A9A7A97C7B7D5D5D5F13141713151A 15171C47484B69686B71707379787A807F818584858786878C898ACFCBC9FBF8F4F6F3EFF6F3F0 F6F3F0FFFDF9B3B1AD0D0D0D030303060606050303090A0A1B22291D252C1C242B757575757575 7575757575757676767777777777777777777878787878787878787979797979797A7A7A7B7B7B 7B7B7B7B7B7B7B7B7B7A7A7A7676767070705A5A5AB9BECAB9BECA1C2C531A2A521A2A521A2A52 1A2A521A2A521A2A521A2A521A2A521A2A521A2A521A2A521B2B531B2B531B2B531B2B531B2B53 1B2B531B2B531B2B531C2C541C2C541C2C541C2C541C2C541C2C541C2C541C2C541C2C541D2D55 1D2D551D2D551D2D551D2D551D2D551D2D551D2D551D2D551E2E56202F561E2E561E2E56202F56 1E2E561E2E56202F561E2E561F2F571F2F571F2F571F2F57213057213057213057223158223158 223158223158223158203058223158223158223158223158233259233259233259233259233259 23325923325923325923325923325924335A24335A24335A24335A24335A24335A24335A24335A 24335A23335B25345B25345B25345B25345B25345B25345B25345B25345B25345B25345B25345B 26355C26355C26355C26355C26355C26355C26355C26355C26355C26355C26355C26355C26355C 26355C26355C26355C26355C27365D27365D27365D27365D27365D27365D27365D27365D27365D 27365D27365D27365D27365D27365D27365D25355D27365D27365D27365D27365D27365D27365D 27365D27365D27365D27365D27365D27365D27365D27365D27365D27365D27365D27365D27365D 27365D27365D27365D27365D27365D27365D27365D27365D27365D27365D27365D27365D26355C 26355C24345C26355C26355C26355C26355C26355C26355C26355C26355C26355C26355C26355C 26355C26355C26355C25345B25345B25345B25345B25345B25345B25345B25345B25345B25345B 25345B25345B24335A24335A24335A22325A24335A24335A24335A24335A24335A213159233259 233259233259233259233259233259233259233259233259223158223158223158223158223158 223158223158223158223158223158213057213057213057213057213057213057213057202F56 202F56202F56202F56202F56202F56202F56202F56202F561F2E551F2E551F2E551F2E551F2E55 1F2E551F2E551F2E551F2E551E2D541E2D541E2D541E2D541E2D541E2D541E2D541E2D541E2D54 1D2C531D2C531D2C531D2C531D2C531D2C531D2C531D2C531D2C531C2B521C2B521C2B521C2B52 1C2B521C2B521C2B521C2B521C2B521B2A511B2A511B2A51B9BECABABFCA585858707070757575 7A7A7A7B7B7B7B7B7B7B7B7B7A7A7A797979797979787878787878787878787878777777777777 7676767575757575757575757575757474741C242B1C242B1C242C0E1013030202060606060606 000000797878F6F3F1EEEBE7EFECE8EEEBE7F3F0EDE9E6E28D8C8B6767666A6A6A626263545657 4D5150262A2D0A0C120F10160F10160D0D130D1012313837AFB3B4A3A3A3000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000121212D8D7D8A8A8AA79797B5E5E5F14141712141815171C48494C 69696C72717379787A807F818584858786878C898ACFCBC9FBF8F4F6F3EFF6F3F0F6F3F0FFFCF9 B2AFAC0D0D0D030303060606050303090A0A1B22291D252C1C242B757575757575757575757575 7676767676767777777777777878787878787878787979797979797A7A7A7B7B7B7B7B7B7B7B7B 7C7C7C7A7A7A7676767070705A5A5AB9BECAB9BECA1C2C531A2A521A2A521A2A521A2A521A2A52 1A2A521A2A521A2A521A2A521A2A521B2B531B2B531B2B531B2B531B2B531B2B531B2B531B2B53 1C2C541C2C541C2C541C2C541C2C541C2C541C2C541C2C541C2C541C2C541D2D551D2D551D2D55 1D2D551D2D551D2D551D2D551D2D551E2E561E2E561E2E561E2E561E2E561E2E561E2E561E2E56 1E2E561E2E561F2F571F2F571F2F571F2F571F2F571F2F571F2F57203058203058203058203058 203058203058203058203058203058213159213159213159213159213159213159213159213159 21315921315922325A22325A22325A22325A22325A22325A22325A22325A22325A23335B23335B 23335B23335B23335B23335B23335B23335B23335B23335B23335B23335B23335B24345C24345C 24345C24345C24345C24345C24345C24345C24345C24345C24345C24345C24345C24345C24345C 24345C24345C25355D25355D25355D25355D25355D25355D25355D25355D25355D25355D25355D 25355D25355D25355D25355D25355D25355D25355D25355D25355D25355D25355D25355D25355D 25355D25355D25355D25355D25355D25355D25355D25355D25355D25355D25355D25355D25355D 25355D25355D25355D25355D25355D25355D25355D25355D25355D25355D24345C24345C24345C 24345C24345C24345C24345C24345C24345C24345C24345C24345C24345C24345C24345C24345C 24345C23335B23335B23335B23335B23335B23335B23335B23335B23335B23335B23335B23335B 23335B22325A22325A22325A22325A22325A22325A22325A22325A22325A213159213159213159 213159213159213159213159213159213159203058203058203058203058203058203058203058 2030582030582030581F2F571F2F571F2F571F2F571F2F571F2F571F2F571E2E561E2E561E2E56 1E2E561E2E561E2E561E2E561E2E561E2E561D2D551D2D551D2D551D2D551D2D551D2D551D2D55 1D2D551D2D551C2C541C2C541C2C541C2C541C2C541C2C541C2C541C2C541C2C541C2C541B2B53 1B2B531B2B531B2B531B2B531B2B531B2B531A2A521A2A521A2A521A2A521A2A521A2A521A2A52 1A2A521A2A521A2A521A2A52192951192951B9BECAB9BECA5858587070707575757979797B7B7B 7B7B7B7B7B7B7A7A7A797979797979787878787878787878787878777777777777767676757575 7575757575757575757474741C242B1C242B1C242C0E1013030202060606060606000000797878 F6F4F0EEEBE8EEEBE7EDEAE7F3EFEDE8E5E18D8B896766666A6B6B6262625456574A4F4F252A2B 0A0C101012171010160D0D140E1013353937B4B6B6A3A3A3000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000121212D6D5D7A5A6A97C7C80605F5F15151712131715151A4B4B4D6B6B6C727173 797779807E818584868786878C8A8ACECCC9FBF8F4F6F3EFF6F3F0F6F3F0FFFDF9B2AFAC0D0D0D 030303060606050303090A0A1B22291D252C1C242B757575757575757575757575767676777777 7777777878787878787878787878787979797A7A7A7A7A7A7B7B7B7B7B7B7B7B7B7C7C7C7A7A7A 7676767171715A5A5AB9BECAB9BECA1C2C531A2A521A2A521A2A521A2A521A2A521A2A521A2A52 1A2A521A2A521A2A521B2B531B2B531B2B531B2B531B2B531B2B531B2B531B2B531B2B531C2C54 1C2C541C2C541C2C541C2C541C2C541C2C541C2C541D2D551D2D551D2D551D2D551D2D551D2D55 1D2D551D2D551D2D551E2E561E2E561E2E561E2E561E2E561E2E561E2E561E2E561E2E561F2F57 1F2F571F2F571F2F571F2F571F2F571F2F571F2F57203058203058203058203058203058203058 203058203058203058213159213159213159213159213159213159213159213159213159213159 22325A22325A22325A22325A22325A22325A22325A22325A22325A23335B23335B23335B23335B 23335B23335B23335B23335B23335B23335B23335B23335B24345C24345C24345C24345C24345C 24345C24345C24345C24345C24345C24345C24345C24345C24345C24345C24345C25355D25355D 25355D25355D25355D25355D25355D25355D25355D25355D25355D25355D25355D25355D25355D 25355D25355D25355D25355D25355D25355D25355D25355D25355D25355D25355D25355D25355D 25355D25355D25355D25355D25355D25355D25355D25355D25355D25355D25355D25355D25355D 25355D25355D25355D25355D25355D25355D25355D25355D25355D25355D24345C24345C24345C 24345C24345C24345C24345C24345C24345C24345C24345C24345C24345C24345C24345C24345C 23335B23335B23335B23335B23335B23335B23335B23335B23335B23335B23335B23335B22325A 22325A22325A22325A22325A22325A22325A22325A22325A213159213159213159213159213159 213159213159213159213159213159203058203058203058203058203058203058203058203058 2030581F2F571F2F571F2F571F2F571F2F571F2F571F2F571F2F571E2E561E2E561E2E561E2E56 1E2E561E2E561E2E561E2E561E2E561D2D551D2D551D2D551D2D551D2D551D2D551D2D551D2D55 1D2D551C2C541C2C541C2C541C2C541C2C541C2C541C2C541C2C541B2B531B2B531B2B531B2B53 1B2B531B2B531B2B531B2B531B2B531A2A521A2A521A2A521A2A521A2A521A2A521A2A521A2A52 1A2A521A2A52192951192951B9BECAB9BECA5858587070707575757A7A7A7B7B7B7B7B7B7B7B7B 7A7A7A7A7A7A797979797979787878787878787878777777777777767676767676757575757575 7575757474741C242B1C242B1C242C0E10130302020606060606060000007B7A79F7F4F1EEEBE7 EEEBE7EDEAE6F2F0ECE8E5E18D8A886867676C6C6D6262625355564A4F4F25292A0A0D120F1217 0F10160D0F150D0F13373B3AB3B4B5A4A4A3000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 121212D7D7D7A8A8AB7C7C7E615F601414181114181415194A4B4D6B6A6C7170737A7779818081 8684858886888C898BCECBC9FBF8F4F6F3EFF6F3F0F6F3F0FFFCF9B2AFAC0D0D0D030303060606 050303090A0A1B22291D252C1C242B757575757575757575767676767676777777777777787878 7878787878787979797979797A7A7A7A7A7A7B7B7B7B7B7B7B7B7B7C7C7C7A7A7A767676717171 5A5A5AB9BECAB9BECA1D2C531A29511A29511A29511A29511A29511A29511A29511A29511A2951 1A29511B2A521B2A521B2A521B2A521B2A521B2A521B2A521B2A521C2B531C2B531C2B531C2B53 1C2B531C2B531C2B531C2B531C2B531D2C541D2C541D2C541D2C541D2C541D2C541D2C541D2C54 1D2C541E2D551E2D551E2D551E2D551E2D551E2D551E2D551E2D551E2D551F2E561F2E561F2E56 1F2E561F2E561F2E561F2E56202F57202F57202F57202F57202F57202F57202F57202F57202F57 202F57213058213058213058213058213058213058213058213058213058223159223159223159 22315922315922315922315922315922315923325A23325A23325A23325A23325A23325A23325A 23325A23325A23325A23325A23325A23325A24335B24335B24335B24335B24335B24335B24335B 24335B24335B24335B24335B24335B24335B24335B25345C24335B25345C25345C25345C25345C 25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C 25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C 25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C 25345C25345C25345C25345C25345C25345C25345C25345C25345C24335B24335B24335B24335B 24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B23325A 23325A23325A23325A23325A23325A23325A23325A23325A23325A23325A23325A223159223159 223159223159223159223159223159223159213058213058213058213058213058213058213058 213058213058213058202F57202F57202F57202F57202F57202F57202F57202F57202F57202F57 1F2E561F2E561F2E561F2E561F2E561F2E561F2E561E2D551E2D551E2D551E2D551E2D551E2D55 1E2D551E2D551E2D551D2C541D2C541D2C541D2C541D2C541D2C541D2C541D2C541D2C541C2B53 1C2B531C2B531C2B531C2B531C2B531C2B531C2B531C2B531B2A521B2A521B2A521B2A521B2A52 1B2A521B2A521B2A521A29511A29511A29511A29511A29511A29511A29511A29511A29511A2951 1A2951192850B9BECAB9BECA5959597070707575757A7A7A7B7B7B7B7B7B7B7B7B7A7A7A7A7A7A 797979797979787878787878787878777777777777767676757575757575757575757575747474 1C242B1C242B1C242C0E10130302020606060606060000007D7C7BF6F3F0EEEAE8EDEAE7ECE9E5 F2EFECE7E5E08C8A886866656E6C6C6363635456574B515026292B0B0A130F10170E10160D0D14 0F1014353A3AAFB0B0A7A6A6000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000121212D7D7D9 A5A5A87A7A7C62616215151811121615171B4B4C4F69686A716F717A797B818083868485888688 8C898ACECBC8FBF8F4F6F3EFF6F3F0F6F3F0FFFCF9B2AFAC0D0D0D030303060606050303090A0A 1B22291D252C1C242B757575757575757575767676767676777777777777787878787878787878 7979797979797A7A7A7B7B7B7B7B7B7B7B7B7B7B7B7C7C7C7B7B7B7676767171715A5A5AB9BECA B9BECA1C2B521A29511A29511A29511A29511A29511A29511A29511A29511A29511B2A521B2A52 1B2A521B2A521B2A521B2A521B2A521B2A521B2A521C2B531C2B531C2B531C2B531C2B531C2B53 1C2B531C2B531C2B531D2C541D2C541D2C541D2C541D2C541D2C541D2C541D2C541D2C541E2D55 1E2D551E2D551E2D551E2D551E2D551E2D551E2D551E2D551F2E561F2E561F2E561F2E561F2E56 1F2E561F2E56202F57202F57202F57202F57202F57202F57202F57202F57202F57202F57213058 213058213058213058213058213058213058213058213058223159223159223159223159223159 22315922315922315922315923325A23325A23325A23325A23325A23325A23325A23325A23325A 23325A23325A24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B 24335B24335B24335B24335B24335B25345C25345C25345C25345C25345C25345C25345C25345C 25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C 25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C 25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C 25345C25345C25345C25345C25345C25345C25345C24335B24335B24335B24335B24335B24335B 24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B23325A23325A 23325A23325A23325A23325A23325A23325A23325A23325A23325A223159223159223159223159 223159223159223159223159223159213058213058213058213058213058213058213058213058 213058213058202F57202F57202F57202F57202F57202F57202F57202F57202F571F2E561F2E56 1F2E561F2E561F2E561F2E561F2E561E2D551E2D551E2D551E2D551E2D551E2D551E2D551E2D55 1E2D551D2C541D2C541D2C541D2C541D2C541D2C541D2C541D2C541D2C541C2B531C2B531C2B53 1C2B531C2B531C2B531C2B531C2B531C2B531B2A521B2A521B2A521B2A521B2A521B2A521B2A52 1B2A521A29511A29511A29511A29511A29511A29511A29511A29511A29511A2951192850192850 B9BECAB9BECA5959597070707575757A7A7A7B7B7B7B7B7B7B7B7B7A7A7A7A7A7A797979797979 7878787878787878787878787777777676767676767575757575757575757575751C242B1C242B 1C242C0E10130302020606060606060000007D7C7BF6F4F0EDEAE7ECEAE6ECE9E6F2EFECE6E3E0 8C8B896767656D6B6A6363625858594C514F26292C0B0C131012180F10170F1015101214323937 ACADAFA3A2A2000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000121212D6D7D9A4A4A87B7B7E 61606216161711121616161A4D4D506967697170717B797C8280838585868887888C898ACECBC8 FBF8F4F6F3F0F6F3F0F6F4F0FFFDF9B2AFAC0D0D0D030303060606050303090A0A1B22291D252C 1C242B757575757575757575767676777777777777777777787878787878787878797979797979 7A7A7A7B7B7B7B7B7B7B7B7B7C7C7C7C7C7C7B7B7B7676767171715A5A5AB9BECAB9BECA1D2C53 1A29511A29511A29511A29511A29511A29511A29511A29511A29511B2A521B2A521B2A521B2A52 1B2A521B2A521B2A521B2A521C2B531C2B531C2B531C2B531C2B531C2B531C2B531C2B531C2B53 1C2B531D2C541D2C541D2C541D2C541D2C541D2C541D2C541D2C541D2C541E2D551E2D551E2D55 1E2D551E2D551E2D551E2D551E2D551F2E561F2E561F2E561F2E561F2E561F2E561F2E561F2E56 202F57202F57202F57202F57202F57202F57202F57202F57202F57213058213058213058213058 213058213058213058213058213058213058223159223159223159223159223159223159223159 22315923325A23325A23325A23325A23325A23325A23325A23325A23325A23325A23325A23325A 24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B 24335B24335B24335B25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C 25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C 25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C 25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C 25345C25345C25345C25345C25345C25345C25345C24335B24335B24335B24335B24335B24335B 24335B24335B24335B24335B24335B24335B24335B24335B24335B23325A23325A23325A23325A 23325A23325A23325A23325A23325A23325A23325A23325A223159223159223159223159223159 223159223159223159213058213058213058213058213058213058213058213058213058213058 202F57202F57202F57202F57202F57202F57202F57202F57202F571F2E561F2E561F2E561F2E56 1F2E561F2E561F2E561E2D551E2D551E2D551E2D551E2D551E2D551E2D551E2D551E2D551D2C54 1D2C541D2C541D2C541D2C541D2C541D2C541D2C541D2C541C2B531C2B531C2B531C2B531C2B53 1C2B531C2B531C2B531C2B531C2B531B2A521B2A521B2A521B2A521B2A521B2A521B2A521A2951 1A29511A29511A29511A29511A29511A29511A29511A29511A29511A2951192850B9BECAB9BECA 5959597070707676767A7A7A7B7B7B7B7B7B7B7B7B7B7B7B7A7A7A7A7A7A797979787878787878 7878787878787777777676767676767575757575757575757575751C242B1C242B1C242C0E1013 0302020606060606060000007D7C7BF6F3F0ECE9E6ECE9E6EBE9E5F1EFECE6E3E08C8B89686766 6C6C6B62636358595A4D5050282B2D0B0D131012171112170D0F130F1013353B37B6B7B8A3A3A3 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000121212D9D9D8A7A6AA7B7A7D5F5E5F141417 11121614161B4C4C5069676A7170717A797C8281838685868887888B898BCFCCC9FBF8F4F6F3EF F6F3F0F6F3F0FFFDF9B2AFAC0D0D0D030303060606050303090A0A1B22291D252C1C242B757575 7575757575757676767777777777777878787878787878787878787979797A7A7A7A7A7A7B7B7B 7B7B7B7B7B7B7B7B7B7C7C7C7B7B7B7676767171715A5A5AB9BECAB9BECA1D2C531A29511A2951 1A29511A29511A29511A29511A29511A29511A29511B2A521B2A521B2A521B2A521B2A521B2A52 1B2A521B2A521C2B531C2B531C2B531C2B531C2B531C2B531C2B531C2B531C2B531C2B531D2C54 1D2C541D2C541D2C541D2C541D2C541D2C541D2C541D2C541E2D551E2D551E2D551E2D551E2D55 1E2D551E2D551E2D551F2E561F2E561F2E561F2E561F2E561F2E561F2E56202F57202F57202F57 202F57202F57202F57202F57202F57202F57202F57213058213058213058213058213058213058 21305821305821305822315922315922315922315922315922315922315922315922315923325A 23325A23325A23325A23325A23325A23325A23325A23325A23325A23325A24335B24335B24335B 24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B 25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C 25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C 26355D25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C 25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C 25345C25345C25345C25345C25345C25345C24335B24335B24335B24335B24335B24335B24335B 24335B24335B24335B24335B24335B24335B24335B24335B23325A23325A23325A23325A23325A 23325A23325A23325A23325A23325A23325A223159223159223159223159223159223159223159 223159223159213058213058213058213058213058213058213058213058213058202F57202F57 202F57202F57202F57202F57202F57202F57202F571F2E561F2E561F2E561F2E561F2E561F2E56 1F2E561F2E561E2D551E2D551E2D551E2D551E2D551E2D551E2D551E2D551D2C541D2C541D2C54 1D2C541D2C541D2C541D2C541D2C541D2C541C2B531C2B531C2B531C2B531C2B531C2B531C2B53 1C2B531C2B531B2A521B2A521B2A521B2A521B2A521B2A521B2A521B2A521A29511A29511A2951 1A29511A29511A29511A29511A29511A29511A29511A2951192850B9BECAB9BECA595959707070 7676767A7A7A7C7C7C7B7B7B7B7B7B7B7B7B7A7A7A7A7A7A797979787878787878787878787878 7777777676767676767575757575757575757575751C242B1C242B1C242C0E1013030202060606 0606060000007D7C7CF5F3EFECEAE6ECE9E6ECE9E6F1EFEBE6E3E08C8C8B6869686D6C6B636361 5658574E525228292C0B0C131012170F10170F0F140F1214343B39B3B4B7A3A2A3000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000121212D7D6D7A4A3A478787A5B5A5B14151612131714161B 4D4D506A686A7070717C797C8381838785868987888C8A8ACFCBC8FBF8F4F6F3F0F6F3F0F6F3F0 FFFCF9B1AFAC0D0D0D030303060606050303090A0A1B22291D252C1C242B757575757575767676 7676767777777777777878787878787878787979797979797A7A7A7A7A7A7B7B7B7B7B7B7B7B7B 7C7C7C7C7C7C7B7B7B7777777171715A5A5AB9BECAB9BECA1D2C531A29511A29511A29511A2951 1A29511A29511A29511A29511A29511B2A521B2A521B2A521B2A521B2A521B2A521B2A521B2A52 1C2B531C2B531C2B531C2B531C2B531C2B531C2B531C2B531C2B531D2C541D2C541D2C541D2C54 1D2C541D2C541D2C541D2C541D2C541E2D551E2D551E2D551E2D551E2D551E2D551E2D551E2D55 1E2D551F2E561F2E561F2E561F2E561F2E561F2E561F2E561F2E56202F57202F57202F57202F57 202F57202F57202F57202F57202F57213058213058213058213058213058213058213058213058 22315922315922315922315922315922315922315922315922315922315923325A23325A23325A 23325A23325A23325A23325A23325A23325A23325A23325A24335B24335B24335B24335B24335B 24335B24335B24335B24335B24335B24335B24335B24335B24335B25345C25345C25345C25345C 25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C 25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C26355D26355D26355D 26355D26355D26355D26355D25345C25345C25345C26355D25345C25345C25345C25345C25345C 25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C 25345C25345C25345C25345C25345C24335B24335B24335B24335B24335B24335B24335B24335B 24335B24335B24335B24335B24335B24335B23325A23325A23325A23325A23325A23325A23325A 23325A23325A23325A23325A23325A223159223159223159223159223159223159223159223159 213058213058213058213058213058213058213058213058213058213058202F57202F57202F57 202F57202F57202F57202F57202F57202F571F2E561F2E561F2E561F2E561F2E561F2E561F2E56 1E2D551E2D551E2D551E2D551E2D551E2D551E2D551E2D551E2D551D2C541D2C541D2C541D2C54 1D2C541D2C541D2C541D2C541C2B531C2B531C2B531C2B531C2B531C2B531C2B531C2B531C2B53 1C2B531B2A521B2A521B2A521B2A521B2A521B2A521B2A521B2A521A29511A29511A29511A2951 1A29511A29511A29511A29511A29511A2951192850B9BECAB9BECA5959597171717676767A7A7A 7C7C7C7B7B7B7B7B7B7B7B7B7A7A7A797979797979787878787878787878787878777777777777 7676767676767575757575757575751C242B1C242B1C242C0E1013030202060606060606000000 7D7C7BF4F2EFEBE9E5ECE9E6EBE8E5F1EEEAE6E4E08D8D8B6A69686D6C6B6263615759584E5252 282A2D0F0F1513141A121419101016101316313736ACAEAFA4A3A3000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000121212D6D6D7A1A0A27E7D805D5D5E13141612131714151A4E4D506B6A6C 7170727B7A7C8382838785868987888C898ACECAC8FBF8F4F6F3F0F6F3EFF6F3F0FFFDFAB0ADAA 0C0C0C030303060606050303090A0A1B22291D252C1C242B757575757575757575767676777777 7777777878787878787878787979797979797A7A7A7A7A7A7B7B7B7B7B7B7B7B7B7C7C7C7C7C7C 7B7B7B7777777171715A5A5AB9BECAB9BECA1D2C531A29511A29511A29511A29511A29511A2951 1A29511A29511A29511B2A521B2A521B2A521B2A521B2A521B2A521B2A521B2A521C2B531C2B53 1C2B531C2B531C2B531C2B531C2B531C2B531C2B531D2C541D2C541D2C541D2C541D2C541D2C54 1D2C541D2C541D2C541E2D551E2D551E2D551E2D551E2D551E2D551E2D551E2D551E2D551F2E56 1F2E561F2E561F2E561F2E561F2E561F2E56202F57202F57202F57202F57202F57202F57202F57 202F57202F57213058213058213058213058213058213058213058213058213058223159223159 22315922315922315922315922315922315922315923325A23325A23325A23325A23325A23325A 23325A23325A23325A23325A23325A23325A24335B24335B24335B24335B24335B24335B24335B 24335B24335B24335B24335B24335B24335B25345C25345C25345C25345C25345C25345C25345C 25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C 25345C25345C25345C25345C26355D26355D26355D26355D26355D26355D26355D26355D26355D 26355D26355D26355D26355D26355D26355D25345C26355D25345C25345C25345C25345C25345C 25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C 25345C25345C25345C24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B 24335B24335B24335B24335B23325A23325A23325A23325A23325A23325A23325A23325A23325A 23325A23325A23325A223159223159223159223159223159223159223159223159213058213058 213058213058213058213058213058213058213058213058202F57202F57202F57202F57202F57 202F57202F57202F57202F571F2E561F2E561F2E561F2E561F2E561F2E561F2E561E2D551E2D55 1E2D551E2D551E2D551E2D551E2D551E2D551E2D551D2C541D2C541D2C541D2C541D2C541D2C54 1D2C541D2C541D2C541C2B531C2B531C2B531C2B531C2B531C2B531C2B531C2B531C2B531B2A52 1B2A521B2A521B2A521B2A521B2A521B2A521B2A521A29511A29511A29511A29511A29511A2951 1A29511A29511A29511A2951192850B9BECAB9BECA5959597171717676767A7A7A7B7B7B7B7B7B 7B7B7B7B7B7B7A7A7A7A7A7A797979797979787878787878787878777777777777767676757575 7575757575757575751C242B1C242B1C242C0E10130302020606060606060000007E7C7CF4F2EF EBE9E5EBE9E5EBE8E4F0EDE9E6E4E08D8C896A67676D6B6B61636357595A505252292B2D0D0D14 1213181213180F10150F1215323838ACAEB1A3A3A3000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000121212D6D6D7A4A3A77D7C7E5C5C5C1213151314171415194F4E516D6B6D7171727C7A7D 8483848886868987898B8889CDCAC8FBF8F5F6F3F0F6F3EFF6F3F0FFFDF9AFACAA0C0C0C030303 060606050303090A0A1B22291D252C1C242B757575757575767676767676777777777777787878 7878787878787979797979797A7A7A7A7A7A7B7B7B7B7B7B7B7B7B7C7C7C7D7D7D7B7B7B777777 7171715A5A5AB9BECAB9BECA1D2C531A29511A29511A29511A29511A29511A29511A29511A2951 1A29511B2A521B2A521B2A521B2A521B2A521B2A521B2A521B2A521C2B531C2B531C2B531C2B53 1C2B531C2B531C2B531C2B531C2B531D2C541D2C541D2C541D2C541D2C541D2C541D2C541D2C54 1D2C541E2D551E2D551E2D551E2D551E2D551E2D551E2D551E2D551E2D551F2E561F2E561F2E56 1F2E561F2E561F2E561F2E56202F57202F57202F57202F57202F57202F57202F57202F57202F57 213058213058213058213058213058213058213058213058213058223159223159223159223159 22315922315922315922315922315923325A23325A23325A23325A23325A23325A23325A23325A 23325A23325A23325A24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B 24335B24335B24335B24335B25345C25345C25345C25345C25345C25345C25345C25345C25345C 25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C26355D25345C 26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D 26355D26355D26355D26355D26355D26355D26355D25345C25345C25345C25345C25345C25345C 25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C 25345C25345C24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B 24335B24335B24335B23325A23325A23325A23325A23325A23325A23325A23325A23325A23325A 23325A223159223159223159223159223159223159223159223159223159213058213058213058 213058213058213058213058213058213058202F57202F57202F57202F57202F57202F57202F57 202F57202F571F2E561F2E561F2E561F2E561F2E561F2E561F2E561E2D551E2D551E2D551E2D55 1E2D551E2D551E2D551E2D551E2D551E2D551D2C541D2C541D2C541D2C541D2C541D2C541D2C54 1D2C541C2B531C2B531C2B531C2B531C2B531C2B531C2B531C2B531C2B531B2A521B2A521B2A52 1B2A521B2A521B2A521B2A521B2A521A29511A29511A29511A29511A29511A29511A29511A2951 1A29511A2951192850B9BECAB9BECA5959597171717676767B7B7B7C7C7C7B7B7B7B7B7B7B7B7B 7A7A7A7A7A7A797979797979787878787878787878777777777777767676767676757575757575 7575751C242B1C242B1C242C0E1013030202060606060606000000807F7EF5F3EFEBE9E5ECE9E5 EAE8E5F0EDEAE6E3DF8D8D8A6A68676E6D6A626263565759505352282B2C0D0D13111317111217 101016111315313536ADB0B2A3A3A3000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000121212 D6D6D7A2A0A67876795959591414161314171415194F4E516D6B6D7271737C7A7D848284888687 8988888C8989CECBC8FBF8F4F6F3EFF6F3EFF6F4F0FFFDFAAFADAB0C0C0C030303060606050303 090A0A1B22291D252C1C242B757575757575767676767676777777777777787878787878787878 7979797979797A7A7A7A7A7A7B7B7B7B7B7B7B7B7B7C7C7C7D7D7D7B7B7B7777777171715A5A5A B9BECABABFCB1D2C531A29511A29511A29511A29511A29511A29511A29511A29511A29511B2A52 1B2A521B2A521B2A521B2A521B2A521B2A521C2B531C2B531C2B531C2B531C2B531C2B531C2B53 1C2B531C2B531C2B531D2C541D2C541D2C541D2C541D2C541D2C541D2C541D2C541E2D551E2D55 1E2D551E2D551E2D551E2D551E2D551E2D551E2D551F2E561F2E561F2E561F2E561F2E561F2E56 1F2E56202F57202F57202F57202F57202F57202F57202F57202F57202F57202F57213058213058 213058213058213058213058213058213058223159223159223159223159223159223159223159 22315922315923325A23325A23325A23325A23325A23325A23325A23325A23325A23325A23325A 24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B 24335B25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C 25345C25345C25345C25345C25345C25345C25345C25345C26355D26355D26355D26355D26355D 26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D 26355D26355D26355D26355D26355D26355D25345C26355D25345C25345C25345C25345C25345C 25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C 25345C24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B 24335B24335B23325A23325A23325A23325A23325A23325A23325A23325A23325A23325A23325A 223159223159223159223159223159223159223159223159223159213058213058213058213058 213058213058213058213058202F57202F57202F57202F57202F57202F57202F57202F57202F57 1F2E561F2E561F2E561F2E561F2E561F2E561F2E561F2E561E2D551E2D551E2D551E2D551E2D55 1E2D551E2D551E2D551E2D551D2C541D2C541D2C541D2C541D2C541D2C541D2C541D2C541C2B53 1C2B531C2B531C2B531C2B531C2B531C2B531C2B531C2B531B2A521B2A521B2A521B2A521B2A52 1B2A521B2A521B2A521A29511A29511A29511A29511A29511A29511A29511A29511A29511A2951 192850B9BECAB9BECA5959597171717676767A7A7A7C7C7C7B7B7B7B7B7B7B7B7B7A7A7A7A7A7A 7979797979797878787878787878787777777777777676767676767575757575757575751C242B 1C242B1C242C0E101303020206060606060600000080807EF5F2EEEBE9E5EBE9E5EAE7E4F0EDEA E5E2DF8D8C8A6A69676E6E6B646563585B5A4E5352262A2C0D0F14111418121418101016101417 343939ADAFAFA4A3A3000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000121212D5D5D79F9EA3 7E7D805D5D5D11141512141814151A4E4C4F6E6B6E7371747C797C84828488878889898A8C8989 CECBC8FBF8F4F6F3EFF6F3F0F6F3F0FFFDFAAFACAA0C0C0C030303060606050303090A0A1B2229 1D252C1C242B757575757575767676777777777777777777787878787878787878797979797979 7A7A7A7A7A7A7B7B7B7B7B7B7B7B7B7C7C7C7D7D7D7B7B7B7777777171715A5A5AB9BECABABFCB 1D2C531A29511A29511A29511A29511A29511A29511A29511A29511B2A521B2A521B2A521B2A52 1B2A521B2A521B2A521B2A521C2B531C2B531C2B531C2B531C2B531C2B531C2B531C2B531C2B53 1D2C541D2C541D2C541D2C541D2C541D2C541D2C541D2C541D2C541E2D551E2D551E2D551E2D55 1E2D551E2D551E2D551E2D551E2D551F2E561F2E561F2E561F2E561F2E561F2E561F2E56202F57 202F57202F57202F57202F57202F57202F57202F57202F57213058213058213058213058213058 213058213058213058213058213058223159223159223159223159223159223159223159223159 23325A23325A23325A23325A23325A23325A23325A23325A23325A23325A23325A24335B24335B 24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B25345C25345C 25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C 25345C25345C25345C25345C26355D26355D26355D26355D26355D26355D26355D26355D26355D 26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D 26355D26355D26355D26355D26355D26355D25345C25345C25345C25345C25345C25345C25345C 25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C24335B 24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B 23325A23325A23325A23325A23325A23325A23325A23325A23325A23325A23325A223159223159 223159223159223159223159223159223159223159213058213058213058213058213058213058 213058213058213058202F57202F57202F57202F57202F57202F57202F57202F57202F571F2E56 1F2E561F2E561F2E561F2E561F2E561F2E561F2E561E2D551E2D551E2D551E2D551E2D551E2D55 1E2D551E2D551D2C541D2C541D2C541D2C541D2C541D2C541D2C541D2C541C2B531C2B531C2B53 1C2B531C2B531C2B531C2B531C2B531C2B531B2A521B2A521B2A521B2A521B2A521B2A521B2A52 1B2A521B2A521A29511A29511A29511A29511A29511A29511A29511A29511A2951192850B9BECA B9BECA5959597171717676767B7B7B7C7C7C7C7C7C7B7B7B7B7B7B7B7B7B7A7A7A797979787878 7878787878787878787777777777777676767676767575757575757575751C242B1C242B1C242C 0E101303020206060606060601000081807FF4F2EEEBE8E4EBE8E4E9E7E3F0EDE9E5E1DF8E8C89 6A69666C6C6A676664585C5A4F5253282B2D0E0F1514151A131519101017111416323838AFB1B1 A4A4A4000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000121212D9D9DAA1A2A47B7A7C5C5B5C 11131612131914151A4E4E516E6C6E7371747C7A7C8382838887888A898A8C898ACECAC9FBF8F4 F6F3EFF6F3F0F6F3F0FFFDFAB0ADAB0C0C0C030303060606050303090A0A1B22291D252C1C242B 7575757575757676767676767777777878787878787878787878787979797979797A7A7A7B7B7B 7B7B7B7B7B7B7C7C7C7C7C7C7D7D7D7B7B7B7777777171715A5A5AB9BECABABFCB1D2C531A2951 1A29511A29511A29511A29511A29511A29511A29511B2A521B2A521B2A521B2A521B2A521B2A52 1B2A521B2A521C2B531C2B531C2B531C2B531C2B531C2B531C2B531C2B531C2B531D2C541D2C54 1D2C541D2C541D2C541D2C541D2C541D2C541D2C541E2D551E2D551E2D551E2D551E2D551E2D55 1E2D551E2D551E2D551F2E561F2E561F2E561F2E561F2E561F2E561F2E561F2E56202F57202F57 202F57202F57202F57202F57202F57202F57213058213058213058213058213058213058213058 21305821305822315922315922315922315922315922315922315922315922315923325A23325A 23325A23325A23325A23325A23325A23325A23325A23325A23325A24335B24335B24335B24335B 24335B24335B24335B24335B24335B24335B24335B24335B24335B25345C25345C25345C25345C 25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C24335B 202D50202D4F25335B26355D26355D26355D26355D26355D26355D23315623305526355D26355D 26355D26355D26355D26355D26355D212E5224335A26355D26355D26355D26355D26355D26355D 26355D212E5224335A26355D26355D26355D26355D25345C25345C25345C202D5123325925345C 25345C25345C25345C25345C25345C25345C202D5123325925345C25345C25345C24335B24335B 24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B23325A23325A 23325A23325A23325A23325A23325A23325A23325A23325A23325A23325A223159223159223159 223159223159223159223159223159213058213058213058213058213058213058213058213058 213058202F57202F57202F57202F57202F57202F57202F57202F57202F571F2E561F2E561F2E56 1F2E561F2E561F2E561F2E561E2D551E2D551E2D551E2D551E2D551E2D551E2D551E2D551E2D55 1D2C541D2C541D2C541D2C541D2C541D2C541D2C541D2C541D2C541C2B531C2B531C2B531C2B53 1C2B531C2B531C2B531C2B531C2B531B2A521B2A521B2A521B2A521B2A521B2A521B2A521B2A52 1A29511A29511A29511A29511A29511A29511A29511A29511A29511A2951B9BECAB9BECA595959 7171717676767B7B7B7C7C7C7C7C7C7B7B7B7B7B7B7A7A7A7A7A7A7A7A7A797979787878787878 7878787777777777777676767676767575757575757575751C242B1C242B1C242C0E1013030202 06060606060601000081807EF4F2EEEAE8E4EAE7E4E9E7E3EFECE9E5E2DE8F8D896A68676D6C6C 6766655A5B5C515354292C2F10101615161B14161A1213181113162E3737AAACB1A3A2A2000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000121212D8D6D79E9FA07A797A585757121315121319 14151A504F516F6D707472757B797C8482838886878987898C8989CFCBC9FAF8F4F6F3F0F6F3F0 F6F3F0FFFDFAB0ADAB0C0C0C030303060606050303090A0A1B22291D252C1C242B757575757575 7676767676767777777878787878787878787878787979797979797A7A7A7B7B7B7B7B7B7B7B7B 7C7C7C7C7C7C7D7D7D7C7C7C7777777171715B5B5BB9BECABABFCB1D2C531A29511A29511A2951 1A29511A29511A29511A29511A29511B2A521B2A521B2A521B2A521B2A521B2A521B2A521B2A52 1C2B531C2B531C2B531C2B531C2B531C2B531C2B531C2B531C2B531D2C541D2C541D2C541D2C54 1D2C541D2C541D2C541D2C541D2C541E2D551E2D551E2D551E2D551E2D551E2D551E2D551E2D55 1E2D551F2E561F2E561F2E561F2E561F2E561F2E561F2E56202F57202F57202F57202F57202F57 202F57202F57202F57202F57213058213058213058213058213058213058213058213058213058 22315922315922315922315922315922315922315922315923325A23325A23325A23325A23325A 23325A23325A23325A23325A23325A23325A24335B24335B24335B24335B24335B24335B24335B 24335B24335B24335B24335B24335B24335B24335B25345C24335B020305000000000000000000 00000003040725345B25345C25345C25345C25345C25345C25345C1A254205070B222222262626 08090C17213A26355D26355D26355D1E2A4B090C1411111214141406080E1D294826355D26355D 26355D151E3605070C1E1E1F09090B0B101C23315726355D26355D26355D151E3605070C1E1E1F 08090A0B101C23315726355D26355D25345C161E3505070C1E1E1F08090A0A101B22305525345C 25345C25345C151D3505070D1E1E1F08090A0A101B22305625345C25345C24335B24335B24335B 24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B23325A23325A23325A 23325A23325A23325A23325A23325A23325A23325A23325A223159223159223159223159223159 223159223159223159213058213058213058213058213058213058213058213058213058202F57 202F57202F57202F57202F57202F57202F57202F57202F571F2E561F2E561F2E561F2E561F2E56 1F2E561F2E561F2E561E2D551E2D551E2D551E2D551E2D551E2D551E2D551E2D551D2C541D2C54 1D2C541D2C541D2C541D2C541D2C541D2C541D2C541C2B531C2B531C2B531C2B531C2B531C2B53 1C2B531C2B531C2B531B2A521B2A521B2A521B2A521B2A521B2A521B2A521B2A521A29511A2951 1A29511A29511A29511A29511A29511A29511A29511A2951B9BECAB9BECA595959717171777777 7B7B7B7C7C7C7B7B7B7B7B7B7B7B7B7A7A7A7A7A7A797979797979797979787878787878787878 7777777676767676767575757575757575751C242B1C242B1C242C0E1013030202060606060606 00000081807FF5F2EFEAE7E3EAE7E3E9E6E2EEEBE8E4E1DE8F8C8A6B69686E6D6B656565595C5C 51525328292D10101514151A13151A1112181416182F3737A7AAAFA2A0A0000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000121212D5D5D69D9DA17A7A7C57575910121512131714161A515052 6F6D6F7473757C7A7C8483848886888A878A8C898ACDCAC7FAF8F3F6F3F0F6F3F0F6F3F0FFFDFA AEACA90D0C0C030303060606050303090A0A1B22291D252C1C242B757575757575767676777777 7777777777777878787878787878787979797979797A7A7A7B7B7B7B7B7B7B7B7B7C7C7C7D7D7D 7D7D7D7C7C7C7777777171715B5B5BB9BECABABFCB1D2C531A29511A29511A29511A29511A2951 1A29511A29511A29511B2A521B2A521B2A521B2A521B2A521B2A521B2A521B2A521C2B531C2B53 1C2B531C2B531C2B531C2B531C2B531C2B531C2B531D2C541D2C541D2C541D2C541D2C541D2C54 1D2C541D2C541E2D551E2D551E2D551E2D551E2D551E2D551E2D551E2D551E2D551F2E561F2E56 1F2E561F2E561F2E561F2E561F2E561F2E56202F57202F57202F57202F57202F57202F57202F57 202F57202F57213058213058213058213058213058213058213058213058213058223159223159 22315922315922315922315922315922315923325A23325A23325A23325A23325A23325A23325A 23325A23325A23325A23325A24335B24335B24335B24335B24335B24335B24335B24335B24335B 24335B24335B24335B24335B25345C25345C212F52F3F3F4FFFFFFFFFFFFFFFFFFFFFFFFEEEFF1 28375F25345C25345C25345C25345C25345C1F2B4D4B4C4DE6E7E9FFFFFFFFFFFFEFEFF0616162 1C274626355D23305535373CCACBCEFDFDFEFFFFFFDADBDE3A3B3C202D4F26355D1A25416D6D6E E0E1E4FBFBFBF5F6F7B4B5B8171A2426355D26355D1A26426D6D6EE0E1E4FBFBFBF5F6F7B5B6B8 171A2426355D26355D1A25416B6C6EE0E1E4FBFBFBF5F6F7B4B5B81A1D2625345C25345C1A2440 6D6D6EDEDFE2FBFBFBF5F6F7B4B5B8171A2425345B25345C24335B24335B24335B24335B24335B 24335B24335B24335B24335B24335B24335B24335B24335B23325A23325A23325A23325A23325A 23325A23325A23325A23325A23325A23325A223159223159223159223159223159223159223159 223159213058213058213058213058213058213058213058213058213058202F57202F57202F57 202F57202F57202F57202F57202F57202F57202F571F2E561F2E561F2E561F2E561F2E561F2E56 1E2D551E2D551E2D551E2D551E2D551E2D551E2D551E2D551E2D551D2C541D2C541D2C541D2C54 1D2C541D2C541D2C541D2C541D2C541C2B531C2B531C2B531C2B531C2B531C2B531C2B531C2B53 1C2B531B2A521B2A521B2A521B2A521B2A521B2A521B2A521B2A521A29511A29511A29511A2951 1A29511A29511A29511A29511A29511A2951B9BECAB9BECA5959597171717777777B7B7B7D7D7D 7C7C7C7B7B7B7B7B7B7B7B7B7A7A7A7A7A7A797979787878787878787878777777777777777777 7676767575757575757575751C242B1C242B1C242C0E101303020206060606060600000081807E F5F3EFE9E6E3EAE7E3E8E5E2EEEBE8E4E2DE8E8D896A69686F6D6C656564585B5B4F525327292D 10101615161B15161B121318141517343A39AAACABA3A0A2000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000121212D6D6D89C9B9F7776785A5A5B12131612121813151A504F536F6E70757375 7C7A7C8482828786878987898C8A89CDCAC6FAF8F3F6F3F0F6F3F0F6F3F0FFFEF9AEABA80C0A0A 030303060606050303090A0A1B22291D252C1C242B757575767676767676777777777777787878 7878787878787878787979797A7A7A7B7B7B7B7B7B7B7B7B7B7B7B7C7C7C7C7C7C7D7D7D7B7B7B 7777777171715B5B5BB9BECABABFCB1D2C531A29511A29511A29511A29511A29511A29511A2951 1A29511B2A521B2A521B2A521B2A521B2A521B2A521B2A521B2A521C2B531C2B531C2B531C2B53 1C2B531C2B531C2B531C2B531C2B531D2C541D2C541D2C541D2C541D2C541D2C541D2C541D2C54 1E2D551E2D551E2D551E2D551E2D551E2D551E2D551E2D551E2D551F2E561F2E561F2E561F2E56 1F2E561F2E561F2E561F2E56202F57202F57202F57202F57202F57202F57202F57202F57213058 213058213058213058213058213058213058213058213058223159223159223159223159223159 22315922315922315922315923325A23325A23325A23325A23325A23325A23325A23325A23325A 23325A24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B 24335B25345C25345C25345C343E59FCFCFC717A945D69865D68865D688658648326355D25345C 25345C25345C25345C25345C3B445AF3F3F4A8ADBA4C597A4D5A7AA5ABB9FAFAFB4F566826355D 283047DBDBDCBBC0CB4B5778455274A0A6B8F4F4F4343A4A26355D52555CFBFBFB858DA43C4A6E 515D7DD3D5DAC4C4C41E2A4B26355D52555CFBFBFB858DA43C4A6E515D7DD1D3D9C4C4C41E2A4B 26355D52555CF9F9F9858DA43C496D505C7CD3D5DAC4C5C51D2A4A25345C52555CFBFBFB868FA5 3C496D505C7CD3D5DAC4C4C4202D4C25345C24335B24335B24335B24335B24335B24335B24335B 24335B24335B24335B24335B24335B24335B24335B23325A23325A23325A23325A23325A23325A 23325A23325A23325A23325A223159223159223159223159223159223159223159223159213058 213058213058213058213058213058213058213058213058213058202F57202F57202F57202F57 202F57202F57202F57202F57202F571F2E561F2E561F2E561F2E561F2E561F2E561F2E561E2D55 1E2D551E2D551E2D551E2D551E2D551E2D551E2D551E2D551D2C541D2C541D2C541D2C541D2C54 1D2C541D2C541D2C541D2C541C2B531C2B531C2B531C2B531C2B531C2B531C2B531C2B531B2A52 1B2A521B2A521B2A521B2A521B2A521B2A521B2A521A29511A29511A29511A29511A29511A2951 1A29511A29511A29511A2951BABFCBB9BECA5959597171717777777B7B7B7C7C7C7C7C7C7B7B7B 7B7B7B7B7B7B7A7A7A7A7A7A797979787878787878787878787878777777767676767676767676 7575757575751C242B1C242B1C242C0E1013030202060606060606000000828280F5F4F0E9E6E2 E9E6E2E8E5E2EEEBE8E4E2DE8F8E8B6B6A696E6D6C6565635A5B5C505454282B2E11121715171C 16161B121217141418373C3CA9ACAE9F9F9F000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 121212D6D6D89F9CA17978795B5B5D11121612131813141A4F4E516F6E707573767C7A7C838283 87868889878A8D8989CECBC8FBF8F4F6F3EFF6F3EFF6F3EFFFFDFAACAAA80A0A0A030303060606 050303090A0A1B22291D252C1C242B757575757575767676777777777777787878787878787878 7979797979797A7A7A7A7A7A7B7B7B7B7B7B7B7B7B7C7C7C7D7D7D7D7D7D7C7C7C777777717171 5B5B5BB9BECABABFCB1D2C531A29511A29511A29511A29511A29511A29511A29511A29511B2A52 1B2A521B2A521B2A521B2A521B2A521B2A521B2A521C2B531C2B531C2B531C2B531C2B531C2B53 1C2B531C2B531C2B531D2C541D2C541D2C541D2C541D2C541D2C541D2C541D2C541E2D551E2D55 1E2D551E2D551E2D551E2D551E2D551E2D551E2D551F2E561F2E561F2E561F2E561F2E561F2E56 1F2E56202F57202F57202F57202F57202F57202F57202F57202F57202F57213058213058213058 213058213058213058213058213058213058223159223159223159223159223159223159223159 22315923325A23325A23325A23325A23325A23325A23325A23325A23325A23325A23325A24335B 24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B 25345C25345C52596AF2F2F3202B49131B31141D341F2C4D25345C25345C25345C25345C25345C 25345C25345C6F7890FDFDFE363C4A26335B24335A2D3344FCFCFC78809628365E727682FCFCFC 3D4B6F26355D26355D2B3A61FAFAFB8A8C9127365EBEBEBFC6C8CD27365E26355D27365E6F778A FEFEFE424A5D26355DBCBCBEC6C8CD27365E26355D27365E6E758AFEFEFE424A5D26355DBEBEBF C6C8CD27365E25345C26355D6F768AFCFCFC41495D25345CBEBEBFC6C8CD29385F25345C26355D 6F768AFEFEFE444C5F25345C24335B24335B24335B24335B24335B24335B24335B24335B24335B 24335B24335B24335B24335B24335B23325A23325A23325A23325A23325A23325A23325A23325A 23325A23325A23325A223159223159223159223159223159223159223159223159213058213058 213058213058213058213058213058213058213058202F57202F57202F57202F57202F57202F57 202F57202F57202F571F2E561F2E561F2E561F2E561F2E561F2E561F2E561E2D551E2D551E2D55 1E2D551E2D551E2D551E2D551E2D551E2D551D2C541D2C541D2C541D2C541D2C541D2C541D2C54 1D2C541C2B531C2B531C2B531C2B531C2B531C2B531C2B531C2B531C2B531B2A521B2A521B2A52 1B2A521B2A521B2A521B2A521B2A521B2A521A29511A29511A29511A29511A29511A29511A2951 1A29511A2951B9BECAB9BECA5959597171717777777B7B7B7C7C7C7B7B7B7B7B7B7B7B7B7B7B7B 7A7A7A7A7A7A797979797979787878787878787878777777777777767676757575757575757575 1C242B1C242B1C242C0E1013030202060606060606000000848482F7F4F1E8E5E2E8E6E2E7E5E1 EEEBE7E3E0DC8E8D886B6B696F6D6B6565645A5B5C515456292A2D10121615161B15161B121319 141619333838AAACADA3A3A2000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000121212D8D7D9 9F9CA179797B5C5C5E12131712131815161B5251546E6D707573757C7A7C84838488878889888A 8C8888CECAC7FBF8F4F6F3EFF6F3EFF6F3F0FFFDF9ADAAA80A0A0A030303060606050303090A0A 1B22291D252C1C242B757575767676767676777777777777787878787878787878797979797979 7A7A7A7A7A7A7B7B7B7B7B7B7B7B7B7C7C7C7D7D7D7D7D7D7C7C7C7777777171715B5B5BB9BECA BABFCB1D2C531A29511A29511A29511A29511A29511A29511A29511B2A521B2A521B2A521B2A52 1B2A521B2A521B2A521B2A521B2A521C2B531C2B531C2B531C2B531C2B531C2B531C2B531C2B53 1C2B531D2C541D2C541D2C541D2C541D2C541D2C541D2C541D2C541E2D551E2D551E2D551E2D55 1E2D551E2D551E2D551E2D551F2E561F2E561F2E561F2E561F2E561F2E561F2E561F2E56202F57 202F57202F57202F57202F57202F57202F57202F57202F57213058213058213058213058213058 213058213058213058213058223159223159223159223159223159223159223159223159223159 23325A23325A23325A23325A23325A23325A23325A23325A23325A23325A24335B24335B24335B 24335B24335B24335B24335B24335B24335B24335B24335B24335B25345C25345C25345C25345C 717580CACACB4242437B7D806F6F70282829171F3625345C25345C25345C25345C25345C26355D 364469F7F8F9929292090A0D090A0D8A8A8AFDFDFD3D4B6E27365E93959AD7D8D929385F26355D 26355D26355DDEE0E1BEBFC127345BE3E3E38D929D26355D26355D26355D515C7AFFFFFF737783 243259E0E0E18D929D26355D26355D26355D515C7AFFFFFF737783243259E3E3E38E939E26355D 26355D25345C505B79FDFDFD737783233158E3E3E38D929D27365D25345C25345C505B79FFFFFF 75798525345C25345C24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B 24335B24335B24335B23325A23325A23325A23325A23325A23325A23325A23325A23325A23325A 223159223159223159223159223159223159223159223159223159213058213058213058213058 213058213058213058213058213058202F57202F57202F57202F57202F57202F57202F57202F57 202F571F2E561F2E561F2E561F2E561F2E561F2E561F2E561E2D551E2D551E2D551E2D551E2D55 1E2D551E2D551E2D551E2D551D2C541D2C541D2C541D2C541D2C541D2C541D2C541D2C541D2C54 1C2B531C2B531C2B531C2B531C2B531C2B531C2B531C2B531B2A521B2A521B2A521B2A521B2A52 1B2A521B2A521B2A521A29511A29511A29511A29511A29511A29511A29511A29511A29511A2951 B9BECAB9BECA5959597171717777777B7B7B7D7D7D7C7C7C7B7B7B7B7B7B7B7B7B7A7A7A7A7A7A 7979797979797878787878787878787777777777777676767676767575757575751C242B1C242B 1C242C0E1013030202060606060606000000848482F7F5F1E8E5E2E8E6E2E7E4E1EEEBE7E3E0DC 8B8B886B6A68706E6D6665645A5A5B515555292A2C11121716171B16171B12141815171A323838 ADB0AFA4A3A3000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000121212D7D6D89B9C9F777879 5B5C5C11121611121715161B5353556F6D707573757C7B7B8483858887898A888A8D8A8BCECAC7 FAF7F2F6F3EFF6F3EFF7F4F0FFFDF9ACA9A70A0A0A030303060606050303090A0A1B22291D252C 1C242B7575757676767676767777777777777878787878787878787979797979797A7A7A7B7B7B 7B7B7B7B7B7B7B7B7B7C7C7C7D7D7D7D7D7D7C7C7C7777777171715B5B5BB9BECABABFCB1D2C53 1A29511A29511A29511A29511A29511A29511A29511B2A521B2A521B2A521B2A521B2A521B2A52 1B2A521B2A521B2A521C2B531C2B531C2B531C2B531C2B531C2B531C2B531C2B531D2C541D2C54 1D2C541D2C541D2C541D2C541D2C541D2C541D2C541E2D551E2D551E2D551E2D551E2D551E2D55 1E2D551E2D551E2D551F2E561F2E561F2E561F2E561F2E561F2E561F2E56202F57202F57202F57 202F57202F57202F57202F57202F57202F57213058213058213058213058213058213058213058 21305821305822315922315922315922315922315922315922315922315923325A23325A23325A 23325A23325A23325A23325A23325A23325A23325A23325A24335B24335B24335B24335B24335B 24335B24335B24335B24335B24335B24335B24335B24335B25345C25345C25345C93959DF8F8F9 FDFDFEE1E3E9FEFEFEF9F9FA6A6A6B202C4E25345C25345C25345C26355D26355D233157666871 FDFDFDEFEFF0EEEEEFFFFFFF747579222F5326355DB3B4B7C3C4C729375F26355D26355D26355D BCBEC3D5D5D62B3859FEFEFE797F8D26355D26355D26355D344267FFFFFF878B94293657FAFBFB 797F8D26355D26355D26355D344267FFFFFF878B94293657FEFEFE7B818F26355D26355D25345C 334166FCFCFD878A94283556FEFEFE797E8D27355D25345C25345C334166FFFFFF898C9525345C 25345C25345C24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B 24335B24335B23325A23325A23325A23325A23325A23325A23325A23325A23325A23325A223159 223159223159223159223159223159223159223159213058213058213058213058213058213058 213058213058213058202F57202F57202F57202F57202F57202F57202F57202F57202F571F2E56 1F2E561F2E561F2E561F2E561F2E561F2E561E2D551E2D551E2D551E2D551E2D551E2D551E2D55 1E2D551E2D551D2C541D2C541D2C541D2C541D2C541D2C541D2C541D2C541D2C541C2B531C2B53 1C2B531C2B531C2B531C2B531C2B531C2B531B2A521B2A521B2A521B2A521B2A521B2A521B2A52 1B2A521A29511A29511A29511A29511A29511A29511A29511A29511A29511A2951BABFCBB9BECA 5959597171717777777B7B7B7C7C7C7C7C7C7B7B7B7B7B7B7B7B7B7A7A7A7A7A7A797979787878 7878787878787878787777777777777676767676767575757575751C242B1C242B1C242C0E1013 030202060606060606000000858482F9F6F2E7E5E1E8E5E2E6E4E1EDEAE6E3E1DD8D8B896B6968 6F6D6C6665655A5B5C515555282A2D12131816171C15161B111318141518333939AEB0B0A3A2A2 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000121212D5D4D5999A9D7C7D7E5D5B5C101014 11121715151A5150526E6E707574757C797B8482858887888A898A8C8A89CDC9C6FAF6F3F6F3EF F6F3EFF6F3EFFFFDF9ACA9A70A0A0A030303060606050303090A0A1B22291D252C1C242B757575 7676767676767777777878787878787878787878787979797979797A7A7A7B7B7B7B7B7B7B7B7B 7B7B7B7C7C7C7C7C7C7D7D7D7C7C7C7777777171715B5B5BB9BECABABFCB1D2C531A29511A2951 1A29511A29511A29511A29511A29511B2A521B2A521B2A521B2A521B2A521B2A521B2A521B2A52 1B2A521C2B531C2B531C2B531C2B531C2B531C2B531C2B531C2B531D2C541D2C541D2C541D2C54 1D2C541D2C541D2C541D2C541D2C541E2D551E2D551E2D551E2D551E2D551E2D551E2D551E2D55 1F2E561F2E561F2E561F2E561F2E561F2E561F2E561F2E56202F57202F57202F57202F57202F57 202F57202F57202F57213058213058213058213058213058213058213058213058213058223159 22315922315922315922315922315922315922315922315923325A23325A23325A23325A23325A 23325A23325A23325A23325A23325A24335B24335B24335B24335B24335B24335B24335B24335B 24335B24335B24335B24335B24335B25345C25345C25345C25345CA4AABBCCD0D9404D7028375F 455275C7CAD1F7F7F73C445625345C25345C25345C25345C26355D21293EB1B2B2FBFCFCC0C4CF BCC1CEF9F9FBD8D8D82B334726355DCDCDD1BABABD29375F26355D26355D26355DA8AAAFDBDBDD 414D6DFFFFFF6D727F26355D26355D26355D243258FCFCFC90949E414D6DFCFCFC6D727F26355D 26355D26355D243258FCFCFC90949E414D6DFFFFFF70748126355D26355D25345C233157F9F9FA 8F939E404C6DFFFFFF6C717E26355D25345C25345C233157FCFCFC90949F25345C25345C25345C 24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B 23325A23325A23325A23325A23325A23325A23325A23325A23325A23325A223159223159223159 223159223159223159223159223159213058213058213058213058213058213058213058213058 213058213058202F57202F57202F57202F57202F57202F57202F57202F571F2E561F2E561F2E56 1F2E561F2E561F2E561F2E561F2E561E2D551E2D551E2D551E2D551E2D551E2D551E2D551E2D55 1D2C541D2C541D2C541D2C541D2C541D2C541D2C541D2C541D2C541C2B531C2B531C2B531C2B53 1C2B531C2B531C2B531C2B531C2B531B2A521B2A521B2A521B2A521B2A521B2A521B2A521A2951 1A29511A29511A29511A29511A29511A29511A29511A29511A2951BABFCBB9BECA595959717171 7777777B7B7B7D7D7D7C7C7C7B7B7B7B7B7B7B7B7B7B7B7B7A7A7A797979797979787878787878 7878787777777777777676767676767575757575751C242B1C242B1C242C0E1013030202060606 060606000000838281F9F6F3E7E4E1E7E5E1E6E4E0ECE9E7E2DFDC8D8A886B6A68706E6D646565 595B5D525555282B2D11121715171C15171C121319151619333838AAAAADA2A2A0000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000121212D3D3D59B9B9D79797B58565910101411131716171C 5050526E6D6F7574757D797B85838587878989888A8C8A8ACECBC8FAF7F3F6F3EFF6F3EFF6F3EF FFFDF9ACA9A60C0A0A050303060606050303090A0A1B22291D252C1C242B757575767676767676 7777777777777878787878787878787878787979797A7A7A7B7B7B7B7B7B7B7B7B7B7B7B7C7C7C 7D7D7D7E7E7E7C7C7C7777777171715B5B5BBABFCBBABFCB1D2C531A29511A29511A29511A2951 1A29511A29511A29511B2A521B2A521B2A521B2A521B2A521B2A521B2A521B2A521C2B531C2B53 1C2B531C2B531C2B531C2B531C2B531C2B531C2B531D2C541D2C541D2C541D2C541D2C541D2C54 1D2C541D2C541D2C541E2D551E2D551E2D551E2D551E2D551E2D551E2D551E2D551F2E561F2E56 1F2E561F2E561F2E561F2E561F2E56202F57202F57202F57202F57202F57202F57202F57202F57 202F57213058213058213058213058213058213058213058213058213058223159223159223159 22315922315922315922315922315922315923325A23325A23325A23325A23325A23325A23325A 23325A23325A23325A24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B 24335B24335B24335B25345C25345C25345C25345C25345C25345C25345C25345C25345C636D88 FDFDFD7A7F8A27355D25345C25345C26355D26355D7E8087FDFDFD58638227365E26355D485577 FCFDFD787A7F28365EBDBFC4D1D1D229385F26355D26355D26355DB8B9BCCACCCF354368FFFFFF 83868E26355D26355D26355D2B3858FFFFFF808594354368FCFCFD83868E26355D26355D26355D 2B3858FFFFFF808594354368FFFFFF85889026355D26355D26355D2B3757FBFCFC7F8594344267 FFFFFF83868E26355D25345C25345C2B3757FFFFFF81879625345C25345C25345C25345C24335B 24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B23325A23325A 23325A23325A23325A23325A23325A23325A23325A23325A223159223159223159223159223159 223159223159223159223159213058213058213058213058213058213058213058213058213058 202F57202F57202F57202F57202F57202F57202F57202F57202F571F2E561F2E561F2E561F2E56 1F2E561F2E561F2E561E2D551E2D551E2D551E2D551E2D551E2D551E2D551E2D551D2C541D2C54 1D2C541D2C541D2C541D2C541D2C541D2C541D2C541C2B531C2B531C2B531C2B531C2B531C2B53 1C2B531C2B531C2B531B2A521B2A521B2A521B2A521B2A521B2A521B2A521B2A521A29511A2951 1A29511A29511A29511A29511A29511A29511A2951BABFCBB9BECA5959597171717777777C7C7C 7D7D7D7C7C7C7B7B7B7B7B7B7B7B7B7B7B7B7A7A7A797979797979787878787878787878777777 7777777676767676767575757575751C242B1C242B1C242C0E1013030202060606060606000000 80807EF8F7F3E7E4E1E6E4E1E6E3E0EBE8E5E2DFDC8C89886C69676F6E6C6566665B5C5C515453 25292A11121815171D15171B12141A141519343737A2A3A69E9E9E000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000121212D5D5D69C9B9F78787A5555560F101411121716171D504F526E6D6E 7673757D7A7C84838588878989888A8D898ACFCBC9FBF8F4F6F3EFF6F3EFF6F3EFFFFDF9ACA9A6 0C0A0A050303060606050303090A0A1B22291D252C1C242B757575767676767676777777777777 7878787878787878787979797979797A7A7A7A7A7A7B7B7B7B7B7B7C7C7C7C7C7C7D7D7D7D7D7D 7C7C7C7777777171715B5B5BBABFCBBABFCB1D2C531A29511A29511A29511A29511A29511A2951 1A29511B2A521B2A521B2A521B2A521B2A521B2A521B2A521B2A521C2B531C2B531C2B531C2B53 1C2B531C2B531C2B531C2B531C2B531D2C541D2C541D2C541D2C541D2C541D2C541D2C541D2C54 1D2C541E2D551E2D551E2D551E2D551E2D551E2D551E2D551E2D551F2E561F2E561F2E561F2E56 1F2E561F2E561F2E56202F57202F57202F57202F57202F57202F57202F57202F57202F57213058 213058213058213058213058213058213058213058213058223159223159223159223159223159 22315922315922315923325A23325A23325A23325A23325A23325A23325A23325A23325A23325A 23325A24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B 24335B25345C25345C25345C233158030407151D3425345C25345C25345C252F48FCFCFC8C929F 27365D25345C26355D26355D26355DBCBDC2D9D9DA24335926355D26355D25345CC4C4C7C9CACD 29385FAAAEB8F1F1F1232F5026355D26355D212F52CECECEB2B5BD26355DF5F5F79E9FA225345C 26355D26355D373E52FFFFFF6B758E26355DF5F5F79E9FA225345C26355D26355D363E52FFFFFF 6B758E26355DF8F8F99FA0A325345C26355D26355D373E52FCFCFD6B748D25345CF8F8F99E9FA2 26355C25345C25345C373E51FFFFFF6E768F25345C25345C25345C25345C24335B24335B24335B 24335B24335B24335B24335B24335B24335B24335B24335B24335B23325A23325A23325A23325A 23325A23325A23325A23325A23325A23325A223159223159223159223159223159223159223159 223159223159213058213058213058213058213058213058213058213058213058202F57202F57 202F57202F57202F57202F57202F57202F57202F571F2E561F2E561F2E561F2E561F2E561F2E56 1E2D551E2D551E2D551E2D551E2D551E2D551E2D551E2D551E2D551D2C541D2C541D2C541D2C54 1D2C541D2C541D2C541D2C541D2C541C2B531C2B531C2B531C2B531C2B531C2B531C2B531C2B53 1C2B531B2A521B2A521B2A521B2A521B2A521B2A521B2A521B2A521A29511A29511A29511A2951 1A29511A29511A29511A29511A2951B9BECAB9BECA5A5A5A7171717777777B7B7B7D7D7D7C7C7C 7C7C7C7B7B7B7B7B7B7A7A7A7A7A7A797979797979787878787878787878777777777777767676 7676767575757575751C242B1C242B1C242C0E101303020206060606060600000081817FFAF8F4 E7E5E2E6E3E0E5E2DFEBE9E5E1DFDB8D8A886C6969706E6D6666655B5C5C505554282A2E121119 16151D15171D11131915161A343738ABADAD9F9F9F000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000121212D4D5D79B9AA179787C59595910121412131914141A5050526F6D6F7774757E7B7D 8583858887888A88898D8A8ACECBC8FAF8F4F6F3EFF6F3EFF6F3EFFFFDF9ABA8A50C0A0A050303 060606050303090A0A1B22291D252C1C242B757575767676777777777777777777787878787878 7878787979797979797A7A7A7B7B7B7B7B7B7B7B7B7C7C7C7C7C7C7D7D7D7D7D7D7C7C7C777777 7171715B5B5BBABFCBBABFCB1D2C531A29511A29511A29511A29511A29511A29511A29511A2951 1B2A521B2A521B2A521B2A521B2A521B2A521B2A521C2B531C2B531C2B531C2B531C2B531C2B53 1C2B531C2B531C2B531D2C541D2C541D2C541D2C541D2C541D2C541D2C541D2C541D2C541E2D55 1E2D551E2D551E2D551E2D551E2D551E2D551E2D551F2E561F2E561F2E561F2E561F2E561F2E56 1F2E56202F57202F57202F57202F57202F57202F57202F57202F57202F57213058213058213058 213058213058213058213058213058213058223159223159223159223159223159223159223159 22315922315923325A23325A23325A23325A23325A23325A23325A23325A23325A23325A24335B 24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B25345C25345C 25345C25345C2E3C63EBEBEC7172741E294724335A1F2B4D585A5FFDFDFD6E779226355D1D294A 0A0F1A1C284626355DB4B7C0F0F0F1171D2C1F2B4C222F53141C31DDDDDEC0C3CA29375F747D95 FDFDFE353840202D4F212F52252934FBFBFB7A839A26355DBABDC6D3D3D3141B2E2331561C2847 707173FCFCFD34426726355DBABDC6D3D3D3141B2E2331561C28466F7073FCFCFD34426726355D BCBFC7D3D3D3141B2E2331561C2846707173FAFAFB33416625345CBBBEC7D3D3D3161D31223055 1C2745707173FCFCFD36446925345C25345C25345C24335B24335B24335B24335B24335B24335B 24335B24335B24335B24335B24335B24335B24335B23325A23325A23325A23325A23325A23325A 23325A23325A23325A23325A23325A223159223159223159223159223159223159223159223159 213058213058213058213058213058213058213058213058213058202F57202F57202F57202F57 202F57202F57202F57202F571F2E561F2E561F2E561F2E561F2E561F2E561F2E561F2E561E2D55 1E2D551E2D551E2D551E2D551E2D551E2D551E2D551D2C541D2C541D2C541D2C541D2C541D2C54 1D2C541D2C541D2C541C2B531C2B531C2B531C2B531C2B531C2B531C2B531C2B531C2B531B2A52 1B2A521B2A521B2A521B2A521B2A521B2A521B2A521A29511A29511A29511A29511A29511A2951 1A29511A29511A2951BABFCBB9BECA5959597171717777777B7B7B7D7D7D7C7C7C7C7C7C7B7B7B 7B7B7B7B7B7B7A7A7A797979797979787878787878787878777777777777767676767676757575 7575751C242B1C242B1C242C0E1013030202060606060606010100828280FAF9F5E7E5E1E5E2DF E5E2DFEBE8E5E1DEDA8D8B896D6A6A72716E6667665C5D5C515554252A2B11121915151D15161B 121318141519333839ABADAFA3A3A3000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000121212 D6D6D69D9DA17E7C8058575610101412121A15171B5152536E6D6F7674757E7B7D858386898788 8A88898C8989CECAC7FAF7F3F6F3EFF6F3EFF6F3EFFFFDFAAAA7A40A0A0A030303060606050303 090A0A1B22291D252C1C242B757575767676767676777777777777787878787878787878797979 7979797A7A7A7B7B7B7B7B7B7B7B7B7B7B7B7C7C7C7D7D7D7D7D7D7C7C7C7777777272725B5B5B BABFCBBABFCB1D2C531A29511A29511A29511A29511A29511A29511A29511B2A521B2A521B2A52 1B2A521B2A521B2A521B2A521B2A521C2B531C2B531C2B531C2B531C2B531C2B531C2B531C2B53 1C2B531D2C541D2C541D2C541D2C541D2C541D2C541D2C541D2C541D2C541E2D551E2D551E2D55 1E2D551E2D551E2D551E2D551E2D551F2E561F2E561F2E561F2E561F2E561F2E561F2E56202F57 202F57202F57202F57202F57202F57202F57202F57202F57213058213058213058213058213058 21305821305821305821305822315922315922315922315922315922315922315922315923325A 23325A23325A23325A23325A23325A23325A23325A23325A23325A23325A24335B24335B24335B 24335B24335B24335B24335B24335B24335B24335B24335B24335B25345C25345C25345C25345C 25345CC5C8D1E4E5E63E3F41050506272828CFD0D1E0E2E72D3A6225345C4A5269B4B4B551596C 26355D767F98FDFDFD9A9B9B2E2F2F1A1A1A7B7B7CFDFDFD78829B28365E334167E8EAEDC3C3C4 2525261C1C1DB5B6B7DFE1E636446926355D68728EFCFCFC8383851112123D3D3FE9E9EAA4AABB 26355D26355D68728EFEFEFE8383851112123D3E3FE7E7E8A4AABB26355D26355D69738FFCFCFC 8383851112123D3E3FE9E9EAA5ABBC25345C25345C68738EFEFEFE8585871111123D3E3FE9E9EA A4AABB27365E25345C25345C25345C25345C24335B24335B24335B24335B24335B24335B24335B 24335B24335B24335B24335B24335B24335B23325A23325A23325A23325A23325A23325A23325A 23325A23325A23325A223159223159223159223159223159223159223159223159213058213058 213058213058213058213058213058213058213058202F57202F57202F57202F57202F57202F57 202F57202F57202F571F2E561F2E561F2E561F2E561F2E561F2E561F2E561E2D551E2D551E2D55 1E2D551E2D551E2D551E2D551E2D551D2C541D2C541D2C541D2C541D2C541D2C541D2C541D2C54 1D2C541C2B531C2B531C2B531C2B531C2B531C2B531C2B531C2B531C2B531B2A521B2A521B2A52 1B2A521B2A521B2A521B2A521B2A521A29511A29511A29511A29511A29511A29511A29511A2951 1A2951BABFCBB9BECA5A5A5A7171717777777B7B7B7D7D7D7C7C7C7C7C7C7B7B7B7B7B7B7B7B7B 7A7A7A7979797979797878787878787878787878787777777777777676767575757575751C242B 1C242B1C242C0E1013030202060606060606000001838281FAFAF6E8E5E2E5E3E0E4E2DFEAE7E5 E1DFDB8D8D8B6D6C6973726E6768665B5C5C51565624282A10121814161C14171C111319151619 35383AA5A7AAA2A2A2000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000121212D5D5D69B9B9D 7D7B7E54545510101312141914151A505052706E707876777E7B7C85848689888A8988898C8A8A CFCBC8FBF8F4F6F3EFF6F3EFF6F3EFFFFDF9AAA7A50A0A0A030303060606050303090A0A1B2229 1D252C1C242B7575757676767676767777777878787878787878787878787979797979797A7A7A 7B7B7B7B7B7B7B7B7B7B7B7B7C7C7C7D7D7D7D7D7D7C7C7C7777777272725B5B5BBABFCBBABFCB 1D2C531A29511A29511A29511A29511A29511A29511A29511B2A521B2A521B2A521B2A521B2A52 1B2A521B2A521B2A521C2B531C2B531C2B531C2B531C2B531C2B531C2B531C2B531C2B531D2C54 1D2C541D2C541D2C541D2C541D2C541D2C541D2C541D2C541E2D551E2D551E2D551E2D551E2D55 1E2D551E2D551E2D551F2E561F2E561F2E561F2E561F2E561F2E561F2E56202F57202F57202F57 202F57202F57202F57202F57202F57202F57213058213058213058213058213058213058213058 21305821305822315922315922315922315922315922315922315922315923325A23325A23325A 23325A23325A23325A23325A23325A23325A23325A23325A24335B24335B24335B24335B24335B 24335B24335B24335B24335B24335B24335B24335B25345C25345C25345C25345C25345C39476B B3B8C7F3F4F7FDFDFEFFFFFFD5D8DF49557726355D26355D65708DFFFFFF717A9527365E26355D 9097ACF7F8F9FFFFFFFEFEFEFBFCFC9AA2B326355D26355D26355D4E5A7AE9EAEEFFFFFFFFFFFF E4E6EB4D597A27365E26355D26355D868EA4F8FAFBFBFBFBFAFAFBBEC3CE2C3A6126355D26355D 27365E8991A6F8F9FAFBFBFBFAFAFBBFC4CF2C3A6126355D26355D27365E878FA5F8F9FAFBFBFB FAFAFBBEC3CE2E3C6325345C25345C26355D8890A6F6F8F9FBFBFBFAFAFBBEC2CE2B396025345C 25345C25345C25345C25345C24335B24335B24335B24335B24335B24335B24335B24335B24335B 24335B24335B24335B24335B23325A23325A23325A23325A23325A23325A23325A23325A23325A 23325A223159223159223159223159223159223159223159223159213058213058213058213058 213058213058213058213058213058202F57202F57202F57202F57202F57202F57202F57202F57 202F571F2E561F2E561F2E561F2E561F2E561F2E561F2E561E2D551E2D551E2D551E2D551E2D55 1E2D551E2D551E2D551E2D551D2C541D2C541D2C541D2C541D2C541D2C541D2C541D2C541C2B53 1C2B531C2B531C2B531C2B531C2B531C2B531C2B531C2B531B2A521B2A521B2A521B2A521B2A52 1B2A521B2A521B2A521A29511A29511A29511A29511A29511A29511A29511A29511A2951BABFCB B9BECA5959597171717777777C7C7C7D7D7D7C7C7C7B7B7B7B7B7B7B7B7B7B7B7B7A7A7A797979 7979797878787878787878787878787777777676767676767575757575751C242B1C242B1C242C 0E1013030202060606060606010000838280FAF9F7E7E6E3E3E1DEE4E1DEE9E7E5E1DEDA8E8D8C 6C6C6B7171706767675C5D5C52565525282B11121815161B15161B12141813161835393AABADAF 9F9F9F000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000121212D6D5D89A999B777679525255 11121613141A13141A5151526F6E707876777E7B7D8584868988898988898C8A89CFCBC8FAF8F3 F6F3EFF6F3EFF6F3EFFFFDF9AAA8A50A0A0A030303060606050303090A0A1B22291D252C1C242B 7575757676767676767777777777777878787878787878787979797A7A7A7A7A7A7B7B7B7B7B7B 7B7B7B7B7B7B7C7C7C7D7D7D7E7E7E7C7C7C7777777272725B5B5BBABFCBBABFCB1D2C531A2951 1A29511A29511A29511A29511A29511A29511B2A521B2A521B2A521B2A521B2A521B2A521B2A52 1B2A521C2B531C2B531C2B531C2B531C2B531C2B531C2B531C2B531D2C541D2C541D2C541D2C54 1D2C541D2C541D2C541D2C541D2C541E2D551E2D551E2D551E2D551E2D551E2D551E2D551E2D55 1E2D551F2E561F2E561F2E561F2E561F2E561F2E561F2E56202F57202F57202F57202F57202F57 202F57202F57202F57202F57213058213058213058213058213058213058213058213058213058 22315922315922315922315922315922315922315922315923325A23325A23325A23325A23325A 23325A23325A23325A23325A23325A23325A24335B24335B24335B24335B24335B24335B24335B 24335B24335B24335B24335B25345C25345C25345C25345C25345C25345C25345C25345C2A3960 5561803D4A6E25345C25345C25345C26355D26355D26355D26355D26355D26355D26355D334167 5964835C678538466B27365D26355D26355D26355D26355D26355D4D597A48557727365E26355D 26355D26355D26355D26355D2E3C635964833A476C28375F26355D26355D26355D26355D28365E 313F655C668539476B29375F26355D26355D26355D26355D27365E313F655C668539476B28375F 26355D26355D25345C25345C27355D303E645B658438466A27365E25345C25345C25345C25345C 25345C25345C25345C24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B 24335B24335B23325A23325A23325A23325A23325A23325A23325A23325A23325A23325A223159 223159223159223159223159223159223159223159213058213058213058213058213058213058 213058213058213058202F57202F57202F57202F57202F57202F57202F57202F57202F571F2E56 1F2E561F2E561F2E561F2E561F2E561F2E561E2D551E2D551E2D551E2D551E2D551E2D551E2D55 1E2D551E2D551D2C541D2C541D2C541D2C541D2C541D2C541D2C541D2C541C2B531C2B531C2B53 1C2B531C2B531C2B531C2B531C2B531C2B531B2A521B2A521B2A521B2A521B2A521B2A521B2A52 1B2A521A29511A29511A29511A29511A29511A29511A29511A29511A2951BABFCBB9BECA595959 7171717777777B7B7B7D7D7D7C7C7C7C7C7C7B7B7B7B7B7B7B7B7B7A7A7A7A7A7A797979787878 7878787878787878787777777676767676767575757575751C242B1C242B1C242C0E1013030202 060606060606010001838280FAF9F7E9E7E4E3E0DDE4E1DEE9E6E3E1DEDA8D8C896C696A707170 6768685B5C5C52565525272A10101714151B14151912131815161A373C3DA8AAADA0A0A2000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000121212D8D7D89A999D747477545354101014131319 15161A5252536F6E6F7876777E7C7E8583858987898988898D8989CFCAC8FAF7F3F5F3EEF6F3EF F6F3EFFFFDF9AAA8A50A0A0A030303060606050303090A0A1B22291D252C1C242B757575767676 7676767777777878787878787878787878787979797A7A7A7A7A7A7B7B7B7B7B7B7B7B7B7B7B7B 7C7C7C7D7D7D7E7E7E7C7C7C7777777272725B5B5BBABFCBBABFCB1D2C531A29511A29511A2951 1A29511A29511A29511A29511B2A521B2A521B2A521B2A521B2A521B2A521B2A521B2A521C2B53 1C2B531C2B531C2B531C2B531C2B531C2B531C2B531C2B531D2C541D2C541D2C541D2C541D2C54 1D2C541D2C541D2C541E2D551E2D551E2D551E2D551E2D551E2D551E2D551E2D551E2D551F2E56 1F2E561F2E561F2E561F2E561F2E561F2E56202F57202F57202F57202F57202F57202F57202F57 202F57202F57213058213058213058213058213058213058213058213058213058223159223159 22315922315922315922315922315922315923325A23325A23325A23325A23325A23325A23325A 23325A23325A23325A24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B 24335B24335B25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C 25345C25345C25345C25345C26355D26355D26355D26355D26355D26355D26355D26355D26355D 26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D 26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D 26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D25345C 25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C 25345C24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B 23325A23325A23325A23325A23325A23325A23325A23325A23325A23325A223159223159223159 223159223159223159223159223159213058213058213058213058213058213058213058213058 213058202F57202F57202F57202F57202F57202F57202F57202F57202F571F2E561F2E561F2E56 1F2E561F2E561F2E561F2E561E2D551E2D551E2D551E2D551E2D551E2D551E2D551E2D551E2D55 1D2C541D2C541D2C541D2C541D2C541D2C541D2C541D2C541C2B531C2B531C2B531C2B531C2B53 1C2B531C2B531C2B531C2B531B2A521B2A521B2A521B2A521B2A521B2A521B2A521B2A521A2951 1A29511A29511A29511A29511A29511A29511A29511A2951BABFCBB9BECA595959717171777777 7B7B7B7D7D7D7C7C7C7B7B7B7B7B7B7B7B7B7B7B7B7A7A7A7A7A7A797979787878787878787878 7777777777777676767676767575757575751C242B1C242B1C242C0E1013030202060606060606 010001838281FAFAF8EBE8E5E2E0DDE3E0DDE8E6E3DFDDD98C8B896D6C6A72716F6767675B5D5C 53585727292C0F101613151B131519121119141618343939A8ABAF9F9FA0000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000121212D5D4D595959A77777A5455550F101412121A17171D545354 6F6E6F7876787E7C7E8482848886878987898C8889CFCCC8FAF8F4F6F3EFF5F2EEF6F3EFFFFDF9 AAA7A40A0A0A030303060606050303090A0A1B22291D252C1C242B757575767676777777777777 7777777878787878787878787979797979797A7A7A7B7B7B7B7B7B7B7B7B7B7B7B7D7D7D7D7D7D 7E7E7E7C7C7C7777777171715B5B5BBABFCBBABFCB1D2C531A29511A29511A29511A29511A2951 1A29511A29511B2A521B2A521B2A521B2A521B2A521B2A521B2A521B2A521C2B531C2B531C2B53 1C2B531C2B531C2B531C2B531C2B531D2C541D2C541D2C541D2C541D2C541D2C541D2C541D2C54 1D2C541E2D551E2D551E2D551E2D551E2D551E2D551E2D551E2D551E2D551F2E561F2E561F2E56 1F2E561F2E561F2E561F2E56202F57202F57202F57202F57202F57202F57202F57202F57202F57 213058213058213058213058213058213058213058213058213058223159223159223159223159 22315922315922315922315923325A23325A23325A23325A23325A23325A23325A23325A23325A 23325A24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B 25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C 25345C25345C26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D 26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D 26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D 26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D25345C25345C 25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C24335B 24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B23325A23325A 23325A23325A23325A23325A23325A23325A23325A23325A223159223159223159223159223159 223159223159223159213058213058213058213058213058213058213058213058213058202F57 202F57202F57202F57202F57202F57202F57202F57202F571F2E561F2E561F2E561F2E561F2E56 1F2E561F2E561E2D551E2D551E2D551E2D551E2D551E2D551E2D551E2D551E2D551D2C541D2C54 1D2C541D2C541D2C541D2C541D2C541D2C541C2B531C2B531C2B531C2B531C2B531C2B531C2B53 1C2B531C2B531B2A521B2A521B2A521B2A521B2A521B2A521B2A521B2A521A29511A29511A2951 1A29511A29511A29511A29511A29511A2951BABFCBB9BECA5A5A5A7171717777777C7C7C7D7D7D 7C7C7C7B7B7B7B7B7B7B7B7B7B7B7B7A7A7A797979797979787878787878787878787878777777 7676767676767575757575751C242B1C242B1C242C0E1013030202060606060606010001838281 FAFAF7EDEBE7E1DFDCE2DFDDE7E5E2DFDCD98D8B896D6C6B7170706666655B5D5C565858292B2D 0F101614161C14161A101218121418333937A8ACAEA0A0A2000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000121212D6D4D699989C76767755565510121411131817181D5352546F6E6F787678 7E7C7E8483848886878987898C8888CECBC7FAF7F3F6F3EFF6F3EFF6F3EFFFFDF9AAA7A50A0A0A 030303060606050303090A0A1B22291D252C1C242B757575767676767676777777787878787878 7878787878787979797979797A7A7A7B7B7B7B7B7B7B7B7B7B7B7B7D7D7D7D7D7D7D7D7D7C7C7C 7777777171715B5B5BBABFCBBABFCB1D2C531A29511A29511A29511A29511A29511A29511A2951 1B2A521B2A521B2A521B2A521B2A521B2A521B2A521B2A521C2B531C2B531C2B531C2B531C2B53 1C2B531C2B531C2B531C2B531D2C541D2C541D2C541D2C541D2C541D2C541D2C541D2C541E2D55 1E2D551E2D551E2D551E2D551E2D551E2D551E2D551E2D551F2E561F2E561F2E561F2E561F2E56 1F2E561F2E56202F57202F57202F57202F57202F57202F57202F57202F57202F57213058213058 213058213058213058213058213058213058213058223159223159223159223159223159223159 22315922315923325A23325A23325A23325A23325A23325A23325A23325A23325A23325A24335B 24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B25345C25345C 25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C26355D 26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D 26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D 26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D 26355D26355D26355D26355D26355D26355D26355D26355D26355D25345C25345C25345C25345C 25345C25345C25345C25345C25345C25345C25345C25345C25345C24335B24335B24335B24335B 24335B24335B24335B24335B24335B24335B24335B24335B24335B23325A23325A23325A23325A 23325A23325A23325A23325A23325A23325A223159223159223159223159223159223159223159 223159213058213058213058213058213058213058213058213058213058202F57202F57202F57 202F57202F57202F57202F57202F57202F571F2E561F2E561F2E561F2E561F2E561F2E561F2E56 1E2D551E2D551E2D551E2D551E2D551E2D551E2D551E2D551E2D551D2C541D2C541D2C541D2C54 1D2C541D2C541D2C541D2C541C2B531C2B531C2B531C2B531C2B531C2B531C2B531C2B531C2B53 1B2A521B2A521B2A521B2A521B2A521B2A521B2A521B2A521A29511A29511A29511A29511A2951 1A29511A29511A29511A2951BABFCBB9BECA5A5A5A7171717777777C7C7C7D7D7D7C7C7C7B7B7B 7B7B7B7B7B7B7B7B7B7A7A7A7A7A7A797979787878787878787878787878777777767676767676 7575757575751C242B1C242B1C242C0E1013030202060606060606010100858482FAFAF8EEECE8 E2DFDCE1DFDCE8E5E2DFDCD98C8B896D6D6C7171716667675C5E5D56585727292C10121715171C 14161C10101716181B383E3DA5A9A9A0A2A2000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 121212D5D5D69D9B9E7878795353530F101311121817181D5655566F6E6F7876787E7C7E858385 8986878A87898C8988CECBC7F9F7F2F5F3EEF6F3EFF6F3EFFFFDF9AAA7A50A0A0A030303060606 050303090A0A1B22291D252C1C242B757575767676767676777777787878787878787878797979 7979797A7A7A7A7A7A7B7B7B7B7B7B7B7B7B7C7C7C7C7C7C7D7D7D7D7D7D7C7C7C777777717171 5B5B5BBABFCBBABFCB1D2C531A29511A29511A29511A29511A29511A29511A29511B2A521B2A52 1B2A521B2A521B2A521B2A521B2A521B2A521C2B531C2B531C2B531C2B531C2B531C2B531C2B53 1C2B531D2C541D2C541D2C541D2C541D2C541D2C541D2C541D2C541D2C541E2D551E2D551E2D55 1E2D551E2D551E2D551E2D551E2D551F2E561F2E561F2E561F2E561F2E561F2E561F2E561F2E56 202F57202F57202F57202F57202F57202F57202F57202F57202F57213058213058213058213058 21305821305821305821305821305822315922315922315922315922315922315922315923325A 23325A23325A23325A23325A23325A23325A23325A23325A23325A23325A24335B24335B24335B 24335B24335B24335B24335B24335B24335B24335B24335B24335B25345C25345C25345C25345C 25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C26355D26355D26355D 26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D 26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D 26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D 26355D26355D26355D26355D26355D26355D26355D25345C25345C25345C25345C25345C25345C 25345C25345C25345C25345C25345C25345C25345C25345C24335B24335B24335B24335B24335B 24335B24335B24335B24335B24335B24335B24335B23325A23325A23325A23325A23325A23325A 23325A23325A23325A23325A23325A223159223159223159223159223159223159223159213058 213058213058213058213058213058213058213058213058202F57202F57202F57202F57202F57 202F57202F57202F57202F571F2E561F2E561F2E561F2E561F2E561F2E561F2E561E2D551E2D55 1E2D551E2D551E2D551E2D551E2D551E2D551E2D551D2C541D2C541D2C541D2C541D2C541D2C54 1D2C541D2C541C2B531C2B531C2B531C2B531C2B531C2B531C2B531C2B531C2B531B2A521B2A52 1B2A521B2A521B2A521B2A521B2A521B2A521A29511A29511A29511A29511A29511A29511A2951 1A29511A2951BABFCBB9BECA5A5A5A7171717777777B7B7B7D7D7D7C7C7C7C7C7C7B7B7B7B7B7B 7B7B7B7A7A7A7A7A7A797979787878787878787878787878777777767676767676757575757575 1C242B1C242B1C242C0E1013030202060606060606010100858483FAFAF7F1EEEAE2DFDCE1DFDC E6E4E1DEDCD88C8A886E6C6A71706F6867685E5D5E56585726282B11101715171B14161B111218 131417353B3AAAADAFA3A2A2000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000121212D5D3D5 97969877787853525310101312131818191E5957586F6E707977797E7C7E8584858988888A8889 8C8989CDCAC7FAF7F3F5F2EFF6F3EFF6F3EFFFFDF9AAA8A50A0A0A030303060606050303090A0A 1B22291D252C1C242B757575767676767676777777787878787878787878787878797979797979 7A7A7A7B7B7B7B7B7B7B7B7B7C7C7C7C7C7C7D7D7D7D7D7D7C7C7C7777777272725B5B5BBABFCB BABFCB1D2C531A29511A29511A29511A29511A29511A29511A29511B2A521B2A521B2A521B2A52 1B2A521B2A521B2A521B2A521C2B531C2B531C2B531C2B531C2B531C2B531C2B531C2B531C2B53 1D2C541D2C541D2C541D2C541D2C541D2C541D2C541D2C541E2D551E2D551E2D551E2D551E2D55 1E2D551E2D551E2D551E2D551F2E561F2E561F2E561F2E561F2E561F2E561F2E56202F57202F57 202F57202F57202F57202F57202F57202F57202F57213058213058213058213058213058213058 21305821305821305822315922315922315922315922315922315922315922315923325A23325A 23325A23325A23325A23325A23325A23325A23325A23325A24335B24335B24335B24335B24335B 24335B24335B24335B24335B24335B24335B24335B25345C25345C25345C25345C25345C25345C 25345C25345C25345C25345C25345C25345C25345C25345C26355D26355D26355D26355D26355D 26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D 26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D 26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D 26355D26355D26355D26355D25345C25345C25345C25345C25345C25345C25345C25345C25345C 25345C25345C25345C25345C25345C25345C24335B24335B24335B24335B24335B24335B24335B 24335B24335B24335B24335B24335B23325A23325A23325A23325A23325A23325A23325A23325A 23325A23325A223159223159223159223159223159223159223159223159213058213058213058 213058213058213058213058213058213058202F57202F57202F57202F57202F57202F57202F57 202F57202F571F2E561F2E561F2E561F2E561F2E561F2E561F2E561E2D551E2D551E2D551E2D55 1E2D551E2D551E2D551E2D551E2D551D2C541D2C541D2C541D2C541D2C541D2C541D2C541D2C54 1C2B531C2B531C2B531C2B531C2B531C2B531C2B531C2B531C2B531B2A521B2A521B2A521B2A52 1B2A521B2A521B2A521B2A521A29511A29511A29511A29511A29511A29511A29511A29511A2951 BABFCBB9BECA5A5A5A7171717777777C7C7C7D7D7D7C7C7C7B7B7B7B7B7B7B7B7B7B7B7B7A7A7A 7979797979797979797878787878787878787777777777777676767575757575751C242B1C242B 1C242C0E1013030202060606060606010100858483FAFAF7F2EFEBE1DEDCE0DDDBE6E3E1DEDCD8 8E8C8A6E6C6B70706F6868685E606057595925282B0F101714171C13161B101217141619333837 A7A9ACA2A2A3000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000121212D5D4D6939596767677 5151510F0F1310101617181D5A5859706F707977797E7C7E8684858A88898A88898C8988CECAC6 FAF7F3F5F2EEF6F3EFF5F2EFFFFDF9A8A6A30A0A0A030503060606050303090A0A1B22291D252C 1C242B7575757676767777777777777878787878787878787878787979797A7A7A7A7A7A7A7A7A 7B7B7B7B7B7B7B7B7B7D7D7D7D7D7D7E7E7E7C7C7C7777777171715B5B5BBABFCBBABFCB1D2C53 1A29511A29511A29511A29511A29511A29511A29511B2A521B2A521B2A521B2A521B2A521B2A52 1B2A521B2A521C2B531C2B531C2B531C2B531C2B531C2B531C2B531C2B531C2B531D2C541D2C54 1D2C541D2C541D2C541D2C541D2C541D2C541E2D551E2D551E2D551E2D551E2D551E2D551E2D55 1E2D551E2D551F2E561F2E561F2E561F2E561F2E561F2E561F2E56202F57202F57202F57202F57 202F57202F57202F57202F57202F57213058213058213058213058213058213058213058213058 21305822315922315922315922315922315922315922315922315923325A23325A23325A23325A 23325A23325A23325A23325A23325A23325A24335B24335B24335B24335B24335B24335B24335B 24335B24335B24335B24335B24335B25345C25345C25345C25345C25345C25345C25345C25345C 25345C25345C25345C25345C25345C25345C26355D26355D26355D26355D26355D26355D26355D 26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D 26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D 26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D 26355D26355D26355D25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C 25345C25345C25345C25345C24335B24335B24335B24335B24335B24335B24335B24335B24335B 24335B24335B24335B23325A23325A23325A23325A23325A23325A23325A23325A23325A23325A 223159223159223159223159223159223159223159223159223159213058213058213058213058 213058213058213058213058202F57202F57202F57202F57202F57202F57202F57202F57202F57 1F2E561F2E561F2E561F2E561F2E561F2E561F2E561E2D551E2D551E2D551E2D551E2D551E2D55 1E2D551E2D551E2D551D2C541D2C541D2C541D2C541D2C541D2C541D2C541D2C541C2B531C2B53 1C2B531C2B531C2B531C2B531C2B531C2B531C2B531B2A521B2A521B2A521B2A521B2A521B2A52 1B2A521B2A521A29511A29511A29511A29511A29511A29511A29511A29511A2951BABFCBB9BECA 5A5A5A7171717777777C7C7C7D7D7D7C7C7C7C7C7C7B7B7B7B7B7B7B7B7B7A7A7A7A7A7A797979 7878787878787878787878787777777676767676767575757575751C242B1C242B1C242C0E1013 030202060606060606010100858483FAFAF7F3F1ECE2E0DCE0DDDAE5E2E0DDDBD88D8C8A6F6D6C 717070696868606260575A5925282B0F101713151B12141A111217141619373B3BA7ABABA09FA0 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000121212D5D5D69595987575764F4E500F1013 11121717181C575657716F717876797F7C7E8684858A88898A898A8C8A89CCC9C6FAF6F2F6F3EF F6F3EFF6F3EFFFFDF9A7A5A20A0A09050505060606050303090A0A1B22291D252C1C242B757575 7676767676767777777777777878787878787878787979797979797A7A7A7B7B7B7B7B7B7B7B7B 7C7C7C7C7C7C7D7D7D7D7D7D7C7C7C7777777171715B5B5BBABFCBBABFCB1D2C531A29511A2951 1A29511A29511A29511A29511A29511B2A521B2A521B2A521B2A521B2A521B2A521B2A521B2A52 1C2B531C2B531C2B531C2B531C2B531C2B531C2B531C2B531D2C541D2C541D2C541D2C541D2C54 1D2C541D2C541D2C541D2C541E2D551E2D551E2D551E2D551E2D551E2D551E2D551E2D551E2D55 1F2E561F2E561F2E561F2E561F2E561F2E561F2E56202F57202F57202F57202F57202F57202F57 202F57202F57202F57213058213058213058213058213058213058213058213058213058223159 22315922315922315922315922315922315922315923325A23325A23325A23325A23325A23325A 23325A23325A23325A23325A24335B24335B24335B24335B24335B24335B24335B24335B24335B 24335B24335B24335B25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C 25345C25345C25345C25345C26355D26355D26355D26355D26355D26355D26355D26355D26355D 26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D 26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D 26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D 26355D25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C 25345C25345C24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B 24335B23325A23325A23325A23325A23325A23325A23325A23325A23325A23325A223159223159 223159223159223159223159223159223159213058213058213058213058213058213058213058 213058213058202F57202F57202F57202F57202F57202F57202F57202F57202F571F2E561F2E56 1F2E561F2E561F2E561F2E561F2E561E2D551E2D551E2D551E2D551E2D551E2D551E2D551E2D55 1D2C541D2C541D2C541D2C541D2C541D2C541D2C541D2C541D2C541D2C541C2B531C2B531C2B53 1C2B531C2B531C2B531C2B531C2B531B2A521B2A521B2A521B2A521B2A521B2A521B2A521B2A52 1A29511A29511A29511A29511A29511A29511A29511A29511A2951BABFCBB9BECA595959717171 7777777C7C7C7D7D7D7C7C7C7C7C7C7B7B7B7B7B7B7B7B7B7A7A7A7A7A7A797979787878787878 7878787777777777777676767676767676767575751C242B1C242B1C242C0E1013030202060606 060606010000858483FAFAF7F4F1EDE3E1DDDFDCD9E5E2DFDDDBD88D8C88706E6C717270676868 5F606056595825282B0D0F1512151A121319101017131518353A3AA8ACABA6A4A6000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000121212D4D4D79494967575764F4F510D0D1311121815171B 5756587271717876777E7C7F8683858987888A898A8C8989CCC9C6FAF7F2F5F2EEF6F3EFF6F3EF FFFCF9A7A4A10A0A09050505060606050303090A0A1B22291D252C1C242B757575767676777777 7777777878787878787878787878787979797979797A7A7A7B7B7B7B7B7B7B7B7B7C7C7C7D7D7D 7D7D7D7D7D7D7C7C7C7777777272725B5B5BBABFCBBABFCB1D2C531A29511A29511A29511A2951 1A29511A29511A29511B2A521B2A521B2A521B2A521B2A521B2A521B2A521B2A521C2B531C2B53 1C2B531C2B531C2B531C2B531C2B531C2B531C2B531D2C541D2C541D2C541D2C541D2C541D2C54 1D2C541D2C541E2D551E2D551E2D551E2D551E2D551E2D551E2D551E2D551E2D551F2E561F2E56 1F2E561F2E561F2E561F2E561F2E56202F57202F57202F57202F57202F57202F57202F57202F57 202F57213058213058213058213058213058213058213058213058223159223159223159223159 22315922315922315922315922315923325A23325A23325A23325A23325A23325A23325A23325A 23325A23325A24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B 24335B25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C 25345C25345C26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D 26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D 26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D 26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D25345C 25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C 24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B23325A 23325A23325A23325A23325A23325A23325A23325A23325A23325A223159223159223159223159 223159223159223159223159223159213058213058213058213058213058213058213058213058 202F57202F57202F57202F57202F57202F57202F57202F57202F571F2E561F2E561F2E561F2E56 1F2E561F2E561F2E561E2D551E2D551E2D551E2D551E2D551E2D551E2D551E2D551E2D551D2C54 1D2C541D2C541D2C541D2C541D2C541D2C541D2C541C2B531C2B531C2B531C2B531C2B531C2B53 1C2B531C2B531C2B531B2A521B2A521B2A521B2A521B2A521B2A521B2A521B2A521A29511A2951 1A29511A29511A29511A29511A29511A29511A2951BABFCBB9BECA5959597171717777777B7B7B 7D7D7D7C7C7C7B7B7B7B7B7B7B7B7B7B7B7B7A7A7A797979797979787878787878787878787878 7777777676767676767575757575751C242B1C242B1C242C0E1013030202060606060606000000 848382FAFAF7F5F2EDE4E1DEDEDBD9E5E2E0DCDBD78D8B88716F6D7271716768685E605F575A59 26282B0D0D14131418131519101016131418333938A7ACAEA4A4A6000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000121212D3D3D695949A7475774E4E500D0D1210121714151A585759727172 7876777E7C7E8583858987888A898B8C8889CDCAC6FAF7F3F6F3EFF6F3EFF6F3EFFFFCF8A7A5A2 0A0A0A050505060606050303090A0A1B22291D252C1C242B767676767676767676777777777777 7878787878787979797979797979797A7A7A7B7B7B7B7B7B7B7B7B7C7C7C7C7C7C7D7D7D7D7D7D 7C7C7C7777777171715B5B5BBABFCBBABFCB1D2C531A29511A29511A29511A29511A29511A2951 1A29511B2A521B2A521B2A521B2A521B2A521B2A521B2A521B2A521C2B531C2B531C2B531C2B53 1C2B531C2B531C2B531C2B531C2B531D2C541D2C541D2C541D2C541D2C541D2C541D2C541D2C54 1E2D551E2D551E2D551E2D551E2D551E2D551E2D551E2D551E2D551F2E561F2E561F2E561F2E56 1F2E561F2E561F2E56202F57202F57202F57202F57202F57202F57202F57202F57202F57213058 213058213058213058213058213058213058213058213058223159223159223159223159223159 22315922315922315923325A23325A23325A23325A23325A23325A23325A23325A23325A23325A 24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B25345C 25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C 25345C26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D 26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D 26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D 26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D25345C25345C25345C 25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C24335B24335B 24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B23325A23325A23325A 23325A23325A23325A23325A23325A23325A23325A223159223159223159223159223159223159 223159223159213058213058213058213058213058213058213058213058213058202F57202F57 202F57202F57202F57202F57202F57202F57202F571F2E561F2E561F2E561F2E561F2E561F2E56 1F2E561F2E561E2D551E2D551E2D551E2D551E2D551E2D551E2D551E2D551D2C541D2C541D2C54 1D2C541D2C541D2C541D2C541D2C541C2B531C2B531C2B531C2B531C2B531C2B531C2B531C2B53 1C2B531B2A521B2A521B2A521B2A521B2A521B2A521B2A521B2A521A29511A29511A29511A2951 1A29511A29511A29511A29511A2951BABFCBB9BECA5959597171717777777C7C7C7D7D7D7C7C7C 7B7B7B7B7B7B7B7B7B7B7B7B7A7A7A797979797979787878787878787878787878777777767676 7676767575757575751C242B1C242B1C242C0E1013030202060606060606010101868583FAFAF6 F6F4EEE6E3E0DCDAD7E5E2DFDCD9D78E8C89706E6C72707068686A5F616055575725262A0F1016 14151A131519101017131417343A39A6AAABA3A3A3000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000121212D5D4D697979A7473764E4E510D0F1312131914161A5756587070717674777E7C7F 8583858A888A8B898B8C8989CDCAC6FAF7F3F5F3EEF5F2EEF5F2EEFFFDF9A6A4A10A0909050505 060606050303090A0A1B22291D252C1C242B757575767676767676777777787878787878787878 7878787979797979797A7A7A7B7B7B7B7B7B7B7B7B7B7B7B7C7C7C7D7D7D7D7D7D7C7C7C777777 7272725B5B5BBABFCBBABFCB1D2C531A29511A29511A29511A29511A29511A29511A29511B2A52 1B2A521B2A521B2A521B2A521B2A521B2A521B2A521C2B531C2B531C2B531C2B531C2B531C2B53 1C2B531C2B531C2B531D2C541D2C541D2C541D2C541D2C541D2C541D2C541D2C541D2C541E2D55 1E2D551E2D551E2D551E2D551E2D551E2D551E2D551F2E561F2E561F2E561F2E561F2E561F2E56 1F2E56202F57202F57202F57202F57202F57202F57202F57202F57202F57213058213058213058 213058213058213058213058213058213058223159223159223159223159223159223159223159 22315923325A23325A23325A23325A23325A23325A23325A23325A23325A23325A24335B24335B 24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B25345C25345C25345C 25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C26355D 26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D 26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D 26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D 26355D26355D26355D26355D26355D26355D26355D26355D25345C25345C25345C25345C25345C 25345C25345C25345C25345C25345C25345C25345C25345C24335B24335B24335B24335B24335B 24335B24335B24335B24335B24335B24335B24335B24335B23325A23325A23325A23325A23325A 23325A23325A23325A23325A23325A223159223159223159223159223159223159223159223159 213058213058213058213058213058213058213058213058213058202F57202F57202F57202F57 202F57202F57202F57202F57202F571F2E561F2E561F2E561F2E561F2E561F2E561F2E561E2D55 1E2D551E2D551E2D551E2D551E2D551E2D551E2D551E2D551D2C541D2C541D2C541D2C541D2C54 1D2C541D2C541D2C541C2B531C2B531C2B531C2B531C2B531C2B531C2B531C2B531C2B531B2A52 1B2A521B2A521B2A521B2A521B2A521B2A521B2A521A29511A29511A29511A29511A29511A2951 1A29511A29511A2951BABFCBB9BECA5A5A5A7171717777777C7C7C7D7D7D7C7C7C7B7B7B7B7B7B 7B7B7B7B7B7B7A7A7A7A7A7A797979787878787878787878777777777777767676767676757575 7575751C242B1C242B1C242C0E1013030202060606060606010101878685FAFAF6F6F3EFE8E6E2 DCD9D7E4E1DEDBD8D68D8B88706F6B72716F6B6A6A5F60605355552326290F1016131519131519 101016131518333A38A8ACAAA6A4A4000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000121212 D2D2D39596987575774F4E510F0F1211131814171B565557706F707674777E7C7F8584858A888B 8B888B8D898ACECAC7FAF7F3F5F3EEF6F3EFF6F3EFFFFDF9A6A3A10A0909050505060606050303 090A0A1B22291D252C1C242B757575767676767676777777777777787878787878787878797979 7979797A7A7A7B7B7B7B7B7B7B7B7B7B7B7B7C7C7C7D7D7D7E7E7E7C7C7C7777777171715B5B5B BABFCBBABFCB1D2C531A29511A29511A29511A29511A29511A29511A29511B2A521B2A521B2A52 1B2A521B2A521B2A521B2A521B2A521C2B531C2B531C2B531C2B531C2B531C2B531C2B531C2B53 1C2B531D2C541D2C541D2C541D2C541D2C541D2C541D2C541D2C541E2D551E2D551E2D551E2D55 1E2D551E2D551E2D551E2D551E2D551F2E561F2E561F2E561F2E561F2E561F2E561F2E56202F57 202F57202F57202F57202F57202F57202F57202F57202F57213058213058213058213058213058 21305821305821305821305822315922315922315922315922315922315922315922315923325A 23325A23325A23325A23325A23325A23325A23325A23325A23325A24335B24335B24335B24335B 24335B24335B24335B24335B24335B24335B24335B24335B24335B25345C25345C25345C25345C 25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C26355D26355D26355D 26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D 26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D 26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D 26355D26355D26355D26355D26355D26355D25345C25345C25345C25345C25345C25345C25345C 25345C25345C25345C25345C25345C25345C25345C24335B24335B24335B24335B24335B24335B 24335B24335B24335B24335B24335B24335B23325A23325A23325A23325A23325A23325A23325A 23325A23325A23325A223159223159223159223159223159223159223159223159213058213058 213058213058213058213058213058213058213058202F57202F57202F57202F57202F57202F57 202F57202F57202F571F2E561F2E561F2E561F2E561F2E561F2E561F2E561E2D551E2D551E2D55 1E2D551E2D551E2D551E2D551E2D551E2D551D2C541D2C541D2C541D2C541D2C541D2C541D2C54 1D2C541C2B531C2B531C2B531C2B531C2B531C2B531C2B531C2B531C2B531B2A521B2A521B2A52 1B2A521B2A521B2A521B2A521B2A521A29511A29511A29511A29511A29511A29511A29511A2951 1A2951BABFCBB9BECA5959597171717777777C7C7C7D7D7D7C7C7C7B7B7B7B7B7B7B7B7B7B7B7B 7A7A7A7979797979797979797878787878787777777777777676767676767575757575751C242B 1C242B1C242C0E1013030202060606060606020101868684FAFAF6F6F4EFEBE8E4DBD8D6E2E0DD DBD8D58E8C896F6E6D72716F6B6B6A5E5E605555552225270F1015131519131319101016141618 333A37A3A7A4A3A3A3000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000121212D5D5D695939A 7574795151510D0D12121419181B1F5756596F6F707674767E7C7E8583848987898A888B8D898A CDC9C6F9F6F3F6F3EFF6F3EFF6F3EFFFFDF9A7A4A10A0909050505060606050303090A0A1B2229 1D252C1C242B7676767676767676767777777777777878787878787878787979797A7A7A7A7A7A 7B7B7B7B7B7B7B7B7B7B7B7B7C7C7C7D7D7D7D7D7D7C7C7C7777777272725B5B5BBABFCBBABFCB 1D2C531A29511A29511A29511A29511A29511A29511A29511B2A521B2A521B2A521B2A521B2A52 1B2A521B2A521B2A521C2B531C2B531C2B531C2B531C2B531C2B531C2B531C2B531C2B531D2C54 1D2C541D2C541D2C541D2C541D2C541D2C541D2C541E2D551E2D551E2D551E2D551E2D551E2D55 1E2D551E2D551E2D551F2E561F2E561F2E561F2E561F2E561F2E561F2E56202F57202F57202F57 202F57202F57202F57202F57202F57202F57213058213058213058213058213058213058213058 21305822315922315922315922315922315922315922315922315922315923325A23325A23325A 23325A23325A23325A23325A23325A23325A23325A23325A24335B24335B24335B24335B24335B 24335B24335B24335B24335B24335B24335B24335B25345C25345C25345C25345C25345C25345C 25345C25345C25345C25345C25345C25345C25345C26355D26355D26355D26355D26355D26355D 26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D 26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D 26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D 26355D26355D26355D25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C 25345C25345C25345C25345C25345C24335B24335B24335B24335B24335B24335B24335B24335B 24335B24335B24335B24335B23325A23325A23325A23325A23325A23325A23325A23325A23325A 23325A223159223159223159223159223159223159223159223159213058213058213058213058 213058213058213058213058213058202F57202F57202F57202F57202F57202F57202F57202F57 202F571F2E561F2E561F2E561F2E561F2E561F2E561F2E561E2D551E2D551E2D551E2D551E2D55 1E2D551E2D551E2D551D2C541D2C541D2C541D2C541D2C541D2C541D2C541D2C541D2C541C2B53 1C2B531C2B531C2B531C2B531C2B531C2B531C2B531C2B531B2A521B2A521B2A521B2A521B2A52 1B2A521B2A521B2A521A29511A29511A29511A29511A29511A29511A29511A29511A2951BABFCB B9BECA5959597171717777777B7B7B7D7D7D7C7C7C7B7B7B7B7B7B7B7B7B7B7B7B7A7A7A797979 7979797878787878787878787878787777777777777676767575757575751C242B1C242B1C242C 0E1013030202060606060606020101868584FAFAF6F6F3EFEDEAE6DBD9D6E2DFDCDAD8D68E8C8B 706F6F7271716A6A695C5E5E5455552123260F1016131519131419101015141618313837AAADAB A7A7A7000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000121212D3D3D497969A7775794F4F50 0C0D10121319191A1F5555586E6E6F7674767E7C7E8583858886898A888A8D898ACECAC7FAF7F3 F6F3EFF6F3EFF6F3EFFFFCF8A4A19E090A09050505060606050303090A0A1B22291D252C1C242B 7575757676767676767777777878787878787878787878787979797A7A7A7A7A7A7B7B7B7B7B7B 7B7B7B7C7C7C7C7C7C7D7D7D7E7E7E7C7C7C7777777171715B5B5BBABFCBBABFCB1D2C531A2951 1A29511A29511A29511A29511A29511A29511B2A521B2A521B2A521B2A521B2A521B2A521B2A52 1B2A521C2B531C2B531C2B531C2B531C2B531C2B531C2B531C2B531C2B531D2C541D2C541D2C54 1D2C541D2C541D2C541D2C541D2C541D2C541E2D551E2D551E2D551E2D551E2D551E2D551E2D55 1E2D551F2E561F2E561F2E561F2E561F2E561F2E561F2E56202F57202F57202F57202F57202F57 202F57202F57202F57202F57213058213058213058213058213058213058213058213058213058 22315922315922315922315922315922315922315922315923325A23325A23325A23325A23325A 23325A23325A23325A23325A23325A23325A24335B24335B24335B24335B24335B24335B24335B 24335B24335B24335B24335B24335B25345C25345C25345C25345C25345C25345C25345C25345C 25345C25345C25345C25345C25345C25345C26355D26355D26355D26355D26355D26355D26355D 26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D 26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D 26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D 26355D25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C 25345C25345C25345C24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B 24335B23325A23325A23325A23325A23325A23325A23325A23325A23325A23325A23325A223159 223159223159223159223159223159223159223159213058213058213058213058213058213058 213058213058213058202F57202F57202F57202F57202F57202F57202F57202F57202F571F2E56 1F2E561F2E561F2E561F2E561F2E561F2E561E2D551E2D551E2D551E2D551E2D551E2D551E2D55 1E2D551D2C541D2C541D2C541D2C541D2C541D2C541D2C541D2C541D2C541C2B531C2B531C2B53 1C2B531C2B531C2B531C2B531C2B531C2B531B2A521B2A521B2A521B2A521B2A521B2A521B2A52 1B2A521A29511A29511A29511A29511A29511A29511A29511A29511A2951BABFCBB9BECA5A5A5A 7171717777777B7B7B7D7D7D7C7C7C7C7C7C7B7B7B7B7B7B7B7B7B7A7A7A797979797979787878 7878787878787777777777777777777676767575757575751C242B1C242B1C242C0E1013030202 060606060606020101868584FAFAF7F6F3F0EFECE8DAD8D5E1DEDBDAD7D48C8A89706E6F727171 6D6B6A5F60605457572123260F10151314191314170F1015131517353A3BADAFAFA8A7A7000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000121212D3D2D39695987777795050510D0D13121319 191A1D5454566D6D6F7573767E7C7E8684858987898A888A8D8989CDC9C5F9F6F2F6F3EFF5F3EE F5F3EEFFFCF8A5A39F090907050505050606050303090A0A1B22291D252C1C242B757575767676 7676767777777878787878787878787878787979797979797A7A7A7B7B7B7B7B7B7B7B7B7B7B7B 7C7C7C7D7D7D7E7E7E7C7C7C7777777171715B5B5BBABFCBBABFCB1D2C531A29511A29511A2951 1A29511A29511A29511A29511B2A521B2A521B2A521B2A521B2A521B2A521B2A521B2A521C2B53 1C2B531C2B531C2B531C2B531C2B531C2B531C2B531C2B531D2C541D2C541D2C541D2C541D2C54 1D2C541D2C541D2C541D2C541E2D551E2D551E2D551E2D551E2D551E2D551E2D551E2D551F2E56 1F2E561F2E561F2E561F2E561F2E561F2E56202F57202F57202F57202F57202F57202F57202F57 202F57202F57213058213058213058213058213058213058213058213058213058223159223159 22315922315922315922315922315922315923325A23325A23325A23325A23325A23325A23325A 23325A23325A23325A23325A24335B24335B24335B24335B24335B24335B24335B24335B24335B 24335B24335B24335B25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C 25345C25345C25345C25345C25345C26355D26355D26355D26355D26355D26355D26355D26355D 26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D 26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D 26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D25345C 25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C 24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B23325A 23325A23325A23325A23325A23325A23325A23325A23325A23325A23325A223159223159223159 223159223159223159223159223159213058213058213058213058213058213058213058213058 213058202F57202F57202F57202F57202F57202F57202F57202F57202F571F2E561F2E561F2E56 1F2E561F2E561F2E561F2E561E2D551E2D551E2D551E2D551E2D551E2D551E2D551E2D551D2C54 1D2C541D2C541D2C541D2C541D2C541D2C541D2C541D2C541C2B531C2B531C2B531C2B531C2B53 1C2B531C2B531C2B531C2B531B2A521B2A521B2A521B2A521B2A521B2A521B2A521B2A521A2951 1A29511A29511A29511A29511A29511A29511A29511A2951BABFCBB9BECA5A5A5A717171777777 7C7C7C7D7D7D7C7C7C7C7C7C7B7B7B7B7B7B7B7B7B7A7A7A797979797979787878787878787878 7777777777777676767676767575757575751C242B1C242B1C242C0E1013030202060606060606 020101868584FAFAF6F6F4EFF1EEEADCD9D6E0DEDBD9D7D48D8B8971706D7373706C6C6A5E6061 5558582225270E10151315191214190F1016141619373C3DA4A8A9A6A4A6000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000121212D4D3D491919578787B5050510C0D1013151A16181B525254 6E6D6F7674767F7C7E8784858A87898B888A8D8A8BCECBC7F9F6F2F5F3EEF5F3EEF5F2EDFFFCF9 A4A29F070707050505050606050303090A0A1B22291D252C1C242B757575767676767676777777 7878787878787878787878787979797979797A7A7A7A7A7A7B7B7B7B7B7B7C7C7C7C7C7C7D7D7D 7D7D7D7C7C7C7777777171715B5B5BBABFCBBABFCB1D2C531A29511A29511A29511A29511A2951 1A29511A29511B2A521B2A521B2A521B2A521B2A521B2A521B2A521B2A521C2B531C2B531C2B53 1C2B531C2B531C2B531C2B531C2B531C2B531D2C541D2C541D2C541D2C541D2C541D2C541D2C54 1D2C541D2C541E2D551E2D551E2D551E2D551E2D551E2D551E2D551E2D551F2E561F2E561F2E56 1F2E561F2E561F2E561F2E56202F57202F57202F57202F57202F57202F57202F57202F57202F57 213058213058213058213058213058213058213058213058213058223159223159223159223159 22315922315922315922315923325A23325A23325A23325A23325A23325A23325A23325A23325A 23325A24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B 24335B25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C 25345C25345C26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D 26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D 26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D 26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D25345C25345C25345C 25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C24335B24335B 24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B23325A23325A 23325A23325A23325A23325A23325A23325A23325A223159223159223159223159223159223159 223159223159223159213058213058213058213058213058213058213058213058213058202F57 202F57202F57202F57202F57202F57202F57202F57202F571F2E561F2E561F2E561F2E561F2E56 1F2E561F2E561E2D551E2D551E2D551E2D551E2D551E2D551E2D551E2D551D2C541D2C541D2C54 1D2C541D2C541D2C541D2C541D2C541D2C541C2B531C2B531C2B531C2B531C2B531C2B531C2B53 1C2B531C2B531B2A521B2A521B2A521B2A521B2A521B2A521B2A521A29511A29511A29511A2951 1A29511A29511A29511A29511A29511A2951BABFCBB9BECA5A5A5A7171717777777B7B7B7D7D7D 7C7C7C7B7B7B7B7B7B7B7B7B7B7B7B7A7A7A797979797979787878787878787878787878777777 7676767676767575757575751C242B1C242B1C242C0E1013030202060606060606010101878684 FAFAF7F6F4F0F3F0EBDDDBD8DFDDDADAD7D48F8C8B716F6E73726F6A69685E5F5E575858232426 0E10141315191314180F0F14141518363B3CA8ABACA4A4A4000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000121212D6D5D69091937676795151520D0D1014161A17181D5355576E6D6F767476 7F7C7E8784858A88898B898A8D8A89CECAC7FAF7F3F6F3EFF6F3EFF6F3EFFFFCF8A4A19E070709 050505050606050303090A0A1B22291D252C1C242B757575767676767676777777777777787878 7878787878787979797979797A7A7A7A7A7A7B7B7B7B7B7B7B7B7B7C7C7C7D7D7D7E7E7E7C7C7C 7777777171715B5B5BBABFCBBABFCB1D2C531A29511A29511A29511A29511A29511A29511A2951 1B2A521B2A521B2A521B2A521B2A521B2A521B2A521B2A521C2B531C2B531C2B531C2B531C2B53 1C2B531C2B531C2B531C2B531D2C541D2C541D2C541D2C541D2C541D2C541D2C541D2C541D2C54 1E2D551E2D551E2D551E2D551E2D551E2D551E2D551E2D551F2E561F2E561F2E561F2E561F2E56 1F2E561F2E56202F57202F57202F57202F57202F57202F57202F57202F57202F57213058213058 213058213058213058213058213058213058213058223159223159223159223159223159223159 22315922315923325A23325A23325A23325A23325A23325A23325A23325A23325A23325A23325A 24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B25345C 25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C 25345C26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D 26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D 26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D 26355D26355D26355D26355D26355D26355D26355D25345C25345C25345C25345C25345C25345C 25345C25345C25345C25345C25345C25345C25345C25345C25345C24335B24335B24335B24335B 24335B24335B24335B24335B24335B24335B24335B24335B23325A23325A23325A23325A23325A 23325A23325A23325A23325A23325A23325A223159223159223159223159223159223159223159 223159213058213058213058213058213058213058213058213058213058202F57202F57202F57 202F57202F57202F57202F57202F571F2E561F2E561F2E561F2E561F2E561F2E561F2E561E2D55 1E2D551E2D551E2D551E2D551E2D551E2D551E2D551E2D551D2C541D2C541D2C541D2C541D2C54 1D2C541D2C541D2C541D2C541C2B531C2B531C2B531C2B531C2B531C2B531C2B531C2B531C2B53 1B2A521B2A521B2A521B2A521B2A521B2A521B2A521B2A521A29511A29511A29511A29511A2951 1A29511A29511A29511A2951BABFCBB9BECA5959597171717777777B7B7B7D7D7D7C7C7C7B7B7B 7B7B7B7B7B7B7B7B7B7A7A7A797979797979787878787878787878777777777777767676767676 7575757575751C242B1C242B1C242C0E10130302020606060606060201028B8986FBFBF8F6F4F0 F3F1ECDDDAD7DEDCD9DAD7D48E8C8A716F6E72706E6A69675F605E5559572325260F101514151A 1315180F1014121518363B3CA9ABADA3A2A2000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 121212CFCFD0908F917576784C4C4F0D0F1216171B17181A5455576F6E70767476807D7F878486 8A88898B898B8D8A8BCEC9C9FAF6F3F6F3EFF6F3EFF5F3EEFFFCF8A4A29F070707050505050606 050303090A0A1B22291D252C1C242B757575767676767676777777777777787878787878787878 7979797979797A7A7A7A7A7A7B7B7B7B7B7B7B7B7B7C7C7C7D7D7D7E7E7E7C7C7C777777717171 5B5B5BB9BECABABFCB1D2C531A29511A29511A29511A29511A29511A29511A29511B2A521B2A52 1B2A521B2A521B2A521B2A521B2A521B2A521C2B531C2B531C2B531C2B531C2B531C2B531C2B53 1C2B531C2B531D2C541D2C541D2C541D2C541D2C541D2C541D2C541D2C541D2C541E2D551E2D55 1E2D551E2D551E2D551E2D551E2D551E2D551E2D551F2E561F2E561F2E561F2E561F2E561F2E56 1F2E56202F57202F57202F57202F57202F57202F57202F57202F57213058213058213058213058 213058213058213058213058213058223159223159223159223159223159223159223159223159 23325A23325A23325A23325A23325A23325A23325A23325A23325A23325A23325A24335B24335B 24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B25345C25345C 25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C 26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D 26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D 26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D 26355D26355D26355D26355D25345C25345C25345C25345C25345C25345C25345C25345C25345C 25345C25345C25345C25345C25345C25345C24335B24335B24335B24335B24335B24335B24335B 24335B24335B24335B24335B24335B24335B23325A23325A23325A23325A23325A23325A23325A 23325A23325A23325A223159223159223159223159223159223159223159223159213058213058 213058213058213058213058213058213058213058202F57202F57202F57202F57202F57202F57 202F57202F57202F57202F571F2E561F2E561F2E561F2E561F2E561F2E561F2E561E2D551E2D55 1E2D551E2D551E2D551E2D551E2D551E2D551D2C541D2C541D2C541D2C541D2C541D2C541D2C54 1D2C541D2C541C2B531C2B531C2B531C2B531C2B531C2B531C2B531C2B531C2B531B2A521B2A52 1B2A521B2A521B2A521B2A521B2A521B2A521A29511A29511A29511A29511A29511A29511A2951 1A29511A2951B9BECAB9BECA5959597171717777777B7B7B7D7D7D7C7C7C7B7B7B7B7B7B7B7B7B 7B7B7B7A7A7A797979797979787878787878787878777777777777767676767676757575757575 1C242B1C242B1C242C0E10130302020606060606060202028B8986FBFBF8F5F3EFF5F2EEE0DDDA DDDAD8DAD7D38E8C89726F6E7371716B6A695E615F53585622232610101714161A1315190F1016 141719363B3DA6A8AEA6A6A7000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000121212CFCED1 94939678797B4D4C4F0D0D1316151C16171A545456706F717674767F7E808685878988898B888B 8D898ACDCAC7F9F6F2F6F3F0F5F2EEF5F2EFFFFCF8A3A09D070707050506050606050303090A0A 1B22291D252C1C242B757575767676767676777777777777787878787878787878797979797979 7A7A7A7A7A7A7B7B7B7B7B7B7B7B7B7C7C7C7C7C7C7D7D7D7C7C7C7777777171715B5B5BBABFCB BABFCB1D2C531A29511A29511A29511A29511A29511A29511A29511B2A521B2A521B2A521B2A52 1B2A521B2A521B2A521B2A521C2B531C2B531C2B531C2B531C2B531C2B531C2B531C2B531C2B53 1D2C541D2C541D2C541D2C541D2C541D2C541D2C541D2C541D2C541E2D551E2D551E2D551E2D55 1E2D551E2D551E2D551E2D551F2E561F2E561F2E561F2E561F2E561F2E561F2E561F2E56202F57 202F57202F57202F57202F57202F57202F57202F57202F57213058213058213058213058213058 21305821305821305821305822315922315922315922315922315922315922315922315923325A 23325A23325A23325A23325A23325A23325A23325A23325A23325A23325A24335B24335B24335B 24335B24335B24335B24335B24335B24335B24335B24335B24335B25345C25345C25345C25345C 25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C26355D26355D26355D 26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D 26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D 26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D 26355D26355D25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C 25345C25345C25345C25345C24335B24335B24335B24335B24335B24335B24335B24335B24335B 24335B24335B24335B24335B23325A23325A23325A23325A23325A23325A23325A23325A23325A 23325A223159223159223159223159223159223159223159223159223159213058213058213058 213058213058213058213058213058213058202F57202F57202F57202F57202F57202F57202F57 202F571F2E561F2E561F2E561F2E561F2E561F2E561F2E561F2E561E2D551E2D551E2D551E2D55 1E2D551E2D551E2D551E2D551D2C541D2C541D2C541D2C541D2C541D2C541D2C541D2C541C2B53 1C2B531C2B531C2B531C2B531C2B531C2B531C2B531C2B531B2A521B2A521B2A521B2A521B2A52 1B2A521B2A521B2A521B2A521A29511A29511A29511A29511A29511A29511A29511A29511A2951 B9BECAB9BECA5959597171717777777B7B7B7D7D7D7C7C7C7B7B7B7B7B7B7B7B7B7A7A7A7A7A7A 7979797878787878787878787878787777777777777676767676767575757575751C242B1C242B 1C242C0E10130302020606060606060102028A8886FBFAF7F5F4EFF6F4EFE2E0DDDCD9D8D9D6D2 8D8B89716F6D7372716B6A695D605F5357552022261010171314191213180E0F16131518363B3C A6A9AFA7A7A8000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000121212D1CFD38E8F93767879 4E4E500F0F1315171B17171B555558706F717674767F7D808584868A888A8B898B8D898ACECAC7 F9F7F2F5F2EFF5F2EEF6F3EFFEFBF7A29F9B090707050506050606050303090A0A1B22291D252C 1C242B7575757676767676767777777777777878787878787878787878787979797A7A7A7A7A7A 7B7B7B7B7B7B7B7B7B7C7C7C7C7C7C7D7D7D7C7C7C7777777171715B5B5BBABFCBBABFCB1D2C53 1A29511A29511A29511A29511A29511A29511A29511A29511B2A521B2A521B2A521B2A521B2A52 1B2A521B2A521B2A521C2B531C2B531C2B531C2B531C2B531C2B531C2B531C2B531D2C541D2C54 1D2C541D2C541D2C541D2C541D2C541D2C541D2C541E2D551E2D551E2D551E2D551E2D551E2D55 1E2D551E2D551E2D551F2E561F2E561F2E561F2E561F2E561F2E561F2E56202F57202F57202F57 202F57202F57202F57202F57202F57202F57213058213058213058213058213058213058213058 21305821305822315922315922315922315922315922315922315922315923325A23325A23325A 23325A23325A23325A23325A23325A23325A23325A23325A24335B24335B24335B24335B24335B 24335B24335B24335B24335B24335B24335B24335B25345C25345C25345C25345C25345C25345C 25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C26355D26355D26355D 26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D 26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D 26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D26355D 25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C25345C 25345C24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B24335B 24335B23325A23325A23325A23325A23325A23325A23325A23325A23325A23325A23325A223159 223159223159223159223159223159223159223159223159213058213058213058213058213058 213058213058213058202F57202F57202F57202F57202F57202F57202F57202F57202F571F2E56 1F2E561F2E561F2E561F2E561F2E561F2E561E2D551E2D551E2D551E2D551E2D551E2D551E2D55 1E2D551E2D551D2C541D2C541D2C541D2C541D2C541D2C541D2C541D2C541C2B531C2B531C2B53 1C2B531C2B531C2B531C2B531C2B531C2B531B2A521B2A521B2A521B2A521B2A521B2A521B2A52 1B2A521A29511A29511A29511A29511A29511A29511A29511A29511A29511A2951BABFCBB9BECA 5959597171717777777B7B7B7C7C7C7C7C7C7B7B7B7B7B7B7B7B7B7A7A7A7A7A7A797979787878 7878787878787878787878787777777676767676767575757575751C242B1C242B1C242C0E1013 030202060606060606020201888884FAFAF7F5F4EFF6F4EFE4E1DEDAD9D6D9D6D28E8B8871706F 72716F6869685D605F5457552022250F10171414191314190F0F15141619383D3DA2A7A8A6A6A6 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000121212D2D1D28D8E907574774E4E4F0E1014 15161B16171B555557706F717674777E7C7F8684868A888A8A888A8E8A8BCECAC8F9F6F2F5F2EE F5F2EDF5F2EEFFFCF8A3A09C090707050506050606050303090A0A1B22291D252C1C242B757575 7575757676767777777878787878787878787878787878787979797A7A7A7A7A7A7B7B7B7B7B7B 7B7B7B7C7C7C7D7D7D7D7D7D7C7C7C7777777171715B5B5BB9BECABABFCB1D2C531A29511A2951 1A29511A29511A295119285018264B162243141F3D131D3A131D3A131D3A131D3A131D3A131D3A 131E3B131E3B131E3B131E3B131E3B131E3B131E3B131E3B131E3B141F3B141F3B141F3B141F3B 141F3B141F3B141F3B141F3B141F3B151F3C151F3C151F3C151F3C151F3C151F3C151F3C151F3C 151F3C16203D16203D16203D16203D16203D16203D16203D16203D16213D16213D16213D16213D 16213D16213D16213D16213D17223E17223E17223E17223E17223E17223E17223E17223E17223E 18223F18223F18223F18223F18223F18223F18223F18223F18223F18233F18233F18233F18233F 18233F18233F18233F18233F18233F18233F192440192440192440192440192440192440192440 1924401924401924401924401924401924401A24411A24411A24411A24411A24411A24411A2441 1A24411A24411A24411A24411A24411A24411A24411A24411B25421B25421B25421B25421B2542 1B25421B25421B25421B25421B25421B25421B25421B25421B25421B25421B25421B25421B2542 1B25421B25421B25421B25421B25421B25421B25421B25421B25421B25421B25421B25421B2542 1B25421B25421B25421B25421B25421B25421B25421B25421B25421A24411A24411A24411A2441 1A24411A24411A24411A24411A24411A24411A24411A24411A24411A24411A24411A2441192440 19244019244019244019244019244019244019244019244019244019244019244019244018233F 18233F18233F18233F18233F18233F18233F18233F18233F18233F18233F18223F18223F18223F 18223F18223F18223F18223F18223F17223E17223E17223E17223E17223E17223E17223E17223E 17223E16213D16213D16213D16213D16213D16213D16213D16213D16213D16203D16203D16203D 16203D16203D16203D16203D151F3C151F3C151F3C151F3C151F3C151F3C151F3C151F3C151F3C 141F3B141F3B141F3B141F3B141F3B141F3B141F3B141F3B131E3B131E3B131E3B131E3B131E3B 131E3B131E3B131E3B131E3B131E3B131D3A131D3A131D3A131D3A131D3A131D3A131D3A141F3D 15214318264B1928501A29511A29511A29511A29511A29511A2951B9BECAB9BECA595959717171 7777777B7B7B7D7D7D7C7C7C7B7B7B7B7B7B7B7B7B7A7A7A7A7A7A797979797979787878787878 7878787777777777777676767575757575757575751C242B1C242B1C242C0E1013030202060606 060606020201878684FAFAF7F5F3EFF6F4EFE6E3E0DAD7D5D7D5D28D8A8774716E737270676967 5C5F5D5357562124260F101613151A1213180E10161214173B4041ACAFAFA4A4A4000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000121212D3D3D490909277767A4D4D4E0D0F1314151A16171B 5656587170727674777F7D7F8684868988898B898B8D8A8BCDCAC7F9F6F3F5F2EEF5F2EDF5F2EE FFFCF9A3A09D070707060506050606050303090A0A1B22291D252C1C242B757575757575767676 7676767777777878787878787878787979797979797A7A7A7A7A7A7B7B7B7B7B7B7B7B7B7B7B7B 7C7C7C7D7D7D7C7C7C7777777171715B5B5BB9BECABABFCB1D2C531A29511A29511A29511A2951 19285017244829324B9EA3AFC8CBD4D9DCE2D9DCE2D9DCE2D9DCE2D9DCE2D9DCE2D9DCE2D9DCE2 D9DCE2D9DCE2D9DCE2D9DCE2D9DCE2D9DCE2D9DCE2D9DCE2D9DCE3D9DCE3D9DCE3D9DCE3D9DCE3 D9DCE3D9DCE3D9DCE3DADCE3DADCE3DADCE3DADCE3DADCE3DADCE3DADCE3DADCE3DADCE3DADCE3 DADCE3DADCE3DADCE3DADCE3DADCE3DADCE3DADCE3DADCE3DADCE3DADCE3DADCE3DADCE3DADCE3 DADCE3DADCE3DADDE3DADDE3DADDE3DADDE3DADDE3DADDE3DADDE3DADDE3DADDE3DADDE3DADDE3 DADDE3DADDE3DADDE3DADDE3DADDE3DADDE3DADDE4DADDE4DADDE4DADDE4DADDE4DADDE4DADDE4 DADDE4DADDE4DADDE4DADDE4DBDDE4DBDDE4DBDDE4DBDDE4DBDDE4DBDDE4DBDDE4DBDDE4DBDDE4 DBDDE4DBDDE4DBDDE4DBDDE4DBDDE4DBDDE4DBDDE4DBDDE4DBDDE4DBDDE4DBDDE4DBDDE4DBDDE4 DBDDE4DBDDE4DBDDE4DBDDE4DBDDE4DBDDE4DBDDE4DBDDE4DBDDE4DBDDE4DBDDE4DBDDE4DBDDE4 DBDDE4DBDDE4DBDDE4DBDDE4DBDDE4DBDDE4DBDDE4DBDDE4DBDDE4DBDDE4DBDDE4DBDDE4DBDDE4 DBDDE4DBDDE4DBDDE4DBDDE4DBDDE4DBDDE4DBDDE4DBDDE4DBDDE4DBDDE4DBDDE4DBDDE4DBDDE4 DBDDE4DBDDE4DBDDE4DBDDE4D8DAE1D8DAE1D8DAE1D8DAE1D8DAE1D8DAE1D8DAE1D8DAE1D8DAE1 D8DAE1D8DAE1D8DAE1D8DAE1D8DAE1D8DAE1D8DAE1D8DAE1D8DAE1D8DAE1D8DAE1D8DAE1D8DAE1 D8DAE1D8DAE1D8DAE1D8DAE1D8DAE1D8DAE1D8DAE1D8DAE1D8DAE1D8DAE1D7DAE1D7DAE1D7DAE1 D7DAE1D7DAE1D7DAE1D7DAE1D7DAE1D7DAE1D7DAE1D7DAE0D7DAE0D7DAE0D7DAE0D7DAE0D7DAE0 D7DAE0D7DAE0D7DAE0D7DAE0D7DAE0D7DAE0D7DAE0D7DAE0D7DAE0D7DAE0D7DAE0D7DAE0D7D9E0 D7D9E0D7D9E0D7D9E0D7D9E0D7D9E0D7D9E0D7D9E0D7D9E0D7D9E0D7D9E0D7D9E0D7D9E0D7D9E0 D7D9E0D7D9E0D7D9E0D7D9E0D7D9E0D7D9E0D7D9E0D7D9E0D7D9E0D7D9E0D7D9E0D6D9E0D6D9E0 D6D9E0D6D9E0D6D9E0D6D9E0D6D9E0D6D9E0D6D9DFD6D9DFD6D9DFD6D9DFD6D9DFD6D9DFD6D9DF D6D9DFD6D9DFD6D9DFD6D9DFD6D9DFD6D9DFD6D9DFD6D9DFD6D9DFD6D9DFC5C8D29CA0AE29324B 1724481928501A29511A29511A29511A29511A2951B9BECAB9BECA5959597171717777777B7B7B 7D7D7D7C7C7C7B7B7B7B7B7B7B7B7B7A7A7A7A7A7A797979797979787878787878787878777777 7777777676767575757575757575751C242B1C242B1C242C0E1013030202060606060606020201 888684FAFAF7F5F3EFF6F4EFE8E5E1D9D6D4D7D5D08C8A8673706D747270686A685D5F5F535656 20232610101713131B1314190F1016141619383D3EA6A9ADA4A4A6000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000121212D1D0D29491937574764A4A4C0D0D1214151917181C59585A717072 767477807E7F8785878987898B888A8D8B8BCDCAC7F9F6F3F5F2EDF5F2EEF5F2EFFEFBF7A29F9C 070707060506050606050303090A0A1B22291D252C1C242B232528242528242528242528242629 24262924262924262924262924262A25272A25272A25272A25272A25272A25272B25272B26282B 25272A2425282224261B1C1FB4B9C5B4B9C50A1A4107173F07173F07174007174006153B2A334B C1C5CEBABECAAFB4C1ABB0BEABB0BEABB0BEABB0BEABB0BEABB0BEABB0BEABB0BEABB0BEABB0BE ABB0BEABB0BEABB1BEABB1BEABB1BEABB1BEABB1BEABB1BEABB1BEABB1BFABB1BFABB1BFABB1BF ABB1BFABB1BFACB1BFACB1BFACB1BFACB1BFACB1BFACB1BFACB1BFACB1BFACB1BFACB1BFACB1BF ACB1BFACB1BFACB1BFACB1BFACB1BFACB1BFACB1BFACB1BFACB1BFACB1BFACB1BFACB1BFACB1BF ACB1BFACB1BFACB1BFACB1BFACB1BFACB1BFACB1BFACB1BFACB1BFACB1BFACB1BFACB1BFACB1BF ACB1BFACB1BFACB1BFACB1BFACB1BFACB1BFACB1BFACB1BFACB1BFACB1BFACB1BFACB1BFACB1BF ACB1BFACB1BFACB1BFACB1BFACB1BFACB1BFACB1BFACB1BFACB1BFACB1BFACB1BFACB1BFACB1BF ACB1BFACB1BFACB1BFACB1BFACB1BFACB1BFACB1BFACB1BFACB1BFACB1BFACB1C0ACB1C0ACB1C0 ACB1C0ACB1C0ACB1C0ACB1C0ACB1C0ACB1C0ACB2C0ACB2C0ACB2C0ACB2C0ACB2C0ACB2C0ACB2C0 ACB2C0ACB2C0ACB2C0ACB2C0ACB2C0ACB2C0ACB2C0ACB2C0ACB2C0ACB2C0ACB2C0ACB2C0ACB2C0 ACB2C0ACB2C0ACB2C0ACB2C0ACB2C0ACB2C0ACB2C0ACB2C0ACB2C0ACB2C0ACB2C0ACB2C0ACB2C0 ACB2C0ACB2C0ADB3C1ADB2C1ADB2C1ADB2C1ADB2C1ADB2C1ADB2C1ADB2C1ADB2C1ADB2C1ADB2C1 ADB2C1ADB2C0ADB2C0ADB2C0ADB2C0ADB2C0ADB2C0ADB2C0ADB2C0ADB2C0ADB2C0ADB2C0ADB2C0 ADB2C0ADB2C0ADB2C0ADB2C0ADB2C0ADB2C0ADB2C0ADB2C0ADB2C0ADB2C0ADB2C0ADB2C0ADB2C0 ADB2C0ADB2C0ADB2C0ADB2C0ADB2C0ADB2C0ADB2C0ADB2C0ADB2C0ADB2C0ADB2C0ADB2C0ADB2C0 ADB2C0ADB2C0ADB2C0ADB2C0ADB2C0ADB2C0ADB2C0ADB2C0ADB2C0ADB2C0ADB2C0ADB2C0ADB2C0 ADB2C0ADB2C0ADB2C0ADB2C0ADB2C0ADB2C0ADB2C0ADB2C0ADB2C0ADB2C0ADB2C0ADB2C0ADB2C0 ADB2C0ADB2C0ADB2C0ADB2C0ADB2C0ADB2C0ADB2C0ADB2C0ACB2C0ACB2C0ACB2C0ACB2C0ACB2C0 ACB2C0ACB2C0ACB2BFACB2BFACB2BFACB2BFACB2BFACB2BFACB1BFACB1BFACB1BFACB1BFACB1BF ACB1BFACB1BFACB1BFACB1BFACB1BFACB1BFACB1BFACB1BFAFB4C1BABECAC1C5CE2B354C06153B 07174007173F07173F07173F07173FB4B9C5B4B9C51C1D1F23252725262926282B26282C26282B 26282B26282B26282B26282B25272B25272B25272A25272A25272A25272A25272A25272A252629 2526292426292426291C242B1C242B1C242C0E10130302020606060606060202028B8986FBFBF7 F6F3EFF7F4F0EAE7E4D9D6D4D6D4D18D8B8773716F7372716969665E5F5D5357562022250F1018 13141C1314190F101616161A333939A1A5A7A6A4A7000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000121212CECECF8E8C8E7473744B4C4D0D0F1314151A17171C5A595A717073767577807D7F 8785868987898B888A8E8B8DCDC9C7FAF7F3F6F3EFF6F3EFF5F2EEFEFBF7A09D9A060706060606 050606050303090A0A1B22291D252C1C242B6D71756D71756E72766F73776F73776F73786F7378 70747870747871757971757972757A72767B73777B73777B74787C74787C74787D72767B6F7277 6A6E7154575AB9BECAB9BECB1B2A53182851182851182851182851132042969BAAB0B5C3ADB3C1 ADB3C2ADB3C2ADB3C2ADB3C2ADB3C2ADB3C2ADB3C2ADB3C2AEB3C2AEB3C2AEB3C2AEB3C2AEB3C2 AEB3C2AEB3C2AEB3C2AEB3C2AEB4C2AEB4C2AEB4C2AEB4C2AEB4C2AEB4C2AEB4C2AEB4C2AEB4C2 AEB4C3AEB4C3AEB4C3AEB4C3AEB4C3AEB4C3AEB4C3AEB4C3AFB4C3AFB4C3AFB4C3AFB4C3AFB4C3 AFB4C3AFB4C3AFB4C3AFB4C3AFB5C3AFB5C3AFB5C3AFB5C3AFB5C3AFB5C3AFB5C3AFB5C4AFB5C4 AFB5C4B0B5C4B0B5C4B0B5C4B0B5C4B0B5C4B0B5C4B0B5C4B0B5C4B0B6C4B0B6C4B0B6C4B0B6C4 B0B6C4B0B6C4B0B6C4B0B6C4B0B6C4B0B6C4B0B6C4B0B6C4B0B6C4B0B6C4B0B6C4B0B6C4B0B6C4 B0B6C4B0B6C5B0B6C5B0B6C5B0B6C5B0B6C5B1B6C5B1B6C5B1B6C5B1B6C5B1B6C5B1B6C5B1B6C5 B1B6C5B1B6C5B1B6C5B1B6C5B1B6C5B1B6C5B1B7C5B1B7C5B1B7C5B1B7C5B1B7C5B1B7C5B1B7C5 B1B7C5B1B7C5B1B7C5B1B7C5B1B7C5B1B7C6B1B7C6B1B7C6B1B7C6B1B7C6B1B7C6B1B7C6B1B7C6 B1B7C6B1B7C6B1B7C6B1B7C6B1B7C6B1B7C6B1B7C6B1B7C6B1B7C6B1B7C6B1B7C6B1B7C6B1B7C6 B1B7C6B1B7C6B1B7C6B1B7C6B1B7C6B1B7C6B1B7C6B1B7C6B1B7C6B1B7C6B1B7C6B1B7C6B1B7C6 B1B7C6B1B7C5B1B7C5B1B7C5B1B7C5B1B7C5B1B7C5B1B7C5B1B7C5B1B7C5B1B7C5B1B7C5B1B7C5 B1B7C5B1B6C5B1B6C5B1B6C5B1B6C5B1B6C5B1B6C5B1B6C5B1B6C5B1B6C5B1B6C5B1B6C5B1B6C5 B0B6C5B0B6C5B0B6C5B0B6C5B0B6C5B0B6C4B0B6C4B0B6C4B0B6C4B0B6C4B0B6C4B0B6C4B0B6C4 B0B6C4B0B6C4B0B6C4B0B6C4B0B6C4B0B6C4B0B6C4B0B6C4B0B6C4B0B6C4B0B5C4B0B5C4B0B5C4 B0B5C4B0B5C4B0B5C4B0B5C4B0B5C4AFB5C4AFB5C4AFB5C4AFB5C3AFB5C3AFB5C3AFB5C3AFB5C3 AFB5C3AFB5C3AFB4C3AFB4C3AFB4C3AFB4C3AFB4C3AFB4C3AFB4C3AFB4C3AFB4C3AEB4C3AEB4C3 AEB4C3AEB4C3AEB4C3AEB4C3AEB4C3AEB4C3AEB4C2AEB4C2AEB4C2AEB4C2AEB4C2AEB4C2AEB4C2 AEB4C2AEB4C2AEB3C2AEB3C2AEB3C2AEB3C2AEB3C2AEB3C2AEB3C2AEB3C2AEB3C2ADB3C2ADB3C2 ADB3C2ADB3C2ADB3C2ADB3C2ADB3C2ADB3C2ADB3C1ADB3C1B0B5C3979DAB132042182851182851 182851182751182751B9BECAB9BECA525558686C706E717671757A73777B72767A72767A71757A 71757A7174797074787074786F73776F73776E72776E72776E72766D71756D71756C70746C7074 6C6F741C242B1C242B1C242C0E10130302020606060606060201028D8A87FBFBF8F6F3EFF7F4F0 EBE8E5D8D5D3D7D4D18E8C8A73716F7372706868665D5E5C5356552023260E101712151B121419 0F1016151619333939A3A6A6AAA8AA000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000121412 D1D1D58F8F937575764A4A4B0D0D1314151A18191C5A5A5B727174787577807D7E87858689888A 8A888B8E8A8CCDCAC7F9F6F3F6F3EFF5F2EDF5F2EEFFFDF8A19E9B060706060606050606050303 090A0A1B22291D252C1C242B595E65595E655A5F65595E655A5F665A5F655A5F665B60675B6067 5C61685C61685C62695D62695D62695E636A5E636A5E636A5F646B5D636A5A5F66565B6145494E B8BDC9B8BDC916264F13234D13234D14244D14244D0E1A39ABB0BEA8AEBDA8AEBDA8AEBDA8AEBD A8AEBDA8AEBDA8AEBDA8AEBDA8AEBDA8AEBDA8AEBDA8AEBEA8AEBEA8AEBEA8AEBEA8AEBEA8AEBE A8AEBEA8AEBEA8AFBEA9AFBEA8AFBEA9AFBEA9AFBEA9AFBEA9AFBEA9AFBEA9AFBEA9AFBEA9AFBF A9AFBFA9AFBFA9AFBFA9AFBFA9AFBFA9AFBFA9AFBFA9AFBFA9AFBFA9AFBFA9AFBFA9AFBFA9AFBF A9AFBFA9AFBFA9AFBFA9AFBFA9AFBFA9B0BFA9B0BFA9B0BFA9B0BFA9B0BFAAB0BFAAB0BFAAB0BF AAB0BFAAB0BFAAB0BFAAB0C0AAB0C0AAB0C0AAB0C0AAB0C0AAB0C0AAB0C0AAB0C0AAB0C0AAB0C0 AAB0C0AAB0C0AAB0C0AAB0C0AAB0C0AAB0C0ABB0C0ABB0C0ABB0C0ABB0C0ABB0C0ABB0C0ABB0C0 ABB0C0ABB0C0ABB1C0ABB1C0ABB1C0ABB1C0ABB1C0ABB1C0ABB1C0ABB1C0ABB1C0ABB1C0ABB1C0 ABB1C0ABB1C0ABB1C1ABB1C1ABB1C1ABB1C0ABB1C1ABB1C1ABB1C1ABB1C1ABB1C1ABB1C1ABB1C1 ABB1C1ABB1C1ABB1C1ABB1C1ABB1C1ABB1C1ABB1C1ABB1C1ABB1C1ABB1C1ABB1C1ABB1C1ABB1C1 ABB1C1ABB1C1ABB1C1ABB1C1ABB1C1ABB1C1ABB1C1ABB1C1ABB1C1ABB1C1ABB1C1ABB1C1ABB1C1 ABB1C1ABB1C1ABB1C1ABB1C1ABB1C1ABB1C1ABB1C1ABB1C1ABB1C1ABB1C1ABB1C1ABB1C1ABB1C1 ABB1C1ABB1C1ABB1C1ABB1C1ABB1C1ABB1C1ABB1C1ABB1C1ABB1C1ABB1C1ABB1C1ABB1C1ABB1C1 ABB1C0ABB1C0ABB1C0ABB1C0ABB1C0ABB1C0ABB1C0ABB1C0ABB1C0ABB1C0ABB1C0ABB1C0ABB1C0 ABB1C0ABB0C0ABB0C0ABB0C0ABB0C0ABB0C0ABB0C0ABB0C0ABB0C0AAB0C0AAB0C0AAB0C0AAB0C0 AAB0C0AAB0C0AAB0C0AAB0C0AAB0C0AAB0C0AAB0C0AAB0C0AAB0C0AAB0C0AAB0C0AAB0C0AAB0BF AAB0BFAAB0BFAAB0BFAAB0BFAAB0BFA9B0BFA9B0BFA9B0BFA9B0BFA9AFBFA9AFBFA9AFBFA9AFBF A9AFBFA9AFBFA9AFBFA9AFBFA9AFBFA9AFBFA9AFBFA9AFBFA9AFBFA9AFBFA9AFBFA9AFBFA9AFBF A9AFBFA9AFBFA9AFBEA9AFBEA9AFBEA9AFBEA9AFBEA9AFBEA9AFBEA9AFBEA9AFBEA9AFBEA8AFBE A8AFBEA8AEBEA8AEBEA8AEBEA8AEBEA8AEBEA8AEBEA8AEBDA8AEBDA8AEBDA8AEBDA8AEBDA8AEBD A8AEBDA8AEBDA8AEBDA8AEBDA8AEBDA8AEBDA8AEBDB0B5C20E1A3813234D13234D13234D13234D 13234DB8BDC9B8BDC944474C555B615A5F665D62695E636A5D62695E636A5C61695C61695C6269 5C61685C61685B60675B60675B60675B60675A5F665A5F665A5F65595E65595E65585D641C242B 1C242B1C242C0E10130302020606060606060202028D8B88FBFBF8F5F2EFF6F3EFECE9E5D8D6D3 D6D3D08F8D8A73716F7372706969685E5F5E5457552123260F101713151B13161A0F1015131619 353B3BA1A5A5A4A4A4000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000121212CFCFD2939395 7474764D4D4F0D0F121415191B1B1E5D5C5D737174787678807D7E8784858988898B888B8D898A CCC9C6F9F7F2F5F2EEF4F1EDF5F2EEFFFCF7A29F9C070606060506050606050303090A0A1B2229 1D252C1C242B595E65585D64595E65595F655A5F655A5F665A60675B60675B60675C61685C6168 5C62695D62695D62695E636A5D62695E636A5E636A5C61685A5E65555A6144484DB8BDC9B8BDC9 16264F13234D13234D13234D14244D0E1937A6ACBBA4AABAA4AABAA4AABAA4AABAA4AABBA4AABB A4AABBA4AABBA4AABBA5ABBBA5ABBBA5ABBBA5ABBBA5ABBBA5ABBBA5ABBBA5ABBBA5ABBBA5ABBB A5ABBBA5ABBBA5ABBBA5ABBBA5ABBBA5ABBBA5ABBBA5ABBBA5ABBBA5ABBBA5ABBBA5ACBCA5ACBC A5ACBCA5ACBCA5ACBCA5ACBCA5ACBCA5ACBCA5ACBCA5ACBCA5ACBCA5ACBCA5ACBCA6ACBCA6ACBC A6ACBCA6ACBCA6ACBCA6ACBCA6ACBDA6ACBCA6ACBDA6ACBDA6ACBDA6ACBDA6ACBDA6ACBDA6ACBD A6ADBDA6ADBDA6ADBDA6ADBDA6ADBDA6ADBDA6ADBDA7ADBDA7ADBDA7ADBDA7ADBDA7ADBDA7ADBD A7ADBDA7ADBDA7ADBDA7ADBDA7ADBDA7ADBDA7ADBDA7ADBDA7ADBDA7ADBDA7ADBDA7ADBEA7AEBE A7ADBDA7AEBEA7AEBEA7AEBEA7AEBEA7AEBEA7AEBEA7AEBEA7AEBEA7AEBEA7AEBEA7AEBEA7AEBE A7AEBEA7AEBEA7AEBEA7AEBEA7AEBEA7AEBEA7AEBEA7AEBEA7AEBEA7AEBEA7AEBEA7AEBEA7AEBE A7AEBEA7AEBEA7AEBEA7AEBEA7AEBEA7AEBEA7AEBEA7AEBEA7AEBEA7AEBEA8AEBEA7AEBEA8AEBE A8AEBEA7AEBEA8AEBEA7AEBEA7AEBEA7AEBEA7AEBEA7AEBEA7AEBEA8AEBEA7AEBEA8AEBEA8AEBE A7AEBEA8AEBEA7AEBEA7AEBEA7AEBEA7AEBEA7AEBEA7AEBEA7AEBEA7AEBEA7AEBEA7AEBEA7AEBE A7AEBEA7AEBEA7AEBEA7AEBEA7AEBEA7AEBEA7AEBEA7AEBEA7AEBEA7AEBEA7AEBEA7AEBEA7AEBE A7AEBEA7AEBEA7AEBEA7AEBEA7AEBEA7AEBEA7AEBEA7AEBEA7AEBEA7AEBEA7AEBEA7AEBEA7ADBE A7ADBDA7ADBDA7ADBDA7ADBDA7ADBDA7ADBDA7ADBDA7ADBDA7ADBDA7ADBDA7ADBDA7ADBDA7ADBD A7ADBDA7ADBDA7ADBDA7ADBDA6ADBDA6ADBDA6ADBDA6ADBDA6ADBDA6ADBDA6ADBDA6ACBDA6ACBD A6ACBDA6ACBDA6ACBDA6ACBDA6ACBDA6ACBCA6ACBCA6ACBCA6ACBCA6ACBCA6ACBCA5ACBCA6ACBC A5ACBCA5ACBCA5ACBCA5ACBCA5ACBCA5ACBCA5ACBCA5ACBCA5ACBCA5ACBCA5ACBCA5ACBCA5ABBB A5ABBBA5ABBBA5ABBBA5ABBBA5ABBBA5ABBBA5ABBBA5ABBBA5ABBBA5ABBBA5ABBBA5ABBBA5ABBB A5ABBBA5ABBBA5ABBBA5ABBBA5ABBBA5ABBBA5ABBBA4ABBBA4ABBBA4AABBA4AABBA4AABBA4AABB A4AABBA4AABAA4AABAA4AABAA4AABAA7ADBC0D183613234D13234D13234D13234D13234DB8BDC9 B7BDC943474C555A60595D645C61685D636A5E636A5D62695D62695D62695C61685C61685B6067 5B60675A5F665A5F665A5F655A5F655A5F65595E65595E65595E65585D631C242B1C242B1C242C 0E10130302020606060606060202028B8986FBFBF8F6F3EFF6F3EFEDEAE6D8D6D3D6D3D08F8C89 72706E7371706A69675E606053575420212410121714151A15151A101216131619363C3CA7A9AB A6A6A6000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000121212CFCFD18D8D8F7474764C4C4E 0D0F121414191A1B1E5D5D5E737274797778807D7F8683868987898B898B8D8A8BCCC8C6FAF7F3 F6F3EFF5F2EDF5F2EEFFFDF8A29F9C070606060505050606050303090A0A1B22291D252C1C242B 585D64585D64595E65595E655A5F655A5F655A5F665B60675B60675B60675B60675C61685C6168 5C61695D62695D636A5D636A5E636A5C61685A5E65555A6144484DB8BDC9B8BDC916264F13234D 13234D13234D14244D0E19379FA5B5A1A7B7A1A7B7A1A7B7A1A7B8A1A7B8A1A7B8A1A7B8A1A7B8 A1A7B8A1A7B8A1A7B8A1A7B8A1A7B8A1A7B8A1A7B8A1A7B8A1A7B8A1A7B8A1A8B8A1A8B8A1A8B8 A1A8B8A1A8B8A1A8B9A1A8B9A1A8B9A1A8B9A1A8B9A1A8B9A1A8B9A1A8B9A1A8B9A1A8B9A2A8B9 A2A8B9A2A8B9A2A8B9A2A8B9A2A8B9A2A8B9A2A8B9A2A9B9A2A9B9A2A9B9A2A9B9A2A9B9A2A9B9 A2A9B9A2A9B9A2A9B9A2A9BAA2A9BAA2A9BAA2A9BAA2A9BAA2A9BAA3A9BAA3A9BAA3A9BAA3A9BA A3A9BAA3A9BAA3A9BAA3A9BAA3A9BAA3A9BAA3A9BAA3A9BAA3A9BAA3A9BAA3A9BAA3A9BAA3AABB A3AABBA3AABBA3AABBA3AABBA3AABBA3AABBA3AABBA3AABBA3AABBA3AABBA3AABBA3AABBA3AABB A3AABBA3AABBA3AABBA3AABBA3AABBA3AABBA3AABBA3AABBA3AABBA3AABBA4AABBA4AABBA4AABB A4AABBA4AABBA4AABBA4AABBA4AABCA4AABCA4AABCA4AABCA4ABBCA4ABBCA4ABBCA4ABBCA4ABBC A4ABBCA4ABBCA4ABBCA4ABBCA4ABBCA4ABBCA4ABBCA4ABBCA4ABBCA4ABBCA4ABBCA4ABBCA4ABBC A4ABBCA4ABBCA4ABBCA4ABBCA4ABBCA4ABBCA4ABBCA4ABBCA4ABBCA4ABBCA4ABBCA4ABBCA4ABBC A4ABBCA4ABBCA4ABBCA4ABBCA4ABBCA4ABBCA4ABBCA4ABBCA4ABBCA4ABBCA4ABBCA4ABBCA4AABC A4AABCA4AABCA4AABCA4AABBA4AABBA4AABBA4AABBA4AABBA4AABBA4AABBA3AABBA3AABBA3AABB A3AABBA3AABBA3AABBA3AABBA3AABBA3AABBA3AABBA3AABBA3AABBA3AABBA3AABBA3AABBA3AABB A3AABBA3AABBA3AABBA3AABBA3AABBA3AABBA3AABBA3AABBA3A9BAA3AABAA3AABAA3A9BAA3A9BA A3A9BAA3A9BAA3A9BAA3A9BAA3A9BAA3A9BAA3A9BAA3A9BAA3A9BAA3A9BAA3A9BAA2A9BAA2A9BA A2A9BAA2A9BAA2A9BAA2A9BAA2A9B9A2A9B9A2A9B9A2A9B9A2A9B9A2A9B9A2A9B9A2A9B9A2A9B9 A2A9B9A2A8B9A2A8B9A2A8B9A2A8B9A2A8B9A2A8B9A1A8B9A1A8B9A1A8B9A1A8B9A1A8B9A1A8B9 A1A8B9A1A8B9A1A8B9A1A8B9A1A8B9A1A8B8A1A8B8A1A8B8A1A8B8A1A7B8A1A7B8A1A7B8A1A7B8 A1A7B8A1A7B8A1A7B8A1A7B8A1A7B8A1A7B8A1A7B8A1A7B8A1A7B8A1A7B8A1A7B8A1A7B8A1A7B7 A1A7B7A1A7B7A1A7B7A0A7B70D183613234D13234D13234D13234D13234DB8BDC9B7BDC943474C 555A60595E655C61685D636A5E636A5D62695D62695C62695C61685C62695B60675B60675B6067 5A5F665A5F655A5F655A5F65595E65585D64585D64585D631C242B1C242B1C242C0E1013030202 0606060606060201028D8B88FBFBF8F6F3EFF6F4EFEDEBE6D7D4D2D4D3CE8E8C8873716E747271 6A69695D5F6054575721222510101714141A14151A101016141619353B3CA2A6A9A2A2A2000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000121414CFCED18D8C907576784C4C4E0F1013131419 191A1C5C5A5C747275797678807D7F8684878A888A8B898B8D8A8ACECAC7F9F6F3F6F3EFF6F3F0 F6F3EFFFFCF8A29F9C070606060506050606050303090A0A1B22291D252C1C242B585D63585D64 595E65595E655A5F655A5F655A5F665B60675B60675B60675B60675C61685C61685C61695D6269 5D62695D636A5E636A5C61685A5E65555A6144484DB8BDC9B8BDC916264F13234D13234D13234D 13234D0D18379AA0B29CA3B49CA3B49CA3B49CA3B49CA3B49CA3B49CA3B49CA3B49CA3B49CA3B4 9CA3B49CA3B49CA3B49CA3B49CA3B59CA3B59CA3B59CA3B59CA3B59CA3B59CA4B59CA4B59DA4B5 9DA4B59DA4B59DA4B59DA4B59DA4B59DA4B59DA4B59DA4B59DA4B59DA4B69DA4B69DA4B69DA4B6 9DA4B69DA4B69DA4B69DA4B69DA4B69DA4B69DA4B69DA4B69DA4B69EA4B69EA4B69EA4B69EA4B6 9EA4B69EA5B69EA5B79EA5B79EA5B79EA5B79EA5B79EA5B79EA5B79EA5B79EA5B79EA5B79EA5B7 9EA5B79EA5B79EA5B79EA5B79EA5B79EA5B79EA5B79EA5B79EA5B79EA5B79EA5B79EA6B79EA6B7 9EA6B79EA6B79EA6B79EA6B79FA6B79FA6B79FA6B79FA6B79FA6B79FA6B79FA6B79FA6B89FA6B8 9FA6B89FA6B89FA6B89FA6B89FA6B89FA6B89FA6B89FA6B89FA6B89FA6B89FA6B89FA6B89FA6B8 9FA6B89FA6B89FA6B89FA6B89FA6B89FA6B89FA6B89FA6B89FA6B89FA6B89FA6B89FA6B89FA6B8 9FA6B89FA6B89FA6B89FA6B89FA6B89FA6B89FA6B89FA6B89FA6B89FA6B89FA6B89FA6B89FA6B8 9FA6B89FA6B89FA6B89FA6B89FA6B89FA6B89FA6B89FA6B89FA6B89FA6B89FA6B89FA6B89FA6B8 9FA6B89FA6B89FA6B89FA6B89FA6B89FA6B89FA6B89FA6B89FA6B89FA6B89FA6B89FA6B89FA6B8 9FA6B89FA6B89FA6B89FA6B89FA6B89FA6B89FA6B89FA6B89FA6B89FA6B89FA6B89FA6B89FA6B8 9FA6B89FA6B89FA6B89FA6B89FA6B89FA6B79FA6B79FA6B79FA6B79FA6B79FA6B79FA6B79EA6B7 9EA6B79EA6B79EA6B79EA6B79EA6B79EA5B79EA5B79EA5B79EA5B79EA5B79EA5B79EA5B79EA5B7 9EA5B79EA5B79EA5B79EA5B79EA5B79EA5B79EA5B79EA5B79EA5B79EA5B79EA5B79EA5B69EA5B7 9EA4B69EA5B69EA5B69EA4B69EA4B69EA4B69EA4B69EA4B69DA4B69DA4B69DA4B69DA4B69DA4B6 9DA4B69DA4B69DA4B69DA4B69DA4B69DA4B69DA4B69DA4B59DA4B59DA4B59DA4B59DA4B59DA4B5 9DA4B59DA4B59DA4B59DA4B59CA4B59CA4B59CA3B59CA3B59CA3B59CA3B59CA3B59CA3B59CA3B5 9CA3B49CA3B49CA3B49CA3B49CA3B49CA3B49CA3B49CA3B49CA3B49CA3B49CA3B49CA3B49CA3B4 9CA2B49CA3B40D183613234D13234D13234D13234D13234CB8BDC9B7BDC942464B555A60585D64 5C61685D636A5D62695D62695C61695C61695C61685B60675B60675B60675A5F665A5F665A5F65 5A5F65595E65595E65585D64585D63585D631C242B1C242B1C242C0E1013030202060606060606 0202028E8C89FCFBF8F6F3EFF7F5F0EEECE7D6D3D1D4D2CF8E8C8A726F6F737373696A695C5E5D 575A592324280F101513141A1314190F101515161A343A39A6AAAD9E9FA0000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000141212CFCFD28B8A907474774C4C4E0F101214151818191D5C5A5D 747274797678807D7F8886878C898B8B898A8E8B8BCCC8C7F8F5F1F6F3F0F6F3F0F5F3EEFFFCF9 A2A09D060606050505050606050303090A0A1B22291D252C1C242B585D64585D63585D64585D64 595E65595E65595E655B60675A5F665B60675B60675B60675C61685C61685C61695C62695D6269 5D636A5B61685A5E65545A6144484DB8BDC9B7BDC916264F13234D13234D13234D13234D0D1837 959CAE979EB0979EB0979EB0979EB0979EB1979EB1979EB1979EB1979EB1979EB1979EB1979FB1 989FB1979FB1989FB1989FB1989FB1989FB1989FB1989FB1989FB1989FB1989FB1989FB1989FB1 989FB2989FB2989FB2989FB2989FB2989FB298A0B298A0B298A0B298A0B298A0B299A0B299A0B2 99A0B299A0B299A0B299A0B299A0B399A0B399A0B399A0B399A0B399A0B399A0B399A0B399A1B3 99A1B399A1B399A1B399A1B399A1B399A1B39AA1B39AA1B39AA1B39AA1B39AA1B39AA1B39AA1B4 9AA1B49AA1B49AA1B49AA1B49AA1B49AA1B49AA1B49AA1B49AA1B49AA1B49AA1B49AA1B49AA1B4 9AA1B49AA1B49AA1B49AA1B49AA1B49AA1B49AA1B49AA1B49AA1B49AA1B49AA1B49AA1B49AA1B4 9AA1B49AA2B49AA2B49AA2B49AA2B49AA2B49AA2B49AA2B49AA2B49AA2B49AA2B49BA2B49BA2B4 9BA2B49BA2B59BA2B49BA2B59BA2B59BA2B59BA2B59BA2B59BA2B59BA2B59BA2B59BA2B59BA2B5 9BA2B59BA2B59BA2B59BA2B59BA2B59BA2B59BA2B59BA2B59BA2B59BA2B59BA2B59BA2B59BA2B5 9BA2B59BA2B59BA2B59BA2B59BA2B59BA2B59BA2B59BA2B59BA2B59BA2B59BA2B59BA2B59BA2B5 9BA2B59BA2B59BA2B59BA2B59BA2B59BA2B59BA2B59BA2B59BA2B49BA2B49BA2B49BA2B49BA2B4 9AA2B49AA2B49AA2B49AA2B49AA2B49AA2B49AA2B49AA2B49AA2B49AA2B49AA2B49AA1B49AA1B4 9AA2B49AA1B49AA1B49AA1B49AA1B49AA1B49AA1B49AA1B49AA1B49AA1B49AA1B49AA1B49AA1B4 9AA1B49AA1B49AA1B49AA1B49AA1B49AA1B49AA1B49AA1B49AA1B49AA1B49AA1B49AA1B49AA1B4 9AA1B49AA1B39AA1B39AA1B39AA1B39AA1B399A1B399A1B399A1B399A1B399A1B399A0B399A1B3 99A0B399A0B399A0B399A0B399A0B399A0B399A0B399A0B299A0B299A0B299A0B299A0B299A0B2 99A0B298A0B298A0B298A0B2989FB298A0B2989FB2989FB2989FB2989FB2989FB2989FB2989FB2 989FB1989FB1989FB1989FB1989FB1989FB1989FB1989FB1989FB1989FB1989FB1989FB1979FB1 979FB1979FB1979EB1979EB1979EB1979EB1979EB0979EB0979EB0979EB0979EB0979EB0979EB0 0D183613234D13234D13234D13234D13234CB8BDC9B7BDC942464C555A60585D645B61685D636A 5C61695C61695C61695B60685B60675B60675B60675A5F66595E65595E65595E65595E65585E65 585D64585D64575D63575C631C242B1C242B1C242C0E1013030202060606060606020202908E8C FCFCF7F6F3EFF7F5F0EEECE7D5D4D1D5D2CF8E8C8A71706E7271706A69675D5F5D575959222427 0F101614151A12141A101016131518343A39ABADAE9F9E9F000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000121412CDCDCF8B8A8E78777B4E4D500D0D13131419181A1E5D5C5E737072797879 807F818885868C8A8B8C898B8F8A8ACCC8C5F9F6F2F6F3EFF6F3EFF6F3EFFEFBF8A09D9A070606 060506050606050303090A0A1B22291D252C1C242B585D63585D64585D64585D645A5F65595E65 595E655A5F665A5F665A5F665B60675C61685B60675C61695C61695C61695D636A5D62695B6168 585D6454595F43484DB7BDC9B7BDC916264F13234D13234D13234D13234D0D18379199AC939BAE 939BAE949BAE949BAE949BAE949BAE949BAE949BAE949BAE949BAE949BAE949BAE949BAE949BAE 949BAE949BAE949BAF949BAF949BAF949BAF949CAF949BAF949CAF949CAF949CAF959CAF959CAF 959CAF959CAF959CAF959CAF959CAF959CAF959CAF959CB0959CB0959CB0959CB0959CB0959CB0 959CB0959CB0959CB0959CB0959DB0959DB0959DB0959DB0959DB0959DB0959DB0959DB0959DB0 959DB0959DB0959DB0959DB0959DB0969DB0969DB0969DB0969DB0969EB1969EB1969EB1969EB1 969EB1969EB1969EB1969EB1969EB1969EB1969EB1969EB1969EB1969EB1969EB1969EB1969EB1 969EB1969EB1969EB1969EB1979EB1979EB1979EB1979EB1979FB2979EB1979FB2979EB2979FB2 979FB2979FB2979FB2979FB2979FB2979FB2979FB2979FB2979FB2979FB2979FB2979FB2979FB2 979FB2979FB2979FB2979FB2979FB2979FB2979FB2979FB2979FB2979FB2979FB2979FB2979FB2 979FB2979FB2979FB2979FB2979FB2979FB2979FB2979FB2979FB2979FB2979FB2979FB2979FB2 979FB2979FB2979FB2979FB2979FB2979FB2979FB2979FB2979FB2979FB2979FB2979FB2979FB2 979FB2979FB2979FB2979FB2979FB2979FB2979FB2979FB2979FB2979FB2979FB2979FB2979FB2 979FB2979FB2979FB2979FB2979FB2979FB2979FB2979FB2979FB2979FB2979EB2979EB1979EB1 979EB1979EB1979EB1969EB1979EB1979EB1969EB1969EB1969EB1969EB1969EB1969EB1969EB1 969EB1969EB1969EB1969EB1969EB1969EB1969EB1969EB1969EB1969EB1969EB1969DB0969DB0 969DB0969DB0969DB0959DB0959DB0959DB0959DB0959DB0959DB0959DB0959DB0959DB0959DB0 959DB0959DB0959DB0959DB0959CB0959DB0959DB0959CB0959CB0959CB0959CB0959CB0959CB0 959CB0959CAF959CAF959CAF959CAF959CAF959CAF959CAF959CAF959CAF949CAF949CAF949BAF 949BAF949CAF949BAF949BAF949BAF949BAF949BAF949BAE949BAE949BAE949BAE949BAE949BAE 949BAE949BAE949BAE949BAE949BAE949BAE949BAE949BAE939BAE939BAE939AAE0D183613234D 13234D13234D13234C13234CB7BDC9B7BDC942464B53595F585D645B61685D62695C61695C6168 5C61685B60675B61685B60675B60675A6067595E65595F66595E65595E65585D64585D64585D63 575C63585D631C242B1C242B1C242C0E1013030202060606050505020202949290FDFCF7F5F3EE F7F4F0EFECE8D5D4D0D4D1CE8F8C8A73727073716F6A6A675E605E5758592325280E1015121519 121419101017131518363C3AA8AAAEA2A2A3000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 141214CCCCCE8B8A8D7C7A7E4E4D500C0D12131419191A1D5D5B5D7371737A7879817F81878486 8B898C8B898C8E8A8ACDCAC6F9F6F1F5F2EEF5F2EEF5F2EFFFFCF9A2A09D070606060505050606 050303090A0A1B22291D252C1C242B585D63585D63585D64585D64595E65595E65595E65595E65 5A5F66595F665A60675B60675A60675B60675C61685C61695D62695D636A5B6168585D6454595F 43484DB7BDC9B7BDC916264E13234C13234D13234D13234D0D18378D94A88F97AA8F97AA8F97AA 8F97AA8F97AA8F97AA8F97AB8F97AB8F97AB8F97AB8F97AB8F97AB8F97AB8F97AB9097AB9097AB 9097AB9097AB9097AB9097AB9097AB9097AB9097AB9098AB9098AB9098AC9098AC9098AC9098AC 9098AC9098AC9098AC9098AC9098AC9098AC9098AC9098AC9098AC9098AC9098AC9098AC9098AC 9098AC9098AC9099AD9099AD9099AD9099AD9199AD9199AD9199AD9199AD9199AD9199AD9199AD 9199AD9199AD9199AD9199AD9199AD9199AD9199AD9199AD9199AD919AAE9199AE919AAE919AAE 919AAE929AAE929AAE929AAE929AAE929AAE929AAE929AAE929AAE929AAE929AAE929AAE929AAE 929AAE929AAE929AAE929AAE929AAE929AAE929AAE929AAE929AAE929AAE929AAE929AAE929AAE 929AAE929AAE929AAE929AAE929AAE929AAE929AAE929AAE929AAE929AAE929AAE939AAE929AAE 939AAE939AAE939AAE939AAF939AAF939AAF939AAF939AAF939AAF939BAF939BAF939BAF939BAF 939BAF939BAF939BAF939BAF939AAF939BAF939AAF939AAF939BAF939AAF939BAF939BAF939BAF 939BAF939BAF939BAF939BAF939BAF939BAF939BAF939BAF939BAF939AAF939AAF939AAF939AAF 939AAE939AAE939AAE939AAE939AAE939AAE929AAE939AAE929AAE929AAE929AAE929AAE929AAE 929AAE929AAE929AAE929AAE929AAE929AAE929AAE929AAE929AAE929AAE929AAE929AAE929AAE 929AAE929AAE929AAE929AAE929AAE929AAE929AAE929AAE929AAE929AAE929AAE929AAE929AAE 929AAE929AAE929AAE919AAE919AAE919AAE9199AE919AAE9199AD9199AD9199AD9199AD9199AD 9199AD9199AD9199AD9199AD9199AD9199AD9199AD9199AD9199AD9199AD9199AD9099AD9099AD 9099AD9098AC9098AC9098AC9098AC9098AC9098AC9098AC9098AC9098AC9098AC9098AC9098AC 9098AC9098AC9098AC9098AC9098AC9098AC9098AC9098AC9098AB9098AB9097AB9097AB9097AB 9097AB9097AB9097AB9097AB9097AB9097AB8F97AB8F97AB8F97AB8F97AB8F97AB8F97AB8F97AB 8F97AB8F97AA8F97AA8F97AA8F97AA8F97AA8F97AA8F96AA8F96AA0D183613234D13234D13234C 13234C13234CB7BDC9B7BDC942464B54595F585D645B60675D62695C61695C61695C61685B6067 5B60675B60675A5F665A5F66595E65595E65585D65585D65585D64575C63585D63585D63575C63 1C242B1C242B1C242C0E1013030202060606050505030202979492FDFCF8F5F3EEF7F4F0EFECE8 D4D2CFD3D1CE8F8E8C72716F7472716869685C5E5D5659582224270E10141314191314180F1016 14171A383E3CA4A6A89E9E9E000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000141414CDCDD0 8D8D9278787B4B4C4E0D0D10121417191A1E5E5C5F7371737A787A817F808785878B898B8C898B 8E8A8ACDCAC7F9F5F1F5F2EEF4F1EEF5F2EFFFFCF9A1A09C070606050505050606050303090A0A 1B22291D252C1C242B575B62575C63575C63585D64585D64585D65585D65595E65595E66595E65 5A5F665A60675A60675B60685B60685C61695C61695D62695B6168585D6354595F43474CB7BDC9 B7BDC916264E13234C13234D13234D13234D0D18378991A58B93A78B93A78B93A78B93A78B93A7 8B93A78B93A78B93A88B93A88B93A88B93A88B94A88B93A88B94A88B94A88C94A88C94A88C94A8 8C94A88C94A88C94A88C94A88C94A88C94A88C94A88C94A88C94A98C94A98C94A98C94A98C94A9 8C94A98C94A98C94A98C94A98C94A98C95A98C95A98D95A98D95A98D95A98D95A98D95A98D95A9 8D95A98D95AA8D95AA8D95AA8D95AA8D95AA8D95AA8D95AA8D95AA8D95AA8D95AA8D96AA8D96AA 8D96AA8D96AA8D96AA8D96AA8E96AA8E96AA8E96AA8E96AB8E96AA8E96AB8E96AB8E96AB8E96AB 8E96AB8E96AB8E96AB8E96AB8E96AB8E96AB8E96AB8E97AB8E96AB8E97AB8E97AB8E97AB8E97AB 8E97AB8F97AB8E97AB8F97AB8F97AB8F97AB8F97AB8F97AB8F97AC8F97AB8F97AC8F97AC8F97AC 8F97AC8F97AC8F97AC8F97AC8F97AC8F97AC8F97AC8F97AC8F97AC8F97AC8F97AC8F97AC8F97AC 8F97AC8F97AC8F97AC8F97AC8F97AC8F97AC8F97AC8F97AC8F98AC8F97AC8F97AC8F98AC8F97AC 8F98AC8F98AC8F97AC8F98AC8F97AC8F97AC8F98AC8F97AC8F98AC8F98AC8F97AC8F98AC8F97AC 8F97AC8F98AC8F97AC8F98AC8F97AC8F97AC8F97AC8F97AC8F97AC8F97AC8F97AC8F97AC8F97AC 8F97AC8F97AC8F97AC8F97AC8F97AC8F97AC8F97AC8F97AC8F97AC8F97AC8F97AC8F97AC8F97AC 8F97AC8F97AB8F97AB8F97AC8F97AB8F97AC8F97AB8F97AB8F97AB8E97AB8E97AB8E97AB8E97AB 8E97AB8E97AB8E97AB8E97AB8E97AB8E97AB8E96AB8E96AB8E96AB8E96AB8E96AB8E96AB8E96AB 8E96AB8E96AB8E96AB8E96AA8E96AA8E96AB8E96AA8E96AA8E96AA8D96AA8E96AA8D96AA8D96AA 8D96AA8D96AA8D96AA8D96AA8D95AA8D95AA8D95AA8D95AA8D95AA8D95AA8D95AA8D95AA8D95AA 8D95A98D95A98D95A98D95A98D95A98D95A98C95A98C95A98C95A98C94A98C94A98C94A98C94A9 8C94A98C94A98C94A98C94A88C94A98C94A98C94A88C94A88C94A88C94A88C94A88C94A88C94A8 8C94A88C94A88C94A88C94A88B94A88B93A88B94A88B93A88B93A88B93A88B93A78B93A88B93A7 8B93A78B93A78B93A78B93A78B93A78B93A78B93A70D183613234D13234D13234C13234C13234C B7BDC9B7BDC942464B53595F585D645A5F675C61685C61685B60675B60675A60675B60675A5F66 5B60675A5F66595E65595E65585D65585D64585D63575C63575C63575B62565B621C242B1C242B 1C242C0E1013030202060606050505020202959492FDFCF8F6F3EFF7F4F0EEECE8D4D1CFD2CFCC 908C8C72716F73716E6869675D5F5E565A582224270F1015141419121418101015141619373D3D A6A9A89C9A9A000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000141414C9C9CC88878C767779 4B4B4B0D0D1013141818181C5F5E5E7472737A797A817E818785868A898A8B898B8E8A8ACDCAC7 F9F6F1F5F2EEF4F1EDF5F2EFFFFDF89E9C98060606060606050606050303090A0A1B22291D252C 1C242B575B62575C63575C63585D64585D64585E65585E65595E65595E65595E655A5F665A6067 5A60675B60675B60675C61685C61685C61695B6067585D6453595F43474CB7BDC9B7BDC916264E 13234C13234D13234C13234D0D1837858DA4878FA5878FA58790A58890A58890A58890A58890A5 8890A58890A58890A58890A58890A58890A58890A58890A58890A58890A58890A58890A68890A6 8890A68890A68890A68890A68891A68891A68891A68991A68991A68991A68991A68991A68991A6 8991A68991A68991A68991A78991A78991A78991A78991A78991A78991A78991A78991A78991A7 8992A78992A78992A78992A78A92A78A92A78A92A78A92A78A92A78A92A78A92A88A92A88A92A8 8A92A88A92A88A92A88A92A88A92A88A92A88A92A88A93A88A93A88A93A88A93A88A93A88A93A8 8B93A88B93A88B93A88B93A88B93A88B93A88B93A88B93A88B93A98B93A98B93A98B93A98B93A9 8B93A98B93A98B93A98B93A98B93A98B93A98B93A98B93A98B93A98B93A98B93A98B93A98B94A9 8B94A98B94A98B94A98B94A98B94A98B94A98B94A98B94A98B94A98B94A98B94A98C94A98C94A9 8C94A98C94A98C94A98C94A98C94A98C94A98C94A98C94A98A92A7787F926267765D637172798B 878FA48C94AA8C94A98C94A98C94A98C94A98C94A98C94A98C94AA8C94A98C94AA8C94AA8C94A9 8C94AA8C94A98C94A98C94A98C94A98C94A98C94A98C94A98C94A98C94A98C94A98B94A98B94A9 8B94A98B94A98B94A98B94A98B94A98B94A98B94A98B94A98B94A98B93A98B93A98B93A98B93A9 8B93A98B93A98B93A98B93A98B93A98B93A98B93A98B93A98B93A98B93A98B93A98B93A98B93A9 8B93A98B93A88B93A88B93A88B93A88B93A88B93A88B93A88B93A88A93A88A93A88A93A88A93A8 8A93A88A93A88A92A88A92A88A92A88A92A88A92A88A92A88A92A88A92A88A92A88A92A88A92A8 8A92A78A92A78A92A78A92A78A92A78992A78992A78992A78992A78991A78991A78991A78991A7 8991A78991A78991A78991A78991A78991A78991A78991A68991A68991A68991A68991A68991A6 8991A68991A68891A68891A68891A68891A68890A68890A68890A68890A68890A68890A58890A5 8890A58890A58890A58890A58890A58890A58890A58890A58890A58890A58890A58890A58890A5 8790A5878FA5878FA5878FA5878FA50D183613234D13234C13234C13234C13234CB7BDC9B7BDC9 42464B53585E585D635A5F675C61695C61685B60675B60675A60675A5F665A5F66595E65595E65 595E65585D64585D65585D65585D63585D64575C63575B62575B621C242B1C242B1C242C0E1013 030202060606050505030202979493FDFCF8F6F3EFF6F4EFEFECE8D3D1CED2CFCC8F8D8B72716D 72716C6869675D605F565B592325280F10151314181214180E1017131518333A3AAAAEB09C9B9C 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000121214CECDD08B8B8E7474774C4D4D0D0D10 131418191A1E5D5C5E7373737B797A817F808684868A898B8B898B8D8A89CCC9C6F8F4F1F5F2EF F4F1EDF5F2EEFEFBF8A09E9A060606050606050606050303090A0A1B22291D252C1C242B565B62 575B62565B6254596051565C4D525850555B51555C51565D51565D52565D52575D52575E53585E 53585E54585F54595F54595F52575D4F545B4C51573D4045B7BCC9B7BCC914244C11214A11214B 12224B12224C0D18368189A0828AA0828AA0828AA0828AA0828AA0818AA081899F818A9F818AA0 818AA0818AA0818AA0818AA0818AA0828AA0828AA0828AA0828AA0828AA0828AA0828AA0828AA0 828AA0828AA0828AA0828BA0828BA0828BA0828BA1838BA1838BA1838CA2838CA2838CA2838CA2 838CA2838CA1838BA1828BA0828BA1838BA1838BA1838BA1838BA1838BA1838BA1838BA1838BA1 838BA1838CA1838CA1838CA2838CA2838CA2838CA2838CA2838CA2838CA2838CA2838CA2848CA3 848DA3848DA4848DA4858DA4858DA4858DA4858DA4848DA4848DA3838CA2848CA3848CA3848DA3 848CA3848CA3848DA3848DA3848DA3848DA3848DA3848DA3848DA3848DA3848DA3848DA3848DA3 848DA3848DA3848DA3848DA4848DA4858DA4858EA4858EA5858EA5868EA5868EA5868EA5868EA5 858EA5858EA4848DA3858DA4858DA4858DA4858DA4858DA4858DA4858DA4858DA4858EA4858EA4 858EA4858EA4858EA4858DA4858EA45F65751214172525254C4C4C5454542E2E2E0E0F104D525F 858EA4868FA5868FA5868FA5383C46000000000000798196848DA4858EA4858DA4515664020202 0000000B0C0E6F7688858EA4858EA4858DA4858DA4858DA4858DA4858DA4858DA4858DA4858DA4 858DA4858DA4858DA4858DA4858EA4858EA5858EA5868EA5868EA5868EA5868EA5858EA5858EA4 848DA4848DA3848DA3848DA3848DA3848DA3848DA3848DA3848DA3848DA3848DA3848DA3848DA3 848DA3848DA3848CA3848DA3848CA3848CA3848CA3848CA3848CA3848CA3848DA3848DA3848DA4 848DA4858DA4848DA4848DA4848DA4848DA3838CA3838BA1838CA2838CA2838CA2838CA2838CA2 838CA2838CA2838CA1838CA1838BA1838BA1838BA1838BA1838BA1838BA1838BA1838BA1838BA1 838BA1838BA1828BA1838BA1838CA1838CA2838CA2838CA2838CA2838CA2838CA1838BA1828BA1 828AA0828BA0828AA0828AA0828AA0828AA0828AA0828AA0828AA0828AA0828AA0828AA0828AA0 828AA0818AA0818AA0818AA0818AA0818AA0818A9F818A9F818A9F818AA0828AA0828AA0828AA0 828AA0828AA0828AA00D183512224C11214B10204A11214A11214AB7BCC9B7BCC93C3F444C5056 4F535A52575D54585F53585F53585E52575E52575E53575E52565D52565D51565C51565C51555B 51555B50555B51565D53585F555A61555A62575B621C242B1C242B1C242C0E1013030202060606 050505030202979593FEFCF8F6F3EFF6F4EFF1EEEAD3D2CFD1CFCC908E8A73716C72726D686966 5E605F565B592326280F10151314181314190F1016151719383D3CA3A6A79A9A9A000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000141414CFCFD18B8B8F7576794D4D4E0D0D1013141817171D 5B5A5C7373747B797A817F808684868A898B8B898B8D8A8ACDCAC7F9F6F1F5F2EEF5F2EEF5F3EF FFFDF99F9C99060606060606050606050303090A0A1B22291D252C1C242B565B62565B62555960 51565D676A6D87888A9A9B9B9D9D9E9D9D9D9E9E9E9F9FA09F9F9FA0A0A1A0A0A1A1A1A2A2A2A3 A2A2A3A3A3A4A0A0A09B9B9C949494777777BCC1CDBCC1CD24335B2130581D2C5516264F12224B 0D18367C869C7E879E7E879E7D869D7E879D7D869D80899F848DA3878FA5878FA5878FA5878FA5 878FA5878FA5878FA5878FA68890A68890A68890A68890A68890A68890A68890A68890A68890A6 8890A68890A68890A6868EA4818AA07E889E7F889F7F889F80889F80889F80889F7F889F7F889F 828AA1868FA58992A78A92A88A92A88A92A88A92A88A92A88A92A88A92A98A93A98A93A98A93A9 8A93A98A93A98A93A98A93A98B93A98B93A98B93A98B93A98B93A98890A6838CA38089A08189A0 818AA1818AA1818AA1818AA18189A18089A0838CA38991A78C94AA8C94AB8C94AA8C94AB8D95AB 8D95AB8D95AB8D95AB8D95AB8D95AB8D95AB8D95AB8D95AB8D95AB8D95AB8D95AB8D95AB8D95AB 8D95AB8D95AB8A92A9848DA4818AA1828AA1828BA2828BA2828BA2828BA2828BA2818AA1858EA4 8A93A98D96AC8E96AC8E96AC8E96AC8E97AC8E96AC8E97AC8E97AC8E97AC8E97AC8E97AC8E97AC 8E97AC8E97AC575C694A4B4BDEDEDEFFFFFFFFFFFFFFFFFFFFFFFFF1F1F16C6C6C353841818BA2 828CA3838CA3AAACB0FFFFFFFFFFFF878EA28A93A98E96AC5C6270656566FDFDFDFFFFFFF2F3F4 A0A7B98F98AC8E97AC8E97AC8E97AC8E97AC8E97AC8E97AC8E96AC8E96AC8E97AC8E96AC8E96AC 8D96AC8A93A9848DA4818AA1828AA1828BA2828BA3828BA2828BA2828AA1818AA1848DA48A92A9 8D95AB8D95AB8D95AB8D95AB8D95AB8D95AB8D95AB8D95AB8D95AB8D95AB8D95AB8D95AB8D95AB 8D95AB8C94AB8C94AA8C94AB8C94AA8C94AA8C94AA8991A7838CA38089A0818AA0818AA1818AA1 818AA1818AA18189A08089A0838CA28890A68A93A98B93A98B93A98A93A98B93A98A93A98A93A9 8A93A98A93A98A93A98A93A98A93A98A92A88A92A88A92A88A92A88A92A88A92A88992A88992A7 868FA5828AA17F889F7F889F80889F80889F80889F7F889F7F889F7E879E818AA0868EA48890A6 8890A68890A68890A68890A68890A68890A68890A68890A68890A68890A68890A6878FA5878FA5 878FA5878FA5878FA5878FA5878FA5868FA5848DA380899F7D869D7E879D7E879E7E879E7D869D 7E879D0C173512214B16264F1D2C55213058213059BCC1CDBCC1CD7474759292929A9A9B9F9FA0 A1A1A2A0A0A1A0A0A19F9FA09E9E9E9E9E9F9D9D9D9D9D9D9C9C9D9C9C9C9B9B9C98999A858688 66696D52575D54585F555A60575B621C242B1C242B1C242C0E1013030202060606050505030202 979693FEFDF8F6F3EFF6F3EFF2EFEBD3D2CFD2CFCC918F8C73716F70706E6768675E605F575B5A 25272A0F101614151A13151B1010161416163A3E40A6A8AD9E9E9E000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000141414CCCDCF8685887677784B4B4E0B0D1012141917181D5B5A5C737173 7A787A817F808785868A898A8B898B8D898ACDC9C6F8F5F1F5F2EEF5F2EEF5F2EEFFFCF89F9C99 060606060606050606050303090A0A1B22291D252C1C242B565B62555A6152575E64676C949596 9A9A9B9B9B9C9C9C9D9C9C9D9D9D9E9D9D9E9E9E9F9E9E9F9F9FA0A0A0A1A0A0A1A1A1A2A2A2A3 9F9FA09A9A9B939394757576BCC1CDBCC1CD24335A2130592231592130581727500C18367A839A 7B849C7B849C7B849C7B839B7D869D838CA2848CA3848CA3848CA3848CA3848CA3858DA3858DA3 858DA3858DA3858DA3858DA4858DA4858EA4858EA4858EA4858EA4858EA4868EA4868EA4868EA4 868EA5868EA4858EA480889F7C859D7C859D7D869D7D869D7D869D7C859D7F889F868FA5878FA6 878FA6878FA6878FA68790A68790A68790A68790A68790A68790A78890A78890A78890A78890A7 8890A78890A78890A78991A78991A78991A78991A78991A78890A7818AA17D879E7E879F7E879F 7E879F7E879F7D879E818AA18991A88A92A88A92A88A92A88A92A88A92A88A92A88A92A98A92A9 8A93A98A93A98A93A98A93A98A93A98A93A98A93A98A93A98A93A98B93A98B93A98B93A98B93A9 8B93A98A93A9828BA27E889F7F89A08089A08089A17F89A07E889F828BA28B93A98B94AA8B94AA 8B94AA8B94AA8B94AA8B94AA8B94AA8B94AA8B94AB8B94AB8B94AB8B94AB8C94AB8B94AB7A8195 69696AFAFAFAFEFEFEFFFFFFFBFCFDF9FAFBFFFFFFFFFFFFFDFDFD9797985E65758089A18089A1 AAACB0FFFFFFFFFFFF8B92A58C94AB63697A585859F8F8F8FFFFFFF2F3F4A1A8BA8C94AB8B94AB 8B94AB8B94AB8B94AB8B94AB8B94AA8B94AA8B94AA8B94AA8B94AA8B94AA8B94AA8B94AA8B94AA 8B93A9838BA37F889F7F89A08089A08089A07F89A07E889F828BA28A93A98B93A98B93A98B93A9 8B93A98A93A98A93A98A93A98A93A98A93A98A93A98A93A98A93A98A93A98A92A98A92A98A92A8 8A92A88A92A88A92A88A92A88A92A88991A88991A8818AA17E879E7E879F7E879F7E879F7E879E 7D869E8089A08890A78991A78991A78991A78991A78890A78890A78890A78890A78890A78890A7 8890A78790A78790A68790A68790A68790A68790A68790A6878FA6878FA6878FA6878FA6868FA5 80899F7C859D7C869D7D869D7D869D7C869D7C859C7E879E858EA4868EA4868EA4868EA4858EA4 858EA4858EA4858EA4858EA4858EA4858DA4858DA4858DA3858DA3858DA3858DA3858DA3848CA3 848CA3848CA3848CA3848CA3848CA3838CA27E869D7B849B7B849B7B849C7B849C7B849B0C1734 16264E213058213058213058213058BCC1CDBCC1CD74747593939399999A9F9FA0A1A1A2A0A0A1 A0A0A19F9FA09F9FA09E9E9F9D9D9E9D9D9E9D9D9D9C9C9D9C9C9C9B9B9B9A9A9B9696976A6C70 545960545960565B621C242B1C242B1C242C0E1013030202060606050505020303989794FEFCF8 F5F2EEF6F3EFF1EEEAD2D0CDD1CECB918F8A72716D717170696A685D605E545856232529101217 13161B11141A0E0F16141618373E3E9EA1A597979A000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000141212C8C8C986878978787B4C4D4E0C0D10131418181A1F5B5B5D7271727B7879817F80 8785878B888B8B888B8E8A8ACECBC8F8F6F1F6F3EFF4F1EDF5F2EDFFFCF89E9C99060606060606 050606050303090A0A1B22291D252C1C242B565B6254596052565D8486889A9A9A9A9A9A9B9B9B 9B9B9C9B9B9C9C9C9D9C9C9D9D9D9E9E9E9F9E9E9F9F9FA09F9FA0A0A0A1A0A0A19E9E9F99999A 929293747475BCC1CDBCC1CD24335A2130582130582130591E2D550D1835778098788199788199 7881997881997F879F818AA1818AA1818AA1818AA1818AA1818AA1828BA1828BA1828BA1828BA1 828BA1828BA1828BA1838BA2838BA2838BA2838BA2838BA2838BA2838BA3838BA3838CA3838CA3 838CA38189A079839A79839B7A839B7A839B79839B79839B8189A1848DA4848DA4848DA4848DA4 848DA4848DA4858DA4858DA4858DA4858DA4858DA4858DA4858DA5858EA5858EA5858EA5858EA5 858EA5858EA5868FA5868FA5868FA5868FA5868FA5838CA37B849C7B849C7B859D7B859D7B859D 7B849C838CA3878FA6878FA6878FA78790A78790A78790A78790A78790A78790A78790A78790A7 8790A78890A78890A78890A78890A78890A78890A78890A78890A88890A88891A88891A88891A8 858EA57C859D7C869D7D869E7D869E7C869E7C859D858EA58891A88991A88991A88991A88991A8 8991A88991A88991A88991A88991A88991A88991A88991A88991A88991A84B4E56F1F1F1FFFFFF F3F4F5AFB5C58B94AB8A92A9A2A9BBE9EAEEFFFFFFFFFFFF58595C7D869E7D879FA9ABAFFFFFFF FFFFFF8991A5666D7E4F5051FBFBFBFFFFFFF2F3F59EA5B78A92A98991A88991A88991A88991A8 8991A88991A88991A88991A88991A88991A88991A88991A88991A88991A88891A88891A8858EA5 7C859D7C869E7D869E7D869E7C869E7C859D858DA58891A88891A88890A88890A88890A78890A7 8890A78890A78890A78890A78890A78790A78790A78790A78790A78790A78790A78790A78790A7 878FA7878FA7878FA6878FA6878FA6848CA47B849C7B849C7B859D7B859D7B849C7B849C838CA3 868FA5868FA5868FA5858EA5858EA5858EA5858EA5858EA5858EA5858EA5858DA5858DA4858DA4 858DA4858DA4858DA4848DA4848DA4848DA4848DA4848DA4848DA4848CA4848CA4818AA179839B 79839B7A839B7A839B79839B79829A8089A0838CA3838CA3838CA3838BA3838BA2838BA2838BA2 838BA2838BA2838BA2828BA1828BA1828BA1828BA1828BA1828BA1828BA1818AA1818AA1818AA1 818AA1818AA1818AA18189A17F889F7881997881997881997881997881990C17341D2C55213059 213058213058213058BCC1CDBCC1CD7373739292939898999E9E9FA0A0A19F9FA09F9FA09E9E9F 9D9D9E9D9D9E9C9C9D9C9C9D9B9B9C9B9B9C9B9B9B9B9B9B9A9A9A9A9A9A87898A53575E54595F 555A611C242B1C242B1C242C0E1013030202060606050505030303999795FEFDF8F5F3EEF6F3EF F1EEEAD1CECCD0CECA91908B73706D7471706A69685C5F5E5256542123270F101712141A12151A 0F1016131618373D3CA7A9AB97979A000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000141414 CCCCCE86878B78787B4E4E500C0D0F12141819191D5B5A5B7271727B797A817F808785868A888A 8B888B8E8B8BCDCAC7F8F5F1F5F2EEF4F1EEF5F3EFFFFCF89D9A97060606060606050606050303 090A0A1B22291D252C1C242B555A6151565D474B52939394999A9A999A9A9A9A9B9B9B9C9B9B9B 9C9C9C9C9C9C9D9D9D9E9E9E9E9E9E9F9F9F9F9F9FA0A0A0A1A1A19E9E9F999999939393747475 BCC1CDBCC1CD24335A2130582130582130582130580C1734737C94757E97757E97747D96737C94 7D869E7D879E7E879E7E879E7E879E7E879E7E879E7E879F7E879F7F879F7F879F7F879F7F879F 7F879F7F879F7F889F7F889F7F889F7F889F7F889F7F889F7F889F8089A08089A08089A07F889F 747D96757F97768098768098767F98747D968089A08089A1808AA1818AA1818AA1818AA1818AA1 818AA1818AA2828AA2828AA2828AA2828AA2828AA2828AA2828BA2828BA2828BA2828BA2828BA2 828BA3828BA3838BA3838BA3838BA3828BA2767F9777809978829A78829A77809A757F97838BA3 838CA4838CA4838CA4838CA4838CA4848DA4848DA4848DA4848DA4848DA4848DA4848DA4848DA5 848DA5848DA5848DA5848DA5848DA5848DA5848DA5848DA5848DA5858EA5848DA5848DA5768099 78829A79839B79839B78829B768098848DA5858EA6858EA6858EA6858EA6868EA6868EA6868EA6 868EA6868EA6868EA6868EA6868EA6868EA6868EA6868EA6A9A9ABFEFEFEFFFFFFABB1C1878FA7 868EA6868EA6868EA6959DB1FAFAFAFFFFFFD3D3D378829979839CA9ABAFFFFFFFFFFFFF6C7281 454546F4F4F4FFFFFFF1F2F49AA2B5878FA6868EA6868EA6868EA6868EA6868EA6868EA6868EA6 868EA6868EA6868EA6868EA6858EA6858EA6858EA6858EA6858EA6858EA5848DA576809978829A 79839B79839B78829B768098848DA5848EA5848EA5848DA5848DA5848DA5848DA5848DA5848DA5 848DA5848DA5848DA4848DA4848DA4848DA4848DA4848DA4848DA4848DA4838CA4838CA4838CA4 838CA4838CA4838CA4838BA3767F9877809978829A78829A778099757F97828BA2838BA3838BA3 828BA3828BA3828BA2828BA2828BA2828BA2828BA2828AA2828AA2828AA2828AA2828AA2828AA2 818AA2818AA2818AA1818AA1818AA1818AA18089A1818AA18089A18089A1747E96757F97768098 768098757F97747D957F889F8089A08089A07F889F7F889F7F889F7F889F7F889F7F889F7F889F 7F879F7F879F7F879F7F879F7F879F7F879F7E879F7E879E7E879E7E879E7E879E7E879E7E879E 7E879E7D869E7D869E737C95747D95757E97757E96747D950A1633202F58213058213058213058 213058BCC1CDBCC1CD7373739292929898989D9D9DA0A0A09F9F9F9F9F9F9E9E9E9D9D9E9D9D9D 9C9C9D9C9C9D9B9B9B9A9B9B9A9A9B99999A9A9A9A989899959596494E544F555B555A611C242B 1C242B1C242C0E1013030202060606050506030303999794FEFDF8F6F3EFF6F4EFF1EEEAD0CECC D0CECB908E8C74716E757472696A685C5E5F5355552123270F101713151B13151A101015151618 393E3DA0A3A4939593000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000141414C9C9CE898A8D 79797C4E4E500D0D10121419181A1E5A5B5B7271727B78798280818785878A888B8B8A8B908B8C CDCAC7F8F5F1F5F2EDF4F0EDF5F2EFFFFDF89E9B98060606060606050606050303090A0A1B2229 1D252C1C242B555A6151565C474B5197979898999A98999A9A9A9B999A9B9B9B9B9C9C9C9C9C9C 9D9D9D9D9D9D9E9E9E9E9E9E9F9F9FA0A0A0A0A0A09D9E9E999999919292747474BCC1CDBCC1CD 24335A2130582130582130582130590C1734707A92727B94727B95717B94707A927B849C7B849C 7B849C7B849C7B849C7B849C7B849C7B849C7B849D7C859D7C859D7C859D7C859D7C859D7C859D 7C859D7D869D7D869D7D869D7D869D7D869D7D869D7D869E7D869E7D869E7D869E717B94727C95 737D96737D96737D95717B947E879F7E879F7E879F7E879F7E879F7E879F7E879F7E879F7E87A0 7F88A07F88A07F88A07F88A07F88A07F88A07F88A08089A07F89A08089A08089A08089A08089A0 8089A08089A18089A18089A1737D95747E97757F98757F98747E97727C95818AA2818AA2818AA2 818AA2818AA2818AA2818AA2818AA2818AA2818AA2818AA2818AA2818AA2818AA2818AA3818AA3 828BA3818BA3828BA3828BA3828BA3828BA3828BA3828BA3828BA3828BA3747D97757F98768099 768099758098747D96838CA3838CA3838CA3838CA3838CA4838CA4838CA4838CA4838CA4838CA4 838CA4838CA4838CA4838CA4838CA4828BA3CECECFFEFEFFE0E0E2858EA5838CA4838CA4838CA4 838CA4838CA4C0C2C7FFFFFFFBFBFB69718677819AA7AAAFFFFFFFFFFFFF515152F1F1F1FFFFFF EDEEEF99A0B3848DA4838CA4838CA4838CA4838CA4838CA4838CA4838CA4838CA4838CA4838CA4 838CA4838CA4838CA3838CA4838CA3838CA3838CA3838CA3838CA3747E97757F98768099768099 757F98737D96828BA3828BA3828BA3828BA3828BA3828BA3828BA3828BA3828BA3828BA3818AA3 818AA2818AA2818AA2818AA2818AA2818AA2818AA2818AA2818AA2818AA2818AA2818AA2818AA2 818AA2818AA2737D96747E97757F98757F98747E97727C958089A18089A18089A18089A18089A0 8089A08089A08089A08089A07F88A07F88A07F88A07F88A07F88A07F88A07E88A07E87A07E879F 7E879F7E879F7E879F7E879F7E879F7E879F7E879F7E879F717B94727C95747D96737D96727D95 717B937D869E7D869E7D869E7D869D7D869D7D869D7D869D7D869D7D869D7C859D7C859D7C859D 7C859D7C859D7C859D7B859D7B849D7B849C7B849C7B849C7B849C7B849C7B849C7B849C7B849C 7B849C707A93717B93727B94727B94717B930A1533213058213058213058213058213058BCC1CD BCC1CD7373739292929898989D9D9DA0A0A09F9F9F9F9F9F9E9E9E9C9D9D9D9D9D9B9C9C9B9C9C 9A9A9B9A9B9B99999A99999A99999A979798989899494E544F545B555A601C242B1C242B1C242C 0E10130302020606060505050303059A9896FEFCF7F5F3EEF6F4EFF1EFEAD0CECCCFCCCA908D8B 7571707674726969675C5F5E5356542123270F101813151B12141A0F0F141517183A3F3FA1A4A6 979898000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000141414C9C9CC88888A7B7C804C4D4E 0C0D10121418191C1F5C5C5C7271727B79798181828786878A898B8B8A8C8F8C8CCCC9C6F8F5F2 F4F1EEF4F1EEF5F2EFFFFCF99D9A97060606060606050606050303090A0A1B22291D252C1C242B 555A6150555C474B5196979898989A98989A99999A99999B9A9A9B9A9A9B9B9B9C9B9B9C9C9C9D 9D9D9E9D9D9E9E9E9F9F9FA09F9FA09D9D9E979798919192747474BCC1CDBCC1CD24335A213058 2130582130582130580C17346E7891717B93717B936F79936E789179829A79829B79829B7A839B 7A839B7A839B7A839B7A839B7A839B7A839B7A839C7A839C7A839C7A839C7A839C7A839C7A839C 7B849C7B849C7B849C7B849C7B849C7B849C7B859D7C859D7C859D6F7993717A94717C94717C95 717B946F79937C859D7C859D7C859E7C859D7C859E7D869E7D869E7D869E7D869E7D869E7D869F 7D869F7D869F7D869F7D869F7D869F7D869F7D869F7E879F7E879F7E879F7E879F7E879F7E87A0 7E87A07F88A0717B94727C96737D97737D97727C96717A947F88A07F88A07F88A07F88A07F88A0 7F88A07F88A07F88A07F88A17F88A18089A18089A18089A18089A18089A18089A28089A28089A2 8089A28089A28089A28089A28089A28089A28089A28089A2727C95737D97747F98747F98747D97 727C95818AA2818AA2818AA2818AA2818AA2818AA2818AA2818AA2818AA2818AA2818AA3818AA3 818AA3818AA3828BA3788097F4F4F4FFFFFFC0C1C5838CA4828BA3828BA3828BA3828BA3828BA3 A6A8AFFFFFFFFFFFFF727888757F99A7AAAFFFFFFFFFFFFFF2F2F2FFFFFFFFFFFF8080816B7387 828BA3828BA3818BA3828BA3828BA3828BA3828BA3818AA3818AA3818AA3818AA2818AA3818AA3 818AA2818AA2818AA2818AA2818AA2818AA2818AA2727C96737D97747F98747F98747D97717C94 8089A28089A28089A28089A28089A28089A28089A28089A28089A28089A18089A18089A18089A1 8089A18089A18089A17F88A17F88A17F88A17F88A07F88A07F88A07F88A07F88A07F88A07F88A0 717B94727C96737D97737D96727C96717A937F88A07E87A07E87A07E879F7E879F7E879F7D879F 7D869F7D869F7D869F7D869F7D869F7D869F7D869F7D869F7D869F7D869E7D869E7D869E7D869E 7C859E7C859E7C859D7C859D7C859D7C859D6F7993717A94717C94717B94717A946F78927C859D 7B849D7B849D7B849C7B849C7B849C7A849C7A839C7A839C7A839C7A839C7A839C7A839C7A839C 7A839C7A839C7A839B7A839B7A839B7A839B7A839B7A839B79829B79829B79829A79829A6E7891 6F7992717B94707A93707A930A1533213058213058213058203058213058BCC1CDBCC1CD727273 8F90919797989C9C9D9F9FA09E9E9F9D9D9E9D9D9E9C9C9D9C9C9D9B9B9C9A9A9B9A9A9B99999B 99999A989899979899979798979899494E544F545B5459601C242B1C242B1C242C0E1013030202 0606060505050303059A9896FEFCF8F6F4EFF6F3EFF1EFEAD0CDCBCECCC8928F8D757271757371 6A69685D5F5F5156542122260F101713141A1214190E101515161A343A3BA1A6A9989A9A000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000141414CAC9CD85848A7B7B7D4D4E500C0D10111317 1A1B1E5C5C5C7371727C797B8181828785878A888A8B898B8E8B8BCDCAC7F8F6F1F4F1EDF5F2ED F5F3EEFFFCF89E9A98060606060606050606050303090A0A1B22291D252C1C242B545A6050555C 474A5096969797979898989999999A99999A9A9A9B9A9A9B9B9B9B9B9B9C9B9B9C9C9C9D9D9D9E 9D9D9E9E9E9F9F9FA09C9C9D979798909091737374BCC1CDBCC1CD23325A213058213058213058 2130580C17346C768F6E78916E78916E77916C768F77819977819977819977819A78819A78819A 78819A78819A78819A78819A78819A79829A79829A79829A79829A79829A79829B79829A79829B 79829B79829B79829B79829B79829B79829C7A839C6E77916F79926F7A936F7A946F79926E7790 7A849C7A849C7A849C7A849C7A849D7B849D7B849D7B849D7B849D7B849D7B849D7B849D7B849D 7C859D7C859D7C859D7C859D7C859D7C859E7C859E7C859E7C859E7C859E7C859E7C859F7C859F 6F7992707A94717C95717C95717A946F79927D869F7D869F7D879F7D879F7D879F7D879F7D879F 7D879F7D87A07D879F7E87A07E87A07E87A07E87A07E87A07E87A07E87A07E87A07E87A07E87A0 7E87A07F88A07F88A07F88A07F88A07F88A0707A94717C95727D97727D97727C95707A947F89A1 7F89A17F89A17F89A17F89A17F89A17F89A17F89A17F89A17F89A17F89A17F89A27F89A17F89A2 7F89A28891A8FFFFFFFFFFFFABACB0808AA27F89A28089A28089A28089A28089A2909299FFFFFF FFFFFF8E94A5747E97A7AAAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F7F740414579839B7F89A2 7F89A27F89A27F89A17F89A27F89A17F89A27F89A27F89A17F89A17F89A17F89A17F89A17F89A1 7F89A17F89A17F89A17F88A17F88A1707A94717C95727D97727D97717C956F7A937F88A07F88A0 7F88A07F88A07E87A07E88A07E87A07E87A07E87A07E87A07E87A07E87A07E87A07E87A07E87A0 7D879F7D879F7D879F7D879F7D879F7D879F7D879F7D879F7D869F7D869F7D869F6F7992707A94 717C95717B95707A946F79927C859F7C859E7C859E7C859E7C859E7C859E7C859E7C859D7C859D 7C859D7C859D7C859D7B849D7B849D7B849D7B849D7B849D7B849D7B849D7B849D7A849C7A849C 7A849C7A849C7A849C7A849C6E78916F79926F7A936F7A936F79926E779079839C79829C79829B 79829B79829B79829B79829B79829B79829A79829A79829A79829A79829A79829A78819A78819A 78819A78819A78819A78819A78819A77819A7781997781997781997781996C768F6E77906E7891 6E78916E77900A1533213058213058213058213058202F58BCC1CDBCC1CD7171728F9091969697 9B9B9C9F9FA09D9D9E9D9D9E9D9D9E9B9B9C9B9B9C9B9B9B9A9A9A9A9A9B99999999999A989899 979797979798979797494E544F555B5459601C242B1C242B1C242C0E1013030202060606050505 030303999895FEFDF9F5F3EFF6F3EFF2F0EBD0CECBCECBC892908D7471707372706A6B675D605F 5257552023260F10161314191315190F101415171B363D3D9FA3A698989A000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000141414C7C5CC83818979797B4D4D4E0D0F1012131817191E5A5A5B 7371737C797B8381828785878A888A8C898B8E8B8BCDCAC7F9F7F2F5F3EEF4F1EDF5F2EEFEFDF8 9A9894060605060606050606050303090A0A1B22291D252C1C242B54596050555B464A50959596 97989897989897979898999999999A99999A9A9A9B9B9B9B9B9B9B9C9C9C9C9C9D9C9C9C9D9D9E 9E9E9F9C9C9D969697909091737374BCC1CDBCC1CD23325A2030582030582130582130580C1734 47537349557549557548557447537355607F55607F55607F55607F55607F556080556180556180 556180556180556180556281566281566281566281566281566281566281566281566281576381 5763815763815763815763815763824855744A56774B58774B58774A5777485574586383596483 5964835964835964835964845964845965845965845965845965845965845965845A66845A6684 5A66845A66845A66845A66855A66855A66855A66855B66855B66855B66855B66854B57774B5879 4D5A7A4D597A4C59794A56775C67865C67875C67875C67875C68875C68875C68875C68875C6887 5C68875C68875C69875C68875D69875D69875D69875D69875D69875D69875D69875D69885D6988 5D69885D69885E69885E69884C59794D5A7A4F5B7C4F5C7C4D5A7A4B58775E69885E69895E6A89 5E69895E6A895F6A895F6A895F6A895F6A895F6A895F6A895F6A895F6A895F6A895F6A895F6A89 F1F1F2FFFFFFB7B8B95F6A895F6A8A5F6A8A5F6A8A5F6A8A5F6A8A929499FFFFFFFFFFFF69738F 505D7DA0A2A9FFFFFFFFFFFFF5F6F7C3C7D3FEFEFFFFFFFFD5D5D53136425E69885F6A895F6A89 5F6A895F6A895F6A895F6A895F6A895F6A895F6A895F6A895F6A895F6A895E69895E6A895E6A89 5E69895E69895E69894C59784E5B7A505C7C505C7C4E5B7A4C58775F69885E69885E69885E6987 5E69885E69875E69875E69875E69875E69875E69875E69875E69875D69875D69875D68875D6887 5D68875D68875D68875D68875D68875D68875D67875D67865D67864B58774C5A794E5B7A4E5A7A 4C5A794A57765B66855C66855C66855C66855B66855B66845B66845B66845B66845B66845B6684 5B66845A65845A65845A65845A65845A65845A65845A65845A65835A65835A65835A65835A6583 5A65835965834956754B57774C59774C58774B5777495574586481586381586381586381586381 586381576381576381576381576381576381576381566281566381566280566280566280566280 56628056628056617F56617F56617F56617F56617F56617F4854734956744A5675495675495674 0A1532213058213058203058202F57202F58BCC1CDBCC1CD7171718F8F8F9595959B9B9B9D9D9E 9C9C9C9C9C9D9C9C9D9B9B9C9A9B9B9A9A9B99999A999A9A989899979898979898979898969797 959696494E534F545A5459601C242B1C242B1C242C0E10130302020606060505050303039A9996 FEFDF9F5F4F0F6F3EFF3F0EBD1CDCBCDCBC892918D74726F7271706A6A675D615F515654212327 10101714151B1214190F0F1412151738403DA8ABAD9A989A000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000141414C7C6CA818186797A7C4C4D4E0D0F1211121618191D5B5B5C7371737B7A7B 8281838886878B898A8C8A8C8E8C8CCDC9C8FAF6F3F5F2EFF4F1EEF5F2EEFEFBF79B9995060606 060606050606050303090A0A1B22291D252C1C242B54585F50555B474A50949496969697979798 96979898989997989998999A9A9A9B999A9B9B9B9B9B9B9B9B9C9C9C9C9C9C9D9D9D9E9E9A9A9B 9596968E8E8F727272BCC1CDBCC1CD233259202F58202F582130582130580C1734475373495575 495575495675485373566180566180566180566180566180566180566280566280566280566280 566280566281566281566381576381576381576381576381576381576381576382586382586382 5863825863825863824956754B57764C59784C58784B5877495675596483596583596583596583 5965835965835965845A66845966845A66845A66845A66845A66845A66845A66855B66855B6685 5B66855B66855B66855B66865B66865B67865B66865C67865C67864C58774C59794E5A7A4E5B7A 4D597A4B57775C68875C68875C68875C68875C68875C69875D69875D69875D69875D69875D6987 5D69875D69885D69885D69885E69885E69885E69885E69885E69885E69885E69885E69895E6989 5E69895E69894D5A7A4E5B7A4F5C7D4F5C7C4F5B7B4C59785F6A895F6A895F6A895F6A895F6A8A 5F6A8A5F6B8A5F6B8A5F6B8A5F6B8A5F6B8A5F6B8A5F6B8A5F6B8A5F6B8A5F6B8AD1D2D5FFFFFF E2E2E241495B5F6B895F6B8A5F6B8A5F6B8A4F5872B5B5B5FFFFFFF8F8F8556180505C7DA0A2A9 FFFFFFFFFFFF868EA3616D8BD5D8DFFFFFFFFFFFFF989898434A5F5F6B8A5F6B8A5F6B8A5F6B8A 5F6B8A5F6B8A5F6B8A5F6A8A5F6B8A5F6A8A5F6A8A5F6A8A5F6A8A5F6A8A5F6A895F6A895F6A89 5F6A894D5A7A4E5B7A4F5C7D4F5C7C4E5B7B4C58785E69895E69895E69885E69885E69885E6988 5E69885E69885E69885E69885E69885D69885D69885D69875D69875D69875D69875D69875C6887 5C69875C68875C68875C68875C68875C68875C68874C58774C597A4E5A7A4E5A7A4C597A4A5676 5B66865C67865C67865B66865B66865B66855B66855B66855B66855B66855B66855A66845A6684 5A66845A66845A66845A6684596584596584596583596583596583596583596483596483596483 4956764B57774C58784C58784B5777495575586382586382586382586382586382576381576381 576381576381576381576381566381566281566280566280566280566280566280566180566180 5661805661805661805661805661805661804854734956754A56764955754854740A1532213058 202F58202F58202F57202F57BCC1CDBBC1CD7171718E8F8F9595959B9B9B9C9D9D9C9C9C9B9C9C 9A9B9B9A9A9B999A9B98989A98989A979899979799969798969798959597959697959596494D53 4E53595459601C242B1C242B1C242C0E10130302020606060606060305039A9996FEFDF8F6F4EF F6F3EFF3F0ECD1CFCCCCCAC792908D74736F727270686A675E605D5558562325290F101613151A 1214190D0D14141618363C3AA2A5A6979798000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 141414CACACB8282857A7B7C4B4C4D0C0D1010101517181C5C5B5D7371737B7B7C838183888687 8B888B8C898C8E8B8BCAC6C3F8F5F0F6F3EFF6F3EFF6F3EFFEFCF8999693060505060606050606 050303090A0A1B22291D252C1C242B54585F50555B464A50949496959596969697969697979798 97979898989998989999999A9A9A9B9A9A9B9A9B9B9B9B9C9C9D9D9D9E9E9A9A9B9596968E8E8F 727272BCC1CDBCC1CD233259202F58202F582130582130580C17344855754A57764B57764A5676 495474566280566280566280566280566280566280566280566281576381576381576381576381 576381576382576382586382586382586382586382586382586383586483596483596483596483 5964834A56764C58774C59794C59794C58784A56765965845965845965845A66845A66845A6684 5A66845A66845A66855B66855B66855B66855B66855B66855B67865B66865C67865C67865C6786 5C67865C67865C67865C67865C67865C68865C68864C58784D59794F5B7B4F5B7B4E5A7A4C5878 5C68875D69875D69875D69875D69875D69885D69885E69885E69885E69885E69885E69885E6988 5E69895E6A895E69895F6A895F6A895F6A895F6A895F6A895F6A895F6A895F6A895F6A895F6A89 4D5A7A4F5B7B505C7C505C7C4F5C7C4C59795F6A89606B89606B89606B89606B89606B89606B89 606B89606B89606B8A606B8A606C8A606C8A606C8A606C8A606C8AB8BDC9FEFEFEFFFFFF606061 3A41545964805C6785454D62353639FAFAFAFFFFFFD5D7DD525F7F505D7DA0A3A9FFFFFFFFFFFF 67718A606C8A76809AF4F4F6FFFFFFFDFDFD56565955607B606C8A606C8A606C8A606C8A606C8A 606C8A606B8A606C8A606B8A606B8A606B89606B89606B89606B89606B89606B89606B894D5A7A 4F5C7B505C7C505C7C4F5C7C4C59795F6A895F6A895F6A895F6A895F6A895F6A895F6A895F6A89 5F6A895E69895E69895E69895E69885E69885E69885E69885E69885E69885E69885D69885D6988 5D69875D69875D69875D69875D69874C58784D59794F5B7B4F5B7B4D5A7A4B57775C67865C6786 5C67865C67865C67865C67865C67865C67865C67865B66865B66865B66855B66855B66855B6685 5B66855A66855A66855A66845A66845A66845A66845A66845965845965845965834A56764C5878 4C59794C59794C5878495676596483596483596483596483586383586382586382586382586382 586382576382576382576381576381576381576381576381566281566281566281566280566280 5662805662805662805662804955744956764B57764A57764956760A1532213058202F57202F57 202F57202F57BCC1CDBBC0CD7070718E8E8F95959599999A9C9D9D9B9B9C9B9C9C9B9C9C9A9A9B 999A9B99999B98989A98999A979799969798969798959597959697959596484D524E535953585F 1C242B1C242B1C242C0E10130302020606060606060305039A9895FEFCF8F6F3EFF6F4EFF4F1ED D1CECBCBC8C5928F8C73716E73726E686B675E615D575A5725272A0F101513151A1314190E0F15 131619363D3AA3A5A798989A000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000141414C8C7CA 83828679797A4C4C4D0D0D1212131718181C5B5B5D7371737C7B7C8280828886878C888A8C898B 8E8B8ACAC7C4F8F5F1F5F2EFF5F2EFF6F3EFFEFCF8999694060505060606050606050303090A0A 1B22291D252C1C242B54585F4F545A454A50939494959596969697969697979798979798989899 98989899999A99999999999A8788897373737F808097989899999B9595968D8D8F717172BBC0CD BBC0CD233259202F57202F57202F582030580C17344855754B57764A57764A5676495474566280 566280566280566280566280566280566280566280566381566281576381576381576381576381 5763825763825763825863825863825863825863835863835863835964835964835964834A5676 4C58774C59794C59794C58784A56765965835965835965845966845A66845A66845A66845A6684 5A66855A66845A66855B66855B66855B66855B66855B66865B67865B66865C67865C67865C6786 5C67865C67865C67865C67865C68864D59784D59794F5B7B4E5B7B4D5A7A4C58785C69875D6987 5D69875D69875D69875D69875D69885D69875D69885D69885E69885E69885E69885E69885E6989 5E69895E69895E69895E69895F6A895F6A895F6A895F6A895F6A895F6A895F6A894E5A7A4F5B7B 505C7C505C7C4F5C7C4C5979606B89606B89606B89606B89606B89606B89606B89606B89606B89 606B89606B89606B8A606B89606B8A606C8A606B8A6D7894EEEFF1FFFFFFF7F7F7696969111111 09090A4A4A4AE6E6E6FFFFFFFDFDFD77819A515E7E505D7DA1A3AAFFFFFFFFFFFF67718A606C8A 606C8A9BA3B6FEFEFEFFFFFFEEEEEE33363D5E6A89606B89606B8A606B89606B8A606B8A606B89 606B89606B89606B89606B89606B89606B89606B89606B89606B895F6B894E5A7A4F5B7B505C7C 505C7C4F5C7C4C59795F6A895F6A895F6A895F6A895F6A895F6A895E6A895E69895E69895E6988 5E69885E69885E69885E69885E69885E69885D69885D69885D69885D69875D69875D69875D6987 5C69875C68875C69874C58784D59794F5B7B4E5B7B4D5A7A4B57775C67865C67865C67865C6786 5C67865C67865C67865C67865B67865B66855B66855B66855B66855B66855A66855A66855A6685 5A66845A66845A66845A66845965845965845965845965835965834A56764C58774C59794C5979 4C5878495676596483596483586383586383586382586382586382586382586382576382576381 535F7E505B7A525D7C566180566281566381566281566280566280566280566280566280566280 5661805661804955744956764A57764A57764956760A1532203058202F57202F57202F57202F57 BBC0CDBBC0CD7070718D8E8F9494959898999B9B9C9B9B9B9A9A9B9A9A9B99999A99999A989899 989899979798979798969697969697959596959596949595484D524E535952575F1C242B1C242B 1C242C0E1013030202060606060606050503999895FEFCF8F6F3EFF7F4F0F4F1EDD0CDCACAC8C4 92908E747271737270686A675F626057595825272A0E101613141A1314190D0F13131617373C3B A2A4A6969696000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000141414C4C4C781828577787A 4B4B4D0D0D1212131718191C5B5C5D7372747C7A7C8280828886878A88898B898A8E8B8ACCC8C4 F9F6F2F5F2EFF6F3EFF6F3EFFFFCF89D9B97060606060606050606050303090A0A1B22291D252C 1C242B53585F4F545A464A509293949595969696979596969797989697979798989898988A8B8B 3939390707070000000000000000000101011F1F1F6F6F6F8D8D8E707071BBC0CDBBC0CD233259 202F57202F57202F58202F580C17344956754B57774C58774A5776495575576281576381576381 4B5775414D6B414D6B434E6C5763815763825763825863824D5977414D6B414D6B414D6B535F7E 586382586482596482586382434E6D414D6C414D6C515D7C5A65835A65834B57764C59784D5A79 4D5A794D59794B57765A66845A66845A66855A66855A66855B66855B668555607F434E6D424D6C 424D6C424D6C424D6C424D6C424D6C424D6C424D6C424D6C424D6C525D7C5D68865D68865D6886 5D68865D68875D69874E5A794E5A7A4F5C7C505C7C4E5B7B4D59795D69875D69885E69885D6988 5E69885E6988576381434E6D424D6C424D6C434E6C434E6C434E6C434E6C434E6C4853724D5977 5A65835F6A895F6A895F6B89606B89606B89606B89606B89606B894E5B7A505C7C515D7D505D7D 505D7C4D5A79606B8A606C8A606C8A606C8A606C8A606C8A4D5977434E6C434E6C434E6C434E6C 434E6C434E6C434E6C434E6C434E6C434E6C858CA0FDFDFEFFFFFFFFFFFFFFFFFFFCFCFCFFFFFF FFFFFFFFFFFFB0B6C4525F7D515E7E515E7EA1A3AAFFFFFFFFFFFF68728B606C8B606C8B606C8B C9CCD6FEFEFFFFFFFFC1C1C1222838525D7B606C8A606C8A606C8A606C8A606C8A525D7C434E6D 434E6C434E6C596483606C8A606C8A606B8A606B8A606B8A4F5B7B505C7C515D7D505D7D505D7C 4D5A79606B89606B89606B895F6B89606B895F6B8956617F444F6D434E6C434E6C5E69885F6A89 5F6A895E6A895E6A895E6989444F6D424D6C424D6C535E7C5E69885E69885E69885D69885D6988 5D69874D59794E5A7A4F5C7C505C7C4E5A7B4C58785C68865D68865D68865D68865D68865D6886 5C68865C67865C67865C67855C67854D5876424D6C424D6C4A55735A66855B66855B66855B6685 5B66855A66855A66855A66855A66845A66845A66844B57764D59784D5A794D5A794D59794A5776 59658359658359658359648259648259648259648259648254607E44506E3E49673E49673E4967 3E49673E4967414C6A4E5A79576381576381576381576381576381576381576281576281576280 4A56754A57764B57774B58774A57760A1532202F58202F57202F57202F57202F57BBC0CCBBC0CC 2121211818191919191A1A1A1B1B1B1A1A1B1A1A1B2425253A3A3A626263969798969797979798 959696969697969697949595949495939495484C524E525853585F1C242B1C242B1C242C0E1013 030202060606060606050503999894FEFCF8F6F3EFF6F4EFF3F1ECCFCCC8CAC8C592918E75726F 73716F696A685F6160575A5924262A0E0F1613141A1113180D0D131517193239389FA3A4939595 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000141414C2C2C6828285797A7B4B4A4E0D0D12 12131716181A5B5A5B7372747B7A7B8381818886878B898A8C8A8B8E8A8ACBC7C4F8F5F2F5F3EE F6F3EFF6F3F0FEFCF7999793060505060606050606050303090A0A1B22291D252C1C242B53585F 4F545A454A509292939494959494959595969595969696979696976565660A0A0A000000000000 0000000000000000000000000000000000003636366D6D6FBBC0CCBBC0CD233259202F57202F57 202F57202F570C16344A56764D59794C59784C59784A5676576381576381576382515C7A404B69 3F4A683F4A6854607E5863825863825864824955733F4A683F4A683F4A684E5A78596483596483 5A6583535F7D404B693F4A683F4A685863825A65845A66844C58774D5A794E5A7A4E5A7A4E5A79 4B58775A66855B66855B66855B66855B66855B67855B678555607F404B693F4A683F4A683F4A68 3F4A683F4A683F4A683F4A683F4A683F4A683F4A68515D7B5D69875D69875D69875D69875D6987 5D69884E5A794F5B7B505D7C505D7C4F5C7C4E5A795E69885E69885E69885E69885E6A885E6A88 576280404B693F4A683F4A683F4A683F4A683F4A683F4A683F4A683F4A683F4A683F4B69545F7E 606B89606B8A606B8A606C8A606C8A606C8A606C8A4F5C7B515D7C515E7E515E7E515D7D4E5A7A 606C8A606C8A606C8A606C8B606C8B606C8B4B56743F4A683F4A683F4A683F4A683F4A683F4A68 3F4A683F4A683F4A683F4A683F4A686F788EE4E7EBFFFFFFFFFFFFFFFFFFFFFFFFF3F4F69FA6B8 4F5B7B515D7D525F7F525F7FB5BAC8FFFFFFFFFFFF707995616C8B616C8B616C8B6D7894EDEEF2 FFFFFFFFFFFF9CA1B144506D606C8A616C8B616C8B616C8B606C8A434F6D3F4A683F4A68485371 616C8B606C8A606C8A606C8A606C8A606C8A505C7B515D7C515E7E515E7E515D7C4E5A7A606C8A 606C8A606B8A606B8A606B89606B8955607F404B693F4A683F4A685E6988606B895F6B895F6A89 5F6A895F6A893F4B693F4A683F4A68525D7C5E69885E69885E69885E69885E69885E69884E5A79 4F5B7B505D7C505D7C4F5B7B4D59795D69875D69875D69875D69875D69875D68875D68865D6886 5D68865D68865D68864B57753F4A683F4A684752705C67855C67855C67855C67855B67855B6685 5B66855B66855B66855A66855A66854C58784E5A794E5A7A4E5A7A4E5A794B57775A65845A6583 5A65835A65835A65835A65835964834E5A783F4B693F4A683F4A683F4A683F4A683F4A683F4A68 3F4A683F4A684651705763815863825863825763825763825763825763815763814B57764C5878 4D59794D59794C58780A1532202F57202F57202F57202F57202F57BBC0CCBBC0CC121212000000 0000000000000000000000000000000000000000000000001F1F1F8D8D8F969697959596959596 949495949495939394939394484C524E525952575F1C242B1C242B1C242C0E1013030202060606 060606050503999895FEFDF8F6F4EFF7F4F0F4F1EDCDCBC8C9C7C493918E75727074736F6A6B69 5E61605659592426290E0F1513151A1213170D0D14141619363E3D9DA1A2959596000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000141414CACACC83828679797B4B4B4E0D0F1213141817181C 5B5B5C7372757A7A7B8280818986878B898B8B898A8F8B8ACCC7C4F8F5F1F5F3EFF5F3EEF6F3EF FEFCF8989592060505060606050606050303090A0A1B22291D252C1C242B52575E4E545A454A4F 9192939494959494959595969595969696978383830808080000000000000505052D2D2D4A4A4A 3A3A3A1313130101010000000000003A3A3ABBC0CCBBC0CC233259202F57202F57202F57202F57 0B16344C58774E5A794E5B794D5A784C5877596482596482596483586481424D6B414C6A414C6A 505B795A65835A65835A668445506F414C6A414C6A414C6A4B56745B66845B66845B66844F5A78 414C6A414C6A4652705B67845B67855B67854D59784F5B7A505C7B505C7B4F5B7B4D5A785C6786 5C68865D68865D68865D68865D69875D6987576280424D6B414C6A414C6A414C6A414C6A414C6A 414C6A414C6A414C6A414C6A414C6A535E7D5E6A885E6A885F6A885F6A885F6A885F6A88505B7A 515D7C525E7E525E7E515E7C4F5B7A606B89606B89606B89606B89606B8A606C8A586481424D6B 414C6A414C6A434E6C434E6C434E6C434E6C414C6A414C6A414C6A414C6A414C6A5D6886616D8A 616D8A616D8B616D8B616D8B616D8B515D7C525E7E53607F53607F525F7E505C7B626D8B626D8B 626D8B626D8B626D8C626D8C4D5876414C6A414C6A414C6A414C6A414C6A414C6A414C6A414C6A 414C6A414C6A414C6A414C6A5D6886737D988C94AA9098AD7A849D65718D636E8C515D7C525F7E 546180546180525F7E505D7B636E8C636E8C636E8C636E8C636E8C636E8C636E8C586481424D6B 414C6A414C6A55617E636E8C626D8C626D8C56617F424D6B414C6A414C6A5C6785626D8B626D8B 626D8B626D8B626D8B626D8B515E7C525E7E53607F53607F525E7E505C7B616D8B616D8B616D8B 616D8B616D8A616D8A576280414C6A414C6A414C6A606B89616C8A616C8A616C8A616C8A616C8A 414C6A414C6A414C6A545F7D606B89606B8A606B89606B89606B89606B894F5B7B515D7C525E7E 525E7E515D7C4F5B7A5F6A885F6A885F6A885E6A885E6A885E6A885E6A875E6A875E6A875E6A87 5E6A874D5876414C6A414C6A4954725D68865E69875D69875D68875D68875D68865D68865D6886 5D68865C67865C67864E5A784F5B7A505C7B505C7B4F5B7A4D59785B67855B67845B67845B6784 5B67845B678456617F414C6A414C6A414C6A414C6A4853714C5875495572434E6C414C6A414C6A 414C6A4C58755A65835964835964835964825964825964825964824C58774D59784E5A794E5A79 4D59780A1532202F57202F57202F57202F571F2F57BBC0CCBBC0CC121212000000000000060606 0D0D0D0D0D0D080808000000000000000000000000393A3A969697949595959596949495939394 939394939394474B524E525852575E1C242B1C242B1C242C0E1013030202060606060606050303 999795FEFDF8F6F4EFF7F4F0F4F1EDCCCBC7C9C6C493908E7571707674726B6C6A606161555958 25272A0F101613151A1214180D0F13151718363D3D9CA1A8959596000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000141414C2C2C58282857A7A7D494A4C0D0D1013141717191C5C5B5D747375 7A797A8380818A86898C898C8B898A8E8A89CDC8C6FAF7F3F5F2EFF5F2EFF5F2EFFEFBF79A9794 050505060606050606050303090A0A1B22291D252C1C242B52575E4E545A44494F919192929393 9394949394949495959393942525250101010000001616168181819F9F9F9D9D9D9F9FA09D9D9D 3B3B3B010101000000020202BABFCBBBC0CC223159202F57202F57202F57202F570B16344D5977 4F5B7A4F5B7A4E5A794D59775A65835A65835A65835A6583495472424D6A424D6A4B56745B6684 5B6684596583434E6B424D6A424D6A424D6A46516F5B67845B67845B67844B5673424D6A424D6A 4F5A785C67855C67855C67854E5A79505B7B515D7C515D7C505C7B4E5B795D68865D68875D6987 5E69875E69875E69875E6987586381434E6B424D6A424D6A606B89606B89616C89616C89616C89 616C89616C89616C89606B895F6A885F6A895F6A895F6B89606B89606B89515C7B525E7D535E7E 535E7E525E7D505C7B616C89616C89616C89616C89616C89616C89596482434E6B424D6A424D6A 636E8C636E8C646F8C646F8C626D8B586381434E6C424D6A424D6A515C7A626D8B626D8B626D8B 626D8B626D8B626D8C525E7D535F7E54618054618053607E515D7C636E8C636E8C636E8C636E8C 636E8C636E8C64708D65708E65708E65708E65708E45506E424D6A424D6A56617E65708E65708E 65708E65708E646F8C636F8C636E8C636E8C636F8C646F8C636F8C525E7D53607E556181556180 53607F515E7C646F8C646F8C646F8C636F8C636F8C636F8C636F8C646F8D4B5673424D6A424D6A 46516F636E8C636E8C636E8C485471424D6A424D6A4D5875636E8C636E8C636E8C636E8C636E8C 636E8C636E8C525F7D535F7E546180546180535F7E515D7C626D8C626D8B626D8B626D8B626D8B 626D8B586381424D6B424D6A424D6A606B89616D8A616D8A616D8A616D8A616D8A424D6B424D6A 424D6A55607E616C89616C89616C89616C89616C89616C89505C7B525E7D535E7E535E7E525E7D 505B7B606B895F6B895F6B895F6A895F6A885F6A885F6A885F6A885E6A885E6A885E6A884E5977 424D6A424D6A4A55725E69875E6A875E6A875E69875E69875E69875E69875D68875D68875D6887 5D68864F5B79505B7B515D7C515D7C505C7B4E5A785C67855C67855C67855C67855C67855B6784 475270424D6A424D6A44506D5762805C67855C67855C67855B66844A5572424D6A424D6A424D6A 56617E5A65845A65835A65835A65835A65835A65834D59784E5A784F5B7A4F5B7A4E5A790A1532 202F57202F57202F571F2F571F2E57BBC0CCBBC0CC1111110000000000005757579F9F9FA0A0A0 9F9F9F8080802A2A2A000000000000020202919192949595939394939394929393929293929393 474B524E525852575E1C242B1C242B1C242C0E1013030202060606060605050503999895FEFDF8 F5F4EFF7F4F0F3F1EDCBC9C6C7C6C394928F7572707572716A6B6A606160555A5923262A0E0F16 13131B1113190D0D13141717353B39999CA1929295000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000141414C6C5C889898B79797B48484A0D0D1213131717171A5C5C5D7373747C797A848183 89878A8B8A8C8C898A8D8989CCC9C6F9F7F2F5F2EEF5F3EEF5F2EEFEFBF7999794050505060606 050606050303090A0A1B22291D252C1C242B51575D4E535944494E919192919293929394949495 9394956666680202020000000000007A7A7A9898999798989798989899999899999B9B9C161616 010101000000B5BAC6BBC0CC223159202F57202F57202F57202F570B16344F5B79515C7B515C7B 505C7B4F5A785C67845C67845C67845C6784515C7A444F6C444F6C4752705C67855C6785576280 45506D444F6C4B5673444F6C444F6C5C67855D68865D688646516E444F6C444F6C5964815E6986 5E69865E6986505C7B515D7C535F7D525F7E525E7C505C7B5F6A875F6A885F6A885F6A885F6A88 5F6A885F6A895A658245506D444F6C444F6C5F6B89606B89606B89606B89606B89606B89616C89 616C89616C89616C89616C89616C89616C8A616C8A626D8A525E7C535F7E546080546080545F7E 515D7C626D8B626D8B626D8B626D8B626D8B626D8B5B668345506D444F6C444F6C626E8B626E8B 636E8B636E8B636E8B646F8C4D5876444F6C444F6C4F5A77646F8C646F8C646F8C646F8C646F8C 646F8D54607E546180566280566281556180535F7E65708D64708D65708D65708D65708D65708D 65708D65708D65708D65708D65708D475270444F6C444F6C57627F65708E65708D65708E65708E 65708E65708E65708E65708E65708E65708E65708E545F7E556280576282576281556280535F7E 65708E65708E65708E65708E65708E65708E65708E65708D5F6A87444F6C444F6C444F6C596482 65708D5C678445506D444F6C444F6C606B8965708D65708D65708D65708D65708D64708D65708D 54607E546180566280566280546180535F7D646F8C646F8C646F8C646F8C636F8C636E8C5A6582 444F6C444F6C444F6C626D8B636E8B636E8B626E8B626E8B626D8B444F6D444F6C444F6C56627F 626D8B626D8B626D8B626D8B626D8B626D8B525E7D545F7E54608054607F545F7E515D7C616C8A 616C8A616C8A616C89616C89616C89616C89616C89606B89606B89606B89505B78444F6C444F6C 4C57745F6A885F6A895F6A895F6A895F6A885F6A885F6A885F6A885F6A885F6A875F6A87505C7B 515D7C535F7D525F7D515E7C505C7A5E69865E69865E69865E69865D6886545F7D444F6C444F6C 444F6C5762805D68865C67865C67855C67855C67855C678546516E444F6C444F6C4B56735C6785 5C67845C67845C67845C67845C67844F5B79505C7A515C7B515C7B505C7B0A1532202F57202F57 1F2E571F2E571F2E57BBC0CCBBC0CC111111000000000000555555979898979898979898989999 7474740202020000000000007B7B7C949495939495929394929293919293919192474B524C5157 52575D1C242B1C242B1C242C0E1013030202060606060606030303989794FEFDF8F6F4EFF7F4F0 F4F1EECCC9C7C8C6C393928E76747175726F6A6B695F6261575B5A2426290F1015131519121419 0D0D14131618373E3BA0A2A2969696000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000141414 C0BFC383828478787A4848490D0F1313141916181B5B5B5D7473757C797C8481838986888C898C 8D8B8C8E8A89CDC8C7F9F6F3F6F3EFF5F2EFF5F2EFFEFCF8989593060505060606050606050303 090A0A1B22291D252C1C242B51575D4E535A44494F9090929192939293949292949394954D4D4D 010101000000252525979898969797979898979898989999989999959697585858010101000000 B3B8C4BBC0CC2231591F2E571F2F57202F57202F570B1634505C7A525D7C525D7C515D7B4F5B79 5C68855D68855D68855D6885596481454F6D454F6D454F6D5B66835D6886535E7B454F6D454F6D 555F7D454F6D454F6D5863805E69865A658346506E454F6D46516E5E6A875E6A875F6A875F6A87 515D7B525E7D54607E53607E535F7D515D7B606A88606A88606A88606A88606B88606A88606B88 5A658345506D454F6D454F6D5F6B89616C89616C89616C89616C89616C89616C8A616D8A626D8A 626D8A626D8A626D8A626D8A626D8B626D8B525F7D55607E55618055618055607F525E7D626D8B 626E8B636E8B626E8B636E8B636E8B5C678445506D454F6D454F6D626E8B636F8C636F8C646F8C 646F8C646F8C4F5A77454F6D454F6D555F7D646F8D64708D64708D64708D65708D65708D54607E 55628057628257628155628054607E65708E65708E65708E65708E65708E65708E65708E65708E 65708E65708E65708E485370454F6D454F6D57627F65708E65708E65708E65708E65708E65708E 65708E65708E65708E65708E65708E55607F56628057638257638256628154607E65708E65708E 65708E65708E65708E65708E65708E65708E65708E505B78454F6D454F6D4A557365708D4D5875 454F6D454F6D525D7B646F8D65708E65708E65708E65708E65708E65708E65708E54607E556280 57628257628155628053607E64708D65708D65708D646F8D646F8D646F8D5A658346506E454F6D 454F6D626D8B646F8C646F8C636F8C636E8C636E8C45506D454F6D454F6D57627F636E8B636E8B 636E8B626D8B626D8B626D8B535F7D55607F55618055618055607F525E7D626D8B626D8A626D8A 626D8A626D8A616D8A616D8A616C8A616C8A616C89616C89505C79454F6D454F6D4D5775606B89 606B89606B88606B88606B88606A88606A88606A88606A88606A88606A88515D7B525E7D54607E 53607D525E7D515D7B5F6A875F6A875E6A875E69875E6987515C79454F6D454F6D4A55735E6986 5D69865D68865D68865D68865D68865D6886525D7B454F6D454F6D4752705D68855D68855D6885 5D68855D68855C67854F5B7A515D7B525D7C525D7C515D7B0A1532202F57202F571F2E571F2E57 1F2E56BBC0CCBBC0CC111111000000000000545555979898979898979898969797868687020202 000000000000737474939395929394929394919193919293909192474B524C515752575E1C242B 1C242B1C242C0E1013030202060606060605030503999895FEFDF8F5F3EFF7F4F0F4F1EDCCC8C6 C9C7C492928E7573707675726B6C68606362575B592324270F10151315191113170D0F12151719 373E3C9A9FA1969696000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000121214C1C1C3858385 7B7B7D47484A0D0D1014141816171B5B5A5C7573757E7A7C8582838987888B898B8D8A8B8F8B8B CCC9C6F9F6F2F5F2EEF5F1EFF6F4EFFFFDF89D9A97060605060606050606050303090A0A1B2229 1D252C1C242B51575D4D525844484E8E8F90909191919292919293929393353535010101000000 434344959697959697969697969798979798979798959597737374020202000000B2B7C3BBC0CC 2231581F2E561F2E571F2F571F2F570B1634525D7B545F7D545F7D535E7D515D7B5E68865E6886 5E69865E69865E69864A557247516E47516E57627F5F6A87505B7847516E4A55725C678448526F 47516E55607D606B8856617E47526F47516E4F5A77606B88606B88606B88606B88535E7D54607E 55617F55617F54617E535E7D616C89616C89616C89616C89616C89616C8A616C8A5C678448526F 47516E47516E4F5A774F5A774F5A774F5A774F5A774F5A77505B7855607D636E8B636E8B636E8B 636E8B636E8B636E8B636E8B54617E56628057638157638156628054607E646F8C646F8C646F8C 646F8D646F8D64708D5E688548526F47516E47516E65708D65708D65708D65708D65708D5E6886 49547147516E47516E5F6A8766708D66708E66708E66708E66718E66708E576180576382586482 59648257638255617F66718E66718E66718E66718F66718E66718F66718F66728F66718F67728F 67728F4A557247516E47516E59638167728F67728F67728F67728F67728F67728F67728F67728F 67728F67728F67728F56628058638259658359658358648256618067728F67728F67728F67728F 67728F67728F67728F67728F67728F636E8B48537047516E47516E57627F47516E47516E47526F 646F8D66718F66718F66718F66718F66718E66718E66718E66718E576280576382596482586482 57638255617F66708E66708D66708D66708E66708D66708D5B668447516E47516E47516E646F8C 65708D65708D65708D65708D65708D47526F47516E47516E596380646F8D646F8D646F8D646F8C 646F8C646F8C55617E56628057638157638156628054607D636E8B636E8B636E8B636E8B636E8B 636E8B636E8A636E8A636E8A636E8A636E8A525D7A47516E47516E4E5976616C89626D8A616C8A 616C8A616C8A616C89616C89616C89616C89616C89616C89535F7D54607E55617F55617F54607E 535E7C606B88606B88606B88606B88606B884E597647516E47516E515D7A5F6A885F6A875F6A87 5F6A875F6A875E6A875F6A8759648147516E47516E47516E5E68855E69865E69865E68865E6986 5E6886515D7B535E7C545F7D545F7D535E7C0A15321F2E571F2E571F2E561F2E561F2E56BBC0CC BBC0CC111111000000000000545455969697969798959596959596505051010102000000000000 8989899292939292939191929091929191928F9091464B514C515751565C1C242B1C242B1C242C 0E1013030202060606060606030303999794FEFDF9F6F4F0F7F5F1F4F1EDCAC7C4C9C7C394918F 7674717676736A6D6B6164625558572224270F10151414181113160C0D10151719373D3C999C9F 969696000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000121212C2C2C38282847B797C474649 0A0C0F1414181516195A5A5B7573757D7A7C8581848987898C8A8A8C898B8E8A8BCCC9C6F9F6F2 F5F2EEF5F2EEF6F3EFFDFCF8979391050505060606050606050303090A0A1B22291D252C1C242B 51565D4D525844484E8E8F909091919091919192939293931C1C1C010101000000555555949595 959596959596969697979798979798959596838383020202000000B2B7C3B9BECA2231581F2E56 1F2E561F2E571F2F570B1633535E7C54607E54607E545F7D525E7B5F69865F69875F6A875F6A87 5F6A87525C7948526F48526F535E7B5F6A874D587448526F515C78606B874A557148526F505B78 606B88525C7948526F48526F586380616B88616B88616B89616C89545F7D55617F566180566280 55617F545F7D616D8A616D8A626D8A626D8A626D8A626D8A626D8A5C678449537048526F48526F 48526F48526F48526F48526F48526F48526F48526F505B78646E8C646E8C646F8C646F8C646F8C 646F8C646F8C55617F57628058648258648257638155617F65708D65708D65708D65708D65708D 65708D5E698649537048526F48526F4C57744C57744C57744C577349547048526F48526F48526F 5A658266728F66718E66718E66718E66718E66718E66718F576280586482596583596583586482 56628067728F67728F67728F67728F67728F67728F67728F67728F67728F67728F67728F4B5673 48526F48526F59648167738F67738F68738F68738F68738F68738F68738F68738F68738F68738F 68738F57638159648259668459668459658257628068738F68738F68738F68738F68738F68738F 68738F67738F68738F68738F58627F48526F48526F48526F48526F48526F57627F67738F67728F 67728F67728F67728F67728F67728F67728F67728F586380586482596583596583586482566180 66718E66718E66718E66718E66718E66718E5C678548526F48526F48526F65708D66708D66708D 66708D66708D66708D48537048526F48526F59648165708D65708D65708D65708D65708D64708D 55617F57638058648257648257638055617E646F8C646F8C646F8C646F8C646F8C646E8B646E8B 646E8B646E8B646E8B636E8B535E7B48526F48526F4F5A77626D8A636E8A626D8A626D8A626D8A 626D8A626D8A626D8A626D8A616D8A616C8A545F7D55617F56618056618055617F545F7D616B89 616B88616B88616B88616B884C577348526F48526F55617D606B87606B87606B87606B87606B87 5F6B875F6A875D688548526F48526F48526F5B66825F6A875F6A875F69875F69865F6986525E7C 545F7D54607E54607D545F7D0A15321F2E571F2E561F2E561F2E561F2E56BBC0CCBBC0CC111111 0000000000003131315757585757585252522A2B2B030303000000000000121212939394919292 9192929192929091918F90918F9091464A514C515751565D1C242B1C242B1C242C0E1013030202 060606060606030303999795FEFDF8F6F4EFF7F4F1F4F1EDC9C6C2C7C5C293918F787673787572 6B6C6A6265645659582223261010151314181113170D0D131415183A3E3EA2A6A6969696000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000141414C0C0C281828479797B4747490D0D10141418 17181C5B5B5D7573757D7A7C8482848987898C8A8B8C898B8F8B8CCDCAC6F7F4F1F5F3EFF6F3EF F6F3EFFEFBF8989492050505060606050606050303090A0A1B22291D252C1C242B51555D4D5258 44484E8E8E8F9091919091919191929193931A1A1A010101000000545454939495949595949595 959696959696969797939495838383020202000000B2B7C3BABFCB2231581F2E561F2E561F2E57 1F2F570B163355607D56628056628056617F54607D606B87606B88606B88606C88616C885A6581 4B55724A54714F5A76606B884B55724A547158627F626C89525C794A54714D5874626C894E5975 4A54714A5471606B88626D89626D89626D8A626E8A56617F57628058638158638157638056617E 636E8B636E8B636E8B646E8B646E8B646E8B646E8B5E69854B55724A54714A54714A54714A5471 4A54714A54714A54714A54714A5471525D7965708C65708D65708D65708D66718D65718D66718D 5762805864825A65835A658359658257628066718E67718E67718E67718E67718E67718E606A87 4B55724A54714A54714A54714A54714A54714A54714A54714A54714A547157627E69739068738F 68738F68738F68738F68738F68738F68738F5964825A65835B67855B67855A6684586481687390 6873906973906973906973906973906973906973906973906973906973904D58744A54714A5471 5B6682697391697391697391697391697391697391697491697391697491697391697491586582 5A66845B67855B67855B6785586482697491697491697491697391697491697391697391697391 69739169739068738F4D57744A54714A54714A54714C567368738F697390697390697390697390 6973906973906973906873906873905964825A65835B67855B67855A668458638168738F68738F 68738F68738F68738F67738F5E69854A54714A54714A547166718E67728E67728E67728E67728E 67728E4A55714A54714A54715B668267718E67718E67718E67718E66718E66718E576380586582 5A658359658358658257628066718D65718D65718D65708D65708D65708C65708C65708C65708C 656F8C656F8C55607C4A54714A5471515C78636E8B646E8B646E8C646E8B646E8B646E8B636E8B 636E8B636E8B636E8B636E8B56617F57628058638158638157628056617E626D89626D89626D89 626D89626D894D58744A54714A547158627F626C89626C89626C89616C89616C89616C89616C89 5F69864A54714A54714A54715D6784606C88606C88606B88606B87606B8754607D56617E566280 56627F56617E0A15321F2E561F2E561F2E561F2E561F2E56BBC0CCBBC0CC111111000000000000 0101010101010101010101010101010000000000000000006C6C6C919293919192919192909091 9091918F8F918F9091464A504C505751565C1C242B1C242B1C242C0E1013030202060606060606 030303999795FEFDF8F6F4EFF7F4F0F4F1EDCBC9C5C7C5C192908F7775737775736C6C6C636564 565A572223261010151314181313170D0D13141619373C3C979C9E939596000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000141414BFBEC38386897D7E804747480A0D0D13151917181B5C5C5D 7473747B7A7C8382848988898D8A8C8C898B8D8A8ACCC9C6F8F5F2F5F2EEF6F3EFF6F3F0FEFCF9 989492050505060606050606050303090A0A1B22291D252C1C242B51555C4C525843484D8E8E8F 8E8F908F90919090919091923232320101010000003D3D3D939495939495949596949596959697 959697929394717173020202000000B2B7C3BBC0CC2231581F2E561F2E561F2E561F2E560B1633 56617F58638058638157638056617E626D89626D89626D89626D89626D89626D894C56724C5672 4C57735E68844C56724C56725E6985636E8A57627E4C56724C5672616B874D57734C5672505A76 636E8A646F8B646F8B646F8B646F8B5763805964825A65825A6582596582576380656F8B656F8C 656F8C66708C65708C66708C66708C606A874C56724C56724C5672656F8B66718D66718D66718D 66718D66718D66718D66718E67718E67718E67718E67718E67728E67718E68728E5964825A6683 5B67845B67845A668459648268728F68728F68738F68738F68738F68738F616C884C56724C5672 4C5672525C79525C79525C79515C784E58744C56724C56724C5672596380697390697490697490 6974906A74906A74906A74905A66835C67845C68865C68865C68855A66826A74916A74916A7491 6A75916A75916A75916A75916A75916A75916A75916A75914F5A764C56724C56725C67836A7591 6A75926A75916A75916A75926A75926A75926A75926A75926A75926A75925A66835C68855D6987 5D69875C68855A66836A75926A75926A75926A75926A75926A75926A75916A75926A75916A7592 6A75925E68844C56724C56724C56725C67836A75926A75916A75916A75916A74916A74916A7491 6A75916A74916A74915A66835C67845C68865C68865C67845A65826A74906A74906974906A7490 697490697490606A874C56724C56724C567268738F6974906974906974906974906873904C5773 4C56724C56725D688468738F68738F68738F68738F68728F68728F5964825A66835B67845B6784 5A668358648167728E67718E67718E67718E67718E67718E67718E67718E66718E66718E66718E 57617D4C56724C5672535E7A656F8C66708D66708C66708C66708C65708C656F8C656F8C656F8C 656F8B656F8B5763805964825A65825A6582596482576380646F8B646F8B646F8B646F8B636E8B 535E7A4C56724C567257617D636E8A636E8A636E8A636E8A636D8A636D8A636D895E68844C5672 4C56724C5672616C89626D89626D89626D89626D89626D8956617F576380586380586380576380 0915321F2E561F2E561F2E561F2E561E2E56BBC0CCBBC0CC111111000000000000000000000000 0000000000000000000000001A1A1A6A6A6A9494959191939091929091928F90918F8F908E8F90 8F8F90464A504B505650565C1C242B1C242B1C242C0E1013030202060606060606050303999895 FEFCF8F5F3EFF6F3F0F4F1EDCAC7C4C6C5C29392907876747775736C6C6B636563565A59212225 0F101513141A1213180D0D121416183B41419A9EA0959396000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000141414BDBEC27F80837B7C7E4746470C0C0D14161916181A5B5A5B7472747B7A7B 8382848988898D898C8C898B8F8A8BCDCAC7F9F6F2F4F1EDF5F2EEF6F3EFFDFBF795928F050303 060606050606050303090A0A1B22291D252C1C242B50555C4C515743474C8D8E8E8F90908F9090 8F90919091914949490101010000002626269293949293949394959394958585861B1C1C6D6D6D 515152020202000000B3B8C4BBC0CC2131581E2E561F2E561F2E561F2E560B163357627F596481 59648158648057627F636D89636D89636D89636D89636D8A636E8A535E7A4D57734D577357617D 4D57734D5773636E8A646E8B5D68844E58744D577358637F4D57734D577358637F646F8B646F8B 656F8B656F8B656F8B5864805A65825A66835A66835A658258648066708C66708C66708C66708D 66718D66718D66718D616B874E58744D57734D577366718E66728E67728E67728E67728E67728E 67728E68728E67728E68728E68728E68728E68728E68728F68738F5A65825B66845C68855C6885 5B67845A658268738F68738F687390687390697490697490626D894E58744D57734D57736B7692 6B76926B76926B76926C76925B66824D57734D57734D577367728E6A74916A74916A75916A7591 6A75916B75915C66845D68855D69875D69875D68855A66836B75916B75916B75926B75916B7592 6B75926B75926B76926B75926B76926B7692505A764D57734D57735E68846B76926B76926B7692 6B76926B76926B76926B76926B76926B76926B76926B76925B66845D68865E69875E6A875D6886 5B66846B76926B76926B76926B76926B76926B76926B76926B76926B76926B76926B769267728E 4E58744D57734D577366728E6B75926B76926B76926B75926B75926B75926B75926B75916B7591 6B75915C66845D68855D69875D69875D68855A66836B75916A75916A75916A74916A74916A7490 626D894D57734D57734D577367728E6974906974906974906974906974904D57734D57734D5773 5F6A8669749068749068739068739068738F68738F5A65825B66845C68855C68855B6684596482 68728F68728E68728E68728E68728E68728E67728E67728E67728E67728E67728E58627E4D5773 4D5773545F7B66708D66718D66718D66718D66718D66718D66708D66708C66708C66708C66708C 5864815A65825A66835A66835A6582586380656F8B656F8B656F8B646F8B646F8B58637F4D5773 4D5773535D79646F8B646F8B646E8B646E8B646E8A646E8A646E8A5A65814D57734D57734F5A76 636D8A636D8A636D89636D89636D89636D8957627F5864805964815864815864800915321F2E56 1F2E561F2E561E2E561E2E56BBC0CCBBC0CC1111110000000000003C3C3C6D6D6D6E6E6E6E6E6E 7B7B7B8F8F8F9A9A9A9595969191928F91919091918E90908E90908E8F8F8D8F8F8E8F8F464A50 4C505750555C1C242B1C242B1C242C0E10130302020606060606060303039A9895FEFDF8F6F4EF F6F4EFF4F1EDCAC6C4C6C4C19391907875747776736D6E6D626564575A5A2124270E0F1612151A 1013190C0D1016171A343B3C9A9EA0979698000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 141414BAB9BE8281857B7C7C4546460A0A0D13141817181C5C5C5D7372737B797B8482848A888A 8C8B8C8D8A8C8F8B8CCCC8C4F7F4F0F3F0EDF4F1EEF6F3EFFDFBF8969391050303060606050606 050303090A0A1B22291D252C1C242B51555D4C515743474C8C8D8E8D8E8F8E8F908E8F908F9091 6161620202020000000000006F70719193939293949092921C1C1C0000000404040F0F0F000000 000000B5BAC6BBC0CC2130581E2E561F2E561F2E561F2E560B16335964815B66825B66825A6582 596480656F8B656F8B656F8B656F8B656F8B656F8B5B65814F59754F5975515B774F5975535D79 65708B65708C646E8A505A764F5975515B774F59754F5975616C8766708D66708D66708D67718D 67718D5A65825C67835C67845C67845C67845A658267728D67728D67728D67728E67728E67728E 67728E636D89505A764F59754F597568728E68728F68738F68738F68738F69738F69738F69738F 69738F69748F69748F69748F69748F69748F69748F5C67845D68855E69875E69875D69855C6783 6A75906A75906A75906A75916A75916A7591646E8A505A764F59754F59756B75916B75926B7591 6B75926B769268728E505A764F59754F5975656F8B6C76926C76926C76926C76926C76926C7692 5D68855E69875F6B885F6B885E69875C67846C77926C77926C77926C77926C77926C77936C7793 6C77926C77936C77936C7793525C784F59754F5975606A866C77936C77936C77936C77936D7793 6C77936C77936D77936C77936D77936C77935D68855E6A87606B88606B885E6A875C68846D7793 6D77936D77936D77936C77936C77936C77936C77936C77936C77936C779368728F505A764F5975 4F597567728E6C77936C77926C77926C77926C77926C77926C77926C77926C77926C77925D6885 5E69875F6B885F6B885E69875C67846C76926C76926C76926C76926C76926C769266708D4F5975 4F59754F597565708B6B75926B75916B75926B759167728D4F59754F59754F5975636E8A6A7591 6A75906A75906A75906A75906A75905C67845D68855E69875E69875D68855B668369748F69748F 69748F69748F69748F69738F69738F69738F69738F68738F68738F5A64804F59754F597556607C 67718D68728E67728E67728E67728E67728D67728D67728D67728D67728D67728D5A65825C6784 5C67845C67845C67835A658267718D66718D66708D66708D66708C5E69844F59754F59754F5975 606C8765708C65708C65708B65708B65708B656F8B515C784F59754F597555607B656F8B656F8B 656F8B656F8B656F8B646F8B5964805A65825B66825A66825A65820915321F2E561E2E561E2E56 1E2D561E2D56BBC0CCBBC0CC111111000000000000545454969697969697969697959596939394 9192939091919091919091918F90918E8F908E8F908D8D8F8D8E8F8C8D8E464A504B505650555C 1C242B1C242B1C242C0E1013030202060606060606050303999894FEFCF8F6F3EFF6F4EFF4F1ED C7C4C1C4C3BF9491907875747976746F6F6E626665555A582123260F0F151314191213170D0D12 16171A383E3E979B9C939395000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000141414BCBCC1 7E80817E807E4444450A0A0D14141917181B5B5B5C7472747A797B8382848A888B8D8B8B8D8A8B 8F8C8CCCC8C5F7F4EFF3F0EBF3F1ECF5F2EFFDFBFA969391050303060606050606050303090A0A 1B22291D252C1C242B50545C4C515743464C8C8C8E8D8E8F8E8F908E8E8F8F90918F8F901B1B1B 0101010000001414148384859192939293946E6F6F040404000000000000000000010101BABFCB BBC0CC2130581E2E561E2E561F2E561F2E560C1735545F7B5B66825B66825A6582596480646F8B 646F8B656F8B656F8B656F8B656F8B616C884F59754F59754F59754F597558637E65708B65708B 65708C525C784F59754F59754F59754F5A7566708C66708C66708D66718D66718D67718D5A6582 5C67835C67845C67845C67845A658267728D67728D67728D67728D67728D67728D67728D636D89 505A764F59754F597568728E68728E68728F68728F68728F69738F69738F69738F69738F69738F 69748F69748F69748F69748F69748F5C67835D68855E69875E69875D68855C67836A75906A7590 6A75906A75906A75906A7591646E8A505A764F59754F59756B75916B75916B75916B75916B7592 69748F505A764F59754F5975636E8A6C76926C76926C76926C76926C76926C76925D68845E6987 5F6A885F6B885E69875C67846C77926C77926C77926C77926C77926C77926C77926C77926C7792 6C77926C7792525C784F59754F5975606A866C77936C77936C77936C77936C77936C77936C7793 6C77936C77936C77936C77935D68855E69875F6B885F6B885E6A875C67846C77936C77936C7793 6C77936C77936C77936C77936C77936C77926C77936C779368728E505A764F59754F597567728E 6C77926C77926C77926C77926C77926C77926C77926C77926C77926C77925D68855E69875F6A88 5F6A885E69875C67846C76926C76926C76926C76926C76926B76926A7591505A764F59754F5975 58637E6B75916B75916B75916B75915A65804F59754F59754F597568728F6A75906A75906A7590 6A75906A75906975905C67845D68855E69875E69865D68855B668369748F69748F69748F69748F 69738F69738F69738F69738F68738F68738F68728F5A64804F59754F597556607C68728E68728E 67728E67728E67728E67728D67728D67728D67728D67728D67728D5A65825C67845C67845C6784 5C67835A658266708D66718D66708D66708C66708C66708C525C784F59754F5975525C79636D89 65708B65708B65708B656F8B57627E4F59754F59754F5975606B87656F8B656F8B656F8B646F8B 646F8B646F8B5964805A65825B66825A668255607D0A16341F2E561E2E561E2E561E2D551E2D55 BBC0CCBBC0CC111111000000000000525253929394929394919293919293919192919192909091 9090918F90918F8F918E8F908E8F908D8E8F8D8E8F8C8D8E464A504B4F5650545C1C242B1C242B 1C242C0E10130302020606060606060303039A9896FEFCF8F6F3EFF6F3EFF4F1EDC6C3C0C3C2BE 9392917876747876746F6E6E626564555A582224270F10151315181313170D0D1216191B373D3D 959A9D959696000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000141412BFBFC18081847D7C7D 42424306090A14151916171B5B5B5C7473757A797B8482848A888A8D8B8B8C8A8C8E8A8BCCC8C5 F6F4EFF3F0EAF3F0ECF5F2EEFEFCF8979592050503060606050606050303090A0A1B22291D252C 1C242B4F545B4B505743464C8A8B8C8D8D8F8D8D8F8D8E8F8F8F918E8F907B7B7B030303000000 0000000808083E3E3F5757584E4E4F131313010101000000000000222222BBC0CCBBC0CC213057 1E2D551E2D561E2E561E2E560D1A3B464F695C68845D68845C67835B668266708C66718C66718C 66718C66718C66718C67718D535D78515B76515B76515B765E688467718D67718D67718D58627E 515B76515B76515B7658627E68728D68728D68728D68728D68728E68738E5C67835D68845E6986 5E69865D68855C678368738F68738F69738F69738F69738F69738F69738F646F8A525C77515B76 515B76545E7A545E7A545E7A545E7A545E7A545E7A545E7A545E7A59647F6A75906A75916A7591 6A75916A75916B75915D68855F6A87606A87606A885F6A875D68846B75916C76916C76916C7691 6C76916C769165708B525C77515B76515B766D77926D77926D77926D77926D77926B7691525C77 515B76515B76656F8B6D77936D77936D77936D77936D77936D77935E6A86606B88616C89616C89 606B885E69866D77936D78936D78936D78936E78936D78936E78936E78936E78936E78936E7893 545E7A515B76515B76616B876E78936E78936E78936E78936E78936E78936E78936E78936E7893 6E78936E78935F6A87606B89616D89616D89606C895E69866E78936E78946E78946E78936E7894 6E78936E78936E78946E78936E78936E78946A748F525C77515B76515B7669738F6E78936E7893 6E78936D78936D78936D78936D78936D77936D78936D77935E6A86606B88616C89616C89606B88 5E69866D77936D77936D77936D77936D77936D77936D77935B6681515B76515B76515B7657627D 5E68845F698458627E515B76515B76515B7658627E6C77926C76916C76916C76916B76916B7691 6B75915D68855F6A87606A87606A875F6A875D68846A75916B75916A75916A75906A75916A7590 6A75906A75906A75906A74906A74905B6681515B76515B7658627E68738E69738F69738F69738F 69738F69738F69738F68738F68738F68738F68738F5C67845D68845E69865E69865D68845B6683 68728E68728E68728E68728D68728D67728D646E89515B76515B76515B76525C7759647F5D6883 5B6580555F7A515B76515B76515B765B658067718D66718C66718C66718C66708C66718C66708C 5B66825B66835C68845C6784464F680B18391E2E561E2D561E2D561E2D551E2D55BBC0CCBBC0CC 1111110000000000005252539191939293949191939191939091929091928F90918E8F908E8F90 8D8E8F8D8E8F8C8D8E8C8D8E8C8D8E8B8C8D44494F4A4F564F545B1C242B1C242B1C242C0E1013 0302020606060606060305039A9996FEFCF8F6F3EFF6F3F0F3F0ECC4C1BDC3C0BD94918E767573 7775766F6F6F6163625659582326281010141415181214170B0D1217191A353E3C999DA0969697 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000141414BFBEC27F7F8278787A4141420A0A0D 13151917191C5C5C5D7372757B797B8582848B898B8C8A8C8D8A8B8D8A8ACBC7C4F6F3EFF4F1ED F5F2EEF6F2EEFDFBF895928F030302060606050606050303090A0A1B22291D252C1C242B4F545B 4C515743464C8B8C8D8C8D8E8C8D8E8D8E8F8D8E8F8E8F90919192565656030303000000000000 000000000000000000000000000000000000000000000000B7BCC8BBC0CC2130571E2D551E2D56 1E2D561E2E560E1D43252E4756617C5D68845D68845C678267718D67718D67718D67718D67718D 67718D67718D5A6580525C77525C77525C77646E8968728D68728D68728D5E6883525C77525C77 525C77606A8569738E69738E69738E69738E69738F69738F5D68845E69855F6A875F6A875E6986 5D688469738F69738F69748F69748F6A748F6A748F6A748F656F8A535D78525C77525C77525C77 525C77525C77525C77525C77525C77525C77525C7757627D6B76916B76916B76916B76916B7691 6C76915E69855F6B87606B88606B88606B875E69856C76926C76926C77926C77926D77926D7792 66708C535D78525C77525C776D77936D78936D78936D78936D78936D7893535D79525C77525C77 636D896D78936D78936D78936D78936D78936E78935F6A87606B89626D89626D89606C895F6A87 6E78946E78946E78946E78946E78946E79946E79946E79946E79946F79946F7994555F7A525C77 525C77626C886F79946F79946F79946F79946F79946F79946F79946F79946F79946F79946F7994 606B87616C89626D8A626D8A616D895F6A876F79946F79946F79946F79946F79946F79946F7994 6F79946F79946F79946F79946B7590535D78525C77525C776A748F6F79946E79946E79946E7994 6E79946E78946E78946E78946E78946E78945F6B87606C89626D89616D89606C895F6A866D7893 6D78936D78936D78936D78936D78936D78936D789359637E525C77525C77525C77525C77525C77 525C77525C77525C7757617C6C76916D77926D77926D77926C77926C77926C76926C76925E6986 606B87606B88606B88606B875E69856B76916B76916B76916B76916B76916B76916B76916B7591 6B75916B75916B75905C6782525C77525C7759637E69748F6A74906A748F6A748F6A748F6A748F 69748F69748F69738F69738F69738F5D68845E69855F6A875F6A875E69855C678369738F69738E 69738E69738E69738E68738E69738E5E6883525C77525C77525C77525C77525C77525C77525C77 525C77525C7756607B66708C67718D67718D67718D67718D67718D67718D67718D5C67825C6784 5D698457617D262F480C1B411E2D561E2D561E2D561E2D551E2D55BBC0CCBBC0CC111111000000 0000005252539192939191939192939192939091929091928F90918E8F908E8F908D8E8F8D8E8F 8C8D8E8C8D8E8C8D8E8B8C8D44494F4A4F5650545B1C242B1C242B1C242C0E1013030202060606 0606060305039A9895FEFCF9F6F3F0F6F4EFF3F1ECC3C0BDC1BEBC93908D7677747777766F6F6F 626462575A58232628100F151414191313170D0D12151717373F3D999CA1969596000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000141414BBBBBF7A7B7C78797A4546460A0C0D13151818191C 5B5B5D7372747C797C8582858B898C8C8A8C8D8A8C8D8A8BCBC8C5F8F4F1F4F1EEF5F2EEF6F3F0 FDFCF894918E030302060606050606050303090A0A1B22291D252C1C242B4F545B4B505642454B 8A8A8C8A8B8C8B8C8D8D8D8E8C8D8E8D8E8F8D8E8F959596808080232323010101000000000000 0000000000000E0E0E4A4A4A0A0A0A000000A8ACB8BABFCB3845691F2E561E2D551E2D551E2D56 0F1E4726335417223D434C6555607B5D678367728D67728D67728D67728D67728D68728D68728D 626C87535D78535D78535D7868728E68728E69738E69738E636E89545E79535D78535D7867718C 69738F69748F69748F69748F69748F69748F5E69855F6986606B87606B875F6A865D68856A748F 6A748F6A748F6A74906A75906A75906B759065708B545E79535D78535D78535D78535D78535D78 535D78535D78535D78535D78535D7859637E6C76916C76916C76916C76926C76916C76925F6A86 606B87616C89616C89616C885F69866D77926D77926D77926D77936D78936D789367718D545E79 535D78535D786E78936E78936E78936E78936E78936E789359637E535D78535D7857617C6E7893 6E78936E78936E78946E78936E7894606B87616C89626E8A636E8A616D89606B876F79946F7994 6F79946F79956F79946F79956F79956F79956F79956F79956F799556607B535D78535D78636D88 6F7A95707A956F7A956F7A956F7A956F7A956F7A956F7A956F7A956F7A956F7A95616C88626D89 636E8B636E8B626D89606B87707A956F7A956F7A95707A956F7A95707A95707A956F79956F7A95 6F79956F79956B7691545E79535D78535D786B75906F79956F79946F79956F79946F79946F7994 6F79946F79946F79946E7994606B87616C89626E8A626E8A616C895F6A876E78946E78936E7893 6E78936E78936E78936E78936E78936F79955E6883545E79535D78535D78535D78535D78545E79 5C66816D77926E78936D78936D78936D77936D77926D77936D77926D77925F6A87606C88616C89 616C89606C885F69866C76926C76916C76916C76916C76916C76916C76916C76916C76916C7691 6C76915D6782535D78535D785A647F6A74906B75906B75906B75906B75906A75906A74906A748F 6A74906A748F6A748F5E69855F6986606B875F6B875F6A865D688469748F69748F69748F69748F 69738F69738F69738F6A748F65708B57617C535D78535D78535D78535D78535D78535D785F6985 69748F68728D67728D67728D67728D67728D67728D67728D67728D5D678355607B444D6617223D 2633540D1D461E2D551E2D551E2D551E2D55364367BBC0CCB9BEC9111111000000000000515252 9091929090919091928F90918F90918E8F908D8E8F8D8E8F8D8E8F8C8D8E8C8D8E8B8C8D8A8B8D 8A8B8C8A8B8D44494F4A4E564E535A1C242B1C242B1C242C0E1013030202060606060606030505 9B9996FEFDF9F6F4F0F7F4F0F4F1EDC5C1BFC1BFBD94918F7877747877746D6D6C626361575A58 2124260E0F141314181212160D0D10171819383E3D9A9DA0969697000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000141414BAB9BC8283837E7E7E46464707090C12131818191D5B5C5E737375 7D7A7C8683858B8A8C8C8A8D8D8A8C8E8A8ACAC7C4F7F4F0F4F0ECF4F1EDF5F2EFFDFCF895928E 030302060606050606050303090A0A1B22291D252C1C242B4E545A4B505642454B898A8B8B8C8D 8B8C8D8B8C8D8C8D8E8D8D8F8D8D8F8D8D8F9091929A9A9A9191917878786161616C6C6C848484 999999929292797979101010ACB1BBBBC0CC56627F1F2E561E2D551E2D551E2D550F1F4817264F 3440611B27470E1A3809153316203D16203D16203D16203D16203D16213D16213D17223E18233F 19244019244016213E16213E16223E16223E18223F1924401A24411A244117223F17223F17223F 17223F18223F18223F18223F0B17340C18360E19370D19360D18360B163418233F18233F182340 18233F1824401823401823401924411C27431C27431C27431C27431D27441D27441D27441D2744 1D27441D27441D27441D27441A24421A25421A25421A25421B25421B25420C18360E19370F1B38 0F1B380E1A380C18361B26421B26431B26431B26431B26431B26431C27441F29461F29461F2946 1C27431C27431C27431C27441C27441C27441F29461F2A471F2A471F29461D27441D27441D2744 1D27441D27441D27440E19370F1B38101C3A101C3A0F1B390E19361D28441D28441D28441D2844 1D28441D28441D28441D28441D28441D28441D2844202B47212C48212C481F29461D28451D2845 1D28451D28451D29451D28451D29451D29451D29451D29451D29450E1A38101B39111D3B111D3B 101B390E19371D28451D29451D29451D29451D29451D28451D28451D28451D28451D28451D2845 1E2945212C48212C48212C481E29451D28441D28441D28441D28441D28441D28441D28441D2844 1D28441D28440E19370F1B38101C3A101C3A0F1B390D18361D27441D27441D27441D27441D2744 1D27441D27441C27441C27441E29451F29461B264216203D151F3C1B25421F29461E29451C2743 1B26431B26431B26431B26431B26421B26421B26421B26420D18360E1A380F1B380F1B380E1A37 0C18351B25421A25421A25421A24421A24421A24411A24411A24411A24411A24411924411B2642 1D27441C27431B264219244019244019244018234018244018234018234018233F18233F18233F 18233F0C17340C18360E19370D19360C18360B163318223F18223F18223F17223F17223F17223F 17223E17223E18223F19244016213D131D3A0E1936111B38151F3C18233F17223F16213D16213D 16213D16203D16203D16203D16203D16203D16203D0A16330E1A381B274734406117264F0E1E47 1E2D551E2D551E2D551E2D5554607FBBC0CCB2B7C1747474929292999999949596909192909091 8F8F918F8F918F8F918E8E908E8E908D8D8F8C8D8E8C8D8E8B8C8D8B8C8D8A8B8C8A8B8C8A8B8C 44494E494E544E535A1C242B1C242B1C242C0E10130302020606060606060305039A9996FEFDF9 F6F4EFF7F4F0F4F1EDC4C1BEC1BEBC9592907877747879746F6E6C616361565A582225260F1014 1415181213160D0D12161719373C3C989C9F969698000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000141414BEBEC2808083828182454547090A0D12131917191D5A5B5D7574757F7C7D878486 8C898B8D8B8D8D8A8C8E8A8ACCC8C6F7F4F0F4F1EDF5F1EEF4F0EDFDFBF8959290030303060606 050606050303090A0A1B22291D252C1C242B4E535A4A505641454B89898A8A8B8C8A8C8D8A8B8C 8B8D8E8B8C8D8C8D8E8C8D8E8D8E8F8D8E8F8F90919394959596969595969394958D8E8F8A8B8C 868687777778A5A8AFBBC0CC848CA21F2F561E2D551E2D551E2D560F1E4810204915254E303E63 3B496A3E4B6C4B57774B57774B57774B57774B57784B57784B58784B58784C58784C58784C5878 4C58794C58784C58794C59794D59794D59794D59794D59794D59794D597A4D59794D597A4D5A7A 4D5A7A4E5A7A3F4D6E414E6F424F70434F70414F6F3F4C6E4E5B7B4F5B7B4F5B7B4F5B7B4F5B7B 4F5B7B4F5B7B4F5B7B4F5B7B4F5B7B4F5B7B4F5B7C4F5B7B4F5B7C4F5C7C4F5C7C505C7C505C7C 505C7C505C7C505C7D505C7C505C7D505D7D505C7D505D7D414E6F434F71435173435173435072 414E6F515E7E525E7E525E7E525E7E525E7F525E7E525E7F525E7F525E7F525E7F525F7F535F7F 535F7F535F7F535F7F535F7F535F7F535F7F535F7F535F7F535F7F535F7F535F7F535F7F535F7F 535F7F445071445173455374455374445173424F70535F80535F80536080535F80536080536080 536080536080546080546080546080546080546080546081546081546081546081546081546081 546080546081546081546081546081546081546081435071445273465375465375445273434F71 546081546081546081546080546081546081546080546080546080546080546080546081546080 546080546080546080546080546080546080536080546080535F80535F80536080535F80535F80 445071445173455374455374445173424F70535F7F535F7F535F7F535F7F535F7F535F7F535F7F 535F7F525E7E525E7E525E7E525E7E525E7E525E7F525E7E515E7E515E7E515D7E515D7E515D7D 515D7D515D7D515D7D515D7D505D7D505D7D404E6E424E70425072425072424F70404D6E4F5C7C 4F5C7C4F5B7C4F5B7B4F5B7C4F5B7B4F5B7B4E5B7B4E5B7B4E5A7B4E5A7B4E5A7B4E5A7A4E5A7A 4E5A7A4E5A7A4E5A7A4E5A7A4E5A7A4E5A7A4E5A7A4E5A7A4E5A7A4E5A7A4D5A7A4D5A7A3F4C6D 404D6E414E6F414E6F404D6E3E4B6C4C59794C59794C59794C58794C58794C58784C58784C5878 4B58784B57784C58784C58784C59794C58794B57784B57774B57774B57774A57774A56774A5677 4A56764A56764A56764A56764A56763E4A6B3A4769303E6315254E10204A0E1E471E2D551E2D55 1E2D551D2D55828AA0BBC0CCA4A7AF6E6E6F8282848A8A8C8D8D8F9091928F90918F8F918F8F91 8F8F918E8E908D8D8F8D8D8F8B8C8D8C8D8E8A8B8C8A8B8C8A8B8C8A8A8B898A8B44494E4A4E55 4E535A1C242B1C242B1C242C0E10130302020606060606060305039A9996FEFDF8F6F4EFF7F4F0 F4F1EDC4C1BEC1BEBC94918F7978757778746F6F6C5F6261555A582224260F1015131418121317 0D0D12151619393F409A9EA2969696000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000121212 BCBBC07E7E807C7C7C45454509090C15151A16171C595A5B7675767F7C7D8785868C898A8D8C8D 8D8B8D8E8A8BCCC8C6F7F3F0F4F1EDF5F2EEF5F1EEFDFBF895938F030303060606050606050303 090A0A1B22291D252C1C242B4E53594A4F5641454B8888898A8A8B8A8B8C8A8C8C8B8C8D8B8D8D 8B8D8D8C8D8E8D8E8F8D8E8F8E8F908E8F908F90918F90919090928C8D8F8A8A8C818284727375 85878BBABFCBB8BCC93544681F2E561E2D551E2D550F1E4810204911214B11214B10204A0E1E48 1F2E561F2E561F2E561F2E561F2E561F2E561F2F571F2F571F2F57202F57202F57202F57202F57 202F58202F58202F58203058213058213058213058213058213058213059213159213159223159 11214A12224C13234D13244D12234C10204A22325A22325A23325A23325A23325A23325A23325B 23335B23335B24335B24335B24335B24335B24335C24335C24335C24345C24345C24345C25345C 25345C25345C25345D25345D25345D25355D13234D14244E15265015265014254E12224C26365E 26365E27365E27365E27365E27365E27365E27365E27365F27365F27365F27375F27375F27375F 28375F28375F28375F28376028376028376028376028376028386029386029386029386015254F 16265017275217285216265013234D293861293861293861293861293861293961293961293861 2939612939612939612939612A39612A39612A39612939612A39612A39612A39612A39612A3961 2A39612A39612A39612A39612A396114244E16275118285318285316275114244E2A39612A3961 2A39612A39612A39612A39612A39612A39612A39612A39612A39612A39612A39612A3961293961 29396129396129396129386129386129386129386129386129386129386129386015254F162650 17275217275216265013234D29386028386028386028386028376028386028376028375F28375F 29386029386028386028386028376028376028376028376028376028375F28375F28375F28375F 28375F27375F27375F27375F13244D15254F16275116275115264F13234C25345D26355E26355E 26355D26355D26355D26355D26355D25355D25345D25345D25345C25345C25345C25345C24345C 24345C24335C24335C24335B24335B24335B24335B23335B23335B23335B12224B13234D14244E 14244E13234D11214A22325A22325A22315A223159223159223159223159213159213159213059 213059213059213058213058213058203058203058203058202F58202F57202F57202F57202F57 202F57202F57202F5710204911214B11214B11214B10204A0E1E471E2D551E2D551D2D55303F63 B7BBC8BBC0CC86888D7272748283848A8A8C8D8D8F8F90918F90918E8F908E8F908C8E8F8D8E8F 8C8D8E8B8C8D8B8C8D8B8C8D8A8B8C8A8A8B8A8B8B8A8A8B898A8A44484E494D544E535A1C242B 1C242B1C242C0E10130302020606060606060305039B9997FEFCF8F6F3EFF6F3F0F4F2EDC4C1BD BFBCBA93908D7A78767877746E6D6D5D615F555B582325280F10151315191213160C0D12141518 3D43429CA0A1959596000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000141414BABABC7E7D80 7C7C7D4142420C0C0D141419151519595A5A7675767F7C7E8784868C898A8D8C8D8D8B8D8F8C8C CDCAC7F7F4F0F4F1EEF5F2EFF6F3F0FDFBF895928E050302060606050606050303090A0A1B2229 1D252C1C242B4D5359494F5540454B88898A898A8B898A8B8A8B8C8A8A8C8B8C8D8B8C8D8B8C8D 8C8D8D8C8D8E8C8D8E8D8F8F8D8E8F8E90908E90908C8D8F898A8B828385787879616262B2B6C1 BBC0CC878FA4202F561E2D551E2D550F1E4810204911214B11214B10204A0E1E471E2E561F2E56 1F2E561F2E561F2E561F2E561F2E571F2E571F2F571F2F571F2F57202F57202F57202F57202F57 202F58202F5820305821305821305821305821305821305821305921305921315911214A12224C 13234D13234D12234C10204A22315A22315A22325A22325A23325A23325A23325A23325A23335B 23325B23335B24335B23335B24335B24335B24335C24335C24345C24345C24345C25345C25345C 25345C25345C25345C25345D13234D14244E15264F15265014254E12224C26355E26355E26355E 26365E26365E27365E27365E27365E27365E27365E27365F27365F27365F27375F27375F27375F 28375F28375F28375F28375F28376028376028376028376028376028386014254E152650172752 17275216265013234D293860293860293860293860293860293860293861293861293861293861 293861293961293861293961293961293961293961293961293961293961293961293961293961 29396129396129396114244E16265117285217285216275113244D2A3961293961293961293961 293961293961293961293961293961293861293861293961293861293961293961293961293861 29386129386129386029386129386029386029386029386029386014254F152650172752172752 16265013234D28376028376028376028376028375F28375F28375F27375F28375F27375F27375F 27375F27365F27365F27365E27365F27365E27365E27365E27365E26365E26355E26355E26365E 26355E26355D12224C14244E15265015254F14244E11224B25345C25345C25345C25345C25345C 24345C24345C24335C24335C24335C24335B24335B23335B24335B23335B23335B23335B23325B 23325A23325A23325A22325A22325A22325A22315A22315A10214A12224C13234D13234D12224C 102049213059213059213059213058213058213058213058202F58202F58202F58202F57202F57 202F57202F571F2F571F2F571F2F571F2F571F2E571F2E561F2E561F2E561F2E561F2E561E2E56 1E2D560F1E4810204911214B11214B1020490E1E471E2D551E2D551D2C55858DA2BBC0CCB4B8C3 63646476787882838488898A8C8D8E8E90908D8E8F8D8F8F8C8E8E8C8E8F8C8D8D8C8D8E8B8C8D 8B8B8D8B8C8D8A8A8C898A8B898A8B898A8B88898A43484E484D544D53591C242B1C242B1C242C 0E10130302020606060606060305039B9997FEFCF8F6F3EFF7F4F0F4F1EDC3C0BCBFBDBA94918F 7978777878766F6E6E5E6260575C5A26282B0F0F141415191112160C0C1016181A3A413E95999B 929395000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000121212B7B7B97E7E817B7B7C404141 0A0C0D14151A17181C59595B767576807D7F8784868C89898D8B8D8D8B8C8F8C8CCBC7C6F6F3EF F5F2EEF5F2EEF5F2EFFDFBF895928F050303060606050606050303090A0A1B22291D252C1C242B 4D5259494E5540454B87898A888A8A888A8A898A8C898A8B8A8B8D8A8B8D898B8C8B8C8D8B8C8E 8B8C8E8C8C8E8C8D8F8E8E908E8E908D8E8E8888898283837A7B7B686869808186BABFCBBABFCB 6E79922130571D2D550E1E4810204911214B11214B10204A0E1E471E2E561E2E561E2E561F2E56 1F2E561F2E561F2E561F2E561F2E571F2E571F2E571F2E571F2F57202F57202F57202F57202F57 202F57202F5820305821305821305821305821305821305821305911214A12224C13234D13234D 12224C10204922315A22315A22315A22325A22325A23325A23325A23325A23325A23325B23325B 23325B23335B24335B24335B24335B24335B24335B24335C24335C24345C24345C25345C25345C 25345C25345C13234D14244E15264F15254F14254E12224C26355E26355D26355E26355E26365E 26365E26365E26365E27365E26365E27365E27365E27365E27365E27365F27365F27365F27375F 27375F28375F28375F28375F28375F28375F28375F28376014254E152650172752172752162650 13234D283860283860293860293860293860293860293860293860293860293860293860293860 293861293860293861293861293861293861293961293861293961293861293861293961293861 29396114244E16265117285217285216275113244D293961293961293861293961293961293861 293861293861293861293861293861293861293860293860293860293860293860293860293860 29386029386029386029386029386028386028386014254F15265017275217275215265013234D 28376028375F28375F28375F28375F28375F27375F27365F27375F27365F27365F27365F27365E 27365E27365E27365E27365E26365E26365E26355E26365E26355E26355E26355D26355D26355D 12224C14244E15264F15254F14244E11224B25345C25345C24345C24345C24345C24345C24335C 24335B24335B24335B23335B23335B23335B23325B23325B23325B23325A23325A23325A23325A 22325A22315A22315A22315A22315922315910204A12224C13234D13234D12224C102049213059 213058213058213058213058203058202F58202F57202F58202F57202F57202F571F2F571F2E57 1F2E571F2F571F2E571F2E561F2E561F2E561F2E561F2E561E2E561E2E561E2D561E2D550E1E48 10204911214B11214B1020490E1E471D2D552130576E7892BBC0CCBBC0CC7F818668696A797A7A 8283848788898B8C8E8E8E908C8D8F8D8D8F8C8C8E8C8D8E8B8C8D8B8C8D8A8B8C898A8B898A8B 898A8B88898A888A8A87888987898943474D484D544D52591C242B1C242B1C242C0E1013030202 0606060606060305039B9997FEFCF8F6F3EFF7F4F0F4F1EDC4C1BEC0BEBB949290797877787776 6F6E6C5E6261565B5A25272A0F101613141A1213160D0D1315171939403F979A9D969696000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000121214BBBAC0807F827A7A7A4141420D0D1015161A 16171B58595B767576807D808784868B89898E8B8C8D8B8B8F8C8CCBC7C5F5F2EFF4F0EDF4F1EE F5F2EFFCFAF7928F8C030302060606050606050303090A0A1B22291D252C1C242B4D5259494E54 40454B86878888898A88898A88888A898A8B898A8B898A8B898B8C8A8B8C8A8C8D8B8C8E8D8D8F 8C8D8F8E8E908E8E908C8D8E89898A8383857A7A7C6F70705D5D5D9799A0BBC0CCBBC0CCA4AABA 414E6F0F1F4910204911214B11214B10204A0E1E471E2D561E2D561E2E561E2E561F2E561E2E56 1F2E561F2E561F2E561F2E571F2E57202F571F2F57202F57202F57202F57202F57202F57202F57 202F58202F5820305821305821305821305821305811214912224B13234D13234D12224C102049 22315922315922315A22315A22315A22325A22325A23325A23325A23325A23325B23325B23335B 23335B24335B23335B24335B24335B24335B24335C24335B24335C24345C24335C24345C25345C 13234D14244E15254F15254F14244E12224B25355D26355D26355D26355D26355E26355E26355E 26365E26355E26365E26365E27365E27365E27365E27365E27365E27365F27365F27365F27375F 27365F27375F27375F27375F28375F28375F14254E15254F17275117275116265013234D283860 283860283860283760293860283860283860283860293860293860293860293860293860293860 29386029386029386029386029386029386129386029386129386129386029386129386014244E 16265017285217285216265113244D293860293861293861293860293861293860293860293860 293860293860293860293860293860293860293860293860293860283860283860283860283860 28386028386028376028386028376014254E15265017275116275115265013234D28375F28375F 28375F27365F27375F27365F27365F27365F27365F27365F27365E27365E27365E27365E27365E 26365E26365E26355E26355E26355E26355D26355D26355D26355D25355D25345D12224C14244E 15254F15254F14244E11214B24345C25345C24345C24335C24335C24335B24335B24335B24335B 23335B23335B23335B23335B23325B23325B23325A23325A23325A23325A22325A22315A22315A 22315A22315922315922315910204A12224B13234D13234D12224C102049213058213058213058 203058203058202F58202F57202F57202F57202F57202F57202F571F2F571F2E571F2E571F2E56 1F2E571F2E561F2E561F2E561E2E561E2E561E2E561E2D561E2D561E2D550E1E4810204911214B 11214A1020490E1E473E4C6E9EA5B6BABFCBBBC0CC989BA25C5C5D6E6E6F7A7B7C82838488898A 8B8C8E8E8E908C8D8F8C8C8E8C8C8E8A8B8C8B8C8D898A8B898A8B898A8B89898A88898A88898A 88888A87888987878942474C484D534D52591C242B1C242B1C242C0E1013030202060606060606 0303039C9A98FFFDF9F6F3EFF6F4F0F4F1EDC4C0BDBDBCB99592907978767778756F6E6D5E6261 585B5A26272A0F10161414191113160D0D1315171A353C3C979A9D969696000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000121212B8B7BB81818479797A3F3F410F0D1016171A16161B5B5A5B 777676807E7E8885868B898A8E8A8C8D8A8B8E8B8CCCC8C6F6F3F0F4F1EDF3F0ECF5F1EEFDFBF7 94918D030302060606050606050303090A0A1B22291D252C1C242B4D5159484D5440444A868688 86878987888A87888A88898A88898A898A8B898A8B8A8B8C8A8B8C8B8C8D8B8C8D8C8D8E8C8D8E 8C8E8F8B8C8D888A8B8384857C7C7E7374746666675758588D9096BABEC9BBC0CCBABECB7F889F 49567633416511214B1020490E1E471E2D551E2D561E2D561E2D561E2D561E2E561F2E561F2E56 1F2E561F2E561F2E571F2E571F2F571F2F571F2F57202F57202F57202F57202F57202F58202F58 20305820305820305821305821305811214A12224C13234D13234D12224C102049223159223159 22315922315922315A22315A22325A23325A23325A23325A23325A23325A23325B23325B23325B 23335B23335B24335B24335B24335C24335B24335C24335C24335C24345C24345C13234D14244E 15254F15254F14244E11224B25345D25355D25355D25355D26355D26355D26355E26355E26355E 26355E26365E26365E27365E26365E27365E27365E27365E27365E27365E27365F27365F27375F 27375F27375F27375F27375F14244E15254F16275117275115265013234D283760283760283760 283760283760283760283860283860283860283860283860283860293860283860283860293860 29386029386029386029386029386029386029386029386029386029386014244E162650172752 17285216265013234D293860293860293860293860293860293860293860293860293860293860 293860283860293860283860283860283860283860283860283760283860283760283860283860 28376028376028375F14254E15255016275117275115264F13234C27375F27375F27365F27365F 27365F27365F27365F27365E27365E27365E27365E26365E27365E26365E26365E26355E26355E 26355E26355E26355E26355D26355D26355D25355D25345D25345D12224C14244E15254F15254F 14244E11214B24335C24335C24335C24335C24335B24335B24335B24335B23335B23335B23325B 23325B23325B23325A23325A23325A23325A23325A22325A22315A22315A22315A223159223159 22315921315910204A12224C13234D13234D12224B0F1F49213058203058203058203058202F58 202F57202F57202F57202F57202F57202F571F2F571F2F571F2E571F2E561F2E561F2E561F2E56 1F2E561E2E561E2E561E2E561E2D561E2D561E2D551E2D550E1E4810204911214A314064465372 7C859CB8BCCABBC0CCBABECA8F91985657586566677171737C7C7E82848588898A8B8C8D8C8D8E 8C8D8E8C8D8E8B8C8D8A8B8C8A8B8C898A8B898A8B898A8B89898A88898A88898A868789878889 86878943474D484D544C51581C242B1C242B1C242C0E10130302020606060606060303059C9A99 FFFDF9F6F3EFF7F4F0F5F2EEC6C3C0BEBCBA93928E7978757877756E6E6D5D6260595B5926282B 1010171214181113170D0D12151718353D3B9A9E9F969593000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000121212B6B4B87B7C7D7B7B7C4243440F101316171B17171C5A5A5B777676807D7F 8885868D8A8B8E8D8D8D8B8C8F8C8DCCC9C7F8F4F2F3F0ECF2EFEBF5F2EFFDFAF693908C030302 060606050606050303090A0A1B22291D252C1C242B4D5159484D543F444A828384868789868789 87888A88898A88898A898A8B898A8B898A8B8A8B8C8B8C8D8B8C8D8B8C8D8C8D8E8C8E8F8A8B8C 898B8C8485867E7F807575766B6C6D616162545556606164ADB1BBBABFCCB6BBC8B6BCC8B7BCC9 B7BCC9B7BCC8B6BBC8BBC0CCBBC0CCBBC0CCBBC0CCBBC0CCBBC0CCBBC0CCBBC0CCBBC0CCBBC0CC BBC0CCBBC0CCBBC0CCBBC0CCBBC0CDBBC0CDBBC0CDBBC0CDBCC1CDBCC1CDBCC1CDBCC1CDBCC1CD BCC1CDBCC1CDBBC1CDB7BCC8B7BCC9B7BDC9B7BDC9B7BDC9B6BCC8BCC1CDBCC1CDBCC1CDBCC1CD BCC1CDBCC1CDBCC1CDBCC1CDBCC1CDBCC1CDBCC1CEBCC1CEBCC1CEBCC2CEBCC2CEBDC2CEBDC2CE BDC2CEBDC2CEBDC2CEBDC2CEBDC2CEBDC2CEBDC2CEBDC2CEBDC2CEB7BCC9B8BDCAB8BDCAB8BECA B8BDCAB7BCC9BDC2CEBDC2CEBDC2CEBDC2CEBDC2CEBDC2CEBDC2CEBDC2CFBDC2CFBDC2CFBDC2CF BDC2CFBDC3CFBDC3CFBDC3CFBEC3CFBEC3CFBEC3CFBEC3CFBEC3CFBEC3CFBEC3CFBEC3CFBEC3CF BEC3CFBDC3CFB8BDC9B8BECAB9BECBB9BECBB8BECAB7BDC9BEC3CFBEC3CFBEC3CFBEC3CFBEC3CF BEC3CFBEC3CFBEC3CFBEC3CFBEC3CFBEC3CFBEC3CFBEC3CFBEC3CFBEC3CFBEC3CFBEC3CFBEC3CF BEC3CFBEC3CFBEC3CFBEC3CFBEC3CFBEC3CFBEC3CFBEC3CFB8BDCAB8BECAB9BECBB9BECBB8BECA B8BDC9BEC3CFBEC3CFBEC3CFBEC3CFBEC3CFBEC3CFBEC3CFBEC3CFBEC3CFBEC3CFBEC3CFBEC3CF BEC3CFBEC3CFBEC3CFBEC3CFBEC3CFBEC3CFBEC3CFBEC3CFBEC3CFBEC3CFBEC3CFBEC3CFBEC3CF BEC3CFB8BDCAB8BECAB9BECBB9BECBB8BECAB7BDC9BDC2CFBEC3CFBEC3CFBEC3CFBEC3CFBEC3CF BEC3CFBEC3CFBEC3CFBDC3CFBDC3CFBDC3CFBBC1CDBBC1CDBBC0CDBBC0CDBBC0CDBBC0CCBBC0CC BBC0CCBBC0CCBBC0CCBBC0CCBBC0CCBBC0CCBBC0CCB4BAC7B5BBC8B5BCC8B5BBC8B5BBC8B4BAC7 BBC0CCBBC0CCBBC0CCBBC0CCBBC0CCBBC0CCBBC0CCBBC0CCBBC0CCBAC0CCBAC0CCBAC0CCBAC0CC BABFCCBABFCCBABFCBBABFCBBABFCBBABFCBBABFCBBABFCBBABFCBBABFCBBABFCBBABFCBBABFCB B4BAC6B4BAC7B4BBC7B4BBC7B4BAC7B3BAC6B9BECBBABFCBBABFCBBABFCBBABFCBBABFCBB9BFCB B9BECBB9BECBB9BECBB9BECBB9BECAB9BECAB9BECAB9BECAB9BECAB9BECAB9BECAB9BECAB9BECA B9BECAB9BECAB9BECAB9BECAB9BECAB9BECAB3B9C6B3BAC6B4BAC7B5BAC7B4BAC7B5BAC7BABFCB ADB1BC6464685555576161636B6C6E7575777D7F80848687888A8B8A8C8D8C8D8E8B8C8D8B8C8D 8A8B8C8A8A8C8A8B8C89898B88898A88898A88898A87888986878886878986878882848542464C 484C534C51581C242B1C242B1C242C0E10130302020606060606060503059D9B9AFFFCF8F6F3EF F6F4F0F4F1EDC5C4C0BBBAB893918E7A78757976746D6D6B5C605F595B5B26272A111317131418 1214180D0D12161719373F3F989C9D969696000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 121212B5B6B97F7F8279797C43434610101316181B17181B5B5C5B787676817D808885868D8B8C 8F8D8F8E8C8C8D8A8BCAC7C4F8F4F1F4F1EEF3F0ECF5F2EEFDFAF6938F8C030202060606050606 050303090A0A1B22291D252C1C242B4C5057484D543F444A727478868788878889878889878889 87898A87898A88898B88898B898A8C898A8C8A8B8C8A8B8C8B8C8D8B8C8D8B8C8D8A8B8C868788 80828378797A6F71716668685F60615757584C4D4F7073798B909AA0A5AFB7BCC9B7BCC9B7BCC8 B6BBC8BABFCBBBC0CCBBC0CCBBC0CCBBC0CCBBC0CCBBC0CCBBC0CCBBC0CCBBC0CCBBC0CCBBC0CC BBC0CCBBC0CCBBC0CCBBC0CCBBC0CCBBC0CDBBC0CDBBC0CDBBC1CDBCC1CDBCC1CDBCC1CDBCC1CD BABFCCB6BCC8B7BCC9B7BDC9B7BDC9B7BDC9B6BCC8BAC0CCBCC1CDBCC1CDBCC1CDBCC1CDBCC1CD BCC1CDBCC1CDBCC1CDBCC1CDBCC1CDBCC1CDBCC1CEBCC1CDBCC1CEBCC2CEBCC2CEBCC2CEBDC2CE BDC2CEBDC2CEBDC2CEBDC2CEBDC2CEBDC2CEBBC0CDB7BCC9B8BDCAB8BDCAB8BDCAB8BDCAB7BCC9 BBC1CDBDC2CEBDC2CEBDC2CEBDC2CEBDC2CEBDC2CEBDC2CEBDC2CEBDC2CEBDC2CFBDC2CEBDC2CF BDC2CFBDC3CFBDC3CFBDC3CFBDC3CFBDC3CFBEC3CFBEC3CFBEC3CFBEC3CFBEC3CFBEC3CFBCC1CD B7BDC9B8BECAB9BECBB9BECBB8BECAB7BDC9BCC1CEBEC3CFBEC3CFBEC3CFBEC3CFBEC3CFBEC3CF BEC3CFBEC3CFBEC3CFBEC3CFBEC3CFBEC3CFBEC3CFBEC3CFBEC3CFBEC3CFBEC3CFBEC3CFBEC3CF BEC3CFBEC3CFBEC3CFBEC3CFBEC3CFBCC2CEB8BDCAB8BECAB9BECBB9BECBB8BECAB8BDC9BCC2CE BEC3CFBEC3CFBEC3CFBEC3CFBEC3CFBEC3CFBEC3CFBEC3CFBEC3CFBEC3CFBEC3CFBEC3CFBEC3CF BEC3CFBEC3CFBEC3CFBEC3CFBEC3CFBEC3CFBEC3CFBEC3CFBEC3CFBEC3CFBEC3CFBCC1CEB7BDC9 B8BECAB9BECBB9BECBB8BECAB7BDC9BCC1CDBEC3CFBEC3CFBEC3CFBEC3CFBEC3CFBDC3CFBDC3CF BDC3CFBDC3CFBDC3CFBDC2CFBDC2CFBDC2CEBDC2CEBDC2CEBDC2CEBDC2CEBDC2CEBDC2CEBDC2CE BDC2CEBDC2CEBDC2CEBDC2CEBBC1CDB7BCC9B8BDCAB8BDCAB8BDCAB8BDCAB7BCC9BBC0CDBDC2CE BDC2CEBDC2CEBDC2CEBDC2CEBDC2CEBCC2CEBCC2CEBCC2CEBCC1CEBCC1CDBCC1CEBCC1CDBCC1CD BCC1CDBCC1CDBCC1CDBCC1CDBCC1CDBCC1CDBCC1CDBCC1CDBCC1CDBCC1CDBAC0CCB7BCC8B7BCC9 B7BDC9B7BDC9B7BCC9B6BCC8BABFCCBCC1CDBCC1CDBCC1CDBCC1CDBBC0CDBBC0CDBBC0CDBBC0CC BBC0CCBBC0CCBBC0CCBBC0CCBBC0CCBBC0CCBBC0CCBBC0CCBBC0CCBBC0CCBBC0CCBBC0CCBBC0CC BBC0CCBBC0CCBBC0CCB9BFCBB6BBC8B6BCC8B7BCC9B7BCC9A0A5AF8D919C7174794E4F50565757 5E60606768686E707178797A808182868788898A8B8A8B8C8B8C8D8A8B8C8A8B8C8A8B8C898A8C 88898A88898B87898A87898A87898A87888986878886878886878872757842464C474C524C5158 1C242B1C242B1C242C0E10130302020606060606060503059D9B9AFFFDF9F6F3EFF6F3EFF5F2EE C4C0BEBAB8B695938F7B79787776746C6D6B5B605F585C5B27282A12121612141A1113170D0D13 15171A39404192999B939396000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000121212B7B8BB 80818277777943434410101418181C18191D5C5D5D787678807D7F8885878D8A8C8F8D8F8E8C8E 8C8989C7C4C0F7F4F0F4F1EDF3F0ECF4F1EDFDFBF894918D030302060606050606050303090A0A 1B22291D252C1C242B4C50574A4F56474B5143464B7D7E7F858687868788868788878889878889 88898A88898A898A8B898A8B898B8C898B8C8A8C8D8A8C8D8B8C8E898A8C87888A8283857C7C7E 7475756C6C6D6565665E5F605455552B2D30292C302A2D312A2D312A2C30292B2F26292C252729 4646474B4B4C4B4B4C4B4C4C4B4C4C4B4C4D4B4C4D4C4D4D4C4D4D4C4D4E4D4D4E4D4E4F4D4E4F 4E4E4F4E4F4F4E4F4F4E4F504F50504F4F504F50514F50505050515051524C4D4D2A2C2E2B2D31 2D30342F32362F32362E31352C2E322A2C2F4F4F50535455535455545455545556555556555556 55565755565755565755565756575856575857585857585857585958585958585958585958595A 58595A58595A595A5A5555562E30332F323632363A34373C34373C33363B3033372E3133575758 5C5D5E5C5D5E5C5D5E5C5D5E5D5E5E5D5E5E5D5E5F5D5E5F5E5F5F5E5F5F5E5F605F5F605F5F60 5F5F605F60615F60615F60615F60616061626060616060616061625B5C5C32343733363B36393F 383B41383B41373A3F34373C3133375D5D5E626263626364626364626364626364626364626364 636465626364636465636465636465636465636465636465636465636465636465636465636465 6364656364655E5F5F33363934383C373B41393C42393D42373B4134373C3235385E5F60636465 636465636465636465636465636465636465636465636465636465636465636465626364626364 6263646263646263646262636263646262636262636262635D5D5E32353833363B363A3F383B41 373B40363A3F33363B3033365B5C5D6061626061626061625F60615F60615F60615F60615F5F60 5F5F605E5F605E5F605F61625F61615F60615F60615F60605F60605E5F605E5F605E5E5F5E5E5F 5D5E5F59595A30323632353935383D36393E35393D34373C3134382F31345657585A5B5C5A5B5C 5A5B5C5A5B5C5A5A5B595A5B595A5B595A5A595A5A58595A585959585959575859575859575859 5757585757585656575656575556565556565556565051512C2F312D30342F3237313438303338 3032372D2F332B2C2F4E4F4F525353515253515253515252515252505152505151505151505051 4F50514F50514F4F504E4F504E4F504E4F4F4E4F4F4D4E4F4D4E4E4D4E4E4D4D4E4D4D4E4C4D4D 48494927292D282B2E2B2D312C2E322C2F322C2F332B2E322B2D305354545E5E5F6465656B6C6C 7475757C7D7E828385868789888A8B8A8C8D8A8C8D898B8C898B8C898A8B898A8B88898A88898A 8788898787898687888687888586878586877E7E7F44484C464A514A4E564C51581C242B1C242B 1C242C0E10130302020606060606060503059D9B99FFFDF9F6F3EFF6F3EFF5F3EEC5C2C0B9B7B4 94918E7B79797877756B6C6B5B5F5D585D5A27292A1113171414191212160D0D121617193A4141 92979D929395000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000121212B5B5B87E7E7F7E7E80 4141410E101318181C18191C5D5D5E787679817E808886888D8A8C8F8D8F8E8D8E8B8988C5C2BF F7F3F0F5F2EEF2EFEBF4F1ECFDFAF694928D030302060606050606050303090A0A1B22291D252C 1C242B4C50574A4F56474C533D424835373A5D5D5F7E7F80868788868789868789868789878889 87888988898A898A8B898A8B898A8B8A8B8C8B8C8E888A8B898A8C8586887F81827A7B7C727375 64666747484925272A2A2D3131343832353A33363B33363B32363A2F3337292C2F2325273E3E40 5455565A5A5B5A5A5C5A5A5C5A5B5C5B5C5C5B5C5C5B5C5D5B5C5D5C5D5D5C5D5E5C5D5E5D5E5F 5D5E5F5E5F5F5E5F605F5F605F60615F60605A5B5C44444627292B2C2F3434383C373A40383B41 383B41383B4035383D2E313527292C4646485E5F60656566656566656566656667656667666668 66676866676866686967686967686968696A68696A69696B69696B696A6B6A6B6C696A6B646566 4C4C4D2B2D3031353A3A3E433D41473E43483E42483D42483B3F4532363B2C2E304C4D4F68696A 6E70716E70716E70716F70716F7071707171707171707172707172717273717273727374717273 7273747273747273747374757273746C6D6E5051522E313335393E3E434841464C43474D43474D 41464C3F4349363A3F2E31335152546E7071767677767677767677767677767677767677767677 767778767778767778767779777879767778777879777879767779777879767779707172545456 303235373B4040454A43484E45494F45494F43484E40454A373A402F3134535355707172777879 767779767779767779767779767779767778767778767778767778767677767779767677767778 7677787676777676777576776E70715253552E3133363A3F3F434941464C43474D43474D41464C 3E434835383E2E30325051526C6D6E737475727374727374727374717273717273717273717273 7071727071727071717071726F70717071716F70716E70716E70716E6F706868694C4C4E2C2F31 32353A3A3E443D41473E42483E41483D41463A3E4331353A2B2D304A4B4C6365656A6B6C69696B 69696B68696A686969686969676869666869666869666768666768666768656667666668656667 6465666565666365655D5F5F454647282A2C2E313535383D373B40383B41383B41373A4034373C 2C2F3427282B42434459595B5F60615F5F605E5F605E5F605D5D5F5D5D5F5C5D5E5C5D5E5C5D5D 5C5D5D5B5C5D5B5C5D5B5C5C5A5C5C5A5B5C5A5A5C5A5A5B595A5B5454553E3F40242528282B2F 2F323731353933363B32353A32363A3034382A2D3127282B464647646667727374787A7B7F8182 83858687898A888A8B8A8B8C898A8B898A8B898A8B88898A88898A878889878889878889868789 8687888587887D7E805E5E6035383B3D4147474C524A4F564C50571C242B1C242B1C242C0E1013 0302020606060606060503059D9B9AFFFCF8F5F2EEF6F3EFF6F3EFC8C5C2B8B7B493908E7B7978 7877756C6D6C5C5F5E555A572427291213181314191212160D0D121416183A424193979D929295 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000141414B7B7BB7C7B7F7C7C7E4142420F0F12 18171C1A1B1F5E5D60797779817D818885888C8A8B8F8D8F8E8D8F8B8989C5C2BEF7F3EFF5F1ED F3F0ECF4F1EEFCF9F6928F8C030302060606050606050303090A0A1B22291D252C1C242B4C5057 4B5057494E5444484E383C41282B2E1A1B1E1A1B1E1A1B1E1A1C1E1A1C1E1A1C1E1A1C1E1A1C1E 1A1C1E1A1C1F1A1C1F1A1C1F1A1C1F1A1B1E1A1B1E1A1C1E191B1D181A1C17191A15171A202124 2B2E3232363B35393D35393E35393E35393E35393E33373C303337272A2E1B1D20111315111315 121315121315121315121315121315121315121315121315121315121315131415131415131416 1314161314161314161314161314161E20222A2D3134383C393C413A3E443B3F453C3F453B3F44 3A3E4335393E2C2F331E2124141517141517141517141517141517141618141618141618151618 151618151618151618151618151618151718151718151718151718151718151718212326303337 3A3E433E434940454B41454C41464C41454C40444A3B3F4431343922252816171A16181A16181A 16181A16181A16181A16181A17181A17181A17181A17181A17181A17181A17181A17181A17181A 17181A17181A17181A17181A23262933373C3E434844484E464A51474A52474A52464A5245494F 3F434934373C24282B17191B17191B17191B17191B17191B17191B17191C17191C17191C17191C 18191C18191C18191C18191C18191C18191C18191C18191C18191C18191C25272A35393E40454A 454A51474C53494D53484D53484C53464A5140454A35383D25282B18191C18191C18191C18191C 18191C18191C18191C18191C17191C17191C17191C17191C17191C17191C17191B17191B17191B 17191B17191B17191B24272A34373C3F434945494F464A52474A52474A52464A5144484E3E4348 33363B23262917181A17181A17181A17181A17181A17181A17181A17181A17181A17181A17181A 16181A17191B17191B17191B17191B17191B17181B17181B17181B2325283033383B3F443F444A 41454C41454C41454C41454B3F43493A3E432F3237212427161819161819161819161819161719 161719161719161719161719161719161719151719151719151719151618151618151618151618 1516181516181F21242C2F3335393E3A3E433B3F443B3F453B3E443A3E43393C4134383C2A2D31 1E2123141517141517141517141517141517141516141516131416131416131416131416131416 1314161314161314161314161214161214161214161214161C1E20272A2E30333733373B34383D 35383D35393E35393E35393D32363B2B2E3220222516181A181A1B1A1C1D1B1D1F1C1D201C1D20 1B1D201C1E211C1E211C1E211C1E201C1E201C1E201C1E201C1E201C1E201C1D201C1D201B1D20 1B1D20282B2E383B4144484E494E544B50574B50571C242B1C242B1C242C0E1013030202060606 0606060503059D9B99FFFCF8F5F2EFF6F3EFF7F4F0C7C5C2B8B6B394928E7978757876746E6E6D 5F6360565C5725292A1213181315191314180D0D13161819364040969A9C929292000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000121212B2B3B679797C7576784041420F0F1318171E18191C 5E5E607A777A817E818886898D8A8C8E8D8F8F8E8F8D8A8BC8C5C1F6F3EFF2EFEBF3EFECF4F0ED FDFAF694908D030302060606050606050303090A0A1B22291D252C1C242B4B50574B50574A4F56 484D5444484E3D4247383C40383C41383C41393C42393C42393C42393D42393D423A3D433A3E43 3A3E433A3E433A3E433A3E433A3D423A3E42393D41373B4035393D34373C35393E393C433B3F44 3B3E443A3D43393D42393C42393C42383C41373A3F33373B2E32372A2D312B2E312B2E322B2E31 2B2E322B2E322C2E322C2E322C2E322C2E322C2F322C2F332C2F332C2F332D30342D30332D3034 2D30342D30342E303432353A373B403C3F453D42473F43483F43493F44493F44493E42483D4147 393D4234373C303237303337303337303338303338303338303439303439303439313439313439 31343932343932343932353932353932353932353932363A32363A383B403D424842474D44484F 464A51464A51464A51464A51454A5044484F3F4349393D4334383D34383D34383D34383D35393D 35393D35393D35393D35393D35393E35393D36393E36393E36393E36393F373A3E373A3E373A3E 373A3F373A3F3C3F4542474D474B53494F554A50564A4F564B50574B50574A4F55484D5344484E 3D4146383B40383B41383B40383B41383B41383B41383B41383B41383B41383B40383C42383C41 383C41383C41383C41393C41383C41383C41393C41393C413E42484549504A4F554B50584D5159 4D51594D51594D51594B50584A4F554549503E4248393C42393C41393C42383C41383C41383C41 383C41383C41383C41383C42383B40383B41383B41383B40383B41383B40383B40383B40373B40 373B403D404644484E484C534A4F554B50574A4F564A50564A4F56494E55474C5342464D3C4045 373A3F373A3F373A3E36393F36393F36393F36393E36393E35393E35393D35393E35393D35383C 35383C35383C34383C34383C34373C34373B34373B393D423F434944484E454A50464A51464A51 464A51454A5044484F42464D3D4248373B4132353A323539323539323538323538323438323438 313438313438313438303438303438303438303337303337303337303337303337303237303237 34373C393D423D41473E43483F44493F43493F43483E42483D42473B3F45373B4032353A2D3034 2D30342D30342D30342D30342C2F342C2F332C2F332C2F332C2E322C2E322C2E322C2E322B2E32 2B2E322B2E312B2E312B2E312A2D312A2D312E323633363B373A3F383C41383C41383C41393C42 3A3D433A3E433A3E44393C4235393E33363B35393C373A3F393C403A3C403A3C41393D423A3D42 3A3D423A3C423A3C41393C41393C41393C41393C41383C40383B40383B40383B3F383B3F3D4147 44484E484C534A4F564B50574A4F561C242B1C242B1C242C0E1013030202060606060606050305 9D9B99FFFDF8F6F3EFF6F3EFF6F3EFC7C4C1B7B5B394928E7A78747776736D6D6C5E625F555A58 2427291112181214191213170D0D1216181A38424194999C8F9191000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000121214B5B5BB7E7E81797A7C3D3E3F0D0F1319171E19191D5E5E607A787A 817E818886898D8B8D908D8E8F8E8F8D8C8CC9C6C3F8F4F0F5F0ECF3F0EDF4F1EEFDFAF895918E 050302060606050606050303090A0A1B22291D252C1C242B4A4F564B50574B50574A4F56494E54 484C53464A51454A51464B52464B52464B52474C52474C53474C52474C53484C53484D53484D54 494D55494D55494D55484C54484C54474C53464A5143494F43494E43484D42474D41464C40444A 3F43493E43483E42483D42483D41473D40463B3F443A3D433A3E433A3E443B3F443B3F443B3F45 3B40453B3F453B3F453C40463C40463C40463D40463D41473D41473D41473D42483D41483E4248 3D424940434941464C43474E44494F44494F45494F454950464A50464A5045495043494E43464C 41454C40454C41464C41464C41464C41464C42464D42464C42464D43464E43474D43474F43474F 43484F43484F44484F44484F454950454950454950474C52494E544A4F564C51584C52584C5158 4C52584C52584C52584C51584A4F56494D54474C53474C53474C53484D54484D54484C54494E55 494D55494D55494E55494D55494E55494F55494F55494F554A4F564A4F56494F564A4F564A4F57 4C51584E545B4F555D51575E51575E52575E51575E52585E52585F51565E4F555C4E525A4C5158 4C51584C51584C51584C51594C51584C51594C51584C51584C51594C51584C51594C51594D525A 4C51594D525A4D525A4D525A4D525A4D525A4F555B51575E525860545A61545A61535961545A61 53596153596152586050565E4F545B4D525A4D525A4D525A4C52594D525A4C51594C52594C5159 4C51594C52594C51594C52594C52594C52594C52594C52594C51584C51584C51584C51584D5259 4F555C50565E51575E51575E52585E51575E52575E51575E4F555D4F545B4C51584A4F56494F56 4A4F56494F56494E55494E55494E55494E55484D54494D55484D54494D55494D55484C54484C54 484C54474C53474C53474C53474C53494E544A50564C51584C52584C52584C51584C51584B5158 4B50584A4F55484D54464B5145495044494F44494F44494F43494F43484F43484F43474F43474E 43474E43464E43474D43474D42464D42464C41464C41464C40454C41464C40454B41464C43484E 44494F454A5045495045494F44494F44494F44494F43474E41464C4043493E42483D41483D4147 3D41473D40473D40463C40463C40463C40463C40463B3F453B3F453B3F453B3F453B3E443A3E44 3A3E443A3E433A3D433A3E433B3F443D41463D41473E43483E43483E43483F43493F434A40454B 41464C42474C43484E43474E454A51474B53474C53484D54494D55494E55484D54484D54484D53 484C53474C53474C53474C52474C52464B52464B52454A51464B51454A51474B52484E54494E56 4A50574A4F564A50561C242B1C242B1C242C0E10130302020606060606060505059E9B9AFFFDF8 F6F3EFF6F3EFF7F4F0C8C5C3B7B5B393928F7A79767976766D6D6D606362565A5A25272B111318 1314191212170D0D101516183941409094978D8D8E000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000121212B3B3B77B7B7D7A7C7C3E40410D0F1318171E1A1A1E5F5E607B787A817E81898688 8F8C8D8F8D8E908E8F8D8B8BC9C5C4F6F3EFF3EFEBF3F0ECF3F0EDFDFAF794908E030302060606 050606050303090A0A1B22291D252C1C242B4A4F564A4F564B50574B50574B50574B50574C5158 4B51584C51594C51594C52594D52594D525A4D525A4E535A4D535A4E535B4E535A4E535A4E545B 4F545B4F545B4E545B4F545B4D52594C51594B5058494E55484D53464B51454A50454A5044494F 44494F454950454A50454A51454A50464B51464B51464B51464B51474C51474C52474C52474C53 474C53474C53484C54484D53484D53494D55494E554A4E564A4E564A4F564B4F564B4F564B5057 4B50574C51574C51584C51584C51584C51584C51594D52594D52594D525A4E535B4E535B4E535B 4E535B4E545B4E545B4F545B4F555C50555C50555C50565C51565D50565D51565D51565D51565E 51565E51575F52576051575F535860535960525960535960535960535960545A61545A61555A62 555B62555B62565B63555B62555B63565B63565B63565C64565C64575C65565C64575C65575D65 575D65585D65575D65575E65585E66575E65595E67595F67595F675A5F685A5F685A5F68595F68 5A60685960685A60695B60695A60695B60695B60695B60695B616A5B616A5B616A5B616A5B616B 5B616B5B616B5C626B5B626B5C626B5C626B5B626A5C626B5B626A5B626B5B626A5B626B5B626B 5B626B5C626B5B626B5C626B5C626B5B626B5C626B5B626B5B626B5C626B5C636B5D636B5C626B 5C636B5C626B5B626B5B626B5B626B5B626B5B626B5B626B5C626B5B626B5C626B5C626B5B626A 5C626B5B626A5B616A5B616B5B616A5B616B5B616A5B616B5B616A5B616A5B616A5A60695B6069 5A60695A60695B60695A60695A60685A60685A5F685A5F685A5F685A5F68585F67595F67585E67 585E67585E66575E66585D65585D65575D65575D65565D65565C64565C64565C64565B63565B63 565B64555B63565B63565B63555B62555B62545A61545A61555A62535A60545961545961525960 53586052586051575F51575F51575F51565E51565E51565E50565D51565E51565D50565C50555C 4F555B4F555B4F545B4E545B4F545B4E535B4E535B4E535B4D525A4D525A4C52594D52594C5159 4C51584C51584C51584C51574C51574B50574B50574B4F564A4F564A4F564A4E56494E55494E55 494D55484D55484D54484C54474C53474C53474C52474C52474C51474C51464B51464B51464B51 464B51464A51454A51454A5045495044494F44494F44494F44494F454A50464B51474C524A4E55 4B4F564C51584C52594E53594E535A4E545B4F545B4E535A4E535B4E535A4D535A4E535A4D5259 4D52594D52594C52584C51594C51594C51584C51584C51584B50574B50574B50574A50574A4F56 4A4F561C242B1C242B1C242C0E10130302020606060606060505059E9C9AFFFDF8F6F3EFF6F3F0 F7F5F1C7C5C2B5B3B194928F7B7A797877776D6E6E5E6261565A5924272A111318121319111216 0D0D1216181A353D3B9094978B898A000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000121212 B7B6B87A7C7D787A7A4141420F101318171E1B1C205F5E607A787A817F818886888F8C8D908D8F 8F8E8E8D8B8BCBC7C5F4F1EDF2EFEAF3F1ECF5F1EFFCF9F592908B030303060606050606050303 090A0A1B22291D252C1C242B4A4F564A4F564A4F564A4F564B50574B50574B50574B51584C5158 4C51594C52594C51584D525A4D52594D52594D535A4D525A4E535A4E535A4F545B4F545B4F545C 4F545C4E545B4F545C4E535A4D52594C51594C51584A4F574A4E56494F554A4E56494F55494F55 4A4F564A50564B50574B50574B51574C51584B51584B51584C52594C52594C52594D535A4D535A 4D535B4E535A4E535A4E535B4E535B4F535C4F545C4F545C50545C50555C50555C51565D51555D 51575D52575E52565E52585F53575F53575F535860535860535860535860545A62545961545A62 545B63545B63555C64555B63555B63555C64565C64565C65565C65575C65575D65585D66585D66 585E66595E67585E66595F67595F675960675A5F685A5F685A60685A60685B61695B61695C626A 5B626A5C626B5C636C5C636B5D636C5C636B5C646C5C646D5C646C5D646D5D646D5D656D5D656E 5E656E5E656E5E656E5E656E5E656E5F656E5F656E5F656E5F656E60666F60666F60666F60676F 60676F60666F616870616770616770616771616771616771616771626972626871626972626972 626872626973626872626872626972626872636A72636A72646A73636A72646A73646A73636A73 646A73636A72636A73636972636A72636973636972636A73636973636A73636A73646A73636A72 646A74646A74636A72646A73636A72636A72636A73636A72636A73636A73636A72626973626972 626972626871626971626871626871616771616771616771616771616870616770616870616870 60666F60676F60666F60666F60666F5F656E5F656E5F656E5F656F5F656E5F656F5E656E5E656E 5E656E5E656E5D646D5D656D5D636C5D646C5C646C5D646D5C636B5D636C5C636C5C636B5C636C 5C626A5C626A5B616A5B61695B60695B60695A61685A5F685960675960675A5F67595F67595E67 595E66585E66595E66575D65575D65575D65565C65565C65565C65555C64555C64555C63545B63 545B63545B6254596154596153596153586053586053586053596053575F52585F52585F52565E 52575E51565D51555D51555D50555C50555C50545C4F545C4F545C4F545C4F545C4E535B4E535B 4E535A4D535A4D535A4D52594C52594C52594C52594B51584C51584B51584B51574B50574A5056 4A5056494E55494F55494E55494E55494E55494E554A4F564A4F564C50584C51574D525A4E535B 4E545B4E535B4F545B4E545B4E545B4E535A4E535B4D535A4D535A4D525A4D52594C52584C5158 4C52584C51584B50574B50574B50574B50574B50574A50564A4F564A50564A4F56494E551C242B 1C242B1C242C0E10130302020606060606060503039E9C9BFFFDF8F6F3EFF6F3EFF6F4EFC7C5C1 B4B3B09392907C7A797A78776D6E6D5E606054585723272B1213181314181213170C0C1017191A 3A423F90979A919295000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000121212B4B3B97C7D7F 787A7A3F3F400D0D1018191E1A1B1F5E5E5F7A777A827F828986878F8C8E908D8F8F8E8F8D8B8B C9C6C3F4F1EEF3EFECF4F1EDF5F2EEFCFAF695928E050302060606050606050303090A0A1B2229 1D252C1C242B4A4F564A4F564A4F564A4F564B50574A50574A50574B50574B50574C51584C5158 4C52584C51584C52584D52594D525A4D535A4D525A4D535A4E545B4E535B4E545B4F545B4F545C 4E545B4E545B4E545A4E545B4D525A4E545B4D535A4D52594D52594E525A4E525A4D525A4D525A 4D535B4E535B4E535B4E545C4F555D4F555D50555D50555D50565D51565D50565D51575E50575E 51575E52585F51585F535960535960535960545A61545961545A61545A61555A62555A62555B62 565C63565B63565D64575D64565C64575D65565D65575D65585D66575D66595D66595E67595F67 595F68595F685A60685A60695A60695A60695B616A5B616A5B616A5C626B5C626B5C626B5D636C 5C626C5D636C5D646D5D636D5D656D5D656D5E646E5E666E5E656E5F656F5E656F5F66705F6670 5F6670606670606770616770616770616770616871616871626871616871626972626972626972 636A73626A73636B73636B73646B74646B74646B74646B74646B74656C75656C75656C75656C75 656C75656D75656D75656D76666E76656D76656D77666D77656D77676E77666D77676F77676E77 676F77676F77666E77676F78666E78666E78676F78676F78676F78687078676F78687078676F78 676F78687078676F78687078687078686F78687078686F78686F78676F78686F78666E78676F78 676E78666E78676E78686F78676E78676E78676E78676E78666E78676E77666E77666E77676F77 666E77666E77666E77666D77666E77666D76666D76666D76666D76656C75656C75656D75656C75 656C75646C74636B74646C74636B74636B74646B74626A73636A73636A73636A73636A73626A72 626A726168716269716168716168716169716067706068706068705F66706067705F66705F6670 5F666F5E656F5E666E5E666E5E646E5D656D5D646D5D636D5D636D5D636C5D636C5C626C5C626B 5C626B5C616A5C616A5B616A5B60695B60695A60695A60695A5F68595F68595F68595F67585E67 595E66595E66585D66585D65585D65575D65575C64575C64565C64565C64565C63555B62555C62 555B62535A61545A6153596152596053596052586053586052585F52585F52575E51575E51575E 50565D51575D4F565D4F555D50565D4E555D4F555C4F555C4E535B4E545B4D535B4D525A4D535A 4C525A4E535A4D52594D51594D53594C51594D525A4D525A4E535A4E535A4E535B4E535B4E545B 4E535B4E535B4E535A4E535A4E535A4D525A4D525A4D52594C51584C51584C52584B51584C5158 4B51574B50574B50574B50574A4F564A4F564A4F564A4F564A4F56494F551C242B1C242B1C242C 0E10130302020606060606060505039E9C9BFFFDF9F6F3EFF6F3EFF6F4EFC7C5C1B5B4B195938F 7A78767977756F706D606262575B5925262A1213191314181112160C0C1015181837413B94989A 8E8E8F000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000121212B1B1B67E7F83797A7A3D3D3E 0D0F1019191D1C1B215F5F607976788380818986878E8B8D918E8F908E8F8D8A8BCAC6C4F5F2EF F2EFEBF3F0ECF6F3EFFDFAF994918E020302060606050606050303090A0A1B22291D252C1C242B 4A4F564A4F564A4F564A4F564A4F564B50574B50574A50564B50574B51574B51574C51584C5158 4C51584C52594D52594D525A4D525A4E535A4D535A4E535B4E535B4E545B4F545B4F545C4F545C 50555C4E545B4F545C4F555C4F545B4E545C4F545C4F555D4F555D50555D50555D51565E51565E 51565E52575F51575F515860535860525860535860535961535961545961535A62535A62555A62 545A62555B63565B64555B63565C64565C64565C64575D65565D65585D66585E66585E66595E67 595E67595F685A5F685A60695A60695A60695A60695B616A5B616A5B616A5B626B5C636B5C636C 5C636C5D636C5D646D5D646D5E646D5E656E5E656E5E656E5E656E5F666F5F666F606670606670 60676F606770606770616870616871616871626972626972626972626973636A74636A74636A74 646A74646B75646B75656B75646B75656C76656C76656C76666C76666D77666D77666D77666E78 676E78676E78666E77676E78676F78676F78686F79676F78686F7969707A69707A69707A69707A 69707A69707A69707A69707A6A717B69717A6A717B69717A69717B69717C69717B69717C6A727C 6B727C6A727C6B727C6B727C6A727D6B727D6A727C6A727D6B727D6A727D6B727D6B727D6A727C 6B727D6A727C6A727C6A727D6A727C6A727D6A727D6B727D6A727D6B727D6B727D6A727D6B727D 6A727C6A727C6B727C6A727C6B727C6B727C6A727C6B727C6A727C69717C6A717C69717C6A717C 6A717B69717A6A717B69717A69717A69707A68707A69707A69707A69707A69707A686F79686F79 686F79686F79686F79686F79666E77676E78666E77666E77666D77666D76656C76656C76666C76 656C76656C76656B75646B75646B75646B75636A74646A74636A74636A74636973626972626972 6269726168716168716168706067716067706067706067706066705F666F5F666F5F656E5E656E 5E656E5E646D5D646D5D646D5D646D5C636C5D636C5C636C5B626B5C626B5B616A5B616A5B616A 5A60695A6069596068595F675A5F68585F67595E67595E67585E66585E66585D66585D66575D65 575C65575C65565C64555B63565B64555B63545A62545A62535A61535A62535961545961525961 53596153586052586052586051575F51575F51565E50565E51565E50555D50555D50555D4F545C 4F545C4F545C4E545B4F545C4F545C4F545B4E545B4F545C4F545C4E545B4F545B4E535B4D535A 4E535A4D535A4D525A4D525A4C52594D52594C52594C51584C51584B51584C51584B50574A5056 4B50574A50564A50564A4F564A4F564A4F564A4F56494E551C242B1C242B1C242C0E1013030202 0606060606060503039E9C9BFFFDF9F6F3EFF6F3F0F6F4EFC7C5C3B3B1B09492917A7877777676 6E6F6E5F6160575A5725272A1114191214191110170C0C1217181A3A423F9197998E8E8F000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000121212B0B0B47E7F817878793D3D3E0D0F101A1B1E 1B1C205F5D5F7A78788380818986878E8B8D908E908F8F908D8A8CCBC7C7F5F1EEF2EFEBF4F1ED F5F2EFFCF9F6928F8A020303060606050606050303090A0A1B22291D252C1C242B494E55494E55 494E554A4F564A4E564A50564A50564B50574B50574B50574B50574B51574B50574C51584C5158 4C52594C52584D525A4D525A4D525A4E535B4E535A4E535A4E545B4F545B4F545B4F555C4F545C 50555C50555C50555D50565E51565E51575F51575F52575F52575F52575F52575F52585F535860 535960535960535961545A61545961545A62545A62555A63555A63555B63575C64565B64575D65 575D65575D65585D66575E65585E66585E66585F67595F67595F67595F685A60685A60685A6069 5A61695B61695B61695C626B5C626B5C636B5C626B5D636C5D636C5D636C5D646C5E656D5E656E 5E656D5F666F5F666F5F656F60677060666F606670616870616770616870616871626871626972 626871626872636A73636973636A74636A74646A74646B75646B74646B74656C75656C75656C75 666D76666C76666D76666D76666D76676D77676D77676E78676E78686F79686E78686F7969707A 68707969707A68707968707969707A69717A69707A69707A69707A6A717B6A717B6A717B6A727B 6A717C6A727C6A727C6A717C6B737C6B727C6B727C6B737C6B727C6B737D6B737D6B737E6B737D 6B737E6C747E6B727D6C747E6C737D6C737D6C747D6C737D6C747D6C747D6C737D6C747D6C737E 6C737E6C747E6C737E6C747E6C747E6C737D6C747E6C737D6C737D6C747D6C737D6C747D6C747D 6C737D6B737D6B727D6B727D6B727D6B727D6B727D6B727D6C737D6B727C6C737D6C737D6A727C 6B727C6A727C6A727B6A717B6A727B6A717B69707A69707A69707A69707A69707A69717A686F79 687079687079686F79687079686E78686E78686F78676E78676E78676E77676E78666D76666D77 666D77666C76656C76656C75656C75656C75656B75646B74646B74646A74646B74636973636972 636A7362687262697362697262687161687261677061677060677060667060676F60676F5F656F 5F666E5F656E5E646D5E646D5E646D5D636C5D636C5E646D5D636C5D636C5D626B5C626B5C626B 5B626A5B61695A60695A61695A6068595F68595F68595F67595F67585E67585F67585E66575E65 575E65575C65565D64565C64565B64565C64555B63555C63555B63545B63545B62545A62545A62 53596153596153586053586052585F52575F52575F52575F52575F51575E51565E51565E50565E 50555D50555D50555D4F545C4F545C4F545B4E535B4E545B4E535B4E535A4E535A4D525A4D535A 4D52594C51584C51584C51584C51584C51584C51584B50574B50574B50574B50574B50574A4F56 4A4F564A4E56494F55494E55494D54494D541C242B1C242B1C242C0E1013030202060606060606 0503039F9C9BFFFDF8F6F3EFF7F4F0F7F4F0C7C4C3B2B0AE9592907C7A787878756E6F6D60615F 56585625262A11131A13141A1010160C0D1017171A373E3C8F95958E8E8E000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000101012ACACB17C7D7E7A7A7B4041410D0D0F191A1D1B1C205F5D5F 7B787A8481818A86878E8A8B918F91908E918D8B8CCAC7C5F6F3EFF4F1EDF4F1EEF6F3EFFDFAF6 93908D020302060606050606050303090A0A1B22291D252C1C242B494D54494E55494E554A4F56 4A4E564A4F564A50564A4F564A50564B50574B50574B50574B50574C51584C51584C51584C5158 4C52594C52594D525A4D525A4E535A4E535A4E545B4E535B4F545B4F555C4E545C4F555C4F555C 4F555D50555D4F555D51565E51565E51575E52575F52575F52585F52575F535860535860535860 535961535961545961545A62545A62545A62555A63555B63555B63565B64565C64565C64565D64 565C65575E65585E66585E66585F67595F67595F67595F68595F685A60685A60685A61695B6169 5B61695B626A5B616A5C626B5C626B5C626B5D636C5D636C5D636C5E646D5D646D5E646D5D646D 5E656E5F656F5E656F60666F60666F606770606670616870616871606771626971616871616871 626872626972636972636973636A73646A74646B74646B74646B74656C75656B75656C75656C75 666C76666C76666D76666D76666D76676D77676D77666E78676E78676E78676E78686F78676F79 687079687079686F7968707969707A69707A69707A69707A69707A69707A6A727B6A717B6A727B 6A727B6A717B6A727C6A717C6A717C6A717C6B727C6B727C6B727C6A727C6B727D6A727C6B727D 6B727D6B727D6B727D6B727D6B737D6B727D6B737D6B737D6B737D6B737D6B737D6B737D6C737D 6B737D6B727D6B727D6C747D6B727D6B737D6B737D6B727D6B737D6B727D6B727D6B727D6B727D 6B727D6B727C6B727C6B727C6B727C6B727C6A727C6A717C6A717C6A717C6A727B6A717C6A727B 6A727B6A717B69717A69707A69707A69707A69707A69707A686F79687079686F79687079687079 686F79686F78686E78676E78676E78676D77676D77676D77656D76666D76656C76656C76656C75 646C75656B75656B75656C75646B74646B74646B74626973636A72626972626972626872616872 62687162687161687161677061687060677060666F60676F60666F5F656F5F656E5F656E5E646D 5E646D5E646D5E646D5D636C5D636C5C626B5C626B5C626B5B626B5B626A5B616A5B61695A6169 5A60695A60685A6068595F68595F68595F67585E67585E66585E66575D65575E65575D65575C65 565D64565C64565B64555B63555B63555A63555A63545A62545961535961535961535961525860 53586053586053586052575F52575F51575E50565E51575E50565E50565E50555D4F555C50555C 4F545C4F555C4F545B4F545B4E545B4E535B4E535A4E535A4D525A4D525A4D52594D52594C5158 4C51584C51584C51584C51584B50574B50574A50574A50574A50564A4F564A4F564A4F564A4E56 494F55494E55494D54494D541C242B1C242B1C242C0E1013030202060606060606050606A09E9C FFFDF9F5F3EFF6F3F0F7F5F0C6C5C3B3B1AF9594917B79757A7A756F6F6D5F6160585A5726272B 12141A1214191113160D0D12151718363F3C8D9494858585000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000121212ADAEB48080827879793F40400D0D101A1A1D1C1B215F5E5F7C797A868284 8A87878E8B8B918F90908F918D8A8BCAC6C4F6F3EFF3F0ECF4F1EDF5F2EFFCFBF7918E8B030302 060606050606050303090A0A1B22291D252C1C242B484D54484D54494E55494E54494E56494E55 4A4F564A4F564A4F564A50564B50574B50574B50574C51584C51584C51584C51584C51584D5259 4D52594D525A4D52594D535A4D535B4D535A4D535B4E545B4E545B4E545C4E545B4F555C50555D 4F555C51565E51565E50565D52575F51575E51575E51575F52585F52575F52575F535860535860 535961545961535961545A62545A62545A62555B63555B63555B64565C64565C64565C65575C65 575D65575E65585E66585E66585F66585F67595F67595F685960685960685A60695A61695A6169 5B61695B61695B626A5B626A5C626B5C636B5D636C5D636C5E646D5E646D5E646D5E646D5E656D 5F656E5E656E5E656E5F666F5F666F60677060677060676F606771616871616871626872616871 636972636972626972636973636A73636A73636A73636B73646A74646A74656C75646B75656C75 666C76656D76666D76656D76666D76666D77666E77666E78666E78686E78676E78686E78686F79 676F78686F79686F78686F7868707A68707968707A68707A69707A69707A69707A69717A69717A 69717A69717A6A717B6A717C6A717B6A717C6A717C6B727C6B727C6B727C6B727C6A727B6B727C 6A727B6A727B6A727C6A727B6B727D6B727D6B727C6B727D6B727C6B727C6B727D6B727C6B727D 6B727D6A727B6B727D6A727B6B727C6A717B6A727B6A717B6A717B6B727C6A717B6B727C6B727C 6A717B6A717C6A717B6A717B6A717C6A717B69717B69717B6A717B69707A69707A69707A69707A 69707A68707968707968707A686F78686F79686F79676F78676F79676F78676E77676E77666E77 666E77666E77676D77666D76666D76666D76666D76666C76666C76656C75646C75656B75646B74 636B73636B74636A73636A74626973626972626972626972616871626871616871616771616771 60676F61677060676F5F666E5F656E5E656E5E656E5E646D5F656E5D646D5E646D5E646D5D646C 5D636C5D636C5C636B5C626B5C626A5B626B5B616A5B616A5A61695A60695A60695960685A6068 595F67585F66585F67585E66585E67575E66575E65575D65565C64565C64565C64565C64555B63 555B63555B63545A62555A63545A62545A6254596153596153596152586053586052585F51575F 51575F51575F51575F50565E50565D50565E50565D4F555C50555D4F555C4F545C4F545C4E545B 4F545B4D535A4D535A4D535A4D535A4D51594D51594D52594C51584D52594C51584C51584C5158 4B51574B50574B50574A50564A50574A4F564A4F56494E564A4E564A4E56494E54494E55484D54 484D54484D541C242B1C242B1C242C0E1013030202060606060606050606A09F9DFFFDF9F6F3EF F6F4EFF7F4F0C5C4C1B2AFAE9694917C7A757B7B776F706C5E6260555A5925272B12141B131419 1010160D0C1217191A38413E8E9393868689000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 121212ACAEB57D7D7F797B7B3F3F400D0D0F19191D1C1D215F5F5F7D7A7B8783848A87888E8B8C 928F91928F928D8A8BC7C4C2F6F3EFF4F0EDF4F1EEF5F2EEFDFAF7918E8B020202060606050606 050303090A0A1B22291D252C1C242B484D54484D54494E55494E54494E55494E55494E554A4F56 4A4F564A50574A50574B4F574B50574B4F574B50574B51574C50584C51584C52584C52594D5259 4D525A4D525A4D525A4D535A4D535A4E535B4E545B4E545B4E545C4F555C4F555C4F555D4F555C 50565D50565D50565D51565E51565E51575F51575F525860525860525860525860535961535961 535961535961545961545A62555B63555A63555B64555B64565B64565C64565C64575C65575C65 575D65575D65585D66585E67585E66595F68595F685960685A60695A60685A61695A61695B6169 5B616A5B626B5B616A5C626B5C626B5C626B5D636C5D636C5D646C5D646C5D646D5E656D5E656F 5E656F5F656E5F666F5F666F5F666F5F667060666F606771616871616871616871616871626972 626872626972626972636973636A74636A73636B74636B74646B75646B75646C75646C75656B75 656C76656B75656C76666D77666C76666D77666E78666D77666E78676D77676D77676D77676E78 676E78676E78686F79686E78686F7968707A68707968707A68707968707969707A69707A69717B 69717B69707A69717B69707A6A707B6A717B6A707B6A717B6A717B6A717C6A717B6A717C6A717C 6A707B6A727C6A717B6A717B6A727C6A717B6A727C6A727C6A727B6A727C6A727B6A727B6A717B 6A727B6A717B6A717B6A727C6A707B6A717C6A717C6A717C6A717C6A717C6A717C6A707B6A717C 69707A69707A69717B69707A69707A69707A696F7A69707A686F79686F79686F79686F79686E78 686E78686F79676E78676F79676F79676E77676E78676E77676E77666E78666E77666D77666D77 656C76656D76656B75656B75656C75646B75646C75646B74646B75646B74636B74636A74636973 62697362697262687262697261687161687261687161687161687160677060677060666F5F666F 5F656E5F656E5F666F5E656E5E656E5E656E5D646D5D646D5D646D5D636C5D636C5C636C5C626B 5C616A5C626B5B616A5B626B5B616A5A60695A61695A5F68595F68595F68595E67595E67585E66 585F67585D66585E67575E66575D65565C65565C64565C64565C64555B63555B64555B63545A62 545A6354596153596153596153586053596052586052586052585F52586051575F51565E51575F 51565E50565D50565E50555D4F555D4F555D4F555C4F555C4E545B4E545B4E535B4D535A4D535A 4D535A4D535A4D525A4D525A4D525A4D525A4C52594C51584C51584B50574B51584B4F574B4F57 4A50574A4F564A50574A4F56494E55494E56494E55494D54494D54494D54484D54484D54484D54 1C242B1C242B1C242C0E1013030202060606060606050606A09F9DFFFCF9F6F3EFF6F3F0F7F4F0 C5C3C1B2AFAD9896917E7B787D7C796D6F6B5E615E565A5924272B12141A1314191113170D0D12 15171839403E94989A878789000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000121212B2B3B9 797B7C7B7C7B3F3F400F0F1218191B1D1F216262637D7A7B8884848B88888E8C8E929092929091 8D8A8AC7C4C1F6F3EFF2EFECF3F0EDF5F2EFFDFCF794918E020302060606050606050303090A0A 1B22291D252C1C242B484D54484D54484D54494E54484D54494E55494E55494E564A4F56494E56 494F564A4F564A4F574B4F574B50574A50574C50584B50584B51584B51584B51584C51594C525A 4D525A4C525A4D535A4E535B4E545B4E535B4E545B4F555C4E545C4F555C4F555C4F555D50555D 4F555D50565D51565E51565E51575F51575F52575F525860525860525860525860535961535961 545961545A62545A62555A63555A63555B63555B63565B64565C64565C64575D65575C65575E65 575E65575D66585F66575E66585E67595F67585F685960685A60685960695A61695A60695A616A 5B616A5B616A5C616A5C626B5C636C5D636C5C636C5C636C5D646D5D646D5D646D5E656E5E656E 5E656E5F656E5F666F5F666F60666F60676F606770606770616871606771616871616871616872 626872626972626972636973636973636A73636A74646A74636A74636B75646B75646B75656B75 656B75656B75656C76666C76666C76666C76666D77666D77666D77676E77676D77676E77676F78 666E78686F78676E78676E78686F78676F79687079687079676F79687079686F7A686F7A696F7A 686F7A696F7A69707A68707A69707A68707A68707A68707A69707B69707B69707B6A707B69707B 6A707B6A707B6A717B6A707B6A717B6A717B69707B6A717B69707B69707B6A707B69707B6A707B 6A707B6A707B6A707B6A707B69707A69707B69707A68707A68707A69707A68707A696F7A696F7A 696F7A696F7A696F7A686F79686F79686F79686E78686F79686F78686E78686F78676F78666E78 676F78666D77666D77676E77656D77666E77666D76656D77666D76656C76646C76656B75646B75 656B75646B75636B75646B75636A74636A74626A73626A73626973626973626972626972626972 6268726269726168716168716168716067706067705F666F5F666F5F666F5F666F5F656E5E656E 5E656E5E656E5E646D5D646D5D646D5D636C5C636C5C636C5D636C5B626B5C616A5C616A5B616A 5B616A5B60695A60695A60695A5F68595F68595F68595F67595E67585F66585F66575D66575E65 565D65565C65575D65565C64565C64565C64555B63555B63545A63545A63545A62545A62545961 53596153596153586052586052586051575F51575F51575F51575F51565E50565E50565D50565D 50565D4F555C4F555C4F555C4E545C4E545B4E545B4D535B4E535B4D535A4D535A4D525A4D525A 4D525A4D51594C51584B51584C50584B50584B50584B50574A50574B4F574B4F574A4F564A4F56 4A4F564A4E56494E55494E55494E55494E55494E54494D54484D54484D54484D541C242B1C242B 1C242C0E1013030202060606060606060606A19F9CFFFCF8F5F2EFF6F3EEF8F5F1C5C3C0B0AEAB 9895927E7E7A7D7C7B70706D5E615E555A5825282B12121A13121A1212170C0D10151819383F3D 919597898787000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000121212A9AAAE76787A7C7D7D 3D3D3E0D0D101A1A1D1D1E216262637E7B7C8985868C88898F8C8D928F91918F908D8A8BCAC6C3 F7F3EFF3F0ECF3F0ECF5F2EFFDFCF894918E020302060606050606050303090A0A1B22291D252C 1C242B484D54484D54484D54484D53484D54494E54494E54494E55494E55494E56494F564A4F56 494F564B4F574B50574A50574B50574B50584B50584C51584B51584D51594D51594C525A4D525A 4C525A4D535A4D535A4D535B4D535A4E545B4E545B4E545B4F555C4F555C50555D50565D50565D 50565D51565E51565E51575F52575F51575F525860525860525860535860535961545961545961 545A61545A62545A62545A62555B63555B62565B64565C64565C64575C65565C65565D65565D65 575D66575E66575E66585E66585E67585F67595F67595F685960685960695A60695B60695A616A 5C616A5C616A5B626B5C626B5C636C5C636C5D636C5D646D5D646D5E646D5D646D5E656E5E656E 5E656E5E656E5F666F5F666E5F666F5F666F60676F606770606770616871616870616871626872 626972626972636973636973626A73636A73636A74636A74646A74636B75646B75646B75646B74 656B75646C75646C75666C76656C75666C76666D77656D77676D77666D77666D77666D77666E78 666E78666E78676E78676E78676E78676E78676E78676F78676F79676F79686F79686F7A696F7A 696F7A686F7A696F7A68707A686F7A69707A68707A69707A69707A68707A69707A68707A68707A 68707968707A68707968707968707968707968707968707969707A68707969707A69707A69707A 69707A69707A69707A68707A696F7A68707A686F7A696F7A686F7A696F7A686F79676F78686F79 676F78676F78686F79676E78686E78686E78666E78676E78666E78666D77666D77666D77666D77 666D77656D76656D77656D76656C75656C76646C75646C76646B75656B75636B75646B75646B75 636A74646A74636A74626A73636A73626973636973626972626972626872616872616871616870 60677160677060676F5F666F5F666F5F666E5F666E5F666F5E656E5E656E5E656E5E646D5D646D 5D646D5D646D5C636C5D636C5C636C5C636C5C626B5B616A5C616A5B616A5A60695B6069596068 5960685A5F68595F67595F68595E67585E67585E66575E66575D66565D65565D65565C65565C65 565C63565C64555B63555B62555B63545A62545A63545A62545A62535961535961535961525860 53586052586052586052575F51575F51575F51575F50565E50565D50565D4F555D4F555C4F555C 4F555C4E545B4E545B4E545B4E545B4D535A4E535B4D53594D525A4D525A4D525A4D51594D5159 4C51584B51584C50584B50584B50584B50574A50574B4F574B4F57494F564A4F56494E55494E55 494E55494E54494D54494D54484D54484D54484D54474C53474C531C242B1C242B1C242C0E1013 030202060606060606060606A09F9CFFFCF8F4F1EEF5F2EEF7F4EFC4C2BFAEADAB9895937F7C7B 7C7C7C70706E5E625E585C5A25272B1213191313181112160C0C12141619383F3C989B9C8A8A8B 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000121212AAABAE7C7D7F797A7B3E3D3F0D0D10 18191C1E1E226362637E7B7C8986868C8889908C8D929091918F908D8A8AC9C5C2F6F3EEF4F1ED F3F0EDF4F1EEFDFBF8928F8C020202060606050606050303090A0A1B22291D252C1C242B474C53 484D54484D54484D53484D54484D54494E54494E55494E54494E56494F56494E56494F564A4F56 4A4F564A4F564A4F574B50574B50574B50574B50584C51584C51584C51584C51594D52594D5259 4D53594D525A4D535A4E545B4E545B4E545B4E545C4F555C4F555C4F555D4F555C50565D50555D 50565D51565E51565E51575F51565E525860525860525860525860535860535961535961535961 545A62545A63555A62555B63555B63555B63555B63565C64555C64565C65565D65565D65575D66 575E66575E66585E67585E66585F67595F68595F675960695A60695A60695A616A5A60695B616A 5B616A5B616A5B616A5C626B5C626B5C626B5D636C5D636C5D636C5D636C5E646D5E646D5E656E 5E646E5F666E5F666E5F666F5F666F606770606771606770616871616870616870616771626971 626871626871626973626872626973626A73626973636A74636973636A74636B75646A74646B75 646C76646B75646C76656B75656B75646B75656C76656C76656C76656D77656C76666D77666E78 666E77666E78666E77666E77676E78676E78676E78676E78676E78676F79676E78676E78686F79 686F79676E78686F79686F79686F79686F79686F79686F79686F79686F79686F79686F79686F79 687079686F79686F7A686F7968707A686F7A686F79686F7A687079686F79686F79686F79686F79 686F79686F7A686F79686F7A676F79686F79676F79676E78676E78676F79676E78676E78676E78 676E78666E78666D77666D77656D77666D77656C76656C76656D77656C76656D77656D77656C75 656C76656C75646C75646C76646C75646B75646B75636A74636B75636A74636973636973626973 62697362687262687262687162687161677161677161677061677060667060677060667060676F 60676F5F666F5F666E5F666F5F666F5E656E5E656E5E656D5D646C5D636C5D646C5D636C5C626B 5C636C5C626B5C636C5B626B5B616A5B616A5A60695A60695A60695A6069596069595F68595F67 585F68585E67585E66575D66575D66565D65565D65565D65565C65565C65565C65565C63555B64 555B63555B62555B63545A62545A62545A6253596153596153586053586052586052575F52575F 51565E51565E51565E51565E50555D50555D50555D4F545C4F545C4F555C4F545C4E545B4E545B 4E545C4E545B4D535B4D535B4D53594D535A4C52594C52594C51584C51584C51584B50584B5158 4B50574B50584A50574A4F574A4F574A4F56494E56494F56494E55494E56494E56494D54494E55 484D54484D54474D54484C53474C53474C53474C531C242B1C242B1C242C0E1013030202060606 060606060606A19F9CFFFCF8F4F1EEF5F2EFF7F4F0C3C2C0AFADAC9A9894827F7C7D7D7B6F6E6E 5D615F5A5E5C25272B1010191313191012160D0D1317171B383F3C8C9293858687000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000101012A9AAAE7F80817B7D7C40414110101219191D1E1F23 6464637E7B7B8A87878C8889908C8D928F91928F908D8989C7C4C1F7F3EFF4F0EDF3F0EDF4F1EE FDFCF9918E8B020202060606050606050303090A0A1B22291D252C1C242B474C53474C53484D53 474C53484D53474D54484D54484D54484D54484E55484E55494E56494E564A4F564A4F564A4F56 4A4F574A4F574B50574B50574B50584B50584C51584C51584C51584C52594D53594D52594D535A 4D525A4D525A4D535B4E535B4E535B4E545C4F545C4F545C4F545C50555D4F555D50555D50555D 50565E51575F51565E51575F52586052575F525860535860535860535961535961545961545961 545A62545A62555A62555B63555B63565B63555C64555C64565C64565D65575D65575D65575D66 585E66575E66575E66585E67585F67585F67595F68595F685960695A60695B616A5B616A5B616A 5B616A5C626B5C626B5C626B5C626B5D636C5D646C5D636C5D646C5E656D5E646D5E656E5E646E 5F656E5E656E5F656F5E656F5F666F6066705F6670616770616770606771616771606771616871 626972616871626973626973626973636A74636973636973636A74636A74636A74646A74646A74 646B75646B75646B75646B75656B75646B75656C76656D76656C76666D76666D76656C76666D76 656D77656D77656D77656D77656D77666E78676E78666E78676E78676E78676E78676E78676E78 676E78676E78676E78676E78686F79676F78676E78686F79686F79686F79686F79686F79686F79 676F79686F79676F79676F79686F79676F79686F79686F79666E78686F79666E78666E78676F79 666E78676F79676F79676E78676E78676E78676E78676E78676E78666D77666D77666D77666D77 666C76666C76656C76666C76656C76656C76656D76656C76656C75656C75646B75646C75646B75 646B75636A74636A74636A74636A74636A74626973636973626973626973626872626872626871 62687162687161677161677161687061677060677060677060667060676F60666F5F656F5E656E 5F656E5D646E5D646E5E646D5D646D5D636C5D636C5C636C5D636C5B626B5B626B5C636C5B616A 5B626B5B616A5B616A5A616A5A60695A60695A6069595F68595F67595F67585E67585E66585E66 585E66575D66575D65565D65565C65565D65555C64565C64565C63545B63555B63545A62545A62 535A6253596153596152596153596152586053586052586052586052575F51565E51565E51565E 51565E50555D50555D50565D50555D4F555C4F555C4F545C4F555C4E535B4E535B4D535B4E535B 4D525A4C52594D52594C52594C51594C51584B51584C51584B50584B50584B50584A50574A5057 4A50574A4F564A4F57494E56494E56494E56494E55494D54494E55494D54484D54484D54484C53 474C53484C53474C53474C53474C531C242B1C242B1C242C0E1013030202060606060606060606 A19F9DFFFCF7F4F1EDF5F2EEF7F4F0C4C1BEAEACA99B999682817D7D7D7B6F716E5E635F595D5B 26272C1112191114181013160D0D131617183B423F909497858587000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000121212AAAAAD7D7C7D7E808042424210101219191C1E1F226363637D7A7A 8B87888C88898F8C8C928F90918F908F8B8BC8C5C2F6F2EFF4EFECF4F1EEF4F1EEFCFBF8908C8A 020202060606050606050303090A0A1B22291D252C1C242B474C53474C53474C53474C53474D54 474D54484D54474D53484D54484D54484E54494E55494E55494E56494E56494F554A4F56494F55 494E55474D54454A5042474D444A50444A50444A51454B51454B51454B52454B51464B52464B52 474C53464C53474C53474C53474C53484D54474D54474D54484E55484D54484E55484E554B5157 4D535A4F555C50565D52575F51585F51575F51575F4F555C4D5259494E554B52594C51594C525A 4C52594C52594D535B4D525A4D535B4E545C4E545C4E545C4E545C4E555D4E555D4F555D4F555D 4F565E50565D50565E50575E51575E545961555C63585E66595F685A60685B616A5A6069596068 575E66545A6251575E535A62545A62545A63545B63545B63545B64545B63555C64555C64565C65 555C65575D65575D65565C65575D66575D66575D66575E67575D66585F67585F675A61695D646D 5F666E6068706268726269726268726167715E656E5C616A575E665A616A5A60695A616A5A616A 5A616A5B626B5B616A5B626B5B626B5B626B5B636C5B636C5B636C5B636C5C636C5C636C5C636C 5C636C5C636C5C646C5C646C606670616971656B75666D77666E77676E78656D76646C75626973 5E656E5A61695D656E5D656D5D656E5D656D5D656D5D656E5D656D5D656E5D656E5E656E5D656E 5E656E5E656E5D646D5E656E5D646D5D646D5D656E5D646D5D646E5D646E5F676F626973646B74 656D76676E78666E77656C76656B756169725F656E5960685C636C5C636C5C636C5C636C5C636C 5B636C5B626B5B636C5B636C5B626B5B626B5B626B5B626B5B626B5A616A5A616A5A616A5A6169 5A616A5A61695961695C636C5E656D6167706268726168716268726067705F666F5C636C595F67 555B63575E67575E66575E66575E66565D65565D65565D65565D65555C65565C65555C64565C64 555B64545B63555B63545A62545A62545A63535962535A62535A62555B63575E66595F67596068 5A6069596068595F68585E67555C6452575F4E545B50565E50555D4F565E4F555C4F555C4E555D 4E545C4E545C4E545C4E545C4E545C4D535B4D535B4D535B4C525A4C525A4C525A4C52594B5259 4B51584B51584E535B4F555B51565E51575F51575E51565E50565D4F555C4D535A4A4F55464C52 484E55484E54474D54474D54474D53474D54474C53474C53464C53474C53464B52464B52464B52 454A51464B51454A51444950444A51444950444A50444950454B51474C53494E54494E554A4F56 494E55494E56494E56484E55494E55484D54484D54474C53474D54474C53474C53474C53474C53 474C53474C53464B521C242B1C242B1C242C0E1013030202060606050505060606A3A19FFDFBF6 F4F1EDF5F2EEF7F4F1C2C1BEADABA89C9A9582817D7C7C7971726F616361595C5927282C111219 1213181112160D0F12161818363D3A8C9092818181000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000101010A7A6AA7D7D7E7D7C7E3F3F410D0F1018181B1F1F236363637C7A7B8B87888C888A 8F8C8C928F8F918F8F918D8DC9C4C4F4F0EDF3EFECF4F1EDF5F2EEFCFAF8928F8C020202060606 050606050303090A0A1B22291D252C1C242B464B52474C53474C53464C53474C53464C53474C53 474D54474D54484E55484E55484D54494E56494E55494E55494F56494E55494E55474D54454B52 5E61658182849596969A9A9B999A9A999A9A9B9B9B9B9B9B9B9B9C9B9B9C9C9C9D9D9D9E9D9D9E 9E9E9F9E9E9E9E9E9F9F9F9F9F9F9FA0A0A1A1A1A1A1A2A39F9F9F898B8D65696D4D525A4E545C 4F555D50565E51575F50565E4F555D4D5359676A6F8E9091A6A6A6A9AAAAA9AAAAA9AAAAABABAC AAABABACACADACACADADADAEAEAEAFAFAFB0AFAFB0AEAFAFB0B0B1B0B1B1B0B1B1B2B2B2B1B2B2 B3B3B4B0B0B0999B9D6F7378555B64565C65585E665A60695A6069595F68585E67555B6373777C 9D9FA0B6B7B7BABBBCBBBBBBBBBBBBBBBBBCBCBCBCBDBDBEBDBDBEBEBEBFBEBEBFBFBFC0BFBFC0 C0C0C0C0C0C1C0C1C1C0C1C1C2C2C3C1C2C2C3C4C5C0C0C0A6A9AB787D825C636C5D646E5F6670 6067716168726066705D646E5B626B7B7F84A9ABADC4C5C5C9CACBC8C9C9C8C9C9CACACBC9CACA CACACBCBCBCCCBCBCCCBCBCCCCCCCDCCCCCDCBCCCCCCCCCDCCCDCDCCCDCDCDCDCECDCECECDCECF CBCBCBAFB2B47F838A616872626872646B75656D77656C76656B75626A745F677081858BB0B2B3 CCCCCCD0D1D1CFD0D0CFD0D0D0D0D1CFD0D0D0D0D1D0D0D1D0D0D1D0D0D1D0D0D1D0D0D1CFD0D0 D0D0D1CFD0D0CFD0D0D0D0D1CFD0D0D0D1D1CCCCCCB1B3B680858B606771626A74646B75656C76 656D77646B756168725E666E7F8389AEB0B2CACBCBCDCECFCCCDCDCCCDCDCDCDCECBCCCCCCCCCD CCCCCDCCCCCDCCCCCDCBCBCCCACACBC9CACACACACBC9CACAC8C9C9C9C9CAC8C9C9C8C9CAC5C5C5 A8ABAD7B7F855E646E5E646E6066706168716167716066705D646E5A616A797D82A5A7A8BFC0C0 C2C3C4C0C1C1C0C1C1C0C0C1C0C0C0BEBEC0BDBDBFBCBCBEBCBCBEBBBBBDBBBBBDBABABBBABABC BABABBB9B9BAB8B9BAB8B9B9B8B8BAB5B6B69B9DA071757B565C64575E67585F68595F68596069 575D66555C645359616F7277969899AEAFAFB0B1B2AFB1B1AEB0B0AFB0B0ADAFAFADAEAFADAEAF ADADAEACACADACACADABABACAAABABAAAAABA9AAAAA8A9A9A9A9AAA7A8A8A8A9A9A4A4A48C8E90 666A6F4E535B4F545C50555D51575F51565E50555D4D535B4B515865686C86898A9D9E9EA0A1A2 9F9F9F9E9E9E9E9E9F9D9D9D9D9D9E9C9C9D9C9C9D9C9C9D9B9B9C9B9B9C9A9A9A9A9A9A999A9A 999A9A9999999798989898999595957F81835D6065464B52474D54494E55494E55494E56484E55 484D54484E54484D54484D54484D54484D54474D53474D54474D54474C53474C53474C53464B52 464B521C242B1C242B1C242C0E1013030202060606050505060706A3A19FFDFAF7F5F2EEF5F2EE F7F4F0C2C0BEADABA89B999483817E7E7D7A71716E5F6260595C5A26272B111019111218111217 0D0F12161819333B388D9294838585000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000101010 A3A4AB797B7C7E7E803E3E3F0D0D0F1A191B1E1F226262637D7B7C8A87898C888A908C8D918E8F 91908F918E8CC8C5C3F2EFEBF2EEEAF3F0ECF5F1EEFEFBF8969490030202060606050606050303 090A0A1B22291D252C1C242B474B52464B52464B52474C53464C53474C53474C53484D54474C53 484D54484E55484E54484E55494E55494E55494E55494F55484E55464B525B5F63909293959696 969797969797969797979898989999989999989999999A9A9A9B9B9A9B9B9A9B9B9B9B9C9C9C9D 9C9C9D9D9D9E9D9D9E9E9FA09E9E9F9FA0A19FA0A1A0A0A19D9D9E696D714D525A4F545C51565E 50565E50555D4D535A64686DA0A2A2A4A5A6A5A6A7A6A7A8A6A7A8A7A8A9A7A8A9A8A9AAA8A9AA A9AAABAAABACAAABACABACACABACACACADADADAEAEADAEAEAEAFAFAFAFB0AEAFAFB0B0B1B1B1B2 B0B1B1AEAEAF74787D555B63575D65585F685A6068575E67555C646F7378B0B2B2B6B6B7B7B7B8 B7B7B8B7B8B9B8B9BAB8B9BAB9BABBB9BABBB9BABBBABBBCBABBBCBBBCBDBBBCBDBCBDBEBCBDBE BDBEBFBEBFC0BFC0C0BEBFC0C0C1C1C0C1C1C0C1C2BDBDBE7E82875C636C5E646E616771606771 6066705C636C787C82BEC0C0C4C5C5C5C6C6C5C6C6C5C6C6C5C6C6C6C7C7C6C7C7C7C8C8C7C8C8 C7C8C8C7C8C8C8C8C9C8C8C9C8C8C9C9C9CAC9C9CAC9C9CAC9CACBCACACBCACBCCCACBCCCACACB C6C6C884898F626972636A73646C76656C76636A745F67707C8187C5C7C7CBCCCDCBCCCDCBCCCD CBCCCDCBCCCDCBCCCDCBCCCDCBCCCDCBCCCDCBCCCDCCCDCECBCCCDCBCCCDCBCCCDCBCCCDCBCCCD CBCCCDCCCDCECBCCCDCCCDCECCCDCECBCCCDC8C8CA84898E616872636973656C76646C76636A74 60666F7C8186C4C5C5CACACBCACACBC9C9CAC9C9CAC9C9CAC9C9CAC9C9CAC9C9CAC8C8C9C8C8C9 C7C8C8C8C8C9C7C8C8C7C8C8C6C7C7C6C7C7C5C6C6C6C6C7C5C6C6C5C5C6C5C5C6C4C5C5C1C1C2 80858A5E646D5F666E6067716067705E656F5B626B767B80BBBDBDBFC0C1BFC0C1BEBFC0BEBFC0 BEBFC0BDBEBFBCBDBEBCBDBEBBBCBDBBBCBDBBBCBDBABBBCB9BABBB9BABBB9BABBB8B9BAB7B8B9 B8B9BAB7B7B8B7B8B9B6B7B8B6B6B7B2B2B376797E565C65575D66595F68585E67575D66545A62 6C7176AAACACB0B1B1AFB0B0AFB0B0AEAFAFAEAFAFADAEAEADAEAEACADADABACACABACACAAABAC AAABACA9AAABA8A9AAA8A9AAA7A8A9A7A8A9A7A8A8A6A7A8A6A7A7A5A6A6A4A5A6A1A1A26A6E73 4E535A50555C50565E50565D4E545C4B515962666A9B9C9C9F9FA09F9FA09E9E9F9D9D9E9D9D9E 9D9D9E9C9C9D9C9C9D9B9B9C9A9B9B9A9B9B999A9A999A9A989999989999989999979898989899 969797979798979798959696919192606368464B52484C54494E55484E55494E55484D54484D54 484D54474D54474D54474C53474C53474C53464C53474C53464B52474B52464B52454B521C242B 1C242B1C242C0E1013030202060606050505060706A3A19FFEFBF7F4F2EDF4F1EDF7F4F0C2C0BE ACABA69D9B9584817E7F7E7A71736F606461595D5B25272B1110171212161313170D0D1316181A 373F3C929698878789000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000121212A6A6AC7A7B7C 7E7E7E3F3E400F0D101B1A1D1D1D216361627D7B7C8A86888C8789908B8D928F8F939090908D8B C7C3C1F2EFEBF1EEEBF2EFEBF5F2EEFDFAF894918F020302060606060606050303090A0A1B2229 1D252C1C242B454B51464B52474B52464C53474C53464C53464C53474C53474D54474D53474D53 484D54484D54484D54484D54494E55494E55484C544549517E8082959596959596959596959697 95969796979896979897989997989998999A98999A999A9B999A9B9A9B9B9A9B9B9B9C9C9B9C9C 9C9D9D9C9D9D9C9D9D9D9E9E9D9E9E9FA0A09FA0A08C8E904C525A4D535B51565E50565E50545C 4C51598B8D90A4A4A5A4A4A5A5A5A6A6A6A7A6A6A7A6A6A7A7A7A8A7A7A8A8A8A9A8A9AAA8A9AA A9AAABA9AAABAAABACAAABACABACADACADAEACADAEACADAEADAEAFAEAFB0AEAFB0AFB0B1AFB0B1 9B9DA0535861565C64585F68585E67575D66545A62999B9EB4B5B5B5B6B6B5B6B6B6B7B7B6B7B7 B7B7B8B7B7B8B7B7B8B8B8B9B9B9BAB9B9BABABABBBABABBBABBBCBABBBCBBBCBDBBBCBDBCBDBE BCBDBEBDBEBFBDBEBFBDBEBFBEBFC0BEBFC0A9ABAD5B626B5D646E6067706067715F656E5B616A A6A8ABC2C3C4C3C4C5C3C4C5C3C4C5C3C4C5C4C5C6C4C5C6C4C5C6C5C6C7C5C6C7C5C6C7C6C7C8 C6C7C8C6C7C8C6C7C8C7C8C8C7C8C8C8C9C9C8C9C9C8C9C9C8C9C9C8C9C9C8C9C9C9CACAB1B3B6 61666F616872646B75646B756269735E656FADB0B3CACBCBCACBCBCACBCBCACBCBCACBCBCACBCB CACBCBCBCBCCCBCBCCCBCBCCCBCBCCCBCBCCCBCBCCCACBCBCBCBCCCBCBCCCACBCBCACBCBCACBCB CACBCBCACBCBCACBCBCACBCBCACBCBB1B3B6616771626973656B75646B756369735F656EACAEB1 C8C9C9C8C9C9C8C9C9C8C9C9C7C8C8C7C8C8C7C8C8C7C8C8C7C8C8C6C7C8C6C7C8C6C7C8C5C6C7 C5C6C7C5C6C7C4C5C6C4C5C6C4C5C6C3C4C5C3C4C5C3C4C5C2C3C4C2C3C4C2C3C4AAADAF5C626B 5E646D5F67705F656F5D646D596069A3A5A8BEBFC0BDBEBFBDBEBFBDBEBFBCBDBEBCBDBEBBBCBD BBBCBDBABBBCBABBBCBABABBBABABBB9B9BAB9B9BAB8B8B9B7B7B8B7B7B8B7B7B8B6B7B7B6B7B7 B5B6B6B4B5B5B4B5B5B3B4B49C9EA0555B64565D66595E67585E67575C6553586196989BAFB0B1 AEAFB0ADAEAFADAEAFADAEAFACADAEABACADABACADAAABACAAABACA9AAABA8A9AAA8A9AAA8A8A9 A8A8A9A7A7A8A7A7A8A6A6A7A6A6A7A5A5A6A5A5A6A4A4A5A4A4A5A3A3A48D8F924C51594E545C 50565E4F555D4E535B4B5058888A8C9E9F9F9E9F9F9D9E9E9D9E9E9C9D9D9C9D9D9B9C9C9B9C9C 9A9B9B9A9B9B999A9B999A9B98999A98999A979899979899969798969798959697959697959596 959596959596949495808385454A51474C54494E55484E55484D54484D54484D54484D54484D54 484D54474C53474C53464B52464B52464C52464B52464B52454B51464B521C242B1C242B1C242C 0E1013030202060606050505060706A3A19FFEFAF6F4F1EEF5F2EDF7F4F1C1BFBDACABA79F9D97 85837F7F7E7B73736E5F6461595C5B25262A1112181313161213160D0D12141618333D398F9398 858587000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000121212ABABAE8180827D7C803E3E40 1010121A1A1D1C1C206260617D7B7D8986888D888A8F8C8D928F8E9491908E8C8AC6C3C0F4F1ED F3F0EBF1EEEAF4F1EDFDFAF9938F8D030202060606050606050303090A0A1B22291D252C1C242B 454A51454A51464B52464C53464B52464C53464C53474C53474C53474C53474C53484D54484D54 484D54484D54484D54494E554549513C41478E8E90949495959596949595959596959596959596 96969796969797979897979898989999999A99999A99999A9A9B9B9A9A9B9B9C9C9B9C9C9B9C9D 9B9D9D9C9D9E9C9D9E9E9F9F9D9E9F9A9B9C454A504A4F574F555D50555D4C515942474E9C9D9E A3A3A4A4A4A5A3A4A4A5A5A6A4A5A5A5A6A6A6A7A7A6A7A7A7A8A8A7A8A8A8A8A9A8A8A9A9A9AA AAAAABAAABACAAAAABABACADACADAEACACADACADAEACADAEADAEAFAEAFB0AEAFB0ABACAD4A4F57 525860575E66585E66535962494E56ACADAEB3B4B4B4B5B5B4B5B6B5B6B6B5B6B7B5B6B7B6B7B7 B6B7B7B7B8B8B7B8B8B8B9B9B8B9B9B9BABAB9BABAB9BABBBABABBBBBCBDBBBCBDBCBCBDBCBDBE BCBCBDBDBDBEBDBEBFBEBEBFB9BABB535861595F685F666F5F666F5A606A4F555DBABBBCC1C2C3 C2C3C4C1C2C3C2C3C4C2C3C4C2C3C4C2C3C4C3C4C5C3C4C5C4C5C6C4C5C6C4C5C6C4C5C6C5C6C7 C5C7C8C5C6C7C5C7C8C6C8C8C6C7C8C6C8C8C6C7C8C6C7C8C8C9C9C7C8C9C2C3C4565C655D646D 626A74646A745D646E525860C2C3C5C9CACAC9CACAC8C9CAC9CACAC9CACBC9CACBC8C9CAC8C9CA C9CACBC9CACBC9CACBC9CACBC9CACBC9CACBC9CBCBC8C9CAC8CACAC8CACAC8C9CAC8CACAC8C9CA C8C9CAC9CACAC8C9CAC3C4C5575D665D646D626A74646A745D646E525860C0C1C3C8C9C9C8C9C9 C6C7C8C7C8C8C6C7C8C5C6C7C5C6C7C5C6C7C5C6C7C4C5C6C4C5C6C4C5C6C4C5C6C3C4C5C3C5C6 C3C4C5C2C4C5C2C4C5C2C3C4C1C3C4C1C2C3C1C2C3C1C2C3C0C1C2BCBCBE535961595F685E656F 5F656F5960694E545BB7B8B9BDBEBFBDBEBFBCBCBDBCBDBEBBBBBCBBBBBCBBBBBCBABABBBABABB B9BABAB9BABAB8B9B9B8B9B9B7B8B8B7B8B9B6B7B7B5B7B7B5B7B7B5B6B7B4B6B6B3B4B5B3B4B5 B3B4B4B2B3B4ADAEAF4D525A525860575E66575D66525861484D54A9AAABAEAFB0ADAEAFACADAE ADAEAFACACADACACADABABACAAAAABAAAAABAAAAABA9A9AAA8A8A9A8A8A9A7A8A8A6A7A8A6A7A7 A5A6A7A5A6A7A4A5A5A4A5A6A4A5A5A3A4A4A3A3A4A2A3A39D9E9F4449504B50574F555D4F555D 4B505841464C99999B9E9F9F9E9F9F9C9D9E9C9D9D9B9C9D9B9B9C9B9B9C9A9A9B9A9A9B99999A 99999A99999A989899979798979899969697969798969798959596949596949595949595949495 9394948E8F903E424944494F484D54484D54474D54474D54474C53474C53474C53474C53474C53 464B52464C53464C53454B52464B52454B52454A51454A511C242B1C242B1C242C0E1013030202 060606050505060606A3A2A0FEFBF6F4F1EDF5F2EEF7F4F1C1BEBDACA9A7A09E9985847F807F7D 7273715F6361555A572426291012171313181213160D0D1015171837403A8C9195808182000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000101012A6A6AB7B7B7D7C7B7D3F3F3F1010131A1A1D 1D1D1F6260617E7B7D8985878D898A918D8D93908F9491908E8B8AC6C1C0F5F2EDF3F0ECF2EFEB F4F1EEFCFBF88F8B89020202060606050606050303090A0A1B22291D252C1C242B454A51454A50 454A51454B52454A51464B52464B52464C53464C53474C53474C53474C53474C53474C53484D54 484D54484D544549513C4046919292929494929494949595939595959596969697969697969697 97979897979898989998989999999A99999A98999A9A9A9B9A9B9C9A9B9C9B9B9C9B9C9D9B9B9C 9C9C9D9C9D9E9D9D9E9D9E9F454A514A4F574F555D50555D4B515842474EA0A1A1A1A3A3A2A4A4 A3A4A4A2A4A4A4A5A5A5A6A6A5A6A6A5A6A6A6A7A7A6A7A7A7A8A8A8A8A9A8A8A9A9A9AAA8A9AA AAAAABAAABACAAABACAAABABABACADABACACACACADADAEAFADADAEAEAFB04A4E5651575F575D66 575D66535961494E55B0B1B2B1B3B4B2B4B5B3B4B5B2B4B5B4B5B6B5B6B7B5B6B7B6B7B7B6B7B7 B7B8B8B7B8B8B8B9B9B8B9B9B9BABAB8BABAB9BABAB9BABBB9BABBBABBBBBABBBCBBBCBCBBBCBC BCBCBDBCBDBDBEBEBF525861585F675E656F5F656F5960694F545CBEBFC0C0C1C2C0C1C2C0C1C2 C0C1C2C1C2C3C1C2C3C2C3C4C2C3C4C2C3C4C3C4C5C3C4C5C3C4C5C3C4C5C4C5C6C3C5C6C4C5C6 C4C6C7C4C6C7C4C5C6C4C6C7C4C5C6C5C6C7C6C7C8C5C6C7C6C7C8565B645C626B626A74626973 5D646E525860C7C8C9C6C8C9C7C9CAC8C9CAC7C9CAC8C9CAC8C9CAC7C8C9C8C9CAC8C9CAC8C9CA C8C9CAC8C9CAC8C9CAC8C9CAC7C9CAC8C9CAC7C9CAC7C9CAC7C8C9C7C9CAC6C7C8C7C8C9C8C9CA C6C7C8C7C8C9565C655D636C626A746369735D646D52575FC4C6C7C5C7C8C5C7C8C5C6C7C4C6C7 C5C6C7C5C6C7C4C5C6C4C5C6C4C5C6C4C5C6C3C4C5C3C4C5C3C4C5C3C4C5C1C3C4C2C3C4C1C3C4 C0C2C3C0C1C2C0C2C3C0C0C1C0C0C1C0C1C2BFBFC0BFC0C1535860585E675E656F5E646D595F69 4E535BBCBCBDBCBDBEBBBCBDBBBBBCBABBBCBBBBBCBBBBBCBABABBB9BABAB9BABAB8B9B9B8B9B9 B7B8B8B7B8B8B6B7B7B5B7B7B6B7B7B4B6B7B3B5B6B3B4B5B3B5B6B2B3B4B2B3B4B2B3B4B1B2B3 B1B2B34D525A525860575D66575D66525860484D54ADAEAFACADAEACADAEACADAEABACADABABAC ABABACABABACAAAAABA9A9AAA9A9AAA8A8A9A8A8A9A7A8A8A7A8A8A5A7A7A5A6A6A4A6A6A3A5A5 A3A4A5A2A4A4A2A3A4A1A2A3A2A3A3A0A1A2A1A2A244484F494F564F555D4F545C4A505741464C 9D9E9F9C9D9E9C9D9E9B9C9D9B9C9D9B9C9D9B9B9C9B9B9C9A9A9B99999A99999A99999A989899 989899979798969798969697959697949596949595939595939495939495939494929394929393 3E424944494F484D54484D54474D54474D54474C53474C53474C53464B52464C53464B52464B52 454B52454B52454B52454A51454A514449501C242B1C242B1C242C0E1013030202060606050505 060606A2A19FFDFAF6F4F1EDF5F2EEF7F4F0C0BEBCAAA9A7A09E9B8784817F7E7C737371616463 535A542225271112171013181213160D0C10151618383F3B8D9292858385000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000121212A7A7AD7A7B7D7C7C7E3E3E3F1010121A191D1D1D1F625F60 7E7B7C8985878D898A918E8E9391909490908F8B8AC6C3BFF3EFEBF3F0EBF3F0EDF5F2EFFDFBF8 93918E020302060606060606050303090A0A1B22291D252C1C242B454A50454A51454B52454A51 454B52454B52454B52464B52464B52464C53464C53474C53474C53474D54474D54474C53484D54 4448503C4046909292929394929394929394939495939495949595949595959696959696969797 96979797989897989898999998999A999A9A999A9B9A9B9C9A9B9B9B9B9D9B9B9C9C9C9D9C9D9E 9D9D9E9D9E9F454A51494F564E545C4F555D4B505841464D9FA1A1A0A1A2A1A2A3A1A2A3A2A3A4 A2A3A4A3A4A5A3A4A5A4A5A6A5A6A7A5A6A7A6A7A8A6A7A8A7A8A8A7A8A8A8A9AAA8A9A9A9AAAB A9AAABAAABABABACADABACACACACADACADAEACACADADAEAF4A4F5750575F575D65575D66535861 494D54AFB1B2B1B2B4B1B2B4B1B2B3B2B3B5B2B3B4B3B4B5B4B5B6B4B5B6B4B5B6B5B6B7B5B6B7 B6B7B8B6B7B8B7B8B9B7B8B9B8B9BAB9BABBB8B9BAB9BABABABBBCBABBBBBABBBBBBBCBDBBBCBC BCBDBE525760575E675D646D5E656E595F684E535BBDBEBFBFBFC1BFBFC1C0C0C1C0C0C2C0C0C1 C0C1C2C0C1C2C0C1C2C0C1C2C1C2C3C1C2C3C2C3C4C2C3C4C2C3C4C2C3C5C3C4C5C3C4C6C3C4C6 C3C4C5C3C4C6C3C4C5C4C5C6C4C6C7C4C5C6C4C6C7565C655B626B6269726269735D636D52575F C5C7C8C6C7C9C6C7C9C5C6C7C6C7C9C6C7C8C6C7C8C6C7C8C6C7C8C6C7C8C6C7C8C6C7C8C6C7C8 C6C7C8C6C7C8C6C7C9C6C7C8C6C7C9C6C7C9C6C7C8C6C7C9C6C7C8C5C6C7C6C8C9C5C6C7C5C7C8 565C655B636C6169726269735C626C50565EC2C5C6C4C5C7C4C5C7C4C5C6C4C5C7C3C4C5C3C4C5 C3C4C5C2C3C4C2C3C4C2C3C4C2C3C4C2C3C4C1C2C3C1C2C3C1C2C4C0C1C2C0C1C3C0C1C3C0C0C1 C0C0C2BFBFC0BFBFC0BFC0C1BFBFC0BEBFC0525861575F675E646D5E656E595E674E525ABABBBC BBBCBDBABBBCBABBBBBABBBCB9BABAB9BABAB8B9BAB8B9BAB7B8B9B6B7B8B6B7B8B6B7B8B5B6B7 B5B6B7B4B5B7B4B5B6B3B4B6B3B4B6B3B4B5B2B3B5B1B2B3B1B2B3B1B3B4B0B1B2B0B1B24D525A 51575F565D65565D65515760474C53ACADAEACACAEABACADABACACABACADAAABABA9AAAAA9AAAA A8A9A9A8A9A9A8A9A9A7A8A8A6A7A8A6A7A8A5A6A7A4A5A6A4A5A6A3A4A5A3A4A5A2A3A4A2A3A4 A1A2A3A1A2A3A0A2A2A0A1A2A0A1A2444950494F574F545C4E545C4A4F5741454B9D9E9F9C9C9E 9C9C9E9B9B9C9B9B9D9A9B9B9A9B9B999A9A999A9A989999989999979898979898969797969797 9596979596969495969495969394959394959293949293949294949192939193933D424843484F 474C53474D54474C53474C53474C53464C53464C53464C53464C53464B52464B52454B52454A51 454B52454A50454A50444A501C242B1C242B1C242C0E1013030202060606050303090909A5A3A1 FDFAF6F4F1EDF5F2EEF7F4F0C0BEBBABA8A5A09E998784827F7E7A73756F636663555C56212526 1110181112171112170C0D1016181A3A413F888D8F7D7E80000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000101010A4A6A97A7A7D797A7B3E3E3F10101219191C1F1F216564657E7B7B898587 8D8A8A928E8F9391919391918F8B8BC7C2C0F5F2EDF3F0EBF4F1EDF5F2EEFDFBF7959391030202 060606060606050303090A0A1B22291D252C1C242B454A50454A50454A50454B51454A51454B51 464B52454B52464C52464B52464B52464C53464C53464C53474C53474C53474D544448503C3F45 909192919193929294929394939395939495939495949495959696959596959596969797969697 979898989999979899999A9A97989998999A999A9B999A9B9A9B9C9B9C9D9B9C9C9B9C9D9C9D9D 45494F494F564E545B4F555D4B505841464D9FA0A1A0A0A2A0A0A2A1A2A3A1A1A3A2A3A4A3A4A5 A3A3A4A4A5A6A4A4A5A4A4A5A5A6A7A5A6A7A6A7A8A7A8A8A6A7A8A8A9A9A7A8A9A8A9AAA8A9AA A9AAABAAABACAAABACABACACABACADACADAD494E5650565E565C65565D65525760494D54AEAFB0 B0B0B2B0B0B2B1B2B3B1B1B3B2B3B4B2B3B4B3B3B4B3B4B5B4B4B5B4B4B5B5B6B7B4B5B6B6B7B8 B6B7B8B5B6B7B7B8B9B7B8B9B7B8B9B7B8BAB8B9BAB8B9BAB8B9BAB9BABBB9BABBBABBBC525760 575E675C646D5E656E585F684D535BBBBDBDBDBEBFBDBEBFBFBFC0BEBFC0C0C0C1C0C0C1BFC0C0 C0C0C1C0C0C1C0C0C1C0C1C2C1C1C2C1C2C3C1C2C3C2C2C3C1C2C3C2C2C3C2C2C3C2C2C4C3C3C4 C3C3C5C3C3C5C3C3C4C3C4C6C3C4C5555A635B616A6168726168725D626C52565FC4C6C7C4C5C7 C4C5C7C5C6C7C4C5C7C5C6C7C5C6C7C4C5C6C5C6C7C4C5C6C4C5C6C5C6C7C4C5C6C5C6C7C5C6C7 C4C5C6C5C6C7C4C5C6C4C5C6C4C5C7C4C5C6C4C5C7C4C5C7C3C4C5C3C4C6C3C4C5565B645B626B 6168726169735C626C50565EC1C4C5C3C3C5C3C3C5C3C4C5C3C3C5C3C4C5C2C3C4C2C2C3C2C3C4 C2C2C3C1C1C2C1C2C3C1C1C2C0C1C2C0C1C2C0C0C1C0C0C1BFC0C0BFC0C0BFC0C1BEBFBFBEBFC0 BEBFC0BDBEBEBDBEBFBCBDBE525760575E665D646D5C646D585E674D525AB8BABAB9BABBB8B9BA B9BABAB8B9BAB8B9BAB8B9BAB7B8B9B7B8B9B6B7B8B5B6B7B5B6B7B4B5B6B5B6B7B4B5B6B4B4B5 B3B4B5B3B3B4B2B2B3B2B2B4B1B1B2B1B1B3B0B0B2B0B0B1AFB0B1AFB0B04C515951575F555C65 565D6551565F474C53ABACADABACADAAABACABACACA9AAABA9AAAAA9AAAAA8A9AAA8A9A9A6A7A8 A6A7A8A6A7A8A5A6A7A5A6A7A5A6A7A4A4A5A4A5A6A3A3A4A3A3A4A2A2A4A1A1A2A1A1A3A0A0A2 A0A0A1A0A0A29FA0A043474F494F564E545B4E545B4A4E5641454B9B9C9D9B9C9D9A9B9C9B9B9C 9A9B9C9A9B9B999A9A98999A989999979899969798979898969697969797969797959596959696 9494959494959393959393949292949292949191929191939191923D424843484F474C53474D54 474C53464C53474C53464B52464B52464B52454B52464B52454A51454A51454A51444A50454A50 454A504449501C242B1C242B1C242C0E1013030202060606050503070909A6A3A1FDFAF5F3F0EC F5F2EDF8F4F1BFBEBCA9A7A39F9C9987848281807C747671646663545A57212426101017121317 1112160C0D101718193C4243979BA0807E81000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 101012A5A7AB77787B7D7E7E3E3E4010101219191C2021236866667F7C7D8A86878E8A8A918E8E 939191949191918D8EC5C1BEF3EEEBF1EEEAF2EFEBF5F2EFFDFBF8928F8B020202060606050606 050303090A0A1B22291D252C1C242B44484F444A50444A50444A50454A51454A51454A51454A51 454B52464A51464A51464C53464B52464C53474C53474C53474C534448503C40468F9090919192 919192919292929293929393929393939494939494949595949595959697959696959697969798 97979997989997979998989A98999A99999B999A9B9A9B9B9A9B9B9A9C9C9B9C9C44494E494E55 4E545B4E535B4A4F5741454C9D9E9FA0A0A1A0A0A1A0A1A1A1A1A2A1A2A2A1A2A2A2A3A3A2A3A3 A3A4A4A3A4A4A4A5A6A4A5A5A5A6A7A5A6A7A6A6A8A6A7A8A7A7A9A7A7A9A8A9AAA8A8AAA8AAAB A8AAABAAABACA9ABACABACAC494E5650565E565C65555C65525760484D54ADAEAFAFB0B0B0B0B1 AFB0B0B1B1B2B0B1B1B1B2B2B1B2B2B2B3B3B2B3B3B2B3B3B3B4B5B4B4B5B4B5B6B4B5B6B5B5B7 B5B6B7B6B6B8B6B6B8B6B8B9B6B7B9B7B9BAB7B9BAB9BABBB8BABBBABBBC51565E575C655C646D 5C626C585E674D535BBABBBCBDBEBEBDBEBEBCBDBEBEBFBFBCBDBEBDBEBFBEBFC0BEBFC0BEBFC0 BEBFC0BFC0C1BFC0C0BFC0C1BFC0C1C0C1C2C0C1C2C0C1C2C0C1C2C1C2C3C1C2C3C1C2C3C1C2C3 C2C2C3C2C3C4C3C3C4545A635B616A6168716068715D626C51565EC3C3C4C3C4C5C3C4C5C3C3C4 C3C4C5C3C3C4C4C4C5C3C3C4C3C3C4C3C3C4C3C3C4C3C4C5C3C3C4C3C4C5C3C4C5C3C3C5C4C5C6 C3C3C5C3C3C5C3C4C5C3C3C5C3C4C5C3C4C5C3C4C5C3C4C5C3C4C5555A635B6069606871606770 5B626C50565EC0C2C2C3C3C4C2C2C3C1C2C2C2C2C3C1C2C2C0C1C1C0C1C1C0C1C1C0C1C1BFC0C0 BFC0C1BFC0C0BEC0C0BEC0C0BEBFC0BEC0C0BEBFC0BDBEBFBDBFBFBCBDBEBCBEBEBCBEBEBCBDBE BBBDBEBCBDBE51575F575D665D646D5C636C585D664D525AB7B8B9B9BABBB8B9BAB6B7B8B7B8B9 B6B7B8B6B6B7B6B6B7B6B6B7B5B5B6B4B4B5B4B5B6B3B4B4B3B4B5B2B3B4B2B3B4B1B2B3B1B2B3 B1B2B3B0B1B2B0B1B2AFB0B1AFB0B1AFB0B0AEB0B0AEAFAF4C515850555D555C64555B6351565F 464B52AAABACAAABACA9AAABA8A9AAA8A9AAA8A8A9A7A7A8A7A7A8A7A7A8A6A6A7A5A5A6A5A6A7 A5A5A6A4A5A6A3A4A5A3A4A5A2A3A4A2A3A4A1A2A3A0A1A2A0A1A29FA0A19FA0A1A0A0A19EA0A0 9E9F9F43474F494E554E545B4E545B4A4E5640444B9A9B9C9A9B9B9A9B9B9A9A9B999A9B99999A 989899989899979798969697969697959697959696959697949596949596939495939495929394 9293949293949192939192939191929091929090913D414742474D474C53474B53464C53464C53 474C53464B52464B52464B52454B52464B52454A51454A51444950444A5044495044484F444950 1C242B1C242B1C242C0E1013030202060606050303070909A6A5A2FDFAF5F3F0ECF4F1EDF7F4F0 C0BEBCAAA8A5A19E9B87848383807E767573656563565B572023261010161313161210150C0D10 151618353D3D8D9497828185000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000100D109D9DA1 797A7C7A7B7C3D3E3F1010121A1A1D1E1E216664647F7D7D8A87888D8989928E8D949191939292 918E8DC7C3BFF2EFEAF2EFECF3F0EDF4F1EDFBF9F4918F8A030202060606050606050303090A0A 1B22291D252C1C242B44484F444A50444A50444A50444A50454A51454B52454B52454B52454B52 464B52464A51464B52464B52474B53464B53474B5342484E3A3F458E8E8F909191909191919292 919292929393929393939494939494939494949595949696959696949696959697959697969798 96979897989998989998999A99999A9A9A9B999A9B9A9A9B9A9A9C44484E494E554D535B4E545B 4A4F5741454C9D9D9F9E9FA09E9FA09FA0A0A0A1A1A0A1A1A1A2A2A1A2A2A2A3A3A2A3A3A3A4A4 A2A4A4A4A5A5A4A5A6A4A5A6A4A5A6A4A5A6A5A6A7A6A7A8A7A7A8A7A8A9A8A8A9A8A9AAA8A8AA A9AAABA9A9AB484D5550555D545B63555B6450575F474D54ABACAEADAEAFAEAFB0AFB0B0AFB0B0 B0B1B1B0B1B1B0B1B1B1B2B2B1B2B2B2B3B3B1B3B3B3B4B4B2B4B4B3B4B5B3B4B5B4B5B6B4B5B6 B5B6B7B6B6B7B5B6B7B6B7B8B6B7B8B7B7B9B7B8B9B8B8BA50565E575D655C636C5C636C575E67 4D525AB8B9BBBABBBCBBBCBDBBBCBDBCBDBEBCBDBEBCBDBEBDBEBFBDBEBFBDBEBFBEBFC0BDBFC0 BEBFC0BDBFC0BEC0C0BEBFC0BEC0C0BEBFC0BEBFC0C0C1C1BFC0C1C0C1C1C0C1C1C0C1C2C1C2C2 C0C1C2545A625A60695F66706067705B626B4F565EC1C2C3C2C3C3C2C3C3C2C3C3C2C3C3C2C3C3 C2C3C3C2C3C3C3C3C4C3C3C4C3C3C4C2C3C4C3C3C4C1C3C3C2C3C4C1C2C3C1C3C3C2C3C4C2C3C4 C2C3C3C1C2C3C2C3C3C2C3C3C1C2C3C2C3C3C1C2C3545A635B616A6068716067715B616B50555D BFC0C1C1C2C2C0C1C1C0C1C1C0C1C1C0C1C1BFC0C0BFC0C0BFC0C0BFC0C0BFC0C0BDBFC0BEBFC0 BDBFC0BDBFC0BCBDBFBCBEBFBCBDBFBBBCBEBCBDBEBBBCBEBCBDBEBBBCBDB9BABCBABBBCB9BABC 51575E575C655B626C5C626C565D664B5159B6B6B8B7B8B9B6B7B8B6B7B8B6B7B8B6B6B7B6B6B7 B5B5B6B4B4B5B4B4B5B4B4B5B2B4B4B3B4B4B2B4B4B1B3B3B1B2B3B0B2B2AFB0B1AFB0B1AFB0B0 AEAFB0AEAFB0AEAFB0ACADAFADAEAFACADAF4B505850565E555C64555B6450565F464B52A9A9AB A9AAABA8A9AAA8A9AAA8A8A9A7A7A8A7A7A8A6A6A7A6A6A7A5A5A6A5A5A6A3A5A5A4A5A5A2A4A4 A2A4A4A1A2A3A1A3A3A0A1A2A0A1A2A0A1A19FA0A19FA0A09FA0A09E9EA09E9FA09D9D9F43474E 494E554D535B4D525A484E553F444B9A9A9C9A9A9B9A9A9B99999A99999A989899989899979798 979798969697969697949696959696939595939595939495929494919293919293929393919192 9192929091919090919091918F8F903D414842474E474C53474C53464C53464C53464A51464B52 454A51454A51454B52454950454A51454A51444950444A5044495044484F4449501C242B1C242B 1C242C0E1013030202060606030303090909A6A5A2FDFAF5F4F0EDF4F1ECF7F5F0BFBDBAA9A6A4 A29F9C88858385827F777574626664555B572123241010161213171113160D0D12161619363F3C 8C9191828182000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000101010A1A0A4797A7C7B7D7E 3E3E3F10101419191D1E1E216463647E7C7D8A87878D8989928E8D949292939291928E8DCAC6C3 F4F0ECF3F0EDF3F0EDF2EFEBFAF8F394928F020302060606060606050303090A0A1B22291D252C 1C242B43484F444950444950444950444950444950444950444950454A51454A51454A51464A51 454A51464B52464B52474C53474B5343484F3B3F458E8E8F909091909091919192919192919293 919293919293929394929394929394939595939495949696959697959697959697969798969798 97989997989998999A98999A999A9B999A9B9A9A9C44484E494D544C525A4E535B494F5640454C 9C9C9E9E9E9F9E9E9F9E9FA09E9FA09FA0A19FA0A1A0A1A2A0A1A2A1A2A3A1A2A3A2A4A4A2A3A4 A3A5A5A3A5A5A4A5A6A4A5A6A5A6A7A5A6A7A6A7A8A6A7A8A7A8A9A8A9AAA8A8AAA8A9AAA9A9AB 484D5550555C555B64555B6351565F474C53ABACAEACADAEACADAEADAEAFAEAFB0AEAFB0AFB0B1 AFB0B1AFB0B1B0B1B2B0B1B2B1B3B3B1B2B3B2B4B4B2B4B4B3B4B5B3B4B5B4B5B6B4B5B6B5B6B7 B5B6B7B5B6B7B6B7B8B6B6B8B6B7B8B7B7B950555D565B645B626B5C626C575E664C525AB8B8BA B9BABBB9BABBB9BABBBABBBCBABBBCBBBCBDBBBCBDBBBCBDBBBCBDBBBCBDBCBEBFBCBDBEBDBFC0 BDBFC0BDBEC0BDBFC0BDBEC0BEBFC0BEC0C0BEBFC0BFC1C1BFC1C1BFC0C1BFC1C1BFC0C1545961 5A5F686067716066705B616B50555DC0C1C2C0C1C2C0C1C2C0C1C2C1C2C3C0C1C2C1C2C3C1C2C3 C1C2C3C1C2C3C1C2C3C1C3C3C1C2C3C1C3C3C1C3C3C1C2C3C1C3C3C1C2C3C1C2C3C0C2C2C1C2C3 C1C3C3C0C2C2C0C1C2C0C2C2C0C1C2545A625A5F685F66706066705A616A4E555DBDBFC0BFC0C1 BFC0C1BEBFC0BEBFC0BEBFC0BEBFC0BEBFC0BDBEBFBDBEBFBDBEBFBCBEBFBCBDBEBCBEBFBCBEBF BBBCBEBBBDBEBBBCBEBABBBDBBBDBEBABBBDB9BBBCB9BBBCB9BABCB9BABBB9B9BB51565E575C65 5C636C5C626B565D664C5159B5B5B7B6B6B7B6B6B7B5B6B6B5B6B6B4B5B5B4B5B5B4B5B5B3B4B4 B3B4B4B2B3B4B2B4B4B1B2B3B1B3B3B1B3B3B0B1B2AFB1B1AFB0B1AFB0B1AEB0B0ADAEB0ADAFB0 ACAEAFACADAFABADAEABACAE4B505750555D545A63555A634F565D454B52A8A8AAA8A8A9A8A8A9 A7A8A8A6A7A7A6A7A7A5A6A6A5A6A6A4A5A5A4A5A5A3A4A5A2A4A4A3A4A5A2A4A4A1A3A3A1A2A3 A0A2A2A0A1A29FA0A19FA1A19E9FA09EA0A09E9FA09E9EA09D9E9F9D9D9F42474E494E554D535B 4D525A494E563F444A9A9A9C999A9A989999989999979898979898969797969797959696959696 949596949696949596939595929494929394929494919293919293919292919192909191909191 9090918F90908F8F903C414742474D464B53464B52464B52464B52454A51454A51454A51454A51 454A5144495045495044495044495044495044495043484F44484F1C242B1C242B1C242C0E1013 030202060606030303090909A8A5A3FDFAF6F4F1EDF3F1ECF6F4EEBFBDBBAAA7A5A19E9A888681 84827F787675646764565C572224261010141112161012150C0D10151617383F3D929496817E81 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000121212A7A7AA78797B7B7C7D3F3E40101013 19181D1F1F226363637D7C7C8986868D898A928F8E959392959192928D8DCAC7C3F6F2EEF3F0EC F2EFEBF1EEEAFBF8F3918D8A020202060606050606050303090A0A1B22291D252C1C242B43484F 44484F444950444950444950444950444950454A51454A51454A51454A51454A51454A51464B52 464B52464B52464B5342484E3A3F458E8E8F8E8F908F9091909091909192919192919192919192 919293929293929293939495939394939495949596949496959696959596959697959697969798 969798979899989A9A98999A989A9A43484E474D544C525A4C525A494F5640454C9C9C9D9C9D9E 9D9E9F9E9E9F9E9EA09FA0A19FA0A19F9FA0A0A1A2A0A0A1A1A1A2989898838484797A7A909091 A1A2A3A4A5A5A3A4A5A4A5A6A5A6A7A5A6A7A5A6A7A6A7A8A6A8A8A7A8A9A7A8A9474D544E545C 545A63545A6350565E464C53AAABACABABADACACAEACADAEADADAFADAEAFAEAFB0AEAEAFAFB0B1 AEAFB0AFB0B1B0B1B2AFB0B1B1B2B3B2B3B4B1B2B4B3B4B4B2B3B4B2B3B4B2B3B4B3B4B5B4B5B6 B4B5B6B4B6B6B5B6B7B5B6B74F555D555B645B626B5B626B565D664B5159B8B8B9B8B9BAB9B9BB B9BABBB9B9BBB9BABBBABBBCBABABBBBBCBDBBBBBCBBBBBCBBBCBDBBBBBCBBBCBDBCBDBEBBBCBE BDBEBFBCBDBFBCBDBFBCBDBFBCBDBFBDBEC0BDBEC0BDBFC0BDBEC0BDBFC0535961595F685E666F 5E666F5A616A4E555DBFC0C1BEBFC1BFC0C2BFC0C1BFC0C2BFC0C1C0C1C2BFC0C1C0C1C2BFC0C1 BFC0C1B7B8B99A9B9CA9A9AABEBFC0BFC0C2C0C1C2BFC0C2BFC0C2BFC0C2BFC0C2BEBFC1BFC0C2 BEC0C1BEBFC1BEC0C1535961595F685E666F5E666F5A616A4E555DBDBEBFBDBEC0BDBEC0BEBFC0 BCBDBFBDBEBFBDBEBFBCBDBEBDBEBFBBBCBDBBBCBDBBBCBDBBBBBCBBBCBDBBBCBDBBBBBDBABBBC BABABCBABABCBABABCB9B9BBB9B9BBB8B9BAB8B9BAB8B9BAB8B9BA50565E555C645A616A5A616A 555C654B5158B5B5B6B4B5B6B4B5B6B5B6B6B3B4B5B4B5B5B3B4B4B2B3B4B2B3B4B1B2B3B1B2B3 B1B2B3B0B1B2B0B1B2B0B1B2AEAFB1AFB0B1AEAEB0AEAEB0ADADAFADADAFACACAEACACAEACADAE ABABADAAABAC4A50574F555D545A63535A624F565D454A52A8A8A9A6A7A8A6A7A8A6A7A7A5A6A7 A5A6A6A5A6A6A3A4A5A4A5A5A2A3A4A2A3A4A3A4A5A2A2A3A1A2A3A1A2A3A0A0A2A0A1A29F9FA1 9F9FA19E9EA09E9EA09D9E9F9D9E9F9C9D9E9C9D9E9B9C9D42474E484D544C525A4C525A484E55 3F444A999A9A979899979899979898969798969797969797959596959696949495949495939495 9393949394959293949292949293949191939091929091929091928F90918F90918F90918E8F90 8D8E8F3C414742474D464B53464B52454A51454A51464A51454A51454A51454A51454950454950 44495044484F44495044484F43484F43484F44484F1C242B1C242B1C242C0E1013030202060606 0303030A0909A8A5A3FEFBF7F4F1EEF4F1EDF6F3EEBEBCBAABA9A6A2A09A868580838280767574 636663575D582326270E0F141312171212150D0D10141717373D3B929596818182000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000121212A5A6A87A7B7B7A7B7C3F3E3F1010131A191D1E1F23 6364657D7B7D8986888D8A8A928F8E959293959293918D8DC9C4C0F5F1EDF2EFECF3EFEBF1EDE9 FAF7F4908D89030202060606050606050303090A0A1B22291D252C1C242B43484F43484F43484F 44495043484F444950444950444950444950444950444950454A51454A51454A51464B52454A51 464B5242474E393E448D8E8E8E8F908E8F908F90908F9091909191909191919192919192929293 919192222222181818181818181919868787959596959596959697959697969798969798969798 97989997989998999A42484D474C534C525A4C525A494E5640454C9A9B9B9C9D9E9C9D9E9D9E9E 9D9E9F9E9E9F9E9E9F9F9FA09F9FA06D6D6E1A1A1A000000000000000000000000090909525252 99999AA3A4A5A4A5A6A4A5A6A5A6A7A5A6A7A6A7A8A6A7A8A7A8A8474D544E545C535962545A63 4F555D454B52A9AAAAABACADABACADACACADACADAEADADAE7E7F801E1E1E1C1C1C1C1C1C1C1C1C 1C1C1C1C1C1C1F1F203535364E4F4F8B8C8CB1B2B3B2B3B4B2B3B4B2B3B4B3B4B5B3B4B5B4B5B6 B4B5B6B5B6B64E545C545A635A616A5A606A565D654B5159B6B7B7B8B9BAB8B9BAB8B9B9B8B9BA B9B9BAB9B9BA878889232324212122212122212122212122212122212122222222212122222222 313131B9BABCBBBCBDBCBDBFBCBDBFBCBDBEBCBDBFBDBEBF525961585F685D646E5E656F586068 4D545CBDBEBFBEC0C1BDBFC0BEBFC0BEC0C1BEBFC0BEBFC0BEBFC0B1B1B24C4D4D1C1C1C010101 0000000000000404042E2E2F8F9090BEBFC0BEBFC0BEBFC1BEBFC0BEBFC1BEBFC1BDBEBFBEBFC1 BDBEBF525860585E675E656F5D646E5960694E545CBBBCBDBCBEBFBCBEBFBCBDBEBBBDBEBBBCBD 8787872020201E1E1E292A2AB9B9BABBBBBCBABABBBBBBBCBABABBBABABB3232321F1F1F1E1E1E 79797AB7B8B8B8B9BAB8B9BAB8B9B9B7B8B9B7B8B84F555D555B645A606A5A616A545B644A5058 B3B4B5B4B6B6B3B5B5B3B4B5B3B5B5B2B3B4B2B3B4B1B2B3B1B2B3B1B2B3B0B1B2AFB0B1AFB0B1 AFB0B14E4E4E1D1D1D1C1C1C525353ADADAEADADAFACACADACACAEABABADABABACAAABACAAABAB 494F564E545C535A625359624F555D454A52A6A7A8A6A8A8A5A7A7A5A6A7A4A6A6A4A5A63E3E3F 1C1C1C1C1C1C5E5F5FA2A2A3A2A2A3A1A1A2A1A1A29E9E9F3C3C3C1C1C1C1C1C1C1C1C1C5F5F60 9D9E9E9D9E9F9C9D9E9C9D9D9B9C9D9B9C9C41474D484D544B51594C525A474D543E434A98999A 9799999799999697989698989596979596976D6D6E1A1A1A1A1A1A1B1C1C939394939394929293 9292939292939191929191929091919091928F90908F90918F90918E8F8F8E8F908D8E8E3B4046 41464D464B52454A51454A51454A51454A51454A51454950444950444950444950444950444950 44495043484F43484F43484F42474E1C242B1C242B1C242C0E1013030202060606030303090909 A9A7A4FEFAF7F5F2EDF4F1EBF7F3EFBEBCBAAAA8A5A2A09B88868185847F777873656866555A57 2224250E0F151213161112160D0C10151617363D3C8B9193818285000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 0000000000000000001010109D9EA07B7B7D7B7C7C3E3F3F1210151A1A1D2021236565657D7B7C 8987888E8A8A938F90959293949193938F8FC9C4C0F3EFEBF3F0EDF2EEEAEFECE8FBF8F4918E8B 030202060606050606050303090A0A1B22291D252C1C242B43474E43484F43484F43484F43484F 43484F444950444950444950444950444950454A51454A51454A51464B52464A51464B5242474E 3A3E448C8D8E8D8E8F8D8E8F8E8F908E8F908E8F908F90919091919091919091916B6B6C020202 000000000000000000545555929394949596949596949596959597959697959697969697969798 98989942474D464C534C51594B5159494E553F444B999A9B9A9B9C9B9C9D9B9C9D9C9D9E9C9D9E 9C9E9E9D9F9F474747010101000000000000000000000000000000000000000000171717969698 A2A3A4A4A4A6A3A4A5A4A5A6A5A5A6A5A6A7A5A6A7474D544E545B535962535A6250555D464B52 A7A9AAA9AAABAAABABA9ABABABACACAAACAC767778020202000000000000000000000000000000 000000000000000000000000424343AEAFB0B1B2B3B1B2B4B1B2B3B1B2B3B2B3B4B2B3B4B3B4B5 4E545B545A625A6069596069555B644B5058B3B5B6B6B7B8B6B7B8B5B7B8B7B8B9B6B8B9B6B8B9 7E7F80020202000000000000000000000000000000000000000000000000000000121212B7B9B9 BBBBBDBABBBCBABBBCBCBCBDBABBBCBCBCBD525860585E675E646D5E656E5960684E535BBCBDBE BCBDBEBCBDBEBCBDBEBCBDBEBCBDBEBCBDBE8B8C8D151616010101000000000000000000000000 000000000000000000484849BABBBDBCBDBEBCBDBFBCBDBEBCBDBEBCBDBEBCBDBEBCBDBE515860 575E665E646D5D646D595F684E535BB9BABBBCBCBDBBBBBCBABBBCBBBBBCBABBBC7C7D7D020202 0000000C0C0CB7B9B9B9BABBB8BABAB9BABBB9BABBB8B9BA1919190101010000006E6E6EB5B6B7 B5B7B8B5B7B8B6B7B8B4B6B7B5B6B74F555D545B635A6069596069555B634A4F57B1B2B3B2B3B4 B1B2B3B1B2B3B1B2B3B1B2B3B0B1B2AFB0B1AFB0B1AEAFB0AEAFB0AFAFB1ADAEAFAEAEB03C3C3C 010101000000414141ABACADAAACACAAABACA9ABABA9ABABA9AAABA8AAABA8A9AA494F564E535B 5359625259614F545C444950A5A6A7A5A5A6A5A5A6A3A4A5A4A4A5A2A3A42A2A2A000000000000 515152A0A2A2A0A1A29FA1A19E9FA03D3D3E0101010000000000004848489D9F9F9C9D9E9B9C9D 9B9C9D9A9B9C9A9B9C9A9B9C41474D484D544C51594C5159484D543E4349969798979798969697 959697959596949596939595666768000000000000010101929394919393919293909192909192 9091929091928F90918F90918E8F908E8F908D8E8F8D8E8F8C8D8E8D8D8E3B404641464C464A51 454A51454A51454A5144495045495044495044495044495044495044495044495043484F43484F 43484F43474E42474E1C242B1C242B1C242C0E10130302020606060303030A0A0AABA8A6FDFAF6 F3F1ECF3F0EBF6F4EEBDBBB9A7A4A2A39F9C89868385847F787973656966555C562023230F1015 1112161010160C0D10161819363F3D8B9193858585000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 0000001010109C9DA17A797B7A7C7C3E3F4010121419191D2020226564637E7B7C8A87878E8A8B 938F91969293949292959191CBC6C2F2EEEBF3EFEDF1EDE9F0ECE8FAF7F2918F8A020202060606 050606050303090A0A1B22291D252C1C242B42474E43484F43484F43484F43484F43484F444950 444950444950444950444950444950444950454A51454A51454A51454A5141464D393E448B8C8D 8C8D8E8D8E8F8D8E8F8E8F908E8F908E8F908F90918F9091909191393939010101000000000000 00000021212190919293949593949594959694959594959695969796979896979896979842474C 464C534B50584B5159474D543F434B98989A9A9B9C9A9B9C9B9C9D9B9C9D9C9D9E9C9D9E727373 0202020000000000001B1B1B4646464E4E4E2B2B2B0101010000000000002E2E2EA0A1A2A2A3A3 A3A4A5A3A4A5A4A5A6A4A5A6A5A6A7464B524D525A5258605359624E545C454A51A6A7A9A8AAAB A8AAABA9ABABA9ABABA9ABAB7778780202020000000101010F0F0F0F0F0F0F0F0F020202000000 0000000000000000004B4B4BB0B1B2B0B1B1B0B1B2B1B1B3B1B2B3B2B2B4B2B3B44E545B535962 595F69596069545B644A4F58B3B4B6B4B6B7B4B6B7B4B6B7B5B7B8B5B7B8B5B7B87E7E7E020202 000000000000050505050505050505050505050505050505050505181818B7B8B9B9BABBB9BABB BABBBCBABBBCBABBBCBABBBC51575F575D665C636C5C636D585E674D525ABBBCBDBBBCBDBBBCBD BBBCBDBBBCBDBBBCBD9293930303030000000000000404043636365C5C5C484848181818000000 0000000000005D5E5EBABBBCBBBCBCBBBCBDBBBCBDBBBCBDBABBBCBBBCBD515860575D665D636D 5C636D585E674C525BB9BABBBABBBCB9BBBBB9BBBBB9BBBBB9BBBB7C7D7D0202020000000C0C0C B6B8B8B8B9BAB7B9B9B7B8B9B6B7B9B6B7B81919190101010000006E6E6FB4B5B6B5B6B8B4B5B7 B4B6B7B4B5B7B3B5B64E545C545A62595F68595F69545A63494E56B1B1B3B1B2B3B1B2B3B1B2B3 B0B1B2B0B1B2AFB0B1AFB0B1AEAFB0AEAFB0AEAFB0ADAEAFACAEAEACADAE3C3C3D010101000000 404040AAABACA9AAABA9AAABA8A9ABA8A9ABA7A9AAA7A8AAA7A8A9494E554E535B525861525961 4E535C444950A4A5A6A4A5A6A3A4A5A3A4A5A2A3A4A2A3A42929290000000000005151529FA1A1 9FA0A19EA0A0444445020202000000000000494949A2A2A39C9C9E9B9B9C9B9B9D9B9B9D9A9B9C 99999B999A9B40464C474C534B50584B5158474C533E4249969798959697959697949596949596 9495969395956667670000000000000101019192939192929191929090919090918F8F918F8F90 8F8F908E8E908E8E8F8D8D8F8D8D8F8C8D8E8C8D8E8C8D8E3B404641464C454A51454A51454951 44495044495044495044495044495044495043484F43484F43484F43484F43484F43474E42474E 42474E1C242B1C242B1C242C0E10130302020606060303030A0A0AABA9A6FDFBF6F4F1EDF4F1EC F7F4EFBEBCBAA7A4A1A39F9B8A878384837F787873666866575D57212324100F14121317101215 0A0A1015171838423D888E90808081000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000101010 A0A0A47577777B7D7E3E404010101319191D1F1F216462637E7B7C8A87878D8A8B938F90969293 959192959291CBC7C3F2EEEAF1EEEAF0ECE8F1ECE7FAF7F3908D88020202060606060606050303 090A0A1B22291D252C1C242B42474E43484F43484F42474E43484F43484F43484F44484F43484F 44484F444950444950444950454A51454A51454A51454A5141464D393D448A8B8C8B8D8D8B8D8D 8C8D8E8D8E8F8D8E8F8D8E8F8E8F908E8F90898A8B090909000000000000010101000000000000 7C7E7E92939493949593939593949594949594949594969695969795979742474C464C534B5058 4B5158474D543F434B97989998999A999A9B999A9B9A9B9C9A9B9C9B9C9D404141010101000000 303030A8A9A9A6A6A6A6A7A7A9A9A96D6D6D000000000000000000929394A2A3A3A1A2A3A2A3A4 A2A4A4A2A3A4A3A5A5464B524D525A5258615259614E545C444951A6A6A8A7A8A9A8A9AAA8A9AA A9AAABA9AAAB767777020202000000131313B6B6B6B9B9B9B9B9B9B6B6B6979797292929010101 0000000303039D9D9EAFB0B0AFB0B1AFB0B1AFB1B1B0B1B2B0B1B24D535A535961585E68595F69 545A634A4F58B2B2B4B3B4B5B4B5B6B4B5B6B4B5B6B4B5B6B4B6B77D7E7E020202000000060606 C2C2C2C5C5C5C6C6C6C6C6C6C6C6C6C6C6C6C7C7C7C5C5C5B7B8BAB8B9BAB7B8BAB8B9BBB8BABB B8B9BBB8BABB50575F565D655C636D5C636D585E674C525BB9BABBB9BBBBB9BBBBB9BBBBB9BBBB B7B9BA282929010101000000171717A0A0A0C6C6C7C3C3C4C4C5C5C2C2C24A4A4A010101000000 010101A7A8AABABBBBB9BABBB9BABBB9BBBBB9BABBB9BBBB51575F565D655C636D5C636C575D67 4C525AB7B8BAB8BABBB8BABBB7B9BAB7B9BAB7B9BA7C7D7D0202020000000C0C0CB4B5B7B6B8B9 B6B7B9B5B7B8B5B7B8B6B7B81919190101010000006D6D6EB3B4B5B4B4B6B4B4B6B3B4B5B3B3B5 B2B3B44E545B535962595F69585F68545A63494E56AFB0B1AFB1B1AFB1B1AFB1B1AEB0B0AEB0B0 AEB0B0ADAEAFADAFAFACADAEACADAEACAEAEABACAEABADAE3C3C3D010101000000404040A8A9AA A9A9ABA9AAABA8A8AAA8A8AAA7A8A9A7A7A9A6A7A8494E554D535B5257615258614E535C434850 A3A4A5A2A4A4A2A4A4A1A3A3A1A3A3A0A2A22929290000000000005152529F9FA19E9FA04D4E4E 010101000000000000484848A2A2A39C9C9D9A9B9C9B9B9C999A9B999A9B999A9B98999A98999A 40464C464C534B50584B5158474C543E4249949596949696949595949595939495939495929394 6666670000000000000101019091929091928F90918F90919090918E8F908F8F908E8E8F8D8E8F 8E8E8F8C8D8E8B8C8D8B8D8D8B8C8D8A8C8C3B404641464C454A51454A51454951444950444950 44485044495044495043484F43484F43484F43484F42474E43484F42474E42474E42474E1C242B 1C242B1C242C0E10130302020606060303030A0A0AABAAA6FDFBF6F3F1ECF4F1ECF7F4EFBDBCB9 A9A7A2A4A09A8A8785868380787875696B6A595C572123240D0D141112171010150D0C10161818 38403B888D907E8081000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 0000000000000000000000000000000000000000000000000000000000001010109FA0A2777A7A 797B7D3D3E3F12101419191C1E1E22646363807C7D8B88888C8989938F8E969393959293969292 CDC9C5F3F0ECF0EDE9F0ECE7F0EBE8FAF7F28F8C87020202060606060606050303090A0A1B2229 1D252C1C242B42474E42474E42474E43474E42474E43474E43484F43484F44484F43484F43484F 444950434950444950454A51444950454A5141464D393D438A8B8C8B8C8D8C8D8E8C8D8E8C8D8E 8D8E8F8D8E8F8D8E8E8E8F905E5F600202020000001D1D1D2929290101010000004A4A4B919193 92929493939493939594949594949594949594949594959641464B454A524B51584A5058474D54 3E444A97989998999A98999A999A9B9A9B9C9A9B9C9B9C9D2526260101010000006565659D9D9E 9C9D9E9E9E9F9E9E9FA3A3A4202020141414131313787878A0A1A2A1A2A3A1A2A3A2A3A4A2A3A4 A2A3A4454B524C525A5157605259614D545B434950A5A6A7A6A7A8A7A7A9A7A7A9A8A8AAA8A8AA 767677020202000000131313A8A9AAAAABACAAABACABACADAEAEAFB1B1B1111111000000000000 535354ACADAEAEAFB0AEAFB0AFB0B1AFB0B1B0B1B24C525A525860585F68575E67545A63494F57 B1B2B3B3B3B5B3B3B5B3B3B5B3B3B5B4B4B6B4B4B67C7D7E020202000000060606B3B4B4B5B6B7 B5B6B7B5B6B7B5B6B8B6B7B8B6B7B9B6B7B9B6B7B8B6B7B9B7B8B9B7B8B9B7B8BAB7B8B9B7B8BA 50565E565C655B626C5C636C565D664B5259B8B9BBB8B9BBB9BABBB8B9BBB9BABB727272020202 000000000000969696BBBDBDB9BABBB8BABBB9BABBB8B9BABBBBBC121212000000000000707070 B9BABBB8B9BAB8B9BAB8B9BBB8B9BAB8B9BB50565E565C655C636C5B626C575E664C525AB6B7B9 B7B8BAB7B8BAB6B7B9B7B8BAB6B7B97B7B7D0202020000000C0C0CB3B4B5B5B6B7B5B6B7B4B5B6 B4B5B6B4B5B71919190101010000006D6D6DB2B2B4B3B3B4B3B3B4B2B3B4B2B3B3B2B3B44D535B 535961575E67585E68525962484E55AEAFB0AFB0B1AEAFB0AEAFB0AEAFB0ADAEAFADAEAFACAEAF ACADAEACADAEABACADABACADAAABACAAABAC3C3C3C010101000000404040A8A8AAA8A8A9A8A8AA A7A7A8A7A7A8A6A7A8A6A7A7A5A6A7474D544D525A52586151575F4D535B43494FA2A3A4A2A3A4 A1A2A3A1A2A3A0A1A2A0A1A22929290000000000005151519D9E9F575858010101000000000000 474747A2A3A39B9C9D9A9B9C9A9B9B999A9B999A9A999A9A98999A98999997989940464C474C53 4A50584A5058464C533D4248949596949495949495949495939395929294929294666667000000 0000000101019091918E90908F90908E8F8F8E8F908E8F8F8E8F908D8E8F8D8E8E8C8D8E8C8D8D 8B8C8D8B8C8D8B8C8D8A8B8C3A3F4540454B454A5143495044495044495043495044495043484F 43484F43484F43484F42474E42474E42474E42474E42474E42474E42474E1C242B1C242B1C242C 0E10130302020606060303030A0A0AABAAA7FDFBF6F4F1ECF4F1EEF7F4F1BCBBB9A7A4A1A6A19D 8C8A86868581787A77686A685A5E582023240F0F141112171010150C0A10171718393F3D898C8F 7D7D7E000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 0000000000000000000000000000000000000000000000001010109D9DA1757979797C7D3F4041 1010141B1A1E1F1F21646363807D7D8A88888A8887928E8D969392959393959191CEC9C7F5F2EE F0EEE8EFECE7F0ECE7FAF7F28E8C86020202060606060606050303090A0A1B22291D252C1C242B 42474E42474E42474E42474E42474E43474E43474E43484F43474E43484F43484F43484F434950 43495043495044495044495040464C393D4389898B8B8C8D8B8C8D8C8C8D8C8D8D8C8C8D8D8D8E 8D8E8E8D8E8F2E2E2F0101010000004E4E4E5A5A5A0202020000001818188F9091919293919293 92939492939493949593949593949594949641464B454A524A4F574A5058464C533E4249969698 98999998999998999A999A9A999A9B999A9B3A3A3A01010100000016171789898A9C9D9E9D9D9E 9E9E9F9D9E9FAAAAAAABABABACACACA2A4A4A0A0A2A0A1A2A1A2A3A1A1A3A1A2A3A2A2A4444A51 4C51595157605157604D535B434950A3A4A5A6A7A7A6A7A7A6A7A8A7A7A8A7A8A9757576020202 000000131313A7A8A9AAAAABA9AAABAAABACABACADABABAD4E4E4E010101000000202020AAABAD ACAEAFADAFB0ADAEB0ADAFB0AEAFB14C5259525860575D66575E67535961484E55B0B1B2B2B3B3 B2B3B3B1B2B3B2B3B3B2B3B4B2B3B47C7D7E020202000000060606B2B3B4B4B5B6B4B5B6B4B5B6 B5B5B7B5B6B7B5B5B7B5B5B7B5B6B7B6B6B8B6B7B8B6B7B8B6B6B8B6B7B8B6B7B94F565D555B64 5B626B5B626B565D664B5159B6B7B9B8B9BAB7B8B9B7B8BAB7B8B93E3E3F010101000000333333 B9BABBB7B9BAB8B9BAB7B9BAB8B9BAB8B9BAB7B8BAB8B8B8B3B3B3B3B3B3B2B3B3B7B8BAB7B9BA B7B9BAB7B8BAB6B8B9B6B7B94F565D555B645B616A5B626B565C654B5058B5B5B7B6B7B8B6B7B8 B5B5B7B6B7B8B5B5B77B7B7B0202020000000C0C0CB2B3B4B4B5B6B4B5B6B4B5B6B4B4B5B3B4B5 1919190101010000006C6D6DB1B2B3B1B3B3B1B3B3B1B2B3B1B3B3B0B1B24D535A525860575E67 575D66525961484E55ACADAFAEAFB0ADAEAFACADAFADAEAFACACAEACACAEACADAEABABADABACAD AAABACAAABACA9AAABAAAAAB3C3C3C0101010000003F4040A6A7A8A6A7A8A6A7A8A6A7A8A5A7A7 A5A6A7A4A6A6A4A5A6474D544C525A51565F51575F4C525942474EA2A2A4A1A2A3A0A1A2A0A0A2 9FA0A19F9FA1292929000000000000505151606162010101000000000000464646A1A2A29B9C9C 999A9B999A9B989A9A98999A989A9A9799999798999798999696983F444B464B524A50574A5057 464B523D4248949496949495949495929394939394919293919293656666000000000000010101 9091918E90908F90908E8F8F8D8E8F8E8F8F8D8D8E8D8D8E8C8D8D8C8C8D8C8D8D8B8C8D8B8B8D 8A8B8C8A8A8C3A3F4540454B44495043495043484F43484F43484F43484F43484F43484F43484F 43484F42474E42474E42474E42474E42474E42474E41464D1C242B1C242B1C242C0E1013030202 0606060303030A0A0AACAAA8FEFBF8F4F1EDF4F1EDF8F4F0BDBBB9A9A6A4A5A39E8B8886868380 797A76686B68595F592022220F0D151413181010150A0A101818193C423F8A8E927E8081000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 0000000000000000000000000000000000001010109D9EA27679797B7C7D4040421212151A1B1D 2121246664647E7D7D8A87888A8887918D8D959190959293969291CDC7C4F4F1EDEFECE8EFEBE7 F0EDE8F9F7F28D8A86020202060606060606050303090A0A1B22291D252C1C242B42474E41464D 41464D42464E42474E42474E42474E43484F43474F43484F43484F43484F434950434950434950 43484F44495040454C393D4388898A898A8A8A8B8B8A8B8C8A8C8C8B8C8D8B8C8D8C8D8E818283 0404040000000000007B7B7B848585020202000000000000727374919192919292919192919393 91939391929392949493949540454A454A524A50574A4F57464C533D4349959697959797969798 97979997989998989A99999B5E5E5E0202020000000000000000001C1C1C434444696A6A8F8F91 9C9D9E9D9E9F9D9E9F9E9FA09E9FA09FA0A19FA0A1A0A1A2A0A1A2A1A2A3444A514C515950565F 5157604C525A43484FA3A3A5A3A4A5A4A5A6A4A5A7A4A5A6A5A6A7747475020202000000131313 A5A7A7A7A9AAA8AAAAA8AAAAA8AAAAA9AAAB6A6A6A0202020000000B0B0BA9AAABACADAEACADAE ACACAEADAEAFADADAF4B5158515760575D66565D66525962484E55AEAFB1AFB0B1AFB0B1AFB0B2 AFB1B2B0B1B3B0B1B37C7C7C0202020000000303036B6C6D6C6E6E6C6D6E6C6D6E6D6D6E6D6D6E 747475B2B3B4B3B4B5B4B5B6B4B5B6B4B5B6B4B5B6B5B6B7B5B6B74F555D555B6459606A5A616B 555C644B5058B6B6B8B5B6B7B5B6B7B6B6B8B5B6B72121210101010000005E5E5EB5B6B7B6B7B8 B5B6B7B6B7B8B5B6B7B5B6B7B6B6B8B6B7B8B7B8BAB7B8BAB6B8B9B6B6B8B6B7B8B6B7B8B6B6B8 B5B6B7B5B6B74E545C545A645A616B59606A555C654B5159B3B4B5B4B6B6B3B5B5B4B5B6B3B5B5 B4B5B6797A7A020202000000010101232324232323232324232323232323232323040404000000 0000006B6C6CAFB0B2AFB1B2AFB1B2AFB0B2AEB0B1AEAFB14C525A515760565D66575D66515860 474C54ACACAEABACADABACADACACAEAAACACABACADABACADAAABACA9AAABA9AAABA9AAABA7A9AA A8AAAAA7A9AA3B3B3B0101010000003E3E3FA4A5A6A5A7A7A5A6A7A4A6A7A4A6A7A4A4A6A4A5A6 A3A3A5464C534B515951575F4F565E4C525A42484FA0A1A29EA0A09EA0A09FA0A19D9F9F9E9FA0 2929290000000000002121210102020000000000003737379FA0A19A9A9C98999A99999B98989A 98999A98989A9798999798999697989697989596973F444B454A52494F574A5057454B523C4147 9293949293949192939192939091929191929191926565660000000000000101018D8E8F8E8F90 8C8D8E8C8D8E8D8D8F8B8D8D8C8D8E8B8C8D8B8C8D8B8C8D8A8B8C8A8B8C898A8B898A8B898A8B 393E443F444B44495043484F43495043495043484F43484F43484F43474F42474E42474E42474E 42474E42474E41464D42474E41464D41464D1C242B1C242B1C242C0E1013030202060606030303 0A0A0AABA9A7FDFAF7F4F1EDF4F1EDF8F5F1BDBBB9A9A6A4A3A19C8A87848785817A7B766A6C6A 5B615C2224250D0D131113171010150C0A101617183D43408C91957D7D80000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 0000000000000000000000001010109C9C9F78797A7C7D7E4141431314161C1C1F1F1F22626162 7F7D7D8886868B8887928E8E949090969292989493CDC9C6F4F0ECF0EBE7F0EBE7F0ECE8F9F6F1 8C8985020202060606050606050303090A0A1B22291D252C1C242B41464D41464D42464E41464D 42474E42474E42474E42474E42474E42474E42484F42484F42484F43484F43484F43484F434950 40454C393D43888989898A8A8A8B8B8A8B8C8A8B8B8B8C8D8B8C8D8A8C8C525354020202000000 1A1A1A8D8E8F8E90902424240101010000004041418F90918F9091909192909192919293929394 92939492939440454A444951494F57494F57464C533D4349939595959797959797979799969798 98989A98989A9C9C9C3333330101010000000000000000000000000000000000002121215A5B5C 98999A9D9E9F9D9F9F9D9F9F9EA0A09EA0A09EA0A09FA1A14349504B505950565E50565F4C525A 43484FA1A2A3A3A4A5A3A4A5A4A4A6A4A5A6A4A5A7747475020202000000131313A4A6A7A6A8A9 A7A9AAA7A9AAA7A9AAA7A9AA757777020202000000000000A1A3A4AAACACAAACACABACADABACAD ABACAD4B515850565F565D66565D66525961484E55ADAEAFAEAFB0AEAFB0AFB0B2AFB0B1AFB0B2 B0B1B37A7B7B0202020000000000000000000000000000000000000000000000000F0F0FB0B2B2 B2B4B4B2B4B4B2B4B4B3B5B5B3B5B5B3B5B5B3B5B54E545C535A635A606959606A555C644B5058 B3B5B5B4B6B6B4B6B6B5B6B7B2B4B5050505000000000000707171B3B5B5B4B6B6B4B6B6B4B6B6 5F6061595A5B595A5B595A5B595A5B595A5B7B7C7DB4B6B6B4B6B6B4B6B6B4B6B6B4B6B6B4B6B6 4E545C535A635A616A596069555C654A5058B2B4B4B3B5B5B3B5B5B3B4B5B2B4B4B3B4B5797A7A 0202020000000000000000000000000000000000000000000000000000000000000000006B6B6C AEAFB0AFB0B1AEAFB0AEAFB0AEAFB0ADAEAF4B5159515760575D66555C65525860474C53AAABAC ABACADAAACACABACADA9ABABABACADAAABACA8AAAAA9AAABA7A9AAA7A9AAA7A9AAA6A8A9A6A8A9 3B3B3B0101010000003E3E3FA4A5A6A4A5A6A4A5A6A3A4A5A3A4A5A3A4A5A2A3A4A2A3A4464C53 4B515950565F4F565E4C525942474E9EA0A09EA0A09D9F9F9E9FA09D9F9F9D9E9F292929000000 0000000000000000000000000000000F0F0F898A8A98999A98999A98999A979899979899969798 9697989597979597979496969496963E434A454A524A4F57494E56454A513C4147929394919293 9192939191929091929191929090916465650000000000000101018D8E8F8C8D8E8C8D8E8C8D8E 8C8D8E8B8D8D8A8C8C8A8C8C8A8C8C8A8B8B8A8B8B8A8B8B898A8A898A8A898A8A393E443F444B 44495043484F43495043484F43484F43484F43474F43474F42474E42474E42474E42474E41464D 41464D41464D41464D41464D1C242B1C242B1C242C0E10130502020606060303030A0C0CADABA9 FEFBF7F4F1EDF4F1EDF7F4F1BDBBBAA6A4A2A3A19C8C8A84868683797A786C6E6C5F6360232527 0D0D141213170F10140A0A10151517383F3C878D8F7D7D7E000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 0000000000001010109D9EA177797A797B7D403F411414151C1E202021236363637F7D7D878585 8B8887918D8C959191959393989494D0CBC8F4F0EBF0ECE7F0EBE7F1EDE9F8F5F08D8A86020202 060606060606050303090A0A1B22291D252C1C242B41464D41464D41464D41464D41464D42474E 42474E42474E42474E42474E42474E42484F42484F42484F43484F43484F43484F40454C383C42 878889898A8A898A8A8A8A8B8A8B8B8A8B8C8A8B8C8A8B8C2121210101010000004A4B4B8B8C8C 8D8E8E5353530202020000001010108E8E908F90918F9091909192909192919293929294929394 40454A444951494E56494F57454B523D4248939495949696959797959697969798969798979899 9698989E9F9F62626220202000000000000000000000000000000000000000000027282898999B 9D9D9F9D9D9F9D9E9F9D9F9F9E9FA09EA0A04349504A50584F565E4F565E4C525A43484F9FA1A1 A2A3A4A3A4A5A3A4A5A3A4A5A4A4A6737474020202000000131313A3A4A5A5A6A7A6A7A8A6A7A8 A7A8A9A7A8AA6A6B6B020202000000030303A6A7A9A9AAABAAABACAAACACAAABACABACAD4A5058 50565F555C65555C65515860484D54ABADADAEAFB0AEAFB0AEAEB0AFB0B1AFAFB1AFAFB17A7A7A 020202000000000000000000000000000000000000000000000000101010AFB0B2B1B2B4B2B3B4 B1B2B4B1B2B4B1B3B4B2B3B4B2B4B44D535B535963585F69596069545B644A5057B2B4B5B3B5B5 B3B5B5B3B4B5ABADAE0000000000000000007A7A7BB1B3B4B3B5B6B2B4B5B3B5B6080808000000 000000000000000000000000424343B3B4B5B3B4B5B3B4B5B3B5B5B3B4B5B3B5B54E545C535A63 596069585F69545B634A4F57B0B2B3B2B4B4B2B4B4B1B2B4B1B3B4B1B2B4797979020202000000 0000000D0D0D0D0D0D0C0C0C0C0C0C0C0C0C0C0C0C0101010000000000006B6B6CADADAFAEAEB0 AEAEB0ADAEAFADAEAFADAEAF4B515850565F555C65555C6450575F474C53A8AAABAAACACAAACAC A9AAABA9ABABA9AAABA8A9AAA8A9AAA7A8AAA7A8A9A6A7A8A6A7A8A6A7A8A5A6A73B3B3B010101 0000003E3E3FA3A3A5A4A4A6A3A4A5A3A4A5A2A3A4A2A3A4A2A3A4A1A2A3464C534B50594F565E 4F555E4B515942474E9E9FA09D9F9F9D9F9F9D9D9F9D9E9F9D9D9F292929000000000000000000 0000000000000000000000002B2B2B979899979999979899979899969798969798959697959697 9597979495969395953E434A454A52494E56494E56454B523C4147909192919293919293909192 8F90918F90918F90916465650000000000000101018D8E8E8C8D8D8C8D8D8C8D8D8B8C8D8B8C8D 8B8C8D8A8B8C8A8A8B8A8A8B8A8A8B89898A898A8A89898A88898A393E443F434B43484F43484F 42484F42484F42484F42474E42474E42474E42474E42474E42474E42474E41464D41464D41464D 41464D41464D1C242B1C242B1C242C0E10130502020606060302030A0A0CADABAAFCF9F5F3F1EC F4F1EDF7F4F1BCBBB9A7A5A2A4A19D8D8A868785827879766D6F6D5E63602223250D0D14121318 1010150A0A1013161638413E898E907C7C7D000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 1010109E9E9F7577787A7B7C4242431615181D1D212222236463647E7D7D8785848B8786928E8D 969291969393999594D2CDCAF5F0EBF0EBE7F1ECE8F0ECE8F8F4EF908D8B020202060606060606 050303090A0A1B22291D252C1C242B41454D40454C41464C41464D41464C41464D42464E42474E 42474E42474E42474E41474E42484F42474E42474E43484F42484F40454C383C4286878888898A 88898A898A8B898A8B898A8B8A8B8C7A7A7B0000000000000000007778788C8D8E8D8E8F7E7F80 0202020000000000006A6A6B8E8F908E8F908F90918F909190919290919290919240444A444951 494E56494E56454A523D4148939495949496949496959697969697969797969797979899969898 9F9F9FA5A5A59898986E6E6E4848481515150101010000000000000000005051529A9B9C9C9D9E 9C9D9E9D9E9F9D9D9F9E9FA042484F494F574F555E4F555D4B515943474F9FA1A1A0A1A2A1A2A3 A1A3A3A2A3A4A2A4A4727373020202000000131313A3A3A5A4A5A7A6A6A8A6A7A9A6A7A9A6A6A8 4E4F4F010101000000151515A6A6A8A8A9ABA8A9ABA8AAABA9AAACA9ABAC4A505750565F555B64 555C64515760474C54AAACACACADAEACADAEACAEAEADAEAFADAEAFADAEAF7A7A7A020202000000 0404047979797C7C7C7C7C7C7C7C7C7C7C7C7C7C7C808081B0B0B1B0B0B2B0B0B2B0B0B2B0B1B3 B0B2B3B0B1B3B0B2B34C525A525862585E68585F68545A634A4E57B1B3B4B1B2B4B1B2B4B1B3B4 B1B2B4141414010101000000626363B2B3B4B3B4B5B2B4B5B3B4B5080808000000000000000000 000000000000444444B1B2B4B1B2B4B1B2B4B1B3B4B1B2B4B1B3B44D535B535963585F69585F68 535A63494E56AFB1B2B0B1B3B0B1B3B0B1B2B0B0B2B0B2B37778790202020000000C0C0CBDBDBD C0C0C0C0C0C0BFBFBFBFBFBFBFBFBF1818180101010000006A6A6AABACADACADAEACADAEABADAD ABACADABADAD4A50574F555E555B64545B6450565F464B53A8AAABA8A9ABA8A9ABA8A9AAA8A8AA A8A9AAA8A9AAA7A8AAA6A7A8A6A6A8A6A7A9A6A7A9A6A6A8A4A5A73B3B3B0101010000003E3E3E A1A2A3A2A3A4A2A3A4A1A2A3A1A2A3A0A2A2A0A1A2A0A2A2464B524B50594F555E4F555E4A5058 42464D9E9FA09D9D9F9D9D9F9C9D9E9C9D9E9B9C9D2929290000000000000000003939393D3D3D 000000000000010101525253969899969798969697969697959597959597949496949596949496 9394953D4249444950494E56484D55444A513C40479091929091928F90918F91918E8F908E9090 8D8F8F6464640000000000000101018C8D8E8C8D8E8C8D8E8B8C8D8B8B8D8A8B8C8A8A8C8A8A8C 898A8B898A8B88898A88898A88898A878889878889393E433F434B43484F42484F42474F42474F 41474E42474E41474E41474E42464D41464D41464C41464C41464D41454C41454D41454D40454C 1C242B1C242B1C242C0E10130502020606060302030A0A0CACABA9FCFAF5F3F0ECF3F1ECF7F4F1 BCBBB9A5A4A0A3A19B8D8A858986847A7B786C6F6B6065612325270D0D141112171010140A0A0F 1517183842408B90927A7A7D000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000101010999A9C 767A7B7B7D7E4140411717181F20222425276464647E7E7E8986848D8987928E8F969292969493 989494D1CDC9F4F0EBEEEAE5EFECE7F0ECE8F8F5F0918E8B020202060606060606050303090A0A 1B22291D252C1C242B40454C41464D41464D40454C41464D41464C41464D41464D41464D41474E 41474E42474E41474E42484F42484F42474E43484F3F444B383C42868787878888878888878889 888A8A88898A88898A494A4A000000000000000000010101010101010101010101000000000000 0000003838388C8D8E8E8F908E8F908F90918F90918F90919091913F4349434850484D55484E55 444A513C4147919293929394939495929495949596949697949697959697959698969798969798 98999A9D9D9EA2A2A2A6A6A68585851313130101010000002A2A2A999A9A9A9C9C9B9D9D9B9D9D 9C9D9E9C9D9E43484F4A4F584E555D4F555E4B515942464D9E9FA0A0A1A2A1A2A3A0A1A3A1A2A3 A0A1A3727273020202000000131313A0A2A2A3A4A5A4A6A6A4A5A6A4A5A6A5A6A7313131010101 0000002D2E2EA4A5A6A7A8A9A7A8A9A8A9AAA8A9AAA8A9AA494F564E545D545A63545B6450565F 464B53A8AAABAAACADAAACADABACAEABADAEABACAEABACAE787879020202000000060606B2B3B3 B4B5B5B4B5B5B4B5B5B4B5B5B5B6B6B4B5B6AEAFB0AFB0B1AFB0B1AFB0B1AFB0B1AFB0B1AFB0B1 AFB0B14D535B535962575E67585F68535A62494E56B1B2B3B0B1B2B0B1B2B0B1B3B0B1B2323232 010101000000474747B0B1B2B1B2B3B1B1B3B1B2B3A9A9A9A8A8A8A8A8A85F5F5F020202000000 444444B1B2B3B1B2B3B0B1B2B0B1B2B0B1B2B0B1B24C525A525861575E67575E67535A62484E55 AEAFB0AFB0B1AFB0B1AEB0B1AFB0B1AEB0B17777770202020000000C0C0CACADAEADAEAFADAFAF ADAEAFACADAEACAEAE181818010101000000696A6AAAACADABADAEAAACADAAACADAAACADA9ABAC 4A505850565F545A63545B644F555E454A52A7A8A9A7A8A9A7A8A9A6A8A9A6A7A8A5A7A8A5A7A8 5556570202020000003C3C3CA4A5A6A3A5A5A3A4A53A3A3A0101010000003D3D3DA0A2A3A1A2A3 A1A2A3A1A2A3A1A2A3A0A1A29FA0A19FA0A1454A51494F574E545C4E545C4A505840454C9C9D9E 9B9D9D9B9D9D9A9C9D9A9C9C9A9B9C2828280000000000002D2D2D9E9E9F999999161616000000 0000000303037777789596979596979495969495969495969394959293949293949193933E4349 444951484D55484E564349503B40468F90918F90918F90918D8E908E8F908D8E908C8D8F636464 0000000000000101018B8C8D8B8C8D8A8B8C8A8B8C8A8B8C898A8B898A8B888A8A888A8A888A8A 878989878989878888878888878888383D433E434A42484F42474E42474E42474E42474E41474E 42474E42464E42464E41464D41464D41464D40454C41464D40454C40454C40454C1C242B1C242B 1C242C0E10130502020606060302030A0A0CADACA9FEFBF7F3F1ECF4F1EDF7F4F1BEBBBAA5A29F A2A09A8D8B878886837A7A776D706C6065602427290E0F161213161010150A0A0F17181837413E 8990917D7D7E000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 0000000000000000000000000000000000000000000000000000000D0D109496997477787A7C7E 3F4041161717202122252628656465807E7E8986858D8988939090979494979493989493D0CDCA F2EEEBEEEBE5EFECE6F0EBE7F7F4EF8B8883020202060606050606050303090A0A1B22291D252C 1C242B40454B40454C40454C40454C41464C41464C41464C41454C41464D41464D41464E41474E 42474E41474E42474E42474E42474E3F444B373B4185868786878887888987888987888988898A 88898A1A1A1A0000000000000000000000000000000000000000000000000000000000000A0A0A 8788888D8E8F8D8E8F8D8E8F8E8F908E8F908F90913F4349434850484D55484E55444A513C4047 919292929393929494929495929494939596919293171717121212121212757777979799969798 97979998989A9B9C9C6060600101010000001818189798999A9B9C9A9B9C9A9B9D9A9C9D9B9C9D 42474E494E564E545C4E555D4A505841464D9D9E9F9E9FA09FA0A19FA0A29FA0A1A0A1A3717272 020202000000131313A0A1A2A3A4A5A2A4A5A3A4A5A4A5A6808081050505000000000000696969 A4A6A6A5A7A7A5A7A7A6A7A8A6A8A8A7A8A9494F564E545D535A63545A634F565E464B52A8A9AA A9AAABA9AAABAAABADAAABACAAABADABACAE787878020202000000060606AAABACABADAEADAEAF ADAEAFACAEAFADAEAFACAEAFACAEAFADAFAFADAFAFADAFAFADAFAFADAEAFADAFAFAEAFB04C525A 515861575E67575E67525962484E55AFB0B1AFB0B1AEB0B0AFB0B2AFB0B1525253010101000000 08080898999AAFB0B1B0B0B2AFB0B1B2B3B4B2B3B4B0B2B32C2C2C010101000000444444AFB0B1 AFB0B1AFB0B1AEAFB0AEB0B0AEAFB04C525A515861575E67575E67525962484E55ACAEAEADAFAF ADAFAFADAFB0ADAFAFADAFB07777770202020000000C0C0CAAACADACADAEABADAEACADAEACADAE ABADAE181818010101000000686969A9AAABAAABACA9AAABA9A9ABA9AAABA8A9AA494F564E545D 545A63535A634F555E454A51A5A7A7A6A8A8A5A7A7A5A7A8A5A7A7A5A7A8A4A6A7696A6A020202 000000333333A3A4A5A2A4A5A3A4A53333330101010000004343439FA0A1A0A1A29FA0A19FA0A1 9FA0A19E9FA09E9FA09D9E9F454A51494F574E545C4D545C494F5740454C9A9C9D9A9C9D9A9B9C 9A9B9C999A9B999A9B282828000000000000505050979899979899808080010101000000000000 1414148C8D8E9395959395959294949294949294949292939192939191933D4249434850484D55 484D554349503B40468E8F908E8F908D8E8F8D8E908D8E8F8C8D8F8C8D8F636363000000000000 0101018B8C8D8A8B8B8A8B8C8A8B8C898A8A898A8B88898A88898A88898A878889878889878889 868788868788858687383D433E434A42474E42474E42474E41474E41474E41474E41464D41464D 41464D41464C41454C41454C40454C40454C40454C40454B40454B1C242B1C242B1C242C0E1013 0502020606060303030A0A0AADABA9FEFBF7F4F1EDF5F1ECF7F5F0BEBCBBA6A4A0A3A19B8C8B87 888684797A766B6E6A6164612426280E10161212151010150A0C101314163A42418C9495787879 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 0000000000000000000000000000000000000000000D0D109A9B9F747678787B7C3E4040151617 212223242527646364807E7F8A87868D89889390909794949794939A9695D2CECCF3EFECEEEAE6 EFEBE8EFEBE6F7F5EF8E8C87030202060606060606050303090A0A1B22291D252C1C242B3F444B 3F444B40454B40454C40454C41454C41454C40464C41464D40464C41464D41464E41464D41464E 42474E42474E42474E3F444B373B418486878687888687888687888788898687886E6E6F020202 0000000000002424242727272727272727272727272727270101010000000000005F5F608C8D8E 8D8E8F8D8E8F8D8E8F8E8F908E8F903E424842474F474C54474D544449503B40468F9092929393 92939392939492949492939493949521212101010100000039393A959697949697969798969798 9798993F3F3F01010100000036363698989A999A9B9A9B9C9A9B9C9A9C9D9A9C9D42474E494D56 4D545C4E535C4A505841464D9B9D9E9E9FA09E9FA09D9F9F9FA0A19EA0A0717172020202000000 1313139FA0A2A2A2A4A1A2A4A1A2A3818282151515010101000000070707A2A3A3A4A5A6A5A7A7 A5A7A7A5A7A7A5A7A7A6A8A8484D564D535C5259625259624E555D454A51A6A8A9A9AAABA9AAAB A8A9AAA9AAABA9AAABA9AAAB777778020202000000060606A9A9ABAAABADABACAEABACAEABACAE ABACAEABACAEACADAFACAEAFACADAFACAEAFADAFAFACAEAFADAFAFADAFAF4B5159515660565D66 565C66525962484D55ADAFB0AEB0B0AEB0B0ADAFB0AEB0B0A6A7A70D0D0D0000000000002A2B2B 9C9EA0AEAFB0ADAFB0AEAFB0ADADAF515152020202000000000000434343AEAFB0AEB0B0AEB0B0 AEB0B0AEB0B0AEB0B04B515950565F565C66565C66515860474C54ABADAEACAEAFACAEAFACADAE ACAEAFACADAE7576760202020000000C0C0CA9AAACABACAEAAABADABABADABABADABABAD181818 010101000000686969A8A8AAA9AAABA9AAABA9AAABA8A9AAA8A9AA494E564E535D535A63535963 4E555D454A51A4A6A7A5A7A7A5A7A7A4A6A7A4A6A6A4A5A6A4A5A67A7B7B020202000000131313 A2A2A4A1A2A4A2A2A41A1A1A0101010000005252539E9FA09FA0A19FA0A19E9FA09E9FA09E9FA0 9D9F9F9D9F9F444951484E564D535B4D535B494F563F444B9A9B9D9A9B9C9A9B9C98999A999A9B 98999A2828280000000000004E4E4F959798969798999A9B515151010101000000000000333334 9394959294949293949294949293939293939192939192933D4148434850484D55474C54434950 3B3F468D8F908D8E8F8D8E8F8C8E8E8C8D8E8C8D8D8B8C8D6363630000000000000101018A8A8B 898A8B8A8A8B89898A89898A88888A88888A88888A878889878789878889868788868788868788 858687383C433D424941474D41474D41464D41464D41474E40464C41464D41464D41454C41464C 41454C41454C40454B40454C3F444B3F444B3F444B1C242B1C242B1C242C0E1013050202060606 0303030A0A0AACAAA8FDFAF6F3F0ECF4F1EDF8F5F1BDBBBBA5A29FA4A29B8E8C888886847A7C77 6E716C61645F2527280E0F151112161010150A0C0F15151739413F889092797879000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 0000000000000000000000000000001010109E9EA17576777A7D7E3C3D3D161718212324242527 646463807F7E8B87878D8A889490909793939795939A9795D1CDCBF3EEEAEFEBE7F0ECE8EFECE7 F8F5EF93928E020302060606060606050303090A0A1B22291D252C1C242B3F444B3F444B40454C 40454C40454C41464C41464C41454C41464D41464D41464D40464C41464E41464D41464D41474D 41474D3E434A373B418484858587888587888587878687898687883E3F3F010101000000151515 9393939495959596969596969596969697971E1E1E0101010000002F2F2F8B8B8C8C8D8D8C8D8D 8C8D8E8C8E8E8D8E8F3E424842474F474C54474D544449513C40478F9091909193919293919293 9293949293949293945556560202020000000000002929295556576565665555562E2E2F000000 0000000000006B6B6B98999A98999A999A9B999A9B9A9B9C9A9A9C41464E484D564D535B4D535B 494F5740454C9B9B9D9C9E9F9C9E9F9D9F9F9D9FA09EA0A0707071020202000000040404272728 2727272727280F0F0F000000000000000000010101717171A3A5A6A3A3A5A4A5A6A4A5A6A4A5A7 A4A6A7A4A5A7484D564D535C5359625259614F555E454A52A6A7A8A7A9AAA7A9AAA7A9A9A7A9AA A8A9AAA8A9AA767677020202000000050505A7A8A9AAABADAAABACAAABACAAABACAAABACABABAD ABABADABACADABABADABACADACADAEACACAEACADAEACACAE4B505950565F555C65555C65515860 474C54ACADAFACAEAFACAEAFACAEAFACAEAFAEAFB06C6C6C0202020000000000000A0A0A454545 636565555656212122000000000000000000000000424343ACADAFACAEAFACAEAFACADAFACAEAF ACADAF4B515950565F565C66555C65515761474C54ABABADACADAFACADAFABACADACADAFABACAD 7575750202020000000C0C0CA8A9ABAAABACAAABADA9AAABA9AAABA9AAAB181818010101000000 676869A6A7A8A7A9A9A7A9A9A7A8A9A7A9A9A6A7A8494E564D535C5259615259614D545C444950 A3A4A6A4A5A6A4A5A6A4A5A6A3A4A6A3A4A5A3A4A5A0A0A10D0D0D00000000000039393A666767 3F40410101010000000000007878799E9FA09EA0A09D9E9F9D9F9F9D9F9F9C9D9F9C9E9F9C9C9E 444950484D564D535C4D535B494E5740444C999A9B999A9C98999B98999A97989A979899282828 0000000000004E4E4E9597989495969496979A9A9B242424000000000000010101595A5B919293 9192939192939091929091929091928F90913D414842474F474C54474C5442484F3A3F458D8E8F 8C8E8F8C8E8F8C8D8D8C8D8E8B8C8D8B8C8D636363000000000000000000161617161717161617 16161716161716161616161629292A868788868788858787858787858586858686858586383C43 3D424942474E41464D41464E41464E41464D41464D40464C40464C41454C40454C41454C40454C 40454B40454C3F444B3F444B3F444B1C242B1C242B1C242C0E10130502020606060303030C0C0C ADABA9FCF9F5F2EFEBF3F0ECF8F4F2BEBCBBA3A19DA5A39D8E8C888987837C7C75757670666A64 2427270E10141012151010150C0D10151718363F3D858D8F787678000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 00000000000000000010101099989A757677797C7C3C3E3E171819222324232426646363807E7E 8B87878E8A8993908F9793939895949B9896CFCBC7F0EDE9EFEBE7F0EBE7EFEAE6F8F5F0908D8A 020202060606060606050303090A0A1B22291D252C1C242B3F444B3F444B3F444B40444B40454B 40454C40454C40454C40454C40454C40454C40464C41454D41464D41464D41474D41474D3E4349 373B4184848584858685868785868785868785868710101000000000000046464686888988898A 87898A898A8B898A8B8A8A8C4C4C4C0101010000000404048282838C8C8D8C8C8D8C8D8E8C8D8E 8C8D8E3E424842474E464B53474C5443484F3B3F468F90918F90918F9192909293909293919294 9192949A9A9B333333010101000000000000000000000000000000000000000000000000424242 9B9C9D97989997989998999A98999A999A9B999A9B41464D484D554C525B4D535B494F5640454C 9B9B9D9B9C9E9C9D9F9C9D9F9C9D9F9D9E9F6F7070020202000000000000000000000000000000 0000000000000000000101016F6F6FA8A8A9A3A3A5A3A3A5A3A3A5A3A3A5A4A4A6A4A4A6A4A4A6 484D554D525B5258615259614E545C454A51A5A6A7A5A7A8A5A7A8A5A7A8A6A8A9A6A8A9A7A9AA 757676020202000000050505A6A7A8A8AAABA9AAABA9AAABAAABACAAABACAAABACAAABACABABAD AAABACABABADABABADABABADABABADABABAD4B50594F555E555C65555C65515760474C54ACACAE ABACAEABACAEABACAEABACAEACADAFB2B2B3515151010101000000000000000000000000000000 0000000000004F4F4F232323010101424343ACADAFACACAEACACAEACACAEACACAEACACAE4B5059 50565F555B65555B6550565F464C53AAAAACAAABADAAABADAAABADAAABADA9ABAC747575020202 0000000B0B0BA6A8A9A9AAABA8AAABA9AAABA8A9AAA8A9AA181818010101000000676768A6A7A8 A7A8A9A6A7A8A6A7A8A6A7A8A5A6A8484D564D535C5259615258614D545C444950A3A3A5A3A4A6 A2A3A5A2A3A5A2A3A5A2A3A5A1A2A4A1A2A4525252020202000000000000000000000000000000 0000002D2D2DA0A0A19D9E9F9D9E9F9C9D9F9C9D9F9C9D9F9C9C9E9C9C9E9C9C9E444950484D56 4C525B4C525B484D553F444B999A9B97999A97999A969899969899969798282828000000000000 4D4E4E949596949696949596949596888888070707000000000000060606777879919293919293 9091929091928F90918F90913D414842474F474C54464C5342484F3A3F458C8D8E8C8D8E8B8C8D 8B8C8D8A8B8D8A8B8D898A8C616263000000000000000000000000000000000000000000000000 000000000000181818868788858687858687858687858586858586858586383C423D424941464D 41464D41454D41454D40464C40454C40464C40454C40454C40454B40454C40454B40444B3F444B 3F444B3F444B3F444A1C242B1C242B1C242C0E10130502020606060303030C0C0CAEACAAFDFAF5 F3F0ECF3EFECF7F4F0BDBCBAA4A19EA4A29C8E8C868B89837C7C76767771686D68222525101015 1010151010150C0C10161717373E3B838A8C727175000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 00000010101095949876777A797B7B3E3F401A1B1C2526272728296363627F7D7D8C87878F8B8A 93908E9794939896959B9895CFCAC7F1ECE9EEE9E3EFECE7EFEBE6F7F2EF8F8C89020202060606 060606050303090A0A1B22291D252C1C242B3F444B3F444B3F444B3F444B40454B40444B40454C 40454C40454C40454C40464C40454C40464C40454D40454D41454D40454D3E4249363A40838485 838585838585858587848586626364020202000000000000717272868788868788878789878889 88898A88898A767677020202000000000000545656888A8A8A8C8C8A8C8D8B8C8D8B8C8E3D4148 42474E464C53474C5442484F3A3F468E8E8F8E8F908F90918F9091909192909192909192919192 9898996161611313130000000000000000000000000000001313136666669D9D9D959697969798 96979896979896979897989997989940454D474C554C525B4C525B494E5640454B9A9B9C9A9C9C 9A9C9C9C9C9E9B9C9D9C9C9E6F7070020202000000000000000000000000000000040404292929 535353868686A6A7A89FA1A2A0A2A2A0A2A2A1A3A3A1A3A3A1A3A4A1A3A3A2A4A5484D554D525B 5157605258614D535B434951A4A4A6A4A5A6A5A6A7A5A6A8A5A6A7A5A6A8A6A7A9747576020202 000000050505A4A6A7A6A7A9A7A9AAA7A9AAA7A9AAA7A9AAA7A9AAA7A9AAA7A9AAA8AAABA8AAAB A8AAABA8AAABA8AAABA8AAAB4A4F584F555E555B65545B6550565F464C53AAABACAAACACA9ABAB ABACADAAACACABACADABACADB5B6B68585851717170000000000000000000000000B0B0B646464 B4B5B5424343010101424242A9ABABA9ABABAAACACA9ABACA9ABABA9ABAC4B50584F555E545B64 555B654F565E454B53A8A9AAA8AAABA8AAABA9AAABA8AAABA9AAAB7474750202020000000B0B0B A5A6A8A6A8A9A6A7A9A6A8A9A6A8A9A6A8A9181818010101000000666666A4A5A6A5A6A7A4A5A6 A4A5A7A4A5A6A4A5A7474C554C525B5257615057604D535B434850A1A2A3A1A3A3A1A3A3A2A3A4 A0A2A2A1A2A3A0A1A29FA0A2A9A9AA5656560101010000000000000000000101013A3A3AA5A5A6 9C9D9E9C9D9E9B9C9D9B9C9D9B9C9D9B9C9D9A9C9D999B9B999B9C42474E484D554C525A4C525A 474D553E444B9798999798999798999697989697989696982828280000000000004D4D4D939495 9294959293949294959495966363630000000000000000001A1A1A8B8C8C8F90918F90918F9091 8E8F908D8E903C404841464E474C54464B5342474F3A3E448C8C8E8A8C8C8A8C8C8A8B8C898B8B 8A8B8C898A8B616162000000000000000000000000000000000000000000000000000000000000 181919858687848586848586838585838586838585828485383C423D424940454C41464D40454C 40454C40464C40454C40454C40454C3F454B40454B3F444B3F444B3F444B3F444A3F444B3F444B 3F444B1C242B1C242B1C242C0E10130502020606060303030C0C0CAEACA9FDFAF6F3F0EDF4F1ED F7F4F0BDBBBBA5A29FA4A29C8E8C868A87847C7B77767772676C68232526101016121215101214 0A0C0F1415173B423E85898B747576000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000D0D10 9294987477777B7C7D3F3F411B1B1C272828262727626161827E7E8C88878F8B8A94908E979494 9896949B9795D0CBC8EFEBE7ECE7E2EFECE7F0ECE7F6F3EE8E8B87020202060606060606050303 090A0A1B22291D252C1C242B3F434A3F444A3F444A40444B3F444B40444B40444B3F444B40454C 3F454B40454C40454C40454C40454C40454D40454C41464D3D4249363A40818283838586838586 84858684858788898A969696979797979797898A8A86878885878887878986878986878988888A 8A8B8D9A9A9A9B9B9B9C9C9C909091898B8B898B8B8A8B8C8A8C8C8B8C8D3D404741464E464B53 464B5342484F3A3F458B8D8E8E8F908F90918F8F918F9091909092909092919192919192989899 A0A0A08D8D8D7A7A7A6969697777778F8F8FA2A2A29B9B9D949596949596959697959697969798 95969897989996979940454D464B544B51594B515A484E553F454B98999A999B9C9A9C9D9A9B9C 9A9C9D9B9C9DA1A2A3B0B0B0B1B1B1B1B1B1B2B2B2B2B2B2B3B3B3B2B2B2AEAFAFA8A9AAA3A4A5 9FA0A29FA0A29FA1A29FA0A2A0A2A2A0A2A2A0A1A2A1A3A3A1A2A3474C534B515A505760505760 4D535B434950A1A3A4A4A5A7A4A5A7A4A5A6A5A6A8A5A5A7A5A5A7ABACADBCBCBCBCBCBCBABABB A6A7A9A6A6A8A6A7A9A6A7A9A6A7A9A6A7A9A6A7A9A7A8AAA7A9AAA7A8AAA7A9AAA7A9AAA7A8AA A7A9AAA7A8AA4A4F584E545E545A63545A644F565E464C53A8A9ABA9ABACA9ABACA9AAABA9ABAC A9AAABA9AAABA9AAABB0B0B1BDBDBDACACAC8989897878788D8D8DB7B7B7B4B4B4A8AAABB7B7B8 C0C0C0B7B7B8A9AAABA9ABABA9ABABA8AAABA9ABABA8AAAB4A4F574E545D545A63545A634F565E 454B53A7A8AAA7A9AAA8AAABA7A8AAA7A9AAA7A8AAAEAFAFBDBDBDBDBDBDBBBBBBA7A8AAA6A7A9 A6A6A8A5A6A8A5A6A8A5A5A7B8B8B8BBBBBBBBBBBBAEAEAEA4A5A6A4A5A6A4A5A6A2A4A5A3A4A5 A2A4A5474C554B515B5057605057604C525A42484FA0A1A2A1A3A4A0A2A3A0A1A2A0A2A39FA0A2 9FA0A29F9FA19F9FA1A9AAAAAAAAAA8F8F8F777777898989A9A9A9A9AAAA9B9D9E9B9C9D9B9C9D 9B9C9D9B9C9D9A9C9C9A9C9C999A9B999B9B999A9B41464D474C544B51594B5159474D553E434A 969799969798969798959697959698949596A1A1A1A5A5A5A4A4A49C9C9D929394929394919293 919293909192979798A1A1A1A1A1A1A0A0A09D9E9E8F8F918F90918F90918D8F908E8F908C8E8F 3C404841464E464B53454B5341474E393E448A8B8C8A8C8D898B8C898A8B898B8C89898A89898A 8D8E8E989898989898989898979797979797969696969696959595959595959595909091848586 848586838585838585838485838585828384373B423C414840454C40454C40454C40454C40454C 3F454B3F454B3F454B3F454B3F444B3F444B3F444B3F444B3F444A3F444B3F444B3E434A1C242B 1C242B1C242C0E10130502020606060303030C0C0CAEADABFEFBF7F3F0ECF4F0EDF7F4F0BEBCBA A3A09EA5A19C8F8C868A87837B7B767577716A6E692325271010151010150F12140A0C0F161919 37403C8A8F91767679000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 0000000000000000000000000000000000000000000000000000000000000D0D10919396787A79 787B7A3E41411E1F1F28292A262728636463837F7E8C88878F8B8A94908E9894939894949B9695 CFCAC7F0ECE8ECE9E4EEEBE5EFECE8F8F5F0908E8A030202060606060606050303090A0A1B2229 1D252C1C242B3E434A3F444A3F444A3F444A3F444A3F444B3F444B3F444B3F454B3F454B40454C 3F454B40454C40454C40454C40454C40454C3D4249363A40818183828384838485838385848586 84848584848585858685858685868785868785878885868786878986878986878987888A87888A 88898A88898A898A8B89898B89898B8A8B8C8A8A8C8B8C8D3D404741464D454B52464B5342474E 3A3F458B8C8D8C8E8F8D8F908D8E8F8E8F918E8F908E8F908F9091909192909192909192939595 96979799999B979899949696939495939495939596939495939596949596949596959698959697 95969840454C464B534B51594B5159484E553F444B979799999A9B999A9B9A9A9C9A9B9C9A9A9C 9A9B9C9A9B9C9A9B9C9B9C9D9B9C9D9B9D9E9C9D9E9C9E9F9D9EA09D9EA09D9EA09D9EA09E9FA1 9E9FA09FA0A29F9FA1A0A0A2A0A1A2A0A0A2A1A2A3474C534B515950565F5057604C535B434850 A0A1A3A2A4A5A2A4A5A2A3A4A2A4A5A3A4A5A3A4A5A3A4A5A4A5A6A4A5A6A4A5A6A4A5A7A5A6A7 A5A6A8A5A6A8A5A6A8A5A6A8A6A7A9A6A7A9A6A6A8A6A7A9A7A7A9A6A6A8A6A7A9A7A7A9A7A8AA 494E574E545D545A63535A634F565E454B52A8A8AAA8A9ABA8A9ABA8A8AAA8A9ABA8A8AAA8A8AA A8A8AAA8A8AAA8A8AAAAABABAEAFB0B0B1B1AEAEB0A8AAABA8A9ABA8A9ABA8A9ABA8A9ABA8A8AA A8A9ABA8A8AAA8A8AAA8A9ABA7A7A9A8A9AB4A4F574E545D535A63535A634F555E454B52A6A6A8 A6A7A9A6A7A9A6A6A8A6A7A9A6A6A8A6A6A8A5A6A7A5A6A7A5A6A7A5A6A7A5A6A8A4A5A6A4A5A7 A4A5A7A4A5A7A4A5A7A3A5A6A3A5A6A3A4A5A2A4A5A2A3A4A2A3A4A2A4A5A2A3A4A1A3A4474C54 4B515A50565F50565F4C525A42484F9F9FA1A0A1A29FA0A29F9FA19FA0A29E9FA09E9FA09E9FA0 9D9E9F9D9E9F9E9EA0A0A1A2A3A4A5A1A2A39C9D9F9B9D9E9A9C9D9A9C9D9A9C9D9A9A9C9A9B9C 9A9A9C99999B98999A98989A98999A40454D464C544B51594B5159474D543E434A959697959698 949697949596939596939495939495939394939394929294929294929394919193919293909192 9091928F90928F90928F90928F90918E8F918D8E8F8D8E8F8C8E8F8C8D8E8C8E8F3C404741464E 454B52454B5241474E393E448A8A8C898A8B898A8B89898B898A8B88898A88898A878889878889 868788868788868789858687858788858788858687858687858687848586848485848586838385 838385838485828284828384373B413C414840454C40454C40454C40454C40444C3F454B3F444B 3F444B3F444B3F434B3F444B3F444B3F444A3F444B3F444A3E434A3E434A1C242B1C242B1C242C 0E10130502020606060303030C0C0CADABA9FCF9F5F3F0ECF3F0ECF5F3EEBEBBB9A3A09DA6A09C 908D888A88837B7B767779746E716C2425271010151010141010140D0C0F18191A38413E858C8E 757579000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000101010919395767878797A7B3D3E3E 202021292B2A242526656363837F7F8C88878F8C8B94918F989393989493999594CEC9C6F1EDE9 EDE8E5EEEAE5EFEBE6F8F5F18F8D89030202060606060606050303090A0A1B22291D252C1C242B 3E43493F444A3F444A3F434A3F444A3F434A3F434B3F444B3F434B3F454B3F454B3F444B40454C 3F444B40454C3F444B40454C3C4148353A40808183828284828284838485838385848585848585 84848585868685858685868785868785868785868786878886878887888987888987888988898A 87898A89898B89898B898A8B8A8A8C8A8B8C3C404741464D444A51464B5341474E393E448B8C8D 8C8D8E8D8E8F8D8F8F8E8F908D8F8F8E8F908F90918F90918F90919091928F9192909192909193 9091939192949192949293949293949393949394959394959495969496969495969596973F444B 454B534A50584B5159464D543E434A96979998989A98989A999A9B99999B9A9B9C9A9B9C9A9A9C 9A9C9C9A9B9C9A9B9C9B9C9D9B9C9D9B9D9E9B9D9E9C9E9F9B9D9E9C9E9F9C9E9F9E9FA09D9FA0 9E9FA09F9FA19FA0A19F9FA1A0A1A2464B534B50594F565E50565F4B515942474FA0A1A3A1A2A4 A2A3A4A2A4A4A2A3A4A2A4A4A3A5A5A3A4A5A3A5A5A3A4A5A3A4A5A2A4A5A4A5A6A3A5A6A3A5A6 A3A5A6A3A5A6A4A6A7A4A6A7A5A6A7A4A6A7A6A6A8A6A6A8A6A7A8A6A6A8A6A7A8484E554D535C 5259625259614D545C444A52A6A7A9A7A7A9A7A7A9A7A8A9A7A7A9A7A8A9A7A8A9A8A8AAA7A8A9 A7A7A9A7A7A9A6A7A9A7A7A9A7A8AAA6A7A9A7A8AAA6A7A9A6A7A9A6A7A9A7A7A9A6A7A9A7A7A9 A7A7A9A7A8A9A7A7A9A7A8A9494E574E545D5259625359624D545C444A51A4A5A7A6A6A8A6A6A8 A6A7A8A5A6A7A5A6A7A5A6A7A5A6A7A5A6A7A5A6A7A4A5A6A3A5A6A4A5A6A3A5A6A2A4A5A2A4A5 A2A4A5A2A4A5A2A4A5A2A3A4A2A3A4A2A3A4A1A2A4A1A3A4A1A2A4A1A3A4464C534A50594F565E 4F555E4B515941474E9E9FA19F9FA19F9FA19E9FA09E9FA09E9FA09E9FA09D9E9F9D9E9F9D9E9F 9C9D9E9B9D9E9B9C9D9B9C9D9B9C9D9A9B9C9A9B9C999A9C999A9C9A9A9C98999B99999B98989A 98999A98989A97989940454D464B534A50584B5159464C533D4249949697949596949596939595 9394959394949394949393949293949292949292949091939091928F91928F91928E90918E9091 8E90918D8F908E8F908D8F908D8E8F8D8E8F8C8E8E8C8C8D8C8D8D3B404641464D444A51444A51 40464D383D43898A8C89898B89898B88898A88898A88898A878889878889868788868788868788 858687858687858687848586848586838485838485838485838385828385838385838385828384 828284828384373B413C414840454C40454C3F444B3F444B3F454B3F444B3F454B3F444B3E434B 3F444B3E434B3E434A3E434A3E434A3E43493E43493E434A1C242B1C242B1C242C0E1013050202 0606060303030C0C0CADABA8FBF9F4F3F0EBF3F0EBF7F4F0BEBDBCA3A09CA5A29B8F8D87898782 7C7C777679746C706B2526260F10151012150F12140A0C0F18191A343D3A888E8F79797C000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 0000000000000000000000000000000000000D0D1096979B76797977797A3B3D3C1B1D1D28292A 2526276664638380808C8887908C8B94918F989493989493999694CFCAC6F0EDEAECE7E4EEEAE4 EFEAE5F8F4F0908D89030202060606060606050303090A0A1B22291D252C1C242B3E42493E4349 3E434A3D424A3E434A3E434A3D424A3E434A3E434A3F444B3F444B3F444B3F444B3F444B3F444B 3F444B40454C3C414835393F808182818283828384828384828384828384838485828485838485 83858683858685868784858785868786878786878886878786878887888987888987898A878889 88898A88898A88898A898A8B3B404740454D444A51444A5241474E393E44898B8C8C8C8E8C8C8E 8C8D8E8D8D8F8D8E8F8D8F8F8D8E8F8E90908E8F908E8F908F91918F9091909192909192909193 9192939192949293949293949293949393959393959394959494969496963F444B454A524A5058 4A5058464C533E434A95969796979897989997989998999A98999A98999A989A9B999A9B989A9B 999A9C9A9B9C999A9C9B9C9D9B9C9D9B9D9E9B9D9E9C9E9F9C9E9F9C9D9E9C9E9F9D9E9F9D9E9F 9D9F9F9E9FA09E9FA0454B524A50594F555E4F555F4B515942474F9EA0A1A0A1A2A1A1A3A1A2A3 A1A1A3A1A2A3A2A3A4A1A2A4A2A3A4A2A3A5A2A3A5A2A4A5A2A3A5A2A4A5A2A4A5A3A5A6A3A5A5 A3A5A6A3A5A6A3A4A5A3A5A6A4A5A6A4A5A6A4A6A6A5A6A7A4A6A6484E554C525B525961525961 4D545C444A51A4A6A7A5A6A7A5A6A7A5A6A7A5A6A7A5A6A7A5A6A7A5A7A8A5A6A7A5A7A8A5A7A8 A5A6A7A5A7A8A5A6A7A5A6A7A6A7A9A6A7A8A6A7A9A6A7A9A6A7A8A5A6A8A5A6A7A5A6A7A5A6A7 A5A6A7A5A6A7484E564D535C5259615259624D545C434951A2A4A5A4A5A6A4A5A6A4A6A6A3A4A5 A3A5A5A3A5A5A3A4A5A3A5A5A3A4A5A3A4A5A2A4A5A2A3A5A2A4A5A2A4A5A2A4A5A2A3A4A2A3A4 A2A3A4A1A1A3A1A2A4A1A1A3A1A1A3A0A1A2A0A1A2A0A1A2464C534A50584F555E4E555D4A5158 41474E9C9E9F9D9E9F9D9E9F9D9F9F9C9D9E9C9E9E9B9D9E9B9C9E9B9D9E9B9C9E9A9B9D9B9C9D 999A9C9A9B9C9A9B9C999A9C999A9B999A9C999A9C98999A98999B979899979899979899969798 9698983F454C454B534A50584A5058464C533D4249939496939395939395939495929394929394 9293949092939192938F91928F91929091928F90918F91918E90908E90918E90908D8F908D8F90 8D8D8F8D8E8F8C8C8E8C8C8E8C8D8E8C8C8E8B8C8D3B3F4640454D444A51444A5140464D383D43 88898A88898A88898A878989878889878888878888858687868787858687848587858687848587 848586848586848586838485838485838485828384828385818283818283818283818283808282 363B413B40473F444B3F444C3F444B3F444B3F444B3F444B3E434A3E434A3E434A3E434A3E434A 3E434A3E424A3E434A3E42493E42493E43491C242B1C242B1C242C0E1013050202060606030303 0A0C0CADABA9FDF9F5F4F1EDF3EFEBF7F4F0BFBCBBA2A09BA7A39C908D888B8A847D7E7B767873 6C706A2527271010151212141012150C0C1016181938403D848B8C727275000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 0000000000000000000000000D0D109090957578787579783B3D3D1D1E1F272829252726656363 8380808C8889908E8C9592909996949996949A9694CDC9C7F0ECE8EDE9E5EEEAE6EEEAE5F7F3EF 8D8A86020202060606060606050303090A0A1B22291D252C1C242B3D42493D42493D42493E434A 3D424A3E434A3E434A3E434A3E434A3E434A3E434A3F444B3E434A3F444B3F444B3F444B40454C 3C414734393F7F8081818282818282828384828383828384828384828384828485828384838485 838485838485848586848586848586848687858687868788858788868788858788868789878889 8788898889893A3F453F454B444A5144495141464D393E44898B8C8A8C8C8B8C8D8B8C8E8B8C8D 8C8D8F8C8D8F8B8D8E8D8E8F8C8D8F8D8E908E8F918D8E908E8F918F90918F91918F90918F9191 9092929091929193939192939193949293949193949394953F444B454A52494F574A5058454B53 3D424994959696979896979896989996989897999A97999A97989997999A97999A989A9B989A9B 989A9B989A9B999B9C9A9B9C999B9C9B9C9D9B9C9D9B9C9E9C9D9E9B9C9E9B9C9E9C9E9F9C9D9F 9C9E9F444A51494F574E555D4E555D4B515941474E9D9FA09FA1A19FA1A19FA1A2A0A1A2A0A1A3 A0A1A39FA1A2A1A2A4A0A2A3A0A2A3A0A2A3A0A2A3A0A2A3A1A2A4A2A3A4A1A2A4A2A3A4A3A4A5 A2A3A5A3A4A5A2A3A5A2A3A5A3A4A5A2A3A5A3A5A6484E554C525B5157605158614C535B434950 A3A5A6A3A5A6A4A6A6A3A5A6A4A6A6A3A5A6A4A6A7A4A5A6A4A6A7A4A5A6A4A5A6A4A5A6A4A5A6 A4A5A6A4A5A6A4A6A6A4A5A6A4A6A6A3A5A6A3A4A6A4A6A6A3A4A6A4A5A6A3A5A6A3A4A6A3A5A6 474D544C525A5158615157604D545C434951A2A3A4A3A4A5A3A4A5A3A4A5A3A4A5A3A4A5A2A3A5 A1A2A4A2A3A5A1A2A4A1A2A4A0A2A3A0A2A3A0A2A3A0A2A3A1A2A39FA1A2A0A1A2A0A1A29FA1A2 A0A1A29EA0A19EA0A19FA1A19D9FA09EA0A0454B52494F584E545D4E555D49505840454D9B9D9E 9C9D9E9C9D9E9C9D9E9C9D9E9B9C9E9B9C9E9A9B9D9A9B9D999B9C999B9C999B9C989A9B989A9B 97999A989A9A97999A9799999799999798999698989697989596989697989495979596973F444B 444A524A5058494F57454B533C4248929395929394929394919394919393919394909293909192 8F91928F90918E8F918E8F918E8F918D8E908D8E908E8F908C8D8F8D8E8F8C8D8E8B8D8E8C8D8E 8A8C8D8A8C8D8A8C8C8A8B8C898B8B3B3F4640454D434950444A513F454C373C4288898A878889 878889878889868788868788868788848687858687848687848586848586848586838485838485 8385858283848284848283838182838283838081828081828182827F8082808182363A403B4046 3F444B3F444B3F444B3F444B3E434B3F444B3E434A3E434A3E434A3D424A3D42493D42493D424A 3D42493D42493D42493D42491C242B1C242B1C242C0E10130502020606060303030C0C0DAEADAB FDFAF7F3F0EDF3F0ECF7F4F1BDBAB89E9C97A4A09C918D8A8B8B837C7E797779746D716B252628 100F131013141012140D0D10171618383E3C81898B717175000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 0000000000000D0D0D9392957376767678783D3F3F1D1E1E28292A2224255F5F608380808C8A89 918D8C95918F9895939A96959A9595CECAC7F0EDE8ECE8E5EDEAE6EFEBE6F9F3EF8A8783020202 060606050606050303090A0A1B22291D252C1C242B3E43493D42493D42493D42493D424A3D4249 3D42493E434A3E434A3E434A3E434A3E434A3E434A3E434A3E434A3F444B3F444B3C414834393F 7E7F80808182808182808182818283818283818283818283828284828384838485838485838485 848586848586848485848687848586848586858788858687858788868789868788868789868889 3A3F463F444C43495043495140464D383D4388898A8A8B8C8A8B8C8A8B8C8A8C8D8B8C8D8B8C8D 8B8D8E8C8D8E8C8D8F8C8D8F8D8E908D8E908D8E908E8F918E8F908F90918F8F918F8F91909192 9090929192939192939192939193949192933E4349444A51494F57494F57454B533D4249939495 94959795969895969795969896969896969897989997979997999A97989997999A989A9B989A9B 989A9B999A9B989A9B999A9B999A9B9A9B9D9A9B9C9A9B9D9B9C9E9A9C9D9B9C9E9B9C9E444A50 484F574E545D4E545D49505841464D9C9E9F9D9FA09D9FA09D9EA09EA0A19E9FA19E9FA19FA1A2 9FA0A19FA1A29FA1A29FA1A29FA1A2A0A2A3A0A2A3A0A1A2A0A2A3A1A2A3A1A2A3A1A2A4A1A2A3 A1A2A4A1A2A4A0A2A3A2A3A5A1A3A4474C544B525A5057605057604C525B424850A2A3A4A2A3A5 A3A4A6A3A3A5A3A4A6A3A3A5A3A3A5A3A4A6A3A3A5A3A4A6A3A4A6A3A4A6A3A4A6A3A4A6A3A4A6 A3A3A5A3A4A6A3A3A5A3A3A5A3A4A6A3A3A5A3A4A6A2A3A5A2A3A5A2A3A5A1A3A4474C544B525B 5057605057604C525B424850A1A2A3A2A3A5A1A2A4A1A2A3A1A2A4A1A2A3A1A2A3A1A2A4A1A2A3 A0A2A3A0A2A3A0A2A39FA1A29FA1A29FA1A29FA0A19FA1A29FA0A19E9FA19EA0A19E9FA19D9FA0 9D9FA09D9EA09D9FA09C9D9F444A51494F574E545D4D545C494F583F454D9A9B9C9B9C9E9B9C9E 9A9B9C9A9B9D9A9B9C999A9B999B9C999A9B989A9B989A9B989A9B97999A97999A97999A97989A 9798999797999696989697989696989596989596989395969495979294953E444B444A52494F57 494F57454B523C41479193939192939192939191939091929090928F8F918F90918E8F908F9091 8E8F918E8F918D8E908D8E908C8D8F8C8D8E8B8D8E8B8C8D8B8C8D8A8C8D8A8B8C8A8C8D8A8B8C 898A8C898A8B88898B3A3F453F454B4349514348503F454C373C43868788868789868789858687 858788848586848586848687848485848586848586838485838485838485828384828284828384 8182838182838081828081828081828081827F80817F80827F8081353A403B40473F444B3E434B 3E434A3E434A3E434A3E434A3E434A3E434A3E434A3D42493D424A3D424A3E43493D42493E4349 3E43493D42491C242B1C242B1C242C0E10130502020606060303030C0C0CAEADABFCF9F5F2EFEC F4F1ECF6F3EEBDBBB89A9894A29F98918F898A89847B7D777678726D6F6A2325260D0D10131315 1212140D0C10161617373D3B7F87876D6E70000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 0D0D10909294727676787A7B3F40401E201F28292A2324255E5D5E8380818E8B8A928E8C959190 9995949995959A9595CFCAC6F0EDE9ECE9E5EDEAE6EEEBE6F9F5EF8D8A86020202060606060606 050303090A0A1B22291D252C1C242B3D42483D41483D41493D42493D42493D42493D42493D424A 3E434A3E434A3E434A3E434A3E434B3E434A3E434A3E434A3F444B3B404734383F7E7F807F8081 7F8081808182808182808182808283818283818284828284828284818284838385828385828385 8384858384858384858485868486878586878587888687898687888687898687883A3E453E444B 43495043485040454C383D4387888A88898B898A8C898A8C8A8B8C8A8B8C8A8B8C8B8C8D8B8C8D 8B8C8D8C8D8E8C8D8E8D8E8F8C8E8F8D8F908D8F908D8F908E8F918E8F918F90918F9092909192 9192939091939192939192933E4349434951494E56494F56454A523C4148919394939596939596 94969794969794969794969796969895969897979997979996979997989A97989A97989A98999A 98999A98999A989A9B999B9C999B9C9A9B9D9A9B9D999B9C9B9C9E9A9C9D43494F484E564D545C 4D535C494F5740454D9B9C9E9C9D9F9C9D9F9D9EA09D9EA09D9EA09D9EA09E9FA19E9FA19E9FA1 9E9FA19EA0A19FA0A19EA0A19EA0A19EA0A19FA1A29FA1A29FA1A2A0A2A39FA1A2A1A2A4A1A2A4 A0A2A3A1A2A4A0A2A3464C534B515950565F50565F4C525B424750A1A3A4A1A3A4A1A3A4A1A3A4 A1A3A4A1A3A4A1A3A4A2A3A4A1A3A4A2A3A4A2A3A4A1A3A4A2A3A4A1A3A4A1A3A4A2A3A5A1A3A4 A1A3A4A1A3A4A2A3A5A1A3A4A2A3A5A2A3A5A1A3A4A2A3A5A1A3A4454B534A515A50565F4F565F 4B525A42484F9FA1A2A0A2A39FA1A2A0A2A39FA1A29FA1A29FA1A2A0A1A29EA0A1A0A1A29FA0A1 9EA0A19FA0A19E9FA19E9FA19E9FA19E9FA19E9FA19D9EA09D9FA09D9EA09D9FA09D9E9F9C9D9F 9D9E9F9B9C9E444A50484F564D535C4D545C494E573F444C999B9C999B9C999B9C999B9C989A9B 989A9B989A9B98999A98999A98999A98999A97989A97989A97989A969799969799959698959698 9596989596989496979495979495979395969495979294953E434A434951494F56474D56444A51 3C41479091939091938F90928F90928F90928E8F918E8F918F8F918D8F908E8F908D8E8F8C8E8F 8C8D8E8C8D8E8C8D8E8C8D8E8B8C8D8B8C8D8A8B8C8A8C8D8A8B8C8A8B8C8A8B8C88898B898A8B 88898B3A3E453F454B4348504348503F444C373B42868788868788858687858687848586848586 848586848485838485848485848485828385838385818284818284818284808283808283808283 8081828081828081828081828081827F80827E7F803539403A3F463F444B3E434A3E434A3E434A 3E434A3E434A3E434A3E434A3D42493D42493D42493D42493D42493D42493D42483D42483D4148 1C242B1C242B1C242C0E10130502020606060303030C0C0DADABA9FCF8F4F3F0ECF3F1EBF5F2ED C0BDB99B9992A2A095918F8A8A88847C7D7677787371746F2124250D0D101312151010150C0D10 1617173A413E878C8E6D6E71000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF0000000000000000000000000000000000000000000000000000000000000D0D10919397 74767977797A3E3F3E1C1D1D2528272122235C5B5C8380818F8B8A928E8E9591919A96959A9695 989592CEC8C6F0EBE9ECE8E4EEEAE5EEEBE6F7F3EE8A8784020202060606060606050303090A0A 1B22291D252C1C242B3C41483D42493D42493C41493D42493D42493D42493D42493D42493D4249 3D42493D42493D42493D42493E434A3E434A3E434A3B404734383E797B7B7F80817F80817F8081 808182808182808182808283808283808283818284818284818284828385828385838485838485 8384858484868384868484868485878485878586878586878183843A3E453E444B434850434850 40454C383D4383858588898B898A8C898A8C898A8C898A8C8A8B8C8A8B8C8B8C8D8B8C8D8C8D8E 8C8D8E8C8D8E8C8E8F8C8E8F8C8D8E8D8F908D8E8F8D8E8F8E8F908E8F908E90918E90918F9092 8F91928B8D8F3D4249434950494F56484E56454B523C42488D8F8F929495929495939596939596 94969794969794969795969895969895969896979996979996979997989A97979998999A98989A 98989A97989A98999B98999B98999B999B9C999A9B94979843484F474E564D535C4C525C494F57 40454D9597989B9C9E9C9D9F9C9D9F9C9D9F9C9D9F9D9EA09D9EA09D9EA09D9EA09E9FA19E9FA1 9E9FA19E9FA19EA0A19E9FA19EA0A19E9FA19E9FA19E9FA19E9FA19FA0A29FA0A29FA1A29FA0A2 9A9C9E454B514A50584F565F4F565E4B525A42484F9B9D9EA0A2A3A0A2A3A1A3A4A0A2A3A0A2A3 A0A2A3A0A2A3A0A2A3A0A2A3A1A3A4A0A2A3A0A2A3A1A3A4A0A2A3A0A1A2A0A2A3A0A1A2A0A1A2 9FA1A2A0A1A29FA1A29FA1A2A0A2A39FA1A29B9D9F454B524A515950565F4F565F4B525A42474F 999B9C9FA1A29FA1A29FA1A29EA0A19EA0A19EA0A19EA0A19EA0A19EA0A19EA0A19E9FA19E9FA1 9E9FA19E9FA19E9EA09E9FA19D9D9F9D9D9F9C9D9F9C9D9E9B9D9E9B9D9E9C9D9F9A9C9D96989A 43494F484E564D535C4C525B494F573F454C939696999B9C999B9C989A9B989A9B989A9B98999A 98999A97989A97989A97989A969799969799969799959698959697959698949596949596939596 9495969394959394959294959293948E90913D434A434951484E56474D56444A513B40478B8D8E 8F90928F90928F90928E8F918E8F918E8F918D8F908D8F908C8E8F8C8E8F8C8E8F8C8D8E8C8D8E 8B8C8D8B8B8D8B8C8D8A8A8C8A8A8C888A8B8A8A8C888A8B88898A88898B88898A838586393E44 3E444B43485042484F3F444B373C42808283858687858687858687848586848586848586838485 8384858384858283858283858182848182848182848182838082838081828081827F8081808081 7F80817E7F807F80817E7F807A7C7D3539403A3F463E434A3E434A3E434A3E434A3E434A3E434A 3E434A3D42493D42493D42493D42493C41483C41483C41483C41483C41483D42481C242B1C242B 1C242C0E10130502020606060303030C0C0DAEACA9FCF9F5F2EFECF4F1ECF6F3EEBEBBB89B9893 A39D96908C898C89847B7C767A7976797A752527280F0D121414161112160D0C1018191939413E 82888A6A6C70000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 00000000000000000000000000000000000000000000000000000010101090919576797A7C7D7E 3D3E3F191C1C2526272121235D5B5D8481828E8B8A928E8E9691919A96969A9696989593CEC9C6 F0EBE9EDE8E4EEEAE4EEEBE5F8F4F08A8783020202060606060606050303090A0A1B22291D252C 1C242B3C41483C41483C41493C41493C41493C41493D42493D42493D42493D42493D42493D424A 3D42493D424A3E434A3E434A3E434B3B404634383E686A6E7D7E807E7F807E7F807F80817F8081 7F80817F8081808182808182808182818282818283818282828383828384828484828485828485 838486838486838486848587858587848587707275393E453E434A42484F4248503F444B383C42 70737688898A88898A88898A888A8B888A8B888A8B898A8C898A8C898A8C8A8B8D8B8C8D8B8C8D 8B8C8D8C8D8E8C8D8E8C8D8E8D8E8F8D8E8F8D8E8F8E8F908E8F908E8F908F90918E9091797B7F 3D4249424850474D55474D564349513C4147787B7F929394929394929394939495939495939495 93959693959694969794969794969695979895979795979796979996979896979997989A97989A 97989A97989A97989A98999B999A9B81838742474F474D564C525A4C525C484E563F444B808387 9A9C9D9A9C9D9B9D9E9B9D9E9B9D9E9B9D9E9B9D9E9C9D9F9C9D9F9C9D9F9C9D9E9C9D9F9D9E9F 9D9E9F9D9EA09D9E9F9D9EA09D9EA09E9FA19E9FA19E9FA19E9FA19E9FA19E9FA186888D444A52 4A50594F555E4F555F4A515942474E84878C9FA0A29FA0A29FA0A29FA1A29FA1A29FA0A29FA0A2 9FA1A29FA1A29FA0A29FA1A29FA1A29FA1A29FA1A29FA0A29FA0A19FA0A29FA0A29FA1A29FA0A2 9FA0A29FA0A29FA0A29FA0A285878C444A524A50594F555E4F555F4A515942474E83868A9E9FA1 9E9FA19E9FA19E9FA19E9FA19E9FA19D9EA09D9EA09D9EA09D9EA09D9E9F9C9D9F9C9D9E9C9D9E 9C9D9F9B9D9D9B9D9E9B9D9E9B9D9E9B9D9E9A9C9D9A9C9D9B9C9D999B9C82848842484F474E56 4C525A4C525B484E563F444B7E818598999B98999B97989A97989A97989A97989A969799969799 959798959798959797949697949696949696949697939596939596939495939495939495929394 9293949292949192947B7D813D434A434951474D55474D564349503B404676787C8E90918E9091 8E8F908E8F908E8F908D8E8F8D8E8F8C8D8E8C8D8E8C8D8E8C8D8E8B8C8D8A8B8C8A8B8C8A8B8D 8A8B8C898A8C898A8C888A8B888A8B88898A88898A88898A878889717377393E453E444B42484F 42474F3E444A373B416F7175848587848587838486838486838486828485828485828485828384 8283848283838182838182828182828081828081827F80817F80817F80817E7F807E7F807E7F80 7F7F807D7E80696B6E3539403A3F463E434A3E434A3D42493D42493D424A3D42493D42493D4249 3D42493C41493D41493D41493C41483D41493C41483C41483C41481C242B1C242B1C242C0E1013 0502020606060303030C0C0DADACAAFCF9F6F3F0EBF4F1EBF5F2EDBDBBB99B9995A19C958F8C87 8C8A847E7D787B7B777C7C7729282A0F0D101313151212140D0D1017181937403B7F85876C6C6D 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 0000000000000000000000000000000000000000000D0D10909196767878787A7B3C3D3D1B1C1C 2527272022225F5E5F8581828F8B8B928E8E9691919A96969A9696989593CEC8C6F0ECE9EDE8E5 EEEAE5EEEBE6F9F6F18F8C89020202060606060606050303090A0A1B22291D252C1C242B3C4148 3B40483B40483C41483C41483C41483C41483D42493D42493D42493D42493D42493D42493D4249 3D42493E434A3D424A3D4248393E44393C427677787E7F807E7F807E7F807E80817E80817E8081 7E80817F80827F80827F8082808182808182818283818283818283828384828384828284838485 8383848383848385867C7D7F3D41473C424941464D42474F42484F41474D3D434A3D40467F8082 87888987888988898A88898A88898A898A8B898A8B898A8B898B8C898B8C898B8C8A8C8D8A8C8D 8A8C8D8B8C8E8B8C8E8B8C8E8C8D8E8C8D8F8D8E8F8D8E8F8D8E8F86878842464C40464E454B53 474D55464C55464C5342474F42464C87898B909293919294919294919294929395929395939496 939496939496949596949596949596959697959697959697959697959798959697969899969798 96979897989A8F8F92464A50454B534A50584B525A4C525A4A5158464C544649508F9193999A9C 9A9B9C9A9B9C9A9B9C9A9B9C9A9C9D9A9C9D9A9C9D9A9C9D9B9D9E9B9D9E9B9D9E9B9D9E9B9D9E 9B9D9E9C9E9F9C9E9F9C9D9E9C9E9F9C9D9E9C9D9E9C9E9F949597494D54474E564C535B4E555D 4E545D4D535B484E56484C539496989E9FA19E9FA19E9FA19E9FA19E9FA19E9FA19E9FA19E9FA1 9E9FA19E9FA19E9FA19E9FA19E9FA19E9FA19E9FA19E9FA19E9FA19E9FA09E9FA19D9E9F9E9FA0 9E9FA1949597484C53484E564D535B4E555D4E555D4D535B484E56474B529394969C9E9F9C9E9F 9C9E9F9C9E9F9C9E9F9C9E9F9B9D9E9B9D9E9B9D9E9B9D9E9A9C9D9B9D9E9A9C9D9A9C9D9A9C9D 9A9B9C9A9B9C9A9A9C9A9B9C9A9A9C99999B999A9C909193474B51454B544A50584C525A4B515A 4A5058454B5345494F8E8F91969899969899959798959798959798959798959697959697959697 949596949596939496939496939496929395929395929395919293919294919293909192909293 88898B43464C42474F464C53474D55474D55454B5241474E41444B8586888D8E8F8D8E8F8C8D8F 8C8D8F8B8C8E8B8C8E8B8C8E8A8C8D8A8C8D8A8C8D8A8C8D898B8C898B8C898A8B898A8B898A8B 88898A88888A8788898788898788898687897F7F813D41463C424941464D42474F41474F40464C 3C42493C40457C7D7F838485838485838485828384828384828384818283818283818283808182 8081827F80827F80827F80827F80827E80817E80817E7F807E7F807E7E7F7E7E7F7E7F80767678 393C42393E443D42483E434A3D42493D42493D42493D42493D42493C41493C41493D42493C4148 3C41483C41483C41483C41483C41483C41483B40481C242B1C242B1C242C0E1013050202060606 0303030C0C0CADACA9FCF9F6F2EEEBF4F0EAF5F3EDBFBEBC9B9995A19D958E8C868A8883817E7B 7D7D797577732828290F0D121413151012140D0C101818193B433F838A8E696C6D000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 0000000000000000000000000000000D0D10909095777878797A7B3C3D3E1A1C1C2426271F2121 5E5D5E868283908C8D918D8D9691919B97969B9797999594CCC9C5EFECE7ECE8E5EDE9E5EFEBE7 F8F5F08C8986020202060606060606050303090A0A1B22291D252C1C242B3B40483C41483C4148 3C41483C41483C41483C41483C41483C41483C41493C41493D42493D42493D42493D42493D4249 3E434A3C41483A3F4532363C2E30345759597677787E7F807D7E7F7D7E7F7E7F807E7F807F8081 7F80817F80817F81827F81828082838182838082838182838283848182848283848182847B7C7D 5B5D5E32343734383F3E434940464D41474E42474F41464D3E434A363A403134385D5F5F7F8081 87888986888987888A87888A87888A88898A88898A898A8B898A8B898A8B8A8B8C8A8C8D8A8B8C 8A8C8D8B8C8E8B8C8D8C8D8F8B8D8E84858662646535383B383D4443484F454B53464C54474D55 454B5343484F3A3E4535373C64666688898A919294909293909293909293919394919394929395 9293959394969293959394969495969495979596979596979596979597989596978D8F90686A6B 383B3E3C4048474C544A50594B51594B525A494F58474C543D4249383B3F6B6D6D909192999A9C 98999B999A9C999A9C999A9C9A9B9D9A9B9D9A9B9D9A9B9D9A9B9D9A9B9D9B9D9E9A9B9D9B9D9E 9B9D9E9B9C9D9B9D9E9B9C9D9293956D6F703B3E413E434B4A4F574C535C4D545C4E545D4C525B 494F573F444B3A3C426D6F709495979D9EA09C9E9F9C9E9F9C9E9F9C9E9F9C9E9F9C9E9F9C9E9F 9C9E9F9C9E9F9C9E9F9D9EA09C9E9F9D9EA09D9EA09C9E9F9D9EA09C9E9F9495976E70713B3E42 3E434B4A50584C535C4D545C4E545D4C525B494F563F444B393C416B6E6E9394969B9D9E9B9C9D 9B9C9D9B9C9D9A9B9D9B9C9D9A9B9D9A9B9D9A9B9D9A9B9D9A9B9D9A9C9D999A9C9A9B9C9A9B9C 98999B999A9C98999B8F90926A6C6D393C403C4149484D554A51594B51594B525A494F57464C53 3C4148373A3E67696A8C8E8F959798949597949597949597939496939496939496939496929395 92939592939592939591939492939591929490929391929490919288898A65676736393C393E45 434850464C54464C54474C54454B5242474E393D4434363B6163648485868C8D8F8B8C8D8B8C8D 8B8C8D8B8C8D8A8B8C8A8B8C898A8B898A8B898A8B88898A898A8B87888A88898A88898A868889 8788898688897E7F805D5F5F3234373539403F444A41464E41474E42474F40454C3D424934393F 2F31365A5C5D7A7B7C8283848182848082838082838082837F81827F81827F81827F81827F8081 7F80817E80817E7F807E80817E80817D7E7F7E7F807D7E7F7677785658592D303331353B3A3F45 3D42493D42493D42493D42493D42493D42493C41483D42493D42493D42493C41483C41483C4148 3B40483C41483B40483B40483C40471C242B1C242B1C242C0E10130502020606060303030D0D0D AFACAAFBF8F4F1EEE9F2EEE9F4F0EBC4C1BE9C9894A09E978E8C878B8884817F7D7E7D79787975 2627280F0F101314171212150D0C10171919383E3C7B8488686A6C000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 0000000000000000000D0D0D8E8E9378797A787A7A3A3C3C1C1D1C2627281E20205D5C5C858383 908C8D918D8D9591919B97969B97979B9794CECAC7EFEBE7ECE9E5EDE9E5EFEBE6F9F5F18B8885 020202060606060606050303090A0A1B22291D252C1C242B3B40483B40483B40483B40483C4148 3B40483C41483C41483C41493C41483C41483C41483D42493D42493D42493D42493D42493D4249 3B4047373C422D31371F2226141619141619141619141619141619141619141619151619151619 15161915171915171915171915171A15171A15171A15171A15171A15171A15171A212427303339 3A3F453F444C40464E41474E41474F41464E40454C3A404731343A22252A16181B16181B16181B 16181B16181B16181B16181B16181B16181B16181B16181B16181B16181C16181C16181C17181C 17181C17181C17191C17191C23262A33373D3E444A444951454B53464C54464C54464C54444A52 3F444B34383F25282C17191D17191D17191D181A1D181A1D181A1D181A1D181A1D181A1D181A1D 181A1D181A1D181A1D181A1D181A1D181A1D181A1E181A1E181A1E181A1E25292D373B4242484F 484E574950594B51594B515A4A5059494E56424950373B4226292E191B1F191B1E191B1E191B1E 191B1E191B1F191B1E191B1F191B1F191B1F191B1F191B1F191B1F191B1F191B1F191B1F191B1F 191B1F191B1F191B1F272A2F393D43444B524B50594C525B4D545D4D535C4C535C4B515A454B52 393D45282C30191C20191C1F191C1F191C1F191C1F191C1F191C1F191C1F191C1F191C1F191C1F 191C1F191C1F191C1F191C1F191C1F191C1F191C1F191C1F191C1F272B2F393D45454B524B515A 4C535C4D535C4D535C4C525B4B5059444B52393D43282B30191B1F191B1F191B1F191B1F191B1F 191B1F191B1F191B1F191B1F191B1F191B1F191B1F191B1F191B1E191B1E191B1E191B1E191B1E 191B1E191B1E26292E373B4242494F494E564A50594A50594A5059495059484E5742484F373B42 262A2E181A1E181A1E181A1E181A1D181A1D181A1D181A1D181A1D181A1D181A1D181A1D181A1D 181A1D181A1D181A1D181A1D17191D17191D17191D17191D24272B34383F3F444B444A52464C54 464C54464C54454B534449513E444B33373D24272C191B1E191A1E191A1E191A1E181A1E181A1E 181A1D181A1D181A1D181A1D181A1D181A1D181A1D181A1D181A1D181A1D181A1D181A1D181A1D 181A1D2226293134393A40463F444C41464E41474F41464E40464E3F444C393F45303339222528 17191C17191C17191C17191C17191C17191C17191C17191B17181B17181B17181B17181B16181B 16181B16181B16181B16181B16181B16181B16181A2023262D3136363B413B40473D42493D4249 3D42493D42493C41483C41493C41483C41493C41483C41483C41483C41483B40473B40483B4047 3B40483B40473B40471C242B1C242B1C242C0E10130502020606060303030D0D0DAFADAAFCF9F4 F2EFEAF3EFEAF6F1ECBFBCB99A9892A09E988F8C888A878482807C7B7C78737671292A290D0D10 1314171212160D0D1017181939413E7B878864686A000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 0000000D0D1094949775787B797C7C3C3E3D191A1A2324261D1E205D5C5D868283908C8B928E8C 9692919A96969C98979B9895CDC8C5EEE9E6EBE6E3EEEAE5EFECE6F9F6F08F8D8A020202060606 060606050303090A0A1B22291D252C1C242B3B40473B40473B40473B40473B40473C41483C4148 3B40483C41483C41483C41483C41483C41493D42493D42493D42493D42493D424A3C41493A3F46 373C4231353B2D30362E31362D31362E31362E32372E31372E32372E31372E31372E32372E3137 2F32382F32382E32382F33382E32382E32382F33382F32382F333834383E393E453D43493F444C 40464E41464E41464E41474E40464D3F444C3A404635394031353B31353A31353B31353B31353B 31353B32353B31353B31353B32353B31353B32353C32353C32363C32363C32363C33373C32363C 33373C32363C373C433D434A42474F444A52464B53464B54464C54464C54454B544248503F454C 383E4434383E35393F34383F35393F35393F35383F35393F35383F35393F35393F35393F363A40 363A40353940363A40353940353940363A40363A40363A403B404742474F464D54484E57495059 4A50594950594A5059494F57474D5642494F3C4149373B42373C42373C43373C42373C42373B42 383C42373B42373C43383B42373C43383C43383C43383C43383C43383C43383D43383C43383D43 383C433D434A444A51484E574B525A4D535C4D535C4D535C4D535C4B525B484F57444B523D434A 383C43393D43383C43393D44393D43393D44393D43393D44393C43393D44393D44393D44393D44 383C43393D44383D44383C43393D43383C43393D433E434A444A524950574B515A4C525C4D535C 4C525C4D535C4B525A494F58444A513D424A383D44383D43383C43383C43383C43373C43383C43 373C43373C43383B42373B42383B42383B42373C42373B42373C42373C42373B42373B42363B42 3B414842494F464C55494F574A50594A50594A50594A5059484F58464C5442484F3A4047363A40 363A40353940363A40363A40363940363A4036394035393F35393F35393F35393F35393F34383F 35393F34383F34383E34383E34383E34383E393E443F444B434950444A53454B54464C54454B53 464B53444A5242484F3D434A383C4333373C33373C32363C32363C32363C31353C32363B31353B 31353B32353B31353B32353B32353B32353B31343B31353B31353B30343A31353A30343A34393F 3A40463E434A40464D41474E41464E41464E41464E3F454D3D4249393E4533383E2F32382F3338 2E32382F33382F33382F32382F32382F32382E31372E32372E31372E32372E32372D31372E3237 2D31362D31362D31362D30362D313631353B363B413A3F463B41483C41493D42493C41493D4249 3C41483C41493C41483C41493C41483C41483C41483C41483B40473B40473B40473B40473A3F47 3B3F471C242B1C242B1C242C0E10130502020606060303030D0D0DAFADAAFCF9F4F3F0ECF4F1EC F6F3EDBDBCB99A9893A19F988F8D868A89837F7F7C7B7B767475712929290F0F12131318121317 0F0D101717193D45417F8889656868000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000D0D0D 929395787A7C797C7C3F4040191A1B2123251A1C1E5D5C5D8682838F8A8A918E8B9693919B9796 9C99989B9895CCC7C4EFE9E7E9E4E1EDE8E4F0EBE7F8F3EF908E8B030202060606060606050303 090A0A1B22291D252C1C242B3A3F473B40473B40473B40473B40473B40473B40473C41483C4148 3C41483C41483C41483C41483C41493C41493C41483C41493C41483D42493C41483B3F463A3E45 383D44383E44383D44393E44393E44393D44393E45393E44393E443A3E453A3E453A3E453A3E45 3A3F463A3F463A3F463A40463A3F463B40473B3F473C41483E424A3F444C40454D40464E41464E 40464E41474E41474E40454D3F444C3D424A3C41483D42493D42493D43493D43493D42493D4349 3D424A3D424A3D434A3E434A3E434A3E444B3E444B3E444B3F444B3F444B3F444B3F454C3F454C 41464D434850444A51454B53454B53454B53454B53454B53454B53454A5244495142474F40464E 41474E41464E41474E41474F41474E41474F42474E42474E42474F42474F42474F42474F424850 424850424850434950434850434950434951454A52474C55474D56494F58494F584A5058494F58 4A50594A5059484E57494E56464B54444A52444B52444A52444B52444B52454A53454B53454A53 454A53454B53454B53454B53454B53454B53454C54454C54454C54454C54454C54454C54484D55 494F584B515A4C525B4C525B4C525B4C525B4C525B4C525B4B515A494F58484D56464C55464C54 464C55464D55464D55464C54464D55464C54464C54464C55464C54464C55464C55464D55464C55 464D55464D55464C55464C54464C54474D56494F584A515A4C525B4C525B4C535B4C525B4C535B 4C535B4A515A4A4F58474D55454B54454C54454B54454C54454B53454B54454B53454B53454B53 454B53454A53454B53454B53454B53454B53454B53444B52444B52444B52444A52464C53474D56 494F57495059494F58494F58494F58494F58494F57484D56474C54454A52434850434950434850 43495042485042484F42484F42474F42474F42474F42474E42474F42474F41474F41474F41474F 41474E41464E40464E40464E42474F434951444A52454B54454B53464B53454B53454B53454B53 43495143485040454D3F444C3F444B3F444B3F444B3F444B3E434B3E444B3E434A3E434A3D434A 3D424A3D434A3D43493D43493D43493D42493D42493D42493C42483C42483E434A3F444C40464D 41464E40464E40464D40454D40454D40454D3F444B3E424A3C41483B3F473A40463A3F463A4046 3A3F463A3F453A3F463A3E453A3E453A3E45393E44393E45393E45393E45393D44393E44393E44 383D44383E44383D44393E453B3F473B41483D42493C41493D42493C41493D42493C41483C4148 3C41483B40483B40483C41483B40473B40473B40473B40473B40473A3F473A3F473B40471C242B 1C242B1C242C0E10130502020606060303030D0D0DAFAEABFDFAF6F2EFEBF3F0EAF5F1ECC1BEBC 9A98939F9E96908D888A87837F7F7A787974767872292B2B0D0D121414191212160D0D1017181A 3C44417F8789646567000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 0000000000000000000000000000000000000000000000000000000000000D0D0D94959A777878 7677773E3F3F18191A202122181B1C5C5B5B8582838E8A89928E8D9794919B97969C98989C9897 CCC8C3EFEAE6E9E5E2EDE8E4EFEBE6F7F3EF8F8D8B030202060606060606050303090A0A1B2229 1D252C1C242B3A3F463A3F473A3F473B40473B40473B40473B40473B40473B40473B40473C4148 3C41483C41483C41483C41483D42493C41493D42493D42493D42493D42493D42493D42493D424A 3D42493D424A3D434A3D434A3D434A3E434A3E434A3E434B3E434B3E434B3F444C3F444B3F444C 3F444B3F444C3F444C3F444C3F454C3F454C3F454D40454D40454D40454D40454D40464E40464D 41464E41464E41464E41464E41474E41474F42474F42474F42474F42484F42485042484F424850 424850434850434851434851434850434951434951434951444951444951444951444A52444A52 444A52444A53444A53464B53454B53464B53464C54454B53464C54464C54464C54464C55464C54 464C55464C55474D55474D55474D55474D55474D56474D55474D56474D56474D56474D56484E56 484E56484E56484E56484E57484E57484E57494F57494F58494F58494F57494F58494F58494F58 494F584950584950584950584950594A50594A50594A50594A50594A50594A50594A51594A515A 4A51594A515A4A515A4B515A4B515A4B515A4B515A4B515A4B515A4B515A4B525A4B525B4B525A 4B525B4B525B4C525B4C525B4C525B4C525B4C525B4C535B4C525B4C525B4C525B4C525B4C525B 4C525B4C525B4C525B4C525B4C525B4C525B4C525B4C525B4C525B4C525B4C525B4C525B4C525B 4C525B4C525B4C525B4B525A4C525B4B525A4B525B4B525B4B525A4B525B4B525A4B525A4B525A 4B525A4B525A4B525A4B515A4B515A4B515A4B515A4B515A4A515A4A51594A51594A515A4A5159 4A515A4A50594A50594A50594A50594A5059495058495058495058495058494F58494F58494F58 494F58494F58494F58494F58494F57484E57494F57484E57484E57484E57484E56484E57474D56 474D56474D56474D55474D55474D56474D55474D55474D55474D55464C55464C54464C54464C54 464C54464C54454B53454B54454B53454B53454B53454B53444A53444A52444A52444A52444A52 444A52444951444952444951434951434951434850434851434850424850424850424850424850 42485042484F42474F42474F42474F41474E41474E41474E41464E41464E41464E40464E40464E 40464D40454D40464D40454D3F454C40454D3F454C3F444C3F444C3F444C3F444C3F444C3F444B 3E434B3E434B3E434B3E434B3E434A3E434B3D434A3D434A3D434A3D434A3D42493D42493D4249 3D42493D42493D42493C41483C41493C41493C41483C41483C41483C41483C41483B40473B4047 3B40473B40483B40473B40473B40473B40473A3F473A3F463A3F463A3F471C242B1C242B1C242C 0E10130502020606060303030D0D0DAFADAAFCF8F5F2EEE9F1EEE8F3F0EAC1BEBC9B9995A09F96 908D878A87827D7C767879747276712628290D0F131313171313150D0D1015181938403D7E868A 686C6E000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 0000000000000000000000000000000000000000000000000D0D0D95979B767A78797A7C3D3E3E 1718191F2021181B1C5B5C5C8481828E8B8893908D9895939C98969C99979D9997CCC7C3EDE9E4 EAE7E3ECE9E6EFEBE7F6F3ED8F8B8A020202060606060606050303090A0A1B22291D252C1C242B 3A3F463A3F473A3F473B40473B40473B40473B40473B40473B40473B40473B40473B40483C4148 3B40483B40483C41483C41483C41483C41483D42493D42493D42493D42493D42493D42493D4249 3D42493D434A3D434A3D434A3D434A3E434A3E434A3E434B3E434B3E434B3F444B3F444B3F444B 3F444C3F444C3F444C3F454D3F454C3F454D3F454C40454D3F454D40454D40454D40454D41464E 40464E41464E41474F41464E41474F41464F41464F42474F41474F42484F42484F424850424850 424850434851434850434851434951434951434951444951444951444951434952444A52434952 444A52444A52444A52454B53454B53454B53454B53454B53464C54464C54464C54464C54464C54 464C54464C54474D55474D55474D55474D55474D55474D55474D56474D56474D56484E56484E57 484E56484E57484E57484E57484E57484E57484E57484E57494F57484F58484F58494F58484F58 494F58494F58484F58495059494F58494F58495058494F594A50594A50594A50594A50594A515A 4A515A4A51594A515A4A51594A51594B515A4B515A4B515A4B515A4A505A4B515A4A505A4A505A 4B525A4A505A4B525A4B525A4B525A4B525A4B525A4B525A4B525A4B525A4B525A4B525A4B525A 4B525A4B525A4B525A4B525A4B525A4B525A4B525A4B525A4B525A4B525A4B525A4B525B4B525A 4B525B4B525B4B525A4B525B4B515A4B515A4A515A4B515A4A505A4A505A4B515A4A505A4B515A 4B515A4A50594A515A4A505A4A50594A51594A50594A50594A50594A50594A50594A50594A5059 4A5059495059495058495058495058495058494F58494F58484F58494F58484F58484E57494F57 484E57484E57484E57484E57484E57484E56484E56484E56474D56474D56474D56474D56474D55 474D55474D55474D55474D55474D55464C54464C54464C54464C54464C54464C54454B53454B54 454B54454B53454B53454B53444A52444A52444A52434952434952444A52434951444952444952 43485143495143485143485143485042485042485042485042485042484F42485042485042474F 42474F42474F41474E41474E41464E41464E41464E40454D40464D40454D3F454D40454D3F454D 3F454C3F454C3F454C3F444C3F444C3F444C3F444C3F444B3F444B3F444B3E434B3E434B3E434B 3E434B3E434A3E434A3D434A3D434A3D434A3D434A3D42493D42493D424A3D42493D42493D4249 3D42493C41493C41483C41483B40483C41483B40483B40483C41483B40473B40483B40483A3F47 3B40473A3F473A3F473A3F463A3F463A3F463A3F463A3F471C242B1C242B1C242C0E1013050202 0606060303030D0D0DAFADA9FBF8F2F2EEEAF3EFEAF5F1EAC1BFBB9A9894A19E968F8C848A8981 7B7C787577737275702728290D0F131212141212150F0D1018191A373F3C798385646769000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 0000000000000000000000000000000000000D0D0D8E9093727674797B7C3D3E3E1618181F2223 191C1D5C5B5C8481828E8B8993908D9895949D9A989C98979D9997CEC9C5EEEAE5EAE7E4ECE9E6 F0ECE7F6F1ED8D8A87020202060606060606050303090A0A1B22291D252C1C242B3A3F463A3F46 3A3F463A3F463A3F473B40473B40473A3F463B40473A3F463B40463B40473B40463C41483C4148 3B40473C41483C41473C41473C41493C41473C41493C41493C42493C42493C42493D424A3D434A 3D424A3D434A3D434A3D42493E434A3E434A3E434A3E434B3E434A3E434B3E434B3E444C3E444C 3E444C3E444C3F444B3F444C3F444B3F454C3F454D3F454C3F454D40454D40454D40454D40464E 40464E41464E41464E41464E41464E42474F41464F42474F42484F41474F424850424750424750 434850424850434850434951434850434951434850434950444951434951444A52444A52444A51 444A52444A51444A51444A53444A52454B53454B53454B53454B53454B54454B54464C54454B54 464C54464C54464C54474D55464C54464C54464C55464C54464C55474D56474D56474D56474D56 474D56474D55474D56484E56484E56484E57484E56484E57484E57484E57484E57484F58484F58 484F58484F58484F58484F58495058494F58495058495058494F584A5059494F59494F594A5059 494F594A51594A51594A50584A51594A50584A50584B515A4A50584B515A4A51594A50594B515A 4A50594A50594A505A4A50594A505A4A505A4A515A4A505A4A505A4A515A4B515A4A515A4B525A 4B525A4A50594B525A4A50594A50594A505A4A50594A505A4A505A4A505A4A505A4A505A4A505A 4A50594A505A4A50594A50594A505A4A50594A50594A50594A50594A50594A50594A50594A5059 494F594A5059494F594A5059494F594A50594A5059494F594A5059494F58494F58495058494F58 494F58495058484F57494F58484E56484E56494F57484E56484E57484E57484E56484E57484E56 474D55474D56474D55474D56474D56474D56474D56474D56464C55474D55464C55474D55474D55 464C54464C54454B53454B53454B54454B53454B54454B54454B53454B53444A53444A53444A52 444A52444A51444A51444A52434951434952434952434951434951434951434851434851434851 42485042485042485042475042485042485041474F42484F41464F41464F42474F41464F41474E 41474E41464D41464E40464D40454C40464D40454C40464D40454D3F454C3F454C3F444B3F444B 3F444C3E444B3E444C3E444C3E444C3E434B3E434B3E434B3E434B3D424A3E434B3E434A3D4249 3D434A3D42493D42493D424A3C42483C42493C42493C42493C41493C41493C41493C41473C4148 3C41473B40473B40483B40473B40483B40483B40473B40473A3F473A3F473A3F473A3F473A3F47 3A3F463A3F463A3F463A3F463A3F46393E461C242B1C242B1C242C0E1013050202060606030303 0D0D0DB0AEABFCF9F3F3F0ECF4F0EBF6F3EDC3C1BD9A9793A09B948E8C868989827D7E79767873 6E716C2626280D0D12131215131216100F1018191939423F7E8688606464000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 0000000000000000000000000D0D0D9090957476767779793C3D3D1717181F2223171A1B5B5959 8582828E8C8A93908E9895949D9A999D99999E9B98CFCAC5ECE7E4EBE8E5ECE9E7F0EBE8F5F0EC 8C8986020202060606060606050303090A0A1B22291D252C1C242B3A3F463A3F453A3F453A3F45 3A3F453A3F453A3F463A3F463A3F463A3F463B40463B40473B40463B40473B40483B40483B4048 3B40483C41483C41483C41483C41493C41493C41493C42493C42493C42493D42493D424A3D4249 3D42493D42493D42493D42493E434A3E434B3E434A3E434B3E434B3E434B3E434B3E444C3E444C 3E444B3F444C3F444B3F444B3F454D3F454C3F454D3F454D40454C40454D40454C40464D40464E 41464D41464E41464E41464E41464F41464F41464F41474E41474F41474E42474F42474F42484F 42484F42484F42484F434850434850434850434951434950434952434951434952434952444A52 444A52444A52444A53444A53454B53444A53454B53454B53454B53454B53454B54454B53454B53 454B53454B53464C54464C54464C55464C54464C55464C55464C55474D56474D56474D56474D55 474D56474D55474D55474D56474D55484E57484E57484E56484E57484E56484E56484E57484F57 484F58484F58484F58484F58484F58494F58494F57494F58494F57494F57494F57494F58494F58 494F58494F58494F58494F58494F584A5059494F584A50594A50594A50594A50594A50594A5059 4A50594A50594A50594A50594A505A4A505A4A505A4A50594A50594A505A4A50594A50594A5059 4A50594A50594A50594A50594A50594A50594A505A4A505A4A50594A50594A50594A50584A5059 4A50584A50584A50594A50584A50594A50594A5058494F59494F58494F58494F59494F58494F59 494F59494F58494F58494F58494F58494F57494F58494F57484F57484F57484F57484F57484E56 484E56484E56484E56484E56484E57484E56484E57484E57474D56474D56474D56474D56474D56 474D56474D56474D56464C55464C55464C55464C55464C54464C55454B53454B53454B53454B53 454B53454B53454B54454B53454B53454B53454B53444A53444A53444A53444A51444A52444A51 43495143495243495143495243495143495043485143485043485043485142484F424850424750 42475042475041474F41474F41474E41464F41464E41464D41464D41464D41464D41464D40464D 40464D40454C40454C40454D3F454C3F454D3F454D3F454D3F444C3F444C3F444C3E444C3E444C 3E434B3E434B3E434B3E434B3E434B3E434B3E434A3E434B3D42493D42493D42493D42493D4249 3D42493C42493C42483C42493C42493C41493C41493C41483C41483C41473C41483B40473B4047 3B40483B40473B40473B40473B40463B40473B40463A3F463A3F473A3F463A3F473A3F473A3F46 3A3F463A3F463A3F46393E451C242B1C242B1C242C0E10130502020606060303030D0D0DB1AFAD FCFAF5F3F0EBF3F0EBF5F3EDC5C2C09A97929E9C94908E888A88847D7E787679726D706C252627 0D0D101414161313160D0F1017191939403D7C8385606164000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 0000000000000D0D0D8B8E9176787878797B3B3D3E171A1920232318191B5B59588582828F8C8A 93908F9895949D9A999D9999A09C9AD0CBC5ECE6E2EAE7E5EBE8E6EFECE7F5F2EC8E8B88030202 060606060606050303090A0A1B22291D252C1C242B393E45393E45393E453A3F453A3F453A3F45 3A3F463A3F473A3F463B40473B40473A3F463B40473A3F463B40473B40473B40473B40473B4047 3C41473B40473C41473C41483B41483C41483C41483C41483C42483C41483C42483D42493D424A 3D42493D424A3D424A3E434A3E434B3E434A3E434A3D434A3E434A3D434A3E434B3E444B3E434B 3F444B3F444B3E444B3F444B3F444C3F444C3F454D3F454C40454D40464E3F454D40464E40454D 40454D40454D40454D40464E40464E41464E41464E41474E41474E42474F42474F42474F42484F 42485042484F434851434851424850434951424850424850434951434951434951434951444A51 434951444A52444A52444952444A52444952444A52454B53444A53454B53454B53454B54454B53 454B54464C55464C54464C55464C54464C54464C54464C54464C55464C55474D55464C55474D55 474D55464D55474D55464D55474D56484E57474D56484E57484E57474D56484E57474D56474D56 484E57484E57484E57484E57484F57484E57494F57484F57494F57494F57494F57494F57494F58 494F57494F59494F59494F58494F59494F58494F58494F58494F58494F58494F584A5058494F58 4A50584A5058494F584A5058494F58494F584A5058494F584A50584A50584A50594A50584A5059 4A50594A50584A50594A50584A5058494F58494F58494F58494F584A5058494F584A5058494F58 494F58494F58494F58494F58494F59484E57494F59494F58494F58494F58484E57484E57484E57 484E57484E57484E57484F57484E57484F57484F57484E56484E56484E56484E56484E57484E56 484E57484E57474D56484E57464D55464D55464D55464D55464C55464C55474D55464C55464C54 464C54464C54464C54454B54454B54464C54454B53454B53454B53454B54454B53454B54454B54 454B52454B53454B52444A52444952444A52434951434951444A51434951434951434951434951 43495042485042485043485142485042485042485042474F42485041474F41474F41474F41464E 41464E41464E41464E40464E41464D41464D41464D41464D40464D40464D40464E40464D40454D 40454D3F454C3F454D3F444C3F444C3E444B3E444B3E444B3E434B3E444B3E434B3E434A3E434A 3D424A3E434A3D424A3D424A3D42493D42493D42493D42493D424A3D42493D424A3C42493C4248 3C42493C41483C41483B41483C41483B40473B40473C41473B40473B40473B40473B40473B4046 3A3F463A3F463B40473A3F463A3F473A3F473A3F463A3F47393E45393E45393E45393E45393E45 393E45393E451C242B1C242B1C242C0E10130502020606060303030D0D0DB0AFABFCF9F4F2EEE9 F2EFE9F2EFE9C3C1BE9996909D9A928F8C888A87847D7D78767974696C682323240F0F12151316 1314160F1012161819353C3881888A636467000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 0D0D0D8E909477797A797C7B3A3C3C1717182021221618195A5959868282908D8A94918F989494 9D9A999D9999A09C9AD0CBC6ECE7E1E9E5E2EBE7E4F0ECE6F8F3EE908C8A030202060606060606 050303090A0A1B22291D252C1C242B393E45393E453A3F45393E453A3F45393E45393E453A3F46 3A3F453A3F463A3F463A3F463A3F463A3F463A3F463B40473B40473B40473B40473B40473B4047 3C41473C41473C41483C41483C41483C42483C41483C42483C41483C41483C41493C41493D4249 3D42493D42493D42493E434A3E434A3D424A3E434A3D434A3D434A3E444B3E434B3E444B3F444B 3E444B3F444B3E444B3F444C3F444C3F444C3F454C3F454C3F454D3F454D3F454D3F454D40454D 40454D40454D40454D41464E40464E41464E41474E41464E42474F41474E41474E42474F42474F 42474F42474F424850424850424850424850424850434951434951434951434951434951444A51 444A51444A52444A52444A52444A52444A52454B52444A52444A53444A53444A53454B53454B53 454B53454B54464C54464C54454B54464C54464C54464C54464C54464C55474D55474D55464C55 474D55464D55464D55464D55464D55474D56474D56474D56474D56474D56474D56474D56474D56 474D56484E57484E56484E57484F57484F57484E56484F57484E57484E57484E57484E57484E57 484E57484E57484E57484E57494F58494F58494F58494F58494F58494F58494F58494F58494F58 494F58494F58494F58494F58494F58494F58494F58494F58494F58494F58494F58494F58494F58 494F58494F58494F58494F58494F58494F58494F58494F58494F58494F58494F58494F58494F57 484E57484E57484E57484E57484E57484E57484E57484E57484E57484E57484E57484E57484E57 474D56484F57484E57484E56484E56474D56484E56474D55474D55474D56474D55474D56474D56 464D55464D55464D55464C55464C55464C55464C55464C54464C54464C54464C54464C54464C54 464C54464C54464C54454B53454B53454B53444A53444A53444A53444A52444A52454B52444A52 444A52444A52434951444A51434951434951434951434951434951434951424850434950424850 42485042485042485042474F42474F42474F41474F41474F41464E41464E41464E40464E40464E 41464E40464E41464D41464D3F454C40464D3F454C3F454C3F454C3F454C3F454C3F454C3F444C 3F444C3F444C3E444B3E444B3E444B3E434B3E434B3E434A3D434A3E434A3E434A3E434A3E434A 3E434A3E434A3D42493D42493C41493C41493C41493C41493C41483C41483C42483B41483C4148 3C41483B41483C41473B40473B40473B40473B40473B40473B40473B40473B40463A3F463A3F46 3A3F463A3F463A3F463A3F463A3F46393E45393E45393E45393E45393E45393E45393E45393E45 1C242B1C242B1C242C0E10130502020606060303030D0D0DB0AFACFCF9F5F2EFEAF2EEE8F4F1E9 C0BEBA9895909F9D958F8D888988857D7E79757872686D682323250F0F13141417141316101012 18191A363E3A7D8587606364000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF0000000000000000000000000000000000000000000000000000000000000D0D0D8B8B90 717576787A7B3A3D3C141616202222191B1C5B595A878382908D8B9591909895949D9A989D9999 9F9B99D0CAC6ECE6E1E9E5E0ECE7E3EFEBE6F6F2ED918E8B020202060606060606050303090A0A 1B22291D252C1C242B393E45393E44393E44393E45393E45393E45393E45393E453A3F463A3F45 3A3F453A3F463A3F463A3F463A3F463A3F463B40473B40463B40463B40473B40473B40473B4047 3B41473B41473B41473B41473C41483C41483C41483C41483C41483C41483C41493C41493C4148 3D42493C42493C42493D424A3C42493D434A3D434A3D434A3D434A3E434A3E434A3E434B3E444B 3E444B3E444B3F444B3F444C3F444B3F444B3F454C3F454C3F454C3F454C3F454D40454D40454D 40454D40454D40464E40464D41464E41464E41464E41474F41474F41474E41474F41474E42474F 42474F42474F42485042485042484F424850424850434950434950434950434950434950434951 434951444951444951444951444A52444A52444A52444A52444A52444A53444A53444A52454B53 444B53444B53454B53454B53454B54454B54464C54464C54464C54464C54464C55464C54464C55 464C55464D55464D55464D55464D55464D55464D55474D55474D55474D56474D55474D56474D56 474D56474D56474D56474D56474D56484E56484E57484E57484E56484E57484E56484E56484E57 484E57484E57484E57484E57484E57484E57484E57484E57484E57484E57484E57484E57484E57 494F57494F57484E57494F57494F57484E57484E57484E57484E57494F58474E57494F58474E57 474E57484E57484F57484E57484E57484E57484E57484E57484E57484E57484E57484E57484E57 484E57484E57484E56484E56484E56484E56484E56484E56484E57474D56474D56474D56474D56 474D56474D55474D55474D56474D55474D56474D56464D55464D55464D55464D55464C55464C54 464C55464C55464C54464C54464C54464C54464C54454B53454B53454B53454B53454B53454B53 454B53444A52444A52444A52444A52444A52444A52444A52444A52434951444952434951434951 43495142495043495143495143495042485042485042485042485042484F42485042485042474F 42474F42474F42474F41474E41474E41464E41464E41464E40464D40464E40464E40454D40454D 40454D3F454C3F454D3F454C3F454D3F454C3F454C3F444C3F444B3F444B3F444C3E444B3E444B 3E444B3E434A3E434B3E434A3D434A3D434A3D434A3D42493D42493D42493D42493D42493D4249 3D42493C41483C41483C41483C41483C41483C41483C41483B41473B41483B41473B41473B4047 3A40473B40473B40473B40463B40473B40463B40463A3F463A3F463A3F463A3F463A3F453A3F46 3A3F453A3F453A3F45393E45393E45393E45393E45393E44393E45393E45393E441C242B1C242B 1C242C0E10130502020606060303030D0D0DB1AEACFDF9F4F2EFEBF3F0ECF6F2ECC4C1BD989590 9F9D95908E888A89857D807A747873676C6622232510101312131413141510101319181A393F3C 848A8C636567000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 0000000000000000000000000000000000000000000000000000000D0D0D8E8D91757878757979 37393A15171820232416181A585657878382908D8B9591919895959D99989E9B9A9D9998CFC9C6 ECE7E1E8E4DFEAE7E4EDEAE6F7F3EE908F8D030202060606060606050303090A0A1B22291D252C 1C242B393E45393E44393E44393E45393E45393E45393E45393E45393E453A3F453A3F453A3F45 3A3F453A3F463A3F463A3F463A3F463A3F463B40463B40463B40463B40473B40473B40473B4047 3B41483B41483B41473B41483C41483C41483C41483C41483C41483C41483C41483C41483C4149 3C41493D42493C42493D42493D42493D434A3D434A3D434A3E434B3D434A3E444B3E434B3E434B 3E444B3E434B3F444B3F444B3F444C3F454C3F454C3F454D3F454D3F454D3F454D3F454D40454D 40454D40464D40464D40454D40464D40464E40464E41464E41464E41474E41474E42474F42474F 42474F42484F42484F42484F42484F424850434950434950434950434950434951434950434951 434951444951444952444951444951444A52444A52444A52444A52444A52444A52444A52444A53 454B53444A53454B53454B53454B54454B53464C54464C54454B54464C54454B54454B54464C54 454B54464C54464C54464C55464D55464D55464D55464D55474D56474D56474D56474D55474D56 474D55474D55474D56474D56474D56474D56474D56474D56474D56474D56484E56484E56484E56 484E56484E56484E56484E56484E56484E56484E56484E57484E56484E57484E57484E57484E57 484E57484E57484E57484E57484E57484E57484E57484E57474E57484E57474E57474E57484E57 474E57484E57484E56484E57484E56484E57484E57474D56484E57474D56474D56484E56474D56 484E56484E56474D56474D56474D56474D56474D56474D56474D56474D56474D55474D56474D55 464D55464C55464D55464C55464C55464D55464C55464C54464C54464C54464C54464C54464C54 464C54464C54454B53454B53454B53454B53454B53454B53454B53454B53444A53444A53444A52 444A53444A52444A52444A52444951444951444951434951434951434851434851434950424850 43495042485042485042485042485042485041474F42485041474F41474F42474F41464E41474E 41474E41474F41464E41464E40464E40464E40464E40464E40454D40454D40454D40454D3F454C 3F444C3F454C3E444C3E444C3F454C3E434B3F444B3E444B3E444B3E444B3E434A3E434A3E434A 3E434A3E434A3D434A3D434A3D42493D42493D42493D424A3D42493D42493C41493C41483C4149 3C41483C41483C41483C41483C41483C41483B40473B41473B40473B40473B40473A40473B4046 3B40463B40473B40463B40473B40473A3F463A3F463A3F46393E453A3F45393E453A3F453A3F45 393E45393E45393E45393E45393E45393E45393E45393E45393E441C242B1C242B1C242C0E1013 0502020606060303030D0D0DB0AFABFCF9F4F3F0EBF3F0EBF5F3EDC4C3C09B99939F9D968E8C88 8C89857C7E7A747872696C682423241010121312151313161010141919193A413C7B83835C6060 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 0000000000000000000000000000000000000000000D0D0D8B8C8E757A7975797A373A3A151516 202224171919575455868381908D8B9491919895959D99989E9A9A9F9A97CFCAC5EAE6DFE7E3DE EAE6E3EDEAE7F7F3EE918F8D030202060606060606050303090A0A1B22291D252C1C242B383D44 383D44383D44383D44393E45393E45393E45393E45393E45393E453A3F453A3F453A3F453A3F46 3A3F463A3F463A3F463A3F463A3F463A3F463A3F463A3F463A40463A40473A40463A40473A4047 3B40473B40473B40473B40473B40483B40473C41483C41483C41483C41483D42493D42493C4149 3D42493C42493C42493D424A3D424A3D424A3D434A3D434A3D434A3E444B3D434A3E434B3E444B 3E434B3E434B3E434B3E444C3E444C3E444C3E444C3F444C3F444C3F444C3F454D3F454D3F454D 40454D40454D40454D40454D40464E41464E40464E41474E41474E41474E41474E42474F42474F 41474F42484F41474F41474F42474F42475042474F424850424850424850424850434851434850 434951434850434951434951434951434952434952444A52444A52444A52444A52444A52454B53 444A53444A53444A53454B53454B53454B53454B53454B53454C54454C54454B54454C54454B54 454B54454B54454B54454B54464C55464C55464C55464C55464C55464C55464C55464C55464C55 464C55464C55464C55464C55474D56474D56474D56474D56474D56474D56474D56484E56474D56 474D56474D56474D56474D55474D56474D55474D55474D56474D55474D56474D56474D55474D56 474D55474D55474D56474D55474D56474D56484E56474D56484E56484E56474D56484E56474D56 474D56474D56474D56474D56474D56474D56474D56474D56474D56474D56474D56474D56474D56 474D56474D56464C55464C55464C55464C55464C55464C55464C55464C55464C55464C55454B54 454B54454B54454B54464C54454B54464C54464C54464C54464C54464C54464C54454B53454B53 454B53454B53454B53444A53444A52444A52444A52444A52444A52444A52434951434952434951 434951434951434951434951434851434951434851434950434950424850434950424750424750 42475041474F41474F41474F41484F41474F41474F41474F41464E41474E41464E40464E40464E 40464E40454D40454D40454D40454D3F454D3F454D3F454D3F444C3F444C3E444C3F444C3E444C 3E444C3E434B3F444B3E434B3E444B3E444B3E444B3E434A3E434A3E434A3D434A3D434A3D424A 3D424A3C42493C42493C42493C42493C42493C41483C41493C41483C41483C41483B40473B4047 3B40483B40473B40483B40473B41473B40473B40473B40473A40473B40473A3F463A3F463A3F46 3A3F463A3F463A3F463A3F463A3F463A3F46393F45393E45393F45393E45393E45393E45393E45 393E45383D44393E45383D44383D44383D44383D441C242B1C242B1C242C0E1013050202060606 0303030D0D0DAFAEABFBF8F4F2EFEAF2EFE9F4F0EBC3C1BE989690A09E98908E898B8B867C7E7A 727671676B67222222101012131316141317100F12181A1A3A423D7A8283595C60000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 0000000000000000000000000000000D0D0D8B8D8F757979787B7C393B3C151818212324181A1B 575655848080908C8B9592919995959C98979E9A999E9B98D0CAC5EBE6E1E6E1DDEAE5E1ECE7E5 F6F2ED908D89030202060606060606050303090A0A1B22291D252C1C242B383D43383D44383D44 383D44383D44383D44393E44393E44393E44393E44393E45393E45393E45393E45393E45393E45 393E453A3F463A3F463A3F463A3F463A3F463A40473A40473A40473A40473A40473B40473B4047 3B40473B40483B40473B40483B40473C41483C41483C41483C41483C41493C41493C41493C4249 3C42493C42493C42493D42493D42493D434A3D434A3D434A3D434A3D434A3E434B3E434B3E434B 3E434B3E434B3E434B3E444B3E444B3E444B3E444B3F444C3F444C3F444C3F454D3F454D3F454C 40454D40454D40454D40464D40464D40464D41464E40464E41464E40464E40464E41474F40464E 41474F41474F41474F424750424750424750424750424850424850424850424850434851434851 434851434951434951434951434951434952434951434952444A52444A52444A52444A52444A52 444A52444A53444A52444A52444A53454B53454B53454B53454B53454B54454B54454B54454B53 454B54454B53454B53454B53454B53464C54454B53464C55464C54464C55464C55464C54464C55 464C54464C54464C54464C54464C54464C54464C54474D55464C54464C55474D56464C55474D56 474D56474D56474D56474D56474D56474D56474D56474D56474D56474D56474D56474D56474D56 474D55474D56474D55474D55474D56474D55474D56474D56474D56474D56474D56474D56474D55 474D56474D55474D55474D56474D55464C55464C55464C55464C55464C55464C55464C54464C55 464C54464C54464C54464C54464C54464C54464C55464C54464C55454B54454B53454B54454B53 454B53454B53454B53454B53454B53444A53454B53444A53444A53444A53434952444A53444A53 444A53444A53444A52444A52444A52434952434952434952434952434951434951434951434951 43485143485043485042485042485042485042475042475042475042475042475041474F41474F 41474F41474E41474F41464E41474F41464E41464E41464E40464E40464E40464D40454D40454D 40454D40454D3F454C3F454C3F454C3F444C3F444C3E444C3E444C3E444B3E444C3E434B3E434B 3E434B3E434B3E434A3E434A3D424A3D434A3D424A3C42493D424A3C42493D424A3C42493C4249 3C42493C42493C41493C41493C41493C41483C41483C41483B40483B40483B40483B40473B4047 3B40473B40473B40473A40463A40473A40473A40473A3F463A3F463A3F463A3F453A3F463A3F45 3A3F453A3F46393E45393E45393E45393E45393E45393E45393E45393E44393E45383D44383D44 383D44383D44383D44383D43383D441C242B1C242B1C242C0E10130502020606060302020F0F0F B2B1AEFDF9F5F2EFE9F2EEE8F3EFE8C4C2BF9997929F9D96908E888D8C857C7E78727570646765 212223121315131217141317100D1217181A3A403D798182606164000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 0000000000000000000D0D0D8A8C8E757879737677393A3A161818222424181A1A555353858081 8F8B8A9591909A96969D99989E9A989F9C99CFCBC7EAE5E0E7E2DDEBE6E1EDE7E1F4F0EB8F8C88 020202060606060606050303090A0A1B22291D252C1C242B373D43383D44383D43383D44383D44 383D44393E45393E44393E45393E44393E44393E44393E45393E45393E45393E453A3F45393E45 393E45393E45393F46393F46393F463A40463A3F463A40463A40463A3F463B40473A3F473A3F47 3B40473B40473B40473B40473B40483C41483B40483B40483B41483B41483B41483B41483C4249 3C41493C42493D42493C42493D42493D424A3D424A3D434A3D424A3E434A3E434A3E434B3E434B 3E434B3E434B3D434B3E444C3E444B3E444C3F444C3E444C3F444C3F454C3F454D3F454C40454D 40454D40454D40464E40464D40464D40464D41464E41464E41464E40464E41474E40464E41464F 40464E41464F41464F41464F42474F41474F42474F424850414750424850414750424850434850 424850434951434951424851434951434951434951434951434951434952434952444A52434952 444A52444A52434952444A52434952434952454B53444A53454B53454B53454B54454B53454B54 454B54444B53454B54454B53454B53454B53454B53464C54464C54464C55464C54464C55464C55 464C54464C55464C54464C54464C54464C54464C54464C54464C54464C54464C54464C54464C54 464C54464C54464C54474D55464C54464C54474D55464C55464C54464C55464C55474D55464C55 474D55474D55464C55474D55464C55464C54464C55464C55464C54464C54464C54464C54464C54 464C54464C54464C54464C54464C54464C54454B54464C54464C54464C55464C54464C55464C55 454C54464C55454C54454B53454B53454B53454B53454B53454B54454B53454B54454B54454B53 454B53454B53454B53454B53454B53444A52444A52434952444A52434952434952434952434952 434952434951434951434951434951434951424851434951424850424851434850424850424850 42485041475042485041475041474F41474F41464F41464F41464F41474F40464E41474E41474E 40464E41464E40464E40464E40464D3F454D40464D40454D40454D40454D40454D3F454D3F454C 3F454D3F454C3E444C3F444C3E444C3E444B3E444B3E444C3E434B3E434B3E434B3E434A3E434B 3E434A3D434A3D434A3D434A3D42493D42493C42493D42493C42493C41493C41493B41483B4148 3B41483C41483B40483C41483C41483B40483B40473B40473B40473B40473A3F473B40473A4046 3A3F463A40463A3F463A3F463A3F46393F46393F46393F463A3F45393E453A3F453A3F45393E45 393E45393E45393E45393E44383D44393E44393E44393E45393E44383D44383D44383D44383D44 373D43373D43383D431C242B1C242B1C242C0E10130502020606060202020F0F0FB3B1AEFCF9F4 F3F0EBF3F0EBF5F2ECC5C3C1999793A09F95918F898C8B847C7F777375706567651F2020131317 1212171414180F0F1218191B373E3B7C8385606164000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 0000000D0D0D8A8B8E76797B71747738393B17181821232517191B525152847F7F8E8B89949190 9B97959F9A9A9E9A98A29D9AD1CCC9E8E3DEE8E3DFECE7E3EFEAE4F4F0EC8E8B88020302060606 060606050303090A0A1B22291D252C1C242B373C43373C43373C43383D44383D43383D44383D44 383D44383D44383E44383E44393E45393E45393E45393E45393E45393E45393E45393E453A3F45 393E453A3F463A3F46393F463A3F46393F463A3F463A3F463A3F463A3F473A3F473A3F473B4047 3B40473B40473B40473B40473C41483C41483B41483C41483B41483B41483C41483C41493C4249 3D42493C42493D42493C42493D424A3D42493D424A3D42493D424A3D424A3D424A3D434B3D434B 3D434B3D434B3E434B3E434B3E434B3E444C3E444B3E444B3F444C3F444C3F444C3F444C3F454D 3F454D3F454D3F464D3F454D3F464D40464E40464E40464E40464E40464E40464E41474E40464E 41474F41474F41464F41474F41474F41474F414750414750414750414750424850424850424850 424850434850424851434951434951434951434951434951434952434951434952444A52444A52 434952444A52434952434952434951444A53434951444A52444A53444A52444A53444A53444A53 444A53444A53444A53454B53444A53454B53454B53454B53454B53454B53454B53454C54454B54 454B53454C54454B54454C54454B54454B54454B54454B54454B54464C54464C54454B54464C54 464C54464C54464C54464C54464C54464C54464C54464C54464C54464C54464C54464C54464C54 464C54464C54464C54464C54464C54464C54464C54464C54464C54454B54464C54464C54464C54 464C54454B54454B54454B53454B54454B53454B53454B54454B53454B53454B53454B53454B53 454B53454B53444A52444A53444A52444A52444A53444A52444A53444A53444B53444A53444B53 434A52434952434A52434952434952434952434952434952434952444A52434951434951434951 434951434951424851424851424851424850424850424850424850414750414750414750424850 41474F42474F42474F41464F41474F41464F41464F41474E40464E41474E41474E40464E41464E 3F454D3F454D3F454D3F454D3F454C3F454C3F454D3F444C3F444C3F444C3E444C3E444C3E444C 3E434B3E434B3E434B3E434B3D434A3D434B3D434A3D434B3D424A3D434A3D424A3D434A3D434A 3D424A3C42493C42493C42493C42493C42493C41493C41493C41483B41483C41483C41483B4148 3C41483B40483B40483B40473B40473B40473B40473A3F473A3F473A3F473A3F463A40463A3F46 3A40463A3F46393F463A3F46393F46393F463A3F45393E453A3F453A3F45393E45393E45393E45 393E45383D44383D44383D44383D44383D44383D43383D44383D44383D44373C43373C43373C43 373C431C242B1C242B1C242C0E10130502020606060202020F0F0FB3B1AFFCF9F4F3EFEBF3F0EC F5F2EEC6C3C3989690A19F9692908A8B89857E7E78727471626461201E20141317131318131317 0D0D10191A1B39403D7F8789636465000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000D0D0D 8A8C8E737979767A7B393A3A171919222424161819535051847F7F8D8987938F8E9B97969F999A A19B9AA19C99CCC8C4E8E2DDE8E2DEEBE6E4EDEAE7F5F1EF8E8A89030202060606060606050303 090A0A1B22291D252C1C242B373C43373C43363B42363B4133383F31363B33373D33373E33383E 33383E33383E33383E33383E33383E34383F34383E34383F34383F34383F34383F34383F34383F 34394034383F34394034383F343940353940343940353A41353A41353A40353A41353A40353A40 353A40353A40373C42383E443A3F463A40473B40473B41483B41483B41483B41483C41493B4148 3C42493B41483A40473A3F46373D44363A41373C43373C43383C44383C44383C44383D43383D44 383D43383D44383D45383D44383D45393E45393E44393E45393E45393E45393E45393E453A3E46 3A3E463B40483D434A3E444C3F444D40464D40464E3F454C3F444C3E434B3B4148393E453B4048 3A3F473B40483A3F473B40473B40483B40473B40483C41493C41483C41493C41483C41483B4148 3C41483C42493C42493C42493C42493C42493D42493E444C40464D414750424851424951434952 42485041485040464E3E444B3C41483E434B3E434B3E434B3E434B3E434B3E434B3E434B3E434B 3E434B3E444C3E444B3E444C3E444C3E444B3E444C3E444B3F444B3F444C3F444B3F444C3F444C 40464E424850434952444A53454B53454B54444B53444A5242485140464D3D424A3F444D3E444C 3F444D3E444C3E444C3F444D3F444C3F444D3F454D3F454C3F454D3F444C3F444C3E444C3F444C 3E444C3E444C3F444C3E444C3F444C3F444C40464F424850444A53444B53444B53454B53434A52 4349514248503F454D3D42493F444C3F444C3F444C3F444C3E444C3E444B3E444C3E444B3E444B 3E444C3E434B3E444C3E434B3E434B3E434B3E434B3E434A3E434B3E434A3E434B3E434B3F444C 40464E42485042485143495143495242485041474F40464E3D434B3B40473C42493C41493C4249 3B41483B41483C41493B40483C41493C41493C41483C41493B40473B40473B40473B40473A4047 3A40473B40473A40473B40473B40473C41493D434A3F444C3F454D3F464D3F454D3E444C3E444B 3D424A3A4046383D433A3E46393E45393E45393E45393E45393E44393E45393E44383D44383D45 383D44383D45383D44383D43383C44383C43383C43383C44373C43373C43373C43393E453A3F46 3B40483C41493C41483C41493C41483B41483B41483B41483B41483B41483A3F473A3F47383D44 353B4234383F353940353A41353A41353A40353A4135394035394034394035394034393F34393F 34393F34393F34383F34383F34383F34383F34383F34383F33383E34383F33383E33383E33383E 33383E33383E33383E33383E33373E33373E33373E34393F353A41363B42373C42373C431C242B 1C242B1C242C0E10130502020606060202020F0F0FB3B1AFFCF8F3F2EEEAF2EFEAF5F1ECC6C5C3 999792A29F979190898A89847E7D7A7375716366621F20211213171213161313150F0F10191A1A 3A423D757E7F606465000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 0000000000000000000000000000000000000000000000000000000000000D0D0D8D9091737778 767879393A3A161818212324141718535052847F808D8988938F8E9A96959E9A99A09C9A9F9B98 CBC6C2E8E3DEE7E3DFEAE7E3EAE7E3F4F0EE8D8B88020202060606060606050303090A0A1B2229 1D252C1C242B373C43373C42363A4135393F474B4F55595C66696C676A6D65686C65696D66696D 65696D66696D66696D676A6E676A6E676A6E676B6F676A6E676B6F676A6E676A6E676B6F686B6F 686C6F686C6F686B6F696C70686C70686C706A6D71696C706A6D716A6D716C6F736B6E72595C62 494D52393E44393D453A3F473A40473A40473B41483B40483B41483C41493B41483C41493B4148 3A3F46393D4454575B77797B8C8D8D909091909191909191919192909191929293929293929293 9393949393949393949293939393949394949394949595969495959595969293947C7E8156595E 3C42493D424A3E434B3F454D3F444D3F454C3E434B3C4148595C607E808295969698999A989899 99999A99999B99999A99999B9A9A9B9A9A9B9A9A9B9B9B9C9B9B9C9B9B9C9C9C9D9B9C9D9B9C9D 9C9C9D9B9C9D9D9E9E9A9A9B8385885A5E6340464D41464E41475042495043495141485040464E 3F444C5D60658486889C9D9DA0A1A19FA0A19FA0A1A0A0A19FA0A1A1A1A2A1A1A2A1A1A2A1A1A2 A1A1A2A2A2A3A0A1A2A2A2A3A1A2A2A1A2A2A2A2A3A1A2A2A2A2A39E9FA0888A8D5E6167424850 424750434951454B53444A53444A5243485040464D5F626787898BA0A1A1A4A4A5A3A4A4A3A4A4 A4A4A5A2A3A3A3A3A4A3A3A4A3A3A4A3A3A4A3A3A4A3A3A4A2A3A3A3A3A4A3A4A4A2A3A3A4A4A5 A2A3A3A3A3A49FA0A1888A8D5E626741474F434851434952444B53454B53434A5242485041464D 5E626686888A9E9F9FA2A2A3A1A2A2A1A2A2A2A2A3A1A2A2A1A1A2A1A1A2A1A1A2A1A1A2A1A1A2 A1A1A2A0A1A2A0A0A19FA0A19FA0A1A0A0A19FA0A1A0A1A19C9C9D8485895C5F6440464E40454E 41474F43495042485042485041464E3E444B5C5F63828486999A9A9C9D9D9B9C9D9B9C9D9C9C9D 9B9C9D9B9B9C9B9B9C9B9B9C9A9A9B9A9A9B9A9A9B9A9A9B99999B99999A99999A99999B989899 98999A9495967F8083575B603D434A3E434B3F444C3F454D3F454D3E444C3D424A3B4047575A5E 7C7E80919292959596949595939494949495929393939394939394939394939394919192919192 9091919090918F90908F90909090918E8F8F8F8F908C8C8D76777A515459393E453A3E463A3F47 3C41483B41483B41483B41483B41483B41483A40473A40473A4047393E45373C434A4E53585C60 6A6D716B6D71686B6F686B6F696C70676B6F686B6F676B6E676B6E676B6E676B6E676B6E66696D 666A6E66696D66696D666A6E65686C66696D66696D65686C66696D64686C64686C65686C64676B 64686B64686B66696C65676B53565B45494E343940363A41363B42373C431C242B1C242B1C242C 0E10130502020606060202020F0F0FB3B1AFFCF9F4F1EEEAF0EEE7F3F1EAC6C4C1999792A19C97 908E898A89847F7F7A7375716367621F1F201012151012141212150F0F10181919373F3A788282 5B5F60000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 0000000000000000000000000000000000000000000000000D0B0D8A8C8E76797B7376773A3C3B 1416152022231517185250518480808D8987938F8D9A94949E99999F9A99A09C9ACDC7C4EAE4E0 E8E4E0EAE7E3EBE7E3F6F2ED8F8C88020202060606060606050303090A0A1B22291D252C1C242B 373C43363B4234394044484D5B5E6350545A50545B50545A50545B50545B51555B50555B51555B 51555B50555B52565C51555C51555C52565C52565C52575D52575D52575D52575D53575D53575D 52575D53585E53575E53575E53575E53575E53585E53585E54585F54595F54595F6165694F5358 393E45393F463A40473A40473B40473B40483B40473B40473B40483B41483A3F47393E45515459 89898A8B8B8C8C8C8D8C8C8D8C8C8D8C8C8D8D8D8F8D8D8E8D8E908D8D8F8D8E8F8D8E908D8E8F 8E8F908E8F908E8F908E8F908F90919091928F90919191939191939091928F90915B5E633C4149 3D434B3F454D3F444D3E444B3C424956595E909091939495939495949596949596949596959597 95959795959795959796969896969896969897979997979997979997979997979997989998989A 98999A98999A98989A9696985F636840454D40464E42485042485041474F3F454C5A5D62979799 9A9B9C9A9B9C9A9B9C9B9C9D9A9B9C9B9C9E9B9C9D9B9C9E9B9C9E9B9C9D9C9D9F9C9D9E9B9C9D 9C9D9E9C9D9E9C9D9E9C9D9E9D9E9F9C9D9E9E9EA09E9EA09D9E9F9B9C9D62666B424750424851 444A52444A5243495141474F5C5F649B9B9C9E9FA09E9FA09E9FA09E9FA09E9FA09E9FA19E9FA0 9E9FA19E9FA19E9FA09E9FA19E9FA09E9FA09E9FA09E9FA09E9FA09E9FA09F9FA19E9FA09F9FA1 9F9FA19D9E9F9C9D9E61656A42474F434951444A52444A5242485140464E5C60649A9A9B9D9E9F 9D9E9F9C9D9E9C9D9E9C9D9E9C9D9F9C9D9E9C9D9F9C9D9F9C9D9E9B9C9E9B9C9D9B9C9D9B9C9D 9B9C9D9B9C9D9A9B9C9B9C9D9A9B9C9B9C9D9B9C9D9A9B9C97989960646840464E41474F434950 42475041474F3F454C595C6196969798989A98989A98989A979799979799979799979799979799 979799969698969698969698969698959597959597959597949596959596949596949496959596 9394959192935B5F633C41493E434B3F444D3E444B3D434B3B414855585D8D8D8F909192909192 8F90918F90918F90918E8F918E8F908E8F918E8F918D8E8F8D8E908D8E8F8D8D8E8D8D8E8D8D8E 8D8D8E8D8D8E8C8D8E8C8C8D8C8D8E8B8C8D8B8B8C88898A55595D393E453A3F473C41483B4148 3B41483B41483B40483B40473A40473A4047393F46373C43484C525E626753585E53585F53585E 53585F53575E53585E53575E53585E53575D52575D53575D52565C52565C52575D52565C52575D 52565C52575D52565C52565C51555B51555C51555B50555B50555B50545A50545B50545A50545A 50555B50545A50555B5B5F63494D52363A41363B42363B421C242B1C242B1C242C0E1013050202 0606060302020F0F0FB3B1AEFCF9F4F2EFEBF2EFEAF5F3ECC7C4C2989692A09D96908E898B8984 7F7F797076706368631F1F211010131213151312160F0F101A1A1C3A403D7B84845F5F60000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 0000000000000000000000000000000000000D0D0D8C8C9273787A7678793A3C3C151717202222 1518185351518480808C8887948F8E9994939D99999F9A99A09B99CCC7C3E9E4DEE6E2DEE9E6E4 EAE5E2F6F1EC8F8B8A030202060606060606050303090A0A1B22291D252C1C242B363B42353A41 34383E51555A4F53594F53594F545A4F545A4F545A4F545A4F535A4F545A4F545A4F545A50545A 4F545A50545A50555B50545B50555B50555C50555C50555C50555C51565C51565C52565C51565C 52565C52565C52565C52575D52565C52575D53575E52575D53585E53585E5A5E63383D44393E45 3A40473A40473A40473A40473B40473B40473B40483B41483A3F47383C447375788A8B8C8A8B8C 8A8B8C8A8B8C8A8B8C8B8C8D8B8C8D8C8D8E8C8D8E8C8D8E8C8D8E8D8D8F8D8D8F8D8D8F8D8D8F 8E8E908E8E908E8E908F8F918F8F918F8F918F8F919090919090917D7F823B40483D424A3E434B 3E444B3D434B3B3F487A7C7F909192929394929495939495929495939596939495939596949596 949596949596949596949596959697959697969798959697969798969798969798969798979899 9798999798998385873F444C40464D42475042474F40464F3E434B81838598989A99999B999A9B 9A9A9C999A9B9A9B9C9A9A9C9A9B9C9A9A9C9B9B9D9A9A9C9B9B9D9B9B9D9B9B9D9B9B9D9B9B9D 9B9B9D9C9C9E9C9C9E9C9C9E9C9C9E9C9C9E9C9D9E9C9C9E87898C41474F424850434952434A52 4248503F444D8587899B9C9D9C9D9E9C9E9F9C9D9E9C9E9F9C9E9F9C9D9E9C9E9F9C9D9E9C9D9E 9C9D9E9C9D9E9C9D9E9C9D9E9C9D9E9C9D9E9C9D9E9C9D9E9C9D9E9C9D9E9C9D9E9C9D9E9C9D9E 9C9D9E87898B41474F424850444A52444A524248513F454D8385889B9B9D9C9C9E9C9D9E9C9C9E 9C9D9E9B9C9D9B9B9D9C9D9E9B9B9D9B9B9D9B9B9D9B9B9D9B9B9D9B9B9D9B9B9D9A9A9C9A9A9C 9A9A9C9A9A9C9A9A9C99999B99999B99999B99999B8486883F454C40464D41474F41474F40464E 3D424A7F8184979899969798969799969798969799969799969798969799959697959697959697 949596949596949596949596939495939495939495939495929394929394929394919293919293 7E80833B40483E434A3E444C3E444B3D434B3B40487A7C7E9090919090918F90918F8F918F9091 8E8F908E8E908E8F908E8E908D8D8F8D8D8F8D8D8F8D8D8F8C8D8E8C8D8E8C8D8E8B8C8D8B8C8D 8B8C8D8B8C8D8A8B8C8A8B8C8A8B8C898A8B76797B383D443A3F463A40473A40473A40473A3F47 3A40473A3F473A40473A4047393E46373B42575B6053575E53575E53575E53575E52575D52575D 52565D52575D51565C51565C52565C51565C51565C51565C50555C51565C50555C50545B50545B 50545B50545B4F545A50545A4F545A50545A50545A4F53594F545A4F53594F53594F545A4F5359 4F53594F535955595E353940353940363B421C242B1C242B1C242C0E1013050202060606020202 100F10B3B1B0FCF9F5F2EFEBF3EFEBF6F3EEC4C2C0979591A09E98918F898B8A847D7F78727671 6568651D1C1F0F0F101314161314160E101219191A373E3B777F825C6063000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 0000000000000000000000000B0D0D87898F72767774777837393A141617212223161818504F50 847F7F8D8887938F8E9994949D99999E9A999D9997CBC6C3E9E3DEE6E2DEEAE7E5EDEAE8F5F1EE 8E8B88020202060606060606050303090A0A1B22291D252C1C242B363B4233383F2D31374C5157 4E53594E53594E53594F53594E53594E53594E53594E53594F535A4F535A4F53594F535A4F5359 4F545A50545A4F545A50555B50545A50545B50555B50545B50545B51565C51555C51565C51565C 52565C52565C52565C52565C52565D52575D52565D52565D50565C32363D363B42393F46393F46 3A40473A3F473A40473A40473A40473A4047383C4431353B848486898A8B898A8B8A8B8C8A8B8C 8A8B8C8A8C8D8A8B8D8A8C8D8A8B8D8A8B8D8B8C8D8B8C8E8C8D8E8C8D8E8D8D8F8D8E8F8E8E90 8E8E908D8E908E8E908E8F918E8F918F8F918F90918B8B8D343A403A3F463E444B3E444B3B4048 34383E8B8C8E919293919293929394929394929394929394929294939495939395939395939395 949496949495949495959697949596959697959697959798959697959798959798969798959798 929294393F453D434A41464F41474F3E434B363B4292929498999A98999A98999B99999B98999B 98999B98999B999A9C999A9C999A9C999A9B999A9C999A9B999A9B9B9B9D9A9B9C9B9B9D9B9B9D 9A9B9D9B9B9D9A9B9D9A9B9D9C9C9E9B9C9E9797993B41473F454C43495143495140454D383D43 9697999C9C9E9C9D9E9B9C9E9C9C9E9B9C9E9C9D9E9C9C9E9B9C9E9C9C9E9C9C9E9B9C9D9B9C9E 9B9C9D9B9C9D9C9C9E9C9C9E9C9D9E9C9D9E9B9C9E9C9C9E9B9C9E9B9C9E9C9C9E9B9C9E979799 3B41473F454C4349514349513F454D373C439596989B9B9D9C9C9E9A9B9D9B9B9D9A9B9D9A9B9D 9A9B9D9A9B9D999A9C999A9C999A9B999A9C999A9B999A9B9A9A9C98999A9A9A9C99999B98999B 99999B98999B98999B98999A97999A939395393F463D434A41474F41474F3E434B363B41919193 969798969798959798969798949697949697949597949697949597949496949495949496949495 9393959394959393959394959293949293949293949192939192939192939192938C8C8E353A40 3A40463E434B3D444B3A3F4733373E8A8A8C8F8F918F8F918E8F918E8E908D8E908D8E908D8E90 8C8D8F8C8D8F8C8D8F8B8C8D8B8C8E8B8C8D8B8C8D8B8C8D8A8B8C8B8C8D8B8C8D8A8C8D8A8B8C 8A8B8C898A8B898A8B898A8B85858732373D373C423B40473A40473A40473A40473A3F473A4047 393F46393F46373B4330343A50565C52575D52575D52565D52565C51565C51565C51565C51565C 51555C51555C51555B51555C50545B50545B50555B50545B50545A50545A4F545A50545A4F545A 4F535A4F545A4F535A4F545A4F53594F53594F53594F53594F53594E52594E53594E52594E5259 4C51572F343A33373D363B421C242B1C242B1C242C0E1013050202060606030202100F10B4B3B0 FCF9F5F2EFEBF3EFEBF6F2ECC7C5C3979692A09E96928F8B8B89857B7E79747873686B671D1D1F 100F141414181314150F10101A1C1C39423E767F815B5F61000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 0000000000000D0D0D87888D73767774777837393A161717212222171A19504F4F837F7F8D8988 928E8D9A94939E99989E9A999D9896CAC5C2E9E3E0E9E3E0EBE6E5EBE8E7F3EFED8F8D89030202 060606060606050303090A0A1B22291D252C1C242B363B4133383F2D31364D52584D51584D5158 4D52584D51584E53594E53594E53594E53594E53594E53594F53594F53594F53594F53594E5359 4F545A4F535A4F535A4F545B4F545B4F545B4F545B50555B4F545B50555B50555B50545B50555B 50555B50555B50555C51565C51565C51565C52565C32363D363B41393F463A3F47393F463A3F47 3A3F473A3F473A3F463A4047373C4331353B88888989898A89898A8A8A8B8A8A8B8A8A8B8A8A8B 8A8C8D8A8B8C8A8C8D8A8C8D8B8C8E8B8D8E8B8C8E8B8C8E8B8C8D8C8D8F8C8D8E8D8E8F8D8E8F 8D8E8F8D8E8F8D8E8F8E8F908E8F908F909134393F3A3F453D434B3D434A3B404833383E8F9091 919193919193919193919193919193929294929394929294939495939495939395939495939395 949496949495949496949495949596949596949596949596949596959697959697959697393E45 3D424A41464E41464F3D434A363A4195969796979897989997989997989997989998999A98999B 98999A98999B98999B98999B98999B999A9C999A9C999A9B999A9C999A9B999A9B9A9B9C9A9B9C 9A9B9C9A9B9C9A9B9C9A9B9C9A9B9C3A40463E434B4248514248503F444D373C439B9C9D9B9C9D 9B9C9D9B9C9D9B9C9D9B9C9D9B9C9D9B9C9E9B9C9D9B9C9E9B9C9E9B9C9E9B9C9E9B9C9E9B9C9E 9B9C9D9B9C9E9B9C9D9B9C9D9B9C9D9B9C9D9A9B9C9B9C9D9A9B9C9B9C9D9B9C9D3B40473F444C 4248504248513F444C373C42999A9B9A9B9C9A9B9C9A9B9C9A9B9C999A9B9A9B9C999A9C999A9B 999A9C999A9C999A9C999A9C98999B98999B98999A98999B98999A98999A979899979899979899 979899979899979899969798393E453D424941464F41464E3D424A353A41949596959697959697 949596949596949596949596949697949495949596949596949496939495939395939395939395 929294929294929294919193919193919193919193909192909192909192353A403A3F463D434A 3D434B3A3F4733373D8D8E8F8E8F908D8E8F8D8E8F8D8E8F8D8E8F8D8E8F8C8D8F8C8D8E8B8D8E 8B8D8E8B8C8E8B8D8E8A8B8D8A8B8D8A8B8C8A8B8D8A8B8C8A8A8B8A8A8B8A8A8B89898A89898A 89898A88888988888932363C373B423A40473A40473A3F473A3F473A3F47393F46393F46393F46 363B4230343A51565C51565C51565C50565C50555C50565C50565C51565C50555B51555B51555B 51555B50545B50545B50545B4F535A4F545A4F535A4F535A4F535A4F535A4E53594E53594E5359 4E53594E53594E53594E52584E53594E52584E52584D51584D51574D51584D51584D51572F3439 33373D363B421C242B1C242B1C242C0E1013050202060606030202101010B4B3B0FCF9F5F2EEEA F1EEE8F4F1EBC4C4C2969590A19F97918E8B8A88857D7D797678726A6D69202021101015141416 141417100F12181A1A39423D777E805D5F61000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 0D0D0D868788727576747877383A3A141718212323181A1B4F4E4E837F7F8D8988928E8C999392 9E99999E9A999D9996CAC5C2E8E3DFEAE5E0ECE8E4EBE7E6F3F0F08F8C8B030202060606060606 050303090A0A1B22291D252C1C242B363B4233373E2C31364D51574D51574D51574D51574D5157 4D51574D52584D52584D52584D52584E53594E52594E53594E52594E52594F53594E53594F5359 4F53594E53594F545A4F545A4F545A4F545B4F545B50545B50545B4F545B50545B50545B50545B 50555B50545B50555B51565C50555C31363C363B41393E46393E46393F46393F46393F46393F46 393F463A3F47373C4330343A87878889898A89898A88898A8A8A8B898A8B898A8B8A8A8B8A8A8C 8A8B8C8A8B8C8A8B8C8B8C8D8B8C8D8B8C8D8B8C8D8B8C8D8C8D8E8C8D8E8D8E8F8D8E8F8D8E8F 8D8E8F8D8E8F8E8F908E8F9034393F393E463D424A3D434B3A3F4732373D8F9091909192909192 8F9091919193909192909192929294919293929294929294919294939395929395929395949495 939495949495949495949495949495949596949596949596949596959697383D443C414940464E 40454E3D434A353A41959697969798979899979799979899979799979799979899979799979899 97989997999A98999A97999A97999A98999A989A9B999A9B999A9B999A9B999A9B999A9B999A9B 999A9B9A9B9C9A9B9C3A40473E434B4147504248513E434C363C429A9B9C9A9B9C9A9B9C999A9B 9A9B9C999A9B999A9B9A9B9C999A9B9A9B9C9A9B9C999B9C9A9B9C999B9C999B9C9A9B9C999B9C 9A9B9C9A9B9C9A9B9C9A9B9C9A9B9C9A9B9C9A9B9C9A9B9C9A9B9C3A3F463E434B424850414750 3E444C363C4298999A999A9B999A9B98999A999A9B98999A98999A98999A98999A98999A98999A 97999A98999A97999A97999A979899979899979899979899979899979899969798969798969798 969798969798393E453C414940454E40464E3C414A353A40939495949596949596949496949596 939495939495949495939495939395939395929395939395929395919294929294919294919193 91919391919391919390919290919290919290919290919234393F393E453D434A3C424A393F46 32373D8D8E8F8D8E8F8D8E8F8D8D8E8D8E8F8C8C8D8C8C8D8C8D8E8B8B8D8B8C8D8B8C8D8B8C8D 8B8C8D8A8B8C8A8B8C8A8B8C8A8B8C8A8A8B8A8A8B8A8A8B89898A89898A89898A89898A888889 88888932363D373B42393F463A3F47393F46393F46393E46393E46393E46393E46363B422F3339 51565C51565C50555B50545B50555B4F545B4F545B4F545B4F545B4F545B4F545B4F535A4F545A 4F535A4F535A4F53594E53594F53594F53594E53594E53594E53594E53594E53594D52584E5259 4E52594D52584E52594D51574D51574D51574D51574D51574D51574C50572F333933373D353A41 1C242B1C242B1C242C0E1013050202060606030202101010B4B3B1FBF9F4F2EFEAF1EFE9F5F2EC C4C2C0959391A09E98908E888A88837F7E79747672676A66212123141518121314131315100F13 1A1B1C38403A7E83845D5D60000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF0000000000000000000000000000000000000000000000000000000000000D0D0D898A8E 7577787476783A3D3C151716222424181A1C4E4E4F837F7E8D8988928D8C9992919E98999E9A98 9F9B98C9C6C3E6E2DEE8E4DFECE9E3EBE7E3F4F0EE8E8C8B030202060606060606050303090A0A 1B22291D252C1C242B353A4133373E2C31364C50574C50564C50574D51574C50574D51574D5157 4D51584D52584D51584D52584D52584D52584E52594E52594D52584E53594E52594E52594E5259 4E52594E52594E53594E53594E53594E53594F535A4F535A4F535A4F535A4F545B50545B4F545B 50545B50555B50545B31363C353A41393E45393F46393E46393F46393E46393F46393F46393F46 363B4330343A86878887888988898A88898A88898A88898A898A8B898A8B898A8B898A8B8A8A8C 8A8B8C8A8A8C8A8B8C8B8C8D8B8B8D8B8C8D8B8B8D8B8B8D8C8C8D8C8C8D8C8C8D8D8D8E8D8D8E 8D8D8E8D8E8F34393F393E453C424A3D434A3A3F4732373D8D8E8F8E8F908F90918F90928F9091 909193909193909192909193919293919293919294919293919294929395929394929395929394 939495939495939495939495939495939495949496949496383D443C414940454E40454E3C414A 353A40949496969698969698969698969698969698979799969698979799979799979799979899 97979997989997989997989997999A97989997989997989998999A97989997989998999A98999A 98999A3A3F463E434A4147504248503E434C363B4298999A98999A98999A98999B98999A98999B 999A9C98999A98999B999A9B999A9B999B9C98999A999B9C989A9B98999A999B9C999A9B98999A 98999A98999A98999A999A9B999A9B98999A98999A393F463D424A4147504147503E434C363B42 97989998999A97989997989A97989997989A97989A97989997989A979899979899979899979799 979899979899979799979899979799969698969698969698969698969698959597959597959597 393E443C41493F454D40464D3C4149343940939395949496939495939495939495939495939495 9394959293959293949293949293959192939192949192949192939091939091929091928F9091 8F90918F90918F90918E8F908E8F908E8F9034393F393E453C424A3C424A393E4632373D8C8C8D 8D8D8E8D8D8E8D8D8F8C8C8D8C8C8E8B8B8D8C8C8D8B8B8D8B8B8D8B8B8D8A8B8C8A8A8C8A8B8C 898A8B898A8B898A8B898A8B88898A88898A88898A88898A87888988898A87888987888931363C 363B41393F463A3F46393E46393E46393F46393E46393E45393E45363A422F33394F545B4F545B 4F545B50545B4F545B50545B4F545A4F535A4F545A4E53594E53594F535A4E53594E53594E5359 4E52594E53594E52594D52584D52584D52584D52584D52584D52584D51584D51584D51584D5158 4C50574C50574C50574D51574C50574D51574C50564C50562E333932363D353A411C242B1C242B 1C242C0E1013050202060606030202101010B4B3B0FCF9F5F2EFEBF3F0ECF6F3EEC7C6C3979692 A2A09A918F898B8A837C7D77747771666965212123151517131315141317101014181A1938423C 7B81825F6060000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 0000000000000000000000000000000000000000000000000000000D0D0D88898D76787A747778 3C3E3E161817222625191B1C4F4D4D84807F8C8887938E8C9A94939E9A999E9B989E9A97C9C5C1 E6E2DDE9E5E0EDE8E4EAE6E3F4F0ED8F8B8B020202060606060606050303090A0A1B22291D252C 1C242B34394033373E2C31364A4F554B4F564C50564B4F564C50564B4F564B4F564C50564C5056 4C50564C50564C50564C50564C51574C51574C50574C51574D51584D51584D52584D51584D5258 4D52584E52594E52594E52594E52594E53594E535A4E53594E53594E52594E535A4E535A4E535A 4F535A31363B353A41383E45383E45393E46383E45393E46393F46393F45393F46363B422F343A 86868787878987878986878887888A87888987888987888988898A88898A88898A88898B898A8B 898A8C898A8C898A8B8A8B8D8A8B8C8A8B8C8B8C8D8B8C8D8B8C8D8B8C8D8B8C8D8C8D8E8C8D8E 33383E383E443C41493C4249393E4632373D8D8D8F8E8E908E8E908D8E908F8F918E8F918E8F91 8F8F918F9091909091909091909092919192919193919193919192919294919293919293919294 919293919294929395929395929395939496383D443B40483F454D3F454D3C4149343A40939495 949597949597949697949597949697949697959697949697959697959697959698969798969799 969799969798969799969798979799969799979799979799979799979799979799979799393E45 3C424940464E40474E3D424B353B4298989A98989A98989A97989A98989A97989A97989A98989A 97989A98989A98989A98989A98989A98989A98989A98989A98989A98989A97979998989A98989A 98989A98989A98989A98989A98989A393E453D424A40474E41474F3D434B353B41969698979799 979799959798979799959798969799969798959798969798969798969799969798969799959698 959697959698959697959697959698949596949597949597949597949597939496383D433B4047 3F444D3F454D3B404933383F919293929395929395929394919294919293919293919293919293 9191929191929191939090919090929090929090919090929090918F8F918F8F918F8F918F8F91 8E8E908E8E908E8E908D8D8F33383F393E453C42493C4149383E4531373D8B8C8D8C8D8E8C8D8E 8A8C8D8B8C8D8A8C8D8A8B8C8A8B8C8A8B8C8A8B8C898A8B898A8C898A8B898A8C88898B88898A 88898B87888987888987888A87888987888A87878987878987878987878931353B353A41383E45 383E45383E45383E45393E46383D45393E45393E45353A412F33394E535A4F535A4F535A4E535A 4E535A4E52594E52594E52594E52594D52584D52584D52584D52584D52584D52584D51584D5258 4C50574C50574D51584C50574D51584C50574C50574C50574C50574C50574C50564C50564B5056 4B50564B4F564A4F554A4F554A4F554B4F562E323831363C353A411C242B1C242B1C242C0E1013 050202060606030202101010B4B3B0FBF8F3F1EEEBF3EFEBF6F3EEC6C6C3959692A3A09C92908C 8B8A847D7E77757772646763212023141517121316151317100D10181B1A3B453F747C7D5C5F60 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 0000000000000000000000000000000000000000000D0D0D898A8C7376787578793B3D3E151816 232624171A1A4E4C4D84807F8B8685948D8C9A95939F9A989F9A979D9895CAC5C1EBE6E1EBE7E3 ECE8E4EDE8E5F6F2EE908C8A030202060606060606050303090A0A1B22291D252C1C242B343940 32373E2C31364A4E554A4F554A4F554A4F554B4F564A4F554A4F554B4F564A4F554C50564C5056 4B4F564C50564B4F564B4F564C50574C50574C50574C50574C50574C50574C50574C50574C5057 4D51584D51584D51584D52584D52584D52584D52584E52594E53594E535A4E535A4E525931353B 353A41383D45383D45393E45383E45393E46393E46383E45393E46363B422F343A848586878788 87878886878887878886878887888987888988898A87888988898A88888A88898A88888A89898B 89898B8A8A8C8A8A8C8A8A8C8A8A8C8A8A8C8A8B8D8A8B8D8A8B8D8A8B8D8A8B8D33383E383D45 3B41493C424A393E4631373D8B8C8D8E8E908E8E908D8E908F8F918E8F918E8F918F8F918F9091 9090919090918F90919090918F9091909192909192909192909192909192909192919193919193 919193929294929294929294373C433B40483E444C3F454D3B4149343940929293949596939495 939495949596939596949697949596949697959697959697949597959697949597959698949597 959698959698959698959698959698959698959698959698969799959698393E453D424A40474E 41474F3D434B353B41969798979799979799969799979799969799969799979799969799979799 97979997989A979799969799969799969799969799969799969799969799969799969799969799 969799969799969799393E453D424A40474E41474F3D434B353B41949596969798969798959798 969798959798959798959697959798969798959697949597959697949597949597949597949597 939496939496939496939496939395939395939395939395939395383D443B40483E444C3F444D 3B414833393F919193919293919293919293919293919293909192919192909192919192919192 8F90919090918F90918F90918F90918E8F918E8F918E8F918E8F918E8F918D8E908D8E908C8D8F 8C8D8F8C8D8F33383F393E453B41493C4149383E4531373D898A8B8B8C8D8B8C8D8A8C8D8B8C8D 8A8B8C8A8B8C8A8B8C898A8B898A8B898A8B89898B88898A88888A88888A88888A878789878789 87878986878887878986878886878885868785868785868731353C353A41383E45393E46383E45 383E45393E45383E45393E45393E45353A412F33394E52594E535A4E52594D52584E52594D5258 4D52584D52584D52584D52584D52584C50574D51584C50574C50574C50574C50574C50574C5057 4C50574C50574B4F564B4F564B4F564B4F564B4F564A4F554A4F554A4F554A4F554A4F554A4F55 4A4F554A4F554A4F554A4E552E323831363C353A411C242B1C242B1C242C0E1013050202060606 020202101010B4B2AFFCF8F3F2EFEBF1EEE9F6F2EDC4C2C0939290A3A19C92918C8989847F7D79 7476726467611F1F21141318121217151418100D12181A1B38423E767D7F585B5C000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 0000000000000000000000000000000B0B0D87878A7072747477773B3D3C17181623252416191A 4E4C4D837E7D8A8684948E8D9C95949F9B999E99979D9796CEC9C6EEE9E4ECE7E4EDEAE6EFECE8 F6F2EE908C8A020202060606060606050303090A0A1B22291D252C1C242B34394032363D2C3036 494E55494E54494E54494E544A4E554A4E554A4E554A4E554A4E554A4E554A4E554B4F564A4F55 4B4F564C50574B50574C50574B50574B50574C50574B50574C50574C50574B50574D51584B5057 4C51584C50574C51584C50574D51584D51584D51584D52584D52584E525931353B353940383D45 383D45383D45383D45383E45383E45383E45383E45363B422F343A848586858687858687858687 86878886878887878986878887878987878987878988888A88888A88888A89898B88888A89898B 89898B89898B8A8A8C8A8A8C8A8A8C8A8A8C8A8B8D8A8B8D8A8B8D33373D373D433B41493B4149 393E4631363D8B8C8E8C8D8E8C8D8E8C8D8E8D8E8F8D8E8F8D8E8F8E8F908E8F908E8F908E8F90 8F90918F90918F90918F9091909192909192909192909192909192919193909192919193919193 919193919193373C433A3F473E444C3E444C3B4148343940929294939394939394939394939394 939495939495939495939495939495939495939496939495949597949597949597949597949597 949597949597959698959698959698959698959698959698393E443C424940464E40464E3C424A 353A41959698959697969798959697969798959697969798969798959697969798959697969799 959697969799969799959698959698959698969799959698959698959698959698959698959698 959698393D443C414940464E40464E3C424A353B41949597959697949596959697959697949596 949596949596949596949596949596949597939495939496939496939496939496939496939496 939395939395939395939395939395939395929294383D433A40473E444C3E444C3B404833383F 9090929191939191939191939091929091929091929091928F90918F90918F90918F90918F9091 8E8F918E8F918E8F918E8F918D8E908D8E908D8E908D8E908D8E908D8E908C8D8F8C8D8F8C8D8F 33373E383D443B41493B4149383E4531363C898A8C8A8A8B8A8B8C8A8A8B8A8A8B8A8A8B8A8A8B 89898A89898A89898A89898A88888A88888A88888A878789878789878789878789868788868788 86878886878886878886878885868785868731353B353A40383E45383E45383E45383D45383D45 383D45383D45383D443539412E32394D52594D51584D51584D51584D51584D51584C50574C5057 4C50574C50574C50574C50574B50574C50574C50574B50574C50574B50574B50574C50574B5057 4B4F564B4F564A4F564A4F554A4F564A4F554A4E554A4F554A4E554A4E55494E54494E54494E54 494E544A4E552E323831363C3439401C242B1C242B1C242C0E1013050202060606030202101010 B5B3B1FCF8F4F1EEE9F1EEE9F4F2ECC3C2C092918EA4A29B92918E8A8A857F7F7A757672646762 1E1E201413181312171314180F0D101A191B38413E777E7F5B5D60000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 0000000000000000000D0D0D8284876E73747679793D3E3D161918242626181A1A4D4D4D827D7D 8B8583948E8D9B95949F9A989E9A969E9795D1CAC6EEE9E5EBE8E4EDEAE6EFECE9F6F2F08F8B8A 030202060606060606050303090A0A1B22291D252C1C242B34394032363D2B3036494E54494D54 494D54494E54494D54494E544A4E55494E544A4E55494E54494E544A4F554A4E554A4F554A4F55 4A4F554A4F56383B402C2F3334383C4A4E554B4F564B4F564B4F574B4F564B4F574B4F574C5057 4B50574C50574C50574C51574D51584C51574C51574D525831353B34393F383D45383D45383D45 383D45383E45383D45383D44383E453539412E3339838485848587848587858687858688868788 86878886878986878886878986878986878987888A87888A87888A87888A88898A88898A88898A 88898A88898A898A8B898A8B898A8B8A8A8C8A8A8C33373D373C433B41493B4149383D4531363D 8A8B8C8C8C8E8C8C8E8C8D8E8C8C8E8D8E8F8D8E8F8D8D8F8D8E8F8D8D8F8D8E908D8F908D8E90 8D8F908E90918E8F918E90918E8F918E8F918F90928F90928F90928F90929091938F9092909193 373B423A3F473D434B3E444C3A3F4833383F919193919294929394929294929394939394939394 9393959394959393959393959293948E8E90898B8C939495939395939495949496949496949496 949496949496949496949496949496949496383D443C414940464E3F454D3C414A353A41959697 959597959597959697959597959697959697959597959697959597959597959697959597959697 959697959597959697959597959597959597959597959597959597959597959597949496383D44 3B41483F444D3F454D3B4149343940939495949496949496949596949496949596949596939395 939495939395939395939495939395939495939495939395929394929394929394929394929394 919294929394919294919294919294373C433A3F473E434C3E434C3B404833383F909092909193 9091939091928F90929091928F90918E8F918F90918E8F918E8F918D8F908D8E908D8F908D8F90 8D8D8F8D8E8F8D8D8F8D8D8F8D8D8F8D8D8F8C8C8E8C8C8E8C8C8E8B8B8D8B8B8D33373E383D44 3A40483B4048373C4430353C898A8B898A8B898A8B8A8A8B88898A89898A89898A88898A89898A 87888A87888A87888A87888A868789868789868789868789858688858688858688858688848587 84858784858784858784848630343B353940383E45383D45383D45383D45383D45383D45383D44 383D443539412E32394D51584C51574C51574D51584C51574C50574C50574B50574C50574B4F56 4B4F564B50574A4E5541454B3C40453C3F443C3F453C3F443C3F443C3F443B3E443B3E443B3E44 3B3E443B3E433B3E443B3E443B3E443D4046484C524A4E55494D54494E54494D54494D54494E54 2E323831363C3439401C242B1C242B1C242C0E1013050202060606020202101010B6B4B1FAF7F2 F1EEE9F3EFECF5F3EDC7C4C293918EA3A19993908E8B89867E7F797375726365621D1E1F141419 1313171313150F0D101B1C1D37423D777E80616064000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 0000000B0D0D848689707474777A7B3D3E3E171919232726171A1A4D4C4D827D7D8A8584948E8D 9B96949F9A979E99969E9895D1CBC8EDE9E3EBE7E3EEEAE7EFECE8F7F3F08F8B8A020202060606 060606050303090A0A1B22291D252C1C242B34394031363D2B2F35484D54494D54494D54484D54 494D54484D54494D54494E54494D54494E54494E54494D54494E55494E55494E55494E55373A3F 595A5B7676785F606235393D4A4F554B4F564A4F564B4F564A4F564A4F564B50574B4F574B5057 4B50574B51574B51574B51574B51574C505830343B343940373C43373C43373D44373D44373D44 373D44383E45383D44353A422F33398383848484868485878485878485878586886B6B6D171818 15161615161615161615161615161615161615161615161615161615161626262787888988898A 88898A88898A898A8B898A8B898A8B33373D373C433A40483B4048383D4531353C8A8A8C8B8B8D 8C8C8E8C8C8E8C8C8E8C8C8E7B7C7D1A1A1B1617171617173030318C8D8E8D8D8F8D8E8F8D8E8F 89898B2223231617171617172B2B2C8C8D8F8F90928F90928F90918F90928F9091363A42393E46 3E434C3D434B3B404833383F8F9091919294919294919294919294919294919294929394929394 8384853737391717170101010000001111112E2E2E515252919293939395939395939395939395 949496939395949496949496383D443B41483F444D3F454D3B4149343940949496949496949496 949496949496949496696A6B191A1A171818171818808182939496949496939496939496959597 7F8082191A1A171818171818767678949496949496949496949496949496383C443B40483F454D 3F444D3C4149343A41929294939395939395939395939395939395737374191A1A171818171818 1718181718181718181718181C1C1C3434344E4E4F878789919294919294919294919294919294 919293919294909192373B423A3F473D434B3E434C3A3F4732373E8E8F908F90928F90928E8F91 8F90928E8F913B3B3C1718181617171D1D1E8586888D8E8F8D8D8F8C8D8E8C8D8E8D8D8F1F1F1F 16171716171778797A8C8C8E8C8C8E8C8C8E8B8B8D8B8B8D8B8B8D32373E373C433B40483A4048 383D4531353C88898A898A8B898A8B898A8B8686881718181516161516161516161516164A4A4B 8687888687898687888687888586882020201516161516161516161D1D1E848587848587848485 84848684848530343B353940383D44383D45373D44373D44373C43373D44373C43373C43343940 2D32384B50574C51574C51574B50574B50574B4F574B4F574A4F564A4F564A4F564A4F56494E55 3F4348616466767778777879777879767778767778767778767778767778767778767778757678 7576787576787576786A6C6D43474C484D54484D54484D54484D54484D54484D542D323831363B 3439401C242B1C242B1C242C0E1013050202060606020202101010B6B4B2FBF7F3F1EEEAF3EFEB F6F3EEC7C4C293908EA3A19B93918D8B8A857C7F797377716367631D1D20121217121316131316 0F0D101A1C1C353F3B767E7F5D5F60000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000B0B0B 8586887476767577783B3D3E16181724252517191A4E4B4D817C7C898483948E8E9A96959E9A97 9E9996A09995CFCAC6EEEAE6EFEBE7F1EEEAEFECE9F4F1EE908E8C020202060606060606050303 090A0A1B22291D252C1C242B34394031363D2B3035474B51474B52474B52474C53474C53474C53 484C53484C53484C53484C53484C53484D53484C53484D54484D5436393E5A5B5C8A8B8B8B8B8B 8C8C8C606163373A3F494D54494E54494E55494E55494E55494E544A4F564A4E554A4E554A4F56 4A4F564A4F564A4F564A4F5630343A33383F373D43373D43373C43373D44373D44373D44373D45 373D44353A422E3339818384838485838485838486848486838486676768020202000000000000 000000000000000000000000000000000000000000000000141414848586878789878889878889 87888A88898A88898B32363D373C433A3F473A4048373C4430353C898A8B8A8B8D8A8B8D8A8B8C 8A8B8D8A8C8D8C8D8E4242420101010000000000006263648B8D8E8D8D8F8C8D8E4B4B4C010101 0000000000007171718E8E908D8E908D8E908E8E908E8F918F8F91363A42393E463D434B3D424B 3A404832383F8E8F909090929090928F90919091939091929091929091925D5E5F0A0A0A000000 00000000000000000000000000000000000029292987888A929394929395929394929394929395 929394929395373C433A40473E444C3F444D3B4049333940929394939496939496929394929395 9294958C8D8E040404000000000000565757929395929495939496939496939496545456020202 0000000D0D0D949596929495929394939496929394939496373C433A40473E454D3E444C3B4149 3339409192939293959293959293949192949192936D6D6E020202000000000000000000000000 0000000000000000000000000000001111127474769091929090928F90918F90919090928F9091 909092363B42393E463D424B3D424B3A3F4732373E8C8D8F8E8E908E8E908D8E908E8E908D8E90 2C2C2D0101010000000000004041418D8D8F8B8D8E8C8D8E8C8D8E8B8C8D0A0A0A000000000000 7475768A8B8D8A8B8C8A8B8C8A8B8D8A8B8C898A8C32363D373C433A40483A3F47373C4430353C 87888987888A87888A878889858587020202000000000000000000000000232323858587858687 868688858587747475020202000000000000000000090909838486838486838485828485838485 30343B343940373D44373D44373C43373C43373C43373C43373C43373C433439402D32384A4F56 4A4F564A4F564A4E564A4F564A4E564A4E56494E54494E55494E54494D543D42477273748C8C8C 8C8C8C8C8C8C8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A 8A8A8A8A8A8A707173474C52474C53474C52474B52474C53474B522D313831353B3439401C242B 1C242B1C242C0E1013050202060606020202101010B6B4B1FCF8F2F1EFEAF2EEEAF6F3EDCBC8C5 94918EA19F9992908E8C8A867D80797477716668641B1C1F1012151212151212150F0D101B1E1D 39423D7F87865B5F5F000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 0000000000000000000000000000000000000000000000000000000000000B0B0D808285717374 7275773B3D3E1619192325251719194D4C4C817D7C888382948F8F9B96959E97969E99979C9692 D0CAC6F2EFECF0EDEAF1EEE9EFEBE8F5F1EE908E8D020202060606060606050303090A0A1B2229 1D252C1C242B34394031363D2B2F35464A51464B51474C52474C52474C52474C52474C52474C52 474C52474C53474C53474C53474C53474C5335383D58595A89898A8B8B8B8282838B8B8B8B8B8B 58595B393D42494D54494E54494E54494E54494D54494E54494E54494E54494E55494E54494E55 4A4E564A4F562F343A33383F363C43363C43373C43363C43373C43373D44373D43373D44343940 2E3338818284828485828485828485828485838486686869050505040404040404040404040404 04040404040402020200000000000000000015151584858687878987888987888987888A878889 88898B32363D363B42393F473A4048363C4430353C88888A8A8B8C898A8B8A8B8D8A8B8C8A8B8D 8A8B8D8B8B8C12121200000000000019191A88898B8B8C8E7F80810A0A0A000000000000393939 9091918C8D8F8C8D8F8D8E908D8E908D8E908D8E90363A41393E463C424A3D424B393F4632373D 8E8F908F90918F90918F90928F90918F90928F9092717273030303000000000000000000161616 2828280F0F0F000000000000010101171717868889919193919293919293919294919293929395 373C433A40473E444C3E444C3A4049333940929294929394929394929395929394929395929395 3030300000000000002D2D2D9191939293949292949292949292942B2B2B0101010000003F3F40 929294929394929394929395929394929395373C433A40473D444B3E444C3A404733393F909092 9192939192939192949192939192946D6D6E0202020000000101010D0D0D0D0D0D0D0D0D080808 0000000000000000000000002626278E8F908F90918F90918F90918F90928E8F918E8F91363A42 393E463C424A3D424B393E4632373E8C8D8F8D8E908D8E908C8D8F8C8D8F8C8D8F2D2D2D010101 000000000000040404797A7B8B8D8E8A8B8D8A8B8D8A8B8D0A0A0A0000000000007474758A8A8C 8A8B8C8A8B8C898A8C898A8B898A8C32363D363B42393F473A3F47363C4330343A868688878889 87888987888A838485020202000000000000010101000000050505818183848587848587848587 5556570202020101010000000000000909098082838284858284858284858284852F333A34393F 373D44373C43373D44363C43363C43363C43363C42363C423438402D32374A4E56494E55494E55 4A4E55494E554A4E554A4E55494E54494E54484D543D41476E70728C8C8C8C8C8C8C8C8C8B8B8B 8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A898989 7D7E7E474B51474B52474B51464A51464A51474B512D313831353B3439401C242B1C242B1C242C 0E1013050202060606020202101010B5B4B2FBF8F3F3EFEBF2EFE9F4F1EBC8C5C394908CA2A09B 92908D8A89867D807A727671676A651D1D1F1010141313171313160F0F10191A1B39413D798281 5B5D5F000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 0000000000000000000000000000000000000000000000000D0D0D8485897276777275763C3D3E 16181923252516191A4D4D4D837E7E898383948F8F9B96949E97969D98969D9895CFCAC6EFEBE8 F0EDE8F2EEE9EFECE9F6F3EF908E8C020202060606060606050303090A0A1B22291D252C1C242B 33393F31363C2B2F34464A51464A51464A51464A51464A51464A51464A51464A51464A51474B52 464A51474C52474B5235393E58595A8A8A8A8B8B8B747678494E557375778C8C8C8C8C8C515354 3B3F44484C53484D54484D54484D54484D54484D54494D54494E54494D54494E54494E54494D54 2F343A33383F363C42363C43373C43363C43373C43373C43373D43373D443439402E3238818183 818283828384828385828384838486868789929292929292939393929292939393939393939393 2F2F2F01010100000000000063636385878886878885878885878887878986878987878931363C 363B42393F47393F47363C4330353B87888988898A88898A88898B898A8B898A8C898A8C8A8A8C 6868680000000000000000005354558A8B8D3838390101010000000C0C0C8788898C8D8E8C8D8F 8C8D8E8C8D8E8C8D8F8C8D8E8D8E90363A41393E453C42493D424B393E4632373D8C8D8F8D8F90 8D8F908D8F918D8F908D8F918C8E901B1B1C0101010000000C0C0C7A7A7A9E9E9E9C9C9D9E9E9E 5E5E5E0202020000000000004445458F8F91909193909193919193909193919193363B42393F47 3D444B3D434B3A404733383F919293909193909193909193919293909193919294636363020202 0000000505058A8B8D9192939292949191938A8B8C050505000000000000737374919193909193 909193919193909193919193373B433A3F473D444B3E444C3A404733383F8F9092909193909193 9091939091938F90926C6D6E0202020000001111119D9D9E9F9FA09F9FA0A0A0A0969696606060 0202020000000101018384858E8F918D8F908D8F908E8F918D8F908E8F91353A41383D463C4249 3C4149393E4632373D8B8B8D8C8E8F8C8D8E8C8D8F8C8D8E8C8D8F2C2C2C010101000000000000 0000002E2E2E89898B8A8B8D8A8B8D8A8A8C0A0A0A0000000000007374758A8A8C88898A88898A 89898B87888A89898B32363D363B42393F473A3F47363B4330343A858688868789858788858788 8284850202020000000000001E1E1E00000000000069696A848486848587848587383839010101 1818180101010000000909098081828283848283858182838282842F333A33383F373D43363C43 363C43363C43373C43363C42373C43373C4333383F2D3238494E55494D54494D54494D54494D54 484D54484D54484D54484C533D40466C6D6F8B8B8B8C8C8C8C8C8C8C8C8C8C8C8C7E7F81616368 8989898B8B8B8A8A8A8A8A8A8888886164687C7D7E8989898A8A8A8989898989897D7E7E464A51 464B51464A51464A51464A51464A512D313730353B33383F1C242B1C242B1C242C0E1013050202 060606020202101010B6B4B2FCF9F3F3F1ECF2EFEBF5F3EDC7C4C192908CA2A09B92918D898885 7F807C737773676A671E1D201010141314161314140D0F1019191B393F3D767F7F5C6061000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 0000000000000000000000000000000000000D0D0D858789727578787B7B3E4040161819222526 181A1B4F4E4F857F808B8486948F8F9A95939D98969C97969F9996CECAC5EEEBE7EEEBE6EFEDE8 F0EDE9F9F6F2908E8D020202060606060606050303090A0A1B22291D252C1C242B33383F31363D 2B2F35454A50454A50454A50454A50464A51464A51464A51464A51464A51464A51464A51464A51 35383E5657598A8A8A8A8A8A747678484D54474C52474C537678798C8C8C8B8B8B4B4D4E3C3F45 474C53474C53484C53484D53484C53484C53484D54484D54484D54484D54484D542F343A33373F 363B42363B42363B42363C43363C43363C43363C43363C433439402E3238808182818283828284 828384828284828384828384838385838485838385838385848486848486434445010101000000 00000046464688898A85858785868785868885868885878885868886878931363D363B42393E46 393F47363C4330343B86878988898A88898A88898A88898A88898A88898A898A8B8E8F902F2F2F 0101010000000F0F0F6B6B6D0101010000000000006262628C8D8E8B8B8D8B8C8D8B8B8D8B8B8D 8C8D8E8C8C8E8C8D8E353A40383D453C41493C4149393E4632363D8B8D8E8D8E908C8D8F8D8F90 8D8E908D8F9058595A0000000000000000007272729293948E8F918E8F918E8F91959697333333 0000000000001212128D8E908F90928F90928F90928F90928F9092363B43393F463D434B3D434B 3A3F4733383F8F90929091939091939091939091939091939091938D8D8E060606000000000000 666768909193909193909193646566020202000000101010919192909193909193909193909193 9091938F9092363B42393E463D434B3D434B3A3F4733373E8E8F918F90928F90928F90928F9092 8F90926B6D6D0202020000001010108C8D8F8E8F918E8F918E8F918F9091959596080809000000 0000007272748D8F908D8E908D8E908D8F908C8D8F8C8E8F353A41383E453C41493C424A383E45 31363D8B8C8D8C8C8E8B8B8D8B8C8D8B8B8D8B8C8D2C2C2C010101000000020202000000000000 676769898A8B898A8B898A8B0A0A0A00000000000072737488898A88898A87888A87888A87888A 87888A31363C363B42393E46393E46363B432F333A858688858688858688858788828284020202 0000000000004444440000000000004B4B4B8383858383858383851A1A1A010101363636010101 0000000909098080828282848182838182838182832F333A33383F363C43363C43363C43363B42 363C43363B42363C42363C4233383F2D3137484D54484D54484D54484D54484D53484D53484D53 484C533C4046696B6D8C8C8C8C8C8C8B8B8B8C8C8C8B8B8B7F7F81494C52474C525B5F63888888 8A8A8A8888895D6064464B514649507A7B7B8989898989898989897D7E7E464A51454A50454950 454A50454A50454A502D313730343B33383F1C242B1C242B1C242C0E1013050202060606020202 101010B6B5B2FCF9F4F3F1ECF3F0ECF7F3EDC7C5C292908BA2A09992928D8A898581807E767975 676B661D1D1F1210161414171314150F10101A1B1B383E3C757E7D575B5B000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 0000000000000000000000000D0D0D89888C70727577797A3E3F3F161717222626161A1B4E4C4D 8680808C8787948F8E9A95939C96959D98969E9996D0CCC8F0EDE9EDEAE6EEEAE6F0EDEAFAF7F3 8F8E8B020202060606060606050303090A0A1B22291D252C1C242B33383F30353C2B2F34454950 454950454950454950464A51454950454950454A50454950454A50464A5135383E565759898989 8A8A8A747577484C53464A52464A52464B52484D53787B7C8C8C8C8A8A8A4345483D4147474B53 474C53474B53474C53474C53474B53474C53484C53484C53484C532E333932373E363B42363B42 363B42363B42363B42363C43363C43363C433439402D31387F8182818283818283808183828284 8182848182848182848182848283858283858383855D5E5F0202020000000000002B2B2B8A8A8A 84858685858784858685868885868885858785868885858730353C353A42393E46393E46363B43 30343B86878887888A87888A87888A88898A87888A87888A87898A87888A838383080808000000 0000000606070000000000002B2B2B8E8F90898A8C8B8B8D8A8B8D8B8B8D8B8B8D8A8B8D8B8B8D 8B8C8D353A3F383D453B41493B4149393E4632363D8B8C8D8C8D8F8C8D8F8C8C8E8C8D8F8D8D8F 3C3C3D0000000000001E1E1E8F90928D8E908D8E908D8E908E8F918E8F90838384595959595959 5858588B8C8D8E8F918E8F918E8E908F90928F8F91353B42383E463D434B3C434B3A3F4733373E 8F90918F90928F90928F8F918F90928F8F918F8F918F90923232320101010000003F3F408E8F91 9091938F90923C3D3D0101010000004343438E8F918F90918F90928F90928F8F918F90928F8F91 363B42393E463D434B3D434B3A3F4732373E8E8F908F90928E8F918E8E908E8F918E8E906B6B6D 0202020000001010108B8C8E8D8E908E8F918D8E908D8E906565660202020000001111118F8F90 8C8D8E8C8D8F8C8D8F8C8C8E8C8D8F8C8C8E343A40373D453B41493B4149383E4531363D898A8C 8B8B8D8B8B8D8A8B8D8B8B8D8A8B8D2C2C2C0101010000003F3F3F0202020000001B1B1B878789 898A8B888A8B0A0A0A00000000000072737487898A88898A87888A87878986878987878931363C 363A42393E46393E46363B432F333A848586858688858688848586828284020202000000000000 6666670000000000002D2D2E8182848383857B7B7D020202000000535353020202000000090909 8080828182838081838182838080822E333A32383F363C43363C43363C43363C43363B42363B42 363B42363B4233383F2D3137484C53484D54484D54474B53484C53474B53474B533C404667696B 8B8C8C8C8C8C8C8C8C8C8C8C8B8B8B8B8B8B89898950535640444A464A525A5D638787875D6065 464A5140444B4A4D518686868989898989898989897C7D7D454950454950454950454950454950 44484F2D313730343B33383F1C242B1C242B1C242C0E1013050202060606020202101010B7B5B3 FCF9F4F3F0EDF3EFEBF6F3EDC7C4C2918E8BA19F9892908C8888837D80797677746669661D1D20 121016121315141416100D121A1B1B39413E757D7E595C5F000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 0000000000000B0B0B8484867072737575773D3E3E151617232426171A1B4F4D4E85807E8D8888 958F8F9A96939C96949E97969F9A97D2CECAF3F0ECEDE9E6EEEAE6EFECE9F9F6F391908E020202 060606060606050303090A0A1B22291D252C1C242B33373E30353B2A2E3443484F43484F43484F 43484F43484F43484F43484F43484F44484F44495034373D5455578989898A8A8A737476474B51 444950454A50454A50464A51454A50494D547B7D7E8B8B8B8889893F41443E4248454A51454A51 464A52464A52464B52464A52464B52464B52474B532E333932363E353B42363B42363B42363B42 363B42363B42363B42363B4233383F2D31377E7F81808082808082808183808082818284818284 8182848182848182848283846F6F70090909000000000000141414858586828485828485848586 83858684858684858683858684858684858730353B353A41393E46393E46363B4330343A848587 86878886878886878986878886878986878987888A87888A898A8B545454020202000000000000 000000060606818181898A8C898A8C898A8C898A8C898A8C898A8C898A8C8A8B8D898B8D34393F 373C443B40483B4048383D4531353C898B8C8A8B8D8B8C8E8B8C8E8B8C8E8B8C8E272727000000 0000004141418C8C8E8C8D8F8D8D8F8C8D8F8C8D8F8C8D8F8F8F919495969495969596968D8E90 8E8E908E8E908D8E908E8E908D8E90353B41383E453D424A3C424A393F4732373E8E8F918E8F90 8D8E908E8F918D8E908E8F918E8F918F8F916465650202020000001616168D8D8F8E8F908E8F90 1111110101010000007474768F8F918D8E908F8F918E8E908E8F918F8F918D8E90353A41383D45 3C424A3C424A393E4632363D8C8D8F8D8E908D8E908D8E908D8E908D8E906A6B6C020202000000 06060638383938393A39393A3838382222220505050000000000004E4E4E8B8B8D8B8C8E8C8C8E 8B8C8D8B8C8E8B8C8D8A8C8D343A3F373D443B41493B4148383D4531353C888A8C898A8C89898B 898A8C89898B898A8C2C2C2C01010100000059595A3C3C3C00000000000053535486868887888A 0A0A0A00000000000072727386878987878987878985868886868885868830353B353941393E46 383D45353A422F33398384868485878485878385868081830202020000000000007B7C7E0B0B0B 0000000D0D0E8081828282845D5D5F0202020202026C6D6E0202020000000909097E7F81808183 7F80828081837F80822E333932383E363C43363B42363B42363B42363B42363B42353A41353A41 32383E2C3036464B52464A52464A52464A52464A52454A513C40466465688B8B8C8C8C8C8C8C8C 8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8888884E50543F43494549504B4F5545495040444B4A4D50 8585858989898989898989898989897C7C7D43484F43484F43484F43484F43484E44484F2C3036 2F343A33373E1C242B1C242B1C242C0E1013050202060606020202101010B8B6B4FDF9F4F4F0EC F2EFEAF5F2EBC8C5C3918E8BA09E9893908D8889837D7F787578736669651D1D1F121315101313 131416100F1318191B38413D717B7A595C5D000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 0B0B0B818285717577777A7B3F403F15181822242616191B4E4C4D85807E8C8887948F8F9B9595 9B95949D98959F9A98D2CDCAF4F0ECEDE9E6EDEAE6EFECE8F9F6F391908F020202060606060606 050303090A0A1B22291D252C1C242B33373E30353B2A2E3443474E43484F43484F43484F43484F 43484F43484F43484F43484F33363B535456888888898989737577454A5144484F44495044484F 44484F44495044484F4449504A4E547E7F818C8C8C8686863A3D3F3F4349454A51454950454A51 454A52454A51454A52454A52464A522E333932373E353A41353A41363B42363B42363B42363B42 363B42363B4233383F2D31377E7F807F8081808082808183808082808183808183818183818284 8181837A7B7D151515010101000000060606757576838485828385828385828385828385838486 83848683848683848684858730353B353941383D45383D45353A422F333A848586858687858687 8687898687888687898687898687888687898787898D8D8E1E1E1E0101010000000000004E4E4E 89898B88888A88888A89898B89898B89898B89898B89898B89898B898A8C34393E373C443A4048 3A4048383D4531353C898A8C8A8B8D8A8B8D8A8C8D8A8B8D8B8C8E101010000000000000505050 8A8B8D8B8C8E8C8D8F8B8C8E8C8D8F8B8C8E8C8D8F8C8D8F8C8D8F8C8D8F8C8D8F8C8D8F8C8D8F 8C8D8F8D8E908D8E90353A41383D453C424A3C424A393E4632363D8D8E908D8E908D8E908D8E90 8D8E908D8E908D8E908D8E908C8C8D07070700000000000078787A8D8E90767678000000000000 1313138E8F908D8E908D8E908D8E908D8E908D8E908D8E908D8E90353A41383D453C424A3C4149 393E4632363D8B8C8E8C8D8F8C8D8F8C8D8F8C8D8F8C8D8F6A6B6C020202000000000000000000 0000000000000000000000000000000000003232329495958A8B8D8A8B8D8A8B8D8A8B8D8A8B8D 8A8B8D8A8B8D34393F373C443A40483A4048373D4431353C88888A89898B89898B898A8C89898B 898A8C2C2C2C0101010000005757588585850707070000000D0D0D7E7F818787890A0A0A000000 00000071717386878885868785868785868785868785868730353B353941383D45383D45353A42 2F3339828385838486838486838586808082020202000000000000797A7C313131010101000000 6F6F718181834040410101011E1E1E6E6E700202020000000909097E7E808080828080827F8081 7F80812E323932373E363B42363B42363B42353A41353A41353A41353A41353A4132383F2C3036 454A51454A52454A52454A52454A52454A516365688B8B8B8C8C8C8C8C8C8B8B8B8B8B8B8B8B8B 8B8B8B8B8B8B8B8B8B8A8A8A87878754575B44484F44484F44484F51555A858585898989898989 8989898888888989897C7C7D43474E43484F43474E43484F42474E42474E2C30362F343A33373E 1C242B1C242B1C242C0E1013050202060606020202101010B7B5B3FCFAF5F4F1EDF3F0EBF6F3ED CBC6C5928F8CA2A09993918D8988857F7F7B7779756469651C1C1E101014121316131317100F13 181919373F3B7078785D6060000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF0000000000000000000000000000000000000000000000000000000000000B0B0D808386 6E7273777A7A3F4040171918242626181B1C4E4D4D86817F8E8A889691909A97959B96969C9895 A09A98D0CBC7F0ECE8EFECE8F0EDEAF1EEEAF9F6F2908E8B020202060606060606050303090A0A 1B22291D252C1C242B32373E30353B2A2E3442464D42474E42474E42474E42474E42474E42474E 42474E3C404652535588888889898973757745495043474E43484F43484F43484F43484F43484F 43484F44484F44484F4C50568282838B8B8B84848437393D44484F444950444950454950454A51 454950454950454A512E323831363E353A41353A41353A41353A41363B42363B42353B41363B42 32383E2C31367D7E807F80817F80817F80828080827F80827F80828081827F80828080822B2B2B 000000000000000000606060848586818283818284818284828385828385838486828385838486 83848683848630343B353941383D45383D45353A422F3339838385858687858687858687858687 8586878586878586888587888586888081821414140101010000000000002A2B2B86878987888A 87888A87888A87888A87888A88898B89898B88898B89898B33383E373C443A40473A4048373D44 30353B88888A898A8C8A8B8D8A8B8D8A8B8D8A8B8D06060600000000000055555789898B8B8B8D 8B8B8D8B8B8D8B8B8D8B8C8E8B8B8D8B8C8E8B8C8E8B8C8E8B8C8E8C8D8F8C8D8F8C8D8F8C8D8F 8C8D8F353A41383D453C41493C4149383E4632363D8C8C8E8C8D8F8D8E908C8D8F8C8D8F8C8E90 8C8E908C8C8E8C8D8F3434340000000000005152528B8C8E4E4E4F0000000000004646468B8C8E 8C8D8F8C8E908C8E908C8D8F8C8D8F8C8D8F8C8D8F353A41383D453B41493C4149383E4531363C 8B8B8D8C8D8F8C8D8F8C8D8F8C8D8F8B8C8E69696B020202000000000000000000000000000000 0000000000000000000000000000003535368486888A8B8D8A8B8D898A8C8A8B8D898A8C898A8C 34393E373C443A3F473A4048373C4430353B87888989898B89898B88898B88888A87888A2C2C2C 0101010000005656578787895151510202020000003F3F408486870A0A0A000000000000707072 85878885868785868785868785868784858730353B353941383D45383D45343A412E3238828284 83848683848682838580808202020200000000000077797A565656020202000000525253808182 2323230101013C3C3C6D6D6E0202020000000909097C7E7F7F80827F80817E80817F80812E3238 32373E363B42363B42363B42353A41353A41353A41353A41343A4032373E2B3035454950454A51 454A514449504449504549507475788C8C8C8C8C8C8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8A8A8A 8A8A8A8A8A8A8888895A5D6243474E42464D43474E575A5F878787898989898989888888898989 8888887C7C7D42474E42474E42474E42474E42474E42474E2C30362F333A33373E1C242B1C242B 1C242C0E1013050202060606020202101010B7B5B4FDFBF6F3F1ECF3F0ECF6F3EECBC6C4928F8C A3A19C94918E8987857E7F7B787B76686C681D1D21101014121217141316100F1217191938403C 747B7B5B5F60000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 0000000000000000000000000000000000000000000000000000000B0B0D7E80826F7371787A7A 3E3E3F161717242526181B1C4E4E4D86817F8F89899792919B96959C98979D99969F9996CECAC6 F0ECE7EEEBE5F1EEEAF2EFEBFAF7F3908F8C020202060606060606050303090A0A1B22291D252C 1C242B32373E30353B2A2E3441464D41464D41464D42474E42464D42474E42474E42474E494D51 8888888989896A6B6C25282C2325292325292E313642474E43474E43474E43474E3D414827292D 23252923262A3335388181828B8B8B7E7E7F40454B43484F43484F444850444950444950444950 4449502E323931353D353A41353A41353A41353A41353A41353B42353A41353B4232373E2C3036 7D7E807E7F817E7F817E7F817E7F817E7F817F80827F80827F8082424344010101000000000000 434343858587808283818284808283808283818284818284818284818284828284818284838385 2F343A343840373D44383D45353A412E3339838385838486838486858587848587858587858587 8586878585878587883D3E3F010101000000000000000000000000595A5B86878986878987888A 87888A87888A87888A88898A87888A88898A33383E363B43393F47393F47373C4430343B88888A 88898B88898B89898B898A8C8A8A8C1C1C1C000000000000444545898A8C8A8B8D8A8B8D8A8B8D 8A8B8D898A8C8B8C8E898A8C8A8B8D8A8B8D8A8B8D8A8B8D8A8B8D8B8B8D8B8C8E8B8B8D34393F 373C443B41493B4149383E4531363C8C8C8E8B8C8E8B8C8E8C8C8E8B8C8E8C8C8E8C8C8E8C8D8F 8C8C8E6565660000000000002A2B2B8B8C8E2626270000000000007676778B8C8E8B8C8E8B8C8E 8B8C8E8B8C8E8C8C8E8B8C8E8C8C8E343A40373D453B41493B4149373D4431353C8B8B8D8A8B8D 8A8B8D8B8B8D8A8B8D8B8B8D69696B0202020000001010109898989999999A9A9A999999888888 5C5C5C050505000000000000595A5C88898B88898B88898B89898B88898B89898B33383E363B43 393F47393F47363C4330353B86878987888A87888A87888A87888A87888A2C2C2C010101000000 5656578687888B8C8D1717170101010404047373740A0A0A000000000000707071848587848587 8384868484868384868484862F353B343941373C44373D45343A412E3238818183818284818284 8282847E808102020200000000000077787A7879790202020000003536367D7E80050505000000 595A5A6D6E6F0202020000000909097C7D7F7E7F817E7F817D7E807E7E802F333932363D353B41 353A41353A41353A41353A41353A41353A41353A4131363D2C3036444950444950444950444950 44484F4449504549507678798B8B8B8B8B8B8B8B8B8B8B8B8A8A8A8A8A8A8A8A8A8A8A8A888889 5A5D6243474E3E4249363A3F3D414842474E575A5F8787878888888989898888888888887C7C7D 41464D42464E41464D41464D41464D41464D2C30362F333A33373E1C242B1C242B1C242C0E1013 050202060606020202101010B7B5B3FCFAF5F4F1EDF3F0ECF6F3EDC9C5C391908DA2A19C93918D 8A88857F807D797C78696C671D1C1F141417121317141418100D12181A1B38413E747E7E555B59 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 0000000000000000000000000000000000000000000D0D0D8081827073727679793B3D3C171918 242726181B1A4A4A4984807E8E89889791919C97959F99989F9A989E9A97CFCBC6F1EDE8EBE7E3 EFEBE9F2EEECFBF7F5918F8E020202060606060606050303090A0A1B22291D252C1C242B32373E 2F343A292D3340454C40454C40454C40454C41464D40454C40454C41464D505459888888888888 848484828282828282828282606162383C4342474E42474E42474E383A3F7A7A7B848484848484 8484848888888B8B8B8B8B8B4B4F5543474F43474F43484F43474F43484F43484F43484F2D3238 31353D343940353A41343A41353A41343A41343A41353A41343A4132373E2C30367C7D7F7E7E81 7E7E817D7E807E7E817D7E807E7F817F7F815A5B5C020202000000000000282828878788808082 8081838080828081838081838081838081838081838182848182848182848283852F343A343840 373C44373C44343A412E3239828385838486838486828485848587828485838586848586838586 6C6C6D0303030000000000000D0D0D0000000000000D0D0E7C7C7F86868986868887878A878789 87878987888A87878987888A32383D353A42393E46393F47363C4330343B86888987888A87888A 87888A88898B88898B31313100000000000030303088898B898A8C898A8C898A8C898A8C898A8C 79797B535355535355555556898A8C898A8C8A8B8C8A8B8D8A8B8C8A8B8D34393F373C443A4048 3B4048373D4430353C8A8B8D8A8B8D8A8B8D898B8C8A8B8D898B8C898B8C8B8C8D898B8C898A8B 0606060000000505057C7D7F0404040000001616168C8C8E8A8B8D8A8B8C8A8B8D8A8B8C8A8B8C 8A8B8D8A8B8C8A8B8D33393F363C443B40483A4048373D4431353C898A8C8A8B8D8A8B8D898A8C 8A8B8D898A8C68696A02020200000010101087888A898A8C898A8C88898B8C8C8D909192343434 01010100000038383887888A88898B87888A87898A87888A87898A33383D363B43393F47393F47 363C432F343A86878987878A87878A8586888686898687892B2B2B010101000000565656858587 8585876767670202020000002D2D2E0A0A0A0000000000006F6F70848587838485838485838486 8384858283852E343A333840373C44373C44343A412D32388081838182848182848182847E7E80 0202020000000000007677798182841919190101011818186465660000000000007474756D6E6F 0202020000000909097C7C7E7E7E807D7E807D7E7F7D7E802F333932363D343A41353A41343A41 343A41353A41343A4134394034394031363D2B2F3543484F43484F43484F42474E43484F42474E 42474E454A517677798B8B8B8B8B8B8B8B8B8A8A8A8A8A8A8A8A8A8989895B5D6242474E3C4148 474A4E8282834A4D513C414741464D56585E8585868888888888888888887C7C7D41454D40454C 41454D40454C40454C40454B2C30362F333A32363D1C242B1C242B1C242C0E1013050202060606 020202101010B7B6B4FCF9F6F4F1EEF3F0EDF5F3EDC8C4C1928F8CA1A19D93908D8A8A867E807B 787B756569641A1A1D1513181212171313170D0D12191B1C3A423F717C7C545958000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 0000000000000000000000000000000B0D0D7E808170737476797A3B3D3C171917232526181B1C 47464685807F8F89889791909C97959F9A97A19C999F9B98CFCBC6EFECE5ECE8E4EBE9E4F1EEEA FAF7F4908F8D020202060606060606050303090A0A1B22291D252C1C242B32363D2E343A292D33 40444B40444B40444B40454B40444B40454C40454C40454C40454C6B6D70888888898989898989 8989898989898989894F525641454D41464D41464D6F70718A8A8A8A8A8A8A8A8A8B8B8B8B8B8B 8B8B8B7B7C7C45495042464E42474E42474E42474E42474E43484F42474E2D323831353D343940 343940343A41343940343A41343A41353A41343A4132373E2C30367B7D7E7C7E7F7D7E807D7E80 7D7E807D7E807D7E806C6D6E0909090000000000001313138081817F80827F80827F80827F8082 7F80828080838081838080838081838081838181838182848181832F333A343840373C44373C44 343A412E32388182848283858284858284858284858284858284858384868283851B1B1B010101 0000001818187D7D7D020202000000000000363638848587858688858688858688858688858687 86878986878832373D353A42393E46383E46363B4330343B86878987888A87888A87888A87888A 87888A49494900000000000002020275767888898B88888B88898B898A8C88888B323333000000 00000023232488888B898A8C898A8C89898B898A8C89898B33383E363B433B40483A4048373D44 31353C898B8C898B8C898B8C898B8C898B8C898B8C898B8C898A8C898B8C8A8B8D343434010101 00000035363601010100000049494988898B898A8C898B8C898A8C898B8C898B8C89898B898B8C 898A8C33393F363B433A40483A4048373D4430353B88898B898A8C898A8C898A8C898A8C898A8C 68696902020200000010101086868988898B89898C88898B88898B88888B343434010101000000 2B2B2B86868987888A87888A87878987888A86878833373D353A42393E46393E46363B432F343A 8586888687898586888586888586888586882B2B2B0101010000005555568485878485878A8B8C 2929290101010000000101010000000000006F6F70828385828485828485828284828385828284 2E343A333840373C44373C443439402D32388081838081838081838081837D7E80020202000000 0000007677787F80823E3E3E0101010000004041410000001010107F7F816D6D6F020202000000 0909097A7C7D7C7E7F7C7D7F7C7E7F7C7D7F2E323832363D353A41353A41353A41353A41343940 34394034394034394031363D2B2F3543474F42474E42474E42474E42474E42474E42474E42464E 45495077787A8B8B8B8A8A8A8A8A8A8A8A8A8A8A8A7D7D7F3B3E433C4047474A4E848485898989 858585494C503B3F46373A407778798888888888888888887B7B7C40444B40454B40444B40454B 40454B3F444B2C30362E333A31363D1C242B1C242B1C242C0E1013050202060606020202121010 B8B7B5FCF9F5F4F0EEF3EFECF5F2EECBC6C493908BA1A09A92918D8A88877E807C757973666864 1A1B1F1414191312161413150F0F10181C1C3A42406E7877595D5D000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 0000000000000000000B0B0B818386727677747779393B3B17191922252718191B45454685807F 908A899792909D97959F9A97A29D9AA29C99CEC8C5F0ECE7EDE9E5EDE9E5EDE9E5F7F4F091908F 020202060606060606050303090A0A1B22291D252C1C242B31363D2E343A292D333F444B3F444B 3F444B3F444B3F444B3F444B3F444B40444B3F444B40444B505459585B5F585B60585C60858585 89898950545740454C40454C41464D7172738A8A8A6D6E705A5D61595C615A5D615A5D61464A51 41464D41464D42474E42464E42474E42464E42464E42474E2D313730353C343940343940343940 343940343940343A41343940343A4131363D2B30367B7C7E7C7E7F7C7E7F7C7D7F7D7E807D7E80 7678791617170101010000000505057474747F80827E7F817F80827E7F807F80827F80817F8081 8080838080828080838080838080838080838181842E333933373F363B43363B433339402D3238 8081838283858283858283858284858283858283858283854A4A4B0000000000000000006B6B6C 868789414141010101000000000000666668848587858687858688858688858688858688858688 32373D343A42383D45383E46353B422F343A84868787888A87888A86878987888A868789838484 0707070000000000002323247E7F8187888A88888B88888B666768030303000000000000555556 88888A88888B89898C89898C89898C89898C33383E363B433A3F473A3F47363C4330353B88898B 898A8C898A8C88898B898A8C88898B898A8C88898B88898B898A8C636465020202000000000000 00000000000077777889898B89898B89898C89898B89898C89898C89898C89898C89898C33383E 363B433A3F473A4048363C4330353B87888A88898B898A8C87888A88898B87888A676868020202 00000010101085868888888B86878988888B88888B6E6E6F0B0B0B000000000000535353868688 87878A87878A86878986878986878932373C353A41383E46383E46353A422E3339838586858688 8586888486878485878485872B2B2B010101000000555556848587838486838486777778030303 0000000000000000000000006F6F708283858282858282858282858282858282852E343A333840 363B43363C443339402D32377E7F818081838081837F80827C7D7F020202000000000000767678 7E80816161610202020000000B0B0B0000002F2F2F7C7D7F6D6D6E0202020000000909097A7B7D 7C7D7F7C7D7F7C7D7F7C7C7E2E323831353C343940343940343940343940343940343940343940 34394031353C2A2F3442464E42474E42474E41464D42474E41464D41464D41464D41464D44484F 77787A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A7778794D4F53858585898989898989898989858585 4D4F527373758888888888888888888888887B7B7C3F444B3F444B3F444B3F444B3F444B3F444B 2B2F352E333931363D1C242B1C242B1C242C0E1013050202060606020202121010B9B7B5FCF9F6 F3F0ECF3EFEBF6F3EDCCC7C3928F8BA19F9993918D8B88867E7F7C7678726365611A171D131318 1213151313150D0D10191A1B39423E6F7A7A5B6061000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 0000000B0D0D7F8185727477777A7A3B3C3C171919252727171A1B4646468682808F8A88969190 9C96959F9A97A19C99A19996CFCAC6F1EEE8EFEBE6EDE9E5EFEBE6F7F4EF918F8E020202060606 060606050303090A0A1B22291D252C1C242B31363D2F343A292D333E434A3F444A3F444A3F444A 3F444A3F444A3F444A3F444B3F444B3F444B3F444B3F434B3F444B40444C828282898989505257 40444C3F444C40444C7172738A8A8A5D5F6241454D40444C40444C40454D41464D40454D41464D 41464D41464E41464D41464E41464E41454D2D313730343C343940343940343940343940343940 343940343940343A4131363D2B30357A7B7D7B7C7E7C7D7F7C7D7F7C7D7F7D7E80474949010101 0000000000000909091A1A1A19191A19191A19191A19191919191A1919192526267D7F807F8082 7F80827F80827F80827F80827F80822E323933373F363B43363B433339402D32377F8182818284 818284818284818284828385828385737476080808000000000000303030868889838386848485 0B0B0B00000000000017181881828483848684858784858784848684868784858732373D343A42 383D45383E46353A422F343A84858785878885878885878885878886878987888A4F4F4F010101 0000000000000F0F0F3738384646472F2F300202020000000000001C1C1C898A8B86888987888A 87888A87888987888A87888933373D353A423A3F47393F47363C4330353B87898A88898B88898B 87888A87888A88898B88898B88898B88898B88898B898A8B080808000000000000000000191919 898A8C87898A87898A88898B87898A88898B87888A88898A88898B87888933383E353B43393F47 393F47363C432F343A85878887888A87888A87888A87888A87888A676868020202000000030303 202121202021202121202020111111010101000000000000010101777879858688858788858788 85868885878884858732363C343941383D45383D45353A422E3339838486848587848587848587 8485878485872B2B2B0101010000005455558384868383868384868686893E3E3E010101000000 0000000000006E6F6F8082838182848182848182838182848081822E333A333840363B43363C43 3339402D31377E7F817F80827F80827E80817C7D7E0202020000000000007575777E7F807D7E7E 0404040000000000000000004C4C4C7D7D7F6C6D6E0202020000000909097A7B7D7C7D7F7C7C7E 7B7C7E7B7C7D2D323831353C34394034394034394034394034394034394034394033383F31363D 2A2F3440454D41464D41464D41464D41464D41464D41464D41464D41464D40454C44494F76787B 8A8A8A8A8A8A898989898989898989888888898989898989898989898989888888878787888888 8888888888888787878787877B7B7C3F444A3F444B3F444A3F444B3F444B3E424A2B2F352E3239 31363D1C242B1C242B1C242C0E1013050202060606020202121010B9B7B6FDFAF7F3F0ECF3F0EB F7F3EDCBC7C3928F8CA2A09C92908B8B88857F7F7C757A7461646018181B121215101214121315 0D0D10181A1B3A423E737C7D5C6061000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000B0B0B 818387717577777A7B3C3E3E161817252727171A1B4848478682808F89889691909C9695A09A97 A09C99A09A97D0CAC6EEEBE5EEEAE5EFEBE6EEEBE6F4F1ED908D8B020202060606060606050303 090A0A1B22291D252C1C242B31363D2E333A282D333E434A3E42493E424A3E424A3E424A3E424A 3E424A3E424A3F434A3F434A3F434A3F434B3F434A3F434B8282828888884C4F52373B41363A40 363A416F70718A8A8A5D5F6241454D40444C40444C40444C40444C40454C40444C40444C40444C 40444C40444C40454D40454D2D31372F343B33383F343940333940343940333940333940343940 33394031363D2B30357A7B7D7B7C7E7B7C7E7B7C7E7B7C7E7B7C7E49494A010101000000000000 0000000000000000000000000000000000000000000000000F0F0F7D7E7F7E7F817E7F817F8082 7F80827F80827F80822E323932373F363B43363B4332383F2C32377F8082808182808283808182 8082838082838082832929290101010000000505057B7C7C818284828385848587525252020202 00000000000046464783838583838684848784848784848784848731363C343941383D45373D45 353A422E33398384868485878586888485878586888586888586888A8A8B393939010101000000 0000000000000000000000000000000000000A0A0A7F7F7F87878A868789868789868789868789 86878987888A33373D353A42393F47393F47353C432F343A87888A868889868889868889868889 86888986888986888986888986888987888A3737370101010000000000004C4C4D868789878889 87888987888A87888987888A87888A87888A87888A87888A32373D353A42393F47393F47363C43 2F343A868789868789868789868789868789868789666667020202000000000000000000000000 0000000000000000000000000000000000005C5C5C88888B858688848587848587848587848587 84858732363C343941373D45383D45343A412E3339838386838486838486838486838486828385 2A2B2B0101010000005454558283858283858182848283858282830B0B0B000000000000000000 6E6E6F8182838182848081838081838081838081832D323932373F363B43353B4333383F2D3137 7E7F817F80827E7F817E7F817B7C7E0202020000000000007475767D7E807E7F80252525010101 0000000000006868697D7E806C6D6D0202020000000909097A7A7D7C7C7F7C7C7F7B7C7E7B7C7E 2D323831353C33394034394033394033394033394033394033383F33383F30353C2A2F3440454D 40444C40444C40444C40444C40444C40444C40444C40444C40444C40444C44495078797A898989 898989898989898989898989898989898989888888888888888888888888888888888888888888 8888888787877374763E424A3E424A3E424A3E424A3E424A3E434A2A2F352D323931363D1C242B 1C242B1C242C0E1013050202060606020202121010B8B7B5FCFAF6F3F0EDF3F0ECF6F3EDCDC9C4 928F8BA19F9A92908A8988847E7E7A77797561656017171B1010161212161313160D0D10191B1B 3A423D6F787955595B000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 0000000000000000000000000000000000000000000000000000000000000B0B0B808384727575 7578793A3C3C161817242627191C1D4747488782808E89889591909C96959F9A979F9A989F9994 D2CDC8F1EEE7EBE8E3EDEAE5F0EDE8F7F4F08F8C8B020202060606060606050303090A0A1B2229 1D252C1C242B31363D2E333A282D323D42493C41483D41493D42493D41493D42493D42493D4249 3E424A3D41493D42493E424A3D42493E424A8282828888885455573B3D403A3C3F3A3C3F757576 8989895D5E613F444B3E434A3E434A3E434A3E434B3F434B3F444C3F444C3E434B3F444C3E434B 3F444C3F444B2C31372F343B33383F33383F33383F33394033394033394033383F33394031363C 2B2F35797A7C7A7B7D7A7B7D7A7B7D7B7C7E7B7C7E49494A010101000000000000000000000000 0000000000000000000000000000000000001010107C7D7F7D7E807D7E807D7E807D7E807D7E80 7E7F812D323832373E353B43353A4232383F2C32377F7F817F80827F8082808082808183808183 575758020202000000000000494949838385818284818284818284878788161616010101000000 0505056F717282838582838582838582838582848531363C333941373C44373D453439412E3339 8383868384868384868484878384868484878585888586879292936464640E0E0E000000000000 0000000000000000003838388C8C8C87888A858688858688858688858688858688858688858688 32373C353A41383E46383E46353B432E343A868789868789868789868789858688868789868789 8687898687898687898687896666670202020000000000007A7A7B868789868789868789858688 85868886878985868886878986878985868832373D353A42383E46383E46353B422E333A858588 858688858688868689858688868689666667020202000000000000000000000000000000000000 0808081717173939397B7B7B8D8D8E84858783848683848683848683848683848683848631363B 333940373D45373C44343A412E33398283858283858283858283858283858283852A2A2B010101 0000005354558182848182848182848182848282855353530000000000000000006D6E6F7F8082 7F80827F80827F80827F80827E7F812D323932373F353A42353B4332383F2C31377D7D807D7E80 7D7E807E7E817A7C7D0202020000000000007475767C7E7F7C7E7F494949010101000000050505 7B7C7D7B7C7E6B6C6D020202000000090909797A7C7A7B7D7A7B7D7A7B7D7A7B7D2D313730353B 33394033383F33394033394033394033383F33383F33383F31353C2A2F343F444C3E434B3E434B 3F444C3E434B3F444C3F444C3E434A3E434B3E434A3E434A3E434B42474E6C6E71808181818282 818282818282818282818282808182808182808182808182808182808081808081808081757778 4A4E543D42493D41493D42493C41483D41493D41482A2F352E323931363D1C242B1C242B1C242C 0E1013050202060606020202121010B9B8B6FCFAF6F3F0EDF3F0ECF6F3EECDC8C4918E8BA19F9A 92908A8889837C7F79767A7462646017171A1210151313171313160D0D101B1C1B3B423E6D7879 585D5F000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 0000000000000000000000000000000000000000000000000B0B0B7D8081737777797A7B3C3E3D 151717232525181B1C4746478881808E89889690909C9695A09998A29C989E9894D0CCC8F1EEE8 ECE8E2EDE9E6F0EEE9FAF7F4908E8C020202060606060606050303090A0A1B22291D252C1C242B 31353C2E3339282C323C40483C41483C41483D41483D41493D41483D41483D41493D41483D4149 3D42493D41493D42493D4149828283888888888888898989898989898989898989898989626468 3E434A3E434A3E424A3E424A3E434A3E424A3E434B3E434A3E434A3E434B3E434A3E434A3E434A 2C30362F343C33383F33383F32383F33383F33383F33383F33383F33383F30353C2A2F3578797B 7A7B7D7A7B7D7A7B7D7A7B7D7B7C7E8384858F8F8F8F8F8F8F8F8F909090909090909090909090 9090909090909191919191918E8F8F7D7F807C7E7F7D7E807D7E807D7E807D7E807D7E802D3238 31373E353A42353B4332383F2C31377D7E807F80827F80827F80827F80827F8082868789959595 9595959595958A8A8C808083808183818184818184818284939393969696969696969696848587 82838582838582828582838582838530353B333940373C44363C443439412E3239818284838486 8384868284858384868384868384868384868384868A8C8C9797978888886C6C6C5D5D5D747474 8D8D8D91919386878884858784858784858784858784858785868885868884858732373D353A42 383E46383E46353B422E333A858688858688858688858688858688858688858688858688858688 8586888586888C8C8D9B9B9B9B9B9B9B9B9B88898A858688858688858688858688858688858688 85868885868885868885868832373C343A41383E46383E46353B422E333A848587858688858688 8485878485878485878A8B8C9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A999999959596 90909287888983848683848683848682848583848682838582848582838531353C333941373C44 373D453439412D323981818482838582838582838582838582838590909196969696969688898A 81828481818481828480808380808389898A9595959595959595958384857F80827F80827F8082 7F80827E7F817E7F812D323831373E353A42343A4232373E2C30377C7D7F7D7E807D7E807C7E7F 7C7E7F9191919191919191917F80817C7D7E7C7D7E8585869090909090908F8F8F7C7D7F7B7B7E 7E7F808F8F8F8E8E8E8C8C8C7B7C7D7A7B7D7A7A7D7A7B7D7A7A7D2C313730353C33383F333940 33383F33383F32383F33383F32383F32383F30353C292E343E434A3E434B3E434B3E434A3E434B 3E434A3E424A3E434A3E424A3E434A3E434A3E424A3D424A3D42493D42493D42493D42493D4249 3D42493D42493D42493D42493D42493D41493D42493D41483D41483D41493D41483D41493D4149 3D41483C41483C41483C41483C40482A2E342D323831353C1C242B1C242B1C242C0E1013050202 060606020202121010B8B8B6FDF9F7F3F0ECF3F1ECF6F3EFCCC7C4908D8AA09E9B93918C898A84 7B7E79787B776364611615191210141313161414160D0D101A1B1C3B423E6F78775B5F60000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 0000000000000000000000000000000000000B0B0D7D8181707575787A7A3B3D3C161818222526 191B1B4847478882818E898796918F9B96959F9A99A29D9A9F9996CECAC6F0ECE7ECE7E2EDE8E5 ECEAE5FAF7F391908F020202060606060606050303090A0A1B22291D252C1C242B30343C2E3339 282C323B40473C40483C40483C40483C40483C40483C40483C40483C40483C40483C40483D4149 3C40483D414956595E8586878888888888888888888989898989897A7A7C42474E3D42493C4149 3D42493D424A3D42493D424A3D42493D42493E434A3D424A3E434A3E434A3D424A2C30362F343B 33383F33383F32383F33383F32383F33383F33383F33383F30353C2A2F3577797A787A7C797A7D 797A7C797A7D797A7C797A7C7A7B7D7A7B7D7A7B7D7A7B7D7B7B7E7B7C7E7C7C7E7C7C7E7C7C7E 7C7C7E7C7C7E7C7C7E7C7D7F7C7D7F7C7D7F7C7D7F7C7D7F7C7D7F7D7E802D313731363D353A42 34394132383F2C31377D7E7F7E7F817E7F817E7F807E80827E80817E80817E80817E80817E8081 7F80828080837F8082808083808083808083818184818184818184808183818184808183818284 80818481828481828530343B333940373C44363C443439412E3239818284828385828385828385 828385828385838486838486838486838486838486868688898A8B8B8B8C88898A848587838486 83848684858783858784858783858783858783858783858783858731363B343940383D45373D45 353A412E333A838587838587848688848687848688848687838587848687838587848687838587 858688848687858688858688858688858688848587858688838587858688838587848687848688 83858784868832373C343A41383D45373D45353A412E333A828486838587838587838587838587 838587838486838486838486838587838486838486838486838486838486838486838486838486 82838582838583848682838582838582838582838582838530353A33383F373C44363B43343940 2D32398081838182858081848081838081848081838081838081837F80827F80827F8082808083 7F80828080838080837F80827F80827F80827F80827E80817F80827E80817E7F807E7F817E7F80 7E7F812D323831373E353A42343A4232373E2C30377B7C7E7C7D7F7C7D7F7C7D7F7C7D7F7C7D7F 7C7D7F7B7C7E7B7C7E7B7C7E7B7C7E7C7C7E7B7C7E7B7B7E7B7B7E7B7B7E7B7B7E7B7B7E7A7A7D 797A7C7A7A7D797A7C797A7C787A7C797A7C787A7C2C30362F343B33383F33383F33383F33383F 32383F33383F32383F32383F30353B292E343D424A3E434A3E434A3D42493D424A3D42493D4249 3D42493D42493C41493C41493D42493C41493D42493D42493D42493D42493D42493D41493C4148 3D41493C41483C41483C41483C41483C41483C41483C40483C41483C40483C40483C41483B4047 3C41483C40483B40472A2E342D323831353C1C242B1C242B1C242C0E1013050202060606020202 121212B8B9B7FDFAF6F3F0ECF4F1EDF6F4EECDC9C4928F8BA09E9A928F8C8888857A7F787A7D76 6365621514191312151212151313150F0F12191C1D373F3A6A73735B5D5F000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 0000000000000000000000000B0B0B7C7F80717474777A793B3D3C1617172426271A1C1D484748 8681808F8A8896908F9B9594A09B99A29D9AA29C98CFCAC7EDE8E4EDE9E4EFEAE6EEE9E6FAF7F3 929191020202060606060606050303090A0A1B22291D252C1C242B30353C2D3238282C323B3F47 3B40473B40473B40473B40473C40483C40483C40483C40483C40483C40483C40473C40483C4048 3C40483B40483C40483B40483B40483C41493B40483C41493C41493C41493C41493C41493D4249 3C41493D42493C41493C41493D41493C41493D424A3D424A3D424A2B30362F333A31373E32373E 32373E32373E32373E32373E32373E33383F2F353B2A2E3477787A787A7B787A7B797A7C797A7C 797A7C797A7C7A7B7D7A7B7D797A7C7A7B7D7A7B7D7A7B7D7A7B7D7B7C7E7A7C7E7B7C7E7A7C7E 7A7C7E7B7C7E7B7C7F7C7D7F7C7D7F7C7D7F7C7D7F7D7E802D313731363D34394134394131373E 2B30367D7D7F7E7F807E7F807E7F807E7F807E7F807E80817E80817E80817E80817E80817F8082 7E80817F80827F80827F80827F80827F80827F81838081837F8183808183808183808183818284 80818330343A32383F363B43363B433339402D3138818184828385828385828385828385828385 828385828385838486828385828385828285838486838386838386828386838386828386828386 83848682838683848683848683858783858783858731363B343940373D45373D45343A412E3239 838487838587838587838587838587838587838587838587838587838587838587838487838587 838487838487838487838487838487838487838587838487838587838587838587838587838587 31363B343940373D45373D45343A412E3239828386838587838486838587838486838486838486 838486838486838486838486838386838486838386828285818285828285818285818285828385 81828582838582838582838581828481828430343A33383F363B43363B433339402C31387F8082 8081838081838081838081838081837F80827F80827F80827F80827F80827F80827F80827E7F81 7E7F817E7F817E7F817E7F817E7F817E7F807D7E807E7F807E7F807E7F807E7F807D7E802D3137 31363D34394134394131363D2B30367B7B7E7C7D7F7C7D7F7C7D7F7C7D7F7B7C7E7B7C7E7B7C7E 7B7C7E7B7C7E7A7B7D7A7B7D7A7B7D7A7B7D7A7B7D797A7C797A7C797A7C797A7C797A7C797A7C 797A7C787A7B787A7B787A7B787A7B2C30362F343B33383F32373E32373E32373E32373E32373E 32373E31373E2F343B292D333D42493D424A3D42493D424A3D42493D42493D42493D42493D4249 3C41493C41493C41483C41493C41483C41483C41483C40483B40483B40483C41483B40483C4148 3C40483C41483C40483C40483C40483B40473C40483B3F473B3F473B3F473B3F473B3F473B3F47 3B40472A2E342D323830343B1C242B1C242B1C242C0E1013050202060606020202121212BAB9B8 FCF9F4F2EFEBF3F0ECF6F3EFCEC9C4928F8AA09E98918F8A8988857B7D797A7D77616460151418 151518121214131316100D12191B1C39423D6A7473595D5D000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 0000000000000B0B0B7F80827778777E80813E403F1517182427281A1C1D4A48498681808F8989 958F8E9C9595A09A99A19D9BA29C99D0CBC7EDE9E4EDE9E5EEEBE7EFEAE7F9F6F2919090020202 060606060606050303090A0A1B22291D252C1C242B2F353C2D3138272B313A3F463B3F463B3F46 3B3F473B3F463B3F473B3F473A3F473B3F473A3F473A3F473B40473A3F473B40473B40483B4048 3B40483B40483B40483B40473C41483B40483B40483C41483B40483C41483C41483C40483C4149 3C41483C41483C41493C41483C41493D42493C41492B30362F333A31373E31373E32373E31373E 32373E32373E32373E32373E2F353B2A2E3477787A78797B78797B78797B78797B797A7C797A7C 79797C797A7C79797C7A7A7C7A7B7D7A7A7C7A7B7D7A7B7D7A7B7D7A7C7E7A7B7D7B7C7E7A7C7D 7B7C7E7B7C7E7A7C7D7B7C7F7B7C7E7B7C7F2C303730353C34394134394031373E2B30367B7C7E 7D7E807D7E807D7E807D7E807D7E807D7E807D7E807E7F817E7E817E7E817E7F817E7E817E7F81 7E7F817E7F817F80827F80827F80827F80827F80827F81827F81827F81837F81827F818330333A 33383F353B43363B433339402D31387F8182808283808283808284808283808284818285818284 818285818284818284818285818284818285828386838386818285838386828285828385838386 82838582838582838682838582838630353B33383F363C44363C433339402D3239828385838486 828385838487828385838487828386838386828386828385828385828386838386828386828386 83848782838683838683848783848683838683848683848682838682838582838631353B333940 363C44373C443339402D3239818284828385828385828386828385828386828386828385818285 818284818284818285818284818285818285828285818285828285818284808283828285808283 80828380828480828380828430343A32373E353B43353A4232383F2C31387E80817F81827F8082 7F80827F80827F80827F80827F7F827F80827F7F827E7E817E7F817E7E817E7F817E7F817E7E80 7E7F817E7F817E7E807D7E807E7E807D7E807D7E807D7E807C7D7F7C7D802D313731363D343941 34394131363D2B2F367A7B7D7B7C7E7B7C7E7A7C7E7A7C7D7A7C7E7A7C7E7A7B7D7A7B7D7A7B7D 7A7A7C7A7B7D7A7A7C7A7B7D7A7B7D797A7C797A7C797A7C797A7C797A7C797A7C78797B78797B 78797B78797B78797B2B2F362E333A32373E32373E32373E32373E32373E31373E32373E32373E 2F343B292D333C41483C41483C41483C41493C41483C41493C41493C41483C40483B40483B4048 3C41483B40483C41483C41483B40483B40483B40483B40483B40473B40483B40473A3F473B4047 3A3F473B40473B40473B3F473B40473B3F473B3F473B3F473B3F463B3F473B3F473A3F462A2E34 2C32382F343B1C242B1C242B1C242C0E1013050202060606020202121212BAB9B7FCF9F5F2EFEB F3F0ECF6F3EECECAC593918B9F9E9892908A8887847B7C79787B77616460161518161619121216 1312160F0D101A1C1C3D4340717878595F5D000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 0B0B0B7D7E817375758081823F3F401618172528271A1D1D4949498682808E8987948F8D9C9695 A09A99A09C9AA09997CEC8C4EEE9E5ECE8E4EEEBE7EEEBE6F7F5F091918F020202060606060606 050303090A0A1B22291D252C1C242B2F343B2D3238282C323A3E463A3E463A3E463A3E463A3E46 3A3F463A3E46393E463A3E46393E46393E46393E46393E46393E463A3F473A3F473A3F473A3F47 3A3F473A3F473A3F473B3F473B3F473B40473B3F473B40473B40473A3F473B40473A3F473B4048 3B40483B40483B40483B40483B40482B2F352E333931363D31363D31373E32373E32373E32373E 32373E32373E2F343B2A2E3475777977787B77787B77787B77787B78797C78797C78797B78797C 78797B78797B797A7C78797B797A7C797A7C797A7C797A7C797A7C7A7B7D7A7B7D7A7B7D7A7B7D 7A7B7D7B7C7E7A7B7D7B7C7E2C313730363D33394033394131363D2B2F357B7C7E7C7D7F7C7D7F 7C7E807C7E807C7E807C7E807C7E7F7C7E807D7E807C7E7F7D7E807D7E807D7E807D7E807D7E81 7E7F817D7E817E7F827E7F827E7F827E7F827E7F827F80827F80827F808230333A32383F353A42 353B4332383F2C30377F8082808183808183808183808183808183808183808183808183808183 818284818284808183818284818284818284818284818284818284818284818284818284818385 81828481828481828430343B333940363C43363C443339402D3138818385818385818385818385 818385818385818385818384818385818384818384818384818384818384818384818385818384 81838581838581838581838581838581838581838581838581838530353B333940363C43363C44 3339402D3138808284818284818385818385818284818284818284818284818284818284818284 818284818284818284818284808183808183808183808183808183808183808183808183808183 8081837F808230333A32383F353A42353B4332383F2C30377E7F817E7F827E7F827E7F827E7F82 7E7F827E7F827E7F817D7E817D7E807D7E807D7E807D7E807D7E807C7E7F7C7E807C7E7F7C7E80 7C7E807C7E807C7D7F7C7E807C7D7F7C7D7F7C7D7F7C7D7F2C313730363D33394033394131363D 2B2F35797A7C7A7B7D7A7B7D7A7B7D7A7B7D7A7B7D7A7B7D7A7B7D797A7C797A7C797A7C797A7C 78797B797A7C78797B78797C78797B78797C78797C78797C77787B77787B77787B77787B77787B 76787A2C30362E343A32373E32373E31363D31363D31373E31363D31373E31373E2F333A292D33 3C41483B40483B40483B40483B40483B40483B40473A3F473B40473A3F473A3F473A3F473A3F47 3A3F473A3F473A3F473A3F473A3F473A3F473A3E463A3F473A3E463A3E463A3F463A3E463A3F46 3A3F46393E463A3E46393E46393E463A3E46393E463A3E463A3E463A3E46292D332C313730343B 1C242B1C242B1C242C0E1013050202060606020202121212BAB9B7FDFAF6F3EFECF3F0ECF5F3EE CFCAC4928F8A9F9E9B918F8A8887817C7D79787D766163601515171515181312171314160F0F10 1A1A1C3C423E6E76755D6060000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF0000000000000000000000000000000000000000000000000000000000000B0B0D7D7F81 6F72727C7E804241421618182628271B1D1D4847488782818E8987948F8E9C96959F9997A19B99 A09A96CCC7C3ECE7E2EDE9E4EFECE7F0EEE9FAF7F392908F020202060606060606050303090A0A 1B22291D252C1C242B2F343B2D3138272B31383D45393E45393E45383D45393E45383D45383D45 393E45383D45393E45393E46393E46393E46393E46393E46393E46393E46393E46393E463A3F46 393E463A3F463A3F46393E463A3F473A3F463A3F463A3F473A3F463A3F473B40473B3F473B4047 3B3F473B3F473A3F472B2F352E333A31363D31363D31373E31363D31373E32373E32373E32373E 2F343A292D3375767877787B77787B77787A77787B77787A78797B77787A78797B78797B78797B 78797C78797B797A7C78797C787A7C797A7C787A7C787A7C7A7B7D787A7C7A7B7D7A7B7D797A7D 7A7B7D7A7B7E2C303730353C33394033394031363D2B2F357A7B7D7C7D7F7C7D7F7B7C7E7C7D7F 7B7C7E7C7D7F7C7D7F7C7D7F7C7D7F7C7D7F7C7E807D7E807D7E817D7E817D7E807D7E817D7E80 7D7E807D7E807D7E807D7E807E7F817D7F817E7F817D7F812F333932383F353A42353B4332383F 2C30377D7E817F80827F80827E7F828081837F80837F80838080837F8083808083808083808183 8080838081838182847F8083808183808184808184818284808184818284818284808184818284 80818430333A32383F363B43363B4333383F2D3138818284818284818284818284818385818284 818284818284818284818184818284818385818184818385818385818284818385808184818284 81838481828481838481828481828481828480818430343A32383F363B43363C4433383F2D3138 7F8083818284818284808184818284808184808184818184808184818184808083808183808083 8081838081837F80838081837F80837F80838081837F80837F80827F80827E7F827F80827E7F82 30333A32373E353A42353A4232373E2C30377C7E807E7F827E7F827D7F817D7E817D7F817D7E80 7D7E807D7E807D7E807D7E807D7E817C7D7F7C7E807C7E807C7D7F7C7E807C7D7F7B7C7E7C7D7E 7B7C7E7C7D7E7C7D7E7B7C7E7B7C7E7A7B7E2C313730363D33394033394131363D2B2F3578797C 7A7B7D7A7B7D797A7D7A7B7D797A7D787A7C797A7C787A7C797A7C797A7C797A7C78797B78797C 78797C78797B78797C77787A77787A77787A77787A77787A77787A77787A77787A7677792B2F36 2E333A32373E32373E31363D31363D31363D31363D31363D31363D2E333A292D333A3F473B4047 3B40473A3F473B40473A3F473A3F473A3F473A3F473A3F473A3F473A3F463A3F463A3F463A3F46 393E463A3F46393E46393E46393E46393E46393E46393E46393E45393E46393E45393E45393E46 383D45393E45393E45393D45393E45393D45393D45383D45292D332C31382F343B1C242B1C242B 1C242C0E1013050202060606020202121212B9B9B7FDFAF6F2EFEBF3EFEBF6F3EFCFCBC593908A A09E9A928F8B8A88847B7E7A767C765F645F1516181515181212171414170F0F101A1B1D393F3F 6C74755B5D5D000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 0000000000000000000000000000000000000000000000000000000B0B0B7C7F827277767A7D7D 3D3E3F1618172628281A1D1D4847488782818E8887948F8F9B97959F9997A19C9AA09A96CEC8C3 ECE8E3EEEAE6F0EDE9F2EFEAFAF7F492908F020202060606060606050303090A0A1B22291D252C 1C242B2F333A2C3138272B31383D44383D45383D45383D45383D45383D45383D45383D45393D45 393E45393E45383D45393E45383D45383D45393E45383D45393E46393E46393E46393E46393E46 393E46393E463A3F473A3E463A3E46393E463A3E46393E46393E463A3F463A3E473A3F473A3F47 3A3F472B2F352D323931363D31363D31363D31363D31363D31363D31373E31363D2E343A292D33 75767876767976767976777977777A77787A77787A77787A77787A77787A78797B78787A78797B 78787A78787A78797B78797B787A7C787A7C787A7C787A7C797A7D787A7C797A7D797A7D797A7D 2B30362F353C33384033394031363D2B2F35797A7D7B7C7E7B7C7E7B7C7E7B7C7E7B7C7E7B7C7E 7B7C7E7B7C7E7C7D7F7C7D7F7C7C7F7C7D7F7C7C7F7C7C7F7C7D7F7D7D807C7D7F7D7E807D7E80 7D7E807D7E807D7E807D7F817D7E807D7F812F323931363D343A42343A4131373E2B30377D7E81 7D7E807E7F817E7F827E7F817E7F827E7F827E7F827F80837F80837E7F827F80827F80837F8082 7F80827F80837F80827F80837F80837F80837F80837F808380818480818480818480818430333A 32383F363B43353B4333383F2D3138808184808183808183808184808183808184808184808184 808184808184808184808183808184808183808183808184808183808184808184808184808184 80818480818480818480818480818430333A32373E353B43353B4232383F2C31387F8083808183 8081837F80837F80827F80837F80837F80837F80837F80837F80837F80827F80837F80827E7F81 7F80837E7F817F80837E7F827E7F827E7F827E7F827E7F827D7F817E7F827D7F812F323931373E 353A42343A4232373E2C30377C7D7F7D7D807D7E807D7E807D7D807D7E807D7E807D7E807D7E80 7C7D7F7C7D7F7C7C7F7C7D7F7C7C7F7C7C7F7B7C7E7B7C7E7B7C7E7B7C7E7B7C7E7B7C7E7B7C7E 7A7B7E7A7B7E7A7B7E7A7B7E2B30362F353B32384032383F30353C2A2F3578797C797A7C78797B 797A7D78797B787A7C787A7C787A7C787A7C787A7C787A7C78787A78797B78787A78787A78797B 78787A77787A77787A77787A77787A7677797677797677797677797677792B2F362E333A32373E 31363D31363D31363D31363D31363D31363D30363D2E333A282D333A3F473A3E47393E463A3E47 393E463A3E463A3E463A3F463A3E463A3F463A3F46393E46393E46393E46393E46393E46393E46 393E45393E45393E46393E45393E46393E46393D45393E46383D45393D45383D45383D45383D45 383D45383D45383D45383D45383D44383D44292D332B30362F343B1C242B1C242B1C242C0E1013 050202060606020202121212B9B9B7FDFAF6F3EFEBF3EFEBF5F2EDCECBC69391899F9D98928F8B 8988847D7F79797B775F635E161618141418121218131416101012191C1C353E3C6A7373606461 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 0000000000000000000000000000000000000000000B0B0B7B7F8170757678797A3A3B3B171917 272829191D1E4847488883818E8988948F8F9B9795A09A98A19D9BA29C99D0CBC8EEE9E6F0ECE8 F1EEEAF2EEEBFBF8F4929190020202060606060606050303090A0A1B22291D252C1C242B2F333A 2C3138272B31363B43383C44383D44383D44383D44383D44383D44383C44383D44383C44383C44 383D44383D45383D45383D45383D45383D45383D45383D45383D45383D45383D45383D45393E45 393D46393E45393E46393D46393E46393D46393D46393E46393D46393E463A3E46383D46292E35 2D333930353D31363D31363D31363D31363D31363D31373E31373E2E343A292D33717274767779 76777976777977787A77787A77787A76777A77787A76777A77787A78787A77787A78787A78787A 77787A78797B78797B78797B78797B78797B78797B78797B797A7C797A7C7576782B30362F343C 32383F32384030353C2A2E357576787A7B7D7A7B7D7A7B7E7A7B7D7B7C7E7B7C7E7A7C7E7B7C7E 7A7C7E7B7C7F7C7C7F7B7C7F7C7C7F7C7C7F7B7C7F7C7C7F7C7D807B7C7F7B7C7F7C7D807C7D80 7C7D807D7E807C7D80797A7B2E323931373E343A42343A4231373E2B303778797B7E7F817D7F80 7D7F817D7F807E7F827E7F827E7F817E7F827E7F817E7F817E7F817F80827F80827F80827F8082 7F80827F80827F80827F80827F80827F80827F80827F80827F80827B7C7E2E333A31373E353A42 353B4332373E2C31377A7C7E7F80828081837F80838081838081848081847F81837F80837F8183 7F81838081837F80828081838081837F81838081837F81837F81837F81837F81837F80827F8183 8081837F81837B7C7E2E333A31373E353B43353B4332383F2C3137797B7D7F80827F80827F8083 7F80827F80837F80837F80827F80837F80827E7F817F80827E7F817E7F817E7F817E7F817E7F81 7E7F817E7F817E7F817E7F817E7F817D7E807D7F807D7E80797B7C2E323931363E343A41343A42 31363D2B2F3677787A7D7E807D7E807D7E807D7E807D7E807D7E807B7C7F7C7D7F7B7C7F7B7C7F 7C7C7F7B7C7F7B7C7E7B7C7E7A7C7E7B7C7E7A7C7E7A7C7E7A7C7E7A7C7E7A7B7D7A7B7D7A7B7D 7A7B7D7677792B30372F353C32384032384030353C2A2F35747577797A7C797A7C787A7C787A7B 787A7C787A7C77787A78797B77787A77787A78787A77787A78787A77777A76777A77777A76777A 76777A76777A76777A7576797576797677797576797273752B2F362E333A31363D31363D31363D 31363D31363D30353C31363D30363D2E333A282D33393D46393E46393E46393E46393E46393E46 393E46393D46393E46393D45393D45393E45393D45393E45393E45383D45383D45383D45383D45 383D45383D45383D45383D45383D44383D45383D44383D44373C44383D44373C44373C44383C44 373C44383C44383D44363B43282C332B30362F343B1C242B1C242B1C242C0E1013050202060606 020202121312B9B8B8FCF9F5F3EFECF3F0EBF5F2EDCFCAC5928E879F9D98928F8B8988847C7E7A 777B7760646117161A1514181313171414170F0F121B1C1E38403E6A74725C6161000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 0000000000000000000000000000000B0B0B797D7E7275777C7D7D3B3C3C1517172628281C1E1E 4747478883818F8A8895908F9C9694A19B99A39E9CA39C9AD2CCC7EEEBE6F0EDE9F2EFEBF2EFEC FCF9F6919190020202060606060606050303090A0A1B22291D252C1C242B2E333A2C3137272A30 333840373C44373C44373C44373C44373C44373C44373C44373C44373C44373C44373C44373C44 373C44373C44383D44373C44383D44383D44383C44383D45383D45383D45383D45383D45383D45 383D45383D45393D46393D45393D45383D45393D45383D45383D45363B42292E342D323930353C 30353C30353D30363D31363D31363D30363D31363D2E333A282C325E6064757679757679757679 75767975767976777A76777976777A76777976777976777976777976777976787A77787A76787A 77787A77787A78797B78797B78797B78797B78797B797A7C6265692B30362F343C323840323840 30353C2A2F356263677A7B7D7A7B7D7A7B7D7A7B7D7A7B7D7A7B7D7A7C7D7A7B7D7A7C7D7A7C7D 7A7B7D7B7C7E7A7B7D7B7C7E7B7C7F7B7C7E7B7C7F7B7C7F7B7C7F7C7D807C7D807C7D807C7D80 7C7D8066686C2D323930363D333941343A4231373E2B303664666A7D7E807D7E807D7E807D7E80 7D7E807D7E807D7E807E7F817E7F817E7F817D7E817E7F817D7E817D7E817E7F817D7E817E7F81 7F80827E7F817E7F817F80827F80827F80827F8082686A6E2E333A31373E353B43353A4332383F 2C313767696D7F80827F80827F80827F80827F80827F80827F80827F80827F80827F80827E7F82 7F80827E7F827E7F827F80827E7F827F80827F80827F80827F80827F80827F80827F80827F8082 67696D2E333A31373E343A42353A4331373E2B303766686C7F80827F80827F80827F80827E7F81 7E7F817E7F817E7F817E7F817E7F817D7E817E7F817D7E817D7E817E7F817D7E817D7E807D7E80 7D7E807D7E807D7E807D7E807D7E807D7E8066686C2D323930363D343A4234394131373E2B3036 64666A7B7C7F7C7D807B7C7F7B7C7F7B7C7F7B7C7F7B7C7E7B7C7F7B7C7E7A7C7D7A7B7D7B7C7E 7A7B7D7A7B7D7A7C7E7A7B7D7A7B7D7A7C7E7A7B7D7A7B7D7A7B7D7A7B7D7A7B7D7A7B7D636569 2B30362F343C32383F3238402F343B292E3460626678797B78797B78797B78797B77787A78797B 77787A77787A77787A77787A76787A76777976777976777976777A76777976777A75767976777A 7576797576797576797576797576786062662B2F362D323931363D31363D31363D30363D30363D 30363D30353C30353C2E3339272C32353A42393E46393D46383D45393D46383D45383D45383D45 383D45383D45383D45383D45383D45383D45383D45383D45383D45383D44383D44383C44383D44 383C44373C44383D45373C44373C44373C44373C44373C44373C44373C44373C44373C44363B43 363B43343940272C322B30362F333A1C242B1C242B1C242C0E1013050202060606020202131313 BBB9B8FCF8F5F2EFECF2EFEBF5F2EDD0CDC692908A9E9D97918F898886837B7D7C757A765F625F 1616191213171213151414160F0D121A1C1C3A403D6C7475595F60000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 0000000000000000000B0B0B797D7E75787A787A7C3A3C3D1517172528271D1F1F464545878381 8F8B8995918F9D9796A19C9AA29E9DA49E9BD3CDC7EFEBE5F2EFEAF2EEEBF2EFECFCF9F5929090 020202060606060606050303090A0A1B22291D252C1C242B2E333A2E32392B2F3525282E33373F 353A42363B42363B42363B42363B42363B43363B42363B43363B43363B43363B43373C44373C44 363B43373C44363B43363B43363B43373B43363B43373B43373C43373B43373C43373C43373B43 373C43373B43373C44373C44373C44373C44343941262A302C31372F343B30353C30353C30353C 30353C30363D30363D30363D30363D2F353C2C31382F33376D6F70757678757678757678757678 75767875767875767876777976777976777976777976777976777976787A76787A76787A76787A 76777977787B77787A76777977787B70717331353A2E333931363E32383F32383F31363E2E333A 31353970717378797B797A7C797A7C797A7C797A7C797A7C7A7B7D797A7C7A7B7D7A7B7D7A7B7D 7A7B7D7A7B7D7A7B7D7A7B7D7A7B7D7B7C7E7A7B7E7B7C7E7A7B7E7A7B7E7B7C7E73747733373B 2F343B3238403339413339413238402F343B32363B7475777C7D7F7C7D807C7D7F7C7D807C7D80 7C7D807C7D807C7D807C7D807D7E817C7D807C7D807D7E817D7E817D7E817D7E817D7E817D7E80 7D7E817D7E807D7E807D7E8175777934383D30353C333940343A42343A4233394030363D33373C 7576787D7E807E7F827E7F817D7E817E7F827E7F827E7F827E7F827E7F827E7F827E7F827E7F82 7E7F827E7F827E7F827E7F827E7F827D7F817E7F827D7F817D7E807E7F8276777A33373C30363D 333940343A42343A4233394030353C33373C7576787D7E807D7E817D7E807D7E817D7E817D7E81 7D7E817D7E817D7E817C7D807D7E817C7D807C7D807C7D807C7D807C7D807C7D807C7D7F7C7D80 7C7D7F7C7D7F7C7D8074757733373C2F343B3238403339413339413238402F343B32363A747577 7B7C7E7B7C7E7B7C7E7B7C7E7B7C7E7B7C7E7A7B7D7A7B7D7A7B7D7A7B7D7A7B7D7A7B7D7A7B7D 797A7C797A7C797A7C797A7C787A7C797A7C787A7C787A7C78797C71727432363A2E333A31363E 32383F32373F30363D2E333930343970717277787A77787B77787A76787A76787A76787A76787A 76787A76787A767779767779767779767779767779767779757678757678747578757678747578 7475787475776D6E703034382C31382F353C30363D30363D30353C30353C30353C30353C30353C 30353C2F343B2D3137262A2F343941373C44383C44373C44373C43373C43373C44373C43373C44 373C44373C44373C44373C44373C44373B43373C44363B43363B43363B43363B43363B43363B42 363B42363B42363B42363B42363B42363B42363B42363B42363B42363B42353A4233373F25282E 2A2F352D32392F333A1C242B1C242B1C242C0E1013050202060606020202131313BBB9B8FCF9F5 F3F0ECF2EFEBF5F2EDD1CDC69390899E9C96928F8A8A88837D7E7D757B765F6560171519101215 121215151517100F121B1C1D383F3B6871725B6060000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 0000000B0B0B777B7C6D7173797B7D3C3D3D1517172427271C1E1E41414186827F908C8A95918F 9D9695A19B9AA29E9CA29C99D1CAC6F1EDE8F1EEEBF1EEEAF2EFEBFCF8F6929090020202060606 060606050303090A0A1B22291D252C1C242B2E333A2D32392B303625292F1C1E2326292F32363E 363B42353A41353A42363B42353A42363B42363B42353A42363B42353A42353A42363B43363A42 363B43363B43363B43363B43363B43373B43363B43373B43373B43373B43363B43373B43363B43 363B43373C44333840272A311D2024262B312D31382E343B30353C30353C30353C30353C30353C 30353C30353D30353C2F343C2D3239272B3126282C5152536E6F71757578747578747578747578 74757875767874757875767875767875767875767876777976777976787A76787A76777976787A 767779717273545456282A2E282C322F343B30363D32373E32383F31363D2F343A282C3227292D 53545571727478797B787A7C787A7C787A7C787A7C787A7C787A7C797A7D797A7D787A7C797A7D 7A7B7D797A7D7A7B7D7A7B7D797A7D7B7C7E7A7B7E747577565758282A2E292D3430353C32373F 33394133394032374030353D292D34282B2F5656577476777B7C7E7B7C7E7C7D7F7C7D7F7B7C7E 7C7D7F7C7D7F7C7D7F7C7D7F7C7D7F7C7D7F7D7E817C7D7F7C7D807C7D807D7E807D7E817D7E80 76777958585A2A2C302A2E3531363D333940343941343A4233384031363D2A2E35292B2F575759 7677797D7E807D7E807D7E807D7E807D7F817D7E807D7E807D7F817D7E807D7F817D7E807D7E81 7D7E807D7E817D7E817D7E807D7E817D7E8076777958585A2A2C302A2E3531363D333840343942 34394133384031363D2A2E35292B2F5657587677797D7E807C7D7F7C7D7F7C7D7F7C7D7F7C7D7F 7C7D7F7C7D7F7C7D7F7C7D7F7C7D7F7C7D807C7D7F7B7D7F7C7D807C7D7F7C7D807B7C7E747677 565658292C30292D3430363D32383F33384033394032373F30353C292D34282A2E555657747577 7B7B7E797A7D7A7B7E797A7D797A7D797A7D797A7D797A7D797A7D787A7C787A7C797A7C787A7C 797A7C797A7C78797B78797C78797B717274545557282A2E282C322F343A30363D32373F32373E 30363D2F333B282C3227292D525354707173767779767779767779767779767779757678757678 7576787576787576787475787576787475787576787576787475787576787475786E6F71515254 26282C272B312D32392F353C30353C30353C30353C30353C30353C30353C30353C2F343B2F343B 2D3138262A311D1F24272A30333840373B43363B43363B43373B43363B43373B43373B43363B43 373B43363B43363A42363B43363A42363B43363B43363B43363B43363B43363B42363B42363B42 363B42363B42353A42363B42353A42353A41353A4232363E26292F1C1F2325292F2B30362D3239 2E32391C242B1C242B1C242C0E1013050202060606020202131313BBBAB9FCF9F5F3EFECF3F0EC F6F2EED1CCC59590889E9B96928F8B8B88857C7E7A787C76616460161518101014121315141516 100D101A1C1C38413D636F6D585C5C000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000B0B0B 7A7C806F72747B7C7D3D3E3E1618162628261B1F1E3F3F3E85817E918C8A96918F9C9695A19C99 A49F9DA19B98CFC9C5F2EFEBF2EFEBF2EFEBF3F0EDFCF9F6939292030202060606060606050303 090A0A1B22291D252C1C242B2E333A2E32392D3138292E3322252A171A1D0F11130F11130F1113 0F11130F11140F11140F11140F11140F11140F11140F11140F11140F11140F11140F11140F1114 0F11140F11140F11140F11140F1114101114101114101114101114101114101114101114101114 101114181A1E23262C2A2F352E333A2F343B30353C30353C2F353C30353C2F353C2F353C30353C 30353C30353C2F333B2B303623272D181B1F101214101214101214101214101214101214101214 101214101214101214101214101214101214101214101214101214101214101214101214101214 191B1F24282E2C313730363C31373E32373E32373F31363D30353C2C313824282E1A1C20101215 101214101215101214101214111215111215111215111215111215111215111215111215111215 1112151112151112151112151113151112151A1C2025292F2D323931363D32383F333840323840 32384032373E2D32392529301A1D21111315111316111315111316111316111315111316111315 1113151113151113151113151113151113151113151113151113151113151113151113151A1D21 262A302E333A32383F333941343941343A4233384032373E2E333A262A301B1D21111316111315 111316111315111315111315111315111315111315111315111315111315111315111316111315 1113161113161113161113161113161B1D21262A302E333A32383F333940343941333941333941 32383F2E333A262A301A1D21111315111316111315111316111316111315111316111315111315 1113151113151113151113151113151113151113151113151113151113151113151A1C20252A30 2D323931373E32384033384033394032383F31363D2D323925292F1A1C20111215111215111215 111215111215111215111215111215111215111215111215111215111215111215101214101215 1012151012151012151012151A1C2024282E2C31382F353C30363D32373F31373E31363E30353C 2C313724282E191B1F101214101215101214101215101215101214101215101214101214101214 101214101214101214101214101214101214101214101214101214101214191B1F23272D2B3036 2F343B30353C30353C30353C30353C30353C30353C30353C30353C2F343C2F343B2E333A2A2F35 23262C181A1E111215111215111215111215111215111215111215111215101215101215101215 101215101215101215101215101215101215101215101215101215101215101215101215101215 101214101215101214101214101214101214181A1E22252A292E342D31382E32392E32391C242B 1C242B1C242C0E1013050202060606020202131313BBB9B8FBF8F4F1EEEBF3F0ECF6F3EED0CBC4 9591889D9C94908D888988847B7F787A7C77636663151518101014141417141417100F121A1D1C 37403A64716D5B6060000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 0000000000000000000000000000000000000000000000000000000000000B0B0B777B7E737677 797A7A3C3D3D1517172528271B1F1D3E3E3C878280918C8A95908D9A9593A29C9AA49E9DA39C98 CEC9C2F1EDE8F1EEEBF2EFECF3F0EDFCF8F6949291030202060606060606050303090A0A1B2229 1D252C1C242B2D32392E32392D32392B3137292E3325292F22252A22252A22252B22252A22252B 22252B22252B22252B22252B22252A22252B22252A22252B22262B22252B22262B22262B22252B 22262B22252B22252B22262B22252B22262B22262B23262B22262B23262B23262C22262B262A30 2A2F352D32392E333A2F343B2F343B2F343B2F343B2F343C2F353C2F353C2F343C2F353C2F343C 2F333B2E33392B2F36272B3123272C23272C23272C23272C23272D23272C23272D23272C23272C 23272D24272C24272D24272D24272D24272D24272D24272D24282D24282D24282D282C322C3037 2F343B30353C31363E31363D31363E31363D30353C2F343B2C3037272C3224282E24282E24282E 24282E24282E24282E24282E25292E24282E25292E25292E25292E25292E25292E25292E25292F 25292F25282F25292F25282F282C332D323830353D31373E32383F32384032384032384031363F 31363D2D3239292D3425292F25292F25292F25292F25292F25292F25292F25292F25292F25292F 25292F25292F25292F25292F25292F262A3025292F25292F262A30262A302A2E342E323A31373E 32373F33384133384033384133384032373F31373E2E3239292E35262A30262930262A30262930 262930262A30262930262A30262A30262A30262A30262A30262A30262A30262A30262A30262A30 262930262A30262930292D342E333A31363E32383F33394133384133394133384132373F31373E 2E323A2A2E34262A30262A30262A30262A3025292F25292F25292F25292F25292F25292F25292F 25292F25292F25292F25292F25292F25292F25292F25292F25292F292D342D323931363D31363F 32384032383F32373F32373F31363E30353C2D3138282D3325292F25282F25292F25282F25282E 25292E25282E25292E25292E25292E25292E25292E24282E24282E24282E24282E24282E24282E 24282E24272E272B322C31372F343B30363D31373E31363E31373E31363E30353C2F343B2C3037 282C3224282D24282D24272D24272D24272D24272C24272D24272C24272C23272D23272C23272D 23272D23272D23272C23272C23272C23272C23272C23272C272B312A2F352E33392F333B2F343C 2F343B2F343C2F343B2F343B2F353C2F343B2F343B2F343B2F343B2E333A2D32392A2E35252A30 22252B22262B22262B23262B22262B23262B23262B22262B23262B22262B22262B22252B22262B 22252B22252B22262B22252B22252B22252B22252B22252B22252B22252B22252B22252A22252A 22252A22252A22252A22252A25292F292D332B31372D31382D32392E333A1C242B1C242B1C242C 0E1013050202060606020202131313BBB9B9FCF8F5F2EFEBF2EFEBF5F2EDD0CCC593918B9C9B95 908D888887827B7F78777A7563666317161A1413161413161414170F0D101B1C1D3B433E667270 5B5F60000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 0000000000000000000000000000000000000000000000000B0B0B787B7C6E7172787B7B3E3F40 1617182525271D1F1E3C3D3A85817E928D8A928E8C999493A19B99A39C9AA49D99D1CCC6F2EEEA F2EFEBF1EEEBF4EFECFCF9F5959392020202060606060606050303090A0A1B22291D252C1C242B 2D32392E333A2E333A2C31382C31382B2F352A2E342A2E342A2E342A2E342A2E342A2F352A2E34 2A2F352A2F352A2E352A2F352A2E352A2E352A2F352A2E352B2F362B2F362B2F362B2F362B2F36 2B2F362B2F362B2F362B2F362B30362B2F362B30362B2F362B2F362B30362C30372D33392E333A 2F343B2F343B2F343B2F343B2F343B2F343B2F353C2F353C2F343C2F353C2F343C2F343C2F343B 2E333A2D32382C31372C30372C31372C30372C30372C31372C31382C31372C31372C31382C3137 2C31382C31382C31382C31382C31382C31382C31382D31382D31382E32392F353B30353C31363E 31363E31363E31363E31363E31363E30363D2F343C2E333A2D32392D32392D32392D32392D3239 2D32392D32392D32392D32392E32392E333A2E32392E32392E333A2E32392E333A2E333A2E333A 2E333A2E333A2F343B30363D31363E32383F32383F32373F32383F32384032384031373F31363D 2F353C2E343A2E333A2E343A2E333A2F333B2E333A2E333A2F333A2E333A2F343B2F333A2F343B 2F343B2F333A2F343B2F333A2F333A2F333A2F343B2F333A30343B31373E32373F333941333940 33384133394133384133384132383F31373E30353C2F343B2F343B2F343B2F343B2F343B2F343B 2F343B2F343B2F343B2F343B2F343B2F343B2F343B2F343B2F343B2F343B2F343B2F343B2F343B 2F343B30353C31373E32373F33394133394133384133394133384133384032373F31363E30353C 2F343B2F333B2F343B2F333B2F333B2F333A2F333B2F333A2F333A2F343B2F333A2F343B2E343A 2E333A2F343B2E333A2E333A2E333A2E333A2E333A2F343B31363D31363E32384032384032373F 32383F32373F32373F31373E30353D2F343B2E333A2E333A2E333A2E333A2E333A2E333A2E333A 2E333A2E333A2E32392D32392D32392D32392D32392D32392D32392D32392D32392D32392D3239 2E333A2F353C30353D31373E31363E31363E31363E31363E31363E30353C2F343B2E333A2D3238 2C31382C31382C31382C31382C31372C31382C31382C31372C31382C31372C31382C31382C3037 2C31382C31372C30372C30372C30372C30372D31382E333A2E333A2F353C2F353C2F343C2F353C 2F343C2F343C2F343B2F343B2F343B2F343B2F343B2F343B2E333A2D33392C31372B30362B3036 2B30362B2F362B30362B2F362B2F362B2F362B2F352B2F362B2F362B2F362B2F362B2F362B2F36 2A2F352A2E352A2F352A2F352A2E352A2F352A2E352A2E352A2F352A2E352A2F352A2F352A2E35 2A2F352A2E352B2F362C31372D31392E32392E32392D32391C242B1C242B1C242C0E1013050202 060606020202131313BBBAB9FCF9F5F2EFEBF1EEEAF5F2EDD3CFC993918C9D9B98918F8A898782 7C7E78767A7561646019171A1616191313141314151010121D1E1F3E4440636C6D595D60000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 0000000000000000000000000000000000000B0B0B7C7D80707273767A7B3B3D3E161717242627 1C1F1F393B3A84807D928D8B938D8C999392A19C99A39D9BA59F9BD0CBC7F1EEEAF2EEEBF1EEEB F4F0EEFCF9F6949392030202060606060606050303090A0A1B22291D252C1C242B2D32392D3239 2D32392D32392D32392E323A2E323A2D32392E323A2D32392D32392E333A2D333A2E333A2E333A 2D333A2E333A2D333A2D333A2D333A2D333A2D333A2E333A2E333A2E333A2E333A2E333A2E333A 2E333A2E333A2E333A2F333B2E333A2F333B2F333B2E333A2F333B2E333A2E343B2F343B2E343B 2F343B2F343B2E343B2F343B2E343B2E343B2F343C2F343B2F343C2F343C2F343B2F343C2F353C 2F343B2F353C2F353C2F353C2F353C30353C2F353C30353C30353C2F353C30353C2F353C2F353C 30353D30353D30353D30353D30353D30353D30353D30353D30363D30353D31363E31363E30363D 31363E30363D30363D30363D30363D30363D30363D30363D30363D30363D30363D31363E31363E 31363E31363E31363E31363E31363E31363E31373E32373F31373E31373E32373E31373E32373E 32373E31373E32373E31373F31373F32373F31373F32373F32373F31373F32373F32383F32383F 32383F32383F32383F32383F32383F32383F32383F32383F32383F32383F32384032383F323840 323840333840333840323840333840323840323840333940323840333940333940323840333940 323840323840323840323840323840323840323840323840323840323840323840323840323840 323840333840323840333840333840323840333841323840323840333840323840333840333840 323840333840323840323840333840323840333840333840323840333840323840323840323840 32384032384032383F33384032383F33384032383F32383F32383F32383F32383F32384032383F 32384032384032383F32384032383F31373F32383F31373F32383F32383F31373F32383F31373F 31373E31373F31373E31373E31373E31373E31373E31373E31373E31373E31363E31363E31363E 31363E31363E31363E31363E31363E31363E31363E30363D31363D30363D31363D31363D30363D 31363D30363D30363D31363E30363D31363E31363E30353D30353D30353D30353D30353D30353D 30353D2F353C30353C2F353C30353C30353C2F353C30353C2F353C2F353C30353D2F353C30353C 30353C2F353C2F343C2F343B2F343B2F353C2F343B2F353C2F353C2F343B2F353C2E343B2E343B 2E343B2E343B2E343B2E343B2E343B2E343B2E333A2E333A2E333A2E333A2E333A2E333A2F333B 2E333A2E333A2E333A2E333A2E333A2E333A2E333A2E333A2E333A2E333A2E333A2D333A2E333A 2D333A2D333A2E333A2D333A2E333A2E323A2D32392E323A2D32392D32392D32392D32392D3239 2D32392E32392D32392D32392D32392D32391C242B1C242B1C242C0E1013050202060606020202 141314BCBAB9FCF9F5F3F0ECF2EEEAF5F2EDD2CEC994908C9E9B97918F898988837C7E77777974 60625F1816191515181212151413171010121B1D1D3A403D666F6E5C6060000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 0000000000000000000000000B0B0B7B7C7E717472797C7C3C3E3F1618162426261B1E1E3D3E3D 888382938D8B948E8D989290A09B98A39E9DA49E9BCEC9C3F1EEE8F2EEEBF2EEECF3F0EDFCF9F6 949391030202060606060606050303090A0A1B22291D252C1C242B2D32392D32392D32392D3239 2D32392D32392D32392D32392D32392D32392D32392D32392D32392D32392D32392E333A2D333A 2E333A2E333A2D333A2E333A2D333A2E333A2E333A2E333A2E333A2E333A2E333A2E333A2E333A 2E333A2E333A2E333A2E333A2E333A2E333A2E333A2E333A2E333A2E333A2E333B2E343B2E343B 2F343B2E343B2F343B2F343B2E333B2F343B2F343B2F343B2F343B2F343B2F343B2F343B30353C 2F353C30353C30353C30353C30353C30353C30353C2F353C30353C2F353C2F353C2F343C2F353C 2F343C30353D30353D30353D30353D30353D30353D30353D30363D30363D31363D30363D31363D 31363D30363D31363D30363D30363D31363D30363D31363D31363D30363D31363D31363E31363E 31363E31363E31363E31363E31363E31363E31363E31363E31373E31363E31373E31373E32373E 31373E32373E32373F31363E32373F31373F31373F31373F31373F31373F31373F32373F31373F 32373F32383F32373F32383F32383F32383F32383F32383F32383F32383F32373F32383F32373F 32374032383F32374032384032384032383F323840323840323840333840323840333840333840 323840333840323840323840333840323840333840333840323840333840323840323840323840 323840323840323840323740323840323740323740323840323740323840323840333840323840 33384033384032374033384032374032374032384032374032383F32384032383F32384032383F 32383F32383F32383F32383F32383F32383F32383F32383F32383F32373F31373F31373F32373F 31373F31373F31373F31373F31373F31373F31373F31373F32373E31373F32373E32373E31373E 32373E31373E31373E32373E31373E32373E31363E31363E31363E31363E31363E31363E31363E 31363E30363D30363D30363D30363D30363D30363D30363D30363D30363D31363D30363D31363D 31363D30353D30353D30353D30353D30353D30353D30353D30353D30353D2F353C30353C30353C 30353C30353C30353C30353C2F353C30353C2F353C2F353C2F343C2F353C2F343C2F343C2F353C 2F343B2F343B2F343B2F343B2F343B2F343B2F343B2F343B2E343B2F343B2F343B2E343B2F343B 2E343B2E333A2F333A2E333A2F333A2F333A2E333A2F333A2E333A2E333A2E333A2E333A2E333A 2E333A2E333A2E333A2E333A2E333A2E333A2E333A2D333A2D333A2E333A2D333A2E333A2E333A 2D323A2E333A2D32392D32392D32392D32392D32392D32392E32392D32392E32392E32392E3239 2D32392D32392D32392D32391C242B1C242B1C242C0E1013050202060606020202141313BCBABA FCF9F5F3F0EDF2EFEBF6F2EDD2CCC893908C9C9B96928F8A8987837B7D78787B745C5D5B151417 161619121316131315100F121C1D1D39413D656F6E5B6060000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 0000000000000B0B0B777A7A717575797A7B3F3E3F1618182426251C1E1D3C3C3C888381948D8C 938E8C9894909F9B97A39E9CA59E9CD5CFCBF3F1ECF2EFEAF2EEEBF4F0EDFCF9F6959492020202 060606060606050303090A0A1B22291D252C1C242B2D32392D31382D31382D31392D32392D3139 2D32392D32392D32392D32392D32392D32392D32392D333A2D32392D32392D333A2D32392D3239 2D32392D32392D32392D32392D323A2D32392E333A2E333A2D33392E333A2D33392D33392E333A 2D33392E333A2E333A2E333A2E333A2E333A2E333A2E333A2E333A2E333A2E333B2E333A2E333B 2E333A2E333A2E343B2E333A2F343B2F343B2F343B2F343B2F343B2F343B2F343B2F343B2F343B 2F343B2F353C2F343B2F353C2F353C2F343B2F353C2F343C2F343C2F343C2F343C2F343C2F343C 2F353C2F343C30353D30353D30353D30353D30353D30353D30353C30363D30353C30353C30353C 30353C30353C30353C30353D30363D30363D30363D30363D30363D30363D30363D30363D30363D 31363E31363E31363E31363E31363E31363E31363E31373E31363E31363E31363E31363E31363E 31363E31373E31363E31373E31373F31363E31373F31373F31373F31373E31373F31373E31373E 31373F31373E31373F31373F32373F32383F32373F32373F32373F32373F32373F32373F32383F 32373F32383F32383F32383F32383F32383F32383F32373F32384032373F32373F32373F32373F 32373F32373F32374032373F32374032374032373F32374032373F32373F32374032373F323740 32374032384032374032383F32384032374032383F32374032373F32373F32374032373F32373F 32384032373F32383F32383F32373F32383F32373F32373F32373F32373F32373F32373F32383F 32373F32383F31373F31373E32383F31373E31373E31373F31373E31373F31373F31373F31373F 31373F31373F31373F31373E31373E31373E31363E31373E31363E31363E31363E31363E31363E 31363D31363E31363D31363E31363E30363D31363E30363D30363D30363D30363D30363D30363D 30363D30363D30363D30363D30363D30363D30353D30353D30353C30353D30353C30353C30363D 30353C30353D30353D30353D30353D30353D30353D2F343C2F343C2F343C2F343C2F353C2F343C 2F353C2F353C2F343C2F353C2F343B2F343B2F343C2F343B2F343C2F343B2F343B2F343B2F343B 2F343B2F343B2F343B2E343B2F343B2E333A2E343B2E333A2E333A2E333A2E333A2E333A2E333A 2E333A2E333A2E333A2E333A2E333A2E333A2E333A2D33392E333A2D33392E333A2E333A2E333A 2E333A2E333A2E333A2D323A2D333A2D323A2D323A2D32392D323A2D32392D32392D333A2D3239 2D32392D32392D32392D32392D32392D32392D32392D32392D31382D31382D32392D31382D3239 2D32392D31381C242B1C242B1C242C0E1013050202060606020202141314BCBAB9FCF9F5F3F0ED F2EFECF5F2EDD1CDC893908E9D9A99908E8A8889827A7E78797D755A5D58131416151418121216 1614181010131B1D1E37413E626C6D585F60000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 0B0B0B777B7B6F7474787B7C3C3B3D1518162426251B1D1E39393986827F948E8B958F8D999491 9E9997A39E9BA59E9BD5CFCCF3EFEBF1EEEAF1EEEBF3EFEDFCF9F6949391030202060606060606 050303090A0A1B22291D252C1C242B2C31382D31392D31392C31382D31392D32392C31382D3239 2D32392D32392D32392D32392D32392D32392D32392D32392D32392D32392D323A2D32392D323A 2D32392D32392D323A2D32392E333A2E333A2E333A2E333A2E333A2E333A2D33392E333A2D3339 2D33392E333A2E333A2E333A2E333A2E333A2E333A2E333A2E333A2E333A2E333B2E333A2E333A 2E343B2E333A2E343B2E343B2F343B2E343B2F343B2F343B2E343B2F343B2E343B2F343B2E343B 2F343B2F343B2F343B2F343C2F343B2F343C2F343C2F343C2F343C2F343C2F343C2F343C2F343C 2F343C2F353C2F353C2F353C2F353C2F353C30353D2F353C30353D30353D30353C30353D30353C 30353C30353D30363D30353D30363D30363D30363D30363D30363D30363D30363D30363D30363D 30363D30363D31363D31363D31363E31363D31363E31363E30363D31363E31363E31363E31373E 31363E31373E31373E31363E31373E31363E31363E31363E31373F31373E31373E31373E31373E 31373E31373E31373F31373E31373F31373F31373E32373F31373F31373E31373F31373F31373F 31373F31373F31373F31373F31373F32373F31373F32373F32373F31373F32373F31373F31373F 32373F31373F32373F32373F32373F32373F32373F32373F31373F32373F31373F31373F32373F 31373F32373F32373F32373F32373F32373F32373F31373F32373F31373F31373F32383F31373F 32383F32383F32373F32383F32373F32373F31373E32373F31373F31373F31373E31373F31373E 31373E31373F31373E31373F31373F31373E31373F31373E31363E31373E31363E31363E31363E 31363E31363E31363E31363E31363E31363E31363E31363E30363D31363E30363D30363D31363E 30363D31363E31363E31363E30363D30363D30363D30363D30363D30363D30363D30363D30363D 30353C30363D30353D30353C30353D30353D30353C30353D2F353C2F353C30353D2F353C30353D 30353D2F343C30353D30353D2F343C2F343C2F343C2F343C2F343C2F343C2F343B2F343C2F343B 2F343C2F343B2F343C2F343C2F343B2F343C2F343B2E343B2E343B2E343B2E343B2E343B2E343B 2E343B2E333A2E333A2E333B2E333A2E333B2E333A2E333A2E333A2E333A2E333A2E333A2E333A 2E333A2E333A2E333A2E333A2E333A2E333A2D33392E333A2D33392D33392E33392D33392D3239 2D32392D323A2D32392D323A2D323A2D32392D323A2D32392D32392D32392D32392D32392D3239 2D32392D32392D32392D32392D32392D32392C31382C31382C31382C31382C31382C31382D3139 1C242B1C242B1C242C0E1013050202060606020202141313BCBABAFCF8F5F2EFECF1EEEBF5F2ED D1CEC993908C9C9B97908E8A888783797D767A7D79595C5910121517171A141418151518101014 1A1C1D39403D626C6C5D6363000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF0000000000000000000000000000000000000000000000000000000000000B0B0B747879 7075767D7D7E3D3E3E1717172426261C1E1E363636847F7C948E8B948E8D9993919F9996A39D9B A29B97D3CEC9F4F0EDF2EEEBF2EEECF3F0EDFCF9F5959392020202060606060606050303090A0A 1B22291D252C1C242B2C31382C31382C31382D31382C31382D31382D31382C31382D31382D3239 2D32392D32392D32392D32392D32392D32392D32392D32392D32392D32392D32392D32392D3239 2D32392D32392D32392D32392D32392D33392D32392D32392D33392D32392D33392E333A2D3339 2E333A2E333A2E333A2E323A2E333A2E323A2E323A2E333A2E333A2E333A2E333A2E333A2E333A 2E333A2E333A2E333A2E333A2E343B2E343B2F343B2E343B2F343B2F343B2E343B2F343B2F343B 2F343B2F343B2F343B2F343B2F343C2F343B2F343B2F343C2F343C2F343C2F343C2F343C2F343C 2F353C2F343C2F353C2F353C2F353C2F353C2F353C2F353C30353C30353C30353C30353C30353C 30353C30353C30353C30353D30353C30353D30353D30363D30353D30363D30363D30363D30363D 30363D30363D30353D30363D30353D30353D30363D30353D30363D30363D31363E31363E31363E 31363E31363E31363E31363E31363E31363E31363E31363E31363E31363E31373E31363E31373E 31373E31373E31373E31373E31373E31373E31373E31373E31373E31373E31373F31373F31373F 31373E31373E31373F31373F31373F31373F31373F31363F31373F31363F31363F31373F31363F 31373F31373F31363F31373F31363F31363F31373F31363F31373F31373F31373F31373F31373F 31373F31363F31373F31363F31363F31373F31363F31373F31373F31363E31373F31363E31363F 31373E31363E31373E31373E31373E31373E31373E31373E31373E31373E31373E31373E31373E 31363E31363E31373E31363E31363E31363E31363E31363E31363E31363E31363E31363E31363E 31363E30363D30363D30363D30363D30363D30353D30363D30353D30353D30363D30353D30363D 30363D30353D30363D30353D30353D30363D30353D30363D30353C30353C30353C30353C30353C 30353C30353C30353C30353C2F353C2F343C2F353C2F353C2F343C2F353C2F343C2F343C2F353C 2F343C2F343C2F343C2F343C2F343C2F343C2F343C2F343C2F343B2F343B2F343B2F343B2E343B 2E343B2F343B2F343B2E343B2F343B2F343B2E343B2F343B2E343B2E333A2E343B2E333A2E333A 2E333A2E333A2E333A2E333A2E333A2E323A2E333A2E323A2E323A2E333A2E323A2E333A2E333A 2E323A2D33392D32392D32392D33392D32392D33392D33392D33392D32392D32392D32392D3239 2D32392D32392D32392D32392D32392D32392D32392D31392D32392D31392D31392D32392D3139 2D32392D32392D32392D32392D31382D31382C31382D31382C31382C31382C31381C242B1C242B 1C242C0E1013050202060606020202141313BCBABAFCF8F5F2EFEBF1EEEAF4F2ECD2CEC994908B 9C9A96908E8A8989847B7D797B7F7B595A5812121617191A1716191615191010141C1D1E3C433E 636D6C606465000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 0000000000000000000000000000000000000000000000000000000B0B0B7478787073767C7E80 3F3F3E1516162526271C1F1E373737847F7D958D8C948E8C9892909F9996A39E9CA49E9BD3CDCA F4F0ECF2EEEBF2EFEBF2EFECFCF8F6959492020202060606060606050303090A0A1B22291D252C 1C242B2C31382C31382C31382C31382C31382C31382C31382C31382D31392D32392D32392C3138 2D32392C31382C31382D31392C31382D32392D31392D32392D32392D32392D32392D32392D3239 2D32392D32392D32392D32392D32392D32392D33392D32392D33392D33392D33392E333A2E333A 2E333A2E323A2E333A2E323A2E323A2E333A2E323A2E333A2E333A2E333A2E333A2E333A2E333A 2D333A2E333A2D333A2D333A2E333A2E333A2E333B2E333B2E333B2E333B2F333B2F333B2E333A 2F333B2E333B2E333B2F333B2E333B2F343C2F333B2F343C2F343C2F343C2F343C2E343B2F343C 2E343B2F343B2F343C2F343B2F343C2F343C2F353C2F343C2F353C30353C30353C30353C30353C 30353C30353C30353C30353C30353D30363D30353D30363D30363D30363D30363D30363D30363D 30353D30363D30353D30353D30363D30353D30363D30363D30353D30363D30353D31363E30353D 31363E30363D30363D31363E30363D31363E31363E31363E31363E31363E31363E30363D31363E 30363D30363E31363E30363E31363E31363E31373E31363E31373E31373E30363E31373E30363E 30363E31363E30363E31363E31363E31373E31363E31373E31373E31363E31373E31363F31363E 31363F31363F31363E31363E31373E31363E31373E31373F31373F31373E31373E31373E31363E 31373E31363E31363E31373E31363E31373E31373E31363E31373E31363E31363E30363E31363E 30363E30363E31363E30363E31363E31363E31363E31363E31363E31363E30363D31363E30363D 30363D31363E30363D31363E31363E31363E31363E30363D30363D30353D30363D30353D30353D 30353D30353D30353D30353D30363D30353D30363D30363D30353D30363D30353D30353D30353D 30353D30353C30353D30363D30353C30353C30353C30353C30353C30353C30353C2F343C30353C 30353C2F343C2F353C2F343C2F353C2F353C2F343C2F343C2F343C2F343C2E343B2F343C2E343B 2E343B2F343C2E333B2F333B2F333B2F333B2F333B2F333B2F333B2E333B2F333B2E333A2E333A 2E333B2E333A2E333B2E333B2E333A2E333B2E333A2E333A2D333A2E333A2D333A2D333A2E333A 2D32392E333A2E333A2E333A2E323A2E333A2E333A2E323A2E333A2E323A2D32392D32392D3239 2D32392D32392D33392D32392D33392D33392D32392D32392D32392D32392D32392D32392D3239 2D31392D32392D31392D32392D32392D31392D32392D31392D31392C31382D31392C31382C3138 2D31392C31382C31382C31382C31382C31382C31382C31382C31381C242B1C242B1C242C0E1013 050202060606020202141314BCBAB9FBF8F5F2EFECF1EEEAF5F2EDD3CFCA96928D9B9A97908F8B 8A8A857B7D7A7D817B585B5912101417171917161A1516191212151C1D1F3B413E636D6C575C5C 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 0000000000000000000000000000000000000000000B0B0B7478797276777C80803B3D3C151817 2427271D1F1F36363684807E958E8C96908E999391A09A98A49F9EA5A09DD3CECAF4F1ECF2EFEB F2EEEBF2EFECFCF9F6959492020302060606060606050303090A0A1B22291D252C1C242B2C3138 2C31382C31382C31382C31382C31382C31382C31382C31382D31382C31382D31392D31382D3139 2D31392C31382D31392C31382C31382D31392C32382D32392D32392C32382D32392C32382C3238 2D32392C32382D32392D32392D32392D32392D32392D32392D32392D32392D32392D32392D3239 2D32392D32392D32392E323A2D32392E323A2E333A2D333A2E323A2D333A2D333A2E333A2D333A 2E333A2E333A2E333A2E333A2E333B2E333B2E333A2E333B2E333A2E333A2E343B2E333A2F343B 2F343B2E333B2F343B2E333B2E333B2F333B2E333B2F343B2F343B2F343C2F343B2F343C2F343C 2E343B2F343C2E343B2F343B2F343C2F343B2F343C2F343C2F343B2F343C2F353C2F353C30353C 2F353C30353C30353C2F353C30353C2F353C2F353C2F353C2F353C2F353C2F353C2F353C2F353C 2F353C2F353C30353D2F353C30353D30353D30353D30353D30353D30353D30353D30353D30353D 31363E31363E30353D31363E30353D30363D31363E30363D30363D31363E30363D31363E31363E 30363D31363E30363D30363D31363E30363E31363D31363E31363E31363E31363E31363E30363E 31363E30363E30363E31363E30363E31363E31363E30363E31363E30363E30363E31363E30363E 31363E31363E30363E31363E30363E30363E30363E30363E30363E30363E30363E30363E30363E 30363E31363E30363E31363E31363E30363E31363E30363E30363E31363E30363E31363E31363E 31363E31363E31363E31363E30363D31363E30363D30363D31363E30363D31363E31363E30363D 31363E30363D30353D30353D30353D30353D30353D30353D30353D30353D30353D30353D30353D 30353D30353D30353D2F353C30353D30353D2F353C30353D2F353C2F353C30353C2F353C30353C 30353C2F353C30353C2F353C2F353C2F353C2F353C2F353C2F343B2F343B2F343B2F343B2F343B 2F343C2F343B2F343C2F343C2F343B2F343C2E343B2E343B2F343C2E343B2F343C2F343C2F333B 2F333B2F333B2F333B2E333B2F333B2E333B2E333A2E343B2E333A2E343B2E343B2E333A2E343B 2D333A2E333A2E333A2D333A2E333A2E333A2E333A2E333A2E333A2E333A2D333A2E323A2D3239 2D32392E323A2D32392E323A2E323A2D32392D32392D32392D32392D32392D32392D32392D3239 2D32392D32392C32382C32382C32382C32382C32382C32382C32382C32382C31382C31382D3239 2C31382D31392D31392C31382D31392C31382C31382C31382C31382D31392C31382C31382C3138 2C31382C31382C31382C31382C31382C31382C31381C242B1C242B1C242C0E1013050202060606 020202141414BCBBB9FBF8F4F3F0ECF1EEEBF5F2EDD3D0CB96928C9C9A9592908B8A88867C7C7B 7E837C565A570F0D1217181A1616191616191312161C1F1F373E3B626B685B605F000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 0000000000000000000000000000000B0B0B7477787276767D81823C3D3D1617172426261D1F1E 333435837F7D948D8B96908E9A9592A19B99A59F9EA5A09ED4CFCBF5F1EDF2EEEAF2EFEBF3EFED FCF9F6959392020202060606060606050303090A0A1B22291D252C1C242B2C31382C31382C3138 2C31382C31382C31382C31382C30382C31382C30382C30382C31382C31382C31382C31382C3138 2C31382C31382C31382C32382C31382C32382C32382C32382C32382C32382C32382C31382C3238 2C31382D31392C32382D31392D32392D32392D32392D32392D32392D32392D32392D32392D3239 2D32392E32392D32392E32392E32392D32392E333A2D333A2D333A2D333A2D333A2D333A2D333A 2D323A2D333A2E333A2D323A2E333A2E333A2E333A2E333A2E333A2E333A2E333A2E333A2F333B 2E333B2F333B2F333B2E333B2F333B2E333B2E333B2E343B2E333B2E343B2E343B2E343B2E343B 2E343B2E343B2F343B2F343B2F343B2F343B2F343B2F343B2F343B2F343B2F343B2F353C2F343C 2F343B2F353C2F343C2F353C2F353C2F353C2F353C2F353C2F353C2F353C2F353C2F353C2F353C 30353C2F353C30353C30353C30353D30353D30353D30353D30353D30353D30353D30353D30353D 30353D30353D30353D30353D30353D30363D30363D30363D30363D30363D30363D31363D30363D 31363D31363D30353D31363D30353D30353D30363D30353E30363E30363D30363D30363E30363E 30363D30363E30363E30363E30363E30363D30363D30363E30363E30353E30363E30353E30353E 30363E30353E30363E30363E30363E30363E30363E30363E30363D30363D30363D30363D31363E 30363E31363E31363E30363D31363E30363D30363E30363D30363D30363D30363D30353D30363D 30353D30353D30363D30353D30363D30363D30363D30363D30363D30363D30353D30353D30353D 30353D30353D30353D30353D30353D30353D30353D2F353C30353D30353D2F353C2F353C2F353C 2F353C2F353C2F353C2F353C2F353C2F353C2F353C2F353C2F343C2F353C2F343C2F343C2F353C 2F343C2F353C2F343B2F353C2F343B2F343B2F343B2F343B2F343B2F343B2F343B2F343B2E343B 2F343B2F343B2E343B2F343B2E343B2E343B2E343B2E343B2E333B2E333B2E333B2E333B2E333B 2E333B2E333A2E333A2E333A2E333A2E333A2E333A2E333A2E333A2E333A2D333A2E333A2E333A 2D323A2E333A2D323A2D323A2D333A2D323A2D32392D32392D32392D32392D32392D32392D3239 2D32392D32392D32392D32392D32392D32392D32392D31392D32392D31392D31392C32382C3138 2C32382C32382C32382C32382C32382C32382C32382C32382C31382C31382D31382C31382D3138 2D31382C31382D31382C31382C31382C31382C31382C31382C31382C30382C31382C30382C3038 2C31382C30382C31382B30372B30371C242B1C242B1C242C0E1013050202060606020202151515 BDBCBAFAF7F4F2EFECF2EFEBF4F1ECD5D0CC97928D9C9A9592908B8988877B7C787C8079535652 0D0D1218181B17171A17161A1312151D202039423C636B6A5B5F60000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 0000000000000000000B0B0B7679797275757C81823D40401617162426261D201F323233827E7C 958E8C948E8C9A9592A09A99A49E9DA7A19ED5D0CBF4F1EDF3EEEBF2EFECF3F0EDFBF8F5949291 020202060606060606050303090A0A1B22291D252C1C242B2B30372B30372C30382C30382C3038 2C30382C30382B30372C30382B30372B30372C30382B30372C30382C31382C31382C31382C3138 2C31382C31382C31382C31382C31382C31382C31382C31382C31382C31382C31382C31382C3138 2C32382D31392C32382D32392D31382D32392D31382D31382D32392D31382D32392D32392C3239 2D32392C32392C32392D32392C32392D32392D32392D333A2D32392D333A2D333A2D323A2D333A 2D323A2D323A2D32392D323A2D333A2D333A2E333A2D333A2E333A2E333A2E333A2E333A2E333B 2E333B2D333A2E333B2D333A2D333A2E333B2E333A2E333B2E333B2E343B2E333B2E343B2E343B 2E333A2E343B2F343B2F343B2F343B2F343B2F343B2F343B2F343B2F343B2F343B2F343C2F343B 2F343C2F353C2F353C2F343B2F353C2F343B2F343B2F353C2F343B2F353C2F353C2F343C2F353C 2F343C2F343C2F343C2F343C2F343C2F343C2F353C30353D30353D30353D30353D30353D30353D 30353D2F353C30353D2F353C2F353C30353D2F353D30353D30353D30353D30353D30353D30353D 2F353D30353D2F353D2F353D30353D2F353D30353D30353D30363D30353D30363D30363D30353D 30363D30353D30353D30353D30353D30353D30353D30353D30353D30353D30353D30363D30353D 30363D30363D30353D30363D30353D30353D30363D30353D30363D30363D2F353D30363D2F353D 2F353D30353D2F353D30353D30353D30363D30353D30363D30363D30353D30353D30353D30353D 2F353D30353D2F353C2F353C30353D2F353C30353D30353D30353D30353D30353D30353D2F353C 30353D2F353C2F353C30353D2F353C2F343C2F343C2F353C2F343C2F353C2F353C2F343C2F353C 2F343C2F343C2F343C2F343B2F343C2F343C2F343C2F343C2F343C2F343C2F353C2F343B2F343B 2F343B2F343B2F343B2F343B2F343B2F343B2F343B2F343B2E343B2E333A2E343B2E333A2E333A 2E333B2E333A2E333B2E333B2E333B2E333B2E333B2E333B2E333B2E333B2E333B2E333B2D333A 2E333A2D333A2D333A2E333A2D333A2E333A2E333A2D323A2D323A2D323A2D323A2D32392D323A 2D32392D32392D32392C32392D32392D32392D32392D32392D32392D32392D31382D32392D3138 2D31382D31392D31382D31392D31392D31392D31392C31382D31392C32382C31382C32382C3238 2C31382C32382C31382C31382C32382C31382C32382C31382B31382C31382B31382B31382C3138 2B31382C30382C30382C31382C31382C31382C31382C30382C31382C30382C30382B30372C3038 2B30372B30372B30371C242B1C242B1C242C0E1013050202060606020202151516BDBCBBFBF8F4 F2EFECF1EEEAF5F2EDD5D2CD95918B9B9995918F8B8987857C7E797C81794F524F10101317181A 1616191618191312151F202139403B626A6A5C6063000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 0000000B0B0B7879797476768083844043431518172325261D20203032327F7B7A948E8C938E8C 999391A09B98A39E9DA6A19ED7D1CCF5F2EEF1EFEAF2EEEBF3F0EDFCF8F6959391020202060606 060606050303090A0A1B22291D252C1C242B2B30372B30372C30382C30382C30382C30382C3038 2C30382C30382C30382C30382B31382C31382B31382B30372B30372B31382B31382B31382C3138 2B31382C31382C31382C31382C31382C31382C31382C31382C31382C31382C31382C31382C3138 2C31382C31382D31392C31382D31392D31392C31382D31392C31382C31382D31382C32392D3239 2D32392D32392D32392D32392D32392C32392D32392D32392D32392D323A2D32392D323A2D323A 2D32392D323A2D32392D333A2E333A2D333A2E333A2E333A2E333A2E333A2E333A2E333A2E333A 2E333B2E333B2E333B2D333A2E333B2D333A2D333A2E333A2E333A2E333A2E333A2E333B2E333A 2E333B2E333B2F343B2F343B2F343B2F343B2E343B2F343B2E343B2E343B2E343B2E343B2E343B 2E343B2F343C2E343B2F343C2F343C2E343B2F343C2E343B2E343B2F343C2E343B2F343C2F343C 2F343C2F343C2F343C2F343C2F343C2F343C2F343C2F343C2F343C2F343C2F343C30353D2F353C 30353D2F353C2F353C30353D2F353C30353D30353D30353D30353D30353D30353D30353D30353D 30353D30353D2F353C30353D2F353D2F353D2F353D2F353D2F353D2F353D30353D2F353D30353D 30353D30353D30353D30353D30353D2F353D30353D2F353D2F353D2F353D2F353D2F353D2F353D 30353D2F353D30353D30353D2F353D30353D2F353D2F353D30353D2F353D30353D30353D30353D 30353C30353D30353D2F353C30353D2F353C2F353C30353D2F353C30353D30353D2F353C30353D 2F353C2F353C30353D2F353C30353D30353D30353D30353D2F343C2F343C2F343C2F343C2F343C 2F343C2F343C2F343C2F343C2F343C2E343B2F343C2F343C2F343C2F343C2E343B2F343C2F343C 2F343C2F343C2F343C2F343C2E343B2F343C2E343B2E343B2E343B2E343B2E343B2E343B2F343B 2E343B2F343B2F343B2E333A2E333B2E333A2E333A2E333A2E333A2E333A2E333A2E333B2E333A 2E333B2E333B2D333A2E333B2D333A2D333A2E333A2D333A2E333B2E333A2D333A2E333A2D333A 2D333A2E333A2D333A2D323A2D323A2D323A2D323A2D323A2D323A2D323A2D323A2D323A2D3239 2C32392D32392C32392C32392C32392C32392C32392C32392D32392C31382D31392D31392D3139 2D31392D31392D31392C31382C31382C31382C31382C31382C31382C31382C31382C31382C3138 2C31382C31382B31382C31382B31382B31382C31382B31382C31382C31382C31382C30372C3138 2C30382B30372C30382B30372B30372C30382B30372C30382C30382B30372B30372B30372B3037 2B30371C242B1C242B1C242C0E1013050202060606020202151516BDBCBBFAF7F4F2EFECF1EEEA F4F1EDD6D2CD97928B9C9A97918F8D8788837C7E787E817D4C4E4B10101218191916171918191A 1514171F2021393F3D60696B585F60000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000B0B0B 7477777274757B807E3F3F3F1517182326261E20203032317D7978938D8C948E8D989290A09A98 A49E9DA59E9BD3CEC9F4F1EDF2EFEBF2EFECF3EFECFCF8F6959492020202060606060606050303 090A0A1B22291D252C1C242B2B30372B30372B30372B30372B30372B30372B30372B30372B3037 2B30372B30372B30372B30372B30372B31382C30382B31382C31382C31382B30382C31382B3038 2B30382B31382B30382B31382C31382C31382C31382C31382C31382C31382C31382C31382C3138 2C31382C31382C31382C31382C31382C31382C31382C31382C31382C31382C31382C32392C3139 2C32392C31392C31392C32392C31392C32392D32392C32392D32392D32392D32392D32392D3239 2D32392D32392D32392D32392D333A2D333A2D323A2D333A2D323A2D323A2D323A2D323A2D323A 2D323A2D333A2D323A2D333A2D333A2E333B2D333A2E333B2E333B2E333A2E333B2E333A2E333A 2E333A2E333A2E333A2E333A2E333A2E333A2E333B2E333B2E343B2E333B2E343B2E343B2E333B 2E343B2E333B2E333B2E333B2E333B2E333B2E333B2E343B2E333B2E343B2E343B2E333B2E343B 2F343C2E333B2F343C2F343C2F343C2F343C2F343C2F343C2F343C2F343C2F343C2F343C2F343C 2F343C2F343C2F343C2F353C2F353C2F343C2F353C2F343C2F343C2F343C2F343C2F343C2F343C 2F353C2F343C2F353C2F353C30353D2F353C30353D30353D2F343C30353D2F343C2F353D2F353C 2F343C2F353D2F353C2F353D2F353C2F353D2F353D2F353D2F353D2F353D2F353D2F343C2F353D 2F343C2F353D2F343C2F343C2F353D2F343C2F353C2F343C2F353C2F353C2F343C2F353C2F343C 2F343C2F353C2F343C2F353C2F353C2F353C2F353C2F353C2F353C2F343C2F353C2F343C2F343C 2F353C2F343C2F343C2F353C2F343C2F343C2F343C2F343C2F343C2F343C2F343C2F343C2F343C 2F343C2F343C2E343B2F343C2E343B2F343C2F343C2E333B2F343C2E333B2E333B2E343B2E333B 2E343B2E343B2E333B2E343B2E333B2E333B2E343B2E333B2E333A2E343B2E333B2E333A2E333A 2E333A2E333A2E333A2E333A2E333A2D333A2D323A2D333A2D333A2D323A2D333A2D323A2D323A 2D333A2D323A2D333A2D333A2D333A2D333A2D333A2D333A2D323A2D333A2D323A2D323A2D3239 2D32392D32392D32392D32392D32392D32392D32392D32392D32392C31392D32392C32392C3139 2C32392C32392D32392C32392D32392D31392C31382D31392C31382C31382C31382C31382C3138 2C31382C31382C31382C31382C31382C31382C31382C31382C31382C31382C31382C31382B3038 2B30382B30382B30382B30382B31382B30382B31382B30372B30372B31382B30382B30382B3037 2B30372B30372B30372B30372B30372B30372B30372B2F372B30372B30372B2F372B30371C242B 1C242B1C242C0E1013050202060606020202151616BDBCBBFAF8F3F2EFEBF2EEEBF5F2EDD7D2CE 96908B9B99958F8F8B8888847C7E7A7E807D494B4810101219191B17161919181B1414171F2121 39403C5E6868585F5F000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 0000000000000000000000000000000000000000000000000000000000000B0B0B737678707576 7B817E3E3F3E1718182426271D20203132327F7B7A948D8C948E8D9794909E9997A59F9EA49D9B D0CCC7F5F2EDF2EEEBF2EFEBF3F0ECFCF9F6959492020202060606060606050303090A0A1B2229 1D252C1C242B2B2F372B30372B30372B2F372B30372B30372B30372B30372B30372B30372B3037 2B30372B30372B30372B30372B30372B30382B30382B30382B31382B30382B31382B31382B3038 2B31382B30382B30382B31382B30382C31382C31382C31382C31382C31382C31382C31382C3138 2C31382C31382C31382C31382C31382C31382C31382C31382C31382C32392C31392C32392C3139 2C31392C32392C31392C32392C32392C31382D32392C32392C32392D32392C32392D32392D3239 2D32392D32392D32392D333A2D32392D333A2D323A2D323A2D323A2D323A2D323A2D323A2D323A 2D323A2D323A2D323A2D323A2D323A2D323A2E333A2E333A2E333A2E333A2E333A2E333A2E333A 2E333A2E333A2E343B2E333A2E343B2E333A2E333B2E343B2E333B2E333B2E333B2E333B2E333B 2E333B2E343B2E333B2E343B2E343B2E343B2E343B2E343B2E343B2E333B2E343B2E333B2E333B 2E343B2F343C2F343C2F343C2E333B2F343C2E343B2E343B2F343C2E343B2F343C2F343C2F343C 2F343C2F343C2F343C2F343C2F343C2F343C2F343C2F343C2F343C2F343C2F343C2F343C2F343C 2F343C2F343C2F343C2F343C2F343C2F343C2F353C2F343C2F353C2F353C2F343C2F353C2F343C 2F343C2F353C2F343C2F353C2F353C2F343C2F353C2F343C2F343C2F343C2F343C2F343C2F343C 2F353C2F343C2F353C2F353C2F353C2F353C2F353C2F353C2F343C2F353C2F343C2F343C2F353C 2F343C2F353C2F343C2F343C2F343C2E343B2F343C2F343C2E343B2F343C2F343C2F343C2F343C 2F343C2F343C2F343C2F343C2F343C2F343C2F343C2F343C2F343C2F343C2F343C2F343C2E333B 2E333B2E333B2E333B2E333B2E333B2E343B2E333B2E343B2E343B2E333B2E343B2E333B2E333B 2E343B2E333B2E343B2E343B2E333A2E343B2E333A2E333A2E333A2E333A2E333A2E333A2E333A 2E333A2D333A2D333A2D333A2D333A2D333A2D333A2D323A2D333A2D323A2D323A2D333A2D323A 2D333A2D333A2D32392D333A2D32392D32392D323A2D32392D32392D323A2D32392D32392D3239 2D32392D32392D32392D32392C31392D32392C31392C31392C31392C31392C31392C31392C3138 2C31392C31382C31392C31382C31382C31382C31382C31382C31382C31382C31382C31382C3138 2C31382C31382C31382C31382C31382C31382C31382B30382B30382B30382B30382B31382B3038 2B31382B31382B31382B31382B30372B30372B30372B30372B30372B30372B30372B30372B3037 2B30372B30372B30372A2F362A2F362B30372B30372B2F372B2F372B30371C242B1C242B1C242C 0E1013050202060606020202151616BDBCBBFBF7F3F3EFEBF1EEEAF4F1ECD6D2CE94908B999893 91908A8A88867C7E7C7E827C48484810101419191C17171A19191B1514171D20203B423E606B68 606764000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 0000000000000000000000000000000000000000000000000B0B0B7577797578797D82823E4141 171A192426271D20213032327F7B79948E8C948E8D9893919E9997A5A09EA39E9BD1CCC8F4F1ED F2EEEBF2EFECF3F0EDFCF9F6959392020202060606060606050303090A0A1B22291D252C1C242B 2B2F372A2F362A2E35292D35282C32262A30272B32272C32282C32272C32272C32282C32272C32 282C32282C32272C32282C32272C32272C32272C32272C32272C32272C32272C32272C32272C32 272C32282C33282C33282C33282C33282C33282C33282C33282C33282C33282C33282C33282C33 282C33282D34282D33282D33282D33282D33282D33282D33282D33282D33282D33282D33282D33 282D33282D33282D33292D34282D33292D34292D34292D34292D34292D34292D34282D34292D34 282D34282D34292E35282D34292E35292E35292E34292E35292E34292E342A2F362B30372C3139 2D31392D32392D323A2C32392C31382B30372A2F35272C32292E35292E35292E35292E35292E35 2A2E35292E352A2E352A2E35292E352A2E352A2F352A2F352A2F362A2F352A2F362A2F362A2F35 2A2F362A2F352A2F352A2F352A2F362A2F362A2F352A2F362A2F362A2F362A2F362A2F362A2F36 2A2F362A2F362B2F362A2F362B2F362B2F362B2F372B2F362B2F372B2F372A2F362B2F372A2F36 2A2F362B2F372A2F362B2F372B2F372A2F362B2F372A2F362A2F362B30372A2F362B30372B3037 2B30362B2F372A2F362A2F362B30362B30362B30362B30362B30362B30362B30362B30362B3037 2B30362B30372B30372B30362B30372B30362B30362B30372B30362B30372B30372B30362B2F37 2B30362B30362B30362B30362A2F362B30362B30362A2F362A2F362A2F362A2F362A2F362A2F36 2A2F362B2F372A2F362B2F372B2F372B2F372B2F372B2F372B2F372A2F362B2F372A2F362A2F36 2B2F372A2F362B2F362B2F372A2F362B2F362A2F362A2F362B2F362A2F362B2F362B2F362A2F36 2B2F362A2F352A2F362A2F352A2F362A2F352A2F352A2F352A2F352A2F352A2F352A2F362A2F35 2A2F362A2E352A2F352A2E35292E35292E352A2E35292E352A2E352A2E35292E352A2E35292E35 292E352A2F362B30372C31382C32392D32392D32392C32392C31382B3037292E35272C32292E34 292E35292E34292E35292E35292D34292E35292D34292D34282D34292D34282D34282D34292D34 282D34292D34292D34282D33292D34282D33282D33292D34282D33292D34292D34282D33282D34 282D33282D33282D33282D33282D33282D33282D33282C33282D33282D33282C33282C33282C33 282C33282C33282C33272C32272C32282C33272C32282C33282C33272C32282C33272C32272C32 272C32272C32272C32272C32272C32272C32272C32272C32272C32272C32272C32272C32282C32 272B32272B32282C32282C33292D352A2E362A2F362A2F361C242B1C242B1C242C0E1013050202 060606020202151516BDBCBBFBF8F4F2EFEBF0EEE9F5F3EDD6D2CE94908B9B9996918F8C898886 7E7E7C7D817B47484710101419191C17171A191B1C1515171E1F1F39403B5E6A655D6461000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 0000000000000000000000000000000000000B0B0B757979727576797C7C404242171918242627 1D20212F30317E7A78958F8D938E8D9893919D9997A49F9EA49E9CD2CECAF5F2EEF1EEEAF2EEEB F2EFECFCF8F6959492020202060606060606050303090A0A1B22291D252C1C242B2A2F362A2F36 292E35282C333D4045494C505A5D605C5F625A5C605A5C605A5C605A5C605A5C605A5C605A5C60 5A5C605A5C605A5C605B5D605A5C605A5C605B5D605B5D615B5D605B5D615B5D615B5D605B5E62 5B5D605B5D605B5D615B5D605B5E625B5E625B5D615B5E625B5D615B5D615B5D615B5D615C5E62 5B5D615B5D615C5E625C5E625C5E625C5F625C5E625C5F625D5F635D5F635D5F635D5F635D5F63 5D5F635D5F635D5F635D5F635D5F635D5F635D5F635D5F635D5F635D60645D5F635D5F635D6064 5D5F635E61645D60645E60645E61646063665F62664D50553D41472B31372B30382D31392D3239 2D323A2C32392B31382A3036474A4E686A6C7D7D7F8181827F7F817F7F817F8081808081808182 808182808182808182808182808182808081818283818182808081818283818182818283818283 818182818283818182818182818283828283828384828384828283828384828283828283828283 828283828283828283828283828283838384828283828384828283838485838485838384838485 838384838384838485838384838485838485838485838485838485838485838384838485838384 838384838485838384848586838485848485848586848485848485848586838384838485838485 838485838485838485838485848485838485848485848485838485848485838485838485838384 838485838384838384838485838384838485838485838384838485838384838384838384838384 838384838384838384838384838384838384828384838384828384838485828283828384828283 828283828384828283828384828384828384828384828384828384818182828384818182818182 818283818182818283818283818182818283818182818182818283818182808182808182808182 8081828081828081828080818081828080818080818081827F7F818181827D7E7F696A6C45484D 2C31382B30372C31382D32392D31392C31392B30372A2F364044484D50555F62665F62665E6064 5D5F635D60645D5F635D60645D60645D60645D60645D60645D60645D5F635D5F635D5F635D5F63 5D5F635D5F635D5F635D5F635D5F635C5F625D5F635C5E625C5F625C5E625C5F625C5F625C5E62 5C5F625C5E625C5E625B5D615B5D615B5D615B5D615B5D615B5D615B5D615B5D615B5D615B5D61 5B5E625B5D615B5D605B5D615A5C5F5A5C5F5A5C605A5C5F5A5C605A5C605A5C605A5C605A5C60 595B5F595B5F595B5F595B5F595B5F595B5F595B5F595B5F595B5F595B5F585B5E5A5D60595C5F 484B503A3E43292D34292E352A2E352A2F361C242B1C242B1C242C0E1013050202060606020202 161616BFBDBCFBF7F5F2EFEBF1EEE9F4F1EDD6D3CF95908C9B999591908C8987857D7E7C818480 4446431010131A1A1D18181B1B1B1D1514181F20203A413D5F6A685F6565000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 0000000000000000000000000B0B0B737678717575777C7C3C3F3F18191A2526271F2121303031 7C787695908E948E8D9893919D9997A49F9EA49E9BD1CCC7F5F2EDF2EEEBF2EFEBF2EFECFBF8F5 959392020202060606060606050303090A0A1B22291D252C1C242B2A2F362A2E35282D343A3D42 4F525642464B42464C42464C42464C42464B43474C42464C43474C43474C42464C43474C42464C 42464C43474D43474C43474D43474D43474D43474D43474D43474D43474C43474D43474C43474C 43474C43474C43474D43474D43484E43474D43484E43484E44484E43484E44484E44484E43474D 44484E44484E44484E44484E44484E44484E44484E44484E45494F44484E44484E44484E44484E 44484E44484E44484E44484E44484E45494F44484F45494F45494F45494F45494F45494F45494F 45494F45494F45494F45494F45494F464A5053575B43474C2A2F362B30382C31392C32392C3138 2A2F3643474B78787B79797B797A7C79797B797A7C797A7C797A7C797A7C7A7B7D797A7C7A7A7C 7A7B7D7A7A7C7A7A7C7A7B7D7A7A7C7A7B7D7A7B7D7B7C7D7A7B7D7B7C7D7B7C7D7B7C7D7B7C7D 7B7C7D7B7C7D7B7B7D7B7C7D7B7B7D7B7B7D7B7C7D7B7B7D7B7C7D7C7D7E7C7D7E7C7D7E7C7D7E 7C7D7E7C7D7E7C7D7E7C7D7E7C7D7E7C7D7E7C7D7E7C7D7E7C7D7E7C7D7E7D7E7F7C7D7E7D7E7F 7C7D7F7C7D7E7C7D7F7C7C7E7C7D7F7C7D7F7C7D7F7C7D7F7D7E7F7C7D7F7D7E7F7D7E7F7C7D7F 7D7E7F7C7D7F7C7D7F7C7E7F7C7D7F7C7E7F7C7E7F7D7E7F7C7E7F7D7E7F7D7E7F7C7D7F7D7E7F 7C7D7F7C7D7F7D7E7F7C7D7F7D7E7F7D7E7F7D7E7F7D7E7F7D7E7F7D7E7F7D7E7F7D7E7F7D7E7F 7D7E7F7C7D7F7D7E7F7C7D7F7C7D7F7D7E7F7C7D7F7D7E7F7D7E7F7D7E7F7C7D7E7C7D7E7D7E7F 7C7D7E7D7E7F7C7D7E7C7D7E7C7D7E7C7D7E7C7D7E7C7D7E7C7D7E7C7D7E7C7D7E7C7D7E7C7C7E 7C7D7E7B7B7D7C7C7E7C7C7E7B7B7D7B7B7D7B7B7D7B7C7D7B7B7D7B7C7D7B7C7D7B7B7D7B7C7D 7A7A7C7B7B7D7A7B7D7A7A7C7B7C7D7A7B7D7A7B7D7A7B7D7A7B7D7A7B7D7A7A7C7A7B7D7A7A7C 79797B797A7C7A7A7C7A7B7D797A7C797A7C797A7C797A7C797A7C797A7C78797A494C502B3037 2B30382C31392D31392B30372A2F363D414653565B45494F45494F45494F45494F45494F45494F 45494F45494F45494F45494F45494F45494F45494F44484F44484E44484F44484F45494F44484F 45494F45494F44484E44484E44484E44484E44484E44484E44484E44484E44484E44484E43484E 43484E44484E43484E44484E44484E43474D44484E43474D43474D44484E43474D43474D43474D 43474C43474D43474C43474C43474C43474C43474C43474C43474C43474C42464C42464C42464C 42464C42464C42464C42464C42464C42464C42464B42464C42464B42464B42464C42464C4F5356 3F4247292E34292E352A2F361C242B1C242B1C242C0E1013050202060606020202171717C0BEBC FBF7F4F2EFEAF2EEEAF5F2EDD7D2D096908D9B9C9790918B8887847D7F7B848783454746101015 1A1A1D17181B1A1A1D1515171F21213A403C5D66675D6365000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 00000000000009090B727677707676777C7C3D403F181A1A2426271F22222E2F2F7A767595908F 948E8E9893919E9896A49F9DA49F9DD2CDCAF5F2EDF2EFEBF2EFEBF3EFECFBF8F5959493020302 060606060606050303090A0A1B22291D252C1C242B2A2E36292E35272C33474A4E40454B40454B 41464B40454B41454B41464B41454B41464B41454B41454B41454B41454B41454B41454B41464B 41454B41454B41454B41464B41454B41464B41464B41464C41464B41464C41464C41464B41464C 42464C42464C42474C42464C42474C42474C42464C42474C42464C42464C42464C42464C42474D 42474D42474D42474D42474D42474D42474D42474D42474D42474D43474E43474D43474E43474E 43484E43474E43484E43484E43474D44484E43484E43484E43484E43484E43484E43484E44484E 43484E44494F44484E44484E44494F4D51552A2F362B30372C31392C31392B3037292E35656769 77787A78797B78797B78797B78797B78797B78797B78797B797A7B797A7B797A7B797A7B797A7B 797A7B797A7B797A7B797A7B797A7B797A7B797A7B797A7B7A7B7C7A7B7C7A7B7C7A7B7C7A7B7C 7A7A7C7A7B7C7A7A7C7A7A7C7A7B7C7A7A7C7A7B7C7A7B7C7A7C7D7A7B7C7A7B7C7A7C7D7A7B7D 7A7C7D7A7A7C7A7B7D7B7C7D7A7B7D7B7C7D7B7C7D7A7C7D7B7C7D7A7C7D7A7C7D7B7C7D7A7C7D 7C7C7E7B7C7D7C7C7F7B7C7D7B7C7E7B7C7E7B7C7D7C7C7F7C7C7E7C7C7E7B7C7D7C7C7E7C7C7E 7C7C7E7B7C7D7C7C7E7C7C7E7C7C7E7C7C7E7C7C7E7C7C7E7C7C7E7C7C7E7C7C7E7C7C7E7C7C7E 7B7C7E7C7C7E7B7C7E7B7C7E7B7C7E7B7C7E7B7C7E7B7C7E7C7C7E7A7C7D7B7C7D7B7C7D7B7C7E 7C7C7E7B7C7E7A7B7D7C7C7E7A7B7D7B7C7D7C7C7E7A7C7D7B7C7D7A7C7D7A7C7D7A7B7D7A7C7D 7A7B7D7A7B7D7B7C7D7A7B7D7B7C7D7B7C7D7A7B7C7B7C7D7A7C7D7A7C7D7B7C7D7A7B7C7A7B7C 7A7B7C7A7B7D7A7B7C7A7B7D7A7B7D7A7B7C7A7B7D7A7B7C7A7B7C7A7B7C797A7B7A7B7C797A7B 797A7B797A7B797A7B797A7B797A7B797A7B797A7B797A7B797A7B78797B78797B78797B78797B 78797B78797B78797B78797B78797B78797B78797B77787A77787A696A6D2A2F362B30372C3139 2C31392B3037292E354A4E5343484E44484F44494F43484E44484E44484E43484E44484E43484E 43484E43474E43474D43474E43474E43474D43474E43474D43474D43474D43474D43474D42474D 43474E42474D42474D42474D42474D42474D42474D42474D42474D42474D42474C42474C42464C 42474C42464C42464C42464C42464C41464B42464C41464C41464B41464C41464C41464B41464C 41464B41464B41464C41454B41464C41464C41464B41454B42464C41464B41454B41464B41454B 41454B41454B41454B41454B41454B41454B40454B41464B41454B40454A41454B494D51292D34 292D342A2F361C242B1C242B1C242C0E1013050202060606020202171717BFBEBDFBF8F4F2EFEA F1EFEAF5F2EDD6D3D096918E9C9B97928F8C8A88867C7F7C858883454747101015191A1D17171B 1A1A1D1415172123233A413D5E6968595F5F000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 0B0B0B7377777377787B7E7E3D403F1819192426262023232F303079757395908F948E8E989391 9E9997A49F9EA49E9CD1CDC9F5F3EEF3EFEBF2EEEBF3EFECFBF8F5959493020202060606060606 050303090A0A1B22291D252C1C242B2A2E36282C3323272C3E434840454A40454A40444A40454A 40444A40444A40454A40454A40454A40454A40454A40454A40454A40454A40454B40454A40454B 40454B41454B41454B41454B41454B41464B41454B41464B41464B41464B41464B41464B41464B 41464B41464C41464B41464B41464B41464B41464B41464B41464C41464B42474D42474D42464C 42474D42464C42464C42474D42464C42474D43474D42474D43474D42474D42474D42474D42474D 42474D42474D42474D42474D42474D42474D43484E42474D43484E43484E43474D43484E43474D 43474D43474D43484E42464C262A30292E342B31392C3139292E3624292F71727477777A77777A 77787A78787B77787A77787A77787A77787A77787A77787A77787A77787A78797B78797B78787B 77787A79797B79797B79797B79797B79797B79797B79797B79797B79797B79797B79797B79797B 79797B7A7A7C797A7C7A7A7C797A7C797A7C7A7A7C797A7C7A7A7C7A7A7C7A7A7C7A7B7D7A7A7C 7A7A7C7A7B7D7A7B7D7A7B7D7A7B7D7A7B7D7A7B7D7A7B7D7A7B7D7A7B7D7A7B7D7A7B7D7A7B7D 7A7B7D7A7B7D7A7B7D7A7B7D7A7B7D7A7B7D7A7B7D7A7B7D7A7B7D7A7B7D7A7B7D7A7B7D7A7B7D 7A7B7D7A7B7D7A7B7D7A7B7D7A7B7D7A7B7D7A7B7D7A7A7D7A7B7D7A7A7D7A7A7D7B7C7E7A7A7D 7A7B7D7A7B7D7B7C7E7A7B7D7A7B7D7A7B7D7A7B7D7B7C7E7A7B7D7A7B7D7A7B7D7A7B7D7A7B7D 7A7B7D7A7B7D7A7B7D7A7B7D7A7B7D7A7B7D7A7B7D7A7B7D7A7B7D7A7B7D7A7B7D7A7A7C7A7B7D 7A7B7D7A7B7D7A7B7D7A7B7D7A7A7C797A7C7A7A7C7A7A7C7A7A7C7A7A7C7A7A7C7A7A7C797A7C 7A7A7C797A7C797A7C78797B78797B797A7C78797B79797B78797B79797B79797B78797B79797B 78797B78797B77787A78797B78797B77787A77787A77787A77787A77787A78787B77787A78787B 78787B77777978787B77777977777977777A777779737376252A30292E352C31392B31392A2F36 24282E41464C43484E43484E43474D43484E43474D43474D43474D43474D43474D42474D42474D 42474D42474D42474D42474D42474D42474D42474D42474D42464D42464C42464C42474D42464C 42474D42474D42474D42474D42474D41464C41464B41464C41464B41464B41464B41464B41464B 41464B41464C41464B41464C41464B41464B41464B41454B41454B41464B41454B41464B41464B 41454B41454B40454B40454B40454A40454B40454A40454A40454A40454A40454A40454A40454B 40444A40454B40454A40444A40454A40444A40444A40444A40444A3E434825292F272B322A2E36 1C242B1C242B1C242C0E1013050202060606020202171617BFBEBDFBF8F4F2EFEAF2EFEAF5F2ED D7D3D096908C9B9B95908F8B8988857E807D858882434643101014191A1C17171A1A1A1B141417 2022233A403D5D68665F6464000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000090B0B717475 7477777B7D7D3E403F1819182426261F21222F3030797573958F8E938E8E9792909E9997A4A09E A6A09ED4CECBF5F1EEF2EFEAF2EFEBF3EFEDFCF9F6959392020202060606060606050303090A0A 1B22291D252C1C242B2A2E36282C3323272C3E43483F44493F44493F44493F44493F44493F4449 3F444A3F444940454A40454A40444A40454A40444A40444A40444A40444A40444A40444A40444A 40454A40444A40454A40454A40454A40454A40454A40454A40454A40454A40454A41454B40454A 41454B40454A41464B41454B41464B41464B41454B41464B41454B41464B41464B41464B41454B 41464B41464C41464B41464C41464C41464B41464C42464C41464B42464C42464C42464C42464C 42464C42464C42464C42464C42464C42464C42474D42474D42474D42474D42474D42474D42474D 42474D42474D252A30292E342C31392B31382A2E3624292F747678767779767779767779767779 77787977787977787A77787977787A77787A77787A77787A77787A77787A77787978797B777879 77787978797A78797A78797A78797A78797A78797A78797A78797A78787A78797A78787A78797B 78797A78797B78797A797A7B797A7C797A7B797A7C797A7C797A7B797A7C797A7B797A7B787A7B 797A7B797A7C797A7C797A7C797A7C7A7A7D7A7A7D7A7A7C7A7A7D7A7A7C7A7A7C797A7C7A7A7C 797A7C797A7C7A7A7D797A7C7A7A7D7A7A7D797A7C7A7A7D797A7C797A7C7A7A7C797A7C7A7A7C 7A7A7C7A7A7D7A7A7C7A7A7D7A7A7D7A7A7D7A7A7D7A7A7D7A7A7D797A7C7A7A7D797A7C797A7C 797A7C797A7C797A7C797A7C7A7A7C797A7C7A7A7C7A7A7C797A7C7A7A7C797A7C797A7C7A7A7C 797A7C7A7A7C7A7A7C7A7A7D7A7A7C797A7C7A7A7D7A7A7C7A7A7D797A7B797A7B787A7B797A7B 787A7B787A7B797A7C787A7B797A7C797A7C797A7B797A7C797A7B797A7B787A7B797A7B78797A 787A7B797A7C78797A78797B78797B78797A78797B78797A78797A78797A78797A78797A777879 77787A78797A77787A77787A77787A77787A77787A77787A77787977787A767779767779777879 767779767779767779767779767779767779262A30292E352B31382C3138292E3524282E41464C 42474D42474D42474D42474D42474D42474D42474D42464C42474D42474D42464D42474D42464D 42464D42464C42464D41464B41464B42464C41464B41464B41464B41464B41464B41464B41464B 41464B41454B41454B41454B41454B41454B41454B41454B41464B41454B41464B41464B40454A 40454B40454A40454A40454A40454A40454A40454A40454B40454A40454B40454B40444A40444A 40444A40444A40444A40444A40444A40444A40444A40444A40444A3F44493F44493F444940444A 3F44493F44493F44493F44493F44493F444A3F44493F444A25292F272B322A2E361C242B1C242B 1C242C0E1013050202060606020202171617BFBEBDFBF8F4F2EFEAF1EEEBF5F2EDD8D3CF98918D 9C9A9592908B8989867D7F7C8487814244411310151A1A1C18181A19191B1415171F2021373E3B 606A68606865000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000090B0B737779717375787B7A 3E3F3E181A192325251E20202E303077737195908F918C8B9792909F9896A49F9CA8A29ED6D0CD F4F1EDF2EFEBF2EEEBF2EFECFCF9F6959492020202060606060606050303090A0A1B22291D252C 1C242B292E35272B3322262C3F44493F43493F43493E43493F43493E43493E43493F43493E4349 3F44493F43493F44493F44493F44493F44493F444A3F44493F444A3F444A3F444940444A3F4449 40444A40454A3F444940454A40454A40444A40454A40444A40444A40444A40444A40444A40454B 40444A40454B40454A40454A40454A40454A40454A40454A40454B40454A40454B40454B40454B 41454B40454B40454B41454B40454B41454B41454B41454B41454B41454B41464C41464C41464C 41464C41464C41464C41464C41464C42464D41464C41464C41464C41464C42464C41464C42464C 252A30282D342B30382B3138292D3524282E757678767679767679757678767679757678757678 767679757678777779777779777779777779777779777779777779777779777779777779777779 77777977777978787A78797A78787A78797A78797A78787A78797A78787A78787A78787A78787A 78787A78787A77787A78787A78797B77787A78797B78797B78797B78797B78797B78797B78797B 78797B78797B78797B78797B78797B78797B78797B78797B797A7C78797B797A7C78797B797A7C 787A7B78797B787A7B797A7C797A7C787A7B797A7C797A7C797A7C797A7C797A7C797A7C797A7C 78797B797A7C797A7C797A7C797A7C797A7C797A7C797A7C797A7C797A7C797A7C797A7C797A7C 797A7C797A7C797A7C797A7C797A7C797A7C797A7C787A7B797A7C78797B78797B78797B78797B 78797B78797B78797B78797B78797B78797B78797B78797B78797B78797B78797B78797B78797B 78797B78797B78797B78797B78797B77787A78787A78787A78787A78797B78787A78787A78797A 78787A78797A78797A78787A78797A78787A78787A767779777779767779767779777779767779 777779777779777779777779777779777779777779777779767679767679767679767679767679 76767976777976767976777925292F282D342B31382B3038292E3524282E42474D42464D42464D 41464C42464D41464B41464B41464B41464B41464B41464B41464B41464B41464B41464B41464C 41454B41454B41454B41454B41454B41454B41454B41464B41454B41464B41464B41454B40454B 40454A40454A40454B40454A40454B40454B40454A40454B40454A40454A40444A40444A40444A 40444A40444A40444A40444A40444A3F444A3F444A3F444A3F444A3F44493F444A3F44493F4449 3F444A3F44493F444A3F444A3F444A3F43493F44493F444A3F444A3F44493F43493F43493E4349 3F43493E43493E43493F43493E43493F434924292E272B32292E351C242B1C242B1C242C0E1013 050202060606020202161717BFBEBCFAF7F4F2EFECF1EEEBF5F2EED8D4D097918C9C9A9691908C 8788847C7E7A83858041434010101319191B17181A17181C1414171E20203C413D5D68645B6160 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 0000000000000000000000000000000000000000000B0B0B73757A757678797B7B3B3D3C191A19 2225261E1F212E2F30706C6B948F8E908B899792909F9896A29D99A8A29ED6D1CDF3F1ECF2EFEA F2EFEBF2EFECFBF8F5959492020302060606060606050303090A0A1B22291D252C1C242B282E35 272C3322272C3E43483E43483E43483E43493E43483E43493E43493E43483E43493E43483E4348 3E43493F43493F43493F43493F43493F43493F43493F43493F43493F43493F43493F43493E4349 3F43493E43493F44493F44493F44493F44493F44493F444A3F44493F444A40444A3F44493F444A 3F444A3F444A40444A3F444A40444A40444A40444A40444A40444A40444A40454B40444A40454B 40454B40454A40454B40454A40454A40454A40454A40454B40454B41454B40454B41454B41454B 41454B41454B41454B41454B41454B41454B41464C41464C41464C41464C41464C24292F282D33 2B31382B3037292E3524292E737476757678757678757678757678757678757678757677757678 757677767778757678757677767779767779767778767779767778767778767779767778767779 76777976777877787A76787976777876787A76787976787A76787A77787A76787A77787A77787A 76787977787A76787976787978787B77787A77787A77787A77787B78787B77787B77787B78797B 77787B78797B78797B77787B78797B77787B77787B77787A77787B77787A77787A78787B77787A 78787B78787B78787B78787B78787B79797C78787B79797C79797C78787B77787A79797C78797B 77787A797A7C77787A78797B78797B77787A78797B78797B77787A79797C78797B78787B79797C 77787A78787B77787A77787A77787B77787A77787B77787B78787B77787B78787B78787B77787A 78787B77787A77787A78787B77787A78787B78787B77787B78787B76787A77787B77787A76787A 77787A77787A76787A77787A76787A76787A76787976787A76787976787977787A767879767779 77787A77787A767779767779767779767779767779767779767779767778767779767778767778 757678767778757678757678757677757678757677757677757678757677757678757678757677 74757774757724292F282D342B31382B3038292E3524282E41464C41454B41464C41454B41464C 41454B41454B41454B41454B41454B41454B41454B41454B41454B41454B40454A40454B40454A 40454A40454A40454A40454A40454A40454A40444A3F444A3F444A40444A3F444A40444A40444A 40444A40444A40444A40444A3F444940444A3F444A3F444A3F44493F44493F44493F44493F4449 3F44493F44493F44493F43493F43493F444A3F43493F43493F43493F43493F43493E43493F4349 3E43493E43493F43493E43493F43493F43493E43483E43483E43483E43483E43493E43483E4349 3E43493E43483E43493E434824282E262B32292E351C242B1C242B1C242C0E1013050202060606 020202171718C0BFBDFBF8F4F2EEEBF1EEEAF5F2EDD8D5CF97938C9D9B9790928F8888847D7E7A 80837E3E3F3E10101319191C16161817181A1312152121223C403F5B64655B6463000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 0000000000000000000000000000000B0B0B7072747074747C7E80414242171A19242627202122 2E30306F6B6A928E8D8F8A8A9691909C97959F9B99A7A29DD7D1CCF4F1EDF1EEEBF1EEEBF2EFEC FBF8F5959492020302060606060606050303090A0A1B22291D252C1C242B282E34272B3322262C 3D42473D42483D42483D41473D42483D41473D41473D42473D41473D42473D42473E42483D4247 3D42473E42483D42473E42483E42483E42483E42483E42483E42483E42483E43493E42483E4248 3E43493E43483E43493E43483E43483E43483E43483E43483E43483E43493E43483E43493E4349 3F43493F43493F43493F43493F43493F43493F43493F43493F43493F43493F43493F44493F4449 3F44493F44493F44493F44493F44493F44493F44493F44493F44493F44493F444940444A3F444A 40444A40444A3F434A40444A3F434A3F434A3F444A40444A40454A24292F282D342B30372B3038 282D3423282E727375737477737477737476737477747577747577747577747577747577747577 747577747577747577747577747577757678757678757678757678757678757678757678757678 757678757678757678767679757678767679767679767679767679767679767679767779767679 76777976777976767976777976767976767976777976767976777977787A76767976777977777A 76767976777977777A77787A77787A77777A77787A77777A77777A76777A77777A76777A76777A 77787A76777A77787A77787A76777A77787A76777A76777A77777A76777A77777A77777A77777A 77777A77777A77777A77777A77777A77777A77777A77787A77777A77787A77787A77787A77787A 77787A77787A77777A77787A77777A77777A77777A77777A77777A77777A77787A767679767779 76777976767977787A77777A767679767779767679767779767779767679767779767679767679 767779767679767779767779767679767779767679767679757678757678757678757679757678 757678757678757678757678757678757678757678757678757678747577757678757678747577 747577747577747577747577747577747577747577747577737476737476737477737476737477 24292F282D342B30372B3038282D3423282E40454A40444A40444A3F434A40444A3F434A3F434A 3F444A3F434A3F444A3F444A40444A3F444940444A3F44493F44493F44493F44493F44493F444A 3F43493F444A3F444A3F444A3F444A3F43493F43493F43493F43493F43493F43493E43493F4349 3E43493E43483E43493E43493E43493E43493E43483E43493E43483E43483E43493E42483E4248 3E43493E43483E42483E42483E42483E42483E42483E42483E42483E42483E42483E42483D4247 3D42473E42483D42483D42483D42483D42473D42483D42483D41473D42483D41473D41473D4247 3D41473D424724282E262B31292E351C242B1C242B1C242C0E1013050202060606020202171718 C1C0BFFBF8F4F2EFEBF1EEEBF5F2EDD8D4D097928C9E9D9892928E8988857C7D7B7F837D3D403E 12121617181A1616181718191313151E1F20393F3E5E6768596060000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000090B0B7074746F7271797B7C3F4141181A182325251F21232F30306D6969 928E8D8F8B8B95918E9D9794A29D9BA6A09CD4CECAF3EFEBF1EEE9F2EEEAF2EEEBFBF8F5959392 020202060606060606050303090A0A1B22291D252C1C242B292E35272B3222262C3C40463D4147 3D41473D41473D41473D41473D41473D41473D41473D41473D41473C41473D41473D41473D4147 3C40473C41473D41473D41473D41473D41473D41473D41473D41473D42483D41473D41473D4147 3D41483E42483E42483E42483E42483E42483E42483E42483E42483E42483E42483D41483E4248 3E42483E42483E42483E42483E42483E42483E42483E42483E42483E42493F43493E42493F4349 3F43493E43493F43493E43493E43493E42493E43493E42493E42493F43493F43493F434A3F434A 3F43493F434A3F43493F43493F434A40444A3F434A24282F282C332B30372B2F37282D3423282E 717275737476737476737376737476747476737376747577747476747577747577737476747577 737476737476737476737476737476737476747476747577757577757577747577757577747577 747577757577747577757577757678757678757678757679757679757577757679757678757678 757678757678757678757678757678757678757678757678757678757678757678757678757679 76777976777A75767976777975767976777976777976777976777976777976777976777A767779 76777A76777A76777976777A76777976777976777A76777976777A76777A76777976777A767779 767779767779767779767779767779767779767779767779767779767779767779767779767779 76777976777976777976777976777A767779757679757679757678757679757678757678767779 757678757678757678757678757678757678757678757678757678757678757678757678757678 757678757679757577757679757577757577747577757577747577747577757678747577757678 757678757577747577757577757577757678747476747577747577737476747577737476737476 73747673747673747673747674747672737673737673737672737673737672737624292F282D34 2A30372A3037282D3423282E3F43493F434A3F434A3F43493F434A3F43493F43493F434A3F4349 3F434A3F43493F43493F43493E43493E43493E42493E43493E42493E42493E43493E42493E4248 3E42483E42483E42483E42483E42483E42483E42483E42483E42483E42493E42483E42483E4248 3E42483E42483E42483E42483D41483E42483D41483D41483D41473D41473D41473D41473D4147 3D41473D41473D41473D41483D41473D41483D41483D41473D41483D41473C41473C40473C4147 3C40473C40473D41473C40473D41473D41473D41473D41473D41473D41473D41473D41473D4147 23282E262A31292D351C242B1C242B1C242C0E1013050202060606020202171718C1C0BFFBF8F4 F2EFEBF2EFEBF5F2EDD9D6D196908C9B9B9591928C8887847D7E797F837D42444213121618181B 16171917181A1312151F21213C42405D6665545858000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000090B0B7075757072737A7C7D3F4140181A1A2123231F21222E30306C6969938E8D908B8A 95918F9E9896A29C9AA7A09DD6D2CBF3F0EDF0EEE9F1EEEAF2EFEBFBF8F6959392020202060606 060606050303090A0A1B22291D252C1C242B282D34272B3221262C3C40463C40463C40463C4046 3C40463C40463C40463C40463C40463C40463C40463C40473C41473C40473D41473D41473C4047 3D41473D41473D41473D41473D41473D41473D41473D41473D41473D41473C40473D41473D4147 3C40473D41473D41473D41473D41473D41483D41473D41483D41483E42483D41483D41483E4248 3D42483E42483D42483D42483E42483D42483E42483E42483D41483E42483D41483E42483E4249 3E42483E42493E42493E42483E42493E42483E42483E42483E42483E42483E43493E43493E4349 3E43493E43493E43493E43493E434924292F282C332A2F372B3037282D3423272E717275727375 727375727375727375727375727375727375727375727375737476737476737476737476737476 737476737476737476737476737476737476747577737476747577747577747577747577737577 747577737577737577737577737577737577737577747577737577747577757678757678757678 757678757678757578757678757578757578757678757578757678757678747578757678747578 747578757678747578757678757678757678757678757678757678767678757678757578757578 757578767678757578767678757578757578757578757578767779767678757678757678757678 767779757678767779757678757678767779757678757678757678767779757678747578757678 747578747578747578747578747578747578757678747578757678757678757678757678757678 757678757578757678757578757578757678747577747577747577737577747577737577737577 747577737577747577747577747577747577747577747577747577747577737476747577737476 737476737476737476737476737476737476737476737476737476737476737476727376737476 73747672737672737672737672737672737672737672737672737624292F282D332A2F362A3037 282C3323272D3F43493E43493E43493E43493E43493E43493E43493E43493E42483E42483E4248 3E42493E42483E42493E42493E42483E42493E42483E42483E42483E42483E42483E42483E4248 3E42483E42483E42483D41483E42483D41483D41473D41473D41483D41473D41473D41483D4147 3D41483D41483D41483D41483D41483D41483D41473D41473C41473C41473D41473C41473D4147 3D41473C40473D41473C40473C40473D41473C40463C40473C40473D41473C40473C40463C4046 3C40463C40463C40463C40463C40463C40463C40463C40463C40463C40463C404623272E252A31 282E341C242B1C242B1C242C0E1013050202060606020202171718C0C0BDFAF8F3F2EFEBF1EEEA F5F2EDD8D5D197928E9C9B9792928D8988857C7D797E827C45474512121616181A151619151719 1313162122223B413E606A69535857000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000B0B0B 767B7A6268656E73723F41401618181F22221F21212F30306D6969938E8E8F8B899692909D9897 A19B99A8A19FD8D3CFF4F1EDF2EFEAF1EEEBF2EFECFBF8F5959592020202060606060606050303 090A0A1B22291D252C1C242B282D34262A3221252C3B3F463B3F463B3F453C40463B3F463C4046 3C40463B3F463C40463B3F463B3F463C40463B3F463C40463C40463B3F463C40463C40463C4046 3C40463C40463C40463C40463C40463C40463C40463C40463C40473C40463C40473D41473C4047 3D41473C40473C40473D41473C40473D41473D41473C41473D41473C41473D41473D41473D4147 3D41473D41473D41473D41473D41473D41473D41473D41473D41473D41473E42483D42483E4248 3E42483E42483E42483E42483E42483D41483E42483D41483D41483E42483D41483E42483E4249 3E42483E42493E424823282E272C332A2F372A2F36282C3423272E707173717274717274727375 717274727375727375717274727375717274717274727375727375727375737476727375737476 727375727375737375727375737375737375737476737476737577737577737577737577737577 737577737476737577737476737476737577737476737577737577737477737577747578737477 737476737477737476747577747578747577747578747578747578747578747578747578747578 747578747578747578747578747578747578747578747577747578747577747577747578747577 747578747578747577747578747577747577747578747577747578747578747577747578747577 747577747577747577747577747577747578747577747578747578747578747578747578747578 747577747578747577747577747578747577747578747578747578747578747578737477747577 747578737476747577737577737476737577737577737577737577737577737577737577737577 737577737577737476737577737476737577727375737476727375727375737476727375737476 737476727375737476727375727375727375727375737476727375717274727375717274717274 72727471727472727472727472737572727471727424282F282C332A2F362A2F37282C3323272D 3E42493E42483E42483E42493D41483E42483E42483D41483E42483D41483D41483E42483D4148 3E42483E42483D41483E42483D41483D41473D41473D41473D41473D41473D41473D41473D4147 3D41473D41473D41473D41483D41483C40473D41483C40473C40473D41473C40473D41473D4147 3C41473D41473C40463C40463C40463C40463C40463C40463C40463C40463C40463C40463C4046 3C40463C40463B40463C40463C40463C40463C40463C40463C40463C40463C40463B3F463C4046 3B3F463B3F463C40463B3F463C40463C40463B3F463B3F463B3F4523272E262A31282D341C242B 1C242B1C242C0E1013050202060606020202171718BFC0BEFAF7F4F1EEEBF1EEEBF4F1EDD9D5D1 96918D9D9B9693918C8987857D7E7B7D817B43454212131717181B17161A16171B141317222323 323936697070505351000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 0000000000000000000000000000000000000000000000000000000000000404046466676C726F 6267653638381819192122222021222E2F2E6A6766958F8F908C8B9893929C97969F9A97A8A39F D8D3CFF4F1EDF1EEEAF2EEEBF2EFECFBF8F5959593020202060606060606050303090A0A1B2229 1D252C1C242B282D34262A3122252B3A3E453B3F463B3F453B3F453B3F463B3F453B3F453B3F45 3B3F453B3F453B3F453B3F453B3F453B3F453B3F453B40463B3F463B3F453B40463B3F463B4046 3C40463C40463B3F463C4046393D433A3E453C40463B3F463C40463C40463C40463C40463C4046 3C40463C40463C40463C40463C40463C40473C40463C40473C40473C40463C40473C41473C4147 3C40473C41473C40473C40473D41473C40473D41473D41473C40473D41473C40473D41473C4047 3D41473D41473D41473D41483D41473D41483D41483D41473E42483D41473D41473D42483D4248 3D424823282E272C332A2F372A2F36282C3423272E707173707174707174717274717274717274 717274717274717274717274717274717274717274717274727375717274717274727375727375 727375727375727375727375727375727375727375727375737476727375727375737476737476 737476727375737476737476737476737476737476737476737476737476737476737476737476 737476737476737376737476747477737376737476737376737476747577737476747577737476 737476747577737476747577747577747577747577747577747577747577747577747577747577 747577747577747577747577747577747577747577747577747577747577747577747577747577 747577747577747577747577747577747577747577747577747577747577747577747577747577 747577747577747577747577747577747577737476737476737476737476737476737476737476 737476737376737476737376737376737476737376737476737476727376737476727375727375 727375727375727375727375727375727375727375727375727375727375727375727375727375 717274727375727375717274717274727375717274717274717274717274717274717274717274 71727471727471727470717470717423282E272B332A2F36292F36282C3323272D3D41483E4248 3E42483D41473D41483D41473D41473D41473D41473D41473D41473D41473D41473C40473D4147 3D41473C40473C41473C41473D41473C41473D41473D41473C40473D41473C40473C40473D4147 3C40463D41473C40463C40463C40463C40463C40463C40463C40463C40463C40463C40463B3F46 3C40463C40473B40463C40463B40463B40463B3F463B40463B3F463B3F463C40463B3F463C4046 3C40463B3F463B3F463B3F453B3F453B3F453B3F453B3F453B3F453B3F463B3F453B3F463B3F46 3B3F453B3F463B3F453A3F453A3F453B3F453B3F4523272D252931282D341C242B1C242B1C242C 0E1013050202060606020202171818C0BFBDFAF8F3F2EFEBF1EEEBF5F3EED9D7D195918B9B9A95 92908C8987837E7F7B7D807B41424115151818181B17171A18171A1514171C1F1F3D4341727573 363637000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 0000000000000000000000000000000000000000000000000202025251534847474042421F2121 1E20201F22221F21222E2F2F67646495908F908D8C9894949B9795A09A98AAA4A0D8D3CEF3F1EC F1EEEAF1EDE9F2EFEBFBF8F6959492020202060606060606050303090A0A1B22291D252C1C242B 272D34262A3121252B393D443A3E443A3E44393D443A3E44393D443A3E443A3E443A3E443A3E44 3A3E443A3E443A3E443A3E443A3E443A3E453A3E443A3E453B3F453A3E453B3F453A3E44393D43 2A2E312123272425291E212322252931353A3A3E453B3F453A3F453A3E453A3F4530343923252A 2B2F333B3F453B3F453B3F45353A3F2A2D3123262924272A2A2D31383C413B3F453B3F453B4046 373B41292C3223262A232529282B2F363A3F3B40463B3F463B40463B40463B3F463C40463C4046 3C40463C40463C40463C40463C40463C40463C40463C40463C40463C40473C40463C404623282E 272B33292F36292F36272C3322272C6E6F726F70736F70736F70736F70736F7073707173707173 707173707173707173707173707173707173707173707174717274717275707174717274717275 717274717274717274717274717274717274707274717274707274707274717274717275717274 727375717274727375727375727375717275727375717275717275727376717275727376727376 717375727376717375717375727375717375727375727375727375737476727375737476717275 737476727376717275737476727376737476727375727375727375737476737476727376737476 717275727376737476727376737476737476737476737476737476727376737476737476727375 737476737476737476727375727375717275737476727376717275727375717275727375727375 727375727375727375727375717275727375717275717275727376717275727376727376717375 727376717375717375727375717375717274717274727375717274717274717274707274717274 707274707274717274707274717274717274717274717274707173717274707173707173707173 7071737071737071737071737071737071747071737071747071746F70737071746F70736F7073 6F70736F70736F707323282E272B332A2F362A2F36282C3323272D3C40473C40463C40463C4046 3C40463C40463C40463C40463C40463C40463C40463C40463C40463B40463B40463C40473B4046 3C40463C40463B3F463C40463B3F463B3F463B40463B3F463B3F453B3F453B3F463B3F453B3F45 34393E31353A35393F3B3F453B3F453B3F453B3F453B3F453A3E453A3E453B3F453A3E453A3E45 3A3F453A3E453A3F453A3F453A3E453A3F453A3E453A3E453A3E453A3E453A3E443A3E443A3E44 3A3E443A3E443A3E443A3E443A3E443A3E443A3E443A3E443A3E443A3E44393E443A3E443A3E44 3A3E44393D443A3E443A3E44393D4423272D252931282D341C242B1C242B1C242C0E1013050202 060606020202181818C0BFBEFAF8F3F2EFEAF1EFEAF4F2EEDAD6D296908D9C9A9792918C888882 7F807B7D7F7A3E403F14151817171A15171916161917171A1C1E1F1F201F484948404042000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 0000000000000000000000000000000000000202023B3B3E33323515141622222328292A1F2122 2022232D2F2F686464969190908D8C9994939C9795A09B98AAA5A1D7D3CEF3F0EBF1EFEAF1EEEA F2EEECFBF8F4949392030202060606060606050303090A0A1B22291D252C1C242B272D33252A31 21252B393D43393E44393D43393E44393E44393E44393E44393E44393E44393E44393E44393D44 393E44393D44393D44393D44393D44393D44393D44393E44393D44393D43292C2F575859737474 8484848282826F70703C3E403034393A3E443A3E443A3E44363A3F4344476F707057595B3B3F46 3A3F4535393F2F31345657586D6E6E6C6C6D575759282A2D363A403A3F45383D422A2C2F5A5B5C 6F6F707071715F60612E303334383E3B3F453B3F453B3F453B3F453B3F453B3F463B3F463B4046 3B3F463B40463B40463B40463B40463B40463B40463B40463B40463B404623282E272B33292E36 2A2F36282C3323272D6E6F716F70736F70736F70736F70736F70737071736F7073707173707173 6F70737071737071737071737071736F71737071736F71736F71737072746F7173707173707173 707274707173707274707274707174707274707174707174707274707174707274707274707274 707274707274707274707274717275717275707274717275717275717275717275717275717275 717275717275717275717275717275717275717275717275717275717275717275717275717275 717275717275717275717275717275717275717275717275717275717275717275717275717275 727375727376717275717275717275717275717275717275717275727375717275717275717275 717275717275717275717275717275717275717275717275717275717275717275717275717275 717275717275717275717275717275717275717275707274717275707274717275717275717275 707274707274707274707274707274707274707274707274707274707274707274707274707274 707274707173707274707173707274707173707173707173707173707173707173707173707173 7071737071737071736F71737071736E70726E70726F70736E70726F70736F70736F70736F7073 6F707323282E272B33292F362A2F36272C3322262C3B3F463B40463B40463B40463B40463B4046 3B40463B40463B40463B40463B40463B3F453B3F453B3F453B3F453B3F453B3F453B3F453B3F45 3B3F453B3F453B3F453B3F453B3F463B3F453B3F453B3F453B3F453B3F453A3E45393B3E3B3D3F 383B3F3A3E453A3E453A3F453A3E443A3F453A3E453A3E443A3E453A3E443A3E443A3E443A3E44 3A3E443A3E443A3E443A3E443A3E443A3E443A3E44393E44393D44393D44393E44393D44393E44 393E44393D44393E44393D44393D44393E44393D44393D43393D43393D44393E44393D44393D44 393D43393D44393D4323272D252930272D341C242B1C242B1C242C0E1013050202060606020202 191919C1C1BFFAF7F4F1EEEAF0EEE9F4F2EDD9D6D296918E9D9A9693908D89878581817E7C7F79 3A3B3A16161916171A1416181415181C1C1F1C1C1E09090B3636391D1C1E000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 0000000000000000000000000000022C2C3329292D1415152425262729291E21222223252D2E2F 686463989392908C8A9992919C9896A09A98AAA3A0D6D1CDF4F1ECF1EFEAF0EDEAF1EFEBFBF8F4 959392020302060606060606050303090A0A1B22291D252C1C242B272C33252A3121252B383C43 383C43383C43393D43393D43393D43383C43383D43393D43383D43383D43393D43383D43393D43 393D43393D43393D43393D43393D43393D43393D4334383D646465848484848484838383848484 848484838383404145393D442D313624262A2A2C2E7576768484846364663B3F45393D4434373B 7A7B7B8585858585858585858585857E7E7F3235393A3E442F32367A7A7A858585858585868686 8686868484843A3C3F3A3F453A3E453A3E453A3E453A3E453A3E453A3F453A3F453A3E453A3F45 3A3F453A3F453A3F453A3F453A3F453A3F453A3F453A3F4523272D272B32292E35292E35272C33 22272C6D6E706E6F716E6F716E6F726E6F716E6F726E6F726E6F716E6F726E6F716E6F716E6F72 6E6F716F70736F70736F70736F70736F70736F70736F70726F70736F70726F70727071746F7072 7071746F70736F7072707174707173707173707174707173707174707174707173707174707173 7071737071747071737071747071746F7173707174707274707274717274707274707173717274 717275717274717275717275717275717275717275717275707274717275707274707274717274 707274717274717274717275717274717275717275707274717275707274707274717275707274 717275717275717275717275717275717275717274717275717274717274717275717274717275 717275717274717275717274717274717275717274717275717275717274717275717274717274 7172757172747172757172757072747172756F71736F71737071736F7173707173707173707274 7071737072747072747071747072747071747071746F71737071746F71736F70726F70726F7072 6F70726F70726F70736F70726F70736F70736F70726F70736F70726F70726F70736F70726F7073 6F70736E6F726E6F726E6F726E6F726E6F716E6F726E6F716E6F716E6F726E6F716E6F7223282E 272B32292E35292F36272B3322262C3A3F453A3F453A3F453A3F453A3F453A3F453A3F453A3F45 3A3E453A3F453A3F453A3F453A3E453A3E453A3E453A3F453A3E453A3F453A3F453A3E453A3F45 3A3E453A3E443A3E443A3E443A3E443A3E443A3E443A3E443A3E446365668585855D5E603B3F45 3A3E44393D443A3E44393D44393D44393E44393D44393E44393E44393D44393E44393D44393D44 393D44393D44393D43393D43393D44393D43393D44393D44393D43393D44393D43393D43393D43 393D43393D43393D43393D43393D43393D43383C43393D43383C43383C43383C43383C43383C43 383C4323262D252930272D341C242B1C242B1C242C0E1013050202060606020202191919C2C1C0 FAF7F3F1EEEBF1EEEBF3F1EDD9D6D397928E9B999592908D8A888582837E7B7F78393A39161619 15161915161A1315161A1A1D1B1A1C08090B1B1A20101014000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 00000000000002020235363D27292D09090C2222232528271D21202223242E2F2F646361989291 918C8A9892919B9795A09A98A9A3A1D7D1CEF3EFECF1EEEAF1EDEAF1EEEBFBF8F5969592030202 060606060606050303090A0A1B22291D252C1C242B272D3325293120242A383C42383C42383C42 383C42383C42383D43383D43383C43383D43383C43383C43383C43383C43383C43383C43383C43 383C43383C43383C43383C43383C433B3E438282828383836465683F44494C50547D7E7E848484 696A6B3A3E444C4D506768698080818484848484846364663A3F45393D435F60618484847A7B7B 5154585A5C607F7F7F8585856566673A3E455657598585857C7C7D53565A5255597E7E7F858585 696A6B3B3F453A3E443A3E443A3E443A3E443A3E443A3E443A3E443A3E443A3E443A3E443A3F45 3A3E453A3F453A3F453A3E453A3F453A3E4523272D262B32282E35292E35272B3322262C6D6E70 6E6F716E6F716E6F716E6F716E6F716E6F716E6F716E6F716E6F716E6F716E6F716E6F716E6F71 6E6F716F70726F70726F70726F70726F70726F70726F70726F70726F70726F70726F70726F7072 6F70726F70736F70736F70736F70736F70736F70736F70736F70736F70736F70736F70736F7073 6F70736F70736F70736F71736F70736F71736F71736F70736F71736F70736F70737071746F7073 6F70736F70736F70737071747071737071736F7073707173707174707174707174707174707174 707174707174707174707174707174707173707174707173707173707174707173707174707174 7071747071747071747071747071747071747071747071747071747071747071747071746F7073 7071747071736F70737071746F70736F70736F70737071746F70736F70736F70736F70736F7073 6F70736F70736F71736F70736F71736F71736F70736F71736F70736F70736F70736F70736F7073 6F70736F70736F70736F70726F70736F70726F70726F70726F70726F70726F70726F70726F7072 6F70726F70726F70726F70726F70726F70726F70726F70726F70726F70726E6F716E6F716E6F71 6E6F716E6F716E6F716E6F716E6F716E6F716E6F716E6F716E6F716E6F7123272D262B32292E35 282E35272B3322262C3A3F453A3E453A3E453A3F453A3E453A3F453A3F453A3E443A3F453A3E45 3A3E443A3E443A3E443A3E443A3E4425282C24272B35393F292C312124273A3E44393D432C2F34 2225281F212524272B2F3338393D44393E44292D31606162858585595A5C282B2F393D432A2E33 24262A2C3034393D43393D4333373C24272B24262B393D44393D4325282C23262B34383D292C31 212327383C432B2F3424272B2D30362D30352325292224282B2E3336393F383D43383C43383D43 383D43383C43383C42383C43383C43383C42383C43383C42383C42383C42383C42383C4223262D 252930272C331C242B1C242B1C242C0E1013050202060606020202191919C2C0C0FAF7F2F1EDEA F1EEEBF5F2EDD8D5D294908D999795908F8B88878381837D7A7D76393A3917181914171917171A 14151719191B19181905040623242816181A000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 00000033333A2A2A310B0B0C2122232627281D1F1F2022222D302E61605E96918F918D8C989493 9C9795A19C98AAA4A1D6D1CEF3F0EBF1EEEAF1EEEBF2EEEBFBF9F4969492020302060606060606 050303090A0A1B22291D252C1C242B272C3325293020242A373B42373C42373C42373B42373C42 373B42373B42383C42373C42373B42383C42383C43383C42383C43383C43373C42383C43373C42 373C42383C42373C425155587D7D7E7C7D7D3C4146373C42353A3F636465848484787979393E44 66686B838383838383848484848484626365393D44373C4177777884848456595C3A3E44393D43 5B5D5E8585857D7D7D393E446F70738585856163663A3E44363B415C5D5E8686867677773A3E44 393D44393D44393D44393D44393D44393D44393E44393D44393E44393E44383D44393E44393E44 393E44393E44393E44393E4423272D262B32282E35292E35262B3322262C6C6D706C6E706D6F71 6D6E716D6F716D6E716D6E716D6E716D6E716D6E716D6E716D6F716D6E716D6F716D6F716D6E71 6E70726E6F726D6E716E70726E6F726E70726E70726D6F716E70726D6F716D6F716E70726D6F71 6E70726E70726E6F726E70726F70736E6F726D6F716F70736E70726E70726E6F726E70726F7073 6F70736F70736F70736F70736F70736F70736F70736F70736F70736F70736F70736F70736F7073 6A6C6F4A4E53373C4233383E42464C53565A6E6F727071735F62643E43484A4E5360626545494F 363B4244484D67696C7071737071736F707364666943474D373C42373C42474A505B5D61707173 70717370717366686A43484D363B413C41474F52576467696E70726E70726F70736062653F444A 33383E3B3F454B4F546D6E716F70736E70726F70736E70726E70726F70736E70726F70736F7073 6F70736F70736F70736F70736F70736F70736F70736F70736E70726F70736E70726F70736E6F72 6E70726F70736F70736E6F726E6F726E6F726E6F726E70726E6F726E70726E70726E6F726D6F71 6E6F726D6E716E6F726E6F726D6E716D6E716D6F716D6E716D6F716D6F716D6E716D6F716D6E71 6D6E716D6F716D6E716C6E706D6F716C6D706C6E706C6D7023272D262B31282E35282E35262B33 22262C393E44393E45393E45393E44393E45393E44393E44393D44383D44393D44393D44393E44 393D44393E44393E44676868686969313437545557727273393E44272A2F4A4B4C6E6E6F7A7B7B 68696A4041442D3134383D435657587677788585857474755B5C5E393D435355566767684F5153 393D43383C433F4347676768666768393D44383C42656667666767303336535456707071383D43 4E505264656646474944454769696A6D6E6E4C4D4F2C2E31383C42383C42383C42373B42383C43 373B42373C42373C42373B42373C42373B42373B42373B42373B42373B4222262D242930272C33 1C242B1C242B1C242C0E1013050202060606020202191919C2C0BFFAF7F3F1EEEAF1EEE9F5F2ED DAD5D395918D99999491908C88888381847D777A7538383719191B1517181716191614181A191C 19191A060509242529141618000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000323338 292A3109090C2122232627281E20202123232D2F2F605E5E96918F908D8C9894939B9796A09C98 AAA3A0D6D2CDF3F0EBF1EEEAF1EEEAF2EEEBFBF7F5969594020203060606060606050303090A0A 1B22291D252C1C242B262C3325293120242A363A40363A40363A40363A40363A40363A40363A40 363A40363A40363A40363A40363A40363A40363B41363B41373B41363B41373B41373B41373B42 373B41373B42373B42373B41373C4233373D25282C787878848484656769383C42373B41373B41 373B416F6F70848484626365383D43383C425A5C605B5E6142464B383C4233363D5E5F60848484 787879393D433C40463D40473A3D4424272B2224277A7A7A858585606265383D43373C42373C42 383C42373C42383C42383C42373C42383C42373C42373C42383C42383D43383C42383D43383D43 383D43383D4323262D262A31282D35282D35262B3221252C6A6B6E6C6D706C6D706B6C6F6C6D70 6C6D706B6C6F6C6E706C6D706C6E706C6E706C6D706C6E706C6D706C6D706C6D706C6D706C6D70 6C6D706D6F716C6D706C6E706C6E706D6E716D6F716D6E716D6E716D6E716D6E716D6E716D6E71 6D6E716D6E716D6E716D6E716D6F716D6E716E6F726D6F716D6E716E6F726D6E716E6F726E6F72 6E6F726E6F726E6F726E6F726E6F726E6F726E6F726E6F726E6F726E6F726E6F723F43492D3239 2F353C363B422C31392C3139484C516E6F725B5D612C313934393F2F343B2C31392C31392C3139 32373E686A6E6E6F72686A6D2F343B2C31392D32392D333A2C31392C31395B5D616E6F72636669 31363D2C31392C31392C31392C313930353C64666A6E6F725B5D612E333A2C31392D32392C3139 2C31393D42486C6D706E6F726E6F726E6F726E6F726E6F726E6F726E6F726E6F726E6F726E6F72 6E6F726E6F726D6E716D6F716D6E716D6E716D6E716E6F726D6E716E6F726D6E716D6E716D6E71 6D6E716D6E716D6E716D6E716D6E716C6D706D6E716C6D706C6D706D6E716D6E716D6E716D6E71 6C6E706C6D706C6E706C6E706C6D706C6E706C6D706C6D706C6D706C6D706C6D706C6D706B6D70 6C6D706B6D706C6E706B6C6F6B6D706B6C6F23272D262B31282D35282E35262B3221252C383D43 383D43373C42383C42373C42383C42383C42383C42383C42383C42383C42373C42383C42373C42 373C428282828585856C6D6D86868682828233363C5D5D5E858585858585848484858585848484 4A4B4D373B407778798484848484848484847F7F7F373B416667688484845F6062383D43373B41 45484C838383848484383C42373B418181818484846B6B6C838383808080383C425E5F61838383 757575838383838383838383838383666667363A40363A40363A40363A40363A40363A40363B41 363A40363A40363A40363A40363A40363A40363A40363A4022262C242830272C331C242B1C242B 1C242C0E1013050202060606020202191919C1C0BFFAF6F2F1EEEAF1EFEAF5F2EDDBD7D296928B 9A999391908C87888282858072767336373619191B1414171617181513161A191D1A191B060509 232226121415000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 00000000000000000000000000000000000000000000000000000002020233363D26272D0B0B0E 2122232528281C1F1F1F23232D2F2E5F5C5C959190908C8C9894939A97959F9B97A9A29FD8D1CE F3F0ECF1EEEAF1EEEAF2EEEBFBF8F5969694020203060606060606050303090A0A1B22291D252C 1C242B262C3325293020242A353A40363A40363A40363A40363A40363A40363A40363A40363A40 363A40363A40363A40363A40363A40363A40363A40363A40363A40363A40363A40363A40363A40 363A40363A4034383E2A2C2F6F70708484847C7C7D44484D363B41373B41363B41373B416F6F70 848484626365373C42363B41363B41363B41363B412D31372D2E318282828585855E6062373C42 373B41363B41363B416668697E7E7E85858571727234373B373B41373B41373C42363B41373B41 373C42373C42373C42373C42373C42373C42373C42373C42373C42383C42373C42383C42373C42 22262C262A31282D35282D35262B3221252C6A6B6E6B6C6F6B6C6F6B6C6F6B6C6F6B6C6F6B6C6F 6B6C6F6C6D706C6D6F6C6D6F6C6D706C6D6F6C6D706C6D706C6D6F6C6D706C6D6F6C6D6F6C6D6F 6C6D706C6D6F6C6D6F6C6E716C6D6F6C6D706C6E716C6D706C6E716C6D706C6D706C6E716C6D70 6C6E716C6E716C6D706C6E716C6D706C6D706C6D706C6D706C6D706C6D706C6E716C6D706D6F72 6C6E716C6D706D6F726D6E716D6E716D6F716D6E716C6E706466692D323A2C313978797B848485 63666831373D353A416C6D705D5F622C31392C31394D5155767779575A5E2E333A2C31394C4F54 6D6F7255585C2C31393D41477D7E7F84848541454A2C31394B4F546D6E7144484E2D323A393E44 78797A707274363B422C31394D51556D6E71373C422C31394E51568080817172742F353B2C3139 595B5F6D6E716D6F726D6E716C6D706D6E716C6D706C6D706D6E716C6E716D6E716C6E716D6F72 6C6D706C6E716C6D706C6D706C6E706C6D706C6E706C6E706C6E716C6E706C6E716C6E716C6D70 6C6D706C6D706C6D6F6C6E716C6D706C6D706C6D706C6D706C6D706C6D706C6D706C6D6F6C6D70 6C6D6F6C6D6F6C6D706C6D6F6C6D706C6D706B6C6F6B6C6F6C6D6F6C6D6F6B6C6F6B6C6F6B6C6F 6B6C6F6B6C6F6B6C6F6B6C6F23272D262B31282D35282E35262B3221252B373C42373C42373C42 373C42373C42373C42373C42373C42373C42373C42373C42373C42373C42373B41373C42828282 86868683838364666956585C3D40448484848585854F515534383D5B5D608585857E7E7F31343A 363B416263658484845B5C5F383C42373B416666688484845E6061373C42363B4145474B838383 848484373B41363A4080808083838381818163656755575B373B415E5F618383838080804C4F54 3D414767686A83838381818134383E363A40363A40353A40363A40353A40363A40363A40363A40 363A40363A40363A40363A40363A40363A4022262C242830272C331C242B1C242B1C242C0E1013 050202060606020202191819C1C0BFFAF8F3F1EEEAF1EEEAF5F2EDDBD7D295908B9A9A9593918C 878782818380737774393A391A1A1C1515171516191414171A191D19191B05060B222226121214 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 00000000000000000000000000000000000000000000000233333D27282D09090C202223262928 1D1F202122242E302E5C5B5A959190908B8C9894939A97949E9996A6A19DD6D1CDF3F0ECF1EEEA F1EEEAF2EEEAFAF8F3969593020302060606060606050303090A0A1B22291D252C1C242B262C33 24293020242935393F35393F35393F35393F35393F35393F35393F35393F35393F35393F353A40 35393F35393F35394035394035393F35393F363A40363A40353A40363A40353A40353A40363A40 32353A71727283838376767742464A363A40363A40353A40363A40363A406F6F70848484626364 373B41363A40363A4035393F262A2F3A3B3E7B7B7C85858579797A3F4349363A40363A40363B41 363B41767678858585858585838383494A4C35393E363B41363B41363B41363B41363B41363B41 373B41363B41373B41373B41363B41373B41363B41363B41363B41373C42363B4123262D252A31 282D34282D34262B3121252B696A6D6A6C6F6A6C6F6A6B6E6A6C6F6A6B6E6A6B6E6A6B6E6A6B6E 6B6C6F6B6C6F6A6B6E6B6C6F6B6C6F6B6C6F6B6D6F6B6C6F6B6D6F6B6D6F6B6C6F6B6D6F6B6C6F 6B6C6F6B6D6F6B6C6F6B6D6F6B6D6F6B6D6F6B6D6F6C6D706C6D706B6C6F6C6D706C6D706C6D70 6C6D706C6D706C6D706C6D706C6D706C6D706C6D706C6D706C6D706C6D706C6D706C6D706C6D70 6C6D706D6E716C6D706C6D706C6D706D6E716B6C6F2F343B2C3139383D434B4E53636568848484 8283846D6E705C5F612C31392F343B797A7B7172747A7A7D45494E2C313941454A6D6E70727375 7B7B7C797A7B61636754575C32373E2C3139494D516D6E7132373E2C31395F6265707274737476 6C6E705F61656365686466692D32392C313960636560626563656841454A2C313945494E6C6D70 6D6E706C6D706C6D706D6E716C6D706C6D706C6D706C6D706C6D706C6D706C6D706C6D706C6D70 6C6D706C6D706C6D706C6D706C6D706C6D706C6D706B6D6F6C6D706B6C6F6B6C6F6B6C6F6B6C6F 6B6C6F6B6D6F6C6D706B6D6F6B6D6F6B6C6F6B6D6F6B6C6F6B6C6F6B6C6F6B6C6F6B6C6F6B6C6F 6B6C6F6B6C6F6B6C6F6B6C6F6A6C6F6A6B6E6A6C6F6A6C6F6A6B6F6A6C6F6A6B6F6A6B6F6A6C6F 6A6B6F6A6C6F22262C252A31282D34282D34262A3221252B363B41373B41373B41363B41373B41 363B41363B41363B41363B41363B41363B41363B41363B41363B41363A418282828585855C5D60 373C42373B4150525484848476767632343631323536383B818181848484474A4D363B41626365 8484845B5C5F373B41363A406666688484845E6061373B41363A4045474B828282848484363B41 363A408080808383835A5C5E363B41363A40363A405E5F618383836B6C6D363A40353A4044464A 828282838383393D4335393F353A4035393F35393F35393F35393F35393F35393F35393F35393F 35393F35393F35393F35393F22262C242830262C321C242B1C242B1C242C0E1013050202060606 020202191919C2C1BFFAF7F3F1EEEAF1EEEAF5F2EDDDD9D39A948C9B9895928F8C878683828380 7375733739371C1C1D16151816161A1414181B1A1D19191B06080B212327111214000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000303239292B300B090C2021222628281E1F1F212322 2E3130595958969090918C8C9693919B97949E9995A69F9CD6D0CBF3F0ECF1EEEAF1EEEAF1EEEB FBF8F4969592020302060606060606050303090A0A1B22291D252C1C242B262C3324293020242A 34393F34393F34393F34393F34393F34393F34393F35393F34393F35393F35393F35393F35393F 35393F35393F35393F35393F35393F35393F35393F35393F35393F35393F35393F474A4E828282 8080813E424835393F35393F35393F353A4035393F353A406E6E6F848484626364373B41363A40 34393F24262A5555588484848484847172733C4046353A40353A40262A2F25282D30343A353A40 3A3E4468696B858585838383363A3F353A40353A40353A40353A40363B41353A40363B41363B41 353A40353A40363B41363B41363B41363B41363B41363B41363B4122262C252A31282D35282D34 262B3221252C686A6C696A6D6A6B6E6A6B6E6A6B6E6A6B6E6A6B6E6A6B6E6A6B6E6A6B6E6A6B6E 6A6B6E6A6B6E6B6C6F6B6C6F6A6B6E6B6C6F6B6C6F6B6C6F6B6C6E6B6C6F6B6C6E6B6C6E6B6C6F 6B6C6E6B6C6F6B6C6F6B6C6E6B6C6F6B6C6E6B6C6E6B6C6F6B6C6E6B6C6F6B6D706B6D706B6C6F 6B6C6F6B6D706B6D706B6D706B6D706B6D706B6C6F6B6D706B6C6F6B6C6F6B6D706B6C6F6B6D70 6B6D706B6D706B6D706B6D706D6F7156585D2D32392C31382C31382C3139383C425A5C606B6D70 5B5E612C31383B40466B6D706C6E706B6C7056595D2D3239393D436A6D706C6D6F44484D30353C 2C31382C31392F343B2C3138494D5268696D2D323A2C31386264686B6C6F6B6C6F737476777779 7374765E60642D32392C31382C31392C31382C31382C31382C313840454A6B6D706B6D706B6D70 6B6D706B6D706B6D706B6D706B6D706B6C6F6B6D706B6C6F6B6C6F6B6D706B6C6F6B6D706B6D70 6B6D706B6D706B6D706B6C6F6B6C706B6C6F6B6C6F6B6C6F6B6C6F6B6C6F6B6C6F6B6C6F6B6C6F 6B6C6F6B6C6F6B6C6F6B6C6F6B6C6F6B6C6F6B6C6F6A6B6E6B6C6F6B6C6F6A6B6E6A6B6E6A6B6E 6A6B6E6A6B6E6A6B6E6A6B6E6A6B6E6A6B6E6A6B6D6A6B6E6A6B6D6A6B6D696B6D6A6B6D6A6B6E 22262C252A31272D34282D34252A3120252B363B41363B41363B41363B41363B41363B41363B41 363B41363B41363B41363A40363A40363A40363A40363A408282828585854A4D51363B41353A40 5E5F6185858585858584848484848484848484848484848454565935393F6263648484845B5C5E 363B41353A406566688484845E5F61373B41353A40424549828282838383363B41353A40808080 8383834A4C50363A4035393F35393F5E5F618383835F606235393F35393F3E4247828282838383 393D4335393F35393F34393F34393F34393F34393F34393F34393F34393F34393F34393F35393F 34393F35393F22262C242830262B321C242B1C242B1C242C0E10130502020606060202021A1919 C2C1C0FAF7F3F1EEEAF1EEEAF5F2EEDCD7D298918A9C9A9492908D8886838284806F736F363736 1C1C1E1415181515181514181A1B1E18191B080809202125111114000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 0000000000000000000000002E303A26292F09090C2121232628271D1F1F2022222D302E595856 958F8E928C8C9792919B96949E9A96A59F9BD5CFCAF3F0ECF1EEEAF1EEEAF2EEEBFBF8F4969592 020202060606060606050303090A0A1B22291D252C1C242B262B322429301F242934383E33383E 33383E33373D33383E33373D33373D33383E33373D33383E33383E33383E33383E33383E33383E 33383E34383E292C32282B302D313634383E34383E34383E34383E4043485B5D5F55575934393F 34383E34383E34383E34383E34383E34383E6E6F7083838361626435394034383F282B30656667 8484848282825A5C6032373D32373D32373D34383E5A5B5D595A5B383A3E34393F34393F3E4145 85858585858546494D36393F35393F35393F35393F35393F35393F34393F353A40353A40353A40 35393F353A4035393F35393F353A4035393F353A4022262C252A31272C34282D34252A3120252B 68696C696A6D68696C696A6D68696C696A6D696A6D696A6D696A6D696A6D696A6D696A6D696A6D 696A6D696A6D696B6E696A6D696A6D696A6D696A6D696B6E696B6E696B6E6A6B6E696B6E6A6B6E 6A6B6E696B6E6A6B6E696B6E696B6E696B6E696B6E696B6E696B6E696B6E696B6E6A6B6F696B6E 696B6E6A6B6F696B6E6A6C6F6A6C6F6A6C6F6A6C6F6A6C6F6A6B6F6A6C6F6A6B6F6A6B6F6A6C6F 6A6B6F6A6C6F6A6C6F797A7B767778595C5F41454A2C32392C313832363D68696D5A5D602C3138 373B42696B6F6A6B6F6A6C6F474B502D323941454A6A6B6F484B502C31393439406465697A7B7D 4E51562C3138494D516A6B6E2D323A2C31385B5D616A6C6F6A6C6F65676B62646765666A646669 2D32392C31386465696B6C6F6B6C6F6B6C6F6B6C6F6C6D706A6B6F6A6C6F6A6B6F6A6B6F6A6C6F 6A6B6F6A6C6F6A6C6F6A6C6F6A6C6F6A6C6F696B6E696B6E696B6E6A6B6F696B6E696B6E6A6B6F 696B6E696B6E696B6E696B6E696B6E696B6E6A6B6E696B6E6A6B6E6A6B6E696B6E6A6B6E696B6E 696B6E696B6E696B6E696A6D696B6E696A6D696A6D696A6D696A6D696B6E696A6D696A6D696A6D 696A6D696A6D696A6D696A6D696A6D696A6D68696C696A6D696A6D68696C68696D21262C242A31 282C34272C34252A3121252B353A40353A40353A4035393F353A4035393F34393F34393F34393F 34393F34393F34393F34393F34393F34393F82828285858544474B34393F34393F5A5B5E848484 7475754A4D514B4E534A4D514144474144473B3F4434393F6263648484845A5B5D353A4034393F 6466678484845D5E6034383F34383E43454883838383838335393F34383E80808083838343464A 34383E34383E34383E5D5F608383835E5F6134383E34383E3D4146828282828282383B4134383E 34383E34383E33383E34383E33383E33383E33373D33383E33373D33373D33383E33373D33383E 22262C24282F262B321C242B1C242B1C242C0E1013050202060606020202191919C2C1C0FAF8F3 F1EEEAF1EEEAF5F2EDDAD7D396918B9B999591908D8686848386817172703536361A1B1D141517 1615181413171A1A1D1A1A1C060609202125111114000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 00000000000030313A2929300C0C0E2223242628271D1F1F2022232D302E555453948F8E938C8B 9892919A96949E9A96A5A09BD5D0CBF3F0ECF1EEE9F1EEEAF2EEEBFAF7F4969593020202060606 060606050303090A0A1B22291D252C1C242B262B3124292F1F242932373D33373D33373D33373D 33373D33373D33373D33373D33373D33373D33373D33373D33373D33373D33373D33373E34383E 4445484647493B3D4133373E33383E33383E33373E36393D3E40423E404233373D33373E33373E 33373E33383E33373E33383E6D6E6F83838361626434393F33383E5052538383838181813A3B3E 2022251F21241F21241F212432373D6D6E6F84848458585A2123271F2225535456858585858585 3C404634383E34383E34393F34383E34393F34393F34393F34393F34393F34393F34393F34393F 34393F34393F34383F34393F34383F21252C242930272C34272C33252A3120252B67696B67696C 67696C67696C686A6C67696C686A6C686A6C686A6C686A6C686A6C696A6D686A6C696A6D696A6D 686A6C696A6D686A6C686A6C696B6D696B6D696B6D686A6C686A6C696B6D696B6D696B6D696B6D 696B6D696B6D696B6D696B6E696B6D696B6E696B6E696A6D696B6E696A6D696A6D696B6D696A6D 696B6D696B6D6A6B6E696B6D6A6B6E696B6D6A6B6F696B6D6A6B6F6A6B6F6A6B6E6A6B6F696B6D 56595D3B404640454A77777A7F80817677782D32392C31385C5F625A5C602C31382C32395C5E62 6A6B6E63656834393F2C31384D51556A6B6E3C41472C3138595C5F7475776C6D7033373E2C3138 494D516A6C6F393D432C3138494D516A6B6E6A6B6E3A3F452C31384D50556C6D702D333A2C3138 52555972737572737655585C4C4F555C5F636A6B6E6A6B6F6A6B6E6A6B6E6A6B6E6A6B6E6A6B6E 6A6B6E6A6B6E6A6B6E696B6D696B6D696B6E696B6D696B6E696B6E696B6D696B6E696B6D696B6D 696A6D696B6D696A6D696A6D696B6D696A6D696B6D696B6D686A6C696B6D696B6D696B6D696B6D 686A6C686A6C686A6C686A6C686A6C686A6C686A6C696A6D686A6C696A6D696A6D686A6C696A6D 686A6C686A6C686A6C686A6C67696C686A6C67696C67696C67696C21262C242A30282C34272C33 252A3121252B34393F34393F34393F34393F34393F34393F34393F34383F34393F34383F34383F 34393F34383F34393F34393F82828285858544474B34383F33383E5153578484858484842D2F33 23262B2325295252545455573C404633383E62636484848458595A25292D33383E5A5B5E848484 6D6E6E2022261F2125595A5B83838383838335383F33383E80808083838343464A33373E34383E 34383E5D5E608282825E5F6033373D33373D3D4045828282828282373B4033373D33373D33373D 33373D33373D33373D33373D33373D33373D33373D33373D33373D33373D33373D21262B23282F 262B321C242B1C242B1C242C0E1013050202060606020202191919C2C1C0FAF7F2F1EEEAF1EEEA F4F1EDDCD7D398928C9A999491918D8787838485826F706E3637361B1B1D16151818171A141517 1A191D1A191D08080B1F2027121418000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 31303A28292E0B0B0C2121232627281D201F2123232E2F2F52514F948E8C928D8B9692919B9695 9E9896A49F9BD5D1CDF3F0ECF1EEEAF1EEEAF1EEEBFAF7F4969593020202060606060606050303 090A0A1B22291D252C1C242B262B3124292F1F242932363D32373D32373D32363C32373D32363C 32363C32363D32363C32363D32363D32373D32363D32373D32373D32373D32373D7A7A7A838383 5A5B5D33383E33373D32373D33373D50515482828383838335393F33373D33373D33373D33373D 33373D33373D6D6E6F83838360616334383E30343B727374848484848484848484848484848484 848484848484363A4057595D8484848585856A6A6B6D6D6E85858585858568696B34393F33383E 33383E33383E33383E33383E33383E33383E33383E33383E33383E34383E34383F33383E33383E 33383E34383E34383F21262C242A30272C33272C33252A3120242A66676A67686C67686C67686B 68696C67686B67686B68696C68696C68696C67686B68696C68696C68696C68696C68696C68696C 68696C68696C68696C68696C68696C68696C68696C68696C686A6D68696C68696C686A6D68696C 68696C686A6D686A6D686A6D686A6D686A6D686A6D686A6D686A6D686A6D686A6D686A6D686A6D 696A6D686A6D696A6D696A6D696B6D6A6B6E686A6D686A6D696B6E686A6D696B6E6566692D3239 2C3138393E444A4E5340444A2D323930353C6A6B6E5B5D602B31382C31382D333A3C40462E333A 2C31382C32396C6E70696B6D5255592C3138383D434E51563D42472D32382C3138484C50686A6D 5C5E622D32392C31383D4248383C432C31382D32396E70726A6C6F55585C2C32392F343B41464B 3A3F452B31382C3138656669686A6D696B6D696B6E696B6E686A6D686A6D686A6D686A6D696A6D 686A6D696A6D696A6D686A6D696A6D686A6D686A6D686A6D686A6D686A6D686A6D686A6D686A6D 68696C686A6D686A6D686A6D686A6D68696C68696C68696C68696C68696C68696C68696C68696C 68696C68696C68696C68696C68696C68696C68696C68696C68696C68696C67686C67686B67686B 67686C67686B67686C67686C67686C67686C67686C21262C242A30272C33272C33242A3120242A 34383F33383E33383E33383E33383E33383E33383E33383E33383E33383E33383E33383E33383E 33383E33383E82828285858544474A34383E33383E353A40767778848484747475595A5B757676 83838373747534393F33383E60626484848477787856575833373E505357828383838383757575 6C6C6D80818183838383838335383E33373D80808083838343464A33373D33373D33373D5D5E60 8282825D5F6032373D32373D3D4045818181828282373A4032373D32363D32363D32373D32363D 32373D32373D32363C32373D32363C32363C32363D32363C32363D21262B23282E262B311C242B 1C242B1C242C0E1013050202060606020202191919C2C1BFFAF7F3F1EEEAF1EEEAF4F2ECDCD8D4 97938D9B999392918D8687828588826E716D3435351A1B1D1516191617191414171A191C1A191B 060609212125111114000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 00000000000000000000000000000000000000000000000000000000000000000030323827282C 09090C2021242628281E20212223232E302F52514F958F8D918D8B9793939C97969E9896A49F9C D5D1CDF2EFEBF1EEEAF1EEEAF1EEEBFBF8F4969592020202060606060606050303090A0A1B2229 1D252C1C242B252A3123282F1F232931353B32363C32363C32363C32363C32363C32363C32363C 32363C32363C32363C32363C32363C32363C32363C31363C32363D7C7C7C82828260626532373D 32363D32363C32363C56585C83838383838335393F32363C32373D32373D32373D32373D32373D 71727483838366686A33383E393D43838383838383848484848484848484848484848484848484 373A4032373D5B5E61828282848484848484848484656769383B4133383E32373D32373D32373D 33373E32373D32373D33383E32373D33383E33383E33383E33383E33383E33383E33383E33383E 33383E21252C242930272C33272C33242A3120242A65676A66686B66686B66686B66686B66686B 66686B66686B67696C66686B66686B66686B67696C67696B67696B67696B67696B67696B67696B 67696C67696B67696C67696C67696B67696C67696B67696B67696C67696B67696C67696C68696C 68696D686A6D686A6D68696D686A6D68696D68696D68696C68696D68696C68696C68696D68696C 68696D68696D68696C68696D68696C68696C68696D68696C68696D6D6E7163656733383E2C3138 2B31382B3138353A41696B6E6A6C6F595C602B3138383D435154582F333A2C313831353C65676B 6D6F7168696D6D6E703C40462D31382C313841454A55585C2C3138363A4066676A73747554575B 2B31382C31382B313832373D6C6D6F6B6D6F68696C75767853565A2D333A2C31382B313833383E 686A6D6D6E7068696D686A6D68696D68696D68696C68696D68696C68696C68696D68696C68696D 68696D68696C68696D68696C68696C68696D68696C68696D68696D67696B68696D67696B68696C 67696B67696B67696B67696B67696C67696B67696C67696C67696C67696C67696C67696C67696C 67696C67696C66686B67696B67696C67696B66686B67696B67696B66686B66686B67696C66686B 66686B66686B66686B66686B66686B21262C242A30272C33272C332429301F242A33373E33383E 33383E33383E33383E33383E33383E33383E33383E33383E33383E33373E33383E33373E32373D 818181848484484B5033383E32373D32373D3F42486F71728484848484848484847272743D4147 32373D32373D45484D7D7D7D8484847F7F7F32373D33373D65676A828282838383797A7B55575B 83838383838334383E32363C808080838383484A4F33383E32363C32363C636568838383646668 32363C32363C404449818181828282383C4232363C31363C31363C32363C31363C32363C32363C 32363C32363C32363C32363C32363C32363C32363C21252B23282E252A321C242B1C242B1C242C 0E1013050202060606020202191919C2C1C0FAF6F2F1EDE9F1EEE9F3F1ECDBD7D295928B999893 92908C8587828488846C6E6B3133331A1A1C151518161618131316191A1B191B1B050809222226 121215000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 0000000000000000000000000000000000000000000000000000002F313828292F09090E212225 2528271E20212124242D2F2E55535197928F918C8B9893939D97969F9A96A39F9AD4CFCBF3EFEB F1EEE9F1EEE9F1EFE9FAF7F4989594030302060606060606050303090A0A1B22291D252C1C242B 252A3124282F1F232931363C31353C31353C31353C31353C31353C31353C31353C31353C31353C 31353C31363C31353C31363C31363C31363C31363C31363C31363C31363C31363C32363C32363C 31363C31363C32363C32363C32363C32363C32363C32363C32363C32363C32363C32363C32363C 32363C32363C32363C32363C32363C32373D32363C32363D32373D32363D32363D32373D32363D 32373D33383E41444A45484D383B4132363D32373D32363D32373D32373D32373D32373D32373D 32373D32363D32373D32363D32363D32363D32363D32363D32363D32363D33373E32363D21252C 242930272C33272C33242A3020242A65666A66676B66676B66676B66676B66676B66676B66676B 66676B66676B66676B66686B66676B67696B67696B67686B67696B67686B67686B67696B67686B 67696B67696B67686B67696B67686B67686B67686B67686B67686B67696C67686B67686B67686B 67686B67696C67696C67686B67696C68696C67696C68696C68696C67696C68696C67696C67696C 67696C67696C67696C67696C67696C67696C67696C67696C7374757F80807576776D6F70767778 7F808070717367696C585B5F2B3138383D4277787A7F808075767781818272727467696C67696C 6C6D6F7F7F807778797D7D7E7D7E7E77787A858585818182696B6E68696D78787A7F7F7F707173 76777881828270717367696C67696C68696C77787A7F7F8071727476777881828271727467696C 67696C67696C67696C67696C68696C67696C68696C68696C67696C68696C67696C67696C67696C 67696C67696C67696C67686B67686B67696C67686B67696B67686B67696B67696B67686B67696B 67686B67686B67686B67686B67686B67686B67686B67686B67686B67686B67686B67686B66676B 66676B66686B66676B66686B66686B66676B66686B66676B66676B66686B66676B66686B66686B 66676B66686B66676B21252C242930272C33272C332429301F242A33373E32363D32363D32363D 32363D32363D32363D32363D32363D32363D32363D32373D32363D32373D32373D32373D32373D 32373D32373D32373D32373D32373D32373D3B3F4545494D3A3E4432373D32363D32373D32363D 32363D32363D383C42383C4232363C32363C32363C35393F3C404633373D32363C32363C32363C 32363C32363C32363C31353C32363C32363C32363C31363C31353C31363C31353C31353C31363C 31353C31363C31363C31363C31363C31363C31363C31353C31363C31353C31353C31353C31353B 31353C31353B31353B31353B31353C21252B23282E262A311C242B1C242B1C242C0E1013050202 0606060202021A1A19C2C1C0FAF7F3F1EDEAF1EEEAF4F1EDDDD8D297928B999891918F89858581 868885686B683133321B1B1D14151716161A1413171A1B1C191B1C050609222229111116000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 00000000000000000000000000000000000000000031313B29293209090E2122242426261E2020 2326262C2F2F53525198938F928D8A9691919D98979F9A97A49F9BD4CFCBF2EFECF1EEE9F1EDEA F1EFEAFAF8F5959392030302060606060606050303090A0A1B22291D252C1C242B252A3123282F 1E232930343A2F343A30343A30353B2F343A30343A30353B30343A30353B30343A30343A30353B 30343A30353B30353B30343A30353B30343A30343A30343B30343A30343B30343B30353B30343B 30353B30343B30353B30353B30353B30353B30353B30353B30353B30353B30353B30353B30353B 30353B30353B31353C31353C31353C30353B31353C30353B30353B31353C30353B31353C31353C 31353C31353C31353C31353C31353C31353C31353C31353C31363C31353C31363C31363C31353C 31363C31353C31353C31363C31353C31363C31363C31353C31363C31353C20252B24282F262B33 272B332429301F242A64666865666965666965676A65666965676A65676A65666965676A656669 65666965676965666965676965676965666965676965666966676A66676A66676A66676A66676A 66676A66676A66676A66676A66686B66676A66686B66686B66676A66686B66676A66676A66676A 66676A66686B66686B66676A66676A66686B66676A66686B66686B66686B66686B66686B66686B 66686B66686B66686B66686B66686B66686B66686B67686C6B6D6F6E6F716C6D6F67686C67686B 67686B585A5E2B3138383D4266686B68696D6B6D6F67696C67686C66686B67686C66686B66686B 6B6D6F686A6D66686B66686B66686B66686B66686B66686B66686B68696D6D6E716B6D6F66686B 66686B66686B66686B67686C66686B686A6D6D6E716B6C6F67686C66686B66686B66686B66686B 66686B66686B66686B66686B66686B66686B66686B66686B66686B66686B66686B66686B66686B 66686B66676A66676A66676A66676A66676A66676A66676A66676A66686A66676A66686A66686A 66676A66686A66676A66676A66686B66676A66686B65676A66676A66686B66676A656669656769 66676A656769656769656669656769656669656669656669656669656669656669656669656669 65666921252C242930262B32262B332429301F242A31363C31353C31353C31363C31353C31363C 31363C31353C31363C31353C31353C31363C31353C31363C31363C30353B31363C30353B30353B 30353C30353B30353C30353C31353C30353C31353C31353C30353B30353B31363C30353B30353B 30353B30353B30353B30353B30353B30353B30353B30353B30353B30353B30353B30353B30353B 30353B30353B30343B30343A30343B30343B30343B30343B30343B30343B30343B30343B30343B 30343B30353B30343B30353B30353B30343A30353B30343A30343A30353B30343A30353B30353B 30343A30343A2F343A20252B23282E252A311C242B1C242B1C242C0E1013050202060606020202 1A1A1BC4C2C1FAF6F2F0EDEAF1EEEAF3F1ECDFDBD69B958F99999391908B848582868885676967 3233321A1B1D1515171616191313151B1A1B19191B060809222228121215000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 00000000000000000000000000000031323A282B3109080C2122242527281E21202225242D2E2D 504F4F98928E928E8B9692919D98969E9997A49F9BD4CFCBF3F0ECF1EEEAF1EEE9F1EEEAFBF8F4 94928F030302060606060606050303090A0A1B22291D252C1C242B252A3123282E1E23292F343A 2F343A2F343A2F333A30343A2F333A30343A30343A30343A30343A30343A2F343A30343A2F343A 2F343A30343A2F343A30343A30343A30343A30343A30353B30343A2F343A30343A2F343B2F343A 30353B2F343B30353B30353B30343B30353B30343B30343B2F343B30343B2F343B2F343B30353B 2F343B30353B30353B30343B30353B30343B30343B30343B30343B30343B30343B30353B30343B 30353B30353B30343B30353B30343B30343B30343B30343B30353C30353C30353B30353C30353B 31353C31353C31353C31353C31353C31353C31353C31353C20252B23282F262B32262B32242930 1F242A636568646669646669646669656669646669646669646669646669646669646669646669 64666964666964666964666964666964666964666965666965676A66676A66676A65676A66676A 65676A65676A65676A65676A65676A65676A65676A65676A65676A65676A65676A65676A65676A 65676A66676A65676A66676A66676A65676A66676A65676A66686B66676B66686B66676B66676B 66686B66676B66686B66686B66676B66686B66676B66676B66676B66676B66676B66676B585A5E 2B3138383D4266686B66676B66686B66676B66676B66686B66676B66686B66686B66676B66686B 66676B66676B66676B66676B66676B66676B66686B66676B66686B66686B66676B66686B66676B 66676B66686B66676B66686B66686B66676B66686B65676A66676B65676A65676A66676B66676B 66686B65676A66676A66676A66686B66676A65676A65676A65676A65676A65676A65676A66676A 65676A66676A66676A65676A66676A65676A65676A65676A65676A65676A65676A66676A65676A 66676A66676A65676A656669646669646669646669646669646669646669646669646669646669 64666964666964666964666964666965666964666964666964666964666965666963656820252B 23282F262B32262B322429301F242A30353C31353C31353C31353C31353C31353C31353C31353C 30343B31353C31353C30343B30343B30343B30343B30343B30343B30343B30343B30353B30343B 30353B30353B30343B30353B30343B30343B30353B2F343B30353B30353B30343B30353B30343B 30343B2F343B30343B2F343B2F343B30353B2F343B30353B30353B30343B30343A30343A30343B 2F343B30343A2F343A2F343B30343A2F343A30343A30343A2F343A30343A2F343A2F343A2F343A 2F343A2F343A2F343A30343A2F343A30343A30343A30343A2F343A2F333A2F333A30343A30343A 30343A20252B22272E252A311C242B1C242B1C242C0E10130502020606060202021A191AC3C2C0 F9F7F2F0EDE9F0EEE9F4F1ECDEDAD69B958F9898948F8F8C8585818687856668663334341C1B1E 1614181517191414161A191C1A1A1B08060B212227111214000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 00000000000000000033343C292A300C0B0F2121242728281F212021232530312F504F4D98928F 928D8B9692919C98979D9997A59F9BD5D0CBF2EFECF1EEEAF0EEE9F1EFE9FBF8F4989593030303 060606060606050303090A0A1B22291D252C1C242B252A3123282E1E23292E33392F33392F3339 2E33392F333A2E33392E33392E33392F33392F33392F33392F343A2F33392F343A2F343A2F343A 2F343A2F343A2F343A2F33392F343A2F33392F33392F333A2F343A2F333A2F343A2F33392F333A 2F343A2F343A2F343A2F343A2F343A2F343A2F343A2F343A2F343A2F343A2F343A2F343A2F343A 2F343A2F343A2F343A30343B2F343A2F343A30343B2F343A2F343A2F343B2F343A2F343B2F343B 30343B2F343B30343B30343B2F343A30343B2F343A2F343A30343B2F343A30343B30343B2F343A 30343B30343B30343B30343B30343B30343B20252B23282F262A32262B3224282F1F2329636467 636568636568636568646669636568646568646568646568646568646568646669646568646669 64666964666964666964666964666964656864666964656864656864666964656864666964676A 64656864676A64666964666964676A64666964676A64676A64666964676A646669646669646669 64666964666964666965676A64666965676A65676A64666965676A64666964666965676A646669 64666965676A64676A65676A64676A64676A65676A64676A65676A64666967686B64666966676A 65676B65676A65676B65676A65676A65676A65676A64666965676A66676B64666966676B66676B 66676B66676B66676B66676B65676A66676B65676A65676A64676A65676A65676B64676A646669 65676B65676A65676A65676B65676A64676A65676B65676A64676A646669646669646669646669 64666964666965676A64666965676A65676A64666965676A646669646669646669646669646669 64666964676A64666964676A64676A64666964666964666964666964676A64666964676A646669 646568646669646568646568646568646568646568646568646669646568646669646669646669 64666964666964666963656863656864656864656863656863656863656820252B23282F262B32 262B322429301F242A30343B30343B30343B30343B30343B30343B30343B2F343A2F343A2F343A 2F343A30353B2F343A30343B30343B30343B30343B30343B30343B2F343A30343B2F343A2F343A 2F343A2F343A2F343A2F343A2F343A30343B2F343A2F343A2F343A2F343A2F343A2F343A2F343A 2F343A2F343A2F343A2F343A2F343A2F343A2F343A2F343A2F343A2F343A2F343A2F33392F343A 2F33392F33392F333A2F33392F333A2F333A2F333A2F333A2F333A2F333A2F33392F333A2F3339 2F33392F333A2F33392F333A2F333A2F33392F333A2E33392E33392F33392E33392E33391F242A 22272E252A311C242B1C242B1C242C0E101305020206060602020219191AC2C1C0F9F6F2F0EDE9 F1EEEAF4F1EDDDD9D498918B999893908F8A8384828688856466633132321B1B1D151518151618 14131619191D19191A08090B232229141216000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 00000031323A282A2F09090C2323252628281E21202225262E2F304C4C4A97938F948E8C979392 9D99979E9A97A39F9AD3CECAF3F0EDF1EEEAF1EEEAF2EFEBFBF8F4979593030302060606060606 050303090A0A1B22291D252C1C242B24293022272E1E22282E33392E32392F33392E33392E3239 2E33392E33392F33392E33392F33392F33392E33392F33392E33392E33392E33392E33392E3339 2E33392F33392E33392F33392F33392F33392F33392F33392F33392E33392F33392E33392E3339 2E333A2E33392E333A2E333A2F343A2E333A2F343A2F343A2E333A2F343A2E333A2E333A2E333A 2E333A2E333A2E333A2F333A2F333A2F333A2F333A2F333A2F333A2F333A2F333A2F343A2F333A 2F343A2F343A2F333A2F343A2F333A2F333A2F333A2F333A2F333A30343B2F343A2F333A2F343A 30343B30343B30343B30343B20252A23282F262B32262B322429301F242A616367626568626568 646568626568636568646568646568646568646568646568636568646568636568636568636568 636568636568636568636568636568636568636568646568636568646568646568636568646568 646669636568636568646669646669646669646669646669646669646669646669646669646669 646669646669646669646669646669646669646669646669646669646669646669646669646669 64666964666964666964666964666964666964666965666A686B6D6F70726D6F7165676A646669 64666965676A64666965676A65676A64666965676A65666A65676A65666A65666A64666965666A 65666964666964666965666964666964666964666964666965676A64666964666965676A646669 646669646669656669646669646669646669646669646669646669646669646669646669646669 646669646669646669646669646669646669646669646669646669646669646669646669646669 646669646669646568646669646669636568646669636568636568636568636568646568636568 646568646568646568646568646568646568636568646568636568636568626467636568636568 62646763656862646762656863656863656862656863656820252A23282F252A32262B3223282F 1F23292F343B30343B30343B2F343A30343B30343B30343B2F333A2F343A2F333A2F333A2F333A 2F333A2F333A2F333A2F333A2F333A2F333A2F333A2F333A2F333A2F333A2F333A2F343A2F333A 2F343A2F343A2E33392F343A2E33392E33392E333A2E33392E333A2E333A2F343A2E333A2F343A 2F343A2E333A2F343A2E333A2E333A2E333A2E33392E333A2E333A2F333A2E33392F33392F3339 2E33392F33392E33392E33392F33392E33392F33392F33392E33392F33392E33392E33392F3339 2E32392E32392F33392F33392F33392F33392E33392F33392E33392E32391F232A22272D242930 1C242B1C242B1C242C0E101305020206060602020219191AC2C1BFF9F6F2F0EDE9F0EEE9F4F0EC DEDBD599948F99979292928D848784878A8361635F3031311A1C1C1416171616181414161A1B1C 1A1A1B08080C24242C141416000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF00000000000000000000000000000000000000000000000000000000000000000033363D 2A2B3009090C2525282729291D1F1F2123242F312F4C4B4A98928F958F8D9894929E99989E9A98 A49F9BD5CFCAF2EEEBF1EDE9F1EEE9F1EEEAFAF7F4989694030503060606060606050303090A0A 1B22291D252C1C242B24293022272E1E22282D32382D32382D32382D32382E32392E32392D3238 2E32382E32392E32382E32382E32392E32382E32392E32392E32392E32392E32392E32392E3238 2E32392E32382E32382E32392E32382E33392E32392E33392E32392E32392E32392E32392E3239 2E32392E33392E33392E33392E33392E33392E33392E33392E33392E33392E33392E33392E3339 2E33392E33392E33392E33392E333A2F333A2E333A2F333A2E33392E333A2F333A2E333A2E333A 2E33392E333A2E33392E33392E333A2E33392E333A2E333A2E333A2F333A2F333A2F333A2F333A 2F333A2F333A1F242A23282F252A32252A3223282F1F2329616266626367626367626467626367 626467636568626367626467636467636467636568636467636568636568636568636568636568 636568636468636568636468636468636568636468636568636568636468636568636468636468 636568636569636568646669636569646669636569636569636669636569636669636669636568 636669636568636568636569636568636569636569646669636569646669646669636669646669 636669636669636568636669636568636568636569636568636569636569636669636569636669 636669646669636669636568636568636669646669636669636669646669636669646669646669 636569646669636569636569636669636569636669636669636569636669636569636569646669 636569646669646669636569646669636569636569636669636569636669636669636568636669 636568636568636569636568636569636569636568636569636568636568636568636568636568 636669636568636568636467636467636468636467636468636468636568636468636568636568 636467636568636467636467636568636467626467636568636568626467626467626467626367 6264676263676263676264676263676264671F242A23282F252A32252A3223282F1F23292E3339 2E333A2F333A2F333A2F333A2E333A2F333A2E33392E333A2E33392E33392E333A2E33392E333A 2E333A2F333A2E333A2F333A2F333A2E33392F333A2E33392E33392E333A2E33392E33392E3339 2E33392E33392E33392E33392E33392E33392E33392E33392E33392E33392E33392E32382E3339 2E33392E32392E32392E33392E32392E32382E32382E32392E32382E32392E32392E33392E3239 2E33392E33392E32392E33392E32392E32392E32382E32392E32382E32382E32392D32382E3239 2E32392E32392D32382D32382D32382D32382D32382D32381E232922272D2429301C242B1C242B 1C242C0E101305020206060602020219191AC2C1BFF9F7F1F0EDE9F0EEE9F3F1EBDEDBD69B9690 9A989392908C86878386898261635E3334341C1C1E1415171616191313161A1B1C1B1A1C08060B 27282D151519000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 00000000000000000000000000000000000000000000000000000000000033333D2A2C3209090F 28272A282A2B1C1F202123242F302D49494796908E958F8D9792919E9A989E9A98A49F9AD5D0CB F1EEEAF0EDE9F1EEE9F1EEEAFBF8F5979593030302060606060606050303090A0A1B22291D252C 1C242B24293022272D1D22282C31372C31372C31372C31372C31372D31382C31372C31372D3138 2C31372C31372D31372D31372D31372D31372D31382D31372D31382D31382D31382D31382D3138 2D31382D31382D31382D31382D31382D31372D31382D31372D32382D32382D31372D32382D3138 2D31382D32382D32382D32382D32382D32382D32382D32382D32382D32382D32382D32382D3238 2D32382D32382D32382D32382D32382D32382D32392D32382D32392D32382D32382D32392D3238 2D32392D32392D32392D32392D32392D32392D32392D32392D32392D32392E32392D32392E3239 1F242A22282E252A31252A3223282F1E2329606265616366616366616367616366616367616367 616366616367616366616366626467616366626467616366626467616366626467626467626467 626467626467626467626467626467626467626467626467626467626467626467626467626467 626467626467626467626467626467626467626468636468626467626468636468626468636468 636468626468636468626468626468626468626468626468626468626468626468626468626468 636468626468636468636468626468636468626468626468636468626468636468636468626468 636468626468626468626468626468626468626468636468626468636468636468626468636468 626468626468636468626468636468636468626468636468626468626468626468626468626468 626468636468626468636468636468626468626467626467626468626467626468636468636468 626467626467626467626467626468626468626467626468626467626467626467626467626467 626467626467626467626467626467626467626467626467626467626467626467626467626467 616366626467626467616366616366626467626467616366616366616366616366616366616366 6163666163666163666163661F242A22272E252A31252A3123282F1F23292E32392D32392E3239 2D32392D32392D32392D32392D32382D32392D32382D32382D32382D32382D32382D32382D3239 2D32382D32392D32392D32392D32392D32382D32382D32392D32382D32382D32382D32382D3238 2D32382D32382D32382D32382D32382D32382D32382D32382D32382D32382D32382D32382D3138 2D31382D32382D31382D31382D31382D31382D31382D31382D31382D31382D31382D31382D3138 2D31372D31382D31372D31372D31382D31372D31382C31372C31372D31382D31382D31382D3138 2C31372C31372C31372C31372C31372C31371E232922272D2429301C242B1C242B1C242C0E1013 05020206060602020219191AC2C0BFFAF6F2F1EDE9F1EEE9F4F1ECDFDCD79A9692999794928F8B 868581878A8260645F3333331B1C1E15161817161913141618191B191A1C09090C26272B141416 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 00000000000000000000000000000000000000000000000034363F2B2D3308080C27282B292B2B 1D1F1F2223223233304C4A4A928C8A938D8C9792919D99989E9B98A49F9BD5CECAF2EFEBF0EDE9 F1EEE9F2EEEAFBF8F5989694030303060606060606050303090A0A1B22291D252C1C242B242930 22272D1D22282C30362C30372C30372C30362C30372C30362C30362C30372C31372C30372C3137 2C31372C30372C31372C31372C31372C31372C31372C31372C31372C31372C31372C31372C3037 2C31372C30372C30372C31372C30372C31372C31372C31382C31382C31372C31372C30372C3137 2C30372C30372C31372C30372C31372C31372C31382C31372C31382C31382C31372C31382C3137 2C31372C31382C31372C31382C31382D31382D31382C31382C31382D31382D31382D31382D3138 2D31382D31382D31382D31382D31382D31382D31382D31382D31382D31382D31381F242A22282E 242A31252A3223282F1E23295F6165616266616266606266616266606266606266606266606266 606266606266616266606266616266616266616366626367606266616366626367616366616266 626367616366626367616366616366626367616366626367626367616366626367616366616366 616366616366616366616366616366616366616366626467626367626467626468626468626467 626367626467616366626468626467626468626468626468626468626468626468626467626468 626467626467626468626467626468626468626467626468626467626467626467626467626467 626467626468626467626468626468626467626468626467626467626468626467626468626468 626367626468626367626367626468626367626468626468626467626468626467626467626467 626467626467626467626467616366616366626467626367626467626367626367626467626468 616366616366626367616366626367626367626367626367626367626367616366626367616366 616366626367616366626367626367616366626367616366616366616366616366616366606266 616266606266616266616266606266616266606266606266616266606266616266616266606266 6162666062661F242A22272E252A31242A3123282F1F22292D32382D31382D31382D31382D3138 2D31382D31382D31382D31382D31382D31382D31382D31382D31382C31382D31382D31382D3138 2C31372C31382C31372C31382C31382C30372C31382C30372C30372C31382C30372C31382C3138 2C31382C31382C31382C31382C30372C31382C30372C30372C31372C30372C31372C31372C3137 2C31372C31372C31372C31372C31372C31372C31372C31372C31372C31372C31372C31372C3137 2C31372C31372C30362C30372C30362C30362C30372C31372C30372D31372C30362C30372C3036 2C30362C30372C30362C30371E232921262D2429301C242B1C242B1C242C0E1013050202060606 0202021A191AC2C1C0F9F6F2F0EDE8F1EEE9F3F1ECDFDBD89B989399999391908B84857F84897F 5B5F5A3233331C1B1D1515181617181414161A1A1C1A191C0C0B0F27292D141518000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 00000000000000000000000000000000000034373E2E2F3409090C27282B2A2C2B1D1F1F202322 3334334D4B4B8E8887928C8B9792919E98989E9A98A49E99D4CFC9F2EEEBF0EDE9F1EEE9F1EEEB FAF8F4979593030302060606060606050303090A0A1B22291D252C1C242B23282F22272D1D2228 2B30362B2F362B2F362B30362B2F362B30362B30362C30372B30362B30362B30362C30362B3036 2C30362C30362C30372C30362C30372C30372C30372C30372C30372C30372C30372C30372C3037 2C30372C30362C30372C30362C30362C30372C30362C30372C30372C30372C30372C30372C3037 2C30372C30372C30372C30372C30372C30372C30372C30372C30372C30372C30372C30372C3037 2C30372C30372C30372C31372C30372C31372C31372C31382C31372C31382C31382C30372C3138 2C30372C30372C31382C30372C31382C31382C31382C31382C31381F232922272D242930242A30 22272E1E22285F6165606265606265606265606265606265606265606266606265606266606266 606265606266606265606265606266616366606266606266606266606266616366606266616366 616366606266616366616366616366616366616366616366616366616366616366616366616366 616366616366616366616366616366616366616366616366616366616366616366626367616366 616367616366616367616366616366616366616366616366616367616366616367616367616367 616367616366616367616367616367616367616367616367616366616367626367626367616367 626367616367616367616367616367616366616367626467616367626467616366616367626467 616366616367616367616367616366616367626367616367626367616366626367626367616366 626367616366626367616366616366616366616366616366616366616366616366616366616366 616366616366616366616366616366616366616366616366616366616366616366616366616366 606266606265606265606265606265606265606265606266606265606266606266606265606266 6062656062656062666062656062666062666062666062666062666062666062666062665F6165 1F232A22272E252A31252A3122282E1E22282C31382C30372C30372C31382C30372C31382C3138 2C31382C31382C31382C31382C30372C31382C30372C30372C31382C30372C30372C30372C3037 2C30372C30372C30372C30372C30372C30372C30372C30372C30372C30372C30372C30372C3037 2C30372C30372C30372C30372C30372C30372C30372C30372C30372C30372C30372C30372C3037 2C30372C30372C30372C30372C30372C30362C30372C30362C30362C30362C30362C30362C3036 2B30362B30362C30372B30362C30362B30362B2F362B2F362B30362B2F362B30362B30362B3036 2B30362B30361E222821262C2429301C242B1C242B1C242C0E1013050202060606020202191A1A C2C1C0F9F6F1F0EDE9F0EDE8F4F1ECDFDBD79B96929A999490908B85878184887F575A56313333 1C1C1E151518161719131416191A1C1B191C0B090C28282D16161A000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 00000000000000000000000034333D2C2D3209090E26272C282A2B1E21202124243233344D4C4A 8B8585928C8B96908F9D97969E9998A39C9AD4CFCAF2EFEAF0EDE9EFEDE8F1EFE9FAF7F4999694 030303060606050606050303090A0A1B22291D252C1C242B23282F22272D1D22282A2F352B2F36 2B2F362B2F362B2F362B2F362B2F362B2F362B30362B2F362B2F362B30362B2F362B2F362B3036 2B2F352B30362B30362B30362B30362B30362B30362B30362B30362B30362B30362B30362B2F36 2B30362B2F362B2F362B30362B2F362B30362B30362B30362B30372B30362B30362A2F362B3036 2B2F362B2F362B30372B2F362B30372B30372B30362B30372B30362B30362B30372B30362B3037 2B30372B30372C30372B30372B30372C30372B30372C30372B30372C30372C30372C30372C3037 2C30372C30372C30372C30372C30372C30372B30371F232A22272E242A30242A3122282E1E2228 5B5D616061656061656061655F61645F61646061655F61656061655F61655F61656061655F6165 6061656061655F61656061655F61655F61655F61655F61656062655F6165606165606265616266 6162666062656061655F61655F6165616266606265616266616266606266616266606266606266 606265606266606265606265616266606265616266616266606265616266606265606265606266 606265606266606266616367606266616366616367616367616366616367616367616266606266 616266616266616266616367616266616266616367616367616367606266616266616367616266 616367606266616266606266606266616366616367606265616366616266606265616367616367 616366616266606265606265616266606265616266616266606266616266606266606266606265 606266606265606265616266606265616266616266606265616266606265606265606266606265 6062666062666163666062666062656163666062666163665F6165606266606165606266616266 6061656061656061656061656061655F61656061655F61655F61656061655F6165606165606165 5F61656061655F61655F61655F61655F61655F61645F61656061655F61655C5E621F232A22272E 252931242A3122272E1E22282B30372C30372C30372C30372C30372C30372C30372C30372C3037 2C30372B30372B30372C30372B30372B30372C30372B30372B30362B30362B30362B30362B3036 2B30362B30372B30362B30372B30372B2F362B30372B2F362B2F362B30372B2F362B30362B3037 2B30362B30362B30362B30362A2F362B30362A2F362A2F362B30362A2F362B30362B30362B3036 2B30362B30362B30362B30362B30362B30362B30362B30362B2F362B30362B2F362B30362B2F36 2B30362B2F362B30362B2F362B2F362B2F362B2F362B2F362B2F362B2F362B2F362B2F362A2F35 1E222821262C2429301C242B1C242B1C242C0E10130502020606060202021A191AC3C0C0F9F6F2 F0EDE9F0EEE9F3F1ECE1DED99D9792979591908F8A898884888A825557543232321B1C1E141618 161719141316181A1D19191C0C0B0E27282C151519000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 0000000002023B3E442B2D3309090C28282C292A2A1E21212023233334344D4C4A898382938D8B 96908F9C97969E9998A39C99D2CEC9F2EFEBF0EDE9EFECE8F1EEE9FBF8F4999794030303060606 050606050303090A0A1B22291D252C1C242B21262D21262D1D2127272C332A2F352A2F352A2F35 2A2F352A2F352A2F352A2E352A2F352A2F352A2E352A2E352A2F352A2F352A2F352A2F352A2F35 2A2F352A2F362A2F362A2F362A2F362A2F362A2F362A2F362A2F362A2F362A2F362A2F362A2F36 2A2F362A2F352A2F362A2F352A2F352A2F362B2F362B2F362A2F362A2F362B2F362A2F362B2F36 2B2F362B2F362B2F362B2F362B2F362B2F362B2F362B2F362B2F362B2F362B2F362B2F362A2F36 2B2F362A2F362A2F362A2F362A2F362B2F362B2F362B2F362B2F362B30372B30372B30362B3037 2B30362B30362B2F362B3036292D341F232A22272E242930242A3122272E1E22284B4E535F6165 5F61655F61655F61655F61655F61655F61655F61655F61655F61655F61645F61655F61645F6164 5F61655F61645F61655F61655F61655F61655F61655F61655F61655F61656062655F61655F6165 5F61655F61655F61655F62656062655F61655F61655F62655F62655F62655F62656062655F6265 6062656062655F62656062655F62655F62656062655F6265606265606265606265606265606265 6062655F62656062655F62655F62655F62655F62655F62655F62656062655F6265606265616366 5F62656062655F62655F62655F62656062665F62655F62655F62655F62655F62655F6265606265 5F62656062656062655F62656062655F62655F62656062655F6265606265606265606265606265 6062656062655F62656062655F62655F62655F62655F62655F62655F62656062655F6265606265 6062655F62656062655F62655F62656062655F6265606265606265606265606265606265606265 5F62655F61655F62655F62655F61655F62655F61655F61656062655F61655F61655F61655F6165 5F61655F61655F61655F61655F61655F61655F61655F61645F61655F61645F61645F61655F6164 5F61655F61655F61655F61655E60645F61655F61645E60644C4F541F232921262D242A31242930 22282E1E2229282D342B30372B30372B30362B30372B30362B30362B2F362B30362B2F362B2F36 2A2F362B2F362A2F362A2F362B2F362B2F362B2F362B2F362B2F362B2F362B2F362B2F362B2F36 2B2F362B2F362B2F362B2F362B2F362B2F362B2F362B2F362B2F362B2F362B2F362A2F362A2F35 2A2F362A2F362A2F362A2F362A2F362A2F362A2F352A2F362A2F352A2F352A2F362A2F352A2F36 2A2F362A2F362A2F362A2F352A2F352A2E352A2F362A2F352A2F352A2F352A2E352A2E352A2E35 2A2F352A2E352A2F352A2F352A2F352A2F352A2F352A2F352A2E352A2F35282C331E222821262C 21262D1C242B1C242B1C242C0E10130502020606060202021A191AC1C1BFF9F7F1F0EEE8F0EDE8 F1EFEAE0DDD89B969094948E8E8E898C8A87888A855253503434341B1B1D151518171619141417 191A1C1A1B1C0C0C0F28292E151519000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000202 3C40462C2E3209080B272729282B2B1D20212022233335324A4A48878280938D8B9892909D9997 9E9996A39C98D3CEC8F2EFEBF1EDE9F0EEE9F1EEEAFBF8F5989793030302060606050606050303 090A0A1B22291D252C1C242B1C202622272E20252C1B1F25262B31292D34292E34292D34292E34 292E34292E34292E34292E34292E34292E34292E35292E35292E34292D34292E35292D34292D34 292E34292E34292D34292E34292E35292E34292E35292E35292E34292E35292E34292E34292E34 292E34292E34292E34292E352A2E35292E352A2E35292E34292E35292E342A2E35292E352A2E35 292E35292E352A2E35292E352A2E352A2E352A2E352A2E352A2E352A2E35292E352A2E35292E35 292E352A2E35292E352A2E352A2F36292E352A2F36292E352A2E352A2E352A2E352A2F362A2F36 2A2F36282D331D202621262D23282F24293024293023282F21262D24282D56595D5D5F635D5F63 5D5F635E60635D5F635E60645D5F635E60635E60645E60645E60645E60645E60645E60635E6064 5E60635E60635E60635E60635E60635E60635E60635E60635E60635E60635E60635E60635E6063 5E60635E60635E60635E60635E61645F61655E60635E60645E60645E60635F61655E61645E6164 5E61645E61645E61645E61645F61645E61645F61645F61645E61645F61645E61645E61645E6164 5E61645E61645E61645F61645E61645F61645F61645E61645F61645E61645E61645E61645E6164 5E61645E61645F61655E61645F61655F61655F61655F61655F61655F61655E61645F61655E6164 5E61645E61645E61645E61645E61645E61645E61645E61645E61645E61645E61645E61645E6164 5E61645E61645E61645E61645F61655E61645F61655F61655E61645F61655E61645E61645E6164 5E61645E61645E61645F61645E61645F61645F61645E61645E60635E61645E60635E61645E6063 5E60635E60635E60635E60635E60635E60635E60635E60635E60635E60635E60635E60635E6063 5E60635E60645E60635E60645E60645E60645E60645E60635E60645E60635E60645D5F635E6063 5E60635D5F635D5F635D5F635D5F63575A5E25292E21262D23282F23293024293022282F20252C 1D2026272C322A2E352A2F362A2E352A2F362A2F362A2F362A2E352A2F362A2E352A2E352A2F36 2A2E352A2E35292E352A2E35292E35292E35292E35292E35292E35292E352A2E35292E352A2E35 2A2E35292E35292E35292E35292E35292E34292E35292E34292E34292E35292E34292E35292E35 292E34292E35292E34292E34292E34292E34292E34292E34292E35292E34292E35292E35292E34 292E34292E34292E34292E34292E34292D34292E34292E35292E34292E34292E34292D34292E34 292D34292D34292E34292D34292E34292E34292E34272C321C1F2520252C22272E1C20261C242B 1C242B1C242C0E1013050202060606020202191919C1C0BFF8F6F1EFEDE8F0EDE9F0EEE9DFDCD8 9B969191928D8E908A8C8C87898A855253513434351A1A1D14151816161A1214181A191D1B1C1D 0D0F1129292F161619000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 0000000000000000000000000000000000000000000000000000000000000000023437412C2E32 09090C262728282B2B1C1F20202424323432484745878280938E8C9792909E99979F9A97A39E99 D2CDC9F2EFEBF1EDEAF0EDE9F0EEE9FBF8F4999794030303060606050606050303090A0A1B2229 1D252C1C242B11141722272E21252C1C212615181C1C2025262A30292D34282D33282D33292D34 282D33292D34292D34282D33292D34282D33282D33292E34282D34292D34292D34292D34292E34 292D34292D34292E34292E34292E34292E34292D34292E34292D34292D34292E34292D34292E34 292E34282D34292E34282D34282D34292E34292D34292E34292E34292E34292E35292E35292E34 292D34292E35292D34292D34292E35292D34292E35292E35292E35292E35292E35292E35292E35 292E35292E35292E352A2E35292E352A2E35292E35292D342A2E35292E34262B311D212515181D 1D212722262D23292F23293024293023282F21262D1D21261D202340424557595D5D5F635C5F62 5C5F625D5F635D5F635E60635D5F635D5F635D5F635D5F635D5F635E60635C5F625E60635E6063 5E60635E60635E60635E60635E60635E60635E60635E60635D5F635E60635D5F635D5F635E6063 5D5F635E60635E60635D5F635E60635D5F635D5F635E61645D5F635E60635E61645E61645E6063 5E60635E61645E60645E61645E60645E60645E60645D5F635E60645E60645E61645E60645E6164 5E61645E61645E61645E61645E61645E61645E61645E61645E61645E60645E61645E60645E6064 5E61645E60645E61645E61645E60645E61645E60645E60645E61645E60645E61645E61645E6164 5E61645E61645E61645E61645E61645E61645E61645E60645E61645E60645E60645E61645E6064 5E61645E61645E60645E61645E60645E60645E61645E60645E61645E61645E61645E60635E6063 5E61645D5F635E61645D5F635E60645E5F635E60645E5F635E5F635E60635E5F635E60635E6063 5E60635E60635E60635E60635E60635E60635E60635E60635D5F635E60635D5F635D5F635E6063 5C5F625E60635D5F635D5F635E60635D5F635C5F625D5F635C5F625D5F635D5F635D5F635D5F63 5D5F63585A5E4143461E21241D212621262D23282F24293023293023292F22262D1D212616181D 1D2125262B31292E35292E34292D342A2E35292D342A2E35292E35292D34292E35292D34292D34 292E35292D34292E35292E35292E35292E35292E35292E35292E35292E34292E35292E34292D34 292E34292D34292D34292E34292D34292E34292E34282D34292E34282D34282D34292E34282D34 292E34292E34292E34292E34292E34292E34282D34292E34282D34282D34292D34282D34292D34 292E34292E34292D34292D34292D34292D34292D34292D34292D34292D34292D34292D34292D34 282D33292D34282D33262A301C202515181C1C202621262C23282E1114171C242B1C242B1C242C 0E1013050202060606020202191919C1C0BFFAF6F2F0EDE9F0EDE9F2EFEBE4E0DCA29C9792918B 8F8E898C8B868A8A855152503434341A1A1D1415181615191314181A191D1C1C1E0E0F122A2A2F 181819000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 0000000000000000000000000000000000000000000000000002023638402F30340A0A0D252728 282B2C1D1F2220222331333244454385827F958F8D9591919D9896A09A98A39D9AD2CEC8F2EFEA F0EEE9F0EEE9F1EEE9FBF7F4999693030302060606050606050303090A0A1B22291D252C1C242B 02030321252B22262D1E232A191D231114180B0D0F0B0D0F0B0D0F0B0D0F0B0D0F0B0D0F0B0D0F 0B0D0F0B0D0F0B0D0F0B0D0F0B0D0F0B0D0F0B0D0F0B0D0F0B0D0F0B0D0F0C0D100B0D0F0C0D10 0C0D100C0D0F0C0D100C0D0F0C0D0F0B0D0F0C0D0F0B0D0F0B0D0F0B0D0F0B0D0F0B0D0F0B0D0F 0C0D0F0B0D0F0C0D0F0C0D0F0B0D0F0C0D0F0B0D0F0B0D0F0C0D100B0D0F0C0D100C0D100B0D0F 0C0D100B0D0F0B0D0F0B0D0F0B0D0F0B0D0F0B0D0F0B0D0F0B0D0F0B0D0F0B0D0F0C0D0F0B0D0F 0C0D0F0C0D0F0B0D0F0C0D0F0B0D0F0B0D0F0B0E100B0D0F0B0D0F1215181A1E231F242A22272E 23282F23293023293023282F22272E1F242B1A1E231215180B0E100C0E100B0E100C0E100C0E10 0C0E100C0E100C0E100C0E100B0E100C0E100C0E100C0E100C0E100C0E100C0E100C0E100C0E10 0C0E100C0E100C0E100C0E100C0E100C0E100C0E100C0E100C0E100C0E100C0E100C0E100C0E10 0C0E100C0E100C0E100C0E100C0E100C0E100C0E100C0E100C0E100C0E100C0E100C0E100C0E10 0C0E100C0E100C0E100C0E100C0E100C0E100C0E100C0E100C0E100C0E100C0E100C0E100C0E10 0C0E100C0E100C0E100C0E100C0E100C0E100C0E100C0E100C0E100C0E100C0E100C0E100C0E10 0C0E100C0E100C0E100C0E100C0E100C0E100C0E100C0E100C0E100C0E100C0E100C0E100C0E10 0C0E100C0E100C0E100C0E100C0E100C0E100C0E100C0E100C0E100C0E100C0E100C0E100C0E10 0C0E100C0E100C0E100C0E100C0E100C0E100C0E100C0E100C0E100C0E100C0E100C0E100C0E10 0C0E100C0E100C0E100C0E100C0E100C0E100C0E100C0E100C0E100C0E100C0E100C0E100C0E10 0C0E100C0E100C0E100C0E100C0E100C0E100C0E100C0E100C0E100C0E100C0E100C0E100C0E10 0C0E100C0E100B0E100C0E100B0E100B0E100B0E100B0E100B0E100B0E100C0E100B0E100C0E10 1215181A1E2320242B22272E23282F24293023293023293023272E1F242A1A1E231215180B0D0F 0B0D0F0B0D0F0B0D0F0B0D0F0B0D0F0B0D0F0B0D0F0B0D0F0C0D0F0B0D0F0C0D0F0C0D0F0B0D0F 0C0D0F0B0D0F0B0D0F0B0D0F0B0D0F0B0D0F0B0D0F0B0D0F0B0D0F0B0D0F0B0D0F0B0D0F0B0D0F 0B0D0F0B0D0F0B0D0F0B0D0F0B0D0F0B0D0F0C0D100B0D0F0C0D100C0D100C0D0F0C0D100C0D0F 0C0D0F0B0D0F0C0D0F0B0D0F0B0D0F0B0D0F0B0D0F0B0D0F0B0D0F0C0D0F0B0D0F0C0D0F0C0D0F 0B0D0F0C0D0F0B0D0F0B0D0F0C0D100B0D0F0C0D100C0D100B0D0F0C0D100B0D0F0B0D0F0B0D0F 0B0D0F0B0D0F111418191D231E232A22262D20252B0203031C242B1C242B1C242C0E1013050202 0606060202021A1A19C2C0BFF8F5F1EFEDE8F0EDE9F3F0EBE4E0DAA0999393918E90908B8D8B87 8989844E4F4C3433341A191C14151817151914141719191C1B1C1F0F0F132C2D3019191A000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000020202393D443032370C0C0D252828282C2A1D1F1F 20222232343345444384807E958F8D9691909C9897A09B99A39D9AD2CEC9F2EFEBF1EDEAF0EDE9 F1EEEAFAF7F3999694030303060606050606050303090A0A1B22291D252C1C242B0000000B0C0F 22272D21262D1E232A1C2026191D23191D23191D23191D23191D23191D23191D23191D23191D23 191D23191D231A1D23191D23191D23191D23191D23191D23191D23191D23191D231A1D23191D22 1A1D23191D22191D221A1D23191D221A1D231A1D231A1D231A1D231A1D231A1D23191D221A1D23 191D22191D221A1D23191D221A1D231A1D231A1D231A1D231A1D231A1D231A1D231A1D231A1D23 1A1D231A1D231A1D231A1D231A1D231A1D231A1D231A1D231A1D231A1D231A1D231A1D231A1D23 1A1D231A1D231A1D231A1D231A1D231A1D231A1E231C21261F242B22262E23282F232930232930 23293023293023282F22262E1F242B1D21261A1E231A1E231A1E231A1E231A1E23191D231A1E23 191D23191D231A1E23191D231A1E241A1E241A1E241A1E241A1E231A1E24191D231A1E241A1D23 1A1D231A1E241A1D231A1E241A1E241A1E241A1E241A1E241A1E241A1E241A1E241A1E241A1E24 1A1E241A1E241A1E241A1E241A1E241A1E241A1E241A1E241A1E241A1E241A1E241A1E241A1E24 1A1E241A1E241A1E241A1E241A1E241A1E241A1E241A1E241A1E241A1E241A1E241A1E241A1E24 1A1E241A1E241A1E241A1E241A1E241A1E241A1E241A1E241A1E241A1E241A1E231A1E241A1E23 1A1E231A1E241A1E231A1E241A1E241A1E241A1E241A1E241A1E241A1E231A1E241A1D231A1D23 1A1E241A1E231A1E241A1E241A1E241A1E241A1E241A1E241A1E241A1E241A1E241A1E241A1E24 1A1E241A1E241A1E241A1E241A1E241A1E241A1E241A1E241A1E241A1E241A1E241A1E241A1E24 1A1E241A1E241A1E241A1E241A1E241A1E241A1E241A1E241A1E241A1E241A1E241A1E241A1E24 1A1E241A1E241A1E241A1E241A1E241A1E241A1E231A1E231A1E24191D231A1E23191D23191D23 1A1E23191D231A1E231A1E231A1E231A1E231A1E231A1E23191D231A1E23191D231C20261F242B 21262D23282F23293023282F23282F23282F23282F22262E1F242B1C21261A1D231A1D231A1D23 1A1D231A1D231A1D231A1D231A1D231A1D231A1D231A1D231A1D231A1D231A1D231A1D231A1D23 1A1D231A1D231A1D231A1D231A1D231A1D231A1D231A1D231A1D231A1D231A1D231A1D231A1D23 1A1D231A1D231A1D231A1D231A1D231A1D231A1D231A1D23191D221A1D23191D22191D221A1D23 191D221A1D231A1D231A1D231A1D23191D231A1D23191D22191D23191C22191C221A1D23191C22 191D23191D23191D23191D23191D23191D23191D23191D23191D23191D23191D23191D23191D23 1C20261E232A21262D22272D0B0C0F0000001C242B1C242B1C242C0E1013050202060606020202 1A1A1AC2C0C0F8F5F2EFEDE8F0EDE9F1EFEAE3DFD99F989191918C8E8F8A8F8D888585824A4A49 3333331A191D14151915161A14141819191C1D1C1F0F0F132C2D311A1A1D000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 0000000000000000000000000202023739402D2F340A0A0D252728272A291E1F20202222323433 43434185807D958F8D9691919E9A989F9A98A29C99D2CCC8F2EFEAF0EDEAF0EDE9F1EEEAFAF7F4 999693030302060606050606050303090A0A1B22291D252C1C242B0000000000000B0C0E1F242A 21262D20252B1F242B1F252B1F242B1F252B1F252B1F242B1F252B1F242B1F242B1F252B1F242B 1F252B1F252B1F252B1F252B1F252B1F252B1F242B1F252B1F242B1F242B1F242B20242B1F242B 1F242B20252C1F242B20252C20252C20252C20252C20252C20252C20252B20252C20252B20252B 20252C20252B20252C20252C1F242B20252C1F242B1F242B1F242B1F242B1F252B1F252B1F252B 1F252B1F242B1F252B20252C1F252B20252C20252C1F252B20252C1F252B1F252B1F252B1F252B 1F252B1F252B20252C20252C20252C21262C22262E23282E23282F23282F23293023282F232930 23282F23282F22272E21262D20252C20252C20252C20252C20252C20252C20252C20252C20252C 20252C20252C20252C20252C20252C20262D20252C20262D20252C20252C20252C20252C20262D 20252C20262D20262D20252C20262D20252C20252C20252C20252C20252C20252C20252C20252C 20252C20252C20262D20252C20262D20262D20252C20262D20252C20252C20252C20252C20252C 20252C20262D20252C21262D20262D20252C20262D20252C20252C21262D20252C20262D20262D 21262D20262D21262D21262D20252C20262D20252C20252C20252C20252C20252C20252C20262D 20252C21262D21262D21262D21262D20262D21262D21262C20262D21262C20262C21262D20262C 20262D20262D20252C20262D20252C20252C20252C20252C20252C20252C20252C20252C20252C 20252C20262D20252C20262D20262D20252C20262D20252C20252C20252C20252C20252C20252C 20262D20252C20262D20262D20252C20262D20252C20252C20262D20252C20262D20262D20252C 20262D20262D20252C20252C20252C20252C20252C20252C20252C20252C20252C20252C20252C 20252C20252C20252C20252C20252C20252C20252C20252C20252C21262C22272E23282E23282F 23282F23282F23293023282F23282F22282E22262E21252C1F252B1F252B1F252B1F252B1F252B 20252C1F252B20252C20252C1F252B20252C1F252B1F252B1F252B1F252B1F242B1F252B20252C 1F252B20252C20252C1F252B20252C1F242B1F242B20252C1F242B20252C20252C20252C20252C 20252C20252C20242B20252C20242B20242B1F242B20242B1F242B1F242B20252C1F242B20252C 20252C20252C1F252B1F252B1F252B20252B20252C1F252B20252B1F252B1F252B1F252B1F252B 1F242B1F252B1F242B1F242B1F242B1F242B1F242B1F242B1F242B1F242B1F242B20252B22262D 1F242A0B0C0F0000000000001C242B1C242B1C242C0E1013050202060606020202191A1AC1C0BF F8F6F1F0EEE8F0EEE9F1EFEAE5E1DBA19B9490908A8E8E898C8C8582837C49494633333319191C 16161916161A1413181A181C1E1E1F1112162B2D3219191A000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 0000000000000202023B3D442E2F340A0A0D272729282A2A1D1F20202222313332434242847E7C 958F8C9791929E99999F9A98A39D99D3CDC8F2EFEAF0EEE9F0EEE9F1EEEAFAF7F3999694030303 060606050606050303090A0A1B22291D252C1C242B0000000000000000000203031114171B1F26 20252C22272E22272E22272E22272E23282F22272E23282F23282F22272E23282F22272E22272E 22272E22272E22272E22272E22272E22272E22272E22272E23282F22272E23282F23282F22272F 23282F22272F22272F22272F22272F22272F22272F22272F22272F22272F22272F22272F22272F 22272F22272F22272F22272F22272F22272F23282F22272F23282F23282F22272F23282F23282F 23282F22272F23282F23282F23282F23282F23282F23282F23282F23282F23282F23282F23282F 23282F23282F23282F23282F23282F23282F23293023282F23282F23293023282F23282F23282F 23282F23282F23282F23282F23282F23282F23282F23293023282F23293023293023282F232930 23282F23282F23282F23282F23282F23282F23282F23282F232830232830232830232830232830 23282F23282F23283023283023282F242930232830232930242930232830242930232830232830 232830232830232830232830242930232830242930242930232830242930232830232830232830 232830232830232830242930232830242930242930232830242930232830232830232830232830 232830232830232830232830232830232830242930232830242930242930232830242930232830 232830232830232830232830232830232830232830232830232830232830232830232830232830 232830232830232830232830242930232830242930242930232830242930232830232830232830 232830232830232830242930232830242930242930232830242930232830232830232830232830 23283023283024293023283024293024293023282F24293023282F23282F23283023282F23282F 23282F23282F23282F23282F23282F23293023282F23293023293023282F23293023282F23282F 23282F23282F23282F23282F23282F23282F23282F23282F23282F23282F23282F23282F23282F 23282F23282F23282F23282F23282F23282F23282F23282F23282F23282F23282F23282F23282F 23282F23282F23282F23282F23282F23282F23282F23282F22272F22272F22272F23282F22272F 22272F23282F23282F23282F23282F22272F23282F22272F22272F22272F22272F22272F22272F 22272F22272F22272F22272F23282F22272F23282F23282F22272F23282F22272F22272F22272E 22272F22272E22272F22272F22272E22272E22272E22272E22272E22272E22272E22272E22272E 22272E22272E23282F22272E23282F23282F22272E23282F20252C1B1F25111317020404000000 0000000000001C242B1C242B1C242C0D1012050302060606020202191A19C1C0BFF8F6F1EFEDE8 F0EDE9F1EFEAE2DED89D979093928B8E8D888B898480807A47484635343418181C16161916161A 13141719191B1E1E211414182D2C3219191D000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 0002023B3E453133390A0C0D252628292A2A1E201F202324323332414241837E7B958F8D979190 9E99979F9A98A49D9AD2CEC8F1EEEAF0EDE9F0EDE9F1EEEAFAF7F3989592030303060606050505 050505060605181F241D262D1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B1C242B 1C242B1D242C1C2229090A0A050303060606020202181919C0C0BFF8F6F1F0EDE9EFECE7F1EEE9 E4E0DAA09B9592918D8E8C888D8A8680817D4647453534341A1A1D15151917161A14141719191B 201E1F1514182C2C321A191D000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF0000000000000000000000000000000000000000000000000000000000000202023D4046 2D30340A0C0F2727282A2C2B1F2121202323313333414241837F7C96918E9690909D98979F9B99 A49E9BD3CCC8F2EFEAF0EDE9F0EDE9F1EEEAFBF7F4989593030302060606050505060606030302 0E12141E262D1D252C1C242B1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A 1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A 1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A 1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A 1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A 1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A 1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A 1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A 1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A 1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A 1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A 1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A 1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A 1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A 1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A 1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A 1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A 1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A 1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A 1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A 1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A 1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A 1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A 1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A 1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242A1C242B1D252B1F272F 13181B050503060606060606020202181919C1BFBFF8F6F1F0EDE8F0EDE9F1EEE9E5E1DBA29E9A 8D8F8A8D8D888B8B8480827C45474434343418191C16151917181A141317191A1D202122141518 2F30341D1D1E000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000002393B432D2F340A0A0F 27282B292C2C1E20222124233132323E3F3E807D79979290948F8F9D9796A09B99A39E9BD2CCC7 F2EEEBF0EDE9F0EEE9F1EEEAFAF7F398949203020306060605050506060606060606030512161A 1D252C1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E 1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E 1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E 1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E 1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E 1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E 1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E 1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E 1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E 1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E 1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E 1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E 1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E 1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E 1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E 1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E 1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E 1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E 1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E 1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E 1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E 1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E 1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E 1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272E 1E272E1E272E1E272E1E272E1E272E1E272E1E272E1E272D1F272F1E242E161B20060706050505 060606050505020202181919C0BFBEF7F5F0F0EDE9F0ECE8F0EDE8E3DFDA9E9A958F8F8A8D8B85 8C89857E7E7A424541353535191A1C16171917181914141619191D22232516181A2F30341D1D1E 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 0000000000000000000000000000000000000000000000023C3D463032360A090D252628282B2B 1F22222124242F31303C3D3C7D7A7797928F948F8F9C9696A19C9AA6A09DD3CDC8F2EDEBF0EDE9 F0EDE9F0EDE9FAF6F39895920303030606060505050606060606060505050605030D0F1215191E 171D22181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24 181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24 181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24 181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24 181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24 181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24 181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24 181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24 181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24 181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24 181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24 181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24 181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24 181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24 181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24 181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24 181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24 181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24 181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24 181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24 181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24 181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24 181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24 181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24181E24 181E24181E24181E24181E24181E24171D23151B200F1215060606050305060606060606060505 030202191818C0C0BDF8F6F1EFEDE8F0EDE9F1EFEAE4E0DB9E9A94908F8B8C89848C89857B7B77 4143403635361A191B17171916161A1313171A191C25252818171B2E2E321C1C1E000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 0000000000000000000000000000000002023C3E472D2F340C0C0F252628292A2B1F2221202323 2E30303B3D3B7D787698929096918F9C9695A19C9AA7A19ED2CCC9F2EEEAF0EDE9F0EDE9F1EEEA FAF7F4989592030203060606050505060606060606060606060505030302060605060607060706 060706060706060706060706060706060706060706060706060706060706060706060706060706 060706060706060706060706060706060706060706060706060706060706060706060706060706 060706060706060706060706060706060706060706060706060706060706060706060706060706 060706060706060706060706060706060706060706060706060706060706060706060706060706 060706060706060706060706060706060706060706060706060706060706060706060706060706 060706060706060706060706060706060706060706060706060706060706060706060706060706 060706060706060706060706060706060706060706060706060706060706060706060706060706 060706060706060706060706060706060706060706060706060706060706060706060706060706 060706060706060706060706060706060706060706060706060706060706060706060706060706 060706060706060706060706060706060706060706060706060706060706060706060706060706 060706060706060706060706060706060706060706060706060706060706060706060706060706 060706060706060706060706060706060706060706060706060706060706060706060706060706 060706060706060706060706060706060706060706060706060706060706060706060706060706 060706060706060706060706060706060706060706060706060706060706060706060706060706 060706060706060706060706060706060706060706060706060706060706060706060706060706 060706060706060706060706060706060706060706060706060706060706060706060706060706 060706060706060706060706060706060706060706060706060706060706060706060706060706 060706060706060706060706060706060706060706060706060706060706060706060706060706 060706060706060706060706060706060706060706060706060706060706060706060706060706 060706060706060706060706060706060706060706060706060706060706060706060706060706 060706060706060706060706060706060706060706060706060706060706060706060706060706 060706060706060706060706060706060706060706060706060706060706060706060706060706 060706060706060706060706060706060706060706060706060706060706060706060706060706 060706060706060706060706060706060706060706060706060706060706060706060706060706 060706060706060706060607060606030303050303060606060606060606060505030202191818 C0C0BDF9F7F1F0EDE9EFEDE9F1EEEAE6E2DEA19D99918F8B8D8A858989827A7C77424442353535 19181B16161A17171B1313171B1B1E27262A18181C2E30341D1D21000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 0000000000000000000202023D41492E30340C0C10262729292B2B1E20212123232F31303D3D3B 7D787798929095908E9D9896A29C9BA69F9CD1CCC8F2EEEBF0EDEAEFECE9F1EEEAFAF7F4989492 030203060606050505060606060606060606060606060606050505050305050305050305050305 050305050305050305050305050305050305050305050305050305050305050305050305050305 050305050305050305050305050305050305050305050305050305050305050305050305050305 050305050305050305050305050305050305050305050305050305050305050305050305050305 050305050305050305050305050305050305050305050305050305050305050305050305050305 050305050305050305050305050305050305050305050305050305050305050305050305050305 050305050305050305050305050305050305050305050305050305050305050305050305050305 050305050305050305050305050305050305050305050305050305050305050305050305050305 050305050305050305050305050305050305050305050305050305050305050305050305050305 050305050305050305050305050305050305050305050305050305050305050305050305050305 050305050305050305050305050305050305050305050305050305050305050305050305050305 050305050305050305050305050305050305050305050305050305050305050305050305050305 050305050305050305050305050305050305050305050305050305050305050305050305050305 050305050305050305050305050305050305050305050305050305050305050305050305050305 050305050305050305050305050305050305050305050305050305050305050305050305050305 050305050305050305050305050305050305050305050305050305050305050305050305050305 050305050305050305050305050305050305050305050305050305050305050305050305050305 050305050305050305050305050305050305050305050305050305050305050305050305050305 050305050305050305050305050305050305050305050305050305050305050305050305050305 050305050305050305050305050305050305050305050305050305050305050305050305050305 050305050305050305050305050305050305050305050305050305050305050305050305050305 050305050305050305050305050305050305050305050305050305050305050305050305050305 050305050305050305050305050305050305050305050305050305050305050305050305050305 050305050305050305050305050305050305050305050305050305050305050305050305050305 050305050305050305050305050305050305050305050305050305050305050305050305050305 050305050305050505060606060606060606060606060606060505030202191919C0BFBEF8F6F1 EFEDE8EFECE8F1EEEBE7E3E0A09C988F8E888B8A84888A827779733F4140363637191A1D16171A 16161A1313161B1C1E29282C19191C3031361D1D21000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 00000002020243454B2E303509090C2627282A2C2C1E20212023233032303E3E3C7A7775979291 94908E9D9996A39D9AA7A09DD0CCC7F1EDEAF0ECEAEFECE9F0EDE9FAF7F3989492030203060606 050505060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060505030202191918BFBFBDF9F6F2F0EDE9F0EDE9 F1EEEAE5E1DE9F9B968F8D8A8988848A8B867779723F3F3E3737391B1A1E17171A17171B131417 1C1B1E29292C1A1B1D3031371E1E21000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000202 4042493132360A090C262829282B2A1D20202023233132313E3F3D79767397929094908E9D9896 A39E9CA8A29ED1CCC7F1EEEAEFECE9F0EDE9F1EEEAFAF7F4989593030302060606050505060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060505030202181817BFBEBDF8F6F1EFEDE8F0ECE8F1EEEAE4E1DD 9E9A958E8C878A88838D8D86797A743F403F3837391B1B1E17161917171A1414171B1B1E2A2B2D 1C1D212F2F361D1D21000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 00000000000000000000000000000000000000000000000000000000000002020242444B2E3135 09090D27282A282A2A1E20212124243233323E3F3D787573989391948F8D9D9896A39E9CA9A2A0 D2CCC8F1EEE9EFECE8F0ECE9F0EDEAF9F6F3989492030303060606050505060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060505030202181817BFBEBCF8F5F0F0ECE8EFECE7F1EEEAE7E3DFA19F978C8D86 8989838989847678713E3F3F3638391B1B1D18171A19181B1312161C1C1E2C2C2F1C1C20313239 1E1D22000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 0000000000000000000000000000000000000000000000000002023D3F462F2F36090A0F252729 2729291E202020222332333340403F77737298939095908E9E9897A39F9DAAA5A0D2CCC8F1EDE9 EFECE8EFEBE8F0EDE9FAF7F3989492030303060606050505060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606030303171718BFBEBDF8F6F1EFECE8EEEBE7F0EDE9E6E4DEA19E988F8D87898A83898983 797B744040413738371C1C1F17141A18181B1413171B1B1E2B2C2E1C1C212E2F351D1D21000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000002393B422B2B330A0A102626292829291E2020 1F22223134334041407672719893909590909E9998A5A09EACA5A2D2CBC7F1EEEAEFECE9EFECE8 F0EDE9F9F6F3989492030303060606050505060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606030303 171718BFBEBCF8F6F1EFECE9EEECE7F1EEEAE7E3DF9F9D978D8C868A8883878881757871404141 3938391C1C1F16161917171A1313161B1B1E2B2B2E1D1D213131371D1E21000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 0000000000000000000000000202023D4045282B31090A0D24262A27292A1E2021202222323434 43434277737198929095918F9F9A98A7A39FADA6A2D2CCC7F0EDE9EFECE8EFECE8F0EEE9FAF7F3 979491050303060606050505060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606030303171718BFBEBC F8F5F1EFECE8EEECE7F0EEE9E8E5E0A2A09B8A89868A878389888170726C3E403E3A3A3A1C1C1F 15161917171A1214161A1C1E2B2B2E1D1E213233381E1E21000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 0000000000000202023C3E43292C2F0A070C25252727292A1F2021212322333535454544757271 99929294908F9F9A99A8A3A1ADA8A3D2CDC8F1ECE9EFECE8EFECE8F0ECE9F9F6F3979392050503 060606050505060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606050505050505050505050505050505050505050505050505 050505060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606030303171718BFBDBCF8F5F1EFECE8 EEEBE7F0EDE8E8E6E0A4A29B8989838887818989826F716B3C3F3C393B391D1D2016161919181B 1213161A1B1E2B2B2E1D1D223031371E1E21000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000002393C4128292F09090A252627282A291E1F201F2121333434464745767471989492969291 9E9998A8A2A1AEA8A4D1CDC7F0EDE8F0EDE9EFECE8EFECE9F9F6F4979491050502060606050505 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606050505 050505030303050505060606060606070707070707070707070707070707060606060606060606 050505050505050505050505060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606030303171717BEBCBBF7F5F0EEECE7EEECE6F0EDE8 E7E4DFA29E968B8A848787818988846F716B3C3F3C3A3A391C1C1F15171916171B1314171B1A1D 2B2C2E1E1E22313137202022000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF00000000000000000000000000000000000000000000000000000000000000000036393F 27292F09090A242527292A2A1D1F1F1F212233353545464475716F9893919792929F9A99A6A19F ACA8A4D1CCC7EFECE8EFECE9EFECE8F0EDE9F9F6F3969390050303060606050505060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0606060606060606060606060606060606060606060505050303030505050606060A0A0A0C0C0C 0D0D0D0D0D0D0C0C0C0A0A0A0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0D0D0D0D0D0D0A0A0A 0A0A0A060606030303050505050505060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606030303171617BEBDBBF8F5F1EFEDE8EDEBE6F0EDE9E7E5E0A09E96 8A89828886808989846E716C3E3F3D3B3A3A1C1D2015161916171A1314171A1A1C2B2B2D1E1E22 333439202022000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 00000000000000000000000000000000000000000000000000000000000233363C232329070609 252526282A291D20201F2323323434444542706D6C9A93919692919E9998A7A19FADA8A4D2CCC8 F0EDE9EFECE8EFECE7F0ECE9F9F5F3979390050503060606050505060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0606060606060606060505050505050707070C0C0C0D0D0D0C0C0C0A0A0A060606060606030303 0303030202020202020202020202020202020202020303030303030606060707070A0A0A0C0C0C 0C0C0C0A0A0A070707030303050505060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606050506050503161717BDBCBBF8F5F1EFECE8EEECE7F0EEE8E7E5DFA3A19B8C8A84888680 8687816C6F693E3E3D3A3C3A1D1D2017151918171A1514171B1B1D2C2C2E1D1D2234353B1E2122 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 00000000000000000000000000000000000000000000000237383E242528060609232426272A2A 1E21212124233234324344416F6C6A9993919692909E9997A8A29FADA7A3D1CCC8F0EDE9F0EBE9 F0ECE8F0EDE9FAF6F3959290030302060606050505060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606050505 0606060A0A0A0D0D0D0C0C0C070707030303020202010101000000000000000000000000000000 000000000000000000000000000000000000000000000000000000010101020202050505070707 0C0C0C0D0D0D090909060606050505060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606050505 050505161717BDBCBAF8F5F1EFECE7EEEBE5F0EDE7E8E5E1A3A19B8A8882888782888982696B65 3D3E3E3A3B3B1E1E2015161816171A1414171C1B1D2C2C2E1D1C2235353C202123000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000323338212224060609232426272A29202322212323 3133303F403E6E6B699A95929793919F9A98A7A3A0ACA7A3D1CCC9F1EDEAEFECE8EFEBE7EFECE9 F9F6F3989592050303060606050505060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0606060606060606060606060606060606060606060606060606060505050A0A0A0D0D0D0A0A0A 030303010101000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000010101050505 0A0A0A0D0D0D090909030303050505060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606050505050505161716 BDBCBAF8F5F0EFECE6EDEBE6EFECE8E9E6E1A6A49D898880878681888883696A643D3E3D393B3B 1E1E2015151817181C1415171C1B1C2C2B2E1D1E2234343B202022000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 0000000000000000000000003032351E1F23050507222324282A2A2022232023243234313C3E3A 6967659B95949A95949F9A99A6A19FADA6A2D1CCC9F0EDEAEFECE7EFECE7EFECE8F9F6F3989492 050503060606050505060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0606060606060606060606060606060505050909090D0D0D0A0A0A020202000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000020202 0A0A0A0D0D0D090909060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606050505050505161616BCBCB9F7F5F0 EEECE6EDEBE6EFEDE8E8E6E1A6A29D8987818786828787836768623C3D3D393B3B1E1D20161519 18171B1314181A1A1E2C2C2F1C1E2234363B212123000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 0000000000002A2C2F1D1F210505062123242A2C2C1F22221F22223234313D3E3C6563619C9795 9B9695A09B99A7A29FADA7A3D2CDC9F0EDE9EFEBE7EEEBE8EFECE8F9F6F2989492050503060606 050505060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0606060606060606060D0D0D0C0C0C020202000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000030303 0D0D0D0C0C0C060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606050505050505161616BCBBB9F7F5F0EEECE6EDEBE6 EFEDE8E8E6E0A6A19C8A87838787828888836566633B3C3C3B3B3C1F1F2117171819181A141317 1A1B1E2B2B2F1D1E2335373E202025000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 292C301A1C1E050306212223292C2C1E21221F212132322F3C3D3C625F5E9D98959A9694A29C9A A8A29EADA7A1D1CCC8F0EDE9EFEBE7EEECE7EFECE8F9F6F3969390050502060606050505060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0606060606060606060606060606060606060606060606060606060606060505050505050A0A0A 0F0F0F070707000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000090909 0D0D0D090909050505050505060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606050505050505161616BCBBB9F7F4EFEEECE7EDEBE5F0EDE7E8E6E0 A5A29C8987828786818888826567653B3C3C3C3D3D1F1F2115151817171A1415171D1D1D2C2C2E 1D1E2335373D212125000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 00000000000000000000000000000000000000000000000000000000000000000024272B151619 050606222425282A2B1D20201F22213133313A3C3B5F5C5A9E9A969C9795A29C9BA8A3A0ACA6A1 D0CBC8F0EDE9EEEBE7EFECE7F0ECE8F9F6F3959290030302060606050505060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0606060606060606060606060606060606060606060505050606060C0C0C0C0C0C020202000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000202020C0C0C 0A0A0A060606050505060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606050505050505151616BCBAB9F7F5F0EEECE7EDEBE6EFEDE8E9E6E1A5A29B878681 8685818786806566613B3C3D3D3D3D1F202215151816171B1515161E1D1E2D2D2E1C1D2235383E 212125000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 00000000000000000000000000000000000000000000000000000024262A17171A050205212222 2628291E20202021202F3231393B395C5B599E9A969D9997A19C9BA9A4A0ADA7A3D1CBC6EFEBE8 EEECE7EFEBE8EFEBE8F9F6F3969390050303060606050505060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0606060606060606060606060505050606060D0D0D0A0A0A000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000101010A0A0A0D0D0D 060606050505060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 050505050505151515BCBBB9F7F5F0EEECE6EDEAE6EFEDE8E9E6E0A5A29A888680878680888880 62645F3B3C3C3C3D3D21222315161817191A1615191C1C1F2B2B2E1D1E2237393F212125000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 00000000000000000000000000000000000000000026272A1616190202021F1F1F2728281D1F1F 1F22213032303A3B395858569F9A979D9996A29D9BA8A4A1ADA5A3D0CAC6EEEBE7EFECE7EEEBE8 EFECE9F9F6F2979390060503060606050505060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0606060505050707070D0D0D070707000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000909090D0D0D060606 030303060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606050505050505 151615BBBAB8F7F4F0EEEBE7EEEAE6EFECE8EAE7E2A9A59E8887818786808888825F625E3A3B3C 3B3C3D21222217171819191B17161A1D1C202C2B2F1D1E2336383E212125000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 00000000000000000000000000000026272A1416180202021F202128292A1E1F1F202322313331 3A3B395655539E9A989E9A97A49E9CAAA4A1ACA6A2CFCAC6EEEBE7EFECE7EEEBE7EFECE9F9F6F2 989592050303060606050505060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606050505070707 0D0D0D070707000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000707070D0D0D060606030303 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606050505060605151515BBBAB8 F7F5F0EEECE6EEEBE6EFECE7EAE8E3ABA7A286847F85868187898360615E3B3C3D3C3D3E212122 17171A1A191C18161A1E1E202D2C2E1D1C23373740222126000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 0000000000000000002224251416180202021F2021272A291E20201F22213133313B3D3B545351 9F9B98A19D99A49F9DA9A4A1ACA6A0D0C9C4EEEAE6EEEAE6EEEAE7EFECE8F9F6F2989492050503 060607050505060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0606060606060606060606060606060606060606060606060505050606060D0D0D060606000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000707070D0D0D050505050505060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606050505060605141515BAB9B9F7F4F0EEECE6 EDEBE5EEECE7EBE8E3ABA7A286847F8787808687815D5F5B3B3C3D3D3D3E22212418181B1A191C 1616191E1E202D2D2F1D1D21373740222126000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 0000001E20231213160202021E2021272B291F21211F21223133323D3F3D51514FA09A98A29E9C A4A09FA9A4A2ABA5A0CFC9C3EEEBE6EEEBE7EEEAE7EFECE8F9F6F397948F050303060707050505 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0606060606060606060606060606060505050505050D0D0D090909000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000101010A0A0A0D0D0D050505050505060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606050505060605141515BABAB8F7F4F0EDEBE6EDEAE5EEEBE6 ECE9E4ACA9A385847E89898185867E5A5C583C3D3D3E3E3D22222319181B1C1A1D1717191F1F21 2E2D301D1D21373940222326000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF0000000000000000000000000000000000000000000000000000000000000000001D2021 1112130101021F2020292B2A1F20211F21213134323B3D3C4D4D4A9E9997A49F9EA5A09FAAA5A2 AAA5A0CECAC4EDEBE5EEEAE5EDEAE6EEEBE7F9F6F2989692050303060606050505060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0606060606060606060606060A0A0A0A0A0A010101000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000101010C0C0C0A0A0A050505060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606050505060605141414BAB9B8F7F5EFEEEBE5ECEAE5EFECE8EBE8E4ADA9A2 85837C878882858880575A563C3D3D3D3F3E23222419171B1B1A1D1718191E1F212E2E311C1C21 383C40222326000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 0000000000000000000000000000000000000000000000000000000000001F2022111314000101 1E1F1F272A291E21221F22213234333B3C3B4B4A499B9795A7A2A0A6A19FABA7A3A9A5A0CDC9C5 EDEAE6EDEAE5EEEBE6EFECE8F8F6F1989592060603060607050505060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0505050909090D0D0D000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000101010D0D0D070707050505060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606050505060606141414BAB9B8F6F4EFEEEBE5EDEBE5EEECE6ECE9E4ADA9A484827C868882 8286815357533C3D3C3D3F3D23222319181B1B1A1D18171B1F1E212D2C301D1D21393B40212326 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 0000000000000000000000000000000000000000000000001B1C1E0F11120201021D1F1F262A29 1E21212023233234323B3C3B4A48479A9593A9A2A1A8A19FACA7A4ABA4A0CDC6C2ECE9E5EEEBE7 EEEBE6EFECE8F9F6F3999693060503060607050505060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0606060606060606060606060606060606060606060606060606060606060606060606060D0D0D 020202000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000606060D0D0D050505060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606050505 060606141415B9B9B8F7F5EFEEEBE6EDEAE5EEECE7ECE9E4ADAAA482827C86878182847E525551 3C3E3D3F414024242519191B1B1B1E18181B1F20212E2E301D1E22383940232327000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 0000000000000000000000000000000000001D1D200F0F120101021F1F202829291E2021202222 3133323D3E3C4847459A9391ABA4A2A8A39FAEA8A5AAA4A0CAC6C2ECE9E5EEEBE7EEEAE6EEEBE7 F9F6F2999692060503060607050505060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0606060606060606060606060606060606060606060606060505050C0C0C070707000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000A0A0A0C0C0C050505060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606050505060606141414 BAB8B8F6F4EFEEEBE6EDEBE5EEECE6EDEAE6AFACA881817B8688817F847C4D504D3C3E3D3F413F 242325191A1C1B1B1D18161A2120222F2F311C1D213D3E42252629000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 0000000000000000000000001F1F210F0F120001021D1E1E2729291E20201F21213133313F3F3D 48464598938FACA7A4A8A3A0B1ABA6AAA6A1C8C4BFEBE8E5EEEAE6EDEAE7EEEBE7F8F6F1999693 060505060607050505060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0606060606060606060606060606060505050707070D0D0D000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 0101010D0D0D060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606050505060606141414B9B9B8F6F4EF EEEBE6EDEAE6EFECE7EDEAE6B0ADA982827C8689817D827A4C4E4B3C3E3D3E403F2323251A1A1D 1C1C1F19181B201F222F2E311C1C213D4043252729000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 0000000000001D1D1F0F0F110101021C1D1E2728281F20201E212130333040403D454442948F8C ADA9A6A8A5A2B0ACA8ACA7A2C7C3BEEAE7E2EEEBE6EDEAE7EDE9E6F8F4F1999694060505060607 050505060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0606060606060606060505050D0D0D050505000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000060606 0D0D0D030303060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606050505060606141414B9B9B7F7F5EFEDEBE6EDEAE6 EFECE8ECEAE5AFADA681817A8589817C7F784B4C4A3D3E3D3F403F2324241A191C1C1C1D19181C 201F222E2E311D1D223B3D41252329000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 1C1D1E0F0F12010102191A1B2426271E1F211F21213132303F403E424241908B8AAEABA8A8A5A2 B2ADAAAEA7A4C7C1BDE8E6E0EDEAE5EEEBE7EDE9E7F8F4F1999693060505060707050505060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0505050A0A0A0A0A0A000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 010101010101010101010101010101010101010101010101010101010101010101010101010101 010101010101000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000D0D0D060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606050505060606141314B9B9B7F6F4EFEDEBE6EDEBE5EFECE7EDEAE6 AFADA6807F788689827E817B4C4E4B3D3F3F3E403F2223241A1A1D1C1C1D19171B1F20222D2D2E 1C1E22373A3F252326000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 0000000000000000000000000000000000000000000000000000000000000000001D1E1F0F1112 000001191A192426271E20221E20203032313E3F3E4042418B8987B0ACA8AAA5A1B4AEA9B0AAA5 C7C2BEE7E3DEECE8E5EEEAE6EEEBE7F8F5F29B9895060605070707050505060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0606060606060606060606060606060606060606060606060606060606060606060505050D0D0D 030303000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000010101020202000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 010101010101000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000505050D0D0D050505060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606050505060606141414B8B8B6F6F4EFEDEBE6EDEAE6EEEBE7EDEBE6B1AEA7807F79 8687817C7E784B4E4A3F41403D3E3D2020221B1A1D1C1B1F18171C1E1E212C2B2C1D1E2136383D 222326000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 0000000000000000000000000000000000000000000000000000001C1D1E0F0F12000001181919 2424261D201F1F21212F32303E403E403F3F888581B3ADA9ABA5A2B4AEAAB2ABA8C6C1BEE4E2DD EBE7E4EEEBE7EDEBE6F8F5F19B9995060605070707050505060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0606060606060606060606060606060606060606060606060505050909090A0A0A010101000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000202020000000000000000000A0A0A0A0A0A0A0A0A0A0A0A 0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A000000000000000000 010101000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000D0D0D060606050505060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 050505060606141414B8B8B6F6F4EFEEEBE5EDEAE5EEECE7ECEAE5B1AEA77F7F78878881797A74 494B493F42403D3E3E201F221B1A1E1C1B1E19191C1E1E202A292B1C1C2138393D232326000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 0000000000000000000000000000000000000000001B1C1E0F0F120000011919192526271F2221 1F21212E312F3E403D40403E83807EB3AEAAABA5A2B3AEACB3ACA9C7C2BFE3E0DDE9E5E2EDEAE6 EDEBE6F7F5F0999793050505070707050505060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0606060606060606060606060606060606060303030D0D0D060606000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000202020000000C0C0C5757578888889B9B9B9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C 9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9B9B9B8B8B8B5E5E5E101010000000010101 000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000606060C0C0C050505060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606050505060606 141414B9B8B6F7F4EFEDEBE6ECEAE5EEECE6EDEAE4B1AEA77E7E78888981787972464A473F4241 3C3D3D1F1E2119191D1B1A1E18181B1E1D1F29292B1B1C2135353A222125000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 0000000000000000000000000000001C1E1F1112130100011A1A1A2427271E21211E20212E302E 3D3E3C3E3F3C7D7A79B4AEABAAA6A3B3B0AAB5AEA9CAC4BFE2DFDBE8E5E1EDE9E5EEEAE6F8F5F1 9B9995060605070707050505060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0606060606060606060505050606060C0C0C020202000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000020202 0000002222229B9B9BC3C3C3CBCBCBC9C9C9C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8 C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C9C9C9CBCBCBC5C5C5A2A2A22A2A2A000000020202000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000202020D0D0D060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606050505060606141414B8B8B6 F6F4EFEDEBE6EDEAE5EDEBE6EDEAE6B2B0A87E7E7987898272746D4347464042413C3C3B201E22 1A1A1E1B1A1E18171B1D1D1F28282A1C1D20323338202024000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 0000000000000000001F20211212130000011A1A1B2426251E20201F21212E302E3D3F3C3C3E3B 7E7C79B5AFABACA6A0B4AFABB5AFAACAC6C0E1DED9E7E4DFEBE9E4EDEAE6F8F4F19C9996060605 070707050505060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0606060505050A0A0A090909010101000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000101010000000F0F0F9D9D9D C5C5C5AFAFAF6F6F6F444444414141424242424242424242424242424242424242424242424242 4242424242424040404343436F6F6FAFAFAFC4C4C4A4A4A4151515000000010101000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000101010A0A0A090909050505060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606050505060606141313B8B7B6F7F4F0EDEBE6 EDEAE6EDEBE6EDEAE5B6B2AA7F80788688806F726C4447464143413D3D3C1E1D201B1A1D1C1B1E 18181A1D1D1F28272A1C1C203032361F1F21000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 0000001D1F201312150000001A1C1B2528271E20211F20202B2D2B3B3E3B3D3E3B797673B5AFAB ACA7A2B5AEAAB6B1ABCDC8C3E0DCD9E5E2DEEBE7E3EDEAE6F8F4F19B9895060605070707050505 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606050505 0D0D0D060606000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000010101000000646464C3C3C3A9A9A9333333 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000333333A5A5A5C5C5C56B6B6B000000020202000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000606060A0A0A050505060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606050505060606151414BAB8B6F6F3EFEDEBE5EDEAE5EEEBE5 ECE9E5B7B2AD83837D888A826E716B4347444143413B3B3B1D1B1E1B191C1B191C18181A1E1E20 28282A1A1B1F2E31351E1E20000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF0000000000000000000000000000000000000000000000000000000000000000001E2021 1314150000011B1C1C2629281E21201F20212A2C2A3B3D3B3E3F3E74726EB5AFABACA7A4B4AFAA B5AFAAD0CAC7E1DDDBE5E1DDE9E5E1ECE9E5F8F5F29C9996060605090907050505060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0606060606060606060606060606060606060606060606060606060606060606060D0D0D030303 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000010101000000070707989898C4C4C4545454000000030303020202 020202020202020202020202020202020202020202020202020202020202020202020202020202 020202000000545454C0C0C09F9F9F0A0A0A000000010101000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000030303 0D0D0D050505060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606050505060606151514BAB9B6F6F4EFECEAE5ECEAE4EDEBE5ECE9E3B8B3AE 868580878A816C6E684345444143423B3C3A1D1D1F1A1A1C1A191C18181A1D1E2028292A1C1C1F 2B2E321B1D1F000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 0000000000000000000000000000000000000000000000000000000000001F2021121315000001 1B1B1C272A292022212121222B2D2C3B3C3A3D3F3D686764B3AEAAADA7A1B3ADA9B4B0ACD1CCC9 E1DEDAE3E0DBE8E5E1ECE8E4F8F5F29D9997060606070709050305060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0606060606060606060606060606060606060606060505050909090A0A0A020202000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000010101000000272727AEAEAEB5B5B5202020000000020202000000000000000000 000000000000000000000000000000000000000000000000000000000000000000020202000000 1F1F1FB0B0B0B1B1B1272727000000010101000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000202020C0C0C060606 050505060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606050505060606151414BAB8B5F6F4EEEEEBE4EBE9E3ECE8E4ECEAE4B9B5AF85857E858980 6768634243424143413A3B3A1E1E201A191D1A1A1D18181A1F2020292A2B1A1B1D2D2E331D1D20 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 0000000000000000000000000000000000000000000000002021221516180000011B1C1C272A2A 1F22212022212A2C2B3A3B3A3E3F3D595B56AAA6A2ADA8A4B2ACA8B4AEAAD2CCC8E4E1DCE1DFD9 E7E3DFEAE7E4F8F5F19C9896060506070707030303060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0606060606060606060606060606060505050A0A0A090909000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 020202000000373737B4B4B4AEAEAE171717000000010101000000000000000000000000000000 000000000000000000000000000000000000000000000000000000010101000000161616AAAAAA B5B5B5353535000000020202000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000202020A0A0A0A0A0A050505060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606050505 050506161715BDBBB8F6F3EFEDEAE5EBE9E4EBE8E3ECE9E4BAB5AF8686808589825D5E59404141 414342393A391E1D201A1A1C1A1A1D18191B1F202028282B1A1A1E2C2D311A1A1D000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 0000000000000000000000000000000000002021221718190000001C1D1C2A2C2A202121202121 272928393A393E3F3D4A4C489F9B98B2ABA9B1ABA8B4AEA9D2CDC8E6E3DEE1DED9E6E1DDE9E6E3 F7F4F09E9A98060606070707030303060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0606060606060606060505050C0C0C060606000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000020202000000 393939B4B4B4AEAEAE191919000000010101000000000000000000000000000000000000000000 000000000000000000000000000000000000000000020202000000181818ABABABB6B6B6373737 000000020202000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000909090C0C0C050505060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606050505060605161616 BCBAB7F6F4EEECEAE4EBE9E3EBE9E4ECEAE6B9B5B085847F838680555552404140434443373837 1C1D1E1B1B1C1A1A1D18181A1F1F2128282B19191D292A2F18181B000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 0000000000000000000000002122221A1B1C0000001B1B1C2B2C2C212322202323272828383938 3D3E3C4042408D8A88B5AFACB1AAA5B5ADA8D0CBC6EAE6E1E2DEDAE4E0DCE9E5E1F7F3F09D9A98 060605070707030303060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0606060606060C0C0C060606000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000020202000000383838B3B3B3 ADADAD191919000000010101000000000000000000000000000000000000000000000000000000 000000000000000000000000000000020202000000171717AAAAAAB4B4B4363636000000020202 000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000606060C0C0C030303060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606050505050505171616BDBAB8F6F4ED EBE9E3EAE8E2EAE8E4EDEAE7B7B3AF85847E7E7F7A4C4C4A4142404344413737361D1D1F1B1B1D 1A1B1D18171920202127272A19191E292C31161619000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000202022202021000000191A1B2B2D2D2123232022222627283638363E3E3D3F403E 7B7874B7B1ABB1ABA6B1AAA5D0CAC6EEE9E4E4E0DCE3E0DCE8E5E1F6F3EF9E9B99060606070707 030303060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606050505060606 0C0C0C050505000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000020202000000373737B1B1B1ABABAB181818 000000010101000000000000000000000000000000000000000000000000000000000000000000 000000000000000000020202000000171717A8A8A8B2B2B2353535000000010101000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000606060D0D0D050505060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606050505060606151414BBB8B6F6F3EFEBE9E4EAE7E2 EAE7E3EEE9E6B7B3AC8887806F716C4344424345434142413535351C1C1E191A1C1A1A1C19181A 21212225252817171C2B2D32131517000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 1F1F1F2222240000001818192B2D2C2124232123222528273536363D3D3C3F3F3E6A6966B4AEAA B2ACA7AEA8A2CEC8C4EFEAE5E7E3DFE3E0DCE7E4E0F5F3EE9F9C9B060606070707030303060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0606060606060606060606060606060606060606060606060606060505050606060C0C0C050505 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000020202000000373737B0B0B0A9A9A9181818000000010101 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000020202000000171717A6A6A6B0B0B0353535000000010101000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000303030D0D0D060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606050505060606131413B9B7B5F6F3EFEBE8E4E8E6E1EAE7E2EEEBE6 B9B4AC85847E5B5F5B3D413F44454440403F3333351B1A1E1B1A1C1A1A1C18181A232224262628 17181B2D2F32111114000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 0000000000000000000000000000000000000000000000000000000000000000001F1F1F272627 00000019191A2D2F2F2024232224242527273335343E3E3C3F403E555451A7A29EB6B0AAABA7A0 CDC8C4EDE9E5EAE6E2E3E0DCE6E3DFF5F2ED9F9D9C060606070707030303060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0606060606060606060606060606060606060606060505050606060C0C0C050505000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000020202000000373737AFAFAFA8A8A8181818000000010101000000000000 000000000000000000000000000000000000000000000000000000000000000000000000010101 000000171717A5A5A5AFAFAF353535000000010101000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000030303 0C0C0C060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606050505050505191817BFBCBAF5F2EEEAE8E2E8E5E0EAE8E2EDEBE5B8B5AC7D7D78 5155513D423F4346443F3F3D3232321A1A1C1A1A1D1A1B1D19181A23222327272817181C2F2F33 0C0C0E000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 00000000000000000000000000000000000000000000000000000019191B2F2E2E000001171818 2D302F2124232124222527273133323B3C3A41423F434340878481BBB4B0AAA5A0CAC7C2EDE9E5 ECE8E4E4E2DDE5E2DEF4F1EDA29F9C070706070907030303060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0606060606060606060606060606060505050606060C0C0C030303000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000020202000000363636ADADADA6A6A6181818000000010101000000000000000000000000 000000000000000000000000000000000000000000000000000000000000010101000000161616 A3A3A3ADADAD343434000000010101000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000303030C0C0C060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0505050505051A1B19C1BFBCF5F2EDE9E7E1E8E5E0ECE9E5ECE9E5BBB6AF6D6D67424541414542 4246443D3D3C2E2D2F19191B1A1B1D1A1A1D19181A232123222225181A1D31323408080A000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 0000000000000000000000000000000000000000001719172F31310101041616182E3031222324 222324232526303232393A3841413F40413E676563B5AFACAFA9A5C6C2BDECE8E3EDEAE6E7E4DF E5E2DEF3EFEBA5A29E0A0909070709030303060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0606060606060606060505050606060C0C0C030303000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000020202 000000363636ACACACA6A6A6181818000000010101000000000000000000000000000000000000 000000000000000000000000000000000000000000000000010101000000161616A2A2A2ACACAC 343434000000010101000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000303030C0C0C060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606050505020203 1E1E1EC6C5C2F3F0ECE8E6E1E8E5E1EBE8E4EFEAE5B3ADA64C4C493D3F3D4648454243423B3C3B 2C2B2E1A191C1B1A1D1A191C19191A2222231F1F211B1C1F323235080808000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000141414343435040405151516303132222323232524242527 2D2F2E373737403F3F41423F4D4C4A9F9A98B6B1ADC2BDB8EBE7E1EDE9E6E9E6E2E5E2DDF2EEEB ACA9A50D0C0C060606030303060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0606060505050606060C0C0C050505000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000020202000000353535 ABABABA5A5A5181818000000010101000000000000000000000000000000000000000000000000 000000000000000000000000000000000000010101000000161616A1A1A1ABABAB343434000000 010101000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000303030D0D0D060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606050606020202242323CCCAC8 F3F0EBE8E6E1E8E5E1ECE9E4F3EFEAA49F983637334144414345423F3E3E3A39392B2A2C191B1D 1A1D1E1B1A1C1A1A1B2424251E1E221C1B21303134040404000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 0000000000000000000E0E0E36363709090B1212133233342324252223232325262C2D2D343535 3D3C3C4443423B3C3A767370B9B2AEC1BBB5E8E4DFEEEAE5EBE8E3E5E2DEF0EDE9B3B0AD101010 060606050505060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606050505 0606060C0C0C050505000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000020202000000353535A8A8A8A3A3A3 181818000000010101000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000101010000001616169F9F9FA9A9A9333333000000010101000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000505050C0C0C050505060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606050505020202272726D0D0CCF1EFE9E8E5E0 E9E6E1EDEBE6F1EEE79C98913536324245424243413F3E3E39383829282A1B1B1D1C1E1F1A1B1C 1A1B1C2424261B1B1E1E20242F2F33020202000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 0000000808093737380F0F0F0F0F0F3233342527262122232224252C2E2D3334333A3A3A434341 37373653504DABA5A0C6BEBAE6E2DEEEEAE5ECE8E5E7E4E0EFECE8B8B6B3151413060606050505 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0606060606060606060606060606060606060606060606060606060606060606060606060D0D0D 060606000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000020202000000353535A7A7A7A2A2A2171717000000 010101000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000101010000001616169E9E9EA8A8A8323232000000010101000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000606060C0C0C050505060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606020302292928D2D2CEEFEDE8E6E3DEEAE7E2EDEBE5 F1EDE697948C3435314344424241403E3E3D3736362727281C1C1E1D1D1F1C1B1E1B1C1D262728 191A1C2122272B2C31000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000040406 3636371817170C0D0D353737272828212223222424292B293132313939383E3F3D3A38383C3B38 85827DC0BAB4E6E1DDECE8E4ECE9E4EAE6E2EEEBE7BDBAB71A1918060606050505060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0606060606060606060606060606060606060606060606060606060505050A0A0A060606000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000020202000000343434A6A6A6A0A0A0171717000000010101000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 0101010000001616169C9C9CA6A6A6333333000000010101000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 0606060C0C0C050505060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606020202302F2DD7D5D0EEEBE6E5E2DEEAE8E3EDEAE6F2EFEA908D88 31322F4345434141413E3C3C3534342424251B1B1E1D1D1F1A1C1E1D1D1F28292B18181B24242A 28292E000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 0000000000000000000000000000000000000000000000000000000000000202043332341D1E1F 060809373939292B2B212322232525272A292F2F2F3636353C3C3B3E3D3C343332565453AFA9A4 E7E2DAECE8E2EDE9E5EBE8E4EFECE6C9C6C1222120050505050505060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0606060606060606060606060606060606060606060505050A0A0A090909000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000101010000002F2F2FA4A4A49F9F9F161616000000010101000000000000000000 000000000000000000000000000000000000000000000000000000000000000000010101000000 1414149B9B9BA4A4A42F2F2F000000010101000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000101010A0A0A0A0A0A 050505060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0606060606060101023C3B3AE0DDD9EEEBE7E6E3DFEBE9E4EEEBE7EEEBE587847D303130424542 3E3F3C3B3A3A3332332222241B1D1F1C1D1F1A1B1D1D1E2129292B16161A2B2C2F262629000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 0000000000000000000000000000000000000000000000000202022E2E2F262627040505353636 2B2D2C2022222224242426262C2D2D3435333A3A3A3D3D3C3938373B3A3A938F8CE7E0D9ECE8E2 ECE8E6EBE7E4EFECE8D2CFCB2C2A29020203060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0606060606060606060606060606060505050A0A0A0A0A0A020202000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 0101010000001D1D1D989898A9A9A9222222000000020202000000000000000000000000000000 000000000000000000000000000000000000000000000000000000020202000000232323A3A3A3 9B9B9B1D1D1D000000010101000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000202020C0C0C090909050505060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 02010241413FE3E0DDEDEAE6E7E4E0EAE8E3EDEBE6EAE6DF7E7B732F312F41433F3E3D3B393938 3130312020221B1E1F1C1E1F1B1C1E201F2129272B15151A2F30341F2121000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 0000000000000000000000000000000000000000002727283031310405053132332F3132212323 232524222424292A2A3231313839373B3B3A3E3D3C323132777470E0DBD4EDE8E1ECE8E4EBE8E3 EFECE9DAD7D33A3836020202060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0606060606060606060505050606060C0C0C020202000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000010101000000 0303037D7D7DB0B0B0626262000000010101020202020202020202020202020202020202020202 020202020202020202020202020202020202020202000000000000626262ADADAD838383030303 000000010101000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000202020D0D0D060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606070707020202504F4C E7E5E0EAE8E3E7E4DFEBE9E3EEEBE6EBE6DF7370692F302E4141403C3B3A393736302F2F212023 1C1E201D1E201C1D1E2321242A2A2D16151A353539171719000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 0000000000000000000000000000001F201F3838380505082E2F31333636212223242626222424 27282730302F3536353A39383F3D3D2F2F2F5E5C59D5D1CBEEE8E1EBE8E2ECE8E3F0ECE8E2DFDB 4A4847010101060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0606060606060606060D0D0D050505000000010101000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000010101000000464646 A7A7A7A2A2A2515151020202000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000505050A0A0A0A9A9A94B4B4B000000020202000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000101010101010505050C0C0C030303060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606050505070707020201636361ECEAE5EAE7E2 E8E5E0EBE8E4F0EDE9E4DFD862605A30302F3F3E3E3939383636362C2C2E1F1E23201E211E1D20 1E1D2026252728282A1A1A1E393A3D0E0E10000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 0000000000000000001415153A3B3B0B0C0C27292A3638382325242527282123242526262D2D2C 3332323838373D3C3C303131494846C7C2BDEEE9E2EAE6E1EAE8E3F0ECE7EBE8E5625F5D020101 060707050606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0505050C0C0C090909010101000000000000000000010101000000000000000000000000000000 000000000000000000000000000000000000000000000000010101000000020202707070AAAAAA A5A5A5878787656565606060626262626262626262626262626262626262626262626262626262 626262616161656565868686A4A4A4ABABAB777777060606000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000010101000000000000 0000000202020A0A0A0A0A0A050505060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0606060606060606060606060606060303030A0909020202747370F1EFEAEAE7E2E9E6E2ECEAE5 F1EEE8D7D3CA504F493131303D3C3B36373634333329292B1E1F211D1D211F1E211F1E20272629 2626281C1E203A3A3D060606000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 0000000C0D0D3D3D3D1313132122223B3E3C2527252426262323242223242B2B2B313030363535 3A3A39333434383735B6AFAAEEEAE3EAE6E0EBE8E3EEEBE7F1EEEA787571020201070707050505 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606050505030303 2928282B2B2B101010050505020202000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000101010000000C0C0C6565659D9D9DA9A9A9 AFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAF B0B0B0AAAAAA9F9F9F6D6D6D101010000000010101000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000202020606061312122E2D2D 262525020202060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0606060606060606060505050A0A0A0606068A8986F3F0ECE9E6E2EAE7E2ECE9E4F2EFE9CAC6BF 3F3F3B3334313B393835353434343227272A1E1D221E1E21201F221F1D202A2A2B232427212226 3A3A3B040404000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000070707 3939391E1E1F1A1B1B3F42402729282327252324242222242A292B302F2F353333373736343535 2C2C2C9E9892EEE8E2EAE6E2EBE8E3EEEAE5F6F3EF908E8B060606060607030303060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606000000222222545454 4F4E4E4040402C2B2B1818180A0A0A050505010101000000000000000000000000000000000000 000000000000000000000000000000000000010101000000000000282828545454656565676767 676767676767676767676767676767676767676767676767676767676767676767656565575757 2B2B2B010101000000010101000000000000000000000000000000000000000000000000000000 0000000000000000000101010606060C0A0A1A1A1A2F2E2E434242515050545353191919000000 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0606060505050A09090D0F0FA19F9DF3F1ECE8E5E1EAE7E3EBE8E4F1EEEABFB9B2373530353534 3938363535333132322324261B1C21201F23201E211E1E212E2D2F21222629292D353435000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 00000000000000000000000000000000000000000000000000000000000002020232313129292A 1112133E403F2B2D2C2529272325251F20202625272C2D2C3131313635343637362526267E7B76 E9E4DDEBE6E1ECE8E4EDE8E4F8F4F0AEABA8141312030506050505060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606020202070707424141515050515050 5453535150504746463737372626261616160D0D0D060606020202000000000000000000000000 000000000000000000000000000000010101010101000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000010101 0101010000000000000000000000000000000000000000000000000000000202020606060D0D0D 1818182828283939394948485251515453535150505251513E3D3D030303050505060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606050505 090909181918B6B5B3F3F1EDE6E4DFEBE8E3EAE8E2F1EFE9ABA79C2C2B2638373A363635333333 2F2F302121231C1C201E1E211E1E21211F213130321E20243032352A2C2C000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 0000000000000000000000000000000000000000000000000000002626263535350C0E0E3E3F3F 2F30302527262426261E1F202323252A2B2B2F2F30333332363737252626615E5AE1DBD5ECE7E1 EBE7E3ECE8E3F8F3F0C7C4C1252423020202060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0606060606060606060606060606060606060606060000002B2B2B5251514C4B4B4C4B4B4D4C4C 4F4E4E5352525352524F4E4E4545453A38382C2C2C2020201616160F0F0F090909020202000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000303030A0909100F0F1717172121212E2E2E3A3A3A474646504F4F555454 535252504F4F4D4C4C4D4C4C4C4B4B535151242424010101060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0606060606060606060606060606060606060606060606060606060606060606060606062E2C2C CFCCC9F2EFEAE6E4DFEAE8E3EAE6E1F0EDE6908D8124242238383A3333323232312C2C2C1F1F21 1C1D201E1E201E1E1F2221223333351E2125393A3D1C1C1D000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 0000000000000000000000000000000000000000001818193C3C3C0F0E0F393A3B353736272A28 2527271F1F212121232A292A2D2E2E303130353433282829454342CFCAC5EDE9E3E9E6E2EAE6E3 F5F1EDDDDAD8403F3E000000060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0606060606060606060606060606060202020D0D0D4A4949504F4F4E4D4D4D4C4C4D4C4C4B4A4A 4C4B4B4D4C4C4F4E4E5150505150504F4F4F4B4A4A4344443C3B3B3232322B2A2A2423231B1B1B 1616161210100D0D0D070707050505030202020202000000000000000000000000000000000000 0000000000000000000101010202020303030606060909090D0D0D1212121616161C1B1B242323 2C2C2C3433333D3C3C4544444B4B4B504F4F5252525251514F4E4E4D4C4C4C4B4B4C4B4B4C4B4B 4E4D4D4E4D4D5251514746460A0A0A050505060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606030303090909020302464643E2DFDBEFECE8 E7E4E0EAE8E2EBE7E2ECE8E3706C662525243735353231312F30302727271E1E1F1D1E1F1F1F20 1E1E202423263233352224263E3F400E0E0E000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 0000000000000000000000000000000E0E0E3E3E3E1515153132333E403F282A282627261E1F21 1F1E202727272D2C2C30302F3131312C2C2D2E2E2FB3AEABEFEAE3E9E6E0E9E6E2F1EEE9EDEBE7 605F5F010101060606050505060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0606060606060606060606060000002F2E2E5453534D4C4C4F4E4E4E4D4D4E4D4D4D4C4C4C4B4B 4B4A4A4B49494B4A4A4B4A4A4D4C4C4E4D4D504F4F504F4F4F4E4E4E4D4D4B4A4A484747444343 403F3F3B3C3C3837373534343232322F2F2F2D2C2C2B2B2B2A29292928282928282A2A2A2B2B2B 2D2D2D2F2F2F3231313635353838383C3C3C4040404444444848484C4B4B4F4D4D504F4F504F4F 4F4F4F4F4D4D4D4C4C4C4B4B4B4A4A4C4B4B4C4B4B4C4B4B4E4D4D4E4D4D4F4E4E4F4E4E4E4E4E 565555262727020202060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0606060606060606060606060606060303030A0A0A060605676764F0EDE9EBE8E4E7E5DFEBE8E3 ECE9E5DFDBD6504D482929283434343231312E2E2E2424251E1F1F1F1F1F1F1E1F1D1D1F272628 30313227282C3D4041040404000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 0000000000000000000405053838372222222425264445452828282627261D1F1F1A1B1D262525 2C2A2A302E2E3031303030312121228F8B87EDE8E1E8E4DEEAE8E3EEEBE5F7F4F0878685070707 050505060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0606060606060303030C0D0D4949495150504E4D4D4F4E4E4E4D4D4E4D4D4D4C4C4D4C4C4D4C4C 4C4B4B4C4B4B4B4A4A4A49494A49494A49494A49494A4A4A4B4A4A4C4B4B4C4C4C4D4C4C4D4D4D 4E4C4C4E4C4C4D4D4D4D4D4D4D4C4C4D4C4C4C4C4C4D4C4C4D4C4C4C4C4C4D4C4C4D4C4C4D4C4C 4D4D4D4D4C4C4D4D4D4D4D4D4D4D4D4C4C4C4C4B4B4B4A4A4B4A4A4A49494A49494A4A4A4B4A4A 4B4A4A4C4B4B4D4C4C4D4C4C4D4C4C4E4D4D4E4D4D4E4D4D4F4F4F4E4E4E545454454444090909 050505060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0606060606060606060505050A0A0A0D0D0D8D8B89F7F5F0E7E4E0E8E5E1EAE7E2F0EDE7C5C2BB 32312C2F302F323231302E2E2C2C2C2221231D1D201E1E201F1E201D1E1E2829292C2D2F303034 37383A000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 0000000000002A2A29302F2F181919494B4A2B2C2B2627261E1F2017181A2121212A29292E2D2D 2F2E2D31313221222064625CE3DED8E9E5DFEBE7E3EBE7E1FCF7F3ADACAB191A19020202060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0606060101012525255554544E4E4E4F4E4E4F4E4E4E4D4D4E4D4D4E4D4D4D4C4C4D4C4C4D4C4C 4C4B4B4C4B4B4C4B4B4C4B4B4B4A4A4A4A4A494848494848494848494848494848484848494848 494848494848494848494848494949494949494949494848494848494848494848494949484848 4948484948484948484948484949494A49494B4A4A4B4A4A4C4B4B4C4B4B4C4B4B4D4C4C4D4C4C 4D4C4C4E4D4D4E4D4D4E4D4D4F4E4E4F4F4F4F4E4E504F4F5554541F1F1F020202060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0605050606060709091E1E1DB5B3AFF9F5F0E3E0DCE9E6E2E9E6E1F2EFEA9D9A9524221F353433 2F2F2E2E2D2D2929291F20221F1D201E1E201E1C1E1E1E203030312B2D3037383B282629000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 1919193B3B3A1212124748473334332728271F1E1F1717181D1D1D2827272B2A2A2B2B2B2F2F2F 292929423F3ECDC8C2ECE7E1EAE6E1EAE6E1F9F6F1D2CFCC363635020101060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606050505 0606063E3E3E5554544F4E4E504F4F4F4E4E4F4E4E4E4D4D4E4D4D4E4D4D4E4D4D4D4C4C4D4C4C 4D4C4C4C4B4B4C4B4B4C4B4B4C4B4B4B4A4A4B4A4A4B4A4A4B4A4A4A4A4A4A4A4A4A4A4A4A4949 4A49494A49494A49494A49494A49494A49494A49494A49494A49494A4A4A4B4A4A4B4A4A4B4A4A 4B4A4A4B4B4B4C4B4B4C4B4B4C4B4B4C4B4B4D4C4C4D4C4C4E4D4D4E4D4D4E4D4D4E4D4D4E4D4D 4F4E4E4F4E4E504F4F504F4F4F4E4E575656373636050505050505060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606050505070709 0909093D3C3ADAD8D3F2EFE9E1DED8E8E6E0E9E5E0EEEBE66D6B652423213433322E2D2D2D2C2D 2625271E1D1F1E1E1F1E1D201C1D1F1D1E20303134292B2E3D3E41131313000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 0000000000000000000000000000000000000000000000000000000000000000000D0D0D3C3C3C 1717173E3F403F403F2526251E1F2018181A18191A2524252A2A2A2C2C2C2F2D2D2F2E2D272625 A7A19BEEE8E2E8E4DFEAE6E3F3EEEAECE9E75D5D5D030303060606050505060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606030303131313 4D4D4D5352524F4E4E504F4F4F4F4F4F4E4E4F4E4E4E4D4D4E4D4D4E4D4D4E4D4D4D4C4C4D4C4C 4D4C4C4C4B4B4C4B4B4C4B4B4C4B4B4C4B4B4C4B4B4C4B4B4B4A4A4B4A4A4B4A4A4B4A4A4B4A4A 4B4A4A4B4A4A4B4A4A4B4A4A4B4A4A4B4A4A4B4A4A4B4A4A4C4B4B4C4B4B4C4B4B4C4B4B4C4B4B 4C4B4B4D4C4C4D4C4C4D4C4C4D4C4C4E4D4D4E4D4D4E4D4D4E4D4D4F4E4E4F4E4E4F4F4F504F4F 504F4F4F4F4F565555484949101010020202060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0606060606060606060606060606060606060606060606060606060505050909090A0A0A666563 F4F1ECE9E6E1E3E0DBE9E6E2ECE8E3DBD7D242413B2929283030302E2D2D2C2B2B2122231C1D20 1C1E201D1E1F1E1E1E2121213636382D2F313E3E3F040404000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 0000000000000000000000000000000000000000000000000000000202023232322424242A2B2C 4C4D4C23252420212118181817161822222229292A2B2B2B2C2D2B30302F222120737067EAE5DE E8E5DFEBE7E2ECE7E4FCF8F48D8D8C101010030303060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606020202242222545454 525151504F4F504F4F504F4F4F4E4E4F4E4E4F4E4E4E4D4D4E4D4D4E4D4D4E4D4D4D4C4C4D4C4C 4D4C4C4D4C4C4C4B4B4C4B4B4C4B4B4C4B4B4C4B4B4C4B4B4C4B4B4C4B4B4C4B4B4C4B4B4C4B4B 4C4B4B4C4B4B4C4B4B4C4B4B4C4B4B4C4B4B4C4B4B4C4B4B4C4B4B4C4B4B4D4C4C4D4C4C4D4C4C 4D4C4C4D4C4C4E4D4D4E4D4D4E4D4D4F4E4E4F4E4E4F4F4F504F4F504F4F504F4F504F4F535252 5251511D1D1D020202060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606090909171716999896FEFBF6E3E0DA E4E1DCE7E4E0F1EFEAB4B1AD2826242F2F2E2E2D2C2C2B2B2927281E1F201D1D201C1E201E1D1E 1E1C1D262525343637323437353538000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 0000000000000000000000000000000000000000000000001F1F1F383636181818555756272928 2021211818181514171C1C1E2727272A2A292C2C2B2F2E2E27272742433DD1CBC3EDE9E3EAE6E2 E9E4E0FDF9F4C0BEBC292929020303060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606050505030303303030575656515151 505050505050504F4F504F4F504F4F4F4F4F4F4E4E4F4E4E4F4E4E4E4D4D4E4D4D4E4D4D4E4D4D 4E4D4D4D4C4C4D4C4C4D4C4C4D4C4C4D4C4C4D4C4C4D4C4C4D4C4C4D4C4C4D4C4C4D4C4C4D4C4C 4D4C4C4D4C4C4D4C4C4D4C4C4D4C4C4D4C4C4D4C4C4E4D4D4E4D4D4E4D4D4E4D4D4E4D4D4E4D4D 4F4E4E4F4E4E4F4F4F504F4F504F4F504F4F5050505050505150505452525756562A2A2A020202 050505060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0606060606060606060606060505050606060C0C0A333231D1CECBF8F5F1E2DFDBE6E4DEE6E4DF F3F1EC7D7A7620201F302F302B2B2A292A2B2524261E1E1F1D1D1F1C1E1E1E1E201B1B1D2F2F30 2F32333B3A3D1F1E1F000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 0000000000000000000000000000000000000C0C0C3C3D3C1615154C4E4E373A391E1D1E18181A 1414161818192323252B2B2B2B2B2B2B2C2B2E2E2D272726A4A099F2ECE6E8E4DFEAE5E1F3EFEB EBE8E4535252070706060605060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606030303060606393939595757525151514F4F 505050504F4F504F4F504F4F504F4F4F4F4F4F4E4E4F4E4E4E4D4D4E4D4D4E4D4D4E4D4D4E4D4D 4E4D4D4E4D4D4E4D4D4E4D4D4D4C4C4D4C4C4D4C4C4D4C4C4D4C4C4D4C4C4D4C4C4D4C4C4D4C4C 4E4D4D4E4D4D4E4D4D4E4D4D4E4D4D4E4D4D4E4D4D4E4D4D4F4E4E4F4E4E4F4E4E4F4F4F504F4F 504F4F504F4F504F4F515050515050515050535252585757333333030303030303060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606121210646260F9F6F2ECE9E4E4E1DDE5E2DDEBE7E2E3E0DC44423F 2726272D2C2C2A2A2A292829211F211E1B1D1E1D1F1D1D1E1D1D1E1B1B1C37383A2D2E32404043 060606000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 0000000000000000000000000000003232322425243335344E515118191B1A191D151517151417 1E1E202C2C2B2D2C2C2B2C2C3130302A29296D6A67E8E2DCEAE5E0EBE6E1EAE6E0FFFDF78E8C8C 151615050503060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0606060606060606060606060606060606060202020A0A0A3E3E3E595959535151515050525151 515050504F4F504F4F504F4F504F4F4F4F4F4F4E4E4F4E4E4F4E4E4F4E4E4E4E4E4E4E4E4E4E4E 4E4D4D4E4D4D4E4D4D4E4D4D4E4D4D4E4D4D4E4D4D4E4D4D4E4D4D4E4D4D4E4D4D4E4D4D4E4D4D 4E4E4E4E4E4E4F4E4E4F4E4E4F4E4E4F4E4E4F4F4F4F4F4F504F4F504F4F504F4F515050515050 515050515050515151545353585757373737060505020202060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0505030C0C0C1E1E1EAAA8A6FFFFF9E5E3DDE6E3DEDFDDD7F5F1ECAFACA82323202E2D2E292A2A 292A292525241D1C1E1C1C1D1C1D1E1C1C1E1D1D1E2222213A3D3D3031353A3A3D000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 0000000000000000001B1B1C36353518191A5D5F601E1E2019181C151417151417181719242424 2C2C2B2E2E2E313030313030413F3FC8C2BAEEEAE5E8E5DFE8E4DFFAF7F1D2D0CC333332070707 050505060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0606060606060606060606060606060101010A0A0A3D3C3C5A5959535252515050525151525151 525151525151505050504F4F505050505050504F4F4F4F4F4F4F4F504F4F504F4F504F4F504F4F 504F4F504F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F504F4F504F4F504F4F504F4F504F4F 504F4F504F4F505050505050504F4F504F4F504F4F505050525151525151525151525151515050 545454585757383838060606020202060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606050505141213 414140ECEBE7F2EEE9E7E4DFE6E4DEE0DDD8F6F4EE6462602424222B2A2A292828272727202020 1A1B1C1B1D1D1B1C1D1C1D1E1B1A1C2D2E2E3437393A3B3C1E1E20000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 0000000606063939391618185254533939391310141716191514171413151A1A1B2727272F2E2E 31302F3433322B2A29908A85EFE8E3E9E6E0E9E5DFEBE7E2FDFBF56E6D6C101210050505060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606010101090707383838585757555454515050525151525151525151 525151525151505050505050504F4F514F4F515050504F4F504F4F504F4F504F4F504F4F504F4F 4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F504F4F504F4F504F4F505050505050505050504F4F 505050505050505050525151525151525151525151525151525151515050555454575757323232 050606020202060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0606060606060606060606060606060606060606060606060505050D0D0D1918178B8B88FFFFFD E5E1DCE9E6E1E1DED9ECE9E4CDCBC72D2C2C2C2C2B2727262625252121221C1B1E1A1C1C1B1C1D 1A1A1E1E1D201A191B3739392D2F31413F41020202000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 292A2B2A29293132325F61600D0C0D1918191514151615151616151E1E1F2B2A2A30302F323130 2B2B2A534F4DD7D2CBEDE8E1E7E3DCE7E3DEFBF8F4C4C0BF2828270C0C0A030303060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0606060606060606060202020505052D2D2D555454575656515050525151525151525151525151 525151525151525151525151515050515151515050515050515050515050515050515050515050 515050515050515050515050515050515050515050515050515050515050525151525151525151 525151525151525151525151535252525151515050585757535252282828030303020202060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606030303181717333331E2E0DCF4F0ECE7E4DEEAE7E2 E0DDD8F9F6F1817E7C2121212B2A292827262122221A1B1C1B1A1C1B1B1C191B1C1A1A1E1C1B1E 2121223B3D3E313335313135000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000141415393838 1A1B1B6B6D6C2020201210131616161615151616161617182121212C2C2B2F2E2E2F2E2E2E2D2C 9E9991EEE7DEE5E1D9E9E5DFEBE6E2FCF9F5686766141413050506060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0606060606060202020202021F1F1F4C4B4B595858535252525151535252535252525151525151 525151525151525151525151525151525151525151525151525151525151525151525151525151 525151525151525151525151525151525151525151525151525151525151525151535252535252 5352525352525251515352525A59594848481B1B1B020202030303060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606020303100F10141414888784FFFFFBE6E2DDEAE7E2E4E1DCEBE7E3D7D4D0 3C39362626262727262625251C1C1D1A1A1B1A1A1B1B1B1C1A1A1D1C1B1E1818192E3030313436 3D3C3E0A0A0C000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 0000000000000000000000000000000000000000000000000000000303062F2F312120204D4D4E 5555550605061818191513141716161515151819192524242D2C2C2D2D2D25252553504BD5CEC5 ECE6DFE9E4E0E9E4DFF7F1EECECBC82A2A2A101010020202060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606050505020202100F0F383838565656575656525151525151535252535252535252525151 525151525151525151525151525151525151525151525151525151525151525151525151525151 525151525151525151525151525151525151535252535252535252535252535252525151525151 5857575655553534340D0C0C020202050505060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606050303191918373633E9E6E3EEEBE5E8E5DFEAE5E2E4E0DCF8F4F085827E1E1E1D282727 2221221D1E1F191B1C181A1B1B1A1C1C1B1D1B1A1C1B1A1D1B1B1C3538393233343A3A3A000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 00000000000000000000000000000000000000000000000018181A323030252526737577141214 1312131514151614151616151515151B1B1B2625252A2929292A2A28272793918AECE5DEE8E3DF EAE6E1E8E3DFFCF8F38281801414140A0A0A050505060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0606060303030305051E1E1E464545585757565555535252535252535252535252535252535252 535252535252535252535252535252535252535252535252535252535252535252535252535252 5352525352525352525352525352525352525352525352525453535756565756564342421A1A1A 030303030303060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606020202151515 151614A4A39FFAF8F3E5E2DCEAE7E2E6E3DEF3F0EBD2CFCB3937351F1F1E2222221A191B1B1B1C 1B1C1D1A1A1B1B1B1D1D1D1D1D1B1C1816182728293033343D3D3E111111000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000505072D2D2D2121205B5C5E494849030305171719 1314161515161514171515161F1F1F2727272A2B2A232223474744CCC8BFEEE9E2E7E2DDE9E4E0 ECE7E3E7E3E0424342121210050606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606020202060606242424484747575656575656555454545353535252535252545353535252 535252535252535252535252535252535252535252535252535252535252535252535252535252 545353545353535252545353555454585656555454444444202020050505020202060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0606060606060606060606060606060606060606060606060303030C0C0C121012555652F5F3EE E8E4DFEAE7E2E9E6DFE9E6E0F9F5F07977721B1A1A1F1F1F1C1B1B1B1B1B1B1B1C1B1A1B1C1B1B 1B1A1B1B1A1C1C1B1D1918193032333233353B3B3C000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000001515162B2B2C3132317273750F1012101214131417141417 1514171515181717182321222928292827282222227B7974E7E2D9ECE6E1E9E5E0E7E3DFF3EEEA BEBCB9201F1F0F0F0F030303060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0505050000000606062020203D3D3D4F4E4E575656575656565555565555555454545353545353 545353545353545353545353545353545353545353545353545353555454555454565555565555 5857575655554E4D4D3B3A3A1D1D1D050505000000060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606131313282725D3D3CFEFEDE8E8E5E1E9E6E1 E6E3DDFBF8F2BEBAB52727261718171B1B1C1A191A1B1A1B1B1B1C1C1B1D1B1B1D1C1A1D1C1B1D 1817192424262D2F303E3E400F0F0F000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000002423232323225B5D5E43424605020717161B131316141415141415 1415171A1A1B2423242A2A2A2324232E2D2DAAA7A1F1ECE5E8E4DDEAE6DFE8E4DFF7F4EE908F8E 1010100C0C0C030303060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0505050000000202021313132A2A2A3D3D3D4B4A4A535252565555585757595858585757585757 5857575857575857575857575857575857575857575857575756565352524B4A4A3C3B3B272727 101010020202000000050505060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0606060606060606060202021212130F0F0DA4A39DF8F6F1E7E4DEEAE7E3E7E4DFF0EDE8EEEBE4 5857530A0C0C1B1C1C1A181919191B1A191B1B1C1D1C1C1D1C1B1D1B1A1E1B1B1D19191A292B2C 323335353538000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000C0C0C2424262E2F3066676A131016101013141417141214141313161418151517 1B1B1C2726252B2A2B1C1B1C4C4B49CFCBC4EFEAE4E9E4DFEAE6E1EBE6E1F3F0EB6D6D6C090A0A 0A0A0A030303060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0606060101010000000202020F0F0F1D1D1D2B2B2B3737374040404645454A4A4A4C4C4C4D4C4C 4D4C4C4C4B4B4A49494545453F3E3E3636362A2A2A1C1C1C0D0D0D020202000000010101060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0303020F0F0F06060672726DF7F5F0EAE6E2E9E6E1E8E5DFEAE6E0FEFAF49B98940C0D0D131416 191A1B1A191A1A181B1A181C1B1C1D1C1D1D1C1B1D1D1B1E1A191A2324232B2D2E3E3D3F080808 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 0000001818191F1E204F505240404306060A1615181312141312131313151513141513171E1D1E 2928272928291A1A1A73706EE5E0DDEEE8E4E8E5DFE9E5E0F1EDE8EBE8E55455550606060A0A0A 030303060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0606060303030101010000000000000202020506060909090D0D0D101010121212121212101010 0D0D0D090A0A050606000101000000000000020202050505060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0606060606060606060606060606060606060606060606060606060606060202020D0D0C070706 494A47E8E7E3F0EEE9E9E5E1E9E6E1E8E4DFF7F4EFCDCAC528272607070A1B1B1B1818191B1A1C 19191C1B1A1D1C1C1D1E1C1E1D1D1E1C1C1C1D1D1D242627353638272728000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000050506 18181A28292B5A5A5C1D1B1D0D0C0D1515141312131313141313131412151614172120202A2A2A 2525252425259D9A97F0EAE5EBE6E1E8E4DFE8E5E0F6F2EDE0DCDA4A4A4A0606060A0A0A030303 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606050505030303020202010101010101000000000000010101010101020202 030303050505060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0606060606060606060606060606060606060606060303030A0A0A0A0A0A343432D5D4CFF7F5F0 E8E5E0E8E5E0E8E5E0EFECE6EBE8E34F4E4D000000191A1A17171818171A19191C1A1A1C1A1C1D 1C1C1C1D1D1E1D1D1D1C1C1C212322292B2E353439020202000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000B0C0E141517 3F3F414342430D0C0D1312101312131413151413141212141313141715162120212B2B2B232423 2F2F2FB0ADA9EDE8E4E9E4E0E8E4DEE8E4DEFAF5F0DDDAD74849490707070A0A0A020302060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0606060606060606060606060303030909090A0A0A292825C5C3BEFDFAF4E8E6E0E8E6E1E8E6E0 E8E6E1F7F4EE7E7C7800000113141518171817161716171918181A1A1A1B1C1C1C1E1C1C1E1C1D 1D1C1D1F1F1F2325263234360F0F0F000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000202020D0D10171719494A4C 2627280D0D101313141212141312151312141212141313151718192323232D2C2C222222373637 BCB9B3EAE5DFE9E4DFE9E5DEE8E4DEF9F4EFE0DCDA5051500C0A0A0D0C0D020202060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 06060603030309090910100F262623BAB9B4FDFAF5EAE7E1EAE6E2EAE7E2E5E3DDF7F5F0A2A09B 0A0A0A1010101818181515171616181717191918181A1A1B1C1B1C1D1D1D1E1D1E1F1E1F202023 28292C232325000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000505070A0A0D212123454546161618 1010131413161312151212151312141313141312131717182424252F2F2E2423233F3F3DC1BEB7 E6E1DCE9E5E0E8E4DFE5E0DBF4EFE9E9E7E3656463131312121212030305060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0606060606060606060606060606060606060606060606060606060606060606060202020C0C0C 1212132B2B28BFBDB8FDFAF6E9E6E1EAE7E1EBE7E3E5E2DDF6F3EEC0BEB81E1D1D0A0A0C181818 1415161414161515161717191918191B191B1B1B1B1C1C1C1E1E1E202022202225242628020202 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000009090906060731303138373A100F12151414 1212151212131312141312131413141210151617181F1F1E2E2D2D242323434041C5BFBBE5DFD9 E8E4DFE7E2DDE5E0DBEFEBE5F2EFEB81807D1A1A19151515070909030303060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0606060606060606060606060606060606060606060606060202021010101413153A3A34CDCBC5 FAF8F3E7E5DFE8E6E1EAE7E2E6E3DEF6F2EDC6C3BE2928270D0C0D161517141416141416141316 1615171817181817191A191B1B1B1D1C1C1D2020211D1D201F2225090909000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000009080B0505063C3B3E2C2B2F0F0D10141314121013 1212151212131313131413151313151213141B1A1A2E2D2C222222423E3FBDB8B2E2DDD4E7E1DE E9E4DFE7E2DDE8E5DFF7F4EFA8A5A2302F2E1616160D0D0C050303060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 06060606060606060606060605050505050513131316161551514CE0DFD9F6F4EEE7E4DFEAE8E3 E8E5E0E6E3DEF7F4EDC7C4BE2C2B290C0A0D161617141313141314131416151417151617161716 18171819191B1A1A1C1D1D1F1E1E2018181D0C0E10000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000002020205050809090A48484A2524290D0D10141316131214121212 1213121312141313161413161313141617172B2A2B212021373737B1AAA7DED8D1E3DFDAE9E4E0 E9E5E0E6E2DEF7F3EFD5D1CD5F5E5C1F1E1E101010060606050505060606050505060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606050505 06060605050509090914141421211E7F8079F2F0EAEEEAE6E6E4DFEBE8E4E7E5DEE9E7E1FAF6F1 BBB8B22928270C0A0D16161713131412131314141414141615151616161713141616161619191A 1E1D1E1E1E20131315101012000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000404040202051212134C4C4F201E230F0D10131315101212101213121214 1313131412141413131212141313142525241E1E1E2D2C2D9D9893D8D2C8E2DDD5E5E1DCEAE5E0 E6E1DDF3EFEBF6F3EFA5A3A14543431A19190A0A0A050303060606060606050505060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0606060606060606060606060606060606060606060606060505050505050606060707090C0A0C 16151541413DB8B8B0FEFCF7EAE6E2E7E5DFE9E6E2E7E3DEF0EDE8F5F3EDA7A69F1D1C1D09090A 1514161412131514131414151314151514151616171212131515172223241D1D1F1F2021121214 101013000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000504050101021919194E4E51201F220D0D0F101012121213101314121212121313 131214131214101012100F102121201E1E1E1F201F7E7A76CDC5BDDBD6CEDFDAD5E6E2DEE7E3DF EAE7E2FEFBF7E7E3E19693914847461B1B1A060606020202050505060606060606050505060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0606060606060606060606060505050303030606060A0A0A0607090D0D0D2E2D2A81817CEAE8E3 FDFBF6E6E3DFE9E6E2E7E5E0E9E6E0F9F6F1ECE9E4817E7A0D0C0A0A0A0C171618131214131214 1312131313141413161515170D0D101210123A3B392E2E2E1D1D1E101014100F11000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000505050101011E1E1E5252523232321A1A1A0D0D0F101013131315121213101313131214 1210131210120F10101C1C1D1F201F151516545150AFAAA4D8D2CBD6D1CCDDD8D3E6E3DDE6E2DE F3EFEBFFFDF9E4E0DDA3A19F5C5B5B2726260A0A0A020202030202060606060606050506050505 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0303030505050709070A0A0A06060709090928272670706DCDCCC7FFFFFAF3F1EBE5E2DDE8E6E1 E7E3DDF1EEE9F9F6F1C7C4BF514F4D0100010C0A0D161617141314141315141314121315151515 14141609090A1415144E50494346411C1D1C1212120D0D0E000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 0205050001012221215B595A50504E2727250A090A101010141414101310121313101312141313 1312140F0D101716161F1F21151516322F30827E7CC9C3BCD5CFC7D1CCC5DDD8D3E6E2DDE9E6E1 F7F2EEFFFCF7EBE8E6BEBBBA8282814747461C1B1C050505000000020202060606060606060606 050505050505050505060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0606060606060606060606060606060606060606060505050303030202020606060C0C0C0A0A0A 0606050A0A0A2F2E2C74736FC4C4BEFBF8F4FCFAF5E9E6E0E5E3DDE6E3DEEBE8E3FBF8F3E8E5DF 908E8A222121000000121214161516131315141313131315141415141616100F10060609252723 646A5D5759511D1D1C0D10100A0A0B020202000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000020205 0101011C1C1D5C5C5B696A653939380C0D0D0C0D0D131413101213121313131212121014131215 100F101210131F1E201C1C1E1D1C1E4B4A4AA39D9AD5CDC7D1CAC3CCC6C0D9D6D0E5E0DBE9E5E1 F3F1ECFCF9F5F6F3F0E0DDDBB8B6B58583845150502829270D0D0D020202000000020202050506 070707070707060707060606060606050505050505050505050505050505050505050505050505 050505050505060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 0606060606060303030303030505050909090C0A0C0C0A0A0707060606051818174848448E8D8A CFCCC8F7F4F0FBF9F4EEEAE5E4E1DBE4E1DDEBE8E3F9F6F0F5F1EAAFADA84746440A0A0C060607 15141615151612121413131513141514141613131509070A0F1210414641798173616559201F1F 0D0D0F090A0B020202000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000020202000001 1414145A5B5A787E77474D481717170A090C131215131415121313121213121214141214101013 100F10171718201F22201F222323245D5A59B4AFABD8D2CBCCC7BEC7C2BAD3CFC9DED9D5E6E1DE EEEBE7F6F3F0F9F6F2F5F1EFEAE6E4D0CDCDA8A7A67D7D7C5656563535341D1D1D0D0D0D050503 0202020202020303030606050606060707070707070707070A0A0A0A0A0A0A0A0A090909090909 090909090909090909090909090909090909070709070909070909070707070707070707060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060605050505050505050505050505050505050505050505050505050505050505050505 050505050505030303050503030303030303030303050503030303030303030303050503030303 030303030503030303030303030303030303050303030303050505050505050505050505050505 050505050505050505050505050505050505050505050505050505050505050505050505050505 050505050505050505050505050505060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606050505050505050505050505060606060606090909 0A0A0A0A0A0C0A0A0A0606060A07091A19173F3F3C7E7C79BBBAB6E4E1DDF6F3F0F6F3EEECEAE5 E4E0DBE4DFDBEDE9E5FAF7F1F2EFE7B5B3AE5B58561A1A190503060F0F10151417131314141413 1514151515171414160A0A0D0C0A0C30312F646B6280897A5E645A2325230A0D0F06060A000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000010102010102090909 585B5A858C845960572D2D290D0C0D101012141614131312131210121212121014121213100F10 1212131B1C1D2A2A2A21212021222162605EB2ACA6D1CAC3C8C2BBC1BBB6C9C4BFD5D1CBDFDBD6 E8E5E0EEEBE7F3EFECF4F1EDF5F2EEF3F0ECEEEAE8DDDBD9C8C7C5A9A8A88C8B89737271585857 4444433534332827271D1D1C1818181212120D0D0C0C0C0A0A0A0A0A09090A0A09090907090907 0909090909090A09090A09090A090909090909090A090909090909090A09070909090909090909 0709070909090909090707070907090909090A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A 0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0C0A0A0A 0A0A0A0C0C0A0C0C0C0C0C0C0A0C0C0A0A0A0A0A0A0A0C0C0C0C0C0A0A0A0A0A0A0A0A0A0A0A0A 0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A 0A0A0A09090909090909090909090909090909090909090A090909090909090909090909070707 070909090909090909090909090909090909090909090909070707070707070707070707070707 070707070707070707070707060607060607070707070707060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060706060707060606 0606060606060707070909090909090909090A0A0A0A0A0A0909090A0A090A0A0A10101021201E 3A39376564609B9896C6C5C1E5E3E0F3F1ECF4F2EBEFECE6E8E5E0E3E0DCE8E6E0F3F1EBFBF8F2 EAE6E0B3B1AB5C5C5B1E1E2007090A0D0D101313151313161413151414151615171312140C0A0A 0D0D0D2E2F2C5A5F58777F727B8375595A532323240C0D10050506000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000030103020202050505494A49 7880766772644C504B1E1D1C0D0D0C1213131513141312141212121210121010131010130D1010 10121327272838373920202114151452514FAAA6A1CEC9C3CDC6C1C7BFBAC6BEB8CAC5BED2CDC7 DCD8D3E4E0DDE9E5E1EDE9E6EFEBE8F0ECE9F3F0ECF6F3EFF8F5F1F7F3F0F0EEECEBE7E6E4E1DF D9D7D4C9C8C5C2C0BDB8B5B3AAA9A7A5A3A19D9A9993918F8E8D8B8786858484828483817F7E7C 7C7A78787674757472706E6B6D6B696A686467656265636062605D605D5A5E5B595D5C595A5856 57565557555453525151514E504E4B4E4C4A4C4B474A484548474346444244434142413F423F3F 41403F3F3F3E3F3E3D3E3D3C3C3C3A3B3A39393937393736373634363433363534343331333230 312F2D302F2C302E2C2F2D2B2D2C292B29282A28272A2826282826272625252524242422242322 24232224232223232122222023222122222122222023222121201F20201F21201F201F1E201F1E 201F1E1F1F1D1E1D1C1C1B1A1B1A191A1A191A1918191918181817181817191817171616161616 171616161514151514161514151514151414151514151413141413141413131312131210131210 12121013121012121010101010101010101010100F10100F10100F10100F10100F0F0F0D0D0D0D 0D0D0D0D0D0D0D0D0D0D0D0C0C0C0C0C0C0A0C0C0A0C0C0A0C0C0A0A0A0A0A0A0A0A0A0A0A0A0A 0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A090A0A0A0A09090A09090A090A0A09 090907090907090907090909090909090909070906070706070706070706070706070706070706 070706060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606060606060606060606060606060606060606 060606060606060606060606060606060606060606070606060606060606070606070707070606 0706070909090909090A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0C0A0A0D0D0C0F0D0D 1212101615141B1A192322212D2C2B3B3B3951514D666663878684ADACA9CFCCC8E8E6E0F3F0EC F5F2EEF0ECE6EAE6DFE7E4DCE5E3DCE8E5E0EFEBE6F6F1ECEAE6E0C0BEB88785804C4D4C292A2F 18191D1010131313141414151313141314151615151210100A0A0C1313143B3B38666B627C8476 7680726F796A4C50491E1F200A0A0D030405000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000010103040405020202323231727872 6D7869676D6240413D171718100F101010131212141312141210131310131212130F10130D0D0D 151516363737424243242425171618414040868280BAB4B1CDC5C1CEC7C3C9C2BEC6C0BBC9C2BD CDC6C0D1CBC6D8D2CDDDD8D4E2DFDAE4E0DCE6E3DFE9E5E2EAE7E3ECE9E5EEEAE6F1EBE9F3F0EC F5F2EFF7F3F0F9F5F2F9F6F3FAF7F4FBF8F5FBF8F5FAF6F5FAF7F4FAF7F5FBF8F5FBF7F5FAF7F4 FAF6F4FAF7F4FAF8F5FAF7F4F9F6F4F9F7F4FAF7F4F9F6F3F9F6F4F9F7F3F9F6F4F8F6F3F8F5F2 F7F4F0F6F3F0F5F2EFF5F2EDF4F0ECF3F0ECF2EFEBF2EEEBF1EEEAEFECE9EEEDE9EDEBE8ECE9E7 ECE9E6EBE8E5EAE7E4E9E6E3E7E4E0E5E2DFE4E2DFE4E1DEE5E1DFE2E0DDE2DFDBE0DDD9DFDCD8 DEDBD8DDDAD7DCDAD7DCD8D6DBD7D5DAD7D3D8D6D3D8D5D2D7D5D2D6D4D1D5D2D0D5D3D1D4D2D0 D4D2D0D4D2CFD3D0CDD2CFCCD2CFCCD2CFCBCFCDC9CDCBC8CECBC8CBC8C4CCCAC6CBC9C3CBC8C4 C8C5C2C6C3BFC5C3BEC4C1BDC2BFBBC1BEBBC1BEBABFBCB9BEBAB8BCB9B7BBBAB6BBBAB6BAB8B5 B8B7B5B9B7B4B9B7B4B8B5B2B7B6B2B7B5B2B5B4B1B5B3B0B5B3B0B3B1AEB3B1AEB0AEABB0AFAC ABAAA8A8A6A3A8A6A2A7A5A2A5A3A1A19F9DA09E9CA09E9C9F9D9B9D9C9A9B9A989B9998999997 9A9997989796969594979594969593969594979593949392939392939391939392939392929191 8F8E8C8D8C8A86858283827F8988868A8987868582878584878684888684878584807F7F7F7E7E 7F7E7D7F7D7D7F7D7C7E7D7C7A7978767776777675777675777775777675777675767674737371 7171707171707171707171707271717171707271716C6B6B6A69686A69696B6A696B69696A6969 6B69696A6969646463636362636262626262636262636362636362636362636362636262636362 6363626362626363626363636363625F5E5F5B5A5A5B5B5A5B5B5A5B5B5A5B5B5A5B5B5A5B5B5A 5B5B5A5B5B5B5B5B5A5B5B5B5B5B5A5B5B595B5B5A5B5B5A5A5A595B5B5A5A5A5A5B5B5B616160 646464636362636261636363636362636363636363636362636363636362636363626262656665 6A6B696A6A6A6A6A696B6A696A6A69707070737272727171727171737372767473767472777574 7978767A79757D7C797F7E7B8582808685828B8B879291909393929494939B9997A8A6A4B9B7B5 C3C1BDD2D0CDDCDAD6E8E5E2F3F0ECF7F5F0F7F5F0F4F1EDEEEBE8EAE7E2E7E5E0E8E4DFE8E5DE EAE5DEEBE7E0EFEBE3E3E0D8BFBCB78684814F4F4F28292C1E1F242425281F2023141515131414 1313141414151010120D0D0F1010102A2B2A545652777B72858D7F7981736D7569666F62444842 1B1C1D06090B010404000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000202020808090101011F20206869656E756B 6C736A5F645D3D3F3B1E1E1F101012100F101210131210121210141212131312130D0F1006070A 1514163C3B3C5353553B3C3E1C1D1D2220204C4A487F7A79A7A19EC1BAB7CCC4C0CEC4BFCCC2BB C8C0B9C8BFB9C8C0B9C9C1BBCDC6BFD0C9C3D5CEC8D6D0CBD9D3CEDAD5D0DCD5D2DFD9D6E0DBD7 DFDBD7E0DCD8E0DDD7E0DDD9E1DDD9E2DEDAE3DEDBE2DFDBE2DEDAE2DFDBE2DFDAE2DDD9E2DEDA E2DFDAE3DFDCE2DFDBE3DFDDE5E1DDE5E2DFE5E3DEE6E3DFE6E3E0E6E3DFE6E3E0E6E3DFE7E4E0 E7E4E1E8E5E1E8E5E2E9E5E2E9E6E3E9E5E2E9E6E3E9E6E3EAE6E2EAE7E2EBE7E3EBE8E4EAE7E3 EBE7E3EBE8E3EBE8E4ECE8E4EBE9E4EDE9E5EDE9E6EDEAE7EDEAE7EEEAE7EEEBE7EEEBE7EEECE8 EFECE9EFEBE8EFECE8EFECE9EFECE8F0ECEAF0ECE9EFEDE8EFEDE8F0ECE9F0EDEAEEEBE7EFEBE7 EEEAE6EEEBE6EEEBE6EEEAE5EEEBE6EEEBE6EFEBE5EFEBE7EFECE7EFEBE7F0EDE8F0EDE8F0EDE7 F1EDE8F1EEE9F1EEE9F1EDE9F1EEEAF2F0E9F3EFEAF2EFEAF1EEE9F1EFEAF2EFEBF3F1EBF3F1EB F4F1ECF3F0EBF3F0EBF3F0ECF3F0EBF4F0ECF5F1ECF5F2EDF4F1EDF5F2EDF5F1ECF6F2EDF6F3EE F6F2EDF6F2EEF6F2EEF5F3EEF5F2EEF5F3EEF6F3EFF6F3EFF6F3EEF7F3EFF7F4F0F6F3EEF6F4EF F6F4EFF7F4EFF8F4EFF7F5F0F8F4F0F8F4EFF8F5EFF7F5F0F7F4F0F7F5F0F8F4F0F8F6F1F8F6F1 F9F7F1F9F6F1F9F6F1F8F6F1F8F6F0F8F5F1F8F6F1F8F5F1F8F5F1F8F5F1F8F5F0F8F5F1F8F5F2 F8F5F1F8F5F1F8F6F1F8F6F0F9F6F1F8F6F1F9F6F1F9F6F1F8F6F1F9F6F2F9F6F3F9F6F2F9F7F2 F9F7F2F9F6F2F9F6F3F9F6F3FAF7F3F8F6F1F8F6F1F8F5F1F8F6F1F8F5F1F8F5F1F8F5F1F8F5F1 F6F4EEF6F3EEF5F3EEF6F4EEF6F4EFF6F4EFF7F5EFF6F4EFF6F4EFF7F5F0F7F5F1F7F5F0F7F5F0 F7F5F1F7F5F0F7F5F0F6F4F1F5F3EFF5F2EFF5F2EFF5F4EFF5F3EFF5F2EFF6F3F0F5F2F0F6F3F0 F6F3EFF5F3F0F5F3EFF5F3EFF6F3F0F5F2F0F6F4EFF5F3F0F6F4F0F5F3F0F7F5F2F8F6F2F7F6F2 F7F5F1F7F5F2F7F5F2F7F6F2F7F6F2F7F6F1F8F5F1F8F5F1F7F5F1F7F5F1F8F6F1FAF8F4FAF7F3 FAF7F3FAF8F3F9F7F3FBF9F4FCFAF5FBF9F4FCF9F4FBF9F4FCF9F4FBF9F3FCF9F4FCF9F5FCF9F5 FBF8F3FBF8F4FCF9F5FCF9F4FCFAF5FBF9F4FAF7F4FAF7F3FAF7F2F7F5F0F5F3EDF3F0EBEFECE9 ECE9E4E8E6E0E6E3DEE6E3DEE7E5DFE9E7E1EBE9E4EFEDE8F2F0E9F4F0EBEDE9E4DEDCD5D0CDC7 9A989455545328282C1B1D2220212626282D2A292C222123151517101012100F120D0D10101212 20222045484276797090968D91958B7E85786F786A6B7165636D5E3F453B171618080609020202 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000807080202030C0A0A5052506D746C6C7569 707A6D686E644849442929281717181010100F0D0F100D101010121010121212130C0D0F030306 0F0F103939395F605E5A5B5C3738381C1C1D1D1E203A3A395C58577B78759D9794B3AEA9C2BCB6 C9C2BDCCC4BECDC4BDCBC3BCCBC2BCCBC1BBCBC1BACBC2BBCAC1BACBC1BBCAC2BBCBC2BBCBC2BC CBC3BCCBC3BDCBC2BCCCC4BECCC4BECDC5BECDC4BFCDC5BECDC5BECDC4BECDC4BFCDC5BFCEC6BF CEC5BFCEC6C0D0C8C2D2CBC5D2CAC4D3CBC6D3CBC6D4CBC6D4CCC7D4CDC7D5CDC7D5CEC8D6CEC9 D6CEC9D6CFCAD7CFCAD7D0CAD7CFCBD7D1CBD8D2CCD8D2CCD9D1CDD9D2CED8D1CDD7D1CCD8D2CD D8D2CCD8D1CCD7D2CCD8D1CDD9D2CCD7D1CCD7D1CCD7D1CCD9D3CDDBD5D0DBD6D1DCD7D2DCD6D1 DDD8D2DED8D2DED8D5DED9D4DFDAD5DFDBD6E1DBD6E1DCD8E3DFDAE3DEDAE4DFDBE6E1DCE7E4DE E8E4E0E7E3DEE8E5DFEAE5E0EAE6E1EBE7E2ECE8E3ECE8E4EDEAE4ECE9E4ECE9E4EBE8E3EBE8E3 EBE9E3EDE8E4EDE9E5EDEAE4EDE9E3EBE8E3EBE8E3ECE8E4EDE9E4EEEBE6EEEBE5EEEAE5EDEAE5 ECEAE4EDE9E4EEEAE4EEEBE5EFEAE5EEEBE5EEEBE5EEEAE4EDEAE4EDEAE4EEEAE5EFE9E4EFEBE5 EFEAE4EDEAE4EDE9E4EDEAE5ECE9E4EDE9E4EEEAE5EDEAE4EDEBE6EEEBE4EEEAE5EDEAE5EEEAE4 EEEBE4EDEAE4EDEAE4ECE9E2EBE8E1ECE8E2ECE9E3ECE7E3ECE8E4EBE8E3ECE8E3EAE6E1EAE7E2 EBE7E1EBE7E1EAE6E1E9E7E0E9E6E1E9E6E0E8E5E0E9E6E1E9E6DFE9E5DFEAE6E0E9E6E0E8E6E0 E7E5E0E8E5DFE7E4DFE7E4DEE7E4DEE7E4DDE6E3DEE7E3DDE7E4DEE7E4DEE6E4DDE7E3DDE6E3DD E6E2DDE6E2DDE6E3DCE7E3DEE6E3DEE6E2DEE6E2DDE6E2DEE6E3DDE6E3DEE6E3DDE6E3DEE6E3DD E6E3DEE6E2DEE4E2DDE5E2DCE5E2DCE4E2DDE4E0DDE4E1DDE4E1DDE4E1DCE4E1DCE4E1DCE3E1DC E5E2DDE6E3DEE6E3DFE7E3DEE7E3DEE6E4DFE6E4DEE6E3DDE7E4DFE7E3DFE7E4DEE6E4DFE6E4DE E7E4DEE7E4E0E6E4DFE7E3DFE7E4DFE7E4DFE7E4DFE7E4DEE7E3DFE6E3DEE6E4DDE6E3DDE6E4DE E6E3DEE5E3DEE5E3DEE6E3DDE7E3DFE6E2DDE6E4DDE7E4DFE6E3DEE6E3DEE5E3DEE6E3DDE6E3DE E6E3DEE5E3DDE5E3DDE5E2DDE5E3DCE5E3DDE6E3DDE6E3DDE6E3DDE6E3DDE6E3DDE6E2DDE6E2DD E6E3DDE6E3DEE6E3DEE6E3DEE6E3DEE7E4DEE8E5DFEBE6E1EBE8E2ECEAE4EFECE7F1EDE8F2EFE9 F4F2EBF4F1ECF3F0EAF0ECE6E7E4DED2CFCBB9B6B29F9D9A7372714446462F30331B1D221B1D22 23242A27282A2D2C2E2C2C2F1B1C1E1010100D0D101315162325244043416D6F678F90859B9D93 8F96887E8576757A6D6F746A6671615E6A593F473F151417050506000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000505050607070000002F302F6567636F756D6B7669 6E786B6C72695E615C4347432929281919191010100D0D0D0C0A0C0C0C0C0F0F100C0C0C020202 0606062A2A2A5353546565665F5E6043444428292C1C1E212020222D2D2D444343595757696664 7B78758D89869D9895A6A39DADA9A3B4AFA9BAB3ADBFB8B1C3BBB5C4BDB7C4BDB7C6BFB9C7BFBA C8C0BAC8C0BAC8C1BBC9C0BAC8C0BAC9C1BAC9C1BBC9C1BBC8C0BAC9BFBACAC0BACAC1BACAC0B9 C9BFB8C8BEB7C8BEB7C8BEB7C7BEB7C7BEB7C7BEB7C7BDB7C7BDB6C7BEB7C7BDB7C7BEB8C7BEB7 C8BEB7C7BDB7C7BDB7C6BDB7C7BDB6C7BEB7C7BEB7C7BEB8C8BEB8C8BFB8C8BFB9C8BFB8C8BFB8 C9BEB8C9C0B9CAC0B9CAC1B9C9BFB9C9BFB8C9C0B8CABFB8CAC0B9C9C0B9C9C0B8CAC0B9C9C0B9 C9BFB9C9C0B9C9BFB8C9BFB9C9BFB8C9BFB8C9C0BAC9C0BACAC2BBCEC6C0D0C9C4D2CAC4D5CEC8 DBD6D0E0DBD6E2DFDADFDCD7DAD7D2D9D6D2D8D5D0D5D3CDD5D2CED2CECBCECAC6CECBC7CDCAC6 CCC9C5C8C5C1C6C3BFC5C2BEC5C2BEC5C2BEC5C2BEC1BFBBBEBBB7BCB9B5B9B7B3B8B4B2B7B4B1 B5B2AFB4B1AEB3B0ADAFACA9AEACA7AFACA8AEACA9AFADA9B0ADAAB1AFACB4B1AEB5B2AFB6B3B0 B7B4B1B8B5B2B8B5B1BAB7B4BAB7B4BCB9B6BDBAB8C0BDB9C0BDB9BDBAB7BBB8B5B4B1AFB0ADAA AFACA9AEABA7B1AEAAB4B1AEB7B4B1BAB7B3C1BDBBCDCBC6CFCCC7CECBC7CFCCC8D2CFCBD6D2CD D9D7D2DBD9D4DDDBD6E1DED9E2DFDAE4E1DDE3E1DBE7E3DFE7E5E0E6E3DEEAE7E2EAE7E2E9E6E1 E9E6E1EAE7E2ECE9E3EDEAE4EDEBE5EEEBE6F0EDE8F0EDE7F0EEE8F1EDE8F0EDE8F1EEE9F1EEE9 F1EEEAF2EFE9F2EFEAF3EFEAF4F0ECF4F2EBF5F2EDF6F3EDF6F4EDF6F2EDF6F2EDF6F2EDF6F2ED F5F2ECF5F2ECF5F1EDF4F1ECF3F1EBF3F0EBF3F0EBF3F1EBF3F0EAF2F0EAF2EFEAF3F0EBF3F0EC F3F0EBF2F0EAF2F0EAF2EFEAF1EEE9F1EEE9F1EDE9F0EDE9F0EDE8EFECE8EFEDE7EFECE7EFECE8 EFEDE8F0EDE9F1EEEAF2EFEAF3EFEBF3F0ECF4F1ECF4F2ECF5F2EDF3F0EBF3F0EBF3F0EAF3F0EB F3F0EBF3F0EBF2EFEAF3F0EBF3F1EBF3F1ECF3F0EBF4F1ECF3F1EBF4F1ECF5F2EBF4F1ECF5F2EC F4F1EBF4F1EBF4F1ECF4F0EBF4F1EAF4F0EBF4F0EBF4F1EBF4F0E9F4F0E9F3EFEAF3EFE9F3EFE9 F2EFE9F2EEE9F2EFE8F1EDE7EEEBE4ECE8E2E9E5DFE6E3DDE3E0DADAD8D3D0CDC9C4C2BEB2B0AB 9896937E7C7B656462393A3A2022251214160D0F1211131718181F2526292D2F30323335323233 2728281818191D1E1D363735565B547379708D91889A9D949A9D918D90837D8276747C6F6C7767 65705F5C6657545F4F3F473E131316010004000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000070909000001100F10454646686E6872796E696F64 6D7368757E726F766D5D635B494D483D3F3C3234302527251A1D1C1515141010100A0C0D000102 0000000A090C2B2B2A494A495B5C5B5E5F5E53555444464638393B2B2B2D2224251D1E1F1C1D20 2122232324262727282E2E2F3735363E3E3E4746484B4A4C504F505352515757565D5C5C605F5E 61605F63605F62605F6261606361616462616260606562626B67666B68676A6767696665676463 676463676463666464676363666463686463696564686565696665696665696766696665686665 6866656967666966656B69676C69686C6A696E6B6A716E6C716E6C716E6D706D6C716D6D757270 76737177747276737274706F76727075716F76737174716F736F6D726E6D726E6C706C6B6F6B6A 6B68666A666667646466636265626163605E605D5C5E5C5C5D5A5A5B58585C585A5C5A595C5A5A 59595A5454554A4A4D4B4B4D4A494A4546474445464140433C3C3E3A3A3D37383B353739333336 3032352F30322E2F312E2F312D2E302A2B2D27272A27282A252729242529232529222427222426 2022261D1F231C1F211D1E221D1F221F1F221F1F231F20241F2124202226212227212227222327 23242824252924252923252825242926272B26272A2526292322281E20251C1E221A1D201C1E22 1E2123212226222326232527282A2C34363738383A39393C39393C3B3D3F3F4043444547494A4C 4D4F5153535455555758595A5B5B5C5F5F606160615F5F5F6767666C6B6B6C6B6B6E6D6C70706F 7272717675737777757A7A787E7C7A807F7D82817F8383818685848888878B8A898C8C8A908F8D 9391909594919797959A99979D9C999D9C9A9F9E9BA2A09EA6A5A1A8A5A3AAA8A5ADABA8AFADAA B1AFACB3B0AEB4B2AFB6B4B1B9B6B3BEBBB8C2BFBBC5C2BEC7C4C1C8C5C1CAC7C3CDCBC6CFCCC8 D3D0CBD3D0CCD4D1CDD6D3CED7D4D0D9D6D2DAD8D3DCD9D5DDDBD6DFDCD8DEDCD7DCD9D5D9D6D2 D7D5D0D5D3CDD1CFCAD0CEC9D0CEC9CFCDC7CECCC6CBCAC5CBC8C3C7C5C0C5C3BEC3C0BCC1BFBB BDBAB6BAB8B3B5B3AFB2B0ACB3B0ACB0ADA9B2B0ABB4B2ADB0AEA9ACABA6AAA7A3A8A6A1AAA8A3 A7A5A1A6A39FA4A29DA09D9AA29F9BA4A29EA2A09B9D9B9798959298969192918C92908C908F8B 8C8B888B89867F7D7A71706D6766645F5E5C5757584B4C4E3D3E402F30332123251515190C0D12 0A0C0F0F101416191B2022232A2A2D3637383F42434A4D4B5153514E504C4B4B474E4F4B636560 83857C94978D999D9397988D8B8E81808376787C70717A6C6C7568636C5F5A6556566152495147 2A2D2A090709000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000404040104050000021E1E1F5152506F736B6B7467626A5E 666F6371786D757C71747B71737A706B736B626862585B55484B473E413F3335332C2E2C1E2020 0D0D0F0606090A0A0C171716272727353738444545494B4B4B4D4D494B4A4648484345463D3E3F 3738393335362D2E302526291F22251C1F231A1D21171A1E15171B16161B14161A111316111317 1012160E10130B0D100A0C0F0A0A0F080A0D090A0D06090C06070C06070A05060A06090A050609 03050902050703060906060A06070A05060A05060A05070905060A05060A05060905070A070A0C 06070A070A0C080A0D090A0D070A0D080A0F0A0A10080A0F080A0F080C100A0C100A0C100A0C10 0B0D100B0D100C0D120D0D130D10140D10140F10150F10150E10150F10150E10140D0F130E1015 0D10150E10150F10140E10150F10150F12170F12171013181113191113180F12170F1015101018 10121913141913151913151A16181C14171B15181C15181B15181C16191C17191D181A1E191C1F 181A1F191B1F191C1F1A1C211C1D221D1F221E20241D20241D20241F2225212225202225202227 2122282123272325282225282022272022251F22251F21251F21271E20261F21241E20241D1F23 1D20231D1F231D1E231C1F231C1E231D1E231D1F241E20261F21262022272022262022261F2125 1E1F241C1E221A1D211A1C201A1D211A1C211A1B20181B2018181F16191F16181E16191F16181E 14171B15181C16181C15181C15181C15171C14171B14161A15171A14171914161A13161A14171A 14171A15181B16171B15181C16191C16181C16191D16191D181A1E181A1E181C201A1C201A1D20 1B1E201C1D211B1E211B1E201C1E211F212421232621222524252824272925282926292A27292B 282A2C292C2E2C2C2F2F313332343635363836383B38373B3A3B3C3E3F3F404142444546454647 46474848494A494A4C4C4D4F5051515152535455545757575556565253534E4F4F4B4C4D474848 4343434142424242424141403E403F3D3E3F3C3C3D3B3B3C39393A363738373939333536303232 2D2E2F2B2C2E2C2D2F292A2C2A2B2D2B2C2E292A2C26282A232526222426242526222325222525 2123252021232023242224262123251E21221C1E201C1E20191C1E181B1C181A1C17191B17191B 1417191113150E10120C0D100B0D120B0D120C0D100F10131416181E2022292B2C36393A484948 525552595C5A686A67727671767A74787B747D7F7886897E8E8F849193878B8E8383877A7A7F73 72786D6E74696E75686C7466646F615E675B5C6656545F50495147363935151515000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000005050802020306060A2425264C4F4D646963656B625D6459 5C625860675C656D626B756A727A70767D73787E75797F77767B747377716E726C666965626561 5A5C584D4E4B40433F3739383738373738373A3A3A3B3E3C3B3D3C3B3E3C3D3D3B464844474A48 4C4D4A545652505350515352585B59575756535453525352575956575957565857585A5A575A57 5D5F5C5C5E5A5B5C575C5E5A5D5F5C5E615D5C5E5B5B5C5B5C5D5B5B5C5A5A5B58585A59565857 5657575455565354555153545052535153535050524B4C4E4A4B4C484A48464947454847464846 4547464445434041403D3F403D3E3F3B3C3C393B3B393B3B37393A343637313434313433313334 3032332F31322E2F312F2F312D2F322C2D302B2D2E2A2B2D2A2B2E27292C252628262729252729 2525272323252122241F21241E20231E1F221E1F221E1F221D1F211D1F211C1E211B1D211C1D21 1B1C1F1A1C1E1A1B1E181A1D191B1E191A1D18181C17181A18191B191A1B18191B16181B17191A 181A1C16181C16181B17181C16181B15161A131518131516121316131517121416131417121417 131517121418121418121518121518131519141519131518141419131517141518141517141518 13151913161B13151A13151914171914161914161914161A13151813151914161815161915161A 14161A14171B14161A15171B16171A16191B17181B16181B16171C16181D181A1E181A1C17191C 171A1D181A1C171A1C17191D16181B15171B16171A15181915171A16171A15181C17191C181A1D 15181C15171B17181C16181B15171B15161A15161A13161A14171A14161A121518121517121316 1012151010151012151315181113161012151214161010150F10130E10130E10130D0F120C0D10 0B0D100B0D100A0D100A0C10090A0D09090D070A0C080A0D07090C070A0C070A0C06070A06070A 06070A06070A06070A06070A06090A06090A06060905060A06090A05070A06070A05070A060909 090A0A07090A060A0A070A0A07090C07090C07090D090A0D090A0D0A0C0D0A0C0F0B0D100D0D10 0D0D100C0D120A0D100C0D100D0F120B0D100C0D100B0D120B0D100C0D120D10140D0F130E1014 1010150F10130D0F1210121413141613141714151713151716171A17191A191B1B1F2022232425 27292B303134383A3B4144434E50505A5E5D686A6675787482847F8B8F878F93898F938B8D9088 8E91888E90878C8E858C8E878D8F8687897D797C6F6F75676A6F62666D5F676E62677063636E60 60675C5D675A5D68595B65564E564B363B351A1B1A050505000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000202020505050302060A0A0D2021213E413D5559545A625B575E54 535C51535E525863565E665C646B6169706670766D757B72787E757D827A80857E838680858782 888A8387898486878381827D7F807A7B7C7776787370746D6C6F6971746D70736D72746F797B75 797B747B7C7581827B80817B7E807A81837C868881878A82878A81898B858D8F8894968F93948D 92948B96968F9999939B9E959B9E969B9E969C9D969B9D979C9C979C9E989C9E989B9E989B9E98 9C9D989C9E999A9E989B9D99999C99999D989B9D979B9C959A9B959A9C95999C94999B94999B93 999B92989A9297999298999197988F96989095979194979092978F939690949691929490929591 91919091938F8E918F8D908D8F8F8C8E908D8E8F8E8D8F8A8B8C878A8B888B8C89898B878A8A86 878A8586878386878383848180847F80837E7F837D7C817B7A7E78797D78787C7A787C79787A77 7578757679777476747376757374747172717173717273717072706E6F6E6C6E6D6D6F6B696B68 676A67696A686769666869665F605D5E605D63656262645F60625E5F605D5E605D5A5D5A585B59 595B5A585A5A585958575957565957555756545655545755535554515553505251505151505252 4F50514E50504D4F4E4D4F4F4B4E4F4B4D4E4A4D4E4A4C4D494C4B484A4B494A4B47494B484A4C 47494A46484946484947484A46474845474945474A444648434547454648454648444547444648 454649444548434447424546424544414342424343414444414442404443424443414343404242 4142434144444244444244434345444041423F41413F4141414243404141414242414342414241 414343424544434544434544454745444645434645424443424443444545444545424343444645 45474847494A474948494A4A48494B494A4D4B4B4D4B4C4E4C4D4F494C4E4C4E504D4E4F4B4E4E 4A4D4E4B4D4E4D4F504D50504E4F505051524D51514E5152505252525453535353525453525454 535554545554585857555856555857565956595B585A5D5A5A5D5B595E5B5C605D5D605E5D605E 5C5F5D5F625F60625F5F625F60625F60635E626360616261636562646664656764676866686966 686966686B676B6C696B6E6D6D6F707171727476767879777B7D797D7F7984857F888A848C8D8A 8F928C92968D969991999B94989B91959B9095998E92958B8E91878A8E848A8C81878A7E86887D 82847A7E7F74787A6F72776B6B7364656D5E63695C62655B60655B5A6456566053576052596254 4F554D3A403A1F201F060606000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000020403040606090C0D0D19181A2E302E454B46545B54555D53 52584E51574C535950565C53595E545A64575F695C636B626A6F676C726B70756F747872777B74 7B7E767D82797E837A83857C84867E838780858880858981858A82868A83888A848A8B84898B84 8B8C858B8E878A8D868B8D868B8D858A8D868B8E858C8F868F90888D8F878D8E888C8E888C8E87 8E8E868E90888E90878E90888E8F878F90898E91888E90878E91878F91878E9188909189909189 8F938990938B8F928A8F928A90928990918A91938991918890938A8F938A8F918992938A92948A 91948A91938B92948B93948B92948C92948C92968C93968D93958B92948C92948C93948D94948D 94958C93958C93958B92968B92968D95968E95968E95958E94978E95978E96998F95998F979890 969791979891969A91969A91979A91979990979991979B90979A93969A93979A92999B94999A92 989A92979A91979A90999A92999A93999B92989B91989A94999A94979C92979C92979B91979A92 999A91989B93979A92989B939B9C959A9C939A9C939B9D939A9D92999D92999B92999B939A9C93 9A9B91979C92969B93989B94989A93989B93999A94989B94989B93989B92989A94999B94989B93 979993989995979A95969A94989B94989A93969A93979B94969B93979994989995989A93979993 979A94989A95989A95989A94979B95979A95979993979993989A95979993959993969894969993 979993979A92979B92989993979892969991989A92969990989A91989991969991979890979990 989A92979A91959A9096988F979890979992979A92979B92969991989A92989990979A91979A92 989B92989C93989B92979991999A92989A90989B90989A91989A91999A92989B92999A949A9C96 9B9D959B9D97999C969A9C969A9D979A9D98999C979A9C979A9D989A9D979B9D989A9D98999C96 999C969A9D979A9C96999B94999C959B9C959A9B95999A93989B93979A94989B94989A929A9A92 9A9B92979A92999B92989B91999B92999B92999B93989A92979B91989E91999D92999C91989C92 989B929A9C92999C92989E91979C91989B91989B91999B939A9B929B9C93999B90999A91999B91 979A91969990969992979A91979A9097999094999094988F95978D95978D93978D92958B8F9288 9091878D8F85888C8186897D83877B82857A8083767D80747A7D72767A70747B6D7175696F7466 6A7063656B5F61675B5B6456566052535D4F535A4D54594D555C5151584E363A351A1A1B050609 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000405050809090A0A0D1010121F2121363835474C464E544D 4F544C4B52494950454851474952484E564C525950575D545960575C625B61645E61655E636961 636962666B63686C64686E666A70676B70696E726A71746C71756E72766F737770757871767973 767972767973767A71767A71777A71777A71787B71777B71777B73787A74787B747A7C73797B71 797C72787C74777D74787D74797C73797C74797C74787C72797C737B7C757A7B767A7D757B7D74 7B7D757C7E767D7F777E80787F80777E7E767D7F777C80787B7E767C7F777B7F777B7F777D7F78 7E80787E80787E80787E81787E81777E81787E80777D81757D81777E81777E8077818279818279 7F837A7F83797E82797F837B81827A81837A80827B81837B81847B81847B81837C82837C83847C 81847E81847C82857C82857D82857C84857B84867C83867E83867F84877F84867E84867D84877E 84877D85877F85888086877D87887E88887F87887F86897E888A7F888981888982888982888A83 898C838B8D858B8C858C8D848A8C83898A82898B828A8D848A8B83898B838A8C848A8B848A8D85 898C848A8D848B8D868B8D868C8D858C8D858B8D858A8C84898D84898C848B8C858B8C858A8C85 8A8C848B8D858A8C848C8E868B8E868B8E858A8E858A8E858B8D868B8E858C8E868B8E868B8E86 8C8E878C8F868B8E868C8F858C8F868C8E878B8E868B8D858B8E878A8E878A8E85898D83898C83 898C848A8B848A8B83898C848B8C84898B838A8D83888B82898C838A8C82898B81898B82898C81 888C81898B80888B81888B82898C82888C82888C80898B81898C81898C81898B82888B81888B83 888C82888B81898B818A8D828A8D80898C80888C80898D82878C81898B82878C82888D82898D84 8B8D828A8C81898D83888B838B8D828A8D82898D838B8D838B8D848A8E83898E818A8D818A8E83 8B8E83898D828A8D838A8D828B8E818A8D818A8D828C8D838A8D838A8D848A8D838B8D828A8D81 8B8E818A8E818A8D838A8C848B8B838B8D848B8D83888C828A8B83898D84898D838A8D838A8B83 898B82888B82888C81888D81888D848B8D848B8D838B8C85898C83888C83898C83898C82888C82 898B838A8C83888B81888A80878A8087898086898083887D83857C82857C80837A7E82767B8173 797D71797C71787B7075796D7174696D71656A6E61666D5F636B5B5F66585B6356575E52565A4F 52564C4C55494953474D544A50534C494B453839341C1C1D050508000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000003030508080908090C09090B12121320222234353241433F 454B45454D45434B43434941424840434941454B43474D454A4E474C514A4D534B4D544B4D554C 505750515851525951535B51545B53555C54565E55575E57595F58595F585A60585B61595A6159 5960585B62595C62595E625A5E615B5E635B5D645C5D625D5F635D5F635C5F645C5D645B5E625B 5C63595D625B5E625B5E625A5E635A5E635B5D635A5E635B5D645C5C645B5C645B5D645C5F655C 5F655B5F645B5F655D61655E61675E5F665C5F655D5D645C5E645D5E645D5F645D5F655C5F655D 62655E61665E60665F61675F63685F62685F62675E61675E61675E626960646960646960636A61 626963626A62636A61656B61656961656A61646A61646A60656A61656B62646A63636A62646B62 656B62656C62656B62666C63666C63656C62656C63666D63686E65686D64686E66676E66696E66 6A6E676A6F666C70656C70676D6F686D6F686C706A6D70686E726B6D726A6E736A6F736970746B 70736B70736B6E726B6D72696E72696E726A71746B70736C6F726A6F736B6E736A6F746B71746B 72776E71756D70736C71746D6F736A6F736A71746C72756C72756C6F736B6F746C70756D70756D 72766C73786E73777071756E72756E71766E72766E73776F747870757970747770757770757871 747970747A71757A72777A73757970767870767A72747972757B7373787073786F73776F747870 75796F74796F75786F74786E74786E73797074797074776F73787074776F73787072796F72796F 72776D74776E73786E72776D73776B73786C71786E73786F75796F74776D74786E74796F74786E 73776F72796F73796F757A6F777A6F777970777A72757B71747B70757B6F777A6F787B70777C70 787B70787D72767B70777A71777B71767B70747B72757B73757B6F777C6F777B71777B72767B71 787B70787B70787E6F788071797F71797F71797D72787E75787C74797D717A7D717A7D72797F71 787E72787D747B7F757B7F737A7D727B7C727A7D73797E73797E727B7E737C7E757B7D727C7E72 7D7F747B7E737A7E747C7E747D7E747C7E747D7E757C7E747B7E747A7D74787E75797E75787E73 777D71797D72777C71767B71757A6F737A6F73776D71766D6B7468687064687062666D61636D60 606A5D5E685A5D64575A6153575D50535A4C4F57494A5346465145465144464D42494D42494F45 444A433739382324230E0E0D020202000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000004060709090D0A0A0D0C0C0C1212131E1F1F2B2E2D 373B383F413F42454242454140453F40453F3F443F3F443E3F443E3F443E3F443D3E433E3E453E 40463E3F473F40463F41473F424841424942434A42434A42454B43464D44454D44454C45464E45 474D45484D46484D46484E48474E47464E46474E46484E46484E46474D47474E46474E46474E46 474D46474E45474D45464D45464D46464C44444D43444D43444D44454C43454B42444B43444B43 464B44464B44454C43454D43474D44464D45454D45454D44474D44464D44464D46454E44474E45 484D46474D45464D45444D45464E44474F45474E46474F46464E45464D46484F47474E47484E48 474E47484E47474E46494F46484E47494E47484F47484F47485048485048495149484F47485046 484F464950484A50484850474851484A51484B524A4B51494A51494A51484952484B51484C534A 4A53494B53494A53494B534A4B524A4C524A4D534B4C514B4C524A4C52494C534B4C534B4C534A 4B544A4B534A4C544B4B534A4D524A4E544B4D534B4D544C4D544B4D544B4C534B4B544A4B544B 4D544C4E544C4D554C4D554C4E544C4E564C4E574B4D574A4D574C4E564D4E564D4E574E4E574D 4D574C4D574C4D574C4F574E4F584E50584F50574D51574E52584F51584F50584F505A4E50584F 50574F51584E50574E51584D50584F50584F515A4F515850515A4F515A4F53594F54594F525A50 535B51525A50535B50535B51515A4F515A4F525B51535B50535B50525A50525B50525B4F555B4F 555B51545C51555C51565C53555D53555F52555D53565E53555F53555D54565D54566054555E55 565E54576053585F54595F55585F55566054576154575F55575F55575F55586256586256586255 585F545960545A5F555961565961575A60565C63595B62585961575A63595B64575B64575E6458 5C64595C665A5C64595C64585B64595B66585B64595C645A5D645A5C645A5D66595D66585D655B 5D655B5F675B5F675A60665B60675B5F675B5F695C61695D616B5E606A5D62675C61675C62695D 64685E63695D64695D63695C62695D616A5C62675D60665C5F695D60665D5F675D60675E5F665D 5D675A5B66595A6359596056585F53566053525F50505B4C50574B4F54494A5446485244454E43 454D4143494043473F42483F41483F4247404448424247403E433D3435332222220F0F13040404 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000008080809090B09090B0C0A0D0F0F10161618 2121222B2C2C3438353A3E3B3E423E4044403F433E3F433E3E423E3C403D3B3F3A3B3D39393D38 393C38393B37373B36373B36363B36383B36383B36373B36383B37383C36373C36373C37373C37 373C36373B36383C36373C38373C37373C37373C36373C37373C37373C36363B36363B36363B37 363B35353B35363B35363A36363B36363A36353A36363A35363A35363A35373A36363A36363936 363A35363A35363A35363A35363A36363A35353A35353A35363A35373A35363A35363A35353935 363934363934363935353A35353A35353A35363A35363936353A35353A35363A36363A36363A35 353A34353A34373A35373A36363A36373A37363C36363B36363C36373C36373C37383D38363B36 363B36383C37383D36373D37363D36363C36373C37373D38373D38383E39373D37383D37383E36 383E38383E37383D37383D37383D37383D37383D37383E37383D39393E383A3F38393E37393F39 393E39393E39393E38393F39393F39383F393A3F393B3F393A3F393A403A39403A3940393B3F3A 3A3F3A3A3F3A3A3F393A403A3A413A3B403A3B403939403A39403A39403A3A413A3A403A3B413B 3D413A3C413A3B423B3C423B3D423B3D423A3D413B3C413B3B413B3B413A3C413B3C413B3C413B 3C413B3D413B3C413B3B423B3D423A3D413B3C433A3B433B3C423A3D413A3D423C3C433C3D433C 3E443E3D423D3D433B3D433C3D443D3E443D3D443C3E443C3F453C3E443C3E443C3F443C40443D 40453D41453E40453E40453F40463E3F473E3F463E40463F41463F3F473E3E473F3F473E3F483D 3F473E41473F40474040473F41473E40473D40473E40473E40483D40473E41463E42473F41473F 40483E40493D40483F41484041484141494040494040493F41493F43494043483F424A40424A41 434A41434A41424B41434B41444A42444B42444D41434D41434D41434B42454C43464C43464E43 464E44464E43464E44484F45474F45475046485045475046464E44494F454A4F47495046485245 475144485045465144485045454E44454E44454E44464C43474D43454B43444D43434B42424840 43484142453D3F443C3B42393A41383C3F383B40393A3F383A3E383B403A3D413B3F433C40433E 3F433E3D413D393E393437332828261D1E1D0B0C0C020203000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000002020305050608080A0A0A0A09090B 0F0F101416161B1D1D2324242A2C2A303331343735383B373A3C39393C39383D38393D39383C37 373B37373A37363936353A36353935353935353835343834343735343734343734323633333633 333632333633323532323632323533323531313532323531313431323531313532313431313431 3134303034313133313034313034312F33312F33302F33302F33303033302E33302F33312F322F 2E322F2E322F2E322F2E312F2E312E2E312E2E312E2D312E2D302D2D312E2C312D2D302D2C302D 2D302D2C302D2C302D2D2F2D2D302D2D302D2C2F2C2C302D2D302D2D302D2D302D2D302D2D302D 2D302D2D302D2D302D2D312D2E312D2D302D2D312D2D302D2D302D2E312E2D312E2C2F2D2C302E 2E302E2E312E2E302D2D312E2D312E2D302D2E312E2E312E2D312E2D302D2C302D2E312E2E312D 2E312E2D312F2C302E2C302E2D302E2E312D2D302E2D312E2E312E2D302D2E312E2E312E2E312E 2D312E2E312E2D312E2D312E2E312E2D312E2E312E2E312E2E302E2E312E2E312E2D312E2D312F 2E312E2E312F2E312E2E302E2D302E2D312E2D312E2D312E2E312E2E312F2D312D2D322E2E312E 2D312E2E312E2E312E2D312D2E312E2E312E2E312E2F322E2F322E2E312E2E312F2E322E2E322F 2F322E2F322E2F322E2F322E2E322E2E322E2F312F2E332F3033302F332F2E32302F322E2F332F 2F322F3134303033302F33303033303033302F342F30332F30343131343030333030333030342F 2F342F2F34303034303034303035302F343030343030343030342F30343030343031343031342F 30332F303430313431313430313430303430313430303330303430303430313431323430313430 313531323532323530323630333532333631333632343732343732333633333733333733333733 333834353834343734353733343734333834343834343833353833343934333A33353A35363A35 373B36373B35363B35373B35373B35373B36373C36373B37373B36363B35373A35373B34363B36 363A34373A35363B35353B36353A34353A34363934353934353834353834353835353934373A36 373A36373A36383A383A3C393A3D3A3A3E3A3B3D3B393B393739363334312C2C2A232323191818 0B0C0C030305000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000020202030303030505 05050907050A0909090C0C0C0F0F0F121314191A1A1D1D1D1F20212223232527262729282A2C2B 2C2E2C2D2F2D2D312F2F32302F3331313431323633323633333633333734343835343734343634 343734333734343735343735353835343835343735343835333734333734333634333634343634 333633333534333633333734343735343735333835333735333634343735333734343734333734 333634333633333533323634333634333634333732333633323633323633333634333633323733 333734333634333633333733333733333633333533333634323632323532323532323532323532 313532313432313532313431323531323432313432303431313431313432313332313431313431 313432313431303432303531303431313431313432313432313531303431313331303431303331 303431313432313432313431313430303432313432313431313332303432303431313431313431 313532313431313431303431303431303431313431313431313432313432303431313432313431 313431313431313432303331303431303431313431313431303432313432303431303431313431 313431313431323531313432313431313431313431313531303431303430313431303432303432 313431313531313432313431313332313432313432313431313431313431303431303431313432 313431303432313431303431303430313430313431303431313431303432303432323432303431 303431313430313431303431313531313531313431313431313431313432303432313432313431 313431303431313432313431313331313431313432313432313432313432323432313431323432 323533323432313432303431303330303431313330303330303431303431323431313531323532 323533323633333633323633323633333633333633333633333533333533323532333532323532 323532333632333633333632333533333633323633323633333634333633333634333733333733 3336333336343438353439363538363537353537353437353435333335323233322F312F2C2E2C 2A2C2A2728262223231C1E1E181A181012120B0B0B030303000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000020302030303030605080604070707090A0A0C0B0B0C0B090E0C0C10 0F10100F0F1211111213141315151515151617171817181819191A18191A181919181919181918 19191A18191A1A1A1B191A1C18191A191A1B171919171919171819181919171819181A19171919 16181919191A191A1A19191B181A1B18191A181A1B17191A18191B191919181919181819181919 18191917181A18191A1A1919181A1A191B1B1A1B1C1A1A19191819181819181A1A18191B18181A 19191A191A19191A1A191919191A1A18181A17181A17181916181A171818181818161718171819 171718171717161717171717171817171718181818181817171717171717171718171817171718 171818171717161818161918171819181818171719161719181918171919171918171818181819 18191917191919181917171A17181A18191A18191A171819171919191A1A191A1A19191A191A18 191B1A191A1919191A181B1B191A19191A1A17191B191A1C1A1B1B1A1C1B191B1A1A1A1A191B1A 1A1B1B1A1B1B191B1A1A1B1A191B1A191B1B191A1C191B1A1A1B1B191A1B1A1A1B191B1C1B1B1A 1C1C1B1B1B1B1A1B1B1B1A1B1A1B1A1C1C1A1B1B1B1A1C1C1A1B1B1A1C1B1A1B1C1B1C1C1A1B1C 1A1B1C1A1C1D1A1C1C1C1C1C1A1B1C1A1C1C1B1B1B1A1C1D1A1B1B1B1B1B1A1C1C1B1C1B1B1C1C 1A1C1A191C1C191B1C1A1B1B1A1C1C1A1C1C1A1B1C1B1D1C1A1B1C1C1C1D1A1C1D1A1B1C1B1B1B 1B1C1B1B1D1D1B1C1D1C1D1D1C1D1D1A1D1C1A1C1C1B1D1C1B1C1D1C1D1C1C1D1C1C1C1D1B1C1D 1B1C1C1C1C1C1C1C1D1C1E1F1D1E1F1D1E1D1C1E1C1D1E1D1D1E1E1C1E1D1D1E1E1D1E1F1D1E1E 1C1E1D1A1E1D1B1C1B1B1B1B1A1C1A1A1C1B1A1B1A1A1A1B1A1A1C1B1C1B1C1D1C1C1D1B1B1D1B 1B1D1C1C1D1C1D1E1D1D1D1C1C1D1E1D1F1E1D1D1C1E1D1D1B1D1C1C1D1D1C1D1E1C1D1D1C1E1C 1C1E1E1C1E1C1C1D1C1C1D1C1B1D1C1C1E1D1C1D1C1B1B1B1A1B1C191B1B1A1B1B191A1A18191A 171A1A1919191818191515171415171113130F0F110F0D0F0C0A0C080808030303020203000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF end %%PageTrailer %%Trailer %%EOF gsoap-2.8.28/gsoap/ios_plugin/ios_plugin/docs/calc-result.png0000644000175000017500000063617212653650146023620 0ustar ellertellertPNG  IHDRYG ciCCPICC ProfileHPTY{49#9JM 4Ķi2bBG`Du@ c@D10(`@A@YXpvj:}us=ުr'ˍ$|]iChaA]3kf[fE$2g%28`ryI$.¨lEyH,2{O/r2/u@x2c@#qZ !/aEsCؚ`!EX;>~"#<`^ ȍcdN#8x'o9V8:?OQW$:ay0/7`S}Z[j<2ڙIյbD! L@PRDZry$r"itSWfo?2{t q,'ķX`uHf~)@ %d^r "@%t>K`  lF:^Lgu+~8~ DP!X,B:PEh##D5џCM,!6oH$"ɜC&"ΒnFH"dM9LO!Q(U-%DO\<| X;^ U7 f '8%DRrb*(4$4#L->,"G*5mkW'X$NMINVO.y$:,Cj`44NZwf 猟1ud*dnb#|GN;v:;vYzYYi˖ޕ=w99{O|>}ʽW9J~X΁6O f<\D+-zxF'$xU>zҨҁ2r}sXo8!{"ħ|XR\ZY|{2䋪~ΫRé=YkZ[['SWP'O={LkNCExcYp6˟~<~ *ʛMPsztKT 5Ŏ6˶_tp++Wf\iO]c_:}:{n߸u.n]mq;-wM6ww7jkSIO={m}_xN<{q'1ùO?yVo|Ǒ~ϟ2G_&'{_n|9j~*o+tOo{{6仚F;fg~pǮOAS?>|Bc,Ipd$ok@( ZK5PRĕw-KRomlhHeqZiRч8 -,̷,,|F} @_1<$%1¿觿88! pHYs   IDATxye]}ν7WJ*MȒeˆ``cbMh8 ݽBduVMH@ɰ Н4 0ٖl4JA5W;ws{Jr[d׮{=7ߖҵt-]KҵJt-]Kҵϵt-]KҵUM]kZv]p;'6ҵt-=tpykI׀Z]@fpv"c׮Зϋ<Tҋ64 U"VWw^5 z<$/\K/Lh򫼳u,s5ՀdwSt@13ab\0^gZIB$;|Fnaiyysna4r9g N麄G C",x0{<(:!d8, B@D| #c|rC `Q GNF?y}:^_8.[:kjl5ڞgy&+ЗvPT (oٳmΜ=?yX1GyADA0FD߭1X`9G1$+6@ 5Ҋ8!x|0b !gkÅ gNgk0 oe>00x;_`u lĿq0ϳQo\K_1V2F&0.o|E|ATɈP Y y@0']Z8.gE5+Bxh( P-hӌ|ZHd .glvn&a[Z@h,ZYlrksEQ8\(>00}wT>Am&UjZSy-/]gfNl5M=2#163# F0"!@l2%]"I` p#7 `DiQĔ\%y]ψ.|0F,%M7Fc\z? WKUcOf(Dw!68@3"͘cM()ȍCb̘A V5/\+0DS ƂQF0#A)V Vqt΅ofikȬ"F% b |@h4h@~PC($x_B9| xA]YeNŨ3j|ˀ*tn\ף]mm'\׵jkֹͤ%IY-Ykgfggf?3ggfg{ͩV)Hf3+ܨpn0\n{oo]ں~rw0^B1reYl6 n Y/X^ܳwy֒je{ D1.,S"J11: qHq{1%炋2c @1>Yᣊ[#+VB)0#^?"6ҠPտR+b>`)2q) *L x֚HhxWB)F*.dLj;=gg# ܤ(-mQKtS}DZFYS{̂>qc](YKTE@nUeĀ{e^GEէwJu6iܽ`$% 9UQ qN׃1Bۡpk-Fdssc̥[[O^8Zosmm}05 H#iRAs*}MϳPQ)o=zto\p 䍜, ŊaP >`ńQ1DP2轈+"h4DʝfCUrzf yFT En\Q&E Ku CD"a Q͑xH*'g$՜$׳BF_1"8I&)[]IOAB)-Xvq=^ @e3RX_z⊢hOB 1 &cODcT0]P$yHm|"Oci"#C"5 ۜ=f+">!DժJ#B _IP|T\syx$cYȲNFʗV.>|zŵ~q3IC;IB_S Mwz->|˷Z-Q<$%fl$r,W 2}6r=AAspD0d0g^p %&qɦDE~|8Jt=ͬ% .p.:| &L\:uTa Rą H-ckD=."%} Q:HK(/)I*2WIDJU=Lh'$)/+B/F5"Hٺ( "k]Ib/.A:r< TF'Kc7JRcҞT@j{wU}B"xj@ NI!-H8i$*_=J&X#d6#,A,i9YAeLMMYU)ֱ(+(FE08z1n;{SNᩧ?O F]-76_)T`jzzom~#/9o6G#x("dy&yIѤk+(C:&lnvl1  9 (7]Cwa}'Pc3Q,)3quXq̖$}~4&CĖ|H)xpBWEFԉ_aQẀֶ[Z] >r>IJk6fS;>vb3: 8Z*l e^`g']/F9Xչ.aصp^@lȑ8:_>Fl RTLBrZ DQ)D$S5trzɪ/qn4(U㭞qh$8DrDͿdKt jCƂsrlhNMўbnvfeiqfnOl =EQ0a01XQh/:u>g}+mv^T4YgϞo~k%/_XxL.3@L gF\Mflllιs8"+Y[`kGg8d&9ZIѠ=ՊsY&6rXS%bk䚎)R FP1RݯK'g|DJN:F#Pq%KD ϧa(9 lEGMILQQTr>Tv&rHߥ5P*[lX*:D-+ jdMOA@7W*?T{k/c,uS]]!N\D4=F1^ e\BNRĺͤrщjKwIs ᡔrR2i~ͪQ IM6Tʵ $9 5spH0( \QN~O4b8QNQ$f3n37?ÞEþ}{ؿo?Β9Bza4:α~/=}Sdy FT4 ib\AV0׽;~u^nOl6[rzm+fF+ .]s:uOJ7T9h4L5[LOSgz,VVA4[M1Y31dbQQ.]\{õkݤgQYJW`Q1^UiIj?v=Un7qjW"?F@'3%ŇڒVvjZ9ڍAy|6Ʃ062Μ$*%+ϖݮs~liy/J`5kf\ Ygߊ9Uxj%R8h`0갹:/skkllnv 倛Mgٿo__=:"Y1(bh.]~/>g -a)aG @/xE' g>roz[~#|$P,l̙3<%9f_g~n9Yc=E s<#r2k2^h&"Dc%gJDWPt&dBl'hJ㫰QV3\c^RQHY6ʓ^=2$I;W': =;IJثw:cj06G&dlQ'dvhǕR~ޱ^ͩꐤWKQlE9+ 45.\\sx9Μ>åK4[mRn\w:Z~N~át>_x' |^s)GP)g XjZ7 WʟnZ-!zZKǹ9uiD,K{4 ,ϲ0 SS 6dYdYD01ƔRԖt?rĖefVlhJ}8K}auIZޛ@Je7igDvoB#,Nu"$%+ `v"Fh'A"ynkvͳk' ctT;kuIv3ISKi1Ȑ itC %@Q%O7Qgcs /rYNVn EukmHGlˎ99YVO)ڡ_$^uυsmܭ_NڍJ)Nb !26 9Ǩp1pN\ɓ9 N:͙gv:߷]w`sּ lȱcXt>`*B‹ByU:,5͗-|]?{kZ&5/^رc{1FEP=KmٻgZSQms2a3;&ͨDSq@T`RP(AGcR 0Ƈ`mюݯ݈PInT}* *9:Չ[m3N̶q;Z=ܠR%]S^ek W] ( _vLvxd& $&i(`qmĻz~(Nyz֟ir\4UMeąԮ}yhR9O F!bh4s8qI;'Nc@bvhk}mLܫZca|Bшh`0:yO<ɣ<ƙ3gW}7G@geeyﭱ9O~ ~zG~)F:0 NK8}i;~G}3gN373ͷ[v8wlt{blSO=?x_x(lSoz^gIG[yͷokޅF֐,h Μ9_|n,3̰{.m5POɒgPySݣ ^9!S"Ωs.!Ѩ`80 rMQܴ:`W~j9JO ꀓV lҵZϗ*cBvǔ_Y:1LϤEYBX" 'ccD `W[č6>gLR*f^N&Ha'˿r]HGmJt+k}lg0ס^DwEv{7`w'<$}sU$zdZM&Sm\nO334f~~9]\X`~aYf5Ahw0`03(Wx>t;\3?~c=ꅋp!;s G:yv{Tf={ؿo333yZ Z͜6Y< @]6bkkNCӡt]1ZףF8#FQ50; IDAT*Kh?ƱoƺȌY> _g" T;mSyU%Bj"K3PN]8Ε<'/)%й6wO)IݮK,//o>;tC]!sPz ;vt@PzaksK9u Ǐ?ţ>`[^ {N#+\ﳟ|wP5`r > \tZf~{7-(Ȳ,dY.V~9z>3`an30TI٢jaN-ָ|2+++Vgn }&xup[[ ϳoj1;3C=M"ϕ#̳c5h3nD >hh0I#m:f|Ox@58IxtoarH<*x6^]uǤ !ϲHyEQi'ꚾGj_5zqYJE푯ЃY.;UR>)hLc=5;}*$ \;\KdMVJPb_|o{4 WA͓pTDD57kp4ōQ[[[\^[css5.ǿVgg)Rf ncyyCqQ#Gff>؈e&h8lŋ+>uǞx<š[oNnXHⳟܿysRmn|ՁgI)`~]?KGoe(|f4+h4h4Z{l❧buu .¥KX_ߠ٤1 E$ !04~SlgiGpƣx(7=سw/KLțmlGUY#=q(a.|6Sr'<L;Qݨ?)ez+PޫdTد;>U`թ;Cѐ~Y]3gyI?q'?SX[[+0ƔL/putMr=z0=f0ƥecu{=:[]VW/SCaMo䵯}-W.ry}3d6g݇ AU*<?33sǻ|U4 f3:}~ٹyB79ssYΝ;˗ڢ?3}ø?O?`02?|;W.vn( oNam`FN^.ɶ?vbeWh}5޵KxF>lF4Mƞ?qG+ ;RAoO>xN>CZKՊ67=$ϛq|Mr>j^Gesc +YY]ᇏqEoo~3VV/{?s p|Հ*BAw'~u SSEe_|C9OQMfjj[ooouWgEtT3f^NϷt-휤PXS8S?QґY##EK|ccs|A6#M=j.Cdqi#G /y 76pt:66KcȱGx_;~pqy>?UN8l~'n\Jy=;VK٤jj2h,..rƣ|-ݻ뱹&-?~:K_r?//~ߣM|sy'˲[?:| ^F9>ٳ瘝_zK4w`0PwTIQdm^;y[->zb0r-z&{'Xp@쳑xE~j T"B<ύy ɂ6LM79nO_?Sp=>/z dpӏ{~_ҷ΅F!Yfmƣ>OӞcuuEOM hPt]^P9q5F#.3՜[[y;[L.B(nm/@"d6pqNVNKwkAGcs+;\J$ }AiBHAj)ē:dY!r!x0_йXA3vxYF~%լj`m2Z161(V3lCfA=Ij11%6xĉ͢7q؍xZ9EF|QΩ418o6'"yᝏǹ"cC7yI`vv#h=.~XS˗q.o+ӳ B}聸r|$oMz69}iΞ=ͩ'OqIΞ;Dž|y͵-Ns#G"G$78>`2];YODy/&̓$g@`,x,P: C%f=e*A @pq!hb MĂ,J C-XqO#.(N &z88Al$`dAA=RZQbBG'T$3Z8 z,5V;9|/ \)9%5[S4Z>xK,"DdyҒi/--QNC/>˾V~;u[{gϞݺ6TO t:~wBAZSS<?8.ǟlgy^KUc/93 |V~'~-2AEZK{f$0|x裏'8,t:#uc+̓08=W>`г2.q6F`.xkx^q |ll#䤽!>ƂpQ2JϖbJ 9x(B Uj 鍉DI%I؍D.*5q烱xQ,>gz*XNB--xG,8hY^҆Z(gvlq Dq`{`x;[O Xy6" zXxCRՎ*錏}I2(NF<.:`MZŗGhӆEd751&;!dlȴMGMzN`MK&2X+ A, ki4[Lϲ8CtQnCG8xN9+,j9xuzzz !ˬ4M.^~'bnv{~_].!Ke\Z]o𲗽^GC{ZPTftrz8؟)8}/1LF&Fa&bj1Ɓw91X (q-H4>RHL yޠJ=c|dm| s s WbᔘZQ *Jd8>X*#5:cCH#GyU"5>QgPjR#Qw U/Q.[*4eX(]{F=ςq&ac+RPQ^u0XD:X(l9L1hk(%1=DQY%GjcsИ@%r{tlR%.`j*NX i^+(f}d,AmT .L2&{](✋k9xT2W <_DQѰSͲn8znF^Uua4v 1Y_'_%>x=ݻ<ϣ \#4 mFc i]f߾>ryzx~/+++aT8yTCA:Ra |^4s1(_l}c`8я)3OӞjg21AaR#zx"~~7ʹ{Kg'?O|O`mmb4TN3S`%g LE5&CTe`l@( n iuyQ`EUg _YY &I"ܨ#<+t?>bD9jqbqy'G#RD7)QW5 bV⪉jhkI4Mx0Q L ցK"N)TMsk,8?/1L$iLBi9[,!(i$ $QinjZp@'so21yYS3V[b\BMQ Fw/L $ITETRuཉK!2et3+&Sȅ:>T0FZC{"_+ﺓ;[]:U>uڳ\p_o4Vfǃ,iZZf9339z^'>i:ڿw+>߼{v{s>LN-o]zջ\1Fn򼉵?zAgطg+t: {DFw(<7p~܁KY_!}U=! qRZ8 6B$RHY2bCDRZEz]JC-qxX³ڻJp@+ENdcK:0j"L5.(a9%HTr52kj5i _zsÍ0vD h2wZ#[/LQ8>ؖnkMhMr+k|x_ύ7ʹFkϙ+ ff'xC0.Jڀ $PR-jH0dTcGQef㬌?ьcKxPF!'VgI(\UkΙA\1WNGn?IUI`%(8`1;r֋5MM2%TZ`UJ%089[# wqћ(KR cLFޚ~w_lmmj5XjMl6Ɔ馛8i;~YGkjʯ\Z5ן_~};|ŀ*v g'x7KKK<|C{(ETǎ &7J^H0*߆hMjR+FnjwiPE1цd:ISpcmj.^W !2 $D.Q7\wj*-W|RW/&F2IY5]&"Clbe_S?"52T6G` h5*`S39S`-&VRR$}N5qcCMu Xī): bh4=?ƏݻDWrB3=ȇ?!~;.]ScR6Uz _0{V棼odu>Cׇ}-1y!$$nW`8p;3Ӧh4vLh^^M&@'yk\TnLjZ_x'sC9On-5b$/:=!8(>ȗ$!ࢇX⼒JFţEqQ*(N2֗mODH"@|`He pNFyIUFP.;"(VJD}Q#M+UQJ-SnY5;D)@9\䬵G$ƹM̄QB.5[^ъ4n IDAT~޿Å6%%)jhy8ѐMwq+ .\Q1?~#hXϱ|%2Ip|r`ȑ#w|?hY9?9`8z^_'z-wz=~q`>6WB؞xxmjrʾGI9dݏf ^|y)" *#QMj(K5zH4(%{ ;[㖄TOڎjHnUķ.?Fс/T%nxF{ E/ mgE"T"Q# 7(TB%@h]BtjL"=DC3UHlSJ j$^:Ta\$1utH=BoWg"LR|u`B|(զqe>2VUht0.r U햱֦.Xp2@FڬmH~I6=~ *<EJTaQ㨥zT8uvզ#:]N,y*jcf@҄yH"|A%Hg{_%_H{vFCMjֲw~w/տ`yiNg܋R z1 3?;sxsgYrfYvE> XOL;I<mz~9"9'mz苜8$yޤ(L5lu %wv9;lu:{?gJ~.QB3oUrt*y Qb|qME[<>un1vAx&F/T*A媍ѱ (rp EdN =Ijj\,.0;"`-A{{>O{fQGj >.~:lnnblFI\@~OinK`k|moyv݅ιy~{MJ4d[¡I!EAQR8FH H(R$ĀJ lLȗ`[…v$[hA#yLt>|8s}nYH=_rzsF CxGox~"ڇ>> kKko~V띨Zpr|ɌR#fo?}|?tѝX׀G[j݃+?#??q#H:k-* mn-B)9NV p,7%Q}iaJ)V >JYC7ݠ\^Cf1>8 -LD\x@t${LGYSkS-q{0o 6 P6@ K%j*Y:+猆*VBj 0\"'ʽ sc(ْ"0t|d4XKI.5PxxeX? 4鲃}|LUqz1qxcDbOZ[KLrzjA`Bɡukx >-ΰ;oqL׉~\|s(5eXw{yrRZD{N/+wX V+g?݃+Xw/˂;^o6_K8<۷oA4e}ʾgWҥ _E\t =z$yol4>Àaz5>7޼ ]ONg,9bb7í[":-R.o?)^NOZԸNEQ8 eYG0xJNRH,kBuTz],q{Htnb]Pa{Oa([gq#s#%s&FQn2 <-)q.^i0Tq,B&~U!YI@m-P$?)Ё{h,keOS<ի/RDG؀&8-Q 0Jzx~C3tF_%-Sn G"oNN܇kat(]âcIGT&LJ>'AD&% 9=)-rLj vy Jp-4E КCc-^R{4|QYO񾦂;wN f c?w~KXnM.|G>6I?9>!v /Lww}y_MB :<_[ Տ|_ W^}^ugg7o_̯`^c9;g?sYp|reaXdXX:~^yUMyU{dQJ=+RJ-tQ*MqЦF74 D*(A4Xj5H0vtQN{7y%EQLPtZNIb4O)͸hid0e'Hn0 [0!P/Kx©PCb-aSPYx0=:;/!J/CP _4K@>4 /aZ 1$nH|f1SSD^P7wT=BJ cH䛁=.[,=ȿ鬙C:q9R[ ZxyGRkH=[]8v̱ +3AtX2aq-'?)v4ΦЏ~M^Vr ^z|7n<{ރh= O,D~}eTflCRW~O?M֏G7D9L: *! v '`ܖnԈ$%(%d$eu蔼i:Lc} J %S??H @$1whVZ854hHA:˱6y,}샀&=rZ:,Uclzm5t0vodS< .hh4(=4%cndj)s?eAε@ڈRn3CpJ+p<{J0JfD:ῂ8F”9`=Q!y0 Yv(QJ NojG^+,Jd}]i yO 5%l* R G=l$,|RzhZ'S*74#Qd;yz+ JUgN=piJ % %N 9Ygn_G7_zwmY*JDp~~9~~>@mH7pzݽ=>[o˲jZ/|8|=;cu*O /?w}WU~W]GE5ɱO>.7<rtD?/_7@𮴻4B[3M:Mpc@Ԟ2.A%1RrjȆI7Ù\0tUxWAG3Ey1;5Trt$> )F$0@&xW94$UrΒϔy,stԶ[y Q:9a@j %!(UACeAH^ P7aPtiLѩFA0O@ģJ@ktGMW@“[0?8XB 0b¾3EtT]*tWYI$) ДCsNDacygyɿ*~duHg|*PRtCΒS$"gǚKьxNHn 4\3P2o5ȥfpQty_@soH'[?󷱻U);x?G{7s M}y6^簷GywŜg‹oEvi<34{>]ۚΪ _oEN̺;{/{wv<]_?C5BDdUS>$⭦4. 't(R.YY0ex@Zĸ%s2DY+d=Ts09wfKU$[(nyi*"zԝV lD V]ASJ B 6f`(?D;̯;]%ލt>Nf–Aq,|29MMgq[T=מ: (@DQ g66D4{qI%9pCd^5.𩆎ա2{Fq̍&GF8i"h>-5ӦE5VcwkWN`-l"%Ro U ФW!`x  ЙBӞH΢Fu.aŹwo~揪>o>'B63Ro >;wКbw}߅ȿ:7vK7nއnx>kMگbgg q vww{{G>rn?ŋ_*0>tl6TNLP {0+WCk4!'4$@X&eub?R@C,jOi2r pb@AŗY}ơ&H1W- T&=̔L ]CpZV a?-LFp@xQż%w^,PiP ϲ+ZFX,E8 ֒I[QLÜf(3k@RcGjih)(8@m7.kFTQbW]-Q+lBj hʉrLػζ}\7Ysh ԭlp RFq' 5# (*ǩ8IUaúVPcdEdFv! D-@". ͛nV[gf('%2(0  P<|V6d4R &v4wୂ ,i-`-=V]`ѲBB6pt[oO?O|Üif8;=}<}aX|/7ހ6fsFCBsϽϾ=vjդ٩*9Ws?1V g'XDBPj/g62EhFsƈDd֬OY='s%6ZNZZȤdD*c <3ed TkIv5&,`]; &P36!{cȵRʐLkd(HU7)!4Pa,="a]g!vMLX"(I H;N՗?4^XV=z5<㏿ =XT!SGjyo6Қ᳏?1m߷wjn{ujz~ǟMM#C3 6N5(WcZ=~{;xs{6r{O݃K?7z;wZñ2Xս20(τ[&њa,ABMJA]s,YVѥTi]>S`:ˆlC-+tyn#?<TFTF ,壬L z0 hD:XSjrn fQG8程NiPf!)f\7vz<-b8LrY# Z3⋮aD̔o">EMŖJ.%HX+T,lF5ĘФJo`L:眀##'GԠtuMG>lt8[y[XaDSO)dU6 C,]d4sӤǙQgֺN.#h4ѠɬJ-ْFz?s^a",v8\jTMY٢5m`?g%g9sǟxz{xGC7B 9āղ­[G+/awg\>~$#ـwȅg{gz}x8e]U_Ë_ ڢх/UZÓO>z;v*>}ߋeYu6/~/KX79>Bk)E$3:(QGvl%RԘUWf HI=M?&id(|59 ϴє*="긖9ձ]{H3:*T (U|KLh:RȵW2FNAY̓C(`:-O-+$ю,Oy$-FV )P 4lM &Q CYEWY '[LKrI[ XMٌs" TϾj(0Xt:xF!FM*B.Lͽ#P]`J`BA!:scbub W5Y0ƘkihF+h:JSB߫ٱNPb"ńtKeʺ(~ ?ݿW^CJ>a< +_gB4 T_J#~z~>YF.z'Z;psz?BTT^xs8??xԓO` }Y<ػp|teb3X~~:6=ih`:(֑jħevꤘQږjF{vm?,iX&ܭe |v@'7QP} T5YK2kc̰FgI sNW"^Q!ǚthI C_`c!P=Dn 6Quς6N81gtkQ'>FDQ,HG?(T%(ciJ̕={,%8FFlRflQc"UVϡ:ӏ5=~kKՄ?H duF DDg()#¬Ӹ7j#akڔRVڥJ*?lK[[o{_K◱PAL"w~|Czz=x/ºU䠛{Dz,xWq['~)px{`~z{w 6җ 6vp}xw<> IDAT%,._h*{WOòqt|(=̣YKc&fe:<- 6* htxV+j?1'K128sTG95TuPC<}qm,V]:IHޱ0-=R/ rZm'3T8'䣵^@ c+H' X`F F-0VwG !T1l.\Nܹ9h!ZK vWN)VdPUZ!0ޢ$Lah<8P0L$\g}*M%&!I@:iX#:Eyh9^="`p|R"D J)Qh{Zh%&Kt 5`GO/}ֻ[mEg?VV}ܸv;Ao|7@!8ߜů|Hr3<{k<G}<>;`oɜS%>ױS`wc<㈕Mm`\S|7DTM>k5%fc.w`LlG i6B A,364U4sr`Z=2>c49D2Ddb`#|J Q6&eo86Ї( Z -&ڊyڹʊuID5NvF/m9ig~g  6hz$"8;=}݇?~,aggՂKᆱQFl: k|-νwQD#$˻\-oN^A Ge7W,/|8;?TBU<vV˂z}C`` >_7m+E"` a<|B\P@$=m=Hfk庠bwsN~t M~[O4>+xI[)"̒g,SrJ )YY ciuR+"ȐWp%W[x+LE`>Rpvr_}o-wwߌ?^>ΧzUԚ:(n| oƢ_$"7;\fb=𳭭w(NNk_yH ~4/zzeYCw=ӭ46??7)ں\h,)Ύ"ej%2'.ǃxd"vjd~DQ߄IǧM[)xaGeϯؒ4dq|(@ʻe-|D`m='tHfkT((3λ t3G?oM2ߙXD}ݏu.Lrb]~wRFW`XxVte(J ~F/{ݐ1[cŵN +{̥‚c,p ; \c>'ǧ} ??Cd ݸ'|zei˗Zm/gxD!Mga[5/gzEQ} F͛o7^T H;_XV ;;Xyil73\'>syg U>aQǿ LKIsjr0-֣+ܫU"Sv ?gzOrd>H}M}y3}>q%sb[R4$E e}Ve}p}8g~D!H`iQ8?z٣يTbU=Ciֱ#7mJNa^o=sIb5ޙ{ޅ6K70 PwN`J޵%q5cRJM%:ދmkYdX0o m]_RR I<^WVFIL!D[SK/ܰ^lgg 3`i߀xnxE,͔mމ/۽~ׯ?y||M˂W_}'PGwx oU(!k/o &bttTӜ Ob_ 20 ^:Pū1.^ΖhSrzȴψ |@ -,'0S%vPqqJxv7\rT(ʙ)G8@̡G|ZICeDFΑ /b' > JK\X7Lν-$Wu[k=K)q8O@V6k%]8ĚƧ[?֔InMw}p# ogf ᚥaܡC8VĻOo?_zFԓOڵkhMZд`YZbj7q|r6~}pp"joHW} > 'x޾5;^~ J|wjgˇe`gg$=׮mt?_{g1  -g,?;f܍ pOjQ*KM }1l8x,EsY}ILPC@;ҧj^Z]O'{&{vI@p׫O Ñ"ð_tipr7>oK`z7|91{L)D>k+c\Ssb_,k [8Wh|.\M  Kv]MvZuzKmс_U>ͳu;zߞlw |C沵Q){| E4>+9vĄC\Y5aA}},) ~s89; g\*(ǡŋn s u%$cI&1͡{=OL+JOՀCzp (e:i%g`#qֶf`ghĄe{]z+-"if Q& y^ ԭBN ? _& FOM55aioY}AԵhэHb)L[PJ\mCP&M)y=͛7s?} nۖeO>j,XVk@[^4ggg-l:ڪ]zꙧ0"mz'%Zko<{6 "޺t*"ָ%Gy8T)`YV>k#,z{2U>P%:YF 3bc8,A"2шD${`N)8PZUr^&?'Y"p/1x}Ϝ.Q:<^|IG @1/YuG5bV;ɍZÀCQ36EuŬ9'ElD籱_Uf j[ @5ir*[ɱE;]bULhqn ,>ƴT3-)('rVe8_kZHjnҴ.>V.ۄd"U\4Vg:'; o-2(f bTIT1.-s(oBl:|&ٌ)$E%[6 PζQq.fz'׷ޣɤ#IS؎ٗP (hR&Uy gp2)0OڃN`;j¶H\)77f2נU]嗾_Oph|pO˲B x#`, T|y5''89=vWk-_o |!ÿ+<{Ç;;;89;4noqsv8kZjƲZa ;<a~)ٹSxWHԩ 45|bӲ oQK0 zNjR->JU8kip5DAN0F"kR-x$hv B;n2Z&TCʊãKCu83=[,=ݙA_%$і #R+%#={(mdUT=+CŜ*#h[ЋxjM$Bq`Q) H|,&ZLX`0uUd47d< Igbrj qEXǸ``oä͒=jqhLh\8; ϚqJ3 Xlwr%/Pq*}8S[ҼF%ipC ƗG'Zx$ͺ帇p[A8s9,aG?H-'ZT&a,+&0R*!88yU|SK/J*nx[oCZc)ERlV6, X' 눒mF(˘G .d㲨#ܖD3100(,:K̓4CI3`S0 s(Tes &2:_C;IkTIE7 ix59a`)BKI*Ʀ"=¹e煬z" c=~vR5n5KrRES(^)=2΄{mPka@'b"2+ 3JH!KL r69 ѥ\0DJ./bUS[zLp:f!T 9 )6259~fy+FӴG21:d4'Pqڢ&>Gs4Hld)rסM؞G%BV >=,Kk CHr0ˇreY5V1A} OݗS:~33k| 6eYpt6Nϑ˲*ng>UťK?|__~Y6Eӫ.ʻ{~6 uU 2.5@.Y,n SުPʸF-(GbZV"pd\֠be<vejL 5kry)ˡfLƙދ$aTz+Tc-ʇ\T1kh-BQAfzE7X`zQ+Њi+FG&H٥͹j69FѪ=v7 tj$KhjH2jVLpO1"d7R--s-r\SȁNEӞEy.@8Aymuh]Nv^QZ8@҄$ 46򇃵2,CzZAoVC#;ٲ!+3J6l<5^؝<*sz^ẋH{r *U(Kkhڂ-A'8;93lMk;7<_W\y7߼nnZ aY-Pfj[pxz x2+/~Tf}004OT÷pT()gтg^3fP]IuMv&*"fh0@T9X>*2d[7qբ5djquMT)Qw*"ƌ Iǩdb ^,k?3pc8QMEn`ZڕfS&߫*A4Mʕ+bt$jj IDATe^wڵgJ-"s6h.6U>hM, $5p`EAd< !*Mgl]4͖#^U 8P}]@(Iֆ#IfM g y댘aj@b R2ѳ!oSpqc0x}_L㹮dqi}ݚTիəI0g-wZiʘ I FIU(|w6#srd{b4 j=[TY0>=&%fC)OnBVUxY$\$ڬl ##{5ya)0ٕжWp 4Ն+W:5Vkۘbq٠xZk >HiZcbZao?T&p1^~86+-}mHw[˸R}=b 0$$mz=)F%;ߓ3䇌i P`؍3&=q@$<@ui^soX^K]&dx|i~ Rdl0#]uL&ٯ.20 L<ޕ?) s+*?<]Qvv029eW2ژ!!+n S[x؂Zɭ0Ffuu LŻ)8Gu tl:'bޔcTnt>M6ͮGt:'{bXl ְA#}D,m7n߀;?8<DnEiľ(w e,..cEWWk gge :X!Ckr9qAo˯[CiCh,J5\}r!0D]90@qW*OL Ȇf*L?%ryJ-BkQ`<,eil: ZPaou#Y'գNa4B~ ތdo3` # !Rԙ; F>-@[!@U{̅!s h" a$pz0Kս 1A/j`A-{Rb#׉"$c{o"ϭvkxF16>˵#N'MG87`6{n4jT]M mS ]֐60kQx8oZ!HF3'e {01Ԗy~k:dp yf@ U dz  [lHa'gZ qrr_{ 㳻 *hՖf6nMM]z^=y޶j<6k׮<MӓSl#I*Ҡ1V+W0S-z-fwtבM d>-YӋ0 |MIYy D?P>@sAXZC.EmbF &U2J hF+Q "2W/MYj:FJCP @]l!Ne[82c5pQ22k/) fPj^+#j}WRĈʋG H>KeP<i4Q7ejiDjyX$fӽ3J (p/4@ҎnҬ 쪷(IM9Ҙ| `xU^ŭUK$\@Fâ0 HR/A`h>C 괮 CKȠ9iHZq&l7ƛ蓜 {{P {Ut3׶ʂ{x.~~42;pzvM@Y LEP*j&޹sDZhH X3gͧ lCxV @ca6|ΏN#j[aqG V7P G F({#^͸jgL1ȇo>Ou{h1I76# B5%Iْdq>ΰI"::Y7A"H*Mq5$ Cq~3ӖOJQ&!7Ve!H! HjL&imT416{Z'%MR;տ1|?OBbHF.*8\aAӆ {]@ &Q0IQQ266+I)9kx"Ҥe EIY^tK57nyd,e Mݜv>V@g[TUk%xo/[}Vu " &*T//Vl6ڵ-}3 .t+ۻ1@ 4[D*Q md]xhM| ~ RF!XR^t9Ҿ };q=V 2G%<38~zGѳl[Նl>h:'2 :R DJ~[}y^J*ߏ80|71pD'׎Evq0< 3`yi$eIucxsobXVYY=in%/^mp ؜o񎃃K!Wz}{|kKw{tsYFHhi>ߧ>;;żdHFu0KV$IJ:shLsvgQCik;jh4||#0\AVls7oZLÆ2{ U@ `G}㬏 x(¼*iC8i8"fi-RK&cDd֖68Tt<+P&9ZS^jw_{eo!^t_2$, ~/>Ԟ{0of5KVnxײ, `)Kt†hG#z^cA|P-Kj# OJZ/[- jK jHt4kYk] rm9NJTs>,y=d_4Ʊ1v>E}7E++\ڏ i8?9g4c,CUFDžV="oG$_3zbJ-  0|p {ĽoY1lzfk]``߸ar >M>$LcC>'$9ZwҤ(y8f AsOM)@Pu9}kBp {kzTSgH҇RoLqf&w(xye E֨U2{׶7;<2}]˗~3<~[zadΞII" rox;:&e&Et&oAʠqq>1Q+Z..6zR'~U6T1cxwvޛ?qegb߹@h Rdsi6n6R!eM8lOqxb#Ō'tsm5Q  $AkP W5p\*Yny{vCD,5mDP酖EϞ4\Y۔4`8Bw*bb(8 oDBZ.;zLȬ) fP@B*poMEYCCo7)$80y庝u^J2**x+CXX+Dlۚ ]B%_5fc:Z 6-wRȪ4xmsaESxDyf4b~QUrRƼkqZ S'D[ #t͹1fҙ rY3kawӨ65"!B*5GwW@_ôCH4'eM, m硇}sBRp|Zͦ0\aRg6 X3+~ ^;N,  vl>+jL ZW,A~q!%4& "l'YDd evn6BF3}K^.^o^~9zY Thc:׵CJ61D`_w`L9JV90݆'3ؗ%JgElyw\EI0mlebM&&Z,T{=w}v68)%ʥ nKUvhI]pPW='lHզ9&=oM U ѣFa0 Q1`=15i;~db)SRѶYGFy[AfZmCTܔc!?Yw3tR](HXX*jk` qeZ!nR~Ȣ۳gK?xQ.-.3s77o븨j{Xj@v:Mu.: Vo%ka< `wumݞD?ÄN5):.!,2 B V1Q#I!bP.m,&A%0]&GF%e2srj!H> p]chtr m! ӉTQf."")%|ᡡ!m8KzP \@}W&__s/[{OX}jgGxɜϸh-AY*N)fDeaS>.cQD: fRV.vuBZq PI̋I8iLuѹe aK.p6}B 8t}5D'!Hvrh ?1+Mv\̕Vfg6<A D5V61u_=-֪MhQVtl+k*H9]&Sx⅄cbcyuF7N3"t6Fh*ܸ/U[C5׻.߱}x2CߙВ5q %ܝxi4d'G.3**oɿgW5{q RvUbґ¬lB{-`+NC(%դp̜`jc 5N;.i 6fxS2jߍϼ۷pSQ0+駃?bOE4q4KlR6{@ʜk"%)E]V18pctʷq/@]%A%d@Pdk4ӄa.uW,6RpdHF{S)kK2u5.j/gNk5+0,;U}ގA ,լ|]\=O>4*2J"(e儬"e01J4&b`݉ =_CG,A$tb5$K8&0@j}{)5s[Y0uty#jO\󼓎MK<=Xo L൸$\)/״KX>EynHϹ q@Ϩ>km͘S'z*cC ~*rk%:Ag@lRjOS`6цȽI]j3h-Τ~Ưvqv} #8`xx~y,,\]}҈$D1J\P:>1BmF_Y9&K}G8D*id7l>\az6$~WVWPQ=ԴI,#opmZ]^u* hտuua`}cGbʺiV~f6h'V@R*vod:*Cyrʆ<ԸQkE덌hE::}iܻS oc0S( l߹ ۷mGWw7dS}V&&V؈Q 7C!-Fs4Qy vk|m@:&pv-.BRO}1!Kɇpټ# *^TFBW:i<͟pL hZ14ԐSNi:jbYMi' RRޫ]%TQeq@!+"qbDjoĹn|4e¬t$ݽ`cj*&f_].Ot6MZ6trVO(Ĩ?w9A 4w؜jP8rrp \守Uiqlݾ8$ UIP}ݱz;unYxbdWU)c$Xک oyμxC]MA3,$ >|Y'E3D5`3'켴.dτg.)IzpoDxq;e`;A*֔YK! cFHS>J̦;ӝ:ǺlY#G5F)S-ؔձzI@$T8 <#0%6rlu8H_[ddGHQ\/d=i~'o O)^XV0*&S+d>UQ :3tfp9|N!d5P3 43ks9u >'+1I-@GHzg #\CŚ6iqe G螳] &eV9rhUHZ9aR`֤)yښF+OqI!šڨZfDoTn bR/G9H&!I5yI/Q1Ƅ逴)m|DFf O8Z ɰr@6D (Kua(iРȑ#oښzfG!Q6Ԅ 566pt\,jk r 81b¿ di b"HJ"!Қ KV,9rE5!OQev JEZefS_ǿt,)dzg逊 |ZȔZ92Vڠi9rl «e*Nn #]NF_f?*}a;2ʀ@,^؁Cqٌyu~.jˑ#GģSQ cDtƒͬ5.hȧISl:n`l/#C +_ 'G9rAIWr(K2@Vm73 :蜑ax"kfԑ1u9r c"ժ5c`M]u m\ ![e1)I3b?hԱrȑ#Gk 8l3dup@zwBfkY"RNPPm7"(PP%G GUrȑ%XO01$Mu\2jgZ9 W|f*5q:.|G v߂mk9L8ȑ#G%kdJG@TRG⤔ P0%&b=/P~;,ɾT3RbmiaĦC<>KKhtscIu[jqDu<9rȑFX1t58 d$7I#FOOK)4lzkч*j9rx)x9{ {叉 Z1QH$DRXae8 $aBEԺ:r\#Gjz@p8Wd"@j}h%-~xIO31ʘ@\ "H8ĺ(\'G9 8QނA*:ظDpImQ # >G"ƬFȀ MBQf?#L Y>=9rȑc}S0L$`# =O3bՖRdGH-r#[-)1)G9rdF. iCł%^ ]l )%Np۷΁^H)̧Y{زjƐ6VmɓȂp0$#Go0IFAfigRo)i}\ mDx:ȇ'&<x=ॗg^{҅ >GFcx7nL NgUWo7nbpxSO?JÿXY^;vġA8oK|g~}J/wK9;_uAߌgy[@ͭq"\VEO7Ar|̲<}=pǎ~8s4*2j}~n_p!|WW_Ao_vڽ<0? ssسgq`)w2QTpcnnj5<(}H)q}a``R .]¯zrO`$ڵIk>ǁڅ /pa Ͷ-l7>ϜU6QKM`|,BWҝ ĿZ  -o@#`; X/^ꯋ"e'OcΝ`ίY\z{+|"J"G0u+p),--[PT{z!YBJW_õɫ<׋I\x;vWp' "<Øzs^~RJp3oΝCXĽދ|%|r#<芉8Cض};ƙO>[o+.Oة>>>7oRP(`5帻.v]F?;3G&is^:dkQDCHd`#2BfqI6<v0Z@pcHe,/Ru]l۱UyYl7щADܘA,ann'~VWW1qPr33KO?/|qӃk0?7g.J"nBU\5っppߐJ_VQ) 6  <4ҍχ\T_2mz#B~ӟ^y|u#!ign%Z׿zD>۷nsvFGGq-,-. ݴIi twwX, oߑVRWĵD;p \ž={q}j w*9x&(...\I &W # \? - ];:Ia%$L>RM_.ay,WT:3o,}iA]*hGJH!%tנiפ,/.bttG1|u<>S,,G#B9,m[{T !Oaǎqc? ᑍE9+vp]O18|x%謽6[LLa0jeiŏ|*+Ch"ENp Iٗ+/Xvɉ̱EܷH$3`oxF,u4?p7oifo '}Ȧ@w1)%zzzp̧t 6mضmܥ`\J*?ߋ+W%|%tA@P b+{'*5@VCRmj8a ̸bIDp\/^H!8u#??;$4DJg<-U(2೟)s$r="@ʠ$ G(1 cHv5bhc L=7VKŒ @@k*DG\c=)P*PU#&SSX^1ZS IDATZĦ-c(OϠǮ];q5m냏(G9Լ@oQb֭ 1fwR `p7<Txԅ]jpm5\UťرO142RwN>sؼy3el @M1c۶m8{,O]a-C: n_׋羼=$k!wcf8ȆKo*68rij;i"C9}団(Lڬ*(B(m)B ׳jWx YW7AV|c5ۋ,//G▊E|v4j`)Obhx}a{.O2i{Xo '3cr b=.%j8qT^څ__Zų{Z*ߋ_PQy-q'̍M7cjj gf0< oi&u 3eE{z{12Di3<\Eo_?Wquoێ=ZwypBgil [k~nanێSNbllL[jш\;wrܝp .VW|T(T1kOkŦxvH ,u҇ Z]4c?fP @h 3)]M0/TKv1FI`G+e)! sz`)}pс_ Kxk`ژ;_܂33[b&tcy qks 4״=r,4}}?{ppXJKe׿ٟcΝ˗pćy{@D.t{15u R O=Trᝫd23??;@Gdzu]۾qAOw\ETn^t3q4ʿ^MN@")1 tSڌ% .uRYJ Q%6-0bt ?5 LIe*Xj*C.UB~M+`_,Ue,D<6cǎ?l,ܵku8p pP(~;w j7aڝxa,_J<ȣ裓>u ק@D8r6oތ%{m *&v OX9>_*ZR<*3wıc{pQݷ/(_~*N e;g#}$>9*^I޾>X,bmMK kё!a]9Y3sD:BXћ 9k<};#jPfŊcM|!Q7B$i)'$DXSanqY?taie;wVV/^4Q6߃XZYY0VV#e<K/X,\.cpp$U#~Օ Kb O? \rd%IvكÇ&PP@nO? *P%5{EZCPTU(_x7*eOR ؐ ^z TZ"y>=v ǎn9rq#mn-ZyA`*  ϫଯqA` -ԬySMVd92~X}a5LU){H/Q?=0u?Ho Vَ_3*뾼EU[]لbF*w(w#clW+`i3Cu\ͬɊe P~C! 3gӏ8֬eDg|-$4Aj[_.%xHځAK7ݭ K(nKۊ*~78NOZSS@1$x?D ܆<1ML 1H'N⦚E9FD+hN1J;lVGVHz  e:,sZ"uye2zi-טF@5iTveGgs/!8B@ G$(҅(ck3녯5Ze=}\]XBA='m']I $,V~{`kπR<#,cNfhT PI<['2CQwBu NdͶE:E)gVfV~--3wӂME|^f!bjWT|z3}QႤ"6$ tuueVХ&"KBxY*nfcdpgP|t"Ko"&o.&&!gjx6jm;y4:A\.6f,uV]BrGuшWe D1Xِ!48jP3 \dkYemmGGVȂ7 [1h4RI0!Rߕ!p{xʭBE CF[s i.z;Yd{7,ih4W#c Qk"@w;Aj\)+9+k1 jmx* 7gf\`pR x@PPqL8Bk&PĊ6J0 fRоiպ۩w=&L[4;!>͊ڕxD;G񲚭?܎;1VZeϹPD}"iuZnH|/"G121oGcXվ^vW|mBLEtl Q}ȂHѮqiog+ZF#N\],[';@Rۚ/+qơzzڦƉTeemTe)O][!-uD3snkF'fl$|;$8Y]g@@\[#Gnؚ-Y?TgggMF,:aIIp3ʜ dMf*m.Iel4ڕ ZB"3i|>'fi$vI;߉ޢۮ?JVk3ݬåmtɮQp0>kqP٢Y2 L mh-+{zc]ۻDFg&d#)~J!0Σg;ǝ*ic'nzN#1~Y0`Z,'iNDJ/j$V?Vo,uRH()AFu]5/6*j jEϓ]=1yXJ{M Ib(($3Sd7eaEhefJlTޝɵҶNVfDzY] ,m=^Hz^mg&cWsTD*J @{L=T)XSDmHC^6,0!V&2f{!miwAmMY1("ԎFקnNM[E'bmB'M}Hqi5JC/3ӻ Ο?] `}xlQ5bu[iҬOfܜ+ ؼy3lقʎszz׵n'X,bvvDcǎo{=i /&18PqHq:,AuW`郥_JVbaao6nݺx~pp/nݚI}o6ggXO x5=A?Dx-{0zzz:[AdhgCog{V3є:DB(JL ؇p ZB*ZWJI32 lĂB OYtzK}|HR&gHܱu/5Op ǏO>^ZZ›ok׮)/ܖxۛiGzm#p9_n޼ؾ+8|&uϴskԖZ}_}U+xW0==ݰmVzͣ&95+QK݀:'R}Dp b7aHTUH+'Rd(b=+6Hgx333vƅ ޽wD8{Qٳ۶mCX͛7qyˑo&]]] " `Ϟ=f$F=NwyNJ5۶m뺘᭷abb⎴ޘOJ(fOgois[ԥ k ZN~(OXJ4 i+'.fB@J(F(zu2G؈E1Ӆ wqfggyu155euG|}aǎVdRVq Klvލݻw7Z}Z&&jw#DēO>i33.]^{.|8"ϧSjqKZĚMO/޷Vdij(JlQt#$@l740Btg}c F>mT"b85xuMUKV 3M #R3ַ?*/\Hxa~~~ߴiS vA|v]ZZ\?l}W'|rϟ$vߏ1,//ĉqVVV022~xٳ/v<>ϟGTvڅcǎny&>C͡T*cccؿ?9bkx^v W\كߵĄ֭[g⫯Jqc`` ҶF(8~8n޼i9达>ٳ<FFF쵾GC=}E8_(J{{obqۅ rlo>9r.O<Ȣ{\t sviJ%7s.FFFpa9rd 8<>s֭[裏/K077??n7 R~kl'J7 G#@lWgbqw&P"5i`t(%3Pj<010 D E|WyZAPf O~5m"vƍ13~F/_G}/SSS~7x,|ME<[_ww7~_ƍ,..ʕ+M6=3 ifݩ:a<#xG#`˖-ׯGn8pcccvY]]G}Tj5[(J́믿n9N{mزe[XĩSΝ;#en޼;wsV7-wسgl/]'N1l)zu`_Y de$ p<̉NmDA/\TXeP&(uA8`=I;Vv\@.DZ"/FD`ػw +e|g޽~khh~KlYJ{ <Ǚ3g()q<AX믿nwׯ_˗x%{ٱNj/~j58w_|q D%0OY9y3㭷޲"GSoSNX,011ZSNɓ;==zX_w^|߷co[ѣ?2z!8psi;g|o˗/>s|[vVj>11[ZemadIڲ\GØp?@d!hW`19 5QF:ol U ѷtv8+W(D2aBsT B<8rHD6]\\ę3g77x8`3>-{k82::juO?tz&DcGCӎ˗/7=k ݋wSOu4ËmsIۇ caزe lقuyL݋{wOqhV.9ԯ߹s`߾}>uSOY~c}WwqG:}ڤRƐ)/cf U5Q{EүQ2B>ެt4NnEC넓 gJɺ/JR z);v SSStt>3 ѣ%1% XUFUI׎zzz삵3k+6p]r7oÇSw\DdE333r NsssVu#׍5Iϱ޵a|q6*vLT)qԆb!k$fDbw(vdž!В)='VK]ŋ#i~~N˨V MM/_ 訵""abb;`eer9">#V~%|.^_WR990D œ3cjj*ŋx^x;vkW1ٹs'vލ[b~~'mщ4☚]("no&''#}۵k1??o05 %W*0T*tww'GE=NF״|b kL9pC2S5 G-$4 Tb\cb4'q?^ [eQ۰9|}|˗I?~]w؁G }"ryvRd' l8zhD .vڅǏ~a*9qmsWWn݊J=#VNDgs,?ۋ.Kp09ea8p@D WVVRupiT*zǎK[#Q(,a#s̍0X#>8Nā7C4+ZE:p*ױR(k G٭xp 0'2pAvY!Xz]F=q]ܧ~j3oo?#zرcY^pRJ{g|A8HyFdl;;_x1{~:ܽkeU?[ϹnNqL%@((FEDQ Ј$HALLa! y@q~{ٵCUSN=VmfY{UV{jz}ַsi7VNwuWL[,+"7٭-r2x<3@K$:;ژaFY5v-5h0DZqsFگu _gvuj ?X|N =n(?}?8]օre?܅rKKSO,{0#Rc_#nùsVfn;vlʜL&{q/}KtN>g}ַIks7 >h׶?0ԩSPJܹs+Ç7 ּ~{qy|[?ޥc79z_f}S^2\reeʑ#GVRtM]Gg>:u gΜ`Y@+7ܹsx衇Vu#2Ӝ\x8v.4˿_r'\\hoIBi>tLRʌ @ 5 Ƚ0BmRRfML~/s>-f=b}'V!]wݵ<5)]f3<㝱r*7ItދG}rBN^4x߼15xJߛxu;SNu7ĉ4mX,6{]BxΝ??ssso~W*c=ց>ڍ=:tµ5ۿۿuոvsaԶm1ϻnc>~G~ǎDž8TGQBj#W |e{5)}cL jOM^,QBmXdbc3a9: -0nsD~x@:t_`!qgh6r|_r]bx=`zoy[?U7]¿Wt=|0wr4 wd2Y 7܀Z—%i/N/9xDm=NMx;2M)zp@W'N}wq~|e{%fߎwkL)|Dd_NxJ9. 0׽x;V:~O>=+2ȷUd!|/%Kb (ca)eE&SoΉ'77?#p[x'sӍ)^zcG`{{;]L'BzacO_lllM4]i%7fl-X u;f39rGÇӞGt= ?L'wt C,.7|3vgɓkSC]>f3<8Vjy$ 'ynm ygRu\|&א}Zpa0Sf M8M fH33 fIӠ2%PDОWasn "$@ ˍ/F{:FԖW2>}iHk@Zyr?VPR9ccHI0\z?`f6;Hh _(hfz<<ڹlnzmcƋQ$3vNwlJꙕh:{qH E}j$$#R]>?mD%:2ӺՕ.3x4`@ϵl\a~ 1wPΙa2I0䎡j^֖+Xiin֣S_(KznW#B5!8?ءZ ,7 V yZ@F ) $} vO`s )e$IC<M O]KO!:E/4 ]n)~i{}$*#wOnr;AA9̘N5<]ޘrҥs +zqGj-ORt YϾcUrˍ9 K}C^sX[ZlY ̈́u;ҌAym_& הk8c1Bfg IS?7'?Ŏms7sĵݕRDM K޸馛O4 bnD`VlYȹ<ҐЛ$O3$:)CR?|Q P$6L7Rb\=x9r$iz VBaD);ѠQf#մP 5QqV怇D5 bAȺo&+X5{ 9cr={r6[,C(^9pUS[ȁbmPxMi;3ۧ,(gD6diG(Pv`thwwe|DMUw4YlJly%E=[kX 7&Hd>"BJt_ مI<1A1P HAo=j}Hב@%=Z3F{Pb޶3]dl/־H'V;vlv] omI1eD!-s,/ƿOX.Va(p2JL 8PmcE?y}u_;$_[ӳ{r %E2m[03x龤(x~ON:.^RF5XGj4RKC-,>Ki1@織[k`W_IΒNe=L M)O>Yb)0)kLu R[9,Ȝ(lܙ`Bk J5@ka`L1og TT ѣG]zQ6FlGE2JaoXFAp5RF:fx9JeI'ś2,5:ʓ cj _pB_\Zo"~"/>9$/7؛x<HY_]1-ьmq'NyU"/Zlf͐gCr5=|wxx8c1tJoFN>;]J^c{c)~>)XHzڱM:dm@qee0̌E -p':b,sAs[xIzaf ma>tS#6SGggC%m]1 )w*{9P)$z)w xo%`LyJ%19qZ֪FӒiږ ")ٝ.C,.9f2YhbN`FZk3@)l/g@AcN7=8<)_*J^MMxt,YWקܸP)6'w=SIcDErmWfLVpi-1]IIE 6F,3!yb}Ơ آmB/&{vpHPٺ!CR*K#@!Z/1r%K6 u@Z\TNG=Ęx}aLcxpC lOh1'ѩ(z)ԳOcA*2$`X+S2$ѽLOs/`0hsHS8Q#!@ p%/="eD4c>4, bRyrʎMgK%%?'7&CRTy|zʮ۷kd9"t=XRu CG?:\k](4If wYn67 fL^~x؋R2pzW|IګO |)$L*'؄]zy}tde&hN}%!ʶEl){:UqI}vA24fF`&8Tv^Qg<*{FJr$Ce d/ SvK *+WpJ@bKj)HE )({9 @37 8۪ iж-&\5{fZ:>w,Y}<>ҥ=c++G%6.=7+3H %3fRC_#s gp uL$-ӘٮlaY6v sExf3hn?`N b7 5!B;@)ة9: 5}m#7l3)ojI$}5E6QWOWܷ;ǟңrrr EȬC5fv%nvVT.Z;܍S43|#1~Yc/G"O"#fȆQDF@RF-L}JG}B\1~w^<%0z)JL${)\}k~Ofr\g-4 ƞ@:P%KxIݚ1vaP ̞֒o?{Dm׌+:c͍Q]~[RI| E C^|2B}n Xd:K=0ihRN!}2-"uN) Xlxjf`9VMb63&FQ5WN.O_p!eKtHS<@姥X)y gPDsk˗I=I@sLK}fv"2_MB2AFi4hr厦̆س]8UݷOx)5؀wYc^LoXR>rRk<axw/aoI/]R4cT;EQ!cE擻}byVCriıxTf@H:͕w={gy*$pGFTUyzFkch\.?Vح]5;fLm_-slJ)P[GZ]4@fj6& R T)v]ƙspUlmNp|woN(#>f'HeԖ9$ϐ|Ax3|N?;[kILFQSn;mLΐ1_Si1CNf>׻k׮СCOY3q1HHteW^܀' lll,;ghLJX_9/a>ڵk@3pi/=@CQJdP*;cLmSXg [1f`2@acٜ^Vk_1ѕk8vxǎѣGWz$-^a9a}$J 8D_院c¡C@Df")?v}ip]Ǔ\JM3iNg2gind=mY+ A 4T]06aPr 6 HC?̌û;&iQɤkܐH dS^j Hh׮]ÙWDRRkf;zNR1_xKy*R%O7677ׯcb'#VTMΪ 9qt*ps 705Em9 tZkw㰇lޡnjL%P2zL}Z$Գt04z I+Fw"e;;;:L%O3R0H^l$jO trd2Iy|'V݊*ۋDfrܤ0k]Uf jS܌6 vDli;{AInZ d 1Rr}$JJa|1!2'N2 Rrs9k)FÖ2~t`bи kJ \)NmTo!H[H[P@Qcݦ]`v&9t <Z,EF[`鶰Kă~!oJ\<&5ܒTG_K%&(UռM)]J`{oc{% ܷ_k@&ۧPȁBlGQ nub% Rvl<66ypRHTy?L[ X!d=8N&]Ȇ@jX;BFXZI^y' tVc';lp8͟7S~讵ZA2R=X.$'?LύeJHzرcG?__w߽fD?駟feU6sTэC}K,a)ϥ++L}W]L~XNoeN-`FC ]yφYmZc޶Plc1/<k!nӺNc)Q~I9R/D>!SF3g⦛nƒ>;zO>$~~[[[?=ފ{X{JN }򓟄?c?Ǐ(伀;O|{MSO=<">#yk!yV%oK<9̍=O*EwlXILZF:C%&ACdgtqas6ZXs8Cʕ`z%TZJ؆si9y9}{x_oMu{~i\tiE˗/o}+4 nf<v/;׿}k~z++_\-'\˻vvvMT /U\S5fNuJnaڲ>b;L063NIZ/Rf;5{0/b,0ݚɶ[g/Apʏ0S/h,/$jHѱ}݇{Ό|3xի^Go|>%Vaw~ޠ/Wwv|kg0KKǝwމwn]I#5H_JʅrMϕSdnB)m@D8Yh<:чrS|>âmq!]E 7ӨV\JdHCJŕk Vj݇oOOqȑC:]8qWZ\N^.=f13Ξ=~=?׿u<SN/~;6&/4#7p>?3css8~8>wҧ)w@4?|#|9̖2ξι<9+X $aߴ|K^RKjG F _Wx׻ޅ7Ї>|ʸ?LYx[ߊO~F^0ŧO3R 0O,OIj}ן:o NH d" )Eؘng-O1.g8~ׯF2))jjHkwy)sfQN:WFx?W"_;/71V)}ħ?io瞕/_7M.]??Õ+fo۸뮻@_I^8q;Swm5/)E9^ z!yK򗿌__l6W:ˌ_w(7$<7羅#б/\hn6#Ns`,6G 1#~KA*GZVw9˿੧ϭcc=}c'>g?Y|ɓ'qalT!tw;~ mo;nL3ȅqXE{2\;|;0?|ߏ/| _03_Jr&fKUa^WIyW%o4K[SDD& ENܶhF h(hE3\@xއɟ\Kw3D渃ٳg1Nqĉm=Ur>WGn_Jס8 f~~ gΜd2':oxÅ p7?\3)aKkxL YPEg6\ f;"!dLF#P x8=`_kJ sS@`^ _ ugIkmOb%Q-!UD1QՓrKQw-y%\ɠϛ2R}R߄2Vd2޺RS,{J)L]JSIל]JRyC]cuIa`e^H_f!tY D-xf x:RJ)@AlZ0RDw5Zh7qWJd;/#CjTOqOG>)`,YMdIc~7VcJR'Ñ0Xi:W^\8IY6t9Ʌj~m| (Sts55c>fEi &2=.EL h jrf;5ԝHjrcTH!Ԙʩ\ 0-(I/1HfWh.9#玃q²mOuy1w-XB=rS\-KNj{F9Pj-DUD޺Kkf@h[fzuBpg&JnemK+ϞW<7`7CWcHV_IƘZ C[:T[zY.O'gKyZRe] ~3b?Trü>ac9Pɐ<^ = vrAg H6Av7i&>xi -s@56pJA/xkIړNv17࿻n!kL3MNH04o^% ʵ4\Cr@$R:-1Cecݱ5Of9iaPL, 8!>pk+"r16 ) Ca̪{`K)"|6ɍ(J dJ ~ P}x\;rb*B>gcT_B]7?wmj;krr0>9,y&9*ەX,z٥\CWc8C"Rfmۢm:u}vG@LVaZ9t˅=aǸxӒ0 IDATW|bѝa_+'%eP@ >}Vl>l /4[Nj?\J$Kiss˗`6mە\8/JTJVX`漈X1N;)1-v9Zks\|I]ge%˰8cJ7>j'jfp5G YBpV9 <.mb^ ;[+|9Q"z `(Tj'XP"04Z}QEY߅ڠ fllL@lq Ҫ.f/Acx|fsʺʫi%}-oB ]+ӫRec<_F{(t`gP f/Dy (Jzߩ}m`hqxh1kKKgx҃Xhz$K*VOL$h(:VnQR%jTov^{i hwhc ̮ݝ1P04+vvDhnWÚ9Իnɤ)ݗSy;HcH=JI"N1cP!UNΈHr2iw7Wċ ^}/d'-7'{n(~i O:Ny@NQaNNf-f朒Qf럠=12"HK Ԁj p.,T Ք{P@'WʵC JIN)+?7~_$3ޡgP*)צcrϬ_>fFjf@1(@@HSdөSiN6E͚dj*ev- ucICQu1G =$Z\3O/GRD HR\rޚJ$19Q̐/H)y) HObcQ"e:Dv-Kv8'czKs4ycOdzXyr0\na_Z>F]0J D3ȪM ozĞW̐״E HT2C#S ϥ<H<1"׳M񕼕>z$Tnx^;&x) 09mfF3m8ԉMkڬqfnhiVzA5}y%X<)cz9CMI^ PIx$X޾c{)@N$1R2|JetJJE.`Wټ0;C)Sۆ^:d6 DlBk|ws{VmKԧw[_c#Ž`)_Ro3h%臘I'VRy%Mn,$7U甑GRߚP_J\rb%j@ =߶5;Gj h4vb(R2Sl5.FfG3tjV30Aiy)5u)Bs$ _Iv*BP_WIX-$9YTYk_R-vR <$O"OepaEcPc"Xbqx4 5HM wn Nܖ:5ЧKd]< kT{tx(P¼9=rb?>19y1 Wj-R vtldí[4 }AjS&fkj3(Eݗ(̰J̶3TF4#>%F>,i5z;?Ojh~0'E'H~*TCZF |²+=w91٘Ҍݱ `sxf^;^/j3-ΰv6x 2`&0FYa! |9씮!OXPn r%$Jp9I@*o+Þc)f 6\AA t;03C E!+f܎4\Qu 3:×__bR<9@H})9\>!-g3|RK# IWAΆ&)@13X/if@, %B.0Ϡ3q)}hq>a"sLP)TJKR)-vJrJi^R(3nIrB缟XjEbCT|}<T%2qbn}F(oO/g 3Z6[5/d2E[3"jV :n3H9/ܒɖ}%WcSIW.4̢Y<1.)=R^Wb=,[+w(IIҞ6 u)EȎr6X51&5dfiW1f}r,+ܺ Fݗ^xxrX#1Cs#>>ZTmo1@ {s/׿2~ZUT?W |bmsHMjʉ'lhr4t w1)ss$8cIB›ocTw a; (0`e!37LLg=iYm"3Z R^@x7DyELPF/g%reKQ)ɀ>yȗIIxK5(Q*D~XObXSF69&dhcGJװ0JxCM,R9CsY`a-̀&+@JC @ RfS_wpTmT"k.]ۧ~6́`xO'zr}ɵUhDym5w?' A%KΑ)Jڴ\I۔)/ƜN`yN`3o,1A!Ԗ9Df!nm Y 2nz#7"IKz5c TP@H6fSbKy$J: H 7ŀoH,fR!LCM[},-tۚMAqB 676q}o F qۂHXܬvO7p1dtm#RTZ}rys,ɩ1(zy\?%',dSA/2Kxruzz$O1 e9\֋! MnV|G- Lp`]@PȤ.r~T=Kkt^ҼR1jKysҵjGg,̸PʘHJ#/4 uݤ拵CMRwQMј!(i%}riG\K AF;ud%oLRT_ċB;zAL6'> *Hx4 Ll|P@hXulBlqfQyTK{5;:cjs<99|9IQJ^S!ꕓS[NWVdʁD^$ 9к]ˣL&J?[`>/YmM), dz9l֭cٸoA;!\F7䓔1O,195m.XH$J*K~('&`i._р[?َ㸃kw祱O6Fy1Ȯ]CYa2Ӫ1#NɑWCb4!.w.ȫ+R*ɨ,y)99#V'L&)C)~ Jߙ^`^l )Ȟ(`hMӌ1 o DbN''u/fboʋa)}RRu#|>}N8r9ӧO#ǥKW ǏV 8˯O \J~̚NNF R%L!o(bK@;P_;ǗҭoÇկ~GFRuLш9?YYɤ̔j(hX ޥQTk='"ٓ=` zX&7 3.m[\xykpر(_I)ImJ{{{xK^#GrE/}l)W1>T~Jʑ__FL鵔'E=_9{R9aR( erRތ+?煕`acySmkPN_Qtqqx'pdy9}r:BF4l}mm4H.^4 f7[̀VȝJ|fmݶrʗ3a/˿++ZSGNT}B}s +]Kyrr%m,_ J:|һ"IIݒ>Dْ#-/W Z~jmg7~;Mn04-i6bfZq{f7֣5-D<4z6ԩSŗ)/J#c|a5:H iN)o>Iڧq})'4"v\Y9o4VRRz) _;ȕK+_s)?~e6lL籉?'[Ym`NZF 5}8<ꪱܹm.FD&3cD̐gh,CDX,ʪ,Ԝ,i]\bsdd}JN*5S!’]~;md:XnY@gvֈ],: /BȤ[3mmZڳ p ٥p{P۶s1Ǔ#)PJ'LWT)`*i>R-mI[F$9B!o K>F1:ԭ$PTbV [LtbVnse޹un6FL`Ev24֌q6R(;0Ed2\ ֯\z͕9f9ڶ] H K/d w $j&U7Rޔ9bnhT@TC)%1f~)Oxb}DvSb2ߓɤ۱`:F߫iNr9^Q㱶Yk7.W2g"~;`(48h"q ;{njt꜁Hy8 /_-܊We8z(=w8kyWI+Q!J~>1>`9k9*$oԽt`=byB ޿5CVKliܗR]i0.] /O=$vwwHvGU!4\ئ3P RfP!;dn[h&ݝZk#G $m=0?8rX\ߟ='zG? R]lwƥb=g~ IDAT;;;Z" X6DCh6B3ihatƋ!,Gc!@f;\' ID1f\NXŋxKk_zq> .+%0 h:~)_q}e-Ƿ\ku R*|Sj<\5[~Hb]>z{Ԃv&%Y۵멮W{9ZsЂz!x3Z'w;Hr)e5Ezw;|G\{0ϒ},7Ԛ<=NG-r 1l]z/ G\IDߋN&0k.rb\~0;yI(`f)h6 [>@ݒ@IO33._Wux[fs\z_A'n;ђګ̺7wV(t Qh8c?L XX6X-=DzX?a(`a5l@<>իv,{aE|k A֌wrp9 >+ t4g4p@gg>A?u`?]I;{>@DfQ%A6>{>{=qǏⵯ ۇ׽[[[׾GVnl13Xa; Zk4> j@Nmo vO,Giܱv!7-+ׇ!Wƛnw9'o=V0cfJnSVA-ι}x} C]܇n:WXNݜ.k_vd6Xxo@f ʬ]:! >h7PzkӶeeAwOwsm/k;ϋWyUW^{Q6B,>.J2*Lir:˺Oa>@lvZՇV-n>iSt Z9o0s^xNߊ 9{/>I' 30@/C(Rɜf{,kifm`חR.b+W%t=U][0V{Nz솷q=ӵ}jАmpҠ=c߿ 1)\G}KpFz=}]d8!,ͫkrzf!VW沖_{h1 !a:i0,0އ3E=:,BG Ih&hWSkv"αwMztshYwa~P5J#{ɫ-X-`cso}?>cc:;)ܵa$@Rr]P"Ho5LX3tjYF] p8վ@YLjCK3=u }ʅqNjNР_wLO`礹_򭧙;'Cxlz)]I6}wnɫ&ŮXmk(+ncY}^+}<=W+4ڎ>7'j6!lߟ5مsj{~ȴ4^5>kINg#wd=t^Z&k!YZzLY#|𵳵\!ky;ox5͸| 1eMYc,i%鎗Ykwr Ls$6&l^P6=4ێ3#|=ǣy%ȜHlp>x=CK\ )N$ޜ;NC'8+V_^AN~{ދaݮB[-못gbMcW2ՌyLuNnKkQD=1FaZ97B?\Z }N^)kb>Q|rX%7޳"ןH"S( ]t&qi<}C}kk"+l "n?`RR H;Sc8! /Hߝ:Ca豓?~mFGeғa.:ހg5JaytsP$ͲC߫x[Keş2T;;ÑYַ &4[Ȍ+_QޙbTO̥ X}u[T(еػ :1ǟ8w܄codc= a=f` vovb>.?qBmΐ`mU;cMh2lr"ʛs?ԩBN`f;zѺV#b}6`]Gw&a-y!oɞn]"R)l#rGSā>EvW~R QpD*k3lob{kc-Z 56 qO+<"_j=îDQ̕w{j:7m{1dyc7/߼|g]3c:l6.K'bK:\3tvw[,۵fBAA~e%A#y<@ py2;R7jfXWAԄpڶ8畽L@NBΠ -Ю!岯 cLmu!R8 '5(H(+wk&>Ԡtx0[;.o̭[i7mֳt2I ͭ=dkɵa}wP~6apMJƶ3Z];nbvہ2o]@̊XNܤ~̌v׋b׾~{&}'s~`anG-'ǘa:JMfЎA@ШLAKM_T(1둴mB]M ^XpVYr5Z4ިޮ,3Yp(򷓷\R~(Ihڧ]e,J),V^X';]،gd,Z3}o3}>mN&u#=ES/ŊSeA{8Kr[}̆ gaw@aI\ ~DPI" E^z? h$$aM9;z}=9bSO,kC 랰׋U7"Y~C i0ЈJτ?ywf7FZ)Ĵ,Wnt}ӘC-A_h"F:Z勒b{n!SS=T齗 q(`qBrJ8P$Qk9AdJyrb"\0a\_XyFo"(131U]st],\ t 7_B҉)ڏqit)cEW{XuW3vs,zQ`X=pO{oBH{GXǪy,` .`^D-Pm7ۈ/!atCZ`0MS]irmQLl=yML8`>SLTjd &U'J&T4!{"q8RJ#C,E`0[kY1l@9 6 z+ԁhf!v@(5/A6t rA==k@(?$h_LuLo7nݗ@8n'J~mݗ6e DLn'~9bSg!ժpGwnt:_=YTuې`BkFuM0Oݍm,r!ϓvּܱft+f(yyI`M09E\B:w -x4 'R`Fqf8?$#PP]U`)rw^ bg`` ݯLf(M0f=ŷ6IqBAD2ĒJβ`^P9] ^>bНG0m\EWWX..N  "'fpi'DۯG sLzyWtHL] zk~pw!^@]lGO"9"L#D8; Ur`^ջz7v+E;GNŶJǞƉ"hz܎?yGw4C]Gǜf%S76h}4].<G3n^Tn( ծL9XR(@bR H`;*$xTPlc%!ϑP,[{6hƣ=Y53|eJ4z6#a$¼uπjۓaba @\mzZ* aqg-t^I%CnVAɉ#˗9ɔD vՋuPvInyAEۡA ~F ŗeF~P.?i0FpID~:攀`6 H}_rxgg'O>M`W$# BIҔA] i$U!V(^A/onS TJhՎ}@lX,rح 1gn;Fuu`w(кk֮\];6:OG=cU#\];7c٢WтT*ሹŘPm;h޹ :4}"[4 :vaWѼc`7~|ivGs5lѫhޱQk&Xmhۉw )qQW?^S@er,ٲqfM-&sF,]IMq1غFA{,yﱋJ}ɦXUڹE{:?iƲEѼs9Go Bk8ĦifB;cW*i7A.4U HÎ<cA B#Xlz~~HlZul@Kv77*›!AO6B Jb`mBT-͛Ѷupq<,]7K|I2uv ׿ε: b…n<Mt7c]c=aoas?z޺(!m;nًxTCe;ֿ"q۰%\|;h Gioh6ǹ-7c5'cd-EOj>,Z7V{hPu_[_eLZڱlw^_3W{Bv]8SQoڝo>쟍+^b;SoBZwmˋwOx[qիz ~ CsUK|ת09{:7f\[Hh9 {:-J?nm>2,< A>T7%BJhW(!7k:XJ ѨD!ȌBdjGU@Ja-Cb-ϐ|lش,t R5.ҩҩhZ>ؗ1 q~»9޿O? '.gs<E+͘qc3xC6N8]t{{8.4|?H.R)&RE*nmԆLà#88c'?aێft s;UY| =k;c|ϳy#rq9eq m/.:9s&tix;nAGˎ58kdⵡݶݝ-7#Ncxgx{0~x|_ǃϮUB0iwٌg}L6 sx>CJfcM+g3\19 D9IU 1I3&%N*x !Ul@PfWO,D3].a(G~k=S< uT:3 MBR)CI!:p5)qymv1ܨ('78 #8Xd=%chrʙ=k&O Bx5ZX S'?9}O,)B9,X :83N#7(| Y,Z@s*8t?=%KԘ6xцySi|fˀpQ odTSJerA0|8MH^Ќ&ե7>¤> Jve=jx<Ĩ8Wmhf>` i N/& b^BvKxz-]:Rt:B-yaŢgpuRL&-]z^g|۸P p裏Fgg5P~_o }} @}hԍ 2Ye=PGe ^]([xYGDʭ; ^Oo^_7 =/./T?Ν]-mx{FS(~cXq3߼K8#@Wn<렎2k`>~My3qŕǬC?1Vg#Q36%QwSW^{\Fǥ? @p8gฎ_^s@.8'xb\6|Yp. #B @yRN٠m/2rY! E$"~qBBxDn : pBt86Z$ 1Uo'(=dJj IQx.fK\3F/C9 o"œ ]3jLc(X;6n3g<+hN2i2oӚ5'4:{{Mnܸg7>eP5 Xxr47 V1|cǂ_^&ݷ W^P꣘z 1iFNBjGoaDcX]xM7W{ PLhǡ~(~>7uۂ1uC*|й;!I=JY)RlQVG~0 9}^f0Ia@%?*}p BiIx s.sgB7kwS}o$LnoLr%WGsc݌t'^z)z?{sßCu<ϡp] )pq3ŧN:pmބ?z+E䵳ٞǑ Yl3x g!Bx,<Θfumw pM8 W;|nE1i mz35ᤏ1p [1n쫚t 8ҵi,z{ ֬ۂt?ua8;Dֳ= \“yW k\;۫os֌sy>,=.L/yn ;np_}gYK֡~6(^ҍˋ[V!TLVRH]tJHD٥!IJQ AUfj9GIuH1j Tmvdw/(EX uhݲByzV߸GqiBK=}>pf#Lo-;!#`ƥXBqy[6W/<GuLjDGOm7_Θ{ Gq((%1c? gnN{[]x{=y_-KK{2lm L]H@6Y={; +Ձ}8R5cA xCx(C?A!]RHȣg%VDD 8HQGVYIHQ5(LGӎj48s,60?TRd{?3xG1~xl޲g;Fwy@nYm@sڲ -;3྇ kW>0 -fȦLr,0mزMwٍ]-PkVކ5vQm]Ҏ۴ [w60V{z1moΖ`!lKzfP-dd@٬'= x%=s0;M_YhmmFέl2Xm34ypαjɋXXd2fNO8'xo~ӍlKa #=1h-~ߐڍ-A!hiDKk&6as 6m4x]Nkv4waW{:y ;)oWkw޹ɏ֭¦ k ͘$ߕ$X|ox+=WLhs/ 퐮sfRԘY~x% [yƨDy "P2 6%+s QM޹rGWG78Giۍ _/jkkۋo}܌}H\ a֝˰|Nq(?f:0R)oz HMǺupЁp?JθBeAgW;OvwK x_xwa6] 0 g|Simڼ ?I3A)/~<ͅ˰~+p;>S?0~%o.huH ?'M-X=}_/qؼm'= |n+wu7k!mXFa݆M yqge{~@ xgq*Cysg{&?{>3.3Ow J[~ARg)Em<(ћN#Q'w7_*^<`d$%C!tf! 3e85ipA 3H)jRϗr00GRm@i+K@@ ]2<79dN%v&33=PΗ=c~L`~m^o!mW^-̞=,wG_='tV._t:S{qt>~xnx5\[6ū NᨩÏ=9f]̞or f͚qd>g|3 V+av?snf\ve={6ƌB~}xrwy#o퇓N: ,]t:mNՏo{t>>x =*͇1y+nK^g3('q5-hx{W63s Z(LgfDS!X)rC0h*J瞪T=",) IGMPy}#'X֌-p]鍔m0u<⦟]~yy$ 7; OìY~=}ңquS>K׌5cA@ + ?"{0g"U7zyEB}|S[ǣOV}xSh_ ܇Go󓨯K.,'P?\xz>~q<cXnk^zI1C&a*^41 MkB{n۰]vW /w~{rt ?h"xqm+%$)vz455!Nt^!jTWv@#dY|?@_e@*F__/ǿ`5pR.3` 3b-p]id9:mmwy?@VK,)HRqf 9J`bÄ 1.bt9A;$`$ AwCdpII кTJʧyKM@脙B)T\A$ KJZv5b!>7VZ(ۣpi0(TKz$t{G)#IuS*; %'!ΔZ0=I;J+ U0nBT/.sPkI"C@@9 P =8'F N|VJw* tv# :#}w]-0w Ipy*THjS!5Tr)Q.0) 23 cy%x!ODiq~@V܉>v=m :un{u܆zWf%!Oрu@TRi\ѣr%*DCT tJ%n<U_uJ>J56L1Hrr]P=_m$]vW z0|m"VZ&`\J> & ҠT.P%\˂q&E1bg}AG7Ujٓ=QHHZBa8{w: 5 [-Ԁ{Xme Bm',¦M: ҁJS !gd˹@@&L*Oh61d(K*]G( "4=YFnqkRuB5E,YvVk'k\kA%Q,TFq}.ǤYsv/8NCtL-rT{|1J4IJ*RR3}:H(Rɦv: &Štn7PNc< xY1Z}G5\Ȼկ6:CRt=s %nlU"0*%>Un0%ԕG^sZF3AJK霌WgHu]0]0u"[9@X2=49ɋlPJ=A]wZHUK $lO 7 G#HsGK?4fчtJ*\\u &H@fD9}‹@\,e^LwcA 遗(p%3`^T^ǟ!\:PCp*'4kWH;vbm 2TPtԑ€/<ߗr $i> @KmT`e"Fsj0uB`y ]w>,O]Ѳ> bhr8&opzѲMq8,f}N28ͫټ4MΖVКq2pZQ--pjtZN3Cpټ VbSѼ HsI66^55i٦ .wyb' L\jY˘m&?Щq %r3]{5n'a^&Ҳ wᨃ`XnVZ۷}v˃ؘ7.3hmmEKK -]{ ܊/|8Y֭Ek[+Ӽӵ-ֆy vmٟ`ϷamIӹ_8XNﮅC Hg:6D%-d&'?D*D2JLSQ )P8W!*P|CU[4:N6I{JᮥPaCqnV - 55W׸ߐ_+)S{W_!xoGӝeϼ<&I#ǟ;>˗f̜݉vsľ98Ӧ 97\%?Ō1;0ЧpnØ5k&~|ݟf6lҌnt ) o\7}Z:|&}үv!+q1,Z}͚]0cyscCj)R`lE*u݊^+RP=F;IBH2rSF3%}[EIB⢺:JUm@s"H9VSyONjy᪥C)9F&cʕݔe_`[V}V!y9Ė`ۊGq'o0kYmYuv3H3xxCm 93Ζa<o$8i[!8.6RsԜLۆM$j1<р} Ҕ#*G2&o"HF֓\Kƹ@2dS8z>mt&=٫eqBR/B5o(mqg->us%?Ţk!{rzn:wwiRΜllCGnIBkҀ8S8`CAmZ:݇,iRcN'% `8#uMs8JIdCN d2*rG`FJfp!|ŜB0/g>/+C_~B`q:cuxk 36lgYJу3g l/&O݋LgbhMK&ҙE^d2118NS぀#cH:mt㈃y :]$!IҤ*E! C\A@l FI=O 8!((\ב[ δ6Vi{UI 8^v,a̘1عc|Gm.=T6o2t-ctMMM޵>t|ӄ E0vlƏDv`7l/f̙3o,\"|бm0?]Y` ViB30Y k cBw  Î9Cz{U3㉖tzN- =RDTfE0H)I DuQ%&@ )[qOx8Z'p60^m1m:i.;#EJξ`mwYlz~Բ5Wc˶]xM6GIﯗX\w Z^ǥ3gwًp#5^ۛ`<"r\oz& ߻38zh39]{M"t&g]~)yuEtlzݽ~Iv$e**Hʌu U%tRBlz\ J2-kJ)Spus;VȕIwXt `H߹!S;i̜u!xw/ŋuV׏ ї@wO.8cUزe38|{7W翺\]jn?wVonߋ.u7݃k{y9\#+pMpY p^e]kY? }/C5IY19WӀJFB9e]t:ƒ MDn" Υ4Q "l`9' I༛!_[ۺpC7;۱sW{蹗/^z=ǡXa;::Þe+l^gذiGO㞿C74;OIgbݦק1p循'q^_{U ϱ) EB\& RPR`  8`dHa<\zGphiFJwv:87ऑHWKpB<͹^o{`I| n)x -H ޾sʼ8"Bg/<(TΈx9ծՔRsp0KM"6)d:u>($z 6w } VS jyԡFQ82=lATIhL&3pi&5h#kub:dݹpB5I5{}T#3h?J`$A}%3Z*LfY˂%>&xu u \`NQI:^ Ip1>{nePVIJlؒHIBjubHJZk8Pc82[82 h#WsS0rB{PG%jS5ԡ\uKW#i+T*[pt 4>8)ԅC݄xrVR \J7MgiP^Q*iݬu"x{qߋmI0I$ P0 TTj ?2 @23c`2d2@Pv@ǍS}QS6mó~w`;uT0TOH/A!lƊ!:xBxQ n  qbrQ.B]Op.`#u>or"R@'nR@`/m:28Kܢ)aՑ Hq&T@#AdDPX"depV!3MT-!pyH ,%H}E^v)u-E,q*{*mU3Eϲ,ZJ%We6ūP PjAhlS t.DGgG@X0%4x$` +r UD쇪T0 bD_)TB$f*…@wo?)BOnE!\Gc &7MA:㺖a1܃/ ǟ,N"Txڛ-J;0DSA P$Dq\0߇{ݣW}#Gl?&MLN*n j>:@ Wnr̷C{2Er\MTx+X1Jy/8crm8.fk72%mEh&(\C P#&){Ա Yu/? psץpl?RUj$8)0OnzshP7g1{u"|;E:[e ^*ғG{FXגc: L7+!t+̠Qr'(5qmcҎ(hÛf^JnD!OM>!WR  ٬䄶((h6UnB(Ya 1 6^7OTRdA,O=Z6!) 1)K2~V K՝FDbLŠ;-L/A$}rzTIeI;\9;j)AXx_ZE U< ɻf  cw[Ъ1J;l<T:I -NOhU^0 X@0R_dR*J/ؒJ -׎䔫n+Ql8\R18LQH&"@Sqv䓁LؿcA%ն]ՋD Yhh=Q:l81xbLEaf%Gr~ bc f[ê+%JdUA C0Mm#Ba<*U[J\DI6՗z%B* J9Tfy*+JIF6W0ͤ[*B%ף2&!5qmBĬiE,cb,\J(uykJ)|? ߯ BA|T0Py\mLg) E㔜dGѱ79^1ЂxDmy`{%)LmfK1Sr\tوljI3T&әe" YeD\# 4ױn&Fߵ w K.0\Xb }nLW>xqfḏ|"wW|G`zc}9ƌ.&OfWt(ⓑt癟ږSMWz#xVY䧴csLuL`G]U[:~*-}l!TBgpPJr(2`0x2M( g,^0s0a*]cU%3 '.%`̇deR[3dYJ/DBpr]7.nMBC)TJh*[1x>G9tJFg`z^!u\(Q!;1ytwl[|f ۽{7~y3g^d\U8?Rp z(<=c]ؤhW}HrX~cz>c&/,"JZ_ܗ/h[YYDrp;Eu#1všPl||߇x!JIruQ(n^=BscӖmhm|Jy(iB\ i:Q\3AJ\84 Z 9^6Bta/p0Q+q2%sL׀9t*p%rW"e= d=S)렯YȤ"4#OXnsH#NY~$P)WQ%)/!)ו/ c9O Hǒt*%0c#7f>t |_-5k]Yn m0?h^.I7rQ___~.ˡ4w.׌0 mKYԘԤSb'A2cH]Sr)N06xѥ_Ͽ+_pn1bA.)8_8}0@fLx8eJ@-%Nu *ET֣͜1 kEC`M:>#xu-Ўd'qzJM*@nՙR rM/n9ZH yPN: yV,Y#JϽk7lS㔏Ipe/sۚ/\V-Eyp]=}W$өsK?E 9BIMSQFRCá`U锲. !˅/+\Z_ HR0/~I l'S5^nt9R>}_4KPd.)TXWsHȈL4tAM#W-P MA~T"[ ,ŧ5/НM ^G` ucCJ Y;BaT% !m+K H9$jr8 pP[Scp$GYA̽yeu-߾`AEER e9tˌ"RHTJ*H)U%eJUJEMX()qdRrL[) } `̷{sNK{]i㮥yڹobii ? <+qr%| ? /~2r99ԗƵ~ |yffӷ\ߝ| I#qBh)-5pJ0~AV4+[י;/uə \鎐E~ !ZAzzl?;9ThC`F`@S8b %up.ҲS m jC*pޯ>Ν3ϿI{x_{գ7O,,,WtBG049~m(j giSp e1-, }uGQEF}sq&oPnpiU.A ͞]IJ If'ԔCJ@j Kwr&!5V+C#/ߔԢߥN n%s@M1xsʟ<LWg]+!@%G{{y}ßCCJb~kV GXf VSs sp8{,v[un;0h5o!NH[PA'+A] Fsѣ@n(M宥w])6aŸGgʾ&ڠ_Ew1<2zEH589hVLcoʢJ96=͑v#@1 R OAUUNdwzfLfl`wTP!/rzjwx^PԻju8ut>J7nÏ?YAA:g{v4qZ `ǿ> c/5yxe< 6`}m%zofG]!Ja7O#kkMʵkױ9x^w:e/ՋWηk[;x?Nc݄KyC@2ԙbTLy={2Hbk++|fųxu!beeb(6є'\v ~lC( "q/Km&W:BZOBkX!Zce 5`q`6407ay8Hnr-7TK`R1NN qdg?a,*6D~̚?=f; W]Egov)ٟ%k1"сa`4gn =xH/;2)gϝ|[/>N^y wn]~e3.~W?_>'9 s瞜 v3SG?OeÛ{经t?YIȾ'$i V)/"pw$;ERMClWJFHJnO -i9g8{Q ultbQ@-T/ ;дE{HHET2Ca!p]Fˏ#жi1Z96XU|B_v&X3FtKldk=Z*I]%ôT9Io$me9cJ-ÂB<|U -X7-ꧤG,.._zϟ^fһbwp٥)xMVuVtMsNYD郈)e->Rv۽L3j%b:૸q{=}WO {?2c W ⍍/<R'mOa#v#?S6~3xB2:p984Mݝ]L& w'ݺd+x(*V33(_4z|o†+h2y#i9e)8[srڤbƬՃj_n 5DQƵ |w~?0vwS,sgΜG?Q9slM"c/)tq>ǎA5`sk7n$_ :'.]WWW17%ؙ[5뷽=\r`Z[X/Lp H9A^OK!%g-FSe8˗/ck`W]c|'?ImX}1~>|_JkװdǏH<;ZTv"J !_[[Bf)Z! j666c<aum=6N1cq>i\zs1*,-`nn^*Ox 棇z.w2+KQ_cp~>|- Qߞ֡[?/ <Έ{3'-<WE 9\; !)qSawY`4M7!iGsq_:~~3 ]";w+|9̠$rbh#DL&{LdmDf1am\ߞ=`&}J ilos>cGaqq!UPaxt[_6ۯ?2.~ z(Dscswڣ'ǣy1cma}m /%/g++Y{6Y'sssI5E!Oۃ(nU6&:۶gKךeB<-Iv7y/t`ɍiͭMԿ"o`g{5-U60V񽱱+WLܳDX>5Me,5Q+*>[Y̰joFjBqp:p(A0]u%/Oagg0 pӸz*~>C?Dе(D~%8ƣ,`3D 9nF|d tGtN= ._<='drpLX|u͍QTO fN md樓+<~8~lN+\|*.]r_;W_KTv?66q7"Ge$*9{PWtԙ1Yo̦7\KDcmaww.,dpg_4{\v-o4Ԝtw/d/\J~61$%8w>^tdZ WSZ%9@aV+"xvvvioJVT/ʜ9Yt':H,c7+$RZ9q§>Z;~8~gΜa+~/9?O-e 1˃J|͎ $#i&x[.- Q/9s{cZ{f{LJԖ+^r7wwdC lmmҥKЈ7n`MyAi7'O$NfΞ=5Gbee?q#haATq}9`;׮_Ș}b)±]q31h3n`b{#ok 666",_U8~A}ODx+Qlmnb~nug/Xu_d#?ÑO;wۿ'x/oTueRfQ} n׸ ^\$ ]ٯˡ0 % c`.(q4:+)X!;$Ixǎ8q;"c?Sxgq%>`2p8]{0=:xz*>x"N:8{BK3/jQRO A*+С;Y%moo] NY@d^f c;\I_}w}7N9{d}{ `0L(ήǣ͡mG24Dd||Fm}=aQ7z#0T m_&A}5ͥ~v@ M9r-I8(E LKM}p8bˁgyyER[_N{;o 1~3zlj~l7myo 8Xx|~ %3g)o%#ٵuH¬pzN x;2^'CpU=6Q'OS|%aN u5jT'<`pVx~ehYƣ&:t-l[5#RN_.֯RLή 98iI#>iFCljRz\}AWCނs?C|1C$$wF9)+% O: I^A(os7Dl !wDLonUcT .r{{MꫯkludbՕ|[|ێL[UmnшO*H$@p3չ\[SX:*)uk4{-hyZcAq 76֏h]aU :;NյUlnnƳcU#@%j~1;瑄Cv+Dc_lrdi޴kV^c*ƬҪp*uPnZ66Y\od19bܳ0.ܬK٪Bhq<m[9!`skm; pb,IPsCɀ lQs"υDN<5 .~\agQb%)e'N]e;X K̳VHmҷ.g,sϿ5:)`0sF4Mr"ӤM\i+Ї7ZZZѣGɤ`w=$CܾO}JZKx݆ yyʑ6:4Gsn98HЙ?9G9B+Y.`β{ɓTgmw " xO^Z<4~ u]pNgnnt$ ֥3D7q+/uOH t%L[,-.&JC3JGSTlh0b.YtdtkjZqAO'A}ʏRWu66C,*zG_ցN>WWi׻|ͨr1]]pY-Lp8<4 $uf<"0ר:ɓ;Iwv:L2"ETo@r൫ l80'x9juѶM:^-C_PiXfNh~%reOBf0k "x8F41U#28s>)CP`e5) ?<3둩i~uBRufFbد=f -W( ԃ|(kdco&36Lz^9z>0<{׮^5FvzX橛Լ9/Mۢi[Lf):t9@K> Fi*v/ BWoCj* LTT,'/Ή?v qzOOѶ-^u|N6VVV$wygFv U4n8f2 ̚1Fb?e7,4ŋ믿>]ÁdZi"::\}voر#g2WY>PraZ*eak#D4hm>Hok#ݗm⦤:pޮ:Ņ(uwg_~{Iaǣ1'5|=HU}#A3$}!Yc8`>~NuoqO^Z6avx(LhK=3#o/]=$drvd`LR ~wg6Gu &gU3Xd/!&ˁFltk;B.I"mtS?qƙZ9q֕.jcqpls);$1q"{iMǠ'כ_//ᮻe2G>y> `C~O[7Zd 7X9l'mF@y728gLitәσy RR*;zJ1?sU: 'k+_ie'킈o |t(?~Lo1??ǏF\Nt웩㧯^ӟy`#Gr@ϔ1#G%]ьtpƫ/} zΫk2N#K%Om=Ly!û/D+ D+G;8( b)36[/Nb<G%9NF3HrpQmV;r{ggk'>m꫸ppI;v x{ރx53 3p'8}xoÏb2`s~ZL(@.mh&'`YZZ0O*Qf7pV~ݸ~#fT XY^,05bWj/e2s&j76ж-s?_cww' dwp˸mmwK rS4*gJd9BKXYY!_g536+i,.q Ȣ~`{4LO7^u&Ur X[[~sSo5Wzj2u 6nlFs_͹lk׮gJ 奞s֫},SpqcMs/_d=;߫W7ի0sCUWu^)~Jc~XỳǤ\GB9\mТ !ywr;1C}Q´hji-B]"BHED1NIbҴ8s8v6|wqmοhC[A&޸sީ:L2kƕ+%?zt} 7 >olhǏrAt3zKeG |@Ϟ{"Np查9;u-xQ%kv^gZcqm<y/4uH=%`4'}ű/XD={'d=nb1oT[Q!AQ[Ϻ<ɬS<`wwxoW 0q%cOQȅ(tGyfJXoM p/L!96klUfMK2'9 k6[^d!VFTl@"Ț #<ܓx߇?yKBbD!,-1(@ ʾOޫj9b .)꺰fݭ,Z( 3{Zrw׏Q_#gLv;yji02<&ȃ NةpZFϔQ:sTx5ݸS_<x'1 w} QSƐ:-ZX6ȍɜeW4@ˡl m !sPpuAnrRp8hpnFò(R &g fFnwjJy|O>-ÉCᡇKo 9m]љv],A=9Q[wq*%ôdL9*ݾ;4Nk)Hfn3Qik]g]JRL5S:J 1" 6o#wݏ}ݒ%G/=y¬#6%&[5p7y.ypB_UpM+K 7Z8C'J8BU{4@$m7مU]IbO(\wHdoqS(iynwX Ǘy<͇7>>|3 <7۔ B}W܉"ρM :^R`K˝?h`B͏:9ьM``1s]3*0#ʲo$SA%){'na=西_^~rq?7py*GEvnΠY4vʿϒd$^-">Z6vﳣpx`ooHbt?hbrlsݨ/ibfA = VFeTyP5AhZ ?ǎÉ^0  4=zO-etPR^Bh~ΆUvExzj-!L?Ise֦[H4>*F[M'U5@&UiYQ8p }7p\~2^:<I#-a89t4O ' G,(W7˯5*h"%8U j'6wHC<|~tLOPq ڶ[Vvx47y=͇EI- qaQuUcPhh~6ؠԙzB;o?W<.Jf^<*5 ^w݉Z+TuiYMyfg,K۶A n &=<ԳpfÉfwn)@Fa2O>W/BLBwo'~ײǟzΥWkmq;2 @"Hcd'~oGym6x=oI5?YJ(;x3l/=IMg>Mų/yWSc<c8k dgO|pV#>eE;ȒZ8bɇV9THъz.M \mm1 HrH @d(ByD״{ݸmwb<g  3LH&NX j i=\p/xH}@'_xnssy1=yn6mri*T-SK/c8xn>e~ {{?n?sNr $e?Uτ S^} _z'Эjwvv[O`qI`T9~Op%k# &{ gCQu6"sggΞœ<"48pѹF꽶mцtdz`(rB q2xHz ҁjkU)!U5G!&{#|OSFѷJ0?eszٽ Cldz91~׿> ȁD2VV077z yH#= O<4zSz3NR>GƻpE$??Mm*;ш7.g i Ho'UE;%Eح ʙk*1׻ўgou%1{G(՗hN+^'.rb(IaAK3t)q71RWa@ ,&XTpU;I T*ҵE[G|B|13`e9uLDIŹ@KFgR(L,qy^^o2(N}o - n܁L}f $')Hfjo,$֕$݈|oIG@Lt><@Eds3se}eK 7Oew̏LxL{7H\;'{/wuh-ۧ;K\Hۇ{LrWZ \H\%>,Us׭/]N<2M PGS})Ù2YEN i 's3t9) <<;%ށ][w F`|8o6ۆI͛]α9Qr(Ḍu GC ,+sqU{ ,<ɕ8窨J"u; b`!u71pV(:`0H\;:@\d: IVaD\Zm6<L $*lxr AG}WТS_}fzVbGqPc~G1 kPf qFr=p{A87 /R,cRd6寝q/YEʜ2 P=0 S!\E )(;O3%3wtv i$U8l\.W&YHĩ47ݤoژ~G: Iy=Vi֦ާXGVp.Wm$Lu 6b69JI"m'9pj>-6j/ҜCi#y^Q&%2}5dӁ]䂪Lc/_w?L% + N $Tjh=CCB'k'6kje@K @w9i袓'j'ʈG&GI*`ڿpmk2EEڞxH ~'Id`%VOq[L͕~3zAbj 2km抦o5 QcVXI&ɗf_#=an0@[aL~6se֥3=C`tQ_T(.)@"tJz^'[@*C@ 8_j4h䆃5"R IDAT2hbjh ǻkŬ Jѝac-J0- UtqG Ք82ڸgI3O!㡺 -)\{d*V8+`]‹(S( \ltG4Dw1.e(_8$eBZ@$@gF28V.M ˖-kR뛩>q >@R31Lmsʼ yFǡ($Lt W=37 Q3:L3fC!,*tGT+^6/\~2CYiE>{ޖr@WE%s<9Ig;'!8"av_ ɔxK7-KN*`t@>$uY \T.Yj.Cpg֬1(] j/)6DDG롄x٣F4FݙmuCoܞGVdYM7"Wm7:~ I& $n uOH%!36pdzFrFh(Tҙᒏg1؟^=5q%\.{> nsʗHӎ!3Tl ?RçL}{S% WO$"pZQFu[7CO93hBèX@U1u!MA/E8>)Z 2e48)f!J0Gy]> N-5)$N{!g#آr.@&|" Kq׆ )*L']z˧NDg9Ɍ`JF4}ZGB ^QaM[JahŇS%N/ ͪ9C3)DƏǒr$Lcrq|OþU乸fD 匬\ sezM9: `iEXD9 C\$J"kw|P&6TrAnH5UKlX\./-nɴEb\" Ժ /6V,Q g+Q'. "ۂK[hʘACL< lg"; L!Ń IGۊF%|2g0^w ז˝%_Eۊ2($C4+]}%*KFO}r3 &%WSΩ_']UJ?i RHQfh]]!TSvmL*IOp(K_}F o~\l1Vr\|nmjs@3lޙLj<C35ӈ74Q7d|Ď߂(,N2q 6cFf)%wf&Cf}F1vM Q*GIb)y#I=629KW^B\G餐ƞm{Ad+§RM1B'2c cTL٘1h}ƞSz̻PI`e֮.qhvV d+ڹB>9]3xڣ]#u s:)ű̸y߷:5/$+" 9C TxE\nloc풹 nXNkވ2\OLRQSLY%;Ot gDb42BqI{gT QNtDƥh0lJN[:Pr- 6L3( C{y>3]9`p Y 1J8ݐ2 qS,`=$1]0Ithͺ"M_n >WIP/H\͟IPS Rgs)M=Mc!6Q0ͨ!TvYG7W$,xͯ+%MUU5v,*E96BU(Z1.cLM`c7넶(IJL"wwgU7Q,rK~J{eYZ(KUy9Jƃ6mi:,x%3؉ |Wy'%8H:>PjK#, "!xgtN2>"4 &m낅FֆnapOsdPC44U=@iZ&Kj-<+YM{ oEmLcgk 8?~=LisaT2g#h "Bfy9BNy cH/ v\oa+8ѵIa#V<'hVy(݉ dv2XN2"q9`1O6q-<QI18xa26\ֲ6-NO+D7t"MXkLQLMDw1u8ztz$LIi2 J^) ;vmp+xx$hdoqx=oPI9( nlSѶ .\'z oO߂};N<)ح$*l?m\6ryIEY5V@-x;í`0Z7/OT2w6x 7^~MHObT -4{q-Pƚq FO]L&xՋ#^\(&gL?4̭xϻmBUՑ~%~\ 165Ch[u wwOԈXzJ:ES㿐m?P@U{w6?y'u- 7_=}6rxs|`]߁3:{GK9{澒rxs{Qj3cŽ;>twុHP 1}&x`?X=oJiƿ+w1:|!?Ct?N\ߩrj\ޯ!nJQ7ڵ=K MhѶyRE| M#.x7EB AiP/niRgqVZjfmb{g !-[}\A8_&,0Elm?Pk Qgz:'ﯮ,a{{ 9 ~`kID9mXK$Wm-Օelma8d`s:Y3\/N԰5\Yelnma4:7o\ñ#qFX=}m/fZ_[&0GB( m\ Ș<->MԥgCHcۯkH_^ VWp7dn4ڼ_n5J>t+| m\2Օ%lc4 ʭX[YɪQͲ7f ݝ GC87Oʶ]* 3\: kX$iDa6 tiCIol9ɤd"["Rvlѕʎ4~M $ST?Vd^ BUڻG:1Lse$~)xSl*뺊cVJܕ(k)|G1|}`&In6eGB8N3Q,")ru56~6.Y~B? #<V N1B,Jd&h Y(52[x)C4\.6SeIx0_Sf0j?2SmTO$hl{Ň`gTҁ/t>!W\1Ht%J/ZMtG3>ѺX8HCrz?Z!jA&PC?b<^ 3lmgiXX Y#?Mrg.n-Db{uJFΩ%T!oV$]i<=xi8}ɤΔǛ-F @@Kq&^] L'~gtKL<qҁza:1 >LdתT0"Yͧv3v,b!+)]{Ć,o[eXfKN|)-iGJW --R2ETi0Yaյ-|V -1)$!-H]qli%DNP(covQę9GVY@AatTrXY^Ƶ^aoCpt,( 4 dC%d dR %5ŔJ{Znh!$A"dZGn !D ȆZ z ?ʑg \8QdHu;1LOfg ى (rd<L8v^_XօAcC׋RVܣnFz,tLu9I>2\6ŲF۸*)2fbBWۆLD0Fq EMυ3*Dqmzq9Vq֥| zmQb].HzC,7-*}.01RHIv|,>=Cf 8%KGQ:Fa@؝akw[xkiv=kc;$I %91bd}KԌM1Ҁ ē*eT.eW-峒\"yˌlP[Ik/Og9+wZ`\\a>m[6C%HSi$M︮?}ʣ޻};eܜc]<@ܫV jچ,L30t62@>}C?"F~Œ4Hkdr S >wtm@Lς%rKBSхv+2ȱ#?I vL 1Ѧjw` z8f )% g.2ƪP9 vhi<f@v⭖.x*N"TxA ٫y2U5©]F@ $CWe)hD (XW gVEܒ:}=I-e_q0:ՠܛGYzTwwY^ZJ[UIhAHBZ i3 6^=Lϱ/-ib9H d !aTJUJ]gm;D%^V :Yo/"w7t_ѿ:%%N,x0z>==+2ab7'4q?ȣP,%j` 27P_?F;iPlqpkmBOja9> D`bD<7w йɋ37lnXB FyW ?ӜU< 9s%]Bv.Ek J5jЫO|xzB82a::>ž3C #Y47bvpe0.-e"7P0JR.xUQ"SHN6oP'I?pSSS8iIXz5'Ͳ) .QKDB$ֲD*>(a}Vx[9a [ NעaLLi ~Ϫ=/@ʌKJe s=˗cJ@? i|sj%3^jB츒g]SiDm[p-MzDt+/Ƅk]B28h HiaY"-l s.dR(5V*gstEx|xJTYKF+$4[`meAvBYs Fbp:!, Q?idR|}R9R.<"M7{uGf,!1$2 U[xe5|A~+pӻnJp}R.3$%-fŧ?x'l u]3k<2 \ 2! (z 7v؁[obYpgeвǾ̹"*<*7pitZB pݳW`PB_NH[a WI8u333p+T}2!QK/Lٵh}VuWIXN~'OgLp֭7ExVh5vq{ -#Gz oo~Z4n6{G .[> MAxq)+ QG2gy/oz|^+q !e JgX Is |w?5SӫWF:)қ})2uյ|q`!~!|7~7p#~~[A*dS ]SSxgBҥK5$5K^z {arxruREκ{kZ9D;q?"¦MYVuX؏p!~{nu?&`mK`.gx]({6,VdiiX=E's>2vsRbu<:&WG E'HTҶ<",ה6ªA idd IDAT[^NIt$wy!Z\_d1Ec Dj8'( n -Hh kq\tݑK'zܮJmyI(u:\zؼy38m۶aϞ=;֯  McOrtZ  ]ǏF~^8_˜ *W$|ɖ.żү|Nco]s7|m5W%~ų#ċlr9%fԜ$QȒ m^I@>ت.WGw0U.OpeAO0uƌ&ٺ !"PKZͥ Hۅȼe'x9~`0m۶5ݻq_>1wJ3ԧ>;vpwPDg^A7>~]k^o}[a>c”EPYN/M "\O:$|碮k|cw"+1)h a&eEF A5Űs͋/gD~C2" /}6} 7ܐXLܘ j4 RhTF-@ŪŐeuZ8a='v}rҕ%:$!R򊓄!WU̵(|.IRW;p:εv];Q+EfG}~p-2+o/]j^_~9&Objz3383vZY/|~}`qRh!+)8r=ɩit>+W_$ g4/FόwP͑ˑGqQL>Q9z/ґZxֳ]C§]߸)cG?ל~:?iLNNajzobժU=eIyTKV~ vS\j)ɍNt- 'mpe87]޿}-Go|N|_yyކwtIB}|Bp1/ŏ|NT߃CM𮂯\t\1J՜OG\ G>WK85" 住{΃sK% Y>E 唬vRu{fQb MTKtRLi-x[$ޭL+6i3v[O>_ 6n܄5k׊4'> $AE[`@B$-3: ^{--g;W/p[0)skn̦t"<Lgk"N~t>Mf?CipALGG&֎,lXZVYǤ2daB`榨oۿ{2Ql+Mi& {Nj~(Co?]&L^ǛJ=x5J+ JMH^&x/8T!ܹxWIpyɡP䀹p4YhQ&0ON'.~G={(qx1{4giONJ]t-^,ٳ=ذAl˦ב1|(paƍADطw/~wN;4{yؼy36o:W ,]~D'#mgh]vp8Ӥ~H 93ik|ߐ;cccMolW O8;瞕/ C3{GNwLh5 )k $>Lm | B F MkL¬wڰ|RWN{*N}9_|жmxg+|M ü<s9H8`!"5 CIj(Qп ߛڄ]fQJQC]!ގZ6. Ks<@əc9ʰS 8s@(PЉ,5~kT'גrn3sz!zXf-w8쳱k.zN?hʴLP >QWzӦ%뮻>hଳ•W]뮻.n&4<@>q#(d2<99~kX|,`ģ2ߺg'́!R_sݵ q _M&%%Zz͚_`м ƕW]9pC9ij爰kדDR2B4Q]dӎd0m5{6[ן(vޝ}ޱcۋ+V˶!lWcjY\ؠ='~f]*M%7I[`i L_C u;MzP P< "x٩6p .\\L2 (uf)K e (c&\jxx\|xꩧ?%}sG"],|ľC {=ݻwcز|CnJAOf\ kY0 e֕Rxu8[)w+syMJF?(ѭg+-z:I01}qE;J033Ǜo|ТפŮk$K499dƽhz3M^YDw~Pgy^,xV1㱟`ڏ9ײ &-nXX jJe685,㭂dt~BH!ZV)wu9B&KsGQ kDea$wU:- `*@zA.DBS朰"R$0yd4i*~F቉Lۺ袋D3‹/} pa<ظiSPW8]aVLk_=;۷ǖ-[p!;v;tȸ܌\(x5 dhIp:X: ]x*;H'Z\hwv:D忥TA4F{֮]+2ݓԌDUVA9qV 1AN;r~u!"+7l؀^Hhm}sw܁ 0_r<>q(J%L[eS}uL//~!\s5_@p+UY1)f]tcvv;wb߾} "|˷cӦMpMA3Jj?({&,яo>3M :qVaRs, 9kuAZ98 uʣLsWfyIO0@]QmxVh)AA8q"I?m[ޫ%!<ØLݑ`م?#v?ii=zO: ??):tHiܐ9(^p<^Ub#<"IwAAfxӼ&y5$f1G&n&3y<,;ٓg%Xd)/-<Qx8h!jގ Fp]FڞhY_fњY1\[sN >Y5 ^ #i1[-`g!لf3oɬb-XEA!p1_sq‚Tc1.:`8U|I=-2>0F7xdWRO#3SM5۶} v])U#(Dd W6ӈ&Cxd:lܸ{nᛚŽvkCR k -/^ :t{Ң"Y`a7lؠf`eƜj&P3`ڵIٟ)xyll W^uU 83-I Orv_e{`O T0.] ԧM!fg?+#yfbY3W>Sw|-srI]{e?c2bd*!gVQ~:^VX} LXS02](͜rk?Ӳ8:aX!g2S܆4tQ)hL NH N[easװIcPH.-sHN Q^N#):H6rմ XK7J\B] (}IR&L$I[Wu@okC`ݺu_dj9|=۶= /\ԌPh`7\~9Ia=>< /zVXÇcΝxᇤ/d3LՐGq9RXH`*S(i+)L2G___}ꫯƆ3#GOe xc )3mGح.r#6߼i3,Ycǎq.Ν㥗^\n޼Y۷ VC5VRc o|;~'c֭[s5S,*ʀw%gfZߝ䶾*ˆ%i>6/AĤcfzݤ (.|P^݈NQ sj/E,g Q bH&q"sG+,%.̇zH&K.ɩh px^{@p0==|·טս˷f_oSvI8c={o~K. [Ʈ?Ύ9&ܹsGk,W\FDՓy >(7ۤ?#~`4o} /oajj wuW#<2B(K/߷Mv_L/X8="oG=wz]t;6nDWac|x{ߋ~ "/`Æ 8S[kJkkh67%)G_0r \XYdp#U'ӨijP.Lq 1D# BUUt*YTQLHdM4!@a?>\[)(WL sbJk.=w_p%?p?a?C Cc53(/(q%oBOOO}{?~k֨ݖ5k?n& Sk7|I!4Wt:xk_7^~5ը"> ta ~fR;*7mT Ck2buY D}{{8餓8Xd }?8LAlBְPt'lc!+ Cr7]bDٟx;p;pUW>(σ ivxwA&z.[*`oĥie2Tγ؀"'Ua[^T@)*8bIZ$q1i#Yx1[56@Sw-躞8y<*3;W PUsmF1!io-g.4<^1\l޼*uرtPDvz|v$)@4LDY9gsq+ވ7M8x < ,_'|2֬Y~3 Aε!ɞ`K/m&8Da]c0,Af/PnfAOh |LD8pPMGs)ܮK\[nصk&&&n:';; ;{:)g8Q 7x聃<7#aǎ^U}y{ ͜=Ni;ށwx!{^gy&;`ҟ(ǁh."?򑏠逈03!ox:=rL/S(P'$h ‹.7ߜ= C$gE3bѵfyy:(l(%1 ^rqyT\rGp@ ⁞DU :t'=F[B#&>С +icqaSũ}I:c~Ir9nə~ꍏOg@uq1# ^0~}4F᜺4~} SkS3享5\[H ! 233={@uN*8'{a,i2 .33}+Mύyj‘ce#?> U`!)\R̞Xwr(63D@.xAlm CC4%x)1b08b`t")-7`GniL`l$% Jnp*_\ 䘕cneA $Tރ:Fy CRz ^K|S\mff7#C4PA5r)AMS:UXlDp ',Ojq5|ډ@:9 5j V_tm7 $(<( <<]M|k:.iw. {Shc"nKb &Xβ$ȤmrP!a8p8x΅*gPFM,~fϹ#o øX00]3M%P@= YXj}A o?)$`C #p8D: t܂ں^T- UN_9M&*ryUu!tg Z$~i0 IqA)(0<"D09ÝV0JH92qq&!. ;>n.IRL XM`v?mjOFdQcrp2 =%^n+d<_"{3`f mO$[0s 3"ЪkA&K2i*c\1,XLH bm8zH'`؃',e2hsǰri ;_ cյͅ}%l0Ɠ7#[°s[,mO)Y4:kSӍHL u^u]V-d{V".4(i&F'`Yr IyȎ'J|$ig/+gHIn7ihTԅhWW"1!G IDATBH17_V#^uUD wBzףe1Ln ]b^"<{-zQ|'Aj@ZZ3jX@IEʐ3AEML9SAVPDX-F0AU BU0Jж =rGd#Q͛ݪ0%SQq[+!g,|+ǃtҘQ#I״+!_\4?2OJwۄR@Ԩ<4W[JC=$ XIH3Vȼ< W ql: $.]NPluiN60rڎ-$ #ja'9iv5=fhir\{*{'Lx/eEL)264?`4*?D+ucerj%8郳V)s=DTį<ƊkHs)V >7]N7mBB: P Ǔw BV04F)Yj<ߜ!x0WU, q"7 9c]8w\ W'(K.WjTݶg>/ 5:<|#E=♞qF `O:8߿c-^Оnl$U@BG2ZxskL̄J!%4 sM=:`ef3ƟBFYn%#B E\ihi uՀ-vv`| 27`𜨖o JJD;n)6- ' 1# ]KgPIfGecɂ 5V+|S<;;B&È-iKVp^Xƽ2[k1"LMbw [9*2+3jAv{Y2O0U斥݃{-ٺV&_n/E_2&D/_K8EAa0{Z,}j_X{NL3?L!kiAR$؄ SsY)"!I6XAd9Yy?;E&y>[c,/ BdNE `vVia^|,"dLNꫲh\(Q' =41*gB*<:UpCpz2U_9t;xP*P`B#!ˉ5kKE6/x񁉉cxgJJLMȵ"`bjnL݃6Fçdy\54j $?t|͇BX%&c]ziLȌA=x`L*tԶß!o!4Q! R w!9?kpnj1)׾} d¾ڿgr@ÜC`>'$?Ӏ>|Gj e?NzxSL33a rTob4MgXfX/ 4Z忝cpNy'Bf\48/0{C*\X_9QȑV0r5Q'̮vm"'l/Ï7-""a Z9(e/FD7b@Gwl[lt:Gp0!p003=` N7ϥZ1t:ݱ; j M 1FLc=G!EU$>,~l\0G#MNTޜkM  p7׾vp5efY||KbFAO? {l'|g,2K`|sqYgon7' ڽ?|d;",Y~`zn2.|lt&sWF?=='|[|Uwq6p nqeùŢE>Ws>V]-SxDZeCt2d.D>n/K/yp= !LO>0thMꀩ> _M6E͟UcW v= =(",^_~_✳"42Y2`o?3=Oƣ/Y?_sqiSKz 0#!~g؎cY[J9\ (n㞥QpI D ׅ913{,HT[ ˋ g5OznS>nΟ̣j<1:wJc?Bavv CV.[+Vc|&22;av0oܣje˱r,ABaWz6#%-[WCo|,fiN9AvW|Zb%VYEcTyç)׉6qj{&0Ѻ:UJXӥ %w»3vz|Y*հeO>i̓9cw]TB_ \Y, W4%`;",ZXf4h-U7iHYAXD;1( ?ޏITVG; Ņ,Ŏ} o&(&uW9u;]T+0*^F^>'͏u{|E3\eTA֞ףv i'آ52LfDSKjd=iq㠃>Qqv@OTၐR<1x/mx>mʂxP58{U=[i %o^$Y 96f2M+nT3*ik?̰s!R?(u ݣ.FqYWtQ1?rmʼnZ9T Ee'X0TJ]qv K UP)/V@e۵P<3Wi:ِFg[qP ~1B64)]7)b H6X@i>Bs>%x.CglΣ,9bVjtU0bR 90%E"SbpPVߖJG^ao<#?[l7DuM$z>?ocS-"%-,mxI= т1ń*8 Xf|M"[7."8pzu:>;J ? t/Ssʪ$GǪq#3-3Ȼlrz%S7Ɩh8,-tZ,Th4r~$4.KtG=\(=1 "ֳξj2L^ڍ`Zy/V(wg|{AZ=2y@|Pe33#%js oyF|@"W,pk䐦:_EbG6\2\1 ~ͬ3<`3㒌N#PȟoXpZ8͎|~kʪ C3)u^&Hj^Q26Qg2My;G-7ƓfTmX.C1ўsēT8+,M<W2xSl9omBg>Wu>rwҌ:3PSt?mB^M)ss *$ƪ }-pĐ@l,9I'jaj!:M;nECj`2YvoR(7?jX&]3 *\6ARPKƒj" ٽϢF_ MZ\ /OK-uuneR%cB~V~xmp¨Q}ZZn{[cgKPO"L}68iLe񂆔j))~c N-^m+/# ]Fɭ> |DO^< "xf0mzPEfL;?n7 {"b"kd[yq_dg^XfkĀ%xQ9FQ°K%&[_!䮆r!ܲSXD9j ;:C T{kqATW)%mr:ӾBc7XQ}_ [4.dZ!L0ZNțx =md|rޥq6&gK QBJaxbP앰`= 8Mu@yHHW|F_<}]sßZ+,R-?zYLJ))Pju>`y C7>e)YWRDT>8D5ISa?oKPdzT(y4  _Ysy'l૖hy_G*4.ů NDI3pB#I %2õ"crVFiӿFYL ?F|580 8O"ݏsKQ?q9}@dmY:+exF952oٷe,`FШH-HS1Νtُ#NîM!BAk*YJ RZ!R&*$x8*qXר2wYS11QUU%m:K3kHv)'T|+TG.m83`ó9[CkCěm`)̣F7˾6Y@]o+4H.$6-fiK-. +2esb]P47n mQ,c*w;wa96ˉpoͭΠ e^ PZTZ7?"Ģ6}M 暿85|]q-b>n7ye,NQS} IR O!^}#c[S/}y%תF3 w\njPM!t8uadIqbX'/;\,yYZSm i怇fad}CAE|% 8 gN0׷kMW_φ.34|"\06a!4nM57Eo+Yzb DhZmHVX d`n`k_7 Wtk7/#_cJ_ꤳ!l>]G$Oџ}@ZS$& \EBI@Ogx8j!Cj[#j^'UW F/flס ;k mD]m8+듁9&k2(q{?;FW* ~qM[4ߣ1/vC57eEp4qE0[Jіo61}t(NS-`Õ-vKUkZki}ݴViAS^mL-/šۢMO\T1vcA1%ґW\&Ih*8x8fI Ø·@hrVs3m{컹Wc< Vxd wW ګy:UC6>mĊҲ;si-׶/ׁLv߉83EF 9o{??  h3wTTb[bU&ZdFЊs]*]͈2= Wfb/z#F[ݚiYJ!F D3>ZaܓU5" wƺ #2ֶfgg]y&ofKM(=s DLNtISuYu&kD9ƹ2\ 37V19c%UYY=aw,-O4!Ȗ ԓRΚZ*+Ӻ5&LBˣmjc UA(= sɘai“< cZ/EI&CLP t5Fi9 nE^u!,`"'>@P9B*sqvk|=r~e"Dכ2jBV(Đ򨶖 šR6kFD|DMj_[G߶WT^k;̣ KfPJ# =f*[m_',3%wc*-MbXVo1}HZ׏}._6Ϲ ɄLFco?i_dCh Zs[ki}G3Jh:B5b2 yu= V٤x։ڀ^.]aA¤KU>Z:Y6C@碩7>CPl7ϹvXV`Wy"cMkdcC$J~UIU%u|ms{+taES%O$sԵNq!l*ntd5NB@4Ixm9tH.&[X|w(C eX]r3x9=ݕw5G|s-$>͒CH5BDTt%Ioo覔+Z%ex_{A*DcN[ƴ(mx 28LMO.:Uu:cܙ[߉{9zR8s^k׬˰jJF&4_2ln)>._> C8|䨦TI2z*x8ԓpgbyaPH٦@R]?ǟ؅4HM 96֯EUut !ޡػ ^ܳ񰰗vXP8SqspItJ-bC`lI IDATu}bcFzfo+=Sq޹qѩ:Y{|еXyú}}x=B,g~ ۼ1_E5J0bx}Yʍ?7j?@"p8]xq>cCS#1 n?gQ`ܴW]gfL |5|2^ L{'U2=o#s@84qGᣢZ,er^Qi ϮU) P^ @=Q*ji  "$-9<nXf-&orm2lf 7R2O> ^TMҐ#:K/Nb$&m|X ͨ:0@Xf֬ l}< V@,SO^+p N']kG/uiݚX-̳/pD9e= :B jwmÿnj\{يyh ?SN5W^.]`_v5 {x؉ntgvI捱"`0;w9ג[kfJ|/q} xW n+c,YP%vj\z%e6=6%K)dh׊|>댘<ͻ_n; p !D")gu<§?2d?6#*{_ ƳdS pNޓ A lgy9g)ebkx,y:[K_~C0ϒ>K:>wh-nr: Աw>S7ҹ6o:44'n,,5 s:SLش,TUJ`Y/HhJ]3L&H9 K='vVXOY_ ^?@1!-Ddf\2ǧtҌF("{g'G#]‡G=RWl@^%Hٺx( h0\2apΡYSGtTH5w8̈X!A klbH_i>>:.*VWPjraHdl!PO K?Aۓ0cSXrjwh.6K@g[l}t:ݘbffV8$de<$(Mbn^`e ftmd_}lA4L˥"z)^Rpŷ$;xoGb2 t:t:4V\!"g:0FY<3 R._LPLc庤K]cl`OnYIJbR }tq嗖G̠?;T/). jUH2_>T oIlL:U" k9=xh ¯}b}ȶ* W q)Oxk-13"84IA-DEb^᯳ƨT1E|F]i{ (_O6fL1/:*4oXcK!Jh]|,:ݎ0˸I.u{V BqWd#B+mT hBwIG77!x N&U&| ;*2 (3IA:Uѯ@)K4&kՊ]tpPΛ۰RL3 B?*ʫ/CG>"Z SOٜi#(?. ;c\%UtEx<L|X h\d,9٤&M>qp]pň'~w='*IxAn o'x!p.'r@z"bd49qH1^59'JxALArVDkrnI{{uCQDzi̋f,AQjdFF> RhI2/O[jjz~xBB!p1k-&X)B'/fa Z77K!\am(Po g8(xI\OzE]pΣӭryP0~O\&t},k%x°18#y7r g:!f)l]i "4|1ӚyL6]W&3Sl>Ŗ詴mZl Hh=6xނWBuF$wzE "$ " łVs@/hhDj42 ~ߴ *D$xq1AadqdL,$%R2Mpsܓ!1dyO!2X JaL$0>3k* '$Hp |%U-vcCw||kkx]ێ3\L=Ib`j롪*ggQϿ9˂bXL{ :t .FtUާdtl3ڼa"< !9X3!kv,UVSLLH픿Zk# .@<#Vx1dx6IpEir;@ sf%QImt3T h-[c-Yt-='RbZ2ހf}J 0nC [}Ы^%'JX`&)!76ioČúMN\XLVsЁ8pic}ؾ [\vq' 妱}s3Y ^||/meU^`j̭) g>aSN '" g_܌Ǐ֭]_z/$B;X%]M%#=rկ駟¾}1ʪUp㜍?5Lo?H n%fZC_1 ƾ}qw"6lМ f|imG2?nwnO>\yUXdIޝ%"!LUƒз{<~ xrד "+eBSIL_5kH3B'͏3}rP>ـ7\kV`˿SSRo|lW~5u<#Vj!t彷Ѩ8R4&6`ݚ-a?MNMbg}{j|9WӔbIR\R<ɝj!d"h/ UjC:#ui$hu${ BEzPᖟhh8>%8t`6p֯_ $VYզE  ihȇcyA7b}<|SeQj&rHɘfu2VZ;ADطw/.2cV[O=% w+'pN+Hs9Hpd{Koٲ~ 2&&&011~;{ _’%MXX#!3^9߷O|۷?k.]o! DxGwhl8cJO "=|  xs~ߋN?M%\L~޽2w fE ؿp8 !Aydp É߷Ν;pc$"LL³>]hQ!r JF0( MqY@:^s-²v_1q]ۃiC fΊ-_:83 "\py8p!^%KD^ m ,A4UUN7 ّ-ۣQ'd)2o|;VZ%42ǎ÷OW^3.2Xū v18l2~8|ˑ42lܛ>u\ b#WIQ\$[DY֓ œb툧7{GHdY-)٢H  .'d޼U'Tuݼ9 g:b,@ =!B8žw6;:u/ٞ(HbȟF$pooׯ_ëO|qg?Ct:](api1 wl###?3u]J~_͛7~Kz [ D@Nx+Jѣ8uָpV[- 4ŽZ[oG ,eBGJT p˱1mgl(,//W^Ck~ KKKqcabm;냤5;} 4:'?7}cL+ (<.{n\|v7n\Ν|r2۷oMyh 4OyMP@< K 8=ؽsGR Ku:ϝbϴyعcFGKI)d$`I)@gv[ϐٹ)䴽ԝHT&hԑY U:%Q, ka><AB&QH&oN<|!͉)9Z8s"'O< ¼|X`;k[$yś F+@it:m-`n~Qt>y$lbOJ@Nw;׾zw>RuD}ګ\ַpێ1;E-GqH->wQPpV36Zŋo[o0 cccسgON`#g; <xXffܿ9xh :3^Zڒ&EcxXK7`w)}9OK' i(FM! c@y'q8N<5셋z&^y瓊DCJUE]q;&859ΙS@24~h[}v޽⩩(ĩ) ɀb&e`7qskN!hLOaޝ8Q:S8sm{yٷ093 >ShX^Z]iѝOKx39!lo&~a><3n-"`dnO{Ա@Dj _W10`;43F}<[9e x{1~{ӟ׹zYq*/Uر&%,kI?} -[&VZ#X~i [>Di K_~Sk4׾v(=gy!$>iD&&]G鸵B)sFgi "Gĉ "?_ug89jA3LP/U J T\^^<1>>+W8^xMSKH@<b/,߾O<^|E\z*}ħ $Fk1ry}ؑ]ɲ ;ncN\?iz;/98ˊ`b); ,X4pX" 2 b+ {[~0jplpvQ{UK B, ̷^9~8;Cq!ULDȲ/"2,,,?~+sd we~IIvϕ+A00axMK@V $ŶYD.tx+p4%"4 dR~,,mrR9ltfK7ϕyFSYm@){~ s\YKw)Dڟjl͙\FGأG¥W mGFemj0~Y3Q ׯ^ƗE ó א]Qف`H^r:} <' Vqͬmf3(тQ .蛻<ᔪ?#^x≧pC PzÅKe__9BD3g~v >,EVwG@xɧK/a||xGʵi;+`!~Wph۽gOYfPx/qJb)g. ͛.957qs|v++X8}=p(ONs+cAU&d]FmdrTf9ZՏ/kNm2YPaҕ3n3Rfg(m5%Ogʚ8=`tnq7`w{?_:ţ#2 FGgIaV:'c]t Ư~Cg>Ֆk7$GK !V}T+ $W߾`'?1y1c'W|l0$OqںuS<Ӌz-~,8@$ƀ( chK~FV o0 r۶bHq*o` ߃,0[ff睥LDxp "ErM'0iPBGf62X^N^fAEN-zC}ܴO<06hh```-͡j;A~r!߃:0 zr;SS|Yě7oױrcl=󧴾}3X0&˿pmϝ\XsܜHnw!7̰SN9oK^M~?.,n0p\YPwT*sn?K=z(:EeXy%%*Sh4C+taa!j ػq+wݍB)ӧO\f:ğQUa"66q.^|GJr@[iQٰPs%Ξ^;7N]T0X^N>'gXmG3'6 Z]LP'' R VF}-A%Bm$W ^~ W^uuC#? W^9˗.:rt:k7x1mxIX^^{Ф N8M.C([Wi%?;﫯`}As8}Ze_'?Z;9-ޅ.׮}}JCw+_M:` H/Q}?A%zRo2p߿??ݻEjgCZ%\NJ@^?q)YFGa|Onjx꓏b8n($vLQ̧FgLX( c3eGk@i#WT#,3FyC;olڷ 90a9)dNt'-(Ǣ\H[3 {NBI/ٹy\1Pmc 0A %,k>nɓ'0a ?cM7lO$[?p277^x=z衇sn3xWvNrK]X((j | _~#y"{pM>} ]vG5,FvpI8F رc6m5ɗX': Ӥ ˚0;;-ypl~6"}qep,~#kno_ ~SоJk_ {!"Ws#zٶ/UBAԋW#7Mld)K-d?b"1f|_wJIPPE,,?eطo.^ڵλFcPktttxOFhm2}tʼt̚4bG7bPaӨ3Z4 R]u2&ݑ Cl<4N\cf.e{l,tU|\yJV6R0YDsgovy sc>_|ѥyW/MC`fe)j(sZ);|}݇}{/_*]i4px[?i ~{dONj ۩XS7 bÆ ;|6mFse5~J1 /~POC?*EUC /^` [ذd~|ب4ʤgϸH)p<9aaرcjJgI,ʁ 9~BwYSh;h4!@n0ş "y,ַhEc@G<'|ƽ3=3k-B?_u&'r( PFQ.CK63B[v5ZLv5 KA!^SIr'A96?p[~mc_R;,RX)0*hGDSr[$Ҫ^6<KɯXY]ʄ S\n[ٷV5[@hWWZX]i!2޳{mgsUW$DKo Vc[?W[mܜL*vN_߉Tݵt&]{"ZC/ᐥ1kȳD\-&*) ~,+Z+=__`o.N%<Z+pcx[q !VfljTGbaq+Y\H@NHۘB 4Bcx{_}g'ወD :=1yݐRyԔr)=P3NKق^gp놢w8ZA?hNH$ ڙ`Q$ԊxDVT,+xGH,# 0?g~uVaUzgENF(![_ۀ3b{'blR+y Sܞd+eФQShNa1Չmӧ,GבܝL Rx+̼k I%UňBn?X1 ҒK6lKq|Ҋe3'oD|,tڢ+s2wz51VAV %v FCUS84rL;Igքv Z-aJ#/H9%v;:Kjg{ <րgtp}F/ pIJT?<#鯣5Wxg%?6,͂KV%I"! [T G*=]c甍ʢۈoG\AAkHɫ;kR2(j }R5Pvp3{vN!){_O؀FF?OW?ЮF,Du rOk{73!##{|TD[yS \DtM̉_Uu*8k{1}r/w5yjz?K A9}@<6b<'sgegTp#ҧ^; 5;gc-"4=2;)]$',s,mթYo?{Q;f`^xj<+{i1o8b&xSc-3r<ȕ$R xON4(Fzr;e+ 6#(_\yY߁Fs9\q9KlF#yPMGpx2Vc~vX'G,cAƒ퍚D~T 2fgypѓc8x4 0o <}+Mh(O C'>dl6Ɖ.S[ Zo:B9ϝng(%^hIDf,sךsXVh6b"  C+O|g&^;gNp(P77^ź$) "y7+BexN&TUy_ㄣ? LOX]]qcc%Xg9Bl⍓'e`iD[\%4%aQ+++8qٶBY$ҥQcnv v([SLI i 9GUiUt:srU0UAkml<7ٚ&(2OhZeibdh(Xo%2G˰ى`;J(^)ܼG02z lUȽ7 R{^"FH6?ҔRt:X /*aۛ#J)?% vރ]sj[r Μd5 3 4Ϟž={͉в=h{b> Vk/_©}ef};0)߯.g*._SgY; Obw]_EA[cvxa`7+ɿcm<}OV[%>wP5 [Xw?→d-"1 6@ W\- Z1 ++Mg}Ğ={ð_gU0qiLg]h ( 7]1rejViLsmrBKnt0EI΁dU"x@LL0Y/YnFxjȔqLHjur]ɠ)EO)N.zjh `nn7o|J?- zjS3Rk[t^ï~^Y֭R, IDAT ԭ`N/{ϿV*uCggyY ^|4AyJBo1bF1N/t _I24$9+&r/~|a `%oH%}w/_>m7_wmϿ9PeƴЏ4K^CPz>}+{IY;fR;8j!`t:\!_ hi0 "nu8^gR͆jx/΄ߊ"O? !+MJGK1`0Zt ظ %Tj9!O AG,8㧬?|^R;î;\) BQ*BOõeE@cR`jC0\dӾ_U:UWgA9ق 2{3T.5Q<Th gs6Ϙ淁 fsewMrZ?eg;;ÁpKA,$p13?}G+ɰU ITnYn>JҖK7ET@񗘃"A Z4?oݝƿB!ݱB՞.1(P{u^+?J 8=#B^nh~Y5*3O(Ƞ(7wqf&:2 {6g9 eTBQ5c ek=5#5Vτ2| kCB0gԳ *Wx}-,ga7ӉBw0kHpu)EBj&B=i%Y~H-2_\\5j0(WQOCX"%`;!Kgy(٘JVz[4*KzZߞZk"HxM~(]JZBU+0x~}h,⏞S[VUI<]%}b~M՟9Uz+^K Icpci\`J_a=ɫW7HV^z yk902C|2Wk{7ZUeJ󖠨*kxhʎ@8f|(DwH= 'Мh҂t%$Tt`z{ZF/V*R3_ M|! _YPV?z.OE0  ˲xeKzoj* Cc!}G?Ɗ=JRϓ߻ e[͚/VA0Ed$ѳ}0/R*h~A7JZPM X](>=]RJ!)(d̺5Q,~1{ "YL gCvBQ;Aݾ!I${%U8R[͚lǮlM$bB8کPDhK^o:E BMM&Qϩ +w@kK%TKh/ ~LL @̆ u{(As63@$ :ԬhMh-PRމ<>-2c׀^RtjHRzV ,$Ԥ?z-;⑘Y TgYw6fR)K)ƿ"KM.l]u 5nz/;7Y"L=Ci37*WU$@i|}w@R|+Mntp^prW)b}! * [*[A%X`^DL>V0YƼN eķKF'(h@@07P N umsrI:Vl'cC2G|VRf/@dlSr3ۧ;*G R ;*BKU: ?K;|$Ɵo]F"K`wt_٥W˭̝%XJ%ZY?[J$ٮ> oiصv&L='2qf;̽QY &emBm^cj@ k > ~Q+GoBUz~Tth_~="l&(MUσ6j 2\9K]|5e Ej7)zZ#k-As ^4 ZIo揞 F(Y?/nddCA6dccc8zd=N>\xD͛ưyf/,)ǷJ7͔|Hn݌zɩ.~/oYœgfC?PdJl";>ZȊǜIMZΞTcZ D’}d;,+:9#`gb{_$d﯇dU CEZ,14.; KPpn'eHk$-R`܆Y1j9ޏQf=qW\e/p5Wey::PT~=GܳC' 'س\sQGGG1; p#h$#E#ģA:>kˑ"fSOٙ<)FSL+s̞Vrjgx,Lȑ&Ce+ﴓZL$e@*Z^EsecV(Foc‰YJ5NldbN Ue ڊ.bC0,-5i܅c 0وF"JOXOTR ֦C݇9HnDd\xNtDoԾ+:aiN,{UI g#}y4uO[`"FQ>@.ṲU$53enX!ɋnP$?0eYg`_3񴟀JFoAxE ƛJf2;@A*d[ 5͜3\&:aX!N UMF)͖8i[&N n_)qvSu!D${YNI#j,6 ^8#A- /iXWǨ,JyHBWxެgBM΀'ƧhV@;${P3sjkjPwZ~_[rgVZ}F=Ng )!}2h)|*3.Os)$*xBI\hA32*vE+V=ќbSn2=eZ bZٻ% 0 3pSaKt3'4,indY-дH=o)txkxb曠oc w e#+o!VG+ KD|?<_H0dtN/tQ OZ~ [#mc&]. #C[m i[Jv9ODN@iV,tĄDn0d]դj!a+%R `E*eEov< C9ee' 8M?4J'k5)>$" #iiwܥgե*}^,/v,(GBw-)E#TIĊzY +Lc gZz@f){% WVn㊲fW_+d"ى V+NDȐ 2`dZ_/R~v2:/h YL,K(5R2Yvz(dvGW{vxuID3Fe:v5=_DcVU r4 X~X8+=rJ=ħ,:zzw9|XJVI*|{E8&4檅?שh>!j??а qIvBzW&0q*ˌ'yPJ:L@eMx:&&g`uz<9k NLՠ= 6#{G9{o%Ry“3N[0l ^6P%^vߊwL/Xb(sxnM \k${#+pӋYqHB>P7^@Qoϔp<,Q%Lga" +Iz[o&ߪEi< D epMs =&*g* F->uvƕ@6 W Dʡ *\Yf}24ŧW\h IDATAE˘smHA +Bk'KgyÍ DkcFăߋ]vb֘O`qy1Nc>7' V %Al߾ 8y ֏mF^.:XƑ`-P,8q ZBGJrbtDO\5e1p=W657h!s&6fChQh׵ĂhR8ws[nwmFo !%ɵ)v%_qgp{qͷL}&G  gRjEkJ yT۫HR7hyF4:TSױ?]ʚնnh -,-6~t=TLA)c ,KU2W ˫(-qz,2h`Ϟ "\|ow #8h4p=p̛ػvܹ;n `Xw [eb`G 1<U4ؽ#O?0 /A\$7Uj}82Μ#kxaUr-B$`o'T٫%EBpOܼ"M[0eۅ9,//7ٙ)=Nqlܴssh4184 *fgnar&&lܴ KXi.c]XXJ  ,/-nh#jyfCq~B2m0mل17ؿo/ 2޻Iccغeo;_"6o֭0n%޻|ܹw9!:頴ɹ)W⣔C"-%頹, !PahR x?{OA)߽zs{v˯$ۍgp[wDԓP x7p{N{ۃm[+ZO>Z޻/]/6O̿МU#YW ( |2+  QO\} >'Ss=ɵx(@]x5aJAΡxSkq8Xclݲ05= 'O?r[n{ LarjZk[mv 'NCA( _.:xӟa|b%:0%P N-bclP?2P$FlZN NGR$đ{J{nݠl=gf9 OLa|b KMؿv9,/7q `y9/߼9LM`MǤ(ퟩwUU}0aե(0<ϱKWW[dشq#nވəy,e$~ƔX8;u$, bC z#XFi u@,S( ¯_<p,4Ny9Uc/gfqƄYP%;w;XX\Z3zwj yᱣbaa Z M6 slۀLN`2 zJѧvRt1'@XE3HM / TҒWqݛo߻ avÕ+@o]hԱmf-MSQ){WJ<;19Iw};o Y^~ܺSY/e VvY ñlf0one Bmuj'ʬZT5if0M@ 6 ړ%.ulCQh{$ͦ S8rA>|?`rj?ՖYiQcjxؽv Nc}0a*)Ro*?I8yzk}#%O~viq[kљ<ڍİq+7i^.+&XhQ]9U+MڶE ]K 0$q95g$yfZ'Q V[:dEƓik3N2 mocnt+F:CeP9_ ~|5'Oɷ΄ݥ|SͻgSC8y)%+ˬoV;& $tib_"vj񃜜}A Vct4R2|y82W^5{}N>?pE^X;`rnO;v7N❳LvlnP vY$N5h1{N_>;kD2NDT}gjWOS;!˲. 1 N|_u0V,Wcc)(3a+EuW^9?vwv+aڄ6MQc})Sz\ƕf `6$n'*Pa`A0l;\T?O,w1C~le=tre;Ýw]>ц_zm4~Sa`TVk"Hfl.cYL\DՇ"Z؎SaeZQ^alaclvy7iR>=`0௾3OTm pVWV8>QdpZZ+nr~Z3VWq͎}vV|\nt'-' gg}bYʤ' p N{K%²+Qa$"M^vIJO/#P-+; 1SDu\;8SӜ:^Xq ޻OBowMSWP<#yO5\~}q$- K G(~q^ AcsYҥM L*ˣmu482k,-)K#+ǒ)ˋllnU'YYZdsk;T}PJq[u7`mc%M4Ơ惏<īo ȳ^!<ExGyμ{MF->~QL7;vFϠݔg6 Xv~\oOp7LD cv_?KX^Zb}cv=zA֜9{.}c!GS5g}r&HwƎ< 5FH 0 `H۷5 /H+t d0Y@BFٔU?]Gfj/x'Nu;ʢЯ4vY]q` w3({ljc8{~DUU0M JG?Dg>m*m?{x^wcvk=O]w]O~n=%hOc<Ȗ:4syQ{buevwΞ#M|1nZG+]C?h[|GlJA7ܢi~3<] 5nˉ|P`yT6gF#)5xLi;K)ŋ/}7oG?aVY[fPpUFK|a0p2O>no+mE&v?Wkw$I5g`{b]^,B2Ilhth˔0``6q<H 0)Â[,&vw%.n髫;*KmwΎ_x _ GԼ7OgX^\$Mbj{gO݁8=iMCƏ Q7@E)+ݯ/^gy2?qшn.[ O<(ؓؤ7{hDYVɏP\v^oc=7o&W~8N`13QXXKWN5|7*{cc/Onמ{HnrmLl;l5( oAb= 1* D+q {F{7" /{*7hdLQmCbxM"Y]&'i޻'r[Z܌kSU}HcU笰ۦɅ3߿q˽1loH[ 66FE׵$ln=Z)J`n][ߨ;FXتHH[1r66kdM;ԮkRݔc >Yy& 6# R&&/МzAEpFԡݴ4^iJ[^_Mn۽%>LR$E vh< KYF!e/QRL$ ,aevGFȚT&?AT~ӯ}1)++q\q*ol p)6kg+oOSnP;քyc9a6?v $g{FՉ0mYQ=ʏ6aީn*> ky"~ZfEǘ$?MLgN'YVč~hwpF>O;≝ G?(.\nϷ,nŸ RLj`Z3F AjTs0GJS1fsd;妲05MRZ O&+t|Gs"3FgUq8l;)001SKf}G=O4ģL`U XNi`g |B <|6E3Y.cXY^s4U'?p.z{9KA^ rw3 pҊ>D T?V#˫g؋D{ק.T\)֘*~ &Q{%v) 8c~u |vwH)viZ4!h&hO1TmuVؘfH*b%KZm7T]I ƖDHRL -t6slΌ44qDAphc9=05e=c[!QySVLzx'ty6|eٌ89+H_mGnʛ :,󧫭']Pˁ'a &js* :3Y^x7T%l?p;+?K|i% cϫv>/Xc=Ktic2bAUMLW.(>_|oL2FܵCyk]63z9M~ҊQnQo]=!GїRƖv$ _bln6K,0}[w]*A_= [T'~~BusT( .Vx&nR{Lpr->Aݗv 3.8;_V gu$Ưb"TET=fwlHG6 #$IHDBQy\ZpJgnUrs׏Muz#!:UBx(ݥ_zLV&躥Pn/B BIg;\{q+m<{N4ݎV^5mܬXOȄT01i,Z0Ʒ >I]޳&j_9TVq0/Q>V?&, [MN[W/€8N61Ҥ).AFNSRcJ`i<{yKX@+ ڳ %  VIա/~?EX%SEA+_ ߕeL{a8M3w}VB/)4 n?ꂜrD( [spqk'ذjwRR>4oF_1BkwطԻR*`(yB-6:wݦ~)n?7aLJh [. F >pJcţXŸ8BAt0)Ɯ`2Aꈍv ?Ԩ9{@1D}(W=AԪ_.d}c iODnL9CD[&A>х0v[zĿkGՎ8:Wo3*z 6'۴3&1qV^n^obl UeW鴩g)^Dqcغ;؊L(錱[k]"Z8HpEQ؊fsR jH~Xleƞ8lD%I[lomH"`l&J0~F[kR,G݄֏W9}u$J"mwJ/I[:}O}NL_ED]bZc4&6IWȩsݞN~WZ̎&󱦵o/e|F'/^)7dEsr+\n?dyΩӧIr":} $6WPZ!ttP1M.8;~tp'iU.ۭƯ$ !-Kl_[`/(ms'VӱcQHw^i\=<Ulmnp3?'.gaS4um[%G3BGx R)"MdRh[Z cS87E1ɍccGZLI[z[ݼv"\Aꤶ5irIٵǫNw2I*GLZ_gK{fi=vKwnvUܻ-mKImz[v{A"fɍ,6_8%ʘpl{5Z(sksFiw2'd"&<Ц6 $%V h_)#<iMk~Sx.{II q_PZBD/ DF;24E*1W(l[%e:/X#N,edoAFՋqg%ޖw|+{;@qe}kH1f~!HR\7} ~aֽ}}".8~ WP;yShE %1F:F )0E R *+ HH=,f1R cG & \ؖVz|Q2ڪq [v(ij5 4hРeFIU6cpH@[ܪ!+$I*IT;ƣȕ5VzbiLR(BZEf]Sj 76N,aYZ 4h@bau<F`)E'Z!@ώ檍S)b&>D&6kbLjcK+x ,B.#a{*hHw~2A 0Ơ"lo`A$%IFM)<ƾ[K][hR&R .la)s!PJh1Os]y̗VU. *I{`6`Fu4h}g!RJwˏ ?;MJiC+b v$@^J 0| '֐X*V~ !D$j{| |XNc*V$i1h,KRJik9*R={VQ <5ܵ G p Xʬ0-5b5hР>Fj0A&)`BH$"06GY"L -}0׉#|-q7'djLh 4hpYMI֢$`Jso j)2\3Ībʔjh ՠ1IY(o,Y 4h 6 %ѮimƀvZ6A&IqXD )d@mV\ @Ax Si92 z[|ND$Iل$ȹRx7̤,BQrt8ae;(Ceg*A ~qn alCm Buerυ4N#TU0` ¥^5F#|Uo\]H!(aj;xӜ)I$ 4'H1`UeHl{G<\[jiPe6W)q=ZxV>I.AƘ pR}Jd6>E/#eijt:EAe6":a`IAۿ L9YV3xQ(`pBtA^$+`6FJh _6314MI^/}<)%n5h0st9E˙Ϭǚle]5aI!պ7]{5V^HYqJ $EQXxTj/lurX4h0Ct]113 Zk>I0??O$ԠL1quit\9!@kה=$Ύ cB$3m`&G1bB.(Nb B[k捐Բ0&4M#2kB'R-Rt:gA /,lK"feUZkcGBℐ;ҙD a5u^$h-+ bZL4he9mvjEE|*`N,PJvz4 o6cJ)s7bA\Iff#Zcr, aSE6U+s 6!p vO}b8~3c !B?wh#)ɋqm ِ \5/8#V5IbYA1ݼ ڨ< [7If]}ηkkp;QΙ1KA.)-lҐd #mm aiČLmMBKk\LOHՅvf5#h4 H  b>R]Ohp R&.GQ`Hѳ qZZj4a2)4.֖'. Ύ!`7csXxOi{qܟ&DBEاV jk33Q/D|UF$VIR u 8>A`2Tqs`9dl6_s T0z6y&))ڠ!rKLH 8Gql: *bF^NJ裏ɵk{?X/jI}c<}0+UM c-PQHBelbZ7'd\7!P1{})K2e/i]Z@6^s1666xzyKsw̴1m4Cʱ+rz)0h1Y2G8vFglΦ04r<¨&M!Q=1I NRѱ!T'u. i4CԧpEϦduRm @ ]{ݨ< f1Y~YvhS C`<+HI"ش$h,>&>e =h 5T*zi@i>Gd!. נ,}G1ꄃYkR`D$NX%AkC;"XͱӢE.aJSd$ ]@"@Z IDATn0{Vڢsuz^kDt#y~.p5 PJ&-Zv=]:0 xsYA+I@٘]L! Ht =)sխV$-EV[ Pʦ6ښ.]̵7tA`i-6(q;鷋v4ͽVvM< i&׮_#mټ*/lM41R`rٴ:N0Ƹ6c侀u$YݒRjR/HZim|[y$PJ#q@6J钸ฆvvqV,rm5U4!m萰F1tE\Ǚ%PC [ FjW'<쌮,-!vRM2fB̙3lnmJZWnMt~0mLPGNAb3لZ+(elʜWBOvY]=ҬU7vA/"g}:H=ٟGG)^x裏OxB,/GGdYv(M,-.r}1y̙\[̒N;L{VMd"J N>'I%0-@_bx)!{nSc^eEQF#4EʄB+{q>!۽Wz[M{%M[!NSc,62z)ܸyM<ӆv>>=8rȾ5 58qﵶZ-i*8zGL$<50wOgu~)\p)PZR!Hv:YvQӄϞ:~Kl{y> ,,,pUci 9E SВQq"Gx `yiƤ/C‘Uy'J)>`0`4QŮ'OɓnEx鰰*GaueP}Uk׸vZ` Xǎ$Bڄp5z>GQ:ux5 F3ץ79{<i۽^oeee! "M@/8Jv{#Gpkmјi2zdYFa/.r}QlooFdYh4F#k$$IBݦnvgiiE >yum.]X[y{:fҸZ[K @TJv!)\ˍkW3&wAfI',ͭSǎ{*ANa6D+JW*Hd…W-g,رx3hfWH)9w= v91?7wa ay0 F!шphMtYFY9_һ)K$IH]Fvtv:viw:rRSJUNjtRiPRv(qwqwHzUsTQج^Km3RD~-FQkP6#GVy'L~1&eɓآ:ek06vT{﹇` I$ܼq'Njw(UFa&v+%MM`Hiݚkboo ^|gii7n6(Ҫ\FHI)TᲣFՕ%>biix _y8B2 M0س1ߍ^TiPx͆P`"|ZZZ'ˬIVkM鷸t;*,&,mki V`t(T5vxߕ/P k7oq 37?_0Z@k1 mh;|\tVZ5P?Or=̘I{ojv\zd'1v׮NjJSnj;y/^lLl &I"ӟ!rKN$n_ddR؍iP_8qsm0 Zsn7-fZvگ&pY Z->sSN ~ES!|Cloomh% k|鴻(UXY5Er5;7otah._K!@Uɸ>Lm]aձۯ{}WW˗뮻  BT]τ*HdB"^7AyWViРę^}U.^L۵TcP@c"~cb;}jxY^Ԡ$cG)sF)Y1??/̻Gӡ.UNZIotZ$D$IBeeYe Ggq:]zZ#\pɬ,n\L=H610A=ir,'Y|Q L@ ^~e.?'l31׼`5V{UsViN4 lg{o}[J5~@mwZ[G br"|/?(Uؠee4%E؜m KdY|gtS6-&}zd˛zׯ_6j}C6@(y$kK0*loя~y{ ~`+xxwCʚb wx 1cIo+&EQ4B0lS~w=֖5Y"oy2@YS:4Z 3餭.\8w HsN6byg,Ʀ>zxwy#XH E1 m\N,!xr Ŋ@+~]t:&TZ-Fy+'k4&bSWe;jbx-CAkͫʫjN=@k_իWY\\Σw2f G# פI[׿5QhR~~8x%z^f4={3x777/"Omo`'JD ?=0;˗7Z-ц<HYZY?87qԛ$1Z[x?ig>vo )V CFC^`8K7\|N j>p? J կ~wϞ%q}Im$I[o_*/_Y4 07像>/ڍkDQğɟpeY`A?X:9-F~$v/߁Ҍjj? gl*yޑUqI|Qɳ&?!l^+ڥo{`QHGoHӔn !l)m^z^xhc,cxiSVVo}`@ ePwA ~W~#w2 \炕NBA #R Hcť%< 7|MmHU $F۞;p0S[8J[7o~-WJE\g $Eak?`$Y32u!/o8{=ޭ?O'vN & I!p+lL{r}~ Ϧk9r-^7ʕ+`_PJ1??>cnݸAEHڭ[ΝgzԄV@HڛMlp8I6/ ,{+Gߺrh~~'^KKqMGYQV[oßٗE<+K+5D{gydYqh8uuղG#_ /WΞ=4 $It:Nɲ,$TJsw'/((oBH EQhӑ-.,xoa};=LlQ|=u`czno^~K@nnl׮>Mo}4(6 F#< )k{ZIt{|W_m#|Br;{,?<_}y^ .]L y*RJps|8<`v EQDQdooXk_:+6B"1@|9 /nLn,W/|4MPP*RJW:j, Wyna$i (XX'2~'~nh0FkVVW9q?%={G& x5!A"\ ͛#GqĂkʩ mϾ|<5sN(:͛7e8uꔺ{w2(CrlJ! ޛu>no. h[KrLd2$N)fXF׃X+h)Z!lllpyΟ? IRWgոa1Mk=V>_`iqAVm~G=s+PxؼHH]xHm6Ny羋쮺ۦI^V[$I`dUtpk{{O<^|YXou{{wg~?/xeO_?!R s|jq( %~PM45$+}/zA37;J+|?s5jܐl6㎽ʯ2y%bֲo'?,//&B4"GxJU &ICm\766Cq=|PRAĕxfڪEVsgnaPtxш.yV<{hpIiuu=7-Of2LkԨq s6v}3|~U@,ص}oM".TLjF$D 6Un/?1'daFr!>Wlɓ'OՕC=JpҒ -[[t8y?GCؤh~w6V7M IDATݻQq5j\EZ6ſ[9.3?7GBp]kuɓsD.o|^LW;Y=տ)pxO$Iwg4ʃ+=m断kkkt:m2'=vѰ ^\ zm~|nN_O5C~vHyͿgmuc<ٵk'$ۼ)ڝEqWJ2\'R;Uy<`ڙvQfטN=4US~;iI>A^qΜ=M3$xd5(R&1|zz }6 uڵ_|O/'E667zEqZFU9$ sss,,t_gr!iZv--/~3 r|k(JİrycPEv^_?MUROUzC)Un⁂|Ɩ y=$I>E{9#\FHނwd@yݻG,-.3ཏ&i& ynYX\$ oygX QaOM@5jԸV2WJ-Rc̵yg?hep66R>~յ5΢t[ Vy1 d#sw8 3b|δy;o( JO$$N#wIvۭ|ΓOv~-LS8^Suceu(?_v$M&={nsg?~yVVV *SakQ@tsi6s?/oMn&Ξ9+Ǽ\^̿擟XYd Fsrº)ƅǁWۈ3vl.iT]nU R`8y>j^z%Μ9Vcxp %cq,/`M2f\baaENz??88`0@&nnIFo Z)h2T>x`??7?77$ tiZ|[)><Ί7H {E|NǞ}=e76"2?bd+n#єVϤ-6y pNvyС;=t<쳼IM IBuAȭc~~vIhuڬ^੧|/<}Ξ;+EJ\jԨ1 ѲFsG>!~w?.V[B-//W?oxqvCb40^9hE>9x|Cua?v}kQ`OιcH H8vZp]̴z%T]n9u1} S FMQa5xٽ{7?GÇ [=@l6X\\ F| 'KKEҔ*LKbBoKc}9q?:SAsGbܭV%bsQQ+A:p.rӔY䳈|Z9={nǴ'_.v#T^Hjnu0w+?oY3\gVMӦjc&Ϥg91~{_̙3􊉩RRExJ,Bc{.oy= Ɏ5cϱ.yXLj&ceXF~$ʰ{{}cGg끇v̞z8t6M:V sUHl`?c^c܇?aw=.l䋧7:iAz/da1p7kygΞaտCx xH ZvuHӄ$I(MbyYN61 ol0 u{lnoF2#sY,˰yNXFCuXa+J;++z%h2Zg.,i낟L&+R8ge07Ot8XX#<2"H΅ n |cxtcv +"n;OBa6Ȣ^+K;6k)Q 8ݱc͙QU]"( Jh&5$FĶZ-:Krn.y\g5hh4:`tBѠh晣GWʗ ^xU.\8ϠUA)<r̓?-{0s/<{gʚ_yg \{jD+6v $KeMC)1G?P}F!ǎ<ϳX"D!Ϭ/1Ut?TDJ2 b5YȌ66*>ʹL.5'Ԕ-++S6i z vYe?MŇ9dA틕WkE1X~Pe;.m?PEK3|-IG[$'Tyv#OYr_x@P>O< {+W\}^iMX0T%RyI< y.^8+[(:.h!["ǿ?#dfDy>[a!AhR"{G>n߿kkllm3}OFw94 drh$$33#}tS%xOLZ>"%vm5[e١Nɇ~;W$Mlyx?p80Ȃib{};<{=d'Qڰ:pwr,-.l41ZĀ xJ*RP{'SJ$b]ą $=Q2ŀ")-A/! Jhy//ۨJA& eI:\di a+D6W-g "#1":hZ1AT.Feг &u}iSXJas!lP0Zc)j!%,窱8.s.cVc*W/툢_G}B}Xh{C'%U_*Nl!C[D+֘P:%VP?ط;.ÇTgLZsFkY=66[[]>` hwtudczllleksp@6" 1hllK*wHE4ƈe$`&D4`̄n4Y]$>k-6$>qE]*jTЅ[h/VP=z.$'VL#ѦTuMҔF"$&R8h"X!%1ZH`kKmȱV$!BuhCYX"qF►p!J1$$A !Hڥc)v w^\Xy^2$8g0gcss-66ܦ?%MR&vN9悂jm2Lp-7swk.Fmv G ]N}þow}?Dp8 l0N2|&Y?WqՈfO4x?7$Iעmr~Gڧs%$Mk `mmI7p8dss kG$aa.w@h. qшZFQ_+ڜ(8s2>ze[_d)1As,6`m$\Jxe3Z)ǻʳN(+npJݓMmApQ:€RQ{5F| XP{pJ\u r kP^pKƋ .*  [}lHRc+5y㢕(Y7,pāȳ>D2L|>f`iA'$g$i!IJh C<ȳL;JXJǀ{%B)Y3;nkmN0/!HhTuF8Lb馍N\Ev//ҙlXZ\3ߑ>R& NVI ,g0  GR{Md3Ñnڙw_WVV~q=X9$L#i?I\JdсEl`Q9`Q6)'W @K .UN]˾jJJ QҀXeʗVa28]5@ e&XZzՇi!nPܻT(+-U;*Rup5@rPB&?l K˓{_N\j3fcbb´IeOTc=$QXiF5B23=ƈEOxƵ(0Yd[mZ&NXoI"gm!dэF}66 dYϝs,NZUgNS'^:ʹe1ĭ'VIgZuC:p ^̲~oR>Ƙ8nr;ݪvS|H,hE&4LF)F4MEI$(q7#d٨p dy(g9iJ^F pɂ JHC,y%[N˔9(\VR8=(ТҲ Ď"]L=huB{ ${'9?>h^RI-B:ylhGQU:!R"( ֍ct(s!NM8/@xoTlm%GA@(ybC1|A4tryu nWE_GI5[ |,3bT! ' ĮPe` yR+ru%QV #$wRι~,$\8fp)%^\*I2@ƬBZ, +cH+y3&SFکMi.2$$h%K&$Fa,m6$iJbTcEbLPm-\}8Q]e#3Kr<(ZP/F_E,9b9~)׈xuO{S )1ڤj4=}EfP 0 !(DF|:8H\ 0 O(s ʨAЎ xq˔{.JA.U&2|TX-rd-q򋏷*O'_vPk(E3=xSZi*B-+*,תx]fҷU);6LpgZ(.Z3qGҖKBu(֜-Qǐ}v1Gioŀ~iaMKt]Ǣӏ}.-M_\g8O0K9Xq]">$+}X2|Ȟ+q/!DQlaZ9ڄm_*_&M\yQ2Lgyϭ)8or)yfdu(W&qynWNsSz6 I>\IDAT务ZgZ`rbuA:p .|%v&'N{i!MH $Mߒ$JFҮ%w{صgjJɝŹ|O!4IB6!Fd RI̔!PrKDEoU>>8E.}@rIR +m_+]bGlLѰ . 1(-(8 3'k|q%^a"n LE!ZZxV1;"]Z  E\yS'1hYJߕh$cɇI)TeT1_abC,8EA2"ZCU\WB2++MT.TzRwVb qr|ܺ^җTx<6*F o0xOL,Y96 -./cBY,'9a].m#rq疑X|7^3 8ٳ+_̲ H BDFV oolmv{/_r@7+6S%d4iΛJ:&L%~'4bEHz6Yr{ncZ${fF#ݕ6fVIՐJIB0!I)w>(؀/OQ`>SEROZfrRO%WT7e%q` R{hD*F-[5U۠&=J2U;98ѨUwQ{Et3J^UC`*/ fMvB$ ?U%HJP YQ< w*NauV@?ec`|\ptYP*ʈ(QY,c8n nwes{{u6 MBt.Z;$\ʵoٛN:&\6LfP$I˧J^U2RHL$'iGDknc̒1fIҥf&Ȭpfq8<BjԋzmrLD~.!j3Q oA倮) C_)QCۂНJնCI7^8(ӕ/jQ 06q2$jĻ4Ʒ])\ZNJ8NфbV0&'**Ǐo$Ïn)'`f|JQ웨bFEysuq~짒*oo:.\Hw`ÄoqYٍQhc0me`m,q(X)}$9l<L|t6fҥv]\O|hIJ.& (V=O#T]#(E贅-e6ƴs&a7^7FJ(9Mנ<Muޅ`+(7c,{{Q1DK#(24!آMdDWrsGT3*2TB=2Jhh Ժ"r|*AHyدN;~;P}AeӪ=QyI2B6aӞ')& luO $û%Qm\oERSJ+2e>VE.ݑB#ɻ Q[!GY''Z3>˩ $-60ꍌՇ1lQл;?<_}?> x,F LA0 ~ `tޟd%nA=Cap0o_~U" x|7_ ~M'i۟]{@ڿ#gyzJ7J/J%E)tP( (6 G)Q(5M_3}!-1%a ~q+3f| H7,<>"? \qq8IVZF,>7Z iZUs/ e&د\N l axe"PZ@K` FXRA&YP *@ z@ q0 ^Y0>U v Bb!H ! H2l gBh( JrBf A}HDH!Sq@D W>$bHkkkk6(5[,!evFv5v/QDQ N.NCps\D.-@3\5p^"1I iLj'ggWמ7k>2/~U~n~s$F[BY B,BB BB š‡`DEDEE ebbbb*ST1sDI34)~)a]i`/eeLddeȊzɖ>#ȥuʭɋ_V`P0WRWؤįt^iJQJ9OyDң]UQ5JEZZ>.xΫNVR ixhTjjh55hiykj}Ծ#sCgKWUnRP/GoL^^TƀϠ`P0ѰmdjT`4eie\ojdrdДִ􍙨YY9+ PK`ily򵕐ak+2626I6ö v:vv/h\ g8=pfspt8Ժl?x༫kCBscs vNNvo@{8z4x [ƞ=Wt>zky^Q)[wo_ӿ9@74`-("p+2.h/1ZEGHW(}hP`WX\pê^0"EvF1hpoqtqq .%xRhJ=SR2RK J}&V51;3hc33#2Բ*˖>s?W:(GW2'JN=9Tg  ߞ6?~t&׳gU㊣gKJ:;uGdNٵo{O\кTY[]P9]eX^-X]Ty%Kl?Bf/\WohoD4F7.^q2~UjgDS5zfg--ʭMmmo0iW;;f;;wtwu߸)yӭ۸$ ]{riؐ]wFGz뺯|QSks\eǷ'4'=IMONN{O/<~"ˣЯr^Ӿ.ᘩKkFؾyw~g'/~Avg`q|;˙>_^iytiu~-bmK:zWV3!;[9X]}xqN쏒"?wMw_텓#ȿB$\|}g8wG;SphaxEaQqL䥜e+TjA9 Z2 <}aF%m~b. m\vgAoʹH<$ G| x EUK$HIyJ;ə;)+**>VR0LUҋ47"702X2.Yӱ?ĉߥ!-\12WS_?K}?BC^&FG&FD/?p7 qD+9>LBql#yNt|SwZٰK%=&Jߗ3]P4r qnF+W͚%\/hnhh}ѶҎT2y֍ۏNܽ6<a飡>R{2A9dgSOH~_sm.>/0/-~Xz{SJgU5N؆G6lol^yg==XP*! p\?GA_1YX> J E nʀ 9.M; }< c58\ź~Êsw )ǕWw @!3aaȚk$Kdd)R*SUVPԴЊӮҙC+^5Z20 50ߵ4ʴ~hhl_0$|إ!U^2S+{A!e/yD\܉֎9;/Xt乔TDSX1c+zpR4_kAtӍgN-α(wTU]uf/Tuu IEWZ>jZklki˸q^Z[&'V>WG*? e4a#C'l>՟x0%1-KWKgj|6]| AKA=?ZqljEn]+&jskk];?f&VD:̂ zEa+)((qST* j<JMwLmDfF^Vֻl<q|'IGyDxy%ANB"B"+]bY"ےR 2jr,r -Jaʖ*Tp2zN=SGSKYNE|$_C;# c .8n`>mq߲vI}]]ڹwsrwp&{y{{x(J 8I##Ţ$bbU4Ll%=t*)+x\vnܦO寞-$<#qVȰء\TiZ.<ܨ]Td]V{B}UCy+WK]+^\RzFO{H瓮s7zy݋c+=,3t/Q·acc'=U,N~Zhfdw %ekvv~(P gs\ ' x @:7 tp)42'k ppf :E}$|bCyQ{hKt ; [KCN@iNٌce~*YrMxCmI}FKI;GgEw^ g }LLDz1w`YgGlٻ94898ǹ#Hy<\<Ƽs|"X,!V8ODEY1=uZ 7I:e-9y|?̔+*Sj.8sHVH_@PHX"2ݪغ= h\2J{./3u/!o7b߇젇!a##s͎{ R~t'!wfr֋l͜y'9' Ν]1Y_oDn6ѳo? `@ X! (&"qI 9*5fA1Ԙ0VHaEFEEspNI#5G@@G[JGKEKC!a 3& Db:s'Kk 5vNX\\+I$JR (O/-esw 8lZWz)|HDHb#<O%3Im sSJDM7*Tgk$hkk;XwXZ[Yܱrtq q.quEvsth#b6Im{H stx%R6*>z0:!||䉣ܩi]c̦l<?/f=3Z^tn10)1"1`^f6~ÈJ!HNҌJ>S۪ׯ?ieb`jgi^hfc#onorvNqve:d)]' nz6b/9+5.6~"Q>"tufLlÜ<[rϤ *c?w_Uxv嫗y7]m4؝Aa鑆\N?Č?Z#ʓS`W/Ϲ9 bZKm-?|\]#}}kFf7o3߯l'`g#}~t@ -gND^ůηģ7<80 pHYs   IDATxyuw_3sO&Mp r%x袻Ow]pWr r($!d9LOzjsdz>3VUl L0B #Hxw`8h=ϕhP0^ha3f^c5XT 14 w,ɨHA8 ahɨHg9O쫑05,-F6Y5A2"#8!L P*D {d ys`p6U<;D-@~*IEVTc"H%@r ?m;|ְ2T-+H582i#)_UEJW;D C?glm:u;S(x=7Yg<6y kpyw~,ɥ4m=a H#[X25@>kQ!#Zk_e;[׽c?"C ۝&ӝk`(rVΪ!}?gۼL4"J$=N ɵ rkWHIjO^OOxw#(38cԩS.((k0uwwo{g}[7PP0B ~ Lw n\ppxI<eYF c]0T$Q"x塇[_%5vV*^]Z鍤1 .4SF1lҥ+,Zip,KDBP脓O>Ij.)T7V.,@ 0 |rTTTOlVaa{˖m۲,KmSeMPhϲ,UUU%'ܾ>H226[eM `ms2mJ$V[C<yWɮފ%XդE 5ܳU6q JfWCZR=)зM(ŋUr&NԷvmݺU---d+`۲mJsUiiᰂ`m,R( @ ۶ G댩B--- YmQo[ l^!sEWB[0Hd|x]*Rd U!9HKZ& m zt1MIM eɲTaַ)haP[.P̙ی54YTє$wڳN NT.*HamvffGG5m4M8Qh [TeeFjllTEEEƪ`gY:;;'TRZ"۶Q (F $I== IA͚=Ko{߱-׾ R[N϶?SZ'<:32-@r L\#*$'f;47ShHiG}(Lf|z^=:).6ԫ0-R2)>(Z=\z6_|LU ?B [QR@V*m_VNjx1%SljjReeLp8,ۖ,II*,,Ԕ)S)++fe)* wɶ'ڟӉ+V]]vکNuwu࿩f/X te:cvw|z-$|mGcU__Znz=;w -]T.vi6 $"nGcɹ++C gTt+La_d@ ٨=!M%TBJJo7H1IR!l(@W@GM'h|Y/UjE*K.)V(j))ɒUTB∂EE}x@Ȳ>x< &(+ )vXP(T^2H 5, Y5ܮm;Ծw-[u{eY6mܤrVGd>}o>}LUJR}=sF]OU3OJnYJR[5IW~r>|dGחo|PeuoS uU|}&:bFVss:ix<'Zfx M6-Tjn=?ήLGfuiw<({y#()-۽OSaUL.T($HE)AiJW;XBS 5lVZءT0i" G,H% (X\@@eJc̰@ BҏJ?4uxj  @2,K HekF~*2M:MeuZiw\\xOumxYh~y$u[7vt,K\{=㭺K_CϜ{ݢZIϿG'O tM,+s? ܳOR|"svF%ZQ@4k>}<>Ӥ".ӇSwuǎк?*u ;.IJ&j3g{?I~mۢu^zNG׬?? ]}iZ?>3MO(qZ˗/Wss-[ZܥP(s[m3DDܪt^0*$'f ף%7Ȃy.M$UJReT7vZZVMu ȘY *XR,E#RaD Gz,= R<ԡxŬ ýHꖪ@?$˲ׁ;˲ uTDm[?G[~[߬󎩔  =?շֶs#zҧq{mKJU0I_\wo0]VQwrLkӹE[g}E[\g^3CAojԞv<[toݺU=܀c|O}v89؝a֥52'V{^ShJf|@.5_vTس[SDW쬾oe);Okܭ}=Zpޕ?OYgoU=ҙ~zOSS%񬪪JhlٲE7|&M4Rm4pCVtخn|p.9ua{w70zã\*O)B!)6Y(|Q4:׾]{5\ Hpop}lI{KDX\Ʉ6Ң\N=R"PEEHy0KUt`Pk_QLPHTZg^DNP0T9uU~Q:jzg[$V2Tt]?>/:|JTw<ͭ(Pu~%}oIZ;?$}tYU݊ E1Jҡoйbmk6ND$^ˍ2p;+(n۪8 ~EEVREEc LhwgL T՜LfL;hG*Ԛ"9/$l+;g{fDq>eD͊D"*--솤#Y%%%Q'T,?(M7M3f, * 0ܹ]g:l i駯ЏG6W-nKJ[V2"}ߩ;;>޿̗oOJC(H75^J{; {t)Ֆq{ySz}Gua$=HrB]X^V^aO7|4ӾYrSw5yPPR@jlmQmJ,)ښm(&Th´Rѣ]ҪXJV͢o]]]*//WIIIh<W,SKKˀ7˲l2M4Ie[i} ZfMW䲈bvmU;*(![X?ְ] 9IGan]ZRn-g1ӦMӜ9sVOw^Iom gx3km{-8u+;w ^"i}~|vs4Xم8jXB_ҝ~V)ɅC2˹gp6Ȣãel#1?'<M0VEQv4Y:Sj[W纍xRE"gήuZe.~ijJw5n'@MEZ2Qt 7'k1mY6NTQa\[wԐY.z0HZ'iΜ*\w:I7`zCAY*FHSL=+}y+6CLRbV 1cD"==jjms\Lr,W#9&!NQW</PQ7@rI7zWbZ~0Ve6#1|g@V13+?R֍3c Cs^~A+^|W@d[&}\Oo!Q~kE̾ #0B #0B #0B #0B #0B #0B #0B #0B #0B #0B #0B #0B #0B #0B #0B #0B #0B #0B #0B #0BG{ᰧI[שC=;8Dª(i4kޝA`\ZyܣhHS TTT@ @ 0ڻqʲ,ٮuhOC͜G{׆qe]jנ# &T m۲m[x\jjj;[:産fv3t7io>-YfZhTp & dR]]]jnnVIIסs.ކMTYfjƌ*//W$KH"Pqq:Φq q#HhʤjUWW\ B] P0T$QYY&Lɓ&(]Vӣ-w0Pqq @ p8"`|wojɒ%O?֒%KN9]zzdYVNԤO>YK,ы/Ӻ7O|"o "D"TUj$ <d|;+Vٳ%kݻW]g?{[O<ɤ$ҥKe+79F[j-ʕ+u) teiժUkGт TRR?OT4݆@@Ɣ`p|w >k…ڹs٣3gf]gƍڸq:^ӳ>;oвo~m޼Y ,Ѕ^M??Pyy>iժUjhh7,Ijnn߮zKeוW^i%եUV駟VSS̙+WK.i0޿3޿̌x̓N^Z`P'O#<`0+V3T(c=6h^zIf-ZHmmmҗw}hk_?y=C*))$ܹSW\qz)yZx~i]}ڴiStw#E]ftMկ~2agŁVT  ھ}lذAO=:::b dF"OYՒN:IWVCC&NNmJZJ&M$Ѝ7ިy\[o3Oz饗 7ܠIR<ϺhWq ?J9EEE;wϟPIA<$io~#Ic= [n$-\p@@555ڹsgN˥z!I۶m$ m۶)Lj:?_sN:$-_)//Ϻhq8f=[ou 6V555jnn$ף lr)n&ICccy&Lвe׿+Wꡇ /W_}Uv.b}hG3޿ yO*H覛n'<`K/믿^?/o裏l]]]cyIǻvٶn۶:(uQ~[?ꢋ.ҢE|-3:%<=@ʖg?***l2ESO=Uzevk6`vor^Νh4}_Ԋ+L&OԚ5kq655Zf8I$6oެ 6vn :ӵw^3g;< ;k._^_tM]KqqmݺUvvڥ;voK/+RPH{JJJLZ~#hYqtaQj|ʕ˜}zGc׾5b1~%I^z-Z7x=y٩ȭ2]{+$IwoQ׭֍7ިJIh0^`dlۻ8+۽-wK~ 9i[jk֬طcرC ,PUUՐҢ 6(Wiie{視A&M]2#m̙9s樢bTvm߾]nڢY|fɒ%$KRBR2HnMKwlcv#fΜ)~RQQO<12M01q15OA`ƍ@`oS~ƍ`0D2I`Y7H"ᐺ `4ض-˲y*FqPmPOO!g۶ԪޥaE`(*,PQalۡVuwS`dx<6cz*fRā@0#֭֭ה)UUYb~+&5ݣ&kP2TUyɸB4q% 4Ν{dYh`PpHEquB`\*,02ڻk㻾 `!@F`!@F`!@F`!@F`!@F`!@F`!@F`!@F£cY,Skk:::ehQDDTRRrn8EWWUSSy橸.)i˖-U$ɓUTT4ڻ6b6رCs/^@ 0ڻ` J}8qN8[Njjj/I}8uG| :#uyijkk]Hn״iF{w&O+WjǎvH{ɓG{WMc9Fuuu+ÎQoU<ŋG{W/V<W,]VV0 /jjj:ڻ2I7ohqd޼yVx<~v`d+n +D+..VOOhư"@$.O.eQ? G̛U҇u./w&M(3~}Ei9p]qIu$_^٬4kZ?d>e6]]qM*Q`TpC`lزW;4KZ$O$!۴KG6s>q]ڼڦuڴNϿ|T|[[_sN9|_B`G>SO8th7SUþ>6oW0>}=uviҷamݱO?i{W~ n :v,y7)ٶ_b};JprڴN'=WX-ڿxuuj mZ$]pQd񒤊[߮}m\]vΧֆjkҼO{f 5Z<Β$n~hj}s+eYv;ƭVk_S.:]- /EsfL$ݰKO/۴unU\яQ,!@0vi[0m!SU uKz IҚ$Iok҄RkOgWo㿸VHH5Ϟ$鷏Q(x=juKN:zIG-WgIgw~ƖF4L6ҷ~Zc'] Binkod{?mJ$Xg\,koHH>7o?xLկX}m7굷y;߿;i񅌃֟t>v ^KZbڱIfM$ NX6]u*5uznoۮ}9gj5thaT^oYEspܷomg/]sN9\s zI-Qa͜Z3.Oh CIқ$-?iK-?R?iǺU!l>wZP3ev3}W~yʋ~nUWģO@6Fy³i ~0:h @@*+-҅5o A6 iUHK[nO4uvA~aaXpH= u$\_# fUyK5yBl[Z숬]x 0LR`0 ּۖ;LZZƖU#fKnj XgnOziBE͘__ݓP0мY5iBQc{2{F85N9UEv.3oJ `8P`\),³փ|C_:gZqviκ>}UZq>ҢC7pU yK/>q]:td=ے>ZU:tNonoЕxfM/c #|]axMJ$9?^]άL\ *;_,z!J$,= C73Y-z٣U%/$͛9Q7룪(ۛv~S= ]pQ5HfMg/]p8w/3z?>H[[}Ї*1.$۽-wK~ 9i[jk֬ffo>O`oUgwΨ5whM,֬iqXO&-Ӥ.͛YAI5i0$Z:UTVI0DR~JZ㋚:u14wy:(,YiIH$%$%nVߴ{vnu #@$mV DRqq"֭[7ڻ`Xn"ȸ'@L2Eov=ڻVWWW_}USLɾSXX3gW]]hݻ#F(8$MYY=P=cZv-c"|m[k׮O?yu(..i&_^555bbl٢ZE"H!@\jيbڻwjkkǩJ(((DӦM;(` Pu7@F`!@F`!@F`!@F`!@F`!@F`!@F`!@F`!@F`!@F`!@F`!@F`!@F`!@F`!@F`!@F`!@F`!@F`!@F`!@F`!@F`!@F`!@F`!@F`!@F`!@F`!@F`!@F`!@F`!@F`!@F`!@F`!@F`!@F`!@F`!@F`!@F`!@F`!@F`!@F`!@F`!@F`!@F`!@F`!@F`!@F`!@F`!@F`!@F`!@F`!@F`!@F`!@F`!@F`!@F`!@F`!@F`!@F`!@F`!@F`!@F`!@F`!@F`!@F`!@F`!@F`!@Fb}7@1.;@ޠsׇ F[ k@lsDq:6vXwKR,Ⰵh1նok'sy v0߁k;C@rv +vOs^o ^CK[k p[cFYqLs/@LWƭM֎f^l{[@ 4>82=86-踅Ҧ}s[?I߿w_^U@z#L{n9niɾ[dmC}eVk^vez !c+{έD$IwGzI )\u9osz"e,)g5utA tL p<@ W*69M45]ImvtcL uu|s gxI3xdq  qZ2^aBq.L+ix*AJ#=$ᑪ2Rϥ@rkR^ar> 4-S$S8?dg3 *g"\d@Ac\qn+2c%Wxdz^I>rLh`H1 taycɽ4"nת$@ e܂ۇ^<ح!@ I ΠpV|GK8ëk9n+gwW޵eGޭq. n$?3H-i{m,j"SwvUJz:YHpF^@llGiejCIyy [%vS*0ZΪ#SA[U}d0#Ynn)!HT Pq; n #[g9|r~NuVnVt:s[@W"wayU^~*īRV@I8n]6օ\^`.SVl]Y]t1zʴr .(rr]% ~ÙҏJ?L7ʹWTon {;һueyWWewe ae xw$H]Vme SՃߊĭO0rqNrp[* z_+kJ.e> ?_M7 H $HMs;10Ct * cUc^ \^//^o8U{9nar\1L 5D$n)I29@_${H=r0ؚV' @>"bD#.C@.4HUrCXb( lNdpJ ؁d&#0FhqC4@JIDATځ4 `3 ~4ƺ!W9!@F`JE2.IENDB`gsoap-2.8.28/gsoap/ios_plugin/ios_plugin/docs/calc-view.eps0000644000175000017500000532625112653650146023256 0ustar ellertellert%!PS-Adobe-3.0 EPSF-3.0 %%Creator: (ImageMagick) %%Title: (calc-view.eps) %%CreationDate: (2012-06-08T00:59:58-04:00) %%BoundingBox: 0 0 400 582 %%HiResBoundingBox: 0 0 399.95 582 %%DocumentData: Clean7Bit %%LanguageLevel: 1 %%Pages: 1 %%EndComments %%BeginDefaults %%EndDefaults %%BeginProlog % % Display a color image. The image is displayed in color on % Postscript viewers or printers that support color, otherwise % it is displayed as grayscale. % /DirectClassPacket { % % Get a DirectClass packet. % % Parameters: % red. % green. % blue. % length: number of pixels minus one of this color (optional). % currentfile color_packet readhexstring pop pop compression 0 eq { /number_pixels 3 def } { currentfile byte readhexstring pop 0 get /number_pixels exch 1 add 3 mul def } ifelse 0 3 number_pixels 1 sub { pixels exch color_packet putinterval } for pixels 0 number_pixels getinterval } bind def /DirectClassImage { % % Display a DirectClass image. % systemdict /colorimage known { columns rows 8 [ columns 0 0 rows neg 0 rows ] { DirectClassPacket } false 3 colorimage } { % % No colorimage operator; convert to grayscale. % columns rows 8 [ columns 0 0 rows neg 0 rows ] { GrayDirectClassPacket } image } ifelse } bind def /GrayDirectClassPacket { % % Get a DirectClass packet; convert to grayscale. % % Parameters: % red % green % blue % length: number of pixels minus one of this color (optional). % currentfile color_packet readhexstring pop pop color_packet 0 get 0.299 mul color_packet 1 get 0.587 mul add color_packet 2 get 0.114 mul add cvi /gray_packet exch def compression 0 eq { /number_pixels 1 def } { currentfile byte readhexstring pop 0 get /number_pixels exch 1 add def } ifelse 0 1 number_pixels 1 sub { pixels exch gray_packet put } for pixels 0 number_pixels getinterval } bind def /GrayPseudoClassPacket { % % Get a PseudoClass packet; convert to grayscale. % % Parameters: % index: index into the colormap. % length: number of pixels minus one of this color (optional). % currentfile byte readhexstring pop 0 get /offset exch 3 mul def /color_packet colormap offset 3 getinterval def color_packet 0 get 0.299 mul color_packet 1 get 0.587 mul add color_packet 2 get 0.114 mul add cvi /gray_packet exch def compression 0 eq { /number_pixels 1 def } { currentfile byte readhexstring pop 0 get /number_pixels exch 1 add def } ifelse 0 1 number_pixels 1 sub { pixels exch gray_packet put } for pixels 0 number_pixels getinterval } bind def /PseudoClassPacket { % % Get a PseudoClass packet. % % Parameters: % index: index into the colormap. % length: number of pixels minus one of this color (optional). % currentfile byte readhexstring pop 0 get /offset exch 3 mul def /color_packet colormap offset 3 getinterval def compression 0 eq { /number_pixels 3 def } { currentfile byte readhexstring pop 0 get /number_pixels exch 1 add 3 mul def } ifelse 0 3 number_pixels 1 sub { pixels exch color_packet putinterval } for pixels 0 number_pixels getinterval } bind def /PseudoClassImage { % % Display a PseudoClass image. % % Parameters: % class: 0-PseudoClass or 1-Grayscale. % currentfile buffer readline pop token pop /class exch def pop class 0 gt { currentfile buffer readline pop token pop /depth exch def pop /grays columns 8 add depth sub depth mul 8 idiv string def columns rows depth [ columns 0 0 rows neg 0 rows ] { currentfile grays readhexstring pop } image } { % % Parameters: % colors: number of colors in the colormap. % colormap: red, green, blue color packets. % currentfile buffer readline pop token pop /colors exch def pop /colors colors 3 mul def /colormap colors string def currentfile colormap readhexstring pop pop systemdict /colorimage known { columns rows 8 [ columns 0 0 rows neg 0 rows ] { PseudoClassPacket } false 3 colorimage } { % % No colorimage operator; convert to grayscale. % columns rows 8 [ columns 0 0 rows neg 0 rows ] { GrayPseudoClassPacket } image } ifelse } ifelse } bind def /DisplayImage { % % Display a DirectClass or PseudoClass image. % % Parameters: % x & y translation. % x & y scale. % label pointsize. % image label. % image columns & rows. % class: 0-DirectClass or 1-PseudoClass. % compression: 0-none or 1-RunlengthEncoded. % hex color packets. % gsave /buffer 512 string def /byte 1 string def /color_packet 3 string def /pixels 768 string def currentfile buffer readline pop token pop /x exch def token pop /y exch def pop x y translate currentfile buffer readline pop token pop /x exch def token pop /y exch def pop currentfile buffer readline pop token pop /pointsize exch def pop /Times-Roman findfont pointsize scalefont setfont x y scale currentfile buffer readline pop token pop /columns exch def token pop /rows exch def pop currentfile buffer readline pop token pop /class exch def pop currentfile buffer readline pop token pop /compression exch def pop class 0 gt { PseudoClassImage } { DirectClassImage } ifelse } bind def %%EndProlog %%Page: 1 1 %%PageBoundingBox: 0 0 400 582 userdict begin DisplayImage 0 0 399.95 581.927 12.000000 400 582 0 0 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000838383C4C4C4DCDCDCE2E2E2E2E2E2E2E2E2E2E2E2E2E2E2 E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2 E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2 E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2 E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2 E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2 E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2 E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2 E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2 E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2 E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2 E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2 E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2 E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2 E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2 E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2 E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2 E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2 E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2 E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2 E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2 E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2 E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2 E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2 E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2DBDBDBC5C5C5848484000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000848484D2D2D2D6D6D6D1D1D1CFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCF CFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCF CFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCF CFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCF CFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCF CFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCF CFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCF CFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCF CFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCF CFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCF CFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCF CFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCF CFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCF CFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCF CFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCF CFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCF CFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCF CFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCF CFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCF CFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCF CFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCF CFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCF CFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCF CFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCF CFCFCFCFCFCFCFCFCFCFCFCFCFCFCFD1D1D1D6D6D6D2D2D2848484000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000BEBEBED0D0D0 CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD CDCDCDCDCDCDCDCDCDCDCDCDD0D0D0BCBCBC000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CDCDCDCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CACACAD1D1D1E4E4E4E4E4E4E3E4E3E2E3E2E0E1E0DFE0DFD6D7D6D5D5D5C8C8C8CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCDCDCD000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CCCCCCCACACACACACACACACACACACACACACACACACACACACA C9C9C9C5C5C5BEBEBEB1AAAA9064667C3B3E7933357933357B3A3E906466B1AAAABEBEBEC5C5C5 C9C9C9CACACACACACACACACACACACACACACACACACACACACAC9C9C9C5C5C5BEBEBEB6AAA9A86162 A23536A32D2DA32D2DA23536A86162B6AAA9BEBEBEC5C5C5C9C9C9CACACACACACACACACACACACA CACACACACACACACACAC9C9C9C7C7C7C3C3C3B7B7B7979797888888868887878786868686979797 B7B7B7C3C3C3C7C7C7C9C9C9CACACACACACACACACACACACACACACACACACACACACACACACACACACA CACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACA CACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACA CACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACA CACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACA CACACACACACACACACACACACACACACACACACACACACACACACACACACACACACAC8C8C8D4D4D4E7E7E7 E7E7E7E5E6E5E4E5E4E3E4E3E2E3E2DBDBDBD1D2D1D7D7D7C8C8C8CACACACACACACACACACACACA CACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACA CACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACA CACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACA CACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACA CACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACA CACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACA CACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACA CACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACA CACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACA CACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACA CACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACA CACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACA CACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACCCCCC 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C3C3C3BABABA9C7F82 74232980313494484CA36567A3646794474B7F30347423279C7F82BABABAC3C3C3C8C8C8C8C8C8 C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C3C3C3BABABAAD817DA3271EAD392EBD564AC67169C7726B BD574BAE3B2FA3271EAD817DBABABAC3C3C3C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8 C5C5C5C0C0C0A5A5A58484849090909C9C9BA6A6A5A4A4A49A9A998E8E8E828282A5A5A5C0C0C0 C5C5C5C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8 C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8 C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8 C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8 C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8 C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C6C6C6D5D6D6E8E9E8E8E9E8E7E9E8E7E7E7 E5E6E5E4E5E4E0E0E0C4C5C4D7D7D7D6D7D6C6C6C6C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8 C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8 C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8 C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8 C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8 C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8 C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8 C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8 C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8 C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8 C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8 C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8 C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8 C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000C6C6C6 C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6BCBCBC9C8081761C2393252EBC4349E18F93 F8DFDFF8DCDDE08B8FBC3F4793252C761C239C8081BCBCBCC6C6C6C6C6C6C6C6C6C6C6C6C6C6C6 C6C6C6C6C6C6BCBCBCAC827EA82712BC421CD8713CE9AD86F7E8D8F7EADAEBB08BD9723FBC431C A82712AC827EBCBCBCC6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6BFBFBFA5A5A58A8A8A 9A9B9AB1B1B0C6C7C5D6D6D4D4D4D3C4C4C2AFAFAE9A9A9A8A8A8AA5A5A5BFBFBFC6C6C6C6C6C6 C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6 C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6 C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6 C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6 C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6 C6C6C6C6C6C6C6C6C6C6C6C6C4C4C4D8D8D8EBECEBEBECEBEAEAEAE8E9E8E7E9E8E7E8E7E3E5E4 BDBFBEE4E4E4DDDDDDD7D8D7C5C5C5C6C6C6C6C6C6C6C6C6C6C6C6C6C6BC8A654747658ABFC6C6 C6C6C6C6C6C6C6C6C6C6C6B57B503E6B8EAEAA8E6B3D5D85BCC6C6C6C6C6C6C6C6C6C6C6C6C6C6 C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6 C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6 C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6 C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6 C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6 C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6 C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6 C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6 C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6 C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6 C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6 C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000C4C4C4C4C4C4C4C4C4C4C4C4 C4C4C4C4C4C4C4C4C4C4C4C4AFA8A87C242C9C1B25CC142BE42E3CF2676FF9A6A9F9A4A7F1646A E42A3BCC14299C1B257C242CAFA8A8C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4B2A8A7 AA3314C14A0CE07214E88936EFAA6CF5D0ACF5D1AEEFAC70E98A37E07217C14A0CAA3314B2A8A7 C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4B4B4B4939393A3A3A3B7B7B7C0C0BFC7C7C6 CECECDCDCDCCC4C4C4BFBFBFB7B7B7A3A3A3939393B4B4B4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4 C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4 C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4 C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4 C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4 C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4 C4C4C4C2C2C2DADBDAEDEEEDE4E5E4E0E0E0EBECEBEAEBEAE5E3E4E4E5E4C4C4C4E4E4E4D7D7D9 D7D7D9E2E3E2C4C4C4C4C4C4C4C4C4C4C4C4C4C4C7AC854E00002693B4C4C4C4C4C4C4C4C4C4C4 BEA57C0000008AB3C3A77B35000077B9C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4 C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4 C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4 C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4 C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4 C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4 C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4 C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4 C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4 C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4 C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4 C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4838383C4C4C4C4C4C4C4C4C4 C4C4C4C4C4C4C4C4C4C4C4C4000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1 C1C1C196686C8E1F26D20A26EA0023F60027FD2B3DFF5760FF545DFD293AF60027EA0023D20A26 8E1F2696686CC1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1AB6E5DB64410E67E1BEC8C27 F09935F4A84FF6BB72F6BB73F3A950F09A36EC8C27E67E1BB64410AB6E5DC1C1C1C1C1C1C1C1C1 C1C1C1C1C1C1C1C1C1C1C1C1A3A3A3A3A3A3BABABABEBEBEBFBFBFC2C2C2C5C7C6C6C6C5C2C2C2 BFBFBFBEBEBEBABABAA3A3A3A3A3A3C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1 C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1 C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1 C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1 C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1 C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1BFBFBFDCDCDC F0F0F0F0F0F0EFEFEFEDEEEDE9E9E9B3A4A6E9EBEAAEAEAEA9AAA9A0A1A0999999CBCBCBC1C1C1 C1C1C1C1C1C1C1C1C1C1C1C1CABF9F2700004A80A3C1C1C1C1C1C1C1C1C1956626002775BFC8C3 CAD2D9DADAD3C5C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1 C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1 C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1 C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1 C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1 C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1 C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1 C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1 C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1 C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1 C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1ACACAC3B3B3B 110F110B0B0B2B2B2B878787C1C1C1989898222222C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1 C1C1C1000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000BFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBF9D3F46BB1929 EB0025FC0024FF0024FF0029FF1933FF1933FF0529FF0026FC0026EB0227BB19299D4147BFBFBF BFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBA5C27D46D1CEE942FF3A43BF7AF45FAB84DFCBE57 FCBE55FAB84DF7AF45F3A43BEE942FD46D1CBA5C28BFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBF BFBFBF9E9E9EB0B0B0BEBEBEC1C1C1C2C2C2C3C3C3C5C5C5C4C4C4C3C3C3C2C2C2C1C1C1BEBEBE B0B0B09E9E9EBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBF BFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBF BFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBF BFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBF BFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBF BFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBDBDBDDFDFDFF2F2F2F2F2F2F0F2F1 F0F0F0DCCED0C4858ADDD4D2EBEBEBD4D5D4D2D3D2ADADADD7D7D9BFBFBFBFBFBFBFBFBFBFBFBF BFBFBFBFC4C48C4E0000256BAFBFBFBFBFBFBFBCA15200004E8CB1C4BFBFA4805A224C7CB6BFBF BFBFBFBFB29D613B000000000000227292ACBFBFBFA17C4D224577B2BFBFBFBFBFAF926C22003B 85A8B9BFBFBFBFB9A1542222779DB6BFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBF BFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBF BFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBF BFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBF BFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBF BFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBF BFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBF BFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBF BFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBF BFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFAFAFAF1D1D1D2525252D2D2D2D2D2D282828 1919195252522222223B3B3BBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 BDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDAA2633D21A2DFA1630FF1E33FF2639 FF2E3EFF3342FF3544FF3040FF2A3BFF2336FA1932D21A2EAA2633BDBDBDBDBDBDBDBDBDBDBDBD BDBDBDBDBDBDBDBDBDC6631CE1892EF4A941F9B94BFDC354FFCA59FFCD5BFFCD5BFFCA59FDC453 F9B94DF4A941E1892EC6631CBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBD9F9F9FB7B7B7 C0C0C0C3C3C3C4C4C4C6C6C6C7C7C7C7C7C7C6C6C6C4C4C4C3C3C3C0C0C0B7B7B79F9F9FBDBDBD BDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBD BDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBD BDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBD BDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBD BDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBD BDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBBBBBBDFE0DFF4F5F4F4F5F4F3F3F3DADDE1847B8EEBE7E9 DC8C93ECEDEDECEDEDEBEBEBD7D8D7D7D8D7BDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBFBC9D6D 000000799FB7BDBDBDB0956B0000279DBCC6BDBDBDA27434002574B7BDBDBDBDA65A0000004C80 B5C5C19F80560000238CADBDB5986C0000258FADBDBDBDB77E4800000000497FA1BDBDBDB09265 000043AABFC0BDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBD BDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBD BDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBD BDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBD BDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBD BDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBD BDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBD BDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBD BDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBD BDBDBDBDBDBDBDBDBDBDBDBD5D5D5D8A8A8ACDCDCDC9C9C98E8E8E343434343434262626313131 404040BDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBD000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000BABABABABABABABABA BABABABABABABABABABABABABABABAB02F3BD92737FF3340FF3E4AFF4A54FF565FFF6269FF636A FF5A62FF4D57FF414DFF3644DA2B39AF333CBABABABABABABABABABABABABABABABABABABABABA C76B25E4983BF9BA4EFDC85AFFD160FFD764FFDC69FFDC69FFD864FFD260FDC85AF9BA4FE4983B C76B25BABABABABABABABABABABABABABABABABABABABABAA0A0A0B8B8B8C3C3C3C5C5C5C8C8C8 CACACACCCCCCCCCCCCCACACAC8C8C8C5C5C5C3C3C3B8B8B8A0A0A0BABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABAB8B8B8E2E2E2F6F6F6B8B5AEB6B5BCDACB65898984BEC6C3BA7E7BC0ABAABCBAB0 A3A2A0ECEDEDD9DAD9BABABABABABABABABABABABABABABABABABABFC1AA4D000025638FBABABA 84500000438AC1BFBABABABAA17A3500257AB4BABAB19973000000668DA5AFA8ACB0A98D260000 6C96AEBFBEA23600005885A7BAB7973F0000000000003F79B7BABA845000005E98C4BCBABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABA707070CACACABDBDBDBEBEBECBCBCB999999393939393939393939434343BABABABABABA BABABABABABABABABABABABABABABA000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8 B8B8B8B8B8B8B5565CD3343FFF4A55FF5961FF696FFF797EFF878BFF878BFF7C81FF6D73FF5D65 FF4E58D33842B6575DB8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8C27A42DF9A44FBC65A FFD364FFDC69FFE36EFFE773FFE873FFE36FFFDC69FFD564FCC75ADF9B44C27A42B8B8B8B8B8B8 B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8A4A4A4B6B6B6C4C4C4C8C8C8CBCBCBCECECECFCFCFCFCFCF CECECECBCBCBC8C8C8C5C5C5B6B6B6A4A4A4B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8 B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8 B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8 B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8 B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8 B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B6B6B6 E3E5E4F8F9F8E6D7C2E7D065D1B145EDDABBE8C377DEBE9BA0949AEADBAABCAA8AEFEFEFDBDBDB B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8BAC29F6C260000579BA9943E0000659CB5BAB8B8 B8B8B8A07835002578B2B8B8B5A37E00000000000000000000000000002680A1B3B8BBBE894200 0058849E8D63000072AEA67E00003F95A29448000072A7BAB8B8B8B8B8B8B8B8B8B8B8B8B8B8B8 B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8 B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8 B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8 B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8 B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8 B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8 B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8 B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8 B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8AAAAAAB8B8B8 B8B8B8B8B8B8ABABAB5B5B5B3E3E3E3E3E3E3E3E3E474747B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8 B8B8B8B8B8B8000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6BA8486 BE3C43FF5E66FF7076FF8286FF9497FFA0A3FFA1A3FF9699FF8589FF757AFF6369BE3F45BA8487 B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6BC9274CF8F43FCCD61FFDC6AFFE36FFFE975 FFEE79FFEE7AFFEA76FFE370FFDC6AFBCE61D08F41BC9274B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6 B6B6B6B6B6B6ADADADACACACC4C4C4CACACACDCDCDD0D0D0D2D2D2D2D2D2D0D0D0CDCDCDCACACA C4C4C4ACACACADADADB6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6 B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6 B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6 B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6 B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6 B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B4B4B4E6E6E6FAFAFAF5F5F3 DDBE26CCCBCFF0F1F1F5F5F4EBECEC8E9196BEBFBDEDEDEDF1F1F1DEDEDEB6B6B6B6B6B6B6B6B6 B6B6B6B6B6B6B6B6B6B6B6B6BDAC8800000022220000004CA5BEBCB6B6B6B6B6B69E7834002578 B0B6B6AF9A7200000078A9C9D3D3D3D3D3D3D3D3D2C9C1B9B6B6B8B08C5D0000243100004278A8 C1BFA6420000233023000055ACBFBAB6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6 B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6 B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6 B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6 B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6 B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6 B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6 B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6 B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6 B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6BBBBBBB6B6B6B6B6B6959595252525 3A3A3A4141414141414141414A4A4AB6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3BEB5B5BC5C62DD6569FF8488 FF9699FFA5A7FFAFB1FFAFB1FFA6A9FF999CFF878BDF696DBC6064BEB5B5B3B3B3B3B3B3B3B3B3 B3B3B3B3B3B3B3B3B3B3B3B3BDB7B4C68A46E2B55AFFE06FFFE775FFED79FFF07CFFEF7CFFEE7A FFE876FFE170E2B65AC68B46BDB7B4B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B7B7B7 A8A8A8BCBCBCCBCBCBCECECED1D1D1D2D2D2D2D2D2D1D1D1CECECECBCBCBBCBCBCA8A8A8B7B7B7 B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3 B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3 B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3 B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3 B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3 B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B1B1B1E7E7E7FCFCFCC8C385B3AA93E1E1E1F9F9F9 F9F9F9F7F8F7F4F4F4C3AE90F2F2F1F4F4F4E0E0E0B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3 B3B3B3B5BDB5712600000000266394BFB5B3B3B3B3B3B3B39C7734002477ADB3B3B6BCB1630000 0000498193A1AAAAA79A938C93A4ADB3B3B3BBB49326000000000086ADB8B3B4B8864B00000000 266A9CBDB4B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3 B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3 B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3 B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3 B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3 B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3 B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3 B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3 B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3 B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B4B4B4B3B3B3B3B3B3B9B9B9CECECED1D1D1D1D1D1D1D1D1 D1D1D1D0D0D0B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000B0B0B0B0B0B0 B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B2B2B2C1A1A3C46D6FE68D90FFA1A4FFAFB1FFB7B9 FFB8BAFFB1B3FFA3A5E69092C67073C2A2A3B2B2B2B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0 B0B0B0B2B2B2BEA998C9984DE7C666FFE877FFED7BFFF07CFFEF7CFFEE7BFEE877E7C867CA994F BEA998B2B2B2B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B1B1B1B3B3B3ACACACC1C1C1 CDCDCDD0D0D0D2D2D2D2D2D2D0D0D0CDCDCDC1C1C1ACACACB3B3B3B1B1B1B0B0B0B0B0B0B0B0B0 B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0 B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0 B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0 B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0 B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0 B0B0B0B0B0B0B0B0B0AEAEAEE9E9E9FDFDFDBAB6B3CBCBCCFCFCFCFBFBFBFAFAFAF9F9F9F9F9F9 C9C1B6D7D7D4F5F5F5E1E1E1B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B6AB8B5C 0000007BA1B4B0B0B0B0B0B0B0B0B09B7B3F003476ABB0B0B0B1B8C9C2AB6A4100000000000000 0000007096A9B0B0B0B0B6B476350000256AB0B9B2B0B0B2AC8E5C00000081A5B6B0B0B0B0B0B0 B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0 B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0 B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0 B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0 B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0 B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0 B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0 B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0 B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0 B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0 B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000AFAFAFAFAFAFAFAFAFAFAFAFAFAFAF AFAFAFAFAFAFAFAFAFADADADBBBBBBC3A4A5C6797DDB9C9EEEABADF7B3B4F7B3B5EEACAEDC9E9F C77D80C3A4A5BBBBBBADADADAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFADADADBBBBBB BEAB9AC79B56DCBD65EED671F8E277F7E378EFD872DDBE66C89D58BEAB9ABBBBBBADADADAFAFAF AFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFADADADB5B5B5B5B5B5ADADADBBBBBBC6C6C6CBCBCB CBCBCBC6C6C6BCBCBCADADADB5B5B5B5B5B5ADADADAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAF AFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAF AFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAF AFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAF AFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAF AFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAF ADADADEAEAEAFFFFFFFFFFFFFEFEFEFDFDFDFCFDFDFCFDFCFBFBFBFAFAFAF9F9F9F8F8F8F8F8F8 E4E4E4AFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFB9C2CACFCFCFC5BCB4AFAFAF AFAFAFAFAFAFBBC4CDCFCDC5B3AFAFAFAFAFAFB4BBC8CCCFC8C5C1C1C1C5CCCFCFC5BBB3AFAFAF AFAFB4C6CDCFCFCEC8B6AFAFAFAFAFB7C1CACFCFCFC4BBB3AFAFAFAFAFAFAFAFAFAFAFAFAFAFAF AFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAF AFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAF AFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAF AFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAF AFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAF AFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAF AFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAF AFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAF AFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAF AFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAF AFAFAFAFAFAFAFAFAF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000ADADADADADADADADADADADADADADADADADADADADADADADAD ACACACACACACBABABACBC3C4C19394C7898CD19497D19598C78B8CC29394CBC3C4BABABAACACAC ACACACADADADADADADADADADADADADADADADADADADADADADACACACACACACBABABACAC5C2BA9F81 C29D64D2AB60D1AC61C39F65BA9F82CAC5C2BABABAACACACACACACADADADADADADADADADADADAD ADADADADADADADADADACACACACACACB5B5B5BDBDBDB2B2B2AFAFAFB2B2B2B2B2B2AFAFAFB2B2B2 BDBDBDB5B5B5ACACACACACACADADADADADADADADADADADADADADADADADADADADADADADADADADAD ADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADAD ADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADAD ADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADAD ADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADAD ADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADABABABEAEAEAFFFFFF FFFFFFFFFFFFFFFFFFFEFEFEFEFEFEFDFDFDFCFDFCFBFCFBFAFAFAF9F9F9E5E5E5ADADADADADAD ADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADAD ADADADADADADADADADADADADADADADB0B1B2B2B2B1AEADADADADADADADADADADADADADADADADAD ADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADAD ADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADAD ADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADAD ADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADAD ADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADAD ADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADAD ADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADAD ADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADAD ADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADAD ADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADAD ADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADAD 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000ABABABABABABABABABABABABABABABABABABABABABABABABABABABA9A9A9ABABAB B0B0B0BFBFBFCBCBCBD0D0D0D0D0D0CBCBCBBFBFBFB0B0B0ABABABA9A9A9ABABABABABABABABAB ABABABABABABABABABABABABABABABABABABA9A9A9ABABABB0B0B0BFBFBFCBCBCBD0D0D0D0D0D0 CBCBCBBFBFBFB0B0B0ABABABA9A9A9ABABABABABABABABABABABABABABABABABABABABABABABAB ABABABAAAAAAAAAAAAAEAEAEB7B7B7BEBEBEC1C1C1C1C1C1BEBEBEB7B7B7AEAEAEAAAAAAAAAAAA ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABAB818181737373737373737373737373 7373737373737373737373737373737373737373738C8C8CABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000A9A9A9 A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A8A8A8A9A9A9A9A9A9ABABAB ABABABABABABABABABA9A9A9A9A9A9A8A8A8A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9 A9A9A9A9A9A9A9A9A9A9A9A9A8A8A8A9A9A9A9A9A9ABABABABABABABABABABABABA9A9A9A9A9A9 A8A8A8A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9 A8A8A8A9A9A9A9A9A9AAAAAAAAAAAAA9A9A9A9A9A9A8A8A8A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9 A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9 A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9 A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9 A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9 A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9 A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9 A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9 A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9 A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9 A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9 A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9 A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9 A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9 A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9 A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9 A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9 A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9 A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9 A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9 A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000A8A8A8A8A8A8A8A8A8A8A8A8 A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8 A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8 A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8 A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8 A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8 A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8 A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8 A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8 A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8 A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8 A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8 A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8 A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8 A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8 A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8 A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8 A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8 A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8 A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8 A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8 A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8 A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8 A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8 A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8 A8A8A8A8A8A8A8A8A8A8A8A8000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000515151515151515151515151515151515151515151 515151515151515151515151515151515151515151515151515151515151515151515151515151 515151515151515151515151515151515151515151515151515151515151515151515151515151 515151515151515151515151515151515151515151515151515151515151515151515151515151 515151515151515151515151515151515151515151515151515151515151515151515151515151 515151515151515151515151515151515151515151515151515151515151515151515151515151 515151515151515151515151515151515151515151515151515151515151515151515151515151 515151515151515151515151515151515151515151515151515151515151515151515151515151 515151515151515151515151515151515151515151515151515151515151515151515151515151 515151515151515151515151515151515151515151515151515151515151515151515151515151 515151515151515151515151515151515151515151515151515151515151515151515151515151 515151515151515151515151515151515151515151515151515151515151515151515151515151 515151515151515151515151515151515151515151515151515151515151515151515151515151 515151515151515151515151515151515151515151515151515151515151515151515151515151 515151515151515151515151515151515151515151515151515151515151515151515151515151 515151515151515151515151515151515151515151515151515151515151515151515151515151 515151515151515151515151515151515151515151515151515151515151515151515151515151 515151515151515151515151515151515151515151515151515151515151515151515151515151 515151515151515151515151515151515151515151515151515151515151515151515151515151 515151515151515151515151515151515151515151515151515151515151515151515151515151 515151515151515151515151515151515151515151515151515151515151515151515151515151 515151515151515151515151515151515151515151515151515151515151515151515151515151 515151515151515151515151515151515151515151515151515151515151515151515151515151 515151515151515151515151515151515151515151515151515151515151515151515151515151 515151515151515151515151515151515151515151515151515151515151515151515151515151 515151000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000F1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FB F1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FB F1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FB F1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FB F1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FB F1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FB F1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FB F1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FB F1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FB F1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FB F1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FB F1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FB F1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FB F1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FB F1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FB F1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FB F1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FB F1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FB F1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FB F1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FB F1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FB F1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FB F1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FB F1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FB F1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBF1F8FBEFF7F9EFF7F9000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9 EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9 EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9 EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9 EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9 EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9 EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9 EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9 EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9 EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9 EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9 EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9 EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9 EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9 EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9 EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9 EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9 EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9 EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9 EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9 EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9 EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9 EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9 EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9 EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9EFF7F9000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000EDF6F8EDF6F8EDF6F8 EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8 EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8 EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8 EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8 EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8 EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8 EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8 EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8 EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8 EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8 EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8 EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8 EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8 EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8 EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8 EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8 EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8 EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8 EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8 EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8 EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8 EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8 EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8 EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8 EDF6F8EDF6F8EDF6F8EDF6F8EDF6F8000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7 ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7 ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7 ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7 ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7 ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7 ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7 ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7 ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7 ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7 ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7 ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7 ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7 ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7 ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7 ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7 ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7 ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7 ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7 ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7 ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7 ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7 ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7 ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7 ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7ECF3F7 ECF3F7ECF3F7000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4 EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4 EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4 EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4 EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4 EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4 EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4 EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4 EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4 EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4 EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4 EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4 EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4 EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4 EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4 EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4 EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4 EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4 EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4 EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4 EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4 EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4 EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4 EAF2F479829649556F49556F49556F49556F49556F49556F49556F49556F49556F49556F363E53 38425649556F49556F49556F49556F49556F798296EAF2F4EAF2F4EAF2F4EAF2F4EAF2F4000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2 E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2 E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2 E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2 E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2 E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2 E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2 E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2 E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2 E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2 E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2 E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2 E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2 E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2 E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2 E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2 E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2 E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2 E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2 E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2 E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2 E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2 E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2505B748CEE71 57E83357E83357E83357E83357E83357E83357E83352D82F22620E2A611B6AEA4B57E83357E833 57E83357E8338DEF71505B74E8EFF2E8EFF2E8EFF2E8EFF2E8EFF2000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000E4EDEFE4EDEF E4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEF E4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEF E4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEF E4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEF E4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEF E4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEF E4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEF E4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEF E4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEF E4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEF E4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEF E4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEF E4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEF E4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEF E4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEF E4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEF E4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEF E4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEF E4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEF E4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEF E4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEF E4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEF E4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEFE4EDEF59647BC4FEAAAEFE8AAEFE8AAEFE8A AEFE8AAEFE8AAEFE8A7AB4600F1A0A1B2815B4F099AEFE8AAEFE8AAEFE8AAEFE8AAEFE8AC4FEAA 59647BE4EDEFE4EDEFE4EDEFE4EDEFE4EDEF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000E3EAEDE3EAEDE3EAEDE3EAEDE3EAED E3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAED E3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAED E3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAED E3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAED E3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAED E3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAED E3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAED E3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAED E3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAED E3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAED E3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAED E3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAED E3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAED E3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAED E3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAED E3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAED E3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAED E3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAED E3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAED E3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAED E3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAED E3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAEDE3EAED E3EAEDE3EAEDE3EAEDE3EAEDE3EAED636D83D1FFB3C2FF96C2FF96C2FF96C2FF96AFEA87455F33 000000000000728D60C3FF98C2FF96C2FF96C2FF96C2FF96C2FF96D2FFB3636D838188989CA4B2 E3EAEDE3EAEDE3EAED000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000E1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EB E1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EB E1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EB E1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EB E1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EB E1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EB E1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EB E1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EB E1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EB E1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EB E1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EB E1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EB E1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EB E1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EB E1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EB E1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EB E1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EB E1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EB E1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EB E1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EB E1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EB E1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EB E1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EBE1E7EB E1E7EBE1E7EB6C7589B4FF9497FF6997FF6997FF6987E45D28481A000000000000000000000000 00000026481887E45D97FF6997FF6997FF69B4FF946C7589EDF1F3717A8DE1E7EBE1E7EBE1E7EB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8 DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8 DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8 DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8 DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8 DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8 DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8 DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8 DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8 DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8 DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8 DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8 DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8 DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8 DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8 DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8 DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8 DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8 DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8 DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8 DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8 DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8 DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8DDE4E8767F92 7FE65E41DC0E41DC0E41DC0E4DDE257EE5638CE874497E3C00000000000030542671CF594DDE25 41DC0E41DC0E41DC0E7EE75E767F9296A0AD5D687FDDE4E8DDE4E8DDE4E8000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000DAE3E6 DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6 DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6 DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6 DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6 DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6 DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6 DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6 DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6 DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6 DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6 DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6 DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6 DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6 DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6 DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6 DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6 DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6 DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6 DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6 DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6 DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6 DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6 DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E6DAE3E680879853D43900C30000C300 00C30000C30000C30000B800021E020315044697404BD14200C60000C30000C30000C30000C300 53D43980879846556E8791A1DAE3E6DAE3E6DAE3E6000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000D6E0E3D6E0E3D6E0E3D6E0E3 D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3 D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3 D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3 D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3 D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3 D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3 D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3 D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3 D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3 D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3 D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3 D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3 D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3 D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3 D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3 D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3 D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3 D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3 D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3 D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3 D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3 D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3 D6E0E3D6E0E3D6E0E3D6E0E3D6E0E3D6E0E38890A048BE3600A50000A50000A50000A50000A500 00420022501F58B4520DAF1600A50000A50000A50000A50000A50000A50048BE368890A0E7EDEF DEE5E9D6E0E3D6E0E3D6E0E3000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1 D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1 D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1 D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1 D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1 D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1 D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1 D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1 D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1 D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1 D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1 D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1 D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1 D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1 D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1 D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1 D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1 D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1 D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1 D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1 D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1 D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1 D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1D5DCE1 D5DCE1D5DCE1D5DCE19097A660C94A00B50000B50000B50000B500008E003C953854C54B00B700 00B50000B50000B50000B50000B50000B50000B5005FCA4A9097A6D5DCE1D5DCE1D5DCE1D5DCE1 D5DCE1000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000D2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADD D2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADD D2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADD D2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADD D2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADD D2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADD D2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADD D2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADD D2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADD D2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADD D2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADD D2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADD D2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADD D2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADD D2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADD D2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADD D2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADD D2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADD D2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADD D2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADD D2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADD D2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADD D2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADDD2DADD AFB6BE979DAA979DAA979DAA979DAA979DAA9DA3B0A1A6B2979DAA979DAA979DAA979DAA979DAA 979DAA979DAA979DAA979DAA979DAAAFB6BED2DADDD2DADDD2DADDD2DADDD2DADD000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 D1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DB D1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DB D1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DB D1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DB D1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DB D1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DB D1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DB D1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DB D1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DB D1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DB D1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DB D1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DB D1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DB D1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DB D1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DB D1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DB D1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DB D1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DB D1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DB D1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DB D1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DB D1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DB D1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBD1D8DBE2E6E8E9ECEEE9ECEE E9ECEEE9ECEEE9ECEEE9ECEEE9ECEEE9ECEEE9ECEEE9ECEEE9ECEEE9ECEEE9ECEEE9ECEEE9ECEE E9ECEEE9ECEEE2E6E8D1D8DBD1D8DBD1D8DBD1D8DBD1D8DB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CDD6D8CDD6D8CDD6D8 CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8 CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8 CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8 CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8 CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8 CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8 CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8 CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8 CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8 CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8 CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8 CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8 CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8 CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8 CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8 CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8 CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8 CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8 CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8 CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8 CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8 CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8 CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8 CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8 CDD6D8CDD6D8CDD6D8CDD6D8CDD6D8000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7 CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7 CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7 CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7 CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7 CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7 CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7 CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7 CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7 CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7 CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7 CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7 CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7 CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7 CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7 CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7 CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7 CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7 CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7 CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7 CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7 CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7 CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7 CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7 CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7CAD4D7 CAD4D7CAD4D7000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5 C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5 C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5 C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5 C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5 C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5 C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5 C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5 C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5 C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5 C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5 C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5 C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5 C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5 C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5 C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5 C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5 C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5 C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5 C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5 C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5 C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5 C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5 C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5 C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5C9D1D5000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3 C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3 C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3 C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3 C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3 C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3 C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3 C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3 C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3 C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3 C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3 C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3 C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3 C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3 C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3 C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3 C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3 C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3 C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3 C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3 C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3 C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3 C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3 C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3 C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3C7D0D3000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000006D767C6D767C 6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C 6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C 6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C 6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C 6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C 6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C 6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C 6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C 6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C 6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C 6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C 6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C 6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C 6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C 6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C 6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C 6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C 6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C 6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C 6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C 6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C 6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C 6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C 6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C6D767C 6D767C6D767C6D767C6D767C6D767C6D767C000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBBBBBBB939393 939393939393989898CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBB2B2B26E6E6E5353533838383E3E3E 5A5A5A838383C7C7C7CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBACACAC7D7D7D7D7D7D7E7E7ECBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB9B9B9B 939393939393B1B1B1CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBC9C9C9A7A7A78383835E5E5E6969698F8F8FB6B6B6CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB9B9B9B939393939393B1B1B1CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB B7B7B7939393939393959595CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB646464000000000000000000000000 B0B0B0CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBC5C5C55D5D5D0505050000000000000000000000000000000000001B1B1B 898989CBCBCBCBCBCBCBCBCBCBCBCB7B7B7B000000000000010101CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB1A1A1A0000000000006C6C6C CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB AAAAAA2A2A2A000000000000000000000000000000000000191919A0A0A0CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB1A1A1A0000000000006C6C6CCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB808080000000000000 060606CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBA0A0A09E9E9E9E9E9EBCBCBCCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB1C1C1C000000000000000000000000696969CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 555555000000000000000000000000000000000000000000000000000000020202929292CBCBCB CBCBCBCBCBCB7B7B7B000000000000010101CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB1A1A1A0000000000006C6C6CCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB7D7D7D050505000000000000 000000000000000000000000000000000000060606828282CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB1A1A1A 0000000000006C6C6CCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB808080000000000000060606CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB050505000000000000888888CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB9F9F9F000000000000000000000000000000212121CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB9A9A9A000000000000000000 2323236161619090907B7B7B4D4D4D0101010000000000000B0B0BBEBEBECBCBCBCBCBCB939393 3C3C3C3C3C3C3D3D3DCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB1A1A1A0000000000006C6C6CCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBB1B1B1070707000000000000000000202020515151595959 323232000000000000000000000000838383CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB1A1A1A0000000000006C6C6C CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB808080000000000000060606CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB050505 000000000000888888CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB565656000000 000000060606000000000000000000A4A4A4CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB6565650000000000001D1D1DC4C4C4CBCBCBCBCBCB CBCBCBCBCBCB7D7D7D000000000000000000909090CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCACACACBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBC8C8C8CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBC7C7C7CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 1A1A1A0000000000006C6C6CCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBBEBEBECBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB3B3B3B0000000000000000005D5D5DCACACACBCBCBCBCBCBCBCBCB8B8B8B020202 000000000000181818C6C6C6CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBC3C3C3CACACACBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB1A1A1A0000000000006C6C6CCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBC6C6C6C7C7C7CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB808080000000000000060606CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB C3C3C3CACACACBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB050505000000000000888888 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBC1C1C1B0B0B0C9C9C9CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBC3C3C3 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBC7C7C71010100000000000005F5F5F0B0B0B 0000000000005D5D5DCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB4242420000000000003F3F3FCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBC6C6C6 1F1F1F191919191919727272CBCBCBCBCBCB8C8C8C2D2D2D2D2D2D2E2E2ECBCBCBCBCBCBCBCBCB 323232323232323232A5A5A59494944B4B4B1010101313134A4A4AA3A3A3CBCBCBB3B3B34A4A4A 1B1B1B030303232323868686CBCBCBCBCBCBCBCBCBCBCBCB7777772D2D2D2D2D2D626262BEBEBE 5959591111110000001F1F1F535353BEBEBECBCBCBCBCBCBCBCBCBCBCBCB1A1A1A000000000000 6C6C6CCBCBCBCBCBCBCBCBCBCBCBCB9D9D9D3737371111110000000F0F0F393939777777CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB969696000000 000000000000393939CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB494949000000000000000000 9B9B9BCBCBCBCBCBCBCBCBCB7777773131311111110000000404041D1D1D5D5D5DB1B1B1CBCBCB CBCBCBCBCBCBCBCBCB1A1A1A0000000000006C6C6CCBCBCBCBCBCBCBCBCBCBCBCBB7B7B74E4E4E 222222030303020202181818515151ADADADCBCBCBCBCBCBCBCBCBC6C6C62D2D2D2D2D2D2D2D2D 8E8E8ECBCBCBCBCBCBCBCBCBCBCBCB3E3E3E2D2D2D2D2D2D7C7C7CCBCBCBCBCBCB808080000000 000000060606CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB7777773131311111110000000404041D1D1D 5D5D5DB1B1B1CBCBCBCBCBCB6666664545450101010000000000002E2E2E454545949494CBCBCB CBCBCBCBCBCBBABABA4949491B1B1B000000000000070707292929757575CBCBCBCBCBCBCBCBCB CBCBCBCBCBCB8080802D2D2D2D2D2D5B5B5BC6C6C67272723131310D0D0DCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB909090000000000000000000A7A7A7484848000000000000161616 C9C9C9CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 5B5B5B000000000000090909909090CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB7B7B7B000000000000010101CBCBCBCBCBCBCBCBCB000000000000000000 636363030303000000000000000000000000161616A6A6A61B1B1B000000000000000000000000 000000717171CBCBCBCBCBCBCBCBCB5E5E5E0000000000003D3D3D2E2E2E000000000000000000 000000000000171717A8A8A8CBCBCBCBCBCBCBCBCB1A1A1A0000000000006C6C6CCBCBCBCBCBCB CBCBCB656565020202000000000000000000000000000000000000525252C8C8C8CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB6C6C6C000000000000000000949494 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBAFAFAF696969696969696969A4A4A4CBCBCBC8C8C8 3A3A3A000000000000000000000000000000000000000000131313A9A9A9CBCBCBCBCBCBCBCBCB 1A1A1A0000000000006C6C6CCBCBCBCBCBCBCBCBCB949494101010000000000000000000000000 0000000000000404049C9C9CCBCBCBCBCBCBC4C4C40000000000000000007C7C7CCBCBCBCBCBCB CBCBCBCBCBCB161616000000000000666666CBCBCBCBCBCB808080000000000000060606CBCBCB CBCBCBCBCBCBC8C8C83A3A3A000000000000000000000000000000000000000000131313A9A9A9 CBCBCB323232000000000000000000000000000000000000797979CBCBCBCBCBCB9A9A9A131313 0000000000000000000000000000000000000000003F3F3FBFBFBFCBCBCBCBCBCBCBCBCB6A6A6A 0000000000003A3A3A4A4A4A0000000000000B0B0BCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB4848480000000000001E1E1ECBCBCB888888000000000000000000989898CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB868686000000000000 0000000000001A1A1A515151838383B4B4B4CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 7B7B7B000000000000010101CBCBCBCBCBCBCBCBCB0000000000000000000000000202021A1A1A 0303030000000000000000000202020000001313131616160000000000000000000F0F0FC3C3C3 CBCBCBCBCBCB5E5E5E0000000000000000000000000000000F0F0F000000000000000000000000 2F2F2FCBCBCBCBCBCBCBCBCB1A1A1A0000000000006C6C6CCBCBCBCBCBCB959595000000000000 0000000303033333330A0A0A000000000000000000565656CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB4D4D4D000000000000020202C8C8C8CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB959595000000000000000000 0F0F0F424242282828010101000000000000464646CBCBCBCBCBCBCBCBCB1A1A1A000000000000 6C6C6CCBCBCBCBCBCBBFBFBF0F0F0F0000000000000000001717170C0C0C000000000000000000 121212C3C3C3CBCBCBC4C4C40000000000000000007C7C7CCBCBCBCBCBCBCBCBCBCBCBCB161616 000000000000666666CBCBCBCBCBCB808080000000000000060606CBCBCBCBCBCBCBCBCB959595 0000000000000000000F0F0F424242282828010101000000000000464646CBCBCB5C5C5C383838 0101010000000000002525253838388F8F8FCBCBCBC0C0C0101010000000000000000000282828 3C3C3C131313000000000000000000565656CBCBCBCBCBCBCBCBCB6A6A6A0000000000000D0D0D 0000000000000000000B0B0BCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBC2C2C2080808000000 000000606060CBCBCBC2C2C2060606000000000000505050CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBC9C9C93E3E3E000000000000000000000000 0000000000000000001B1B1B585858A2A2A2CBCBCBCBCBCBCBCBCBCBCBCB7B7B7B000000000000 010101CBCBCBCBCBCBCBCBCB0000000000000000001E1E1EB7B7B7CBCBCBB4B4B4131313000000 0000000000006A6A6ACBCBCBCBCBCB5A5A5A0000000000000000009B9B9BCBCBCBCBCBCB5E5E5E 0000000000000000002A2A2AAEAEAECBCBCBB7B7B72E2E2E0000000000000000008C8C8CCBCBCB CBCBCB1A1A1A0000000000006C6C6CCBCBCBC9C9C92222220000000000002B2B2BB7B7B7CBCBCB C3C3C34C4C4C000000000000090909C2C2C2CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB2E2E2E000000000000171717CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB5050500000000000003E3E3EC7C7C7CBCBCBCBCBCB 4A4A4A0000000000001C1C1CCBCBCBCBCBCBCBCBCB1A1A1A0000000000006C6C6CCBCBCBCBCBCB 616161000000000000000000858585CBCBCBC1C1C1646464000000000000000000939393CBCBCB C4C4C40000000000000000007C7C7CCBCBCBCBCBCBCBCBCBCBCBCB161616000000000000666666 CBCBCBCBCBCB808080000000000000060606CBCBCBCBCBCBCBCBCB5050500000000000003E3E3E C7C7C7CBCBCBCBCBCB4A4A4A0000000000001C1C1CCBCBCBCBCBCBCBCBCB050505000000000000 888888CBCBCBCBCBCBCBCBCB6161610000000000000202028C8C8CCBCBCBCBCBCBC4C4C43F3F3F 000000000000030303AEAEAECBCBCBCBCBCB6A6A6A0000000000000000000000004A4A4A797979 8C8C8CCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB828282000000000000000000A3A3A3CBCBCB CBCBCB3E3E3E0000000000000D0D0DC6C6C6CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBC2C2C2555555070707000000000000000000000000000000 000000000000000000525252CBCBCBCBCBCBCBCBCB7B7B7B000000000000010101CBCBCBCBCBCB CBCBCB000000000000000000606060CBCBCBCBCBCBCBCBCB444444000000000000040404C7C7C7 CBCBCBCBCBCBA4A4A40000000000000000008E8E8ECBCBCBCBCBCB5E5E5E000000000000020202 B0B0B0CBCBCBCBCBCBCBCBCBA5A5A50000000000000000005D5D5DCBCBCBCBCBCB1A1A1A000000 0000006C6C6CCBCBCBB1B1B1000000000000000000868686CBCBCBCBCBCBCBCBCBACACAC000000 000000000000818181CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB171717 000000000000282828CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB8D8D8D808080808080AEAEAECBCBCBCBCBCBC7C7C7313131000000000000 0B0B0BCBCBCBCBCBCBCBCBCB1A1A1A0000000000006C6C6CCBCBCBCBCBCB1F1F1F000000000000 3E3E3ECBCBCBCBCBCBCBCBCBC7C7C7303030262626262626787878CBCBCBC4C4C4000000000000 0000007C7C7CCBCBCBCBCBCBCBCBCBCBCBCB161616000000000000666666CBCBCBCBCBCB808080 000000000000060606CBCBCBCBCBCBCBCBCB8D8D8D808080808080AEAEAECBCBCBCBCBCBC7C7C7 3131310000000000000B0B0BCBCBCBCBCBCBCBCBCB050505000000000000888888CBCBCBCBCBCB CBCBCB151515000000000000474747CBCBCBCBCBCBCBCBCBCBCBCBB6B6B6040404000000000000 666666CBCBCBCBCBCB6A6A6A0000000000000000006D6D6DCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB3A3A3A0000000000001A1A1ACBCBCBCBCBCBCBCBCB7E7E7E000000 0000000000008B8B8BCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBBFBFBF8888885050501F1F1F000000000000000000000000000000 0000006E6E6ECBCBCBCBCBCB7B7B7B000000000000010101CBCBCBCBCBCBCBCBCB000000000000 0000007A7A7ACBCBCBCBCBCBCBCBCB5C5C5C0000000000001F1F1FCBCBCBCBCBCBCBCBCBB3B3B3 000000000000000000888888CBCBCBCBCBCB5E5E5E0000000000001B1B1BCBCBCBCBCBCBCBCBCB CBCBCBCACACA0F0F0F000000000000424242CBCBCBCBCBCB1A1A1A0000000000006C6C6CCBCBCB 9494940000000000000000003F3F3F434343434343434343434343070707000000000000565656 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB2C2C2C000000000000171717 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBA3A3A37070704A4A4A2E2E2E0707070000000000000000000B0B0BCBCBCBCBCBCB CBCBCB1A1A1A0000000000006C6C6CCBCBCBC9C9C9050505000000000000656565CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBC4C4C40000000000000000007C7C7CCBCBCB CBCBCBCBCBCBCBCBCB161616000000000000666666CBCBCBCBCBCB808080000000000000060606 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBA3A3A37070704A4A4A2E2E2E070707000000000000000000 0B0B0BCBCBCBCBCBCBCBCBCB050505000000000000888888CBCBCBCBCBCBC0C0C0000000000000 0000007F7F7FCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB272727000000000000464646CBCBCBCBCBCB 6A6A6A000000000000000000B2B2B2CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB B9B9B90303030000000000002323235F5F5F5F5F5F5F5F5F515151000000000000000000434343 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBBBBBBB8686863B3B3B000000000000000000161616CBCBCB CBCBCB7B7B7B000000000000010101CBCBCBCBCBCBCBCBCB0000000000000000007C7C7CCBCBCB CBCBCBCBCBCB5E5E5E000000000000232323CBCBCBCBCBCBCBCBCBB3B3B3000000000000000000 898989CBCBCBCBCBCB5E5E5E000000000000393939CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB3A3A3A 0000000000002E2E2ECBCBCBCBCBCB1A1A1A0000000000006C6C6CCBCBCB797979000000000000 0000000000000000000000000000000000000000000000000000004E4E4ECBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB494949000000000000030303C8C8C8CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBC3C3C3363636000000 0000000000000000000000000808080000000000000B0B0BCBCBCBCBCBCBCBCBCB1A1A1A000000 0000006C6C6CCBCBCBB3B3B3000000000000000000808080CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBC4C4C40000000000000000007C7C7CCBCBCBCBCBCBCBCBCBCBCBCB 161616000000000000666666CBCBCBCBCBCB808080000000000000060606CBCBCBCBCBCBCBCBCB C3C3C33636360000000000000000000000000000000808080000000000000B0B0BCBCBCBCBCBCB CBCBCB050505000000000000888888CBCBCBCBCBCBA5A5A5000000000000000000949494CBCBCB CBCBCBCBCBCBCBCBCBCBCBCB3B3B3B0000000000002A2A2ACBCBCBCBCBCB6A6A6A000000000000 090909CACACACBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB747474000000000000 000000000000000000000000000000000000000000000000000000060606BFBFBFCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB898989878787878787A9A9A9CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB373737000000000000000000BBBBBBCBCBCB7B7B7B000000 000000010101CBCBCBCBCBCBCBCBCB0000000000000000007C7C7CCBCBCBCBCBCBCBCBCB5E5E5E 000000000000232323CBCBCBCBCBCBCBCBCBB3B3B30000000000000000008A8A8ACBCBCBCBCBCB 5E5E5E000000000000333333CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB1B1B1B000000000000424242 CBCBCBCBCBCB1A1A1A0000000000006C6C6CCBCBCB8787870000000000000303035D5D5D5D5D5D 5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D848484CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB666666000000000000000000949494CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB8888881717171717171717179C9C9CCBCBCB3A3A3A0000000000000303033636366E6E6E 9C9C9C7878780000000000000B0B0BCBCBCBCBCBCBCBCBCB1A1A1A0000000000006C6C6CCBCBCB BBBBBB000000000000000000747474CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBC4C4C40000000000000000007C7C7CCBCBCBCBCBCBCBCBCBCBCBCB0B0B0B000000000000 666666CBCBCBCBCBCB808080000000000000060606CBCBCBCBCBCBCBCBCB3A3A3A000000000000 0303033636366E6E6E9C9C9C7878780000000000000B0B0BCBCBCBCBCBCBCBCBCB050505000000 000000888888CBCBCBCBCBCBB8B8B8000000000000000000858585CBCBCBCBCBCBCBCBCBCBCBCB CBCBCB2D2D2D0000000000003E3E3ECBCBCBCBCBCB6A6A6A000000000000171717CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB2B2B2B000000000000000000000000000000 0000000000000000000000000000000000000000007F7F7FCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB202020000000000000333333CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB757575000000000000000000BFBFBFCBCBCB7B7B7B000000000000010101CBCBCB CBCBCBCBCBCB0000000000000000007C7C7CCBCBCBCBCBCBCBCBCB5E5E5E000000000000232323 CBCBCBCBCBCBCBCBCBB3B3B30000000000000000008A8A8ACBCBCBCBCBCB5E5E5E000000000000 131313CACACACBCBCBCBCBCBCBCBCBB2B2B20000000000000000005D5D5DCBCBCBCBCBCB1A1A1A 0000000000006C6C6CCBCBCBA6A6A6000000000000000000B4B4B4CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 9C9C9C0000000000000000002F2F2FCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB282828000000 0000000C0C0CC7C7C7BDBDBD000000000000000000636363CBCBCBCBCBCBCBCBCB696969000000 0000000B0B0BCBCBCBCBCBCBCBCBCB1A1A1A0000000000006C6C6CCBCBCBCBCBCB0B0B0B000000 000000565656CBCBCBCBCBCBCBCBCBCACACA5252524A4A4A4A4A4A8A8A8ACBCBCBCACACA020202 000000000000696969CBCBCBCBCBCBCBCBCBB4B4B4000000000000000000656565CBCBCBCBCBCB 808080000000000000060606CBCBCBCBCBCBBDBDBD000000000000000000636363CBCBCBCBCBCB CBCBCB6969690000000000000B0B0BCBCBCBCBCBCBCBCBCB050505000000000000888888CBCBCB CBCBCBCBCBCB0C0C0C0000000000005D5D5DCBCBCBCBCBCBCBCBCBCBCBCBC4C4C40D0D0D000000 0000005D5D5DCBCBCBCBCBCB6A6A6A000000000000171717CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBAEAEAE0000000000000000003939396F6F6F6F6F6F6F6F6F6F6F6F6F6F6F 6E6E6E030303000000000000363636CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB4A4A4A0000000000000000008F8F8FCBCBCBCBCBCBCBCBCBCBCBCBBABABA282828 0000000000001F1F1FCBCBCBCBCBCB7B7B7B000000000000010101CBCBCBCBCBCBCBCBCB000000 0000000000007C7C7CCBCBCBCBCBCBCBCBCB5E5E5E000000000000232323CBCBCBCBCBCBCBCBCB B3B3B30000000000000000008B8B8BCBCBCBCBCBCB5E5E5E0000000000000000006F6F6FCBCBCB CBCBCBCBCBCB676767000000000000000000848484CBCBCBCBCBCB1A1A1A0000000000006C6C6C CBCBCBC3C3C30303030000000000005F5F5FCBCBCBCBCBCBCBCBCBAEAEAE333333323232323232 929292CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB404040000000 000000000000444444C2C2C2CBCBCBCBCBCBC7C7C75858580000000000000000004F4F4FCBCBCB 979797000000000000000000ABABABCBCBCBCBCBCBCACACA3232320000000000000B0B0BCBCBCB CBCBCBCBCBCB1A1A1A0000000000006C6C6CCBCBCBCBCBCB2F2F2F000000000000141414BBBBBB CBCBCBCBCBCB9898980000000000000000008A8A8ACBCBCBCBCBCB0F0F0F0000000000003B3B3B CBCBCBCBCBCBCBCBCB606060000000000000000000656565CBCBCBCBCBCB808080000000000000 060606CBCBCBCBCBCB979797000000000000000000ABABABCBCBCBCBCBCBCACACA323232000000 0000000B0B0BCBCBCBCBCBCBCBCBCB050505000000000000818181CBCBCBCBCBCBCBCBCB424242 0000000000000C0C0CB4B4B4CBCBCBCBCBCBCBCBCB6A6A6A000000000000000000949494CBCBCB CBCBCB6A6A6A000000000000171717CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 6565650000000000000000009D9D9DCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB363636000000 000000020202B7B7B7CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBA0A0A0 0505050000000000000000003232325454545A5A5A3F3F3F0F0F0F000000000000000000777777 CBCBCBCBCBCB7B7B7B000000000000010101CBCBCBCBCBCBCBCBCB0000000000000000007C7C7C CBCBCBCBCBCBCBCBCB5E5E5E000000000000232323CBCBCBCBCBCBCBCBCBB3B3B3000000000000 0000008C8C8CCBCBCBCBCBCB5E5E5E000000000000000000010101313131646464404040000000 0000000000001F1F1FC8C8C8CBCBCBCBCBCB1A1A1A0000000000006C6C6CCBCBCBCBCBCB656565 0000000000000000004444447D7D7D5E5E5E1414140000000000000B0B0BB9B9B9CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBAEAEAE030303000000000000000000 090909323232373737101010000000000000000000191919BDBDBDCBCBCBACACAC000000000000 0000004F4F4FB3B3B3909090444444000000000000000000080808CBCBCBCBCBCBCBCBCB1A1A1A 0000000000006C6C6CCBCBCBCBCBCB8F8F8F0000000000000000002323236A6A6A5454540D0D0D 0000000000001B1B1BC6C6C6CBCBCBCBCBCB3B3B3B0000000000000000003A3A3A616161383838 000000000000000000000000656565CBCBCBCBCBCB808080000000000000060606CBCBCBCBCBCB ACACAC0000000000000000004F4F4FB3B3B3909090444444000000000000000000080808CBCBCB CBCBCBCBCBCB0B0B0B0000000000003636367F7F7FACACACCBCBCBACACAC030303000000000000 121212626262767676464646000000000000000000363636CBCBCBCBCBCBCBCBCB6A6A6A000000 000000171717CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB1D1D1D000000000000 171717CACACACBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB767676000000000000000000727272 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB7C7C7C000000000000 000000000000000000000000000000000000000000000000494949CBCBCBCBCBCBCBCBCB7B7B7B 000000000000010101CBCBCBCBCBCBCBCBCB0000000000000000007C7C7CCBCBCBCBCBCBCBCBCB 5E5E5E000000000000232323CBCBCBCBCBCBCBCBCBB3B3B30000000000000000008C8C8CCBCBCB CBCBCB5E5E5E0000000000001717170B0B0B0000000000000000000000000000000303038F8F8F CBCBCBCBCBCBCBCBCB1A1A1A0000000000006C6C6CCBCBCBCBCBCBC7C7C7292929000000000000 0000000000000000000000000000000606068A8A8ACBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB8F8F8F111111000000000000000000000000000000 0000000000000000000D0D0DA2A2A2CBCBCBCBCBCBC9C9C9282828000000000000000000000000 000000000000222222000000000000010101C3C3C3CBCBCBCBCBCB1A1A1A0000000000006C6C6C CBCBCBCBCBCBCBCBCB3A3A3A0000000000000000000000000000000000000000000E0E0E9C9C9C CBCBCBCBCBCBCBCBCB9898980505050000000000000000000000000000000F0F0F1F1F1F000000 000000656565CBCBCBCBCBCB808080000000000000060606CBCBCBCBCBCBC9C9C9282828000000 000000000000000000000000000000222222000000000000010101C3C3C3CBCBCBCBCBCB404040 000000000000000000000000787878CBCBCBCBCBCB6D6D6D000000000000000000000000000000 000000000000000000151515A9A9A9CBCBCBCBCBCBCBCBCB6A6A6A000000000000171717CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBA0A0A00000000000000000005A5A5ACBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBB5B5B50000000000000000002A2A2ACBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBA3A3A33E3E3E000000000000000000 0000000000000000001C1C1C868686CACACACBCBCBCBCBCBCBCBCB7B7B7B000000000000010101 CBCBCBCBCBCBCBCBCB0000000000000000007C7C7CCBCBCBCBCBCBCBCBCB5E5E5E000000000000 232323CBCBCBCBCBCBCBCBCBB3B3B30000000000000000008C8C8CCBCBCBCBCBCB5E5E5E000000 0000002E2E2E9898982828280000000000000000001919199F9F9FCBCBCBCBCBCBCBCBCBCBCBCB 1A1A1A0000000000006C6C6CCBCBCBCBCBCBCBCBCBC4C4C4676767070707000000000000000000 000000262626A9A9A9CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBB8B8B83E3E3E0202020000000000000000000000000000004C4C4C BABABACBCBCBCBCBCBCBCBCBCBCBCBAEAEAE2929290000000000000000000E0E0E6A6A6AB3B3B3 000000000000000000656565CBCBCBCBCBCB1A1A1A0000000000006C6C6CCBCBCBCBCBCBCBCBCB C8C8C8626262010101000000000000000000000000222222ADADADCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB8C8C8C171717000000000000000000353535AFAFAF323232000000000000666666CBCBCB CBCBCB808080000000000000060606CBCBCBCBCBCBCBCBCBAEAEAE292929000000000000000000 0E0E0E6A6A6AB3B3B3000000000000000000656565CBCBCBCBCBCBA0A0A0232323000000000000 000000787878CBCBCBCBCBCBCBCBCB9494941313130000000000000000000000000000003D3D3D BBBBBBCBCBCBCBCBCBCBCBCBCBCBCB6A6A6A000000000000171717CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBB9B9B99D9D9D848484797979939393AEAEAE C8C8C8CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB5E5E5E0000000000002E2E2ECBCBCB CBCBCBB6B6B68D8D8DAFAFAFCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBC2C2C2A0A0A0808080919191B6B6B6CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBC4C4C4A3A3A37E7E7E787878989898BABABACBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCACACAA0A0A0848484A4A4A4C9C9C9CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBC0C0C0 9E9E9E7C7C7C8C8C8CB6B6B6CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB B7B7B79B9B9BB5B5B5CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCACACAA0A0A0848484A4A4A4C9C9C9CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBBEBEBEADADADACACACC0C0C0CBCBCB CBCBCBCBCBCBCBCBCBCACACAB0B0B08C8C8C7B7B7B9B9B9BBEBEBECBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB5E5E5E0000000000002E2E2ECBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB5E5E5E0000000000002E2E2ECBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB5E5E5E 0000000000002E2E2ECBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB5E5E5E0000000000002E2E2E CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBC8C8C8C6C6C6C6C6C6C7C7C7CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBB3B6BA9299A4828B99798493798493798493 798493798493798493798493798493798493798493798493798493798493798493798493798493 798493798493798493798493798493798493798493798493798493798493798493798493798493 798493798493798493798493798493798493798493798493798493798493798493798493798493 798493798493798493798493798493798493798493798493798493798493798493798493798493 798493798493798493798493798493798493798493798493798493798493798493798493798493 798493798493798493798493798493798493798493798493798493798493798493798493798493 798493798493798493798493798493798493798493798493798493798493798493798493798493 7984937984937984937984937984937984937984937984937F89979098A2AEB1B7CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB B3B6BA9299A4828B99798493798493798493798493798493798493798493798493798493798493 798493798493798493798493798493798493798493798493798493798493798493798493798493 798493798493798493798493798493798493798493798493798493798493798493798493798493 798493798493798493798493798493798493798493798493798493798493798493798493798493 798493798493798493798493798493798493798493798493798493798493798493798493798493 798493798493798493798493798493798493798493798493798493798493798493798493798493 798493798493798493798493798493798493798493798493798493798493798493798493798493 7984937984937984937984937984937F89979098A2AEB1B7CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBC6C6C79CA2AA7F87928D909599999BA1A1A1A2A2A2A3A3A3A3A3A3A3A3A3A3A3A3 A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3 A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3 A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3 A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3 A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3 A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3 A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3 A3A3A3A3A3A3A3A3A3A3A3A3A1A1A19B9B9C909296828993969DA6B7B9BDCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBC6C6C79CA2AA7F87928D909599999B A1A1A1A2A2A2A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3 A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3 A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3 A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3 A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3 A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3 A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3 A3A3A3A1A1A19B9B9C909296828993969DA6B7B9BDCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBA0A5AD 8A8F96AAAAAABCBCBCC8C8C8CECECED0D0D0D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1 D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1 D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1 D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1 D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1 D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1 D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1 D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1 D0D0D0CFCFCFCACACABFBFBFAEAEAE909398818B98C6C6C7CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBA0A5AD8A8F96AAAAAABCBCBCC8C8C8CECECED0D0D0D1D1D1 D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1 D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1 D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1 D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1 D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1 D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1 D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D0D0D0CFCFCFCACACA BFBFBFAEAEAE909398818B98C6C6C7CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBB3B6BA89909AB1B1B2CECECEE1E1E1 EAEAEAEEEEEEEFEFEFF0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0EFEFEFEEEEEEEBEBEB E3E3E3D3D3D3B9B9B990959BA7ABB2CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBB3B6BA89909AB1B1B2CECECEE1E1E1EAEAEAEEEEEEEFEFEFF0F0F0F0F0F0F0F0F0F0F0F0 F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0EFEFEFEEEEEEEBEBEBE3E3E3D3D3D3B9B9B9 90959BA7ABB2CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB9CA2ABA3A5A8CECECEE9E9E9F7F7F7FCFCFCFEFEFEFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFDFDFDF9F9F9EDEDEDD5D5D5 B0B1B18D96A1CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB9CA2ABA3A5A8 CECECEE9E9E9F7F7F7FCFCFCFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFDFDFDF9F9F9EDEDEDD5D5D5B0B1B18D96A1CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB979EA7BABABBE1E1E1F7F7F7FEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFAFAFAE7E7E7C6C6C6959BA4CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB979EA7BABABBE1E1E1F7F7F7FEFEFE FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFAFAFAE7E7E7C6C6C6959BA4CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB999FA8 CACACAEBEBEBFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEEFEFEFD1D1D19BA1A8CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB999FA8CACACAEBEBEBFDFDFDFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFEFEFEEFEFEFD1D1D19BA1A8CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB9FA5ADCFCFCFEEEEEEFEFEFE FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFF1F1F1D5D5D5A1A5ACCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB9FA5ADCFCFCFEEEEEEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF F1F1F1D5D5D5A1A5ACCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBA2A7AFD0D0D0EFEFEFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF F3F3F3D6D6D6A3A7ADCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBA2A7AF D0D0D0EFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F3F3D6D6D6A3A7AD CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBA3A8AFD1D1D1F0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F3F3D6D6D6A5A9AF CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBA3A8AFD1D1D1F0F0F0FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F3F3D6D6D6A5A9AFCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB A5AAB0D1D1D1F0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F3F3D6D6D6A6AAB0CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBA5AAB0D1D1D1F0F0F0FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFF3F3F3D6D6D6A6AAB0CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBA6ABB1D1D1D1F0F0F0 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFF3F3F3D6D6D6A6AAAFCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBA6ABB1D1D1D1F0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFF3F3F3D6D6D6A6AAAFCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBA7ABB2D1D1D1F0F0F0FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFF3F3F3D6D6D6A7ABB0CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB A7ABB2D1D1D1F0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F3F3D6D6D6 A7ABB0CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBA8ACB2D1D1D1F0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F3F3D6D6D6 A9ACB1CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB454545434343B1B1B1CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBA8ACB2D1D1D1F0F0F0 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F3F3D6D6D6A9ACB1CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBA9ADB3D1D1D1F0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F3F3D6D6D6A9ACB1CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 010101000000A3A3A3CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBA9ADB3D1D1D1F0F0F0FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F3F3D6D6D6A9ACB1CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBABAFB5D1D1D1 F0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F3F3D6D6D6AAADB2CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB010101000000A3A3A3 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBABAFB5D1D1D1F0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFF3F3F3D6D6D6AAADB2CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBABAFB4D1D1D1F0F0F0FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFF3F3F3D6D6D6ABAEB3CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBAAAAAA787878787878787878000000000000616161787878787878999999 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBABAFB4D1D1D1F0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F3F3 D6D6D6ABAEB3CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBACB0B5D1D1D1F0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F3F3 D6D6D6ACAFB4CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 7B7B7B000000000000000000000000000000000000000000000000515151CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBACB0B5D1D1D1 F0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F3F3D6D6D6ACAFB4CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBADB1B6D1D1D1F0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F3F3D6D6D6ADB0B4CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB959595434343434343 4343430000000000003636364343434343437A7A7ACBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBADB1B6D1D1D1F0F0F0FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F3F3D6D6D6ADB0B4CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBAEB1B7 D1D1D1F0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F3F3D6D6D6ADB0B4CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB010101000000 A3A3A3CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBAEB1B7D1D1D1F0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFF3F3F3D6D6D6ADB0B4CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBAFB2B7D1D1D1F0F0F0FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFF3F3F3D6D6D6AEB1B5CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB010101000000A3A3A3CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBAFB2B7D1D1D1F0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF F3F3F3D6D6D6AEB1B5CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBAFB2B7D1D1D1F0F0F0FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF F3F3F3D6D6D6AEB1B5CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB010101000000A3A3A3CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBAFB2B7 D1D1D1F0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F3F3D6D6D6AEB1B5 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBB0B3B8D1D1D1F0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F3F3D6D6D6AFB2B5 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBB0B3B8D1D1D1F0F0F0FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F3F3D6D6D6AFB2B5CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB B1B4B9D1D1D1F0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F3F3D6D6D6B0B3B6CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBB1B4B9D1D1D1F0F0F0FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFF3F3F3D6D6D6B0B3B6CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBB2B5B9D0D0D0EFEFEF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFF3F3F3D6D6D6B0B3B6CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBB2B5B9D0D0D0EFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFF3F3F3D6D6D6B0B3B6CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBB4B7BBCCCDCDEEEEEEFEFEFEFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFF1F1F1D5D5D5B0B3B7CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB B4B7BBCCCDCDEEEEEEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1D5D5D5 B0B3B7CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBB9BBBEC4C5C6EBEBEBFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEEFEFEFCECECE B3B6BACBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBB9BBBEC4C5C6EBEBEB FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEEFEFEFCECECEB3B6BACBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBC3C4C5B6B8BBE0E0E0F7F7F7FEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFAFAFAE7E7E7BCBDC0BFC0C2CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBC3C4C5B6B8BBE0E0E0F7F7F7FEFEFEFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFEFEFEFAFAFAE7E7E7BCBDC0BFC0C2CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBBEBFC2 BFC1C4E9E9E9F7F7F7FCFCFCFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFEFEFEFDFDFDF9F9F9EDEDEDC9CBCBB4B7BBC9C9C9CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBBEBFC2BFC1C4E9E9E9F7F7F7FCFCFCFEFEFEFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFDFDFD F9F9F9EDEDEDC9CBCBB4B7BBC9C9C9CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBC9C9C9BEBFC2BBBDBFD2D4D5 E3E4E4EEEEEEEFEFEFF0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0EFEFEFEEEEEEE7E7E8 D6D7D7BFC1C3BCBDC0C5C5C6CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBC9C9C9BEBFC2BBBDBFD2D4D5E3E4E4EEEEEEEFEFEFF0F0F0F0F0F0F0F0F0F0F0F0 F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0EFEFEFEEEEEEE7E7E8D6D7D7BFC1C3BCBDC0 C5C5C6CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBC4C4C6BBBDBFB7B9BDB5B7BBB5B7BB B5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BB B5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BB B5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BB B5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BB B5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BB B5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BB B5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BB B5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB7B9BDBBBDC0C3C4C5CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBC4C4C6BBBDBFB7B9BDB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BB B5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BB B5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BB B5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BB B5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BB B5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BB B5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BB B5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB5B7BBB7B9BDBBBDC0C3C4C5CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB C1C1C1B3B3B3A8A8A8A3A3A39E9E9E9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9E9E9EA3A3A3A8A8A8B3B3B3C1C1C1CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBC3C3C3ADADADA8A8A8CACACAEBEBEB F5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFF5F5F5EBEBEBCACACAA8A8A8ADADADC3C3C3CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBBEBEBEA2A2A2D2D2D2FEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFEFEFED2D2D29F9F9FC1C1C1CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB C1C1C19D9D9DE6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF E9E9E99D9D9DBEBEBECBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBC4C4C49F9F9FE9E9E9FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6E6E6A2A2A2 C3C3C3CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBADADADD2D2D2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2D2D2ADADADCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBC1C1C1A8A8A8FEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEA8A8A8C1C1C1CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBB3B3B3 CACACAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFCACACAB3B3B3CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBA8A8A8EBEBEBFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFEBEBEBA8A8A8CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBA3A3A3F5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F5F5A3A3A3 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB9E9E9EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D9D9DCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 9D9D9DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D9D9DCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB9D9D9DFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF9D9D9DCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB9D9D9DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 9D9D9DCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB9D9D9DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D9D9DCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB9D9D9DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D9D9DCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB9D9D9DFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFD3D9E5A0AEC7A0AEC7A0AEC7A0AEC7A0AEC7A0AEC7A0AEC7D3D9E5FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF9D9D9DCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB9D9D9DFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 9FACC6324F85324F85324F85324F85324F85324F85324F859FACC6FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF9D9D9DCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB9D9D9DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9DEE8ADB8CEADB8CE ADB8CEADB8CEADB8CEADB8CEADB8CED9DEE8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D9D9DCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB9D9D9DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F2F6DFE4ECDFE4ECDFE4ECDFE4ECDFE4EC DFE4ECDFE4ECF0F2F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D9D9DCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB9D9D9D FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF9FACC6324F85324F85324F85324F85324F85324F85324F859FACC6 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D9D9DCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB9D9D9DFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFBCC5D76E82A86E82A86E82A86E82A86E82A86E82A86E82A8BBC5D6FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF9D9D9DCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB9D9D9DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D9D9D CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB9D9D9DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D9D9DCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 9E9E9EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E9E9ECBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBA3A3A3F5F5F5FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFF5F5F5A3A3A3CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBA8A8A8EBEBEBFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBEBEB A8A8A8CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBB3B3B3CACACAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCACACAB3B3B3CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBC1C1C1A8A8A8FEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEA8A8A8C1C1C1CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBADADAD D2D2D2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFD2D2D2ADADADCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBC4C4C4A2A2A2E6E6E6FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9E9E99F9F9F C4C4C4CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBBEBEBE9D9D9DE9E9E9FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6E6E69D9D9DC1C1C1CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBC1C1C19F9F9FD2D2D2FEFEFEFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFEFEFED2D2D2A2A2A2BEBEBECBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBC4C4C4ADADADA8A8A8CACACAEBEBEBF5F5F5FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F5F5EBEBEBCACACAA8A8A8 ADADADC4C4C4CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBC1C1C1B3B3B3A8A8A8A3A3A39E9E9E9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9E9E9EA3A3A3A8A8A8B3B3B3C1C1C1CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCB000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000CBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000CBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000CBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CBCBCBCBCBCBCBCBCBCBCBCB000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF end %%PageTrailer %%Trailer %%EOF gsoap-2.8.28/gsoap/ios_plugin/ios_plugin/docs/geoip-view.png0000644000175000017500000064505412653650146023454 0ustar ellertellertPNG  IHDRYG8iCCPICC ProfileXyPTM˒Y2,9 sQAr$A (ADAED* "pwozUM՜UOOO螞s`]&#h 1!99tmeeDz @'gyDzY;+m t#@~Q0F1 _cxu{h/;]@AE&G@/?XA }w@( N0'{Z󈇄A {'9~E?2d*z?Ǡ+Uhžnp]&o⡞oミUx>GY''Z3>˩ $-60ꍌՇ1lQл;?<_}?> x,F LA0 ~ `tޟd%nA=Cap0o_~U" x|7_ ~M'i۟]{@ڿ#gyzJ7J/J%E)tP( (6 G)Q(5M_3}!-1%a ~q+3f| H7,<>"? \qq8IVZF,>7Z iZUs/ e&د\N l axe"PZ@K` FXRA&YP *@ z@ q0 ^Y0>U v Bb!H ! H2l gBh( JrBf A}HDH!Sq@D W>$bHkkkk6(5[,!evFv5v/QDQ N.NCps\D.-@3\5p^"1I iLj'ggWמ7k>2/~U~n~s$F[BY B,BB BB š‡`DEDEE ebbbb*ST1sDI34)~)a]i`/eeLddeȊzɖ>#ȥuʭɋ_V`P0WRWؤįt^iJQJ9OyDң]UQ5JEZZ>.xΫNVR ixhTjjh55hiykj}Ծ#sCgKWUnRP/GoL^^TƀϠ`P0ѰmdjT`4eie\ojdrdДִ􍙨YY9+ PK`ily򵕐ak+2626I6ö v:vv/h\ g8=pfspt8Ժl?x༫kCBscs vNNvo@{8z4x [ƞ=Wt>zky^Q)[wo_ӿ9@74`-("p+2.h/1ZEGHW(}hP`WX\pê^0"EvF1hpoqtqq .%xRhJ=SR2RK J}&V51;3hc33#2Բ*˖>s?W:(GW2'JN=9Tg  ߞ6?~t&׳gU㊣gKJ:;uGdNٵo{O\кTY[]P9]eX^-X]Ty%Kl?Bf/\WohoD4F7.^q2~UjgDS5zfg--ʭMmmo0iW;;f;;wtwu߸)yӭ۸$ ]{riؐ]wFGz뺯|QSks\eǷ'4'=IMONN{O/<~"ˣЯr^Ӿ.ᘩKkFؾyw~g'/~Avg`q|;˙>_^iytiu~-bmK:zWV3!;[9X]}xqN쏒"?wMw_텓#ȿB$\|}g8wG;SphaxEaQqL䥜e+TjA9 Z2 <}aF%m~b. m\vgAoʹH<$ G| x EUK$HIyJ;ə;)+**>VR0LUҋ47"702X2.Yӱ?ĉߥ!-\12WS_?K}?BC^&FG&FD/?p7 qD+9>LBql#yNt|SwZٰK%=&Jߗ3]P4r qnF+W͚%\/hnhh}ѶҎT2y֍ۏNܽ6<a飡>R{2A9dgSOH~_sm.>/0/-~Xz{SJgU5N؆G6lol^yg==XP*! p\?GA_1YX> J E nʀ 9.M; }< c58\ź~Êsw )ǕWw @!3aaȚk$Kdd)R*SUVPԴЊӮҙC+^5Z20 50ߵ4ʴ~hhl_0$|إ!U^2S+{A!e/yD\܉֎9;/Xt乔TDSX1c+zpR4_kAtӍgN-α(wTU]uf/Tuu IEWZ>jZklki˸q^Z[&'V>WG*? e4a#C'l>՟x0%1-KWKgj|6]| AKA=?ZqljEn]+&jskk];?f&VD:̂ zEa+)((qST* j<JMwLmDfF^Vֻl<q|'IGyDxy%ANB"B"+]bY"ےR 2jr,r -Jaʖ*Tp2zN=SGSKYNE|$_C;# c .8n`>mq߲vI}]]ڹwsrwp&{y{{x(J 8I##Ţ$bbU4Ll%=t*)+x\vnܦO寞-$<#qVȰء\TiZ.<ܨ]Td]V{B}UCy+WK]+^\RzFO{H瓮s7zy݋c+=,3t/Q·acc'=U,N~Zhfdw %ekvv~(P gs\ ' x @:7 tp)42'k ppf :E}$|bCyQ{hKt ; [KCN@iNٌce~*YrMxCmI}FKI;GgEw^ g }LLDz1w`YgGlٻ94898ǹ#Hy<\<Ƽs|"X,!V8ODEY1=uZ 7I:e-9y|?̔+*Sj.8sHVH_@PHX"2ݪغ= h\2J{./3u/!o7b߇젇!a##s͎{ R~t'!wfr֋l͜y'9' Ν]1Y_oDn6ѳo? `@ X! (&"qI 9*5fA1Ԙ0VHaEFEEspNI#5G@@G[JGKEKC!a 3& Db:s'Kk 5vNX\\+I$JR (O/-esw 8lZWz)|HDHb#<O%3Im sSJDM7*Tgk$hkk;XwXZ[Yܱrtq q.quEvsth#b6Im{H stx%R6*>z0:!||䉣ܩi]c̦l<?/f=3Z^tn10)1"1`^f6~ÈJ!HNҌJ>S۪ׯ?ieb`jgi^hfc#onorvNqve:d)]' nz6b/9+5.6~"Q>"tufLlÜ<[rϤ *c?w_Uxv嫗y7]m4؝Aa鑆\N?Č?Z#ʓS`W/Ϲ9 bZKm-?|\]#}}kFf7o3߯l'`g#}~t@ -gND^ůηģ7<80 pHYs   IDATxyd}eWU}t`fp<@I]\Ea)Qe76X҇l^ю%mxסB$xC@ q \=3]Wjg r1W])ʵt-]Kҵt-}{ p-]Kҵt-}{ks-]Kҵt-}SSBZo$"BjI^$ZgB./z%=cFZߘtxkZ3]df Ji7`v{FKÇTt/_[_^^]u !8j"A 1("ĨjJ91UUUd4XP%*"u8D-]xp111F 5qP ݾBB`955ǚ0r.Oij <B`Wi9(LBw{׋(n%V߿wN:~lCQJ"ƒ 8' h "(=.#FQjH!q@c(D/[p"@1HT JШ^(Qèom[[['6߳s2Bo7" c28ﱶ@hE)sZzhh!TUB(a{`2H7:\Y֯}KVnnw7/{WPFD 'spc'8ƕ*hIT$A$"a@<Ⅰ&iU)j"iRK=9dhƺpTz; @P X H|Q@TT# cMDTa#"b&Tu9D\*UqdqX]&FDpE"EAήE!6sVqHA DPsM cAJ/A/FPx7Cl<80BHeģQnOe<j@HDDcD/QPL}B"8!P?j%1*!QE%VNJۭՕ֫>t^4CcnW44-\ fV[䒵(ּKKKkkk^;x /hz8'/ *hxa4v ֥ͳ;;;g.^ ðӯTqS|Qev|{iii(}+߷~`ˢァ,ͿC$j#"B0i%/M05 J&G &R(qղ^А%L P'&}L P1858"RV\9GLҬwֽ0H'o8'z]D/mufyzg{牳gN:&p#1ӄ4k9[Y ɔ޷oG?p-|s9缧>M@5&PH"}Ak@QFh *{V[PUE5 M A(h=!RzD\D(1&ӘP'8'b$fRl0$D<~4/#&M-6+#"6j!lZCfJp\環 Y+Jm55RGr; I u9!Hmoɴ|tx&]& wcQ&NI`eZEGIAATfef4 l+k˚Tź}L&vIAD*/ob̗kljf@i|Df>K͛4㜍Auϔ\\#e I *JMNYPMuK :ND֖]N(|AQxZe,EAU*KV(_( oZS*cUPQ+WH#Nĉ8_PvN:u''aFpYnj8 %I< Sk;^y+^7t5K br+U( )BZ6x'CE5\fkkmtwCF!xc cj5 /6"(lċ4$I\tX;YCL] pxҌ%$3E,&\U$REP<x$*kHQBkj$!IE&ݕ>$3R #QQ 8D%\QD$k1v၀3"rVԤ7NЪB o#S ֌_3y<ɇ``ycf]ccFfZKE1PQR%J*"EIX&>!D ۆ%D4$IyV8)mdAhD!Hx PW/JZN( O{Ckn9XZZdqa%  HUUFcFcU8Xťx ?~/o~K^Rijᴁ%?7/{˿oeuehd48EE! jL)<шK.qOsl?%vt1f/eNE4š.ڴ[%IWn)e1U/<;sN&zKv!._wRۡk >JLb&lΦԀ5w4i8D7qYg#4Gk(/^$m*Hj(ĝM\M~Imjג]?1^Ԏ扴o$މ* 397\Қ&M&qI{{沈4y$$ 'hA=eOe4LLԱ / K.1@̔cдF IQ[I)FYXW̦;jԄXSUh4b8RUUU1  1A5f0p80 nKYZY>uuY__gii,WhDhH;ڼux~sl} `_r +ԚVΑ#-ow\ 1?pP!ٵtmZ6yӧNs :qFTNVyYY6gia%:9:6v(iwx(_8(9g$o'ʠ' X=U hƵuljfQYhhY@ bSYkbf%l:!f?_%x~m[o{KY[$i>˖ |All\@,/ ˬ,2 sZ-ʲ( 沙,M㟈༤LI R(h2 9qy&s Yؔ('33}$ZI>)*Ϧf9vo9+F {(I : ;iT?FMc:5aj̠l4\6ώ:R+1e7aΟyr5*CV^,4A4̄WUi<ͅ>ӧO<}$.\d4p wy+t-;.PGzro|UU=g$܋|^s-G0-gXt:^b{4,{z;W'Fij~k묬,VWX\\dn{hVS9Wdߓ9R̉LOmQUMv7a4ˆB"|!dhK٭Үh`S`>+2VY-J]&p]hͼo/%'{]@Ȯ+ޮ+߿{(Ki?4K>Tf6~@ƹwUQƚժTUH*Bt .mos9N<O੧̹3\|Yr7ū|댫1^K.p$yӟM,EO@/:!W|珽C:cբ9hl5ŋy衇yk_¥-Wqì.*kVYZZnQ`|A=EY$X85HqezSU s}g_VMTM;S]rz濛$ ?_)69d3@J&L@bvi) g&w}Ԛƻ(娟mXFoJNsi E:[t6^.i/A(L:YʹtM.B@*BU1< q|'Orupws fķz~׷.\8d!h9 Xk/?^:t\ kkΝ;˃>ȃ?°R]wטg߾_cuu\2Oi3L$ZIf\D HkұÔ35ylLک5wJHE@53!Z"m_IM0L aWK54}r7H.{5m]Q졙L]͔2!n \5z7k,;Ts6ՈfƢzDž4346"4O.R͗l+ƣjxVK4T{}45@m;L}&=ӡPlhž2N}^UۋjBׯn?SZMw{or LWwVmk,eo10vhmxmBMZMѩpˤLzo  njc!ݝ.gmSy'xGxI7#Gnb||=i?}w~ё Nk+/c"žYZO diFRd!ԀU1LXKLyqbZk!a bi|Yx|=*kaҵXg1K<{,x4xg~u<3`˒-NE>+gݦj5EYb$H7 2>G9`F GC>n 8qi:v~'O^q)|SǟuOc䳃O{ %=H'IPCowƿ#Ơ%EY.[^(8Θx\_ ĢwqyϜɇ%78?Wn٦DCnPJN&o:X&dۑ2;i]<ͬg/щeҹ6~Ny'-o\wu\ pw8wnOcǹo;'4*) W} _;4v.Pರ|ijdpܫ~W,K8|^Z9Z℃,.,j!pyΞ=\pKtz}F!㤑0[L9h4߷vkk=r喣G>X۷9<(S;^@d322 WM/ wI~io` BglLMy>^9]Z-칆M9zvmNC&ES͇+ZPA !mS#F..qasg9yO>{ǎ=SǏY9W "0iʡsmrmqQ:<,.ôw\ߧ ll'_ãs7s縸/NbN>Tyspqq_CLc{nX_׿ 07#GX۷J[>}ӧOsvvv cFcXQî6b`0d8* n&. ws][r!xNmwcSZc`:%sj\3oGn*ҳ zCh07yȯ3Nӆʹ.S-#F;v 6gΜǞ~/~w}8q^N|nvlIYYZZÇ[;YY^&F~nKݸ 9w{K]6ΟS}-p|ӈ*H~_CQ>8|YGcXZYE;1xS:uTUH>ar~)UBTdn~6ш3JovzkiTo 3Di8OO1?'tZm;6\"N;59_2nf UmG\_{!z!;^O?GSg ҿG}4o \tZv{ |*\R˭bW1CqISH^N<{:㧻&|n2-{Ϧ:a=y\ SvA ;vNCYO`X[rۭsD^wx|yog~'qԙŽ_}cB& >x/_Onh'UeɃ_SNh4* pv#=.AkI; lمy^x[m`PZrL o9gk?YƬ  ~/yb*mvuS{귙4QzѸaWʻk.In7n>=;͗76\o=fSOW(iܯk˦xxxgԚ:Pf IC4pf25jў_M~?oO 6nYXX@Q*V+|옛p!n9z (K}^ǣ=owOዒs7"*s?oaz|^s)5֟+_V!hݒĩ_Xfj`<!"T^^')T̵͋nw}K8~ kEm!lv{vv}w*1 /H!(XWP6 #U&@b8G2K,)`0$(xS2k8hfI 0L*ChG@tb^g #"1gp`[FY3&fRywC092 T ;T,WLD- '|b"|ʶK~ )&vv c:MR~5ioz߰|4Niwp>mY5rήv]/7uCS-odA E1Y= !kObcyg'6/ O*k&i}F=eJ8w\IЋZe/dѢ,@PqH>tĉ/RRq-wؑ 83̏ie"9 |aΟ?}eA 1bkʲ:7lqEtɖ<ؓ{Ww׍$Ɗ?WgEyA<+Mo}w|wwa~~Gy'NRmx)Ev{l^Hʛgy{xXXZ%VC5=*;nSvȢ-NxSNpsgxqz>OƸ@H# QIDBp"BpѶ"D: Ŏ6c٪zfg*a%6}tT.Qt'` ˉq2I#RHP gA*P* EX1*ّϢ.aB\STӋ > T^Xf<AM{A:th7Fb&Aba$!TPy@eZZ%(EEOG EV0-1Z)V'[h9GYx$5ױ:,-2-u}ou_t:j`T5Ϧ##}گ|,ٷv!dHQYUv<s~'F%pҩS'?n=`wjr{ވA:0!L: 7{߼ )[BUU:ss<ԓڜQ|ڨY:jO!N*8uD~D;c" z!LvipjDggW$X_ YށD&uiD6SAcmR:=Ĵn'ua`Y#Dj#[`Ҵ4ohABs˘,FGO!E)iyOan~%[Cpn(9ʑo7Ę~KUUu4TJ@ݡ,q7#.y%x`b_ѣG%D(mΝ;˗ XB]4(p2$"I:B PTH95Sx#PHD谶I>)I-@c.Oy\)OdmpB$h"THBH.=B˩Ѯ#2BLB EBZ-B9GUwox .~W-Ȃ3+J>+Pe2 VyV s 8ub0}g׼{~qǏOlT" \t&hw{l|Do8u`P0ٰH c;wWN/2?0?b7s\9A)g?I[$  7ydxS LBШ5iDI`M{!iCHf"8&\}DS^ie]R7U"F#Jʥ~ָĤdh 9G3:o)_=HHlNH&T9".%oھ#^ *_ic~>nF^k{uQA,NRɯ3ٳka~aNAQt::% 9z~|Ov|ϛ,o~9)|K_}c< lsy#xfI'YYn;~~alJWmwK ( ANQ)¨?;7'`2} _sC(Hoݸd~-4fM[ ,P iN "HikjAq1䝦̍`kv_kP:3$I]brCDI0yHZ$+Wgz#Z ~/xcЌ>k;bD$2|EG-#YjUK#zb7ɪ55Bj&EI0[CfaE Y* !])IIH ̤#iMn2st6|21~ xHaǦd4:# g3G@TYUBo wHs3M$s*J堌Lh#>0iX.rilXͤtI2!Ƕ2oDb2aZ$YmM ٔ' ;i3+x7r-H t:~7~RUD>ؖdnkum9Z~+7p vϜf0>}L=y3}C ~-}'~_h ,e!K|C=Jg~~wO ~K'Tͳ&5?.^Ky'@h[_g}?Mc<0h,6c.g |2'ߪ Ęt*@gFwEbK/:($J2a&Nlbx d@%B͕s4XD8|i:{JUY4ݗ,r̬EwiI&CLs\BI1]iTghF"B*S|4X%MC3%4@,̤7Me:$9{'F32K!i @UNL|m8H9fyJ';j^*M{QE , oB-P162cI'u QH! e *)YW1Hv^pٗ5$HIc:gZR &nZ6;3FʘY}\B!|^7ÅޗeIt =?nn>z+հ;u|IN(; 6:H:96!oV?z%~m?Ngn.p]zw~%ll~C2_ͽ]jVhy~Y_ۇ@ۣCn l^ÿy߯#?z9T_ӧ?k>p0]5tLt^Lb?FJTg}BgT,ZM3 CU)L%^{D#B΃3QBЄo?#?įr!v.!ٹ^N(WW} Z;B3E (g#ٜ+A5Pryc}IJ>:9| |*mLZe^O7 *@z=2smsȏ`MrDL`RvVE !ʩH IDATv;EEcA(Bmp9)ȧ&9G֘, P%C^k1Ypn)7Spٿ /.Fk p=JL3%GpGM2SV [njsR"s LyLpH/ FA]k@}q[b29g@Cm̿hHdԍՙ]bÈi>H6º4%eDbt{LZUh<⻾n~z9Uc#;Ql[!ϳ]' ɧ9rng/sZ-;+U Fc\ˎ١QLS'c}~]q:MHg~iO_[{蕭6`!A̹鰙'f$EjǡxSd& 6XkȽ^c=Lmw) ,5$5$ Hʥ0mgKҒ NlQ +PC' I+> sގj !i4I!| bV4Pj)+! K_Lpa-Dbd!QmJ(Ǥr>h2D:ZԅT |sb1$1@-^9֣kՙEQ[㕵Ac}` ֑HF)K4b#כy0qUoGpb v!Il]T oIO7 þ_h4&b$AAd#EV9d\vlg('+vi&:V%KE'"J*SJOXH A @kǷE=~{^ߚWPu=fn,JX= s!Nh XWhu_0a3ԞuԂDȩP!CN~1ϊuU+a0)6&0{*vpCc)_|˷~'qܼr5Qf89bϟuv>3{&& }4Mo} WUxS\?'V@j|xꩧ\P쬖qs'M,gwfDoDZZ.5L%0_;{[oỾ;ޟYH5̇l-M1#lnՈܡ֓*wq= ctx,j='-6:|Cw|;;8ɵՓ"B7d, #Ж"Z!:B`DڼmN\Fx0xV{)Ŋu[I, dHggԈ(s u"ؐ󧹊RDV93*`ZnKHW lKeANWM(.S-L?`EuD j6f_a5HY*Ns2IS) r3Mlx4wWTϘ?W꼩ZhP)Dhh5Y"`F@FIЄZRQTܪ@ I4 2q ĵFS w0D9rؔR,)#p''k?|w`h)#R˴/['O9(LhGx3O̙]7~r|ytm>_Mhj;warHO<{xtl~ieq 7n_?C?S{&V,Kv~_%S'G(E  )Y@"{B',3T)m?$^(kzKCQ;03Cu\DkЉ(!kT';Dyf -dM,,;rNhyKR*M8F >rX|Y40lja[-0VPmI qM(ZL hb/ *Jd xJBNF OCPI B*Z #yZ5s@ήR3t LsktLDN ̽)q5BHS -n%g5z4J IAX/%"A&#ߩjzI[ <MpQx$;BCK8 ֜ ,q4ۋW7f? ?y,`u|۷9~~㙦!jPw\p.Orc}3s_ߎw~GGЉ[fbXbg1~?{uXʮ-RDG}p@s+WC4*-UH(ZIf]XcbaSwnp\L2rNSPKZiͨTTaYcRu ;vT?%4Pj=Jۼ(XsM=셠O\%xN*d +HFtf~~\ֵjDE& BQ%Mx|' uxcuBC ljK}`(Mռ|30˒7>*LH-Mt-5U@LI ,f#fRȬq"7ㄐ@B[X"22J2h!.v^Uzc+(+뽄盏7#1@ ̦]H6gf}3XnbZ e;9xӛjk.PkIX8wO~;"\r_~k|-|`Ɉ2{߀oow~#@Xݳ_#?#vj]ëݽB$-GJ[tQaQ`)qD& %,cX¤0 ̔h«E*&S,fi95! EG%Gh bE&,H0@?6\@<gĖ r*0fqf6αsmnҸp, #pgA~"D[mQ PdIohPtxLyV͆ab#"F(fhe, HQ+kqrrjwoӟUUq]wr Xy J3O o?UTW*p3|/Ir'F]Xx7x̟x7>s[Ͽ^34")S\BҔOjJIgF:;6ߐfI\n>0W% 2,*ne ;qz*HUVKY :p-DӔUlkيDJm^fPDFż$Fi ڢLBrO)P̍oS%E(`W5▌QZkh?!htRZcO=Bt#:K̓ (  &s#},zN,:YavfyZ`eHx)fX9_ @-p5(dlL,fSa$P~B>57BIt1R.NYj4GCx,@-lP:)"؃APU j@ % C+%%Fr:(*P&o\SɌ!_?8::܃?-6 y#{C2f=86|8ySQ,~V04|U<_B)\rw\J ǐS<[[+<[o㏿~׻F9 wrg>y|>S*#3^Q#-']ɬ\ ̠8@@)X&f\/•LQ)Ҩ iIh(Rڪ,Co+7Ij;z@eR)*U#€5+4po'%ϕwrDN j^P"RE"ȉw$<5BwKe TC xZmF9.Fn QK.L^XGA1Ֆ<UP*Aa ikAQRJmNm4[uxU*k+AgULLU45MoH,J&*ҠJ[`ToDwx3*|bN=/4* 2WXՖ<۪SXD[T@a(+#ⱂ }Qa8p<_ޜqf%ϜT)kn y} 5LU1^S o`{]MŇ [SG=kS Pj0j;Az5n0rx\Vc. xC`ٶZWDB3 B~FR53D&(uo^´X |7[elmm{߀{UZw _,Sze*ےo( d5rMً2CܱXLx7>yȣ3vxy5v~s??`k͛'(ef(1,q]D* UȰtժa{ [pS2ڠ@U 3Z,YD+YsH-Y P )΢@MG><?)\,PBZE SQLŸU'V  Fp+0cHn? 䖦_S V,J[(ß x| S|~ bQZ %̥)kF SpLnb/28 `N `Wd(*CZVw19`(%JМA̘LjY-ѹe9Eh83 }T -mhV ٮRQ 6%J.E2m"gF="崭{ 9'Ds9'U iP[*͍^PV:-GiS DP~L)''3̀}߅NL>߁r-}ݸ+:=%z^C XN ܸq[\[{- $#ـׯȩ=xŇNYWU\PEgmAL"#\tc\b\a{{W3{j-rb&O*A=~{{ 7sU^3yE'sẗ́53\p9iٳg֯{+Ȅ{@Aۻć 1MKbB!=iSnj_W?qhV`^Q \Q+:3q̚EN>I`.26Xd|ܑkK_Y"nU@&c4[QXE偮ƚSQ2& i|F kà!ҏ$Pu8=fƳ+E@_i]WYph" 7 m šuմla`s}0yH=/OHeKg!0r aT a1 zJ NN}/,P97>*UDJhAҐ(4=P(k 99LQc,$O''XnwҸcm_˷݆bŢ`g{W\j"yٌ>HC=Wx__sڿ#vn.=2`,Wǵk/뢪nƽރgb\b*aR5j(\{dL#}@v>EL-LO$x8sK`=TOs(juؒp@Z9DÁr+f,lE20]Ӵܪ"Sy5) fQ_ƅ&, -oyOC<=~WͨsX-0x,.;J'3PdiDDQ1pŽ4<}Gg|]5x>SlI(((d@ 8;5c.9zF#=iy0b Uj RYe>$S[X=Rr"ؼOamrR=u^4;%i{+m" =jZ 095 4Gk(-Ҽ+r1G<ާ3'y;JSAo6]$+al^!7(Fqޱ*Fz/SpC*2[K0z-NSƤwkě@>H&=3CZ#3m3HsVv VХHឌy4a٪D]ZXooq|AߪBclwvAd#΀xo)xSۓ[@Qu]c)R"|<=k@+adu\?~ߏ2U@Uprr;\Ur4lmmٳXLS'X^|Q(z?|Ϩ|}gԤuhxAtS|ho Myވ3"OpQe7j__ܰ\6uJ)xgi E4򥗮EΆ+WxPhVa1,ϴ,U… (EX.P4 ̑Z uznvww_t%)ʽw`#''(E֊{DݱX-qv,VVn2.^cV^x5n %,gQ&v`j >ܳHIvQG}cYt6(G%IR3A t mZ+Rqw̭?1|)FIWl5QZ{y;R$>6NW ?ܡMNnM)vSRPmUoym/vwN42W0d}n${QK#ڜSevVyݺBe<vlj`ƮMzÍOVuk;EC=%6Oj#g5,ѶoHp@pΣYpʐA191sI8;sT,i)v2WH)*T6ש}Cuŧ>i|}@!'={ox=\a1MPlooagN˪8<8+ܱZ8seGi5N,¨[~&7s GGxڣ}fw(S LZ. /eoⓟNNkN g~(F"[TڵH,Up鴶yzio|J4-Nsc'ɰp6l6olޖO ܏&$cI&1̡z#V;(\M4FND78eɡ,¤Qq Bӧ8 E&,+@205)qo[zP7 9M`Ojj vBKIv8hލHg?V|Oad=OڏtN]9*敗}{?o\jkk6M,i´X Z w1M&?<99o2Pb+Ubml@:8t/&y߸/@4c=dDG${άqiy_  "D½t|FbFztҭ}Ǎ%#el@1.Y g5f!Oeg_\P:a4"úbptWGeaw߯jt: #A!`MRȩdPlcL ڙa@n 7hMmy%rBy+' ӯۚѓvf57iX+ymBdDWO{Dګ득7nl#.T!MV:p7n 'я~:u?O>뮻ӄR T e /|'{`ir<_IpiZ|7昦^~}#GDj, ,K(Ο;/lV;z9Q&ݧ&#`',Y4TR@I֌mDz&޵$C=eVЉVZD kԌ/jޣM+,X )#CB.yP'84 ˢTgd20 W30f^2zV%<3KC&V}_yL^ IpuŜe7Zi4/1ӂ,AZ/7LG@gcA%_̝@9#F3r1ih|&iBIJV-CA9r, ) 9QΤ!GWL!-ɠQ Zɯ6TmΛp|fB<<o6: Di.4775Ӛeʸ^Vu*|Op`"Tp9\2`X`<+ އѱKu~ʛJ)w%ū_x^a9{m."׮^} &nmma  % o 0_ |SO> oL&CSW:Xܣa  =XpAXF`r^C%Tk8σ5}K}YHg'x,%MaA"8 y{E) 58m$3 Mxl sf4pfC.pڱq=,O0D)ܢ.H i`l IC29%RI^ 1%.+5dRPk K^'ړ;K.p}͌ۍMMxHBo? VrkuqP%3$hƿ܋|IV4^``8A-3(n?a$)# %׬%nCzG(33lmm;d"bbZ`&hŀ;cgvZ,.|&*\~+W[V8:9j׮]rrR %팗/_f_JvA_}NaDքf 3ӬsRsFHEhKk'9F1 ,0@? fm M"DWfӦa.ٳҏ9"6SʊݣwxV"ўGqfwa!aVL1 5zH^ i^I``& >oU}wdDָ{iڧ$s2H02-#~S XM]r205o1cOP7nf3@TƏP TPT{ge`xO}zt)RTCƤ(jj+aԠl`08!9XENPY$*`,oqPcceGH6D Z|_>2 5VicqA&3ɋ -k <@M^%H-՟yGM3@9%sx[6Bt0'|󒏦T-0%bP?d`%`8 B0iviGȫ`i~NaIeD18yBC6`'M(,Z[ðِ3Z^ iʊ} Fϝ(h-,XȳQS 3Mw]E~mݎ6ê]7ҧĺ A!d8 4k,WZـyT2 @PŠ17Jp0sT駟E9Νùs{ULDA)-؀sTXIW3<7 0x>Rny6 89^SZHu岅*Μ9ݝG73!eq ^UA2X{YJ?y3k fRÊںtf 3~ffzkhU-B&fH[^ M5TQSFbU~OmFQꀳF$!CH5{fj~9uژLFKvۄkf?@)S4CZ`jd۾ 0^nD~'`o,}ܩdm-Vyfj]jI1pJ(3wU(J-- 'N&([Z Uim[+mjXHC0;UVn @,ה}wjJb51`-'%ZR5Eq&8G+8,"ZMhbL,0#IW3HD4ks( h \foCFs!s: 6|(Dߍ)FX k$z50ͳʆkkLl`|c`Sb5ֺ ]4ֈI̽ !65ki{EE;Yʲ“A͹g >d> n`([>Z}CYi<5XffMxQNr >`^XhASvVXIGsW0={Z/IxDlPOfٰsg)e z(zMOLgϞV+|Xa*DZAEX,Cw0ܸq} [iͽ@E_(nd3.P*l_J9yWF*, k$&RICnK) f6$a~BCf۰h`d{37Ea1޻ԛ]`h*K:p<ײn&ZǡEX-fadfB0(L3GC¸QLѯ-#l3`Yx2xk[|{^ms+dBP* #98:4Mgi|ס0>hyrd"''( j= sY6vxS;3l  ڭNF{oܯf+mOF279WVdR#)O3,O.o0B?fu0G`Pr~F(h0N'3Tn5'K"̠=)x1_ˑPZAK90ivZe1NS+5d81k5Yd; )Y{j>q]H;s2v7p;В#g&C!(t.s4Kdݰz(V*23Mp2lGhfȞ3\nGxJan5BQKat#hD(J&ȣ0y<"sڷvoLyLI`JK8/ÜkF &/9[~w CIfrdIPBT 54ԡvn7SVK4`Q]SҠE 94e紦i]1qS[ࢊ ĕ1TH*!Y>8jC=17 1(AC&Co@|:R 갮 P NXB$=ĜDY9zk/rv&/KlooA~ڎm3jZ&흛>/xN韲w1 'ǘ Z`E$ J()co޼C.EȳS[ԒʏehpW4l% [a#2Go7Ir}De&q[I'o=d\@1^5j;kt)2~q^}ƢwFafk67a0a/,#0T2`bGr BX"gr!:2Ј3 6.H;m (d`ND]zL * _(^bVd>-wVpmS$Fڀڣi#/rJ5 \Xĸb /̓~e% Bnkl>M ͻ6J DF$ 2#7ҤyO`Ͽ"y8Yf'<ZRrc`c\&9r^ k5pW<#3K-^nʠ 8@ij!"Y"XP/;*ZQ B/K7TIY>VxFݳZ _7E%iXx0) Ѵ-fGݢD?&bya.bHҶ4H8I{ ^ 4^F?-5%^*MmжKQ3db_EaH(Bdz>\ Atk~UfpW[DSӀdh7b -ذn'gM@rRlIipzf3,@:Y"Dijd:ITB2@Bv"Cpalf\XGT ;7fl4agg;<"͆ DΟ?BP=/:00MS9'J&y&73\4 fh>'')# OHTMkM8:@i;%ALp CR;nQ6 AJ_>$ZAZUiQ]_ga@4IGB\SYT|_\t 2rr+zU~c-,W lb{,Hڗ^C[dz7*;1b߸7gԤQThqgQTs0xEr-)$ 7ԓ5y& ^nD%6n 0htyDh:m^YX5볩X$nƞ6`)8{;&,Ó@7ܸ*ne | PFjj1ZPvAq.Ҫj?pW%G߿Z`5W0vϖיw2뾽_/R ( %yžAg&,S3;4 k숑cf1IIEڍnloV'3+oU}@֒[egs$BuSS 4p#ޫm*xB[s"^0:R!XS[)MDP>9UHMqU9%E"L ߱eNi&?뙕g`f/sG䙭_y{  Aܟ ØU&CƁMD%~Uͱ[ Sx~d9gʼn)숻FVʒ覉φK#mTֆcA*rіMNh̗ ~}@f+ΎH , 8H(~;zDE9j_PyI+jIڄNFH><W!M Grq~!l€Ry1HS `yyeߠrz@Co@oꂑ̣dYa?R)'eA{~ZYү/8f3z h63d =+,-8qhD/6[lf8b(tq*csѝ: /u.958q c+q}:ˆ2͞Ghxl9KcaeYJz#̟m;<r\`6P(EHd, )>ȥVVJ|g-F1752I JB7J+ZEoa}trQü%#Vn,|/h/={T~xkbBh ރlɽٻ/$Cw?◆'@)`Dn $+腥k@R_IpޭagIt \7H2aFԃҬ~PXqLB Ԥ{Zk,,̇092L$^m'+R0:QOۓ$9l$PeXN*Q+Ts|^ L]G0rgR#id7%µt oޥ@%q}٢*[d 0.MX/$Gf+lDE^N=ꙧIpS숯^hd emwP\䅋UXY i"k ҝx iYkkqbUUr*ɾ}k)3%Zyg*(ŢCdҳRuϴ?籴O/yU3/Lw<;;1k b#d)$Z2H41}xVBDAxc GGlE {VW#kqjѓ7 иJlJ"(c4馢s538íE5~AV IMGXJ63U#"J{AG"}dF0_/}V7,ʎLY=L jK'GnY4cۈ6r3Nz{2ϓ`e1X,/ܭ]l=%/NBkjSjTo JA@Bv-YQ0 :;|)dJR.GcTJkX=X`wCX\U$jY ų!#ٛͷ= @" g/?Q`3x8ǁ d{ޱx-Aܫ9.(r}Z{Uݳ5%ǜ"c6]QExf>g:8xƘeZ&ww~lղQ%Il1H |<ՎyG(t'e-쭮~;Թ{.&2`0CrnKBy)+"e_}X+laD6,x:lDV2mOX~ƌ-L=/7t0joƴ?{"sw9TG3H* ʚ<2**&a ֊D7>c$b8¯؅HQeh|f8Z/ad T/Emzj=:\,#VJ62*t2[ ay[?ٳDܼM )xE MKA#f>]/OGO{v"DD{jc9kq9zN~mE{!FFFʞVqpLXM}\Ȟg{(*3cl%, IDATi׃'/[wawDB9 Ap#MO1sѹ埌cBI 8:zc]8>~ysA<?#._T`g*G<\u8Sgĭ -ZydzIjSnhF"<`AMEԍ*'_HݔMM[u;zL}FwCΞ(c(!ƍ\=EjoOU^[W3#WpAKV**Ғ+8OʎUfvըb 1t8<BΜ /.cey858\}8xLdEPډP.1s~wqy v`X(@A Tۉu{j,oCB>MZ[ĵͱ-NgK, wVJ^zKV VHH`AJMHC\ʪwyi?O/.]40S>lbΈFC]qK,J{#灒9W#%%F]V=bd+gIYuB )GE^9i 75)\ҴSñ\$[}lmëIΙML6j+&77&xTVte)~—Bs-qMF2ǂRuH'^UͲE q9s <~;[`kKzi a"cD5`zJ'"i3Ⴔfbƣ$99`qZA"'Jbb=" =/,`e&]A$ zUc=򼋎%+w+xP,7+>Ҝ=r̯ͤOy.bH27܋C\l#q.-hB3zo+DlʁL7\> ch!f+ŲXF-`To]YUw9ӮF\!!9GU\\`e/-Ӳ!N' ba"إ P(<MJlX`~a `+o4Ådk4]f2ƺD9S "h"lA- cw)\~C/팎rs*c:e#TVDG :O2a9wK`\ľ΍NY(;E{ۊR&2|A;ؒ.:97j%!f4j_XxO{IZ|W%xx=8~e7b/l6r99NiQ/>jܲ#ԦY몗 -#޹x!*Hd詞0$$UZ" (QJ;M0ւ`DHҔ!^) }O ;RbPDuy`xX(=X Wݿ5$GA-dkˊhvy%*Z) lDJC(YB0M e?`/k5tO$$Vh]4U&qie/2nubOPa2v"ZwSj;^: [̏~?Nzn9y3%]C PkL~SIN4|r" 95Q>l"fLPK~|Si@b}_a}m xy[2ʙrW"6W2cep_ND4yATQǡ=-#1"i'T;;FVAq(GQU>R̲ssfreFMa"\<ϟk9֓3D 5XS a_+-,)gfBwc",("/нe"T Aњz RJAω/l̕y,s ̸)ϋu+"{s*hE/7qf`PCݩ}A3V?e08ΌpfuAF$52"[ǟ l]MGǮ 8i163E ÙY)s\ڲvСCjSEl%uM2. YψRtW[m4xF>tmQTp Qmˠ6qx v}wСGe,d{]^KG0BJkuOŤ5%a,#^&4ӺepEZC>j5U ¿Gn('V鲭Enm`RHk탂DM{`p">Uz{'ۡC?`|YRBTgJ>+@ƵC>_aM'8{OJg5ÿC1,e=aXoowizH4dƶ) }aFbR[V8xMx2O `MjСCPGS^P R-*:ٻL`}sX9ZBOq Kl9=w4ȲtСCejUdAjze@S𛙈7y=Bs;k,ep휩;tС)D4^:!TBJYVI^% A zrnmV>V1wr2wC&-<߸d#Xuy;:tՕxt5"x)IK! lA- *:U[:4BX*6&c v di+g3)IMmFcQ}[!Cc<:tPZyGS-T. e5q8Umi20%&b2v4z. xJ+k$.{Q 'Fu0Cfg%uH/$+K+"`7S,//byiH\K3o ลW"N OСCSBk.sq no1P-qIl<."A8Eg!%qQZػ^͈ ܱ;ӡC-#Y_ҷHDн(iǣ Bfvw4Ow9b9jlRTmUR,tСCf(V&earBp2 RB޾j+sc_?:tПT;.20dJMs~I)$9hj se;o %f9uСCK;I8"cNAZjeԉ\叅4u2,Ji3 .jHEiw'GAСCmaDq]> ?&LY xeuٜCui\:ظm0.D@5 ّ:tavȲA@)VBj)3祛Ϙoք450laJb8Kmn*/(֝CBD9#m,ؙB^'=)Exʘs} 錃z3"=[ڀNСC0jR9{͈=#4[@BFd-%UHZk%[:[O3tСC" ,ܞvLIZ8} h~xr ?GA1+ٯ}KsA:Qق\ROƂ @_""h$t+cF~.uΫC&FUg~fSN@` $'H2ԫ@ݦ'"%:N$jBS||CB:t3vf(=_MD] $* `),) 5"c3^.0Y.;ġ˒?:tС.>S<-.Ǡh)aqaJ W[9Hܩ&QͲP()T*xԡCZBz>!SS-ִ-X )\RX0:4,DtS$O7[c P(8vסC&ژY9 ,"$y,>QYiюyqJ;HXqnt]W"Q:tF3:>i\,IzhִP%bFF "A?fÒ S>dԡCJSBl~H=n)'V&$f9[ډq ᖩ1$ΏP Ygqʥ>СCXλKE'C4+6 (q%ٴ€u3Ғق5dp(#vu8l 旡zN#סC$f~!rj6l< yYB)D=פlR$K8tI$ ݡC8+V [+z<9g&|rABr8ǒ; k)x@ V/x?63}ij\hmoJ.LGH?#"b*z DæݡCEk0{ D!Hq"(R^BI?'O]iJi҉&cP Xb(Ry: |\JKAVmǖ=ÇC>~}}e d꡷ݍkIJ|fq6`a^]DD Ja>&Ljү ƽfB+ (6mDžƉF0[gpS#2C5͉!3pxmN-G$ ~"@)&q*)gNT⿝>^~qǑ$ڲuaDFbh%z6 Z!["?Ap<}G'} sog~Cq]nkw۸t5acKZV7MK"eMi=,ݿ×2N}c/? ]a<ǖ;Ͼ5qÍ7^_ ^={+{p'>^WYxs9G4M_#zm fͷ܂W5Gķ}|Ǐ߀{V q.C?0/75xS  : ܬ]Ow*aF;c=(ض+,ݶޑ{ʾx38z(>~ן1h 7Fή㭋&%XXGr(Qq⃍/bu|u|8|pV̌_x/_O{] | |k9\p?p0~ӥZo\ fp0[o)>O`}}ooʶ aN x _ hJ)\8r+M֊ya6t {qw/}l9gqB`47a8Čo8w/A0TS[L96뜏>]5czڀuk.(1м9)g?0nV0o/_?o7x;X=|O;3ڵkħ~Z]Šsȑ#| aZƫ?}o?4MqQ|~Kp|-x뭷K/[n 8yx`^ӧOI<s@1zIp**%CHrl2$R `w}$Q1Vi#uqνZAe+-CL۷ƨà9c-aX -{%_ѰlѣqM7ճgcmHyssxr߿=[B IDATy0;;xסOCѣcDž?[׷c `K[x]kҟC'5Nߴ% gaw0=|OOc57ˊ-?q"3g΀=7x#y7^:G7M?yr_y%;ĉ'=/<{ 7> \WN| l$f 4q+H/<WwFNAHȄ%[B83@f۲>)mb[#vvL0Jv:#wE54dK.#9CHlvOja9S*Z[Y3wn;テ˗dY3z]w݅#Fc!p*׮Z<˗>c'Oͷ&3.;qzo]ijo_K9+gW|p}y*~ !vZc~=K?ױ ws/,3t˿[o^{,~wwd/s}m wO~W^[o?7O } Z'8q{=8}#t$…E:6^﬽+w'.ލxӇaƊPcU#D``HٴeN]vGX5BO'J" M RPZo6.4>Bc_~kSDfOSpx(PaRvť% ;.`:x?A/Ip[oi F%cݢDסha%<0m '/ Np9ܶ,7S|u x9llo#mɗ}xGs7`|"J?R  fo8>x]=[oassKK{Zګga ?%uqؙ#/-/cyyskkkGTҝÁ^} o_ ^rufdmSSq<׼$e\yFK@75$<47 M $˄tN)mī'q)o2zG{^WHoa-`tho e!lll൳gq=vOp8č7ǹ7[GyW^=˳{X\\oxsV;"yG ;y l^ ~c ^[nӋ6?|v Fu\0gs:__g046t`0t=c ^`k%F6l{k y8+ =/..bsso}[no0un;\$[k/`?O~abJbb24i5PnnP ZkEVfn3);6:Dv/¿kR2<" V ^0[)*m0)N 2!f6f~}Y\rI/>5'Nǰ0k+kxI;~lncP,--ѣz*y>so|s[flnm-яǯ7.l9hN8}=}#wvӸp8"yY<̳;?_?yPԟ~x/p#1xgҋ/B'=assѣG<͍My({{#cmm oɓ8{,M(<<$IЛ H;I7OzUۻ産_SABa3z )4ݟ)^m^ufE/!$"@ c%6pؤ rٱ",~"Աyٰ mtm0>ì -xf}0 o8>gŕ˙n'>) ;kK/xW& n.`<ѱ,`Ń~O?#\6޹xD7p67k'%H[[ {U|6n]\/>- 1\91G9c8Rҹ(}k3odA"MS~cx衇SO|pa$ uw;]Z|wU/&;4CgybwgFj,vY/<{,?C6wqӉQvp1|+_vyu88u֩1N$`Wi 4d{B`S#P3N}]E3e9Ve3$pN= 79~1ZChE[\ E<a mn؉llUU y\zs؈&kR'o Xc ak2/MX9|Nt-v Z=SyyR#l RR ԣ9X8эJ6(1gӉ6zQ{}ݼ掠q:{(2YYŀEk MAZ 4:u~(d E9ltI"Wp#6mݡC@hs΢uR5T2*ƤQ-%r3΂0$BٯمqZT6NCp:tP" feH(r,Q.Dž.2QJ#05ć^yrPUPEtY۬-Ɋ:tpQFܶg`^c,)1qFӳu. F%\x< d%^3|)s ''ku\߾|Y2)_g{VugݧYhq{n( zvǯμj/SUWV~ߥa}8PV̪ Lx/N[M,H.NgR/Dʎ&dٵmʛU]1AE:?v/Ƅ:>adHˋocL͢=qQeF6{7lC 1DP鞨X6LuLqH(Gv ڟe hrϚ\ ? G&a_[(ox?lcvyl[pMٸ'dd6bss=$Ж00,˯8scA=!كx{vv~Rt|R@gЊMT/yi+ ~^2Im)%nhJ^?p@ACP,H4%kfňa U{Mh@yq5/V0Kl< @Kdl8GP,9L=֣F!͋m0*6R9fY >T-Ee͗z+;VpR4ƿcMŴeɕoGSཌ\RUJ&ES 69cI${ /K:zZ~!f)Tϓԕnl_Y je6:²vT1U4 "yNד/q^xC˘(r&P IY"@$t B9nbFbR7H:)j8*&K_f)V1&ڃhzm,&kLb=(5)ZtM=ӌA}ƸOھ*mgmic4B@i![3@m`r‚QK-3"@ٌx!NXU''IaeYUs(g'I4A(;vzb3*;Vі3?~h|i$YHMQ22@d9Θ6u)!sє"Le+"}P:q%\|6mW51ژ=*ΒaFU$Y-Ƕ ov^gֶ3P[sqĹQ# _Ɯ~8Z4N@5%baVV3 )0 hR0HbGJ|Ӹ1n2ڬHjk0@ejậy4- eSknMRJW&oqL& N`!G-hqcT09ڗ Z) &_ lRVlMyr˸L+S N;2TI>yi{Rb_t1 .?'eE(m{*Nrg@k2@H$|fӨژ!̩4 DǑ;!Bcg *|uQٖ*oZo7iE>H磊lC4:-:0}Evh8 `HA0R`Zkä7' 4R`kU*8.%7w2(?AQՕȖ`RbR6I}6\)[N9iLa003P !1!vwwj{q'O1߻@rOl 1Ke"ɀ)傂rqdP[ \Ptkfi_ֶV{x?+(Cv6xa; UӋF:0k 6$c'UPSĀmnl?כb/X ˜T]v\_o &AM+S]UZz!2UQqd\9zZD^: is6t^aQI&q6N0P.)(JZ{e^/V MM z[`rN@ T>wRL5mM&tZhZ$ej29 ^,jW+YO3eխ?nI=z\>U$ Ż 0la65n/7 3%&xQdvniqְF _;ĉlMR0jom0,P%չ7&6og.mg:ecf= }m15ԛgI?Oq~) s1k56ƴK0kpˇbc 4Ra ˒߁WUж~JcZh?\F0\Fښʘ~{SgzBZ"RF?ʼn-;u<" M H'Sԃ˗ͱcGlUaI·Ihm 핊!T06ΤƤ2R:ʈHj̢}Tfv);?N-ǵ4y=pe 6w8Ħ"N+ | R aF;!B>w{xw#lLAyQ7tӲtd&a6N0˜T-͎cuz1`Y6'ezDh.Ҵ^`P&{݃ BjCC 8dKDc`i+mhjzw`9e`-#MSD#!$ / y0&ۚ! n忟/~VSU9륒kҶiSV:*60{'yg|ǩCW5>j;3-ܖXXXc$'xڢLuRc;D#op0y&.z5IE0ǡ& m4U/,^ЦϤi{3/&\Ԏqחi]b5gUI__8ylaa0H@HHۚݽ'9{E2T" ,e྇yT&CN*m/mKZQ&׹of2Ѥf;WFTq)SoKV7)H]_xS]Q\,d=>Uc6,^\6*@HA۲0ff3D&})e(·Y'LZ˜@\œ1w4/O`KD /QљUߓ7N({lAMи~I}\B<ԓgvFeE6S) 6 j dkkW -s:LB=) OpTʤmz$+YL* IM=ƥiLt, c?0NK˞a5`kSmS}UM#I$ |;mFcf TPBI$k MRM"z  3!QзźVr>iBI'\SwuUQMWOۘDTEL; eyzYj &<[Qu1VߐoZ5D к7 $+Pa `}y r 0 L62$mD&UWN҆i erTiSɨ$T$mYjt[{*9#x ò8e3Nf,Heo-`9{eX˒^&13$a{˖{Lcc%݄NŸ%T[Af] zHMP`;Gqb,&CMڱs^݅gbg[k]h QdS6*#j8<`bq.c>$&Hu<&viu'Rͤ Eij΋\uJ.,?Eml"y4k[h$PGj+*kϡL:lrP`'gY$j!eXA0ziߙ`vYR@>`KC5$&hRD̦H^նԔ3Q͚ SDԄmk6eMaZFD %l ll6)Tl*=6fvF](FY`n,+W0݆<\ImnE5gV\VniYVw6oo:ηyEV 6/{k!hT7l#"@ 0y4@VOK(ORC IDATx 7ze2xJ병F"+DCPɁY okZmWRM%i4j4*'>'a6cxpm_Vz<&z9HoӁGØ!v MpSm(&j*7FC^4S|*"RGIc~ZVT;u8xȿd"dS4Y1qDg\k붵~ڐݺ}Y| " \ K^KM_A+)5o!]yÑm!okBM&-wXݕhX*j)I$*F[*;^{1lcn1bbzZ818W1 }"0)'_%[yR$j-c4xla +rY|RT)`Pjαi˜ʬ#ԕ˟҆R%YIMNj+2V7uq{g:*ϲk-IۘNu$kޫT%&v &* `(5!t#MTJTi5LAE p( jAg䬑"=UUk9-H uʈSm,]FmMRZE<2YcmxA&dafۊM89@"iDTcYR6 Q $Op Bw,gjQDŽ{DQVִmj6w]5W~[B;h#hʈ֑U u'm[([s]2.@1X De)mHC@`^ ,oc>J=XY묦sE]v>sϸ&qͷgLX6Mm̑|=eϲt"N2Y" 0\kGVDH#A" a؀yx$,^&9s+MzrPVT\"]I#_v+1匓ڔHu㮿qu@ (\5.> T- @@JaـIUg CUJ<1zgcǩڐ(ƝkuVMTauW(S${_u5W][6iKՔaT=˃|Bt"t)4Hmv IxEv^|,7U1UD(]#ڞu,ṶV1@yRi/kW-EM˄?Dctee]M+P `-1hE9% HSfEr"E=S}ozMmbW*;Fk܆UiҾqmB*kC1s^uVխ]>.GN"@)°?1Fl<TcJ ܩUj 3S$%EM+L7ae nVߴc;q> QіSYRɵB6rQu~"5 J+0JRv²uq$&X뼼Y2YzZHkQAt uǬ\H bZܦc4cUM\MTո-3ב&UMRw~>LS5Urkqڈ|h3JiX0.P|oZkvxJ@ Nx+1ā3Y QrIcNI |Qgګۮ6RUNcB:vv$se:RBqgںcLۯc8vAzaft$W|< @5 $dI;LzP :X@P纶I$jYJ5kI1Mߛ0IfVEOKfU4Gƕ=MuUoȫ %BP 6 @kfl{4%0 [a`SUk}f:+Upum[+QcF$u _[$ Chz]azydYӌmh6J1&|2I VCȖR(XEЦjc oaFD79I36ZWMVRF|~UH m3IW}Ӕaf4MQ$5WͱCR 5z]R?dXR0\ Ɉ1/.K 7BRzB}-TG|V( h_dÊލ>Sh@!HT1*! $j(z <`5[}p4Af2˪x= BnF0l2TSIiW75QZGPJKRWٖUB"[6XJg+/֮R'%+1ckȶ]Ͷ1u cI 7xVW*!PUK`2hbF@s=ˎoSJ!nn F}t~)w)ҾL]yKWP]H`?iCuUZ*4֕-[^]:ԻHRMd!23^1T-!q`kYƀd%Jٯ E &]%ٛzJ U ҭANқ3'72غ}I^.PxM!'"d{/g!}9›R|Ƕ6J2A&QP~APfSB7ux5/]~,Ї鏓ZO@ 3 )v5T^o]\?â chqRkG/'UONްHK|rlG"ЄYh DaZIZX@c i x3n8rd]'ב.JbY:.?<3v]A 6+I˩RZgCxK>U'S]_;[* Նu <grR 3#jw5sCڂΝ;lnl4zb DM?k` :.w{yKX]$zb.F!)st|J@ѕ b]Q2ӵ6 'Ҡ3(JTP Л;_z%-ڵ}`c"I17!@h@083a ALηWҐFL_+#7=MQixDfJ|o[_-C]rRK4$PKjz YLN,c@߾&0ڻwUdR/t,w^[kSN .s]Iyy \m)oJk J(Է"C͟ļ_:^ڞӳ{+$K< ŌZJ0$l N$`mx:tH Ե^![/Z.Lx :ϤRMpt*}aȝI)'gXLJ|PzW`!|b<2/f̳FQ Ȣdǁ#1rٺ8'BgϞ/@TلوaO*`?(5}hqFWbJ(d}FaO/UW.xCDP}9yCÐR\| ś=]9)ۛx"%s<)Ya2P ntbE"ג=Q*S:l=c,;xx8CtR9Ln8Hz|RT'5 i]Ki\ym=RX'I6d#Gve`|wYPPu۹:p1DUYAzE>N]f631n_K) һc㜾Nѐ@r))wl@ܴtz)w ܺxo)` yJ)>9yR 󔩓Y @d.B%>#;Po5vJaZO ̨*@)T(a73mn=D44!F}c_^Eʫ) /҇aGe)6/ upsEQX_w%\]D1B TDz  b09ap]T'ZJ!Plj:Pp<®6.a a@~x(rtxV}_j 94aoh(O4$+ɡ(cߧk|WN rjݴY S(Xڹw@A`U, iOmUI`-/H,"B؇);jȦ4o2%W^,+7vbDgHߥ6Gk<}o)V+ X열=vQ jӂvGj4R2RJ1Cšڜ糵5!V@!:Jͼ1K uB#F+"LЈ1/ÐEK>vrgrtJzȫHCXt*ߧ0,3锣{ ٣i  ~4C\%yJ'r޳mH%H hvCd'6]B!ٗew+/UOWپz\!t}yd%T\1JGKb2}e=GYCz.\jCNND"BEz^iُrw..ىZrkan `C]f[ƻ#Rپ%eJ*J.^ \hiS3 r757ѾNlzy]tduhtN]% wD`+D`Xꥱ@GiT Nc>Ae,Z>"svr@Vah)T8*(5"e4sWVI(L7? My*SD`*D/(u. HBG$̑6'/R) خ@P׃oYA @ RJ( %d[:< '>X(!GCY"y yK k)H%:ۼ1)-P|jAD.\Po>lE̳1ٴ_gaBdt:hI]7 L&۵V:cY-lWG:ȬPgP|eȊ^gW}=_ܲ}oT%dCޓ//{] |RJJ+)U&s-[Lu0 , q AFz:o4b(@$ VB@CZ/t:}u.%(ȋBoJ|KܑtRˈDr $3f>%'R+HރKQD,ͷ; 0(@^/Kzպ~C0ٞ@tV}Zʬc a<sYp 9b 9z 9|8Y% VRW_B2>G..ȡJfNg26+ts%d"s)`2SxH0bjBBLk=3^ҢGkMlz=t@jB1cӵXPN\yzJB%o..XNz[6_;Iꈥc<1Hm[>bYJ}ߋP@ɤڦ+9WWx 2  6XAvވ+D3i< `l_*3Ǡtѡ!%u2]1ySC-"!Jy J=NՐ1%}7`\Лͧ*  zY5IF-k(aO\YgB؏`l=#6+\Z1~790%^N>CW}rd //$܅M<}61 ٖ0[|n_%Dyd|XZa5ٵcy- S<zGJ0EP K JɡPxQ%;b zP!d]20 \76G1tho->u~RSg~;VF8k hѼhql^{QlQʓkBeԩTK. )%'NŅطg'v.{ TijVI*j9@ 4-$ĨF;O3XM@/7EY)0G..%UNLWа>u2]AgPUN]'OcssW_yv FQА;&/˗on=6MJd Y?4wye>ϧDwj7!AA.G ZpKQ>m굸@) bdv`eiM3oӸ&aVzq_zW9w.)V*ĕ+'^䮟eطovڅeTULOdksӻxK9TRT~.}>)%&N ߻=wv$zD$ޚT&H^&RT6N) RDx3ǵ6ЖٮZSN!徨Ʋ1--S2w7UA)=cy]Bk1r䝻vػw/PUUpܐ .09'D64o@0z?]~f֫cu5,,u +傹Δ<|X~Чt ːRbΝxŅbz("!9-1Vh(J'sz(1NRY-a"DxvR4w/Rb4 RrHYi&GzW]'RڿBv`eeetr s)Ō~JW/fs#5瓝c c Ɋy1CxKFXZZjw|e|~m26JI_H 6"pD@BA="f\ʺxCq7C8%禝8q'q7㵯}-w,VU{⦛n‹_hn>k,>`}}|;__pY/r/C\|uU~f֟L̐>]bcސ[֕kC}í !P‚@C^jW[Gc4v3落.~c #׏QXOJXφ9k,ϣ12my ^{6.\/~ϟk^l |رck )X%}k_' b-IJ+Omr뷿Ϗm 6 IDAT(c2|:Rny)LFjPCuLPC_UI O::H% ElL %L'R/a*&kQfi l`f?nAѐ#m7ȑ#Ҧ){/^W2 S=z2~auqv\rAgr5B3<%~z/p |9T&b ?| 䀗ޓнl6M@.!94@#;U1xjDiS\~;^Ɗ!Fk̀{ؾcF@o&uRϨ6o<СCX__ <裸˰O~8y\ێ?{ o|u|űcpa>|> >ԩSMnvs=+q7cccկ~pwx^MqW:6)r˻3s>>"ƒ>s-CDͼC=[[[AyG}݇dϒR )%3KO#|346%sxK]o˛/^zߩS~x ^̧3ĵ^u]G}/^lҘwy'VVVwv|g?Y8p/~+++_E޽~{gy?#Go;뮻__mΞ=|#;GK^Moo|#>Ok_ZLS|M78>O^(v@ؐ[ލ =z=W{クk{^O8~G~D[$Og @79O7'YbaМN(dB9uw_q9܇JuT6caH-\  $*,?x kX"Tj2v挡Y^*S^hG< 9GyǎkVO>$N>7 عsg#o?ӧOG~Gp7ap;뮻hߏ=y8z(Qc= ܩiLSh=G!a2Dťt?iqpBPɓ'q]w}{:;'怇|O>$ ۿ[|K_‘#Grz!~șVsz\|7-$#(!Ybs0ON.+태0baZJd>Z )udJ*Z>Kv. "b()1^ZҮiHaOun馛h4¾}poe4!sakk ^f駟3/3D4י3g>}ٳg:47?s `kk ~3g:.r|͸{|W_}5z9rauur >5\믿7pCR%|pmS#{ /| qWn:;wvVWWW\q^oxߏ__{^38]c2Y}yQ9I@u,#) y{y؜U].TH7ߌ-*K߶QɟIwܱgފWϸ馛w9׼5Gy_qw77z?ᕯ|%^"{'R#NKy>z̀<1Fs˻}'$?UW4: rTU>>b̲js6n8Nͱ7Dzd6gm-`EYR[SN#_Ay&oRJ-ou]7ӟ4=׿j'xW^y<|><צo]wnyW]u?/qaj03x |s}݇[neAGWXZ<#Bc] SφM{woo4K|̌Uڵ ?y%/s}G曮T\>^_0dtqexhyP-dn_{}+-c 3G=WSٯ@"4՟jS S)!FWod0ڛ@faqq1\aq9*I ;z(>KKKs:,//رcЄؾյ'||?A9w\3h4?|J)|{ix_~w}7Ν;9>^DeuSO=;8s /Gx<Ɲwމz J)?~s<\sMs)H)O{dξ6h UHf8;wG[ su?;s >accB||ܹsw~w?c~7F6clCxc1甾z|)]rdky=PR @Dav40}RPRAq U#iݨ4ƭNk03v@=eXz F T^Qdz†%K "f&kK+xoq 7xn;v GW_n _W9[nW\qx≦d2e|K_hb}~1Lpw7+ᖗc?c6@;vf+)mرcg~g|Wرo{۰PO>|<'||;d_7|}kqwW~WpAڵ/G>|GYѶ l\xcϿ{Zզvc2Bc̿tOi4kO,hu͞p4K)1NsF](>6)6Gre.7LN@,)pHq<'^ dOq6cSlZv9$@4ou )FαRz55RџHzz(}#JUt{6Kckb s ;v^mÎ;puyeJX̩}SsG;~ft {kxv !R>!)]+1i1߇Q/5eBrn}!Öw`'f%S_1r9J"噵%&BMXUNRÞiJhȬ;b@ hØ?@(l;=  \#Uu&J*CWnZ/!^h@|W^; Tb>10k-?uBSQXYWW_[b,,~ Nev$ !Pz e-fi@H!%u#t* 82רԢx{sJ)^htIzvT])cxʕ֙5'SslsbG|b T}SSmnrsM,V]o[k|v CXJRdo([H*!ׯJȬ jMEd0عƭ 8uI ˛+ʔ8& .5償|.QLOؽJAmҦz<> %P!)0NqxEUeqO_0nz@V/+C)PGZj!n3F С69hxUE}W:2=%u a}eK v([WLN:s򖗖X^^5֑K>&xrqXQ?d.O C>>d+0LٳؚL%\膞Lx̓ 7`3#>545  #no JexG!5ѕ\QZGиzs.|잺e|3$?92}cmsꌥCꗒ2rynP !K$h4hCj_R\kK$gtJ).HyͩW>ts慌x}>>`-1n~-Cέ3%&.֖v&KD0؞Ny":;60VJ1@BCBĐrZW/vbcuyrhۈ59^Oe(Hrr-%rg|R@gCy>z\[{_S`P٤z2>.!6K@33 sY+=c7dX[cyy a\SCm 0 FQ *6FSJC5^]@Hz B W25SsM\/'@Rp ^DLߵζT{GQ hca5?gSb˳@Z:ׄܘ0GclvG`XkX$@srs$qkiEzS<% N6@T/d8Idn%$/E9:j3ʹ;& RH^,#dHrg oyx^jDh;.{ Zx_M97J;|RutKBC&VI ͛nj0(6T=qB@fX!sԝ~3#.ghG6^b#`!vzN}9uxc@ß㝔O!ھӥ6V)YҖ(ܷ.!)gБ× )yC!\H[לZHbBmIy1j[N4-1)c IDATb]&fl"nJGjjb|yprr<]uH|.aCjluψ TG*sʨ"^N֧ B0I*#RYf1s{ܝBM_-uJ ˈ1ΕUbtsdt)XߔE xsekwâ9J:Pܲ1=b|ߥ>>1y>1}A.+%!y} 8 8 M$ Uڄޕ AP€PC0[ aOQ*/ǀu&=)F>T,sJwv^pY e\hF1@-˷}~Jƀ#uk{L'2(4((2Đb.?7@v s>HcjH* &5)k s#{59zxR:YRMo% B}Q)<oJߐ>9OPݮ!'%LUXR1sdB*40i"Pڦ3Hb^4HYA$`CeemI-Qz.1!r<ܥbz(l_6%:|9_Yu [ [Șv,V>r'aR !BO+3Y]}9stvTP}+*[6T뇜xC;$?3'rC!C ,9X/(9|y7ID\0%"H%QzaBWҦ2a⅖,0 (±6zs k)R/աtr$prw]JCS7- jvlO}!|j\y%全lmm" JJ)E 1N^?d}9}[ A eOX>2T]@%U~ʋ r )9R/)ut\;iQoǼ_J%1sCm] ՝"A;s`fThIs24V!$Bo: I RIND5V|Hjq˹>bJM\5u5W)qu dc;Ӝ6J) !Yo`EYJ`ZN`j2 ^V~#4 ȽHWbF5>11}c5\]ڕ{/JyCbu&s3~4o|>Y) cm'!=LII=Jfƻ"033HIiV!?<lvtH]5Ȯ0[(M{lhrG}FѹxRzE 䕔`ssaT}%Nm Gj[@Ky(!%t?bQWp Q.rtt,  @E `@ڙC0seNCrxS%HQ(DeN_~\a YWg^!]zCRi~`ɑ+O}Hژ"0h;m,Y;BAK'K}@ })ZJHG `@wStkLHJsd1©e]c ʊz=d5"̼Mj%(IR<ޜIg ,CTZ>crb:kpѡ6e,1Az("R:4GϪ-sHJjiM:aQIxDrGa3b x `C`wHwLKE)KtnI ek,VmK(!XRLdB*/o0cniRYy01>Ht(5.zO7:@.pFKh*/>Cm[ b DW_;s-jCN9ӧPŞ>K7(ܧ噎՗%U-igr60vŐ`EKLYa*%ȫ;E}@:a?ɰݡlzPD]rbB: 1C;.%[&|N(3nRs@>ӊLxBmR6tܶߖRnP^_HX"z6@)9EkT ,&GHr4t:#\Pt)ovuy)HB_tO,-UGHPKeu)-ODFFXZZx<'z&> ͜y9'0c*X]am n@(hWg%%j;Cړ!&ε)ǠFd9֗&_~9:;v`4}-+)?T]%Ci ]Ş> ,R<F_~n9_ryJN8}4N-ڧ|;gDݺ\cݿmru'/?k]i4aصkj?~=v޽tMoLd*@ڭΈ y@ڠ7#x`VSCilQ=\qi:ܹsxK_}eI Č7Ɵ!ybKs<1>`pBi>!KKvWw)P!֮LOKUUꫯƮ]wR7 Lg4_zhv\UUYK+z{"@6 !NУ6 ٠}x<&<._vٳg񲗽 Jo.HmOOnΐ)]}wI]SX5O]O7CnZN{bHIlN.سgnF\xu]g˺ǩ,t+0A@0g<x'*'ėQCN[RSiR驼>eBϨ/=ЋlTWop 3_p`{Ӗvٽ{6ݻwg& 4f26 *@*H9.GJa*%("&u{m ?D?y* {czB ꪫzmPITJdu*Bcc|(|mpek_ b2sCw>K2YyspquhuWbgLjb>̮9 z})1[6 @RBzi"H %h~3Bb]vw#Joa"-WOB$/S(/#~wC:|2>䦥 w܌߮/$t'&?$ :1My}λpհ.WLl1)VP!k(PL>"TKKs0w<#!D5C!hGOb]Q KO+l@'$|J0Ps3U&D:K"EEw6 B+nRB0 3Kĉ'<1=io^+.fK0@ʬ;NmJ`&(^^Ff aB 0Ր/jR^ H f*+^sɩ?՞v>rsyBvZ#~ܰ-;|ܹt6ʆ_|G#p6 bS+ғ`L{ ̷mZvťE !@KAk\=yZ8#d}est KyrCÜҧM!.FHP Xxʦ<?sBr|_[BHK1` 'Vd?9S) <~cf}. Q50&P5X TUEJ#' s  K(ec<#X.5Tw;+/8@%#۔ss;+dE.غbDnx)bzM}mRH^R-lbfJӡT^(6 < ZWZYLdZ @0RWCb_h( P^AԐܶ!K͗3)#<@CrB}^<2\若Ocޑ+K1v&7<.0kΌz[Dچk9˛_>m ge }Eru'P悏ӯBP{r-w>s_F/ Y߻3/|3 yϷW<oɛai2o?pɓpekJ\~hB]! , NI}{v`yi-y1i{霢X{r\mo_R?5@؈m8Md7<sA "S(VT<*Qs (=w)@. O&mR ɤّ56?dg^K\<ȣG{ 'D؃׾-_SxxeLW?8 6#Oر~Q\zCF+ǘo?{$~?/O|?ś+.#,o23Y>\R6 >dEPvI_X;!u*=e2*oED10@8 wdwC=SF .+㦗{{Ų=r3kxKcBj.mj^?|*S#/|)3Ĉ0* nloc,܌JTM}!cTUGArCoSu˥(<A>|<[qYܵE5< ع:{vXŕWbN?>={4;ܹe6XL&0+3!5b=t"sS'0zyٮ5ySk7P,E4LČ ?W5(\|gΞwf 9?thj̢@5 $j{nvko $Rsmd͋Fљ7,͍ 왇v{vAI} 1Za&IJ\ Ō1v.i8 ,'mHLms؀.nj0XZa׎eA؜`s{Xڵ %TR %,G|`eyՕ1R8 Ӊ֧[`ov.W`PjJu-!H`{"¨<%|.c3{-:ZC..Bpqo[}9M;j mgf9sgΜOaߞe/+x_U|_Þ={_JQ̳"`͜NT@(f}O$*=SkťFnϑ|֍!7 u.!p+_#cJB%/lndk}a kd6/ b9<ӬZ7ύqFl4c~0J0`f.(%Fֽ_V|%fC+f~4;!d!Q+}lH?0WڞB2iHόav?&Z{ -R)o(dL϶-aֲTMѨB魨$3D؀MU&%kkc}NiI*&5&<㻧4@ `p,OC;lMωvv=y^ڃtZI#3K<}߇ϻ0ËpI^0s>r K͎HPM gHa2nza cԀ&x= T &~[!Tf/)_m, lnOcuUL/n`@\涎}.mOWzNSL4GguK]6^lw$@i _ק1{J)9Xf$YOQKTXt  >slBWoI-pyyNUB=i베p!Y]|3R /70|?F%<窫pss=%`fjV{e@!LTll+D) x@PaB4=`]fyqb߉ٍL&AOXZZ/ 7{Yȋ-|Xl llbyXyhsY[84]A4ұ_13bꦵzojc$ji=TmvV#hljZ5i64ŴVz`=x?然1UN`cR*,-qqs6& ",9}ޗUιw潗}%$$ A ,*"-uPܪuA-}ZZ,V+ ";! $d%yY߾Ͻ|{̝^&/L̽|~xׄGfnDRHiD iDm ڥ _R`p|ax,D(|/s(y0%Q}Y:4FEs͸FN[.R!l۾âEkggjf$35V'CHB쨯Sdj P%/d Tc; NͪPє#Wg' C̙;D;" CJcG|NB*MxB% D{[A%xGad4@GeLMnG(J@`1L(8P&wa`pca`Ͱ)@*9F}pSI!\ZSMdV`oW/BR BSiD1]HLH>47˙Ƣ 8H(|ƹ4rxYcDe;9^0T331)%<}:r?4 LlmA8" vvT<Eu1R#RdKYȔ<w#9D3/gL+)8v m%QK:숩[{$%”61s IyU $J%R V,H"(KWfhӲw7T3R2WW6Φ.9&h~T̯R1q7!; hoIDwdVmL{0|3E[lZoAH8Aʌ|E C"3qE!BpSO\u1M'S#wL92!Fj\su1}cNa>#S`ncp#Y 0V C[-tx;'ʶ_glbJ+ucqϪ=2̭olE:)F4QZu31x5[IkB'mBP#:[s<ݴ3(R"sz Q9OOLEJ:,IQ7QCU'+d5"pO iUS%)sIjs aQ83L.;QbQ펦QJcL)ƕ%0u-3F2uqpl*KG(sKI)ُih7:;;AS9^3ֿ)DɴG[у{`L 9Sd` BowMmPRRl$Bm JwR^fDS*u;h svT7"XqQu&[g[W'YԾ"-ddM_}|;$e ɺGN*Sa5icdLڍR;{tNǭۆI&h|rqm"j#ϓnȈEE;9s!AcT#(y&p&F&%AYs1^ !h%XŠ_IwluB6W#(oS-u)#@os@(٪{rJ;(OZ11UG*1ڰ[<ԕ1%WyxFhTéY.F'ٓ#nl|HW =YNI^#6]$mF䕦lh/Iyg<I'vŬ1 L=+9~vLAgegn2 99@P5QsftWj~eh͊Y5.aJeSW nZk9<;1;RQ 1\eTTx+240x,tR鄘>ebPDtq)޽{c=Jڠ Y5^mLٹ3-( A)HD# Fgf 7OKI0)] B#D( rYpCPI! npAi76PF 7tg|;*LNN4X$bE)6c[+wfØQL9ϲ`0\mM3rP٬~ڮStJyn6D7nbo6LH *>>Y*Leޙ hb2+HOB9Uӫ\#>*W$iDYL[s9E p d4FFicZJ-KeL*4KtjaZ&HD}L> KƴEE{ ӄXð􍺞nnƨ l_`ƗDM9^zֻҪN&wSVt:L, lwt7Ԋuxc3cC0elܸ Ip|ncy}MyQ뙬s8(;߇~y4V'@3Yd"" w? j>r:b(mdlͤqMV܊`6wr56>x9XhǀH1ׅ&Ȕ/;箹J!\yetܤԌsT>@L^[3gΌJjq3xF%D 1:<ӺZr"7 qUiǐenPɩ+&1jN{6裣%p?VX⡡!~*#PL$˝'$RHӼ7\\H"GU𮨯46nw} $766k+nű'Uj,ijs~ ػYLT~yg̜> E 6i&vJ&js'KUszt܉}}^\5eu2v夊sKrNo#NKD Q Crؽ{7Ob1ҽJ(7(:$*vH7<$1{<M #@aۀ녜VW21V\sM8\^e/g+ h+}bmi-EVJlbCDwS4g!e)K&cL#O܋/_ֆ+V?yۺ 3fK)3M-Pdr37%+!;G 3 =80Nе7_gcȌabΧ@YK4mmm(]ʾp.F[x&N!6>~&])eUxZ!FGJ(! XR(Fׯܹs1m4Ej "9{;"C<K3SX]RUVH3 7 g@jS@'Tޙ *H/0Baxx̦gPbG|޻Q,OZyh3yK4n V G?M|oaٲeՏ?ko{%= =W^y%fqo mz }{0}\,~Xecc#5ws-5wagǽ@/9t)N-@; ,^C] "³O݇shEw8ХXh<-Ă×cYزa iѳoS@Dabɑ+Rjh.zx`f/>ݽkڰF{Չ^L:3,V0a̚ˎ9ŎS@78/[qO?z'{1wL16>1wbvzwcg7&Mu9Yۗ TiF.Iq^{%:5YNIqDgA( vt4F^,1eʔXZ0)YT(RI- `> [4HQ0`d}yhMvh$9*j@ )흭Q:ݣ($Js4=b[ł9 >÷'^{챐R⩧OS<=x39/fLna pCiv<>qءsXa\OOG\{V%/_m?~X 32̙3 w߻ kV/$ۧ`_Ο"¿0c C}o_6lO'8|;wRF`P<>N: K,M+W+9M2m/|1}*YDy=Xp>6nގ0#?Z{j&\{E($nG/}>b޼y8qUW6cڌy8ߊGg?W> ) gZ{˱tR\+"GK.\It EKr?݃kgu&^B/|3f=}񶷽 p]bW"LOPDl w_eY1ҷs'.\h?w7\Isnٱ?5`Ŋppߚg:`ҥʗ `裏ƥ^K7$ FpuwbdYgN[P;EmNs Ҹ`+櫔Ic B$u_B 0eZXg,Mί ՆIe>{5[Tbەng^\,Ù=IDsRYؑ<0& n 1y$ gl۱Z6cS693&G? lۉn~[=ç?iǢE!Z8xqګ_KSkD$I~Rtg'tVz w| =Xyo3~t=ލo峘2e B!pMg~Xf4(6#""'9O8w|GA <,7G/_%KCJ死莞g7lӁ'zpOeNGi_~{P(3_5(")e`,X;7ܺ}xn>w@Jš'bgj\pRRlݻ_ #=CNˏ’%!$` XtUpͽpO_f͜w %Q""P@. Bpe(;4TѱfUG]# %ЇXdi5T$qJ1Jirx@ U/A0!*\ w1;F0~6oJ4`: T/UK5=#T2{\]q'uU#:[o*pTնAJI0QX~2pαe6 B)~vtc8jّ? ;D:2n[!Ms06Vĭs'^ ~X0~a 9yaj15O_ -͝#ec=;#cϭcc "]8zQ @J̟;':~y }'+&jR:+`a(' ^&% Diƃ1Myr8=%n])OQ8%Iuڎ8RfMJR@(D6u7OJAa_IKZ~^#?+[+H<+~@#ÆGR|:QlQ<"yގ7(| aL6kNJc}04ԋ{b٘>c%ዴrM$t Cl1 Mx$N$زXt@ Z ' ݽ`aϞ}X1b]I5 RF9O~iTMcMs ^I TC0;9cƌȡuk }{4^®]`nnWtID2xIa_:,YjLFG&044b/i|I{hp[1$`l.){_s:gtءw\Iv˓B`dH讽+^'ޮ7}uGFnb_:,]z+w_-ômGgt`;vwG1n}wokO}g,5Sv2NVuq.n9 hGۚ$"RTی< "˒R"| `*1I[Jhot̨d1$ZI,73Uz~ݯǎn˖7JnqH <  .ػNtm zt#R>NX{ʟe#7 Iƾ>m]pY]}6}vD1!ѹbۋ]{׀8q9g~wtN:B?@Ww?V?v[A=?Ǽ8ol։nE08;ݛlI3 xnc'roŞw`Gy,먙9 Ds(""{յż3b~XF\E)ITIOֲz;wކeG,93غmNu(VayXx\l{a7\J ( |s?@{[ Ν]KA ϥzYR)ėő/Y7@`꛿utYO&Ot$YO^v#5ŒB02"m^E ͝ڊEEtU!=C 9*yeH7zt-c6cxd?|=xѵ5vWo108\;!`V{2lXZl9n#a(iK'6m X=b:aU҈w<\żyi=q[nDǀІՠqhj+rZ_TW$ڽ/0m<- )ZG9"!;M+H1"bx&Crm僓g>kJ3u_,yO%hvFWO?g5㚦A^FL4%]^ujN( q5 ۉ.v}Xt4>e dOrf.@&9r1+UcзU9S= @ 04z27ġqê8|9 32[ZK-fRFL4gd\J\r4F%Ub">\Ɣ{DdI1А )3`fh,Y&O}*S! D9="£n$iЛT c'J\`S J5antiu7{qÑS ކ2i=8A9)KXhΙ-꥚__]s9 h%bS?M;]HʤLU4j ֐"PNɁTq:WP܌X G!<"m fsBd=L<}ϋZ]5e7j2HVÓD97%612{%'&Q8($@ʡHxH2HpcͮtY*TWRF[MNxy 2?b<D@dt?ϔ>v&ky$z<0Ѣ?qyߨ):N(Oӆ(сG]GyI B. +HZ0_# pDos1ռ2 ɽN㕿ɻVV+`lXuɈa\%$ spm q .̩1.!KR(VkN@jK>x14JoEblNkT?}{`Dr4IK7uoHU)7nSdNm0'mf <*aCc2. B"g[?0J댌'pjͰUa"625O{U*XԯZ=뭿9lNY :phܚKx)4-yI%0ӣT<ǭ$8CA Wа*nTjܪ7PM˚C)Sx&!QVpjHH=s#<2$B+fsR_QcfyV3&yףy䫅o< E+g;0\))+j#r.1p`x#ڢ q.G '6(} K]IJpR{3  `Sl~dE,dG++n yVaYq#me `S`:"JVmUbA9RYc1̯zVV/FÂ$w=-5Nrܰ4@]k12n\ 2*k2]w HK@ mЌùb"zr|8!!0 b*((6t6?X S;ŇSd>nI4miA] &u  иkUdy[OǗe? +o._} 7xѡʗٳOW̳i ƥDyAr&o %9-e 20*xf¸&HmG`9qaJN(;fd@Oh꜁f񡨴rŋ&}R܋yZ4N98wMwLUc>HL>|B@06S܅'۰k8طciҗ <}{7 F0ebtu>G4:0ԷcX@Ўxhjrx=l 8V7$VO{1B+jce\>͐X,͍سO~g>K >wWcsoF@לbn2y>޷sp ?p_D`>c#GW=. ;8Nbf#3O(,0QZe{k#ι<@nX+%BY6x! C0|ZiMEo ޶)sZRy䑸}_@oS%oG{G;i%NYLƿnw/~}$y2,Xȿu޻onG/[)+ۭ#aExWᙵ| >j)[;5ݞG74LIij<ʵUوjID&$b8=S\JB{ 0 B_(+/8&ʁVٰ| ƳfqUs)GaҤWbj;knmfVLQ.,.s[pƕ1u~-CeNsқչ%K ڊŚmݼu':нsk( 5*L'r*_JMT 0b 㨽k9*"%N|2@hcƨyҕG EXM,Qk:'cx_=Jlڸ6?)F0m|0 ]w-ÍY4[-[06VG;~n^-u%&P^b~,5 v>k3u )YTKiR!$0R) cc|O. 2#+ j ʂ2.8I4c"|`m;pg[MN}O\_!.a\]+`qk;7t#aGWKN#M/t/+qK'ڽa5KM5~}=~ 7wƪw^\p4S>3X};c ̠ .= |T9$"D0?V̐Stj"FyBBrYεm#fRp3ETg_TKDx빧"Bw~޾/_.P4.11ܳ/}x 'x&ó{=N8qvܶ`$C`oO׻.zp^}8aTSE]}+Êt+hx@-k$Mͯln9qfwwXTWch B2j#p(|.J( UKl#RfMI_yD?blh Wc``> ="({gL4٦߰w.>s=N?(0ưyrHXd GA2Hז}={6NڋOK7Fz7adp_vm~s!aSb1Z!޺V< /l=xH;E Q~:Cs?&B5gPDT r# R0 Gmꖋ\\vx1NڃPN;4y䑸'c~@ͅ x?90m 75kP蘍n}mfGߌ~3ضuzիx- "ǧ0cll޼ sACPl+Ïʕ+ۋoy9\s<gBQ<_Z?'wЊ{Y7#K DcR*it IDATH 8$q9*a \8#UbB@Op(vt8cL`Y^Һ!MܓmKDx A~9,{+1~x͹ÒEѹ AB@ xXcʪ H_J [qz| qJ۔&FtBv887^c^iYGre4{>&aL|sOu$ٸb׌kRuKLÈTɒ> d8Y<'?-?3gN G9TÄmr)$;)2BB@A1 21VSF-l "DO=<ݟooIjFDѼ:ΆRbR6'E($Bx!0~9*{]X=Z6(u7g*FB]ݪ=Nz^z Wbl,]xaǞuM)7[&Z!jjU4)<߾w%./`Ö`P,@[{;8`8myJՈqBrqOaʑGI]ہ3791P.GHR'26@imV,!cʯ48p^qr[JQPCa {vFP0s,`0ڇ^^w ܫ܍)Dͣ`)ߚ), #juݙZ40P_ɒ$)7Ʉ$e*"004^^\~Ph^@#+_} 7B;Cl4&16 [;`8ل@ȴ#p#+^n+yb`Z༐`ŅWa7fzm9JbNxRȐ;!Da0 ?xL4s`tTG'ֿD5oO=2͏VT^\ ᨋPW@\lj1V*pyJÀ7&}(_ǠE[>թ;/4eިYd^YL_ RH"z<ᑀAHWu?(IR!ύ 6pE @@6Z$)bPnA( c!>`CJjojtpc-'{gyo:4&Ǘ 8XU'P#fKuJGøѱIn &MzQ&1zx)#EH/DP,SwB( 6ܤHC,LTyc _KMj*X f͆/XzI88֡g`܉9\%URu4S;- @1zJ;gj#(}gҘYG*B5EzGZq@D@IH&rAԦri`t$P]'$Bx(jFNF ktW(U}O9X7C֗ 4 EaF^E%bkۏ˩8qN:몉^`)$|C pX&K+""Q]vhp)F)(y"%hUn #vJ!N;hVrTwAGNTpV eҢL*'%c gM0qX+dA)*XLDI\7+v Y]Fxe*-܃=1PVmu `1یi$lHt<`Ɉ3)SăKz+*ʔ6Ę H=\lUéN縍@PF :$H">!R̶"J9 JV38R0H;7Tؙܮ̍&ƅ]BSH5V\%^6\rWlSy?G=z?6ܑ֍@%lAcr.[[;qCB >"&Xg/2*nK" 1epSq<r$/CbiPN< O؍2TOҙFs̻i;#fFز̞rpH꠸qHRu>Xk΋{8Gb\88/ $AIS(VZ帕F:g![*E4 Kom@(*Aun&q[dO2 UT6Abj~\G3]wr65D8x:M5  E5%so5ʋ4F>$%40:u-BHMȖ1.!RIᐲ`b0ُ3suQ~5Ĺ,ۛrƟ UhR!T.?"ʹ$RMERJtwŞ]rr( "*oB(QukFj/Okl@,[ޘ|^$FϘMZsAݟ4w#a"@0 Qr6h^#+pH!et$a7j}ڻV e)`UP:Уt.McI!B(B͍n>@]&cUˠD4,xL kW29]k Af.:r X tci8ꨣގ;[n+^}919Vw3WL3L8V?t~LÇ.,ЭpvF;H\I:*+xm멦%ו_Pת6 o^( {6Ne4fǣGĸZx8sCR$P1 lNjOo8<4QᑒƝ:f 5EgL"HM|HJ!pȜXr"̞=WʰWK!F /PP2ct!cY2 2i&~,>]ZK)!B)m2 < *FS>/B Ug4<łv9f(A=^(Q.3RN lҥKc}7gx﷦p[_ 5ÜAs!\7P]WQ:wJFծ"_uBB/QQ(Ur !N4j=o kD(|}5>WCs"VZE U2 DWW7{]犟 ={);ԞI``L(SkEb\ Jc`L]QPv I=~\!")1{t☣Q, +.5760<2TPT~fuۜ&}P)@cy~[_j{p1|_-@!r}BAazrWnoYD~͕|0VtfS̽iduE{3KںUdSER eh$sl#$H0# 6 ` [ƲEJ@cؒM6&VU߫eg~8'̗(̻9'ʼn`_|\uo*O}S_U<3wj.K>gBu t>kSh~nj@)U05ko ;^Y<$$겁AYp!%X9oἤɀ;oQpk% /MY&! eGBa }%\gB!Qz IN0;)`dkjဃ%,j8`w0Vr 3b`o g!Ĕ%߆^U7?a[^3&},K/ڀ'i-:5[rq7p G`J1zo/uW=TÑZPzhg7W> 76Ǐ}:99á+ٟ<@T`#-[X4C< BQҴ b~uQX@OSW5;c8f|9qMW'kXfx>vDN))ɿOeϡ, ;v .\ c 1)Z=jcAdȧs &xSIf=nSeYAL?ZC8H9>\m${k|X}6)"B4|2We5dxǪq"ޣ{ǰFÚCЕvΡ߫PY2ʙ`e-Fu`k,q<7kЏ{xG/q&g2PyލE7 ?gi%LjbMxQ}kE"48'GDND`",N*Rd5E G.t <pCJ mlL><|: ¦]_ۙRSt` PNQtI#ʸk9dTAR:Ц?x9N=-Z~W'GYa5vq5lm} cSvm VӿpGu ~b $uUz6x b2Tn[:]e7B3I'qx8/xwWD@$^[86+3&juEaQ 8c`pT"Z~;eA3@MsD*2-JWVc3$[zx6|['O?eaQ܎n'/12[A 88`O9]~64?_òxP(R5e K5ޕ}="P^r>q%-ee"7XBѭ'2`ӛ`nx81ŅM7f` tַqZ`ǿI> IDAT1q 0VqX]YJDg7#oxWjp`e c~\v:0??NILExg5\S|wa0?&\\D ͫo~9Ob̃Ս kٓA>6iNx?7#QΝkX1hc_~çJt@+wLeǯzq}< -ګBч`eG5}\d|,R}\ܟ b7uhpj9DcNYKo%xwAGM~yD~ԚDV^YL^skBdDk1 т-!^T6~/l1D;u zzv~ }'vwwqFk\|ů/Oz!p Nt>\)oxu/|1+~2ocB@="IcFݷOxmxt8% 1jyR4BBu4|QtS:~ʟk(Md)MMGE6b,9)4pf6)JRH (| @!Ƃ!c7d+ZLb,GuY+L {ZL}lʜ%X:LB0{ I38~c4$`4C5aԍ/8^OѡR*%-G[zS``"`(4vLJrZZ[D142_gg_jq rv0!10>3&:Xr*^|9s0 |/K#~ |:WVuRxMsN IDtw,n2nTL>UWq#{8/|Sg ~Cg~OXuߟ"xc/dIA7H7š]Hͥ ]ېԽ<rJk7u]cwgPn(ٮK(> ʲ31({do00(~cKɹwRpfλ5V1u9례?H=I*'QƵ |w~O=vwc,1ǏG?Q?~dM"aoRÿq+hAflnmƍ+]]=,}"ҥa|yy3~hաY|ztZ777]5C~ ;KцWU=T >g.JSe8+W`ksMo!>Oӟ4a??WNh j~; '~M,.ea0q Ava}qTK Vz[Seek^i+gX]%2: ln X^Y '$|Gx2z{859cVffBIH נ>:b{{'ٹY:x< g0~B%Cޒ!(Z%5AM.UͲ?N21@YDᅁ'wyVTN7na#qS_:~7#]">}ԧ|w#e ? [zXz" >ԁs]E)Q5G2 9 hzЌ_\Q.nq]QIPQ?%?]59dh5Z/ 9*OG xּ[;|> ʕg?@UUxp1㥗^ O>, $qfگ$G X` $|Mͻѥjwv(N':,Yk|*=3'En$K;Ey|ϕ+133@YΜ@4Cm _š8zxeYu\p_UvO_&.^`sؼqHxe$*9ZPW$ˁQcAbVM6Ч-kкS.֘@6u•6tD}Uׯ]K(Iߤ'U҇ʹ^~_ӧO6>ci]l,W\#b=A~[轗?D%\-'>J?y5,YX2|['oQI!/մc (|3 C~pqǷkkkxADǧSXR ,>vwyPI~czh4JQ?3քM=1==EhqEj/7ww$#lmmҥK7n`354nI:u*hkkkXZZwXv7R/v)e~nga{67޹v HGA#SȚQf:J?iO` 2&nf= /[6 y.76ݴacc#EPUq=7ٙa풐Tp|c>uioyWePJvJNIGUx7#L_"WÍv~_EE~-0fJ!=Xcyxr"Q4ɣGkЊxgqĉ?S?Ç` "c^y\t 덗V1䨥FCxS` d2I*}I Zk2gӲx@]*93PuAGLp6촃簹mvS9tXP3G?7SBxDF|F-@~g Ɓs0??mou.رn{Y Y[/2~V!D౓gQ[Q:Vrta(.==6#vw4mW%ŋJc*ιѣG>_|1>x"= L@2Mj/ɨ¿vJz- 5eaJi1obٗp.'?0xuĄX|c8;T;\h{ǎȏ^~O 5gg9ɵu,sz x;RzHDǍ`9S>Y;>@j,kbEQ`j`6\l#Ǯ/C7}0[YS"lVo"#o;~v6 Gգ)dta[UUU$z+[kP%>nQ;q0i]X! /;}܊X{8ſ֤ؑp8 uFU P \a(r%>D~m۳ۺ.ƚB?h:8>ڵkz+`uuc=*ѠZ|6xYD惬zKfD+"uلL^5!çnd@qGIæ!9_I2~ѯ?`L`O>d8:xP8y=Μr@tL4%㣾Gӑ}}pqsrGN 88UCEKpԻý:X'=|VK&TNX^^JIP4]wdǿkY4vB[G4գQmffFUgRmM`ɨhٮZ|6=7i=' pڬ1X=pga6`|ƭ?s+m((+#6SݻלXNDsrI ޡ)V.3lxhe㿅<`03wA+b`gA|҃@Y2\%iTQD1mi-Ƥk !W2cD0 lFPLqaqKέ\y޽hSHay =~)$8WΎVVi(XFsq=v?2[l!ê-5 "W[kL٘ZNab~vVF$Nv|7o|5=/G1q|n٢kx @ ֠q7v0ETe_ 1eĞ qW'IԹiC39r$h.\7<aeY&gkהRѣG'7 &U%E 2|5lYkE7`rjcD,̈́Q1|1M)nNL.q_Rb++ɾejVg\WxB~E&'[2jm׭P%h56XuGm#i!.%4X%yn6~+sĄyǟ)r >яD\^pb{tf Ɋ14+^ٓ`-N UnwTvjCÐ+N|ӅgdTo"[V6srC .:}c}~} gϞ ׍mgF*ڼ`vK/z-m3`03ө# jE`([N74!u 죷m{s}bױBNؑdvP]5 vuv3Mf|}JNꋜEҏltKed,O EYLYx6Z2~\m:]/ӑ9MAD- Ȥ4IGxʇ>! 9F5o.Q'b4x0T(,U-|pl4"Ê-A48u!N#2p(@oǞMN{#GTq u]l#|Ξ#D_VE RrBC>{>}j+J͈? M2b`PHp߇@ 2XCAEX3Kipe|G6$wygF)z~5lkسJ zU/fz^rcqqY9t I"muZ*9m p g˔sur؝a>994M?6'OkO4v˫ko {*a=` e0wgն%w<睛l.;WedF:2d ':qk=`KQ[k S ]m7qN]MN~A0 :K*\ӄQaځ DhK=3#m/+:^}UUXXXH@税!ev18uL19QdjaI5.h?0gMnZ/66?-P~R?8u3) QRz4_E}ݝLfqqG0;GlWՀ&ȕ0{1~4vvIgD`Z:tšCLJt?㧫^՟zHa4??kk3f/,,OW4! vwqǾ0V\v+yqZ%rH.sJpG Vxy.`9Ƣptp+N }Ѡi(dTHbSЗR{ *>Ob{{ϟDž 077#G{<#(+;$a 6p=xoS`4au~КM(M&MY7Mp8o+b aaaN=EEb0&:!C5 |W;)+JR6]Oc\RѢskOb߄]Mq=ex:~` ic%s]`yIp+ IDATR%A#BCY dm ׮xCW{K 8m斧 QǍ,um M+)ǺVcׯcvww??ǏcTc:Ho!1Np{H僐c^*X6&4fR?IB\E{5qmŠDGq8_ Μ]n1hO76aŭñǃpcs M`aa?3? ~n|k/Ax8} n=znba~.Ct}{Ge\ knbHt=uc xֹKi.q H^`;8LO7:(98,y1ӷQoll&Ug`㊧? ңڛs׮]O8\ UW1A1X2x&ak{.a4jD~Nw*ׯa0`,::$S짽66[pԙ<~Q8%-8l>jsp5k7 +y"g:oCb/Y($EZJw%n0zU<|}q\x5@3o7=a,9ipx{.^yDѺno/p"B._7Qo41uӿ|s:s,O#ڗw5.}'ٵX,@LX cv1P _ea8ם#f‰lֆݶ! y'QQ~MT k .-Sߒ_Oϩg5~q|'K8fwQV%vwqPJ.B27_6V3-/!( {gYEYrD`Jj wh)g> կ8"' \L#<~+%zKd]?+a-ȧ2›}dzQm|+L]o8 `j]?idmRyv#u 6b  }xx9cw~{~'qϝt.$41¾%&%8DiyU,G%yYt\U׆5vYeBo! bӄn:)Tڰ{0WM5Y(#U鵄1<}u⨜jqGxyx*|ߗq ru_gqHeKƹIeӳ;a66nĩqc-ٖ!md$Jʨdwf6^p'|ϴ2a0lofJԛN^Ii333/w?>>?/=,|\&Nz6 ml Ne 7QAP q0~NS$aY]Qp9qZ~M(N6LR3nȱD[p">C|gnqxǿ%EjKyеQ4/̯xΓgy\Qԍ_bNK>\Ayٟ$uhZe{rbܞƀ r)ohl-(njei=]׿1,7 >|P,ڔBzY :_!܋r'pxLc?,7vģs-RϨ¼ ˮ\{VJ>U'n^Yu-׆_- m?xaTZ(M@[ Z|8 r;FCF>C?ؐs+=ǎ)) ʢp8Io>(X0>Gk,\H EujAn},C6|rqQmD|- e*Q{9lo5!zN 绾O ҾdPnexâʢDUh Tߵq 'lPqw~<&̀ &{5xLz1KN/޻D XunYyczTWNXDMSùw/L7{$drh^|ƖPἼ)pw=t? {#ފ0 /3Er9Ghh%ݫtZ5܋/Øb4u?ߪ[k>2ҏ%ף^xUV N`333x&`{Eq[ d3rm8ٳ8y49z9?7}wy'?$W"xL268{,^=3.xD:+pw>n?~qOCQ\Rg|SxW0\O|uػH s%`% Q4e o$wkk c}X[@ + ה;z S_ǟ韩ƾ 5ofg1`Ƨɵsv/:G8)]kUbWOF#59ǻ& _O=~U=ʿ'FmcPLhPe Z0z}f&}&`3P5QG{DʪB,xX%$`VU)zu@x*T%1AiU{}5 la`MӤ]ʪJPLrqOU<);ߤ^`-q4ݣ˱os>%R r'eMFI4aplKA&HʿL>LN#Yd -G7p*IWL.70VfͅO"IтCh$iCMB/I#9z7Ҥq= $InCZތluggcj9cϔ ?0le)2 wK0$@ i&7G[/[q0 4s~fvYi鴜 D zrA,`0þ 4axdw%XFrAƪ ٘1_ũeLfiק50q͔nx'rh",r+epw-s<L!(WໆPEtijo:yԻH$tOS^?rgKo{bЁj5P"'=6Hh rko 53<A=0%'oOvCrs( kE9d8Yr5>Ԛ4[s !^zfPk͘v<-czaIAp1e %49csNdXLYFа+AjM "Ƿsgq SѢp'֠$rM?(Fꐟ߂y!/L;q)z?S(y=XL:3ˠ1:$HM?5珞/~pz7eN-!6Z0eVS"SA@lǗo߶H{JLi7C/#zƟ6 jrS, f,oij4aP!Oɒ*!c=v0EffrfF#O*VE@5Llns07% m*Ϸxh)[NBF|ܾSvf@Ey=5yCLr%ZDArN>Z5@~:ľm \$ w [1YSRUosB]b1NIWuG B[XSȞ dx&Q,?lDa.2$TkHI$B)5!X k}144Pu=lVPhwpa&,Q^CvC ka357` JA >݈6:|xȖ㨃$|O3`0㖥겊GAdz;G"pr<ƽaDԓZMܝ[.Z${Ñ=&+-`psDKW q*)kic' K:r( G,Q}l3IEN MEo ˰?ixvsx 7q0caKA z_]ƿtF7mbw^ZՂ*+X4>HEa} ,+sOOt98B} ${u= ¾b`}nbφds X^ &c-L w}ߑ:BxdRٶ[h?4GK^I-YMF|W}MFX-A-F04$A9bSLd-cCD c9k{"V"14-֊nS1mZd'cD'G&f);3@&rM2{ac400w(0B%N7&,;_CJ6e>:sοoMe1EpsrkM&0N iաgnهpj͟}!cJO)bˮ0@ `L=zkHYHUNGWGvGK4 `ԋ2ATPq+ tkج/Q*,a3*LO# $M\˫ǎj̵^e8@l{ 6!%P&A{@U A)}Z\>ƭ1%7W9c^mTW$},Ȅ*3.h<׈'Xt۪= sj0&?R2`҃[Jў 0¨.E o5|5A&DY0Eo a6e6(;a #slDPG_HŤ}K^[b"3-{ [*!Ŵ$TфC7q+DWSh"`u &jRQ \o!MLE xvr1Ԑs!` Yv/( 0@OX@֢M8SC7V&M -a/@IP<^}:@H{uSlqݦy(G'EAEq(c}t$3-R3\qWP+/ܮJ9ȘN0OQ(D_{,p~E.{YMpv;(I e Ms3eph`<ϟYX}(jt IWKXx 5ktNcnZG!#ǂ7ZgQS4GU&X T.Yj΄Cpg;FEQ%a&]Q-P{ٽ\&OlĝɝZ5^q )dFȑ #Usg+|mW˕+Ht~+ »Qf& o4b0CȘ~rC+/;i+~`W!3%ziiW?{k)K(O]|/# O=S@w?R('T}{S%RS R^8_12[7CGӫJԮ쭲>û(a$=xgG^si`7[iRxiyuvӀ$ߣ.}Y k>P"hIŸb$`j $F]AvǨ0ݾX]o#D4JШL aDHAoƣOVkcHtT0q&jЦZGy@˞fb9GےHѬp9c198g뉄~GzbN7{ E IDATIfDyI})~:|,@Ӭ-J}:KtOY r&ȑ< 2@agPM #%@w|e_&ơ vcR r u# ߸iڮ K:R[4mI|\VtpI-sx#BFyW1 iJACL< lk"8K'ŃxmłF">33^{ }& _7=#b y!宾MFO}RӂS &EWSα_c *TE$f]m!wnDOp%Ԑϯy=exěY RCL WaX\m;J}A"G!P:}*QFҙ* R~>2OMR] ^C֜xGe@%Rn`ɚYB{[h&W]cpH,(خz~;QeqbBaWӵb &n IN+з ) )Wk#a‰H*_td̨4.Oۍ)>C\DMRŏ5X 2&.kn~ L;ujF%kzPׁ{鰦ƦSZ}b_$¹׊8ڄ &n,׶1zd.pmؒ7"**Q,i3-|jN V?01w n!ILQ|;F@(=r@D=M24a@0&~߁<`dE EKڢ 2`I?R%axsQw|DK!D]037UJC>`'Ն% }k!{10pduҌx 3 jJqADt:)߃GRe,Sj ^][9@ y戣 jh cР( 譢jյ?J1{ȱc|<ƲڡJԆ"H]YU?ץf?f!2J, e-¥(?'@ yu]Öe*X^3Cۨ;/C [瓲Ȱf((V%B9 "! xgtN†Jć鹺ƨy]0ZZѭ1l%LaS"8u=BQVH4 E?bˤ|I"O ep3? ú.,Lr-O3С?LSa3g%h "BjYc9B U7cH/ 6{Ҝӯaa kDa ^<_ 2 ;߃2W$pE:$oc؂ъ}d1"%bYF#??! shF|D*MCh`vLO-ɥdCd[`l*I02STCƢG&;z v*)DaQ&C1z|رpMՓƅ+QO$-G‘CQI9(_olә`45.\_|q`L`3mp[Ü]Hmc2|m /gqpF֬\;߂ nveWzdHq|[ p2i\8vQU&0:Jhs/O?Sz010}W=~zEQE@C)a-Џɦog_ęs4o wz>r' #hPVEDQAj~";YBXkXiÇ8@)-`8hz4/W_.oM*z08\)eW5$tЯS'_.\G&KZ-3;^=~)QK;_l6?a-}vsds#b^Zl,8ɢwLQh#@Ļi9Z[waT%:֛1;.PY^]0pVWWxg]3M۹ỿ}(qC| _paa{XO>g^ n1A|~ Sʺښc'$-GV}gϝ~U|;=&M溭>.k :xK7.r-k?UC}(AvU16:=oT=[D98CeYW>v{r۬ثkQÎ$'GSzwauMi"J:J23=N.&tUYɉУ=7U|8` ݃ԣ(A_D ~'|Ϯm-nFMha<}("7k6.Cӈ;-}ۃ8N^w=BWѓ׺5Ks ޺9Ż4 }ϻPgxɳ&|z@o,˄Q8o-v?8yC1*UYƄz|Șo}_I# ayA@Qc0Sb2~'ʩ#SzBnckY,5N6a[954)"Eꡮ}?כB ^kBs.n$3d1NkSͬillayq1\B8yF0ݝp|P7 6;ra 54VN |K `fklme5 (gz*UkKtyi;[[0ܼ+~B׺w{K'h~Ik!7+ˋB0L޼q *}`u􅴉lX _iue [[@ `X 9$[0w4Qw. n6zE"`ey ;[z=[v0RIV)[8LJR 7q@ ,/-`gg~+n`ei)>G]v/m2c9J?*z@'.pλͽEJ(TCBIq Fu%~e_FшbSr` 0}# ۨ뽚RI3R­X[μ@a5axf 8*jPeY1xE!& D _!A^k oa͌B,FYn›N\,<3'#hH-cM-;3/^ΙL 4+SI̲@ Av۫L/Ʈ^@wӔmϴwT@(DWS )^Xn=v _A^k#U-o' Z `XMT[٢"\% ̙d5<I+K]vѻX8H6SvF?~cja|{7![%;a|<-y,\, }VV>=(W{ݏYEcj N1aۜZRB33NUĮI"Iv'OŮEKK-=>ײ6QmVZ3T-:u=J@/blʳjSKfɵ`bZ䬉P&7"*\kj֎Q#pY `3{t |/6B_tpU1"%מOcݎYhW2)s8=rU02s фն*֍|HQ{sT|XnI 9זo'9c-`jn[JW( /JAZL8{tTS)}DX1RX]:dW~rfiRDVJ'#_\c~ gy C!$hx.{91@rghib ӌݤXS "FUmU˫q]W2˺Hr_.BfE򙄩^\Xrn.n1W=E`H*F/]oW?>jN2x1&{ՋUXqQ5GdieFb*~Xpg%k1L 0)\^(U Q25PX"X! .4\hnGʿ)7UL}y(u{Tb-( ʰXx%dx)T!Z i( 4j#Ϸ<9'ȷz&_ǜW٫aN]~*pJMX _ tڒO*,( ׃rμVeu~Z4I }/%ߥϊ} NN8'rn^NGh\DۄuxG?_zAtđRuBC-De<*1EֿY [$nݍC\64θO`ZpT!AhOOi̟HD!C ":\Ofv~WS bfv'-蠌U6HIDR-@_kL-~uΰ,8QʞF%ZР:٧~C^غA-s8|qYg4Q4ˮ0Dm%9[TZ~« /lJY{74鞖Z9DV yP E<غe <,ho'c=%MR>_B| OC]/-dt~\byה/;N)nj(롶XckjWOg=o5u_tBQνb6ep!=;Ixr|0cʤ8.,4[`}eMvDY9 ‘Xi,Ka a= bid7SPtbҫ;m*- 0~~[lE_Q7- PBۻw/>O~q7-oy+6lX-+/=_B4%U{ރcM3Yg\wuؽ^sʸ,nwO^sn݊XR;`&]8b'Oٟbw㩧^+/6D3+Ⱦ!c1Ÿɟ 6߳@T|Gw G,I9/3m_9n~kΟ~6)wq@ֽZ* Oo ?Zm[_9{1 7(2a )zp9g>i_s2Nhy/wpoIpq-NB A&Dab̕Z2$EBJdFb7¤˚D-.."Paр==FiS^Jy,S絙igo| wd"rۏ<{챂 ݻ_N+Bm2*M7Wҗԫ5-,,ow܁}bM 4Yhg1EI$WEd2ރ/o+j 3Qnj>*AYt{RJشiSIs駟AD;-0NY'zV.scǎ'a׮]E>[^`>k"‘#ON<%I;llo}[qKq(KP.a ؔ=u#3]RD'Tti?:YL3ΒDҤl\#:CȱʣH+d#aR/0US87Fr'>z=o_yhi_s"`aw.וȮ+G" M7|_~_+u~ "<3+ DE 5,ʀhf6Wdk !`˖-S a݆=:@n CSyFN'']{ヿЊP x+_ݻwȑ#طo</̳o=nOҝ*˚C gY:dLO'\?}jDq)$1#6l]peMϠi&2m@3_ヿHĈ}k?ދ'Ob۶.@%@d{H,|.۷㓟X4L?8~> z+?Il0ڇˢ5ݻ/C۶dѶ?/| "$;\ 4|jI`iBCRPd]xNg*^1uC, ndD~g?{3n+Vo},`(B 7{PZYՂ8Z +&;K @,jȸ IDATU!M QwP $$y> $'f5:Bn1 ]UߤLL$9voD)8h}0>F#y睇/ܘ޻"D }IՅW_}5Na~a Ǐ5 sNر?ҠSNS8qp0m[PcznAb:}9j9q$=qǟ=!8q48SԭO/Vin&,I:Bn 3s"N2+^F/ѰpLPdFӤR3k' v,-x+C KY\κ2 ~;7h-}r -B%I)ev O0y.o5B,|\-2Ӎ &ԲRw5 ѭ0!>B[cn3-p(42Y: ;`;{4lW>7wwUWa O ]Д&?.R|3_E/z.r޽w]AvEk&(XWIvu@^"ahx,cKaWUd@3>X!4AoHnv鱏A~X,<[T )%N{fXƖ@mnN/|{3s[Y_g%s=?s}Npcfwyheez& >h|Ӧ'믿w_O'm_ ࢋ.k}z|]Bixr ֿ(3FE Q+aG#_.W͂ H2xneTjFIEn?%X V׽cUcp|=[IKe6g1Wg.>/Ɋ+_Ӻ&/~5 ̦&AQr@KOvk˳&'DN݊ VRgS.)4 %@ڨKX)XLӀ ƛ{E@J-""^Gqk_J=ʮ,ʋEx2kߎ(,h9p8={>+J z luߴ]#8ڰ^a]̝>muժe8Oa<ɴfYEa^5HYi$X4uowTۿ8x xk^FK]] k f52z^t=eL̷ED؜W 󊙎}i?q'>_(w=cQ2ekP+G(nBg ̽+HVI+ȇ`USjM`IndȈH|$KrQ!}Y|]zJ5$bGnZ"G#\wup)xᇱg9rĭ~o{\s9wWPtDp:ؾ]F^xYwp.gZdBwگE֕φ܋;՞`T@mk3ܹe|ЩC(-'xdcJoKr*7i&r-wxgTZgJ{gPQ2-(%Euº?:6k_Z ~_җo~lWBɟ݀g5Rz YONcd"VPT`J8/8l:F14\[5w+\G(-,>O!׿ z7f׻_uUx{ދ1z!:tD}ڵ _pAfPv9%TZ ( Y׷Ⱦ^_\BȇɃAP pfR'=t(|WGM{/Ǝ&Ww*PvDv2ow7Ɓu<N<>?c?f;v̮iАTW.8B:^Uc w{jDN)<% {Par^,X8hLL?ܼ#ϓwY_Wq?7lĆnFS,q㨡1eߍ׏.:>qu8~PΝ;텅xgUCҹHJ ݵu%H4ϔȶmgXXX(TXI@b/8 J.4[yKaWk+ Z+2 KV% ]@ _!I A L 5933̧ř]'O^B/ VDWvӔ*&^CJSOtKqeu"ǃ<د U+<(_a?~ǎvYTd3+fHgƚj&Q2`ڿ?CL&|yvv,(iP {kWcΎ駭tj穤?StشiNd>[b8BBAyS̛?\Vן/: ϐ +(c=VO۳[.x~aJf^p ?9|MuN%ka8BPeqd芣Z;ʃ¯eZph8핅q% @1 KE[VG ֢Co6x W^y;ՍV37%n0«Kw~>{W^Rlۺ>,z!{=W_]2W7lMq?0夞ZN8p8qD}l`ZMx2N#ى+f(A0$5gjaQu#(nze/ ^ /'p׷ xTs+}L#l~թ{SQdvwڍ7ԩS8z(c\ҫC駟6\޽;t(yg+WJuo|oH{`e'LV}W>Ԩ;3ǎ;zWџY~V ebڪKar :*$83c8"bzm':-k3fsiuCJphy<4:]P!z O-0W857җO<p zGט׽˷l/o7-<Ћ7x+^iH`=;~#b>ЃY5I4G̅b4 ~"Mܷ`+T_07-xꩧp-0??/wN~1y J>I{4jE*ZC "Moznp_ǝw~wUW/P]#t+]S磈0^Z»n|Ch43?|{ 浇=iK2>Ka=M:CE SǠEy@NU$yNl$F!GM_}(!-Kk`M\m%rMӠi -*_6sH DV[Jm*\9356IT"D|W^ S/\a p2|'f9eTš x{ދǎˎ;|;1{L%cj'qere0/~1~'[k^Z,FhEK-]-t [O+*Qeo+M7I-Nˈ\%c=wg}v7nĻn^hmp^:֢JÔ} ;1eXEJռ{oEbw_J ?So;Bk&rʼnNA4;[*dMY=6oXxOO`<u`NtOY ( mU6,2*8VbIuo%.VR` $G#[q`I  D"8۞Ӷ@0c#>c Q8@s#PC૰7BQ"HT. Bt/aRg?CNـ"b3>1L;}z# 2e"0ͺ`(Yo^sk7GѣGqqlٲsv؁h yk!dwc9Ly+_op?x%F:PnVAO~ e4\s /<=&KhW[_ rAr|9\qŕ馛pq߿ǏǙg%hkk~7N=ÿcT2iTxqō7h}/_Y:u _U{kl$oD_Oxߎds pD%dDt G_Xu0!«_}5zM 'O8nd's4!zUWcXn',-Mpzn)nUy Q#L #S 4zɭ~|QpfsAYkMĄZ4F8!4|;  B ITGasiVO={(8Q'9%;v0.]õMT/9y&q/PC}~wc,2ΙQhY\aqq}uk 'NqhT4ʸC@jEo&-w 0¡P'#5wx Q]ӧpyYH)y\VܞYwv(6;D@.tј#}0%MA^*kKO8 r`(rmwPӴgpj 0d(bE ̿Y uEgL2D,@IpRh[N4I^XW0x /XL9 7=7A>) ѧχ:ňH6"X8bc-O[& KBdҢE `b'Dh9˴n׿ZAi`J/.>by~']aoDۘv9>V(TF ը, s?&ri2vvBLF&x=y:F2$D@_4G{0S)I*jЗT!*f͵/g< %BqVG_k;ZNWexy9Sj +[Sn5K-4|oL&41`F7m8 K0n'X`[$QAeM\mEh%Q_qpĀ9U,@0۶2FT׭(1E.4(xєI+}O 1i]_-++i09\^/XU 㨛)]B(OgW"R287bXs~=ƅ!d;33c!ff ':eP҂.Rx˘ogh1(Poy(6(3BPʹAW)S./(Vϸ=iL0JV`B5M^MerQRCEMR `4D^~ϯ$ا @_LWIg`Y1 HdC4X ֽ@< "[Bl9{~AMj! a<#_Y1Dpda Q݅C`uJi^RW^~PB=\[Y i?6nFD>Eۅ ċ+ĐTPBUw3ѽPƘʌ.B)u#CڔSj;+Ӣ$Mï XQJ2s=0!*O gu$˜m{: ;%/ uR6+k"BCSe [>pG k@֐Z,&$<HGZ*|;S`DS^J))3LT IDAT8ڣ7\ۤZtflXp\_m yntOM-ҵ̼Ly M:X`gթn<~ NT/8Rr{ڪڶ}Nt8Gŝ*3}wTA?u= Y9閺N&K?/SXXF[bH@@ Can?74,NLվ[YԡAFImr^hv[BIeDj4 ¿'wiĩ6L{uۡ$, Bq⯍6i0Xsʖh݁dQ)-т0}hr Ҳ{P !NX63ƘΔByiGעK UZ@|QOQ o/>J4L<]iRlFlm;<6ʹ &$ˆ/,)K% Aծ gq~a2" y^w/-U">ܧRW^9AU?;됬uqǀ8@Wa 3 @˼9ʵ7K 5\-6D"9DbT} @ecYxVdO/?~/vm ` 'U$("YsSv;!mfwAcqШسK{ȳF=j%sIS{NcBn y#u8I N9.m~"gm6C 1Ύ9v/* gMY>_ Ux:tONI!:ymU=,iK2%~( 䃶)A_C9z*˳N%WXm5 8?iR|>h|̍U?hh3,[]}OC9Z3V(ޥy!!2 h"es=ɖJm"$sA>Ojz*G#/bhӊN_DI.{e`„#d7s d/X\\ĞE3%b1]={aAQn`N邰N8t2%,.,ڃf0,siuoBO[qzTK Q"-;)Gauss瘞184@Œ=cNw܉f0@l3;TSa%[nnq'? 7077W3,ۜ$FDg/ \fv?a~~?F W 3,,,!'뮻0pWS!i?  ɗq<"{7_Ԡ懳}X\\zn{Y# U{hqÁ_)d^ejS-_!yF[[w`0]#F6֌5D!|1:Hr;nWhə'U7d3tq<ƭ_ ^] n:"I&r{/Œ{qЦ5nGs?zlܸ~`aao^K.HNbk?`3aq4#<}|lܴ FQj0?x+_]>v ܕQn/,,>w߃fAM>\e~q77xի^v_ }|rBjY_Ï<={A3\M7p /F>W*\r[.ZσדF1 x仏}7m.Zu`~qg]]v1u`zֿQUSW"?{zlذ߆㒋/ƺu9iˍC]Hw_W\ /O531c?|:߰ோ{O?@!p H6A0>˓@aԮHK-ry5j iJ18BR/8 ρ4P5Zj:1y+MLzomשQM7cX7;dH#3Xq׿/~+@il;cB 33?~r?^b[}Y7˙ kFWo[t.l݆;vbYh*SB@ ffg1+>[z˖۰}Yؠcj14"nqg>2}lwbrL3L_>wjwHW6oقmg ,n7p_*oϥlش [lpv4Dpfpme9:X~T 7amΔjPkR yJH R1KKh`N5N4Mp$!Qk"0&UZ$mfv&H*9^U&bCe&A4`;bFhy `ƍ زeF )ߟVSpÙY4~R L`lڄp[0ٞUC0of0͛1b9NۥSחw,fgsڤw8-1w:Z/ gB@g:K gg1Y2P ۶Uc\swP7o`8mwfps|탟/`v,Lg @mbNrÙ %6mp8۶Ye4 q۬q"`0 8Y3 ؼy[wPg\C gf0 SW*djK[H)11JJa[,(`F&F H@Q%0,B])%\_+!o[mB6A&0@AZ \xywFB =>: 8@ٰf_Q51"! PRyB^W\)%av8A"_Yg4/Xu<]7Gm 6 o̝+`)rlbuF g4/w-qz޻ >4 lh֕/Ij@> 13A̮[mCiQnHlEuE1BQo52\nDS`YOErn~wW*)by]@ 1}FAvwϹOCPZR`9ۘK5B/3(4Je5=gA2MB/߼B@7[yL|ӊ;՜mU}T2RTc_J~$],Y681cuMkk*.V?m݆ &/Er&hD t$CϞ/,SN4KwO*~k#Cb,v_#t!)@{qP?\O!6rS<RWB"Ky#Bnrljc D.k4+6xb@,x2})HRDN1IHi[+%BaE9}tS5<;yY| 1i+ke\/oWt ڲg֢OT} 0Z1fln~BlQ."<` y|Ncծ2X;_ q*V$H S+-KSIՔz5SwƖt8㬟M:]MwM:!N4AS) !!riZ q(v M`4Zd2`%+!p5(FDB+ZćKWWmf40 `@YXg/ŝ{g80eCvMXX6rjbˡ٩?KM9kȿyrBVQ{eF L),>Mܳ9??3aWc9] O©RarV-P:ӄ/ڍҌh[q(E'IY:MaJDhca^n wUĐ@R|I'ka!:MmGC`P2E~3y]TH_PXsX&_AS2 RvAZPę%L9Ah{U_]B] *OޯOO=uIՌ Xgw(i%Fe#Jޭb KtTx2IꇾYu*tTKJǒ(:xopP+Rm}Ia#!4P4_}VyD,D6n#h7ӌ ( 8S̋r;:1 TN#ϑY2Ahi}>MSꅐV-"R .a׿s 5wY{q)E׾JcwX0@Q}_ _4)dz!L1ZN{y p.1%%?WL+Q0{ pKFYw]]}y"ͼ"ī$v0CmvԶ{HSj ϧi"8F%t/1sDi"ĈAݶ♆Yzޜ)*dW=N8ki19XNP-QV48腆HL.2JǬg8 ݿ6br6zá~U)|/sASf㙆8Rr%~]1 bԃ,ˢ=#}i_)h/V\eK߸бA!Zk 8hx!$r͌BhThĤmeMO;`4`]0MӀs\>$4EBo|qZjT=6BIE?ٚ-[ E"Q|؟ys-v,5Z$‡;c(x+Ŏ^ޅ `medp{b"jLŜxd)T-ލ'H{p$^d,C~Ne |T=Ρ ^V8ZZ-AA>N)^P[Tn!@E;>5=v鵷,7ux.y'AȮ}z# PB!bv82Ͽ %I2bۦB7`wS",pϭZt5sqU{H+);NS[~LԂ`V[{# cכK:+r.b9(v}9Сy Y%xPUGZ P2i|ocXY/-5Kߎ.3t{%R>cP췦:X;kyzR hzH^X3]-#y_7Wto7ύ#R]2Y\}.'% )gQ[D7sSEڙ-`qҖZ9Z|H|K $L,>^ oT:T:B]y}_փ1cD5ivK#m#X_̅%4Y/Ac(h d\/̋֙u-gA9z=r}LVRa}LY"؃v\ŒGHTsM/s;}ߵ>ڪ-(x*gпv_ʅHBlJl 1EJչW$sԲ6IBeP{3H@,iZ2~$KyAi4 !rV3({}wJ O%{3bi U![T+|6S0I÷7>h% n3}B='3<8*œ yV37:Q*f0E1 ^N-y:;zH pLN$sNŗa mNsRZ`ͮEiOAP@+W 4`Z |pi W[0򹔕0APm>_6Vq{RY3Ky$tTFlVTfC}hR/fغ>4̳&Ai;L5 j,Xwj<#T ښ}7<+@RBRJ@ 1ğVP[!tueȭtI\VHm'%B +ڸMعclٌ3m=Bh_2[1xb(a,D{ϞxϞ8S楮^{6.Bs;?o 4M|H6%:|?0`H論h6-9u8hAwGuc h'-9|<@ - nμEݗ`0 6>r( mqQxgdgǷ^sqe眅A3(Ӄ}㟈IO:|O|>?xYEw.ӟ?>kM|2?0ÐZo=sزe3q]ȹR蕇|v8y?{T[( !jYh0 ؊${>hͰ5(_$ƆM,uNub cf hD  qmܱs 8t8Jm6l6S3s93338thfH:PѐA :կ|R&\.uH7. d v8; w?,X=,\W j_?}}x hљ;ck7{ @?rV^p5F3ha<^rW7@ 3wnuO{O9M['g'[W}% suo܅ǿT;E瞍׿'K_2\JKuر ߼n<ʼ.% (Y}e{L *^R;wnǵ۷~II= IDAT/ߏhM 2œ%k9!)Й;cmسx DOu3m+vdcyӡWX* ul?;,VƎ=;x ׂpf(C_IN14ArB.EefNc&LH|7;KRiu)syf7RtYn]H5OZ{=9lܸQdV0 "ow'uGi6WN Q.{RO-K.!kɰɌ%$ߥ_`Vt'e/Nݓ0VXdp*ojͻ.(S `^|. Cʟb gjگM-Zw_zYe.e+o4`p9oRc ~SV5׀"C%xа@j+ C;9kי Z\Avvu_LBk1'w_8tL|mS}\2 ERƯzjm%Kџ-nrTs?=aQ! fXtƣvW] japnZ v(q}]1z}ΙSnH9L/~- ΢p te|86RF35zm~ZIq^0!7 !&'(wΰt\*OO1NRt`[<I!+{J(ύ/*ݐyP- fg f-  ID)\n_af˹b!Z͖97 OmE 0#f(XJJ i4MwlYGq]Lߔ dƗp0Gt51A~E] :pGc|E8(4JHu4gcތꚅ\[C)K&fD;埭) lLЬ2bECbӑ 'Y&J` ;@ ; sa՘og* 9fnٺomI=$iy+gM:;_չ W)q%JVnIcOv5,˖D,Q E\S9*N{/7,x;KUfVVfVVVbh9u37&ɗr )FWm^ ٖ>yfK8rL ݚMyC`Jl`3TBkwAH8BUY^{j36l*K]6@hCwP>[Rhv@v DĈ+&ͭ,b{1h|]abcW.ޝrIHlLX=AHePW@v%,rsW)_ ֺ5 ee#]dRYvp˭sdEGNJE'ct.ɢҵYHh3RaM'jS~'|+b5j343`GkS^>$n}xNʖ<:7*gMry$iROZ{J{9=.V>p0ȐAN*U ($I6T@ ⍡Ih%P gX{[%4ZU@GI 077ѱ1lڴEӖ֦v&Tط\~9y`t! I#d.IW r[)Z59`2v4يǟ.4W4({%zUShf y=Q <=yG 5"r<`CIԂ-(kb%eo R>d5nDVǫyk74Mhd 8w0,,.z\{o֘XʦMJѐ9<.UUKkW@)RP^Ц6P-6*t1*|4 #M -U**f.;يm[{ 7])nrQᶅ9AJ hVF 7ym|oe繲vZ|_/'Ԕ0kgSdS쫶\<*7l%>;y6Xr@XWSHN}W֮]m۶nUdV ~{!|GX~/cj,o`bƶ-o_V W^y%jwD3cN51ǿ-8#?cDJVA_aqi /~ o0H&%wLejxs=x_ۯb~a7:2kϲiW^{3 UY\wvl\.cKh~a^ ڝѨ-~yް$Hqll*Lcs TM%O\m06\[k!'DirciŪ@2veD+L%[f¹)pvyn(6mR GǺִs(ĭvmM:b 1n@W=ZAOHF{D!_Y,VYڵkkMxAD:sw݋oڭg߼`̗sZW%GD&/o B4q=r?3I3VrV"a0댣믿goCxq[X <3OEc~WR5G?O<0ݮ[^s|K;n Kzň\ޘUSgSZ%g) i9xAq$hs|Qɓ;\*SE}앮'y#5~̓V"`nn{u(ӯ&'' &˪  ;؃67 v!٨+k,J2'UY5V= 1Pr1ǖtM Pb0D&$L@;ۯ͸8.n]{R gΞǡ㖛Öq=X.cELNg6cNsr&į*}5W௻x?.[~@@@!7g?~w}?>{UV4ʲ8+3 )`<B% mժU?p J ?O0̙3xɟ>)qS"h'w^8p=z.FF:^.W_}pwGrX]%^D5kW{c ^{Ucbbkvmט\$2 3PʲĿ|oyigAB%R[mۆ'Owq[x@xo6/-W,.,>x}سg_@/<㍂Ng$sa:(VG[2f]2`wĴ m`N+sΝ~@P_SK,epR)T/"[o5;Eʃ0;;_܏wL#==^8KDcjq[6NjmZqfjehؠ(+xZ('Qd@Zd TK,kZ੊7A[1wgO_8kw\wY3u<~e8*M_R zAt ,υh O'M%| /uΜثSOz[>,ZNIe]|3Ȉp3336j@U㛏"b,mܖ֩S۷ck땑p^^^Ƨ?c>14\;x/.Zۼ=v=aٻw?u7/ l0}]l5v5FW(#w)=W>;1@>zu]O<N> "¶maJ Cŭ7߈! g||##-,/-i8¡qf<]Z j!p0OSًB$*; T"Pe7/ʩBC/QmƠWu;K攈^fA۬@O; dLN p.^:G^Ce?[ͲQu-Xs$>~c,.cdt̿窵1 Qr*d?0;w7۰a>ck0 kC*.Ogdԧ|fw®೟,z=/V\p 8{vWq[,GByVM⦰ m6GgeVwa "]{b߾} "9r>~={Zv0.|M@ǿ?LMMԩSz!T!/X |M>E$UW]< ~mػ(mD#f LM111yVC[ZcUWG kg@w?K2cg uuk"BRs~ s<{ n^cm

34gQKI`g'c-Z?,x *]w݅=H&DOYOK˵17 sc v fg/Yw"N;[ns߲,&sgHᢵ}܋ցzk׮]::PV/DHY/R{-e4 *P.=1.46 j#PU eG01ʮ//.t-BB8h';z͚pUf@GYލ-& QV+fj!_ݞ`ʃ|_E4IgwX"jG2 bc?ش^= {{uQ%)6R@|^z 1NW* e&"h'?Ih1;;~b}e~loϩS'AntMW2a~qp#=>Jit:#DNgi8N$f K[8O7 VQ@LVbSL6Sʞ/S IDAT "u w+8֐dTm?`m299ܳJ)8y ?~0nob$6l2cu]L~ۮ(w>G?Iᑏ~? (.$ \G70$/p5#/ 5g?>G>o Kas0+3%adP6)<8|4:W^9o#?7UoakM6}* >5e{L+Xy#@O`dvϞ /;G5yЮO`0\,k֬qA|@?n܉ݻw Qhb*h? ~_bjj 3o@wW$BuׇuSo­ݎ.muAl E&rUR .n&1o c83u^KK Qy?e= WÔ7~VoVڨ6A $, ,PV$Nllf*ަ6Vx)gtBP1pjX5~z?22]J>7ok']߽EcO''Wab|ܮ#mΒ¬c[t k_O~]v??$)%XU.ae\8x099Yqu7`||!go7؃cÀa5 jƍ^3\8*;Ӿ8HQ0, tvګbffo: 7m,*`y5Gbp>TL_-e"B|Gŋ/"o8; ˌ Kg>aBBoP]|ӟ׾5e'x"[_&=uIy0jQ l޼OƩ'x7W]nqљoE96ebqC|:Sv11ÿ0}%\[Թ xy}=-8,'~}RPY}x,ZkF˪BeXmyX)e+4yϮ6HzBQ?y@= է 4řYz4ncddyMؼi}7 k֬FAȈ_83ngۋߏށ]ГÄ9<;{x=宷SϫϵN" f2xJ?qfmD^^W>#"\yeؐw?ےGA!ǿ^z%aqùB''R ^>Dv޽(* ?إ[x%%* c+tvv6j p~$(o7tRx~/W'DB=_J>c N>_`gjTRnB)PeOq USbas:huČ~y Ͼ/8˯Jh@=;02'uUЇ> {'OpaK_TXॴb1yXXXJؿo5{ lL++;x|9wtK -gvXwp;+Syxy-9Bwog]L'@vG?}Պ?C%zRmp]`ǎ6VzkߠӱPV^w+Y&''ի;|mwwƒ݃ukV5krL0j>)F)ϸJ!(cUUFL`Z$چ@w?Fc+ uA+hR~'Cش,SluUA((ܲ:BA/3sOUƿ@p4P1 #<߿κeگI6a$cs>n¥ zI;۶UGs=y?}??A$bkMT((Z|=^8/fb5Μ9W^9֭[q=X,F6߽ܹNe[k/CX/: 3d˚,fffp`+ntih[ /Wk?yL'7<З.am~=yn۶m*kxnOѳU]oÆu֭]( o|?[,˯ArVTXQ!+Yd7q^`/REm-+$Tk : dby&q UU; 65j,e>V`FeW$Ire/!$|aTŚ[C ZPcx -A&"x ˿?cyٺs6~SB!<ڔ5O=;0Fk {ΨMDx155gYfffg5>>/}K0UN̤/ SQ"ݻw91ٻnw^[UQPy~>o~S{GXfS˸-d7R\sy37|_Jߓl1v[FY49~Ҹkqqܸ֭ RWd0eK;o`K:6NHO;u( {kiXD[rkBYX\^+s5*hc&seL6T.Z- E(rc/JaAREeFK,$wpR2;"LPrM>W@xV6R09$ޑÇp1_?ё1?*s30履~ 7z+֯[%3/]|^QCyY)^Y>[o7qҥ{/>ϠWF#/:Oku{x7wqrPK\O 7d8(V^뮻nz,.-gOސ32AA8=~"z?Vbې?o) 7܀Ǐ [~lTerfϸH)gq\>v{xaE(N Q?//:9#<8" _W@d׌8@@rdǤT.ڻ Sh)z% !},f.fZ=]be#g!;!p +WI!i/3 ( RVQ\KlKGPMNz BUڍj9GtmS3R8x5f:Xamcoz[J[l pL3ХGdE!L,ܲ%VqN,Cp_}wG,L pa&[펱:kUwDvy. mp!K]-kB$&@`M)wÙ粊à ; *~?83e!r @?J?.(վfyL \T Kyd[.d-r{'Uip셸}nً8lȿTj@$4uHI.YGhL%g̲/)Zbg:Tw& ЭJz=gm (8l:nFB@$Ve6ĹC9 h&W<wS?`L(+닧=XA#' )~{?o]m}GA&Txݎ ׃[ 7)79YIh&\]7͒|'hMxRy a^.[f"wVMy;GT>o/NeQ0]2ձWg8Hm26xrS*S\. j[W[4FZF:(ʯgpc8*4Ju4ayL34x/a"gI}q2D8X)9 l?# w0{=|Dy D0|:>MiOia`BU=u Uq:Y(H">bBJqOsh}*Sf ž3scݍ03g S P%QtfT 2E/טk.x X+f-(e7ȕɓQXhB[)\1Œ*ragsuP`hcfeY9PVcJ86^ ̛#QdSV{a*3Mc!PFtD1R /M&&Vc,/H-.K34!4˸cEꈞI1i$W 2X&.1g7(NgH1$ dg/&( (+|zfF^h#wΔiC7yJ.%f[@h-+Ry:c_Qqr^511IpCA6X]RZ$+ecaRĂU^~z9B]n#S^Cf}^T#^46NW7X9D2 QWB|v毭9n$m7E3Q _ 3 !P#uO#"8坺} E5YxZAE?NH$v ZY`U$"kE GWTV' "DWl zù(y([Ye]X;U*&F|-Ê \bWʲ|ҊebUhӃTe[/^\naQtUv#)t:r^% xNfI/,KT ˯ .ڭV~)gLqh4D3\PzI.ـ_E'k8RPfy]5SV7:¾ьpIjGZT?<#o5Wg%k?5,R3Zw h՛4l4tS7*BQ&JqB4].!kH|4"+3YP@ղ'UB(T,k\F+iÊx3 }=ȝW!#nogLp ۋ `w~"͛&'w~zFU(R^'k|G]¹.(O>FQE~nYQmp>Jȴ מ/(MsR9`e>/8ھ?&D<р"s,m/\x܋D6L 0sGBN'ӸenB^}L? ]0֢>#\ɢ/ @0$W;p̋be+ ".۴K;+"rƮ@~N [(+spf^fp\|9?GePkg H^NG[72~'pۭ}Z'Mzn\g.8a_cqq[wa5`3`S]q-g2N8mjg= pm`5ؾXm_XKv3ZbylG\%",wqxQ@026e_mٷc?k:DRAlZO:8uc KK[o ۷~Y}SQw۵:|h3"P4F5μsʕ+֠唖}4. d^6XV%fg0U1XW@f ',~FUh穂!;3N?SkS>z"Z(Y-I(ڕVS U"vzbYxBgd33p[[ѱqLVĔ̪T-%~O=+&&Wctfi`į}O>C|>w;> vZ 'mua橔];'rtcljRRn K;lh@rdj^)'N)9=ڥK'Δ_T ܍РtaĤ{Yĝy;餲) jgNK%fc աy=`N. P4.4ڝN˔D) NYh3zl5 >R zʏǸ='l=XQ|f|"Q ZEykS}V ~5,l % bnWO?HոӍ_+eC(y;FaGX[ں" 0(r0_|LA5!~ &ۿ4X t˫,?t@+ɽZZ\tPCVh()U@rug@Bk&7.ZvzhWazˍvw/%g/ fesiJDtd\K$JH*gWOFjL[,>wK-J/RJ ,_0@ Tf;0P*eef<.BVwR+TUec  Ϳ0 }zH6r ?]?񦼄ޤiS|aPuHRx#jaȒs{ls6Lmۊ3u((ƦD d]okPC&@hmN km ¥VʞNj\b9NT Jih?ѠSj#JPM4zK<*XePդu⣈,M~*-kCzQ2WZ4*ˑ"zZk= KPx.ysD T)T˞mpi[  p"6tHVI]tY4q=1Ģlӓ(A}.Id8J\f rH4kU?;J ι"bE[:'B{@eFA%3[MWR fM3HqiOfG £ey8_p3vBoy?a1?)+npqSFGV)ؽ:[T(9n"EQ:iH7vQ63BwkBQ֢TVp_`(ʮEHưdRgS 0U+*zݷWfhw/HFn6I4J~5~Oꡦ>f/Uguؿ4 p_P枀P~;Dd4Y_URr/}[3?P?N4x~+[\NM @h_;P |,6Jzߜ@ju!t.P,s)>wJU٣Tr p`/;E r]QXM@wbv|b?e{dO?YWfƣSV(]'Ԕ[$v-* j D7ǪUXv 0pT0R 4uŒT[)D.jPM…i\ /fZKmWol1V8B䓛NC]%Q} |L}WdR%pA\r7$:٦mH"ޜ1:VXRVΝ;og&-l޴&nZ9fb m@ qP*2c{غ OʝYLO8pSvBf:~mm}WBeP(m7*-+x*'U)v b>,L[]v5֭[ٹy>s.jC9tjf#of( 5;0zͦM)c5Nv n˕ۡeYk$,"%`9\/m&h׬Y{W[ 5׭uqiv{f8<8z=\@m}98"ƍn0u|yp(!ӷ h^MN4HY&wVRiؽ1$˱XBB8-3[ JC)w{2_!&arrffݧY6a‚ B+Lh Le d"Di0 KskkÒ1c_gLڬIeK3S,_ɦVyj/ځgV2E9*77ӗ`0/Uh0jV{kyL-°v+p80mA^á5NC O=8 'rO}w9c+Paxg͜UſE˿_f >]MrF٧.g2ESNNk *b '"*. A5tYV&sABU([S0v:jcݩJT%Y.챪!<'dSؑ>=C:TTyFKHNr=]԰#B;%`] ݷiIfc z+xpi {SF&xo_QJ89q5o,A\Dm^ogDg7t/rx++I9~Ąˌ|wvg!_D(HK>iVկ>K3$fl_garڦԞP6c Px$vQeeEri`;*.8\1Ph'{70z*#gt5yHӠ@vI{B8F֘Ky%(3JJ] U#-Zx,F ru, `|fC<1㶴JW{vay<&A9-Rxz zN] M7nY35  [|<#ibx y#bIzܷ<Y8 YsnF""H&;90R6v az 䀹9UEbvʧu@΀Ъ& be0L'L%K9\^/a_nmN`pa PަI"dQBĸO-|-Y% ܻYMm6$ A0yXpYiѻ=P^Yj*10gT ~'7-kCԅK$tF@ir³>[Pox?~^9 XK$F63j%{J6FDl.䋌 .tqX5Ffn's.4e @UJ2ȷAeExHd*TU#>;MC0B5d t(-9l!%Q_B3 D"R'$WFȱ hp/_J\!A (7򞫁7'M L~Ya /IzLڿM/&,#? KA /H]X?@}o V4ݚq/ qtn4 /_@0l}gyyYM=qbqq rr`Gi*§_5d"B5]3ܬǵR(r pu B)+TUeqa^W~1cX>gp"3΍(@`NMɕT!eͦud "Q^8o&Ϧ|M߯;y]/?f&onS{7Aײ 4~e##T3`g%d]k‰>i*yk4*Rx`4@0nL0+wFҰp X.K\56vwN3D d.0sX81^gΜAgdDxA]Qp=}m8 QDη/dp/d+V@v˕ Ù X_@5eV׬؄S| s֬Y%(kP eK33v";\z ڝFJDhG !norcqDtHuI B@*H,r5^©Tv>mms}?5GOnSZMgEd׈bbA+'!n۱Q>+ # T ( eTeVNSoC(up_HQ5+Tu:_J el.4ir@+*t8X@)+Cgbia'OItFGkAQlX@#R!6gtɎwϘQ/N݂[5k` K00uDa+?gw΂@u.[n͛@p9 Xv*1;s{vߎ6@ixyCu#?9!\Y-EOj$L2y)|@}t^O)|GqFb,W b5ȮTĹ)D`5)4] 5O]s(7 BM`[t1i5?R#(w[#mTF|1ho IDAT4zu5{xy _QJHHg8bCjSPF=]q1:@E:{7ݷpe%r.HE@}68-jS*mId\qI1ɠV~^fq<яɧ~07w stZЃ+)۔O>qĖ-W⦛v?xV s ȔRشq#nz3ԏ VlX殇k8+rߏl¹J,tRxHLkoL.,`"MuĂOqtf%jh3s'dG>dGCC 侢 ?;}pr.\w=8G3Q*[T5ޚZ@TeWdG :QUqRa}w10<}ʊjǥ.q@JC)k,$|o@,S\dH۷px7'0j{#ny'<[Wo+D6X1޼cc_Xcclt7^##s}7x=&&&#"m7H sr ,֩8;.s_ Y\*^># A\%7EJ3FΑ5o؀\M"e`ב'T}V~kOg>{4km%,--`Uv^BĪIpq~̧cBfj%v}_\6sMLB4}PE(Anf߸q783oB}/M{de2~ 9RQL?[>-tis>wާ367n9g͛V8~1\yozǏ wlmpux,.t{~\8tF;{ͯ/4F*uT<"H=|1J 6o[$_L.ER_/WD}yI$!MS<}<or=Z:3O]Ν;"KK|v*'穧2}o K3(Agu[i'xc\5y)Zc'מ_MωpHWXS>RMo_< )qZ1zM+0WʧM^KRPB=>$IsiXcvX^^f8q򵊇BcAf ?RncEYV\wĩt:ܻ?$7J׌=w$0˥oL\宴bDjKaru{&I՜D熊}"ልmDY^Zҕpc {y c={W^zWǟ1g\~s>M[_孿:6?wmc\r<7,&ј3٧٥X+*;;,.vyw~xyۯO? =G>W+.Ta]S+٫cii;|9{4g<~QY…F}vXl| (Z+|6U ]ާFQ0y$> "O!85L "`IP'Q+qJ]s`Mǎ;?;] +'7[$I^WoVKk΋ 8~8ƽNr}Wn"4ń|K)(H1Z❙ T٢i Č)/n'8???V{3Nͫp8gacs:X:s+µ뱽FwK/c8h͛=4a08~|/\#Iq&669qr赧ګ[q1M$Pmla.[i ]a\R*mg!*x'N+ի+|駼9N`s{ԤK7kO/٥sܹ{.~g|5Vѭ$1pf[BPv$PI9,}vjA\kw-,9nRHP:iߐ aOSv]c:X~/ }za]^77_ ~n{kV򍯿Sg{+򃉶:>k 5Dvqwqf83{=ןZ!1MN4/}{{=oGܳOszA9]q]F@c~w"P$ISdYUlBqFtN-{=xgSY;z\S~cg[I7_I8μ>. J)8vey͝J:Ëİq/vi^8:fyF`S?pTkvEh$wRʇC?i6k'0fuȽ:]8%&C-8,(צV~|E1N* xOa'sӋZ)xX.}q\qOxhY_[ekk8umD"~)*/ {D׫rzކx*Ŏ|*cמV1=ͳϜܺ}7EqY.]1un7[:u?ϿHF<`g19NhGƷtAE !3ܼ\A*D.NEVXTY דifb?"jDm>"`L:{O1Sll~6@u])P`pn(Њ:cP> - Sja}Tn|ZsG?+6WgPRfHxfXk C;c? u&6i~A%0@&Z' xp+Dm8G圽vr^@EKkA=KfPx%u8 nw(BNt)v[|/M* Bck.l||E1]??ڶg19ǟy4}bTGƅO.L&1-}\g'm,TuѨx-_aWw~a7~8X_[ߥ0XvYX貽`8&s|ޡ_c8n@xz<7ܺs^o _`{gv"^{ܳKj,--TByS*WZl>*lc $*[s\#~f^f[RL=l?) .]z=??+moN`p1 I1g?2}ܾ?9 Ae)T*ʛEe1(#Dx$w*H\j b˯T-V ]UtV‹ s9rQgXthemk (Yeu ibPzK>E)5qyeY|Lךa;Nby=^i+!њ~^٩h\[hIRng 8˹y.V1PnnmWhRz[ۻ)wi)q^L޺Ysڸ͏L9qs(EwoJ(H5o^, s539Y~ji>ӌ_?p[gq|IJJ*x*l]b8Hᑌc>"HVOmbgH .ŜSNN|bpY6J5?t"* ;0^w=!S?NJ A Jo-Mښ~LfҍiiX|=!xsS1Zͪ0me6k#Oc SOTn|*vE:R7d>j:O_ ^%LDQ`uݻҋsz{|óR~* Va=E6bPZH˦qʧ\O5J$qYG69b2B“"pQ$(Eܼ*v:a"2wĊЉl_ǻ%z3= ?ְq49*IQX(@|8qA!)N sq 1FLQVXȍA *R/̨5M괫;i;S% FWpMkJd|9Kbh\o;|p+.ቊcaw}S*x?**,u;Xq)viV<$/}2+O\S[N;5x6Xy? ŚDt*J+}j Yíx nPa+-j'DPu6* 6$9"۴CA (9%rG|$4DAkڱt|B K%"p8?E@Ѷc[{?c4ejN3hrCQ*ThV&N>ڏUJ2ŌNy[ńb*Y.<5'w0A8ݩ/v,d㬼@oIzbu k>G& ϵ25[ZikX]/0(<*L0ǿyŌJQ̞G_+*_/7Ry?@* fBb ㌞gf)_j1#꽫(D1]yجLiѥt,'PFH癏'ĩ֔Pbo@8s[c&CpXo_*T;TcuO<ǧu舐}h'L2θXd~`PL4v֢R[fBMJ:_,٩֞JqQ3^VX>M_ra*8;Y`u7nXXŠTkTQe4G"Y6*3~zd^STZ]Θq*TeUdb UQeE 3wߓ6l$_shnwG=!)AԴX4~||h36$-`܁CE DU޹E;Xq~DÕ'AY}0c4hW3b)/)l/M ,Jܱ;'(m9mm"KmHmUP;*֝95T__X:i~.}Ec~BV.9\"sZQtn8$ű2KBZwe[f| ǖRڛd~3rJ⩈*GkxEJ1Ju|P6ұ}1U?ɈCKS8>c 咓)gnck:|_,URi>9zA\P3]Ѻ V+XWT$}ŤAGkK>`-0f !FOƒ8_71ֻnOAFs|=*m6T})Ht٩ k̫i]v#嗋q {%꽛NbP@h$ ]q|Dc~CJ['aC]* })G3ReT@q;cQ;~rKُ<]WnDASoާ1匩rtS=܏B3&_^G٤g0DqcV\6Ǖ(LtV\5TޫH&uD+C6 V G{°GNZrdkRْYc;?/I[|',-:2M%:džmbfIQw1>՚7twBY^,:wP.k^ݛq'ȉ1taXR aq@E6Rg}Z+ӂO&M>_x4,19"p90"H;讄''X$0Gó0 W.Ȋ = t lsð{z{LVl޿6ƧwkDR&WqASx+Ao-. hRN!γxեЛve{<;Ƿ:h4?W^a#'#ͣ>FoɄ'RHEʩ&v8k_ >iX{y^ⱐg]2^(O\_C> 7~gܩVf5IRF6ǝV Fm%Tӈ\+XkВxCrW!IJKϙ"։mѐ²cDm |!"Xk={ۈTR:(efQy +l{c 0媏h0C@)Wtҧ֥zԜA|w僩Z4Ǩ4-F]ׁ9cmРA/=>Tk BB 9\Hm]+0vv \9iC]usT/CxE]ģoIh?^WnРA7|N;%nrȍ1:͑ր)/YNEalNpT1Wpm*.LRjnX4hૃғXa\:* 4^)Zu_h*KqLKBd:q6w?|(nJ(ܬUBkРA@IoӁ bJZ"p S$h(#Γ "'0 ( ػ\Gnӂ0g:li 4ytdjA4%ʝ|EaWSIRɈ0ēg(PڥkB+]f. J:M7 4hptt0܂}(zIBjL9%R1!X4( ̥,BQApbV.5\\)4 4xxD`]+thqy4sc rU)qNmznJWiH `p@!_tX hӉ7T)J Y9ѰiРAvv&Ȁla8jJv%l Š&?';ĢrAYIt#D, .o^頬YZ< I$;:%  R{UQ%4(#QR0 W0* sIY 4ѵ.ViAV!u+\~7ak𗃢>;La.1f/4V eݽ+$Csx\: ؒ(49ct% m%c8Rh40i=5 j+E +Q>[ V$( %xip/UFX#N() YL;䞩9;oE|Ȋˤ$n( mZ-#ɲ<)KMT(*jZv\۠@(wSVoZPs 4Xꮑ /-ƘJeX?б dSɅbjs\$XRhR8梔"9Y$\ؐ8wsώbݠ "iJczsxͲ,ZvY\\,$ %e=Zy,]kK~4Vb֥vm$U΅c\S7PMO\ZRcفTޡAy""23 Z>IH$-Ab* tY18I\ b# ̥AW :`2ZZU!*0*uѸS7xW,,,0Kc:11bvy4reQZP`r/^t1X];YBBٜEZ!3tӳ` (ٚ7_vwa0Y48I2lE!^(GysB|cq.@ esP]uUXKh]AG ^IAq{$$r}Q" ީ U^&џ?G 7x1'U[Xej:th1=`EP64P # "F"AARK)xi&$ck/u0C< 8}39SkX]nWk ?q bϩs AD /s"{:N#48$ZKSh:WkK6^ nqV js3QLD{b]SI\zېH!yhyLGpVJZMtymh8hE1/6m^Jhgq^Ps|̅[K8 xQN#J;GS$eeOml; @8rt:MlOC;w]pss*WtVRƺ:s\P\CW"AE)B[WӸnVl *j&1,>0ţPŁ 27 ρXu|p^1} rcGsxoOр _ϪYC;VN|fc]!vuX4$IHTlJ3)GQņacip0Tu`JsM`kĺdgb3)Aۙ8 CC~U|LR+J\T[x<6 !90ݡ@ a...>P;[~fYF-ml> BQ1(M 6ϱxESh` ^Y50}*/F Rc>DiˎZK*ڹ!EUf]5a%MSF|z?^{'N[[[{[[[sg>7#ml`$r%}P:8Ǚ v>y>ZU$. Ux*J!ڒvp֟C Ӡ,*"L_v}{_k>@AY ؈Ŗ8[E12qəXѦm+`i5Ɠj(2/>`IA7hWmTbt;Ici0A6/ B)5տW?;wgg|>梵$IxWy뭷x_?ݻs|Dc I jPH6sB4*q:h 5mQGMzsN`xJ}F4sͥ1>3Ad!y(THtUmaQ5ૃT0oK/q5Ϳ7֟9wSse%$bw3)H4Z?t1:9vU[E <ڍ`T^(jk,OZ/HIFc,]f42*ŝĉ<K0G#B7I®J4wU*/7s+8(} 0rfGG0Е26zoakCGcaQǩ|2LR8U@aK숥Us@jwS57w Uף =g۝wBj"`EaJ0$f{Ǚ>T`gX)b*wNA0b!U"v0TyU.Bnn`c,ƚ'؈Bja -i;Qw8'4⤜dhʩnl22e)k='x\^7Ҁt67}.{]Q{Q|c`JP8̩ڌB{.{{i񩹭P:'G 1OU[]B{^gG[:DvnG-o`5 c>h QǏmJiQdx8j=X3nPbo4k-Wҕ6b!nZCN=,M-1U hJ\P&ABJ&ۛ[^HV3$}2o< sp9*Y*cF;oΐ%`kt ,0YEiMuZD iãx4Kh.^RiTpW9$AcS'!in3&Dki N=ۚl$q:֠EkG)ō7sn3ݨPJؠģ0?* IDATGƾӠO{ۭV@}ZLV]ܽCryMJXl+WD 7ڦMCMîp<ohi㈃EVjlj!Q [[|k0Ƣ|1"N5^; 5E}j'\[D υ$MH۩ nhp4tdrvJp"P\( VX8i^mGK-0]v1O:QeYP{Yŋݡ:+Bnf#UUOx<94N:BRϐ3Z)<Νz ׬ 0uy2qZ@ ~։bITBkmji>Al΋yZڜ#0gCVY.$ Xf%m c~BpJhWteynQ#4`ʲPs6s-\ngiD`yyhAWx~Jĕt-ɾbrx8rYgfŚܥ֥WsjqMݸU C+4 ,,,xO[l("766cqq:pn`\_#x4VNRWƺ`.l`"5Nڑ(Ϙ* iQ6c<1?m*a1ڭh@Zi;*"䥝bq[+ׯ12_ u|.+o<$&7nt:z-")>ܺu7n̽J#UHmGk+kz}>m ?WS RN[ ]Gj{`0IBÅs`8 v;cIZsk V-Z7Hc 7oݦ.vY_?Un{Xcx [*;;yO~2qN|VUqD޻`3Mnk:i4I`괝2 vq6z,瑙ayIN*B(PPC\SZs}vw8`)"O<~ʗL2_9Ly^![?_?'7|?,-e;w~N;ßɟu![ZK؄4JS2hZ qB+aM&ccvBһj9[pQp/Cyf25{KY@o<^M0 I]\8)e8n{b+ݻ^, W(nqIg&[W{IzvZz=sq#b<x?01f)+˜9spg/6pԩSh)Ȧ{;}6vЉrҬ 0 }U[+$f4ʥQ ,!8hY0l<󜥥d4)N,m>J)znݾ|.O~4uE㬵Mph<_g{g{wr}vvvȲlB:ݿ?!*ǎ;Daegg?hLG)EբɓͱcB5*@F#n߹:,PyB]^3yN0{{{}Fh4EւiHNMݦ ˬ,/Pp1dYViqfh08u$?ֹ֔O_q(gyLnߘi]b*rέ[6mA ǧNz=Ae9N=(M߸MN^˫F<?8gΜ.>@7|Uʕ+<ӴJp8,$ŅxW`021`h8d41n<&3xm&DHاpq$ Ͼ(nN.NVEԌ1 Z-z=nܸvT`n3x9q8ޛ7×+P!@GV)RVlӳL0Ѽcg~vp8deu\U5$VVƒ)ڵ<[gϡ`i.ׯ__d4XDR,-,^r1LC 1cSi]rj_#L$M_hLDKG9⥶lw}eaxL@)E$;wUYmњݝm.]B%i] *<ZV֢~ߣt^m30g?\G]N8 Kn,xI6]}M&/Tj I.^ēgt G9)_dSD*#iZ 3̹ }h+ftŵ#4 nglìs?v&W\iTl &O^ ʅtZ7s5ڝޠX΃eQ" ]yߦSWsԔ9Ba~eY]YaooWv$s3Yj8@=Rx,cd}=hlTE8vl_"LQA >a{{v @EvJw76/w&}р}OMOKu,mnn}x41n-<Xkvx w!.Tĕ~s<}ll MS._;w@?OM{̴7*RnRoǫtgʕ+ܸqvL@pe5O/06G(/~Lj2R X풗nl;I9&z5j`)R,wR`-V7>4p'KxÀx/>+Tm5Ug)LfvX~[TN]>&/[pW^y3O3 :A7jwȍsd6Ǣ0(D Z ihR4Aa?ڭiRϑQ+_C,zW>+++ܻw!Ull[uuDEiMe>;0Y_[[&+++k0>@i]qcvYFf8h5F& yﳳ840VV"SZkI;>S_}Ωq Bf0] _nZk7߿?岢W^Ӡr*v۩jf4C;HՇΫ|?E)Tu,]|~4Bv׾MΟݽ]v`I?t]n7D@ae;xw03;+SL0K=c=~z!ltY_q1[}P萦)MPav{;3Z`8h0jx8urn(^OѩQׇ᳌*yx$3[|ɓq1?7#%U )b<~z$MÊpȇ?~كI`Pa"$Cq|bA9ڌa""1,masZ &ဢ_G%T8 4Z?:K˲_PJcm.I֑e9 DrT{05U9rV&lc-oϟ:b鬱{.~g9n,ˉ1'~C_]^Yu;mS_8 70 @R2PK)>N:Aefs"$ҹ8s,XZZJ7C/qYCkww^Ϡ/e/ǏSOk2)_~SS |+TG4_>|ロaBX |[0rwsu g'ӧDۑ4?S^:z07{W,Fi.J9we\S[s!xçO<67k1Ӟ!(%5a.$iʓO?_JkVVWxm$ F 4%yᇹXZZVY\ʹ4MIӔyyQIT! y3};1o롵!s93sxY>@)08k1Ja@i h6hOO325ju~[OT0&E^8Y!,ֱ}vg>G,y.(5mT[ʑOz$Iţ$AT)PZk.MR?Rv&IAe-}]FkXIu=,DѬ5X\\k0CkMgu_xߧ^3 *EsF$ EZ3== 333m&4% L4嶳DFo.A#cKZx,p=+ZݿmoS++|273#ʃh45>^137SO='9x;wnZQ%_M^eSJQkmjuewX0@V ֫dvyxm[D"yๅ'á:p]\s~]]^yG+%uVLMM_җZfgyN=,\AVՊgg-uVVVX\\dqq8kIدRp!`b:nM/}Z=zp |+W8X]zݞ!a#vﺜ?!R V9>^9REA PE4.$)Wk/s odee9eX~~?&ϱce܁lU40xl6<Cr$[9Xl&R2|ȶ>jMvp(*!ZMgdmm #=R^G"{_c140՜L+TD$zW_ɯگ-|' Y?/:ss& Rcڄ4O<$yEABVx,:;Y[[W~_w/Vk=:4#Rz}C?`zi~"OLjn:}4w~7O~?zV *Tx s&fݻw;[|ӀhYmn??hu:FTJ$ 6Un{|p3 v^P}%sZO|e ,<}~#}ZNާ@yH]w7_0vk!'Nl4yᥗoy'fZ4%7|SǾNo44WUB r(IfggG~>siWHk3V\cw}?C?¡Gh[a7@KfgyDKPNO/G:g g;Kφ%H83' Zv'I~wp=I=zyPLhT}ٙY3}iMMcit3?œO= ` >Jq *ڈ2WJ-RchM5M7S?p>yromN"ٟ/9@{%RIxD<5ސ&靹+K}XX\z "q*vށwl>?;lF47RC+1yN~3|s'`~tAP؊*Tj Vk ov#?ܱ'NJssX[[?o˿Xjv5(iY_밴V g% bb2x#.M Mgz"Y k}i~{o߳g}n:ĉ'X[`L1ep1nOcM}z?7݈zNciZ33?|]|KŃ>#G(>DU$TBWkM4F\H_w'y73VWVEٜTF#G?~34[-t0۞jxzw{'xNeR\=OUPa3D&nj9<#IRx>>]N@kyrkQH]9Nm^8xwuz(^+`H7`]Cwޯ>BoLt8a5xپ};oym;M7D&uM^cff _ ;W<ϘȶP@!Z]mw7j?Ν;~>(k+&)tСҁZA$;y;eJ崧ji4[M&hLJ=~ɧg8xN82~HL*³eb)*=[X߻flK^B*|5Px1XF~$0}7FowNV\vCբ=ӦrGw} -jI Z4Z7^\ >"_M> @|:lN:̶YD#Mn(r딑F즔Fǿ[[xyꡯsLbjZTvDY6f4^}o㚽{ ftVkFEVAR"sWV?}_)hFR6.:*/\/1E8|!9W3K)cU!6@?c$jc l_67î]֛y5{av ړ2!Yh,/.r߃3u=?E-QAq.]ío}W_{I9A1wi=wͲ_#khbי8؊>&rA4ɧ6 31}#V6NCLZcP8^9pHϱ$pemn'N`{|{?[p0{GRh4iMi4ZiBJ:e(e9`H8 ߧ鲺N6JBkK C=Ya<ϱΑ X6ZWwVVJhBv8ow-:wXqΌ;nm#iqg}  񗆑!dc"Hb<<^ьKIw_ڿt,5ڏo _L6~qWY㵌0pe9Ɗ37Gy"ܠ1Mm1iӀ2¤HFAbfv/e]}7F]{ W]u%V5p8 wFFVcΓ{HHQgaNছ疷ev0s>/<}? w<*5KS2JBU ${ׁC&oSm^z%Vָ֛PZ !8њ$1$izNZkQƐhS3JaA &ΐ« N9(%)89Tc 谱W#N¶#dȲgD"qN|il M‡r}Qcms >e< 撂' #z|JP(LJ?p(8xxa6 \j,6l3Kgg3֢g-SH]RI ݃қ4 зĐ _k:FE+L4ho%)hZJ֔ɥRӄimF`vvVI{M{EJ-0#ˇXa$&I k={?ynO-MNg2V,ZQ\*nyM{Looz`0C~ϪEe<8NYәD:"^UҁWx`kOY:vho7^s GHk8Y_Yg^ृGX]]CyˆFYCk̶x \q.N<ɋ/f rtj.ZM42rQʐ &̀iAY4L鰬RAPHCBJaבǐTA97"q%J&<"%D=ުb?B 9BH%m do_)_/E[R1kHNpBvRg7JRb8JYQ)Ǖdbc[d_į$Io={PޱtU xn <󬬬t?9D78$F"(k;u^بD҉eg]e zc,jw_wXag#,..36 Zkf9nv- 7,s1%U.sD:qJ@h>yTԈX:9jPl"UQQ[~$JBi  t0uyNg~~cǏs xi{IO-pza FA@-I(謯b-ss3ٻn}oC{z:K;=CGvB x)yHJ1I>x&~v"sc*?< x[񮷫LK UN5~X]Z(+z=xA1 t]$oa C;ѣ'XtHbzz+.vdnv۷s6fgiL5 m-IHSCb҂duBP+B3h %XĆ;%kF)+*Wf"ra &ȃ-ojDžʡmJ$MV[k4H*I֒eX /|B?9 ?XFdb\a!$&1͉y㦴^^̤~z!x9k C<+|Hڈ 1m4ZdF2ƐN0;$!JkǑ޹"\^EY|%,ej-U)NX\5@~ԧRP1E{}r d0>gDAZl 8XK\EKgCheD^lbawt;]:8vǎ<~guu,1&Qk0=ӢѬ&)xGaeykו\kسjJm gmm5!`ЧO,_y' yd|9*PNïO<0":H>Y r`_ؠ=7;|w>՜~CԧZ K >::kk:y/hwmp^^s ۷oCeeek}i$FSiԛ-+V&HҔZZØ@TrTAJy$̼ NRx5bXo$s=j)Zo5qnRS_kQA#Z@%9X܃wr k!b=dYFۗ&;Kf%f,p.eLJbXe fR,˥"rvy.7h]Lw-Ӆd geBKc}}յ5~ geuu5VVY_Y7`Ԛu Z)SSL jn3\aˮkm۷jlzwNC0ru z__ꗞ=̡g zT"8\a#Dr&{*&Wx`SѥI3) _G4ˀ[$eQ6ٻw淿ٷ[g*bLvE`NKt}: VYZXb0$ssۘ4I&HDp8$`H?`q,p]NX/C=IsQD[^o q2 Ѥl`)ˮj h;!VxL4Eu-cdz h։ZTc`Q(-#B;,M}l.;+-}欧{FiߏP\|l0c;" Epz (z3Y$[BTH\G -'\0h#'W(}| ި¼F$(L*{ *@IhHh CX+yI0cpJhK`Rg:{xˍݗk=Aä)iFޠVQ RZ”s1{wO[Ln(*FRBNYm`nb'KsVȇee&E\Ds¯QؼMHJc,cAapNL1N :0w\a^iZ I@U~ gK~7 kwQ(K{{?LnG"n.d4=B.l*R$")xQ'$eC&,*1FLK1LбD&G{'A 6N/NC DZiQJE8VqPE9fJ&K$ZPF2p*:_}#]+-㧞C\fIYj0Ӟfjfv )S D : HpeumnOe΂J@fn@9nmN=<ɲRYbVIeҙ@pɐ\"ʹ2h2c̻Uo7\~NګPIl> 2] 5S_` 4JfXOKxj[y0g9iH$5@Z p ~$zႍߘj@1| I/Z(FiAL!>=!D:3zd&/F*q0O{Hx-en1iBb:hh(iJk$$%K:L}\"\φ b%psy :v(Ǐp8l2"l٬kB:p^Izoebj .;ߦMZ=a5];W_fexo: 5CW#I&)ƈm]'I)&<|%!n_DXywT!QvFħyFa>:wGIb[|4+0 !prUu#k\ЀT`Nԋ@PF uY{^(סo\]w ZlQb$%S+& 5.tڋq!Z+&jŗ۫0^}OjNUD#Ds/t:hki·\ iFmKBJhQ~@ }>#q+/Rk C\g\`<1 L>}'~4 h"I$yVIVK6뮸b'smSF])\'k^ZXᓃ'ʲH1pћ\?XE ʹ15[ o޹8H6!24Dv!f/(HlB7&\X+ΣT>X(3V%sy,"Lq '3HԌhcł/= \RÓ{.kɂ-- ;h̳ Sw[CiZ$s$-#x 6%H|1Qx C^i''N'jNA2d̸c7tNWO*XN }XM .Y{e&>䣌|p4:dQ+P|ٷ U7B̓6c7 a sw0!SHE`(Be`(V<]+^BK'+BL(io-[8Đo[Q|j^B7ጾt@=qbޓK Dm.VDh`yW  v]Ԗ +ihztP >?24CDCph˽gUlqݣ¼IBȺxڣw!hN"TA0 R :B݅S;j#ӟ\L,xyA DJX6R$B >jb˧H"ę;=W$oFQXgAƱE!1Hlh##nyGtJmؠ&{;U8Fm_X%{EQKT?^ N򠊽$T^)PE2UX$j ՆAz pA3ѣv((̉E@%-XrF]qG np:Df`,u;ีYYnC#tؚ`lx^sҁטxg E|U&#ZHpBўvj/WJyN4I[Ocf1;MTʤ$2%|ɜgeEM ,O|gxD|"@%]13 y\O(r }jkSsޗQ%X=猝;cFq"ɴhKƎS4!N1FV[6vc>y6-l!DͨkSl#ገX~8)ž?Tv^aqP 55B p|<SzUH.d\* w<22̲Y>\k`׭yh)$-CІ$5fd3nRI.3'$L R&w+'J-i&6𾡌ƘR4S]&a;^׵FJ(9MkZEVˌ^,6d?4!裠=IJ8*Xxqzd А\r(%6$| .f ' }R8S 3.v!j/T"t#ecXK/ EkW;$-DF9eźtf5R6IB9TbFcat1 V@ (絁TTѦAg#~ՆrcWAG2_hї)H^R5۔SZ̠Ww#n4Hp_|X=.qguY:)2Y Aڔ 88vƿʤiA|H.x$'K1҆w#xd]ќ?)alY.RaZc2G.Q(+k _7۶B ʂL Nz8S_0N [$ۤ|I%qlJ>LHclF65x9۳Y{.s.nJ Os6\7dS&o'3{)\q$3f&th<oK;ΨP«qVS|>f䳙l+f>ׅS%M<|`sIL"uC:g#"&rq *UН+lڊ|63M"7]ϥ.yOYogӄ&I4Vڊlʿ1ۥKMt`^jj _zlefM`&وf'uC</&i- ٌtjPk!$lE.[p"^wq͵ f;87:2 *J$΅pʟ7ӄwe6Ӟ6mp"^1ʟ"ʹg>ަ}WBW[jz.6\О3D'bBfB*pffdy\BKg[i?M"tx C<fF&p&i3kRHB'Iߝ+lьF"nF&mɛ9lE6cVB6#gӄƷ9+ N6e|i Wc"G&/h*rP9/*a["- m\s!RBWb+%*y8b:\cTP^E, TPB }M*TPB x*TPEEE<*TPᢢ" *TpQQO *TB *\TTSB .**PB TPBx*TPEEE<*TPᢢ" *TpQQO *TB *\TTSB .**PB TPBx*TPEZIENDB`gsoap-2.8.28/gsoap/ios_plugin/ios_plugin/docs/calc-view.png0000644000175000017500000005672112653650146023250 0ustar ellertellertPNG  IHDRFu0c8iCCPICC ProfileXyPTM˒Y2,9 sQAr$A (ADAED* "pwozUM՜UOOO螞s`]&#h 1!99tmeeDz @'gyDzY;+m t#@~Q0F1 _cxu{h/;]@AE&G@/?XA }w@( N0'{Z󈇄A {'9~E?2d*z?Ǡ+Uhžnp]&o⡞oミUx>GY''Z3>˩ $-60ꍌՇ1lQл;?<_}?> x,F LA0 ~ `tޟd%nA=Cap0o_~U" x|7_ ~M'i۟]{@ڿ#gyzJ7J/J%E)tP( (6 G)Q(5M_3}!-1%a ~q+3f| H7,<>"? \qq8IVZF,>7Z iZUs/ e&د\N l axe"PZ@K` FXRA&YP *@ z@ q0 ^Y0>U v Bb!H ! H2l gBh( JrBf A}HDH!Sq@D W>$bHkkkk6(5[,!evFv5v/QDQ N.NCps\D.-@3\5p^"1I iLj'ggWמ7k>2/~U~n~s$F[BY B,BB BB š‡`DEDEE ebbbb*ST1sDI34)~)a]i`/eeLddeȊzɖ>#ȥuʭɋ_V`P0WRWؤįt^iJQJ9OyDң]UQ5JEZZ>.xΫNVR ixhTjjh55hiykj}Ծ#sCgKWUnRP/GoL^^TƀϠ`P0ѰmdjT`4eie\ojdrdДִ􍙨YY9+ PK`ily򵕐ak+2626I6ö v:vv/h\ g8=pfspt8Ժl?x༫kCBscs vNNvo@{8z4x [ƞ=Wt>zky^Q)[wo_ӿ9@74`-("p+2.h/1ZEGHW(}hP`WX\pê^0"EvF1hpoqtqq .%xRhJ=SR2RK J}&V51;3hc33#2Բ*˖>s?W:(GW2'JN=9Tg  ߞ6?~t&׳gU㊣gKJ:;uGdNٵo{O\кTY[]P9]eX^-X]Ty%Kl?Bf/\WohoD4F7.^q2~UjgDS5zfg--ʭMmmo0iW;;f;;wtwu߸)yӭ۸$ ]{riؐ]wFGz뺯|QSks\eǷ'4'=IMONN{O/<~"ˣЯr^Ӿ.ᘩKkFؾyw~g'/~Avg`q|;˙>_^iytiu~-bmK:zWV3!;[9X]}xqN쏒"?wMw_텓#ȿB$\|}g8wG;SphaxEaQqL䥜e+TjA9 Z2 <}aF%m~b. m\vgAoʹH<$ G| x EUK$HIyJ;ə;)+**>VR0LUҋ47"702X2.Yӱ?ĉߥ!-\12WS_?K}?BC^&FG&FD/?p7 qD+9>LBql#yNt|SwZٰK%=&Jߗ3]P4r qnF+W͚%\/hnhh}ѶҎT2y֍ۏNܽ6<a飡>R{2A9dgSOH~_sm.>/0/-~Xz{SJgU5N؆G6lol^yg==XP*! p\?GA_1YX> J E nʀ 9.M; }< c58\ź~Êsw )ǕWw @!3aaȚk$Kdd)R*SUVPԴЊӮҙC+^5Z20 50ߵ4ʴ~hhl_0$|إ!U^2S+{A!e/yD\܉֎9;/Xt乔TDSX1c+zpR4_kAtӍgN-α(wTU]uf/Tuu IEWZ>jZklki˸q^Z[&'V>WG*? e4a#C'l>՟x0%1-KWKgj|6]| AKA=?ZqljEn]+&jskk];?f&VD:̂ zEa+)((qST* j<JMwLmDfF^Vֻl<q|'IGyDxy%ANB"B"+]bY"ےR 2jr,r -Jaʖ*Tp2zN=SGSKYNE|$_C;# c .8n`>mq߲vI}]]ڹwsrwp&{y{{x(J 8I##Ţ$bbU4Ll%=t*)+x\vnܦO寞-$<#qVȰء\TiZ.<ܨ]Td]V{B}UCy+WK]+^\RzFO{H瓮s7zy݋c+=,3t/Q·acc'=U,N~Zhfdw %ekvv~(P gs\ ' x @:7 tp)42'k ppf :E}$|bCyQ{hKt ; [KCN@iNٌce~*YrMxCmI}FKI;GgEw^ g }LLDz1w`YgGlٻ94898ǹ#Hy<\<Ƽs|"X,!V8ODEY1=uZ 7I:e-9y|?̔+*Sj.8sHVH_@PHX"2ݪغ= h\2J{./3u/!o7b߇젇!a##s͎{ R~t'!wfr֋l͜y'9' Ν]1Y_oDn6ѳo? `@ X! (&"qI 9*5fA1Ԙ0VHaEFEEspNI#5G@@G[JGKEKC!a 3& Db:s'Kk 5vNX\\+I$JR (O/-esw 8lZWz)|HDHb#<O%3Im sSJDM7*Tgk$hkk;XwXZ[Yܱrtq q.quEvsth#b6Im{H stx%R6*>z0:!||䉣ܩi]c̦l<?/f=3Z^tn10)1"1`^f6~ÈJ!HNҌJ>S۪ׯ?ieb`jgi^hfc#onorvNqve:d)]' nz6b/9+5.6~"Q>"tufLlÜ<[rϤ *c?w_Uxv嫗y7]m4؝Aa鑆\N?Č?Z#ʓS`W/Ϲ9 bZKm-?|\]#}}kFf7o3߯l'`g#}~t@ -gND^ůηģ7<80 pHYs   IDATxy|\ud7I4h)e*T.WAĂE@G*( (AYD(iZ %mi%Mg2#a䜙3L2i~5s9|o9'>˲@.`D #0Be]:oߍPpfA=k ch8&Y4C?ˁ{&Y 4Bzt6d@cp$['ݰ \d[d@ɀp[a`x=$ )ii ľ0X ew[d(8L'0[H1(_$>rȔTV/ /5HH78imRjj*$!Cxx /It;۴{gf𠟱^ tTn_C$#H,wLy jHC)/')(DR˼BmtD,]$H -s:^Ϗ:k j6G9Η4'tiG>%??Q`XWW?'? I(RH_B2 ^FL;Gt; BD"F+ */׿uO~$5[l5i$=i5aqI|`m̞=H$rl{{IQ`D9>-if%6IϢX\|>$D2⥓ڭ__^^~J(P1q ,K>|xϴ,YH$"˲.+bi޽ Y.-]$СCIz_rG=axDxe8s ~˲&& F˲٩E_V=5AFNɟ:ECFPAA͎]j~uZ%߾mZE?p~ GEKK6mڤ&EdgY,iС4iJKK'ߟt.(!beY ަr555"0xX5Q=h`jw k$^ iSt ޮJJ4rʧ*YRӖڵ-m}EM;Mq***R0LͽU lH`7z2}epqdҌHV4ԇwߧE%:tHM94U}ю O.Ԛ^gi Hz`T(U5X*NP'>/jyqyImy{}>gIͮ.m۶MU9JFi䨑(/W$bAvk׮zJƌ?E"݊X#=AbY$uvuiȐ!aCgZ]^bq Zpo8r}Ruˊ1@:5T!ZHZI'<<zm?4kFCFU TD4tE **k_Qqlߥ㷩.MWae)c+/\*PH.|6M=TƻnU{QUUFBSGGzB߯*,,RQQ٣򤵚\Dޮp(YPG|~ /I Kkp-zRtYtm~M%p~}^du_ $뤓NJN$B2}!aBCy{tww'/a.jit[Jw-n@5jyWWRаSR "߮W%׽I KVBm644B˓eIPXI}#TPP{ H$"ϯ?ҒҞ~&+p(^|IN;EuuuVvuvt裏V}[fNzzFy҄ؒ5/]::vTj׻k%oXzڵK7|[]4i=\͞=[k֬_͙3'&JDCi4ї7Owj/O&ZHHPU[XCS@ziO$_ߦ"YW@u'|R9T+XQb"j%E)Vw~A 5PYHd6C <|Ⱦ@ h2D{ẗ$~,">5n[ղsN]]4`?/ F}{SaaMiBe˖iʕJ7=&Fi{TYNMZi :ϓJ~GK :پ[<*P0 KA)'R+@gHmaUjOK+-hՐqÔ?r+. (zS+_Bjmړl󩠠@~?6*~UTG$D${E,m߽G9]t_U"}́igH3κT-ZL2!_{-գ:DwH"-Un|"ک?{8-XrqUȝ:tD\>tdEVOTiswIݡ1]j5|p͝;W|:URR{'vR Xc=DDjOL_H,XGYٞ{J3!UE5R*/*ʤrl_Ak,56KM{YQıIS?T>^!_RKT=% .y XR(ЪPv/Dh 'HH$8D":z|n&]/)I=X/ר3fTHu ?%S[_OJa4"RW\"Istgl SՒ:?Oz}p^W_Tc?Z-a~ٳgkϞ=M6饗^Jo:::U^^TRhݷ]ȃPTZз.8O+'u =Bߛ*ݼ^z5]-#$Rww? t~kTt|5UɚTi4Uk_[V~Mj mT[dAP>`=C,K[lIj+n^&"y0w[o`DYӼTY~yR'i***TUIIOxRwX۴ _RcwwoMoYR.F–|ڹ];cr'D *--vCR֦FKi^S"Hl B#5zrƎY?W𩪭ݢ &WoW}q$5> p+DVWk?T/g>[ҀZ'c/.uKS+- w9}<PCG85aE$>Hҩ۹ۚjn#7|a`_6[lHDeee*Yyd //WQa$;;I6nV)椷n3иQE4\êJU\/SGklkѮj+;Y=mpߙqGGTRRk BjkkSSSSzz]$щ'#GJ({hKVh޾^˖-Kc5jHPmkUyEa]u RU!u63buoU]KXRPƪש훷SRᰱ]TkVjf>%ukA۳u;ߝ=⽯4WكŵV,5555RC'NԶ+U{KJ$Omm- Sho{$)im!ͲI D5׶M[TQyo5^*y***REEZ[[vww+B޾>wM g[;F][Բ杛?Y ﳴ>w֩jVE5i~I:(,SY^QXiS}S$ᵗh$QSST~a+->/RGKjw+~ʦmNREm0REvIkeU***RiiiBtvv)nnv577^q*M81etuft{@c0[_H|8x/@Ru'{GZxkթ>4/ gMƊ} ۋwӦMK=D!CJ]HI-SZuD&$Mی{ :&w"Sm#~\2 N_K_HҚC="~n {K[G.ٮX^G_=χ4ua`?큆|Q:}4*e4HlŠnm$v_rPI˱UJ~qav:ϣ_'G>~1>K:i㶎=8R}yLJMY^nJuS%zo_nobMXtwyZwέ4txUe38D߻}V׿s95<߷-=X7M͟?_˳]d5~j*mݺ jF\bĦ: ͙3GGuvڥwyGO>,R$W_'xBC $=Z'p>m6p >Og@V ( 5??_]]]zH֭[C9$m.[,z{UPPwgkƌ/~!Ijmm;CO|;Nw\ZiYVҰV HkiLݻ7nuvvƦK/M/XG͛7O`q*((XXB!|"MР*f $*,,X.{*wl+_~aJi2 > :!ڪ+2!l9spB7߯O?=,xwb_|I-X@^xal={rʴ˛tw]r- }5\pn {7~_ouo?O~>#ڲec+I:3tWkзF*H?x͛'#{I:/~ѱC|Vow'kĈzz?Ŗk_Zl3Hxoک/5~xI҈#tUW%͎;TSS>sb,,,[ޮ>knCOOIuhƌ:uNМ2$'>S@W]uUsp]z饺k>a;_}̘16mZlzܹz饗$h,YдEQQJ]|z7kŊ gQ>ƍp;zc&YڛvUUU.2ecgکgyF/NWPPMz^dȑI /Z3\v^z%_^[nպuFwyDbJ5"//OwuQ9MdI=WvM; 9r: [Ni&o`` g颢"z뭱.\vDj޼yNcc-[ $(z{~t!n:G ů{an0 ?^VdhrGG -]ײ´)j}sA&dIn1bD,@zOp0p {gF.} Co^~e$t&s:FTTTSOթK.$duuujllTEEWJ[LkN(7eeeׁ@ ʼnסf5d CM-^X7|slQG*vvwq:#a׿TIchiiTCӑ&)OMRB_O.}bɰtooե^x!7o=V9s̙P mڴE۷oO8Mu=qn}_Veee6k,y睱5@XsWii;0577'R:o;6oU ~ar˲_:v?w\tIϗd؇ܹ3!@,JYL7'@JKKcvXOTgggBUe^:6}ne]=7+k='zdݻ ,X00~]m]m]tE袋< 쨣JhJ|uW' úF͛7OyyyZ~}oobYVB{u^?s yz-=zꩧ| 2㯹z}P2n>c? 2ٓ=.„a^XU__F/g{Gj競V+WLh/ӯd$YsK9s6lؐ0yĉ:SnPϏu {ェ͛7멧ue]_~9h"-YDz֭[p]no_ /P||Ʉ89}ORO̷mviK!رccCc%-YDwu!h͚5z=O馛4|}Z_b19s~_:cu=$t`{|w;ޞӭګS=Owu'R0.n_&ʭo]5zƏÇHyyy "?nuttQ%%%ZCmݥ'Ue}7/\oҘe?~Ǝ2Ak8Vqq~;:AmCJ컃GrnV(V>|TPP@   5d 6LFTa0e~ ϧr+???S^^ URR8Kbl/s0@ gg}yyy˽?T}w02$NOe's~w\/sY&W컃[.9 K>X.@Vv_^?]Hw\/sn@8,).Ә1c%.e^ $EijnnZw1\HMHw\/s +UGe^G`q P7nܨz+6/{9^Z4yd}^ofHHKŝ`3~[{_{}n@}sp@ njyŦ/^,I5k "I:C qw\^0̚5KfJ,K^zM2bɹ^\/E0EO*Gc9FVқo>>)#8G38C6l޽{]TMMT]]le\j.ɓښb P(d^qqBP1buuue.ۓ@f\2!@F/omzsg6AO3%7guϻ.k' @g*+uAQ|?e\ #@}ʔMXX"`p#@}W 3r]>bK ~ϼ4olopHH @cKH0= ) f>"@rDII6nܘb8lܸQ%%%.ƀ˹)++SMM X @FXe(.X`PVvQVZ`0*;D*++rJm߾=Eӛol%+r2@ 4n8=Ӫvq쇶o߮'|R*((vq"'D >XO=}]DxbY}]-ZH'OɦIqqL_c;D.M7nTMM`N{is/G|Iab(@s)D:V*-b-6 Žǽg{VtyJ~NuJ2OeY+0gǷۖ;[h8؃-L- 5Pp ZKc[xu\'Y?5^ePbล2G`(3xt,>>(nl^kv 3y{K C7Kb|KC^nHG;²͗:mW2f<\2]q d_-2B>%2K[HkB$cS93Z+1 Z:NA_ q cVT!@I -@Aa}:Ff"8tn?n5[ٛj!M[[G]>;@8}HŭK $Kdp*}W'SX$kr86 |k m~QZɎNemYdBB{ĩ&mkh`؛쵎dW SNgGSxTNٖ9Tb(,{p8{H0QVr 'tu;G ILj0^{é*yn-,rHMXn5 uZ[M^X%av 2['IDAT &,55aſNՔeMSu'+WK7@ܚ Ԕe]%ɚGbӍolE0&TMYnAV3i:r?TAb/!={Ut[CNTɚw-ADS`$+{2ۉ)+fᏛ_#7iEחzXjۅWj婮pq dא$;*/W{ d#a?LW}n|į/ [}Y~pkΒzw5]szJqx O_5,Y#0XnCx(ҕn*L.:z80coSH<⛱%FaF]٧ Jvک KJ6_Iۉ.%HO~[GzSَWn5d"8=aGHgp{>ZixHӄ/Y%}f(/I2KxxY6`VT=x86 R#}LX $A{evY p&AL<^ۈs00(( V麽KФyHlڛ~ > 9?tRd,utL3NWxH I$RfGNt> 0oA"q/5ĕ>PA{K_>6dpDe%@ ~DF OlF]H A Nf"@"h vC0xu@`]!@F`s. IENDB`gsoap-2.8.28/gsoap/ios_plugin/ios_plugin/gsoapios.h0000644000175000017500000001621112653650150021716 0ustar ellertellert/* gsoapios.h iOS plugin (iPhone and iPad) gSOAP XML Web services tools Copyright (C) 2000-2012, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under one of the following licenses: GPL, the gSOAP public license, or Genivia's license for commercial use. ------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2008, Robert van Engelen, Genivia Inc., All Rights Reserved. ------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. ------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com ------------------------------------------------------------------------------- */ #ifndef GSOAPIOS_H #define GSOAPIOS_H #import "stdsoap2.h" /* Class GSoapiOSURLData @brief stores states for connection establishment, buffering soap request and response */ @interface GSoapiOSURLData : NSObject { @private NSString *endpoint; NSString *host; NSString *soap_action; NSString *http_method; NSString *content_type; NSMutableData *http_req_msg; NSData *soap_req_msg; NSData *soap_res_msg; int port; int req_content_length; int received_length; // received length of response for deserialization bool request_sent; // flag indicates a soap request has been made // The timeout interval for the new request, in seconds double timeout_interval; unsigned int cache_policy; // The cache policy for the new request NSString *user_name; NSString *password; } @property(nonatomic, retain) NSString *endpoint; // Web service endpoint @property(nonatomic, retain) NSString *host; // host name @property(nonatomic, retain) NSString *soap_action; // soap action @property(nonatomic, retain) NSString *http_method; // http method @property(nonatomic, retain) NSString *content_type; // http content type // http request messgae @property(nonatomic, retain) NSMutableData *http_req_msg; // soap request message @property(nonatomic, retain) NSData *soap_req_msg; // soap response xml message @property(nonatomic, retain) NSData *soap_res_msg; @property(nonatomic) int port; // port @property(nonatomic) int req_content_length; // request content length // received length of response for deserialization @property(nonatomic) int received_length; // flag indicates a soap request has been made @property(nonatomic) bool request_sent; // the timout interval for request @property(nonatomic) double timeout_interval; @property(nonatomic) unsigned int cache_policy; // user and password: must appear in pair @property(nonatomic, retain) NSString *user_name; // user name @property(nonatomic, retain) NSString *password; // pasword - (id) init; @end /** plugin identification for plugin registry */ #define SOAP_IOS_ID "SOAP_IOS-1.0" // plugin identification for plugin registry #ifdef __cplusplus extern "C" { #endif /** @struct soap_ios_data @brief soap_ios plugin data to override callbacks and store states to manipulate SOAP connection using iOS libraries */ struct soap_ios_data { // Stores states such as endpoint, serialized request and response GSoapiOSURLData *url_data; // A callback function to replace the default tcp_connect function // Rather than establishment of a tcp connection using socket, this callback // extracts and saves states (endpoint, http-method, content-type etc.) and // buffers serialized request SOAP_SOCKET (*fopen)( struct soap*, const char*, const char*, int); // A callback function to replace the default tcp_disconnect function // Since no connection is established in fopen, this function does noop int (*fclose)( struct soap*); // A callback function to replace the default send function // This function buffers serialized request including HTTP header and body // (soap message) int (*fsend)( struct soap*, const char *, size_t); // A callback function to replace the default send function // This function sends a synchrous request to the endpoint and receives // response using iOS SDK class NSURLConnection. The response is then snet // to soap for deserialization. size_t (*frecv)( struct soap*, char *, size_t); }; /* @fn int soap_ios (struct soap *soap, struct soap_plugin *plugin, void *arg) @brief soap plugin function for registration @param[in] soap soap context @param[in] plugin plugin data @param[in] arg arguments for the plugin data Usgae: @code struct soap *soap = soap_new(); soap_register_plugin(soap, soap_ios); @endcode */ int soap_ios (struct soap *soap, struct soap_plugin *plugin, void *arg); /* @fn void soap_ios_setcachepolicy(struct soap *soap, unsigned int policy) @brief Sets cache policy The constants used to specify interaction with the cached responses are: enum { NSURLRequestUseProtocolCachePolicy = 0, NSURLRequestReloadIgnoringLocalCacheData = 1, NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData, NSURLRequestReturnCacheDataElseLoad = 2, NSURLRequestReturnCacheDataDontLoad = 3, NSURLRequestReloadIgnoringLocalAndRemoteCacheData =4, NSURLRequestReloadRevalidatingCacheData = 5 }; @param soap The soap context @param[in] policy The policy to be specified for he request */ void soap_ios_setcachepolicy(struct soap *soap, unsigned int policy); /* @fn soap_ios_settimeoutinterval(struct soap *soap, double seconds) @brief Sets timeout interval @param soap The soap context @param[in] seconds The value for the timeout interval to be specifed (in seconds) */ void soap_ios_settimeoutinterval(struct soap *soap, double seconds); #ifdef __cplusplus } #endif // --- closing #ifdef __cplusplus #endif // --- closing #ifndef GSOAPIOS_H gsoap-2.8.28/gsoap/ios_plugin/ios_plugin/gsoapios.m0000644000175000017500000011153312653650150021726 0ustar ellertellert/* gsoapios.m iOS plugin (iPhone and iPad) gSOAP XML Web services tools Copyright (C) 2000-2012, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under one of the following licenses: GPL, the gSOAP public license, or Genivia's license for commercial use. ------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2008, Robert van Engelen, Genivia Inc., All Rights Reserved. ------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. ------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com ------------------------------------------------------------------------------- */ /** @mainpage - @ref ios_0 documents the iOS plugin to facilitate the development of client applications on iOS plarforms (iPhone and iPad) using the gSOAP toolkit. To use the plugin for development of client applications on iOS platforms, registration of this plugin is required: @code #import "gsoapios.h" struct soap *soap = soap_new(); soap_register_plugin(soap, soap_ios); @endcode */ /** @page ios_0 The iOS plugin for developing client applications on iOS (iPhone and iPad) platforms @section ios_intro Introduction Consuming Web services on iOS (iPhone and iPad) platforms is inreseasingly in demand today. However, Xcode does not have any built-in tools that make consuming Web services easy. It typically requires knowledge of XML processing techniques to send soap requests to the Web services and then parse the returning XML results. The gSOAP toolkit that provides an automated SOAP and XML data binding for C and C++ can be used directly to develop client applications to consuming Web services on iOS platforms such as iPhone and iPad. However, it's default network connection does not leverage the advantages of network connection offered by iOS SDK, instead it uses lower level TCP sockets for network connection. This soap plugin facilitates developers to develop Web services client applications on iOS platforms without maniulating the XML processing. Moreover, it takes andvantages of network connection offered by iOS SDK and supports 3G/4G, wifi etc. Two Xcode examples, @ref ios_example_calc and @ref ios_example_geoip can be found in samples/ios. @section ios_1 Getting Started To start building Web services client applications for iPhone and/or iPad with gSOAP , you need: \li The gSOAP package from http://www.genivia.com/Products/downloads.html (select gSOAP toolkit standard edition from the list of software packages), and \li Xcode IDE with the iOS SDK installed. Development of Web services applications on iOS is no different from the development SOAP Web services applications on Linux, Unix and Mac OS except with a soap plugin registration. Specifically, there are four steps to develop SOAP Web services client applications on iOS: \li Generating application stubs using the gSOAP toolkit and add the source files \li Creating an iOS application project to the Xcode project \li Registering the iOS plugin \li Calling service methods @subsection iso_register_pulg Registering iOS Plugin (Required) To register the iOS plugin, simply call soap_register_plugin method: @code #import "gsoapios.h" struct soap *soap = soap_new(); soap_register(soap, soap_ios); // Register the iOS plugin ... soap_end(soap); // Clean up temporaries soap_destroy(soap); // Free soap context @endcode The plugin is destroyed automatically by the soap context when the soap_end method is executed. @subsection ios_cache_policy Specifying Cache policy (Optional) The interaction beween the client and the Web servcie server can be controled by specifying the cache policy. To specify the cache policy, call the method soap_ios_setcachepolicy(struct soap *soap, unsigned int policy) . The method cannot be called before the pluging is registered. @code #import "gsoapios.h" struct soap *soap = soap_new(); soap_register(soap, soap_ios); // Register the iOS plugin // Specify the cache policy for the request // Caveat: this method cannot be called before the plugin is registered // If this method is not called, the cache policy is set to NSURLRequestUseProtocolCachePolicy (0) by default. soap_ios_setchacepolicy(soap, NSURLRequestReturnCacheDataElseLoad); // (2) // Or use the integer directly instead of enum // soap_ios_setchacepolicy(soap, 2); // (NSURLRequestReturnCacheDataElseLoad) ... soap_end(soap); // clean up allocated temporaries soap_destroy(soap); // Free soap context @endcode The available cache policies that can be specified are: @code enum { NSURLRequestUseProtocolCachePolicy = 0, NSURLRequestReloadIgnoringLocalCacheData = 1, NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData, NSURLRequestReturnCacheDataElseLoad = 2, NSURLRequestReturnCacheDataDontLoad = 3, NSURLRequestReloadIgnoringLocalAndRemoteCacheData =4, NSURLRequestReloadRevalidatingCacheData = 5 } @endcode If this method is not called, the cache policy is set to NSURLRequestUseProtocolCachePolicy (0) by default. @subsection ios_timeout_interval Specifying Timeout Interval (Optional) The timeout interval for network connection can be specified using the method soap_ios_settimeoutinterval(struct soap *soap, double seconds). The method cannot be called before the pluging is registered. If this method is not called, the timeout interval is 60 seconds by default. @code #import "gsoapios.h" struct soap *soap = soap_new(); soap_register(soap, soap_ios); // Register the iOS plugin // Specify the timout interval in terms of seconds // If this method is not called, the timeout interval is set to 60 seconds by default // Caveat: this method cannot be called before the plugin is registered soap_ios_settimeoutinterval(soap, 30.0); ... soap_end(soap); soap_destroy(soap); @endcode @subsection ios_http_auth Handling HTTP Authentication A server may request user authentication and deny access (HTTP 401 error) when the client tries to connect without HTTP authentication (or with the wrong authentication information). HTTP authentication (basic) is enabled at the client-side by setting the soap.userid and soap.passwd strings to a username and password, respectively. Be aware of that both of userid and password must be set in pair, that is, if one of them is set, the other must be set too. If the server requires basic HTTP authentication, for example, the userid and password can be specified: @code struct soap *soap = soap_new(); soap->userid = "someone"; soap->passwd = "somepass"; ... soap_end(soap); // Clean up temporaries soap_destroy(soap); @endcode @section ios_example Examples This section intoduces two examples to demonstrate the development of client applications consuming SOAP Web services on iOS platforms (iPhone and iPad) using gSOAP tools and the iOS plugin. Because gSOAP supports development for both pure C and C++, the first example, @ref ios_example_calc, is developed using pure C. The second one, @ref ios_example_geoip, is developmed using C++. We assume you already have had the expereince in development of applications for iPhone and iPad using Xcode with iOS SDK installed. @subsection ios_example_calc A Simple Calculator Example (Pure C) This example shows you how to develop a client application in C using gSOAP and the ios plugin, which consumes a simple caculator service on iOS using gSOAP. The simple calculator service was developed and deployed as a demo using the gSOAP tools (refer to http://www.genivia.com/Products/gsoap/demos/index.html for details). The gSOAP Calculator Service provides several operations such as add, sub, mul, div etc. In this example, we use operation add as a demo. Other operations are alled in a similar way. The wsdl file for this service can be obtained at the following link: http://www.genivia.com/calc.wsdl The Xcode project for this example can be found in samples/ios/calc. @subsubsection ios_calc_step_1 Step 1: Generating stubs for C API To generate codes for the calculator Web service, we first run the wsdl2h tool from the command line on the URL of the WSDL and use option -o to specify the output file (Alternatively, you can download the calc.wsdl and use the local file instead of the URL): @code > wsdl2h -c -o calc.h http://www.genivia.com/calc.wsdl @endcode This generates the calc.h service definition header file with service operation definitions and types for the operation's data. The option -c flags the wsdl2h tool to generate the service definition file in pure C. By default, gSOAP assumes you will use C++ with STL. We have not yet generated the stubs for the CAPI. To do so, run the soapcpp2 compiler: @code > soapcpp2 -i -C calc.h @endcode Option -C indicates client-side only files (soapcpp2 generates both client and server stubs and skeletons by default). This generates a number of soource files for client application development. @subsubsection ios_calc_step_2 Step 2: Creating Xcode project for iPhone Launch the Xcode, create a View-based Application project and name it Calc. Open the CalcViewController.xib file in the Interface Builder. Double-click on the View item and populate it with the views listed below and shown in Figure 1: \li Two Labels ("+" and "A Simple Calculator") \li Two Text Fields (operand1 and operand2) \li One Round Rect Button ("+" button) @image html calc-view.png "Figure 1. View of the Calculator Web Service Client" In Xcode, edit the file CalcViewController.h to make it look like the following: @code // File: CalcViewController.h #import @interface CalcViewController : UIViewController { UITextField *op1; // operand1 UITextField *op2; // operand2 } @property (nonatomic, retain) IBOutlet UITextField *op1; @property (nonatomic, retain) IBOutlet UITextField *op2; - (IBAction) buttonPressed; @end @endcode Link the op1 and op2 to the two Text Fields and delegate the button action to method buttonPressed. @subsubsection ios_calc_step_3 Step 3: Adding generated source stubs to the Xcode project Add the source files soapC.c, soapClient.c, soapH.h, and soapStub.h generated in @ref ios_calc_step_1 to the project. Also add files stdsoap2.h and stdsoap2.c to the project from gsoap package as well as the iOS pluhin files gsoapios.h and sgsoapios.m. @subsubsection ios_calc_step_4 Step 4: Implementing the Logic by calling the soap service Firstly, edit file main.m to import the file ./Classes/calc.nsmap. Link errors may arise without importing this namespace mapping. @code // File: main.m #import #import "./Classes/calc.nsmap" int main(int argc, char *argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; int retVal = UIApplicationMain(argc, argv, nil, nil); [pool release]; return retVal; } @endcode Then, implememt the source file CalcViewController.m as the following: @code #import "CalcViewController.h" #import "soapStub.h" #import "gsoapios.h" @implementation CalcViewController @synthesize op1; // Set or get opreand1 @synthesize op2; // Set or get opreand1 - (IBAction) buttonPressed { double x = [op1.text doubleValue]; double y = [op2.text doubleValue]; struct soap *soap = soap_new(); if (soap_register_plugin(soap, soap_ios) == SOAP_OK) { // Specify the cache policy (optional) to NSURLRequestReturnCacheDataElseLoad // instead of NSURLRequestUseProtocolCachePolicy by deault soap_ios_setcachepolicy(soap, NSURLRequestReturnCacheDataElseLoad); // Specify the timeout interval (optional) to 45 seconds instead of // the default 60 seconds soap_ios_settimeoutinterval(soap, 45.0); double result; // Call Web service operation add int status = soap_call_ns2__add(soap, NULL, NULL, x, y, &result); soap_free_temp(soap); // Cleanup temporary resources // Check soap response status if (status == SOAP_OK) { NSString *resultString; NSString *tittleString; if (status == SOAP_OK) { resultString = [NSString stringWithFormat:@"%f",result]; tittleString = [NSString stringWithFormat:@"%f / %f =",x, y]; }else { resultString = [NSString stringWithFormat:@"%@",@"Soap fault!"]; tittleString = [NSString stringWithFormat:@"%@",@"Warning"]; } // Show the result in an alert UIAlertView *alert = [[UIAlertView alloc] initWithTitle:tittleString message:resultString delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert show]; // Show the alert [alert release]; // Release the alert } else { // Caveat: Better to extract the error message and show it using an alert soap_print_fault(soap,stderr); // Print soap error in console } } soap_end(soap); // clean up allocated temporaries soap_free(soap); // Free soap context } ... @endcode A screen snapshot of the client is shown in Figure 2. @image html calc-result.png "Figure 2: Snapshot of the CalcViewService result" @subsection ios_example_geoip A GeoIPService (C++) GeoIPService is a live SOAP Web service that enables you to look up contries by IP address or by Context. This example shows you how to develop a client application in C++ using gSOAP and the ios plugin, which consumes the GeoIPSerive on iOS using gSOAP. The WSDL file for this servive can be downloaded at the following link: http://www.webservicex.net/geoipservice.asmx?WSDL Devoplopment of he client appliation for this GeoIPService on iOS is similar to development for the cleant appliaction for @ref ios_example_calc. The major dfferences are highlighted in following: \li Rename the .m files to .mm files. The iOS plugin implementation file gsoapios.m must be renamed to gsoapios.mm. The main.m must be renamed to main.mm. Other files such as your ViewController may also be renamed with .mm. \li Generate C++ proxy using proper options with wsdl2h and soapcpp2 \li Use the stdsoap2.cpp instead of stdsoap2.c from the gSOAP package in your iOS project. The Xcode project for this example can be found in samples/ios/GeoIPService. @subsubsection ios_geoip_step_1 Step 1: Generating stubs for C++ Proxy To generate codes for the GeoIPSerbice Web service, we first run the wsdl2h tool from the command line on the URL of the WSDL and use option -o to specify the output file (Alternatively, you can download the GeoIPService.wsdl file and use the local file instead of the URL): @code >wsdl2h -o GeoIPService.h http://www.webservicex.net/geoipservice.asmx?WSDL @endcode This generates the GeoIPService.h service definition header file with service operation definitions and types for the operation's data. By default, gSOAP assumes you will use C++ with STL. To generate the stubs for the C++ proxy classes, run the soapcpp2 compiler: @code >soapcpp2 -i -C -I$GSOAP_HOME/import GeoIPService.h @endcode Option -i tells the compiler to generate C++ proxy and option -C indicates client-side only files (soapcpp2 generates both client and server stubs and skeletons by default). Option -I is needed to import the stlvector.h file from the import directory in the gSOAP package to support serialization of STL vectors. @subsubsection ios_geoip_step_2 Step 2: Creating Xcode project for iPhone Create a View-based Application project and name it GeoIPService and rename the .m source files to .mm. Open the GeoIPserviceViewController.xib file in the Interface Builder. Double-click on the View item and populate it with the views listed below and shown in Figure 3: \li A Label ("IP Address") \li A Text Field \li One Round Rect Button ("Find Country" button) @image html geoip-view.png "Figure 3. View of the GeoIPService Client" In Xcode, edit the file GeoIPServiceViewController.h to make it look like the following: @code // File: GeoIPServiceViewController.h #import @interface GeoIPServiceViewController : UIViewController { UITextField *ipAddress; } @property (nonatomic, retain) IBOutlet UITextField *ipAddress; - (IBAction) buttonFindCountry:(id)sender; @end @endcode Set the ipAddress outlet and the buttonFindCountry:(id)sender method to delegate action of the button. @subsubsection ios_geoip_step_3 Step 3: Adding generated source stubs to the Xcode project Add the source files soapC.cpp, GeoIPServiceSoap12Proxy.cpp, GeoIPServiceSoap12Proxy.h, soapH.h, andsoapStub.h generated in @ref ios_geoip_step_1 to the project. Also add filesstdsoap2.h and stdsoap2.cpp to the project from gsoap package and the iOS pluhin files gsoapios.h and sgsoapios.m. Do not forget to rename the sgsoapios.m to sgsoapios.mm The GeoIPServiceSoap12Proxy.h and GeoIPServiceSoap12Proxy.cpp are C++ proxy header and implementation files for SOAP 1.2 (You may use GeoIPServiceSoapProxy.cpp and GeoIPServiceSoapProxy.h for SOAP1.1). @subsubsection ios_geoip_step_4 Step 4: Implementing the Logic by calling the soap service Firstly, edit file main.mm to import the file ./Classes/GeoIPService.nsmap. Link errors would arise without importing this namespace mapping. @code // File: main.mm #import #import "./Classes/GeoIPServiceSoap12.nsmap" int main(int argc, char *argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; int retVal = UIApplicationMain(argc, argv, nil, nil); [pool release]; return retVal; } @endcode Then, implememt the source file GeoIPServiceViewController.m as the following: @code #import "GeoIPServiceViewController.h" #include "soapGeoIPServiceSoap12Proxy.h" #import "gsoapios.h" using namespace std; typedef struct _ns1__GetGeoIP RequestStruct; typedef struct _ns1__GetGeoIPResponse ResponseStruct; @implementation GeoIPServiceViewController @synthesize ipAddress; - (IBAction)buttonFindCountry:(id)sender { RequestStruct ip; ResponseStruct response; GeoIPServiceSoap12Proxy service; std::string ipAdd = std::string((char *)[ipAddress.text UTF8String]); ip.IPAddress = &ipAdd; // ----- register plugin for callbacks ------ soap_register_plugin(&service, soap_ios); // Optional: timeout internal, the default is 60.0 seconds soap_ios_settimeoutinterval(&service, 30.0); // Optional: the default policy is NSURLRequestUseProtocolCachePolicy (0) soap_ios_setcachepolicy(&service, NSURLRequestReturnCacheDataElseLoad); // (2) int status = service.GetGeoIP(&ip, &response); string* result; string err_msg = "Invalid IP address"; if ( status == SOAP_OK) { if(response.GetGeoIPResult && response.GetGeoIPResult->CountryName) { result = response.GetGeoIPResult->CountryName; } else { result = &err_msg; } } else { service.soap_stream_fault(std::cerr); } NSString *soapResult; NSString *tittleMsg; if (status == SOAP_OK) { soapResult = [NSString stringWithUTF8String:result->c_str()]; tittleMsg = [NSString stringWithFormat: @"%@", @"Country Found"]; } else { soapResult = [NSString stringWithFormat: @"%@", @"Soap Error!"]; tittleMsg = [NSString stringWithFormat: @"%@", @"Warning"]; } UIAlertView *alert = [[UIAlertView alloc] initWithTitle:tittleMsg message:soapResult delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert show]; [alert release]; service.destroy(); // Free soap context } ... @endcode A screen snapshot of the client is shown in Figure 4. @image html geoip-result.png "Figure : Snapshot of the GeoIPServiceViewService result" */ #import "gsoapios.h" #import // ----------------------------------------------------------------------------- // Start of objective-c Class GSoapiOSURLData implementation // ----------------------------------------------------------------------------- /** Class GSoapiOSURLData @brief The class stores the states for connection establishment, buffering soap request and response */ @implementation GSoapiOSURLData @synthesize endpoint; ///< Set or get endpoint @synthesize host; ///< Set or get host name @synthesize soap_action; ///< Set or get soap action @synthesize http_method; ///< Set or get HTTP method @synthesize content_type; ///< Set or get content type @synthesize http_req_msg; ///< Set or get HTTP request message @synthesize soap_req_msg; ///< Set or get SOAP request @synthesize soap_res_msg; ///< Set or get SOAP response @synthesize port; ///< Set or get port @synthesize received_length; ///< Set or get received message length @synthesize request_sent; ///< Set or get the flag for the first time sending @synthesize req_content_length; ///< Set or get request message length @synthesize timeout_interval; ///< Set or get timeout interval @synthesize cache_policy; ///< Set or get cache policy @synthesize user_name; ///< Set or get user ID for authentication @synthesize password; ///< Set or get password for authentication /** @fn init @brief Constructor */ - (id) init { [super init]; http_req_msg = [NSMutableData alloc]; timeout_interval = 60.0; // 60 seconds by default cache_policy = NSURLRequestUseProtocolCachePolicy; // The default cache policy return self; } /** @fn dealloc @brief Destructor */ - (void) dealloc { [endpoint release]; [host release]; [soap_action release]; [http_method release]; [content_type release]; [http_req_msg release]; [soap_req_msg release]; [user_name release]; [password release]; [super dealloc]; } @end // ----------------------------------------------------------------------------- // End of objective-c Class GSoapiOSURLData implementation // ----------------------------------------------------------------------------- // ----------------------------------------------------------------------------- // Start of C plugin implementation // ----------------------------------------------------------------------------- /** plugin identification for plugin registry */ const char soap_ios_id[13] = SOAP_IOS_ID; // Unique plugin ID static int soap_ios_copy(struct soap *soap, struct soap_plugin *dst, struct soap_plugin *src); static void soap_ios_delete(struct soap *soap, struct soap_plugin *p); static int soap_ios_init(struct soap *soap, struct soap_ios_data *data); static SOAP_SOCKET soap_ios_open( struct soap *soap, const char *endpoint, const char *host, int port); static int soap_ios_close( struct soap *soap); static int soap_ios_send( struct soap *soap, const char *buf, size_t len); static size_t soap_ios_recv( struct soap *soap, char *buf, size_t len); //void soap_ios_setcachepolicy(struct soap *soap, unsigned int policy); //void soap_ios_settimeoutinterval(struct soap *soap, double seconds); /** @fn int soap_ios @brief Save the old callbacks and set new callbacks to handle soap client applications on iOS platforms (iPhone and iPad) @param soap The soap context @param[in] p The soap plugin data @param[in] arg The arguments for soap plugin @return SOAP_OK if registration is successfull; SOAP_EOM otherwise */ int soap_ios (struct soap *soap, struct soap_plugin *p, void *arg) { p->id = soap_ios_id; // set a unique plugin id p->data = (void*)malloc(sizeof(struct soap_ios_data)); // Allocate memory p->fcopy = soap_ios_copy; // set fcopy callback for soap_copy(truct soap*) p->fdelete = soap_ios_delete; // set fdeete callback if (p->data) { if (soap_ios_init(soap, (struct soap_ios_data*)p->data) != SOAP_OK) { free(p->data); // free resource upon failure to initialize plugin return SOAP_EOM; } } return SOAP_OK; } /** @fn int soap_ios_copy(struct soap *soap, struct soap_plugin *dst, struct soap_plugin *src) @brief Duplicates the plugin context for the soap context @param soap The soap context @param[out] dst The destination plugin data to store to @param[in] src The sources plugin data to be copied from @param[in] arg The arguments for plugin (optional) @return SOAP_OK if registration is successfull; SOAP_ERR otherwise */ static int soap_ios_copy(struct soap *soap, struct soap_plugin *dst, struct soap_plugin *src) { *dst = *src; int status = SOAP_ERR; if (dst->data = (void*)malloc(sizeof(struct soap_ios_data))) status = soap_ios_init(soap, (struct soap_ios_data*)dst->data); return status; } /** @fn void soap_ios_delete(struct soap *soap, struct soap_plugin *p) @brief Destroys the plugin context @param soap context @param[in] p plugin data */ static void soap_ios_delete(struct soap *soap, struct soap_plugin *p) { if (p != NULL) { struct soap_ios_data *data = (struct soap_ios_data*)p->data; if (data && data->url_data) [data->url_data release]; // Free url_data free(p->data); // Free the pointer to url_data } } /** @fn int soap_ios_init(struct soap *soap, struct soap_ios_data *data) @brief Initializes the plugin data @param soap The soap context @param[out] data The plugin data to be initialized @return SOAP_OK if initialization is sucessful; SOAP_ERR otherwise */ static int soap_ios_init(struct soap *soap, struct soap_ios_data *data) { data->url_data = [[GSoapiOSURLData alloc] init]; if (data->url_data == nil) return SOAP_ERR; // failure to init // save and set callbacks data->fopen = soap->fopen; // save old fopen callback data->fclose = soap->fclose; // save old fclose callback data->fsend = soap->fsend; // save old fsend callback data->frecv = soap->frecv; // save old frecv callback soap->fopen = soap_ios_open; // replace open callback soap->fclose = soap_ios_close; // replace close callback soap->fsend = soap_ios_send; // replace send callback soap->frecv = soap_ios_recv; // replace recv callback return SOAP_OK; } /** @fn SOAP_SOCKET soap_ios_open( struct soap *soap, const char *endpoint, const char *host, int port) @brief Extracts states from soap context and saves states for soap connection @param soap The soap context @param[in] endpoint The Web service's endpoint @param[in] host The host name @param[in] port The port numer @return 1 A valid socket Note: This open function does not create a real socket for communication. The actual connection establishment happens in the frecv callback */ static SOAP_SOCKET soap_ios_open( struct soap *soap, const char *endpoint, const char *host, int port) { // Pull out the pluin data struct soap_ios_data *data = (struct soap_ios_data *)soap_lookup_plugin(soap, soap_ios_id); if (data == NULL || data->url_data == nil) return SOAP_INVALID_SOCKET; GSoapiOSURLData * url_data = data->url_data; [url_data setEndpoint:[NSString stringWithUTF8String:endpoint]]; [url_data setHost:[NSString stringWithUTF8String:host]]; [url_data setPort:port]; [url_data setRequest_sent:false]; [url_data setReceived_length:0]; [url_data setSoap_action:[NSString stringWithUTF8String:soap->action]]; [url_data setReq_content_length:soap->count]; // Extract a pair of userid and password if present if (soap->userid && soap->passwd) { [url_data setUser_name:[NSString stringWithUTF8String:soap->userid]]; [url_data setPassword:[NSString stringWithUTF8String:soap->passwd]]; } else { [url_data setUser_name:nil]; [url_data setPassword:nil]; } // Extracts and saves http-method switch (soap->status){ case SOAP_POST: [url_data setHttp_method:@"POST"]; break; case SOAP_GET: [url_data setHttp_method:@"GET"]; break; case SOAP_DEL: [url_data setHttp_method:@"DELETE"]; break; case SOAP_CONNECT: [url_data setHttp_method:@"CONNECT"]; break; default: [url_data setHttp_method:@"POST"]; break; } // Extracts and saves http content-type if((soap->mode & SOAP_ENC_DIME) && !(soap->mode & SOAP_ENC_MTOM)){ [url_data setContent_type:@"application/dime"]; } else if (soap->version == 2){ if (soap->mode & SOAP_ENC_MTOM){ [url_data setContent_type:@"application/xop+xml; charset=utf-8; \ type=\"application/soap+xml\""]; }else{ [url_data setContent_type:@"application/soap+xml; charset=utf-8"]; } }else if (soap->mode & SOAP_ENC_MTOM) { [url_data setContent_type:@"application/xop+xml; charset=utf-8; \ type=\"text/xml\""]; } else { [url_data setContent_type:@"tex/xml; charset=utf-8"]; } return 1; } /** @fn int soap_ios_close( struct soap *soap) @param soap The soap context @param[in] endpoint The Web service's endpoint @param[in] host The host name @param[in] port The port numer @return 0 Note: This open function does not create a real socket for communication. The actual connection establishment happens in the frecv callback */ static int soap_ios_close( struct soap *soap) { return 0; } /** @fn int soap_ios_send( struct soap *soap, const char *buf, size_t len) @brief Buffers the http/soap request in plugin data @param soap The soap context @param[in] buf The buffer holding the serialized http/soap request @param[in] len The buffer size @return The number of bytes buffered Note: This send function does not send any data to its peer. Rather it buffers the serialied soap request including http header to the plugin data. The sending happens actually in frecv function. */ static int soap_ios_send( struct soap *soap, const char *buf, size_t len) { struct soap_ios_data *data = (struct soap_ios_data*)soap_lookup_plugin(soap,soap_ios_id); GSoapiOSURLData *url_data = data->url_data; [url_data.http_req_msg appendBytes:buf length: len]; return len > 0 ? SOAP_OK : SOAP_EOF; } /** @fn size_t soap_ios_recv( struct soap *soap, char *buf, size_t len) @brief Sends soap request, buffers soap response and serialize the response @param soap The soap context @param[out] buf The buffer for the received data @param[in] len The number of bytes received @return The number of bytes received Note: This recv function sends a synchronous soap request through NSURLRequest, receives soap response, serializes response. */ static size_t soap_ios_recv( struct soap *soap, char *buf, size_t len) { struct soap_ios_data *data = (struct soap_ios_data*)soap_lookup_plugin(soap,soap_ios_id); GSoapiOSURLData *url_data = data->url_data; // Handle HTTP basic authentication if present if (url_data.user_name && url_data.password) { NSURLCredential *credential = [NSURLCredential credentialWithUser:url_data.user_name password:url_data.password persistence:NSURLCredentialPersistenceForSession]; NSURLProtectionSpace * protectionSpace = [[NSURLProtectionSpace alloc] initWithHost:url_data.host port:url_data.port protocol:@"http" realm:nil authenticationMethod:nil]; [[NSURLCredentialStorage sharedCredentialStorage] setDefaultCredential:credential forProtectionSpace:protectionSpace]; [protectionSpace release]; } // -------- End of auhentication handling --------- // Execute once: sending the request and receiving response // Send request through NSURLRequest sendSynchronousRequest // and receive response if(url_data.request_sent == false) { [url_data setRequest_sent:true]; //int msg_len = [url_data.http_req_msg length]; NSRange range = NSMakeRange([url_data.http_req_msg length] - url_data.req_content_length, url_data.req_content_length); url_data.soap_req_msg = [url_data.http_req_msg subdataWithRange:range]; NSURL *url = [NSURL URLWithString:url_data.endpoint]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:(NSURLRequestCachePolicy)url_data.cache_policy timeoutInterval:url_data.timeout_interval]; [request addValue:url_data.host forHTTPHeaderField:@"HOST"]; [request addValue:url_data.soap_action forHTTPHeaderField:@"SOAPACTION"]; [request addValue:url_data.content_type forHTTPHeaderField:@"Content-Type"]; [request setHTTPMethod:url_data.http_method]; NSString *conten_length = [NSString stringWithFormat:@"%d", [url_data.soap_req_msg length]]; [request addValue:conten_length forHTTPHeaderField:@"Content-Length"]; [request setHTTPBody:url_data.soap_req_msg]; NSHTTPURLResponse *response = nil; NSError *error = nil; url_data.soap_res_msg = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; // Error handling if (error) { DLog(@"ERROR:<%@>\n", [error localizedDescription]); //const char *fault_string = [[error localizedDescription] UTF8String]; soap_receiver_fault(soap, [[error localizedDescription] UTF8String], ""); } } // may execute multiple times depending on the buffer size and response length if(url_data.request_sent) { size_t res_len = [url_data.soap_res_msg length]; // response length if (len + url_data.received_length > res_len) { // Adjustment len len = res_len - url_data.received_length; //cout << "len = " << len << endl; } const char *res_msg = (const char *)[url_data.soap_res_msg bytes]; memcpy(buf, res_msg + url_data.received_length, len); url_data.received_length += len; } return url_data.request_sent ? len : 0; } /** @fn void soap_ios_setcachepolicy(struct soap *soap, unsigned int policy) @brief Sets cache policy The constants used to specify interaction with the cached responses are: enum { NSURLRequestUseProtocolCachePolicy = 0, NSURLRequestReloadIgnoringLocalCacheData = 1, NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData, NSURLRequestReturnCacheDataElseLoad = 2, NSURLRequestReturnCacheDataDontLoad = 3, NSURLRequestReloadIgnoringLocalAndRemoteCacheData =4, NSURLRequestReloadRevalidatingCacheData = 5 }; @param soap The soap context @param[in] policy The policy to be specified for he request */ void soap_ios_setcachepolicy(struct soap *soap, unsigned int policy) { struct soap_ios_data *data = (struct soap_ios_data *)soap_lookup_plugin(soap, soap_ios_id); data->url_data.cache_policy = policy; } /** @fn soap_ios_settimeoutinterval(struct soap *soap, double seconds) @brief Sets timeout interval @param soap The soap context @param[in] seconds The value for the timeout interval to be specifed (in seconds) */ void soap_ios_settimeoutinterval(struct soap *soap, double seconds) { struct soap_ios_data *data = (struct soap_ios_data *)soap_lookup_plugin(soap, soap_ios_id); data->url_data.timeout_interval = seconds; } // ----------------------------------------------------------------------------- // END of C plugin implementation // ----------------------------------------------------------------------------- gsoap-2.8.28/gsoap/ios_plugin/ios_plugin/gsoapios.mm0000644000175000017500000011153312653650150022103 0ustar ellertellert/* gsoapios.m iOS plugin (iPhone and iPad) gSOAP XML Web services tools Copyright (C) 2000-2012, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under one of the following licenses: GPL, the gSOAP public license, or Genivia's license for commercial use. ------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2008, Robert van Engelen, Genivia Inc., All Rights Reserved. ------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. ------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com ------------------------------------------------------------------------------- */ /** @mainpage - @ref ios_0 documents the iOS plugin to facilitate the development of client applications on iOS plarforms (iPhone and iPad) using the gSOAP toolkit. To use the plugin for development of client applications on iOS platforms, registration of this plugin is required: @code #import "gsoapios.h" struct soap *soap = soap_new(); soap_register_plugin(soap, soap_ios); @endcode */ /** @page ios_0 The iOS plugin for developing client applications on iOS (iPhone and iPad) platforms @section ios_intro Introduction Consuming Web services on iOS (iPhone and iPad) platforms is inreseasingly in demand today. However, Xcode does not have any built-in tools that make consuming Web services easy. It typically requires knowledge of XML processing techniques to send soap requests to the Web services and then parse the returning XML results. The gSOAP toolkit that provides an automated SOAP and XML data binding for C and C++ can be used directly to develop client applications to consuming Web services on iOS platforms such as iPhone and iPad. However, it's default network connection does not leverage the advantages of network connection offered by iOS SDK, instead it uses lower level TCP sockets for network connection. This soap plugin facilitates developers to develop Web services client applications on iOS platforms without maniulating the XML processing. Moreover, it takes andvantages of network connection offered by iOS SDK and supports 3G/4G, wifi etc. Two Xcode examples, @ref ios_example_calc and @ref ios_example_geoip can be found in samples/ios. @section ios_1 Getting Started To start building Web services client applications for iPhone and/or iPad with gSOAP , you need: \li The gSOAP package from http://www.genivia.com/Products/downloads.html (select gSOAP toolkit standard edition from the list of software packages), and \li Xcode IDE with the iOS SDK installed. Development of Web services applications on iOS is no different from the development SOAP Web services applications on Linux, Unix and Mac OS except with a soap plugin registration. Specifically, there are four steps to develop SOAP Web services client applications on iOS: \li Generating application stubs using the gSOAP toolkit and add the source files \li Creating an iOS application project to the Xcode project \li Registering the iOS plugin \li Calling service methods @subsection iso_register_pulg Registering iOS Plugin (Required) To register the iOS plugin, simply call soap_register_plugin method: @code #import "gsoapios.h" struct soap *soap = soap_new(); soap_register(soap, soap_ios); // Register the iOS plugin ... soap_end(soap); // Clean up temporaries soap_destroy(soap); // Free soap context @endcode The plugin is destroyed automatically by the soap context when the soap_end method is executed. @subsection ios_cache_policy Specifying Cache policy (Optional) The interaction beween the client and the Web servcie server can be controled by specifying the cache policy. To specify the cache policy, call the method soap_ios_setcachepolicy(struct soap *soap, unsigned int policy) . The method cannot be called before the pluging is registered. @code #import "gsoapios.h" struct soap *soap = soap_new(); soap_register(soap, soap_ios); // Register the iOS plugin // Specify the cache policy for the request // Caveat: this method cannot be called before the plugin is registered // If this method is not called, the cache policy is set to NSURLRequestUseProtocolCachePolicy (0) by default. soap_ios_setchacepolicy(soap, NSURLRequestReturnCacheDataElseLoad); // (2) // Or use the integer directly instead of enum // soap_ios_setchacepolicy(soap, 2); // (NSURLRequestReturnCacheDataElseLoad) ... soap_end(soap); // clean up allocated temporaries soap_destroy(soap); // Free soap context @endcode The available cache policies that can be specified are: @code enum { NSURLRequestUseProtocolCachePolicy = 0, NSURLRequestReloadIgnoringLocalCacheData = 1, NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData, NSURLRequestReturnCacheDataElseLoad = 2, NSURLRequestReturnCacheDataDontLoad = 3, NSURLRequestReloadIgnoringLocalAndRemoteCacheData =4, NSURLRequestReloadRevalidatingCacheData = 5 } @endcode If this method is not called, the cache policy is set to NSURLRequestUseProtocolCachePolicy (0) by default. @subsection ios_timeout_interval Specifying Timeout Interval (Optional) The timeout interval for network connection can be specified using the method soap_ios_settimeoutinterval(struct soap *soap, double seconds). The method cannot be called before the pluging is registered. If this method is not called, the timeout interval is 60 seconds by default. @code #import "gsoapios.h" struct soap *soap = soap_new(); soap_register(soap, soap_ios); // Register the iOS plugin // Specify the timout interval in terms of seconds // If this method is not called, the timeout interval is set to 60 seconds by default // Caveat: this method cannot be called before the plugin is registered soap_ios_settimeoutinterval(soap, 30.0); ... soap_end(soap); soap_destroy(soap); @endcode @subsection ios_http_auth Handling HTTP Authentication A server may request user authentication and deny access (HTTP 401 error) when the client tries to connect without HTTP authentication (or with the wrong authentication information). HTTP authentication (basic) is enabled at the client-side by setting the soap.userid and soap.passwd strings to a username and password, respectively. Be aware of that both of userid and password must be set in pair, that is, if one of them is set, the other must be set too. If the server requires basic HTTP authentication, for example, the userid and password can be specified: @code struct soap *soap = soap_new(); soap->userid = "someone"; soap->passwd = "somepass"; ... soap_end(soap); // Clean up temporaries soap_destroy(soap); @endcode @section ios_example Examples This section intoduces two examples to demonstrate the development of client applications consuming SOAP Web services on iOS platforms (iPhone and iPad) using gSOAP tools and the iOS plugin. Because gSOAP supports development for both pure C and C++, the first example, @ref ios_example_calc, is developed using pure C. The second one, @ref ios_example_geoip, is developmed using C++. We assume you already have had the expereince in development of applications for iPhone and iPad using Xcode with iOS SDK installed. @subsection ios_example_calc A Simple Calculator Example (Pure C) This example shows you how to develop a client application in C using gSOAP and the ios plugin, which consumes a simple caculator service on iOS using gSOAP. The simple calculator service was developed and deployed as a demo using the gSOAP tools (refer to http://www.genivia.com/Products/gsoap/demos/index.html for details). The gSOAP Calculator Service provides several operations such as add, sub, mul, div etc. In this example, we use operation add as a demo. Other operations are alled in a similar way. The wsdl file for this service can be obtained at the following link: http://www.genivia.com/calc.wsdl The Xcode project for this example can be found in samples/ios/calc. @subsubsection ios_calc_step_1 Step 1: Generating stubs for C API To generate codes for the calculator Web service, we first run the wsdl2h tool from the command line on the URL of the WSDL and use option -o to specify the output file (Alternatively, you can download the calc.wsdl and use the local file instead of the URL): @code > wsdl2h -c -o calc.h http://www.genivia.com/calc.wsdl @endcode This generates the calc.h service definition header file with service operation definitions and types for the operation's data. The option -c flags the wsdl2h tool to generate the service definition file in pure C. By default, gSOAP assumes you will use C++ with STL. We have not yet generated the stubs for the CAPI. To do so, run the soapcpp2 compiler: @code > soapcpp2 -i -C calc.h @endcode Option -C indicates client-side only files (soapcpp2 generates both client and server stubs and skeletons by default). This generates a number of soource files for client application development. @subsubsection ios_calc_step_2 Step 2: Creating Xcode project for iPhone Launch the Xcode, create a View-based Application project and name it Calc. Open the CalcViewController.xib file in the Interface Builder. Double-click on the View item and populate it with the views listed below and shown in Figure 1: \li Two Labels ("+" and "A Simple Calculator") \li Two Text Fields (operand1 and operand2) \li One Round Rect Button ("+" button) @image html calc-view.png "Figure 1. View of the Calculator Web Service Client" In Xcode, edit the file CalcViewController.h to make it look like the following: @code // File: CalcViewController.h #import @interface CalcViewController : UIViewController { UITextField *op1; // operand1 UITextField *op2; // operand2 } @property (nonatomic, retain) IBOutlet UITextField *op1; @property (nonatomic, retain) IBOutlet UITextField *op2; - (IBAction) buttonPressed; @end @endcode Link the op1 and op2 to the two Text Fields and delegate the button action to method buttonPressed. @subsubsection ios_calc_step_3 Step 3: Adding generated source stubs to the Xcode project Add the source files soapC.c, soapClient.c, soapH.h, and soapStub.h generated in @ref ios_calc_step_1 to the project. Also add files stdsoap2.h and stdsoap2.c to the project from gsoap package as well as the iOS pluhin files gsoapios.h and sgsoapios.m. @subsubsection ios_calc_step_4 Step 4: Implementing the Logic by calling the soap service Firstly, edit file main.m to import the file ./Classes/calc.nsmap. Link errors may arise without importing this namespace mapping. @code // File: main.m #import #import "./Classes/calc.nsmap" int main(int argc, char *argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; int retVal = UIApplicationMain(argc, argv, nil, nil); [pool release]; return retVal; } @endcode Then, implememt the source file CalcViewController.m as the following: @code #import "CalcViewController.h" #import "soapStub.h" #import "gsoapios.h" @implementation CalcViewController @synthesize op1; // Set or get opreand1 @synthesize op2; // Set or get opreand1 - (IBAction) buttonPressed { double x = [op1.text doubleValue]; double y = [op2.text doubleValue]; struct soap *soap = soap_new(); if (soap_register_plugin(soap, soap_ios) == SOAP_OK) { // Specify the cache policy (optional) to NSURLRequestReturnCacheDataElseLoad // instead of NSURLRequestUseProtocolCachePolicy by deault soap_ios_setcachepolicy(soap, NSURLRequestReturnCacheDataElseLoad); // Specify the timeout interval (optional) to 45 seconds instead of // the default 60 seconds soap_ios_settimeoutinterval(soap, 45.0); double result; // Call Web service operation add int status = soap_call_ns2__add(soap, NULL, NULL, x, y, &result); soap_free_temp(soap); // Cleanup temporary resources // Check soap response status if (status == SOAP_OK) { NSString *resultString; NSString *tittleString; if (status == SOAP_OK) { resultString = [NSString stringWithFormat:@"%f",result]; tittleString = [NSString stringWithFormat:@"%f / %f =",x, y]; }else { resultString = [NSString stringWithFormat:@"%@",@"Soap fault!"]; tittleString = [NSString stringWithFormat:@"%@",@"Warning"]; } // Show the result in an alert UIAlertView *alert = [[UIAlertView alloc] initWithTitle:tittleString message:resultString delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert show]; // Show the alert [alert release]; // Release the alert } else { // Caveat: Better to extract the error message and show it using an alert soap_print_fault(soap,stderr); // Print soap error in console } } soap_end(soap); // clean up allocated temporaries soap_free(soap); // Free soap context } ... @endcode A screen snapshot of the client is shown in Figure 2. @image html calc-result.png "Figure 2: Snapshot of the CalcViewService result" @subsection ios_example_geoip A GeoIPService (C++) GeoIPService is a live SOAP Web service that enables you to look up contries by IP address or by Context. This example shows you how to develop a client application in C++ using gSOAP and the ios plugin, which consumes the GeoIPSerive on iOS using gSOAP. The WSDL file for this servive can be downloaded at the following link: http://www.webservicex.net/geoipservice.asmx?WSDL Devoplopment of he client appliation for this GeoIPService on iOS is similar to development for the cleant appliaction for @ref ios_example_calc. The major dfferences are highlighted in following: \li Rename the .m files to .mm files. The iOS plugin implementation file gsoapios.m must be renamed to gsoapios.mm. The main.m must be renamed to main.mm. Other files such as your ViewController may also be renamed with .mm. \li Generate C++ proxy using proper options with wsdl2h and soapcpp2 \li Use the stdsoap2.cpp instead of stdsoap2.c from the gSOAP package in your iOS project. The Xcode project for this example can be found in samples/ios/GeoIPService. @subsubsection ios_geoip_step_1 Step 1: Generating stubs for C++ Proxy To generate codes for the GeoIPSerbice Web service, we first run the wsdl2h tool from the command line on the URL of the WSDL and use option -o to specify the output file (Alternatively, you can download the GeoIPService.wsdl file and use the local file instead of the URL): @code >wsdl2h -o GeoIPService.h http://www.webservicex.net/geoipservice.asmx?WSDL @endcode This generates the GeoIPService.h service definition header file with service operation definitions and types for the operation's data. By default, gSOAP assumes you will use C++ with STL. To generate the stubs for the C++ proxy classes, run the soapcpp2 compiler: @code >soapcpp2 -i -C -I$GSOAP_HOME/import GeoIPService.h @endcode Option -i tells the compiler to generate C++ proxy and option -C indicates client-side only files (soapcpp2 generates both client and server stubs and skeletons by default). Option -I is needed to import the stlvector.h file from the import directory in the gSOAP package to support serialization of STL vectors. @subsubsection ios_geoip_step_2 Step 2: Creating Xcode project for iPhone Create a View-based Application project and name it GeoIPService and rename the .m source files to .mm. Open the GeoIPserviceViewController.xib file in the Interface Builder. Double-click on the View item and populate it with the views listed below and shown in Figure 3: \li A Label ("IP Address") \li A Text Field \li One Round Rect Button ("Find Country" button) @image html geoip-view.png "Figure 3. View of the GeoIPService Client" In Xcode, edit the file GeoIPServiceViewController.h to make it look like the following: @code // File: GeoIPServiceViewController.h #import @interface GeoIPServiceViewController : UIViewController { UITextField *ipAddress; } @property (nonatomic, retain) IBOutlet UITextField *ipAddress; - (IBAction) buttonFindCountry:(id)sender; @end @endcode Set the ipAddress outlet and the buttonFindCountry:(id)sender method to delegate action of the button. @subsubsection ios_geoip_step_3 Step 3: Adding generated source stubs to the Xcode project Add the source files soapC.cpp, GeoIPServiceSoap12Proxy.cpp, GeoIPServiceSoap12Proxy.h, soapH.h, andsoapStub.h generated in @ref ios_geoip_step_1 to the project. Also add filesstdsoap2.h and stdsoap2.cpp to the project from gsoap package and the iOS pluhin files gsoapios.h and sgsoapios.m. Do not forget to rename the sgsoapios.m to sgsoapios.mm The GeoIPServiceSoap12Proxy.h and GeoIPServiceSoap12Proxy.cpp are C++ proxy header and implementation files for SOAP 1.2 (You may use GeoIPServiceSoapProxy.cpp and GeoIPServiceSoapProxy.h for SOAP1.1). @subsubsection ios_geoip_step_4 Step 4: Implementing the Logic by calling the soap service Firstly, edit file main.mm to import the file ./Classes/GeoIPService.nsmap. Link errors would arise without importing this namespace mapping. @code // File: main.mm #import #import "./Classes/GeoIPServiceSoap12.nsmap" int main(int argc, char *argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; int retVal = UIApplicationMain(argc, argv, nil, nil); [pool release]; return retVal; } @endcode Then, implememt the source file GeoIPServiceViewController.m as the following: @code #import "GeoIPServiceViewController.h" #include "soapGeoIPServiceSoap12Proxy.h" #import "gsoapios.h" using namespace std; typedef struct _ns1__GetGeoIP RequestStruct; typedef struct _ns1__GetGeoIPResponse ResponseStruct; @implementation GeoIPServiceViewController @synthesize ipAddress; - (IBAction)buttonFindCountry:(id)sender { RequestStruct ip; ResponseStruct response; GeoIPServiceSoap12Proxy service; std::string ipAdd = std::string((char *)[ipAddress.text UTF8String]); ip.IPAddress = &ipAdd; // ----- register plugin for callbacks ------ soap_register_plugin(&service, soap_ios); // Optional: timeout internal, the default is 60.0 seconds soap_ios_settimeoutinterval(&service, 30.0); // Optional: the default policy is NSURLRequestUseProtocolCachePolicy (0) soap_ios_setcachepolicy(&service, NSURLRequestReturnCacheDataElseLoad); // (2) int status = service.GetGeoIP(&ip, &response); string* result; string err_msg = "Invalid IP address"; if ( status == SOAP_OK) { if(response.GetGeoIPResult && response.GetGeoIPResult->CountryName) { result = response.GetGeoIPResult->CountryName; } else { result = &err_msg; } } else { service.soap_stream_fault(std::cerr); } NSString *soapResult; NSString *tittleMsg; if (status == SOAP_OK) { soapResult = [NSString stringWithUTF8String:result->c_str()]; tittleMsg = [NSString stringWithFormat: @"%@", @"Country Found"]; } else { soapResult = [NSString stringWithFormat: @"%@", @"Soap Error!"]; tittleMsg = [NSString stringWithFormat: @"%@", @"Warning"]; } UIAlertView *alert = [[UIAlertView alloc] initWithTitle:tittleMsg message:soapResult delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert show]; [alert release]; service.destroy(); // Free soap context } ... @endcode A screen snapshot of the client is shown in Figure 4. @image html geoip-result.png "Figure : Snapshot of the GeoIPServiceViewService result" */ #import "gsoapios.h" #import // ----------------------------------------------------------------------------- // Start of objective-c Class GSoapiOSURLData implementation // ----------------------------------------------------------------------------- /** Class GSoapiOSURLData @brief The class stores the states for connection establishment, buffering soap request and response */ @implementation GSoapiOSURLData @synthesize endpoint; ///< Set or get endpoint @synthesize host; ///< Set or get host name @synthesize soap_action; ///< Set or get soap action @synthesize http_method; ///< Set or get HTTP method @synthesize content_type; ///< Set or get content type @synthesize http_req_msg; ///< Set or get HTTP request message @synthesize soap_req_msg; ///< Set or get SOAP request @synthesize soap_res_msg; ///< Set or get SOAP response @synthesize port; ///< Set or get port @synthesize received_length; ///< Set or get received message length @synthesize request_sent; ///< Set or get the flag for the first time sending @synthesize req_content_length; ///< Set or get request message length @synthesize timeout_interval; ///< Set or get timeout interval @synthesize cache_policy; ///< Set or get cache policy @synthesize user_name; ///< Set or get user ID for authentication @synthesize password; ///< Set or get password for authentication /** @fn init @brief Constructor */ - (id) init { [super init]; http_req_msg = [NSMutableData alloc]; timeout_interval = 60.0; // 60 seconds by default cache_policy = NSURLRequestUseProtocolCachePolicy; // The default cache policy return self; } /** @fn dealloc @brief Destructor */ - (void) dealloc { [endpoint release]; [host release]; [soap_action release]; [http_method release]; [content_type release]; [http_req_msg release]; [soap_req_msg release]; [user_name release]; [password release]; [super dealloc]; } @end // ----------------------------------------------------------------------------- // End of objective-c Class GSoapiOSURLData implementation // ----------------------------------------------------------------------------- // ----------------------------------------------------------------------------- // Start of C plugin implementation // ----------------------------------------------------------------------------- /** plugin identification for plugin registry */ const char soap_ios_id[13] = SOAP_IOS_ID; // Unique plugin ID static int soap_ios_copy(struct soap *soap, struct soap_plugin *dst, struct soap_plugin *src); static void soap_ios_delete(struct soap *soap, struct soap_plugin *p); static int soap_ios_init(struct soap *soap, struct soap_ios_data *data); static SOAP_SOCKET soap_ios_open( struct soap *soap, const char *endpoint, const char *host, int port); static int soap_ios_close( struct soap *soap); static int soap_ios_send( struct soap *soap, const char *buf, size_t len); static size_t soap_ios_recv( struct soap *soap, char *buf, size_t len); //void soap_ios_setcachepolicy(struct soap *soap, unsigned int policy); //void soap_ios_settimeoutinterval(struct soap *soap, double seconds); /** @fn int soap_ios @brief Save the old callbacks and set new callbacks to handle soap client applications on iOS platforms (iPhone and iPad) @param soap The soap context @param[in] p The soap plugin data @param[in] arg The arguments for soap plugin @return SOAP_OK if registration is successfull; SOAP_EOM otherwise */ int soap_ios (struct soap *soap, struct soap_plugin *p, void *arg) { p->id = soap_ios_id; // set a unique plugin id p->data = (void*)malloc(sizeof(struct soap_ios_data)); // Allocate memory p->fcopy = soap_ios_copy; // set fcopy callback for soap_copy(truct soap*) p->fdelete = soap_ios_delete; // set fdeete callback if (p->data) { if (soap_ios_init(soap, (struct soap_ios_data*)p->data) != SOAP_OK) { free(p->data); // free resource upon failure to initialize plugin return SOAP_EOM; } } return SOAP_OK; } /** @fn int soap_ios_copy(struct soap *soap, struct soap_plugin *dst, struct soap_plugin *src) @brief Duplicates the plugin context for the soap context @param soap The soap context @param[out] dst The destination plugin data to store to @param[in] src The sources plugin data to be copied from @param[in] arg The arguments for plugin (optional) @return SOAP_OK if registration is successfull; SOAP_ERR otherwise */ static int soap_ios_copy(struct soap *soap, struct soap_plugin *dst, struct soap_plugin *src) { *dst = *src; int status = SOAP_ERR; if (dst->data = (void*)malloc(sizeof(struct soap_ios_data))) status = soap_ios_init(soap, (struct soap_ios_data*)dst->data); return status; } /** @fn void soap_ios_delete(struct soap *soap, struct soap_plugin *p) @brief Destroys the plugin context @param soap context @param[in] p plugin data */ static void soap_ios_delete(struct soap *soap, struct soap_plugin *p) { if (p != NULL) { struct soap_ios_data *data = (struct soap_ios_data*)p->data; if (data && data->url_data) [data->url_data release]; // Free url_data free(p->data); // Free the pointer to url_data } } /** @fn int soap_ios_init(struct soap *soap, struct soap_ios_data *data) @brief Initializes the plugin data @param soap The soap context @param[out] data The plugin data to be initialized @return SOAP_OK if initialization is sucessful; SOAP_ERR otherwise */ static int soap_ios_init(struct soap *soap, struct soap_ios_data *data) { data->url_data = [[GSoapiOSURLData alloc] init]; if (data->url_data == nil) return SOAP_ERR; // failure to init // save and set callbacks data->fopen = soap->fopen; // save old fopen callback data->fclose = soap->fclose; // save old fclose callback data->fsend = soap->fsend; // save old fsend callback data->frecv = soap->frecv; // save old frecv callback soap->fopen = soap_ios_open; // replace open callback soap->fclose = soap_ios_close; // replace close callback soap->fsend = soap_ios_send; // replace send callback soap->frecv = soap_ios_recv; // replace recv callback return SOAP_OK; } /** @fn SOAP_SOCKET soap_ios_open( struct soap *soap, const char *endpoint, const char *host, int port) @brief Extracts states from soap context and saves states for soap connection @param soap The soap context @param[in] endpoint The Web service's endpoint @param[in] host The host name @param[in] port The port numer @return 1 A valid socket Note: This open function does not create a real socket for communication. The actual connection establishment happens in the frecv callback */ static SOAP_SOCKET soap_ios_open( struct soap *soap, const char *endpoint, const char *host, int port) { // Pull out the pluin data struct soap_ios_data *data = (struct soap_ios_data *)soap_lookup_plugin(soap, soap_ios_id); if (data == NULL || data->url_data == nil) return SOAP_INVALID_SOCKET; GSoapiOSURLData * url_data = data->url_data; [url_data setEndpoint:[NSString stringWithUTF8String:endpoint]]; [url_data setHost:[NSString stringWithUTF8String:host]]; [url_data setPort:port]; [url_data setRequest_sent:false]; [url_data setReceived_length:0]; [url_data setSoap_action:[NSString stringWithUTF8String:soap->action]]; [url_data setReq_content_length:soap->count]; // Extract a pair of userid and password if present if (soap->userid && soap->passwd) { [url_data setUser_name:[NSString stringWithUTF8String:soap->userid]]; [url_data setPassword:[NSString stringWithUTF8String:soap->passwd]]; } else { [url_data setUser_name:nil]; [url_data setPassword:nil]; } // Extracts and saves http-method switch (soap->status){ case SOAP_POST: [url_data setHttp_method:@"POST"]; break; case SOAP_GET: [url_data setHttp_method:@"GET"]; break; case SOAP_DEL: [url_data setHttp_method:@"DELETE"]; break; case SOAP_CONNECT: [url_data setHttp_method:@"CONNECT"]; break; default: [url_data setHttp_method:@"POST"]; break; } // Extracts and saves http content-type if((soap->mode & SOAP_ENC_DIME) && !(soap->mode & SOAP_ENC_MTOM)){ [url_data setContent_type:@"application/dime"]; } else if (soap->version == 2){ if (soap->mode & SOAP_ENC_MTOM){ [url_data setContent_type:@"application/xop+xml; charset=utf-8; \ type=\"application/soap+xml\""]; }else{ [url_data setContent_type:@"application/soap+xml; charset=utf-8"]; } }else if (soap->mode & SOAP_ENC_MTOM) { [url_data setContent_type:@"application/xop+xml; charset=utf-8; \ type=\"text/xml\""]; } else { [url_data setContent_type:@"tex/xml; charset=utf-8"]; } return 1; } /** @fn int soap_ios_close( struct soap *soap) @param soap The soap context @param[in] endpoint The Web service's endpoint @param[in] host The host name @param[in] port The port numer @return 0 Note: This open function does not create a real socket for communication. The actual connection establishment happens in the frecv callback */ static int soap_ios_close( struct soap *soap) { return 0; } /** @fn int soap_ios_send( struct soap *soap, const char *buf, size_t len) @brief Buffers the http/soap request in plugin data @param soap The soap context @param[in] buf The buffer holding the serialized http/soap request @param[in] len The buffer size @return The number of bytes buffered Note: This send function does not send any data to its peer. Rather it buffers the serialied soap request including http header to the plugin data. The sending happens actually in frecv function. */ static int soap_ios_send( struct soap *soap, const char *buf, size_t len) { struct soap_ios_data *data = (struct soap_ios_data*)soap_lookup_plugin(soap,soap_ios_id); GSoapiOSURLData *url_data = data->url_data; [url_data.http_req_msg appendBytes:buf length: len]; return len > 0 ? SOAP_OK : SOAP_EOF; } /** @fn size_t soap_ios_recv( struct soap *soap, char *buf, size_t len) @brief Sends soap request, buffers soap response and serialize the response @param soap The soap context @param[out] buf The buffer for the received data @param[in] len The number of bytes received @return The number of bytes received Note: This recv function sends a synchronous soap request through NSURLRequest, receives soap response, serializes response. */ static size_t soap_ios_recv( struct soap *soap, char *buf, size_t len) { struct soap_ios_data *data = (struct soap_ios_data*)soap_lookup_plugin(soap,soap_ios_id); GSoapiOSURLData *url_data = data->url_data; // Handle HTTP basic authentication if present if (url_data.user_name && url_data.password) { NSURLCredential *credential = [NSURLCredential credentialWithUser:url_data.user_name password:url_data.password persistence:NSURLCredentialPersistenceForSession]; NSURLProtectionSpace * protectionSpace = [[NSURLProtectionSpace alloc] initWithHost:url_data.host port:url_data.port protocol:@"http" realm:nil authenticationMethod:nil]; [[NSURLCredentialStorage sharedCredentialStorage] setDefaultCredential:credential forProtectionSpace:protectionSpace]; [protectionSpace release]; } // -------- End of auhentication handling --------- // Execute once: sending the request and receiving response // Send request through NSURLRequest sendSynchronousRequest // and receive response if(url_data.request_sent == false) { [url_data setRequest_sent:true]; //int msg_len = [url_data.http_req_msg length]; NSRange range = NSMakeRange([url_data.http_req_msg length] - url_data.req_content_length, url_data.req_content_length); url_data.soap_req_msg = [url_data.http_req_msg subdataWithRange:range]; NSURL *url = [NSURL URLWithString:url_data.endpoint]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:(NSURLRequestCachePolicy)url_data.cache_policy timeoutInterval:url_data.timeout_interval]; [request addValue:url_data.host forHTTPHeaderField:@"HOST"]; [request addValue:url_data.soap_action forHTTPHeaderField:@"SOAPACTION"]; [request addValue:url_data.content_type forHTTPHeaderField:@"Content-Type"]; [request setHTTPMethod:url_data.http_method]; NSString *conten_length = [NSString stringWithFormat:@"%d", [url_data.soap_req_msg length]]; [request addValue:conten_length forHTTPHeaderField:@"Content-Length"]; [request setHTTPBody:url_data.soap_req_msg]; NSHTTPURLResponse *response = nil; NSError *error = nil; url_data.soap_res_msg = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; // Error handling if (error) { DLog(@"ERROR:<%@>\n", [error localizedDescription]); //const char *fault_string = [[error localizedDescription] UTF8String]; soap_receiver_fault(soap, [[error localizedDescription] UTF8String], ""); } } // may execute multiple times depending on the buffer size and response length if(url_data.request_sent) { size_t res_len = [url_data.soap_res_msg length]; // response length if (len + url_data.received_length > res_len) { // Adjustment len len = res_len - url_data.received_length; //cout << "len = " << len << endl; } const char *res_msg = (const char *)[url_data.soap_res_msg bytes]; memcpy(buf, res_msg + url_data.received_length, len); url_data.received_length += len; } return url_data.request_sent ? len : 0; } /** @fn void soap_ios_setcachepolicy(struct soap *soap, unsigned int policy) @brief Sets cache policy The constants used to specify interaction with the cached responses are: enum { NSURLRequestUseProtocolCachePolicy = 0, NSURLRequestReloadIgnoringLocalCacheData = 1, NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData, NSURLRequestReturnCacheDataElseLoad = 2, NSURLRequestReturnCacheDataDontLoad = 3, NSURLRequestReloadIgnoringLocalAndRemoteCacheData =4, NSURLRequestReloadRevalidatingCacheData = 5 }; @param soap The soap context @param[in] policy The policy to be specified for he request */ void soap_ios_setcachepolicy(struct soap *soap, unsigned int policy) { struct soap_ios_data *data = (struct soap_ios_data *)soap_lookup_plugin(soap, soap_ios_id); data->url_data.cache_policy = policy; } /** @fn soap_ios_settimeoutinterval(struct soap *soap, double seconds) @brief Sets timeout interval @param soap The soap context @param[in] seconds The value for the timeout interval to be specifed (in seconds) */ void soap_ios_settimeoutinterval(struct soap *soap, double seconds) { struct soap_ios_data *data = (struct soap_ios_data *)soap_lookup_plugin(soap, soap_ios_id); data->url_data.timeout_interval = seconds; } // ----------------------------------------------------------------------------- // END of C plugin implementation // ----------------------------------------------------------------------------- gsoap-2.8.28/gsoap/ios_plugin/examples/0000755000175000017500000000000012653650146017373 5ustar ellertellertgsoap-2.8.28/gsoap/ios_plugin/examples/Calc/0000744000175000017500000000000012654077574020244 5ustar ellertellertgsoap-2.8.28/gsoap/ios_plugin/examples/Calc/CalcViewController.xib0000644000175000017500000006177312653650146024520 0ustar ellertellert 800 10K549 762 1038.36 461.00 com.apple.InterfaceBuilder.IBCocoaTouchPlugin 87 YES YES com.apple.InterfaceBuilder.IBCocoaTouchPlugin YES YES YES YES IBFilesOwner IBCocoaTouchFramework IBFirstResponder IBCocoaTouchFramework 274 YES 319 {{12, 15}, {288, 44}} NO YES 7 NO IBCocoaTouchFramework A Simple Calculator Helvetica-Bold 24 16 1 MCAwIDAAA 1 10 1 319 {{20, 150}, {280, 35}} NO IBCocoaTouchFramework 0 0 Helvetica-Bold 15 16 1 = 3 MQA 1 MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA 3 MC41AA 303 {{20, 86}, {114, 31}} NO YES IBCocoaTouchFramework 0 3 3 MAA 2 2 YES 17 IBCocoaTouchFramework 303 {{195, 86}, {105, 31}} NO YES IBCocoaTouchFramework 0 3 3 MAA YES 17 IBCocoaTouchFramework 319 {{142, 91}, {42, 21}} NO YES 7 NO IBCocoaTouchFramework + Helvetica-Bold 17 16 1 10 1 {320, 460} 3 MC43NQA NO IBCocoaTouchFramework YES view 7 buttonPressed 7 10 op1 14 op2 15 YES 0 -1 File's Owner -2 6 YES 8 9 11 12 13 YES YES -1.CustomClassName -2.CustomClassName 11.IBPluginDependency 12.IBPluginDependency 13.IBPluginDependency 6.IBEditorWindowLastContentRect 6.IBPluginDependency 8.IBPluginDependency 9.IBPluginDependency YES CalcViewController UIResponder com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin {{239, 376}, {320, 480}} com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin YES YES YES YES 15 YES CalcViewController UIViewController buttonPressed id YES YES op1 op2 YES UITextField UITextField IBProjectSource Classes/CalcViewController.h YES NSObject IBFrameworkSource Foundation.framework/Headers/NSError.h NSObject IBFrameworkSource Foundation.framework/Headers/NSFileManager.h NSObject IBFrameworkSource Foundation.framework/Headers/NSKeyValueCoding.h NSObject IBFrameworkSource Foundation.framework/Headers/NSKeyValueObserving.h NSObject IBFrameworkSource Foundation.framework/Headers/NSKeyedArchiver.h NSObject IBFrameworkSource Foundation.framework/Headers/NSNetServices.h NSObject IBFrameworkSource Foundation.framework/Headers/NSObject.h NSObject IBFrameworkSource Foundation.framework/Headers/NSPort.h NSObject IBFrameworkSource Foundation.framework/Headers/NSRunLoop.h NSObject IBFrameworkSource Foundation.framework/Headers/NSStream.h NSObject IBFrameworkSource Foundation.framework/Headers/NSThread.h NSObject IBFrameworkSource Foundation.framework/Headers/NSURL.h NSObject IBFrameworkSource Foundation.framework/Headers/NSURLConnection.h NSObject IBFrameworkSource Foundation.framework/Headers/NSXMLParser.h NSObject IBFrameworkSource UIKit.framework/Headers/UIAccessibility.h NSObject IBFrameworkSource UIKit.framework/Headers/UINibLoading.h NSObject IBFrameworkSource UIKit.framework/Headers/UIResponder.h UIButton UIControl IBFrameworkSource UIKit.framework/Headers/UIButton.h UIControl UIView IBFrameworkSource UIKit.framework/Headers/UIControl.h UILabel UIView IBFrameworkSource UIKit.framework/Headers/UILabel.h UIResponder NSObject UISearchBar UIView IBFrameworkSource UIKit.framework/Headers/UISearchBar.h UISearchDisplayController NSObject IBFrameworkSource UIKit.framework/Headers/UISearchDisplayController.h UITextField UIControl IBFrameworkSource UIKit.framework/Headers/UITextField.h UIView UIView UIResponder IBFrameworkSource UIKit.framework/Headers/UIView.h UIViewController IBFrameworkSource UIKit.framework/Headers/UINavigationController.h UIViewController IBFrameworkSource UIKit.framework/Headers/UITabBarController.h UIViewController UIResponder IBFrameworkSource UIKit.framework/Headers/UIViewController.h 0 IBCocoaTouchFramework com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 YES Calc.xcodeproj 3 87 gsoap-2.8.28/gsoap/ios_plugin/examples/Calc/MainWindow.xib0000644000175000017500000002305312653650146023020 0ustar ellertellert 800 10D540 760 1038.29 460.00 com.apple.InterfaceBuilder.IBCocoaTouchPlugin 81 YES YES com.apple.InterfaceBuilder.IBCocoaTouchPlugin YES YES YES YES IBFilesOwner IBCocoaTouchFramework IBFirstResponder IBCocoaTouchFramework IBCocoaTouchFramework CalcViewController IBCocoaTouchFramework 292 {320, 480} 1 MSAxIDEAA NO NO IBCocoaTouchFramework YES YES delegate 4 viewController 11 window 14 YES 0 -1 File's Owner 3 Calc App Delegate -2 10 12 YES YES -1.CustomClassName -2.CustomClassName 10.CustomClassName 10.IBEditorWindowLastContentRect 10.IBPluginDependency 12.IBEditorWindowLastContentRect 12.IBPluginDependency 3.CustomClassName 3.IBPluginDependency YES UIApplication UIResponder CalcViewController {{234, 376}, {320, 480}} com.apple.InterfaceBuilder.IBCocoaTouchPlugin {{525, 346}, {320, 480}} com.apple.InterfaceBuilder.IBCocoaTouchPlugin CalcAppDelegate com.apple.InterfaceBuilder.IBCocoaTouchPlugin YES YES YES YES 14 YES CalcAppDelegate NSObject YES YES viewController window YES CalcViewController UIWindow IBProjectSource Classes/CalcAppDelegate.h CalcAppDelegate NSObject IBUserSource CalcViewController UIViewController IBProjectSource Classes/CalcViewController.h 0 IBCocoaTouchFramework com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 YES Calc.xcodeproj 3 81 gsoap-2.8.28/gsoap/ios_plugin/examples/Calc/Calc_Prefix.pch0000644000175000017500000000050012653650146023103 0ustar ellertellert// // Prefix header for all source files of the 'Calc' target in the 'Calc' project // #define DEBUG #ifdef DEBUG #define DLog(...) NSLog(__VA_ARGS__) #else #define DLog(...) /* empty*/ #endif #define ALog(...) NSLog(__VA_ARGS_) #ifdef __OBJC__ #import #import #endif gsoap-2.8.28/gsoap/ios_plugin/examples/Calc/Calc.xcodeproj/0000744000175000017500000000000012653650146023071 5ustar ellertellertgsoap-2.8.28/gsoap/ios_plugin/examples/Calc/Calc.xcodeproj/wzhang.pbxuser0000644000175000017500000001705112653650146026007 0ustar ellertellert// !$*UTF8*$! { 1D3623240D0F684500981E51 /* CalcAppDelegate.h */ = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {671, 305}}"; sepNavSelRange = "{0, 0}"; sepNavVisRange = "{0, 458}"; }; }; 1D3623250D0F684500981E51 /* CalcAppDelegate.m */ = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {810, 468}}"; sepNavSelRange = "{0, 0}"; sepNavVisRange = "{136, 512}"; }; }; 1D6058900D05DD3D006BFB54 /* Calc */ = { activeExec = 0; executables = ( F582AF45156757D400F727AA /* Calc */, ); }; 28D7ACF60DDB3853001CB0EB /* CalcViewController.h */ = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {766, 682}}"; sepNavSelRange = "{431, 0}"; sepNavVisRange = "{0, 431}"; sepNavWindowFrame = "{{15, 68}, {841, 810}}"; }; }; 28D7ACF70DDB3853001CB0EB /* CalcViewController.m */ = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {671, 1651}}"; sepNavSelRange = "{378, 1}"; sepNavVisRange = "{1122, 896}"; sepNavWindowFrame = "{{15, 69}, {841, 809}}"; }; }; 29B97313FDCFA39411CA2CEA /* Project object */ = { activeBuildConfigurationName = Debug; activeExecutable = F582AF45156757D400F727AA /* Calc */; activeTarget = 1D6058900D05DD3D006BFB54 /* Calc */; addToTargets = ( 1D6058900D05DD3D006BFB54 /* Calc */, ); codeSenseManager = F582AF64156757EC00F727AA /* Code sense */; executables = ( F582AF45156757D400F727AA /* Calc */, ); perUserDictionary = { PBXConfiguration.PBXFileTableDataSource3.PBXFileTableDataSource = { PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID; PBXFileTableDataSourceColumnWidthsKey = ( 20, 493, 20, 48, 43, 43, 20, ); PBXFileTableDataSourceColumnsKey = ( PBXFileDataSource_FiletypeID, PBXFileDataSource_Filename_ColumnID, PBXFileDataSource_Built_ColumnID, PBXFileDataSource_ObjectSize_ColumnID, PBXFileDataSource_Errors_ColumnID, PBXFileDataSource_Warnings_ColumnID, PBXFileDataSource_Target_ColumnID, ); }; PBXPerProjectTemplateStateSaveDate = 360919863; PBXWorkspaceStateSaveDate = 360919863; }; perUserProjectItems = { F559501B1581C6B0007A5807 /* PBXTextBookmark */ = F559501B1581C6B0007A5807 /* PBXTextBookmark */; F55950281581CB78007A5807 /* PBXTextBookmark */ = F55950281581CB78007A5807 /* PBXTextBookmark */; F559502D1581CCCC007A5807 /* PBXTextBookmark */ = F559502D1581CCCC007A5807 /* PBXTextBookmark */; F57B1F1F1581DB570011D9A9 /* PBXTextBookmark */ = F57B1F1F1581DB570011D9A9 /* PBXTextBookmark */; F57B1F211581DB570011D9A9 /* PBXTextBookmark */ = F57B1F211581DB570011D9A9 /* PBXTextBookmark */; F5AF229A1583334B00C156B5 /* PBXTextBookmark */ = F5AF229A1583334B00C156B5 /* PBXTextBookmark */; }; sourceControlManager = F582AF63156757EC00F727AA /* Source Control */; userBuildSettings = { }; }; 29B97316FDCFA39411CA2CEA /* main.m */ = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {671, 295}}"; sepNavSelRange = "{150, 0}"; sepNavVisRange = "{0, 386}"; sepNavWindowFrame = "{{15, 69}, {841, 809}}"; }; }; 32CA4F630368D1EE00C91783 /* Calc_Prefix.pch */ = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {671, 357}}"; sepNavSelRange = "{0, 0}"; sepNavVisRange = "{0, 320}"; }; }; F559501B1581C6B0007A5807 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = F5A8ABCC1581BFC700A1CD49 /* gsoapios.m */; name = "gsoapios.m: 283"; rLen = 0; rLoc = 11378; rType = 0; vrLen = 879; vrLoc = 10786; }; F55950281581CB78007A5807 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = 28D7ACF60DDB3853001CB0EB /* CalcViewController.h */; name = "CalcViewController.h: 15"; rLen = 0; rLoc = 280; rType = 0; vrLen = 431; vrLoc = 0; }; F559502D1581CCCC007A5807 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = 29B97316FDCFA39411CA2CEA /* main.m */; name = "main.m: 10"; rLen = 0; rLoc = 150; rType = 0; vrLen = 386; vrLoc = 0; }; F55950341581CE23007A5807 /* gsoapios.h */ = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {766, 2522}}"; sepNavSelRange = "{0, 0}"; sepNavVisRange = "{0, 2339}"; }; }; F55950361581CE6E007A5807 /* gsoapios.m */ = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {789, 11440}}"; sepNavSelRange = "{858, 0}"; sepNavVisRange = "{14992, 1778}"; }; }; F57B1F1F1581DB570011D9A9 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = 28D7ACF70DDB3853001CB0EB /* CalcViewController.m */; name = "CalcViewController.m: 20"; rLen = 1; rLoc = 378; rType = 0; vrLen = 896; vrLoc = 1122; }; F57B1F211581DB570011D9A9 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = F582AFA71567618200F727AA /* soapClient.c */; name = "soapClient.c: 23"; rLen = 152; rLoc = 608; rType = 0; vrLen = 794; vrLoc = 56; }; F582AF45156757D400F727AA /* Calc */ = { isa = PBXExecutable; activeArgIndices = ( ); argumentStrings = ( ); autoAttachOnCrash = 1; breakpointsEnabled = 0; configStateDict = { }; customDataFormattersEnabled = 1; dataTipCustomDataFormattersEnabled = 1; dataTipShowTypeColumn = 1; dataTipSortType = 0; debuggerPlugin = GDBDebugging; disassemblyDisplayState = 0; dylibVariantSuffix = ""; enableDebugStr = 1; environmentEntries = ( ); executableSystemSymbolLevel = 0; executableUserSymbolLevel = 0; libgmallocEnabled = 0; name = Calc; showTypeColumn = 0; sourceDirectories = ( ); }; F582AF63156757EC00F727AA /* Source Control */ = { isa = PBXSourceControlManager; fallbackIsa = XCSourceControlManager; isSCMEnabled = 0; scmConfiguration = { repositoryNamesForRoots = { "" = ""; }; }; }; F582AF64156757EC00F727AA /* Code sense */ = { isa = PBXCodeSenseManager; indexTemplatePath = ""; }; F582AFA51567618200F727AA /* calc.nsmap */ = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {733, 195}}"; sepNavSelRange = "{27, 0}"; sepNavVisRange = "{0, 301}"; }; }; F582AFA61567618200F727AA /* soapC.c */ = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {551, 27599}}"; sepNavSelRange = "{0, 0}"; sepNavVisRange = "{0, 379}"; }; }; F582AFA71567618200F727AA /* soapClient.c */ = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {1069, 4173}}"; sepNavSelRange = "{608, 152}"; sepNavVisRange = "{57, 793}"; sepNavWindowFrame = "{{15, 65}, {841, 813}}"; }; }; F582AFA91567618200F727AA /* soapH.h */ = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {551, 7423}}"; sepNavSelRange = "{0, 0}"; sepNavVisRange = "{0, 379}"; }; }; F582AFAA1567618200F727AA /* soapStub.h */ = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {671, 3900}}"; sepNavSelRange = "{0, 0}"; sepNavVisRange = "{0, 1039}"; }; }; F582AFAB1567618200F727AA /* stdsoap2.c */ = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {1559, 213083}}"; sepNavSelRange = "{402, 0}"; sepNavVisRange = "{469832, 1659}"; sepNavWindowFrame = "{{15, 65}, {841, 813}}"; }; }; F582AFAC1567618200F727AA /* stdsoap2.h */ = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {572, 33852}}"; sepNavSelRange = "{0, 0}"; sepNavVisRange = "{0, 304}"; }; }; F5A8ABCC1581BFC700A1CD49 /* gsoapios.m */ = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = gsoapios.m; path = /Users/wzhang/Research/Projects/gsoap4iphone/gsoap_ios_plugin/gsoapios.m; sourceTree = ""; }; F5AF229A1583334B00C156B5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = F582AFA71567618200F727AA /* soapClient.c */; name = "soapClient.c: 23"; rLen = 152; rLoc = 608; rType = 0; vrLen = 793; vrLoc = 57; }; } gsoap-2.8.28/gsoap/ios_plugin/examples/Calc/Calc.xcodeproj/project.pbxproj0000744000175000017500000003245712653650146026163 0ustar ellertellert// !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 45; objects = { /* Begin PBXBuildFile section */ 1D3623260D0F684500981E51 /* CalcAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D3623250D0F684500981E51 /* CalcAppDelegate.m */; }; 1D60589B0D05DD56006BFB54 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; }; 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; }; 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */; }; 288765A50DF7441C002DB57D /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 288765A40DF7441C002DB57D /* CoreGraphics.framework */; }; 2899E5220DE3E06400AC0155 /* CalcViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2899E5210DE3E06400AC0155 /* CalcViewController.xib */; }; 28AD733F0D9D9553002E5188 /* MainWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 28AD733E0D9D9553002E5188 /* MainWindow.xib */; }; 28D7ACF80DDB3853001CB0EB /* CalcViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 28D7ACF70DDB3853001CB0EB /* CalcViewController.m */; }; F55950371581CE6E007A5807 /* gsoapios.m in Sources */ = {isa = PBXBuildFile; fileRef = F55950361581CE6E007A5807 /* gsoapios.m */; }; F582AFAD1567618200F727AA /* calc.nsmap in Resources */ = {isa = PBXBuildFile; fileRef = F582AFA51567618200F727AA /* calc.nsmap */; }; F582AFAE1567618200F727AA /* soapC.c in Sources */ = {isa = PBXBuildFile; fileRef = F582AFA61567618200F727AA /* soapC.c */; }; F582AFAF1567618200F727AA /* soapClient.c in Sources */ = {isa = PBXBuildFile; fileRef = F582AFA71567618200F727AA /* soapClient.c */; }; F582AFB11567618200F727AA /* stdsoap2.c in Sources */ = {isa = PBXBuildFile; fileRef = F582AFAB1567618200F727AA /* stdsoap2.c */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ 1D30AB110D05D00D00671497 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 1D3623240D0F684500981E51 /* CalcAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CalcAppDelegate.h; sourceTree = ""; }; 1D3623250D0F684500981E51 /* CalcAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CalcAppDelegate.m; sourceTree = ""; }; 1D6058910D05DD3D006BFB54 /* Calc.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Calc.app; sourceTree = BUILT_PRODUCTS_DIR; }; 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 288765A40DF7441C002DB57D /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 2899E5210DE3E06400AC0155 /* CalcViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = CalcViewController.xib; sourceTree = ""; }; 28AD733E0D9D9553002E5188 /* MainWindow.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MainWindow.xib; sourceTree = ""; }; 28D7ACF60DDB3853001CB0EB /* CalcViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CalcViewController.h; sourceTree = ""; }; 28D7ACF70DDB3853001CB0EB /* CalcViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CalcViewController.m; sourceTree = ""; }; 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 32CA4F630368D1EE00C91783 /* Calc_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Calc_Prefix.pch; sourceTree = ""; }; 8D1107310486CEB800E47090 /* Calc-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "Calc-Info.plist"; plistStructureDefinitionIdentifier = "com.apple.xcode.plist.structure-definition.iphone.info-plist"; sourceTree = ""; }; F55950341581CE23007A5807 /* gsoapios.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gsoapios.h; sourceTree = ""; }; F55950361581CE6E007A5807 /* gsoapios.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = gsoapios.m; sourceTree = ""; }; F582AFA51567618200F727AA /* calc.nsmap */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = calc.nsmap; sourceTree = ""; }; F582AFA61567618200F727AA /* soapC.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = soapC.c; sourceTree = ""; }; F582AFA71567618200F727AA /* soapClient.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = soapClient.c; sourceTree = ""; }; F582AFA91567618200F727AA /* soapH.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = soapH.h; sourceTree = ""; }; F582AFAA1567618200F727AA /* soapStub.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = soapStub.h; sourceTree = ""; }; F582AFAB1567618200F727AA /* stdsoap2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = stdsoap2.c; sourceTree = ""; }; F582AFAC1567618200F727AA /* stdsoap2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = stdsoap2.h; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 1D60588F0D05DD3D006BFB54 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */, 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */, 288765A50DF7441C002DB57D /* CoreGraphics.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 080E96DDFE201D6D7F000001 /* Classes */ = { isa = PBXGroup; children = ( F55950361581CE6E007A5807 /* gsoapios.m */, F55950341581CE23007A5807 /* gsoapios.h */, F582AFA51567618200F727AA /* calc.nsmap */, F582AFA61567618200F727AA /* soapC.c */, F582AFA71567618200F727AA /* soapClient.c */, F582AFA91567618200F727AA /* soapH.h */, F582AFAA1567618200F727AA /* soapStub.h */, F582AFAB1567618200F727AA /* stdsoap2.c */, F582AFAC1567618200F727AA /* stdsoap2.h */, 1D3623240D0F684500981E51 /* CalcAppDelegate.h */, 1D3623250D0F684500981E51 /* CalcAppDelegate.m */, 28D7ACF60DDB3853001CB0EB /* CalcViewController.h */, 28D7ACF70DDB3853001CB0EB /* CalcViewController.m */, ); path = Classes; sourceTree = ""; }; 19C28FACFE9D520D11CA2CBB /* Products */ = { isa = PBXGroup; children = ( 1D6058910D05DD3D006BFB54 /* Calc.app */, ); name = Products; sourceTree = ""; }; 29B97314FDCFA39411CA2CEA /* CustomTemplate */ = { isa = PBXGroup; children = ( 080E96DDFE201D6D7F000001 /* Classes */, 29B97315FDCFA39411CA2CEA /* Other Sources */, 29B97317FDCFA39411CA2CEA /* Resources */, 29B97323FDCFA39411CA2CEA /* Frameworks */, 19C28FACFE9D520D11CA2CBB /* Products */, ); name = CustomTemplate; sourceTree = ""; }; 29B97315FDCFA39411CA2CEA /* Other Sources */ = { isa = PBXGroup; children = ( 32CA4F630368D1EE00C91783 /* Calc_Prefix.pch */, 29B97316FDCFA39411CA2CEA /* main.m */, ); name = "Other Sources"; sourceTree = ""; }; 29B97317FDCFA39411CA2CEA /* Resources */ = { isa = PBXGroup; children = ( 2899E5210DE3E06400AC0155 /* CalcViewController.xib */, 28AD733E0D9D9553002E5188 /* MainWindow.xib */, 8D1107310486CEB800E47090 /* Calc-Info.plist */, ); name = Resources; sourceTree = ""; }; 29B97323FDCFA39411CA2CEA /* Frameworks */ = { isa = PBXGroup; children = ( 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */, 1D30AB110D05D00D00671497 /* Foundation.framework */, 288765A40DF7441C002DB57D /* CoreGraphics.framework */, ); name = Frameworks; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ 1D6058900D05DD3D006BFB54 /* Calc */ = { isa = PBXNativeTarget; buildConfigurationList = 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "Calc" */; buildPhases = ( 1D60588D0D05DD3D006BFB54 /* Resources */, 1D60588E0D05DD3D006BFB54 /* Sources */, 1D60588F0D05DD3D006BFB54 /* Frameworks */, ); buildRules = ( ); dependencies = ( ); name = Calc; productName = Calc; productReference = 1D6058910D05DD3D006BFB54 /* Calc.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 29B97313FDCFA39411CA2CEA /* Project object */ = { isa = PBXProject; buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "Calc" */; compatibilityVersion = "Xcode 3.1"; hasScannedForEncodings = 1; mainGroup = 29B97314FDCFA39411CA2CEA /* CustomTemplate */; projectDirPath = ""; projectRoot = ""; targets = ( 1D6058900D05DD3D006BFB54 /* Calc */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ 1D60588D0D05DD3D006BFB54 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( 28AD733F0D9D9553002E5188 /* MainWindow.xib in Resources */, 2899E5220DE3E06400AC0155 /* CalcViewController.xib in Resources */, F582AFAD1567618200F727AA /* calc.nsmap in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ 1D60588E0D05DD3D006BFB54 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 1D60589B0D05DD56006BFB54 /* main.m in Sources */, 1D3623260D0F684500981E51 /* CalcAppDelegate.m in Sources */, 28D7ACF80DDB3853001CB0EB /* CalcViewController.m in Sources */, F582AFAE1567618200F727AA /* soapC.c in Sources */, F582AFAF1567618200F727AA /* soapClient.c in Sources */, F582AFB11567618200F727AA /* stdsoap2.c in Sources */, F55950371581CE6E007A5807 /* gsoapios.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin XCBuildConfiguration section */ 1D6058940D05DD3E006BFB54 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; COPY_PHASE_STRIP = NO; GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = Calc_Prefix.pch; INFOPLIST_FILE = "Calc-Info.plist"; PRODUCT_NAME = Calc; }; name = Debug; }; 1D6058950D05DD3E006BFB54 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; COPY_PHASE_STRIP = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = Calc_Prefix.pch; INFOPLIST_FILE = "Calc-Info.plist"; PRODUCT_NAME = Calc; VALIDATE_PRODUCT = YES; }; name = Release; }; C01FCF4F08A954540054247B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = "$(ARCHS_STANDARD_32_BIT)"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; GCC_C_LANGUAGE_STANDARD = c99; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; PREBINDING = NO; SDKROOT = iphoneos3.1.3; }; name = Debug; }; C01FCF5008A954540054247B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = "$(ARCHS_STANDARD_32_BIT)"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; GCC_C_LANGUAGE_STANDARD = c99; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; PREBINDING = NO; SDKROOT = iphoneos3.1.3; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "Calc" */ = { isa = XCConfigurationList; buildConfigurations = ( 1D6058940D05DD3E006BFB54 /* Debug */, 1D6058950D05DD3E006BFB54 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; C01FCF4E08A954540054247B /* Build configuration list for PBXProject "Calc" */ = { isa = XCConfigurationList; buildConfigurations = ( C01FCF4F08A954540054247B /* Debug */, C01FCF5008A954540054247B /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; } gsoap-2.8.28/gsoap/ios_plugin/examples/Calc/Calc.xcodeproj/wzhang.mode1v30000644000175000017500000011650512653650146025601 0ustar ellertellert ActivePerspectiveName Project AllowedModules BundleLoadPath MaxInstances n Module PBXSmartGroupTreeModule Name Groups and Files Outline View BundleLoadPath MaxInstances n Module PBXNavigatorGroup Name Editor BundleLoadPath MaxInstances n Module XCTaskListModule Name Task List BundleLoadPath MaxInstances n Module XCDetailModule Name File and Smart Group Detail Viewer BundleLoadPath MaxInstances 1 Module PBXBuildResultsModule Name Detailed Build Results Viewer BundleLoadPath MaxInstances 1 Module PBXProjectFindModule Name Project Batch Find Tool BundleLoadPath MaxInstances n Module XCProjectFormatConflictsModule Name Project Format Conflicts List BundleLoadPath MaxInstances n Module PBXBookmarksModule Name Bookmarks Tool BundleLoadPath MaxInstances n Module PBXClassBrowserModule Name Class Browser BundleLoadPath MaxInstances n Module PBXCVSModule Name Source Code Control Tool BundleLoadPath MaxInstances n Module PBXDebugBreakpointsModule Name Debug Breakpoints Tool BundleLoadPath MaxInstances n Module XCDockableInspector Name Inspector BundleLoadPath MaxInstances n Module PBXOpenQuicklyModule Name Open Quickly Tool BundleLoadPath MaxInstances 1 Module PBXDebugSessionModule Name Debugger BundleLoadPath MaxInstances 1 Module PBXDebugCLIModule Name Debug Console BundleLoadPath MaxInstances n Module XCSnapshotModule Name Snapshots Tool BundlePath /Developer/Library/PrivateFrameworks/DevToolsInterface.framework/Resources Description DefaultDescriptionKey DockingSystemVisible Extension mode1v3 FavBarConfig PBXProjectModuleGUID F582AF59156757EC00F727AA XCBarModuleItemNames XCBarModuleItems FirstTimeWindowDisplayed Identifier com.apple.perspectives.project.mode1v3 MajorVersion 33 MinorVersion 0 Name Default Notifications OpenEditors PerspectiveWidths -1 -1 Perspectives ChosenToolbarItems active-combo-popup action NSToolbarFlexibleSpaceItem debugger-enable-breakpoints build-and-go com.apple.ide.PBXToolbarStopButton get-info servicesModuleSnapshots takeSnapshot NSToolbarFlexibleSpaceItem com.apple.pbx.toolbar.searchfield ControllerClassBaseName IconName WindowOfProjectWithEditor Identifier perspective.project IsVertical Layout ContentConfiguration PBXBottomSmartGroupGIDs 1C37FBAC04509CD000000102 1C37FAAC04509CD000000102 1C37FABC05509CD000000102 1C37FABC05539CD112110102 E2644B35053B69B200211256 1C37FABC04509CD000100104 1CC0EA4004350EF90044410B 1CC0EA4004350EF90041110B PBXProjectModuleGUID 1CE0B1FE06471DED0097A5F4 PBXProjectModuleLabel Files PBXProjectStructureProvided yes PBXSmartGroupTreeModuleColumnData PBXSmartGroupTreeModuleColumnWidthsKey 186 PBXSmartGroupTreeModuleColumnsKey_v4 MainColumn PBXSmartGroupTreeModuleOutlineStateKey_v7 PBXSmartGroupTreeModuleOutlineStateExpansionKey 29B97314FDCFA39411CA2CEA 1C37FABC05509CD000000102 PBXSmartGroupTreeModuleOutlineStateSelectionKey 1 0 PBXSmartGroupTreeModuleOutlineStateVisibleRectKey {{0, 0}, {186, 695}} PBXTopSmartGroupGIDs XCIncludePerspectivesSwitch XCSharingToken com.apple.Xcode.GFSharingToken GeometryConfiguration Frame {{0, 0}, {203, 713}} GroupTreeTableConfiguration MainColumn 186 RubberWindowFrame 80 124 940 754 0 0 1440 878 Module PBXSmartGroupTreeModule Proportion 203pt Dock ContentConfiguration PBXProjectModuleGUID 1CE0B20306471E060097A5F4 PBXProjectModuleLabel soapClient.c PBXSplitModuleInNavigatorKey Split0 PBXProjectModuleGUID 1CE0B20406471E060097A5F4 PBXProjectModuleLabel soapClient.c _historyCapacity 0 bookmark F5AF229A1583334B00C156B5 history F559501B1581C6B0007A5807 F55950281581CB78007A5807 F559502D1581CCCC007A5807 F57B1F1F1581DB570011D9A9 F57B1F211581DB570011D9A9 SplitCount 1 StatusBarVisibility GeometryConfiguration Frame {{0, 0}, {732, 317}} RubberWindowFrame 80 124 940 754 0 0 1440 878 Module PBXNavigatorGroup Proportion 317pt BecomeActive ContentConfiguration PBXProjectModuleGUID 1CE0B20506471E060097A5F4 PBXProjectModuleLabel Detail GeometryConfiguration Frame {{0, 322}, {732, 391}} RubberWindowFrame 80 124 940 754 0 0 1440 878 Module XCDetailModule Proportion 391pt Proportion 732pt Name Project ServiceClasses XCModuleDock PBXSmartGroupTreeModule XCModuleDock PBXNavigatorGroup XCDetailModule TableOfContents F5AF22901583333D00C156B5 1CE0B1FE06471DED0097A5F4 F5AF22911583333D00C156B5 1CE0B20306471E060097A5F4 1CE0B20506471E060097A5F4 ToolbarConfigUserDefaultsMinorVersion 2 ToolbarConfiguration xcode.toolbar.config.defaultV3 ControllerClassBaseName IconName WindowOfProject Identifier perspective.morph IsVertical 0 Layout BecomeActive 1 ContentConfiguration PBXBottomSmartGroupGIDs 1C37FBAC04509CD000000102 1C37FAAC04509CD000000102 1C08E77C0454961000C914BD 1C37FABC05509CD000000102 1C37FABC05539CD112110102 E2644B35053B69B200211256 1C37FABC04509CD000100104 1CC0EA4004350EF90044410B 1CC0EA4004350EF90041110B PBXProjectModuleGUID 11E0B1FE06471DED0097A5F4 PBXProjectModuleLabel Files PBXProjectStructureProvided yes PBXSmartGroupTreeModuleColumnData PBXSmartGroupTreeModuleColumnWidthsKey 186 PBXSmartGroupTreeModuleColumnsKey_v4 MainColumn PBXSmartGroupTreeModuleOutlineStateKey_v7 PBXSmartGroupTreeModuleOutlineStateExpansionKey 29B97314FDCFA39411CA2CEA 1C37FABC05509CD000000102 PBXSmartGroupTreeModuleOutlineStateSelectionKey 0 PBXSmartGroupTreeModuleOutlineStateVisibleRectKey {{0, 0}, {186, 337}} PBXTopSmartGroupGIDs XCIncludePerspectivesSwitch 1 XCSharingToken com.apple.Xcode.GFSharingToken GeometryConfiguration Frame {{0, 0}, {203, 355}} GroupTreeTableConfiguration MainColumn 186 RubberWindowFrame 373 269 690 397 0 0 1440 878 Module PBXSmartGroupTreeModule Proportion 100% Name Morph PreferredWidth 300 ServiceClasses XCModuleDock PBXSmartGroupTreeModule TableOfContents 11E0B1FE06471DED0097A5F4 ToolbarConfiguration xcode.toolbar.config.default.shortV3 PerspectivesBarVisible ShelfIsVisible SourceDescription file at '/Developer/Library/PrivateFrameworks/DevToolsInterface.framework/Resources/XCPerspectivesSpecificationMode1.xcperspec' StatusbarIsVisible TimeStamp 0.0 ToolbarConfigUserDefaultsMinorVersion 2 ToolbarDisplayMode 1 ToolbarIsVisible ToolbarSizeMode 1 Type Perspectives UpdateMessage The Default Workspace in this version of Xcode now includes support to hide and show the detail view (what has been referred to as the "Metro-Morph" feature). You must discard your current Default Workspace settings and update to the latest Default Workspace in order to gain this feature. Do you wish to update to the latest Workspace defaults for project '%@'? WindowJustification 5 WindowOrderList 1C78EAAD065D492600B07095 1CD10A99069EF8BA00B06720 F582AF5A156757EC00F727AA /Users/wzhang/Research/Projects/ios_plugin/examples/Calc/Calc.xcodeproj WindowString 80 124 940 754 0 0 1440 878 WindowToolsV3 FirstTimeWindowDisplayed Identifier windowTool.build IsVertical Layout Dock ContentConfiguration PBXProjectModuleGUID 1CD0528F0623707200166675 PBXProjectModuleLabel StatusBarVisibility GeometryConfiguration Frame {{0, 0}, {500, 0}} RubberWindowFrame 347 292 500 500 0 0 1440 878 Module PBXNavigatorGroup Proportion 0pt ContentConfiguration PBXProjectModuleGUID XCMainBuildResultsModuleGUID PBXProjectModuleLabel Build Results XCBuildResultsTrigger_Collapse 1021 XCBuildResultsTrigger_Open 1011 GeometryConfiguration Frame {{0, 5}, {500, 454}} RubberWindowFrame 347 292 500 500 0 0 1440 878 Module PBXBuildResultsModule Proportion 454pt Proportion 459pt Name Build Results ServiceClasses PBXBuildResultsModule StatusbarIsVisible TableOfContents F582AF5A156757EC00F727AA F5AF22921583333D00C156B5 1CD0528F0623707200166675 XCMainBuildResultsModuleGUID ToolbarConfiguration xcode.toolbar.config.buildV3 WindowContentMinSize 486 300 WindowString 347 292 500 500 0 0 1440 878 WindowToolGUID F582AF5A156757EC00F727AA WindowToolIsVisible FirstTimeWindowDisplayed Identifier windowTool.debugger IsVertical Layout Dock ContentConfiguration Debugger HorizontalSplitView _collapsingFrameDimension 0.0 _indexOfCollapsedView 0 _percentageOfCollapsedView 0.0 isCollapsed yes sizes {{0, 0}, {316, 203}} {{316, 0}, {378, 203}} VerticalSplitView _collapsingFrameDimension 0.0 _indexOfCollapsedView 0 _percentageOfCollapsedView 0.0 isCollapsed yes sizes {{0, 0}, {694, 203}} {{0, 203}, {694, 178}} LauncherConfigVersion 8 PBXProjectModuleGUID 1C162984064C10D400B95A72 PBXProjectModuleLabel Debug - GLUTExamples (Underwater) GeometryConfiguration DebugConsoleVisible None DebugConsoleWindowFrame {{200, 200}, {500, 300}} DebugSTDIOWindowFrame {{200, 200}, {500, 300}} Frame {{0, 0}, {694, 381}} PBXDebugSessionStackFrameViewKey DebugVariablesTableConfiguration Name 120 Value 85 Summary 148 Frame {{316, 0}, {378, 203}} RubberWindowFrame 404 369 694 422 0 0 1440 878 RubberWindowFrame 404 369 694 422 0 0 1440 878 Module PBXDebugSessionModule Proportion 381pt Proportion 381pt Name Debugger ServiceClasses PBXDebugSessionModule StatusbarIsVisible TableOfContents 1CD10A99069EF8BA00B06720 F5AF22931583333D00C156B5 1C162984064C10D400B95A72 F5AF22941583333D00C156B5 F5AF22951583333D00C156B5 F5AF22961583333D00C156B5 F5AF22971583333D00C156B5 F5AF22981583333D00C156B5 ToolbarConfiguration xcode.toolbar.config.debugV3 WindowString 404 369 694 422 0 0 1440 878 WindowToolGUID 1CD10A99069EF8BA00B06720 WindowToolIsVisible Identifier windowTool.find Layout Dock Dock ContentConfiguration PBXProjectModuleGUID 1CDD528C0622207200134675 PBXProjectModuleLabel <No Editor> PBXSplitModuleInNavigatorKey Split0 PBXProjectModuleGUID 1CD0528D0623707200166675 SplitCount 1 StatusBarVisibility 1 GeometryConfiguration Frame {{0, 0}, {781, 167}} RubberWindowFrame 62 385 781 470 0 0 1440 878 Module PBXNavigatorGroup Proportion 781pt Proportion 50% BecomeActive 1 ContentConfiguration PBXProjectModuleGUID 1CD0528E0623707200166675 PBXProjectModuleLabel Project Find GeometryConfiguration Frame {{8, 0}, {773, 254}} RubberWindowFrame 62 385 781 470 0 0 1440 878 Module PBXProjectFindModule Proportion 50% Proportion 428pt Name Project Find ServiceClasses PBXProjectFindModule StatusbarIsVisible 1 TableOfContents 1C530D57069F1CE1000CFCEE 1C530D58069F1CE1000CFCEE 1C530D59069F1CE1000CFCEE 1CDD528C0622207200134675 1C530D5A069F1CE1000CFCEE 1CE0B1FE06471DED0097A5F4 1CD0528E0623707200166675 WindowString 62 385 781 470 0 0 1440 878 WindowToolGUID 1C530D57069F1CE1000CFCEE WindowToolIsVisible 0 Identifier MENUSEPARATOR FirstTimeWindowDisplayed Identifier windowTool.debuggerConsole IsVertical Layout Dock ContentConfiguration PBXProjectModuleGUID 1C78EAAC065D492600B07095 PBXProjectModuleLabel Debugger Console GeometryConfiguration Frame {{0, 0}, {672, 288}} RubberWindowFrame 270 508 672 329 0 0 1440 878 Module PBXDebugCLIModule Proportion 288pt Proportion 288pt Name Debugger Console ServiceClasses PBXDebugCLIModule StatusbarIsVisible TableOfContents 1C78EAAD065D492600B07095 F5AF22991583333D00C156B5 1C78EAAC065D492600B07095 ToolbarConfiguration xcode.toolbar.config.consoleV3 WindowString 270 508 672 329 0 0 1440 878 WindowToolGUID 1C78EAAD065D492600B07095 WindowToolIsVisible Identifier windowTool.snapshots Layout Dock Module XCSnapshotModule Proportion 100% Proportion 100% Name Snapshots ServiceClasses XCSnapshotModule StatusbarIsVisible Yes ToolbarConfiguration xcode.toolbar.config.snapshots WindowString 315 824 300 550 0 0 1440 878 WindowToolIsVisible Yes Identifier windowTool.scm Layout Dock ContentConfiguration PBXProjectModuleGUID 1C78EAB2065D492600B07095 PBXProjectModuleLabel <No Editor> PBXSplitModuleInNavigatorKey Split0 PBXProjectModuleGUID 1C78EAB3065D492600B07095 SplitCount 1 StatusBarVisibility 1 GeometryConfiguration Frame {{0, 0}, {452, 0}} RubberWindowFrame 743 379 452 308 0 0 1280 1002 Module PBXNavigatorGroup Proportion 0pt BecomeActive 1 ContentConfiguration PBXProjectModuleGUID 1CD052920623707200166675 PBXProjectModuleLabel SCM GeometryConfiguration ConsoleFrame {{0, 259}, {452, 0}} Frame {{0, 7}, {452, 259}} RubberWindowFrame 743 379 452 308 0 0 1280 1002 TableConfiguration Status 30 FileName 199 Path 197.0950012207031 TableFrame {{0, 0}, {452, 250}} Module PBXCVSModule Proportion 262pt Proportion 266pt Name SCM ServiceClasses PBXCVSModule StatusbarIsVisible 1 TableOfContents 1C78EAB4065D492600B07095 1C78EAB5065D492600B07095 1C78EAB2065D492600B07095 1CD052920623707200166675 ToolbarConfiguration xcode.toolbar.config.scm WindowString 743 379 452 308 0 0 1280 1002 Identifier windowTool.breakpoints IsVertical 0 Layout Dock BecomeActive 1 ContentConfiguration PBXBottomSmartGroupGIDs 1C77FABC04509CD000000102 PBXProjectModuleGUID 1CE0B1FE06471DED0097A5F4 PBXProjectModuleLabel Files PBXProjectStructureProvided no PBXSmartGroupTreeModuleColumnData PBXSmartGroupTreeModuleColumnWidthsKey 168 PBXSmartGroupTreeModuleColumnsKey_v4 MainColumn PBXSmartGroupTreeModuleOutlineStateKey_v7 PBXSmartGroupTreeModuleOutlineStateExpansionKey 1C77FABC04509CD000000102 PBXSmartGroupTreeModuleOutlineStateSelectionKey 0 PBXSmartGroupTreeModuleOutlineStateVisibleRectKey {{0, 0}, {168, 350}} PBXTopSmartGroupGIDs XCIncludePerspectivesSwitch 0 GeometryConfiguration Frame {{0, 0}, {185, 368}} GroupTreeTableConfiguration MainColumn 168 RubberWindowFrame 315 424 744 409 0 0 1440 878 Module PBXSmartGroupTreeModule Proportion 185pt ContentConfiguration PBXProjectModuleGUID 1CA1AED706398EBD00589147 PBXProjectModuleLabel Detail GeometryConfiguration Frame {{190, 0}, {554, 368}} RubberWindowFrame 315 424 744 409 0 0 1440 878 Module XCDetailModule Proportion 554pt Proportion 368pt MajorVersion 3 MinorVersion 0 Name Breakpoints ServiceClasses PBXSmartGroupTreeModule XCDetailModule StatusbarIsVisible 1 TableOfContents 1CDDB66807F98D9800BB5817 1CDDB66907F98D9800BB5817 1CE0B1FE06471DED0097A5F4 1CA1AED706398EBD00589147 ToolbarConfiguration xcode.toolbar.config.breakpointsV3 WindowString 315 424 744 409 0 0 1440 878 WindowToolGUID 1CDDB66807F98D9800BB5817 WindowToolIsVisible 1 Identifier windowTool.debugAnimator Layout Dock Module PBXNavigatorGroup Proportion 100% Proportion 100% Name Debug Visualizer ServiceClasses PBXNavigatorGroup StatusbarIsVisible 1 ToolbarConfiguration xcode.toolbar.config.debugAnimatorV3 WindowString 100 100 700 500 0 0 1280 1002 Identifier windowTool.bookmarks Layout Dock Module PBXBookmarksModule Proportion 100% Proportion 100% Name Bookmarks ServiceClasses PBXBookmarksModule StatusbarIsVisible 0 WindowString 538 42 401 187 0 0 1280 1002 Identifier windowTool.projectFormatConflicts Layout Dock Module XCProjectFormatConflictsModule Proportion 100% Proportion 100% Name Project Format Conflicts ServiceClasses XCProjectFormatConflictsModule StatusbarIsVisible 0 WindowContentMinSize 450 300 WindowString 50 850 472 307 0 0 1440 877 Identifier windowTool.classBrowser Layout Dock BecomeActive 1 ContentConfiguration OptionsSetName Hierarchy, all classes PBXProjectModuleGUID 1CA6456E063B45B4001379D8 PBXProjectModuleLabel Class Browser - NSObject GeometryConfiguration ClassesFrame {{0, 0}, {374, 96}} ClassesTreeTableConfiguration PBXClassNameColumnIdentifier 208 PBXClassBookColumnIdentifier 22 Frame {{0, 0}, {630, 331}} MembersFrame {{0, 105}, {374, 395}} MembersTreeTableConfiguration PBXMemberTypeIconColumnIdentifier 22 PBXMemberNameColumnIdentifier 216 PBXMemberTypeColumnIdentifier 97 PBXMemberBookColumnIdentifier 22 PBXModuleWindowStatusBarHidden2 1 RubberWindowFrame 385 179 630 352 0 0 1440 878 Module PBXClassBrowserModule Proportion 332pt Proportion 332pt Name Class Browser ServiceClasses PBXClassBrowserModule StatusbarIsVisible 0 TableOfContents 1C0AD2AF069F1E9B00FABCE6 1C0AD2B0069F1E9B00FABCE6 1CA6456E063B45B4001379D8 ToolbarConfiguration xcode.toolbar.config.classbrowser WindowString 385 179 630 352 0 0 1440 878 WindowToolGUID 1C0AD2AF069F1E9B00FABCE6 WindowToolIsVisible 0 Identifier windowTool.refactoring IncludeInToolsMenu 0 Layout Dock BecomeActive 1 GeometryConfiguration Frame {0, 0}, {500, 335} RubberWindowFrame {0, 0}, {500, 335} Module XCRefactoringModule Proportion 100% Proportion 100% Name Refactoring ServiceClasses XCRefactoringModule WindowString 200 200 500 356 0 0 1920 1200 gsoap-2.8.28/gsoap/ios_plugin/examples/Calc/Calc-Info.plist0000644000175000017500000000161512653650146023050 0ustar ellertellert CFBundleDevelopmentRegion English CFBundleDisplayName ${PRODUCT_NAME} CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIconFile CFBundleIdentifier com.yourcompany.${PRODUCT_NAME:rfc1034identifier} CFBundleInfoDictionaryVersion 6.0 CFBundleName ${PRODUCT_NAME} CFBundlePackageType APPL CFBundleSignature ???? CFBundleVersion 1.0 LSRequiresIPhoneOS NSMainNibFile MainWindow gsoap-2.8.28/gsoap/ios_plugin/examples/Calc/Classes/0000744000175000017500000000000012653650146021630 5ustar ellertellertgsoap-2.8.28/gsoap/ios_plugin/examples/Calc/Classes/CalcAppDelegate.m0000644000175000017500000000122112653650146024742 0ustar ellertellert// // CalcAppDelegate.m // Calc // // Created by Wei Zhang on 5/19/12. // Copyright __MyCompanyName__ 2012. All rights reserved. // #import "CalcAppDelegate.h" #import "CalcViewController.h" @implementation CalcAppDelegate @synthesize window; @synthesize viewController; - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after app launch [window addSubview:viewController.view]; [window makeKeyAndVisible]; return YES; } - (void)dealloc { [viewController release]; [window release]; [super dealloc]; } @end gsoap-2.8.28/gsoap/ios_plugin/examples/Calc/Classes/soapStub.h0000644000175000017500000002340312653650146023605 0ustar ellertellert/* soapStub.h Generated by gSOAP 2.8.8 from calc.h Copyright(C) 2000-2012, Robert van Engelen, Genivia Inc. All Rights Reserved. The generated code is released under one of the following licenses: 1) GPL or 2) Genivia's license for commercial use. This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. */ #ifndef soapStub_H #define soapStub_H #define SOAP_NAMESPACE_OF_ns2 "urn:calc" #include "stdsoap2.h" #if GSOAP_VERSION != 20808 # error "GSOAP VERSION MISMATCH IN GENERATED CODE: PLEASE REINSTALL PACKAGE" #endif #ifdef __cplusplus extern "C" { #endif /******************************************************************************\ * * * Enumerations * * * \******************************************************************************/ /******************************************************************************\ * * * Types with Custom Serializers * * * \******************************************************************************/ /******************************************************************************\ * * * Classes and Structs * * * \******************************************************************************/ #if 0 /* volatile type: do not declare here, declared elsewhere */ #endif #ifndef SOAP_TYPE_ns2__addResponse #define SOAP_TYPE_ns2__addResponse (10) /* ns2:addResponse */ struct ns2__addResponse { double *result; /* SOAP 1.2 RPC return element (when namespace qualified) */ /* optional element of type xsd:double */ }; #endif #ifndef SOAP_TYPE_ns2__add #define SOAP_TYPE_ns2__add (11) /* ns2:add */ struct ns2__add { double a; /* required element of type xsd:double */ double b; /* required element of type xsd:double */ }; #endif #ifndef SOAP_TYPE_ns2__subResponse #define SOAP_TYPE_ns2__subResponse (13) /* ns2:subResponse */ struct ns2__subResponse { double *result; /* SOAP 1.2 RPC return element (when namespace qualified) */ /* optional element of type xsd:double */ }; #endif #ifndef SOAP_TYPE_ns2__sub #define SOAP_TYPE_ns2__sub (14) /* ns2:sub */ struct ns2__sub { double a; /* required element of type xsd:double */ double b; /* required element of type xsd:double */ }; #endif #ifndef SOAP_TYPE_ns2__mulResponse #define SOAP_TYPE_ns2__mulResponse (16) /* ns2:mulResponse */ struct ns2__mulResponse { double *result; /* SOAP 1.2 RPC return element (when namespace qualified) */ /* optional element of type xsd:double */ }; #endif #ifndef SOAP_TYPE_ns2__mul #define SOAP_TYPE_ns2__mul (17) /* ns2:mul */ struct ns2__mul { double a; /* required element of type xsd:double */ double b; /* required element of type xsd:double */ }; #endif #ifndef SOAP_TYPE_ns2__divResponse #define SOAP_TYPE_ns2__divResponse (19) /* ns2:divResponse */ struct ns2__divResponse { double *result; /* SOAP 1.2 RPC return element (when namespace qualified) */ /* optional element of type xsd:double */ }; #endif #ifndef SOAP_TYPE_ns2__div #define SOAP_TYPE_ns2__div (20) /* ns2:div */ struct ns2__div { double a; /* required element of type xsd:double */ double b; /* required element of type xsd:double */ }; #endif #ifndef SOAP_TYPE_ns2__powResponse #define SOAP_TYPE_ns2__powResponse (22) /* ns2:powResponse */ struct ns2__powResponse { double *result; /* SOAP 1.2 RPC return element (when namespace qualified) */ /* optional element of type xsd:double */ }; #endif #ifndef SOAP_TYPE_ns2__pow #define SOAP_TYPE_ns2__pow (23) /* ns2:pow */ struct ns2__pow { double a; /* required element of type xsd:double */ double b; /* required element of type xsd:double */ }; #endif #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_SOAP_ENV__Header #define SOAP_TYPE_SOAP_ENV__Header (24) /* SOAP Header: */ struct SOAP_ENV__Header { #ifdef WITH_NOEMPTYSTRUCT char dummy; /* dummy member to enable compilation */ #endif }; #endif #endif #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_SOAP_ENV__Code #define SOAP_TYPE_SOAP_ENV__Code (25) /* SOAP Fault Code: */ struct SOAP_ENV__Code { char *SOAP_ENV__Value; /* optional element of type xsd:QName */ struct SOAP_ENV__Code *SOAP_ENV__Subcode; /* optional element of type SOAP-ENV:Code */ }; #endif #endif #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_SOAP_ENV__Detail #define SOAP_TYPE_SOAP_ENV__Detail (27) /* SOAP-ENV:Detail */ struct SOAP_ENV__Detail { char *__any; int __type; /* any type of element (defined below) */ void *fault; /* transient */ }; #endif #endif #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_SOAP_ENV__Reason #define SOAP_TYPE_SOAP_ENV__Reason (30) /* SOAP-ENV:Reason */ struct SOAP_ENV__Reason { char *SOAP_ENV__Text; /* optional element of type xsd:string */ }; #endif #endif #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_SOAP_ENV__Fault #define SOAP_TYPE_SOAP_ENV__Fault (31) /* SOAP Fault: */ struct SOAP_ENV__Fault { char *faultcode; /* optional element of type xsd:QName */ char *faultstring; /* optional element of type xsd:string */ char *faultactor; /* optional element of type xsd:string */ struct SOAP_ENV__Detail *detail; /* optional element of type SOAP-ENV:Detail */ struct SOAP_ENV__Code *SOAP_ENV__Code; /* optional element of type SOAP-ENV:Code */ struct SOAP_ENV__Reason *SOAP_ENV__Reason; /* optional element of type SOAP-ENV:Reason */ char *SOAP_ENV__Node; /* optional element of type xsd:string */ char *SOAP_ENV__Role; /* optional element of type xsd:string */ struct SOAP_ENV__Detail *SOAP_ENV__Detail; /* optional element of type SOAP-ENV:Detail */ }; #endif #endif /******************************************************************************\ * * * Typedefs * * * \******************************************************************************/ #ifndef SOAP_TYPE__QName #define SOAP_TYPE__QName (5) typedef char *_QName; #endif #ifndef SOAP_TYPE__XML #define SOAP_TYPE__XML (6) typedef char *_XML; #endif /******************************************************************************\ * * * Externals * * * \******************************************************************************/ /******************************************************************************\ * * * Server-Side Operations * * * \******************************************************************************/ SOAP_FMAC5 int SOAP_FMAC6 ns2__add(struct soap*, double a, double b, double *result); SOAP_FMAC5 int SOAP_FMAC6 ns2__sub(struct soap*, double a, double b, double *result); SOAP_FMAC5 int SOAP_FMAC6 ns2__mul(struct soap*, double a, double b, double *result); SOAP_FMAC5 int SOAP_FMAC6 ns2__div(struct soap*, double a, double b, double *result); SOAP_FMAC5 int SOAP_FMAC6 ns2__pow(struct soap*, double a, double b, double *result); /******************************************************************************\ * * * Server-Side Skeletons to Invoke Service Operations * * * \******************************************************************************/ SOAP_FMAC5 int SOAP_FMAC6 soap_serve(struct soap*); SOAP_FMAC5 int SOAP_FMAC6 soap_serve_request(struct soap*); SOAP_FMAC5 int SOAP_FMAC6 soap_serve_ns2__add(struct soap*); SOAP_FMAC5 int SOAP_FMAC6 soap_serve_ns2__sub(struct soap*); SOAP_FMAC5 int SOAP_FMAC6 soap_serve_ns2__mul(struct soap*); SOAP_FMAC5 int SOAP_FMAC6 soap_serve_ns2__div(struct soap*); SOAP_FMAC5 int SOAP_FMAC6 soap_serve_ns2__pow(struct soap*); /******************************************************************************\ * * * Client-Side Call Stubs * * * \******************************************************************************/ SOAP_FMAC5 int SOAP_FMAC6 soap_call_ns2__add(struct soap *soap, const char *soap_endpoint, const char *soap_action, double a, double b, double *result); SOAP_FMAC5 int SOAP_FMAC6 soap_call_ns2__sub(struct soap *soap, const char *soap_endpoint, const char *soap_action, double a, double b, double *result); SOAP_FMAC5 int SOAP_FMAC6 soap_call_ns2__mul(struct soap *soap, const char *soap_endpoint, const char *soap_action, double a, double b, double *result); SOAP_FMAC5 int SOAP_FMAC6 soap_call_ns2__div(struct soap *soap, const char *soap_endpoint, const char *soap_action, double a, double b, double *result); SOAP_FMAC5 int SOAP_FMAC6 soap_call_ns2__pow(struct soap *soap, const char *soap_endpoint, const char *soap_action, double a, double b, double *result); #ifdef __cplusplus } #endif #endif /* End of soapStub.h */ gsoap-2.8.28/gsoap/ios_plugin/examples/Calc/Classes/soapClient.c0000644000175000017500000002454312653650146024107 0ustar ellertellert/* soapClient.c Generated by gSOAP 2.8.8 from calc.h Copyright(C) 2000-2012, Robert van Engelen, Genivia Inc. All Rights Reserved. The generated code is released under one of the following licenses: 1) GPL or 2) Genivia's license for commercial use. This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. */ #if defined(__BORLANDC__) #pragma option push -w-8060 #pragma option push -w-8004 #endif #include "soapH.h" #ifdef __cplusplus extern "C" { #endif SOAP_SOURCE_STAMP("@(#) soapClient.c ver 2.8.8 2012-05-10 20:59:53 GMT") SOAP_FMAC5 int SOAP_FMAC6 soap_call_ns2__add(struct soap *soap, const char *soap_endpoint, const char *soap_action, double a, double b, double *result) { struct ns2__add soap_tmp_ns2__add; struct ns2__addResponse *soap_tmp_ns2__addResponse; if (!soap_endpoint) soap_endpoint = "http://websrv.cs.fsu.edu/~engelen/calcserver.cgi"; if (!soap_action) soap_action = ""; soap->encodingStyle = "http://schemas.xmlsoap.org/soap/encoding/"; soap_tmp_ns2__add.a = a; soap_tmp_ns2__add.b = b; soap_begin(soap); soap_serializeheader(soap); soap_serialize_ns2__add(soap, &soap_tmp_ns2__add); if (soap_begin_count(soap)) return soap->error; if (soap->mode & SOAP_IO_LENGTH) { if (soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_put_ns2__add(soap, &soap_tmp_ns2__add, "ns2:add", NULL) || soap_body_end_out(soap) || soap_envelope_end_out(soap)) return soap->error; } if (soap_end_count(soap)) return soap->error; if (soap_connect(soap, soap_endpoint, soap_action) || soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_put_ns2__add(soap, &soap_tmp_ns2__add, "ns2:add", NULL) || soap_body_end_out(soap) || soap_envelope_end_out(soap) || soap_end_send(soap)) return soap_closesock(soap); if (!result) return soap_closesock(soap); soap_default_double(soap, result); if (soap_begin_recv(soap) || soap_envelope_begin_in(soap) || soap_recv_header(soap) || soap_body_begin_in(soap)) return soap_closesock(soap); if (soap_recv_fault(soap, 1)) return soap->error; soap_tmp_ns2__addResponse = soap_get_ns2__addResponse(soap, NULL, "", ""); if (soap->error) return soap_recv_fault(soap, 0); if (soap_body_end_in(soap) || soap_envelope_end_in(soap) || soap_end_recv(soap)) return soap_closesock(soap); if (result && soap_tmp_ns2__addResponse->result) *result = *soap_tmp_ns2__addResponse->result; return soap_closesock(soap); } SOAP_FMAC5 int SOAP_FMAC6 soap_call_ns2__sub(struct soap *soap, const char *soap_endpoint, const char *soap_action, double a, double b, double *result) { struct ns2__sub soap_tmp_ns2__sub; struct ns2__subResponse *soap_tmp_ns2__subResponse; if (!soap_endpoint) soap_endpoint = "http://websrv.cs.fsu.edu/~engelen/calcserver.cgi"; if (!soap_action) soap_action = ""; soap->encodingStyle = "http://schemas.xmlsoap.org/soap/encoding/"; soap_tmp_ns2__sub.a = a; soap_tmp_ns2__sub.b = b; soap_begin(soap); soap_serializeheader(soap); soap_serialize_ns2__sub(soap, &soap_tmp_ns2__sub); if (soap_begin_count(soap)) return soap->error; if (soap->mode & SOAP_IO_LENGTH) { if (soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_put_ns2__sub(soap, &soap_tmp_ns2__sub, "ns2:sub", NULL) || soap_body_end_out(soap) || soap_envelope_end_out(soap)) return soap->error; } if (soap_end_count(soap)) return soap->error; if (soap_connect(soap, soap_endpoint, soap_action) || soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_put_ns2__sub(soap, &soap_tmp_ns2__sub, "ns2:sub", NULL) || soap_body_end_out(soap) || soap_envelope_end_out(soap) || soap_end_send(soap)) return soap_closesock(soap); if (!result) return soap_closesock(soap); soap_default_double(soap, result); if (soap_begin_recv(soap) || soap_envelope_begin_in(soap) || soap_recv_header(soap) || soap_body_begin_in(soap)) return soap_closesock(soap); if (soap_recv_fault(soap, 1)) return soap->error; soap_tmp_ns2__subResponse = soap_get_ns2__subResponse(soap, NULL, "", ""); if (soap->error) return soap_recv_fault(soap, 0); if (soap_body_end_in(soap) || soap_envelope_end_in(soap) || soap_end_recv(soap)) return soap_closesock(soap); if (result && soap_tmp_ns2__subResponse->result) *result = *soap_tmp_ns2__subResponse->result; return soap_closesock(soap); } SOAP_FMAC5 int SOAP_FMAC6 soap_call_ns2__mul(struct soap *soap, const char *soap_endpoint, const char *soap_action, double a, double b, double *result) { struct ns2__mul soap_tmp_ns2__mul; struct ns2__mulResponse *soap_tmp_ns2__mulResponse; if (!soap_endpoint) soap_endpoint = "http://websrv.cs.fsu.edu/~engelen/calcserver.cgi"; if (!soap_action) soap_action = ""; soap->encodingStyle = "http://schemas.xmlsoap.org/soap/encoding/"; soap_tmp_ns2__mul.a = a; soap_tmp_ns2__mul.b = b; soap_begin(soap); soap_serializeheader(soap); soap_serialize_ns2__mul(soap, &soap_tmp_ns2__mul); if (soap_begin_count(soap)) return soap->error; if (soap->mode & SOAP_IO_LENGTH) { if (soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_put_ns2__mul(soap, &soap_tmp_ns2__mul, "ns2:mul", NULL) || soap_body_end_out(soap) || soap_envelope_end_out(soap)) return soap->error; } if (soap_end_count(soap)) return soap->error; if (soap_connect(soap, soap_endpoint, soap_action) || soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_put_ns2__mul(soap, &soap_tmp_ns2__mul, "ns2:mul", NULL) || soap_body_end_out(soap) || soap_envelope_end_out(soap) || soap_end_send(soap)) return soap_closesock(soap); if (!result) return soap_closesock(soap); soap_default_double(soap, result); if (soap_begin_recv(soap) || soap_envelope_begin_in(soap) || soap_recv_header(soap) || soap_body_begin_in(soap)) return soap_closesock(soap); if (soap_recv_fault(soap, 1)) return soap->error; soap_tmp_ns2__mulResponse = soap_get_ns2__mulResponse(soap, NULL, "", ""); if (soap->error) return soap_recv_fault(soap, 0); if (soap_body_end_in(soap) || soap_envelope_end_in(soap) || soap_end_recv(soap)) return soap_closesock(soap); if (result && soap_tmp_ns2__mulResponse->result) *result = *soap_tmp_ns2__mulResponse->result; return soap_closesock(soap); } SOAP_FMAC5 int SOAP_FMAC6 soap_call_ns2__div(struct soap *soap, const char *soap_endpoint, const char *soap_action, double a, double b, double *result) { struct ns2__div soap_tmp_ns2__div; struct ns2__divResponse *soap_tmp_ns2__divResponse; if (!soap_endpoint) soap_endpoint = "http://websrv.cs.fsu.edu/~engelen/calcserver.cgi"; if (!soap_action) soap_action = ""; soap->encodingStyle = "http://schemas.xmlsoap.org/soap/encoding/"; soap_tmp_ns2__div.a = a; soap_tmp_ns2__div.b = b; soap_begin(soap); soap_serializeheader(soap); soap_serialize_ns2__div(soap, &soap_tmp_ns2__div); if (soap_begin_count(soap)) return soap->error; if (soap->mode & SOAP_IO_LENGTH) { if (soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_put_ns2__div(soap, &soap_tmp_ns2__div, "ns2:div", NULL) || soap_body_end_out(soap) || soap_envelope_end_out(soap)) return soap->error; } if (soap_end_count(soap)) return soap->error; if (soap_connect(soap, soap_endpoint, soap_action) || soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_put_ns2__div(soap, &soap_tmp_ns2__div, "ns2:div", NULL) || soap_body_end_out(soap) || soap_envelope_end_out(soap) || soap_end_send(soap)) return soap_closesock(soap); if (!result) return soap_closesock(soap); soap_default_double(soap, result); if (soap_begin_recv(soap) || soap_envelope_begin_in(soap) || soap_recv_header(soap) || soap_body_begin_in(soap)) return soap_closesock(soap); if (soap_recv_fault(soap, 1)) return soap->error; soap_tmp_ns2__divResponse = soap_get_ns2__divResponse(soap, NULL, "", ""); if (soap->error) return soap_recv_fault(soap, 0); if (soap_body_end_in(soap) || soap_envelope_end_in(soap) || soap_end_recv(soap)) return soap_closesock(soap); if (result && soap_tmp_ns2__divResponse->result) *result = *soap_tmp_ns2__divResponse->result; return soap_closesock(soap); } SOAP_FMAC5 int SOAP_FMAC6 soap_call_ns2__pow(struct soap *soap, const char *soap_endpoint, const char *soap_action, double a, double b, double *result) { struct ns2__pow soap_tmp_ns2__pow; struct ns2__powResponse *soap_tmp_ns2__powResponse; if (!soap_endpoint) soap_endpoint = "http://websrv.cs.fsu.edu/~engelen/calcserver.cgi"; if (!soap_action) soap_action = ""; soap->encodingStyle = "http://schemas.xmlsoap.org/soap/encoding/"; soap_tmp_ns2__pow.a = a; soap_tmp_ns2__pow.b = b; soap_begin(soap); soap_serializeheader(soap); soap_serialize_ns2__pow(soap, &soap_tmp_ns2__pow); if (soap_begin_count(soap)) return soap->error; if (soap->mode & SOAP_IO_LENGTH) { if (soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_put_ns2__pow(soap, &soap_tmp_ns2__pow, "ns2:pow", NULL) || soap_body_end_out(soap) || soap_envelope_end_out(soap)) return soap->error; } if (soap_end_count(soap)) return soap->error; if (soap_connect(soap, soap_endpoint, soap_action) || soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_put_ns2__pow(soap, &soap_tmp_ns2__pow, "ns2:pow", NULL) || soap_body_end_out(soap) || soap_envelope_end_out(soap) || soap_end_send(soap)) return soap_closesock(soap); if (!result) return soap_closesock(soap); soap_default_double(soap, result); if (soap_begin_recv(soap) || soap_envelope_begin_in(soap) || soap_recv_header(soap) || soap_body_begin_in(soap)) return soap_closesock(soap); if (soap_recv_fault(soap, 1)) return soap->error; soap_tmp_ns2__powResponse = soap_get_ns2__powResponse(soap, NULL, "", ""); if (soap->error) return soap_recv_fault(soap, 0); if (soap_body_end_in(soap) || soap_envelope_end_in(soap) || soap_end_recv(soap)) return soap_closesock(soap); if (result && soap_tmp_ns2__powResponse->result) *result = *soap_tmp_ns2__powResponse->result; return soap_closesock(soap); } #ifdef __cplusplus } #endif #if defined(__BORLANDC__) #pragma option pop #pragma option pop #endif /* End of soapClient.c */ gsoap-2.8.28/gsoap/ios_plugin/examples/Calc/Classes/gsoapios.h0000644000175000017500000001626312653650146023637 0ustar ellertellert/* gsoapios.h iOS plugin (iPhone and iPad) gSOAP XML Web services tools Copyright (C) 2000-2012, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under one of the following licenses: GPL, the gSOAP public license, or Genivia's license for commercial use. ------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2008, Robert van Engelen, Genivia Inc., All Rights Reserved. ------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. ------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com ------------------------------------------------------------------------------- */ #ifndef GSOAPIOS_H #define GSOAPIOS_H #import "stdsoap2.h" /* Class GSoapiOSURLData @brief stores states for connection establishment, buffering soap request and response */ @interface GSoapiOSURLData : NSObject { @private NSString *endpoint; NSString *host; NSString *soap_action; NSString *http_method; NSString *content_type; NSMutableData *http_req_msg; NSData *soap_req_msg; NSData *soap_res_msg; int port; int req_content_length; int received_length; // received length of response for deserialization bool request_sent; // flag indicates a soap request has been made // The timeout interval for the new request, in seconds double timeout_interval; unsigned int cache_policy; // The cache policy for the new request NSString *user_name; NSString *password; } @property(nonatomic, retain) NSString *endpoint; // Web service endpoint @property(nonatomic, retain) NSString *host; // host name @property(nonatomic, retain) NSString *soap_action; // soap action @property(nonatomic, retain) NSString *http_method; // http method @property(nonatomic, retain) NSString *content_type; // http content type // http request messgae @property(nonatomic, retain) NSMutableData *http_req_msg; // soap request message @property(nonatomic, retain) NSData *soap_req_msg; // soap response xml message @property(nonatomic, retain) NSData *soap_res_msg; @property(nonatomic) int port; // port @property(nonatomic) int req_content_length; // request content length // received length of response for deserialization @property(nonatomic) int received_length; // flag indicates a soap request has been made @property(nonatomic) bool request_sent; // the timout interval for request @property(nonatomic) double timeout_interval; @property(nonatomic) unsigned int cache_policy; // user and password: must appear in pair @property(nonatomic, retain) NSString *user_name; // user name @property(nonatomic, retain) NSString *password; // pasword - (id) init; @end /** plugin identification for plugin registry */ #define SOAP_IOS_ID "SOAP_IOS-1.0" // plugin identification for plugin registry #ifdef __cplusplus extern "C" { #endif /** @struct soap_ios_data @brief soap_ios plugin data to override callbacks and store states to manipulate SOAP connection using iOS libraries */ struct soap_ios_data { // Stores states such as endpoint, serialized request and response GSoapiOSURLData *url_data; // A callback function to replace the default tcp_connect function // Rather than establishment of a tcp connection using socket, this callback // extracts and saves states (endpoint, http-method, content-type etc.) and // buffers serialized request SOAP_SOCKET (*fopen)( struct soap*, const char*, const char*, int); // A callback function to replace the default tcp_disconnect function // Since no connection is established in fopen, this function does noop int (*fclose)( struct soap*); // A callback function to replace the default send function // This function buffers serialized request including HTTP header and body // (soap message) int (*fsend)( struct soap*, const char *, size_t); // A callback function to replace the default send function // This function sends a synchrous request to the endpoint and receives // response using iOS SDK class NSURLConnection. The response is then snet // to soap for deserialization. size_t (*frecv)( struct soap*, char *, size_t); }; /* @fn int soap_ios (struct soap *soap, struct soap_plugin *plugin, void *arg) @brief soap plugin function for registration @param[in] soap soap context @param[in] plugin plugin data @param[in] arg arguments for the plugin data Usgae: @code struct soap *soap = soap_new(); soap_register_plugin(soap, soap_ios); @endcode */ int soap_ios (struct soap *soap, struct soap_plugin *plugin, void *arg); /* @fn void soap_ios_setcachepolicy(struct soap *soap, unsigned int policy) @brief Sets cache policy The constants used to specify interaction with the cached responses are: enum { NSURLRequestUseProtocolCachePolicy = 0, NSURLRequestReloadIgnoringLocalCacheData = 1, NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData, NSURLRequestReturnCacheDataElseLoad = 2, NSURLRequestReturnCacheDataDontLoad = 3, NSURLRequestReloadIgnoringLocalAndRemoteCacheData =4, NSURLRequestReloadRevalidatingCacheData = 5 }; @param soap The soap context @param[in] policy The policy to be specified for he request */ void soap_ios_setcachepolicy(struct soap *soap, unsigned int policy); /* @fn soap_ios_settimeoutinterval(struct soap *soap, double seconds) @brief Sets timeout interval @param soap The soap context @param[in] seconds The value for the timeout interval to be specifed (in seconds) */ void soap_ios_settimeoutinterval(struct soap *soap, double seconds); #ifdef __cplusplus } #endif // --- closing #ifdef __cplusplus #endif // --- closing #ifndef GSOAPIOS_H gsoap-2.8.28/gsoap/ios_plugin/examples/Calc/Classes/CalcAppDelegate.h0000644000175000017500000000071212653650146024741 0ustar ellertellert// // CalcAppDelegate.h // Calc // // Created by Wei Zhang on 5/19/12. // Copyright __MyCompanyName__ 2012. All rights reserved. // #import @class CalcViewController; @interface CalcAppDelegate : NSObject { UIWindow *window; CalcViewController *viewController; } @property (nonatomic, retain) IBOutlet UIWindow *window; @property (nonatomic, retain) IBOutlet CalcViewController *viewController; @end gsoap-2.8.28/gsoap/ios_plugin/examples/Calc/Classes/gsoapios.m0000644000175000017500000011155412653650146023643 0ustar ellertellert/* gsoapios.m iOS plugin (iPhone and iPad) gSOAP XML Web services tools Copyright (C) 2000-2012, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under one of the following licenses: GPL, the gSOAP public license, or Genivia's license for commercial use. ------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2008, Robert van Engelen, Genivia Inc., All Rights Reserved. ------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. ------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com ------------------------------------------------------------------------------- */ /** @mainpage - @ref ios_0 documents the iOS plugin to facilitate the development of client applications on iOS plarforms (iPhone and iPad) using the gSOAP toolkit. To use the plugin for development of client applications on iOS platforms, registration of this plugin is required: @code #import "gsoapios.h" struct soap *soap = soap_new(); soap_register_plugin(soap, soap_ios); @endcode */ /** @page ios_0 The iOS plugin for developing client applications on iOS (iPhone and iPad) platforms @section ios_intro Introduction Consuming Web services on iOS (iPhone and iPad) platforms is inreseasingly in demand today. However, Xcode does not have any built-in tools that make consuming Web services easy. It typically requires knowledge of XML processing techniques to send soap requests to the Web services and then parse the returning XML results. The gSOAP toolkit that provides an automated SOAP and XML data binding for C and C++ can be used directly to develop client applications to consuming Web services on iOS platforms such as iPhone and iPad. However, it's default network connection does not leverage the advantages of network connection offered by iOS SDK, instead it uses lower level TCP sockets for network connection. This soap plugin facilitates developers to develop Web services client applications on iOS platforms without maniulating the XML processing. Moreover, it takes andvantages of network connection offered by iOS SDK and supports 3G/4G, wifi etc. Two Xcode examples, @ref ios_example_calc and @ref ios_example_geoip can be found in samples/ios. @section ios_1 Getting Started To start building Web services client applications for iPhone and/or iPad with gSOAP , you need: \li The gSOAP package from http://www.genivia.com/Products/downloads.html (select gSOAP toolkit standard edition from the list of software packages), and \li Xcode IDE with the iOS SDK installed. Development of Web services applications on iOS is no different from the development SOAP Web services applications on Linux, Unix and Mac OS except with a soap plugin registration. Specifically, there are four steps to develop SOAP Web services client applications on iOS: \li Generating application stubs using the gSOAP toolkit and add the source files \li Creating an iOS application project to the Xcode project \li Registering the iOS plugin \li Calling service methods @subsection iso_register_pulg Registering iOS Plugin (Required) To register the iOS plugin, simply call soap_register_plugin method: @code #import "gsoapios.h" struct soap *soap = soap_new(); soap_register(soap, soap_ios); // Register the iOS plugin ... soap_end(soap); // Clean up temporaries soap_destroy(soap); // Free soap context @endcode The plugin is destroyed automatically by the soap context when the soap_end method is executed. @subsection ios_cache_policy Specifying Cache policy (Optional) The interaction beween the client and the Web servcie server can be controled by specifying the cache policy. To specify the cache policy, call the method soap_ios_setcachepolicy(struct soap *soap, unsigned int policy) . The method cannot be called before the pluging is registered. @code #import "gsoapios.h" struct soap *soap = soap_new(); soap_register(soap, soap_ios); // Register the iOS plugin // Specify the cache policy for the request // Caveat: this method cannot be called before the plugin is registered // If this method is not called, the cache policy is set to NSURLRequestUseProtocolCachePolicy (0) by default. soap_ios_setchacepolicy(soap, NSURLRequestReturnCacheDataElseLoad); // (2) // Or use the integer directly instead of enum // soap_ios_setchacepolicy(soap, 2); // (NSURLRequestReturnCacheDataElseLoad) ... soap_end(soap); // clean up allocated temporaries soap_destroy(soap); // Free soap context @endcode The available cache policies that can be specified are: @code enum { NSURLRequestUseProtocolCachePolicy = 0, NSURLRequestReloadIgnoringLocalCacheData = 1, NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData, NSURLRequestReturnCacheDataElseLoad = 2, NSURLRequestReturnCacheDataDontLoad = 3, NSURLRequestReloadIgnoringLocalAndRemoteCacheData =4, NSURLRequestReloadRevalidatingCacheData = 5 } @endcode If this method is not called, the cache policy is set to NSURLRequestUseProtocolCachePolicy (0) by default. @subsection ios_timeout_interval Specifying Timeout Interval (Optional) The timeout interval for network connection can be specified using the method soap_ios_settimeoutinterval(struct soap *soap, double seconds). The method cannot be called before the pluging is registered. If this method is not called, the timeout interval is 60 seconds by default. @code #import "gsoapios.h" struct soap *soap = soap_new(); soap_register(soap, soap_ios); // Register the iOS plugin // Specify the timout interval in terms of seconds // If this method is not called, the timeout interval is set to 60 seconds by default // Caveat: this method cannot be called before the plugin is registered soap_ios_settimeoutinterval(soap, 30.0); ... soap_end(soap); soap_destroy(soap); @endcode @subsection ios_http_auth Handling HTTP Authentication A server may request user authentication and deny access (HTTP 401 error) when the client tries to connect without HTTP authentication (or with the wrong authentication information). HTTP authentication (basic) is enabled at the client-side by setting the soap.userid and soap.passwd strings to a username and password, respectively. Be aware of that both of userid and password must be set in pair, that is, if one of them is set, the other must be set too. If the server requires basic HTTP authentication, for example, the userid and password can be specified: @code struct soap *soap = soap_new(); soap->userid = "someone"; soap->passwd = "somepass"; ... soap_end(soap); // Clean up temporaries soap_destroy(soap); @endcode @section ios_example Examples This section intoduces two examples to demonstrate the development of client applications consuming SOAP Web services on iOS platforms (iPhone and iPad) using gSOAP tools and the iOS plugin. Because gSOAP supports development for both pure C and C++, the first example, @ref ios_example_calc, is developed using pure C. The second one, @ref ios_example_geoip, is developmed using C++. We assume you already have had the expereince in development of applications for iPhone and iPad using Xcode with iOS SDK installed. @subsection ios_example_calc A Simple Calculator Example (Pure C) This example shows you how to develop a client application in C using gSOAP and the ios plugin, which consumes a simple caculator service on iOS using gSOAP. The simple calculator service was developed and deployed as a demo using the gSOAP tools (refer to http://www.genivia.com/Products/gsoap/demos/index.html for details). The gSOAP Calculator Service provides several operations such as add, sub, mul, div etc. In this example, we use operation add as a demo. Other operations are alled in a similar way. The wsdl file for this service can be obtained at the following link: http://www.genivia.com/calc.wsdl The Xcode project for this example can be found in samples/ios/calc. @subsubsection ios_calc_step_1 Step 1: Generating stubs for C API To generate codes for the calculator Web service, we first run the wsdl2h tool from the command line on the URL of the WSDL and use option -o to specify the output file (Alternatively, you can download the calc.wsdl and use the local file instead of the URL): @code > wsdl2h -c -o calc.h http://www.genivia.com/calc.wsdl @endcode This generates the calc.h service definition header file with service operation definitions and types for the operation's data. The option -c flags the wsdl2h tool to generate the service definition file in pure C. By default, gSOAP assumes you will use C++ with STL. We have not yet generated the stubs for the CAPI. To do so, run the soapcpp2 compiler: @code > soapcpp2 -i -C calc.h @endcode Option -C indicates client-side only files (soapcpp2 generates both client and server stubs and skeletons by default). This generates a number of soource files for client application development. @subsubsection ios_calc_step_2 Step 2: Creating Xcode project for iPhone Launch the Xcode, create a View-based Application project and name it Calc. Open the CalcViewController.xib file in the Interface Builder. Double-click on the View item and populate it with the views listed below and shown in Figure 1: \li Two Labels ("+" and "A Simple Calculator") \li Two Text Fields (operand1 and operand2) \li One Round Rect Button ("+" button) @image html calc-view.png "Figure 1. View of the Calculator Web Service Client" In Xcode, edit the file CalcViewController.h to make it look like the following: @code // File: CalcViewController.h #import @interface CalcViewController : UIViewController { UITextField *op1; // operand1 UITextField *op2; // operand2 } @property (nonatomic, retain) IBOutlet UITextField *op1; @property (nonatomic, retain) IBOutlet UITextField *op2; - (IBAction) buttonPressed; @end @endcode Link the op1 and op2 to the two Text Fields and delegate the button action to method buttonPressed. @subsubsection ios_calc_step_3 Step 3: Adding generated source stubs to the Xcode project Add the source files soapC.c, soapClient.c, soapH.h, and soapStub.h generated in @ref ios_calc_step_1 to the project. Also add files stdsoap2.h and stdsoap2.c to the project from gsoap package as well as the iOS pluhin files gsoapios.h and sgsoapios.m. @subsubsection ios_calc_step_4 Step 4: Implementing the Logic by calling the soap service Firstly, edit file main.m to import the file ./Classes/calc.nsmap. Link errors may arise without importing this namespace mapping. @code // File: main.m #import #import "./Classes/calc.nsmap" int main(int argc, char *argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; int retVal = UIApplicationMain(argc, argv, nil, nil); [pool release]; return retVal; } @endcode Then, implememt the source file CalcViewController.m as the following: @code #import "CalcViewController.h" #import "soapStub.h" #import "gsoapios.h" @implementation CalcViewController @synthesize op1; // Set or get opreand1 @synthesize op2; // Set or get opreand1 - (IBAction) buttonPressed { double x = [op1.text doubleValue]; double y = [op2.text doubleValue]; struct soap *soap = soap_new(); if (soap_register_plugin(soap, soap_ios) == SOAP_OK) { // Specify the cache policy (optional) to NSURLRequestReturnCacheDataElseLoad // instead of NSURLRequestUseProtocolCachePolicy by deault soap_ios_setcachepolicy(soap, NSURLRequestReturnCacheDataElseLoad); // Specify the timeout interval (optional) to 45 seconds instead of // the default 60 seconds soap_ios_settimeoutinterval(soap, 45.0); double result; // Call Web service operation add int status = soap_call_ns2__add(soap, NULL, NULL, x, y, &result); soap_free_temp(soap); // Cleanup temporary resources // Check soap response status if (status == SOAP_OK) { NSString *resultString; NSString *tittleString; if (status == SOAP_OK) { resultString = [NSString stringWithFormat:@"%f",result]; tittleString = [NSString stringWithFormat:@"%f / %f =",x, y]; }else { resultString = [NSString stringWithFormat:@"%@",@"Soap fault!"]; tittleString = [NSString stringWithFormat:@"%@",@"Warning"]; } // Show the result in an alert UIAlertView *alert = [[UIAlertView alloc] initWithTitle:tittleString message:resultString delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert show]; // Show the alert [alert release]; // Release the alert } else { // Caveat: Better to extract the error message and show it using an alert soap_print_fault(soap,stderr); // Print soap error in console } } soap_end(soap); // clean up allocated temporaries soap_free(soap); // Free soap context } ... @endcode A screen snapshot of the client is shown in Figure 2. @image html calc-result.png "Figure 2: Snapshot of the CalcViewService result" @subsection ios_example_geoip A GeoIPService (C++) GeoIPService is a live SOAP Web service that enables you to look up contries by IP address or by Context. This example shows you how to develop a client application in C++ using gSOAP and the ios plugin, which consumes the GeoIPSerive on iOS using gSOAP. The WSDL file for this servive can be downloaded at the following link: http://www.webservicex.net/geoipservice.asmx?WSDL Devoplopment of he client appliation for this GeoIPService on iOS is similar to development for the cleant appliaction for @ref ios_example_calc. The major dfferences are highlighted in following: \li Rename the .m files to .mm files. The iOS plugin implementation file gsoapios.m must be renamed to gsoapios.mm. The main.m must be renamed to main.mm. Other files such as your ViewController may also be renamed with .mm. \li Generate C++ proxy using proper options with wsdl2h and soapcpp2 \li Use the stdsoap2.cpp instead of stdsoap2.c from the gSOAP package in your iOS project. The Xcode project for this example can be found in samples/ios/GeoIPService. @subsubsection ios_geoip_step_1 Step 1: Generating stubs for C++ Proxy To generate codes for the GeoIPSerbice Web service, we first run the wsdl2h tool from the command line on the URL of the WSDL and use option -o to specify the output file (Alternatively, you can download the GeoIPService.wsdl file and use the local file instead of the URL): @code >wsdl2h -o GeoIPService.h http://www.webservicex.net/geoipservice.asmx?WSDL @endcode This generates the GeoIPService.h service definition header file with service operation definitions and types for the operation's data. By default, gSOAP assumes you will use C++ with STL. To generate the stubs for the C++ proxy classes, run the soapcpp2 compiler: @code >soapcpp2 -i -C -I$GSOAP_HOME/import GeoIPService.h @endcode Option -i tells the compiler to generate C++ proxy and option -C indicates client-side only files (soapcpp2 generates both client and server stubs and skeletons by default). Option -I is needed to import the stlvector.h file from the import directory in the gSOAP package to support serialization of STL vectors. @subsubsection ios_geoip_step_2 Step 2: Creating Xcode project for iPhone Create a View-based Application project and name it GeoIPService and rename the .m source files to .mm. Open the GeoIPserviceViewController.xib file in the Interface Builder. Double-click on the View item and populate it with the views listed below and shown in Figure 3: \li A Label ("IP Address") \li A Text Field \li One Round Rect Button ("Find Country" button) @image html geoip-view.png "Figure 3. View of the GeoIPService Client" In Xcode, edit the file GeoIPServiceViewController.h to make it look like the following: @code // File: GeoIPServiceViewController.h #import @interface GeoIPServiceViewController : UIViewController { UITextField *ipAddress; } @property (nonatomic, retain) IBOutlet UITextField *ipAddress; - (IBAction) buttonFindCountry:(id)sender; @end @endcode Set the ipAddress outlet and the buttonFindCountry:(id)sender method to delegate action of the button. @subsubsection ios_geoip_step_3 Step 3: Adding generated source stubs to the Xcode project Add the source files soapC.cpp, GeoIPServiceSoap12Proxy.cpp, GeoIPServiceSoap12Proxy.h, soapH.h, andsoapStub.h generated in @ref ios_geoip_step_1 to the project. Also add filesstdsoap2.h and stdsoap2.cpp to the project from gsoap package and the iOS pluhin files gsoapios.h and sgsoapios.m. Do not forget to rename the sgsoapios.m to sgsoapios.mm The GeoIPServiceSoap12Proxy.h and GeoIPServiceSoap12Proxy.cpp are C++ proxy header and implementation files for SOAP 1.2 (You may use GeoIPServiceSoapProxy.cpp and GeoIPServiceSoapProxy.h for SOAP1.1). @subsubsection ios_geoip_step_4 Step 4: Implementing the Logic by calling the soap service Firstly, edit file main.mm to import the file ./Classes/GeoIPService.nsmap. Link errors would arise without importing this namespace mapping. @code // File: main.mm #import #import "./Classes/GeoIPServiceSoap12.nsmap" int main(int argc, char *argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; int retVal = UIApplicationMain(argc, argv, nil, nil); [pool release]; return retVal; } @endcode Then, implememt the source file GeoIPServiceViewController.m as the following: @code #import "GeoIPServiceViewController.h" #include "soapGeoIPServiceSoap12Proxy.h" #import "gsoapios.h" using namespace std; typedef struct _ns1__GetGeoIP RequestStruct; typedef struct _ns1__GetGeoIPResponse ResponseStruct; @implementation GeoIPServiceViewController @synthesize ipAddress; - (IBAction)buttonFindCountry:(id)sender { RequestStruct ip; ResponseStruct response; GeoIPServiceSoap12Proxy service; std::string ipAdd = std::string((char *)[ipAddress.text UTF8String]); ip.IPAddress = &ipAdd; // ----- register plugin for callbacks ------ soap_register_plugin(&service, soap_ios); // Optional: timeout internal, the default is 60.0 seconds soap_ios_settimeoutinterval(&service, 30.0); // Optional: the default policy is NSURLRequestUseProtocolCachePolicy (0) soap_ios_setcachepolicy(&service, NSURLRequestReturnCacheDataElseLoad); // (2) int status = service.GetGeoIP(&ip, &response); string* result; string err_msg = "Invalid IP address"; if ( status == SOAP_OK) { if(response.GetGeoIPResult && response.GetGeoIPResult->CountryName) { result = response.GetGeoIPResult->CountryName; } else { result = &err_msg; } } else { service.soap_stream_fault(std::cerr); } NSString *soapResult; NSString *tittleMsg; if (status == SOAP_OK) { soapResult = [NSString stringWithUTF8String:result->c_str()]; tittleMsg = [NSString stringWithFormat: @"%@", @"Country Found"]; } else { soapResult = [NSString stringWithFormat: @"%@", @"Soap Error!"]; tittleMsg = [NSString stringWithFormat: @"%@", @"Warning"]; } UIAlertView *alert = [[UIAlertView alloc] initWithTitle:tittleMsg message:soapResult delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert show]; [alert release]; service.destroy(); // Free soap context } ... @endcode A screen snapshot of the client is shown in Figure 4. @image html geoip-result.png "Figure : Snapshot of the GeoIPServiceViewService result" */ #import "gsoapios.h" #import // ----------------------------------------------------------------------------- // Start of objective-c Class GSoapiOSURLData implementation // ----------------------------------------------------------------------------- /** Class GSoapiOSURLData @brief The class stores the states for connection establishment, buffering soap request and response */ @implementation GSoapiOSURLData @synthesize endpoint; ///< Set or get endpoint @synthesize host; ///< Set or get host name @synthesize soap_action; ///< Set or get soap action @synthesize http_method; ///< Set or get HTTP method @synthesize content_type; ///< Set or get content type @synthesize http_req_msg; ///< Set or get HTTP request message @synthesize soap_req_msg; ///< Set or get SOAP request @synthesize soap_res_msg; ///< Set or get SOAP response @synthesize port; ///< Set or get port @synthesize received_length; ///< Set or get received message length @synthesize request_sent; ///< Set or get the flag for the first time sending @synthesize req_content_length; ///< Set or get request message length @synthesize timeout_interval; ///< Set or get timeout interval @synthesize cache_policy; ///< Set or get cache policy @synthesize user_name; ///< Set or get user ID for authentication @synthesize password; ///< Set or get password for authentication /** @fn init @brief Constructor */ - (id) init { [super init]; http_req_msg = [NSMutableData alloc]; timeout_interval = 60.0; // 60 seconds by default cache_policy = NSURLRequestUseProtocolCachePolicy; // The default cache policy return self; } /** @fn dealloc @brief Destructor */ - (void) dealloc { [endpoint release]; [host release]; [soap_action release]; [http_method release]; [content_type release]; [http_req_msg release]; [soap_req_msg release]; [user_name release]; [password release]; [super dealloc]; } @end // ----------------------------------------------------------------------------- // End of objective-c Class GSoapiOSURLData implementation // ----------------------------------------------------------------------------- // ----------------------------------------------------------------------------- // Start of C plugin implementation // ----------------------------------------------------------------------------- /** plugin identification for plugin registry */ const char soap_ios_id[13] = SOAP_IOS_ID; // Unique plugin ID static int soap_ios_copy(struct soap *soap, struct soap_plugin *dst, struct soap_plugin *src); static void soap_ios_delete(struct soap *soap, struct soap_plugin *p); static int soap_ios_init(struct soap *soap, struct soap_ios_data *data); static SOAP_SOCKET soap_ios_open( struct soap *soap, const char *endpoint, const char *host, int port); static int soap_ios_close( struct soap *soap); static int soap_ios_send( struct soap *soap, const char *buf, size_t len); static size_t soap_ios_recv( struct soap *soap, char *buf, size_t len); //void soap_ios_setcachepolicy(struct soap *soap, unsigned int policy); //void soap_ios_settimeoutinterval(struct soap *soap, double seconds); /** @fn int soap_ios @brief Save the old callbacks and set new callbacks to handle soap client applications on iOS platforms (iPhone and iPad) @param soap The soap context @param[in] p The soap plugin data @param[in] arg The arguments for soap plugin @return SOAP_OK if registration is successfull; SOAP_EOM otherwise */ int soap_ios (struct soap *soap, struct soap_plugin *p, void *arg) { p->id = soap_ios_id; // set a unique plugin id p->data = (void*)malloc(sizeof(struct soap_ios_data)); // Allocate memory p->fcopy = soap_ios_copy; // set fcopy callback for soap_copy(truct soap*) p->fdelete = soap_ios_delete; // set fdeete callback if (p->data) { if (soap_ios_init(soap, (struct soap_ios_data*)p->data) != SOAP_OK) { free(p->data); // free resource upon failure to initialize plugin return SOAP_EOM; } } return SOAP_OK; } /** @fn int soap_ios_copy(struct soap *soap, struct soap_plugin *dst, struct soap_plugin *src) @brief Duplicates the plugin context for the soap context @param soap The soap context @param[out] dst The destination plugin data to store to @param[in] src The sources plugin data to be copied from @param[in] arg The arguments for plugin (optional) @return SOAP_OK if registration is successfull; SOAP_ERR otherwise */ static int soap_ios_copy(struct soap *soap, struct soap_plugin *dst, struct soap_plugin *src) { *dst = *src; int status = SOAP_ERR; if (dst->data = (void*)malloc(sizeof(struct soap_ios_data))) status = soap_ios_init(soap, (struct soap_ios_data*)dst->data); return status; } /** @fn void soap_ios_delete(struct soap *soap, struct soap_plugin *p) @brief Destroys the plugin context @param soap context @param[in] p plugin data */ static void soap_ios_delete(struct soap *soap, struct soap_plugin *p) { if (p != NULL) { struct soap_ios_data *data = (struct soap_ios_data*)p->data; if (data && data->url_data) [data->url_data release]; // Free url_data free(p->data); // Free the pointer to url_data } } /** @fn int soap_ios_init(struct soap *soap, struct soap_ios_data *data) @brief Initializes the plugin data @param soap The soap context @param[out] data The plugin data to be initialized @return SOAP_OK if initialization is sucessful; SOAP_ERR otherwise */ static int soap_ios_init(struct soap *soap, struct soap_ios_data *data) { data->url_data = [[GSoapiOSURLData alloc] init]; if (data->url_data == nil) return SOAP_ERR; // failure to init // save and set callbacks data->fopen = soap->fopen; // save old fopen callback data->fclose = soap->fclose; // save old fclose callback data->fsend = soap->fsend; // save old fsend callback data->frecv = soap->frecv; // save old frecv callback soap->fopen = soap_ios_open; // replace open callback soap->fclose = soap_ios_close; // replace close callback soap->fsend = soap_ios_send; // replace send callback soap->frecv = soap_ios_recv; // replace recv callback return SOAP_OK; } /** @fn SOAP_SOCKET soap_ios_open( struct soap *soap, const char *endpoint, const char *host, int port) @brief Extracts states from soap context and saves states for soap connection @param soap The soap context @param[in] endpoint The Web service's endpoint @param[in] host The host name @param[in] port The port numer @return 1 A valid socket Note: This open function does not create a real socket for communication. The actual connection establishment happens in the frecv callback */ static SOAP_SOCKET soap_ios_open( struct soap *soap, const char *endpoint, const char *host, int port) { // Pull out the pluin data struct soap_ios_data *data = (struct soap_ios_data *)soap_lookup_plugin(soap, soap_ios_id); if (data == NULL || data->url_data == nil) return SOAP_INVALID_SOCKET; GSoapiOSURLData * url_data = data->url_data; [url_data setEndpoint:[NSString stringWithUTF8String:endpoint]]; [url_data setHost:[NSString stringWithUTF8String:host]]; [url_data setPort:port]; [url_data setRequest_sent:false]; [url_data setReceived_length:0]; [url_data setSoap_action:[NSString stringWithUTF8String:soap->action]]; [url_data setReq_content_length:soap->count]; // Extract a pair of userid and password if present if (soap->userid && soap->passwd) { [url_data setUser_name:[NSString stringWithUTF8String:soap->userid]]; [url_data setPassword:[NSString stringWithUTF8String:soap->passwd]]; } else { [url_data setUser_name:nil]; [url_data setPassword:nil]; } // Extracts and saves http-method switch (soap->status){ case SOAP_POST: [url_data setHttp_method:@"POST"]; break; case SOAP_GET: [url_data setHttp_method:@"GET"]; break; case SOAP_DEL: [url_data setHttp_method:@"DELETE"]; break; case SOAP_CONNECT: [url_data setHttp_method:@"CONNECT"]; break; default: [url_data setHttp_method:@"POST"]; break; } // Extracts and saves http content-type if((soap->mode & SOAP_ENC_DIME) && !(soap->mode & SOAP_ENC_MTOM)){ [url_data setContent_type:@"application/dime"]; } else if (soap->version == 2){ if (soap->mode & SOAP_ENC_MTOM){ [url_data setContent_type:@"application/xop+xml; charset=utf-8; \ type=\"application/soap+xml\""]; }else{ [url_data setContent_type:@"application/soap+xml; charset=utf-8"]; } }else if (soap->mode & SOAP_ENC_MTOM) { [url_data setContent_type:@"application/xop+xml; charset=utf-8; \ type=\"text/xml\""]; } else { [url_data setContent_type:@"tex/xml; charset=utf-8"]; } return 1; } /** @fn int soap_ios_close( struct soap *soap) @param soap The soap context @param[in] endpoint The Web service's endpoint @param[in] host The host name @param[in] port The port numer @return 0 Note: This open function does not create a real socket for communication. The actual connection establishment happens in the frecv callback */ static int soap_ios_close( struct soap *soap) { return 0; } /** @fn int soap_ios_send( struct soap *soap, const char *buf, size_t len) @brief Buffers the http/soap request in plugin data @param soap The soap context @param[in] buf The buffer holding the serialized http/soap request @param[in] len The buffer size @return The number of bytes buffered Note: This send function does not send any data to its peer. Rather it buffers the serialied soap request including http header to the plugin data. The sending happens actually in frecv function. */ static int soap_ios_send( struct soap *soap, const char *buf, size_t len) { struct soap_ios_data *data = (struct soap_ios_data*)soap_lookup_plugin(soap,soap_ios_id); GSoapiOSURLData *url_data = data->url_data; [url_data.http_req_msg appendBytes:buf length: len]; return len > 0 ? SOAP_OK : SOAP_EOF; } /** @fn size_t soap_ios_recv( struct soap *soap, char *buf, size_t len) @brief Sends soap request, buffers soap response and serialize the response @param soap The soap context @param[out] buf The buffer for the received data @param[in] len The number of bytes received @return The number of bytes received Note: This recv function sends a synchronous soap request through NSURLRequest, receives soap response, serializes response. */ static size_t soap_ios_recv( struct soap *soap, char *buf, size_t len) { struct soap_ios_data *data = (struct soap_ios_data*)soap_lookup_plugin(soap,soap_ios_id); GSoapiOSURLData *url_data = data->url_data; // Handle HTTP basic authentication if present if (url_data.user_name && url_data.password) { NSURLCredential *credential = [NSURLCredential credentialWithUser:url_data.user_name password:url_data.password persistence:NSURLCredentialPersistenceForSession]; NSURLProtectionSpace * protectionSpace = [[NSURLProtectionSpace alloc] initWithHost:url_data.host port:url_data.port protocol:@"http" realm:nil authenticationMethod:nil]; [[NSURLCredentialStorage sharedCredentialStorage] setDefaultCredential:credential forProtectionSpace:protectionSpace]; [protectionSpace release]; } // -------- End of auhentication handling --------- // Execute once: sending the request and receiving response // Send request through NSURLRequest sendSynchronousRequest // and receive response if(url_data.request_sent == false) { [url_data setRequest_sent:true]; //int msg_len = [url_data.http_req_msg length]; NSRange range = NSMakeRange([url_data.http_req_msg length] - url_data.req_content_length, url_data.req_content_length); url_data.soap_req_msg = [url_data.http_req_msg subdataWithRange:range]; NSURL *url = [NSURL URLWithString:url_data.endpoint]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:url_data.cache_policy timeoutInterval:url_data.timeout_interval]; [request addValue:url_data.host forHTTPHeaderField:@"HOST"]; [request addValue:url_data.soap_action forHTTPHeaderField:@"SOAPACTION"]; [request addValue:url_data.content_type forHTTPHeaderField:@"Content-Type"]; [request setHTTPMethod:url_data.http_method]; NSString *conten_length = [NSString stringWithFormat:@"%d", [url_data.soap_req_msg length]]; [request addValue:conten_length forHTTPHeaderField:@"Content-Length"]; [request setHTTPBody:url_data.soap_req_msg]; NSHTTPURLResponse *response = nil; NSError *error = nil; url_data.soap_res_msg = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; // Error handling if (error) { DLog(@"ERROR:<%@>\n", [error localizedDescription]); //const char *fault_string = [[error localizedDescription] UTF8String]; soap_receiver_fault(soap, [[error localizedDescription] UTF8String], ""); } } // may execute multiple times depending on the buffer size and response length if(url_data.request_sent) { size_t res_len = [url_data.soap_res_msg length]; // response length if (len + url_data.received_length > res_len) { // Adjustment len len = res_len - url_data.received_length; //cout << "len = " << len << endl; } const char *res_msg = (const char *)[url_data.soap_res_msg bytes]; memcpy(buf, res_msg + url_data.received_length, len); url_data.received_length += len; } return url_data.request_sent ? len : 0; } /** @fn void soap_ios_setcachepolicy(struct soap *soap, unsigned int policy) @brief Sets cache policy The constants used to specify interaction with the cached responses are: enum { NSURLRequestUseProtocolCachePolicy = 0, NSURLRequestReloadIgnoringLocalCacheData = 1, NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData, NSURLRequestReturnCacheDataElseLoad = 2, NSURLRequestReturnCacheDataDontLoad = 3, NSURLRequestReloadIgnoringLocalAndRemoteCacheData =4, NSURLRequestReloadRevalidatingCacheData = 5 }; @param soap The soap context @param[in] policy The policy to be specified for he request */ void soap_ios_setcachepolicy(struct soap *soap, unsigned int policy) { struct soap_ios_data *data = (struct soap_ios_data *)soap_lookup_plugin(soap, soap_ios_id); data->url_data.cache_policy = policy; } /** @fn soap_ios_settimeoutinterval(struct soap *soap, double seconds) @brief Sets timeout interval @param soap The soap context @param[in] seconds The value for the timeout interval to be specifed (in seconds) */ void soap_ios_settimeoutinterval(struct soap *soap, double seconds) { struct soap_ios_data *data = (struct soap_ios_data *)soap_lookup_plugin(soap, soap_ios_id); data->url_data.timeout_interval = seconds; } // ----------------------------------------------------------------------------- // END of C plugin implementation // ----------------------------------------------------------------------------- gsoap-2.8.28/gsoap/ios_plugin/examples/Calc/Classes/CalcViewController.m0000644000175000017500000000676412653650146025566 0ustar ellertellert// // CalcViewController.m // Calc // // Created by Wei Zhang on 5/19/12. // Copyright Genivia Inc. 2012. All rights reserved. // #import "CalcViewController.h" #import "soapStub.h" #import "gsoapios.h" @implementation CalcViewController @synthesize op1; // Set or get opreand1 @synthesize op2; // Set or get opreand1 - (IBAction) buttonPressed { double x = [op1.text doubleValue]; double y = [op2.text doubleValue]; struct soap *soap = soap_new(); if (soap_register_plugin(soap, soap_ios) == SOAP_OK) { // Specify the cache policy (optional) to NSURLRequestReturnCacheDataElseLoad // instead of NSURLRequestUseProtocolCachePolicy by deault soap_ios_setcachepolicy(soap, NSURLRequestReturnCacheDataElseLoad); // Specify the timeout interval (optional) to 45 seconds instead of // the default 60 seconds soap_ios_settimeoutinterval(soap, 45.0); double result; // Call Web service operation add int status = soap_call_ns2__add(soap, NULL, NULL, x, y, &result); soap_free_temp(soap); // Cleanup temporary resources if (status == SOAP_OK) { NSString *resultString; NSString *tittleString; if (status == SOAP_OK) { resultString = [NSString stringWithFormat:@"%f",result]; tittleString = [NSString stringWithFormat:@"%f / %f =",x, y]; } else { resultString = [NSString stringWithFormat:@"%@",@"Soap fault!"]; tittleString = [NSString stringWithFormat:@"%@",@"Warning"]; } // Show the result in an alert UIAlertView *alert = [[UIAlertView alloc] initWithTitle:tittleString message:resultString delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert show]; // Show the alert [alert release]; // Release the alert } else { // Caveat: Better to extract the error message and show it using an alert soap_print_fault(soap,stderr); // Print soap error in console } } soap_end(soap); // clean up allocated temporaries soap_free(soap); // Free soap context } /* // The designated initializer. Override to perform setup that is required before the view is loaded. - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) { // Custom initialization } return self; } */ /* // Implement loadView to create a view hierarchy programmatically, without using a nib. - (void)loadView { } */ /* // Implement viewDidLoad to do additional setup after loading the view, typically from a nib. - (void)viewDidLoad { [super viewDidLoad]; } */ // Override to allow orientations other than the default portrait orientation. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { // Return YES for supported orientations return interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown || interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation == UIInterfaceOrientationLandscapeRight; } - (void)didReceiveMemoryWarning { // Releases the view if it doesn't have a superview. [super didReceiveMemoryWarning]; // Release any cached data, images, etc that aren't in use. } - (void)viewDidUnload { // Release any retained subviews of the main view. // e.g. self.myOutlet = nil; } - (void)dealloc { [op1 release]; [op2 release]; [super dealloc]; } @end gsoap-2.8.28/gsoap/ios_plugin/examples/Calc/Classes/soapC.c0000644000175000017500000022105112653650146023044 0ustar ellertellert/* soapC.c Generated by gSOAP 2.8.8 from calc.h Copyright(C) 2000-2012, Robert van Engelen, Genivia Inc. All Rights Reserved. The generated code is released under one of the following licenses: 1) GPL or 2) Genivia's license for commercial use. This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. */ #if defined(__BORLANDC__) #pragma option push -w-8060 #pragma option push -w-8004 #endif #include "soapH.h" #ifdef __cplusplus extern "C" { #endif SOAP_SOURCE_STAMP("@(#) soapC.c ver 2.8.8 2012-05-10 20:59:53 GMT") #ifndef WITH_NOGLOBAL SOAP_FMAC3 void SOAP_FMAC4 soap_serializeheader(struct soap *soap) { if (soap->header) soap_serialize_SOAP_ENV__Header(soap, soap->header); } SOAP_FMAC3 int SOAP_FMAC4 soap_putheader(struct soap *soap) { if (soap->header) { soap->part = SOAP_IN_HEADER; if (soap_out_SOAP_ENV__Header(soap, "SOAP-ENV:Header", 0, soap->header, NULL)) return soap->error; soap->part = SOAP_END_HEADER; } return SOAP_OK; } SOAP_FMAC3 int SOAP_FMAC4 soap_getheader(struct soap *soap) { soap->part = SOAP_IN_HEADER; soap->header = soap_in_SOAP_ENV__Header(soap, "SOAP-ENV:Header", NULL, NULL); soap->part = SOAP_END_HEADER; return soap->header == NULL; } SOAP_FMAC3 void SOAP_FMAC4 soap_header(struct soap *soap) { if (!soap->header) { if ((soap->header = (struct SOAP_ENV__Header*)soap_malloc(soap, sizeof(struct SOAP_ENV__Header)))) soap_default_SOAP_ENV__Header(soap, soap->header); } } SOAP_FMAC3 void SOAP_FMAC4 soap_fault(struct soap *soap) { if (!soap->fault) { soap->fault = (struct SOAP_ENV__Fault*)soap_malloc(soap, sizeof(struct SOAP_ENV__Fault)); if (!soap->fault) return; soap_default_SOAP_ENV__Fault(soap, soap->fault); } if (soap->version == 2 && !soap->fault->SOAP_ENV__Code) { soap->fault->SOAP_ENV__Code = (struct SOAP_ENV__Code*)soap_malloc(soap, sizeof(struct SOAP_ENV__Code)); soap_default_SOAP_ENV__Code(soap, soap->fault->SOAP_ENV__Code); } if (soap->version == 2 && !soap->fault->SOAP_ENV__Reason) { soap->fault->SOAP_ENV__Reason = (struct SOAP_ENV__Reason*)soap_malloc(soap, sizeof(struct SOAP_ENV__Reason)); soap_default_SOAP_ENV__Reason(soap, soap->fault->SOAP_ENV__Reason); } } SOAP_FMAC3 void SOAP_FMAC4 soap_serializefault(struct soap *soap) { if (soap->fault) soap_serialize_SOAP_ENV__Fault(soap, soap->fault); } SOAP_FMAC3 int SOAP_FMAC4 soap_putfault(struct soap *soap) { if (soap->fault) return soap_put_SOAP_ENV__Fault(soap, soap->fault, "SOAP-ENV:Fault", NULL); return SOAP_OK; } SOAP_FMAC3 int SOAP_FMAC4 soap_getfault(struct soap *soap) { return (soap->fault = soap_get_SOAP_ENV__Fault(soap, NULL, "SOAP-ENV:Fault", NULL)) == NULL; } SOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultcode(struct soap *soap) { soap_fault(soap); if (soap->version == 2 && soap->fault->SOAP_ENV__Code) return (const char**)&soap->fault->SOAP_ENV__Code->SOAP_ENV__Value; return (const char**)&soap->fault->faultcode; } SOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultsubcode(struct soap *soap) { soap_fault(soap); if (soap->version == 2) { if (!soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode) { soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode = (struct SOAP_ENV__Code*)soap_malloc(soap, sizeof(struct SOAP_ENV__Code)); soap_default_SOAP_ENV__Code(soap, soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode); } return (const char**)&soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode->SOAP_ENV__Value; } return (const char**)&soap->fault->faultcode; } SOAP_FMAC3 const char * SOAP_FMAC4 soap_check_faultsubcode(struct soap *soap) { soap_fault(soap); if (soap->version == 2) { if (soap->fault->SOAP_ENV__Code && soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode && soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode) return soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode->SOAP_ENV__Value; return NULL; } return soap->fault->faultcode; } SOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultstring(struct soap *soap) { soap_fault(soap); if (soap->version == 2) return (const char**)&soap->fault->SOAP_ENV__Reason->SOAP_ENV__Text; return (const char**)&soap->fault->faultstring; } SOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultdetail(struct soap *soap) { soap_fault(soap); if (soap->version == 1) { if (!soap->fault->detail) { soap->fault->detail = (struct SOAP_ENV__Detail*)soap_malloc(soap, sizeof(struct SOAP_ENV__Detail)); soap_default_SOAP_ENV__Detail(soap, soap->fault->detail); } return (const char**)&soap->fault->detail->__any; } if (!soap->fault->SOAP_ENV__Detail) { soap->fault->SOAP_ENV__Detail = (struct SOAP_ENV__Detail*)soap_malloc(soap, sizeof(struct SOAP_ENV__Detail)); soap_default_SOAP_ENV__Detail(soap, soap->fault->SOAP_ENV__Detail); } return (const char**)&soap->fault->SOAP_ENV__Detail->__any; } SOAP_FMAC3 const char * SOAP_FMAC4 soap_check_faultdetail(struct soap *soap) { soap_fault(soap); if (soap->version == 2 && soap->fault->SOAP_ENV__Detail) return soap->fault->SOAP_ENV__Detail->__any; if (soap->fault->detail) return soap->fault->detail->__any; return NULL; } #endif #ifndef WITH_NOIDREF SOAP_FMAC3 int SOAP_FMAC4 soap_getindependent(struct soap *soap) { int t; if (soap->version == 1) { for (;;) { if (!soap_getelement(soap, &t)) if (soap->error || soap_ignore_element(soap)) break; } } if (soap->error == SOAP_NO_TAG || soap->error == SOAP_EOF) soap->error = SOAP_OK; return soap->error; } #endif #ifndef WITH_NOIDREF SOAP_FMAC3 void * SOAP_FMAC4 soap_getelement(struct soap *soap, int *type) { (void)type; if (soap_peek_element(soap)) return NULL; if (!*soap->id || !(*type = soap_lookup_type(soap, soap->id))) *type = soap_lookup_type(soap, soap->href); switch (*type) { case SOAP_TYPE_byte: return soap_in_byte(soap, NULL, NULL, "xsd:byte"); case SOAP_TYPE_int: return soap_in_int(soap, NULL, NULL, "xsd:int"); case SOAP_TYPE_double: return soap_in_double(soap, NULL, NULL, "xsd:double"); case SOAP_TYPE_ns2__pow: return soap_in_ns2__pow(soap, NULL, NULL, "ns2:pow"); case SOAP_TYPE_ns2__powResponse: return soap_in_ns2__powResponse(soap, NULL, NULL, "ns2:powResponse"); case SOAP_TYPE_ns2__div: return soap_in_ns2__div(soap, NULL, NULL, "ns2:div"); case SOAP_TYPE_ns2__divResponse: return soap_in_ns2__divResponse(soap, NULL, NULL, "ns2:divResponse"); case SOAP_TYPE_ns2__mul: return soap_in_ns2__mul(soap, NULL, NULL, "ns2:mul"); case SOAP_TYPE_ns2__mulResponse: return soap_in_ns2__mulResponse(soap, NULL, NULL, "ns2:mulResponse"); case SOAP_TYPE_ns2__sub: return soap_in_ns2__sub(soap, NULL, NULL, "ns2:sub"); case SOAP_TYPE_ns2__subResponse: return soap_in_ns2__subResponse(soap, NULL, NULL, "ns2:subResponse"); case SOAP_TYPE_ns2__add: return soap_in_ns2__add(soap, NULL, NULL, "ns2:add"); case SOAP_TYPE_ns2__addResponse: return soap_in_ns2__addResponse(soap, NULL, NULL, "ns2:addResponse"); case SOAP_TYPE_PointerTodouble: return soap_in_PointerTodouble(soap, NULL, NULL, "xsd:double"); case SOAP_TYPE__QName: { char **s; s = soap_in__QName(soap, NULL, NULL, "xsd:QName"); return s ? *s : NULL; } case SOAP_TYPE_string: { char **s; s = soap_in_string(soap, NULL, NULL, "xsd:string"); return s ? *s : NULL; } default: { const char *t = soap->type; if (!*t) t = soap->tag; if (!soap_match_tag(soap, t, "xsd:byte")) { *type = SOAP_TYPE_byte; return soap_in_byte(soap, NULL, NULL, NULL); } if (!soap_match_tag(soap, t, "xsd:int")) { *type = SOAP_TYPE_int; return soap_in_int(soap, NULL, NULL, NULL); } if (!soap_match_tag(soap, t, "xsd:double")) { *type = SOAP_TYPE_double; return soap_in_double(soap, NULL, NULL, NULL); } if (!soap_match_tag(soap, t, "ns2:pow")) { *type = SOAP_TYPE_ns2__pow; return soap_in_ns2__pow(soap, NULL, NULL, NULL); } if (!soap_match_tag(soap, t, "ns2:powResponse")) { *type = SOAP_TYPE_ns2__powResponse; return soap_in_ns2__powResponse(soap, NULL, NULL, NULL); } if (!soap_match_tag(soap, t, "ns2:div")) { *type = SOAP_TYPE_ns2__div; return soap_in_ns2__div(soap, NULL, NULL, NULL); } if (!soap_match_tag(soap, t, "ns2:divResponse")) { *type = SOAP_TYPE_ns2__divResponse; return soap_in_ns2__divResponse(soap, NULL, NULL, NULL); } if (!soap_match_tag(soap, t, "ns2:mul")) { *type = SOAP_TYPE_ns2__mul; return soap_in_ns2__mul(soap, NULL, NULL, NULL); } if (!soap_match_tag(soap, t, "ns2:mulResponse")) { *type = SOAP_TYPE_ns2__mulResponse; return soap_in_ns2__mulResponse(soap, NULL, NULL, NULL); } if (!soap_match_tag(soap, t, "ns2:sub")) { *type = SOAP_TYPE_ns2__sub; return soap_in_ns2__sub(soap, NULL, NULL, NULL); } if (!soap_match_tag(soap, t, "ns2:subResponse")) { *type = SOAP_TYPE_ns2__subResponse; return soap_in_ns2__subResponse(soap, NULL, NULL, NULL); } if (!soap_match_tag(soap, t, "ns2:add")) { *type = SOAP_TYPE_ns2__add; return soap_in_ns2__add(soap, NULL, NULL, NULL); } if (!soap_match_tag(soap, t, "ns2:addResponse")) { *type = SOAP_TYPE_ns2__addResponse; return soap_in_ns2__addResponse(soap, NULL, NULL, NULL); } if (!soap_match_tag(soap, t, "xsd:QName")) { char **s; *type = SOAP_TYPE__QName; s = soap_in__QName(soap, NULL, NULL, NULL); return s ? *s : NULL; } if (!soap_match_tag(soap, t, "xsd:string")) { char **s; *type = SOAP_TYPE_string; s = soap_in_string(soap, NULL, NULL, NULL); return s ? *s : NULL; } t = soap->tag; } } soap->error = SOAP_TAG_MISMATCH; return NULL; } #endif SOAP_FMAC3 int SOAP_FMAC4 soap_ignore_element(struct soap *soap) { if (!soap_peek_element(soap)) { int t; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unexpected element '%s' in input (level=%u, %d)\n", soap->tag, soap->level, soap->body)); if (soap->mustUnderstand && !soap->other) return soap->error = SOAP_MUSTUNDERSTAND; if (((soap->mode & SOAP_XML_STRICT) && soap->part != SOAP_IN_HEADER) || !soap_match_tag(soap, soap->tag, "SOAP-ENV:")) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "REJECTING element '%s'\n", soap->tag)); return soap->error = SOAP_TAG_MISMATCH; } if (!*soap->id || !soap_getelement(soap, &t)) { soap->peeked = 0; if (soap->fignore) soap->error = soap->fignore(soap, soap->tag); else soap->error = SOAP_OK; DBGLOG(TEST, if (!soap->error) SOAP_MESSAGE(fdebug, "IGNORING element '%s'\n", soap->tag)); if (!soap->error && soap->body) { soap->level++; while (!soap_ignore_element(soap)) ; if (soap->error == SOAP_NO_TAG) soap->error = soap_element_end_in(soap, NULL); } } } return soap->error; } #ifndef WITH_NOIDREF SOAP_FMAC3 int SOAP_FMAC4 soap_putindependent(struct soap *soap) { int i; struct soap_plist *pp; if (soap->version == 1 && soap->encodingStyle && !(soap->mode & (SOAP_XML_TREE | SOAP_XML_GRAPH))) for (i = 0; i < SOAP_PTRHASH; i++) for (pp = soap->pht[i]; pp; pp = pp->next) if (pp->mark1 == 2 || pp->mark2 == 2) if (soap_putelement(soap, pp->ptr, "id", pp->id, pp->type)) return soap->error; return SOAP_OK; } #endif #ifndef WITH_NOIDREF SOAP_FMAC3 int SOAP_FMAC4 soap_putelement(struct soap *soap, const void *ptr, const char *tag, int id, int type) { (void)tag; switch (type) { case SOAP_TYPE_byte: return soap_out_byte(soap, tag, id, (const char *)ptr, "xsd:byte"); case SOAP_TYPE_int: return soap_out_int(soap, tag, id, (const int *)ptr, "xsd:int"); case SOAP_TYPE_double: return soap_out_double(soap, tag, id, (const double *)ptr, "xsd:double"); case SOAP_TYPE_ns2__pow: return soap_out_ns2__pow(soap, tag, id, (const struct ns2__pow *)ptr, "ns2:pow"); case SOAP_TYPE_ns2__powResponse: return soap_out_ns2__powResponse(soap, tag, id, (const struct ns2__powResponse *)ptr, "ns2:powResponse"); case SOAP_TYPE_ns2__div: return soap_out_ns2__div(soap, tag, id, (const struct ns2__div *)ptr, "ns2:div"); case SOAP_TYPE_ns2__divResponse: return soap_out_ns2__divResponse(soap, tag, id, (const struct ns2__divResponse *)ptr, "ns2:divResponse"); case SOAP_TYPE_ns2__mul: return soap_out_ns2__mul(soap, tag, id, (const struct ns2__mul *)ptr, "ns2:mul"); case SOAP_TYPE_ns2__mulResponse: return soap_out_ns2__mulResponse(soap, tag, id, (const struct ns2__mulResponse *)ptr, "ns2:mulResponse"); case SOAP_TYPE_ns2__sub: return soap_out_ns2__sub(soap, tag, id, (const struct ns2__sub *)ptr, "ns2:sub"); case SOAP_TYPE_ns2__subResponse: return soap_out_ns2__subResponse(soap, tag, id, (const struct ns2__subResponse *)ptr, "ns2:subResponse"); case SOAP_TYPE_ns2__add: return soap_out_ns2__add(soap, tag, id, (const struct ns2__add *)ptr, "ns2:add"); case SOAP_TYPE_ns2__addResponse: return soap_out_ns2__addResponse(soap, tag, id, (const struct ns2__addResponse *)ptr, "ns2:addResponse"); case SOAP_TYPE_PointerTodouble: return soap_out_PointerTodouble(soap, tag, id, (double *const*)ptr, "xsd:double"); case SOAP_TYPE__QName: return soap_out_string(soap, tag, id, (char*const*)&ptr, "xsd:QName"); case SOAP_TYPE_string: return soap_out_string(soap, tag, id, (char*const*)&ptr, "xsd:string"); } return SOAP_OK; } #endif #ifndef WITH_NOIDREF SOAP_FMAC3 void SOAP_FMAC4 soap_markelement(struct soap *soap, const void *ptr, int type) { (void)soap; (void)ptr; (void)type; /* appease -Wall -Werror */ switch (type) { case SOAP_TYPE_ns2__pow: soap_serialize_ns2__pow(soap, (const struct ns2__pow *)ptr); break; case SOAP_TYPE_ns2__powResponse: soap_serialize_ns2__powResponse(soap, (const struct ns2__powResponse *)ptr); break; case SOAP_TYPE_ns2__div: soap_serialize_ns2__div(soap, (const struct ns2__div *)ptr); break; case SOAP_TYPE_ns2__divResponse: soap_serialize_ns2__divResponse(soap, (const struct ns2__divResponse *)ptr); break; case SOAP_TYPE_ns2__mul: soap_serialize_ns2__mul(soap, (const struct ns2__mul *)ptr); break; case SOAP_TYPE_ns2__mulResponse: soap_serialize_ns2__mulResponse(soap, (const struct ns2__mulResponse *)ptr); break; case SOAP_TYPE_ns2__sub: soap_serialize_ns2__sub(soap, (const struct ns2__sub *)ptr); break; case SOAP_TYPE_ns2__subResponse: soap_serialize_ns2__subResponse(soap, (const struct ns2__subResponse *)ptr); break; case SOAP_TYPE_ns2__add: soap_serialize_ns2__add(soap, (const struct ns2__add *)ptr); break; case SOAP_TYPE_ns2__addResponse: soap_serialize_ns2__addResponse(soap, (const struct ns2__addResponse *)ptr); break; case SOAP_TYPE_PointerTodouble: soap_serialize_PointerTodouble(soap, (double *const*)ptr); break; case SOAP_TYPE__QName: soap_serialize_string(soap, (char*const*)&ptr); break; case SOAP_TYPE_string: soap_serialize_string(soap, (char*const*)&ptr); break; } } #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_byte(struct soap *soap, char *a) { (void)soap; /* appease -Wall -Werror */ #ifdef SOAP_DEFAULT_byte *a = SOAP_DEFAULT_byte; #else *a = (char)0; #endif } SOAP_FMAC3 int SOAP_FMAC4 soap_out_byte(struct soap *soap, const char *tag, int id, const char *a, const char *type) { (void)soap; (void)type; (void)tag; (void)id; return soap_outbyte(soap, tag, id, a, type, SOAP_TYPE_byte); } SOAP_FMAC3 char * SOAP_FMAC4 soap_in_byte(struct soap *soap, const char *tag, char *a, const char *type) { char *p; p = soap_inbyte(soap, tag, a, type, SOAP_TYPE_byte); return p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_byte(struct soap *soap, const char *a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_byte); if (soap_out_byte(soap, tag?tag:"byte", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 char * SOAP_FMAC4 soap_get_byte(struct soap *soap, char *p, const char *tag, const char *type) { if ((p = soap_in_byte(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC3 void SOAP_FMAC4 soap_default_int(struct soap *soap, int *a) { (void)soap; /* appease -Wall -Werror */ #ifdef SOAP_DEFAULT_int *a = SOAP_DEFAULT_int; #else *a = (int)0; #endif } SOAP_FMAC3 int SOAP_FMAC4 soap_out_int(struct soap *soap, const char *tag, int id, const int *a, const char *type) { (void)soap; (void)type; (void)tag; (void)id; return soap_outint(soap, tag, id, a, type, SOAP_TYPE_int); } SOAP_FMAC3 int * SOAP_FMAC4 soap_in_int(struct soap *soap, const char *tag, int *a, const char *type) { int *p; p = soap_inint(soap, tag, a, type, SOAP_TYPE_int); return p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_int(struct soap *soap, const int *a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_int); if (soap_out_int(soap, tag?tag:"int", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 int * SOAP_FMAC4 soap_get_int(struct soap *soap, int *p, const char *tag, const char *type) { if ((p = soap_in_int(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC3 void SOAP_FMAC4 soap_default_double(struct soap *soap, double *a) { (void)soap; /* appease -Wall -Werror */ #ifdef SOAP_DEFAULT_double *a = SOAP_DEFAULT_double; #else *a = (double)0; #endif } SOAP_FMAC3 int SOAP_FMAC4 soap_out_double(struct soap *soap, const char *tag, int id, const double *a, const char *type) { (void)soap; (void)type; (void)tag; (void)id; return soap_outdouble(soap, tag, id, a, type, SOAP_TYPE_double); } SOAP_FMAC3 double * SOAP_FMAC4 soap_in_double(struct soap *soap, const char *tag, double *a, const char *type) { double *p; p = soap_indouble(soap, tag, a, type, SOAP_TYPE_double); return p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_double(struct soap *soap, const double *a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_double); if (soap_out_double(soap, tag?tag:"double", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 double * SOAP_FMAC4 soap_get_double(struct soap *soap, double *p, const char *tag, const char *type) { if ((p = soap_in_double(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } #ifndef WITH_NOGLOBAL SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Fault(struct soap *soap, struct SOAP_ENV__Fault *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_default__QName(soap, &a->faultcode); soap_default_string(soap, &a->faultstring); soap_default_string(soap, &a->faultactor); a->detail = NULL; a->SOAP_ENV__Code = NULL; a->SOAP_ENV__Reason = NULL; soap_default_string(soap, &a->SOAP_ENV__Node); soap_default_string(soap, &a->SOAP_ENV__Role); a->SOAP_ENV__Detail = NULL; } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Fault(struct soap *soap, const struct SOAP_ENV__Fault *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_serialize__QName(soap, &a->faultcode); soap_serialize_string(soap, &a->faultstring); soap_serialize_string(soap, &a->faultactor); soap_serialize_PointerToSOAP_ENV__Detail(soap, &a->detail); soap_serialize_PointerToSOAP_ENV__Code(soap, &a->SOAP_ENV__Code); soap_serialize_PointerToSOAP_ENV__Reason(soap, &a->SOAP_ENV__Reason); soap_serialize_string(soap, &a->SOAP_ENV__Node); soap_serialize_string(soap, &a->SOAP_ENV__Role); soap_serialize_PointerToSOAP_ENV__Detail(soap, &a->SOAP_ENV__Detail); } SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Fault(struct soap *soap, const char *tag, int id, const struct SOAP_ENV__Fault *a, const char *type) { const char *soap_tmp_faultcode = soap_QName2s(soap, a->faultcode); (void)soap; (void)tag; (void)id; (void)type; if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_SOAP_ENV__Fault), type)) return soap->error; if (soap_out__QName(soap, "faultcode", -1, (char*const*)&soap_tmp_faultcode, "")) return soap->error; if (soap_out_string(soap, "faultstring", -1, &a->faultstring, "")) return soap->error; if (soap_out_string(soap, "faultactor", -1, &a->faultactor, "")) return soap->error; if (soap_out_PointerToSOAP_ENV__Detail(soap, "detail", -1, &a->detail, "")) return soap->error; if (soap_out_PointerToSOAP_ENV__Code(soap, "SOAP-ENV:Code", -1, &a->SOAP_ENV__Code, "")) return soap->error; if (soap_out_PointerToSOAP_ENV__Reason(soap, "SOAP-ENV:Reason", -1, &a->SOAP_ENV__Reason, "")) return soap->error; if (soap_out_string(soap, "SOAP-ENV:Node", -1, &a->SOAP_ENV__Node, "")) return soap->error; if (soap_out_string(soap, "SOAP-ENV:Role", -1, &a->SOAP_ENV__Role, "")) return soap->error; if (soap_out_PointerToSOAP_ENV__Detail(soap, "SOAP-ENV:Detail", -1, &a->SOAP_ENV__Detail, "")) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct SOAP_ENV__Fault * SOAP_FMAC4 soap_in_SOAP_ENV__Fault(struct soap *soap, const char *tag, struct SOAP_ENV__Fault *a, const char *type) { size_t soap_flag_faultcode = 1; size_t soap_flag_faultstring = 1; size_t soap_flag_faultactor = 1; size_t soap_flag_detail = 1; size_t soap_flag_SOAP_ENV__Code = 1; size_t soap_flag_SOAP_ENV__Reason = 1; size_t soap_flag_SOAP_ENV__Node = 1; size_t soap_flag_SOAP_ENV__Role = 1; size_t soap_flag_SOAP_ENV__Detail = 1; if (soap_element_begin_in(soap, tag, 0, type)) return NULL; a = (struct SOAP_ENV__Fault *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_SOAP_ENV__Fault, sizeof(struct SOAP_ENV__Fault), 0, NULL, NULL, NULL); if (!a) return NULL; soap_default_SOAP_ENV__Fault(soap, a); if (soap->body && !*soap->href) { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_faultcode && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) if (soap_in__QName(soap, "faultcode", &a->faultcode, "")) { soap_flag_faultcode--; continue; } if (soap_flag_faultstring && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) if (soap_in_string(soap, "faultstring", &a->faultstring, "xsd:string")) { soap_flag_faultstring--; continue; } if (soap_flag_faultactor && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) if (soap_in_string(soap, "faultactor", &a->faultactor, "xsd:string")) { soap_flag_faultactor--; continue; } if (soap_flag_detail && soap->error == SOAP_TAG_MISMATCH) if (soap_in_PointerToSOAP_ENV__Detail(soap, "detail", &a->detail, "")) { soap_flag_detail--; continue; } if (soap_flag_SOAP_ENV__Code && soap->error == SOAP_TAG_MISMATCH) if (soap_in_PointerToSOAP_ENV__Code(soap, "SOAP-ENV:Code", &a->SOAP_ENV__Code, "")) { soap_flag_SOAP_ENV__Code--; continue; } if (soap_flag_SOAP_ENV__Reason && soap->error == SOAP_TAG_MISMATCH) if (soap_in_PointerToSOAP_ENV__Reason(soap, "SOAP-ENV:Reason", &a->SOAP_ENV__Reason, "")) { soap_flag_SOAP_ENV__Reason--; continue; } if (soap_flag_SOAP_ENV__Node && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) if (soap_in_string(soap, "SOAP-ENV:Node", &a->SOAP_ENV__Node, "xsd:string")) { soap_flag_SOAP_ENV__Node--; continue; } if (soap_flag_SOAP_ENV__Role && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) if (soap_in_string(soap, "SOAP-ENV:Role", &a->SOAP_ENV__Role, "xsd:string")) { soap_flag_SOAP_ENV__Role--; continue; } if (soap_flag_SOAP_ENV__Detail && soap->error == SOAP_TAG_MISMATCH) if (soap_in_PointerToSOAP_ENV__Detail(soap, "SOAP-ENV:Detail", &a->SOAP_ENV__Detail, "")) { soap_flag_SOAP_ENV__Detail--; continue; } if (soap->error == SOAP_TAG_MISMATCH) soap->error = soap_ignore_element(soap); if (soap->error == SOAP_NO_TAG) break; if (soap->error) return NULL; } if (soap_element_end_in(soap, tag)) return NULL; } else { a = (struct SOAP_ENV__Fault *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_SOAP_ENV__Fault, 0, sizeof(struct SOAP_ENV__Fault), 0, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Fault(struct soap *soap, const struct SOAP_ENV__Fault *a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_SOAP_ENV__Fault); if (soap_out_SOAP_ENV__Fault(soap, tag?tag:"SOAP-ENV:Fault", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct SOAP_ENV__Fault * SOAP_FMAC4 soap_get_SOAP_ENV__Fault(struct soap *soap, struct SOAP_ENV__Fault *p, const char *tag, const char *type) { if ((p = soap_in_SOAP_ENV__Fault(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } #endif #ifndef WITH_NOGLOBAL SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Reason(struct soap *soap, struct SOAP_ENV__Reason *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_default_string(soap, &a->SOAP_ENV__Text); } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Reason(struct soap *soap, const struct SOAP_ENV__Reason *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_serialize_string(soap, &a->SOAP_ENV__Text); } SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Reason(struct soap *soap, const char *tag, int id, const struct SOAP_ENV__Reason *a, const char *type) { (void)soap; (void)tag; (void)id; (void)type; if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_SOAP_ENV__Reason), type)) return soap->error; if (soap->lang) soap_set_attr(soap, "xml:lang", soap->lang, 1); if (soap_out_string(soap, "SOAP-ENV:Text", -1, &a->SOAP_ENV__Text, "")) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct SOAP_ENV__Reason * SOAP_FMAC4 soap_in_SOAP_ENV__Reason(struct soap *soap, const char *tag, struct SOAP_ENV__Reason *a, const char *type) { size_t soap_flag_SOAP_ENV__Text = 1; if (soap_element_begin_in(soap, tag, 0, type)) return NULL; a = (struct SOAP_ENV__Reason *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_SOAP_ENV__Reason, sizeof(struct SOAP_ENV__Reason), 0, NULL, NULL, NULL); if (!a) return NULL; soap_default_SOAP_ENV__Reason(soap, a); if (soap->body && !*soap->href) { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_SOAP_ENV__Text && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) if (soap_in_string(soap, "SOAP-ENV:Text", &a->SOAP_ENV__Text, "xsd:string")) { soap_flag_SOAP_ENV__Text--; continue; } if (soap->error == SOAP_TAG_MISMATCH) soap->error = soap_ignore_element(soap); if (soap->error == SOAP_NO_TAG) break; if (soap->error) return NULL; } if (soap_element_end_in(soap, tag)) return NULL; } else { a = (struct SOAP_ENV__Reason *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_SOAP_ENV__Reason, 0, sizeof(struct SOAP_ENV__Reason), 0, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Reason(struct soap *soap, const struct SOAP_ENV__Reason *a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_SOAP_ENV__Reason); if (soap_out_SOAP_ENV__Reason(soap, tag?tag:"SOAP-ENV:Reason", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct SOAP_ENV__Reason * SOAP_FMAC4 soap_get_SOAP_ENV__Reason(struct soap *soap, struct SOAP_ENV__Reason *p, const char *tag, const char *type) { if ((p = soap_in_SOAP_ENV__Reason(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } #endif #ifndef WITH_NOGLOBAL SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Detail(struct soap *soap, struct SOAP_ENV__Detail *a) { (void)soap; (void)a; /* appease -Wall -Werror */ a->__any = NULL; a->__type = 0; a->fault = NULL; } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Detail(struct soap *soap, const struct SOAP_ENV__Detail *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_markelement(soap, a->fault, a->__type); } SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Detail(struct soap *soap, const char *tag, int id, const struct SOAP_ENV__Detail *a, const char *type) { (void)soap; (void)tag; (void)id; (void)type; if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_SOAP_ENV__Detail), type)) return soap->error; soap_outliteral(soap, "-any", &a->__any, NULL); if (soap_putelement(soap, a->fault, "fault", -1, a->__type)) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct SOAP_ENV__Detail * SOAP_FMAC4 soap_in_SOAP_ENV__Detail(struct soap *soap, const char *tag, struct SOAP_ENV__Detail *a, const char *type) { size_t soap_flag___any = 1; size_t soap_flag_fault = 1; if (soap_element_begin_in(soap, tag, 0, type)) return NULL; a = (struct SOAP_ENV__Detail *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_SOAP_ENV__Detail, sizeof(struct SOAP_ENV__Detail), 0, NULL, NULL, NULL); if (!a) return NULL; soap_default_SOAP_ENV__Detail(soap, a); if (soap->body && !*soap->href) { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_fault && soap->error == SOAP_TAG_MISMATCH) if ((a->fault = soap_getelement(soap, &a->__type))) { soap_flag_fault = 0; continue; } if (soap_flag___any && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) if (soap_inliteral(soap, "-any", &a->__any)) { soap_flag___any--; continue; } if (soap->error == SOAP_TAG_MISMATCH) soap->error = soap_ignore_element(soap); if (soap->error == SOAP_NO_TAG) break; if (soap->error) return NULL; } if (soap_element_end_in(soap, tag)) return NULL; } else { a = (struct SOAP_ENV__Detail *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_SOAP_ENV__Detail, 0, sizeof(struct SOAP_ENV__Detail), 0, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Detail(struct soap *soap, const struct SOAP_ENV__Detail *a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_SOAP_ENV__Detail); if (soap_out_SOAP_ENV__Detail(soap, tag?tag:"SOAP-ENV:Detail", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct SOAP_ENV__Detail * SOAP_FMAC4 soap_get_SOAP_ENV__Detail(struct soap *soap, struct SOAP_ENV__Detail *p, const char *tag, const char *type) { if ((p = soap_in_SOAP_ENV__Detail(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } #endif #ifndef WITH_NOGLOBAL SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Code(struct soap *soap, struct SOAP_ENV__Code *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_default__QName(soap, &a->SOAP_ENV__Value); a->SOAP_ENV__Subcode = NULL; } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Code(struct soap *soap, const struct SOAP_ENV__Code *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_serialize__QName(soap, &a->SOAP_ENV__Value); soap_serialize_PointerToSOAP_ENV__Code(soap, &a->SOAP_ENV__Subcode); } SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Code(struct soap *soap, const char *tag, int id, const struct SOAP_ENV__Code *a, const char *type) { const char *soap_tmp_SOAP_ENV__Value = soap_QName2s(soap, a->SOAP_ENV__Value); (void)soap; (void)tag; (void)id; (void)type; if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_SOAP_ENV__Code), type)) return soap->error; if (soap_out__QName(soap, "SOAP-ENV:Value", -1, (char*const*)&soap_tmp_SOAP_ENV__Value, "")) return soap->error; if (soap_out_PointerToSOAP_ENV__Code(soap, "SOAP-ENV:Subcode", -1, &a->SOAP_ENV__Subcode, "")) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct SOAP_ENV__Code * SOAP_FMAC4 soap_in_SOAP_ENV__Code(struct soap *soap, const char *tag, struct SOAP_ENV__Code *a, const char *type) { size_t soap_flag_SOAP_ENV__Value = 1; size_t soap_flag_SOAP_ENV__Subcode = 1; if (soap_element_begin_in(soap, tag, 0, type)) return NULL; a = (struct SOAP_ENV__Code *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_SOAP_ENV__Code, sizeof(struct SOAP_ENV__Code), 0, NULL, NULL, NULL); if (!a) return NULL; soap_default_SOAP_ENV__Code(soap, a); if (soap->body && !*soap->href) { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_SOAP_ENV__Value && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) if (soap_in__QName(soap, "SOAP-ENV:Value", &a->SOAP_ENV__Value, "")) { soap_flag_SOAP_ENV__Value--; continue; } if (soap_flag_SOAP_ENV__Subcode && soap->error == SOAP_TAG_MISMATCH) if (soap_in_PointerToSOAP_ENV__Code(soap, "SOAP-ENV:Subcode", &a->SOAP_ENV__Subcode, "")) { soap_flag_SOAP_ENV__Subcode--; continue; } if (soap->error == SOAP_TAG_MISMATCH) soap->error = soap_ignore_element(soap); if (soap->error == SOAP_NO_TAG) break; if (soap->error) return NULL; } if (soap_element_end_in(soap, tag)) return NULL; } else { a = (struct SOAP_ENV__Code *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_SOAP_ENV__Code, 0, sizeof(struct SOAP_ENV__Code), 0, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Code(struct soap *soap, const struct SOAP_ENV__Code *a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_SOAP_ENV__Code); if (soap_out_SOAP_ENV__Code(soap, tag?tag:"SOAP-ENV:Code", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct SOAP_ENV__Code * SOAP_FMAC4 soap_get_SOAP_ENV__Code(struct soap *soap, struct SOAP_ENV__Code *p, const char *tag, const char *type) { if ((p = soap_in_SOAP_ENV__Code(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } #endif #ifndef WITH_NOGLOBAL SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Header(struct soap *soap, struct SOAP_ENV__Header *a) { (void)soap; (void)a; /* appease -Wall -Werror */ } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Header(struct soap *soap, const struct SOAP_ENV__Header *a) { (void)soap; (void)a; /* appease -Wall -Werror */ } SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Header(struct soap *soap, const char *tag, int id, const struct SOAP_ENV__Header *a, const char *type) { (void)soap; (void)tag; (void)id; (void)type; if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_SOAP_ENV__Header), type)) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct SOAP_ENV__Header * SOAP_FMAC4 soap_in_SOAP_ENV__Header(struct soap *soap, const char *tag, struct SOAP_ENV__Header *a, const char *type) { if (soap_element_begin_in(soap, tag, 0, type)) return NULL; a = (struct SOAP_ENV__Header *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_SOAP_ENV__Header, sizeof(struct SOAP_ENV__Header), 0, NULL, NULL, NULL); if (!a) return NULL; soap_default_SOAP_ENV__Header(soap, a); if (soap->body && !*soap->href) { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap->error == SOAP_TAG_MISMATCH) soap->error = soap_ignore_element(soap); if (soap->error == SOAP_NO_TAG) break; if (soap->error) return NULL; } if (soap_element_end_in(soap, tag)) return NULL; } else { a = (struct SOAP_ENV__Header *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_SOAP_ENV__Header, 0, sizeof(struct SOAP_ENV__Header), 0, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Header(struct soap *soap, const struct SOAP_ENV__Header *a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_SOAP_ENV__Header); if (soap_out_SOAP_ENV__Header(soap, tag?tag:"SOAP-ENV:Header", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct SOAP_ENV__Header * SOAP_FMAC4 soap_get_SOAP_ENV__Header(struct soap *soap, struct SOAP_ENV__Header *p, const char *tag, const char *type) { if ((p = soap_in_SOAP_ENV__Header(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns2__pow(struct soap *soap, struct ns2__pow *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_default_double(soap, &a->a); soap_default_double(soap, &a->b); } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns2__pow(struct soap *soap, const struct ns2__pow *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_embedded(soap, &a->a, SOAP_TYPE_double); soap_embedded(soap, &a->b, SOAP_TYPE_double); } SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns2__pow(struct soap *soap, const char *tag, int id, const struct ns2__pow *a, const char *type) { (void)soap; (void)tag; (void)id; (void)type; if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns2__pow), type)) return soap->error; if (soap_out_double(soap, "a", -1, &a->a, "")) return soap->error; if (soap_out_double(soap, "b", -1, &a->b, "")) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct ns2__pow * SOAP_FMAC4 soap_in_ns2__pow(struct soap *soap, const char *tag, struct ns2__pow *a, const char *type) { size_t soap_flag_a = 1; size_t soap_flag_b = 1; if (soap_element_begin_in(soap, tag, 0, type)) return NULL; a = (struct ns2__pow *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns2__pow, sizeof(struct ns2__pow), 0, NULL, NULL, NULL); if (!a) return NULL; soap_default_ns2__pow(soap, a); if (soap->body && !*soap->href) { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_a && soap->error == SOAP_TAG_MISMATCH) if (soap_in_double(soap, "a", &a->a, "xsd:double")) { soap_flag_a--; continue; } if (soap_flag_b && soap->error == SOAP_TAG_MISMATCH) if (soap_in_double(soap, "b", &a->b, "xsd:double")) { soap_flag_b--; continue; } if (soap->error == SOAP_TAG_MISMATCH) soap->error = soap_ignore_element(soap); if (soap->error == SOAP_NO_TAG) break; if (soap->error) return NULL; } if (soap_element_end_in(soap, tag)) return NULL; } else { a = (struct ns2__pow *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns2__pow, 0, sizeof(struct ns2__pow), 0, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_a > 0 || soap_flag_b > 0)) { soap->error = SOAP_OCCURS; return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns2__pow(struct soap *soap, const struct ns2__pow *a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_ns2__pow); if (soap_out_ns2__pow(soap, tag?tag:"ns2:pow", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct ns2__pow * SOAP_FMAC4 soap_get_ns2__pow(struct soap *soap, struct ns2__pow *p, const char *tag, const char *type) { if ((p = soap_in_ns2__pow(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns2__powResponse(struct soap *soap, struct ns2__powResponse *a) { (void)soap; (void)a; /* appease -Wall -Werror */ a->result = NULL; } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns2__powResponse(struct soap *soap, const struct ns2__powResponse *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_serialize_PointerTodouble(soap, &a->result); } SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns2__powResponse(struct soap *soap, const char *tag, int id, const struct ns2__powResponse *a, const char *type) { (void)soap; (void)tag; (void)id; (void)type; if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns2__powResponse), type)) return soap->error; if (soap_out_PointerTodouble(soap, "result", -1, &a->result, "")) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct ns2__powResponse * SOAP_FMAC4 soap_in_ns2__powResponse(struct soap *soap, const char *tag, struct ns2__powResponse *a, const char *type) { size_t soap_flag_result = 1; if (soap_element_begin_in(soap, tag, 0, type)) return NULL; a = (struct ns2__powResponse *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns2__powResponse, sizeof(struct ns2__powResponse), 0, NULL, NULL, NULL); if (!a) return NULL; soap_default_ns2__powResponse(soap, a); if (soap->body && !*soap->href) { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_result && soap->error == SOAP_TAG_MISMATCH) if (soap_in_PointerTodouble(soap, "result", &a->result, "xsd:double")) { soap_flag_result--; continue; } if (soap->error == SOAP_TAG_MISMATCH) soap->error = soap_ignore_element(soap); if (soap->error == SOAP_NO_TAG) break; if (soap->error) return NULL; } if (soap_element_end_in(soap, tag)) return NULL; } else { a = (struct ns2__powResponse *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns2__powResponse, 0, sizeof(struct ns2__powResponse), 0, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns2__powResponse(struct soap *soap, const struct ns2__powResponse *a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_ns2__powResponse); if (soap_out_ns2__powResponse(soap, tag?tag:"ns2:powResponse", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct ns2__powResponse * SOAP_FMAC4 soap_get_ns2__powResponse(struct soap *soap, struct ns2__powResponse *p, const char *tag, const char *type) { if ((p = soap_in_ns2__powResponse(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns2__div(struct soap *soap, struct ns2__div *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_default_double(soap, &a->a); soap_default_double(soap, &a->b); } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns2__div(struct soap *soap, const struct ns2__div *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_embedded(soap, &a->a, SOAP_TYPE_double); soap_embedded(soap, &a->b, SOAP_TYPE_double); } SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns2__div(struct soap *soap, const char *tag, int id, const struct ns2__div *a, const char *type) { (void)soap; (void)tag; (void)id; (void)type; if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns2__div), type)) return soap->error; if (soap_out_double(soap, "a", -1, &a->a, "")) return soap->error; if (soap_out_double(soap, "b", -1, &a->b, "")) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct ns2__div * SOAP_FMAC4 soap_in_ns2__div(struct soap *soap, const char *tag, struct ns2__div *a, const char *type) { size_t soap_flag_a = 1; size_t soap_flag_b = 1; if (soap_element_begin_in(soap, tag, 0, type)) return NULL; a = (struct ns2__div *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns2__div, sizeof(struct ns2__div), 0, NULL, NULL, NULL); if (!a) return NULL; soap_default_ns2__div(soap, a); if (soap->body && !*soap->href) { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_a && soap->error == SOAP_TAG_MISMATCH) if (soap_in_double(soap, "a", &a->a, "xsd:double")) { soap_flag_a--; continue; } if (soap_flag_b && soap->error == SOAP_TAG_MISMATCH) if (soap_in_double(soap, "b", &a->b, "xsd:double")) { soap_flag_b--; continue; } if (soap->error == SOAP_TAG_MISMATCH) soap->error = soap_ignore_element(soap); if (soap->error == SOAP_NO_TAG) break; if (soap->error) return NULL; } if (soap_element_end_in(soap, tag)) return NULL; } else { a = (struct ns2__div *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns2__div, 0, sizeof(struct ns2__div), 0, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_a > 0 || soap_flag_b > 0)) { soap->error = SOAP_OCCURS; return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns2__div(struct soap *soap, const struct ns2__div *a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_ns2__div); if (soap_out_ns2__div(soap, tag?tag:"ns2:div", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct ns2__div * SOAP_FMAC4 soap_get_ns2__div(struct soap *soap, struct ns2__div *p, const char *tag, const char *type) { if ((p = soap_in_ns2__div(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns2__divResponse(struct soap *soap, struct ns2__divResponse *a) { (void)soap; (void)a; /* appease -Wall -Werror */ a->result = NULL; } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns2__divResponse(struct soap *soap, const struct ns2__divResponse *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_serialize_PointerTodouble(soap, &a->result); } SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns2__divResponse(struct soap *soap, const char *tag, int id, const struct ns2__divResponse *a, const char *type) { (void)soap; (void)tag; (void)id; (void)type; if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns2__divResponse), type)) return soap->error; if (soap_out_PointerTodouble(soap, "result", -1, &a->result, "")) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct ns2__divResponse * SOAP_FMAC4 soap_in_ns2__divResponse(struct soap *soap, const char *tag, struct ns2__divResponse *a, const char *type) { size_t soap_flag_result = 1; if (soap_element_begin_in(soap, tag, 0, type)) return NULL; a = (struct ns2__divResponse *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns2__divResponse, sizeof(struct ns2__divResponse), 0, NULL, NULL, NULL); if (!a) return NULL; soap_default_ns2__divResponse(soap, a); if (soap->body && !*soap->href) { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_result && soap->error == SOAP_TAG_MISMATCH) if (soap_in_PointerTodouble(soap, "result", &a->result, "xsd:double")) { soap_flag_result--; continue; } if (soap->error == SOAP_TAG_MISMATCH) soap->error = soap_ignore_element(soap); if (soap->error == SOAP_NO_TAG) break; if (soap->error) return NULL; } if (soap_element_end_in(soap, tag)) return NULL; } else { a = (struct ns2__divResponse *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns2__divResponse, 0, sizeof(struct ns2__divResponse), 0, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns2__divResponse(struct soap *soap, const struct ns2__divResponse *a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_ns2__divResponse); if (soap_out_ns2__divResponse(soap, tag?tag:"ns2:divResponse", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct ns2__divResponse * SOAP_FMAC4 soap_get_ns2__divResponse(struct soap *soap, struct ns2__divResponse *p, const char *tag, const char *type) { if ((p = soap_in_ns2__divResponse(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns2__mul(struct soap *soap, struct ns2__mul *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_default_double(soap, &a->a); soap_default_double(soap, &a->b); } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns2__mul(struct soap *soap, const struct ns2__mul *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_embedded(soap, &a->a, SOAP_TYPE_double); soap_embedded(soap, &a->b, SOAP_TYPE_double); } SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns2__mul(struct soap *soap, const char *tag, int id, const struct ns2__mul *a, const char *type) { (void)soap; (void)tag; (void)id; (void)type; if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns2__mul), type)) return soap->error; if (soap_out_double(soap, "a", -1, &a->a, "")) return soap->error; if (soap_out_double(soap, "b", -1, &a->b, "")) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct ns2__mul * SOAP_FMAC4 soap_in_ns2__mul(struct soap *soap, const char *tag, struct ns2__mul *a, const char *type) { size_t soap_flag_a = 1; size_t soap_flag_b = 1; if (soap_element_begin_in(soap, tag, 0, type)) return NULL; a = (struct ns2__mul *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns2__mul, sizeof(struct ns2__mul), 0, NULL, NULL, NULL); if (!a) return NULL; soap_default_ns2__mul(soap, a); if (soap->body && !*soap->href) { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_a && soap->error == SOAP_TAG_MISMATCH) if (soap_in_double(soap, "a", &a->a, "xsd:double")) { soap_flag_a--; continue; } if (soap_flag_b && soap->error == SOAP_TAG_MISMATCH) if (soap_in_double(soap, "b", &a->b, "xsd:double")) { soap_flag_b--; continue; } if (soap->error == SOAP_TAG_MISMATCH) soap->error = soap_ignore_element(soap); if (soap->error == SOAP_NO_TAG) break; if (soap->error) return NULL; } if (soap_element_end_in(soap, tag)) return NULL; } else { a = (struct ns2__mul *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns2__mul, 0, sizeof(struct ns2__mul), 0, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_a > 0 || soap_flag_b > 0)) { soap->error = SOAP_OCCURS; return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns2__mul(struct soap *soap, const struct ns2__mul *a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_ns2__mul); if (soap_out_ns2__mul(soap, tag?tag:"ns2:mul", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct ns2__mul * SOAP_FMAC4 soap_get_ns2__mul(struct soap *soap, struct ns2__mul *p, const char *tag, const char *type) { if ((p = soap_in_ns2__mul(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns2__mulResponse(struct soap *soap, struct ns2__mulResponse *a) { (void)soap; (void)a; /* appease -Wall -Werror */ a->result = NULL; } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns2__mulResponse(struct soap *soap, const struct ns2__mulResponse *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_serialize_PointerTodouble(soap, &a->result); } SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns2__mulResponse(struct soap *soap, const char *tag, int id, const struct ns2__mulResponse *a, const char *type) { (void)soap; (void)tag; (void)id; (void)type; if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns2__mulResponse), type)) return soap->error; if (soap_out_PointerTodouble(soap, "result", -1, &a->result, "")) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct ns2__mulResponse * SOAP_FMAC4 soap_in_ns2__mulResponse(struct soap *soap, const char *tag, struct ns2__mulResponse *a, const char *type) { size_t soap_flag_result = 1; if (soap_element_begin_in(soap, tag, 0, type)) return NULL; a = (struct ns2__mulResponse *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns2__mulResponse, sizeof(struct ns2__mulResponse), 0, NULL, NULL, NULL); if (!a) return NULL; soap_default_ns2__mulResponse(soap, a); if (soap->body && !*soap->href) { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_result && soap->error == SOAP_TAG_MISMATCH) if (soap_in_PointerTodouble(soap, "result", &a->result, "xsd:double")) { soap_flag_result--; continue; } if (soap->error == SOAP_TAG_MISMATCH) soap->error = soap_ignore_element(soap); if (soap->error == SOAP_NO_TAG) break; if (soap->error) return NULL; } if (soap_element_end_in(soap, tag)) return NULL; } else { a = (struct ns2__mulResponse *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns2__mulResponse, 0, sizeof(struct ns2__mulResponse), 0, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns2__mulResponse(struct soap *soap, const struct ns2__mulResponse *a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_ns2__mulResponse); if (soap_out_ns2__mulResponse(soap, tag?tag:"ns2:mulResponse", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct ns2__mulResponse * SOAP_FMAC4 soap_get_ns2__mulResponse(struct soap *soap, struct ns2__mulResponse *p, const char *tag, const char *type) { if ((p = soap_in_ns2__mulResponse(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns2__sub(struct soap *soap, struct ns2__sub *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_default_double(soap, &a->a); soap_default_double(soap, &a->b); } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns2__sub(struct soap *soap, const struct ns2__sub *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_embedded(soap, &a->a, SOAP_TYPE_double); soap_embedded(soap, &a->b, SOAP_TYPE_double); } SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns2__sub(struct soap *soap, const char *tag, int id, const struct ns2__sub *a, const char *type) { (void)soap; (void)tag; (void)id; (void)type; if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns2__sub), type)) return soap->error; if (soap_out_double(soap, "a", -1, &a->a, "")) return soap->error; if (soap_out_double(soap, "b", -1, &a->b, "")) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct ns2__sub * SOAP_FMAC4 soap_in_ns2__sub(struct soap *soap, const char *tag, struct ns2__sub *a, const char *type) { size_t soap_flag_a = 1; size_t soap_flag_b = 1; if (soap_element_begin_in(soap, tag, 0, type)) return NULL; a = (struct ns2__sub *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns2__sub, sizeof(struct ns2__sub), 0, NULL, NULL, NULL); if (!a) return NULL; soap_default_ns2__sub(soap, a); if (soap->body && !*soap->href) { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_a && soap->error == SOAP_TAG_MISMATCH) if (soap_in_double(soap, "a", &a->a, "xsd:double")) { soap_flag_a--; continue; } if (soap_flag_b && soap->error == SOAP_TAG_MISMATCH) if (soap_in_double(soap, "b", &a->b, "xsd:double")) { soap_flag_b--; continue; } if (soap->error == SOAP_TAG_MISMATCH) soap->error = soap_ignore_element(soap); if (soap->error == SOAP_NO_TAG) break; if (soap->error) return NULL; } if (soap_element_end_in(soap, tag)) return NULL; } else { a = (struct ns2__sub *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns2__sub, 0, sizeof(struct ns2__sub), 0, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_a > 0 || soap_flag_b > 0)) { soap->error = SOAP_OCCURS; return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns2__sub(struct soap *soap, const struct ns2__sub *a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_ns2__sub); if (soap_out_ns2__sub(soap, tag?tag:"ns2:sub", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct ns2__sub * SOAP_FMAC4 soap_get_ns2__sub(struct soap *soap, struct ns2__sub *p, const char *tag, const char *type) { if ((p = soap_in_ns2__sub(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns2__subResponse(struct soap *soap, struct ns2__subResponse *a) { (void)soap; (void)a; /* appease -Wall -Werror */ a->result = NULL; } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns2__subResponse(struct soap *soap, const struct ns2__subResponse *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_serialize_PointerTodouble(soap, &a->result); } SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns2__subResponse(struct soap *soap, const char *tag, int id, const struct ns2__subResponse *a, const char *type) { (void)soap; (void)tag; (void)id; (void)type; if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns2__subResponse), type)) return soap->error; if (soap_out_PointerTodouble(soap, "result", -1, &a->result, "")) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct ns2__subResponse * SOAP_FMAC4 soap_in_ns2__subResponse(struct soap *soap, const char *tag, struct ns2__subResponse *a, const char *type) { size_t soap_flag_result = 1; if (soap_element_begin_in(soap, tag, 0, type)) return NULL; a = (struct ns2__subResponse *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns2__subResponse, sizeof(struct ns2__subResponse), 0, NULL, NULL, NULL); if (!a) return NULL; soap_default_ns2__subResponse(soap, a); if (soap->body && !*soap->href) { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_result && soap->error == SOAP_TAG_MISMATCH) if (soap_in_PointerTodouble(soap, "result", &a->result, "xsd:double")) { soap_flag_result--; continue; } if (soap->error == SOAP_TAG_MISMATCH) soap->error = soap_ignore_element(soap); if (soap->error == SOAP_NO_TAG) break; if (soap->error) return NULL; } if (soap_element_end_in(soap, tag)) return NULL; } else { a = (struct ns2__subResponse *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns2__subResponse, 0, sizeof(struct ns2__subResponse), 0, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns2__subResponse(struct soap *soap, const struct ns2__subResponse *a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_ns2__subResponse); if (soap_out_ns2__subResponse(soap, tag?tag:"ns2:subResponse", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct ns2__subResponse * SOAP_FMAC4 soap_get_ns2__subResponse(struct soap *soap, struct ns2__subResponse *p, const char *tag, const char *type) { if ((p = soap_in_ns2__subResponse(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns2__add(struct soap *soap, struct ns2__add *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_default_double(soap, &a->a); soap_default_double(soap, &a->b); } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns2__add(struct soap *soap, const struct ns2__add *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_embedded(soap, &a->a, SOAP_TYPE_double); soap_embedded(soap, &a->b, SOAP_TYPE_double); } SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns2__add(struct soap *soap, const char *tag, int id, const struct ns2__add *a, const char *type) { (void)soap; (void)tag; (void)id; (void)type; if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns2__add), type)) return soap->error; if (soap_out_double(soap, "a", -1, &a->a, "")) return soap->error; if (soap_out_double(soap, "b", -1, &a->b, "")) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct ns2__add * SOAP_FMAC4 soap_in_ns2__add(struct soap *soap, const char *tag, struct ns2__add *a, const char *type) { size_t soap_flag_a = 1; size_t soap_flag_b = 1; if (soap_element_begin_in(soap, tag, 0, type)) return NULL; a = (struct ns2__add *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns2__add, sizeof(struct ns2__add), 0, NULL, NULL, NULL); if (!a) return NULL; soap_default_ns2__add(soap, a); if (soap->body && !*soap->href) { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_a && soap->error == SOAP_TAG_MISMATCH) if (soap_in_double(soap, "a", &a->a, "xsd:double")) { soap_flag_a--; continue; } if (soap_flag_b && soap->error == SOAP_TAG_MISMATCH) if (soap_in_double(soap, "b", &a->b, "xsd:double")) { soap_flag_b--; continue; } if (soap->error == SOAP_TAG_MISMATCH) soap->error = soap_ignore_element(soap); if (soap->error == SOAP_NO_TAG) break; if (soap->error) return NULL; } if (soap_element_end_in(soap, tag)) return NULL; } else { a = (struct ns2__add *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns2__add, 0, sizeof(struct ns2__add), 0, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_a > 0 || soap_flag_b > 0)) { soap->error = SOAP_OCCURS; return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns2__add(struct soap *soap, const struct ns2__add *a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_ns2__add); if (soap_out_ns2__add(soap, tag?tag:"ns2:add", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct ns2__add * SOAP_FMAC4 soap_get_ns2__add(struct soap *soap, struct ns2__add *p, const char *tag, const char *type) { if ((p = soap_in_ns2__add(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns2__addResponse(struct soap *soap, struct ns2__addResponse *a) { (void)soap; (void)a; /* appease -Wall -Werror */ a->result = NULL; } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns2__addResponse(struct soap *soap, const struct ns2__addResponse *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_serialize_PointerTodouble(soap, &a->result); } SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns2__addResponse(struct soap *soap, const char *tag, int id, const struct ns2__addResponse *a, const char *type) { (void)soap; (void)tag; (void)id; (void)type; if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns2__addResponse), type)) return soap->error; if (soap_out_PointerTodouble(soap, "result", -1, &a->result, "")) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct ns2__addResponse * SOAP_FMAC4 soap_in_ns2__addResponse(struct soap *soap, const char *tag, struct ns2__addResponse *a, const char *type) { size_t soap_flag_result = 1; if (soap_element_begin_in(soap, tag, 0, type)) return NULL; a = (struct ns2__addResponse *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns2__addResponse, sizeof(struct ns2__addResponse), 0, NULL, NULL, NULL); if (!a) return NULL; soap_default_ns2__addResponse(soap, a); if (soap->body && !*soap->href) { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_result && soap->error == SOAP_TAG_MISMATCH) if (soap_in_PointerTodouble(soap, "result", &a->result, "xsd:double")) { soap_flag_result--; continue; } if (soap->error == SOAP_TAG_MISMATCH) soap->error = soap_ignore_element(soap); if (soap->error == SOAP_NO_TAG) break; if (soap->error) return NULL; } if (soap_element_end_in(soap, tag)) return NULL; } else { a = (struct ns2__addResponse *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns2__addResponse, 0, sizeof(struct ns2__addResponse), 0, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns2__addResponse(struct soap *soap, const struct ns2__addResponse *a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_ns2__addResponse); if (soap_out_ns2__addResponse(soap, tag?tag:"ns2:addResponse", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct ns2__addResponse * SOAP_FMAC4 soap_get_ns2__addResponse(struct soap *soap, struct ns2__addResponse *p, const char *tag, const char *type) { if ((p = soap_in_ns2__addResponse(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } #ifndef WITH_NOGLOBAL SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToSOAP_ENV__Reason(struct soap *soap, struct SOAP_ENV__Reason *const*a) { if (!soap_reference(soap, *a, SOAP_TYPE_SOAP_ENV__Reason)) soap_serialize_SOAP_ENV__Reason(soap, *a); } SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerToSOAP_ENV__Reason(struct soap *soap, const char *tag, int id, struct SOAP_ENV__Reason *const*a, const char *type) { id = soap_element_id(soap, tag, id, *a, NULL, 0, type, SOAP_TYPE_SOAP_ENV__Reason); if (id < 0) return soap->error; return soap_out_SOAP_ENV__Reason(soap, tag, id, *a, type); } SOAP_FMAC3 struct SOAP_ENV__Reason ** SOAP_FMAC4 soap_in_PointerToSOAP_ENV__Reason(struct soap *soap, const char *tag, struct SOAP_ENV__Reason **a, const char *type) { if (soap_element_begin_in(soap, tag, 1, NULL)) return NULL; if (!a) if (!(a = (struct SOAP_ENV__Reason **)soap_malloc(soap, sizeof(struct SOAP_ENV__Reason *)))) return NULL; *a = NULL; if (!soap->null && *soap->href != '#') { soap_revert(soap); if (!(*a = soap_in_SOAP_ENV__Reason(soap, tag, *a, type))) return NULL; } else { a = (struct SOAP_ENV__Reason **)soap_id_lookup(soap, soap->href, (void**)a, SOAP_TYPE_SOAP_ENV__Reason, sizeof(struct SOAP_ENV__Reason), 0); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerToSOAP_ENV__Reason(struct soap *soap, struct SOAP_ENV__Reason *const*a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_PointerToSOAP_ENV__Reason); if (soap_out_PointerToSOAP_ENV__Reason(soap, tag?tag:"SOAP-ENV:Reason", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct SOAP_ENV__Reason ** SOAP_FMAC4 soap_get_PointerToSOAP_ENV__Reason(struct soap *soap, struct SOAP_ENV__Reason **p, const char *tag, const char *type) { if ((p = soap_in_PointerToSOAP_ENV__Reason(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } #endif #ifndef WITH_NOGLOBAL SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToSOAP_ENV__Detail(struct soap *soap, struct SOAP_ENV__Detail *const*a) { if (!soap_reference(soap, *a, SOAP_TYPE_SOAP_ENV__Detail)) soap_serialize_SOAP_ENV__Detail(soap, *a); } SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerToSOAP_ENV__Detail(struct soap *soap, const char *tag, int id, struct SOAP_ENV__Detail *const*a, const char *type) { id = soap_element_id(soap, tag, id, *a, NULL, 0, type, SOAP_TYPE_SOAP_ENV__Detail); if (id < 0) return soap->error; return soap_out_SOAP_ENV__Detail(soap, tag, id, *a, type); } SOAP_FMAC3 struct SOAP_ENV__Detail ** SOAP_FMAC4 soap_in_PointerToSOAP_ENV__Detail(struct soap *soap, const char *tag, struct SOAP_ENV__Detail **a, const char *type) { if (soap_element_begin_in(soap, tag, 1, NULL)) return NULL; if (!a) if (!(a = (struct SOAP_ENV__Detail **)soap_malloc(soap, sizeof(struct SOAP_ENV__Detail *)))) return NULL; *a = NULL; if (!soap->null && *soap->href != '#') { soap_revert(soap); if (!(*a = soap_in_SOAP_ENV__Detail(soap, tag, *a, type))) return NULL; } else { a = (struct SOAP_ENV__Detail **)soap_id_lookup(soap, soap->href, (void**)a, SOAP_TYPE_SOAP_ENV__Detail, sizeof(struct SOAP_ENV__Detail), 0); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerToSOAP_ENV__Detail(struct soap *soap, struct SOAP_ENV__Detail *const*a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_PointerToSOAP_ENV__Detail); if (soap_out_PointerToSOAP_ENV__Detail(soap, tag?tag:"SOAP-ENV:Detail", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct SOAP_ENV__Detail ** SOAP_FMAC4 soap_get_PointerToSOAP_ENV__Detail(struct soap *soap, struct SOAP_ENV__Detail **p, const char *tag, const char *type) { if ((p = soap_in_PointerToSOAP_ENV__Detail(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } #endif #ifndef WITH_NOGLOBAL SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToSOAP_ENV__Code(struct soap *soap, struct SOAP_ENV__Code *const*a) { if (!soap_reference(soap, *a, SOAP_TYPE_SOAP_ENV__Code)) soap_serialize_SOAP_ENV__Code(soap, *a); } SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerToSOAP_ENV__Code(struct soap *soap, const char *tag, int id, struct SOAP_ENV__Code *const*a, const char *type) { id = soap_element_id(soap, tag, id, *a, NULL, 0, type, SOAP_TYPE_SOAP_ENV__Code); if (id < 0) return soap->error; return soap_out_SOAP_ENV__Code(soap, tag, id, *a, type); } SOAP_FMAC3 struct SOAP_ENV__Code ** SOAP_FMAC4 soap_in_PointerToSOAP_ENV__Code(struct soap *soap, const char *tag, struct SOAP_ENV__Code **a, const char *type) { if (soap_element_begin_in(soap, tag, 1, NULL)) return NULL; if (!a) if (!(a = (struct SOAP_ENV__Code **)soap_malloc(soap, sizeof(struct SOAP_ENV__Code *)))) return NULL; *a = NULL; if (!soap->null && *soap->href != '#') { soap_revert(soap); if (!(*a = soap_in_SOAP_ENV__Code(soap, tag, *a, type))) return NULL; } else { a = (struct SOAP_ENV__Code **)soap_id_lookup(soap, soap->href, (void**)a, SOAP_TYPE_SOAP_ENV__Code, sizeof(struct SOAP_ENV__Code), 0); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerToSOAP_ENV__Code(struct soap *soap, struct SOAP_ENV__Code *const*a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_PointerToSOAP_ENV__Code); if (soap_out_PointerToSOAP_ENV__Code(soap, tag?tag:"SOAP-ENV:Code", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct SOAP_ENV__Code ** SOAP_FMAC4 soap_get_PointerToSOAP_ENV__Code(struct soap *soap, struct SOAP_ENV__Code **p, const char *tag, const char *type) { if ((p = soap_in_PointerToSOAP_ENV__Code(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } #endif SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTodouble(struct soap *soap, double *const*a) { soap_reference(soap, *a, SOAP_TYPE_double); } SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTodouble(struct soap *soap, const char *tag, int id, double *const*a, const char *type) { id = soap_element_id(soap, tag, id, *a, NULL, 0, type, SOAP_TYPE_double); if (id < 0) return soap->error; return soap_out_double(soap, tag, id, *a, type); } SOAP_FMAC3 double ** SOAP_FMAC4 soap_in_PointerTodouble(struct soap *soap, const char *tag, double **a, const char *type) { if (soap_element_begin_in(soap, tag, 1, NULL)) return NULL; if (!a) if (!(a = (double **)soap_malloc(soap, sizeof(double *)))) return NULL; *a = NULL; if (!soap->null && *soap->href != '#') { soap_revert(soap); if (!(*a = soap_in_double(soap, tag, *a, type))) return NULL; } else { a = (double **)soap_id_lookup(soap, soap->href, (void**)a, SOAP_TYPE_double, sizeof(double), 0); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTodouble(struct soap *soap, double *const*a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_PointerTodouble); if (soap_out_PointerTodouble(soap, tag?tag:"double", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 double ** SOAP_FMAC4 soap_get_PointerTodouble(struct soap *soap, double **p, const char *tag, const char *type) { if ((p = soap_in_PointerTodouble(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC3 int SOAP_FMAC4 soap_out__QName(struct soap *soap, const char *tag, int id, char *const*a, const char *type) { return soap_outstring(soap, tag, id, a, type, SOAP_TYPE__QName); } SOAP_FMAC3 char * * SOAP_FMAC4 soap_in__QName(struct soap *soap, const char *tag, char **a, const char *type) { char **p; p = soap_instring(soap, tag, a, type, SOAP_TYPE__QName, 2, 0, -1); return p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put__QName(struct soap *soap, char *const*a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE__QName); if (soap_out__QName(soap, tag?tag:"byte", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 char ** SOAP_FMAC4 soap_get__QName(struct soap *soap, char **p, const char *tag, const char *type) { if ((p = soap_in__QName(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC3 void SOAP_FMAC4 soap_default_string(struct soap *soap, char **a) { (void)soap; /* appease -Wall -Werror */ #ifdef SOAP_DEFAULT_string *a = SOAP_DEFAULT_string; #else *a = (char *)0; #endif } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_string(struct soap *soap, char *const*a) { soap_reference(soap, *a, SOAP_TYPE_string); } SOAP_FMAC3 int SOAP_FMAC4 soap_out_string(struct soap *soap, const char *tag, int id, char *const*a, const char *type) { return soap_outstring(soap, tag, id, a, type, SOAP_TYPE_string); } SOAP_FMAC3 char * * SOAP_FMAC4 soap_in_string(struct soap *soap, const char *tag, char **a, const char *type) { char **p; p = soap_instring(soap, tag, a, type, SOAP_TYPE_string, 1, 0, -1); return p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_string(struct soap *soap, char *const*a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_string); if (soap_out_string(soap, tag?tag:"byte", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 char ** SOAP_FMAC4 soap_get_string(struct soap *soap, char **p, const char *tag, const char *type) { if ((p = soap_in_string(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } #ifdef __cplusplus } #endif #if defined(__BORLANDC__) #pragma option pop #pragma option pop #endif /* End of soapC.c */ gsoap-2.8.28/gsoap/ios_plugin/examples/Calc/Classes/CalcViewController.h0000644000175000017500000000065712653650146025554 0ustar ellertellert// // CalcViewController.h // Calc // // Created by Wei Zhang on 5/19/12. // Copyright __MyCompanyName__ 2012. All rights reserved. // #import @interface CalcViewController : UIViewController { UITextField *op1; // operand1 UITextField *op2; // operand2 } @property (nonatomic, retain) IBOutlet UITextField *op1; @property (nonatomic, retain) IBOutlet UITextField *op2; - (IBAction) buttonPressed; @end gsoap-2.8.28/gsoap/ios_plugin/examples/Calc/Classes/calc.nsmap0000644000175000017500000000106012653650146023571 0ustar ellertellert#ifndef calc_h #define calc_h #include "soapH.h" SOAP_NMAC struct Namespace namespaces[] = { {"SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/", "http://www.w3.org/*/soap-envelope", NULL}, {"SOAP-ENC", "http://schemas.xmlsoap.org/soap/encoding/", "http://www.w3.org/*/soap-encoding", NULL}, {"xsi", "http://www.w3.org/2001/XMLSchema-instance", "http://www.w3.org/*/XMLSchema-instance", NULL}, {"xsd", "http://www.w3.org/2001/XMLSchema", "http://www.w3.org/*/XMLSchema", NULL}, {"ns2", "urn:calc", NULL, NULL}, {NULL, NULL, NULL, NULL} }; #endif gsoap-2.8.28/gsoap/ios_plugin/examples/Calc/Classes/stdsoap2.c0000644000175000017500000164356212653650146023556 0ustar ellertellert/* stdsoap2.c[pp] 2.8.8 gSOAP runtime engine gSOAP XML Web services tools Copyright (C) 2000-2011, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under ONE of the following licenses: GPL, or the gSOAP public license, or Genivia's license for commercial use. -------------------------------------------------------------------------------- Contributors: Wind River Systems Inc., for the following additions under gSOAP public license: - vxWorks compatible options -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2011, Robert van Engelen, Genivia Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #define GSOAP_LIB_VERSION 20808 #ifdef AS400 # pragma convert(819) /* EBCDIC to ASCII */ #endif #include "stdsoap2.h" #if GSOAP_VERSION != GSOAP_LIB_VERSION # error "GSOAP VERSION MISMATCH IN LIBRARY: PLEASE REINSTALL PACKAGE" #endif #ifdef __BORLANDC__ # pragma warn -8060 #else # ifdef WIN32 # ifdef UNDER_CE # pragma comment(lib, "ws2.lib") /* WinCE */ # else # pragma comment(lib, "ws2_32.lib") # endif # pragma warning(disable : 4996) /* disable deprecation warnings */ # endif #endif #ifdef __cplusplus SOAP_SOURCE_STAMP("@(#) stdsoap2.cpp ver 2.8.8 2012-02-20 00:00:00 GMT") extern "C" { #else SOAP_SOURCE_STAMP("@(#) stdsoap2.c ver 2.8.8 2012-02-20 00:00:00 GMT") #endif /* 8bit character representing unknown/nonrepresentable character data (e.g. not supported by current locale with multibyte support enabled) */ #ifndef SOAP_UNKNOWN_CHAR #define SOAP_UNKNOWN_CHAR (127) #endif /* EOF=-1 */ #define SOAP_LT (soap_wchar)(-2) /* XML-specific '<' */ #define SOAP_TT (soap_wchar)(-3) /* XML-specific '' */ #define SOAP_QT (soap_wchar)(-5) /* XML-specific '"' */ #define SOAP_AP (soap_wchar)(-6) /* XML-specific ''' */ #define soap_blank(c) ((c)+1 > 0 && (c) <= 32) #define soap_notblank(c) ((c) > 32) #if defined(WIN32) && !defined(UNDER_CE) #define soap_hash_ptr(p) ((PtrToUlong(p) >> 3) & (SOAP_PTRHASH - 1)) #else #define soap_hash_ptr(p) ((size_t)(((unsigned long)(p) >> 3) & (SOAP_PTRHASH-1))) #endif #if !defined(WITH_LEAN) || defined(SOAP_DEBUG) static void soap_init_logs(struct soap*); #endif #ifdef SOAP_DEBUG static void soap_close_logfile(struct soap*, int); static void soap_set_logfile(struct soap*, int, const char*); #endif #ifdef SOAP_MEM_DEBUG static void soap_init_mht(struct soap*); static void soap_free_mht(struct soap*); static void soap_track_unlink(struct soap*, const void*); #endif #ifndef PALM_2 static int soap_set_error(struct soap*, const char*, const char*, const char*, const char*, int); static int soap_copy_fault(struct soap*, const char*, const char*, const char*, const char*); static int soap_getattrval(struct soap*, char*, size_t, soap_wchar); #endif #ifndef PALM_1 static void soap_free_ns(struct soap *soap); static soap_wchar soap_char(struct soap*); static soap_wchar soap_get_pi(struct soap*); static int soap_isxdigit(int); static void *fplugin(struct soap*, const char*); static size_t soap_count_attachments(struct soap *soap); static int soap_try_connect_command(struct soap*, int http_command, const char *endpoint, const char *action); #ifdef WITH_NTLM static int soap_ntlm_handshake(struct soap *soap, int command, const char *endpoint, const char *host, int port); #endif #ifndef WITH_NOIDREF static int soap_has_copies(struct soap*, const char*, const char*); static void soap_init_iht(struct soap*); static void soap_free_iht(struct soap*); static void soap_init_pht(struct soap*); static void soap_free_pht(struct soap*); #endif #endif #ifndef WITH_LEAN static const char *soap_set_validation_fault(struct soap*, const char*, const char*); static int soap_isnumeric(struct soap*, const char*); static struct soap_nlist *soap_push_ns(struct soap *soap, const char *id, const char *ns, short utilized); static void soap_utilize_ns(struct soap *soap, const char *tag); #endif #ifndef WITH_LEANER #ifndef PALM_1 static struct soap_multipart *soap_new_multipart(struct soap*, struct soap_multipart**, struct soap_multipart**, char*, size_t); static int soap_putdimefield(struct soap*, const char*, size_t); static char *soap_getdimefield(struct soap*, size_t); static void soap_select_mime_boundary(struct soap*); static int soap_valid_mime_boundary(struct soap*); static void soap_resolve_attachment(struct soap*, struct soap_multipart*); #endif #endif #ifdef WITH_GZIP static int soap_getgziphdr(struct soap*); #endif #ifdef WITH_OPENSSL # ifndef SOAP_SSL_RSA_BITS # define SOAP_SSL_RSA_BITS 2048 # endif static int soap_ssl_init_done = 0; static int ssl_auth_init(struct soap*); static int ssl_verify_callback(int, X509_STORE_CTX*); static int ssl_verify_callback_allow_expired_certificate(int, X509_STORE_CTX*); static int ssl_password(char*, int, int, void *); #endif #ifdef WITH_GNUTLS # ifndef SOAP_SSL_RSA_BITS # define SOAP_SSL_RSA_BITS 2048 # endif static int soap_ssl_init_done = 0; static const char *ssl_verify(struct soap *soap, const char *host); # if defined(HAVE_PTHREAD_H) # include /* make GNUTLS thread safe with pthreads */ GCRY_THREAD_OPTION_PTHREAD_IMPL; # elif defined(HAVE_PTH_H) #include /* make GNUTLS thread safe with PTH */ GCRY_THREAD_OPTION_PTH_IMPL; # endif #endif #if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) #ifndef PALM_1 static const char *soap_decode(char*, size_t, const char*, const char*); #endif #endif #ifndef WITH_NOHTTP #ifndef PALM_1 static soap_wchar soap_getchunkchar(struct soap*); static const char *http_error(struct soap*, int); static int http_get(struct soap*); static int http_405(struct soap*); static int http_200(struct soap*); static int http_post(struct soap*, const char*, const char*, int, const char*, const char*, size_t); static int http_send_header(struct soap*, const char*); static int http_post_header(struct soap*, const char*, const char*); static int http_response(struct soap*, int, size_t); static int http_parse(struct soap*); static int http_parse_header(struct soap*, const char*, const char*); #endif #endif #ifndef WITH_NOIO #ifndef PALM_1 static int fsend(struct soap*, const char*, size_t); static size_t frecv(struct soap*, char*, size_t); static int tcp_init(struct soap*); static const char *tcp_error(struct soap*); #ifndef WITH_IPV6 static int tcp_gethost(struct soap*, const char *addr, struct in_addr *inaddr); #endif static SOAP_SOCKET tcp_connect(struct soap*, const char *endpoint, const char *host, int port); static SOAP_SOCKET tcp_accept(struct soap*, SOAP_SOCKET, struct sockaddr*, int*); static int tcp_select(struct soap*, SOAP_SOCKET, int, int); static int tcp_disconnect(struct soap*); static int tcp_closesocket(struct soap*, SOAP_SOCKET); static int tcp_shutdownsocket(struct soap*, SOAP_SOCKET, int); static const char *soap_strerror(struct soap*); #endif #define SOAP_TCP_SELECT_RCV 0x1 #define SOAP_TCP_SELECT_SND 0x2 #define SOAP_TCP_SELECT_ERR 0x4 #define SOAP_TCP_SELECT_ALL 0x7 #if defined(WIN32) #define SOAP_SOCKBLOCK(fd) \ { u_long blocking = 0; \ ioctlsocket(fd, FIONBIO, &blocking); \ } #define SOAP_SOCKNONBLOCK(fd) \ { u_long nonblocking = 1; \ ioctlsocket(fd, FIONBIO, &nonblocking); \ } #elif defined(VXWORKS) #define SOAP_SOCKBLOCK(fd) \ { u_long blocking = 0; \ ioctl(fd, FIONBIO, (int)(&blocking)); \ } #define SOAP_SOCKNONBLOCK(fd) \ { u_long nonblocking = 1; \ ioctl(fd, FIONBIO, (int)(&nonblocking)); \ } #elif defined(__VMS) #define SOAP_SOCKBLOCK(fd) \ { int blocking = 0; \ ioctl(fd, FIONBIO, &blocking); \ } #define SOAP_SOCKNONBLOCK(fd) \ { int nonblocking = 1; \ ioctl(fd, FIONBIO, &nonblocking); \ } #elif defined(PALM) #define SOAP_SOCKBLOCK(fd) fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0)&~O_NONBLOCK); #define SOAP_SOCKNONBLOCK(fd) fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0)|O_NONBLOCK); #elif defined(SYMBIAN) #define SOAP_SOCKBLOCK(fd) \ { long blocking = 0; \ ioctl(fd, 0/*FIONBIO*/, &blocking); \ } #define SOAP_SOCKNONBLOCK(fd) \ { long nonblocking = 1; \ ioctl(fd, 0/*FIONBIO*/, &nonblocking); \ } #else #define SOAP_SOCKBLOCK(fd) fcntl(fd, F_SETFL, fcntl(fd, F_GETFL)&~O_NONBLOCK); #define SOAP_SOCKNONBLOCK(fd) fcntl(fd, F_SETFL, fcntl(fd, F_GETFL)|O_NONBLOCK); #endif #endif #if defined(PALM) && !defined(PALM_2) unsigned short errno; #endif #ifndef PALM_1 static const char soap_env1[42] = "http://schemas.xmlsoap.org/soap/envelope/"; static const char soap_enc1[42] = "http://schemas.xmlsoap.org/soap/encoding/"; static const char soap_env2[40] = "http://www.w3.org/2003/05/soap-envelope"; static const char soap_enc2[40] = "http://www.w3.org/2003/05/soap-encoding"; static const char soap_rpc[35] = "http://www.w3.org/2003/05/soap-rpc"; #endif #ifndef PALM_1 const union soap_double_nan soap_double_nan = {{0xFFFFFFFF, 0xFFFFFFFF}}; const char soap_base64o[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; const char soap_base64i[81] = "\76XXX\77\64\65\66\67\70\71\72\73\74\75XXXXXXX\00\01\02\03\04\05\06\07\10\11\12\13\14\15\16\17\20\21\22\23\24\25\26\27\30\31XXXXXX\32\33\34\35\36\37\40\41\42\43\44\45\46\47\50\51\52\53\54\55\56\57\60\61\62\63"; #endif #ifndef WITH_LEAN static const char soap_indent[11] = "\n\t\t\t\t\t\t\t\t\t"; /* Alternative indentation form for SOAP_XML_INDENT: static const char soap_indent[21] = "\n "; */ #endif #ifndef SOAP_CANARY # define SOAP_CANARY (0xC0DE) #endif static const char soap_padding[4] = "\0\0\0"; #define SOAP_STR_PADDING (soap_padding) #define SOAP_STR_EOS (soap_padding) #define SOAP_NON_NULL (soap_padding) #ifndef WITH_LEAN static const struct soap_code_map html_entity_codes[] = /* entities for XHTML parsing */ { { 160, "nbsp" }, { 161, "iexcl" }, { 162, "cent" }, { 163, "pound" }, { 164, "curren" }, { 165, "yen" }, { 166, "brvbar" }, { 167, "sect" }, { 168, "uml" }, { 169, "copy" }, { 170, "ordf" }, { 171, "laquo" }, { 172, "not" }, { 173, "shy" }, { 174, "reg" }, { 175, "macr" }, { 176, "deg" }, { 177, "plusmn" }, { 178, "sup2" }, { 179, "sup3" }, { 180, "acute" }, { 181, "micro" }, { 182, "para" }, { 183, "middot" }, { 184, "cedil" }, { 185, "sup1" }, { 186, "ordm" }, { 187, "raquo" }, { 188, "frac14" }, { 189, "frac12" }, { 190, "frac34" }, { 191, "iquest" }, { 192, "Agrave" }, { 193, "Aacute" }, { 194, "Acirc" }, { 195, "Atilde" }, { 196, "Auml" }, { 197, "Aring" }, { 198, "AElig" }, { 199, "Ccedil" }, { 200, "Egrave" }, { 201, "Eacute" }, { 202, "Ecirc" }, { 203, "Euml" }, { 204, "Igrave" }, { 205, "Iacute" }, { 206, "Icirc" }, { 207, "Iuml" }, { 208, "ETH" }, { 209, "Ntilde" }, { 210, "Ograve" }, { 211, "Oacute" }, { 212, "Ocirc" }, { 213, "Otilde" }, { 214, "Ouml" }, { 215, "times" }, { 216, "Oslash" }, { 217, "Ugrave" }, { 218, "Uacute" }, { 219, "Ucirc" }, { 220, "Uuml" }, { 221, "Yacute" }, { 222, "THORN" }, { 223, "szlig" }, { 224, "agrave" }, { 225, "aacute" }, { 226, "acirc" }, { 227, "atilde" }, { 228, "auml" }, { 229, "aring" }, { 230, "aelig" }, { 231, "ccedil" }, { 232, "egrave" }, { 233, "eacute" }, { 234, "ecirc" }, { 235, "euml" }, { 236, "igrave" }, { 237, "iacute" }, { 238, "icirc" }, { 239, "iuml" }, { 240, "eth" }, { 241, "ntilde" }, { 242, "ograve" }, { 243, "oacute" }, { 244, "ocirc" }, { 245, "otilde" }, { 246, "ouml" }, { 247, "divide" }, { 248, "oslash" }, { 249, "ugrave" }, { 250, "uacute" }, { 251, "ucirc" }, { 252, "uuml" }, { 253, "yacute" }, { 254, "thorn" }, { 255, "yuml" }, { 0, NULL } }; #endif #ifndef WITH_NOIO #ifndef WITH_LEAN static const struct soap_code_map h_error_codes[] = { #ifdef HOST_NOT_FOUND { HOST_NOT_FOUND, "Host not found" }, #endif #ifdef TRY_AGAIN { TRY_AGAIN, "Try Again" }, #endif #ifdef NO_RECOVERY { NO_RECOVERY, "No Recovery" }, #endif #ifdef NO_DATA { NO_DATA, "No Data" }, #endif #ifdef NO_ADDRESS { NO_ADDRESS, "No Address" }, #endif { 0, NULL } }; #endif #endif #ifndef WITH_NOHTTP #ifndef WITH_LEAN static const struct soap_code_map h_http_error_codes[] = { { 200, "OK" }, { 201, "Created" }, { 202, "Accepted" }, { 203, "Non-Authoritative Information" }, { 204, "No Content" }, { 205, "Reset Content" }, { 206, "Partial Content" }, { 300, "Multiple Choices" }, { 301, "Moved Permanently" }, { 302, "Found" }, { 303, "See Other" }, { 304, "Not Modified" }, { 305, "Use Proxy" }, { 307, "Temporary Redirect" }, { 400, "Bad Request" }, { 401, "Unauthorized" }, { 402, "Payment Required" }, { 403, "Forbidden" }, { 404, "Not Found" }, { 405, "Method Not Allowed" }, { 406, "Not Acceptable" }, { 407, "Proxy Authentication Required" }, { 408, "Request Time-out" }, { 409, "Conflict" }, { 410, "Gone" }, { 411, "Length Required" }, { 412, "Precondition Failed" }, { 413, "Request Entity Too Large" }, { 414, "Request-URI Too Large" }, { 415, "Unsupported Media Type" }, { 416, "Requested range not satisfiable" }, { 417, "Expectation Failed" }, { 500, "Internal Server Error" }, { 501, "Not Implemented" }, { 502, "Bad Gateway" }, { 503, "Service Unavailable" }, { 504, "Gateway Time-out" }, { 505, "HTTP Version not supported" }, { 0, NULL } }; #endif #endif #ifdef WITH_OPENSSL static const struct soap_code_map h_ssl_error_codes[] = { #define _SSL_ERROR(e) { e, #e } _SSL_ERROR(SSL_ERROR_SSL), _SSL_ERROR(SSL_ERROR_ZERO_RETURN), _SSL_ERROR(SSL_ERROR_WANT_READ), _SSL_ERROR(SSL_ERROR_WANT_WRITE), _SSL_ERROR(SSL_ERROR_WANT_CONNECT), _SSL_ERROR(SSL_ERROR_WANT_X509_LOOKUP), _SSL_ERROR(SSL_ERROR_SYSCALL), { 0, NULL } }; #endif #ifndef WITH_LEANER static const struct soap_code_map mime_codes[] = { { SOAP_MIME_7BIT, "7bit" }, { SOAP_MIME_8BIT, "8bit" }, { SOAP_MIME_BINARY, "binary" }, { SOAP_MIME_QUOTED_PRINTABLE, "quoted-printable" }, { SOAP_MIME_BASE64, "base64" }, { SOAP_MIME_IETF_TOKEN, "ietf-token" }, { SOAP_MIME_X_TOKEN, "x-token" }, { 0, NULL } }; #endif #ifdef WIN32 static int tcp_done = 0; #endif #if defined(HP_UX) && defined(HAVE_GETHOSTBYNAME_R) extern int h_errno; #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 static int fsend(struct soap *soap, const char *s, size_t n) { register int nwritten, err; #if defined(__cplusplus) && !defined(WITH_LEAN) && !defined(WITH_COMPAT) if (soap->os) { soap->os->write(s, (std::streamsize)n); if (soap->os->good()) return SOAP_OK; soap->errnum = 0; return SOAP_EOF; } #endif while (n) { if (soap_valid_socket(soap->socket)) { if (soap->send_timeout) { for (;;) { register int r; #ifdef WITH_OPENSSL if (soap->ssl) r = tcp_select(soap, soap->socket, SOAP_TCP_SELECT_ALL, soap->send_timeout); else #endif #ifdef WITH_GNUTLS if (soap->session) r = tcp_select(soap, soap->socket, SOAP_TCP_SELECT_ALL, soap->send_timeout); else #endif r = tcp_select(soap, soap->socket, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, soap->send_timeout); if (r > 0) break; if (!r) return SOAP_EOF; err = soap->errnum; if (!err) return soap->error; if (err != SOAP_EINTR && err != SOAP_EAGAIN && err != SOAP_EWOULDBLOCK) return SOAP_EOF; } } #ifdef WITH_OPENSSL if (soap->ssl) nwritten = SSL_write(soap->ssl, s, (int)n); else if (soap->bio) nwritten = BIO_write(soap->bio, s, (int)n); else #endif #ifdef WITH_GNUTLS if (soap->session) nwritten = gnutls_record_send(soap->session, s, n); else #endif #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) { if (soap->peerlen) nwritten = sendto(soap->socket, (char*)s, (SOAP_WINSOCKINT)n, soap->socket_flags, (struct sockaddr*)&soap->peer, (SOAP_WINSOCKINT)soap->peerlen); else nwritten = send(soap->socket, s, (SOAP_WINSOCKINT)n, soap->socket_flags); /* retry and back-off algorithm */ /* TODO: this is not very clear from specs so verify and limit conditions under which we should loop (e.g. ENOBUFS) */ if (nwritten < 0) { int udp_repeat; int udp_delay; if ((soap->connect_flags & SO_BROADCAST)) udp_repeat = 2; /* SOAP-over-UDP MULTICAST_UDP_REPEAT - 1 */ else udp_repeat = 1; /* SOAP-over-UDP UNICAST_UDP_REPEAT - 1 */ udp_delay = ((unsigned int)soap_random % 201) + 50; /* UDP_MIN_DELAY .. UDP_MAX_DELAY */ do { tcp_select(soap, soap->socket, SOAP_TCP_SELECT_ERR, -1000 * udp_delay); if (soap->peerlen) nwritten = sendto(soap->socket, (char*)s, (SOAP_WINSOCKINT)n, soap->socket_flags, (struct sockaddr*)&soap->peer, (SOAP_WINSOCKINT)soap->peerlen); else nwritten = send(soap->socket, s, (SOAP_WINSOCKINT)n, soap->socket_flags); udp_delay <<= 1; if (udp_delay > 500) /* UDP_UPPER_DELAY */ udp_delay = 500; } while (nwritten < 0 && --udp_repeat > 0); } } else #endif #if !defined(PALM) && !defined(AS400) nwritten = send(soap->socket, s, (int)n, soap->socket_flags); #else nwritten = send(soap->socket, (void*)s, n, soap->socket_flags); #endif if (nwritten <= 0) { register int r = 0; err = soap_socket_errno(soap->socket); #ifdef WITH_OPENSSL if (soap->ssl && (r = SSL_get_error(soap->ssl, nwritten)) != SSL_ERROR_NONE && r != SSL_ERROR_WANT_READ && r != SSL_ERROR_WANT_WRITE) { soap->errnum = err; return SOAP_EOF; } #endif #ifdef WITH_GNUTLS if (soap->session) { if (nwritten == GNUTLS_E_INTERRUPTED) err = SOAP_EINTR; else if (nwritten == GNUTLS_E_AGAIN) err = SOAP_EAGAIN; } #endif if (err == SOAP_EWOULDBLOCK || err == SOAP_EAGAIN) { #if defined(WITH_OPENSSL) if (soap->ssl && r == SSL_ERROR_WANT_READ) r = tcp_select(soap, soap->socket, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, soap->send_timeout ? soap->send_timeout : -10000); else #elif defined(WITH_GNUTLS) if (soap->session && !gnutls_record_get_direction(soap->session)) r = tcp_select(soap, soap->socket, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, soap->send_timeout ? soap->send_timeout : -10000); else #endif r = tcp_select(soap, soap->socket, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, soap->send_timeout ? soap->send_timeout : -10000); if (!r && soap->send_timeout) return SOAP_EOF; if (r < 0 && soap->errnum != SOAP_EINTR) return SOAP_EOF; } else if (err && err != SOAP_EINTR) { soap->errnum = err; return SOAP_EOF; } nwritten = 0; /* and call write() again */ } } else { #ifdef WITH_FASTCGI nwritten = fwrite((void*)s, 1, n, stdout); fflush(stdout); #else #ifdef UNDER_CE nwritten = fwrite(s, 1, n, soap->sendfd); #else #ifdef VXWORKS #ifdef WMW_RPM_IO if (soap->rpmreqid) nwritten = (httpBlockPut(soap->rpmreqid, (char*)s, n) == 0) ? n : -1; else #endif nwritten = fwrite(s, sizeof(char), n, fdopen(soap->sendfd, "w")); #else #ifdef WIN32 nwritten = _write(soap->sendfd, s, (unsigned int)n); #else nwritten = write(soap->sendfd, s, (unsigned int)n); #endif #endif #endif #endif if (nwritten <= 0) { #ifndef WITH_FASTCGI err = soap_errno; #else err = EOF; #endif if (err && err != SOAP_EINTR && err != SOAP_EWOULDBLOCK && err != SOAP_EAGAIN) { soap->errnum = err; return SOAP_EOF; } nwritten = 0; /* and call write() again */ } } n -= nwritten; s += nwritten; } return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_send_raw(struct soap *soap, const char *s, size_t n) { if (!n) return SOAP_OK; #ifndef WITH_LEANER if (soap->fpreparesend && (soap->mode & SOAP_IO) != SOAP_IO_STORE && (soap->mode & SOAP_IO_LENGTH) && (soap->error = soap->fpreparesend(soap, s, n))) return soap->error; if (soap->ffiltersend && (soap->error = soap->ffiltersend(soap, &s, &n))) return soap->error; #endif if (soap->mode & SOAP_IO_LENGTH) soap->count += n; else if (soap->mode & SOAP_IO) { register size_t i = SOAP_BUFLEN - soap->bufidx; while (n >= i) { memcpy(soap->buf + soap->bufidx, s, i); soap->bufidx = SOAP_BUFLEN; if (soap_flush(soap)) return soap->error; s += i; n -= i; i = SOAP_BUFLEN; } memcpy(soap->buf + soap->bufidx, s, n); soap->bufidx += n; } else return soap_flush_raw(soap, s, n); return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_flush(struct soap *soap) { register size_t n = soap->bufidx; if (n) { #ifndef WITH_LEANER if ((soap->mode & SOAP_IO) == SOAP_IO_STORE) { register int r; if (soap->fpreparesend && (r = soap->fpreparesend(soap, soap->buf, n))) return soap->error = r; } #endif soap->bufidx = 0; #ifdef WITH_ZLIB if (soap->mode & SOAP_ENC_ZLIB) { soap->d_stream->next_in = (Byte*)soap->buf; soap->d_stream->avail_in = (unsigned int)n; #ifdef WITH_GZIP soap->z_crc = crc32(soap->z_crc, (Byte*)soap->buf, (unsigned int)n); #endif do { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Deflating %u bytes\n", soap->d_stream->avail_in)); if (deflate(soap->d_stream, Z_NO_FLUSH) != Z_OK) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unable to deflate: %s\n", soap->d_stream->msg ? soap->d_stream->msg : SOAP_STR_EOS)); return soap->error = SOAP_ZLIB_ERROR; } if (!soap->d_stream->avail_out) { if (soap_flush_raw(soap, soap->z_buf, SOAP_BUFLEN)) return soap->error; soap->d_stream->next_out = (Byte*)soap->z_buf; soap->d_stream->avail_out = SOAP_BUFLEN; } } while (soap->d_stream->avail_in); } else #endif return soap_flush_raw(soap, soap->buf, n); } return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_flush_raw(struct soap *soap, const char *s, size_t n) { if ((soap->mode & SOAP_IO) == SOAP_IO_STORE) { register char *t; if (!(t = (char*)soap_push_block(soap, NULL, n))) return soap->error = SOAP_EOM; memcpy(t, s, n); return SOAP_OK; } #ifndef WITH_LEANER if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK) { char t[16]; sprintf(t, "\r\n%lX\r\n" + (soap->chunksize ? 0 : 2), (unsigned long)n); DBGMSG(SENT, t, strlen(t)); if ((soap->error = soap->fsend(soap, t, strlen(t)))) return soap->error; soap->chunksize += n; } DBGMSG(SENT, s, n); #endif return soap->error = soap->fsend(soap, s, n); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_send(struct soap *soap, const char *s) { if (s) return soap_send_raw(soap, s, strlen(s)); return SOAP_OK; } #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_send2(struct soap *soap, const char *s1, const char *s2) { if (soap_send(soap, s1)) return soap->error; return soap_send(soap, s2); } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_send3(struct soap *soap, const char *s1, const char *s2, const char *s3) { if (soap_send(soap, s1) || soap_send(soap, s2)) return soap->error; return soap_send(soap, s3); } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 static size_t frecv(struct soap *soap, char *s, size_t n) { register int r; register int retries = 100; /* max 100 retries with non-blocking sockets */ soap->errnum = 0; #if defined(__cplusplus) && !defined(WITH_LEAN) && !defined(WITH_COMPAT) if (soap->is) { if (soap->is->good()) return soap->is->read(s, (std::streamsize)n).gcount(); return 0; } #endif if (soap_valid_socket(soap->socket)) { for (;;) { #ifdef WITH_OPENSSL register int err = 0; #endif #ifdef WITH_OPENSSL if (soap->recv_timeout && !soap->ssl) /* SSL: sockets are nonblocking */ #else if (soap->recv_timeout) #endif { for (;;) { r = tcp_select(soap, soap->socket, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, soap->recv_timeout); if (r > 0) break; if (!r) return 0; r = soap->errnum; if (r != SOAP_EINTR && r != SOAP_EAGAIN && r != SOAP_EWOULDBLOCK) return 0; } } #ifdef WITH_OPENSSL if (soap->ssl) { r = SSL_read(soap->ssl, s, (int)n); if (r > 0) return (size_t)r; err = SSL_get_error(soap->ssl, r); if (err != SSL_ERROR_NONE && err != SSL_ERROR_WANT_READ && err != SSL_ERROR_WANT_WRITE) return 0; } else if (soap->bio) { r = BIO_read(soap->bio, s, (int)n); if (r > 0) return (size_t)r; return 0; } else #endif #ifdef WITH_GNUTLS if (soap->session) { r = (int)gnutls_record_recv(soap->session, s, n); if (r >= 0) return (size_t)r; } else #endif { #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) { SOAP_SOCKLEN_T k = (SOAP_SOCKLEN_T)sizeof(soap->peer); memset((void*)&soap->peer, 0, sizeof(soap->peer)); r = recvfrom(soap->socket, s, (SOAP_WINSOCKINT)n, soap->socket_flags, (struct sockaddr*)&soap->peer, &k); /* portability note: see SOAP_SOCKLEN_T definition in stdsoap2.h */ soap->peerlen = (size_t)k; #ifndef WITH_IPV6 soap->ip = ntohl(soap->peer.sin_addr.s_addr); #endif } else #endif r = recv(soap->socket, s, (int)n, soap->socket_flags); #ifdef PALM /* CycleSyncDisplay(curStatusMsg); */ #endif if (r >= 0) return (size_t)r; r = soap_socket_errno(soap->socket); if (r != SOAP_EINTR && r != SOAP_EAGAIN && r != SOAP_EWOULDBLOCK) { soap->errnum = r; return 0; } } #if defined(WITH_OPENSSL) if (soap->ssl && err == SSL_ERROR_WANT_WRITE) r = tcp_select(soap, soap->socket, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, soap->recv_timeout ? soap->recv_timeout : 5); else #elif defined(WITH_GNUTLS) if (soap->session && gnutls_record_get_direction(soap->session)) r = tcp_select(soap, soap->socket, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, soap->recv_timeout ? soap->recv_timeout : 5); else #endif r = tcp_select(soap, soap->socket, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, soap->recv_timeout ? soap->recv_timeout : 5); if (!r && soap->recv_timeout) return 0; if (r < 0) { r = soap->errnum; if (r != SOAP_EINTR && r != SOAP_EAGAIN && r != SOAP_EWOULDBLOCK) return 0; } if (retries-- <= 0) return 0; #ifdef PALM r = soap_socket_errno(soap->socket); if (r != SOAP_EINTR && retries-- <= 0) { soap->errnum = r; return 0; } #endif } } #ifdef WITH_FASTCGI return fread(s, 1, n, stdin); #else #ifdef UNDER_CE return fread(s, 1, n, soap->recvfd); #else #ifdef WMW_RPM_IO if (soap->rpmreqid) r = httpBlockRead(soap->rpmreqid, s, n); else #endif #ifdef WIN32 r = _read(soap->recvfd, s, (unsigned int)n); #else r = read(soap->recvfd, s, (unsigned int)n); #endif if (r >= 0) return (size_t)r; soap->errnum = soap_errno; return 0; #endif #endif } #endif #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 static soap_wchar soap_getchunkchar(struct soap *soap) { if (soap->bufidx < soap->buflen) return soap->buf[soap->bufidx++]; soap->bufidx = 0; soap->buflen = soap->chunkbuflen = soap->frecv(soap, soap->buf, SOAP_BUFLEN); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Read %u bytes from socket=%d/fd=%d\n", (unsigned int)soap->buflen, soap->socket, soap->recvfd)); DBGMSG(RECV, soap->buf, soap->buflen); if (soap->buflen) return soap->buf[soap->bufidx++]; return EOF; } #endif #endif /******************************************************************************/ #ifndef PALM_1 static int soap_isxdigit(int c) { return (c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f'); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_recv_raw(struct soap *soap) { register size_t ret; #if !defined(WITH_LEANER) || defined(WITH_ZLIB) register int r; #endif #ifdef WITH_ZLIB if (soap->mode & SOAP_ENC_ZLIB) { if (soap->d_stream->next_out == Z_NULL) { soap->bufidx = soap->buflen = 0; return EOF; } if (soap->d_stream->avail_in || !soap->d_stream->avail_out) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflating\n")); soap->d_stream->next_out = (Byte*)soap->buf; soap->d_stream->avail_out = SOAP_BUFLEN; r = inflate(soap->d_stream, Z_NO_FLUSH); if (r == Z_NEED_DICT && soap->z_dict) r = inflateSetDictionary(soap->d_stream, (const Bytef*)soap->z_dict, soap->z_dict_len); if (r == Z_OK || r == Z_STREAM_END) { soap->bufidx = 0; ret = soap->buflen = SOAP_BUFLEN - soap->d_stream->avail_out; if (soap->zlib_in == SOAP_ZLIB_GZIP) soap->z_crc = crc32(soap->z_crc, (Byte*)soap->buf, (unsigned int)ret); if (r == Z_STREAM_END) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflated %lu->%lu bytes\n", soap->d_stream->total_in, soap->d_stream->total_out)); soap->z_ratio_in = (float)soap->d_stream->total_in / (float)soap->d_stream->total_out; soap->d_stream->next_out = Z_NULL; } if (ret) { soap->count += ret; DBGLOG(RECV, SOAP_MESSAGE(fdebug, "\n---- decompressed ----\n")); DBGMSG(RECV, soap->buf, ret); DBGLOG(RECV, SOAP_MESSAGE(fdebug, "\n----\n")); #ifndef WITH_LEANER if (soap->fpreparerecv && (r = soap->fpreparerecv(soap, soap->buf, ret))) return soap->error = r; #endif return SOAP_OK; } } else if (r != Z_BUF_ERROR) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflate error: %s\n", soap->d_stream->msg ? soap->d_stream->msg : SOAP_STR_EOS)); soap->d_stream->next_out = Z_NULL; return soap->error = SOAP_ZLIB_ERROR; } } zlib_again: if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK && !soap->chunksize) { memcpy(soap->buf, soap->z_buf, SOAP_BUFLEN); soap->buflen = soap->z_buflen; } DBGLOG(RECV, SOAP_MESSAGE(fdebug, "\n---- compressed ----\n")); } #endif #ifndef WITH_NOHTTP if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK) /* read HTTP chunked transfer */ { for (;;) { register soap_wchar c; char *t, tmp[17]; if (soap->chunksize) { soap->buflen = ret = soap->frecv(soap, soap->buf, soap->chunksize > SOAP_BUFLEN ? SOAP_BUFLEN : soap->chunksize); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Getting chunk: read %u bytes\n", (unsigned int)ret)); DBGMSG(RECV, soap->buf, ret); soap->bufidx = 0; soap->chunksize -= ret; break; } t = tmp; if (!soap->chunkbuflen) { soap->chunkbuflen = ret = soap->frecv(soap, soap->buf, SOAP_BUFLEN); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Read %u bytes (chunked) from socket %d\n", (unsigned int)ret, soap->socket)); DBGMSG(RECV, soap->buf, ret); soap->bufidx = 0; if (!ret) { soap->ahead = EOF; return EOF; } } else soap->bufidx = soap->buflen; soap->buflen = soap->chunkbuflen; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Getting chunk size (idx=%u len=%u)\n", (unsigned int)soap->bufidx, (unsigned int)soap->buflen)); while (!soap_isxdigit((int)(c = soap_getchunkchar(soap)))) { if ((int)c == EOF) { soap->ahead = EOF; return EOF; } } do *t++ = (char)c; while (soap_isxdigit((int)(c = soap_getchunkchar(soap))) && (size_t)(t - tmp) < sizeof(tmp)-1); while ((int)c != EOF && c != '\n') c = soap_getchunkchar(soap); if ((int)c == EOF) { soap->ahead = EOF; return EOF; } *t = '\0'; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Chunk size = %s (hex)\n", tmp)); soap->chunksize = (size_t)soap_strtoul(tmp, &t, 16); if (!soap->chunksize) { soap->bufidx = soap->buflen = soap->chunkbuflen = 0; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of chunked message\n")); while ((int)c != EOF && c != '\n') c = soap_getchunkchar(soap); ret = 0; soap->ahead = EOF; break; } soap->buflen = soap->bufidx + soap->chunksize; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Moving buf len to idx=%u len=%u (%s)\n", (unsigned int)soap->bufidx, (unsigned int)soap->buflen, tmp)); if (soap->buflen > soap->chunkbuflen) { soap->buflen = soap->chunkbuflen; soap->chunksize -= soap->buflen - soap->bufidx; soap->chunkbuflen = 0; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Passed end of buffer for chunked HTTP (%u bytes left)\n", (unsigned int)(soap->buflen - soap->bufidx))); } else if (soap->chunkbuflen) soap->chunksize = 0; ret = soap->buflen - soap->bufidx; if (ret) break; } } else #endif { soap->bufidx = 0; soap->buflen = ret = soap->frecv(soap, soap->buf, SOAP_BUFLEN); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Read %u bytes from socket=%d/fd=%d\n", (unsigned int)ret, soap->socket, soap->recvfd)); DBGMSG(RECV, soap->buf, ret); } #ifdef WITH_ZLIB if (soap->mode & SOAP_ENC_ZLIB) { memcpy(soap->z_buf, soap->buf, SOAP_BUFLEN); soap->d_stream->next_in = (Byte*)(soap->z_buf + soap->bufidx); soap->d_stream->avail_in = (unsigned int)ret; soap->d_stream->next_out = (Byte*)soap->buf; soap->d_stream->avail_out = SOAP_BUFLEN; r = inflate(soap->d_stream, Z_NO_FLUSH); if (r == Z_NEED_DICT && soap->z_dict) r = inflateSetDictionary(soap->d_stream, (const Bytef*)soap->z_dict, soap->z_dict_len); if (r == Z_OK || r == Z_STREAM_END) { soap->bufidx = 0; soap->z_buflen = soap->buflen; soap->buflen = SOAP_BUFLEN - soap->d_stream->avail_out; if (soap->zlib_in == SOAP_ZLIB_GZIP) soap->z_crc = crc32(soap->z_crc, (Byte*)soap->buf, (unsigned int)soap->buflen); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflated %u bytes\n", (unsigned int)soap->buflen)); if (ret && !soap->buflen && r != Z_STREAM_END) goto zlib_again; ret = soap->buflen; if (r == Z_STREAM_END) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflated total %lu->%lu bytes\n", soap->d_stream->total_in, soap->d_stream->total_out)); soap->z_ratio_in = (float)soap->d_stream->total_in / (float)soap->d_stream->total_out; soap->d_stream->next_out = Z_NULL; } DBGLOG(RECV, SOAP_MESSAGE(fdebug, "\n---- decompressed ----\n")); DBGMSG(RECV, soap->buf, ret); #ifndef WITH_LEANER if (soap->fpreparerecv && (r = soap->fpreparerecv(soap, soap->buf, ret))) return soap->error = r; #endif } else { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unable to inflate: (%d) %s\n", r, soap->d_stream->msg ? soap->d_stream->msg : SOAP_STR_EOS)); soap->d_stream->next_out = Z_NULL; return soap->error = SOAP_ZLIB_ERROR; } } #endif #ifndef WITH_LEANER if (soap->fpreparerecv #ifdef WITH_ZLIB && soap->zlib_in == SOAP_ZLIB_NONE #endif && (r = soap->fpreparerecv(soap, soap->buf + soap->bufidx, ret))) return soap->error = r; #endif soap->count += ret; return !ret; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_recv(struct soap *soap) { #ifndef WITH_LEANER if (soap->mode & SOAP_ENC_DIME) { if (soap->dime.buflen) { char *s; int i; unsigned char tmp[12]; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DIME hdr for chunked DIME is in buffer\n")); soap->count += soap->dime.buflen - soap->buflen; soap->buflen = soap->dime.buflen; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Skip padding (%ld bytes)\n", -(long)soap->dime.size&3)); for (i = -(long)soap->dime.size&3; i > 0; i--) { soap->bufidx++; if (soap->bufidx >= soap->buflen) if (soap_recv_raw(soap)) return EOF; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get DIME hdr for next chunk\n")); s = (char*)tmp; for (i = 12; i > 0; i--) { *s++ = soap->buf[soap->bufidx++]; if (soap->bufidx >= soap->buflen) if (soap_recv_raw(soap)) return EOF; } soap->dime.flags = tmp[0] & 0x7; soap->dime.size = ((size_t)tmp[8] << 24) | ((size_t)tmp[9] << 16) | ((size_t)tmp[10] << 8) | ((size_t)tmp[11]); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get DIME chunk (%u bytes)\n", (unsigned int)soap->dime.size)); if (soap->dime.flags & SOAP_DIME_CF) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "More chunking\n")); soap->dime.chunksize = soap->dime.size; if (soap->buflen - soap->bufidx >= soap->dime.size) { soap->dime.buflen = soap->buflen; soap->buflen = soap->bufidx + soap->dime.chunksize; } else soap->dime.chunksize -= soap->buflen - soap->bufidx; } else { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Last chunk\n")); soap->dime.buflen = 0; soap->dime.chunksize = 0; } soap->count = soap->buflen - soap->bufidx; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%u bytes remaining\n", (unsigned int)soap->count)); return SOAP_OK; } if (soap->dime.chunksize) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get next DIME hdr for chunked DIME (%u bytes chunk)\n", (unsigned int)soap->dime.chunksize)); if (soap_recv_raw(soap)) return EOF; if (soap->buflen - soap->bufidx >= soap->dime.chunksize) { soap->dime.buflen = soap->buflen; soap->count -= soap->buflen - soap->bufidx - soap->dime.chunksize; soap->buflen = soap->bufidx + soap->dime.chunksize; } else soap->dime.chunksize -= soap->buflen - soap->bufidx; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%lu bytes remaining, count=%lu\n", (unsigned long)(soap->buflen-soap->bufidx), (unsigned long)soap->count)); return SOAP_OK; } } while (soap->ffilterrecv) { int err = soap->filterstop; if (err) soap->bufidx = soap->buflen = 0; else err = soap_recv_raw(soap); /* do not call again after EOF */ if ((soap->error = soap->ffilterrecv(soap, soap->buf, &soap->buflen, sizeof(soap->buf)))) return soap->error; if (soap->buflen) { soap->filterstop = err; return SOAP_OK; } if (err) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Returning postponed error %d\n", err)); return err; } } #endif return soap_recv_raw(soap); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 soap_wchar SOAP_FMAC2 soap_getchar(struct soap *soap) { register soap_wchar c; c = soap->ahead; if (c) { if (c != EOF) soap->ahead = 0; return c; } return soap_get1(soap); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 const struct soap_code_map* SOAP_FMAC2 soap_code(const struct soap_code_map *code_map, const char *str) { if (code_map && str) { while (code_map->string) { if (!strcmp(str, code_map->string)) /* case sensitive */ return code_map; code_map++; } } return NULL; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 long SOAP_FMAC2 soap_code_int(const struct soap_code_map *code_map, const char *str, long other) { if (code_map) { while (code_map->string) { if (!soap_tag_cmp(str, code_map->string)) /* case insensitive */ return code_map->code; code_map++; } } return other; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 const char* SOAP_FMAC2 soap_code_str(const struct soap_code_map *code_map, long code) { if (!code_map) return NULL; while (code_map->code != code && code_map->string) code_map++; return code_map->string; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 long SOAP_FMAC2 soap_code_bits(const struct soap_code_map *code_map, const char *str) { register long bits = 0; if (code_map) { while (str && *str) { const struct soap_code_map *p; for (p = code_map; p->string; p++) { register size_t n = strlen(p->string); if (!strncmp(p->string, str, n) && soap_blank((soap_wchar)str[n])) { bits |= p->code; str += n; while (*str > 0 && *str <= 32) str++; break; } } if (!p->string) return 0; } } return bits; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 const char* SOAP_FMAC2 soap_code_list(struct soap *soap, const struct soap_code_map *code_map, long code) { register char *t = soap->tmpbuf; if (code_map) { while (code_map->string) { if (code_map->code & code) { register const char *s = code_map->string; if (t != soap->tmpbuf) *t++ = ' '; while (*s && t < soap->tmpbuf + sizeof(soap->tmpbuf) - 1) *t++ = *s++; if (t == soap->tmpbuf + sizeof(soap->tmpbuf) - 1) break; } code_map++; } } *t = '\0'; return soap->tmpbuf; } #endif /******************************************************************************/ #ifndef PALM_1 static soap_wchar soap_char(struct soap *soap) { char tmp[8]; register int i; register soap_wchar c; register char *s = tmp; for (i = 0; i < 7; i++) { c = soap_get1(soap); if (c == ';' || (int)c == EOF) break; *s++ = (char)c; } *s = '\0'; if (*tmp == '#') { if (tmp[1] == 'x' || tmp[1] == 'X') return (soap_wchar)soap_strtol(tmp + 2, NULL, 16); return (soap_wchar)soap_strtol(tmp + 1, NULL, 10); } if (!strcmp(tmp, "lt")) return '<'; if (!strcmp(tmp, "gt")) return '>'; if (!strcmp(tmp, "amp")) return '&'; if (!strcmp(tmp, "quot")) return '"'; if (!strcmp(tmp, "apos")) return '\''; #ifndef WITH_LEAN return (soap_wchar)soap_code_int(html_entity_codes, tmp, SOAP_UNKNOWN_CHAR); #else return SOAP_UNKNOWN_CHAR; /* use this to represent unknown code */ #endif } #endif /******************************************************************************/ #ifdef WITH_LEAN #ifndef PALM_1 soap_wchar soap_get0(struct soap *soap) { if (soap->bufidx >= soap->buflen && soap_recv(soap)) return EOF; return (unsigned char)soap->buf[soap->bufidx]; } #endif #endif /******************************************************************************/ #ifdef WITH_LEAN #ifndef PALM_1 soap_wchar soap_get1(struct soap *soap) { if (soap->bufidx >= soap->buflen && soap_recv(soap)) return EOF; return (unsigned char)soap->buf[soap->bufidx++]; } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 soap_wchar SOAP_FMAC2 soap_get(struct soap *soap) { register soap_wchar c; c = soap->ahead; if (c) { if ((int)c != EOF) soap->ahead = 0; } else c = soap_get1(soap); while ((int)c != EOF) { if (soap->cdata) { if (c == ']') { c = soap_get1(soap); if (c == ']') { c = soap_get0(soap); if (c == '>') { soap->cdata = 0; c = soap_get1(soap); c = soap_get1(soap); } else { soap_unget(soap, ']'); return ']'; } } else { soap_revget1(soap); return ']'; } } else return c; } switch (c) { case '<': do c = soap_get1(soap); while (soap_blank(c)); if (c == '!' || c == '?' || c == '%') { register int k = 1; if (c == '!') { c = soap_get1(soap); if (c == '[') { do c = soap_get1(soap); while ((int)c != EOF && c != '['); if ((int)c == EOF) break; soap->cdata = 1; c = soap_get1(soap); continue; } if (c == '-' && (c = soap_get1(soap)) == '-') { do { c = soap_get1(soap); if (c == '-' && (c = soap_get1(soap)) == '-') break; } while ((int)c != EOF); } } else if (c == '?') c = soap_get_pi(soap); while ((int)c != EOF) { if (c == '<') k++; else if (c == '>') { if (--k <= 0) break; } c = soap_get1(soap); } if ((int)c == EOF) break; c = soap_get1(soap); continue; } if (c == '/') return SOAP_TT; soap_revget1(soap); return SOAP_LT; case '>': return SOAP_GT; case '"': return SOAP_QT; case '\'': return SOAP_AP; case '&': return soap_char(soap) | 0x80000000; } break; } return c; } #endif /******************************************************************************/ #ifndef PALM_1 static soap_wchar soap_get_pi(struct soap *soap) { char buf[64]; register char *s = buf; register int i = sizeof(buf); register soap_wchar c = soap_getchar(soap); /* This is a quick way to parse XML PI and we could use a callback instead to * enable applications to intercept processing instructions */ while ((int)c != EOF && c != '?') { if (--i > 0) { if (soap_blank(c)) c = ' '; *s++ = (char)c; } c = soap_getchar(soap); } *s = '\0'; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "XML PI \n", buf)); if (!strncmp(buf, "xml ", 4)) { s = strstr(buf, " encoding="); if (s && s[10]) { if (!soap_tag_cmp(s + 11, "iso-8859-1*") || !soap_tag_cmp(s + 11, "latin1*")) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Switching to latin1 encoding\n")); soap->mode |= SOAP_ENC_LATIN; } else if (!soap_tag_cmp(s + 11, "utf-8*")) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Switching to utf-8 encoding\n")); soap->mode &= ~SOAP_ENC_LATIN; } } } if ((int)c != EOF) c = soap_getchar(soap); return c; } #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_move(struct soap *soap, long n) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Moving %ld bytes forward\n", (long)n)); for (; n > 0; n--) if ((int)soap_getchar(soap) == EOF) return SOAP_EOF; return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 size_t SOAP_FMAC2 soap_tell(struct soap *soap) { return soap->count - soap->buflen + soap->bufidx - (soap->ahead != 0); } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_pututf8(struct soap *soap, register unsigned long c) { char tmp[16]; if (c < 0x80 && c > 0) { *tmp = (char)c; return soap_send_raw(soap, tmp, 1); } #ifndef WITH_LEAN if (c >= 0x80) { register char *t = tmp; if (c < 0x0800) *t++ = (char)(0xC0 | ((c >> 6) & 0x1F)); else { if (c < 0x010000) *t++ = (char)(0xE0 | ((c >> 12) & 0x0F)); else { if (c < 0x200000) *t++ = (char)(0xF0 | ((c >> 18) & 0x07)); else { if (c < 0x04000000) *t++ = (char)(0xF8 | ((c >> 24) & 0x03)); else { *t++ = (char)(0xFC | ((c >> 30) & 0x01)); *t++ = (char)(0x80 | ((c >> 24) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 18) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 12) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 6) & 0x3F)); } *t++ = (char)(0x80 | (c & 0x3F)); *t = '\0'; } #else sprintf(tmp, "&#%lu;", c); #endif return soap_send(soap, tmp); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 soap_wchar SOAP_FMAC2 soap_getutf8(struct soap *soap) { register soap_wchar c, c1, c2, c3, c4; c = soap->ahead; if (c) soap->ahead = 0; else c = soap_get(soap); if (c < 0x80 || c > 0xFF || (soap->mode & SOAP_ENC_LATIN)) return c; c1 = soap_get1(soap); if (c1 < 0x80) { soap_revget1(soap); /* doesn't look like this is UTF8 */ return c; } c1 &= 0x3F; if (c < 0xE0) return ((soap_wchar)(c & 0x1F) << 6) | c1; c2 = (soap_wchar)soap_get1(soap) & 0x3F; if (c < 0xF0) return ((soap_wchar)(c & 0x0F) << 12) | (c1 << 6) | c2; c3 = (soap_wchar)soap_get1(soap) & 0x3F; if (c < 0xF8) return ((soap_wchar)(c & 0x07) << 18) | (c1 << 12) | (c2 << 6) | c3; c4 = (soap_wchar)soap_get1(soap) & 0x3F; if (c < 0xFC) return ((soap_wchar)(c & 0x03) << 24) | (c1 << 18) | (c2 << 12) | (c3 << 6) | c4; return ((soap_wchar)(c & 0x01) << 30) | (c1 << 24) | (c2 << 18) | (c3 << 12) | (c4 << 6) | (soap_wchar)(soap_get1(soap) & 0x3F); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_puthex(struct soap *soap, const unsigned char *s, int n) { char d[2]; register int i; #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { if (!(soap->dom->data = soap_s2hex(soap, s, NULL, n))) return soap->error; return SOAP_OK; } #endif for (i = 0; i < n; i++) { register int m = *s++; d[0] = (char)((m >> 4) + (m > 159 ? '7' : '0')); m &= 0x0F; d[1] = (char)(m + (m > 9 ? '7' : '0')); if (soap_send_raw(soap, d, 2)) return soap->error; } return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 unsigned char* SOAP_FMAC2 soap_gethex(struct soap *soap, int *n) { #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { soap->dom->data = soap_string_in(soap, 0, -1, -1); return (unsigned char*)soap_hex2s(soap, soap->dom->data, NULL, 0, n); } #endif #ifdef WITH_FAST soap->labidx = 0; for (;;) { register char *s; register size_t i, k; if (soap_append_lab(soap, NULL, 0)) return NULL; s = soap->labbuf + soap->labidx; k = soap->lablen - soap->labidx; soap->labidx = soap->lablen; for (i = 0; i < k; i++) { register char d1, d2; register soap_wchar c; c = soap_get(soap); if (soap_isxdigit(c)) { d1 = (char)c; c = soap_get(soap); if (soap_isxdigit(c)) d2 = (char)c; else { soap->error = SOAP_TYPE; return NULL; } } else { unsigned char *p; soap_unget(soap, c); if (n) *n = (int)(soap->lablen + i - k); p = (unsigned char*)soap_malloc(soap, soap->lablen + i - k); if (p) memcpy(p, soap->labbuf, soap->lablen + i - k); return p; } *s++ = (char)(((d1 >= 'A' ? (d1 & 0x7) + 9 : d1 - '0') << 4) + (d2 >= 'A' ? (d2 & 0x7) + 9 : d2 - '0')); } } #else if (soap_new_block(soap) == NULL) return NULL; for (;;) { register int i; register char *s = (char*)soap_push_block(soap, NULL, SOAP_BLKLEN); if (!s) { soap_end_block(soap, NULL); return NULL; } for (i = 0; i < SOAP_BLKLEN; i++) { register char d1, d2; register soap_wchar c = soap_get(soap); if (soap_isxdigit(c)) { d1 = (char)c; c = soap_get(soap); if (soap_isxdigit(c)) d2 = (char)c; else { soap_end_block(soap, NULL); soap->error = SOAP_TYPE; return NULL; } } else { unsigned char *p; soap_unget(soap, c); if (n) *n = (int)soap_size_block(soap, NULL, i); p = (unsigned char*)soap_save_block(soap, NULL, 0); return p; } *s++ = ((d1 >= 'A' ? (d1 & 0x7) + 9 : d1 - '0') << 4) + (d2 >= 'A' ? (d2 & 0x7) + 9 : d2 - '0'); } } #endif } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_putbase64(struct soap *soap, const unsigned char *s, int n) { register int i; register unsigned long m; char d[4]; if (!s) return SOAP_OK; #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { if (!(soap->dom->data = soap_s2base64(soap, s, NULL, n))) return soap->error; return SOAP_OK; } #endif for (; n > 2; n -= 3, s += 3) { m = s[0]; m = (m << 8) | s[1]; m = (m << 8) | s[2]; for (i = 4; i > 0; m >>= 6) d[--i] = soap_base64o[m & 0x3F]; if (soap_send_raw(soap, d, 4)) return soap->error; } if (n > 0) { m = 0; for (i = 0; i < n; i++) m = (m << 8) | *s++; for (; i < 3; i++) m <<= 8; for (i++; i > 0; m >>= 6) d[--i] = soap_base64o[m & 0x3F]; for (i = 3; i > n; i--) d[i] = '='; if (soap_send_raw(soap, d, 4)) return soap->error; } return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 unsigned char* SOAP_FMAC2 soap_getbase64(struct soap *soap, int *n, int malloc_flag) { (void)malloc_flag; #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { soap->dom->data = soap_string_in(soap, 0, -1, -1); return (unsigned char*)soap_base642s(soap, soap->dom->data, NULL, 0, n); } #endif #ifdef WITH_FAST soap->labidx = 0; for (;;) { register size_t i, k; register char *s; if (soap_append_lab(soap, NULL, 2)) return NULL; s = soap->labbuf + soap->labidx; k = soap->lablen - soap->labidx; soap->labidx = 3 * (soap->lablen / 3); if (!s) return NULL; if (k > 2) { for (i = 0; i < k - 2; i += 3) { register unsigned long m = 0; register int j = 0; do { register soap_wchar c = soap_get(soap); if (c < SOAP_AP) c &= 0x7FFFFFFF; if (c == '=' || c < 0) { unsigned char *p; switch (j) { case 2: *s++ = (char)((m >> 4) & 0xFF); i++; break; case 3: *s++ = (char)((m >> 10) & 0xFF); *s++ = (char)((m >> 2) & 0xFF); i += 2; } if (n) *n = (int)(soap->lablen + i - k); p = (unsigned char*)soap_malloc(soap, soap->lablen + i - k); if (p) memcpy(p, soap->labbuf, soap->lablen + i - k); if (c >= 0) { while ((int)((c = soap_get(soap)) != EOF) && c != SOAP_LT && c != SOAP_TT) ; } soap_unget(soap, c); return p; } c -= '+'; if (c >= 0 && c <= 79) { register int b = soap_base64i[c]; if (b >= 64) { soap->error = SOAP_TYPE; return NULL; } m = (m << 6) + b; j++; } else if (!soap_blank(c + '+')) { soap->error = SOAP_TYPE; return NULL; } } while (j < 4); *s++ = (char)((m >> 16) & 0xFF); *s++ = (char)((m >> 8) & 0xFF); *s++ = (char)(m & 0xFF); } } } #else if (soap_new_block(soap) == NULL) return NULL; for (;;) { register int i; register char *s = (char*)soap_push_block(soap, NULL, 3 * SOAP_BLKLEN); /* must be multiple of 3 */ if (!s) { soap_end_block(soap, NULL); return NULL; } for (i = 0; i < SOAP_BLKLEN; i++) { register unsigned long m = 0; register int j = 0; do { register soap_wchar c = soap_get(soap); if (c == '=' || c < 0) { unsigned char *p; i *= 3; switch (j) { case 2: *s++ = (char)((m >> 4) & 0xFF); i++; break; case 3: *s++ = (char)((m >> 10) & 0xFF); *s++ = (char)((m >> 2) & 0xFF); i += 2; } if (n) *n = (int)soap_size_block(soap, NULL, i); p = (unsigned char*)soap_save_block(soap, NULL, 0); if (c >= 0) { while ((int)((c = soap_get(soap)) != EOF) && c != SOAP_LT && c != SOAP_TT) ; } soap_unget(soap, c); return p; } c -= '+'; if (c >= 0 && c <= 79) { int b = soap_base64i[c]; if (b >= 64) { soap->error = SOAP_TYPE; return NULL; } m = (m << 6) + b; j++; } else if (!soap_blank(c)) { soap->error = SOAP_TYPE; return NULL; } } while (j < 4); *s++ = (char)((m >> 16) & 0xFF); *s++ = (char)((m >> 8) & 0xFF); *s++ = (char)(m & 0xFF); } } #endif } #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_xop_forward(struct soap *soap, unsigned char **ptr, int *size, char **id, char **type, char **options) { /* Check MTOM xop:Include element (within hex/base64Binary) */ /* TODO: this code to be obsoleted with new import/xop.h conventions */ short body = soap->body; /* should save type too? */ if (!soap_peek_element(soap)) { if (!soap_element_begin_in(soap, "xop:Include", 0, NULL)) { if (soap_dime_forward(soap, ptr, size, id, type, options)) return soap->error; } if (soap->body && soap_element_end_in(soap, NULL)) return soap->error; } soap->body = body; return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_dime_forward(struct soap *soap, unsigned char **ptr, int *size, char **id, char **type, char **options) { struct soap_xlist *xp; *ptr = NULL; *size = 0; *id = NULL; *type = NULL; *options = NULL; if (!*soap->href) return SOAP_OK; *id = soap_strdup(soap, soap->href); xp = (struct soap_xlist*)SOAP_MALLOC(soap, sizeof(struct soap_xlist)); if (!xp) return soap->error = SOAP_EOM; xp->next = soap->xlist; xp->ptr = ptr; xp->size = size; xp->id = *id; xp->type = type; xp->options = options; soap->xlist = xp; return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 char * SOAP_FMAC2 soap_strdup(struct soap *soap, const char *s) { char *t = NULL; if (s && (t = (char*)soap_malloc(soap, strlen(s) + 1))) strcpy(t, s); return t; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 wchar_t * SOAP_FMAC2 soap_wstrdup(struct soap *soap, const wchar_t *s) { wchar_t *t = NULL; if (s) { size_t n = 0; while (s[n]) n++; if ((t = (wchar_t*)soap_malloc(soap, sizeof(wchar_t)*(n+1)))) memcpy(t, s, sizeof(wchar_t)*(n+1)); } return t; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 struct soap_blist* SOAP_FMAC2 soap_new_block(struct soap *soap) { struct soap_blist *p; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "New block sequence (prev=%p)\n", soap->blist)); if (!(p = (struct soap_blist*)SOAP_MALLOC(soap, sizeof(struct soap_blist)))) { soap->error = SOAP_EOM; return NULL; } p->next = soap->blist; p->ptr = NULL; p->size = 0; soap->blist = p; return p; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void* SOAP_FMAC2 soap_push_block(struct soap *soap, struct soap_blist *b, size_t n) { char *p; if (!b) b = soap->blist; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Push block of %u bytes (%u bytes total)\n", (unsigned int)n, (unsigned int)b->size + (unsigned int)n)); if (!(p = (char*)SOAP_MALLOC(soap, n + sizeof(char*) + sizeof(size_t)))) { soap->error = SOAP_EOM; return NULL; } *(char**)p = b->ptr; *(size_t*)(p + sizeof(char*)) = n; b->ptr = p; b->size += n; return p + sizeof(char*) + sizeof(size_t); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_pop_block(struct soap *soap, struct soap_blist *b) { char *p; if (!b) b = soap->blist; if (!b->ptr) return; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Pop block\n")); p = b->ptr; b->size -= *(size_t*)(p + sizeof(char*)); b->ptr = *(char**)p; SOAP_FREE(soap, p); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_update_pointers(struct soap *soap, char *start, char *end, char *p1, char *p2) { #ifndef WITH_NOIDREF int i; register struct soap_ilist *ip = NULL; register struct soap_flist *fp = NULL; #ifndef WITH_LEANER register struct soap_xlist *xp = NULL; #endif register void *p, **q; for (i = 0; i < SOAP_IDHASH; i++) { for (ip = soap->iht[i]; ip; ip = ip->next) { if (ip->ptr && (char*)ip->ptr >= start && (char*)ip->ptr < end) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Update id='%s' %p -> %p\n", ip->id, ip->ptr, (char*)ip->ptr + (p1-p2))); ip->ptr = (char*)ip->ptr + (p1-p2); } for (q = &ip->link; q; q = (void**)p) { p = *q; if (p && (char*)p >= start && (char*)p < end) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Link update id='%s' %p\n", ip->id, p)); *q = (char*)p + (p1-p2); } } for (q = &ip->copy; q; q = (void**)p) { p = *q; if (p && (char*)p >= start && (char*)p < end) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy chain update id='%s' %p\n", ip->id, p)); *q = (char*)p + (p1-p2); } } for (fp = ip->flist; fp; fp = fp->next) { if ((char*)fp->ptr >= start && (char*)fp->ptr < end) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy list update id='%s' %p\n", ip->id, fp)); fp->ptr = (char*)fp->ptr + (p1-p2); } } } } #ifndef WITH_LEANER for (xp = soap->xlist; xp; xp = xp->next) { if (xp->ptr && (char*)xp->ptr >= start && (char*)xp->ptr < end) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Update id='%s' %p -> %p\n", xp->id ? xp->id : SOAP_STR_EOS, xp->ptr, (char*)xp->ptr + (p1-p2))); xp->ptr = (unsigned char**)((char*)xp->ptr + (p1-p2)); xp->size = (int*)((char*)xp->size + (p1-p2)); xp->type = (char**)((char*)xp->type + (p1-p2)); xp->options = (char**)((char*)xp->options + (p1-p2)); } } #endif #else (void)soap; (void)start; (void)end; (void)p1; (void)p2; #endif } #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_1 static int soap_has_copies(struct soap *soap, register const char *start, register const char *end) { register int i; register struct soap_ilist *ip = NULL; register struct soap_flist *fp = NULL; register const char *p; for (i = 0; i < SOAP_IDHASH; i++) { for (ip = soap->iht[i]; ip; ip = ip->next) { for (p = (const char*)ip->copy; p; p = *(const char**)p) if (p >= start && p < end) return SOAP_ERR; for (fp = ip->flist; fp; fp = fp->next) if ((const char*)fp->ptr >= start && (const char*)fp->ptr < end) return SOAP_ERR; } } return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_resolve(struct soap *soap) { register int i; register struct soap_ilist *ip = NULL; register struct soap_flist *fp = NULL; short flag; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolving forwarded data\n")); for (i = 0; i < SOAP_IDHASH; i++) { for (ip = soap->iht[i]; ip; ip = ip->next) { if (ip->ptr) { register void *p, **q, *r; q = (void**)ip->link; ip->link = NULL; r = ip->ptr; DBGLOG(TEST, if (q) SOAP_MESSAGE(fdebug, "Traversing link chain to resolve id='%s'\n", ip->id)); while (q) { p = *q; *q = r; DBGLOG(TEST,SOAP_MESSAGE(fdebug, "... link %p -> %p\n", q, r)); q = (void**)p; } } else if (*ip->id == '#') { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Missing data for id='%s'\n", ip->id)); strcpy(soap->id, ip->id + 1); return soap->error = SOAP_MISSING_ID; } } } do { flag = 0; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolution phase\n")); for (i = 0; i < SOAP_IDHASH; i++) { for (ip = soap->iht[i]; ip; ip = ip->next) { if (ip->ptr && !soap_has_copies(soap, (const char*)ip->ptr, (const char*)ip->ptr + ip->size)) { if (ip->copy) { register void *p, **q = (void**)ip->copy; DBGLOG(TEST, if (q) SOAP_MESSAGE(fdebug, "Traversing copy chain to resolve id='%s'\n", ip->id)); ip->copy = NULL; do { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "... copy %p -> %p (%u bytes)\n", ip->ptr, q, (unsigned int)ip->size)); p = *q; memcpy(q, ip->ptr, ip->size); q = (void**)p; } while (q); flag = 1; } for (fp = ip->flist; fp; fp = ip->flist) { register unsigned int k = fp->level; register void *p = ip->ptr; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolving forwarded data type=%d location=%p level=%u,%u id='%s'\n", ip->type, p, ip->level, fp->level, ip->id)); while (ip->level < k) { register void **q = (void**)soap_malloc(soap, sizeof(void*)); if (!q) return soap->error; *q = p; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Descending one level, new location=%p holds=%p...\n", q, *q)); p = (void*)q; k--; } if (fp->fcopy) fp->fcopy(soap, ip->type, fp->type, fp->ptr, fp->len, p, ip->size); else soap_fcopy(soap, ip->type, fp->type, fp->ptr, fp->len, p, ip->size); ip->flist = fp->next; SOAP_FREE(soap, fp); flag = 1; } } } } } while (flag); #ifdef SOAP_DEBUG for (i = 0; i < SOAP_IDHASH; i++) { for (ip = soap->iht[i]; ip; ip = ip->next) { if (ip->copy || ip->flist) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolution error: forwarded data for id='%s' could not be propagated, please report this problem to the developers\n", ip->id)); } } } #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolution done\n")); return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 size_t SOAP_FMAC2 soap_size_block(struct soap *soap, struct soap_blist *b, size_t n) { if (!b) b = soap->blist; if (b->ptr) { b->size -= *(size_t*)(b->ptr + sizeof(char*)) - n; *(size_t*)(b->ptr + sizeof(char*)) = n; } return b->size; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 char* SOAP_FMAC2 soap_first_block(struct soap *soap, struct soap_blist *b) { char *p, *q, *r; if (!b) b = soap->blist; p = b->ptr; if (!p) return NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "First block\n")); r = NULL; do { q = *(char**)p; *(char**)p = r; r = p; p = q; } while (p); b->ptr = r; return r + sizeof(char*) + sizeof(size_t); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 char* SOAP_FMAC2 soap_next_block(struct soap *soap, struct soap_blist *b) { char *p; if (!b) b = soap->blist; p = b->ptr; if (p) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Next block\n")); b->ptr = *(char**)p; SOAP_FREE(soap, p); if (b->ptr) return b->ptr + sizeof(char*) + sizeof(size_t); } return NULL; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 size_t SOAP_FMAC2 soap_block_size(struct soap *soap, struct soap_blist *b) { if (!b) b = soap->blist; return *(size_t*)(b->ptr + sizeof(char*)); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_end_block(struct soap *soap, struct soap_blist *b) { char *p, *q; if (!b) b = soap->blist; if (b) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of block sequence, free all remaining blocks\n")); for (p = b->ptr; p; p = q) { q = *(char**)p; SOAP_FREE(soap, p); } if (soap->blist == b) soap->blist = b->next; else { struct soap_blist *bp; for (bp = soap->blist; bp; bp = bp->next) { if (bp->next == b) { bp->next = b->next; break; } } } SOAP_FREE(soap, b); } DBGLOG(TEST, if (soap->blist) SOAP_MESSAGE(fdebug, "Restore previous block sequence\n")); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 char* SOAP_FMAC2 soap_save_block(struct soap *soap, struct soap_blist *b, char *p, int flag) { register size_t n; register char *q, *s; if (!b) b = soap->blist; if (b->size) { if (!p) p = (char*)soap_malloc(soap, b->size); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Save all blocks in contiguous memory space of %u bytes (%p->%p)\n", (unsigned int)b->size, b->ptr, p)); if (p) { for (s = p, q = soap_first_block(soap, b); q; q = soap_next_block(soap, b)) { n = soap_block_size(soap, b); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy %u bytes from %p to %p\n", (unsigned int)n, q, s)); #ifndef WITH_NOIDREF if (flag) soap_update_pointers(soap, q, q + n, s, q); #endif memcpy(s, q, n); s += n; } } else soap->error = SOAP_EOM; } soap_end_block(soap, b); return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 char * SOAP_FMAC2 soap_putsize(struct soap *soap, const char *type, int size) { return soap_putsizes(soap, type, &size, 1); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 char * SOAP_FMAC2 soap_putsizes(struct soap *soap, const char *type, const int *size, int dim) { return soap_putsizesoffsets(soap, type, size, NULL, dim); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 char * SOAP_FMAC2 soap_putsizesoffsets(struct soap *soap, const char *type, const int *size, const int *offset, int dim) { int i; if (!type) return NULL; if (soap->version == 2) { sprintf(soap->type, "%s[%d", type, size[0]); for (i = 1; i < dim; i++) sprintf(soap->type + strlen(soap->type), " %d", size[i]); } else { if (offset) { sprintf(soap->type, "%s[%d", type, size[0] + offset[0]); for (i = 1; i < dim; i++) sprintf(soap->type + strlen(soap->type), ",%d", size[i] + offset[i]); } else { sprintf(soap->type, "%s[%d", type, size[0]); for (i = 1; i < dim; i++) sprintf(soap->type + strlen(soap->type), ",%d", size[i]); } strcat(soap->type, "]"); } return soap->type; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 char * SOAP_FMAC2 soap_putoffset(struct soap *soap, int offset) { return soap_putoffsets(soap, &offset, 1); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 char * SOAP_FMAC2 soap_putoffsets(struct soap *soap, const int *offset, int dim) { register int i; sprintf(soap->arrayOffset, "[%d", offset[0]); for (i = 1; i < dim; i++) sprintf(soap->arrayOffset + strlen(soap->arrayOffset), ",%d", offset[i]); strcat(soap->arrayOffset, "]"); return soap->arrayOffset; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_size(const int *size, int dim) { register int i, n = size[0]; for (i = 1; i < dim; i++) n *= size[i]; return n; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_getoffsets(const char *attr, const int *size, int *offset, int dim) { register int i, j = 0; if (offset) for (i = 0; i < dim && attr && *attr; i++) { attr++; j *= size[i]; j += offset[i] = (int)soap_strtol(attr, NULL, 10); attr = strchr(attr, ','); } else for (i = 0; i < dim && attr && *attr; i++) { attr++; j *= size[i]; j += (int)soap_strtol(attr, NULL, 10); attr = strchr(attr, ','); } return j; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_getsize(const char *attr1, const char *attr2, int *j) { register int n, k; char *s; *j = 0; if (!*attr1) return -1; if (*attr1 == '[') attr1++; n = 1; for (;;) { k = (int)soap_strtol(attr1, &s, 10); n *= k; if (k < 0 || n > SOAP_MAXARRAYSIZE || s == attr1) return -1; attr1 = strchr(s, ','); if (!attr1) attr1 = strchr(s, ' '); if (attr2 && *attr2) { attr2++; *j *= k; k = (int)soap_strtol(attr2, &s, 10); *j += k; if (k < 0) return -1; attr2 = s; } if (!attr1) break; attr1++; } return n - *j; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_getsizes(const char *attr, int *size, int dim) { register int i, k, n; if (!*attr) return -1; i = (int)strlen(attr); n = 1; do { for (i = i-1; i >= 0; i--) if (attr[i] == '[' || attr[i] == ',' || attr[i] == ' ') break; k = (int)soap_strtol(attr + i + 1, NULL, 10); n *= size[--dim] = k; if (k < 0 || n > SOAP_MAXARRAYSIZE) return -1; } while (i >= 0 && attr[i] != '['); return n; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_getposition(const char *attr, int *pos) { register int i, n; if (!*attr) return -1; n = 0; i = 1; do { pos[n++] = (int)soap_strtol(attr + i, NULL, 10); while (attr[i] && attr[i] != ',' && attr[i] != ']') i++; if (attr[i] == ',') i++; } while (n < SOAP_MAXDIMS && attr[i] && attr[i] != ']'); return n; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 struct soap_nlist * SOAP_FMAC2 soap_push_namespace(struct soap *soap, const char *id, const char *ns) { register struct soap_nlist *np; register struct Namespace *p; register short i = -1; register size_t n, k; n = strlen(id); k = strlen(ns) + 1; p = soap->local_namespaces; if (p) { for (i = 0; p->id; p++, i++) { if (p->ns && !strcmp(ns, p->ns)) { if (p->out) { SOAP_FREE(soap, p->out); p->out = NULL; } break; } if (p->out) { if (!strcmp(ns, p->out)) break; } else if (p->in) { if (!soap_tag_cmp(ns, p->in)) { if ((p->out = (char*)SOAP_MALLOC(soap, k))) strcpy(p->out, ns); break; } } } if (!p || !p->id) i = -1; } if (i >= 0) k = 0; np = (struct soap_nlist*)SOAP_MALLOC(soap, sizeof(struct soap_nlist) + n + k); if (!np) { soap->error = SOAP_EOM; return NULL; } np->next = soap->nlist; soap->nlist = np; np->level = soap->level; np->index = i; strcpy((char*)np->id, id); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Push namespace binding (level=%u) '%s' '%s'\n", soap->level, id, ns)); if (i < 0) { np->ns = strcpy((char*)np->id + n + 1, ns); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Push NOT OK: no match found for '%s' in namespace mapping table (added to stack anyway)\n", ns)); } else { np->ns = NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Push OK ('%s' matches '%s' in namespace table)\n", id, p->id)); } return np; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_pop_namespace(struct soap *soap) { register struct soap_nlist *np, *nq; for (np = soap->nlist; np && np->level >= soap->level; np = nq) { nq = np->next; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Pop namespace binding (level=%u) '%s'\n", soap->level, np->id)); SOAP_FREE(soap, np); } soap->nlist = np; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_match_namespace(struct soap *soap, const char *id1, const char *id2, size_t n1, size_t n2) { register struct soap_nlist *np = soap->nlist; const char *s; while (np && (strncmp(np->id, id1, n1) || np->id[n1])) np = np->next; if (np) { if (!(soap->mode & SOAP_XML_IGNORENS)) if (np->index < 0 || ((s = soap->local_namespaces[np->index].id) && (strncmp(s, id2, n2) || (s[n2] && s[n2] != '_')))) return SOAP_NAMESPACE; return SOAP_OK; } if (n1 == 0) return (soap->mode & SOAP_XML_IGNORENS) ? SOAP_OK : SOAP_NAMESPACE; if ((n1 == 3 && n1 == n2 && !strncmp(id1, "xml", 3) && !strncmp(id1, id2, 3)) || (soap->mode & SOAP_XML_IGNORENS)) return SOAP_OK; return soap->error = SOAP_SYNTAX_ERROR; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_current_namespace(struct soap *soap, const char *tag) { register struct soap_nlist *np; register const char *s; if (!tag || !strncmp(tag, "xml", 3)) return NULL; np = soap->nlist; if (!(s = strchr(tag, ':'))) { while (np && *np->id) /* find default namespace, if present */ np = np->next; } else { while (np && (strncmp(np->id, tag, s - tag) || np->id[s - tag])) np = np->next; if (!np) soap->error = SOAP_NAMESPACE; } if (np) { if (np->index >= 0) return soap->namespaces[np->index].ns; if (np->ns) return soap_strdup(soap, np->ns); } return NULL; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_tag_cmp(const char *s, const char *t) { for (;;) { register int c1 = *s; register int c2 = *t; if (!c1 || c1 == '"') break; if (c2 != '-') { if (c1 != c2) { if (c1 >= 'A' && c1 <= 'Z') c1 += 'a' - 'A'; if (c2 >= 'A' && c2 <= 'Z') c2 += 'a' - 'A'; } if (c1 != c2) { if (c2 != '*') return 1; c2 = *++t; if (!c2) return 0; if (c2 >= 'A' && c2 <= 'Z') c2 += 'a' - 'A'; for (;;) { c1 = *s; if (!c1 || c1 == '"') break; if (c1 >= 'A' && c1 <= 'Z') c1 += 'a' - 'A'; if (c1 == c2 && !soap_tag_cmp(s + 1, t + 1)) return 0; s++; } break; } } s++; t++; } if (*t == '*' && !t[1]) return 0; return *t; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_match_tag(struct soap *soap, const char *tag1, const char *tag2) { register const char *s, *t; register int err; if (!tag1 || !tag2 || !*tag2) return SOAP_OK; s = strchr(tag1, ':'); t = strchr(tag2, ':'); if (t) { if (s) { if (t[1] && SOAP_STRCMP(s + 1, t + 1)) return SOAP_TAG_MISMATCH; if (t != tag2 && (err = soap_match_namespace(soap, tag1, tag2, s - tag1, t - tag2))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Tags '%s' and '%s' match but namespaces differ\n", tag1, tag2)); if (err == SOAP_NAMESPACE) return SOAP_TAG_MISMATCH; return err; } } else if (SOAP_STRCMP(tag1, t + 1)) { return SOAP_TAG_MISMATCH; } else if (t != tag2 && (err = soap_match_namespace(soap, tag1, tag2, 0, t - tag2))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Tags '%s' and '%s' match but namespaces differ\n", tag1, tag2)); if (err == SOAP_NAMESPACE) return SOAP_TAG_MISMATCH; return err; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Tags and (default) namespaces match: '%s' '%s'\n", tag1, tag2)); return SOAP_OK; } if (s) { if (SOAP_STRCMP(s + 1, tag2)) return SOAP_TAG_MISMATCH; } else if (SOAP_STRCMP(tag1, tag2)) return SOAP_TAG_MISMATCH; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Tags match: '%s' '%s'\n", tag1, tag2)); return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_match_array(struct soap *soap, const char *type) { if (*soap->arrayType) if (soap_match_tag(soap, soap->arrayType, type) && soap_match_tag(soap, soap->arrayType, "xsd:anyType") && soap_match_tag(soap, soap->arrayType, "xsd:ur-type") ) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Array type mismatch: '%s' '%s'\n", soap->arrayType, type)); return SOAP_TAG_MISMATCH; } return SOAP_OK; } #endif /******************************************************************************\ * * SSL/TLS * \******************************************************************************/ /******************************************************************************/ #ifdef WITH_OPENSSL #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_rand() { unsigned char buf[4]; if (!soap_ssl_init_done) soap_ssl_init(); RAND_pseudo_bytes(buf, 4); return *(int*)buf; } #endif #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_ssl_server_context(struct soap *soap, unsigned short flags, const char *keyfile, const char *password, const char *cafile, const char *capath, const char *dhfile, const char *randfile, const char *sid) { int err; soap->keyfile = keyfile; soap->password = password; soap->cafile = cafile; soap->capath = capath; soap->crlfile = NULL; #ifdef WITH_OPENSSL soap->dhfile = dhfile; soap->randfile = randfile; #endif soap->ssl_flags = flags | (dhfile == NULL ? SOAP_SSL_RSA : 0); #ifdef WITH_GNUTLS if (dhfile) { char *s; int n = (int)soap_strtoul(dhfile, &s, 10); if (!soap->dh_params) gnutls_dh_params_init(&soap->dh_params); /* if dhfile is numeric, treat it as a key length to generate DH params which can take a while */ if (n >= 512 && s && *s == '\0') gnutls_dh_params_generate2(soap->dh_params, (unsigned int)n); else { unsigned int dparams_len; unsigned char dparams_buf[1024]; FILE *fd = fopen(dhfile, "r"); if (!fd) return soap_set_receiver_error(soap, "SSL/TLS error", "Invalid DH file", SOAP_SSL_ERROR); dparams_len = (unsigned int)fread(dparams_buf, 1, sizeof(dparams_buf), fd); fclose(fd); gnutls_datum_t dparams = { dparams_buf, dparams_len }; if (gnutls_dh_params_import_pkcs3(soap->dh_params, &dparams, GNUTLS_X509_FMT_PEM)) return soap_set_receiver_error(soap, "SSL/TLS error", "Invalid DH file", SOAP_SSL_ERROR); } } else { if (!soap->rsa_params) gnutls_rsa_params_init(&soap->rsa_params); gnutls_rsa_params_generate2(soap->rsa_params, SOAP_SSL_RSA_BITS); } if (soap->session) { gnutls_deinit(soap->session); soap->session = NULL; } if (soap->xcred) { gnutls_certificate_free_credentials(soap->xcred); soap->xcred = NULL; } #endif err = soap->fsslauth(soap); #ifdef WITH_OPENSSL if (!err) { if (sid) SSL_CTX_set_session_id_context(soap->ctx, (unsigned char*)sid, (unsigned int)strlen(sid)); else SSL_CTX_set_session_cache_mode(soap->ctx, SSL_SESS_CACHE_OFF); } #endif return err; } #endif #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_ssl_client_context(struct soap *soap, unsigned short flags, const char *keyfile, const char *password, const char *cafile, const char *capath, const char *randfile) { soap->keyfile = keyfile; soap->password = password; soap->cafile = cafile; soap->capath = capath; soap->ssl_flags = SOAP_SSL_CLIENT | flags; #ifdef WITH_OPENSSL soap->dhfile = NULL; soap->randfile = randfile; soap->fsslverify = (flags & SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE) == 0 ? ssl_verify_callback : ssl_verify_callback_allow_expired_certificate; #endif #ifdef WITH_GNUTLS if (soap->session) { gnutls_deinit(soap->session); soap->session = NULL; } if (soap->xcred) { gnutls_certificate_free_credentials(soap->xcred); soap->xcred = NULL; } #endif return soap->fsslauth(soap); } #endif #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_ssl_init() { /* Note: for MT systems, the main program MUST call soap_ssl_init() before any threads are started */ if (!soap_ssl_init_done) { soap_ssl_init_done = 1; #ifdef WITH_OPENSSL SSL_library_init(); OpenSSL_add_all_algorithms(); /* 2.8.1 change (wsseapi.c) */ #ifndef WITH_LEAN SSL_load_error_strings(); #endif if (!RAND_load_file("/dev/urandom", 1024)) { char buf[1024]; RAND_seed(buf, sizeof(buf)); while (!RAND_status()) { int r = rand(); RAND_seed(&r, sizeof(int)); } } #endif #ifdef WITH_GNUTLS # if defined(HAVE_PTHREAD_H) gcry_control(GCRYCTL_SET_THREAD_CBS, &gcry_threads_pthread); # elif defined(HAVE_PTH_H) gcry_control(GCRYCTL_SET_THREAD_CBS, &gcry_threads_pth); # endif gcry_control(GCRYCTL_ENABLE_QUICK_RANDOM, 0); gcry_control(GCRYCTL_DISABLE_SECMEM, 0); gcry_control(GCRYCTL_INITIALIZATION_FINISHED, 0); /* libgcrypt init done */ gnutls_global_init(); #endif } } #endif #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) #ifndef PALM_1 SOAP_FMAC1 const char * SOAP_FMAC2 soap_ssl_error(struct soap *soap, int ret) { #ifdef WITH_OPENSSL int err = SSL_get_error(soap->ssl, ret); const char *msg = soap_code_str(h_ssl_error_codes, err); if (msg) strcpy(soap->msgbuf, msg); else return ERR_error_string(err, soap->msgbuf); if (ERR_peek_error()) { unsigned long r; strcat(soap->msgbuf, "\n"); while ((r = ERR_get_error())) ERR_error_string_n(r, soap->msgbuf + strlen(soap->msgbuf), sizeof(soap->msgbuf) - strlen(soap->msgbuf)); } else { switch (ret) { case 0: strcpy(soap->msgbuf, "EOF was observed that violates the protocol. The client probably provided invalid authentication information."); break; case -1: sprintf(soap->msgbuf, "Error observed by underlying BIO: %s", strerror(errno)); break; } } return soap->msgbuf; #endif #ifdef WITH_GNUTLS return gnutls_strerror(ret); #endif } #endif #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) #ifndef PALM_1 static int ssl_auth_init(struct soap *soap) { #ifdef WITH_OPENSSL long flags; int mode; if (!soap_ssl_init_done) soap_ssl_init(); ERR_clear_error(); if (!soap->ctx) { if (!(soap->ctx = SSL_CTX_new(SSLv23_method()))) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't setup context", SOAP_SSL_ERROR); /* The following alters the behavior of SSL read/write: */ #if 0 SSL_CTX_set_mode(soap->ctx, SSL_MODE_ENABLE_PARTIAL_WRITE | SSL_MODE_AUTO_RETRY); #endif } if (soap->randfile) { if (!RAND_load_file(soap->randfile, -1)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't load randomness", SOAP_SSL_ERROR); } if (soap->cafile || soap->capath) { if (!SSL_CTX_load_verify_locations(soap->ctx, soap->cafile, soap->capath)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read CA file", SOAP_SSL_ERROR); if (soap->cafile && (soap->ssl_flags & SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION)) SSL_CTX_set_client_CA_list(soap->ctx, SSL_load_client_CA_file(soap->cafile)); } if (!(soap->ssl_flags & SOAP_SSL_NO_DEFAULT_CA_PATH)) { if (!SSL_CTX_set_default_verify_paths(soap->ctx)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read default CA file and/or directory", SOAP_SSL_ERROR); } /* This code assumes a typical scenario, see alternative code below */ if (soap->keyfile) { if (!SSL_CTX_use_certificate_chain_file(soap->ctx, soap->keyfile)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read certificate key file", SOAP_SSL_ERROR); if (soap->password) { SSL_CTX_set_default_passwd_cb_userdata(soap->ctx, (void*)soap->password); SSL_CTX_set_default_passwd_cb(soap->ctx, ssl_password); } if (!SSL_CTX_use_PrivateKey_file(soap->ctx, soap->keyfile, SSL_FILETYPE_PEM)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read key file", SOAP_SSL_ERROR); } /* Suggested alternative approach to check the key file for certs (cafile=NULL):*/ #if 0 if (soap->password) { SSL_CTX_set_default_passwd_cb_userdata(soap->ctx, (void*)soap->password); SSL_CTX_set_default_passwd_cb(soap->ctx, ssl_password); } if (!soap->cafile || !SSL_CTX_use_certificate_chain_file(soap->ctx, soap->cafile)) { if (soap->keyfile) { if (!SSL_CTX_use_certificate_chain_file(soap->ctx, soap->keyfile)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read certificate or key file", SOAP_SSL_ERROR); if (!SSL_CTX_use_PrivateKey_file(soap->ctx, soap->keyfile, SSL_FILETYPE_PEM)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read key file", SOAP_SSL_ERROR); } } #endif if ((soap->ssl_flags & SOAP_SSL_RSA)) { RSA *rsa = RSA_generate_key(SOAP_SSL_RSA_BITS, RSA_F4, NULL, NULL); if (!SSL_CTX_set_tmp_rsa(soap->ctx, rsa)) { if (rsa) RSA_free(rsa); return soap_set_receiver_error(soap, "SSL/TLS error", "Can't set RSA key", SOAP_SSL_ERROR); } RSA_free(rsa); } else if (soap->dhfile) { DH *dh = 0; char *s; int n = (int)soap_strtoul(soap->dhfile, &s, 10); /* if dhfile is numeric, treat it as a key length to generate DH params which can take a while */ if (n >= 512 && s && *s == '\0') dh = DH_generate_parameters(n, 2/*or 5*/, NULL, NULL); else { BIO *bio; bio = BIO_new_file(soap->dhfile, "r"); if (!bio) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read DH file", SOAP_SSL_ERROR); dh = PEM_read_bio_DHparams(bio, NULL, NULL, NULL); BIO_free(bio); } if (!dh || DH_check(dh, &n) != 1 || SSL_CTX_set_tmp_dh(soap->ctx, dh) < 0) { if (dh) DH_free(dh); return soap_set_receiver_error(soap, "SSL/TLS error", "Can't set DH parameters", SOAP_SSL_ERROR); } DH_free(dh); } flags = (SSL_OP_ALL | SSL_OP_NO_SSLv2); /* disable SSL v2 */ if ((soap->ssl_flags & SOAP_SSLv3)) flags |= SSL_OP_NO_TLSv1; if ((soap->ssl_flags & SOAP_TLSv1)) flags |= SSL_OP_NO_SSLv3; #ifdef SSL_OP_NO_TICKET /* TLS extension is enabled by default in OPENSSL v0.9.8k Disable it by adding SSL_OP_NO_TICKET */ flags |= SSL_OP_NO_TICKET; #endif SSL_CTX_set_options(soap->ctx, flags); if ((soap->ssl_flags & SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION)) mode = (SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT); else if ((soap->ssl_flags & SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION)) mode = SSL_VERIFY_PEER; else mode = SSL_VERIFY_NONE; SSL_CTX_set_verify(soap->ctx, mode, soap->fsslverify); #if (OPENSSL_VERSION_NUMBER < 0x00905100L) SSL_CTX_set_verify_depth(soap->ctx, 1); #else SSL_CTX_set_verify_depth(soap->ctx, 9); #endif #endif #ifdef WITH_GNUTLS int ret; if (!soap_ssl_init_done) soap_ssl_init(); if (!soap->xcred) { gnutls_certificate_allocate_credentials(&soap->xcred); if (soap->cafile) { if (gnutls_certificate_set_x509_trust_file(soap->xcred, soap->cafile, GNUTLS_X509_FMT_PEM) < 0) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read CA file", SOAP_SSL_ERROR); } if (soap->crlfile) { if (gnutls_certificate_set_x509_crl_file(soap->xcred, soap->crlfile, GNUTLS_X509_FMT_PEM) < 0) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read CRL file", SOAP_SSL_ERROR); } if (soap->keyfile) { if (gnutls_certificate_set_x509_key_file(soap->xcred, soap->keyfile, soap->keyfile, GNUTLS_X509_FMT_PEM) < 0) /* TODO: GNUTLS need to concat cert and key in single key file */ return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read key file", SOAP_SSL_ERROR); } } if ((soap->ssl_flags & SOAP_SSL_CLIENT)) { gnutls_init(&soap->session, GNUTLS_CLIENT); if (soap->cafile || soap->crlfile || soap->keyfile) { ret = gnutls_priority_set_direct(soap->session, "PERFORMANCE", NULL); if (ret < 0) return soap_set_receiver_error(soap, soap_ssl_error(soap, ret), "SSL/TLS set priority error", SOAP_SSL_ERROR); gnutls_credentials_set(soap->session, GNUTLS_CRD_CERTIFICATE, soap->xcred); } else { if (!soap->acred) gnutls_anon_allocate_client_credentials(&soap->acred); gnutls_init(&soap->session, GNUTLS_CLIENT); gnutls_priority_set_direct(soap->session, "PERFORMANCE:+ANON-DH:!ARCFOUR-128", NULL); gnutls_credentials_set(soap->session, GNUTLS_CRD_ANON, soap->acred); } } else { if (!soap->keyfile) return soap_set_receiver_error(soap, "SSL/TLS error", "No key file: anonymous server authentication not supported in this release", SOAP_SSL_ERROR); if ((soap->ssl_flags & SOAP_SSL_RSA) && soap->rsa_params) gnutls_certificate_set_rsa_export_params(soap->xcred, soap->rsa_params); else if (soap->dh_params) gnutls_certificate_set_dh_params(soap->xcred, soap->dh_params); if (!soap->cache) gnutls_priority_init(&soap->cache, "NORMAL", NULL); gnutls_init(&soap->session, GNUTLS_SERVER); gnutls_priority_set(soap->session, soap->cache); gnutls_credentials_set(soap->session, GNUTLS_CRD_CERTIFICATE, soap->xcred); if ((soap->ssl_flags & SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION)) gnutls_certificate_server_set_request(soap->session, GNUTLS_CERT_REQUEST); gnutls_session_enable_compatibility_mode(soap->session); if ((soap->ssl_flags & SOAP_TLSv1)) { int protocol_priority[] = { GNUTLS_TLS1_0, 0 }; if (gnutls_protocol_set_priority(soap->session, protocol_priority) != GNUTLS_E_SUCCESS) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't set TLS v1.0 protocol", SOAP_SSL_ERROR); } } #endif return SOAP_OK; } #endif #endif /******************************************************************************/ #ifdef WITH_OPENSSL #ifndef PALM_1 static int ssl_password(char *buf, int num, int rwflag, void *userdata) { if (num < (int)strlen((char*)userdata) + 1) return 0; return (int)strlen(strcpy(buf, (char*)userdata)); } #endif #endif /******************************************************************************/ #ifdef WITH_OPENSSL #ifndef PALM_1 static int ssl_verify_callback(int ok, X509_STORE_CTX *store) { #ifdef SOAP_DEBUG if (!ok) { char buf[1024]; X509 *cert = X509_STORE_CTX_get_current_cert(store); fprintf(stderr, "SSL verify error or warning with certificate at depth %d: %s\n", X509_STORE_CTX_get_error_depth(store), X509_verify_cert_error_string(X509_STORE_CTX_get_error(store))); X509_NAME_oneline(X509_get_issuer_name(cert), buf, sizeof(buf)); fprintf(stderr, "certificate issuer %s\n", buf); X509_NAME_oneline(X509_get_subject_name(cert), buf, sizeof(buf)); fprintf(stderr, "certificate subject %s\n", buf); } #endif /* Note: return 1 to continue, but unsafe progress will be terminated by OpenSSL */ return ok; } #endif #endif /******************************************************************************/ #ifdef WITH_OPENSSL #ifndef PALM_1 static int ssl_verify_callback_allow_expired_certificate(int ok, X509_STORE_CTX *store) { ok = ssl_verify_callback(ok, store); if (ok == 0 && X509_STORE_CTX_get_error(store) == X509_V_ERR_CERT_HAS_EXPIRED) { #ifdef SOAP_DEBUG fprintf(stderr, "ignoring certificate expiration\n"); #endif X509_STORE_CTX_set_error(store, X509_V_OK); ok = 1; } /* Note: return 1 to continue, but unsafe progress will be terminated by SSL */ return ok; } #endif #endif /******************************************************************************/ #ifdef WITH_GNUTLS static const char * ssl_verify(struct soap *soap, const char *host) { unsigned int status; const char *err = NULL; int r = gnutls_certificate_verify_peers2(soap->session, &status); if (r < 0) err = "Certificate verify error"; else if ((status & GNUTLS_CERT_INVALID)) err = "The certificate is not trusted"; else if ((status & GNUTLS_CERT_SIGNER_NOT_FOUND)) err = "The certificate hasn't got a known issuer"; else if ((status & GNUTLS_CERT_REVOKED)) err = "The certificate has been revoked"; else if (gnutls_certificate_type_get(soap->session) == GNUTLS_CRT_X509) { gnutls_x509_crt_t cert; const gnutls_datum_t *cert_list; unsigned int cert_list_size; if (gnutls_x509_crt_init(&cert) < 0) err = "Could not get X509 certificates"; else if ((cert_list = gnutls_certificate_get_peers(soap->session, &cert_list_size)) == NULL) err = "Could not get X509 certificates"; else if (gnutls_x509_crt_import(cert, &cert_list[0], GNUTLS_X509_FMT_DER) < 0) err = "Error parsing X509 certificate"; else if (!(soap->ssl_flags & SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE) && gnutls_x509_crt_get_expiration_time(cert) < time(NULL)) err = "The certificate has expired"; else if (!(soap->ssl_flags & SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE) && gnutls_x509_crt_get_activation_time(cert) > time(NULL)) err = "The certificate is not yet activated"; else if (host && !(soap->ssl_flags & SOAP_SSL_SKIP_HOST_CHECK)) { if (!gnutls_x509_crt_check_hostname(cert, host)) err = "Certificate host name mismatch"; } gnutls_x509_crt_deinit(cert); } return err; } #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) #ifndef WITH_NOIO #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_ssl_accept(struct soap *soap) { SOAP_SOCKET fd = soap->socket; #ifdef WITH_OPENSSL BIO *bio; int retries, r, s; if (!soap_valid_socket(fd)) return soap_set_receiver_error(soap, "SSL/TLS error", "No socket in soap_ssl_accept()", SOAP_SSL_ERROR); soap->ssl_flags &= ~SOAP_SSL_CLIENT; if (!soap->ctx && (soap->error = soap->fsslauth(soap))) return soap->error; if (!soap->ssl) { soap->ssl = SSL_new(soap->ctx); if (!soap->ssl) return soap_set_receiver_error(soap, "SSL/TLS error", "SSL_new() failed in soap_ssl_accept()", SOAP_SSL_ERROR); } else SSL_clear(soap->ssl); bio = BIO_new_socket((int)fd, BIO_NOCLOSE); SSL_set_bio(soap->ssl, bio, bio); /* Set SSL sockets to non-blocking */ retries = 0; if (soap->accept_timeout) { SOAP_SOCKNONBLOCK(fd) retries = 10*soap->accept_timeout; } if (retries <= 0) retries = 100; /* timeout: 10 sec retries, 100 times 0.1 sec */ while ((r = SSL_accept(soap->ssl)) <= 0) { int err; if (retries-- <= 0) break; err = SSL_get_error(soap->ssl, r); if (err == SSL_ERROR_WANT_ACCEPT || err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE) { if (err == SSL_ERROR_WANT_READ) s = tcp_select(soap, fd, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, -100000); else s = tcp_select(soap, fd, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, -100000); if (s < 0 && soap->errnum != SOAP_EINTR) break; } else { soap->errnum = soap_socket_errno(fd); break; } } if (r <= 0) { soap_set_receiver_error(soap, soap_ssl_error(soap, r), "SSL_accept() failed in soap_ssl_accept()", SOAP_SSL_ERROR); soap_closesock(soap); return SOAP_SSL_ERROR; } if ((soap->ssl_flags & SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION)) { X509 *peer; int err; if ((err = SSL_get_verify_result(soap->ssl)) != X509_V_OK) { soap_closesock(soap); return soap_set_sender_error(soap, X509_verify_cert_error_string(err), "SSL certificate presented by peer cannot be verified in soap_ssl_accept()", SOAP_SSL_ERROR); } peer = SSL_get_peer_certificate(soap->ssl); if (!peer) { soap_closesock(soap); return soap_set_sender_error(soap, "SSL/TLS error", "No SSL certificate was presented by the peer in soap_ssl_accept()", SOAP_SSL_ERROR); } X509_free(peer); } #endif #ifdef WITH_GNUTLS int retries = 0, r; if (!soap_valid_socket(fd)) return soap_set_receiver_error(soap, "SSL/TLS error", "No socket in soap_ssl_accept()", SOAP_SSL_ERROR); soap->ssl_flags &= ~SOAP_SSL_CLIENT; if (!soap->session && (soap->error = soap->fsslauth(soap))) { soap_closesock(soap); return soap->error; } gnutls_transport_set_ptr(soap->session, (gnutls_transport_ptr_t)(long)fd); /* Set SSL sockets to non-blocking */ if (soap->accept_timeout) { SOAP_SOCKNONBLOCK(fd) retries = 10*soap->accept_timeout; } if (retries <= 0) retries = 100; /* timeout: 10 sec retries, 100 times 0.1 sec */ while ((r = gnutls_handshake(soap->session))) { int s; /* GNUTLS repeat handhake when GNUTLS_E_AGAIN */ if (retries-- <= 0) break; if (r == GNUTLS_E_AGAIN || r == GNUTLS_E_INTERRUPTED) { if (!gnutls_record_get_direction(soap->session)) s = tcp_select(soap, fd, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, -100000); else s = tcp_select(soap, fd, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, -100000); if (s < 0 && soap->errnum != SOAP_EINTR) break; } else { soap->errnum = soap_socket_errno(fd); break; } } if (r) { soap_closesock(soap); return soap_set_receiver_error(soap, soap_ssl_error(soap, r), "SSL/TLS handshake failed", SOAP_SSL_ERROR); } if ((soap->ssl_flags & SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION)) { const char *err = ssl_verify(soap, NULL); if (err) { soap_closesock(soap); return soap_set_receiver_error(soap, "SSL/TLS error", err, SOAP_SSL_ERROR); } } #endif if (soap->recv_timeout || soap->send_timeout) SOAP_SOCKNONBLOCK(fd) else SOAP_SOCKBLOCK(fd) soap->imode |= SOAP_ENC_SSL; soap->omode |= SOAP_ENC_SSL; return SOAP_OK; } #endif #endif #endif /******************************************************************************\ * * TCP/UDP [SSL/TLS] IPv4 and IPv6 * \******************************************************************************/ /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 static int tcp_init(struct soap *soap) { soap->errmode = 1; #ifdef WIN32 if (tcp_done) return 0; else { WSADATA w; if (WSAStartup(MAKEWORD(1, 1), &w)) return -1; tcp_done = 1; } #endif return 0; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 static const char* tcp_error(struct soap *soap) { register const char *msg = NULL; switch (soap->errmode) { case 0: msg = soap_strerror(soap); break; case 1: msg = "WSAStartup failed"; break; case 2: { #ifndef WITH_LEAN msg = soap_code_str(h_error_codes, soap->errnum); if (!msg) #endif { sprintf(soap->msgbuf, "TCP/UDP IP error %d", soap->errnum); msg = soap->msgbuf; } } } return msg; } #endif #endif /******************************************************************************/ #ifndef WITH_IPV6 #ifndef WITH_NOIO #ifndef PALM_1 static int tcp_gethost(struct soap *soap, const char *addr, struct in_addr *inaddr) { soap_int32 iadd = -1; struct hostent hostent, *host = &hostent; #ifdef VXWORKS int hostint; /* inet_addr(), and hostGetByName() expect "char *"; addr is a "const char *". */ iadd = inet_addr((char*)addr); #else #if defined(_AIX43) || ((defined(TRU64) || defined(HP_UX)) && defined(HAVE_GETHOSTBYNAME_R)) struct hostent_data ht_data; #endif #ifdef AS400 iadd = inet_addr((void*)addr); #else iadd = inet_addr(addr); #endif #endif if (iadd != -1) { memcpy(inaddr, &iadd, sizeof(iadd)); return SOAP_OK; } #if defined(__GLIBC__) || (defined(HAVE_GETHOSTBYNAME_R) && (defined(FREEBSD) || defined(__FreeBSD__))) if (gethostbyname_r(addr, &hostent, soap->buf, SOAP_BUFLEN, &host, &soap->errnum) < 0) host = NULL; #elif defined(_AIX43) || ((defined(TRU64) || defined(HP_UX)) && defined(HAVE_GETHOSTBYNAME_R)) memset((void*)&ht_data, 0, sizeof(ht_data)); if (gethostbyname_r(addr, &hostent, &ht_data) < 0) { host = NULL; soap->errnum = h_errno; } #elif defined(HAVE_GETHOSTBYNAME_R) host = gethostbyname_r(addr, &hostent, soap->buf, SOAP_BUFLEN, &soap->errnum); #elif defined(VXWORKS) /* If the DNS resolver library resolvLib has been configured in the vxWorks * image, a query for the host IP address is sent to the DNS server, if the * name was not found in the local host table. */ hostint = hostGetByName((char*)addr); if (hostint == ERROR) { host = NULL; soap->errnum = soap_errno; } #else #ifdef AS400 if (!(host = gethostbyname((void*)addr))) soap->errnum = h_errno; #else if (!(host = gethostbyname(addr))) soap->errnum = h_errno; #endif #endif if (!host) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Host name not found\n")); return SOAP_ERR; } #ifdef VXWORKS inaddr->s_addr = hostint; #else memcpy(inaddr, host->h_addr, host->h_length); #endif return SOAP_OK; } #endif #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 static SOAP_SOCKET tcp_connect(struct soap *soap, const char *endpoint, const char *host, int port) { #ifdef WITH_IPV6 struct addrinfo hints, *res, *ressave; #endif SOAP_SOCKET fd; int err = 0; #ifndef WITH_LEAN #ifndef WIN32 int len = SOAP_BUFLEN; #else int len = SOAP_BUFLEN + 1; /* speeds up windows xfer */ #endif int set = 1; #endif #if !defined(WITH_LEAN) || defined(WITH_OPENSSL) || defined(WITH_GNUTLS) int retries; #endif if (soap_valid_socket(soap->socket)) soap->fclosesocket(soap, soap->socket); soap->socket = SOAP_INVALID_SOCKET; if (tcp_init(soap)) { soap->errnum = 0; soap_set_sender_error(soap, tcp_error(soap), "TCP init failed in tcp_connect()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } soap->errmode = 0; #ifdef WITH_IPV6 memset((void*)&hints, 0, sizeof(hints)); hints.ai_family = PF_UNSPEC; #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) hints.ai_socktype = SOCK_DGRAM; else #endif hints.ai_socktype = SOCK_STREAM; soap->errmode = 2; if (soap->proxy_host) err = getaddrinfo(soap->proxy_host, soap_int2s(soap, soap->proxy_port), &hints, &res); else err = getaddrinfo(host, soap_int2s(soap, port), &hints, &res); if (err) { soap_set_sender_error(soap, SOAP_GAI_STRERROR(err), "getaddrinfo failed in tcp_connect()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } ressave = res; again: fd = socket(res->ai_family, res->ai_socktype, res->ai_protocol); soap->errmode = 0; #else #ifndef WITH_LEAN again: #endif #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) fd = socket(AF_INET, SOCK_DGRAM, 0); else #endif fd = socket(AF_INET, SOCK_STREAM, 0); #endif if (!soap_valid_socket(fd)) { #ifdef WITH_IPV6 if (res->ai_next) { res = res->ai_next; goto again; } #endif soap->errnum = soap_socket_errno(fd); soap_set_sender_error(soap, tcp_error(soap), "socket failed in tcp_connect()", SOAP_TCP_ERROR); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } #ifdef SOCKET_CLOSE_ON_EXEC #ifdef WIN32 #ifndef UNDER_CE SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0); #endif #else fcntl(fd, F_SETFD, 1); #endif #endif #ifndef WITH_LEAN if (soap->connect_flags == SO_LINGER) { struct linger linger; memset((void*)&linger, 0, sizeof(linger)); linger.l_onoff = 1; linger.l_linger = soap->linger_time; if (setsockopt(fd, SOL_SOCKET, SO_LINGER, (char*)&linger, sizeof(struct linger))) { soap->errnum = soap_socket_errno(fd); soap_set_sender_error(soap, tcp_error(soap), "setsockopt SO_LINGER failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, fd); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } } else if (soap->connect_flags && setsockopt(fd, SOL_SOCKET, soap->connect_flags, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(fd); soap_set_sender_error(soap, tcp_error(soap), "setsockopt failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, fd); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } if ((soap->keep_alive || soap->tcp_keep_alive) && setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(fd); soap_set_sender_error(soap, tcp_error(soap), "setsockopt SO_KEEPALIVE failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, fd); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } if (setsockopt(fd, SOL_SOCKET, SO_SNDBUF, (char*)&len, sizeof(int))) { soap->errnum = soap_socket_errno(fd); soap_set_sender_error(soap, tcp_error(soap), "setsockopt SO_SNDBUF failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, fd); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } if (setsockopt(fd, SOL_SOCKET, SO_RCVBUF, (char*)&len, sizeof(int))) { soap->errnum = soap_socket_errno(fd); soap_set_sender_error(soap, tcp_error(soap), "setsockopt SO_RCVBUF failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, fd); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } #ifdef TCP_KEEPIDLE if (soap->tcp_keep_idle && setsockopt((SOAP_SOCKET)fd, IPPROTO_TCP, TCP_KEEPIDLE, (char*)&(soap->tcp_keep_idle), sizeof(int))) { soap->errnum = soap_socket_errno(fd); soap_set_sender_error(soap, tcp_error(soap), "setsockopt TCP_KEEPIDLE failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, (SOAP_SOCKET)fd); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } #endif #ifdef TCP_KEEPINTVL if (soap->tcp_keep_intvl && setsockopt((SOAP_SOCKET)fd, IPPROTO_TCP, TCP_KEEPINTVL, (char*)&(soap->tcp_keep_intvl), sizeof(int))) { soap->errnum = soap_socket_errno(fd); soap_set_sender_error(soap, tcp_error(soap), "setsockopt TCP_KEEPINTVL failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, (SOAP_SOCKET)fd); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } #endif #ifdef TCP_KEEPCNT if (soap->tcp_keep_cnt && setsockopt((SOAP_SOCKET)fd, IPPROTO_TCP, TCP_KEEPCNT, (char*)&(soap->tcp_keep_cnt), sizeof(int))) { soap->errnum = soap_socket_errno(fd); soap_set_sender_error(soap, tcp_error(soap), "setsockopt TCP_KEEPCNT failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, (SOAP_SOCKET)fd); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } #endif #ifdef TCP_NODELAY if (!(soap->omode & SOAP_IO_UDP) && setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(fd); soap_set_sender_error(soap, tcp_error(soap), "setsockopt TCP_NODELAY failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, fd); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } #endif #ifdef WITH_IPV6 if ((soap->omode & SOAP_IO_UDP) && soap->ipv6_multicast_if) { struct sockaddr_in6 *in6addr = (struct sockaddr_in6*)res->ai_addr; in6addr->sin6_scope_id = soap->ipv6_multicast_if; } #endif #ifdef IP_MULTICAST_TTL if ((soap->omode & SOAP_IO_UDP)) { if (soap->ipv4_multicast_ttl) { unsigned char ttl = soap->ipv4_multicast_ttl; if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_TTL, (char*)&ttl, sizeof(ttl))) { soap->errnum = soap_socket_errno(fd); soap_set_sender_error(soap, tcp_error(soap), "setsockopt IP_MULTICAST_TTL failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, fd); return SOAP_INVALID_SOCKET; } } if ((soap->omode & SOAP_IO_UDP) && soap->ipv4_multicast_if && !soap->ipv6_multicast_if) { if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_IF, (char*)soap->ipv4_multicast_if, sizeof(struct in_addr))) #ifndef WINDOWS { soap->errnum = soap_socket_errno(fd); soap_set_sender_error(soap, tcp_error(soap), "setsockopt IP_MULTICAST_IF failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, fd); return SOAP_INVALID_SOCKET; } #else #ifndef IP_MULTICAST_IF #define IP_MULTICAST_IF 2 #endif if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_IF, (char*)soap->ipv4_multicast_if, sizeof(struct in_addr))) { soap->errnum = soap_socket_errno(fd); soap_set_sender_error(soap, tcp_error(soap), "setsockopt IP_MULTICAST_IF failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, fd); return SOAP_INVALID_SOCKET; } #endif } } #endif #endif DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Opening socket %d to host='%s' port=%d\n", fd, host, port)); #ifndef WITH_IPV6 soap->peerlen = sizeof(soap->peer); memset((void*)&soap->peer, 0, sizeof(soap->peer)); soap->peer.sin_family = AF_INET; soap->errmode = 2; if (soap->proxy_host) { if (soap->fresolve(soap, soap->proxy_host, &soap->peer.sin_addr)) { soap_set_sender_error(soap, tcp_error(soap), "get proxy host by name failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, fd); return SOAP_INVALID_SOCKET; } soap->peer.sin_port = htons((short)soap->proxy_port); } else { if (soap->fresolve(soap, host, &soap->peer.sin_addr)) { soap_set_sender_error(soap, tcp_error(soap), "get host by name failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, fd); return SOAP_INVALID_SOCKET; } soap->peer.sin_port = htons((short)port); } soap->errmode = 0; #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) return fd; #endif #else if ((soap->omode & SOAP_IO_UDP)) { memcpy(&soap->peer, res->ai_addr, res->ai_addrlen); soap->peerlen = res->ai_addrlen; freeaddrinfo(ressave); return fd; } #endif #ifndef WITH_LEAN if (soap->connect_timeout) SOAP_SOCKNONBLOCK(fd) else SOAP_SOCKBLOCK(fd) retries = 10; #endif for (;;) { #ifdef WITH_IPV6 if (connect(fd, res->ai_addr, (int)res->ai_addrlen)) #else if (connect(fd, (struct sockaddr*)&soap->peer, sizeof(soap->peer))) #endif { err = soap_socket_errno(fd); #ifndef WITH_LEAN if (err == SOAP_EADDRINUSE) { soap->fclosesocket(soap, fd); if (retries-- > 0) goto again; } else if (soap->connect_timeout && (err == SOAP_EINPROGRESS || err == SOAP_EAGAIN || err == SOAP_EWOULDBLOCK)) { SOAP_SOCKLEN_T k; for (;;) { register int r; r = tcp_select(soap, fd, SOAP_TCP_SELECT_SND, soap->connect_timeout); if (r > 0) break; if (!r) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connect timeout\n")); soap_set_sender_error(soap, "Timeout", "connect failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, fd); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } r = soap->errnum; if (r != SOAP_EINTR) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not connect to host\n")); soap_set_sender_error(soap, tcp_error(soap), "connect failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, fd); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } } k = (SOAP_SOCKLEN_T)sizeof(soap->errnum); if (!getsockopt(fd, SOL_SOCKET, SO_ERROR, (char*)&soap->errnum, &k) && !soap->errnum) /* portability note: see SOAP_SOCKLEN_T definition in stdsoap2.h */ break; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not connect to host\n")); if (!soap->errnum) soap->errnum = soap_socket_errno(fd); soap_set_sender_error(soap, tcp_error(soap), "connect failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, fd); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } #endif #ifdef WITH_IPV6 if (res->ai_next) { res = res->ai_next; soap->fclosesocket(soap, fd); goto again; } #endif if (err && err != SOAP_EINTR) { soap->errnum = err; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not connect to host\n")); soap_set_sender_error(soap, tcp_error(soap), "connect failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, fd); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } } else break; } #ifdef WITH_IPV6 soap->peerlen = 0; /* IPv6: already connected so use send() */ freeaddrinfo(ressave); #endif soap->socket = fd; soap->imode &= ~SOAP_ENC_SSL; soap->omode &= ~SOAP_ENC_SSL; if (!soap_tag_cmp(endpoint, "https:*")) { #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) #ifdef WITH_OPENSSL BIO *bio; #endif int r; if (soap->proxy_host) { soap_mode m = soap->mode; /* preserve settings */ soap_mode om = soap->omode; /* make sure we only parse HTTP */ size_t n = soap->count; /* save the content length */ const char *userid, *passwd; int status = soap->status; /* save the current status/command */ short keep_alive = soap->keep_alive; /* save the KA status */ soap->omode &= ~SOAP_ENC; /* mask IO and ENC */ soap->omode |= SOAP_IO_BUFFER; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connecting to %s proxy server\n", soap->proxy_http_version)); #ifdef WITH_NTLM if (soap->ntlm_challenge) { if (soap_ntlm_handshake(soap, SOAP_CONNECT, endpoint, host, port)) return soap->error; } #endif if (soap_begin_send(soap)) { soap->fclosesocket(soap, fd); return SOAP_INVALID_SOCKET; } soap->status = SOAP_CONNECT; soap->keep_alive = 1; if ((soap->error = soap->fpost(soap, endpoint, host, port, NULL, NULL, 0)) || soap_end_send(soap)) { soap->fclosesocket(soap, fd); return SOAP_INVALID_SOCKET; } soap->keep_alive = keep_alive; soap->status = status; soap->omode = om; om = soap->imode; soap->imode &= ~SOAP_ENC; /* mask IO and ENC */ userid = soap->userid; /* preserve */ passwd = soap->passwd; /* preserve */ if ((soap->error = soap->fparse(soap))) { soap->fclosesocket(soap, fd); return SOAP_INVALID_SOCKET; } soap->userid = userid; /* restore */ soap->passwd = passwd; /* restore */ soap->imode = om; /* restore */ soap->count = n; /* restore */ if (soap_begin_send(soap)) { soap->fclosesocket(soap, fd); return SOAP_INVALID_SOCKET; } if (endpoint) strncpy(soap->endpoint, endpoint, sizeof(soap->endpoint)-1); /* restore */ soap->mode = m; } #ifdef WITH_OPENSSL soap->ssl_flags |= SOAP_SSL_CLIENT; if (!soap->ctx && (soap->error = soap->fsslauth(soap))) { soap->fclosesocket(soap, fd); return SOAP_INVALID_SOCKET; } if (!soap->ssl) { soap->ssl = SSL_new(soap->ctx); if (!soap->ssl) { soap->fclosesocket(soap, fd); soap->error = SOAP_SSL_ERROR; return SOAP_INVALID_SOCKET; } } else SSL_clear(soap->ssl); if (soap->session) { if (!strcmp(soap->session_host, host) && soap->session_port == port) SSL_set_session(soap->ssl, soap->session); SSL_SESSION_free(soap->session); soap->session = NULL; } soap->imode |= SOAP_ENC_SSL; soap->omode |= SOAP_ENC_SSL; bio = BIO_new_socket((int)fd, BIO_NOCLOSE); SSL_set_bio(soap->ssl, bio, bio); /* Connect timeout: set SSL sockets to non-blocking */ retries = 0; if (soap->connect_timeout) { SOAP_SOCKNONBLOCK(fd) retries = 10*soap->connect_timeout; } else SOAP_SOCKBLOCK(fd) if (retries <= 0) retries = 100; /* timeout: 10 sec retries, 100 times 0.1 sec */ /* Try connecting until success or timeout (when nonblocking) */ do { if ((r = SSL_connect(soap->ssl)) <= 0) { int err = SSL_get_error(soap->ssl, r); if (err == SSL_ERROR_WANT_CONNECT || err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE) { register int s; if (err == SSL_ERROR_WANT_READ) s = tcp_select(soap, fd, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, -100000); else s = tcp_select(soap, fd, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, -100000); if (s < 0 && soap->errnum != SOAP_EINTR) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL_connect/select error in tcp_connect\n")); soap_set_sender_error(soap, soap_ssl_error(soap, r), "SSL_connect failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, fd); return SOAP_INVALID_SOCKET; } if (s == 0 && retries-- <= 0) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL/TLS connect timeout\n")); soap_set_sender_error(soap, "Timeout", "SSL_connect failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, fd); return SOAP_INVALID_SOCKET; } } else { soap_set_sender_error(soap, soap_ssl_error(soap, r), "SSL_connect error in tcp_connect()", SOAP_SSL_ERROR); soap->fclosesocket(soap, fd); return SOAP_INVALID_SOCKET; } } } while (!SSL_is_init_finished(soap->ssl)); /* Set SSL sockets to nonblocking */ SOAP_SOCKNONBLOCK(fd) /* Check server credentials when required */ if ((soap->ssl_flags & SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION)) { int err; if ((err = SSL_get_verify_result(soap->ssl)) != X509_V_OK) { soap_set_sender_error(soap, X509_verify_cert_error_string(err), "SSL/TLS certificate presented by peer cannot be verified in tcp_connect()", SOAP_SSL_ERROR); soap->fclosesocket(soap, fd); return SOAP_INVALID_SOCKET; } if (!(soap->ssl_flags & SOAP_SSL_SKIP_HOST_CHECK)) { X509_NAME *subj; int ext_count; int ok = 0; X509 *peer; peer = SSL_get_peer_certificate(soap->ssl); if (!peer) { soap_set_sender_error(soap, "SSL/TLS error", "No SSL/TLS certificate was presented by the peer in tcp_connect()", SOAP_SSL_ERROR); soap->fclosesocket(soap, fd); return SOAP_INVALID_SOCKET; } ext_count = X509_get_ext_count(peer); if (ext_count > 0) { int i; for (i = 0; i < ext_count; i++) { X509_EXTENSION *ext = X509_get_ext(peer, i); const char *ext_str = OBJ_nid2sn(OBJ_obj2nid(X509_EXTENSION_get_object(ext))); if (ext_str && !strcmp(ext_str, "subjectAltName")) { X509V3_EXT_METHOD *meth = (X509V3_EXT_METHOD*)X509V3_EXT_get(ext); void *ext_data; #if (OPENSSL_VERSION_NUMBER >= 0x0090800fL) const unsigned char *data; #else unsigned char *data; #endif STACK_OF(CONF_VALUE) *val; int j; if (!meth) break; data = ext->value->data; #if (OPENSSL_VERSION_NUMBER > 0x00907000L) if (meth->it) ext_data = ASN1_item_d2i(NULL, &data, ext->value->length, ASN1_ITEM_ptr(meth->it)); else { /* OpenSSL not perfectly portable at this point (?): Some compilers appear to prefer meth->d2i(NULL, (const unsigned char**)&data, ... and others prefer meth->d2i(NULL, &data, ext->value->length); */ ext_data = meth->d2i(NULL, &data, ext->value->length); } #else ext_data = meth->d2i(NULL, &data, ext->value->length); #endif if (ext_data) { val = meth->i2v(meth, ext_data, NULL); if (val) { for (j = 0; j < sk_CONF_VALUE_num(val); j++) { CONF_VALUE *nval = sk_CONF_VALUE_value(val, j); if (nval && !strcmp(nval->name, "DNS") && !strcmp(nval->value, host)) { ok = 1; break; } } sk_CONF_VALUE_pop_free(val, X509V3_conf_free); } #if (OPENSSL_VERSION_NUMBER > 0x00907000L) if (meth->it) ASN1_item_free((ASN1_VALUE*)ext_data, ASN1_ITEM_ptr(meth->it)); else meth->ext_free(ext_data); #else meth->ext_free(ext_data); #endif } } if (ok) break; } } if (!ok && (subj = X509_get_subject_name(peer))) { int i = -1; do { ASN1_STRING *name; i = X509_NAME_get_index_by_NID(subj, NID_commonName, i); if (i == -1) break; name = X509_NAME_ENTRY_get_data(X509_NAME_get_entry(subj, i)); if (name) { if (!soap_tag_cmp(host, (const char*)M_ASN1_STRING_data(name))) ok = 1; else { unsigned char *tmp = NULL; ASN1_STRING_to_UTF8(&tmp, name); if (tmp) { if (!soap_tag_cmp(host, (const char*)tmp)) ok = 1; else if (tmp[0] == '*') /* wildcard domain */ { const char *t = strchr(host, '.'); if (t && !soap_tag_cmp(t, (const char*)tmp+1)) ok = 1; } OPENSSL_free(tmp); } } } } while (!ok); } X509_free(peer); if (!ok) { soap_set_sender_error(soap, "SSL/TLS error", "SSL/TLS certificate host name mismatch in tcp_connect()", SOAP_SSL_ERROR); soap->fclosesocket(soap, fd); return SOAP_INVALID_SOCKET; } } } #endif #ifdef WITH_GNUTLS soap->ssl_flags |= SOAP_SSL_CLIENT; if (!soap->session && (soap->error = soap->fsslauth(soap))) { soap->fclosesocket(soap, fd); return SOAP_INVALID_SOCKET; } gnutls_transport_set_ptr(soap->session, (gnutls_transport_ptr_t)(long)fd); /* Set SSL sockets to non-blocking */ if (soap->connect_timeout) { SOAP_SOCKNONBLOCK(fd) retries = 10*soap->connect_timeout; } else SOAP_SOCKBLOCK(fd) if (retries <= 0) retries = 100; /* timeout: 10 sec retries, 100 times 0.1 sec */ while ((r = gnutls_handshake(soap->session))) { int s; /* GNUTLS repeat handhake when GNUTLS_E_AGAIN */ if (retries-- <= 0) break; if (r == GNUTLS_E_AGAIN || r == GNUTLS_E_INTERRUPTED) { if (!gnutls_record_get_direction(soap->session)) s = tcp_select(soap, fd, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, -100000); else s = tcp_select(soap, fd, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, -100000); if (s < 0 && soap->errnum != SOAP_EINTR) break; } else { soap->errnum = soap_socket_errno(fd); break; } } if (r) { soap_set_sender_error(soap, soap_ssl_error(soap, r), "SSL/TLS handshake failed", SOAP_SSL_ERROR); soap->fclosesocket(soap, fd); return SOAP_INVALID_SOCKET; } if ((soap->ssl_flags & SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION)) { const char *err = ssl_verify(soap, host); if (err) { soap->fclosesocket(soap, fd); soap->error = soap_set_sender_error(soap, "SSL/TLS error", err, SOAP_SSL_ERROR); return SOAP_INVALID_SOCKET; } } #endif #else soap->fclosesocket(soap, fd); soap->error = SOAP_SSL_ERROR; return SOAP_INVALID_SOCKET; #endif } if (soap->recv_timeout || soap->send_timeout) SOAP_SOCKNONBLOCK(fd) else SOAP_SOCKBLOCK(fd) return fd; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 static int tcp_select(struct soap *soap, SOAP_SOCKET s, int flags, int timeout) { register int r; struct timeval tv; fd_set fd[3], *rfd, *sfd, *efd; soap->errnum = 0; #ifndef WIN32 #if !defined(FD_SETSIZE) || defined(__QNX__) || defined(QNX) /* no FD_SETSIZE or select() is not MT safe on some QNX: always poll */ if (1) #else /* if fd max set size exceeded, use poll() */ if ((int)s >= (int)FD_SETSIZE) #endif #ifdef HAVE_POLL { struct pollfd pollfd; int retries = 0; pollfd.fd = (int)s; pollfd.events = 0; if (flags & SOAP_TCP_SELECT_RCV) pollfd.events |= POLLIN; if (flags & SOAP_TCP_SELECT_SND) pollfd.events |= POLLOUT; if (flags & SOAP_TCP_SELECT_ERR) pollfd.events |= POLLERR; if (timeout < 0) timeout /= -1000; /* -usec -> ms */ else if (timeout <= 1000000) /* avoid overflow */ timeout *= 1000; /* sec -> ms */ else { retries = timeout / 1000000; timeout = 1000000000; } do r = poll(&pollfd, 1, timeout); while (r == 0 && retries--); if (r > 0) { r = 0; if ((flags & SOAP_TCP_SELECT_RCV) && (pollfd.revents & POLLIN)) r |= SOAP_TCP_SELECT_RCV; if ((flags & SOAP_TCP_SELECT_SND) && (pollfd.revents & POLLOUT)) r |= SOAP_TCP_SELECT_SND; if ((flags & SOAP_TCP_SELECT_ERR) && (pollfd.revents & POLLERR)) r |= SOAP_TCP_SELECT_ERR; } else if (r < 0) soap->errnum = soap_socket_errno(s); return r; } #else { soap->error = SOAP_FD_EXCEEDED; return -1; } #endif #endif rfd = sfd = efd = NULL; if (flags & SOAP_TCP_SELECT_RCV) { rfd = &fd[0]; FD_ZERO(rfd); FD_SET(s, rfd); } if (flags & SOAP_TCP_SELECT_SND) { sfd = &fd[1]; FD_ZERO(sfd); FD_SET(s, sfd); } if (flags & SOAP_TCP_SELECT_ERR) { efd = &fd[2]; FD_ZERO(efd); FD_SET(s, efd); } if (timeout >= 0) { tv.tv_sec = timeout; tv.tv_usec = 0; } else { tv.tv_sec = -timeout / 1000000; tv.tv_usec = -timeout % 1000000; } r = select((int)s + 1, rfd, sfd, efd, &tv); if (r > 0) { r = 0; if ((flags & SOAP_TCP_SELECT_RCV) && FD_ISSET(s, rfd)) r |= SOAP_TCP_SELECT_RCV; if ((flags & SOAP_TCP_SELECT_SND) && FD_ISSET(s, sfd)) r |= SOAP_TCP_SELECT_SND; if ((flags & SOAP_TCP_SELECT_ERR) && FD_ISSET(s, efd)) r |= SOAP_TCP_SELECT_ERR; } else if (r < 0) soap->errnum = soap_socket_errno(s); return r; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 static SOAP_SOCKET tcp_accept(struct soap *soap, SOAP_SOCKET s, struct sockaddr *a, int *n) { SOAP_SOCKET fd; (void)soap; fd = accept(s, a, (SOAP_SOCKLEN_T*)n); /* portability note: see SOAP_SOCKLEN_T definition in stdsoap2.h */ #ifdef SOCKET_CLOSE_ON_EXEC #ifdef WIN32 #ifndef UNDER_CE SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0); #endif #else fcntl(fd, F_SETFD, FD_CLOEXEC); #endif #endif return fd; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 static int tcp_disconnect(struct soap *soap) { #ifdef WITH_OPENSSL if (soap->ssl) { int r, s = 0; if (soap->session) { SSL_SESSION_free(soap->session); soap->session = NULL; } if (*soap->host) { soap->session = SSL_get1_session(soap->ssl); if (soap->session) { strcpy(soap->session_host, soap->host); soap->session_port = soap->port; } } r = SSL_shutdown(soap->ssl); /* SSL shutdown does not work when reads are pending, non-blocking */ if (r == 0) { while (SSL_want_read(soap->ssl)) { if (SSL_read(soap->ssl, NULL, 0) || soap_socket_errno(soap->socket) != SOAP_EAGAIN) { r = SSL_shutdown(soap->ssl); break; } } } if (r == 0) { if (soap_valid_socket(soap->socket)) { if (!soap->fshutdownsocket(soap, soap->socket, SOAP_SHUT_WR)) { #if !defined(WITH_LEAN) && !defined(WIN32) /* wait up to 5 seconds for close_notify to be sent by peer (if peer not present, this avoids calling SSL_shutdown() which has a lengthy return timeout) */ r = tcp_select(soap, soap->socket, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, 5); if (r <= 0 && soap->errnum != SOAP_EINTR) { soap->errnum = 0; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connection lost...\n")); soap->fclosesocket(soap, soap->socket); soap->socket = SOAP_INVALID_SOCKET; ERR_remove_state(0); SSL_free(soap->ssl); soap->ssl = NULL; return SOAP_OK; } #else r = SSL_shutdown(soap->ssl); #endif } } } if (r != 1) { s = ERR_get_error(); if (s) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Shutdown failed: %d\n", SSL_get_error(soap->ssl, r))); if (soap_valid_socket(soap->socket) && !(soap->omode & SOAP_IO_UDP)) { soap->fclosesocket(soap, soap->socket); soap->socket = SOAP_INVALID_SOCKET; } } } SSL_free(soap->ssl); soap->ssl = NULL; if (s) return SOAP_SSL_ERROR; ERR_remove_state(0); } #endif #ifdef WITH_GNUTLS if (soap->session) { gnutls_bye(soap->session, GNUTLS_SHUT_RDWR); gnutls_deinit(soap->session); soap->session = NULL; } #endif if (soap_valid_socket(soap->socket) && !(soap->omode & SOAP_IO_UDP)) { soap->fshutdownsocket(soap, soap->socket, SOAP_SHUT_RDWR); soap->fclosesocket(soap, soap->socket); soap->socket = SOAP_INVALID_SOCKET; } return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 static int tcp_closesocket(struct soap *soap, SOAP_SOCKET fd) { (void)soap; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Close socket %d\n", (int)fd)); return soap_closesocket(fd); } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 static int tcp_shutdownsocket(struct soap *soap, SOAP_SOCKET fd, int how) { (void)soap; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Shutdown socket %d how=%d\n", (int)fd, how)); return shutdown(fd, how); } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 SOAP_FMAC1 SOAP_SOCKET SOAP_FMAC2 soap_bind(struct soap *soap, const char *host, int port, int backlog) { #ifdef WITH_IPV6 struct addrinfo *addrinfo = NULL; struct addrinfo hints; struct addrinfo res; int err; #ifdef WITH_NO_IPV6_V6ONLY int unset = 0; #endif #endif #ifndef WITH_LEAN #ifndef WIN32 int len = SOAP_BUFLEN; #else int len = SOAP_BUFLEN + 1; /* speeds up windows xfer */ #endif int set = 1; #endif if (soap_valid_socket(soap->master)) { soap->fclosesocket(soap, soap->master); soap->master = SOAP_INVALID_SOCKET; } soap->socket = SOAP_INVALID_SOCKET; soap->errmode = 1; if (tcp_init(soap)) { soap_set_receiver_error(soap, tcp_error(soap), "TCP init failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } #ifdef WITH_IPV6 memset((void*)&hints, 0, sizeof(hints)); hints.ai_family = PF_UNSPEC; #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) hints.ai_socktype = SOCK_DGRAM; else #endif hints.ai_socktype = SOCK_STREAM; hints.ai_flags = AI_PASSIVE; soap->errmode = 2; err = getaddrinfo(host, soap_int2s(soap, port), &hints, &addrinfo); if (err || !addrinfo) { soap_set_receiver_error(soap, SOAP_GAI_STRERROR(err), "getaddrinfo failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } res = *addrinfo; memcpy(&soap->peer, addrinfo->ai_addr, addrinfo->ai_addrlen); soap->peerlen = addrinfo->ai_addrlen; res.ai_addr = (struct sockaddr*)&soap->peer; res.ai_addrlen = soap->peerlen; freeaddrinfo(addrinfo); soap->master = (int)socket(res.ai_family, res.ai_socktype, res.ai_protocol); #else #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) soap->master = (int)socket(AF_INET, SOCK_DGRAM, 0); else #endif soap->master = (int)socket(AF_INET, SOCK_STREAM, 0); #endif soap->errmode = 0; if (!soap_valid_socket(soap->master)) { soap->errnum = soap_socket_errno(soap->master); soap_set_receiver_error(soap, tcp_error(soap), "socket failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) soap->socket = soap->master; #endif #ifdef SOCKET_CLOSE_ON_EXEC #ifdef WIN32 #ifndef UNDER_CE SetHandleInformation((HANDLE)soap->master, HANDLE_FLAG_INHERIT, 0); #endif #else fcntl(soap->master, F_SETFD, 1); #endif #endif #ifndef WITH_LEAN if (soap->bind_flags && setsockopt(soap->master, SOL_SOCKET, soap->bind_flags, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(soap->master); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } if (((soap->imode | soap->omode) & SOAP_IO_KEEPALIVE) && setsockopt(soap->master, SOL_SOCKET, SO_KEEPALIVE, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(soap->master); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_KEEPALIVE failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } if (setsockopt(soap->master, SOL_SOCKET, SO_SNDBUF, (char*)&len, sizeof(int))) { soap->errnum = soap_socket_errno(soap->master); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_SNDBUF failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } if (setsockopt(soap->master, SOL_SOCKET, SO_RCVBUF, (char*)&len, sizeof(int))) { soap->errnum = soap_socket_errno(soap->master); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_RCVBUF failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } #ifdef TCP_NODELAY if (!(soap->omode & SOAP_IO_UDP) && setsockopt(soap->master, IPPROTO_TCP, TCP_NODELAY, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(soap->master); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt TCP_NODELAY failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } #endif #endif #ifdef WITH_IPV6 #ifdef WITH_IPV6_V6ONLY if (setsockopt(soap->master, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(soap->master); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt set IPV6_V6ONLY failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } #endif #ifdef WITH_NO_IPV6_V6ONLY if (setsockopt(soap->master, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&unset, sizeof(int))) { soap->errnum = soap_socket_errno(soap->master); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt unset IPV6_V6ONLY failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } #endif soap->errmode = 0; if (bind(soap->master, res.ai_addr, (int)res.ai_addrlen)) { soap->errnum = soap_socket_errno(soap->master); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not bind to host\n")); soap_closesock(soap); soap_set_receiver_error(soap, tcp_error(soap), "bind failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } #else soap->peerlen = sizeof(soap->peer); memset((void*)&soap->peer, 0, sizeof(soap->peer)); soap->peer.sin_family = AF_INET; soap->errmode = 2; if (host) { if (soap->fresolve(soap, host, &soap->peer.sin_addr)) { soap_set_receiver_error(soap, tcp_error(soap), "get host by name failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } } else soap->peer.sin_addr.s_addr = htonl(INADDR_ANY); soap->peer.sin_port = htons((short)port); soap->errmode = 0; if (bind(soap->master, (struct sockaddr*)&soap->peer, (int)soap->peerlen)) { soap->errnum = soap_socket_errno(soap->master); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not bind to host\n")); soap_closesock(soap); soap_set_receiver_error(soap, tcp_error(soap), "bind failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } #endif if (!(soap->omode & SOAP_IO_UDP) && listen(soap->master, backlog)) { soap->errnum = soap_socket_errno(soap->master); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not bind to host\n")); soap_closesock(soap); soap_set_receiver_error(soap, tcp_error(soap), "listen failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } return soap->master; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_poll(struct soap *soap) { #ifndef WITH_LEAN register int r; if (soap_valid_socket(soap->socket)) { r = tcp_select(soap, soap->socket, SOAP_TCP_SELECT_ALL, 0); if (r > 0 && (r & SOAP_TCP_SELECT_ERR)) r = -1; } else if (soap_valid_socket(soap->master)) r = tcp_select(soap, soap->master, SOAP_TCP_SELECT_SND, 0); else return SOAP_OK; /* OK when no socket! */ if (r > 0) { #ifdef WITH_OPENSSL if (soap->imode & SOAP_ENC_SSL) { if (soap_valid_socket(soap->socket) && (r & SOAP_TCP_SELECT_SND) && (!(r & SOAP_TCP_SELECT_RCV) || SSL_peek(soap->ssl, soap->tmpbuf, 1) > 0)) return SOAP_OK; } else #endif if (soap_valid_socket(soap->socket) && (r & SOAP_TCP_SELECT_SND) && (!(r & SOAP_TCP_SELECT_RCV) || recv(soap->socket, soap->tmpbuf, 1, MSG_PEEK) > 0)) return SOAP_OK; } else if (r < 0) { if ((soap_valid_socket(soap->master) || soap_valid_socket(soap->socket)) && soap_socket_errno(soap->master) != SOAP_EINTR) { soap_set_receiver_error(soap, tcp_error(soap), "select failed in soap_poll()", SOAP_TCP_ERROR); return soap->error = SOAP_TCP_ERROR; } } DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Polling: other end down on socket=%d select=%d\n", soap->socket, r)); return SOAP_EOF; #else return SOAP_OK; #endif } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 SOAP_FMAC1 SOAP_SOCKET SOAP_FMAC2 soap_accept(struct soap *soap) { int n = (int)sizeof(soap->peer); register int err; #ifndef WITH_LEAN #ifndef WIN32 int len = SOAP_BUFLEN; #else int len = SOAP_BUFLEN + 1; /* speeds up windows xfer */ #endif int set = 1; #endif soap->error = SOAP_OK; memset((void*)&soap->peer, 0, sizeof(soap->peer)); soap->socket = SOAP_INVALID_SOCKET; soap->errmode = 0; soap->keep_alive = 0; if (!soap_valid_socket(soap->master)) { soap->errnum = 0; soap_set_receiver_error(soap, tcp_error(soap), "no master socket in soap_accept()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) return soap->socket = soap->master; #endif for (;;) { if (soap->accept_timeout || soap->send_timeout || soap->recv_timeout) { for (;;) { register int r; r = tcp_select(soap, soap->master, SOAP_TCP_SELECT_ALL, soap->accept_timeout ? soap->accept_timeout : 60); if (r > 0) break; if (!r && soap->accept_timeout) { soap_set_receiver_error(soap, "Timeout", "accept failed in soap_accept()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } if (r < 0) { r = soap->errnum; if (r != SOAP_EINTR) { soap_closesock(soap); soap_set_sender_error(soap, tcp_error(soap), "accept failed in soap_accept()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } } } } if (soap->accept_timeout) SOAP_SOCKNONBLOCK(soap->master) else SOAP_SOCKBLOCK(soap->master) soap->socket = soap->faccept(soap, soap->master, (struct sockaddr*)&soap->peer, &n); soap->peerlen = (size_t)n; if (soap_valid_socket(soap->socket)) { #ifdef WITH_IPV6 unsigned int ip1, ip2, ip3, ip4; char port[16]; getnameinfo((struct sockaddr*)&soap->peer, n, soap->host, sizeof(soap->host), port, 16, NI_NUMERICHOST | NI_NUMERICSERV); sscanf(soap->host, "%u.%u.%u.%u", &ip1, &ip2, &ip3, &ip4); soap->ip = (unsigned long)ip1 << 24 | (unsigned long)ip2 << 16 | (unsigned long)ip3 << 8 | (unsigned long)ip4; soap->port = soap_strtol(port, NULL, 10); #else soap->ip = ntohl(soap->peer.sin_addr.s_addr); sprintf(soap->host, "%u.%u.%u.%u", (int)(soap->ip>>24)&0xFF, (int)(soap->ip>>16)&0xFF, (int)(soap->ip>>8)&0xFF, (int)soap->ip&0xFF); soap->port = (int)ntohs(soap->peer.sin_port); /* does not return port number on some systems */ #endif DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Accept socket %d at port %d from IP %s\n", soap->socket, soap->port, soap->host)); #ifndef WITH_LEAN if (soap->accept_flags == SO_LINGER) { struct linger linger; memset((void*)&linger, 0, sizeof(linger)); linger.l_onoff = 1; linger.l_linger = soap->linger_time; if (setsockopt(soap->socket, SOL_SOCKET, SO_LINGER, (char*)&linger, sizeof(struct linger))) { soap->errnum = soap_socket_errno(soap->socket); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_LINGER failed in soap_accept()", SOAP_TCP_ERROR); soap_closesock(soap); return SOAP_INVALID_SOCKET; } } else if (soap->accept_flags && setsockopt(soap->socket, SOL_SOCKET, soap->accept_flags, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(soap->socket); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt failed in soap_accept()", SOAP_TCP_ERROR); soap_closesock(soap); return SOAP_INVALID_SOCKET; } if (((soap->imode | soap->omode) & SOAP_IO_KEEPALIVE) && setsockopt(soap->socket, SOL_SOCKET, SO_KEEPALIVE, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(soap->socket); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_KEEPALIVE failed in soap_accept()", SOAP_TCP_ERROR); soap_closesock(soap); return SOAP_INVALID_SOCKET; } if (setsockopt(soap->socket, SOL_SOCKET, SO_SNDBUF, (char*)&len, sizeof(int))) { soap->errnum = soap_socket_errno(soap->socket); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_SNDBUF failed in soap_accept()", SOAP_TCP_ERROR); soap_closesock(soap); return SOAP_INVALID_SOCKET; } if (setsockopt(soap->socket, SOL_SOCKET, SO_RCVBUF, (char*)&len, sizeof(int))) { soap->errnum = soap_socket_errno(soap->socket); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_RCVBUF failed in soap_accept()", SOAP_TCP_ERROR); soap_closesock(soap); return SOAP_INVALID_SOCKET; } #ifdef TCP_NODELAY if (setsockopt(soap->socket, IPPROTO_TCP, TCP_NODELAY, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(soap->socket); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt TCP_NODELAY failed in soap_accept()", SOAP_TCP_ERROR); soap_closesock(soap); return SOAP_INVALID_SOCKET; } #endif #endif soap->keep_alive = (((soap->imode | soap->omode) & SOAP_IO_KEEPALIVE) != 0); if (soap->send_timeout || soap->recv_timeout) SOAP_SOCKNONBLOCK(soap->socket) else SOAP_SOCKBLOCK(soap->socket) return soap->socket; } err = soap_socket_errno(soap->socket); if (err != 0 && err != SOAP_EINTR && err != SOAP_EAGAIN && err != SOAP_EWOULDBLOCK) { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Accept failed from %s\n", soap->host)); soap->errnum = err; soap_set_receiver_error(soap, tcp_error(soap), "accept failed in soap_accept()", SOAP_TCP_ERROR); soap_closesock(soap); return SOAP_INVALID_SOCKET; } } } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_closesock(struct soap *soap) { register int status = soap->error; #ifndef WITH_LEANER if (status) /* close on error: attachment state is not to be trusted */ { soap->mime.first = NULL; soap->mime.last = NULL; soap->dime.first = NULL; soap->dime.last = NULL; } #endif if (soap->fdisconnect && (soap->error = soap->fdisconnect(soap))) return soap->error; if (status == SOAP_EOF || status == SOAP_TCP_ERROR || status == SOAP_SSL_ERROR || !soap->keep_alive) { if (soap->fclose && (soap->error = soap->fclose(soap))) return soap->error; soap->keep_alive = 0; } #ifdef WITH_ZLIB if (soap->zlib_state == SOAP_ZLIB_DEFLATE) deflateEnd(soap->d_stream); else if (soap->zlib_state == SOAP_ZLIB_INFLATE) inflateEnd(soap->d_stream); soap->zlib_state = SOAP_ZLIB_NONE; #endif return soap->error = status; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_force_closesock(struct soap *soap) { soap->keep_alive = 0; if (soap_valid_socket(soap->socket)) return soap_closesocket(soap->socket); return SOAP_OK; } #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_cleanup(struct soap *soap) { soap_done(soap); #ifdef WIN32 if (!tcp_done) return; tcp_done = 0; WSACleanup(); #endif } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_done(struct soap *soap) { #ifdef SOAP_DEBUG int i; #endif if (soap_check_state(soap)) return; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Done with context\n")); soap_free_temp(soap); while (soap->clist) { struct soap_clist *p = soap->clist->next; SOAP_FREE(soap, soap->clist); soap->clist = p; } if (soap->state == SOAP_INIT) soap->omode &= ~SOAP_IO_UDP; /* to force close the socket */ soap->keep_alive = 0; /* to force close the socket */ soap_closesock(soap); #ifdef WITH_COOKIES soap_free_cookies(soap); #endif while (soap->plugins) { register struct soap_plugin *p = soap->plugins->next; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Removing plugin '%s'\n", soap->plugins->id)); if (soap->plugins->fcopy || soap->state == SOAP_INIT) soap->plugins->fdelete(soap, soap->plugins); SOAP_FREE(soap, soap->plugins); soap->plugins = p; } soap->fplugin = fplugin; soap->fmalloc = NULL; #ifndef WITH_NOHTTP soap->fpost = http_post; soap->fget = http_get; soap->fput = http_405; soap->fdel = http_405; soap->fopt = http_200; soap->fhead = http_200; soap->fform = NULL; soap->fposthdr = http_post_header; soap->fresponse = http_response; soap->fparse = http_parse; soap->fparsehdr = http_parse_header; #endif soap->fheader = NULL; #ifndef WITH_NOIO #ifndef WITH_IPV6 soap->fresolve = tcp_gethost; #else soap->fresolve = NULL; #endif soap->faccept = tcp_accept; soap->fopen = tcp_connect; soap->fclose = tcp_disconnect; soap->fclosesocket = tcp_closesocket; soap->fshutdownsocket = tcp_shutdownsocket; soap->fsend = fsend; soap->frecv = frecv; soap->fpoll = soap_poll; #else soap->fopen = NULL; soap->fclose = NULL; soap->fpoll = NULL; #endif #ifndef WITH_LEANER soap->feltbegin = NULL; soap->feltendin = NULL; soap->feltbegout = NULL; soap->feltendout = NULL; soap->fprepareinitsend = NULL; soap->fprepareinitrecv = NULL; soap->fpreparesend = NULL; soap->fpreparerecv = NULL; soap->fpreparefinalsend = NULL; soap->fpreparefinalrecv = NULL; soap->ffiltersend = NULL; soap->ffilterrecv = NULL; #endif soap->fseterror = NULL; soap->fignore = NULL; soap->fserveloop = NULL; #ifdef WITH_OPENSSL if (soap->session) { SSL_SESSION_free(soap->session); soap->session = NULL; } #endif if (soap->state == SOAP_INIT) { if (soap_valid_socket(soap->master)) { soap->fclosesocket(soap, soap->master); soap->master = SOAP_INVALID_SOCKET; } } #ifdef WITH_OPENSSL if (soap->ssl) { SSL_free(soap->ssl); soap->ssl = NULL; } if (soap->state == SOAP_INIT) { if (soap->ctx) { SSL_CTX_free(soap->ctx); soap->ctx = NULL; } } ERR_remove_state(0); #endif #ifdef WITH_GNUTLS if (soap->state == SOAP_INIT) { if (soap->xcred) { gnutls_certificate_free_credentials(soap->xcred); soap->xcred = NULL; } if (soap->acred) { gnutls_anon_free_client_credentials(soap->acred); soap->acred = NULL; } if (soap->cache) { gnutls_priority_deinit(soap->cache); soap->cache = NULL; } if (soap->dh_params) { gnutls_dh_params_deinit(soap->dh_params); soap->dh_params = NULL; } if (soap->rsa_params) { gnutls_rsa_params_deinit(soap->rsa_params); soap->rsa_params = NULL; } } if (soap->session) { gnutls_deinit(soap->session); soap->session = NULL; } #endif #ifdef WITH_C_LOCALE # ifdef WIN32 _free_locale(soap->c_locale); # else freelocale(soap->c_locale); # endif #endif #ifdef WITH_ZLIB if (soap->d_stream) { SOAP_FREE(soap, (void*)soap->d_stream); soap->d_stream = NULL; } if (soap->z_buf) { SOAP_FREE(soap, (void*)soap->z_buf); soap->z_buf = NULL; } #endif #ifdef SOAP_DEBUG DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free logfiles\n")); for (i = 0; i < SOAP_MAXLOGS; i++) { if (soap->logfile[i]) { SOAP_FREE(soap, (void*)soap->logfile[i]); soap->logfile[i] = NULL; } soap_close_logfile(soap, i); } soap->state = SOAP_NONE; #endif #ifdef SOAP_MEM_DEBUG soap_free_mht(soap); #endif } #endif /******************************************************************************\ * * HTTP * \******************************************************************************/ /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 int http_parse(struct soap *soap) { char header[SOAP_HDRLEN], *s; unsigned short httpcmd = 0; int status = 0; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Waiting for HTTP request/response...\n")); *soap->endpoint = '\0'; soap->length = 0; #ifdef WITH_NTLM if (!soap->ntlm_challenge) #endif { soap->userid = NULL; soap->passwd = NULL; soap->authrealm = NULL; } #ifdef WITH_NTLM soap->ntlm_challenge = NULL; #endif soap->proxy_from = NULL; soap->http_content = NULL; soap->action = NULL; soap->status = 0; do { if (soap_getline(soap, soap->msgbuf, sizeof(soap->msgbuf))) { if (soap->error == SOAP_EOF) return SOAP_EOF; return soap->error = 414; } if ((s = strchr(soap->msgbuf, ' '))) { soap->status = (unsigned short)soap_strtoul(s, &s, 10); if (!soap_blank((soap_wchar)*s)) soap->status = 0; } else soap->status = 0; DBGLOG(TEST,SOAP_MESSAGE(fdebug, "HTTP status: %s\n", soap->msgbuf)); for (;;) { if (soap_getline(soap, header, SOAP_HDRLEN)) { if (soap->error == SOAP_EOF) { soap->error = SOAP_OK; DBGLOG(TEST,SOAP_MESSAGE(fdebug, "EOF in HTTP header, continue anyway\n")); break; } return soap->error; } if (!*header) break; DBGLOG(TEST,SOAP_MESSAGE(fdebug, "HTTP header: %s\n", header)); s = strchr(header, ':'); if (s) { char *t; *s = '\0'; do s++; while (*s && *s <= 32); if (*s == '"') s++; t = s + strlen(s) - 1; while (t > s && *t <= 32) t--; if (t >= s && *t == '"') t--; t[1] = '\0'; if ((soap->error = soap->fparsehdr(soap, header, s))) { if (soap->error < SOAP_STOP) return soap->error; status = soap->error; soap->error = SOAP_OK; } } } } while (soap->status == 100); DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Finished HTTP header parsing, status = %d\n", soap->status)); s = strstr(soap->msgbuf, "HTTP/"); if (s && s[7] != '1') { if (soap->keep_alive == 1) soap->keep_alive = 0; if (soap->status == 0 && (soap->omode & SOAP_IO) == SOAP_IO_CHUNK) /* soap->status == 0 for HTTP request */ { soap->imode |= SOAP_IO_CHUNK; soap->omode = (soap->omode & ~SOAP_IO) | SOAP_IO_STORE; } } if (soap->keep_alive < 0) soap->keep_alive = 1; DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Keep alive connection = %d\n", soap->keep_alive)); if (soap->status == 0) { size_t l = 0; if (s) { if (!strncmp(soap->msgbuf, "POST ", l = 5)) httpcmd = 1; else if (!strncmp(soap->msgbuf, "PUT ", l = 4)) httpcmd = 2; else if (!strncmp(soap->msgbuf, "GET ", l = 4)) httpcmd = 3; else if (!strncmp(soap->msgbuf, "DELETE ", l = 7)) httpcmd = 4; else if (!strncmp(soap->msgbuf, "OPTIONS ", l = 8)) httpcmd = 5; else if (!strncmp(soap->msgbuf, "HEAD ", l = 5)) httpcmd = 6; } if (s && httpcmd) { size_t m = strlen(soap->endpoint); size_t n = m + (s - soap->msgbuf) - l - 1; if (m > n) m = n; if (n >= sizeof(soap->endpoint)) n = sizeof(soap->endpoint) - 1; strncpy(soap->path, soap->msgbuf + l, n - m); soap->path[n - m] = '\0'; if (*soap->path && *soap->path != '/') *soap->endpoint = '\0'; strcat(soap->endpoint, soap->path); DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Target endpoint='%s'\n", soap->endpoint)); if (httpcmd > 1) { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "HTTP %s handler\n", soap->msgbuf)); switch (httpcmd) { case 2: soap->error = soap->fput(soap); break; case 3: soap->error = soap->fget(soap); break; case 4: soap->error = soap->fdel(soap); break; case 5: soap->error = soap->fopt(soap); break; case 6: soap->error = soap->fhead(soap); break; default: soap->error = 405; break; } DBGLOG(TEST,SOAP_MESSAGE(fdebug, "HTTP handler return = %d\n", soap->error)); if (soap->error == SOAP_OK) soap->error = SOAP_STOP; /* prevents further processing */ return soap->error; } if (status) return soap->error = status; } else if (status) return soap->error = status; else if (s) return soap->error = 405; } /* Status OK (HTTP 200) */ if (soap->status == 0 || soap->status == 200) return SOAP_OK; /* Status 201 (Created), 202 (Accepted), ... and HTTP 400 and 500 errors may not have a body. When content length, content type, or chunking is used assume there is a message to parse, either XML or HTTP. */ if (soap->length > 0 || (soap->http_content && (!soap->keep_alive || soap->recv_timeout)) || (soap->imode & SOAP_IO) == SOAP_IO_CHUNK) { if ((soap->status > 200 && soap->status <= 299) || soap->status == 400 || soap->status == 500) return SOAP_OK; /* force close afterwards in soap_closesock() */ soap->keep_alive = 0; #ifndef WITH_LEAN /* read HTTP body for error details */ s = soap_get_http_body(soap); if (s) return soap_set_receiver_error(soap, soap->msgbuf, s, soap->status); #endif } DBGLOG(TEST,SOAP_MESSAGE(fdebug, "HTTP error %d\n", soap->status)); return soap_set_receiver_error(soap, "HTTP Error", soap->msgbuf, soap->status); } #endif #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 static int http_parse_header(struct soap *soap, const char *key, const char *val) { if (!soap_tag_cmp(key, "Host")) { #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) if (soap->imode & SOAP_ENC_SSL) strcpy(soap->endpoint, "https://"); else #endif strcpy(soap->endpoint, "http://"); strncat(soap->endpoint, val, sizeof(soap->endpoint) - 8); soap->endpoint[sizeof(soap->endpoint) - 1] = '\0'; } #ifndef WITH_LEANER else if (!soap_tag_cmp(key, "Content-Type")) { const char *action; soap->http_content = soap_strdup(soap, val); if (soap_get_header_attribute(soap, val, "application/dime")) soap->imode |= SOAP_ENC_DIME; else if (soap_get_header_attribute(soap, val, "multipart/related") || soap_get_header_attribute(soap, val, "multipart/form-data")) { soap->mime.boundary = soap_strdup(soap, soap_get_header_attribute(soap, val, "boundary")); soap->mime.start = soap_strdup(soap, soap_get_header_attribute(soap, val, "start")); soap->imode |= SOAP_ENC_MIME; } action = soap_get_header_attribute(soap, val, "action"); if (action) { if (*action == '"') { soap->action = soap_strdup(soap, action + 1); soap->action[strlen(soap->action) - 1] = '\0'; } else soap->action = soap_strdup(soap, action); } } #endif else if (!soap_tag_cmp(key, "Content-Length")) { soap->length = soap_strtoul(val, NULL, 10); } else if (!soap_tag_cmp(key, "Content-Encoding")) { if (!soap_tag_cmp(val, "deflate")) #ifdef WITH_ZLIB soap->zlib_in = SOAP_ZLIB_DEFLATE; #else return SOAP_ZLIB_ERROR; #endif else if (!soap_tag_cmp(val, "gzip")) #ifdef WITH_GZIP soap->zlib_in = SOAP_ZLIB_GZIP; #else return SOAP_ZLIB_ERROR; #endif } #ifdef WITH_ZLIB else if (!soap_tag_cmp(key, "Accept-Encoding")) { #ifdef WITH_GZIP if (strchr(val, '*') || soap_get_header_attribute(soap, val, "gzip")) soap->zlib_out = SOAP_ZLIB_GZIP; else #endif if (strchr(val, '*') || soap_get_header_attribute(soap, val, "deflate")) soap->zlib_out = SOAP_ZLIB_DEFLATE; else soap->zlib_out = SOAP_ZLIB_NONE; } #endif else if (!soap_tag_cmp(key, "Transfer-Encoding")) { soap->imode &= ~SOAP_IO; if (!soap_tag_cmp(val, "chunked")) soap->imode |= SOAP_IO_CHUNK; } else if (!soap_tag_cmp(key, "Connection")) { if (!soap_tag_cmp(val, "keep-alive")) soap->keep_alive = -soap->keep_alive; else if (!soap_tag_cmp(val, "close")) soap->keep_alive = 0; } #ifndef WITH_LEAN else if (!soap_tag_cmp(key, "Authorization")) { if (!soap_tag_cmp(val, "Basic *")) { int n; char *s; soap_base642s(soap, val + 6, soap->tmpbuf, sizeof(soap->tmpbuf) - 1, &n); soap->tmpbuf[n] = '\0'; if ((s = strchr(soap->tmpbuf, ':'))) { *s = '\0'; soap->userid = soap_strdup(soap, soap->tmpbuf); soap->passwd = soap_strdup(soap, s + 1); } } } else if (!soap_tag_cmp(key, "WWW-Authenticate") || !soap_tag_cmp(key, "Proxy-Authenticate")) { #ifdef WITH_NTLM if (!soap_tag_cmp(val, "NTLM*")) soap->ntlm_challenge = soap_strdup(soap, val + 4); else #endif soap->authrealm = soap_strdup(soap, soap_get_header_attribute(soap, val + 6, "realm")); } else if (!soap_tag_cmp(key, "Expect")) { if (!soap_tag_cmp(val, "100-continue")) { if ((soap->error = soap->fposthdr(soap, "HTTP/1.1 100 Continue", NULL)) || (soap->error = soap->fposthdr(soap, NULL, NULL))) return soap->error; } } #endif else if (!soap_tag_cmp(key, "SOAPAction")) { if (*val == '"') { soap->action = soap_strdup(soap, val + 1); soap->action[strlen(soap->action) - 1] = '\0'; } else soap->action = soap_strdup(soap, val); } else if (!soap_tag_cmp(key, "Location")) { strncpy(soap->endpoint, val, sizeof(soap->endpoint)); soap->endpoint[sizeof(soap->endpoint) - 1] = '\0'; } else if (!soap_tag_cmp(key, "X-Forwarded-For")) { soap->proxy_from = soap_strdup(soap, val); } #ifdef WITH_COOKIES else if (!soap_tag_cmp(key, "Cookie") || !soap_tag_cmp(key, "Cookie2") || !soap_tag_cmp(key, "Set-Cookie") || !soap_tag_cmp(key, "Set-Cookie2")) { soap_getcookies(soap, val); } #endif return SOAP_OK; } #endif #endif /******************************************************************************/ #if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) #ifndef PALM_1 SOAP_FMAC1 const char* SOAP_FMAC2 soap_get_header_attribute(struct soap *soap, const char *line, const char *key) { register const char *s = line; if (s) { while (*s) { register short flag; s = soap_decode_key(soap->tmpbuf, sizeof(soap->tmpbuf), s); flag = soap_tag_cmp(soap->tmpbuf, key); s = soap_decode_val(soap->tmpbuf, sizeof(soap->tmpbuf), s); if (!flag) return soap->tmpbuf; } } return NULL; } #endif #endif /******************************************************************************/ #if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) #ifndef PALM_1 SOAP_FMAC1 const char* SOAP_FMAC2 soap_decode_key(char *buf, size_t len, const char *val) { return soap_decode(buf, len, val, "=,;"); } #endif #endif /******************************************************************************/ #if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) #ifndef PALM_1 SOAP_FMAC1 const char* SOAP_FMAC2 soap_decode_val(char *buf, size_t len, const char *val) { if (*val != '=') { *buf = '\0'; return val; } return soap_decode(buf, len, val + 1, ",;"); } #endif #endif /******************************************************************************/ #if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) #ifndef PALM_1 static const char* soap_decode(char *buf, size_t len, const char *val, const char *sep) { const char *s; char *t = buf; for (s = val; *s; s++) if (*s != ' ' && *s != '\t' && !strchr(sep, *s)) break; if (*s == '"') { s++; while (*s && *s != '"' && --len) *t++ = *s++; } else { while (*s && !soap_blank((soap_wchar)*s) && !strchr(sep, *s) && --len) { if (*s == '%') { *t++ = ((s[1] >= 'A' ? (s[1] & 0x7) + 9 : s[1] - '0') << 4) + (s[2] >= 'A' ? (s[2] & 0x7) + 9 : s[2] - '0'); s += 3; } else *t++ = *s++; } } *t = '\0'; while (*s && !strchr(sep, *s)) s++; return s; } #endif #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 static const char* http_error(struct soap *soap, int status) { register const char *msg = SOAP_STR_EOS; (void)soap; #ifndef WITH_LEAN msg = soap_code_str(h_http_error_codes, status); if (!msg) msg = SOAP_STR_EOS; #endif return msg; } #endif #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 static int http_get(struct soap *soap) { (void)soap; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "HTTP GET request\n")); return SOAP_GET_METHOD; } #endif #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 static int http_405(struct soap *soap) { return 405; (void)soap; } #endif #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 static int http_200(struct soap *soap) { return soap_send_empty_response(soap, 200); } #endif #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 static int http_post(struct soap *soap, const char *endpoint, const char *host, int port, const char *path, const char *action, size_t count) { register const char *s; register int err; switch (soap->status) { case SOAP_GET: s = "GET"; break; case SOAP_PUT: s = "PUT"; break; case SOAP_DEL: s = "DELETE"; break; case SOAP_CONNECT: s = "CONNECT"; break; default: s = "POST"; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "HTTP %s to %s\n", s, endpoint ? endpoint : "(null)")); #ifdef PALM if (!endpoint || (soap_tag_cmp(endpoint, "http:*") && soap_tag_cmp(endpoint, "https:*") && strncmp(endpoint, "httpg:", 6)) && strncmp(endpoint, "_beam:", 6) && strncmp(endpoint, "_local:", 7) && strncmp(endpoint, "_btobex:", 8)) #else if (!endpoint || (soap_tag_cmp(endpoint, "http:*") && soap_tag_cmp(endpoint, "https:*") && strncmp(endpoint, "httpg:", 6))) #endif return SOAP_OK; if (strlen(endpoint) + strlen(soap->http_version) > sizeof(soap->tmpbuf) - 80) return soap->error = SOAP_EOM; if (soap->status == SOAP_CONNECT) sprintf(soap->tmpbuf, "%s %s:%d HTTP/%s", s, soap->host, soap->port, soap->http_version); else if (soap->proxy_host && endpoint) sprintf(soap->tmpbuf, "%s %s HTTP/%s", s, endpoint, soap->http_version); else sprintf(soap->tmpbuf, "%s /%s HTTP/%s", s, (*path == '/' ? path + 1 : path), soap->http_version); if ((err = soap->fposthdr(soap, soap->tmpbuf, NULL))) return err; #ifdef WITH_OPENSSL if ((soap->ssl && port != 443) || (!soap->ssl && port != 80)) #else if (port != 80) #endif { #ifdef WITH_IPV6 if (*host != '[' && strchr(host, ':')) sprintf(soap->tmpbuf, "[%s]:%d", host, port); /* RFC 2732 */ else #endif sprintf(soap->tmpbuf, "%s:%d", host, port); } else strcpy(soap->tmpbuf, host); if ((err = soap->fposthdr(soap, "Host", soap->tmpbuf))) return err; if ((err = soap->fposthdr(soap, "User-Agent", "gSOAP/2.8"))) return err; if ((err = soap_puthttphdr(soap, SOAP_OK, count))) return err; #ifdef WITH_ZLIB #ifdef WITH_GZIP if ((err = soap->fposthdr(soap, "Accept-Encoding", "gzip, deflate"))) #else if ((err = soap->fposthdr(soap, "Accept-Encoding", "deflate"))) #endif return err; #endif #ifndef WITH_LEAN if (soap->userid && soap->passwd && strlen(soap->userid) + strlen(soap->passwd) < 761) { #ifdef WITH_NTLM if (soap->ntlm_challenge && strlen(soap->ntlm_challenge) + 6 < sizeof(soap->tmpbuf)) sprintf(soap->tmpbuf, "NTLM %s", soap->ntlm_challenge); else #endif { strcpy(soap->tmpbuf, "Basic "); sprintf(soap->tmpbuf + 262, "%s:%s", soap->userid, soap->passwd); soap_s2base64(soap, (const unsigned char*)(soap->tmpbuf + 262), soap->tmpbuf + 6, (int)strlen(soap->tmpbuf + 262)); } if ((err = soap->fposthdr(soap, "Authorization", soap->tmpbuf))) return err; } if (soap->proxy_userid && soap->proxy_passwd && strlen(soap->proxy_userid) + strlen(soap->proxy_passwd) < 761) { #ifdef WITH_NTLM if (soap->ntlm_challenge && strlen(soap->ntlm_challenge) + 6 < sizeof(soap->tmpbuf)) sprintf(soap->tmpbuf, "NTLM %s", soap->ntlm_challenge); else #endif { strcpy(soap->tmpbuf, "Basic "); sprintf(soap->tmpbuf + 262, "%s:%s", soap->proxy_userid, soap->proxy_passwd); soap_s2base64(soap, (const unsigned char*)(soap->tmpbuf + 262), soap->tmpbuf + 6, (int)strlen(soap->tmpbuf + 262)); } if ((err = soap->fposthdr(soap, "Proxy-Authorization", soap->tmpbuf))) return err; } #endif #ifdef WITH_COOKIES #ifdef WITH_OPENSSL if (soap_putcookies(soap, host, path, soap->ssl != NULL)) return soap->error; #else if (soap_putcookies(soap, host, path, 0)) return soap->error; #endif #endif if (action && soap->status != SOAP_GET && soap->status != SOAP_DEL) { sprintf(soap->tmpbuf, "\"%s\"", action && strlen(action) < sizeof(soap->tmpbuf) - 3 ? action : SOAP_STR_EOS); if ((err = soap->fposthdr(soap, "SOAPAction", soap->tmpbuf))) return err; } return soap->fposthdr(soap, NULL, NULL); } #endif #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 static int http_send_header(struct soap *soap, const char *s) { register const char *t; do { t = strchr(s, '\n'); /* disallow \n in HTTP headers */ if (!t) t = s + strlen(s); if (soap_send_raw(soap, s, t - s)) return soap->error; s = t + 1; } while (*t); return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 static int http_post_header(struct soap *soap, const char *key, const char *val) { if (key) { if (http_send_header(soap, key)) return soap->error; if (val && (soap_send_raw(soap, ": ", 2) || http_send_header(soap, val))) return soap->error; } return soap_send_raw(soap, "\r\n", 2); } #endif #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 static int http_response(struct soap *soap, int status, size_t count) { register int err; #ifdef WMW_RPM_IO if (soap->rpmreqid) httpOutputEnable(soap->rpmreqid); #endif if (strlen(soap->http_version) > 4) return soap->error = SOAP_EOM; if (!status || status == SOAP_HTML || status == SOAP_FILE) { const char *s; if (count || ((soap->omode & SOAP_IO) == SOAP_IO_CHUNK)) s = "200 OK"; else s = "202 Accepted"; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Status = %s\n", s)); #ifdef WMW_RPM_IO if (soap->rpmreqid || soap_valid_socket(soap->master) || soap_valid_socket(soap->socket)) /* RPM behaves as if standalone */ #else if (soap_valid_socket(soap->master) || soap_valid_socket(soap->socket)) /* standalone application (socket) or CGI (stdin/out)? */ #endif { sprintf(soap->tmpbuf, "HTTP/%s %s", soap->http_version, s); if ((err = soap->fposthdr(soap, soap->tmpbuf, NULL))) return err; } else if ((err = soap->fposthdr(soap, "Status", s))) /* CGI header */ return err; } else if (status >= 200 && status < 600) { sprintf(soap->tmpbuf, "HTTP/%s %d %s", soap->http_version, status, http_error(soap, status)); if ((err = soap->fposthdr(soap, soap->tmpbuf, NULL))) return err; #ifndef WITH_LEAN if (status == 401) { sprintf(soap->tmpbuf, "Basic realm=\"%s\"", (soap->authrealm && strlen(soap->authrealm) < sizeof(soap->tmpbuf) - 14) ? soap->authrealm : "gSOAP Web Service"); if ((err = soap->fposthdr(soap, "WWW-Authenticate", soap->tmpbuf))) return err; } else if ((status >= 301 && status <= 303) || status == 307) { if ((err = soap->fposthdr(soap, "Location", soap->endpoint))) return err; } #endif } else { const char *s = *soap_faultcode(soap); if (status >= SOAP_GET_METHOD && status <= SOAP_HTTP_METHOD) s = "405 Method Not Allowed"; else if (soap->version == 2 && (!s || !strcmp(s, "SOAP-ENV:Sender"))) s = "400 Bad Request"; else s = "500 Internal Server Error"; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Error %s (status=%d)\n", s, status)); #ifdef WMW_RPM_IO if (soap->rpmreqid || soap_valid_socket(soap->master) || soap_valid_socket(soap->socket)) /* RPM behaves as if standalone */ #else if (soap_valid_socket(soap->master) || soap_valid_socket(soap->socket)) /* standalone application */ #endif { sprintf(soap->tmpbuf, "HTTP/%s %s", soap->http_version, s); if ((err = soap->fposthdr(soap, soap->tmpbuf, NULL))) return err; } else if ((err = soap->fposthdr(soap, "Status", s))) /* CGI */ return err; } if ((err = soap->fposthdr(soap, "Server", "gSOAP/2.8")) || (err = soap_puthttphdr(soap, status, count))) return err; #ifdef WITH_COOKIES if (soap_putsetcookies(soap)) return soap->error; #endif return soap->fposthdr(soap, NULL, NULL); } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_response(struct soap *soap, int status) { register size_t count; if (!(soap->omode & (SOAP_ENC_XML | SOAP_IO_STORE /* this tests for chunking too */)) && (status == SOAP_HTML || status == SOAP_FILE)) soap->omode = (soap->omode & ~SOAP_IO) | SOAP_IO_STORE; soap->status = status; count = soap_count_attachments(soap); if (soap_begin_send(soap)) return soap->error; #ifndef WITH_NOHTTP if ((soap->mode & SOAP_IO) != SOAP_IO_STORE && !(soap->mode & SOAP_ENC_XML)) { register int n = soap->mode; soap->mode &= ~(SOAP_IO | SOAP_ENC_ZLIB); if ((n & SOAP_IO) != SOAP_IO_FLUSH) soap->mode |= SOAP_IO_BUFFER; if ((soap->error = soap->fresponse(soap, status, count))) return soap->error; #ifndef WITH_LEANER if ((n & SOAP_IO) == SOAP_IO_CHUNK) { if (soap_flush(soap)) return soap->error; } #endif soap->mode = n; } #endif return SOAP_OK; } #endif /******************************************************************************\ * * HTTP Cookies * \******************************************************************************/ #ifdef WITH_COOKIES /******************************************************************************/ SOAP_FMAC1 size_t SOAP_FMAC2 soap_encode_cookie(const char *s, char *t, size_t len) { register int c; register size_t n = len; while ((c = *s++) && --n > 0) { if (c > ' ' && c < 128 && !strchr("()<>@,;:\\\"/[]?={}#!$&'*+", c)) *t++ = c; else if (n > 2) { *t++ = '%'; *t++ = (c >> 4) + (c > 159 ? '7' : '0'); c &= 0xF; *t++ = c + (c > 9 ? '7' : '0'); n -= 2; } else break; } *t = '\0'; return len - n; } /******************************************************************************/ SOAP_FMAC1 struct soap_cookie* SOAP_FMAC2 soap_cookie(struct soap *soap, const char *name, const char *domain, const char *path) { struct soap_cookie *p; if (!domain) domain = soap->cookie_domain; if (!path) path = soap->cookie_path; if (!path) path = SOAP_STR_EOS; else if (*path == '/') path++; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Search cookie %s domain=%s path=%s\n", name, domain ? domain : "(null)", path ? path : "(null)")); for (p = soap->cookies; p; p = p->next) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Cookie in database: %s=%s domain=%s path=%s env=%hd\n", p->name, p->value ? p->value : "(null)", p->domain ? p->domain : "(null)", p->path ? p->path : "(null)", p->env)); if (!strcmp(p->name, name) && p->domain && p->path && !strcmp(p->domain, domain) && (!*p->path || !strncmp(p->path, path, strlen(p->path)))) break; } return p; } /******************************************************************************/ SOAP_FMAC1 struct soap_cookie* SOAP_FMAC2 soap_set_cookie(struct soap *soap, const char *name, const char *value, const char *domain, const char *path) { struct soap_cookie **p, *q; int n; if (!domain) domain = soap->cookie_domain; if (!path) path = soap->cookie_path; if (!path) path = SOAP_STR_EOS; else if (*path == '/') path++; q = soap_cookie(soap, name, domain, path); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Set %scookie: %s=%s domain=%s path=%s\n", q ? SOAP_STR_EOS : "new ", name, value ? value : "(null)", domain ? domain : "(null)", path ? path : "(null)")); if (!q) { if ((q = (struct soap_cookie*)SOAP_MALLOC(soap, sizeof(struct soap_cookie)))) { if ((q->name = (char*)SOAP_MALLOC(soap, strlen(name)+1))) strcpy(q->name, name); q->value = NULL; q->domain = NULL; q->path = NULL; q->expire = 0; q->maxage = -1; q->version = 1; q->secure = 0; q->modified = 0; for (p = &soap->cookies, n = soap->cookie_max; *p && n; p = &(*p)->next, n--) if (!strcmp((*p)->name, name) && (*p)->path && path && strcmp((*p)->path, path) < 0) break; if (n) { q->next = *p; *p = q; } else { SOAP_FREE(soap, q->name); SOAP_FREE(soap, q); q = NULL; } } } else q->modified = 1; if (q) { if (q->value) { if (!value || strcmp(value, q->value)) { SOAP_FREE(soap, q->value); q->value = NULL; } } if (value && *value && !q->value && (q->value = (char*)SOAP_MALLOC(soap, strlen(value)+1))) strcpy(q->value, value); if (q->domain) { if (!domain || strcmp(domain, q->domain)) { SOAP_FREE(soap, q->domain); q->domain = NULL; } } if (domain && !q->domain && (q->domain = (char*)SOAP_MALLOC(soap, strlen(domain)+1))) strcpy(q->domain, domain); if (q->path) { if (!path || strncmp(path, q->path, strlen(q->path))) { SOAP_FREE(soap, q->path); q->path = NULL; } } if (path && !q->path && (q->path = (char*)SOAP_MALLOC(soap, strlen(path)+1))) strcpy(q->path, path); q->session = 1; q->env = 0; } return q; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_clr_cookie(struct soap *soap, const char *name, const char *domain, const char *path) { struct soap_cookie **p, *q; if (!domain) domain = soap->cookie_domain; if (!domain) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Error in clear cookie %s: cookie domain not set\n", name ? name : "(null)")); return; } if (!path) path = soap->cookie_path; if (!path) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Error in clear cookie %s: cookie path not set\n", name ? name : "(null)")); return; } if (*path == '/') path++; for (p = &soap->cookies, q = *p; q; q = *p) { if (!strcmp(q->name, name) && !strcmp(q->domain, domain) && !strncmp(q->path, path, strlen(q->path))) { if (q->value) SOAP_FREE(soap, q->value); if (q->domain) SOAP_FREE(soap, q->domain); if (q->path) SOAP_FREE(soap, q->path); *p = q->next; SOAP_FREE(soap, q); } else p = &q->next; } } /******************************************************************************/ SOAP_FMAC1 char * SOAP_FMAC2 soap_cookie_value(struct soap *soap, const char *name, const char *domain, const char *path) { struct soap_cookie *p; if ((p = soap_cookie(soap, name, domain, path))) return p->value; return NULL; } /******************************************************************************/ SOAP_FMAC1 char * SOAP_FMAC2 soap_env_cookie_value(struct soap *soap, const char *name, const char *domain, const char *path) { struct soap_cookie *p; if ((p = soap_cookie(soap, name, domain, path)) && p->env) return p->value; return NULL; } /******************************************************************************/ SOAP_FMAC1 time_t SOAP_FMAC2 soap_cookie_expire(struct soap *soap, const char *name, const char *domain, const char *path) { struct soap_cookie *p; if ((p = soap_cookie(soap, name, domain, path))) return p->expire; return -1; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_set_cookie_expire(struct soap *soap, const char *name, long expire, const char *domain, const char *path) { struct soap_cookie *p; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Set cookie expiration max-age %ld: %s domain=%s path=%s\n", expire, name, domain ? domain : "(null)", path ? path : "(null)")); if ((p = soap_cookie(soap, name, domain, path))) { p->maxage = expire; p->modified = 1; return SOAP_OK; } return SOAP_ERR; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_set_cookie_session(struct soap *soap, const char *name, const char *domain, const char *path) { struct soap_cookie *p; if ((p = soap_cookie(soap, name, domain, path))) { p->session = 1; p->modified = 1; return SOAP_OK; } return SOAP_ERR; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_clr_cookie_session(struct soap *soap, const char *name, const char *domain, const char *path) { struct soap_cookie *p; if ((p = soap_cookie(soap, name, domain, path))) { p->session = 0; p->modified = 1; return SOAP_OK; } return SOAP_ERR; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_putsetcookies(struct soap *soap) { struct soap_cookie *p; char *s, tmp[4096]; const char *t; for (p = soap->cookies; p; p = p->next) { if (p->modified #ifdef WITH_OPENSSL || (!p->env && !soap->ssl == !p->secure) #endif ) { s = tmp; if (p->name) s += soap_encode_cookie(p->name, s, tmp-s+4064); if (p->value && *p->value) { *s++ = '='; s += soap_encode_cookie(p->value, s, tmp-s+4064); } if (p->domain && (int)strlen(p->domain) < tmp-s+4064) { strcpy(s, ";Domain="); strcat(s, p->domain); } else if (soap->cookie_domain && (int)strlen(soap->cookie_domain) < tmp-s+4064) { strcpy(s, ";Domain="); strcat(s, soap->cookie_domain); } strcat(s, ";Path=/"); s += strlen(s); if (p->path) t = p->path; else t = soap->cookie_path; if (t) { if (*t == '/') t++; if ((int)strlen(t) < tmp-s+4064) { if (strchr(t, '%')) /* already URL encoded? */ { strcpy(s, t); s += strlen(s); } else s += soap_encode_cookie(t, s, tmp-s+4064); } } if (p->version > 0 && s-tmp < 4060) { sprintf(s, ";Version=%u", p->version); s += strlen(s); } if (p->maxage >= 0 && s-tmp < 4060) { sprintf(s, ";Max-Age=%ld", p->maxage); s += strlen(s); } if (s-tmp < 4073 && (p->secure #ifdef WITH_OPENSSL || soap->ssl #endif )) strcpy(s, ";Secure"); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Set-Cookie: %s\n", tmp)); if ((soap->error = soap->fposthdr(soap, "Set-Cookie", tmp))) return soap->error; } } return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_putcookies(struct soap *soap, const char *domain, const char *path, int secure) { struct soap_cookie **p, *q; unsigned int version = 0; time_t now = time(NULL); char *s, tmp[4096]; if (!domain || !path) return SOAP_OK; s = tmp; p = &soap->cookies; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Sending cookies for domain=%s path=%s\n", domain, path)); if (*path == '/') path++; while ((q = *p)) { if (q->expire && now > q->expire) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Cookie %s expired\n", q->name)); SOAP_FREE(soap, q->name); if (q->value) SOAP_FREE(soap, q->value); if (q->domain) SOAP_FREE(soap, q->domain); if (q->path) SOAP_FREE(soap, q->path); *p = q->next; SOAP_FREE(soap, q); } else { int flag; char *t = q->domain; size_t n = 0; if (!t) flag = 1; else { const char *r = strchr(t, ':'); if (r) n = r - t; else n = strlen(t); flag = !strncmp(t, domain, n); } /* domain-level cookies, cannot compile when WITH_NOIO set */ #ifndef WITH_NOIO if (!flag) { struct hostent *hostent = gethostbyname((char*)domain); if (hostent) { const char *r = strchr(hostent->h_name, '.'); if (!r) r = hostent->h_name; flag = !strncmp(t, r, n); } } #endif if (flag && (!q->path || !strncmp(q->path, path, strlen(q->path))) && (!q->secure || secure)) { size_t n = 12; if (q->name) n += 3*strlen(q->name); if (q->value && *q->value) n += 3*strlen(q->value) + 1; if (q->path && *q->path) n += strlen(q->path) + 9; if (q->domain) n += strlen(q->domain) + 11; if (tmp - s + n > sizeof(tmp)) { if (s == tmp) return SOAP_OK; /* HTTP header size overflow */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Cookie: %s\n", tmp)); if ((soap->error = soap->fposthdr(soap, "Cookie", tmp))) return soap->error; s = tmp; } else if (s != tmp) { strcat(s, " "); s++; } if (q->version != version) { sprintf(s, "$Version=%u;", q->version); version = q->version; s += strlen(s); } if (q->name) s += soap_encode_cookie(q->name, s, tmp+sizeof(tmp)-s-16); if (q->value && *q->value) { *s++ = '='; s += soap_encode_cookie(q->value, s, tmp+sizeof(tmp)-s-16); } if (q->path) { sprintf(s, ";$Path=\"/%s\"", (*q->path == '/' ? q->path + 1 : q->path)); s += strlen(s); } if (q->domain) { sprintf(s, ";$Domain=\"%s\"", q->domain); s += strlen(s); } } p = &q->next; } } if (s != tmp) if ((soap->error = soap->fposthdr(soap, "Cookie", tmp))) return soap->error; return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_getcookies(struct soap *soap, const char *val) { struct soap_cookie *p = NULL, *q; const char *s; char *t, tmp[4096]; /* cookie size is up to 4096 bytes [RFC2109] */ char *domain = NULL; char *path = NULL; unsigned int version = 0; time_t now = time(NULL); if (!val) return; s = val; while (*s) { s = soap_decode_key(tmp, sizeof(tmp), s); if (!soap_tag_cmp(tmp, "$Version")) { if ((s = soap_decode_val(tmp, sizeof(tmp), s))) { if (p) p->version = (int)soap_strtol(tmp, NULL, 10); else version = (int)soap_strtol(tmp, NULL, 10); } } else if (!soap_tag_cmp(tmp, "$Path")) { s = soap_decode_val(tmp, sizeof(tmp), s); if (*tmp) { if ((t = (char*)SOAP_MALLOC(soap, strlen(tmp)+1))) strcpy(t, tmp); } else t = NULL; if (p) { if (p->path) SOAP_FREE(soap, p->path); p->path = t; } else { if (path) SOAP_FREE(soap, path); path = t; } } else if (!soap_tag_cmp(tmp, "$Domain")) { s = soap_decode_val(tmp, sizeof(tmp), s); if (*tmp) { if ((t = (char*)SOAP_MALLOC(soap, strlen(tmp)+1))) strcpy(t, tmp); } else t = NULL; if (p) { if (p->domain) SOAP_FREE(soap, p->domain); p->domain = t; } else { if (domain) SOAP_FREE(soap, domain); domain = t; } } else if (p && !soap_tag_cmp(tmp, "Path")) { if (p->path) SOAP_FREE(soap, p->path); s = soap_decode_val(tmp, sizeof(tmp), s); if (*tmp) { if ((p->path = (char*)SOAP_MALLOC(soap, strlen(tmp)+1))) strcpy(p->path, tmp); } else p->path = NULL; } else if (p && !soap_tag_cmp(tmp, "Domain")) { if (p->domain) SOAP_FREE(soap, p->domain); s = soap_decode_val(tmp, sizeof(tmp), s); if (*tmp) { if ((p->domain = (char*)SOAP_MALLOC(soap, strlen(tmp)+1))) strcpy(p->domain, tmp); } else p->domain = NULL; } else if (p && !soap_tag_cmp(tmp, "Version")) { s = soap_decode_val(tmp, sizeof(tmp), s); p->version = (unsigned int)soap_strtoul(tmp, NULL, 10); } else if (p && !soap_tag_cmp(tmp, "Max-Age")) { s = soap_decode_val(tmp, sizeof(tmp), s); p->expire = now + soap_strtol(tmp, NULL, 10); } else if (p && !soap_tag_cmp(tmp, "Expires")) { struct tm T; char a[3]; static const char mns[] = "anebarprayunulugepctovec"; s = soap_decode_val(tmp, sizeof(tmp), s); if (strlen(tmp) > 20) { memset((void*)&T, 0, sizeof(T)); a[0] = tmp[4]; a[1] = tmp[5]; a[2] = '\0'; T.tm_mday = (int)soap_strtol(a, NULL, 10); a[0] = tmp[8]; a[1] = tmp[9]; T.tm_mon = (int)(strstr(mns, a) - mns) / 2; a[0] = tmp[11]; a[1] = tmp[12]; T.tm_year = 100 + (int)soap_strtol(a, NULL, 10); a[0] = tmp[13]; a[1] = tmp[14]; T.tm_hour = (int)soap_strtol(a, NULL, 10); a[0] = tmp[16]; a[1] = tmp[17]; T.tm_min = (int)soap_strtol(a, NULL, 10); a[0] = tmp[19]; a[1] = tmp[20]; T.tm_sec = (int)soap_strtol(a, NULL, 10); p->expire = soap_timegm(&T); } } else if (p && !soap_tag_cmp(tmp, "Secure")) p->secure = 1; else { if (p) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Got environment cookie %s=%s domain=%s path=%s expire=%ld secure=%d\n", p->name, p->value ? p->value : "(null)", p->domain ? p->domain : "(null)", p->path ? p->path : "(null)", p->expire, p->secure)); if ((q = soap_set_cookie(soap, p->name, p->value, p->domain, p->path))) { q->version = p->version; q->expire = p->expire; q->secure = p->secure; q->env = 1; } if (p->name) SOAP_FREE(soap, p->name); if (p->value) SOAP_FREE(soap, p->value); if (p->domain) SOAP_FREE(soap, p->domain); if (p->path) SOAP_FREE(soap, p->path); SOAP_FREE(soap, p); } if ((p = (struct soap_cookie*)SOAP_MALLOC(soap, sizeof(struct soap_cookie)))) { p->name = (char*)SOAP_MALLOC(soap, strlen(tmp)+1); strcpy(p->name, tmp); s = soap_decode_val(tmp, sizeof(tmp), s); if (*tmp) { p->value = (char*)SOAP_MALLOC(soap, strlen(tmp)+1); strcpy(p->value, tmp); } else p->value = NULL; if (domain) p->domain = domain; else if (*soap->host) { p->domain = (char*)SOAP_MALLOC(soap, strlen(soap->host)+1); strcpy(p->domain, soap->host); } else p->domain = NULL; if (path) p->path = path; else if (soap->path && *soap->path) { p->path = (char*)SOAP_MALLOC(soap, strlen(soap->path)+1); strcpy(p->path, soap->path); } else { p->path = (char*)SOAP_MALLOC(soap, 2); strcpy(p->path, "/"); } p->expire = 0; p->secure = 0; p->version = version; } } } if (p) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Got environment cookie %s=%s domain=%s path=%s expire=%ld secure=%d\n", p->name, p->value ? p->value : "(null)", p->domain ? p->domain : "(null)", p->path ? p->path : "(null)", p->expire, p->secure)); if ((q = soap_set_cookie(soap, p->name, p->value, p->domain, p->path))) { q->version = p->version; q->expire = p->expire; q->secure = p->secure; q->env = 1; } if (p->name) SOAP_FREE(soap, p->name); if (p->value) SOAP_FREE(soap, p->value); if (p->domain) SOAP_FREE(soap, p->domain); if (p->path) SOAP_FREE(soap, p->path); SOAP_FREE(soap, p); } if (domain) SOAP_FREE(soap, domain); if (path) SOAP_FREE(soap, path); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_getenv_cookies(struct soap *soap) { struct soap_cookie *p; const char *s; char key[4096], val[4096]; /* cookie size is up to 4096 bytes [RFC2109] */ if (!(s = getenv("HTTP_COOKIE"))) return SOAP_ERR; do { s = soap_decode_key(key, sizeof(key), s); s = soap_decode_val(val, sizeof(val), s); p = soap_set_cookie(soap, key, val, NULL, NULL); if (p) p->env = 1; } while (*s); return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 struct soap_cookie* SOAP_FMAC2 soap_copy_cookies(struct soap *copy, const struct soap *soap) { struct soap_cookie *p, **q, *r; q = &r; for (p = soap->cookies; p; p = p->next) { if (!(*q = (struct soap_cookie*)SOAP_MALLOC(copy, sizeof(struct soap_cookie)))) return r; **q = *p; if (p->name) { if (((*q)->name = (char*)SOAP_MALLOC(copy, strlen(p->name)+1))) strcpy((*q)->name, p->name); } if (p->value) { if (((*q)->value = (char*)SOAP_MALLOC(copy, strlen(p->value)+1))) strcpy((*q)->value, p->value); } if (p->domain) { if (((*q)->domain = (char*)SOAP_MALLOC(copy, strlen(p->domain)+1))) strcpy((*q)->domain, p->domain); } if (p->path) { if (((*q)->path = (char*)SOAP_MALLOC(copy, strlen(p->path)+1))) strcpy((*q)->path, p->path); } q = &(*q)->next; } *q = NULL; return r; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_free_cookies(struct soap *soap) { struct soap_cookie *p; for (p = soap->cookies; p; p = soap->cookies) { soap->cookies = p->next; SOAP_FREE(soap, p->name); if (p->value) SOAP_FREE(soap, p->value); if (p->domain) SOAP_FREE(soap, p->domain); if (p->path) SOAP_FREE(soap, p->path); SOAP_FREE(soap, p); } } /******************************************************************************/ #endif /* WITH_COOKIES */ /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 size_t SOAP_FMAC2 soap_hash(register const char *s) { register size_t h = 0; while (*s) h = 65599*h + *s++; return h % SOAP_IDHASH; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_1 static void soap_init_pht(struct soap *soap) { register int i; soap->pblk = NULL; soap->pidx = 0; for (i = 0; i < (int)SOAP_PTRHASH; i++) soap->pht[i] = NULL; } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 struct soap* SOAP_FMAC2 soap_versioning(soap_new)(soap_mode imode, soap_mode omode) { struct soap *soap = (struct soap*)malloc(sizeof(struct soap)); if (soap) soap_versioning(soap_init)(soap, imode, omode); return soap; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_free(struct soap *soap) { soap_done(soap); free(soap); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_del(struct soap *soap) { free(soap); } #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_1 static void soap_free_pht(struct soap *soap) { register struct soap_pblk *pb, *next; register int i; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free pointer hashtable\n")); for (pb = soap->pblk; pb; pb = next) { next = pb->next; SOAP_FREE(soap, pb); } soap->pblk = NULL; soap->pidx = 0; for (i = 0; i < (int)SOAP_PTRHASH; i++) soap->pht[i] = NULL; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_embed(struct soap *soap, const void *p, const struct soap_array *a, int n, const char *tag, int type) { register int i; struct soap_plist *pp; if (soap->version == 2) soap->encoding = 1; if (a) i = soap_array_pointer_lookup(soap, p, a, n, type, &pp); else i = soap_pointer_lookup(soap, p, type, &pp); if (i) { if (soap_is_embedded(soap, pp) || soap_is_single(soap, pp)) return 0; soap_set_embedded(soap, pp); } return i; (void)soap; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_pointer_lookup(struct soap *soap, const void *p, int type, struct soap_plist **ppp) { register struct soap_plist *pp; *ppp = NULL; if (p) { for (pp = soap->pht[soap_hash_ptr(p)]; pp; pp = pp->next) { if (pp->ptr == p && pp->type == type) { *ppp = pp; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Lookup location=%p type=%d id=%d\n", p, type, pp->id)); return pp->id; } } } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Lookup location=%p type=%d: not found\n", p, type)); return 0; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_pointer_enter(struct soap *soap, const void *p, const struct soap_array *a, int n, int type, struct soap_plist **ppp) { register size_t h; register struct soap_plist *pp; if (!soap->pblk || soap->pidx >= SOAP_PTRBLK) { register struct soap_pblk *pb = (struct soap_pblk*)SOAP_MALLOC(soap, sizeof(struct soap_pblk)); if (!pb) { soap->error = SOAP_EOM; return 0; } pb->next = soap->pblk; soap->pblk = pb; soap->pidx = 0; } *ppp = pp = &soap->pblk->plist[soap->pidx++]; if (a) h = soap_hash_ptr(a->__ptr); else h = soap_hash_ptr(p); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Pointer enter location=%p array=%p size=%d dim=%d type=%d id=%d\n", p, a ? a->__ptr : NULL, a ? a->__size : 0, n, type, soap->idnum+1)); pp->next = soap->pht[h]; pp->type = type; pp->mark1 = 0; pp->mark2 = 0; pp->ptr = p; pp->array = a; soap->pht[h] = pp; pp->id = ++soap->idnum; return pp->id; (void)n; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_array_pointer_lookup(struct soap *soap, const void *p, const struct soap_array *a, int n, int type, struct soap_plist **ppp) { register struct soap_plist *pp; *ppp = NULL; if (!p || !a->__ptr) return 0; for (pp = soap->pht[soap_hash_ptr(a->__ptr)]; pp; pp = pp->next) { if (pp->type == type && pp->array && pp->array->__ptr == a->__ptr) { register int i; for (i = 0; i < n; i++) if (((const int*)&pp->array->__size)[i] != ((const int*)&a->__size)[i]) break; if (i == n) { *ppp = pp; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Array lookup location=%p type=%d id=%d\n", a->__ptr, type, pp->id)); return pp->id; } } } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Array lookup location=%p type=%d: not found\n", a->__ptr, type)); return 0; } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_begin_count(struct soap *soap) { soap_free_ns(soap); #ifndef WITH_LEANER if ((soap->mode & SOAP_ENC_DIME) || (soap->omode & SOAP_ENC_DIME)) soap->mode = soap->omode | SOAP_IO_LENGTH | SOAP_ENC_DIME; else #endif { soap->mode = soap->omode; if ((soap->mode & SOAP_IO_UDP)) soap->mode |= SOAP_ENC_XML; if ((soap->mode & SOAP_IO) == SOAP_IO_STORE || (((soap->mode & SOAP_IO) == SOAP_IO_CHUNK || (soap->mode & SOAP_ENC_XML)) #ifndef WITH_LEANER && !soap->fpreparesend #endif )) soap->mode &= ~SOAP_IO_LENGTH; else soap->mode |= SOAP_IO_LENGTH; } #ifdef WITH_ZLIB if ((soap->mode & SOAP_ENC_ZLIB) && (soap->mode & SOAP_IO) == SOAP_IO_FLUSH) { if (!(soap->mode & SOAP_ENC_DIME)) soap->mode &= ~SOAP_IO_LENGTH; if (soap->mode & SOAP_ENC_XML) soap->mode |= SOAP_IO_BUFFER; else soap->mode |= SOAP_IO_STORE; } #endif if (!soap->encodingStyle && !(soap->mode & SOAP_XML_GRAPH)) soap->mode |= SOAP_XML_TREE; #ifndef WITH_LEANER if ((soap->mode & SOAP_ENC_MTOM) && (soap->mode & SOAP_ENC_DIME)) soap->mode |= SOAP_ENC_MIME; else if (!(soap->mode & SOAP_ENC_MIME)) soap->mode &= ~SOAP_ENC_MTOM; if (soap->mode & SOAP_ENC_MIME) soap_select_mime_boundary(soap); soap->dime.list = soap->dime.last; /* keep track of last DIME attachment */ #endif soap->count = 0; soap->ns = 0; soap->null = 0; soap->position = 0; soap->mustUnderstand = 0; soap->encoding = 0; soap->part = SOAP_BEGIN; soap->event = 0; soap->evlev = 0; soap->idnum = 0; soap_clr_attr(soap); soap_set_local_namespaces(soap); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Begin count phase (socket=%d mode=0x%x count=%lu)\n", soap->socket, (unsigned int)soap->mode, (unsigned long)soap->count)); #ifndef WITH_LEANER soap->dime.count = 0; /* count # of attachments */ soap->dime.size = 0; /* accumulate total size of attachments */ if (soap->fprepareinitsend && (soap->mode & SOAP_IO) != SOAP_IO_STORE && (soap->error = soap->fprepareinitsend(soap))) return soap->error; #endif return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_end_count(struct soap *soap) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of count phase\n")); #ifndef WITH_LEANER if ((soap->mode & SOAP_IO_LENGTH)) { if (soap->fpreparefinalsend && (soap->error = soap->fpreparefinalsend(soap))) return soap->error; } #endif return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_begin_send(struct soap *soap) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Initializing for output\n")); soap_free_ns(soap); soap->error = SOAP_OK; soap->mode = soap->omode | (soap->mode & (SOAP_IO_LENGTH | SOAP_ENC_DIME)); #ifdef WITH_ZLIB if ((soap->mode & SOAP_ENC_ZLIB) && (soap->mode & SOAP_IO) == SOAP_IO_FLUSH) { if (soap->mode & SOAP_ENC_XML) soap->mode |= SOAP_IO_BUFFER; else soap->mode |= SOAP_IO_STORE; } #endif #ifndef WITH_LEAN if ((soap->mode & SOAP_IO_UDP)) { soap->mode |= SOAP_ENC_XML; if (soap->count > SOAP_BUFLEN) return soap->error = SOAP_UDP_ERROR; } #endif if ((soap->mode & SOAP_IO) == SOAP_IO_FLUSH && soap_valid_socket(soap->socket)) { if (soap->count || (soap->mode & SOAP_IO_LENGTH) || (soap->mode & SOAP_ENC_XML)) soap->mode |= SOAP_IO_BUFFER; else soap->mode |= SOAP_IO_STORE; } soap->mode &= ~SOAP_IO_LENGTH; if ((soap->mode & SOAP_IO) == SOAP_IO_STORE) if (soap_new_block(soap) == NULL) return soap->error; if (!(soap->mode & SOAP_IO_KEEPALIVE)) soap->keep_alive = 0; if (!soap->encodingStyle && !(soap->mode & SOAP_XML_GRAPH)) soap->mode |= SOAP_XML_TREE; #ifndef WITH_LEANER if ((soap->mode & SOAP_ENC_MTOM) && (soap->mode & SOAP_ENC_DIME)) { soap->mode |= SOAP_ENC_MIME; soap->mode &= ~SOAP_ENC_DIME; } else if (!(soap->mode & SOAP_ENC_MIME)) soap->mode &= ~SOAP_ENC_MTOM; if (soap->mode & SOAP_ENC_MIME) soap_select_mime_boundary(soap); #ifdef WIN32 #ifndef UNDER_CE #ifndef WITH_FASTCGI if (!soap_valid_socket(soap->socket)) /* Set win32 stdout or soap->sendfd to BINARY, e.g. to support DIME */ #ifdef __BORLANDC__ setmode(soap->sendfd, _O_BINARY); #else _setmode(soap->sendfd, _O_BINARY); #endif #endif #endif #endif #endif if (soap->mode & SOAP_IO) { soap->bufidx = 0; soap->buflen = 0; } soap->chunksize = 0; soap->ns = 0; soap->null = 0; soap->position = 0; soap->mustUnderstand = 0; soap->encoding = 0; soap->idnum = 0; soap->level = 0; soap_clr_attr(soap); soap_set_local_namespaces(soap); #ifdef WITH_ZLIB soap->z_ratio_out = 1.0; if ((soap->mode & SOAP_ENC_ZLIB) && soap->zlib_state != SOAP_ZLIB_DEFLATE) { if (!soap->z_buf) soap->z_buf = (char*)SOAP_MALLOC(soap, SOAP_BUFLEN); soap->d_stream->next_out = (Byte*)soap->z_buf; soap->d_stream->avail_out = SOAP_BUFLEN; #ifdef WITH_GZIP if (soap->zlib_out != SOAP_ZLIB_DEFLATE) { memcpy(soap->z_buf, "\37\213\10\0\0\0\0\0\0\377", 10); soap->d_stream->next_out = (Byte*)soap->z_buf + 10; soap->d_stream->avail_out = SOAP_BUFLEN - 10; soap->z_crc = crc32(0L, NULL, 0); soap->zlib_out = SOAP_ZLIB_GZIP; if (soap->z_dict) *((Byte*)soap->z_buf + 2) = 0xff; if (deflateInit2(soap->d_stream, soap->z_level, Z_DEFLATED, -MAX_WBITS, 8, Z_DEFAULT_STRATEGY) != Z_OK) return soap->error = SOAP_ZLIB_ERROR; } else #endif if (deflateInit(soap->d_stream, soap->z_level) != Z_OK) return soap->error = SOAP_ZLIB_ERROR; if (soap->z_dict) { if (deflateSetDictionary(soap->d_stream, (const Bytef*)soap->z_dict, soap->z_dict_len) != Z_OK) return soap->error = SOAP_ZLIB_ERROR; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Deflate initialized\n")); soap->zlib_state = SOAP_ZLIB_DEFLATE; } #endif #ifdef WITH_OPENSSL if (soap->ssl) ERR_clear_error(); #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Begin send phase (socket=%d mode=0x%x count=%lu)\n", soap->socket, soap->mode, (unsigned long)soap->count)); soap->part = SOAP_BEGIN; #ifndef WITH_LEANER if (soap->fprepareinitsend && (soap->mode & SOAP_IO) == SOAP_IO_STORE && (soap->error = soap->fprepareinitsend(soap))) return soap->error; #endif return SOAP_OK; } #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_embedded(struct soap *soap, const void *p, int t) { struct soap_plist *pp; if (soap_pointer_lookup(soap, p, t, &pp)) { pp->mark1 = 1; pp->mark2 = 1; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Embedded %p type=%d mark set to 1\n", p, t)); } } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_reference(struct soap *soap, const void *p, int t) { struct soap_plist *pp; if (!p || (soap->mode & SOAP_XML_TREE)) return 1; if (soap_pointer_lookup(soap, p, t, &pp)) { if (pp->mark1 == 0) { pp->mark1 = 2; pp->mark2 = 2; } } else if (soap_pointer_enter(soap, p, NULL, 0, t, &pp)) { pp->mark1 = 0; pp->mark2 = 0; } else return 1; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Reference %p type=%d (%d %d)\n", p, t, (int)pp->mark1, (int)pp->mark2)); return pp->mark1; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_array_reference(struct soap *soap, const void *p, const struct soap_array *a, int n, int t) { register int i; struct soap_plist *pp; if (!p || !a->__ptr) return 1; i = soap_array_pointer_lookup(soap, p, a, n, t, &pp); if (i) { if (pp->mark1 == 0) { pp->mark1 = 2; pp->mark2 = 2; } } else if (!soap_pointer_enter(soap, p, a, n, t, &pp)) return 1; else { pp->mark1 = 0; pp->mark2 = 0; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Array reference %p ptr=%p dim=%d type=%d (%d %d)\n", p, a->__ptr, n, t, (int)pp->mark1, (int)pp->mark2)); return pp->mark1; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_embedded_id(struct soap *soap, int id, const void *p, int t) { struct soap_plist *pp = NULL; if (soap->mode & SOAP_XML_TREE) return id; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Embedded_id %p type=%d id=%d\n", p, t, id)); if (soap->version == 1 && soap->encodingStyle && !(soap->mode & SOAP_XML_GRAPH) && soap->part != SOAP_IN_HEADER) { if (id < 0) { id = soap_pointer_lookup(soap, p, t, &pp); if (id) { if (soap->mode & SOAP_IO_LENGTH) pp->mark1 = 2; else pp->mark2 = 2; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Embedded_id multiref id=%d %p type=%d = (%d %d)\n", id, p, t, (int)pp->mark1, (int)pp->mark2)); } return -1; } return id; } if (id < 0) id = soap_pointer_lookup(soap, p, t, &pp); else if (id && !soap_pointer_lookup(soap, p, t, &pp)) return 0; if (id && pp) { if (soap->mode & SOAP_IO_LENGTH) pp->mark1 = 1; else pp->mark2 = 1; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Embedded_id embedded ref id=%d %p type=%d = (%d %d)\n", id, p, t, (int)pp->mark1, (int)pp->mark2)); } return id; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_is_embedded(struct soap *soap, struct soap_plist *pp) { if (!pp) return 0; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Is embedded? %d %d\n", (int)pp->mark1, (int)pp->mark2)); if (soap->version == 1 && soap->encodingStyle && !(soap->mode & SOAP_XML_GRAPH) && soap->part != SOAP_IN_HEADER) { if (soap->mode & SOAP_IO_LENGTH) return pp->mark1 != 0; return pp->mark2 != 0; } if (soap->mode & SOAP_IO_LENGTH) return pp->mark1 == 1; return pp->mark2 == 1; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_is_single(struct soap *soap, struct soap_plist *pp) { if (soap->part == SOAP_IN_HEADER) return 1; if (!pp) return 0; if (soap->mode & SOAP_IO_LENGTH) return pp->mark1 == 0; return pp->mark2 == 0; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_set_embedded(struct soap *soap, struct soap_plist *pp) { if (!pp) return; if (soap->mode & SOAP_IO_LENGTH) pp->mark1 = 1; else pp->mark2 = 1; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_attachment(struct soap *soap, const char *tag, int id, const void *p, const struct soap_array *a, const char *aid, const char *atype, const char *aoptions, int n, const char *type, int t) { #ifndef WITH_NOIDREF struct soap_plist *pp; int i; if (!p || !a->__ptr || (!aid && !atype)) return soap_element_id(soap, tag, id, p, a, n, type, t); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Attachment tag='%s' id='%s' (%d) type='%s'\n", tag, aid ? aid : SOAP_STR_EOS, id, atype ? atype : SOAP_STR_EOS)); i = soap_array_pointer_lookup(soap, p, a, n, t, &pp); if (!i) { i = soap_pointer_enter(soap, p, a, n, t, &pp); if (!i) { soap->error = SOAP_EOM; return -1; } } if (id <= 0) id = i; if (!aid) { sprintf(soap->tmpbuf, soap->dime_id_format, id); aid = soap_strdup(soap, soap->tmpbuf); } /* Add MTOM xop:Include element when necessary */ /* TODO: this code to be obsoleted with new import/xop.h conventions */ if ((soap->mode & SOAP_ENC_MTOM) && strcmp(tag, "xop:Include")) { if (soap_element_begin_out(soap, tag, 0, type) || soap_element_href(soap, "xop:Include", 0, "xmlns:xop=\"http://www.w3.org/2004/08/xop/include\" href", aid) || soap_element_end_out(soap, tag)) return soap->error; } else if (soap_element_href(soap, tag, 0, "href", aid)) return soap->error; if (soap->mode & SOAP_IO_LENGTH) { if (pp->mark1 != 3) { struct soap_multipart *content; if (soap->mode & SOAP_ENC_MTOM) content = soap_new_multipart(soap, &soap->mime.first, &soap->mime.last, (char*)a->__ptr, a->__size); else content = soap_new_multipart(soap, &soap->dime.first, &soap->dime.last, (char*)a->__ptr, a->__size); if (!content) { soap->error = SOAP_EOM; return -1; } if (!strncmp(aid, "cid:", 4)) /* RFC 2111 */ { if (soap->mode & SOAP_ENC_MTOM) { char *s = (char*)soap_malloc(soap, strlen(aid) - 1); if (s) { *s = '<'; strcpy(s + 1, aid + 4); strcat(s, ">"); content->id = s; } } else content->id = aid + 4; } else content->id = aid; content->type = atype; content->options = aoptions; content->encoding = SOAP_MIME_BINARY; pp->mark1 = 3; } } else pp->mark2 = 3; #endif return -1; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_1 static void soap_init_iht(struct soap *soap) { register int i; for (i = 0; i < SOAP_IDHASH; i++) soap->iht[i] = NULL; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_1 static void soap_free_iht(struct soap *soap) { register int i; register struct soap_ilist *ip = NULL, *p = NULL; register struct soap_flist *fp = NULL, *fq = NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free ID hashtable\n")); for (i = 0; i < SOAP_IDHASH; i++) { for (ip = soap->iht[i]; ip; ip = p) { for (fp = ip->flist; fp; fp = fq) { fq = fp->next; SOAP_FREE(soap, fp); } p = ip->next; SOAP_FREE(soap, ip); } soap->iht[i] = NULL; } } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 struct soap_ilist * SOAP_FMAC2 soap_lookup(struct soap *soap, const char *id) { register struct soap_ilist *ip = NULL; for (ip = soap->iht[soap_hash(id)]; ip; ip = ip->next) if (!strcmp(ip->id, id)) return ip; return NULL; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 struct soap_ilist * SOAP_FMAC2 soap_enter(struct soap *soap, const char *id) { register size_t h; register struct soap_ilist *ip; ip = (struct soap_ilist*)SOAP_MALLOC(soap, sizeof(struct soap_ilist) + strlen(id)); if (ip) { h = soap_hash(id); strcpy((char*)ip->id, id); ip->next = soap->iht[h]; soap->iht[h] = ip; } return ip; } #endif #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void* SOAP_FMAC2 soap_malloc(struct soap *soap, size_t n) { register char *p; if (!n) return (void*)SOAP_NON_NULL; if (!soap) return SOAP_MALLOC(soap, n); if (soap->fmalloc) p = (char*)soap->fmalloc(soap, n); else { n += sizeof(short); n += (-(long)n) & (sizeof(void*)-1); /* align at 4-, 8- or 16-byte boundary */ if (!(p = (char*)SOAP_MALLOC(soap, n + sizeof(void*) + sizeof(size_t)))) { soap->error = SOAP_EOM; return NULL; } /* set the canary to detect corruption */ *(unsigned short*)(p + n - sizeof(unsigned short)) = (unsigned short)SOAP_CANARY; /* keep chain of alloced cells for destruction */ *(void**)(p + n) = soap->alist; *(size_t*)(p + n + sizeof(void*)) = n; soap->alist = p + n; } soap->alloced = 1; return p; } #endif /******************************************************************************/ #ifdef SOAP_MEM_DEBUG static void soap_init_mht(struct soap *soap) { register int i; for (i = 0; i < (int)SOAP_PTRHASH; i++) soap->mht[i] = NULL; } #endif /******************************************************************************/ #ifdef SOAP_MEM_DEBUG static void soap_free_mht(struct soap *soap) { register int i; register struct soap_mlist *mp, *mq; for (i = 0; i < (int)SOAP_PTRHASH; i++) { for (mp = soap->mht[i]; mp; mp = mq) { mq = mp->next; if (mp->live) fprintf(stderr, "%s(%d): malloc() = %p not freed (memory leak or forgot to call soap_end()?)\n", mp->file, mp->line, mp->ptr); free(mp); } soap->mht[i] = NULL; } } #endif /******************************************************************************/ #ifdef SOAP_MEM_DEBUG SOAP_FMAC1 void* SOAP_FMAC2 soap_track_malloc(struct soap *soap, const char *file, int line, size_t size) { register void *p = malloc(size); if (soap) { register size_t h = soap_hash_ptr(p); register struct soap_mlist *mp = (struct soap_mlist*)malloc(sizeof(struct soap_mlist)); if (soap->fdebug[SOAP_INDEX_TEST]) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%s(%d): malloc(%lu) = %p\n", file, line, (unsigned long)size, p)); } mp->next = soap->mht[h]; mp->ptr = p; mp->file = file; mp->line = line; mp->live = 1; soap->mht[h] = mp; } return p; } #endif /******************************************************************************/ #ifdef SOAP_MEM_DEBUG SOAP_FMAC1 void SOAP_FMAC2 soap_track_free(struct soap *soap, const char *file, int line, void *p) { register size_t h = soap_hash_ptr(p); register struct soap_mlist *mp; for (mp = soap->mht[h]; mp; mp = mp->next) if (mp->ptr == p) break; if (mp) { if (mp->live) { free(p); if (soap->fdebug[SOAP_INDEX_TEST]) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%s(%d): free(%p)\n", file, line, p)); } mp->live = 0; } else fprintf(stderr, "%s(%d): free(%p) double free of pointer malloced at %s(%d)\n", file, line, p, mp->file, mp->line); } else fprintf(stderr, "%s(%d): free(%p) pointer not malloced\n", file, line, p); } #endif /******************************************************************************/ #ifdef SOAP_MEM_DEBUG static void soap_track_unlink(struct soap *soap, const void *p) { register size_t h = soap_hash_ptr(p); register struct soap_mlist *mp; for (mp = soap->mht[h]; mp; mp = mp->next) if (mp->ptr == p) break; if (mp) mp->live = 0; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_dealloc(struct soap *soap, void *p) { if (soap_check_state(soap)) return; if (p) { register char **q; for (q = (char**)&soap->alist; *q; q = *(char***)q) { if (*(unsigned short*)(char*)(*q - sizeof(unsigned short)) != (unsigned short)SOAP_CANARY) { #ifdef SOAP_MEM_DEBUG fprintf(stderr, "Data corruption in dynamic allocation (see logs)\n"); #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Data corruption:\n")); DBGHEX(TEST, *q - 200, 200); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n")); soap->error = SOAP_MOE; return; } if (p == (void*)(*q - *(size_t*)(*q + sizeof(void*)))) { *q = **(char***)q; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Freed data at %p\n", p)); SOAP_FREE(soap, p); return; } } soap_delete(soap, p); } else { register char *q; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free all soap_malloc() data\n")); while (soap->alist) { q = (char*)soap->alist; if (*(unsigned short*)(char*)(q - sizeof(unsigned short)) != (unsigned short)SOAP_CANARY) { #ifdef SOAP_MEM_DEBUG fprintf(stderr, "Data corruption in dynamic allocation (see logs)\n"); #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Data corruption:\n")); DBGHEX(TEST, q - 200, 200); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n")); soap->error = SOAP_MOE; return; } soap->alist = *(void**)q; q -= *(size_t*)(q + sizeof(void*)); SOAP_FREE(soap, q); } /* we must assume these were deallocated: */ soap->http_content = NULL; soap->action = NULL; soap->fault = NULL; soap->header = NULL; soap->userid = NULL; soap->passwd = NULL; soap->authrealm = NULL; #ifdef WITH_NTLM soap->ntlm_challenge = NULL; #endif #ifndef WITH_LEANER soap_clr_mime(soap); #endif } } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_delete(struct soap *soap, void *p) { register struct soap_clist **cp; if (soap_check_state(soap)) return; cp = &soap->clist; if (p) { while (*cp) { if (p == (*cp)->ptr) { register struct soap_clist *q = *cp; *cp = q->next; if (q->fdelete(q)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not dealloc data %p: deletion callback failed for object type %d\n", q->ptr, q->type)); #ifdef SOAP_MEM_DEBUG fprintf(stderr, "new(object type = %d) = %p not freed: deletion callback failed\n", q->type, q->ptr); #endif } SOAP_FREE(soap, q); return; } cp = &(*cp)->next; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not dealloc data %p: address not in list\n", p)); } else { while (*cp) { register struct soap_clist *q = *cp; *cp = q->next; if (q->fdelete(q)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not dealloc data %p: deletion callback failed for object type %d\n", q->ptr, q->type)); #ifdef SOAP_MEM_DEBUG fprintf(stderr, "new(object type = %d) = %p not freed: deletion callback failed\n", q->type, q->ptr); #endif } SOAP_FREE(soap, q); } } soap->fault = NULL; /* this was possibly deallocated */ soap->header = NULL; /* this was possibly deallocated */ } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_delegate_deletion(struct soap *soap, struct soap *soap_to) { register struct soap_clist *cp; register char **q; #ifdef SOAP_MEM_DEBUG register void *p; register struct soap_mlist **mp, *mq; size_t h; #endif for (q = (char**)&soap->alist; *q; q = *(char***)q) { if (*(unsigned short*)(char*)(*q - sizeof(unsigned short)) != (unsigned short)SOAP_CANARY) { #ifdef SOAP_MEM_DEBUG fprintf(stderr, "Data corruption in dynamic allocation (see logs)\n"); #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Data corruption:\n")); DBGHEX(TEST, *q - 200, 200); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n")); soap->error = SOAP_MOE; return; } #ifdef SOAP_MEM_DEBUG p = (void*)(*q - *(size_t*)(*q + sizeof(void*))); h = soap_hash_ptr(p); for (mp = &soap->mht[h]; *mp; mp = &(*mp)->next) { if ((*mp)->ptr == p) { mq = *mp; *mp = mq->next; mq->next = soap_to->mht[h]; soap_to->mht[h] = mq; break; } } #endif } *q = (char*)soap_to->alist; soap_to->alist = soap->alist; soap->alist = NULL; cp = soap_to->clist; if (cp) { while (cp->next) cp = cp->next; cp->next = soap->clist; } else soap_to->clist = soap->clist; soap->clist = NULL; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 struct soap_clist * SOAP_FMAC2 soap_link(struct soap *soap, void *p, int t, int n, int (*fdelete)(struct soap_clist*)) { register struct soap_clist *cp; if ((cp = (struct soap_clist*)SOAP_MALLOC(soap, sizeof(struct soap_clist)))) { cp->next = soap->clist; cp->type = t; cp->size = n; cp->ptr = p; cp->fdelete = fdelete; soap->clist = cp; } return cp; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_unlink(struct soap *soap, const void *p) { register char **q; register struct soap_clist **cp; if (soap && p) { for (q = (char**)&soap->alist; *q; q = *(char***)q) { if (p == (void*)(*q - *(size_t*)(*q + sizeof(void*)))) { *q = **(char***)q; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unlinked data %p\n", p)); #ifdef SOAP_MEM_DEBUG soap_track_unlink(soap, p); #endif return SOAP_OK; /* found and removed from dealloc chain */ } } for (cp = &soap->clist; *cp; cp = &(*cp)->next) { if (p == (*cp)->ptr) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unlinked class instance %p\n", p)); q = (char**)*cp; *cp = (*cp)->next; SOAP_FREE(soap, q); return SOAP_OK; /* found and removed from dealloc chain */ } } } return SOAP_ERR; } #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_lookup_type(struct soap *soap, const char *id) { register struct soap_ilist *ip; if (id && *id) { ip = soap_lookup(soap, id); if (ip) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Lookup id='%s' type=%d\n", id, ip->type)); return ip->type; } } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "lookup type id='%s' NOT FOUND! Need to get it from xsi:type\n", id)); return 0; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 void* SOAP_FMAC2 soap_id_lookup(struct soap *soap, const char *id, void **p, int t, size_t n, unsigned int k) { struct soap_ilist *ip; void **q; if (!p || !id || !*id) return p; ip = soap_lookup(soap, id); /* lookup pointer to hash table entry for string id */ if (!ip) { if (!(ip = soap_enter(soap, id))) /* new hash table entry for string id */ return NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forwarding first href='%s' type=%d %p (%u bytes)\n", id, t, p, (unsigned int)n)); ip->type = t; ip->size = n; ip->link = p; ip->copy = NULL; ip->flist = NULL; ip->ptr = NULL; ip->level = k; *p = NULL; } else if (ip->ptr) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolved href='%s' type=%d location=%p (%u bytes)\n", id, t, ip->ptr, (unsigned int)n)); if (ip->type != t) { strcpy(soap->id, id); soap->error = SOAP_HREF; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Type incompatibility: href='%s' id-type=%d href-type=%d\n", id, ip->type, t)); return NULL; } while (ip->level < k) { q = (void**)soap_malloc(soap, sizeof(void*)); if (!q) return NULL; *p = (void*)q; p = q; k--; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Descending one level...\n")); } *p = ip->ptr; } else if (ip->level > k) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolving level %u pointers to href='%s'\n", ip->level, id)); while (ip->level > k) { void *s, **r = &ip->link; q = (void**)ip->link; while (q) { *r = (void*)soap_malloc(soap, sizeof(void*)); if (!*r) return NULL; s = *q; *q = *r; r = (void**)*r; q = (void**)s; } *r = NULL; ip->size = n; ip->copy = NULL; ip->level = ip->level - 1; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Descending one level...\n")); } q = (void**)ip->link; ip->link = p; *p = (void*)q; } else { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forwarded href='%s' type=%d location=%p (%u bytes)\n", id, t, p, (unsigned int)n)); while (ip->level < k) { q = (void**)soap_malloc(soap, sizeof(void*)); if (!q) return NULL; *p = q; p = q; k--; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Descending one level...\n")); } q = (void**)ip->link; ip->link = p; *p = (void*)q; } return p; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 void* SOAP_FMAC2 soap_id_forward(struct soap *soap, const char *href, void *p, size_t len, int st, int tt, size_t n, unsigned int k, void (*fcopy)(struct soap*, int, int, void*, size_t, const void*, size_t)) { struct soap_ilist *ip; if (!p || !href || !*href) return p; ip = soap_lookup(soap, href); /* lookup pointer to hash table entry for string id */ if (!ip) { if (!(ip = soap_enter(soap, href))) /* new hash table entry for string id */ return NULL; ip->type = st; ip->size = n; ip->link = NULL; ip->copy = NULL; ip->ptr = NULL; ip->level = 0; ip->flist = NULL; DBGLOG(TEST,SOAP_MESSAGE(fdebug, "New entry href='%s' type=%d size=%lu level=%d location=%p\n", href, st, (unsigned long)n, k, p)); } else if (ip->type != st || (ip->level == k && ip->size != n)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Type incompatibility id='%s' expect type=%d size=%lu level=%u got type=%d size=%lu\n", href, ip->type, (unsigned long)ip->size, k, st, (unsigned long)n)); strcpy(soap->id, href); soap->error = SOAP_HREF; return NULL; } if (fcopy || n < sizeof(void*) || *href != '#') { register struct soap_flist *fp = (struct soap_flist*)SOAP_MALLOC(soap, sizeof(struct soap_flist)); if (!fp) { soap->error = SOAP_EOM; return NULL; } fp->next = ip->flist; fp->type = tt; fp->ptr = p; fp->level = k; fp->len = len; if (fcopy) fp->fcopy = fcopy; else fp->fcopy = soap_fcopy; ip->flist = fp; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forwarding type=%d (target type=%d) size=%lu location=%p level=%u len=%lu href='%s'\n", st, tt, (unsigned long)n, p, k, (unsigned long)len, href)); } else { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forwarding copying address %p for type=%d href='%s'\n", p, st, href)); *(void**)p = ip->copy; ip->copy = p; } return p; } #endif #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void* SOAP_FMAC2 soap_id_enter(struct soap *soap, const char *id, void *p, int t, size_t n, unsigned int k, const char *type, const char *arrayType, void *(*finstantiate)(struct soap*, int, const char*, const char*, size_t*)) { #ifndef WITH_NOIDREF struct soap_ilist *ip; #endif DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Enter id='%s' type=%d loc=%p size=%lu level=%u\n", id, t, p, (unsigned long)n, k)); soap->alloced = 0; if (!p) { if (finstantiate) p = finstantiate(soap, t, type, arrayType, &n); else p = soap_malloc(soap, n); if (p) soap->alloced = 1; } #ifndef WITH_NOIDREF if (!id || !*id) #endif return p; #ifndef WITH_NOIDREF ip = soap_lookup(soap, id); /* lookup pointer to hash table entry for string id */ DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Lookup entry id='%s for location=%p'\n", id, p)); if (!ip) { if (!(ip = soap_enter(soap, id))) /* new hash table entry for string id */ return NULL; ip->type = t; ip->link = NULL; ip->copy = NULL; ip->flist = NULL; ip->size = n; ip->ptr = p; ip->level = k; DBGLOG(TEST,SOAP_MESSAGE(fdebug, "New entry id='%s' type=%d size=%lu level=%u location=%p\n", id, t, (unsigned long)n, k, p)); } else if ((ip->type != t || (ip->level == k && ip->size != n)) && (ip->copy || ip->flist)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Type incompatibility id='%s' expect type=%d size=%lu level=%u got type=%d size=%lu\n", id, ip->type, (unsigned long)ip->size, k, t, (unsigned long)n)); strcpy(soap->id, id); soap->error = SOAP_HREF; return NULL; } else if (ip->ptr) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Multiply defined id='%s'\n", id)); strcpy(soap->id, id); soap->error = SOAP_DUPLICATE_ID; return NULL; } else { ip->size = n; ip->ptr = p; ip->level = k; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Update entry id='%s' type=%d location=%p size=%lu level=%u\n", id, t, p, (unsigned long)n, k)); } return ip->ptr; #endif } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_fcopy(struct soap *soap, int st, int tt, void *p, size_t len, const void *q, size_t n) { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Copying data type=%d (target type=%d) %p -> %p (%lu bytes)\n", st, tt, q, p, (unsigned long)n)); memcpy(p, q, n); (void)soap; (void)st; (void)tt; (void)len; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_end_send(struct soap *soap) { #ifndef WITH_LEANER int err; if (soap->dime.list) { /* SOAP body referenced attachments must appear first */ soap->dime.last->next = soap->dime.first; soap->dime.first = soap->dime.list->next; soap->dime.list->next = NULL; soap->dime.last = soap->dime.list; } if (!(err = soap_putdime(soap))) err = soap_putmime(soap); soap->mime.list = NULL; soap->mime.first = NULL; soap->mime.last = NULL; soap->dime.list = NULL; soap->dime.first = NULL; soap->dime.last = NULL; if (err) return err; #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End send mode=0x%x\n", soap->mode)); if (soap->mode & SOAP_IO) /* need to flush the remaining data in buffer */ { if (soap_flush(soap)) #ifdef WITH_ZLIB { if (soap->mode & SOAP_ENC_ZLIB && soap->zlib_state == SOAP_ZLIB_DEFLATE) { soap->zlib_state = SOAP_ZLIB_NONE; deflateEnd(soap->d_stream); } return soap->error; } #else return soap->error; #endif #ifdef WITH_ZLIB if (soap->mode & SOAP_ENC_ZLIB) { int r; soap->d_stream->avail_in = 0; do { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Deflating remainder\n")); r = deflate(soap->d_stream, Z_FINISH); if (soap->d_stream->avail_out != SOAP_BUFLEN) { if (soap_flush_raw(soap, soap->z_buf, SOAP_BUFLEN - soap->d_stream->avail_out)) { soap->zlib_state = SOAP_ZLIB_NONE; deflateEnd(soap->d_stream); return soap->error; } soap->d_stream->next_out = (Byte*)soap->z_buf; soap->d_stream->avail_out = SOAP_BUFLEN; } } while (r == Z_OK); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Deflated total %lu->%lu bytes\n", soap->d_stream->total_in, soap->d_stream->total_out)); soap->z_ratio_out = (float)soap->d_stream->total_out / (float)soap->d_stream->total_in; soap->mode &= ~SOAP_ENC_ZLIB; soap->zlib_state = SOAP_ZLIB_NONE; if (deflateEnd(soap->d_stream) != Z_OK || r != Z_STREAM_END) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unable to end deflate: %s\n", soap->d_stream->msg ? soap->d_stream->msg : SOAP_STR_EOS)); return soap->error = SOAP_ZLIB_ERROR; } #ifdef WITH_GZIP if (soap->zlib_out != SOAP_ZLIB_DEFLATE) { soap->z_buf[0] = soap->z_crc & 0xFF; soap->z_buf[1] = (soap->z_crc >> 8) & 0xFF; soap->z_buf[2] = (soap->z_crc >> 16) & 0xFF; soap->z_buf[3] = (soap->z_crc >> 24) & 0xFF; soap->z_buf[4] = soap->d_stream->total_in & 0xFF; soap->z_buf[5] = (soap->d_stream->total_in >> 8) & 0xFF; soap->z_buf[6] = (soap->d_stream->total_in >> 16) & 0xFF; soap->z_buf[7] = (soap->d_stream->total_in >> 24) & 0xFF; if (soap_flush_raw(soap, soap->z_buf, 8)) return soap->error; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "gzip crc32=%lu\n", (unsigned long)soap->z_crc)); } #endif } #endif if ((soap->mode & SOAP_IO) == SOAP_IO_STORE) { char *p; #ifndef WITH_NOHTTP if (!(soap->mode & SOAP_ENC_XML)) { soap->mode--; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Sending buffered message of length %u\n", (unsigned int)soap->blist->size)); if (soap->status >= SOAP_POST) soap->error = soap->fpost(soap, soap->endpoint, soap->host, soap->port, soap->path, soap->action, soap->blist->size); else if (soap->status != SOAP_STOP) soap->error = soap->fresponse(soap, soap->status, soap->blist->size); if (soap->error || soap_flush(soap)) return soap->error; soap->mode++; } #endif for (p = soap_first_block(soap, NULL); p; p = soap_next_block(soap, NULL)) { DBGMSG(SENT, p, soap_block_size(soap, NULL)); if ((soap->error = soap->fsend(soap, p, soap_block_size(soap, NULL)))) { soap_end_block(soap, NULL); return soap->error; } } soap_end_block(soap, NULL); } #ifndef WITH_LEANER else if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK) { DBGMSG(SENT, "\r\n0\r\n\r\n", 7); if ((soap->error = soap->fsend(soap, "\r\n0\r\n\r\n", 7))) return soap->error; } #endif } #ifdef WITH_TCPFIN #ifdef WITH_OPENSSL if (!soap->ssl && soap_valid_socket(soap->socket) && !soap->keep_alive && !(soap->omode & SOAP_IO_UDP)) soap->fshutdownsocket(soap, soap->socket, SOAP_SHUT_WR); /* Send TCP FIN */ #else if (soap_valid_socket(soap->socket) && !soap->keep_alive && !(soap->omode & SOAP_IO_UDP)) soap->fshutdownsocket(soap, soap->socket, SOAP_SHUT_WR); /* Send TCP FIN */ #endif #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of send phase\n")); soap->omode &= ~SOAP_SEC_WSUID; soap->count = 0; soap->part = SOAP_END; return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_end_recv(struct soap *soap) { soap->part = SOAP_END; #ifndef WITH_LEAN soap->wsuid = NULL; /* reset before next send */ soap->c14nexclude = NULL; /* reset before next send */ #endif #ifndef WITH_LEANER soap->ffilterrecv = NULL; if ((soap->mode & SOAP_ENC_DIME) && soap_getdime(soap)) { soap->dime.first = NULL; soap->dime.last = NULL; return soap->error; } soap->dime.list = soap->dime.first; soap->dime.first = NULL; soap->dime.last = NULL; /* Check if MIME attachments and mime-post-check flag is set, if so call soap_resolve() and return */ if (soap->mode & SOAP_ENC_MIME) { if (soap->mode & SOAP_MIME_POSTCHECK) { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Post checking MIME attachments\n")); if (!soap->keep_alive) soap->keep_alive = -1; #ifndef WITH_NOIDREF soap_resolve(soap); #endif return SOAP_OK; } if (soap_getmime(soap)) return soap->error; } soap->mime.list = soap->mime.first; soap->mime.first = NULL; soap->mime.last = NULL; soap->mime.boundary = NULL; if (soap->xlist) { struct soap_multipart *content; for (content = soap->mime.list; content; content = content->next) soap_resolve_attachment(soap, content); } #endif DBGLOG(TEST,SOAP_MESSAGE(fdebug, "End of receive message ok\n")); #ifdef WITH_ZLIB if (soap->mode & SOAP_ENC_ZLIB) { /* Make sure end of compressed content is reached */ while (soap->d_stream->next_out != Z_NULL) if ((int)soap_get1(soap) == EOF) break; soap->mode &= ~SOAP_ENC_ZLIB; memcpy(soap->buf, soap->z_buf, SOAP_BUFLEN); soap->bufidx = (char*)soap->d_stream->next_in - soap->z_buf; soap->buflen = soap->z_buflen; soap->zlib_state = SOAP_ZLIB_NONE; if (inflateEnd(soap->d_stream) != Z_OK) return soap->error = SOAP_ZLIB_ERROR; DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Inflate end ok\n")); #ifdef WITH_GZIP if (soap->zlib_in == SOAP_ZLIB_GZIP) { soap_wchar c; short i; DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Inflate gzip crc check\n")); for (i = 0; i < 8; i++) { if ((int)(c = soap_get1(soap)) == EOF) { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Gzip error: unable to read crc value\n")); return soap->error = SOAP_ZLIB_ERROR; } soap->z_buf[i] = (char)c; } if (soap->z_crc != ((uLong)(unsigned char)soap->z_buf[0] | ((uLong)(unsigned char)soap->z_buf[1] << 8) | ((uLong)(unsigned char)soap->z_buf[2] << 16) | ((uLong)(unsigned char)soap->z_buf[3] << 24))) { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Gzip inflate error: crc check failed, message corrupted? (crc32=%lu)\n", (unsigned long)soap->z_crc)); return soap->error = SOAP_ZLIB_ERROR; } if (soap->d_stream->total_out != ((uLong)(unsigned char)soap->z_buf[4] | ((uLong)(unsigned char)soap->z_buf[5] << 8) | ((uLong)(unsigned char)soap->z_buf[6] << 16) | ((uLong)(unsigned char)soap->z_buf[7] << 24))) { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Gzip inflate error: incorrect message length\n")); return soap->error = SOAP_ZLIB_ERROR; } } soap->zlib_in = SOAP_ZLIB_NONE; #endif } #endif if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK) while (soap->ahead != EOF && !soap_recv_raw(soap)) ; #ifndef WITH_NOIDREF if (soap_resolve(soap)) return soap->error; #endif #ifndef WITH_LEANER if (soap->xlist) { if (soap->mode & SOAP_ENC_MTOM) return soap->error = SOAP_MIME_HREF; return soap->error = SOAP_DIME_HREF; } #endif soap_free_ns(soap); #ifndef WITH_LEANER if (soap->fpreparefinalrecv) return soap->error = soap->fpreparefinalrecv(soap); #endif return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_free_temp(struct soap *soap) { register struct soap_attribute *tp, *tq; register struct Namespace *ns; soap_free_ns(soap); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free any remaining temp blocks\n")); while (soap->blist) soap_end_block(soap, NULL); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free attribute storage\n")); for (tp = soap->attributes; tp; tp = tq) { tq = tp->next; if (tp->value) SOAP_FREE(soap, tp->value); SOAP_FREE(soap, tp); } soap->attributes = NULL; #ifdef WITH_FAST if (soap->labbuf) SOAP_FREE(soap, soap->labbuf); soap->labbuf = NULL; soap->lablen = 0; soap->labidx = 0; #endif ns = soap->local_namespaces; if (ns) { for (; ns->id; ns++) { if (ns->out) { if (soap->encodingStyle == ns->out) soap->encodingStyle = SOAP_STR_EOS; SOAP_FREE(soap, ns->out); ns->out = NULL; } if (soap->encodingStyle == ns->ns) soap->encodingStyle = SOAP_STR_EOS; } SOAP_FREE(soap, soap->local_namespaces); soap->local_namespaces = NULL; } #ifndef WITH_LEANER while (soap->xlist) { struct soap_xlist *xp = soap->xlist->next; SOAP_FREE(soap, soap->xlist); soap->xlist = xp; } #endif #ifndef WITH_NOIDREF soap_free_pht(soap); soap_free_iht(soap); #endif } #endif /******************************************************************************/ #ifndef PALM_1 static void soap_free_ns(struct soap *soap) { register struct soap_nlist *np, *nq; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free namespace stack\n")); for (np = soap->nlist; np; np = nq) { nq = np->next; SOAP_FREE(soap, np); } soap->nlist = NULL; } #endif /******************************************************************************/ #ifndef PALM_1 #if !defined(WITH_LEAN) || defined(SOAP_DEBUG) static void soap_init_logs(struct soap *soap) { int i; for (i = 0; i < SOAP_MAXLOGS; i++) { soap->logfile[i] = NULL; soap->fdebug[i] = NULL; } } #endif #endif /******************************************************************************/ #if !defined(WITH_LEAN) || defined(SOAP_DEBUG) SOAP_FMAC1 void SOAP_FMAC2 soap_open_logfile(struct soap *soap, int i) { if (soap->logfile[i]) soap->fdebug[i] = fopen(soap->logfile[i], i < 2 ? "ab" : "a"); } #endif /******************************************************************************/ #ifdef SOAP_DEBUG static void soap_close_logfile(struct soap *soap, int i) { if (soap->fdebug[i]) { fclose(soap->fdebug[i]); soap->fdebug[i] = NULL; } } #endif /******************************************************************************/ #ifdef SOAP_DEBUG SOAP_FMAC1 void SOAP_FMAC2 soap_close_logfiles(struct soap *soap) { int i; for (i = 0; i < SOAP_MAXLOGS; i++) soap_close_logfile(soap, i); } #endif /******************************************************************************/ #ifdef SOAP_DEBUG static void soap_set_logfile(struct soap *soap, int i, const char *logfile) { const char *s; char *t = NULL; soap_close_logfile(soap, i); s = soap->logfile[i]; soap->logfile[i] = logfile; if (s) SOAP_FREE(soap, (void*)s); if (logfile) if ((t = (char*)SOAP_MALLOC(soap, strlen(logfile) + 1))) strcpy(t, logfile); soap->logfile[i] = t; } #endif /******************************************************************************/ #ifdef SOAP_DEBUG SOAP_FMAC1 void SOAP_FMAC2 soap_set_recv_logfile(struct soap *soap, const char *logfile) { soap_set_logfile(soap, SOAP_INDEX_RECV, logfile); } #endif /******************************************************************************/ #ifdef SOAP_DEBUG SOAP_FMAC1 void SOAP_FMAC2 soap_set_sent_logfile(struct soap *soap, const char *logfile) { soap_set_logfile(soap, SOAP_INDEX_SENT, logfile); } #endif /******************************************************************************/ #ifdef SOAP_DEBUG SOAP_FMAC1 void SOAP_FMAC2 soap_set_test_logfile(struct soap *soap, const char *logfile) { soap_set_logfile(soap, SOAP_INDEX_TEST, logfile); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 struct soap* SOAP_FMAC2 soap_copy(const struct soap *soap) { return soap_copy_context((struct soap*)malloc(sizeof(struct soap)), soap); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 struct soap* SOAP_FMAC2 soap_copy_context(struct soap *copy, const struct soap *soap) { if (copy == soap) return copy; if (soap_check_state(soap)) return NULL; if (copy) { register struct soap_plugin *p = NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copying context\n")); #ifdef __cplusplus *copy = *soap; #else memcpy(copy, soap, sizeof(struct soap)); #endif copy->state = SOAP_COPY; copy->error = SOAP_OK; copy->userid = NULL; copy->passwd = NULL; #ifdef WITH_NTLM copy->ntlm_challenge = NULL; #endif copy->nlist = NULL; copy->blist = NULL; copy->clist = NULL; copy->alist = NULL; copy->attributes = NULL; copy->labbuf = NULL; copy->lablen = 0; copy->labidx = 0; #ifdef SOAP_MEM_DEBUG soap_init_mht(copy); #endif #if !defined(WITH_LEAN) || defined(SOAP_DEBUG) soap_init_logs(copy); #endif #ifdef SOAP_DEBUG soap_set_test_logfile(copy, soap->logfile[SOAP_INDEX_TEST]); soap_set_sent_logfile(copy, soap->logfile[SOAP_INDEX_SENT]); soap_set_recv_logfile(copy, soap->logfile[SOAP_INDEX_RECV]); #endif copy->namespaces = NULL; copy->local_namespaces = NULL; if (soap->local_namespaces) soap_set_namespaces(copy, soap->local_namespaces); else soap_set_namespaces(copy, soap->namespaces); #ifdef WITH_C_LOCALE # ifdef WIN32 copy->c_locale = _create_locale(LC_ALL, "C"); # else copy->c_locale = duplocale(soap->c_locale); # endif #else copy->c_locale = NULL; #endif #ifdef WITH_OPENSSL copy->bio = NULL; copy->ssl = NULL; copy->session = NULL; #endif #ifdef WITH_GNUTLS copy->session = NULL; #endif #ifdef WITH_ZLIB copy->d_stream = (z_stream*)SOAP_MALLOC(copy, sizeof(z_stream)); copy->d_stream->zalloc = Z_NULL; copy->d_stream->zfree = Z_NULL; copy->d_stream->opaque = Z_NULL; copy->z_buf = NULL; #endif #ifndef WITH_NOIDREF soap_init_iht(copy); soap_init_pht(copy); #endif copy->header = NULL; copy->fault = NULL; copy->action = NULL; #ifndef WITH_LEAN #ifdef WITH_COOKIES copy->cookies = soap_copy_cookies(copy, soap); #else copy->cookies = NULL; #endif #endif copy->plugins = NULL; for (p = soap->plugins; p; p = p->next) { register struct soap_plugin *q = (struct soap_plugin*)SOAP_MALLOC(copy, sizeof(struct soap_plugin)); if (!q) return NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copying plugin '%s'\n", p->id)); *q = *p; if (p->fcopy && p->fcopy(copy, q, p)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not copy plugin '%s'\n", p->id)); SOAP_FREE(copy, q); return NULL; } q->next = copy->plugins; copy->plugins = q; } } return copy; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_copy_stream(struct soap *copy, struct soap *soap) { struct soap_attribute *tp = NULL, *tq; if (copy == soap) return; copy->mode = soap->mode; copy->imode = soap->imode; copy->omode = soap->omode; copy->socket = soap->socket; copy->recv_timeout = soap->recv_timeout; copy->send_timeout = soap->send_timeout; #if defined(__cplusplus) && !defined(WITH_LEAN) copy->os = soap->os; copy->is = soap->is; #endif copy->sendfd = soap->sendfd; copy->recvfd = soap->recvfd; copy->bufidx = soap->bufidx; copy->buflen = soap->buflen; copy->ahead = soap->ahead; copy->cdata = soap->cdata; copy->chunksize = soap->chunksize; copy->chunkbuflen = soap->chunkbuflen; copy->keep_alive = soap->keep_alive; copy->tcp_keep_alive = soap->tcp_keep_alive; copy->tcp_keep_idle = soap->tcp_keep_idle; copy->tcp_keep_intvl = soap->tcp_keep_intvl; copy->tcp_keep_cnt = soap->tcp_keep_cnt; copy->max_keep_alive = soap->max_keep_alive; #ifndef WITH_NOIO copy->peer = soap->peer; copy->peerlen = soap->peerlen; copy->ip = soap->ip; copy->port = soap->port; memcpy(copy->host, soap->host, sizeof(soap->host)); memcpy(copy->endpoint, soap->endpoint, sizeof(soap->endpoint)); #endif #ifdef WITH_OPENSSL copy->bio = NULL; if (soap->state == SOAP_COPY) copy->ctx = soap->ctx; else copy->ctx = NULL; if (soap->ssl) copy->ssl = SSL_dup(soap->ssl); else copy->ssl = NULL; #endif #ifdef WITH_GNUTLS copy->session = soap->session; /* TODO: Oops, GNUTLS provides a dup? */ #endif #ifdef WITH_ZLIB copy->zlib_state = soap->zlib_state; copy->zlib_in = soap->zlib_in; copy->zlib_out = soap->zlib_out; if (!copy->d_stream) copy->d_stream = (z_stream*)SOAP_MALLOC(copy, sizeof(z_stream)); if (copy->d_stream) memcpy(copy->d_stream, soap->d_stream, sizeof(z_stream)); copy->z_crc = soap->z_crc; copy->z_ratio_in = soap->z_ratio_in; copy->z_ratio_out = soap->z_ratio_out; copy->z_buf = NULL; copy->z_buflen = soap->z_buflen; copy->z_level = soap->z_level; if (soap->z_buf && soap->zlib_state != SOAP_ZLIB_NONE) { copy->z_buf = (char*)SOAP_MALLOC(copy, SOAP_BUFLEN); if (copy->z_buf) memcpy(copy->z_buf, soap->z_buf, SOAP_BUFLEN); } copy->z_dict = soap->z_dict; copy->z_dict_len = soap->z_dict_len; #endif memcpy(copy->buf, soap->buf, sizeof(soap->buf)); /* copy XML parser state */ soap_free_ns(copy); soap_set_local_namespaces(copy); if (soap->nlist && soap->local_namespaces) { register struct soap_nlist *np = NULL, *nq; /* copy reversed nlist */ for (nq = soap->nlist; nq; nq = nq->next) { register struct soap_nlist *nr = np; size_t n = sizeof(struct soap_nlist) + strlen(nq->id); np = (struct soap_nlist*)SOAP_MALLOC(copy, n); if (!np) break; memcpy(np, nq, n); np->next = nr; } while (np) { register const char *s = np->ns; copy->level = np->level; /* preserve element nesting level */ if (!s && np->index >= 0) { s = soap->local_namespaces[np->index].out; if (!s) s = soap->local_namespaces[np->index].ns; } if (s && soap_push_namespace(copy, np->id, s) == NULL) break; nq = np; np = np->next; SOAP_FREE(copy, nq); } } strcpy(copy->id, soap->id); strcpy(copy->href, soap->href); strcpy(copy->type, soap->type); copy->other = soap->other; copy->root = soap->root; copy->null = soap->null; copy->body = soap->body; copy->part = soap->part; copy->mustUnderstand = soap->mustUnderstand; copy->level = soap->level; copy->peeked = soap->peeked; memcpy(copy->tag, soap->tag, sizeof(copy->tag)); /* copy attributes */ for (tq = soap->attributes; tq; tq = tq->next) { struct soap_attribute *tr = tp; size_t n = sizeof(struct soap_attribute) + strlen(tq->name); tp = (struct soap_attribute*)SOAP_MALLOC(copy, n); memcpy(tp, tq, n); if (tp->size) { tp->value = (char*)SOAP_MALLOC(copy, tp->size); if (tp->value) strcpy(tp->value, tq->value); } tp->ns = NULL; tp->next = tr; } copy->attributes = tp; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_free_stream(struct soap *soap) { soap->socket = SOAP_INVALID_SOCKET; #ifdef WITH_OPENSSL soap->bio = NULL; if (soap->ssl) SSL_free(soap->ssl); soap->ssl = NULL; #endif #ifdef WITH_GNUTLS soap->xcred = NULL; soap->acred = NULL; soap->cache = NULL; soap->session = NULL; /* TODO: GNUTLS free here when dupped */ soap->dh_params = NULL; soap->rsa_params = NULL; #endif #ifdef WITH_ZLIB if (soap->z_buf) SOAP_FREE(soap, soap->z_buf); soap->z_buf = NULL; #endif } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_versioning(soap_init)(struct soap *soap, soap_mode imode, soap_mode omode) { size_t i; soap->state = SOAP_INIT; #ifdef SOAP_MEM_DEBUG soap_init_mht(soap); #endif #if !defined(WITH_LEAN) || defined(SOAP_DEBUG) soap_init_logs(soap); #endif #ifdef SOAP_DEBUG #ifdef TANDEM_NONSTOP soap_set_test_logfile(soap, "TESTLOG"); soap_set_sent_logfile(soap, "SENTLOG"); soap_set_recv_logfile(soap, "RECVLOG"); #else soap_set_test_logfile(soap, "TEST.log"); soap_set_sent_logfile(soap, "SENT.log"); soap_set_recv_logfile(soap, "RECV.log"); #endif #endif soap->version = 0; soap_mode(soap, imode); soap_imode(soap, imode); soap_omode(soap, omode); soap->plugins = NULL; soap->user = NULL; for (i = 0; i < sizeof(soap->data)/sizeof(*soap->data); i++) soap->data[i] = NULL; soap->userid = NULL; soap->passwd = NULL; soap->authrealm = NULL; #ifdef WITH_NTLM soap->ntlm_challenge = NULL; #endif #ifndef WITH_NOHTTP soap->fpost = http_post; soap->fget = http_get; soap->fput = http_405; soap->fdel = http_405; soap->fopt = http_200; soap->fhead = http_200; soap->fform = NULL; soap->fposthdr = http_post_header; soap->fresponse = http_response; soap->fparse = http_parse; soap->fparsehdr = http_parse_header; #endif soap->fheader = NULL; soap->fconnect = NULL; soap->fdisconnect = NULL; #ifndef WITH_NOIO soap->ipv6_multicast_if = 0; soap->ipv4_multicast_if = NULL; soap->ipv4_multicast_ttl = 0; /* 0: use default */ #ifndef WITH_IPV6 soap->fresolve = tcp_gethost; #else soap->fresolve = NULL; #endif soap->faccept = tcp_accept; soap->fopen = tcp_connect; soap->fclose = tcp_disconnect; soap->fclosesocket = tcp_closesocket; soap->fshutdownsocket = tcp_shutdownsocket; soap->fsend = fsend; soap->frecv = frecv; soap->fpoll = soap_poll; #else soap->fopen = NULL; soap->fclose = NULL; soap->fpoll = NULL; #endif soap->fseterror = NULL; soap->fignore = NULL; soap->fserveloop = NULL; soap->fplugin = fplugin; soap->fmalloc = NULL; #ifndef WITH_LEANER soap->feltbegin = NULL; soap->feltendin = NULL; soap->feltbegout = NULL; soap->feltendout = NULL; soap->fprepareinitsend = NULL; soap->fprepareinitrecv = NULL; soap->fpreparesend = NULL; soap->fpreparerecv = NULL; soap->fpreparefinalsend = NULL; soap->fpreparefinalrecv = NULL; soap->ffiltersend = NULL; soap->ffilterrecv = NULL; soap->fdimereadopen = NULL; soap->fdimewriteopen = NULL; soap->fdimereadclose = NULL; soap->fdimewriteclose = NULL; soap->fdimeread = NULL; soap->fdimewrite = NULL; soap->fmimereadopen = NULL; soap->fmimewriteopen = NULL; soap->fmimereadclose = NULL; soap->fmimewriteclose = NULL; soap->fmimeread = NULL; soap->fmimewrite = NULL; #endif soap->float_format = "%.9G"; /* Alternative: use "%G" */ soap->double_format = "%.17lG"; /* Alternative: use "%lG" */ soap->dime_id_format = "cid:id%d"; /* default DIME id format */ soap->http_version = "1.1"; soap->proxy_http_version = "1.0"; soap->http_content = NULL; soap->actor = NULL; soap->lang = "en"; soap->keep_alive = 0; soap->tcp_keep_alive = 0; soap->tcp_keep_idle = 0; soap->tcp_keep_intvl = 0; soap->tcp_keep_cnt = 0; soap->max_keep_alive = SOAP_MAXKEEPALIVE; soap->recv_timeout = 0; soap->send_timeout = 0; soap->connect_timeout = 0; soap->accept_timeout = 0; soap->socket_flags = 0; soap->connect_flags = 0; soap->bind_flags = 0; soap->accept_flags = 0; soap->linger_time = 0; soap->ip = 0; soap->labbuf = NULL; soap->lablen = 0; soap->labidx = 0; soap->encodingStyle = SOAP_STR_EOS; #ifndef WITH_NONAMESPACES soap->namespaces = namespaces; #else soap->namespaces = NULL; #endif soap->local_namespaces = NULL; soap->nlist = NULL; soap->blist = NULL; soap->clist = NULL; soap->alist = NULL; soap->attributes = NULL; soap->header = NULL; soap->fault = NULL; soap->master = SOAP_INVALID_SOCKET; soap->socket = SOAP_INVALID_SOCKET; soap->os = NULL; soap->is = NULL; #ifndef WITH_LEANER soap->dom = NULL; soap->dime.list = NULL; soap->dime.first = NULL; soap->dime.last = NULL; soap->mime.list = NULL; soap->mime.first = NULL; soap->mime.last = NULL; soap->mime.boundary = NULL; soap->mime.start = NULL; soap->xlist = NULL; #endif #ifndef UNDER_CE soap->recvfd = 0; soap->sendfd = 1; #else soap->recvfd = stdin; soap->sendfd = stdout; #endif soap->host[0] = '\0'; soap->port = 0; soap->action = NULL; soap->proxy_host = NULL; soap->proxy_port = 8080; soap->proxy_userid = NULL; soap->proxy_passwd = NULL; soap->prolog = NULL; #ifdef WITH_ZLIB soap->zlib_state = SOAP_ZLIB_NONE; soap->zlib_in = SOAP_ZLIB_NONE; soap->zlib_out = SOAP_ZLIB_NONE; soap->d_stream = (z_stream*)SOAP_MALLOC(soap, sizeof(z_stream)); soap->d_stream->zalloc = Z_NULL; soap->d_stream->zfree = Z_NULL; soap->d_stream->opaque = Z_NULL; soap->z_buf = NULL; soap->z_level = 6; soap->z_dict = NULL; soap->z_dict_len = 0; #endif #ifndef WITH_LEAN soap->wsuid = NULL; soap->c14nexclude = NULL; soap->cookies = NULL; soap->cookie_domain = NULL; soap->cookie_path = NULL; soap->cookie_max = 32; #endif #ifdef WMW_RPM_IO soap->rpmreqid = NULL; #endif #ifdef PALM palmNetLibOpen(); #endif #ifndef WITH_NOIDREF soap_init_iht(soap); soap_init_pht(soap); #endif #ifdef WITH_OPENSSL if (!soap_ssl_init_done) soap_ssl_init(); soap->fsslauth = ssl_auth_init; soap->fsslverify = ssl_verify_callback; soap->bio = NULL; soap->ssl = NULL; soap->ctx = NULL; soap->session = NULL; soap->ssl_flags = SOAP_SSL_DEFAULT; soap->keyfile = NULL; soap->password = NULL; soap->cafile = NULL; soap->capath = NULL; soap->crlfile = NULL; soap->dhfile = NULL; soap->randfile = NULL; #endif #ifdef WITH_GNUTLS if (!soap_ssl_init_done) soap_ssl_init(); soap->fsslauth = ssl_auth_init; soap->fsslverify = NULL; soap->xcred = NULL; soap->acred = NULL; soap->cache = NULL; soap->session = NULL; soap->ssl_flags = SOAP_SSL_DEFAULT; soap->keyfile = NULL; soap->password = NULL; soap->cafile = NULL; soap->capath = NULL; soap->crlfile = NULL; soap->dh_params = NULL; soap->rsa_params = NULL; #endif #ifdef WITH_C_LOCALE # ifdef WIN32 soap->c_locale = _create_locale(LC_ALL, "C"); # else soap->c_locale = newlocale(LC_ALL_MASK, "C", NULL); # endif #else soap->c_locale = NULL; #endif soap->buflen = 0; soap->bufidx = 0; #ifndef WITH_LEANER soap->dime.chunksize = 0; soap->dime.buflen = 0; #endif soap->null = 0; soap->position = 0; soap->encoding = 0; soap->mustUnderstand = 0; soap->ns = 0; soap->part = SOAP_END; soap->event = 0; soap->evlev = 0; soap->alloced = 0; soap->count = 0; soap->length = 0; soap->cdata = 0; soap->peeked = 0; soap->ahead = 0; soap->idnum = 0; soap->level = 0; soap->endpoint[0] = '\0'; soap->error = SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_begin(struct soap *soap) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Reinitializing context\n")); if (!soap->keep_alive) { soap->buflen = 0; soap->bufidx = 0; } soap->keep_alive = (((soap->imode | soap->omode) & SOAP_IO_KEEPALIVE) != 0); soap->null = 0; soap->position = 0; soap->encoding = 0; soap->mustUnderstand = 0; soap->mode = 0; soap->ns = 0; soap->part = SOAP_END; soap->event = 0; soap->evlev = 0; soap->alloced = 0; soap->count = 0; soap->length = 0; soap->cdata = 0; soap->error = SOAP_OK; soap->peeked = 0; soap->ahead = 0; soap->idnum = 0; soap->level = 0; soap->endpoint[0] = '\0'; #ifndef WITH_LEANER soap->dime.chunksize = 0; soap->dime.buflen = 0; #endif soap_free_temp(soap); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_end(struct soap *soap) { if (soap_check_state(soap)) return; soap_free_temp(soap); soap_dealloc(soap, NULL); while (soap->clist) { register struct soap_clist *cp = soap->clist->next; SOAP_FREE(soap, soap->clist); soap->clist = cp; } soap_closesock(soap); #ifdef SOAP_DEBUG soap_close_logfiles(soap); #endif #ifdef PALM palmNetLibClose(); #endif } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_set_namespaces(struct soap *soap, const struct Namespace *p) { register struct Namespace *ns = soap->local_namespaces; register struct soap_nlist *np, *nq, *nr; register unsigned int level = soap->level; soap->namespaces = p; soap->local_namespaces = NULL; soap_set_local_namespaces(soap); /* reverse the namespace list */ np = soap->nlist; soap->nlist = NULL; if (np) { nq = np->next; np->next = NULL; while (nq) { nr = nq->next; nq->next = np; np = nq; nq = nr; } } /* then push on new stack */ while (np) { register const char *s; soap->level = np->level; /* preserve element nesting level */ s = np->ns; if (!s && np->index >= 0 && ns) { s = ns[np->index].out; if (!s) s = ns[np->index].ns; } if (s && soap_push_namespace(soap, np->id, s) == NULL) return soap->error; nq = np; np = np->next; SOAP_FREE(soap, nq); } if (ns) { register int i; for (i = 0; ns[i].id; i++) { if (ns[i].out) { SOAP_FREE(soap, ns[i].out); ns[i].out = NULL; } } SOAP_FREE(soap, ns); } soap->level = level; /* restore level */ return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_set_local_namespaces(struct soap *soap) { if (soap->namespaces && !soap->local_namespaces) { register const struct Namespace *ns1; register struct Namespace *ns2; register size_t n = 1; for (ns1 = soap->namespaces; ns1->id; ns1++) n++; n *= sizeof(struct Namespace); ns2 = (struct Namespace*)SOAP_MALLOC(soap, n); if (ns2) { memcpy(ns2, soap->namespaces, n); if (ns2[0].ns) { if (!strcmp(ns2[0].ns, soap_env1)) soap->version = 1; else soap->version = 2; } soap->local_namespaces = ns2; for (; ns2->id; ns2++) ns2->out = NULL; } } } #endif /******************************************************************************/ #ifndef WITH_LEAN #ifndef PALM_1 SOAP_FMAC1 const char * SOAP_FMAC2 soap_tagsearch(const char *big, const char *little) { if (little) { register size_t n = strlen(little); register const char *s = big; while (s) { register const char *t = s; register size_t i; for (i = 0; i < n; i++, t++) { if (*t != little[i]) break; } if (*t == '\0' || *t == ' ') { if (i == n || (i && little[i-1] == ':')) return s; } s = strchr(t, ' '); if (s) s++; } } return NULL; } #endif #endif /******************************************************************************/ #ifndef WITH_LEAN #ifndef PALM_1 SOAP_FMAC1 struct soap_nlist * SOAP_FMAC2 soap_lookup_ns(struct soap *soap, const char *tag, size_t n) { register struct soap_nlist *np; for (np = soap->nlist; np; np = np->next) { if (!strncmp(np->id, tag, n) && !np->id[n]) return np; } return NULL; } #endif #endif /******************************************************************************/ #ifndef WITH_LEAN static struct soap_nlist * soap_push_ns(struct soap *soap, const char *id, const char *ns, short utilized) { register struct soap_nlist *np; size_t n, k; if (soap_tagsearch(soap->c14nexclude, id)) return NULL; if (!utilized) { for (np = soap->nlist; np; np = np->next) { if (!strcmp(np->id, id) && (!np->ns || !strcmp(np->ns, ns))) break; } if (np) { if ((np->level < soap->level || !np->ns) && np->index == 1) utilized = 1; else return NULL; } } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Adding namespace binding (level=%u) '%s' '%s' utilized=%d\n", soap->level, id, ns ? ns : "(null)", utilized)); n = strlen(id); if (ns) k = strlen(ns); else k = 0; np = (struct soap_nlist*)SOAP_MALLOC(soap, sizeof(struct soap_nlist) + n + k + 1); if (!np) { soap->error = SOAP_EOM; return NULL; } np->next = soap->nlist; soap->nlist = np; strcpy((char*)np->id, id); if (ns) np->ns = strcpy((char*)np->id + n + 1, ns); else np->ns = NULL; np->level = soap->level; np->index = utilized; return np; } #endif /******************************************************************************/ #ifndef WITH_LEAN static void soap_utilize_ns(struct soap *soap, const char *tag) { register struct soap_nlist *np; size_t n = 0; const char *t = strchr(tag, ':'); if (t) n = t - tag; np = soap_lookup_ns(soap, tag, n); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Utilizing namespace of '%s'\n", tag)); if (np) { if (np->index == 0) soap_push_ns(soap, np->id, np->ns, 1); } else if (strncmp(tag, "xml", 3)) { strncpy(soap->tmpbuf, tag, n); soap->tmpbuf[n] = '\0'; soap_push_ns(soap, soap->tmpbuf, NULL, 1); } } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_element(struct soap *soap, const char *tag, int id, const char *type) { #ifndef WITH_LEAN register const char *s; #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element begin tag='%s' level='%u' id='%d' type='%s'\n", tag, soap->level, id, type ? type : SOAP_STR_EOS)); soap->level++; #ifdef WITH_DOM #ifndef WITH_LEAN if (soap->wsuid && soap_tagsearch(soap->wsuid, tag)) { size_t i; for (s = tag, i = 0; *s && i < sizeof(soap->tag) - 1; s++, i++) soap->tag[i] = *s == ':' ? '-' : *s; soap->tag[i] = '\0'; if (soap_set_attr(soap, "wsu:Id", soap->tag, 1)) return soap->error; } if ((soap->mode & SOAP_XML_CANONICAL) && !(soap->mode & SOAP_DOM_ASIS)) { if (soap->evlev >= soap->level) soap->evlev = 0; if (soap->event == SOAP_SEC_BEGIN && !soap->evlev) { register struct soap_nlist *np; /* non-nested wsu:Id found: clear xmlns, re-emit them for exc-c14n */ for (np = soap->nlist; np; np = np->next) { if (np->index == 2) { struct soap_nlist *np1 = soap_push_ns(soap, np->id, np->ns, 1); if (np1) np1->index = 0; } } soap->evlev = soap->level; } } #endif if (soap->mode & SOAP_XML_DOM) { register struct soap_dom_element *elt = (struct soap_dom_element*)soap_malloc(soap, sizeof(struct soap_dom_element)); if (!elt) return soap->error; elt->soap = soap; elt->next = NULL; elt->prnt = soap->dom; elt->name = soap_strdup(soap, tag); elt->elts = NULL; elt->atts = NULL; elt->nstr = NULL; elt->data = NULL; elt->wide = NULL; elt->node = NULL; elt->type = 0; elt->head = NULL; elt->tail = NULL; if (soap->dom) { struct soap_dom_element *p = soap->dom->elts; if (p) { while (p->next) p = p->next; p->next = elt; } else soap->dom->elts = elt; } soap->dom = elt; } else { #endif #ifndef WITH_LEAN if (!soap->ns) { if (!(soap->mode & SOAP_XML_CANONICAL) && soap_send(soap, soap->prolog ? soap->prolog : "\n")) return soap->error; } else if (soap->mode & SOAP_XML_INDENT) { if (soap->ns == 1 && soap_send_raw(soap, soap_indent, soap->level < sizeof(soap_indent) ? soap->level : sizeof(soap_indent) - 1)) return soap->error; soap->body = 1; } if ((soap->mode & SOAP_XML_DEFAULTNS) && (s = strchr(tag, ':'))) { struct Namespace *ns = soap->local_namespaces; size_t n = s - tag; if (soap_send_raw(soap, "<", 1) || soap_send(soap, s + 1)) return soap->error; if (soap->nlist && !strncmp(soap->nlist->id, tag, n) && !soap->nlist->id[n]) ns = NULL; for (; ns && ns->id; ns++) { if (*ns->id && (ns->out || ns->ns) && !strncmp(ns->id, tag, n) && !ns->id[n]) { soap_push_ns(soap, ns->id, ns->out ? ns->out : ns->ns, 0); if (soap_attribute(soap, "xmlns", ns->out ? ns->out : ns->ns)) return soap->error; break; } } } else #endif if (soap_send_raw(soap, "<", 1) || soap_send(soap, tag)) return soap->error; #ifdef WITH_DOM } #endif if (!soap->ns) { struct Namespace *ns; int k = -1; #ifndef WITH_LEAN if ((soap->mode & SOAP_XML_DEFAULTNS)) k = 4; /* only produce the first four required entries */ #endif for (ns = soap->local_namespaces; ns && ns->id && k; ns++, k--) { if (*ns->id && (ns->out || ns->ns)) { sprintf(soap->tmpbuf, "xmlns:%s", ns->id); if (soap_attribute(soap, soap->tmpbuf, ns->out ? ns->out : ns->ns)) return soap->error; } } } soap->ns = 1; /* namespace table control: ns = 0 or 2 to start, then 1 to stop dumping the table */ #ifndef WITH_LEAN if (soap->mode & SOAP_XML_CANONICAL) soap_utilize_ns(soap, tag); #endif if (id > 0) { sprintf(soap->tmpbuf, "_%d", id); if (soap_attribute(soap, "id", soap->tmpbuf)) return soap->error; } if (type && *type && !(soap->mode & SOAP_XML_NOTYPE) && soap->part != SOAP_IN_HEADER) { const char *t = type; #ifndef WITH_LEAN if (soap->mode & SOAP_XML_DEFAULTNS) { t = strchr(type, ':'); if (t) t++; else t = type; } #endif if (soap->attributes ? soap_set_attr(soap, "xsi:type", t, 1) : soap_attribute(soap, "xsi:type", t)) return soap->error; #ifndef WITH_LEAN if (soap->mode & SOAP_XML_CANONICAL) soap_utilize_ns(soap, type); #endif } if (soap->null && soap->position > 0) { register int i; sprintf(soap->tmpbuf, "[%d", soap->positions[0]); for (i = 1; i < soap->position; i++) sprintf(soap->tmpbuf + strlen(soap->tmpbuf), ",%d", soap->positions[i]); strcat(soap->tmpbuf, "]"); if (soap_attribute(soap, "SOAP-ENC:position", soap->tmpbuf)) return soap->error; } if (soap->mustUnderstand) { if (soap->actor && *soap->actor) { if (soap_attribute(soap, soap->version == 2 ? "SOAP-ENV:role" : "SOAP-ENV:actor", soap->actor)) return soap->error; } if (soap_attribute(soap, "SOAP-ENV:mustUnderstand", soap->version == 2 ? "true" : "1")) return soap->error; soap->mustUnderstand = 0; } if (soap->encoding) { if (soap->encodingStyle && soap->local_namespaces) { if (!*soap->encodingStyle) { if (soap->local_namespaces[1].out) soap->encodingStyle = soap->local_namespaces[1].out; else soap->encodingStyle = soap->local_namespaces[1].ns; } if (soap->encodingStyle && soap_attribute(soap, "SOAP-ENV:encodingStyle", soap->encodingStyle)) return soap->error; } soap->encoding = 0; } soap->null = 0; soap->position = 0; if (soap->event == SOAP_SEC_BEGIN) soap->event = 0; return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_element_begin_out(struct soap *soap, const char *tag, int id, const char *type) { if (*tag == '-') return SOAP_OK; if (soap_element(soap, tag, id, type)) return soap->error; #ifdef WITH_DOM if (soap_element_start_end_out(soap, NULL)) return soap->error; if (soap->feltbegout) return soap->error = soap->feltbegout(soap, tag); return SOAP_OK; #else return soap_element_start_end_out(soap, NULL); #endif } #endif /******************************************************************************/ #ifndef PALM_2 #ifndef HAVE_STRRCHR SOAP_FMAC1 char* SOAP_FMAC2 soap_strrchr(const char *s, int t) { register char *r = NULL; while (*s) if (*s++ == t) r = (char*)s - 1; return r; } #endif #endif /******************************************************************************/ #ifndef PALM_2 #ifndef HAVE_STRTOL SOAP_FMAC1 long SOAP_FMAC2 soap_strtol(const char *s, char **t, int b) { register long n = 0; register int c; while (*s > 0 && *s <= 32) s++; if (b == 10) { short neg = 0; if (*s == '-') { s++; neg = 1; } else if (*s == '+') s++; while ((c = *s) && c >= '0' && c <= '9') { if (n >= 214748364 && (n > 214748364 || c >= '8')) break; n *= 10; n += c - '0'; s++; } if (neg) n = -n; } else /* assume b == 16 and value is always positive */ { while ((c = *s)) { if (c >= '0' && c <= '9') c -= '0'; else if (c >= 'A' && c <= 'F') c -= 'A' - 10; else if (c >= 'a' && c <= 'f') c -= 'a' - 10; if (n > 0x07FFFFFF) break; n <<= 4; n += c; s++; } } if (t) *t = (char*)s; return n; } #endif #endif /******************************************************************************/ #ifndef PALM_2 #ifndef HAVE_STRTOUL SOAP_FMAC1 unsigned long SOAP_FMAC2 soap_strtoul(const char *s, char **t, int b) { unsigned long n = 0; register int c; while (*s > 0 && *s <= 32) s++; if (b == 10) { if (*s == '+') s++; while ((c = *s) && c >= '0' && c <= '9') { if (n >= 429496729 && (n > 429496729 || c >= '6')) break; n *= 10; n += c - '0'; s++; } } else /* b == 16 */ { while ((c = *s)) { if (c >= '0' && c <= '9') c -= '0'; else if (c >= 'A' && c <= 'F') c -= 'A' - 10; else if (c >= 'a' && c <= 'f') c -= 'a' - 10; if (n > 0x0FFFFFFF) break; n <<= 4; n += c; s++; } } if (t) *t = (char*)s; return n; } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_array_begin_out(struct soap *soap, const char *tag, int id, const char *type, const char *offset) { if (!type || !*type) return soap_element_begin_out(soap, tag, id, NULL); if (soap_element(soap, tag, id, "SOAP-ENC:Array")) return soap->error; if (soap->version == 2) { const char *s; s = soap_strrchr(type, '['); if ((size_t)(s - type) < sizeof(soap->tmpbuf)) { strncpy(soap->tmpbuf, type, s - type); soap->tmpbuf[s - type] = '\0'; if (soap_attribute(soap, "SOAP-ENC:itemType", soap->tmpbuf)) return soap->error; if (s && (soap_attribute(soap, "SOAP-ENC:arraySize", s + 1))) return soap->error; } } else { if (offset && soap_attribute(soap, "SOAP-ENC:offset", offset)) return soap->error; if (soap_attribute(soap, "SOAP-ENC:arrayType", type)) return soap->error; } #ifndef WITH_LEAN if ((soap->mode & SOAP_XML_CANONICAL)) soap_utilize_ns(soap, type); #endif return soap_element_start_end_out(soap, NULL); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_element_start_end_out(struct soap *soap, const char *tag) { register struct soap_attribute *tp; #ifndef WITH_LEAN if (soap->mode & SOAP_XML_CANONICAL) { struct soap_nlist *np; for (tp = soap->attributes; tp; tp = tp->next) { if (tp->visible && tp->name) soap_utilize_ns(soap, tp->name); } for (np = soap->nlist; np; np = np->next) { if (np->index == 1 && np->ns) { sprintf(soap->tmpbuf, *(np->id) ? "xmlns:%s" : "xmlns", np->id); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Enabling utilized binding (level=%u) %s='%s'\n", np->level, soap->tmpbuf, np->ns)); soap_set_attr(soap, soap->tmpbuf, np->ns, 1); np->index = 2; } } } #endif #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { register struct soap_dom_attribute **att; att = &soap->dom->atts; for (tp = soap->attributes; tp; tp = tp->next) { if (tp->visible) { *att = (struct soap_dom_attribute*)soap_malloc(soap, sizeof(struct soap_dom_attribute)); if (!*att) return soap->error; (*att)->next = NULL; (*att)->nstr = NULL; (*att)->name = soap_strdup(soap, tp->name); (*att)->data = soap_strdup(soap, tp->value); (*att)->wide = NULL; (*att)->soap = soap; att = &(*att)->next; tp->visible = 0; } } return SOAP_OK; } #endif for (tp = soap->attributes; tp; tp = tp->next) { if (tp->visible) { #ifndef WITH_LEAN const char *s; if ((soap->mode & SOAP_XML_DEFAULTNS) && (s = strchr(tp->name, ':'))) { size_t n = s - tp->name; if (soap->nlist && !strncmp(soap->nlist->id, tp->name, n) && !soap->nlist->id[n]) s++; else s = tp->name; if (soap_send(soap, " ") || soap_send(soap, s)) return soap->error; } else #endif if (soap_send(soap, " ") || soap_send(soap, tp->name)) return soap->error; if (tp->visible == 2 && tp->value) if (soap_send_raw(soap, "=\"", 2) || soap_string_out(soap, tp->value, tp->flag) || soap_send_raw(soap, "\"", 1)) return soap->error; tp->visible = 0; } } if (tag) { #ifndef WITH_LEAN if (soap->mode & SOAP_XML_CANONICAL) { if (soap_send_raw(soap, ">", 1) || soap_element_end_out(soap, tag)) return soap->error; return SOAP_OK; } #endif soap->level--; /* decrement level just before /> */ return soap_send_raw(soap, "/>", 2); } return soap_send_raw(soap, ">", 1); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_element_end_out(struct soap *soap, const char *tag) { #ifndef WITH_LEAN const char *s; #endif if (*tag == '-') return SOAP_OK; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element ending tag='%s'\n", tag)); #ifdef WITH_DOM if (soap->feltendout && (soap->error = soap->feltendout(soap, tag))) return soap->error; if ((soap->mode & SOAP_XML_DOM) && soap->dom) { if (soap->dom->prnt) soap->dom = soap->dom->prnt; return SOAP_OK; } #endif #ifndef WITH_LEAN if (soap->mode & SOAP_XML_CANONICAL) soap_pop_namespace(soap); if (soap->mode & SOAP_XML_INDENT) { if (!soap->body) { if (soap_send_raw(soap, soap_indent, soap->level < sizeof(soap_indent) ? soap->level : sizeof(soap_indent) - 1)) return soap->error; } soap->body = 0; } if ((soap->mode & SOAP_XML_DEFAULTNS) && (s = strchr(tag, ':'))) { soap_pop_namespace(soap); tag = s + 1; } #endif if (soap_send_raw(soap, "error; soap->level--; /* decrement level just before > */ return soap_send_raw(soap, ">", 1); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_element_ref(struct soap *soap, const char *tag, int id, int href) { register int n = 0; const char *s = "href"; if (soap->version == 2) { s = "SOAP-ENC:ref"; n = 1; } sprintf(soap->href, "#_%d", href); return soap_element_href(soap, tag, id, s, soap->href + n); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_element_href(struct soap *soap, const char *tag, int id, const char *ref, const char *val) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element '%s' reference %s='%s'\n", tag, ref, val)); if (soap_element(soap, tag, id, NULL) || soap_attribute(soap, ref, val) || soap_element_start_end_out(soap, tag)) return soap->error; return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_element_null(struct soap *soap, const char *tag, int id, const char *type) { struct soap_attribute *tp = NULL; for (tp = soap->attributes; tp; tp = tp->next) if (tp->visible) break; if (tp || (soap->version == 2 && soap->position > 0) || id > 0 || (soap->mode & SOAP_XML_NIL)) { if (soap_element(soap, tag, id, type) || (!tp && soap_attribute(soap, "xsi:nil", "true"))) return soap->error; return soap_element_start_end_out(soap, tag); } soap->null = 1; soap->position = 0; soap->mustUnderstand = 0; return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_element_nil(struct soap *soap, const char *tag) { if (soap_element(soap, tag, -1, NULL) || soap_attribute(soap, "xsi:nil", "true")) return soap->error; return soap_element_start_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_element_id(struct soap *soap, const char *tag, int id, const void *p, const struct soap_array *a, int n, const char *type, int t) { if (!p) { soap_element_null(soap, tag, id, type); return -1; } #ifndef WITH_NOIDREF if (soap->mode & SOAP_XML_TREE) return 0; if (id < 0) { struct soap_plist *pp; if (a) id = soap_array_pointer_lookup(soap, p, a, n, t, &pp); else id = soap_pointer_lookup(soap, p, t, &pp); if (id) { if (soap_is_embedded(soap, pp)) { soap_element_ref(soap, tag, 0, id); return -1; } if (soap_is_single(soap, pp)) return 0; soap_set_embedded(soap, pp); } } return id; #else return 0; #endif } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_element_result(struct soap *soap, const char *tag) { if (soap->version == 2 && soap->encodingStyle) { if (soap_element(soap, "SOAP-RPC:result", 0, NULL) || soap_attribute(soap, "xmlns:SOAP-RPC", soap_rpc) || soap_element_start_end_out(soap, NULL) || soap_string_out(soap, tag, 0) || soap_element_end_out(soap, "SOAP-RPC:result")) return soap->error; } return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_check_result(struct soap *soap, const char *tag) { if (soap->version == 2 && soap->encodingStyle) { soap_instring(soap, ":result", NULL, NULL, 0, 2, -1, -1); /* just ignore content for compliance reasons, but should compare tag to element's QName value? */ } (void)tag; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_attribute(struct soap *soap, const char *name, const char *value) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Attribute '%s'='%s'\n", name, value)); #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && !(soap->mode & SOAP_XML_CANONICAL) && soap->dom) { register struct soap_dom_attribute *a = (struct soap_dom_attribute*)soap_malloc(soap, sizeof(struct soap_dom_attribute)); if (!a) return soap->error; a->next = soap->dom->atts; a->nstr = NULL; a->name = soap_strdup(soap, name); a->data = soap_strdup(soap, value); a->wide = NULL; a->soap = soap; soap->dom->atts = a; return SOAP_OK; } #endif #ifndef WITH_LEAN if (soap->mode & SOAP_XML_CANONICAL) { /* push namespace */ if (!strncmp(name, "xmlns", 5) && (name[5] == ':' || name[5] == '\0')) soap_push_ns(soap, name + 5 + (name[5] == ':'), value, 0); else if (soap_set_attr(soap, name, value, 1)) return soap->error; } else #endif { if (soap_send(soap, " ") || soap_send(soap, name)) return soap->error; if (value) if (soap_send_raw(soap, "=\"", 2) || soap_string_out(soap, value, 1) || soap_send_raw(soap, "\"", 1)) return soap->error; } return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_element_begin_in(struct soap *soap, const char *tag, int nillable, const char *type) { if (!soap_peek_element(soap)) { if (soap->other) return soap->error = SOAP_TAG_MISMATCH; if (tag && *tag == '-') return SOAP_OK; if (!(soap->error = soap_match_tag(soap, soap->tag, tag))) { soap->peeked = 0; if (type && *soap->type && soap_match_tag(soap, soap->type, type)) return soap->error = SOAP_TYPE; if (!nillable && soap->null && (soap->mode & SOAP_XML_STRICT)) return soap->error = SOAP_NULL; if (soap->body) soap->level++; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Begin element found (level=%u) '%s'='%s'\n", soap->level, soap->tag, tag ? tag : SOAP_STR_EOS )); } } else if (soap->error == SOAP_NO_TAG && tag && *tag == '-') soap->error = SOAP_OK; return soap->error; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_element_end_in(struct soap *soap, const char *tag) { register soap_wchar c; register char *s; register int n = 0; if (tag && *tag == '-') return SOAP_OK; if (soap->error == SOAP_NO_TAG) soap->error = SOAP_OK; #ifdef WITH_DOM /* this whitespace or mixed content is significant for DOM */ if ((soap->mode & SOAP_XML_DOM) && soap->dom) { if (!soap->peeked && !soap_string_in(soap, 3, -1, -1)) return soap->error; if (soap->dom->prnt) soap->dom = soap->dom->prnt; } #endif if (soap->peeked) { if (*soap->tag) n++; soap->peeked = 0; } do { while (((c = soap_get(soap)) != SOAP_TT)) { if ((int)c == EOF) return soap->error = SOAP_CHK_EOF; if (c == SOAP_LT) n++; else if (c == '/') { c = soap_get(soap); if (c == SOAP_GT) n--; else soap_unget(soap, c); } } } while (n--); s = soap->tag; n = sizeof(soap->tag); while (soap_notblank(c = soap_get(soap))) { if (--n > 0) *s++ = (char)c; } *s = '\0'; if ((int)c == EOF) return soap->error = SOAP_CHK_EOF; while (soap_blank(c)) c = soap_get(soap); if (c != SOAP_GT) return soap->error = SOAP_SYNTAX_ERROR; #ifndef WITH_LEAN #ifdef WITH_DOM if (soap->feltendin) { soap->level--; return soap->error = soap->feltendin(soap, soap->tag, tag); } #endif if (tag && (soap->mode & SOAP_XML_STRICT)) { soap_pop_namespace(soap); if (soap_match_tag(soap, soap->tag, tag)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End element tag '%s' does not match '%s'\n", soap->tag, tag ? tag : SOAP_STR_EOS)); return soap->error = SOAP_SYNTAX_ERROR; } } #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End element found (level=%u) '%s'='%s'\n", soap->level, soap->tag, tag ? tag : SOAP_STR_EOS)); soap->level--; return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char * SOAP_FMAC2 soap_attr_value(struct soap *soap, const char *name, int flag) { register struct soap_attribute *tp; if (*name == '-') return SOAP_STR_EOS; for (tp = soap->attributes; tp; tp = tp->next) { if (tp->visible && !soap_match_tag(soap, tp->name, name)) break; } if (tp) { if (flag == 2 && (soap->mode & SOAP_XML_STRICT)) soap->error = SOAP_PROHIBITED; else return tp->value; } else if (flag == 1 && (soap->mode & SOAP_XML_STRICT)) soap->error = SOAP_REQUIRED; else soap->error = SOAP_OK; return NULL; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_set_attr(struct soap *soap, const char *name, const char *value, int flag) { register struct soap_attribute *tp; if (*name == '-') return SOAP_OK; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Set attribute %s='%s'\n", name, value ? value : SOAP_STR_EOS)); for (tp = soap->attributes; tp; tp = tp->next) { if (!strcmp(tp->name, name)) break; } if (!tp) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Allocate attribute %s\n", name)); if (!(tp = (struct soap_attribute*)SOAP_MALLOC(soap, sizeof(struct soap_attribute) + strlen(name)))) return soap->error = SOAP_EOM; tp->ns = NULL; #ifndef WITH_LEAN if ((soap->mode & SOAP_XML_CANONICAL)) { struct soap_attribute **tpp = &soap->attributes; const char *s = strchr(name, ':'); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inserting attribute %s for c14n\n", name)) if (!strncmp(name, "xmlns", 5)) { for (; *tpp; tpp = &(*tpp)->next) if (strncmp((*tpp)->name, "xmlns", 5) || strcmp((*tpp)->name + 5, name + 5) > 0) break; } else if (!s) { for (; *tpp; tpp = &(*tpp)->next) if (strncmp((*tpp)->name, "xmlns", 5) && ((*tpp)->ns || strcmp((*tpp)->name, name) > 0)) break; } else { struct soap_nlist *np = soap_lookup_ns(soap, name, s - name); if (np) tp->ns = np->ns; else { struct soap_attribute *tq; for (tq = soap->attributes; tq; tq = tq->next) { if (!strncmp(tq->name, "xmlns:", 6) && !strncmp(tq->name + 6, name, s - name) && !tq->name[6 + s - name]) { tp->ns = tq->ns; break; } } } for (; *tpp; tpp = &(*tpp)->next) { int k; if (strncmp((*tpp)->name, "xmlns", 5) && (*tpp)->ns && tp->ns && ((k = strcmp((*tpp)->ns, tp->ns)) > 0 || (!k && strcmp((*tpp)->name, name) > 0))) break; } } tp->next = *tpp; *tpp = tp; } else #endif { tp->next = soap->attributes; soap->attributes = tp; } strcpy((char*)tp->name, name); tp->value = NULL; } else if (tp->visible) { return SOAP_OK; } else if (value && tp->value && tp->size <= strlen(value)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free attribute value of %s (free %p)\n", name, tp->value)); SOAP_FREE(soap, tp->value); tp->value = NULL; tp->ns = NULL; } if (value) { if (!tp->value) { tp->size = strlen(value) + 1; if (!(tp->value = (char*)SOAP_MALLOC(soap, tp->size))) return soap->error = SOAP_EOM; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Allocate attribute value for %s (%p)\n", tp->name, tp->value)); } strcpy(tp->value, value); if (!strncmp(tp->name, "xmlns:", 6)) tp->ns = tp->value; tp->visible = 2; tp->flag = (short)flag; #ifndef WITH_LEAN if (!strcmp(name, "wsu:Id")) { soap->event = SOAP_SEC_BEGIN; strncpy(soap->id, value, sizeof(soap->id)); soap->id[sizeof(soap->id)-1] = '\0'; } #endif } else tp->visible = 1; return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_clr_attr(struct soap *soap) { register struct soap_attribute *tp; #ifndef WITH_LEAN if ((soap->mode & SOAP_XML_CANONICAL)) { while (soap->attributes) { tp = soap->attributes->next; if (soap->attributes->value) SOAP_FREE(soap, soap->attributes->value); SOAP_FREE(soap, soap->attributes); soap->attributes = tp; } } else #endif { for (tp = soap->attributes; tp; tp = tp->next) tp->visible = 0; } } #endif /******************************************************************************/ #ifndef PALM_2 static int soap_getattrval(struct soap *soap, char *s, size_t n, soap_wchar d) { register size_t i; for (i = 0; i < n; i++) { register soap_wchar c = soap_get(soap); switch (c) { case SOAP_TT: *s++ = '<'; soap_unget(soap, '/'); break; case SOAP_LT: *s++ = '<'; break; case SOAP_GT: if (d == ' ') { soap_unget(soap, c); *s = '\0'; return SOAP_OK; } *s++ = '>'; break; case SOAP_QT: if (c == d) { *s = '\0'; return SOAP_OK; } *s++ = '"'; break; case SOAP_AP: if (c == d) { *s = '\0'; return SOAP_OK; } *s++ = '\''; break; case '\t': case '\n': case '\r': case ' ': case '/': if (d == ' ') { soap_unget(soap, c); *s = '\0'; return SOAP_OK; } default: if ((int)c == EOF) return soap->error = SOAP_CHK_EOF; *s++ = (char)c; } } return soap->error = SOAP_EOM; } #endif /******************************************************************************/ #ifdef WITH_FAST #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_store_lab(struct soap *soap, const char *s, size_t n) { soap->labidx = 0; return soap_append_lab(soap, s, n); } #endif #endif /******************************************************************************/ #ifdef WITH_FAST #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_append_lab(struct soap *soap, const char *s, size_t n) { if (soap->labidx + n >= soap->lablen) { register char *t = soap->labbuf; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Enlarging look-aside buffer to append data, old size=%lu", (unsigned long)soap->lablen)); if (soap->lablen == 0) soap->lablen = SOAP_LABLEN; while (soap->labidx + n >= soap->lablen) soap->lablen <<= 1; DBGLOG(TEST, SOAP_MESSAGE(fdebug, ", new size=%lu\n", (unsigned long)soap->lablen)); soap->labbuf = (char*)SOAP_MALLOC(soap, soap->lablen); if (!soap->labbuf) { if (t) SOAP_FREE(soap, t); return soap->error = SOAP_EOM; } if (t) { memcpy(soap->labbuf, t, soap->labidx); SOAP_FREE(soap, t); } } if (s) { memcpy(soap->labbuf + soap->labidx, s, n); soap->labidx += n; } return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_peek_element(struct soap *soap) { #ifdef WITH_DOM register struct soap_dom_attribute **att = NULL; register char *lead = NULL; #endif register struct soap_attribute *tp, *tq = NULL; register const char *t; register char *s; register soap_wchar c; register int i; if (soap->peeked) { if (!*soap->tag) return soap->error = SOAP_NO_TAG; return SOAP_OK; } soap->peeked = 1; soap->id[0] = '\0'; soap->href[0] = '\0'; soap->type[0] = '\0'; soap->arrayType[0] = '\0'; soap->arraySize[0] = '\0'; soap->arrayOffset[0] = '\0'; soap->other = 0; soap->root = -1; soap->position = 0; soap->null = 0; soap->mustUnderstand = 0; /* UTF-8 BOM? */ c = soap_getchar(soap); if (c == 0xEF && soap_get0(soap) == 0xBB) { c = soap_get1(soap); if ((c = soap_get1(soap)) == 0xBF) soap->mode &= ~SOAP_ENC_LATIN; else soap_unget(soap, (0x0F << 12) | (0xBB << 6) | (c & 0x3F)); /* UTF-8 */ } else if ((c == 0xFE && soap_get0(soap) == 0xFF) /* UTF-16 BE */ || (c == 0xFF && soap_get0(soap) == 0xFE)) /* UTF-16 LE */ return soap->error = SOAP_UTF_ERROR; else soap_unget(soap, c); c = soap_get(soap); #ifdef WITH_DOM /* whitespace leading to tag is not insignificant for DOM */ if (soap_blank(c)) { soap->labidx = 0; do { if (soap_append_lab(soap, NULL, 0)) return soap->error; s = soap->labbuf + soap->labidx; i = soap->lablen - soap->labidx; soap->labidx = soap->lablen; while (soap_blank(c) && i--) { *s++ = c; c = soap_get(soap); } } while (soap_blank(c)); *s = '\0'; lead = soap->labbuf; } #else /* skip space */ while (soap_blank(c)) c = soap_get(soap); #endif if (c != SOAP_LT) { *soap->tag = '\0'; if ((int)c == EOF) return soap->error = SOAP_CHK_EOF; soap_unget(soap, c > 0 ? c | 0x80000000 : c); #ifdef WITH_DOM /* whitespace leading to end tag is significant for DOM */ if ((soap->mode & SOAP_XML_DOM) && soap->dom) { if (lead && *lead) soap->dom->tail = soap_strdup(soap, lead); else soap->dom->tail = (char*)SOAP_STR_EOS; } #endif return soap->error = SOAP_NO_TAG; } s = soap->tag; do c = soap_get1(soap); while (soap_blank(c)); i = sizeof(soap->tag); while (c != '>' && c != '/' && soap_notblank(c) && (int)c != EOF) { if (--i > 0) *s++ = (char)c; c = soap_get1(soap); } while (soap_blank(c)) c = soap_get1(soap); *s = '\0'; #ifdef WITH_DOM if (soap->mode & SOAP_XML_DOM) { register struct soap_dom_element *elt; elt = (struct soap_dom_element*)soap_malloc(soap, sizeof(struct soap_dom_element)); if (!elt) return soap->error; elt->next = NULL; elt->nstr = NULL; elt->name = soap_strdup(soap, soap->tag); elt->prnt = soap->dom; elt->elts = NULL; elt->atts = NULL; elt->data = NULL; elt->wide = NULL; elt->type = 0; elt->node = NULL; elt->head = soap_strdup(soap, lead); elt->tail = NULL; elt->soap = soap; if (soap->dom) { struct soap_dom_element *p = soap->dom->elts; if (p) { while (p->next) p = p->next; p->next = elt; } else soap->dom->elts = elt; } soap->dom = elt; att = &elt->atts; } #endif soap_pop_namespace(soap); for (tp = soap->attributes; tp; tp = tp->next) tp->visible = 0; while ((int)c != EOF && c != '>' && c != '/') { s = soap->tmpbuf; i = sizeof(soap->tmpbuf); while (c != '=' && c != '>' && c != '/' && soap_notblank(c) && (int)c != EOF) { if (--i > 0) *s++ = (char)c; c = soap_get1(soap); } *s = '\0'; if (i == sizeof(soap->tmpbuf)) return soap->error = SOAP_SYNTAX_ERROR; #ifdef WITH_DOM /* add attribute name to dom */ if (att) { *att = (struct soap_dom_attribute*)soap_malloc(soap, sizeof(struct soap_dom_attribute)); if (!*att) return soap->error; (*att)->next = NULL; (*att)->nstr = NULL; (*att)->name = soap_strdup(soap, soap->tmpbuf); (*att)->data = NULL; (*att)->wide = NULL; (*att)->soap = soap; } #endif if (!strncmp(soap->tmpbuf, "xmlns", 5)) { if (soap->tmpbuf[5] == ':') t = soap->tmpbuf + 6; else if (soap->tmpbuf[5]) t = NULL; else t = SOAP_STR_EOS; } else t = NULL; tq = NULL; for (tp = soap->attributes; tp; tq = tp, tp = tp->next) { if (!SOAP_STRCMP(tp->name, soap->tmpbuf)) break; } if (!tp) { tp = (struct soap_attribute*)SOAP_MALLOC(soap, sizeof(struct soap_attribute) + strlen(soap->tmpbuf)); if (!tp) return soap->error = SOAP_EOM; strcpy((char*)tp->name, soap->tmpbuf); tp->value = NULL; tp->size = 0; tp->ns = NULL; /* if attribute name is qualified, append it to the end of the list */ if (tq && strchr(soap->tmpbuf, ':')) { tq->next = tp; tp->next = NULL; } else { tp->next = soap->attributes; soap->attributes = tp; } } while (soap_blank(c)) c = soap_get1(soap); if (c == '=') { do c = soap_getutf8(soap); while (soap_blank(c)); if (c != SOAP_QT && c != SOAP_AP) { soap_unget(soap, c); c = ' '; /* blank delimiter */ } if (soap_getattrval(soap, tp->value, tp->size, c)) { #ifdef WITH_FAST if (soap->error != SOAP_EOM) return soap->error; soap->error = SOAP_OK; if (soap_store_lab(soap, tp->value, tp->size)) return soap->error; if (tp->value) SOAP_FREE(soap, tp->value); for (;;) { if (soap_getattrval(soap, soap->labbuf + soap->labidx, soap->lablen - soap->labidx, c)) { if (soap->error != SOAP_EOM) return soap->error; soap->error = SOAP_OK; soap->labidx = soap->lablen; if (soap_append_lab(soap, NULL, 0)) return soap->error; } else break; } if (soap->labidx) tp->size = soap->lablen; else { tp->size = strlen(soap->labbuf) + 1; if (tp->size < SOAP_LABLEN) tp->size = SOAP_LABLEN; } if (!(tp->value = (char*)SOAP_MALLOC(soap, tp->size))) return soap->error = SOAP_EOM; strcpy(tp->value, soap->labbuf); #else size_t n; if (soap->error != SOAP_EOM) return soap->error; soap->error = SOAP_OK; if (soap_new_block(soap) == NULL) return soap->error; for (;;) { if (!(s = (char*)soap_push_block(soap, NULL, SOAP_BLKLEN))) return soap->error; if (soap_getattrval(soap, s, SOAP_BLKLEN, c)) { if (soap->error != SOAP_EOM) return soap->error; soap->error = SOAP_OK; } else break; } n = tp->size + soap->blist->size; if (!(s = (char*)SOAP_MALLOC(soap, n))) return soap->error = SOAP_EOM; if (tp->value) { memcpy(s, tp->value, tp->size); SOAP_FREE(soap, tp->value); } soap_save_block(soap, NULL, s + tp->size, 0); tp->value = s; tp->size = n; #endif } do c = soap_get1(soap); while (soap_blank(c)); tp->visible = 2; /* seen this attribute w/ value */ #ifdef WITH_DOM if (att) (*att)->data = soap_strdup(soap, tp->value); #endif } else tp->visible = 1; /* seen this attribute w/o value */ #ifdef WITH_DOM if (att) att = &(*att)->next; #endif if (t && tp->value) { if (soap_push_namespace(soap, t, tp->value) == NULL) return soap->error; } } #ifdef WITH_DOM if (att) { soap->dom->nstr = soap_current_namespace(soap, soap->tag); for (att = &soap->dom->atts; *att; att = &(*att)->next) (*att)->nstr = soap_current_namespace(soap, (*att)->name); } #endif if ((int)c == EOF) return soap->error = SOAP_CHK_EOF; if (!(soap->body = (c != '/'))) do c = soap_get1(soap); while (soap_blank(c)); #ifdef WITH_DOM if (soap->mode & SOAP_XML_DOM) { if (!soap->body && soap->dom->prnt) soap->dom = soap->dom->prnt; } #endif for (tp = soap->attributes; tp; tp = tp->next) { if (tp->visible && tp->value) { #ifndef WITH_NOIDREF if (!strcmp(tp->name, "id")) { if ((soap->version > 0 && !(soap->mode & SOAP_XML_TREE)) || (soap->mode & SOAP_XML_GRAPH)) { *soap->id = '#'; strncpy(soap->id + 1, tp->value, sizeof(soap->id) - 2); soap->id[sizeof(soap->id)-1] = '\0'; } } else if (!strcmp(tp->name, "href")) { if (soap->version == 1 || (soap->mode & SOAP_XML_GRAPH) || (soap->mode & SOAP_ENC_MTOM) || (soap->mode & SOAP_ENC_DIME)) { strncpy(soap->href, tp->value, sizeof(soap->href) - 1); soap->href[sizeof(soap->href)-1] = '\0'; } } else #endif if (!soap_match_tag(soap, tp->name, "xsi:type")) { strncpy(soap->type, tp->value, sizeof(soap->type) - 1); soap->type[sizeof(soap->type)-1] = '\0'; } else if ((!soap_match_tag(soap, tp->name, "xsi:null") || !soap_match_tag(soap, tp->name, "xsi:nil")) && (!strcmp(tp->value, "1") || !strcmp(tp->value, "true"))) { soap->null = 1; } else if (soap->version == 1) { if (!soap_match_tag(soap, tp->name, "SOAP-ENC:arrayType")) { s = soap_strrchr(tp->value, '['); if (s && (size_t)(s - tp->value) < sizeof(soap->arrayType)) { strncpy(soap->arrayType, tp->value, s - tp->value); soap->arrayType[s - tp->value] = '\0'; strncpy(soap->arraySize, s, sizeof(soap->arraySize) - 1); } else strncpy(soap->arrayType, tp->value, sizeof(soap->arrayType) - 1); soap->arraySize[sizeof(soap->arrayType)-1] = '\0'; soap->arrayType[sizeof(soap->arrayType)-1] = '\0'; } else if (!soap_match_tag(soap, tp->name, "SOAP-ENC:offset")) strncpy(soap->arrayOffset, tp->value, sizeof(soap->arrayOffset)); else if (!soap_match_tag(soap, tp->name, "SOAP-ENC:position")) soap->position = soap_getposition(tp->value, soap->positions); else if (!soap_match_tag(soap, tp->name, "SOAP-ENC:root")) soap->root = ((!strcmp(tp->value, "1") || !strcmp(tp->value, "true"))); else if (!soap_match_tag(soap, tp->name, "SOAP-ENV:mustUnderstand") && (!strcmp(tp->value, "1") || !strcmp(tp->value, "true"))) soap->mustUnderstand = 1; else if (!soap_match_tag(soap, tp->name, "SOAP-ENV:actor")) { if ((!soap->actor || strcmp(soap->actor, tp->value)) && strcmp(tp->value, "http://schemas.xmlsoap.org/soap/actor/next")) soap->other = 1; } } else if (soap->version == 2) { #ifndef WITH_NOIDREF if (!strcmp(tp->name, "ref") || !soap_match_tag(soap, tp->name, "SOAP-ENC:ref")) { *soap->href = '#'; strncpy(soap->href + 1, tp->value, sizeof(soap->href) - 2); soap->href[sizeof(soap->href)-1] = '\0'; } else #endif if (!soap_match_tag(soap, tp->name, "SOAP-ENC:itemType")) strncpy(soap->arrayType, tp->value, sizeof(soap->arrayType) - 1); else if (!soap_match_tag(soap, tp->name, "SOAP-ENC:arraySize")) strncpy(soap->arraySize, tp->value, sizeof(soap->arraySize) - 1); else if (!soap_match_tag(soap, tp->name, "SOAP-ENV:mustUnderstand") && (!strcmp(tp->value, "1") || !strcmp(tp->value, "true"))) soap->mustUnderstand = 1; else if (!soap_match_tag(soap, tp->name, "SOAP-ENV:role")) { if ((!soap->actor || strcmp(soap->actor, tp->value)) && strcmp(tp->value, "http://www.w3.org/2003/05/soap-envelope/role/next")) soap->other = 1; } } else { if (!soap_match_tag(soap, tp->name, "wsdl:required") && !strcmp(tp->value, "true")) soap->mustUnderstand = 1; } } } #ifdef WITH_DOM if (soap->feltbegin) return soap->error = soap->feltbegin(soap, soap->tag); #endif return soap->error = SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_retry(struct soap *soap) { soap->error = SOAP_OK; soap_revert(soap); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_revert(struct soap *soap) { if (!soap->peeked) { soap->peeked = 1; if (soap->body) soap->level--; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Reverting to last element '%s' (level=%u)\n", soap->tag, soap->level)); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_string_out(struct soap *soap, const char *s, int flag) { register const char *t; register soap_wchar c; register soap_wchar mask = (soap_wchar)0xFFFFFF80UL; #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { soap->dom->data = soap_strdup(soap, s); return SOAP_OK; } #endif if (flag == 2 || soap->mode & SOAP_C_UTFSTRING) mask = 0; t = s; while ((c = *t++)) { switch (c) { case 0x09: if (flag) { if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, " ", 5)) return soap->error; s = t; } break; case 0x0A: if (flag || !(soap->mode & SOAP_XML_CANONICAL)) { if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, " ", 5)) return soap->error; s = t; } break; case 0x0D: if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, " ", 5)) return soap->error; s = t; break; case '&': if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, "&", 5)) return soap->error; s = t; break; case '<': if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, "<", 4)) return soap->error; s = t; break; case '>': if (!flag) { if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, ">", 4)) return soap->error; s = t; } break; case '"': if (flag) { if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, """, 6)) return soap->error; s = t; } break; default: #ifndef WITH_LEANER #ifdef HAVE_MBTOWC if (soap->mode & SOAP_C_MBSTRING) { wchar_t wc; register int m = mbtowc(&wc, t - 1, MB_CUR_MAX); if (m > 0 && !((soap_wchar)wc == c && m == 1 && c < 0x80)) { if (soap_send_raw(soap, s, t - s - 1) || soap_pututf8(soap, wc)) return soap->error; s = t += m - 1; continue; } } #endif #endif #ifndef WITH_NOSTRINGTOUTF8 if ((c & mask) || !(c & 0xFFFFFFE0UL)) { if (soap_send_raw(soap, s, t - s - 1) || soap_pututf8(soap, (unsigned char)c)) return soap->error; s = t; } #endif } } return soap_send_raw(soap, s, t - s - 1); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 char * SOAP_FMAC2 soap_string_in(struct soap *soap, int flag, long minlen, long maxlen) { register char *s; char *t = NULL; register size_t i; register long l = 0; register int n = 0, f = 0, m = 0; register soap_wchar c; #if !defined(WITH_LEANER) && defined(HAVE_WCTOMB) char buf[MB_LEN_MAX > 8 ? MB_LEN_MAX : 8]; #else char buf[8]; #endif DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Reading string content, flag=%d\n", flag)); if (soap->peeked && *soap->tag) { #ifndef WITH_LEAN struct soap_attribute *tp; DBGLOG(TEST,SOAP_MESSAGE(fdebug, "String content includes tag '%s' and attributes\n", soap->tag)); t = soap->tmpbuf; *t = '<'; t[sizeof(soap->tmpbuf)-1] = '\0'; strncpy(t + 1, soap->tag, sizeof(soap->tmpbuf) - 2); t += strlen(t); for (tp = soap->attributes; tp; tp = tp->next) { if (tp->visible) { if (t >= soap->tmpbuf + sizeof(soap->tmpbuf) - 2) break; *t++ = ' '; strcpy(t, tp->name); t += strlen(t); if (t >= soap->tmpbuf + sizeof(soap->tmpbuf) - 2) break; /* too many or large attribute values */ if (tp->value) { *t++ = '='; *t++ = '"'; strcpy(t, tp->value); t += strlen(t); *t++ = '"'; } } } if (!soap->body) *t++ = '/'; *t++ = '>'; *t = '\0'; t = soap->tmpbuf; m = (int)strlen(soap->tmpbuf); #endif if (soap->body) n = 1; f = 1; soap->peeked = 0; } #ifdef WITH_CDATA if (!flag) { register int state = 0; #ifdef WITH_FAST soap->labidx = 0; /* use look-aside buffer */ #else if (soap_new_block(soap) == NULL) return NULL; #endif for (;;) { #ifdef WITH_FAST register size_t k; if (soap_append_lab(soap, NULL, 0)) /* allocate more space in look-aside buffer if necessary */ return NULL; s = soap->labbuf + soap->labidx; /* space to populate */ k = soap->lablen - soap->labidx; /* number of bytes available */ soap->labidx = soap->lablen; /* claim this space */ #else register size_t k = SOAP_BLKLEN; if (!(s = (char*)soap_push_block(soap, NULL, k))) return NULL; #endif for (i = 0; i < k; i++) { if (m > 0) { *s++ = *t++; /* copy multibyte characters */ m--; continue; } c = soap_getchar(soap); if ((int)c == EOF) goto end; if ((c >= 0x80 || c < SOAP_AP) && state != 1 && !(soap->mode & SOAP_ENC_LATIN)) { if (c >= 0x80) { soap_unget(soap, c); c = soap_getutf8(soap); } if (soap->mode & SOAP_C_UTFSTRING) { c &= 0x7FFFFFFF; t = buf; if (c < 0x0800) *t++ = (char)(0xC0 | ((c >> 6) & 0x1F)); else { if (c < 0x010000) *t++ = (char)(0xE0 | ((c >> 12) & 0x0F)); else { if (c < 0x200000) *t++ = (char)(0xF0 | ((c >> 18) & 0x07)); else { if (c < 0x04000000) *t++ = (char)(0xF8 | ((c >> 24) & 0x03)); else { *t++ = (char)(0xFC | ((c >> 30) & 0x01)); *t++ = (char)(0x80 | ((c >> 24) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 18) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 12) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 6) & 0x3F)); } *t++ = (char)(0x80 | (c & 0x3F)); m = (int)(t - buf) - 1; t = buf; *s++ = *t++; continue; } } switch (state) { case 1: if (c == ']') state = 4; *s++ = (char)c; continue; case 2: if (c == '-') state = 6; *s++ = (char)c; continue; case 3: if (c == '?') state = 8; *s++ = (char)c; continue; /* CDATA */ case 4: if (c == ']') state = 5; else state = 1; *s++ = (char)c; continue; case 5: if (c == '>') state = 0; else state = 1; *s++ = (char)c; continue; /* comment */ case 6: if (c == '-') state = 7; else state = 2; *s++ = (char)c; continue; case 7: if (c == '>') state = 0; else state = 2; *s++ = (char)c; continue; /* PI */ case 8: if (c == '>') state = 0; else state = 3; *s++ = (char)c; continue; } switch (c) { case SOAP_TT: if (n == 0) goto end; n--; *s++ = '<'; t = (char*)"/"; m = 1; break; case SOAP_LT: if (f && n == 0) goto end; n++; *s++ = '<'; break; case SOAP_GT: *s++ = '>'; break; case SOAP_QT: *s++ = '"'; break; case SOAP_AP: *s++ = '\''; break; case '/': if (n > 0) { c = soap_getchar(soap); if (c == '>') n--; soap_unget(soap, c); } *s++ = '/'; break; case '<': c = soap_getchar(soap); if (c == '/') { if (n == 0) { c = SOAP_TT; goto end; } n--; } else if (c == '!') { c = soap_getchar(soap); if (c == '[') { do c = soap_getchar(soap); while ((int)c != EOF && c != '['); if ((int)c == EOF) goto end; t = (char*)"![CDATA["; m = 8; state = 1; } else if (c == '-') { if ((c = soap_getchar(soap)) == '-') state = 2; t = (char*)"!-"; m = 2; soap_unget(soap, c); } else { t = (char*)"!"; m = 1; soap_unget(soap, c); } *s++ = '<'; break; } else if (c == '?') state = 3; else if (f && n == 0) { soap_revget1(soap); c = '<'; goto end; } else n++; soap_unget(soap, c); *s++ = '<'; break; case '>': *s++ = '>'; break; case '"': *s++ = '"'; break; default: #ifndef WITH_LEANER #ifdef HAVE_WCTOMB if (soap->mode & SOAP_C_MBSTRING) { m = wctomb(buf, (wchar_t)(c & 0x7FFFFFFF)); if (m >= 1 && m <= (int)MB_CUR_MAX) { t = buf; *s++ = *t++; m--; } else { *s++ = SOAP_UNKNOWN_CHAR; m = 0; } } else #endif #endif *s++ = (char)(c & 0xFF); } l++; if (maxlen >= 0 && l > maxlen) { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "String too long: maxlen=%ld\n", maxlen)); soap->error = SOAP_LENGTH; return NULL; } } } } #endif #ifdef WITH_FAST soap->labidx = 0; /* use look-aside buffer */ #else if (soap_new_block(soap) == NULL) return NULL; #endif for (;;) { #ifdef WITH_FAST register size_t k; if (soap_append_lab(soap, NULL, 0)) /* allocate more space in look-aside buffer if necessary */ return NULL; s = soap->labbuf + soap->labidx; /* space to populate */ k = soap->lablen - soap->labidx; /* number of bytes available */ soap->labidx = soap->lablen; /* claim this space */ #else register size_t k = SOAP_BLKLEN; if (!(s = (char*)soap_push_block(soap, NULL, k))) return NULL; #endif for (i = 0; i < k; i++) { if (m > 0) { *s++ = *t++; /* copy multibyte characters */ m--; continue; } if (soap->mode & SOAP_C_UTFSTRING) { if (((c = soap_get(soap)) & 0x80000000) && c >= -0x7FFFFF80 && c < SOAP_AP) { c &= 0x7FFFFFFF; t = buf; if (c < 0x0800) *t++ = (char)(0xC0 | ((c >> 6) & 0x1F)); else { if (c < 0x010000) *t++ = (char)(0xE0 | ((c >> 12) & 0x0F)); else { if (c < 0x200000) *t++ = (char)(0xF0 | ((c >> 18) & 0x07)); else { if (c < 0x04000000) *t++ = (char)(0xF8 | ((c >> 24) & 0x03)); else { *t++ = (char)(0xFC | ((c >> 30) & 0x01)); *t++ = (char)(0x80 | ((c >> 24) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 18) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 12) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 6) & 0x3F)); } *t++ = (char)(0x80 | (c & 0x3F)); m = (int)(t - buf) - 1; t = buf; *s++ = *t++; continue; } } else c = soap_getutf8(soap); switch (c) { case SOAP_TT: if (n == 0) goto end; n--; *s++ = '<'; t = (char*)"/"; m = 1; break; case SOAP_LT: if (f && n == 0) goto end; n++; *s++ = '<'; break; case SOAP_GT: *s++ = '>'; break; case SOAP_QT: *s++ = '"'; break; case SOAP_AP: *s++ = '\''; break; case '/': if (n > 0) { c = soap_get(soap); if (c == SOAP_GT) n--; soap_unget(soap, c); } *s++ = '/'; break; case (soap_wchar)('<' | 0x80000000): if (flag) *s++ = '<'; else { *s++ = '&'; t = (char*)"lt;"; m = 3; } break; case (soap_wchar)('>' | 0x80000000): if (flag) *s++ = '>'; else { *s++ = '&'; t = (char*)"gt;"; m = 3; } break; case (soap_wchar)('&' | 0x80000000): if (flag) *s++ = '&'; else { *s++ = '&'; t = (char*)"amp;"; m = 4; } break; case (soap_wchar)('"' | 0x80000000): if (flag) *s++ = '"'; else { *s++ = '&'; t = (char*)"quot;"; m = 5; } break; case (soap_wchar)('\'' | 0x80000000): if (flag) *s++ = '\''; else { *s++ = '&'; t = (char*)"apos;"; m = 5; } break; default: if ((int)c == EOF) goto end; #ifndef WITH_LEANER #ifdef HAVE_WCTOMB if (soap->mode & SOAP_C_MBSTRING) { m = wctomb(buf, (wchar_t)(c & 0x7FFFFFFF)); if (m >= 1 && m <= (int)MB_CUR_MAX) { t = buf; *s++ = *t++; m--; } else { *s++ = SOAP_UNKNOWN_CHAR; m = 0; } } else #endif #endif *s++ = (char)(c & 0xFF); } l++; if (maxlen >= 0 && l > maxlen) { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "String too long: maxlen=%ld\n", maxlen)); soap->error = SOAP_LENGTH; return NULL; } } } end: soap_unget(soap, c); *s = '\0'; #ifdef WITH_FAST t = soap_strdup(soap, soap->labbuf); #else soap_size_block(soap, NULL, i+1); t = soap_save_block(soap, NULL, 0); #endif if (l < minlen) { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "String too short: %ld chars, minlen=%ld\n", l, minlen)); soap->error = SOAP_LENGTH; return NULL; } #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { if (flag == 3) soap->dom->tail = t; else soap->dom->data = t; } #endif if (flag == 2) if (soap_s2QName(soap, t, &t, minlen, maxlen)) return NULL; return t; } #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_wstring_out(struct soap *soap, const wchar_t *s, int flag) { const char *t; char tmp; register soap_wchar c; #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { wchar_t *r = (wchar_t*)s; int n = 1; while (*r++) n++; soap->dom->wide = r = (wchar_t*)soap_malloc(soap, n * sizeof(wchar_t)); while (n--) *r++ = *s++; return SOAP_OK; } #endif while ((c = *s++)) { switch (c) { case 0x09: if (flag) t = " "; else t = "\t"; break; case 0x0A: if (flag || !(soap->mode & SOAP_XML_CANONICAL)) t = " "; else t = "\n"; break; case 0x0D: t = " "; break; case '&': t = "&"; break; case '<': t = "<"; break; case '>': if (flag) t = ">"; else t = ">"; break; case '"': if (flag) t = """; else t = "\""; break; default: if (c >= 0x20 && c < 0x80) { tmp = (char)c; if (soap_send_raw(soap, &tmp, 1)) return soap->error; } else /* check UTF16 encoding when wchar_t is too small to hold UCS */ { if (sizeof(wchar_t) < 4 && (c & 0xD800) == 0xD800) { /* http://unicode.org/faq/utf_bom.html#utf16-2 */ if ((*s & 0xD800) == 0xD800) c = (c << 10) + *s++ + 0x10000 - (0xD800 << 10) - 0xDC00; else c = 0xFFFD; /* Malformed */ } if (soap_pututf8(soap, (unsigned long)c)) return soap->error; } continue; } if (soap_send(soap, t)) return soap->error; } return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_2 SOAP_FMAC1 wchar_t * SOAP_FMAC2 soap_wstring_in(struct soap *soap, int flag, long minlen, long maxlen) { wchar_t *s; register int i, n = 0, f = 0; register long l = 0; register soap_wchar c; char *t = NULL; DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Reading wide string content\n")); if (soap->peeked) { if (*soap->tag) { #ifndef WITH_LEAN struct soap_attribute *tp; t = soap->tmpbuf; *t = '<'; t[sizeof(soap->tmpbuf)-1] = '\0'; strncpy(t + 1, soap->tag, sizeof(soap->tmpbuf) - 2); t += strlen(t); for (tp = soap->attributes; tp; tp = tp->next) { if (tp->visible) { if (t >= soap->tmpbuf + sizeof(soap->tmpbuf) - 2) break; *t++ = ' '; strcpy(t, tp->name); t += strlen(t); if (t >= soap->tmpbuf + sizeof(soap->tmpbuf) - 2) break; if (tp->value) { *t++ = '='; *t++ = '"'; strcpy(t, tp->value); t += strlen(t); *t++ = '"'; } } } if (!soap->body) *t++ = '/'; *t++ = '>'; *t = '\0'; t = soap->tmpbuf; #endif if (soap->body) n = 1; f = 1; soap->peeked = 0; } } if (soap_new_block(soap) == NULL) return NULL; for (;;) { if (!(s = (wchar_t*)soap_push_block(soap, NULL, sizeof(wchar_t)*SOAP_BLKLEN))) return NULL; for (i = 0; i < SOAP_BLKLEN; i++) { if (t) { *s++ = (wchar_t)*t++; if (!*t) t = NULL; continue; } c = soap_getutf8(soap); switch (c) { case SOAP_TT: if (n == 0) goto end; n--; *s++ = '<'; soap_unget(soap, '/'); break; case SOAP_LT: if (f && n == 0) goto end; n++; *s++ = '<'; break; case SOAP_GT: *s++ = '>'; break; case SOAP_QT: *s++ = '"'; break; case SOAP_AP: *s++ = '\''; break; case '/': if (n > 0) { c = soap_getutf8(soap); if (c == SOAP_GT) n--; soap_unget(soap, c); } *s++ = '/'; break; case '<': if (flag) *s++ = (soap_wchar)'<'; else { *s++ = (soap_wchar)'&'; t = (char*)"lt;"; } break; case '>': if (flag) *s++ = (soap_wchar)'>'; else { *s++ = (soap_wchar)'&'; t = (char*)"gt;"; } break; case '"': if (flag) *s++ = (soap_wchar)'"'; else { *s++ = (soap_wchar)'&'; t = (char*)"quot;"; } break; default: if ((int)c == EOF) goto end; if (sizeof(wchar_t) < 4 && c > 0xFFFF) { soap_wchar c1, c2; /* http://unicode.org/faq/utf_bom.html#utf16-2 */ c1 = 0xD800 - (0x10000 >> 10) + (c >> 10); c2 = 0xDC00 + (c & 0x3FF); c = c1; soap_unget(soap, c2); } *s++ = (wchar_t)c & 0x7FFFFFFF; } l++; if (maxlen >= 0 && l > maxlen) { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "String too long: maxlen=%ld\n", maxlen)); soap->error = SOAP_LENGTH; return NULL; } } } end: soap_unget(soap, c); *s = '\0'; soap_size_block(soap, NULL, sizeof(wchar_t) * (i + 1)); if (l < minlen) { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "String too short: %ld chars, minlen=%ld\n", l, minlen)); soap->error = SOAP_LENGTH; return NULL; } s = (wchar_t*)soap_save_block(soap, NULL, NULL, 0); #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) soap->dom->wide = s; #endif return s; } #endif #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_int2s(struct soap *soap, int n) { return soap_long2s(soap, (long)n); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outint(struct soap *soap, const char *tag, int id, const int *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_long2s(soap, (long)*p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2int(struct soap *soap, const char *s, int *p) { if (s) { long n; char *r; #ifndef WITH_NOIO #ifndef WITH_LEAN soap_reset_errno; #endif #endif n = soap_strtol(s, &r, 10); if (s == r || *r #ifndef WITH_LEAN || n != (int)n #endif #ifndef WITH_NOIO #ifndef WITH_LEAN || soap_errno == SOAP_ERANGE #endif #endif ) soap->error = SOAP_TYPE; *p = (int)n; } return soap->error; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int * SOAP_FMAC2 soap_inint(struct soap *soap, const char *tag, int *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; #ifndef WITH_LEAN if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":int") && soap_match_tag(soap, soap->type, ":short") && soap_match_tag(soap, soap->type, ":byte")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } #endif p = (int*)soap_id_enter(soap, soap->id, p, t, sizeof(int), 0, NULL, NULL, NULL); if (*soap->href) p = (int*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(int), 0, NULL); else if (p) { if (soap_s2int(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_long2s(struct soap *soap, long n) { sprintf(soap->tmpbuf, "%ld", n); return soap->tmpbuf; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outlong(struct soap *soap, const char *tag, int id, const long *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_long2s(soap, *p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2long(struct soap *soap, const char *s, long *p) { if (s) { char *r; #ifndef WITH_NOIO #ifndef WITH_LEAN soap_reset_errno; #endif #endif *p = soap_strtol(s, &r, 10); if (s == r || *r #ifndef WITH_NOIO #ifndef WITH_LEAN || soap_errno == SOAP_ERANGE #endif #endif ) soap->error = SOAP_TYPE; } return soap->error; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 long * SOAP_FMAC2 soap_inlong(struct soap *soap, const char *tag, long *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; #ifndef WITH_LEAN if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":int") && soap_match_tag(soap, soap->type, ":short") && soap_match_tag(soap, soap->type, ":byte")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } #endif p = (long*)soap_id_enter(soap, soap->id, p, t, sizeof(long), 0, NULL, NULL, NULL); if (*soap->href) p = (long*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(long), 0, NULL); else if (p) { if (soap_s2long(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 const char* SOAP_FMAC2 soap_LONG642s(struct soap *soap, LONG64 n) { sprintf(soap->tmpbuf, SOAP_LONG_FORMAT, n); return soap->tmpbuf; } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 int SOAP_FMAC2 soap_outLONG64(struct soap *soap, const char *tag, int id, const LONG64 *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_LONG642s(soap, *p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 int SOAP_FMAC2 soap_s2LONG64(struct soap *soap, const char *s, LONG64 *p) { if (s) { #ifdef HAVE_STRTOLL char *r; #ifndef WITH_NOIO #ifndef WITH_LEAN soap_reset_errno; #endif #endif *p = strtoll(s, &r, 10); if (s == r || *r #ifndef WITH_NOIO #ifndef WITH_LEAN || soap_errno == SOAP_ERANGE #endif #endif ) #else # ifdef HAVE_SSCANF if (sscanf(s, SOAP_LONG_FORMAT, p) != 1) # endif #endif soap->error = SOAP_TYPE; } return soap->error; } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 LONG64 * SOAP_FMAC2 soap_inLONG64(struct soap *soap, const char *tag, LONG64 *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; #ifndef WITH_LEAN if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":integer") && soap_match_tag(soap, soap->type, ":positiveInteger") && soap_match_tag(soap, soap->type, ":negativeInteger") && soap_match_tag(soap, soap->type, ":nonPositiveInteger") && soap_match_tag(soap, soap->type, ":nonNegativeInteger") && soap_match_tag(soap, soap->type, ":long") && soap_match_tag(soap, soap->type, ":int") && soap_match_tag(soap, soap->type, ":short") && soap_match_tag(soap, soap->type, ":byte")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } #endif p = (LONG64*)soap_id_enter(soap, soap->id, p, t, sizeof(LONG64), 0, NULL, NULL, NULL); if (*soap->href) p = (LONG64*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(LONG64), 0, NULL); else if (p) { if (soap_s2LONG64(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_byte2s(struct soap *soap, char n) { return soap_long2s(soap, (long)n); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outbyte(struct soap *soap, const char *tag, int id, const char *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_long2s(soap, (long)*p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2byte(struct soap *soap, const char *s, char *p) { if (s) { long n; char *r; n = soap_strtol(s, &r, 10); if (s == r || *r || n < -128 || n > 127) soap->error = SOAP_TYPE; *p = (char)n; } return soap->error; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 char * SOAP_FMAC2 soap_inbyte(struct soap *soap, const char *tag, char *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; #ifndef WITH_LEAN if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":byte")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } #endif p = (char*)soap_id_enter(soap, soap->id, p, t, sizeof(char), 0, NULL, NULL, NULL); if (*soap->href) p = (char*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(char), 0, NULL); else if (p) { if (soap_s2byte(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_short2s(struct soap *soap, short n) { return soap_long2s(soap, (long)n); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outshort(struct soap *soap, const char *tag, int id, const short *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_long2s(soap, (long)*p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2short(struct soap *soap, const char *s, short *p) { if (s) { long n; char *r; n = soap_strtol(s, &r, 10); if (s == r || *r || n < -32768 || n > 32767) soap->error = SOAP_TYPE; *p = (short)n; } return soap->error; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 short * SOAP_FMAC2 soap_inshort(struct soap *soap, const char *tag, short *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; #ifndef WITH_LEAN if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":short") && soap_match_tag(soap, soap->type, ":byte")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } #endif p = (short*)soap_id_enter(soap, soap->id, p, t, sizeof(short), 0, NULL, NULL, NULL); if (*soap->href) p = (short*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(short), 0, NULL); else if (p) { if (soap_s2short(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_float2s(struct soap *soap, float n) { char *s; if (soap_isnan((double)n)) return "NaN"; if (soap_ispinff(n)) return "INF"; if (soap_isninff(n)) return "-INF"; s = soap->tmpbuf; #if defined(HAVE_SPRINTF_L) # ifdef WIN32 _sprintf_s_l(s, _countof(soap->tmpbuf), soap->float_format, soap->c_locale, n); # else sprintf_l(s, soap->c_locale, soap->float_format, n); # endif #else sprintf(s, soap->float_format, n); s = strchr(s, ','); /* convert decimal comma to DP */ if (s) *s = '.'; #endif return soap->tmpbuf; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outfloat(struct soap *soap, const char *tag, int id, const float *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_float2s(soap, *p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2float(struct soap *soap, const char *s, float *p) { if (s) { if (!*s) return soap->error = SOAP_TYPE; if (!soap_tag_cmp(s, "INF")) *p = FLT_PINFTY; else if (!soap_tag_cmp(s, "+INF")) *p = FLT_PINFTY; else if (!soap_tag_cmp(s, "-INF")) *p = FLT_NINFTY; else if (!soap_tag_cmp(s, "NaN")) *p = FLT_NAN; else { /* On some systems strtof requires -std=c99 or does not even link: so we try to use strtod first */ #if defined(HAVE_STRTOD_L) char *r; # ifdef WIN32 *p = (float)_strtod_l(s, &r, soap->c_locale); # else *p = (float)strtod_l(s, &r, soap->c_locale); # endif if (*r) #elif defined(HAVE_STRTOD) char *r; *p = (float)strtod(s, &r); if (*r) #elif defined(HAVE_STRTOF_L) char *r; *p = strtof_l((char*)s, &r, soap->c_locale); if (*r) #elif defined(HAVE_STRTOF) char *r; *p = strtof((char*)s, &r); if (*r) #endif { #if defined(HAVE_SSCANF_L) && !defined(HAVE_STRTOF_L) && !defined(HAVE_STRTOD_L) if (sscanf_l(s, soap->c_locale, "%g", p) != 1) soap->error = SOAP_TYPE; #elif defined(HAVE_SSCANF) if (sscanf(s, "%g", p) != 1) soap->error = SOAP_TYPE; #else soap->error = SOAP_TYPE; #endif } } } return soap->error; } #endif /******************************************************************************/ #ifndef WITH_LEAN static int soap_isnumeric(struct soap *soap, const char *type) { if (soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":float") && soap_match_tag(soap, soap->type, ":double") && soap_match_tag(soap, soap->type, ":decimal") && soap_match_tag(soap, soap->type, ":integer") && soap_match_tag(soap, soap->type, ":positiveInteger") && soap_match_tag(soap, soap->type, ":negativeInteger") && soap_match_tag(soap, soap->type, ":nonPositiveInteger") && soap_match_tag(soap, soap->type, ":nonNegativeInteger") && soap_match_tag(soap, soap->type, ":long") && soap_match_tag(soap, soap->type, ":int") && soap_match_tag(soap, soap->type, ":short") && soap_match_tag(soap, soap->type, ":byte") && soap_match_tag(soap, soap->type, ":unsignedLong") && soap_match_tag(soap, soap->type, ":unsignedInt") && soap_match_tag(soap, soap->type, ":unsignedShort") && soap_match_tag(soap, soap->type, ":unsignedByte")) { soap->error = SOAP_TYPE; soap_revert(soap); return SOAP_ERR; } return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 float * SOAP_FMAC2 soap_infloat(struct soap *soap, const char *tag, float *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; #ifndef WITH_LEAN if (*soap->type != '\0' && soap_isnumeric(soap, type)) return NULL; #endif p = (float*)soap_id_enter(soap, soap->id, p, t, sizeof(float), 0, NULL, NULL, NULL); if (*soap->href) p = (float*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(float), 0, NULL); else if (p) { if (soap_s2float(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_double2s(struct soap *soap, double n) { char *s; if (soap_isnan(n)) return "NaN"; if (soap_ispinfd(n)) return "INF"; if (soap_isninfd(n)) return "-INF"; s = soap->tmpbuf; #if defined(HAVE_SPRINTF_L) # ifdef WIN32 _sprintf_s_l(s, _countof(soap->tmpbuf), soap->double_format, soap->c_locale, n); # else sprintf_l(s, soap->c_locale, soap->double_format, n); # endif #else sprintf(s, soap->double_format, n); s = strchr(s, ','); /* convert decimal comma to DP */ if (s) *s = '.'; #endif return soap->tmpbuf; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outdouble(struct soap *soap, const char *tag, int id, const double *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_double2s(soap, *p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2double(struct soap *soap, const char *s, double *p) { if (s) { if (!*s) return soap->error = SOAP_TYPE; if (!soap_tag_cmp(s, "INF")) *p = DBL_PINFTY; else if (!soap_tag_cmp(s, "+INF")) *p = DBL_PINFTY; else if (!soap_tag_cmp(s, "-INF")) *p = DBL_NINFTY; else if (!soap_tag_cmp(s, "NaN")) *p = DBL_NAN; else { #if defined(HAVE_STRTOD_L) char *r; # ifdef WIN32 *p = _strtod_l(s, &r, soap->c_locale); # else *p = strtod_l(s, &r, soap->c_locale); # endif if (*r) #elif defined(HAVE_STRTOD) char *r; *p = strtod(s, &r); if (*r) #endif { #if defined(HAVE_SSCANF_L) && !defined(HAVE_STRTOF_L) && !defined(HAVE_STRTOD_L) if (sscanf_l(s, soap->c_locale, "%lg", p) != 1) soap->error = SOAP_TYPE; #elif defined(HAVE_SSCANF) if (sscanf(s, "%lg", p) != 1) soap->error = SOAP_TYPE; #else soap->error = SOAP_TYPE; #endif } } } return soap->error; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 double * SOAP_FMAC2 soap_indouble(struct soap *soap, const char *tag, double *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; #ifndef WITH_LEAN if (*soap->type != '\0' && soap_isnumeric(soap, type)) return NULL; #endif p = (double*)soap_id_enter(soap, soap->id, p, t, sizeof(double), 0, NULL, NULL, NULL); if (*soap->href) p = (double*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(double), 0, NULL); else if (p) { if (soap_s2double(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedByte2s(struct soap *soap, unsigned char n) { return soap_unsignedLong2s(soap, (unsigned long)n); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outunsignedByte(struct soap *soap, const char *tag, int id, const unsigned char *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_unsignedLong2s(soap, (unsigned long)*p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedByte(struct soap *soap, const char *s, unsigned char *p) { if (s) { unsigned long n; char *r; n = soap_strtoul(s, &r, 10); if (s == r || *r || n > 255) soap->error = SOAP_TYPE; *p = (unsigned char)n; } return soap->error; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 unsigned char * SOAP_FMAC2 soap_inunsignedByte(struct soap *soap, const char *tag, unsigned char *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; #ifndef WITH_LEAN if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":unsignedByte")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } #endif p = (unsigned char*)soap_id_enter(soap, soap->id, p, t, sizeof(unsigned char), 0, NULL, NULL, NULL); if (*soap->href) p = (unsigned char*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(unsigned char), 0, NULL); else if (p) { if (soap_s2unsignedByte(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedShort2s(struct soap *soap, unsigned short n) { return soap_unsignedLong2s(soap, (unsigned long)n); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outunsignedShort(struct soap *soap, const char *tag, int id, const unsigned short *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_unsignedLong2s(soap, (unsigned long)*p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedShort(struct soap *soap, const char *s, unsigned short *p) { if (s) { unsigned long n; char *r; n = soap_strtoul(s, &r, 10); if (s == r || *r || n > 65535) soap->error = SOAP_TYPE; *p = (unsigned short)n; } return soap->error; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 unsigned short * SOAP_FMAC2 soap_inunsignedShort(struct soap *soap, const char *tag, unsigned short *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; #ifndef WITH_LEAN if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":unsignedShort") && soap_match_tag(soap, soap->type, ":unsignedByte")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } #endif p = (unsigned short*)soap_id_enter(soap, soap->id, p, t, sizeof(unsigned short), 0, NULL, NULL, NULL); if (*soap->href) p = (unsigned short*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(unsigned short), 0, NULL); else if (p) { if (soap_s2unsignedShort(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedInt2s(struct soap *soap, unsigned int n) { return soap_unsignedLong2s(soap, (unsigned long)n); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outunsignedInt(struct soap *soap, const char *tag, int id, const unsigned int *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_unsignedLong2s(soap, (unsigned long)*p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedInt(struct soap *soap, const char *s, unsigned int *p) { if (s) { char *r; #ifndef WITH_NOIO #ifndef WITH_LEAN soap_reset_errno; #endif #endif *p = (unsigned int)soap_strtoul(s, &r, 10); if ((s == r && (soap->mode & SOAP_XML_STRICT)) || *r #ifndef WITH_NOIO #ifndef WITH_LEAN || soap_errno == SOAP_ERANGE #endif #endif ) soap->error = SOAP_TYPE; } return soap->error; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 unsigned int * SOAP_FMAC2 soap_inunsignedInt(struct soap *soap, const char *tag, unsigned int *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; #ifndef WITH_LEAN if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":unsignedInt") && soap_match_tag(soap, soap->type, ":unsignedShort") && soap_match_tag(soap, soap->type, ":unsignedByte")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } #endif p = (unsigned int*)soap_id_enter(soap, soap->id, p, t, sizeof(unsigned int), 0, NULL, NULL, NULL); if (*soap->href) p = (unsigned int*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(unsigned int), 0, NULL); else if (p) { if (soap_s2unsignedInt(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedLong2s(struct soap *soap, unsigned long n) { sprintf(soap->tmpbuf, "%lu", n); return soap->tmpbuf; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outunsignedLong(struct soap *soap, const char *tag, int id, const unsigned long *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_unsignedLong2s(soap, *p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedLong(struct soap *soap, const char *s, unsigned long *p) { if (s) { char *r; #ifndef WITH_NOIO #ifndef WITH_LEAN soap_reset_errno; #endif #endif *p = soap_strtoul(s, &r, 10); if ((s == r && (soap->mode & SOAP_XML_STRICT)) || *r #ifndef WITH_NOIO #ifndef WITH_LEAN || soap_errno == SOAP_ERANGE #endif #endif ) soap->error = SOAP_TYPE; } return soap->error; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 unsigned long * SOAP_FMAC2 soap_inunsignedLong(struct soap *soap, const char *tag, unsigned long *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; #ifndef WITH_LEAN if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":unsignedInt") && soap_match_tag(soap, soap->type, ":unsignedShort") && soap_match_tag(soap, soap->type, ":unsignedByte")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } #endif p = (unsigned long*)soap_id_enter(soap, soap->id, p, t, sizeof(unsigned long), 0, NULL, NULL, NULL); if (*soap->href) p = (unsigned long*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(unsigned long), 0, NULL); else if (p) { if (soap_s2unsignedLong(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 const char* SOAP_FMAC2 soap_ULONG642s(struct soap *soap, ULONG64 n) { sprintf(soap->tmpbuf, SOAP_ULONG_FORMAT, n); return soap->tmpbuf; } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 int SOAP_FMAC2 soap_outULONG64(struct soap *soap, const char *tag, int id, const ULONG64 *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_ULONG642s(soap, *p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 int SOAP_FMAC2 soap_s2ULONG64(struct soap *soap, const char *s, ULONG64 *p) { if (s) { #ifdef HAVE_STRTOULL char *r; #ifndef WITH_NOIO #ifndef WITH_LEAN soap_reset_errno; #endif #endif *p = strtoull(s, &r, 10); if ((s == r && (soap->mode & SOAP_XML_STRICT)) || *r #ifndef WITH_NOIO #ifndef WITH_LEAN || soap_errno == SOAP_ERANGE #endif #endif ) #else #ifdef HAVE_SSCANF if (sscanf(s, SOAP_ULONG_FORMAT, p) != 1) #endif #endif soap->error = SOAP_TYPE; } return soap->error; } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 ULONG64 * SOAP_FMAC2 soap_inULONG64(struct soap *soap, const char *tag, ULONG64 *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":positiveInteger") && soap_match_tag(soap, soap->type, ":nonNegativeInteger") && soap_match_tag(soap, soap->type, ":unsignedLong") && soap_match_tag(soap, soap->type, ":unsignedInt") && soap_match_tag(soap, soap->type, ":unsignedShort") && soap_match_tag(soap, soap->type, ":unsignedByte")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } p = (ULONG64*)soap_id_enter(soap, soap->id, p, t, sizeof(ULONG64), 0, NULL, NULL, NULL); if (*soap->href) p = (ULONG64*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(ULONG64), 0, NULL); else if (p) { if (soap_s2ULONG64(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2string(struct soap *soap, const char *s, char **t, long minlen, long maxlen) { if (s) { long l = (long)strlen(s); if ((maxlen >= 0 && l > maxlen) || l < minlen) return soap->error = SOAP_LENGTH; if (!(*t = soap_strdup(soap, s))) return soap->error = SOAP_EOM; if (!(soap->mode & (SOAP_ENC_LATIN | SOAP_C_UTFSTRING))) { char *r = *t; /* remove non-ASCII chars */ for (s = *t; *s; s++) if (!(*s & 0x80)) *r++ = *s; *r = '\0'; } } return soap->error; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2QName(struct soap *soap, const char *s, char **t, long minlen, long maxlen) { if (s) { long l = (long)strlen(s); if ((maxlen >= 0 && l > maxlen) || l < minlen) return soap->error = SOAP_LENGTH; soap->labidx = 0; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Normalized namespace(s) of QNames '%s'", s)); /* convert (by prefix normalize prefix) all QNames in s */ for (;;) { size_t n; struct soap_nlist *np; register const char *p; /* skip blanks */ while (*s && soap_blank((soap_wchar)*s)) s++; if (!*s) break; /* find next QName */ n = 1; while (s[n] && !soap_blank((soap_wchar)s[n])) n++; np = soap->nlist; /* if there is no namespace stack, or prefix is "xml" then copy string */ if (!np || !strncmp(s, "xml:", 4)) { soap_append_lab(soap, s, n); } else /* we normalize the QName by replacing its prefix */ { const char *q; for (p = s; *p && p < s + n; p++) if (*p == ':') break; if (*p == ':') { size_t k = p - s; while (np && (strncmp(np->id, s, k) || np->id[k])) np = np->next; p++; } else { while (np && *np->id) np = np->next; p = s; } /* replace prefix */ if (np) { if (np->index >= 0 && soap->local_namespaces && (q = soap->local_namespaces[np->index].id)) { size_t k = strlen(q); if (q[k-1] != '_') soap_append_lab(soap, q, k); else { soap_append_lab(soap, "\"", 1); soap_append_lab(soap, soap->local_namespaces[np->index].ns, strlen(soap->local_namespaces[np->index].ns)); soap_append_lab(soap, "\"", 1); } } else if (np->ns) { soap_append_lab(soap, "\"", 1); soap_append_lab(soap, np->ns, strlen(np->ns)); soap_append_lab(soap, "\"", 1); } else { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\nNamespace prefix of '%s' not defined (index=%d, URI=%s)\n", s, np->index, np->ns ? np->ns : SOAP_STR_EOS)); return soap->error = SOAP_NAMESPACE; } } else if (s[n]) /* no namespace, part of string */ { soap_append_lab(soap, s, n); } else /* no namespace: assume "" namespace */ { soap_append_lab(soap, "\"\"", 2); } soap_append_lab(soap, ":", 1); soap_append_lab(soap, p, n - (p-s)); } /* advance to next and add spacing */ s += n; if (*s) soap_append_lab(soap, " ", 1); } soap_append_lab(soap, SOAP_STR_EOS, 1); *t = soap_strdup(soap, soap->labbuf); DBGLOG(TEST, SOAP_MESSAGE(fdebug, " into '%s'\n", *t)); } return soap->error; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_QName2s(struct soap *soap, const char *s) { const char *t = NULL; if (s) { soap->labidx = 0; for (;;) { size_t n; /* skip blanks */ while (*s && soap_blank((soap_wchar)*s)) s++; if (!*s) break; /* find next QName */ n = 1; while (s[n] && !soap_blank((soap_wchar)s[n])) n++; /* normal prefix: pass string as is */ if (*s != '"') { soap_append_lab(soap, s, n); #ifndef WITH_LEAN if ((soap->mode & SOAP_XML_CANONICAL)) soap_utilize_ns(soap, s); #endif } else /* URL-based string prefix */ { const char *q; s++; q = strchr(s, '"'); if (q) { struct Namespace *p = soap->local_namespaces; if (p) { for (; p->id; p++) { if (p->ns) if (!soap_tag_cmp(s, p->ns)) break; if (p->in) if (!soap_tag_cmp(s, p->in)) break; } } /* URL is in the namespace table? */ if (p && p->id) { soap_append_lab(soap, p->id, strlen(p->id)); } else /* not in namespace table: create xmlns binding */ { char *r = soap_strdup(soap, s); r[q-s] = '\0'; sprintf(soap->tmpbuf, "xmlns:_%d", soap->idnum++); soap_set_attr(soap, soap->tmpbuf, r, 1); soap_append_lab(soap, soap->tmpbuf + 6, strlen(soap->tmpbuf + 6)); } soap_append_lab(soap, q + 1, n - (q-s) - 1); } } /* advance to next and add spacing */ s += n; if (*s) soap_append_lab(soap, " ", 1); } soap_append_lab(soap, SOAP_STR_EOS, 1); t = soap_strdup(soap, soap->labbuf); } return t; } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 int SOAP_FMAC2 soap_s2wchar(struct soap *soap, const char *s, wchar_t **t, long minlen, long maxlen) { if (s) { long l; wchar_t *r; *t = r = (wchar_t*)soap_malloc(soap, sizeof(wchar_t) * (strlen(s) + 1)); if (!r) return soap->error = SOAP_EOM; if (soap->mode & SOAP_ENC_LATIN) { while (*s) *r++ = (wchar_t)*s++; } else { /* Convert UTF8 to wchar */ while (*s) { register soap_wchar c, c1, c2, c3, c4; c = (unsigned char)*s++; if (c < 0x80) *r++ = (wchar_t)c; else { c1 = (soap_wchar)*s++ & 0x3F; if (c < 0xE0) *r++ = (wchar_t)(((soap_wchar)(c & 0x1F) << 6) | c1); else { c2 = (soap_wchar)*s++ & 0x3F; if (c < 0xF0) *r++ = (wchar_t)(((soap_wchar)(c & 0x0F) << 12) | (c1 << 6) | c2); else { c3 = (soap_wchar)*s++ & 0x3F; if (c < 0xF8) *r++ = (wchar_t)(((soap_wchar)(c & 0x07) << 18) | (c1 << 12) | (c2 << 6) | c3); else { c4 = (soap_wchar)*s++ & 0x3F; if (c < 0xFC) *r++ = (wchar_t)(((soap_wchar)(c & 0x03) << 24) | (c1 << 18) | (c2 << 12) | (c3 << 6) | c4); else *r++ = (wchar_t)(((soap_wchar)(c & 0x01) << 30) | (c1 << 24) | (c2 << 18) | (c3 << 12) | (c4 << 6) | (soap_wchar)(*s++ & 0x3F)); } } } } } } *r = L'\0'; l = (long)(r - *t); if ((maxlen >= 0 && l > maxlen) || l < minlen) return soap->error = SOAP_LENGTH; } return soap->error; } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 const char* SOAP_FMAC2 soap_wchar2s(struct soap *soap, const wchar_t *s) { register soap_wchar c; register char *r, *t; const wchar_t *q = s; size_t n = 0; while ((c = *q++)) { if (c > 0 && c < 0x80) n++; else n += 6; } r = t = (char*)soap_malloc(soap, n + 1); if (r) { /* Convert wchar to UTF8 */ while ((c = *s++)) { if (c > 0 && c < 0x80) *t++ = (char)c; else { if (c < 0x0800) *t++ = (char)(0xC0 | ((c >> 6) & 0x1F)); else { if (c < 0x010000) *t++ = (char)(0xE0 | ((c >> 12) & 0x0F)); else { if (c < 0x200000) *t++ = (char)(0xF0 | ((c >> 18) & 0x07)); else { if (c < 0x04000000) *t++ = (char)(0xF8 | ((c >> 24) & 0x03)); else { *t++ = (char)(0xFC | ((c >> 30) & 0x01)); *t++ = (char)(0x80 | ((c >> 24) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 18) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 12) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 6) & 0x3F)); } *t++ = (char)(0x80 | (c & 0x3F)); } } *t = '\0'; } return r; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outstring(struct soap *soap, const char *tag, int id, char *const*p, const char *type, int n) { id = soap_element_id(soap, tag, id, *p, NULL, 0, type, n); if (id < 0) return soap->error; if (!**p && (soap->mode & SOAP_C_NILSTRING)) return soap_element_null(soap, tag, id, type); if (soap_element_begin_out(soap, tag, id, type) || soap_string_out(soap, *p, 0) || soap_element_end_out(soap, tag)) return soap->error; return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 char ** SOAP_FMAC2 soap_instring(struct soap *soap, const char *tag, char **p, const char *type, int t, int flag, long minlen, long maxlen) { (void)type; if (soap_element_begin_in(soap, tag, 1, NULL)) { if (!tag || *tag != '-' || soap->error != SOAP_NO_TAG) return NULL; soap->error = SOAP_OK; } if (!p) { if (!(p = (char**)soap_malloc(soap, sizeof(char*)))) return NULL; } if (soap->null) *p = NULL; else if (soap->body) { *p = soap_string_in(soap, flag, minlen, maxlen); if (!*p || !(char*)soap_id_enter(soap, soap->id, *p, t, sizeof(char*), 0, NULL, NULL, NULL)) return NULL; if (!**p && tag && *tag == '-') { soap->error = SOAP_NO_TAG; return NULL; } } else if (tag && *tag == '-') { soap->error = SOAP_NO_TAG; return NULL; } else if (!*soap->href && minlen > 0) { soap->error = SOAP_LENGTH; return NULL; } else *p = soap_strdup(soap, SOAP_STR_EOS); if (*soap->href) p = (char**)soap_id_lookup(soap, soap->href, (void**)p, t, sizeof(char**), 0); if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outwstring(struct soap *soap, const char *tag, int id, wchar_t *const*p, const char *type, int n) { id = soap_element_id(soap, tag, id, *p, NULL, 0, type, n); if (id < 0) return soap->error; if (!**p && (soap->mode & SOAP_C_NILSTRING)) return soap_element_null(soap, tag, id, type); if (soap_element_begin_out(soap, tag, id, type) || soap_wstring_out(soap, *p, 0) || soap_element_end_out(soap, tag)) return soap->error; return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_2 SOAP_FMAC1 wchar_t ** SOAP_FMAC2 soap_inwstring(struct soap *soap, const char *tag, wchar_t **p, const char *type, int t, long minlen, long maxlen) { (void)type; if (soap_element_begin_in(soap, tag, 1, NULL)) { if (!tag || *tag != '-' || soap->error != SOAP_NO_TAG) return NULL; soap->error = SOAP_OK; } if (!p) { if (!(p = (wchar_t**)soap_malloc(soap, sizeof(wchar_t*)))) return NULL; } if (soap->body) { *p = soap_wstring_in(soap, 1, minlen, maxlen); if (!*p || !(wchar_t*)soap_id_enter(soap, soap->id, *p, t, sizeof(wchar_t*), 0, NULL, NULL, NULL)) return NULL; if (!**p && tag && *tag == '-') { soap->error = SOAP_NO_TAG; return NULL; } } else if (tag && *tag == '-') { soap->error = SOAP_NO_TAG; return NULL; } else if (soap->null) *p = NULL; else *p = soap_wstrdup(soap, (wchar_t*)SOAP_STR_EOS); if (*soap->href) p = (wchar_t**)soap_id_lookup(soap, soap->href, (void**)p, t, sizeof(wchar_t**), 0); if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 time_t SOAP_FMAC2 soap_timegm(struct tm *T) { #if defined(HAVE_TIMEGM) return timegm(T); #else time_t t, g, z; struct tm tm; t = mktime(T); if (t == (time_t)-1) return (time_t)-1; #ifdef HAVE_GMTIME_R gmtime_r(&t, &tm); #else tm = *gmtime(&t); #endif tm.tm_isdst = 0; g = mktime(&tm); if (g == (time_t)-1) return (time_t)-1; z = g - t; return t - z; #endif } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 const char* SOAP_FMAC2 soap_dateTime2s(struct soap *soap, time_t n) { struct tm T, *pT = &T; #if defined(HAVE_GMTIME_R) if (gmtime_r(&n, pT)) strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%SZ", pT); #elif defined(HAVE_GMTIME) if ((pT = gmtime(&n))) strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%SZ", pT); #elif defined(HAVE_GETTIMEOFDAY) struct timezone tz; memset((void*)&tz, 0, sizeof(tz)); #if defined(HAVE_LOCALTIME_R) if (localtime_r(&n, pT)) { struct timeval tv; gettimeofday(&tv, &tz); strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT); sprintf(soap->tmpbuf + strlen(soap->tmpbuf), "%+03d:%02d", -tz.tz_minuteswest/60+(pT->tm_isdst!=0), abs(tz.tz_minuteswest)%60); } #else if ((pT = localtime(&n))) { struct timeval tv; gettimeofday(&tv, &tz); strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT); sprintf(soap->tmpbuf + strlen(soap->tmpbuf), "%+03d:%02d", -tz.tz_minuteswest/60+(pT->tm_isdst!=0), abs(tz.tz_minuteswest)%60); } #endif #elif defined(HAVE_FTIME) struct timeb t; memset((void*)&t, 0, sizeof(t)); #if defined(HAVE_LOCALTIME_R) if (localtime_r(&n, pT)) { #ifdef __BORLANDC__ ::ftime(&t); #else ftime(&t); #endif strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT); sprintf(soap->tmpbuf + strlen(soap->tmpbuf), "%+03d:%02d", -t.timezone/60+(pT->tm_isdst!=0), abs(t.timezone)%60); } #else if ((pT = localtime(&n))) { #ifdef __BORLANDC__ ::ftime(&t); #else ftime(&t); #endif strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT); sprintf(soap->tmpbuf + strlen(soap->tmpbuf), "%+03d:%02d", -t.timezone/60+(pT->tm_isdst!=0), abs(t.timezone)%60); } #endif #elif defined(HAVE_LOCALTIME_R) if (localtime_r(&n, pT)) strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT); #else if ((pT = localtime(&n))) strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT); #endif else strcpy(soap->tmpbuf, "1969-12-31T23:59:59Z"); return soap->tmpbuf; } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 int SOAP_FMAC2 soap_outdateTime(struct soap *soap, const char *tag, int id, const time_t *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_dateTime2s(soap, *p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 int SOAP_FMAC2 soap_s2dateTime(struct soap *soap, const char *s, time_t *p) { if (s) { char zone[32]; struct tm T; const char *t; *zone = '\0'; memset((void*)&T, 0, sizeof(T)); if (strchr(s, '-')) t = "%d-%d-%dT%d:%d:%d%31s"; else if (strchr(s, ':')) t = "%4d%2d%2dT%d:%d:%d%31s"; else /* parse non-XSD-standard alternative ISO 8601 format */ t = "%4d%2d%2dT%2d%2d%2d%31s"; if (sscanf(s, t, &T.tm_year, &T.tm_mon, &T.tm_mday, &T.tm_hour, &T.tm_min, &T.tm_sec, zone) < 6) return soap->error = SOAP_TYPE; if (T.tm_year == 1) T.tm_year = 70; else T.tm_year -= 1900; T.tm_mon--; if (*zone == '.') { for (s = zone + 1; *s; s++) if (*s < '0' || *s > '9') break; } else s = zone; if (*s) { #ifndef WITH_NOZONE if (*s == '+' || *s == '-') { int h = 0, m = 0; if (s[3] == ':') { /* +hh:mm */ sscanf(s, "%d:%d", &h, &m); if (h < 0) m = -m; } else /* +hhmm */ { m = (int)soap_strtol(s, NULL, 10); h = m / 100; m = m % 100; } T.tm_min -= m; T.tm_hour -= h; /* put hour and min in range */ T.tm_hour += T.tm_min / 60; T.tm_min %= 60; if (T.tm_min < 0) { T.tm_min += 60; T.tm_hour--; } T.tm_mday += T.tm_hour / 24; T.tm_hour %= 24; if (T.tm_hour < 0) { T.tm_hour += 24; T.tm_mday--; } /* note: day of the month may be out of range, timegm() handles it */ } #endif *p = soap_timegm(&T); } else /* no UTC or timezone, so assume we got a localtime */ { T.tm_isdst = -1; *p = mktime(&T); } } return soap->error; } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 time_t * SOAP_FMAC2 soap_indateTime(struct soap *soap, const char *tag, time_t *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":dateTime")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } p = (time_t*)soap_id_enter(soap, soap->id, p, t, sizeof(time_t), 0, NULL, NULL, NULL); if (*soap->href) p = (time_t*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(time_t), 0, NULL); else if (p) { if (soap_s2dateTime(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outliteral(struct soap *soap, const char *tag, char *const*p, const char *type) { int i; const char *t = NULL; if (tag && *tag != '-') { if (soap->local_namespaces && (t = strchr(tag, ':'))) { strncpy(soap->tmpbuf, tag, t-tag); soap->tmpbuf[t-tag] = '\0'; for (i = 0; soap->local_namespaces[i].id; i++) if (!strcmp(soap->tmpbuf, soap->local_namespaces[i].id)) break; t++; if (soap_element(soap, t, 0, type) || soap_attribute(soap, "xmlns", soap->local_namespaces[i].ns ? soap->local_namespaces[i].ns : SOAP_STR_EOS) || soap_element_start_end_out(soap, NULL)) return soap->error; } else { t = tag; if (soap_element_begin_out(soap, t, 0, type)) return soap->error; } } if (p && *p) { if (soap_send(soap, *p)) return soap->error; } if (t) return soap_element_end_out(soap, t); return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 char ** SOAP_FMAC2 soap_inliteral(struct soap *soap, const char *tag, char **p) { if (soap_element_begin_in(soap, tag, 1, NULL)) { if (soap->error != SOAP_NO_TAG || soap_unget(soap, soap_get(soap)) == SOAP_TT) return NULL; soap->error = SOAP_OK; } if (!p) { if (!(p = (char**)soap_malloc(soap, sizeof(char*)))) return NULL; } if (soap->body || (tag && *tag == '-')) { *p = soap_string_in(soap, 0, -1, -1); if (!*p) return NULL; if (!**p && tag && *tag == '-') { soap->error = SOAP_NO_TAG; return NULL; } } else if (soap->null) *p = NULL; else *p = soap_strdup(soap, SOAP_STR_EOS); if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outwliteral(struct soap *soap, const char *tag, wchar_t *const*p, const char *type) { int i; const char *t = NULL; if (tag && *tag != '-') { if (soap->local_namespaces && (t = strchr(tag, ':'))) { strncpy(soap->tmpbuf, tag, t-tag); soap->tmpbuf[t-tag] = '\0'; for (i = 0; soap->local_namespaces[i].id; i++) if (!strcmp(soap->tmpbuf, soap->local_namespaces[i].id)) break; t++; if (soap_element(soap, t, 0, type) || soap_attribute(soap, "xmlns", soap->local_namespaces[i].ns ? soap->local_namespaces[i].ns : SOAP_STR_EOS) || soap_element_start_end_out(soap, NULL)) return soap->error; } else { t = tag; if (soap_element_begin_out(soap, t, 0, type)) return soap->error; } if (soap_send(soap, soap->tmpbuf)) return soap->error; } if (p) { wchar_t c; const wchar_t *s = *p; while ((c = *s++)) { if (soap_pututf8(soap, (unsigned long)c)) return soap->error; } } if (t) return soap_element_end_out(soap, t); return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_2 SOAP_FMAC1 wchar_t ** SOAP_FMAC2 soap_inwliteral(struct soap *soap, const char *tag, wchar_t **p) { if (soap_element_begin_in(soap, tag, 1, NULL)) { if (soap->error != SOAP_NO_TAG || soap_unget(soap, soap_get(soap)) == SOAP_TT) return NULL; soap->error = SOAP_OK; } if (!p) { if (!(p = (wchar_t**)soap_malloc(soap, sizeof(wchar_t*)))) return NULL; } if (soap->body) { *p = soap_wstring_in(soap, 0, -1, -1); if (!*p) return NULL; if (!**p && tag && *tag == '-') { soap->error = SOAP_NO_TAG; return NULL; } } else if (tag && *tag == '-') { soap->error = SOAP_NO_TAG; return NULL; } else if (soap->null) *p = NULL; else *p = soap_wstrdup(soap, (wchar_t*)SOAP_STR_EOS); if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char * SOAP_FMAC2 soap_value(struct soap *soap) { register size_t i; register soap_wchar c = 0; register char *s = soap->tmpbuf; if (!soap->body) return SOAP_STR_EOS; do c = soap_get(soap); while (soap_blank(c)); for (i = 0; i < sizeof(soap->tmpbuf) - 1; i++) { if (c == SOAP_TT || c == SOAP_LT || (int)c == EOF) break; *s++ = (char)c; c = soap_get(soap); } for (s--; i > 0; i--, s--) { if (!soap_blank((soap_wchar)*s)) break; } s[1] = '\0'; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element content value='%s'\n", soap->tmpbuf)); if (c == SOAP_TT || c == SOAP_LT || (int)c == EOF) soap_unget(soap, c); else if (soap->mode & SOAP_XML_STRICT) { soap->error = SOAP_LENGTH; return NULL; } #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) soap->dom->data = soap_strdup(soap, soap->tmpbuf); #endif return soap->tmpbuf; /* return non-null pointer */ } #endif /******************************************************************************/ #if !defined(WITH_LEANER) || !defined(WITH_NOHTTP) #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_getline(struct soap *soap, char *s, int len) { int i = len; soap_wchar c = 0; for (;;) { while (--i > 0) { c = soap_getchar(soap); if (c == '\r' || c == '\n') break; if ((int)c == EOF) return soap->error = SOAP_CHK_EOF; *s++ = (char)c; } if (c != '\n') c = soap_getchar(soap); /* got \r or something else, now get \n */ if (c == '\n') { *s = '\0'; if (i+1 == len) /* empty line: end of HTTP/MIME header */ break; c = soap_get0(soap); if (c != ' ' && c != '\t') /* HTTP line continuation? */ break; } else if ((int)c == EOF) return soap->error = SOAP_CHK_EOF; if (i < 0) return soap->error = SOAP_HDR; } return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef PALM_1 static size_t soap_count_attachments(struct soap *soap) { #ifndef WITH_LEANER register struct soap_multipart *content; register size_t count = soap->count; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Calculating the message size with attachments, current count=%lu\n", (unsigned long)count)); if ((soap->mode & SOAP_ENC_DIME) && !(soap->mode & SOAP_ENC_MTOM)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Calculating the size of DIME attachments\n")); for (content = soap->dime.first; content; content = content->next) { count += 12 + ((content->size+3)&(~3)); if (content->id) count += ((strlen(content->id)+3)&(~3)); if (content->type) count += ((strlen(content->type)+3)&(~3)); if (content->options) count += ((((unsigned char)content->options[2] << 8) | ((unsigned char)content->options[3]))+7)&(~3); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Size of DIME attachment content is %lu bytes\n", (unsigned long)content->size)); } } if ((soap->mode & SOAP_ENC_MIME) && soap->mime.boundary) { register size_t n = strlen(soap->mime.boundary); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Calculating the size of MIME attachments\n")); for (content = soap->mime.first; content; content = content->next) { register const char *s; /* count \r\n--boundary\r\n */ count += 6 + n; /* count Content-Type: ...\r\n */ if (content->type) count += 16 + strlen(content->type); /* count Content-Transfer-Encoding: ...\r\n */ s = soap_code_str(mime_codes, content->encoding); if (s) count += 29 + strlen(s); /* count Content-ID: ...\r\n */ if (content->id) count += 14 + strlen(content->id); /* count Content-Location: ...\r\n */ if (content->location) count += 20 + strlen(content->location); /* count Content-Description: ...\r\n */ if (content->description) count += 23 + strlen(content->description); /* count \r\n...content */ count += 2 + content->size; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Size of MIME attachment content is %lu bytes\n", (unsigned long)content->size)); } /* count \r\n--boundary-- */ count += 6 + n; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "New count is %lu bytes\n", (unsigned long)count)); return count; #else return soap->count; #endif } #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 static int soap_putdimefield(struct soap *soap, const char *s, size_t n) { if (soap_send_raw(soap, s, n)) return soap->error; return soap_send_raw(soap, SOAP_STR_PADDING, -(long)n&3); } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 char * SOAP_FMAC2 soap_dime_option(struct soap *soap, unsigned short optype, const char *option) { size_t n; char *s = NULL; if (option) { n = strlen(option); s = (char*)soap_malloc(soap, n + 5); if (s) { s[0] = (char)(optype >> 8); s[1] = (char)(optype & 0xFF); s[2] = (char)(n >> 8); s[3] = (char)(n & 0xFF); strcpy(s + 4, option); } } return s; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_putdimehdr(struct soap *soap) { unsigned char tmp[12]; size_t optlen = 0, idlen = 0, typelen = 0; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Put DIME header id='%s'\n", soap->dime.id ? soap->dime.id : SOAP_STR_EOS)); if (soap->dime.options) optlen = (((unsigned char)soap->dime.options[2] << 8) | ((unsigned char)soap->dime.options[3])) + 4; if (soap->dime.id) { idlen = strlen(soap->dime.id); if (idlen > 0x0000FFFF) idlen = 0x0000FFFF; } if (soap->dime.type) { typelen = strlen(soap->dime.type); if (typelen > 0x0000FFFF) typelen = 0x0000FFFF; } tmp[0] = SOAP_DIME_VERSION | (soap->dime.flags & 0x7); tmp[1] = soap->dime.flags & 0xF0; tmp[2] = (char)(optlen >> 8); tmp[3] = (char)(optlen & 0xFF); tmp[4] = (char)(idlen >> 8); tmp[5] = (char)(idlen & 0xFF); tmp[6] = (char)(typelen >> 8); tmp[7] = (char)(typelen & 0xFF); tmp[8] = (char)(soap->dime.size >> 24); tmp[9] = (char)((soap->dime.size >> 16) & 0xFF); tmp[10] = (char)((soap->dime.size >> 8) & 0xFF); tmp[11] = (char)(soap->dime.size & 0xFF); if (soap_send_raw(soap, (char*)tmp, 12) || soap_putdimefield(soap, soap->dime.options, optlen) || soap_putdimefield(soap, soap->dime.id, idlen) || soap_putdimefield(soap, soap->dime.type, typelen)) return soap->error; return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_putdime(struct soap *soap) { struct soap_multipart *content; if (!(soap->mode & SOAP_ENC_DIME)) return SOAP_OK; for (content = soap->dime.first; content; content = content->next) { void *handle; soap->dime.size = content->size; soap->dime.id = content->id; soap->dime.type = content->type; soap->dime.options = content->options; soap->dime.flags = SOAP_DIME_VERSION | SOAP_DIME_MEDIA; if (soap->fdimereadopen && ((handle = soap->fdimereadopen(soap, (void*)content->ptr, content->id, content->type, content->options)) || soap->error)) { size_t size = content->size; if (!handle) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fdimereadopen failed\n")); return soap->error; } if (!size && ((soap->mode & SOAP_ENC_XML) || (soap->mode & SOAP_IO) == SOAP_IO_CHUNK || (soap->mode & SOAP_IO) == SOAP_IO_STORE)) { size_t chunksize = sizeof(soap->tmpbuf); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Chunked streaming DIME\n")); do { size = soap->fdimeread(soap, handle, soap->tmpbuf, chunksize); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fdimeread returned %lu bytes\n", (unsigned long)size)); if (size < chunksize) { soap->dime.flags &= ~SOAP_DIME_CF; if (!content->next) soap->dime.flags |= SOAP_DIME_ME; } else soap->dime.flags |= SOAP_DIME_CF; soap->dime.size = size; if (soap_putdimehdr(soap) || soap_putdimefield(soap, soap->tmpbuf, size)) break; if (soap->dime.id) { soap->dime.flags &= ~(SOAP_DIME_MB | SOAP_DIME_MEDIA); soap->dime.id = NULL; soap->dime.type = NULL; soap->dime.options = NULL; } } while (size >= chunksize); } else { if (!content->next) soap->dime.flags |= SOAP_DIME_ME; if (soap_putdimehdr(soap)) return soap->error; do { size_t bufsize; if (size < sizeof(soap->tmpbuf)) bufsize = size; else bufsize = sizeof(soap->tmpbuf); if (!(bufsize = soap->fdimeread(soap, handle, soap->tmpbuf, bufsize))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fdimeread failed: insufficient data (%lu bytes remaining from %lu bytes)\n", (unsigned long)size, (unsigned long)content->size)); soap->error = SOAP_CHK_EOF; break; } if (soap_send_raw(soap, soap->tmpbuf, bufsize)) break; size -= bufsize; } while (size); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fdimereadclose\n")); soap_send_raw(soap, SOAP_STR_PADDING, -(long)soap->dime.size&3); } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fdimereadclose\n")); if (soap->fdimereadclose) soap->fdimereadclose(soap, handle); } else { if (!content->next) soap->dime.flags |= SOAP_DIME_ME; if (soap_putdimehdr(soap) || soap_putdimefield(soap, (char*)content->ptr, content->size)) return soap->error; } } return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 static char * soap_getdimefield(struct soap *soap, size_t n) { register soap_wchar c; register size_t i; register char *s; register char *p = NULL; if (n) { p = (char*)soap_malloc(soap, n + 1); if (p) { s = p; for (i = n; i > 0; i--) { if ((int)(c = soap_get1(soap)) == EOF) { soap->error = SOAP_CHK_EOF; return NULL; } *s++ = (char)c; } *s = '\0'; if ((soap->error = soap_move(soap, -(long)n&3))) return NULL; } else soap->error = SOAP_EOM; } return p; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_getdimehdr(struct soap *soap) { register soap_wchar c; register char *s; register int i; unsigned char tmp[12]; size_t optlen, idlen, typelen; if (!(soap->mode & SOAP_ENC_DIME)) return soap->error = SOAP_DIME_END; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get DIME header\n")); if (soap->dime.buflen || soap->dime.chunksize) { if (soap_move(soap, (long)(soap->dime.size - soap_tell(soap)))) return soap->error = SOAP_CHK_EOF; soap_unget(soap, soap_getchar(soap)); /* skip padding and get hdr */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "... From chunked\n")); return SOAP_OK; } s = (char*)tmp; for (i = 12; i > 0; i--) { if ((int)(c = soap_getchar(soap)) == EOF) return soap->error = SOAP_CHK_EOF; *s++ = (char)c; } if ((tmp[0] & 0xF8) != SOAP_DIME_VERSION) return soap->error = SOAP_DIME_MISMATCH; soap->dime.flags = (tmp[0] & 0x7) | (tmp[1] & 0xF0); optlen = (tmp[2] << 8) | tmp[3]; idlen = (tmp[4] << 8) | tmp[5]; typelen = (tmp[6] << 8) | tmp[7]; soap->dime.size = (tmp[8] << 24) | (tmp[9] << 16) | (tmp[10] << 8) | tmp[11]; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DIME size=%lu flags=0x%X\n", (unsigned long)soap->dime.size, soap->dime.flags)); if (!(soap->dime.options = soap_getdimefield(soap, optlen)) && soap->error) return soap->error; if (!(soap->dime.id = soap_getdimefield(soap, idlen)) && soap->error) return soap->error; if (!(soap->dime.type = soap_getdimefield(soap, typelen)) && soap->error) return soap->error; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DIME id=%s, type=%s, options=%s\n", soap->dime.id ? soap->dime.id : SOAP_STR_EOS, soap->dime.type ? soap->dime.type : "", soap->dime.options ? soap->dime.options+4 : SOAP_STR_EOS)); if (soap->dime.flags & SOAP_DIME_ME) soap->mode &= ~SOAP_ENC_DIME; return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_getdime(struct soap *soap) { while (soap->dime.flags & SOAP_DIME_CF) { if (soap_getdimehdr(soap)) return soap->error; if (soap_move(soap, (long)soap->dime.size)) return soap->error = SOAP_EOF; } if (soap_move(soap, (long)(((soap->dime.size+3)&(~3))-soap_tell(soap)))) return soap->error = SOAP_EOF; for (;;) { register struct soap_multipart *content; if (soap_getdimehdr(soap)) break; if (soap->fdimewriteopen && ((soap->dime.ptr = (char*)soap->fdimewriteopen(soap, soap->dime.id, soap->dime.type, soap->dime.options)) || soap->error)) { const char *id, *type, *options; size_t size, n; if (!soap->dime.ptr) return soap->error; id = soap->dime.id; type = soap->dime.type; options = soap->dime.options; for (;;) { size = soap->dime.size; for (;;) { n = soap->buflen - soap->bufidx; if (size < n) n = size; if ((soap->error = soap->fdimewrite(soap, (void*)soap->dime.ptr, soap->buf + soap->bufidx, n))) break; size -= n; if (!size) { soap->bufidx += n; break; } if (soap_recv(soap)) { soap->error = SOAP_EOF; goto end; } } if (soap_move(soap, -(long)soap->dime.size&3)) { soap->error = SOAP_EOF; break; } if (!(soap->dime.flags & SOAP_DIME_CF)) break; if (soap_getdimehdr(soap)) break; } end: if (soap->fdimewriteclose) soap->fdimewriteclose(soap, (void*)soap->dime.ptr); soap->dime.size = 0; soap->dime.id = id; soap->dime.type = type; soap->dime.options = options; } else if (soap->dime.flags & SOAP_DIME_CF) { const char *id, *type, *options; id = soap->dime.id; type = soap->dime.type; options = soap->dime.options; if (soap_new_block(soap) == NULL) return SOAP_EOM; for (;;) { register soap_wchar c; register size_t i; register char *s; s = (char*)soap_push_block(soap, NULL, soap->dime.size); if (!s) return soap->error = SOAP_EOM; for (i = soap->dime.size; i > 0; i--) { if ((int)(c = soap_get1(soap)) == EOF) return soap->error = SOAP_EOF; *s++ = (char)c; } if (soap_move(soap, -(long)soap->dime.size&3)) return soap->error = SOAP_EOF; if (!(soap->dime.flags & SOAP_DIME_CF)) break; if (soap_getdimehdr(soap)) return soap->error; } soap->dime.size = soap->blist->size++; /* allocate one more for '\0' */ if (!(soap->dime.ptr = soap_save_block(soap, NULL, NULL, 0))) return soap->error; soap->dime.ptr[soap->dime.size] = '\0'; /* force 0-terminated */ soap->dime.id = id; soap->dime.type = type; soap->dime.options = options; } else soap->dime.ptr = soap_getdimefield(soap, soap->dime.size); content = soap_new_multipart(soap, &soap->dime.first, &soap->dime.last, soap->dime.ptr, soap->dime.size); if (!content) return soap->error = SOAP_EOM; content->id = soap->dime.id; content->type = soap->dime.type; content->options = soap->dime.options; if (soap->error) return soap->error; soap_resolve_attachment(soap, content); } if (soap->error != SOAP_DIME_END) return soap->error; return soap->error = SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_getmimehdr(struct soap *soap) { struct soap_multipart *content; do { if (soap_getline(soap, soap->msgbuf, sizeof(soap->msgbuf))) return soap->error; } while (!*soap->msgbuf); if (soap->msgbuf[0] == '-' && soap->msgbuf[1] == '-') { char *s = soap->msgbuf + strlen(soap->msgbuf) - 1; /* remove white space */ while (soap_blank((soap_wchar)*s)) s--; s[1] = '\0'; if (soap->mime.boundary) { if (strcmp(soap->msgbuf + 2, soap->mime.boundary)) return soap->error = SOAP_MIME_ERROR; } else soap->mime.boundary = soap_strdup(soap, soap->msgbuf + 2); if (soap_getline(soap, soap->msgbuf, sizeof(soap->msgbuf))) return soap->error; } if (soap_set_mime_attachment(soap, NULL, 0, SOAP_MIME_NONE, NULL, NULL, NULL, NULL)) return soap->error = SOAP_EOM; content = soap->mime.last; for (;;) { register char *key = soap->msgbuf; register char *val; if (!*key) break; DBGLOG(TEST,SOAP_MESSAGE(fdebug, "MIME header: %s\n", key)); val = strchr(soap->msgbuf, ':'); if (val) { *val = '\0'; do val++; while (*val && *val <= 32); if (!soap_tag_cmp(key, "Content-ID")) content->id = soap_strdup(soap, val); else if (!soap_tag_cmp(key, "Content-Location")) content->location = soap_strdup(soap, val); else if (!soap_tag_cmp(key, "Content-Disposition")) content->id = soap_strdup(soap, soap_get_header_attribute(soap, val, "name")); else if (!soap_tag_cmp(key, "Content-Type")) content->type = soap_strdup(soap, val); else if (!soap_tag_cmp(key, "Content-Description")) content->description = soap_strdup(soap, val); else if (!soap_tag_cmp(key, "Content-Transfer-Encoding")) content->encoding = (enum soap_mime_encoding)soap_code_int(mime_codes, val, (long)SOAP_MIME_NONE); } if (soap_getline(soap, key, sizeof(soap->msgbuf))) return soap->error; } return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_getmime(struct soap *soap) { while (soap_get_mime_attachment(soap, NULL)) ; return soap->error; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_post_check_mime_attachments(struct soap *soap) { soap->imode |= SOAP_MIME_POSTCHECK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_check_mime_attachments(struct soap *soap) { if (soap->mode & SOAP_MIME_POSTCHECK) return soap_get_mime_attachment(soap, NULL) != NULL; return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 struct soap_multipart * SOAP_FMAC2 soap_get_mime_attachment(struct soap *soap, void *handle) { register soap_wchar c = 0; register size_t i, m = 0; register char *s, *t = NULL; register struct soap_multipart *content; register short flag = 0; if (!(soap->mode & SOAP_ENC_MIME)) return NULL; content = soap->mime.last; if (!content) { if (soap_getmimehdr(soap)) return NULL; content = soap->mime.last; } else if (content != soap->mime.first) { if (soap->fmimewriteopen && ((content->ptr = (char*)soap->fmimewriteopen(soap, (void*)handle, content->id, content->type, content->description, content->encoding)) || soap->error)) { if (!content->ptr) return NULL; } } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Parsing MIME content id=%s type=%s\n", content->id ? content->id : SOAP_STR_EOS, content->type ? content->type : SOAP_STR_EOS)); if (!content->ptr && soap_new_block(soap) == NULL) { soap->error = SOAP_EOM; return NULL; } for (;;) { if (content->ptr) s = soap->tmpbuf; else if (!(s = (char*)soap_push_block(soap, NULL, sizeof(soap->tmpbuf)))) { soap->error = SOAP_EOM; return NULL; } for (i = 0; i < sizeof(soap->tmpbuf); i++) { if (m > 0) { *s++ = *t++; m--; } else { if (!flag) { c = soap_get1(soap); if ((int)c == EOF) { soap->error = SOAP_CHK_EOF; return NULL; } } if (flag || c == '\r') { t = soap->msgbuf; memset(t, 0, sizeof(soap->msgbuf)); strcpy(t, "\n--"); if (soap->mime.boundary) strncat(t, soap->mime.boundary, sizeof(soap->msgbuf)-4); do c = soap_getchar(soap); while (c == *t++); if ((int)c == EOF) { soap->error = SOAP_CHK_EOF; return NULL; } if (!*--t) goto end; *t = (char)c; flag = (c == '\r'); m = t - soap->msgbuf + 1 - flag; t = soap->msgbuf; c = '\r'; } *s++ = (char)c; } } if (content->ptr && soap->fmimewrite) { if ((soap->error = soap->fmimewrite(soap, (void*)content->ptr, soap->tmpbuf, i))) break; } } end: *s = '\0'; /* force 0-terminated */ if (content->ptr) { if (!soap->error && soap->fmimewrite) soap->error = soap->fmimewrite(soap, (void*)content->ptr, soap->tmpbuf, i); if (soap->fmimewriteclose) soap->fmimewriteclose(soap, (void*)content->ptr); if (soap->error) return NULL; } else { content->size = soap_size_block(soap, NULL, i+1)-1; content->ptr = soap_save_block(soap, NULL, NULL, 0); } soap_resolve_attachment(soap, content); if (c == '-' && soap_getchar(soap) == '-') { soap->mode &= ~SOAP_ENC_MIME; if ((soap->mode & SOAP_MIME_POSTCHECK) && soap_end_recv(soap)) { if (soap->keep_alive < 0) soap->keep_alive = 0; soap_closesock(soap); return NULL; } } else { while (c != '\r' && (int)c != EOF && soap_blank(c)) c = soap_getchar(soap); if (c != '\r' || soap_getchar(soap) != '\n') { soap->error = SOAP_MIME_ERROR; return NULL; } if (soap_getmimehdr(soap)) return NULL; } return content; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_match_cid(struct soap *soap, const char *s, const char *t) { register size_t n; if (!s) return 1; if (!strcmp(s, t)) return 0; if (!strncmp(s, "cid:", 4)) s += 4; n = strlen(t); if (*t == '<') { t++; n -= 2; } if (!strncmp(s, t, n) && !s[n]) return 0; soap_decode(soap->tmpbuf, sizeof(soap->tmpbuf), s, SOAP_STR_EOS); if (!strncmp(soap->tmpbuf, t, n) && !soap->tmpbuf[n]) return 0; return 1; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 static void soap_resolve_attachment(struct soap *soap, struct soap_multipart *content) { if (content->id) { register struct soap_xlist **xp = &soap->xlist; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolving attachment data for id=%s\n", content->id)); while (*xp) { register struct soap_xlist *xq = *xp; if (!soap_match_cid(soap, xq->id, content->id)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Found matching attachment %s for content id=%s\n", xq->id, content->id)); *xp = xq->next; *xq->ptr = (unsigned char*)content->ptr; *xq->size = (int)content->size; *xq->type = (char*)content->type; if (content->options) *xq->options = (char*)content->options; else *xq->options = (char*)content->description; SOAP_FREE(soap, xq); } else xp = &(*xp)->next; } } } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_putmimehdr(struct soap *soap, struct soap_multipart *content) { const char *s; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "MIME attachment type=%s\n", content->type ? content->type : SOAP_STR_EOS)); if (soap_send3(soap, "\r\n--", soap->mime.boundary, "\r\n")) return soap->error; if (content->type && soap_send3(soap, "Content-Type: ", content->type, "\r\n")) return soap->error; s = soap_code_str(mime_codes, content->encoding); if (s && soap_send3(soap, "Content-Transfer-Encoding: ", s, "\r\n")) return soap->error; if (content->id && soap_send3(soap, "Content-ID: ", content->id, "\r\n")) return soap->error; if (content->location && soap_send3(soap, "Content-Location: ", content->location, "\r\n")) return soap->error; if (content->description && soap_send3(soap, "Content-Description: ", content->description, "\r\n")) return soap->error; return soap_send_raw(soap, "\r\n", 2); } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_putmime(struct soap *soap) { struct soap_multipart *content; if (!(soap->mode & SOAP_ENC_MIME) || !soap->mime.boundary) return SOAP_OK; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Sending MIME attachments\n")); for (content = soap->mime.first; content; content = content->next) { void *handle; if (soap->fmimereadopen && ((handle = soap->fmimereadopen(soap, (void*)content->ptr, content->id, content->type, content->description)) || soap->error)) { size_t size = content->size; if (!handle) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fmimereadopen failed\n")); return soap->error; } if (soap_putmimehdr(soap, content)) return soap->error; if (!size) { if ((soap->mode & SOAP_ENC_XML) || (soap->mode & SOAP_IO) == SOAP_IO_CHUNK || (soap->mode & SOAP_IO) == SOAP_IO_STORE) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Chunked streaming MIME\n")); do { size = soap->fmimeread(soap, handle, soap->tmpbuf, sizeof(soap->tmpbuf)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fmimeread returned %lu bytes\n", (unsigned long)size)); if (soap_send_raw(soap, soap->tmpbuf, size)) break; } while (size); } else { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Error: cannot chunk streaming MIME (no HTTP chunking)\n")); } } else { do { size_t bufsize; if (size < sizeof(soap->tmpbuf)) bufsize = size; else bufsize = sizeof(soap->tmpbuf); if (!(bufsize = soap->fmimeread(soap, handle, soap->tmpbuf, bufsize))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fmimeread failed: insufficient data (%lu bytes remaining from %lu bytes)\n", (unsigned long)size, (unsigned long)content->size)); soap->error = SOAP_EOF; break; } if (soap_send_raw(soap, soap->tmpbuf, bufsize)) break; size -= bufsize; } while (size); } if (soap->fmimereadclose) soap->fmimereadclose(soap, handle); } else { if (soap_putmimehdr(soap, content) || soap_send_raw(soap, content->ptr, content->size)) return soap->error; } } return soap_send3(soap, "\r\n--", soap->mime.boundary, "--"); } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_set_dime(struct soap *soap) { soap->omode |= SOAP_ENC_DIME; soap->dime.first = NULL; soap->dime.last = NULL; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_set_mime(struct soap *soap, const char *boundary, const char *start) { soap->omode |= SOAP_ENC_MIME; soap->mime.first = NULL; soap->mime.last = NULL; soap->mime.boundary = soap_strdup(soap, boundary); soap->mime.start = soap_strdup(soap, start); } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_clr_dime(struct soap *soap) { soap->omode &= ~SOAP_ENC_DIME; soap->dime.first = NULL; soap->dime.last = NULL; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_clr_mime(struct soap *soap) { soap->omode &= ~SOAP_ENC_MIME; soap->mime.first = NULL; soap->mime.last = NULL; soap->mime.boundary = NULL; soap->mime.start = NULL; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 static struct soap_multipart* soap_new_multipart(struct soap *soap, struct soap_multipart **first, struct soap_multipart **last, char *ptr, size_t size) { struct soap_multipart *content; content = (struct soap_multipart*)soap_malloc(soap, sizeof(struct soap_multipart)); if (content) { content->next = NULL; content->ptr = ptr; content->size = size; content->id = NULL; content->type = NULL; content->options = NULL; content->encoding = SOAP_MIME_NONE; content->location = NULL; content->description = NULL; if (!*first) *first = content; if (*last) (*last)->next = content; *last = content; } return content; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_set_dime_attachment(struct soap *soap, char *ptr, size_t size, const char *type, const char *id, unsigned short optype, const char *option) { struct soap_multipart *content = soap_new_multipart(soap, &soap->dime.first, &soap->dime.last, ptr, size); if (!content) return SOAP_EOM; content->id = soap_strdup(soap, id); content->type = soap_strdup(soap, type); content->options = soap_dime_option(soap, optype, option); return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_set_mime_attachment(struct soap *soap, char *ptr, size_t size, enum soap_mime_encoding encoding, const char *type, const char *id, const char *location, const char *description) { struct soap_multipart *content = soap_new_multipart(soap, &soap->mime.first, &soap->mime.last, ptr, size); if (!content) return SOAP_EOM; content->id = soap_strdup(soap, id); content->type = soap_strdup(soap, type); content->encoding = encoding; content->location = soap_strdup(soap, location); content->description = soap_strdup(soap, description); return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 struct soap_multipart* SOAP_FMAC2 soap_next_multipart(struct soap_multipart *content) { if (content) return content->next; return NULL; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 static void soap_select_mime_boundary(struct soap *soap) { while (!soap->mime.boundary || soap_valid_mime_boundary(soap)) { register char *s = soap->mime.boundary; register size_t n = 0; if (s) n = strlen(s); if (n < 16) { n = 64; s = soap->mime.boundary = (char*)soap_malloc(soap, n + 1); if (!s) return; } strcpy(s, "=="); s += 2; n -= 4; while (n) { *s++ = soap_base64o[soap_random & 0x3F]; n--; } strcpy(s, "=="); } if (!soap->mime.start) soap->mime.start = ""; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 static int soap_valid_mime_boundary(struct soap *soap) { register struct soap_multipart *content; register size_t k; if (soap->fmimeread) return SOAP_OK; k = strlen(soap->mime.boundary); for (content = soap->mime.first; content; content = content->next) { if (content->ptr && content->size >= k) { register const char *p = (const char*)content->ptr; register size_t i; for (i = 0; i < content->size - k; i++, p++) { if (!strncmp(p, soap->mime.boundary, k)) return SOAP_ERR; } } } return SOAP_OK; } #endif #endif /******************************************************************************/ #ifdef WITH_GZIP #ifndef PALM_1 static int soap_getgziphdr(struct soap *soap) { int i; soap_wchar c = 0, f = 0; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get gzip header\n")); for (i = 0; i < 9; i++) { if ((int)(c = soap_get1(soap) == EOF)) return soap->error = SOAP_ZLIB_ERROR; if (i == 1 && c == 8) soap->z_dict = 0; if (i == 2) f = c; } if (f & 0x04) /* FEXTRA */ { for (i = soap_get1(soap) | (soap_get1(soap) << 8); i; i--) { if ((int)soap_get1(soap) == EOF) return soap->error = SOAP_ZLIB_ERROR; } } if (f & 0x08) /* skip FNAME */ { do c = soap_get1(soap); while (c && (int)c != EOF); } if ((int)c != EOF && (f & 0x10)) /* skip FCOMMENT */ { do c = soap_get1(soap); while (c && (int)c != EOF); } if ((int)c != EOF && (f & 0x02)) /* skip FHCRC (CRC32 is used) */ { if ((int)(c = soap_get1(soap)) != EOF) c = soap_get1(soap); } if ((int)c == EOF) return soap->error = SOAP_ZLIB_ERROR; return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_begin_serve(struct soap *soap) { #ifdef WITH_FASTCGI if (FCGI_Accept() < 0) { soap->error = SOAP_EOF; return soap_send_fault(soap); } #endif soap_begin(soap); if (soap_begin_recv(soap) || soap_envelope_begin_in(soap) || soap_recv_header(soap) || soap_body_begin_in(soap)) { if (soap->error < SOAP_STOP) { #ifdef WITH_FASTCGI soap_send_fault(soap); #else return soap_send_fault(soap); #endif } return soap_closesock(soap); } return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_begin_recv(struct soap *soap) { register soap_wchar c; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Initializing for input\n")); soap->error = SOAP_OK; soap->filterstop = SOAP_OK; soap_free_temp(soap); soap_set_local_namespaces(soap); soap->version = 0; /* don't assume we're parsing SOAP content by default */ #ifndef WITH_NOIDREF soap_free_iht(soap); #endif if ((soap->imode & SOAP_IO) == SOAP_IO_CHUNK) soap->omode |= SOAP_IO_CHUNK; soap->imode &= ~(SOAP_IO | SOAP_ENC_MIME); soap->mode = soap->imode; if (!soap->keep_alive) { soap->buflen = 0; soap->bufidx = 0; } if (!(soap->mode & SOAP_IO_KEEPALIVE)) soap->keep_alive = 0; soap->ahead = 0; soap->peeked = 0; soap->level = 0; soap->part = SOAP_BEGIN; soap->alloced = 0; soap->count = 0; soap->length = 0; soap->cdata = 0; *soap->endpoint = '\0'; soap->action = NULL; soap->header = NULL; soap->fault = NULL; soap->status = 0; soap->fform = NULL; #ifndef WITH_LEANER soap->dom = NULL; soap->dime.chunksize = 0; soap->dime.buflen = 0; soap->dime.list = NULL; soap->dime.first = NULL; soap->dime.last = NULL; soap->mime.list = NULL; soap->mime.first = NULL; soap->mime.last = NULL; soap->mime.boundary = NULL; soap->mime.start = NULL; #endif #ifdef WIN32 #ifndef UNDER_CE #ifndef WITH_FASTCGI if (!soap_valid_socket(soap->socket)) #ifdef __BORLANDC__ setmode(soap->recvfd, _O_BINARY); #else _setmode(soap->recvfd, _O_BINARY); #endif #endif #endif #endif #ifdef WITH_ZLIB soap->mode &= ~SOAP_ENC_ZLIB; soap->zlib_in = SOAP_ZLIB_NONE; soap->zlib_out = SOAP_ZLIB_NONE; soap->d_stream->next_in = Z_NULL; soap->d_stream->avail_in = 0; soap->d_stream->next_out = (Byte*)soap->buf; soap->d_stream->avail_out = SOAP_BUFLEN; soap->z_ratio_in = 1.0; #endif #ifdef WITH_OPENSSL if (soap->ssl) ERR_clear_error(); #endif #ifndef WITH_LEANER if (soap->fprepareinitrecv && (soap->error = soap->fprepareinitrecv(soap))) return soap->error; #endif c = soap_getchar(soap); #ifdef WITH_GZIP if (c == 0x1F) { if (soap_getgziphdr(soap)) return soap->error; if (inflateInit2(soap->d_stream, -MAX_WBITS) != Z_OK) return soap->error = SOAP_ZLIB_ERROR; if (soap->z_dict) { if (inflateSetDictionary(soap->d_stream, (const Bytef*)soap->z_dict, soap->z_dict_len) != Z_OK) return soap->error = SOAP_ZLIB_ERROR; } soap->zlib_state = SOAP_ZLIB_INFLATE; soap->mode |= SOAP_ENC_ZLIB; soap->zlib_in = SOAP_ZLIB_GZIP; soap->z_crc = crc32(0L, NULL, 0); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "gzip initialized\n")); if (!soap->z_buf) soap->z_buf = (char*)SOAP_MALLOC(soap, SOAP_BUFLEN); memcpy(soap->z_buf, soap->buf, SOAP_BUFLEN); /* should not chunk over plain transport, so why bother to check? */ /* if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK) */ /* soap->z_buflen = soap->bufidx; */ /* else */ soap->d_stream->next_in = (Byte*)(soap->z_buf + soap->bufidx); soap->d_stream->avail_in = (unsigned int)(soap->buflen - soap->bufidx); soap->z_buflen = soap->buflen; soap->buflen = soap->bufidx; c = ' '; } #endif while (soap_blank(c)) c = soap_getchar(soap); #ifndef WITH_LEANER if (c == '-' && soap_get0(soap) == '-') soap->mode |= SOAP_ENC_MIME; else if ((c & 0xFFFC) == (SOAP_DIME_VERSION | SOAP_DIME_MB) && (soap_get0(soap) & 0xFFF0) == 0x20) soap->mode |= SOAP_ENC_DIME; else #endif { /* skip BOM */ if (c == 0xEF && soap_get0(soap) == 0xBB) { c = soap_get1(soap); if ((c = soap_get1(soap)) == 0xBF) { soap->mode &= ~SOAP_ENC_LATIN; c = soap_getchar(soap); } else c = (0x0F << 12) | (0xBB << 6) | (c & 0x3F); /* UTF-8 */ } else if ((c == 0xFE && soap_get0(soap) == 0xFF) /* UTF-16 BE */ || (c == 0xFF && soap_get0(soap) == 0xFE)) /* UTF-16 LE */ return soap->error = SOAP_UTF_ERROR; /* skip space */ while (soap_blank(c)) c = soap_getchar(soap); } if ((int)c == EOF) return soap->error = SOAP_CHK_EOF; soap_unget(soap, c); #ifndef WITH_NOHTTP /* if not XML or MIME/DIME/ZLIB, assume HTTP header */ if (c != '<' && !(soap->mode & (SOAP_ENC_MIME | SOAP_ENC_DIME | SOAP_ENC_ZLIB))) { soap_mode m = soap->imode; soap->mode &= ~SOAP_IO; soap->error = soap->fparse(soap); if (soap->error && soap->error < SOAP_STOP) { soap->keep_alive = 0; /* force close later */ return soap->error; } if (soap->error == SOAP_STOP) { if (soap->fform) { soap->error = soap->fform(soap); if (soap->error == SOAP_OK) soap->error = SOAP_STOP; /* prevents further processing */ } return soap->error; } soap->mode = soap->imode; /* if imode is changed, effectuate */ soap->imode = m; /* restore imode */ #ifdef WITH_ZLIB soap->mode &= ~SOAP_ENC_ZLIB; #endif if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK) { soap->chunkbuflen = soap->buflen; soap->buflen = soap->bufidx; soap->chunksize = 0; } /* Note: fparse should not use soap_unget to push back last char */ if (soap_get0(soap) == (int)EOF) { if (soap->status == 200) return soap->error = SOAP_NO_DATA; /* HTTP OK: always expect data */ return soap->error = soap->status; } #ifdef WITH_ZLIB if (soap->zlib_in != SOAP_ZLIB_NONE) { #ifdef WITH_GZIP if (soap->zlib_in != SOAP_ZLIB_DEFLATE) { c = soap_get1(soap); if (c == 0x1F) { if (soap_getgziphdr(soap)) return soap->error; if (inflateInit2(soap->d_stream, -MAX_WBITS) != Z_OK) return soap->error = SOAP_ZLIB_ERROR; soap->z_crc = crc32(0L, NULL, 0); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "gzip initialized\n")); } else { soap_revget1(soap); if (inflateInit(soap->d_stream) != Z_OK) return soap->error = SOAP_ZLIB_ERROR; soap->zlib_in = SOAP_ZLIB_DEFLATE; } } else #endif if (inflateInit(soap->d_stream) != Z_OK) return soap->error = SOAP_ZLIB_ERROR; if (soap->z_dict) { if (inflateSetDictionary(soap->d_stream, (const Bytef*)soap->z_dict, soap->z_dict_len) != Z_OK) return soap->error = SOAP_ZLIB_ERROR; } soap->zlib_state = SOAP_ZLIB_INFLATE; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflate initialized\n")); soap->mode |= SOAP_ENC_ZLIB; if (!soap->z_buf) soap->z_buf = (char*)SOAP_MALLOC(soap, SOAP_BUFLEN); memcpy(soap->z_buf, soap->buf, SOAP_BUFLEN); soap->d_stream->next_in = (Byte*)(soap->z_buf + soap->bufidx); soap->d_stream->avail_in = (unsigned int)(soap->buflen - soap->bufidx); soap->z_buflen = soap->buflen; soap->buflen = soap->bufidx; } #endif #ifndef WITH_LEANER if (soap->fpreparerecv && (soap->mode & SOAP_IO) != SOAP_IO_CHUNK && soap->buflen > soap->bufidx) { int r; if ((r = soap->fpreparerecv(soap, soap->buf + soap->bufidx, soap->buflen - soap->bufidx))) return soap->error = r; } #endif if (soap->error) { if (soap->error == SOAP_FORM && soap->fform) { soap->error = soap->fform(soap); if (soap->error == SOAP_OK) soap->error = SOAP_STOP; /* prevents further processing */ } return soap->error; } } #endif #ifndef WITH_LEANER if (soap->mode & SOAP_ENC_MIME) { do /* skip preamble */ { if ((int)(c = soap_getchar(soap)) == EOF) return soap->error = SOAP_CHK_EOF; } while (c != '-' || soap_get0(soap) != '-'); soap_unget(soap, c); if (soap_getmimehdr(soap)) return soap->error; if (soap->mime.start) { do { if (!soap->mime.last->id) break; if (!soap_match_cid(soap, soap->mime.start, soap->mime.last->id)) break; } while (soap_get_mime_attachment(soap, NULL)); } if (soap_get_header_attribute(soap, soap->mime.first->type, "application/dime")) soap->mode |= SOAP_ENC_DIME; } if (soap->mode & SOAP_ENC_DIME) { if (soap_getdimehdr(soap)) return soap->error; if (soap->dime.flags & SOAP_DIME_CF) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Chunked DIME SOAP message\n")); soap->dime.chunksize = soap->dime.size; if (soap->buflen - soap->bufidx >= soap->dime.chunksize) { soap->dime.buflen = soap->buflen; soap->buflen = soap->bufidx + soap->dime.chunksize; } else soap->dime.chunksize -= soap->buflen - soap->bufidx; } soap->count = soap->buflen - soap->bufidx; } #endif return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_begin_out(struct soap *soap) { #ifndef WITH_LEANER size_t n = 0; if ((soap->mode & SOAP_ENC_MIME) && soap->mime.boundary && soap->mime.start && strlen(soap->mime.boundary) + strlen(soap->mime.start) < sizeof(soap->tmpbuf) - 80 ) { const char *s; if ((soap->mode & SOAP_ENC_DIME) && !(soap->mode & SOAP_ENC_MTOM)) s = "application/dime"; else if (soap->version == 2) { if (soap->mode & SOAP_ENC_MTOM) s = "application/xop+xml; charset=utf-8; type=\"application/soap+xml\""; else s = "application/soap+xml; charset=utf-8"; } else if (soap->mode & SOAP_ENC_MTOM) s = "application/xop+xml; charset=utf-8; type=\"text/xml\""; else s = "text/xml; charset=utf-8"; sprintf(soap->tmpbuf, "--%s\r\nContent-Type: %s\r\nContent-Transfer-Encoding: binary\r\nContent-ID: %s\r\n\r\n", soap->mime.boundary, s, soap->mime.start); n = strlen(soap->tmpbuf); if (soap_send_raw(soap, soap->tmpbuf, n)) return soap->error; } if (soap->mode & SOAP_IO_LENGTH) soap->dime.size = soap->count; /* DIME in MIME correction */ if (!(soap->mode & SOAP_IO_LENGTH) && (soap->mode & SOAP_ENC_DIME)) { if (soap_putdimehdr(soap)) return soap->error; } #endif soap->part = SOAP_IN_ENVELOPE; return soap_element_begin_out(soap, "SOAP-ENV:Envelope", 0, NULL); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_end_out(struct soap *soap) { if (soap_element_end_out(soap, "SOAP-ENV:Envelope") || soap_send_raw(soap, "\r\n", 2)) /* 2.8: always emit \r\n */ return soap->error; #ifndef WITH_LEANER if ((soap->mode & SOAP_IO_LENGTH) && (soap->mode & SOAP_ENC_DIME) && !(soap->mode & SOAP_ENC_MTOM)) { soap->dime.size = soap->count - soap->dime.size; /* DIME in MIME correction */ sprintf(soap->id, soap->dime_id_format, 0); soap->dime.id = soap->id; if (soap->local_namespaces) { if (soap->local_namespaces[0].out) soap->dime.type = (char*)soap->local_namespaces[0].out; else soap->dime.type = (char*)soap->local_namespaces[0].ns; } soap->dime.options = NULL; soap->dime.flags = SOAP_DIME_MB | SOAP_DIME_ABSURI; if (!soap->dime.first) soap->dime.flags |= SOAP_DIME_ME; soap->count += 12 + ((strlen(soap->dime.id)+3)&(~3)) + (soap->dime.type ? ((strlen(soap->dime.type)+3)&(~3)) : 0); } if ((soap->mode & SOAP_ENC_DIME) && !(soap->mode & SOAP_ENC_MTOM)) return soap_send_raw(soap, SOAP_STR_PADDING, -(long)soap->dime.size&3); #endif soap->part = SOAP_END_ENVELOPE; return SOAP_OK; } #endif /******************************************************************************/ #ifndef WITH_LEAN #ifndef PALM_1 SOAP_FMAC1 char* SOAP_FMAC2 soap_get_http_body(struct soap *soap) { #ifndef WITH_LEAN register size_t l = 0, n = 0; register char *s; /* get HTML body of HTTP error content */ if (!(soap->mode & SOAP_ENC_ZLIB) && (soap->mode & SOAP_IO) != SOAP_IO_CHUNK) { n = soap->length; if (!n) return NULL; } #ifdef WITH_FAST soap->labidx = 0; /* use look-aside buffer */ #else if (soap_new_block(soap) == NULL) return NULL; #endif for (;;) { #ifdef WITH_FAST register size_t i, k; if (soap_append_lab(soap, NULL, 0)) /* allocate more space in look-aside buffer if necessary */ return NULL; s = soap->labbuf + soap->labidx; /* space to populate */ k = soap->lablen - soap->labidx; /* number of bytes available */ soap->labidx = soap->lablen; /* claim this space */ #else register size_t i, k = SOAP_BLKLEN; if (!(s = (char*)soap_push_block(soap, NULL, k))) return NULL; #endif for (i = 0; i < k; i++) { register soap_wchar c; l++; if (n > 0 && l > n) goto end; c = soap_getchar(soap); if ((int)c == EOF) goto end; *s++ = (char)(c & 0xFF); } } end: *s = '\0'; #ifdef WITH_FAST s = soap_strdup(soap, soap->labbuf); #else soap_size_block(soap, NULL, i+1); s = soap_save_block(soap, NULL, 0); #endif return s; #else return NULL; #endif } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_begin_in(struct soap *soap) { register struct Namespace *p; soap->part = SOAP_IN_ENVELOPE; if (soap_element_begin_in(soap, "SOAP-ENV:Envelope", 0, NULL)) { if (soap->error == SOAP_TAG_MISMATCH && !soap_element_begin_in(soap, "Envelope", 0, NULL)) soap->error = SOAP_VERSIONMISMATCH; else if (soap->status) soap->error = soap->status; return soap->error; } p = soap->local_namespaces; if (p) { const char *ns = p[0].out; if (!ns) ns = p[0].ns; if (!strcmp(ns, soap_env1)) { soap->version = 1; /* make sure we use SOAP 1.1 */ if (p[1].out) SOAP_FREE(soap, p[1].out); if ((p[1].out = (char*)SOAP_MALLOC(soap, sizeof(soap_enc1)))) strcpy(p[1].out, soap_enc1); } else if (!strcmp(ns, soap_env2)) { soap->version = 2; /* make sure we use SOAP 1.2 */ if (p[1].out) SOAP_FREE(soap, p[1].out); if ((p[1].out = (char*)SOAP_MALLOC(soap, sizeof(soap_enc2)))) strcpy(p[1].out, soap_enc2); } } return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_end_in(struct soap *soap) { soap->part = SOAP_END_ENVELOPE; return soap_element_end_in(soap, "SOAP-ENV:Envelope"); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_body_begin_out(struct soap *soap) { soap->part = SOAP_IN_BODY; if (soap->version == 1) soap->encoding = 1; #ifndef WITH_LEAN if ((soap->mode & SOAP_SEC_WSUID) && soap_set_attr(soap, "wsu:Id", "Body", 1)) return soap->error; #endif return soap_element_begin_out(soap, "SOAP-ENV:Body", 0, NULL); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_body_end_out(struct soap *soap) { if (soap_element_end_out(soap, "SOAP-ENV:Body")) return soap->error; soap->part = SOAP_END_BODY; return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_body_begin_in(struct soap *soap) { soap->part = SOAP_IN_BODY; if (soap_element_begin_in(soap, "SOAP-ENV:Body", 0, NULL)) return soap->error; if (!soap->body) soap->part = SOAP_NO_BODY; return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_body_end_in(struct soap *soap) { if (soap->part == SOAP_NO_BODY) return soap->error = SOAP_OK; soap->part = SOAP_END_BODY; return soap_element_end_in(soap, "SOAP-ENV:Body"); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_recv_header(struct soap *soap) { if (soap_getheader(soap) && soap->error == SOAP_TAG_MISMATCH) soap->error = SOAP_OK; if (soap->error == SOAP_OK && soap->fheader) soap->error = soap->fheader(soap); return soap->error; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_set_endpoint(struct soap *soap, const char *endpoint) { register const char *s; register size_t i, n; soap->endpoint[0] = '\0'; soap->host[0] = '\0'; soap->path[0] = '/'; soap->path[1] = '\0'; soap->port = 80; if (!endpoint || !*endpoint) return; #ifdef WITH_OPENSSL if (!soap_tag_cmp(endpoint, "https:*")) soap->port = 443; #endif strncpy(soap->endpoint, endpoint, sizeof(soap->endpoint) - 1); soap->endpoint[sizeof(soap->endpoint) - 1] = '\0'; s = strchr(endpoint, ':'); if (s && s[1] == '/' && s[2] == '/') s += 3; else s = endpoint; n = strlen(s); if (n >= sizeof(soap->host)) n = sizeof(soap->host) - 1; #ifdef WITH_IPV6 if (s[0] == '[') { s++; for (i = 0; i < n; i++) { if (s[i] == ']') { s++; --n; break; } soap->host[i] = s[i]; } } else { for (i = 0; i < n; i++) { soap->host[i] = s[i]; if (s[i] == '/' || s[i] == ':') break; } } #else for (i = 0; i < n; i++) { soap->host[i] = s[i]; if (s[i] == '/' || s[i] == ':') break; } #endif soap->host[i] = '\0'; if (s[i] == ':') { soap->port = (int)soap_strtol(s + i + 1, NULL, 10); for (i++; i < n; i++) if (s[i] == '/') break; } if (i < n && s[i]) { strncpy(soap->path, s + i, sizeof(soap->path)); soap->path[sizeof(soap->path) - 1] = '\0'; } } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_connect(struct soap *soap, const char *endpoint, const char *action) { return soap_connect_command(soap, SOAP_POST, endpoint, action); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_connect_command(struct soap *soap, int http_command, const char *endpoints, const char *action) { char *endpoint; const char *s; if (endpoints && (s = strchr(endpoints, ' '))) { endpoint = (char*)SOAP_MALLOC(soap, strlen(endpoints) + 1); for (;;) { strncpy(endpoint, endpoints, s - endpoints); endpoint[s - endpoints] = '\0'; if (soap_try_connect_command(soap, http_command, endpoint, action) != SOAP_TCP_ERROR) break; if (!*s) break; soap->error = SOAP_OK; while (*s == ' ') s++; endpoints = s; s = strchr(endpoints, ' '); if (!s) s = endpoints + strlen(endpoints); } SOAP_FREE(soap, endpoint); } else soap_try_connect_command(soap, http_command, endpoints, action); return soap->error; } #endif /******************************************************************************/ #ifndef PALM_1 static int soap_try_connect_command(struct soap *soap, int http_command, const char *endpoint, const char *action) { char host[sizeof(soap->host)]; int port; size_t count; soap->error = SOAP_OK; strcpy(host, soap->host); /* save previous host name: if != then reconnect */ port = soap->port; /* save previous port to compare */ soap->status = http_command; soap_set_endpoint(soap, endpoint); #ifndef WITH_LEANER if (soap->fconnect) { if ((soap->error = soap->fconnect(soap, endpoint, soap->host, soap->port))) return soap->error; } else #endif soap->action = soap_strdup(soap, action); if (soap->fopen && *soap->host) { if (!soap->keep_alive || !soap_valid_socket(soap->socket) || strcmp(soap->host, host) || soap->port != port || !soap->fpoll || soap->fpoll(soap)) { soap->error = SOAP_OK; #ifndef WITH_LEAN if (!strncmp(endpoint, "soap.udp:", 9)) soap->omode |= SOAP_IO_UDP; else #endif { soap->keep_alive = 0; /* to force close */ soap->omode &= ~SOAP_IO_UDP; /* to force close */ } soap_closesock(soap); DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Connect/reconnect to host='%s' path='%s' port=%d\n", soap->host, soap->path, soap->port)); if (!soap->keep_alive || !soap_valid_socket(soap->socket)) { soap->socket = soap->fopen(soap, endpoint, soap->host, soap->port); if (soap->error) return soap->error; soap->keep_alive = ((soap->omode & SOAP_IO_KEEPALIVE) != 0); } } } #ifdef WITH_NTLM if (soap_ntlm_handshake(soap, SOAP_GET, endpoint, host, port)) return soap->error; #endif count = soap_count_attachments(soap); if (soap_begin_send(soap)) return soap->error; if (http_command == SOAP_GET) { soap->mode &= ~SOAP_IO; soap->mode |= SOAP_IO_BUFFER; } #ifndef WITH_NOHTTP if ((soap->mode & SOAP_IO) != SOAP_IO_STORE && !(soap->mode & SOAP_ENC_XML) && endpoint) { unsigned int k = soap->mode; soap->mode &= ~(SOAP_IO | SOAP_ENC_ZLIB); if ((k & SOAP_IO) != SOAP_IO_FLUSH) soap->mode |= SOAP_IO_BUFFER; if ((soap->error = soap->fpost(soap, endpoint, soap->host, soap->port, soap->path, action, count))) return soap->error; #ifndef WITH_LEANER if ((k & SOAP_IO) == SOAP_IO_CHUNK) { if (soap_flush(soap)) return soap->error; } #endif soap->mode = k; } if (http_command == SOAP_GET || http_command == SOAP_DEL) return soap_end_send(soap); #endif return SOAP_OK; } #endif /******************************************************************************/ #ifdef WITH_NTLM #ifndef PALM_1 static int soap_ntlm_handshake(struct soap *soap, int command, const char *endpoint, const char *host, int port) { /* requires libntlm from http://www.nongnu.org/libntlm/ */ const char *userid = (soap->proxy_userid ? soap->proxy_userid : soap->userid); const char *passwd = (soap->proxy_passwd ? soap->proxy_passwd : soap->passwd); if (soap->ntlm_challenge && userid && passwd && soap->authrealm) { tSmbNtlmAuthRequest req; tSmbNtlmAuthResponse res; tSmbNtlmAuthChallenge ch; short k = soap->keep_alive; size_t l = soap->length; soap_mode m = soap->mode, o = soap->omode; int s = soap->status; DBGLOG(TEST,SOAP_MESSAGE(fdebug, "NTLM '%s'\n", soap->ntlm_challenge)); if (!*soap->ntlm_challenge) { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "NTLM S->C Type 1: received NTLM authentication challenge from server\n")); /* S -> C 401 Unauthorized WWW-Authenticate: NTLM */ buildSmbNtlmAuthRequest(&req, userid, soap->authrealm); soap->ntlm_challenge = soap_s2base64(soap, (unsigned char*)&req, NULL, SmbLength(&req)); DBGLOG(TEST,SOAP_MESSAGE(fdebug, "NTLM C->S Type 2: sending NTLM authorization to server\nAuthorization: NTLM %s\n", soap->ntlm_challenge)); /* C -> S GET ... Authorization: NTLM TlRMTVNTUAABAAAAA7IAAAoACgApAAAACQAJACAAAABMSUdIVENJVFlVUlNBLU1JTk9S */ soap->omode = SOAP_IO_BUFFER; if (soap_begin_send(soap)) return soap->error; soap->keep_alive = 1; soap->status = command; if (soap->fpost(soap, endpoint, host, port, NULL, NULL, 0) || soap_end_send(soap)) return soap->error; soap->mode = m; soap->keep_alive = k; DBGLOG(TEST,SOAP_MESSAGE(fdebug, "NTLM S->C Type 2: waiting on server NTLM response\n")); if (soap_begin_recv(soap)) if (soap->error == SOAP_EOF) return soap->error; soap_end_recv(soap); soap->length = l; if (soap->status != 401 && soap->status != 407) return soap->error = SOAP_NTLM_ERROR; soap->error = SOAP_OK; } /* S -> C 401 Unauthorized WWW-Authenticate: NTLM TlRMTVNTUAACAAAAAAAAACgAAAABggAAU3J2Tm9uY2UAAAAAAAAAAA== */ soap_base642s(soap, soap->ntlm_challenge, (char*)&ch, sizeof(tSmbNtlmAuthChallenge), NULL); buildSmbNtlmAuthResponse(&ch, &res, userid, passwd); soap->ntlm_challenge = soap_s2base64(soap, (unsigned char*)&res, NULL, SmbLength(&res)); DBGLOG(TEST,SOAP_MESSAGE(fdebug, "NTLM C->S Type 3: sending NTLM authorization to server\nAuthorization: NTLM %s\n", soap->ntlm_challenge)); /* C -> S GET ... Authorization: NTLM TlRMTVNTUAADAAAAGAAYAHIAAAAYABgAigAAABQAFABAAAAADAAMAFQAAAASABIAYAAAAAAAAACiAAAAAYIAAFUAUgBTAEEALQBNAEkATgBPAFIAWgBhAHAAaABvAGQATABJAEcASABUAEMASQBUAFkArYfKbe/jRoW5xDxHeoxC1gBmfWiS5+iX4OAN4xBKG/IFPwfH3agtPEia6YnhsADT */ soap->keep_alive = k; soap->length = l; soap->mode = m; soap->omode = o; soap->status = s; } return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 char* SOAP_FMAC2 soap_s2base64(struct soap *soap, const unsigned char *s, char *t, int n) { register int i; register unsigned long m; register char *p; if (!t) t = (char*)soap_malloc(soap, (n + 2) / 3 * 4 + 1); if (!t) return NULL; p = t; t[0] = '\0'; if (!s) return p; for (; n > 2; n -= 3, s += 3) { m = s[0]; m = (m << 8) | s[1]; m = (m << 8) | s[2]; for (i = 4; i > 0; m >>= 6) t[--i] = soap_base64o[m & 0x3F]; t += 4; } t[0] = '\0'; if (n > 0) { m = 0; for (i = 0; i < n; i++) m = (m << 8) | *s++; for (; i < 3; i++) m <<= 8; for (i++; i > 0; m >>= 6) t[--i] = soap_base64o[m & 0x3F]; for (i = 3; i > n; i--) t[i] = '='; t[4] = '\0'; } return p; } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 const char* SOAP_FMAC2 soap_base642s(struct soap *soap, const char *s, char *t, size_t l, int *n) { register size_t i, j; register soap_wchar c; register unsigned long m; register const char *p; if (!s || !*s) { if (n) *n = 0; if (soap->error) return NULL; return SOAP_NON_NULL; } if (!t) { l = (strlen(s) + 3) / 4 * 3 + 1; /* make sure enough space for \0 */ t = (char*)soap_malloc(soap, l); } if (!t) return NULL; p = t; if (n) *n = 0; for (;;) { for (i = 0; i < SOAP_BLKLEN; i++) { m = 0; j = 0; while (j < 4) { c = *s++; if (c == '=' || !c) { i *= 3; switch (j) { case 2: *t++ = (char)((m >> 4) & 0xFF); i++; break; case 3: *t++ = (char)((m >> 10) & 0xFF); *t++ = (char)((m >> 2) & 0xFF); i += 2; } if (n) *n += (int)i; if (l >= j) *t = '\0'; return p; } c -= '+'; if (c >= 0 && c <= 79) { int b = soap_base64i[c]; if (b >= 64) { soap->error = SOAP_TYPE; return NULL; } m = (m << 6) + b; j++; } else if (!soap_blank(c + '+')) { soap->error = SOAP_TYPE; return NULL; } } if (l < 3) { if (n) *n += (int)i; *t = '\0'; return p; } *t++ = (char)((m >> 16) & 0xFF); *t++ = (char)((m >> 8) & 0xFF); *t++ = (char)(m & 0xFF); l -= 3; } if (n) *n += 3 * SOAP_BLKLEN; } } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 char* SOAP_FMAC2 soap_s2hex(struct soap *soap, const unsigned char *s, char *t, int n) { register char *p; if (!t) t = (char*)soap_malloc(soap, 2 * n + 1); if (!t) return NULL; p = t; t[0] = '\0'; if (s) { for (; n > 0; n--) { register int m = *s++; *t++ = (char)((m >> 4) + (m > 159 ? 'a' - 10 : '0')); m &= 0x0F; *t++ = (char)(m + (m > 9 ? 'a' - 10 : '0')); } } *t++ = '\0'; return p; } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 const char* SOAP_FMAC2 soap_hex2s(struct soap *soap, const char *s, char *t, size_t l, int *n) { register const char *p; if (!s || !*s) { if (n) *n = 0; if (soap->error) return NULL; return SOAP_NON_NULL; } if (!t) { l = strlen(s) / 2 + 1; /* make sure enough space for \0 */ t = (char*)soap_malloc(soap, l); } if (!t) return NULL; p = t; while (l) { register int d1, d2; d1 = *s++; if (!d1) break; d2 = *s++; if (!d2) break; *t++ = (char)(((d1 >= 'A' ? (d1 & 0x7) + 9 : d1 - '0') << 4) + (d2 >= 'A' ? (d2 & 0x7) + 9 : d2 - '0')); l--; } if (n) *n = (int)(t - p); if (l) *t = '\0'; return p; } #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_puthttphdr(struct soap *soap, int status, size_t count) { if (soap->status != SOAP_GET && soap->status != SOAP_DEL && soap->status != SOAP_CONNECT) { register const char *s = "text/xml; charset=utf-8"; register int err = SOAP_OK; #ifndef WITH_LEANER register const char *r = NULL; #endif if ((status == SOAP_FILE || soap->status == SOAP_PUT || soap->status == SOAP_POST_FILE) && soap->http_content) s = soap->http_content; else if (status == SOAP_HTML) s = "text/html; charset=utf-8"; else if (count || ((soap->omode & SOAP_IO) == SOAP_IO_CHUNK)) { if (soap->version == 2) s = "application/soap+xml; charset=utf-8"; } #ifndef WITH_LEANER if (soap->mode & (SOAP_ENC_DIME | SOAP_ENC_MTOM)) { if (soap->mode & SOAP_ENC_MTOM) { if (soap->version == 2) r = "application/soap+xml"; else r = "text/xml"; s = "application/xop+xml"; } else s = "application/dime"; } if ((soap->mode & SOAP_ENC_MIME) && soap->mime.boundary && strlen(soap->mime.boundary) + strlen(soap->mime.start ? soap->mime.start : SOAP_STR_EOS) < sizeof(soap->tmpbuf) - 80) { register const char *t = strchr(s, ';'); sprintf(soap->tmpbuf, "multipart/related; charset=utf-8; boundary=\"%s\"; type=\"", soap->mime.boundary); if (t) { strncat(soap->tmpbuf, s, t - s); soap->tmpbuf[sizeof(soap->tmpbuf)-1] = '\0'; } else strcat(soap->tmpbuf, s); if (soap->mime.start) { strcat(soap->tmpbuf, "\"; start=\""); strcat(soap->tmpbuf, soap->mime.start); } strcat(soap->tmpbuf, "\""); if (r) { strcat(soap->tmpbuf, "; start-info=\""); strcat(soap->tmpbuf, r); strcat(soap->tmpbuf, "\""); } s = soap->tmpbuf; } else s = strcpy(soap->tmpbuf, s); if (status == SOAP_OK && soap->version == 2 && soap->action && strlen(soap->action) + strlen(s) < sizeof(soap->tmpbuf) - 80) sprintf(soap->tmpbuf + strlen(s), "; action=\"%s\"", soap->action); #endif if ((err = soap->fposthdr(soap, "Content-Type", s))) return err; #ifdef WITH_ZLIB if ((soap->omode & SOAP_ENC_ZLIB)) { #ifdef WITH_GZIP err = soap->fposthdr(soap, "Content-Encoding", soap->zlib_out == SOAP_ZLIB_DEFLATE ? "deflate" : "gzip"); #else err = soap->fposthdr(soap, "Content-Encoding", "deflate"); #endif if (err) return err; } #endif #ifndef WITH_LEANER if ((soap->omode & SOAP_IO) == SOAP_IO_CHUNK) err = soap->fposthdr(soap, "Transfer-Encoding", "chunked"); else #endif if (s) { sprintf(soap->tmpbuf, "%lu", (unsigned long)count); err = soap->fposthdr(soap, "Content-Length", soap->tmpbuf); } if (err) return err; } return soap->fposthdr(soap, "Connection", soap->keep_alive ? "keep-alive" : "close"); } #endif #endif /******************************************************************************/ #ifndef WITH_LEAN static const char* soap_set_validation_fault(struct soap *soap, const char *s, const char *t) { if (*soap->tag) sprintf(soap->msgbuf, "Validation constraint violation: %s%s in element '%s'", s, t ? t : SOAP_STR_EOS, soap->tag); else sprintf(soap->msgbuf, "Validation constraint violation: %s%s", s, t ? t : SOAP_STR_EOS); return soap->msgbuf; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_set_fault(struct soap *soap) { const char **c = soap_faultcode(soap); const char **s = soap_faultstring(soap); if (soap->fseterror) soap->fseterror(soap, c, s); if (!*c) { if (soap->version == 2) *c = "SOAP-ENV:Sender"; else *c = "SOAP-ENV:Client"; } if (*s) return; switch (soap->error) { #ifndef WITH_LEAN case SOAP_CLI_FAULT: *s = "Client fault"; break; case SOAP_SVR_FAULT: *s = "Server fault"; break; case SOAP_TAG_MISMATCH: *s = soap_set_validation_fault(soap, "tag name or namespace mismatch", NULL); break; case SOAP_TYPE: *s = soap_set_validation_fault(soap, "data type mismatch ", soap->type); break; case SOAP_SYNTAX_ERROR: *s = "Well-formedness violation"; break; case SOAP_NO_TAG: *s = "No XML root element"; break; case SOAP_MUSTUNDERSTAND: *c = "SOAP-ENV:MustUnderstand"; sprintf(soap->msgbuf, "The data in element '%s' must be understood but cannot be handled", soap->tag); *s = soap->msgbuf; break; case SOAP_VERSIONMISMATCH: *c = "SOAP-ENV:VersionMismatch"; *s = "Invalid SOAP message or SOAP version mismatch"; break; case SOAP_DATAENCODINGUNKNOWN: *c = "SOAP-ENV:DataEncodingUnknown"; *s = "Unsupported SOAP data encoding"; break; case SOAP_NAMESPACE: *s = soap_set_validation_fault(soap, "namespace error", NULL); break; case SOAP_USER_ERROR: *s = "User data error"; break; case SOAP_FATAL_ERROR: *s = "Fatal error"; break; case SOAP_NO_METHOD: sprintf(soap->msgbuf, "Method '%s' not implemented: method name or namespace not recognized", soap->tag); *s = soap->msgbuf; break; case SOAP_NO_DATA: *s = "Data required for operation"; break; case SOAP_GET_METHOD: *s = "HTTP GET method not implemented"; break; case SOAP_PUT_METHOD: *s = "HTTP PUT method not implemented"; break; case SOAP_HTTP_METHOD: *s = "HTTP method not implemented"; break; case SOAP_EOM: *s = "Out of memory"; break; case SOAP_MOE: *s = "Memory overflow or memory corruption error"; break; case SOAP_HDR: *s = "Header line too long"; break; case SOAP_IOB: *s = "Array index out of bounds"; break; case SOAP_NULL: *s = soap_set_validation_fault(soap, "nil not allowed", NULL); break; case SOAP_DUPLICATE_ID: *s = soap_set_validation_fault(soap, "multiple definitions (use the SOAP_XML_TREE flag) of the same id ", soap->id); if (soap->version == 2) *soap_faultsubcode(soap) = "SOAP-ENC:DuplicateID"; break; case SOAP_MISSING_ID: *s = soap_set_validation_fault(soap, "missing id for ref ", soap->id); if (soap->version == 2) *soap_faultsubcode(soap) = "SOAP-ENC:MissingID"; break; case SOAP_HREF: *s = soap_set_validation_fault(soap, "incompatible object type ref/id pair ", soap->id); break; case SOAP_FAULT: break; #ifndef WITH_NOIO case SOAP_UDP_ERROR: *s = "Message too large for UDP packet"; break; case SOAP_TCP_ERROR: *s = tcp_error(soap); break; #endif case SOAP_HTTP_ERROR: *s = "An HTTP processing error occurred"; break; case SOAP_NTLM_ERROR: *s = "An HTTP NTLM authentication error occurred"; break; case SOAP_SSL_ERROR: #ifdef WITH_OPENSSL *s = "SSL/TLS error"; #else *s = "OpenSSL not installed: recompile with -DWITH_OPENSSL"; #endif break; case SOAP_PLUGIN_ERROR: *s = "Plugin registry error"; break; case SOAP_DIME_ERROR: *s = "DIME format error"; break; case SOAP_DIME_HREF: *s = "DIME href to missing attachment"; break; case SOAP_DIME_MISMATCH: *s = "DIME version/transmission error"; break; case SOAP_DIME_END: *s = "End of DIME error"; break; case SOAP_MIME_ERROR: *s = "MIME format error"; break; case SOAP_MIME_HREF: *s = "MIME href to missing attachment"; break; case SOAP_MIME_END: *s = "End of MIME error"; break; case SOAP_ZLIB_ERROR: #ifdef WITH_ZLIB sprintf(soap->msgbuf, "Zlib/gzip error: '%s'", soap->d_stream->msg ? soap->d_stream->msg : SOAP_STR_EOS); *s = soap->msgbuf; #else *s = "Zlib/gzip not installed for (de)compression: recompile with -DWITH_GZIP"; #endif break; case SOAP_REQUIRED: *s = soap_set_validation_fault(soap, "missing required attribute", NULL); break; case SOAP_PROHIBITED: *s = soap_set_validation_fault(soap, "prohibited attribute present", NULL); break; case SOAP_OCCURS: *s = soap_set_validation_fault(soap, "occurrence violation", NULL); break; case SOAP_LENGTH: *s = soap_set_validation_fault(soap, "content range or length violation", NULL); break; case SOAP_FD_EXCEEDED: *s = "Maximum number of open connections was reached (no define HAVE_POLL): increase FD_SETSIZE"; break; case SOAP_UTF_ERROR: *s = "UTF content encoding error"; break; case SOAP_STOP: *s = "Stopped: no response to be sent or received (informative)"; break; #endif case SOAP_EOF: #ifndef WITH_NOIO strcpy(soap->msgbuf, soap_strerror(soap)); #ifndef WITH_LEAN if (strlen(soap->msgbuf) + 25 < sizeof(soap->msgbuf)) { memmove(soap->msgbuf + 25, soap->msgbuf, strlen(soap->msgbuf) + 1); memcpy(soap->msgbuf, "End of file or no input: ", 25); } #endif *s = soap->msgbuf; break; #else *s = "End of file or no input"; break; #endif default: #ifndef WITH_NOHTTP #ifndef WITH_LEAN if (soap->error > 200 && soap->error < 600) { sprintf(soap->msgbuf, "HTTP Error: %d %s", soap->error, http_error(soap, soap->error)); *s = soap->msgbuf; } else #endif #endif { sprintf(soap->msgbuf, "Error %d", soap->error); *s = soap->msgbuf; } } } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_send_fault(struct soap *soap) { register int status = soap->error; if (status == SOAP_STOP) return soap_closesock(soap); DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Sending back fault struct for error code %d\n", soap->error)); soap->keep_alive = 0; /* to terminate connection */ soap_set_fault(soap); if (soap->error < 200 && soap->error != SOAP_FAULT) soap->header = NULL; if (status != SOAP_EOF || (!soap->recv_timeout && !soap->send_timeout)) { int r = 1; #ifndef WITH_NOIO if (soap->fpoll && soap->fpoll(soap)) r = 0; #ifndef WITH_LEAN else if (soap_valid_socket(soap->socket)) { r = tcp_select(soap, soap->socket, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_SND, 0); if (r > 0) { if (!(r & SOAP_TCP_SELECT_SND) || ((r & SOAP_TCP_SELECT_RCV) && recv(soap->socket, soap->tmpbuf, 1, MSG_PEEK) < 0)) r = 0; } } #endif #endif if (r > 0) { soap->error = SOAP_OK; soap_serializeheader(soap); soap_serializefault(soap); soap_begin_count(soap); if (soap->mode & SOAP_IO_LENGTH) { soap_envelope_begin_out(soap); soap_putheader(soap); soap_body_begin_out(soap); soap_putfault(soap); soap_body_end_out(soap); soap_envelope_end_out(soap); } soap_end_count(soap); if (soap_response(soap, status) || soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_putfault(soap) || soap_body_end_out(soap) || soap_envelope_end_out(soap)) return soap_closesock(soap); soap_end_send(soap); } } soap->error = status; return soap_closesock(soap); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_recv_fault(struct soap *soap, int check) { register int status = soap->error; DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Check if receiving SOAP Fault\n")); if (!check) { /* try getfault when no tag or tag mismatched at level 2, otherwise ret */ if (soap->error != SOAP_NO_TAG && (soap->error != SOAP_TAG_MISMATCH || soap->level != 2)) return soap->error; } soap->error = SOAP_OK; if (soap_getfault(soap)) { /* check flag set: check if SOAP Fault is present, if not just return */ if (check && soap->error == SOAP_TAG_MISMATCH && soap->level == 2) return soap->error = SOAP_OK; DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Error: soap_get_soapfault() failed at level %u tag '%s'\n", soap->level, soap->tag)); *soap_faultcode(soap) = (soap->version == 2 ? "SOAP-ENV:Sender" : "SOAP-ENV:Client"); soap->error = status; soap_set_fault(soap); } else { register const char *s = *soap_faultcode(soap); if (!soap_match_tag(soap, s, "SOAP-ENV:Server") || !soap_match_tag(soap, s, "SOAP-ENV:Receiver")) status = SOAP_SVR_FAULT; else if (!soap_match_tag(soap, s, "SOAP-ENV:Client") || !soap_match_tag(soap, s, "SOAP-ENV:Sender")) status = SOAP_CLI_FAULT; else if (!soap_match_tag(soap, s, "SOAP-ENV:MustUnderstand")) status = SOAP_MUSTUNDERSTAND; else if (!soap_match_tag(soap, s, "SOAP-ENV:VersionMismatch")) status = SOAP_VERSIONMISMATCH; else { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Received SOAP Fault code %s\n", s)); status = SOAP_FAULT; } if (!soap_body_end_in(soap)) soap_envelope_end_in(soap); } soap_end_recv(soap); soap->error = status; return soap_closesock(soap); } #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_send_empty_response(struct soap *soap, int httpstatuscode) { register soap_mode m = soap->omode; soap->count = 0; if ((m & SOAP_IO) == SOAP_IO_CHUNK) soap->omode = (m & ~SOAP_IO) | SOAP_IO_BUFFER; if (!soap_response(soap, httpstatuscode) && !soap_end_send(soap)) soap->error = SOAP_STOP; /* stops the server's processing of request */ soap->omode = m; return soap_closesock(soap); } #endif #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_recv_empty_response(struct soap *soap) { if (!soap_begin_recv(soap)) soap_end_recv(soap); else if (soap->error == SOAP_NO_DATA || soap->error == 202) soap->error = SOAP_OK; return soap_closesock(soap); } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 static const char* soap_strerror(struct soap *soap) { register int err = soap->errnum; if (err) { #ifndef WIN32 # ifdef HAVE_STRERROR_R strerror_r(err, soap->msgbuf, sizeof(soap->msgbuf)); # else return strerror(err); # endif #else #ifndef UNDER_CE DWORD len; *soap->msgbuf = '\0'; len = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)soap->msgbuf, (DWORD)sizeof(soap->msgbuf), NULL); #else DWORD i, len; *soap->msgbuf = '\0'; len = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, err, 0, (LPTSTR)soap->msgbuf, (DWORD)(sizeof(soap->msgbuf)/sizeof(TCHAR)), NULL); for (i = 0; i <= len; i++) { if (((TCHAR*)soap->msgbuf)[i] < 0x80) soap->msgbuf[i] = (char)((TCHAR*)soap->msgbuf)[i]; else soap->msgbuf[i] = '?'; } #endif #endif } else { char *s = soap->msgbuf; #ifndef WITH_LEAN int rt = soap->recv_timeout, st = soap->send_timeout; int ru = ' ', su = ' '; #endif strcpy(s, "Operation interrupted or timed out"); #ifndef WITH_LEAN if (rt < 0) { rt = -rt; ru = 'u'; } if (st < 0) { st = -st; su = 'u'; } if (rt) sprintf(s + strlen(s), " (%d%cs receive delay)", rt, ru); if (st) sprintf(s + strlen(s), " (%d%cs send delay)", st, su); #endif } return soap->msgbuf; } #endif #endif /******************************************************************************/ #ifndef PALM_2 static int soap_set_error(struct soap *soap, const char *faultcode, const char *faultsubcodeQName, const char *faultstring, const char *faultdetailXML, int soaperror) { *soap_faultcode(soap) = faultcode; if (faultsubcodeQName) *soap_faultsubcode(soap) = faultsubcodeQName; *soap_faultstring(soap) = faultstring; if (faultdetailXML && *faultdetailXML) { register const char **s = soap_faultdetail(soap); if (s) *s = faultdetailXML; } return soap->error = soaperror; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_set_sender_error(struct soap *soap, const char *faultstring, const char *faultdetailXML, int soaperror) { return soap_set_error(soap, soap->version == 2 ? "SOAP-ENV:Sender" : "SOAP-ENV:Client", NULL, faultstring, faultdetailXML, soaperror); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_set_receiver_error(struct soap *soap, const char *faultstring, const char *faultdetailXML, int soaperror) { return soap_set_error(soap, soap->version == 2 ? "SOAP-ENV:Receiver" : "SOAP-ENV:Server", NULL, faultstring, faultdetailXML, soaperror); } #endif /******************************************************************************/ #ifndef PALM_2 static int soap_copy_fault(struct soap *soap, const char *faultcode, const char *faultsubcodeQName, const char *faultstring, const char *faultdetailXML) { char *r = NULL, *s = NULL, *t = NULL; if (faultsubcodeQName) r = soap_strdup(soap, faultsubcodeQName); if (faultstring) s = soap_strdup(soap, faultstring); if (faultdetailXML) t = soap_strdup(soap, faultdetailXML); return soap_set_error(soap, faultcode, r, s, t, SOAP_FAULT); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_sender_fault(struct soap *soap, const char *faultstring, const char *faultdetailXML) { return soap_sender_fault_subcode(soap, NULL, faultstring, faultdetailXML); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_sender_fault_subcode(struct soap *soap, const char *faultsubcodeQName, const char *faultstring, const char *faultdetailXML) { return soap_copy_fault(soap, soap->version == 2 ? "SOAP-ENV:Sender" : "SOAP-ENV:Client", faultsubcodeQName, faultstring, faultdetailXML); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_receiver_fault(struct soap *soap, const char *faultstring, const char *faultdetailXML) { return soap_receiver_fault_subcode(soap, NULL, faultstring, faultdetailXML); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_receiver_fault_subcode(struct soap *soap, const char *faultsubcodeQName, const char *faultstring, const char *faultdetailXML) { return soap_copy_fault(soap, soap->version == 2 ? "SOAP-ENV:Receiver" : "SOAP-ENV:Server", faultsubcodeQName, faultstring, faultdetailXML); } #endif /******************************************************************************/ #ifndef PALM_2 #ifndef WITH_NOSTDLIB SOAP_FMAC1 void SOAP_FMAC2 soap_print_fault(struct soap *soap, FILE *fd) { if (soap_check_state(soap)) fprintf(fd, "Error: soap struct state not initialized\n"); else if (soap->error) { const char **c, *v = NULL, *s, *d; c = soap_faultcode(soap); if (!*c) soap_set_fault(soap); if (soap->version == 2) v = soap_check_faultsubcode(soap); s = *soap_faultstring(soap); d = soap_check_faultdetail(soap); fprintf(fd, "%s%d fault: %s [%s]\n\"%s\"\nDetail: %s\n", soap->version ? "SOAP 1." : "Error ", soap->version ? (int)soap->version : soap->error, *c, v ? v : "no subcode", s ? s : "[no reason]", d ? d : "[no detail]"); } } #endif #endif /******************************************************************************/ #ifdef __cplusplus #ifndef WITH_LEAN #ifndef WITH_NOSTDLIB #ifndef WITH_COMPAT SOAP_FMAC1 void SOAP_FMAC2 soap_stream_fault(struct soap *soap, std::ostream& os) { if (soap_check_state(soap)) os << "Error: soap struct state not initialized\n"; else if (soap->error) { const char **c, *v = NULL, *s, *d; c = soap_faultcode(soap); if (!*c) soap_set_fault(soap); if (soap->version == 2) v = soap_check_faultsubcode(soap); s = *soap_faultstring(soap); d = soap_check_faultdetail(soap); os << (soap->version ? "SOAP 1." : "Error ") << (soap->version ? (int)soap->version : soap->error) << " fault: " << *c << "[" << (v ? v : "no subcode") << "]" << std::endl << "\"" << (s ? s : "[no reason]") << "\"" << std::endl << "Detail: " << (d ? d : "[no detail]") << std::endl; } } #endif #endif #endif #endif /******************************************************************************/ #ifndef WITH_LEAN #ifndef WITH_NOSTDLIB SOAP_FMAC1 char* SOAP_FMAC2 soap_sprint_fault(struct soap *soap, char *buf, size_t len) { if (soap_check_state(soap)) strncpy(buf, "Error: soap struct not initialized", len); else if (soap->error) { const char **c, *v = NULL, *s, *d; c = soap_faultcode(soap); if (!*c) soap_set_fault(soap); if (soap->version == 2) v = *soap_faultsubcode(soap); s = *soap_faultstring(soap); d = soap_check_faultdetail(soap); #ifdef HAVE_SNPRINTF # ifdef WIN32 _snprintf # else snprintf # endif (buf, len, "%s%d fault: %s [%s]\n\"%s\"\nDetail: %s\n", soap->version ? "SOAP 1." : "Error ", soap->version ? (int)soap->version : soap->error, *c, v ? v : "no subcode", s ? s : "[no reason]", d ? d : "[no detail]"); #else if (len > 40 + (v ? strlen(v) : 0) + (s ? strlen(s) : 0) + (d ? strlen(d) : 0)) sprintf(buf, "%s%d fault: %s [%s]\n\"%s\"\nDetail: %s\n", soap->version ? "SOAP 1." : "Error ", soap->version ? (int)soap->version : soap->error, *c, v ? v : "no subcode", s ? s : "[no reason]", d ? d : "[no detail]"); else if (len > 40) sprintf(buf, "%s%d fault: %s\n", soap->version ? "SOAP 1." : "Error ", soap->version ? (int)soap->version : soap->error, *c); else buf[0] = '\0'; #endif } return buf; } #endif #endif /******************************************************************************/ #ifndef PALM_1 #ifndef WITH_NOSTDLIB SOAP_FMAC1 void SOAP_FMAC2 soap_print_fault_location(struct soap *soap, FILE *fd) { #ifndef WITH_LEAN int i, j, c1, c2; if (soap->error && soap->error != SOAP_STOP && soap->bufidx <= soap->buflen && soap->buflen > 0 && soap->buflen <= SOAP_BUFLEN) { i = (int)soap->bufidx - 1; if (i <= 0) i = 0; c1 = soap->buf[i]; soap->buf[i] = '\0'; if ((int)soap->buflen >= i + 1024) j = i + 1023; else j = (int)soap->buflen - 1; c2 = soap->buf[j]; soap->buf[j] = '\0'; fprintf(fd, "%s%c\n\n", soap->buf, c1); if (soap->bufidx < soap->buflen) fprintf(fd, "%s\n", soap->buf + soap->bufidx); soap->buf[i] = (char)c1; soap->buf[j] = (char)c2; } #endif } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_register_plugin_arg(struct soap *soap, int (*fcreate)(struct soap*, struct soap_plugin*, void*), void *arg) { register struct soap_plugin *p; register int r; if (!(p = (struct soap_plugin*)SOAP_MALLOC(soap, sizeof(struct soap_plugin)))) return soap->error = SOAP_EOM; p->id = NULL; p->data = NULL; p->fcopy = NULL; p->fdelete = NULL; r = fcreate(soap, p, arg); if (!r && p->fdelete) { p->next = soap->plugins; soap->plugins = p; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Registered '%s' plugin\n", p->id)); return SOAP_OK; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not register plugin '%s': plugin returned error %d (or fdelete callback not set)\n", p->id ? p->id : "?", r)); SOAP_FREE(soap, p); return r; } #endif /******************************************************************************/ #ifndef PALM_1 static void * fplugin(struct soap *soap, const char *id) { register struct soap_plugin *p; for (p = soap->plugins; p; p = p->next) if (p->id == id || !strcmp(p->id, id)) return p->data; return NULL; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void * SOAP_FMAC2 soap_lookup_plugin(struct soap *soap, const char *id) { return soap->fplugin(soap, id); } #endif /******************************************************************************/ #ifdef __cplusplus } #endif /******************************************************************************\ * * C++ soap struct methods * \******************************************************************************/ #ifdef __cplusplus soap::soap() { soap_init(this); } #endif /******************************************************************************/ #ifdef __cplusplus soap::soap(soap_mode m) { soap_init1(this, m); } #endif /******************************************************************************/ #ifdef __cplusplus soap::soap(soap_mode im, soap_mode om) { soap_init2(this, im, om); } #endif /******************************************************************************/ #ifdef __cplusplus soap::soap(const struct soap& soap) { soap_copy_context(this, &soap); } #endif /******************************************************************************/ #ifdef __cplusplus soap::~soap() { soap_destroy(this); soap_end(this); soap_done(this); } #endif /******************************************************************************/ gsoap-2.8.28/gsoap/ios_plugin/examples/Calc/Classes/soapH.h0000644000175000017500000007024512653650146023065 0ustar ellertellert/* soapH.h Generated by gSOAP 2.8.8 from calc.h Copyright(C) 2000-2012, Robert van Engelen, Genivia Inc. All Rights Reserved. The generated code is released under one of the following licenses: 1) GPL or 2) Genivia's license for commercial use. This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. */ #ifndef soapH_H #define soapH_H #include "soapStub.h" #ifdef __cplusplus extern "C" { #endif #ifndef WITH_NOIDREF SOAP_FMAC3 void SOAP_FMAC4 soap_markelement(struct soap*, const void*, int); SOAP_FMAC3 int SOAP_FMAC4 soap_putelement(struct soap*, const void*, const char*, int, int); SOAP_FMAC3 void *SOAP_FMAC4 soap_getelement(struct soap*, int*); SOAP_FMAC3 int SOAP_FMAC4 soap_putindependent(struct soap*); SOAP_FMAC3 int SOAP_FMAC4 soap_getindependent(struct soap*); #endif SOAP_FMAC3 int SOAP_FMAC4 soap_ignore_element(struct soap*); #ifndef SOAP_TYPE_byte #define SOAP_TYPE_byte (3) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_byte(struct soap*, char *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_byte(struct soap*, const char*, int, const char *, const char*); SOAP_FMAC3 char * SOAP_FMAC4 soap_in_byte(struct soap*, const char*, char *, const char*); #ifndef soap_write_byte #define soap_write_byte(soap, data) ( soap_begin_send(soap) || soap_put_byte(soap, data, "byte", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_byte(struct soap*, const char *, const char*, const char*); #ifndef soap_read_byte #define soap_read_byte(soap, data) ( soap_begin_recv(soap) || !soap_get_byte(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 char * SOAP_FMAC4 soap_get_byte(struct soap*, char *, const char*, const char*); #ifndef SOAP_TYPE_int #define SOAP_TYPE_int (1) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_int(struct soap*, int *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_int(struct soap*, const char*, int, const int *, const char*); SOAP_FMAC3 int * SOAP_FMAC4 soap_in_int(struct soap*, const char*, int *, const char*); #ifndef soap_write_int #define soap_write_int(soap, data) ( soap_begin_send(soap) || soap_put_int(soap, data, "int", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_int(struct soap*, const int *, const char*, const char*); #ifndef soap_read_int #define soap_read_int(soap, data) ( soap_begin_recv(soap) || !soap_get_int(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 int * SOAP_FMAC4 soap_get_int(struct soap*, int *, const char*, const char*); #ifndef SOAP_TYPE_double #define SOAP_TYPE_double (7) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_double(struct soap*, double *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_double(struct soap*, const char*, int, const double *, const char*); SOAP_FMAC3 double * SOAP_FMAC4 soap_in_double(struct soap*, const char*, double *, const char*); #ifndef soap_write_double #define soap_write_double(soap, data) ( soap_begin_send(soap) || soap_put_double(soap, data, "double", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_double(struct soap*, const double *, const char*, const char*); #ifndef soap_read_double #define soap_read_double(soap, data) ( soap_begin_recv(soap) || !soap_get_double(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 double * SOAP_FMAC4 soap_get_double(struct soap*, double *, const char*, const char*); #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_SOAP_ENV__Fault #define SOAP_TYPE_SOAP_ENV__Fault (31) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Fault(struct soap*, struct SOAP_ENV__Fault *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Fault(struct soap*, const struct SOAP_ENV__Fault *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Fault(struct soap*, const char*, int, const struct SOAP_ENV__Fault *, const char*); SOAP_FMAC3 struct SOAP_ENV__Fault * SOAP_FMAC4 soap_in_SOAP_ENV__Fault(struct soap*, const char*, struct SOAP_ENV__Fault *, const char*); #ifndef soap_write_SOAP_ENV__Fault #define soap_write_SOAP_ENV__Fault(soap, data) ( soap_begin_send(soap) || (soap_serialize_SOAP_ENV__Fault(soap, data), 0) || soap_put_SOAP_ENV__Fault(soap, data, "SOAP-ENV:Fault", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Fault(struct soap*, const struct SOAP_ENV__Fault *, const char*, const char*); #ifndef soap_read_SOAP_ENV__Fault #define soap_read_SOAP_ENV__Fault(soap, data) ( soap_begin_recv(soap) || !soap_get_SOAP_ENV__Fault(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 struct SOAP_ENV__Fault * SOAP_FMAC4 soap_get_SOAP_ENV__Fault(struct soap*, struct SOAP_ENV__Fault *, const char*, const char*); #endif #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_SOAP_ENV__Reason #define SOAP_TYPE_SOAP_ENV__Reason (30) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Reason(struct soap*, struct SOAP_ENV__Reason *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Reason(struct soap*, const struct SOAP_ENV__Reason *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Reason(struct soap*, const char*, int, const struct SOAP_ENV__Reason *, const char*); SOAP_FMAC3 struct SOAP_ENV__Reason * SOAP_FMAC4 soap_in_SOAP_ENV__Reason(struct soap*, const char*, struct SOAP_ENV__Reason *, const char*); #ifndef soap_write_SOAP_ENV__Reason #define soap_write_SOAP_ENV__Reason(soap, data) ( soap_begin_send(soap) || (soap_serialize_SOAP_ENV__Reason(soap, data), 0) || soap_put_SOAP_ENV__Reason(soap, data, "SOAP-ENV:Reason", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Reason(struct soap*, const struct SOAP_ENV__Reason *, const char*, const char*); #ifndef soap_read_SOAP_ENV__Reason #define soap_read_SOAP_ENV__Reason(soap, data) ( soap_begin_recv(soap) || !soap_get_SOAP_ENV__Reason(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 struct SOAP_ENV__Reason * SOAP_FMAC4 soap_get_SOAP_ENV__Reason(struct soap*, struct SOAP_ENV__Reason *, const char*, const char*); #endif #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_SOAP_ENV__Detail #define SOAP_TYPE_SOAP_ENV__Detail (27) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Detail(struct soap*, struct SOAP_ENV__Detail *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Detail(struct soap*, const struct SOAP_ENV__Detail *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Detail(struct soap*, const char*, int, const struct SOAP_ENV__Detail *, const char*); SOAP_FMAC3 struct SOAP_ENV__Detail * SOAP_FMAC4 soap_in_SOAP_ENV__Detail(struct soap*, const char*, struct SOAP_ENV__Detail *, const char*); #ifndef soap_write_SOAP_ENV__Detail #define soap_write_SOAP_ENV__Detail(soap, data) ( soap_begin_send(soap) || (soap_serialize_SOAP_ENV__Detail(soap, data), 0) || soap_put_SOAP_ENV__Detail(soap, data, "SOAP-ENV:Detail", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Detail(struct soap*, const struct SOAP_ENV__Detail *, const char*, const char*); #ifndef soap_read_SOAP_ENV__Detail #define soap_read_SOAP_ENV__Detail(soap, data) ( soap_begin_recv(soap) || !soap_get_SOAP_ENV__Detail(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 struct SOAP_ENV__Detail * SOAP_FMAC4 soap_get_SOAP_ENV__Detail(struct soap*, struct SOAP_ENV__Detail *, const char*, const char*); #endif #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_SOAP_ENV__Code #define SOAP_TYPE_SOAP_ENV__Code (25) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Code(struct soap*, struct SOAP_ENV__Code *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Code(struct soap*, const struct SOAP_ENV__Code *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Code(struct soap*, const char*, int, const struct SOAP_ENV__Code *, const char*); SOAP_FMAC3 struct SOAP_ENV__Code * SOAP_FMAC4 soap_in_SOAP_ENV__Code(struct soap*, const char*, struct SOAP_ENV__Code *, const char*); #ifndef soap_write_SOAP_ENV__Code #define soap_write_SOAP_ENV__Code(soap, data) ( soap_begin_send(soap) || (soap_serialize_SOAP_ENV__Code(soap, data), 0) || soap_put_SOAP_ENV__Code(soap, data, "SOAP-ENV:Code", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Code(struct soap*, const struct SOAP_ENV__Code *, const char*, const char*); #ifndef soap_read_SOAP_ENV__Code #define soap_read_SOAP_ENV__Code(soap, data) ( soap_begin_recv(soap) || !soap_get_SOAP_ENV__Code(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 struct SOAP_ENV__Code * SOAP_FMAC4 soap_get_SOAP_ENV__Code(struct soap*, struct SOAP_ENV__Code *, const char*, const char*); #endif #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_SOAP_ENV__Header #define SOAP_TYPE_SOAP_ENV__Header (24) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Header(struct soap*, struct SOAP_ENV__Header *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Header(struct soap*, const struct SOAP_ENV__Header *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Header(struct soap*, const char*, int, const struct SOAP_ENV__Header *, const char*); SOAP_FMAC3 struct SOAP_ENV__Header * SOAP_FMAC4 soap_in_SOAP_ENV__Header(struct soap*, const char*, struct SOAP_ENV__Header *, const char*); #ifndef soap_write_SOAP_ENV__Header #define soap_write_SOAP_ENV__Header(soap, data) ( soap_begin_send(soap) || (soap_serialize_SOAP_ENV__Header(soap, data), 0) || soap_put_SOAP_ENV__Header(soap, data, "SOAP-ENV:Header", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Header(struct soap*, const struct SOAP_ENV__Header *, const char*, const char*); #ifndef soap_read_SOAP_ENV__Header #define soap_read_SOAP_ENV__Header(soap, data) ( soap_begin_recv(soap) || !soap_get_SOAP_ENV__Header(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 struct SOAP_ENV__Header * SOAP_FMAC4 soap_get_SOAP_ENV__Header(struct soap*, struct SOAP_ENV__Header *, const char*, const char*); #endif #ifndef SOAP_TYPE_ns2__pow #define SOAP_TYPE_ns2__pow (23) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns2__pow(struct soap*, struct ns2__pow *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns2__pow(struct soap*, const struct ns2__pow *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns2__pow(struct soap*, const char*, int, const struct ns2__pow *, const char*); SOAP_FMAC3 struct ns2__pow * SOAP_FMAC4 soap_in_ns2__pow(struct soap*, const char*, struct ns2__pow *, const char*); #ifndef soap_write_ns2__pow #define soap_write_ns2__pow(soap, data) ( soap_begin_send(soap) || (soap_serialize_ns2__pow(soap, data), 0) || soap_put_ns2__pow(soap, data, "ns2:pow", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns2__pow(struct soap*, const struct ns2__pow *, const char*, const char*); #ifndef soap_read_ns2__pow #define soap_read_ns2__pow(soap, data) ( soap_begin_recv(soap) || !soap_get_ns2__pow(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 struct ns2__pow * SOAP_FMAC4 soap_get_ns2__pow(struct soap*, struct ns2__pow *, const char*, const char*); #ifndef SOAP_TYPE_ns2__powResponse #define SOAP_TYPE_ns2__powResponse (22) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns2__powResponse(struct soap*, struct ns2__powResponse *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns2__powResponse(struct soap*, const struct ns2__powResponse *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns2__powResponse(struct soap*, const char*, int, const struct ns2__powResponse *, const char*); SOAP_FMAC3 struct ns2__powResponse * SOAP_FMAC4 soap_in_ns2__powResponse(struct soap*, const char*, struct ns2__powResponse *, const char*); #ifndef soap_write_ns2__powResponse #define soap_write_ns2__powResponse(soap, data) ( soap_begin_send(soap) || (soap_serialize_ns2__powResponse(soap, data), 0) || soap_put_ns2__powResponse(soap, data, "ns2:powResponse", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns2__powResponse(struct soap*, const struct ns2__powResponse *, const char*, const char*); #ifndef soap_read_ns2__powResponse #define soap_read_ns2__powResponse(soap, data) ( soap_begin_recv(soap) || !soap_get_ns2__powResponse(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 struct ns2__powResponse * SOAP_FMAC4 soap_get_ns2__powResponse(struct soap*, struct ns2__powResponse *, const char*, const char*); #ifndef SOAP_TYPE_ns2__div #define SOAP_TYPE_ns2__div (20) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns2__div(struct soap*, struct ns2__div *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns2__div(struct soap*, const struct ns2__div *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns2__div(struct soap*, const char*, int, const struct ns2__div *, const char*); SOAP_FMAC3 struct ns2__div * SOAP_FMAC4 soap_in_ns2__div(struct soap*, const char*, struct ns2__div *, const char*); #ifndef soap_write_ns2__div #define soap_write_ns2__div(soap, data) ( soap_begin_send(soap) || (soap_serialize_ns2__div(soap, data), 0) || soap_put_ns2__div(soap, data, "ns2:div", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns2__div(struct soap*, const struct ns2__div *, const char*, const char*); #ifndef soap_read_ns2__div #define soap_read_ns2__div(soap, data) ( soap_begin_recv(soap) || !soap_get_ns2__div(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 struct ns2__div * SOAP_FMAC4 soap_get_ns2__div(struct soap*, struct ns2__div *, const char*, const char*); #ifndef SOAP_TYPE_ns2__divResponse #define SOAP_TYPE_ns2__divResponse (19) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns2__divResponse(struct soap*, struct ns2__divResponse *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns2__divResponse(struct soap*, const struct ns2__divResponse *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns2__divResponse(struct soap*, const char*, int, const struct ns2__divResponse *, const char*); SOAP_FMAC3 struct ns2__divResponse * SOAP_FMAC4 soap_in_ns2__divResponse(struct soap*, const char*, struct ns2__divResponse *, const char*); #ifndef soap_write_ns2__divResponse #define soap_write_ns2__divResponse(soap, data) ( soap_begin_send(soap) || (soap_serialize_ns2__divResponse(soap, data), 0) || soap_put_ns2__divResponse(soap, data, "ns2:divResponse", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns2__divResponse(struct soap*, const struct ns2__divResponse *, const char*, const char*); #ifndef soap_read_ns2__divResponse #define soap_read_ns2__divResponse(soap, data) ( soap_begin_recv(soap) || !soap_get_ns2__divResponse(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 struct ns2__divResponse * SOAP_FMAC4 soap_get_ns2__divResponse(struct soap*, struct ns2__divResponse *, const char*, const char*); #ifndef SOAP_TYPE_ns2__mul #define SOAP_TYPE_ns2__mul (17) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns2__mul(struct soap*, struct ns2__mul *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns2__mul(struct soap*, const struct ns2__mul *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns2__mul(struct soap*, const char*, int, const struct ns2__mul *, const char*); SOAP_FMAC3 struct ns2__mul * SOAP_FMAC4 soap_in_ns2__mul(struct soap*, const char*, struct ns2__mul *, const char*); #ifndef soap_write_ns2__mul #define soap_write_ns2__mul(soap, data) ( soap_begin_send(soap) || (soap_serialize_ns2__mul(soap, data), 0) || soap_put_ns2__mul(soap, data, "ns2:mul", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns2__mul(struct soap*, const struct ns2__mul *, const char*, const char*); #ifndef soap_read_ns2__mul #define soap_read_ns2__mul(soap, data) ( soap_begin_recv(soap) || !soap_get_ns2__mul(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 struct ns2__mul * SOAP_FMAC4 soap_get_ns2__mul(struct soap*, struct ns2__mul *, const char*, const char*); #ifndef SOAP_TYPE_ns2__mulResponse #define SOAP_TYPE_ns2__mulResponse (16) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns2__mulResponse(struct soap*, struct ns2__mulResponse *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns2__mulResponse(struct soap*, const struct ns2__mulResponse *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns2__mulResponse(struct soap*, const char*, int, const struct ns2__mulResponse *, const char*); SOAP_FMAC3 struct ns2__mulResponse * SOAP_FMAC4 soap_in_ns2__mulResponse(struct soap*, const char*, struct ns2__mulResponse *, const char*); #ifndef soap_write_ns2__mulResponse #define soap_write_ns2__mulResponse(soap, data) ( soap_begin_send(soap) || (soap_serialize_ns2__mulResponse(soap, data), 0) || soap_put_ns2__mulResponse(soap, data, "ns2:mulResponse", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns2__mulResponse(struct soap*, const struct ns2__mulResponse *, const char*, const char*); #ifndef soap_read_ns2__mulResponse #define soap_read_ns2__mulResponse(soap, data) ( soap_begin_recv(soap) || !soap_get_ns2__mulResponse(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 struct ns2__mulResponse * SOAP_FMAC4 soap_get_ns2__mulResponse(struct soap*, struct ns2__mulResponse *, const char*, const char*); #ifndef SOAP_TYPE_ns2__sub #define SOAP_TYPE_ns2__sub (14) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns2__sub(struct soap*, struct ns2__sub *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns2__sub(struct soap*, const struct ns2__sub *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns2__sub(struct soap*, const char*, int, const struct ns2__sub *, const char*); SOAP_FMAC3 struct ns2__sub * SOAP_FMAC4 soap_in_ns2__sub(struct soap*, const char*, struct ns2__sub *, const char*); #ifndef soap_write_ns2__sub #define soap_write_ns2__sub(soap, data) ( soap_begin_send(soap) || (soap_serialize_ns2__sub(soap, data), 0) || soap_put_ns2__sub(soap, data, "ns2:sub", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns2__sub(struct soap*, const struct ns2__sub *, const char*, const char*); #ifndef soap_read_ns2__sub #define soap_read_ns2__sub(soap, data) ( soap_begin_recv(soap) || !soap_get_ns2__sub(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 struct ns2__sub * SOAP_FMAC4 soap_get_ns2__sub(struct soap*, struct ns2__sub *, const char*, const char*); #ifndef SOAP_TYPE_ns2__subResponse #define SOAP_TYPE_ns2__subResponse (13) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns2__subResponse(struct soap*, struct ns2__subResponse *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns2__subResponse(struct soap*, const struct ns2__subResponse *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns2__subResponse(struct soap*, const char*, int, const struct ns2__subResponse *, const char*); SOAP_FMAC3 struct ns2__subResponse * SOAP_FMAC4 soap_in_ns2__subResponse(struct soap*, const char*, struct ns2__subResponse *, const char*); #ifndef soap_write_ns2__subResponse #define soap_write_ns2__subResponse(soap, data) ( soap_begin_send(soap) || (soap_serialize_ns2__subResponse(soap, data), 0) || soap_put_ns2__subResponse(soap, data, "ns2:subResponse", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns2__subResponse(struct soap*, const struct ns2__subResponse *, const char*, const char*); #ifndef soap_read_ns2__subResponse #define soap_read_ns2__subResponse(soap, data) ( soap_begin_recv(soap) || !soap_get_ns2__subResponse(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 struct ns2__subResponse * SOAP_FMAC4 soap_get_ns2__subResponse(struct soap*, struct ns2__subResponse *, const char*, const char*); #ifndef SOAP_TYPE_ns2__add #define SOAP_TYPE_ns2__add (11) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns2__add(struct soap*, struct ns2__add *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns2__add(struct soap*, const struct ns2__add *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns2__add(struct soap*, const char*, int, const struct ns2__add *, const char*); SOAP_FMAC3 struct ns2__add * SOAP_FMAC4 soap_in_ns2__add(struct soap*, const char*, struct ns2__add *, const char*); #ifndef soap_write_ns2__add #define soap_write_ns2__add(soap, data) ( soap_begin_send(soap) || (soap_serialize_ns2__add(soap, data), 0) || soap_put_ns2__add(soap, data, "ns2:add", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns2__add(struct soap*, const struct ns2__add *, const char*, const char*); #ifndef soap_read_ns2__add #define soap_read_ns2__add(soap, data) ( soap_begin_recv(soap) || !soap_get_ns2__add(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 struct ns2__add * SOAP_FMAC4 soap_get_ns2__add(struct soap*, struct ns2__add *, const char*, const char*); #ifndef SOAP_TYPE_ns2__addResponse #define SOAP_TYPE_ns2__addResponse (10) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns2__addResponse(struct soap*, struct ns2__addResponse *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns2__addResponse(struct soap*, const struct ns2__addResponse *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns2__addResponse(struct soap*, const char*, int, const struct ns2__addResponse *, const char*); SOAP_FMAC3 struct ns2__addResponse * SOAP_FMAC4 soap_in_ns2__addResponse(struct soap*, const char*, struct ns2__addResponse *, const char*); #ifndef soap_write_ns2__addResponse #define soap_write_ns2__addResponse(soap, data) ( soap_begin_send(soap) || (soap_serialize_ns2__addResponse(soap, data), 0) || soap_put_ns2__addResponse(soap, data, "ns2:addResponse", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns2__addResponse(struct soap*, const struct ns2__addResponse *, const char*, const char*); #ifndef soap_read_ns2__addResponse #define soap_read_ns2__addResponse(soap, data) ( soap_begin_recv(soap) || !soap_get_ns2__addResponse(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 struct ns2__addResponse * SOAP_FMAC4 soap_get_ns2__addResponse(struct soap*, struct ns2__addResponse *, const char*, const char*); #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_PointerToSOAP_ENV__Reason #define SOAP_TYPE_PointerToSOAP_ENV__Reason (33) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToSOAP_ENV__Reason(struct soap*, struct SOAP_ENV__Reason *const*); SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerToSOAP_ENV__Reason(struct soap*, const char *, int, struct SOAP_ENV__Reason *const*, const char *); SOAP_FMAC3 struct SOAP_ENV__Reason ** SOAP_FMAC4 soap_in_PointerToSOAP_ENV__Reason(struct soap*, const char*, struct SOAP_ENV__Reason **, const char*); #ifndef soap_write_PointerToSOAP_ENV__Reason #define soap_write_PointerToSOAP_ENV__Reason(soap, data) ( soap_begin_send(soap) || (soap_serialize_PointerToSOAP_ENV__Reason(soap, data), 0) || soap_put_PointerToSOAP_ENV__Reason(soap, data, "SOAP-ENV:Reason", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerToSOAP_ENV__Reason(struct soap*, struct SOAP_ENV__Reason *const*, const char*, const char*); #ifndef soap_read_PointerToSOAP_ENV__Reason #define soap_read_PointerToSOAP_ENV__Reason(soap, data) ( soap_begin_recv(soap) || !soap_get_PointerToSOAP_ENV__Reason(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 struct SOAP_ENV__Reason ** SOAP_FMAC4 soap_get_PointerToSOAP_ENV__Reason(struct soap*, struct SOAP_ENV__Reason **, const char*, const char*); #endif #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_PointerToSOAP_ENV__Detail #define SOAP_TYPE_PointerToSOAP_ENV__Detail (32) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToSOAP_ENV__Detail(struct soap*, struct SOAP_ENV__Detail *const*); SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerToSOAP_ENV__Detail(struct soap*, const char *, int, struct SOAP_ENV__Detail *const*, const char *); SOAP_FMAC3 struct SOAP_ENV__Detail ** SOAP_FMAC4 soap_in_PointerToSOAP_ENV__Detail(struct soap*, const char*, struct SOAP_ENV__Detail **, const char*); #ifndef soap_write_PointerToSOAP_ENV__Detail #define soap_write_PointerToSOAP_ENV__Detail(soap, data) ( soap_begin_send(soap) || (soap_serialize_PointerToSOAP_ENV__Detail(soap, data), 0) || soap_put_PointerToSOAP_ENV__Detail(soap, data, "SOAP-ENV:Detail", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerToSOAP_ENV__Detail(struct soap*, struct SOAP_ENV__Detail *const*, const char*, const char*); #ifndef soap_read_PointerToSOAP_ENV__Detail #define soap_read_PointerToSOAP_ENV__Detail(soap, data) ( soap_begin_recv(soap) || !soap_get_PointerToSOAP_ENV__Detail(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 struct SOAP_ENV__Detail ** SOAP_FMAC4 soap_get_PointerToSOAP_ENV__Detail(struct soap*, struct SOAP_ENV__Detail **, const char*, const char*); #endif #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_PointerToSOAP_ENV__Code #define SOAP_TYPE_PointerToSOAP_ENV__Code (26) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToSOAP_ENV__Code(struct soap*, struct SOAP_ENV__Code *const*); SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerToSOAP_ENV__Code(struct soap*, const char *, int, struct SOAP_ENV__Code *const*, const char *); SOAP_FMAC3 struct SOAP_ENV__Code ** SOAP_FMAC4 soap_in_PointerToSOAP_ENV__Code(struct soap*, const char*, struct SOAP_ENV__Code **, const char*); #ifndef soap_write_PointerToSOAP_ENV__Code #define soap_write_PointerToSOAP_ENV__Code(soap, data) ( soap_begin_send(soap) || (soap_serialize_PointerToSOAP_ENV__Code(soap, data), 0) || soap_put_PointerToSOAP_ENV__Code(soap, data, "SOAP-ENV:Code", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerToSOAP_ENV__Code(struct soap*, struct SOAP_ENV__Code *const*, const char*, const char*); #ifndef soap_read_PointerToSOAP_ENV__Code #define soap_read_PointerToSOAP_ENV__Code(soap, data) ( soap_begin_recv(soap) || !soap_get_PointerToSOAP_ENV__Code(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 struct SOAP_ENV__Code ** SOAP_FMAC4 soap_get_PointerToSOAP_ENV__Code(struct soap*, struct SOAP_ENV__Code **, const char*, const char*); #endif #ifndef SOAP_TYPE_PointerTodouble #define SOAP_TYPE_PointerTodouble (8) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTodouble(struct soap*, double *const*); SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTodouble(struct soap*, const char *, int, double *const*, const char *); SOAP_FMAC3 double ** SOAP_FMAC4 soap_in_PointerTodouble(struct soap*, const char*, double **, const char*); #ifndef soap_write_PointerTodouble #define soap_write_PointerTodouble(soap, data) ( soap_begin_send(soap) || (soap_serialize_PointerTodouble(soap, data), 0) || soap_put_PointerTodouble(soap, data, "double", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTodouble(struct soap*, double *const*, const char*, const char*); #ifndef soap_read_PointerTodouble #define soap_read_PointerTodouble(soap, data) ( soap_begin_recv(soap) || !soap_get_PointerTodouble(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 double ** SOAP_FMAC4 soap_get_PointerTodouble(struct soap*, double **, const char*, const char*); #ifndef SOAP_TYPE__QName #define SOAP_TYPE__QName (5) #endif #define soap_default__QName(soap, a) soap_default_string(soap, a) #define soap_serialize__QName(soap, a) soap_serialize_string(soap, a) SOAP_FMAC3 int SOAP_FMAC4 soap_out__QName(struct soap*, const char*, int, char*const*, const char*); SOAP_FMAC3 char * * SOAP_FMAC4 soap_in__QName(struct soap*, const char*, char **, const char*); #ifndef soap_write__QName #define soap_write__QName(soap, data) ( soap_begin_send(soap) || (soap_serialize__QName(soap, data), 0) || soap_put__QName(soap, data, "byte", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put__QName(struct soap*, char *const*, const char*, const char*); #ifndef soap_read__QName #define soap_read__QName(soap, data) ( soap_begin_recv(soap) || !soap_get__QName(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 char ** SOAP_FMAC4 soap_get__QName(struct soap*, char **, const char*, const char*); #ifndef SOAP_TYPE_string #define SOAP_TYPE_string (4) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_string(struct soap*, char **); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_string(struct soap*, char *const*); SOAP_FMAC3 int SOAP_FMAC4 soap_out_string(struct soap*, const char*, int, char*const*, const char*); SOAP_FMAC3 char * * SOAP_FMAC4 soap_in_string(struct soap*, const char*, char **, const char*); #ifndef soap_write_string #define soap_write_string(soap, data) ( soap_begin_send(soap) || (soap_serialize_string(soap, data), 0) || soap_put_string(soap, data, "byte", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_string(struct soap*, char *const*, const char*, const char*); #ifndef soap_read_string #define soap_read_string(soap, data) ( soap_begin_recv(soap) || !soap_get_string(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 char ** SOAP_FMAC4 soap_get_string(struct soap*, char **, const char*, const char*); #ifdef __cplusplus } #endif #endif /* End of soapH.h */ gsoap-2.8.28/gsoap/ios_plugin/examples/Calc/Classes/stdsoap2.h0000644000175000017500000026174512653650146023561 0ustar ellertellert/* stdsoap2.h 2.8.8 gSOAP runtime engine gSOAP XML Web services tools Copyright (C) 2000-2011, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under ONE of the following licenses: GPL, or the gSOAP public license, or Genivia's license for commercial use. -------------------------------------------------------------------------------- Contributors: Wind River Systems, Inc., for the following additions - vxWorks compatible -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2011, Robert van Engelen, Genivia Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #define GSOAP_VERSION 20808 #ifdef WITH_SOAPDEFS_H # include "soapdefs.h" /* include user-defined stuff */ #endif #ifndef _THREAD_SAFE # define _THREAD_SAFE #endif #ifndef OPENSERVER # ifndef _REENTRANT # define _REENTRANT # endif #endif #ifndef SOAP_FMAC1 /* stdsoap2.h declaration macro */ # define SOAP_FMAC1 #endif #ifndef SOAP_FMAC2 /* stdsoap2.h declaration macro */ # define SOAP_FMAC2 #endif #ifndef SOAP_FMAC3 /* (de)serializer declaration macro */ # define SOAP_FMAC3 #endif #ifndef SOAP_FMAC3S /* string converter for (de)serializer declaration macro */ # define SOAP_FMAC3S SOAP_FMAC3 #endif #ifndef SOAP_FMAC4 /* (de)serializer declaration macro */ # define SOAP_FMAC4 #endif #ifndef SOAP_FMAC4S /* string converter for (de)serializer declaration macro */ # define SOAP_FMAC4S SOAP_FMAC4 #endif #ifndef SOAP_FMAC5 /* stub/skeleton declaration macro */ # define SOAP_FMAC5 #endif #ifndef SOAP_FMAC6 /* stub/skeleton declaration macro */ # define SOAP_FMAC6 #endif #ifndef SOAP_CMAC /* class declaration macro */ # define SOAP_CMAC #endif #ifndef SOAP_NMAC /* namespace table declaration macro */ # define SOAP_NMAC #endif #ifndef SOAP_SOURCE_STAMP # define SOAP_SOURCE_STAMP(str) #endif /* gSOAP 2.7.4 and higher: fast look-aside buffering is stable */ #ifndef WITH_FAST # define WITH_FAST #endif #ifndef STDSOAP_H #define STDSOAP_H #if defined(__vxworks) || defined(__VXWORKS__) # ifndef VXWORKS # define VXWORKS # endif #endif #ifdef _WIN32 # ifndef WIN32 # define WIN32 # endif #endif #ifdef _WIN32_WCE # ifndef UNDER_CE # define UNDER_CE _WIN32_WCE # endif #endif #ifdef UNDER_CE # ifndef WIN32 # define WIN32 # endif #endif #ifdef __BORLANDC__ # ifdef __WIN32__ # ifndef WIN32 # define WIN32 # endif # endif #endif #ifdef __CYGWIN__ # ifndef CYGWIN # define CYGWIN # endif #endif #ifdef __SYMBIAN32__ # define SYMBIAN # undef WIN32 #endif #if defined(__palmos__) || defined(PALM_GCC) || defined(__PALMOS_TRAPS__) # ifndef PALM # define PALM # endif #endif #if defined(__hpux) # ifndef HP_UX # define HP_UX # endif #endif #if defined(__digital__) && defined(__unix__) # ifndef TRU64 # define TRU64 # endif #endif #ifdef __MVS__ # ifndef OS390 # define OS390 # endif #endif #ifdef HAVE_CONFIG_H # include "config.h" # if defined(WITH_OPENSSL) # ifndef HAVE_OPENSSL_SSL_H # undef WITH_OPENSSL # endif # endif # if defined(WITH_GNUTLS) # ifndef HAVE_GNUTLS_GNUTLS_H # undef WITH_GNUTLS # endif # endif # if defined(WITH_ZLIB) || defined(WITH_GZIP) # ifndef HAVE_ZLIB_H # undef WITH_ZLIB # undef WITH_GZIP # endif # endif #else # if defined(UNDER_CE) # define WITH_LEAN # define HAVE_SSCANF # elif defined(WIN32) # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOD_L # define HAVE_SPRINTF_L # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_SYS_TIMEB_H # define HAVE_FTIME # define HAVE_GMTIME # define HAVE_WCTOMB # define HAVE_MBTOWC # define SOAP_LONG_FORMAT "%I64d" # define SOAP_ULONG_FORMAT "%I64u" # elif defined(CYGWIN) # define HAVE_POLL # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_SYS_TIMEB_H # define HAVE_FTIME # define HAVE_RAND_R # define HAVE_GMTIME_R # define HAVE_LOCALTIME_R # define HAVE_STRERROR_R # define HAVE_WCTOMB # define HAVE_MBTOWC # elif defined(__APPLE__) # define HAVE_POLL # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOD_L # define HAVE_SSCANF_L # define HAVE_SPRINTF_L # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_RAND_R # define HAVE_GMTIME_R # define HAVE_LOCALTIME_R # define HAVE_STRERROR_R # define HAVE_TIMEGM # define HAVE_WCTOMB # define HAVE_MBTOWC # elif defined(_AIX43) # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_SYS_TIMEB_H # define HAVE_FTIME # define HAVE_RAND_R # define HAVE_GMTIME_R # define HAVE_LOCALTIME_R # define HAVE_WCTOMB # define HAVE_MBTOWC # elif defined(_AIX41) # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_SYS_TIMEB_H # define HAVE_WCTOMB # define HAVE_MBTOWC # elif defined(HP_UX) # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_SYS_TIMEB_H # define HAVE_FTIME # define HAVE_RAND_R # define HAVE_GMTIME_R # define HAVE_LOCALTIME_R # define HAVE_WCTOMB # define HAVE_MBTOWC # define HAVE_ISNAN # define HAVE_ISINF # elif defined(FREEBSD) || defined(__FreeBSD__) || defined(OPENBSD) # define HAVE_POLL # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOD_L # define HAVE_SSCANF_L # define HAVE_SPRINTF_L # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_STRTOLL # define HAVE_STRTOULL # define HAVE_GETTIMEOFDAY # define HAVE_RAND_R # define HAVE_GMTIME_R # define HAVE_LOCALTIME_R # define HAVE_STRERROR_R # define HAVE_WCTOMB # define HAVE_MBTOWC # define SOAP_LONG_FORMAT "%qd" # define SOAP_ULONG_FORMAT "%qu" # define HAVE_ISNAN # define HAVE_ISINF # elif defined(__VMS) # include # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_SYS_TIMEB_H # define HAVE_FTIME # define HAVE_RAND_R # define HAVE_GMTIME_R # define HAVE_LOCALTIME_R # define HAVE_WCTOMB # define HAVE_MBTOWC # elif defined(__GLIBC__) || defined(__GNU__) # define HAVE_POLL # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOD_L # define HAVE_SSCANF_L # define HAVE_SPRINTF_L # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_STRTOLL # define HAVE_STRTOULL # define HAVE_SYS_TIMEB_H # define HAVE_FTIME # define HAVE_RAND_R # define HAVE_GMTIME_R # define HAVE_LOCALTIME_R # define HAVE_STRERROR_R # define HAVE_TIMEGM # define HAVE_WCTOMB # define HAVE_MBTOWC # define HAVE_ISNAN # define HAVE_ISINF # elif defined(TRU64) # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_GETTIMEOFDAY # define HAVE_SYS_TIMEB_H # define HAVE_RAND_R # define HAVE_GMTIME_R # define HAVE_LOCALTIME_R # define __USE_STD_IOSTREAM # define HAVE_WCTOMB # define HAVE_MBTOWC # define SOAP_LONG_FORMAT "%ld" # define SOAP_ULONG_FORMAT "%lu" # elif defined(MAC_CARBON) # define WITH_NOIO # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOD_L # define HAVE_SSCANF_L # define HAVE_SPRINTF_L # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_FTIME # define HAVE_RAND_R # define HAVE_GETHOSTBYNAME_R # define HAVE_GMTIME_R # define HAVE_LOCALTIME_R # define HAVE_STRERROR_R # define HAVE_WCTOMB # define HAVE_MBTOWC # elif defined(PALM) # define WITH_LEAN # define HAVE_STRTOD /* strtod() is defined in palmFunctions.h */ # include /* Needs to be included before unix headers */ # include # define IGNORE_STDIO_STUBS # include # define O_NONBLOCK FNONBIO # include # include "palmFunctions.h" # elif defined(SYMBIAN) # define WITH_LEAN # define WITH_NONAMESPACES # define HAVE_STRTOD /* use STRTOD since sscanf doesn't seem to work */ # include # include # elif defined(VXWORKS) # ifdef _WRS_KERNEL # define _POSIX_THREADS 1 # endif # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_GMTIME # define HAVE_LOCALTIME # define HAVE_MKTIME # elif defined(OS390) # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_SYS_TIMEB_H # define HAVE_FTIME # define HAVE_RAND_R # define HAVE_GMTIME_R # define HAVE_LOCALTIME_R # define HAVE_WCTOMB # define HAVE_MBTOWC # elif defined(AS400) # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_SYS_TIMEB_H # define HAVE_FTIME # define HAVE_RAND_R # define HAVE_GMTIME_R # define HAVE_LOCALTIME_R # define HAVE_WCTOMB # define HAVE_MBTOWC # elif defined(__QNX__) || defined(QNX) /* QNX does not have a working version of strtof */ # undef HAVE_STRTOF # define HAVE_POLL # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_SYS_TIMEB_H # define HAVE_FTIME # define HAVE_RAND_R # define HAVE_GETHOSTBYNAME_R # define HAVE_GMTIME_R # define HAVE_LOCALTIME_R # define HAVE_STRERROR_R # define HAVE_WCTOMB # define HAVE_MBTOWC # define LONG64 long # define ULONG64 unsigned LONG64 # define SOAP_LONG_FORMAT "%ld" # define SOAP_ULONG_FORMAT "%lu" # elif defined(SUN_OS) # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_SYS_TIMEB_H # define HAVE_FTIME # define HAVE_RAND_R # define HAVE_GETHOSTBYNAME_R # define HAVE_GMTIME_R # define HAVE_LOCALTIME_R # else /* Default assumptions for supported functions */ # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_SYS_TIMEB_H # define HAVE_FTIME # define HAVE_RAND_R # define HAVE_GETHOSTBYNAME_R # define HAVE_GMTIME_R # define HAVE_LOCALTIME_R # define HAVE_STRERROR_R # ifdef MB_LEN_MAX # define HAVE_WCTOMB # define HAVE_MBTOWC # endif # endif #endif /* gSOAP 2.7.15 and higher: always retain CDATA in literal XML, unless WITH_LEAN or WITH_NOCDATA */ #ifndef WITH_LEAN # ifndef WITH_NOCDATA # ifndef WITH_CDATA # define WITH_CDATA # endif # endif #endif #ifdef WITH_LEANER # ifndef WITH_LEAN # define WITH_LEAN # endif #endif #ifdef WITH_LEAN # ifdef WITH_COOKIES # error "Cannot build WITH_LEAN code WITH_COOKIES enabled" # endif #endif /* native Win, HP-UX, and AIX compilers don't like empty structs */ #if defined(WIN32) || defined(HP_UX) || defined(_AIX41) || defined(_AIX43) || defined(VXWORKS) # define WITH_NOEMPTYSTRUCT #endif #ifdef WITH_PURE_VIRTUAL # define SOAP_PURE_VIRTUAL = 0 #else # define SOAP_PURE_VIRTUAL #endif #ifdef HP_UX # undef HAVE_STRTOLL # undef HAVE_STRTOULL #endif /* older OpenVMS TCP/IP stacks cannot handle 65536 bytes */ #ifdef __VMS # ifndef SOAP_BUFLEN # define SOAP_BUFLEN (65535) # endif #endif /* if we have xlocale.h we use it to avoid decimal point conversion issues */ #ifdef WITH_C_LOCALE # ifdef WIN32 # include # else # include # endif #else # undef HAVE_STRTOF_L # undef HAVE_STRTOD_L # undef HAVE_SSCANF_L # undef HAVE_SPRINTF_L #endif #ifdef TANDEM_NONSTOP # define SOAP_BUFLEN (32767) /*# define WITH_NOSTDLIB */ /* uncommment to remove stdlib dependences */ # define WITH_NOIO /* no IO dependences, e.g. remove TCP/IP */ # define int32_t int # define int64_t long long # define LONG64 long long # define ULONG64 long long # define DBL_PINFTY (1.1579208923716189e77) # define WITH_NOEMPTYSTRUCT # undef HAVE_WCTOMB # undef HAVE_MBTOWC # undef HAVE_GMTIME_R # undef HAVE_LOCALTIME_R # undef HAVE_SNPRINTF # define SOAP_BUFLEN (32767) # define SOAP_SOCKET short #pragma nolist # include # include # include # include # include # include # include # include # include # include # include # define INET_ERROR 4294967295 #pragma list #endif #ifndef WITH_NOSTDLIB # include # ifndef PALM # include # include # endif # include # include #endif #ifdef WITH_NTLM # include #endif #ifdef HAVE_POLL # include #endif #if defined(__cplusplus) && !defined(WITH_LEAN) && !defined(WITH_COMPAT) # include # include #endif #ifdef WITH_NOHTTP # ifndef WITH_NOIO # define WITH_NOIO # undef WITH_COOKIES # endif #endif /* Suggestion when SOAP_FD_EXCEEDED error occurs: Some systems allow increasing FD_SETSIZE before including sys/types.h: #define FD_SETSIZE (2048) */ #ifndef UNDER_CE # ifndef PALM # ifndef WITH_NOIO # include # include # endif # ifndef WITH_LEAN # ifdef HAVE_SYS_TIMEB_H # include /* for ftime() */ # endif # include # endif # endif #endif #ifdef OPENSERVER # include # include # include extern int h_errno; #endif #ifndef WITH_NOIO # ifndef WIN32 # ifndef PALM # include # ifdef VXWORKS # include # include # ifndef _WRS_KERNEL # include # endif # else # ifndef SYMBIAN # include # endif # endif # ifdef SUN_OS # include /* SUN */ # include /* SUN < 2.8 (?) */ # endif # ifdef VXWORKS # ifdef _WRS_KERNEL # include # endif # else # include # endif # include # ifdef OS390 # include # else # include /* TCP_NODELAY */ # endif # include # endif # endif #endif #ifdef WIN32 # define SOAP_WINSOCKINT int #else # define SOAP_WINSOCKINT size_t #endif #if defined(WITH_IPV6_V6ONLY) || defined(WITH_NO_IPV6_V6ONLY) # ifndef WITH_IPV6 # define WITH_IPV6 # endif #endif #ifdef WIN32 # ifndef UNDER_CE # include # include # endif // When you get macro redefinition errors when compiling the code below: // try arrange your include list that is included after "stdsoap2.h" // or define _WINSOCKAPI_ first: // #define _WINSOCKAPI_ // stops windows.h including winsock.h // #include // #include "stdsoap2.h" # include /* Visual Studio 2005 users: install Platform SDK (R2) */ # include // # define _WSPIAPI_COUNTOF /* DEV NOTE: enble to fix problems with VC6 */ // # include # include /* DEV NOTE: replaces older wspiapi.h above */ # ifdef WITH_IPV6 # define SOAP_GAI_STRERROR gai_strerrorA # endif #else # ifdef VXWORKS # include # include # include # endif # ifndef WITH_NOIO # ifndef PALM # include # include # include # include # ifdef _AIX41 # include # endif # endif # endif #endif #ifdef WITH_FASTCGI # include #endif #ifdef WITH_OPENSSL # ifdef __VMS # pragma names save # pragma names uppercase # endif # undef WITH_GNUTLS # define OPENSSL_NO_KRB5 # include # include # include # include # include # ifndef ALLOW_OLD_VERSIONS # if (OPENSSL_VERSION_NUMBER < 0x00905100L) # error "Must use OpenSSL 0.9.6 or later" # endif # endif # ifdef __VMS # pragma names restore # endif #endif #ifdef WITH_GNUTLS # include # include # include # ifndef HAVE_PTHREAD_H # ifdef _POSIX_THREADS # define HAVE_PTHREAD_H /* make GNUTLS thread safe */ # endif # endif #endif #ifdef WITH_GZIP # ifndef WITH_ZLIB # define WITH_ZLIB # endif #endif #ifdef WITH_CASEINSENSITIVETAGS # define SOAP_STRCMP soap_tag_cmp /* case insensitve XML element/attribute names */ #else # define SOAP_STRCMP strcmp /* case sensitive XML element/attribute names */ #endif #ifdef WITH_ZLIB # include #endif #ifndef WITH_NOSTDLIB # ifndef PALM # include /* for isnan() */ # endif #endif /* #define DEBUG */ /* Uncomment to debug sending (in file SENT.log) receiving (in file RECV.log) and messages (in file TEST.log) */ #ifdef __cplusplus extern "C" { #endif /* Portability: define SOAP_SOCKLEN_T */ #if defined(_AIX) # if defined(_AIX43) # define SOAP_SOCKLEN_T socklen_t # else # define SOAP_SOCKLEN_T int # endif #elif defined(SOCKLEN_T) # define SOAP_SOCKLEN_T SOCKLEN_T #elif defined(__socklen_t_defined) || defined(_SOCKLEN_T) || defined(CYGWIN) || defined(FREEBSD) || defined(__FreeBSD__) || defined(OPENBSD) || defined(__QNX__) || defined(QNX) || defined(OS390) || defined(HP_UX) # define SOAP_SOCKLEN_T socklen_t #elif defined(IRIX) || defined(WIN32) || defined(__APPLE__) || defined(SUN_OS) || defined(OPENSERVER) || defined(TRU64) || defined(VXWORKS) # define SOAP_SOCKLEN_T int #else # define SOAP_SOCKLEN_T size_t #endif #ifndef SOAP_SOCKET # ifdef WIN32 # define SOAP_SOCKET SOCKET # define soap_closesocket(n) closesocket(n) # else # define SOAP_SOCKET int # define soap_closesocket(n) close(n) # endif #endif #define SOAP_INVALID_SOCKET ((SOAP_SOCKET)-1) #define soap_valid_socket(n) ((n) != SOAP_INVALID_SOCKET) #define SOAP_SHUT_WR 1 #define SOAP_SHUT_RDWR 2 #ifndef SOAP_GAI_STRERROR # define SOAP_GAI_STRERROR gai_strerror #endif #ifndef FD_SETSIZE # define FD_SETSIZE (1024) #endif #ifdef WITH_LEAN # define SOAP_CHK_EOF SOAP_EOF #else # define SOAP_CHK_EOF (soap->error ? soap->error : SOAP_EOF) #endif #if defined(SYMBIAN) # define LONG64 long # define ULONG64 unsigned LONG64 #elif !defined(WIN32) || defined(CYGWIN) || defined(__GLIBC__) || defined(__GNU__) # ifndef LONG64 # if defined(HAVE_STDINT_H) # include # define LONG64 int64_t # define ULONG64 uint64_t # elif defined(__GLIBC__) # include # if (__WORDSIZE == 64) # define LONG64 int64_t # define ULONG64 uint64_t # ifndef SOAP_LONG_FORMAT # define SOAP_LONG_FORMAT "%ld" # endif # ifndef SOAP_ULONG_FORMAT # define SOAP_ULONG_FORMAT "%lu" # endif # else # define LONG64 long long # define ULONG64 unsigned LONG64 # endif # else # define LONG64 long long # define ULONG64 unsigned LONG64 # endif # endif #elif defined(UNDER_CE) # define LONG64 __int64 # define ULONG64 unsigned LONG64 #elif defined(__BORLANDC__) # define LONG64 __int64 # define ULONG64 unsigned LONG64 #endif #ifndef SOAP_LONG_FORMAT # define SOAP_LONG_FORMAT "%lld" /* printf format for 64 bit ints */ #endif #ifndef SOAP_ULONG_FORMAT # define SOAP_ULONG_FORMAT "%llu" /* printf format for unsigned 64 bit ints */ #endif #if defined(WIN32) && !defined(CYGWIN) # define soap_int32 __int32 #elif defined(SYMBIAN) # define soap_int32 long #elif defined(PALM) # define soap_int32 Int32 #elif defined(_AIX) # if defined(_AIX43) # define soap_int32 int32_t # else # define soap_int32 signed int # endif #else # define soap_int32 int32_t #endif #ifdef WIN32 # define SOAP_ERANGE ERANGE # define SOAP_EINTR WSAEINTR # define SOAP_EAGAIN WSAEWOULDBLOCK # define SOAP_EWOULDBLOCK WSAEWOULDBLOCK # define SOAP_EINPROGRESS WSAEINPROGRESS # define SOAP_EADDRINUSE WSAEADDRINUSE #else # define SOAP_ERANGE ERANGE # define SOAP_EINTR EINTR # define SOAP_EAGAIN EAGAIN # define SOAP_EADDRINUSE EADDRINUSE # ifdef SYMBIAN # define SOAP_EWOULDBLOCK 9898 # define SOAP_EINPROGRESS 9899 # else # define SOAP_EWOULDBLOCK EWOULDBLOCK # define SOAP_EINPROGRESS EINPROGRESS # endif #endif #ifdef WIN32 # ifdef UNDER_CE # define soap_errno GetLastError() # define soap_socket_errno(s) GetLastError() # define soap_reset_errno SetLastError(0) # else # define soap_errno GetLastError() # define soap_socket_errno(s) WSAGetLastError() # define soap_reset_errno SetLastError(0) # endif #else # ifndef WITH_NOIO # define soap_errno errno # define soap_socket_errno(s) errno # define soap_reset_errno (errno = 0) # else # define soap_errno 0 # define soap_socket_errno(s) 0 # define soap_reset_errno # endif #endif #ifndef SOAP_BUFLEN # if !defined(WITH_LEAN) # define SOAP_BUFLEN (65536) /* buffer length for socket packets, also used by gethostbyname_r and UDP messages, so don't make this too small */ # else # define SOAP_BUFLEN (2048) /* lean size */ # endif #endif #ifndef SOAP_LABLEN # define SOAP_LABLEN (256) /* initial look-aside buffer length */ #endif #ifndef SOAP_PTRBLK # define SOAP_PTRBLK (32) /* block allocation for pointer hash table chains */ #endif #ifndef SOAP_PTRHASH # ifndef WITH_LEAN # define SOAP_PTRHASH (4096) /* size of pointer analysis hash table (must be power of 2) */ # else # define SOAP_PTRHASH (32) # endif #endif #ifndef SOAP_IDHASH # ifndef WITH_LEAN # define SOAP_IDHASH (1999) /* prime size of hash table for parsed id/ref */ # else # define SOAP_IDHASH (19) /* 19, 199 */ # endif #endif #ifndef SOAP_BLKLEN # ifndef WITH_LEAN # define SOAP_BLKLEN (256) /* to collect long strings and XML attributes */ # else # define SOAP_BLKLEN (32) # endif #endif #ifndef SOAP_TAGLEN # ifndef WITH_LEAN # define SOAP_TAGLEN (1024) /* maximum length of XML element tag/attribute name or host/path name + 1 */ # else # define SOAP_TAGLEN (128) # endif #endif #ifndef SOAP_HDRLEN # ifndef WITH_LEAN # define SOAP_HDRLEN (8192) /* maximum length of HTTP header line (must be >4096 to read cookies) */ # else # define SOAP_HDRLEN (1024) # endif #endif #ifndef SOAP_MAXDIMS # ifndef WITH_LEAN # define SOAP_MAXDIMS (16) /* maximum array dimensions (array nestings) must be less than 64 to protect soap->tmpbuf */ # else # define SOAP_MAXDIMS (4) # endif #endif #ifndef SOAP_MAXLOGS # define SOAP_MAXLOGS (3) /* max number of debug logs per struct soap environment */ # define SOAP_INDEX_RECV (0) # define SOAP_INDEX_SENT (1) # define SOAP_INDEX_TEST (2) #endif /* Max iterations in soap_serve() to keep server connection alive */ #ifndef SOAP_MAXKEEPALIVE # define SOAP_MAXKEEPALIVE (100) #endif /* Trusted max size of inbound SOAP array for compound array allocation. Increase if necessary to allow larger arrays. */ #ifndef SOAP_MAXARRAYSIZE # define SOAP_MAXARRAYSIZE (1000000) #endif #ifdef VXWORKS # ifdef WMW_RPM_IO # include "httpLib.h" # endif # ifdef __INCmathh # include # ifndef HAVE_ISNAN # define HAVE_ISNAN # endif # ifndef soap_isnan # define soap_isnan(num) isNan(num) # endif # endif # ifdef WM_SECURE_KEY_STORAGE # include # endif #endif #ifdef WIN32 # include # ifndef HAVE_ISNAN # define HAVE_ISNAN # endif # define soap_isnan(n) _isnan(n) # ifndef HAVE_ISINF # define HAVE_ISINF # endif # define soap_isinf(n) (!_finite(n)) #endif #ifdef SUN_OS # define HAVE_ISNAN #endif #ifdef __APPLE__ # ifdef __cplusplus # ifndef isnan extern "C" int isnan(double); extern "C" int isinf(double); # endif # endif # ifndef HAVE_ISNAN # define HAVE_ISNAN # endif # ifndef HAVE_ISINF # define HAVE_ISINF # endif #endif #if !defined(HAVE_ISNAN) && (defined(_MATH_H) || defined(_MATH_INCLUDED)) # define HAVE_ISNAN #endif union soap_double_nan {struct {unsigned int n1, n2;} iv; double dv; float fv;}; extern const union soap_double_nan soap_double_nan; extern const char soap_base64o[], soap_base64i[]; #ifdef VXWORKS # ifndef FLT_MAX # define FLT_MAX _ARCH_FLT_MAX # endif # ifndef DBL_MAX # define DBL_MAX _ARCH_DBL_MAX # endif #endif #ifndef FLT_NAN # define FLT_NAN (soap_double_nan.fv) #endif #ifndef FLT_PINFTY # if defined(FLT_MAX) # define FLT_PINFTY FLT_MAX # elif defined(HUGE_VALF) # define FLT_PINFTY (float)HUGE_VALF # elif defined(HUGE_VAL) # define FLT_PINFTY (float)HUGE_VAL # elif defined(FLOAT_MAX) # define FLT_PINFTY FLOAT_MAX # else # define FLT_PINFTY (3.40282347e+38F) # endif #endif #ifndef FLT_NINFTY # define FLT_NINFTY (-FLT_PINFTY) #endif #ifndef DBL_NAN # define DBL_NAN (soap_double_nan.dv) #endif #ifndef DBL_PINFTY # if defined(DBL_MAX) # define DBL_PINFTY DBL_MAX # elif defined(HUGE_VALF) # define DBL_PINFTY (double)HUGE_VALF # elif defined(HUGE_VAL) # define DBL_PINFTY (double)HUGE_VAL # elif defined(DOUBLE_MAX) # define DBL_PINFTY DOUBLE_MAX # else # define DBL_PINFTY (1.7976931348623157e+308) # endif #endif #ifndef DBL_NINFTY # define DBL_NINFTY (-DBL_PINFTY) #endif #ifndef soap_isnan # ifdef HAVE_ISNAN # define soap_isnan(n) isnan(n) # else # define soap_isnan(n) ((n) != (n)) # endif #endif #ifndef soap_isinf # ifdef HAVE_ISINF # define soap_isinf(n) isinf(n) # else # define soap_isinf(n) (!soap_isnan(n) && soap_isnan((n) - (n))) # endif #endif #define soap_ispinfd(n) ((n) > 0 && soap_isinf(n)) #define soap_ispinff(n) ((n) > 0 && soap_isinf(n)) #define soap_isninfd(n) ((n) < 0 && soap_isinf(n)) #define soap_isninff(n) ((n) < 0 && soap_isinf(n)) /* gSOAP error codes */ #define SOAP_EOF EOF #define SOAP_ERR EOF #define SOAP_OK 0 #define SOAP_CLI_FAULT 1 #define SOAP_SVR_FAULT 2 #define SOAP_TAG_MISMATCH 3 #define SOAP_TYPE 4 #define SOAP_SYNTAX_ERROR 5 #define SOAP_NO_TAG 6 #define SOAP_IOB 7 #define SOAP_MUSTUNDERSTAND 8 #define SOAP_NAMESPACE 9 #define SOAP_USER_ERROR 10 #define SOAP_FATAL_ERROR 11 #define SOAP_FAULT 12 #define SOAP_NO_METHOD 13 #define SOAP_NO_DATA 14 #define SOAP_GET_METHOD 15 #define SOAP_PUT_METHOD 16 #define SOAP_DEL_METHOD 17 /* deprecated */ #define SOAP_HEAD_METHOD 18 /* deprecated */ #define SOAP_HTTP_METHOD 19 #define SOAP_EOM 20 #define SOAP_MOE 21 #define SOAP_HDR 22 #define SOAP_NULL 23 #define SOAP_DUPLICATE_ID 24 #define SOAP_MISSING_ID 25 #define SOAP_HREF 26 #define SOAP_UDP_ERROR 27 #define SOAP_TCP_ERROR 28 #define SOAP_HTTP_ERROR 29 #define SOAP_SSL_ERROR 30 #define SOAP_ZLIB_ERROR 31 #define SOAP_DIME_ERROR 32 #define SOAP_DIME_HREF 33 #define SOAP_DIME_MISMATCH 34 #define SOAP_DIME_END 35 #define SOAP_MIME_ERROR 36 #define SOAP_MIME_HREF 37 #define SOAP_MIME_END 38 #define SOAP_VERSIONMISMATCH 39 #define SOAP_PLUGIN_ERROR 40 #define SOAP_DATAENCODINGUNKNOWN 41 #define SOAP_REQUIRED 42 #define SOAP_PROHIBITED 43 #define SOAP_OCCURS 44 #define SOAP_LENGTH 45 #define SOAP_FD_EXCEEDED 46 #define SOAP_UTF_ERROR 47 #define SOAP_NTLM_ERROR 48 #define soap_xml_error_check(e) ((e) == SOAP_TAG_MISMATCH || (e) == SOAP_NO_TAG || (e) == SOAP_SYNTAX_ERROR || (e) == SOAP_NAMESPACE || (e) == SOAP_DUPLICATE_ID || (e) == SOAP_MISSING_ID || (e) == SOAP_REQUIRED || (e) == SOAP_PROHIBITED || (e) == SOAP_OCCURS || (e) == SOAP_LENGTH || (e) == SOAP_NULL || (e) == SOAP_HREF) #define soap_soap_error_check(e) ((e) == SOAP_CLI_FAULT || (e) == SOAP_SVR_FAULT || (e) == SOAP_VERSIONMISMATCH || (e) == SOAP_MUSTUNDERSTAND || (e) == SOAP_FAULT || (e) == SOAP_NO_METHOD) #define soap_tcp_error_check(e) ((e) == SOAP_EOF || (e) == SOAP_TCP_ERROR) #define soap_ssl_error_check(e) ((e) == SOAP_SSL_ERROR) #define soap_zlib_error_check(e) ((e) == SOAP_ZLIB_ERROR) #define soap_http_error_check(e) ((e) == SOAP_HTTP_ERROR || (e) == SOAP_NO_DATA || ((e) >= SOAP_GET_METHOD && (e) <= SOAP_HTTP_METHOD) || ((e) >= 100 && (e) < 600)) /* gSOAP HTTP response status codes 100 to 599 are reserved */ /* Codes 600 to 999 are user definable */ /* Exceptional gSOAP HTTP server response status codes >= 1000 */ #define SOAP_STOP 1000 /* No HTTP response */ #define SOAP_FORM 1001 /* Request (form) data is present, no HTTP response */ #define SOAP_HTML 1002 /* Custom HTML response */ #define SOAP_FILE 1003 /* Custom file-based response */ /* gSOAP HTTP method codes (client) */ #define SOAP_POST 2000 /* POST request */ #define SOAP_POST_FILE 2001 /* Custom file-based POST request */ #define SOAP_GET 2002 /* GET request */ #define SOAP_PUT 2003 /* PUT request */ #define SOAP_DEL 2004 /* DELETE request */ #define SOAP_CONNECT 2005 /* CONNECT request */ /* gSOAP DIME */ #define SOAP_DIME_CF 0x01 #define SOAP_DIME_ME 0x02 #define SOAP_DIME_MB 0x04 #define SOAP_DIME_VERSION 0x08 /* DIME version 1 */ #define SOAP_DIME_MEDIA 0x10 #define SOAP_DIME_ABSURI 0x20 /* gSOAP ZLIB */ #define SOAP_ZLIB_NONE 0x00 #define SOAP_ZLIB_DEFLATE 0x01 #define SOAP_ZLIB_INFLATE 0x02 #define SOAP_ZLIB_GZIP 0x02 /* gSOAP transport, connection, and content encoding modes */ typedef soap_int32 soap_mode; #define SOAP_IO 0x00000003 /* IO mask */ #define SOAP_IO_FLUSH 0x00000000 /* flush output immediately, no buffering */ #define SOAP_IO_BUFFER 0x00000001 /* buffer output in packets of size SOAP_BUFLEN */ #define SOAP_IO_STORE 0x00000002 /* store entire output to determine length for transport */ #define SOAP_IO_CHUNK 0x00000003 /* use HTTP chunked transfer AND buffer packets */ #define SOAP_IO_UDP 0x00000004 /* TCP or UDP */ #define SOAP_IO_LENGTH 0x00000008 /* calc message length (internal) */ #define SOAP_IO_KEEPALIVE 0x00000010 /* keep connection alive */ #define SOAP_ENC 0x00000FFF /* IO and ENC mask */ #define SOAP_ENC_LATIN 0x00000020 /* in: accept iso-8859-1 */ #define SOAP_ENC_XML 0x00000040 /* out: plain XML encoding, no HTTP header */ #define SOAP_ENC_DIME 0x00000080 #define SOAP_ENC_MIME 0x00000100 #define SOAP_ENC_MTOM 0x00000200 #define SOAP_ENC_ZLIB 0x00000400 #define SOAP_ENC_SSL 0x00000800 #define SOAP_XML_STRICT 0x00001000 /* in: strict validation */ #define SOAP_XML_INDENT 0x00002000 /* out: emit indented XML */ #define SOAP_XML_IGNORENS 0x00004000 /* in: ignore namespaces */ #define SOAP_XML_DEFAULTNS 0x00008000 /* out: emit xmlns="..." */ #define SOAP_XML_CANONICAL 0x00010000 /* out: excC14N canonical XML */ #define SOAP_XML_TREE 0x00020000 /* out: XML tree (no id/ref) */ #define SOAP_XML_NIL 0x00040000 /* out: NULLs as xsi:nil */ #define SOAP_XML_NOTYPE 0x00080000 /* out: NULLs as xsi:nil */ #define SOAP_DOM_TREE 0x00100000 /* see DOM manual */ #define SOAP_DOM_NODE 0x00200000 #define SOAP_DOM_ASIS 0x00400000 #define SOAP_C_NOIOB 0x01000000 /* don't fault on array index out of bounds (just ignore) */ #define SOAP_C_UTFSTRING 0x02000000 /* (de)serialize strings with UTF8 content */ #define SOAP_C_MBSTRING 0x04000000 /* (de)serialize strings with multi-byte content */ #define SOAP_C_NILSTRING 0x08000000 /* serialize empty strings as nil (omitted) */ #define SOAP_XML_DOM 0x10000000 /* enable internal DOM */ #define SOAP_XML_GRAPH 0x20000000 /* id-ref graph in DOM */ #define SOAP_MIME_POSTCHECK 0x40000000 /* MIME flag (internal) */ #define SOAP_SEC_WSUID 0x80000000 /* Add Body wsu:Id */ /* WITH_XMLNS backward compatibility: always use XML default namespaces */ #ifdef WITH_XMLNS # define SOAP_IO_DEFAULT (SOAP_IO_FLUSH | SOAP_XML_DEFAULTNS) #else # define SOAP_IO_DEFAULT SOAP_IO_FLUSH #endif /* SSL client/server authentication settings */ #define SOAP_SSL_NO_AUTHENTICATION 0x00 /* for testing purposes */ #define SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION 0x01 /* client requires server to authenticate */ #define SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION 0x02 /* server requires client to authenticate */ #define SOAP_SSL_SKIP_HOST_CHECK 0x04 /* client does not check the common name of the host in certificate */ #define SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE 0x08 /* client does not check the expiration date of the host certificate */ #define SOAP_SSL_NO_DEFAULT_CA_PATH 0x10 /* don't use default_verify_paths */ #define SOAP_SSL_RSA 0x20 /* use RSA */ #define SOAP_SSLv3 0x40 /* SSL v3 only */ #define SOAP_TLSv1 0x80 /* TLS v1 only */ #define SOAP_SSLv3_TLSv1 0x00 /* SSL v3 and TLS v1 support by default (no SSL v1/v2) */ #define SOAP_SSL_CLIENT 0x100 /* client context */ #define SOAP_SSL_DEFAULT (SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION | SOAP_SSLv3_TLSv1) /* state */ #define SOAP_NONE 0 #define SOAP_INIT 1 #define SOAP_COPY 2 #define soap_check_state(soap) (!(soap) || ((soap)->state != SOAP_INIT && (soap)->state != SOAP_COPY)) /* parts */ #define SOAP_BEGIN 0 #define SOAP_IN_ENVELOPE 2 #define SOAP_IN_HEADER 3 #define SOAP_END_HEADER 4 #define SOAP_NO_BODY 5 #define SOAP_IN_BODY 6 #define SOAP_END_BODY 7 #define SOAP_END_ENVELOPE 8 #define SOAP_END 9 /* events */ #define SOAP_SEC_BEGIN 1 #define SOAP_SEC_SIGN 2 /* DEBUG macros */ #ifndef WITH_LEAN # ifdef DEBUG # ifndef SOAP_DEBUG # define SOAP_DEBUG # endif # ifndef SOAP_MEM_DEBUG # define SOAP_MEM_DEBUG # endif # endif #endif #ifdef SOAP_MEM_DEBUG # ifndef SOAP_MALLOC # define SOAP_MALLOC(soap, size) soap_track_malloc(soap, __FILE__, __LINE__, size) # endif # ifndef SOAP_FREE # define SOAP_FREE(soap, ptr) soap_track_free(soap, __FILE__, __LINE__, ptr) # endif #endif #ifndef SOAP_MALLOC /* use libc malloc */ # define SOAP_MALLOC(soap, size) malloc(size) #endif #ifndef SOAP_FREE /* use libc free */ # define SOAP_FREE(soap, ptr) free(ptr) #endif #ifndef SOAP_NEW /* use C++ new operator */ # if (defined(__GNUC__) && (__GNUC__ <= 2) && !defined(__BORLANDC__)) || defined(__clang__) || defined(_AIX) # define SOAP_NEW(type) new type /* old form w/o parenthesis */ # else # define SOAP_NEW(type) new (type) /* prefer with parenthesis */ # endif #endif #ifndef SOAP_PLACEMENT_NEW # define SOAP_PLACEMENT_NEW(buf, type) new (buf) type #endif #ifndef SOAP_NEW_COPY /* use C++ new operator for ::copy() */ # define SOAP_NEW_COPY(clas) new clas /* prefer w/o parenthesis */ #endif #ifndef SOAP_DELETE /* use C++ delete operator */ # define SOAP_DELETE(obj) delete obj #endif #ifndef SOAP_DELETE_ARRAY /* use C++ delete[] operator */ # define SOAP_DELETE_ARRAY(obj) delete[] obj #endif #ifdef SOAP_DEBUG # ifndef SOAP_MESSAGE # define SOAP_MESSAGE fprintf # endif # ifndef DBGLOG # define DBGLOG(DBGFILE, CMD) \ { if (soap)\ { if (!soap->fdebug[SOAP_INDEX_##DBGFILE])\ soap_open_logfile((struct soap*)soap, SOAP_INDEX_##DBGFILE);\ if (soap->fdebug[SOAP_INDEX_##DBGFILE])\ { FILE *fdebug = soap->fdebug[SOAP_INDEX_##DBGFILE];\ CMD;\ fflush(fdebug);\ }\ }\ } # endif # ifndef DBGMSG # define DBGMSG(DBGFILE, MSG, LEN) \ { if (soap)\ { if (!soap->fdebug[SOAP_INDEX_##DBGFILE])\ soap_open_logfile((struct soap*)soap, SOAP_INDEX_##DBGFILE);\ if (soap->fdebug[SOAP_INDEX_##DBGFILE])\ { fwrite((MSG), 1, (LEN), soap->fdebug[SOAP_INDEX_##DBGFILE]);\ fflush(soap->fdebug[SOAP_INDEX_##DBGFILE]);\ }\ }\ } # endif # ifndef DBGFUN # define DBGFUN(FNAME) DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%s(%d): %s()\n", __FILE__, __LINE__, FNAME)) # define DBGFUN1(FNAME, FMT, ARG) DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%s(%d): %s("FMT")\n", __FILE__, __LINE__, FNAME, (ARG))) # define DBGFUN2(FNAME, FMT1, ARG1, FMT2, ARG2) DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%s(%d): %s("FMT1", "FMT2")\n", __FILE__, __LINE__, FNAME, (ARG1), (ARG2))) # define DBGFUN3(FNAME, FMT1, ARG1, FMT2, ARG2, FMT3, ARG3) DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%s(%d): %s("FMT1", "FMT2", "FMT3")\n", __FILE__, __LINE__, FNAME, (ARG1), (ARG2), (ARG3))) # endif # ifndef DBGHEX # define DBGHEX(DBGFILE, MSG, LEN) \ { if (soap)\ { if (!soap->fdebug[SOAP_INDEX_##DBGFILE])\ soap_open_logfile(soap, SOAP_INDEX_##DBGFILE);\ if (soap->fdebug[SOAP_INDEX_##DBGFILE])\ { int i; char *s;\ for (s = (char*)(MSG), i = (LEN); i; i--)\ fprintf(soap->fdebug[SOAP_INDEX_##DBGFILE], "%2.2X ", (int)*s++&0xFF);\ fflush(soap->fdebug[SOAP_INDEX_##DBGFILE]);\ }\ }\ } # endif #else # define DBGLOG(DBGFILE, CMD) # define DBGMSG(DBGFILE, MSG, LEN) # define DBGFUN(FNAME) # define DBGFUN1(FNAME, FMT, ARG) # define DBGFUN2(FNAME, FMT1, ARG1, FMT2, ARG2) # define DBGFUN3(FNAME, FMT1, ARG1, FMT2, ARG2, FMT3, ARG3) # define DBGHEX(DBGFILE, MSG, LEN) #endif /* UCS-4 requires 32 bits (0-7FFFFFFF, the sign bit is used by gSOAP to distinguish XML entities) */ typedef soap_int32 soap_wchar; /* namespace table row */ struct Namespace { const char *id; const char *ns; const char *in; char *out; }; /* namespace stack */ struct soap_nlist { struct soap_nlist *next; unsigned int level; /* nesting depth level */ short index; /* corresponding entry in ns mapping table */ const char *ns; /* only set when parsed ns URI is not in the ns mapping table */ char id[1]; /* the actual string value flows into the allocated region below this struct */ }; /* block stack for nested block allocations */ struct soap_blist { struct soap_blist *next; char *ptr; size_t size; }; /* array layout */ struct soap_array { void *__ptr; int __size; }; /* pointer serialization management */ struct soap_plist { struct soap_plist *next; const void *ptr; const struct soap_array *array; int type; int id; char mark1; char mark2; }; /* block allocation for pointer serialization management */ struct soap_pblk { struct soap_pblk *next; struct soap_plist plist[SOAP_PTRBLK]; }; #ifdef SOAP_MEM_DEBUG /* malloc/free tracking for debugging */ struct soap_mlist { struct soap_mlist *next; const void *ptr; const char *file; int line; short live; }; #endif /* class allocation list */ struct soap_clist { struct soap_clist *next; void *ptr; int type; int size; int (*fdelete)(struct soap_clist*); }; /* attributes */ struct soap_attribute { struct soap_attribute *next; short flag; /* soap_set_attr: 1 = normal, 2 = utf content */ char *value; size_t size; const char *ns; short visible; char name[1]; /* the actual name string flows into the allocated region below this struct */ }; #ifndef WITH_LEAN struct soap_cookie { struct soap_cookie *next; char *name; char *value; char *domain; char *path; time_t expire; /* client-side: local time to expire */ long maxage; /* server-side: seconds to expire */ unsigned int version; short secure; short session; /* server-side */ short env; /* server-side: got cookie from client and should not be (re)send */ short modified; /* server-side: client cookie was modified and should be send */ }; #endif SOAP_FMAC1 struct soap_multipart* SOAP_FMAC2 soap_next_multipart(struct soap_multipart*); #ifdef __cplusplus class soap_multipart_iterator { public: struct soap_multipart *content; bool operator==(const soap_multipart_iterator& iter) const { return (bool)(content == iter.content); } bool operator!=(const soap_multipart_iterator& iter) const { return (bool)(content != iter.content); } struct soap_multipart &operator*() const { return *content; } soap_multipart_iterator &operator++() { content = soap_next_multipart(content); return *this; } soap_multipart_iterator() : content(NULL) { } soap_multipart_iterator(struct soap_multipart *p) : content(p) { } }; #endif #ifndef WITH_LEANER struct soap_dime { size_t count; size_t size; size_t chunksize; size_t buflen; char flags; char *ptr; const char *id; const char *type; const char *options; struct soap_multipart *list; /* list of DIME attachments received */ struct soap_multipart *first, *last; /* temporary in/out queue */ #ifdef __cplusplus soap_multipart_iterator begin() { soap_multipart_iterator iter(list); return iter; }; soap_multipart_iterator end() { soap_multipart_iterator iter(NULL); return iter; }; #endif }; #endif #ifndef WITH_LEANER struct soap_mime { char *boundary; /* MIME boundary */ const char *start; /* MIME start ID */ struct soap_multipart *list; /* list of MIME attachments received */ struct soap_multipart *first, *last; /* temporary in/out queue */ #ifdef __cplusplus soap_multipart_iterator begin() { soap_multipart_iterator iter(list); return iter; }; soap_multipart_iterator end() { soap_multipart_iterator iter(NULL); return iter; }; #endif }; #endif #ifndef WITH_LEANER /* RFC2045 MIME content transfer encodings */ enum soap_mime_encoding { SOAP_MIME_NONE, SOAP_MIME_7BIT, SOAP_MIME_8BIT, SOAP_MIME_BINARY, SOAP_MIME_QUOTED_PRINTABLE, SOAP_MIME_BASE64, SOAP_MIME_IETF_TOKEN, SOAP_MIME_X_TOKEN }; #endif #ifndef WITH_LEANER /* DIME/MIME multipart list */ struct soap_multipart { struct soap_multipart *next; char *ptr; /* points to raw data content */ size_t size; /* size of data content */ const char *id; /* DIME/MIME content ID or form data name */ const char *type; /* DIME/MIME type (MIME type format) */ const char *options; /* DIME options */ enum soap_mime_encoding encoding; /* MIME Content-Transfer-Encoding */ const char *location; /* MIME Content-Location (optional) */ const char *description; /* MIME Content-Description (optional) */ #ifdef __cplusplus typedef soap_multipart_iterator iterator; #endif }; #endif #ifndef WITH_LEANER /* attachment DIME and MTOM XOP forwarding */ struct soap_xlist { struct soap_xlist *next; unsigned char **ptr; int *size; char *id; char **type; char **options; }; #endif /******************************************************************************/ #ifndef WITH_LEANER #ifdef __cplusplus class soap_dom_attribute_iterator { public: struct soap_dom_attribute *att; const char *nstr; const char *name; bool operator==(const soap_dom_attribute_iterator&) const; bool operator!=(const soap_dom_attribute_iterator&) const; struct soap_dom_attribute &operator*() const; soap_dom_attribute_iterator &operator++(); soap_dom_attribute_iterator(); soap_dom_attribute_iterator(struct soap_dom_attribute*); ~soap_dom_attribute_iterator(); }; #endif #endif #ifndef WITH_LEANER struct soap_dom_attribute { struct soap_dom_attribute *next; const char *nstr; char *name; char *data; wchar_t *wide; struct soap *soap; #ifdef __cplusplus typedef soap_dom_attribute_iterator iterator; struct soap_dom_attribute &set(const char *nstr, const char *name); /* set namespace and name */ struct soap_dom_attribute &set(const char *data); /* set data */ soap_dom_attribute_iterator begin(); soap_dom_attribute_iterator end(); soap_dom_attribute_iterator find(const char *nstr, const char *name); void unlink(); soap_dom_attribute(); soap_dom_attribute(struct soap *soap); soap_dom_attribute(struct soap *soap, const char *nstr, const char *name, const char *data); ~soap_dom_attribute(); #endif }; #endif #ifndef WITH_LEANER #ifdef __cplusplus class soap_dom_element_iterator { public: struct soap_dom_element *elt; const char *nstr; const char *name; int type; bool operator==(const soap_dom_element_iterator&) const; bool operator!=(const soap_dom_element_iterator&) const; struct soap_dom_element &operator*() const; soap_dom_element_iterator &operator++(); soap_dom_element_iterator(); soap_dom_element_iterator(struct soap_dom_element*); ~soap_dom_element_iterator(); }; #endif #endif #ifndef WITH_LEANER struct soap_dom_element { struct soap_dom_element *next; /* next sibling */ struct soap_dom_element *prnt; /* parent */ struct soap_dom_element *elts; /* list of child elements */ struct soap_dom_attribute *atts; /* list of attributes */ const char *nstr; /* namespace string */ char *name; /* element tag name */ char *data; /* element content data (with SOAP_C_UTFSTRING flag set) */ wchar_t *wide; /* element content data */ int type; /* optional: serialized C/C++ data type */ void *node; /* optional: pointer to serialized C/C++ data */ char *head; /* leading content before start tag */ char *tail; /* leading content before end tag */ struct soap *soap; /* soap context that manages this node */ #ifdef __cplusplus typedef soap_dom_element_iterator iterator; struct soap_dom_element &set(const char *nstr, const char *name); struct soap_dom_element &set(const char *data); struct soap_dom_element &set(void *node, int type); struct soap_dom_element &add(struct soap_dom_element*); struct soap_dom_element &add(struct soap_dom_element&); struct soap_dom_element &add(struct soap_dom_attribute*); struct soap_dom_element &add(struct soap_dom_attribute&); soap_dom_element_iterator begin(); soap_dom_element_iterator end(); soap_dom_element_iterator find(const char *nstr, const char *name); soap_dom_element_iterator find(int type); void unlink(); soap_dom_element(); soap_dom_element(struct soap *soap); soap_dom_element(struct soap *soap, const char *nstr, const char *name); soap_dom_element(struct soap *soap, const char *nstr, const char *name, const char *data); soap_dom_element(struct soap *soap, const char *nstr, const char *name, void *node, int type); ~soap_dom_element(); #endif }; SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_dom_next_element(struct soap_dom_element *elt); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_dom_next_attribute(struct soap_dom_attribute *att); #endif #if defined(__cplusplus) && !defined(WITH_LEAN) && !defined(WITH_COMPAT) } extern std::ostream &operator<<(std::ostream&, const struct soap_dom_element&); extern std::istream &operator>>(std::istream&, struct soap_dom_element&); extern "C" { #endif /******************************************************************************/ #ifdef WIN32 # ifdef SOAP_STD_EXPORTS # define SOAP_STD_API __declspec(dllexport) # else # define SOAP_STD_API # endif #else # define SOAP_STD_API #endif struct SOAP_STD_API soap { short state; /* 0 = uninitialized, 1 = initialized, 2 = copy of another soap struct */ short version; /* 1 = SOAP1.1 and 2 = SOAP1.2 (set automatically from namespace URI in nsmap table) */ soap_mode mode; soap_mode imode; soap_mode omode; const char *float_format; /* user-definable format string for floats (<1024 chars) */ const char *double_format; /* user-definable format string for doubles (<1024 chars) */ const char *dime_id_format; /* user-definable format string for integer DIME id ( 0, gives socket recv timeout in seconds, < 0 in usec */ int send_timeout; /* when > 0, gives socket send timeout in seconds, < 0 in usec */ int connect_timeout; /* when > 0, gives socket connect() timeout in seconds, < 0 in usec */ int accept_timeout; /* when > 0, gives socket accept() timeout in seconds, < 0 in usec */ int socket_flags; /* socket recv() and send() flags, e.g. set to MSG_NOSIGNAL to disable sigpipe */ int connect_flags; /* connect() SOL_SOCKET sockopt flags, e.g. set to SO_DEBUG to debug socket */ int bind_flags; /* bind() SOL_SOCKET sockopt flags, e.g. set to SO_REUSEADDR to enable reuse */ int accept_flags; /* accept() SOL_SOCKET sockopt flags */ unsigned short linger_time; /* linger time for SO_LINGER option */ const struct Namespace *namespaces; /* Pointer to global namespace mapping table */ struct Namespace *local_namespaces; /* Local namespace mapping table */ struct soap_nlist *nlist; /* namespace stack */ struct soap_blist *blist; /* block allocation stack */ struct soap_clist *clist; /* class instance allocation list */ void *alist; /* memory allocation (malloc) list */ struct soap_ilist *iht[SOAP_IDHASH]; struct soap_plist *pht[SOAP_PTRHASH]; struct soap_pblk *pblk; /* plist block allocation */ short pidx; /* plist block allocation */ struct SOAP_ENV__Header *header; struct SOAP_ENV__Fault *fault; int idnum; void *user; /* for user to pass user-defined data */ void *data[4]; /* extension data = {smdevp, mecevp, ...} */ struct soap_plugin *plugins; /* linked list of plug-in data */ const char *userid; /* HTTP Basic authorization userid */ const char *passwd; /* HTTP Basic authorization passwd */ const char *authrealm; /* HTTP authentication realm (NTLM domain) */ #if !defined(WITH_LEAN) || defined(WITH_NTLM) const char *ntlm_challenge; /* HTTP NTLM challenge key string */ short ntlm_auth; /* HTTP NTLM authentication type */ short ntlm_stage; /* HTTP NTLM stage 0..3 */ #endif int (*fpost)(struct soap*, const char*, const char*, int, const char*, const char*, size_t); int (*fget)(struct soap*); /* HTTP GET hook (not set by default) */ int (*fput)(struct soap*); /* HTTP PUT hook (handled as POST by default) */ int (*fdel)(struct soap*); /* HTTP DELETE hook (not set by default) */ int (*fopt)(struct soap*); /* HTTP OPTIONS hook (not set by default) */ int (*fhead)(struct soap*); /* HTTP HEAD hook (not set by default) */ int (*fform)(struct soap*); /* HTTP/HTML form handler for plugins */ int (*fposthdr)(struct soap*, const char*, const char*); int (*fresponse)(struct soap*, int, size_t); int (*fparse)(struct soap*); int (*fparsehdr)(struct soap*, const char*, const char*); int (*fheader)(struct soap*); int (*fresolve)(struct soap*, const char*, struct in_addr* inaddr); int (*fconnect)(struct soap*, const char*, const char*, int); int (*fdisconnect)(struct soap*); int (*fclosesocket)(struct soap*, SOAP_SOCKET); int (*fshutdownsocket)(struct soap*, SOAP_SOCKET, int); SOAP_SOCKET (*fopen)(struct soap*, const char*, const char*, int); SOAP_SOCKET (*faccept)(struct soap*, SOAP_SOCKET, struct sockaddr*, int *n); int (*fclose)(struct soap*); int (*fsend)(struct soap*, const char*, size_t); size_t (*frecv)(struct soap*, char*, size_t); int (*fpoll)(struct soap*); void (*fseterror)(struct soap*, const char **c, const char **s); int (*fignore)(struct soap*, const char*); int (*fserveloop)(struct soap*); void *(*fplugin)(struct soap*, const char*); void *(*fmalloc)(struct soap*, size_t); #ifndef WITH_LEANER int (*feltbegin)(struct soap*, const char*); int (*feltendin)(struct soap*, const char*, const char*); int (*feltbegout)(struct soap*, const char*); int (*feltendout)(struct soap*, const char*); int (*fprepareinitsend)(struct soap*); int (*fprepareinitrecv)(struct soap*); int (*fpreparesend)(struct soap*, const char*, size_t); int (*fpreparerecv)(struct soap*, const char*, size_t); int (*fpreparefinalsend)(struct soap*); int (*fpreparefinalrecv)(struct soap*); int filterstop; int (*ffiltersend)(struct soap*, const char**, size_t*); int (*ffilterrecv)(struct soap*, char*, size_t*, size_t); void *(*fdimereadopen)(struct soap*, void*, const char*, const char*, const char*); void *(*fdimewriteopen)(struct soap*, const char*, const char*, const char*); void (*fdimereadclose)(struct soap*, void*); void (*fdimewriteclose)(struct soap*, void*); size_t (*fdimeread)(struct soap*, void*, char*, size_t); int (*fdimewrite)(struct soap*, void*, const char*, size_t); void *(*fmimereadopen)(struct soap*, void*, const char*, const char*, const char*); void *(*fmimewriteopen)(struct soap*, void*, const char*, const char*, const char*, enum soap_mime_encoding); void (*fmimereadclose)(struct soap*, void*); void (*fmimewriteclose)(struct soap*, void*); size_t (*fmimeread)(struct soap*, void*, char*, size_t); int (*fmimewrite)(struct soap*, void*, const char*, size_t); #endif SOAP_SOCKET master; SOAP_SOCKET socket; #if defined(__cplusplus) && !defined(WITH_LEAN) && !defined(WITH_COMPAT) std::ostream *os; std::istream *is; #else void *os; /* preserve struct size */ void *is; /* preserve struct size */ #endif #ifndef UNDER_CE int sendfd; /* WinCE FD to send */ int recvfd; /* WinCE FD to receive */ #else FILE *sendfd; FILE *recvfd; #endif size_t bufidx; /* index in soap.buf[] */ size_t buflen; /* length of soap.buf[] content */ soap_wchar ahead; /* parser lookahead */ short cdata; /* CDATA parser state */ short body; /* parsed XML element has a body or not */ unsigned int level; /* XML nesting level */ size_t count; /* message length counter */ size_t length; /* message length as set by HTTP header */ char *labbuf; /* look-aside buffer */ size_t lablen; /* look-aside buffer allocated length */ size_t labidx; /* look-aside buffer index to available part */ char buf[SOAP_BUFLEN];/* send and receive buffer */ char msgbuf[1024]; /* in/out buffer for HTTP/MIME headers >=1024 bytes */ char tmpbuf[1024]; /* in/out buffer for HTTP/MIME headers, simpleType values, element and attribute tag names, and DIME must be >=1024 bytes */ char tag[SOAP_TAGLEN]; char id[SOAP_TAGLEN]; char href[SOAP_TAGLEN]; char type[SOAP_TAGLEN]; char arrayType[SOAP_TAGLEN]; char arraySize[SOAP_TAGLEN]; char arrayOffset[SOAP_TAGLEN]; short other; short root; int position; int positions[SOAP_MAXDIMS]; struct soap_attribute *attributes; /* attribute list */ short encoding; /* when set, output encodingStyle */ short mustUnderstand; /* a mustUnderstand element was parsed or is output */ short null; /* parsed XML is xsi:nil */ short ns; /* when not set, output full xmlns bindings */ short part; /* SOAP part state (header or body) */ short event; /* engine events and states for use by plugins */ unsigned int evlev; /* event level */ short alloced; short peeked; size_t chunksize; size_t chunkbuflen; char endpoint[SOAP_TAGLEN]; char path[SOAP_TAGLEN]; char host[SOAP_TAGLEN]; char *action; char *prolog; /* XML declaration prolog */ unsigned long ip; /* IP number */ int port; /* port number */ short keep_alive; /* connection should be kept open */ short tcp_keep_alive; /* enable SO_KEEPALIVE */ unsigned int tcp_keep_idle; /* set TCP_KEEPIDLE */ unsigned int tcp_keep_intvl; /* set TCP_KEEPINTVL */ unsigned int tcp_keep_cnt; /* set TCP_KEEPCNT */ unsigned int max_keep_alive; /* maximum keep-alive session (default=100) */ const char *proxy_http_version;/* HTTP version of proxy "1.0" or "1.1" */ const char *proxy_host; /* Proxy Server host name */ int proxy_port; /* Proxy Server port (default = 8080) */ const char *proxy_userid; /* Proxy Authorization user name */ const char *proxy_passwd; /* Proxy Authorization password */ const char *proxy_from; /* X-Forwarding-For header returned by proxy */ int status; /* -1 when request, else error code to be returned by server */ int error; int errmode; int errnum; #ifndef WITH_LEANER struct soap_dom_element *dom; struct soap_dime dime; struct soap_mime mime; struct soap_xlist *xlist; #endif #if !defined(WITH_LEAN) || defined(SOAP_DEBUG) const char *logfile[SOAP_MAXLOGS]; FILE *fdebug[SOAP_MAXLOGS]; struct soap_mlist *mht[SOAP_PTRHASH]; #endif #ifndef WITH_LEAN const char *wsuid; /* space-separated string of element tags */ const char *c14nexclude; /* space-separated string of prefixes */ struct soap_cookie *cookies; const char *cookie_domain; const char *cookie_path; int cookie_max; #endif #ifndef WITH_NOIO int ipv6_multicast_if; /* in6addr->sin6_scope_id IPv6 value */ char* ipv4_multicast_if; /* IP_MULTICAST_IF IPv4 setsockopt interface_addr */ unsigned char ipv4_multicast_ttl; /* IP_MULTICAST_TTL value 0..255 */ #ifdef WITH_IPV6 struct sockaddr_storage peer; /* IPv6: set by soap_accept and by UDP recv */ #else struct sockaddr_in peer; /* IPv4: set by soap_connect/soap_accept and by UDP recv */ #endif #endif size_t peerlen; #if defined(WITH_OPENSSL) /* OpenSSL */ int (*fsslauth)(struct soap*); int (*fsslverify)(int, X509_STORE_CTX*); BIO *bio; SSL *ssl; SSL_CTX *ctx; SSL_SESSION *session; const char *dhfile; const char *randfile; #elif defined(WITH_GNUTLS) /* GNUTLS */ int (*fsslauth)(struct soap*); void *fsslverify; gnutls_certificate_credentials_t xcred; /* cert pointer */ gnutls_anon_client_credentials_t acred; /* anon pointer */ gnutls_priority_t cache; /* priority cache pointer */ gnutls_session_t session; /* session pointer */ gnutls_dh_params_t dh_params; gnutls_rsa_params_t rsa_params; #else /* No SSL/TLS */ void *fsslauth; /* dummy members, to preserve struct size */ void *fsslverify; void *bio; void *ssl; void *ctx; void *session; void *dh_params; void *rsa_params; #endif unsigned short ssl_flags; const char *keyfile; const char *password; const char *cafile; const char *capath; const char *crlfile; char session_host[SOAP_TAGLEN]; int session_port; #ifdef WITH_C_LOCALE # ifdef WIN32 _locale_t c_locale; /* set to C locale by default */ # else locale_t c_locale; /* set to C locale by default */ # endif #else void *c_locale; #endif #ifdef WITH_ZLIB z_stream *d_stream; /* decompression stream */ uLong z_crc; /* internal gzip crc */ #else void *d_stream; /* dummy members, to preserve struct size */ soap_int32 z_crc; #endif const char *z_dict; /* support for zlib static dictionaries */ unsigned int z_dict_len; short zlib_state; /* SOAP_ZLIB_NONE, SOAP_ZLIB_DEFLATE, or SOAP_ZLIB_INFLATE */ short zlib_in; /* SOAP_ZLIB_NONE, SOAP_ZLIB_DEFLATE, or SOAP_ZLIB_GZIP */ short zlib_out; /* SOAP_ZLIB_NONE, SOAP_ZLIB_DEFLATE, or SOAP_ZLIB_GZIP */ char *z_buf; /* buffer */ size_t z_buflen; unsigned short z_level; /* compression level to be used (0=none, 1=fast to 9=best) */ float z_ratio_in; /* detected compression ratio compressed_length/length of inbound message */ float z_ratio_out; /* detected compression ratio compressed_length/length of outbound message */ #ifdef WMW_RPM_IO /* VxWorks */ void *rpmreqid; #endif #ifdef __cplusplus soap(); soap(soap_mode); soap(soap_mode, soap_mode); soap(const struct soap&); virtual ~soap(); #else void (*dummy)(void); #endif }; struct soap_code_map { long code; const char *string; }; /* forwarding list */ struct soap_flist { struct soap_flist *next; int type; void *ptr; unsigned int level; size_t len; void (*fcopy)(struct soap*, int, int, void*, size_t, const void*, size_t); }; /* id-ref forwarding list */ struct soap_ilist { struct soap_ilist *next; int type; size_t size; void *link; void *copy; struct soap_flist *flist; void *ptr; unsigned int level; char id[1]; /* the actual id string value flows into the allocated region below this struct */ }; struct soap_plugin { struct soap_plugin *next; const char *id; void *data; int (*fcopy)(struct soap *soap, struct soap_plugin *dst, struct soap_plugin *src); void (*fdelete)(struct soap *soap, struct soap_plugin *p); /* should delete fields of plugin only and not free(p) */ }; #ifndef WITH_NONAMESPACES extern SOAP_NMAC struct Namespace namespaces[]; #endif #ifndef WITH_LEAN # define soap_get0(soap) (((soap)->bufidx>=(soap)->buflen && soap_recv(soap)) ? EOF : (unsigned char)(soap)->buf[(soap)->bufidx]) # define soap_get1(soap) (((soap)->bufidx>=(soap)->buflen && soap_recv(soap)) ? EOF : (unsigned char)(soap)->buf[(soap)->bufidx++]) #else soap_wchar soap_get0(struct soap*); soap_wchar soap_get1(struct soap*); #endif #define soap_versioning_paste(name, ext) name##_LIBRARY_VERSION_REQUIRED_##ext #define soap_versioning_ext(name, ext) soap_versioning_paste(name, ext) #define soap_versioning(name) soap_versioning_ext(name, GSOAP_VERSION) #define soap_init(soap) soap_init1(soap, SOAP_IO_DEFAULT) #define soap_init1(soap, mode) soap_init2(soap, mode, mode) #define soap_init2(soap, imode, omode) soap_versioning(soap_init)(soap, imode, omode) #define soap_new() soap_new1(SOAP_IO_DEFAULT) #define soap_new1(mode) soap_new2(mode, mode) #define soap_new2(imode, omode) soap_versioning(soap_new)(imode, omode) #define soap_revget1(soap) ((soap)->bufidx--) #define soap_unget(soap, c) ((soap)->ahead = c) #define soap_register_plugin(soap, plugin) soap_register_plugin_arg(soap, plugin, NULL) #define soap_mode(soap, n) ((soap)->mode = (soap)->imode = (soap)->omode = (n)) #define soap_imode(soap, n) ((soap)->imode = (n)) #define soap_omode(soap, n) ((soap)->omode = (n)) #define soap_set_imode(soap, n) ((soap)->imode |= (n)) #define soap_clr_imode(soap, n) ((soap)->imode &= ~(n)) #define soap_set_omode(soap, n) ((soap)->omode |= (n)) #define soap_clr_omode(soap, n) ((soap)->omode &= ~(n)) #define soap_set_mode(soap, n) ((soap)->imode |= (n), (soap)->omode |= (n)) #define soap_clr_mode(soap, n) ((soap)->imode &= ~(n), (soap)->omode &= ~(n)) #define soap_destroy(soap) soap_delete((soap), NULL) #ifdef HAVE_STRRCHR # define soap_strrchr(s, t) strrchr(s, t) #else SOAP_FMAC1 char* SOAP_FMAC2 soap_strrchr(const char *s, int t); #endif #ifdef HAVE_STRTOL # define soap_strtol(s, t, b) strtol(s, t, b) #else SOAP_FMAC1 long SOAP_FMAC2 soap_strtol(const char *s, char **t, int b); #endif #ifdef HAVE_STRTOUL # define soap_strtoul(s, t, b) strtoul(s, t, b) #else SOAP_FMAC1 unsigned long SOAP_FMAC2 soap_strtoul(const char *s, char **t, int b); #endif #if defined(WITH_OPENSSL) # define soap_random soap_rand() SOAP_FMAC1 int SOAP_FMAC2 soap_rand(void); #elif defined(HAVE_RANDOM) # define soap_random (int)random() #else # define soap_random rand() #endif #ifdef WITH_NOIDREF # define soap_embedded(s, p, t) (0) # define soap_id_lookup(s, i, p, t, n, k) (p) # define soap_id_forward(s, h, p, len, st, tt, n, k, fc) (p) # define soap_reference(s, a, t) (1) # define soap_array_reference(s, p, a, n, t) (1) # define soap_embed(s, p, a, n, t, pp) (0) # define soap_embedded_id(s, i, p, t) (i) # define soap_is_embedded(s, p) (0) # define soap_is_single(s, p) (1) # define soap_lookup_type(s, i) (0) # define soap_getindependent(s) (0) # define soap_putindependent(s) (0) # define soap_getelement(s, n) (n) # define soap_putelement(s, p, t, i, n) (0) # define soap_markelement(s, p, n) (0) #endif /* soap_traverse() traversal/walker routines take walker function arguments */ typedef void soap_walker(struct soap*, void*, int, const char*, const char*); SOAP_FMAC1 void SOAP_FMAC2 soap_header(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_fault(struct soap*); SOAP_FMAC1 const char** SOAP_FMAC2 soap_faultcode(struct soap*); SOAP_FMAC1 const char** SOAP_FMAC2 soap_faultsubcode(struct soap*); SOAP_FMAC1 const char** SOAP_FMAC2 soap_faultstring(struct soap*); SOAP_FMAC1 const char** SOAP_FMAC2 soap_faultdetail(struct soap*); SOAP_FMAC1 const char* SOAP_FMAC2 soap_check_faultsubcode(struct soap*); SOAP_FMAC1 const char* SOAP_FMAC2 soap_check_faultdetail(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_serializeheader(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_putheader(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_getheader(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_serializefault(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_putfault(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_getfault(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_ssl_init(void); SOAP_FMAC1 int SOAP_FMAC2 soap_poll(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_connect_command(struct soap*, int, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_connect(struct soap*, const char*, const char*); SOAP_FMAC1 SOAP_SOCKET SOAP_FMAC2 soap_bind(struct soap*, const char*, int, int); SOAP_FMAC1 SOAP_SOCKET SOAP_FMAC2 soap_accept(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_ssl_accept(struct soap*); SOAP_FMAC1 const char * SOAP_FMAC2 soap_ssl_error(struct soap*, int); SOAP_FMAC1 int SOAP_FMAC2 soap_ssl_server_context(struct soap*, unsigned short, const char*, const char*, const char*, const char*, const char*, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_ssl_client_context(struct soap*, unsigned short, const char*, const char*, const char*, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_puthttphdr(struct soap*, int status, size_t count); SOAP_FMAC1 const char* SOAP_FMAC2 soap_get_header_attribute(struct soap*, const char*, const char*); SOAP_FMAC1 const char* SOAP_FMAC2 soap_decode_key(char*, size_t, const char*); SOAP_FMAC1 const char* SOAP_FMAC2 soap_decode_val(char*, size_t, const char*); SOAP_FMAC1 size_t SOAP_FMAC2 soap_hash(const char*); SOAP_FMAC1 void SOAP_FMAC2 soap_set_endpoint(struct soap*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_flush_raw(struct soap*, const char*, size_t); SOAP_FMAC1 int SOAP_FMAC2 soap_flush(struct soap*); SOAP_FMAC1 soap_wchar SOAP_FMAC2 soap_get(struct soap*); SOAP_FMAC1 soap_wchar SOAP_FMAC2 soap_getchar(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_tag_cmp(const char*, const char*); SOAP_FMAC1 void SOAP_FMAC2 soap_set_fault(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_sender_fault(struct soap*, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_sender_fault_subcode(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_receiver_fault(struct soap*, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_receiver_fault_subcode(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_set_sender_error(struct soap*, const char*, const char*, int); SOAP_FMAC1 int SOAP_FMAC2 soap_set_receiver_error(struct soap*, const char*, const char*, int); SOAP_FMAC1 int SOAP_FMAC2 soap_send_raw(struct soap*, const char*, size_t); SOAP_FMAC1 int SOAP_FMAC2 soap_recv_raw(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_recv(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_send(struct soap*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_send2(struct soap*, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_send3(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_pututf8(struct soap*, unsigned long); SOAP_FMAC1 soap_wchar SOAP_FMAC2 soap_getutf8(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_putbase64(struct soap*, const unsigned char*, int); SOAP_FMAC1 unsigned char* SOAP_FMAC2 soap_getbase64(struct soap*, int*, int); SOAP_FMAC1 int SOAP_FMAC2 soap_puthex(struct soap*, const unsigned char*, int); SOAP_FMAC1 unsigned char* SOAP_FMAC2 soap_gethex(struct soap*, int*); #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_xop_forward(struct soap*, unsigned char**, int*, char**, char**, char**); SOAP_FMAC1 int SOAP_FMAC2 soap_dime_forward(struct soap*, unsigned char**, int*, char**, char**, char**); #endif #ifndef WITH_NOIDREF SOAP_FMAC1 int SOAP_FMAC2 soap_pointer_lookup_id(struct soap*, void *p, int t, struct soap_plist**); SOAP_FMAC1 int SOAP_FMAC2 soap_pointer_lookup(struct soap*, const void *p, int t, struct soap_plist**); SOAP_FMAC1 int SOAP_FMAC2 soap_pointer_enter(struct soap*, const void *p, const struct soap_array *a, int n, int t, struct soap_plist**); SOAP_FMAC1 int SOAP_FMAC2 soap_array_pointer_lookup(struct soap*, const void *p, const struct soap_array *a, int n, int t, struct soap_plist**); SOAP_FMAC1 int SOAP_FMAC2 soap_embed(struct soap *soap, const void *p, const struct soap_array *a, int n, const char *tag, int type); SOAP_FMAC1 struct soap_ilist* SOAP_FMAC2 soap_lookup(struct soap*, const char*); SOAP_FMAC1 struct soap_ilist* SOAP_FMAC2 soap_enter(struct soap*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_resolve(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_embedded(struct soap*, const void *p, int t); SOAP_FMAC1 int SOAP_FMAC2 soap_reference(struct soap*, const void *p, int t); SOAP_FMAC1 int SOAP_FMAC2 soap_array_reference(struct soap*, const void *p, const struct soap_array *a, int n, int t); SOAP_FMAC1 int SOAP_FMAC2 soap_embedded_id(struct soap*, int id, const void *p, int t); SOAP_FMAC1 int SOAP_FMAC2 soap_is_embedded(struct soap*, struct soap_plist*); SOAP_FMAC1 int SOAP_FMAC2 soap_is_single(struct soap*, struct soap_plist*); SOAP_FMAC1 void SOAP_FMAC2 soap_set_embedded(struct soap*, struct soap_plist*); #endif SOAP_FMAC1 int SOAP_FMAC2 soap_begin_count(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_end_count(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_begin_send(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_end_send(struct soap*); SOAP_FMAC1 const struct soap_code_map* SOAP_FMAC2 soap_code(const struct soap_code_map*, const char*); SOAP_FMAC1 long SOAP_FMAC2 soap_code_int(const struct soap_code_map*, const char*, long); SOAP_FMAC1 const char* SOAP_FMAC2 soap_code_str(const struct soap_code_map*, long); SOAP_FMAC1 long SOAP_FMAC2 soap_code_bits(const struct soap_code_map*, const char*); SOAP_FMAC1 const char* SOAP_FMAC2 soap_code_list(struct soap*, const struct soap_code_map*, long); SOAP_FMAC1 int SOAP_FMAC2 soap_getline(struct soap*, char*, int); SOAP_FMAC1 int SOAP_FMAC2 soap_begin_serve(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_begin_recv(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_end_recv(struct soap*); SOAP_FMAC1 void* SOAP_FMAC2 soap_malloc(struct soap*, size_t); SOAP_FMAC1 void SOAP_FMAC2 soap_dealloc(struct soap*, void*); SOAP_FMAC1 struct soap_clist * SOAP_FMAC2 soap_link(struct soap*, void*, int, int, int (*fdelete)(struct soap_clist*)); SOAP_FMAC1 int SOAP_FMAC2 soap_unlink(struct soap*, const void*); SOAP_FMAC1 void SOAP_FMAC2 soap_free_temp(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_del(struct soap*); SOAP_FMAC1 void* SOAP_FMAC2 soap_track_malloc(struct soap*, const char*, int, size_t); SOAP_FMAC1 void SOAP_FMAC2 soap_track_free(struct soap*, const char*, int, void*); #ifndef WITH_NOIDREF SOAP_FMAC1 int SOAP_FMAC2 soap_lookup_type(struct soap*, const char *id); SOAP_FMAC1 void* SOAP_FMAC2 soap_id_lookup(struct soap*, const char *id, void **p, int t, size_t n, unsigned int k); SOAP_FMAC1 void* SOAP_FMAC2 soap_id_forward(struct soap*, const char *id, void *p, size_t len, int st, int tt, size_t n, unsigned int k, void(*fcopy)(struct soap*, int, int, void*, size_t, const void*, size_t)); #endif SOAP_FMAC1 void* SOAP_FMAC2 soap_id_enter(struct soap*, const char *id, void *p, int t, size_t n, unsigned int k, const char *type, const char *arrayType, void *(*finstantiate)(struct soap*, int, const char*, const char*, size_t*)); SOAP_FMAC1 void SOAP_FMAC2 soap_fcopy(struct soap *soap, int st, int tt, void *p, size_t, const void *q, size_t n); SOAP_FMAC1 int SOAP_FMAC2 soap_size(const int *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_getoffsets(const char *, const int *, int *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_getsize(const char *, const char *, int *); SOAP_FMAC1 int SOAP_FMAC2 soap_getsizes(const char *, int *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_getposition(const char *, int *); SOAP_FMAC1 char* SOAP_FMAC2 soap_putsize(struct soap*, const char *, int); SOAP_FMAC1 char* SOAP_FMAC2 soap_putsizesoffsets(struct soap*, const char *, const int *, const int *, int); SOAP_FMAC1 char* SOAP_FMAC2 soap_putsizes(struct soap*, const char *, const int *, int); SOAP_FMAC1 char* SOAP_FMAC2 soap_putoffset(struct soap*, int); SOAP_FMAC1 char* SOAP_FMAC2 soap_putoffsets(struct soap*, const int *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_closesock(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_force_closesock(struct soap*); SOAP_FMAC1 struct soap *SOAP_FMAC2 soap_versioning(soap_new)(soap_mode, soap_mode); SOAP_FMAC1 void SOAP_FMAC2 soap_free(struct soap*); SOAP_FMAC1 struct soap *SOAP_FMAC2 soap_copy(const struct soap*); SOAP_FMAC1 struct soap *SOAP_FMAC2 soap_copy_context(struct soap*, const struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_copy_stream(struct soap*, struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_free_stream(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_versioning(soap_init)(struct soap*, soap_mode, soap_mode); SOAP_FMAC1 void SOAP_FMAC2 soap_done(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_cleanup(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_begin(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_end(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_delete(struct soap*, void*); SOAP_FMAC1 void SOAP_FMAC2 soap_delegate_deletion(struct soap*, struct soap*); /* API functions available with DEBUG or SOAP_DEBUG defined: */ SOAP_FMAC1 void SOAP_FMAC2 soap_set_recv_logfile(struct soap*, const char*); SOAP_FMAC1 void SOAP_FMAC2 soap_set_sent_logfile(struct soap*, const char*); SOAP_FMAC1 void SOAP_FMAC2 soap_set_test_logfile(struct soap*, const char*); SOAP_FMAC1 void SOAP_FMAC2 soap_close_logfiles(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_open_logfile(struct soap*, int); /* */ SOAP_FMAC1 const char* SOAP_FMAC2 soap_value(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_match_tag(struct soap*, const char*, const char *); SOAP_FMAC1 int SOAP_FMAC2 soap_match_array(struct soap*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_element(struct soap*, const char*, int, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_element_begin_out(struct soap*, const char *tag, int id, const char *type); SOAP_FMAC1 int SOAP_FMAC2 soap_array_begin_out(struct soap*, const char *tag, int id, const char *type, const char *offset); SOAP_FMAC1 int SOAP_FMAC2 soap_element_ref(struct soap*, const char *tag, int id, int href); SOAP_FMAC1 int SOAP_FMAC2 soap_element_href(struct soap*, const char *tag, int id, const char *ref, const char *val); SOAP_FMAC1 int SOAP_FMAC2 soap_element_null(struct soap*, const char *tag, int id, const char *type); SOAP_FMAC1 int SOAP_FMAC2 soap_element_nil(struct soap*, const char *tag); SOAP_FMAC1 int SOAP_FMAC2 soap_element_id(struct soap*, const char *tag, int id, const void *p, const struct soap_array *a, int d, const char *type, int n); SOAP_FMAC1 int SOAP_FMAC2 soap_element_result(struct soap*, const char *tag); SOAP_FMAC1 void SOAP_FMAC2 soap_check_result(struct soap*, const char *tag); SOAP_FMAC1 int SOAP_FMAC2 soap_element_end_out(struct soap*, const char *tag); SOAP_FMAC1 int SOAP_FMAC2 soap_element_start_end_out(struct soap*, const char *tag); SOAP_FMAC1 int SOAP_FMAC2 soap_attribute(struct soap*, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_element_begin_in(struct soap*, const char *tag, int nillable, const char *type); SOAP_FMAC1 int SOAP_FMAC2 soap_element_end_in(struct soap*, const char *tag); SOAP_FMAC1 int SOAP_FMAC2 soap_peek_element(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_retry(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_revert(struct soap*); SOAP_FMAC1 char* SOAP_FMAC2 soap_strdup(struct soap*, const char*); SOAP_FMAC1 wchar_t* SOAP_FMAC2 soap_wstrdup(struct soap*, const wchar_t*); SOAP_FMAC1 const char * SOAP_FMAC2 soap_tagsearch(const char *big, const char *little); SOAP_FMAC1 int SOAP_FMAC2 soap_string_out(struct soap*, const char *s, int flag); SOAP_FMAC1 char* SOAP_FMAC2 soap_string_in(struct soap*, int, long, long); #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_wstring_out(struct soap*, const wchar_t *s, int flag); SOAP_FMAC1 wchar_t* SOAP_FMAC2 soap_wstring_in(struct soap*, int, long, long); #endif SOAP_FMAC1 int SOAP_FMAC2 soap_match_namespace(struct soap*, const char *, const char*, size_t n1, size_t n2); SOAP_FMAC1 int SOAP_FMAC2 soap_set_namespaces(struct soap*, const struct Namespace*); SOAP_FMAC1 void SOAP_FMAC2 soap_set_local_namespaces(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_pop_namespace(struct soap*); SOAP_FMAC1 struct soap_nlist* SOAP_FMAC2 soap_push_namespace(struct soap*, const char *,const char *); SOAP_FMAC1 const char* SOAP_FMAC2 soap_current_namespace(struct soap *soap, const char *tag); SOAP_FMAC1 struct soap_nlist* SOAP_FMAC2 soap_lookup_ns(struct soap *soap, const char *tag, size_t n); SOAP_FMAC1 int SOAP_FMAC2 soap_store_lab(struct soap*, const char*, size_t); SOAP_FMAC1 int SOAP_FMAC2 soap_append_lab(struct soap*, const char*, size_t); SOAP_FMAC1 struct soap_blist* SOAP_FMAC2 soap_new_block(struct soap*); SOAP_FMAC1 void* SOAP_FMAC2 soap_push_block(struct soap*, struct soap_blist*, size_t); SOAP_FMAC1 void SOAP_FMAC2 soap_pop_block(struct soap*, struct soap_blist*); SOAP_FMAC1 size_t SOAP_FMAC2 soap_size_block(struct soap*, struct soap_blist*, size_t); SOAP_FMAC1 char* SOAP_FMAC2 soap_first_block(struct soap*, struct soap_blist*); SOAP_FMAC1 char* SOAP_FMAC2 soap_next_block(struct soap*, struct soap_blist*); SOAP_FMAC1 size_t SOAP_FMAC2 soap_block_size(struct soap*, struct soap_blist*); SOAP_FMAC1 char* SOAP_FMAC2 soap_save_block(struct soap*, struct soap_blist*, char*, int); SOAP_FMAC1 void SOAP_FMAC2 soap_end_block(struct soap*, struct soap_blist*); SOAP_FMAC1 void SOAP_FMAC2 soap_update_pointers(struct soap *soap, char *start, char *end, char *p1, char *p2); SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_begin_out(struct soap*); SOAP_FMAC1 int soap_envelope_end_out(struct soap*); SOAP_FMAC1 char * SOAP_FMAC2 soap_get_http_body(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_begin_in(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_end_in(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_body_begin_out(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_body_end_out(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_body_begin_in(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_body_end_in(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_recv_header(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_response(struct soap*, int); SOAP_FMAC1 int SOAP_FMAC2 soap_send_empty_response(struct soap*, int status); SOAP_FMAC1 int SOAP_FMAC2 soap_recv_empty_response(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_send_fault(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_recv_fault(struct soap*, int check); #ifndef WITH_NOSTDLIB SOAP_FMAC1 void SOAP_FMAC2 soap_print_fault(struct soap*, FILE*); SOAP_FMAC1 void SOAP_FMAC2 soap_print_fault_location(struct soap*, FILE*); # ifndef WITH_LEAN # ifndef WITH_COMPAT # ifdef __cplusplus SOAP_FMAC1 void SOAP_FMAC2 soap_stream_fault(struct soap*, std::ostream&); # endif # endif SOAP_FMAC1 char* SOAP_FMAC2 soap_sprint_fault(struct soap*, char*, size_t); # endif #endif SOAP_FMAC1 int SOAP_FMAC2 soap_s2byte(struct soap*, const char*, char*); SOAP_FMAC1 int SOAP_FMAC2 soap_s2short(struct soap*, const char*, short*); SOAP_FMAC1 int SOAP_FMAC2 soap_s2int(struct soap*, const char*, int*); SOAP_FMAC1 int SOAP_FMAC2 soap_s2long(struct soap*, const char*, long*); SOAP_FMAC1 int SOAP_FMAC2 soap_s2LONG64(struct soap*, const char*, LONG64*); SOAP_FMAC1 int SOAP_FMAC2 soap_s2float(struct soap*, const char*, float*); SOAP_FMAC1 int SOAP_FMAC2 soap_s2double(struct soap*, const char*, double*); SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedByte(struct soap*, const char*, unsigned char*); SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedShort(struct soap*, const char*, unsigned short*); SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedInt(struct soap*, const char*, unsigned int*); SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedLong(struct soap*, const char*, unsigned long*); SOAP_FMAC1 int SOAP_FMAC2 soap_s2ULONG64(struct soap*, const char*, ULONG64*); SOAP_FMAC1 int SOAP_FMAC2 soap_s2string(struct soap*, const char*, char**, long minlen, long maxlen); SOAP_FMAC1 int SOAP_FMAC2 soap_s2QName(struct soap*, const char*, char**, long minlen, long maxlen); #ifndef WITH_LEAN SOAP_FMAC1 int SOAP_FMAC2 soap_s2wchar(struct soap*, const char*, wchar_t**, long minlen, long maxlen); SOAP_FMAC1 int SOAP_FMAC2 soap_s2dateTime(struct soap*, const char*, time_t*); SOAP_FMAC1 char* SOAP_FMAC2 soap_s2base64(struct soap*, const unsigned char*, char*, int); SOAP_FMAC1 char* SOAP_FMAC2 soap_s2hex(struct soap*, const unsigned char*, char*, int); #endif SOAP_FMAC1 const char* SOAP_FMAC2 soap_byte2s(struct soap*, char); SOAP_FMAC1 const char* SOAP_FMAC2 soap_short2s(struct soap*, short); SOAP_FMAC1 const char* SOAP_FMAC2 soap_int2s(struct soap*, int); SOAP_FMAC1 const char* SOAP_FMAC2 soap_long2s(struct soap*, long); SOAP_FMAC1 const char* SOAP_FMAC2 soap_LONG642s(struct soap*, LONG64); SOAP_FMAC1 const char* SOAP_FMAC2 soap_float2s(struct soap*, float); SOAP_FMAC1 const char* SOAP_FMAC2 soap_double2s(struct soap*, double); SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedByte2s(struct soap*, unsigned char); SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedShort2s(struct soap*, unsigned short); SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedInt2s(struct soap*, unsigned int); SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedLong2s(struct soap*, unsigned long); SOAP_FMAC1 const char* SOAP_FMAC2 soap_ULONG642s(struct soap*, ULONG64); SOAP_FMAC1 const char* SOAP_FMAC2 soap_QName2s(struct soap*, const char*); #ifndef WITH_LEAN SOAP_FMAC1 const char* SOAP_FMAC2 soap_wchar2s(struct soap*, const wchar_t*); SOAP_FMAC1 const char* SOAP_FMAC2 soap_dateTime2s(struct soap*, time_t); SOAP_FMAC1 const char* SOAP_FMAC2 soap_base642s(struct soap*, const char*, char*, size_t, int*); SOAP_FMAC1 const char* SOAP_FMAC2 soap_hex2s(struct soap*, const char*, char*, size_t, int*); #endif SOAP_FMAC1 int* SOAP_FMAC2 soap_inint(struct soap*, const char *tag, int *p, const char *, int); SOAP_FMAC1 char* SOAP_FMAC2 soap_inbyte(struct soap*, const char *tag, char *p, const char *, int); SOAP_FMAC1 long* SOAP_FMAC2 soap_inlong(struct soap*, const char *tag, long *p, const char *, int); SOAP_FMAC1 LONG64* SOAP_FMAC2 soap_inLONG64(struct soap*, const char *tag, LONG64 *p, const char *, int); SOAP_FMAC1 short* SOAP_FMAC2 soap_inshort(struct soap*, const char *tag, short *p, const char *, int); SOAP_FMAC1 float* SOAP_FMAC2 soap_infloat(struct soap*, const char *tag, float *p, const char *, int); SOAP_FMAC1 double* SOAP_FMAC2 soap_indouble(struct soap*, const char *tag, double *p, const char *, int); SOAP_FMAC1 unsigned char* SOAP_FMAC2 soap_inunsignedByte(struct soap*, const char *tag, unsigned char *p, const char *, int); SOAP_FMAC1 unsigned short* SOAP_FMAC2 soap_inunsignedShort(struct soap*, const char *tag, unsigned short *p, const char *, int); SOAP_FMAC1 unsigned int* SOAP_FMAC2 soap_inunsignedInt(struct soap*, const char *tag, unsigned int *p, const char *, int); SOAP_FMAC1 unsigned long* SOAP_FMAC2 soap_inunsignedLong(struct soap*, const char *tag, unsigned long *p, const char *, int); SOAP_FMAC1 ULONG64* SOAP_FMAC2 soap_inULONG64(struct soap*, const char *tag, ULONG64 *p, const char *, int); SOAP_FMAC1 char** SOAP_FMAC2 soap_instring(struct soap*, const char *tag, char **p, const char *, int, int, long, long); SOAP_FMAC1 char** SOAP_FMAC2 soap_inliteral(struct soap*, const char *tag, char **p); #ifndef WITH_LEAN SOAP_FMAC1 time_t* SOAP_FMAC2 soap_indateTime(struct soap*, const char *tag, time_t *p, const char *, int); SOAP_FMAC1 time_t SOAP_FMAC2 soap_timegm(struct tm*); #endif #ifndef WITH_LEANER SOAP_FMAC1 wchar_t** SOAP_FMAC2 soap_inwstring(struct soap*, const char *tag, wchar_t **p, const char *, int, long, long); SOAP_FMAC1 wchar_t** SOAP_FMAC2 soap_inwliteral(struct soap*, const char *tag, wchar_t **p); #endif SOAP_FMAC1 int SOAP_FMAC2 soap_outbyte(struct soap*, const char *tag, int id, const char *p, const char *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_outshort(struct soap*, const char *tag, int id, const short *p, const char *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_outint(struct soap*, const char *tag, int id, const int *p, const char *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_outlong(struct soap*, const char *tag, int id, const long *p, const char *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_outLONG64(struct soap*, const char *tag, int id, const LONG64 *p, const char *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_outfloat(struct soap*, const char *tag, int id, const float *p, const char *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_outdouble(struct soap*, const char *tag, int id, const double *p, const char *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_outunsignedByte(struct soap*, const char *tag, int id, const unsigned char *p, const char *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_outunsignedShort(struct soap*, const char *tag, int id, const unsigned short *p, const char *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_outunsignedInt(struct soap*, const char *tag, int id, const unsigned int *p, const char *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_outunsignedLong(struct soap*, const char *tag, int id, const unsigned long *p, const char *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_outULONG64(struct soap*, const char *tag, int id, const ULONG64 *p, const char *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_outstring(struct soap*, const char *tag, int id, char *const*p, const char *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_outliteral(struct soap*, const char *tag, char *const*p, const char *type); #ifndef WITH_LEAN SOAP_FMAC1 int SOAP_FMAC2 soap_outdateTime(struct soap*, const char *tag, int id, const time_t *p, const char *, int); #endif #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_outwstring(struct soap*, const char *tag, int id, wchar_t *const*p, const char *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_outwliteral(struct soap*, const char *tag, wchar_t *const*p, const char *type); #endif #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_attachment(struct soap *, const char*, int, const void*, const struct soap_array*, const char*, const char*, const char*, int, const char*, int); SOAP_FMAC1 int SOAP_FMAC2 soap_move(struct soap*, long); SOAP_FMAC1 size_t SOAP_FMAC2 soap_tell(struct soap*); SOAP_FMAC1 char* SOAP_FMAC2 soap_dime_option(struct soap*, unsigned short, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_getdimehdr(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_getdime(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_putdimehdr(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_putdime(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_getmimehdr(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_getmime(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_putmimehdr(struct soap*, struct soap_multipart*); SOAP_FMAC1 int SOAP_FMAC2 soap_putmime(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_set_dime(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_set_mime(struct soap*, const char *boundary, const char *start); SOAP_FMAC1 void SOAP_FMAC2 soap_clr_dime(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_clr_mime(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_set_dime_attachment(struct soap*, char *ptr, size_t size, const char *type, const char *id, unsigned short optype, const char *option); SOAP_FMAC1 int SOAP_FMAC2 soap_set_mime_attachment(struct soap*, char *ptr, size_t size, enum soap_mime_encoding encoding, const char *type, const char *id, const char *location, const char *description); SOAP_FMAC1 void SOAP_FMAC2 soap_post_check_mime_attachments(struct soap *soap); SOAP_FMAC1 int SOAP_FMAC2 soap_check_mime_attachments(struct soap *soap); SOAP_FMAC1 struct soap_multipart* SOAP_FMAC2 soap_get_mime_attachment(struct soap *soap, void *handle); SOAP_FMAC1 int SOAP_FMAC2 soap_match_cid(struct soap*, const char*, const char*); #endif SOAP_FMAC1 int SOAP_FMAC2 soap_register_plugin_arg(struct soap*, int (*fcreate)(struct soap*, struct soap_plugin*, void*), void*); SOAP_FMAC1 void* SOAP_FMAC2 soap_lookup_plugin(struct soap*, const char*); SOAP_FMAC1 const char* SOAP_FMAC2 soap_attr_value(struct soap *soap, const char *name, int flag); SOAP_FMAC1 int SOAP_FMAC2 soap_set_attr(struct soap *soap, const char *name, const char *value, int flag); SOAP_FMAC1 void SOAP_FMAC2 soap_clr_attr(struct soap *soap); #ifdef WITH_COOKIES SOAP_FMAC1 void SOAP_FMAC2 soap_getcookies(struct soap *soap, const char *val); SOAP_FMAC1 size_t SOAP_FMAC2 soap_encode_cookie(const char*, char*, size_t); SOAP_FMAC1 extern struct soap_cookie* SOAP_FMAC2 soap_set_cookie(struct soap*, const char*, const char*, const char*, const char*); SOAP_FMAC1 extern struct soap_cookie* SOAP_FMAC2 soap_cookie(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 extern char* SOAP_FMAC2 soap_cookie_value(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 extern char* SOAP_FMAC2 soap_env_cookie_value(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 extern time_t SOAP_FMAC2 soap_cookie_expire(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 extern int SOAP_FMAC2 soap_set_cookie_expire(struct soap*, const char*, long, const char*, const char*); SOAP_FMAC1 extern int SOAP_FMAC2 soap_set_cookie_session(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 extern int SOAP_FMAC2 soap_clr_cookie_session(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 extern void SOAP_FMAC2 soap_clr_cookie(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 extern int SOAP_FMAC2 soap_getenv_cookies(struct soap*); SOAP_FMAC1 extern struct soap_cookie* SOAP_FMAC2 soap_copy_cookies(struct soap*, const struct soap*); SOAP_FMAC1 extern void SOAP_FMAC2 soap_free_cookies(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_putsetcookies(struct soap *soap); SOAP_FMAC1 int SOAP_FMAC2 soap_putcookies(struct soap *soap, const char *domain, const char *path, int secure); #endif #ifdef __cplusplus } /* extern "C" */ #endif #endif /* STDSOAP_H */ gsoap-2.8.28/gsoap/ios_plugin/examples/Calc/main.m0000644000175000017500000000060212653650146021335 0ustar ellertellert// // main.m // Calc // // Created by Wei Zhang on 5/19/12. // Copyright __MyCompanyName__ 2012. All rights reserved. // #import #import "./Classes/calc.nsmap" int main(int argc, char *argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; int retVal = UIApplicationMain(argc, argv, nil, nil); [pool release]; return retVal; } gsoap-2.8.28/gsoap/ios_plugin/examples/GeoIPService/0000744000175000017500000000000012654077574021666 5ustar ellertellertgsoap-2.8.28/gsoap/ios_plugin/examples/GeoIPService/GeoIPService_Prefix.pch0000644000175000017500000000052712653650146026160 0ustar ellertellert// // Prefix header for all source files of the 'GeoIPService' target in the 'GeoIPService' project // #define DEBUG #ifdef DEBUG # define DLog(...) NSLog(__VA_ARGS__) #else # define DLog(...) /* */ #endif #define ALog(...) DLog(__VA_ARGS__) #ifdef __OBJC__ #import #import #endif gsoap-2.8.28/gsoap/ios_plugin/examples/GeoIPService/MainWindow.xib0000644000175000017500000002320312653650146024437 0ustar ellertellert 800 10D540 760 1038.29 460.00 com.apple.InterfaceBuilder.IBCocoaTouchPlugin 81 YES YES com.apple.InterfaceBuilder.IBCocoaTouchPlugin YES YES YES YES IBFilesOwner IBCocoaTouchFramework IBFirstResponder IBCocoaTouchFramework IBCocoaTouchFramework GeoIPServiceViewController IBCocoaTouchFramework 292 {320, 480} 1 MSAxIDEAA NO NO IBCocoaTouchFramework YES YES delegate 4 viewController 11 window 14 YES 0 -1 File's Owner 3 GeoIPService App Delegate -2 10 12 YES YES -1.CustomClassName -2.CustomClassName 10.CustomClassName 10.IBEditorWindowLastContentRect 10.IBPluginDependency 12.IBEditorWindowLastContentRect 12.IBPluginDependency 3.CustomClassName 3.IBPluginDependency YES UIApplication UIResponder GeoIPServiceViewController {{234, 376}, {320, 480}} com.apple.InterfaceBuilder.IBCocoaTouchPlugin {{525, 346}, {320, 480}} com.apple.InterfaceBuilder.IBCocoaTouchPlugin GeoIPServiceAppDelegate com.apple.InterfaceBuilder.IBCocoaTouchPlugin YES YES YES YES 14 YES GeoIPServiceAppDelegate NSObject YES YES viewController window YES GeoIPServiceViewController UIWindow IBProjectSource Classes/GeoIPServiceAppDelegate.h GeoIPServiceAppDelegate NSObject IBUserSource GeoIPServiceViewController UIViewController IBProjectSource Classes/GeoIPServiceViewController.h 0 IBCocoaTouchFramework com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 YES GeoIPService.xcodeproj 3 81 gsoap-2.8.28/gsoap/ios_plugin/examples/GeoIPService/main.mm0000644000175000017500000000062312653650146023137 0ustar ellertellert// // main.m // GeoIPService // // Created by Wei Zhang on 5/27/12. // Copyright Genivia Inc. 2012. All rights reserved. // #import #import "./Classes/GeoIPServiceSoap12.nsmap" int main(int argc, char *argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; int retVal = UIApplicationMain(argc, argv, nil, nil); [pool release]; return retVal; } gsoap-2.8.28/gsoap/ios_plugin/examples/GeoIPService/gsoapios.h0000644000175000017500000001557612653650146023672 0ustar ellertellert/* gsoapios.h iOS plugin (iPhone and iPad) gSOAP XML Web services tools Copyright (C) 2000-2012, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under one of the following licenses: GPL, the gSOAP public license, or Genivia's license for commercial use. ------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2008, Robert van Engelen, Genivia Inc., All Rights Reserved. ------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. ------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com ------------------------------------------------------------------------------- */ #ifndef GSOAPIOS_H #define GSOAPIOS_H #import "stdsoap2.h" /* Class GSoapiOSURLData @brief stores states for connection establishment, buffering soap request and response */ @interface GSoapiOSURLData : NSObject { @private NSString *endpoint; NSString *host; NSString *soap_action; NSString *http_method; NSString *content_type; NSMutableData *http_req_msg; NSData *soap_req_msg; NSData *soap_res_msg; int port; int req_content_length; int received_length; // received length of response for deserialization bool request_sent; // flag indicates a soap request has been made // The timeout interval for the new request, in seconds double timeout_interval; unsigned int cache_policy; // The cache policy for the new request NSString *user_name; NSString *password; } @property(nonatomic, retain) NSString *endpoint; // Web service endpoint @property(nonatomic, retain) NSString *host; // host name @property(nonatomic, retain) NSString *soap_action; // soap action @property(nonatomic, retain) NSString *http_method; // http method @property(nonatomic, retain) NSString *content_type; // http content type // http request messgae @property(nonatomic, retain) NSMutableData *http_req_msg; // soap request message @property(nonatomic, retain) NSData *soap_req_msg; // soap response xml message @property(nonatomic, retain) NSData *soap_res_msg; @property(nonatomic) int port; // port @property(nonatomic) int req_content_length; // request content length // received length of response for deserialization @property(nonatomic) int received_length; // flag indicates a soap request has been made @property(nonatomic) bool request_sent; // the timout interval for request @property(nonatomic) double timeout_interval; @property(nonatomic) unsigned int cache_policy; // user and password: must appear in pair @property(nonatomic, retain) NSString *user_name; // user name @property(nonatomic, retain) NSString *password; // pasword - (id) init; @end /** plugin identification for plugin registry */ #define SOAP_IOS_ID "SOAP_IOS-1.0" // plugin identification for plugin registry #ifdef __cplusplus extern "C" { #endif /** @struct soap_ios_data @brief soap_ios plugin data to override callbacks and store states to manipulate SOAP connection using iOS libraries */ struct soap_ios_data { // Stores states such as endpoint, serialized request and response GSoapiOSURLData *url_data; // A callback function to replace the default tcp_connect function // Rather than establishment of a tcp connection using socket, this callback // extracts and saves states (endpoint, http-method, content-type etc.) and // buffers serialized request SOAP_SOCKET (*fopen)( struct soap*, const char*, const char*, int); // A callback function to replace the default tcp_disconnect function // Since no connection is established in fopen, this function does noop int (*fclose)( struct soap*); // A callback function to replace the default send function // This function buffers serialized request including HTTP header and body // (soap message) int (*fsend)( struct soap*, const char *, size_t); // A callback function to replace the default send function // This function sends a synchrous request to the endpoint and receives // response using iOS SDK class NSURLConnection. The response is then snet // to soap for deserialization. size_t (*frecv)( struct soap*, char *, size_t); }; /* @fn int soap_ios (struct soap *soap, struct soap_plugin *plugin, void *arg) @brief soap plugin function for registration @param[in] soap soap context @param[in] plugin plugin data @param[in] arg arguments for the plugin data Usgae: @code struct soap *soap = soap_new(); soap_register_plugin(soap, soap_ios); @endcode */ int soap_ios (struct soap *soap, struct soap_plugin *plugin, void *arg); /* @fn soap_ios_setcachepolicy @brief set cache policy The constants used to specify interaction with the cached responses are: enum { NSURLRequestUseProtocolCachePolicy = 0, NSURLRequestReloadIgnoringLocalCacheData = 1, NSURLRequestReloadIgnoringLocalAndRemoteCacheData =4, NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData, NSURLRequestReturnCacheDataElseLoad = 2, NSURLRequestReturnCacheDataDontLoad = 3, NSURLRequestReloadRevalidatingCacheData = 5 }; */ void soap_ios_setcachepolicy(struct soap *soap, unsigned int policy); /* @fn soap_ios_settimeoutinterval @brief set timeout interval in seconds */ void soap_ios_settimeoutinterval(struct soap *soap, double seconds); #ifdef __cplusplus } #endif // --- closing #ifdef __cplusplus #endif // --- closing #ifndef GSOAPIOS_H gsoap-2.8.28/gsoap/ios_plugin/examples/GeoIPService/GeoIPServiceViewController.xib0000644000175000017500000005467712653650146027571 0ustar ellertellert 800 10K549 762 1038.36 461.00 com.apple.InterfaceBuilder.IBCocoaTouchPlugin 87 YES YES com.apple.InterfaceBuilder.IBCocoaTouchPlugin YES YES YES YES IBFilesOwner IBCocoaTouchFramework IBFirstResponder IBCocoaTouchFramework 274 YES 319 {{20, 85}, {111, 22}} NO YES 7 NO IBCocoaTouchFramework IP Address Helvetica 18 16 1 MCAwIDAAA 1 10 303 {{139, 82}, {166, 31}} NO YES IBCocoaTouchFramework 0 3 3 MAA 2 YES 17 IBCocoaTouchFramework 319 {{25, 146}, {280, 37}} NO IBCocoaTouchFramework 0 0 Helvetica-Bold 15 16 1 Find Country 3 MQA 1 MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA 3 MC41AA {320, 460} 3 MC43NQA NO IBCocoaTouchFramework YES view 7 ipAddress 13 buttonFindCountry: 7 14 YES 0 -1 File's Owner -2 6 YES 8 9 10 YES YES -1.CustomClassName -2.CustomClassName 10.IBPluginDependency 6.IBEditorWindowLastContentRect 6.IBPluginDependency 8.IBPluginDependency 9.IBPluginDependency YES GeoIPServiceViewController UIResponder com.apple.InterfaceBuilder.IBCocoaTouchPlugin {{239, 376}, {320, 480}} com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin YES YES YES YES 14 YES GeoIPServiceViewController UIViewController buttonFindCountry: id YES YES activityIndicator ipAddress YES UIActivityIndicatorView UITextField IBProjectSource Classes/GeoIPServiceViewController.h YES NSObject IBFrameworkSource Foundation.framework/Headers/NSError.h NSObject IBFrameworkSource Foundation.framework/Headers/NSFileManager.h NSObject IBFrameworkSource Foundation.framework/Headers/NSKeyValueCoding.h NSObject IBFrameworkSource Foundation.framework/Headers/NSKeyValueObserving.h NSObject IBFrameworkSource Foundation.framework/Headers/NSKeyedArchiver.h NSObject IBFrameworkSource Foundation.framework/Headers/NSNetServices.h NSObject IBFrameworkSource Foundation.framework/Headers/NSObject.h NSObject IBFrameworkSource Foundation.framework/Headers/NSPort.h NSObject IBFrameworkSource Foundation.framework/Headers/NSRunLoop.h NSObject IBFrameworkSource Foundation.framework/Headers/NSStream.h NSObject IBFrameworkSource Foundation.framework/Headers/NSThread.h NSObject IBFrameworkSource Foundation.framework/Headers/NSURL.h NSObject IBFrameworkSource Foundation.framework/Headers/NSURLConnection.h NSObject IBFrameworkSource Foundation.framework/Headers/NSXMLParser.h NSObject IBFrameworkSource UIKit.framework/Headers/UIAccessibility.h NSObject IBFrameworkSource UIKit.framework/Headers/UINibLoading.h NSObject IBFrameworkSource UIKit.framework/Headers/UIResponder.h UIActivityIndicatorView UIView IBFrameworkSource UIKit.framework/Headers/UIActivityIndicatorView.h UIButton UIControl IBFrameworkSource UIKit.framework/Headers/UIButton.h UIControl UIView IBFrameworkSource UIKit.framework/Headers/UIControl.h UILabel UIView IBFrameworkSource UIKit.framework/Headers/UILabel.h UIResponder NSObject UISearchBar UIView IBFrameworkSource UIKit.framework/Headers/UISearchBar.h UISearchDisplayController NSObject IBFrameworkSource UIKit.framework/Headers/UISearchDisplayController.h UITextField UIControl IBFrameworkSource UIKit.framework/Headers/UITextField.h UIView UIView UIResponder IBFrameworkSource UIKit.framework/Headers/UIView.h UIViewController IBFrameworkSource UIKit.framework/Headers/UINavigationController.h UIViewController IBFrameworkSource UIKit.framework/Headers/UITabBarController.h UIViewController UIResponder IBFrameworkSource UIKit.framework/Headers/UIViewController.h 0 IBCocoaTouchFramework com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 YES GeoIPService.xcodeproj 3 87 gsoap-2.8.28/gsoap/ios_plugin/examples/GeoIPService/gsoapios.mm0000644000175000017500000004225512653650146024046 0ustar ellertellert/* gsoapios.m iOS plugin (iPhone and iPad) gSOAP XML Web services tools Copyright (C) 2000-2012, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under one of the following licenses: GPL, the gSOAP public license, or Genivia's license for commercial use. ------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2008, Robert van Engelen, Genivia Inc., All Rights Reserved. ------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. ------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com ------------------------------------------------------------------------------- */ /** @mainpage - @ref ios_0 documents the ios plugin for the development of client applications on iOS (iPhone and iPad) plarforms. */ /** @page ios_0 The iOS plugin for client applications on iOS (iPhone and iPad) platforms. @section ios_1 iOS plugin Setup */ #import "gsoapios.h" #import // ----------------------------------------------------------------------------- // Start of objective-c Class GSoapiOSURLData implementation // ----------------------------------------------------------------------------- /** Class GSoapiOSURLData @brief The class stores the states for connection establishment, buffering soap request and response */ @implementation GSoapiOSURLData @synthesize endpoint; ///< Set or get endpoint @synthesize host; ///< Set or get host name @synthesize soap_action; ///< Set or get soap action @synthesize http_method; ///< Set or get HTTP method @synthesize content_type; ///< Set or get content type @synthesize http_req_msg; ///< Set or get HTTP request message @synthesize soap_req_msg; ///< Set or get SOAP request @synthesize soap_res_msg; ///< Set or get SOAP response @synthesize port; ///< Set or get port @synthesize received_length; ///< Set or get received message length @synthesize request_sent; ///< Set or get the flag for the first time sending @synthesize req_content_length; ///< Set or get request message length @synthesize timeout_interval; ///< Set or get timeout interval @synthesize cache_policy; ///< Set or get cache policy @synthesize user_name; ///< Set or get user ID for authentication @synthesize password; ///< Set or get password for authentication /** @fn init @brief Constructor */ - (id) init { [super init]; http_req_msg = [NSMutableData alloc]; timeout_interval = 60.0; // 60 seconds by default cache_policy = NSURLRequestUseProtocolCachePolicy; // The default cache policy return self; } /** @fn dealloc @brief Destructor */ - (void) dealloc { [endpoint release]; [host release]; [soap_action release]; [http_method release]; [content_type release]; [http_req_msg release]; [soap_req_msg release]; [user_name release]; [password release]; [super dealloc]; } @end // ----------------------------------------------------------------------------- // End of objective-c Class GSoapiOSURLData implementation // ----------------------------------------------------------------------------- // ----------------------------------------------------------------------------- // Start of C plugin implementation // ----------------------------------------------------------------------------- /** plugin identification for plugin registry */ const char soap_ios_id[13] = SOAP_IOS_ID; // Unique plugin ID static int soap_ios_copy(struct soap *soap, struct soap_plugin *dst, struct soap_plugin *src); static void soap_ios_delete(struct soap *soap, struct soap_plugin *p); static int soap_ios_init(struct soap *soap, struct soap_ios_data *data); static SOAP_SOCKET soap_ios_open( struct soap *soap, const char *endpoint, const char *host, int port); static int soap_ios_close( struct soap *soap); static int soap_ios_send( struct soap *soap, const char *buf, size_t len); static size_t soap_ios_recv( struct soap *soap, char *buf, size_t len); //void soap_ios_setcachepolicy(struct soap *soap, unsigned int policy); //void soap_ios_settimeoutinterval(struct soap *soap, double seconds); /** @fn int soap_ios @brief Handles soap client on iOS platform (iPhone and iPad) @param soap context @param[in] p soap plugin data @param[in] arg arguments for plugin @return SOAP_OK if registration on success; SOAP_EOM otherwise */ int soap_ios (struct soap *soap, struct soap_plugin *p, void *arg) { p->id = soap_ios_id; // set a unique plugin id p->data = (void*)malloc(sizeof(struct soap_ios_data)); // Allocate memory p->fcopy = soap_ios_copy; // set fcopy callback for soap_copy(truct soap*) p->fdelete = soap_ios_delete; // set fdeete callback if (p->data) { if (soap_ios_init(soap, (struct soap_ios_data*)p->data) != SOAP_OK) { free(p->data); // free resource upon failure to initialize plugin return SOAP_EOM; } } return SOAP_OK; } /** @fn int soap_ios_copy(struct soap *soap, struct soap_plugin *dst, struct soap_plugin *src) @brief duplicates the plugin context for soap context @param soap context @param[out] dst destination plugin data @param[in] src sources plugin data to be copied from @param[in] arg arguments for plugin @return SOAP_OK if registration in success; SOAP_ERROR otherwise */ static int soap_ios_copy(struct soap *soap, struct soap_plugin *dst, struct soap_plugin *src) { *dst = *src; int status = SOAP_ERR; if (dst->data = (void*)malloc(sizeof(struct soap_ios_data))) status = soap_ios_init(soap, (struct soap_ios_data*)dst->data); return status; } /** @fn void soap_ios_delete(struct soap *soap, struct soap_plugin *p) @brief delete the plugin @param soap context @param[in] p plugin data */ static void soap_ios_delete(struct soap *soap, struct soap_plugin *p) { if (p != NULL) { struct soap_ios_data *data = (struct soap_ios_data*)p->data; if (data && data->url_data) [data->url_data release]; // Free url_data free(p->data); // Free the pointer to url_data } } /** @fn int soap_ios_init(struct soap *soap, struct soap_ios_data *data) @brief initializes the plugin data @param soap context @param[out] data plugin data to be initialized @return SOAP_OK if initialization is sucessful; SOAP_ERR otherwise */ static int soap_ios_init(struct soap *soap, struct soap_ios_data *data) { data->url_data = [[GSoapiOSURLData alloc] init]; if (data->url_data == nil) return SOAP_ERR; // failure to init // save and set callbacks data->fopen = soap->fopen; // save old fopen callback data->fclose = soap->fclose; // save old fclose callback data->fsend = soap->fsend; // save old fsend callback data->frecv = soap->frecv; // save old frecv callback soap->fopen = soap_ios_open; // replace open callback soap->fclose = soap_ios_close; // replace close callback soap->fsend = soap_ios_send; // replace send callback soap->frecv = soap_ios_recv; // replace recv callback return SOAP_OK; } /** @fn SOAP_SOCKET soap_ios_open( struct soap *soap, const char *endpoint, const char *host, int port) @brief extracts state from soap context and saves states for soap connection @param soap context @param[in] endpoint Web service's endpoint @param[in] host host name @param[in] port numer @return any valid socket (1) Note: This open function does not create a real socket for communication. The actual connection establishment happens in the frecv callback */ static SOAP_SOCKET soap_ios_open( struct soap *soap, const char *endpoint, const char *host, int port) { // Pull out the pluin data struct soap_ios_data *data = (struct soap_ios_data *)soap_lookup_plugin(soap, soap_ios_id); if (data == NULL || data->url_data == nil) return SOAP_INVALID_SOCKET; GSoapiOSURLData * url_data = data->url_data; [url_data setEndpoint:[NSString stringWithUTF8String:endpoint]]; [url_data setHost:[NSString stringWithUTF8String:host]]; [url_data setPort:port]; [url_data setRequest_sent:false]; [url_data setReceived_length:0]; [url_data setSoap_action:[NSString stringWithUTF8String:soap->action]]; [url_data setReq_content_length:soap->count]; // Extract a pair of userid and password if present if (soap->userid && soap->passwd) { [url_data setUser_name:[NSString stringWithUTF8String:soap->userid]]; [url_data setPassword:[NSString stringWithUTF8String:soap->passwd]]; } else { [url_data setUser_name:nil]; [url_data setPassword:nil]; } // Extracts and saves http-method switch (soap->status){ case SOAP_POST: [url_data setHttp_method:@"POST"]; break; case SOAP_GET: [url_data setHttp_method:@"GET"]; break; case SOAP_DEL: [url_data setHttp_method:@"DELETE"]; break; case SOAP_CONNECT: [url_data setHttp_method:@"CONNECT"]; break; default: [url_data setHttp_method:@"POST"]; break; } // Extracts and saves http content-type if((soap->mode & SOAP_ENC_DIME) && !(soap->mode & SOAP_ENC_MTOM)){ [url_data setContent_type:@"application/dime"]; } else if (soap->version == 2){ if (soap->mode & SOAP_ENC_MTOM){ [url_data setContent_type:@"application/xop+xml; charset=utf-8; \ type=\"application/soap+xml\""]; }else{ [url_data setContent_type:@"application/soap+xml; charset=utf-8"]; } }else if (soap->mode & SOAP_ENC_MTOM) { [url_data setContent_type:@"application/xop+xml; charset=utf-8; \ type=\"text/xml\""]; } else { [url_data setContent_type:@"tex/xml; charset=utf-8"]; } return 1; } /** @fn int soap_ios_close( struct soap *soap) @param soap context @param[in] endpoint Web service's endpoint @param[in] host host name @param[in] port numer @return 0 Note: This open function does not create a real socket for communication. The actual connection establishment happens in the frecv callback */ static int soap_ios_close( struct soap *soap) { return 0; } /** @fn int soap_ios_send( struct soap *soap, const char *buf, size_t len) @brief buffers the http/soap request in plugin data @param soap context @param[in] buf chunck of serialized http/soap request @param[in] len bufer size @return number of bytes buffered Note: This send function does not send any data to its peer. Rather it buffers the serialied soap request including http header to the plugin data. The sending happens actually in frecv function. */ static int soap_ios_send( struct soap *soap, const char *buf, size_t len) { struct soap_ios_data *data = (struct soap_ios_data*)soap_lookup_plugin(soap,soap_ios_id); GSoapiOSURLData *url_data = data->url_data; [url_data.http_req_msg appendBytes:buf length: len]; return len > 0 ? SOAP_OK : SOAP_EOF; } /** @fn size_t soap_ios_recv( struct soap *soap, char *buf, size_t len) @brief Sends soap request, buffers soap response and serialize the response @param soap context @param[out] buf buffer for received data @param[in] len number of bytes received @return the number of bytes received Note: This recv function sends a synchronous soap request through NSURLRequest, receives soap response, serializes response. */ static size_t soap_ios_recv( struct soap *soap, char *buf, size_t len) { struct soap_ios_data *data = (struct soap_ios_data*)soap_lookup_plugin(soap,soap_ios_id); GSoapiOSURLData *url_data = data->url_data; // Handle HTTP basic authentication if present if (url_data.user_name && url_data.password) { NSURLCredential *credential = [NSURLCredential credentialWithUser:url_data.user_name password:url_data.password persistence:NSURLCredentialPersistenceForSession]; NSURLProtectionSpace * protectionSpace = [[NSURLProtectionSpace alloc] initWithHost:url_data.host port:url_data.port protocol:@"http" realm:nil authenticationMethod:nil]; [[NSURLCredentialStorage sharedCredentialStorage] setDefaultCredential:credential forProtectionSpace:protectionSpace]; [protectionSpace release]; } // -------- End of auhentication handling --------- // Execute once: sending the request and receiving response // Send request through NSURLRequest sendSynchronousRequest // and receive response if(url_data.request_sent == false) { [url_data setRequest_sent:true]; //int msg_len = [url_data.http_req_msg length]; NSRange range = NSMakeRange([url_data.http_req_msg length] - url_data.req_content_length, url_data.req_content_length); url_data.soap_req_msg = [url_data.http_req_msg subdataWithRange:range]; NSURL *url = [NSURL URLWithString:url_data.endpoint]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:url_data.cache_policy timeoutInterval:url_data.timeout_interval]; [request addValue:url_data.host forHTTPHeaderField:@"HOST"]; [request addValue:url_data.soap_action forHTTPHeaderField:@"SOAPACTION"]; [request addValue:url_data.content_type forHTTPHeaderField:@"Content-Type"]; [request setHTTPMethod:url_data.http_method]; NSString *conten_length = [NSString stringWithFormat:@"%d", [url_data.soap_req_msg length]]; [request addValue:conten_length forHTTPHeaderField:@"Content-Length"]; [request setHTTPBody:url_data.soap_req_msg]; NSHTTPURLResponse *response = nil; NSError *error = nil; url_data.soap_res_msg = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; // Error handling if (error) { DLog(@"ERROR:<%@>\n", [error localizedDescription]); //const char *fault_string = [[error localizedDescription] UTF8String]; soap_receiver_fault(soap, [[error localizedDescription] UTF8String], ""); } } // may execute multiple times depending on the buffer size and response length if(url_data.request_sent) { size_t res_len = [url_data.soap_res_msg length]; // response length if (len + url_data.received_length > res_len) { // Adjustment len len = res_len - url_data.received_length; //cout << "len = " << len << endl; } const char *res_msg = (const char *)[url_data.soap_res_msg bytes]; memcpy(buf, res_msg + url_data.received_length, len); url_data.received_length += len; } return url_data.request_sent ? len : 0; } /** @fn void soap_ios_setcachepolicy(struct soap *soap, unsigned int policy) @brief Set cache policy The constants used to specify interaction with the cached responses are: enum { NSURLRequestUseProtocolCachePolicy = 0, NSURLRequestReloadIgnoringLocalCacheData = 1, NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData, NSURLRequestReturnCacheDataElseLoad = 2, NSURLRequestReturnCacheDataDontLoad = 3, NSURLRequestReloadIgnoringLocalAndRemoteCacheData =4, NSURLRequestReloadRevalidatingCacheData = 5 }; @param soap context @param[in] policy The policy to be set */ void soap_ios_setcachepolicy(struct soap *soap, unsigned int policy) { struct soap_ios_data *data = (struct soap_ios_data *)soap_lookup_plugin(soap, soap_ios_id); data->url_data.cache_policy = policy; } /** @fn soap_ios_settimeoutinterval(struct soap *soap, double seconds) @brief Set timeout interval @param soap The soap context @param[in] seconds The value for the timeout interval to be set in seconds */ void soap_ios_settimeoutinterval(struct soap *soap, double seconds) { struct soap_ios_data *data = (struct soap_ios_data *)soap_lookup_plugin(soap, soap_ios_id); data->url_data.timeout_interval = seconds; } // ----------------------------------------------------------------------------- // END of C plugin implementation // ----------------------------------------------------------------------------- gsoap-2.8.28/gsoap/ios_plugin/examples/GeoIPService/GeoIPService.xcodeproj/0000744000175000017500000000000012653650146026135 5ustar ellertellertgsoap-2.8.28/gsoap/ios_plugin/examples/GeoIPService/GeoIPService.xcodeproj/wzhang.pbxuser0000644000175000017500000001675212653650146031062 0ustar ellertellert// !$*UTF8*$! { 1D6058900D05DD3D006BFB54 /* GeoIPService */ = { activeExec = 0; executables = ( F52811211571F24600796852 /* GeoIPService */, ); }; 28D7ACF60DDB3853001CB0EB /* GeoIPServiceViewController.h */ = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {766, 912}}"; sepNavSelRange = "{261, 0}"; sepNavVisRange = "{0, 383}"; }; }; 28D7ACF70DDB3853001CB0EB /* GeoIPServiceViewController.mm */ = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {624, 1781}}"; sepNavSelRange = "{1379, 0}"; sepNavVisRange = "{1285, 743}"; }; }; 29B97313FDCFA39411CA2CEA /* Project object */ = { activeBuildConfigurationName = Debug; activeExecutable = F52811211571F24600796852 /* GeoIPService */; activeTarget = 1D6058900D05DD3D006BFB54 /* GeoIPService */; addToTargets = ( 1D6058900D05DD3D006BFB54 /* GeoIPService */, ); codeSenseManager = F528113A1571F24C00796852 /* Code sense */; executables = ( F52811211571F24600796852 /* GeoIPService */, ); perUserDictionary = { PBXConfiguration.PBXFileTableDataSource3.PBXBookmarksDataSource = { PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; PBXFileTableDataSourceColumnSortingKey = PBXBookmarksDataSource_NameID; PBXFileTableDataSourceColumnWidthsKey = ( 200, 200, 255.58349609375, ); PBXFileTableDataSourceColumnsKey = ( PBXBookmarksDataSource_LocationID, PBXBookmarksDataSource_NameID, PBXBookmarksDataSource_CommentsID, ); }; PBXConfiguration.PBXFileTableDataSource3.PBXFileTableDataSource = { PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID; PBXFileTableDataSourceColumnWidthsKey = ( 20, 446, 20, 48, 43, 43, 20, ); PBXFileTableDataSourceColumnsKey = ( PBXFileDataSource_FiletypeID, PBXFileDataSource_Filename_ColumnID, PBXFileDataSource_Built_ColumnID, PBXFileDataSource_ObjectSize_ColumnID, PBXFileDataSource_Errors_ColumnID, PBXFileDataSource_Warnings_ColumnID, PBXFileDataSource_Target_ColumnID, ); }; PBXConfiguration.PBXFileTableDataSource3.PBXFindDataSource = { PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; PBXFileTableDataSourceColumnSortingKey = PBXFindDataSource_LocationID; PBXFileTableDataSourceColumnWidthsKey = ( 200, 460, ); PBXFileTableDataSourceColumnsKey = ( PBXFindDataSource_MessageID, PBXFindDataSource_LocationID, ); }; PBXConfiguration.PBXFileTableDataSource3.XCSCMDataSource = { PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID; PBXFileTableDataSourceColumnWidthsKey = ( 20, 20, 580, 20, 48.16259765625, 43, 43, 20, ); PBXFileTableDataSourceColumnsKey = ( PBXFileDataSource_SCM_ColumnID, PBXFileDataSource_FiletypeID, PBXFileDataSource_Filename_ColumnID, PBXFileDataSource_Built_ColumnID, PBXFileDataSource_ObjectSize_ColumnID, PBXFileDataSource_Errors_ColumnID, PBXFileDataSource_Warnings_ColumnID, PBXFileDataSource_Target_ColumnID, ); }; PBXConfiguration.PBXTargetDataSource.PBXTargetDataSource = { PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID; PBXFileTableDataSourceColumnWidthsKey = ( 20, 564, 60, 20, 48.16259765625, 43, 43, ); PBXFileTableDataSourceColumnsKey = ( PBXFileDataSource_FiletypeID, PBXFileDataSource_Filename_ColumnID, PBXTargetDataSource_PrimaryAttribute, PBXFileDataSource_Built_ColumnID, PBXFileDataSource_ObjectSize_ColumnID, PBXFileDataSource_Errors_ColumnID, PBXFileDataSource_Warnings_ColumnID, ); }; PBXPerProjectTemplateStateSaveDate = 360919711; PBXWorkspaceStateSaveDate = 360919711; }; perUserProjectItems = { F525C4C11583332800143AAB /* PBXTextBookmark */ = F525C4C11583332800143AAB /* PBXTextBookmark */; F532F2771583323B00452363 /* PBXTextBookmark */ = F532F2771583323B00452363 /* PBXTextBookmark */; F532F2781583323B00452363 /* PBXTextBookmark */ = F532F2781583323B00452363 /* PBXTextBookmark */; F532F2791583323B00452363 /* PBXTextBookmark */ = F532F2791583323B00452363 /* PBXTextBookmark */; }; sourceControlManager = F52811391571F24C00796852 /* Source Control */; userBuildSettings = { }; }; 32CA4F630368D1EE00C91783 /* GeoIPService_Prefix.pch */ = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {782, 355}}"; sepNavSelRange = "{213, 0}"; sepNavVisRange = "{0, 343}"; }; }; F525C4C11583332800143AAB /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = F5B65B58158044D3004BF593 /* main.mm */; name = "main.mm: 6"; rLen = 0; rLoc = 97; rType = 0; vrLen = 403; vrLoc = 0; }; F52811211571F24600796852 /* GeoIPService */ = { isa = PBXExecutable; activeArgIndices = ( ); argumentStrings = ( ); autoAttachOnCrash = 1; breakpointsEnabled = 0; configStateDict = { }; customDataFormattersEnabled = 1; dataTipCustomDataFormattersEnabled = 1; dataTipShowTypeColumn = 1; dataTipSortType = 0; debuggerPlugin = GDBDebugging; disassemblyDisplayState = 0; dylibVariantSuffix = ""; enableDebugStr = 1; environmentEntries = ( ); executableSystemSymbolLevel = 0; executableUserSymbolLevel = 0; libgmallocEnabled = 0; name = GeoIPService; savedGlobals = { }; showTypeColumn = 0; sourceDirectories = ( ); }; F52811391571F24C00796852 /* Source Control */ = { isa = PBXSourceControlManager; fallbackIsa = XCSourceControlManager; isSCMEnabled = 0; scmConfiguration = { repositoryNamesForRoots = { "" = ""; }; }; }; F528113A1571F24C00796852 /* Code sense */ = { isa = PBXCodeSenseManager; indexTemplatePath = ""; }; F532F2771583323B00452363 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = F5A1A64A1580424200A81749 /* gsoapios.mm */; name = "gsoapios.mm: 1"; rLen = 0; rLoc = 0; rType = 0; vrLen = 643; vrLoc = 14737; }; F532F2781583323B00452363 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = 28D7ACF60DDB3853001CB0EB /* GeoIPServiceViewController.h */; name = "GeoIPServiceViewController.h: 6"; rLen = 0; rLoc = 119; rType = 0; vrLen = 383; vrLoc = 0; }; F532F2791583323B00452363 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = F5B65B58158044D3004BF593 /* main.mm */; name = "main.mm: 6"; rLen = 0; rLoc = 97; rType = 0; vrLen = 403; vrLoc = 0; }; F59E2CC2157E943A0081F2D3 /* gsoapios.h */ = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {624, 2808}}"; sepNavSelRange = "{6018, 0}"; sepNavVisRange = "{5296, 1024}"; }; }; F5A1A64A1580424200A81749 /* gsoapios.mm */ = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {766, 14794}}"; sepNavSelRange = "{23102, 0}"; sepNavVisRange = "{21902, 2130}"; }; }; F5B65B58158044D3004BF593 /* main.mm */ = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {624, 353}}"; sepNavSelRange = "{97, 0}"; sepNavVisRange = "{0, 403}"; }; }; F5E0954C1572A7000028FEFC /* soapGeoIPServiceSoap12Proxy.h */ = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {1601, 962}}"; sepNavSelRange = "{2491, 0}"; sepNavVisRange = "{1943, 1449}"; }; }; F5E0954E1572A7000028FEFC /* soapStub.h */ = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {936, 3744}}"; sepNavSelRange = "{4003, 0}"; sepNavVisRange = "{3833, 1239}"; }; }; } gsoap-2.8.28/gsoap/ios_plugin/examples/GeoIPService/GeoIPService.xcodeproj/project.pbxproj0000744000175000017500000003431212653650146031217 0ustar ellertellert// !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 45; objects = { /* Begin PBXBuildFile section */ 1D3623260D0F684500981E51 /* GeoIPServiceAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D3623250D0F684500981E51 /* GeoIPServiceAppDelegate.m */; }; 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; }; 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */; }; 288765A50DF7441C002DB57D /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 288765A40DF7441C002DB57D /* CoreGraphics.framework */; }; 2899E5220DE3E06400AC0155 /* GeoIPServiceViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2899E5210DE3E06400AC0155 /* GeoIPServiceViewController.xib */; }; 28AD733F0D9D9553002E5188 /* MainWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 28AD733E0D9D9553002E5188 /* MainWindow.xib */; }; 28D7ACF80DDB3853001CB0EB /* GeoIPServiceViewController.mm in Sources */ = {isa = PBXBuildFile; fileRef = 28D7ACF70DDB3853001CB0EB /* GeoIPServiceViewController.mm */; }; F5A1A64B1580424200A81749 /* gsoapios.mm in Sources */ = {isa = PBXBuildFile; fileRef = F5A1A64A1580424200A81749 /* gsoapios.mm */; }; F5B65B59158044D3004BF593 /* main.mm in Sources */ = {isa = PBXBuildFile; fileRef = F5B65B58158044D3004BF593 /* main.mm */; }; F5E095511572A7000028FEFC /* GeoIPServiceSoap12.nsmap in Resources */ = {isa = PBXBuildFile; fileRef = F5E095491572A7000028FEFC /* GeoIPServiceSoap12.nsmap */; }; F5E095521572A7000028FEFC /* soapC.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5E0954A1572A7000028FEFC /* soapC.cpp */; }; F5E095531572A7000028FEFC /* soapGeoIPServiceSoap12Proxy.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5E0954B1572A7000028FEFC /* soapGeoIPServiceSoap12Proxy.cpp */; }; F5E095541572A7000028FEFC /* stdsoap2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5E0954F1572A7000028FEFC /* stdsoap2.cpp */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ 1D30AB110D05D00D00671497 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 1D3623240D0F684500981E51 /* GeoIPServiceAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GeoIPServiceAppDelegate.h; sourceTree = ""; }; 1D3623250D0F684500981E51 /* GeoIPServiceAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeoIPServiceAppDelegate.m; sourceTree = ""; }; 1D6058910D05DD3D006BFB54 /* GeoIPService.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = GeoIPService.app; sourceTree = BUILT_PRODUCTS_DIR; }; 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 288765A40DF7441C002DB57D /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 2899E5210DE3E06400AC0155 /* GeoIPServiceViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = GeoIPServiceViewController.xib; sourceTree = ""; }; 28AD733E0D9D9553002E5188 /* MainWindow.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MainWindow.xib; sourceTree = ""; }; 28D7ACF60DDB3853001CB0EB /* GeoIPServiceViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GeoIPServiceViewController.h; sourceTree = ""; }; 28D7ACF70DDB3853001CB0EB /* GeoIPServiceViewController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = GeoIPServiceViewController.mm; sourceTree = ""; }; 32CA4F630368D1EE00C91783 /* GeoIPService_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GeoIPService_Prefix.pch; sourceTree = ""; }; 8D1107310486CEB800E47090 /* GeoIPService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GeoIPService-Info.plist"; plistStructureDefinitionIdentifier = "com.apple.xcode.plist.structure-definition.iphone.info-plist"; sourceTree = ""; }; F59E2CC2157E943A0081F2D3 /* gsoapios.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gsoapios.h; sourceTree = ""; }; F5A1A64A1580424200A81749 /* gsoapios.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = gsoapios.mm; sourceTree = ""; }; F5B65B58158044D3004BF593 /* main.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = main.mm; sourceTree = ""; }; F5E095491572A7000028FEFC /* GeoIPServiceSoap12.nsmap */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = GeoIPServiceSoap12.nsmap; sourceTree = ""; }; F5E0954A1572A7000028FEFC /* soapC.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = soapC.cpp; sourceTree = ""; }; F5E0954B1572A7000028FEFC /* soapGeoIPServiceSoap12Proxy.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = soapGeoIPServiceSoap12Proxy.cpp; sourceTree = ""; }; F5E0954C1572A7000028FEFC /* soapGeoIPServiceSoap12Proxy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = soapGeoIPServiceSoap12Proxy.h; sourceTree = ""; }; F5E0954D1572A7000028FEFC /* soapH.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = soapH.h; sourceTree = ""; }; F5E0954E1572A7000028FEFC /* soapStub.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = soapStub.h; sourceTree = ""; }; F5E0954F1572A7000028FEFC /* stdsoap2.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = stdsoap2.cpp; sourceTree = ""; }; F5E095501572A7000028FEFC /* stdsoap2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = stdsoap2.h; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 1D60588F0D05DD3D006BFB54 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */, 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */, 288765A50DF7441C002DB57D /* CoreGraphics.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 080E96DDFE201D6D7F000001 /* Classes */ = { isa = PBXGroup; children = ( F5A1A64A1580424200A81749 /* gsoapios.mm */, F59E2CC2157E943A0081F2D3 /* gsoapios.h */, F5E095491572A7000028FEFC /* GeoIPServiceSoap12.nsmap */, F5E0954A1572A7000028FEFC /* soapC.cpp */, F5E0954B1572A7000028FEFC /* soapGeoIPServiceSoap12Proxy.cpp */, F5E0954C1572A7000028FEFC /* soapGeoIPServiceSoap12Proxy.h */, F5E0954D1572A7000028FEFC /* soapH.h */, F5E0954E1572A7000028FEFC /* soapStub.h */, F5E0954F1572A7000028FEFC /* stdsoap2.cpp */, F5E095501572A7000028FEFC /* stdsoap2.h */, 1D3623240D0F684500981E51 /* GeoIPServiceAppDelegate.h */, 1D3623250D0F684500981E51 /* GeoIPServiceAppDelegate.m */, 28D7ACF60DDB3853001CB0EB /* GeoIPServiceViewController.h */, 28D7ACF70DDB3853001CB0EB /* GeoIPServiceViewController.mm */, ); path = Classes; sourceTree = ""; }; 19C28FACFE9D520D11CA2CBB /* Products */ = { isa = PBXGroup; children = ( 1D6058910D05DD3D006BFB54 /* GeoIPService.app */, ); name = Products; sourceTree = ""; }; 29B97314FDCFA39411CA2CEA /* CustomTemplate */ = { isa = PBXGroup; children = ( 080E96DDFE201D6D7F000001 /* Classes */, 29B97315FDCFA39411CA2CEA /* Other Sources */, 29B97317FDCFA39411CA2CEA /* Resources */, 29B97323FDCFA39411CA2CEA /* Frameworks */, 19C28FACFE9D520D11CA2CBB /* Products */, ); name = CustomTemplate; sourceTree = ""; }; 29B97315FDCFA39411CA2CEA /* Other Sources */ = { isa = PBXGroup; children = ( F5B65B58158044D3004BF593 /* main.mm */, 32CA4F630368D1EE00C91783 /* GeoIPService_Prefix.pch */, ); name = "Other Sources"; sourceTree = ""; }; 29B97317FDCFA39411CA2CEA /* Resources */ = { isa = PBXGroup; children = ( 2899E5210DE3E06400AC0155 /* GeoIPServiceViewController.xib */, 28AD733E0D9D9553002E5188 /* MainWindow.xib */, 8D1107310486CEB800E47090 /* GeoIPService-Info.plist */, ); name = Resources; sourceTree = ""; }; 29B97323FDCFA39411CA2CEA /* Frameworks */ = { isa = PBXGroup; children = ( 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */, 1D30AB110D05D00D00671497 /* Foundation.framework */, 288765A40DF7441C002DB57D /* CoreGraphics.framework */, ); name = Frameworks; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ 1D6058900D05DD3D006BFB54 /* GeoIPService */ = { isa = PBXNativeTarget; buildConfigurationList = 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "GeoIPService" */; buildPhases = ( 1D60588D0D05DD3D006BFB54 /* Resources */, 1D60588E0D05DD3D006BFB54 /* Sources */, 1D60588F0D05DD3D006BFB54 /* Frameworks */, ); buildRules = ( ); dependencies = ( ); name = GeoIPService; productName = GeoIPService; productReference = 1D6058910D05DD3D006BFB54 /* GeoIPService.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 29B97313FDCFA39411CA2CEA /* Project object */ = { isa = PBXProject; buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "GeoIPService" */; compatibilityVersion = "Xcode 3.1"; hasScannedForEncodings = 1; mainGroup = 29B97314FDCFA39411CA2CEA /* CustomTemplate */; projectDirPath = ""; projectRoot = ""; targets = ( 1D6058900D05DD3D006BFB54 /* GeoIPService */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ 1D60588D0D05DD3D006BFB54 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( 28AD733F0D9D9553002E5188 /* MainWindow.xib in Resources */, 2899E5220DE3E06400AC0155 /* GeoIPServiceViewController.xib in Resources */, F5E095511572A7000028FEFC /* GeoIPServiceSoap12.nsmap in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ 1D60588E0D05DD3D006BFB54 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 1D3623260D0F684500981E51 /* GeoIPServiceAppDelegate.m in Sources */, 28D7ACF80DDB3853001CB0EB /* GeoIPServiceViewController.mm in Sources */, F5E095521572A7000028FEFC /* soapC.cpp in Sources */, F5E095531572A7000028FEFC /* soapGeoIPServiceSoap12Proxy.cpp in Sources */, F5E095541572A7000028FEFC /* stdsoap2.cpp in Sources */, F5A1A64B1580424200A81749 /* gsoapios.mm in Sources */, F5B65B59158044D3004BF593 /* main.mm in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin XCBuildConfiguration section */ 1D6058940D05DD3E006BFB54 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; COPY_PHASE_STRIP = NO; GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = GeoIPService_Prefix.pch; INFOPLIST_FILE = "GeoIPService-Info.plist"; PRODUCT_NAME = GeoIPService; }; name = Debug; }; 1D6058950D05DD3E006BFB54 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; COPY_PHASE_STRIP = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = GeoIPService_Prefix.pch; INFOPLIST_FILE = "GeoIPService-Info.plist"; PRODUCT_NAME = GeoIPService; VALIDATE_PRODUCT = YES; }; name = Release; }; C01FCF4F08A954540054247B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = "$(ARCHS_STANDARD_32_BIT)"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; GCC_C_LANGUAGE_STANDARD = c99; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; PREBINDING = NO; SDKROOT = iphoneos3.1.3; }; name = Debug; }; C01FCF5008A954540054247B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = "$(ARCHS_STANDARD_32_BIT)"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; GCC_C_LANGUAGE_STANDARD = c99; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; PREBINDING = NO; SDKROOT = iphoneos3.1.3; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "GeoIPService" */ = { isa = XCConfigurationList; buildConfigurations = ( 1D6058940D05DD3E006BFB54 /* Debug */, 1D6058950D05DD3E006BFB54 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; C01FCF4E08A954540054247B /* Build configuration list for PBXProject "GeoIPService" */ = { isa = XCConfigurationList; buildConfigurations = ( C01FCF4F08A954540054247B /* Debug */, C01FCF5008A954540054247B /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; } gsoap-2.8.28/gsoap/ios_plugin/examples/GeoIPService/GeoIPService.xcodeproj/wzhang.mode1v30000644000175000017500000011556212653650146030647 0ustar ellertellert ActivePerspectiveName Project AllowedModules BundleLoadPath MaxInstances n Module PBXSmartGroupTreeModule Name Groups and Files Outline View BundleLoadPath MaxInstances n Module PBXNavigatorGroup Name Editor BundleLoadPath MaxInstances n Module XCTaskListModule Name Task List BundleLoadPath MaxInstances n Module XCDetailModule Name File and Smart Group Detail Viewer BundleLoadPath MaxInstances 1 Module PBXBuildResultsModule Name Detailed Build Results Viewer BundleLoadPath MaxInstances 1 Module PBXProjectFindModule Name Project Batch Find Tool BundleLoadPath MaxInstances n Module XCProjectFormatConflictsModule Name Project Format Conflicts List BundleLoadPath MaxInstances n Module PBXBookmarksModule Name Bookmarks Tool BundleLoadPath MaxInstances n Module PBXClassBrowserModule Name Class Browser BundleLoadPath MaxInstances n Module PBXCVSModule Name Source Code Control Tool BundleLoadPath MaxInstances n Module PBXDebugBreakpointsModule Name Debug Breakpoints Tool BundleLoadPath MaxInstances n Module XCDockableInspector Name Inspector BundleLoadPath MaxInstances n Module PBXOpenQuicklyModule Name Open Quickly Tool BundleLoadPath MaxInstances 1 Module PBXDebugSessionModule Name Debugger BundleLoadPath MaxInstances 1 Module PBXDebugCLIModule Name Debug Console BundleLoadPath MaxInstances n Module XCSnapshotModule Name Snapshots Tool BundlePath /Developer/Library/PrivateFrameworks/DevToolsInterface.framework/Resources Description DefaultDescriptionKey DockingSystemVisible Extension mode1v3 FavBarConfig PBXProjectModuleGUID F5E1345315729C0000FEBF56 XCBarModuleItemNames XCBarModuleItems FirstTimeWindowDisplayed Identifier com.apple.perspectives.project.mode1v3 MajorVersion 33 MinorVersion 0 Name Default Notifications OpenEditors PerspectiveWidths -1 -1 Perspectives ChosenToolbarItems active-combo-popup action NSToolbarFlexibleSpaceItem debugger-enable-breakpoints build-and-go com.apple.ide.PBXToolbarStopButton get-info servicesModuleSnapshots takeSnapshot NSToolbarFlexibleSpaceItem com.apple.pbx.toolbar.searchfield ControllerClassBaseName IconName WindowOfProjectWithEditor Identifier perspective.project IsVertical Layout ContentConfiguration PBXBottomSmartGroupGIDs 1C37FBAC04509CD000000102 1C37FAAC04509CD000000102 1C37FABC05509CD000000102 1C37FABC05539CD112110102 E2644B35053B69B200211256 1C37FABC04509CD000100104 1CC0EA4004350EF90044410B 1CC0EA4004350EF90041110B PBXProjectModuleGUID 1CE0B1FE06471DED0097A5F4 PBXProjectModuleLabel Files PBXProjectStructureProvided yes PBXSmartGroupTreeModuleColumnData PBXSmartGroupTreeModuleColumnWidthsKey 312 PBXSmartGroupTreeModuleColumnsKey_v4 MainColumn PBXSmartGroupTreeModuleOutlineStateKey_v7 PBXSmartGroupTreeModuleOutlineStateExpansionKey 29B97314FDCFA39411CA2CEA 1C37FABC05509CD000000102 PBXSmartGroupTreeModuleOutlineStateSelectionKey 1 0 PBXSmartGroupTreeModuleOutlineStateVisibleRectKey {{0, 0}, {312, 695}} PBXTopSmartGroupGIDs XCIncludePerspectivesSwitch XCSharingToken com.apple.Xcode.GFSharingToken GeometryConfiguration Frame {{0, 0}, {329, 713}} GroupTreeTableConfiguration MainColumn 312 RubberWindowFrame 421 124 1019 754 0 0 1440 878 Module PBXSmartGroupTreeModule Proportion 329pt Dock ContentConfiguration PBXProjectModuleGUID 1CE0B20306471E060097A5F4 PBXProjectModuleLabel main.mm PBXSplitModuleInNavigatorKey Split0 PBXProjectModuleGUID 1CE0B20406471E060097A5F4 PBXProjectModuleLabel main.mm _historyCapacity 0 bookmark F525C4C11583332800143AAB history F532F2771583323B00452363 F532F2781583323B00452363 F532F2791583323B00452363 SplitCount 1 StatusBarVisibility GeometryConfiguration Frame {{0, 0}, {685, 385}} RubberWindowFrame 421 124 1019 754 0 0 1440 878 Module PBXNavigatorGroup Proportion 385pt BecomeActive ContentConfiguration PBXProjectModuleGUID 1CE0B20506471E060097A5F4 PBXProjectModuleLabel Detail GeometryConfiguration Frame {{0, 390}, {685, 323}} RubberWindowFrame 421 124 1019 754 0 0 1440 878 Module XCDetailModule Proportion 323pt Proportion 685pt Name Project ServiceClasses XCModuleDock PBXSmartGroupTreeModule XCModuleDock PBXNavigatorGroup XCDetailModule TableOfContents F525C4B1158332A700143AAB 1CE0B1FE06471DED0097A5F4 F525C4B2158332A700143AAB 1CE0B20306471E060097A5F4 1CE0B20506471E060097A5F4 ToolbarConfigUserDefaultsMinorVersion 2 ToolbarConfiguration xcode.toolbar.config.defaultV3 ControllerClassBaseName IconName WindowOfProject Identifier perspective.morph IsVertical 0 Layout BecomeActive 1 ContentConfiguration PBXBottomSmartGroupGIDs 1C37FBAC04509CD000000102 1C37FAAC04509CD000000102 1C08E77C0454961000C914BD 1C37FABC05509CD000000102 1C37FABC05539CD112110102 E2644B35053B69B200211256 1C37FABC04509CD000100104 1CC0EA4004350EF90044410B 1CC0EA4004350EF90041110B PBXProjectModuleGUID 11E0B1FE06471DED0097A5F4 PBXProjectModuleLabel Files PBXProjectStructureProvided yes PBXSmartGroupTreeModuleColumnData PBXSmartGroupTreeModuleColumnWidthsKey 186 PBXSmartGroupTreeModuleColumnsKey_v4 MainColumn PBXSmartGroupTreeModuleOutlineStateKey_v7 PBXSmartGroupTreeModuleOutlineStateExpansionKey 29B97314FDCFA39411CA2CEA 1C37FABC05509CD000000102 PBXSmartGroupTreeModuleOutlineStateSelectionKey 0 PBXSmartGroupTreeModuleOutlineStateVisibleRectKey {{0, 0}, {186, 337}} PBXTopSmartGroupGIDs XCIncludePerspectivesSwitch 1 XCSharingToken com.apple.Xcode.GFSharingToken GeometryConfiguration Frame {{0, 0}, {203, 355}} GroupTreeTableConfiguration MainColumn 186 RubberWindowFrame 373 269 690 397 0 0 1440 878 Module PBXSmartGroupTreeModule Proportion 100% Name Morph PreferredWidth 300 ServiceClasses XCModuleDock PBXSmartGroupTreeModule TableOfContents 11E0B1FE06471DED0097A5F4 ToolbarConfiguration xcode.toolbar.config.default.shortV3 PerspectivesBarVisible ShelfIsVisible SourceDescription file at '/Developer/Library/PrivateFrameworks/DevToolsInterface.framework/Resources/XCPerspectivesSpecificationMode1.xcperspec' StatusbarIsVisible TimeStamp 0.0 ToolbarConfigUserDefaultsMinorVersion 2 ToolbarDisplayMode 1 ToolbarIsVisible ToolbarSizeMode 1 Type Perspectives UpdateMessage The Default Workspace in this version of Xcode now includes support to hide and show the detail view (what has been referred to as the "Metro-Morph" feature). You must discard your current Default Workspace settings and update to the latest Default Workspace in order to gain this feature. Do you wish to update to the latest Workspace defaults for project '%@'? WindowJustification 5 WindowOrderList 1C78EAAD065D492600B07095 1CD10A99069EF8BA00B06720 F5E1345415729C0000FEBF56 /Users/wzhang/Research/Projects/ios_plugin/examples/GeoIPService/GeoIPService.xcodeproj WindowString 421 124 1019 754 0 0 1440 878 WindowToolsV3 FirstTimeWindowDisplayed Identifier windowTool.build IsVertical Layout Dock ContentConfiguration PBXProjectModuleGUID 1CD0528F0623707200166675 PBXProjectModuleLabel StatusBarVisibility GeometryConfiguration Frame {{0, 0}, {500, 218}} RubberWindowFrame 414 290 500 500 0 0 1440 878 Module PBXNavigatorGroup Proportion 218pt ContentConfiguration PBXProjectModuleGUID XCMainBuildResultsModuleGUID PBXProjectModuleLabel Build Results XCBuildResultsTrigger_Collapse 1021 XCBuildResultsTrigger_Open 1011 GeometryConfiguration Frame {{0, 223}, {500, 236}} RubberWindowFrame 414 290 500 500 0 0 1440 878 Module PBXBuildResultsModule Proportion 236pt Proportion 459pt Name Build Results ServiceClasses PBXBuildResultsModule StatusbarIsVisible TableOfContents F5E1345415729C0000FEBF56 F525C4B3158332A700143AAB 1CD0528F0623707200166675 XCMainBuildResultsModuleGUID ToolbarConfiguration xcode.toolbar.config.buildV3 WindowContentMinSize 486 300 WindowString 414 290 500 500 0 0 1440 878 WindowToolGUID F5E1345415729C0000FEBF56 WindowToolIsVisible FirstTimeWindowDisplayed Identifier windowTool.debugger IsVertical Layout Dock ContentConfiguration Debugger HorizontalSplitView _collapsingFrameDimension 0.0 _indexOfCollapsedView 0 _percentageOfCollapsedView 0.0 isCollapsed yes sizes {{0, 0}, {316, 203}} {{316, 0}, {378, 203}} VerticalSplitView _collapsingFrameDimension 0.0 _indexOfCollapsedView 0 _percentageOfCollapsedView 0.0 isCollapsed yes sizes {{0, 0}, {694, 203}} {{0, 203}, {694, 178}} LauncherConfigVersion 8 PBXProjectModuleGUID 1C162984064C10D400B95A72 PBXProjectModuleLabel Debug - GLUTExamples (Underwater) GeometryConfiguration DebugConsoleVisible None DebugConsoleWindowFrame {{200, 200}, {500, 300}} DebugSTDIOWindowFrame {{200, 200}, {500, 300}} Frame {{0, 0}, {694, 381}} PBXDebugSessionStackFrameViewKey DebugVariablesTableConfiguration Name 120 Value 85 Summary 148 Frame {{316, 0}, {378, 203}} RubberWindowFrame 347 370 694 422 0 0 1440 878 RubberWindowFrame 347 370 694 422 0 0 1440 878 Module PBXDebugSessionModule Proportion 381pt Proportion 381pt Name Debugger ServiceClasses PBXDebugSessionModule StatusbarIsVisible TableOfContents 1CD10A99069EF8BA00B06720 F525C4B4158332A700143AAB 1C162984064C10D400B95A72 F525C4B5158332A700143AAB F525C4B6158332A700143AAB F525C4B7158332A700143AAB F525C4B8158332A700143AAB F525C4B9158332A700143AAB ToolbarConfiguration xcode.toolbar.config.debugV3 WindowString 347 370 694 422 0 0 1440 878 WindowToolGUID 1CD10A99069EF8BA00B06720 WindowToolIsVisible FirstTimeWindowDisplayed Identifier windowTool.find IsVertical Layout Dock Dock ContentConfiguration PBXProjectModuleGUID 1CDD528C0622207200134675 PBXProjectModuleLabel StatusBarVisibility GeometryConfiguration Frame {{0, 0}, {781, 212}} RubberWindowFrame 36 383 781 470 0 0 1440 878 Module PBXNavigatorGroup Proportion 781pt Proportion 212pt BecomeActive ContentConfiguration PBXProjectModuleGUID 1CD0528E0623707200166675 PBXProjectModuleLabel Project Find GeometryConfiguration Frame {{0, 217}, {781, 212}} RubberWindowFrame 36 383 781 470 0 0 1440 878 Module PBXProjectFindModule Proportion 212pt Proportion 429pt Name Project Find ServiceClasses PBXProjectFindModule StatusbarIsVisible TableOfContents 1C530D57069F1CE1000CFCEE F5D5E85A1573253A00193248 F5D5E85B1573253A00193248 1CDD528C0622207200134675 1CD0528E0623707200166675 WindowString 36 383 781 470 0 0 1440 878 WindowToolGUID 1C530D57069F1CE1000CFCEE WindowToolIsVisible Identifier MENUSEPARATOR FirstTimeWindowDisplayed Identifier windowTool.debuggerConsole IsVertical Layout Dock ContentConfiguration PBXProjectModuleGUID 1C78EAAC065D492600B07095 PBXProjectModuleLabel Debugger Console GeometryConfiguration Frame {{0, 0}, {773, 686}} RubberWindowFrame 37 145 773 727 0 0 1440 878 Module PBXDebugCLIModule Proportion 686pt Proportion 686pt Name Debugger Console ServiceClasses PBXDebugCLIModule StatusbarIsVisible TableOfContents 1C78EAAD065D492600B07095 F525C4BA158332A700143AAB 1C78EAAC065D492600B07095 ToolbarConfiguration xcode.toolbar.config.consoleV3 WindowString 37 145 773 727 0 0 1440 878 WindowToolGUID 1C78EAAD065D492600B07095 WindowToolIsVisible Identifier windowTool.snapshots Layout Dock Module XCSnapshotModule Proportion 100% Proportion 100% Name Snapshots ServiceClasses XCSnapshotModule StatusbarIsVisible Yes ToolbarConfiguration xcode.toolbar.config.snapshots WindowString 315 824 300 550 0 0 1440 878 WindowToolIsVisible Yes Identifier windowTool.scm Layout Dock ContentConfiguration PBXProjectModuleGUID 1C78EAB2065D492600B07095 PBXProjectModuleLabel <No Editor> PBXSplitModuleInNavigatorKey Split0 PBXProjectModuleGUID 1C78EAB3065D492600B07095 SplitCount 1 StatusBarVisibility 1 GeometryConfiguration Frame {{0, 0}, {452, 0}} RubberWindowFrame 743 379 452 308 0 0 1280 1002 Module PBXNavigatorGroup Proportion 0pt BecomeActive 1 ContentConfiguration PBXProjectModuleGUID 1CD052920623707200166675 PBXProjectModuleLabel SCM GeometryConfiguration ConsoleFrame {{0, 259}, {452, 0}} Frame {{0, 7}, {452, 259}} RubberWindowFrame 743 379 452 308 0 0 1280 1002 TableConfiguration Status 30 FileName 199 Path 197.0950012207031 TableFrame {{0, 0}, {452, 250}} Module PBXCVSModule Proportion 262pt Proportion 266pt Name SCM ServiceClasses PBXCVSModule StatusbarIsVisible 1 TableOfContents 1C78EAB4065D492600B07095 1C78EAB5065D492600B07095 1C78EAB2065D492600B07095 1CD052920623707200166675 ToolbarConfiguration xcode.toolbar.config.scm WindowString 743 379 452 308 0 0 1280 1002 Identifier windowTool.breakpoints IsVertical 0 Layout Dock BecomeActive 1 ContentConfiguration PBXBottomSmartGroupGIDs 1C77FABC04509CD000000102 PBXProjectModuleGUID 1CE0B1FE06471DED0097A5F4 PBXProjectModuleLabel Files PBXProjectStructureProvided no PBXSmartGroupTreeModuleColumnData PBXSmartGroupTreeModuleColumnWidthsKey 168 PBXSmartGroupTreeModuleColumnsKey_v4 MainColumn PBXSmartGroupTreeModuleOutlineStateKey_v7 PBXSmartGroupTreeModuleOutlineStateExpansionKey 1C77FABC04509CD000000102 PBXSmartGroupTreeModuleOutlineStateSelectionKey 0 PBXSmartGroupTreeModuleOutlineStateVisibleRectKey {{0, 0}, {168, 350}} PBXTopSmartGroupGIDs XCIncludePerspectivesSwitch 0 GeometryConfiguration Frame {{0, 0}, {185, 368}} GroupTreeTableConfiguration MainColumn 168 RubberWindowFrame 315 424 744 409 0 0 1440 878 Module PBXSmartGroupTreeModule Proportion 185pt ContentConfiguration PBXProjectModuleGUID 1CA1AED706398EBD00589147 PBXProjectModuleLabel Detail GeometryConfiguration Frame {{190, 0}, {554, 368}} RubberWindowFrame 315 424 744 409 0 0 1440 878 Module XCDetailModule Proportion 554pt Proportion 368pt MajorVersion 3 MinorVersion 0 Name Breakpoints ServiceClasses PBXSmartGroupTreeModule XCDetailModule StatusbarIsVisible 1 TableOfContents 1CDDB66807F98D9800BB5817 1CDDB66907F98D9800BB5817 1CE0B1FE06471DED0097A5F4 1CA1AED706398EBD00589147 ToolbarConfiguration xcode.toolbar.config.breakpointsV3 WindowString 315 424 744 409 0 0 1440 878 WindowToolGUID 1CDDB66807F98D9800BB5817 WindowToolIsVisible 1 Identifier windowTool.debugAnimator Layout Dock Module PBXNavigatorGroup Proportion 100% Proportion 100% Name Debug Visualizer ServiceClasses PBXNavigatorGroup StatusbarIsVisible 1 ToolbarConfiguration xcode.toolbar.config.debugAnimatorV3 WindowString 100 100 700 500 0 0 1280 1002 Identifier windowTool.bookmarks Layout Dock Module PBXBookmarksModule Proportion 100% Proportion 100% Name Bookmarks ServiceClasses PBXBookmarksModule StatusbarIsVisible 0 WindowString 538 42 401 187 0 0 1280 1002 Identifier windowTool.projectFormatConflicts Layout Dock Module XCProjectFormatConflictsModule Proportion 100% Proportion 100% Name Project Format Conflicts ServiceClasses XCProjectFormatConflictsModule StatusbarIsVisible 0 WindowContentMinSize 450 300 WindowString 50 850 472 307 0 0 1440 877 Identifier windowTool.classBrowser Layout Dock BecomeActive 1 ContentConfiguration OptionsSetName Hierarchy, all classes PBXProjectModuleGUID 1CA6456E063B45B4001379D8 PBXProjectModuleLabel Class Browser - NSObject GeometryConfiguration ClassesFrame {{0, 0}, {374, 96}} ClassesTreeTableConfiguration PBXClassNameColumnIdentifier 208 PBXClassBookColumnIdentifier 22 Frame {{0, 0}, {630, 331}} MembersFrame {{0, 105}, {374, 395}} MembersTreeTableConfiguration PBXMemberTypeIconColumnIdentifier 22 PBXMemberNameColumnIdentifier 216 PBXMemberTypeColumnIdentifier 97 PBXMemberBookColumnIdentifier 22 PBXModuleWindowStatusBarHidden2 1 RubberWindowFrame 385 179 630 352 0 0 1440 878 Module PBXClassBrowserModule Proportion 332pt Proportion 332pt Name Class Browser ServiceClasses PBXClassBrowserModule StatusbarIsVisible 0 TableOfContents 1C0AD2AF069F1E9B00FABCE6 1C0AD2B0069F1E9B00FABCE6 1CA6456E063B45B4001379D8 ToolbarConfiguration xcode.toolbar.config.classbrowser WindowString 385 179 630 352 0 0 1440 878 WindowToolGUID 1C0AD2AF069F1E9B00FABCE6 WindowToolIsVisible 0 Identifier windowTool.refactoring IncludeInToolsMenu 0 Layout Dock BecomeActive 1 GeometryConfiguration Frame {0, 0}, {500, 335} RubberWindowFrame {0, 0}, {500, 335} Module XCRefactoringModule Proportion 100% Proportion 100% Name Refactoring ServiceClasses XCRefactoringModule WindowString 200 200 500 356 0 0 1920 1200 gsoap-2.8.28/gsoap/ios_plugin/examples/GeoIPService/Classes/0000744000175000017500000000000012653650146023252 5ustar ellertellertgsoap-2.8.28/gsoap/ios_plugin/examples/GeoIPService/Classes/GeoIPServiceAppDelegate.m0000644000175000017500000000127112653650146030013 0ustar ellertellert// // GeoIPServiceAppDelegate.m // GeoIPService // // Created by Wei Zhang on 5/27/12. // Copyright __MyCompanyName__ 2012. All rights reserved. // #import "GeoIPServiceAppDelegate.h" #import "GeoIPServiceViewController.h" @implementation GeoIPServiceAppDelegate @synthesize window; @synthesize viewController; - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after app launch [window addSubview:viewController.view]; [window makeKeyAndVisible]; return YES; } - (void)dealloc { [viewController release]; [window release]; [super dealloc]; } @end gsoap-2.8.28/gsoap/ios_plugin/examples/GeoIPService/Classes/GeoIPServiceViewController.mm0000644000175000017500000000673012653650146031000 0ustar ellertellert// // GeoIPServiceViewController.mm // GeoIPService // // Created by Wei Zhang on 5/27/12. // Copyright Genivia Inc. 2012. All rights reserved. // #import "GeoIPServiceViewController.h" #include "soapGeoIPServiceSoap12Proxy.h" #import "gsoapios.h" using namespace std; typedef struct _ns1__GetGeoIP RequestStruct; typedef struct _ns1__GetGeoIPResponse ResponseStruct; @implementation GeoIPServiceViewController @synthesize ipAddress; - (IBAction)buttonFindCountry:(id)sender { RequestStruct ip; ResponseStruct response; GeoIPServiceSoap12Proxy service; std::string ipAdd = std::string((char *)[ipAddress.text UTF8String]); ip.IPAddress = &ipAdd; // ----- register plugin for callbacks ------ soap_register_plugin(&service, soap_ios); // Optional: timeout internal, the default is 60.0 seconds soap_ios_settimeoutinterval(&service, 30.0); // Optional: the default policy is NSURLRequestUseProtocolCachePolicy (0) soap_ios_setcachepolicy(&service, NSURLRequestReturnCacheDataElseLoad); // (2) int status = service.GetGeoIP(&ip, &response); string* result; string err_msg = "Invalid IP address"; if ( status == SOAP_OK) { if(response.GetGeoIPResult && response.GetGeoIPResult->CountryName) { result = response.GetGeoIPResult->CountryName; } else { result = &err_msg; } } else { service.soap_stream_fault(std::cerr); } NSString *soapResult; NSString *tittleMsg; if (status == SOAP_OK) { soapResult = [NSString stringWithUTF8String:result->c_str()]; tittleMsg = [NSString stringWithFormat: @"%@", @"Country Found"]; } else { soapResult = [NSString stringWithFormat: @"%@", @"Soap Error!"]; tittleMsg = [NSString stringWithFormat: @"%@", @"Warning"]; } UIAlertView *alert = [[UIAlertView alloc] initWithTitle:tittleMsg message:soapResult delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert show]; [alert release]; service.destroy(); // Free soap context } /* // The designated initializer. Override to perform setup that is required before the view is loaded. - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) { // Custom initialization } return self; } */ /* // Implement loadView to create a view hierarchy programmatically, without using a nib. - (void)loadView { } */ /* // Implement viewDidLoad to do additional setup after loading the view, typically from a nib. - (void)viewDidLoad { [super viewDidLoad]; } */ // Override to allow orientations other than the default portrait orientation. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { // Return YES for supported orientations return (interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown || interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation == UIInterfaceOrientationLandscapeRight); } - (void)didReceiveMemoryWarning { // Releases the view if it doesn't have a superview. [super didReceiveMemoryWarning]; // Release any cached data, images, etc that aren't in use. } - (void)viewDidUnload { // Release any retained subviews of the main view. // e.g. self.myOutlet = nil; } - (void)dealloc { [ipAddress release]; [super dealloc]; } @end gsoap-2.8.28/gsoap/ios_plugin/examples/GeoIPService/Classes/soapC.cpp0000644000175000017500000033373412653650146025042 0ustar ellertellert/* soapC.cpp Generated by gSOAP 2.8.8 from GeoIPService.h Copyright(C) 2000-2012, Robert van Engelen, Genivia Inc. All Rights Reserved. The generated code is released under one of the following licenses: 1) GPL or 2) Genivia's license for commercial use. This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. */ #if defined(__BORLANDC__) #pragma option push -w-8060 #pragma option push -w-8004 #endif #include "soapH.h" SOAP_SOURCE_STAMP("@(#) soapC.cpp ver 2.8.8 2012-05-24 21:00:32 GMT") #ifndef WITH_NOGLOBAL SOAP_FMAC3 void SOAP_FMAC4 soap_serializeheader(struct soap *soap) { if (soap->header) soap_serialize_SOAP_ENV__Header(soap, soap->header); } SOAP_FMAC3 int SOAP_FMAC4 soap_putheader(struct soap *soap) { if (soap->header) { soap->part = SOAP_IN_HEADER; if (soap_out_SOAP_ENV__Header(soap, "SOAP-ENV:Header", 0, soap->header, NULL)) return soap->error; soap->part = SOAP_END_HEADER; } return SOAP_OK; } SOAP_FMAC3 int SOAP_FMAC4 soap_getheader(struct soap *soap) { soap->part = SOAP_IN_HEADER; soap->header = soap_in_SOAP_ENV__Header(soap, "SOAP-ENV:Header", NULL, NULL); soap->part = SOAP_END_HEADER; return soap->header == NULL; } SOAP_FMAC3 void SOAP_FMAC4 soap_header(struct soap *soap) { if (!soap->header) { if ((soap->header = soap_new_SOAP_ENV__Header(soap, -1))) soap_default_SOAP_ENV__Header(soap, soap->header); } } SOAP_FMAC3 void SOAP_FMAC4 soap_fault(struct soap *soap) { if (!soap->fault) { soap->fault = soap_new_SOAP_ENV__Fault(soap, -1); if (!soap->fault) return; soap_default_SOAP_ENV__Fault(soap, soap->fault); } if (soap->version == 2 && !soap->fault->SOAP_ENV__Code) { soap->fault->SOAP_ENV__Code = soap_new_SOAP_ENV__Code(soap, -1); soap_default_SOAP_ENV__Code(soap, soap->fault->SOAP_ENV__Code); } if (soap->version == 2 && !soap->fault->SOAP_ENV__Reason) { soap->fault->SOAP_ENV__Reason = soap_new_SOAP_ENV__Reason(soap, -1); soap_default_SOAP_ENV__Reason(soap, soap->fault->SOAP_ENV__Reason); } } SOAP_FMAC3 void SOAP_FMAC4 soap_serializefault(struct soap *soap) { soap_fault(soap); if (soap->fault) soap_serialize_SOAP_ENV__Fault(soap, soap->fault); } SOAP_FMAC3 int SOAP_FMAC4 soap_putfault(struct soap *soap) { if (soap->fault) return soap_put_SOAP_ENV__Fault(soap, soap->fault, "SOAP-ENV:Fault", NULL); return SOAP_OK; } SOAP_FMAC3 int SOAP_FMAC4 soap_getfault(struct soap *soap) { return (soap->fault = soap_get_SOAP_ENV__Fault(soap, NULL, "SOAP-ENV:Fault", NULL)) == NULL; } SOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultcode(struct soap *soap) { soap_fault(soap); if (soap->version == 2 && soap->fault->SOAP_ENV__Code) return (const char**)&soap->fault->SOAP_ENV__Code->SOAP_ENV__Value; return (const char**)&soap->fault->faultcode; } SOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultsubcode(struct soap *soap) { soap_fault(soap); if (soap->version == 2) { if (!soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode) { soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode = soap_new_SOAP_ENV__Code(soap, -1); soap_default_SOAP_ENV__Code(soap, soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode); } return (const char**)&soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode->SOAP_ENV__Value; } return (const char**)&soap->fault->faultcode; } SOAP_FMAC3 const char * SOAP_FMAC4 soap_check_faultsubcode(struct soap *soap) { soap_fault(soap); if (soap->version == 2) { if (soap->fault->SOAP_ENV__Code && soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode && soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode) return soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode->SOAP_ENV__Value; return NULL; } return soap->fault->faultcode; } SOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultstring(struct soap *soap) { soap_fault(soap); if (soap->version == 2) return (const char**)&soap->fault->SOAP_ENV__Reason->SOAP_ENV__Text; return (const char**)&soap->fault->faultstring; } SOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultdetail(struct soap *soap) { soap_fault(soap); if (soap->version == 1) { if (!soap->fault->detail) { soap->fault->detail = (struct SOAP_ENV__Detail*)soap_malloc(soap, sizeof(struct SOAP_ENV__Detail)); soap_default_SOAP_ENV__Detail(soap, soap->fault->detail); } return (const char**)&soap->fault->detail->__any; } if (!soap->fault->SOAP_ENV__Detail) { soap->fault->SOAP_ENV__Detail = soap_new_SOAP_ENV__Detail(soap, -1); soap_default_SOAP_ENV__Detail(soap, soap->fault->SOAP_ENV__Detail); } return (const char**)&soap->fault->SOAP_ENV__Detail->__any; } SOAP_FMAC3 const char * SOAP_FMAC4 soap_check_faultdetail(struct soap *soap) { soap_fault(soap); if (soap->version == 2 && soap->fault->SOAP_ENV__Detail) return soap->fault->SOAP_ENV__Detail->__any; if (soap->fault->detail) return soap->fault->detail->__any; return NULL; } #endif #ifndef WITH_NOIDREF SOAP_FMAC3 int SOAP_FMAC4 soap_getindependent(struct soap *soap) { int t; if (soap->version == 1) { for (;;) { if (!soap_getelement(soap, &t)) if (soap->error || soap_ignore_element(soap)) break; } } if (soap->error == SOAP_NO_TAG || soap->error == SOAP_EOF) soap->error = SOAP_OK; return soap->error; } #endif #ifndef WITH_NOIDREF #ifdef __cplusplus extern "C" { #endif SOAP_FMAC3 void * SOAP_FMAC4 soap_getelement(struct soap *soap, int *type) { (void)type; if (soap_peek_element(soap)) return NULL; if (!*soap->id || !(*type = soap_lookup_type(soap, soap->id))) *type = soap_lookup_type(soap, soap->href); switch (*type) { case SOAP_TYPE_byte: return soap_in_byte(soap, NULL, NULL, "xsd:byte"); case SOAP_TYPE_int: return soap_in_int(soap, NULL, NULL, "xsd:int"); case SOAP_TYPE_std__string: return soap_in_std__string(soap, NULL, NULL, "xsd:string"); case SOAP_TYPE_ns1__GeoIP: return soap_in_ns1__GeoIP(soap, NULL, NULL, "ns1:GeoIP"); case SOAP_TYPE_PointerTo_ns1__GetGeoIPContextResponse: return soap_in_PointerTo_ns1__GetGeoIPContextResponse(soap, NULL, NULL, "ns1:GetGeoIPContextResponse"); case SOAP_TYPE_PointerTo_ns1__GetGeoIPContext: return soap_in_PointerTo_ns1__GetGeoIPContext(soap, NULL, NULL, "ns1:GetGeoIPContext"); case SOAP_TYPE_PointerTo_ns1__GetGeoIPResponse: return soap_in_PointerTo_ns1__GetGeoIPResponse(soap, NULL, NULL, "ns1:GetGeoIPResponse"); case SOAP_TYPE_PointerTo_ns1__GetGeoIP: return soap_in_PointerTo_ns1__GetGeoIP(soap, NULL, NULL, "ns1:GetGeoIP"); case SOAP_TYPE_PointerTons1__GeoIP: return soap_in_PointerTons1__GeoIP(soap, NULL, NULL, "ns1:GeoIP"); case SOAP_TYPE_PointerTostd__string: return soap_in_PointerTostd__string(soap, NULL, NULL, "xsd:string"); case SOAP_TYPE__QName: { char **s; s = soap_in__QName(soap, NULL, NULL, "xsd:QName"); return s ? *s : NULL; } case SOAP_TYPE_string: { char **s; s = soap_in_string(soap, NULL, NULL, "xsd:string"); return s ? *s : NULL; } default: { const char *t = soap->type; if (!*t) t = soap->tag; if (!soap_match_tag(soap, t, "xsd:string")) { *type = SOAP_TYPE_std__string; return soap_in_std__string(soap, NULL, NULL, NULL); } if (!soap_match_tag(soap, t, "ns1:GeoIP")) { *type = SOAP_TYPE_ns1__GeoIP; return soap_in_ns1__GeoIP(soap, NULL, NULL, NULL); } if (!soap_match_tag(soap, t, "xsd:byte")) { *type = SOAP_TYPE_byte; return soap_in_byte(soap, NULL, NULL, NULL); } if (!soap_match_tag(soap, t, "xsd:int")) { *type = SOAP_TYPE_int; return soap_in_int(soap, NULL, NULL, NULL); } if (!soap_match_tag(soap, t, "xsd:QName")) { char **s; *type = SOAP_TYPE__QName; s = soap_in__QName(soap, NULL, NULL, NULL); return s ? *s : NULL; } if (!soap_match_tag(soap, t, "xsd:string")) { char **s; *type = SOAP_TYPE_string; s = soap_in_string(soap, NULL, NULL, NULL); return s ? *s : NULL; } t = soap->tag; if (!soap_match_tag(soap, t, "ns1:GetGeoIPContextResponse")) { *type = SOAP_TYPE__ns1__GetGeoIPContextResponse; return soap_in__ns1__GetGeoIPContextResponse(soap, NULL, NULL, NULL); } if (!soap_match_tag(soap, t, "ns1:GetGeoIPContext")) { *type = SOAP_TYPE__ns1__GetGeoIPContext; return soap_in__ns1__GetGeoIPContext(soap, NULL, NULL, NULL); } if (!soap_match_tag(soap, t, "ns1:GetGeoIPResponse")) { *type = SOAP_TYPE__ns1__GetGeoIPResponse; return soap_in__ns1__GetGeoIPResponse(soap, NULL, NULL, NULL); } if (!soap_match_tag(soap, t, "ns1:GetGeoIP")) { *type = SOAP_TYPE__ns1__GetGeoIP; return soap_in__ns1__GetGeoIP(soap, NULL, NULL, NULL); } } } soap->error = SOAP_TAG_MISMATCH; return NULL; } #ifdef __cplusplus } #endif #endif SOAP_FMAC3 int SOAP_FMAC4 soap_ignore_element(struct soap *soap) { if (!soap_peek_element(soap)) { int t; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unexpected element '%s' in input (level=%u, %d)\n", soap->tag, soap->level, soap->body)); if (soap->mustUnderstand && !soap->other) return soap->error = SOAP_MUSTUNDERSTAND; if (((soap->mode & SOAP_XML_STRICT) && soap->part != SOAP_IN_HEADER) || !soap_match_tag(soap, soap->tag, "SOAP-ENV:")) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "REJECTING element '%s'\n", soap->tag)); return soap->error = SOAP_TAG_MISMATCH; } if (!*soap->id || !soap_getelement(soap, &t)) { soap->peeked = 0; if (soap->fignore) soap->error = soap->fignore(soap, soap->tag); else soap->error = SOAP_OK; DBGLOG(TEST, if (!soap->error) SOAP_MESSAGE(fdebug, "IGNORING element '%s'\n", soap->tag)); if (!soap->error && soap->body) { soap->level++; while (!soap_ignore_element(soap)) ; if (soap->error == SOAP_NO_TAG) soap->error = soap_element_end_in(soap, NULL); } } } return soap->error; } #ifndef WITH_NOIDREF SOAP_FMAC3 int SOAP_FMAC4 soap_putindependent(struct soap *soap) { int i; struct soap_plist *pp; if (soap->version == 1 && soap->encodingStyle && !(soap->mode & (SOAP_XML_TREE | SOAP_XML_GRAPH))) for (i = 0; i < SOAP_PTRHASH; i++) for (pp = soap->pht[i]; pp; pp = pp->next) if (pp->mark1 == 2 || pp->mark2 == 2) if (soap_putelement(soap, pp->ptr, "id", pp->id, pp->type)) return soap->error; return SOAP_OK; } #endif #ifndef WITH_NOIDREF #ifdef __cplusplus extern "C" { #endif SOAP_FMAC3 int SOAP_FMAC4 soap_putelement(struct soap *soap, const void *ptr, const char *tag, int id, int type) { (void)tag; switch (type) { case SOAP_TYPE_byte: return soap_out_byte(soap, tag, id, (const char *)ptr, "xsd:byte"); case SOAP_TYPE_int: return soap_out_int(soap, tag, id, (const int *)ptr, "xsd:int"); case SOAP_TYPE_std__string: return soap_out_std__string(soap, tag, id, (const std::string *)ptr, "xsd:string"); case SOAP_TYPE__ns1__GetGeoIPContextResponse: return ((_ns1__GetGeoIPContextResponse *)ptr)->soap_out(soap, "ns1:GetGeoIPContextResponse", id, NULL); case SOAP_TYPE__ns1__GetGeoIPContext: return ((_ns1__GetGeoIPContext *)ptr)->soap_out(soap, "ns1:GetGeoIPContext", id, NULL); case SOAP_TYPE__ns1__GetGeoIPResponse: return ((_ns1__GetGeoIPResponse *)ptr)->soap_out(soap, "ns1:GetGeoIPResponse", id, NULL); case SOAP_TYPE__ns1__GetGeoIP: return ((_ns1__GetGeoIP *)ptr)->soap_out(soap, "ns1:GetGeoIP", id, NULL); case SOAP_TYPE_ns1__GeoIP: return ((ns1__GeoIP *)ptr)->soap_out(soap, tag, id, "ns1:GeoIP"); case SOAP_TYPE_PointerTo_ns1__GetGeoIPContextResponse: return soap_out_PointerTo_ns1__GetGeoIPContextResponse(soap, tag, id, (_ns1__GetGeoIPContextResponse *const*)ptr, "ns1:GetGeoIPContextResponse"); case SOAP_TYPE_PointerTo_ns1__GetGeoIPContext: return soap_out_PointerTo_ns1__GetGeoIPContext(soap, tag, id, (_ns1__GetGeoIPContext *const*)ptr, "ns1:GetGeoIPContext"); case SOAP_TYPE_PointerTo_ns1__GetGeoIPResponse: return soap_out_PointerTo_ns1__GetGeoIPResponse(soap, tag, id, (_ns1__GetGeoIPResponse *const*)ptr, "ns1:GetGeoIPResponse"); case SOAP_TYPE_PointerTo_ns1__GetGeoIP: return soap_out_PointerTo_ns1__GetGeoIP(soap, tag, id, (_ns1__GetGeoIP *const*)ptr, "ns1:GetGeoIP"); case SOAP_TYPE_PointerTons1__GeoIP: return soap_out_PointerTons1__GeoIP(soap, tag, id, (ns1__GeoIP *const*)ptr, "ns1:GeoIP"); case SOAP_TYPE_PointerTostd__string: return soap_out_PointerTostd__string(soap, tag, id, (std::string *const*)ptr, "xsd:string"); case SOAP_TYPE__QName: return soap_out_string(soap, tag, id, (char*const*)&ptr, "xsd:QName"); case SOAP_TYPE_string: return soap_out_string(soap, tag, id, (char*const*)&ptr, "xsd:string"); } return SOAP_OK; } #ifdef __cplusplus } #endif #endif #ifndef WITH_NOIDREF #ifdef __cplusplus extern "C" { #endif SOAP_FMAC3 void SOAP_FMAC4 soap_markelement(struct soap *soap, const void *ptr, int type) { (void)soap; (void)ptr; (void)type; /* appease -Wall -Werror */ switch (type) { case SOAP_TYPE_std__string: soap_serialize_std__string(soap, (const std::string *)ptr); break; case SOAP_TYPE__ns1__GetGeoIPContextResponse: ((_ns1__GetGeoIPContextResponse *)ptr)->soap_serialize(soap); break; case SOAP_TYPE__ns1__GetGeoIPContext: ((_ns1__GetGeoIPContext *)ptr)->soap_serialize(soap); break; case SOAP_TYPE__ns1__GetGeoIPResponse: ((_ns1__GetGeoIPResponse *)ptr)->soap_serialize(soap); break; case SOAP_TYPE__ns1__GetGeoIP: ((_ns1__GetGeoIP *)ptr)->soap_serialize(soap); break; case SOAP_TYPE_ns1__GeoIP: ((ns1__GeoIP *)ptr)->soap_serialize(soap); break; case SOAP_TYPE___ns3__GetGeoIPContext: soap_serialize___ns3__GetGeoIPContext(soap, (const struct __ns3__GetGeoIPContext *)ptr); break; case SOAP_TYPE___ns3__GetGeoIP: soap_serialize___ns3__GetGeoIP(soap, (const struct __ns3__GetGeoIP *)ptr); break; case SOAP_TYPE___ns2__GetGeoIPContext: soap_serialize___ns2__GetGeoIPContext(soap, (const struct __ns2__GetGeoIPContext *)ptr); break; case SOAP_TYPE___ns2__GetGeoIP: soap_serialize___ns2__GetGeoIP(soap, (const struct __ns2__GetGeoIP *)ptr); break; case SOAP_TYPE_PointerTo_ns1__GetGeoIPContextResponse: soap_serialize_PointerTo_ns1__GetGeoIPContextResponse(soap, (_ns1__GetGeoIPContextResponse *const*)ptr); break; case SOAP_TYPE_PointerTo_ns1__GetGeoIPContext: soap_serialize_PointerTo_ns1__GetGeoIPContext(soap, (_ns1__GetGeoIPContext *const*)ptr); break; case SOAP_TYPE_PointerTo_ns1__GetGeoIPResponse: soap_serialize_PointerTo_ns1__GetGeoIPResponse(soap, (_ns1__GetGeoIPResponse *const*)ptr); break; case SOAP_TYPE_PointerTo_ns1__GetGeoIP: soap_serialize_PointerTo_ns1__GetGeoIP(soap, (_ns1__GetGeoIP *const*)ptr); break; case SOAP_TYPE_PointerTons1__GeoIP: soap_serialize_PointerTons1__GeoIP(soap, (ns1__GeoIP *const*)ptr); break; case SOAP_TYPE_PointerTostd__string: soap_serialize_PointerTostd__string(soap, (std::string *const*)ptr); break; case SOAP_TYPE__QName: soap_serialize_string(soap, (char*const*)&ptr); break; case SOAP_TYPE_string: soap_serialize_string(soap, (char*const*)&ptr); break; } } #ifdef __cplusplus } #endif #endif SOAP_FMAC3 void * SOAP_FMAC4 soap_instantiate(struct soap *soap, int t, const char *type, const char *arrayType, size_t *n) { (void)type; switch (t) { case SOAP_TYPE_std__string: return (void*)soap_instantiate_std__string(soap, -1, type, arrayType, n); case SOAP_TYPE_ns1__GeoIP: return (void*)soap_instantiate_ns1__GeoIP(soap, -1, type, arrayType, n); case SOAP_TYPE__ns1__GetGeoIP: return (void*)soap_instantiate__ns1__GetGeoIP(soap, -1, type, arrayType, n); case SOAP_TYPE__ns1__GetGeoIPResponse: return (void*)soap_instantiate__ns1__GetGeoIPResponse(soap, -1, type, arrayType, n); case SOAP_TYPE__ns1__GetGeoIPContext: return (void*)soap_instantiate__ns1__GetGeoIPContext(soap, -1, type, arrayType, n); case SOAP_TYPE__ns1__GetGeoIPContextResponse: return (void*)soap_instantiate__ns1__GetGeoIPContextResponse(soap, -1, type, arrayType, n); case SOAP_TYPE___ns2__GetGeoIP: return (void*)soap_instantiate___ns2__GetGeoIP(soap, -1, type, arrayType, n); case SOAP_TYPE___ns2__GetGeoIPContext: return (void*)soap_instantiate___ns2__GetGeoIPContext(soap, -1, type, arrayType, n); case SOAP_TYPE___ns3__GetGeoIP: return (void*)soap_instantiate___ns3__GetGeoIP(soap, -1, type, arrayType, n); case SOAP_TYPE___ns3__GetGeoIPContext: return (void*)soap_instantiate___ns3__GetGeoIPContext(soap, -1, type, arrayType, n); #ifndef WITH_NOGLOBAL case SOAP_TYPE_SOAP_ENV__Header: return (void*)soap_instantiate_SOAP_ENV__Header(soap, -1, type, arrayType, n); #endif #ifndef WITH_NOGLOBAL case SOAP_TYPE_SOAP_ENV__Code: return (void*)soap_instantiate_SOAP_ENV__Code(soap, -1, type, arrayType, n); #endif #ifndef WITH_NOGLOBAL case SOAP_TYPE_SOAP_ENV__Detail: return (void*)soap_instantiate_SOAP_ENV__Detail(soap, -1, type, arrayType, n); #endif #ifndef WITH_NOGLOBAL case SOAP_TYPE_SOAP_ENV__Reason: return (void*)soap_instantiate_SOAP_ENV__Reason(soap, -1, type, arrayType, n); #endif #ifndef WITH_NOGLOBAL case SOAP_TYPE_SOAP_ENV__Fault: return (void*)soap_instantiate_SOAP_ENV__Fault(soap, -1, type, arrayType, n); #endif } return NULL; } SOAP_FMAC3 int SOAP_FMAC4 soap_fdelete(struct soap_clist *p) { switch (p->type) { case SOAP_TYPE_std__string: if (p->size < 0) SOAP_DELETE((std::string*)p->ptr); else SOAP_DELETE_ARRAY((std::string*)p->ptr); break; case SOAP_TYPE_ns1__GeoIP: if (p->size < 0) SOAP_DELETE((ns1__GeoIP*)p->ptr); else SOAP_DELETE_ARRAY((ns1__GeoIP*)p->ptr); break; case SOAP_TYPE__ns1__GetGeoIP: if (p->size < 0) SOAP_DELETE((_ns1__GetGeoIP*)p->ptr); else SOAP_DELETE_ARRAY((_ns1__GetGeoIP*)p->ptr); break; case SOAP_TYPE__ns1__GetGeoIPResponse: if (p->size < 0) SOAP_DELETE((_ns1__GetGeoIPResponse*)p->ptr); else SOAP_DELETE_ARRAY((_ns1__GetGeoIPResponse*)p->ptr); break; case SOAP_TYPE__ns1__GetGeoIPContext: if (p->size < 0) SOAP_DELETE((_ns1__GetGeoIPContext*)p->ptr); else SOAP_DELETE_ARRAY((_ns1__GetGeoIPContext*)p->ptr); break; case SOAP_TYPE__ns1__GetGeoIPContextResponse: if (p->size < 0) SOAP_DELETE((_ns1__GetGeoIPContextResponse*)p->ptr); else SOAP_DELETE_ARRAY((_ns1__GetGeoIPContextResponse*)p->ptr); break; case SOAP_TYPE___ns2__GetGeoIP: if (p->size < 0) SOAP_DELETE((struct __ns2__GetGeoIP*)p->ptr); else SOAP_DELETE_ARRAY((struct __ns2__GetGeoIP*)p->ptr); break; case SOAP_TYPE___ns2__GetGeoIPContext: if (p->size < 0) SOAP_DELETE((struct __ns2__GetGeoIPContext*)p->ptr); else SOAP_DELETE_ARRAY((struct __ns2__GetGeoIPContext*)p->ptr); break; case SOAP_TYPE___ns3__GetGeoIP: if (p->size < 0) SOAP_DELETE((struct __ns3__GetGeoIP*)p->ptr); else SOAP_DELETE_ARRAY((struct __ns3__GetGeoIP*)p->ptr); break; case SOAP_TYPE___ns3__GetGeoIPContext: if (p->size < 0) SOAP_DELETE((struct __ns3__GetGeoIPContext*)p->ptr); else SOAP_DELETE_ARRAY((struct __ns3__GetGeoIPContext*)p->ptr); break; #ifndef WITH_NOGLOBAL case SOAP_TYPE_SOAP_ENV__Header: if (p->size < 0) SOAP_DELETE((struct SOAP_ENV__Header*)p->ptr); else SOAP_DELETE_ARRAY((struct SOAP_ENV__Header*)p->ptr); break; #endif #ifndef WITH_NOGLOBAL case SOAP_TYPE_SOAP_ENV__Code: if (p->size < 0) SOAP_DELETE((struct SOAP_ENV__Code*)p->ptr); else SOAP_DELETE_ARRAY((struct SOAP_ENV__Code*)p->ptr); break; #endif #ifndef WITH_NOGLOBAL case SOAP_TYPE_SOAP_ENV__Detail: if (p->size < 0) SOAP_DELETE((struct SOAP_ENV__Detail*)p->ptr); else SOAP_DELETE_ARRAY((struct SOAP_ENV__Detail*)p->ptr); break; #endif #ifndef WITH_NOGLOBAL case SOAP_TYPE_SOAP_ENV__Reason: if (p->size < 0) SOAP_DELETE((struct SOAP_ENV__Reason*)p->ptr); else SOAP_DELETE_ARRAY((struct SOAP_ENV__Reason*)p->ptr); break; #endif #ifndef WITH_NOGLOBAL case SOAP_TYPE_SOAP_ENV__Fault: if (p->size < 0) SOAP_DELETE((struct SOAP_ENV__Fault*)p->ptr); else SOAP_DELETE_ARRAY((struct SOAP_ENV__Fault*)p->ptr); break; #endif default: return SOAP_ERR; } return SOAP_OK; } SOAP_FMAC3 void* SOAP_FMAC4 soap_class_id_enter(struct soap *soap, const char *id, void *p, int t, size_t n, const char *type, const char *arrayType) { return soap_id_enter(soap, id, p, t, n, 0, type, arrayType, soap_instantiate); } SOAP_FMAC3 void* SOAP_FMAC4 soap_container_id_forward(struct soap *soap, const char *href, void *p, size_t len, int st, int tt, size_t n, unsigned int k) { return soap_id_forward(soap, href, p, len, st, tt, n, k, soap_container_insert); } SOAP_FMAC3 void SOAP_FMAC4 soap_container_insert(struct soap *soap, int st, int tt, void *p, size_t len, const void *q, size_t n) #ifdef WIN32 #pragma warning(push) #pragma warning(disable:4065) #endif { (void)soap; (void)st; (void)p; (void)len; (void)q; (void)n; /* appease -Wall -Werror */ switch (tt) { default: DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not insert type=%d in %d\n", st, tt)); } #ifdef WIN32 #pragma warning(pop) #endif } SOAP_FMAC3 void SOAP_FMAC4 soap_default_byte(struct soap *soap, char *a) { (void)soap; /* appease -Wall -Werror */ #ifdef SOAP_DEFAULT_byte *a = SOAP_DEFAULT_byte; #else *a = (char)0; #endif } SOAP_FMAC3 int SOAP_FMAC4 soap_out_byte(struct soap *soap, const char *tag, int id, const char *a, const char *type) { (void)soap; (void)type; (void)tag; (void)id; return soap_outbyte(soap, tag, id, a, type, SOAP_TYPE_byte); } SOAP_FMAC3 char * SOAP_FMAC4 soap_in_byte(struct soap *soap, const char *tag, char *a, const char *type) { char *p; p = soap_inbyte(soap, tag, a, type, SOAP_TYPE_byte); return p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_byte(struct soap *soap, const char *a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_byte); if (soap_out_byte(soap, tag?tag:"byte", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 char * SOAP_FMAC4 soap_get_byte(struct soap *soap, char *p, const char *tag, const char *type) { if ((p = soap_in_byte(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC3 void SOAP_FMAC4 soap_default_int(struct soap *soap, int *a) { (void)soap; /* appease -Wall -Werror */ #ifdef SOAP_DEFAULT_int *a = SOAP_DEFAULT_int; #else *a = (int)0; #endif } SOAP_FMAC3 int SOAP_FMAC4 soap_out_int(struct soap *soap, const char *tag, int id, const int *a, const char *type) { (void)soap; (void)type; (void)tag; (void)id; return soap_outint(soap, tag, id, a, type, SOAP_TYPE_int); } SOAP_FMAC3 int * SOAP_FMAC4 soap_in_int(struct soap *soap, const char *tag, int *a, const char *type) { int *p; p = soap_inint(soap, tag, a, type, SOAP_TYPE_int); return p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_int(struct soap *soap, const int *a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_int); if (soap_out_int(soap, tag?tag:"int", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 int * SOAP_FMAC4 soap_get_int(struct soap *soap, int *p, const char *tag, const char *type) { if ((p = soap_in_int(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC3 void SOAP_FMAC4 soap_default_std__string(struct soap *soap, std::string *p) { (void)soap; /* appease -Wall -Werror */ p->erase(); } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_std__string(struct soap *soap, const std::string *a) { (void)soap; (void)a; /* appease -Wall -Werror */ } SOAP_FMAC3 int SOAP_FMAC4 soap_out_std__string(struct soap *soap, const char *tag, int id, const std::string *s, const char *type) { if ((soap->mode & SOAP_C_NILSTRING) && s->empty()) return soap_element_null(soap, tag, id, type); if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, s, SOAP_TYPE_std__string), type) || soap_string_out(soap, s->c_str(), 0) || soap_element_end_out(soap, tag)) return soap->error; return SOAP_OK; } SOAP_FMAC3 std::string * SOAP_FMAC4 soap_in_std__string(struct soap *soap, const char *tag, std::string *s, const char *type) { (void)type; /* appease -Wall -Werror */ if (soap_element_begin_in(soap, tag, 1, NULL)) return NULL; if (!s) s = soap_new_std__string(soap, -1); if (soap->null) if (s) s->erase(); if (soap->body && !*soap->href) { char *t; s = (std::string*)soap_class_id_enter(soap, soap->id, s, SOAP_TYPE_std__string, sizeof(std::string), soap->type, soap->arrayType); if (s) { if (!(t = soap_string_in(soap, 1, 0, -1))) return NULL; s->assign(t); } } else s = (std::string*)soap_id_forward(soap, soap->href, soap_class_id_enter(soap, soap->id, s, SOAP_TYPE_std__string, sizeof(std::string), soap->type, soap->arrayType), 0, SOAP_TYPE_std__string, 0, sizeof(std::string), 0, soap_copy_std__string); if (soap->body && soap_element_end_in(soap, tag)) return NULL; return s; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_std__string(struct soap *soap, const std::string *a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_std__string); if (soap_out_std__string(soap, tag?tag:"string", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 std::string * SOAP_FMAC4 soap_get_std__string(struct soap *soap, std::string *p, const char *tag, const char *type) { if ((p = soap_in_std__string(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC1 std::string * SOAP_FMAC2 soap_instantiate_std__string(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size) { (void)type; (void)arrayType; /* appease -Wall -Werror */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_instantiate_std__string(%d, %s, %s)\n", n, type?type:"", arrayType?arrayType:"")); struct soap_clist *cp = soap_link(soap, NULL, SOAP_TYPE_std__string, n, soap_fdelete); if (!cp) return NULL; if (n < 0) { cp->ptr = (void*)SOAP_NEW(std::string); if (size) *size = sizeof(std::string); } else { cp->ptr = (void*)SOAP_NEW(std::string[n]); if (!cp->ptr) { soap->error = SOAP_EOM; return NULL; } if (size) *size = n * sizeof(std::string); } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Instantiated location=%p\n", cp->ptr)); return (std::string*)cp->ptr; } SOAP_FMAC3 void SOAP_FMAC4 soap_copy_std__string(struct soap *soap, int st, int tt, void *p, size_t len, const void *q, size_t n) { (void)soap; (void)tt; (void)st; (void)len; (void)n; /* appease -Wall -Werror */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copying std::string %p -> %p\n", q, p)); *(std::string*)p = *(std::string*)q; } void _ns1__GetGeoIPContextResponse::soap_default(struct soap *soap) { this->soap = soap; this->_ns1__GetGeoIPContextResponse::GetGeoIPContextResult = NULL; /* transient soap skipped */ } void _ns1__GetGeoIPContextResponse::soap_serialize(struct soap *soap) const { (void)soap; /* appease -Wall -Werror */ soap_serialize_PointerTons1__GeoIP(soap, &this->_ns1__GetGeoIPContextResponse::GetGeoIPContextResult); /* transient soap skipped */ } int _ns1__GetGeoIPContextResponse::soap_out(struct soap *soap, const char *tag, int id, const char *type) const { return soap_out__ns1__GetGeoIPContextResponse(soap, tag, id, this, type); } SOAP_FMAC3 int SOAP_FMAC4 soap_out__ns1__GetGeoIPContextResponse(struct soap *soap, const char *tag, int id, const _ns1__GetGeoIPContextResponse *a, const char *type) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE__ns1__GetGeoIPContextResponse), type)) return soap->error; if (a->GetGeoIPContextResult) soap_element_result(soap, "ns1:GetGeoIPContextResult"); if (soap_out_PointerTons1__GeoIP(soap, "ns1:GetGeoIPContextResult", -1, &(a->_ns1__GetGeoIPContextResponse::GetGeoIPContextResult), "")) return soap->error; /* transient soap skipped */ return soap_element_end_out(soap, tag); } void *_ns1__GetGeoIPContextResponse::soap_in(struct soap *soap, const char *tag, const char *type) { return soap_in__ns1__GetGeoIPContextResponse(soap, tag, this, type); } SOAP_FMAC3 _ns1__GetGeoIPContextResponse * SOAP_FMAC4 soap_in__ns1__GetGeoIPContextResponse(struct soap *soap, const char *tag, _ns1__GetGeoIPContextResponse *a, const char *type) { (void)type; /* appease -Wall -Werror */ if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; a = (_ns1__GetGeoIPContextResponse *)soap_class_id_enter(soap, soap->id, a, SOAP_TYPE__ns1__GetGeoIPContextResponse, sizeof(_ns1__GetGeoIPContextResponse), soap->type, soap->arrayType); if (!a) return NULL; if (soap->alloced) { a->soap_default(soap); if (soap->clist->type != SOAP_TYPE__ns1__GetGeoIPContextResponse) { soap_revert(soap); *soap->id = '\0'; return (_ns1__GetGeoIPContextResponse *)a->soap_in(soap, tag, type); } } size_t soap_flag_GetGeoIPContextResult1 = 1; if (soap->body && !*soap->href) { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_GetGeoIPContextResult1 && soap->error == SOAP_TAG_MISMATCH) if (soap_in_PointerTons1__GeoIP(soap, "ns1:GetGeoIPContextResult", &(a->_ns1__GetGeoIPContextResponse::GetGeoIPContextResult), "ns1:GeoIP")) { soap_flag_GetGeoIPContextResult1--; continue; } /* transient soap skipped */ soap_check_result(soap, "ns1:GetGeoIPContextResult"); if (soap->error == SOAP_TAG_MISMATCH) soap->error = soap_ignore_element(soap); if (soap->error == SOAP_NO_TAG) break; if (soap->error) return NULL; } if (soap_element_end_in(soap, tag)) return NULL; } else { a = (_ns1__GetGeoIPContextResponse *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE__ns1__GetGeoIPContextResponse, 0, sizeof(_ns1__GetGeoIPContextResponse), 0, soap_copy__ns1__GetGeoIPContextResponse); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } int _ns1__GetGeoIPContextResponse::soap_put(struct soap *soap, const char *tag, const char *type) const { register int id = soap_embed(soap, (void*)this, NULL, 0, tag, SOAP_TYPE__ns1__GetGeoIPContextResponse); if (this->soap_out(soap, tag?tag:"ns1:GetGeoIPContextResponse", id, type)) return soap->error; return soap_putindependent(soap); } void *_ns1__GetGeoIPContextResponse::soap_get(struct soap *soap, const char *tag, const char *type) { return soap_get__ns1__GetGeoIPContextResponse(soap, this, tag, type); } SOAP_FMAC3 _ns1__GetGeoIPContextResponse * SOAP_FMAC4 soap_get__ns1__GetGeoIPContextResponse(struct soap *soap, _ns1__GetGeoIPContextResponse *p, const char *tag, const char *type) { if ((p = soap_in__ns1__GetGeoIPContextResponse(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC1 _ns1__GetGeoIPContextResponse * SOAP_FMAC2 soap_instantiate__ns1__GetGeoIPContextResponse(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size) { (void)type; (void)arrayType; /* appease -Wall -Werror */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_instantiate__ns1__GetGeoIPContextResponse(%d, %s, %s)\n", n, type?type:"", arrayType?arrayType:"")); struct soap_clist *cp = soap_link(soap, NULL, SOAP_TYPE__ns1__GetGeoIPContextResponse, n, soap_fdelete); if (!cp) return NULL; if (n < 0) { cp->ptr = (void*)SOAP_NEW(_ns1__GetGeoIPContextResponse); if (size) *size = sizeof(_ns1__GetGeoIPContextResponse); ((_ns1__GetGeoIPContextResponse*)cp->ptr)->soap = soap; } else { cp->ptr = (void*)SOAP_NEW(_ns1__GetGeoIPContextResponse[n]); if (!cp->ptr) { soap->error = SOAP_EOM; return NULL; } if (size) *size = n * sizeof(_ns1__GetGeoIPContextResponse); for (int i = 0; i < n; i++) ((_ns1__GetGeoIPContextResponse*)cp->ptr)[i].soap = soap; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Instantiated location=%p\n", cp->ptr)); return (_ns1__GetGeoIPContextResponse*)cp->ptr; } SOAP_FMAC3 void SOAP_FMAC4 soap_copy__ns1__GetGeoIPContextResponse(struct soap *soap, int st, int tt, void *p, size_t len, const void *q, size_t n) { (void)soap; (void)tt; (void)st; (void)len; (void)n; /* appease -Wall -Werror */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copying _ns1__GetGeoIPContextResponse %p -> %p\n", q, p)); *(_ns1__GetGeoIPContextResponse*)p = *(_ns1__GetGeoIPContextResponse*)q; } void _ns1__GetGeoIPContext::soap_default(struct soap *soap) { this->soap = soap; /* transient soap skipped */ } void _ns1__GetGeoIPContext::soap_serialize(struct soap *soap) const { (void)soap; /* appease -Wall -Werror */ /* transient soap skipped */ } int _ns1__GetGeoIPContext::soap_out(struct soap *soap, const char *tag, int id, const char *type) const { return soap_out__ns1__GetGeoIPContext(soap, tag, id, this, type); } SOAP_FMAC3 int SOAP_FMAC4 soap_out__ns1__GetGeoIPContext(struct soap *soap, const char *tag, int id, const _ns1__GetGeoIPContext *a, const char *type) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE__ns1__GetGeoIPContext), type)) return soap->error; /* transient soap skipped */ return soap_element_end_out(soap, tag); } void *_ns1__GetGeoIPContext::soap_in(struct soap *soap, const char *tag, const char *type) { return soap_in__ns1__GetGeoIPContext(soap, tag, this, type); } SOAP_FMAC3 _ns1__GetGeoIPContext * SOAP_FMAC4 soap_in__ns1__GetGeoIPContext(struct soap *soap, const char *tag, _ns1__GetGeoIPContext *a, const char *type) { (void)type; /* appease -Wall -Werror */ if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; a = (_ns1__GetGeoIPContext *)soap_class_id_enter(soap, soap->id, a, SOAP_TYPE__ns1__GetGeoIPContext, sizeof(_ns1__GetGeoIPContext), soap->type, soap->arrayType); if (!a) return NULL; if (soap->alloced) { a->soap_default(soap); if (soap->clist->type != SOAP_TYPE__ns1__GetGeoIPContext) { soap_revert(soap); *soap->id = '\0'; return (_ns1__GetGeoIPContext *)a->soap_in(soap, tag, type); } } if (soap->body && !*soap->href) { for (;;) { soap->error = SOAP_TAG_MISMATCH; /* transient soap skipped */ if (soap->error == SOAP_TAG_MISMATCH) soap->error = soap_ignore_element(soap); if (soap->error == SOAP_NO_TAG) break; if (soap->error) return NULL; } if (soap_element_end_in(soap, tag)) return NULL; } else { a = (_ns1__GetGeoIPContext *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE__ns1__GetGeoIPContext, 0, sizeof(_ns1__GetGeoIPContext), 0, soap_copy__ns1__GetGeoIPContext); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } int _ns1__GetGeoIPContext::soap_put(struct soap *soap, const char *tag, const char *type) const { register int id = soap_embed(soap, (void*)this, NULL, 0, tag, SOAP_TYPE__ns1__GetGeoIPContext); if (this->soap_out(soap, tag?tag:"ns1:GetGeoIPContext", id, type)) return soap->error; return soap_putindependent(soap); } void *_ns1__GetGeoIPContext::soap_get(struct soap *soap, const char *tag, const char *type) { return soap_get__ns1__GetGeoIPContext(soap, this, tag, type); } SOAP_FMAC3 _ns1__GetGeoIPContext * SOAP_FMAC4 soap_get__ns1__GetGeoIPContext(struct soap *soap, _ns1__GetGeoIPContext *p, const char *tag, const char *type) { if ((p = soap_in__ns1__GetGeoIPContext(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC1 _ns1__GetGeoIPContext * SOAP_FMAC2 soap_instantiate__ns1__GetGeoIPContext(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size) { (void)type; (void)arrayType; /* appease -Wall -Werror */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_instantiate__ns1__GetGeoIPContext(%d, %s, %s)\n", n, type?type:"", arrayType?arrayType:"")); struct soap_clist *cp = soap_link(soap, NULL, SOAP_TYPE__ns1__GetGeoIPContext, n, soap_fdelete); if (!cp) return NULL; if (n < 0) { cp->ptr = (void*)SOAP_NEW(_ns1__GetGeoIPContext); if (size) *size = sizeof(_ns1__GetGeoIPContext); ((_ns1__GetGeoIPContext*)cp->ptr)->soap = soap; } else { cp->ptr = (void*)SOAP_NEW(_ns1__GetGeoIPContext[n]); if (!cp->ptr) { soap->error = SOAP_EOM; return NULL; } if (size) *size = n * sizeof(_ns1__GetGeoIPContext); for (int i = 0; i < n; i++) ((_ns1__GetGeoIPContext*)cp->ptr)[i].soap = soap; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Instantiated location=%p\n", cp->ptr)); return (_ns1__GetGeoIPContext*)cp->ptr; } SOAP_FMAC3 void SOAP_FMAC4 soap_copy__ns1__GetGeoIPContext(struct soap *soap, int st, int tt, void *p, size_t len, const void *q, size_t n) { (void)soap; (void)tt; (void)st; (void)len; (void)n; /* appease -Wall -Werror */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copying _ns1__GetGeoIPContext %p -> %p\n", q, p)); *(_ns1__GetGeoIPContext*)p = *(_ns1__GetGeoIPContext*)q; } void _ns1__GetGeoIPResponse::soap_default(struct soap *soap) { this->soap = soap; this->_ns1__GetGeoIPResponse::GetGeoIPResult = NULL; /* transient soap skipped */ } void _ns1__GetGeoIPResponse::soap_serialize(struct soap *soap) const { (void)soap; /* appease -Wall -Werror */ soap_serialize_PointerTons1__GeoIP(soap, &this->_ns1__GetGeoIPResponse::GetGeoIPResult); /* transient soap skipped */ } int _ns1__GetGeoIPResponse::soap_out(struct soap *soap, const char *tag, int id, const char *type) const { return soap_out__ns1__GetGeoIPResponse(soap, tag, id, this, type); } SOAP_FMAC3 int SOAP_FMAC4 soap_out__ns1__GetGeoIPResponse(struct soap *soap, const char *tag, int id, const _ns1__GetGeoIPResponse *a, const char *type) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE__ns1__GetGeoIPResponse), type)) return soap->error; if (a->GetGeoIPResult) soap_element_result(soap, "ns1:GetGeoIPResult"); if (soap_out_PointerTons1__GeoIP(soap, "ns1:GetGeoIPResult", -1, &(a->_ns1__GetGeoIPResponse::GetGeoIPResult), "")) return soap->error; /* transient soap skipped */ return soap_element_end_out(soap, tag); } void *_ns1__GetGeoIPResponse::soap_in(struct soap *soap, const char *tag, const char *type) { return soap_in__ns1__GetGeoIPResponse(soap, tag, this, type); } SOAP_FMAC3 _ns1__GetGeoIPResponse * SOAP_FMAC4 soap_in__ns1__GetGeoIPResponse(struct soap *soap, const char *tag, _ns1__GetGeoIPResponse *a, const char *type) { (void)type; /* appease -Wall -Werror */ if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; a = (_ns1__GetGeoIPResponse *)soap_class_id_enter(soap, soap->id, a, SOAP_TYPE__ns1__GetGeoIPResponse, sizeof(_ns1__GetGeoIPResponse), soap->type, soap->arrayType); if (!a) return NULL; if (soap->alloced) { a->soap_default(soap); if (soap->clist->type != SOAP_TYPE__ns1__GetGeoIPResponse) { soap_revert(soap); *soap->id = '\0'; return (_ns1__GetGeoIPResponse *)a->soap_in(soap, tag, type); } } size_t soap_flag_GetGeoIPResult1 = 1; if (soap->body && !*soap->href) { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_GetGeoIPResult1 && soap->error == SOAP_TAG_MISMATCH) if (soap_in_PointerTons1__GeoIP(soap, "ns1:GetGeoIPResult", &(a->_ns1__GetGeoIPResponse::GetGeoIPResult), "ns1:GeoIP")) { soap_flag_GetGeoIPResult1--; continue; } /* transient soap skipped */ soap_check_result(soap, "ns1:GetGeoIPResult"); if (soap->error == SOAP_TAG_MISMATCH) soap->error = soap_ignore_element(soap); if (soap->error == SOAP_NO_TAG) break; if (soap->error) return NULL; } if (soap_element_end_in(soap, tag)) return NULL; } else { a = (_ns1__GetGeoIPResponse *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE__ns1__GetGeoIPResponse, 0, sizeof(_ns1__GetGeoIPResponse), 0, soap_copy__ns1__GetGeoIPResponse); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } int _ns1__GetGeoIPResponse::soap_put(struct soap *soap, const char *tag, const char *type) const { register int id = soap_embed(soap, (void*)this, NULL, 0, tag, SOAP_TYPE__ns1__GetGeoIPResponse); if (this->soap_out(soap, tag?tag:"ns1:GetGeoIPResponse", id, type)) return soap->error; return soap_putindependent(soap); } void *_ns1__GetGeoIPResponse::soap_get(struct soap *soap, const char *tag, const char *type) { return soap_get__ns1__GetGeoIPResponse(soap, this, tag, type); } SOAP_FMAC3 _ns1__GetGeoIPResponse * SOAP_FMAC4 soap_get__ns1__GetGeoIPResponse(struct soap *soap, _ns1__GetGeoIPResponse *p, const char *tag, const char *type) { if ((p = soap_in__ns1__GetGeoIPResponse(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC1 _ns1__GetGeoIPResponse * SOAP_FMAC2 soap_instantiate__ns1__GetGeoIPResponse(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size) { (void)type; (void)arrayType; /* appease -Wall -Werror */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_instantiate__ns1__GetGeoIPResponse(%d, %s, %s)\n", n, type?type:"", arrayType?arrayType:"")); struct soap_clist *cp = soap_link(soap, NULL, SOAP_TYPE__ns1__GetGeoIPResponse, n, soap_fdelete); if (!cp) return NULL; if (n < 0) { cp->ptr = (void*)SOAP_NEW(_ns1__GetGeoIPResponse); if (size) *size = sizeof(_ns1__GetGeoIPResponse); ((_ns1__GetGeoIPResponse*)cp->ptr)->soap = soap; } else { cp->ptr = (void*)SOAP_NEW(_ns1__GetGeoIPResponse[n]); if (!cp->ptr) { soap->error = SOAP_EOM; return NULL; } if (size) *size = n * sizeof(_ns1__GetGeoIPResponse); for (int i = 0; i < n; i++) ((_ns1__GetGeoIPResponse*)cp->ptr)[i].soap = soap; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Instantiated location=%p\n", cp->ptr)); return (_ns1__GetGeoIPResponse*)cp->ptr; } SOAP_FMAC3 void SOAP_FMAC4 soap_copy__ns1__GetGeoIPResponse(struct soap *soap, int st, int tt, void *p, size_t len, const void *q, size_t n) { (void)soap; (void)tt; (void)st; (void)len; (void)n; /* appease -Wall -Werror */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copying _ns1__GetGeoIPResponse %p -> %p\n", q, p)); *(_ns1__GetGeoIPResponse*)p = *(_ns1__GetGeoIPResponse*)q; } void _ns1__GetGeoIP::soap_default(struct soap *soap) { this->soap = soap; this->_ns1__GetGeoIP::IPAddress = NULL; /* transient soap skipped */ } void _ns1__GetGeoIP::soap_serialize(struct soap *soap) const { (void)soap; /* appease -Wall -Werror */ soap_serialize_PointerTostd__string(soap, &this->_ns1__GetGeoIP::IPAddress); /* transient soap skipped */ } int _ns1__GetGeoIP::soap_out(struct soap *soap, const char *tag, int id, const char *type) const { return soap_out__ns1__GetGeoIP(soap, tag, id, this, type); } SOAP_FMAC3 int SOAP_FMAC4 soap_out__ns1__GetGeoIP(struct soap *soap, const char *tag, int id, const _ns1__GetGeoIP *a, const char *type) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE__ns1__GetGeoIP), type)) return soap->error; if (soap_out_PointerTostd__string(soap, "ns1:IPAddress", -1, &(a->_ns1__GetGeoIP::IPAddress), "")) return soap->error; /* transient soap skipped */ return soap_element_end_out(soap, tag); } void *_ns1__GetGeoIP::soap_in(struct soap *soap, const char *tag, const char *type) { return soap_in__ns1__GetGeoIP(soap, tag, this, type); } SOAP_FMAC3 _ns1__GetGeoIP * SOAP_FMAC4 soap_in__ns1__GetGeoIP(struct soap *soap, const char *tag, _ns1__GetGeoIP *a, const char *type) { (void)type; /* appease -Wall -Werror */ if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; a = (_ns1__GetGeoIP *)soap_class_id_enter(soap, soap->id, a, SOAP_TYPE__ns1__GetGeoIP, sizeof(_ns1__GetGeoIP), soap->type, soap->arrayType); if (!a) return NULL; if (soap->alloced) { a->soap_default(soap); if (soap->clist->type != SOAP_TYPE__ns1__GetGeoIP) { soap_revert(soap); *soap->id = '\0'; return (_ns1__GetGeoIP *)a->soap_in(soap, tag, type); } } size_t soap_flag_IPAddress1 = 1; if (soap->body && !*soap->href) { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_IPAddress1 && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) if (soap_in_PointerTostd__string(soap, "ns1:IPAddress", &(a->_ns1__GetGeoIP::IPAddress), "xsd:string")) { soap_flag_IPAddress1--; continue; } /* transient soap skipped */ if (soap->error == SOAP_TAG_MISMATCH) soap->error = soap_ignore_element(soap); if (soap->error == SOAP_NO_TAG) break; if (soap->error) return NULL; } if (soap_element_end_in(soap, tag)) return NULL; } else { a = (_ns1__GetGeoIP *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE__ns1__GetGeoIP, 0, sizeof(_ns1__GetGeoIP), 0, soap_copy__ns1__GetGeoIP); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } int _ns1__GetGeoIP::soap_put(struct soap *soap, const char *tag, const char *type) const { register int id = soap_embed(soap, (void*)this, NULL, 0, tag, SOAP_TYPE__ns1__GetGeoIP); if (this->soap_out(soap, tag?tag:"ns1:GetGeoIP", id, type)) return soap->error; return soap_putindependent(soap); } void *_ns1__GetGeoIP::soap_get(struct soap *soap, const char *tag, const char *type) { return soap_get__ns1__GetGeoIP(soap, this, tag, type); } SOAP_FMAC3 _ns1__GetGeoIP * SOAP_FMAC4 soap_get__ns1__GetGeoIP(struct soap *soap, _ns1__GetGeoIP *p, const char *tag, const char *type) { if ((p = soap_in__ns1__GetGeoIP(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC1 _ns1__GetGeoIP * SOAP_FMAC2 soap_instantiate__ns1__GetGeoIP(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size) { (void)type; (void)arrayType; /* appease -Wall -Werror */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_instantiate__ns1__GetGeoIP(%d, %s, %s)\n", n, type?type:"", arrayType?arrayType:"")); struct soap_clist *cp = soap_link(soap, NULL, SOAP_TYPE__ns1__GetGeoIP, n, soap_fdelete); if (!cp) return NULL; if (n < 0) { cp->ptr = (void*)SOAP_NEW(_ns1__GetGeoIP); if (size) *size = sizeof(_ns1__GetGeoIP); ((_ns1__GetGeoIP*)cp->ptr)->soap = soap; } else { cp->ptr = (void*)SOAP_NEW(_ns1__GetGeoIP[n]); if (!cp->ptr) { soap->error = SOAP_EOM; return NULL; } if (size) *size = n * sizeof(_ns1__GetGeoIP); for (int i = 0; i < n; i++) ((_ns1__GetGeoIP*)cp->ptr)[i].soap = soap; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Instantiated location=%p\n", cp->ptr)); return (_ns1__GetGeoIP*)cp->ptr; } SOAP_FMAC3 void SOAP_FMAC4 soap_copy__ns1__GetGeoIP(struct soap *soap, int st, int tt, void *p, size_t len, const void *q, size_t n) { (void)soap; (void)tt; (void)st; (void)len; (void)n; /* appease -Wall -Werror */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copying _ns1__GetGeoIP %p -> %p\n", q, p)); *(_ns1__GetGeoIP*)p = *(_ns1__GetGeoIP*)q; } void ns1__GeoIP::soap_default(struct soap *soap) { this->soap = soap; soap_default_int(soap, &this->ns1__GeoIP::ReturnCode); this->ns1__GeoIP::IP = NULL; this->ns1__GeoIP::ReturnCodeDetails = NULL; this->ns1__GeoIP::CountryName = NULL; this->ns1__GeoIP::CountryCode = NULL; /* transient soap skipped */ } void ns1__GeoIP::soap_serialize(struct soap *soap) const { (void)soap; /* appease -Wall -Werror */ soap_serialize_PointerTostd__string(soap, &this->ns1__GeoIP::IP); soap_serialize_PointerTostd__string(soap, &this->ns1__GeoIP::ReturnCodeDetails); soap_serialize_PointerTostd__string(soap, &this->ns1__GeoIP::CountryName); soap_serialize_PointerTostd__string(soap, &this->ns1__GeoIP::CountryCode); /* transient soap skipped */ } int ns1__GeoIP::soap_out(struct soap *soap, const char *tag, int id, const char *type) const { return soap_out_ns1__GeoIP(soap, tag, id, this, type); } SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns1__GeoIP(struct soap *soap, const char *tag, int id, const ns1__GeoIP *a, const char *type) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns1__GeoIP), type)) return soap->error; if (soap_out_int(soap, "ns1:ReturnCode", -1, &(a->ns1__GeoIP::ReturnCode), "")) return soap->error; if (soap_out_PointerTostd__string(soap, "ns1:IP", -1, &(a->ns1__GeoIP::IP), "")) return soap->error; if (soap_out_PointerTostd__string(soap, "ns1:ReturnCodeDetails", -1, &(a->ns1__GeoIP::ReturnCodeDetails), "")) return soap->error; if (soap_out_PointerTostd__string(soap, "ns1:CountryName", -1, &(a->ns1__GeoIP::CountryName), "")) return soap->error; if (soap_out_PointerTostd__string(soap, "ns1:CountryCode", -1, &(a->ns1__GeoIP::CountryCode), "")) return soap->error; /* transient soap skipped */ return soap_element_end_out(soap, tag); } void *ns1__GeoIP::soap_in(struct soap *soap, const char *tag, const char *type) { return soap_in_ns1__GeoIP(soap, tag, this, type); } SOAP_FMAC3 ns1__GeoIP * SOAP_FMAC4 soap_in_ns1__GeoIP(struct soap *soap, const char *tag, ns1__GeoIP *a, const char *type) { (void)type; /* appease -Wall -Werror */ if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; a = (ns1__GeoIP *)soap_class_id_enter(soap, soap->id, a, SOAP_TYPE_ns1__GeoIP, sizeof(ns1__GeoIP), soap->type, soap->arrayType); if (!a) return NULL; if (soap->alloced) { a->soap_default(soap); if (soap->clist->type != SOAP_TYPE_ns1__GeoIP) { soap_revert(soap); *soap->id = '\0'; return (ns1__GeoIP *)a->soap_in(soap, tag, type); } } size_t soap_flag_ReturnCode1 = 1; size_t soap_flag_IP1 = 1; size_t soap_flag_ReturnCodeDetails1 = 1; size_t soap_flag_CountryName1 = 1; size_t soap_flag_CountryCode1 = 1; if (soap->body && !*soap->href) { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_ReturnCode1 && soap->error == SOAP_TAG_MISMATCH) if (soap_in_int(soap, "ns1:ReturnCode", &(a->ns1__GeoIP::ReturnCode), "xsd:int")) { soap_flag_ReturnCode1--; continue; } if (soap_flag_IP1 && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) if (soap_in_PointerTostd__string(soap, "ns1:IP", &(a->ns1__GeoIP::IP), "xsd:string")) { soap_flag_IP1--; continue; } if (soap_flag_ReturnCodeDetails1 && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) if (soap_in_PointerTostd__string(soap, "ns1:ReturnCodeDetails", &(a->ns1__GeoIP::ReturnCodeDetails), "xsd:string")) { soap_flag_ReturnCodeDetails1--; continue; } if (soap_flag_CountryName1 && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) if (soap_in_PointerTostd__string(soap, "ns1:CountryName", &(a->ns1__GeoIP::CountryName), "xsd:string")) { soap_flag_CountryName1--; continue; } if (soap_flag_CountryCode1 && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) if (soap_in_PointerTostd__string(soap, "ns1:CountryCode", &(a->ns1__GeoIP::CountryCode), "xsd:string")) { soap_flag_CountryCode1--; continue; } /* transient soap skipped */ if (soap->error == SOAP_TAG_MISMATCH) soap->error = soap_ignore_element(soap); if (soap->error == SOAP_NO_TAG) break; if (soap->error) return NULL; } if (soap_element_end_in(soap, tag)) return NULL; } else { a = (ns1__GeoIP *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns1__GeoIP, 0, sizeof(ns1__GeoIP), 0, soap_copy_ns1__GeoIP); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_ReturnCode1 > 0)) { soap->error = SOAP_OCCURS; return NULL; } return a; } int ns1__GeoIP::soap_put(struct soap *soap, const char *tag, const char *type) const { register int id = soap_embed(soap, (void*)this, NULL, 0, tag, SOAP_TYPE_ns1__GeoIP); if (this->soap_out(soap, tag?tag:"ns1:GeoIP", id, type)) return soap->error; return soap_putindependent(soap); } void *ns1__GeoIP::soap_get(struct soap *soap, const char *tag, const char *type) { return soap_get_ns1__GeoIP(soap, this, tag, type); } SOAP_FMAC3 ns1__GeoIP * SOAP_FMAC4 soap_get_ns1__GeoIP(struct soap *soap, ns1__GeoIP *p, const char *tag, const char *type) { if ((p = soap_in_ns1__GeoIP(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC1 ns1__GeoIP * SOAP_FMAC2 soap_instantiate_ns1__GeoIP(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size) { (void)type; (void)arrayType; /* appease -Wall -Werror */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_instantiate_ns1__GeoIP(%d, %s, %s)\n", n, type?type:"", arrayType?arrayType:"")); struct soap_clist *cp = soap_link(soap, NULL, SOAP_TYPE_ns1__GeoIP, n, soap_fdelete); if (!cp) return NULL; if (n < 0) { cp->ptr = (void*)SOAP_NEW(ns1__GeoIP); if (size) *size = sizeof(ns1__GeoIP); ((ns1__GeoIP*)cp->ptr)->soap = soap; } else { cp->ptr = (void*)SOAP_NEW(ns1__GeoIP[n]); if (!cp->ptr) { soap->error = SOAP_EOM; return NULL; } if (size) *size = n * sizeof(ns1__GeoIP); for (int i = 0; i < n; i++) ((ns1__GeoIP*)cp->ptr)[i].soap = soap; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Instantiated location=%p\n", cp->ptr)); return (ns1__GeoIP*)cp->ptr; } SOAP_FMAC3 void SOAP_FMAC4 soap_copy_ns1__GeoIP(struct soap *soap, int st, int tt, void *p, size_t len, const void *q, size_t n) { (void)soap; (void)tt; (void)st; (void)len; (void)n; /* appease -Wall -Werror */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copying ns1__GeoIP %p -> %p\n", q, p)); *(ns1__GeoIP*)p = *(ns1__GeoIP*)q; } #ifndef WITH_NOGLOBAL SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Fault(struct soap *soap, struct SOAP_ENV__Fault *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_default__QName(soap, &a->faultcode); soap_default_string(soap, &a->faultstring); soap_default_string(soap, &a->faultactor); a->detail = NULL; a->SOAP_ENV__Code = NULL; a->SOAP_ENV__Reason = NULL; soap_default_string(soap, &a->SOAP_ENV__Node); soap_default_string(soap, &a->SOAP_ENV__Role); a->SOAP_ENV__Detail = NULL; } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Fault(struct soap *soap, const struct SOAP_ENV__Fault *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_serialize__QName(soap, &a->faultcode); soap_serialize_string(soap, &a->faultstring); soap_serialize_string(soap, &a->faultactor); soap_serialize_PointerToSOAP_ENV__Detail(soap, &a->detail); soap_serialize_PointerToSOAP_ENV__Code(soap, &a->SOAP_ENV__Code); soap_serialize_PointerToSOAP_ENV__Reason(soap, &a->SOAP_ENV__Reason); soap_serialize_string(soap, &a->SOAP_ENV__Node); soap_serialize_string(soap, &a->SOAP_ENV__Role); soap_serialize_PointerToSOAP_ENV__Detail(soap, &a->SOAP_ENV__Detail); } SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Fault(struct soap *soap, const char *tag, int id, const struct SOAP_ENV__Fault *a, const char *type) { const char *soap_tmp_faultcode = soap_QName2s(soap, a->faultcode); (void)soap; (void)tag; (void)id; (void)type; if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_SOAP_ENV__Fault), type)) return soap->error; if (soap_out__QName(soap, "faultcode", -1, (char*const*)&soap_tmp_faultcode, "")) return soap->error; if (soap_out_string(soap, "faultstring", -1, &a->faultstring, "")) return soap->error; if (soap_out_string(soap, "faultactor", -1, &a->faultactor, "")) return soap->error; if (soap_out_PointerToSOAP_ENV__Detail(soap, "detail", -1, &a->detail, "")) return soap->error; if (soap_out_PointerToSOAP_ENV__Code(soap, "SOAP-ENV:Code", -1, &a->SOAP_ENV__Code, "")) return soap->error; if (soap_out_PointerToSOAP_ENV__Reason(soap, "SOAP-ENV:Reason", -1, &a->SOAP_ENV__Reason, "")) return soap->error; if (soap_out_string(soap, "SOAP-ENV:Node", -1, &a->SOAP_ENV__Node, "")) return soap->error; if (soap_out_string(soap, "SOAP-ENV:Role", -1, &a->SOAP_ENV__Role, "")) return soap->error; if (soap_out_PointerToSOAP_ENV__Detail(soap, "SOAP-ENV:Detail", -1, &a->SOAP_ENV__Detail, "")) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct SOAP_ENV__Fault * SOAP_FMAC4 soap_in_SOAP_ENV__Fault(struct soap *soap, const char *tag, struct SOAP_ENV__Fault *a, const char *type) { size_t soap_flag_faultcode = 1; size_t soap_flag_faultstring = 1; size_t soap_flag_faultactor = 1; size_t soap_flag_detail = 1; size_t soap_flag_SOAP_ENV__Code = 1; size_t soap_flag_SOAP_ENV__Reason = 1; size_t soap_flag_SOAP_ENV__Node = 1; size_t soap_flag_SOAP_ENV__Role = 1; size_t soap_flag_SOAP_ENV__Detail = 1; if (soap_element_begin_in(soap, tag, 0, type)) return NULL; a = (struct SOAP_ENV__Fault *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_SOAP_ENV__Fault, sizeof(struct SOAP_ENV__Fault), 0, NULL, NULL, NULL); if (!a) return NULL; soap_default_SOAP_ENV__Fault(soap, a); if (soap->body && !*soap->href) { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_faultcode && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) if (soap_in__QName(soap, "faultcode", &a->faultcode, "")) { soap_flag_faultcode--; continue; } if (soap_flag_faultstring && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) if (soap_in_string(soap, "faultstring", &a->faultstring, "xsd:string")) { soap_flag_faultstring--; continue; } if (soap_flag_faultactor && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) if (soap_in_string(soap, "faultactor", &a->faultactor, "xsd:string")) { soap_flag_faultactor--; continue; } if (soap_flag_detail && soap->error == SOAP_TAG_MISMATCH) if (soap_in_PointerToSOAP_ENV__Detail(soap, "detail", &a->detail, "")) { soap_flag_detail--; continue; } if (soap_flag_SOAP_ENV__Code && soap->error == SOAP_TAG_MISMATCH) if (soap_in_PointerToSOAP_ENV__Code(soap, "SOAP-ENV:Code", &a->SOAP_ENV__Code, "")) { soap_flag_SOAP_ENV__Code--; continue; } if (soap_flag_SOAP_ENV__Reason && soap->error == SOAP_TAG_MISMATCH) if (soap_in_PointerToSOAP_ENV__Reason(soap, "SOAP-ENV:Reason", &a->SOAP_ENV__Reason, "")) { soap_flag_SOAP_ENV__Reason--; continue; } if (soap_flag_SOAP_ENV__Node && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) if (soap_in_string(soap, "SOAP-ENV:Node", &a->SOAP_ENV__Node, "xsd:string")) { soap_flag_SOAP_ENV__Node--; continue; } if (soap_flag_SOAP_ENV__Role && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) if (soap_in_string(soap, "SOAP-ENV:Role", &a->SOAP_ENV__Role, "xsd:string")) { soap_flag_SOAP_ENV__Role--; continue; } if (soap_flag_SOAP_ENV__Detail && soap->error == SOAP_TAG_MISMATCH) if (soap_in_PointerToSOAP_ENV__Detail(soap, "SOAP-ENV:Detail", &a->SOAP_ENV__Detail, "")) { soap_flag_SOAP_ENV__Detail--; continue; } if (soap->error == SOAP_TAG_MISMATCH) soap->error = soap_ignore_element(soap); if (soap->error == SOAP_NO_TAG) break; if (soap->error) return NULL; } if (soap_element_end_in(soap, tag)) return NULL; } else { a = (struct SOAP_ENV__Fault *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_SOAP_ENV__Fault, 0, sizeof(struct SOAP_ENV__Fault), 0, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Fault(struct soap *soap, const struct SOAP_ENV__Fault *a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_SOAP_ENV__Fault); if (soap_out_SOAP_ENV__Fault(soap, tag?tag:"SOAP-ENV:Fault", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct SOAP_ENV__Fault * SOAP_FMAC4 soap_get_SOAP_ENV__Fault(struct soap *soap, struct SOAP_ENV__Fault *p, const char *tag, const char *type) { if ((p = soap_in_SOAP_ENV__Fault(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC1 struct SOAP_ENV__Fault * SOAP_FMAC2 soap_instantiate_SOAP_ENV__Fault(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size) { (void)type; (void)arrayType; /* appease -Wall -Werror */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_instantiate_SOAP_ENV__Fault(%d, %s, %s)\n", n, type?type:"", arrayType?arrayType:"")); struct soap_clist *cp = soap_link(soap, NULL, SOAP_TYPE_SOAP_ENV__Fault, n, soap_fdelete); if (!cp) return NULL; if (n < 0) { cp->ptr = (void*)SOAP_NEW(struct SOAP_ENV__Fault); if (size) *size = sizeof(struct SOAP_ENV__Fault); } else { cp->ptr = (void*)SOAP_NEW(struct SOAP_ENV__Fault[n]); if (!cp->ptr) { soap->error = SOAP_EOM; return NULL; } if (size) *size = n * sizeof(struct SOAP_ENV__Fault); } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Instantiated location=%p\n", cp->ptr)); return (struct SOAP_ENV__Fault*)cp->ptr; } SOAP_FMAC3 void SOAP_FMAC4 soap_copy_SOAP_ENV__Fault(struct soap *soap, int st, int tt, void *p, size_t len, const void *q, size_t n) { (void)soap; (void)tt; (void)st; (void)len; (void)n; /* appease -Wall -Werror */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copying struct SOAP_ENV__Fault %p -> %p\n", q, p)); *(struct SOAP_ENV__Fault*)p = *(struct SOAP_ENV__Fault*)q; } #endif #ifndef WITH_NOGLOBAL SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Reason(struct soap *soap, struct SOAP_ENV__Reason *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_default_string(soap, &a->SOAP_ENV__Text); } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Reason(struct soap *soap, const struct SOAP_ENV__Reason *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_serialize_string(soap, &a->SOAP_ENV__Text); } SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Reason(struct soap *soap, const char *tag, int id, const struct SOAP_ENV__Reason *a, const char *type) { (void)soap; (void)tag; (void)id; (void)type; if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_SOAP_ENV__Reason), type)) return soap->error; if (soap->lang) soap_set_attr(soap, "xml:lang", soap->lang, 1); if (soap_out_string(soap, "SOAP-ENV:Text", -1, &a->SOAP_ENV__Text, "")) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct SOAP_ENV__Reason * SOAP_FMAC4 soap_in_SOAP_ENV__Reason(struct soap *soap, const char *tag, struct SOAP_ENV__Reason *a, const char *type) { size_t soap_flag_SOAP_ENV__Text = 1; if (soap_element_begin_in(soap, tag, 0, type)) return NULL; a = (struct SOAP_ENV__Reason *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_SOAP_ENV__Reason, sizeof(struct SOAP_ENV__Reason), 0, NULL, NULL, NULL); if (!a) return NULL; soap_default_SOAP_ENV__Reason(soap, a); if (soap->body && !*soap->href) { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_SOAP_ENV__Text && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) if (soap_in_string(soap, "SOAP-ENV:Text", &a->SOAP_ENV__Text, "xsd:string")) { soap_flag_SOAP_ENV__Text--; continue; } if (soap->error == SOAP_TAG_MISMATCH) soap->error = soap_ignore_element(soap); if (soap->error == SOAP_NO_TAG) break; if (soap->error) return NULL; } if (soap_element_end_in(soap, tag)) return NULL; } else { a = (struct SOAP_ENV__Reason *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_SOAP_ENV__Reason, 0, sizeof(struct SOAP_ENV__Reason), 0, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Reason(struct soap *soap, const struct SOAP_ENV__Reason *a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_SOAP_ENV__Reason); if (soap_out_SOAP_ENV__Reason(soap, tag?tag:"SOAP-ENV:Reason", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct SOAP_ENV__Reason * SOAP_FMAC4 soap_get_SOAP_ENV__Reason(struct soap *soap, struct SOAP_ENV__Reason *p, const char *tag, const char *type) { if ((p = soap_in_SOAP_ENV__Reason(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC1 struct SOAP_ENV__Reason * SOAP_FMAC2 soap_instantiate_SOAP_ENV__Reason(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size) { (void)type; (void)arrayType; /* appease -Wall -Werror */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_instantiate_SOAP_ENV__Reason(%d, %s, %s)\n", n, type?type:"", arrayType?arrayType:"")); struct soap_clist *cp = soap_link(soap, NULL, SOAP_TYPE_SOAP_ENV__Reason, n, soap_fdelete); if (!cp) return NULL; if (n < 0) { cp->ptr = (void*)SOAP_NEW(struct SOAP_ENV__Reason); if (size) *size = sizeof(struct SOAP_ENV__Reason); } else { cp->ptr = (void*)SOAP_NEW(struct SOAP_ENV__Reason[n]); if (!cp->ptr) { soap->error = SOAP_EOM; return NULL; } if (size) *size = n * sizeof(struct SOAP_ENV__Reason); } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Instantiated location=%p\n", cp->ptr)); return (struct SOAP_ENV__Reason*)cp->ptr; } SOAP_FMAC3 void SOAP_FMAC4 soap_copy_SOAP_ENV__Reason(struct soap *soap, int st, int tt, void *p, size_t len, const void *q, size_t n) { (void)soap; (void)tt; (void)st; (void)len; (void)n; /* appease -Wall -Werror */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copying struct SOAP_ENV__Reason %p -> %p\n", q, p)); *(struct SOAP_ENV__Reason*)p = *(struct SOAP_ENV__Reason*)q; } #endif #ifndef WITH_NOGLOBAL SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Detail(struct soap *soap, struct SOAP_ENV__Detail *a) { (void)soap; (void)a; /* appease -Wall -Werror */ a->__any = NULL; a->__type = 0; a->fault = NULL; } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Detail(struct soap *soap, const struct SOAP_ENV__Detail *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_markelement(soap, a->fault, a->__type); } SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Detail(struct soap *soap, const char *tag, int id, const struct SOAP_ENV__Detail *a, const char *type) { (void)soap; (void)tag; (void)id; (void)type; if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_SOAP_ENV__Detail), type)) return soap->error; soap_outliteral(soap, "-any", &a->__any, NULL); if (soap_putelement(soap, a->fault, "fault", -1, a->__type)) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct SOAP_ENV__Detail * SOAP_FMAC4 soap_in_SOAP_ENV__Detail(struct soap *soap, const char *tag, struct SOAP_ENV__Detail *a, const char *type) { size_t soap_flag___any = 1; size_t soap_flag_fault = 1; if (soap_element_begin_in(soap, tag, 0, type)) return NULL; a = (struct SOAP_ENV__Detail *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_SOAP_ENV__Detail, sizeof(struct SOAP_ENV__Detail), 0, NULL, NULL, NULL); if (!a) return NULL; soap_default_SOAP_ENV__Detail(soap, a); if (soap->body && !*soap->href) { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_fault && soap->error == SOAP_TAG_MISMATCH) if ((a->fault = soap_getelement(soap, &a->__type))) { soap_flag_fault = 0; continue; } if (soap_flag___any && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) if (soap_inliteral(soap, "-any", &a->__any)) { soap_flag___any--; continue; } if (soap->error == SOAP_TAG_MISMATCH) soap->error = soap_ignore_element(soap); if (soap->error == SOAP_NO_TAG) break; if (soap->error) return NULL; } if (soap_element_end_in(soap, tag)) return NULL; } else { a = (struct SOAP_ENV__Detail *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_SOAP_ENV__Detail, 0, sizeof(struct SOAP_ENV__Detail), 0, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Detail(struct soap *soap, const struct SOAP_ENV__Detail *a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_SOAP_ENV__Detail); if (soap_out_SOAP_ENV__Detail(soap, tag?tag:"SOAP-ENV:Detail", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct SOAP_ENV__Detail * SOAP_FMAC4 soap_get_SOAP_ENV__Detail(struct soap *soap, struct SOAP_ENV__Detail *p, const char *tag, const char *type) { if ((p = soap_in_SOAP_ENV__Detail(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC1 struct SOAP_ENV__Detail * SOAP_FMAC2 soap_instantiate_SOAP_ENV__Detail(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size) { (void)type; (void)arrayType; /* appease -Wall -Werror */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_instantiate_SOAP_ENV__Detail(%d, %s, %s)\n", n, type?type:"", arrayType?arrayType:"")); struct soap_clist *cp = soap_link(soap, NULL, SOAP_TYPE_SOAP_ENV__Detail, n, soap_fdelete); if (!cp) return NULL; if (n < 0) { cp->ptr = (void*)SOAP_NEW(struct SOAP_ENV__Detail); if (size) *size = sizeof(struct SOAP_ENV__Detail); } else { cp->ptr = (void*)SOAP_NEW(struct SOAP_ENV__Detail[n]); if (!cp->ptr) { soap->error = SOAP_EOM; return NULL; } if (size) *size = n * sizeof(struct SOAP_ENV__Detail); } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Instantiated location=%p\n", cp->ptr)); return (struct SOAP_ENV__Detail*)cp->ptr; } SOAP_FMAC3 void SOAP_FMAC4 soap_copy_SOAP_ENV__Detail(struct soap *soap, int st, int tt, void *p, size_t len, const void *q, size_t n) { (void)soap; (void)tt; (void)st; (void)len; (void)n; /* appease -Wall -Werror */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copying struct SOAP_ENV__Detail %p -> %p\n", q, p)); *(struct SOAP_ENV__Detail*)p = *(struct SOAP_ENV__Detail*)q; } #endif #ifndef WITH_NOGLOBAL SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Code(struct soap *soap, struct SOAP_ENV__Code *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_default__QName(soap, &a->SOAP_ENV__Value); a->SOAP_ENV__Subcode = NULL; } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Code(struct soap *soap, const struct SOAP_ENV__Code *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_serialize__QName(soap, &a->SOAP_ENV__Value); soap_serialize_PointerToSOAP_ENV__Code(soap, &a->SOAP_ENV__Subcode); } SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Code(struct soap *soap, const char *tag, int id, const struct SOAP_ENV__Code *a, const char *type) { const char *soap_tmp_SOAP_ENV__Value = soap_QName2s(soap, a->SOAP_ENV__Value); (void)soap; (void)tag; (void)id; (void)type; if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_SOAP_ENV__Code), type)) return soap->error; if (soap_out__QName(soap, "SOAP-ENV:Value", -1, (char*const*)&soap_tmp_SOAP_ENV__Value, "")) return soap->error; if (soap_out_PointerToSOAP_ENV__Code(soap, "SOAP-ENV:Subcode", -1, &a->SOAP_ENV__Subcode, "")) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct SOAP_ENV__Code * SOAP_FMAC4 soap_in_SOAP_ENV__Code(struct soap *soap, const char *tag, struct SOAP_ENV__Code *a, const char *type) { size_t soap_flag_SOAP_ENV__Value = 1; size_t soap_flag_SOAP_ENV__Subcode = 1; if (soap_element_begin_in(soap, tag, 0, type)) return NULL; a = (struct SOAP_ENV__Code *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_SOAP_ENV__Code, sizeof(struct SOAP_ENV__Code), 0, NULL, NULL, NULL); if (!a) return NULL; soap_default_SOAP_ENV__Code(soap, a); if (soap->body && !*soap->href) { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_SOAP_ENV__Value && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) if (soap_in__QName(soap, "SOAP-ENV:Value", &a->SOAP_ENV__Value, "")) { soap_flag_SOAP_ENV__Value--; continue; } if (soap_flag_SOAP_ENV__Subcode && soap->error == SOAP_TAG_MISMATCH) if (soap_in_PointerToSOAP_ENV__Code(soap, "SOAP-ENV:Subcode", &a->SOAP_ENV__Subcode, "")) { soap_flag_SOAP_ENV__Subcode--; continue; } if (soap->error == SOAP_TAG_MISMATCH) soap->error = soap_ignore_element(soap); if (soap->error == SOAP_NO_TAG) break; if (soap->error) return NULL; } if (soap_element_end_in(soap, tag)) return NULL; } else { a = (struct SOAP_ENV__Code *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_SOAP_ENV__Code, 0, sizeof(struct SOAP_ENV__Code), 0, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Code(struct soap *soap, const struct SOAP_ENV__Code *a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_SOAP_ENV__Code); if (soap_out_SOAP_ENV__Code(soap, tag?tag:"SOAP-ENV:Code", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct SOAP_ENV__Code * SOAP_FMAC4 soap_get_SOAP_ENV__Code(struct soap *soap, struct SOAP_ENV__Code *p, const char *tag, const char *type) { if ((p = soap_in_SOAP_ENV__Code(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC1 struct SOAP_ENV__Code * SOAP_FMAC2 soap_instantiate_SOAP_ENV__Code(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size) { (void)type; (void)arrayType; /* appease -Wall -Werror */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_instantiate_SOAP_ENV__Code(%d, %s, %s)\n", n, type?type:"", arrayType?arrayType:"")); struct soap_clist *cp = soap_link(soap, NULL, SOAP_TYPE_SOAP_ENV__Code, n, soap_fdelete); if (!cp) return NULL; if (n < 0) { cp->ptr = (void*)SOAP_NEW(struct SOAP_ENV__Code); if (size) *size = sizeof(struct SOAP_ENV__Code); } else { cp->ptr = (void*)SOAP_NEW(struct SOAP_ENV__Code[n]); if (!cp->ptr) { soap->error = SOAP_EOM; return NULL; } if (size) *size = n * sizeof(struct SOAP_ENV__Code); } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Instantiated location=%p\n", cp->ptr)); return (struct SOAP_ENV__Code*)cp->ptr; } SOAP_FMAC3 void SOAP_FMAC4 soap_copy_SOAP_ENV__Code(struct soap *soap, int st, int tt, void *p, size_t len, const void *q, size_t n) { (void)soap; (void)tt; (void)st; (void)len; (void)n; /* appease -Wall -Werror */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copying struct SOAP_ENV__Code %p -> %p\n", q, p)); *(struct SOAP_ENV__Code*)p = *(struct SOAP_ENV__Code*)q; } #endif #ifndef WITH_NOGLOBAL SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Header(struct soap *soap, struct SOAP_ENV__Header *a) { (void)soap; (void)a; /* appease -Wall -Werror */ } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Header(struct soap *soap, const struct SOAP_ENV__Header *a) { (void)soap; (void)a; /* appease -Wall -Werror */ } SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Header(struct soap *soap, const char *tag, int id, const struct SOAP_ENV__Header *a, const char *type) { (void)soap; (void)tag; (void)id; (void)type; if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_SOAP_ENV__Header), type)) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct SOAP_ENV__Header * SOAP_FMAC4 soap_in_SOAP_ENV__Header(struct soap *soap, const char *tag, struct SOAP_ENV__Header *a, const char *type) { if (soap_element_begin_in(soap, tag, 0, type)) return NULL; a = (struct SOAP_ENV__Header *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_SOAP_ENV__Header, sizeof(struct SOAP_ENV__Header), 0, NULL, NULL, NULL); if (!a) return NULL; soap_default_SOAP_ENV__Header(soap, a); if (soap->body && !*soap->href) { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap->error == SOAP_TAG_MISMATCH) soap->error = soap_ignore_element(soap); if (soap->error == SOAP_NO_TAG) break; if (soap->error) return NULL; } if (soap_element_end_in(soap, tag)) return NULL; } else { a = (struct SOAP_ENV__Header *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_SOAP_ENV__Header, 0, sizeof(struct SOAP_ENV__Header), 0, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Header(struct soap *soap, const struct SOAP_ENV__Header *a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_SOAP_ENV__Header); if (soap_out_SOAP_ENV__Header(soap, tag?tag:"SOAP-ENV:Header", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct SOAP_ENV__Header * SOAP_FMAC4 soap_get_SOAP_ENV__Header(struct soap *soap, struct SOAP_ENV__Header *p, const char *tag, const char *type) { if ((p = soap_in_SOAP_ENV__Header(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC1 struct SOAP_ENV__Header * SOAP_FMAC2 soap_instantiate_SOAP_ENV__Header(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size) { (void)type; (void)arrayType; /* appease -Wall -Werror */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_instantiate_SOAP_ENV__Header(%d, %s, %s)\n", n, type?type:"", arrayType?arrayType:"")); struct soap_clist *cp = soap_link(soap, NULL, SOAP_TYPE_SOAP_ENV__Header, n, soap_fdelete); if (!cp) return NULL; if (n < 0) { cp->ptr = (void*)SOAP_NEW(struct SOAP_ENV__Header); if (size) *size = sizeof(struct SOAP_ENV__Header); } else { cp->ptr = (void*)SOAP_NEW(struct SOAP_ENV__Header[n]); if (!cp->ptr) { soap->error = SOAP_EOM; return NULL; } if (size) *size = n * sizeof(struct SOAP_ENV__Header); } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Instantiated location=%p\n", cp->ptr)); return (struct SOAP_ENV__Header*)cp->ptr; } SOAP_FMAC3 void SOAP_FMAC4 soap_copy_SOAP_ENV__Header(struct soap *soap, int st, int tt, void *p, size_t len, const void *q, size_t n) { (void)soap; (void)tt; (void)st; (void)len; (void)n; /* appease -Wall -Werror */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copying struct SOAP_ENV__Header %p -> %p\n", q, p)); *(struct SOAP_ENV__Header*)p = *(struct SOAP_ENV__Header*)q; } #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default___ns3__GetGeoIPContext(struct soap *soap, struct __ns3__GetGeoIPContext *a) { (void)soap; (void)a; /* appease -Wall -Werror */ a->ns1__GetGeoIPContext = NULL; } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize___ns3__GetGeoIPContext(struct soap *soap, const struct __ns3__GetGeoIPContext *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_serialize_PointerTo_ns1__GetGeoIPContext(soap, &a->ns1__GetGeoIPContext); } SOAP_FMAC3 int SOAP_FMAC4 soap_out___ns3__GetGeoIPContext(struct soap *soap, const char *tag, int id, const struct __ns3__GetGeoIPContext *a, const char *type) { (void)soap; (void)tag; (void)id; (void)type; if (soap_out_PointerTo_ns1__GetGeoIPContext(soap, "ns1:GetGeoIPContext", -1, &a->ns1__GetGeoIPContext, "")) return soap->error; return SOAP_OK; } SOAP_FMAC3 struct __ns3__GetGeoIPContext * SOAP_FMAC4 soap_in___ns3__GetGeoIPContext(struct soap *soap, const char *tag, struct __ns3__GetGeoIPContext *a, const char *type) { size_t soap_flag_ns1__GetGeoIPContext = 1; short soap_flag; a = (struct __ns3__GetGeoIPContext *)soap_id_enter(soap, "", a, SOAP_TYPE___ns3__GetGeoIPContext, sizeof(struct __ns3__GetGeoIPContext), 0, NULL, NULL, NULL); if (!a) return NULL; soap_default___ns3__GetGeoIPContext(soap, a); for (soap_flag = 0;; soap_flag = 1) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_ns1__GetGeoIPContext && soap->error == SOAP_TAG_MISMATCH) if (soap_in_PointerTo_ns1__GetGeoIPContext(soap, "ns1:GetGeoIPContext", &a->ns1__GetGeoIPContext, "")) { soap_flag_ns1__GetGeoIPContext--; continue; } if (soap->error == SOAP_TAG_MISMATCH) if (soap_flag) { soap->error = SOAP_OK; break; } if (soap_flag && soap->error == SOAP_NO_TAG) break; if (soap->error) return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put___ns3__GetGeoIPContext(struct soap *soap, const struct __ns3__GetGeoIPContext *a, const char *tag, const char *type) { register int id = 0; if (soap_out___ns3__GetGeoIPContext(soap, tag?tag:"-ns3:GetGeoIPContext", id, a, type)) return soap->error; return SOAP_OK; } SOAP_FMAC3 struct __ns3__GetGeoIPContext * SOAP_FMAC4 soap_get___ns3__GetGeoIPContext(struct soap *soap, struct __ns3__GetGeoIPContext *p, const char *tag, const char *type) { if ((p = soap_in___ns3__GetGeoIPContext(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC1 struct __ns3__GetGeoIPContext * SOAP_FMAC2 soap_instantiate___ns3__GetGeoIPContext(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size) { (void)type; (void)arrayType; /* appease -Wall -Werror */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_instantiate___ns3__GetGeoIPContext(%d, %s, %s)\n", n, type?type:"", arrayType?arrayType:"")); struct soap_clist *cp = soap_link(soap, NULL, SOAP_TYPE___ns3__GetGeoIPContext, n, soap_fdelete); if (!cp) return NULL; if (n < 0) { cp->ptr = (void*)SOAP_NEW(struct __ns3__GetGeoIPContext); if (size) *size = sizeof(struct __ns3__GetGeoIPContext); } else { cp->ptr = (void*)SOAP_NEW(struct __ns3__GetGeoIPContext[n]); if (!cp->ptr) { soap->error = SOAP_EOM; return NULL; } if (size) *size = n * sizeof(struct __ns3__GetGeoIPContext); } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Instantiated location=%p\n", cp->ptr)); return (struct __ns3__GetGeoIPContext*)cp->ptr; } SOAP_FMAC3 void SOAP_FMAC4 soap_copy___ns3__GetGeoIPContext(struct soap *soap, int st, int tt, void *p, size_t len, const void *q, size_t n) { (void)soap; (void)tt; (void)st; (void)len; (void)n; /* appease -Wall -Werror */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copying struct __ns3__GetGeoIPContext %p -> %p\n", q, p)); *(struct __ns3__GetGeoIPContext*)p = *(struct __ns3__GetGeoIPContext*)q; } SOAP_FMAC3 void SOAP_FMAC4 soap_default___ns3__GetGeoIP(struct soap *soap, struct __ns3__GetGeoIP *a) { (void)soap; (void)a; /* appease -Wall -Werror */ a->ns1__GetGeoIP = NULL; } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize___ns3__GetGeoIP(struct soap *soap, const struct __ns3__GetGeoIP *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_serialize_PointerTo_ns1__GetGeoIP(soap, &a->ns1__GetGeoIP); } SOAP_FMAC3 int SOAP_FMAC4 soap_out___ns3__GetGeoIP(struct soap *soap, const char *tag, int id, const struct __ns3__GetGeoIP *a, const char *type) { (void)soap; (void)tag; (void)id; (void)type; if (soap_out_PointerTo_ns1__GetGeoIP(soap, "ns1:GetGeoIP", -1, &a->ns1__GetGeoIP, "")) return soap->error; return SOAP_OK; } SOAP_FMAC3 struct __ns3__GetGeoIP * SOAP_FMAC4 soap_in___ns3__GetGeoIP(struct soap *soap, const char *tag, struct __ns3__GetGeoIP *a, const char *type) { size_t soap_flag_ns1__GetGeoIP = 1; short soap_flag; a = (struct __ns3__GetGeoIP *)soap_id_enter(soap, "", a, SOAP_TYPE___ns3__GetGeoIP, sizeof(struct __ns3__GetGeoIP), 0, NULL, NULL, NULL); if (!a) return NULL; soap_default___ns3__GetGeoIP(soap, a); for (soap_flag = 0;; soap_flag = 1) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_ns1__GetGeoIP && soap->error == SOAP_TAG_MISMATCH) if (soap_in_PointerTo_ns1__GetGeoIP(soap, "ns1:GetGeoIP", &a->ns1__GetGeoIP, "")) { soap_flag_ns1__GetGeoIP--; continue; } if (soap->error == SOAP_TAG_MISMATCH) if (soap_flag) { soap->error = SOAP_OK; break; } if (soap_flag && soap->error == SOAP_NO_TAG) break; if (soap->error) return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put___ns3__GetGeoIP(struct soap *soap, const struct __ns3__GetGeoIP *a, const char *tag, const char *type) { register int id = 0; if (soap_out___ns3__GetGeoIP(soap, tag?tag:"-ns3:GetGeoIP", id, a, type)) return soap->error; return SOAP_OK; } SOAP_FMAC3 struct __ns3__GetGeoIP * SOAP_FMAC4 soap_get___ns3__GetGeoIP(struct soap *soap, struct __ns3__GetGeoIP *p, const char *tag, const char *type) { if ((p = soap_in___ns3__GetGeoIP(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC1 struct __ns3__GetGeoIP * SOAP_FMAC2 soap_instantiate___ns3__GetGeoIP(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size) { (void)type; (void)arrayType; /* appease -Wall -Werror */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_instantiate___ns3__GetGeoIP(%d, %s, %s)\n", n, type?type:"", arrayType?arrayType:"")); struct soap_clist *cp = soap_link(soap, NULL, SOAP_TYPE___ns3__GetGeoIP, n, soap_fdelete); if (!cp) return NULL; if (n < 0) { cp->ptr = (void*)SOAP_NEW(struct __ns3__GetGeoIP); if (size) *size = sizeof(struct __ns3__GetGeoIP); } else { cp->ptr = (void*)SOAP_NEW(struct __ns3__GetGeoIP[n]); if (!cp->ptr) { soap->error = SOAP_EOM; return NULL; } if (size) *size = n * sizeof(struct __ns3__GetGeoIP); } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Instantiated location=%p\n", cp->ptr)); return (struct __ns3__GetGeoIP*)cp->ptr; } SOAP_FMAC3 void SOAP_FMAC4 soap_copy___ns3__GetGeoIP(struct soap *soap, int st, int tt, void *p, size_t len, const void *q, size_t n) { (void)soap; (void)tt; (void)st; (void)len; (void)n; /* appease -Wall -Werror */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copying struct __ns3__GetGeoIP %p -> %p\n", q, p)); *(struct __ns3__GetGeoIP*)p = *(struct __ns3__GetGeoIP*)q; } SOAP_FMAC3 void SOAP_FMAC4 soap_default___ns2__GetGeoIPContext(struct soap *soap, struct __ns2__GetGeoIPContext *a) { (void)soap; (void)a; /* appease -Wall -Werror */ a->ns1__GetGeoIPContext = NULL; } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize___ns2__GetGeoIPContext(struct soap *soap, const struct __ns2__GetGeoIPContext *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_serialize_PointerTo_ns1__GetGeoIPContext(soap, &a->ns1__GetGeoIPContext); } SOAP_FMAC3 int SOAP_FMAC4 soap_out___ns2__GetGeoIPContext(struct soap *soap, const char *tag, int id, const struct __ns2__GetGeoIPContext *a, const char *type) { (void)soap; (void)tag; (void)id; (void)type; if (soap_out_PointerTo_ns1__GetGeoIPContext(soap, "ns1:GetGeoIPContext", -1, &a->ns1__GetGeoIPContext, "")) return soap->error; return SOAP_OK; } SOAP_FMAC3 struct __ns2__GetGeoIPContext * SOAP_FMAC4 soap_in___ns2__GetGeoIPContext(struct soap *soap, const char *tag, struct __ns2__GetGeoIPContext *a, const char *type) { size_t soap_flag_ns1__GetGeoIPContext = 1; short soap_flag; a = (struct __ns2__GetGeoIPContext *)soap_id_enter(soap, "", a, SOAP_TYPE___ns2__GetGeoIPContext, sizeof(struct __ns2__GetGeoIPContext), 0, NULL, NULL, NULL); if (!a) return NULL; soap_default___ns2__GetGeoIPContext(soap, a); for (soap_flag = 0;; soap_flag = 1) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_ns1__GetGeoIPContext && soap->error == SOAP_TAG_MISMATCH) if (soap_in_PointerTo_ns1__GetGeoIPContext(soap, "ns1:GetGeoIPContext", &a->ns1__GetGeoIPContext, "")) { soap_flag_ns1__GetGeoIPContext--; continue; } if (soap->error == SOAP_TAG_MISMATCH) if (soap_flag) { soap->error = SOAP_OK; break; } if (soap_flag && soap->error == SOAP_NO_TAG) break; if (soap->error) return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put___ns2__GetGeoIPContext(struct soap *soap, const struct __ns2__GetGeoIPContext *a, const char *tag, const char *type) { register int id = 0; if (soap_out___ns2__GetGeoIPContext(soap, tag?tag:"-ns2:GetGeoIPContext", id, a, type)) return soap->error; return SOAP_OK; } SOAP_FMAC3 struct __ns2__GetGeoIPContext * SOAP_FMAC4 soap_get___ns2__GetGeoIPContext(struct soap *soap, struct __ns2__GetGeoIPContext *p, const char *tag, const char *type) { if ((p = soap_in___ns2__GetGeoIPContext(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC1 struct __ns2__GetGeoIPContext * SOAP_FMAC2 soap_instantiate___ns2__GetGeoIPContext(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size) { (void)type; (void)arrayType; /* appease -Wall -Werror */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_instantiate___ns2__GetGeoIPContext(%d, %s, %s)\n", n, type?type:"", arrayType?arrayType:"")); struct soap_clist *cp = soap_link(soap, NULL, SOAP_TYPE___ns2__GetGeoIPContext, n, soap_fdelete); if (!cp) return NULL; if (n < 0) { cp->ptr = (void*)SOAP_NEW(struct __ns2__GetGeoIPContext); if (size) *size = sizeof(struct __ns2__GetGeoIPContext); } else { cp->ptr = (void*)SOAP_NEW(struct __ns2__GetGeoIPContext[n]); if (!cp->ptr) { soap->error = SOAP_EOM; return NULL; } if (size) *size = n * sizeof(struct __ns2__GetGeoIPContext); } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Instantiated location=%p\n", cp->ptr)); return (struct __ns2__GetGeoIPContext*)cp->ptr; } SOAP_FMAC3 void SOAP_FMAC4 soap_copy___ns2__GetGeoIPContext(struct soap *soap, int st, int tt, void *p, size_t len, const void *q, size_t n) { (void)soap; (void)tt; (void)st; (void)len; (void)n; /* appease -Wall -Werror */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copying struct __ns2__GetGeoIPContext %p -> %p\n", q, p)); *(struct __ns2__GetGeoIPContext*)p = *(struct __ns2__GetGeoIPContext*)q; } SOAP_FMAC3 void SOAP_FMAC4 soap_default___ns2__GetGeoIP(struct soap *soap, struct __ns2__GetGeoIP *a) { (void)soap; (void)a; /* appease -Wall -Werror */ a->ns1__GetGeoIP = NULL; } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize___ns2__GetGeoIP(struct soap *soap, const struct __ns2__GetGeoIP *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_serialize_PointerTo_ns1__GetGeoIP(soap, &a->ns1__GetGeoIP); } SOAP_FMAC3 int SOAP_FMAC4 soap_out___ns2__GetGeoIP(struct soap *soap, const char *tag, int id, const struct __ns2__GetGeoIP *a, const char *type) { (void)soap; (void)tag; (void)id; (void)type; if (soap_out_PointerTo_ns1__GetGeoIP(soap, "ns1:GetGeoIP", -1, &a->ns1__GetGeoIP, "")) return soap->error; return SOAP_OK; } SOAP_FMAC3 struct __ns2__GetGeoIP * SOAP_FMAC4 soap_in___ns2__GetGeoIP(struct soap *soap, const char *tag, struct __ns2__GetGeoIP *a, const char *type) { size_t soap_flag_ns1__GetGeoIP = 1; short soap_flag; a = (struct __ns2__GetGeoIP *)soap_id_enter(soap, "", a, SOAP_TYPE___ns2__GetGeoIP, sizeof(struct __ns2__GetGeoIP), 0, NULL, NULL, NULL); if (!a) return NULL; soap_default___ns2__GetGeoIP(soap, a); for (soap_flag = 0;; soap_flag = 1) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_ns1__GetGeoIP && soap->error == SOAP_TAG_MISMATCH) if (soap_in_PointerTo_ns1__GetGeoIP(soap, "ns1:GetGeoIP", &a->ns1__GetGeoIP, "")) { soap_flag_ns1__GetGeoIP--; continue; } if (soap->error == SOAP_TAG_MISMATCH) if (soap_flag) { soap->error = SOAP_OK; break; } if (soap_flag && soap->error == SOAP_NO_TAG) break; if (soap->error) return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put___ns2__GetGeoIP(struct soap *soap, const struct __ns2__GetGeoIP *a, const char *tag, const char *type) { register int id = 0; if (soap_out___ns2__GetGeoIP(soap, tag?tag:"-ns2:GetGeoIP", id, a, type)) return soap->error; return SOAP_OK; } SOAP_FMAC3 struct __ns2__GetGeoIP * SOAP_FMAC4 soap_get___ns2__GetGeoIP(struct soap *soap, struct __ns2__GetGeoIP *p, const char *tag, const char *type) { if ((p = soap_in___ns2__GetGeoIP(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC1 struct __ns2__GetGeoIP * SOAP_FMAC2 soap_instantiate___ns2__GetGeoIP(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size) { (void)type; (void)arrayType; /* appease -Wall -Werror */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_instantiate___ns2__GetGeoIP(%d, %s, %s)\n", n, type?type:"", arrayType?arrayType:"")); struct soap_clist *cp = soap_link(soap, NULL, SOAP_TYPE___ns2__GetGeoIP, n, soap_fdelete); if (!cp) return NULL; if (n < 0) { cp->ptr = (void*)SOAP_NEW(struct __ns2__GetGeoIP); if (size) *size = sizeof(struct __ns2__GetGeoIP); } else { cp->ptr = (void*)SOAP_NEW(struct __ns2__GetGeoIP[n]); if (!cp->ptr) { soap->error = SOAP_EOM; return NULL; } if (size) *size = n * sizeof(struct __ns2__GetGeoIP); } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Instantiated location=%p\n", cp->ptr)); return (struct __ns2__GetGeoIP*)cp->ptr; } SOAP_FMAC3 void SOAP_FMAC4 soap_copy___ns2__GetGeoIP(struct soap *soap, int st, int tt, void *p, size_t len, const void *q, size_t n) { (void)soap; (void)tt; (void)st; (void)len; (void)n; /* appease -Wall -Werror */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copying struct __ns2__GetGeoIP %p -> %p\n", q, p)); *(struct __ns2__GetGeoIP*)p = *(struct __ns2__GetGeoIP*)q; } #ifndef WITH_NOGLOBAL SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToSOAP_ENV__Reason(struct soap *soap, struct SOAP_ENV__Reason *const*a) { if (!soap_reference(soap, *a, SOAP_TYPE_SOAP_ENV__Reason)) soap_serialize_SOAP_ENV__Reason(soap, *a); } SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerToSOAP_ENV__Reason(struct soap *soap, const char *tag, int id, struct SOAP_ENV__Reason *const*a, const char *type) { id = soap_element_id(soap, tag, id, *a, NULL, 0, type, SOAP_TYPE_SOAP_ENV__Reason); if (id < 0) return soap->error; return soap_out_SOAP_ENV__Reason(soap, tag, id, *a, type); } SOAP_FMAC3 struct SOAP_ENV__Reason ** SOAP_FMAC4 soap_in_PointerToSOAP_ENV__Reason(struct soap *soap, const char *tag, struct SOAP_ENV__Reason **a, const char *type) { if (soap_element_begin_in(soap, tag, 1, NULL)) return NULL; if (!a) if (!(a = (struct SOAP_ENV__Reason **)soap_malloc(soap, sizeof(struct SOAP_ENV__Reason *)))) return NULL; *a = NULL; if (!soap->null && *soap->href != '#') { soap_revert(soap); if (!(*a = soap_in_SOAP_ENV__Reason(soap, tag, *a, type))) return NULL; } else { a = (struct SOAP_ENV__Reason **)soap_id_lookup(soap, soap->href, (void**)a, SOAP_TYPE_SOAP_ENV__Reason, sizeof(struct SOAP_ENV__Reason), 0); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerToSOAP_ENV__Reason(struct soap *soap, struct SOAP_ENV__Reason *const*a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_PointerToSOAP_ENV__Reason); if (soap_out_PointerToSOAP_ENV__Reason(soap, tag?tag:"SOAP-ENV:Reason", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct SOAP_ENV__Reason ** SOAP_FMAC4 soap_get_PointerToSOAP_ENV__Reason(struct soap *soap, struct SOAP_ENV__Reason **p, const char *tag, const char *type) { if ((p = soap_in_PointerToSOAP_ENV__Reason(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } #endif #ifndef WITH_NOGLOBAL SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToSOAP_ENV__Detail(struct soap *soap, struct SOAP_ENV__Detail *const*a) { if (!soap_reference(soap, *a, SOAP_TYPE_SOAP_ENV__Detail)) soap_serialize_SOAP_ENV__Detail(soap, *a); } SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerToSOAP_ENV__Detail(struct soap *soap, const char *tag, int id, struct SOAP_ENV__Detail *const*a, const char *type) { id = soap_element_id(soap, tag, id, *a, NULL, 0, type, SOAP_TYPE_SOAP_ENV__Detail); if (id < 0) return soap->error; return soap_out_SOAP_ENV__Detail(soap, tag, id, *a, type); } SOAP_FMAC3 struct SOAP_ENV__Detail ** SOAP_FMAC4 soap_in_PointerToSOAP_ENV__Detail(struct soap *soap, const char *tag, struct SOAP_ENV__Detail **a, const char *type) { if (soap_element_begin_in(soap, tag, 1, NULL)) return NULL; if (!a) if (!(a = (struct SOAP_ENV__Detail **)soap_malloc(soap, sizeof(struct SOAP_ENV__Detail *)))) return NULL; *a = NULL; if (!soap->null && *soap->href != '#') { soap_revert(soap); if (!(*a = soap_in_SOAP_ENV__Detail(soap, tag, *a, type))) return NULL; } else { a = (struct SOAP_ENV__Detail **)soap_id_lookup(soap, soap->href, (void**)a, SOAP_TYPE_SOAP_ENV__Detail, sizeof(struct SOAP_ENV__Detail), 0); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerToSOAP_ENV__Detail(struct soap *soap, struct SOAP_ENV__Detail *const*a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_PointerToSOAP_ENV__Detail); if (soap_out_PointerToSOAP_ENV__Detail(soap, tag?tag:"SOAP-ENV:Detail", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct SOAP_ENV__Detail ** SOAP_FMAC4 soap_get_PointerToSOAP_ENV__Detail(struct soap *soap, struct SOAP_ENV__Detail **p, const char *tag, const char *type) { if ((p = soap_in_PointerToSOAP_ENV__Detail(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } #endif #ifndef WITH_NOGLOBAL SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToSOAP_ENV__Code(struct soap *soap, struct SOAP_ENV__Code *const*a) { if (!soap_reference(soap, *a, SOAP_TYPE_SOAP_ENV__Code)) soap_serialize_SOAP_ENV__Code(soap, *a); } SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerToSOAP_ENV__Code(struct soap *soap, const char *tag, int id, struct SOAP_ENV__Code *const*a, const char *type) { id = soap_element_id(soap, tag, id, *a, NULL, 0, type, SOAP_TYPE_SOAP_ENV__Code); if (id < 0) return soap->error; return soap_out_SOAP_ENV__Code(soap, tag, id, *a, type); } SOAP_FMAC3 struct SOAP_ENV__Code ** SOAP_FMAC4 soap_in_PointerToSOAP_ENV__Code(struct soap *soap, const char *tag, struct SOAP_ENV__Code **a, const char *type) { if (soap_element_begin_in(soap, tag, 1, NULL)) return NULL; if (!a) if (!(a = (struct SOAP_ENV__Code **)soap_malloc(soap, sizeof(struct SOAP_ENV__Code *)))) return NULL; *a = NULL; if (!soap->null && *soap->href != '#') { soap_revert(soap); if (!(*a = soap_in_SOAP_ENV__Code(soap, tag, *a, type))) return NULL; } else { a = (struct SOAP_ENV__Code **)soap_id_lookup(soap, soap->href, (void**)a, SOAP_TYPE_SOAP_ENV__Code, sizeof(struct SOAP_ENV__Code), 0); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerToSOAP_ENV__Code(struct soap *soap, struct SOAP_ENV__Code *const*a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_PointerToSOAP_ENV__Code); if (soap_out_PointerToSOAP_ENV__Code(soap, tag?tag:"SOAP-ENV:Code", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct SOAP_ENV__Code ** SOAP_FMAC4 soap_get_PointerToSOAP_ENV__Code(struct soap *soap, struct SOAP_ENV__Code **p, const char *tag, const char *type) { if ((p = soap_in_PointerToSOAP_ENV__Code(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } #endif SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTo_ns1__GetGeoIPContextResponse(struct soap *soap, _ns1__GetGeoIPContextResponse *const*a) { if (!soap_reference(soap, *a, SOAP_TYPE__ns1__GetGeoIPContextResponse)) (*a)->soap_serialize(soap); } SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTo_ns1__GetGeoIPContextResponse(struct soap *soap, const char *tag, int id, _ns1__GetGeoIPContextResponse *const*a, const char *type) { id = soap_element_id(soap, tag, id, *a, NULL, 0, type, SOAP_TYPE__ns1__GetGeoIPContextResponse); if (id < 0) return soap->error; return (*a)->soap_out(soap, tag, id, type); } SOAP_FMAC3 _ns1__GetGeoIPContextResponse ** SOAP_FMAC4 soap_in_PointerTo_ns1__GetGeoIPContextResponse(struct soap *soap, const char *tag, _ns1__GetGeoIPContextResponse **a, const char *type) { if (soap_element_begin_in(soap, tag, 1, NULL)) return NULL; if (!a) if (!(a = (_ns1__GetGeoIPContextResponse **)soap_malloc(soap, sizeof(_ns1__GetGeoIPContextResponse *)))) return NULL; *a = NULL; if (!soap->null && *soap->href != '#') { soap_revert(soap); if (!(*a = (_ns1__GetGeoIPContextResponse *)soap_instantiate__ns1__GetGeoIPContextResponse(soap, -1, soap->type, soap->arrayType, NULL))) return NULL; (*a)->soap_default(soap); if (!(*a)->soap_in(soap, tag, NULL)) return NULL; } else { _ns1__GetGeoIPContextResponse ** p = (_ns1__GetGeoIPContextResponse **)soap_id_lookup(soap, soap->href, (void**)a, SOAP_TYPE__ns1__GetGeoIPContextResponse, sizeof(_ns1__GetGeoIPContextResponse), 0); a = p; if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTo_ns1__GetGeoIPContextResponse(struct soap *soap, _ns1__GetGeoIPContextResponse *const*a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_PointerTo_ns1__GetGeoIPContextResponse); if (soap_out_PointerTo_ns1__GetGeoIPContextResponse(soap, tag?tag:"ns1:GetGeoIPContextResponse", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 _ns1__GetGeoIPContextResponse ** SOAP_FMAC4 soap_get_PointerTo_ns1__GetGeoIPContextResponse(struct soap *soap, _ns1__GetGeoIPContextResponse **p, const char *tag, const char *type) { if ((p = soap_in_PointerTo_ns1__GetGeoIPContextResponse(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTo_ns1__GetGeoIPContext(struct soap *soap, _ns1__GetGeoIPContext *const*a) { if (!soap_reference(soap, *a, SOAP_TYPE__ns1__GetGeoIPContext)) (*a)->soap_serialize(soap); } SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTo_ns1__GetGeoIPContext(struct soap *soap, const char *tag, int id, _ns1__GetGeoIPContext *const*a, const char *type) { id = soap_element_id(soap, tag, id, *a, NULL, 0, type, SOAP_TYPE__ns1__GetGeoIPContext); if (id < 0) return soap->error; return (*a)->soap_out(soap, tag, id, type); } SOAP_FMAC3 _ns1__GetGeoIPContext ** SOAP_FMAC4 soap_in_PointerTo_ns1__GetGeoIPContext(struct soap *soap, const char *tag, _ns1__GetGeoIPContext **a, const char *type) { if (soap_element_begin_in(soap, tag, 1, NULL)) return NULL; if (!a) if (!(a = (_ns1__GetGeoIPContext **)soap_malloc(soap, sizeof(_ns1__GetGeoIPContext *)))) return NULL; *a = NULL; if (!soap->null && *soap->href != '#') { soap_revert(soap); if (!(*a = (_ns1__GetGeoIPContext *)soap_instantiate__ns1__GetGeoIPContext(soap, -1, soap->type, soap->arrayType, NULL))) return NULL; (*a)->soap_default(soap); if (!(*a)->soap_in(soap, tag, NULL)) return NULL; } else { _ns1__GetGeoIPContext ** p = (_ns1__GetGeoIPContext **)soap_id_lookup(soap, soap->href, (void**)a, SOAP_TYPE__ns1__GetGeoIPContext, sizeof(_ns1__GetGeoIPContext), 0); a = p; if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTo_ns1__GetGeoIPContext(struct soap *soap, _ns1__GetGeoIPContext *const*a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_PointerTo_ns1__GetGeoIPContext); if (soap_out_PointerTo_ns1__GetGeoIPContext(soap, tag?tag:"ns1:GetGeoIPContext", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 _ns1__GetGeoIPContext ** SOAP_FMAC4 soap_get_PointerTo_ns1__GetGeoIPContext(struct soap *soap, _ns1__GetGeoIPContext **p, const char *tag, const char *type) { if ((p = soap_in_PointerTo_ns1__GetGeoIPContext(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTo_ns1__GetGeoIPResponse(struct soap *soap, _ns1__GetGeoIPResponse *const*a) { if (!soap_reference(soap, *a, SOAP_TYPE__ns1__GetGeoIPResponse)) (*a)->soap_serialize(soap); } SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTo_ns1__GetGeoIPResponse(struct soap *soap, const char *tag, int id, _ns1__GetGeoIPResponse *const*a, const char *type) { id = soap_element_id(soap, tag, id, *a, NULL, 0, type, SOAP_TYPE__ns1__GetGeoIPResponse); if (id < 0) return soap->error; return (*a)->soap_out(soap, tag, id, type); } SOAP_FMAC3 _ns1__GetGeoIPResponse ** SOAP_FMAC4 soap_in_PointerTo_ns1__GetGeoIPResponse(struct soap *soap, const char *tag, _ns1__GetGeoIPResponse **a, const char *type) { if (soap_element_begin_in(soap, tag, 1, NULL)) return NULL; if (!a) if (!(a = (_ns1__GetGeoIPResponse **)soap_malloc(soap, sizeof(_ns1__GetGeoIPResponse *)))) return NULL; *a = NULL; if (!soap->null && *soap->href != '#') { soap_revert(soap); if (!(*a = (_ns1__GetGeoIPResponse *)soap_instantiate__ns1__GetGeoIPResponse(soap, -1, soap->type, soap->arrayType, NULL))) return NULL; (*a)->soap_default(soap); if (!(*a)->soap_in(soap, tag, NULL)) return NULL; } else { _ns1__GetGeoIPResponse ** p = (_ns1__GetGeoIPResponse **)soap_id_lookup(soap, soap->href, (void**)a, SOAP_TYPE__ns1__GetGeoIPResponse, sizeof(_ns1__GetGeoIPResponse), 0); a = p; if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTo_ns1__GetGeoIPResponse(struct soap *soap, _ns1__GetGeoIPResponse *const*a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_PointerTo_ns1__GetGeoIPResponse); if (soap_out_PointerTo_ns1__GetGeoIPResponse(soap, tag?tag:"ns1:GetGeoIPResponse", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 _ns1__GetGeoIPResponse ** SOAP_FMAC4 soap_get_PointerTo_ns1__GetGeoIPResponse(struct soap *soap, _ns1__GetGeoIPResponse **p, const char *tag, const char *type) { if ((p = soap_in_PointerTo_ns1__GetGeoIPResponse(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTo_ns1__GetGeoIP(struct soap *soap, _ns1__GetGeoIP *const*a) { if (!soap_reference(soap, *a, SOAP_TYPE__ns1__GetGeoIP)) (*a)->soap_serialize(soap); } SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTo_ns1__GetGeoIP(struct soap *soap, const char *tag, int id, _ns1__GetGeoIP *const*a, const char *type) { id = soap_element_id(soap, tag, id, *a, NULL, 0, type, SOAP_TYPE__ns1__GetGeoIP); if (id < 0) return soap->error; return (*a)->soap_out(soap, tag, id, type); } SOAP_FMAC3 _ns1__GetGeoIP ** SOAP_FMAC4 soap_in_PointerTo_ns1__GetGeoIP(struct soap *soap, const char *tag, _ns1__GetGeoIP **a, const char *type) { if (soap_element_begin_in(soap, tag, 1, NULL)) return NULL; if (!a) if (!(a = (_ns1__GetGeoIP **)soap_malloc(soap, sizeof(_ns1__GetGeoIP *)))) return NULL; *a = NULL; if (!soap->null && *soap->href != '#') { soap_revert(soap); if (!(*a = (_ns1__GetGeoIP *)soap_instantiate__ns1__GetGeoIP(soap, -1, soap->type, soap->arrayType, NULL))) return NULL; (*a)->soap_default(soap); if (!(*a)->soap_in(soap, tag, NULL)) return NULL; } else { _ns1__GetGeoIP ** p = (_ns1__GetGeoIP **)soap_id_lookup(soap, soap->href, (void**)a, SOAP_TYPE__ns1__GetGeoIP, sizeof(_ns1__GetGeoIP), 0); a = p; if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTo_ns1__GetGeoIP(struct soap *soap, _ns1__GetGeoIP *const*a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_PointerTo_ns1__GetGeoIP); if (soap_out_PointerTo_ns1__GetGeoIP(soap, tag?tag:"ns1:GetGeoIP", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 _ns1__GetGeoIP ** SOAP_FMAC4 soap_get_PointerTo_ns1__GetGeoIP(struct soap *soap, _ns1__GetGeoIP **p, const char *tag, const char *type) { if ((p = soap_in_PointerTo_ns1__GetGeoIP(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTons1__GeoIP(struct soap *soap, ns1__GeoIP *const*a) { if (!soap_reference(soap, *a, SOAP_TYPE_ns1__GeoIP)) (*a)->soap_serialize(soap); } SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTons1__GeoIP(struct soap *soap, const char *tag, int id, ns1__GeoIP *const*a, const char *type) { id = soap_element_id(soap, tag, id, *a, NULL, 0, type, SOAP_TYPE_ns1__GeoIP); if (id < 0) return soap->error; return (*a)->soap_out(soap, tag, id, type); } SOAP_FMAC3 ns1__GeoIP ** SOAP_FMAC4 soap_in_PointerTons1__GeoIP(struct soap *soap, const char *tag, ns1__GeoIP **a, const char *type) { if (soap_element_begin_in(soap, tag, 1, NULL)) return NULL; if (!a) if (!(a = (ns1__GeoIP **)soap_malloc(soap, sizeof(ns1__GeoIP *)))) return NULL; *a = NULL; if (!soap->null && *soap->href != '#') { soap_revert(soap); if (!(*a = (ns1__GeoIP *)soap_instantiate_ns1__GeoIP(soap, -1, soap->type, soap->arrayType, NULL))) return NULL; (*a)->soap_default(soap); if (!(*a)->soap_in(soap, tag, NULL)) return NULL; } else { ns1__GeoIP ** p = (ns1__GeoIP **)soap_id_lookup(soap, soap->href, (void**)a, SOAP_TYPE_ns1__GeoIP, sizeof(ns1__GeoIP), 0); a = p; if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTons1__GeoIP(struct soap *soap, ns1__GeoIP *const*a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_PointerTons1__GeoIP); if (soap_out_PointerTons1__GeoIP(soap, tag?tag:"ns1:GeoIP", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 ns1__GeoIP ** SOAP_FMAC4 soap_get_PointerTons1__GeoIP(struct soap *soap, ns1__GeoIP **p, const char *tag, const char *type) { if ((p = soap_in_PointerTons1__GeoIP(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTostd__string(struct soap *soap, std::string *const*a) { if (!soap_reference(soap, *a, SOAP_TYPE_std__string)) soap_serialize_std__string(soap, *a); } SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTostd__string(struct soap *soap, const char *tag, int id, std::string *const*a, const char *type) { id = soap_element_id(soap, tag, id, *a, NULL, 0, type, SOAP_TYPE_std__string); if (id < 0) return soap->error; return soap_out_std__string(soap, tag, id, *a, type); } SOAP_FMAC3 std::string ** SOAP_FMAC4 soap_in_PointerTostd__string(struct soap *soap, const char *tag, std::string **a, const char *type) { if (soap_element_begin_in(soap, tag, 1, NULL)) return NULL; if (!a) if (!(a = (std::string **)soap_malloc(soap, sizeof(std::string *)))) return NULL; *a = NULL; if (!soap->null && *soap->href != '#') { soap_revert(soap); if (!(*a = soap_in_std__string(soap, tag, *a, type))) return NULL; } else { a = (std::string **)soap_id_lookup(soap, soap->href, (void**)a, SOAP_TYPE_std__string, sizeof(std::string), 0); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTostd__string(struct soap *soap, std::string *const*a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_PointerTostd__string); if (soap_out_PointerTostd__string(soap, tag?tag:"string", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 std::string ** SOAP_FMAC4 soap_get_PointerTostd__string(struct soap *soap, std::string **p, const char *tag, const char *type) { if ((p = soap_in_PointerTostd__string(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC3 int SOAP_FMAC4 soap_out__QName(struct soap *soap, const char *tag, int id, char *const*a, const char *type) { return soap_outstring(soap, tag, id, a, type, SOAP_TYPE__QName); } SOAP_FMAC3 char * * SOAP_FMAC4 soap_in__QName(struct soap *soap, const char *tag, char **a, const char *type) { char **p; p = soap_instring(soap, tag, a, type, SOAP_TYPE__QName, 2, 0, -1); return p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put__QName(struct soap *soap, char *const*a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE__QName); if (soap_out__QName(soap, tag?tag:"byte", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 char ** SOAP_FMAC4 soap_get__QName(struct soap *soap, char **p, const char *tag, const char *type) { if ((p = soap_in__QName(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC3 void SOAP_FMAC4 soap_default_string(struct soap *soap, char **a) { (void)soap; /* appease -Wall -Werror */ #ifdef SOAP_DEFAULT_string *a = SOAP_DEFAULT_string; #else *a = (char *)0; #endif } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_string(struct soap *soap, char *const*a) { soap_reference(soap, *a, SOAP_TYPE_string); } SOAP_FMAC3 int SOAP_FMAC4 soap_out_string(struct soap *soap, const char *tag, int id, char *const*a, const char *type) { return soap_outstring(soap, tag, id, a, type, SOAP_TYPE_string); } SOAP_FMAC3 char * * SOAP_FMAC4 soap_in_string(struct soap *soap, const char *tag, char **a, const char *type) { char **p; p = soap_instring(soap, tag, a, type, SOAP_TYPE_string, 1, 0, -1); return p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_string(struct soap *soap, char *const*a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_string); if (soap_out_string(soap, tag?tag:"byte", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 char ** SOAP_FMAC4 soap_get_string(struct soap *soap, char **p, const char *tag, const char *type) { if ((p = soap_in_string(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } #if defined(__BORLANDC__) #pragma option pop #pragma option pop #endif /* End of soapC.cpp */ gsoap-2.8.28/gsoap/ios_plugin/examples/GeoIPService/Classes/soapStub.h0000644000175000017500000002431212653650146025227 0ustar ellertellert/* soapStub.h Generated by gSOAP 2.8.8 from GeoIPService.h Copyright(C) 2000-2012, Robert van Engelen, Genivia Inc. All Rights Reserved. The generated code is released under one of the following licenses: 1) GPL or 2) Genivia's license for commercial use. This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. */ #ifndef soapStub_H #define soapStub_H #include #define SOAP_NAMESPACE_OF_ns1 "http://www.webservicex.net/" #include "stdsoap2.h" #if GSOAP_VERSION != 20808 # error "GSOAP VERSION MISMATCH IN GENERATED CODE: PLEASE REINSTALL PACKAGE" #endif /******************************************************************************\ * * * Enumerations * * * \******************************************************************************/ /******************************************************************************\ * * * Types with Custom Serializers * * * \******************************************************************************/ /******************************************************************************\ * * * Classes and Structs * * * \******************************************************************************/ #if 0 /* volatile type: do not declare here, declared elsewhere */ #endif #if 0 /* volatile type: do not declare here, declared elsewhere */ #endif #ifndef SOAP_TYPE_ns1__GeoIP #define SOAP_TYPE_ns1__GeoIP (8) /* ns1:GeoIP */ class SOAP_CMAC ns1__GeoIP { public: int ReturnCode; /* required element of type xsd:int */ std::string *IP; /* optional element of type xsd:string */ std::string *ReturnCodeDetails; /* optional element of type xsd:string */ std::string *CountryName; /* optional element of type xsd:string */ std::string *CountryCode; /* optional element of type xsd:string */ struct soap *soap; /* transient */ public: virtual int soap_type() const { return 8; } /* = unique id SOAP_TYPE_ns1__GeoIP */ virtual void soap_default(struct soap*); virtual void soap_serialize(struct soap*) const; virtual int soap_put(struct soap*, const char*, const char*) const; virtual int soap_out(struct soap*, const char*, int, const char*) const; virtual void *soap_get(struct soap*, const char*, const char*); virtual void *soap_in(struct soap*, const char*, const char*); ns1__GeoIP() { ns1__GeoIP::soap_default(NULL); } virtual ~ns1__GeoIP() { } }; #endif #ifndef SOAP_TYPE__ns1__GetGeoIP #define SOAP_TYPE__ns1__GetGeoIP (9) /* ns1:GetGeoIP */ class SOAP_CMAC _ns1__GetGeoIP { public: std::string *IPAddress; /* optional element of type xsd:string */ struct soap *soap; /* transient */ public: virtual int soap_type() const { return 9; } /* = unique id SOAP_TYPE__ns1__GetGeoIP */ virtual void soap_default(struct soap*); virtual void soap_serialize(struct soap*) const; virtual int soap_put(struct soap*, const char*, const char*) const; virtual int soap_out(struct soap*, const char*, int, const char*) const; virtual void *soap_get(struct soap*, const char*, const char*); virtual void *soap_in(struct soap*, const char*, const char*); _ns1__GetGeoIP() { _ns1__GetGeoIP::soap_default(NULL); } virtual ~_ns1__GetGeoIP() { } }; #endif #ifndef SOAP_TYPE__ns1__GetGeoIPResponse #define SOAP_TYPE__ns1__GetGeoIPResponse (10) /* ns1:GetGeoIPResponse */ class SOAP_CMAC _ns1__GetGeoIPResponse { public: ns1__GeoIP *GetGeoIPResult; /* SOAP 1.2 RPC return element (when namespace qualified) */ /* optional element of type ns1:GeoIP */ struct soap *soap; /* transient */ public: virtual int soap_type() const { return 10; } /* = unique id SOAP_TYPE__ns1__GetGeoIPResponse */ virtual void soap_default(struct soap*); virtual void soap_serialize(struct soap*) const; virtual int soap_put(struct soap*, const char*, const char*) const; virtual int soap_out(struct soap*, const char*, int, const char*) const; virtual void *soap_get(struct soap*, const char*, const char*); virtual void *soap_in(struct soap*, const char*, const char*); _ns1__GetGeoIPResponse() { _ns1__GetGeoIPResponse::soap_default(NULL); } virtual ~_ns1__GetGeoIPResponse() { } }; #endif #ifndef SOAP_TYPE__ns1__GetGeoIPContext #define SOAP_TYPE__ns1__GetGeoIPContext (11) /* ns1:GetGeoIPContext */ class SOAP_CMAC _ns1__GetGeoIPContext { public: struct soap *soap; /* transient */ public: virtual int soap_type() const { return 11; } /* = unique id SOAP_TYPE__ns1__GetGeoIPContext */ virtual void soap_default(struct soap*); virtual void soap_serialize(struct soap*) const; virtual int soap_put(struct soap*, const char*, const char*) const; virtual int soap_out(struct soap*, const char*, int, const char*) const; virtual void *soap_get(struct soap*, const char*, const char*); virtual void *soap_in(struct soap*, const char*, const char*); _ns1__GetGeoIPContext() { _ns1__GetGeoIPContext::soap_default(NULL); } virtual ~_ns1__GetGeoIPContext() { } }; #endif #ifndef SOAP_TYPE__ns1__GetGeoIPContextResponse #define SOAP_TYPE__ns1__GetGeoIPContextResponse (12) /* ns1:GetGeoIPContextResponse */ class SOAP_CMAC _ns1__GetGeoIPContextResponse { public: ns1__GeoIP *GetGeoIPContextResult; /* SOAP 1.2 RPC return element (when namespace qualified) */ /* optional element of type ns1:GeoIP */ struct soap *soap; /* transient */ public: virtual int soap_type() const { return 12; } /* = unique id SOAP_TYPE__ns1__GetGeoIPContextResponse */ virtual void soap_default(struct soap*); virtual void soap_serialize(struct soap*) const; virtual int soap_put(struct soap*, const char*, const char*) const; virtual int soap_out(struct soap*, const char*, int, const char*) const; virtual void *soap_get(struct soap*, const char*, const char*); virtual void *soap_in(struct soap*, const char*, const char*); _ns1__GetGeoIPContextResponse() { _ns1__GetGeoIPContextResponse::soap_default(NULL); } virtual ~_ns1__GetGeoIPContextResponse() { } }; #endif #ifndef SOAP_TYPE___ns2__GetGeoIP #define SOAP_TYPE___ns2__GetGeoIP (20) /* Operation wrapper: */ struct __ns2__GetGeoIP { public: _ns1__GetGeoIP *ns1__GetGeoIP; /* optional element of type ns1:GetGeoIP */ }; #endif #ifndef SOAP_TYPE___ns2__GetGeoIPContext #define SOAP_TYPE___ns2__GetGeoIPContext (24) /* Operation wrapper: */ struct __ns2__GetGeoIPContext { public: _ns1__GetGeoIPContext *ns1__GetGeoIPContext; /* optional element of type ns1:GetGeoIPContext */ }; #endif #ifndef SOAP_TYPE___ns3__GetGeoIP #define SOAP_TYPE___ns3__GetGeoIP (26) /* Operation wrapper: */ struct __ns3__GetGeoIP { public: _ns1__GetGeoIP *ns1__GetGeoIP; /* optional element of type ns1:GetGeoIP */ }; #endif #ifndef SOAP_TYPE___ns3__GetGeoIPContext #define SOAP_TYPE___ns3__GetGeoIPContext (28) /* Operation wrapper: */ struct __ns3__GetGeoIPContext { public: _ns1__GetGeoIPContext *ns1__GetGeoIPContext; /* optional element of type ns1:GetGeoIPContext */ }; #endif #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_SOAP_ENV__Header #define SOAP_TYPE_SOAP_ENV__Header (29) /* SOAP Header: */ struct SOAP_ENV__Header { #ifdef WITH_NOEMPTYSTRUCT private: char dummy; /* dummy member to enable compilation */ #endif }; #endif #endif #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_SOAP_ENV__Code #define SOAP_TYPE_SOAP_ENV__Code (30) /* SOAP Fault Code: */ struct SOAP_ENV__Code { public: char *SOAP_ENV__Value; /* optional element of type xsd:QName */ struct SOAP_ENV__Code *SOAP_ENV__Subcode; /* optional element of type SOAP-ENV:Code */ }; #endif #endif #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_SOAP_ENV__Detail #define SOAP_TYPE_SOAP_ENV__Detail (32) /* SOAP-ENV:Detail */ struct SOAP_ENV__Detail { public: char *__any; int __type; /* any type of element (defined below) */ void *fault; /* transient */ }; #endif #endif #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_SOAP_ENV__Reason #define SOAP_TYPE_SOAP_ENV__Reason (35) /* SOAP-ENV:Reason */ struct SOAP_ENV__Reason { public: char *SOAP_ENV__Text; /* optional element of type xsd:string */ }; #endif #endif #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_SOAP_ENV__Fault #define SOAP_TYPE_SOAP_ENV__Fault (36) /* SOAP Fault: */ struct SOAP_ENV__Fault { public: char *faultcode; /* optional element of type xsd:QName */ char *faultstring; /* optional element of type xsd:string */ char *faultactor; /* optional element of type xsd:string */ struct SOAP_ENV__Detail *detail; /* optional element of type SOAP-ENV:Detail */ struct SOAP_ENV__Code *SOAP_ENV__Code; /* optional element of type SOAP-ENV:Code */ struct SOAP_ENV__Reason *SOAP_ENV__Reason; /* optional element of type SOAP-ENV:Reason */ char *SOAP_ENV__Node; /* optional element of type xsd:string */ char *SOAP_ENV__Role; /* optional element of type xsd:string */ struct SOAP_ENV__Detail *SOAP_ENV__Detail; /* optional element of type SOAP-ENV:Detail */ }; #endif #endif /******************************************************************************\ * * * Typedefs * * * \******************************************************************************/ #ifndef SOAP_TYPE__QName #define SOAP_TYPE__QName (5) typedef char *_QName; #endif #ifndef SOAP_TYPE__XML #define SOAP_TYPE__XML (6) typedef char *_XML; #endif /******************************************************************************\ * * * Externals * * * \******************************************************************************/ #endif /* End of soapStub.h */ gsoap-2.8.28/gsoap/ios_plugin/examples/GeoIPService/Classes/gsoapios.h0000644000175000017500000001626312653650146025261 0ustar ellertellert/* gsoapios.h iOS plugin (iPhone and iPad) gSOAP XML Web services tools Copyright (C) 2000-2012, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under one of the following licenses: GPL, the gSOAP public license, or Genivia's license for commercial use. ------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2008, Robert van Engelen, Genivia Inc., All Rights Reserved. ------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. ------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com ------------------------------------------------------------------------------- */ #ifndef GSOAPIOS_H #define GSOAPIOS_H #import "stdsoap2.h" /* Class GSoapiOSURLData @brief stores states for connection establishment, buffering soap request and response */ @interface GSoapiOSURLData : NSObject { @private NSString *endpoint; NSString *host; NSString *soap_action; NSString *http_method; NSString *content_type; NSMutableData *http_req_msg; NSData *soap_req_msg; NSData *soap_res_msg; int port; int req_content_length; int received_length; // received length of response for deserialization bool request_sent; // flag indicates a soap request has been made // The timeout interval for the new request, in seconds double timeout_interval; unsigned int cache_policy; // The cache policy for the new request NSString *user_name; NSString *password; } @property(nonatomic, retain) NSString *endpoint; // Web service endpoint @property(nonatomic, retain) NSString *host; // host name @property(nonatomic, retain) NSString *soap_action; // soap action @property(nonatomic, retain) NSString *http_method; // http method @property(nonatomic, retain) NSString *content_type; // http content type // http request messgae @property(nonatomic, retain) NSMutableData *http_req_msg; // soap request message @property(nonatomic, retain) NSData *soap_req_msg; // soap response xml message @property(nonatomic, retain) NSData *soap_res_msg; @property(nonatomic) int port; // port @property(nonatomic) int req_content_length; // request content length // received length of response for deserialization @property(nonatomic) int received_length; // flag indicates a soap request has been made @property(nonatomic) bool request_sent; // the timout interval for request @property(nonatomic) double timeout_interval; @property(nonatomic) unsigned int cache_policy; // user and password: must appear in pair @property(nonatomic, retain) NSString *user_name; // user name @property(nonatomic, retain) NSString *password; // pasword - (id) init; @end /** plugin identification for plugin registry */ #define SOAP_IOS_ID "SOAP_IOS-1.0" // plugin identification for plugin registry #ifdef __cplusplus extern "C" { #endif /** @struct soap_ios_data @brief soap_ios plugin data to override callbacks and store states to manipulate SOAP connection using iOS libraries */ struct soap_ios_data { // Stores states such as endpoint, serialized request and response GSoapiOSURLData *url_data; // A callback function to replace the default tcp_connect function // Rather than establishment of a tcp connection using socket, this callback // extracts and saves states (endpoint, http-method, content-type etc.) and // buffers serialized request SOAP_SOCKET (*fopen)( struct soap*, const char*, const char*, int); // A callback function to replace the default tcp_disconnect function // Since no connection is established in fopen, this function does noop int (*fclose)( struct soap*); // A callback function to replace the default send function // This function buffers serialized request including HTTP header and body // (soap message) int (*fsend)( struct soap*, const char *, size_t); // A callback function to replace the default send function // This function sends a synchrous request to the endpoint and receives // response using iOS SDK class NSURLConnection. The response is then snet // to soap for deserialization. size_t (*frecv)( struct soap*, char *, size_t); }; /* @fn int soap_ios (struct soap *soap, struct soap_plugin *plugin, void *arg) @brief soap plugin function for registration @param[in] soap soap context @param[in] plugin plugin data @param[in] arg arguments for the plugin data Usgae: @code struct soap *soap = soap_new(); soap_register_plugin(soap, soap_ios); @endcode */ int soap_ios (struct soap *soap, struct soap_plugin *plugin, void *arg); /* @fn void soap_ios_setcachepolicy(struct soap *soap, unsigned int policy) @brief Sets cache policy The constants used to specify interaction with the cached responses are: enum { NSURLRequestUseProtocolCachePolicy = 0, NSURLRequestReloadIgnoringLocalCacheData = 1, NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData, NSURLRequestReturnCacheDataElseLoad = 2, NSURLRequestReturnCacheDataDontLoad = 3, NSURLRequestReloadIgnoringLocalAndRemoteCacheData =4, NSURLRequestReloadRevalidatingCacheData = 5 }; @param soap The soap context @param[in] policy The policy to be specified for he request */ void soap_ios_setcachepolicy(struct soap *soap, unsigned int policy); /* @fn soap_ios_settimeoutinterval(struct soap *soap, double seconds) @brief Sets timeout interval @param soap The soap context @param[in] seconds The value for the timeout interval to be specifed (in seconds) */ void soap_ios_settimeoutinterval(struct soap *soap, double seconds); #ifdef __cplusplus } #endif // --- closing #ifdef __cplusplus #endif // --- closing #ifndef GSOAPIOS_H gsoap-2.8.28/gsoap/ios_plugin/examples/GeoIPService/Classes/gsoapios.mm0000644000175000017500000011155412653650146025442 0ustar ellertellert/* gsoapios.m iOS plugin (iPhone and iPad) gSOAP XML Web services tools Copyright (C) 2000-2012, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under one of the following licenses: GPL, the gSOAP public license, or Genivia's license for commercial use. ------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2008, Robert van Engelen, Genivia Inc., All Rights Reserved. ------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. ------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com ------------------------------------------------------------------------------- */ /** @mainpage - @ref ios_0 documents the iOS plugin to facilitate the development of client applications on iOS plarforms (iPhone and iPad) using the gSOAP toolkit. To use the plugin for development of client applications on iOS platforms, registration of this plugin is required: @code #import "gsoapios.h" struct soap *soap = soap_new(); soap_register_plugin(soap, soap_ios); @endcode */ /** @page ios_0 The iOS plugin for developing client applications on iOS (iPhone and iPad) platforms @section ios_intro Introduction Consuming Web services on iOS (iPhone and iPad) platforms is inreseasingly in demand today. However, Xcode does not have any built-in tools that make consuming Web services easy. It typically requires knowledge of XML processing techniques to send soap requests to the Web services and then parse the returning XML results. The gSOAP toolkit that provides an automated SOAP and XML data binding for C and C++ can be used directly to develop client applications to consuming Web services on iOS platforms such as iPhone and iPad. However, it's default network connection does not leverage the advantages of network connection offered by iOS SDK, instead it uses lower level TCP sockets for network connection. This soap plugin facilitates developers to develop Web services client applications on iOS platforms without maniulating the XML processing. Moreover, it takes andvantages of network connection offered by iOS SDK and supports 3G/4G, wifi etc. Two Xcode examples, @ref ios_example_calc and @ref ios_example_geoip can be found in samples/ios. @section ios_1 Getting Started To start building Web services client applications for iPhone and/or iPad with gSOAP , you need: \li The gSOAP package from http://www.genivia.com/Products/downloads.html (select gSOAP toolkit standard edition from the list of software packages), and \li Xcode IDE with the iOS SDK installed. Development of Web services applications on iOS is no different from the development SOAP Web services applications on Linux, Unix and Mac OS except with a soap plugin registration. Specifically, there are four steps to develop SOAP Web services client applications on iOS: \li Generating application stubs using the gSOAP toolkit and add the source files \li Creating an iOS application project to the Xcode project \li Registering the iOS plugin \li Calling service methods @subsection iso_register_pulg Registering iOS Plugin (Required) To register the iOS plugin, simply call soap_register_plugin method: @code #import "gsoapios.h" struct soap *soap = soap_new(); soap_register(soap, soap_ios); // Register the iOS plugin ... soap_end(soap); // Clean up temporaries soap_destroy(soap); // Free soap context @endcode The plugin is destroyed automatically by the soap context when the soap_end method is executed. @subsection ios_cache_policy Specifying Cache policy (Optional) The interaction beween the client and the Web servcie server can be controled by specifying the cache policy. To specify the cache policy, call the method soap_ios_setcachepolicy(struct soap *soap, unsigned int policy) . The method cannot be called before the pluging is registered. @code #import "gsoapios.h" struct soap *soap = soap_new(); soap_register(soap, soap_ios); // Register the iOS plugin // Specify the cache policy for the request // Caveat: this method cannot be called before the plugin is registered // If this method is not called, the cache policy is set to NSURLRequestUseProtocolCachePolicy (0) by default. soap_ios_setchacepolicy(soap, NSURLRequestReturnCacheDataElseLoad); // (2) // Or use the integer directly instead of enum // soap_ios_setchacepolicy(soap, 2); // (NSURLRequestReturnCacheDataElseLoad) ... soap_end(soap); // clean up allocated temporaries soap_destroy(soap); // Free soap context @endcode The available cache policies that can be specified are: @code enum { NSURLRequestUseProtocolCachePolicy = 0, NSURLRequestReloadIgnoringLocalCacheData = 1, NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData, NSURLRequestReturnCacheDataElseLoad = 2, NSURLRequestReturnCacheDataDontLoad = 3, NSURLRequestReloadIgnoringLocalAndRemoteCacheData =4, NSURLRequestReloadRevalidatingCacheData = 5 } @endcode If this method is not called, the cache policy is set to NSURLRequestUseProtocolCachePolicy (0) by default. @subsection ios_timeout_interval Specifying Timeout Interval (Optional) The timeout interval for network connection can be specified using the method soap_ios_settimeoutinterval(struct soap *soap, double seconds). The method cannot be called before the pluging is registered. If this method is not called, the timeout interval is 60 seconds by default. @code #import "gsoapios.h" struct soap *soap = soap_new(); soap_register(soap, soap_ios); // Register the iOS plugin // Specify the timout interval in terms of seconds // If this method is not called, the timeout interval is set to 60 seconds by default // Caveat: this method cannot be called before the plugin is registered soap_ios_settimeoutinterval(soap, 30.0); ... soap_end(soap); soap_destroy(soap); @endcode @subsection ios_http_auth Handling HTTP Authentication A server may request user authentication and deny access (HTTP 401 error) when the client tries to connect without HTTP authentication (or with the wrong authentication information). HTTP authentication (basic) is enabled at the client-side by setting the soap.userid and soap.passwd strings to a username and password, respectively. Be aware of that both of userid and password must be set in pair, that is, if one of them is set, the other must be set too. If the server requires basic HTTP authentication, for example, the userid and password can be specified: @code struct soap *soap = soap_new(); soap->userid = "someone"; soap->passwd = "somepass"; ... soap_end(soap); // Clean up temporaries soap_destroy(soap); @endcode @section ios_example Examples This section intoduces two examples to demonstrate the development of client applications consuming SOAP Web services on iOS platforms (iPhone and iPad) using gSOAP tools and the iOS plugin. Because gSOAP supports development for both pure C and C++, the first example, @ref ios_example_calc, is developed using pure C. The second one, @ref ios_example_geoip, is developmed using C++. We assume you already have had the expereince in development of applications for iPhone and iPad using Xcode with iOS SDK installed. @subsection ios_example_calc A Simple Calculator Example (Pure C) This example shows you how to develop a client application in C using gSOAP and the ios plugin, which consumes a simple caculator service on iOS using gSOAP. The simple calculator service was developed and deployed as a demo using the gSOAP tools (refer to http://www.genivia.com/Products/gsoap/demos/index.html for details). The gSOAP Calculator Service provides several operations such as add, sub, mul, div etc. In this example, we use operation add as a demo. Other operations are alled in a similar way. The wsdl file for this service can be obtained at the following link: http://www.genivia.com/calc.wsdl The Xcode project for this example can be found in samples/ios/calc. @subsubsection ios_calc_step_1 Step 1: Generating stubs for C API To generate codes for the calculator Web service, we first run the wsdl2h tool from the command line on the URL of the WSDL and use option -o to specify the output file (Alternatively, you can download the calc.wsdl and use the local file instead of the URL): @code > wsdl2h -c -o calc.h http://www.genivia.com/calc.wsdl @endcode This generates the calc.h service definition header file with service operation definitions and types for the operation's data. The option -c flags the wsdl2h tool to generate the service definition file in pure C. By default, gSOAP assumes you will use C++ with STL. We have not yet generated the stubs for the CAPI. To do so, run the soapcpp2 compiler: @code > soapcpp2 -i -C calc.h @endcode Option -C indicates client-side only files (soapcpp2 generates both client and server stubs and skeletons by default). This generates a number of soource files for client application development. @subsubsection ios_calc_step_2 Step 2: Creating Xcode project for iPhone Launch the Xcode, create a View-based Application project and name it Calc. Open the CalcViewController.xib file in the Interface Builder. Double-click on the View item and populate it with the views listed below and shown in Figure 1: \li Two Labels ("+" and "A Simple Calculator") \li Two Text Fields (operand1 and operand2) \li One Round Rect Button ("+" button) @image html calc-view.png "Figure 1. View of the Calculator Web Service Client" In Xcode, edit the file CalcViewController.h to make it look like the following: @code // File: CalcViewController.h #import @interface CalcViewController : UIViewController { UITextField *op1; // operand1 UITextField *op2; // operand2 } @property (nonatomic, retain) IBOutlet UITextField *op1; @property (nonatomic, retain) IBOutlet UITextField *op2; - (IBAction) buttonPressed; @end @endcode Link the op1 and op2 to the two Text Fields and delegate the button action to method buttonPressed. @subsubsection ios_calc_step_3 Step 3: Adding generated source stubs to the Xcode project Add the source files soapC.c, soapClient.c, soapH.h, and soapStub.h generated in @ref ios_calc_step_1 to the project. Also add files stdsoap2.h and stdsoap2.c to the project from gsoap package as well as the iOS pluhin files gsoapios.h and sgsoapios.m. @subsubsection ios_calc_step_4 Step 4: Implementing the Logic by calling the soap service Firstly, edit file main.m to import the file ./Classes/calc.nsmap. Link errors may arise without importing this namespace mapping. @code // File: main.m #import #import "./Classes/calc.nsmap" int main(int argc, char *argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; int retVal = UIApplicationMain(argc, argv, nil, nil); [pool release]; return retVal; } @endcode Then, implememt the source file CalcViewController.m as the following: @code #import "CalcViewController.h" #import "soapStub.h" #import "gsoapios.h" @implementation CalcViewController @synthesize op1; // Set or get opreand1 @synthesize op2; // Set or get opreand1 - (IBAction) buttonPressed { double x = [op1.text doubleValue]; double y = [op2.text doubleValue]; struct soap *soap = soap_new(); if (soap_register_plugin(soap, soap_ios) == SOAP_OK) { // Specify the cache policy (optional) to NSURLRequestReturnCacheDataElseLoad // instead of NSURLRequestUseProtocolCachePolicy by deault soap_ios_setcachepolicy(soap, NSURLRequestReturnCacheDataElseLoad); // Specify the timeout interval (optional) to 45 seconds instead of // the default 60 seconds soap_ios_settimeoutinterval(soap, 45.0); double result; // Call Web service operation add int status = soap_call_ns2__add(soap, NULL, NULL, x, y, &result); soap_free_temp(soap); // Cleanup temporary resources // Check soap response status if (status == SOAP_OK) { NSString *resultString; NSString *tittleString; if (status == SOAP_OK) { resultString = [NSString stringWithFormat:@"%f",result]; tittleString = [NSString stringWithFormat:@"%f / %f =",x, y]; }else { resultString = [NSString stringWithFormat:@"%@",@"Soap fault!"]; tittleString = [NSString stringWithFormat:@"%@",@"Warning"]; } // Show the result in an alert UIAlertView *alert = [[UIAlertView alloc] initWithTitle:tittleString message:resultString delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert show]; // Show the alert [alert release]; // Release the alert } else { // Caveat: Better to extract the error message and show it using an alert soap_print_fault(soap,stderr); // Print soap error in console } } soap_end(soap); // clean up allocated temporaries soap_free(soap); // Free soap context } ... @endcode A screen snapshot of the client is shown in Figure 2. @image html calc-result.png "Figure 2: Snapshot of the CalcViewService result" @subsection ios_example_geoip A GeoIPService (C++) GeoIPService is a live SOAP Web service that enables you to look up contries by IP address or by Context. This example shows you how to develop a client application in C++ using gSOAP and the ios plugin, which consumes the GeoIPSerive on iOS using gSOAP. The WSDL file for this servive can be downloaded at the following link: http://www.webservicex.net/geoipservice.asmx?WSDL Devoplopment of he client appliation for this GeoIPService on iOS is similar to development for the cleant appliaction for @ref ios_example_calc. The major dfferences are highlighted in following: \li Rename the .m files to .mm files. The iOS plugin implementation file gsoapios.m must be renamed to gsoapios.mm. The main.m must be renamed to main.mm. Other files such as your ViewController may also be renamed with .mm. \li Generate C++ proxy using proper options with wsdl2h and soapcpp2 \li Use the stdsoap2.cpp instead of stdsoap2.c from the gSOAP package in your iOS project. The Xcode project for this example can be found in samples/ios/GeoIPService. @subsubsection ios_geoip_step_1 Step 1: Generating stubs for C++ Proxy To generate codes for the GeoIPSerbice Web service, we first run the wsdl2h tool from the command line on the URL of the WSDL and use option -o to specify the output file (Alternatively, you can download the GeoIPService.wsdl file and use the local file instead of the URL): @code >wsdl2h -o GeoIPService.h http://www.webservicex.net/geoipservice.asmx?WSDL @endcode This generates the GeoIPService.h service definition header file with service operation definitions and types for the operation's data. By default, gSOAP assumes you will use C++ with STL. To generate the stubs for the C++ proxy classes, run the soapcpp2 compiler: @code >soapcpp2 -i -C -I$GSOAP_HOME/import GeoIPService.h @endcode Option -i tells the compiler to generate C++ proxy and option -C indicates client-side only files (soapcpp2 generates both client and server stubs and skeletons by default). Option -I is needed to import the stlvector.h file from the import directory in the gSOAP package to support serialization of STL vectors. @subsubsection ios_geoip_step_2 Step 2: Creating Xcode project for iPhone Create a View-based Application project and name it GeoIPService and rename the .m source files to .mm. Open the GeoIPserviceViewController.xib file in the Interface Builder. Double-click on the View item and populate it with the views listed below and shown in Figure 3: \li A Label ("IP Address") \li A Text Field \li One Round Rect Button ("Find Country" button) @image html geoip-view.png "Figure 3. View of the GeoIPService Client" In Xcode, edit the file GeoIPServiceViewController.h to make it look like the following: @code // File: GeoIPServiceViewController.h #import @interface GeoIPServiceViewController : UIViewController { UITextField *ipAddress; } @property (nonatomic, retain) IBOutlet UITextField *ipAddress; - (IBAction) buttonFindCountry:(id)sender; @end @endcode Set the ipAddress outlet and the buttonFindCountry:(id)sender method to delegate action of the button. @subsubsection ios_geoip_step_3 Step 3: Adding generated source stubs to the Xcode project Add the source files soapC.cpp, GeoIPServiceSoap12Proxy.cpp, GeoIPServiceSoap12Proxy.h, soapH.h, andsoapStub.h generated in @ref ios_geoip_step_1 to the project. Also add filesstdsoap2.h and stdsoap2.cpp to the project from gsoap package and the iOS pluhin files gsoapios.h and sgsoapios.m. Do not forget to rename the sgsoapios.m to sgsoapios.mm The GeoIPServiceSoap12Proxy.h and GeoIPServiceSoap12Proxy.cpp are C++ proxy header and implementation files for SOAP 1.2 (You may use GeoIPServiceSoapProxy.cpp and GeoIPServiceSoapProxy.h for SOAP1.1). @subsubsection ios_geoip_step_4 Step 4: Implementing the Logic by calling the soap service Firstly, edit file main.mm to import the file ./Classes/GeoIPService.nsmap. Link errors would arise without importing this namespace mapping. @code // File: main.mm #import #import "./Classes/GeoIPServiceSoap12.nsmap" int main(int argc, char *argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; int retVal = UIApplicationMain(argc, argv, nil, nil); [pool release]; return retVal; } @endcode Then, implememt the source file GeoIPServiceViewController.m as the following: @code #import "GeoIPServiceViewController.h" #include "soapGeoIPServiceSoap12Proxy.h" #import "gsoapios.h" using namespace std; typedef struct _ns1__GetGeoIP RequestStruct; typedef struct _ns1__GetGeoIPResponse ResponseStruct; @implementation GeoIPServiceViewController @synthesize ipAddress; - (IBAction)buttonFindCountry:(id)sender { RequestStruct ip; ResponseStruct response; GeoIPServiceSoap12Proxy service; std::string ipAdd = std::string((char *)[ipAddress.text UTF8String]); ip.IPAddress = &ipAdd; // ----- register plugin for callbacks ------ soap_register_plugin(&service, soap_ios); // Optional: timeout internal, the default is 60.0 seconds soap_ios_settimeoutinterval(&service, 30.0); // Optional: the default policy is NSURLRequestUseProtocolCachePolicy (0) soap_ios_setcachepolicy(&service, NSURLRequestReturnCacheDataElseLoad); // (2) int status = service.GetGeoIP(&ip, &response); string* result; string err_msg = "Invalid IP address"; if ( status == SOAP_OK) { if(response.GetGeoIPResult && response.GetGeoIPResult->CountryName) { result = response.GetGeoIPResult->CountryName; } else { result = &err_msg; } } else { service.soap_stream_fault(std::cerr); } NSString *soapResult; NSString *tittleMsg; if (status == SOAP_OK) { soapResult = [NSString stringWithUTF8String:result->c_str()]; tittleMsg = [NSString stringWithFormat: @"%@", @"Country Found"]; } else { soapResult = [NSString stringWithFormat: @"%@", @"Soap Error!"]; tittleMsg = [NSString stringWithFormat: @"%@", @"Warning"]; } UIAlertView *alert = [[UIAlertView alloc] initWithTitle:tittleMsg message:soapResult delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert show]; [alert release]; service.destroy(); // Free soap context } ... @endcode A screen snapshot of the client is shown in Figure 4. @image html geoip-result.png "Figure : Snapshot of the GeoIPServiceViewService result" */ #import "gsoapios.h" #import // ----------------------------------------------------------------------------- // Start of objective-c Class GSoapiOSURLData implementation // ----------------------------------------------------------------------------- /** Class GSoapiOSURLData @brief The class stores the states for connection establishment, buffering soap request and response */ @implementation GSoapiOSURLData @synthesize endpoint; ///< Set or get endpoint @synthesize host; ///< Set or get host name @synthesize soap_action; ///< Set or get soap action @synthesize http_method; ///< Set or get HTTP method @synthesize content_type; ///< Set or get content type @synthesize http_req_msg; ///< Set or get HTTP request message @synthesize soap_req_msg; ///< Set or get SOAP request @synthesize soap_res_msg; ///< Set or get SOAP response @synthesize port; ///< Set or get port @synthesize received_length; ///< Set or get received message length @synthesize request_sent; ///< Set or get the flag for the first time sending @synthesize req_content_length; ///< Set or get request message length @synthesize timeout_interval; ///< Set or get timeout interval @synthesize cache_policy; ///< Set or get cache policy @synthesize user_name; ///< Set or get user ID for authentication @synthesize password; ///< Set or get password for authentication /** @fn init @brief Constructor */ - (id) init { [super init]; http_req_msg = [NSMutableData alloc]; timeout_interval = 60.0; // 60 seconds by default cache_policy = NSURLRequestUseProtocolCachePolicy; // The default cache policy return self; } /** @fn dealloc @brief Destructor */ - (void) dealloc { [endpoint release]; [host release]; [soap_action release]; [http_method release]; [content_type release]; [http_req_msg release]; [soap_req_msg release]; [user_name release]; [password release]; [super dealloc]; } @end // ----------------------------------------------------------------------------- // End of objective-c Class GSoapiOSURLData implementation // ----------------------------------------------------------------------------- // ----------------------------------------------------------------------------- // Start of C plugin implementation // ----------------------------------------------------------------------------- /** plugin identification for plugin registry */ const char soap_ios_id[13] = SOAP_IOS_ID; // Unique plugin ID static int soap_ios_copy(struct soap *soap, struct soap_plugin *dst, struct soap_plugin *src); static void soap_ios_delete(struct soap *soap, struct soap_plugin *p); static int soap_ios_init(struct soap *soap, struct soap_ios_data *data); static SOAP_SOCKET soap_ios_open( struct soap *soap, const char *endpoint, const char *host, int port); static int soap_ios_close( struct soap *soap); static int soap_ios_send( struct soap *soap, const char *buf, size_t len); static size_t soap_ios_recv( struct soap *soap, char *buf, size_t len); //void soap_ios_setcachepolicy(struct soap *soap, unsigned int policy); //void soap_ios_settimeoutinterval(struct soap *soap, double seconds); /** @fn int soap_ios @brief Save the old callbacks and set new callbacks to handle soap client applications on iOS platforms (iPhone and iPad) @param soap The soap context @param[in] p The soap plugin data @param[in] arg The arguments for soap plugin @return SOAP_OK if registration is successfull; SOAP_EOM otherwise */ int soap_ios (struct soap *soap, struct soap_plugin *p, void *arg) { p->id = soap_ios_id; // set a unique plugin id p->data = (void*)malloc(sizeof(struct soap_ios_data)); // Allocate memory p->fcopy = soap_ios_copy; // set fcopy callback for soap_copy(truct soap*) p->fdelete = soap_ios_delete; // set fdeete callback if (p->data) { if (soap_ios_init(soap, (struct soap_ios_data*)p->data) != SOAP_OK) { free(p->data); // free resource upon failure to initialize plugin return SOAP_EOM; } } return SOAP_OK; } /** @fn int soap_ios_copy(struct soap *soap, struct soap_plugin *dst, struct soap_plugin *src) @brief Duplicates the plugin context for the soap context @param soap The soap context @param[out] dst The destination plugin data to store to @param[in] src The sources plugin data to be copied from @param[in] arg The arguments for plugin (optional) @return SOAP_OK if registration is successfull; SOAP_ERR otherwise */ static int soap_ios_copy(struct soap *soap, struct soap_plugin *dst, struct soap_plugin *src) { *dst = *src; int status = SOAP_ERR; if (dst->data = (void*)malloc(sizeof(struct soap_ios_data))) status = soap_ios_init(soap, (struct soap_ios_data*)dst->data); return status; } /** @fn void soap_ios_delete(struct soap *soap, struct soap_plugin *p) @brief Destroys the plugin context @param soap context @param[in] p plugin data */ static void soap_ios_delete(struct soap *soap, struct soap_plugin *p) { if (p != NULL) { struct soap_ios_data *data = (struct soap_ios_data*)p->data; if (data && data->url_data) [data->url_data release]; // Free url_data free(p->data); // Free the pointer to url_data } } /** @fn int soap_ios_init(struct soap *soap, struct soap_ios_data *data) @brief Initializes the plugin data @param soap The soap context @param[out] data The plugin data to be initialized @return SOAP_OK if initialization is sucessful; SOAP_ERR otherwise */ static int soap_ios_init(struct soap *soap, struct soap_ios_data *data) { data->url_data = [[GSoapiOSURLData alloc] init]; if (data->url_data == nil) return SOAP_ERR; // failure to init // save and set callbacks data->fopen = soap->fopen; // save old fopen callback data->fclose = soap->fclose; // save old fclose callback data->fsend = soap->fsend; // save old fsend callback data->frecv = soap->frecv; // save old frecv callback soap->fopen = soap_ios_open; // replace open callback soap->fclose = soap_ios_close; // replace close callback soap->fsend = soap_ios_send; // replace send callback soap->frecv = soap_ios_recv; // replace recv callback return SOAP_OK; } /** @fn SOAP_SOCKET soap_ios_open( struct soap *soap, const char *endpoint, const char *host, int port) @brief Extracts states from soap context and saves states for soap connection @param soap The soap context @param[in] endpoint The Web service's endpoint @param[in] host The host name @param[in] port The port numer @return 1 A valid socket Note: This open function does not create a real socket for communication. The actual connection establishment happens in the frecv callback */ static SOAP_SOCKET soap_ios_open( struct soap *soap, const char *endpoint, const char *host, int port) { // Pull out the pluin data struct soap_ios_data *data = (struct soap_ios_data *)soap_lookup_plugin(soap, soap_ios_id); if (data == NULL || data->url_data == nil) return SOAP_INVALID_SOCKET; GSoapiOSURLData * url_data = data->url_data; [url_data setEndpoint:[NSString stringWithUTF8String:endpoint]]; [url_data setHost:[NSString stringWithUTF8String:host]]; [url_data setPort:port]; [url_data setRequest_sent:false]; [url_data setReceived_length:0]; [url_data setSoap_action:[NSString stringWithUTF8String:soap->action]]; [url_data setReq_content_length:soap->count]; // Extract a pair of userid and password if present if (soap->userid && soap->passwd) { [url_data setUser_name:[NSString stringWithUTF8String:soap->userid]]; [url_data setPassword:[NSString stringWithUTF8String:soap->passwd]]; } else { [url_data setUser_name:nil]; [url_data setPassword:nil]; } // Extracts and saves http-method switch (soap->status){ case SOAP_POST: [url_data setHttp_method:@"POST"]; break; case SOAP_GET: [url_data setHttp_method:@"GET"]; break; case SOAP_DEL: [url_data setHttp_method:@"DELETE"]; break; case SOAP_CONNECT: [url_data setHttp_method:@"CONNECT"]; break; default: [url_data setHttp_method:@"POST"]; break; } // Extracts and saves http content-type if((soap->mode & SOAP_ENC_DIME) && !(soap->mode & SOAP_ENC_MTOM)){ [url_data setContent_type:@"application/dime"]; } else if (soap->version == 2){ if (soap->mode & SOAP_ENC_MTOM){ [url_data setContent_type:@"application/xop+xml; charset=utf-8; \ type=\"application/soap+xml\""]; }else{ [url_data setContent_type:@"application/soap+xml; charset=utf-8"]; } }else if (soap->mode & SOAP_ENC_MTOM) { [url_data setContent_type:@"application/xop+xml; charset=utf-8; \ type=\"text/xml\""]; } else { [url_data setContent_type:@"tex/xml; charset=utf-8"]; } return 1; } /** @fn int soap_ios_close( struct soap *soap) @param soap The soap context @param[in] endpoint The Web service's endpoint @param[in] host The host name @param[in] port The port numer @return 0 Note: This open function does not create a real socket for communication. The actual connection establishment happens in the frecv callback */ static int soap_ios_close( struct soap *soap) { return 0; } /** @fn int soap_ios_send( struct soap *soap, const char *buf, size_t len) @brief Buffers the http/soap request in plugin data @param soap The soap context @param[in] buf The buffer holding the serialized http/soap request @param[in] len The buffer size @return The number of bytes buffered Note: This send function does not send any data to its peer. Rather it buffers the serialied soap request including http header to the plugin data. The sending happens actually in frecv function. */ static int soap_ios_send( struct soap *soap, const char *buf, size_t len) { struct soap_ios_data *data = (struct soap_ios_data*)soap_lookup_plugin(soap,soap_ios_id); GSoapiOSURLData *url_data = data->url_data; [url_data.http_req_msg appendBytes:buf length: len]; return len > 0 ? SOAP_OK : SOAP_EOF; } /** @fn size_t soap_ios_recv( struct soap *soap, char *buf, size_t len) @brief Sends soap request, buffers soap response and serialize the response @param soap The soap context @param[out] buf The buffer for the received data @param[in] len The number of bytes received @return The number of bytes received Note: This recv function sends a synchronous soap request through NSURLRequest, receives soap response, serializes response. */ static size_t soap_ios_recv( struct soap *soap, char *buf, size_t len) { struct soap_ios_data *data = (struct soap_ios_data*)soap_lookup_plugin(soap,soap_ios_id); GSoapiOSURLData *url_data = data->url_data; // Handle HTTP basic authentication if present if (url_data.user_name && url_data.password) { NSURLCredential *credential = [NSURLCredential credentialWithUser:url_data.user_name password:url_data.password persistence:NSURLCredentialPersistenceForSession]; NSURLProtectionSpace * protectionSpace = [[NSURLProtectionSpace alloc] initWithHost:url_data.host port:url_data.port protocol:@"http" realm:nil authenticationMethod:nil]; [[NSURLCredentialStorage sharedCredentialStorage] setDefaultCredential:credential forProtectionSpace:protectionSpace]; [protectionSpace release]; } // -------- End of auhentication handling --------- // Execute once: sending the request and receiving response // Send request through NSURLRequest sendSynchronousRequest // and receive response if(url_data.request_sent == false) { [url_data setRequest_sent:true]; //int msg_len = [url_data.http_req_msg length]; NSRange range = NSMakeRange([url_data.http_req_msg length] - url_data.req_content_length, url_data.req_content_length); url_data.soap_req_msg = [url_data.http_req_msg subdataWithRange:range]; NSURL *url = [NSURL URLWithString:url_data.endpoint]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:url_data.cache_policy timeoutInterval:url_data.timeout_interval]; [request addValue:url_data.host forHTTPHeaderField:@"HOST"]; [request addValue:url_data.soap_action forHTTPHeaderField:@"SOAPACTION"]; [request addValue:url_data.content_type forHTTPHeaderField:@"Content-Type"]; [request setHTTPMethod:url_data.http_method]; NSString *conten_length = [NSString stringWithFormat:@"%d", [url_data.soap_req_msg length]]; [request addValue:conten_length forHTTPHeaderField:@"Content-Length"]; [request setHTTPBody:url_data.soap_req_msg]; NSHTTPURLResponse *response = nil; NSError *error = nil; url_data.soap_res_msg = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; // Error handling if (error) { DLog(@"ERROR:<%@>\n", [error localizedDescription]); //const char *fault_string = [[error localizedDescription] UTF8String]; soap_receiver_fault(soap, [[error localizedDescription] UTF8String], ""); } } // may execute multiple times depending on the buffer size and response length if(url_data.request_sent) { size_t res_len = [url_data.soap_res_msg length]; // response length if (len + url_data.received_length > res_len) { // Adjustment len len = res_len - url_data.received_length; //cout << "len = " << len << endl; } const char *res_msg = (const char *)[url_data.soap_res_msg bytes]; memcpy(buf, res_msg + url_data.received_length, len); url_data.received_length += len; } return url_data.request_sent ? len : 0; } /** @fn void soap_ios_setcachepolicy(struct soap *soap, unsigned int policy) @brief Sets cache policy The constants used to specify interaction with the cached responses are: enum { NSURLRequestUseProtocolCachePolicy = 0, NSURLRequestReloadIgnoringLocalCacheData = 1, NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData, NSURLRequestReturnCacheDataElseLoad = 2, NSURLRequestReturnCacheDataDontLoad = 3, NSURLRequestReloadIgnoringLocalAndRemoteCacheData =4, NSURLRequestReloadRevalidatingCacheData = 5 }; @param soap The soap context @param[in] policy The policy to be specified for he request */ void soap_ios_setcachepolicy(struct soap *soap, unsigned int policy) { struct soap_ios_data *data = (struct soap_ios_data *)soap_lookup_plugin(soap, soap_ios_id); data->url_data.cache_policy = policy; } /** @fn soap_ios_settimeoutinterval(struct soap *soap, double seconds) @brief Sets timeout interval @param soap The soap context @param[in] seconds The value for the timeout interval to be specifed (in seconds) */ void soap_ios_settimeoutinterval(struct soap *soap, double seconds) { struct soap_ios_data *data = (struct soap_ios_data *)soap_lookup_plugin(soap, soap_ios_id); data->url_data.timeout_interval = seconds; } // ----------------------------------------------------------------------------- // END of C plugin implementation // ----------------------------------------------------------------------------- gsoap-2.8.28/gsoap/ios_plugin/examples/GeoIPService/Classes/GeoIPServiceViewController.h0000644000175000017500000000057712653650146030621 0ustar ellertellert// // GeoIPServiceViewController.h // GeoIPService // // Created by Wei Zhang on 5/27/12. // Copyright Genivia Inc. 2012. All rights reserved. // #import @interface GeoIPServiceViewController : UIViewController { UITextField *ipAddress; } @property (nonatomic, retain) IBOutlet UITextField *ipAddress; - (IBAction) buttonFindCountry:(id)sender; @end gsoap-2.8.28/gsoap/ios_plugin/examples/GeoIPService/Classes/soapGeoIPServiceSoap12Proxy.cpp0000644000175000017500000001641712653650146031170 0ustar ellertellert/* soapGeoIPServiceSoap12Proxy.cpp Generated by gSOAP 2.8.8 from GeoIPService.h Copyright(C) 2000-2012, Robert van Engelen, Genivia Inc. All Rights Reserved. The generated code is released under one of the following licenses: 1) GPL or 2) Genivia's license for commercial use. This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. */ #include "soapGeoIPServiceSoap12Proxy.h" GeoIPServiceSoap12Proxy::GeoIPServiceSoap12Proxy() { GeoIPServiceSoap12Proxy_init(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT); } GeoIPServiceSoap12Proxy::GeoIPServiceSoap12Proxy(const struct soap &_soap) : soap(_soap) { } GeoIPServiceSoap12Proxy::GeoIPServiceSoap12Proxy(const char *url) { GeoIPServiceSoap12Proxy_init(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT); soap_endpoint = url; } GeoIPServiceSoap12Proxy::GeoIPServiceSoap12Proxy(soap_mode iomode) { GeoIPServiceSoap12Proxy_init(iomode, iomode); } GeoIPServiceSoap12Proxy::GeoIPServiceSoap12Proxy(const char *url, soap_mode iomode) { GeoIPServiceSoap12Proxy_init(iomode, iomode); soap_endpoint = url; } GeoIPServiceSoap12Proxy::GeoIPServiceSoap12Proxy(soap_mode imode, soap_mode omode) { GeoIPServiceSoap12Proxy_init(imode, omode); } GeoIPServiceSoap12Proxy::~GeoIPServiceSoap12Proxy() { } void GeoIPServiceSoap12Proxy::GeoIPServiceSoap12Proxy_init(soap_mode imode, soap_mode omode) { soap_imode(this, imode); soap_omode(this, omode); soap_endpoint = NULL; static const struct Namespace namespaces[] = { {"SOAP-ENV", "http://www.w3.org/2003/05/soap-envelope", "http://www.w3.org/2003/05/soap-envelope", NULL}, {"SOAP-ENC", "http://www.w3.org/2003/05/soap-encoding", "http://www.w3.org/2003/05/soap-encoding", NULL}, {"xsi", "http://www.w3.org/2001/XMLSchema-instance", "http://www.w3.org/*/XMLSchema-instance", NULL}, {"xsd", "http://www.w3.org/2001/XMLSchema", "http://www.w3.org/*/XMLSchema", NULL}, {"ns2", "http://www.webservicex.net/GeoIPServiceSoap", NULL, NULL}, {"ns1", "http://www.webservicex.net/", NULL, NULL}, {"ns3", "http://www.webservicex.net/GeoIPServiceSoap12", NULL, NULL}, {NULL, NULL, NULL, NULL} }; soap_set_namespaces(this, namespaces); } void GeoIPServiceSoap12Proxy::destroy() { soap_destroy(this); soap_end(this); } void GeoIPServiceSoap12Proxy::reset() { destroy(); soap_done(this); soap_init(this); GeoIPServiceSoap12Proxy_init(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT); } void GeoIPServiceSoap12Proxy::soap_noheader() { this->header = NULL; } const SOAP_ENV__Header *GeoIPServiceSoap12Proxy::soap_header() { return this->header; } const SOAP_ENV__Fault *GeoIPServiceSoap12Proxy::soap_fault() { return this->fault; } const char *GeoIPServiceSoap12Proxy::soap_fault_string() { return *soap_faultstring(this); } const char *GeoIPServiceSoap12Proxy::soap_fault_detail() { return *soap_faultdetail(this); } int GeoIPServiceSoap12Proxy::soap_close_socket() { return soap_closesock(this); } int GeoIPServiceSoap12Proxy::soap_force_close_socket() { return soap_force_closesock(this); } void GeoIPServiceSoap12Proxy::soap_print_fault(FILE *fd) { ::soap_print_fault(this, fd); } #ifndef WITH_LEAN #ifndef WITH_COMPAT void GeoIPServiceSoap12Proxy::soap_stream_fault(std::ostream& os) { ::soap_stream_fault(this, os); } #endif char *GeoIPServiceSoap12Proxy::soap_sprint_fault(char *buf, size_t len) { return ::soap_sprint_fault(this, buf, len); } #endif int GeoIPServiceSoap12Proxy::GetGeoIP(const char *endpoint, const char *soap_action, _ns1__GetGeoIP *ns1__GetGeoIP, _ns1__GetGeoIPResponse *ns1__GetGeoIPResponse) { struct soap *soap = this; struct __ns3__GetGeoIP soap_tmp___ns3__GetGeoIP; if (endpoint) soap_endpoint = endpoint; if (!soap_endpoint) soap_endpoint = "http://www.webservicex.net/geoipservice.asmx"; if (!soap_action) soap_action = "http://www.webservicex.net/GetGeoIP"; soap->encodingStyle = NULL; soap_tmp___ns3__GetGeoIP.ns1__GetGeoIP = ns1__GetGeoIP; soap_begin(soap); soap_serializeheader(soap); soap_serialize___ns3__GetGeoIP(soap, &soap_tmp___ns3__GetGeoIP); if (soap_begin_count(soap)) return soap->error; if (soap->mode & SOAP_IO_LENGTH) { if (soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_put___ns3__GetGeoIP(soap, &soap_tmp___ns3__GetGeoIP, "-ns3:GetGeoIP", NULL) || soap_body_end_out(soap) || soap_envelope_end_out(soap)) return soap->error; } if (soap_end_count(soap)) return soap->error; if (soap_connect(soap, soap_endpoint, soap_action) || soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_put___ns3__GetGeoIP(soap, &soap_tmp___ns3__GetGeoIP, "-ns3:GetGeoIP", NULL) || soap_body_end_out(soap) || soap_envelope_end_out(soap) || soap_end_send(soap)) return soap_closesock(soap); if (!ns1__GetGeoIPResponse) return soap_closesock(soap); ns1__GetGeoIPResponse->soap_default(soap); if (soap_begin_recv(soap) || soap_envelope_begin_in(soap) || soap_recv_header(soap) || soap_body_begin_in(soap)) return soap_closesock(soap); ns1__GetGeoIPResponse->soap_get(soap, "ns1:GetGeoIPResponse", ""); if (soap->error) return soap_recv_fault(soap, 0); if (soap_body_end_in(soap) || soap_envelope_end_in(soap) || soap_end_recv(soap)) return soap_closesock(soap); return soap_closesock(soap); } int GeoIPServiceSoap12Proxy::GetGeoIPContext(const char *endpoint, const char *soap_action, _ns1__GetGeoIPContext *ns1__GetGeoIPContext, _ns1__GetGeoIPContextResponse *ns1__GetGeoIPContextResponse) { struct soap *soap = this; struct __ns3__GetGeoIPContext soap_tmp___ns3__GetGeoIPContext; if (endpoint) soap_endpoint = endpoint; if (!soap_endpoint) soap_endpoint = "http://www.webservicex.net/geoipservice.asmx"; if (!soap_action) soap_action = "http://www.webservicex.net/GetGeoIPContext"; soap->encodingStyle = NULL; soap_tmp___ns3__GetGeoIPContext.ns1__GetGeoIPContext = ns1__GetGeoIPContext; soap_begin(soap); soap_serializeheader(soap); soap_serialize___ns3__GetGeoIPContext(soap, &soap_tmp___ns3__GetGeoIPContext); if (soap_begin_count(soap)) return soap->error; if (soap->mode & SOAP_IO_LENGTH) { if (soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_put___ns3__GetGeoIPContext(soap, &soap_tmp___ns3__GetGeoIPContext, "-ns3:GetGeoIPContext", NULL) || soap_body_end_out(soap) || soap_envelope_end_out(soap)) return soap->error; } if (soap_end_count(soap)) return soap->error; if (soap_connect(soap, soap_endpoint, soap_action) || soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_put___ns3__GetGeoIPContext(soap, &soap_tmp___ns3__GetGeoIPContext, "-ns3:GetGeoIPContext", NULL) || soap_body_end_out(soap) || soap_envelope_end_out(soap) || soap_end_send(soap)) return soap_closesock(soap); if (!ns1__GetGeoIPContextResponse) return soap_closesock(soap); ns1__GetGeoIPContextResponse->soap_default(soap); if (soap_begin_recv(soap) || soap_envelope_begin_in(soap) || soap_recv_header(soap) || soap_body_begin_in(soap)) return soap_closesock(soap); ns1__GetGeoIPContextResponse->soap_get(soap, "ns1:GetGeoIPContextResponse", ""); if (soap->error) return soap_recv_fault(soap, 0); if (soap_body_end_in(soap) || soap_envelope_end_in(soap) || soap_end_recv(soap)) return soap_closesock(soap); return soap_closesock(soap); } /* End of client proxy code */ gsoap-2.8.28/gsoap/ios_plugin/examples/GeoIPService/Classes/GeoIPServiceAppDelegate.h0000644000175000017500000000077212653650146030013 0ustar ellertellert// // GeoIPServiceAppDelegate.h // GeoIPService // // Created by Wei Zhang on 5/27/12. // Copyright __MyCompanyName__ 2012. All rights reserved. // #import @class GeoIPServiceViewController; @interface GeoIPServiceAppDelegate : NSObject { UIWindow *window; GeoIPServiceViewController *viewController; } @property (nonatomic, retain) IBOutlet UIWindow *window; @property (nonatomic, retain) IBOutlet GeoIPServiceViewController *viewController; @end gsoap-2.8.28/gsoap/ios_plugin/examples/GeoIPService/Classes/stdsoap2.cpp0000644000175000017500000164356212653650146025540 0ustar ellertellert/* stdsoap2.c[pp] 2.8.8 gSOAP runtime engine gSOAP XML Web services tools Copyright (C) 2000-2011, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under ONE of the following licenses: GPL, or the gSOAP public license, or Genivia's license for commercial use. -------------------------------------------------------------------------------- Contributors: Wind River Systems Inc., for the following additions under gSOAP public license: - vxWorks compatible options -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2011, Robert van Engelen, Genivia Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #define GSOAP_LIB_VERSION 20808 #ifdef AS400 # pragma convert(819) /* EBCDIC to ASCII */ #endif #include "stdsoap2.h" #if GSOAP_VERSION != GSOAP_LIB_VERSION # error "GSOAP VERSION MISMATCH IN LIBRARY: PLEASE REINSTALL PACKAGE" #endif #ifdef __BORLANDC__ # pragma warn -8060 #else # ifdef WIN32 # ifdef UNDER_CE # pragma comment(lib, "ws2.lib") /* WinCE */ # else # pragma comment(lib, "ws2_32.lib") # endif # pragma warning(disable : 4996) /* disable deprecation warnings */ # endif #endif #ifdef __cplusplus SOAP_SOURCE_STAMP("@(#) stdsoap2.cpp ver 2.8.8 2012-02-20 00:00:00 GMT") extern "C" { #else SOAP_SOURCE_STAMP("@(#) stdsoap2.c ver 2.8.8 2012-02-20 00:00:00 GMT") #endif /* 8bit character representing unknown/nonrepresentable character data (e.g. not supported by current locale with multibyte support enabled) */ #ifndef SOAP_UNKNOWN_CHAR #define SOAP_UNKNOWN_CHAR (127) #endif /* EOF=-1 */ #define SOAP_LT (soap_wchar)(-2) /* XML-specific '<' */ #define SOAP_TT (soap_wchar)(-3) /* XML-specific '' */ #define SOAP_QT (soap_wchar)(-5) /* XML-specific '"' */ #define SOAP_AP (soap_wchar)(-6) /* XML-specific ''' */ #define soap_blank(c) ((c)+1 > 0 && (c) <= 32) #define soap_notblank(c) ((c) > 32) #if defined(WIN32) && !defined(UNDER_CE) #define soap_hash_ptr(p) ((PtrToUlong(p) >> 3) & (SOAP_PTRHASH - 1)) #else #define soap_hash_ptr(p) ((size_t)(((unsigned long)(p) >> 3) & (SOAP_PTRHASH-1))) #endif #if !defined(WITH_LEAN) || defined(SOAP_DEBUG) static void soap_init_logs(struct soap*); #endif #ifdef SOAP_DEBUG static void soap_close_logfile(struct soap*, int); static void soap_set_logfile(struct soap*, int, const char*); #endif #ifdef SOAP_MEM_DEBUG static void soap_init_mht(struct soap*); static void soap_free_mht(struct soap*); static void soap_track_unlink(struct soap*, const void*); #endif #ifndef PALM_2 static int soap_set_error(struct soap*, const char*, const char*, const char*, const char*, int); static int soap_copy_fault(struct soap*, const char*, const char*, const char*, const char*); static int soap_getattrval(struct soap*, char*, size_t, soap_wchar); #endif #ifndef PALM_1 static void soap_free_ns(struct soap *soap); static soap_wchar soap_char(struct soap*); static soap_wchar soap_get_pi(struct soap*); static int soap_isxdigit(int); static void *fplugin(struct soap*, const char*); static size_t soap_count_attachments(struct soap *soap); static int soap_try_connect_command(struct soap*, int http_command, const char *endpoint, const char *action); #ifdef WITH_NTLM static int soap_ntlm_handshake(struct soap *soap, int command, const char *endpoint, const char *host, int port); #endif #ifndef WITH_NOIDREF static int soap_has_copies(struct soap*, const char*, const char*); static void soap_init_iht(struct soap*); static void soap_free_iht(struct soap*); static void soap_init_pht(struct soap*); static void soap_free_pht(struct soap*); #endif #endif #ifndef WITH_LEAN static const char *soap_set_validation_fault(struct soap*, const char*, const char*); static int soap_isnumeric(struct soap*, const char*); static struct soap_nlist *soap_push_ns(struct soap *soap, const char *id, const char *ns, short utilized); static void soap_utilize_ns(struct soap *soap, const char *tag); #endif #ifndef WITH_LEANER #ifndef PALM_1 static struct soap_multipart *soap_new_multipart(struct soap*, struct soap_multipart**, struct soap_multipart**, char*, size_t); static int soap_putdimefield(struct soap*, const char*, size_t); static char *soap_getdimefield(struct soap*, size_t); static void soap_select_mime_boundary(struct soap*); static int soap_valid_mime_boundary(struct soap*); static void soap_resolve_attachment(struct soap*, struct soap_multipart*); #endif #endif #ifdef WITH_GZIP static int soap_getgziphdr(struct soap*); #endif #ifdef WITH_OPENSSL # ifndef SOAP_SSL_RSA_BITS # define SOAP_SSL_RSA_BITS 2048 # endif static int soap_ssl_init_done = 0; static int ssl_auth_init(struct soap*); static int ssl_verify_callback(int, X509_STORE_CTX*); static int ssl_verify_callback_allow_expired_certificate(int, X509_STORE_CTX*); static int ssl_password(char*, int, int, void *); #endif #ifdef WITH_GNUTLS # ifndef SOAP_SSL_RSA_BITS # define SOAP_SSL_RSA_BITS 2048 # endif static int soap_ssl_init_done = 0; static const char *ssl_verify(struct soap *soap, const char *host); # if defined(HAVE_PTHREAD_H) # include /* make GNUTLS thread safe with pthreads */ GCRY_THREAD_OPTION_PTHREAD_IMPL; # elif defined(HAVE_PTH_H) #include /* make GNUTLS thread safe with PTH */ GCRY_THREAD_OPTION_PTH_IMPL; # endif #endif #if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) #ifndef PALM_1 static const char *soap_decode(char*, size_t, const char*, const char*); #endif #endif #ifndef WITH_NOHTTP #ifndef PALM_1 static soap_wchar soap_getchunkchar(struct soap*); static const char *http_error(struct soap*, int); static int http_get(struct soap*); static int http_405(struct soap*); static int http_200(struct soap*); static int http_post(struct soap*, const char*, const char*, int, const char*, const char*, size_t); static int http_send_header(struct soap*, const char*); static int http_post_header(struct soap*, const char*, const char*); static int http_response(struct soap*, int, size_t); static int http_parse(struct soap*); static int http_parse_header(struct soap*, const char*, const char*); #endif #endif #ifndef WITH_NOIO #ifndef PALM_1 static int fsend(struct soap*, const char*, size_t); static size_t frecv(struct soap*, char*, size_t); static int tcp_init(struct soap*); static const char *tcp_error(struct soap*); #ifndef WITH_IPV6 static int tcp_gethost(struct soap*, const char *addr, struct in_addr *inaddr); #endif static SOAP_SOCKET tcp_connect(struct soap*, const char *endpoint, const char *host, int port); static SOAP_SOCKET tcp_accept(struct soap*, SOAP_SOCKET, struct sockaddr*, int*); static int tcp_select(struct soap*, SOAP_SOCKET, int, int); static int tcp_disconnect(struct soap*); static int tcp_closesocket(struct soap*, SOAP_SOCKET); static int tcp_shutdownsocket(struct soap*, SOAP_SOCKET, int); static const char *soap_strerror(struct soap*); #endif #define SOAP_TCP_SELECT_RCV 0x1 #define SOAP_TCP_SELECT_SND 0x2 #define SOAP_TCP_SELECT_ERR 0x4 #define SOAP_TCP_SELECT_ALL 0x7 #if defined(WIN32) #define SOAP_SOCKBLOCK(fd) \ { u_long blocking = 0; \ ioctlsocket(fd, FIONBIO, &blocking); \ } #define SOAP_SOCKNONBLOCK(fd) \ { u_long nonblocking = 1; \ ioctlsocket(fd, FIONBIO, &nonblocking); \ } #elif defined(VXWORKS) #define SOAP_SOCKBLOCK(fd) \ { u_long blocking = 0; \ ioctl(fd, FIONBIO, (int)(&blocking)); \ } #define SOAP_SOCKNONBLOCK(fd) \ { u_long nonblocking = 1; \ ioctl(fd, FIONBIO, (int)(&nonblocking)); \ } #elif defined(__VMS) #define SOAP_SOCKBLOCK(fd) \ { int blocking = 0; \ ioctl(fd, FIONBIO, &blocking); \ } #define SOAP_SOCKNONBLOCK(fd) \ { int nonblocking = 1; \ ioctl(fd, FIONBIO, &nonblocking); \ } #elif defined(PALM) #define SOAP_SOCKBLOCK(fd) fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0)&~O_NONBLOCK); #define SOAP_SOCKNONBLOCK(fd) fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0)|O_NONBLOCK); #elif defined(SYMBIAN) #define SOAP_SOCKBLOCK(fd) \ { long blocking = 0; \ ioctl(fd, 0/*FIONBIO*/, &blocking); \ } #define SOAP_SOCKNONBLOCK(fd) \ { long nonblocking = 1; \ ioctl(fd, 0/*FIONBIO*/, &nonblocking); \ } #else #define SOAP_SOCKBLOCK(fd) fcntl(fd, F_SETFL, fcntl(fd, F_GETFL)&~O_NONBLOCK); #define SOAP_SOCKNONBLOCK(fd) fcntl(fd, F_SETFL, fcntl(fd, F_GETFL)|O_NONBLOCK); #endif #endif #if defined(PALM) && !defined(PALM_2) unsigned short errno; #endif #ifndef PALM_1 static const char soap_env1[42] = "http://schemas.xmlsoap.org/soap/envelope/"; static const char soap_enc1[42] = "http://schemas.xmlsoap.org/soap/encoding/"; static const char soap_env2[40] = "http://www.w3.org/2003/05/soap-envelope"; static const char soap_enc2[40] = "http://www.w3.org/2003/05/soap-encoding"; static const char soap_rpc[35] = "http://www.w3.org/2003/05/soap-rpc"; #endif #ifndef PALM_1 const union soap_double_nan soap_double_nan = {{0xFFFFFFFF, 0xFFFFFFFF}}; const char soap_base64o[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; const char soap_base64i[81] = "\76XXX\77\64\65\66\67\70\71\72\73\74\75XXXXXXX\00\01\02\03\04\05\06\07\10\11\12\13\14\15\16\17\20\21\22\23\24\25\26\27\30\31XXXXXX\32\33\34\35\36\37\40\41\42\43\44\45\46\47\50\51\52\53\54\55\56\57\60\61\62\63"; #endif #ifndef WITH_LEAN static const char soap_indent[11] = "\n\t\t\t\t\t\t\t\t\t"; /* Alternative indentation form for SOAP_XML_INDENT: static const char soap_indent[21] = "\n "; */ #endif #ifndef SOAP_CANARY # define SOAP_CANARY (0xC0DE) #endif static const char soap_padding[4] = "\0\0\0"; #define SOAP_STR_PADDING (soap_padding) #define SOAP_STR_EOS (soap_padding) #define SOAP_NON_NULL (soap_padding) #ifndef WITH_LEAN static const struct soap_code_map html_entity_codes[] = /* entities for XHTML parsing */ { { 160, "nbsp" }, { 161, "iexcl" }, { 162, "cent" }, { 163, "pound" }, { 164, "curren" }, { 165, "yen" }, { 166, "brvbar" }, { 167, "sect" }, { 168, "uml" }, { 169, "copy" }, { 170, "ordf" }, { 171, "laquo" }, { 172, "not" }, { 173, "shy" }, { 174, "reg" }, { 175, "macr" }, { 176, "deg" }, { 177, "plusmn" }, { 178, "sup2" }, { 179, "sup3" }, { 180, "acute" }, { 181, "micro" }, { 182, "para" }, { 183, "middot" }, { 184, "cedil" }, { 185, "sup1" }, { 186, "ordm" }, { 187, "raquo" }, { 188, "frac14" }, { 189, "frac12" }, { 190, "frac34" }, { 191, "iquest" }, { 192, "Agrave" }, { 193, "Aacute" }, { 194, "Acirc" }, { 195, "Atilde" }, { 196, "Auml" }, { 197, "Aring" }, { 198, "AElig" }, { 199, "Ccedil" }, { 200, "Egrave" }, { 201, "Eacute" }, { 202, "Ecirc" }, { 203, "Euml" }, { 204, "Igrave" }, { 205, "Iacute" }, { 206, "Icirc" }, { 207, "Iuml" }, { 208, "ETH" }, { 209, "Ntilde" }, { 210, "Ograve" }, { 211, "Oacute" }, { 212, "Ocirc" }, { 213, "Otilde" }, { 214, "Ouml" }, { 215, "times" }, { 216, "Oslash" }, { 217, "Ugrave" }, { 218, "Uacute" }, { 219, "Ucirc" }, { 220, "Uuml" }, { 221, "Yacute" }, { 222, "THORN" }, { 223, "szlig" }, { 224, "agrave" }, { 225, "aacute" }, { 226, "acirc" }, { 227, "atilde" }, { 228, "auml" }, { 229, "aring" }, { 230, "aelig" }, { 231, "ccedil" }, { 232, "egrave" }, { 233, "eacute" }, { 234, "ecirc" }, { 235, "euml" }, { 236, "igrave" }, { 237, "iacute" }, { 238, "icirc" }, { 239, "iuml" }, { 240, "eth" }, { 241, "ntilde" }, { 242, "ograve" }, { 243, "oacute" }, { 244, "ocirc" }, { 245, "otilde" }, { 246, "ouml" }, { 247, "divide" }, { 248, "oslash" }, { 249, "ugrave" }, { 250, "uacute" }, { 251, "ucirc" }, { 252, "uuml" }, { 253, "yacute" }, { 254, "thorn" }, { 255, "yuml" }, { 0, NULL } }; #endif #ifndef WITH_NOIO #ifndef WITH_LEAN static const struct soap_code_map h_error_codes[] = { #ifdef HOST_NOT_FOUND { HOST_NOT_FOUND, "Host not found" }, #endif #ifdef TRY_AGAIN { TRY_AGAIN, "Try Again" }, #endif #ifdef NO_RECOVERY { NO_RECOVERY, "No Recovery" }, #endif #ifdef NO_DATA { NO_DATA, "No Data" }, #endif #ifdef NO_ADDRESS { NO_ADDRESS, "No Address" }, #endif { 0, NULL } }; #endif #endif #ifndef WITH_NOHTTP #ifndef WITH_LEAN static const struct soap_code_map h_http_error_codes[] = { { 200, "OK" }, { 201, "Created" }, { 202, "Accepted" }, { 203, "Non-Authoritative Information" }, { 204, "No Content" }, { 205, "Reset Content" }, { 206, "Partial Content" }, { 300, "Multiple Choices" }, { 301, "Moved Permanently" }, { 302, "Found" }, { 303, "See Other" }, { 304, "Not Modified" }, { 305, "Use Proxy" }, { 307, "Temporary Redirect" }, { 400, "Bad Request" }, { 401, "Unauthorized" }, { 402, "Payment Required" }, { 403, "Forbidden" }, { 404, "Not Found" }, { 405, "Method Not Allowed" }, { 406, "Not Acceptable" }, { 407, "Proxy Authentication Required" }, { 408, "Request Time-out" }, { 409, "Conflict" }, { 410, "Gone" }, { 411, "Length Required" }, { 412, "Precondition Failed" }, { 413, "Request Entity Too Large" }, { 414, "Request-URI Too Large" }, { 415, "Unsupported Media Type" }, { 416, "Requested range not satisfiable" }, { 417, "Expectation Failed" }, { 500, "Internal Server Error" }, { 501, "Not Implemented" }, { 502, "Bad Gateway" }, { 503, "Service Unavailable" }, { 504, "Gateway Time-out" }, { 505, "HTTP Version not supported" }, { 0, NULL } }; #endif #endif #ifdef WITH_OPENSSL static const struct soap_code_map h_ssl_error_codes[] = { #define _SSL_ERROR(e) { e, #e } _SSL_ERROR(SSL_ERROR_SSL), _SSL_ERROR(SSL_ERROR_ZERO_RETURN), _SSL_ERROR(SSL_ERROR_WANT_READ), _SSL_ERROR(SSL_ERROR_WANT_WRITE), _SSL_ERROR(SSL_ERROR_WANT_CONNECT), _SSL_ERROR(SSL_ERROR_WANT_X509_LOOKUP), _SSL_ERROR(SSL_ERROR_SYSCALL), { 0, NULL } }; #endif #ifndef WITH_LEANER static const struct soap_code_map mime_codes[] = { { SOAP_MIME_7BIT, "7bit" }, { SOAP_MIME_8BIT, "8bit" }, { SOAP_MIME_BINARY, "binary" }, { SOAP_MIME_QUOTED_PRINTABLE, "quoted-printable" }, { SOAP_MIME_BASE64, "base64" }, { SOAP_MIME_IETF_TOKEN, "ietf-token" }, { SOAP_MIME_X_TOKEN, "x-token" }, { 0, NULL } }; #endif #ifdef WIN32 static int tcp_done = 0; #endif #if defined(HP_UX) && defined(HAVE_GETHOSTBYNAME_R) extern int h_errno; #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 static int fsend(struct soap *soap, const char *s, size_t n) { register int nwritten, err; #if defined(__cplusplus) && !defined(WITH_LEAN) && !defined(WITH_COMPAT) if (soap->os) { soap->os->write(s, (std::streamsize)n); if (soap->os->good()) return SOAP_OK; soap->errnum = 0; return SOAP_EOF; } #endif while (n) { if (soap_valid_socket(soap->socket)) { if (soap->send_timeout) { for (;;) { register int r; #ifdef WITH_OPENSSL if (soap->ssl) r = tcp_select(soap, soap->socket, SOAP_TCP_SELECT_ALL, soap->send_timeout); else #endif #ifdef WITH_GNUTLS if (soap->session) r = tcp_select(soap, soap->socket, SOAP_TCP_SELECT_ALL, soap->send_timeout); else #endif r = tcp_select(soap, soap->socket, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, soap->send_timeout); if (r > 0) break; if (!r) return SOAP_EOF; err = soap->errnum; if (!err) return soap->error; if (err != SOAP_EINTR && err != SOAP_EAGAIN && err != SOAP_EWOULDBLOCK) return SOAP_EOF; } } #ifdef WITH_OPENSSL if (soap->ssl) nwritten = SSL_write(soap->ssl, s, (int)n); else if (soap->bio) nwritten = BIO_write(soap->bio, s, (int)n); else #endif #ifdef WITH_GNUTLS if (soap->session) nwritten = gnutls_record_send(soap->session, s, n); else #endif #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) { if (soap->peerlen) nwritten = sendto(soap->socket, (char*)s, (SOAP_WINSOCKINT)n, soap->socket_flags, (struct sockaddr*)&soap->peer, (SOAP_WINSOCKINT)soap->peerlen); else nwritten = send(soap->socket, s, (SOAP_WINSOCKINT)n, soap->socket_flags); /* retry and back-off algorithm */ /* TODO: this is not very clear from specs so verify and limit conditions under which we should loop (e.g. ENOBUFS) */ if (nwritten < 0) { int udp_repeat; int udp_delay; if ((soap->connect_flags & SO_BROADCAST)) udp_repeat = 2; /* SOAP-over-UDP MULTICAST_UDP_REPEAT - 1 */ else udp_repeat = 1; /* SOAP-over-UDP UNICAST_UDP_REPEAT - 1 */ udp_delay = ((unsigned int)soap_random % 201) + 50; /* UDP_MIN_DELAY .. UDP_MAX_DELAY */ do { tcp_select(soap, soap->socket, SOAP_TCP_SELECT_ERR, -1000 * udp_delay); if (soap->peerlen) nwritten = sendto(soap->socket, (char*)s, (SOAP_WINSOCKINT)n, soap->socket_flags, (struct sockaddr*)&soap->peer, (SOAP_WINSOCKINT)soap->peerlen); else nwritten = send(soap->socket, s, (SOAP_WINSOCKINT)n, soap->socket_flags); udp_delay <<= 1; if (udp_delay > 500) /* UDP_UPPER_DELAY */ udp_delay = 500; } while (nwritten < 0 && --udp_repeat > 0); } } else #endif #if !defined(PALM) && !defined(AS400) nwritten = send(soap->socket, s, (int)n, soap->socket_flags); #else nwritten = send(soap->socket, (void*)s, n, soap->socket_flags); #endif if (nwritten <= 0) { register int r = 0; err = soap_socket_errno(soap->socket); #ifdef WITH_OPENSSL if (soap->ssl && (r = SSL_get_error(soap->ssl, nwritten)) != SSL_ERROR_NONE && r != SSL_ERROR_WANT_READ && r != SSL_ERROR_WANT_WRITE) { soap->errnum = err; return SOAP_EOF; } #endif #ifdef WITH_GNUTLS if (soap->session) { if (nwritten == GNUTLS_E_INTERRUPTED) err = SOAP_EINTR; else if (nwritten == GNUTLS_E_AGAIN) err = SOAP_EAGAIN; } #endif if (err == SOAP_EWOULDBLOCK || err == SOAP_EAGAIN) { #if defined(WITH_OPENSSL) if (soap->ssl && r == SSL_ERROR_WANT_READ) r = tcp_select(soap, soap->socket, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, soap->send_timeout ? soap->send_timeout : -10000); else #elif defined(WITH_GNUTLS) if (soap->session && !gnutls_record_get_direction(soap->session)) r = tcp_select(soap, soap->socket, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, soap->send_timeout ? soap->send_timeout : -10000); else #endif r = tcp_select(soap, soap->socket, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, soap->send_timeout ? soap->send_timeout : -10000); if (!r && soap->send_timeout) return SOAP_EOF; if (r < 0 && soap->errnum != SOAP_EINTR) return SOAP_EOF; } else if (err && err != SOAP_EINTR) { soap->errnum = err; return SOAP_EOF; } nwritten = 0; /* and call write() again */ } } else { #ifdef WITH_FASTCGI nwritten = fwrite((void*)s, 1, n, stdout); fflush(stdout); #else #ifdef UNDER_CE nwritten = fwrite(s, 1, n, soap->sendfd); #else #ifdef VXWORKS #ifdef WMW_RPM_IO if (soap->rpmreqid) nwritten = (httpBlockPut(soap->rpmreqid, (char*)s, n) == 0) ? n : -1; else #endif nwritten = fwrite(s, sizeof(char), n, fdopen(soap->sendfd, "w")); #else #ifdef WIN32 nwritten = _write(soap->sendfd, s, (unsigned int)n); #else nwritten = write(soap->sendfd, s, (unsigned int)n); #endif #endif #endif #endif if (nwritten <= 0) { #ifndef WITH_FASTCGI err = soap_errno; #else err = EOF; #endif if (err && err != SOAP_EINTR && err != SOAP_EWOULDBLOCK && err != SOAP_EAGAIN) { soap->errnum = err; return SOAP_EOF; } nwritten = 0; /* and call write() again */ } } n -= nwritten; s += nwritten; } return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_send_raw(struct soap *soap, const char *s, size_t n) { if (!n) return SOAP_OK; #ifndef WITH_LEANER if (soap->fpreparesend && (soap->mode & SOAP_IO) != SOAP_IO_STORE && (soap->mode & SOAP_IO_LENGTH) && (soap->error = soap->fpreparesend(soap, s, n))) return soap->error; if (soap->ffiltersend && (soap->error = soap->ffiltersend(soap, &s, &n))) return soap->error; #endif if (soap->mode & SOAP_IO_LENGTH) soap->count += n; else if (soap->mode & SOAP_IO) { register size_t i = SOAP_BUFLEN - soap->bufidx; while (n >= i) { memcpy(soap->buf + soap->bufidx, s, i); soap->bufidx = SOAP_BUFLEN; if (soap_flush(soap)) return soap->error; s += i; n -= i; i = SOAP_BUFLEN; } memcpy(soap->buf + soap->bufidx, s, n); soap->bufidx += n; } else return soap_flush_raw(soap, s, n); return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_flush(struct soap *soap) { register size_t n = soap->bufidx; if (n) { #ifndef WITH_LEANER if ((soap->mode & SOAP_IO) == SOAP_IO_STORE) { register int r; if (soap->fpreparesend && (r = soap->fpreparesend(soap, soap->buf, n))) return soap->error = r; } #endif soap->bufidx = 0; #ifdef WITH_ZLIB if (soap->mode & SOAP_ENC_ZLIB) { soap->d_stream->next_in = (Byte*)soap->buf; soap->d_stream->avail_in = (unsigned int)n; #ifdef WITH_GZIP soap->z_crc = crc32(soap->z_crc, (Byte*)soap->buf, (unsigned int)n); #endif do { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Deflating %u bytes\n", soap->d_stream->avail_in)); if (deflate(soap->d_stream, Z_NO_FLUSH) != Z_OK) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unable to deflate: %s\n", soap->d_stream->msg ? soap->d_stream->msg : SOAP_STR_EOS)); return soap->error = SOAP_ZLIB_ERROR; } if (!soap->d_stream->avail_out) { if (soap_flush_raw(soap, soap->z_buf, SOAP_BUFLEN)) return soap->error; soap->d_stream->next_out = (Byte*)soap->z_buf; soap->d_stream->avail_out = SOAP_BUFLEN; } } while (soap->d_stream->avail_in); } else #endif return soap_flush_raw(soap, soap->buf, n); } return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_flush_raw(struct soap *soap, const char *s, size_t n) { if ((soap->mode & SOAP_IO) == SOAP_IO_STORE) { register char *t; if (!(t = (char*)soap_push_block(soap, NULL, n))) return soap->error = SOAP_EOM; memcpy(t, s, n); return SOAP_OK; } #ifndef WITH_LEANER if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK) { char t[16]; sprintf(t, "\r\n%lX\r\n" + (soap->chunksize ? 0 : 2), (unsigned long)n); DBGMSG(SENT, t, strlen(t)); if ((soap->error = soap->fsend(soap, t, strlen(t)))) return soap->error; soap->chunksize += n; } DBGMSG(SENT, s, n); #endif return soap->error = soap->fsend(soap, s, n); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_send(struct soap *soap, const char *s) { if (s) return soap_send_raw(soap, s, strlen(s)); return SOAP_OK; } #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_send2(struct soap *soap, const char *s1, const char *s2) { if (soap_send(soap, s1)) return soap->error; return soap_send(soap, s2); } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_send3(struct soap *soap, const char *s1, const char *s2, const char *s3) { if (soap_send(soap, s1) || soap_send(soap, s2)) return soap->error; return soap_send(soap, s3); } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 static size_t frecv(struct soap *soap, char *s, size_t n) { register int r; register int retries = 100; /* max 100 retries with non-blocking sockets */ soap->errnum = 0; #if defined(__cplusplus) && !defined(WITH_LEAN) && !defined(WITH_COMPAT) if (soap->is) { if (soap->is->good()) return soap->is->read(s, (std::streamsize)n).gcount(); return 0; } #endif if (soap_valid_socket(soap->socket)) { for (;;) { #ifdef WITH_OPENSSL register int err = 0; #endif #ifdef WITH_OPENSSL if (soap->recv_timeout && !soap->ssl) /* SSL: sockets are nonblocking */ #else if (soap->recv_timeout) #endif { for (;;) { r = tcp_select(soap, soap->socket, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, soap->recv_timeout); if (r > 0) break; if (!r) return 0; r = soap->errnum; if (r != SOAP_EINTR && r != SOAP_EAGAIN && r != SOAP_EWOULDBLOCK) return 0; } } #ifdef WITH_OPENSSL if (soap->ssl) { r = SSL_read(soap->ssl, s, (int)n); if (r > 0) return (size_t)r; err = SSL_get_error(soap->ssl, r); if (err != SSL_ERROR_NONE && err != SSL_ERROR_WANT_READ && err != SSL_ERROR_WANT_WRITE) return 0; } else if (soap->bio) { r = BIO_read(soap->bio, s, (int)n); if (r > 0) return (size_t)r; return 0; } else #endif #ifdef WITH_GNUTLS if (soap->session) { r = (int)gnutls_record_recv(soap->session, s, n); if (r >= 0) return (size_t)r; } else #endif { #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) { SOAP_SOCKLEN_T k = (SOAP_SOCKLEN_T)sizeof(soap->peer); memset((void*)&soap->peer, 0, sizeof(soap->peer)); r = recvfrom(soap->socket, s, (SOAP_WINSOCKINT)n, soap->socket_flags, (struct sockaddr*)&soap->peer, &k); /* portability note: see SOAP_SOCKLEN_T definition in stdsoap2.h */ soap->peerlen = (size_t)k; #ifndef WITH_IPV6 soap->ip = ntohl(soap->peer.sin_addr.s_addr); #endif } else #endif r = recv(soap->socket, s, (int)n, soap->socket_flags); #ifdef PALM /* CycleSyncDisplay(curStatusMsg); */ #endif if (r >= 0) return (size_t)r; r = soap_socket_errno(soap->socket); if (r != SOAP_EINTR && r != SOAP_EAGAIN && r != SOAP_EWOULDBLOCK) { soap->errnum = r; return 0; } } #if defined(WITH_OPENSSL) if (soap->ssl && err == SSL_ERROR_WANT_WRITE) r = tcp_select(soap, soap->socket, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, soap->recv_timeout ? soap->recv_timeout : 5); else #elif defined(WITH_GNUTLS) if (soap->session && gnutls_record_get_direction(soap->session)) r = tcp_select(soap, soap->socket, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, soap->recv_timeout ? soap->recv_timeout : 5); else #endif r = tcp_select(soap, soap->socket, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, soap->recv_timeout ? soap->recv_timeout : 5); if (!r && soap->recv_timeout) return 0; if (r < 0) { r = soap->errnum; if (r != SOAP_EINTR && r != SOAP_EAGAIN && r != SOAP_EWOULDBLOCK) return 0; } if (retries-- <= 0) return 0; #ifdef PALM r = soap_socket_errno(soap->socket); if (r != SOAP_EINTR && retries-- <= 0) { soap->errnum = r; return 0; } #endif } } #ifdef WITH_FASTCGI return fread(s, 1, n, stdin); #else #ifdef UNDER_CE return fread(s, 1, n, soap->recvfd); #else #ifdef WMW_RPM_IO if (soap->rpmreqid) r = httpBlockRead(soap->rpmreqid, s, n); else #endif #ifdef WIN32 r = _read(soap->recvfd, s, (unsigned int)n); #else r = read(soap->recvfd, s, (unsigned int)n); #endif if (r >= 0) return (size_t)r; soap->errnum = soap_errno; return 0; #endif #endif } #endif #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 static soap_wchar soap_getchunkchar(struct soap *soap) { if (soap->bufidx < soap->buflen) return soap->buf[soap->bufidx++]; soap->bufidx = 0; soap->buflen = soap->chunkbuflen = soap->frecv(soap, soap->buf, SOAP_BUFLEN); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Read %u bytes from socket=%d/fd=%d\n", (unsigned int)soap->buflen, soap->socket, soap->recvfd)); DBGMSG(RECV, soap->buf, soap->buflen); if (soap->buflen) return soap->buf[soap->bufidx++]; return EOF; } #endif #endif /******************************************************************************/ #ifndef PALM_1 static int soap_isxdigit(int c) { return (c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f'); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_recv_raw(struct soap *soap) { register size_t ret; #if !defined(WITH_LEANER) || defined(WITH_ZLIB) register int r; #endif #ifdef WITH_ZLIB if (soap->mode & SOAP_ENC_ZLIB) { if (soap->d_stream->next_out == Z_NULL) { soap->bufidx = soap->buflen = 0; return EOF; } if (soap->d_stream->avail_in || !soap->d_stream->avail_out) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflating\n")); soap->d_stream->next_out = (Byte*)soap->buf; soap->d_stream->avail_out = SOAP_BUFLEN; r = inflate(soap->d_stream, Z_NO_FLUSH); if (r == Z_NEED_DICT && soap->z_dict) r = inflateSetDictionary(soap->d_stream, (const Bytef*)soap->z_dict, soap->z_dict_len); if (r == Z_OK || r == Z_STREAM_END) { soap->bufidx = 0; ret = soap->buflen = SOAP_BUFLEN - soap->d_stream->avail_out; if (soap->zlib_in == SOAP_ZLIB_GZIP) soap->z_crc = crc32(soap->z_crc, (Byte*)soap->buf, (unsigned int)ret); if (r == Z_STREAM_END) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflated %lu->%lu bytes\n", soap->d_stream->total_in, soap->d_stream->total_out)); soap->z_ratio_in = (float)soap->d_stream->total_in / (float)soap->d_stream->total_out; soap->d_stream->next_out = Z_NULL; } if (ret) { soap->count += ret; DBGLOG(RECV, SOAP_MESSAGE(fdebug, "\n---- decompressed ----\n")); DBGMSG(RECV, soap->buf, ret); DBGLOG(RECV, SOAP_MESSAGE(fdebug, "\n----\n")); #ifndef WITH_LEANER if (soap->fpreparerecv && (r = soap->fpreparerecv(soap, soap->buf, ret))) return soap->error = r; #endif return SOAP_OK; } } else if (r != Z_BUF_ERROR) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflate error: %s\n", soap->d_stream->msg ? soap->d_stream->msg : SOAP_STR_EOS)); soap->d_stream->next_out = Z_NULL; return soap->error = SOAP_ZLIB_ERROR; } } zlib_again: if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK && !soap->chunksize) { memcpy(soap->buf, soap->z_buf, SOAP_BUFLEN); soap->buflen = soap->z_buflen; } DBGLOG(RECV, SOAP_MESSAGE(fdebug, "\n---- compressed ----\n")); } #endif #ifndef WITH_NOHTTP if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK) /* read HTTP chunked transfer */ { for (;;) { register soap_wchar c; char *t, tmp[17]; if (soap->chunksize) { soap->buflen = ret = soap->frecv(soap, soap->buf, soap->chunksize > SOAP_BUFLEN ? SOAP_BUFLEN : soap->chunksize); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Getting chunk: read %u bytes\n", (unsigned int)ret)); DBGMSG(RECV, soap->buf, ret); soap->bufidx = 0; soap->chunksize -= ret; break; } t = tmp; if (!soap->chunkbuflen) { soap->chunkbuflen = ret = soap->frecv(soap, soap->buf, SOAP_BUFLEN); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Read %u bytes (chunked) from socket %d\n", (unsigned int)ret, soap->socket)); DBGMSG(RECV, soap->buf, ret); soap->bufidx = 0; if (!ret) { soap->ahead = EOF; return EOF; } } else soap->bufidx = soap->buflen; soap->buflen = soap->chunkbuflen; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Getting chunk size (idx=%u len=%u)\n", (unsigned int)soap->bufidx, (unsigned int)soap->buflen)); while (!soap_isxdigit((int)(c = soap_getchunkchar(soap)))) { if ((int)c == EOF) { soap->ahead = EOF; return EOF; } } do *t++ = (char)c; while (soap_isxdigit((int)(c = soap_getchunkchar(soap))) && (size_t)(t - tmp) < sizeof(tmp)-1); while ((int)c != EOF && c != '\n') c = soap_getchunkchar(soap); if ((int)c == EOF) { soap->ahead = EOF; return EOF; } *t = '\0'; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Chunk size = %s (hex)\n", tmp)); soap->chunksize = (size_t)soap_strtoul(tmp, &t, 16); if (!soap->chunksize) { soap->bufidx = soap->buflen = soap->chunkbuflen = 0; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of chunked message\n")); while ((int)c != EOF && c != '\n') c = soap_getchunkchar(soap); ret = 0; soap->ahead = EOF; break; } soap->buflen = soap->bufidx + soap->chunksize; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Moving buf len to idx=%u len=%u (%s)\n", (unsigned int)soap->bufidx, (unsigned int)soap->buflen, tmp)); if (soap->buflen > soap->chunkbuflen) { soap->buflen = soap->chunkbuflen; soap->chunksize -= soap->buflen - soap->bufidx; soap->chunkbuflen = 0; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Passed end of buffer for chunked HTTP (%u bytes left)\n", (unsigned int)(soap->buflen - soap->bufidx))); } else if (soap->chunkbuflen) soap->chunksize = 0; ret = soap->buflen - soap->bufidx; if (ret) break; } } else #endif { soap->bufidx = 0; soap->buflen = ret = soap->frecv(soap, soap->buf, SOAP_BUFLEN); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Read %u bytes from socket=%d/fd=%d\n", (unsigned int)ret, soap->socket, soap->recvfd)); DBGMSG(RECV, soap->buf, ret); } #ifdef WITH_ZLIB if (soap->mode & SOAP_ENC_ZLIB) { memcpy(soap->z_buf, soap->buf, SOAP_BUFLEN); soap->d_stream->next_in = (Byte*)(soap->z_buf + soap->bufidx); soap->d_stream->avail_in = (unsigned int)ret; soap->d_stream->next_out = (Byte*)soap->buf; soap->d_stream->avail_out = SOAP_BUFLEN; r = inflate(soap->d_stream, Z_NO_FLUSH); if (r == Z_NEED_DICT && soap->z_dict) r = inflateSetDictionary(soap->d_stream, (const Bytef*)soap->z_dict, soap->z_dict_len); if (r == Z_OK || r == Z_STREAM_END) { soap->bufidx = 0; soap->z_buflen = soap->buflen; soap->buflen = SOAP_BUFLEN - soap->d_stream->avail_out; if (soap->zlib_in == SOAP_ZLIB_GZIP) soap->z_crc = crc32(soap->z_crc, (Byte*)soap->buf, (unsigned int)soap->buflen); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflated %u bytes\n", (unsigned int)soap->buflen)); if (ret && !soap->buflen && r != Z_STREAM_END) goto zlib_again; ret = soap->buflen; if (r == Z_STREAM_END) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflated total %lu->%lu bytes\n", soap->d_stream->total_in, soap->d_stream->total_out)); soap->z_ratio_in = (float)soap->d_stream->total_in / (float)soap->d_stream->total_out; soap->d_stream->next_out = Z_NULL; } DBGLOG(RECV, SOAP_MESSAGE(fdebug, "\n---- decompressed ----\n")); DBGMSG(RECV, soap->buf, ret); #ifndef WITH_LEANER if (soap->fpreparerecv && (r = soap->fpreparerecv(soap, soap->buf, ret))) return soap->error = r; #endif } else { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unable to inflate: (%d) %s\n", r, soap->d_stream->msg ? soap->d_stream->msg : SOAP_STR_EOS)); soap->d_stream->next_out = Z_NULL; return soap->error = SOAP_ZLIB_ERROR; } } #endif #ifndef WITH_LEANER if (soap->fpreparerecv #ifdef WITH_ZLIB && soap->zlib_in == SOAP_ZLIB_NONE #endif && (r = soap->fpreparerecv(soap, soap->buf + soap->bufidx, ret))) return soap->error = r; #endif soap->count += ret; return !ret; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_recv(struct soap *soap) { #ifndef WITH_LEANER if (soap->mode & SOAP_ENC_DIME) { if (soap->dime.buflen) { char *s; int i; unsigned char tmp[12]; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DIME hdr for chunked DIME is in buffer\n")); soap->count += soap->dime.buflen - soap->buflen; soap->buflen = soap->dime.buflen; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Skip padding (%ld bytes)\n", -(long)soap->dime.size&3)); for (i = -(long)soap->dime.size&3; i > 0; i--) { soap->bufidx++; if (soap->bufidx >= soap->buflen) if (soap_recv_raw(soap)) return EOF; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get DIME hdr for next chunk\n")); s = (char*)tmp; for (i = 12; i > 0; i--) { *s++ = soap->buf[soap->bufidx++]; if (soap->bufidx >= soap->buflen) if (soap_recv_raw(soap)) return EOF; } soap->dime.flags = tmp[0] & 0x7; soap->dime.size = ((size_t)tmp[8] << 24) | ((size_t)tmp[9] << 16) | ((size_t)tmp[10] << 8) | ((size_t)tmp[11]); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get DIME chunk (%u bytes)\n", (unsigned int)soap->dime.size)); if (soap->dime.flags & SOAP_DIME_CF) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "More chunking\n")); soap->dime.chunksize = soap->dime.size; if (soap->buflen - soap->bufidx >= soap->dime.size) { soap->dime.buflen = soap->buflen; soap->buflen = soap->bufidx + soap->dime.chunksize; } else soap->dime.chunksize -= soap->buflen - soap->bufidx; } else { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Last chunk\n")); soap->dime.buflen = 0; soap->dime.chunksize = 0; } soap->count = soap->buflen - soap->bufidx; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%u bytes remaining\n", (unsigned int)soap->count)); return SOAP_OK; } if (soap->dime.chunksize) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get next DIME hdr for chunked DIME (%u bytes chunk)\n", (unsigned int)soap->dime.chunksize)); if (soap_recv_raw(soap)) return EOF; if (soap->buflen - soap->bufidx >= soap->dime.chunksize) { soap->dime.buflen = soap->buflen; soap->count -= soap->buflen - soap->bufidx - soap->dime.chunksize; soap->buflen = soap->bufidx + soap->dime.chunksize; } else soap->dime.chunksize -= soap->buflen - soap->bufidx; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%lu bytes remaining, count=%lu\n", (unsigned long)(soap->buflen-soap->bufidx), (unsigned long)soap->count)); return SOAP_OK; } } while (soap->ffilterrecv) { int err = soap->filterstop; if (err) soap->bufidx = soap->buflen = 0; else err = soap_recv_raw(soap); /* do not call again after EOF */ if ((soap->error = soap->ffilterrecv(soap, soap->buf, &soap->buflen, sizeof(soap->buf)))) return soap->error; if (soap->buflen) { soap->filterstop = err; return SOAP_OK; } if (err) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Returning postponed error %d\n", err)); return err; } } #endif return soap_recv_raw(soap); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 soap_wchar SOAP_FMAC2 soap_getchar(struct soap *soap) { register soap_wchar c; c = soap->ahead; if (c) { if (c != EOF) soap->ahead = 0; return c; } return soap_get1(soap); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 const struct soap_code_map* SOAP_FMAC2 soap_code(const struct soap_code_map *code_map, const char *str) { if (code_map && str) { while (code_map->string) { if (!strcmp(str, code_map->string)) /* case sensitive */ return code_map; code_map++; } } return NULL; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 long SOAP_FMAC2 soap_code_int(const struct soap_code_map *code_map, const char *str, long other) { if (code_map) { while (code_map->string) { if (!soap_tag_cmp(str, code_map->string)) /* case insensitive */ return code_map->code; code_map++; } } return other; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 const char* SOAP_FMAC2 soap_code_str(const struct soap_code_map *code_map, long code) { if (!code_map) return NULL; while (code_map->code != code && code_map->string) code_map++; return code_map->string; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 long SOAP_FMAC2 soap_code_bits(const struct soap_code_map *code_map, const char *str) { register long bits = 0; if (code_map) { while (str && *str) { const struct soap_code_map *p; for (p = code_map; p->string; p++) { register size_t n = strlen(p->string); if (!strncmp(p->string, str, n) && soap_blank((soap_wchar)str[n])) { bits |= p->code; str += n; while (*str > 0 && *str <= 32) str++; break; } } if (!p->string) return 0; } } return bits; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 const char* SOAP_FMAC2 soap_code_list(struct soap *soap, const struct soap_code_map *code_map, long code) { register char *t = soap->tmpbuf; if (code_map) { while (code_map->string) { if (code_map->code & code) { register const char *s = code_map->string; if (t != soap->tmpbuf) *t++ = ' '; while (*s && t < soap->tmpbuf + sizeof(soap->tmpbuf) - 1) *t++ = *s++; if (t == soap->tmpbuf + sizeof(soap->tmpbuf) - 1) break; } code_map++; } } *t = '\0'; return soap->tmpbuf; } #endif /******************************************************************************/ #ifndef PALM_1 static soap_wchar soap_char(struct soap *soap) { char tmp[8]; register int i; register soap_wchar c; register char *s = tmp; for (i = 0; i < 7; i++) { c = soap_get1(soap); if (c == ';' || (int)c == EOF) break; *s++ = (char)c; } *s = '\0'; if (*tmp == '#') { if (tmp[1] == 'x' || tmp[1] == 'X') return (soap_wchar)soap_strtol(tmp + 2, NULL, 16); return (soap_wchar)soap_strtol(tmp + 1, NULL, 10); } if (!strcmp(tmp, "lt")) return '<'; if (!strcmp(tmp, "gt")) return '>'; if (!strcmp(tmp, "amp")) return '&'; if (!strcmp(tmp, "quot")) return '"'; if (!strcmp(tmp, "apos")) return '\''; #ifndef WITH_LEAN return (soap_wchar)soap_code_int(html_entity_codes, tmp, SOAP_UNKNOWN_CHAR); #else return SOAP_UNKNOWN_CHAR; /* use this to represent unknown code */ #endif } #endif /******************************************************************************/ #ifdef WITH_LEAN #ifndef PALM_1 soap_wchar soap_get0(struct soap *soap) { if (soap->bufidx >= soap->buflen && soap_recv(soap)) return EOF; return (unsigned char)soap->buf[soap->bufidx]; } #endif #endif /******************************************************************************/ #ifdef WITH_LEAN #ifndef PALM_1 soap_wchar soap_get1(struct soap *soap) { if (soap->bufidx >= soap->buflen && soap_recv(soap)) return EOF; return (unsigned char)soap->buf[soap->bufidx++]; } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 soap_wchar SOAP_FMAC2 soap_get(struct soap *soap) { register soap_wchar c; c = soap->ahead; if (c) { if ((int)c != EOF) soap->ahead = 0; } else c = soap_get1(soap); while ((int)c != EOF) { if (soap->cdata) { if (c == ']') { c = soap_get1(soap); if (c == ']') { c = soap_get0(soap); if (c == '>') { soap->cdata = 0; c = soap_get1(soap); c = soap_get1(soap); } else { soap_unget(soap, ']'); return ']'; } } else { soap_revget1(soap); return ']'; } } else return c; } switch (c) { case '<': do c = soap_get1(soap); while (soap_blank(c)); if (c == '!' || c == '?' || c == '%') { register int k = 1; if (c == '!') { c = soap_get1(soap); if (c == '[') { do c = soap_get1(soap); while ((int)c != EOF && c != '['); if ((int)c == EOF) break; soap->cdata = 1; c = soap_get1(soap); continue; } if (c == '-' && (c = soap_get1(soap)) == '-') { do { c = soap_get1(soap); if (c == '-' && (c = soap_get1(soap)) == '-') break; } while ((int)c != EOF); } } else if (c == '?') c = soap_get_pi(soap); while ((int)c != EOF) { if (c == '<') k++; else if (c == '>') { if (--k <= 0) break; } c = soap_get1(soap); } if ((int)c == EOF) break; c = soap_get1(soap); continue; } if (c == '/') return SOAP_TT; soap_revget1(soap); return SOAP_LT; case '>': return SOAP_GT; case '"': return SOAP_QT; case '\'': return SOAP_AP; case '&': return soap_char(soap) | 0x80000000; } break; } return c; } #endif /******************************************************************************/ #ifndef PALM_1 static soap_wchar soap_get_pi(struct soap *soap) { char buf[64]; register char *s = buf; register int i = sizeof(buf); register soap_wchar c = soap_getchar(soap); /* This is a quick way to parse XML PI and we could use a callback instead to * enable applications to intercept processing instructions */ while ((int)c != EOF && c != '?') { if (--i > 0) { if (soap_blank(c)) c = ' '; *s++ = (char)c; } c = soap_getchar(soap); } *s = '\0'; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "XML PI \n", buf)); if (!strncmp(buf, "xml ", 4)) { s = strstr(buf, " encoding="); if (s && s[10]) { if (!soap_tag_cmp(s + 11, "iso-8859-1*") || !soap_tag_cmp(s + 11, "latin1*")) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Switching to latin1 encoding\n")); soap->mode |= SOAP_ENC_LATIN; } else if (!soap_tag_cmp(s + 11, "utf-8*")) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Switching to utf-8 encoding\n")); soap->mode &= ~SOAP_ENC_LATIN; } } } if ((int)c != EOF) c = soap_getchar(soap); return c; } #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_move(struct soap *soap, long n) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Moving %ld bytes forward\n", (long)n)); for (; n > 0; n--) if ((int)soap_getchar(soap) == EOF) return SOAP_EOF; return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 size_t SOAP_FMAC2 soap_tell(struct soap *soap) { return soap->count - soap->buflen + soap->bufidx - (soap->ahead != 0); } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_pututf8(struct soap *soap, register unsigned long c) { char tmp[16]; if (c < 0x80 && c > 0) { *tmp = (char)c; return soap_send_raw(soap, tmp, 1); } #ifndef WITH_LEAN if (c >= 0x80) { register char *t = tmp; if (c < 0x0800) *t++ = (char)(0xC0 | ((c >> 6) & 0x1F)); else { if (c < 0x010000) *t++ = (char)(0xE0 | ((c >> 12) & 0x0F)); else { if (c < 0x200000) *t++ = (char)(0xF0 | ((c >> 18) & 0x07)); else { if (c < 0x04000000) *t++ = (char)(0xF8 | ((c >> 24) & 0x03)); else { *t++ = (char)(0xFC | ((c >> 30) & 0x01)); *t++ = (char)(0x80 | ((c >> 24) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 18) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 12) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 6) & 0x3F)); } *t++ = (char)(0x80 | (c & 0x3F)); *t = '\0'; } #else sprintf(tmp, "&#%lu;", c); #endif return soap_send(soap, tmp); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 soap_wchar SOAP_FMAC2 soap_getutf8(struct soap *soap) { register soap_wchar c, c1, c2, c3, c4; c = soap->ahead; if (c) soap->ahead = 0; else c = soap_get(soap); if (c < 0x80 || c > 0xFF || (soap->mode & SOAP_ENC_LATIN)) return c; c1 = soap_get1(soap); if (c1 < 0x80) { soap_revget1(soap); /* doesn't look like this is UTF8 */ return c; } c1 &= 0x3F; if (c < 0xE0) return ((soap_wchar)(c & 0x1F) << 6) | c1; c2 = (soap_wchar)soap_get1(soap) & 0x3F; if (c < 0xF0) return ((soap_wchar)(c & 0x0F) << 12) | (c1 << 6) | c2; c3 = (soap_wchar)soap_get1(soap) & 0x3F; if (c < 0xF8) return ((soap_wchar)(c & 0x07) << 18) | (c1 << 12) | (c2 << 6) | c3; c4 = (soap_wchar)soap_get1(soap) & 0x3F; if (c < 0xFC) return ((soap_wchar)(c & 0x03) << 24) | (c1 << 18) | (c2 << 12) | (c3 << 6) | c4; return ((soap_wchar)(c & 0x01) << 30) | (c1 << 24) | (c2 << 18) | (c3 << 12) | (c4 << 6) | (soap_wchar)(soap_get1(soap) & 0x3F); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_puthex(struct soap *soap, const unsigned char *s, int n) { char d[2]; register int i; #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { if (!(soap->dom->data = soap_s2hex(soap, s, NULL, n))) return soap->error; return SOAP_OK; } #endif for (i = 0; i < n; i++) { register int m = *s++; d[0] = (char)((m >> 4) + (m > 159 ? '7' : '0')); m &= 0x0F; d[1] = (char)(m + (m > 9 ? '7' : '0')); if (soap_send_raw(soap, d, 2)) return soap->error; } return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 unsigned char* SOAP_FMAC2 soap_gethex(struct soap *soap, int *n) { #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { soap->dom->data = soap_string_in(soap, 0, -1, -1); return (unsigned char*)soap_hex2s(soap, soap->dom->data, NULL, 0, n); } #endif #ifdef WITH_FAST soap->labidx = 0; for (;;) { register char *s; register size_t i, k; if (soap_append_lab(soap, NULL, 0)) return NULL; s = soap->labbuf + soap->labidx; k = soap->lablen - soap->labidx; soap->labidx = soap->lablen; for (i = 0; i < k; i++) { register char d1, d2; register soap_wchar c; c = soap_get(soap); if (soap_isxdigit(c)) { d1 = (char)c; c = soap_get(soap); if (soap_isxdigit(c)) d2 = (char)c; else { soap->error = SOAP_TYPE; return NULL; } } else { unsigned char *p; soap_unget(soap, c); if (n) *n = (int)(soap->lablen + i - k); p = (unsigned char*)soap_malloc(soap, soap->lablen + i - k); if (p) memcpy(p, soap->labbuf, soap->lablen + i - k); return p; } *s++ = (char)(((d1 >= 'A' ? (d1 & 0x7) + 9 : d1 - '0') << 4) + (d2 >= 'A' ? (d2 & 0x7) + 9 : d2 - '0')); } } #else if (soap_new_block(soap) == NULL) return NULL; for (;;) { register int i; register char *s = (char*)soap_push_block(soap, NULL, SOAP_BLKLEN); if (!s) { soap_end_block(soap, NULL); return NULL; } for (i = 0; i < SOAP_BLKLEN; i++) { register char d1, d2; register soap_wchar c = soap_get(soap); if (soap_isxdigit(c)) { d1 = (char)c; c = soap_get(soap); if (soap_isxdigit(c)) d2 = (char)c; else { soap_end_block(soap, NULL); soap->error = SOAP_TYPE; return NULL; } } else { unsigned char *p; soap_unget(soap, c); if (n) *n = (int)soap_size_block(soap, NULL, i); p = (unsigned char*)soap_save_block(soap, NULL, 0); return p; } *s++ = ((d1 >= 'A' ? (d1 & 0x7) + 9 : d1 - '0') << 4) + (d2 >= 'A' ? (d2 & 0x7) + 9 : d2 - '0'); } } #endif } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_putbase64(struct soap *soap, const unsigned char *s, int n) { register int i; register unsigned long m; char d[4]; if (!s) return SOAP_OK; #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { if (!(soap->dom->data = soap_s2base64(soap, s, NULL, n))) return soap->error; return SOAP_OK; } #endif for (; n > 2; n -= 3, s += 3) { m = s[0]; m = (m << 8) | s[1]; m = (m << 8) | s[2]; for (i = 4; i > 0; m >>= 6) d[--i] = soap_base64o[m & 0x3F]; if (soap_send_raw(soap, d, 4)) return soap->error; } if (n > 0) { m = 0; for (i = 0; i < n; i++) m = (m << 8) | *s++; for (; i < 3; i++) m <<= 8; for (i++; i > 0; m >>= 6) d[--i] = soap_base64o[m & 0x3F]; for (i = 3; i > n; i--) d[i] = '='; if (soap_send_raw(soap, d, 4)) return soap->error; } return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 unsigned char* SOAP_FMAC2 soap_getbase64(struct soap *soap, int *n, int malloc_flag) { (void)malloc_flag; #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { soap->dom->data = soap_string_in(soap, 0, -1, -1); return (unsigned char*)soap_base642s(soap, soap->dom->data, NULL, 0, n); } #endif #ifdef WITH_FAST soap->labidx = 0; for (;;) { register size_t i, k; register char *s; if (soap_append_lab(soap, NULL, 2)) return NULL; s = soap->labbuf + soap->labidx; k = soap->lablen - soap->labidx; soap->labidx = 3 * (soap->lablen / 3); if (!s) return NULL; if (k > 2) { for (i = 0; i < k - 2; i += 3) { register unsigned long m = 0; register int j = 0; do { register soap_wchar c = soap_get(soap); if (c < SOAP_AP) c &= 0x7FFFFFFF; if (c == '=' || c < 0) { unsigned char *p; switch (j) { case 2: *s++ = (char)((m >> 4) & 0xFF); i++; break; case 3: *s++ = (char)((m >> 10) & 0xFF); *s++ = (char)((m >> 2) & 0xFF); i += 2; } if (n) *n = (int)(soap->lablen + i - k); p = (unsigned char*)soap_malloc(soap, soap->lablen + i - k); if (p) memcpy(p, soap->labbuf, soap->lablen + i - k); if (c >= 0) { while ((int)((c = soap_get(soap)) != EOF) && c != SOAP_LT && c != SOAP_TT) ; } soap_unget(soap, c); return p; } c -= '+'; if (c >= 0 && c <= 79) { register int b = soap_base64i[c]; if (b >= 64) { soap->error = SOAP_TYPE; return NULL; } m = (m << 6) + b; j++; } else if (!soap_blank(c + '+')) { soap->error = SOAP_TYPE; return NULL; } } while (j < 4); *s++ = (char)((m >> 16) & 0xFF); *s++ = (char)((m >> 8) & 0xFF); *s++ = (char)(m & 0xFF); } } } #else if (soap_new_block(soap) == NULL) return NULL; for (;;) { register int i; register char *s = (char*)soap_push_block(soap, NULL, 3 * SOAP_BLKLEN); /* must be multiple of 3 */ if (!s) { soap_end_block(soap, NULL); return NULL; } for (i = 0; i < SOAP_BLKLEN; i++) { register unsigned long m = 0; register int j = 0; do { register soap_wchar c = soap_get(soap); if (c == '=' || c < 0) { unsigned char *p; i *= 3; switch (j) { case 2: *s++ = (char)((m >> 4) & 0xFF); i++; break; case 3: *s++ = (char)((m >> 10) & 0xFF); *s++ = (char)((m >> 2) & 0xFF); i += 2; } if (n) *n = (int)soap_size_block(soap, NULL, i); p = (unsigned char*)soap_save_block(soap, NULL, 0); if (c >= 0) { while ((int)((c = soap_get(soap)) != EOF) && c != SOAP_LT && c != SOAP_TT) ; } soap_unget(soap, c); return p; } c -= '+'; if (c >= 0 && c <= 79) { int b = soap_base64i[c]; if (b >= 64) { soap->error = SOAP_TYPE; return NULL; } m = (m << 6) + b; j++; } else if (!soap_blank(c)) { soap->error = SOAP_TYPE; return NULL; } } while (j < 4); *s++ = (char)((m >> 16) & 0xFF); *s++ = (char)((m >> 8) & 0xFF); *s++ = (char)(m & 0xFF); } } #endif } #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_xop_forward(struct soap *soap, unsigned char **ptr, int *size, char **id, char **type, char **options) { /* Check MTOM xop:Include element (within hex/base64Binary) */ /* TODO: this code to be obsoleted with new import/xop.h conventions */ short body = soap->body; /* should save type too? */ if (!soap_peek_element(soap)) { if (!soap_element_begin_in(soap, "xop:Include", 0, NULL)) { if (soap_dime_forward(soap, ptr, size, id, type, options)) return soap->error; } if (soap->body && soap_element_end_in(soap, NULL)) return soap->error; } soap->body = body; return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_dime_forward(struct soap *soap, unsigned char **ptr, int *size, char **id, char **type, char **options) { struct soap_xlist *xp; *ptr = NULL; *size = 0; *id = NULL; *type = NULL; *options = NULL; if (!*soap->href) return SOAP_OK; *id = soap_strdup(soap, soap->href); xp = (struct soap_xlist*)SOAP_MALLOC(soap, sizeof(struct soap_xlist)); if (!xp) return soap->error = SOAP_EOM; xp->next = soap->xlist; xp->ptr = ptr; xp->size = size; xp->id = *id; xp->type = type; xp->options = options; soap->xlist = xp; return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 char * SOAP_FMAC2 soap_strdup(struct soap *soap, const char *s) { char *t = NULL; if (s && (t = (char*)soap_malloc(soap, strlen(s) + 1))) strcpy(t, s); return t; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 wchar_t * SOAP_FMAC2 soap_wstrdup(struct soap *soap, const wchar_t *s) { wchar_t *t = NULL; if (s) { size_t n = 0; while (s[n]) n++; if ((t = (wchar_t*)soap_malloc(soap, sizeof(wchar_t)*(n+1)))) memcpy(t, s, sizeof(wchar_t)*(n+1)); } return t; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 struct soap_blist* SOAP_FMAC2 soap_new_block(struct soap *soap) { struct soap_blist *p; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "New block sequence (prev=%p)\n", soap->blist)); if (!(p = (struct soap_blist*)SOAP_MALLOC(soap, sizeof(struct soap_blist)))) { soap->error = SOAP_EOM; return NULL; } p->next = soap->blist; p->ptr = NULL; p->size = 0; soap->blist = p; return p; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void* SOAP_FMAC2 soap_push_block(struct soap *soap, struct soap_blist *b, size_t n) { char *p; if (!b) b = soap->blist; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Push block of %u bytes (%u bytes total)\n", (unsigned int)n, (unsigned int)b->size + (unsigned int)n)); if (!(p = (char*)SOAP_MALLOC(soap, n + sizeof(char*) + sizeof(size_t)))) { soap->error = SOAP_EOM; return NULL; } *(char**)p = b->ptr; *(size_t*)(p + sizeof(char*)) = n; b->ptr = p; b->size += n; return p + sizeof(char*) + sizeof(size_t); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_pop_block(struct soap *soap, struct soap_blist *b) { char *p; if (!b) b = soap->blist; if (!b->ptr) return; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Pop block\n")); p = b->ptr; b->size -= *(size_t*)(p + sizeof(char*)); b->ptr = *(char**)p; SOAP_FREE(soap, p); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_update_pointers(struct soap *soap, char *start, char *end, char *p1, char *p2) { #ifndef WITH_NOIDREF int i; register struct soap_ilist *ip = NULL; register struct soap_flist *fp = NULL; #ifndef WITH_LEANER register struct soap_xlist *xp = NULL; #endif register void *p, **q; for (i = 0; i < SOAP_IDHASH; i++) { for (ip = soap->iht[i]; ip; ip = ip->next) { if (ip->ptr && (char*)ip->ptr >= start && (char*)ip->ptr < end) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Update id='%s' %p -> %p\n", ip->id, ip->ptr, (char*)ip->ptr + (p1-p2))); ip->ptr = (char*)ip->ptr + (p1-p2); } for (q = &ip->link; q; q = (void**)p) { p = *q; if (p && (char*)p >= start && (char*)p < end) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Link update id='%s' %p\n", ip->id, p)); *q = (char*)p + (p1-p2); } } for (q = &ip->copy; q; q = (void**)p) { p = *q; if (p && (char*)p >= start && (char*)p < end) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy chain update id='%s' %p\n", ip->id, p)); *q = (char*)p + (p1-p2); } } for (fp = ip->flist; fp; fp = fp->next) { if ((char*)fp->ptr >= start && (char*)fp->ptr < end) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy list update id='%s' %p\n", ip->id, fp)); fp->ptr = (char*)fp->ptr + (p1-p2); } } } } #ifndef WITH_LEANER for (xp = soap->xlist; xp; xp = xp->next) { if (xp->ptr && (char*)xp->ptr >= start && (char*)xp->ptr < end) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Update id='%s' %p -> %p\n", xp->id ? xp->id : SOAP_STR_EOS, xp->ptr, (char*)xp->ptr + (p1-p2))); xp->ptr = (unsigned char**)((char*)xp->ptr + (p1-p2)); xp->size = (int*)((char*)xp->size + (p1-p2)); xp->type = (char**)((char*)xp->type + (p1-p2)); xp->options = (char**)((char*)xp->options + (p1-p2)); } } #endif #else (void)soap; (void)start; (void)end; (void)p1; (void)p2; #endif } #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_1 static int soap_has_copies(struct soap *soap, register const char *start, register const char *end) { register int i; register struct soap_ilist *ip = NULL; register struct soap_flist *fp = NULL; register const char *p; for (i = 0; i < SOAP_IDHASH; i++) { for (ip = soap->iht[i]; ip; ip = ip->next) { for (p = (const char*)ip->copy; p; p = *(const char**)p) if (p >= start && p < end) return SOAP_ERR; for (fp = ip->flist; fp; fp = fp->next) if ((const char*)fp->ptr >= start && (const char*)fp->ptr < end) return SOAP_ERR; } } return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_resolve(struct soap *soap) { register int i; register struct soap_ilist *ip = NULL; register struct soap_flist *fp = NULL; short flag; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolving forwarded data\n")); for (i = 0; i < SOAP_IDHASH; i++) { for (ip = soap->iht[i]; ip; ip = ip->next) { if (ip->ptr) { register void *p, **q, *r; q = (void**)ip->link; ip->link = NULL; r = ip->ptr; DBGLOG(TEST, if (q) SOAP_MESSAGE(fdebug, "Traversing link chain to resolve id='%s'\n", ip->id)); while (q) { p = *q; *q = r; DBGLOG(TEST,SOAP_MESSAGE(fdebug, "... link %p -> %p\n", q, r)); q = (void**)p; } } else if (*ip->id == '#') { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Missing data for id='%s'\n", ip->id)); strcpy(soap->id, ip->id + 1); return soap->error = SOAP_MISSING_ID; } } } do { flag = 0; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolution phase\n")); for (i = 0; i < SOAP_IDHASH; i++) { for (ip = soap->iht[i]; ip; ip = ip->next) { if (ip->ptr && !soap_has_copies(soap, (const char*)ip->ptr, (const char*)ip->ptr + ip->size)) { if (ip->copy) { register void *p, **q = (void**)ip->copy; DBGLOG(TEST, if (q) SOAP_MESSAGE(fdebug, "Traversing copy chain to resolve id='%s'\n", ip->id)); ip->copy = NULL; do { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "... copy %p -> %p (%u bytes)\n", ip->ptr, q, (unsigned int)ip->size)); p = *q; memcpy(q, ip->ptr, ip->size); q = (void**)p; } while (q); flag = 1; } for (fp = ip->flist; fp; fp = ip->flist) { register unsigned int k = fp->level; register void *p = ip->ptr; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolving forwarded data type=%d location=%p level=%u,%u id='%s'\n", ip->type, p, ip->level, fp->level, ip->id)); while (ip->level < k) { register void **q = (void**)soap_malloc(soap, sizeof(void*)); if (!q) return soap->error; *q = p; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Descending one level, new location=%p holds=%p...\n", q, *q)); p = (void*)q; k--; } if (fp->fcopy) fp->fcopy(soap, ip->type, fp->type, fp->ptr, fp->len, p, ip->size); else soap_fcopy(soap, ip->type, fp->type, fp->ptr, fp->len, p, ip->size); ip->flist = fp->next; SOAP_FREE(soap, fp); flag = 1; } } } } } while (flag); #ifdef SOAP_DEBUG for (i = 0; i < SOAP_IDHASH; i++) { for (ip = soap->iht[i]; ip; ip = ip->next) { if (ip->copy || ip->flist) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolution error: forwarded data for id='%s' could not be propagated, please report this problem to the developers\n", ip->id)); } } } #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolution done\n")); return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 size_t SOAP_FMAC2 soap_size_block(struct soap *soap, struct soap_blist *b, size_t n) { if (!b) b = soap->blist; if (b->ptr) { b->size -= *(size_t*)(b->ptr + sizeof(char*)) - n; *(size_t*)(b->ptr + sizeof(char*)) = n; } return b->size; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 char* SOAP_FMAC2 soap_first_block(struct soap *soap, struct soap_blist *b) { char *p, *q, *r; if (!b) b = soap->blist; p = b->ptr; if (!p) return NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "First block\n")); r = NULL; do { q = *(char**)p; *(char**)p = r; r = p; p = q; } while (p); b->ptr = r; return r + sizeof(char*) + sizeof(size_t); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 char* SOAP_FMAC2 soap_next_block(struct soap *soap, struct soap_blist *b) { char *p; if (!b) b = soap->blist; p = b->ptr; if (p) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Next block\n")); b->ptr = *(char**)p; SOAP_FREE(soap, p); if (b->ptr) return b->ptr + sizeof(char*) + sizeof(size_t); } return NULL; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 size_t SOAP_FMAC2 soap_block_size(struct soap *soap, struct soap_blist *b) { if (!b) b = soap->blist; return *(size_t*)(b->ptr + sizeof(char*)); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_end_block(struct soap *soap, struct soap_blist *b) { char *p, *q; if (!b) b = soap->blist; if (b) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of block sequence, free all remaining blocks\n")); for (p = b->ptr; p; p = q) { q = *(char**)p; SOAP_FREE(soap, p); } if (soap->blist == b) soap->blist = b->next; else { struct soap_blist *bp; for (bp = soap->blist; bp; bp = bp->next) { if (bp->next == b) { bp->next = b->next; break; } } } SOAP_FREE(soap, b); } DBGLOG(TEST, if (soap->blist) SOAP_MESSAGE(fdebug, "Restore previous block sequence\n")); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 char* SOAP_FMAC2 soap_save_block(struct soap *soap, struct soap_blist *b, char *p, int flag) { register size_t n; register char *q, *s; if (!b) b = soap->blist; if (b->size) { if (!p) p = (char*)soap_malloc(soap, b->size); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Save all blocks in contiguous memory space of %u bytes (%p->%p)\n", (unsigned int)b->size, b->ptr, p)); if (p) { for (s = p, q = soap_first_block(soap, b); q; q = soap_next_block(soap, b)) { n = soap_block_size(soap, b); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy %u bytes from %p to %p\n", (unsigned int)n, q, s)); #ifndef WITH_NOIDREF if (flag) soap_update_pointers(soap, q, q + n, s, q); #endif memcpy(s, q, n); s += n; } } else soap->error = SOAP_EOM; } soap_end_block(soap, b); return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 char * SOAP_FMAC2 soap_putsize(struct soap *soap, const char *type, int size) { return soap_putsizes(soap, type, &size, 1); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 char * SOAP_FMAC2 soap_putsizes(struct soap *soap, const char *type, const int *size, int dim) { return soap_putsizesoffsets(soap, type, size, NULL, dim); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 char * SOAP_FMAC2 soap_putsizesoffsets(struct soap *soap, const char *type, const int *size, const int *offset, int dim) { int i; if (!type) return NULL; if (soap->version == 2) { sprintf(soap->type, "%s[%d", type, size[0]); for (i = 1; i < dim; i++) sprintf(soap->type + strlen(soap->type), " %d", size[i]); } else { if (offset) { sprintf(soap->type, "%s[%d", type, size[0] + offset[0]); for (i = 1; i < dim; i++) sprintf(soap->type + strlen(soap->type), ",%d", size[i] + offset[i]); } else { sprintf(soap->type, "%s[%d", type, size[0]); for (i = 1; i < dim; i++) sprintf(soap->type + strlen(soap->type), ",%d", size[i]); } strcat(soap->type, "]"); } return soap->type; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 char * SOAP_FMAC2 soap_putoffset(struct soap *soap, int offset) { return soap_putoffsets(soap, &offset, 1); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 char * SOAP_FMAC2 soap_putoffsets(struct soap *soap, const int *offset, int dim) { register int i; sprintf(soap->arrayOffset, "[%d", offset[0]); for (i = 1; i < dim; i++) sprintf(soap->arrayOffset + strlen(soap->arrayOffset), ",%d", offset[i]); strcat(soap->arrayOffset, "]"); return soap->arrayOffset; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_size(const int *size, int dim) { register int i, n = size[0]; for (i = 1; i < dim; i++) n *= size[i]; return n; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_getoffsets(const char *attr, const int *size, int *offset, int dim) { register int i, j = 0; if (offset) for (i = 0; i < dim && attr && *attr; i++) { attr++; j *= size[i]; j += offset[i] = (int)soap_strtol(attr, NULL, 10); attr = strchr(attr, ','); } else for (i = 0; i < dim && attr && *attr; i++) { attr++; j *= size[i]; j += (int)soap_strtol(attr, NULL, 10); attr = strchr(attr, ','); } return j; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_getsize(const char *attr1, const char *attr2, int *j) { register int n, k; char *s; *j = 0; if (!*attr1) return -1; if (*attr1 == '[') attr1++; n = 1; for (;;) { k = (int)soap_strtol(attr1, &s, 10); n *= k; if (k < 0 || n > SOAP_MAXARRAYSIZE || s == attr1) return -1; attr1 = strchr(s, ','); if (!attr1) attr1 = strchr(s, ' '); if (attr2 && *attr2) { attr2++; *j *= k; k = (int)soap_strtol(attr2, &s, 10); *j += k; if (k < 0) return -1; attr2 = s; } if (!attr1) break; attr1++; } return n - *j; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_getsizes(const char *attr, int *size, int dim) { register int i, k, n; if (!*attr) return -1; i = (int)strlen(attr); n = 1; do { for (i = i-1; i >= 0; i--) if (attr[i] == '[' || attr[i] == ',' || attr[i] == ' ') break; k = (int)soap_strtol(attr + i + 1, NULL, 10); n *= size[--dim] = k; if (k < 0 || n > SOAP_MAXARRAYSIZE) return -1; } while (i >= 0 && attr[i] != '['); return n; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_getposition(const char *attr, int *pos) { register int i, n; if (!*attr) return -1; n = 0; i = 1; do { pos[n++] = (int)soap_strtol(attr + i, NULL, 10); while (attr[i] && attr[i] != ',' && attr[i] != ']') i++; if (attr[i] == ',') i++; } while (n < SOAP_MAXDIMS && attr[i] && attr[i] != ']'); return n; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 struct soap_nlist * SOAP_FMAC2 soap_push_namespace(struct soap *soap, const char *id, const char *ns) { register struct soap_nlist *np; register struct Namespace *p; register short i = -1; register size_t n, k; n = strlen(id); k = strlen(ns) + 1; p = soap->local_namespaces; if (p) { for (i = 0; p->id; p++, i++) { if (p->ns && !strcmp(ns, p->ns)) { if (p->out) { SOAP_FREE(soap, p->out); p->out = NULL; } break; } if (p->out) { if (!strcmp(ns, p->out)) break; } else if (p->in) { if (!soap_tag_cmp(ns, p->in)) { if ((p->out = (char*)SOAP_MALLOC(soap, k))) strcpy(p->out, ns); break; } } } if (!p || !p->id) i = -1; } if (i >= 0) k = 0; np = (struct soap_nlist*)SOAP_MALLOC(soap, sizeof(struct soap_nlist) + n + k); if (!np) { soap->error = SOAP_EOM; return NULL; } np->next = soap->nlist; soap->nlist = np; np->level = soap->level; np->index = i; strcpy((char*)np->id, id); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Push namespace binding (level=%u) '%s' '%s'\n", soap->level, id, ns)); if (i < 0) { np->ns = strcpy((char*)np->id + n + 1, ns); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Push NOT OK: no match found for '%s' in namespace mapping table (added to stack anyway)\n", ns)); } else { np->ns = NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Push OK ('%s' matches '%s' in namespace table)\n", id, p->id)); } return np; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_pop_namespace(struct soap *soap) { register struct soap_nlist *np, *nq; for (np = soap->nlist; np && np->level >= soap->level; np = nq) { nq = np->next; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Pop namespace binding (level=%u) '%s'\n", soap->level, np->id)); SOAP_FREE(soap, np); } soap->nlist = np; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_match_namespace(struct soap *soap, const char *id1, const char *id2, size_t n1, size_t n2) { register struct soap_nlist *np = soap->nlist; const char *s; while (np && (strncmp(np->id, id1, n1) || np->id[n1])) np = np->next; if (np) { if (!(soap->mode & SOAP_XML_IGNORENS)) if (np->index < 0 || ((s = soap->local_namespaces[np->index].id) && (strncmp(s, id2, n2) || (s[n2] && s[n2] != '_')))) return SOAP_NAMESPACE; return SOAP_OK; } if (n1 == 0) return (soap->mode & SOAP_XML_IGNORENS) ? SOAP_OK : SOAP_NAMESPACE; if ((n1 == 3 && n1 == n2 && !strncmp(id1, "xml", 3) && !strncmp(id1, id2, 3)) || (soap->mode & SOAP_XML_IGNORENS)) return SOAP_OK; return soap->error = SOAP_SYNTAX_ERROR; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_current_namespace(struct soap *soap, const char *tag) { register struct soap_nlist *np; register const char *s; if (!tag || !strncmp(tag, "xml", 3)) return NULL; np = soap->nlist; if (!(s = strchr(tag, ':'))) { while (np && *np->id) /* find default namespace, if present */ np = np->next; } else { while (np && (strncmp(np->id, tag, s - tag) || np->id[s - tag])) np = np->next; if (!np) soap->error = SOAP_NAMESPACE; } if (np) { if (np->index >= 0) return soap->namespaces[np->index].ns; if (np->ns) return soap_strdup(soap, np->ns); } return NULL; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_tag_cmp(const char *s, const char *t) { for (;;) { register int c1 = *s; register int c2 = *t; if (!c1 || c1 == '"') break; if (c2 != '-') { if (c1 != c2) { if (c1 >= 'A' && c1 <= 'Z') c1 += 'a' - 'A'; if (c2 >= 'A' && c2 <= 'Z') c2 += 'a' - 'A'; } if (c1 != c2) { if (c2 != '*') return 1; c2 = *++t; if (!c2) return 0; if (c2 >= 'A' && c2 <= 'Z') c2 += 'a' - 'A'; for (;;) { c1 = *s; if (!c1 || c1 == '"') break; if (c1 >= 'A' && c1 <= 'Z') c1 += 'a' - 'A'; if (c1 == c2 && !soap_tag_cmp(s + 1, t + 1)) return 0; s++; } break; } } s++; t++; } if (*t == '*' && !t[1]) return 0; return *t; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_match_tag(struct soap *soap, const char *tag1, const char *tag2) { register const char *s, *t; register int err; if (!tag1 || !tag2 || !*tag2) return SOAP_OK; s = strchr(tag1, ':'); t = strchr(tag2, ':'); if (t) { if (s) { if (t[1] && SOAP_STRCMP(s + 1, t + 1)) return SOAP_TAG_MISMATCH; if (t != tag2 && (err = soap_match_namespace(soap, tag1, tag2, s - tag1, t - tag2))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Tags '%s' and '%s' match but namespaces differ\n", tag1, tag2)); if (err == SOAP_NAMESPACE) return SOAP_TAG_MISMATCH; return err; } } else if (SOAP_STRCMP(tag1, t + 1)) { return SOAP_TAG_MISMATCH; } else if (t != tag2 && (err = soap_match_namespace(soap, tag1, tag2, 0, t - tag2))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Tags '%s' and '%s' match but namespaces differ\n", tag1, tag2)); if (err == SOAP_NAMESPACE) return SOAP_TAG_MISMATCH; return err; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Tags and (default) namespaces match: '%s' '%s'\n", tag1, tag2)); return SOAP_OK; } if (s) { if (SOAP_STRCMP(s + 1, tag2)) return SOAP_TAG_MISMATCH; } else if (SOAP_STRCMP(tag1, tag2)) return SOAP_TAG_MISMATCH; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Tags match: '%s' '%s'\n", tag1, tag2)); return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_match_array(struct soap *soap, const char *type) { if (*soap->arrayType) if (soap_match_tag(soap, soap->arrayType, type) && soap_match_tag(soap, soap->arrayType, "xsd:anyType") && soap_match_tag(soap, soap->arrayType, "xsd:ur-type") ) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Array type mismatch: '%s' '%s'\n", soap->arrayType, type)); return SOAP_TAG_MISMATCH; } return SOAP_OK; } #endif /******************************************************************************\ * * SSL/TLS * \******************************************************************************/ /******************************************************************************/ #ifdef WITH_OPENSSL #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_rand() { unsigned char buf[4]; if (!soap_ssl_init_done) soap_ssl_init(); RAND_pseudo_bytes(buf, 4); return *(int*)buf; } #endif #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_ssl_server_context(struct soap *soap, unsigned short flags, const char *keyfile, const char *password, const char *cafile, const char *capath, const char *dhfile, const char *randfile, const char *sid) { int err; soap->keyfile = keyfile; soap->password = password; soap->cafile = cafile; soap->capath = capath; soap->crlfile = NULL; #ifdef WITH_OPENSSL soap->dhfile = dhfile; soap->randfile = randfile; #endif soap->ssl_flags = flags | (dhfile == NULL ? SOAP_SSL_RSA : 0); #ifdef WITH_GNUTLS if (dhfile) { char *s; int n = (int)soap_strtoul(dhfile, &s, 10); if (!soap->dh_params) gnutls_dh_params_init(&soap->dh_params); /* if dhfile is numeric, treat it as a key length to generate DH params which can take a while */ if (n >= 512 && s && *s == '\0') gnutls_dh_params_generate2(soap->dh_params, (unsigned int)n); else { unsigned int dparams_len; unsigned char dparams_buf[1024]; FILE *fd = fopen(dhfile, "r"); if (!fd) return soap_set_receiver_error(soap, "SSL/TLS error", "Invalid DH file", SOAP_SSL_ERROR); dparams_len = (unsigned int)fread(dparams_buf, 1, sizeof(dparams_buf), fd); fclose(fd); gnutls_datum_t dparams = { dparams_buf, dparams_len }; if (gnutls_dh_params_import_pkcs3(soap->dh_params, &dparams, GNUTLS_X509_FMT_PEM)) return soap_set_receiver_error(soap, "SSL/TLS error", "Invalid DH file", SOAP_SSL_ERROR); } } else { if (!soap->rsa_params) gnutls_rsa_params_init(&soap->rsa_params); gnutls_rsa_params_generate2(soap->rsa_params, SOAP_SSL_RSA_BITS); } if (soap->session) { gnutls_deinit(soap->session); soap->session = NULL; } if (soap->xcred) { gnutls_certificate_free_credentials(soap->xcred); soap->xcred = NULL; } #endif err = soap->fsslauth(soap); #ifdef WITH_OPENSSL if (!err) { if (sid) SSL_CTX_set_session_id_context(soap->ctx, (unsigned char*)sid, (unsigned int)strlen(sid)); else SSL_CTX_set_session_cache_mode(soap->ctx, SSL_SESS_CACHE_OFF); } #endif return err; } #endif #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_ssl_client_context(struct soap *soap, unsigned short flags, const char *keyfile, const char *password, const char *cafile, const char *capath, const char *randfile) { soap->keyfile = keyfile; soap->password = password; soap->cafile = cafile; soap->capath = capath; soap->ssl_flags = SOAP_SSL_CLIENT | flags; #ifdef WITH_OPENSSL soap->dhfile = NULL; soap->randfile = randfile; soap->fsslverify = (flags & SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE) == 0 ? ssl_verify_callback : ssl_verify_callback_allow_expired_certificate; #endif #ifdef WITH_GNUTLS if (soap->session) { gnutls_deinit(soap->session); soap->session = NULL; } if (soap->xcred) { gnutls_certificate_free_credentials(soap->xcred); soap->xcred = NULL; } #endif return soap->fsslauth(soap); } #endif #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_ssl_init() { /* Note: for MT systems, the main program MUST call soap_ssl_init() before any threads are started */ if (!soap_ssl_init_done) { soap_ssl_init_done = 1; #ifdef WITH_OPENSSL SSL_library_init(); OpenSSL_add_all_algorithms(); /* 2.8.1 change (wsseapi.c) */ #ifndef WITH_LEAN SSL_load_error_strings(); #endif if (!RAND_load_file("/dev/urandom", 1024)) { char buf[1024]; RAND_seed(buf, sizeof(buf)); while (!RAND_status()) { int r = rand(); RAND_seed(&r, sizeof(int)); } } #endif #ifdef WITH_GNUTLS # if defined(HAVE_PTHREAD_H) gcry_control(GCRYCTL_SET_THREAD_CBS, &gcry_threads_pthread); # elif defined(HAVE_PTH_H) gcry_control(GCRYCTL_SET_THREAD_CBS, &gcry_threads_pth); # endif gcry_control(GCRYCTL_ENABLE_QUICK_RANDOM, 0); gcry_control(GCRYCTL_DISABLE_SECMEM, 0); gcry_control(GCRYCTL_INITIALIZATION_FINISHED, 0); /* libgcrypt init done */ gnutls_global_init(); #endif } } #endif #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) #ifndef PALM_1 SOAP_FMAC1 const char * SOAP_FMAC2 soap_ssl_error(struct soap *soap, int ret) { #ifdef WITH_OPENSSL int err = SSL_get_error(soap->ssl, ret); const char *msg = soap_code_str(h_ssl_error_codes, err); if (msg) strcpy(soap->msgbuf, msg); else return ERR_error_string(err, soap->msgbuf); if (ERR_peek_error()) { unsigned long r; strcat(soap->msgbuf, "\n"); while ((r = ERR_get_error())) ERR_error_string_n(r, soap->msgbuf + strlen(soap->msgbuf), sizeof(soap->msgbuf) - strlen(soap->msgbuf)); } else { switch (ret) { case 0: strcpy(soap->msgbuf, "EOF was observed that violates the protocol. The client probably provided invalid authentication information."); break; case -1: sprintf(soap->msgbuf, "Error observed by underlying BIO: %s", strerror(errno)); break; } } return soap->msgbuf; #endif #ifdef WITH_GNUTLS return gnutls_strerror(ret); #endif } #endif #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) #ifndef PALM_1 static int ssl_auth_init(struct soap *soap) { #ifdef WITH_OPENSSL long flags; int mode; if (!soap_ssl_init_done) soap_ssl_init(); ERR_clear_error(); if (!soap->ctx) { if (!(soap->ctx = SSL_CTX_new(SSLv23_method()))) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't setup context", SOAP_SSL_ERROR); /* The following alters the behavior of SSL read/write: */ #if 0 SSL_CTX_set_mode(soap->ctx, SSL_MODE_ENABLE_PARTIAL_WRITE | SSL_MODE_AUTO_RETRY); #endif } if (soap->randfile) { if (!RAND_load_file(soap->randfile, -1)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't load randomness", SOAP_SSL_ERROR); } if (soap->cafile || soap->capath) { if (!SSL_CTX_load_verify_locations(soap->ctx, soap->cafile, soap->capath)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read CA file", SOAP_SSL_ERROR); if (soap->cafile && (soap->ssl_flags & SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION)) SSL_CTX_set_client_CA_list(soap->ctx, SSL_load_client_CA_file(soap->cafile)); } if (!(soap->ssl_flags & SOAP_SSL_NO_DEFAULT_CA_PATH)) { if (!SSL_CTX_set_default_verify_paths(soap->ctx)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read default CA file and/or directory", SOAP_SSL_ERROR); } /* This code assumes a typical scenario, see alternative code below */ if (soap->keyfile) { if (!SSL_CTX_use_certificate_chain_file(soap->ctx, soap->keyfile)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read certificate key file", SOAP_SSL_ERROR); if (soap->password) { SSL_CTX_set_default_passwd_cb_userdata(soap->ctx, (void*)soap->password); SSL_CTX_set_default_passwd_cb(soap->ctx, ssl_password); } if (!SSL_CTX_use_PrivateKey_file(soap->ctx, soap->keyfile, SSL_FILETYPE_PEM)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read key file", SOAP_SSL_ERROR); } /* Suggested alternative approach to check the key file for certs (cafile=NULL):*/ #if 0 if (soap->password) { SSL_CTX_set_default_passwd_cb_userdata(soap->ctx, (void*)soap->password); SSL_CTX_set_default_passwd_cb(soap->ctx, ssl_password); } if (!soap->cafile || !SSL_CTX_use_certificate_chain_file(soap->ctx, soap->cafile)) { if (soap->keyfile) { if (!SSL_CTX_use_certificate_chain_file(soap->ctx, soap->keyfile)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read certificate or key file", SOAP_SSL_ERROR); if (!SSL_CTX_use_PrivateKey_file(soap->ctx, soap->keyfile, SSL_FILETYPE_PEM)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read key file", SOAP_SSL_ERROR); } } #endif if ((soap->ssl_flags & SOAP_SSL_RSA)) { RSA *rsa = RSA_generate_key(SOAP_SSL_RSA_BITS, RSA_F4, NULL, NULL); if (!SSL_CTX_set_tmp_rsa(soap->ctx, rsa)) { if (rsa) RSA_free(rsa); return soap_set_receiver_error(soap, "SSL/TLS error", "Can't set RSA key", SOAP_SSL_ERROR); } RSA_free(rsa); } else if (soap->dhfile) { DH *dh = 0; char *s; int n = (int)soap_strtoul(soap->dhfile, &s, 10); /* if dhfile is numeric, treat it as a key length to generate DH params which can take a while */ if (n >= 512 && s && *s == '\0') dh = DH_generate_parameters(n, 2/*or 5*/, NULL, NULL); else { BIO *bio; bio = BIO_new_file(soap->dhfile, "r"); if (!bio) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read DH file", SOAP_SSL_ERROR); dh = PEM_read_bio_DHparams(bio, NULL, NULL, NULL); BIO_free(bio); } if (!dh || DH_check(dh, &n) != 1 || SSL_CTX_set_tmp_dh(soap->ctx, dh) < 0) { if (dh) DH_free(dh); return soap_set_receiver_error(soap, "SSL/TLS error", "Can't set DH parameters", SOAP_SSL_ERROR); } DH_free(dh); } flags = (SSL_OP_ALL | SSL_OP_NO_SSLv2); /* disable SSL v2 */ if ((soap->ssl_flags & SOAP_SSLv3)) flags |= SSL_OP_NO_TLSv1; if ((soap->ssl_flags & SOAP_TLSv1)) flags |= SSL_OP_NO_SSLv3; #ifdef SSL_OP_NO_TICKET /* TLS extension is enabled by default in OPENSSL v0.9.8k Disable it by adding SSL_OP_NO_TICKET */ flags |= SSL_OP_NO_TICKET; #endif SSL_CTX_set_options(soap->ctx, flags); if ((soap->ssl_flags & SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION)) mode = (SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT); else if ((soap->ssl_flags & SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION)) mode = SSL_VERIFY_PEER; else mode = SSL_VERIFY_NONE; SSL_CTX_set_verify(soap->ctx, mode, soap->fsslverify); #if (OPENSSL_VERSION_NUMBER < 0x00905100L) SSL_CTX_set_verify_depth(soap->ctx, 1); #else SSL_CTX_set_verify_depth(soap->ctx, 9); #endif #endif #ifdef WITH_GNUTLS int ret; if (!soap_ssl_init_done) soap_ssl_init(); if (!soap->xcred) { gnutls_certificate_allocate_credentials(&soap->xcred); if (soap->cafile) { if (gnutls_certificate_set_x509_trust_file(soap->xcred, soap->cafile, GNUTLS_X509_FMT_PEM) < 0) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read CA file", SOAP_SSL_ERROR); } if (soap->crlfile) { if (gnutls_certificate_set_x509_crl_file(soap->xcred, soap->crlfile, GNUTLS_X509_FMT_PEM) < 0) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read CRL file", SOAP_SSL_ERROR); } if (soap->keyfile) { if (gnutls_certificate_set_x509_key_file(soap->xcred, soap->keyfile, soap->keyfile, GNUTLS_X509_FMT_PEM) < 0) /* TODO: GNUTLS need to concat cert and key in single key file */ return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read key file", SOAP_SSL_ERROR); } } if ((soap->ssl_flags & SOAP_SSL_CLIENT)) { gnutls_init(&soap->session, GNUTLS_CLIENT); if (soap->cafile || soap->crlfile || soap->keyfile) { ret = gnutls_priority_set_direct(soap->session, "PERFORMANCE", NULL); if (ret < 0) return soap_set_receiver_error(soap, soap_ssl_error(soap, ret), "SSL/TLS set priority error", SOAP_SSL_ERROR); gnutls_credentials_set(soap->session, GNUTLS_CRD_CERTIFICATE, soap->xcred); } else { if (!soap->acred) gnutls_anon_allocate_client_credentials(&soap->acred); gnutls_init(&soap->session, GNUTLS_CLIENT); gnutls_priority_set_direct(soap->session, "PERFORMANCE:+ANON-DH:!ARCFOUR-128", NULL); gnutls_credentials_set(soap->session, GNUTLS_CRD_ANON, soap->acred); } } else { if (!soap->keyfile) return soap_set_receiver_error(soap, "SSL/TLS error", "No key file: anonymous server authentication not supported in this release", SOAP_SSL_ERROR); if ((soap->ssl_flags & SOAP_SSL_RSA) && soap->rsa_params) gnutls_certificate_set_rsa_export_params(soap->xcred, soap->rsa_params); else if (soap->dh_params) gnutls_certificate_set_dh_params(soap->xcred, soap->dh_params); if (!soap->cache) gnutls_priority_init(&soap->cache, "NORMAL", NULL); gnutls_init(&soap->session, GNUTLS_SERVER); gnutls_priority_set(soap->session, soap->cache); gnutls_credentials_set(soap->session, GNUTLS_CRD_CERTIFICATE, soap->xcred); if ((soap->ssl_flags & SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION)) gnutls_certificate_server_set_request(soap->session, GNUTLS_CERT_REQUEST); gnutls_session_enable_compatibility_mode(soap->session); if ((soap->ssl_flags & SOAP_TLSv1)) { int protocol_priority[] = { GNUTLS_TLS1_0, 0 }; if (gnutls_protocol_set_priority(soap->session, protocol_priority) != GNUTLS_E_SUCCESS) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't set TLS v1.0 protocol", SOAP_SSL_ERROR); } } #endif return SOAP_OK; } #endif #endif /******************************************************************************/ #ifdef WITH_OPENSSL #ifndef PALM_1 static int ssl_password(char *buf, int num, int rwflag, void *userdata) { if (num < (int)strlen((char*)userdata) + 1) return 0; return (int)strlen(strcpy(buf, (char*)userdata)); } #endif #endif /******************************************************************************/ #ifdef WITH_OPENSSL #ifndef PALM_1 static int ssl_verify_callback(int ok, X509_STORE_CTX *store) { #ifdef SOAP_DEBUG if (!ok) { char buf[1024]; X509 *cert = X509_STORE_CTX_get_current_cert(store); fprintf(stderr, "SSL verify error or warning with certificate at depth %d: %s\n", X509_STORE_CTX_get_error_depth(store), X509_verify_cert_error_string(X509_STORE_CTX_get_error(store))); X509_NAME_oneline(X509_get_issuer_name(cert), buf, sizeof(buf)); fprintf(stderr, "certificate issuer %s\n", buf); X509_NAME_oneline(X509_get_subject_name(cert), buf, sizeof(buf)); fprintf(stderr, "certificate subject %s\n", buf); } #endif /* Note: return 1 to continue, but unsafe progress will be terminated by OpenSSL */ return ok; } #endif #endif /******************************************************************************/ #ifdef WITH_OPENSSL #ifndef PALM_1 static int ssl_verify_callback_allow_expired_certificate(int ok, X509_STORE_CTX *store) { ok = ssl_verify_callback(ok, store); if (ok == 0 && X509_STORE_CTX_get_error(store) == X509_V_ERR_CERT_HAS_EXPIRED) { #ifdef SOAP_DEBUG fprintf(stderr, "ignoring certificate expiration\n"); #endif X509_STORE_CTX_set_error(store, X509_V_OK); ok = 1; } /* Note: return 1 to continue, but unsafe progress will be terminated by SSL */ return ok; } #endif #endif /******************************************************************************/ #ifdef WITH_GNUTLS static const char * ssl_verify(struct soap *soap, const char *host) { unsigned int status; const char *err = NULL; int r = gnutls_certificate_verify_peers2(soap->session, &status); if (r < 0) err = "Certificate verify error"; else if ((status & GNUTLS_CERT_INVALID)) err = "The certificate is not trusted"; else if ((status & GNUTLS_CERT_SIGNER_NOT_FOUND)) err = "The certificate hasn't got a known issuer"; else if ((status & GNUTLS_CERT_REVOKED)) err = "The certificate has been revoked"; else if (gnutls_certificate_type_get(soap->session) == GNUTLS_CRT_X509) { gnutls_x509_crt_t cert; const gnutls_datum_t *cert_list; unsigned int cert_list_size; if (gnutls_x509_crt_init(&cert) < 0) err = "Could not get X509 certificates"; else if ((cert_list = gnutls_certificate_get_peers(soap->session, &cert_list_size)) == NULL) err = "Could not get X509 certificates"; else if (gnutls_x509_crt_import(cert, &cert_list[0], GNUTLS_X509_FMT_DER) < 0) err = "Error parsing X509 certificate"; else if (!(soap->ssl_flags & SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE) && gnutls_x509_crt_get_expiration_time(cert) < time(NULL)) err = "The certificate has expired"; else if (!(soap->ssl_flags & SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE) && gnutls_x509_crt_get_activation_time(cert) > time(NULL)) err = "The certificate is not yet activated"; else if (host && !(soap->ssl_flags & SOAP_SSL_SKIP_HOST_CHECK)) { if (!gnutls_x509_crt_check_hostname(cert, host)) err = "Certificate host name mismatch"; } gnutls_x509_crt_deinit(cert); } return err; } #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) #ifndef WITH_NOIO #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_ssl_accept(struct soap *soap) { SOAP_SOCKET fd = soap->socket; #ifdef WITH_OPENSSL BIO *bio; int retries, r, s; if (!soap_valid_socket(fd)) return soap_set_receiver_error(soap, "SSL/TLS error", "No socket in soap_ssl_accept()", SOAP_SSL_ERROR); soap->ssl_flags &= ~SOAP_SSL_CLIENT; if (!soap->ctx && (soap->error = soap->fsslauth(soap))) return soap->error; if (!soap->ssl) { soap->ssl = SSL_new(soap->ctx); if (!soap->ssl) return soap_set_receiver_error(soap, "SSL/TLS error", "SSL_new() failed in soap_ssl_accept()", SOAP_SSL_ERROR); } else SSL_clear(soap->ssl); bio = BIO_new_socket((int)fd, BIO_NOCLOSE); SSL_set_bio(soap->ssl, bio, bio); /* Set SSL sockets to non-blocking */ retries = 0; if (soap->accept_timeout) { SOAP_SOCKNONBLOCK(fd) retries = 10*soap->accept_timeout; } if (retries <= 0) retries = 100; /* timeout: 10 sec retries, 100 times 0.1 sec */ while ((r = SSL_accept(soap->ssl)) <= 0) { int err; if (retries-- <= 0) break; err = SSL_get_error(soap->ssl, r); if (err == SSL_ERROR_WANT_ACCEPT || err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE) { if (err == SSL_ERROR_WANT_READ) s = tcp_select(soap, fd, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, -100000); else s = tcp_select(soap, fd, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, -100000); if (s < 0 && soap->errnum != SOAP_EINTR) break; } else { soap->errnum = soap_socket_errno(fd); break; } } if (r <= 0) { soap_set_receiver_error(soap, soap_ssl_error(soap, r), "SSL_accept() failed in soap_ssl_accept()", SOAP_SSL_ERROR); soap_closesock(soap); return SOAP_SSL_ERROR; } if ((soap->ssl_flags & SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION)) { X509 *peer; int err; if ((err = SSL_get_verify_result(soap->ssl)) != X509_V_OK) { soap_closesock(soap); return soap_set_sender_error(soap, X509_verify_cert_error_string(err), "SSL certificate presented by peer cannot be verified in soap_ssl_accept()", SOAP_SSL_ERROR); } peer = SSL_get_peer_certificate(soap->ssl); if (!peer) { soap_closesock(soap); return soap_set_sender_error(soap, "SSL/TLS error", "No SSL certificate was presented by the peer in soap_ssl_accept()", SOAP_SSL_ERROR); } X509_free(peer); } #endif #ifdef WITH_GNUTLS int retries = 0, r; if (!soap_valid_socket(fd)) return soap_set_receiver_error(soap, "SSL/TLS error", "No socket in soap_ssl_accept()", SOAP_SSL_ERROR); soap->ssl_flags &= ~SOAP_SSL_CLIENT; if (!soap->session && (soap->error = soap->fsslauth(soap))) { soap_closesock(soap); return soap->error; } gnutls_transport_set_ptr(soap->session, (gnutls_transport_ptr_t)(long)fd); /* Set SSL sockets to non-blocking */ if (soap->accept_timeout) { SOAP_SOCKNONBLOCK(fd) retries = 10*soap->accept_timeout; } if (retries <= 0) retries = 100; /* timeout: 10 sec retries, 100 times 0.1 sec */ while ((r = gnutls_handshake(soap->session))) { int s; /* GNUTLS repeat handhake when GNUTLS_E_AGAIN */ if (retries-- <= 0) break; if (r == GNUTLS_E_AGAIN || r == GNUTLS_E_INTERRUPTED) { if (!gnutls_record_get_direction(soap->session)) s = tcp_select(soap, fd, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, -100000); else s = tcp_select(soap, fd, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, -100000); if (s < 0 && soap->errnum != SOAP_EINTR) break; } else { soap->errnum = soap_socket_errno(fd); break; } } if (r) { soap_closesock(soap); return soap_set_receiver_error(soap, soap_ssl_error(soap, r), "SSL/TLS handshake failed", SOAP_SSL_ERROR); } if ((soap->ssl_flags & SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION)) { const char *err = ssl_verify(soap, NULL); if (err) { soap_closesock(soap); return soap_set_receiver_error(soap, "SSL/TLS error", err, SOAP_SSL_ERROR); } } #endif if (soap->recv_timeout || soap->send_timeout) SOAP_SOCKNONBLOCK(fd) else SOAP_SOCKBLOCK(fd) soap->imode |= SOAP_ENC_SSL; soap->omode |= SOAP_ENC_SSL; return SOAP_OK; } #endif #endif #endif /******************************************************************************\ * * TCP/UDP [SSL/TLS] IPv4 and IPv6 * \******************************************************************************/ /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 static int tcp_init(struct soap *soap) { soap->errmode = 1; #ifdef WIN32 if (tcp_done) return 0; else { WSADATA w; if (WSAStartup(MAKEWORD(1, 1), &w)) return -1; tcp_done = 1; } #endif return 0; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 static const char* tcp_error(struct soap *soap) { register const char *msg = NULL; switch (soap->errmode) { case 0: msg = soap_strerror(soap); break; case 1: msg = "WSAStartup failed"; break; case 2: { #ifndef WITH_LEAN msg = soap_code_str(h_error_codes, soap->errnum); if (!msg) #endif { sprintf(soap->msgbuf, "TCP/UDP IP error %d", soap->errnum); msg = soap->msgbuf; } } } return msg; } #endif #endif /******************************************************************************/ #ifndef WITH_IPV6 #ifndef WITH_NOIO #ifndef PALM_1 static int tcp_gethost(struct soap *soap, const char *addr, struct in_addr *inaddr) { soap_int32 iadd = -1; struct hostent hostent, *host = &hostent; #ifdef VXWORKS int hostint; /* inet_addr(), and hostGetByName() expect "char *"; addr is a "const char *". */ iadd = inet_addr((char*)addr); #else #if defined(_AIX43) || ((defined(TRU64) || defined(HP_UX)) && defined(HAVE_GETHOSTBYNAME_R)) struct hostent_data ht_data; #endif #ifdef AS400 iadd = inet_addr((void*)addr); #else iadd = inet_addr(addr); #endif #endif if (iadd != -1) { memcpy(inaddr, &iadd, sizeof(iadd)); return SOAP_OK; } #if defined(__GLIBC__) || (defined(HAVE_GETHOSTBYNAME_R) && (defined(FREEBSD) || defined(__FreeBSD__))) if (gethostbyname_r(addr, &hostent, soap->buf, SOAP_BUFLEN, &host, &soap->errnum) < 0) host = NULL; #elif defined(_AIX43) || ((defined(TRU64) || defined(HP_UX)) && defined(HAVE_GETHOSTBYNAME_R)) memset((void*)&ht_data, 0, sizeof(ht_data)); if (gethostbyname_r(addr, &hostent, &ht_data) < 0) { host = NULL; soap->errnum = h_errno; } #elif defined(HAVE_GETHOSTBYNAME_R) host = gethostbyname_r(addr, &hostent, soap->buf, SOAP_BUFLEN, &soap->errnum); #elif defined(VXWORKS) /* If the DNS resolver library resolvLib has been configured in the vxWorks * image, a query for the host IP address is sent to the DNS server, if the * name was not found in the local host table. */ hostint = hostGetByName((char*)addr); if (hostint == ERROR) { host = NULL; soap->errnum = soap_errno; } #else #ifdef AS400 if (!(host = gethostbyname((void*)addr))) soap->errnum = h_errno; #else if (!(host = gethostbyname(addr))) soap->errnum = h_errno; #endif #endif if (!host) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Host name not found\n")); return SOAP_ERR; } #ifdef VXWORKS inaddr->s_addr = hostint; #else memcpy(inaddr, host->h_addr, host->h_length); #endif return SOAP_OK; } #endif #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 static SOAP_SOCKET tcp_connect(struct soap *soap, const char *endpoint, const char *host, int port) { #ifdef WITH_IPV6 struct addrinfo hints, *res, *ressave; #endif SOAP_SOCKET fd; int err = 0; #ifndef WITH_LEAN #ifndef WIN32 int len = SOAP_BUFLEN; #else int len = SOAP_BUFLEN + 1; /* speeds up windows xfer */ #endif int set = 1; #endif #if !defined(WITH_LEAN) || defined(WITH_OPENSSL) || defined(WITH_GNUTLS) int retries; #endif if (soap_valid_socket(soap->socket)) soap->fclosesocket(soap, soap->socket); soap->socket = SOAP_INVALID_SOCKET; if (tcp_init(soap)) { soap->errnum = 0; soap_set_sender_error(soap, tcp_error(soap), "TCP init failed in tcp_connect()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } soap->errmode = 0; #ifdef WITH_IPV6 memset((void*)&hints, 0, sizeof(hints)); hints.ai_family = PF_UNSPEC; #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) hints.ai_socktype = SOCK_DGRAM; else #endif hints.ai_socktype = SOCK_STREAM; soap->errmode = 2; if (soap->proxy_host) err = getaddrinfo(soap->proxy_host, soap_int2s(soap, soap->proxy_port), &hints, &res); else err = getaddrinfo(host, soap_int2s(soap, port), &hints, &res); if (err) { soap_set_sender_error(soap, SOAP_GAI_STRERROR(err), "getaddrinfo failed in tcp_connect()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } ressave = res; again: fd = socket(res->ai_family, res->ai_socktype, res->ai_protocol); soap->errmode = 0; #else #ifndef WITH_LEAN again: #endif #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) fd = socket(AF_INET, SOCK_DGRAM, 0); else #endif fd = socket(AF_INET, SOCK_STREAM, 0); #endif if (!soap_valid_socket(fd)) { #ifdef WITH_IPV6 if (res->ai_next) { res = res->ai_next; goto again; } #endif soap->errnum = soap_socket_errno(fd); soap_set_sender_error(soap, tcp_error(soap), "socket failed in tcp_connect()", SOAP_TCP_ERROR); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } #ifdef SOCKET_CLOSE_ON_EXEC #ifdef WIN32 #ifndef UNDER_CE SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0); #endif #else fcntl(fd, F_SETFD, 1); #endif #endif #ifndef WITH_LEAN if (soap->connect_flags == SO_LINGER) { struct linger linger; memset((void*)&linger, 0, sizeof(linger)); linger.l_onoff = 1; linger.l_linger = soap->linger_time; if (setsockopt(fd, SOL_SOCKET, SO_LINGER, (char*)&linger, sizeof(struct linger))) { soap->errnum = soap_socket_errno(fd); soap_set_sender_error(soap, tcp_error(soap), "setsockopt SO_LINGER failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, fd); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } } else if (soap->connect_flags && setsockopt(fd, SOL_SOCKET, soap->connect_flags, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(fd); soap_set_sender_error(soap, tcp_error(soap), "setsockopt failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, fd); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } if ((soap->keep_alive || soap->tcp_keep_alive) && setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(fd); soap_set_sender_error(soap, tcp_error(soap), "setsockopt SO_KEEPALIVE failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, fd); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } if (setsockopt(fd, SOL_SOCKET, SO_SNDBUF, (char*)&len, sizeof(int))) { soap->errnum = soap_socket_errno(fd); soap_set_sender_error(soap, tcp_error(soap), "setsockopt SO_SNDBUF failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, fd); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } if (setsockopt(fd, SOL_SOCKET, SO_RCVBUF, (char*)&len, sizeof(int))) { soap->errnum = soap_socket_errno(fd); soap_set_sender_error(soap, tcp_error(soap), "setsockopt SO_RCVBUF failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, fd); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } #ifdef TCP_KEEPIDLE if (soap->tcp_keep_idle && setsockopt((SOAP_SOCKET)fd, IPPROTO_TCP, TCP_KEEPIDLE, (char*)&(soap->tcp_keep_idle), sizeof(int))) { soap->errnum = soap_socket_errno(fd); soap_set_sender_error(soap, tcp_error(soap), "setsockopt TCP_KEEPIDLE failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, (SOAP_SOCKET)fd); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } #endif #ifdef TCP_KEEPINTVL if (soap->tcp_keep_intvl && setsockopt((SOAP_SOCKET)fd, IPPROTO_TCP, TCP_KEEPINTVL, (char*)&(soap->tcp_keep_intvl), sizeof(int))) { soap->errnum = soap_socket_errno(fd); soap_set_sender_error(soap, tcp_error(soap), "setsockopt TCP_KEEPINTVL failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, (SOAP_SOCKET)fd); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } #endif #ifdef TCP_KEEPCNT if (soap->tcp_keep_cnt && setsockopt((SOAP_SOCKET)fd, IPPROTO_TCP, TCP_KEEPCNT, (char*)&(soap->tcp_keep_cnt), sizeof(int))) { soap->errnum = soap_socket_errno(fd); soap_set_sender_error(soap, tcp_error(soap), "setsockopt TCP_KEEPCNT failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, (SOAP_SOCKET)fd); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } #endif #ifdef TCP_NODELAY if (!(soap->omode & SOAP_IO_UDP) && setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(fd); soap_set_sender_error(soap, tcp_error(soap), "setsockopt TCP_NODELAY failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, fd); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } #endif #ifdef WITH_IPV6 if ((soap->omode & SOAP_IO_UDP) && soap->ipv6_multicast_if) { struct sockaddr_in6 *in6addr = (struct sockaddr_in6*)res->ai_addr; in6addr->sin6_scope_id = soap->ipv6_multicast_if; } #endif #ifdef IP_MULTICAST_TTL if ((soap->omode & SOAP_IO_UDP)) { if (soap->ipv4_multicast_ttl) { unsigned char ttl = soap->ipv4_multicast_ttl; if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_TTL, (char*)&ttl, sizeof(ttl))) { soap->errnum = soap_socket_errno(fd); soap_set_sender_error(soap, tcp_error(soap), "setsockopt IP_MULTICAST_TTL failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, fd); return SOAP_INVALID_SOCKET; } } if ((soap->omode & SOAP_IO_UDP) && soap->ipv4_multicast_if && !soap->ipv6_multicast_if) { if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_IF, (char*)soap->ipv4_multicast_if, sizeof(struct in_addr))) #ifndef WINDOWS { soap->errnum = soap_socket_errno(fd); soap_set_sender_error(soap, tcp_error(soap), "setsockopt IP_MULTICAST_IF failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, fd); return SOAP_INVALID_SOCKET; } #else #ifndef IP_MULTICAST_IF #define IP_MULTICAST_IF 2 #endif if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_IF, (char*)soap->ipv4_multicast_if, sizeof(struct in_addr))) { soap->errnum = soap_socket_errno(fd); soap_set_sender_error(soap, tcp_error(soap), "setsockopt IP_MULTICAST_IF failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, fd); return SOAP_INVALID_SOCKET; } #endif } } #endif #endif DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Opening socket %d to host='%s' port=%d\n", fd, host, port)); #ifndef WITH_IPV6 soap->peerlen = sizeof(soap->peer); memset((void*)&soap->peer, 0, sizeof(soap->peer)); soap->peer.sin_family = AF_INET; soap->errmode = 2; if (soap->proxy_host) { if (soap->fresolve(soap, soap->proxy_host, &soap->peer.sin_addr)) { soap_set_sender_error(soap, tcp_error(soap), "get proxy host by name failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, fd); return SOAP_INVALID_SOCKET; } soap->peer.sin_port = htons((short)soap->proxy_port); } else { if (soap->fresolve(soap, host, &soap->peer.sin_addr)) { soap_set_sender_error(soap, tcp_error(soap), "get host by name failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, fd); return SOAP_INVALID_SOCKET; } soap->peer.sin_port = htons((short)port); } soap->errmode = 0; #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) return fd; #endif #else if ((soap->omode & SOAP_IO_UDP)) { memcpy(&soap->peer, res->ai_addr, res->ai_addrlen); soap->peerlen = res->ai_addrlen; freeaddrinfo(ressave); return fd; } #endif #ifndef WITH_LEAN if (soap->connect_timeout) SOAP_SOCKNONBLOCK(fd) else SOAP_SOCKBLOCK(fd) retries = 10; #endif for (;;) { #ifdef WITH_IPV6 if (connect(fd, res->ai_addr, (int)res->ai_addrlen)) #else if (connect(fd, (struct sockaddr*)&soap->peer, sizeof(soap->peer))) #endif { err = soap_socket_errno(fd); #ifndef WITH_LEAN if (err == SOAP_EADDRINUSE) { soap->fclosesocket(soap, fd); if (retries-- > 0) goto again; } else if (soap->connect_timeout && (err == SOAP_EINPROGRESS || err == SOAP_EAGAIN || err == SOAP_EWOULDBLOCK)) { SOAP_SOCKLEN_T k; for (;;) { register int r; r = tcp_select(soap, fd, SOAP_TCP_SELECT_SND, soap->connect_timeout); if (r > 0) break; if (!r) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connect timeout\n")); soap_set_sender_error(soap, "Timeout", "connect failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, fd); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } r = soap->errnum; if (r != SOAP_EINTR) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not connect to host\n")); soap_set_sender_error(soap, tcp_error(soap), "connect failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, fd); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } } k = (SOAP_SOCKLEN_T)sizeof(soap->errnum); if (!getsockopt(fd, SOL_SOCKET, SO_ERROR, (char*)&soap->errnum, &k) && !soap->errnum) /* portability note: see SOAP_SOCKLEN_T definition in stdsoap2.h */ break; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not connect to host\n")); if (!soap->errnum) soap->errnum = soap_socket_errno(fd); soap_set_sender_error(soap, tcp_error(soap), "connect failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, fd); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } #endif #ifdef WITH_IPV6 if (res->ai_next) { res = res->ai_next; soap->fclosesocket(soap, fd); goto again; } #endif if (err && err != SOAP_EINTR) { soap->errnum = err; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not connect to host\n")); soap_set_sender_error(soap, tcp_error(soap), "connect failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, fd); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } } else break; } #ifdef WITH_IPV6 soap->peerlen = 0; /* IPv6: already connected so use send() */ freeaddrinfo(ressave); #endif soap->socket = fd; soap->imode &= ~SOAP_ENC_SSL; soap->omode &= ~SOAP_ENC_SSL; if (!soap_tag_cmp(endpoint, "https:*")) { #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) #ifdef WITH_OPENSSL BIO *bio; #endif int r; if (soap->proxy_host) { soap_mode m = soap->mode; /* preserve settings */ soap_mode om = soap->omode; /* make sure we only parse HTTP */ size_t n = soap->count; /* save the content length */ const char *userid, *passwd; int status = soap->status; /* save the current status/command */ short keep_alive = soap->keep_alive; /* save the KA status */ soap->omode &= ~SOAP_ENC; /* mask IO and ENC */ soap->omode |= SOAP_IO_BUFFER; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connecting to %s proxy server\n", soap->proxy_http_version)); #ifdef WITH_NTLM if (soap->ntlm_challenge) { if (soap_ntlm_handshake(soap, SOAP_CONNECT, endpoint, host, port)) return soap->error; } #endif if (soap_begin_send(soap)) { soap->fclosesocket(soap, fd); return SOAP_INVALID_SOCKET; } soap->status = SOAP_CONNECT; soap->keep_alive = 1; if ((soap->error = soap->fpost(soap, endpoint, host, port, NULL, NULL, 0)) || soap_end_send(soap)) { soap->fclosesocket(soap, fd); return SOAP_INVALID_SOCKET; } soap->keep_alive = keep_alive; soap->status = status; soap->omode = om; om = soap->imode; soap->imode &= ~SOAP_ENC; /* mask IO and ENC */ userid = soap->userid; /* preserve */ passwd = soap->passwd; /* preserve */ if ((soap->error = soap->fparse(soap))) { soap->fclosesocket(soap, fd); return SOAP_INVALID_SOCKET; } soap->userid = userid; /* restore */ soap->passwd = passwd; /* restore */ soap->imode = om; /* restore */ soap->count = n; /* restore */ if (soap_begin_send(soap)) { soap->fclosesocket(soap, fd); return SOAP_INVALID_SOCKET; } if (endpoint) strncpy(soap->endpoint, endpoint, sizeof(soap->endpoint)-1); /* restore */ soap->mode = m; } #ifdef WITH_OPENSSL soap->ssl_flags |= SOAP_SSL_CLIENT; if (!soap->ctx && (soap->error = soap->fsslauth(soap))) { soap->fclosesocket(soap, fd); return SOAP_INVALID_SOCKET; } if (!soap->ssl) { soap->ssl = SSL_new(soap->ctx); if (!soap->ssl) { soap->fclosesocket(soap, fd); soap->error = SOAP_SSL_ERROR; return SOAP_INVALID_SOCKET; } } else SSL_clear(soap->ssl); if (soap->session) { if (!strcmp(soap->session_host, host) && soap->session_port == port) SSL_set_session(soap->ssl, soap->session); SSL_SESSION_free(soap->session); soap->session = NULL; } soap->imode |= SOAP_ENC_SSL; soap->omode |= SOAP_ENC_SSL; bio = BIO_new_socket((int)fd, BIO_NOCLOSE); SSL_set_bio(soap->ssl, bio, bio); /* Connect timeout: set SSL sockets to non-blocking */ retries = 0; if (soap->connect_timeout) { SOAP_SOCKNONBLOCK(fd) retries = 10*soap->connect_timeout; } else SOAP_SOCKBLOCK(fd) if (retries <= 0) retries = 100; /* timeout: 10 sec retries, 100 times 0.1 sec */ /* Try connecting until success or timeout (when nonblocking) */ do { if ((r = SSL_connect(soap->ssl)) <= 0) { int err = SSL_get_error(soap->ssl, r); if (err == SSL_ERROR_WANT_CONNECT || err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE) { register int s; if (err == SSL_ERROR_WANT_READ) s = tcp_select(soap, fd, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, -100000); else s = tcp_select(soap, fd, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, -100000); if (s < 0 && soap->errnum != SOAP_EINTR) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL_connect/select error in tcp_connect\n")); soap_set_sender_error(soap, soap_ssl_error(soap, r), "SSL_connect failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, fd); return SOAP_INVALID_SOCKET; } if (s == 0 && retries-- <= 0) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL/TLS connect timeout\n")); soap_set_sender_error(soap, "Timeout", "SSL_connect failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, fd); return SOAP_INVALID_SOCKET; } } else { soap_set_sender_error(soap, soap_ssl_error(soap, r), "SSL_connect error in tcp_connect()", SOAP_SSL_ERROR); soap->fclosesocket(soap, fd); return SOAP_INVALID_SOCKET; } } } while (!SSL_is_init_finished(soap->ssl)); /* Set SSL sockets to nonblocking */ SOAP_SOCKNONBLOCK(fd) /* Check server credentials when required */ if ((soap->ssl_flags & SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION)) { int err; if ((err = SSL_get_verify_result(soap->ssl)) != X509_V_OK) { soap_set_sender_error(soap, X509_verify_cert_error_string(err), "SSL/TLS certificate presented by peer cannot be verified in tcp_connect()", SOAP_SSL_ERROR); soap->fclosesocket(soap, fd); return SOAP_INVALID_SOCKET; } if (!(soap->ssl_flags & SOAP_SSL_SKIP_HOST_CHECK)) { X509_NAME *subj; int ext_count; int ok = 0; X509 *peer; peer = SSL_get_peer_certificate(soap->ssl); if (!peer) { soap_set_sender_error(soap, "SSL/TLS error", "No SSL/TLS certificate was presented by the peer in tcp_connect()", SOAP_SSL_ERROR); soap->fclosesocket(soap, fd); return SOAP_INVALID_SOCKET; } ext_count = X509_get_ext_count(peer); if (ext_count > 0) { int i; for (i = 0; i < ext_count; i++) { X509_EXTENSION *ext = X509_get_ext(peer, i); const char *ext_str = OBJ_nid2sn(OBJ_obj2nid(X509_EXTENSION_get_object(ext))); if (ext_str && !strcmp(ext_str, "subjectAltName")) { X509V3_EXT_METHOD *meth = (X509V3_EXT_METHOD*)X509V3_EXT_get(ext); void *ext_data; #if (OPENSSL_VERSION_NUMBER >= 0x0090800fL) const unsigned char *data; #else unsigned char *data; #endif STACK_OF(CONF_VALUE) *val; int j; if (!meth) break; data = ext->value->data; #if (OPENSSL_VERSION_NUMBER > 0x00907000L) if (meth->it) ext_data = ASN1_item_d2i(NULL, &data, ext->value->length, ASN1_ITEM_ptr(meth->it)); else { /* OpenSSL not perfectly portable at this point (?): Some compilers appear to prefer meth->d2i(NULL, (const unsigned char**)&data, ... and others prefer meth->d2i(NULL, &data, ext->value->length); */ ext_data = meth->d2i(NULL, &data, ext->value->length); } #else ext_data = meth->d2i(NULL, &data, ext->value->length); #endif if (ext_data) { val = meth->i2v(meth, ext_data, NULL); if (val) { for (j = 0; j < sk_CONF_VALUE_num(val); j++) { CONF_VALUE *nval = sk_CONF_VALUE_value(val, j); if (nval && !strcmp(nval->name, "DNS") && !strcmp(nval->value, host)) { ok = 1; break; } } sk_CONF_VALUE_pop_free(val, X509V3_conf_free); } #if (OPENSSL_VERSION_NUMBER > 0x00907000L) if (meth->it) ASN1_item_free((ASN1_VALUE*)ext_data, ASN1_ITEM_ptr(meth->it)); else meth->ext_free(ext_data); #else meth->ext_free(ext_data); #endif } } if (ok) break; } } if (!ok && (subj = X509_get_subject_name(peer))) { int i = -1; do { ASN1_STRING *name; i = X509_NAME_get_index_by_NID(subj, NID_commonName, i); if (i == -1) break; name = X509_NAME_ENTRY_get_data(X509_NAME_get_entry(subj, i)); if (name) { if (!soap_tag_cmp(host, (const char*)M_ASN1_STRING_data(name))) ok = 1; else { unsigned char *tmp = NULL; ASN1_STRING_to_UTF8(&tmp, name); if (tmp) { if (!soap_tag_cmp(host, (const char*)tmp)) ok = 1; else if (tmp[0] == '*') /* wildcard domain */ { const char *t = strchr(host, '.'); if (t && !soap_tag_cmp(t, (const char*)tmp+1)) ok = 1; } OPENSSL_free(tmp); } } } } while (!ok); } X509_free(peer); if (!ok) { soap_set_sender_error(soap, "SSL/TLS error", "SSL/TLS certificate host name mismatch in tcp_connect()", SOAP_SSL_ERROR); soap->fclosesocket(soap, fd); return SOAP_INVALID_SOCKET; } } } #endif #ifdef WITH_GNUTLS soap->ssl_flags |= SOAP_SSL_CLIENT; if (!soap->session && (soap->error = soap->fsslauth(soap))) { soap->fclosesocket(soap, fd); return SOAP_INVALID_SOCKET; } gnutls_transport_set_ptr(soap->session, (gnutls_transport_ptr_t)(long)fd); /* Set SSL sockets to non-blocking */ if (soap->connect_timeout) { SOAP_SOCKNONBLOCK(fd) retries = 10*soap->connect_timeout; } else SOAP_SOCKBLOCK(fd) if (retries <= 0) retries = 100; /* timeout: 10 sec retries, 100 times 0.1 sec */ while ((r = gnutls_handshake(soap->session))) { int s; /* GNUTLS repeat handhake when GNUTLS_E_AGAIN */ if (retries-- <= 0) break; if (r == GNUTLS_E_AGAIN || r == GNUTLS_E_INTERRUPTED) { if (!gnutls_record_get_direction(soap->session)) s = tcp_select(soap, fd, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, -100000); else s = tcp_select(soap, fd, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, -100000); if (s < 0 && soap->errnum != SOAP_EINTR) break; } else { soap->errnum = soap_socket_errno(fd); break; } } if (r) { soap_set_sender_error(soap, soap_ssl_error(soap, r), "SSL/TLS handshake failed", SOAP_SSL_ERROR); soap->fclosesocket(soap, fd); return SOAP_INVALID_SOCKET; } if ((soap->ssl_flags & SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION)) { const char *err = ssl_verify(soap, host); if (err) { soap->fclosesocket(soap, fd); soap->error = soap_set_sender_error(soap, "SSL/TLS error", err, SOAP_SSL_ERROR); return SOAP_INVALID_SOCKET; } } #endif #else soap->fclosesocket(soap, fd); soap->error = SOAP_SSL_ERROR; return SOAP_INVALID_SOCKET; #endif } if (soap->recv_timeout || soap->send_timeout) SOAP_SOCKNONBLOCK(fd) else SOAP_SOCKBLOCK(fd) return fd; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 static int tcp_select(struct soap *soap, SOAP_SOCKET s, int flags, int timeout) { register int r; struct timeval tv; fd_set fd[3], *rfd, *sfd, *efd; soap->errnum = 0; #ifndef WIN32 #if !defined(FD_SETSIZE) || defined(__QNX__) || defined(QNX) /* no FD_SETSIZE or select() is not MT safe on some QNX: always poll */ if (1) #else /* if fd max set size exceeded, use poll() */ if ((int)s >= (int)FD_SETSIZE) #endif #ifdef HAVE_POLL { struct pollfd pollfd; int retries = 0; pollfd.fd = (int)s; pollfd.events = 0; if (flags & SOAP_TCP_SELECT_RCV) pollfd.events |= POLLIN; if (flags & SOAP_TCP_SELECT_SND) pollfd.events |= POLLOUT; if (flags & SOAP_TCP_SELECT_ERR) pollfd.events |= POLLERR; if (timeout < 0) timeout /= -1000; /* -usec -> ms */ else if (timeout <= 1000000) /* avoid overflow */ timeout *= 1000; /* sec -> ms */ else { retries = timeout / 1000000; timeout = 1000000000; } do r = poll(&pollfd, 1, timeout); while (r == 0 && retries--); if (r > 0) { r = 0; if ((flags & SOAP_TCP_SELECT_RCV) && (pollfd.revents & POLLIN)) r |= SOAP_TCP_SELECT_RCV; if ((flags & SOAP_TCP_SELECT_SND) && (pollfd.revents & POLLOUT)) r |= SOAP_TCP_SELECT_SND; if ((flags & SOAP_TCP_SELECT_ERR) && (pollfd.revents & POLLERR)) r |= SOAP_TCP_SELECT_ERR; } else if (r < 0) soap->errnum = soap_socket_errno(s); return r; } #else { soap->error = SOAP_FD_EXCEEDED; return -1; } #endif #endif rfd = sfd = efd = NULL; if (flags & SOAP_TCP_SELECT_RCV) { rfd = &fd[0]; FD_ZERO(rfd); FD_SET(s, rfd); } if (flags & SOAP_TCP_SELECT_SND) { sfd = &fd[1]; FD_ZERO(sfd); FD_SET(s, sfd); } if (flags & SOAP_TCP_SELECT_ERR) { efd = &fd[2]; FD_ZERO(efd); FD_SET(s, efd); } if (timeout >= 0) { tv.tv_sec = timeout; tv.tv_usec = 0; } else { tv.tv_sec = -timeout / 1000000; tv.tv_usec = -timeout % 1000000; } r = select((int)s + 1, rfd, sfd, efd, &tv); if (r > 0) { r = 0; if ((flags & SOAP_TCP_SELECT_RCV) && FD_ISSET(s, rfd)) r |= SOAP_TCP_SELECT_RCV; if ((flags & SOAP_TCP_SELECT_SND) && FD_ISSET(s, sfd)) r |= SOAP_TCP_SELECT_SND; if ((flags & SOAP_TCP_SELECT_ERR) && FD_ISSET(s, efd)) r |= SOAP_TCP_SELECT_ERR; } else if (r < 0) soap->errnum = soap_socket_errno(s); return r; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 static SOAP_SOCKET tcp_accept(struct soap *soap, SOAP_SOCKET s, struct sockaddr *a, int *n) { SOAP_SOCKET fd; (void)soap; fd = accept(s, a, (SOAP_SOCKLEN_T*)n); /* portability note: see SOAP_SOCKLEN_T definition in stdsoap2.h */ #ifdef SOCKET_CLOSE_ON_EXEC #ifdef WIN32 #ifndef UNDER_CE SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0); #endif #else fcntl(fd, F_SETFD, FD_CLOEXEC); #endif #endif return fd; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 static int tcp_disconnect(struct soap *soap) { #ifdef WITH_OPENSSL if (soap->ssl) { int r, s = 0; if (soap->session) { SSL_SESSION_free(soap->session); soap->session = NULL; } if (*soap->host) { soap->session = SSL_get1_session(soap->ssl); if (soap->session) { strcpy(soap->session_host, soap->host); soap->session_port = soap->port; } } r = SSL_shutdown(soap->ssl); /* SSL shutdown does not work when reads are pending, non-blocking */ if (r == 0) { while (SSL_want_read(soap->ssl)) { if (SSL_read(soap->ssl, NULL, 0) || soap_socket_errno(soap->socket) != SOAP_EAGAIN) { r = SSL_shutdown(soap->ssl); break; } } } if (r == 0) { if (soap_valid_socket(soap->socket)) { if (!soap->fshutdownsocket(soap, soap->socket, SOAP_SHUT_WR)) { #if !defined(WITH_LEAN) && !defined(WIN32) /* wait up to 5 seconds for close_notify to be sent by peer (if peer not present, this avoids calling SSL_shutdown() which has a lengthy return timeout) */ r = tcp_select(soap, soap->socket, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, 5); if (r <= 0 && soap->errnum != SOAP_EINTR) { soap->errnum = 0; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connection lost...\n")); soap->fclosesocket(soap, soap->socket); soap->socket = SOAP_INVALID_SOCKET; ERR_remove_state(0); SSL_free(soap->ssl); soap->ssl = NULL; return SOAP_OK; } #else r = SSL_shutdown(soap->ssl); #endif } } } if (r != 1) { s = ERR_get_error(); if (s) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Shutdown failed: %d\n", SSL_get_error(soap->ssl, r))); if (soap_valid_socket(soap->socket) && !(soap->omode & SOAP_IO_UDP)) { soap->fclosesocket(soap, soap->socket); soap->socket = SOAP_INVALID_SOCKET; } } } SSL_free(soap->ssl); soap->ssl = NULL; if (s) return SOAP_SSL_ERROR; ERR_remove_state(0); } #endif #ifdef WITH_GNUTLS if (soap->session) { gnutls_bye(soap->session, GNUTLS_SHUT_RDWR); gnutls_deinit(soap->session); soap->session = NULL; } #endif if (soap_valid_socket(soap->socket) && !(soap->omode & SOAP_IO_UDP)) { soap->fshutdownsocket(soap, soap->socket, SOAP_SHUT_RDWR); soap->fclosesocket(soap, soap->socket); soap->socket = SOAP_INVALID_SOCKET; } return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 static int tcp_closesocket(struct soap *soap, SOAP_SOCKET fd) { (void)soap; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Close socket %d\n", (int)fd)); return soap_closesocket(fd); } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 static int tcp_shutdownsocket(struct soap *soap, SOAP_SOCKET fd, int how) { (void)soap; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Shutdown socket %d how=%d\n", (int)fd, how)); return shutdown(fd, how); } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 SOAP_FMAC1 SOAP_SOCKET SOAP_FMAC2 soap_bind(struct soap *soap, const char *host, int port, int backlog) { #ifdef WITH_IPV6 struct addrinfo *addrinfo = NULL; struct addrinfo hints; struct addrinfo res; int err; #ifdef WITH_NO_IPV6_V6ONLY int unset = 0; #endif #endif #ifndef WITH_LEAN #ifndef WIN32 int len = SOAP_BUFLEN; #else int len = SOAP_BUFLEN + 1; /* speeds up windows xfer */ #endif int set = 1; #endif if (soap_valid_socket(soap->master)) { soap->fclosesocket(soap, soap->master); soap->master = SOAP_INVALID_SOCKET; } soap->socket = SOAP_INVALID_SOCKET; soap->errmode = 1; if (tcp_init(soap)) { soap_set_receiver_error(soap, tcp_error(soap), "TCP init failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } #ifdef WITH_IPV6 memset((void*)&hints, 0, sizeof(hints)); hints.ai_family = PF_UNSPEC; #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) hints.ai_socktype = SOCK_DGRAM; else #endif hints.ai_socktype = SOCK_STREAM; hints.ai_flags = AI_PASSIVE; soap->errmode = 2; err = getaddrinfo(host, soap_int2s(soap, port), &hints, &addrinfo); if (err || !addrinfo) { soap_set_receiver_error(soap, SOAP_GAI_STRERROR(err), "getaddrinfo failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } res = *addrinfo; memcpy(&soap->peer, addrinfo->ai_addr, addrinfo->ai_addrlen); soap->peerlen = addrinfo->ai_addrlen; res.ai_addr = (struct sockaddr*)&soap->peer; res.ai_addrlen = soap->peerlen; freeaddrinfo(addrinfo); soap->master = (int)socket(res.ai_family, res.ai_socktype, res.ai_protocol); #else #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) soap->master = (int)socket(AF_INET, SOCK_DGRAM, 0); else #endif soap->master = (int)socket(AF_INET, SOCK_STREAM, 0); #endif soap->errmode = 0; if (!soap_valid_socket(soap->master)) { soap->errnum = soap_socket_errno(soap->master); soap_set_receiver_error(soap, tcp_error(soap), "socket failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) soap->socket = soap->master; #endif #ifdef SOCKET_CLOSE_ON_EXEC #ifdef WIN32 #ifndef UNDER_CE SetHandleInformation((HANDLE)soap->master, HANDLE_FLAG_INHERIT, 0); #endif #else fcntl(soap->master, F_SETFD, 1); #endif #endif #ifndef WITH_LEAN if (soap->bind_flags && setsockopt(soap->master, SOL_SOCKET, soap->bind_flags, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(soap->master); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } if (((soap->imode | soap->omode) & SOAP_IO_KEEPALIVE) && setsockopt(soap->master, SOL_SOCKET, SO_KEEPALIVE, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(soap->master); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_KEEPALIVE failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } if (setsockopt(soap->master, SOL_SOCKET, SO_SNDBUF, (char*)&len, sizeof(int))) { soap->errnum = soap_socket_errno(soap->master); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_SNDBUF failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } if (setsockopt(soap->master, SOL_SOCKET, SO_RCVBUF, (char*)&len, sizeof(int))) { soap->errnum = soap_socket_errno(soap->master); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_RCVBUF failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } #ifdef TCP_NODELAY if (!(soap->omode & SOAP_IO_UDP) && setsockopt(soap->master, IPPROTO_TCP, TCP_NODELAY, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(soap->master); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt TCP_NODELAY failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } #endif #endif #ifdef WITH_IPV6 #ifdef WITH_IPV6_V6ONLY if (setsockopt(soap->master, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(soap->master); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt set IPV6_V6ONLY failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } #endif #ifdef WITH_NO_IPV6_V6ONLY if (setsockopt(soap->master, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&unset, sizeof(int))) { soap->errnum = soap_socket_errno(soap->master); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt unset IPV6_V6ONLY failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } #endif soap->errmode = 0; if (bind(soap->master, res.ai_addr, (int)res.ai_addrlen)) { soap->errnum = soap_socket_errno(soap->master); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not bind to host\n")); soap_closesock(soap); soap_set_receiver_error(soap, tcp_error(soap), "bind failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } #else soap->peerlen = sizeof(soap->peer); memset((void*)&soap->peer, 0, sizeof(soap->peer)); soap->peer.sin_family = AF_INET; soap->errmode = 2; if (host) { if (soap->fresolve(soap, host, &soap->peer.sin_addr)) { soap_set_receiver_error(soap, tcp_error(soap), "get host by name failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } } else soap->peer.sin_addr.s_addr = htonl(INADDR_ANY); soap->peer.sin_port = htons((short)port); soap->errmode = 0; if (bind(soap->master, (struct sockaddr*)&soap->peer, (int)soap->peerlen)) { soap->errnum = soap_socket_errno(soap->master); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not bind to host\n")); soap_closesock(soap); soap_set_receiver_error(soap, tcp_error(soap), "bind failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } #endif if (!(soap->omode & SOAP_IO_UDP) && listen(soap->master, backlog)) { soap->errnum = soap_socket_errno(soap->master); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not bind to host\n")); soap_closesock(soap); soap_set_receiver_error(soap, tcp_error(soap), "listen failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } return soap->master; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_poll(struct soap *soap) { #ifndef WITH_LEAN register int r; if (soap_valid_socket(soap->socket)) { r = tcp_select(soap, soap->socket, SOAP_TCP_SELECT_ALL, 0); if (r > 0 && (r & SOAP_TCP_SELECT_ERR)) r = -1; } else if (soap_valid_socket(soap->master)) r = tcp_select(soap, soap->master, SOAP_TCP_SELECT_SND, 0); else return SOAP_OK; /* OK when no socket! */ if (r > 0) { #ifdef WITH_OPENSSL if (soap->imode & SOAP_ENC_SSL) { if (soap_valid_socket(soap->socket) && (r & SOAP_TCP_SELECT_SND) && (!(r & SOAP_TCP_SELECT_RCV) || SSL_peek(soap->ssl, soap->tmpbuf, 1) > 0)) return SOAP_OK; } else #endif if (soap_valid_socket(soap->socket) && (r & SOAP_TCP_SELECT_SND) && (!(r & SOAP_TCP_SELECT_RCV) || recv(soap->socket, soap->tmpbuf, 1, MSG_PEEK) > 0)) return SOAP_OK; } else if (r < 0) { if ((soap_valid_socket(soap->master) || soap_valid_socket(soap->socket)) && soap_socket_errno(soap->master) != SOAP_EINTR) { soap_set_receiver_error(soap, tcp_error(soap), "select failed in soap_poll()", SOAP_TCP_ERROR); return soap->error = SOAP_TCP_ERROR; } } DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Polling: other end down on socket=%d select=%d\n", soap->socket, r)); return SOAP_EOF; #else return SOAP_OK; #endif } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 SOAP_FMAC1 SOAP_SOCKET SOAP_FMAC2 soap_accept(struct soap *soap) { int n = (int)sizeof(soap->peer); register int err; #ifndef WITH_LEAN #ifndef WIN32 int len = SOAP_BUFLEN; #else int len = SOAP_BUFLEN + 1; /* speeds up windows xfer */ #endif int set = 1; #endif soap->error = SOAP_OK; memset((void*)&soap->peer, 0, sizeof(soap->peer)); soap->socket = SOAP_INVALID_SOCKET; soap->errmode = 0; soap->keep_alive = 0; if (!soap_valid_socket(soap->master)) { soap->errnum = 0; soap_set_receiver_error(soap, tcp_error(soap), "no master socket in soap_accept()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) return soap->socket = soap->master; #endif for (;;) { if (soap->accept_timeout || soap->send_timeout || soap->recv_timeout) { for (;;) { register int r; r = tcp_select(soap, soap->master, SOAP_TCP_SELECT_ALL, soap->accept_timeout ? soap->accept_timeout : 60); if (r > 0) break; if (!r && soap->accept_timeout) { soap_set_receiver_error(soap, "Timeout", "accept failed in soap_accept()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } if (r < 0) { r = soap->errnum; if (r != SOAP_EINTR) { soap_closesock(soap); soap_set_sender_error(soap, tcp_error(soap), "accept failed in soap_accept()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } } } } if (soap->accept_timeout) SOAP_SOCKNONBLOCK(soap->master) else SOAP_SOCKBLOCK(soap->master) soap->socket = soap->faccept(soap, soap->master, (struct sockaddr*)&soap->peer, &n); soap->peerlen = (size_t)n; if (soap_valid_socket(soap->socket)) { #ifdef WITH_IPV6 unsigned int ip1, ip2, ip3, ip4; char port[16]; getnameinfo((struct sockaddr*)&soap->peer, n, soap->host, sizeof(soap->host), port, 16, NI_NUMERICHOST | NI_NUMERICSERV); sscanf(soap->host, "%u.%u.%u.%u", &ip1, &ip2, &ip3, &ip4); soap->ip = (unsigned long)ip1 << 24 | (unsigned long)ip2 << 16 | (unsigned long)ip3 << 8 | (unsigned long)ip4; soap->port = soap_strtol(port, NULL, 10); #else soap->ip = ntohl(soap->peer.sin_addr.s_addr); sprintf(soap->host, "%u.%u.%u.%u", (int)(soap->ip>>24)&0xFF, (int)(soap->ip>>16)&0xFF, (int)(soap->ip>>8)&0xFF, (int)soap->ip&0xFF); soap->port = (int)ntohs(soap->peer.sin_port); /* does not return port number on some systems */ #endif DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Accept socket %d at port %d from IP %s\n", soap->socket, soap->port, soap->host)); #ifndef WITH_LEAN if (soap->accept_flags == SO_LINGER) { struct linger linger; memset((void*)&linger, 0, sizeof(linger)); linger.l_onoff = 1; linger.l_linger = soap->linger_time; if (setsockopt(soap->socket, SOL_SOCKET, SO_LINGER, (char*)&linger, sizeof(struct linger))) { soap->errnum = soap_socket_errno(soap->socket); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_LINGER failed in soap_accept()", SOAP_TCP_ERROR); soap_closesock(soap); return SOAP_INVALID_SOCKET; } } else if (soap->accept_flags && setsockopt(soap->socket, SOL_SOCKET, soap->accept_flags, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(soap->socket); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt failed in soap_accept()", SOAP_TCP_ERROR); soap_closesock(soap); return SOAP_INVALID_SOCKET; } if (((soap->imode | soap->omode) & SOAP_IO_KEEPALIVE) && setsockopt(soap->socket, SOL_SOCKET, SO_KEEPALIVE, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(soap->socket); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_KEEPALIVE failed in soap_accept()", SOAP_TCP_ERROR); soap_closesock(soap); return SOAP_INVALID_SOCKET; } if (setsockopt(soap->socket, SOL_SOCKET, SO_SNDBUF, (char*)&len, sizeof(int))) { soap->errnum = soap_socket_errno(soap->socket); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_SNDBUF failed in soap_accept()", SOAP_TCP_ERROR); soap_closesock(soap); return SOAP_INVALID_SOCKET; } if (setsockopt(soap->socket, SOL_SOCKET, SO_RCVBUF, (char*)&len, sizeof(int))) { soap->errnum = soap_socket_errno(soap->socket); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_RCVBUF failed in soap_accept()", SOAP_TCP_ERROR); soap_closesock(soap); return SOAP_INVALID_SOCKET; } #ifdef TCP_NODELAY if (setsockopt(soap->socket, IPPROTO_TCP, TCP_NODELAY, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(soap->socket); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt TCP_NODELAY failed in soap_accept()", SOAP_TCP_ERROR); soap_closesock(soap); return SOAP_INVALID_SOCKET; } #endif #endif soap->keep_alive = (((soap->imode | soap->omode) & SOAP_IO_KEEPALIVE) != 0); if (soap->send_timeout || soap->recv_timeout) SOAP_SOCKNONBLOCK(soap->socket) else SOAP_SOCKBLOCK(soap->socket) return soap->socket; } err = soap_socket_errno(soap->socket); if (err != 0 && err != SOAP_EINTR && err != SOAP_EAGAIN && err != SOAP_EWOULDBLOCK) { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Accept failed from %s\n", soap->host)); soap->errnum = err; soap_set_receiver_error(soap, tcp_error(soap), "accept failed in soap_accept()", SOAP_TCP_ERROR); soap_closesock(soap); return SOAP_INVALID_SOCKET; } } } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_closesock(struct soap *soap) { register int status = soap->error; #ifndef WITH_LEANER if (status) /* close on error: attachment state is not to be trusted */ { soap->mime.first = NULL; soap->mime.last = NULL; soap->dime.first = NULL; soap->dime.last = NULL; } #endif if (soap->fdisconnect && (soap->error = soap->fdisconnect(soap))) return soap->error; if (status == SOAP_EOF || status == SOAP_TCP_ERROR || status == SOAP_SSL_ERROR || !soap->keep_alive) { if (soap->fclose && (soap->error = soap->fclose(soap))) return soap->error; soap->keep_alive = 0; } #ifdef WITH_ZLIB if (soap->zlib_state == SOAP_ZLIB_DEFLATE) deflateEnd(soap->d_stream); else if (soap->zlib_state == SOAP_ZLIB_INFLATE) inflateEnd(soap->d_stream); soap->zlib_state = SOAP_ZLIB_NONE; #endif return soap->error = status; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_force_closesock(struct soap *soap) { soap->keep_alive = 0; if (soap_valid_socket(soap->socket)) return soap_closesocket(soap->socket); return SOAP_OK; } #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_cleanup(struct soap *soap) { soap_done(soap); #ifdef WIN32 if (!tcp_done) return; tcp_done = 0; WSACleanup(); #endif } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_done(struct soap *soap) { #ifdef SOAP_DEBUG int i; #endif if (soap_check_state(soap)) return; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Done with context\n")); soap_free_temp(soap); while (soap->clist) { struct soap_clist *p = soap->clist->next; SOAP_FREE(soap, soap->clist); soap->clist = p; } if (soap->state == SOAP_INIT) soap->omode &= ~SOAP_IO_UDP; /* to force close the socket */ soap->keep_alive = 0; /* to force close the socket */ soap_closesock(soap); #ifdef WITH_COOKIES soap_free_cookies(soap); #endif while (soap->plugins) { register struct soap_plugin *p = soap->plugins->next; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Removing plugin '%s'\n", soap->plugins->id)); if (soap->plugins->fcopy || soap->state == SOAP_INIT) soap->plugins->fdelete(soap, soap->plugins); SOAP_FREE(soap, soap->plugins); soap->plugins = p; } soap->fplugin = fplugin; soap->fmalloc = NULL; #ifndef WITH_NOHTTP soap->fpost = http_post; soap->fget = http_get; soap->fput = http_405; soap->fdel = http_405; soap->fopt = http_200; soap->fhead = http_200; soap->fform = NULL; soap->fposthdr = http_post_header; soap->fresponse = http_response; soap->fparse = http_parse; soap->fparsehdr = http_parse_header; #endif soap->fheader = NULL; #ifndef WITH_NOIO #ifndef WITH_IPV6 soap->fresolve = tcp_gethost; #else soap->fresolve = NULL; #endif soap->faccept = tcp_accept; soap->fopen = tcp_connect; soap->fclose = tcp_disconnect; soap->fclosesocket = tcp_closesocket; soap->fshutdownsocket = tcp_shutdownsocket; soap->fsend = fsend; soap->frecv = frecv; soap->fpoll = soap_poll; #else soap->fopen = NULL; soap->fclose = NULL; soap->fpoll = NULL; #endif #ifndef WITH_LEANER soap->feltbegin = NULL; soap->feltendin = NULL; soap->feltbegout = NULL; soap->feltendout = NULL; soap->fprepareinitsend = NULL; soap->fprepareinitrecv = NULL; soap->fpreparesend = NULL; soap->fpreparerecv = NULL; soap->fpreparefinalsend = NULL; soap->fpreparefinalrecv = NULL; soap->ffiltersend = NULL; soap->ffilterrecv = NULL; #endif soap->fseterror = NULL; soap->fignore = NULL; soap->fserveloop = NULL; #ifdef WITH_OPENSSL if (soap->session) { SSL_SESSION_free(soap->session); soap->session = NULL; } #endif if (soap->state == SOAP_INIT) { if (soap_valid_socket(soap->master)) { soap->fclosesocket(soap, soap->master); soap->master = SOAP_INVALID_SOCKET; } } #ifdef WITH_OPENSSL if (soap->ssl) { SSL_free(soap->ssl); soap->ssl = NULL; } if (soap->state == SOAP_INIT) { if (soap->ctx) { SSL_CTX_free(soap->ctx); soap->ctx = NULL; } } ERR_remove_state(0); #endif #ifdef WITH_GNUTLS if (soap->state == SOAP_INIT) { if (soap->xcred) { gnutls_certificate_free_credentials(soap->xcred); soap->xcred = NULL; } if (soap->acred) { gnutls_anon_free_client_credentials(soap->acred); soap->acred = NULL; } if (soap->cache) { gnutls_priority_deinit(soap->cache); soap->cache = NULL; } if (soap->dh_params) { gnutls_dh_params_deinit(soap->dh_params); soap->dh_params = NULL; } if (soap->rsa_params) { gnutls_rsa_params_deinit(soap->rsa_params); soap->rsa_params = NULL; } } if (soap->session) { gnutls_deinit(soap->session); soap->session = NULL; } #endif #ifdef WITH_C_LOCALE # ifdef WIN32 _free_locale(soap->c_locale); # else freelocale(soap->c_locale); # endif #endif #ifdef WITH_ZLIB if (soap->d_stream) { SOAP_FREE(soap, (void*)soap->d_stream); soap->d_stream = NULL; } if (soap->z_buf) { SOAP_FREE(soap, (void*)soap->z_buf); soap->z_buf = NULL; } #endif #ifdef SOAP_DEBUG DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free logfiles\n")); for (i = 0; i < SOAP_MAXLOGS; i++) { if (soap->logfile[i]) { SOAP_FREE(soap, (void*)soap->logfile[i]); soap->logfile[i] = NULL; } soap_close_logfile(soap, i); } soap->state = SOAP_NONE; #endif #ifdef SOAP_MEM_DEBUG soap_free_mht(soap); #endif } #endif /******************************************************************************\ * * HTTP * \******************************************************************************/ /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 int http_parse(struct soap *soap) { char header[SOAP_HDRLEN], *s; unsigned short httpcmd = 0; int status = 0; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Waiting for HTTP request/response...\n")); *soap->endpoint = '\0'; soap->length = 0; #ifdef WITH_NTLM if (!soap->ntlm_challenge) #endif { soap->userid = NULL; soap->passwd = NULL; soap->authrealm = NULL; } #ifdef WITH_NTLM soap->ntlm_challenge = NULL; #endif soap->proxy_from = NULL; soap->http_content = NULL; soap->action = NULL; soap->status = 0; do { if (soap_getline(soap, soap->msgbuf, sizeof(soap->msgbuf))) { if (soap->error == SOAP_EOF) return SOAP_EOF; return soap->error = 414; } if ((s = strchr(soap->msgbuf, ' '))) { soap->status = (unsigned short)soap_strtoul(s, &s, 10); if (!soap_blank((soap_wchar)*s)) soap->status = 0; } else soap->status = 0; DBGLOG(TEST,SOAP_MESSAGE(fdebug, "HTTP status: %s\n", soap->msgbuf)); for (;;) { if (soap_getline(soap, header, SOAP_HDRLEN)) { if (soap->error == SOAP_EOF) { soap->error = SOAP_OK; DBGLOG(TEST,SOAP_MESSAGE(fdebug, "EOF in HTTP header, continue anyway\n")); break; } return soap->error; } if (!*header) break; DBGLOG(TEST,SOAP_MESSAGE(fdebug, "HTTP header: %s\n", header)); s = strchr(header, ':'); if (s) { char *t; *s = '\0'; do s++; while (*s && *s <= 32); if (*s == '"') s++; t = s + strlen(s) - 1; while (t > s && *t <= 32) t--; if (t >= s && *t == '"') t--; t[1] = '\0'; if ((soap->error = soap->fparsehdr(soap, header, s))) { if (soap->error < SOAP_STOP) return soap->error; status = soap->error; soap->error = SOAP_OK; } } } } while (soap->status == 100); DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Finished HTTP header parsing, status = %d\n", soap->status)); s = strstr(soap->msgbuf, "HTTP/"); if (s && s[7] != '1') { if (soap->keep_alive == 1) soap->keep_alive = 0; if (soap->status == 0 && (soap->omode & SOAP_IO) == SOAP_IO_CHUNK) /* soap->status == 0 for HTTP request */ { soap->imode |= SOAP_IO_CHUNK; soap->omode = (soap->omode & ~SOAP_IO) | SOAP_IO_STORE; } } if (soap->keep_alive < 0) soap->keep_alive = 1; DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Keep alive connection = %d\n", soap->keep_alive)); if (soap->status == 0) { size_t l = 0; if (s) { if (!strncmp(soap->msgbuf, "POST ", l = 5)) httpcmd = 1; else if (!strncmp(soap->msgbuf, "PUT ", l = 4)) httpcmd = 2; else if (!strncmp(soap->msgbuf, "GET ", l = 4)) httpcmd = 3; else if (!strncmp(soap->msgbuf, "DELETE ", l = 7)) httpcmd = 4; else if (!strncmp(soap->msgbuf, "OPTIONS ", l = 8)) httpcmd = 5; else if (!strncmp(soap->msgbuf, "HEAD ", l = 5)) httpcmd = 6; } if (s && httpcmd) { size_t m = strlen(soap->endpoint); size_t n = m + (s - soap->msgbuf) - l - 1; if (m > n) m = n; if (n >= sizeof(soap->endpoint)) n = sizeof(soap->endpoint) - 1; strncpy(soap->path, soap->msgbuf + l, n - m); soap->path[n - m] = '\0'; if (*soap->path && *soap->path != '/') *soap->endpoint = '\0'; strcat(soap->endpoint, soap->path); DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Target endpoint='%s'\n", soap->endpoint)); if (httpcmd > 1) { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "HTTP %s handler\n", soap->msgbuf)); switch (httpcmd) { case 2: soap->error = soap->fput(soap); break; case 3: soap->error = soap->fget(soap); break; case 4: soap->error = soap->fdel(soap); break; case 5: soap->error = soap->fopt(soap); break; case 6: soap->error = soap->fhead(soap); break; default: soap->error = 405; break; } DBGLOG(TEST,SOAP_MESSAGE(fdebug, "HTTP handler return = %d\n", soap->error)); if (soap->error == SOAP_OK) soap->error = SOAP_STOP; /* prevents further processing */ return soap->error; } if (status) return soap->error = status; } else if (status) return soap->error = status; else if (s) return soap->error = 405; } /* Status OK (HTTP 200) */ if (soap->status == 0 || soap->status == 200) return SOAP_OK; /* Status 201 (Created), 202 (Accepted), ... and HTTP 400 and 500 errors may not have a body. When content length, content type, or chunking is used assume there is a message to parse, either XML or HTTP. */ if (soap->length > 0 || (soap->http_content && (!soap->keep_alive || soap->recv_timeout)) || (soap->imode & SOAP_IO) == SOAP_IO_CHUNK) { if ((soap->status > 200 && soap->status <= 299) || soap->status == 400 || soap->status == 500) return SOAP_OK; /* force close afterwards in soap_closesock() */ soap->keep_alive = 0; #ifndef WITH_LEAN /* read HTTP body for error details */ s = soap_get_http_body(soap); if (s) return soap_set_receiver_error(soap, soap->msgbuf, s, soap->status); #endif } DBGLOG(TEST,SOAP_MESSAGE(fdebug, "HTTP error %d\n", soap->status)); return soap_set_receiver_error(soap, "HTTP Error", soap->msgbuf, soap->status); } #endif #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 static int http_parse_header(struct soap *soap, const char *key, const char *val) { if (!soap_tag_cmp(key, "Host")) { #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) if (soap->imode & SOAP_ENC_SSL) strcpy(soap->endpoint, "https://"); else #endif strcpy(soap->endpoint, "http://"); strncat(soap->endpoint, val, sizeof(soap->endpoint) - 8); soap->endpoint[sizeof(soap->endpoint) - 1] = '\0'; } #ifndef WITH_LEANER else if (!soap_tag_cmp(key, "Content-Type")) { const char *action; soap->http_content = soap_strdup(soap, val); if (soap_get_header_attribute(soap, val, "application/dime")) soap->imode |= SOAP_ENC_DIME; else if (soap_get_header_attribute(soap, val, "multipart/related") || soap_get_header_attribute(soap, val, "multipart/form-data")) { soap->mime.boundary = soap_strdup(soap, soap_get_header_attribute(soap, val, "boundary")); soap->mime.start = soap_strdup(soap, soap_get_header_attribute(soap, val, "start")); soap->imode |= SOAP_ENC_MIME; } action = soap_get_header_attribute(soap, val, "action"); if (action) { if (*action == '"') { soap->action = soap_strdup(soap, action + 1); soap->action[strlen(soap->action) - 1] = '\0'; } else soap->action = soap_strdup(soap, action); } } #endif else if (!soap_tag_cmp(key, "Content-Length")) { soap->length = soap_strtoul(val, NULL, 10); } else if (!soap_tag_cmp(key, "Content-Encoding")) { if (!soap_tag_cmp(val, "deflate")) #ifdef WITH_ZLIB soap->zlib_in = SOAP_ZLIB_DEFLATE; #else return SOAP_ZLIB_ERROR; #endif else if (!soap_tag_cmp(val, "gzip")) #ifdef WITH_GZIP soap->zlib_in = SOAP_ZLIB_GZIP; #else return SOAP_ZLIB_ERROR; #endif } #ifdef WITH_ZLIB else if (!soap_tag_cmp(key, "Accept-Encoding")) { #ifdef WITH_GZIP if (strchr(val, '*') || soap_get_header_attribute(soap, val, "gzip")) soap->zlib_out = SOAP_ZLIB_GZIP; else #endif if (strchr(val, '*') || soap_get_header_attribute(soap, val, "deflate")) soap->zlib_out = SOAP_ZLIB_DEFLATE; else soap->zlib_out = SOAP_ZLIB_NONE; } #endif else if (!soap_tag_cmp(key, "Transfer-Encoding")) { soap->imode &= ~SOAP_IO; if (!soap_tag_cmp(val, "chunked")) soap->imode |= SOAP_IO_CHUNK; } else if (!soap_tag_cmp(key, "Connection")) { if (!soap_tag_cmp(val, "keep-alive")) soap->keep_alive = -soap->keep_alive; else if (!soap_tag_cmp(val, "close")) soap->keep_alive = 0; } #ifndef WITH_LEAN else if (!soap_tag_cmp(key, "Authorization")) { if (!soap_tag_cmp(val, "Basic *")) { int n; char *s; soap_base642s(soap, val + 6, soap->tmpbuf, sizeof(soap->tmpbuf) - 1, &n); soap->tmpbuf[n] = '\0'; if ((s = strchr(soap->tmpbuf, ':'))) { *s = '\0'; soap->userid = soap_strdup(soap, soap->tmpbuf); soap->passwd = soap_strdup(soap, s + 1); } } } else if (!soap_tag_cmp(key, "WWW-Authenticate") || !soap_tag_cmp(key, "Proxy-Authenticate")) { #ifdef WITH_NTLM if (!soap_tag_cmp(val, "NTLM*")) soap->ntlm_challenge = soap_strdup(soap, val + 4); else #endif soap->authrealm = soap_strdup(soap, soap_get_header_attribute(soap, val + 6, "realm")); } else if (!soap_tag_cmp(key, "Expect")) { if (!soap_tag_cmp(val, "100-continue")) { if ((soap->error = soap->fposthdr(soap, "HTTP/1.1 100 Continue", NULL)) || (soap->error = soap->fposthdr(soap, NULL, NULL))) return soap->error; } } #endif else if (!soap_tag_cmp(key, "SOAPAction")) { if (*val == '"') { soap->action = soap_strdup(soap, val + 1); soap->action[strlen(soap->action) - 1] = '\0'; } else soap->action = soap_strdup(soap, val); } else if (!soap_tag_cmp(key, "Location")) { strncpy(soap->endpoint, val, sizeof(soap->endpoint)); soap->endpoint[sizeof(soap->endpoint) - 1] = '\0'; } else if (!soap_tag_cmp(key, "X-Forwarded-For")) { soap->proxy_from = soap_strdup(soap, val); } #ifdef WITH_COOKIES else if (!soap_tag_cmp(key, "Cookie") || !soap_tag_cmp(key, "Cookie2") || !soap_tag_cmp(key, "Set-Cookie") || !soap_tag_cmp(key, "Set-Cookie2")) { soap_getcookies(soap, val); } #endif return SOAP_OK; } #endif #endif /******************************************************************************/ #if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) #ifndef PALM_1 SOAP_FMAC1 const char* SOAP_FMAC2 soap_get_header_attribute(struct soap *soap, const char *line, const char *key) { register const char *s = line; if (s) { while (*s) { register short flag; s = soap_decode_key(soap->tmpbuf, sizeof(soap->tmpbuf), s); flag = soap_tag_cmp(soap->tmpbuf, key); s = soap_decode_val(soap->tmpbuf, sizeof(soap->tmpbuf), s); if (!flag) return soap->tmpbuf; } } return NULL; } #endif #endif /******************************************************************************/ #if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) #ifndef PALM_1 SOAP_FMAC1 const char* SOAP_FMAC2 soap_decode_key(char *buf, size_t len, const char *val) { return soap_decode(buf, len, val, "=,;"); } #endif #endif /******************************************************************************/ #if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) #ifndef PALM_1 SOAP_FMAC1 const char* SOAP_FMAC2 soap_decode_val(char *buf, size_t len, const char *val) { if (*val != '=') { *buf = '\0'; return val; } return soap_decode(buf, len, val + 1, ",;"); } #endif #endif /******************************************************************************/ #if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) #ifndef PALM_1 static const char* soap_decode(char *buf, size_t len, const char *val, const char *sep) { const char *s; char *t = buf; for (s = val; *s; s++) if (*s != ' ' && *s != '\t' && !strchr(sep, *s)) break; if (*s == '"') { s++; while (*s && *s != '"' && --len) *t++ = *s++; } else { while (*s && !soap_blank((soap_wchar)*s) && !strchr(sep, *s) && --len) { if (*s == '%') { *t++ = ((s[1] >= 'A' ? (s[1] & 0x7) + 9 : s[1] - '0') << 4) + (s[2] >= 'A' ? (s[2] & 0x7) + 9 : s[2] - '0'); s += 3; } else *t++ = *s++; } } *t = '\0'; while (*s && !strchr(sep, *s)) s++; return s; } #endif #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 static const char* http_error(struct soap *soap, int status) { register const char *msg = SOAP_STR_EOS; (void)soap; #ifndef WITH_LEAN msg = soap_code_str(h_http_error_codes, status); if (!msg) msg = SOAP_STR_EOS; #endif return msg; } #endif #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 static int http_get(struct soap *soap) { (void)soap; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "HTTP GET request\n")); return SOAP_GET_METHOD; } #endif #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 static int http_405(struct soap *soap) { return 405; (void)soap; } #endif #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 static int http_200(struct soap *soap) { return soap_send_empty_response(soap, 200); } #endif #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 static int http_post(struct soap *soap, const char *endpoint, const char *host, int port, const char *path, const char *action, size_t count) { register const char *s; register int err; switch (soap->status) { case SOAP_GET: s = "GET"; break; case SOAP_PUT: s = "PUT"; break; case SOAP_DEL: s = "DELETE"; break; case SOAP_CONNECT: s = "CONNECT"; break; default: s = "POST"; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "HTTP %s to %s\n", s, endpoint ? endpoint : "(null)")); #ifdef PALM if (!endpoint || (soap_tag_cmp(endpoint, "http:*") && soap_tag_cmp(endpoint, "https:*") && strncmp(endpoint, "httpg:", 6)) && strncmp(endpoint, "_beam:", 6) && strncmp(endpoint, "_local:", 7) && strncmp(endpoint, "_btobex:", 8)) #else if (!endpoint || (soap_tag_cmp(endpoint, "http:*") && soap_tag_cmp(endpoint, "https:*") && strncmp(endpoint, "httpg:", 6))) #endif return SOAP_OK; if (strlen(endpoint) + strlen(soap->http_version) > sizeof(soap->tmpbuf) - 80) return soap->error = SOAP_EOM; if (soap->status == SOAP_CONNECT) sprintf(soap->tmpbuf, "%s %s:%d HTTP/%s", s, soap->host, soap->port, soap->http_version); else if (soap->proxy_host && endpoint) sprintf(soap->tmpbuf, "%s %s HTTP/%s", s, endpoint, soap->http_version); else sprintf(soap->tmpbuf, "%s /%s HTTP/%s", s, (*path == '/' ? path + 1 : path), soap->http_version); if ((err = soap->fposthdr(soap, soap->tmpbuf, NULL))) return err; #ifdef WITH_OPENSSL if ((soap->ssl && port != 443) || (!soap->ssl && port != 80)) #else if (port != 80) #endif { #ifdef WITH_IPV6 if (*host != '[' && strchr(host, ':')) sprintf(soap->tmpbuf, "[%s]:%d", host, port); /* RFC 2732 */ else #endif sprintf(soap->tmpbuf, "%s:%d", host, port); } else strcpy(soap->tmpbuf, host); if ((err = soap->fposthdr(soap, "Host", soap->tmpbuf))) return err; if ((err = soap->fposthdr(soap, "User-Agent", "gSOAP/2.8"))) return err; if ((err = soap_puthttphdr(soap, SOAP_OK, count))) return err; #ifdef WITH_ZLIB #ifdef WITH_GZIP if ((err = soap->fposthdr(soap, "Accept-Encoding", "gzip, deflate"))) #else if ((err = soap->fposthdr(soap, "Accept-Encoding", "deflate"))) #endif return err; #endif #ifndef WITH_LEAN if (soap->userid && soap->passwd && strlen(soap->userid) + strlen(soap->passwd) < 761) { #ifdef WITH_NTLM if (soap->ntlm_challenge && strlen(soap->ntlm_challenge) + 6 < sizeof(soap->tmpbuf)) sprintf(soap->tmpbuf, "NTLM %s", soap->ntlm_challenge); else #endif { strcpy(soap->tmpbuf, "Basic "); sprintf(soap->tmpbuf + 262, "%s:%s", soap->userid, soap->passwd); soap_s2base64(soap, (const unsigned char*)(soap->tmpbuf + 262), soap->tmpbuf + 6, (int)strlen(soap->tmpbuf + 262)); } if ((err = soap->fposthdr(soap, "Authorization", soap->tmpbuf))) return err; } if (soap->proxy_userid && soap->proxy_passwd && strlen(soap->proxy_userid) + strlen(soap->proxy_passwd) < 761) { #ifdef WITH_NTLM if (soap->ntlm_challenge && strlen(soap->ntlm_challenge) + 6 < sizeof(soap->tmpbuf)) sprintf(soap->tmpbuf, "NTLM %s", soap->ntlm_challenge); else #endif { strcpy(soap->tmpbuf, "Basic "); sprintf(soap->tmpbuf + 262, "%s:%s", soap->proxy_userid, soap->proxy_passwd); soap_s2base64(soap, (const unsigned char*)(soap->tmpbuf + 262), soap->tmpbuf + 6, (int)strlen(soap->tmpbuf + 262)); } if ((err = soap->fposthdr(soap, "Proxy-Authorization", soap->tmpbuf))) return err; } #endif #ifdef WITH_COOKIES #ifdef WITH_OPENSSL if (soap_putcookies(soap, host, path, soap->ssl != NULL)) return soap->error; #else if (soap_putcookies(soap, host, path, 0)) return soap->error; #endif #endif if (action && soap->status != SOAP_GET && soap->status != SOAP_DEL) { sprintf(soap->tmpbuf, "\"%s\"", action && strlen(action) < sizeof(soap->tmpbuf) - 3 ? action : SOAP_STR_EOS); if ((err = soap->fposthdr(soap, "SOAPAction", soap->tmpbuf))) return err; } return soap->fposthdr(soap, NULL, NULL); } #endif #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 static int http_send_header(struct soap *soap, const char *s) { register const char *t; do { t = strchr(s, '\n'); /* disallow \n in HTTP headers */ if (!t) t = s + strlen(s); if (soap_send_raw(soap, s, t - s)) return soap->error; s = t + 1; } while (*t); return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 static int http_post_header(struct soap *soap, const char *key, const char *val) { if (key) { if (http_send_header(soap, key)) return soap->error; if (val && (soap_send_raw(soap, ": ", 2) || http_send_header(soap, val))) return soap->error; } return soap_send_raw(soap, "\r\n", 2); } #endif #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 static int http_response(struct soap *soap, int status, size_t count) { register int err; #ifdef WMW_RPM_IO if (soap->rpmreqid) httpOutputEnable(soap->rpmreqid); #endif if (strlen(soap->http_version) > 4) return soap->error = SOAP_EOM; if (!status || status == SOAP_HTML || status == SOAP_FILE) { const char *s; if (count || ((soap->omode & SOAP_IO) == SOAP_IO_CHUNK)) s = "200 OK"; else s = "202 Accepted"; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Status = %s\n", s)); #ifdef WMW_RPM_IO if (soap->rpmreqid || soap_valid_socket(soap->master) || soap_valid_socket(soap->socket)) /* RPM behaves as if standalone */ #else if (soap_valid_socket(soap->master) || soap_valid_socket(soap->socket)) /* standalone application (socket) or CGI (stdin/out)? */ #endif { sprintf(soap->tmpbuf, "HTTP/%s %s", soap->http_version, s); if ((err = soap->fposthdr(soap, soap->tmpbuf, NULL))) return err; } else if ((err = soap->fposthdr(soap, "Status", s))) /* CGI header */ return err; } else if (status >= 200 && status < 600) { sprintf(soap->tmpbuf, "HTTP/%s %d %s", soap->http_version, status, http_error(soap, status)); if ((err = soap->fposthdr(soap, soap->tmpbuf, NULL))) return err; #ifndef WITH_LEAN if (status == 401) { sprintf(soap->tmpbuf, "Basic realm=\"%s\"", (soap->authrealm && strlen(soap->authrealm) < sizeof(soap->tmpbuf) - 14) ? soap->authrealm : "gSOAP Web Service"); if ((err = soap->fposthdr(soap, "WWW-Authenticate", soap->tmpbuf))) return err; } else if ((status >= 301 && status <= 303) || status == 307) { if ((err = soap->fposthdr(soap, "Location", soap->endpoint))) return err; } #endif } else { const char *s = *soap_faultcode(soap); if (status >= SOAP_GET_METHOD && status <= SOAP_HTTP_METHOD) s = "405 Method Not Allowed"; else if (soap->version == 2 && (!s || !strcmp(s, "SOAP-ENV:Sender"))) s = "400 Bad Request"; else s = "500 Internal Server Error"; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Error %s (status=%d)\n", s, status)); #ifdef WMW_RPM_IO if (soap->rpmreqid || soap_valid_socket(soap->master) || soap_valid_socket(soap->socket)) /* RPM behaves as if standalone */ #else if (soap_valid_socket(soap->master) || soap_valid_socket(soap->socket)) /* standalone application */ #endif { sprintf(soap->tmpbuf, "HTTP/%s %s", soap->http_version, s); if ((err = soap->fposthdr(soap, soap->tmpbuf, NULL))) return err; } else if ((err = soap->fposthdr(soap, "Status", s))) /* CGI */ return err; } if ((err = soap->fposthdr(soap, "Server", "gSOAP/2.8")) || (err = soap_puthttphdr(soap, status, count))) return err; #ifdef WITH_COOKIES if (soap_putsetcookies(soap)) return soap->error; #endif return soap->fposthdr(soap, NULL, NULL); } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_response(struct soap *soap, int status) { register size_t count; if (!(soap->omode & (SOAP_ENC_XML | SOAP_IO_STORE /* this tests for chunking too */)) && (status == SOAP_HTML || status == SOAP_FILE)) soap->omode = (soap->omode & ~SOAP_IO) | SOAP_IO_STORE; soap->status = status; count = soap_count_attachments(soap); if (soap_begin_send(soap)) return soap->error; #ifndef WITH_NOHTTP if ((soap->mode & SOAP_IO) != SOAP_IO_STORE && !(soap->mode & SOAP_ENC_XML)) { register int n = soap->mode; soap->mode &= ~(SOAP_IO | SOAP_ENC_ZLIB); if ((n & SOAP_IO) != SOAP_IO_FLUSH) soap->mode |= SOAP_IO_BUFFER; if ((soap->error = soap->fresponse(soap, status, count))) return soap->error; #ifndef WITH_LEANER if ((n & SOAP_IO) == SOAP_IO_CHUNK) { if (soap_flush(soap)) return soap->error; } #endif soap->mode = n; } #endif return SOAP_OK; } #endif /******************************************************************************\ * * HTTP Cookies * \******************************************************************************/ #ifdef WITH_COOKIES /******************************************************************************/ SOAP_FMAC1 size_t SOAP_FMAC2 soap_encode_cookie(const char *s, char *t, size_t len) { register int c; register size_t n = len; while ((c = *s++) && --n > 0) { if (c > ' ' && c < 128 && !strchr("()<>@,;:\\\"/[]?={}#!$&'*+", c)) *t++ = c; else if (n > 2) { *t++ = '%'; *t++ = (c >> 4) + (c > 159 ? '7' : '0'); c &= 0xF; *t++ = c + (c > 9 ? '7' : '0'); n -= 2; } else break; } *t = '\0'; return len - n; } /******************************************************************************/ SOAP_FMAC1 struct soap_cookie* SOAP_FMAC2 soap_cookie(struct soap *soap, const char *name, const char *domain, const char *path) { struct soap_cookie *p; if (!domain) domain = soap->cookie_domain; if (!path) path = soap->cookie_path; if (!path) path = SOAP_STR_EOS; else if (*path == '/') path++; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Search cookie %s domain=%s path=%s\n", name, domain ? domain : "(null)", path ? path : "(null)")); for (p = soap->cookies; p; p = p->next) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Cookie in database: %s=%s domain=%s path=%s env=%hd\n", p->name, p->value ? p->value : "(null)", p->domain ? p->domain : "(null)", p->path ? p->path : "(null)", p->env)); if (!strcmp(p->name, name) && p->domain && p->path && !strcmp(p->domain, domain) && (!*p->path || !strncmp(p->path, path, strlen(p->path)))) break; } return p; } /******************************************************************************/ SOAP_FMAC1 struct soap_cookie* SOAP_FMAC2 soap_set_cookie(struct soap *soap, const char *name, const char *value, const char *domain, const char *path) { struct soap_cookie **p, *q; int n; if (!domain) domain = soap->cookie_domain; if (!path) path = soap->cookie_path; if (!path) path = SOAP_STR_EOS; else if (*path == '/') path++; q = soap_cookie(soap, name, domain, path); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Set %scookie: %s=%s domain=%s path=%s\n", q ? SOAP_STR_EOS : "new ", name, value ? value : "(null)", domain ? domain : "(null)", path ? path : "(null)")); if (!q) { if ((q = (struct soap_cookie*)SOAP_MALLOC(soap, sizeof(struct soap_cookie)))) { if ((q->name = (char*)SOAP_MALLOC(soap, strlen(name)+1))) strcpy(q->name, name); q->value = NULL; q->domain = NULL; q->path = NULL; q->expire = 0; q->maxage = -1; q->version = 1; q->secure = 0; q->modified = 0; for (p = &soap->cookies, n = soap->cookie_max; *p && n; p = &(*p)->next, n--) if (!strcmp((*p)->name, name) && (*p)->path && path && strcmp((*p)->path, path) < 0) break; if (n) { q->next = *p; *p = q; } else { SOAP_FREE(soap, q->name); SOAP_FREE(soap, q); q = NULL; } } } else q->modified = 1; if (q) { if (q->value) { if (!value || strcmp(value, q->value)) { SOAP_FREE(soap, q->value); q->value = NULL; } } if (value && *value && !q->value && (q->value = (char*)SOAP_MALLOC(soap, strlen(value)+1))) strcpy(q->value, value); if (q->domain) { if (!domain || strcmp(domain, q->domain)) { SOAP_FREE(soap, q->domain); q->domain = NULL; } } if (domain && !q->domain && (q->domain = (char*)SOAP_MALLOC(soap, strlen(domain)+1))) strcpy(q->domain, domain); if (q->path) { if (!path || strncmp(path, q->path, strlen(q->path))) { SOAP_FREE(soap, q->path); q->path = NULL; } } if (path && !q->path && (q->path = (char*)SOAP_MALLOC(soap, strlen(path)+1))) strcpy(q->path, path); q->session = 1; q->env = 0; } return q; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_clr_cookie(struct soap *soap, const char *name, const char *domain, const char *path) { struct soap_cookie **p, *q; if (!domain) domain = soap->cookie_domain; if (!domain) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Error in clear cookie %s: cookie domain not set\n", name ? name : "(null)")); return; } if (!path) path = soap->cookie_path; if (!path) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Error in clear cookie %s: cookie path not set\n", name ? name : "(null)")); return; } if (*path == '/') path++; for (p = &soap->cookies, q = *p; q; q = *p) { if (!strcmp(q->name, name) && !strcmp(q->domain, domain) && !strncmp(q->path, path, strlen(q->path))) { if (q->value) SOAP_FREE(soap, q->value); if (q->domain) SOAP_FREE(soap, q->domain); if (q->path) SOAP_FREE(soap, q->path); *p = q->next; SOAP_FREE(soap, q); } else p = &q->next; } } /******************************************************************************/ SOAP_FMAC1 char * SOAP_FMAC2 soap_cookie_value(struct soap *soap, const char *name, const char *domain, const char *path) { struct soap_cookie *p; if ((p = soap_cookie(soap, name, domain, path))) return p->value; return NULL; } /******************************************************************************/ SOAP_FMAC1 char * SOAP_FMAC2 soap_env_cookie_value(struct soap *soap, const char *name, const char *domain, const char *path) { struct soap_cookie *p; if ((p = soap_cookie(soap, name, domain, path)) && p->env) return p->value; return NULL; } /******************************************************************************/ SOAP_FMAC1 time_t SOAP_FMAC2 soap_cookie_expire(struct soap *soap, const char *name, const char *domain, const char *path) { struct soap_cookie *p; if ((p = soap_cookie(soap, name, domain, path))) return p->expire; return -1; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_set_cookie_expire(struct soap *soap, const char *name, long expire, const char *domain, const char *path) { struct soap_cookie *p; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Set cookie expiration max-age %ld: %s domain=%s path=%s\n", expire, name, domain ? domain : "(null)", path ? path : "(null)")); if ((p = soap_cookie(soap, name, domain, path))) { p->maxage = expire; p->modified = 1; return SOAP_OK; } return SOAP_ERR; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_set_cookie_session(struct soap *soap, const char *name, const char *domain, const char *path) { struct soap_cookie *p; if ((p = soap_cookie(soap, name, domain, path))) { p->session = 1; p->modified = 1; return SOAP_OK; } return SOAP_ERR; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_clr_cookie_session(struct soap *soap, const char *name, const char *domain, const char *path) { struct soap_cookie *p; if ((p = soap_cookie(soap, name, domain, path))) { p->session = 0; p->modified = 1; return SOAP_OK; } return SOAP_ERR; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_putsetcookies(struct soap *soap) { struct soap_cookie *p; char *s, tmp[4096]; const char *t; for (p = soap->cookies; p; p = p->next) { if (p->modified #ifdef WITH_OPENSSL || (!p->env && !soap->ssl == !p->secure) #endif ) { s = tmp; if (p->name) s += soap_encode_cookie(p->name, s, tmp-s+4064); if (p->value && *p->value) { *s++ = '='; s += soap_encode_cookie(p->value, s, tmp-s+4064); } if (p->domain && (int)strlen(p->domain) < tmp-s+4064) { strcpy(s, ";Domain="); strcat(s, p->domain); } else if (soap->cookie_domain && (int)strlen(soap->cookie_domain) < tmp-s+4064) { strcpy(s, ";Domain="); strcat(s, soap->cookie_domain); } strcat(s, ";Path=/"); s += strlen(s); if (p->path) t = p->path; else t = soap->cookie_path; if (t) { if (*t == '/') t++; if ((int)strlen(t) < tmp-s+4064) { if (strchr(t, '%')) /* already URL encoded? */ { strcpy(s, t); s += strlen(s); } else s += soap_encode_cookie(t, s, tmp-s+4064); } } if (p->version > 0 && s-tmp < 4060) { sprintf(s, ";Version=%u", p->version); s += strlen(s); } if (p->maxage >= 0 && s-tmp < 4060) { sprintf(s, ";Max-Age=%ld", p->maxage); s += strlen(s); } if (s-tmp < 4073 && (p->secure #ifdef WITH_OPENSSL || soap->ssl #endif )) strcpy(s, ";Secure"); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Set-Cookie: %s\n", tmp)); if ((soap->error = soap->fposthdr(soap, "Set-Cookie", tmp))) return soap->error; } } return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_putcookies(struct soap *soap, const char *domain, const char *path, int secure) { struct soap_cookie **p, *q; unsigned int version = 0; time_t now = time(NULL); char *s, tmp[4096]; if (!domain || !path) return SOAP_OK; s = tmp; p = &soap->cookies; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Sending cookies for domain=%s path=%s\n", domain, path)); if (*path == '/') path++; while ((q = *p)) { if (q->expire && now > q->expire) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Cookie %s expired\n", q->name)); SOAP_FREE(soap, q->name); if (q->value) SOAP_FREE(soap, q->value); if (q->domain) SOAP_FREE(soap, q->domain); if (q->path) SOAP_FREE(soap, q->path); *p = q->next; SOAP_FREE(soap, q); } else { int flag; char *t = q->domain; size_t n = 0; if (!t) flag = 1; else { const char *r = strchr(t, ':'); if (r) n = r - t; else n = strlen(t); flag = !strncmp(t, domain, n); } /* domain-level cookies, cannot compile when WITH_NOIO set */ #ifndef WITH_NOIO if (!flag) { struct hostent *hostent = gethostbyname((char*)domain); if (hostent) { const char *r = strchr(hostent->h_name, '.'); if (!r) r = hostent->h_name; flag = !strncmp(t, r, n); } } #endif if (flag && (!q->path || !strncmp(q->path, path, strlen(q->path))) && (!q->secure || secure)) { size_t n = 12; if (q->name) n += 3*strlen(q->name); if (q->value && *q->value) n += 3*strlen(q->value) + 1; if (q->path && *q->path) n += strlen(q->path) + 9; if (q->domain) n += strlen(q->domain) + 11; if (tmp - s + n > sizeof(tmp)) { if (s == tmp) return SOAP_OK; /* HTTP header size overflow */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Cookie: %s\n", tmp)); if ((soap->error = soap->fposthdr(soap, "Cookie", tmp))) return soap->error; s = tmp; } else if (s != tmp) { strcat(s, " "); s++; } if (q->version != version) { sprintf(s, "$Version=%u;", q->version); version = q->version; s += strlen(s); } if (q->name) s += soap_encode_cookie(q->name, s, tmp+sizeof(tmp)-s-16); if (q->value && *q->value) { *s++ = '='; s += soap_encode_cookie(q->value, s, tmp+sizeof(tmp)-s-16); } if (q->path) { sprintf(s, ";$Path=\"/%s\"", (*q->path == '/' ? q->path + 1 : q->path)); s += strlen(s); } if (q->domain) { sprintf(s, ";$Domain=\"%s\"", q->domain); s += strlen(s); } } p = &q->next; } } if (s != tmp) if ((soap->error = soap->fposthdr(soap, "Cookie", tmp))) return soap->error; return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_getcookies(struct soap *soap, const char *val) { struct soap_cookie *p = NULL, *q; const char *s; char *t, tmp[4096]; /* cookie size is up to 4096 bytes [RFC2109] */ char *domain = NULL; char *path = NULL; unsigned int version = 0; time_t now = time(NULL); if (!val) return; s = val; while (*s) { s = soap_decode_key(tmp, sizeof(tmp), s); if (!soap_tag_cmp(tmp, "$Version")) { if ((s = soap_decode_val(tmp, sizeof(tmp), s))) { if (p) p->version = (int)soap_strtol(tmp, NULL, 10); else version = (int)soap_strtol(tmp, NULL, 10); } } else if (!soap_tag_cmp(tmp, "$Path")) { s = soap_decode_val(tmp, sizeof(tmp), s); if (*tmp) { if ((t = (char*)SOAP_MALLOC(soap, strlen(tmp)+1))) strcpy(t, tmp); } else t = NULL; if (p) { if (p->path) SOAP_FREE(soap, p->path); p->path = t; } else { if (path) SOAP_FREE(soap, path); path = t; } } else if (!soap_tag_cmp(tmp, "$Domain")) { s = soap_decode_val(tmp, sizeof(tmp), s); if (*tmp) { if ((t = (char*)SOAP_MALLOC(soap, strlen(tmp)+1))) strcpy(t, tmp); } else t = NULL; if (p) { if (p->domain) SOAP_FREE(soap, p->domain); p->domain = t; } else { if (domain) SOAP_FREE(soap, domain); domain = t; } } else if (p && !soap_tag_cmp(tmp, "Path")) { if (p->path) SOAP_FREE(soap, p->path); s = soap_decode_val(tmp, sizeof(tmp), s); if (*tmp) { if ((p->path = (char*)SOAP_MALLOC(soap, strlen(tmp)+1))) strcpy(p->path, tmp); } else p->path = NULL; } else if (p && !soap_tag_cmp(tmp, "Domain")) { if (p->domain) SOAP_FREE(soap, p->domain); s = soap_decode_val(tmp, sizeof(tmp), s); if (*tmp) { if ((p->domain = (char*)SOAP_MALLOC(soap, strlen(tmp)+1))) strcpy(p->domain, tmp); } else p->domain = NULL; } else if (p && !soap_tag_cmp(tmp, "Version")) { s = soap_decode_val(tmp, sizeof(tmp), s); p->version = (unsigned int)soap_strtoul(tmp, NULL, 10); } else if (p && !soap_tag_cmp(tmp, "Max-Age")) { s = soap_decode_val(tmp, sizeof(tmp), s); p->expire = now + soap_strtol(tmp, NULL, 10); } else if (p && !soap_tag_cmp(tmp, "Expires")) { struct tm T; char a[3]; static const char mns[] = "anebarprayunulugepctovec"; s = soap_decode_val(tmp, sizeof(tmp), s); if (strlen(tmp) > 20) { memset((void*)&T, 0, sizeof(T)); a[0] = tmp[4]; a[1] = tmp[5]; a[2] = '\0'; T.tm_mday = (int)soap_strtol(a, NULL, 10); a[0] = tmp[8]; a[1] = tmp[9]; T.tm_mon = (int)(strstr(mns, a) - mns) / 2; a[0] = tmp[11]; a[1] = tmp[12]; T.tm_year = 100 + (int)soap_strtol(a, NULL, 10); a[0] = tmp[13]; a[1] = tmp[14]; T.tm_hour = (int)soap_strtol(a, NULL, 10); a[0] = tmp[16]; a[1] = tmp[17]; T.tm_min = (int)soap_strtol(a, NULL, 10); a[0] = tmp[19]; a[1] = tmp[20]; T.tm_sec = (int)soap_strtol(a, NULL, 10); p->expire = soap_timegm(&T); } } else if (p && !soap_tag_cmp(tmp, "Secure")) p->secure = 1; else { if (p) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Got environment cookie %s=%s domain=%s path=%s expire=%ld secure=%d\n", p->name, p->value ? p->value : "(null)", p->domain ? p->domain : "(null)", p->path ? p->path : "(null)", p->expire, p->secure)); if ((q = soap_set_cookie(soap, p->name, p->value, p->domain, p->path))) { q->version = p->version; q->expire = p->expire; q->secure = p->secure; q->env = 1; } if (p->name) SOAP_FREE(soap, p->name); if (p->value) SOAP_FREE(soap, p->value); if (p->domain) SOAP_FREE(soap, p->domain); if (p->path) SOAP_FREE(soap, p->path); SOAP_FREE(soap, p); } if ((p = (struct soap_cookie*)SOAP_MALLOC(soap, sizeof(struct soap_cookie)))) { p->name = (char*)SOAP_MALLOC(soap, strlen(tmp)+1); strcpy(p->name, tmp); s = soap_decode_val(tmp, sizeof(tmp), s); if (*tmp) { p->value = (char*)SOAP_MALLOC(soap, strlen(tmp)+1); strcpy(p->value, tmp); } else p->value = NULL; if (domain) p->domain = domain; else if (*soap->host) { p->domain = (char*)SOAP_MALLOC(soap, strlen(soap->host)+1); strcpy(p->domain, soap->host); } else p->domain = NULL; if (path) p->path = path; else if (soap->path && *soap->path) { p->path = (char*)SOAP_MALLOC(soap, strlen(soap->path)+1); strcpy(p->path, soap->path); } else { p->path = (char*)SOAP_MALLOC(soap, 2); strcpy(p->path, "/"); } p->expire = 0; p->secure = 0; p->version = version; } } } if (p) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Got environment cookie %s=%s domain=%s path=%s expire=%ld secure=%d\n", p->name, p->value ? p->value : "(null)", p->domain ? p->domain : "(null)", p->path ? p->path : "(null)", p->expire, p->secure)); if ((q = soap_set_cookie(soap, p->name, p->value, p->domain, p->path))) { q->version = p->version; q->expire = p->expire; q->secure = p->secure; q->env = 1; } if (p->name) SOAP_FREE(soap, p->name); if (p->value) SOAP_FREE(soap, p->value); if (p->domain) SOAP_FREE(soap, p->domain); if (p->path) SOAP_FREE(soap, p->path); SOAP_FREE(soap, p); } if (domain) SOAP_FREE(soap, domain); if (path) SOAP_FREE(soap, path); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_getenv_cookies(struct soap *soap) { struct soap_cookie *p; const char *s; char key[4096], val[4096]; /* cookie size is up to 4096 bytes [RFC2109] */ if (!(s = getenv("HTTP_COOKIE"))) return SOAP_ERR; do { s = soap_decode_key(key, sizeof(key), s); s = soap_decode_val(val, sizeof(val), s); p = soap_set_cookie(soap, key, val, NULL, NULL); if (p) p->env = 1; } while (*s); return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 struct soap_cookie* SOAP_FMAC2 soap_copy_cookies(struct soap *copy, const struct soap *soap) { struct soap_cookie *p, **q, *r; q = &r; for (p = soap->cookies; p; p = p->next) { if (!(*q = (struct soap_cookie*)SOAP_MALLOC(copy, sizeof(struct soap_cookie)))) return r; **q = *p; if (p->name) { if (((*q)->name = (char*)SOAP_MALLOC(copy, strlen(p->name)+1))) strcpy((*q)->name, p->name); } if (p->value) { if (((*q)->value = (char*)SOAP_MALLOC(copy, strlen(p->value)+1))) strcpy((*q)->value, p->value); } if (p->domain) { if (((*q)->domain = (char*)SOAP_MALLOC(copy, strlen(p->domain)+1))) strcpy((*q)->domain, p->domain); } if (p->path) { if (((*q)->path = (char*)SOAP_MALLOC(copy, strlen(p->path)+1))) strcpy((*q)->path, p->path); } q = &(*q)->next; } *q = NULL; return r; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_free_cookies(struct soap *soap) { struct soap_cookie *p; for (p = soap->cookies; p; p = soap->cookies) { soap->cookies = p->next; SOAP_FREE(soap, p->name); if (p->value) SOAP_FREE(soap, p->value); if (p->domain) SOAP_FREE(soap, p->domain); if (p->path) SOAP_FREE(soap, p->path); SOAP_FREE(soap, p); } } /******************************************************************************/ #endif /* WITH_COOKIES */ /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 size_t SOAP_FMAC2 soap_hash(register const char *s) { register size_t h = 0; while (*s) h = 65599*h + *s++; return h % SOAP_IDHASH; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_1 static void soap_init_pht(struct soap *soap) { register int i; soap->pblk = NULL; soap->pidx = 0; for (i = 0; i < (int)SOAP_PTRHASH; i++) soap->pht[i] = NULL; } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 struct soap* SOAP_FMAC2 soap_versioning(soap_new)(soap_mode imode, soap_mode omode) { struct soap *soap = (struct soap*)malloc(sizeof(struct soap)); if (soap) soap_versioning(soap_init)(soap, imode, omode); return soap; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_free(struct soap *soap) { soap_done(soap); free(soap); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_del(struct soap *soap) { free(soap); } #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_1 static void soap_free_pht(struct soap *soap) { register struct soap_pblk *pb, *next; register int i; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free pointer hashtable\n")); for (pb = soap->pblk; pb; pb = next) { next = pb->next; SOAP_FREE(soap, pb); } soap->pblk = NULL; soap->pidx = 0; for (i = 0; i < (int)SOAP_PTRHASH; i++) soap->pht[i] = NULL; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_embed(struct soap *soap, const void *p, const struct soap_array *a, int n, const char *tag, int type) { register int i; struct soap_plist *pp; if (soap->version == 2) soap->encoding = 1; if (a) i = soap_array_pointer_lookup(soap, p, a, n, type, &pp); else i = soap_pointer_lookup(soap, p, type, &pp); if (i) { if (soap_is_embedded(soap, pp) || soap_is_single(soap, pp)) return 0; soap_set_embedded(soap, pp); } return i; (void)soap; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_pointer_lookup(struct soap *soap, const void *p, int type, struct soap_plist **ppp) { register struct soap_plist *pp; *ppp = NULL; if (p) { for (pp = soap->pht[soap_hash_ptr(p)]; pp; pp = pp->next) { if (pp->ptr == p && pp->type == type) { *ppp = pp; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Lookup location=%p type=%d id=%d\n", p, type, pp->id)); return pp->id; } } } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Lookup location=%p type=%d: not found\n", p, type)); return 0; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_pointer_enter(struct soap *soap, const void *p, const struct soap_array *a, int n, int type, struct soap_plist **ppp) { register size_t h; register struct soap_plist *pp; if (!soap->pblk || soap->pidx >= SOAP_PTRBLK) { register struct soap_pblk *pb = (struct soap_pblk*)SOAP_MALLOC(soap, sizeof(struct soap_pblk)); if (!pb) { soap->error = SOAP_EOM; return 0; } pb->next = soap->pblk; soap->pblk = pb; soap->pidx = 0; } *ppp = pp = &soap->pblk->plist[soap->pidx++]; if (a) h = soap_hash_ptr(a->__ptr); else h = soap_hash_ptr(p); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Pointer enter location=%p array=%p size=%d dim=%d type=%d id=%d\n", p, a ? a->__ptr : NULL, a ? a->__size : 0, n, type, soap->idnum+1)); pp->next = soap->pht[h]; pp->type = type; pp->mark1 = 0; pp->mark2 = 0; pp->ptr = p; pp->array = a; soap->pht[h] = pp; pp->id = ++soap->idnum; return pp->id; (void)n; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_array_pointer_lookup(struct soap *soap, const void *p, const struct soap_array *a, int n, int type, struct soap_plist **ppp) { register struct soap_plist *pp; *ppp = NULL; if (!p || !a->__ptr) return 0; for (pp = soap->pht[soap_hash_ptr(a->__ptr)]; pp; pp = pp->next) { if (pp->type == type && pp->array && pp->array->__ptr == a->__ptr) { register int i; for (i = 0; i < n; i++) if (((const int*)&pp->array->__size)[i] != ((const int*)&a->__size)[i]) break; if (i == n) { *ppp = pp; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Array lookup location=%p type=%d id=%d\n", a->__ptr, type, pp->id)); return pp->id; } } } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Array lookup location=%p type=%d: not found\n", a->__ptr, type)); return 0; } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_begin_count(struct soap *soap) { soap_free_ns(soap); #ifndef WITH_LEANER if ((soap->mode & SOAP_ENC_DIME) || (soap->omode & SOAP_ENC_DIME)) soap->mode = soap->omode | SOAP_IO_LENGTH | SOAP_ENC_DIME; else #endif { soap->mode = soap->omode; if ((soap->mode & SOAP_IO_UDP)) soap->mode |= SOAP_ENC_XML; if ((soap->mode & SOAP_IO) == SOAP_IO_STORE || (((soap->mode & SOAP_IO) == SOAP_IO_CHUNK || (soap->mode & SOAP_ENC_XML)) #ifndef WITH_LEANER && !soap->fpreparesend #endif )) soap->mode &= ~SOAP_IO_LENGTH; else soap->mode |= SOAP_IO_LENGTH; } #ifdef WITH_ZLIB if ((soap->mode & SOAP_ENC_ZLIB) && (soap->mode & SOAP_IO) == SOAP_IO_FLUSH) { if (!(soap->mode & SOAP_ENC_DIME)) soap->mode &= ~SOAP_IO_LENGTH; if (soap->mode & SOAP_ENC_XML) soap->mode |= SOAP_IO_BUFFER; else soap->mode |= SOAP_IO_STORE; } #endif if (!soap->encodingStyle && !(soap->mode & SOAP_XML_GRAPH)) soap->mode |= SOAP_XML_TREE; #ifndef WITH_LEANER if ((soap->mode & SOAP_ENC_MTOM) && (soap->mode & SOAP_ENC_DIME)) soap->mode |= SOAP_ENC_MIME; else if (!(soap->mode & SOAP_ENC_MIME)) soap->mode &= ~SOAP_ENC_MTOM; if (soap->mode & SOAP_ENC_MIME) soap_select_mime_boundary(soap); soap->dime.list = soap->dime.last; /* keep track of last DIME attachment */ #endif soap->count = 0; soap->ns = 0; soap->null = 0; soap->position = 0; soap->mustUnderstand = 0; soap->encoding = 0; soap->part = SOAP_BEGIN; soap->event = 0; soap->evlev = 0; soap->idnum = 0; soap_clr_attr(soap); soap_set_local_namespaces(soap); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Begin count phase (socket=%d mode=0x%x count=%lu)\n", soap->socket, (unsigned int)soap->mode, (unsigned long)soap->count)); #ifndef WITH_LEANER soap->dime.count = 0; /* count # of attachments */ soap->dime.size = 0; /* accumulate total size of attachments */ if (soap->fprepareinitsend && (soap->mode & SOAP_IO) != SOAP_IO_STORE && (soap->error = soap->fprepareinitsend(soap))) return soap->error; #endif return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_end_count(struct soap *soap) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of count phase\n")); #ifndef WITH_LEANER if ((soap->mode & SOAP_IO_LENGTH)) { if (soap->fpreparefinalsend && (soap->error = soap->fpreparefinalsend(soap))) return soap->error; } #endif return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_begin_send(struct soap *soap) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Initializing for output\n")); soap_free_ns(soap); soap->error = SOAP_OK; soap->mode = soap->omode | (soap->mode & (SOAP_IO_LENGTH | SOAP_ENC_DIME)); #ifdef WITH_ZLIB if ((soap->mode & SOAP_ENC_ZLIB) && (soap->mode & SOAP_IO) == SOAP_IO_FLUSH) { if (soap->mode & SOAP_ENC_XML) soap->mode |= SOAP_IO_BUFFER; else soap->mode |= SOAP_IO_STORE; } #endif #ifndef WITH_LEAN if ((soap->mode & SOAP_IO_UDP)) { soap->mode |= SOAP_ENC_XML; if (soap->count > SOAP_BUFLEN) return soap->error = SOAP_UDP_ERROR; } #endif if ((soap->mode & SOAP_IO) == SOAP_IO_FLUSH && soap_valid_socket(soap->socket)) { if (soap->count || (soap->mode & SOAP_IO_LENGTH) || (soap->mode & SOAP_ENC_XML)) soap->mode |= SOAP_IO_BUFFER; else soap->mode |= SOAP_IO_STORE; } soap->mode &= ~SOAP_IO_LENGTH; if ((soap->mode & SOAP_IO) == SOAP_IO_STORE) if (soap_new_block(soap) == NULL) return soap->error; if (!(soap->mode & SOAP_IO_KEEPALIVE)) soap->keep_alive = 0; if (!soap->encodingStyle && !(soap->mode & SOAP_XML_GRAPH)) soap->mode |= SOAP_XML_TREE; #ifndef WITH_LEANER if ((soap->mode & SOAP_ENC_MTOM) && (soap->mode & SOAP_ENC_DIME)) { soap->mode |= SOAP_ENC_MIME; soap->mode &= ~SOAP_ENC_DIME; } else if (!(soap->mode & SOAP_ENC_MIME)) soap->mode &= ~SOAP_ENC_MTOM; if (soap->mode & SOAP_ENC_MIME) soap_select_mime_boundary(soap); #ifdef WIN32 #ifndef UNDER_CE #ifndef WITH_FASTCGI if (!soap_valid_socket(soap->socket)) /* Set win32 stdout or soap->sendfd to BINARY, e.g. to support DIME */ #ifdef __BORLANDC__ setmode(soap->sendfd, _O_BINARY); #else _setmode(soap->sendfd, _O_BINARY); #endif #endif #endif #endif #endif if (soap->mode & SOAP_IO) { soap->bufidx = 0; soap->buflen = 0; } soap->chunksize = 0; soap->ns = 0; soap->null = 0; soap->position = 0; soap->mustUnderstand = 0; soap->encoding = 0; soap->idnum = 0; soap->level = 0; soap_clr_attr(soap); soap_set_local_namespaces(soap); #ifdef WITH_ZLIB soap->z_ratio_out = 1.0; if ((soap->mode & SOAP_ENC_ZLIB) && soap->zlib_state != SOAP_ZLIB_DEFLATE) { if (!soap->z_buf) soap->z_buf = (char*)SOAP_MALLOC(soap, SOAP_BUFLEN); soap->d_stream->next_out = (Byte*)soap->z_buf; soap->d_stream->avail_out = SOAP_BUFLEN; #ifdef WITH_GZIP if (soap->zlib_out != SOAP_ZLIB_DEFLATE) { memcpy(soap->z_buf, "\37\213\10\0\0\0\0\0\0\377", 10); soap->d_stream->next_out = (Byte*)soap->z_buf + 10; soap->d_stream->avail_out = SOAP_BUFLEN - 10; soap->z_crc = crc32(0L, NULL, 0); soap->zlib_out = SOAP_ZLIB_GZIP; if (soap->z_dict) *((Byte*)soap->z_buf + 2) = 0xff; if (deflateInit2(soap->d_stream, soap->z_level, Z_DEFLATED, -MAX_WBITS, 8, Z_DEFAULT_STRATEGY) != Z_OK) return soap->error = SOAP_ZLIB_ERROR; } else #endif if (deflateInit(soap->d_stream, soap->z_level) != Z_OK) return soap->error = SOAP_ZLIB_ERROR; if (soap->z_dict) { if (deflateSetDictionary(soap->d_stream, (const Bytef*)soap->z_dict, soap->z_dict_len) != Z_OK) return soap->error = SOAP_ZLIB_ERROR; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Deflate initialized\n")); soap->zlib_state = SOAP_ZLIB_DEFLATE; } #endif #ifdef WITH_OPENSSL if (soap->ssl) ERR_clear_error(); #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Begin send phase (socket=%d mode=0x%x count=%lu)\n", soap->socket, soap->mode, (unsigned long)soap->count)); soap->part = SOAP_BEGIN; #ifndef WITH_LEANER if (soap->fprepareinitsend && (soap->mode & SOAP_IO) == SOAP_IO_STORE && (soap->error = soap->fprepareinitsend(soap))) return soap->error; #endif return SOAP_OK; } #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_embedded(struct soap *soap, const void *p, int t) { struct soap_plist *pp; if (soap_pointer_lookup(soap, p, t, &pp)) { pp->mark1 = 1; pp->mark2 = 1; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Embedded %p type=%d mark set to 1\n", p, t)); } } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_reference(struct soap *soap, const void *p, int t) { struct soap_plist *pp; if (!p || (soap->mode & SOAP_XML_TREE)) return 1; if (soap_pointer_lookup(soap, p, t, &pp)) { if (pp->mark1 == 0) { pp->mark1 = 2; pp->mark2 = 2; } } else if (soap_pointer_enter(soap, p, NULL, 0, t, &pp)) { pp->mark1 = 0; pp->mark2 = 0; } else return 1; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Reference %p type=%d (%d %d)\n", p, t, (int)pp->mark1, (int)pp->mark2)); return pp->mark1; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_array_reference(struct soap *soap, const void *p, const struct soap_array *a, int n, int t) { register int i; struct soap_plist *pp; if (!p || !a->__ptr) return 1; i = soap_array_pointer_lookup(soap, p, a, n, t, &pp); if (i) { if (pp->mark1 == 0) { pp->mark1 = 2; pp->mark2 = 2; } } else if (!soap_pointer_enter(soap, p, a, n, t, &pp)) return 1; else { pp->mark1 = 0; pp->mark2 = 0; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Array reference %p ptr=%p dim=%d type=%d (%d %d)\n", p, a->__ptr, n, t, (int)pp->mark1, (int)pp->mark2)); return pp->mark1; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_embedded_id(struct soap *soap, int id, const void *p, int t) { struct soap_plist *pp = NULL; if (soap->mode & SOAP_XML_TREE) return id; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Embedded_id %p type=%d id=%d\n", p, t, id)); if (soap->version == 1 && soap->encodingStyle && !(soap->mode & SOAP_XML_GRAPH) && soap->part != SOAP_IN_HEADER) { if (id < 0) { id = soap_pointer_lookup(soap, p, t, &pp); if (id) { if (soap->mode & SOAP_IO_LENGTH) pp->mark1 = 2; else pp->mark2 = 2; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Embedded_id multiref id=%d %p type=%d = (%d %d)\n", id, p, t, (int)pp->mark1, (int)pp->mark2)); } return -1; } return id; } if (id < 0) id = soap_pointer_lookup(soap, p, t, &pp); else if (id && !soap_pointer_lookup(soap, p, t, &pp)) return 0; if (id && pp) { if (soap->mode & SOAP_IO_LENGTH) pp->mark1 = 1; else pp->mark2 = 1; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Embedded_id embedded ref id=%d %p type=%d = (%d %d)\n", id, p, t, (int)pp->mark1, (int)pp->mark2)); } return id; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_is_embedded(struct soap *soap, struct soap_plist *pp) { if (!pp) return 0; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Is embedded? %d %d\n", (int)pp->mark1, (int)pp->mark2)); if (soap->version == 1 && soap->encodingStyle && !(soap->mode & SOAP_XML_GRAPH) && soap->part != SOAP_IN_HEADER) { if (soap->mode & SOAP_IO_LENGTH) return pp->mark1 != 0; return pp->mark2 != 0; } if (soap->mode & SOAP_IO_LENGTH) return pp->mark1 == 1; return pp->mark2 == 1; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_is_single(struct soap *soap, struct soap_plist *pp) { if (soap->part == SOAP_IN_HEADER) return 1; if (!pp) return 0; if (soap->mode & SOAP_IO_LENGTH) return pp->mark1 == 0; return pp->mark2 == 0; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_set_embedded(struct soap *soap, struct soap_plist *pp) { if (!pp) return; if (soap->mode & SOAP_IO_LENGTH) pp->mark1 = 1; else pp->mark2 = 1; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_attachment(struct soap *soap, const char *tag, int id, const void *p, const struct soap_array *a, const char *aid, const char *atype, const char *aoptions, int n, const char *type, int t) { #ifndef WITH_NOIDREF struct soap_plist *pp; int i; if (!p || !a->__ptr || (!aid && !atype)) return soap_element_id(soap, tag, id, p, a, n, type, t); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Attachment tag='%s' id='%s' (%d) type='%s'\n", tag, aid ? aid : SOAP_STR_EOS, id, atype ? atype : SOAP_STR_EOS)); i = soap_array_pointer_lookup(soap, p, a, n, t, &pp); if (!i) { i = soap_pointer_enter(soap, p, a, n, t, &pp); if (!i) { soap->error = SOAP_EOM; return -1; } } if (id <= 0) id = i; if (!aid) { sprintf(soap->tmpbuf, soap->dime_id_format, id); aid = soap_strdup(soap, soap->tmpbuf); } /* Add MTOM xop:Include element when necessary */ /* TODO: this code to be obsoleted with new import/xop.h conventions */ if ((soap->mode & SOAP_ENC_MTOM) && strcmp(tag, "xop:Include")) { if (soap_element_begin_out(soap, tag, 0, type) || soap_element_href(soap, "xop:Include", 0, "xmlns:xop=\"http://www.w3.org/2004/08/xop/include\" href", aid) || soap_element_end_out(soap, tag)) return soap->error; } else if (soap_element_href(soap, tag, 0, "href", aid)) return soap->error; if (soap->mode & SOAP_IO_LENGTH) { if (pp->mark1 != 3) { struct soap_multipart *content; if (soap->mode & SOAP_ENC_MTOM) content = soap_new_multipart(soap, &soap->mime.first, &soap->mime.last, (char*)a->__ptr, a->__size); else content = soap_new_multipart(soap, &soap->dime.first, &soap->dime.last, (char*)a->__ptr, a->__size); if (!content) { soap->error = SOAP_EOM; return -1; } if (!strncmp(aid, "cid:", 4)) /* RFC 2111 */ { if (soap->mode & SOAP_ENC_MTOM) { char *s = (char*)soap_malloc(soap, strlen(aid) - 1); if (s) { *s = '<'; strcpy(s + 1, aid + 4); strcat(s, ">"); content->id = s; } } else content->id = aid + 4; } else content->id = aid; content->type = atype; content->options = aoptions; content->encoding = SOAP_MIME_BINARY; pp->mark1 = 3; } } else pp->mark2 = 3; #endif return -1; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_1 static void soap_init_iht(struct soap *soap) { register int i; for (i = 0; i < SOAP_IDHASH; i++) soap->iht[i] = NULL; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_1 static void soap_free_iht(struct soap *soap) { register int i; register struct soap_ilist *ip = NULL, *p = NULL; register struct soap_flist *fp = NULL, *fq = NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free ID hashtable\n")); for (i = 0; i < SOAP_IDHASH; i++) { for (ip = soap->iht[i]; ip; ip = p) { for (fp = ip->flist; fp; fp = fq) { fq = fp->next; SOAP_FREE(soap, fp); } p = ip->next; SOAP_FREE(soap, ip); } soap->iht[i] = NULL; } } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 struct soap_ilist * SOAP_FMAC2 soap_lookup(struct soap *soap, const char *id) { register struct soap_ilist *ip = NULL; for (ip = soap->iht[soap_hash(id)]; ip; ip = ip->next) if (!strcmp(ip->id, id)) return ip; return NULL; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 struct soap_ilist * SOAP_FMAC2 soap_enter(struct soap *soap, const char *id) { register size_t h; register struct soap_ilist *ip; ip = (struct soap_ilist*)SOAP_MALLOC(soap, sizeof(struct soap_ilist) + strlen(id)); if (ip) { h = soap_hash(id); strcpy((char*)ip->id, id); ip->next = soap->iht[h]; soap->iht[h] = ip; } return ip; } #endif #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void* SOAP_FMAC2 soap_malloc(struct soap *soap, size_t n) { register char *p; if (!n) return (void*)SOAP_NON_NULL; if (!soap) return SOAP_MALLOC(soap, n); if (soap->fmalloc) p = (char*)soap->fmalloc(soap, n); else { n += sizeof(short); n += (-(long)n) & (sizeof(void*)-1); /* align at 4-, 8- or 16-byte boundary */ if (!(p = (char*)SOAP_MALLOC(soap, n + sizeof(void*) + sizeof(size_t)))) { soap->error = SOAP_EOM; return NULL; } /* set the canary to detect corruption */ *(unsigned short*)(p + n - sizeof(unsigned short)) = (unsigned short)SOAP_CANARY; /* keep chain of alloced cells for destruction */ *(void**)(p + n) = soap->alist; *(size_t*)(p + n + sizeof(void*)) = n; soap->alist = p + n; } soap->alloced = 1; return p; } #endif /******************************************************************************/ #ifdef SOAP_MEM_DEBUG static void soap_init_mht(struct soap *soap) { register int i; for (i = 0; i < (int)SOAP_PTRHASH; i++) soap->mht[i] = NULL; } #endif /******************************************************************************/ #ifdef SOAP_MEM_DEBUG static void soap_free_mht(struct soap *soap) { register int i; register struct soap_mlist *mp, *mq; for (i = 0; i < (int)SOAP_PTRHASH; i++) { for (mp = soap->mht[i]; mp; mp = mq) { mq = mp->next; if (mp->live) fprintf(stderr, "%s(%d): malloc() = %p not freed (memory leak or forgot to call soap_end()?)\n", mp->file, mp->line, mp->ptr); free(mp); } soap->mht[i] = NULL; } } #endif /******************************************************************************/ #ifdef SOAP_MEM_DEBUG SOAP_FMAC1 void* SOAP_FMAC2 soap_track_malloc(struct soap *soap, const char *file, int line, size_t size) { register void *p = malloc(size); if (soap) { register size_t h = soap_hash_ptr(p); register struct soap_mlist *mp = (struct soap_mlist*)malloc(sizeof(struct soap_mlist)); if (soap->fdebug[SOAP_INDEX_TEST]) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%s(%d): malloc(%lu) = %p\n", file, line, (unsigned long)size, p)); } mp->next = soap->mht[h]; mp->ptr = p; mp->file = file; mp->line = line; mp->live = 1; soap->mht[h] = mp; } return p; } #endif /******************************************************************************/ #ifdef SOAP_MEM_DEBUG SOAP_FMAC1 void SOAP_FMAC2 soap_track_free(struct soap *soap, const char *file, int line, void *p) { register size_t h = soap_hash_ptr(p); register struct soap_mlist *mp; for (mp = soap->mht[h]; mp; mp = mp->next) if (mp->ptr == p) break; if (mp) { if (mp->live) { free(p); if (soap->fdebug[SOAP_INDEX_TEST]) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%s(%d): free(%p)\n", file, line, p)); } mp->live = 0; } else fprintf(stderr, "%s(%d): free(%p) double free of pointer malloced at %s(%d)\n", file, line, p, mp->file, mp->line); } else fprintf(stderr, "%s(%d): free(%p) pointer not malloced\n", file, line, p); } #endif /******************************************************************************/ #ifdef SOAP_MEM_DEBUG static void soap_track_unlink(struct soap *soap, const void *p) { register size_t h = soap_hash_ptr(p); register struct soap_mlist *mp; for (mp = soap->mht[h]; mp; mp = mp->next) if (mp->ptr == p) break; if (mp) mp->live = 0; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_dealloc(struct soap *soap, void *p) { if (soap_check_state(soap)) return; if (p) { register char **q; for (q = (char**)&soap->alist; *q; q = *(char***)q) { if (*(unsigned short*)(char*)(*q - sizeof(unsigned short)) != (unsigned short)SOAP_CANARY) { #ifdef SOAP_MEM_DEBUG fprintf(stderr, "Data corruption in dynamic allocation (see logs)\n"); #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Data corruption:\n")); DBGHEX(TEST, *q - 200, 200); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n")); soap->error = SOAP_MOE; return; } if (p == (void*)(*q - *(size_t*)(*q + sizeof(void*)))) { *q = **(char***)q; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Freed data at %p\n", p)); SOAP_FREE(soap, p); return; } } soap_delete(soap, p); } else { register char *q; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free all soap_malloc() data\n")); while (soap->alist) { q = (char*)soap->alist; if (*(unsigned short*)(char*)(q - sizeof(unsigned short)) != (unsigned short)SOAP_CANARY) { #ifdef SOAP_MEM_DEBUG fprintf(stderr, "Data corruption in dynamic allocation (see logs)\n"); #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Data corruption:\n")); DBGHEX(TEST, q - 200, 200); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n")); soap->error = SOAP_MOE; return; } soap->alist = *(void**)q; q -= *(size_t*)(q + sizeof(void*)); SOAP_FREE(soap, q); } /* we must assume these were deallocated: */ soap->http_content = NULL; soap->action = NULL; soap->fault = NULL; soap->header = NULL; soap->userid = NULL; soap->passwd = NULL; soap->authrealm = NULL; #ifdef WITH_NTLM soap->ntlm_challenge = NULL; #endif #ifndef WITH_LEANER soap_clr_mime(soap); #endif } } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_delete(struct soap *soap, void *p) { register struct soap_clist **cp; if (soap_check_state(soap)) return; cp = &soap->clist; if (p) { while (*cp) { if (p == (*cp)->ptr) { register struct soap_clist *q = *cp; *cp = q->next; if (q->fdelete(q)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not dealloc data %p: deletion callback failed for object type %d\n", q->ptr, q->type)); #ifdef SOAP_MEM_DEBUG fprintf(stderr, "new(object type = %d) = %p not freed: deletion callback failed\n", q->type, q->ptr); #endif } SOAP_FREE(soap, q); return; } cp = &(*cp)->next; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not dealloc data %p: address not in list\n", p)); } else { while (*cp) { register struct soap_clist *q = *cp; *cp = q->next; if (q->fdelete(q)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not dealloc data %p: deletion callback failed for object type %d\n", q->ptr, q->type)); #ifdef SOAP_MEM_DEBUG fprintf(stderr, "new(object type = %d) = %p not freed: deletion callback failed\n", q->type, q->ptr); #endif } SOAP_FREE(soap, q); } } soap->fault = NULL; /* this was possibly deallocated */ soap->header = NULL; /* this was possibly deallocated */ } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_delegate_deletion(struct soap *soap, struct soap *soap_to) { register struct soap_clist *cp; register char **q; #ifdef SOAP_MEM_DEBUG register void *p; register struct soap_mlist **mp, *mq; size_t h; #endif for (q = (char**)&soap->alist; *q; q = *(char***)q) { if (*(unsigned short*)(char*)(*q - sizeof(unsigned short)) != (unsigned short)SOAP_CANARY) { #ifdef SOAP_MEM_DEBUG fprintf(stderr, "Data corruption in dynamic allocation (see logs)\n"); #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Data corruption:\n")); DBGHEX(TEST, *q - 200, 200); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n")); soap->error = SOAP_MOE; return; } #ifdef SOAP_MEM_DEBUG p = (void*)(*q - *(size_t*)(*q + sizeof(void*))); h = soap_hash_ptr(p); for (mp = &soap->mht[h]; *mp; mp = &(*mp)->next) { if ((*mp)->ptr == p) { mq = *mp; *mp = mq->next; mq->next = soap_to->mht[h]; soap_to->mht[h] = mq; break; } } #endif } *q = (char*)soap_to->alist; soap_to->alist = soap->alist; soap->alist = NULL; cp = soap_to->clist; if (cp) { while (cp->next) cp = cp->next; cp->next = soap->clist; } else soap_to->clist = soap->clist; soap->clist = NULL; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 struct soap_clist * SOAP_FMAC2 soap_link(struct soap *soap, void *p, int t, int n, int (*fdelete)(struct soap_clist*)) { register struct soap_clist *cp; if ((cp = (struct soap_clist*)SOAP_MALLOC(soap, sizeof(struct soap_clist)))) { cp->next = soap->clist; cp->type = t; cp->size = n; cp->ptr = p; cp->fdelete = fdelete; soap->clist = cp; } return cp; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_unlink(struct soap *soap, const void *p) { register char **q; register struct soap_clist **cp; if (soap && p) { for (q = (char**)&soap->alist; *q; q = *(char***)q) { if (p == (void*)(*q - *(size_t*)(*q + sizeof(void*)))) { *q = **(char***)q; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unlinked data %p\n", p)); #ifdef SOAP_MEM_DEBUG soap_track_unlink(soap, p); #endif return SOAP_OK; /* found and removed from dealloc chain */ } } for (cp = &soap->clist; *cp; cp = &(*cp)->next) { if (p == (*cp)->ptr) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unlinked class instance %p\n", p)); q = (char**)*cp; *cp = (*cp)->next; SOAP_FREE(soap, q); return SOAP_OK; /* found and removed from dealloc chain */ } } } return SOAP_ERR; } #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_lookup_type(struct soap *soap, const char *id) { register struct soap_ilist *ip; if (id && *id) { ip = soap_lookup(soap, id); if (ip) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Lookup id='%s' type=%d\n", id, ip->type)); return ip->type; } } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "lookup type id='%s' NOT FOUND! Need to get it from xsi:type\n", id)); return 0; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 void* SOAP_FMAC2 soap_id_lookup(struct soap *soap, const char *id, void **p, int t, size_t n, unsigned int k) { struct soap_ilist *ip; void **q; if (!p || !id || !*id) return p; ip = soap_lookup(soap, id); /* lookup pointer to hash table entry for string id */ if (!ip) { if (!(ip = soap_enter(soap, id))) /* new hash table entry for string id */ return NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forwarding first href='%s' type=%d %p (%u bytes)\n", id, t, p, (unsigned int)n)); ip->type = t; ip->size = n; ip->link = p; ip->copy = NULL; ip->flist = NULL; ip->ptr = NULL; ip->level = k; *p = NULL; } else if (ip->ptr) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolved href='%s' type=%d location=%p (%u bytes)\n", id, t, ip->ptr, (unsigned int)n)); if (ip->type != t) { strcpy(soap->id, id); soap->error = SOAP_HREF; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Type incompatibility: href='%s' id-type=%d href-type=%d\n", id, ip->type, t)); return NULL; } while (ip->level < k) { q = (void**)soap_malloc(soap, sizeof(void*)); if (!q) return NULL; *p = (void*)q; p = q; k--; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Descending one level...\n")); } *p = ip->ptr; } else if (ip->level > k) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolving level %u pointers to href='%s'\n", ip->level, id)); while (ip->level > k) { void *s, **r = &ip->link; q = (void**)ip->link; while (q) { *r = (void*)soap_malloc(soap, sizeof(void*)); if (!*r) return NULL; s = *q; *q = *r; r = (void**)*r; q = (void**)s; } *r = NULL; ip->size = n; ip->copy = NULL; ip->level = ip->level - 1; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Descending one level...\n")); } q = (void**)ip->link; ip->link = p; *p = (void*)q; } else { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forwarded href='%s' type=%d location=%p (%u bytes)\n", id, t, p, (unsigned int)n)); while (ip->level < k) { q = (void**)soap_malloc(soap, sizeof(void*)); if (!q) return NULL; *p = q; p = q; k--; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Descending one level...\n")); } q = (void**)ip->link; ip->link = p; *p = (void*)q; } return p; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 void* SOAP_FMAC2 soap_id_forward(struct soap *soap, const char *href, void *p, size_t len, int st, int tt, size_t n, unsigned int k, void (*fcopy)(struct soap*, int, int, void*, size_t, const void*, size_t)) { struct soap_ilist *ip; if (!p || !href || !*href) return p; ip = soap_lookup(soap, href); /* lookup pointer to hash table entry for string id */ if (!ip) { if (!(ip = soap_enter(soap, href))) /* new hash table entry for string id */ return NULL; ip->type = st; ip->size = n; ip->link = NULL; ip->copy = NULL; ip->ptr = NULL; ip->level = 0; ip->flist = NULL; DBGLOG(TEST,SOAP_MESSAGE(fdebug, "New entry href='%s' type=%d size=%lu level=%d location=%p\n", href, st, (unsigned long)n, k, p)); } else if (ip->type != st || (ip->level == k && ip->size != n)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Type incompatibility id='%s' expect type=%d size=%lu level=%u got type=%d size=%lu\n", href, ip->type, (unsigned long)ip->size, k, st, (unsigned long)n)); strcpy(soap->id, href); soap->error = SOAP_HREF; return NULL; } if (fcopy || n < sizeof(void*) || *href != '#') { register struct soap_flist *fp = (struct soap_flist*)SOAP_MALLOC(soap, sizeof(struct soap_flist)); if (!fp) { soap->error = SOAP_EOM; return NULL; } fp->next = ip->flist; fp->type = tt; fp->ptr = p; fp->level = k; fp->len = len; if (fcopy) fp->fcopy = fcopy; else fp->fcopy = soap_fcopy; ip->flist = fp; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forwarding type=%d (target type=%d) size=%lu location=%p level=%u len=%lu href='%s'\n", st, tt, (unsigned long)n, p, k, (unsigned long)len, href)); } else { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forwarding copying address %p for type=%d href='%s'\n", p, st, href)); *(void**)p = ip->copy; ip->copy = p; } return p; } #endif #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void* SOAP_FMAC2 soap_id_enter(struct soap *soap, const char *id, void *p, int t, size_t n, unsigned int k, const char *type, const char *arrayType, void *(*finstantiate)(struct soap*, int, const char*, const char*, size_t*)) { #ifndef WITH_NOIDREF struct soap_ilist *ip; #endif DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Enter id='%s' type=%d loc=%p size=%lu level=%u\n", id, t, p, (unsigned long)n, k)); soap->alloced = 0; if (!p) { if (finstantiate) p = finstantiate(soap, t, type, arrayType, &n); else p = soap_malloc(soap, n); if (p) soap->alloced = 1; } #ifndef WITH_NOIDREF if (!id || !*id) #endif return p; #ifndef WITH_NOIDREF ip = soap_lookup(soap, id); /* lookup pointer to hash table entry for string id */ DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Lookup entry id='%s for location=%p'\n", id, p)); if (!ip) { if (!(ip = soap_enter(soap, id))) /* new hash table entry for string id */ return NULL; ip->type = t; ip->link = NULL; ip->copy = NULL; ip->flist = NULL; ip->size = n; ip->ptr = p; ip->level = k; DBGLOG(TEST,SOAP_MESSAGE(fdebug, "New entry id='%s' type=%d size=%lu level=%u location=%p\n", id, t, (unsigned long)n, k, p)); } else if ((ip->type != t || (ip->level == k && ip->size != n)) && (ip->copy || ip->flist)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Type incompatibility id='%s' expect type=%d size=%lu level=%u got type=%d size=%lu\n", id, ip->type, (unsigned long)ip->size, k, t, (unsigned long)n)); strcpy(soap->id, id); soap->error = SOAP_HREF; return NULL; } else if (ip->ptr) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Multiply defined id='%s'\n", id)); strcpy(soap->id, id); soap->error = SOAP_DUPLICATE_ID; return NULL; } else { ip->size = n; ip->ptr = p; ip->level = k; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Update entry id='%s' type=%d location=%p size=%lu level=%u\n", id, t, p, (unsigned long)n, k)); } return ip->ptr; #endif } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_fcopy(struct soap *soap, int st, int tt, void *p, size_t len, const void *q, size_t n) { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Copying data type=%d (target type=%d) %p -> %p (%lu bytes)\n", st, tt, q, p, (unsigned long)n)); memcpy(p, q, n); (void)soap; (void)st; (void)tt; (void)len; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_end_send(struct soap *soap) { #ifndef WITH_LEANER int err; if (soap->dime.list) { /* SOAP body referenced attachments must appear first */ soap->dime.last->next = soap->dime.first; soap->dime.first = soap->dime.list->next; soap->dime.list->next = NULL; soap->dime.last = soap->dime.list; } if (!(err = soap_putdime(soap))) err = soap_putmime(soap); soap->mime.list = NULL; soap->mime.first = NULL; soap->mime.last = NULL; soap->dime.list = NULL; soap->dime.first = NULL; soap->dime.last = NULL; if (err) return err; #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End send mode=0x%x\n", soap->mode)); if (soap->mode & SOAP_IO) /* need to flush the remaining data in buffer */ { if (soap_flush(soap)) #ifdef WITH_ZLIB { if (soap->mode & SOAP_ENC_ZLIB && soap->zlib_state == SOAP_ZLIB_DEFLATE) { soap->zlib_state = SOAP_ZLIB_NONE; deflateEnd(soap->d_stream); } return soap->error; } #else return soap->error; #endif #ifdef WITH_ZLIB if (soap->mode & SOAP_ENC_ZLIB) { int r; soap->d_stream->avail_in = 0; do { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Deflating remainder\n")); r = deflate(soap->d_stream, Z_FINISH); if (soap->d_stream->avail_out != SOAP_BUFLEN) { if (soap_flush_raw(soap, soap->z_buf, SOAP_BUFLEN - soap->d_stream->avail_out)) { soap->zlib_state = SOAP_ZLIB_NONE; deflateEnd(soap->d_stream); return soap->error; } soap->d_stream->next_out = (Byte*)soap->z_buf; soap->d_stream->avail_out = SOAP_BUFLEN; } } while (r == Z_OK); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Deflated total %lu->%lu bytes\n", soap->d_stream->total_in, soap->d_stream->total_out)); soap->z_ratio_out = (float)soap->d_stream->total_out / (float)soap->d_stream->total_in; soap->mode &= ~SOAP_ENC_ZLIB; soap->zlib_state = SOAP_ZLIB_NONE; if (deflateEnd(soap->d_stream) != Z_OK || r != Z_STREAM_END) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unable to end deflate: %s\n", soap->d_stream->msg ? soap->d_stream->msg : SOAP_STR_EOS)); return soap->error = SOAP_ZLIB_ERROR; } #ifdef WITH_GZIP if (soap->zlib_out != SOAP_ZLIB_DEFLATE) { soap->z_buf[0] = soap->z_crc & 0xFF; soap->z_buf[1] = (soap->z_crc >> 8) & 0xFF; soap->z_buf[2] = (soap->z_crc >> 16) & 0xFF; soap->z_buf[3] = (soap->z_crc >> 24) & 0xFF; soap->z_buf[4] = soap->d_stream->total_in & 0xFF; soap->z_buf[5] = (soap->d_stream->total_in >> 8) & 0xFF; soap->z_buf[6] = (soap->d_stream->total_in >> 16) & 0xFF; soap->z_buf[7] = (soap->d_stream->total_in >> 24) & 0xFF; if (soap_flush_raw(soap, soap->z_buf, 8)) return soap->error; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "gzip crc32=%lu\n", (unsigned long)soap->z_crc)); } #endif } #endif if ((soap->mode & SOAP_IO) == SOAP_IO_STORE) { char *p; #ifndef WITH_NOHTTP if (!(soap->mode & SOAP_ENC_XML)) { soap->mode--; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Sending buffered message of length %u\n", (unsigned int)soap->blist->size)); if (soap->status >= SOAP_POST) soap->error = soap->fpost(soap, soap->endpoint, soap->host, soap->port, soap->path, soap->action, soap->blist->size); else if (soap->status != SOAP_STOP) soap->error = soap->fresponse(soap, soap->status, soap->blist->size); if (soap->error || soap_flush(soap)) return soap->error; soap->mode++; } #endif for (p = soap_first_block(soap, NULL); p; p = soap_next_block(soap, NULL)) { DBGMSG(SENT, p, soap_block_size(soap, NULL)); if ((soap->error = soap->fsend(soap, p, soap_block_size(soap, NULL)))) { soap_end_block(soap, NULL); return soap->error; } } soap_end_block(soap, NULL); } #ifndef WITH_LEANER else if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK) { DBGMSG(SENT, "\r\n0\r\n\r\n", 7); if ((soap->error = soap->fsend(soap, "\r\n0\r\n\r\n", 7))) return soap->error; } #endif } #ifdef WITH_TCPFIN #ifdef WITH_OPENSSL if (!soap->ssl && soap_valid_socket(soap->socket) && !soap->keep_alive && !(soap->omode & SOAP_IO_UDP)) soap->fshutdownsocket(soap, soap->socket, SOAP_SHUT_WR); /* Send TCP FIN */ #else if (soap_valid_socket(soap->socket) && !soap->keep_alive && !(soap->omode & SOAP_IO_UDP)) soap->fshutdownsocket(soap, soap->socket, SOAP_SHUT_WR); /* Send TCP FIN */ #endif #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of send phase\n")); soap->omode &= ~SOAP_SEC_WSUID; soap->count = 0; soap->part = SOAP_END; return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_end_recv(struct soap *soap) { soap->part = SOAP_END; #ifndef WITH_LEAN soap->wsuid = NULL; /* reset before next send */ soap->c14nexclude = NULL; /* reset before next send */ #endif #ifndef WITH_LEANER soap->ffilterrecv = NULL; if ((soap->mode & SOAP_ENC_DIME) && soap_getdime(soap)) { soap->dime.first = NULL; soap->dime.last = NULL; return soap->error; } soap->dime.list = soap->dime.first; soap->dime.first = NULL; soap->dime.last = NULL; /* Check if MIME attachments and mime-post-check flag is set, if so call soap_resolve() and return */ if (soap->mode & SOAP_ENC_MIME) { if (soap->mode & SOAP_MIME_POSTCHECK) { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Post checking MIME attachments\n")); if (!soap->keep_alive) soap->keep_alive = -1; #ifndef WITH_NOIDREF soap_resolve(soap); #endif return SOAP_OK; } if (soap_getmime(soap)) return soap->error; } soap->mime.list = soap->mime.first; soap->mime.first = NULL; soap->mime.last = NULL; soap->mime.boundary = NULL; if (soap->xlist) { struct soap_multipart *content; for (content = soap->mime.list; content; content = content->next) soap_resolve_attachment(soap, content); } #endif DBGLOG(TEST,SOAP_MESSAGE(fdebug, "End of receive message ok\n")); #ifdef WITH_ZLIB if (soap->mode & SOAP_ENC_ZLIB) { /* Make sure end of compressed content is reached */ while (soap->d_stream->next_out != Z_NULL) if ((int)soap_get1(soap) == EOF) break; soap->mode &= ~SOAP_ENC_ZLIB; memcpy(soap->buf, soap->z_buf, SOAP_BUFLEN); soap->bufidx = (char*)soap->d_stream->next_in - soap->z_buf; soap->buflen = soap->z_buflen; soap->zlib_state = SOAP_ZLIB_NONE; if (inflateEnd(soap->d_stream) != Z_OK) return soap->error = SOAP_ZLIB_ERROR; DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Inflate end ok\n")); #ifdef WITH_GZIP if (soap->zlib_in == SOAP_ZLIB_GZIP) { soap_wchar c; short i; DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Inflate gzip crc check\n")); for (i = 0; i < 8; i++) { if ((int)(c = soap_get1(soap)) == EOF) { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Gzip error: unable to read crc value\n")); return soap->error = SOAP_ZLIB_ERROR; } soap->z_buf[i] = (char)c; } if (soap->z_crc != ((uLong)(unsigned char)soap->z_buf[0] | ((uLong)(unsigned char)soap->z_buf[1] << 8) | ((uLong)(unsigned char)soap->z_buf[2] << 16) | ((uLong)(unsigned char)soap->z_buf[3] << 24))) { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Gzip inflate error: crc check failed, message corrupted? (crc32=%lu)\n", (unsigned long)soap->z_crc)); return soap->error = SOAP_ZLIB_ERROR; } if (soap->d_stream->total_out != ((uLong)(unsigned char)soap->z_buf[4] | ((uLong)(unsigned char)soap->z_buf[5] << 8) | ((uLong)(unsigned char)soap->z_buf[6] << 16) | ((uLong)(unsigned char)soap->z_buf[7] << 24))) { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Gzip inflate error: incorrect message length\n")); return soap->error = SOAP_ZLIB_ERROR; } } soap->zlib_in = SOAP_ZLIB_NONE; #endif } #endif if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK) while (soap->ahead != EOF && !soap_recv_raw(soap)) ; #ifndef WITH_NOIDREF if (soap_resolve(soap)) return soap->error; #endif #ifndef WITH_LEANER if (soap->xlist) { if (soap->mode & SOAP_ENC_MTOM) return soap->error = SOAP_MIME_HREF; return soap->error = SOAP_DIME_HREF; } #endif soap_free_ns(soap); #ifndef WITH_LEANER if (soap->fpreparefinalrecv) return soap->error = soap->fpreparefinalrecv(soap); #endif return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_free_temp(struct soap *soap) { register struct soap_attribute *tp, *tq; register struct Namespace *ns; soap_free_ns(soap); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free any remaining temp blocks\n")); while (soap->blist) soap_end_block(soap, NULL); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free attribute storage\n")); for (tp = soap->attributes; tp; tp = tq) { tq = tp->next; if (tp->value) SOAP_FREE(soap, tp->value); SOAP_FREE(soap, tp); } soap->attributes = NULL; #ifdef WITH_FAST if (soap->labbuf) SOAP_FREE(soap, soap->labbuf); soap->labbuf = NULL; soap->lablen = 0; soap->labidx = 0; #endif ns = soap->local_namespaces; if (ns) { for (; ns->id; ns++) { if (ns->out) { if (soap->encodingStyle == ns->out) soap->encodingStyle = SOAP_STR_EOS; SOAP_FREE(soap, ns->out); ns->out = NULL; } if (soap->encodingStyle == ns->ns) soap->encodingStyle = SOAP_STR_EOS; } SOAP_FREE(soap, soap->local_namespaces); soap->local_namespaces = NULL; } #ifndef WITH_LEANER while (soap->xlist) { struct soap_xlist *xp = soap->xlist->next; SOAP_FREE(soap, soap->xlist); soap->xlist = xp; } #endif #ifndef WITH_NOIDREF soap_free_pht(soap); soap_free_iht(soap); #endif } #endif /******************************************************************************/ #ifndef PALM_1 static void soap_free_ns(struct soap *soap) { register struct soap_nlist *np, *nq; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free namespace stack\n")); for (np = soap->nlist; np; np = nq) { nq = np->next; SOAP_FREE(soap, np); } soap->nlist = NULL; } #endif /******************************************************************************/ #ifndef PALM_1 #if !defined(WITH_LEAN) || defined(SOAP_DEBUG) static void soap_init_logs(struct soap *soap) { int i; for (i = 0; i < SOAP_MAXLOGS; i++) { soap->logfile[i] = NULL; soap->fdebug[i] = NULL; } } #endif #endif /******************************************************************************/ #if !defined(WITH_LEAN) || defined(SOAP_DEBUG) SOAP_FMAC1 void SOAP_FMAC2 soap_open_logfile(struct soap *soap, int i) { if (soap->logfile[i]) soap->fdebug[i] = fopen(soap->logfile[i], i < 2 ? "ab" : "a"); } #endif /******************************************************************************/ #ifdef SOAP_DEBUG static void soap_close_logfile(struct soap *soap, int i) { if (soap->fdebug[i]) { fclose(soap->fdebug[i]); soap->fdebug[i] = NULL; } } #endif /******************************************************************************/ #ifdef SOAP_DEBUG SOAP_FMAC1 void SOAP_FMAC2 soap_close_logfiles(struct soap *soap) { int i; for (i = 0; i < SOAP_MAXLOGS; i++) soap_close_logfile(soap, i); } #endif /******************************************************************************/ #ifdef SOAP_DEBUG static void soap_set_logfile(struct soap *soap, int i, const char *logfile) { const char *s; char *t = NULL; soap_close_logfile(soap, i); s = soap->logfile[i]; soap->logfile[i] = logfile; if (s) SOAP_FREE(soap, (void*)s); if (logfile) if ((t = (char*)SOAP_MALLOC(soap, strlen(logfile) + 1))) strcpy(t, logfile); soap->logfile[i] = t; } #endif /******************************************************************************/ #ifdef SOAP_DEBUG SOAP_FMAC1 void SOAP_FMAC2 soap_set_recv_logfile(struct soap *soap, const char *logfile) { soap_set_logfile(soap, SOAP_INDEX_RECV, logfile); } #endif /******************************************************************************/ #ifdef SOAP_DEBUG SOAP_FMAC1 void SOAP_FMAC2 soap_set_sent_logfile(struct soap *soap, const char *logfile) { soap_set_logfile(soap, SOAP_INDEX_SENT, logfile); } #endif /******************************************************************************/ #ifdef SOAP_DEBUG SOAP_FMAC1 void SOAP_FMAC2 soap_set_test_logfile(struct soap *soap, const char *logfile) { soap_set_logfile(soap, SOAP_INDEX_TEST, logfile); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 struct soap* SOAP_FMAC2 soap_copy(const struct soap *soap) { return soap_copy_context((struct soap*)malloc(sizeof(struct soap)), soap); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 struct soap* SOAP_FMAC2 soap_copy_context(struct soap *copy, const struct soap *soap) { if (copy == soap) return copy; if (soap_check_state(soap)) return NULL; if (copy) { register struct soap_plugin *p = NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copying context\n")); #ifdef __cplusplus *copy = *soap; #else memcpy(copy, soap, sizeof(struct soap)); #endif copy->state = SOAP_COPY; copy->error = SOAP_OK; copy->userid = NULL; copy->passwd = NULL; #ifdef WITH_NTLM copy->ntlm_challenge = NULL; #endif copy->nlist = NULL; copy->blist = NULL; copy->clist = NULL; copy->alist = NULL; copy->attributes = NULL; copy->labbuf = NULL; copy->lablen = 0; copy->labidx = 0; #ifdef SOAP_MEM_DEBUG soap_init_mht(copy); #endif #if !defined(WITH_LEAN) || defined(SOAP_DEBUG) soap_init_logs(copy); #endif #ifdef SOAP_DEBUG soap_set_test_logfile(copy, soap->logfile[SOAP_INDEX_TEST]); soap_set_sent_logfile(copy, soap->logfile[SOAP_INDEX_SENT]); soap_set_recv_logfile(copy, soap->logfile[SOAP_INDEX_RECV]); #endif copy->namespaces = NULL; copy->local_namespaces = NULL; if (soap->local_namespaces) soap_set_namespaces(copy, soap->local_namespaces); else soap_set_namespaces(copy, soap->namespaces); #ifdef WITH_C_LOCALE # ifdef WIN32 copy->c_locale = _create_locale(LC_ALL, "C"); # else copy->c_locale = duplocale(soap->c_locale); # endif #else copy->c_locale = NULL; #endif #ifdef WITH_OPENSSL copy->bio = NULL; copy->ssl = NULL; copy->session = NULL; #endif #ifdef WITH_GNUTLS copy->session = NULL; #endif #ifdef WITH_ZLIB copy->d_stream = (z_stream*)SOAP_MALLOC(copy, sizeof(z_stream)); copy->d_stream->zalloc = Z_NULL; copy->d_stream->zfree = Z_NULL; copy->d_stream->opaque = Z_NULL; copy->z_buf = NULL; #endif #ifndef WITH_NOIDREF soap_init_iht(copy); soap_init_pht(copy); #endif copy->header = NULL; copy->fault = NULL; copy->action = NULL; #ifndef WITH_LEAN #ifdef WITH_COOKIES copy->cookies = soap_copy_cookies(copy, soap); #else copy->cookies = NULL; #endif #endif copy->plugins = NULL; for (p = soap->plugins; p; p = p->next) { register struct soap_plugin *q = (struct soap_plugin*)SOAP_MALLOC(copy, sizeof(struct soap_plugin)); if (!q) return NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copying plugin '%s'\n", p->id)); *q = *p; if (p->fcopy && p->fcopy(copy, q, p)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not copy plugin '%s'\n", p->id)); SOAP_FREE(copy, q); return NULL; } q->next = copy->plugins; copy->plugins = q; } } return copy; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_copy_stream(struct soap *copy, struct soap *soap) { struct soap_attribute *tp = NULL, *tq; if (copy == soap) return; copy->mode = soap->mode; copy->imode = soap->imode; copy->omode = soap->omode; copy->socket = soap->socket; copy->recv_timeout = soap->recv_timeout; copy->send_timeout = soap->send_timeout; #if defined(__cplusplus) && !defined(WITH_LEAN) copy->os = soap->os; copy->is = soap->is; #endif copy->sendfd = soap->sendfd; copy->recvfd = soap->recvfd; copy->bufidx = soap->bufidx; copy->buflen = soap->buflen; copy->ahead = soap->ahead; copy->cdata = soap->cdata; copy->chunksize = soap->chunksize; copy->chunkbuflen = soap->chunkbuflen; copy->keep_alive = soap->keep_alive; copy->tcp_keep_alive = soap->tcp_keep_alive; copy->tcp_keep_idle = soap->tcp_keep_idle; copy->tcp_keep_intvl = soap->tcp_keep_intvl; copy->tcp_keep_cnt = soap->tcp_keep_cnt; copy->max_keep_alive = soap->max_keep_alive; #ifndef WITH_NOIO copy->peer = soap->peer; copy->peerlen = soap->peerlen; copy->ip = soap->ip; copy->port = soap->port; memcpy(copy->host, soap->host, sizeof(soap->host)); memcpy(copy->endpoint, soap->endpoint, sizeof(soap->endpoint)); #endif #ifdef WITH_OPENSSL copy->bio = NULL; if (soap->state == SOAP_COPY) copy->ctx = soap->ctx; else copy->ctx = NULL; if (soap->ssl) copy->ssl = SSL_dup(soap->ssl); else copy->ssl = NULL; #endif #ifdef WITH_GNUTLS copy->session = soap->session; /* TODO: Oops, GNUTLS provides a dup? */ #endif #ifdef WITH_ZLIB copy->zlib_state = soap->zlib_state; copy->zlib_in = soap->zlib_in; copy->zlib_out = soap->zlib_out; if (!copy->d_stream) copy->d_stream = (z_stream*)SOAP_MALLOC(copy, sizeof(z_stream)); if (copy->d_stream) memcpy(copy->d_stream, soap->d_stream, sizeof(z_stream)); copy->z_crc = soap->z_crc; copy->z_ratio_in = soap->z_ratio_in; copy->z_ratio_out = soap->z_ratio_out; copy->z_buf = NULL; copy->z_buflen = soap->z_buflen; copy->z_level = soap->z_level; if (soap->z_buf && soap->zlib_state != SOAP_ZLIB_NONE) { copy->z_buf = (char*)SOAP_MALLOC(copy, SOAP_BUFLEN); if (copy->z_buf) memcpy(copy->z_buf, soap->z_buf, SOAP_BUFLEN); } copy->z_dict = soap->z_dict; copy->z_dict_len = soap->z_dict_len; #endif memcpy(copy->buf, soap->buf, sizeof(soap->buf)); /* copy XML parser state */ soap_free_ns(copy); soap_set_local_namespaces(copy); if (soap->nlist && soap->local_namespaces) { register struct soap_nlist *np = NULL, *nq; /* copy reversed nlist */ for (nq = soap->nlist; nq; nq = nq->next) { register struct soap_nlist *nr = np; size_t n = sizeof(struct soap_nlist) + strlen(nq->id); np = (struct soap_nlist*)SOAP_MALLOC(copy, n); if (!np) break; memcpy(np, nq, n); np->next = nr; } while (np) { register const char *s = np->ns; copy->level = np->level; /* preserve element nesting level */ if (!s && np->index >= 0) { s = soap->local_namespaces[np->index].out; if (!s) s = soap->local_namespaces[np->index].ns; } if (s && soap_push_namespace(copy, np->id, s) == NULL) break; nq = np; np = np->next; SOAP_FREE(copy, nq); } } strcpy(copy->id, soap->id); strcpy(copy->href, soap->href); strcpy(copy->type, soap->type); copy->other = soap->other; copy->root = soap->root; copy->null = soap->null; copy->body = soap->body; copy->part = soap->part; copy->mustUnderstand = soap->mustUnderstand; copy->level = soap->level; copy->peeked = soap->peeked; memcpy(copy->tag, soap->tag, sizeof(copy->tag)); /* copy attributes */ for (tq = soap->attributes; tq; tq = tq->next) { struct soap_attribute *tr = tp; size_t n = sizeof(struct soap_attribute) + strlen(tq->name); tp = (struct soap_attribute*)SOAP_MALLOC(copy, n); memcpy(tp, tq, n); if (tp->size) { tp->value = (char*)SOAP_MALLOC(copy, tp->size); if (tp->value) strcpy(tp->value, tq->value); } tp->ns = NULL; tp->next = tr; } copy->attributes = tp; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_free_stream(struct soap *soap) { soap->socket = SOAP_INVALID_SOCKET; #ifdef WITH_OPENSSL soap->bio = NULL; if (soap->ssl) SSL_free(soap->ssl); soap->ssl = NULL; #endif #ifdef WITH_GNUTLS soap->xcred = NULL; soap->acred = NULL; soap->cache = NULL; soap->session = NULL; /* TODO: GNUTLS free here when dupped */ soap->dh_params = NULL; soap->rsa_params = NULL; #endif #ifdef WITH_ZLIB if (soap->z_buf) SOAP_FREE(soap, soap->z_buf); soap->z_buf = NULL; #endif } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_versioning(soap_init)(struct soap *soap, soap_mode imode, soap_mode omode) { size_t i; soap->state = SOAP_INIT; #ifdef SOAP_MEM_DEBUG soap_init_mht(soap); #endif #if !defined(WITH_LEAN) || defined(SOAP_DEBUG) soap_init_logs(soap); #endif #ifdef SOAP_DEBUG #ifdef TANDEM_NONSTOP soap_set_test_logfile(soap, "TESTLOG"); soap_set_sent_logfile(soap, "SENTLOG"); soap_set_recv_logfile(soap, "RECVLOG"); #else soap_set_test_logfile(soap, "TEST.log"); soap_set_sent_logfile(soap, "SENT.log"); soap_set_recv_logfile(soap, "RECV.log"); #endif #endif soap->version = 0; soap_mode(soap, imode); soap_imode(soap, imode); soap_omode(soap, omode); soap->plugins = NULL; soap->user = NULL; for (i = 0; i < sizeof(soap->data)/sizeof(*soap->data); i++) soap->data[i] = NULL; soap->userid = NULL; soap->passwd = NULL; soap->authrealm = NULL; #ifdef WITH_NTLM soap->ntlm_challenge = NULL; #endif #ifndef WITH_NOHTTP soap->fpost = http_post; soap->fget = http_get; soap->fput = http_405; soap->fdel = http_405; soap->fopt = http_200; soap->fhead = http_200; soap->fform = NULL; soap->fposthdr = http_post_header; soap->fresponse = http_response; soap->fparse = http_parse; soap->fparsehdr = http_parse_header; #endif soap->fheader = NULL; soap->fconnect = NULL; soap->fdisconnect = NULL; #ifndef WITH_NOIO soap->ipv6_multicast_if = 0; soap->ipv4_multicast_if = NULL; soap->ipv4_multicast_ttl = 0; /* 0: use default */ #ifndef WITH_IPV6 soap->fresolve = tcp_gethost; #else soap->fresolve = NULL; #endif soap->faccept = tcp_accept; soap->fopen = tcp_connect; soap->fclose = tcp_disconnect; soap->fclosesocket = tcp_closesocket; soap->fshutdownsocket = tcp_shutdownsocket; soap->fsend = fsend; soap->frecv = frecv; soap->fpoll = soap_poll; #else soap->fopen = NULL; soap->fclose = NULL; soap->fpoll = NULL; #endif soap->fseterror = NULL; soap->fignore = NULL; soap->fserveloop = NULL; soap->fplugin = fplugin; soap->fmalloc = NULL; #ifndef WITH_LEANER soap->feltbegin = NULL; soap->feltendin = NULL; soap->feltbegout = NULL; soap->feltendout = NULL; soap->fprepareinitsend = NULL; soap->fprepareinitrecv = NULL; soap->fpreparesend = NULL; soap->fpreparerecv = NULL; soap->fpreparefinalsend = NULL; soap->fpreparefinalrecv = NULL; soap->ffiltersend = NULL; soap->ffilterrecv = NULL; soap->fdimereadopen = NULL; soap->fdimewriteopen = NULL; soap->fdimereadclose = NULL; soap->fdimewriteclose = NULL; soap->fdimeread = NULL; soap->fdimewrite = NULL; soap->fmimereadopen = NULL; soap->fmimewriteopen = NULL; soap->fmimereadclose = NULL; soap->fmimewriteclose = NULL; soap->fmimeread = NULL; soap->fmimewrite = NULL; #endif soap->float_format = "%.9G"; /* Alternative: use "%G" */ soap->double_format = "%.17lG"; /* Alternative: use "%lG" */ soap->dime_id_format = "cid:id%d"; /* default DIME id format */ soap->http_version = "1.1"; soap->proxy_http_version = "1.0"; soap->http_content = NULL; soap->actor = NULL; soap->lang = "en"; soap->keep_alive = 0; soap->tcp_keep_alive = 0; soap->tcp_keep_idle = 0; soap->tcp_keep_intvl = 0; soap->tcp_keep_cnt = 0; soap->max_keep_alive = SOAP_MAXKEEPALIVE; soap->recv_timeout = 0; soap->send_timeout = 0; soap->connect_timeout = 0; soap->accept_timeout = 0; soap->socket_flags = 0; soap->connect_flags = 0; soap->bind_flags = 0; soap->accept_flags = 0; soap->linger_time = 0; soap->ip = 0; soap->labbuf = NULL; soap->lablen = 0; soap->labidx = 0; soap->encodingStyle = SOAP_STR_EOS; #ifndef WITH_NONAMESPACES soap->namespaces = namespaces; #else soap->namespaces = NULL; #endif soap->local_namespaces = NULL; soap->nlist = NULL; soap->blist = NULL; soap->clist = NULL; soap->alist = NULL; soap->attributes = NULL; soap->header = NULL; soap->fault = NULL; soap->master = SOAP_INVALID_SOCKET; soap->socket = SOAP_INVALID_SOCKET; soap->os = NULL; soap->is = NULL; #ifndef WITH_LEANER soap->dom = NULL; soap->dime.list = NULL; soap->dime.first = NULL; soap->dime.last = NULL; soap->mime.list = NULL; soap->mime.first = NULL; soap->mime.last = NULL; soap->mime.boundary = NULL; soap->mime.start = NULL; soap->xlist = NULL; #endif #ifndef UNDER_CE soap->recvfd = 0; soap->sendfd = 1; #else soap->recvfd = stdin; soap->sendfd = stdout; #endif soap->host[0] = '\0'; soap->port = 0; soap->action = NULL; soap->proxy_host = NULL; soap->proxy_port = 8080; soap->proxy_userid = NULL; soap->proxy_passwd = NULL; soap->prolog = NULL; #ifdef WITH_ZLIB soap->zlib_state = SOAP_ZLIB_NONE; soap->zlib_in = SOAP_ZLIB_NONE; soap->zlib_out = SOAP_ZLIB_NONE; soap->d_stream = (z_stream*)SOAP_MALLOC(soap, sizeof(z_stream)); soap->d_stream->zalloc = Z_NULL; soap->d_stream->zfree = Z_NULL; soap->d_stream->opaque = Z_NULL; soap->z_buf = NULL; soap->z_level = 6; soap->z_dict = NULL; soap->z_dict_len = 0; #endif #ifndef WITH_LEAN soap->wsuid = NULL; soap->c14nexclude = NULL; soap->cookies = NULL; soap->cookie_domain = NULL; soap->cookie_path = NULL; soap->cookie_max = 32; #endif #ifdef WMW_RPM_IO soap->rpmreqid = NULL; #endif #ifdef PALM palmNetLibOpen(); #endif #ifndef WITH_NOIDREF soap_init_iht(soap); soap_init_pht(soap); #endif #ifdef WITH_OPENSSL if (!soap_ssl_init_done) soap_ssl_init(); soap->fsslauth = ssl_auth_init; soap->fsslverify = ssl_verify_callback; soap->bio = NULL; soap->ssl = NULL; soap->ctx = NULL; soap->session = NULL; soap->ssl_flags = SOAP_SSL_DEFAULT; soap->keyfile = NULL; soap->password = NULL; soap->cafile = NULL; soap->capath = NULL; soap->crlfile = NULL; soap->dhfile = NULL; soap->randfile = NULL; #endif #ifdef WITH_GNUTLS if (!soap_ssl_init_done) soap_ssl_init(); soap->fsslauth = ssl_auth_init; soap->fsslverify = NULL; soap->xcred = NULL; soap->acred = NULL; soap->cache = NULL; soap->session = NULL; soap->ssl_flags = SOAP_SSL_DEFAULT; soap->keyfile = NULL; soap->password = NULL; soap->cafile = NULL; soap->capath = NULL; soap->crlfile = NULL; soap->dh_params = NULL; soap->rsa_params = NULL; #endif #ifdef WITH_C_LOCALE # ifdef WIN32 soap->c_locale = _create_locale(LC_ALL, "C"); # else soap->c_locale = newlocale(LC_ALL_MASK, "C", NULL); # endif #else soap->c_locale = NULL; #endif soap->buflen = 0; soap->bufidx = 0; #ifndef WITH_LEANER soap->dime.chunksize = 0; soap->dime.buflen = 0; #endif soap->null = 0; soap->position = 0; soap->encoding = 0; soap->mustUnderstand = 0; soap->ns = 0; soap->part = SOAP_END; soap->event = 0; soap->evlev = 0; soap->alloced = 0; soap->count = 0; soap->length = 0; soap->cdata = 0; soap->peeked = 0; soap->ahead = 0; soap->idnum = 0; soap->level = 0; soap->endpoint[0] = '\0'; soap->error = SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_begin(struct soap *soap) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Reinitializing context\n")); if (!soap->keep_alive) { soap->buflen = 0; soap->bufidx = 0; } soap->keep_alive = (((soap->imode | soap->omode) & SOAP_IO_KEEPALIVE) != 0); soap->null = 0; soap->position = 0; soap->encoding = 0; soap->mustUnderstand = 0; soap->mode = 0; soap->ns = 0; soap->part = SOAP_END; soap->event = 0; soap->evlev = 0; soap->alloced = 0; soap->count = 0; soap->length = 0; soap->cdata = 0; soap->error = SOAP_OK; soap->peeked = 0; soap->ahead = 0; soap->idnum = 0; soap->level = 0; soap->endpoint[0] = '\0'; #ifndef WITH_LEANER soap->dime.chunksize = 0; soap->dime.buflen = 0; #endif soap_free_temp(soap); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_end(struct soap *soap) { if (soap_check_state(soap)) return; soap_free_temp(soap); soap_dealloc(soap, NULL); while (soap->clist) { register struct soap_clist *cp = soap->clist->next; SOAP_FREE(soap, soap->clist); soap->clist = cp; } soap_closesock(soap); #ifdef SOAP_DEBUG soap_close_logfiles(soap); #endif #ifdef PALM palmNetLibClose(); #endif } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_set_namespaces(struct soap *soap, const struct Namespace *p) { register struct Namespace *ns = soap->local_namespaces; register struct soap_nlist *np, *nq, *nr; register unsigned int level = soap->level; soap->namespaces = p; soap->local_namespaces = NULL; soap_set_local_namespaces(soap); /* reverse the namespace list */ np = soap->nlist; soap->nlist = NULL; if (np) { nq = np->next; np->next = NULL; while (nq) { nr = nq->next; nq->next = np; np = nq; nq = nr; } } /* then push on new stack */ while (np) { register const char *s; soap->level = np->level; /* preserve element nesting level */ s = np->ns; if (!s && np->index >= 0 && ns) { s = ns[np->index].out; if (!s) s = ns[np->index].ns; } if (s && soap_push_namespace(soap, np->id, s) == NULL) return soap->error; nq = np; np = np->next; SOAP_FREE(soap, nq); } if (ns) { register int i; for (i = 0; ns[i].id; i++) { if (ns[i].out) { SOAP_FREE(soap, ns[i].out); ns[i].out = NULL; } } SOAP_FREE(soap, ns); } soap->level = level; /* restore level */ return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_set_local_namespaces(struct soap *soap) { if (soap->namespaces && !soap->local_namespaces) { register const struct Namespace *ns1; register struct Namespace *ns2; register size_t n = 1; for (ns1 = soap->namespaces; ns1->id; ns1++) n++; n *= sizeof(struct Namespace); ns2 = (struct Namespace*)SOAP_MALLOC(soap, n); if (ns2) { memcpy(ns2, soap->namespaces, n); if (ns2[0].ns) { if (!strcmp(ns2[0].ns, soap_env1)) soap->version = 1; else soap->version = 2; } soap->local_namespaces = ns2; for (; ns2->id; ns2++) ns2->out = NULL; } } } #endif /******************************************************************************/ #ifndef WITH_LEAN #ifndef PALM_1 SOAP_FMAC1 const char * SOAP_FMAC2 soap_tagsearch(const char *big, const char *little) { if (little) { register size_t n = strlen(little); register const char *s = big; while (s) { register const char *t = s; register size_t i; for (i = 0; i < n; i++, t++) { if (*t != little[i]) break; } if (*t == '\0' || *t == ' ') { if (i == n || (i && little[i-1] == ':')) return s; } s = strchr(t, ' '); if (s) s++; } } return NULL; } #endif #endif /******************************************************************************/ #ifndef WITH_LEAN #ifndef PALM_1 SOAP_FMAC1 struct soap_nlist * SOAP_FMAC2 soap_lookup_ns(struct soap *soap, const char *tag, size_t n) { register struct soap_nlist *np; for (np = soap->nlist; np; np = np->next) { if (!strncmp(np->id, tag, n) && !np->id[n]) return np; } return NULL; } #endif #endif /******************************************************************************/ #ifndef WITH_LEAN static struct soap_nlist * soap_push_ns(struct soap *soap, const char *id, const char *ns, short utilized) { register struct soap_nlist *np; size_t n, k; if (soap_tagsearch(soap->c14nexclude, id)) return NULL; if (!utilized) { for (np = soap->nlist; np; np = np->next) { if (!strcmp(np->id, id) && (!np->ns || !strcmp(np->ns, ns))) break; } if (np) { if ((np->level < soap->level || !np->ns) && np->index == 1) utilized = 1; else return NULL; } } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Adding namespace binding (level=%u) '%s' '%s' utilized=%d\n", soap->level, id, ns ? ns : "(null)", utilized)); n = strlen(id); if (ns) k = strlen(ns); else k = 0; np = (struct soap_nlist*)SOAP_MALLOC(soap, sizeof(struct soap_nlist) + n + k + 1); if (!np) { soap->error = SOAP_EOM; return NULL; } np->next = soap->nlist; soap->nlist = np; strcpy((char*)np->id, id); if (ns) np->ns = strcpy((char*)np->id + n + 1, ns); else np->ns = NULL; np->level = soap->level; np->index = utilized; return np; } #endif /******************************************************************************/ #ifndef WITH_LEAN static void soap_utilize_ns(struct soap *soap, const char *tag) { register struct soap_nlist *np; size_t n = 0; const char *t = strchr(tag, ':'); if (t) n = t - tag; np = soap_lookup_ns(soap, tag, n); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Utilizing namespace of '%s'\n", tag)); if (np) { if (np->index == 0) soap_push_ns(soap, np->id, np->ns, 1); } else if (strncmp(tag, "xml", 3)) { strncpy(soap->tmpbuf, tag, n); soap->tmpbuf[n] = '\0'; soap_push_ns(soap, soap->tmpbuf, NULL, 1); } } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_element(struct soap *soap, const char *tag, int id, const char *type) { #ifndef WITH_LEAN register const char *s; #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element begin tag='%s' level='%u' id='%d' type='%s'\n", tag, soap->level, id, type ? type : SOAP_STR_EOS)); soap->level++; #ifdef WITH_DOM #ifndef WITH_LEAN if (soap->wsuid && soap_tagsearch(soap->wsuid, tag)) { size_t i; for (s = tag, i = 0; *s && i < sizeof(soap->tag) - 1; s++, i++) soap->tag[i] = *s == ':' ? '-' : *s; soap->tag[i] = '\0'; if (soap_set_attr(soap, "wsu:Id", soap->tag, 1)) return soap->error; } if ((soap->mode & SOAP_XML_CANONICAL) && !(soap->mode & SOAP_DOM_ASIS)) { if (soap->evlev >= soap->level) soap->evlev = 0; if (soap->event == SOAP_SEC_BEGIN && !soap->evlev) { register struct soap_nlist *np; /* non-nested wsu:Id found: clear xmlns, re-emit them for exc-c14n */ for (np = soap->nlist; np; np = np->next) { if (np->index == 2) { struct soap_nlist *np1 = soap_push_ns(soap, np->id, np->ns, 1); if (np1) np1->index = 0; } } soap->evlev = soap->level; } } #endif if (soap->mode & SOAP_XML_DOM) { register struct soap_dom_element *elt = (struct soap_dom_element*)soap_malloc(soap, sizeof(struct soap_dom_element)); if (!elt) return soap->error; elt->soap = soap; elt->next = NULL; elt->prnt = soap->dom; elt->name = soap_strdup(soap, tag); elt->elts = NULL; elt->atts = NULL; elt->nstr = NULL; elt->data = NULL; elt->wide = NULL; elt->node = NULL; elt->type = 0; elt->head = NULL; elt->tail = NULL; if (soap->dom) { struct soap_dom_element *p = soap->dom->elts; if (p) { while (p->next) p = p->next; p->next = elt; } else soap->dom->elts = elt; } soap->dom = elt; } else { #endif #ifndef WITH_LEAN if (!soap->ns) { if (!(soap->mode & SOAP_XML_CANONICAL) && soap_send(soap, soap->prolog ? soap->prolog : "\n")) return soap->error; } else if (soap->mode & SOAP_XML_INDENT) { if (soap->ns == 1 && soap_send_raw(soap, soap_indent, soap->level < sizeof(soap_indent) ? soap->level : sizeof(soap_indent) - 1)) return soap->error; soap->body = 1; } if ((soap->mode & SOAP_XML_DEFAULTNS) && (s = strchr(tag, ':'))) { struct Namespace *ns = soap->local_namespaces; size_t n = s - tag; if (soap_send_raw(soap, "<", 1) || soap_send(soap, s + 1)) return soap->error; if (soap->nlist && !strncmp(soap->nlist->id, tag, n) && !soap->nlist->id[n]) ns = NULL; for (; ns && ns->id; ns++) { if (*ns->id && (ns->out || ns->ns) && !strncmp(ns->id, tag, n) && !ns->id[n]) { soap_push_ns(soap, ns->id, ns->out ? ns->out : ns->ns, 0); if (soap_attribute(soap, "xmlns", ns->out ? ns->out : ns->ns)) return soap->error; break; } } } else #endif if (soap_send_raw(soap, "<", 1) || soap_send(soap, tag)) return soap->error; #ifdef WITH_DOM } #endif if (!soap->ns) { struct Namespace *ns; int k = -1; #ifndef WITH_LEAN if ((soap->mode & SOAP_XML_DEFAULTNS)) k = 4; /* only produce the first four required entries */ #endif for (ns = soap->local_namespaces; ns && ns->id && k; ns++, k--) { if (*ns->id && (ns->out || ns->ns)) { sprintf(soap->tmpbuf, "xmlns:%s", ns->id); if (soap_attribute(soap, soap->tmpbuf, ns->out ? ns->out : ns->ns)) return soap->error; } } } soap->ns = 1; /* namespace table control: ns = 0 or 2 to start, then 1 to stop dumping the table */ #ifndef WITH_LEAN if (soap->mode & SOAP_XML_CANONICAL) soap_utilize_ns(soap, tag); #endif if (id > 0) { sprintf(soap->tmpbuf, "_%d", id); if (soap_attribute(soap, "id", soap->tmpbuf)) return soap->error; } if (type && *type && !(soap->mode & SOAP_XML_NOTYPE) && soap->part != SOAP_IN_HEADER) { const char *t = type; #ifndef WITH_LEAN if (soap->mode & SOAP_XML_DEFAULTNS) { t = strchr(type, ':'); if (t) t++; else t = type; } #endif if (soap->attributes ? soap_set_attr(soap, "xsi:type", t, 1) : soap_attribute(soap, "xsi:type", t)) return soap->error; #ifndef WITH_LEAN if (soap->mode & SOAP_XML_CANONICAL) soap_utilize_ns(soap, type); #endif } if (soap->null && soap->position > 0) { register int i; sprintf(soap->tmpbuf, "[%d", soap->positions[0]); for (i = 1; i < soap->position; i++) sprintf(soap->tmpbuf + strlen(soap->tmpbuf), ",%d", soap->positions[i]); strcat(soap->tmpbuf, "]"); if (soap_attribute(soap, "SOAP-ENC:position", soap->tmpbuf)) return soap->error; } if (soap->mustUnderstand) { if (soap->actor && *soap->actor) { if (soap_attribute(soap, soap->version == 2 ? "SOAP-ENV:role" : "SOAP-ENV:actor", soap->actor)) return soap->error; } if (soap_attribute(soap, "SOAP-ENV:mustUnderstand", soap->version == 2 ? "true" : "1")) return soap->error; soap->mustUnderstand = 0; } if (soap->encoding) { if (soap->encodingStyle && soap->local_namespaces) { if (!*soap->encodingStyle) { if (soap->local_namespaces[1].out) soap->encodingStyle = soap->local_namespaces[1].out; else soap->encodingStyle = soap->local_namespaces[1].ns; } if (soap->encodingStyle && soap_attribute(soap, "SOAP-ENV:encodingStyle", soap->encodingStyle)) return soap->error; } soap->encoding = 0; } soap->null = 0; soap->position = 0; if (soap->event == SOAP_SEC_BEGIN) soap->event = 0; return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_element_begin_out(struct soap *soap, const char *tag, int id, const char *type) { if (*tag == '-') return SOAP_OK; if (soap_element(soap, tag, id, type)) return soap->error; #ifdef WITH_DOM if (soap_element_start_end_out(soap, NULL)) return soap->error; if (soap->feltbegout) return soap->error = soap->feltbegout(soap, tag); return SOAP_OK; #else return soap_element_start_end_out(soap, NULL); #endif } #endif /******************************************************************************/ #ifndef PALM_2 #ifndef HAVE_STRRCHR SOAP_FMAC1 char* SOAP_FMAC2 soap_strrchr(const char *s, int t) { register char *r = NULL; while (*s) if (*s++ == t) r = (char*)s - 1; return r; } #endif #endif /******************************************************************************/ #ifndef PALM_2 #ifndef HAVE_STRTOL SOAP_FMAC1 long SOAP_FMAC2 soap_strtol(const char *s, char **t, int b) { register long n = 0; register int c; while (*s > 0 && *s <= 32) s++; if (b == 10) { short neg = 0; if (*s == '-') { s++; neg = 1; } else if (*s == '+') s++; while ((c = *s) && c >= '0' && c <= '9') { if (n >= 214748364 && (n > 214748364 || c >= '8')) break; n *= 10; n += c - '0'; s++; } if (neg) n = -n; } else /* assume b == 16 and value is always positive */ { while ((c = *s)) { if (c >= '0' && c <= '9') c -= '0'; else if (c >= 'A' && c <= 'F') c -= 'A' - 10; else if (c >= 'a' && c <= 'f') c -= 'a' - 10; if (n > 0x07FFFFFF) break; n <<= 4; n += c; s++; } } if (t) *t = (char*)s; return n; } #endif #endif /******************************************************************************/ #ifndef PALM_2 #ifndef HAVE_STRTOUL SOAP_FMAC1 unsigned long SOAP_FMAC2 soap_strtoul(const char *s, char **t, int b) { unsigned long n = 0; register int c; while (*s > 0 && *s <= 32) s++; if (b == 10) { if (*s == '+') s++; while ((c = *s) && c >= '0' && c <= '9') { if (n >= 429496729 && (n > 429496729 || c >= '6')) break; n *= 10; n += c - '0'; s++; } } else /* b == 16 */ { while ((c = *s)) { if (c >= '0' && c <= '9') c -= '0'; else if (c >= 'A' && c <= 'F') c -= 'A' - 10; else if (c >= 'a' && c <= 'f') c -= 'a' - 10; if (n > 0x0FFFFFFF) break; n <<= 4; n += c; s++; } } if (t) *t = (char*)s; return n; } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_array_begin_out(struct soap *soap, const char *tag, int id, const char *type, const char *offset) { if (!type || !*type) return soap_element_begin_out(soap, tag, id, NULL); if (soap_element(soap, tag, id, "SOAP-ENC:Array")) return soap->error; if (soap->version == 2) { const char *s; s = soap_strrchr(type, '['); if ((size_t)(s - type) < sizeof(soap->tmpbuf)) { strncpy(soap->tmpbuf, type, s - type); soap->tmpbuf[s - type] = '\0'; if (soap_attribute(soap, "SOAP-ENC:itemType", soap->tmpbuf)) return soap->error; if (s && (soap_attribute(soap, "SOAP-ENC:arraySize", s + 1))) return soap->error; } } else { if (offset && soap_attribute(soap, "SOAP-ENC:offset", offset)) return soap->error; if (soap_attribute(soap, "SOAP-ENC:arrayType", type)) return soap->error; } #ifndef WITH_LEAN if ((soap->mode & SOAP_XML_CANONICAL)) soap_utilize_ns(soap, type); #endif return soap_element_start_end_out(soap, NULL); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_element_start_end_out(struct soap *soap, const char *tag) { register struct soap_attribute *tp; #ifndef WITH_LEAN if (soap->mode & SOAP_XML_CANONICAL) { struct soap_nlist *np; for (tp = soap->attributes; tp; tp = tp->next) { if (tp->visible && tp->name) soap_utilize_ns(soap, tp->name); } for (np = soap->nlist; np; np = np->next) { if (np->index == 1 && np->ns) { sprintf(soap->tmpbuf, *(np->id) ? "xmlns:%s" : "xmlns", np->id); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Enabling utilized binding (level=%u) %s='%s'\n", np->level, soap->tmpbuf, np->ns)); soap_set_attr(soap, soap->tmpbuf, np->ns, 1); np->index = 2; } } } #endif #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { register struct soap_dom_attribute **att; att = &soap->dom->atts; for (tp = soap->attributes; tp; tp = tp->next) { if (tp->visible) { *att = (struct soap_dom_attribute*)soap_malloc(soap, sizeof(struct soap_dom_attribute)); if (!*att) return soap->error; (*att)->next = NULL; (*att)->nstr = NULL; (*att)->name = soap_strdup(soap, tp->name); (*att)->data = soap_strdup(soap, tp->value); (*att)->wide = NULL; (*att)->soap = soap; att = &(*att)->next; tp->visible = 0; } } return SOAP_OK; } #endif for (tp = soap->attributes; tp; tp = tp->next) { if (tp->visible) { #ifndef WITH_LEAN const char *s; if ((soap->mode & SOAP_XML_DEFAULTNS) && (s = strchr(tp->name, ':'))) { size_t n = s - tp->name; if (soap->nlist && !strncmp(soap->nlist->id, tp->name, n) && !soap->nlist->id[n]) s++; else s = tp->name; if (soap_send(soap, " ") || soap_send(soap, s)) return soap->error; } else #endif if (soap_send(soap, " ") || soap_send(soap, tp->name)) return soap->error; if (tp->visible == 2 && tp->value) if (soap_send_raw(soap, "=\"", 2) || soap_string_out(soap, tp->value, tp->flag) || soap_send_raw(soap, "\"", 1)) return soap->error; tp->visible = 0; } } if (tag) { #ifndef WITH_LEAN if (soap->mode & SOAP_XML_CANONICAL) { if (soap_send_raw(soap, ">", 1) || soap_element_end_out(soap, tag)) return soap->error; return SOAP_OK; } #endif soap->level--; /* decrement level just before /> */ return soap_send_raw(soap, "/>", 2); } return soap_send_raw(soap, ">", 1); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_element_end_out(struct soap *soap, const char *tag) { #ifndef WITH_LEAN const char *s; #endif if (*tag == '-') return SOAP_OK; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element ending tag='%s'\n", tag)); #ifdef WITH_DOM if (soap->feltendout && (soap->error = soap->feltendout(soap, tag))) return soap->error; if ((soap->mode & SOAP_XML_DOM) && soap->dom) { if (soap->dom->prnt) soap->dom = soap->dom->prnt; return SOAP_OK; } #endif #ifndef WITH_LEAN if (soap->mode & SOAP_XML_CANONICAL) soap_pop_namespace(soap); if (soap->mode & SOAP_XML_INDENT) { if (!soap->body) { if (soap_send_raw(soap, soap_indent, soap->level < sizeof(soap_indent) ? soap->level : sizeof(soap_indent) - 1)) return soap->error; } soap->body = 0; } if ((soap->mode & SOAP_XML_DEFAULTNS) && (s = strchr(tag, ':'))) { soap_pop_namespace(soap); tag = s + 1; } #endif if (soap_send_raw(soap, "error; soap->level--; /* decrement level just before > */ return soap_send_raw(soap, ">", 1); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_element_ref(struct soap *soap, const char *tag, int id, int href) { register int n = 0; const char *s = "href"; if (soap->version == 2) { s = "SOAP-ENC:ref"; n = 1; } sprintf(soap->href, "#_%d", href); return soap_element_href(soap, tag, id, s, soap->href + n); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_element_href(struct soap *soap, const char *tag, int id, const char *ref, const char *val) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element '%s' reference %s='%s'\n", tag, ref, val)); if (soap_element(soap, tag, id, NULL) || soap_attribute(soap, ref, val) || soap_element_start_end_out(soap, tag)) return soap->error; return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_element_null(struct soap *soap, const char *tag, int id, const char *type) { struct soap_attribute *tp = NULL; for (tp = soap->attributes; tp; tp = tp->next) if (tp->visible) break; if (tp || (soap->version == 2 && soap->position > 0) || id > 0 || (soap->mode & SOAP_XML_NIL)) { if (soap_element(soap, tag, id, type) || (!tp && soap_attribute(soap, "xsi:nil", "true"))) return soap->error; return soap_element_start_end_out(soap, tag); } soap->null = 1; soap->position = 0; soap->mustUnderstand = 0; return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_element_nil(struct soap *soap, const char *tag) { if (soap_element(soap, tag, -1, NULL) || soap_attribute(soap, "xsi:nil", "true")) return soap->error; return soap_element_start_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_element_id(struct soap *soap, const char *tag, int id, const void *p, const struct soap_array *a, int n, const char *type, int t) { if (!p) { soap_element_null(soap, tag, id, type); return -1; } #ifndef WITH_NOIDREF if (soap->mode & SOAP_XML_TREE) return 0; if (id < 0) { struct soap_plist *pp; if (a) id = soap_array_pointer_lookup(soap, p, a, n, t, &pp); else id = soap_pointer_lookup(soap, p, t, &pp); if (id) { if (soap_is_embedded(soap, pp)) { soap_element_ref(soap, tag, 0, id); return -1; } if (soap_is_single(soap, pp)) return 0; soap_set_embedded(soap, pp); } } return id; #else return 0; #endif } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_element_result(struct soap *soap, const char *tag) { if (soap->version == 2 && soap->encodingStyle) { if (soap_element(soap, "SOAP-RPC:result", 0, NULL) || soap_attribute(soap, "xmlns:SOAP-RPC", soap_rpc) || soap_element_start_end_out(soap, NULL) || soap_string_out(soap, tag, 0) || soap_element_end_out(soap, "SOAP-RPC:result")) return soap->error; } return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_check_result(struct soap *soap, const char *tag) { if (soap->version == 2 && soap->encodingStyle) { soap_instring(soap, ":result", NULL, NULL, 0, 2, -1, -1); /* just ignore content for compliance reasons, but should compare tag to element's QName value? */ } (void)tag; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_attribute(struct soap *soap, const char *name, const char *value) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Attribute '%s'='%s'\n", name, value)); #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && !(soap->mode & SOAP_XML_CANONICAL) && soap->dom) { register struct soap_dom_attribute *a = (struct soap_dom_attribute*)soap_malloc(soap, sizeof(struct soap_dom_attribute)); if (!a) return soap->error; a->next = soap->dom->atts; a->nstr = NULL; a->name = soap_strdup(soap, name); a->data = soap_strdup(soap, value); a->wide = NULL; a->soap = soap; soap->dom->atts = a; return SOAP_OK; } #endif #ifndef WITH_LEAN if (soap->mode & SOAP_XML_CANONICAL) { /* push namespace */ if (!strncmp(name, "xmlns", 5) && (name[5] == ':' || name[5] == '\0')) soap_push_ns(soap, name + 5 + (name[5] == ':'), value, 0); else if (soap_set_attr(soap, name, value, 1)) return soap->error; } else #endif { if (soap_send(soap, " ") || soap_send(soap, name)) return soap->error; if (value) if (soap_send_raw(soap, "=\"", 2) || soap_string_out(soap, value, 1) || soap_send_raw(soap, "\"", 1)) return soap->error; } return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_element_begin_in(struct soap *soap, const char *tag, int nillable, const char *type) { if (!soap_peek_element(soap)) { if (soap->other) return soap->error = SOAP_TAG_MISMATCH; if (tag && *tag == '-') return SOAP_OK; if (!(soap->error = soap_match_tag(soap, soap->tag, tag))) { soap->peeked = 0; if (type && *soap->type && soap_match_tag(soap, soap->type, type)) return soap->error = SOAP_TYPE; if (!nillable && soap->null && (soap->mode & SOAP_XML_STRICT)) return soap->error = SOAP_NULL; if (soap->body) soap->level++; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Begin element found (level=%u) '%s'='%s'\n", soap->level, soap->tag, tag ? tag : SOAP_STR_EOS )); } } else if (soap->error == SOAP_NO_TAG && tag && *tag == '-') soap->error = SOAP_OK; return soap->error; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_element_end_in(struct soap *soap, const char *tag) { register soap_wchar c; register char *s; register int n = 0; if (tag && *tag == '-') return SOAP_OK; if (soap->error == SOAP_NO_TAG) soap->error = SOAP_OK; #ifdef WITH_DOM /* this whitespace or mixed content is significant for DOM */ if ((soap->mode & SOAP_XML_DOM) && soap->dom) { if (!soap->peeked && !soap_string_in(soap, 3, -1, -1)) return soap->error; if (soap->dom->prnt) soap->dom = soap->dom->prnt; } #endif if (soap->peeked) { if (*soap->tag) n++; soap->peeked = 0; } do { while (((c = soap_get(soap)) != SOAP_TT)) { if ((int)c == EOF) return soap->error = SOAP_CHK_EOF; if (c == SOAP_LT) n++; else if (c == '/') { c = soap_get(soap); if (c == SOAP_GT) n--; else soap_unget(soap, c); } } } while (n--); s = soap->tag; n = sizeof(soap->tag); while (soap_notblank(c = soap_get(soap))) { if (--n > 0) *s++ = (char)c; } *s = '\0'; if ((int)c == EOF) return soap->error = SOAP_CHK_EOF; while (soap_blank(c)) c = soap_get(soap); if (c != SOAP_GT) return soap->error = SOAP_SYNTAX_ERROR; #ifndef WITH_LEAN #ifdef WITH_DOM if (soap->feltendin) { soap->level--; return soap->error = soap->feltendin(soap, soap->tag, tag); } #endif if (tag && (soap->mode & SOAP_XML_STRICT)) { soap_pop_namespace(soap); if (soap_match_tag(soap, soap->tag, tag)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End element tag '%s' does not match '%s'\n", soap->tag, tag ? tag : SOAP_STR_EOS)); return soap->error = SOAP_SYNTAX_ERROR; } } #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End element found (level=%u) '%s'='%s'\n", soap->level, soap->tag, tag ? tag : SOAP_STR_EOS)); soap->level--; return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char * SOAP_FMAC2 soap_attr_value(struct soap *soap, const char *name, int flag) { register struct soap_attribute *tp; if (*name == '-') return SOAP_STR_EOS; for (tp = soap->attributes; tp; tp = tp->next) { if (tp->visible && !soap_match_tag(soap, tp->name, name)) break; } if (tp) { if (flag == 2 && (soap->mode & SOAP_XML_STRICT)) soap->error = SOAP_PROHIBITED; else return tp->value; } else if (flag == 1 && (soap->mode & SOAP_XML_STRICT)) soap->error = SOAP_REQUIRED; else soap->error = SOAP_OK; return NULL; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_set_attr(struct soap *soap, const char *name, const char *value, int flag) { register struct soap_attribute *tp; if (*name == '-') return SOAP_OK; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Set attribute %s='%s'\n", name, value ? value : SOAP_STR_EOS)); for (tp = soap->attributes; tp; tp = tp->next) { if (!strcmp(tp->name, name)) break; } if (!tp) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Allocate attribute %s\n", name)); if (!(tp = (struct soap_attribute*)SOAP_MALLOC(soap, sizeof(struct soap_attribute) + strlen(name)))) return soap->error = SOAP_EOM; tp->ns = NULL; #ifndef WITH_LEAN if ((soap->mode & SOAP_XML_CANONICAL)) { struct soap_attribute **tpp = &soap->attributes; const char *s = strchr(name, ':'); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inserting attribute %s for c14n\n", name)) if (!strncmp(name, "xmlns", 5)) { for (; *tpp; tpp = &(*tpp)->next) if (strncmp((*tpp)->name, "xmlns", 5) || strcmp((*tpp)->name + 5, name + 5) > 0) break; } else if (!s) { for (; *tpp; tpp = &(*tpp)->next) if (strncmp((*tpp)->name, "xmlns", 5) && ((*tpp)->ns || strcmp((*tpp)->name, name) > 0)) break; } else { struct soap_nlist *np = soap_lookup_ns(soap, name, s - name); if (np) tp->ns = np->ns; else { struct soap_attribute *tq; for (tq = soap->attributes; tq; tq = tq->next) { if (!strncmp(tq->name, "xmlns:", 6) && !strncmp(tq->name + 6, name, s - name) && !tq->name[6 + s - name]) { tp->ns = tq->ns; break; } } } for (; *tpp; tpp = &(*tpp)->next) { int k; if (strncmp((*tpp)->name, "xmlns", 5) && (*tpp)->ns && tp->ns && ((k = strcmp((*tpp)->ns, tp->ns)) > 0 || (!k && strcmp((*tpp)->name, name) > 0))) break; } } tp->next = *tpp; *tpp = tp; } else #endif { tp->next = soap->attributes; soap->attributes = tp; } strcpy((char*)tp->name, name); tp->value = NULL; } else if (tp->visible) { return SOAP_OK; } else if (value && tp->value && tp->size <= strlen(value)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free attribute value of %s (free %p)\n", name, tp->value)); SOAP_FREE(soap, tp->value); tp->value = NULL; tp->ns = NULL; } if (value) { if (!tp->value) { tp->size = strlen(value) + 1; if (!(tp->value = (char*)SOAP_MALLOC(soap, tp->size))) return soap->error = SOAP_EOM; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Allocate attribute value for %s (%p)\n", tp->name, tp->value)); } strcpy(tp->value, value); if (!strncmp(tp->name, "xmlns:", 6)) tp->ns = tp->value; tp->visible = 2; tp->flag = (short)flag; #ifndef WITH_LEAN if (!strcmp(name, "wsu:Id")) { soap->event = SOAP_SEC_BEGIN; strncpy(soap->id, value, sizeof(soap->id)); soap->id[sizeof(soap->id)-1] = '\0'; } #endif } else tp->visible = 1; return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_clr_attr(struct soap *soap) { register struct soap_attribute *tp; #ifndef WITH_LEAN if ((soap->mode & SOAP_XML_CANONICAL)) { while (soap->attributes) { tp = soap->attributes->next; if (soap->attributes->value) SOAP_FREE(soap, soap->attributes->value); SOAP_FREE(soap, soap->attributes); soap->attributes = tp; } } else #endif { for (tp = soap->attributes; tp; tp = tp->next) tp->visible = 0; } } #endif /******************************************************************************/ #ifndef PALM_2 static int soap_getattrval(struct soap *soap, char *s, size_t n, soap_wchar d) { register size_t i; for (i = 0; i < n; i++) { register soap_wchar c = soap_get(soap); switch (c) { case SOAP_TT: *s++ = '<'; soap_unget(soap, '/'); break; case SOAP_LT: *s++ = '<'; break; case SOAP_GT: if (d == ' ') { soap_unget(soap, c); *s = '\0'; return SOAP_OK; } *s++ = '>'; break; case SOAP_QT: if (c == d) { *s = '\0'; return SOAP_OK; } *s++ = '"'; break; case SOAP_AP: if (c == d) { *s = '\0'; return SOAP_OK; } *s++ = '\''; break; case '\t': case '\n': case '\r': case ' ': case '/': if (d == ' ') { soap_unget(soap, c); *s = '\0'; return SOAP_OK; } default: if ((int)c == EOF) return soap->error = SOAP_CHK_EOF; *s++ = (char)c; } } return soap->error = SOAP_EOM; } #endif /******************************************************************************/ #ifdef WITH_FAST #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_store_lab(struct soap *soap, const char *s, size_t n) { soap->labidx = 0; return soap_append_lab(soap, s, n); } #endif #endif /******************************************************************************/ #ifdef WITH_FAST #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_append_lab(struct soap *soap, const char *s, size_t n) { if (soap->labidx + n >= soap->lablen) { register char *t = soap->labbuf; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Enlarging look-aside buffer to append data, old size=%lu", (unsigned long)soap->lablen)); if (soap->lablen == 0) soap->lablen = SOAP_LABLEN; while (soap->labidx + n >= soap->lablen) soap->lablen <<= 1; DBGLOG(TEST, SOAP_MESSAGE(fdebug, ", new size=%lu\n", (unsigned long)soap->lablen)); soap->labbuf = (char*)SOAP_MALLOC(soap, soap->lablen); if (!soap->labbuf) { if (t) SOAP_FREE(soap, t); return soap->error = SOAP_EOM; } if (t) { memcpy(soap->labbuf, t, soap->labidx); SOAP_FREE(soap, t); } } if (s) { memcpy(soap->labbuf + soap->labidx, s, n); soap->labidx += n; } return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_peek_element(struct soap *soap) { #ifdef WITH_DOM register struct soap_dom_attribute **att = NULL; register char *lead = NULL; #endif register struct soap_attribute *tp, *tq = NULL; register const char *t; register char *s; register soap_wchar c; register int i; if (soap->peeked) { if (!*soap->tag) return soap->error = SOAP_NO_TAG; return SOAP_OK; } soap->peeked = 1; soap->id[0] = '\0'; soap->href[0] = '\0'; soap->type[0] = '\0'; soap->arrayType[0] = '\0'; soap->arraySize[0] = '\0'; soap->arrayOffset[0] = '\0'; soap->other = 0; soap->root = -1; soap->position = 0; soap->null = 0; soap->mustUnderstand = 0; /* UTF-8 BOM? */ c = soap_getchar(soap); if (c == 0xEF && soap_get0(soap) == 0xBB) { c = soap_get1(soap); if ((c = soap_get1(soap)) == 0xBF) soap->mode &= ~SOAP_ENC_LATIN; else soap_unget(soap, (0x0F << 12) | (0xBB << 6) | (c & 0x3F)); /* UTF-8 */ } else if ((c == 0xFE && soap_get0(soap) == 0xFF) /* UTF-16 BE */ || (c == 0xFF && soap_get0(soap) == 0xFE)) /* UTF-16 LE */ return soap->error = SOAP_UTF_ERROR; else soap_unget(soap, c); c = soap_get(soap); #ifdef WITH_DOM /* whitespace leading to tag is not insignificant for DOM */ if (soap_blank(c)) { soap->labidx = 0; do { if (soap_append_lab(soap, NULL, 0)) return soap->error; s = soap->labbuf + soap->labidx; i = soap->lablen - soap->labidx; soap->labidx = soap->lablen; while (soap_blank(c) && i--) { *s++ = c; c = soap_get(soap); } } while (soap_blank(c)); *s = '\0'; lead = soap->labbuf; } #else /* skip space */ while (soap_blank(c)) c = soap_get(soap); #endif if (c != SOAP_LT) { *soap->tag = '\0'; if ((int)c == EOF) return soap->error = SOAP_CHK_EOF; soap_unget(soap, c > 0 ? c | 0x80000000 : c); #ifdef WITH_DOM /* whitespace leading to end tag is significant for DOM */ if ((soap->mode & SOAP_XML_DOM) && soap->dom) { if (lead && *lead) soap->dom->tail = soap_strdup(soap, lead); else soap->dom->tail = (char*)SOAP_STR_EOS; } #endif return soap->error = SOAP_NO_TAG; } s = soap->tag; do c = soap_get1(soap); while (soap_blank(c)); i = sizeof(soap->tag); while (c != '>' && c != '/' && soap_notblank(c) && (int)c != EOF) { if (--i > 0) *s++ = (char)c; c = soap_get1(soap); } while (soap_blank(c)) c = soap_get1(soap); *s = '\0'; #ifdef WITH_DOM if (soap->mode & SOAP_XML_DOM) { register struct soap_dom_element *elt; elt = (struct soap_dom_element*)soap_malloc(soap, sizeof(struct soap_dom_element)); if (!elt) return soap->error; elt->next = NULL; elt->nstr = NULL; elt->name = soap_strdup(soap, soap->tag); elt->prnt = soap->dom; elt->elts = NULL; elt->atts = NULL; elt->data = NULL; elt->wide = NULL; elt->type = 0; elt->node = NULL; elt->head = soap_strdup(soap, lead); elt->tail = NULL; elt->soap = soap; if (soap->dom) { struct soap_dom_element *p = soap->dom->elts; if (p) { while (p->next) p = p->next; p->next = elt; } else soap->dom->elts = elt; } soap->dom = elt; att = &elt->atts; } #endif soap_pop_namespace(soap); for (tp = soap->attributes; tp; tp = tp->next) tp->visible = 0; while ((int)c != EOF && c != '>' && c != '/') { s = soap->tmpbuf; i = sizeof(soap->tmpbuf); while (c != '=' && c != '>' && c != '/' && soap_notblank(c) && (int)c != EOF) { if (--i > 0) *s++ = (char)c; c = soap_get1(soap); } *s = '\0'; if (i == sizeof(soap->tmpbuf)) return soap->error = SOAP_SYNTAX_ERROR; #ifdef WITH_DOM /* add attribute name to dom */ if (att) { *att = (struct soap_dom_attribute*)soap_malloc(soap, sizeof(struct soap_dom_attribute)); if (!*att) return soap->error; (*att)->next = NULL; (*att)->nstr = NULL; (*att)->name = soap_strdup(soap, soap->tmpbuf); (*att)->data = NULL; (*att)->wide = NULL; (*att)->soap = soap; } #endif if (!strncmp(soap->tmpbuf, "xmlns", 5)) { if (soap->tmpbuf[5] == ':') t = soap->tmpbuf + 6; else if (soap->tmpbuf[5]) t = NULL; else t = SOAP_STR_EOS; } else t = NULL; tq = NULL; for (tp = soap->attributes; tp; tq = tp, tp = tp->next) { if (!SOAP_STRCMP(tp->name, soap->tmpbuf)) break; } if (!tp) { tp = (struct soap_attribute*)SOAP_MALLOC(soap, sizeof(struct soap_attribute) + strlen(soap->tmpbuf)); if (!tp) return soap->error = SOAP_EOM; strcpy((char*)tp->name, soap->tmpbuf); tp->value = NULL; tp->size = 0; tp->ns = NULL; /* if attribute name is qualified, append it to the end of the list */ if (tq && strchr(soap->tmpbuf, ':')) { tq->next = tp; tp->next = NULL; } else { tp->next = soap->attributes; soap->attributes = tp; } } while (soap_blank(c)) c = soap_get1(soap); if (c == '=') { do c = soap_getutf8(soap); while (soap_blank(c)); if (c != SOAP_QT && c != SOAP_AP) { soap_unget(soap, c); c = ' '; /* blank delimiter */ } if (soap_getattrval(soap, tp->value, tp->size, c)) { #ifdef WITH_FAST if (soap->error != SOAP_EOM) return soap->error; soap->error = SOAP_OK; if (soap_store_lab(soap, tp->value, tp->size)) return soap->error; if (tp->value) SOAP_FREE(soap, tp->value); for (;;) { if (soap_getattrval(soap, soap->labbuf + soap->labidx, soap->lablen - soap->labidx, c)) { if (soap->error != SOAP_EOM) return soap->error; soap->error = SOAP_OK; soap->labidx = soap->lablen; if (soap_append_lab(soap, NULL, 0)) return soap->error; } else break; } if (soap->labidx) tp->size = soap->lablen; else { tp->size = strlen(soap->labbuf) + 1; if (tp->size < SOAP_LABLEN) tp->size = SOAP_LABLEN; } if (!(tp->value = (char*)SOAP_MALLOC(soap, tp->size))) return soap->error = SOAP_EOM; strcpy(tp->value, soap->labbuf); #else size_t n; if (soap->error != SOAP_EOM) return soap->error; soap->error = SOAP_OK; if (soap_new_block(soap) == NULL) return soap->error; for (;;) { if (!(s = (char*)soap_push_block(soap, NULL, SOAP_BLKLEN))) return soap->error; if (soap_getattrval(soap, s, SOAP_BLKLEN, c)) { if (soap->error != SOAP_EOM) return soap->error; soap->error = SOAP_OK; } else break; } n = tp->size + soap->blist->size; if (!(s = (char*)SOAP_MALLOC(soap, n))) return soap->error = SOAP_EOM; if (tp->value) { memcpy(s, tp->value, tp->size); SOAP_FREE(soap, tp->value); } soap_save_block(soap, NULL, s + tp->size, 0); tp->value = s; tp->size = n; #endif } do c = soap_get1(soap); while (soap_blank(c)); tp->visible = 2; /* seen this attribute w/ value */ #ifdef WITH_DOM if (att) (*att)->data = soap_strdup(soap, tp->value); #endif } else tp->visible = 1; /* seen this attribute w/o value */ #ifdef WITH_DOM if (att) att = &(*att)->next; #endif if (t && tp->value) { if (soap_push_namespace(soap, t, tp->value) == NULL) return soap->error; } } #ifdef WITH_DOM if (att) { soap->dom->nstr = soap_current_namespace(soap, soap->tag); for (att = &soap->dom->atts; *att; att = &(*att)->next) (*att)->nstr = soap_current_namespace(soap, (*att)->name); } #endif if ((int)c == EOF) return soap->error = SOAP_CHK_EOF; if (!(soap->body = (c != '/'))) do c = soap_get1(soap); while (soap_blank(c)); #ifdef WITH_DOM if (soap->mode & SOAP_XML_DOM) { if (!soap->body && soap->dom->prnt) soap->dom = soap->dom->prnt; } #endif for (tp = soap->attributes; tp; tp = tp->next) { if (tp->visible && tp->value) { #ifndef WITH_NOIDREF if (!strcmp(tp->name, "id")) { if ((soap->version > 0 && !(soap->mode & SOAP_XML_TREE)) || (soap->mode & SOAP_XML_GRAPH)) { *soap->id = '#'; strncpy(soap->id + 1, tp->value, sizeof(soap->id) - 2); soap->id[sizeof(soap->id)-1] = '\0'; } } else if (!strcmp(tp->name, "href")) { if (soap->version == 1 || (soap->mode & SOAP_XML_GRAPH) || (soap->mode & SOAP_ENC_MTOM) || (soap->mode & SOAP_ENC_DIME)) { strncpy(soap->href, tp->value, sizeof(soap->href) - 1); soap->href[sizeof(soap->href)-1] = '\0'; } } else #endif if (!soap_match_tag(soap, tp->name, "xsi:type")) { strncpy(soap->type, tp->value, sizeof(soap->type) - 1); soap->type[sizeof(soap->type)-1] = '\0'; } else if ((!soap_match_tag(soap, tp->name, "xsi:null") || !soap_match_tag(soap, tp->name, "xsi:nil")) && (!strcmp(tp->value, "1") || !strcmp(tp->value, "true"))) { soap->null = 1; } else if (soap->version == 1) { if (!soap_match_tag(soap, tp->name, "SOAP-ENC:arrayType")) { s = soap_strrchr(tp->value, '['); if (s && (size_t)(s - tp->value) < sizeof(soap->arrayType)) { strncpy(soap->arrayType, tp->value, s - tp->value); soap->arrayType[s - tp->value] = '\0'; strncpy(soap->arraySize, s, sizeof(soap->arraySize) - 1); } else strncpy(soap->arrayType, tp->value, sizeof(soap->arrayType) - 1); soap->arraySize[sizeof(soap->arrayType)-1] = '\0'; soap->arrayType[sizeof(soap->arrayType)-1] = '\0'; } else if (!soap_match_tag(soap, tp->name, "SOAP-ENC:offset")) strncpy(soap->arrayOffset, tp->value, sizeof(soap->arrayOffset)); else if (!soap_match_tag(soap, tp->name, "SOAP-ENC:position")) soap->position = soap_getposition(tp->value, soap->positions); else if (!soap_match_tag(soap, tp->name, "SOAP-ENC:root")) soap->root = ((!strcmp(tp->value, "1") || !strcmp(tp->value, "true"))); else if (!soap_match_tag(soap, tp->name, "SOAP-ENV:mustUnderstand") && (!strcmp(tp->value, "1") || !strcmp(tp->value, "true"))) soap->mustUnderstand = 1; else if (!soap_match_tag(soap, tp->name, "SOAP-ENV:actor")) { if ((!soap->actor || strcmp(soap->actor, tp->value)) && strcmp(tp->value, "http://schemas.xmlsoap.org/soap/actor/next")) soap->other = 1; } } else if (soap->version == 2) { #ifndef WITH_NOIDREF if (!strcmp(tp->name, "ref") || !soap_match_tag(soap, tp->name, "SOAP-ENC:ref")) { *soap->href = '#'; strncpy(soap->href + 1, tp->value, sizeof(soap->href) - 2); soap->href[sizeof(soap->href)-1] = '\0'; } else #endif if (!soap_match_tag(soap, tp->name, "SOAP-ENC:itemType")) strncpy(soap->arrayType, tp->value, sizeof(soap->arrayType) - 1); else if (!soap_match_tag(soap, tp->name, "SOAP-ENC:arraySize")) strncpy(soap->arraySize, tp->value, sizeof(soap->arraySize) - 1); else if (!soap_match_tag(soap, tp->name, "SOAP-ENV:mustUnderstand") && (!strcmp(tp->value, "1") || !strcmp(tp->value, "true"))) soap->mustUnderstand = 1; else if (!soap_match_tag(soap, tp->name, "SOAP-ENV:role")) { if ((!soap->actor || strcmp(soap->actor, tp->value)) && strcmp(tp->value, "http://www.w3.org/2003/05/soap-envelope/role/next")) soap->other = 1; } } else { if (!soap_match_tag(soap, tp->name, "wsdl:required") && !strcmp(tp->value, "true")) soap->mustUnderstand = 1; } } } #ifdef WITH_DOM if (soap->feltbegin) return soap->error = soap->feltbegin(soap, soap->tag); #endif return soap->error = SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_retry(struct soap *soap) { soap->error = SOAP_OK; soap_revert(soap); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_revert(struct soap *soap) { if (!soap->peeked) { soap->peeked = 1; if (soap->body) soap->level--; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Reverting to last element '%s' (level=%u)\n", soap->tag, soap->level)); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_string_out(struct soap *soap, const char *s, int flag) { register const char *t; register soap_wchar c; register soap_wchar mask = (soap_wchar)0xFFFFFF80UL; #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { soap->dom->data = soap_strdup(soap, s); return SOAP_OK; } #endif if (flag == 2 || soap->mode & SOAP_C_UTFSTRING) mask = 0; t = s; while ((c = *t++)) { switch (c) { case 0x09: if (flag) { if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, " ", 5)) return soap->error; s = t; } break; case 0x0A: if (flag || !(soap->mode & SOAP_XML_CANONICAL)) { if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, " ", 5)) return soap->error; s = t; } break; case 0x0D: if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, " ", 5)) return soap->error; s = t; break; case '&': if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, "&", 5)) return soap->error; s = t; break; case '<': if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, "<", 4)) return soap->error; s = t; break; case '>': if (!flag) { if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, ">", 4)) return soap->error; s = t; } break; case '"': if (flag) { if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, """, 6)) return soap->error; s = t; } break; default: #ifndef WITH_LEANER #ifdef HAVE_MBTOWC if (soap->mode & SOAP_C_MBSTRING) { wchar_t wc; register int m = mbtowc(&wc, t - 1, MB_CUR_MAX); if (m > 0 && !((soap_wchar)wc == c && m == 1 && c < 0x80)) { if (soap_send_raw(soap, s, t - s - 1) || soap_pututf8(soap, wc)) return soap->error; s = t += m - 1; continue; } } #endif #endif #ifndef WITH_NOSTRINGTOUTF8 if ((c & mask) || !(c & 0xFFFFFFE0UL)) { if (soap_send_raw(soap, s, t - s - 1) || soap_pututf8(soap, (unsigned char)c)) return soap->error; s = t; } #endif } } return soap_send_raw(soap, s, t - s - 1); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 char * SOAP_FMAC2 soap_string_in(struct soap *soap, int flag, long minlen, long maxlen) { register char *s; char *t = NULL; register size_t i; register long l = 0; register int n = 0, f = 0, m = 0; register soap_wchar c; #if !defined(WITH_LEANER) && defined(HAVE_WCTOMB) char buf[MB_LEN_MAX > 8 ? MB_LEN_MAX : 8]; #else char buf[8]; #endif DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Reading string content, flag=%d\n", flag)); if (soap->peeked && *soap->tag) { #ifndef WITH_LEAN struct soap_attribute *tp; DBGLOG(TEST,SOAP_MESSAGE(fdebug, "String content includes tag '%s' and attributes\n", soap->tag)); t = soap->tmpbuf; *t = '<'; t[sizeof(soap->tmpbuf)-1] = '\0'; strncpy(t + 1, soap->tag, sizeof(soap->tmpbuf) - 2); t += strlen(t); for (tp = soap->attributes; tp; tp = tp->next) { if (tp->visible) { if (t >= soap->tmpbuf + sizeof(soap->tmpbuf) - 2) break; *t++ = ' '; strcpy(t, tp->name); t += strlen(t); if (t >= soap->tmpbuf + sizeof(soap->tmpbuf) - 2) break; /* too many or large attribute values */ if (tp->value) { *t++ = '='; *t++ = '"'; strcpy(t, tp->value); t += strlen(t); *t++ = '"'; } } } if (!soap->body) *t++ = '/'; *t++ = '>'; *t = '\0'; t = soap->tmpbuf; m = (int)strlen(soap->tmpbuf); #endif if (soap->body) n = 1; f = 1; soap->peeked = 0; } #ifdef WITH_CDATA if (!flag) { register int state = 0; #ifdef WITH_FAST soap->labidx = 0; /* use look-aside buffer */ #else if (soap_new_block(soap) == NULL) return NULL; #endif for (;;) { #ifdef WITH_FAST register size_t k; if (soap_append_lab(soap, NULL, 0)) /* allocate more space in look-aside buffer if necessary */ return NULL; s = soap->labbuf + soap->labidx; /* space to populate */ k = soap->lablen - soap->labidx; /* number of bytes available */ soap->labidx = soap->lablen; /* claim this space */ #else register size_t k = SOAP_BLKLEN; if (!(s = (char*)soap_push_block(soap, NULL, k))) return NULL; #endif for (i = 0; i < k; i++) { if (m > 0) { *s++ = *t++; /* copy multibyte characters */ m--; continue; } c = soap_getchar(soap); if ((int)c == EOF) goto end; if ((c >= 0x80 || c < SOAP_AP) && state != 1 && !(soap->mode & SOAP_ENC_LATIN)) { if (c >= 0x80) { soap_unget(soap, c); c = soap_getutf8(soap); } if (soap->mode & SOAP_C_UTFSTRING) { c &= 0x7FFFFFFF; t = buf; if (c < 0x0800) *t++ = (char)(0xC0 | ((c >> 6) & 0x1F)); else { if (c < 0x010000) *t++ = (char)(0xE0 | ((c >> 12) & 0x0F)); else { if (c < 0x200000) *t++ = (char)(0xF0 | ((c >> 18) & 0x07)); else { if (c < 0x04000000) *t++ = (char)(0xF8 | ((c >> 24) & 0x03)); else { *t++ = (char)(0xFC | ((c >> 30) & 0x01)); *t++ = (char)(0x80 | ((c >> 24) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 18) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 12) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 6) & 0x3F)); } *t++ = (char)(0x80 | (c & 0x3F)); m = (int)(t - buf) - 1; t = buf; *s++ = *t++; continue; } } switch (state) { case 1: if (c == ']') state = 4; *s++ = (char)c; continue; case 2: if (c == '-') state = 6; *s++ = (char)c; continue; case 3: if (c == '?') state = 8; *s++ = (char)c; continue; /* CDATA */ case 4: if (c == ']') state = 5; else state = 1; *s++ = (char)c; continue; case 5: if (c == '>') state = 0; else state = 1; *s++ = (char)c; continue; /* comment */ case 6: if (c == '-') state = 7; else state = 2; *s++ = (char)c; continue; case 7: if (c == '>') state = 0; else state = 2; *s++ = (char)c; continue; /* PI */ case 8: if (c == '>') state = 0; else state = 3; *s++ = (char)c; continue; } switch (c) { case SOAP_TT: if (n == 0) goto end; n--; *s++ = '<'; t = (char*)"/"; m = 1; break; case SOAP_LT: if (f && n == 0) goto end; n++; *s++ = '<'; break; case SOAP_GT: *s++ = '>'; break; case SOAP_QT: *s++ = '"'; break; case SOAP_AP: *s++ = '\''; break; case '/': if (n > 0) { c = soap_getchar(soap); if (c == '>') n--; soap_unget(soap, c); } *s++ = '/'; break; case '<': c = soap_getchar(soap); if (c == '/') { if (n == 0) { c = SOAP_TT; goto end; } n--; } else if (c == '!') { c = soap_getchar(soap); if (c == '[') { do c = soap_getchar(soap); while ((int)c != EOF && c != '['); if ((int)c == EOF) goto end; t = (char*)"![CDATA["; m = 8; state = 1; } else if (c == '-') { if ((c = soap_getchar(soap)) == '-') state = 2; t = (char*)"!-"; m = 2; soap_unget(soap, c); } else { t = (char*)"!"; m = 1; soap_unget(soap, c); } *s++ = '<'; break; } else if (c == '?') state = 3; else if (f && n == 0) { soap_revget1(soap); c = '<'; goto end; } else n++; soap_unget(soap, c); *s++ = '<'; break; case '>': *s++ = '>'; break; case '"': *s++ = '"'; break; default: #ifndef WITH_LEANER #ifdef HAVE_WCTOMB if (soap->mode & SOAP_C_MBSTRING) { m = wctomb(buf, (wchar_t)(c & 0x7FFFFFFF)); if (m >= 1 && m <= (int)MB_CUR_MAX) { t = buf; *s++ = *t++; m--; } else { *s++ = SOAP_UNKNOWN_CHAR; m = 0; } } else #endif #endif *s++ = (char)(c & 0xFF); } l++; if (maxlen >= 0 && l > maxlen) { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "String too long: maxlen=%ld\n", maxlen)); soap->error = SOAP_LENGTH; return NULL; } } } } #endif #ifdef WITH_FAST soap->labidx = 0; /* use look-aside buffer */ #else if (soap_new_block(soap) == NULL) return NULL; #endif for (;;) { #ifdef WITH_FAST register size_t k; if (soap_append_lab(soap, NULL, 0)) /* allocate more space in look-aside buffer if necessary */ return NULL; s = soap->labbuf + soap->labidx; /* space to populate */ k = soap->lablen - soap->labidx; /* number of bytes available */ soap->labidx = soap->lablen; /* claim this space */ #else register size_t k = SOAP_BLKLEN; if (!(s = (char*)soap_push_block(soap, NULL, k))) return NULL; #endif for (i = 0; i < k; i++) { if (m > 0) { *s++ = *t++; /* copy multibyte characters */ m--; continue; } if (soap->mode & SOAP_C_UTFSTRING) { if (((c = soap_get(soap)) & 0x80000000) && c >= -0x7FFFFF80 && c < SOAP_AP) { c &= 0x7FFFFFFF; t = buf; if (c < 0x0800) *t++ = (char)(0xC0 | ((c >> 6) & 0x1F)); else { if (c < 0x010000) *t++ = (char)(0xE0 | ((c >> 12) & 0x0F)); else { if (c < 0x200000) *t++ = (char)(0xF0 | ((c >> 18) & 0x07)); else { if (c < 0x04000000) *t++ = (char)(0xF8 | ((c >> 24) & 0x03)); else { *t++ = (char)(0xFC | ((c >> 30) & 0x01)); *t++ = (char)(0x80 | ((c >> 24) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 18) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 12) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 6) & 0x3F)); } *t++ = (char)(0x80 | (c & 0x3F)); m = (int)(t - buf) - 1; t = buf; *s++ = *t++; continue; } } else c = soap_getutf8(soap); switch (c) { case SOAP_TT: if (n == 0) goto end; n--; *s++ = '<'; t = (char*)"/"; m = 1; break; case SOAP_LT: if (f && n == 0) goto end; n++; *s++ = '<'; break; case SOAP_GT: *s++ = '>'; break; case SOAP_QT: *s++ = '"'; break; case SOAP_AP: *s++ = '\''; break; case '/': if (n > 0) { c = soap_get(soap); if (c == SOAP_GT) n--; soap_unget(soap, c); } *s++ = '/'; break; case (soap_wchar)('<' | 0x80000000): if (flag) *s++ = '<'; else { *s++ = '&'; t = (char*)"lt;"; m = 3; } break; case (soap_wchar)('>' | 0x80000000): if (flag) *s++ = '>'; else { *s++ = '&'; t = (char*)"gt;"; m = 3; } break; case (soap_wchar)('&' | 0x80000000): if (flag) *s++ = '&'; else { *s++ = '&'; t = (char*)"amp;"; m = 4; } break; case (soap_wchar)('"' | 0x80000000): if (flag) *s++ = '"'; else { *s++ = '&'; t = (char*)"quot;"; m = 5; } break; case (soap_wchar)('\'' | 0x80000000): if (flag) *s++ = '\''; else { *s++ = '&'; t = (char*)"apos;"; m = 5; } break; default: if ((int)c == EOF) goto end; #ifndef WITH_LEANER #ifdef HAVE_WCTOMB if (soap->mode & SOAP_C_MBSTRING) { m = wctomb(buf, (wchar_t)(c & 0x7FFFFFFF)); if (m >= 1 && m <= (int)MB_CUR_MAX) { t = buf; *s++ = *t++; m--; } else { *s++ = SOAP_UNKNOWN_CHAR; m = 0; } } else #endif #endif *s++ = (char)(c & 0xFF); } l++; if (maxlen >= 0 && l > maxlen) { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "String too long: maxlen=%ld\n", maxlen)); soap->error = SOAP_LENGTH; return NULL; } } } end: soap_unget(soap, c); *s = '\0'; #ifdef WITH_FAST t = soap_strdup(soap, soap->labbuf); #else soap_size_block(soap, NULL, i+1); t = soap_save_block(soap, NULL, 0); #endif if (l < minlen) { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "String too short: %ld chars, minlen=%ld\n", l, minlen)); soap->error = SOAP_LENGTH; return NULL; } #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { if (flag == 3) soap->dom->tail = t; else soap->dom->data = t; } #endif if (flag == 2) if (soap_s2QName(soap, t, &t, minlen, maxlen)) return NULL; return t; } #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_wstring_out(struct soap *soap, const wchar_t *s, int flag) { const char *t; char tmp; register soap_wchar c; #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { wchar_t *r = (wchar_t*)s; int n = 1; while (*r++) n++; soap->dom->wide = r = (wchar_t*)soap_malloc(soap, n * sizeof(wchar_t)); while (n--) *r++ = *s++; return SOAP_OK; } #endif while ((c = *s++)) { switch (c) { case 0x09: if (flag) t = " "; else t = "\t"; break; case 0x0A: if (flag || !(soap->mode & SOAP_XML_CANONICAL)) t = " "; else t = "\n"; break; case 0x0D: t = " "; break; case '&': t = "&"; break; case '<': t = "<"; break; case '>': if (flag) t = ">"; else t = ">"; break; case '"': if (flag) t = """; else t = "\""; break; default: if (c >= 0x20 && c < 0x80) { tmp = (char)c; if (soap_send_raw(soap, &tmp, 1)) return soap->error; } else /* check UTF16 encoding when wchar_t is too small to hold UCS */ { if (sizeof(wchar_t) < 4 && (c & 0xD800) == 0xD800) { /* http://unicode.org/faq/utf_bom.html#utf16-2 */ if ((*s & 0xD800) == 0xD800) c = (c << 10) + *s++ + 0x10000 - (0xD800 << 10) - 0xDC00; else c = 0xFFFD; /* Malformed */ } if (soap_pututf8(soap, (unsigned long)c)) return soap->error; } continue; } if (soap_send(soap, t)) return soap->error; } return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_2 SOAP_FMAC1 wchar_t * SOAP_FMAC2 soap_wstring_in(struct soap *soap, int flag, long minlen, long maxlen) { wchar_t *s; register int i, n = 0, f = 0; register long l = 0; register soap_wchar c; char *t = NULL; DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Reading wide string content\n")); if (soap->peeked) { if (*soap->tag) { #ifndef WITH_LEAN struct soap_attribute *tp; t = soap->tmpbuf; *t = '<'; t[sizeof(soap->tmpbuf)-1] = '\0'; strncpy(t + 1, soap->tag, sizeof(soap->tmpbuf) - 2); t += strlen(t); for (tp = soap->attributes; tp; tp = tp->next) { if (tp->visible) { if (t >= soap->tmpbuf + sizeof(soap->tmpbuf) - 2) break; *t++ = ' '; strcpy(t, tp->name); t += strlen(t); if (t >= soap->tmpbuf + sizeof(soap->tmpbuf) - 2) break; if (tp->value) { *t++ = '='; *t++ = '"'; strcpy(t, tp->value); t += strlen(t); *t++ = '"'; } } } if (!soap->body) *t++ = '/'; *t++ = '>'; *t = '\0'; t = soap->tmpbuf; #endif if (soap->body) n = 1; f = 1; soap->peeked = 0; } } if (soap_new_block(soap) == NULL) return NULL; for (;;) { if (!(s = (wchar_t*)soap_push_block(soap, NULL, sizeof(wchar_t)*SOAP_BLKLEN))) return NULL; for (i = 0; i < SOAP_BLKLEN; i++) { if (t) { *s++ = (wchar_t)*t++; if (!*t) t = NULL; continue; } c = soap_getutf8(soap); switch (c) { case SOAP_TT: if (n == 0) goto end; n--; *s++ = '<'; soap_unget(soap, '/'); break; case SOAP_LT: if (f && n == 0) goto end; n++; *s++ = '<'; break; case SOAP_GT: *s++ = '>'; break; case SOAP_QT: *s++ = '"'; break; case SOAP_AP: *s++ = '\''; break; case '/': if (n > 0) { c = soap_getutf8(soap); if (c == SOAP_GT) n--; soap_unget(soap, c); } *s++ = '/'; break; case '<': if (flag) *s++ = (soap_wchar)'<'; else { *s++ = (soap_wchar)'&'; t = (char*)"lt;"; } break; case '>': if (flag) *s++ = (soap_wchar)'>'; else { *s++ = (soap_wchar)'&'; t = (char*)"gt;"; } break; case '"': if (flag) *s++ = (soap_wchar)'"'; else { *s++ = (soap_wchar)'&'; t = (char*)"quot;"; } break; default: if ((int)c == EOF) goto end; if (sizeof(wchar_t) < 4 && c > 0xFFFF) { soap_wchar c1, c2; /* http://unicode.org/faq/utf_bom.html#utf16-2 */ c1 = 0xD800 - (0x10000 >> 10) + (c >> 10); c2 = 0xDC00 + (c & 0x3FF); c = c1; soap_unget(soap, c2); } *s++ = (wchar_t)c & 0x7FFFFFFF; } l++; if (maxlen >= 0 && l > maxlen) { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "String too long: maxlen=%ld\n", maxlen)); soap->error = SOAP_LENGTH; return NULL; } } } end: soap_unget(soap, c); *s = '\0'; soap_size_block(soap, NULL, sizeof(wchar_t) * (i + 1)); if (l < minlen) { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "String too short: %ld chars, minlen=%ld\n", l, minlen)); soap->error = SOAP_LENGTH; return NULL; } s = (wchar_t*)soap_save_block(soap, NULL, NULL, 0); #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) soap->dom->wide = s; #endif return s; } #endif #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_int2s(struct soap *soap, int n) { return soap_long2s(soap, (long)n); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outint(struct soap *soap, const char *tag, int id, const int *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_long2s(soap, (long)*p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2int(struct soap *soap, const char *s, int *p) { if (s) { long n; char *r; #ifndef WITH_NOIO #ifndef WITH_LEAN soap_reset_errno; #endif #endif n = soap_strtol(s, &r, 10); if (s == r || *r #ifndef WITH_LEAN || n != (int)n #endif #ifndef WITH_NOIO #ifndef WITH_LEAN || soap_errno == SOAP_ERANGE #endif #endif ) soap->error = SOAP_TYPE; *p = (int)n; } return soap->error; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int * SOAP_FMAC2 soap_inint(struct soap *soap, const char *tag, int *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; #ifndef WITH_LEAN if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":int") && soap_match_tag(soap, soap->type, ":short") && soap_match_tag(soap, soap->type, ":byte")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } #endif p = (int*)soap_id_enter(soap, soap->id, p, t, sizeof(int), 0, NULL, NULL, NULL); if (*soap->href) p = (int*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(int), 0, NULL); else if (p) { if (soap_s2int(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_long2s(struct soap *soap, long n) { sprintf(soap->tmpbuf, "%ld", n); return soap->tmpbuf; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outlong(struct soap *soap, const char *tag, int id, const long *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_long2s(soap, *p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2long(struct soap *soap, const char *s, long *p) { if (s) { char *r; #ifndef WITH_NOIO #ifndef WITH_LEAN soap_reset_errno; #endif #endif *p = soap_strtol(s, &r, 10); if (s == r || *r #ifndef WITH_NOIO #ifndef WITH_LEAN || soap_errno == SOAP_ERANGE #endif #endif ) soap->error = SOAP_TYPE; } return soap->error; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 long * SOAP_FMAC2 soap_inlong(struct soap *soap, const char *tag, long *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; #ifndef WITH_LEAN if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":int") && soap_match_tag(soap, soap->type, ":short") && soap_match_tag(soap, soap->type, ":byte")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } #endif p = (long*)soap_id_enter(soap, soap->id, p, t, sizeof(long), 0, NULL, NULL, NULL); if (*soap->href) p = (long*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(long), 0, NULL); else if (p) { if (soap_s2long(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 const char* SOAP_FMAC2 soap_LONG642s(struct soap *soap, LONG64 n) { sprintf(soap->tmpbuf, SOAP_LONG_FORMAT, n); return soap->tmpbuf; } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 int SOAP_FMAC2 soap_outLONG64(struct soap *soap, const char *tag, int id, const LONG64 *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_LONG642s(soap, *p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 int SOAP_FMAC2 soap_s2LONG64(struct soap *soap, const char *s, LONG64 *p) { if (s) { #ifdef HAVE_STRTOLL char *r; #ifndef WITH_NOIO #ifndef WITH_LEAN soap_reset_errno; #endif #endif *p = strtoll(s, &r, 10); if (s == r || *r #ifndef WITH_NOIO #ifndef WITH_LEAN || soap_errno == SOAP_ERANGE #endif #endif ) #else # ifdef HAVE_SSCANF if (sscanf(s, SOAP_LONG_FORMAT, p) != 1) # endif #endif soap->error = SOAP_TYPE; } return soap->error; } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 LONG64 * SOAP_FMAC2 soap_inLONG64(struct soap *soap, const char *tag, LONG64 *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; #ifndef WITH_LEAN if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":integer") && soap_match_tag(soap, soap->type, ":positiveInteger") && soap_match_tag(soap, soap->type, ":negativeInteger") && soap_match_tag(soap, soap->type, ":nonPositiveInteger") && soap_match_tag(soap, soap->type, ":nonNegativeInteger") && soap_match_tag(soap, soap->type, ":long") && soap_match_tag(soap, soap->type, ":int") && soap_match_tag(soap, soap->type, ":short") && soap_match_tag(soap, soap->type, ":byte")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } #endif p = (LONG64*)soap_id_enter(soap, soap->id, p, t, sizeof(LONG64), 0, NULL, NULL, NULL); if (*soap->href) p = (LONG64*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(LONG64), 0, NULL); else if (p) { if (soap_s2LONG64(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_byte2s(struct soap *soap, char n) { return soap_long2s(soap, (long)n); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outbyte(struct soap *soap, const char *tag, int id, const char *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_long2s(soap, (long)*p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2byte(struct soap *soap, const char *s, char *p) { if (s) { long n; char *r; n = soap_strtol(s, &r, 10); if (s == r || *r || n < -128 || n > 127) soap->error = SOAP_TYPE; *p = (char)n; } return soap->error; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 char * SOAP_FMAC2 soap_inbyte(struct soap *soap, const char *tag, char *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; #ifndef WITH_LEAN if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":byte")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } #endif p = (char*)soap_id_enter(soap, soap->id, p, t, sizeof(char), 0, NULL, NULL, NULL); if (*soap->href) p = (char*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(char), 0, NULL); else if (p) { if (soap_s2byte(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_short2s(struct soap *soap, short n) { return soap_long2s(soap, (long)n); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outshort(struct soap *soap, const char *tag, int id, const short *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_long2s(soap, (long)*p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2short(struct soap *soap, const char *s, short *p) { if (s) { long n; char *r; n = soap_strtol(s, &r, 10); if (s == r || *r || n < -32768 || n > 32767) soap->error = SOAP_TYPE; *p = (short)n; } return soap->error; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 short * SOAP_FMAC2 soap_inshort(struct soap *soap, const char *tag, short *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; #ifndef WITH_LEAN if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":short") && soap_match_tag(soap, soap->type, ":byte")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } #endif p = (short*)soap_id_enter(soap, soap->id, p, t, sizeof(short), 0, NULL, NULL, NULL); if (*soap->href) p = (short*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(short), 0, NULL); else if (p) { if (soap_s2short(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_float2s(struct soap *soap, float n) { char *s; if (soap_isnan((double)n)) return "NaN"; if (soap_ispinff(n)) return "INF"; if (soap_isninff(n)) return "-INF"; s = soap->tmpbuf; #if defined(HAVE_SPRINTF_L) # ifdef WIN32 _sprintf_s_l(s, _countof(soap->tmpbuf), soap->float_format, soap->c_locale, n); # else sprintf_l(s, soap->c_locale, soap->float_format, n); # endif #else sprintf(s, soap->float_format, n); s = strchr(s, ','); /* convert decimal comma to DP */ if (s) *s = '.'; #endif return soap->tmpbuf; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outfloat(struct soap *soap, const char *tag, int id, const float *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_float2s(soap, *p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2float(struct soap *soap, const char *s, float *p) { if (s) { if (!*s) return soap->error = SOAP_TYPE; if (!soap_tag_cmp(s, "INF")) *p = FLT_PINFTY; else if (!soap_tag_cmp(s, "+INF")) *p = FLT_PINFTY; else if (!soap_tag_cmp(s, "-INF")) *p = FLT_NINFTY; else if (!soap_tag_cmp(s, "NaN")) *p = FLT_NAN; else { /* On some systems strtof requires -std=c99 or does not even link: so we try to use strtod first */ #if defined(HAVE_STRTOD_L) char *r; # ifdef WIN32 *p = (float)_strtod_l(s, &r, soap->c_locale); # else *p = (float)strtod_l(s, &r, soap->c_locale); # endif if (*r) #elif defined(HAVE_STRTOD) char *r; *p = (float)strtod(s, &r); if (*r) #elif defined(HAVE_STRTOF_L) char *r; *p = strtof_l((char*)s, &r, soap->c_locale); if (*r) #elif defined(HAVE_STRTOF) char *r; *p = strtof((char*)s, &r); if (*r) #endif { #if defined(HAVE_SSCANF_L) && !defined(HAVE_STRTOF_L) && !defined(HAVE_STRTOD_L) if (sscanf_l(s, soap->c_locale, "%g", p) != 1) soap->error = SOAP_TYPE; #elif defined(HAVE_SSCANF) if (sscanf(s, "%g", p) != 1) soap->error = SOAP_TYPE; #else soap->error = SOAP_TYPE; #endif } } } return soap->error; } #endif /******************************************************************************/ #ifndef WITH_LEAN static int soap_isnumeric(struct soap *soap, const char *type) { if (soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":float") && soap_match_tag(soap, soap->type, ":double") && soap_match_tag(soap, soap->type, ":decimal") && soap_match_tag(soap, soap->type, ":integer") && soap_match_tag(soap, soap->type, ":positiveInteger") && soap_match_tag(soap, soap->type, ":negativeInteger") && soap_match_tag(soap, soap->type, ":nonPositiveInteger") && soap_match_tag(soap, soap->type, ":nonNegativeInteger") && soap_match_tag(soap, soap->type, ":long") && soap_match_tag(soap, soap->type, ":int") && soap_match_tag(soap, soap->type, ":short") && soap_match_tag(soap, soap->type, ":byte") && soap_match_tag(soap, soap->type, ":unsignedLong") && soap_match_tag(soap, soap->type, ":unsignedInt") && soap_match_tag(soap, soap->type, ":unsignedShort") && soap_match_tag(soap, soap->type, ":unsignedByte")) { soap->error = SOAP_TYPE; soap_revert(soap); return SOAP_ERR; } return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 float * SOAP_FMAC2 soap_infloat(struct soap *soap, const char *tag, float *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; #ifndef WITH_LEAN if (*soap->type != '\0' && soap_isnumeric(soap, type)) return NULL; #endif p = (float*)soap_id_enter(soap, soap->id, p, t, sizeof(float), 0, NULL, NULL, NULL); if (*soap->href) p = (float*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(float), 0, NULL); else if (p) { if (soap_s2float(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_double2s(struct soap *soap, double n) { char *s; if (soap_isnan(n)) return "NaN"; if (soap_ispinfd(n)) return "INF"; if (soap_isninfd(n)) return "-INF"; s = soap->tmpbuf; #if defined(HAVE_SPRINTF_L) # ifdef WIN32 _sprintf_s_l(s, _countof(soap->tmpbuf), soap->double_format, soap->c_locale, n); # else sprintf_l(s, soap->c_locale, soap->double_format, n); # endif #else sprintf(s, soap->double_format, n); s = strchr(s, ','); /* convert decimal comma to DP */ if (s) *s = '.'; #endif return soap->tmpbuf; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outdouble(struct soap *soap, const char *tag, int id, const double *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_double2s(soap, *p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2double(struct soap *soap, const char *s, double *p) { if (s) { if (!*s) return soap->error = SOAP_TYPE; if (!soap_tag_cmp(s, "INF")) *p = DBL_PINFTY; else if (!soap_tag_cmp(s, "+INF")) *p = DBL_PINFTY; else if (!soap_tag_cmp(s, "-INF")) *p = DBL_NINFTY; else if (!soap_tag_cmp(s, "NaN")) *p = DBL_NAN; else { #if defined(HAVE_STRTOD_L) char *r; # ifdef WIN32 *p = _strtod_l(s, &r, soap->c_locale); # else *p = strtod_l(s, &r, soap->c_locale); # endif if (*r) #elif defined(HAVE_STRTOD) char *r; *p = strtod(s, &r); if (*r) #endif { #if defined(HAVE_SSCANF_L) && !defined(HAVE_STRTOF_L) && !defined(HAVE_STRTOD_L) if (sscanf_l(s, soap->c_locale, "%lg", p) != 1) soap->error = SOAP_TYPE; #elif defined(HAVE_SSCANF) if (sscanf(s, "%lg", p) != 1) soap->error = SOAP_TYPE; #else soap->error = SOAP_TYPE; #endif } } } return soap->error; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 double * SOAP_FMAC2 soap_indouble(struct soap *soap, const char *tag, double *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; #ifndef WITH_LEAN if (*soap->type != '\0' && soap_isnumeric(soap, type)) return NULL; #endif p = (double*)soap_id_enter(soap, soap->id, p, t, sizeof(double), 0, NULL, NULL, NULL); if (*soap->href) p = (double*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(double), 0, NULL); else if (p) { if (soap_s2double(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedByte2s(struct soap *soap, unsigned char n) { return soap_unsignedLong2s(soap, (unsigned long)n); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outunsignedByte(struct soap *soap, const char *tag, int id, const unsigned char *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_unsignedLong2s(soap, (unsigned long)*p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedByte(struct soap *soap, const char *s, unsigned char *p) { if (s) { unsigned long n; char *r; n = soap_strtoul(s, &r, 10); if (s == r || *r || n > 255) soap->error = SOAP_TYPE; *p = (unsigned char)n; } return soap->error; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 unsigned char * SOAP_FMAC2 soap_inunsignedByte(struct soap *soap, const char *tag, unsigned char *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; #ifndef WITH_LEAN if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":unsignedByte")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } #endif p = (unsigned char*)soap_id_enter(soap, soap->id, p, t, sizeof(unsigned char), 0, NULL, NULL, NULL); if (*soap->href) p = (unsigned char*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(unsigned char), 0, NULL); else if (p) { if (soap_s2unsignedByte(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedShort2s(struct soap *soap, unsigned short n) { return soap_unsignedLong2s(soap, (unsigned long)n); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outunsignedShort(struct soap *soap, const char *tag, int id, const unsigned short *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_unsignedLong2s(soap, (unsigned long)*p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedShort(struct soap *soap, const char *s, unsigned short *p) { if (s) { unsigned long n; char *r; n = soap_strtoul(s, &r, 10); if (s == r || *r || n > 65535) soap->error = SOAP_TYPE; *p = (unsigned short)n; } return soap->error; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 unsigned short * SOAP_FMAC2 soap_inunsignedShort(struct soap *soap, const char *tag, unsigned short *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; #ifndef WITH_LEAN if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":unsignedShort") && soap_match_tag(soap, soap->type, ":unsignedByte")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } #endif p = (unsigned short*)soap_id_enter(soap, soap->id, p, t, sizeof(unsigned short), 0, NULL, NULL, NULL); if (*soap->href) p = (unsigned short*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(unsigned short), 0, NULL); else if (p) { if (soap_s2unsignedShort(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedInt2s(struct soap *soap, unsigned int n) { return soap_unsignedLong2s(soap, (unsigned long)n); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outunsignedInt(struct soap *soap, const char *tag, int id, const unsigned int *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_unsignedLong2s(soap, (unsigned long)*p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedInt(struct soap *soap, const char *s, unsigned int *p) { if (s) { char *r; #ifndef WITH_NOIO #ifndef WITH_LEAN soap_reset_errno; #endif #endif *p = (unsigned int)soap_strtoul(s, &r, 10); if ((s == r && (soap->mode & SOAP_XML_STRICT)) || *r #ifndef WITH_NOIO #ifndef WITH_LEAN || soap_errno == SOAP_ERANGE #endif #endif ) soap->error = SOAP_TYPE; } return soap->error; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 unsigned int * SOAP_FMAC2 soap_inunsignedInt(struct soap *soap, const char *tag, unsigned int *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; #ifndef WITH_LEAN if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":unsignedInt") && soap_match_tag(soap, soap->type, ":unsignedShort") && soap_match_tag(soap, soap->type, ":unsignedByte")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } #endif p = (unsigned int*)soap_id_enter(soap, soap->id, p, t, sizeof(unsigned int), 0, NULL, NULL, NULL); if (*soap->href) p = (unsigned int*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(unsigned int), 0, NULL); else if (p) { if (soap_s2unsignedInt(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedLong2s(struct soap *soap, unsigned long n) { sprintf(soap->tmpbuf, "%lu", n); return soap->tmpbuf; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outunsignedLong(struct soap *soap, const char *tag, int id, const unsigned long *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_unsignedLong2s(soap, *p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedLong(struct soap *soap, const char *s, unsigned long *p) { if (s) { char *r; #ifndef WITH_NOIO #ifndef WITH_LEAN soap_reset_errno; #endif #endif *p = soap_strtoul(s, &r, 10); if ((s == r && (soap->mode & SOAP_XML_STRICT)) || *r #ifndef WITH_NOIO #ifndef WITH_LEAN || soap_errno == SOAP_ERANGE #endif #endif ) soap->error = SOAP_TYPE; } return soap->error; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 unsigned long * SOAP_FMAC2 soap_inunsignedLong(struct soap *soap, const char *tag, unsigned long *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; #ifndef WITH_LEAN if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":unsignedInt") && soap_match_tag(soap, soap->type, ":unsignedShort") && soap_match_tag(soap, soap->type, ":unsignedByte")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } #endif p = (unsigned long*)soap_id_enter(soap, soap->id, p, t, sizeof(unsigned long), 0, NULL, NULL, NULL); if (*soap->href) p = (unsigned long*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(unsigned long), 0, NULL); else if (p) { if (soap_s2unsignedLong(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 const char* SOAP_FMAC2 soap_ULONG642s(struct soap *soap, ULONG64 n) { sprintf(soap->tmpbuf, SOAP_ULONG_FORMAT, n); return soap->tmpbuf; } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 int SOAP_FMAC2 soap_outULONG64(struct soap *soap, const char *tag, int id, const ULONG64 *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_ULONG642s(soap, *p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 int SOAP_FMAC2 soap_s2ULONG64(struct soap *soap, const char *s, ULONG64 *p) { if (s) { #ifdef HAVE_STRTOULL char *r; #ifndef WITH_NOIO #ifndef WITH_LEAN soap_reset_errno; #endif #endif *p = strtoull(s, &r, 10); if ((s == r && (soap->mode & SOAP_XML_STRICT)) || *r #ifndef WITH_NOIO #ifndef WITH_LEAN || soap_errno == SOAP_ERANGE #endif #endif ) #else #ifdef HAVE_SSCANF if (sscanf(s, SOAP_ULONG_FORMAT, p) != 1) #endif #endif soap->error = SOAP_TYPE; } return soap->error; } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 ULONG64 * SOAP_FMAC2 soap_inULONG64(struct soap *soap, const char *tag, ULONG64 *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":positiveInteger") && soap_match_tag(soap, soap->type, ":nonNegativeInteger") && soap_match_tag(soap, soap->type, ":unsignedLong") && soap_match_tag(soap, soap->type, ":unsignedInt") && soap_match_tag(soap, soap->type, ":unsignedShort") && soap_match_tag(soap, soap->type, ":unsignedByte")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } p = (ULONG64*)soap_id_enter(soap, soap->id, p, t, sizeof(ULONG64), 0, NULL, NULL, NULL); if (*soap->href) p = (ULONG64*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(ULONG64), 0, NULL); else if (p) { if (soap_s2ULONG64(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2string(struct soap *soap, const char *s, char **t, long minlen, long maxlen) { if (s) { long l = (long)strlen(s); if ((maxlen >= 0 && l > maxlen) || l < minlen) return soap->error = SOAP_LENGTH; if (!(*t = soap_strdup(soap, s))) return soap->error = SOAP_EOM; if (!(soap->mode & (SOAP_ENC_LATIN | SOAP_C_UTFSTRING))) { char *r = *t; /* remove non-ASCII chars */ for (s = *t; *s; s++) if (!(*s & 0x80)) *r++ = *s; *r = '\0'; } } return soap->error; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2QName(struct soap *soap, const char *s, char **t, long minlen, long maxlen) { if (s) { long l = (long)strlen(s); if ((maxlen >= 0 && l > maxlen) || l < minlen) return soap->error = SOAP_LENGTH; soap->labidx = 0; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Normalized namespace(s) of QNames '%s'", s)); /* convert (by prefix normalize prefix) all QNames in s */ for (;;) { size_t n; struct soap_nlist *np; register const char *p; /* skip blanks */ while (*s && soap_blank((soap_wchar)*s)) s++; if (!*s) break; /* find next QName */ n = 1; while (s[n] && !soap_blank((soap_wchar)s[n])) n++; np = soap->nlist; /* if there is no namespace stack, or prefix is "xml" then copy string */ if (!np || !strncmp(s, "xml:", 4)) { soap_append_lab(soap, s, n); } else /* we normalize the QName by replacing its prefix */ { const char *q; for (p = s; *p && p < s + n; p++) if (*p == ':') break; if (*p == ':') { size_t k = p - s; while (np && (strncmp(np->id, s, k) || np->id[k])) np = np->next; p++; } else { while (np && *np->id) np = np->next; p = s; } /* replace prefix */ if (np) { if (np->index >= 0 && soap->local_namespaces && (q = soap->local_namespaces[np->index].id)) { size_t k = strlen(q); if (q[k-1] != '_') soap_append_lab(soap, q, k); else { soap_append_lab(soap, "\"", 1); soap_append_lab(soap, soap->local_namespaces[np->index].ns, strlen(soap->local_namespaces[np->index].ns)); soap_append_lab(soap, "\"", 1); } } else if (np->ns) { soap_append_lab(soap, "\"", 1); soap_append_lab(soap, np->ns, strlen(np->ns)); soap_append_lab(soap, "\"", 1); } else { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\nNamespace prefix of '%s' not defined (index=%d, URI=%s)\n", s, np->index, np->ns ? np->ns : SOAP_STR_EOS)); return soap->error = SOAP_NAMESPACE; } } else if (s[n]) /* no namespace, part of string */ { soap_append_lab(soap, s, n); } else /* no namespace: assume "" namespace */ { soap_append_lab(soap, "\"\"", 2); } soap_append_lab(soap, ":", 1); soap_append_lab(soap, p, n - (p-s)); } /* advance to next and add spacing */ s += n; if (*s) soap_append_lab(soap, " ", 1); } soap_append_lab(soap, SOAP_STR_EOS, 1); *t = soap_strdup(soap, soap->labbuf); DBGLOG(TEST, SOAP_MESSAGE(fdebug, " into '%s'\n", *t)); } return soap->error; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_QName2s(struct soap *soap, const char *s) { const char *t = NULL; if (s) { soap->labidx = 0; for (;;) { size_t n; /* skip blanks */ while (*s && soap_blank((soap_wchar)*s)) s++; if (!*s) break; /* find next QName */ n = 1; while (s[n] && !soap_blank((soap_wchar)s[n])) n++; /* normal prefix: pass string as is */ if (*s != '"') { soap_append_lab(soap, s, n); #ifndef WITH_LEAN if ((soap->mode & SOAP_XML_CANONICAL)) soap_utilize_ns(soap, s); #endif } else /* URL-based string prefix */ { const char *q; s++; q = strchr(s, '"'); if (q) { struct Namespace *p = soap->local_namespaces; if (p) { for (; p->id; p++) { if (p->ns) if (!soap_tag_cmp(s, p->ns)) break; if (p->in) if (!soap_tag_cmp(s, p->in)) break; } } /* URL is in the namespace table? */ if (p && p->id) { soap_append_lab(soap, p->id, strlen(p->id)); } else /* not in namespace table: create xmlns binding */ { char *r = soap_strdup(soap, s); r[q-s] = '\0'; sprintf(soap->tmpbuf, "xmlns:_%d", soap->idnum++); soap_set_attr(soap, soap->tmpbuf, r, 1); soap_append_lab(soap, soap->tmpbuf + 6, strlen(soap->tmpbuf + 6)); } soap_append_lab(soap, q + 1, n - (q-s) - 1); } } /* advance to next and add spacing */ s += n; if (*s) soap_append_lab(soap, " ", 1); } soap_append_lab(soap, SOAP_STR_EOS, 1); t = soap_strdup(soap, soap->labbuf); } return t; } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 int SOAP_FMAC2 soap_s2wchar(struct soap *soap, const char *s, wchar_t **t, long minlen, long maxlen) { if (s) { long l; wchar_t *r; *t = r = (wchar_t*)soap_malloc(soap, sizeof(wchar_t) * (strlen(s) + 1)); if (!r) return soap->error = SOAP_EOM; if (soap->mode & SOAP_ENC_LATIN) { while (*s) *r++ = (wchar_t)*s++; } else { /* Convert UTF8 to wchar */ while (*s) { register soap_wchar c, c1, c2, c3, c4; c = (unsigned char)*s++; if (c < 0x80) *r++ = (wchar_t)c; else { c1 = (soap_wchar)*s++ & 0x3F; if (c < 0xE0) *r++ = (wchar_t)(((soap_wchar)(c & 0x1F) << 6) | c1); else { c2 = (soap_wchar)*s++ & 0x3F; if (c < 0xF0) *r++ = (wchar_t)(((soap_wchar)(c & 0x0F) << 12) | (c1 << 6) | c2); else { c3 = (soap_wchar)*s++ & 0x3F; if (c < 0xF8) *r++ = (wchar_t)(((soap_wchar)(c & 0x07) << 18) | (c1 << 12) | (c2 << 6) | c3); else { c4 = (soap_wchar)*s++ & 0x3F; if (c < 0xFC) *r++ = (wchar_t)(((soap_wchar)(c & 0x03) << 24) | (c1 << 18) | (c2 << 12) | (c3 << 6) | c4); else *r++ = (wchar_t)(((soap_wchar)(c & 0x01) << 30) | (c1 << 24) | (c2 << 18) | (c3 << 12) | (c4 << 6) | (soap_wchar)(*s++ & 0x3F)); } } } } } } *r = L'\0'; l = (long)(r - *t); if ((maxlen >= 0 && l > maxlen) || l < minlen) return soap->error = SOAP_LENGTH; } return soap->error; } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 const char* SOAP_FMAC2 soap_wchar2s(struct soap *soap, const wchar_t *s) { register soap_wchar c; register char *r, *t; const wchar_t *q = s; size_t n = 0; while ((c = *q++)) { if (c > 0 && c < 0x80) n++; else n += 6; } r = t = (char*)soap_malloc(soap, n + 1); if (r) { /* Convert wchar to UTF8 */ while ((c = *s++)) { if (c > 0 && c < 0x80) *t++ = (char)c; else { if (c < 0x0800) *t++ = (char)(0xC0 | ((c >> 6) & 0x1F)); else { if (c < 0x010000) *t++ = (char)(0xE0 | ((c >> 12) & 0x0F)); else { if (c < 0x200000) *t++ = (char)(0xF0 | ((c >> 18) & 0x07)); else { if (c < 0x04000000) *t++ = (char)(0xF8 | ((c >> 24) & 0x03)); else { *t++ = (char)(0xFC | ((c >> 30) & 0x01)); *t++ = (char)(0x80 | ((c >> 24) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 18) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 12) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 6) & 0x3F)); } *t++ = (char)(0x80 | (c & 0x3F)); } } *t = '\0'; } return r; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outstring(struct soap *soap, const char *tag, int id, char *const*p, const char *type, int n) { id = soap_element_id(soap, tag, id, *p, NULL, 0, type, n); if (id < 0) return soap->error; if (!**p && (soap->mode & SOAP_C_NILSTRING)) return soap_element_null(soap, tag, id, type); if (soap_element_begin_out(soap, tag, id, type) || soap_string_out(soap, *p, 0) || soap_element_end_out(soap, tag)) return soap->error; return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 char ** SOAP_FMAC2 soap_instring(struct soap *soap, const char *tag, char **p, const char *type, int t, int flag, long minlen, long maxlen) { (void)type; if (soap_element_begin_in(soap, tag, 1, NULL)) { if (!tag || *tag != '-' || soap->error != SOAP_NO_TAG) return NULL; soap->error = SOAP_OK; } if (!p) { if (!(p = (char**)soap_malloc(soap, sizeof(char*)))) return NULL; } if (soap->null) *p = NULL; else if (soap->body) { *p = soap_string_in(soap, flag, minlen, maxlen); if (!*p || !(char*)soap_id_enter(soap, soap->id, *p, t, sizeof(char*), 0, NULL, NULL, NULL)) return NULL; if (!**p && tag && *tag == '-') { soap->error = SOAP_NO_TAG; return NULL; } } else if (tag && *tag == '-') { soap->error = SOAP_NO_TAG; return NULL; } else if (!*soap->href && minlen > 0) { soap->error = SOAP_LENGTH; return NULL; } else *p = soap_strdup(soap, SOAP_STR_EOS); if (*soap->href) p = (char**)soap_id_lookup(soap, soap->href, (void**)p, t, sizeof(char**), 0); if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outwstring(struct soap *soap, const char *tag, int id, wchar_t *const*p, const char *type, int n) { id = soap_element_id(soap, tag, id, *p, NULL, 0, type, n); if (id < 0) return soap->error; if (!**p && (soap->mode & SOAP_C_NILSTRING)) return soap_element_null(soap, tag, id, type); if (soap_element_begin_out(soap, tag, id, type) || soap_wstring_out(soap, *p, 0) || soap_element_end_out(soap, tag)) return soap->error; return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_2 SOAP_FMAC1 wchar_t ** SOAP_FMAC2 soap_inwstring(struct soap *soap, const char *tag, wchar_t **p, const char *type, int t, long minlen, long maxlen) { (void)type; if (soap_element_begin_in(soap, tag, 1, NULL)) { if (!tag || *tag != '-' || soap->error != SOAP_NO_TAG) return NULL; soap->error = SOAP_OK; } if (!p) { if (!(p = (wchar_t**)soap_malloc(soap, sizeof(wchar_t*)))) return NULL; } if (soap->body) { *p = soap_wstring_in(soap, 1, minlen, maxlen); if (!*p || !(wchar_t*)soap_id_enter(soap, soap->id, *p, t, sizeof(wchar_t*), 0, NULL, NULL, NULL)) return NULL; if (!**p && tag && *tag == '-') { soap->error = SOAP_NO_TAG; return NULL; } } else if (tag && *tag == '-') { soap->error = SOAP_NO_TAG; return NULL; } else if (soap->null) *p = NULL; else *p = soap_wstrdup(soap, (wchar_t*)SOAP_STR_EOS); if (*soap->href) p = (wchar_t**)soap_id_lookup(soap, soap->href, (void**)p, t, sizeof(wchar_t**), 0); if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 time_t SOAP_FMAC2 soap_timegm(struct tm *T) { #if defined(HAVE_TIMEGM) return timegm(T); #else time_t t, g, z; struct tm tm; t = mktime(T); if (t == (time_t)-1) return (time_t)-1; #ifdef HAVE_GMTIME_R gmtime_r(&t, &tm); #else tm = *gmtime(&t); #endif tm.tm_isdst = 0; g = mktime(&tm); if (g == (time_t)-1) return (time_t)-1; z = g - t; return t - z; #endif } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 const char* SOAP_FMAC2 soap_dateTime2s(struct soap *soap, time_t n) { struct tm T, *pT = &T; #if defined(HAVE_GMTIME_R) if (gmtime_r(&n, pT)) strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%SZ", pT); #elif defined(HAVE_GMTIME) if ((pT = gmtime(&n))) strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%SZ", pT); #elif defined(HAVE_GETTIMEOFDAY) struct timezone tz; memset((void*)&tz, 0, sizeof(tz)); #if defined(HAVE_LOCALTIME_R) if (localtime_r(&n, pT)) { struct timeval tv; gettimeofday(&tv, &tz); strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT); sprintf(soap->tmpbuf + strlen(soap->tmpbuf), "%+03d:%02d", -tz.tz_minuteswest/60+(pT->tm_isdst!=0), abs(tz.tz_minuteswest)%60); } #else if ((pT = localtime(&n))) { struct timeval tv; gettimeofday(&tv, &tz); strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT); sprintf(soap->tmpbuf + strlen(soap->tmpbuf), "%+03d:%02d", -tz.tz_minuteswest/60+(pT->tm_isdst!=0), abs(tz.tz_minuteswest)%60); } #endif #elif defined(HAVE_FTIME) struct timeb t; memset((void*)&t, 0, sizeof(t)); #if defined(HAVE_LOCALTIME_R) if (localtime_r(&n, pT)) { #ifdef __BORLANDC__ ::ftime(&t); #else ftime(&t); #endif strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT); sprintf(soap->tmpbuf + strlen(soap->tmpbuf), "%+03d:%02d", -t.timezone/60+(pT->tm_isdst!=0), abs(t.timezone)%60); } #else if ((pT = localtime(&n))) { #ifdef __BORLANDC__ ::ftime(&t); #else ftime(&t); #endif strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT); sprintf(soap->tmpbuf + strlen(soap->tmpbuf), "%+03d:%02d", -t.timezone/60+(pT->tm_isdst!=0), abs(t.timezone)%60); } #endif #elif defined(HAVE_LOCALTIME_R) if (localtime_r(&n, pT)) strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT); #else if ((pT = localtime(&n))) strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT); #endif else strcpy(soap->tmpbuf, "1969-12-31T23:59:59Z"); return soap->tmpbuf; } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 int SOAP_FMAC2 soap_outdateTime(struct soap *soap, const char *tag, int id, const time_t *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_dateTime2s(soap, *p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 int SOAP_FMAC2 soap_s2dateTime(struct soap *soap, const char *s, time_t *p) { if (s) { char zone[32]; struct tm T; const char *t; *zone = '\0'; memset((void*)&T, 0, sizeof(T)); if (strchr(s, '-')) t = "%d-%d-%dT%d:%d:%d%31s"; else if (strchr(s, ':')) t = "%4d%2d%2dT%d:%d:%d%31s"; else /* parse non-XSD-standard alternative ISO 8601 format */ t = "%4d%2d%2dT%2d%2d%2d%31s"; if (sscanf(s, t, &T.tm_year, &T.tm_mon, &T.tm_mday, &T.tm_hour, &T.tm_min, &T.tm_sec, zone) < 6) return soap->error = SOAP_TYPE; if (T.tm_year == 1) T.tm_year = 70; else T.tm_year -= 1900; T.tm_mon--; if (*zone == '.') { for (s = zone + 1; *s; s++) if (*s < '0' || *s > '9') break; } else s = zone; if (*s) { #ifndef WITH_NOZONE if (*s == '+' || *s == '-') { int h = 0, m = 0; if (s[3] == ':') { /* +hh:mm */ sscanf(s, "%d:%d", &h, &m); if (h < 0) m = -m; } else /* +hhmm */ { m = (int)soap_strtol(s, NULL, 10); h = m / 100; m = m % 100; } T.tm_min -= m; T.tm_hour -= h; /* put hour and min in range */ T.tm_hour += T.tm_min / 60; T.tm_min %= 60; if (T.tm_min < 0) { T.tm_min += 60; T.tm_hour--; } T.tm_mday += T.tm_hour / 24; T.tm_hour %= 24; if (T.tm_hour < 0) { T.tm_hour += 24; T.tm_mday--; } /* note: day of the month may be out of range, timegm() handles it */ } #endif *p = soap_timegm(&T); } else /* no UTC or timezone, so assume we got a localtime */ { T.tm_isdst = -1; *p = mktime(&T); } } return soap->error; } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 time_t * SOAP_FMAC2 soap_indateTime(struct soap *soap, const char *tag, time_t *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":dateTime")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } p = (time_t*)soap_id_enter(soap, soap->id, p, t, sizeof(time_t), 0, NULL, NULL, NULL); if (*soap->href) p = (time_t*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(time_t), 0, NULL); else if (p) { if (soap_s2dateTime(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outliteral(struct soap *soap, const char *tag, char *const*p, const char *type) { int i; const char *t = NULL; if (tag && *tag != '-') { if (soap->local_namespaces && (t = strchr(tag, ':'))) { strncpy(soap->tmpbuf, tag, t-tag); soap->tmpbuf[t-tag] = '\0'; for (i = 0; soap->local_namespaces[i].id; i++) if (!strcmp(soap->tmpbuf, soap->local_namespaces[i].id)) break; t++; if (soap_element(soap, t, 0, type) || soap_attribute(soap, "xmlns", soap->local_namespaces[i].ns ? soap->local_namespaces[i].ns : SOAP_STR_EOS) || soap_element_start_end_out(soap, NULL)) return soap->error; } else { t = tag; if (soap_element_begin_out(soap, t, 0, type)) return soap->error; } } if (p && *p) { if (soap_send(soap, *p)) return soap->error; } if (t) return soap_element_end_out(soap, t); return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 char ** SOAP_FMAC2 soap_inliteral(struct soap *soap, const char *tag, char **p) { if (soap_element_begin_in(soap, tag, 1, NULL)) { if (soap->error != SOAP_NO_TAG || soap_unget(soap, soap_get(soap)) == SOAP_TT) return NULL; soap->error = SOAP_OK; } if (!p) { if (!(p = (char**)soap_malloc(soap, sizeof(char*)))) return NULL; } if (soap->body || (tag && *tag == '-')) { *p = soap_string_in(soap, 0, -1, -1); if (!*p) return NULL; if (!**p && tag && *tag == '-') { soap->error = SOAP_NO_TAG; return NULL; } } else if (soap->null) *p = NULL; else *p = soap_strdup(soap, SOAP_STR_EOS); if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outwliteral(struct soap *soap, const char *tag, wchar_t *const*p, const char *type) { int i; const char *t = NULL; if (tag && *tag != '-') { if (soap->local_namespaces && (t = strchr(tag, ':'))) { strncpy(soap->tmpbuf, tag, t-tag); soap->tmpbuf[t-tag] = '\0'; for (i = 0; soap->local_namespaces[i].id; i++) if (!strcmp(soap->tmpbuf, soap->local_namespaces[i].id)) break; t++; if (soap_element(soap, t, 0, type) || soap_attribute(soap, "xmlns", soap->local_namespaces[i].ns ? soap->local_namespaces[i].ns : SOAP_STR_EOS) || soap_element_start_end_out(soap, NULL)) return soap->error; } else { t = tag; if (soap_element_begin_out(soap, t, 0, type)) return soap->error; } if (soap_send(soap, soap->tmpbuf)) return soap->error; } if (p) { wchar_t c; const wchar_t *s = *p; while ((c = *s++)) { if (soap_pututf8(soap, (unsigned long)c)) return soap->error; } } if (t) return soap_element_end_out(soap, t); return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_2 SOAP_FMAC1 wchar_t ** SOAP_FMAC2 soap_inwliteral(struct soap *soap, const char *tag, wchar_t **p) { if (soap_element_begin_in(soap, tag, 1, NULL)) { if (soap->error != SOAP_NO_TAG || soap_unget(soap, soap_get(soap)) == SOAP_TT) return NULL; soap->error = SOAP_OK; } if (!p) { if (!(p = (wchar_t**)soap_malloc(soap, sizeof(wchar_t*)))) return NULL; } if (soap->body) { *p = soap_wstring_in(soap, 0, -1, -1); if (!*p) return NULL; if (!**p && tag && *tag == '-') { soap->error = SOAP_NO_TAG; return NULL; } } else if (tag && *tag == '-') { soap->error = SOAP_NO_TAG; return NULL; } else if (soap->null) *p = NULL; else *p = soap_wstrdup(soap, (wchar_t*)SOAP_STR_EOS); if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char * SOAP_FMAC2 soap_value(struct soap *soap) { register size_t i; register soap_wchar c = 0; register char *s = soap->tmpbuf; if (!soap->body) return SOAP_STR_EOS; do c = soap_get(soap); while (soap_blank(c)); for (i = 0; i < sizeof(soap->tmpbuf) - 1; i++) { if (c == SOAP_TT || c == SOAP_LT || (int)c == EOF) break; *s++ = (char)c; c = soap_get(soap); } for (s--; i > 0; i--, s--) { if (!soap_blank((soap_wchar)*s)) break; } s[1] = '\0'; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element content value='%s'\n", soap->tmpbuf)); if (c == SOAP_TT || c == SOAP_LT || (int)c == EOF) soap_unget(soap, c); else if (soap->mode & SOAP_XML_STRICT) { soap->error = SOAP_LENGTH; return NULL; } #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) soap->dom->data = soap_strdup(soap, soap->tmpbuf); #endif return soap->tmpbuf; /* return non-null pointer */ } #endif /******************************************************************************/ #if !defined(WITH_LEANER) || !defined(WITH_NOHTTP) #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_getline(struct soap *soap, char *s, int len) { int i = len; soap_wchar c = 0; for (;;) { while (--i > 0) { c = soap_getchar(soap); if (c == '\r' || c == '\n') break; if ((int)c == EOF) return soap->error = SOAP_CHK_EOF; *s++ = (char)c; } if (c != '\n') c = soap_getchar(soap); /* got \r or something else, now get \n */ if (c == '\n') { *s = '\0'; if (i+1 == len) /* empty line: end of HTTP/MIME header */ break; c = soap_get0(soap); if (c != ' ' && c != '\t') /* HTTP line continuation? */ break; } else if ((int)c == EOF) return soap->error = SOAP_CHK_EOF; if (i < 0) return soap->error = SOAP_HDR; } return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef PALM_1 static size_t soap_count_attachments(struct soap *soap) { #ifndef WITH_LEANER register struct soap_multipart *content; register size_t count = soap->count; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Calculating the message size with attachments, current count=%lu\n", (unsigned long)count)); if ((soap->mode & SOAP_ENC_DIME) && !(soap->mode & SOAP_ENC_MTOM)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Calculating the size of DIME attachments\n")); for (content = soap->dime.first; content; content = content->next) { count += 12 + ((content->size+3)&(~3)); if (content->id) count += ((strlen(content->id)+3)&(~3)); if (content->type) count += ((strlen(content->type)+3)&(~3)); if (content->options) count += ((((unsigned char)content->options[2] << 8) | ((unsigned char)content->options[3]))+7)&(~3); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Size of DIME attachment content is %lu bytes\n", (unsigned long)content->size)); } } if ((soap->mode & SOAP_ENC_MIME) && soap->mime.boundary) { register size_t n = strlen(soap->mime.boundary); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Calculating the size of MIME attachments\n")); for (content = soap->mime.first; content; content = content->next) { register const char *s; /* count \r\n--boundary\r\n */ count += 6 + n; /* count Content-Type: ...\r\n */ if (content->type) count += 16 + strlen(content->type); /* count Content-Transfer-Encoding: ...\r\n */ s = soap_code_str(mime_codes, content->encoding); if (s) count += 29 + strlen(s); /* count Content-ID: ...\r\n */ if (content->id) count += 14 + strlen(content->id); /* count Content-Location: ...\r\n */ if (content->location) count += 20 + strlen(content->location); /* count Content-Description: ...\r\n */ if (content->description) count += 23 + strlen(content->description); /* count \r\n...content */ count += 2 + content->size; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Size of MIME attachment content is %lu bytes\n", (unsigned long)content->size)); } /* count \r\n--boundary-- */ count += 6 + n; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "New count is %lu bytes\n", (unsigned long)count)); return count; #else return soap->count; #endif } #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 static int soap_putdimefield(struct soap *soap, const char *s, size_t n) { if (soap_send_raw(soap, s, n)) return soap->error; return soap_send_raw(soap, SOAP_STR_PADDING, -(long)n&3); } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 char * SOAP_FMAC2 soap_dime_option(struct soap *soap, unsigned short optype, const char *option) { size_t n; char *s = NULL; if (option) { n = strlen(option); s = (char*)soap_malloc(soap, n + 5); if (s) { s[0] = (char)(optype >> 8); s[1] = (char)(optype & 0xFF); s[2] = (char)(n >> 8); s[3] = (char)(n & 0xFF); strcpy(s + 4, option); } } return s; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_putdimehdr(struct soap *soap) { unsigned char tmp[12]; size_t optlen = 0, idlen = 0, typelen = 0; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Put DIME header id='%s'\n", soap->dime.id ? soap->dime.id : SOAP_STR_EOS)); if (soap->dime.options) optlen = (((unsigned char)soap->dime.options[2] << 8) | ((unsigned char)soap->dime.options[3])) + 4; if (soap->dime.id) { idlen = strlen(soap->dime.id); if (idlen > 0x0000FFFF) idlen = 0x0000FFFF; } if (soap->dime.type) { typelen = strlen(soap->dime.type); if (typelen > 0x0000FFFF) typelen = 0x0000FFFF; } tmp[0] = SOAP_DIME_VERSION | (soap->dime.flags & 0x7); tmp[1] = soap->dime.flags & 0xF0; tmp[2] = (char)(optlen >> 8); tmp[3] = (char)(optlen & 0xFF); tmp[4] = (char)(idlen >> 8); tmp[5] = (char)(idlen & 0xFF); tmp[6] = (char)(typelen >> 8); tmp[7] = (char)(typelen & 0xFF); tmp[8] = (char)(soap->dime.size >> 24); tmp[9] = (char)((soap->dime.size >> 16) & 0xFF); tmp[10] = (char)((soap->dime.size >> 8) & 0xFF); tmp[11] = (char)(soap->dime.size & 0xFF); if (soap_send_raw(soap, (char*)tmp, 12) || soap_putdimefield(soap, soap->dime.options, optlen) || soap_putdimefield(soap, soap->dime.id, idlen) || soap_putdimefield(soap, soap->dime.type, typelen)) return soap->error; return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_putdime(struct soap *soap) { struct soap_multipart *content; if (!(soap->mode & SOAP_ENC_DIME)) return SOAP_OK; for (content = soap->dime.first; content; content = content->next) { void *handle; soap->dime.size = content->size; soap->dime.id = content->id; soap->dime.type = content->type; soap->dime.options = content->options; soap->dime.flags = SOAP_DIME_VERSION | SOAP_DIME_MEDIA; if (soap->fdimereadopen && ((handle = soap->fdimereadopen(soap, (void*)content->ptr, content->id, content->type, content->options)) || soap->error)) { size_t size = content->size; if (!handle) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fdimereadopen failed\n")); return soap->error; } if (!size && ((soap->mode & SOAP_ENC_XML) || (soap->mode & SOAP_IO) == SOAP_IO_CHUNK || (soap->mode & SOAP_IO) == SOAP_IO_STORE)) { size_t chunksize = sizeof(soap->tmpbuf); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Chunked streaming DIME\n")); do { size = soap->fdimeread(soap, handle, soap->tmpbuf, chunksize); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fdimeread returned %lu bytes\n", (unsigned long)size)); if (size < chunksize) { soap->dime.flags &= ~SOAP_DIME_CF; if (!content->next) soap->dime.flags |= SOAP_DIME_ME; } else soap->dime.flags |= SOAP_DIME_CF; soap->dime.size = size; if (soap_putdimehdr(soap) || soap_putdimefield(soap, soap->tmpbuf, size)) break; if (soap->dime.id) { soap->dime.flags &= ~(SOAP_DIME_MB | SOAP_DIME_MEDIA); soap->dime.id = NULL; soap->dime.type = NULL; soap->dime.options = NULL; } } while (size >= chunksize); } else { if (!content->next) soap->dime.flags |= SOAP_DIME_ME; if (soap_putdimehdr(soap)) return soap->error; do { size_t bufsize; if (size < sizeof(soap->tmpbuf)) bufsize = size; else bufsize = sizeof(soap->tmpbuf); if (!(bufsize = soap->fdimeread(soap, handle, soap->tmpbuf, bufsize))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fdimeread failed: insufficient data (%lu bytes remaining from %lu bytes)\n", (unsigned long)size, (unsigned long)content->size)); soap->error = SOAP_CHK_EOF; break; } if (soap_send_raw(soap, soap->tmpbuf, bufsize)) break; size -= bufsize; } while (size); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fdimereadclose\n")); soap_send_raw(soap, SOAP_STR_PADDING, -(long)soap->dime.size&3); } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fdimereadclose\n")); if (soap->fdimereadclose) soap->fdimereadclose(soap, handle); } else { if (!content->next) soap->dime.flags |= SOAP_DIME_ME; if (soap_putdimehdr(soap) || soap_putdimefield(soap, (char*)content->ptr, content->size)) return soap->error; } } return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 static char * soap_getdimefield(struct soap *soap, size_t n) { register soap_wchar c; register size_t i; register char *s; register char *p = NULL; if (n) { p = (char*)soap_malloc(soap, n + 1); if (p) { s = p; for (i = n; i > 0; i--) { if ((int)(c = soap_get1(soap)) == EOF) { soap->error = SOAP_CHK_EOF; return NULL; } *s++ = (char)c; } *s = '\0'; if ((soap->error = soap_move(soap, -(long)n&3))) return NULL; } else soap->error = SOAP_EOM; } return p; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_getdimehdr(struct soap *soap) { register soap_wchar c; register char *s; register int i; unsigned char tmp[12]; size_t optlen, idlen, typelen; if (!(soap->mode & SOAP_ENC_DIME)) return soap->error = SOAP_DIME_END; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get DIME header\n")); if (soap->dime.buflen || soap->dime.chunksize) { if (soap_move(soap, (long)(soap->dime.size - soap_tell(soap)))) return soap->error = SOAP_CHK_EOF; soap_unget(soap, soap_getchar(soap)); /* skip padding and get hdr */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "... From chunked\n")); return SOAP_OK; } s = (char*)tmp; for (i = 12; i > 0; i--) { if ((int)(c = soap_getchar(soap)) == EOF) return soap->error = SOAP_CHK_EOF; *s++ = (char)c; } if ((tmp[0] & 0xF8) != SOAP_DIME_VERSION) return soap->error = SOAP_DIME_MISMATCH; soap->dime.flags = (tmp[0] & 0x7) | (tmp[1] & 0xF0); optlen = (tmp[2] << 8) | tmp[3]; idlen = (tmp[4] << 8) | tmp[5]; typelen = (tmp[6] << 8) | tmp[7]; soap->dime.size = (tmp[8] << 24) | (tmp[9] << 16) | (tmp[10] << 8) | tmp[11]; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DIME size=%lu flags=0x%X\n", (unsigned long)soap->dime.size, soap->dime.flags)); if (!(soap->dime.options = soap_getdimefield(soap, optlen)) && soap->error) return soap->error; if (!(soap->dime.id = soap_getdimefield(soap, idlen)) && soap->error) return soap->error; if (!(soap->dime.type = soap_getdimefield(soap, typelen)) && soap->error) return soap->error; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DIME id=%s, type=%s, options=%s\n", soap->dime.id ? soap->dime.id : SOAP_STR_EOS, soap->dime.type ? soap->dime.type : "", soap->dime.options ? soap->dime.options+4 : SOAP_STR_EOS)); if (soap->dime.flags & SOAP_DIME_ME) soap->mode &= ~SOAP_ENC_DIME; return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_getdime(struct soap *soap) { while (soap->dime.flags & SOAP_DIME_CF) { if (soap_getdimehdr(soap)) return soap->error; if (soap_move(soap, (long)soap->dime.size)) return soap->error = SOAP_EOF; } if (soap_move(soap, (long)(((soap->dime.size+3)&(~3))-soap_tell(soap)))) return soap->error = SOAP_EOF; for (;;) { register struct soap_multipart *content; if (soap_getdimehdr(soap)) break; if (soap->fdimewriteopen && ((soap->dime.ptr = (char*)soap->fdimewriteopen(soap, soap->dime.id, soap->dime.type, soap->dime.options)) || soap->error)) { const char *id, *type, *options; size_t size, n; if (!soap->dime.ptr) return soap->error; id = soap->dime.id; type = soap->dime.type; options = soap->dime.options; for (;;) { size = soap->dime.size; for (;;) { n = soap->buflen - soap->bufidx; if (size < n) n = size; if ((soap->error = soap->fdimewrite(soap, (void*)soap->dime.ptr, soap->buf + soap->bufidx, n))) break; size -= n; if (!size) { soap->bufidx += n; break; } if (soap_recv(soap)) { soap->error = SOAP_EOF; goto end; } } if (soap_move(soap, -(long)soap->dime.size&3)) { soap->error = SOAP_EOF; break; } if (!(soap->dime.flags & SOAP_DIME_CF)) break; if (soap_getdimehdr(soap)) break; } end: if (soap->fdimewriteclose) soap->fdimewriteclose(soap, (void*)soap->dime.ptr); soap->dime.size = 0; soap->dime.id = id; soap->dime.type = type; soap->dime.options = options; } else if (soap->dime.flags & SOAP_DIME_CF) { const char *id, *type, *options; id = soap->dime.id; type = soap->dime.type; options = soap->dime.options; if (soap_new_block(soap) == NULL) return SOAP_EOM; for (;;) { register soap_wchar c; register size_t i; register char *s; s = (char*)soap_push_block(soap, NULL, soap->dime.size); if (!s) return soap->error = SOAP_EOM; for (i = soap->dime.size; i > 0; i--) { if ((int)(c = soap_get1(soap)) == EOF) return soap->error = SOAP_EOF; *s++ = (char)c; } if (soap_move(soap, -(long)soap->dime.size&3)) return soap->error = SOAP_EOF; if (!(soap->dime.flags & SOAP_DIME_CF)) break; if (soap_getdimehdr(soap)) return soap->error; } soap->dime.size = soap->blist->size++; /* allocate one more for '\0' */ if (!(soap->dime.ptr = soap_save_block(soap, NULL, NULL, 0))) return soap->error; soap->dime.ptr[soap->dime.size] = '\0'; /* force 0-terminated */ soap->dime.id = id; soap->dime.type = type; soap->dime.options = options; } else soap->dime.ptr = soap_getdimefield(soap, soap->dime.size); content = soap_new_multipart(soap, &soap->dime.first, &soap->dime.last, soap->dime.ptr, soap->dime.size); if (!content) return soap->error = SOAP_EOM; content->id = soap->dime.id; content->type = soap->dime.type; content->options = soap->dime.options; if (soap->error) return soap->error; soap_resolve_attachment(soap, content); } if (soap->error != SOAP_DIME_END) return soap->error; return soap->error = SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_getmimehdr(struct soap *soap) { struct soap_multipart *content; do { if (soap_getline(soap, soap->msgbuf, sizeof(soap->msgbuf))) return soap->error; } while (!*soap->msgbuf); if (soap->msgbuf[0] == '-' && soap->msgbuf[1] == '-') { char *s = soap->msgbuf + strlen(soap->msgbuf) - 1; /* remove white space */ while (soap_blank((soap_wchar)*s)) s--; s[1] = '\0'; if (soap->mime.boundary) { if (strcmp(soap->msgbuf + 2, soap->mime.boundary)) return soap->error = SOAP_MIME_ERROR; } else soap->mime.boundary = soap_strdup(soap, soap->msgbuf + 2); if (soap_getline(soap, soap->msgbuf, sizeof(soap->msgbuf))) return soap->error; } if (soap_set_mime_attachment(soap, NULL, 0, SOAP_MIME_NONE, NULL, NULL, NULL, NULL)) return soap->error = SOAP_EOM; content = soap->mime.last; for (;;) { register char *key = soap->msgbuf; register char *val; if (!*key) break; DBGLOG(TEST,SOAP_MESSAGE(fdebug, "MIME header: %s\n", key)); val = strchr(soap->msgbuf, ':'); if (val) { *val = '\0'; do val++; while (*val && *val <= 32); if (!soap_tag_cmp(key, "Content-ID")) content->id = soap_strdup(soap, val); else if (!soap_tag_cmp(key, "Content-Location")) content->location = soap_strdup(soap, val); else if (!soap_tag_cmp(key, "Content-Disposition")) content->id = soap_strdup(soap, soap_get_header_attribute(soap, val, "name")); else if (!soap_tag_cmp(key, "Content-Type")) content->type = soap_strdup(soap, val); else if (!soap_tag_cmp(key, "Content-Description")) content->description = soap_strdup(soap, val); else if (!soap_tag_cmp(key, "Content-Transfer-Encoding")) content->encoding = (enum soap_mime_encoding)soap_code_int(mime_codes, val, (long)SOAP_MIME_NONE); } if (soap_getline(soap, key, sizeof(soap->msgbuf))) return soap->error; } return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_getmime(struct soap *soap) { while (soap_get_mime_attachment(soap, NULL)) ; return soap->error; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_post_check_mime_attachments(struct soap *soap) { soap->imode |= SOAP_MIME_POSTCHECK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_check_mime_attachments(struct soap *soap) { if (soap->mode & SOAP_MIME_POSTCHECK) return soap_get_mime_attachment(soap, NULL) != NULL; return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 struct soap_multipart * SOAP_FMAC2 soap_get_mime_attachment(struct soap *soap, void *handle) { register soap_wchar c = 0; register size_t i, m = 0; register char *s, *t = NULL; register struct soap_multipart *content; register short flag = 0; if (!(soap->mode & SOAP_ENC_MIME)) return NULL; content = soap->mime.last; if (!content) { if (soap_getmimehdr(soap)) return NULL; content = soap->mime.last; } else if (content != soap->mime.first) { if (soap->fmimewriteopen && ((content->ptr = (char*)soap->fmimewriteopen(soap, (void*)handle, content->id, content->type, content->description, content->encoding)) || soap->error)) { if (!content->ptr) return NULL; } } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Parsing MIME content id=%s type=%s\n", content->id ? content->id : SOAP_STR_EOS, content->type ? content->type : SOAP_STR_EOS)); if (!content->ptr && soap_new_block(soap) == NULL) { soap->error = SOAP_EOM; return NULL; } for (;;) { if (content->ptr) s = soap->tmpbuf; else if (!(s = (char*)soap_push_block(soap, NULL, sizeof(soap->tmpbuf)))) { soap->error = SOAP_EOM; return NULL; } for (i = 0; i < sizeof(soap->tmpbuf); i++) { if (m > 0) { *s++ = *t++; m--; } else { if (!flag) { c = soap_get1(soap); if ((int)c == EOF) { soap->error = SOAP_CHK_EOF; return NULL; } } if (flag || c == '\r') { t = soap->msgbuf; memset(t, 0, sizeof(soap->msgbuf)); strcpy(t, "\n--"); if (soap->mime.boundary) strncat(t, soap->mime.boundary, sizeof(soap->msgbuf)-4); do c = soap_getchar(soap); while (c == *t++); if ((int)c == EOF) { soap->error = SOAP_CHK_EOF; return NULL; } if (!*--t) goto end; *t = (char)c; flag = (c == '\r'); m = t - soap->msgbuf + 1 - flag; t = soap->msgbuf; c = '\r'; } *s++ = (char)c; } } if (content->ptr && soap->fmimewrite) { if ((soap->error = soap->fmimewrite(soap, (void*)content->ptr, soap->tmpbuf, i))) break; } } end: *s = '\0'; /* force 0-terminated */ if (content->ptr) { if (!soap->error && soap->fmimewrite) soap->error = soap->fmimewrite(soap, (void*)content->ptr, soap->tmpbuf, i); if (soap->fmimewriteclose) soap->fmimewriteclose(soap, (void*)content->ptr); if (soap->error) return NULL; } else { content->size = soap_size_block(soap, NULL, i+1)-1; content->ptr = soap_save_block(soap, NULL, NULL, 0); } soap_resolve_attachment(soap, content); if (c == '-' && soap_getchar(soap) == '-') { soap->mode &= ~SOAP_ENC_MIME; if ((soap->mode & SOAP_MIME_POSTCHECK) && soap_end_recv(soap)) { if (soap->keep_alive < 0) soap->keep_alive = 0; soap_closesock(soap); return NULL; } } else { while (c != '\r' && (int)c != EOF && soap_blank(c)) c = soap_getchar(soap); if (c != '\r' || soap_getchar(soap) != '\n') { soap->error = SOAP_MIME_ERROR; return NULL; } if (soap_getmimehdr(soap)) return NULL; } return content; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_match_cid(struct soap *soap, const char *s, const char *t) { register size_t n; if (!s) return 1; if (!strcmp(s, t)) return 0; if (!strncmp(s, "cid:", 4)) s += 4; n = strlen(t); if (*t == '<') { t++; n -= 2; } if (!strncmp(s, t, n) && !s[n]) return 0; soap_decode(soap->tmpbuf, sizeof(soap->tmpbuf), s, SOAP_STR_EOS); if (!strncmp(soap->tmpbuf, t, n) && !soap->tmpbuf[n]) return 0; return 1; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 static void soap_resolve_attachment(struct soap *soap, struct soap_multipart *content) { if (content->id) { register struct soap_xlist **xp = &soap->xlist; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolving attachment data for id=%s\n", content->id)); while (*xp) { register struct soap_xlist *xq = *xp; if (!soap_match_cid(soap, xq->id, content->id)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Found matching attachment %s for content id=%s\n", xq->id, content->id)); *xp = xq->next; *xq->ptr = (unsigned char*)content->ptr; *xq->size = (int)content->size; *xq->type = (char*)content->type; if (content->options) *xq->options = (char*)content->options; else *xq->options = (char*)content->description; SOAP_FREE(soap, xq); } else xp = &(*xp)->next; } } } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_putmimehdr(struct soap *soap, struct soap_multipart *content) { const char *s; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "MIME attachment type=%s\n", content->type ? content->type : SOAP_STR_EOS)); if (soap_send3(soap, "\r\n--", soap->mime.boundary, "\r\n")) return soap->error; if (content->type && soap_send3(soap, "Content-Type: ", content->type, "\r\n")) return soap->error; s = soap_code_str(mime_codes, content->encoding); if (s && soap_send3(soap, "Content-Transfer-Encoding: ", s, "\r\n")) return soap->error; if (content->id && soap_send3(soap, "Content-ID: ", content->id, "\r\n")) return soap->error; if (content->location && soap_send3(soap, "Content-Location: ", content->location, "\r\n")) return soap->error; if (content->description && soap_send3(soap, "Content-Description: ", content->description, "\r\n")) return soap->error; return soap_send_raw(soap, "\r\n", 2); } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_putmime(struct soap *soap) { struct soap_multipart *content; if (!(soap->mode & SOAP_ENC_MIME) || !soap->mime.boundary) return SOAP_OK; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Sending MIME attachments\n")); for (content = soap->mime.first; content; content = content->next) { void *handle; if (soap->fmimereadopen && ((handle = soap->fmimereadopen(soap, (void*)content->ptr, content->id, content->type, content->description)) || soap->error)) { size_t size = content->size; if (!handle) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fmimereadopen failed\n")); return soap->error; } if (soap_putmimehdr(soap, content)) return soap->error; if (!size) { if ((soap->mode & SOAP_ENC_XML) || (soap->mode & SOAP_IO) == SOAP_IO_CHUNK || (soap->mode & SOAP_IO) == SOAP_IO_STORE) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Chunked streaming MIME\n")); do { size = soap->fmimeread(soap, handle, soap->tmpbuf, sizeof(soap->tmpbuf)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fmimeread returned %lu bytes\n", (unsigned long)size)); if (soap_send_raw(soap, soap->tmpbuf, size)) break; } while (size); } else { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Error: cannot chunk streaming MIME (no HTTP chunking)\n")); } } else { do { size_t bufsize; if (size < sizeof(soap->tmpbuf)) bufsize = size; else bufsize = sizeof(soap->tmpbuf); if (!(bufsize = soap->fmimeread(soap, handle, soap->tmpbuf, bufsize))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fmimeread failed: insufficient data (%lu bytes remaining from %lu bytes)\n", (unsigned long)size, (unsigned long)content->size)); soap->error = SOAP_EOF; break; } if (soap_send_raw(soap, soap->tmpbuf, bufsize)) break; size -= bufsize; } while (size); } if (soap->fmimereadclose) soap->fmimereadclose(soap, handle); } else { if (soap_putmimehdr(soap, content) || soap_send_raw(soap, content->ptr, content->size)) return soap->error; } } return soap_send3(soap, "\r\n--", soap->mime.boundary, "--"); } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_set_dime(struct soap *soap) { soap->omode |= SOAP_ENC_DIME; soap->dime.first = NULL; soap->dime.last = NULL; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_set_mime(struct soap *soap, const char *boundary, const char *start) { soap->omode |= SOAP_ENC_MIME; soap->mime.first = NULL; soap->mime.last = NULL; soap->mime.boundary = soap_strdup(soap, boundary); soap->mime.start = soap_strdup(soap, start); } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_clr_dime(struct soap *soap) { soap->omode &= ~SOAP_ENC_DIME; soap->dime.first = NULL; soap->dime.last = NULL; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_clr_mime(struct soap *soap) { soap->omode &= ~SOAP_ENC_MIME; soap->mime.first = NULL; soap->mime.last = NULL; soap->mime.boundary = NULL; soap->mime.start = NULL; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 static struct soap_multipart* soap_new_multipart(struct soap *soap, struct soap_multipart **first, struct soap_multipart **last, char *ptr, size_t size) { struct soap_multipart *content; content = (struct soap_multipart*)soap_malloc(soap, sizeof(struct soap_multipart)); if (content) { content->next = NULL; content->ptr = ptr; content->size = size; content->id = NULL; content->type = NULL; content->options = NULL; content->encoding = SOAP_MIME_NONE; content->location = NULL; content->description = NULL; if (!*first) *first = content; if (*last) (*last)->next = content; *last = content; } return content; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_set_dime_attachment(struct soap *soap, char *ptr, size_t size, const char *type, const char *id, unsigned short optype, const char *option) { struct soap_multipart *content = soap_new_multipart(soap, &soap->dime.first, &soap->dime.last, ptr, size); if (!content) return SOAP_EOM; content->id = soap_strdup(soap, id); content->type = soap_strdup(soap, type); content->options = soap_dime_option(soap, optype, option); return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_set_mime_attachment(struct soap *soap, char *ptr, size_t size, enum soap_mime_encoding encoding, const char *type, const char *id, const char *location, const char *description) { struct soap_multipart *content = soap_new_multipart(soap, &soap->mime.first, &soap->mime.last, ptr, size); if (!content) return SOAP_EOM; content->id = soap_strdup(soap, id); content->type = soap_strdup(soap, type); content->encoding = encoding; content->location = soap_strdup(soap, location); content->description = soap_strdup(soap, description); return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 struct soap_multipart* SOAP_FMAC2 soap_next_multipart(struct soap_multipart *content) { if (content) return content->next; return NULL; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 static void soap_select_mime_boundary(struct soap *soap) { while (!soap->mime.boundary || soap_valid_mime_boundary(soap)) { register char *s = soap->mime.boundary; register size_t n = 0; if (s) n = strlen(s); if (n < 16) { n = 64; s = soap->mime.boundary = (char*)soap_malloc(soap, n + 1); if (!s) return; } strcpy(s, "=="); s += 2; n -= 4; while (n) { *s++ = soap_base64o[soap_random & 0x3F]; n--; } strcpy(s, "=="); } if (!soap->mime.start) soap->mime.start = ""; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 static int soap_valid_mime_boundary(struct soap *soap) { register struct soap_multipart *content; register size_t k; if (soap->fmimeread) return SOAP_OK; k = strlen(soap->mime.boundary); for (content = soap->mime.first; content; content = content->next) { if (content->ptr && content->size >= k) { register const char *p = (const char*)content->ptr; register size_t i; for (i = 0; i < content->size - k; i++, p++) { if (!strncmp(p, soap->mime.boundary, k)) return SOAP_ERR; } } } return SOAP_OK; } #endif #endif /******************************************************************************/ #ifdef WITH_GZIP #ifndef PALM_1 static int soap_getgziphdr(struct soap *soap) { int i; soap_wchar c = 0, f = 0; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get gzip header\n")); for (i = 0; i < 9; i++) { if ((int)(c = soap_get1(soap) == EOF)) return soap->error = SOAP_ZLIB_ERROR; if (i == 1 && c == 8) soap->z_dict = 0; if (i == 2) f = c; } if (f & 0x04) /* FEXTRA */ { for (i = soap_get1(soap) | (soap_get1(soap) << 8); i; i--) { if ((int)soap_get1(soap) == EOF) return soap->error = SOAP_ZLIB_ERROR; } } if (f & 0x08) /* skip FNAME */ { do c = soap_get1(soap); while (c && (int)c != EOF); } if ((int)c != EOF && (f & 0x10)) /* skip FCOMMENT */ { do c = soap_get1(soap); while (c && (int)c != EOF); } if ((int)c != EOF && (f & 0x02)) /* skip FHCRC (CRC32 is used) */ { if ((int)(c = soap_get1(soap)) != EOF) c = soap_get1(soap); } if ((int)c == EOF) return soap->error = SOAP_ZLIB_ERROR; return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_begin_serve(struct soap *soap) { #ifdef WITH_FASTCGI if (FCGI_Accept() < 0) { soap->error = SOAP_EOF; return soap_send_fault(soap); } #endif soap_begin(soap); if (soap_begin_recv(soap) || soap_envelope_begin_in(soap) || soap_recv_header(soap) || soap_body_begin_in(soap)) { if (soap->error < SOAP_STOP) { #ifdef WITH_FASTCGI soap_send_fault(soap); #else return soap_send_fault(soap); #endif } return soap_closesock(soap); } return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_begin_recv(struct soap *soap) { register soap_wchar c; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Initializing for input\n")); soap->error = SOAP_OK; soap->filterstop = SOAP_OK; soap_free_temp(soap); soap_set_local_namespaces(soap); soap->version = 0; /* don't assume we're parsing SOAP content by default */ #ifndef WITH_NOIDREF soap_free_iht(soap); #endif if ((soap->imode & SOAP_IO) == SOAP_IO_CHUNK) soap->omode |= SOAP_IO_CHUNK; soap->imode &= ~(SOAP_IO | SOAP_ENC_MIME); soap->mode = soap->imode; if (!soap->keep_alive) { soap->buflen = 0; soap->bufidx = 0; } if (!(soap->mode & SOAP_IO_KEEPALIVE)) soap->keep_alive = 0; soap->ahead = 0; soap->peeked = 0; soap->level = 0; soap->part = SOAP_BEGIN; soap->alloced = 0; soap->count = 0; soap->length = 0; soap->cdata = 0; *soap->endpoint = '\0'; soap->action = NULL; soap->header = NULL; soap->fault = NULL; soap->status = 0; soap->fform = NULL; #ifndef WITH_LEANER soap->dom = NULL; soap->dime.chunksize = 0; soap->dime.buflen = 0; soap->dime.list = NULL; soap->dime.first = NULL; soap->dime.last = NULL; soap->mime.list = NULL; soap->mime.first = NULL; soap->mime.last = NULL; soap->mime.boundary = NULL; soap->mime.start = NULL; #endif #ifdef WIN32 #ifndef UNDER_CE #ifndef WITH_FASTCGI if (!soap_valid_socket(soap->socket)) #ifdef __BORLANDC__ setmode(soap->recvfd, _O_BINARY); #else _setmode(soap->recvfd, _O_BINARY); #endif #endif #endif #endif #ifdef WITH_ZLIB soap->mode &= ~SOAP_ENC_ZLIB; soap->zlib_in = SOAP_ZLIB_NONE; soap->zlib_out = SOAP_ZLIB_NONE; soap->d_stream->next_in = Z_NULL; soap->d_stream->avail_in = 0; soap->d_stream->next_out = (Byte*)soap->buf; soap->d_stream->avail_out = SOAP_BUFLEN; soap->z_ratio_in = 1.0; #endif #ifdef WITH_OPENSSL if (soap->ssl) ERR_clear_error(); #endif #ifndef WITH_LEANER if (soap->fprepareinitrecv && (soap->error = soap->fprepareinitrecv(soap))) return soap->error; #endif c = soap_getchar(soap); #ifdef WITH_GZIP if (c == 0x1F) { if (soap_getgziphdr(soap)) return soap->error; if (inflateInit2(soap->d_stream, -MAX_WBITS) != Z_OK) return soap->error = SOAP_ZLIB_ERROR; if (soap->z_dict) { if (inflateSetDictionary(soap->d_stream, (const Bytef*)soap->z_dict, soap->z_dict_len) != Z_OK) return soap->error = SOAP_ZLIB_ERROR; } soap->zlib_state = SOAP_ZLIB_INFLATE; soap->mode |= SOAP_ENC_ZLIB; soap->zlib_in = SOAP_ZLIB_GZIP; soap->z_crc = crc32(0L, NULL, 0); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "gzip initialized\n")); if (!soap->z_buf) soap->z_buf = (char*)SOAP_MALLOC(soap, SOAP_BUFLEN); memcpy(soap->z_buf, soap->buf, SOAP_BUFLEN); /* should not chunk over plain transport, so why bother to check? */ /* if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK) */ /* soap->z_buflen = soap->bufidx; */ /* else */ soap->d_stream->next_in = (Byte*)(soap->z_buf + soap->bufidx); soap->d_stream->avail_in = (unsigned int)(soap->buflen - soap->bufidx); soap->z_buflen = soap->buflen; soap->buflen = soap->bufidx; c = ' '; } #endif while (soap_blank(c)) c = soap_getchar(soap); #ifndef WITH_LEANER if (c == '-' && soap_get0(soap) == '-') soap->mode |= SOAP_ENC_MIME; else if ((c & 0xFFFC) == (SOAP_DIME_VERSION | SOAP_DIME_MB) && (soap_get0(soap) & 0xFFF0) == 0x20) soap->mode |= SOAP_ENC_DIME; else #endif { /* skip BOM */ if (c == 0xEF && soap_get0(soap) == 0xBB) { c = soap_get1(soap); if ((c = soap_get1(soap)) == 0xBF) { soap->mode &= ~SOAP_ENC_LATIN; c = soap_getchar(soap); } else c = (0x0F << 12) | (0xBB << 6) | (c & 0x3F); /* UTF-8 */ } else if ((c == 0xFE && soap_get0(soap) == 0xFF) /* UTF-16 BE */ || (c == 0xFF && soap_get0(soap) == 0xFE)) /* UTF-16 LE */ return soap->error = SOAP_UTF_ERROR; /* skip space */ while (soap_blank(c)) c = soap_getchar(soap); } if ((int)c == EOF) return soap->error = SOAP_CHK_EOF; soap_unget(soap, c); #ifndef WITH_NOHTTP /* if not XML or MIME/DIME/ZLIB, assume HTTP header */ if (c != '<' && !(soap->mode & (SOAP_ENC_MIME | SOAP_ENC_DIME | SOAP_ENC_ZLIB))) { soap_mode m = soap->imode; soap->mode &= ~SOAP_IO; soap->error = soap->fparse(soap); if (soap->error && soap->error < SOAP_STOP) { soap->keep_alive = 0; /* force close later */ return soap->error; } if (soap->error == SOAP_STOP) { if (soap->fform) { soap->error = soap->fform(soap); if (soap->error == SOAP_OK) soap->error = SOAP_STOP; /* prevents further processing */ } return soap->error; } soap->mode = soap->imode; /* if imode is changed, effectuate */ soap->imode = m; /* restore imode */ #ifdef WITH_ZLIB soap->mode &= ~SOAP_ENC_ZLIB; #endif if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK) { soap->chunkbuflen = soap->buflen; soap->buflen = soap->bufidx; soap->chunksize = 0; } /* Note: fparse should not use soap_unget to push back last char */ if (soap_get0(soap) == (int)EOF) { if (soap->status == 200) return soap->error = SOAP_NO_DATA; /* HTTP OK: always expect data */ return soap->error = soap->status; } #ifdef WITH_ZLIB if (soap->zlib_in != SOAP_ZLIB_NONE) { #ifdef WITH_GZIP if (soap->zlib_in != SOAP_ZLIB_DEFLATE) { c = soap_get1(soap); if (c == 0x1F) { if (soap_getgziphdr(soap)) return soap->error; if (inflateInit2(soap->d_stream, -MAX_WBITS) != Z_OK) return soap->error = SOAP_ZLIB_ERROR; soap->z_crc = crc32(0L, NULL, 0); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "gzip initialized\n")); } else { soap_revget1(soap); if (inflateInit(soap->d_stream) != Z_OK) return soap->error = SOAP_ZLIB_ERROR; soap->zlib_in = SOAP_ZLIB_DEFLATE; } } else #endif if (inflateInit(soap->d_stream) != Z_OK) return soap->error = SOAP_ZLIB_ERROR; if (soap->z_dict) { if (inflateSetDictionary(soap->d_stream, (const Bytef*)soap->z_dict, soap->z_dict_len) != Z_OK) return soap->error = SOAP_ZLIB_ERROR; } soap->zlib_state = SOAP_ZLIB_INFLATE; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflate initialized\n")); soap->mode |= SOAP_ENC_ZLIB; if (!soap->z_buf) soap->z_buf = (char*)SOAP_MALLOC(soap, SOAP_BUFLEN); memcpy(soap->z_buf, soap->buf, SOAP_BUFLEN); soap->d_stream->next_in = (Byte*)(soap->z_buf + soap->bufidx); soap->d_stream->avail_in = (unsigned int)(soap->buflen - soap->bufidx); soap->z_buflen = soap->buflen; soap->buflen = soap->bufidx; } #endif #ifndef WITH_LEANER if (soap->fpreparerecv && (soap->mode & SOAP_IO) != SOAP_IO_CHUNK && soap->buflen > soap->bufidx) { int r; if ((r = soap->fpreparerecv(soap, soap->buf + soap->bufidx, soap->buflen - soap->bufidx))) return soap->error = r; } #endif if (soap->error) { if (soap->error == SOAP_FORM && soap->fform) { soap->error = soap->fform(soap); if (soap->error == SOAP_OK) soap->error = SOAP_STOP; /* prevents further processing */ } return soap->error; } } #endif #ifndef WITH_LEANER if (soap->mode & SOAP_ENC_MIME) { do /* skip preamble */ { if ((int)(c = soap_getchar(soap)) == EOF) return soap->error = SOAP_CHK_EOF; } while (c != '-' || soap_get0(soap) != '-'); soap_unget(soap, c); if (soap_getmimehdr(soap)) return soap->error; if (soap->mime.start) { do { if (!soap->mime.last->id) break; if (!soap_match_cid(soap, soap->mime.start, soap->mime.last->id)) break; } while (soap_get_mime_attachment(soap, NULL)); } if (soap_get_header_attribute(soap, soap->mime.first->type, "application/dime")) soap->mode |= SOAP_ENC_DIME; } if (soap->mode & SOAP_ENC_DIME) { if (soap_getdimehdr(soap)) return soap->error; if (soap->dime.flags & SOAP_DIME_CF) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Chunked DIME SOAP message\n")); soap->dime.chunksize = soap->dime.size; if (soap->buflen - soap->bufidx >= soap->dime.chunksize) { soap->dime.buflen = soap->buflen; soap->buflen = soap->bufidx + soap->dime.chunksize; } else soap->dime.chunksize -= soap->buflen - soap->bufidx; } soap->count = soap->buflen - soap->bufidx; } #endif return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_begin_out(struct soap *soap) { #ifndef WITH_LEANER size_t n = 0; if ((soap->mode & SOAP_ENC_MIME) && soap->mime.boundary && soap->mime.start && strlen(soap->mime.boundary) + strlen(soap->mime.start) < sizeof(soap->tmpbuf) - 80 ) { const char *s; if ((soap->mode & SOAP_ENC_DIME) && !(soap->mode & SOAP_ENC_MTOM)) s = "application/dime"; else if (soap->version == 2) { if (soap->mode & SOAP_ENC_MTOM) s = "application/xop+xml; charset=utf-8; type=\"application/soap+xml\""; else s = "application/soap+xml; charset=utf-8"; } else if (soap->mode & SOAP_ENC_MTOM) s = "application/xop+xml; charset=utf-8; type=\"text/xml\""; else s = "text/xml; charset=utf-8"; sprintf(soap->tmpbuf, "--%s\r\nContent-Type: %s\r\nContent-Transfer-Encoding: binary\r\nContent-ID: %s\r\n\r\n", soap->mime.boundary, s, soap->mime.start); n = strlen(soap->tmpbuf); if (soap_send_raw(soap, soap->tmpbuf, n)) return soap->error; } if (soap->mode & SOAP_IO_LENGTH) soap->dime.size = soap->count; /* DIME in MIME correction */ if (!(soap->mode & SOAP_IO_LENGTH) && (soap->mode & SOAP_ENC_DIME)) { if (soap_putdimehdr(soap)) return soap->error; } #endif soap->part = SOAP_IN_ENVELOPE; return soap_element_begin_out(soap, "SOAP-ENV:Envelope", 0, NULL); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_end_out(struct soap *soap) { if (soap_element_end_out(soap, "SOAP-ENV:Envelope") || soap_send_raw(soap, "\r\n", 2)) /* 2.8: always emit \r\n */ return soap->error; #ifndef WITH_LEANER if ((soap->mode & SOAP_IO_LENGTH) && (soap->mode & SOAP_ENC_DIME) && !(soap->mode & SOAP_ENC_MTOM)) { soap->dime.size = soap->count - soap->dime.size; /* DIME in MIME correction */ sprintf(soap->id, soap->dime_id_format, 0); soap->dime.id = soap->id; if (soap->local_namespaces) { if (soap->local_namespaces[0].out) soap->dime.type = (char*)soap->local_namespaces[0].out; else soap->dime.type = (char*)soap->local_namespaces[0].ns; } soap->dime.options = NULL; soap->dime.flags = SOAP_DIME_MB | SOAP_DIME_ABSURI; if (!soap->dime.first) soap->dime.flags |= SOAP_DIME_ME; soap->count += 12 + ((strlen(soap->dime.id)+3)&(~3)) + (soap->dime.type ? ((strlen(soap->dime.type)+3)&(~3)) : 0); } if ((soap->mode & SOAP_ENC_DIME) && !(soap->mode & SOAP_ENC_MTOM)) return soap_send_raw(soap, SOAP_STR_PADDING, -(long)soap->dime.size&3); #endif soap->part = SOAP_END_ENVELOPE; return SOAP_OK; } #endif /******************************************************************************/ #ifndef WITH_LEAN #ifndef PALM_1 SOAP_FMAC1 char* SOAP_FMAC2 soap_get_http_body(struct soap *soap) { #ifndef WITH_LEAN register size_t l = 0, n = 0; register char *s; /* get HTML body of HTTP error content */ if (!(soap->mode & SOAP_ENC_ZLIB) && (soap->mode & SOAP_IO) != SOAP_IO_CHUNK) { n = soap->length; if (!n) return NULL; } #ifdef WITH_FAST soap->labidx = 0; /* use look-aside buffer */ #else if (soap_new_block(soap) == NULL) return NULL; #endif for (;;) { #ifdef WITH_FAST register size_t i, k; if (soap_append_lab(soap, NULL, 0)) /* allocate more space in look-aside buffer if necessary */ return NULL; s = soap->labbuf + soap->labidx; /* space to populate */ k = soap->lablen - soap->labidx; /* number of bytes available */ soap->labidx = soap->lablen; /* claim this space */ #else register size_t i, k = SOAP_BLKLEN; if (!(s = (char*)soap_push_block(soap, NULL, k))) return NULL; #endif for (i = 0; i < k; i++) { register soap_wchar c; l++; if (n > 0 && l > n) goto end; c = soap_getchar(soap); if ((int)c == EOF) goto end; *s++ = (char)(c & 0xFF); } } end: *s = '\0'; #ifdef WITH_FAST s = soap_strdup(soap, soap->labbuf); #else soap_size_block(soap, NULL, i+1); s = soap_save_block(soap, NULL, 0); #endif return s; #else return NULL; #endif } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_begin_in(struct soap *soap) { register struct Namespace *p; soap->part = SOAP_IN_ENVELOPE; if (soap_element_begin_in(soap, "SOAP-ENV:Envelope", 0, NULL)) { if (soap->error == SOAP_TAG_MISMATCH && !soap_element_begin_in(soap, "Envelope", 0, NULL)) soap->error = SOAP_VERSIONMISMATCH; else if (soap->status) soap->error = soap->status; return soap->error; } p = soap->local_namespaces; if (p) { const char *ns = p[0].out; if (!ns) ns = p[0].ns; if (!strcmp(ns, soap_env1)) { soap->version = 1; /* make sure we use SOAP 1.1 */ if (p[1].out) SOAP_FREE(soap, p[1].out); if ((p[1].out = (char*)SOAP_MALLOC(soap, sizeof(soap_enc1)))) strcpy(p[1].out, soap_enc1); } else if (!strcmp(ns, soap_env2)) { soap->version = 2; /* make sure we use SOAP 1.2 */ if (p[1].out) SOAP_FREE(soap, p[1].out); if ((p[1].out = (char*)SOAP_MALLOC(soap, sizeof(soap_enc2)))) strcpy(p[1].out, soap_enc2); } } return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_end_in(struct soap *soap) { soap->part = SOAP_END_ENVELOPE; return soap_element_end_in(soap, "SOAP-ENV:Envelope"); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_body_begin_out(struct soap *soap) { soap->part = SOAP_IN_BODY; if (soap->version == 1) soap->encoding = 1; #ifndef WITH_LEAN if ((soap->mode & SOAP_SEC_WSUID) && soap_set_attr(soap, "wsu:Id", "Body", 1)) return soap->error; #endif return soap_element_begin_out(soap, "SOAP-ENV:Body", 0, NULL); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_body_end_out(struct soap *soap) { if (soap_element_end_out(soap, "SOAP-ENV:Body")) return soap->error; soap->part = SOAP_END_BODY; return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_body_begin_in(struct soap *soap) { soap->part = SOAP_IN_BODY; if (soap_element_begin_in(soap, "SOAP-ENV:Body", 0, NULL)) return soap->error; if (!soap->body) soap->part = SOAP_NO_BODY; return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_body_end_in(struct soap *soap) { if (soap->part == SOAP_NO_BODY) return soap->error = SOAP_OK; soap->part = SOAP_END_BODY; return soap_element_end_in(soap, "SOAP-ENV:Body"); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_recv_header(struct soap *soap) { if (soap_getheader(soap) && soap->error == SOAP_TAG_MISMATCH) soap->error = SOAP_OK; if (soap->error == SOAP_OK && soap->fheader) soap->error = soap->fheader(soap); return soap->error; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_set_endpoint(struct soap *soap, const char *endpoint) { register const char *s; register size_t i, n; soap->endpoint[0] = '\0'; soap->host[0] = '\0'; soap->path[0] = '/'; soap->path[1] = '\0'; soap->port = 80; if (!endpoint || !*endpoint) return; #ifdef WITH_OPENSSL if (!soap_tag_cmp(endpoint, "https:*")) soap->port = 443; #endif strncpy(soap->endpoint, endpoint, sizeof(soap->endpoint) - 1); soap->endpoint[sizeof(soap->endpoint) - 1] = '\0'; s = strchr(endpoint, ':'); if (s && s[1] == '/' && s[2] == '/') s += 3; else s = endpoint; n = strlen(s); if (n >= sizeof(soap->host)) n = sizeof(soap->host) - 1; #ifdef WITH_IPV6 if (s[0] == '[') { s++; for (i = 0; i < n; i++) { if (s[i] == ']') { s++; --n; break; } soap->host[i] = s[i]; } } else { for (i = 0; i < n; i++) { soap->host[i] = s[i]; if (s[i] == '/' || s[i] == ':') break; } } #else for (i = 0; i < n; i++) { soap->host[i] = s[i]; if (s[i] == '/' || s[i] == ':') break; } #endif soap->host[i] = '\0'; if (s[i] == ':') { soap->port = (int)soap_strtol(s + i + 1, NULL, 10); for (i++; i < n; i++) if (s[i] == '/') break; } if (i < n && s[i]) { strncpy(soap->path, s + i, sizeof(soap->path)); soap->path[sizeof(soap->path) - 1] = '\0'; } } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_connect(struct soap *soap, const char *endpoint, const char *action) { return soap_connect_command(soap, SOAP_POST, endpoint, action); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_connect_command(struct soap *soap, int http_command, const char *endpoints, const char *action) { char *endpoint; const char *s; if (endpoints && (s = strchr(endpoints, ' '))) { endpoint = (char*)SOAP_MALLOC(soap, strlen(endpoints) + 1); for (;;) { strncpy(endpoint, endpoints, s - endpoints); endpoint[s - endpoints] = '\0'; if (soap_try_connect_command(soap, http_command, endpoint, action) != SOAP_TCP_ERROR) break; if (!*s) break; soap->error = SOAP_OK; while (*s == ' ') s++; endpoints = s; s = strchr(endpoints, ' '); if (!s) s = endpoints + strlen(endpoints); } SOAP_FREE(soap, endpoint); } else soap_try_connect_command(soap, http_command, endpoints, action); return soap->error; } #endif /******************************************************************************/ #ifndef PALM_1 static int soap_try_connect_command(struct soap *soap, int http_command, const char *endpoint, const char *action) { char host[sizeof(soap->host)]; int port; size_t count; soap->error = SOAP_OK; strcpy(host, soap->host); /* save previous host name: if != then reconnect */ port = soap->port; /* save previous port to compare */ soap->status = http_command; soap_set_endpoint(soap, endpoint); #ifndef WITH_LEANER if (soap->fconnect) { if ((soap->error = soap->fconnect(soap, endpoint, soap->host, soap->port))) return soap->error; } else #endif soap->action = soap_strdup(soap, action); if (soap->fopen && *soap->host) { if (!soap->keep_alive || !soap_valid_socket(soap->socket) || strcmp(soap->host, host) || soap->port != port || !soap->fpoll || soap->fpoll(soap)) { soap->error = SOAP_OK; #ifndef WITH_LEAN if (!strncmp(endpoint, "soap.udp:", 9)) soap->omode |= SOAP_IO_UDP; else #endif { soap->keep_alive = 0; /* to force close */ soap->omode &= ~SOAP_IO_UDP; /* to force close */ } soap_closesock(soap); DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Connect/reconnect to host='%s' path='%s' port=%d\n", soap->host, soap->path, soap->port)); if (!soap->keep_alive || !soap_valid_socket(soap->socket)) { soap->socket = soap->fopen(soap, endpoint, soap->host, soap->port); if (soap->error) return soap->error; soap->keep_alive = ((soap->omode & SOAP_IO_KEEPALIVE) != 0); } } } #ifdef WITH_NTLM if (soap_ntlm_handshake(soap, SOAP_GET, endpoint, host, port)) return soap->error; #endif count = soap_count_attachments(soap); if (soap_begin_send(soap)) return soap->error; if (http_command == SOAP_GET) { soap->mode &= ~SOAP_IO; soap->mode |= SOAP_IO_BUFFER; } #ifndef WITH_NOHTTP if ((soap->mode & SOAP_IO) != SOAP_IO_STORE && !(soap->mode & SOAP_ENC_XML) && endpoint) { unsigned int k = soap->mode; soap->mode &= ~(SOAP_IO | SOAP_ENC_ZLIB); if ((k & SOAP_IO) != SOAP_IO_FLUSH) soap->mode |= SOAP_IO_BUFFER; if ((soap->error = soap->fpost(soap, endpoint, soap->host, soap->port, soap->path, action, count))) return soap->error; #ifndef WITH_LEANER if ((k & SOAP_IO) == SOAP_IO_CHUNK) { if (soap_flush(soap)) return soap->error; } #endif soap->mode = k; } if (http_command == SOAP_GET || http_command == SOAP_DEL) return soap_end_send(soap); #endif return SOAP_OK; } #endif /******************************************************************************/ #ifdef WITH_NTLM #ifndef PALM_1 static int soap_ntlm_handshake(struct soap *soap, int command, const char *endpoint, const char *host, int port) { /* requires libntlm from http://www.nongnu.org/libntlm/ */ const char *userid = (soap->proxy_userid ? soap->proxy_userid : soap->userid); const char *passwd = (soap->proxy_passwd ? soap->proxy_passwd : soap->passwd); if (soap->ntlm_challenge && userid && passwd && soap->authrealm) { tSmbNtlmAuthRequest req; tSmbNtlmAuthResponse res; tSmbNtlmAuthChallenge ch; short k = soap->keep_alive; size_t l = soap->length; soap_mode m = soap->mode, o = soap->omode; int s = soap->status; DBGLOG(TEST,SOAP_MESSAGE(fdebug, "NTLM '%s'\n", soap->ntlm_challenge)); if (!*soap->ntlm_challenge) { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "NTLM S->C Type 1: received NTLM authentication challenge from server\n")); /* S -> C 401 Unauthorized WWW-Authenticate: NTLM */ buildSmbNtlmAuthRequest(&req, userid, soap->authrealm); soap->ntlm_challenge = soap_s2base64(soap, (unsigned char*)&req, NULL, SmbLength(&req)); DBGLOG(TEST,SOAP_MESSAGE(fdebug, "NTLM C->S Type 2: sending NTLM authorization to server\nAuthorization: NTLM %s\n", soap->ntlm_challenge)); /* C -> S GET ... Authorization: NTLM TlRMTVNTUAABAAAAA7IAAAoACgApAAAACQAJACAAAABMSUdIVENJVFlVUlNBLU1JTk9S */ soap->omode = SOAP_IO_BUFFER; if (soap_begin_send(soap)) return soap->error; soap->keep_alive = 1; soap->status = command; if (soap->fpost(soap, endpoint, host, port, NULL, NULL, 0) || soap_end_send(soap)) return soap->error; soap->mode = m; soap->keep_alive = k; DBGLOG(TEST,SOAP_MESSAGE(fdebug, "NTLM S->C Type 2: waiting on server NTLM response\n")); if (soap_begin_recv(soap)) if (soap->error == SOAP_EOF) return soap->error; soap_end_recv(soap); soap->length = l; if (soap->status != 401 && soap->status != 407) return soap->error = SOAP_NTLM_ERROR; soap->error = SOAP_OK; } /* S -> C 401 Unauthorized WWW-Authenticate: NTLM TlRMTVNTUAACAAAAAAAAACgAAAABggAAU3J2Tm9uY2UAAAAAAAAAAA== */ soap_base642s(soap, soap->ntlm_challenge, (char*)&ch, sizeof(tSmbNtlmAuthChallenge), NULL); buildSmbNtlmAuthResponse(&ch, &res, userid, passwd); soap->ntlm_challenge = soap_s2base64(soap, (unsigned char*)&res, NULL, SmbLength(&res)); DBGLOG(TEST,SOAP_MESSAGE(fdebug, "NTLM C->S Type 3: sending NTLM authorization to server\nAuthorization: NTLM %s\n", soap->ntlm_challenge)); /* C -> S GET ... Authorization: NTLM TlRMTVNTUAADAAAAGAAYAHIAAAAYABgAigAAABQAFABAAAAADAAMAFQAAAASABIAYAAAAAAAAACiAAAAAYIAAFUAUgBTAEEALQBNAEkATgBPAFIAWgBhAHAAaABvAGQATABJAEcASABUAEMASQBUAFkArYfKbe/jRoW5xDxHeoxC1gBmfWiS5+iX4OAN4xBKG/IFPwfH3agtPEia6YnhsADT */ soap->keep_alive = k; soap->length = l; soap->mode = m; soap->omode = o; soap->status = s; } return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 char* SOAP_FMAC2 soap_s2base64(struct soap *soap, const unsigned char *s, char *t, int n) { register int i; register unsigned long m; register char *p; if (!t) t = (char*)soap_malloc(soap, (n + 2) / 3 * 4 + 1); if (!t) return NULL; p = t; t[0] = '\0'; if (!s) return p; for (; n > 2; n -= 3, s += 3) { m = s[0]; m = (m << 8) | s[1]; m = (m << 8) | s[2]; for (i = 4; i > 0; m >>= 6) t[--i] = soap_base64o[m & 0x3F]; t += 4; } t[0] = '\0'; if (n > 0) { m = 0; for (i = 0; i < n; i++) m = (m << 8) | *s++; for (; i < 3; i++) m <<= 8; for (i++; i > 0; m >>= 6) t[--i] = soap_base64o[m & 0x3F]; for (i = 3; i > n; i--) t[i] = '='; t[4] = '\0'; } return p; } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 const char* SOAP_FMAC2 soap_base642s(struct soap *soap, const char *s, char *t, size_t l, int *n) { register size_t i, j; register soap_wchar c; register unsigned long m; register const char *p; if (!s || !*s) { if (n) *n = 0; if (soap->error) return NULL; return SOAP_NON_NULL; } if (!t) { l = (strlen(s) + 3) / 4 * 3 + 1; /* make sure enough space for \0 */ t = (char*)soap_malloc(soap, l); } if (!t) return NULL; p = t; if (n) *n = 0; for (;;) { for (i = 0; i < SOAP_BLKLEN; i++) { m = 0; j = 0; while (j < 4) { c = *s++; if (c == '=' || !c) { i *= 3; switch (j) { case 2: *t++ = (char)((m >> 4) & 0xFF); i++; break; case 3: *t++ = (char)((m >> 10) & 0xFF); *t++ = (char)((m >> 2) & 0xFF); i += 2; } if (n) *n += (int)i; if (l >= j) *t = '\0'; return p; } c -= '+'; if (c >= 0 && c <= 79) { int b = soap_base64i[c]; if (b >= 64) { soap->error = SOAP_TYPE; return NULL; } m = (m << 6) + b; j++; } else if (!soap_blank(c + '+')) { soap->error = SOAP_TYPE; return NULL; } } if (l < 3) { if (n) *n += (int)i; *t = '\0'; return p; } *t++ = (char)((m >> 16) & 0xFF); *t++ = (char)((m >> 8) & 0xFF); *t++ = (char)(m & 0xFF); l -= 3; } if (n) *n += 3 * SOAP_BLKLEN; } } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 char* SOAP_FMAC2 soap_s2hex(struct soap *soap, const unsigned char *s, char *t, int n) { register char *p; if (!t) t = (char*)soap_malloc(soap, 2 * n + 1); if (!t) return NULL; p = t; t[0] = '\0'; if (s) { for (; n > 0; n--) { register int m = *s++; *t++ = (char)((m >> 4) + (m > 159 ? 'a' - 10 : '0')); m &= 0x0F; *t++ = (char)(m + (m > 9 ? 'a' - 10 : '0')); } } *t++ = '\0'; return p; } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 const char* SOAP_FMAC2 soap_hex2s(struct soap *soap, const char *s, char *t, size_t l, int *n) { register const char *p; if (!s || !*s) { if (n) *n = 0; if (soap->error) return NULL; return SOAP_NON_NULL; } if (!t) { l = strlen(s) / 2 + 1; /* make sure enough space for \0 */ t = (char*)soap_malloc(soap, l); } if (!t) return NULL; p = t; while (l) { register int d1, d2; d1 = *s++; if (!d1) break; d2 = *s++; if (!d2) break; *t++ = (char)(((d1 >= 'A' ? (d1 & 0x7) + 9 : d1 - '0') << 4) + (d2 >= 'A' ? (d2 & 0x7) + 9 : d2 - '0')); l--; } if (n) *n = (int)(t - p); if (l) *t = '\0'; return p; } #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_puthttphdr(struct soap *soap, int status, size_t count) { if (soap->status != SOAP_GET && soap->status != SOAP_DEL && soap->status != SOAP_CONNECT) { register const char *s = "text/xml; charset=utf-8"; register int err = SOAP_OK; #ifndef WITH_LEANER register const char *r = NULL; #endif if ((status == SOAP_FILE || soap->status == SOAP_PUT || soap->status == SOAP_POST_FILE) && soap->http_content) s = soap->http_content; else if (status == SOAP_HTML) s = "text/html; charset=utf-8"; else if (count || ((soap->omode & SOAP_IO) == SOAP_IO_CHUNK)) { if (soap->version == 2) s = "application/soap+xml; charset=utf-8"; } #ifndef WITH_LEANER if (soap->mode & (SOAP_ENC_DIME | SOAP_ENC_MTOM)) { if (soap->mode & SOAP_ENC_MTOM) { if (soap->version == 2) r = "application/soap+xml"; else r = "text/xml"; s = "application/xop+xml"; } else s = "application/dime"; } if ((soap->mode & SOAP_ENC_MIME) && soap->mime.boundary && strlen(soap->mime.boundary) + strlen(soap->mime.start ? soap->mime.start : SOAP_STR_EOS) < sizeof(soap->tmpbuf) - 80) { register const char *t = strchr(s, ';'); sprintf(soap->tmpbuf, "multipart/related; charset=utf-8; boundary=\"%s\"; type=\"", soap->mime.boundary); if (t) { strncat(soap->tmpbuf, s, t - s); soap->tmpbuf[sizeof(soap->tmpbuf)-1] = '\0'; } else strcat(soap->tmpbuf, s); if (soap->mime.start) { strcat(soap->tmpbuf, "\"; start=\""); strcat(soap->tmpbuf, soap->mime.start); } strcat(soap->tmpbuf, "\""); if (r) { strcat(soap->tmpbuf, "; start-info=\""); strcat(soap->tmpbuf, r); strcat(soap->tmpbuf, "\""); } s = soap->tmpbuf; } else s = strcpy(soap->tmpbuf, s); if (status == SOAP_OK && soap->version == 2 && soap->action && strlen(soap->action) + strlen(s) < sizeof(soap->tmpbuf) - 80) sprintf(soap->tmpbuf + strlen(s), "; action=\"%s\"", soap->action); #endif if ((err = soap->fposthdr(soap, "Content-Type", s))) return err; #ifdef WITH_ZLIB if ((soap->omode & SOAP_ENC_ZLIB)) { #ifdef WITH_GZIP err = soap->fposthdr(soap, "Content-Encoding", soap->zlib_out == SOAP_ZLIB_DEFLATE ? "deflate" : "gzip"); #else err = soap->fposthdr(soap, "Content-Encoding", "deflate"); #endif if (err) return err; } #endif #ifndef WITH_LEANER if ((soap->omode & SOAP_IO) == SOAP_IO_CHUNK) err = soap->fposthdr(soap, "Transfer-Encoding", "chunked"); else #endif if (s) { sprintf(soap->tmpbuf, "%lu", (unsigned long)count); err = soap->fposthdr(soap, "Content-Length", soap->tmpbuf); } if (err) return err; } return soap->fposthdr(soap, "Connection", soap->keep_alive ? "keep-alive" : "close"); } #endif #endif /******************************************************************************/ #ifndef WITH_LEAN static const char* soap_set_validation_fault(struct soap *soap, const char *s, const char *t) { if (*soap->tag) sprintf(soap->msgbuf, "Validation constraint violation: %s%s in element '%s'", s, t ? t : SOAP_STR_EOS, soap->tag); else sprintf(soap->msgbuf, "Validation constraint violation: %s%s", s, t ? t : SOAP_STR_EOS); return soap->msgbuf; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_set_fault(struct soap *soap) { const char **c = soap_faultcode(soap); const char **s = soap_faultstring(soap); if (soap->fseterror) soap->fseterror(soap, c, s); if (!*c) { if (soap->version == 2) *c = "SOAP-ENV:Sender"; else *c = "SOAP-ENV:Client"; } if (*s) return; switch (soap->error) { #ifndef WITH_LEAN case SOAP_CLI_FAULT: *s = "Client fault"; break; case SOAP_SVR_FAULT: *s = "Server fault"; break; case SOAP_TAG_MISMATCH: *s = soap_set_validation_fault(soap, "tag name or namespace mismatch", NULL); break; case SOAP_TYPE: *s = soap_set_validation_fault(soap, "data type mismatch ", soap->type); break; case SOAP_SYNTAX_ERROR: *s = "Well-formedness violation"; break; case SOAP_NO_TAG: *s = "No XML root element"; break; case SOAP_MUSTUNDERSTAND: *c = "SOAP-ENV:MustUnderstand"; sprintf(soap->msgbuf, "The data in element '%s' must be understood but cannot be handled", soap->tag); *s = soap->msgbuf; break; case SOAP_VERSIONMISMATCH: *c = "SOAP-ENV:VersionMismatch"; *s = "Invalid SOAP message or SOAP version mismatch"; break; case SOAP_DATAENCODINGUNKNOWN: *c = "SOAP-ENV:DataEncodingUnknown"; *s = "Unsupported SOAP data encoding"; break; case SOAP_NAMESPACE: *s = soap_set_validation_fault(soap, "namespace error", NULL); break; case SOAP_USER_ERROR: *s = "User data error"; break; case SOAP_FATAL_ERROR: *s = "Fatal error"; break; case SOAP_NO_METHOD: sprintf(soap->msgbuf, "Method '%s' not implemented: method name or namespace not recognized", soap->tag); *s = soap->msgbuf; break; case SOAP_NO_DATA: *s = "Data required for operation"; break; case SOAP_GET_METHOD: *s = "HTTP GET method not implemented"; break; case SOAP_PUT_METHOD: *s = "HTTP PUT method not implemented"; break; case SOAP_HTTP_METHOD: *s = "HTTP method not implemented"; break; case SOAP_EOM: *s = "Out of memory"; break; case SOAP_MOE: *s = "Memory overflow or memory corruption error"; break; case SOAP_HDR: *s = "Header line too long"; break; case SOAP_IOB: *s = "Array index out of bounds"; break; case SOAP_NULL: *s = soap_set_validation_fault(soap, "nil not allowed", NULL); break; case SOAP_DUPLICATE_ID: *s = soap_set_validation_fault(soap, "multiple definitions (use the SOAP_XML_TREE flag) of the same id ", soap->id); if (soap->version == 2) *soap_faultsubcode(soap) = "SOAP-ENC:DuplicateID"; break; case SOAP_MISSING_ID: *s = soap_set_validation_fault(soap, "missing id for ref ", soap->id); if (soap->version == 2) *soap_faultsubcode(soap) = "SOAP-ENC:MissingID"; break; case SOAP_HREF: *s = soap_set_validation_fault(soap, "incompatible object type ref/id pair ", soap->id); break; case SOAP_FAULT: break; #ifndef WITH_NOIO case SOAP_UDP_ERROR: *s = "Message too large for UDP packet"; break; case SOAP_TCP_ERROR: *s = tcp_error(soap); break; #endif case SOAP_HTTP_ERROR: *s = "An HTTP processing error occurred"; break; case SOAP_NTLM_ERROR: *s = "An HTTP NTLM authentication error occurred"; break; case SOAP_SSL_ERROR: #ifdef WITH_OPENSSL *s = "SSL/TLS error"; #else *s = "OpenSSL not installed: recompile with -DWITH_OPENSSL"; #endif break; case SOAP_PLUGIN_ERROR: *s = "Plugin registry error"; break; case SOAP_DIME_ERROR: *s = "DIME format error"; break; case SOAP_DIME_HREF: *s = "DIME href to missing attachment"; break; case SOAP_DIME_MISMATCH: *s = "DIME version/transmission error"; break; case SOAP_DIME_END: *s = "End of DIME error"; break; case SOAP_MIME_ERROR: *s = "MIME format error"; break; case SOAP_MIME_HREF: *s = "MIME href to missing attachment"; break; case SOAP_MIME_END: *s = "End of MIME error"; break; case SOAP_ZLIB_ERROR: #ifdef WITH_ZLIB sprintf(soap->msgbuf, "Zlib/gzip error: '%s'", soap->d_stream->msg ? soap->d_stream->msg : SOAP_STR_EOS); *s = soap->msgbuf; #else *s = "Zlib/gzip not installed for (de)compression: recompile with -DWITH_GZIP"; #endif break; case SOAP_REQUIRED: *s = soap_set_validation_fault(soap, "missing required attribute", NULL); break; case SOAP_PROHIBITED: *s = soap_set_validation_fault(soap, "prohibited attribute present", NULL); break; case SOAP_OCCURS: *s = soap_set_validation_fault(soap, "occurrence violation", NULL); break; case SOAP_LENGTH: *s = soap_set_validation_fault(soap, "content range or length violation", NULL); break; case SOAP_FD_EXCEEDED: *s = "Maximum number of open connections was reached (no define HAVE_POLL): increase FD_SETSIZE"; break; case SOAP_UTF_ERROR: *s = "UTF content encoding error"; break; case SOAP_STOP: *s = "Stopped: no response to be sent or received (informative)"; break; #endif case SOAP_EOF: #ifndef WITH_NOIO strcpy(soap->msgbuf, soap_strerror(soap)); #ifndef WITH_LEAN if (strlen(soap->msgbuf) + 25 < sizeof(soap->msgbuf)) { memmove(soap->msgbuf + 25, soap->msgbuf, strlen(soap->msgbuf) + 1); memcpy(soap->msgbuf, "End of file or no input: ", 25); } #endif *s = soap->msgbuf; break; #else *s = "End of file or no input"; break; #endif default: #ifndef WITH_NOHTTP #ifndef WITH_LEAN if (soap->error > 200 && soap->error < 600) { sprintf(soap->msgbuf, "HTTP Error: %d %s", soap->error, http_error(soap, soap->error)); *s = soap->msgbuf; } else #endif #endif { sprintf(soap->msgbuf, "Error %d", soap->error); *s = soap->msgbuf; } } } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_send_fault(struct soap *soap) { register int status = soap->error; if (status == SOAP_STOP) return soap_closesock(soap); DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Sending back fault struct for error code %d\n", soap->error)); soap->keep_alive = 0; /* to terminate connection */ soap_set_fault(soap); if (soap->error < 200 && soap->error != SOAP_FAULT) soap->header = NULL; if (status != SOAP_EOF || (!soap->recv_timeout && !soap->send_timeout)) { int r = 1; #ifndef WITH_NOIO if (soap->fpoll && soap->fpoll(soap)) r = 0; #ifndef WITH_LEAN else if (soap_valid_socket(soap->socket)) { r = tcp_select(soap, soap->socket, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_SND, 0); if (r > 0) { if (!(r & SOAP_TCP_SELECT_SND) || ((r & SOAP_TCP_SELECT_RCV) && recv(soap->socket, soap->tmpbuf, 1, MSG_PEEK) < 0)) r = 0; } } #endif #endif if (r > 0) { soap->error = SOAP_OK; soap_serializeheader(soap); soap_serializefault(soap); soap_begin_count(soap); if (soap->mode & SOAP_IO_LENGTH) { soap_envelope_begin_out(soap); soap_putheader(soap); soap_body_begin_out(soap); soap_putfault(soap); soap_body_end_out(soap); soap_envelope_end_out(soap); } soap_end_count(soap); if (soap_response(soap, status) || soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_putfault(soap) || soap_body_end_out(soap) || soap_envelope_end_out(soap)) return soap_closesock(soap); soap_end_send(soap); } } soap->error = status; return soap_closesock(soap); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_recv_fault(struct soap *soap, int check) { register int status = soap->error; DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Check if receiving SOAP Fault\n")); if (!check) { /* try getfault when no tag or tag mismatched at level 2, otherwise ret */ if (soap->error != SOAP_NO_TAG && (soap->error != SOAP_TAG_MISMATCH || soap->level != 2)) return soap->error; } soap->error = SOAP_OK; if (soap_getfault(soap)) { /* check flag set: check if SOAP Fault is present, if not just return */ if (check && soap->error == SOAP_TAG_MISMATCH && soap->level == 2) return soap->error = SOAP_OK; DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Error: soap_get_soapfault() failed at level %u tag '%s'\n", soap->level, soap->tag)); *soap_faultcode(soap) = (soap->version == 2 ? "SOAP-ENV:Sender" : "SOAP-ENV:Client"); soap->error = status; soap_set_fault(soap); } else { register const char *s = *soap_faultcode(soap); if (!soap_match_tag(soap, s, "SOAP-ENV:Server") || !soap_match_tag(soap, s, "SOAP-ENV:Receiver")) status = SOAP_SVR_FAULT; else if (!soap_match_tag(soap, s, "SOAP-ENV:Client") || !soap_match_tag(soap, s, "SOAP-ENV:Sender")) status = SOAP_CLI_FAULT; else if (!soap_match_tag(soap, s, "SOAP-ENV:MustUnderstand")) status = SOAP_MUSTUNDERSTAND; else if (!soap_match_tag(soap, s, "SOAP-ENV:VersionMismatch")) status = SOAP_VERSIONMISMATCH; else { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Received SOAP Fault code %s\n", s)); status = SOAP_FAULT; } if (!soap_body_end_in(soap)) soap_envelope_end_in(soap); } soap_end_recv(soap); soap->error = status; return soap_closesock(soap); } #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_send_empty_response(struct soap *soap, int httpstatuscode) { register soap_mode m = soap->omode; soap->count = 0; if ((m & SOAP_IO) == SOAP_IO_CHUNK) soap->omode = (m & ~SOAP_IO) | SOAP_IO_BUFFER; if (!soap_response(soap, httpstatuscode) && !soap_end_send(soap)) soap->error = SOAP_STOP; /* stops the server's processing of request */ soap->omode = m; return soap_closesock(soap); } #endif #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_recv_empty_response(struct soap *soap) { if (!soap_begin_recv(soap)) soap_end_recv(soap); else if (soap->error == SOAP_NO_DATA || soap->error == 202) soap->error = SOAP_OK; return soap_closesock(soap); } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 static const char* soap_strerror(struct soap *soap) { register int err = soap->errnum; if (err) { #ifndef WIN32 # ifdef HAVE_STRERROR_R strerror_r(err, soap->msgbuf, sizeof(soap->msgbuf)); # else return strerror(err); # endif #else #ifndef UNDER_CE DWORD len; *soap->msgbuf = '\0'; len = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)soap->msgbuf, (DWORD)sizeof(soap->msgbuf), NULL); #else DWORD i, len; *soap->msgbuf = '\0'; len = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, err, 0, (LPTSTR)soap->msgbuf, (DWORD)(sizeof(soap->msgbuf)/sizeof(TCHAR)), NULL); for (i = 0; i <= len; i++) { if (((TCHAR*)soap->msgbuf)[i] < 0x80) soap->msgbuf[i] = (char)((TCHAR*)soap->msgbuf)[i]; else soap->msgbuf[i] = '?'; } #endif #endif } else { char *s = soap->msgbuf; #ifndef WITH_LEAN int rt = soap->recv_timeout, st = soap->send_timeout; int ru = ' ', su = ' '; #endif strcpy(s, "Operation interrupted or timed out"); #ifndef WITH_LEAN if (rt < 0) { rt = -rt; ru = 'u'; } if (st < 0) { st = -st; su = 'u'; } if (rt) sprintf(s + strlen(s), " (%d%cs receive delay)", rt, ru); if (st) sprintf(s + strlen(s), " (%d%cs send delay)", st, su); #endif } return soap->msgbuf; } #endif #endif /******************************************************************************/ #ifndef PALM_2 static int soap_set_error(struct soap *soap, const char *faultcode, const char *faultsubcodeQName, const char *faultstring, const char *faultdetailXML, int soaperror) { *soap_faultcode(soap) = faultcode; if (faultsubcodeQName) *soap_faultsubcode(soap) = faultsubcodeQName; *soap_faultstring(soap) = faultstring; if (faultdetailXML && *faultdetailXML) { register const char **s = soap_faultdetail(soap); if (s) *s = faultdetailXML; } return soap->error = soaperror; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_set_sender_error(struct soap *soap, const char *faultstring, const char *faultdetailXML, int soaperror) { return soap_set_error(soap, soap->version == 2 ? "SOAP-ENV:Sender" : "SOAP-ENV:Client", NULL, faultstring, faultdetailXML, soaperror); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_set_receiver_error(struct soap *soap, const char *faultstring, const char *faultdetailXML, int soaperror) { return soap_set_error(soap, soap->version == 2 ? "SOAP-ENV:Receiver" : "SOAP-ENV:Server", NULL, faultstring, faultdetailXML, soaperror); } #endif /******************************************************************************/ #ifndef PALM_2 static int soap_copy_fault(struct soap *soap, const char *faultcode, const char *faultsubcodeQName, const char *faultstring, const char *faultdetailXML) { char *r = NULL, *s = NULL, *t = NULL; if (faultsubcodeQName) r = soap_strdup(soap, faultsubcodeQName); if (faultstring) s = soap_strdup(soap, faultstring); if (faultdetailXML) t = soap_strdup(soap, faultdetailXML); return soap_set_error(soap, faultcode, r, s, t, SOAP_FAULT); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_sender_fault(struct soap *soap, const char *faultstring, const char *faultdetailXML) { return soap_sender_fault_subcode(soap, NULL, faultstring, faultdetailXML); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_sender_fault_subcode(struct soap *soap, const char *faultsubcodeQName, const char *faultstring, const char *faultdetailXML) { return soap_copy_fault(soap, soap->version == 2 ? "SOAP-ENV:Sender" : "SOAP-ENV:Client", faultsubcodeQName, faultstring, faultdetailXML); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_receiver_fault(struct soap *soap, const char *faultstring, const char *faultdetailXML) { return soap_receiver_fault_subcode(soap, NULL, faultstring, faultdetailXML); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_receiver_fault_subcode(struct soap *soap, const char *faultsubcodeQName, const char *faultstring, const char *faultdetailXML) { return soap_copy_fault(soap, soap->version == 2 ? "SOAP-ENV:Receiver" : "SOAP-ENV:Server", faultsubcodeQName, faultstring, faultdetailXML); } #endif /******************************************************************************/ #ifndef PALM_2 #ifndef WITH_NOSTDLIB SOAP_FMAC1 void SOAP_FMAC2 soap_print_fault(struct soap *soap, FILE *fd) { if (soap_check_state(soap)) fprintf(fd, "Error: soap struct state not initialized\n"); else if (soap->error) { const char **c, *v = NULL, *s, *d; c = soap_faultcode(soap); if (!*c) soap_set_fault(soap); if (soap->version == 2) v = soap_check_faultsubcode(soap); s = *soap_faultstring(soap); d = soap_check_faultdetail(soap); fprintf(fd, "%s%d fault: %s [%s]\n\"%s\"\nDetail: %s\n", soap->version ? "SOAP 1." : "Error ", soap->version ? (int)soap->version : soap->error, *c, v ? v : "no subcode", s ? s : "[no reason]", d ? d : "[no detail]"); } } #endif #endif /******************************************************************************/ #ifdef __cplusplus #ifndef WITH_LEAN #ifndef WITH_NOSTDLIB #ifndef WITH_COMPAT SOAP_FMAC1 void SOAP_FMAC2 soap_stream_fault(struct soap *soap, std::ostream& os) { if (soap_check_state(soap)) os << "Error: soap struct state not initialized\n"; else if (soap->error) { const char **c, *v = NULL, *s, *d; c = soap_faultcode(soap); if (!*c) soap_set_fault(soap); if (soap->version == 2) v = soap_check_faultsubcode(soap); s = *soap_faultstring(soap); d = soap_check_faultdetail(soap); os << (soap->version ? "SOAP 1." : "Error ") << (soap->version ? (int)soap->version : soap->error) << " fault: " << *c << "[" << (v ? v : "no subcode") << "]" << std::endl << "\"" << (s ? s : "[no reason]") << "\"" << std::endl << "Detail: " << (d ? d : "[no detail]") << std::endl; } } #endif #endif #endif #endif /******************************************************************************/ #ifndef WITH_LEAN #ifndef WITH_NOSTDLIB SOAP_FMAC1 char* SOAP_FMAC2 soap_sprint_fault(struct soap *soap, char *buf, size_t len) { if (soap_check_state(soap)) strncpy(buf, "Error: soap struct not initialized", len); else if (soap->error) { const char **c, *v = NULL, *s, *d; c = soap_faultcode(soap); if (!*c) soap_set_fault(soap); if (soap->version == 2) v = *soap_faultsubcode(soap); s = *soap_faultstring(soap); d = soap_check_faultdetail(soap); #ifdef HAVE_SNPRINTF # ifdef WIN32 _snprintf # else snprintf # endif (buf, len, "%s%d fault: %s [%s]\n\"%s\"\nDetail: %s\n", soap->version ? "SOAP 1." : "Error ", soap->version ? (int)soap->version : soap->error, *c, v ? v : "no subcode", s ? s : "[no reason]", d ? d : "[no detail]"); #else if (len > 40 + (v ? strlen(v) : 0) + (s ? strlen(s) : 0) + (d ? strlen(d) : 0)) sprintf(buf, "%s%d fault: %s [%s]\n\"%s\"\nDetail: %s\n", soap->version ? "SOAP 1." : "Error ", soap->version ? (int)soap->version : soap->error, *c, v ? v : "no subcode", s ? s : "[no reason]", d ? d : "[no detail]"); else if (len > 40) sprintf(buf, "%s%d fault: %s\n", soap->version ? "SOAP 1." : "Error ", soap->version ? (int)soap->version : soap->error, *c); else buf[0] = '\0'; #endif } return buf; } #endif #endif /******************************************************************************/ #ifndef PALM_1 #ifndef WITH_NOSTDLIB SOAP_FMAC1 void SOAP_FMAC2 soap_print_fault_location(struct soap *soap, FILE *fd) { #ifndef WITH_LEAN int i, j, c1, c2; if (soap->error && soap->error != SOAP_STOP && soap->bufidx <= soap->buflen && soap->buflen > 0 && soap->buflen <= SOAP_BUFLEN) { i = (int)soap->bufidx - 1; if (i <= 0) i = 0; c1 = soap->buf[i]; soap->buf[i] = '\0'; if ((int)soap->buflen >= i + 1024) j = i + 1023; else j = (int)soap->buflen - 1; c2 = soap->buf[j]; soap->buf[j] = '\0'; fprintf(fd, "%s%c\n\n", soap->buf, c1); if (soap->bufidx < soap->buflen) fprintf(fd, "%s\n", soap->buf + soap->bufidx); soap->buf[i] = (char)c1; soap->buf[j] = (char)c2; } #endif } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_register_plugin_arg(struct soap *soap, int (*fcreate)(struct soap*, struct soap_plugin*, void*), void *arg) { register struct soap_plugin *p; register int r; if (!(p = (struct soap_plugin*)SOAP_MALLOC(soap, sizeof(struct soap_plugin)))) return soap->error = SOAP_EOM; p->id = NULL; p->data = NULL; p->fcopy = NULL; p->fdelete = NULL; r = fcreate(soap, p, arg); if (!r && p->fdelete) { p->next = soap->plugins; soap->plugins = p; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Registered '%s' plugin\n", p->id)); return SOAP_OK; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not register plugin '%s': plugin returned error %d (or fdelete callback not set)\n", p->id ? p->id : "?", r)); SOAP_FREE(soap, p); return r; } #endif /******************************************************************************/ #ifndef PALM_1 static void * fplugin(struct soap *soap, const char *id) { register struct soap_plugin *p; for (p = soap->plugins; p; p = p->next) if (p->id == id || !strcmp(p->id, id)) return p->data; return NULL; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void * SOAP_FMAC2 soap_lookup_plugin(struct soap *soap, const char *id) { return soap->fplugin(soap, id); } #endif /******************************************************************************/ #ifdef __cplusplus } #endif /******************************************************************************\ * * C++ soap struct methods * \******************************************************************************/ #ifdef __cplusplus soap::soap() { soap_init(this); } #endif /******************************************************************************/ #ifdef __cplusplus soap::soap(soap_mode m) { soap_init1(this, m); } #endif /******************************************************************************/ #ifdef __cplusplus soap::soap(soap_mode im, soap_mode om) { soap_init2(this, im, om); } #endif /******************************************************************************/ #ifdef __cplusplus soap::soap(const struct soap& soap) { soap_copy_context(this, &soap); } #endif /******************************************************************************/ #ifdef __cplusplus soap::~soap() { soap_destroy(this); soap_end(this); soap_done(this); } #endif /******************************************************************************/ gsoap-2.8.28/gsoap/ios_plugin/examples/GeoIPService/Classes/soapGeoIPServiceSoap12Proxy.h0000644000175000017500000000650712653650146030634 0ustar ellertellert/* soapGeoIPServiceSoap12Proxy.h Generated by gSOAP 2.8.8 from GeoIPService.h Copyright(C) 2000-2012, Robert van Engelen, Genivia Inc. All Rights Reserved. The generated code is released under one of the following licenses: 1) GPL or 2) Genivia's license for commercial use. This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. */ #ifndef soapGeoIPServiceSoap12Proxy_H #define soapGeoIPServiceSoap12Proxy_H #include "soapH.h" class SOAP_CMAC GeoIPServiceSoap12Proxy : public soap { public: /// Endpoint URL of service 'GeoIPServiceSoap12Proxy' (change as needed) const char *soap_endpoint; /// Constructor GeoIPServiceSoap12Proxy(); /// Construct from another engine state GeoIPServiceSoap12Proxy(const struct soap&); /// Constructor with endpoint URL GeoIPServiceSoap12Proxy(const char *url); /// Constructor with engine input+output mode control GeoIPServiceSoap12Proxy(soap_mode iomode); /// Constructor with URL and input+output mode control GeoIPServiceSoap12Proxy(const char *url, soap_mode iomode); /// Constructor with engine input and output mode control GeoIPServiceSoap12Proxy(soap_mode imode, soap_mode omode); /// Destructor frees deserialized data virtual ~GeoIPServiceSoap12Proxy(); /// Initializer used by constructors virtual void GeoIPServiceSoap12Proxy_init(soap_mode imode, soap_mode omode); /// Delete all deserialized data (uses soap_destroy and soap_end) virtual void destroy(); /// Delete all deserialized data and reset to default virtual void reset(); /// Disables and removes SOAP Header from message virtual void soap_noheader(); /// Get SOAP Header structure (NULL when absent) virtual const SOAP_ENV__Header *soap_header(); /// Get SOAP Fault structure (NULL when absent) virtual const SOAP_ENV__Fault *soap_fault(); /// Get SOAP Fault string (NULL when absent) virtual const char *soap_fault_string(); /// Get SOAP Fault detail as string (NULL when absent) virtual const char *soap_fault_detail(); /// Close connection (normally automatic, except for send_X ops) virtual int soap_close_socket(); /// Force close connection (can kill a thread blocked on IO) virtual int soap_force_close_socket(); /// Print fault virtual void soap_print_fault(FILE*); #ifndef WITH_LEAN /// Print fault to stream #ifndef WITH_COMPAT virtual void soap_stream_fault(std::ostream&); #endif /// Put fault into buffer virtual char *soap_sprint_fault(char *buf, size_t len); #endif /// Web service operation 'GetGeoIP' (returns error code or SOAP_OK) virtual int GetGeoIP(_ns1__GetGeoIP *ns1__GetGeoIP, _ns1__GetGeoIPResponse *ns1__GetGeoIPResponse) { return GetGeoIP(NULL, NULL, ns1__GetGeoIP, ns1__GetGeoIPResponse); } virtual int GetGeoIP(const char *endpoint, const char *soap_action, _ns1__GetGeoIP *ns1__GetGeoIP, _ns1__GetGeoIPResponse *ns1__GetGeoIPResponse); /// Web service operation 'GetGeoIPContext' (returns error code or SOAP_OK) virtual int GetGeoIPContext(_ns1__GetGeoIPContext *ns1__GetGeoIPContext, _ns1__GetGeoIPContextResponse *ns1__GetGeoIPContextResponse) { return GetGeoIPContext(NULL, NULL, ns1__GetGeoIPContext, ns1__GetGeoIPContextResponse); } virtual int GetGeoIPContext(const char *endpoint, const char *soap_action, _ns1__GetGeoIPContext *ns1__GetGeoIPContext, _ns1__GetGeoIPContextResponse *ns1__GetGeoIPContextResponse); }; #endif gsoap-2.8.28/gsoap/ios_plugin/examples/GeoIPService/Classes/soapH.h0000644000175000017500000012010012653650146024471 0ustar ellertellert/* soapH.h Generated by gSOAP 2.8.8 from GeoIPService.h Copyright(C) 2000-2012, Robert van Engelen, Genivia Inc. All Rights Reserved. The generated code is released under one of the following licenses: 1) GPL or 2) Genivia's license for commercial use. This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. */ #ifndef soapH_H #define soapH_H #include "soapStub.h" #ifndef WITH_NOIDREF #ifdef __cplusplus extern "C" { #endif SOAP_FMAC3 void SOAP_FMAC4 soap_markelement(struct soap*, const void*, int); SOAP_FMAC3 int SOAP_FMAC4 soap_putelement(struct soap*, const void*, const char*, int, int); SOAP_FMAC3 void *SOAP_FMAC4 soap_getelement(struct soap*, int*); #ifdef __cplusplus } #endif SOAP_FMAC3 int SOAP_FMAC4 soap_putindependent(struct soap*); SOAP_FMAC3 int SOAP_FMAC4 soap_getindependent(struct soap*); #endif SOAP_FMAC3 int SOAP_FMAC4 soap_ignore_element(struct soap*); SOAP_FMAC3 void * SOAP_FMAC4 soap_instantiate(struct soap*, int, const char*, const char*, size_t*); SOAP_FMAC3 int SOAP_FMAC4 soap_fdelete(struct soap_clist*); SOAP_FMAC3 void* SOAP_FMAC4 soap_class_id_enter(struct soap*, const char*, void*, int, size_t, const char*, const char*); SOAP_FMAC3 void* SOAP_FMAC4 soap_container_id_forward(struct soap*, const char*, void*, size_t, int, int, size_t, unsigned int); SOAP_FMAC3 void SOAP_FMAC4 soap_container_insert(struct soap*, int, int, void*, size_t, const void*, size_t); #ifndef SOAP_TYPE_byte #define SOAP_TYPE_byte (3) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_byte(struct soap*, char *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_byte(struct soap*, const char*, int, const char *, const char*); SOAP_FMAC3 char * SOAP_FMAC4 soap_in_byte(struct soap*, const char*, char *, const char*); #ifndef soap_write_byte #define soap_write_byte(soap, data) ( soap_begin_send(soap) || soap_put_byte(soap, data, "byte", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_byte(struct soap*, const char *, const char*, const char*); #ifndef soap_read_byte #define soap_read_byte(soap, data) ( soap_begin_recv(soap) || !soap_get_byte(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 char * SOAP_FMAC4 soap_get_byte(struct soap*, char *, const char*, const char*); #ifndef SOAP_TYPE_int #define SOAP_TYPE_int (1) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_int(struct soap*, int *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_int(struct soap*, const char*, int, const int *, const char*); SOAP_FMAC3 int * SOAP_FMAC4 soap_in_int(struct soap*, const char*, int *, const char*); #ifndef soap_write_int #define soap_write_int(soap, data) ( soap_begin_send(soap) || soap_put_int(soap, data, "int", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_int(struct soap*, const int *, const char*, const char*); #ifndef soap_read_int #define soap_read_int(soap, data) ( soap_begin_recv(soap) || !soap_get_int(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 int * SOAP_FMAC4 soap_get_int(struct soap*, int *, const char*, const char*); #ifndef SOAP_TYPE_std__string #define SOAP_TYPE_std__string (13) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_std__string(struct soap*, std::string *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_std__string(struct soap*, const std::string *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_std__string(struct soap*, const char*, int, const std::string*, const char*); SOAP_FMAC3 std::string * SOAP_FMAC4 soap_in_std__string(struct soap*, const char*, std::string*, const char*); #ifndef soap_write_std__string #define soap_write_std__string(soap, data) ( soap_begin_send(soap) || ((data)->soap_serialize(soap), 0) || (data)->soap_put(soap, "string", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_std__string(struct soap*, const std::string *, const char*, const char*); #ifndef soap_read_std__string #define soap_read_std__string(soap, data) ( soap_begin_recv(soap) || !soap_get_std__string(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 std::string * SOAP_FMAC4 soap_get_std__string(struct soap*, std::string *, const char*, const char*); #define soap_new_std__string(soap, n) soap_instantiate_std__string(soap, n, NULL, NULL, NULL) #define soap_delete_std__string(soap, p) soap_delete(soap, p) SOAP_FMAC1 std::string * SOAP_FMAC2 soap_instantiate_std__string(struct soap*, int, const char*, const char*, size_t*); SOAP_FMAC3 void SOAP_FMAC4 soap_copy_std__string(struct soap*, int, int, void*, size_t, const void*, size_t); #ifndef SOAP_TYPE__ns1__GetGeoIPContextResponse #define SOAP_TYPE__ns1__GetGeoIPContextResponse (12) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_out__ns1__GetGeoIPContextResponse(struct soap*, const char*, int, const _ns1__GetGeoIPContextResponse *, const char*); SOAP_FMAC3 _ns1__GetGeoIPContextResponse * SOAP_FMAC4 soap_in__ns1__GetGeoIPContextResponse(struct soap*, const char*, _ns1__GetGeoIPContextResponse *, const char*); #ifndef soap_write__ns1__GetGeoIPContextResponse #define soap_write__ns1__GetGeoIPContextResponse(soap, data) ( soap_begin_send(soap) || ((data)->soap_serialize(soap), 0) || (data)->soap_put(soap, "ns1:GetGeoIPContextResponse", NULL) || soap_end_send(soap) ) #endif #ifndef soap_read__ns1__GetGeoIPContextResponse #define soap_read__ns1__GetGeoIPContextResponse(soap, data) ( soap_begin_recv(soap) || !soap_get__ns1__GetGeoIPContextResponse(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 _ns1__GetGeoIPContextResponse * SOAP_FMAC4 soap_get__ns1__GetGeoIPContextResponse(struct soap*, _ns1__GetGeoIPContextResponse *, const char*, const char*); #define soap_new__ns1__GetGeoIPContextResponse(soap, n) soap_instantiate__ns1__GetGeoIPContextResponse(soap, n, NULL, NULL, NULL) #define soap_delete__ns1__GetGeoIPContextResponse(soap, p) soap_delete(soap, p) SOAP_FMAC1 _ns1__GetGeoIPContextResponse * SOAP_FMAC2 soap_instantiate__ns1__GetGeoIPContextResponse(struct soap*, int, const char*, const char*, size_t*); SOAP_FMAC3 void SOAP_FMAC4 soap_copy__ns1__GetGeoIPContextResponse(struct soap*, int, int, void*, size_t, const void*, size_t); #ifndef SOAP_TYPE__ns1__GetGeoIPContext #define SOAP_TYPE__ns1__GetGeoIPContext (11) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_out__ns1__GetGeoIPContext(struct soap*, const char*, int, const _ns1__GetGeoIPContext *, const char*); SOAP_FMAC3 _ns1__GetGeoIPContext * SOAP_FMAC4 soap_in__ns1__GetGeoIPContext(struct soap*, const char*, _ns1__GetGeoIPContext *, const char*); #ifndef soap_write__ns1__GetGeoIPContext #define soap_write__ns1__GetGeoIPContext(soap, data) ( soap_begin_send(soap) || ((data)->soap_serialize(soap), 0) || (data)->soap_put(soap, "ns1:GetGeoIPContext", NULL) || soap_end_send(soap) ) #endif #ifndef soap_read__ns1__GetGeoIPContext #define soap_read__ns1__GetGeoIPContext(soap, data) ( soap_begin_recv(soap) || !soap_get__ns1__GetGeoIPContext(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 _ns1__GetGeoIPContext * SOAP_FMAC4 soap_get__ns1__GetGeoIPContext(struct soap*, _ns1__GetGeoIPContext *, const char*, const char*); #define soap_new__ns1__GetGeoIPContext(soap, n) soap_instantiate__ns1__GetGeoIPContext(soap, n, NULL, NULL, NULL) #define soap_delete__ns1__GetGeoIPContext(soap, p) soap_delete(soap, p) SOAP_FMAC1 _ns1__GetGeoIPContext * SOAP_FMAC2 soap_instantiate__ns1__GetGeoIPContext(struct soap*, int, const char*, const char*, size_t*); SOAP_FMAC3 void SOAP_FMAC4 soap_copy__ns1__GetGeoIPContext(struct soap*, int, int, void*, size_t, const void*, size_t); #ifndef SOAP_TYPE__ns1__GetGeoIPResponse #define SOAP_TYPE__ns1__GetGeoIPResponse (10) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_out__ns1__GetGeoIPResponse(struct soap*, const char*, int, const _ns1__GetGeoIPResponse *, const char*); SOAP_FMAC3 _ns1__GetGeoIPResponse * SOAP_FMAC4 soap_in__ns1__GetGeoIPResponse(struct soap*, const char*, _ns1__GetGeoIPResponse *, const char*); #ifndef soap_write__ns1__GetGeoIPResponse #define soap_write__ns1__GetGeoIPResponse(soap, data) ( soap_begin_send(soap) || ((data)->soap_serialize(soap), 0) || (data)->soap_put(soap, "ns1:GetGeoIPResponse", NULL) || soap_end_send(soap) ) #endif #ifndef soap_read__ns1__GetGeoIPResponse #define soap_read__ns1__GetGeoIPResponse(soap, data) ( soap_begin_recv(soap) || !soap_get__ns1__GetGeoIPResponse(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 _ns1__GetGeoIPResponse * SOAP_FMAC4 soap_get__ns1__GetGeoIPResponse(struct soap*, _ns1__GetGeoIPResponse *, const char*, const char*); #define soap_new__ns1__GetGeoIPResponse(soap, n) soap_instantiate__ns1__GetGeoIPResponse(soap, n, NULL, NULL, NULL) #define soap_delete__ns1__GetGeoIPResponse(soap, p) soap_delete(soap, p) SOAP_FMAC1 _ns1__GetGeoIPResponse * SOAP_FMAC2 soap_instantiate__ns1__GetGeoIPResponse(struct soap*, int, const char*, const char*, size_t*); SOAP_FMAC3 void SOAP_FMAC4 soap_copy__ns1__GetGeoIPResponse(struct soap*, int, int, void*, size_t, const void*, size_t); #ifndef SOAP_TYPE__ns1__GetGeoIP #define SOAP_TYPE__ns1__GetGeoIP (9) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_out__ns1__GetGeoIP(struct soap*, const char*, int, const _ns1__GetGeoIP *, const char*); SOAP_FMAC3 _ns1__GetGeoIP * SOAP_FMAC4 soap_in__ns1__GetGeoIP(struct soap*, const char*, _ns1__GetGeoIP *, const char*); #ifndef soap_write__ns1__GetGeoIP #define soap_write__ns1__GetGeoIP(soap, data) ( soap_begin_send(soap) || ((data)->soap_serialize(soap), 0) || (data)->soap_put(soap, "ns1:GetGeoIP", NULL) || soap_end_send(soap) ) #endif #ifndef soap_read__ns1__GetGeoIP #define soap_read__ns1__GetGeoIP(soap, data) ( soap_begin_recv(soap) || !soap_get__ns1__GetGeoIP(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 _ns1__GetGeoIP * SOAP_FMAC4 soap_get__ns1__GetGeoIP(struct soap*, _ns1__GetGeoIP *, const char*, const char*); #define soap_new__ns1__GetGeoIP(soap, n) soap_instantiate__ns1__GetGeoIP(soap, n, NULL, NULL, NULL) #define soap_delete__ns1__GetGeoIP(soap, p) soap_delete(soap, p) SOAP_FMAC1 _ns1__GetGeoIP * SOAP_FMAC2 soap_instantiate__ns1__GetGeoIP(struct soap*, int, const char*, const char*, size_t*); SOAP_FMAC3 void SOAP_FMAC4 soap_copy__ns1__GetGeoIP(struct soap*, int, int, void*, size_t, const void*, size_t); #ifndef SOAP_TYPE_ns1__GeoIP #define SOAP_TYPE_ns1__GeoIP (8) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns1__GeoIP(struct soap*, const char*, int, const ns1__GeoIP *, const char*); SOAP_FMAC3 ns1__GeoIP * SOAP_FMAC4 soap_in_ns1__GeoIP(struct soap*, const char*, ns1__GeoIP *, const char*); #ifndef soap_write_ns1__GeoIP #define soap_write_ns1__GeoIP(soap, data) ( soap_begin_send(soap) || ((data)->soap_serialize(soap), 0) || (data)->soap_put(soap, "ns1:GeoIP", NULL) || soap_end_send(soap) ) #endif #ifndef soap_read_ns1__GeoIP #define soap_read_ns1__GeoIP(soap, data) ( soap_begin_recv(soap) || !soap_get_ns1__GeoIP(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 ns1__GeoIP * SOAP_FMAC4 soap_get_ns1__GeoIP(struct soap*, ns1__GeoIP *, const char*, const char*); #define soap_new_ns1__GeoIP(soap, n) soap_instantiate_ns1__GeoIP(soap, n, NULL, NULL, NULL) #define soap_delete_ns1__GeoIP(soap, p) soap_delete(soap, p) SOAP_FMAC1 ns1__GeoIP * SOAP_FMAC2 soap_instantiate_ns1__GeoIP(struct soap*, int, const char*, const char*, size_t*); SOAP_FMAC3 void SOAP_FMAC4 soap_copy_ns1__GeoIP(struct soap*, int, int, void*, size_t, const void*, size_t); #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_SOAP_ENV__Fault #define SOAP_TYPE_SOAP_ENV__Fault (36) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Fault(struct soap*, struct SOAP_ENV__Fault *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Fault(struct soap*, const struct SOAP_ENV__Fault *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Fault(struct soap*, const char*, int, const struct SOAP_ENV__Fault *, const char*); SOAP_FMAC3 struct SOAP_ENV__Fault * SOAP_FMAC4 soap_in_SOAP_ENV__Fault(struct soap*, const char*, struct SOAP_ENV__Fault *, const char*); #ifndef soap_write_SOAP_ENV__Fault #define soap_write_SOAP_ENV__Fault(soap, data) ( soap_begin_send(soap) || (soap_serialize_SOAP_ENV__Fault(soap, data), 0) || soap_put_SOAP_ENV__Fault(soap, data, "SOAP-ENV:Fault", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Fault(struct soap*, const struct SOAP_ENV__Fault *, const char*, const char*); #ifndef soap_read_SOAP_ENV__Fault #define soap_read_SOAP_ENV__Fault(soap, data) ( soap_begin_recv(soap) || !soap_get_SOAP_ENV__Fault(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 struct SOAP_ENV__Fault * SOAP_FMAC4 soap_get_SOAP_ENV__Fault(struct soap*, struct SOAP_ENV__Fault *, const char*, const char*); #define soap_new_SOAP_ENV__Fault(soap, n) soap_instantiate_SOAP_ENV__Fault(soap, n, NULL, NULL, NULL) #define soap_delete_SOAP_ENV__Fault(soap, p) soap_delete(soap, p) SOAP_FMAC1 struct SOAP_ENV__Fault * SOAP_FMAC2 soap_instantiate_SOAP_ENV__Fault(struct soap*, int, const char*, const char*, size_t*); SOAP_FMAC3 void SOAP_FMAC4 soap_copy_SOAP_ENV__Fault(struct soap*, int, int, void*, size_t, const void*, size_t); #endif #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_SOAP_ENV__Reason #define SOAP_TYPE_SOAP_ENV__Reason (35) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Reason(struct soap*, struct SOAP_ENV__Reason *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Reason(struct soap*, const struct SOAP_ENV__Reason *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Reason(struct soap*, const char*, int, const struct SOAP_ENV__Reason *, const char*); SOAP_FMAC3 struct SOAP_ENV__Reason * SOAP_FMAC4 soap_in_SOAP_ENV__Reason(struct soap*, const char*, struct SOAP_ENV__Reason *, const char*); #ifndef soap_write_SOAP_ENV__Reason #define soap_write_SOAP_ENV__Reason(soap, data) ( soap_begin_send(soap) || (soap_serialize_SOAP_ENV__Reason(soap, data), 0) || soap_put_SOAP_ENV__Reason(soap, data, "SOAP-ENV:Reason", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Reason(struct soap*, const struct SOAP_ENV__Reason *, const char*, const char*); #ifndef soap_read_SOAP_ENV__Reason #define soap_read_SOAP_ENV__Reason(soap, data) ( soap_begin_recv(soap) || !soap_get_SOAP_ENV__Reason(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 struct SOAP_ENV__Reason * SOAP_FMAC4 soap_get_SOAP_ENV__Reason(struct soap*, struct SOAP_ENV__Reason *, const char*, const char*); #define soap_new_SOAP_ENV__Reason(soap, n) soap_instantiate_SOAP_ENV__Reason(soap, n, NULL, NULL, NULL) #define soap_delete_SOAP_ENV__Reason(soap, p) soap_delete(soap, p) SOAP_FMAC1 struct SOAP_ENV__Reason * SOAP_FMAC2 soap_instantiate_SOAP_ENV__Reason(struct soap*, int, const char*, const char*, size_t*); SOAP_FMAC3 void SOAP_FMAC4 soap_copy_SOAP_ENV__Reason(struct soap*, int, int, void*, size_t, const void*, size_t); #endif #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_SOAP_ENV__Detail #define SOAP_TYPE_SOAP_ENV__Detail (32) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Detail(struct soap*, struct SOAP_ENV__Detail *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Detail(struct soap*, const struct SOAP_ENV__Detail *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Detail(struct soap*, const char*, int, const struct SOAP_ENV__Detail *, const char*); SOAP_FMAC3 struct SOAP_ENV__Detail * SOAP_FMAC4 soap_in_SOAP_ENV__Detail(struct soap*, const char*, struct SOAP_ENV__Detail *, const char*); #ifndef soap_write_SOAP_ENV__Detail #define soap_write_SOAP_ENV__Detail(soap, data) ( soap_begin_send(soap) || (soap_serialize_SOAP_ENV__Detail(soap, data), 0) || soap_put_SOAP_ENV__Detail(soap, data, "SOAP-ENV:Detail", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Detail(struct soap*, const struct SOAP_ENV__Detail *, const char*, const char*); #ifndef soap_read_SOAP_ENV__Detail #define soap_read_SOAP_ENV__Detail(soap, data) ( soap_begin_recv(soap) || !soap_get_SOAP_ENV__Detail(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 struct SOAP_ENV__Detail * SOAP_FMAC4 soap_get_SOAP_ENV__Detail(struct soap*, struct SOAP_ENV__Detail *, const char*, const char*); #define soap_new_SOAP_ENV__Detail(soap, n) soap_instantiate_SOAP_ENV__Detail(soap, n, NULL, NULL, NULL) #define soap_delete_SOAP_ENV__Detail(soap, p) soap_delete(soap, p) SOAP_FMAC1 struct SOAP_ENV__Detail * SOAP_FMAC2 soap_instantiate_SOAP_ENV__Detail(struct soap*, int, const char*, const char*, size_t*); SOAP_FMAC3 void SOAP_FMAC4 soap_copy_SOAP_ENV__Detail(struct soap*, int, int, void*, size_t, const void*, size_t); #endif #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_SOAP_ENV__Code #define SOAP_TYPE_SOAP_ENV__Code (30) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Code(struct soap*, struct SOAP_ENV__Code *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Code(struct soap*, const struct SOAP_ENV__Code *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Code(struct soap*, const char*, int, const struct SOAP_ENV__Code *, const char*); SOAP_FMAC3 struct SOAP_ENV__Code * SOAP_FMAC4 soap_in_SOAP_ENV__Code(struct soap*, const char*, struct SOAP_ENV__Code *, const char*); #ifndef soap_write_SOAP_ENV__Code #define soap_write_SOAP_ENV__Code(soap, data) ( soap_begin_send(soap) || (soap_serialize_SOAP_ENV__Code(soap, data), 0) || soap_put_SOAP_ENV__Code(soap, data, "SOAP-ENV:Code", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Code(struct soap*, const struct SOAP_ENV__Code *, const char*, const char*); #ifndef soap_read_SOAP_ENV__Code #define soap_read_SOAP_ENV__Code(soap, data) ( soap_begin_recv(soap) || !soap_get_SOAP_ENV__Code(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 struct SOAP_ENV__Code * SOAP_FMAC4 soap_get_SOAP_ENV__Code(struct soap*, struct SOAP_ENV__Code *, const char*, const char*); #define soap_new_SOAP_ENV__Code(soap, n) soap_instantiate_SOAP_ENV__Code(soap, n, NULL, NULL, NULL) #define soap_delete_SOAP_ENV__Code(soap, p) soap_delete(soap, p) SOAP_FMAC1 struct SOAP_ENV__Code * SOAP_FMAC2 soap_instantiate_SOAP_ENV__Code(struct soap*, int, const char*, const char*, size_t*); SOAP_FMAC3 void SOAP_FMAC4 soap_copy_SOAP_ENV__Code(struct soap*, int, int, void*, size_t, const void*, size_t); #endif #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_SOAP_ENV__Header #define SOAP_TYPE_SOAP_ENV__Header (29) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Header(struct soap*, struct SOAP_ENV__Header *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Header(struct soap*, const struct SOAP_ENV__Header *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Header(struct soap*, const char*, int, const struct SOAP_ENV__Header *, const char*); SOAP_FMAC3 struct SOAP_ENV__Header * SOAP_FMAC4 soap_in_SOAP_ENV__Header(struct soap*, const char*, struct SOAP_ENV__Header *, const char*); #ifndef soap_write_SOAP_ENV__Header #define soap_write_SOAP_ENV__Header(soap, data) ( soap_begin_send(soap) || (soap_serialize_SOAP_ENV__Header(soap, data), 0) || soap_put_SOAP_ENV__Header(soap, data, "SOAP-ENV:Header", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Header(struct soap*, const struct SOAP_ENV__Header *, const char*, const char*); #ifndef soap_read_SOAP_ENV__Header #define soap_read_SOAP_ENV__Header(soap, data) ( soap_begin_recv(soap) || !soap_get_SOAP_ENV__Header(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 struct SOAP_ENV__Header * SOAP_FMAC4 soap_get_SOAP_ENV__Header(struct soap*, struct SOAP_ENV__Header *, const char*, const char*); #define soap_new_SOAP_ENV__Header(soap, n) soap_instantiate_SOAP_ENV__Header(soap, n, NULL, NULL, NULL) #define soap_delete_SOAP_ENV__Header(soap, p) soap_delete(soap, p) SOAP_FMAC1 struct SOAP_ENV__Header * SOAP_FMAC2 soap_instantiate_SOAP_ENV__Header(struct soap*, int, const char*, const char*, size_t*); SOAP_FMAC3 void SOAP_FMAC4 soap_copy_SOAP_ENV__Header(struct soap*, int, int, void*, size_t, const void*, size_t); #endif #ifndef SOAP_TYPE___ns3__GetGeoIPContext #define SOAP_TYPE___ns3__GetGeoIPContext (28) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default___ns3__GetGeoIPContext(struct soap*, struct __ns3__GetGeoIPContext *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize___ns3__GetGeoIPContext(struct soap*, const struct __ns3__GetGeoIPContext *); SOAP_FMAC3 int SOAP_FMAC4 soap_out___ns3__GetGeoIPContext(struct soap*, const char*, int, const struct __ns3__GetGeoIPContext *, const char*); SOAP_FMAC3 struct __ns3__GetGeoIPContext * SOAP_FMAC4 soap_in___ns3__GetGeoIPContext(struct soap*, const char*, struct __ns3__GetGeoIPContext *, const char*); #ifndef soap_write___ns3__GetGeoIPContext #define soap_write___ns3__GetGeoIPContext(soap, data) ( soap_begin_send(soap) || (soap_serialize___ns3__GetGeoIPContext(soap, data), 0) || soap_put___ns3__GetGeoIPContext(soap, data, "-ns3:GetGeoIPContext", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put___ns3__GetGeoIPContext(struct soap*, const struct __ns3__GetGeoIPContext *, const char*, const char*); #ifndef soap_read___ns3__GetGeoIPContext #define soap_read___ns3__GetGeoIPContext(soap, data) ( soap_begin_recv(soap) || !soap_get___ns3__GetGeoIPContext(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 struct __ns3__GetGeoIPContext * SOAP_FMAC4 soap_get___ns3__GetGeoIPContext(struct soap*, struct __ns3__GetGeoIPContext *, const char*, const char*); #define soap_new___ns3__GetGeoIPContext(soap, n) soap_instantiate___ns3__GetGeoIPContext(soap, n, NULL, NULL, NULL) #define soap_delete___ns3__GetGeoIPContext(soap, p) soap_delete(soap, p) SOAP_FMAC1 struct __ns3__GetGeoIPContext * SOAP_FMAC2 soap_instantiate___ns3__GetGeoIPContext(struct soap*, int, const char*, const char*, size_t*); SOAP_FMAC3 void SOAP_FMAC4 soap_copy___ns3__GetGeoIPContext(struct soap*, int, int, void*, size_t, const void*, size_t); #ifndef SOAP_TYPE___ns3__GetGeoIP #define SOAP_TYPE___ns3__GetGeoIP (26) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default___ns3__GetGeoIP(struct soap*, struct __ns3__GetGeoIP *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize___ns3__GetGeoIP(struct soap*, const struct __ns3__GetGeoIP *); SOAP_FMAC3 int SOAP_FMAC4 soap_out___ns3__GetGeoIP(struct soap*, const char*, int, const struct __ns3__GetGeoIP *, const char*); SOAP_FMAC3 struct __ns3__GetGeoIP * SOAP_FMAC4 soap_in___ns3__GetGeoIP(struct soap*, const char*, struct __ns3__GetGeoIP *, const char*); #ifndef soap_write___ns3__GetGeoIP #define soap_write___ns3__GetGeoIP(soap, data) ( soap_begin_send(soap) || (soap_serialize___ns3__GetGeoIP(soap, data), 0) || soap_put___ns3__GetGeoIP(soap, data, "-ns3:GetGeoIP", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put___ns3__GetGeoIP(struct soap*, const struct __ns3__GetGeoIP *, const char*, const char*); #ifndef soap_read___ns3__GetGeoIP #define soap_read___ns3__GetGeoIP(soap, data) ( soap_begin_recv(soap) || !soap_get___ns3__GetGeoIP(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 struct __ns3__GetGeoIP * SOAP_FMAC4 soap_get___ns3__GetGeoIP(struct soap*, struct __ns3__GetGeoIP *, const char*, const char*); #define soap_new___ns3__GetGeoIP(soap, n) soap_instantiate___ns3__GetGeoIP(soap, n, NULL, NULL, NULL) #define soap_delete___ns3__GetGeoIP(soap, p) soap_delete(soap, p) SOAP_FMAC1 struct __ns3__GetGeoIP * SOAP_FMAC2 soap_instantiate___ns3__GetGeoIP(struct soap*, int, const char*, const char*, size_t*); SOAP_FMAC3 void SOAP_FMAC4 soap_copy___ns3__GetGeoIP(struct soap*, int, int, void*, size_t, const void*, size_t); #ifndef SOAP_TYPE___ns2__GetGeoIPContext #define SOAP_TYPE___ns2__GetGeoIPContext (24) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default___ns2__GetGeoIPContext(struct soap*, struct __ns2__GetGeoIPContext *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize___ns2__GetGeoIPContext(struct soap*, const struct __ns2__GetGeoIPContext *); SOAP_FMAC3 int SOAP_FMAC4 soap_out___ns2__GetGeoIPContext(struct soap*, const char*, int, const struct __ns2__GetGeoIPContext *, const char*); SOAP_FMAC3 struct __ns2__GetGeoIPContext * SOAP_FMAC4 soap_in___ns2__GetGeoIPContext(struct soap*, const char*, struct __ns2__GetGeoIPContext *, const char*); #ifndef soap_write___ns2__GetGeoIPContext #define soap_write___ns2__GetGeoIPContext(soap, data) ( soap_begin_send(soap) || (soap_serialize___ns2__GetGeoIPContext(soap, data), 0) || soap_put___ns2__GetGeoIPContext(soap, data, "-ns2:GetGeoIPContext", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put___ns2__GetGeoIPContext(struct soap*, const struct __ns2__GetGeoIPContext *, const char*, const char*); #ifndef soap_read___ns2__GetGeoIPContext #define soap_read___ns2__GetGeoIPContext(soap, data) ( soap_begin_recv(soap) || !soap_get___ns2__GetGeoIPContext(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 struct __ns2__GetGeoIPContext * SOAP_FMAC4 soap_get___ns2__GetGeoIPContext(struct soap*, struct __ns2__GetGeoIPContext *, const char*, const char*); #define soap_new___ns2__GetGeoIPContext(soap, n) soap_instantiate___ns2__GetGeoIPContext(soap, n, NULL, NULL, NULL) #define soap_delete___ns2__GetGeoIPContext(soap, p) soap_delete(soap, p) SOAP_FMAC1 struct __ns2__GetGeoIPContext * SOAP_FMAC2 soap_instantiate___ns2__GetGeoIPContext(struct soap*, int, const char*, const char*, size_t*); SOAP_FMAC3 void SOAP_FMAC4 soap_copy___ns2__GetGeoIPContext(struct soap*, int, int, void*, size_t, const void*, size_t); #ifndef SOAP_TYPE___ns2__GetGeoIP #define SOAP_TYPE___ns2__GetGeoIP (20) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default___ns2__GetGeoIP(struct soap*, struct __ns2__GetGeoIP *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize___ns2__GetGeoIP(struct soap*, const struct __ns2__GetGeoIP *); SOAP_FMAC3 int SOAP_FMAC4 soap_out___ns2__GetGeoIP(struct soap*, const char*, int, const struct __ns2__GetGeoIP *, const char*); SOAP_FMAC3 struct __ns2__GetGeoIP * SOAP_FMAC4 soap_in___ns2__GetGeoIP(struct soap*, const char*, struct __ns2__GetGeoIP *, const char*); #ifndef soap_write___ns2__GetGeoIP #define soap_write___ns2__GetGeoIP(soap, data) ( soap_begin_send(soap) || (soap_serialize___ns2__GetGeoIP(soap, data), 0) || soap_put___ns2__GetGeoIP(soap, data, "-ns2:GetGeoIP", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put___ns2__GetGeoIP(struct soap*, const struct __ns2__GetGeoIP *, const char*, const char*); #ifndef soap_read___ns2__GetGeoIP #define soap_read___ns2__GetGeoIP(soap, data) ( soap_begin_recv(soap) || !soap_get___ns2__GetGeoIP(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 struct __ns2__GetGeoIP * SOAP_FMAC4 soap_get___ns2__GetGeoIP(struct soap*, struct __ns2__GetGeoIP *, const char*, const char*); #define soap_new___ns2__GetGeoIP(soap, n) soap_instantiate___ns2__GetGeoIP(soap, n, NULL, NULL, NULL) #define soap_delete___ns2__GetGeoIP(soap, p) soap_delete(soap, p) SOAP_FMAC1 struct __ns2__GetGeoIP * SOAP_FMAC2 soap_instantiate___ns2__GetGeoIP(struct soap*, int, const char*, const char*, size_t*); SOAP_FMAC3 void SOAP_FMAC4 soap_copy___ns2__GetGeoIP(struct soap*, int, int, void*, size_t, const void*, size_t); #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_PointerToSOAP_ENV__Reason #define SOAP_TYPE_PointerToSOAP_ENV__Reason (38) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToSOAP_ENV__Reason(struct soap*, struct SOAP_ENV__Reason *const*); SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerToSOAP_ENV__Reason(struct soap*, const char *, int, struct SOAP_ENV__Reason *const*, const char *); SOAP_FMAC3 struct SOAP_ENV__Reason ** SOAP_FMAC4 soap_in_PointerToSOAP_ENV__Reason(struct soap*, const char*, struct SOAP_ENV__Reason **, const char*); #ifndef soap_write_PointerToSOAP_ENV__Reason #define soap_write_PointerToSOAP_ENV__Reason(soap, data) ( soap_begin_send(soap) || (soap_serialize_PointerToSOAP_ENV__Reason(soap, data), 0) || soap_put_PointerToSOAP_ENV__Reason(soap, data, "SOAP-ENV:Reason", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerToSOAP_ENV__Reason(struct soap*, struct SOAP_ENV__Reason *const*, const char*, const char*); #ifndef soap_read_PointerToSOAP_ENV__Reason #define soap_read_PointerToSOAP_ENV__Reason(soap, data) ( soap_begin_recv(soap) || !soap_get_PointerToSOAP_ENV__Reason(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 struct SOAP_ENV__Reason ** SOAP_FMAC4 soap_get_PointerToSOAP_ENV__Reason(struct soap*, struct SOAP_ENV__Reason **, const char*, const char*); #endif #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_PointerToSOAP_ENV__Detail #define SOAP_TYPE_PointerToSOAP_ENV__Detail (37) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToSOAP_ENV__Detail(struct soap*, struct SOAP_ENV__Detail *const*); SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerToSOAP_ENV__Detail(struct soap*, const char *, int, struct SOAP_ENV__Detail *const*, const char *); SOAP_FMAC3 struct SOAP_ENV__Detail ** SOAP_FMAC4 soap_in_PointerToSOAP_ENV__Detail(struct soap*, const char*, struct SOAP_ENV__Detail **, const char*); #ifndef soap_write_PointerToSOAP_ENV__Detail #define soap_write_PointerToSOAP_ENV__Detail(soap, data) ( soap_begin_send(soap) || (soap_serialize_PointerToSOAP_ENV__Detail(soap, data), 0) || soap_put_PointerToSOAP_ENV__Detail(soap, data, "SOAP-ENV:Detail", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerToSOAP_ENV__Detail(struct soap*, struct SOAP_ENV__Detail *const*, const char*, const char*); #ifndef soap_read_PointerToSOAP_ENV__Detail #define soap_read_PointerToSOAP_ENV__Detail(soap, data) ( soap_begin_recv(soap) || !soap_get_PointerToSOAP_ENV__Detail(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 struct SOAP_ENV__Detail ** SOAP_FMAC4 soap_get_PointerToSOAP_ENV__Detail(struct soap*, struct SOAP_ENV__Detail **, const char*, const char*); #endif #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_PointerToSOAP_ENV__Code #define SOAP_TYPE_PointerToSOAP_ENV__Code (31) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToSOAP_ENV__Code(struct soap*, struct SOAP_ENV__Code *const*); SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerToSOAP_ENV__Code(struct soap*, const char *, int, struct SOAP_ENV__Code *const*, const char *); SOAP_FMAC3 struct SOAP_ENV__Code ** SOAP_FMAC4 soap_in_PointerToSOAP_ENV__Code(struct soap*, const char*, struct SOAP_ENV__Code **, const char*); #ifndef soap_write_PointerToSOAP_ENV__Code #define soap_write_PointerToSOAP_ENV__Code(soap, data) ( soap_begin_send(soap) || (soap_serialize_PointerToSOAP_ENV__Code(soap, data), 0) || soap_put_PointerToSOAP_ENV__Code(soap, data, "SOAP-ENV:Code", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerToSOAP_ENV__Code(struct soap*, struct SOAP_ENV__Code *const*, const char*, const char*); #ifndef soap_read_PointerToSOAP_ENV__Code #define soap_read_PointerToSOAP_ENV__Code(soap, data) ( soap_begin_recv(soap) || !soap_get_PointerToSOAP_ENV__Code(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 struct SOAP_ENV__Code ** SOAP_FMAC4 soap_get_PointerToSOAP_ENV__Code(struct soap*, struct SOAP_ENV__Code **, const char*, const char*); #endif #ifndef SOAP_TYPE_PointerTo_ns1__GetGeoIPContextResponse #define SOAP_TYPE_PointerTo_ns1__GetGeoIPContextResponse (22) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTo_ns1__GetGeoIPContextResponse(struct soap*, _ns1__GetGeoIPContextResponse *const*); SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTo_ns1__GetGeoIPContextResponse(struct soap*, const char *, int, _ns1__GetGeoIPContextResponse *const*, const char *); SOAP_FMAC3 _ns1__GetGeoIPContextResponse ** SOAP_FMAC4 soap_in_PointerTo_ns1__GetGeoIPContextResponse(struct soap*, const char*, _ns1__GetGeoIPContextResponse **, const char*); #ifndef soap_write_PointerTo_ns1__GetGeoIPContextResponse #define soap_write_PointerTo_ns1__GetGeoIPContextResponse(soap, data) ( soap_begin_send(soap) || (soap_serialize_PointerTo_ns1__GetGeoIPContextResponse(soap, data), 0) || soap_put_PointerTo_ns1__GetGeoIPContextResponse(soap, data, "ns1:GetGeoIPContextResponse", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTo_ns1__GetGeoIPContextResponse(struct soap*, _ns1__GetGeoIPContextResponse *const*, const char*, const char*); #ifndef soap_read_PointerTo_ns1__GetGeoIPContextResponse #define soap_read_PointerTo_ns1__GetGeoIPContextResponse(soap, data) ( soap_begin_recv(soap) || !soap_get_PointerTo_ns1__GetGeoIPContextResponse(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 _ns1__GetGeoIPContextResponse ** SOAP_FMAC4 soap_get_PointerTo_ns1__GetGeoIPContextResponse(struct soap*, _ns1__GetGeoIPContextResponse **, const char*, const char*); #ifndef SOAP_TYPE_PointerTo_ns1__GetGeoIPContext #define SOAP_TYPE_PointerTo_ns1__GetGeoIPContext (21) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTo_ns1__GetGeoIPContext(struct soap*, _ns1__GetGeoIPContext *const*); SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTo_ns1__GetGeoIPContext(struct soap*, const char *, int, _ns1__GetGeoIPContext *const*, const char *); SOAP_FMAC3 _ns1__GetGeoIPContext ** SOAP_FMAC4 soap_in_PointerTo_ns1__GetGeoIPContext(struct soap*, const char*, _ns1__GetGeoIPContext **, const char*); #ifndef soap_write_PointerTo_ns1__GetGeoIPContext #define soap_write_PointerTo_ns1__GetGeoIPContext(soap, data) ( soap_begin_send(soap) || (soap_serialize_PointerTo_ns1__GetGeoIPContext(soap, data), 0) || soap_put_PointerTo_ns1__GetGeoIPContext(soap, data, "ns1:GetGeoIPContext", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTo_ns1__GetGeoIPContext(struct soap*, _ns1__GetGeoIPContext *const*, const char*, const char*); #ifndef soap_read_PointerTo_ns1__GetGeoIPContext #define soap_read_PointerTo_ns1__GetGeoIPContext(soap, data) ( soap_begin_recv(soap) || !soap_get_PointerTo_ns1__GetGeoIPContext(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 _ns1__GetGeoIPContext ** SOAP_FMAC4 soap_get_PointerTo_ns1__GetGeoIPContext(struct soap*, _ns1__GetGeoIPContext **, const char*, const char*); #ifndef SOAP_TYPE_PointerTo_ns1__GetGeoIPResponse #define SOAP_TYPE_PointerTo_ns1__GetGeoIPResponse (18) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTo_ns1__GetGeoIPResponse(struct soap*, _ns1__GetGeoIPResponse *const*); SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTo_ns1__GetGeoIPResponse(struct soap*, const char *, int, _ns1__GetGeoIPResponse *const*, const char *); SOAP_FMAC3 _ns1__GetGeoIPResponse ** SOAP_FMAC4 soap_in_PointerTo_ns1__GetGeoIPResponse(struct soap*, const char*, _ns1__GetGeoIPResponse **, const char*); #ifndef soap_write_PointerTo_ns1__GetGeoIPResponse #define soap_write_PointerTo_ns1__GetGeoIPResponse(soap, data) ( soap_begin_send(soap) || (soap_serialize_PointerTo_ns1__GetGeoIPResponse(soap, data), 0) || soap_put_PointerTo_ns1__GetGeoIPResponse(soap, data, "ns1:GetGeoIPResponse", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTo_ns1__GetGeoIPResponse(struct soap*, _ns1__GetGeoIPResponse *const*, const char*, const char*); #ifndef soap_read_PointerTo_ns1__GetGeoIPResponse #define soap_read_PointerTo_ns1__GetGeoIPResponse(soap, data) ( soap_begin_recv(soap) || !soap_get_PointerTo_ns1__GetGeoIPResponse(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 _ns1__GetGeoIPResponse ** SOAP_FMAC4 soap_get_PointerTo_ns1__GetGeoIPResponse(struct soap*, _ns1__GetGeoIPResponse **, const char*, const char*); #ifndef SOAP_TYPE_PointerTo_ns1__GetGeoIP #define SOAP_TYPE_PointerTo_ns1__GetGeoIP (17) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTo_ns1__GetGeoIP(struct soap*, _ns1__GetGeoIP *const*); SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTo_ns1__GetGeoIP(struct soap*, const char *, int, _ns1__GetGeoIP *const*, const char *); SOAP_FMAC3 _ns1__GetGeoIP ** SOAP_FMAC4 soap_in_PointerTo_ns1__GetGeoIP(struct soap*, const char*, _ns1__GetGeoIP **, const char*); #ifndef soap_write_PointerTo_ns1__GetGeoIP #define soap_write_PointerTo_ns1__GetGeoIP(soap, data) ( soap_begin_send(soap) || (soap_serialize_PointerTo_ns1__GetGeoIP(soap, data), 0) || soap_put_PointerTo_ns1__GetGeoIP(soap, data, "ns1:GetGeoIP", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTo_ns1__GetGeoIP(struct soap*, _ns1__GetGeoIP *const*, const char*, const char*); #ifndef soap_read_PointerTo_ns1__GetGeoIP #define soap_read_PointerTo_ns1__GetGeoIP(soap, data) ( soap_begin_recv(soap) || !soap_get_PointerTo_ns1__GetGeoIP(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 _ns1__GetGeoIP ** SOAP_FMAC4 soap_get_PointerTo_ns1__GetGeoIP(struct soap*, _ns1__GetGeoIP **, const char*, const char*); #ifndef SOAP_TYPE_PointerTons1__GeoIP #define SOAP_TYPE_PointerTons1__GeoIP (16) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTons1__GeoIP(struct soap*, ns1__GeoIP *const*); SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTons1__GeoIP(struct soap*, const char *, int, ns1__GeoIP *const*, const char *); SOAP_FMAC3 ns1__GeoIP ** SOAP_FMAC4 soap_in_PointerTons1__GeoIP(struct soap*, const char*, ns1__GeoIP **, const char*); #ifndef soap_write_PointerTons1__GeoIP #define soap_write_PointerTons1__GeoIP(soap, data) ( soap_begin_send(soap) || (soap_serialize_PointerTons1__GeoIP(soap, data), 0) || soap_put_PointerTons1__GeoIP(soap, data, "ns1:GeoIP", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTons1__GeoIP(struct soap*, ns1__GeoIP *const*, const char*, const char*); #ifndef soap_read_PointerTons1__GeoIP #define soap_read_PointerTons1__GeoIP(soap, data) ( soap_begin_recv(soap) || !soap_get_PointerTons1__GeoIP(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 ns1__GeoIP ** SOAP_FMAC4 soap_get_PointerTons1__GeoIP(struct soap*, ns1__GeoIP **, const char*, const char*); #ifndef SOAP_TYPE_PointerTostd__string #define SOAP_TYPE_PointerTostd__string (14) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTostd__string(struct soap*, std::string *const*); SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTostd__string(struct soap*, const char *, int, std::string *const*, const char *); SOAP_FMAC3 std::string ** SOAP_FMAC4 soap_in_PointerTostd__string(struct soap*, const char*, std::string **, const char*); #ifndef soap_write_PointerTostd__string #define soap_write_PointerTostd__string(soap, data) ( soap_begin_send(soap) || (soap_serialize_PointerTostd__string(soap, data), 0) || soap_put_PointerTostd__string(soap, data, "string", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTostd__string(struct soap*, std::string *const*, const char*, const char*); #ifndef soap_read_PointerTostd__string #define soap_read_PointerTostd__string(soap, data) ( soap_begin_recv(soap) || !soap_get_PointerTostd__string(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 std::string ** SOAP_FMAC4 soap_get_PointerTostd__string(struct soap*, std::string **, const char*, const char*); #ifndef SOAP_TYPE__QName #define SOAP_TYPE__QName (5) #endif #define soap_default__QName(soap, a) soap_default_string(soap, a) #define soap_serialize__QName(soap, a) soap_serialize_string(soap, a) SOAP_FMAC3 int SOAP_FMAC4 soap_out__QName(struct soap*, const char*, int, char*const*, const char*); SOAP_FMAC3 char * * SOAP_FMAC4 soap_in__QName(struct soap*, const char*, char **, const char*); #ifndef soap_write__QName #define soap_write__QName(soap, data) ( soap_begin_send(soap) || (soap_serialize__QName(soap, data), 0) || soap_put__QName(soap, data, "byte", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put__QName(struct soap*, char *const*, const char*, const char*); #ifndef soap_read__QName #define soap_read__QName(soap, data) ( soap_begin_recv(soap) || !soap_get__QName(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 char ** SOAP_FMAC4 soap_get__QName(struct soap*, char **, const char*, const char*); #ifndef SOAP_TYPE_string #define SOAP_TYPE_string (4) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_string(struct soap*, char **); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_string(struct soap*, char *const*); SOAP_FMAC3 int SOAP_FMAC4 soap_out_string(struct soap*, const char*, int, char*const*, const char*); SOAP_FMAC3 char * * SOAP_FMAC4 soap_in_string(struct soap*, const char*, char **, const char*); #ifndef soap_write_string #define soap_write_string(soap, data) ( soap_begin_send(soap) || (soap_serialize_string(soap, data), 0) || soap_put_string(soap, data, "byte", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_string(struct soap*, char *const*, const char*, const char*); #ifndef soap_read_string #define soap_read_string(soap, data) ( soap_begin_recv(soap) || !soap_get_string(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 char ** SOAP_FMAC4 soap_get_string(struct soap*, char **, const char*, const char*); #endif /* End of soapH.h */ gsoap-2.8.28/gsoap/ios_plugin/examples/GeoIPService/Classes/GeoIPServiceSoap12.nsmap0000644000175000017500000000126012653650146027565 0ustar ellertellert #include "soapH.h" SOAP_NMAC struct Namespace namespaces[] = { {"SOAP-ENV", "http://www.w3.org/2003/05/soap-envelope", "http://www.w3.org/2003/05/soap-envelope", NULL}, {"SOAP-ENC", "http://www.w3.org/2003/05/soap-encoding", "http://www.w3.org/2003/05/soap-encoding", NULL}, {"xsi", "http://www.w3.org/2001/XMLSchema-instance", "http://www.w3.org/*/XMLSchema-instance", NULL}, {"xsd", "http://www.w3.org/2001/XMLSchema", "http://www.w3.org/*/XMLSchema", NULL}, {"ns2", "http://www.webservicex.net/GeoIPServiceSoap", NULL, NULL}, {"ns1", "http://www.webservicex.net/", NULL, NULL}, {"ns3", "http://www.webservicex.net/GeoIPServiceSoap12", NULL, NULL}, {NULL, NULL, NULL, NULL} }; gsoap-2.8.28/gsoap/ios_plugin/examples/GeoIPService/Classes/stdsoap2.h0000644000175000017500000026240412653650146025174 0ustar ellertellert/* stdsoap2.h 2.8.8 gSOAP runtime engine gSOAP XML Web services tools Copyright (C) 2000-2011, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under ONE of the following licenses: GPL, or the gSOAP public license, or Genivia's license for commercial use. -------------------------------------------------------------------------------- Contributors: Wind River Systems, Inc., for the following additions - vxWorks compatible -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2011, Robert van Engelen, Genivia Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #define GSOAP_VERSION 20808 #ifdef WITH_SOAPDEFS_H # include "soapdefs.h" /* include user-defined stuff */ #endif #ifndef _THREAD_SAFE # define _THREAD_SAFE #endif #ifndef OPENSERVER # ifndef _REENTRANT # define _REENTRANT # endif #endif #ifndef SOAP_FMAC1 /* stdsoap2.h declaration macro */ # define SOAP_FMAC1 #endif #ifndef SOAP_FMAC2 /* stdsoap2.h declaration macro */ # define SOAP_FMAC2 #endif #ifndef SOAP_FMAC3 /* (de)serializer declaration macro */ # define SOAP_FMAC3 #endif #ifndef SOAP_FMAC3S /* string converter for (de)serializer declaration macro */ # define SOAP_FMAC3S SOAP_FMAC3 #endif #ifndef SOAP_FMAC4 /* (de)serializer declaration macro */ # define SOAP_FMAC4 #endif #ifndef SOAP_FMAC4S /* string converter for (de)serializer declaration macro */ # define SOAP_FMAC4S SOAP_FMAC4 #endif #ifndef SOAP_FMAC5 /* stub/skeleton declaration macro */ # define SOAP_FMAC5 #endif #ifndef SOAP_FMAC6 /* stub/skeleton declaration macro */ # define SOAP_FMAC6 #endif #ifndef SOAP_CMAC /* class declaration macro */ # define SOAP_CMAC #endif #ifndef SOAP_NMAC /* namespace table declaration macro */ # define SOAP_NMAC #endif #ifndef SOAP_SOURCE_STAMP # define SOAP_SOURCE_STAMP(str) #endif /* gSOAP 2.7.4 and higher: fast look-aside buffering is stable */ #ifndef WITH_FAST # define WITH_FAST #endif #ifndef STDSOAP_H #define STDSOAP_H #if defined(__vxworks) || defined(__VXWORKS__) # ifndef VXWORKS # define VXWORKS # endif #endif #ifdef _WIN32 # ifndef WIN32 # define WIN32 # endif #endif #ifdef _WIN32_WCE # ifndef UNDER_CE # define UNDER_CE _WIN32_WCE # endif #endif #ifdef UNDER_CE # ifndef WIN32 # define WIN32 # endif #endif #ifdef __BORLANDC__ # ifdef __WIN32__ # ifndef WIN32 # define WIN32 # endif # endif #endif #ifdef __CYGWIN__ # ifndef CYGWIN # define CYGWIN # endif #endif #ifdef __SYMBIAN32__ # define SYMBIAN # undef WIN32 #endif #if defined(__palmos__) || defined(PALM_GCC) || defined(__PALMOS_TRAPS__) # ifndef PALM # define PALM # endif #endif #if defined(__hpux) # ifndef HP_UX # define HP_UX # endif #endif #if defined(__digital__) && defined(__unix__) # ifndef TRU64 # define TRU64 # endif #endif #ifdef __MVS__ # ifndef OS390 # define OS390 # endif #endif #ifdef HAVE_CONFIG_H # include "config.h" # if defined(WITH_OPENSSL) # ifndef HAVE_OPENSSL_SSL_H # undef WITH_OPENSSL # endif # endif # if defined(WITH_GNUTLS) # ifndef HAVE_GNUTLS_GNUTLS_H # undef WITH_GNUTLS # endif # endif # if defined(WITH_ZLIB) || defined(WITH_GZIP) # ifndef HAVE_ZLIB_H # undef WITH_ZLIB # undef WITH_GZIP # endif # endif #else # if defined(UNDER_CE) # define WITH_LEAN # define HAVE_SSCANF # elif defined(WIN32) # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOD_L # define HAVE_SPRINTF_L # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_SYS_TIMEB_H # define HAVE_FTIME # define HAVE_GMTIME # define HAVE_WCTOMB # define HAVE_MBTOWC # define SOAP_LONG_FORMAT "%I64d" # define SOAP_ULONG_FORMAT "%I64u" # elif defined(CYGWIN) # define HAVE_POLL # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_SYS_TIMEB_H # define HAVE_FTIME # define HAVE_RAND_R # define HAVE_GMTIME_R # define HAVE_LOCALTIME_R # define HAVE_STRERROR_R # define HAVE_WCTOMB # define HAVE_MBTOWC # elif defined(__APPLE__) # define HAVE_POLL # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOD_L # define HAVE_SSCANF_L # define HAVE_SPRINTF_L # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_RAND_R # define HAVE_GMTIME_R # define HAVE_LOCALTIME_R # define HAVE_STRERROR_R # define HAVE_TIMEGM # define HAVE_WCTOMB # define HAVE_MBTOWC # elif defined(_AIX43) # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_SYS_TIMEB_H # define HAVE_FTIME # define HAVE_RAND_R # define HAVE_GMTIME_R # define HAVE_LOCALTIME_R # define HAVE_WCTOMB # define HAVE_MBTOWC # elif defined(_AIX41) # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_SYS_TIMEB_H # define HAVE_WCTOMB # define HAVE_MBTOWC # elif defined(HP_UX) # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_SYS_TIMEB_H # define HAVE_FTIME # define HAVE_RAND_R # define HAVE_GMTIME_R # define HAVE_LOCALTIME_R # define HAVE_WCTOMB # define HAVE_MBTOWC # define HAVE_ISNAN # define HAVE_ISINF # elif defined(FREEBSD) || defined(__FreeBSD__) || defined(OPENBSD) # define HAVE_POLL # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOD_L # define HAVE_SSCANF_L # define HAVE_SPRINTF_L # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_STRTOLL # define HAVE_STRTOULL # define HAVE_GETTIMEOFDAY # define HAVE_RAND_R # define HAVE_GMTIME_R # define HAVE_LOCALTIME_R # define HAVE_STRERROR_R # define HAVE_WCTOMB # define HAVE_MBTOWC # define SOAP_LONG_FORMAT "%qd" # define SOAP_ULONG_FORMAT "%qu" # define HAVE_ISNAN # define HAVE_ISINF # elif defined(__VMS) # include # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_SYS_TIMEB_H # define HAVE_FTIME # define HAVE_RAND_R # define HAVE_GMTIME_R # define HAVE_LOCALTIME_R # define HAVE_WCTOMB # define HAVE_MBTOWC # elif defined(__GLIBC__) || defined(__GNU__) # define HAVE_POLL # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOD_L # define HAVE_SSCANF_L # define HAVE_SPRINTF_L # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_STRTOLL # define HAVE_STRTOULL # define HAVE_SYS_TIMEB_H # define HAVE_FTIME # define HAVE_RAND_R # define HAVE_GMTIME_R # define HAVE_LOCALTIME_R # define HAVE_STRERROR_R # define HAVE_TIMEGM # define HAVE_WCTOMB # define HAVE_MBTOWC # define HAVE_ISNAN # define HAVE_ISINF # elif defined(TRU64) # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_GETTIMEOFDAY # define HAVE_SYS_TIMEB_H # define HAVE_RAND_R # define HAVE_GMTIME_R # define HAVE_LOCALTIME_R # define __USE_STD_IOSTREAM # define HAVE_WCTOMB # define HAVE_MBTOWC # define SOAP_LONG_FORMAT "%ld" # define SOAP_ULONG_FORMAT "%lu" # elif defined(MAC_CARBON) # define WITH_NOIO # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOD_L # define HAVE_SSCANF_L # define HAVE_SPRINTF_L # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_FTIME # define HAVE_RAND_R # define HAVE_GETHOSTBYNAME_R # define HAVE_GMTIME_R # define HAVE_LOCALTIME_R # define HAVE_STRERROR_R # define HAVE_WCTOMB # define HAVE_MBTOWC # elif defined(PALM) # define WITH_LEAN # define HAVE_STRTOD /* strtod() is defined in palmFunctions.h */ # include /* Needs to be included before unix headers */ # include # define IGNORE_STDIO_STUBS # include # define O_NONBLOCK FNONBIO # include # include "palmFunctions.h" # elif defined(SYMBIAN) # define WITH_LEAN # define WITH_NONAMESPACES # define HAVE_STRTOD /* use STRTOD since sscanf doesn't seem to work */ # include # include # elif defined(VXWORKS) # ifdef _WRS_KERNEL # define _POSIX_THREADS 1 # endif # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_GMTIME # define HAVE_LOCALTIME # define HAVE_MKTIME # elif defined(OS390) # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_SYS_TIMEB_H # define HAVE_FTIME # define HAVE_RAND_R # define HAVE_GMTIME_R # define HAVE_LOCALTIME_R # define HAVE_WCTOMB # define HAVE_MBTOWC # elif defined(AS400) # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_SYS_TIMEB_H # define HAVE_FTIME # define HAVE_RAND_R # define HAVE_GMTIME_R # define HAVE_LOCALTIME_R # define HAVE_WCTOMB # define HAVE_MBTOWC # elif defined(__QNX__) || defined(QNX) /* QNX does not have a working version of strtof */ # undef HAVE_STRTOF # define HAVE_POLL # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_SYS_TIMEB_H # define HAVE_FTIME # define HAVE_RAND_R # define HAVE_GETHOSTBYNAME_R # define HAVE_GMTIME_R # define HAVE_LOCALTIME_R # define HAVE_STRERROR_R # define HAVE_WCTOMB # define HAVE_MBTOWC # define LONG64 long # define ULONG64 unsigned LONG64 # define SOAP_LONG_FORMAT "%ld" # define SOAP_ULONG_FORMAT "%lu" # elif defined(SUN_OS) # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_SYS_TIMEB_H # define HAVE_FTIME # define HAVE_RAND_R # define HAVE_GETHOSTBYNAME_R # define HAVE_GMTIME_R # define HAVE_LOCALTIME_R # else /* Default assumptions for supported functions */ # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_SYS_TIMEB_H # define HAVE_FTIME # define HAVE_RAND_R # define HAVE_GETHOSTBYNAME_R # define HAVE_GMTIME_R # define HAVE_LOCALTIME_R # define HAVE_STRERROR_R # ifdef MB_LEN_MAX # define HAVE_WCTOMB # define HAVE_MBTOWC # endif # endif #endif /* gSOAP 2.7.15 and higher: always retain CDATA in literal XML, unless WITH_LEAN or WITH_NOCDATA */ #ifndef WITH_LEAN # ifndef WITH_NOCDATA # ifndef WITH_CDATA # define WITH_CDATA # endif # endif #endif #ifdef WITH_LEANER # ifndef WITH_LEAN # define WITH_LEAN # endif #endif #ifdef WITH_LEAN # ifdef WITH_COOKIES # error "Cannot build WITH_LEAN code WITH_COOKIES enabled" # endif #endif /* native Win, HP-UX, and AIX compilers don't like empty structs */ #if defined(WIN32) || defined(HP_UX) || defined(_AIX41) || defined(_AIX43) || defined(VXWORKS) # define WITH_NOEMPTYSTRUCT #endif #ifdef WITH_PURE_VIRTUAL # define SOAP_PURE_VIRTUAL = 0 #else # define SOAP_PURE_VIRTUAL #endif #ifdef HP_UX # undef HAVE_STRTOLL # undef HAVE_STRTOULL #endif /* older OpenVMS TCP/IP stacks cannot handle 65536 bytes */ #ifdef __VMS # ifndef SOAP_BUFLEN /* # define SOAP_BUFLEN (65535) */ # define SOAP_BUFLEN (8) # endif #endif /* if we have xlocale.h we use it to avoid decimal point conversion issues */ #ifdef WITH_C_LOCALE # ifdef WIN32 # include # else # include # endif #else # undef HAVE_STRTOF_L # undef HAVE_STRTOD_L # undef HAVE_SSCANF_L # undef HAVE_SPRINTF_L #endif #ifdef TANDEM_NONSTOP /* # define SOAP_BUFLEN (32767) */ # define SOAP_BUFLEN (8) /*# define WITH_NOSTDLIB */ /* uncommment to remove stdlib dependences */ # define WITH_NOIO /* no IO dependences, e.g. remove TCP/IP */ # define int32_t int # define int64_t long long # define LONG64 long long # define ULONG64 long long # define DBL_PINFTY (1.1579208923716189e77) # define WITH_NOEMPTYSTRUCT # undef HAVE_WCTOMB # undef HAVE_MBTOWC # undef HAVE_GMTIME_R # undef HAVE_LOCALTIME_R # undef HAVE_SNPRINTF /* # define SOAP_BUFLEN (32767) */ # define SOAP_BUFLEN (8) # define SOAP_SOCKET short #pragma nolist # include # include # include # include # include # include # include # include # include # include # include # define INET_ERROR 4294967295 #pragma list #endif #ifndef WITH_NOSTDLIB # include # ifndef PALM # include # include # endif # include # include #endif #ifdef WITH_NTLM # include #endif #ifdef HAVE_POLL # include #endif #if defined(__cplusplus) && !defined(WITH_LEAN) && !defined(WITH_COMPAT) # include # include #endif #ifdef WITH_NOHTTP # ifndef WITH_NOIO # define WITH_NOIO # undef WITH_COOKIES # endif #endif /* Suggestion when SOAP_FD_EXCEEDED error occurs: Some systems allow increasing FD_SETSIZE before including sys/types.h: #define FD_SETSIZE (2048) */ #ifndef UNDER_CE # ifndef PALM # ifndef WITH_NOIO # include # include # endif # ifndef WITH_LEAN # ifdef HAVE_SYS_TIMEB_H # include /* for ftime() */ # endif # include # endif # endif #endif #ifdef OPENSERVER # include # include # include extern int h_errno; #endif #ifndef WITH_NOIO # ifndef WIN32 # ifndef PALM # include # ifdef VXWORKS # include # include # ifndef _WRS_KERNEL # include # endif # else # ifndef SYMBIAN # include # endif # endif # ifdef SUN_OS # include /* SUN */ # include /* SUN < 2.8 (?) */ # endif # ifdef VXWORKS # ifdef _WRS_KERNEL # include # endif # else # include # endif # include # ifdef OS390 # include # else # include /* TCP_NODELAY */ # endif # include # endif # endif #endif #ifdef WIN32 # define SOAP_WINSOCKINT int #else # define SOAP_WINSOCKINT size_t #endif #if defined(WITH_IPV6_V6ONLY) || defined(WITH_NO_IPV6_V6ONLY) # ifndef WITH_IPV6 # define WITH_IPV6 # endif #endif #ifdef WIN32 # ifndef UNDER_CE # include # include # endif // When you get macro redefinition errors when compiling the code below: // try arrange your include list that is included after "stdsoap2.h" // or define _WINSOCKAPI_ first: // #define _WINSOCKAPI_ // stops windows.h including winsock.h // #include // #include "stdsoap2.h" # include /* Visual Studio 2005 users: install Platform SDK (R2) */ # include // # define _WSPIAPI_COUNTOF /* DEV NOTE: enble to fix problems with VC6 */ // # include # include /* DEV NOTE: replaces older wspiapi.h above */ # ifdef WITH_IPV6 # define SOAP_GAI_STRERROR gai_strerrorA # endif #else # ifdef VXWORKS # include # include # include # endif # ifndef WITH_NOIO # ifndef PALM # include # include # include # include # ifdef _AIX41 # include # endif # endif # endif #endif #ifdef WITH_FASTCGI # include #endif #ifdef WITH_OPENSSL # ifdef __VMS # pragma names save # pragma names uppercase # endif # undef WITH_GNUTLS # define OPENSSL_NO_KRB5 # include # include # include # include # include # ifndef ALLOW_OLD_VERSIONS # if (OPENSSL_VERSION_NUMBER < 0x00905100L) # error "Must use OpenSSL 0.9.6 or later" # endif # endif # ifdef __VMS # pragma names restore # endif #endif #ifdef WITH_GNUTLS # include # include # include # ifndef HAVE_PTHREAD_H # ifdef _POSIX_THREADS # define HAVE_PTHREAD_H /* make GNUTLS thread safe */ # endif # endif #endif #ifdef WITH_GZIP # ifndef WITH_ZLIB # define WITH_ZLIB # endif #endif #ifdef WITH_CASEINSENSITIVETAGS # define SOAP_STRCMP soap_tag_cmp /* case insensitve XML element/attribute names */ #else # define SOAP_STRCMP strcmp /* case sensitive XML element/attribute names */ #endif #ifdef WITH_ZLIB # include #endif #ifndef WITH_NOSTDLIB # ifndef PALM # include /* for isnan() */ # endif #endif /* #define DEBUG */ /* Uncomment to debug sending (in file SENT.log) receiving (in file RECV.log) and messages (in file TEST.log) */ #ifdef __cplusplus extern "C" { #endif /* Portability: define SOAP_SOCKLEN_T */ #if defined(_AIX) # if defined(_AIX43) # define SOAP_SOCKLEN_T socklen_t # else # define SOAP_SOCKLEN_T int # endif #elif defined(SOCKLEN_T) # define SOAP_SOCKLEN_T SOCKLEN_T #elif defined(__socklen_t_defined) || defined(_SOCKLEN_T) || defined(CYGWIN) || defined(FREEBSD) || defined(__FreeBSD__) || defined(OPENBSD) || defined(__QNX__) || defined(QNX) || defined(OS390) || defined(HP_UX) # define SOAP_SOCKLEN_T socklen_t #elif defined(IRIX) || defined(WIN32) || defined(__APPLE__) || defined(SUN_OS) || defined(OPENSERVER) || defined(TRU64) || defined(VXWORKS) # define SOAP_SOCKLEN_T int #else # define SOAP_SOCKLEN_T size_t #endif #ifndef SOAP_SOCKET # ifdef WIN32 # define SOAP_SOCKET SOCKET # define soap_closesocket(n) closesocket(n) # else # define SOAP_SOCKET int # define soap_closesocket(n) close(n) # endif #endif #define SOAP_INVALID_SOCKET ((SOAP_SOCKET)-1) #define soap_valid_socket(n) ((n) != SOAP_INVALID_SOCKET) #define SOAP_SHUT_WR 1 #define SOAP_SHUT_RDWR 2 #ifndef SOAP_GAI_STRERROR # define SOAP_GAI_STRERROR gai_strerror #endif #ifndef FD_SETSIZE # define FD_SETSIZE (1024) #endif #ifdef WITH_LEAN # define SOAP_CHK_EOF SOAP_EOF #else # define SOAP_CHK_EOF (soap->error ? soap->error : SOAP_EOF) #endif #if defined(SYMBIAN) # define LONG64 long # define ULONG64 unsigned LONG64 #elif !defined(WIN32) || defined(CYGWIN) || defined(__GLIBC__) || defined(__GNU__) # ifndef LONG64 # if defined(HAVE_STDINT_H) # include # define LONG64 int64_t # define ULONG64 uint64_t # elif defined(__GLIBC__) # include # if (__WORDSIZE == 64) # define LONG64 int64_t # define ULONG64 uint64_t # ifndef SOAP_LONG_FORMAT # define SOAP_LONG_FORMAT "%ld" # endif # ifndef SOAP_ULONG_FORMAT # define SOAP_ULONG_FORMAT "%lu" # endif # else # define LONG64 long long # define ULONG64 unsigned LONG64 # endif # else # define LONG64 long long # define ULONG64 unsigned LONG64 # endif # endif #elif defined(UNDER_CE) # define LONG64 __int64 # define ULONG64 unsigned LONG64 #elif defined(__BORLANDC__) # define LONG64 __int64 # define ULONG64 unsigned LONG64 #endif #ifndef SOAP_LONG_FORMAT # define SOAP_LONG_FORMAT "%lld" /* printf format for 64 bit ints */ #endif #ifndef SOAP_ULONG_FORMAT # define SOAP_ULONG_FORMAT "%llu" /* printf format for unsigned 64 bit ints */ #endif #if defined(WIN32) && !defined(CYGWIN) # define soap_int32 __int32 #elif defined(SYMBIAN) # define soap_int32 long #elif defined(PALM) # define soap_int32 Int32 #elif defined(_AIX) # if defined(_AIX43) # define soap_int32 int32_t # else # define soap_int32 signed int # endif #else # define soap_int32 int32_t #endif #ifdef WIN32 # define SOAP_ERANGE ERANGE # define SOAP_EINTR WSAEINTR # define SOAP_EAGAIN WSAEWOULDBLOCK # define SOAP_EWOULDBLOCK WSAEWOULDBLOCK # define SOAP_EINPROGRESS WSAEINPROGRESS # define SOAP_EADDRINUSE WSAEADDRINUSE #else # define SOAP_ERANGE ERANGE # define SOAP_EINTR EINTR # define SOAP_EAGAIN EAGAIN # define SOAP_EADDRINUSE EADDRINUSE # ifdef SYMBIAN # define SOAP_EWOULDBLOCK 9898 # define SOAP_EINPROGRESS 9899 # else # define SOAP_EWOULDBLOCK EWOULDBLOCK # define SOAP_EINPROGRESS EINPROGRESS # endif #endif #ifdef WIN32 # ifdef UNDER_CE # define soap_errno GetLastError() # define soap_socket_errno(s) GetLastError() # define soap_reset_errno SetLastError(0) # else # define soap_errno GetLastError() # define soap_socket_errno(s) WSAGetLastError() # define soap_reset_errno SetLastError(0) # endif #else # ifndef WITH_NOIO # define soap_errno errno # define soap_socket_errno(s) errno # define soap_reset_errno (errno = 0) # else # define soap_errno 0 # define soap_socket_errno(s) 0 # define soap_reset_errno # endif #endif #ifndef SOAP_BUFLEN # if !defined(WITH_LEAN) /* /# define SOAP_BUFLEN (65536) // buffer length for socket packets, also used by gethostbyname_r and UDP messages, so don't make this too small */ # define SOAP_BUFLEN (8) /* buffer length for socket packets, also used by gethostbyname_r and UDP messages, so don't make this too small */ # else /*# define SOAP_BUFLEN (2048) // lean size */ # define SOAP_BUFLEN (8) /* lean size */ # endif #endif #ifndef SOAP_LABLEN # define SOAP_LABLEN (256) /* initial look-aside buffer length */ #endif #ifndef SOAP_PTRBLK # define SOAP_PTRBLK (32) /* block allocation for pointer hash table chains */ #endif #ifndef SOAP_PTRHASH # ifndef WITH_LEAN # define SOAP_PTRHASH (4096) /* size of pointer analysis hash table (must be power of 2) */ # else # define SOAP_PTRHASH (32) # endif #endif #ifndef SOAP_IDHASH # ifndef WITH_LEAN # define SOAP_IDHASH (1999) /* prime size of hash table for parsed id/ref */ # else # define SOAP_IDHASH (19) /* 19, 199 */ # endif #endif #ifndef SOAP_BLKLEN # ifndef WITH_LEAN # define SOAP_BLKLEN (256) /* to collect long strings and XML attributes */ # else # define SOAP_BLKLEN (32) # endif #endif #ifndef SOAP_TAGLEN # ifndef WITH_LEAN # define SOAP_TAGLEN (1024) /* maximum length of XML element tag/attribute name or host/path name + 1 */ # else # define SOAP_TAGLEN (128) # endif #endif #ifndef SOAP_HDRLEN # ifndef WITH_LEAN # define SOAP_HDRLEN (8192) /* maximum length of HTTP header line (must be >4096 to read cookies) */ # else # define SOAP_HDRLEN (1024) # endif #endif #ifndef SOAP_MAXDIMS # ifndef WITH_LEAN # define SOAP_MAXDIMS (16) /* maximum array dimensions (array nestings) must be less than 64 to protect soap->tmpbuf */ # else # define SOAP_MAXDIMS (4) # endif #endif #ifndef SOAP_MAXLOGS # define SOAP_MAXLOGS (3) /* max number of debug logs per struct soap environment */ # define SOAP_INDEX_RECV (0) # define SOAP_INDEX_SENT (1) # define SOAP_INDEX_TEST (2) #endif /* Max iterations in soap_serve() to keep server connection alive */ #ifndef SOAP_MAXKEEPALIVE # define SOAP_MAXKEEPALIVE (100) #endif /* Trusted max size of inbound SOAP array for compound array allocation. Increase if necessary to allow larger arrays. */ #ifndef SOAP_MAXARRAYSIZE # define SOAP_MAXARRAYSIZE (1000000) #endif #ifdef VXWORKS # ifdef WMW_RPM_IO # include "httpLib.h" # endif # ifdef __INCmathh # include # ifndef HAVE_ISNAN # define HAVE_ISNAN # endif # ifndef soap_isnan # define soap_isnan(num) isNan(num) # endif # endif # ifdef WM_SECURE_KEY_STORAGE # include # endif #endif #ifdef WIN32 # include # ifndef HAVE_ISNAN # define HAVE_ISNAN # endif # define soap_isnan(n) _isnan(n) # ifndef HAVE_ISINF # define HAVE_ISINF # endif # define soap_isinf(n) (!_finite(n)) #endif #ifdef SUN_OS # define HAVE_ISNAN #endif #ifdef __APPLE__ # ifdef __cplusplus # ifndef isnan extern "C" int isnan(double); extern "C" int isinf(double); # endif # endif # ifndef HAVE_ISNAN # define HAVE_ISNAN # endif # ifndef HAVE_ISINF # define HAVE_ISINF # endif #endif #if !defined(HAVE_ISNAN) && (defined(_MATH_H) || defined(_MATH_INCLUDED)) # define HAVE_ISNAN #endif union soap_double_nan {struct {unsigned int n1, n2;} iv; double dv; float fv;}; extern const union soap_double_nan soap_double_nan; extern const char soap_base64o[], soap_base64i[]; #ifdef VXWORKS # ifndef FLT_MAX # define FLT_MAX _ARCH_FLT_MAX # endif # ifndef DBL_MAX # define DBL_MAX _ARCH_DBL_MAX # endif #endif #ifndef FLT_NAN # define FLT_NAN (soap_double_nan.fv) #endif #ifndef FLT_PINFTY # if defined(FLT_MAX) # define FLT_PINFTY FLT_MAX # elif defined(HUGE_VALF) # define FLT_PINFTY (float)HUGE_VALF # elif defined(HUGE_VAL) # define FLT_PINFTY (float)HUGE_VAL # elif defined(FLOAT_MAX) # define FLT_PINFTY FLOAT_MAX # else # define FLT_PINFTY (3.40282347e+38F) # endif #endif #ifndef FLT_NINFTY # define FLT_NINFTY (-FLT_PINFTY) #endif #ifndef DBL_NAN # define DBL_NAN (soap_double_nan.dv) #endif #ifndef DBL_PINFTY # if defined(DBL_MAX) # define DBL_PINFTY DBL_MAX # elif defined(HUGE_VALF) # define DBL_PINFTY (double)HUGE_VALF # elif defined(HUGE_VAL) # define DBL_PINFTY (double)HUGE_VAL # elif defined(DOUBLE_MAX) # define DBL_PINFTY DOUBLE_MAX # else # define DBL_PINFTY (1.7976931348623157e+308) # endif #endif #ifndef DBL_NINFTY # define DBL_NINFTY (-DBL_PINFTY) #endif #ifndef soap_isnan # ifdef HAVE_ISNAN # define soap_isnan(n) isnan(n) # else # define soap_isnan(n) ((n) != (n)) # endif #endif #ifndef soap_isinf # ifdef HAVE_ISINF # define soap_isinf(n) isinf(n) # else # define soap_isinf(n) (!soap_isnan(n) && soap_isnan((n) - (n))) # endif #endif #define soap_ispinfd(n) ((n) > 0 && soap_isinf(n)) #define soap_ispinff(n) ((n) > 0 && soap_isinf(n)) #define soap_isninfd(n) ((n) < 0 && soap_isinf(n)) #define soap_isninff(n) ((n) < 0 && soap_isinf(n)) /* gSOAP error codes */ #define SOAP_EOF EOF #define SOAP_ERR EOF #define SOAP_OK 0 #define SOAP_CLI_FAULT 1 #define SOAP_SVR_FAULT 2 #define SOAP_TAG_MISMATCH 3 #define SOAP_TYPE 4 #define SOAP_SYNTAX_ERROR 5 #define SOAP_NO_TAG 6 #define SOAP_IOB 7 #define SOAP_MUSTUNDERSTAND 8 #define SOAP_NAMESPACE 9 #define SOAP_USER_ERROR 10 #define SOAP_FATAL_ERROR 11 #define SOAP_FAULT 12 #define SOAP_NO_METHOD 13 #define SOAP_NO_DATA 14 #define SOAP_GET_METHOD 15 #define SOAP_PUT_METHOD 16 #define SOAP_DEL_METHOD 17 /* deprecated */ #define SOAP_HEAD_METHOD 18 /* deprecated */ #define SOAP_HTTP_METHOD 19 #define SOAP_EOM 20 #define SOAP_MOE 21 #define SOAP_HDR 22 #define SOAP_NULL 23 #define SOAP_DUPLICATE_ID 24 #define SOAP_MISSING_ID 25 #define SOAP_HREF 26 #define SOAP_UDP_ERROR 27 #define SOAP_TCP_ERROR 28 #define SOAP_HTTP_ERROR 29 #define SOAP_SSL_ERROR 30 #define SOAP_ZLIB_ERROR 31 #define SOAP_DIME_ERROR 32 #define SOAP_DIME_HREF 33 #define SOAP_DIME_MISMATCH 34 #define SOAP_DIME_END 35 #define SOAP_MIME_ERROR 36 #define SOAP_MIME_HREF 37 #define SOAP_MIME_END 38 #define SOAP_VERSIONMISMATCH 39 #define SOAP_PLUGIN_ERROR 40 #define SOAP_DATAENCODINGUNKNOWN 41 #define SOAP_REQUIRED 42 #define SOAP_PROHIBITED 43 #define SOAP_OCCURS 44 #define SOAP_LENGTH 45 #define SOAP_FD_EXCEEDED 46 #define SOAP_UTF_ERROR 47 #define SOAP_NTLM_ERROR 48 #define soap_xml_error_check(e) ((e) == SOAP_TAG_MISMATCH || (e) == SOAP_NO_TAG || (e) == SOAP_SYNTAX_ERROR || (e) == SOAP_NAMESPACE || (e) == SOAP_DUPLICATE_ID || (e) == SOAP_MISSING_ID || (e) == SOAP_REQUIRED || (e) == SOAP_PROHIBITED || (e) == SOAP_OCCURS || (e) == SOAP_LENGTH || (e) == SOAP_NULL || (e) == SOAP_HREF) #define soap_soap_error_check(e) ((e) == SOAP_CLI_FAULT || (e) == SOAP_SVR_FAULT || (e) == SOAP_VERSIONMISMATCH || (e) == SOAP_MUSTUNDERSTAND || (e) == SOAP_FAULT || (e) == SOAP_NO_METHOD) #define soap_tcp_error_check(e) ((e) == SOAP_EOF || (e) == SOAP_TCP_ERROR) #define soap_ssl_error_check(e) ((e) == SOAP_SSL_ERROR) #define soap_zlib_error_check(e) ((e) == SOAP_ZLIB_ERROR) #define soap_http_error_check(e) ((e) == SOAP_HTTP_ERROR || (e) == SOAP_NO_DATA || ((e) >= SOAP_GET_METHOD && (e) <= SOAP_HTTP_METHOD) || ((e) >= 100 && (e) < 600)) /* gSOAP HTTP response status codes 100 to 599 are reserved */ /* Codes 600 to 999 are user definable */ /* Exceptional gSOAP HTTP server response status codes >= 1000 */ #define SOAP_STOP 1000 /* No HTTP response */ #define SOAP_FORM 1001 /* Request (form) data is present, no HTTP response */ #define SOAP_HTML 1002 /* Custom HTML response */ #define SOAP_FILE 1003 /* Custom file-based response */ /* gSOAP HTTP method codes (client) */ #define SOAP_POST 2000 /* POST request */ #define SOAP_POST_FILE 2001 /* Custom file-based POST request */ #define SOAP_GET 2002 /* GET request */ #define SOAP_PUT 2003 /* PUT request */ #define SOAP_DEL 2004 /* DELETE request */ #define SOAP_CONNECT 2005 /* CONNECT request */ /* gSOAP DIME */ #define SOAP_DIME_CF 0x01 #define SOAP_DIME_ME 0x02 #define SOAP_DIME_MB 0x04 #define SOAP_DIME_VERSION 0x08 /* DIME version 1 */ #define SOAP_DIME_MEDIA 0x10 #define SOAP_DIME_ABSURI 0x20 /* gSOAP ZLIB */ #define SOAP_ZLIB_NONE 0x00 #define SOAP_ZLIB_DEFLATE 0x01 #define SOAP_ZLIB_INFLATE 0x02 #define SOAP_ZLIB_GZIP 0x02 /* gSOAP transport, connection, and content encoding modes */ typedef soap_int32 soap_mode; #define SOAP_IO 0x00000003 /* IO mask */ #define SOAP_IO_FLUSH 0x00000000 /* flush output immediately, no buffering */ #define SOAP_IO_BUFFER 0x00000001 /* buffer output in packets of size SOAP_BUFLEN */ #define SOAP_IO_STORE 0x00000002 /* store entire output to determine length for transport */ #define SOAP_IO_CHUNK 0x00000003 /* use HTTP chunked transfer AND buffer packets */ #define SOAP_IO_UDP 0x00000004 /* TCP or UDP */ #define SOAP_IO_LENGTH 0x00000008 /* calc message length (internal) */ #define SOAP_IO_KEEPALIVE 0x00000010 /* keep connection alive */ #define SOAP_ENC 0x00000FFF /* IO and ENC mask */ #define SOAP_ENC_LATIN 0x00000020 /* in: accept iso-8859-1 */ #define SOAP_ENC_XML 0x00000040 /* out: plain XML encoding, no HTTP header */ #define SOAP_ENC_DIME 0x00000080 #define SOAP_ENC_MIME 0x00000100 #define SOAP_ENC_MTOM 0x00000200 #define SOAP_ENC_ZLIB 0x00000400 #define SOAP_ENC_SSL 0x00000800 #define SOAP_XML_STRICT 0x00001000 /* in: strict validation */ #define SOAP_XML_INDENT 0x00002000 /* out: emit indented XML */ #define SOAP_XML_IGNORENS 0x00004000 /* in: ignore namespaces */ #define SOAP_XML_DEFAULTNS 0x00008000 /* out: emit xmlns="..." */ #define SOAP_XML_CANONICAL 0x00010000 /* out: excC14N canonical XML */ #define SOAP_XML_TREE 0x00020000 /* out: XML tree (no id/ref) */ #define SOAP_XML_NIL 0x00040000 /* out: NULLs as xsi:nil */ #define SOAP_XML_NOTYPE 0x00080000 /* out: NULLs as xsi:nil */ #define SOAP_DOM_TREE 0x00100000 /* see DOM manual */ #define SOAP_DOM_NODE 0x00200000 #define SOAP_DOM_ASIS 0x00400000 #define SOAP_C_NOIOB 0x01000000 /* don't fault on array index out of bounds (just ignore) */ #define SOAP_C_UTFSTRING 0x02000000 /* (de)serialize strings with UTF8 content */ #define SOAP_C_MBSTRING 0x04000000 /* (de)serialize strings with multi-byte content */ #define SOAP_C_NILSTRING 0x08000000 /* serialize empty strings as nil (omitted) */ #define SOAP_XML_DOM 0x10000000 /* enable internal DOM */ #define SOAP_XML_GRAPH 0x20000000 /* id-ref graph in DOM */ #define SOAP_MIME_POSTCHECK 0x40000000 /* MIME flag (internal) */ #define SOAP_SEC_WSUID 0x80000000 /* Add Body wsu:Id */ /* WITH_XMLNS backward compatibility: always use XML default namespaces */ #ifdef WITH_XMLNS # define SOAP_IO_DEFAULT (SOAP_IO_FLUSH | SOAP_XML_DEFAULTNS) #else # define SOAP_IO_DEFAULT SOAP_IO_FLUSH #endif /* SSL client/server authentication settings */ #define SOAP_SSL_NO_AUTHENTICATION 0x00 /* for testing purposes */ #define SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION 0x01 /* client requires server to authenticate */ #define SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION 0x02 /* server requires client to authenticate */ #define SOAP_SSL_SKIP_HOST_CHECK 0x04 /* client does not check the common name of the host in certificate */ #define SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE 0x08 /* client does not check the expiration date of the host certificate */ #define SOAP_SSL_NO_DEFAULT_CA_PATH 0x10 /* don't use default_verify_paths */ #define SOAP_SSL_RSA 0x20 /* use RSA */ #define SOAP_SSLv3 0x40 /* SSL v3 only */ #define SOAP_TLSv1 0x80 /* TLS v1 only */ #define SOAP_SSLv3_TLSv1 0x00 /* SSL v3 and TLS v1 support by default (no SSL v1/v2) */ #define SOAP_SSL_CLIENT 0x100 /* client context */ #define SOAP_SSL_DEFAULT (SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION | SOAP_SSLv3_TLSv1) /* state */ #define SOAP_NONE 0 #define SOAP_INIT 1 #define SOAP_COPY 2 #define soap_check_state(soap) (!(soap) || ((soap)->state != SOAP_INIT && (soap)->state != SOAP_COPY)) /* parts */ #define SOAP_BEGIN 0 #define SOAP_IN_ENVELOPE 2 #define SOAP_IN_HEADER 3 #define SOAP_END_HEADER 4 #define SOAP_NO_BODY 5 #define SOAP_IN_BODY 6 #define SOAP_END_BODY 7 #define SOAP_END_ENVELOPE 8 #define SOAP_END 9 /* events */ #define SOAP_SEC_BEGIN 1 #define SOAP_SEC_SIGN 2 /* DEBUG macros */ #ifndef WITH_LEAN # ifdef DEBUG # ifndef SOAP_DEBUG # define SOAP_DEBUG # endif # ifndef SOAP_MEM_DEBUG # define SOAP_MEM_DEBUG # endif # endif #endif #ifdef SOAP_MEM_DEBUG # ifndef SOAP_MALLOC # define SOAP_MALLOC(soap, size) soap_track_malloc(soap, __FILE__, __LINE__, size) # endif # ifndef SOAP_FREE # define SOAP_FREE(soap, ptr) soap_track_free(soap, __FILE__, __LINE__, ptr) # endif #endif #ifndef SOAP_MALLOC /* use libc malloc */ # define SOAP_MALLOC(soap, size) malloc(size) #endif #ifndef SOAP_FREE /* use libc free */ # define SOAP_FREE(soap, ptr) free(ptr) #endif #ifndef SOAP_NEW /* use C++ new operator */ # if (defined(__GNUC__) && (__GNUC__ <= 2) && !defined(__BORLANDC__)) || defined(__clang__) || defined(_AIX) # define SOAP_NEW(type) new type /* old form w/o parenthesis */ # else # define SOAP_NEW(type) new (type) /* prefer with parenthesis */ # endif #endif #ifndef SOAP_PLACEMENT_NEW # define SOAP_PLACEMENT_NEW(buf, type) new (buf) type #endif #ifndef SOAP_NEW_COPY /* use C++ new operator for ::copy() */ # define SOAP_NEW_COPY(clas) new clas /* prefer w/o parenthesis */ #endif #ifndef SOAP_DELETE /* use C++ delete operator */ # define SOAP_DELETE(obj) delete obj #endif #ifndef SOAP_DELETE_ARRAY /* use C++ delete[] operator */ # define SOAP_DELETE_ARRAY(obj) delete[] obj #endif #ifdef SOAP_DEBUG # ifndef SOAP_MESSAGE # define SOAP_MESSAGE fprintf # endif # ifndef DBGLOG # define DBGLOG(DBGFILE, CMD) \ { if (soap)\ { if (!soap->fdebug[SOAP_INDEX_##DBGFILE])\ soap_open_logfile((struct soap*)soap, SOAP_INDEX_##DBGFILE);\ if (soap->fdebug[SOAP_INDEX_##DBGFILE])\ { FILE *fdebug = soap->fdebug[SOAP_INDEX_##DBGFILE];\ CMD;\ fflush(fdebug);\ }\ }\ } # endif # ifndef DBGMSG # define DBGMSG(DBGFILE, MSG, LEN) \ { if (soap)\ { if (!soap->fdebug[SOAP_INDEX_##DBGFILE])\ soap_open_logfile((struct soap*)soap, SOAP_INDEX_##DBGFILE);\ if (soap->fdebug[SOAP_INDEX_##DBGFILE])\ { fwrite((MSG), 1, (LEN), soap->fdebug[SOAP_INDEX_##DBGFILE]);\ fflush(soap->fdebug[SOAP_INDEX_##DBGFILE]);\ }\ }\ } # endif # ifndef DBGFUN # define DBGFUN(FNAME) DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%s(%d): %s()\n", __FILE__, __LINE__, FNAME)) # define DBGFUN1(FNAME, FMT, ARG) DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%s(%d): %s("FMT")\n", __FILE__, __LINE__, FNAME, (ARG))) # define DBGFUN2(FNAME, FMT1, ARG1, FMT2, ARG2) DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%s(%d): %s("FMT1", "FMT2")\n", __FILE__, __LINE__, FNAME, (ARG1), (ARG2))) # define DBGFUN3(FNAME, FMT1, ARG1, FMT2, ARG2, FMT3, ARG3) DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%s(%d): %s("FMT1", "FMT2", "FMT3")\n", __FILE__, __LINE__, FNAME, (ARG1), (ARG2), (ARG3))) # endif # ifndef DBGHEX # define DBGHEX(DBGFILE, MSG, LEN) \ { if (soap)\ { if (!soap->fdebug[SOAP_INDEX_##DBGFILE])\ soap_open_logfile(soap, SOAP_INDEX_##DBGFILE);\ if (soap->fdebug[SOAP_INDEX_##DBGFILE])\ { int i; char *s;\ for (s = (char*)(MSG), i = (LEN); i; i--)\ fprintf(soap->fdebug[SOAP_INDEX_##DBGFILE], "%2.2X ", (int)*s++&0xFF);\ fflush(soap->fdebug[SOAP_INDEX_##DBGFILE]);\ }\ }\ } # endif #else # define DBGLOG(DBGFILE, CMD) # define DBGMSG(DBGFILE, MSG, LEN) # define DBGFUN(FNAME) # define DBGFUN1(FNAME, FMT, ARG) # define DBGFUN2(FNAME, FMT1, ARG1, FMT2, ARG2) # define DBGFUN3(FNAME, FMT1, ARG1, FMT2, ARG2, FMT3, ARG3) # define DBGHEX(DBGFILE, MSG, LEN) #endif /* UCS-4 requires 32 bits (0-7FFFFFFF, the sign bit is used by gSOAP to distinguish XML entities) */ typedef soap_int32 soap_wchar; /* namespace table row */ struct Namespace { const char *id; const char *ns; const char *in; char *out; }; /* namespace stack */ struct soap_nlist { struct soap_nlist *next; unsigned int level; /* nesting depth level */ short index; /* corresponding entry in ns mapping table */ const char *ns; /* only set when parsed ns URI is not in the ns mapping table */ char id[1]; /* the actual string value flows into the allocated region below this struct */ }; /* block stack for nested block allocations */ struct soap_blist { struct soap_blist *next; char *ptr; size_t size; }; /* array layout */ struct soap_array { void *__ptr; int __size; }; /* pointer serialization management */ struct soap_plist { struct soap_plist *next; const void *ptr; const struct soap_array *array; int type; int id; char mark1; char mark2; }; /* block allocation for pointer serialization management */ struct soap_pblk { struct soap_pblk *next; struct soap_plist plist[SOAP_PTRBLK]; }; #ifdef SOAP_MEM_DEBUG /* malloc/free tracking for debugging */ struct soap_mlist { struct soap_mlist *next; const void *ptr; const char *file; int line; short live; }; #endif /* class allocation list */ struct soap_clist { struct soap_clist *next; void *ptr; int type; int size; int (*fdelete)(struct soap_clist*); }; /* attributes */ struct soap_attribute { struct soap_attribute *next; short flag; /* soap_set_attr: 1 = normal, 2 = utf content */ char *value; size_t size; const char *ns; short visible; char name[1]; /* the actual name string flows into the allocated region below this struct */ }; #ifndef WITH_LEAN struct soap_cookie { struct soap_cookie *next; char *name; char *value; char *domain; char *path; time_t expire; /* client-side: local time to expire */ long maxage; /* server-side: seconds to expire */ unsigned int version; short secure; short session; /* server-side */ short env; /* server-side: got cookie from client and should not be (re)send */ short modified; /* server-side: client cookie was modified and should be send */ }; #endif SOAP_FMAC1 struct soap_multipart* SOAP_FMAC2 soap_next_multipart(struct soap_multipart*); #ifdef __cplusplus class soap_multipart_iterator { public: struct soap_multipart *content; bool operator==(const soap_multipart_iterator& iter) const { return (bool)(content == iter.content); } bool operator!=(const soap_multipart_iterator& iter) const { return (bool)(content != iter.content); } struct soap_multipart &operator*() const { return *content; } soap_multipart_iterator &operator++() { content = soap_next_multipart(content); return *this; } soap_multipart_iterator() : content(NULL) { } soap_multipart_iterator(struct soap_multipart *p) : content(p) { } }; #endif #ifndef WITH_LEANER struct soap_dime { size_t count; size_t size; size_t chunksize; size_t buflen; char flags; char *ptr; const char *id; const char *type; const char *options; struct soap_multipart *list; /* list of DIME attachments received */ struct soap_multipart *first, *last; /* temporary in/out queue */ #ifdef __cplusplus soap_multipart_iterator begin() { soap_multipart_iterator iter(list); return iter; }; soap_multipart_iterator end() { soap_multipart_iterator iter(NULL); return iter; }; #endif }; #endif #ifndef WITH_LEANER struct soap_mime { char *boundary; /* MIME boundary */ const char *start; /* MIME start ID */ struct soap_multipart *list; /* list of MIME attachments received */ struct soap_multipart *first, *last; /* temporary in/out queue */ #ifdef __cplusplus soap_multipart_iterator begin() { soap_multipart_iterator iter(list); return iter; }; soap_multipart_iterator end() { soap_multipart_iterator iter(NULL); return iter; }; #endif }; #endif #ifndef WITH_LEANER /* RFC2045 MIME content transfer encodings */ enum soap_mime_encoding { SOAP_MIME_NONE, SOAP_MIME_7BIT, SOAP_MIME_8BIT, SOAP_MIME_BINARY, SOAP_MIME_QUOTED_PRINTABLE, SOAP_MIME_BASE64, SOAP_MIME_IETF_TOKEN, SOAP_MIME_X_TOKEN }; #endif #ifndef WITH_LEANER /* DIME/MIME multipart list */ struct soap_multipart { struct soap_multipart *next; char *ptr; /* points to raw data content */ size_t size; /* size of data content */ const char *id; /* DIME/MIME content ID or form data name */ const char *type; /* DIME/MIME type (MIME type format) */ const char *options; /* DIME options */ enum soap_mime_encoding encoding; /* MIME Content-Transfer-Encoding */ const char *location; /* MIME Content-Location (optional) */ const char *description; /* MIME Content-Description (optional) */ #ifdef __cplusplus typedef soap_multipart_iterator iterator; #endif }; #endif #ifndef WITH_LEANER /* attachment DIME and MTOM XOP forwarding */ struct soap_xlist { struct soap_xlist *next; unsigned char **ptr; int *size; char *id; char **type; char **options; }; #endif /******************************************************************************/ #ifndef WITH_LEANER #ifdef __cplusplus class soap_dom_attribute_iterator { public: struct soap_dom_attribute *att; const char *nstr; const char *name; bool operator==(const soap_dom_attribute_iterator&) const; bool operator!=(const soap_dom_attribute_iterator&) const; struct soap_dom_attribute &operator*() const; soap_dom_attribute_iterator &operator++(); soap_dom_attribute_iterator(); soap_dom_attribute_iterator(struct soap_dom_attribute*); ~soap_dom_attribute_iterator(); }; #endif #endif #ifndef WITH_LEANER struct soap_dom_attribute { struct soap_dom_attribute *next; const char *nstr; char *name; char *data; wchar_t *wide; struct soap *soap; #ifdef __cplusplus typedef soap_dom_attribute_iterator iterator; struct soap_dom_attribute &set(const char *nstr, const char *name); /* set namespace and name */ struct soap_dom_attribute &set(const char *data); /* set data */ soap_dom_attribute_iterator begin(); soap_dom_attribute_iterator end(); soap_dom_attribute_iterator find(const char *nstr, const char *name); void unlink(); soap_dom_attribute(); soap_dom_attribute(struct soap *soap); soap_dom_attribute(struct soap *soap, const char *nstr, const char *name, const char *data); ~soap_dom_attribute(); #endif }; #endif #ifndef WITH_LEANER #ifdef __cplusplus class soap_dom_element_iterator { public: struct soap_dom_element *elt; const char *nstr; const char *name; int type; bool operator==(const soap_dom_element_iterator&) const; bool operator!=(const soap_dom_element_iterator&) const; struct soap_dom_element &operator*() const; soap_dom_element_iterator &operator++(); soap_dom_element_iterator(); soap_dom_element_iterator(struct soap_dom_element*); ~soap_dom_element_iterator(); }; #endif #endif #ifndef WITH_LEANER struct soap_dom_element { struct soap_dom_element *next; /* next sibling */ struct soap_dom_element *prnt; /* parent */ struct soap_dom_element *elts; /* list of child elements */ struct soap_dom_attribute *atts; /* list of attributes */ const char *nstr; /* namespace string */ char *name; /* element tag name */ char *data; /* element content data (with SOAP_C_UTFSTRING flag set) */ wchar_t *wide; /* element content data */ int type; /* optional: serialized C/C++ data type */ void *node; /* optional: pointer to serialized C/C++ data */ char *head; /* leading content before start tag */ char *tail; /* leading content before end tag */ struct soap *soap; /* soap context that manages this node */ #ifdef __cplusplus typedef soap_dom_element_iterator iterator; struct soap_dom_element &set(const char *nstr, const char *name); struct soap_dom_element &set(const char *data); struct soap_dom_element &set(void *node, int type); struct soap_dom_element &add(struct soap_dom_element*); struct soap_dom_element &add(struct soap_dom_element&); struct soap_dom_element &add(struct soap_dom_attribute*); struct soap_dom_element &add(struct soap_dom_attribute&); soap_dom_element_iterator begin(); soap_dom_element_iterator end(); soap_dom_element_iterator find(const char *nstr, const char *name); soap_dom_element_iterator find(int type); void unlink(); soap_dom_element(); soap_dom_element(struct soap *soap); soap_dom_element(struct soap *soap, const char *nstr, const char *name); soap_dom_element(struct soap *soap, const char *nstr, const char *name, const char *data); soap_dom_element(struct soap *soap, const char *nstr, const char *name, void *node, int type); ~soap_dom_element(); #endif }; SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_dom_next_element(struct soap_dom_element *elt); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_dom_next_attribute(struct soap_dom_attribute *att); #endif #if defined(__cplusplus) && !defined(WITH_LEAN) && !defined(WITH_COMPAT) } extern std::ostream &operator<<(std::ostream&, const struct soap_dom_element&); extern std::istream &operator>>(std::istream&, struct soap_dom_element&); extern "C" { #endif /******************************************************************************/ #ifdef WIN32 # ifdef SOAP_STD_EXPORTS # define SOAP_STD_API __declspec(dllexport) # else # define SOAP_STD_API # endif #else # define SOAP_STD_API #endif struct SOAP_STD_API soap { short state; /* 0 = uninitialized, 1 = initialized, 2 = copy of another soap struct */ short version; /* 1 = SOAP1.1 and 2 = SOAP1.2 (set automatically from namespace URI in nsmap table) */ soap_mode mode; soap_mode imode; soap_mode omode; const char *float_format; /* user-definable format string for floats (<1024 chars) */ const char *double_format; /* user-definable format string for doubles (<1024 chars) */ const char *dime_id_format; /* user-definable format string for integer DIME id ( 0, gives socket recv timeout in seconds, < 0 in usec */ int send_timeout; /* when > 0, gives socket send timeout in seconds, < 0 in usec */ int connect_timeout; /* when > 0, gives socket connect() timeout in seconds, < 0 in usec */ int accept_timeout; /* when > 0, gives socket accept() timeout in seconds, < 0 in usec */ int socket_flags; /* socket recv() and send() flags, e.g. set to MSG_NOSIGNAL to disable sigpipe */ int connect_flags; /* connect() SOL_SOCKET sockopt flags, e.g. set to SO_DEBUG to debug socket */ int bind_flags; /* bind() SOL_SOCKET sockopt flags, e.g. set to SO_REUSEADDR to enable reuse */ int accept_flags; /* accept() SOL_SOCKET sockopt flags */ unsigned short linger_time; /* linger time for SO_LINGER option */ const struct Namespace *namespaces; /* Pointer to global namespace mapping table */ struct Namespace *local_namespaces; /* Local namespace mapping table */ struct soap_nlist *nlist; /* namespace stack */ struct soap_blist *blist; /* block allocation stack */ struct soap_clist *clist; /* class instance allocation list */ void *alist; /* memory allocation (malloc) list */ struct soap_ilist *iht[SOAP_IDHASH]; struct soap_plist *pht[SOAP_PTRHASH]; struct soap_pblk *pblk; /* plist block allocation */ short pidx; /* plist block allocation */ struct SOAP_ENV__Header *header; struct SOAP_ENV__Fault *fault; int idnum; void *user; /* for user to pass user-defined data */ void *data[4]; /* extension data = {smdevp, mecevp, ...} */ struct soap_plugin *plugins; /* linked list of plug-in data */ const char *userid; /* HTTP Basic authorization userid */ const char *passwd; /* HTTP Basic authorization passwd */ const char *authrealm; /* HTTP authentication realm (NTLM domain) */ #if !defined(WITH_LEAN) || defined(WITH_NTLM) const char *ntlm_challenge; /* HTTP NTLM challenge key string */ short ntlm_auth; /* HTTP NTLM authentication type */ short ntlm_stage; /* HTTP NTLM stage 0..3 */ #endif int (*fpost)(struct soap*, const char*, const char*, int, const char*, const char*, size_t); int (*fget)(struct soap*); /* HTTP GET hook (not set by default) */ int (*fput)(struct soap*); /* HTTP PUT hook (handled as POST by default) */ int (*fdel)(struct soap*); /* HTTP DELETE hook (not set by default) */ int (*fopt)(struct soap*); /* HTTP OPTIONS hook (not set by default) */ int (*fhead)(struct soap*); /* HTTP HEAD hook (not set by default) */ int (*fform)(struct soap*); /* HTTP/HTML form handler for plugins */ int (*fposthdr)(struct soap*, const char*, const char*); int (*fresponse)(struct soap*, int, size_t); int (*fparse)(struct soap*); int (*fparsehdr)(struct soap*, const char*, const char*); int (*fheader)(struct soap*); int (*fresolve)(struct soap*, const char*, struct in_addr* inaddr); int (*fconnect)(struct soap*, const char*, const char*, int); int (*fdisconnect)(struct soap*); int (*fclosesocket)(struct soap*, SOAP_SOCKET); int (*fshutdownsocket)(struct soap*, SOAP_SOCKET, int); SOAP_SOCKET (*fopen)(struct soap*, const char*, const char*, int); SOAP_SOCKET (*faccept)(struct soap*, SOAP_SOCKET, struct sockaddr*, int *n); int (*fclose)(struct soap*); int (*fsend)(struct soap*, const char*, size_t); size_t (*frecv)(struct soap*, char*, size_t); int (*fpoll)(struct soap*); void (*fseterror)(struct soap*, const char **c, const char **s); int (*fignore)(struct soap*, const char*); int (*fserveloop)(struct soap*); void *(*fplugin)(struct soap*, const char*); void *(*fmalloc)(struct soap*, size_t); #ifndef WITH_LEANER int (*feltbegin)(struct soap*, const char*); int (*feltendin)(struct soap*, const char*, const char*); int (*feltbegout)(struct soap*, const char*); int (*feltendout)(struct soap*, const char*); int (*fprepareinitsend)(struct soap*); int (*fprepareinitrecv)(struct soap*); int (*fpreparesend)(struct soap*, const char*, size_t); int (*fpreparerecv)(struct soap*, const char*, size_t); int (*fpreparefinalsend)(struct soap*); int (*fpreparefinalrecv)(struct soap*); int filterstop; int (*ffiltersend)(struct soap*, const char**, size_t*); int (*ffilterrecv)(struct soap*, char*, size_t*, size_t); void *(*fdimereadopen)(struct soap*, void*, const char*, const char*, const char*); void *(*fdimewriteopen)(struct soap*, const char*, const char*, const char*); void (*fdimereadclose)(struct soap*, void*); void (*fdimewriteclose)(struct soap*, void*); size_t (*fdimeread)(struct soap*, void*, char*, size_t); int (*fdimewrite)(struct soap*, void*, const char*, size_t); void *(*fmimereadopen)(struct soap*, void*, const char*, const char*, const char*); void *(*fmimewriteopen)(struct soap*, void*, const char*, const char*, const char*, enum soap_mime_encoding); void (*fmimereadclose)(struct soap*, void*); void (*fmimewriteclose)(struct soap*, void*); size_t (*fmimeread)(struct soap*, void*, char*, size_t); int (*fmimewrite)(struct soap*, void*, const char*, size_t); #endif SOAP_SOCKET master; SOAP_SOCKET socket; #if defined(__cplusplus) && !defined(WITH_LEAN) && !defined(WITH_COMPAT) std::ostream *os; std::istream *is; #else void *os; /* preserve struct size */ void *is; /* preserve struct size */ #endif #ifndef UNDER_CE int sendfd; /* WinCE FD to send */ int recvfd; /* WinCE FD to receive */ #else FILE *sendfd; FILE *recvfd; #endif size_t bufidx; /* index in soap.buf[] */ size_t buflen; /* length of soap.buf[] content */ soap_wchar ahead; /* parser lookahead */ short cdata; /* CDATA parser state */ short body; /* parsed XML element has a body or not */ unsigned int level; /* XML nesting level */ size_t count; /* message length counter */ size_t length; /* message length as set by HTTP header */ char *labbuf; /* look-aside buffer */ size_t lablen; /* look-aside buffer allocated length */ size_t labidx; /* look-aside buffer index to available part */ char buf[SOAP_BUFLEN];/* send and receive buffer */ char msgbuf[1024]; /* in/out buffer for HTTP/MIME headers >=1024 bytes */ char tmpbuf[1024]; /* in/out buffer for HTTP/MIME headers, simpleType values, element and attribute tag names, and DIME must be >=1024 bytes */ char tag[SOAP_TAGLEN]; char id[SOAP_TAGLEN]; char href[SOAP_TAGLEN]; char type[SOAP_TAGLEN]; char arrayType[SOAP_TAGLEN]; char arraySize[SOAP_TAGLEN]; char arrayOffset[SOAP_TAGLEN]; short other; short root; int position; int positions[SOAP_MAXDIMS]; struct soap_attribute *attributes; /* attribute list */ short encoding; /* when set, output encodingStyle */ short mustUnderstand; /* a mustUnderstand element was parsed or is output */ short null; /* parsed XML is xsi:nil */ short ns; /* when not set, output full xmlns bindings */ short part; /* SOAP part state (header or body) */ short event; /* engine events and states for use by plugins */ unsigned int evlev; /* event level */ short alloced; short peeked; size_t chunksize; size_t chunkbuflen; char endpoint[SOAP_TAGLEN]; char path[SOAP_TAGLEN]; char host[SOAP_TAGLEN]; char *action; char *prolog; /* XML declaration prolog */ unsigned long ip; /* IP number */ int port; /* port number */ short keep_alive; /* connection should be kept open */ short tcp_keep_alive; /* enable SO_KEEPALIVE */ unsigned int tcp_keep_idle; /* set TCP_KEEPIDLE */ unsigned int tcp_keep_intvl; /* set TCP_KEEPINTVL */ unsigned int tcp_keep_cnt; /* set TCP_KEEPCNT */ unsigned int max_keep_alive; /* maximum keep-alive session (default=100) */ const char *proxy_http_version;/* HTTP version of proxy "1.0" or "1.1" */ const char *proxy_host; /* Proxy Server host name */ int proxy_port; /* Proxy Server port (default = 8080) */ const char *proxy_userid; /* Proxy Authorization user name */ const char *proxy_passwd; /* Proxy Authorization password */ const char *proxy_from; /* X-Forwarding-For header returned by proxy */ int status; /* -1 when request, else error code to be returned by server */ int error; int errmode; int errnum; #ifndef WITH_LEANER struct soap_dom_element *dom; struct soap_dime dime; struct soap_mime mime; struct soap_xlist *xlist; #endif #if !defined(WITH_LEAN) || defined(SOAP_DEBUG) const char *logfile[SOAP_MAXLOGS]; FILE *fdebug[SOAP_MAXLOGS]; struct soap_mlist *mht[SOAP_PTRHASH]; #endif #ifndef WITH_LEAN const char *wsuid; /* space-separated string of element tags */ const char *c14nexclude; /* space-separated string of prefixes */ struct soap_cookie *cookies; const char *cookie_domain; const char *cookie_path; int cookie_max; #endif #ifndef WITH_NOIO int ipv6_multicast_if; /* in6addr->sin6_scope_id IPv6 value */ char* ipv4_multicast_if; /* IP_MULTICAST_IF IPv4 setsockopt interface_addr */ unsigned char ipv4_multicast_ttl; /* IP_MULTICAST_TTL value 0..255 */ #ifdef WITH_IPV6 struct sockaddr_storage peer; /* IPv6: set by soap_accept and by UDP recv */ #else struct sockaddr_in peer; /* IPv4: set by soap_connect/soap_accept and by UDP recv */ #endif #endif size_t peerlen; #if defined(WITH_OPENSSL) /* OpenSSL */ int (*fsslauth)(struct soap*); int (*fsslverify)(int, X509_STORE_CTX*); BIO *bio; SSL *ssl; SSL_CTX *ctx; SSL_SESSION *session; const char *dhfile; const char *randfile; #elif defined(WITH_GNUTLS) /* GNUTLS */ int (*fsslauth)(struct soap*); void *fsslverify; gnutls_certificate_credentials_t xcred; /* cert pointer */ gnutls_anon_client_credentials_t acred; /* anon pointer */ gnutls_priority_t cache; /* priority cache pointer */ gnutls_session_t session; /* session pointer */ gnutls_dh_params_t dh_params; gnutls_rsa_params_t rsa_params; #else /* No SSL/TLS */ void *fsslauth; /* dummy members, to preserve struct size */ void *fsslverify; void *bio; void *ssl; void *ctx; void *session; void *dh_params; void *rsa_params; #endif unsigned short ssl_flags; const char *keyfile; const char *password; const char *cafile; const char *capath; const char *crlfile; char session_host[SOAP_TAGLEN]; int session_port; #ifdef WITH_C_LOCALE # ifdef WIN32 _locale_t c_locale; /* set to C locale by default */ # else locale_t c_locale; /* set to C locale by default */ # endif #else void *c_locale; #endif #ifdef WITH_ZLIB z_stream *d_stream; /* decompression stream */ uLong z_crc; /* internal gzip crc */ #else void *d_stream; /* dummy members, to preserve struct size */ soap_int32 z_crc; #endif const char *z_dict; /* support for zlib static dictionaries */ unsigned int z_dict_len; short zlib_state; /* SOAP_ZLIB_NONE, SOAP_ZLIB_DEFLATE, or SOAP_ZLIB_INFLATE */ short zlib_in; /* SOAP_ZLIB_NONE, SOAP_ZLIB_DEFLATE, or SOAP_ZLIB_GZIP */ short zlib_out; /* SOAP_ZLIB_NONE, SOAP_ZLIB_DEFLATE, or SOAP_ZLIB_GZIP */ char *z_buf; /* buffer */ size_t z_buflen; unsigned short z_level; /* compression level to be used (0=none, 1=fast to 9=best) */ float z_ratio_in; /* detected compression ratio compressed_length/length of inbound message */ float z_ratio_out; /* detected compression ratio compressed_length/length of outbound message */ #ifdef WMW_RPM_IO /* VxWorks */ void *rpmreqid; #endif #ifdef __cplusplus soap(); soap(soap_mode); soap(soap_mode, soap_mode); soap(const struct soap&); virtual ~soap(); #else void (*dummy)(void); #endif }; struct soap_code_map { long code; const char *string; }; /* forwarding list */ struct soap_flist { struct soap_flist *next; int type; void *ptr; unsigned int level; size_t len; void (*fcopy)(struct soap*, int, int, void*, size_t, const void*, size_t); }; /* id-ref forwarding list */ struct soap_ilist { struct soap_ilist *next; int type; size_t size; void *link; void *copy; struct soap_flist *flist; void *ptr; unsigned int level; char id[1]; /* the actual id string value flows into the allocated region below this struct */ }; struct soap_plugin { struct soap_plugin *next; const char *id; void *data; int (*fcopy)(struct soap *soap, struct soap_plugin *dst, struct soap_plugin *src); void (*fdelete)(struct soap *soap, struct soap_plugin *p); /* should delete fields of plugin only and not free(p) */ }; #ifndef WITH_NONAMESPACES extern SOAP_NMAC struct Namespace namespaces[]; #endif #ifndef WITH_LEAN # define soap_get0(soap) (((soap)->bufidx>=(soap)->buflen && soap_recv(soap)) ? EOF : (unsigned char)(soap)->buf[(soap)->bufidx]) # define soap_get1(soap) (((soap)->bufidx>=(soap)->buflen && soap_recv(soap)) ? EOF : (unsigned char)(soap)->buf[(soap)->bufidx++]) #else soap_wchar soap_get0(struct soap*); soap_wchar soap_get1(struct soap*); #endif #define soap_versioning_paste(name, ext) name##_LIBRARY_VERSION_REQUIRED_##ext #define soap_versioning_ext(name, ext) soap_versioning_paste(name, ext) #define soap_versioning(name) soap_versioning_ext(name, GSOAP_VERSION) #define soap_init(soap) soap_init1(soap, SOAP_IO_DEFAULT) #define soap_init1(soap, mode) soap_init2(soap, mode, mode) #define soap_init2(soap, imode, omode) soap_versioning(soap_init)(soap, imode, omode) #define soap_new() soap_new1(SOAP_IO_DEFAULT) #define soap_new1(mode) soap_new2(mode, mode) #define soap_new2(imode, omode) soap_versioning(soap_new)(imode, omode) #define soap_revget1(soap) ((soap)->bufidx--) #define soap_unget(soap, c) ((soap)->ahead = c) #define soap_register_plugin(soap, plugin) soap_register_plugin_arg(soap, plugin, NULL) #define soap_mode(soap, n) ((soap)->mode = (soap)->imode = (soap)->omode = (n)) #define soap_imode(soap, n) ((soap)->imode = (n)) #define soap_omode(soap, n) ((soap)->omode = (n)) #define soap_set_imode(soap, n) ((soap)->imode |= (n)) #define soap_clr_imode(soap, n) ((soap)->imode &= ~(n)) #define soap_set_omode(soap, n) ((soap)->omode |= (n)) #define soap_clr_omode(soap, n) ((soap)->omode &= ~(n)) #define soap_set_mode(soap, n) ((soap)->imode |= (n), (soap)->omode |= (n)) #define soap_clr_mode(soap, n) ((soap)->imode &= ~(n), (soap)->omode &= ~(n)) #define soap_destroy(soap) soap_delete((soap), NULL) #ifdef HAVE_STRRCHR # define soap_strrchr(s, t) strrchr(s, t) #else SOAP_FMAC1 char* SOAP_FMAC2 soap_strrchr(const char *s, int t); #endif #ifdef HAVE_STRTOL # define soap_strtol(s, t, b) strtol(s, t, b) #else SOAP_FMAC1 long SOAP_FMAC2 soap_strtol(const char *s, char **t, int b); #endif #ifdef HAVE_STRTOUL # define soap_strtoul(s, t, b) strtoul(s, t, b) #else SOAP_FMAC1 unsigned long SOAP_FMAC2 soap_strtoul(const char *s, char **t, int b); #endif #if defined(WITH_OPENSSL) # define soap_random soap_rand() SOAP_FMAC1 int SOAP_FMAC2 soap_rand(void); #elif defined(HAVE_RANDOM) # define soap_random (int)random() #else # define soap_random rand() #endif #ifdef WITH_NOIDREF # define soap_embedded(s, p, t) (0) # define soap_id_lookup(s, i, p, t, n, k) (p) # define soap_id_forward(s, h, p, len, st, tt, n, k, fc) (p) # define soap_reference(s, a, t) (1) # define soap_array_reference(s, p, a, n, t) (1) # define soap_embed(s, p, a, n, t, pp) (0) # define soap_embedded_id(s, i, p, t) (i) # define soap_is_embedded(s, p) (0) # define soap_is_single(s, p) (1) # define soap_lookup_type(s, i) (0) # define soap_getindependent(s) (0) # define soap_putindependent(s) (0) # define soap_getelement(s, n) (n) # define soap_putelement(s, p, t, i, n) (0) # define soap_markelement(s, p, n) (0) #endif /* soap_traverse() traversal/walker routines take walker function arguments */ typedef void soap_walker(struct soap*, void*, int, const char*, const char*); SOAP_FMAC1 void SOAP_FMAC2 soap_header(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_fault(struct soap*); SOAP_FMAC1 const char** SOAP_FMAC2 soap_faultcode(struct soap*); SOAP_FMAC1 const char** SOAP_FMAC2 soap_faultsubcode(struct soap*); SOAP_FMAC1 const char** SOAP_FMAC2 soap_faultstring(struct soap*); SOAP_FMAC1 const char** SOAP_FMAC2 soap_faultdetail(struct soap*); SOAP_FMAC1 const char* SOAP_FMAC2 soap_check_faultsubcode(struct soap*); SOAP_FMAC1 const char* SOAP_FMAC2 soap_check_faultdetail(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_serializeheader(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_putheader(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_getheader(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_serializefault(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_putfault(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_getfault(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_ssl_init(void); SOAP_FMAC1 int SOAP_FMAC2 soap_poll(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_connect_command(struct soap*, int, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_connect(struct soap*, const char*, const char*); SOAP_FMAC1 SOAP_SOCKET SOAP_FMAC2 soap_bind(struct soap*, const char*, int, int); SOAP_FMAC1 SOAP_SOCKET SOAP_FMAC2 soap_accept(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_ssl_accept(struct soap*); SOAP_FMAC1 const char * SOAP_FMAC2 soap_ssl_error(struct soap*, int); SOAP_FMAC1 int SOAP_FMAC2 soap_ssl_server_context(struct soap*, unsigned short, const char*, const char*, const char*, const char*, const char*, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_ssl_client_context(struct soap*, unsigned short, const char*, const char*, const char*, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_puthttphdr(struct soap*, int status, size_t count); SOAP_FMAC1 const char* SOAP_FMAC2 soap_get_header_attribute(struct soap*, const char*, const char*); SOAP_FMAC1 const char* SOAP_FMAC2 soap_decode_key(char*, size_t, const char*); SOAP_FMAC1 const char* SOAP_FMAC2 soap_decode_val(char*, size_t, const char*); SOAP_FMAC1 size_t SOAP_FMAC2 soap_hash(const char*); SOAP_FMAC1 void SOAP_FMAC2 soap_set_endpoint(struct soap*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_flush_raw(struct soap*, const char*, size_t); SOAP_FMAC1 int SOAP_FMAC2 soap_flush(struct soap*); SOAP_FMAC1 soap_wchar SOAP_FMAC2 soap_get(struct soap*); SOAP_FMAC1 soap_wchar SOAP_FMAC2 soap_getchar(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_tag_cmp(const char*, const char*); SOAP_FMAC1 void SOAP_FMAC2 soap_set_fault(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_sender_fault(struct soap*, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_sender_fault_subcode(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_receiver_fault(struct soap*, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_receiver_fault_subcode(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_set_sender_error(struct soap*, const char*, const char*, int); SOAP_FMAC1 int SOAP_FMAC2 soap_set_receiver_error(struct soap*, const char*, const char*, int); SOAP_FMAC1 int SOAP_FMAC2 soap_send_raw(struct soap*, const char*, size_t); SOAP_FMAC1 int SOAP_FMAC2 soap_recv_raw(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_recv(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_send(struct soap*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_send2(struct soap*, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_send3(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_pututf8(struct soap*, unsigned long); SOAP_FMAC1 soap_wchar SOAP_FMAC2 soap_getutf8(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_putbase64(struct soap*, const unsigned char*, int); SOAP_FMAC1 unsigned char* SOAP_FMAC2 soap_getbase64(struct soap*, int*, int); SOAP_FMAC1 int SOAP_FMAC2 soap_puthex(struct soap*, const unsigned char*, int); SOAP_FMAC1 unsigned char* SOAP_FMAC2 soap_gethex(struct soap*, int*); #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_xop_forward(struct soap*, unsigned char**, int*, char**, char**, char**); SOAP_FMAC1 int SOAP_FMAC2 soap_dime_forward(struct soap*, unsigned char**, int*, char**, char**, char**); #endif #ifndef WITH_NOIDREF SOAP_FMAC1 int SOAP_FMAC2 soap_pointer_lookup_id(struct soap*, void *p, int t, struct soap_plist**); SOAP_FMAC1 int SOAP_FMAC2 soap_pointer_lookup(struct soap*, const void *p, int t, struct soap_plist**); SOAP_FMAC1 int SOAP_FMAC2 soap_pointer_enter(struct soap*, const void *p, const struct soap_array *a, int n, int t, struct soap_plist**); SOAP_FMAC1 int SOAP_FMAC2 soap_array_pointer_lookup(struct soap*, const void *p, const struct soap_array *a, int n, int t, struct soap_plist**); SOAP_FMAC1 int SOAP_FMAC2 soap_embed(struct soap *soap, const void *p, const struct soap_array *a, int n, const char *tag, int type); SOAP_FMAC1 struct soap_ilist* SOAP_FMAC2 soap_lookup(struct soap*, const char*); SOAP_FMAC1 struct soap_ilist* SOAP_FMAC2 soap_enter(struct soap*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_resolve(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_embedded(struct soap*, const void *p, int t); SOAP_FMAC1 int SOAP_FMAC2 soap_reference(struct soap*, const void *p, int t); SOAP_FMAC1 int SOAP_FMAC2 soap_array_reference(struct soap*, const void *p, const struct soap_array *a, int n, int t); SOAP_FMAC1 int SOAP_FMAC2 soap_embedded_id(struct soap*, int id, const void *p, int t); SOAP_FMAC1 int SOAP_FMAC2 soap_is_embedded(struct soap*, struct soap_plist*); SOAP_FMAC1 int SOAP_FMAC2 soap_is_single(struct soap*, struct soap_plist*); SOAP_FMAC1 void SOAP_FMAC2 soap_set_embedded(struct soap*, struct soap_plist*); #endif SOAP_FMAC1 int SOAP_FMAC2 soap_begin_count(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_end_count(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_begin_send(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_end_send(struct soap*); SOAP_FMAC1 const struct soap_code_map* SOAP_FMAC2 soap_code(const struct soap_code_map*, const char*); SOAP_FMAC1 long SOAP_FMAC2 soap_code_int(const struct soap_code_map*, const char*, long); SOAP_FMAC1 const char* SOAP_FMAC2 soap_code_str(const struct soap_code_map*, long); SOAP_FMAC1 long SOAP_FMAC2 soap_code_bits(const struct soap_code_map*, const char*); SOAP_FMAC1 const char* SOAP_FMAC2 soap_code_list(struct soap*, const struct soap_code_map*, long); SOAP_FMAC1 int SOAP_FMAC2 soap_getline(struct soap*, char*, int); SOAP_FMAC1 int SOAP_FMAC2 soap_begin_serve(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_begin_recv(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_end_recv(struct soap*); SOAP_FMAC1 void* SOAP_FMAC2 soap_malloc(struct soap*, size_t); SOAP_FMAC1 void SOAP_FMAC2 soap_dealloc(struct soap*, void*); SOAP_FMAC1 struct soap_clist * SOAP_FMAC2 soap_link(struct soap*, void*, int, int, int (*fdelete)(struct soap_clist*)); SOAP_FMAC1 int SOAP_FMAC2 soap_unlink(struct soap*, const void*); SOAP_FMAC1 void SOAP_FMAC2 soap_free_temp(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_del(struct soap*); SOAP_FMAC1 void* SOAP_FMAC2 soap_track_malloc(struct soap*, const char*, int, size_t); SOAP_FMAC1 void SOAP_FMAC2 soap_track_free(struct soap*, const char*, int, void*); #ifndef WITH_NOIDREF SOAP_FMAC1 int SOAP_FMAC2 soap_lookup_type(struct soap*, const char *id); SOAP_FMAC1 void* SOAP_FMAC2 soap_id_lookup(struct soap*, const char *id, void **p, int t, size_t n, unsigned int k); SOAP_FMAC1 void* SOAP_FMAC2 soap_id_forward(struct soap*, const char *id, void *p, size_t len, int st, int tt, size_t n, unsigned int k, void(*fcopy)(struct soap*, int, int, void*, size_t, const void*, size_t)); #endif SOAP_FMAC1 void* SOAP_FMAC2 soap_id_enter(struct soap*, const char *id, void *p, int t, size_t n, unsigned int k, const char *type, const char *arrayType, void *(*finstantiate)(struct soap*, int, const char*, const char*, size_t*)); SOAP_FMAC1 void SOAP_FMAC2 soap_fcopy(struct soap *soap, int st, int tt, void *p, size_t, const void *q, size_t n); SOAP_FMAC1 int SOAP_FMAC2 soap_size(const int *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_getoffsets(const char *, const int *, int *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_getsize(const char *, const char *, int *); SOAP_FMAC1 int SOAP_FMAC2 soap_getsizes(const char *, int *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_getposition(const char *, int *); SOAP_FMAC1 char* SOAP_FMAC2 soap_putsize(struct soap*, const char *, int); SOAP_FMAC1 char* SOAP_FMAC2 soap_putsizesoffsets(struct soap*, const char *, const int *, const int *, int); SOAP_FMAC1 char* SOAP_FMAC2 soap_putsizes(struct soap*, const char *, const int *, int); SOAP_FMAC1 char* SOAP_FMAC2 soap_putoffset(struct soap*, int); SOAP_FMAC1 char* SOAP_FMAC2 soap_putoffsets(struct soap*, const int *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_closesock(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_force_closesock(struct soap*); SOAP_FMAC1 struct soap *SOAP_FMAC2 soap_versioning(soap_new)(soap_mode, soap_mode); SOAP_FMAC1 void SOAP_FMAC2 soap_free(struct soap*); SOAP_FMAC1 struct soap *SOAP_FMAC2 soap_copy(const struct soap*); SOAP_FMAC1 struct soap *SOAP_FMAC2 soap_copy_context(struct soap*, const struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_copy_stream(struct soap*, struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_free_stream(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_versioning(soap_init)(struct soap*, soap_mode, soap_mode); SOAP_FMAC1 void SOAP_FMAC2 soap_done(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_cleanup(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_begin(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_end(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_delete(struct soap*, void*); SOAP_FMAC1 void SOAP_FMAC2 soap_delegate_deletion(struct soap*, struct soap*); /* API functions available with DEBUG or SOAP_DEBUG defined: */ SOAP_FMAC1 void SOAP_FMAC2 soap_set_recv_logfile(struct soap*, const char*); SOAP_FMAC1 void SOAP_FMAC2 soap_set_sent_logfile(struct soap*, const char*); SOAP_FMAC1 void SOAP_FMAC2 soap_set_test_logfile(struct soap*, const char*); SOAP_FMAC1 void SOAP_FMAC2 soap_close_logfiles(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_open_logfile(struct soap*, int); /* */ SOAP_FMAC1 const char* SOAP_FMAC2 soap_value(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_match_tag(struct soap*, const char*, const char *); SOAP_FMAC1 int SOAP_FMAC2 soap_match_array(struct soap*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_element(struct soap*, const char*, int, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_element_begin_out(struct soap*, const char *tag, int id, const char *type); SOAP_FMAC1 int SOAP_FMAC2 soap_array_begin_out(struct soap*, const char *tag, int id, const char *type, const char *offset); SOAP_FMAC1 int SOAP_FMAC2 soap_element_ref(struct soap*, const char *tag, int id, int href); SOAP_FMAC1 int SOAP_FMAC2 soap_element_href(struct soap*, const char *tag, int id, const char *ref, const char *val); SOAP_FMAC1 int SOAP_FMAC2 soap_element_null(struct soap*, const char *tag, int id, const char *type); SOAP_FMAC1 int SOAP_FMAC2 soap_element_nil(struct soap*, const char *tag); SOAP_FMAC1 int SOAP_FMAC2 soap_element_id(struct soap*, const char *tag, int id, const void *p, const struct soap_array *a, int d, const char *type, int n); SOAP_FMAC1 int SOAP_FMAC2 soap_element_result(struct soap*, const char *tag); SOAP_FMAC1 void SOAP_FMAC2 soap_check_result(struct soap*, const char *tag); SOAP_FMAC1 int SOAP_FMAC2 soap_element_end_out(struct soap*, const char *tag); SOAP_FMAC1 int SOAP_FMAC2 soap_element_start_end_out(struct soap*, const char *tag); SOAP_FMAC1 int SOAP_FMAC2 soap_attribute(struct soap*, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_element_begin_in(struct soap*, const char *tag, int nillable, const char *type); SOAP_FMAC1 int SOAP_FMAC2 soap_element_end_in(struct soap*, const char *tag); SOAP_FMAC1 int SOAP_FMAC2 soap_peek_element(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_retry(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_revert(struct soap*); SOAP_FMAC1 char* SOAP_FMAC2 soap_strdup(struct soap*, const char*); SOAP_FMAC1 wchar_t* SOAP_FMAC2 soap_wstrdup(struct soap*, const wchar_t*); SOAP_FMAC1 const char * SOAP_FMAC2 soap_tagsearch(const char *big, const char *little); SOAP_FMAC1 int SOAP_FMAC2 soap_string_out(struct soap*, const char *s, int flag); SOAP_FMAC1 char* SOAP_FMAC2 soap_string_in(struct soap*, int, long, long); #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_wstring_out(struct soap*, const wchar_t *s, int flag); SOAP_FMAC1 wchar_t* SOAP_FMAC2 soap_wstring_in(struct soap*, int, long, long); #endif SOAP_FMAC1 int SOAP_FMAC2 soap_match_namespace(struct soap*, const char *, const char*, size_t n1, size_t n2); SOAP_FMAC1 int SOAP_FMAC2 soap_set_namespaces(struct soap*, const struct Namespace*); SOAP_FMAC1 void SOAP_FMAC2 soap_set_local_namespaces(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_pop_namespace(struct soap*); SOAP_FMAC1 struct soap_nlist* SOAP_FMAC2 soap_push_namespace(struct soap*, const char *,const char *); SOAP_FMAC1 const char* SOAP_FMAC2 soap_current_namespace(struct soap *soap, const char *tag); SOAP_FMAC1 struct soap_nlist* SOAP_FMAC2 soap_lookup_ns(struct soap *soap, const char *tag, size_t n); SOAP_FMAC1 int SOAP_FMAC2 soap_store_lab(struct soap*, const char*, size_t); SOAP_FMAC1 int SOAP_FMAC2 soap_append_lab(struct soap*, const char*, size_t); SOAP_FMAC1 struct soap_blist* SOAP_FMAC2 soap_new_block(struct soap*); SOAP_FMAC1 void* SOAP_FMAC2 soap_push_block(struct soap*, struct soap_blist*, size_t); SOAP_FMAC1 void SOAP_FMAC2 soap_pop_block(struct soap*, struct soap_blist*); SOAP_FMAC1 size_t SOAP_FMAC2 soap_size_block(struct soap*, struct soap_blist*, size_t); SOAP_FMAC1 char* SOAP_FMAC2 soap_first_block(struct soap*, struct soap_blist*); SOAP_FMAC1 char* SOAP_FMAC2 soap_next_block(struct soap*, struct soap_blist*); SOAP_FMAC1 size_t SOAP_FMAC2 soap_block_size(struct soap*, struct soap_blist*); SOAP_FMAC1 char* SOAP_FMAC2 soap_save_block(struct soap*, struct soap_blist*, char*, int); SOAP_FMAC1 void SOAP_FMAC2 soap_end_block(struct soap*, struct soap_blist*); SOAP_FMAC1 void SOAP_FMAC2 soap_update_pointers(struct soap *soap, char *start, char *end, char *p1, char *p2); SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_begin_out(struct soap*); SOAP_FMAC1 int soap_envelope_end_out(struct soap*); SOAP_FMAC1 char * SOAP_FMAC2 soap_get_http_body(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_begin_in(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_end_in(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_body_begin_out(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_body_end_out(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_body_begin_in(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_body_end_in(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_recv_header(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_response(struct soap*, int); SOAP_FMAC1 int SOAP_FMAC2 soap_send_empty_response(struct soap*, int status); SOAP_FMAC1 int SOAP_FMAC2 soap_recv_empty_response(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_send_fault(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_recv_fault(struct soap*, int check); #ifndef WITH_NOSTDLIB SOAP_FMAC1 void SOAP_FMAC2 soap_print_fault(struct soap*, FILE*); SOAP_FMAC1 void SOAP_FMAC2 soap_print_fault_location(struct soap*, FILE*); # ifndef WITH_LEAN # ifndef WITH_COMPAT # ifdef __cplusplus SOAP_FMAC1 void SOAP_FMAC2 soap_stream_fault(struct soap*, std::ostream&); # endif # endif SOAP_FMAC1 char* SOAP_FMAC2 soap_sprint_fault(struct soap*, char*, size_t); # endif #endif SOAP_FMAC1 int SOAP_FMAC2 soap_s2byte(struct soap*, const char*, char*); SOAP_FMAC1 int SOAP_FMAC2 soap_s2short(struct soap*, const char*, short*); SOAP_FMAC1 int SOAP_FMAC2 soap_s2int(struct soap*, const char*, int*); SOAP_FMAC1 int SOAP_FMAC2 soap_s2long(struct soap*, const char*, long*); SOAP_FMAC1 int SOAP_FMAC2 soap_s2LONG64(struct soap*, const char*, LONG64*); SOAP_FMAC1 int SOAP_FMAC2 soap_s2float(struct soap*, const char*, float*); SOAP_FMAC1 int SOAP_FMAC2 soap_s2double(struct soap*, const char*, double*); SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedByte(struct soap*, const char*, unsigned char*); SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedShort(struct soap*, const char*, unsigned short*); SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedInt(struct soap*, const char*, unsigned int*); SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedLong(struct soap*, const char*, unsigned long*); SOAP_FMAC1 int SOAP_FMAC2 soap_s2ULONG64(struct soap*, const char*, ULONG64*); SOAP_FMAC1 int SOAP_FMAC2 soap_s2string(struct soap*, const char*, char**, long minlen, long maxlen); SOAP_FMAC1 int SOAP_FMAC2 soap_s2QName(struct soap*, const char*, char**, long minlen, long maxlen); #ifndef WITH_LEAN SOAP_FMAC1 int SOAP_FMAC2 soap_s2wchar(struct soap*, const char*, wchar_t**, long minlen, long maxlen); SOAP_FMAC1 int SOAP_FMAC2 soap_s2dateTime(struct soap*, const char*, time_t*); SOAP_FMAC1 char* SOAP_FMAC2 soap_s2base64(struct soap*, const unsigned char*, char*, int); SOAP_FMAC1 char* SOAP_FMAC2 soap_s2hex(struct soap*, const unsigned char*, char*, int); #endif SOAP_FMAC1 const char* SOAP_FMAC2 soap_byte2s(struct soap*, char); SOAP_FMAC1 const char* SOAP_FMAC2 soap_short2s(struct soap*, short); SOAP_FMAC1 const char* SOAP_FMAC2 soap_int2s(struct soap*, int); SOAP_FMAC1 const char* SOAP_FMAC2 soap_long2s(struct soap*, long); SOAP_FMAC1 const char* SOAP_FMAC2 soap_LONG642s(struct soap*, LONG64); SOAP_FMAC1 const char* SOAP_FMAC2 soap_float2s(struct soap*, float); SOAP_FMAC1 const char* SOAP_FMAC2 soap_double2s(struct soap*, double); SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedByte2s(struct soap*, unsigned char); SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedShort2s(struct soap*, unsigned short); SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedInt2s(struct soap*, unsigned int); SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedLong2s(struct soap*, unsigned long); SOAP_FMAC1 const char* SOAP_FMAC2 soap_ULONG642s(struct soap*, ULONG64); SOAP_FMAC1 const char* SOAP_FMAC2 soap_QName2s(struct soap*, const char*); #ifndef WITH_LEAN SOAP_FMAC1 const char* SOAP_FMAC2 soap_wchar2s(struct soap*, const wchar_t*); SOAP_FMAC1 const char* SOAP_FMAC2 soap_dateTime2s(struct soap*, time_t); SOAP_FMAC1 const char* SOAP_FMAC2 soap_base642s(struct soap*, const char*, char*, size_t, int*); SOAP_FMAC1 const char* SOAP_FMAC2 soap_hex2s(struct soap*, const char*, char*, size_t, int*); #endif SOAP_FMAC1 int* SOAP_FMAC2 soap_inint(struct soap*, const char *tag, int *p, const char *, int); SOAP_FMAC1 char* SOAP_FMAC2 soap_inbyte(struct soap*, const char *tag, char *p, const char *, int); SOAP_FMAC1 long* SOAP_FMAC2 soap_inlong(struct soap*, const char *tag, long *p, const char *, int); SOAP_FMAC1 LONG64* SOAP_FMAC2 soap_inLONG64(struct soap*, const char *tag, LONG64 *p, const char *, int); SOAP_FMAC1 short* SOAP_FMAC2 soap_inshort(struct soap*, const char *tag, short *p, const char *, int); SOAP_FMAC1 float* SOAP_FMAC2 soap_infloat(struct soap*, const char *tag, float *p, const char *, int); SOAP_FMAC1 double* SOAP_FMAC2 soap_indouble(struct soap*, const char *tag, double *p, const char *, int); SOAP_FMAC1 unsigned char* SOAP_FMAC2 soap_inunsignedByte(struct soap*, const char *tag, unsigned char *p, const char *, int); SOAP_FMAC1 unsigned short* SOAP_FMAC2 soap_inunsignedShort(struct soap*, const char *tag, unsigned short *p, const char *, int); SOAP_FMAC1 unsigned int* SOAP_FMAC2 soap_inunsignedInt(struct soap*, const char *tag, unsigned int *p, const char *, int); SOAP_FMAC1 unsigned long* SOAP_FMAC2 soap_inunsignedLong(struct soap*, const char *tag, unsigned long *p, const char *, int); SOAP_FMAC1 ULONG64* SOAP_FMAC2 soap_inULONG64(struct soap*, const char *tag, ULONG64 *p, const char *, int); SOAP_FMAC1 char** SOAP_FMAC2 soap_instring(struct soap*, const char *tag, char **p, const char *, int, int, long, long); SOAP_FMAC1 char** SOAP_FMAC2 soap_inliteral(struct soap*, const char *tag, char **p); #ifndef WITH_LEAN SOAP_FMAC1 time_t* SOAP_FMAC2 soap_indateTime(struct soap*, const char *tag, time_t *p, const char *, int); SOAP_FMAC1 time_t SOAP_FMAC2 soap_timegm(struct tm*); #endif #ifndef WITH_LEANER SOAP_FMAC1 wchar_t** SOAP_FMAC2 soap_inwstring(struct soap*, const char *tag, wchar_t **p, const char *, int, long, long); SOAP_FMAC1 wchar_t** SOAP_FMAC2 soap_inwliteral(struct soap*, const char *tag, wchar_t **p); #endif SOAP_FMAC1 int SOAP_FMAC2 soap_outbyte(struct soap*, const char *tag, int id, const char *p, const char *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_outshort(struct soap*, const char *tag, int id, const short *p, const char *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_outint(struct soap*, const char *tag, int id, const int *p, const char *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_outlong(struct soap*, const char *tag, int id, const long *p, const char *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_outLONG64(struct soap*, const char *tag, int id, const LONG64 *p, const char *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_outfloat(struct soap*, const char *tag, int id, const float *p, const char *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_outdouble(struct soap*, const char *tag, int id, const double *p, const char *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_outunsignedByte(struct soap*, const char *tag, int id, const unsigned char *p, const char *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_outunsignedShort(struct soap*, const char *tag, int id, const unsigned short *p, const char *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_outunsignedInt(struct soap*, const char *tag, int id, const unsigned int *p, const char *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_outunsignedLong(struct soap*, const char *tag, int id, const unsigned long *p, const char *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_outULONG64(struct soap*, const char *tag, int id, const ULONG64 *p, const char *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_outstring(struct soap*, const char *tag, int id, char *const*p, const char *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_outliteral(struct soap*, const char *tag, char *const*p, const char *type); #ifndef WITH_LEAN SOAP_FMAC1 int SOAP_FMAC2 soap_outdateTime(struct soap*, const char *tag, int id, const time_t *p, const char *, int); #endif #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_outwstring(struct soap*, const char *tag, int id, wchar_t *const*p, const char *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_outwliteral(struct soap*, const char *tag, wchar_t *const*p, const char *type); #endif #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_attachment(struct soap *, const char*, int, const void*, const struct soap_array*, const char*, const char*, const char*, int, const char*, int); SOAP_FMAC1 int SOAP_FMAC2 soap_move(struct soap*, long); SOAP_FMAC1 size_t SOAP_FMAC2 soap_tell(struct soap*); SOAP_FMAC1 char* SOAP_FMAC2 soap_dime_option(struct soap*, unsigned short, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_getdimehdr(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_getdime(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_putdimehdr(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_putdime(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_getmimehdr(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_getmime(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_putmimehdr(struct soap*, struct soap_multipart*); SOAP_FMAC1 int SOAP_FMAC2 soap_putmime(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_set_dime(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_set_mime(struct soap*, const char *boundary, const char *start); SOAP_FMAC1 void SOAP_FMAC2 soap_clr_dime(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_clr_mime(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_set_dime_attachment(struct soap*, char *ptr, size_t size, const char *type, const char *id, unsigned short optype, const char *option); SOAP_FMAC1 int SOAP_FMAC2 soap_set_mime_attachment(struct soap*, char *ptr, size_t size, enum soap_mime_encoding encoding, const char *type, const char *id, const char *location, const char *description); SOAP_FMAC1 void SOAP_FMAC2 soap_post_check_mime_attachments(struct soap *soap); SOAP_FMAC1 int SOAP_FMAC2 soap_check_mime_attachments(struct soap *soap); SOAP_FMAC1 struct soap_multipart* SOAP_FMAC2 soap_get_mime_attachment(struct soap *soap, void *handle); SOAP_FMAC1 int SOAP_FMAC2 soap_match_cid(struct soap*, const char*, const char*); #endif SOAP_FMAC1 int SOAP_FMAC2 soap_register_plugin_arg(struct soap*, int (*fcreate)(struct soap*, struct soap_plugin*, void*), void*); SOAP_FMAC1 void* SOAP_FMAC2 soap_lookup_plugin(struct soap*, const char*); SOAP_FMAC1 const char* SOAP_FMAC2 soap_attr_value(struct soap *soap, const char *name, int flag); SOAP_FMAC1 int SOAP_FMAC2 soap_set_attr(struct soap *soap, const char *name, const char *value, int flag); SOAP_FMAC1 void SOAP_FMAC2 soap_clr_attr(struct soap *soap); #ifdef WITH_COOKIES SOAP_FMAC1 void SOAP_FMAC2 soap_getcookies(struct soap *soap, const char *val); SOAP_FMAC1 size_t SOAP_FMAC2 soap_encode_cookie(const char*, char*, size_t); SOAP_FMAC1 extern struct soap_cookie* SOAP_FMAC2 soap_set_cookie(struct soap*, const char*, const char*, const char*, const char*); SOAP_FMAC1 extern struct soap_cookie* SOAP_FMAC2 soap_cookie(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 extern char* SOAP_FMAC2 soap_cookie_value(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 extern char* SOAP_FMAC2 soap_env_cookie_value(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 extern time_t SOAP_FMAC2 soap_cookie_expire(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 extern int SOAP_FMAC2 soap_set_cookie_expire(struct soap*, const char*, long, const char*, const char*); SOAP_FMAC1 extern int SOAP_FMAC2 soap_set_cookie_session(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 extern int SOAP_FMAC2 soap_clr_cookie_session(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 extern void SOAP_FMAC2 soap_clr_cookie(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 extern int SOAP_FMAC2 soap_getenv_cookies(struct soap*); SOAP_FMAC1 extern struct soap_cookie* SOAP_FMAC2 soap_copy_cookies(struct soap*, const struct soap*); SOAP_FMAC1 extern void SOAP_FMAC2 soap_free_cookies(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_putsetcookies(struct soap *soap); SOAP_FMAC1 int SOAP_FMAC2 soap_putcookies(struct soap *soap, const char *domain, const char *path, int secure); #endif #ifdef __cplusplus } /* extern "C" */ #endif #endif /* STDSOAP_H */ gsoap-2.8.28/gsoap/ios_plugin/examples/GeoIPService/GeoIPService-Info.plist0000644000175000017500000000161512653650146026114 0ustar ellertellert CFBundleDevelopmentRegion English CFBundleDisplayName ${PRODUCT_NAME} CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIconFile CFBundleIdentifier com.yourcompany.${PRODUCT_NAME:rfc1034identifier} CFBundleInfoDictionaryVersion 6.0 CFBundleName ${PRODUCT_NAME} CFBundlePackageType APPL CFBundleSignature ???? CFBundleVersion 1.0 LSRequiresIPhoneOS NSMainNibFile MainWindow gsoap-2.8.28/gsoap/src/0000755000175000017500000000000012653650174014175 5ustar ellertellertgsoap-2.8.28/gsoap/src/lex.yy.c0000644000175000017500000025236012653650160015574 0ustar ellertellert #line 3 "lex.yy.c" #define YY_INT_ALIGNED short int /* A lexical scanner generated by flex */ #define FLEX_SCANNER #define YY_FLEX_MAJOR_VERSION 2 #define YY_FLEX_MINOR_VERSION 5 #define YY_FLEX_SUBMINOR_VERSION 35 #if YY_FLEX_SUBMINOR_VERSION > 0 #define FLEX_BETA #endif /* First, we deal with platform-specific or compiler-specific issues. */ /* begin standard C headers. */ #include #include #include #include /* end standard C headers. */ /* flex integer type definitions */ #ifndef FLEXINT_H #define FLEXINT_H /* C99 systems have . Non-C99 systems may or may not. */ #if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, * if you want the limit (max/min) macros for int types. */ #ifndef __STDC_LIMIT_MACROS #define __STDC_LIMIT_MACROS 1 #endif #include typedef int8_t flex_int8_t; typedef uint8_t flex_uint8_t; typedef int16_t flex_int16_t; typedef uint16_t flex_uint16_t; typedef int32_t flex_int32_t; typedef uint32_t flex_uint32_t; typedef uint64_t flex_uint64_t; #else typedef signed char flex_int8_t; typedef short int flex_int16_t; typedef int flex_int32_t; typedef unsigned char flex_uint8_t; typedef unsigned short int flex_uint16_t; typedef unsigned int flex_uint32_t; #endif /* ! C99 */ /* Limits of integral types. */ #ifndef INT8_MIN #define INT8_MIN (-128) #endif #ifndef INT16_MIN #define INT16_MIN (-32767-1) #endif #ifndef INT32_MIN #define INT32_MIN (-2147483647-1) #endif #ifndef INT8_MAX #define INT8_MAX (127) #endif #ifndef INT16_MAX #define INT16_MAX (32767) #endif #ifndef INT32_MAX #define INT32_MAX (2147483647) #endif #ifndef UINT8_MAX #define UINT8_MAX (255U) #endif #ifndef UINT16_MAX #define UINT16_MAX (65535U) #endif #ifndef UINT32_MAX #define UINT32_MAX (4294967295U) #endif #endif /* ! FLEXINT_H */ #ifdef __cplusplus /* The "const" storage-class-modifier is valid. */ #define YY_USE_CONST #else /* ! __cplusplus */ /* C99 requires __STDC__ to be defined as 1. */ #if defined (__STDC__) #define YY_USE_CONST #endif /* defined (__STDC__) */ #endif /* ! __cplusplus */ #ifdef YY_USE_CONST #define yyconst const #else #define yyconst #endif /* Returned upon end-of-file. */ #define YY_NULL 0 /* Promotes a possibly negative, possibly signed char to an unsigned * integer for use as an array index. If the signed char is negative, * we want to instead treat it as an 8-bit unsigned char, hence the * double cast. */ #define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) /* Enter a start condition. This macro really ought to take a parameter, * but we do it the disgusting crufty way forced on us by the ()-less * definition of BEGIN. */ #define BEGIN (yy_start) = 1 + 2 * /* Translate the current start state into a value that can be later handed * to BEGIN to return to the state. The YYSTATE alias is for lex * compatibility. */ #define YY_START (((yy_start) - 1) / 2) #define YYSTATE YY_START /* Action number for EOF rule of a given start state. */ #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) /* Special action meaning "start processing a new file". */ #define YY_NEW_FILE yyrestart(yyin ) #define YY_END_OF_BUFFER_CHAR 0 /* Size of default input buffer. */ #ifndef YY_BUF_SIZE #define YY_BUF_SIZE 16384 #endif /* The state buf must be large enough to hold one state per character in the main buffer. */ #define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) #ifndef YY_TYPEDEF_YY_BUFFER_STATE #define YY_TYPEDEF_YY_BUFFER_STATE typedef struct yy_buffer_state *YY_BUFFER_STATE; #endif #ifndef YY_TYPEDEF_YY_SIZE_T #define YY_TYPEDEF_YY_SIZE_T typedef size_t yy_size_t; #endif extern yy_size_t yyleng; extern FILE *yyin, *yyout; #define EOB_ACT_CONTINUE_SCAN 0 #define EOB_ACT_END_OF_FILE 1 #define EOB_ACT_LAST_MATCH 2 /* Note: We specifically omit the test for yy_rule_can_match_eol because it requires * access to the local variable yy_act. Since yyless() is a macro, it would break * existing scanners that call yyless() from OUTSIDE yylex. * One obvious solution it to make yy_act a global. I tried that, and saw * a 5% performance hit in a non-yylineno scanner, because yy_act is * normally declared as a register variable-- so it is not worth it. */ #define YY_LESS_LINENO(n) \ do { \ yy_size_t yyl;\ for ( yyl = n; yyl < yyleng; ++yyl )\ if ( yytext[yyl] == '\n' )\ --yylineno;\ }while(0) /* Return all but the first "n" matched characters back to the input stream. */ #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ *yy_cp = (yy_hold_char); \ YY_RESTORE_YY_MORE_OFFSET \ (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ YY_DO_BEFORE_ACTION; /* set up yytext again */ \ } \ while ( 0 ) #define unput(c) yyunput( c, (yytext_ptr) ) #ifndef YY_STRUCT_YY_BUFFER_STATE #define YY_STRUCT_YY_BUFFER_STATE struct yy_buffer_state { FILE *yy_input_file; char *yy_ch_buf; /* input buffer */ char *yy_buf_pos; /* current position in input buffer */ /* Size of input buffer in bytes, not including room for EOB * characters. */ yy_size_t yy_buf_size; /* Number of characters read into yy_ch_buf, not including EOB * characters. */ yy_size_t yy_n_chars; /* Whether we "own" the buffer - i.e., we know we created it, * and can realloc() it to grow it, and should free() it to * delete it. */ int yy_is_our_buffer; /* Whether this is an "interactive" input source; if so, and * if we're using stdio for input, then we want to use getc() * instead of fread(), to make sure we stop fetching input after * each newline. */ int yy_is_interactive; /* Whether we're considered to be at the beginning of a line. * If so, '^' rules will be active on the next match, otherwise * not. */ int yy_at_bol; int yy_bs_lineno; /**< The line count. */ int yy_bs_column; /**< The column count. */ /* Whether to try to fill the input buffer when we reach the * end of it. */ int yy_fill_buffer; int yy_buffer_status; #define YY_BUFFER_NEW 0 #define YY_BUFFER_NORMAL 1 /* When an EOF's been seen but there's still some text to process * then we mark the buffer as YY_EOF_PENDING, to indicate that we * shouldn't try reading from the input source any more. We might * still have a bunch of tokens to match, though, because of * possible backing-up. * * When we actually see the EOF, we change the status to "new" * (via yyrestart()), so that the user can continue scanning by * just pointing yyin at a new input file. */ #define YY_BUFFER_EOF_PENDING 2 }; #endif /* !YY_STRUCT_YY_BUFFER_STATE */ /* Stack of input buffers. */ static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */ static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */ static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */ /* We provide macros for accessing buffer states in case in the * future we want to put the buffer states in a more general * "scanner state". * * Returns the top of the stack, or NULL. */ #define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ : NULL) /* Same as previous macro, but useful when we know that the buffer stack is not * NULL or when we need an lvalue. For internal use only. */ #define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] /* yy_hold_char holds the character lost when yytext is formed. */ static char yy_hold_char; static yy_size_t yy_n_chars; /* number of characters read into yy_ch_buf */ yy_size_t yyleng; /* Points to current character in buffer. */ static char *yy_c_buf_p = (char *) 0; static int yy_init = 0; /* whether we need to initialize */ static int yy_start = 0; /* start state number */ /* Flag which is used to allow yywrap()'s to do buffer switches * instead of setting up a fresh yyin. A bit of a hack ... */ static int yy_did_buffer_switch_on_eof; void yyrestart (FILE *input_file ); void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ); YY_BUFFER_STATE yy_create_buffer (FILE *file,int size ); void yy_delete_buffer (YY_BUFFER_STATE b ); void yy_flush_buffer (YY_BUFFER_STATE b ); void yypush_buffer_state (YY_BUFFER_STATE new_buffer ); void yypop_buffer_state (void ); static void yyensure_buffer_stack (void ); static void yy_load_buffer_state (void ); static void yy_init_buffer (YY_BUFFER_STATE b,FILE *file ); #define YY_FLUSH_BUFFER yy_flush_buffer(YY_CURRENT_BUFFER ) YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size ); YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str ); YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,yy_size_t len ); void *yyalloc (yy_size_t ); void *yyrealloc (void *,yy_size_t ); void yyfree (void * ); #define yy_new_buffer yy_create_buffer #define yy_set_interactive(is_interactive) \ { \ if ( ! YY_CURRENT_BUFFER ){ \ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer(yyin,YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ } #define yy_set_bol(at_bol) \ { \ if ( ! YY_CURRENT_BUFFER ){\ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer(yyin,YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ } #define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) /* Begin user sect3 */ #define yywrap(n) 1 #define YY_SKIP_YYWRAP typedef unsigned char YY_CHAR; FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; typedef int yy_state_type; #define YY_FLEX_LEX_COMPAT extern int yylineno; int yylineno = 1; extern char yytext[]; static yy_state_type yy_get_previous_state (void ); static yy_state_type yy_try_NUL_trans (yy_state_type current_state ); static int yy_get_next_buffer (void ); static void yy_fatal_error (yyconst char msg[] ); /* Done after the current pattern has been matched and before the * corresponding action - sets up yytext. */ #define YY_DO_BEFORE_ACTION \ (yytext_ptr) = yy_bp; \ yyleng = (yy_size_t) (yy_cp - yy_bp); \ (yy_hold_char) = *yy_cp; \ *yy_cp = '\0'; \ if ( yyleng + (yy_more_offset) >= YYLMAX ) \ YY_FATAL_ERROR( "token too large, exceeds YYLMAX" ); \ yy_flex_strncpy( &yytext[(yy_more_offset)], (yytext_ptr), yyleng + 1 ); \ yyleng += (yy_more_offset); \ (yy_prev_more_offset) = (yy_more_offset); \ (yy_more_offset) = 0; \ (yy_c_buf_p) = yy_cp; #define YY_NUM_RULES 45 #define YY_END_OF_BUFFER 46 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info { flex_int32_t yy_verify; flex_int32_t yy_nxt; }; static yyconst flex_int16_t yy_acclist[159] = { 0, 46, 44, 45, 2, 44, 45, 2, 45, 31, 44, 45, 44, 45,16427, 44, 45, 31, 44, 45, 31, 44, 45, 31, 44, 45, 44, 45,16426, 31, 44, 45, 31, 44, 45, 31, 44, 45, 31, 44, 45, 34, 44, 45, 34, 44, 45, 31, 44, 45, 31, 44, 45, 31, 44, 45, 31, 44, 45, 32, 44, 45, 32, 44, 45, 44, 45, 31, 44, 45, 44, 45, 31, 44, 45, 32, 44, 45, 32, 44, 45, 4, 45, 4, 45, 23,16427, 8235, 38,16427, 41, 14, 21, 15,16426, 8234, 37,16426, 12, 28, 10, 29, 11, 30, 3, 13, 34, 32, 32, 26, 24, 22, 25, 27, 32, 32, 16, 17, 20, 32, 32, 32, 5, 8235, 38, 37, 9, 36, 36, 35, 18, 19, 32, 32, 33, 1, 32, 36, 41, 41, 7, 9, 8, 9, 40, 41, 40, 39, 41, 39, 40, 41, 40, 39, 41, 39, 6, 7, 9 } ; static yyconst flex_int16_t yy_accept[169] = { 0, 1, 1, 1, 1, 1, 2, 4, 7, 9, 12, 15, 17, 20, 23, 26, 29, 32, 35, 38, 41, 44, 47, 50, 53, 56, 59, 62, 65, 67, 70, 72, 75, 78, 81, 83, 85, 86, 87, 88, 89, 90, 90, 91, 91, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 105, 106, 106, 107, 107, 107, 108, 108, 109, 110, 111, 112, 113, 114, 115, 115, 115, 116, 116, 116, 117, 117, 118, 119, 120, 121, 122, 123, 123, 123, 124, 125, 125, 125, 126, 126, 127, 127, 127, 127, 128, 128, 129, 130, 131, 132, 132, 133, 134, 134, 135, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 139, 139, 140, 140, 142, 142, 142, 144, 144, 144, 146, 146, 146, 147, 147, 147, 149, 149, 149, 150, 150, 152, 153, 155, 156, 156, 156, 159, 159 } ; static yyconst flex_int32_t yy_ec[256] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 4, 5, 6, 7, 8, 9, 10, 11, 8, 8, 12, 13, 8, 14, 15, 16, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 8, 20, 21, 22, 8, 8, 23, 23, 23, 23, 24, 23, 25, 25, 25, 25, 25, 26, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 27, 25, 25, 8, 28, 8, 29, 25, 30, 31, 23, 23, 32, 33, 23, 34, 35, 36, 25, 25, 37, 38, 25, 39, 40, 25, 41, 42, 43, 44, 25, 25, 45, 25, 25, 8, 46, 8, 8, 1, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 48, 47, 47, 47, 47, 47, 47, 47, 49, 47, 49, 47, 47, 49, 47, 49, 47, 47, 49, 47, 47, 49, 47, 49, 49, 49, 49, 50, 49, 49, 49, 51, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 53, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52 } ; static yyconst flex_int32_t yy_meta[54] = { 0, 1, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 4, 4, 1, 1, 2, 5, 5, 5, 5, 5, 5, 1, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1, 1, 1, 5, 1, 1, 5, 5 } ; static yyconst flex_int16_t yy_base[185] = { 0, 0, 346, 385, 384, 395, 500, 500, 500, 373, 51, 52, 500, 372, 46, 55, 370, 47, 48, 59, 67, 78, 45, 43, 367, 55, 53, 80, 343, 364, 0, 57, 115, 334, 500, 366, 500, 86, 59, 500, 98, 378, 500, 71, 107, 500, 500, 500, 110, 500, 500, 112, 500, 500, 500, 500, 500, 500, 500, 113, 500, 100, 124, 136, 152, 103, 335, 0, 347, 500, 500, 500, 346, 108, 154, 312, 130, 124, 169, 500, 325, 500, 500, 0, 0, 298, 500, 131, 185, 145, 168, 104, 186, 117, 323, 500, 187, 191, 194, 181, 102, 107, 192, 500, 500, 212, 190, 199, 234, 500, 0, 189, 216, 209, 200, 231, 217, 223, 255, 253, 257, 219, 224, 260, 259, 261, 265, 275, 286, 284, 261, 292, 293, 298, 309, 321, 294, 317, 332, 335, 338, 341, 302, 500, 311, 298, 500, 297, 344, 350, 228, 356, 359, 205, 362, 368, 201, 371, 374, 347, 500, 500, 500, 500, 132, 58, 500, 500, 422, 427, 432, 437, 54, 439, 444, 449, 454, 459, 464, 469, 474, 479, 484, 489, 494 } ; static yyconst flex_int16_t yy_def[185] = { 0, 167, 1, 168, 168, 167, 167, 167, 167, 167, 169, 170, 167, 167, 167, 171, 167, 167, 167, 167, 167, 167, 172, 167, 167, 167, 173, 173, 167, 167, 174, 167, 173, 32, 167, 167, 167, 169, 175, 167, 169, 170, 167, 170, 170, 167, 167, 167, 171, 167, 167, 171, 167, 167, 167, 167, 167, 167, 167, 176, 167, 167, 167, 167, 167, 173, 167, 32, 167, 167, 167, 167, 167, 173, 173, 167, 32, 175, 167, 167, 174, 167, 167, 32, 32, 32, 167, 175, 175, 175, 175, 170, 170, 177, 176, 167, 176, 176, 176, 167, 167, 167, 167, 167, 167, 167, 32, 32, 167, 167, 32, 175, 170, 170, 177, 177, 176, 176, 167, 167, 167, 170, 170, 176, 176, 167, 167, 167, 167, 170, 170, 176, 176, 167, 170, 170, 178, 179, 180, 181, 182, 183, 178, 167, 178, 179, 167, 180, 180, 181, 181, 181, 181, 182, 182, 183, 183, 183, 183, 178, 167, 167, 167, 167, 184, 184, 167, 0, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167 } ; static yyconst flex_int16_t yy_nxt[554] = { 0, 6, 7, 8, 7, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 12, 19, 20, 21, 22, 23, 24, 25, 26, 26, 26, 27, 26, 28, 29, 30, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 31, 6, 7, 26, 6, 6, 32, 32, 38, 42, 46, 39, 49, 65, 53, 166, 55, 68, 69, 39, 50, 47, 54, 56, 57, 58, 74, 66, 42, 59, 71, 72, 81, 40, 60, 75, 61, 51, 62, 62, 77, 88, 43, 38, 44, 63, 39, 61, 64, 62, 62, 67, 67, 74, 63, 89, 63, 82, 90, 76, 76, 42, 75, 91, 42, 63, 64, 49, 40, 49, 95, 99, 99, 101, 101, 50, 74, 93, 101, 101, 40, 74, 50, 96, 39, 75, 76, 76, 74, 166, 75, 39, 51, 61, 51, 62, 62, 75, 112, 115, 92, 97, 63, 100, 100, 39, 88, 101, 101, 76, 76, 63, 98, 88, 76, 76, 83, 83, 84, 83, 83, 76, 76, 102, 102, 167, 167, 88, 39, 102, 102, 106, 106, 107, 106, 106, 75, 102, 102, 102, 108, 108, 111, 42, 95, 90, 108, 108, 95, 39, 88, 95, 99, 99, 108, 108, 108, 96, 163, 118, 76, 76, 162, 102, 102, 50, 42, 88, 118, 102, 102, 88, 113, 42, 95, 97, 42, 102, 102, 102, 95, 42, 115, 119, 119, 161, 98, 116, 117, 119, 119, 106, 106, 107, 106, 106, 93, 119, 119, 119, 106, 106, 107, 106, 106, 120, 120, 122, 124, 121, 123, 120, 120, 115, 129, 130, 95, 95, 42, 120, 120, 120, 125, 125, 127, 127, 126, 126, 128, 128, 127, 127, 126, 126, 128, 128, 126, 126, 127, 127, 127, 42, 128, 128, 128, 131, 133, 133, 135, 95, 95, 143, 133, 133, 160, 146, 132, 65, 65, 143, 133, 133, 133, 65, 65, 138, 139, 138, 143, 73, 73, 65, 65, 65, 146, 73, 73, 140, 141, 140, 95, 134, 137, 73, 73, 73, 136, 144, 148, 149, 148, 151, 152, 151, 154, 155, 154, 157, 158, 157, 148, 149, 148, 110, 143, 159, 151, 152, 151, 109, 105, 138, 151, 152, 151, 151, 152, 151, 154, 155, 154, 104, 103, 140, 157, 158, 157, 157, 158, 157, 157, 158, 157, 78, 148, 42, 86, 151, 85, 79, 154, 78, 70, 157, 164, 52, 148, 45, 36, 167, 35, 35, 151, 33, 167, 167, 167, 167, 151, 167, 167, 151, 167, 167, 154, 167, 167, 167, 167, 167, 157, 167, 167, 157, 167, 167, 157, 34, 34, 34, 34, 34, 37, 37, 37, 37, 37, 41, 41, 41, 41, 41, 48, 48, 48, 48, 48, 73, 73, 80, 167, 167, 80, 80, 87, 87, 87, 87, 87, 94, 94, 94, 94, 94, 114, 114, 167, 114, 114, 142, 142, 142, 142, 142, 145, 145, 145, 145, 145, 147, 147, 147, 147, 147, 150, 150, 150, 150, 150, 153, 153, 153, 153, 153, 156, 156, 156, 156, 156, 165, 165, 165, 165, 165, 5, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167 } ; static yyconst flex_int16_t yy_chk[554] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 10, 11, 14, 10, 15, 172, 17, 165, 18, 23, 23, 38, 15, 14, 17, 18, 18, 19, 26, 22, 43, 19, 25, 25, 31, 10, 19, 26, 20, 15, 20, 20, 27, 38, 11, 37, 11, 20, 37, 21, 20, 21, 21, 22, 22, 27, 20, 40, 21, 31, 40, 26, 26, 91, 27, 43, 44, 21, 20, 48, 37, 51, 59, 61, 61, 100, 100, 48, 65, 51, 101, 101, 40, 73, 93, 59, 77, 65, 27, 27, 32, 164, 73, 87, 48, 62, 51, 62, 62, 32, 91, 93, 44, 59, 62, 63, 63, 89, 77, 63, 63, 65, 65, 62, 59, 87, 73, 73, 32, 32, 32, 32, 32, 32, 32, 64, 64, 74, 74, 89, 90, 64, 64, 76, 76, 76, 76, 76, 74, 64, 64, 64, 78, 78, 88, 92, 96, 88, 78, 78, 97, 111, 90, 98, 99, 99, 78, 78, 78, 96, 156, 99, 74, 74, 153, 102, 102, 114, 113, 88, 99, 102, 102, 111, 92, 112, 116, 96, 121, 102, 102, 102, 117, 122, 114, 105, 105, 150, 96, 97, 98, 105, 105, 106, 106, 106, 106, 106, 115, 105, 105, 105, 107, 107, 107, 107, 107, 108, 108, 113, 117, 112, 116, 108, 108, 115, 121, 122, 124, 123, 130, 108, 108, 108, 118, 118, 119, 119, 118, 118, 120, 120, 119, 119, 125, 125, 120, 120, 126, 126, 119, 119, 119, 129, 120, 120, 120, 123, 127, 127, 130, 131, 132, 136, 127, 127, 147, 145, 124, 128, 128, 142, 127, 127, 127, 128, 128, 134, 134, 134, 144, 133, 133, 128, 128, 128, 137, 133, 133, 135, 135, 135, 94, 129, 132, 133, 133, 133, 131, 136, 138, 138, 138, 139, 139, 139, 140, 140, 140, 141, 141, 141, 148, 148, 148, 85, 159, 144, 149, 149, 149, 80, 75, 134, 151, 151, 151, 152, 152, 152, 154, 154, 154, 72, 68, 135, 155, 155, 155, 157, 157, 157, 158, 158, 158, 66, 138, 41, 35, 139, 33, 29, 140, 28, 24, 141, 159, 16, 148, 13, 9, 5, 4, 3, 149, 2, 0, 0, 0, 0, 151, 0, 0, 152, 0, 0, 154, 0, 0, 0, 0, 0, 155, 0, 0, 157, 0, 0, 158, 168, 168, 168, 168, 168, 169, 169, 169, 169, 169, 170, 170, 170, 170, 170, 171, 171, 171, 171, 171, 173, 173, 174, 0, 0, 174, 174, 175, 175, 175, 175, 175, 176, 176, 176, 176, 176, 177, 177, 0, 177, 177, 178, 178, 178, 178, 178, 179, 179, 179, 179, 179, 180, 180, 180, 180, 180, 181, 181, 181, 181, 181, 182, 182, 182, 182, 182, 183, 183, 183, 183, 183, 184, 184, 184, 184, 184, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167 } ; /* Table of booleans, true if rule could match eol. */ static yyconst flex_int32_t yy_rule_can_match_eol[46] = { 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, }; extern int yy_flex_debug; int yy_flex_debug = 0; static yy_state_type *yy_state_buf=0, *yy_state_ptr=0; static char *yy_full_match; static int yy_lp; static int yy_looking_for_trail_begin = 0; static int yy_full_lp; static int *yy_full_state; #define YY_TRAILING_MASK 0x2000 #define YY_TRAILING_HEAD_MASK 0x4000 #define REJECT \ { \ *yy_cp = (yy_hold_char); /* undo effects of setting up yytext */ \ yy_cp = (yy_full_match); /* restore poss. backed-over text */ \ (yy_lp) = (yy_full_lp); /* restore orig. accepting pos. */ \ (yy_state_ptr) = (yy_full_state); /* restore orig. state */ \ yy_current_state = *(yy_state_ptr); /* restore curr. state */ \ ++(yy_lp); \ goto find_rule; \ } static int yy_more_offset = 0; static int yy_prev_more_offset = 0; #define yymore() ((yy_more_offset) = yy_flex_strlen( yytext )) #define YY_NEED_STRLEN #define YY_MORE_ADJ 0 #define YY_RESTORE_YY_MORE_OFFSET \ { \ (yy_more_offset) = (yy_prev_more_offset); \ yyleng -= (yy_more_offset); \ } #ifndef YYLMAX #define YYLMAX 8192 #endif char yytext[YYLMAX]; char *yytext_ptr; #line 1 "soapcpp2_lex.l" /* soapcpp2_lex.l Flex/Lex tokenizer for C/C++ -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc. All Rights Reserved. This part of the software is released under ONE of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #line 38 "soapcpp2_lex.l" #include "soapcpp2.h" #ifdef HAVE_CONFIG_H #include "soapcpp2_yacc.h" #else #include "soapcpp2_yacc.tab.h" #endif #ifdef WITH_BISON YYSTYPE yylval; #undef YY_NEED_STRLEN #define YY_INPUT(buf, result, max_size) \ { \ int c = getc(yyin); \ result = (c == EOF) ? YY_NULL : (buf[0] = c, 1); \ } #endif #ifndef WITH_LEX #define MAX_IMPORT_DEPTH 16 static struct importlist { struct importlist *next; char name[1]; } *importlist = NULL; static const char *fnstk[MAX_IMPORT_DEPTH]; static int lnstk[MAX_IMPORT_DEPTH]; static const char *imstk[MAX_IMPORT_DEPTH]; static YY_BUFFER_STATE instk[MAX_IMPORT_DEPTH]; #endif int imports = 0; const char *imported = NULL; static void check_id(const char*); static Token install_id(void); static Token install_tag(void); static Token install_int(void); static Token install_hex(void); static Token install_num(void); static Token install_chr(void); static Token install_str(void); static Token install_pragma(void); static void directive(void), option(void), xpath(void); static Token error_chr(void); static Token error_str(void); static int convchar(int*); static int hexchar(int*); static int octchar(int*); static void module(const char *name, const char *fullname); static void import(const char *file); static int magic(const char *name); #define YY_NO_INPUT 1 #line 790 "lex.yy.c" #define INITIAL 0 #define MLCOMMENT 1 #ifndef YY_NO_UNISTD_H /* Special case for "unistd.h", since it is non-ANSI. We include it way * down here because we want the user's section 1 to have been scanned first. * The user has a chance to override it with an option. */ #include #endif #ifndef YY_EXTRA_TYPE #define YY_EXTRA_TYPE void * #endif static int yy_init_globals (void ); /* Accessor methods to globals. These are made visible to non-reentrant scanners for convenience. */ int yylex_destroy (void ); int yyget_debug (void ); void yyset_debug (int debug_flag ); YY_EXTRA_TYPE yyget_extra (void ); void yyset_extra (YY_EXTRA_TYPE user_defined ); FILE *yyget_in (void ); void yyset_in (FILE * in_str ); FILE *yyget_out (void ); void yyset_out (FILE * out_str ); yy_size_t yyget_leng (void ); char *yyget_text (void ); int yyget_lineno (void ); void yyset_lineno (int line_number ); /* Macros after this point can all be overridden by user definitions in * section 1. */ #ifndef YY_SKIP_YYWRAP #ifdef __cplusplus extern "C" int yywrap (void ); #else extern int yywrap (void ); #endif #endif #ifndef yytext_ptr static void yy_flex_strncpy (char *,yyconst char *,int ); #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (yyconst char * ); #endif #ifndef YY_NO_INPUT #ifdef __cplusplus static int yyinput (void ); #else static int input (void ); #endif #endif /* Amount of stuff to slurp up with each read. */ #ifndef YY_READ_BUF_SIZE #define YY_READ_BUF_SIZE 8192 #endif /* Copy whatever the last rule matched to the standard output. */ #ifndef ECHO /* This used to be an fputs(), but since the string might contain NUL's, * we now use fwrite(). */ #define ECHO fwrite( yytext, yyleng, 1, yyout ) #endif /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, * is returned in "result". */ #ifndef YY_INPUT #define YY_INPUT(buf,result,max_size) \ if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ { \ int c = '*'; \ yy_size_t n; \ for ( n = 0; n < max_size && \ (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ buf[n] = (char) c; \ if ( c == '\n' ) \ buf[n++] = (char) c; \ if ( c == EOF && ferror( yyin ) ) \ YY_FATAL_ERROR( "input in flex scanner failed" ); \ result = n; \ } \ else \ { \ errno=0; \ while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \ { \ if( errno != EINTR) \ { \ YY_FATAL_ERROR( "input in flex scanner failed" ); \ break; \ } \ errno=0; \ clearerr(yyin); \ } \ }\ \ #endif /* No semi-colon after return; correct usage is to write "yyterminate();" - * we don't want an extra ';' after the "return" because that will cause * some compilers to complain about unreachable statements. */ #ifndef yyterminate #define yyterminate() return YY_NULL #endif /* Number of entries by which start-condition stack grows. */ #ifndef YY_START_STACK_INCR #define YY_START_STACK_INCR 25 #endif /* Report a fatal error. */ #ifndef YY_FATAL_ERROR #define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) #endif /* end tables serialization structures and prototypes */ /* Default declaration of generated scanner - a define so the user can * easily add parameters. */ #ifndef YY_DECL #define YY_DECL_IS_OURS 1 extern int yylex (void); #define YY_DECL int yylex (void) #endif /* !YY_DECL */ /* Code executed at the beginning of each rule, after yytext and yyleng * have been set up. */ #ifndef YY_USER_ACTION #define YY_USER_ACTION #endif /* Code executed at the end of each rule. */ #ifndef YY_BREAK #define YY_BREAK break; #endif #define YY_RULE_SETUP \ if ( yyleng > 0 ) \ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = \ (yytext[yyleng - 1] == '\n'); \ YY_USER_ACTION /** The main scanner function which does all the work. */ YY_DECL { register yy_state_type yy_current_state; register char *yy_cp, *yy_bp; register int yy_act; #line 104 "soapcpp2_lex.l" #line 976 "lex.yy.c" if ( !(yy_init) ) { (yy_init) = 1; #ifdef YY_USER_INIT YY_USER_INIT; #endif /* Create the reject buffer large enough to save one state per allowed character. */ if ( ! (yy_state_buf) ) (yy_state_buf) = (yy_state_type *)yyalloc(YY_STATE_BUF_SIZE ); if ( ! (yy_state_buf) ) YY_FATAL_ERROR( "out of dynamic memory in yylex()" ); if ( ! (yy_start) ) (yy_start) = 1; /* first start state */ if ( ! yyin ) yyin = stdin; if ( ! yyout ) yyout = stdout; if ( ! YY_CURRENT_BUFFER ) { yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer(yyin,YY_BUF_SIZE ); } yy_load_buffer_state( ); } while ( 1 ) /* loops until end-of-file is reached */ { yy_cp = (yy_c_buf_p); /* Support of yytext. */ *yy_cp = (yy_hold_char); /* yy_bp points to the position in yy_ch_buf of the start of * the current run. */ yy_bp = yy_cp; yy_current_state = (yy_start); yy_current_state += YY_AT_BOL(); (yy_state_ptr) = (yy_state_buf); *(yy_state_ptr)++ = yy_current_state; yy_match: do { register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 168 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; *(yy_state_ptr)++ = yy_current_state; ++yy_cp; } while ( yy_base[yy_current_state] != 500 ); yy_find_action: yy_current_state = *--(yy_state_ptr); (yy_lp) = yy_accept[yy_current_state]; goto find_rule; /* Shut up GCC warning -Wall */ find_rule: /* we branch to this label when backing up */ for ( ; ; ) /* until we find what rule we matched */ { if ( (yy_lp) && (yy_lp) < yy_accept[yy_current_state + 1] ) { yy_act = yy_acclist[(yy_lp)]; if ( yy_act & YY_TRAILING_HEAD_MASK || (yy_looking_for_trail_begin) ) { if ( yy_act == (yy_looking_for_trail_begin) ) { (yy_looking_for_trail_begin) = 0; yy_act &= ~YY_TRAILING_HEAD_MASK; break; } } else if ( yy_act & YY_TRAILING_MASK ) { (yy_looking_for_trail_begin) = yy_act & ~YY_TRAILING_MASK; (yy_looking_for_trail_begin) |= YY_TRAILING_HEAD_MASK; (yy_full_match) = yy_cp; (yy_full_state) = (yy_state_ptr); (yy_full_lp) = (yy_lp); } else { (yy_full_match) = yy_cp; (yy_full_state) = (yy_state_ptr); (yy_full_lp) = (yy_lp); break; } ++(yy_lp); goto find_rule; } --yy_cp; yy_current_state = *--(yy_state_ptr); (yy_lp) = yy_accept[yy_current_state]; } YY_DO_BEFORE_ACTION; if ( yy_act != YY_END_OF_BUFFER && yy_rule_can_match_eol[yy_act] ) { yy_size_t yyl; for ( yyl = (yy_prev_more_offset); yyl < yyleng; ++yyl ) if ( yytext[yyl] == '\n' ) yylineno++; ; } do_action: /* This label is used only to access EOF actions. */ switch ( yy_act ) { /* beginning of action switch */ case 1: YY_RULE_SETUP #line 105 "soapcpp2_lex.l" { /* skip UTF8 BOM */ } YY_BREAK case 2: /* rule 2 can match eol */ YY_RULE_SETUP #line 106 "soapcpp2_lex.l" { /* skip white space */ } YY_BREAK case 3: YY_RULE_SETUP #line 107 "soapcpp2_lex.l" { BEGIN(MLCOMMENT); } YY_BREAK case 4: /* rule 4 can match eol */ YY_RULE_SETUP #line 108 "soapcpp2_lex.l" { } YY_BREAK case 5: YY_RULE_SETUP #line 109 "soapcpp2_lex.l" { BEGIN(INITIAL); } YY_BREAK case YY_STATE_EOF(MLCOMMENT): #line 110 "soapcpp2_lex.l" { execerror("Unclosed multiline comment at the end of file"); } YY_BREAK case 6: /* rule 6 can match eol */ YY_RULE_SETUP #line 111 "soapcpp2_lex.l" { option(); } YY_BREAK case 7: /* rule 7 can match eol */ YY_RULE_SETUP #line 112 "soapcpp2_lex.l" { directive(); } YY_BREAK case 8: /* rule 8 can match eol */ YY_RULE_SETUP #line 113 "soapcpp2_lex.l" { xpath(); } YY_BREAK case 9: /* rule 9 can match eol */ YY_RULE_SETUP #line 114 "soapcpp2_lex.l" { /* skip single line comment */ } YY_BREAK case 10: YY_RULE_SETUP #line 115 "soapcpp2_lex.l" { return PA; } YY_BREAK case 11: YY_RULE_SETUP #line 116 "soapcpp2_lex.l" { return NA; } YY_BREAK case 12: YY_RULE_SETUP #line 117 "soapcpp2_lex.l" { return TA; } YY_BREAK case 13: YY_RULE_SETUP #line 118 "soapcpp2_lex.l" { return DA; } YY_BREAK case 14: YY_RULE_SETUP #line 119 "soapcpp2_lex.l" { return MA; } YY_BREAK case 15: YY_RULE_SETUP #line 120 "soapcpp2_lex.l" { return AA; } YY_BREAK case 16: YY_RULE_SETUP #line 121 "soapcpp2_lex.l" { return XA; } YY_BREAK case 17: YY_RULE_SETUP #line 122 "soapcpp2_lex.l" { return OA; } YY_BREAK case 18: YY_RULE_SETUP #line 123 "soapcpp2_lex.l" { return LA; } YY_BREAK case 19: YY_RULE_SETUP #line 124 "soapcpp2_lex.l" { return RA; } YY_BREAK case 20: YY_RULE_SETUP #line 125 "soapcpp2_lex.l" { return OR; } YY_BREAK case 21: YY_RULE_SETUP #line 126 "soapcpp2_lex.l" { return AN; } YY_BREAK case 22: YY_RULE_SETUP #line 127 "soapcpp2_lex.l" { return EQ; } YY_BREAK case 23: YY_RULE_SETUP #line 128 "soapcpp2_lex.l" { return NE; } YY_BREAK case 24: YY_RULE_SETUP #line 129 "soapcpp2_lex.l" { return LE; } YY_BREAK case 25: YY_RULE_SETUP #line 130 "soapcpp2_lex.l" { return GE; } YY_BREAK case 26: YY_RULE_SETUP #line 131 "soapcpp2_lex.l" { return LS; } YY_BREAK case 27: YY_RULE_SETUP #line 132 "soapcpp2_lex.l" { return RS; } YY_BREAK case 28: YY_RULE_SETUP #line 133 "soapcpp2_lex.l" { return PP; } YY_BREAK case 29: YY_RULE_SETUP #line 134 "soapcpp2_lex.l" { return NN; } YY_BREAK case 30: YY_RULE_SETUP #line 135 "soapcpp2_lex.l" { return AR; } YY_BREAK case 31: YY_RULE_SETUP #line 136 "soapcpp2_lex.l" { return yytext[0]; } YY_BREAK case 32: YY_RULE_SETUP #line 137 "soapcpp2_lex.l" { return install_id(); } YY_BREAK case 33: YY_RULE_SETUP #line 138 "soapcpp2_lex.l" { return install_tag(); } YY_BREAK case 34: YY_RULE_SETUP #line 139 "soapcpp2_lex.l" { return install_int(); } YY_BREAK case 35: YY_RULE_SETUP #line 140 "soapcpp2_lex.l" { return install_hex(); } YY_BREAK case 36: YY_RULE_SETUP #line 141 "soapcpp2_lex.l" { return install_num(); } YY_BREAK case 37: YY_RULE_SETUP #line 142 "soapcpp2_lex.l" { return install_chr(); } YY_BREAK case 38: /* rule 38 can match eol */ YY_RULE_SETUP #line 143 "soapcpp2_lex.l" { return install_str(); } YY_BREAK case 39: /* rule 39 can match eol */ YY_RULE_SETUP #line 144 "soapcpp2_lex.l" { char *s, *t, buf[1024]; s = strchr(yytext, '"'); if (!s) t = yytext+7; else { strcpy(buf, s+1); s = strchr(buf, '"'); *s = '\0'; t = strchr(s+1, '"'); if (t) { t++; s = strchr(t+1, '"'); if (s) *s = '\0'; } } module(buf, t); } YY_BREAK case 40: /* rule 40 can match eol */ YY_RULE_SETUP #line 162 "soapcpp2_lex.l" { char *s, buf[1024]; s = strchr(yytext, '"'); if (s) { strncpy(buf, s + 1, sizeof(buf)); buf[sizeof(buf) - 1] = '\0'; s = strchr(buf, '"'); if (!s) lexerror("Invalid import directive: missing ending \" or path too long"); else { *s = '\0'; import(buf); } } else lexerror("Invalid import directive: \" expected"); } YY_BREAK case 41: /* rule 41 can match eol */ YY_RULE_SETUP #line 178 "soapcpp2_lex.l" { return install_pragma(); } YY_BREAK case 42: /* rule 42 can match eol */ YY_RULE_SETUP #line 179 "soapcpp2_lex.l" { return error_chr(); } YY_BREAK case 43: /* rule 43 can match eol */ YY_RULE_SETUP #line 180 "soapcpp2_lex.l" { return error_str(); } YY_BREAK case 44: YY_RULE_SETUP #line 181 "soapcpp2_lex.l" { lexerror("Skipping unknown symbol"); } YY_BREAK case YY_STATE_EOF(INITIAL): #line 182 "soapcpp2_lex.l" { /* when Lex complains: remove this line and below */ #ifndef WITH_LEX if (--imports < 0) { yyterminate(); } else { if (vflag) fprintf(stderr, "End of %s\n\n", filename); yy_delete_buffer(YY_CURRENT_BUFFER); yy_switch_to_buffer(instk[imports]); filename = fnstk[imports]; yylineno = lnstk[imports]; imported = imstk[imports]; } #endif } YY_BREAK case 45: YY_RULE_SETUP #line 199 "soapcpp2_lex.l" ECHO; YY_BREAK #line 1396 "lex.yy.c" case YY_END_OF_BUFFER: { /* Amount of text matched not including the EOB char. */ int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; /* Undo the effects of YY_DO_BEFORE_ACTION. */ *yy_cp = (yy_hold_char); YY_RESTORE_YY_MORE_OFFSET if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) { /* We're scanning a new file or input source. It's * possible that this happened because the user * just pointed yyin at a new source and called * yylex(). If so, then we have to assure * consistency between YY_CURRENT_BUFFER and our * globals. Here is the right place to do so, because * this is the first action (other than possibly a * back-up) that will match for the new input source. */ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; } /* Note that here we test for yy_c_buf_p "<=" to the position * of the first EOB in the buffer, since yy_c_buf_p will * already have been incremented past the NUL character * (since all states make transitions on EOB to the * end-of-buffer state). Contrast this with the test * in input(). */ if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) { /* This was really a NUL. */ yy_state_type yy_next_state; (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); /* Okay, we're now positioned to make the NUL * transition. We couldn't have * yy_get_previous_state() go ahead and do it * for us because it doesn't know how to deal * with the possibility of jamming (and we don't * want to build jamming into it because then it * will run more slowly). */ yy_next_state = yy_try_NUL_trans( yy_current_state ); yy_bp = (yytext_ptr) + YY_MORE_ADJ; if ( yy_next_state ) { /* Consume the NUL. */ yy_cp = ++(yy_c_buf_p); yy_current_state = yy_next_state; goto yy_match; } else { yy_cp = (yy_c_buf_p); goto yy_find_action; } } else switch ( yy_get_next_buffer( ) ) { case EOB_ACT_END_OF_FILE: { (yy_did_buffer_switch_on_eof) = 0; if ( yywrap( ) ) { /* Note: because we've taken care in * yy_get_next_buffer() to have set up * yytext, we can now set up * yy_c_buf_p so that if some total * hoser (like flex itself) wants to * call the scanner after we return the * YY_NULL, it'll still work - another * YY_NULL will get returned. */ (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; yy_act = YY_STATE_EOF(YY_START); goto do_action; } else { if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; } break; } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_match; case EOB_ACT_LAST_MATCH: (yy_c_buf_p) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_find_action; } break; } default: YY_FATAL_ERROR( "fatal flex scanner internal error--no action found" ); } /* end of action switch */ } /* end of scanning one token */ } /* end of yylex */ /* yy_get_next_buffer - try to read in a new buffer * * Returns a code representing an action: * EOB_ACT_LAST_MATCH - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position * EOB_ACT_END_OF_FILE - end of file */ static int yy_get_next_buffer (void) { register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; register char *source = (yytext_ptr); register int number_to_move, i; int ret_val; if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) YY_FATAL_ERROR( "fatal flex scanner internal error--end of buffer missed" ); if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) { /* Don't try to fill the buffer, so this is an EOF. */ if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) { /* We matched a single character, the EOB, so * treat this as a final EOF. */ return EOB_ACT_END_OF_FILE; } else { /* We matched some text prior to the EOB, first * process it. */ return EOB_ACT_LAST_MATCH; } } /* Try to read more data. */ /* First move last chars to start of buffer. */ number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; for ( i = 0; i < number_to_move; ++i ) *(dest++) = *(source++); if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) /* don't do the read, it's not guaranteed to return an EOF, * just force an EOF */ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; else { yy_size_t num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; while ( num_to_read <= 0 ) { /* Not enough room in the buffer - grow it. */ YY_FATAL_ERROR( "input buffer overflow, can't enlarge buffer because scanner uses REJECT" ); } if ( num_to_read > YY_READ_BUF_SIZE ) num_to_read = YY_READ_BUF_SIZE; /* Read in more data. */ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), (yy_n_chars), num_to_read ); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } if ( (yy_n_chars) == 0 ) { if ( number_to_move == YY_MORE_ADJ ) { ret_val = EOB_ACT_END_OF_FILE; yyrestart(yyin ); } else { ret_val = EOB_ACT_LAST_MATCH; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_EOF_PENDING; } } else ret_val = EOB_ACT_CONTINUE_SCAN; if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { /* Extend the array by 50%, plus the number we really need. */ yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ); if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); } (yy_n_chars) += number_to_move; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; return ret_val; } /* yy_get_previous_state - get the state just before the EOB char was reached */ static yy_state_type yy_get_previous_state (void) { register yy_state_type yy_current_state; register char *yy_cp; yy_current_state = (yy_start); yy_current_state += YY_AT_BOL(); (yy_state_ptr) = (yy_state_buf); *(yy_state_ptr)++ = yy_current_state; for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) { register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 168 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; *(yy_state_ptr)++ = yy_current_state; } return yy_current_state; } /* yy_try_NUL_trans - try to make a transition on the NUL character * * synopsis * next_state = yy_try_NUL_trans( current_state ); */ static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state ) { register int yy_is_jam; register YY_CHAR yy_c = 1; while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 168 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; yy_is_jam = (yy_current_state == 167); if ( ! yy_is_jam ) *(yy_state_ptr)++ = yy_current_state; return yy_is_jam ? 0 : yy_current_state; } #ifndef YY_NO_INPUT #ifdef __cplusplus static int yyinput (void) #else static int input (void) #endif { int c; *(yy_c_buf_p) = (yy_hold_char); if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) { /* yy_c_buf_p now points to the character we want to return. * If this occurs *before* the EOB characters, then it's a * valid NUL; if not, then we've hit the end of the buffer. */ if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) /* This was really a NUL. */ *(yy_c_buf_p) = '\0'; else { /* need more input */ yy_size_t offset = (yy_c_buf_p) - (yytext_ptr); ++(yy_c_buf_p); switch ( yy_get_next_buffer( ) ) { case EOB_ACT_LAST_MATCH: /* This happens because yy_g_n_b() * sees that we've accumulated a * token and flags that we need to * try matching the token before * proceeding. But for input(), * there's no matching to consider. * So convert the EOB_ACT_LAST_MATCH * to EOB_ACT_END_OF_FILE. */ /* Reset buffer status. */ yyrestart(yyin ); /*FALLTHROUGH*/ case EOB_ACT_END_OF_FILE: { if ( yywrap( ) ) return 0; if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; #ifdef __cplusplus return yyinput(); #else return input(); #endif } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + offset; break; } } } c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ *(yy_c_buf_p) = '\0'; /* preserve yytext */ (yy_hold_char) = *++(yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_at_bol = (c == '\n'); if ( YY_CURRENT_BUFFER_LVALUE->yy_at_bol ) yylineno++; ; return c; } #endif /* ifndef YY_NO_INPUT */ /** Immediately switch to a different input stream. * @param input_file A readable stream. * * @note This function does not reset the start condition to @c INITIAL . */ void yyrestart (FILE * input_file ) { if ( ! YY_CURRENT_BUFFER ){ yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer(yyin,YY_BUF_SIZE ); } yy_init_buffer(YY_CURRENT_BUFFER,input_file ); yy_load_buffer_state( ); } /** Switch to a different input buffer. * @param new_buffer The new input buffer. * */ void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ) { /* TODO. We should be able to replace this entire function body * with * yypop_buffer_state(); * yypush_buffer_state(new_buffer); */ yyensure_buffer_stack (); if ( YY_CURRENT_BUFFER == new_buffer ) return; if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } YY_CURRENT_BUFFER_LVALUE = new_buffer; yy_load_buffer_state( ); /* We don't actually know whether we did this switch during * EOF (yywrap()) processing, but the only time this flag * is looked at is after yywrap() is called, so it's safe * to go ahead and always set it. */ (yy_did_buffer_switch_on_eof) = 1; } static void yy_load_buffer_state (void) { (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; (yy_hold_char) = *(yy_c_buf_p); } /** Allocate and initialize an input buffer state. * @param file A readable stream. * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. * * @return the allocated buffer state. */ YY_BUFFER_STATE yy_create_buffer (FILE * file, int size ) { YY_BUFFER_STATE b; b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_buf_size = size; /* yy_ch_buf has to be 2 characters longer than the size given because * we need to put in 2 end-of-buffer characters. */ b->yy_ch_buf = (char *) yyalloc(b->yy_buf_size + 2 ); if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_is_our_buffer = 1; yy_init_buffer(b,file ); return b; } /** Destroy the buffer. * @param b a buffer created with yy_create_buffer() * */ void yy_delete_buffer (YY_BUFFER_STATE b ) { if ( ! b ) return; if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; if ( b->yy_is_our_buffer ) yyfree((void *) b->yy_ch_buf ); yyfree((void *) b ); } #ifndef __cplusplus extern int isatty (int ); #endif /* __cplusplus */ /* Initializes or reinitializes a buffer. * This function is sometimes called more than once on the same buffer, * such as during a yyrestart() or at EOF. */ static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file ) { int oerrno = errno; yy_flush_buffer(b ); b->yy_input_file = file; b->yy_fill_buffer = 1; /* If b is the current buffer, then yy_init_buffer was _probably_ * called from yyrestart() or through yy_get_next_buffer. * In that case, we don't want to reset the lineno or column. */ if (b != YY_CURRENT_BUFFER){ b->yy_bs_lineno = 1; b->yy_bs_column = 0; } b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; errno = oerrno; } /** Discard all buffered characters. On the next scan, YY_INPUT will be called. * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. * */ void yy_flush_buffer (YY_BUFFER_STATE b ) { if ( ! b ) return; b->yy_n_chars = 0; /* We always need two end-of-buffer characters. The first causes * a transition to the end-of-buffer state. The second causes * a jam in that state. */ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; b->yy_buf_pos = &b->yy_ch_buf[0]; b->yy_at_bol = 1; b->yy_buffer_status = YY_BUFFER_NEW; if ( b == YY_CURRENT_BUFFER ) yy_load_buffer_state( ); } /** Pushes the new state onto the stack. The new state becomes * the current state. This function will allocate the stack * if necessary. * @param new_buffer The new state. * */ void yypush_buffer_state (YY_BUFFER_STATE new_buffer ) { if (new_buffer == NULL) return; yyensure_buffer_stack(); /* This block is copied from yy_switch_to_buffer. */ if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } /* Only push if top exists. Otherwise, replace top. */ if (YY_CURRENT_BUFFER) (yy_buffer_stack_top)++; YY_CURRENT_BUFFER_LVALUE = new_buffer; /* copied from yy_switch_to_buffer. */ yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } /** Removes and deletes the top of the stack, if present. * The next element becomes the new top. * */ void yypop_buffer_state (void) { if (!YY_CURRENT_BUFFER) return; yy_delete_buffer(YY_CURRENT_BUFFER ); YY_CURRENT_BUFFER_LVALUE = NULL; if ((yy_buffer_stack_top) > 0) --(yy_buffer_stack_top); if (YY_CURRENT_BUFFER) { yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } } /* Allocates the stack if it does not exist. * Guarantees space for at least one push. */ static void yyensure_buffer_stack (void) { yy_size_t num_to_alloc; if (!(yy_buffer_stack)) { /* First allocation is just for 2 elements, since we don't know if this * scanner will even need a stack. We use 2 instead of 1 to avoid an * immediate realloc on the next call. */ num_to_alloc = 1; (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc (num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; (yy_buffer_stack_top) = 0; return; } if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ /* Increase the buffer to prepare for a possible push. */ int grow_size = 8 /* arbitrary grow size */; num_to_alloc = (yy_buffer_stack_max) + grow_size; (yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc ((yy_buffer_stack), num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); /* zero only the new slots.*/ memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; } } /** Setup the input buffer state to scan directly from a user-specified character buffer. * @param base the character buffer * @param size the size in bytes of the character buffer * * @return the newly allocated buffer state object. */ YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size ) { YY_BUFFER_STATE b; if ( size < 2 || base[size-2] != YY_END_OF_BUFFER_CHAR || base[size-1] != YY_END_OF_BUFFER_CHAR ) /* They forgot to leave room for the EOB's. */ return 0; b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ b->yy_buf_pos = b->yy_ch_buf = base; b->yy_is_our_buffer = 0; b->yy_input_file = 0; b->yy_n_chars = b->yy_buf_size; b->yy_is_interactive = 0; b->yy_at_bol = 1; b->yy_fill_buffer = 0; b->yy_buffer_status = YY_BUFFER_NEW; yy_switch_to_buffer(b ); return b; } /** Setup the input buffer state to scan a string. The next call to yylex() will * scan from a @e copy of @a str. * @param yystr a NUL-terminated string to scan * * @return the newly allocated buffer state object. * @note If you want to scan bytes that may contain NUL values, then use * yy_scan_bytes() instead. */ YY_BUFFER_STATE yy_scan_string (yyconst char * yystr ) { return yy_scan_bytes(yystr,strlen(yystr) ); } /** Setup the input buffer state to scan the given bytes. The next call to yylex() will * scan from a @e copy of @a bytes. * @param bytes the byte buffer to scan * @param len the number of bytes in the buffer pointed to by @a bytes. * * @return the newly allocated buffer state object. */ YY_BUFFER_STATE yy_scan_bytes (yyconst char * yybytes, yy_size_t _yybytes_len ) { YY_BUFFER_STATE b; char *buf; yy_size_t n, i; /* Get memory for full buffer, including space for trailing EOB's. */ n = _yybytes_len + 2; buf = (char *) yyalloc(n ); if ( ! buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); for ( i = 0; i < _yybytes_len; ++i ) buf[i] = yybytes[i]; buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; b = yy_scan_buffer(buf,n ); if ( ! b ) YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); /* It's okay to grow etc. this buffer, and we should throw it * away when we're done. */ b->yy_is_our_buffer = 1; return b; } #ifndef YY_EXIT_FAILURE #define YY_EXIT_FAILURE 2 #endif static void yy_fatal_error (yyconst char* msg ) { (void) fprintf( stderr, "%s\n", msg ); exit( YY_EXIT_FAILURE ); } /* Redefine yyless() so it works in section 3 code. */ #undef yyless #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ yytext[yyleng] = (yy_hold_char); \ (yy_c_buf_p) = yytext + yyless_macro_arg; \ (yy_hold_char) = *(yy_c_buf_p); \ *(yy_c_buf_p) = '\0'; \ yyleng = yyless_macro_arg; \ } \ while ( 0 ) /* Accessor methods (get/set functions) to struct members. */ /** Get the current line number. * */ int yyget_lineno (void) { return yylineno; } /** Get the input stream. * */ FILE *yyget_in (void) { return yyin; } /** Get the output stream. * */ FILE *yyget_out (void) { return yyout; } /** Get the length of the current token. * */ yy_size_t yyget_leng (void) { return yyleng; } /** Get the current token. * */ char *yyget_text (void) { return yytext; } /** Set the current line number. * @param line_number * */ void yyset_lineno (int line_number ) { yylineno = line_number; } /** Set the input stream. This does not discard the current * input buffer. * @param in_str A readable stream. * * @see yy_switch_to_buffer */ void yyset_in (FILE * in_str ) { yyin = in_str ; } void yyset_out (FILE * out_str ) { yyout = out_str ; } int yyget_debug (void) { return yy_flex_debug; } void yyset_debug (int bdebug ) { yy_flex_debug = bdebug ; } static int yy_init_globals (void) { /* Initialization is the same as for the non-reentrant scanner. * This function is called from yylex_destroy(), so don't allocate here. */ /* We do not touch yylineno unless the option is enabled. */ yylineno = 1; (yy_buffer_stack) = 0; (yy_buffer_stack_top) = 0; (yy_buffer_stack_max) = 0; (yy_c_buf_p) = (char *) 0; (yy_init) = 0; (yy_start) = 0; (yy_state_buf) = 0; (yy_state_ptr) = 0; (yy_full_match) = 0; (yy_lp) = 0; /* Defined in main.c */ #ifdef YY_STDINIT yyin = stdin; yyout = stdout; #else yyin = (FILE *) 0; yyout = (FILE *) 0; #endif /* For future reference: Set errno on error, since we are called by * yylex_init() */ return 0; } /* yylex_destroy is for both reentrant and non-reentrant scanners. */ int yylex_destroy (void) { /* Pop the buffer stack, destroying each element. */ while(YY_CURRENT_BUFFER){ yy_delete_buffer(YY_CURRENT_BUFFER ); YY_CURRENT_BUFFER_LVALUE = NULL; yypop_buffer_state(); } /* Destroy the stack itself. */ yyfree((yy_buffer_stack) ); (yy_buffer_stack) = NULL; yyfree ( (yy_state_buf) ); (yy_state_buf) = NULL; /* Reset the globals. This is important in a non-reentrant scanner so the next time * yylex() is called, initialization will occur. */ yy_init_globals( ); return 0; } /* * Internal utility routines. */ #ifndef yytext_ptr static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) { register int i; for ( i = 0; i < n; ++i ) s1[i] = s2[i]; } #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (yyconst char * s ) { register int n; for ( n = 0; s[n]; ++n ) ; return n; } #endif void *yyalloc (yy_size_t size ) { return (void *) malloc( size ); } void *yyrealloc (void * ptr, yy_size_t size ) { /* The cast to (char *) in the following accommodates both * implementations that use char* generic pointers, and those * that use void* generic pointers. It works with the latter * because both ANSI C and C++ allow castless assignment from * any pointer type to void*, and deal with argument conversions * as though doing an assignment. */ return (void *) realloc( (char *) ptr, size ); } void yyfree (void * ptr ) { free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ } #define YYTABLES_NAME "yytables" #line 199 "soapcpp2_lex.l" /* install_id - lookup identifier in symbol table. If found, return token and symbol table entry. If not found, create entry in symbol table and return ID token. */ static Token install_id() { Symbol *p = lookup(yytext); if (!p) { int i, flag = 0; p = install(yytext, ID); /* [_](x|X)(m|M)(l|L)__ is OK */ /* [_](x|X)(m|M)(l|L).* is not OK */ /* .*__(x|X)(m|M)(l|L) is not OK */ /* .*::(x|X)(m|M)(l|L) is not OK */ for (i = 0; i < (int)yyleng; i++) { if ((yytext[i] == '_' && yytext[i+1] == '_') || (yytext[i] == ':' && yytext[i+1] == ':')) { flag = 1; check_id(yytext + i + 2); } } if (!flag && strcmp(yytext, "XML")) check_id(yytext); } yylval.sym = p; return p->token; } /* install_tag - return TAG token. */ static Token install_tag() { yylval.s = (char*)emalloc(yyleng-1); /* yyleng = length(yytext) */ strcpy(yylval.s, yytext+1); yylval.s[yyleng-2] = '\0'; return TAG; } /* check_id - check for (x|X)(m|M)(l|L) */ static void check_id(const char *s) { while (*s == '_') s++; if ((s[0] == 'x' || s[0] == 'X') && (s[1] == 'm' || s[1] == 'M') && (s[2] == 'l' || s[2] == 'L')) { sprintf(errbuf, "identifier '%s' starts with or embeds '%3.3s' character sequence, which is exclusively reserved for and by the W3C XML standards (for enum constants: please ignore this warning)", yytext, s); semwarn(errbuf); } } /* install_int - convert digits to integer and return LNG token. */ static Token install_int(void) { sscanf(yytext, SOAP_ULONG_FORMAT, &yylval.i); return LNG; } /* install_hex - convert hexadecimal digits to integer and return LNG */ static Token install_hex(void) { sscanf(yytext, SOAP_XLONG_FORMAT, &yylval.i); return LNG; } /* install_num - convert digits to floating point number and return DBL */ static Token install_num(void) { sscanf(yytext, "%lf", &yylval.r); return DBL; } /* install_chr - convert character constant and return CHR. */ static Token install_chr(void) { int i = 2; if (yytext[1] == '\\') yylval.c = convchar(&i); else yylval.c = yytext[i-1]; if (yytext[i] != '\'') lexerror("Illegal character constant"); return CHR; } /* install_str - convert and store string in memory. Return STR. */ static Token install_str(void) { int i, j = 0; yylval.s = (char*)emalloc(yyleng - 1); /* yyleng = length(yytext) */ for (i = 1 + (yytext[0] == 'L'); i < (int)yyleng - 1; i++) if (yytext[i] == '\\') { if (yytext[++i] != '\n') { yylval.s[j++] = convchar(&i); i--; } } else yylval.s[j++] = yytext[i]; yylval.s[j] = '\0'; return STR; } /* install_pragma - store pragma in string. Return PRAGMA. */ static Token install_pragma(void) { yylval.s = (char*)emalloc(yyleng); /* yyleng = length(yytext) */ strncpy(yylval.s, yytext, strlen(yytext)-1); yylval.s[strlen(yytext)-1] = '\0'; return PRAGMA; } static void directive(void) { int i, j, k; char *s; Service *sp; Method *m; Data *d; int service; for (i = 0; yytext[i]; i++) if (yytext[i] <= 32) break; for (; yytext[i]; i++) if (yytext[i] > 32) break; for (j = i; yytext[j]; j++) if (yytext[j] <= 32) break; if (i == j) return; s = (char*)emalloc(j-i+1); for (k = 0; k < j-i; k++) { s[k] = yytext[k+i]; if (s[k] == '_') s[k] = '-'; } s[k] = '\0'; for (sp = services; sp; sp = sp->next) if (!strcmp(sp->ns, s)) break; if (!sp) { sp = (Service*)emalloc(sizeof(Service)); sp->next = services; sp->ns = s; sp->name = NULL; sp->porttype = NULL; sp->portname = NULL; sp->binding = NULL; sp->definitions = NULL; sp->transport = NULL; sp->URL = NULL; sp->URI = NULL; sp->URI2 = NULL; sp->WSDL = NULL; sp->style = NULL; sp->encoding = NULL; sp->protocol = NULL; sp->xsi_type = 0; sp->elementForm = NULL; sp->attributeForm = NULL; sp->executable = NULL; sp->import = NULL; sp->documentation = NULL; sp->list = NULL; sp->data = NULL; services = sp; } for (i = j; yytext[i]; i++) if (yytext[i] > 32) break; if (!strncmp(yytext+i, "service", 7) || !strncmp(yytext+i, "schema", 6)) { service = strncmp(yytext+i, "schema", 6); for (i += 7; yytext[i]; i++) if (yytext[i] > 32) break; for (j = i; yytext[j]; j++) if (yytext[j] <= 32) break; for (; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] <= 32) break; /* if (j == k) return; */ s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; if (!strncmp(yytext+i, "name:", 5)) { sp->name = s; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; sp->documentation = s; } else if (!strncmp(yytext+i, "type:", 5) || !strncmp(yytext+i, "portType:", 9) || !strncmp(yytext+i, "interface:", 10)) sp->porttype = s; else if (!strncmp(yytext+i, "portName:", 9)) sp->portname = s; else if (!strncmp(yytext+i, "binding:", 8)) sp->binding = s; else if (!strncmp(yytext+i, "definitions:", 12)) sp->definitions = s; else if (!strncmp(yytext+i, "documentation:", 14)) { for (k = j; yytext[k]; k++) if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; sp->documentation = s; } else if (!strncmp(yytext+i, "transport:", 10)) sp->transport = s; else if (!strncmp(yytext+i, "location:", 9) || !strncmp(yytext+i, "endpoint:", 9) || !strncmp(yytext+i, "port:", 5)) { if (sp->URL) { char *t = (char*)emalloc(strlen(sp->URL) + strlen(s) + 2); strcpy(t, sp->URL); strcat(t, " "); strcat(t, s); sp->URL = t; } else sp->URL = s; if (!service && !sp->import) sp->import = s; } else if (!strncmp(yytext+i, "executable:", 11)) sp->executable = s; else if (!strncmp(yytext+i, "namespace:", 10)) { if (service) { if (!sp->URI) sp->URI = s; sp->WSDL = s; } else if (!strcmp(sp->ns, "SOAP-ENV")) { if (soap_version > 0) semwarn("option -1 or -2 overrides SOAP-ENV namespace"); else envURI = s; sp->URI = (char*)envURI; } else if (!strcmp(sp->ns, "SOAP-ENC")) { if (soap_version > 0) semwarn("option -1 or -2 overrides SOAP-ENC namespace"); else encURI = s; sp->URI = (char*)encURI; } else sp->URI = s; } else if (!strncmp(yytext+i, "namespace2:", 11)) { sp->URI2 = s; } else if (!strncmp(yytext+i, "typed:", 6)) { sp->xsi_type = (*s == 'y'); } else if (!strncmp(yytext+i, "form:", 5)) { sp->elementForm = s; sp->attributeForm = s; } else if (!strncmp(yytext+i, "elementForm:", 12)) sp->elementForm = s; else if (!strncmp(yytext+i, "attributeForm:", 14)) sp->attributeForm = s; else if (!strncmp(yytext+i, "import:", 7)) { if (!sp->URI) sp->URI = s; sp->import = s; } else if (!strncmp(yytext+i, "encoding:", 9)) { if (!strcmp(s, "encoded")) sp->encoding = ""; else sp->encoding = s; } else if (!strncmp(yytext+i, "style:", 6)) sp->style = s; else if (!strncmp(yytext+i, "protocol:", 9)) sp->protocol = s; else if (!strncmp(yytext+i, "method-protocol:", 16)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = PROTOCOL; m->part = NULL; m->next = sp->list; sp->list = m; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-style:", 13)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = STYLE; m->part = NULL; m->next = sp->list; sp->list = m; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-encoding:", 16)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = ENCODING; m->part = NULL; m->next = sp->list; sp->list = m; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; if (strcmp(s, "encoded")) m->part = s; else m->part = ""; } else if (!strncmp(yytext+i, "method-response-encoding:", 25)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = RESPONSE_ENCODING; m->part = NULL; m->next = sp->list; sp->list = m; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; if (strcmp(s, "encoded")) m->part = s; else m->part = ""; } else if (!strncmp(yytext+i, "method-documentation:", 21)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = COMMENT; m->part = NULL; m->next = sp->list; sp->list = m; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-action:", 14)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = ACTION; m->part = NULL; m->next = sp->list; sp->list = m; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-input-action:", 20)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = REQUEST_ACTION; m->part = NULL; m->next = sp->list; sp->list = m; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-output-action:", 21)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = RESPONSE_ACTION; m->part = NULL; m->next = sp->list; sp->list = m; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-fault-action:", 20)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = FAULT_ACTION; m->part = NULL; m->next = sp->list; sp->list = m; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-mime-type:", 17)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = MIMEIN | MIMEOUT; m->part = NULL; m->next = sp->list; sp->list = m; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] <= 32) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-input-mime-type:", 23)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = MIMEIN; m->part = NULL; m->next = sp->list; sp->list = m; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] <= 32) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-output-mime-type:", 24)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = MIMEOUT; m->part = NULL; m->next = sp->list; sp->list = m; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] <= 32) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-header-part:", 19)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = HDRIN | HDROUT; m->part = NULL; m->next = sp->list; sp->list = m; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] <= 32) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-input-header-part:", 25)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = HDRIN; m->part = NULL; m->next = sp->list; sp->list = m; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] <= 32) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-output-header-part:", 26)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = HDROUT; m->part = NULL; m->next = sp->list; sp->list = m; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] <= 32) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-fault:", 13)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = FAULT; m->part = NULL; m->next = sp->list; sp->list = m; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] <= 32) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "type-documentation:", 19)) { d = (Data*)emalloc(sizeof(Data)); d->name = s; d->text = NULL; d->next = sp->data; sp->data = d; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; d->text = s; } else { sprintf(errbuf, "unrecognized gsoap directive: %s", yytext+i); semwarn(errbuf); } } else { sprintf(errbuf, "unrecognized gsoap directive: %s", yytext); semwarn(errbuf); } } static void option(void) { int i; if (imports) { sprintf(errbuf, "options directive: %s ignored in imported file(s)", yytext); semwarn(errbuf); return; } for (i = 0; yytext[i]; i++) if (yytext[i] <= 32) break; for (; yytext[i]; i++) if (yytext[i] > 32) break; for (; yytext[i]; i++) switch (yytext[i]) { case 'a': aflag = 1; break; case 'c': if (yytext[i+1] == '+' && yytext[i+2] == '+') { i += 2; if (yytext[i+1] == '1' && yytext[i+2] == '1') { i += 2; c11flag = 1; } cflag = 0; } else cflag = 1; break; case 'e': eflag = 1; break; case 'n': nflag = 1; break; case 'l': lflag = 1; break; case 't': tflag = 1; break; case 'w': wflag = 1; break; default: if (yytext[i] < 32 || yytext[i] == '/') return; } } static void xpath(void) { int i, j, k; char *s; XPath *xp; for (i = 0; yytext[i]; i++) if (yytext[i] <= 32) break; for (; yytext[i]; i++) if (yytext[i] > 32) break; for (j = i; yytext[j]; j++) if (yytext[j] <= 32) break; if (i == j) return; for (k = j; yytext[k]; k++) if (yytext[k] > 32) break; s = (char*)emalloc(yyleng - i); strncpy(s, yytext + i, j - i); s[j - i] = '\0'; for (xp = xpaths; xp; xp = xp->next) if (!strcmp(xp->name, s)) break; if (!xp) { xp = (XPath*)emalloc(sizeof(XPath)); xp->next = xpaths; xp->name = s; } s += j - i + 1; strcpy(s, yytext + k); xp->path = s; while (*s > 32) s++; *s = '\0'; } /* error_chr - lexical error in character constant. Return character 0 to allow parsing to continue */ static Token error_chr(void) { lexerror("Ending-' missing in character constant"); yylval.c = '\0'; return CHR; } /* error_str - lexical error in string. Return empty string to allow parsing to continue */ static Token error_str(void) { lexerror("Ending-\" missing in string"); yylval.s = ""; return STR; } /* Character conversion functions */ static int convchar(int *p) { switch (yytext[(*p)++]) { case 'a': return '\a'; case 'b': return '\b'; case 'f': return '\f'; case 'n': return '\n'; case 'r': return '\r'; case 't': return '\t'; case 'v': return '\v'; case 'x': return hexchar(p); case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': (*p)--; return octchar(p); default: return yytext[*p-1]; } } static int hexchar(int *p) { int i, d, c = 0; for (i = 0; isxdigit(d = yytext[*p]) && i < 2; i++) { c = (c << 4) + (d <= '9' ? d - '0' : toupper(d) - '7'); (*p)++; } return c; } static int octchar(int *p) { int i, d, c = 0; for (i = 0; (d = yytext[*p]) >= '0' && d <= '7' && i < 3; i++) { c = (c << 3) + d - '0'; (*p)++; } return c; } static void module(const char *name, const char *fullname) { char *s; if (!fullname) fullname = name; if (imports) { Pragma **pp; s = (char*)emalloc(strlen(fullname)+15); sprintf(s, "#include \"%sH.h\"", fullname); for (pp = &pragmas; *pp; pp = &(*pp)->next) if (!strcmp((*pp)->pragma, s)) break; if (!*pp) { *pp = (Pragma*)emalloc(sizeof(Pragma)); (*pp)->pragma = s; (*pp)->next = NULL; } s = (char*)emalloc(strlen(fullname)+1); imported = strcpy(s, fullname); fprintf(stderr, "Importing module '%s'\n\n", fullname); } else { lflag = 1; typeNO = magic(name); s = (char*)emalloc(strlen(fullname)+1); prefix = strcpy(s, fullname); fprintf(stderr, "Compiling module '%s' (magic number = %d)\n\n", fullname, typeNO); } } static int magic(const char *name) { size_t i; int n; if (strlen(name) > 4) semerror("#module name length must not exceed four characters"); n = 0; for (i = 0; i < strlen(name); i++) if (name[i] >= 'a' && name[i] <= 'z') n = 26*n + name[i] - 'a'; else if (name[i] >= 'A' && name[i] <= 'Z') n = 26*n + name[i] - 'A'; else semerror("#module name must be alphabetic and the length must not exceed four characters.\nUse '#module name longname' for longer names."); return 4699*n + 153424; } #ifdef WITH_LEX static void import(const char *file) { execerror("Cannot #import: soapcpp2 not compiled with flex (replace lex with flex)"); } #else static void import(const char *file) { char buf[1024]; struct importlist *p; if (vflag) fprintf(stderr, "Importing '%s': ", file); for (p = importlist; p; p = p->next) { if (!strcmp(p->name, file)) { if (vflag) fprintf(stderr, "file already read or currently being read\n\n"); return; } } if (imports >= MAX_IMPORT_DEPTH) execerror("Imports nested too deep"); instk[imports] = YY_CURRENT_BUFFER; fnstk[imports] = filename; lnstk[imports] = yylineno; imstk[imports] = imported; yylineno = 1; /* imported = NULL; this is useful to change the semantics of #import to NOT consider non-module imports to be part of the current module */ imports++; buf[0] = '\0'; if (!(yyin = fopen(file, "r"))) { if (importpath) { const char *s, *t; s = importpath; do { size_t n; t = strstr(s, SOAP_PATHSEP); if (t) { if ((size_t)(t - s) >= sizeof(buf)) t = s + sizeof(buf) - 1; strncpy(buf, s, t - s); buf[t - s] = '\0'; s = t + sizeof(SOAP_PATHSEP) - 1; } else { strcpy(buf, s); s = NULL; } n = strlen(buf) - 1; #ifdef __VMS if (buf[n] != ']' && buf[n] != ':') strcat(buf, ":"); #else if (buf[n] != SOAP_PATHCAT[0]) strcat(buf, SOAP_PATHCAT); #endif strcat(buf, file); yyin = fopen(buf, "r"); } while (s && !yyin); } if (!yyin) { sprintf(errbuf, "#import: Cannot open file \"%s\" for reading.\nHint: use option -I (for example -Igsoap/import"SOAP_PATHSEP"gsoap/custom:.)", file); execerror(errbuf); } } if (vflag) { if (buf[0]) fprintf(stderr, "OK, found at %s\n\n", buf); else fprintf(stderr, "OK\n\n"); } p = (struct importlist*)emalloc(sizeof(struct importlist) + strlen(file)); /* has already + 1 byte size */ strcpy(p->name, file); filename = p->name; p->next = importlist; importlist = p; yy_switch_to_buffer(yy_create_buffer(yyin,YY_BUF_SIZE)); } #endif gsoap-2.8.28/gsoap/src/Make_mvc.mak0000644000175000017500000000157012653650160016407 0ustar ellertellertCC=cl CPP=cl LIBS= COFLAGS=-O2 # COFLAGS=-ZI -DDEBUG CFLAGS= -EHsc -nologo $(COFLAGS) soapcpp2.exe: soapcpp2.h soapcpp2_yacc.obj symbol2.obj error2.obj lex.yy.obj init2.obj soapcpp2.obj $(CC) $(CFLAGS) symbol2.obj error2.obj soapcpp2_yacc.obj lex.yy.obj \ init2.obj soapcpp2.obj $(LIBS) -Fe$@ .c.o: # soapcpp2.h soapcpp2_yacc.h error2.h $(CC) $(CFLAGS) -DWITH_BISON -DWITH_FLEX -c $< clean: del /f *.obj distclean: del /f soapcpp2.exe *.obj *.idb *.pdb *.ilk real-distclean: del /f soapcpp2.exe *.obj *.idb *.pdb *.ilk lex.yy.* soapcpp2_yacc.h \ soapcpp2_yacc.c y.tab.* *.output soapcpp2_yacc.c: soapcpp2_yacc.y soapcpp2.h error2.h bison.exe /d /v soapcpp2_yacc.y ren soapcpp2_yacc.tab.h soapcpp2_yacc.h ren soapcpp2_yacc.tab.c soapcpp2_yacc.c lex.yy.c: soapcpp2_yacc.h soapcpp2_yacc.c soapcpp2_lex.l flex.exe /l soapcpp2_lex.l gsoap-2.8.28/gsoap/src/Makefile.in0000644000175000017500000007527012653650160016250 0ustar ellertellert# Makefile.in generated by automake 1.14 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ ####### This is the input file for automake, which will generate Makefile.in ########## VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ bin_PROGRAMS = soapcpp2$(EXEEXT) subdir = gsoap/src DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs soapcpp2_yacc.h soapcpp2_yacc.c \ soapcpp2_lex.c $(top_srcdir)/depcomp $(top_srcdir)/ylwrap ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" PROGRAMS = $(bin_PROGRAMS) am_soapcpp2_OBJECTS = soapcpp2-soapcpp2_yacc.$(OBJEXT) \ soapcpp2-soapcpp2_lex.$(OBJEXT) soapcpp2-symbol2.$(OBJEXT) \ soapcpp2-error2.$(OBJEXT) soapcpp2-init2.$(OBJEXT) \ soapcpp2-soapcpp2.$(OBJEXT) soapcpp2_OBJECTS = $(am_soapcpp2_OBJECTS) am__DEPENDENCIES_1 = soapcpp2_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) soapcpp2_LINK = $(CCLD) $(soapcpp2_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = LEXCOMPILE = $(LEX) $(AM_LFLAGS) $(LFLAGS) AM_V_LEX = $(am__v_LEX_@AM_V@) am__v_LEX_ = $(am__v_LEX_@AM_DEFAULT_V@) am__v_LEX_0 = @echo " LEX " $@; am__v_LEX_1 = YLWRAP = $(top_srcdir)/ylwrap am__yacc_c2h = sed -e s/cc$$/hh/ -e s/cpp$$/hpp/ -e s/cxx$$/hxx/ \ -e s/c++$$/h++/ -e s/c$$/h/ YACCCOMPILE = $(YACC) $(AM_YFLAGS) $(YFLAGS) AM_V_YACC = $(am__v_YACC_@AM_V@) am__v_YACC_ = $(am__v_YACC_@AM_DEFAULT_V@) am__v_YACC_0 = @echo " YACC " $@; am__v_YACC_1 = SOURCES = $(soapcpp2_SOURCES) DIST_SOURCES = $(soapcpp2_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ STRIP = @STRIP@ VERSION = @VERSION@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = foreign 1.4 #LIBS= AM_YFLAGS = -d -v AM_LFLAGS = $(LEX_FLAGS) soapcpp2_CFLAGS = $(BISON_DEFINE) $(LEX_DEFINE) $(C_DEBUG_FLAGS) $(SOAPCPP2_IMPORTPATH) -D$(platform) soapcpp2_LDADD = $(YACC_LIB) $(LEXLIB) soapcpp2_SOURCES = soapcpp2_yacc.y soapcpp2_lex.l symbol2.c error2.c init2.c soapcpp2.c CLEANFILES = *~ soapcpp2_lex.c soapcpp2_yacc.c soapcpp2_yacc.h soapcpp2_yacc.output all: all-am .SUFFIXES: .SUFFIXES: .c .l .o .obj .y $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/src/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) soapcpp2_yacc.h: soapcpp2_yacc.c @if test ! -f $@; then rm -f soapcpp2_yacc.c; else :; fi @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) soapcpp2_yacc.c; else :; fi soapcpp2$(EXEEXT): $(soapcpp2_OBJECTS) $(soapcpp2_DEPENDENCIES) $(EXTRA_soapcpp2_DEPENDENCIES) @rm -f soapcpp2$(EXEEXT) $(AM_V_CCLD)$(soapcpp2_LINK) $(soapcpp2_OBJECTS) $(soapcpp2_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapcpp2-error2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapcpp2-init2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapcpp2-soapcpp2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapcpp2-soapcpp2_lex.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapcpp2-soapcpp2_yacc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapcpp2-symbol2.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` soapcpp2-soapcpp2_yacc.o: soapcpp2_yacc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(soapcpp2_CFLAGS) $(CFLAGS) -MT soapcpp2-soapcpp2_yacc.o -MD -MP -MF $(DEPDIR)/soapcpp2-soapcpp2_yacc.Tpo -c -o soapcpp2-soapcpp2_yacc.o `test -f 'soapcpp2_yacc.c' || echo '$(srcdir)/'`soapcpp2_yacc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/soapcpp2-soapcpp2_yacc.Tpo $(DEPDIR)/soapcpp2-soapcpp2_yacc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapcpp2_yacc.c' object='soapcpp2-soapcpp2_yacc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(soapcpp2_CFLAGS) $(CFLAGS) -c -o soapcpp2-soapcpp2_yacc.o `test -f 'soapcpp2_yacc.c' || echo '$(srcdir)/'`soapcpp2_yacc.c soapcpp2-soapcpp2_yacc.obj: soapcpp2_yacc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(soapcpp2_CFLAGS) $(CFLAGS) -MT soapcpp2-soapcpp2_yacc.obj -MD -MP -MF $(DEPDIR)/soapcpp2-soapcpp2_yacc.Tpo -c -o soapcpp2-soapcpp2_yacc.obj `if test -f 'soapcpp2_yacc.c'; then $(CYGPATH_W) 'soapcpp2_yacc.c'; else $(CYGPATH_W) '$(srcdir)/soapcpp2_yacc.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/soapcpp2-soapcpp2_yacc.Tpo $(DEPDIR)/soapcpp2-soapcpp2_yacc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapcpp2_yacc.c' object='soapcpp2-soapcpp2_yacc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(soapcpp2_CFLAGS) $(CFLAGS) -c -o soapcpp2-soapcpp2_yacc.obj `if test -f 'soapcpp2_yacc.c'; then $(CYGPATH_W) 'soapcpp2_yacc.c'; else $(CYGPATH_W) '$(srcdir)/soapcpp2_yacc.c'; fi` soapcpp2-soapcpp2_lex.o: soapcpp2_lex.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(soapcpp2_CFLAGS) $(CFLAGS) -MT soapcpp2-soapcpp2_lex.o -MD -MP -MF $(DEPDIR)/soapcpp2-soapcpp2_lex.Tpo -c -o soapcpp2-soapcpp2_lex.o `test -f 'soapcpp2_lex.c' || echo '$(srcdir)/'`soapcpp2_lex.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/soapcpp2-soapcpp2_lex.Tpo $(DEPDIR)/soapcpp2-soapcpp2_lex.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapcpp2_lex.c' object='soapcpp2-soapcpp2_lex.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(soapcpp2_CFLAGS) $(CFLAGS) -c -o soapcpp2-soapcpp2_lex.o `test -f 'soapcpp2_lex.c' || echo '$(srcdir)/'`soapcpp2_lex.c soapcpp2-soapcpp2_lex.obj: soapcpp2_lex.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(soapcpp2_CFLAGS) $(CFLAGS) -MT soapcpp2-soapcpp2_lex.obj -MD -MP -MF $(DEPDIR)/soapcpp2-soapcpp2_lex.Tpo -c -o soapcpp2-soapcpp2_lex.obj `if test -f 'soapcpp2_lex.c'; then $(CYGPATH_W) 'soapcpp2_lex.c'; else $(CYGPATH_W) '$(srcdir)/soapcpp2_lex.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/soapcpp2-soapcpp2_lex.Tpo $(DEPDIR)/soapcpp2-soapcpp2_lex.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapcpp2_lex.c' object='soapcpp2-soapcpp2_lex.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(soapcpp2_CFLAGS) $(CFLAGS) -c -o soapcpp2-soapcpp2_lex.obj `if test -f 'soapcpp2_lex.c'; then $(CYGPATH_W) 'soapcpp2_lex.c'; else $(CYGPATH_W) '$(srcdir)/soapcpp2_lex.c'; fi` soapcpp2-symbol2.o: symbol2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(soapcpp2_CFLAGS) $(CFLAGS) -MT soapcpp2-symbol2.o -MD -MP -MF $(DEPDIR)/soapcpp2-symbol2.Tpo -c -o soapcpp2-symbol2.o `test -f 'symbol2.c' || echo '$(srcdir)/'`symbol2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/soapcpp2-symbol2.Tpo $(DEPDIR)/soapcpp2-symbol2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='symbol2.c' object='soapcpp2-symbol2.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(soapcpp2_CFLAGS) $(CFLAGS) -c -o soapcpp2-symbol2.o `test -f 'symbol2.c' || echo '$(srcdir)/'`symbol2.c soapcpp2-symbol2.obj: symbol2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(soapcpp2_CFLAGS) $(CFLAGS) -MT soapcpp2-symbol2.obj -MD -MP -MF $(DEPDIR)/soapcpp2-symbol2.Tpo -c -o soapcpp2-symbol2.obj `if test -f 'symbol2.c'; then $(CYGPATH_W) 'symbol2.c'; else $(CYGPATH_W) '$(srcdir)/symbol2.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/soapcpp2-symbol2.Tpo $(DEPDIR)/soapcpp2-symbol2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='symbol2.c' object='soapcpp2-symbol2.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(soapcpp2_CFLAGS) $(CFLAGS) -c -o soapcpp2-symbol2.obj `if test -f 'symbol2.c'; then $(CYGPATH_W) 'symbol2.c'; else $(CYGPATH_W) '$(srcdir)/symbol2.c'; fi` soapcpp2-error2.o: error2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(soapcpp2_CFLAGS) $(CFLAGS) -MT soapcpp2-error2.o -MD -MP -MF $(DEPDIR)/soapcpp2-error2.Tpo -c -o soapcpp2-error2.o `test -f 'error2.c' || echo '$(srcdir)/'`error2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/soapcpp2-error2.Tpo $(DEPDIR)/soapcpp2-error2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='error2.c' object='soapcpp2-error2.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(soapcpp2_CFLAGS) $(CFLAGS) -c -o soapcpp2-error2.o `test -f 'error2.c' || echo '$(srcdir)/'`error2.c soapcpp2-error2.obj: error2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(soapcpp2_CFLAGS) $(CFLAGS) -MT soapcpp2-error2.obj -MD -MP -MF $(DEPDIR)/soapcpp2-error2.Tpo -c -o soapcpp2-error2.obj `if test -f 'error2.c'; then $(CYGPATH_W) 'error2.c'; else $(CYGPATH_W) '$(srcdir)/error2.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/soapcpp2-error2.Tpo $(DEPDIR)/soapcpp2-error2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='error2.c' object='soapcpp2-error2.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(soapcpp2_CFLAGS) $(CFLAGS) -c -o soapcpp2-error2.obj `if test -f 'error2.c'; then $(CYGPATH_W) 'error2.c'; else $(CYGPATH_W) '$(srcdir)/error2.c'; fi` soapcpp2-init2.o: init2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(soapcpp2_CFLAGS) $(CFLAGS) -MT soapcpp2-init2.o -MD -MP -MF $(DEPDIR)/soapcpp2-init2.Tpo -c -o soapcpp2-init2.o `test -f 'init2.c' || echo '$(srcdir)/'`init2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/soapcpp2-init2.Tpo $(DEPDIR)/soapcpp2-init2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='init2.c' object='soapcpp2-init2.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(soapcpp2_CFLAGS) $(CFLAGS) -c -o soapcpp2-init2.o `test -f 'init2.c' || echo '$(srcdir)/'`init2.c soapcpp2-init2.obj: init2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(soapcpp2_CFLAGS) $(CFLAGS) -MT soapcpp2-init2.obj -MD -MP -MF $(DEPDIR)/soapcpp2-init2.Tpo -c -o soapcpp2-init2.obj `if test -f 'init2.c'; then $(CYGPATH_W) 'init2.c'; else $(CYGPATH_W) '$(srcdir)/init2.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/soapcpp2-init2.Tpo $(DEPDIR)/soapcpp2-init2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='init2.c' object='soapcpp2-init2.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(soapcpp2_CFLAGS) $(CFLAGS) -c -o soapcpp2-init2.obj `if test -f 'init2.c'; then $(CYGPATH_W) 'init2.c'; else $(CYGPATH_W) '$(srcdir)/init2.c'; fi` soapcpp2-soapcpp2.o: soapcpp2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(soapcpp2_CFLAGS) $(CFLAGS) -MT soapcpp2-soapcpp2.o -MD -MP -MF $(DEPDIR)/soapcpp2-soapcpp2.Tpo -c -o soapcpp2-soapcpp2.o `test -f 'soapcpp2.c' || echo '$(srcdir)/'`soapcpp2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/soapcpp2-soapcpp2.Tpo $(DEPDIR)/soapcpp2-soapcpp2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapcpp2.c' object='soapcpp2-soapcpp2.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(soapcpp2_CFLAGS) $(CFLAGS) -c -o soapcpp2-soapcpp2.o `test -f 'soapcpp2.c' || echo '$(srcdir)/'`soapcpp2.c soapcpp2-soapcpp2.obj: soapcpp2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(soapcpp2_CFLAGS) $(CFLAGS) -MT soapcpp2-soapcpp2.obj -MD -MP -MF $(DEPDIR)/soapcpp2-soapcpp2.Tpo -c -o soapcpp2-soapcpp2.obj `if test -f 'soapcpp2.c'; then $(CYGPATH_W) 'soapcpp2.c'; else $(CYGPATH_W) '$(srcdir)/soapcpp2.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/soapcpp2-soapcpp2.Tpo $(DEPDIR)/soapcpp2-soapcpp2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapcpp2.c' object='soapcpp2-soapcpp2.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(soapcpp2_CFLAGS) $(CFLAGS) -c -o soapcpp2-soapcpp2.obj `if test -f 'soapcpp2.c'; then $(CYGPATH_W) 'soapcpp2.c'; else $(CYGPATH_W) '$(srcdir)/soapcpp2.c'; fi` .l.c: $(AM_V_LEX)$(am__skiplex) $(SHELL) $(YLWRAP) $< $(LEX_OUTPUT_ROOT).c $@ -- $(LEXCOMPILE) .y.c: $(AM_V_YACC)$(am__skipyacc) $(SHELL) $(YLWRAP) $< y.tab.c $@ y.tab.h `echo $@ | $(am__yacc_c2h)` y.output $*.output -- $(YACCCOMPILE) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) installdirs: for dir in "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -rm -f soapcpp2_lex.c -rm -f soapcpp2_yacc.c -rm -f soapcpp2_yacc.h clean: clean-am clean-am: clean-binPROGRAMS clean-generic mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ clean-binPROGRAMS clean-generic cscopelist-am ctags ctags-am \ distclean distclean-compile distclean-generic distclean-tags \ distdir dvi dvi-am html html-am info info-am install \ install-am install-binPROGRAMS install-data install-data-am \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic pdf pdf-am \ ps ps-am tags tags-am uninstall uninstall-am \ uninstall-binPROGRAMS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.28/gsoap/src/soapcpp2_yacc.tab.h0000644000175000017500000001275712653650160017650 0ustar ellertellert/* A Bison parser, made by GNU Bison 2.3. */ /* Skeleton interface for Bison's Yacc-like parsers in C Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. 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, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /* Tokens. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE /* Put the tokens into the symbol table, so that GDB and other debuggers know about them. */ enum yytokentype { PRAGMA = 258, AUTO = 259, DOUBLE = 260, INT = 261, STRUCT = 262, BREAK = 263, ELSE = 264, LONG = 265, SWITCH = 266, CASE = 267, ENUM = 268, REGISTER = 269, TYPEDEF = 270, CHAR = 271, EXTERN = 272, RETURN = 273, UNION = 274, CONST = 275, FLOAT = 276, SHORT = 277, UNSIGNED = 278, CONTINUE = 279, FOR = 280, SIGNED = 281, VOID = 282, DEFAULT = 283, GOTO = 284, SIZEOF = 285, VOLATILE = 286, DO = 287, IF = 288, STATIC = 289, WHILE = 290, CLASS = 291, PRIVATE = 292, PROTECTED = 293, PUBLIC = 294, VIRTUAL = 295, INLINE = 296, OPERATOR = 297, LLONG = 298, BOOL = 299, CFALSE = 300, CTRUE = 301, WCHAR = 302, TIME = 303, USING = 304, NAMESPACE = 305, ULLONG = 306, MUSTUNDERSTAND = 307, SIZE = 308, FRIEND = 309, TEMPLATE = 310, EXPLICIT = 311, TYPENAME = 312, MUTABLE = 313, FINAL = 314, null = 315, RESTRICT = 316, OVERRIDE = 317, UCHAR = 318, USHORT = 319, UINT = 320, ULONG = 321, NONE = 322, ID = 323, LAB = 324, TYPE = 325, LNG = 326, DBL = 327, CHR = 328, TAG = 329, STR = 330, RA = 331, LA = 332, OA = 333, XA = 334, AA = 335, MA = 336, DA = 337, TA = 338, NA = 339, PA = 340, OR = 341, AN = 342, NE = 343, EQ = 344, GE = 345, LE = 346, RS = 347, LS = 348, AR = 349, PP = 350, NN = 351 }; #endif /* Tokens. */ #define PRAGMA 258 #define AUTO 259 #define DOUBLE 260 #define INT 261 #define STRUCT 262 #define BREAK 263 #define ELSE 264 #define LONG 265 #define SWITCH 266 #define CASE 267 #define ENUM 268 #define REGISTER 269 #define TYPEDEF 270 #define CHAR 271 #define EXTERN 272 #define RETURN 273 #define UNION 274 #define CONST 275 #define FLOAT 276 #define SHORT 277 #define UNSIGNED 278 #define CONTINUE 279 #define FOR 280 #define SIGNED 281 #define VOID 282 #define DEFAULT 283 #define GOTO 284 #define SIZEOF 285 #define VOLATILE 286 #define DO 287 #define IF 288 #define STATIC 289 #define WHILE 290 #define CLASS 291 #define PRIVATE 292 #define PROTECTED 293 #define PUBLIC 294 #define VIRTUAL 295 #define INLINE 296 #define OPERATOR 297 #define LLONG 298 #define BOOL 299 #define CFALSE 300 #define CTRUE 301 #define WCHAR 302 #define TIME 303 #define USING 304 #define NAMESPACE 305 #define ULLONG 306 #define MUSTUNDERSTAND 307 #define SIZE 308 #define FRIEND 309 #define TEMPLATE 310 #define EXPLICIT 311 #define TYPENAME 312 #define MUTABLE 313 #define FINAL 314 #define null 315 #define RESTRICT 316 #define OVERRIDE 317 #define UCHAR 318 #define USHORT 319 #define UINT 320 #define ULONG 321 #define NONE 322 #define ID 323 #define LAB 324 #define TYPE 325 #define LNG 326 #define DBL 327 #define CHR 328 #define TAG 329 #define STR 330 #define RA 331 #define LA 332 #define OA 333 #define XA 334 #define AA 335 #define MA 336 #define DA 337 #define TA 338 #define NA 339 #define PA 340 #define OR 341 #define AN 342 #define NE 343 #define EQ 344 #define GE 345 #define LE 346 #define RS 347 #define LS 348 #define AR 349 #define PP 350 #define NN 351 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED typedef union YYSTYPE #line 153 "soapcpp2_yacc.y" { Symbol *sym; LONG64 i; double r; char c; char *s; Tnode *typ; Storage sto; Node rec; Entry *e; } /* Line 1529 of yacc.c. */ #line 253 "soapcpp2_yacc.tab.h" YYSTYPE; # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 # define YYSTYPE_IS_TRIVIAL 1 #endif extern YYSTYPE yylval; gsoap-2.8.28/gsoap/src/soapcpp2.c0000644000175000017500000003041212653650160016063 0ustar ellertellert/* soapcpp2.c Main compiler and code generator batch program. gSOAP XML Web services tools Copyright (C) 2000-2016, Robert van Engelen, Genivia Inc. All Rights Reserved. This part of the software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapcpp2.h" #ifndef SOAPCPP2_IMPORT_PATH # define SOAPCPP2_IMPORT_PATH (NULL) #endif extern void init(void); extern int yyparse(void); extern FILE *yyin; extern const char *ns_cname(const char*, const char*); FILE *fmsg; /* fd to flush compiler messages */ int soap_version = 0; /* SOAP version, -1=no SOAP, 0=not set, 1=1.1, 2=1.2 */ int vflag = 0; /* verbose output */ int wflag = 0; /* when set, don't generate WSDL and schema files */ int cflag = 0; /* when set, generate files with .c extension */ int c11flag = 0; /* when set, generate C++11 files with .cpp extension */ int Cflag = 0; /* when set, generate only files for clients */ int aflag = 0; /* when set, use value of SOAP Action to dispatch method at server side */ int Aflag = 0; /* when set, require SOAP Action to dispatch method at server side */ int bflag = 0; /* when set, serialize byte arrays char[N] as string */ int eflag = 0; /* when set, use SOAP RPC encoding by default */ int Ecflag = 0; /* when set, generate extra routines for data copying (soap_dup_X) */ int Edflag = 0; /* when set, generate extra routines for data deletion (soap_del_X) */ int Etflag = 0; /* when set, generate data traversal/walker routines */ unsigned long fflag = 0;/* multi-file split for each bundle of -fN defs */ int iflag = 0; /* when set, generate new style proxy/object classes inherited from soap struct */ int jflag = 0; /* when set, generate new style proxy/object classes */ int mflag = 0; /* when set, generate code that requires array/binary classes to explicitly remove malloced array */ int nflag = 0; /* when set, names the namespaces global struct '%NAME%_namespaces */ int lflag = 0; /* when set, create library */ int Lflag = 0; /* when set, don't generate soapClientLib/soapServerLib */ int Qflag = 0; /* when set, use C++ namespaces for custom serializers */ int sflag = 0; /* when set, generate strict validation checks */ int Sflag = 0; /* when set, generate only files for servers */ int Tflag = 0; /* when set, generates server auto-test code */ int tflag = 0; /* when set, generates typed messsages (with xsi:type attributes) */ int uflag = 0; /* when set, uncomment WSDL and schema output */ int xflag = 0; /* when set, don't generate sample XML message files */ int yflag = 0; /* when set, add C/C++ info in sample XML messages */ int zflag = 0; /* when set, use backward compatibility option */ char dirpath[1024]; /* directory path for generated source files */ const char *prefix = "soap"; /* file name prefix for generated source files */ const char *filename; /* current file name */ const char *importpath = NULL; /* default file import path */ const char *defimportpath = SOAPCPP2_IMPORT_PATH; /* default file import path */ /* IMPORTANT: The terms and conditions of use of this software do not allow for the removal of the copyright notice from the main program for visual display. For integrations with other software, a similar copyright notice must be produced that is visible to users of the software. */ int main(int argc, char **argv) { int i, g; char *a, *s; fmsg = stderr; filename = ""; fprintf(fmsg, "\n** The gSOAP code generator for C and C++, soapcpp2 release " VERSION "\n** Copyright (C) 2000-2016, Robert van Engelen, Genivia Inc.\n** All Rights Reserved. This product is provided \"as is\", without any warranty.\n** The soapcpp2 tool and its generated software are released under the GPL.\n** ----------------------------------------------------------------------------\n** A commercial use license is available from Genivia Inc., contact@genivia.com\n** ----------------------------------------------------------------------------\n\n"); for (i = 1; i < argc; i++) { a = argv[i]; if (*a == '-' #ifdef WIN32 || *a == '/' #endif ) { g = 1; while (g && *++a) switch (*a) { case 'C': Cflag = 1; if (Sflag) fprintf(stderr, "soapcpp2: using both options -C and -S omits client/server code\n"); break; case 'c': if (a[1] == '+' && a[2] == '+') { a += 2; if (a[1] == '1' && a[2] == '1') { a += 2; c11flag = 1; } cflag = 0; } else cflag = 1; break; case 'd': a++; g = 0; if (*a) strcpy(dirpath, a); else if (i < argc && argv[++i]) strcpy(dirpath, argv[i]); else execerror("Option -d requires a directory path"); if (*dirpath && dirpath[strlen(dirpath)-1] != '/' && dirpath[strlen(dirpath)-1] != '\\') strcat(dirpath, SOAP_PATHCAT); break; case 'e': eflag = 1; break; case 'E': a++; g = 0; while (*a) { switch (*a) { case 'c': Ecflag = 1; break; case 'd': Edflag = 1; break; case 't': Etflag = 1; break; default: execerror("Option -E requires 'c' and/or 'd'"); } a++; } break; case 'f': a++; g = 0; if (*a) fflag = strtoul(a, NULL, 10); else if (i < argc && argv[++i]) fflag = strtoul(argv[i], NULL, 10); if (!fflag) execerror("Option -f requires a value"); if (fflag < 10) fflag = 10; break; case 'a': aflag = 1; break; case 'A': aflag = 1; Aflag = 1; break; case 'b': bflag = 1; break; case '?': case 'h': fprintf(stderr, "Usage: soapcpp2 [-0|-1|-2] [-C|-S] [-T] [-Ecdt] [-L] [-a] [-A] [-b] [-c|-c++|-c++11] [-d path] [-e] [-f N] [-h] [-i] [-I path" SOAP_PATHSEP "path" SOAP_PATHSEP "...] [-l] [-m] [-n] [-p name] [-s] [-t] [-u] [-v] [-w] [-x] [-y] [-z#] [infile]\n\n"); fprintf(stderr, "\ -1 generate SOAP 1.1 bindings\n\ -2 generate SOAP 1.2 bindings\n\ -0 no SOAP bindings, use REST\n\ -C generate client-side code only\n\ -S generate server-side code only\n\ -T generate server auto-test code\n\ -Ec generate extra routines for deep copying\n\ -Ed generate extra routines for deep deletion\n\ -Et generate extra routines for data traversals with walker functions\n\ -L don't generate soapClientLib/soapServerLib\n\ -a use SOAPAction with WS-Addressing to invoke server-side operations\n\ -A require SOAPAction to invoke server-side operations\n\ -b serialize byte arrays char[N] as string\n\ -c generate C source code\n\ -c++ generate C++ source code (default)\n\ -c++11 generate C++ source code optimized for C++11 (compile with -std=c++11)\n\ -dpath use path to save files\n\ -e generate SOAP RPC encoding style bindings (also use -1 or -2)\n\ -fN multiple soapC files, with N serializer definitions per file (N>=10)\n\ -h display help info\n\ -Ipath use path(s) for #import (paths separated with '" SOAP_PATHSEP "')\n\ -i generate C++ service proxies and objects inherited from soap struct\n\ -j generate C++ service proxies and objects that share a soap struct\n\ -l generate linkable modules (experimental)\n\ -m generate Matlab(tm) code for MEX compiler (deprecated)\n\ -n use service name to rename service functions and namespace table\n\ -pname save files with new prefix name instead of 'soap'\n\ -Qname use name as the C++ namespace for decls, including custom serializers\n\ -qname use name as the C++ namespace for decls, excluding custom serializers\n\ -s generate deserialization code with strict XML validation checks\n\ -t generate code for fully xsi:type typed SOAP/XML messaging\n\ -u uncomment comments in WSDL/schema output by suppressing XML comments\n\ -v verbose output\n\ -w don't generate WSDL and schema files\n\ -x don't generate sample XML message files\n\ -y include C/C++ type access information in sample XML messages\n\ -z1 compatibility: generate old-style C++ service proxies and objects\n\ -z2 compatibility with 2.7.x: omit XML output for NULL pointers\n\ infile header file to parse (or stdin)\n\ \n"); exit(0); case 'I': a++; g = 0; s = NULL; if (*a) s = a; else if (i < argc && argv[++i]) s = argv[i]; else execerror("Option -I requires an import path"); if (importpath && s) { char *t = (char*)emalloc(strlen(importpath) + strlen(s) + 2); strcpy(t, importpath); strcat(t, SOAP_PATHSEP); strcat(t, s); importpath = t; } else importpath = s; break; case 'i': iflag = 1; break; case 'j': jflag = 1; break; case 'm': mflag = 1; break; case 'n': nflag = 1; break; case 'l': lflag = 1; break; case 'L': Lflag = 1; break; case 's': sflag = 1; break; case 'S': Sflag = 1; if (Cflag) fprintf(stderr, "soapcpp2: using both options -C and -S omits client/server code\n"); break; case 'T': Tflag = 1; break; case 't': tflag = 1; break; case 'u': uflag = 1; break; case 'w': wflag = 1; break; case 'x': xflag = 1; break; case 'y': yflag = 1; break; case 'p': a++; g = 0; if (*a) prefix = ns_cname(a, NULL); else if (i < argc && argv[++i]) prefix = ns_cname(argv[i], NULL); else execerror("Option -p requires an output file name prefix"); break; case 'Q': Qflag = 1; /* fall through */ case 'q': a++; g = 0; if (*a) namespaceid = ns_cname(a, NULL); else if (i < argc && argv[++i]) namespaceid = ns_cname(argv[i], NULL); else execerror("Option -q requires a namespace name"); break; case '0': soap_version = -1; break; case '1': soap_version = 1; envURI = "http://schemas.xmlsoap.org/soap/envelope/"; encURI = "http://schemas.xmlsoap.org/soap/encoding/"; break; case '2': soap_version = 2; envURI = "http://www.w3.org/2003/05/soap-envelope"; encURI = "http://www.w3.org/2003/05/soap-encoding"; rpcURI = "http://www.w3.org/2003/05/soap-rpc"; break; case 'v': vflag = 1; break; case 'z': a++; g = 0; if (*a) zflag = *a - '0'; else if (i < argc && argv[++i]) zflag = *argv[i] - '0'; else execerror("Option -z requires a digit"); break; default: fprintf(stderr, "soapcpp2: Unknown option %s\n", a); exit(1); } } else if (!(yyin = fopen(argv[i], "r"))) { sprintf(errbuf, "Cannot open file \"%s\" for reading", argv[i]); execerror(errbuf); } else filename = argv[i]; } if (importpath && defimportpath) { char *t = (char*)emalloc(strlen(importpath) + strlen(defimportpath) + 2); strcpy(t, importpath); strcat(t, SOAP_PATHSEP); strcat(t, defimportpath); importpath = t; } else if (!importpath) importpath = defimportpath; init(); if (yyparse()) synerror("skipping the remaining part of the input"); return errstat(); } gsoap-2.8.28/gsoap/src/MakefileManual0000644000175000017500000000267212653650160016775 0ustar ellertellert# gSOAP soapcpp2 Makefile by Robert van Engelen, Genivia Inc. # Use this to build the soapcpp2 tool when autoconf/automake are not # available. # # Dependences: # Flex (or Lex) # Bison # # Mac OS X universal binary: # CC=gcc -arch i386 -arch ppc CC=gcc # use LEX=flex -l or LEX=lex LEX=flex -l # use YACC=bison or YACC=yacc -d -v -s soapcpp2_yacc YACC=bison # For static linkage with Flex use: # LIBS=/usr/lib/libfl.a # For static linkage with Lex use: # LIBS=/usr/lib/libl.a COFLAGS=-O1 # For static linking use: # COFLAGS=-O1 -static # For debugging use: # COFLAGS=-g CWFLAGS=-Wall # CIFLAGS= # use -DWITH_BISON or -DWITH_YACC # use -DWITH_FLEX or -DWITH_LEX CMFLAGS=-DWITH_BISON -DWITH_FLEX # CFLAGS= $(CWFLAGS) $(COFLAGS) $(CIFLAGS) $(CMFLAGS) # all: allclean soapcpp2 soapcpp2: soapcpp2.h soapcpp2_yacc.tab.o symbol2.o error2.o lex.yy.o init2.o soapcpp2.o $(CC) symbol2.o error2.o soapcpp2_yacc.tab.o lex.yy.o init2.o soapcpp2.o $(LIBS) -o $@ -cp -f soapcpp2 ../bin soapcpp2_yacc.tab.c: soapcpp2_yacc.y soapcpp2.h error2.h $(YACC) -d -v soapcpp2_yacc.y lex.yy.c: soapcpp2_yacc.tab.h soapcpp2_yacc.tab.c soapcpp2_lex.l $(LEX) soapcpp2_lex.l .c.o: soapcpp2.h soapcpp2_yacc.tab.h error2.h $(CC) $(CFLAGS) -c $< .PHONY: clean distclean allclean clean: -rm -f *.o distclean: -rm -f soapcpp2 *.o *.output allclean: -rm -f soapcpp2 *.o *.output -rm -f lex.yy.c soapcpp2_yacc.tab.h soapcpp2_yacc.tab.c gsoap-2.8.28/gsoap/src/soapcpp2_lex.l0000644000175000017500000006612412653650160016755 0ustar ellertellert/* soapcpp2_lex.l Flex/Lex tokenizer for C/C++ -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc. All Rights Reserved. This part of the software is released under ONE of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ %{ #include "soapcpp2.h" #ifdef HAVE_CONFIG_H #include "soapcpp2_yacc.h" #else #include "soapcpp2_yacc.tab.h" #endif #ifdef WITH_BISON YYSTYPE yylval; #undef YY_NEED_STRLEN #define YY_INPUT(buf, result, max_size) \ { \ int c = getc(yyin); \ result = (c == EOF) ? YY_NULL : (buf[0] = c, 1); \ } #endif #ifndef WITH_LEX #define MAX_IMPORT_DEPTH 16 static struct importlist { struct importlist *next; char name[1]; } *importlist = NULL; static const char *fnstk[MAX_IMPORT_DEPTH]; static int lnstk[MAX_IMPORT_DEPTH]; static const char *imstk[MAX_IMPORT_DEPTH]; static YY_BUFFER_STATE instk[MAX_IMPORT_DEPTH]; #endif int imports = 0; const char *imported = NULL; static void check_id(const char*); static Token install_id(void); static Token install_tag(void); static Token install_int(void); static Token install_hex(void); static Token install_num(void); static Token install_chr(void); static Token install_str(void); static Token install_pragma(void); static void directive(void), option(void), xpath(void); static Token error_chr(void); static Token error_str(void); static int convchar(int*); static int hexchar(int*); static int octchar(int*); static void module(const char *name, const char *fullname); static void import(const char *file); static int magic(const char *name); %} BOM \xEF\xBB\xBF ws [ \t\v\r\f\n\x1A\xA0] digit [0-9] alpha ([a-zA-Z_\xA8\xAA\xAD\xAF\xB2\xB5\xB7\xB8\xB9\xBA\xBC\xBD\xBE]|[\xC0-\xFF][\x80-\xBF]*|\\u([0-9a-fA-F]{4})) id (:?{alpha})(:?{alpha}|{digit}|::)* tag `[^`\t\v\r\f\n>]+` int {digit}+ hex 0[xX][0-9a-fA-F]+ num {int}(\.{int}([Ee][+-]?{int})?|(\.{int})?[Ee][+-]?{int}) chr '(\\'|[^'\n])*' str L?\"(\\\"|\\\n|[^"])*\" module #module{ws}+.*\n import #import{ws}+.*\n %option noyywrap %option noinput %option nounput %x MLCOMMENT %% ^{BOM} { /* skip UTF8 BOM */ } {ws} { /* skip white space */ } "/*" { BEGIN(MLCOMMENT); } .|\n { } "*/" { BEGIN(INITIAL); } <> { execerror("Unclosed multiline comment at the end of file"); } "//"\/*"gsoapopt".*\n { option(); } "//"\/*"gsoap".*\n { directive(); } "//"\/*"xpath".*\n { xpath(); } "//".*\n { /* skip single line comment */ } "+=" { return PA; } "-=" { return NA; } "*=" { return TA; } "/=" { return DA; } "%=" { return MA; } "&=" { return AA; } "^=" { return XA; } "|=" { return OA; } "<<=" { return LA; } ">>=" { return RA; } "||" { return OR; } "&&" { return AN; } "==" { return EQ; } "!=" { return NE; } "<=" { return LE; } ">=" { return GE; } "<<" { return LS; } ">>" { return RS; } "++" { return PP; } "--" { return NN; } "->" { return AR; } [;,:=|^&<>+\-*/%!?~(){}\[\].@$] { return yytext[0]; } {id} { return install_id(); } {tag} { return install_tag(); } {int} { return install_int(); } {hex} { return install_hex(); } {num} { return install_num(); } {chr} { return install_chr(); } {str} { return install_str(); } {module} { char *s, *t, buf[1024]; s = strchr(yytext, '"'); if (!s) t = yytext+7; else { strcpy(buf, s+1); s = strchr(buf, '"'); *s = '\0'; t = strchr(s+1, '"'); if (t) { t++; s = strchr(t+1, '"'); if (s) *s = '\0'; } } module(buf, t); } {import} { char *s, buf[1024]; s = strchr(yytext, '"'); if (s) { strncpy(buf, s + 1, sizeof(buf)); buf[sizeof(buf) - 1] = '\0'; s = strchr(buf, '"'); if (!s) lexerror("Invalid import directive: missing ending \" or path too long"); else { *s = '\0'; import(buf); } } else lexerror("Invalid import directive: \" expected"); } #.*\n { return install_pragma(); } '[^'\n]*/\n { return error_chr(); } \"[^"\n]*/\n { return error_str(); } . { lexerror("Skipping unknown symbol"); } <> { /* when Lex complains: remove this line and below */ #ifndef WITH_LEX if (--imports < 0) { yyterminate(); } else { if (vflag) fprintf(stderr, "End of %s\n\n", filename); yy_delete_buffer(YY_CURRENT_BUFFER); yy_switch_to_buffer(instk[imports]); filename = fnstk[imports]; yylineno = lnstk[imports]; imported = imstk[imports]; } #endif } %% /* install_id - lookup identifier in symbol table. If found, return token and symbol table entry. If not found, create entry in symbol table and return ID token. */ static Token install_id() { Symbol *p = lookup(yytext); if (!p) { int i, flag = 0; p = install(yytext, ID); /* [_](x|X)(m|M)(l|L)__ is OK */ /* [_](x|X)(m|M)(l|L).* is not OK */ /* .*__(x|X)(m|M)(l|L) is not OK */ /* .*::(x|X)(m|M)(l|L) is not OK */ for (i = 0; i < (int)yyleng; i++) { if ((yytext[i] == '_' && yytext[i+1] == '_') || (yytext[i] == ':' && yytext[i+1] == ':')) { flag = 1; check_id(yytext + i + 2); } } if (!flag && strcmp(yytext, "XML")) check_id(yytext); } yylval.sym = p; return p->token; } /* install_tag - return TAG token. */ static Token install_tag() { yylval.s = (char*)emalloc(yyleng-1); /* yyleng = length(yytext) */ strcpy(yylval.s, yytext+1); yylval.s[yyleng-2] = '\0'; return TAG; } /* check_id - check for (x|X)(m|M)(l|L) */ static void check_id(const char *s) { while (*s == '_') s++; if ((s[0] == 'x' || s[0] == 'X') && (s[1] == 'm' || s[1] == 'M') && (s[2] == 'l' || s[2] == 'L')) { sprintf(errbuf, "identifier '%s' starts with or embeds '%3.3s' character sequence, which is exclusively reserved for and by the W3C XML standards (for enum constants: please ignore this warning)", yytext, s); semwarn(errbuf); } } /* install_int - convert digits to integer and return LNG token. */ static Token install_int(void) { sscanf(yytext, SOAP_ULONG_FORMAT, &yylval.i); return LNG; } /* install_hex - convert hexadecimal digits to integer and return LNG */ static Token install_hex(void) { sscanf(yytext, SOAP_XLONG_FORMAT, &yylval.i); return LNG; } /* install_num - convert digits to floating point number and return DBL */ static Token install_num(void) { sscanf(yytext, "%lf", &yylval.r); return DBL; } /* install_chr - convert character constant and return CHR. */ static Token install_chr(void) { int i = 2; if (yytext[1] == '\\') yylval.c = convchar(&i); else yylval.c = yytext[i-1]; if (yytext[i] != '\'') lexerror("Illegal character constant"); return CHR; } /* install_str - convert and store string in memory. Return STR. */ static Token install_str(void) { int i, j = 0; yylval.s = (char*)emalloc(yyleng - 1); /* yyleng = length(yytext) */ for (i = 1 + (yytext[0] == 'L'); i < (int)yyleng - 1; i++) if (yytext[i] == '\\') { if (yytext[++i] != '\n') { yylval.s[j++] = convchar(&i); i--; } } else yylval.s[j++] = yytext[i]; yylval.s[j] = '\0'; return STR; } /* install_pragma - store pragma in string. Return PRAGMA. */ static Token install_pragma(void) { yylval.s = (char*)emalloc(yyleng); /* yyleng = length(yytext) */ strncpy(yylval.s, yytext, strlen(yytext)-1); yylval.s[strlen(yytext)-1] = '\0'; return PRAGMA; } static void directive(void) { int i, j, k; char *s; Service *sp; Method *m; Data *d; int service; for (i = 0; yytext[i]; i++) if (yytext[i] <= 32) break; for (; yytext[i]; i++) if (yytext[i] > 32) break; for (j = i; yytext[j]; j++) if (yytext[j] <= 32) break; if (i == j) return; s = (char*)emalloc(j-i+1); for (k = 0; k < j-i; k++) { s[k] = yytext[k+i]; if (s[k] == '_') s[k] = '-'; } s[k] = '\0'; for (sp = services; sp; sp = sp->next) if (!strcmp(sp->ns, s)) break; if (!sp) { sp = (Service*)emalloc(sizeof(Service)); sp->next = services; sp->ns = s; sp->name = NULL; sp->porttype = NULL; sp->portname = NULL; sp->binding = NULL; sp->definitions = NULL; sp->transport = NULL; sp->URL = NULL; sp->URI = NULL; sp->URI2 = NULL; sp->WSDL = NULL; sp->style = NULL; sp->encoding = NULL; sp->protocol = NULL; sp->xsi_type = 0; sp->elementForm = NULL; sp->attributeForm = NULL; sp->executable = NULL; sp->import = NULL; sp->documentation = NULL; sp->list = NULL; sp->data = NULL; services = sp; } for (i = j; yytext[i]; i++) if (yytext[i] > 32) break; if (!strncmp(yytext+i, "service", 7) || !strncmp(yytext+i, "schema", 6)) { service = strncmp(yytext+i, "schema", 6); for (i += 7; yytext[i]; i++) if (yytext[i] > 32) break; for (j = i; yytext[j]; j++) if (yytext[j] <= 32) break; for (; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] <= 32) break; /* if (j == k) return; */ s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; if (!strncmp(yytext+i, "name:", 5)) { sp->name = s; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; sp->documentation = s; } else if (!strncmp(yytext+i, "type:", 5) || !strncmp(yytext+i, "portType:", 9) || !strncmp(yytext+i, "interface:", 10)) sp->porttype = s; else if (!strncmp(yytext+i, "portName:", 9)) sp->portname = s; else if (!strncmp(yytext+i, "binding:", 8)) sp->binding = s; else if (!strncmp(yytext+i, "definitions:", 12)) sp->definitions = s; else if (!strncmp(yytext+i, "documentation:", 14)) { for (k = j; yytext[k]; k++) if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; sp->documentation = s; } else if (!strncmp(yytext+i, "transport:", 10)) sp->transport = s; else if (!strncmp(yytext+i, "location:", 9) || !strncmp(yytext+i, "endpoint:", 9) || !strncmp(yytext+i, "port:", 5)) { if (sp->URL) { char *t = (char*)emalloc(strlen(sp->URL) + strlen(s) + 2); strcpy(t, sp->URL); strcat(t, " "); strcat(t, s); sp->URL = t; } else sp->URL = s; if (!service && !sp->import) sp->import = s; } else if (!strncmp(yytext+i, "executable:", 11)) sp->executable = s; else if (!strncmp(yytext+i, "namespace:", 10)) { if (service) { if (!sp->URI) sp->URI = s; sp->WSDL = s; } else if (!strcmp(sp->ns, "SOAP-ENV")) { if (soap_version > 0) semwarn("option -1 or -2 overrides SOAP-ENV namespace"); else envURI = s; sp->URI = (char*)envURI; } else if (!strcmp(sp->ns, "SOAP-ENC")) { if (soap_version > 0) semwarn("option -1 or -2 overrides SOAP-ENC namespace"); else encURI = s; sp->URI = (char*)encURI; } else sp->URI = s; } else if (!strncmp(yytext+i, "namespace2:", 11)) { sp->URI2 = s; } else if (!strncmp(yytext+i, "typed:", 6)) { sp->xsi_type = (*s == 'y'); } else if (!strncmp(yytext+i, "form:", 5)) { sp->elementForm = s; sp->attributeForm = s; } else if (!strncmp(yytext+i, "elementForm:", 12)) sp->elementForm = s; else if (!strncmp(yytext+i, "attributeForm:", 14)) sp->attributeForm = s; else if (!strncmp(yytext+i, "import:", 7)) { if (!sp->URI) sp->URI = s; sp->import = s; } else if (!strncmp(yytext+i, "encoding:", 9)) { if (!strcmp(s, "encoded")) sp->encoding = ""; else sp->encoding = s; } else if (!strncmp(yytext+i, "style:", 6)) sp->style = s; else if (!strncmp(yytext+i, "protocol:", 9)) sp->protocol = s; else if (!strncmp(yytext+i, "method-protocol:", 16)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = PROTOCOL; m->part = NULL; m->next = sp->list; sp->list = m; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-style:", 13)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = STYLE; m->part = NULL; m->next = sp->list; sp->list = m; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-encoding:", 16)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = ENCODING; m->part = NULL; m->next = sp->list; sp->list = m; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; if (strcmp(s, "encoded")) m->part = s; else m->part = ""; } else if (!strncmp(yytext+i, "method-response-encoding:", 25)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = RESPONSE_ENCODING; m->part = NULL; m->next = sp->list; sp->list = m; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; if (strcmp(s, "encoded")) m->part = s; else m->part = ""; } else if (!strncmp(yytext+i, "method-documentation:", 21)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = COMMENT; m->part = NULL; m->next = sp->list; sp->list = m; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-action:", 14)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = ACTION; m->part = NULL; m->next = sp->list; sp->list = m; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-input-action:", 20)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = REQUEST_ACTION; m->part = NULL; m->next = sp->list; sp->list = m; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-output-action:", 21)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = RESPONSE_ACTION; m->part = NULL; m->next = sp->list; sp->list = m; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-fault-action:", 20)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = FAULT_ACTION; m->part = NULL; m->next = sp->list; sp->list = m; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-mime-type:", 17)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = MIMEIN | MIMEOUT; m->part = NULL; m->next = sp->list; sp->list = m; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] <= 32) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-input-mime-type:", 23)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = MIMEIN; m->part = NULL; m->next = sp->list; sp->list = m; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] <= 32) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-output-mime-type:", 24)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = MIMEOUT; m->part = NULL; m->next = sp->list; sp->list = m; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] <= 32) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-header-part:", 19)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = HDRIN | HDROUT; m->part = NULL; m->next = sp->list; sp->list = m; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] <= 32) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-input-header-part:", 25)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = HDRIN; m->part = NULL; m->next = sp->list; sp->list = m; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] <= 32) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-output-header-part:", 26)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = HDROUT; m->part = NULL; m->next = sp->list; sp->list = m; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] <= 32) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-fault:", 13)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = FAULT; m->part = NULL; m->next = sp->list; sp->list = m; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] <= 32) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "type-documentation:", 19)) { d = (Data*)emalloc(sizeof(Data)); d->name = s; d->text = NULL; d->next = sp->data; sp->data = d; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; d->text = s; } else { sprintf(errbuf, "unrecognized gsoap directive: %s", yytext+i); semwarn(errbuf); } } else { sprintf(errbuf, "unrecognized gsoap directive: %s", yytext); semwarn(errbuf); } } static void option(void) { int i; if (imports) { sprintf(errbuf, "options directive: %s ignored in imported file(s)", yytext); semwarn(errbuf); return; } for (i = 0; yytext[i]; i++) if (yytext[i] <= 32) break; for (; yytext[i]; i++) if (yytext[i] > 32) break; for (; yytext[i]; i++) switch (yytext[i]) { case 'a': aflag = 1; break; case 'c': if (yytext[i+1] == '+' && yytext[i+2] == '+') { i += 2; if (yytext[i+1] == '1' && yytext[i+2] == '1') { i += 2; c11flag = 1; } cflag = 0; } else cflag = 1; break; case 'e': eflag = 1; break; case 'n': nflag = 1; break; case 'l': lflag = 1; break; case 't': tflag = 1; break; case 'w': wflag = 1; break; default: if (yytext[i] < 32 || yytext[i] == '/') return; } } static void xpath(void) { int i, j, k; char *s; XPath *xp; for (i = 0; yytext[i]; i++) if (yytext[i] <= 32) break; for (; yytext[i]; i++) if (yytext[i] > 32) break; for (j = i; yytext[j]; j++) if (yytext[j] <= 32) break; if (i == j) return; for (k = j; yytext[k]; k++) if (yytext[k] > 32) break; s = (char*)emalloc(yyleng - i); strncpy(s, yytext + i, j - i); s[j - i] = '\0'; for (xp = xpaths; xp; xp = xp->next) if (!strcmp(xp->name, s)) break; if (!xp) { xp = (XPath*)emalloc(sizeof(XPath)); xp->next = xpaths; xp->name = s; } s += j - i + 1; strcpy(s, yytext + k); xp->path = s; while (*s > 32) s++; *s = '\0'; } /* error_chr - lexical error in character constant. Return character 0 to allow parsing to continue */ static Token error_chr(void) { lexerror("Ending-' missing in character constant"); yylval.c = '\0'; return CHR; } /* error_str - lexical error in string. Return empty string to allow parsing to continue */ static Token error_str(void) { lexerror("Ending-\" missing in string"); yylval.s = ""; return STR; } /* Character conversion functions */ static int convchar(int *p) { switch (yytext[(*p)++]) { case 'a': return '\a'; case 'b': return '\b'; case 'f': return '\f'; case 'n': return '\n'; case 'r': return '\r'; case 't': return '\t'; case 'v': return '\v'; case 'x': return hexchar(p); case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': (*p)--; return octchar(p); default: return yytext[*p-1]; } } static int hexchar(int *p) { int i, d, c = 0; for (i = 0; isxdigit(d = yytext[*p]) && i < 2; i++) { c = (c << 4) + (d <= '9' ? d - '0' : toupper(d) - '7'); (*p)++; } return c; } static int octchar(int *p) { int i, d, c = 0; for (i = 0; (d = yytext[*p]) >= '0' && d <= '7' && i < 3; i++) { c = (c << 3) + d - '0'; (*p)++; } return c; } static void module(const char *name, const char *fullname) { char *s; if (!fullname) fullname = name; if (imports) { Pragma **pp; s = (char*)emalloc(strlen(fullname)+15); sprintf(s, "#include \"%sH.h\"", fullname); for (pp = &pragmas; *pp; pp = &(*pp)->next) if (!strcmp((*pp)->pragma, s)) break; if (!*pp) { *pp = (Pragma*)emalloc(sizeof(Pragma)); (*pp)->pragma = s; (*pp)->next = NULL; } s = (char*)emalloc(strlen(fullname)+1); imported = strcpy(s, fullname); fprintf(stderr, "Importing module '%s'\n\n", fullname); } else { lflag = 1; typeNO = magic(name); s = (char*)emalloc(strlen(fullname)+1); prefix = strcpy(s, fullname); fprintf(stderr, "Compiling module '%s' (magic number = %d)\n\n", fullname, typeNO); } } static int magic(const char *name) { size_t i; int n; if (strlen(name) > 4) semerror("#module name length must not exceed four characters"); n = 0; for (i = 0; i < strlen(name); i++) if (name[i] >= 'a' && name[i] <= 'z') n = 26*n + name[i] - 'a'; else if (name[i] >= 'A' && name[i] <= 'Z') n = 26*n + name[i] - 'A'; else semerror("#module name must be alphabetic and the length must not exceed four characters.\nUse '#module name longname' for longer names."); return 4699*n + 153424; } #ifdef WITH_LEX static void import(const char *file) { execerror("Cannot #import: soapcpp2 not compiled with flex (replace lex with flex)"); } #else static void import(const char *file) { char buf[1024]; struct importlist *p; if (vflag) fprintf(stderr, "Importing '%s': ", file); for (p = importlist; p; p = p->next) { if (!strcmp(p->name, file)) { if (vflag) fprintf(stderr, "file already read or currently being read\n\n"); return; } } if (imports >= MAX_IMPORT_DEPTH) execerror("Imports nested too deep"); instk[imports] = YY_CURRENT_BUFFER; fnstk[imports] = filename; lnstk[imports] = yylineno; imstk[imports] = imported; yylineno = 1; /* imported = NULL; this is useful to change the semantics of #import to NOT consider non-module imports to be part of the current module */ imports++; buf[0] = '\0'; if (!(yyin = fopen(file, "r"))) { if (importpath) { const char *s, *t; s = importpath; do { size_t n; t = strstr(s, SOAP_PATHSEP); if (t) { if ((size_t)(t - s) >= sizeof(buf)) t = s + sizeof(buf) - 1; strncpy(buf, s, t - s); buf[t - s] = '\0'; s = t + sizeof(SOAP_PATHSEP) - 1; } else { strcpy(buf, s); s = NULL; } n = strlen(buf) - 1; #ifdef __VMS if (buf[n] != ']' && buf[n] != ':') strcat(buf, ":"); #else if (buf[n] != SOAP_PATHCAT[0]) strcat(buf, SOAP_PATHCAT); #endif strcat(buf, file); yyin = fopen(buf, "r"); } while (s && !yyin); } if (!yyin) { sprintf(errbuf, "#import: Cannot open file \"%s\" for reading.\nHint: use option -I (for example -Igsoap/import"SOAP_PATHSEP"gsoap/custom:.)", file); execerror(errbuf); } } if (vflag) { if (buf[0]) fprintf(stderr, "OK, found at %s\n\n", buf); else fprintf(stderr, "OK\n\n"); } p = (struct importlist*)emalloc(sizeof(struct importlist) + strlen(file)); /* has already + 1 byte size */ strcpy(p->name, file); filename = p->name; p->next = importlist; importlist = p; yy_switch_to_buffer(yy_create_buffer(yyin, YY_BUF_SIZE)); } #endif gsoap-2.8.28/gsoap/src/soapcpp2_yacc.y0000644000175000017500000033430612653650160017121 0ustar ellertellert/* soapcpp2_yacc.y Yacc/Bison grammar. Build notes: 1. Bison 1.6 is known to crash on Win32 systems if YYINITDEPTH is too small Compile with -DYYINITDEPTH=5000 2. This grammar has one shift/reduce conflict related to the use of a class declaration with a base class (e.g. class Y : public X) and the use of a maxOccurs (class Y :10). Internally the conflict is resolved in favor of a shift by Bison/Yacc, which leads to the correct parsing behavior. Therefore, the warning can be ignored. If this leads to an error, then please enable the following directive (around line 121): %expect 1 // Bison: ignore one shift/reduce conflict -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc. All Rights Reserved. This part of the software is released under ONE of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ %{ #include "soapcpp2.h" #ifdef WIN32 #ifndef __STDC__ #define __STDC__ #endif #define YYINCLUDED_STDLIB_H #ifdef WIN32_WITHOUT_SOLARIS_FLEX extern int soapcpp2lex(void); #else extern int yylex(void); #endif #else extern int yylex(void); #endif #define MAXNEST 16 /* max. nesting depth of scopes */ typedef struct Scope { Table *table; Entry *entry; Node node; LONG64 val; int offset; Bool grow; /* true if offset grows with declarations */ Bool mask; /* true if enum is mask */ } Scope; Scope stack[MAXNEST], /* stack of tables and offsets */ *sp; /* current scope stack pointer */ Table *classtable = NULL, *enumtable = NULL, *typetable = NULL, *booltable = NULL, *templatetable = NULL; const char *namespaceid = NULL; int transient = 0; int permission = 0; int custom_header = 1; int custom_fault = 1; Pragma *pragmas = NULL; Tnode *qname = NULL; Tnode *xml = NULL; /* function prototypes for support routine section */ static Entry *undefined(Symbol*); static Tnode *mgtype(Tnode*, Tnode*); static Node op(const char*, Node, Node), iop(const char*, Node, Node), relop(const char*, Node, Node); static void mkscope(Table*, int), enterscope(Table*, int), exitscope(void); static int integer(Tnode*), real(Tnode*), numeric(Tnode*); static void add_soap(void), add_XML(void), add_qname(void), add_header(void), add_fault(void), add_response(Entry*, Entry*), add_result(Tnode*), add_request(Symbol*, Scope*); /* imported from symbol2.c */ extern int is_string(Tnode*), is_wstring(Tnode*), is_XML(Tnode*), is_smart(Tnode*); extern char *c_storage(Storage); extern const char *c_type(Tnode*); extern int is_primitive_or_string(Tnode*), is_stdstr(Tnode*), is_binary(Tnode*), is_external(Tnode*), is_mutable(Entry*); extern Entry *unlinklast(Table*); /* Temporaries used in semantic rules */ int i; char *s, *s1; const char *s2; Symbol *sym; Entry *p, *q; Tnode *t; Node tmp, c; Pragma **pp; %} /* We expect one shift-reduce conflict, see build notes in the header above */ /* %expect 1 */ /* directive is not compatible with Yacc */ /* If Yacc complains then remove the line above to allow Yacc to proceed */ %union { Symbol *sym; LONG64 i; double r; char c; char *s; Tnode *typ; Storage sto; Node rec; Entry *e; } /* pragmas */ %token PRAGMA /* keywords */ %token AUTO DOUBLE INT STRUCT %token BREAK ELSE LONG SWITCH %token CASE ENUM REGISTER TYPEDEF %token CHAR EXTERN RETURN UNION %token CONST FLOAT SHORT UNSIGNED %token CONTINUE FOR SIGNED VOID %token DEFAULT GOTO SIZEOF VOLATILE %token DO IF STATIC WHILE %token CLASS PRIVATE PROTECTED PUBLIC %token VIRTUAL INLINE OPERATOR LLONG %token BOOL CFALSE CTRUE WCHAR %token TIME USING NAMESPACE ULLONG %token MUSTUNDERSTAND SIZE FRIEND %token TEMPLATE EXPLICIT TYPENAME MUTABLE %token FINAL null RESTRICT OVERRIDE %token UCHAR USHORT UINT ULONG /* */ %token NONE /* identifiers (TYPE = typedef identifier) */ %token ID LAB TYPE /* constants */ %token LNG %token DBL %token CHR %token TAG STR /* types and related */ %type type %type store virtual const abstract %type fname struct class base enum enumsc mask masksc %type id sc arg name %type tag patt %type utype %type cdbl /* expressions and statements */ %type expr cexp oexp obex aexp abex rexp lexp pexp brinit init spec tspec ptrs array arrayck texpf texp qexp occurs bounds min minmax max /* terminals */ %left ',' %right '=' PA NA TA DA MA AA XA OA LA RA /* += -= *= /= %= &= ^= |= <<= >>= */ %right '?' %right ':' %left OR /* || */ %left AN /* && */ %left '|' %left '^' %left '&' %left EQ NE /* == != */ %left '<' LE '>' GE /* <= >= */ %left LS RS /* << >> */ %left '+' '-' %left '*' '/' '%' %left AR /* -> */ %token PP NN /* ++ -- */ %% /**************************************\ Program syntax \**************************************/ prog : s1 exts { if (lflag) { custom_header = 0; custom_fault = 0; } else { add_header(); add_fault(); } compile(sp->table); freetable(classtable); freetable(enumtable); freetable(typetable); freetable(booltable); freetable(templatetable); yylineno = 0; } ; s1 : /* empty */ { classtable = mktable(NULL); enumtable = mktable(NULL); typetable = mktable(NULL); booltable = mktable(NULL); templatetable = mktable(NULL); p = enter(booltable, lookup("false")); p->info.typ = mkint(); p->info.val.i = 0; p = enter(booltable, lookup("true")); p->info.typ = mkint(); p->info.val.i = 1; mkscope(mktable(mktable(NULL)), 0); } ; exts : NAMESPACE ID '{' exts1 '}' { namespaceid = $2->name; } | exts1 { } ; exts1 : /* empty */ { add_soap(); add_qname(); add_XML(); } | exts1 ext { } ; ext : dclrs ';' { } | pragma { } | t1 { } | t2 { } | error ';' { synerror("input before ; skipped"); while (sp > stack) { freetable(sp->table); exitscope(); } yyerrok; } ; pragma : PRAGMA { if ($1[1] >= 'a' && $1[1] <= 'z') { char *s; for (pp = &pragmas; *pp; pp = &(*pp)->next) ; *pp = (Pragma*)emalloc(sizeof(Pragma)); s = (char*)emalloc(strlen($1)+1); strcpy(s, $1); (*pp)->pragma = s; (*pp)->next = NULL; } else if ((i = atoi($1+2)) > 0) { yylineno = i; } else { sprintf(errbuf, "directive '%s' ignored (use #import to import files)", $1); semwarn(errbuf); } } ; /**************************************\ Declarations \**************************************/ decls : /* empty */ { transient &= ~6; permission = 0; } | dclrs ';' decls { } | PRIVATE ':' t3 decls { } | PROTECTED ':' t4 decls { } | PUBLIC ':' t5 decls { } | t1 decls t2 decls { } | error ';' { synerror("declaration expected"); yyerrok; } ; t1 : '[' { transient |= 1; } ; t2 : ']' { transient &= ~1; } ; t3 : { permission = Sprivate; } ; t4 : { permission = Sprotected; } ; t5 : { permission = 0; } ; dclrs : spec { } | spec dclr { } | spec fdclr func { } | ctor func { } | dtor func { } | dclrs ',' dclr{ } | dclrs ',' fdclr func { } | error ID { sprintf(errbuf, "undefined type in declaration of '%s'", $2->name); synerror(errbuf); yyerrok; } | error ')' { synerror("function declaration?"); yyerrok; } ; dclr : ptrs ID arrayck tag bounds brinit { if (($3.sto & Stypedef) && sp->table->level == GLOBAL) { if (($3.typ->type != Tstruct && $3.typ->type != Tunion && $3.typ->type != Tenum && $3.typ->type != Tenumsc) || strcmp($2->name, $3.typ->id->name)) { p = enter(typetable, $2); p->info.typ = mksymtype($3.typ, $2); if ($3.sto & Sextern) { p->info.typ->transient = -1; p->info.typ->extsym = $2; } else if (is_external($3.typ)) p->info.typ->transient = -3; /* extern and volatile */ else p->info.typ->transient = $3.typ->transient; if (p->info.typ->width == 0) p->info.typ->width = 8; p->info.sto = $3.sto; p->info.typ->synonym = $3.typ->sym; if ($5.hasmin) { p->info.typ->hasmin = $5.hasmin; p->info.typ->incmin = $5.incmin; p->info.typ->min = $5.min; p->info.typ->synonym = NULL; } else { p->info.typ->hasmin = $3.typ->hasmin; p->info.typ->incmin = $3.typ->incmin; p->info.typ->min = $3.typ->min; } if ($5.hasmax) { p->info.typ->hasmax = $5.hasmax; p->info.typ->incmax = $5.incmax; p->info.typ->max = $5.max; p->info.typ->synonym = NULL; } else { p->info.typ->hasmax = $3.typ->hasmax; p->info.typ->incmax = $3.typ->incmax; p->info.typ->max = $3.typ->max; } if ($5.pattern) { p->info.typ->pattern = $5.pattern; p->info.typ->synonym = NULL; } else { p->info.typ->pattern = $3.typ->pattern; } } $2->token = TYPE; } else { p = enter(sp->table, $2); p->tag = $4; p->info.typ = $3.typ; p->info.sto = (Storage)((int)$3.sto | permission); if ($6.hasval) { p->info.hasval = True; switch ($3.typ->type) { case Tchar: case Tuchar: case Tshort: case Tushort: case Tint: case Tuint: case Tlong: case Tulong: case Tllong: case Tullong: case Tenum: case Tenumsc: case Ttime: if ($6.typ->type == Tint || $6.typ->type == Tchar || $6.typ->type == Tenum || $6.typ->type == Tenumsc) { sp->val = p->info.val.i = $6.val.i; if (($3.typ->hasmin && $3.typ->min > (double)$6.val.i) || ($3.typ->hasmin && !$3.typ->incmin && $3.typ->min == (double)$6.val.i) || ($3.typ->hasmax && $3.typ->max < (double)$6.val.i) || ($3.typ->hasmax && !$3.typ->incmax && $3.typ->max == (double)$6.val.i)) semerror("initialization constant outside value range"); } else { semerror("type error in initialization constant"); p->info.hasval = False; } break; case Tfloat: case Tdouble: case Tldouble: if ($6.typ->type == Tfloat || $6.typ->type == Tdouble || $6.typ->type == Tldouble) { p->info.val.r = $6.val.r; if (($3.typ->hasmin && $3.typ->min > $6.val.r) || ($3.typ->hasmin && !$3.typ->incmin && $3.typ->min == $6.val.r) || ($3.typ->hasmax && $3.typ->max < $6.val.r) || ($3.typ->hasmax && !$3.typ->incmax && $3.typ->max == $6.val.r)) semerror("initialization constant outside value range"); } else if ($6.typ->type == Tint) { p->info.val.r = (double)$6.val.i; if (($3.typ->hasmin && $3.typ->min > (double)$6.val.i) || ($3.typ->hasmin && !$3.typ->incmin && $3.typ->min == (double)$6.val.i) || ($3.typ->hasmax && $3.typ->max < (double)$6.val.i) || ($3.typ->hasmax && !$3.typ->incmax && $3.typ->max == (double)$6.val.i)) semerror("initialization constant outside value range"); } else { semerror("type error in initialization constant"); p->info.hasval = False; } break; default: if ($3.typ->type == Tpointer && (((Tnode*)$3.typ->ref)->type == Tchar || ((Tnode*)$3.typ->ref)->type == Twchar) && $6.typ->type == Tpointer && ((Tnode*)$6.typ->ref)->type == Tchar) p->info.val.s = $6.val.s; else if (bflag && $3.typ->type == Tarray && ((Tnode*)$3.typ->ref)->type == Tchar && $6.typ->type == Tpointer && ((Tnode*)$6.typ->ref)->type == Tchar) { if ($3.typ->width / ((Tnode*)$3.typ->ref)->width - 1 < (int)strlen($6.val.s)) { semerror("char[] initialization constant too long"); p->info.val.s = ""; } else { p->info.val.s = $6.val.s; } } else if (($3.typ->type == Tpointer || is_smart($3.typ)) && (((Tnode*)$3.typ->ref)->id == lookup("std::string") || ((Tnode*)$3.typ->ref)->id == lookup("std::wstring"))) { p->info.val.s = $6.val.s; } else if ($3.typ->id == lookup("std::string") || $3.typ->id == lookup("std::wstring")) { p->info.val.s = $6.val.s; } else if ($3.typ->type == Tpointer && $6.typ->type == Tint && $6.val.i == 0) { p->info.val.i = 0; } else { semerror("type error in initialization constant"); p->info.hasval = False; } break; } } else { p->info.val.i = sp->val; } if ($5.minOccurs < 0) { if ($6.hasval || ($3.sto & Sattribute) || $3.typ->type == Tpointer || $3.typ->type == Ttemplate || !strncmp($2->name, "__size", 6)) p->info.minOccurs = 0; else p->info.minOccurs = 1; } else { p->info.minOccurs = $5.minOccurs; } p->info.maxOccurs = $5.maxOccurs; if (sp->mask) sp->val <<= 1; else sp->val++; p->info.offset = sp->offset; if ($3.sto & Sextern) p->level = GLOBAL; else if ($3.sto & Stypedef) ; else if (sp->grow) sp->offset += p->info.typ->width; else if (p->info.typ->width > sp->offset) sp->offset = p->info.typ->width; } sp->entry = p; } ; fdclr : ptrs name { if ($1.sto & Stypedef) { sprintf(errbuf, "invalid typedef qualifier for '%s'", $2->name); semwarn(errbuf); } p = enter(sp->table, $2); p->info.typ = $1.typ; p->info.sto = $1.sto; p->info.hasval = False; p->info.offset = sp->offset; if (sp->grow) sp->offset += p->info.typ->width; else if (p->info.typ->width > sp->offset) sp->offset = p->info.typ->width; sp->entry = p; } ; id : ID { $$ = $1; } | TYPE { $$ = $1; } ; name : ID { $$ = $1; } | OPERATOR '!' { $$ = lookup("operator!"); } | OPERATOR '~' { $$ = lookup("operator~"); } | OPERATOR '=' { $$ = lookup("operator="); } | OPERATOR PA { $$ = lookup("operator+="); } | OPERATOR NA { $$ = lookup("operator-="); } | OPERATOR TA { $$ = lookup("operator*="); } | OPERATOR DA { $$ = lookup("operator/="); } | OPERATOR MA { $$ = lookup("operator%="); } | OPERATOR AA { $$ = lookup("operator&="); } | OPERATOR XA { $$ = lookup("operator^="); } | OPERATOR OA { $$ = lookup("operator|="); } | OPERATOR LA { $$ = lookup("operator<<="); } | OPERATOR RA { $$ = lookup("operator>>="); } | OPERATOR OR { $$ = lookup("operator||"); } | OPERATOR AN { $$ = lookup("operator&&"); } | OPERATOR '|' { $$ = lookup("operator|"); } | OPERATOR '^' { $$ = lookup("operator^"); } | OPERATOR '&' { $$ = lookup("operator&"); } | OPERATOR EQ { $$ = lookup("operator=="); } | OPERATOR NE { $$ = lookup("operator!="); } | OPERATOR '<' { $$ = lookup("operator<"); } | OPERATOR LE { $$ = lookup("operator<="); } | OPERATOR '>' { $$ = lookup("operator>"); } | OPERATOR GE { $$ = lookup("operator>="); } | OPERATOR LS { $$ = lookup("operator<<"); } | OPERATOR RS { $$ = lookup("operator>>"); } | OPERATOR '+' { $$ = lookup("operator+"); } | OPERATOR '-' { $$ = lookup("operator-"); } | OPERATOR '*' { $$ = lookup("operator*"); } | OPERATOR '/' { $$ = lookup("operator/"); } | OPERATOR '%' { $$ = lookup("operator%"); } | OPERATOR PP { $$ = lookup("operator++"); } | OPERATOR NN { $$ = lookup("operator--"); } | OPERATOR AR { $$ = lookup("operator->"); } | OPERATOR'['']'{ $$ = lookup("operator[]"); } | OPERATOR'('')'{ $$ = lookup("operator()"); } | OPERATOR texp { s1 = c_storage($2.sto); s2 = c_type($2.typ); s = (char*)emalloc(strlen(s1) + strlen(s2) + 10); strcpy(s, "operator "); strcat(s, s1); strcat(s, s2); $$ = lookup(s); if (!$$) $$ = install(s, ID); } ; ctor : TYPE { if (!(p = entry(classtable, $1))) semerror("invalid constructor"); sp->entry = enter(sp->table, $1); sp->entry->info.typ = mknone(); sp->entry->info.sto = Snone; sp->entry->info.offset = sp->offset; sp->node.typ = mkvoid(); sp->node.sto = Snone; } ; dtor : virtual '~' TYPE { if (!(p = entry(classtable, $3))) semerror("invalid destructor"); s = (char*)emalloc(strlen($3->name) + 2); s2 = strrchr($3->name, ':'); if (s2 && *(s2+1) && (s2 == $3->name || *(s2-1) != ':')) { strncpy(s, $3->name, s2 - $3->name + 1); strcat(s, "~"); strcat(s, s2 + 1); } else { strcpy(s, "~"); strcat(s, $3->name); } sym = lookup(s); if (!sym) sym = install(s, ID); sp->entry = enter(sp->table, sym); sp->entry->info.typ = mknone(); sp->entry->info.sto = $1; sp->entry->info.offset = sp->offset; sp->node.typ = mkvoid(); sp->node.sto = Snone; } ; func : fname '(' s6 fargso ')' const abstract { if ($1->level == GLOBAL) { if (!($1->info.sto & Sextern) && sp->entry && sp->entry->info.typ->type == Tpointer && ((Tnode*)sp->entry->info.typ->ref)->type == Tchar) { sprintf(errbuf, "last output parameter of service operation function prototype '%s' is a pointer to a char which will only return one byte: use char** instead to return a string", $1->sym->name); semwarn(errbuf); } if ($1->info.sto & Sextern) { $1->info.typ = mkmethod($1->info.typ, sp->table); } else if (sp->entry && (sp->entry->info.typ->type == Tpointer || sp->entry->info.typ->type == Treference || sp->entry->info.typ->type == Tarray || is_transient(sp->entry->info.typ))) { if ($1->info.typ->type == Tint) { sp->entry->info.sto = (Storage)((int)sp->entry->info.sto | (int)Sreturn); $1->info.typ = mkfun(sp->entry); $1->info.typ->id = $1->sym; if (!is_transient(sp->entry->info.typ)) { if (!is_response(sp->entry->info.typ)) { if (!is_XML(sp->entry->info.typ)) add_response($1, sp->entry); } else { add_result(sp->entry->info.typ); } } add_request($1->sym, sp); } else { sprintf(errbuf, "return type of service operation function prototype '%s' must be integer", $1->sym->name); semerror(errbuf); } } else { sprintf(errbuf, "last output parameter of service operation function prototype '%s' is a return parameter and must be a pointer or reference, or use %s(..., void) for one-way sends", $1->sym->name, $1->sym->name); semerror(errbuf); } } else if ($1->level == INTERNAL) { $1->info.typ = mkmethod($1->info.typ, sp->table); $1->info.sto = (Storage)((int)$1->info.sto | (int)$6 | (int)$7); transient &= ~1; } exitscope(); } ; fname : { $$ = sp->entry; } ; fargso : /* empty */ { } | fargs { } ; fargs : farg { } | farg ',' fargs{ } | error ID { sprintf(errbuf, "undefined '%s'", $2->name); synerror(errbuf); } | error ',' { synerror("formal argument expected"); yyerrok; } ; farg : tspec ptrs arg arrayck occurs init { if ($4.sto & Stypedef) semwarn("typedef in function argument"); p = enter(sp->table, $3); p->info.typ = $4.typ; p->info.sto = $4.sto; if ($5.minOccurs < 0) { if ($6.hasval || ($4.sto & Sattribute) || $4.typ->type == Tpointer) p->info.minOccurs = 0; else p->info.minOccurs = 1; } else { p->info.minOccurs = $5.minOccurs; } p->info.maxOccurs = $5.maxOccurs; if ($6.hasval) { p->info.hasval = True; switch ($4.typ->type) { case Tchar: case Tuchar: case Tshort: case Tushort: case Tint: case Tuint: case Tlong: case Tulong: case Tenum: case Tenumsc: case Ttime: if ($6.typ->type == Tint || $6.typ->type == Tchar || $6.typ->type == Tenum || $6.typ->type == Tenumsc) { sp->val = p->info.val.i = $6.val.i; if (($4.typ->hasmin && $4.typ->min > (double)$6.val.i) || ($4.typ->hasmin && !$4.typ->incmin && $4.typ->min == (double)$6.val.i) || ($4.typ->hasmax && $4.typ->max < (double)$6.val.i) || ($4.typ->hasmax && !$4.typ->incmax && $4.typ->max == (double)$6.val.i)) semerror("initialization constant outside value range"); } else { semerror("type error in initialization constant"); p->info.hasval = False; } break; case Tfloat: case Tdouble: case Tldouble: if ($6.typ->type == Tfloat || $6.typ->type == Tdouble || $6.typ->type == Tldouble) { p->info.val.r = $6.val.r; if (($4.typ->hasmin && $4.typ->min > $6.val.r) || ($4.typ->hasmin && !$4.typ->incmin && $4.typ->min == $6.val.r) || ($4.typ->hasmax && $4.typ->max < $6.val.r) || ($4.typ->hasmax && !$4.typ->incmax && $4.typ->max == $6.val.r)) semerror("initialization constant outside value range"); } else if ($6.typ->type == Tint) { p->info.val.r = (double)$6.val.i; if (($4.typ->hasmin && $4.typ->min > (double)$6.val.i) || ($4.typ->hasmin && !$4.typ->incmin && $4.typ->min == (double)$6.val.i) || ($4.typ->hasmax && $4.typ->max < (double)$6.val.i) || ($4.typ->hasmax && !$4.typ->incmax && $4.typ->max == (double)$6.val.i)) semerror("initialization constant outside value range"); } else { semerror("type error in initialization constant"); p->info.hasval = False; } break; default: if ($4.typ->type == Tpointer && (((Tnode*)$4.typ->ref)->type == Tchar || ((Tnode*)$4.typ->ref)->type == Twchar) && $6.typ->type == Tpointer && ((Tnode*)$6.typ->ref)->type == Tchar) { p->info.val.s = $6.val.s; } else if (($4.typ->type == Tpointer || is_smart($4.typ)) && (((Tnode*)$4.typ->ref)->id == lookup("std::string") || ((Tnode*)$4.typ->ref)->id == lookup("std::wstring"))) { p->info.val.s = $6.val.s; } else if ($4.typ->id == lookup("std::string") || $4.typ->id == lookup("std::wstring")) { p->info.val.s = $6.val.s; } else if ($4.typ->type == Tpointer && $6.typ->type == Tint && $6.val.i == 0) { p->info.val.i = 0; } else { semerror("type error in initialization constant"); p->info.hasval = False; } break; } } p->info.offset = sp->offset; if ($4.sto & Sextern) p->level = GLOBAL; else if (sp->grow) sp->offset += p->info.typ->width; else if (p->info.typ->width > sp->offset) sp->offset = p->info.typ->width; sp->entry = p; } ; arg : /* empty */ { if (sp->table->level != PARAM) $$ = gensymidx("param", (int)++sp->val); else if (eflag) $$ = gensymidx("_param", (int)++sp->val); else $$ = gensym("_param"); } | ID { if (soap_version == 2 && *$1->name == '_' && sp->table->level == GLOBAL) { sprintf(errbuf, "SOAP 1.2 does not support anonymous parameters '%s'", $1->name); semwarn(errbuf); } $$ = $1; } ; /**************************************\ Type specification \**************************************/ /* texpf : type expression (subset of C/C++) */ texpf : texp { $$ = $1; } | tspec ptrs '(' s6 fargso ')' { $$.typ = mkmethod(tmp.typ, sp->table); transient &= ~1; exitscope(); } ; texp : tspec ptrs array { $$ = $3; } | tspec ptrs ID array { $$ = $4; } ; spec : /*empty */ { $$.typ = mkint(); $$.sto = Snone; sp->node = $$; } | store spec { $$.typ = $2.typ; $$.sto = (Storage)((int)$1 | (int)$2.sto); if (($$.sto & Sattribute)) { if (is_smart($2.typ)) { if (!is_primitive_or_string($2.typ->ref) && !is_stdstr($2.typ->ref) && !is_binary($2.typ->ref) && !is_external($2.typ->ref)) { semwarn("invalid attribute smart pointer @type"); $$.sto = (Storage)((int)$$.sto & ~Sattribute); } } else if ($2.typ->type == Tpointer) { if (!is_primitive_or_string($2.typ->ref) && !is_stdstr($2.typ->ref) && !is_binary($2.typ->ref) && !is_external($2.typ->ref)) { semwarn("invalid attribute pointer @type"); $$.sto = (Storage)((int)$$.sto & ~Sattribute); } } else if ( !is_primitive_or_string($2.typ) && !is_stdstr($2.typ) && !is_binary($2.typ) && !is_external($2.typ)) { semwarn("invalid attribute @type"); $$.sto = (Storage)((int)$$.sto & ~Sattribute); } } sp->node = $$; if ($1 & Sextern) transient = 0; } | type spec { if ($1->type == Tint) switch ($2.typ->type) { case Tchar: $$.typ = $2.typ; break; case Tshort: $$.typ = $2.typ; break; case Tint: $$.typ = $1; break; case Tlong: $$.typ = $2.typ; break; case Tllong: $$.typ = $2.typ; break; default: semwarn("invalid int type specified"); $$.typ = $2.typ; } else if ($1->type == Tuint) switch ($2.typ->type) { case Tchar: $$.typ = mkuchar(); break; case Tshort: $$.typ = mkushort(); break; case Tint: $$.typ = $1; break; case Tlong: $$.typ = mkulong(); break; case Tllong: $$.typ = mkullong(); break; default: semwarn("invalid unsigned type specified"); $$.typ = $2.typ; } else if ($1->type == Tlong) switch ($2.typ->type) { case Tint: $$.typ = $1; break; case Tlong: $$.typ = mkllong(); break; case Tuint: $$.typ = mkulong(); break; case Tulong: $$.typ = mkullong(); break; case Tdouble: $$.typ = mkldouble(); break; default: semwarn("invalid use of 'long'"); $$.typ = $2.typ; } else if ($1->type == Tulong) switch ($2.typ->type) { case Tint: $$.typ = $1; break; case Tlong: $$.typ = mkullong(); break; case Tuint: $$.typ = $1; break; case Tulong: $$.typ = mkullong(); break; default: semwarn("invalid use of 'long'"); $$.typ = $2.typ; } else if ($2.typ->type == Tint) $$.typ = $1; else semwarn("invalid type specified (missing ';' or type name used as non-type identifier?)"); $$.sto = $2.sto; sp->node = $$; } ; tspec : store { $$.typ = mkint(); $$.sto = $1; sp->node = $$; if ($1 & Sextern) transient = 0; } | type { $$.typ = $1; $$.sto = Snone; sp->node = $$; } | store tspec { $$.typ = $2.typ; $$.sto = (Storage)((int)$1 | (int)$2.sto); if (($$.sto & Sattribute)) { if (is_smart($2.typ)) { if (!is_primitive_or_string($2.typ->ref) && !is_stdstr($2.typ->ref) && !is_binary($2.typ->ref) && !is_external($2.typ->ref)) { semwarn("invalid attribute smart pointer @type"); $$.sto = (Storage)((int)$$.sto & ~Sattribute); } } else if ($2.typ->type == Tpointer) { if (!is_primitive_or_string($2.typ->ref) && !is_stdstr($2.typ->ref) && !is_binary($2.typ->ref) && !is_external($2.typ->ref)) { semwarn("invalid attribute pointer @type"); $$.sto = (Storage)((int)$$.sto & ~Sattribute); } } else if ( !is_primitive_or_string($2.typ) && !is_stdstr($2.typ) && !is_binary($2.typ) && !is_external($2.typ)) { semwarn("invalid attribute @type"); $$.sto = (Storage)((int)$$.sto & ~Sattribute); } } sp->node = $$; if ($1 & Sextern) transient = 0; } | type tspec { if ($1->type == Tint) switch ($2.typ->type) { case Tchar: $$.typ = $2.typ; break; case Tshort: $$.typ = $2.typ; break; case Tint: $$.typ = $1; break; case Tlong: $$.typ = $2.typ; break; case Tllong: $$.typ = $2.typ; break; default: semwarn("invalid int type specified"); $$.typ = $2.typ; } else if ($1->type == Tuint) switch ($2.typ->type) { case Tchar: $$.typ = mkuchar(); break; case Tshort: $$.typ = mkushort(); break; case Tint: $$.typ = $1; break; case Tlong: $$.typ = mkulong(); break; case Tllong: $$.typ = mkullong(); break; default: semwarn("invalid unsigned type specified"); $$.typ = $2.typ; } else if ($1->type == Tlong) switch ($2.typ->type) { case Tint: $$.typ = $1; break; case Tlong: $$.typ = mkllong(); break; case Tuint: $$.typ = mkulong(); break; case Tulong: $$.typ = mkullong(); break; case Tdouble: $$.typ = mkldouble(); break; default: semwarn("invalid use of 'long'"); $$.typ = $2.typ; } else if ($1->type == Tulong) switch ($2.typ->type) { case Tint: $$.typ = $1; break; case Tlong: $$.typ = mkullong(); break; case Tuint: $$.typ = $1; break; case Tulong: $$.typ = mkullong(); break; default: semwarn("invalid use of 'long'"); $$.typ = $2.typ; } else if ($2.typ->type == Tint) $$.typ = $1; else semwarn("invalid type specified (missing ';' or type name used as non-type identifier?)"); $$.sto = $2.sto; sp->node = $$; } ; type : VOID { $$ = mkvoid(); } | BOOL { $$ = mkbool(); } | CHAR { $$ = mkchar(); } | WCHAR { $$ = mkwchart(); } | SHORT { $$ = mkshort(); } | INT { $$ = mkint(); } | LONG { $$ = mklong(); } | LLONG { $$ = mkllong(); } | ULLONG { $$ = mkullong(); } | SIZE { $$ = mksize(); } | FLOAT { $$ = mkfloat(); } | DOUBLE { $$ = mkdouble(); } | SIGNED { $$ = mkint(); } | UNSIGNED { $$ = mkuint(); } | UCHAR { $$ = mkuchar(); } | USHORT { $$ = mkushort(); } | UINT { $$ = mkuint(); } | ULONG { $$ = mkulong(); } | TIME { $$ = mktimet(); } | TEMPLATE '<' tname id '>' CLASS id { if (!(p = entry(templatetable, $7))) { p = enter(templatetable, $7); p->info.typ = mktemplate(NULL, $7); $7->token = TYPE; } $$ = p->info.typ; } | CLASS '{' s2 decls '}' { sym = gensym("_Struct"); sprintf(errbuf, "anonymous class will be named '%s'", sym->name); semwarn(errbuf); if ((p = entry(classtable, sym))) { if (p->info.typ->ref || p->info.typ->type != Tclass) { sprintf(errbuf, "class '%s' already declared at %s:%d", sym->name, p->filename, p->lineno); semerror(errbuf); } } else { p = enter(classtable, sym); p->info.typ = mkclass(NULL, 0); } sym->token = TYPE; sp->table->sym = sym; p->info.typ->ref = sp->table; p->info.typ->width = sp->offset; p->info.typ->id = sym; $$ = p->info.typ; exitscope(); } | class '{' s2 decls '}' { if ((p = entry(classtable, $1->sym)) && p->info.typ->ref) { if (is_mutable(p)) { if (merge((Table*)p->info.typ->ref, sp->table)) { sprintf(errbuf, "member name clash in class '%s' declared at line %d", $1->sym->name, p->lineno); semerror(errbuf); } p->info.typ->width += sp->offset; } } else { p = reenter(classtable, $1->sym); sp->table->sym = p->sym; p->info.typ->ref = sp->table; p->info.typ->width = sp->offset; p->info.typ->id = p->sym; if (p->info.typ->base) sp->table->prev = (Table*)entry(classtable, p->info.typ->base)->info.typ->ref; } $$ = p->info.typ; exitscope(); } | class ':' base '{' s2 decls '}' { p = reenter(classtable, $1->sym); sp->table->sym = p->sym; if (!$3) { semerror("invalid base class"); } else { sp->table->prev = (Table*)$3->info.typ->ref; if (!sp->table->prev && !$3->info.typ->transient) { sprintf(errbuf, "class '%s' has incomplete type (if this class is not serializable then declare 'extern class %s)'", $3->sym->name, $3->sym->name); semerror(errbuf); } p->info.typ->base = $3->info.typ->id; } p->info.typ->ref = sp->table; p->info.typ->width = sp->offset; p->info.typ->id = p->sym; $$ = p->info.typ; exitscope(); } | class { $1->info.typ->id = $1->sym; $$ = $1->info.typ; } | class ':' base { if (!$3) { semerror("invalid base class"); } else { if (!$3->info.typ->ref && !$3->info.typ->transient) { sprintf(errbuf, "class '%s' has incomplete type (if this class is not serializable then declare 'extern class %s)'", $3->sym->name, $3->sym->name); semerror(errbuf); } $1->info.typ->base = $3->info.typ->id; } $1->info.typ->id = $1->sym; $$ = $1->info.typ; } | STRUCT '{' s2 decls '}' { sym = gensym("_Struct"); sprintf(errbuf, "anonymous struct will be named '%s'", sym->name); semwarn(errbuf); if ((p = entry(classtable, sym))) { if (p->info.typ->ref || p->info.typ->type != Tstruct) { sprintf(errbuf, "struct '%s' already declared at %s:%d", sym->name, p->filename, p->lineno); semerror(errbuf); } else { p->info.typ->ref = sp->table; p->info.typ->width = sp->offset; } } else { p = enter(classtable, sym); p->info.typ = mkstruct(sp->table, sp->offset); } p->info.typ->id = sym; $$ = p->info.typ; exitscope(); } | struct '{' s2 decls '}' { if ((p = entry(classtable, $1->sym)) && p->info.typ->ref) { if (is_mutable(p)) { if (merge((Table*)p->info.typ->ref, sp->table)) { sprintf(errbuf, "member name clash in struct '%s' declared at line %d", $1->sym->name, p->lineno); semerror(errbuf); } p->info.typ->width += sp->offset; } } else { p = reenter(classtable, $1->sym); p->info.typ->ref = sp->table; p->info.typ->width = sp->offset; p->info.typ->id = p->sym; } $$ = p->info.typ; exitscope(); } | STRUCT id { if ((p = entry(classtable, $2))) { if (p->info.typ->type == Tstruct) { $$ = p->info.typ; } else { sprintf(errbuf, "'struct %s' redeclaration (line %d)", $2->name, p->lineno); semerror(errbuf); $$ = mkint(); } } else { p = enter(classtable, $2); $$ = p->info.typ = mkstruct(NULL, 0); p->info.typ->id = $2; } } | UNION '{' s3 decls '}' { sym = gensym("_Union"); sprintf(errbuf, "anonymous union will be named '%s'", sym->name); semwarn(errbuf); if ((p = entry(classtable, sym))) { if (p->info.typ->ref) { sprintf(errbuf, "union or struct '%s' already declared at %s:%d", sym->name, p->filename, p->lineno); semerror(errbuf); } else { p->info.typ->ref = sp->table; p->info.typ->width = sp->offset; } } else { p = enter(classtable, sym); p->info.typ = mkunion(sp->table, sp->offset); } p->info.typ->id = sym; $$ = p->info.typ; exitscope(); } | UNION id '{' s3 decls '}' { if ((p = entry(classtable, $2))) { if (p->info.typ->ref || p->info.typ->type != Tunion) { sprintf(errbuf, "union '%s' already declared at %s:%d", $2->name, p->filename, p->lineno); semerror(errbuf); } else { p = reenter(classtable, $2); p->info.typ->ref = sp->table; p->info.typ->width = sp->offset; } } else { p = enter(classtable, $2); p->info.typ = mkunion(sp->table, sp->offset); } p->info.typ->id = $2; $$ = p->info.typ; exitscope(); } | UNION id { if ((p = entry(classtable, $2))) { if (p->info.typ->type == Tunion) { $$ = p->info.typ; } else { sprintf(errbuf, "'union %s' redeclaration (line %d)", $2->name, p->lineno); semerror(errbuf); $$ = mkint(); } } else { p = enter(classtable, $2); $$ = p->info.typ = mkunion(NULL, 0); p->info.typ->id = $2; } } | ENUM '{' s2 dclrs s5 '}' { sym = gensym("_Enum"); sprintf(errbuf, "anonymous enum will be named '%s'", sym->name); semwarn(errbuf); if ((p = entry(enumtable, sym))) { if (p->info.typ->ref) { sprintf(errbuf, "enum '%s' already declared at %s:%d", sym->name, p->filename, p->lineno); semerror(errbuf); } else { p->info.typ->ref = sp->table; p->info.typ->width = 4; /* 4 = enum */ } } else { p = enter(enumtable, sym); p->info.typ = mkenum(sp->table); } p->info.typ->id = sym; $$ = p->info.typ; exitscope(); } | ENUM '*' '{' s2 dclrs s5 '}' { sym = gensym("_Enum"); sprintf(errbuf, "anonymous enum will be named '%s'", sym->name); semwarn(errbuf); if ((p = entry(enumtable, sym))) { if (p->info.typ->ref) { sprintf(errbuf, "enum '%s' already declared at %s:%d", sym->name, p->filename, p->lineno); semerror(errbuf); } else { p->info.typ->ref = sp->table; p->info.typ->width = 9; /* 9 = mask */ } } else { p = enter(enumtable, sym); p->info.typ = mkmask(sp->table); } p->info.typ->id = sym; $$ = p->info.typ; exitscope(); } | enum '{' s2 dclrs s5 '}' { if ((p = entry(enumtable, $1->sym))) if (!p->info.typ->ref) p->info.typ->ref = sp->table; p->info.typ->id = $1->sym; $$ = p->info.typ; exitscope(); } | enumsc '{' s2 dclrs s5 '}' { if ((p = entry(enumtable, $1->sym))) if (!p->info.typ->ref) p->info.typ->ref = sp->table; p->info.typ->id = $1->sym; $$ = p->info.typ; exitscope(); } | mask '{' s4 dclrs s5 '}' { if ((p = entry(enumtable, $1->sym))) { if (!p->info.typ->ref) { p->info.typ->ref = sp->table; p->info.typ->width = 9; /* 9 = mask */ } } p->info.typ->id = $1->sym; $$ = p->info.typ; exitscope(); } | masksc '{' s4 dclrs s5 '}' { if ((p = entry(enumtable, $1->sym))) { if (!p->info.typ->ref) { p->info.typ->ref = sp->table; p->info.typ->width = 9; /* 9 = mask */ } } p->info.typ->id = $1->sym; $$ = p->info.typ; exitscope(); } | ENUM id { if ((p = entry(enumtable, $2))) { if (p->info.typ->type != Tenum) { sprintf(errbuf, "'enum %s' used where enum class is expected", $2->name); semwarn(errbuf); } $$ = p->info.typ; } else { p = enter(enumtable, $2); $$ = p->info.typ = mkenum(NULL); p->info.typ->id = $2; } } | ENUM sc { if ((p = entry(enumtable, $2))) { if (p->info.typ->type != Tenumsc) { sprintf(errbuf, "'enum class %s' used where enum is expected", $2->name); semwarn(errbuf); } $$ = p->info.typ; } else { p = enter(enumtable, $2); $$ = p->info.typ = mkenumsc(NULL); p->info.typ->id = $2; $2->token = TYPE; } } | TYPE { if ((p = entry(typetable, $1))) { $$ = p->info.typ; } else if ((p = entry(classtable, $1))) { $$ = p->info.typ; } else if ((p = entry(enumtable, $1))) { $$ = p->info.typ; } else if ($1 == lookup("std::string") || $1 == lookup("std::wstring")) { p = enter(classtable, $1); $$ = p->info.typ = mkclass(NULL, 8); p->info.typ->id = $1; if (cflag) p->info.typ->transient = 1; /* make std::string transient in C */ else p->info.typ->transient = -2; /* otherwise volatile in C++ */ } else { sprintf(errbuf, "unknown type '%s'", $1->name); semerror(errbuf); $$ = mkint(); } } | TYPE '<' texpf '>' { if ((p = entry(templatetable, $1))) { $$ = mktemplate($3.typ, $1); if (p->info.typ->transient) $$->transient = p->info.typ->transient; } else if ($1 == lookup("std::deque")) { semwarn("To use std::deque, please also add #import \"import/stldeque.h\""); $$ = mktemplate($3.typ, $1); } else if ($1 == lookup("std::list")) { semwarn("To use std::list, please also add #import \"import/stllist.h\""); $$ = mktemplate($3.typ, $1); } else if ($1 == lookup("std::vector")) { semwarn("To use std::vector, please also add #import \"import/stlvector.h\""); $$ = mktemplate($3.typ, $1); } else if ($1 == lookup("std::set")) { semwarn("To use std::set, please also add #import \"import/stlset.h\""); $$ = mktemplate($3.typ, $1); } else if ($1 == lookup("std::queue")) { $$ = mktemplate($3.typ, $1); $$->transient = 1; /* not serializable */ } else if ($1 == lookup("std::stack")) { $$ = mktemplate($3.typ, $1); $$->transient = 1; /* not serializable */ } else if ($1 == lookup("std::shared_ptr") || $1 == lookup("std::unique_ptr") || $1 == lookup("std::auto_ptr")) { $$ = mktemplate($3.typ, $1); $$->transient = -2; /* volatile indicates smart pointer template */ } else if ($1 == lookup("std::weak_ptr") || $1 == lookup("std::function")) { $$ = mktemplate($3.typ, $1); $$->transient = 1; /* not serializable */ } else { semerror("undefined template"); $$ = mkint(); } } | error ID error { sprintf(errbuf, "undeclared '%s'", $2->name); synerror(errbuf); $$ = mkint(); } | error ID '>' { sprintf(errbuf, "perhaps trying to use a template with an undefined type parameter '%s'?", $2->name); synerror(errbuf); $$ = mkint(); } | error '>' { synerror("perhaps trying to use an undefined template or template with a non-type template parameter? Declare 'template class name'"); $$ = mkint(); } | CLASS error '}' { synerror("malformed class definition (use spacing around ':' to separate derived : base)"); yyerrok; $$ = mkint(); } | STRUCT error '}' { synerror("malformed struct definition"); yyerrok; $$ = mkint(); } | UNION error '}' { synerror("malformed union definition"); yyerrok; $$ = mkint(); } | ENUM error '}' { synerror("malformed enum definition"); yyerrok; $$ = mkint(); } ; struct : STRUCT id { if ((p = entry(classtable, $2))) { if (p->info.typ->ref) { if (!is_mutable(p)) { sprintf(errbuf, "struct '%s' already declared at %s:%d", $2->name, p->filename, p->lineno); semerror(errbuf); } } else { p = reenter(classtable, $2); } p->info.typ->transient = transient; } else { p = enter(classtable, $2); p->info.typ = mkstruct(NULL, 0); } $$ = p; } ; class : CLASS id { if ((p = entry(classtable, $2))) { if (p->info.typ->ref) { if (!is_mutable(p)) { sprintf(errbuf, "class '%s' already declared at %s:%d (redundant 'class' specifier here?)", $2->name, p->filename, p->lineno); semerror(errbuf); } } else { p = reenter(classtable, $2); } p->info.typ->transient = transient; } else { p = enter(classtable, $2); p->info.typ = mkclass(NULL, 0); p->info.typ->id = p->sym; } $2->token = TYPE; $$ = p; } ; enum : ENUM id utype { if ((p = entry(enumtable, $2))) { if (p->info.typ->ref) { sprintf(errbuf, "enum '%s' already declared at %s:%d", $2->name, p->filename, p->lineno); semerror(errbuf); } } else { p = enter(enumtable, $2); p->info.typ = mkenum(0); } p->info.typ->width = (int)$3; $$ = p; } ; enumsc : ENUM sc utype { if ((p = entry(enumtable, $2))) { if (p->info.typ->ref) { sprintf(errbuf, "enum '%s' already declared at %s:%d", $2->name, p->filename, p->lineno); semerror(errbuf); } } else { p = enter(enumtable, $2); p->info.typ = mkenumsc(0); } p->info.typ->width = (int)$3; $2->token = TYPE; $$ = p; } ; mask : ENUM '*' id utype { if ((p = entry(enumtable, $3))) { if (p->info.typ->ref) { sprintf(errbuf, "enum '%s' already declared at %s:%d", $3->name, p->filename, p->lineno); semerror(errbuf); } else { p->info.typ = mkmask(0); } } else { p = enter(enumtable, $3); p->info.typ = mkmask(0); } $$ = p; } ; masksc : ENUM '*' sc utype { if ((p = entry(enumtable, $3))) { if (p->info.typ->ref) { sprintf(errbuf, "enum '%s' already declared at %s:%d", $3->name, p->filename, p->lineno); semerror(errbuf); } else { p->info.typ = mkmasksc(0); } } else { p = enter(enumtable, $3); p->info.typ = mkmasksc(0); } $3->token = TYPE; $$ = p; } ; sc : STRUCT id { $$ = $2; if (!c11flag) semwarn("To use scoped enumerations (enum class) you must also use soapcpp2 option -c++11"); } | CLASS id { $$ = $2; if (!c11flag) semwarn("To use scoped enumerations (enum class) you must also use soapcpp2 option -c++11"); } ; utype : ':' CHAR { $$ = 1; } | ':' WCHAR { $$ = 4; } | ':' SHORT { $$ = 2; } | ':' INT { $$ = 4; } | ':' LONG { $$ = 4; } | ':' LLONG { $$ = 8; } | ':' TYPE { $$ = 4; p = entry(typetable, $2); if (!p) p = entry(enumtable, $2); if (!p) semerror("enum underlying type must be one of int8_t, int16_t, int32_t, int64_t"); else $$ = p->info.typ->width; } | ':' { semerror("enum underlying type must be one of int8_t, int16_t, int32_t, int64_t"); $$ = 4; } | /* empty */ { $$ = 4; /* 4 = enum */ } ; tname : CLASS { } | TYPENAME { } ; base : PROTECTED base{ $$ = $2; } | PRIVATE base { $$ = $2; } | PUBLIC base { $$ = $2; } | TYPE { $$ = entry(classtable, $1); if (!$$) { p = entry(typetable, $1); if (p && (p->info.typ->type == Tclass || p->info.typ->type == Tstruct)) $$ = p; } } | STRUCT ID { $$ = entry(classtable, $2); } ; s2 : /* empty */ { if (transient <= -2) transient = 0; permission = 0; enterscope(mktable(NULL), 0); sp->entry = NULL; } ; s3 : /* empty */ { if (transient <= -2) transient = 0; permission = 0; enterscope(mktable(NULL), 0); sp->entry = NULL; sp->grow = False; } ; s4 : /* empty */ { enterscope(mktable(NULL), 0); sp->entry = NULL; sp->mask = True; sp->val = 1; } ; s5 : /* empty */ { } | ',' { } ; s6 : /* empty */ { if (sp->table->level == INTERNAL) transient |= 1; permission = 0; enterscope(mktable(NULL), 0); sp->entry = NULL; sp->table->level = PARAM; } ; store : AUTO { $$ = Sauto; } | REGISTER { $$ = Sregister; } | STATIC { $$ = Sstatic; } | EXPLICIT { $$ = Sexplicit; } | EXTERN { $$ = Sextern; transient = 1; } | TYPEDEF { $$ = Stypedef; } | VIRTUAL { $$ = Svirtual; } | CONST { $$ = Sconst; } | FINAL { $$ = Sfinal; } | OVERRIDE { $$ = Soverride; } | FRIEND { $$ = Sfriend; } | INLINE { $$ = Sinline; } | MUSTUNDERSTAND{ $$ = SmustUnderstand; } | RETURN { $$ = Sreturn; } | '@' { $$ = Sattribute; if (eflag) semwarn("SOAP RPC encoding does not support XML attributes"); } | '$' { $$ = Sspecial; } | VOLATILE { $$ = Sextern; transient = -2; } | MUTABLE { $$ = Smutable; transient = -4; } ; const : /* empty */ { $$ = Snone; } | const CONST { $$ |= Sconstobj; } | const FINAL { $$ |= Sfinal; } | const OVERRIDE{ $$ |= Soverride; } ; abstract: /* empty */ { $$ = Snone; } | '=' LNG { $$ = Sabstract; } ; virtual : /* empty */ { $$ = Snone; } | VIRTUAL { $$ = Svirtual; } ; ptrs : /* empty */ { $$ = tmp = sp->node; } | ptrs '*' { /* handle const pointers, such as const char* */ if ((tmp.sto & Sconst)) tmp.sto = (Storage)(((int)tmp.sto & ~Sconst) | Sconstptr); tmp.typ = mkpointer(tmp.typ); tmp.typ->transient = transient; $$ = tmp; } | ptrs '&' { tmp.typ = mkreference(tmp.typ); tmp.typ->transient = transient; $$ = tmp; } | ptrs AN { tmp.typ = mkrvalueref(tmp.typ); tmp.typ->transient = transient; $$ = tmp; } ; array : /* empty */ { $$ = tmp; } /* tmp is inherited */ | '[' cexp ']' array { if (!bflag && $4.typ->type == Tchar) { sprintf(errbuf, "char[" SOAP_LONG_FORMAT "] will be serialized as an array of " SOAP_LONG_FORMAT " bytes: use soapcpp2 option -b to enable char[] string serialization or use char* for strings", $2.val.i, $2.val.i); semwarn(errbuf); } if ($2.hasval && $2.typ->type == Tint && $2.val.i > 0 && $4.typ->width > 0) { $$.typ = mkarray($4.typ, (int) $2.val.i * $4.typ->width); } else { $$.typ = mkarray($4.typ, 0); semerror("undetermined array size"); } $$.sto = $4.sto; } | '[' ']' array { $$.typ = mkpointer($3.typ); /* zero size array = pointer */ $$.sto = $3.sto; } ; arrayck : array { if ($1.typ->type == Tstruct || $1.typ->type == Tclass) { if (!$1.typ->ref && !$1.typ->transient && !($1.sto & Stypedef)) { if ($1.typ->type == Tstruct) sprintf(errbuf, "struct '%s' has incomplete type (if this struct is not serializable then declare 'extern struct %s)", $1.typ->id->name, $1.typ->id->name); else sprintf(errbuf, "class '%s' has incomplete type (if this class is not serializable then declare 'extern class %s)", $1.typ->id->name, $1.typ->id->name); semerror(errbuf); } } $$ = $1; } ; brinit : init { $$ = $1; } | '{' cexp '}' { if ($2.hasval) { $$.typ = $2.typ; $$.hasval = True; $$.val = $2.val; } else { $$.hasval = False; semerror("initialization expression not constant"); } } ; init : /* empty */ { $$.hasval = False; } | '=' cexp { if ($2.hasval) { $$.typ = $2.typ; $$.hasval = True; $$.val = $2.val; } else { $$.hasval = False; semerror("initialization expression not constant"); } } ; tag : /* empty */ { $$ = NULL; } | TAG { $$ = $1; } ; occurs : /* empty */ { $$.minOccurs = -1; $$.maxOccurs = 1; $$.hasmin = False; $$.hasmax = False; $$.min = 0.0; $$.max = 0.0; $$.incmin = True; $$.incmax = True; $$.pattern = NULL; } | LNG { $$.minOccurs = $1; $$.maxOccurs = 1; if ($$.minOccurs < 0) $$.minOccurs = -1; $$.hasmin = False; $$.hasmax = False; $$.min = 0.0; $$.max = 0.0; $$.incmin = True; $$.incmax = True; $$.pattern = NULL; } | LNG ':' { $$.minOccurs = $1; $$.maxOccurs = 1; if ($$.minOccurs < 0) $$.minOccurs = -1; $$.hasmin = False; $$.hasmax = False; $$.min = 0.0; $$.max = 0.0; $$.incmin = True; $$.incmax = True; $$.pattern = NULL; } | LNG ':' LNG { $$.minOccurs = $1; $$.maxOccurs = $3; if ($$.minOccurs < 0 || $$.maxOccurs < 0) { $$.minOccurs = -1; $$.maxOccurs = 1; } else if ($$.minOccurs > $$.maxOccurs) { $$.minOccurs = -1; $$.maxOccurs = 1; } $$.hasmin = False; $$.hasmax = False; $$.min = 0.0; $$.max = 0.0; $$.incmin = True; $$.incmax = True; $$.pattern = NULL; } | ':' LNG { $$.minOccurs = -1; $$.maxOccurs = $2; if ($$.maxOccurs < 0) { $$.minOccurs = -1; $$.maxOccurs = 1; } $$.hasmin = False; $$.hasmax = False; $$.min = 0.0; $$.max = 0.0; $$.incmin = True; $$.incmax = True; $$.pattern = NULL; } ; bounds : patt { $$.hasmin = False; $$.hasmax = False; $$.minOccurs = -1; $$.maxOccurs = 1; $$.min = 0.0; $$.max = 0.0; $$.incmin = True; $$.incmax = True; $$.pattern = $1; } | patt cdbl min { $$.hasmin = True; $$.hasmax = False; $$.incmin = $3.incmin; $$.incmax = $3.incmax; $$.minOccurs = (LONG64)$2; $$.maxOccurs = 1; if ($$.minOccurs < 0) $$.minOccurs = -1; $$.min = $2; $$.max = 0.0; $$.pattern = $1; } | patt cdbl minmax cdbl { $$.hasmin = True; $$.hasmax = True; $$.incmin = $3.incmin; $$.incmax = $3.incmax; $$.minOccurs = (LONG64)$2; $$.maxOccurs = (LONG64)$4; if ($$.minOccurs < 0 || $$.maxOccurs < 0) { $$.minOccurs = -1; $$.maxOccurs = 1; } else if ($$.minOccurs > $$.maxOccurs) { $$.minOccurs = -1; $$.maxOccurs = 1; } $$.min = $2; $$.max = $4; $$.pattern = $1; } | patt max cdbl { $$.hasmin = False; $$.hasmax = True; $$.incmin = $2.incmin; $$.incmax = $2.incmax; $$.minOccurs = -1; $$.maxOccurs = (LONG64)$3; if ($$.maxOccurs < 0) { $$.minOccurs = -1; $$.maxOccurs = 1; } $$.min = 0.0; $$.max = $3; $$.pattern = $1; } ; patt : /* empty */ { $$ = NULL; } | STR { $$ = $1; } ; cdbl : DBL { $$ = $1; } | LNG { $$ = (double)$1; } | CHR { $$ = (double)$1; } | '+' cdbl { $$ = +$2; } | '-' cdbl { $$ = -$2; } ; min : /* empty */ { $$.incmin = $$.incmax = True; } | ':' { $$.incmin = $$.incmax = True; } | '<' ':' { $$.incmin = False; $$.incmax = True; } | '<' { $$.incmin = False; $$.incmax = True; } ; minmax : ':' { $$.incmin = $$.incmax = True; } | '<' ':' { $$.incmin = False; $$.incmax = True; } | ':' '<' { $$.incmin = True; $$.incmax = False; } | '<' ':' '<' { $$.incmin = False; $$.incmax = False; } | '<' { $$.incmin = False; $$.incmax = False; } ; max : ':' { $$.incmin = $$.incmax = True; } | ':' '<' { $$.incmin = True; $$.incmax = False; } | '<' { $$.incmin = True; $$.incmax = False; } ; /**************************************\ Expressions \**************************************/ expr : expr ',' expr { $$ = $3; } | cexp { $$ = $1; } ; /* cexp : conditional expression */ cexp : obex '?' qexp ':' cexp { $$.typ = $3.typ; $$.sto = Snone; $$.hasval = False; } | oexp ; /* qexp : true-branch of ? : conditional expression */ qexp : expr { $$ = $1; } ; /* oexp : or-expression */ oexp : obex OR aexp { $$.hasval = False; $$.typ = mkint(); } | aexp { $$ = $1; } ; obex : oexp { $$ = $1; } ; /* aexp : and-expression */ aexp : abex AN rexp { $$.hasval = False; $$.typ = mkint(); } | rexp { $$ = $1; } ; abex : aexp { $$ = $1; } ; /* rexp : relational expression */ rexp : rexp '|' rexp { $$ = iop("|", $1, $3); } | rexp '^' rexp { $$ = iop("^", $1, $3); } | rexp '&' rexp { $$ = iop("&", $1, $3); } | rexp EQ rexp { $$ = relop("==", $1, $3); } | rexp NE rexp { $$ = relop("!=", $1, $3); } | rexp '<' rexp { $$ = relop("<", $1, $3); } | rexp LE rexp { $$ = relop("<=", $1, $3); } | rexp '>' rexp { $$ = relop(">", $1, $3); } | rexp GE rexp { $$ = relop(">=", $1, $3); } | rexp LS rexp { $$ = iop("<<", $1, $3); } | rexp RS rexp { $$ = iop(">>", $1, $3); } | rexp '+' rexp { $$ = op("+", $1, $3); } | rexp '-' rexp { $$ = op("-", $1, $3); } | rexp '*' rexp { $$ = op("*", $1, $3); } | rexp '/' rexp { $$ = op("/", $1, $3); } | rexp '%' rexp { $$ = iop("%", $1, $3); } | lexp { $$ = $1; } ; /* lexp : lvalue kind of expression with optional prefix contructs */ lexp : '!' lexp { if ($2.hasval) $$.val.i = !$2.val.i; $$.typ = $2.typ; $$.hasval = $2.hasval; } | '~' lexp { if ($2.hasval) $$.val.i = ~$2.val.i; $$.typ = $2.typ; $$.hasval = $2.hasval; } | '-' lexp { if ($2.hasval) { if (integer($2.typ)) $$.val.i = -$2.val.i; else if (real($2.typ)) $$.val.r = -$2.val.r; else typerror("string?"); } $$.typ = $2.typ; $$.hasval = $2.hasval; } | '+' lexp { $$ = $2; } | '*' lexp { if ($2.typ->type == Tpointer) $$.typ = (Tnode*)$2.typ->ref; else typerror("dereference of non-pointer type"); $$.sto = Snone; $$.hasval = False; } | '&' lexp { $$.typ = mkpointer($2.typ); $$.sto = Snone; $$.hasval = False; } | SIZEOF '(' texp ')' { $$.hasval = True; $$.typ = mkint(); $$.val.i = $3.typ->width; } | pexp { $$ = $1; } ; /* pexp : primitive expression with optional postfix constructs */ pexp : '(' expr ')' { $$ = $2; } | ID { if (!(p = enumentry($1))) p = undefined($1); else $$.hasval = True; $$.typ = p->info.typ; $$.val = p->info.val; } | LNG { $$.typ = mkint(); $$.hasval = True; $$.val.i = $1; } | null { $$.typ = mkint(); $$.hasval = True; $$.val.i = 0; } | DBL { $$.typ = mkfloat(); $$.hasval = True; $$.val.r = $1; } | CHR { $$.typ = mkchar(); $$.hasval = True; $$.val.i = $1; } | STR { $$.typ = mkstring(); $$.hasval = True; $$.val.s = $1; } | CFALSE { $$.typ = mkbool(); $$.hasval = True; $$.val.i = 0; } | CTRUE { $$.typ = mkbool(); $$.hasval = True; $$.val.i = 1; } ; %% /* * ??? */ int yywrap(void) { return 1; } /**************************************\ Support routines \**************************************/ static Node op(const char *op, Node p, Node q) { Node r; Tnode *typ; r.typ = p.typ; r.sto = Snone; if (p.hasval && q.hasval) { if (integer(p.typ) && integer(q.typ)) switch (op[0]) { case '|': r.val.i = p.val.i | q.val.i; break; case '^': r.val.i = p.val.i ^ q.val.i; break; case '&': r.val.i = p.val.i & q.val.i; break; case '<': r.val.i = p.val.i << q.val.i; break; case '>': r.val.i = p.val.i >> q.val.i; break; case '+': r.val.i = p.val.i + q.val.i; break; case '-': r.val.i = p.val.i - q.val.i; break; case '*': r.val.i = p.val.i * q.val.i; break; case '/': r.val.i = p.val.i / q.val.i; break; case '%': r.val.i = p.val.i % q.val.i; break; default: typerror(op); } else if (real(p.typ) && real(q.typ)) switch (op[0]) { case '+': r.val.r = p.val.r + q.val.r; break; case '-': r.val.r = p.val.r - q.val.r; break; case '*': r.val.r = p.val.r * q.val.r; break; case '/': r.val.r = p.val.r / q.val.r; break; default: typerror(op); } else semerror("invalid constant operation"); r.hasval = True; } else { typ = mgtype(p.typ, q.typ); r.hasval = False; } return r; } static Node iop(const char *iop, Node p, Node q) { if (integer(p.typ) && integer(q.typ)) return op(iop, p, q); typerror("integer operands only"); return p; } static Node relop(const char *op, Node p, Node q) { Node r; Tnode *typ; r.typ = mkint(); r.sto = Snone; r.hasval = True; r.val.i = 1; sprintf(errbuf, "comparison '%s' not evaluated and considered true", op); semwarn(errbuf); if (p.typ->type != Tpointer || p.typ != q.typ) typ = mgtype(p.typ, q.typ); return r; } /**************************************\ Scope management \**************************************/ /* mkscope - initialize scope stack with a new table and offset */ static void mkscope(Table *table, int offset) { sp = stack-1; enterscope(table, offset); } /* enterscope - enter a new scope by pushing a new table and offset on the stack */ static void enterscope(Table *table, int offset) { if (++sp == stack+MAXNEST) execerror("maximum scope depth exceeded"); sp->table = table; sp->val = 0; sp->offset = offset; sp->grow = True; /* by default, offset grows */ sp->mask = False; } /* exitscope - exit a scope by popping the table and offset from the stack */ static void exitscope(void) { check(sp-- != stack, "exitscope() has no matching enterscope()"); } /**************************************\ Undefined symbol \**************************************/ static Entry* undefined(Symbol *sym) { Entry *p; sprintf(errbuf, "undefined identifier '%s'", sym->name); semwarn(errbuf); p = enter(sp->table, sym); p->level = GLOBAL; p->info.typ = mkint(); p->info.sto = Sextern; p->info.hasval = False; return p; } /* mgtype - return most general type among two numerical types */ Tnode* mgtype(Tnode *typ1, Tnode *typ2) { if (numeric(typ1) && numeric(typ2)) { if (typ1->type < typ2->type) return typ2; } else { typerror("non-numeric type"); } return typ1; } /**************************************\ Type checks \**************************************/ static int integer(Tnode *typ) { switch (typ->type) { case Tchar: case Tshort: case Tint: case Tlong: return True; default: break; } return False; } static int real(Tnode *typ) { switch (typ->type) { case Tfloat: case Tdouble: case Tldouble: return True; default: break; } return False; } static int numeric(Tnode *typ) { return integer(typ) || real(typ); } static void add_fault(void) { Table *t; Entry *p1, *p2, *p3, *p4; Symbol *s1, *s2, *s3, *s4; imported = NULL; s1 = lookup("SOAP_ENV__Code"); p1 = entry(classtable, s1); if (!p1 || !p1->info.typ->ref) { t = mktable(NULL); if (!p1) { p1 = enter(classtable, s1); p1->info.typ = mkstruct(t, 3*4); p1->info.typ->id = s1; } else { p1->info.typ->ref = t; } p2 = enter(t, lookup("SOAP_ENV__Value")); p2->info.typ = qname; p2->info.minOccurs = 0; p2 = enter(t, lookup("SOAP_ENV__Subcode")); p2->info.typ = mkpointer(p1->info.typ); p2->info.minOccurs = 0; } s2 = lookup("SOAP_ENV__Detail"); p2 = entry(classtable, s2); if (!p2 || !p2->info.typ->ref) { t = mktable(NULL); if (!p2) { p2 = enter(classtable, s2); p2->info.typ = mkstruct(t, 3*4); p2->info.typ->id = s2; } else { p2->info.typ->ref = t; } p3 = enter(t, lookup("__any")); p3->info.typ = xml; p3->info.minOccurs = 0; p3 = enter(t, lookup("__type")); p3->info.typ = mkint(); p3->info.minOccurs = 0; p3 = enter(t, lookup("fault")); p3->info.typ = mkpointer(mkvoid()); p3->info.minOccurs = 0; custom_fault = 0; } s4 = lookup("SOAP_ENV__Reason"); p4 = entry(classtable, s4); if (!p4 || !p4->info.typ->ref) { t = mktable(NULL); if (!p4) { p4 = enter(classtable, s4); p4->info.typ = mkstruct(t, 4); p4->info.typ->id = s4; } else { p4->info.typ->ref = t; } p3 = enter(t, lookup("SOAP_ENV__Text")); p3->info.typ = mkstring(); p3->info.minOccurs = 0; } s3 = lookup("SOAP_ENV__Fault"); p3 = entry(classtable, s3); if (!p3 || !p3->info.typ->ref) { t = mktable(NULL); if (!p3) { p3 = enter(classtable, s3); p3->info.typ = mkstruct(t, 9*4); p3->info.typ->id = s3; } else { p3->info.typ->ref = t; } p3 = enter(t, lookup("faultcode")); p3->info.typ = qname; p3->info.minOccurs = 0; p3 = enter(t, lookup("faultstring")); p3->info.typ = mkstring(); p3->info.minOccurs = 0; p3 = enter(t, lookup("faultactor")); p3->info.typ = mkstring(); p3->info.minOccurs = 0; p3 = enter(t, lookup("detail")); p3->info.typ = mkpointer(p2->info.typ); p3->info.minOccurs = 0; p3 = enter(t, s1); p3->info.typ = mkpointer(p1->info.typ); p3->info.minOccurs = 0; p3 = enter(t, s4); p3->info.typ = mkpointer(p4->info.typ); p3->info.minOccurs = 0; p3 = enter(t, lookup("SOAP_ENV__Node")); p3->info.typ = mkstring(); p3->info.minOccurs = 0; p3 = enter(t, lookup("SOAP_ENV__Role")); p3->info.typ = mkstring(); p3->info.minOccurs = 0; p3 = enter(t, lookup("SOAP_ENV__Detail")); p3->info.typ = mkpointer(p2->info.typ); p3->info.minOccurs = 0; } } static void add_soap(void) { Symbol *s = lookup("soap"); p = enter(classtable, s); p->info.typ = mkstruct(NULL, 0); p->info.typ->transient = -2; p->info.typ->id = s; } static void add_XML(void) { Symbol *s = lookup("_XML"); s->token = TYPE; p = enter(typetable, s); xml = p->info.typ = mksymtype(mkstring(), s); p->info.sto = Stypedef; } static void add_qname(void) { Symbol *s = lookup("_QName"); s->token = TYPE; p = enter(typetable, s); qname = p->info.typ = mksymtype(mkstring(), s); p->info.sto = Stypedef; } static void add_header(void) { Table *t; Entry *p; Symbol *s = lookup("SOAP_ENV__Header"); imported = NULL; p = entry(classtable, s); if (!p || !p->info.typ->ref) { t = mktable(NULL); if (!p) p = enter(classtable, s); p->info.typ = mkstruct(t, 0); p->info.typ->id = s; custom_header = 0; } } static void add_response(Entry *fun, Entry *ret) { Table *t; Entry *p, *q; Symbol *s; size_t i = 0, j, n = strlen(fun->sym->name); char *r = (char*)emalloc(n+100); strcpy(r, fun->sym->name); strcat(r, "Response"); do { for (j = 0; j < i; j++) r[n+j+8] = '_'; r[n+i+8] = '\0'; if (!(s = lookup(r))) s = install(r, ID); i++; } while (entry(classtable, s)); free(r); t = mktable(NULL); q = enter(t, ret->sym); q->info = ret->info; if (q->info.typ->type == Treference) q->info.typ = (Tnode*)q->info.typ->ref; p = enter(classtable, s); p->info.typ = mkstruct(t, 4); p->info.typ->id = s; fun->info.typ->response = p; } static void add_result(Tnode *typ) { Entry *p; if (!typ->ref || !((Tnode*)typ->ref)->ref) { semwarn("response struct/class must be declared before used in function prototype"); return; } for (p = ((Table*)((Tnode*)typ->ref)->ref)->list; p; p = p->next) if (p->info.sto & Sreturn) return; for (p = ((Table*)((Tnode*)typ->ref)->ref)->list; p; p = p->next) { if (p->info.typ->type != Tfun && !(p->info.sto & Sattribute) && !is_transient(p->info.typ) && !(p->info.sto & (Sprivate|Sprotected))) p->info.sto = (Storage)((int)p->info.sto | (int)Sreturn); return; } } static void add_request(Symbol *sym, Scope *sp) { Entry *p; unlinklast(sp->table); if ((p = entry(classtable, sym))) { if (p->info.typ->ref) { sprintf(errbuf, "service operation name clash: struct/class '%s' already declared at %s:%d", sym->name, p->filename, p->lineno); semerror(errbuf); } else { p->info.typ->ref = sp->table; p->info.typ->width = sp->offset; } } else { p = enter(classtable, sym); p->info.typ = mkstruct(sp->table, sp->offset); p->info.typ->id = sym; } if (p->info.typ->ref) { for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next) { if (q->info.typ->type == Treference || q->info.typ->type == Trvalueref) { sprintf(errbuf, "parameter '%s' of service operation function '%s()' in %s:%d cannot be passed by reference: use a pointer instead", q->sym->name, sym->name, q->filename, q->lineno); semwarn(errbuf); } else if ((q->info.sto & (Sconst | Sconstptr))) { if (!is_string(q->info.typ) && !is_wstring(q->info.typ)) { sprintf(errbuf, "parameter '%s' of service operation function '%s()' in %s:%d cannot be declared const", q->sym->name, sym->name, q->filename, q->lineno); semwarn(errbuf); } } else if ((q->info.sto & ~(Sattribute | Sextern | Sspecial))) { sprintf(errbuf, "invalid parameter '%s' of service operation function '%s()' in %s:%d", q->sym->name, sym->name, q->filename, q->lineno); semwarn(errbuf); } } } } gsoap-2.8.28/gsoap/src/README.txt0000644000175000017500000001363512653650160015676 0ustar ellertellertThe gSOAP 'soapcpp2' source-to-source compiler INSTRUCTIONS The gSOAP soapcpp2 tool translates annotated C/C++ header files with interface defitions for services and clients to service and client implementation code. It also maps the C/C++ types to XML types, with the ability to generate XML schema and WSDL documents. When starting from WSDL and/or XML schemas, first use the gSOAP 'wsdl2h' tool to translate these into C/C++ header file with interface definitions. Then use 'soapcpp2' to translate these into implementation code. See also the README.txt in the 'wsdl' directory and documentation on the use of 'wsdl2h' with 'soapcpp2'. CONTENTS This part of the distribution contains the following files: README.txt This file MakefileManual Extra makefile when autoconf/automake fail to produce one soapcpp2.h Main header file soapcpp2.c Main application symbol2.c Symbol table handling and code generation module error2.h Header file for error2.c error2.c Error handling routines init2.c Compiler symbol table initialization soapcpp2_lex.l Flex/Lex tokens soapcpp2_yacc.y Yacc/Bison grammar INSTALLATION Use './configure' and 'make' in the root directory, as explained in the installation instructions. To build 'soapcpp2' when autoconf/automake fail, use: make -f MakefileManual The above commands to build 'soapcpp2' assume you have Bison and Flex installed. To use Yacc instead, please use: $ cd gsoap/src $ make YACC='yacc -d -v -s soapcpp2_yacc' CMFLAGS='-DWITH_YACC -DWITH_FLEX' -f MakefileManual If you do not have the Bison tool, please download and install it from here: http://www.gnu.org/software/bison/ If you do not have the Flex tool, please download and install it from here: http://flex.sourceforge.net What if you do not have Bison and Flex? Included in gsoap/src are the flex-generated file 'lex.yy.c' and bison-generated files 'soapcpp2_yacc.tab.h' and 'soapcpp2_yacc.tab.c'. These files may suffice (no guarantee however) to build 'soapcpp2' as follows: $ cd gsoap/src $ make -f MakefileManual soapcpp2 In case the files 'lex.yy.c', 'soapcpp2_yacc.tab.h', and 'soapcpp2_yacc.tab.c' were deleted in a prior build run, please unarchive the gSOAP package again to retrieve these original files. For your project builds, use the stdsoap2.c and stdsoap2.cpp sources rather than the libgsoap libs, as the libs are not built. To enable SSL, GZIP, HTTP cookies, IPv6 support, and/or force C locale usage, use the compiler flags: -DWITH_OPENSSL to enable SSL, link with OpenSSL -DWITH_GNUTLS to enable SSL, link with GNUTLS -DWITH_GZIP to enable compression, link with Zlib -DWITH_COOKIES to enable HTTP cookies -DWITH_IPV6 to enable IPv6 -DWITH_C_LOCALE to force C locale Note: these flags when set must be used to compile ALL your sources to ensure consistency. QNX INSTALLATION On QNX the bison.simple file is located in $QNX_HOST/usr/share/bison.simple Update your .profile to include: export BISON_SIMPLE=$QNX_HOST/usr/share/bison/bison.simple export BISON_HAIRY=$QNX_HOST/usr/share/bison/bison.hairy WIN32 INSTALLATION You need to install Flex and Bison to build soapcpp2. An MSN article explains how to do this with MS VS2005: http://msdn.microsoft.com/en-us/library/aa730877(VS.80).aspx#vccustombr_topic3 The older Bison v1.6 can crash on Win32 systems if YYINITDEPTH is too small: Compile with /DYYINITDEPTH=5000 COMMAND LINE OPTIONS -1 generate SOAP 1.1 bindings -2 generate SOAP 1.2 bindings -0 no SOAP bindings, use REST -C generate client-side code only -S generate server-side code only -T generate server auto-test code -Ec generate extra routines for deep copying -Ed generate extra routines for deep deletion -Et generate extra routines for data traversals with walker functions -L don't generate soapClientLib/soapServerLib -a use SOAPAction with WS-Addressing to invoke server-side operations -A require SOAPAction to invoke server-side operations -b serialize byte arrays char[N] as string -c generate C source code -c++ generate C++ source code (default) -c++11 generate C++ source code optimized for C++11 (compile with -std=c++11) -dpath use path to save files -e generate SOAP RPC encoding style bindings (also use -1 or -2) -fN multiple soapC files, with N serializer definitions per file (N>=10) -h display help info -Ipath use path(s) for #import (paths separated with ':', or ';' for windows) -i generate C++ service proxies and objects inherited from soap struct -j generate C++ service proxies and objects that share a soap struct -l generate linkable modules (experimental) -m generate Matlab(tm) code for MEX compiler -n use service name to rename service functions and namespace table -pname save files with new prefix name instead of 'soap' -Qname use name as the C++ namespace for decls, including custom serializers -qname use name as the C++ namespace of all declarations -s generate deserialization code with strict XML validation checks -t generate code for fully xsi:type typed SOAP/XML messaging -u uncomment comments in WSDL/schema output by suppressing XML comments -v verbose output -w don't generate WSDL and schema files -x don't generate sample XML message files -y include C/C++ type access information in sample XML messages -z1 generate deprecated old-style C++ service proxies and objects -z2 compatibility with 2.7.x: omit XML output for NULL pointers infile header file to parse (or stdin) DOCUMENTATION See soapdoc2.pdf for documentation. LICENSE The gSOAP 'soapcpp2' tool and (generated) source code are released under GPL or a commercial license. The commercial license is available from Genivia. Please visit http://genivia.com/Products/gsoap/contract.html COPYRIGHT NOTICE gSOAP XML Web services tools Copyright (C) 2000-2011, Robert van Engelen, Genivia, Inc. All Rights Reserved. gsoap-2.8.28/gsoap/src/init2.c0000644000175000017500000001312012653650160015356 0ustar ellertellert/* init2.c Symbol table initialization. gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc. All Rights Reserved. This part of the software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapcpp2.h" #ifdef HAVE_CONFIG_H #include "soapcpp2_yacc.h" #else #include "soapcpp2_yacc.tab.h" #endif typedef struct Keyword { const char *s; /* name */ Token t; /* token */ } Keyword; static Keyword keywords[] = { { "asm", NONE }, { "auto", AUTO }, { "bool", BOOL }, { "break", BREAK }, { "case", CASE }, { "catch", NONE }, { "char", CHAR }, { "class", CLASS }, { "const", CONST }, { "const_cast", NONE }, { "continue", CONTINUE }, { "default", DEFAULT }, { "delete", NONE }, { "do", DO }, { "double", DOUBLE }, { "dynamic_cast", NONE }, { "else", ELSE }, { "enum", ENUM }, { "errno", NONE }, { "explicit", EXPLICIT }, { "export", NONE }, { "extern", EXTERN }, { "false", CFALSE }, { "final", FINAL }, { "float", FLOAT }, { "for", FOR }, { "friend", FRIEND }, { "goto", GOTO }, { "if", IF }, { "inline", INLINE }, { "int", INT }, { "int8_t", CHAR }, { "int16_t", SHORT }, { "int32_t", INT }, { "int64_t", LLONG }, { "long", LONG }, { "LONG64", LLONG }, { "mutable", MUTABLE }, { "namespace", NAMESPACE }, { "new", NONE }, { "nullptr", null }, { "NULL", null }, { "operator", OPERATOR }, { "override", OVERRIDE }, { "private", PRIVATE }, { "protected", PROTECTED }, { "public", PUBLIC }, { "register", REGISTER }, { "reinterpret_cast", NONE }, { "restrict", NONE }, { "return", RETURN }, { "short", SHORT }, { "signed", SIGNED }, { "size_t", SIZE }, { "sizeof", SIZEOF }, { "static", STATIC }, { "static_cast", NONE }, { "struct", STRUCT }, { "switch", SWITCH }, { "template", TEMPLATE }, { "this", NONE }, { "throw", NONE }, { "time_t", TIME }, { "true", CTRUE }, { "typedef", TYPEDEF }, { "typeid", NONE }, { "typename", TYPENAME }, { "uint8_t", UCHAR }, { "uint16_t", USHORT }, { "uint32_t", UINT }, { "uint64_t", ULLONG }, { "ULONG64", ULLONG }, { "union", UNION }, { "unsigned", UNSIGNED }, { "using", USING }, { "virtual", VIRTUAL }, { "void", VOID }, { "volatile", VOLATILE }, { "wchar_t", WCHAR }, { "while", WHILE }, { "operator!", NONE }, { "operator~", NONE }, { "operator=", NONE }, { "operator+=", NONE }, { "operator-=", NONE }, { "operator*=", NONE }, { "operator/=", NONE }, { "operator%=", NONE }, { "operator&=", NONE }, { "operator^=", NONE }, { "operator|=", NONE }, { "operator<<=", NONE }, { "operator>>=", NONE }, { "operator||", NONE }, { "operator&&", NONE }, { "operator|", NONE }, { "operator^", NONE }, { "operator&", NONE }, { "operator==", NONE }, { "operator!=", NONE }, { "operator<", NONE }, { "operator<=", NONE }, { "operator>", NONE }, { "operator>=", NONE }, { "operator<<", NONE }, { "operator>>", NONE }, { "operator+", NONE }, { "operator-", NONE }, { "operator*", NONE }, { "operator/", NONE }, { "operator%", NONE }, { "operator++", NONE }, { "operator--", NONE }, { "operator->", NONE }, { "operator[]", NONE }, { "operator()", NONE }, { "mustUnderstand", MUSTUNDERSTAND }, { "soap", ID }, { "SOAP_ENV__Header", ID }, { "dummy", ID }, { "soap_header", ID }, { "SOAP_ENV__Fault", ID }, { "SOAP_ENV__Code", ID }, { "SOAP_ENV__Subcode",ID }, { "SOAP_ENV__Reason", ID }, { "SOAP_ENV__Text", ID }, { "SOAP_ENV__Detail", ID }, { "SOAP_ENV__Value", ID }, { "SOAP_ENV__Node", ID }, { "SOAP_ENV__Role", ID }, { "faultcode", ID }, { "faultstring", ID }, { "faultactor", ID }, { "detail", ID }, { "__type", ID }, { "fault", ID }, { "__any", ID }, { "_QName", ID }, { "_XML", ID }, { "std::string", TYPE }, { "std::wstring", TYPE }, { "std::deque", TYPE }, { "std::queue", TYPE }, { "std::list", TYPE }, { "std::vector", TYPE }, { "std::set", TYPE }, { "std::shared_ptr", TYPE }, { "std::unique_ptr", TYPE }, { "std::auto_ptr", TYPE }, { "std::weak_ptr", TYPE }, { "std::function", TYPE }, { "/*?*/", NONE }, { 0, 0 } }; /* init - initialize symbol table with predefined keywords */ void init(void) { struct Keyword *k; for (k = keywords; k->s; k++) install(k->s, k->t); } gsoap-2.8.28/gsoap/src/error2.c0000644000175000017500000001063612653650160015555 0ustar ellertellert/* error2.c Error handling. gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc. All Rights Reserved. This part of the software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapcpp2.h" #ifdef HAVE_CONFIG_H #include "soapcpp2_yacc.h" #else #include "soapcpp2_yacc.tab.h" #endif #define MAXERR 10 extern char yytext[]; /* lexeme found by the lexical analyzer */ static int lexerrno = 0; static int synerrno = 0; static int semerrno = 0; static int semwarno = 0; char errbuf[1024]; /* to hold error messages */ /* yyerror - auto-called by parser from an error production with nonterminal `error' */ void yyerror(const char *s) { (void)s; } /* lexerror - called by lexical analyzer upon failure to recognize a token */ void lexerror(const char *s) { fprintf(stderr, "%s(%d): %s: %s\n", filename, yylineno, s, yytext); if (lexerrno++ >= MAXERR) execerror("too many syntactic errors, bailing out"); } /* synerror - called by a semantic action for an error production in the yacc grammar */ void synerror(const char *s) { fprintf(stderr, "%s(%d): Syntax error: %s\n", filename, yylineno, s); if (synerrno++ >= MAXERR) execerror("too many syntactic errors, bailing out"); } /* semerror - report semantic error from static checking */ void semerror(const char *s) { fprintf(stderr, "\n%s(%d): **ERROR**: %s\n\n", filename, yylineno, s); if (semerrno++ >= MAXERR) execerror("too many semantic errors, bailing out"); } /* semwarn - report semantic warning from static checking */ void semwarn(const char *s) { if (yylineno) fprintf(stderr, "\n%s(%d): *WARNING*: %s\n\n", filename, yylineno, s); else fprintf(stderr, "\n%s: *WARNING*: %s\n\n", filename, s); semwarno++; } /* compliancewarn - report compliance warning */ void compliancewarn(const char *s) { fprintf(stderr, "Compliance warning: %s\n", s); } /* typerror - report type error (a semantic error) */ void typerror(const char *s) { fprintf(stderr, "%s(%d): Type error: %s\n", filename, yylineno, s); if (semerrno++ >= MAXERR) execerror("too many semantic errors, bailing out"); } /* execerror - print error message and terminate execution */ void execerror(const char *s) { fprintf(stderr, "Critical error: %s\n", s); exit(1); } /* progerror - called when check(expr) failed, i.e. upon programming error */ void progerror(const char *s, const char *f, int l) { fprintf(stderr, "Program failure: %s in file %s line %d\n", s, f, l); exit(1); } /* errstat - show error statistics */ int errstat(void) { if (!lexerrno && !synerrno && !semerrno) { fprintf(stderr, "\nCompilation successful "); if (semwarno) fprintf(stderr, "(%d warning%s)\n\n", semwarno, semwarno>1?"s":""); else fprintf(stderr, "\n\n"); return 0; } fprintf(stderr, "\nThere were errors:\n"); if (lexerrno) fprintf(stderr, "%d lexical error%s\n", lexerrno, lexerrno>1?"s":""); if (synerrno) fprintf(stderr, "%d syntax error%s\n", synerrno, synerrno>1?"s":""); if (semerrno) fprintf(stderr, "%d semantic error%s\n", semerrno, semerrno>1?"s":""); if (semwarno) fprintf(stderr, "%d warning%s\n", semwarno, semwarno>1?"s":""); fprintf(stderr, "\n"); return -1; } gsoap-2.8.28/gsoap/src/soapcpp2_yacc.tab.c0000644000175000017500000070041612653650160017637 0ustar ellertellert/* A Bison parser, made by GNU Bison 2.3. */ /* Skeleton implementation for Bison's Yacc-like parsers in C Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. 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, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /* C LALR(1) parser skeleton written by Richard Stallman, by simplifying the original so-called "semantic" parser. */ /* All symbols defined below should begin with yy or YY, to avoid infringing on user name space. This should be done even for local variables, as they might otherwise be expanded by user macros. There are some unavoidable exceptions within include files to define necessary library symbols; they are noted "INFRINGES ON USER NAME SPACE" below. */ /* Identify Bison output. */ #define YYBISON 1 /* Bison version. */ #define YYBISON_VERSION "2.3" /* Skeleton name. */ #define YYSKELETON_NAME "yacc.c" /* Pure parsers. */ #define YYPURE 0 /* Using locations. */ #define YYLSP_NEEDED 0 /* Tokens. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE /* Put the tokens into the symbol table, so that GDB and other debuggers know about them. */ enum yytokentype { PRAGMA = 258, AUTO = 259, DOUBLE = 260, INT = 261, STRUCT = 262, BREAK = 263, ELSE = 264, LONG = 265, SWITCH = 266, CASE = 267, ENUM = 268, REGISTER = 269, TYPEDEF = 270, CHAR = 271, EXTERN = 272, RETURN = 273, UNION = 274, CONST = 275, FLOAT = 276, SHORT = 277, UNSIGNED = 278, CONTINUE = 279, FOR = 280, SIGNED = 281, VOID = 282, DEFAULT = 283, GOTO = 284, SIZEOF = 285, VOLATILE = 286, DO = 287, IF = 288, STATIC = 289, WHILE = 290, CLASS = 291, PRIVATE = 292, PROTECTED = 293, PUBLIC = 294, VIRTUAL = 295, INLINE = 296, OPERATOR = 297, LLONG = 298, BOOL = 299, CFALSE = 300, CTRUE = 301, WCHAR = 302, TIME = 303, USING = 304, NAMESPACE = 305, ULLONG = 306, MUSTUNDERSTAND = 307, SIZE = 308, FRIEND = 309, TEMPLATE = 310, EXPLICIT = 311, TYPENAME = 312, MUTABLE = 313, FINAL = 314, null = 315, RESTRICT = 316, OVERRIDE = 317, UCHAR = 318, USHORT = 319, UINT = 320, ULONG = 321, NONE = 322, ID = 323, LAB = 324, TYPE = 325, LNG = 326, DBL = 327, CHR = 328, TAG = 329, STR = 330, RA = 331, LA = 332, OA = 333, XA = 334, AA = 335, MA = 336, DA = 337, TA = 338, NA = 339, PA = 340, OR = 341, AN = 342, NE = 343, EQ = 344, GE = 345, LE = 346, RS = 347, LS = 348, AR = 349, PP = 350, NN = 351 }; #endif /* Tokens. */ #define PRAGMA 258 #define AUTO 259 #define DOUBLE 260 #define INT 261 #define STRUCT 262 #define BREAK 263 #define ELSE 264 #define LONG 265 #define SWITCH 266 #define CASE 267 #define ENUM 268 #define REGISTER 269 #define TYPEDEF 270 #define CHAR 271 #define EXTERN 272 #define RETURN 273 #define UNION 274 #define CONST 275 #define FLOAT 276 #define SHORT 277 #define UNSIGNED 278 #define CONTINUE 279 #define FOR 280 #define SIGNED 281 #define VOID 282 #define DEFAULT 283 #define GOTO 284 #define SIZEOF 285 #define VOLATILE 286 #define DO 287 #define IF 288 #define STATIC 289 #define WHILE 290 #define CLASS 291 #define PRIVATE 292 #define PROTECTED 293 #define PUBLIC 294 #define VIRTUAL 295 #define INLINE 296 #define OPERATOR 297 #define LLONG 298 #define BOOL 299 #define CFALSE 300 #define CTRUE 301 #define WCHAR 302 #define TIME 303 #define USING 304 #define NAMESPACE 305 #define ULLONG 306 #define MUSTUNDERSTAND 307 #define SIZE 308 #define FRIEND 309 #define TEMPLATE 310 #define EXPLICIT 311 #define TYPENAME 312 #define MUTABLE 313 #define FINAL 314 #define null 315 #define RESTRICT 316 #define OVERRIDE 317 #define UCHAR 318 #define USHORT 319 #define UINT 320 #define ULONG 321 #define NONE 322 #define ID 323 #define LAB 324 #define TYPE 325 #define LNG 326 #define DBL 327 #define CHR 328 #define TAG 329 #define STR 330 #define RA 331 #define LA 332 #define OA 333 #define XA 334 #define AA 335 #define MA 336 #define DA 337 #define TA 338 #define NA 339 #define PA 340 #define OR 341 #define AN 342 #define NE 343 #define EQ 344 #define GE 345 #define LE 346 #define RS 347 #define LS 348 #define AR 349 #define PP 350 #define NN 351 /* Copy the first part of user declarations. */ #line 51 "soapcpp2_yacc.y" #include "soapcpp2.h" #ifdef WIN32 #ifndef __STDC__ #define __STDC__ #endif #define YYINCLUDED_STDLIB_H #ifdef WIN32_WITHOUT_SOLARIS_FLEX extern int soapcpp2lex(void); #else extern int yylex(void); #endif #else extern int yylex(void); #endif #define MAXNEST 16 /* max. nesting depth of scopes */ typedef struct Scope { Table *table; Entry *entry; Node node; LONG64 val; int offset; Bool grow; /* true if offset grows with declarations */ Bool mask; /* true if enum is mask */ } Scope; Scope stack[MAXNEST], /* stack of tables and offsets */ *sp; /* current scope stack pointer */ Table *classtable = NULL, *enumtable = NULL, *typetable = NULL, *booltable = NULL, *templatetable = NULL; const char *namespaceid = NULL; int transient = 0; int permission = 0; int custom_header = 1; int custom_fault = 1; Pragma *pragmas = NULL; Tnode *qname = NULL; Tnode *xml = NULL; /* function prototypes for support routine section */ static Entry *undefined(Symbol*); static Tnode *mgtype(Tnode*, Tnode*); static Node op(const char*, Node, Node), iop(const char*, Node, Node), relop(const char*, Node, Node); static void mkscope(Table*, int), enterscope(Table*, int), exitscope(void); static int integer(Tnode*), real(Tnode*), numeric(Tnode*); static void add_soap(void), add_XML(void), add_qname(void), add_header(void), add_fault(void), add_response(Entry*, Entry*), add_result(Tnode*), add_request(Symbol*, Scope*); /* imported from symbol2.c */ extern int is_string(Tnode*), is_wstring(Tnode*), is_XML(Tnode*), is_smart(Tnode*); extern char *c_storage(Storage); extern const char *c_type(Tnode*); extern int is_primitive_or_string(Tnode*), is_stdstr(Tnode*), is_binary(Tnode*), is_external(Tnode*), is_mutable(Entry*); extern Entry *unlinklast(Table*); /* Temporaries used in semantic rules */ int i; char *s, *s1; const char *s2; Symbol *sym; Entry *p, *q; Tnode *t; Node tmp, c; Pragma **pp; /* Enabling traces. */ #ifndef YYDEBUG # define YYDEBUG 0 #endif /* Enabling verbose error messages. */ #ifdef YYERROR_VERBOSE # undef YYERROR_VERBOSE # define YYERROR_VERBOSE 1 #else # define YYERROR_VERBOSE 0 #endif /* Enabling the token table. */ #ifndef YYTOKEN_TABLE # define YYTOKEN_TABLE 0 #endif #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED typedef union YYSTYPE #line 153 "soapcpp2_yacc.y" { Symbol *sym; LONG64 i; double r; char c; char *s; Tnode *typ; Storage sto; Node rec; Entry *e; } /* Line 193 of yacc.c. */ #line 397 "soapcpp2_yacc.tab.c" YYSTYPE; # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 # define YYSTYPE_IS_TRIVIAL 1 #endif /* Copy the second part of user declarations. */ /* Line 216 of yacc.c. */ #line 410 "soapcpp2_yacc.tab.c" #ifdef short # undef short #endif #ifdef YYTYPE_UINT8 typedef YYTYPE_UINT8 yytype_uint8; #else typedef unsigned char yytype_uint8; #endif #ifdef YYTYPE_INT8 typedef YYTYPE_INT8 yytype_int8; #elif (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) typedef signed char yytype_int8; #else typedef short int yytype_int8; #endif #ifdef YYTYPE_UINT16 typedef YYTYPE_UINT16 yytype_uint16; #else typedef unsigned short int yytype_uint16; #endif #ifdef YYTYPE_INT16 typedef YYTYPE_INT16 yytype_int16; #else typedef short int yytype_int16; #endif #ifndef YYSIZE_T # ifdef __SIZE_TYPE__ # define YYSIZE_T __SIZE_TYPE__ # elif defined size_t # define YYSIZE_T size_t # elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) # include /* INFRINGES ON USER NAME SPACE */ # define YYSIZE_T size_t # else # define YYSIZE_T unsigned int # endif #endif #define YYSIZE_MAXIMUM ((YYSIZE_T) -1) #ifndef YY_ # if defined YYENABLE_NLS && YYENABLE_NLS # if ENABLE_NLS # include /* INFRINGES ON USER NAME SPACE */ # define YY_(msgid) dgettext ("bison-runtime", msgid) # endif # endif # ifndef YY_ # define YY_(msgid) msgid # endif #endif /* Suppress unused-variable warnings by "using" E. */ #if ! defined lint || defined __GNUC__ # define YYUSE(e) ((void) (e)) #else # define YYUSE(e) /* empty */ #endif /* Identity function, used to suppress warnings about constant conditions. */ #ifndef lint # define YYID(n) (n) #else #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static int YYID (int i) #else static int YYID (i) int i; #endif { return i; } #endif #if ! defined yyoverflow || YYERROR_VERBOSE /* The parser invokes alloca or malloc; define the necessary symbols. */ # ifdef YYSTACK_USE_ALLOCA # if YYSTACK_USE_ALLOCA # ifdef __GNUC__ # define YYSTACK_ALLOC __builtin_alloca # elif defined __BUILTIN_VA_ARG_INCR # include /* INFRINGES ON USER NAME SPACE */ # elif defined _AIX # define YYSTACK_ALLOC __alloca # elif defined _MSC_VER # include /* INFRINGES ON USER NAME SPACE */ # define alloca _alloca # else # define YYSTACK_ALLOC alloca # if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) # include /* INFRINGES ON USER NAME SPACE */ # ifndef _STDLIB_H # define _STDLIB_H 1 # endif # endif # endif # endif # endif # ifdef YYSTACK_ALLOC /* Pacify GCC's `empty if-body' warning. */ # define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) # ifndef YYSTACK_ALLOC_MAXIMUM /* The OS might guarantee only one guard page at the bottom of the stack, and a page size can be as small as 4096 bytes. So we cannot safely invoke alloca (N) if N exceeds 4096. Use a slightly smaller number to allow for a few compiler-allocated temporary stack slots. */ # define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ # endif # else # define YYSTACK_ALLOC YYMALLOC # define YYSTACK_FREE YYFREE # ifndef YYSTACK_ALLOC_MAXIMUM # define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM # endif # if (defined __cplusplus && ! defined _STDLIB_H \ && ! ((defined YYMALLOC || defined malloc) \ && (defined YYFREE || defined free))) # include /* INFRINGES ON USER NAME SPACE */ # ifndef _STDLIB_H # define _STDLIB_H 1 # endif # endif # ifndef YYMALLOC # define YYMALLOC malloc # if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ # endif # endif # ifndef YYFREE # define YYFREE free # if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) void free (void *); /* INFRINGES ON USER NAME SPACE */ # endif # endif # endif #endif /* ! defined yyoverflow || YYERROR_VERBOSE */ #if (! defined yyoverflow \ && (! defined __cplusplus \ || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) /* A type that is properly aligned for any stack member. */ union yyalloc { yytype_int16 yyss; YYSTYPE yyvs; }; /* The size of the maximum gap between one aligned stack and the next. */ # define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) /* The size of an array large to enough to hold all stacks, each with N elements. */ # define YYSTACK_BYTES(N) \ ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ + YYSTACK_GAP_MAXIMUM) /* Copy COUNT objects from FROM to TO. The source and destination do not overlap. */ # ifndef YYCOPY # if defined __GNUC__ && 1 < __GNUC__ # define YYCOPY(To, From, Count) \ __builtin_memcpy (To, From, (Count) * sizeof (*(From))) # else # define YYCOPY(To, From, Count) \ do \ { \ YYSIZE_T yyi; \ for (yyi = 0; yyi < (Count); yyi++) \ (To)[yyi] = (From)[yyi]; \ } \ while (YYID (0)) # endif # endif /* Relocate STACK from its old location to the new one. The local variables YYSIZE and YYSTACKSIZE give the old and new number of elements in the stack, and YYPTR gives the new location of the stack. Advance YYPTR to a properly aligned location for the next stack. */ # define YYSTACK_RELOCATE(Stack) \ do \ { \ YYSIZE_T yynewbytes; \ YYCOPY (&yyptr->Stack, Stack, yysize); \ Stack = &yyptr->Stack; \ yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ yyptr += yynewbytes / sizeof (*yyptr); \ } \ while (YYID (0)) #endif /* YYFINAL -- State number of the termination state. */ #define YYFINAL 3 /* YYLAST -- Last index in YYTABLE. */ #define YYLAST 1798 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 122 /* YYNNTS -- Number of nonterminals. */ #define YYNNTS 73 /* YYNRULES -- Number of rules. */ #define YYNRULES 291 /* YYNRULES -- Number of states. */ #define YYNSTATES 448 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ #define YYUNDEFTOK 2 #define YYMAXUTOK 351 #define YYTRANSLATE(YYX) \ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) /* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ static const yytype_uint8 yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 117, 2, 2, 121, 107, 94, 2, 119, 116, 105, 103, 76, 104, 2, 106, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 89, 113, 97, 77, 98, 88, 120, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 114, 2, 115, 93, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 111, 92, 112, 118, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 90, 91, 95, 96, 99, 100, 101, 102, 108, 109, 110 }; #if YYDEBUG /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in YYRHS. */ static const yytype_uint16 yyprhs[] = { 0, 0, 3, 6, 7, 13, 15, 16, 19, 22, 24, 26, 28, 31, 33, 34, 38, 43, 48, 53, 58, 61, 63, 65, 66, 67, 68, 70, 73, 77, 80, 83, 87, 92, 95, 98, 105, 108, 110, 112, 114, 117, 120, 123, 126, 129, 132, 135, 138, 141, 144, 147, 150, 153, 156, 159, 162, 165, 168, 171, 174, 177, 180, 183, 186, 189, 192, 195, 198, 201, 204, 207, 210, 213, 216, 220, 224, 227, 229, 233, 241, 242, 243, 245, 247, 251, 254, 257, 264, 265, 267, 269, 276, 280, 285, 286, 289, 292, 294, 296, 299, 302, 304, 306, 308, 310, 312, 314, 316, 318, 320, 322, 324, 326, 328, 330, 332, 334, 336, 338, 340, 348, 354, 360, 368, 370, 374, 380, 386, 389, 395, 402, 405, 412, 420, 427, 434, 441, 448, 451, 454, 456, 461, 465, 469, 472, 476, 480, 484, 488, 491, 494, 498, 502, 507, 512, 515, 518, 521, 524, 527, 530, 533, 536, 539, 541, 542, 544, 546, 549, 552, 555, 557, 560, 561, 562, 563, 564, 566, 567, 569, 571, 573, 575, 577, 579, 581, 583, 585, 587, 589, 591, 593, 595, 597, 599, 601, 603, 604, 607, 610, 613, 614, 617, 618, 620, 621, 624, 627, 630, 631, 636, 640, 642, 644, 648, 649, 652, 653, 655, 656, 658, 661, 665, 668, 670, 674, 679, 683, 684, 686, 688, 690, 692, 695, 698, 699, 701, 704, 706, 708, 711, 714, 718, 720, 722, 725, 727, 731, 733, 739, 741, 743, 747, 749, 751, 755, 757, 759, 763, 767, 771, 775, 779, 783, 787, 791, 795, 799, 803, 807, 811, 815, 819, 823, 825, 828, 831, 834, 837, 840, 843, 848, 850, 854, 856, 858, 860, 862, 864, 866, 868 }; /* YYRHS -- A `-1'-separated list of the rules' RHS. */ static const yytype_int16 yyrhs[] = { 123, 0, -1, 124, 125, -1, -1, 50, 68, 111, 126, 112, -1, 126, -1, -1, 126, 127, -1, 135, 113, -1, 128, -1, 130, -1, 131, -1, 1, 113, -1, 3, -1, -1, 135, 113, 129, -1, 37, 89, 132, 129, -1, 38, 89, 133, 129, -1, 39, 89, 134, 129, -1, 130, 129, 131, 129, -1, 1, 113, -1, 114, -1, 115, -1, -1, -1, -1, 150, -1, 150, 136, -1, 150, 137, 142, -1, 140, 142, -1, 141, 142, -1, 135, 76, 136, -1, 135, 76, 137, 142, -1, 1, 68, -1, 1, 116, -1, 172, 68, 174, 177, 179, 175, -1, 172, 139, -1, 68, -1, 70, -1, 68, -1, 42, 117, -1, 42, 118, -1, 42, 77, -1, 42, 87, -1, 42, 86, -1, 42, 85, -1, 42, 84, -1, 42, 83, -1, 42, 82, -1, 42, 81, -1, 42, 80, -1, 42, 79, -1, 42, 78, -1, 42, 90, -1, 42, 91, -1, 42, 92, -1, 42, 93, -1, 42, 94, -1, 42, 96, -1, 42, 95, -1, 42, 97, -1, 42, 100, -1, 42, 98, -1, 42, 99, -1, 42, 102, -1, 42, 101, -1, 42, 103, -1, 42, 104, -1, 42, 105, -1, 42, 106, -1, 42, 107, -1, 42, 109, -1, 42, 110, -1, 42, 108, -1, 42, 114, 115, -1, 42, 119, 116, -1, 42, 149, -1, 70, -1, 171, 118, 70, -1, 143, 119, 167, 144, 116, 169, 170, -1, -1, -1, 145, -1, 146, -1, 146, 76, 145, -1, 1, 68, -1, 1, 76, -1, 151, 172, 147, 174, 178, 176, -1, -1, 68, -1, 149, -1, 151, 172, 119, 167, 144, 116, -1, 151, 172, 173, -1, 151, 172, 68, 173, -1, -1, 168, 150, -1, 152, 150, -1, 168, -1, 152, -1, 168, 151, -1, 152, 151, -1, 27, -1, 44, -1, 16, -1, 47, -1, 22, -1, 6, -1, 10, -1, 43, -1, 51, -1, 53, -1, 21, -1, 5, -1, 26, -1, 23, -1, 63, -1, 64, -1, 65, -1, 66, -1, 48, -1, 55, 97, 161, 138, 98, 36, 138, -1, 36, 111, 163, 129, 112, -1, 154, 111, 163, 129, 112, -1, 154, 89, 162, 111, 163, 129, 112, -1, 154, -1, 154, 89, 162, -1, 7, 111, 163, 129, 112, -1, 153, 111, 163, 129, 112, -1, 7, 138, -1, 19, 111, 164, 129, 112, -1, 19, 138, 111, 164, 129, 112, -1, 19, 138, -1, 13, 111, 163, 135, 166, 112, -1, 13, 105, 111, 163, 135, 166, 112, -1, 155, 111, 163, 135, 166, 112, -1, 156, 111, 163, 135, 166, 112, -1, 157, 111, 165, 135, 166, 112, -1, 158, 111, 165, 135, 166, 112, -1, 13, 138, -1, 13, 159, -1, 70, -1, 70, 97, 148, 98, -1, 1, 68, 1, -1, 1, 68, 98, -1, 1, 98, -1, 36, 1, 112, -1, 7, 1, 112, -1, 19, 1, 112, -1, 13, 1, 112, -1, 7, 138, -1, 36, 138, -1, 13, 138, 160, -1, 13, 159, 160, -1, 13, 105, 138, 160, -1, 13, 105, 159, 160, -1, 7, 138, -1, 36, 138, -1, 89, 16, -1, 89, 47, -1, 89, 22, -1, 89, 6, -1, 89, 10, -1, 89, 43, -1, 89, 70, -1, 89, -1, -1, 36, -1, 57, -1, 38, 162, -1, 37, 162, -1, 39, 162, -1, 70, -1, 7, 68, -1, -1, -1, -1, -1, 76, -1, -1, 4, -1, 14, -1, 34, -1, 56, -1, 17, -1, 15, -1, 40, -1, 20, -1, 59, -1, 62, -1, 54, -1, 41, -1, 52, -1, 18, -1, 120, -1, 121, -1, 31, -1, 58, -1, -1, 169, 20, -1, 169, 59, -1, 169, 62, -1, -1, 77, 71, -1, -1, 40, -1, -1, 172, 105, -1, 172, 94, -1, 172, 91, -1, -1, 114, 186, 115, 173, -1, 114, 115, 173, -1, 173, -1, 176, -1, 111, 186, 112, -1, -1, 77, 186, -1, -1, 74, -1, -1, 71, -1, 71, 89, -1, 71, 89, 71, -1, 89, 71, -1, 180, -1, 180, 181, 182, -1, 180, 181, 183, 181, -1, 180, 184, 181, -1, -1, 75, -1, 72, -1, 71, -1, 73, -1, 103, 181, -1, 104, 181, -1, -1, 89, -1, 97, 89, -1, 97, -1, 89, -1, 97, 89, -1, 89, 97, -1, 97, 89, 97, -1, 97, -1, 89, -1, 89, 97, -1, 97, -1, 185, 76, 185, -1, 186, -1, 189, 88, 187, 89, 186, -1, 188, -1, 185, -1, 189, 90, 190, -1, 190, -1, 188, -1, 191, 91, 192, -1, 192, -1, 190, -1, 192, 92, 192, -1, 192, 93, 192, -1, 192, 94, 192, -1, 192, 96, 192, -1, 192, 95, 192, -1, 192, 97, 192, -1, 192, 100, 192, -1, 192, 98, 192, -1, 192, 99, 192, -1, 192, 102, 192, -1, 192, 101, 192, -1, 192, 103, 192, -1, 192, 104, 192, -1, 192, 105, 192, -1, 192, 106, 192, -1, 192, 107, 192, -1, 193, -1, 117, 193, -1, 118, 193, -1, 104, 193, -1, 103, 193, -1, 105, 193, -1, 94, 193, -1, 30, 119, 149, 116, -1, 194, -1, 119, 185, 116, -1, 68, -1, 71, -1, 60, -1, 72, -1, 73, -1, 75, -1, 45, -1, 46, -1 }; /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const yytype_uint16 yyrline[] = { 0, 229, 229, 249, 264, 266, 268, 273, 275, 276, 277, 278, 279, 289, 319, 323, 325, 327, 329, 331, 333, 338, 340, 342, 344, 346, 348, 349, 350, 352, 353, 354, 355, 357, 362, 367, 587, 605, 606, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, 657, 668, 696, 757, 759, 760, 762, 763, 764, 768, 773, 901, 909, 927, 928, 935, 937, 940, 945, 986, 1038, 1045, 1050, 1091, 1143, 1144, 1145, 1146, 1147, 1148, 1149, 1150, 1151, 1152, 1153, 1154, 1155, 1156, 1157, 1158, 1159, 1160, 1161, 1162, 1172, 1198, 1225, 1249, 1253, 1271, 1298, 1322, 1343, 1370, 1395, 1416, 1443, 1470, 1479, 1488, 1502, 1516, 1533, 1551, 1581, 1638, 1644, 1649, 1653, 1659, 1665, 1671, 1678, 1703, 1730, 1748, 1767, 1789, 1812, 1817, 1823, 1824, 1825, 1826, 1827, 1828, 1829, 1839, 1843, 1845, 1846, 1848, 1849, 1850, 1851, 1860, 1862, 1870, 1879, 1886, 1887, 1889, 1898, 1899, 1900, 1901, 1902, 1903, 1904, 1905, 1906, 1907, 1908, 1909, 1910, 1911, 1912, 1917, 1918, 1919, 1921, 1922, 1923, 1924, 1926, 1927, 1929, 1930, 1932, 1933, 1941, 1946, 1952, 1953, 1971, 1976, 1991, 1992, 2006, 2007, 2021, 2022, 2024, 2035, 2048, 2061, 2082, 2099, 2110, 2124, 2146, 2163, 2164, 2166, 2167, 2168, 2169, 2170, 2172, 2173, 2174, 2175, 2177, 2178, 2179, 2180, 2181, 2183, 2184, 2185, 2194, 2195, 2198, 2204, 2207, 2210, 2214, 2216, 2219, 2222, 2224, 2227, 2228, 2229, 2230, 2231, 2232, 2233, 2234, 2235, 2236, 2237, 2238, 2239, 2240, 2241, 2242, 2243, 2246, 2252, 2258, 2271, 2272, 2280, 2285, 2291, 2294, 2295, 2303, 2308, 2313, 2318, 2323, 2328, 2333 }; #endif #if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. First, the terminals, then, starting at YYNTOKENS, nonterminals. */ static const char *const yytname[] = { "$end", "error", "$undefined", "PRAGMA", "AUTO", "DOUBLE", "INT", "STRUCT", "BREAK", "ELSE", "LONG", "SWITCH", "CASE", "ENUM", "REGISTER", "TYPEDEF", "CHAR", "EXTERN", "RETURN", "UNION", "CONST", "FLOAT", "SHORT", "UNSIGNED", "CONTINUE", "FOR", "SIGNED", "VOID", "DEFAULT", "GOTO", "SIZEOF", "VOLATILE", "DO", "IF", "STATIC", "WHILE", "CLASS", "PRIVATE", "PROTECTED", "PUBLIC", "VIRTUAL", "INLINE", "OPERATOR", "LLONG", "BOOL", "CFALSE", "CTRUE", "WCHAR", "TIME", "USING", "NAMESPACE", "ULLONG", "MUSTUNDERSTAND", "SIZE", "FRIEND", "TEMPLATE", "EXPLICIT", "TYPENAME", "MUTABLE", "FINAL", "null", "RESTRICT", "OVERRIDE", "UCHAR", "USHORT", "UINT", "ULONG", "NONE", "ID", "LAB", "TYPE", "LNG", "DBL", "CHR", "TAG", "STR", "','", "'='", "RA", "LA", "OA", "XA", "AA", "MA", "DA", "TA", "NA", "PA", "'?'", "':'", "OR", "AN", "'|'", "'^'", "'&'", "NE", "EQ", "'<'", "'>'", "GE", "LE", "RS", "LS", "'+'", "'-'", "'*'", "'/'", "'%'", "AR", "PP", "NN", "'{'", "'}'", "';'", "'['", "']'", "')'", "'!'", "'~'", "'('", "'@'", "'$'", "$accept", "prog", "s1", "exts", "exts1", "ext", "pragma", "decls", "t1", "t2", "t3", "t4", "t5", "dclrs", "dclr", "fdclr", "id", "name", "ctor", "dtor", "func", "fname", "fargso", "fargs", "farg", "arg", "texpf", "texp", "spec", "tspec", "type", "struct", "class", "enum", "enumsc", "mask", "masksc", "sc", "utype", "tname", "base", "s2", "s3", "s4", "s5", "s6", "store", "const", "abstract", "virtual", "ptrs", "array", "arrayck", "brinit", "init", "tag", "occurs", "bounds", "patt", "cdbl", "min", "minmax", "max", "expr", "cexp", "qexp", "oexp", "obex", "aexp", "abex", "rexp", "lexp", "pexp", 0 }; #endif # ifdef YYPRINT /* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to token YYLEX-NUM. */ static const yytype_uint16 yytoknum[] = { 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 44, 61, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 63, 58, 341, 342, 124, 94, 38, 343, 344, 60, 62, 345, 346, 347, 348, 43, 45, 42, 47, 37, 349, 350, 351, 123, 125, 59, 91, 93, 41, 33, 126, 40, 64, 36 }; # endif /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const yytype_uint8 yyr1[] = { 0, 122, 123, 124, 125, 125, 126, 126, 127, 127, 127, 127, 127, 128, 129, 129, 129, 129, 129, 129, 129, 130, 131, 132, 133, 134, 135, 135, 135, 135, 135, 135, 135, 135, 135, 136, 137, 138, 138, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 140, 141, 142, 143, 144, 144, 145, 145, 145, 145, 146, 147, 147, 148, 148, 149, 149, 150, 150, 150, 151, 151, 151, 151, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 153, 154, 155, 156, 157, 158, 159, 159, 160, 160, 160, 160, 160, 160, 160, 160, 160, 161, 161, 162, 162, 162, 162, 162, 163, 164, 165, 166, 166, 167, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 169, 169, 169, 169, 170, 170, 171, 171, 172, 172, 172, 172, 173, 173, 173, 174, 175, 175, 176, 176, 177, 177, 178, 178, 178, 178, 178, 179, 179, 179, 179, 180, 180, 181, 181, 181, 181, 181, 182, 182, 182, 182, 183, 183, 183, 183, 183, 184, 184, 184, 185, 185, 186, 186, 187, 188, 188, 189, 190, 190, 191, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 193, 193, 193, 193, 193, 193, 193, 193, 194, 194, 194, 194, 194, 194, 194, 194, 194 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ static const yytype_uint8 yyr2[] = { 0, 2, 2, 0, 5, 1, 0, 2, 2, 1, 1, 1, 2, 1, 0, 3, 4, 4, 4, 4, 2, 1, 1, 0, 0, 0, 1, 2, 3, 2, 2, 3, 4, 2, 2, 6, 2, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 2, 1, 3, 7, 0, 0, 1, 1, 3, 2, 2, 6, 0, 1, 1, 6, 3, 4, 0, 2, 2, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 5, 5, 7, 1, 3, 5, 5, 2, 5, 6, 2, 6, 7, 6, 6, 6, 6, 2, 2, 1, 4, 3, 3, 2, 3, 3, 3, 3, 2, 2, 3, 3, 4, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 0, 1, 1, 2, 2, 2, 1, 2, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 2, 2, 2, 0, 2, 0, 1, 0, 2, 2, 2, 0, 4, 3, 1, 1, 3, 0, 2, 0, 1, 0, 1, 2, 3, 2, 1, 3, 4, 3, 0, 1, 1, 1, 1, 2, 2, 0, 1, 2, 1, 1, 2, 2, 3, 1, 1, 2, 1, 3, 1, 5, 1, 1, 3, 1, 1, 3, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 2, 2, 2, 2, 2, 2, 4, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1 }; /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state STATE-NUM when YYTABLE doesn't specify something else to do. Zero means the default is an error. */ static const yytype_uint16 yydefact[] = { 3, 0, 6, 1, 0, 2, 0, 0, 0, 13, 179, 112, 106, 0, 107, 0, 180, 184, 103, 183, 192, 0, 186, 111, 105, 114, 113, 101, 195, 181, 0, 185, 190, 108, 102, 104, 119, 109, 191, 110, 189, 0, 182, 196, 187, 188, 115, 116, 117, 118, 140, 21, 22, 193, 194, 7, 9, 10, 11, 0, 80, 80, 205, 0, 0, 124, 0, 0, 0, 0, 0, 0, 6, 0, 144, 12, 34, 0, 37, 38, 173, 128, 0, 0, 0, 0, 173, 138, 139, 0, 174, 131, 0, 173, 150, 0, 0, 205, 8, 29, 0, 30, 27, 80, 0, 0, 185, 140, 96, 173, 0, 173, 173, 173, 175, 175, 95, 0, 0, 142, 143, 146, 0, 148, 155, 156, 173, 165, 165, 0, 164, 151, 152, 147, 0, 174, 145, 0, 166, 167, 0, 0, 90, 205, 0, 0, 31, 80, 178, 28, 0, 209, 208, 207, 206, 36, 0, 0, 0, 0, 0, 0, 171, 125, 0, 0, 0, 0, 0, 78, 4, 0, 0, 0, 0, 0, 0, 0, 0, 153, 154, 0, 176, 160, 161, 157, 159, 162, 158, 163, 0, 0, 0, 0, 141, 209, 100, 99, 32, 0, 42, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 53, 54, 55, 56, 57, 59, 58, 60, 62, 63, 61, 65, 64, 66, 67, 68, 69, 70, 73, 71, 72, 0, 40, 41, 0, 76, 205, 0, 212, 217, 0, 172, 169, 168, 170, 173, 0, 176, 176, 176, 176, 20, 23, 24, 25, 126, 0, 0, 176, 205, 0, 129, 0, 121, 0, 209, 178, 92, 0, 0, 82, 83, 205, 74, 75, 209, 0, 290, 291, 286, 284, 285, 287, 288, 289, 0, 0, 0, 0, 209, 0, 0, 0, 0, 250, 0, 253, 0, 256, 274, 282, 218, 228, 127, 0, 122, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 132, 130, 0, 93, 0, 0, 86, 197, 0, 88, 0, 280, 278, 277, 279, 211, 275, 276, 0, 248, 209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 229, 215, 224, 0, 134, 135, 136, 137, 16, 17, 18, 19, 133, 120, 0, 201, 84, 89, 209, 0, 0, 283, 210, 251, 0, 252, 255, 258, 259, 260, 262, 261, 263, 265, 266, 264, 268, 267, 269, 270, 271, 272, 273, 0, 0, 35, 213, 231, 230, 232, 244, 246, 0, 0, 235, 0, 123, 91, 198, 199, 200, 0, 79, 219, 281, 247, 0, 216, 0, 245, 233, 234, 236, 238, 225, 0, 227, 202, 220, 0, 215, 249, 214, 241, 237, 226, 221, 223, 87, 242, 222 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int16 yydefgoto[] = { -1, 1, 2, 5, 6, 55, 56, 175, 176, 58, 311, 312, 313, 177, 146, 147, 81, 155, 60, 61, 99, 100, 270, 271, 272, 375, 141, 142, 62, 273, 63, 64, 65, 66, 67, 68, 69, 88, 131, 140, 163, 122, 134, 167, 261, 199, 70, 372, 419, 71, 104, 239, 240, 402, 403, 303, 437, 358, 359, 411, 431, 432, 412, 335, 336, 381, 295, 296, 297, 298, 299, 300, 301 }; /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ #define YYPACT_NINF -311 static const yytype_int16 yypact[] = { -311, 33, -9, -311, 21, -311, 237, -14, -38, -311, -311, -311, -311, 13, -311, 12, -311, -311, -311, -311, -311, 23, -311, -311, -311, -311, -311, -311, -311, -311, 24, -13, -311, -311, -311, -311, -311, -311, -311, -311, -311, 19, -311, -311, -311, -311, -311, -311, -311, -311, 2, -311, -311, -311, -311, -311, -311, -311, -311, 35, -311, -311, 25, 1193, 18, 42, 43, 50, 59, 80, 1193, 31, -311, 20, -311, -311, -311, 91, -311, -311, -311, 93, 95, -24, -24, 9, -311, 61, 61, 109, -311, 116, 119, -311, -311, 49, 1491, -311, -311, -311, 79, -311, -311, -311, -7, -25, -311, 65, -311, -311, 105, -311, -311, -311, -311, -311, -311, 150, 833, -311, -311, -311, 594, -311, -311, -311, -311, 139, 139, 1311, 130, -311, -311, -311, 594, -311, -311, 594, -311, -311, -24, 138, -311, -311, 951, 1072, -311, -311, -311, -311, 355, -87, -311, -311, -311, -311, 28, 594, 177, 105, 105, 105, -311, 135, 594, 1311, 1311, 1311, 1311, -311, -311, 47, 172, 173, 180, 158, 712, 38, 1311, -311, -311, -26, 196, -311, -311, -311, -311, -311, -311, -311, 162, 594, 163, 178, -311, 87, -311, -311, -311, 1420, -311, -311, -311, -311, -311, -311, -311, -311, -311, -311, -311, -311, -311, -311, -311, -311, -311, -311, -311, -311, -311, -311, -311, -311, -311, -311, -311, -311, -311, -311, -311, -311, 167, -311, -311, 170, -311, -311, 1592, -311, 209, 175, -311, -311, -311, -311, -311, 182, 196, 196, 196, 196, -311, -311, -311, -311, -311, 191, 476, 196, 208, 214, -311, 215, -311, 281, 216, -311, -311, 117, 213, -311, 258, -311, -311, -311, 108, 217, -311, -311, -311, -311, -311, -311, -311, -311, 1631, 1631, 1631, 1631, 216, 1631, 1631, 1631, 220, 96, 124, 246, 247, 1676, -311, -311, -311, 264, -311, 594, -311, 231, 232, 233, 236, 476, 476, 476, 476, -311, 241, -311, -311, -24, -311, 1420, 11, -311, -311, 1562, 114, 1491, -311, -311, -311, -311, -311, -311, -311, -53, -311, 216, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, -311, -23, 243, 242, -311, -311, -311, -311, -311, -311, -311, -311, -311, -311, 248, 51, -311, -311, 216, 250, 1631, -311, -311, 273, 274, 246, 1676, 1691, 577, 694, 459, 459, 470, 470, 470, 470, 205, 205, 104, 104, -311, -311, -311, 1631, 1631, -311, -311, -311, -311, -311, 270, -311, 194, 194, -58, 194, -311, -311, -311, -311, -311, 308, -311, 85, -311, -311, 1631, -311, 268, -311, -311, -311, 86, 145, -311, 194, -311, -311, 294, 313, 310, -311, -311, -311, 482, -311, 314, -311, -311, -311, -311 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int16 yypgoto[] = { -311, -311, -311, -311, 316, -311, -311, -117, 4, 133, -311, -311, -311, 1, 330, 331, -15, -311, -311, -311, -39, -311, 73, 72, -311, -311, -311, -147, 32, -88, -95, -311, -311, -311, -311, -311, -311, 315, -62, -311, 64, -75, 266, 289, 74, 148, -92, -311, -311, -311, -134, -190, 30, -311, -21, -311, -311, -311, -311, -91, -311, -311, -311, -310, -236, -311, -311, -311, 83, -311, 1411, 403, -311 }; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If positive, shift that token. If negative, reduce the rule which number is the opposite. If zero, do what YYDEFACT says. If YYTABLE_NINF, syntax error. */ #define YYTABLE_NINF -258 static const yytype_int16 yytable[] = { 87, 144, 294, 236, 145, 268, 91, 59, 143, 195, 57, 129, 119, 82, 77, 94, 83, 190, 137, 83, 192, 119, 101, 377, 89, 92, 132, 238, 380, 119, 73, 429, -39, 3, 157, 150, 164, 165, 166, 430, 241, 4, 73, 156, 78, 84, 79, 247, 84, 144, 144, 178, 145, 145, 400, 144, 196, 197, 145, 257, 74, 151, 237, 378, 149, 179, 180, 422, 124, 125, 127, 415, 74, 74, 263, 75, 320, 78, 76, 79, 78, 78, 79, 79, 152, 138, 268, 153, 401, 7, 76, 78, 78, 79, 79, 108, -33, 72, 154, 96, 332, -26, 116, 276, 144, -204, 139, 145, 198, 120, 416, 97, 158, 417, 97, 73, 95, 85, 120, 59, 126, -77, 57, 86, 80, 193, 120, -85, 418, 109, 182, 110, -33, -33, 90, 93, 183, -26, -26, 326, 184, 315, 159, 160, 161, 74, 185, 379, 98, 117, 130, 258, 186, 111, 112, 266, 435, -239, -239, -239, 252, 113, 96, 76, 424, 425, 248, 249, 250, 251, 114, 305, -165, 187, 436, 162, 266, 188, 152, 259, 376, 153, 374, 440, -254, 322, -254, 438, 360, -239, -239, 115, 154, 323, 365, 366, 367, 368, 148, 152, 189, 238, 153, 121, -149, 152, 267, 123, 153, 354, 355, 356, 338, 154, 339, 74, -243, -243, -243, 154, 169, 133, 238, 243, 244, 245, 144, 135, 130, 145, 144, 136, 144, 145, 441, 145, 194, -5, 8, 237, 9, 10, 11, 12, 13, 242, 246, 14, -243, -243, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 253, 254, 26, 27, 404, 405, 406, 28, 255, 256, 29, 260, 30, 262, 264, 265, 31, 32, -94, 33, 34, 274, 302, 35, 36, 275, 304, 37, 38, 39, 40, 41, 42, 306, 43, 44, 409, 410, 45, 46, 47, 48, 49, 370, -94, 52, 50, 352, 353, 354, 355, 356, -94, 404, 405, 406, 319, 427, 428, -177, 433, 307, 308, 309, 310, 317, 318, -94, 324, 238, -94, 407, 316, 325, 337, 327, -257, 340, 357, 408, 442, -94, 361, 362, 363, 409, 410, 364, 377, -94, 51, 52, 369, 413, -203, 105, 53, 54, 10, 11, 12, 13, 423, 414, 14, 421, 426, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 434, 439, 26, 27, 443, 444, 447, 28, 400, 118, 29, 314, 30, 102, 103, 371, 106, 32, 373, 33, 34, 128, 191, 35, 36, 168, 420, 37, 38, 39, 40, 41, 42, 0, 43, 44, 321, 445, 45, 46, 47, 48, 49, 382, 0, 0, 107, 0, 0, 0, 0, 0, 0, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 0, 0, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 0, 0, 0, 232, 0, 0, 233, 234, 235, 53, 54, 171, 0, 0, 10, 11, 12, 13, 0, 0, 14, 0, 0, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 0, 0, 26, 27, 0, 0, 0, 28, 0, 0, 29, 0, 30, 172, 173, 174, 31, 32, -94, 33, 34, 0, 0, 35, 36, 0, 0, 37, 38, 39, 40, 41, 42, 0, 43, 44, 0, 0, 45, 46, 47, 48, 49, 0, -94, 0, 50, 0, 0, 0, 0, 0, -94, -240, -240, -240, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, -94, 0, 0, -94, 350, 351, 352, 353, 354, 355, 356, 0, 446, 0, -94, 0, 0, 0, -240, -240, 0, -14, -94, 51, -14, 0, 0, -203, 171, 53, 54, 10, 11, 12, 13, 0, 0, 14, 0, 0, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 0, 0, 26, 27, 0, 0, 0, 28, 0, 0, 29, 0, 30, 172, 173, 174, 31, 32, -94, 33, 34, 0, 0, 35, 36, 0, 0, 37, 38, 39, 40, 41, 42, 0, 43, 44, 0, 0, 45, 46, 47, 48, 49, 0, -94, 0, 50, 0, 0, 0, 0, 0, -94, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, -94, 0, 0, -94, 328, 329, 330, 331, 0, 333, 334, 0, 0, 0, -94, 0, 0, 0, 0, 0, 0, -14, -94, 51, 0, 0, 0, -203, 171, 53, 54, 10, 11, 12, 13, 0, 0, 14, 0, 0, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 0, 0, 26, 27, 0, 0, 0, 28, 0, 0, 29, 0, 30, 172, 173, 174, 31, 32, -94, 33, 34, 0, 0, 35, 36, 0, 0, 37, 38, 39, 40, 41, 42, 0, 43, 44, 0, 0, 45, 46, 47, 48, 49, 0, -94, 0, 50, 0, 0, 0, 0, 0, -94, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 0, -94, 0, 0, -94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -94, 0, 0, 0, 0, 0, 0, 0, -94, 51, -14, 0, 0, -203, 0, 53, 54, 8, 0, 9, 10, 11, 12, 13, 0, 0, 14, 0, 0, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 0, 0, 26, 27, 0, 0, 0, 28, 0, 0, 29, 0, 30, 0, 0, 0, 31, 32, -94, 33, 34, 0, 0, 35, 36, 0, 0, 37, 38, 39, 40, 41, 42, 0, 43, 44, 0, 0, 45, 46, 47, 48, 49, 0, -94, 0, 50, 0, 0, 0, 0, 0, -94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -94, 0, 0, -94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -94, 0, 0, 0, 0, 0, 0, 170, -94, 51, 52, 0, 0, -203, 105, 53, 54, 10, 11, 12, 13, 0, 0, 14, 0, 0, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 0, 0, 26, 27, 0, 0, 0, 28, 0, 0, 29, 0, 30, 0, 0, 0, 106, 32, 0, 33, 34, 0, 0, 35, 36, 0, 0, 37, 38, 39, 40, 41, 42, 0, 43, 44, 0, 0, 45, 46, 47, 48, 49, 0, -98, 0, 107, -98, 0, 0, 0, 0, -98, -98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -98, 0, -98, 0, 0, -98, 0, 0, 0, -98, 0, 0, 0, 0, 0, 0, -98, 0, 0, 0, 0, 0, 0, 0, 0, -98, 0, -98, 0, 0, -98, 53, 54, 105, 0, 0, 10, 11, 12, 13, 0, 0, 14, 0, 0, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 0, 0, 26, 27, 0, 0, 0, 28, 0, 0, 29, 0, 30, 0, 0, 0, 106, 32, 0, 33, 34, 0, 0, 35, 36, 0, 0, 37, 38, 39, 40, 41, 42, 0, 43, 44, 0, 0, 45, 46, 47, 48, 49, 0, -97, 0, 107, -97, 0, 0, 0, 0, -97, -97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -97, 0, -97, 0, 0, -97, 0, 0, 0, -97, 0, 0, 0, 0, 0, 0, -97, 0, 0, 0, 0, 0, 0, 0, 0, -97, 0, -97, 0, 0, -97, 53, 54, 105, 0, 0, 10, 11, 12, 13, 0, 0, 14, 0, 0, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 0, 0, 26, 27, 0, 0, 0, 28, 0, 0, 29, 0, 30, 0, 0, 0, 106, 32, -94, 33, 34, 0, 0, 35, 36, 0, 0, 37, 38, 39, 40, 41, 42, 0, 43, 44, 0, 0, 45, 46, 47, 48, 49, 0, -94, 0, 107, 0, 0, 0, 0, 0, -94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -94, 0, 0, -94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -94, 0, 0, 0, 0, 0, 0, -94, -94, 0, 0, 0, 0, 0, 181, 53, 54, 10, 11, 12, 13, 0, 0, 14, 0, 0, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 0, 0, 26, 27, 0, 0, 0, 28, 0, 0, 29, 0, 30, 0, 0, 0, 31, 32, -94, 33, 34, 0, 0, 35, 36, 0, 0, 37, 38, 39, 40, 41, 42, 0, 43, 44, 0, 0, 45, 46, 47, 48, 49, 0, -94, 0, 50, 0, 0, 0, 0, 0, -94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -94, 0, 0, -94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -94, 0, 0, 0, 0, 269, 0, -94, 10, 11, 12, 13, 0, -203, 14, 53, 54, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 0, 0, 26, 27, 0, 0, 0, 28, 0, 0, 29, 0, 30, 0, 0, 0, 106, 32, 0, 33, 34, 0, 0, 35, 36, 0, 0, 37, 38, 39, 40, 41, 42, 0, 43, 44, 0, 0, 45, 46, 47, 48, 49, 0, 0, 0, 107, 0, 105, 0, 0, 10, 11, 12, 13, 0, 0, 14, 0, 0, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 0, 0, 26, 27, 0, 0, 0, 28, 0, 0, 29, 0, 30, 0, 0, 0, 106, 32, 0, 33, 34, -81, 0, 35, 36, 53, 54, 37, 38, 39, 40, 41, 42, 0, 43, 44, 0, 0, 45, 46, 47, 48, 49, 0, 0, 0, 107, 0, 269, 0, 0, 10, 11, 12, 13, 0, 0, 14, 0, 0, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 0, 0, 26, 27, 0, 0, 0, 28, 0, 0, 29, 0, 30, 0, 0, 0, 106, 32, 0, 33, 34, 0, 0, 35, 36, 53, 54, 37, 38, 39, 40, 41, 42, 0, 43, 44, 277, 0, 45, 46, 47, 48, 49, 0, 0, 0, 107, 0, 0, 0, 0, 278, 279, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 280, 0, 0, 0, 0, 0, 0, 0, 281, 277, 0, 282, 283, 284, 0, 285, 0, 0, 0, 0, 0, 0, 0, 0, 278, 279, 0, 0, 0, 0, 53, 54, 0, 0, 286, 0, 0, 0, 0, 280, 0, 0, 0, 287, 288, 289, 0, 281, 0, 0, 282, 283, 284, 0, 285, 290, 0, 291, 292, 293, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 286, 0, 0, 0, 0, 0, 0, 0, 0, 287, 288, 289, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 291, 292, 293, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356 }; static const yytype_int16 yycheck[] = { 15, 96, 238, 150, 96, 195, 21, 6, 96, 143, 6, 86, 1, 1, 1, 30, 7, 134, 93, 7, 137, 1, 61, 76, 1, 1, 88, 114, 338, 1, 68, 89, 119, 0, 109, 42, 111, 112, 113, 97, 157, 50, 68, 68, 68, 36, 70, 164, 36, 144, 145, 126, 144, 145, 77, 150, 144, 145, 150, 176, 98, 68, 150, 116, 103, 127, 128, 377, 83, 84, 85, 20, 98, 98, 191, 113, 266, 68, 116, 70, 68, 68, 70, 70, 91, 36, 276, 94, 111, 68, 116, 68, 68, 70, 70, 63, 76, 111, 105, 97, 290, 76, 70, 237, 199, 118, 57, 199, 147, 98, 59, 76, 7, 62, 76, 68, 97, 105, 98, 118, 111, 119, 118, 111, 111, 140, 98, 116, 77, 111, 129, 89, 112, 113, 111, 111, 6, 112, 113, 273, 10, 258, 37, 38, 39, 98, 16, 337, 113, 118, 89, 113, 22, 111, 111, 68, 71, 71, 72, 73, 113, 111, 97, 116, 400, 401, 165, 166, 167, 168, 111, 246, 111, 43, 89, 70, 68, 47, 91, 178, 327, 94, 68, 97, 88, 68, 90, 423, 305, 103, 104, 111, 105, 76, 311, 312, 313, 314, 119, 91, 70, 114, 94, 112, 111, 91, 119, 112, 94, 105, 106, 107, 88, 105, 90, 98, 71, 72, 73, 105, 70, 112, 114, 159, 160, 161, 321, 111, 89, 321, 325, 112, 327, 325, 89, 327, 98, 0, 1, 327, 3, 4, 5, 6, 7, 68, 111, 10, 103, 104, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 89, 89, 26, 27, 71, 72, 73, 31, 89, 112, 34, 76, 36, 112, 112, 98, 40, 41, 42, 43, 44, 115, 74, 47, 48, 116, 112, 51, 52, 53, 54, 55, 56, 112, 58, 59, 103, 104, 62, 63, 64, 65, 66, 319, 68, 115, 70, 103, 104, 105, 106, 107, 76, 71, 72, 73, 36, 409, 410, 112, 412, 248, 249, 250, 251, 112, 112, 91, 116, 114, 94, 89, 259, 76, 115, 119, 91, 91, 75, 97, 432, 105, 112, 112, 112, 103, 104, 112, 76, 113, 114, 115, 112, 112, 118, 1, 120, 121, 4, 5, 6, 7, 89, 116, 10, 116, 97, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 71, 112, 26, 27, 89, 71, 71, 31, 77, 72, 34, 257, 36, 62, 62, 321, 40, 41, 325, 43, 44, 85, 135, 47, 48, 115, 375, 51, 52, 53, 54, 55, 56, -1, 58, 59, 267, 437, 62, 63, 64, 65, 66, 339, -1, -1, 70, -1, -1, -1, -1, -1, -1, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, -1, -1, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, -1, -1, -1, 114, -1, -1, 117, 118, 119, 120, 121, 1, -1, -1, 4, 5, 6, 7, -1, -1, 10, -1, -1, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, -1, -1, 26, 27, -1, -1, -1, 31, -1, -1, 34, -1, 36, 37, 38, 39, 40, 41, 42, 43, 44, -1, -1, 47, 48, -1, -1, 51, 52, 53, 54, 55, 56, -1, 58, 59, -1, -1, 62, 63, 64, 65, 66, -1, 68, -1, 70, -1, -1, -1, -1, -1, 76, 71, 72, 73, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 91, -1, -1, 94, 101, 102, 103, 104, 105, 106, 107, -1, 97, -1, 105, -1, -1, -1, 103, 104, -1, 112, 113, 114, 115, -1, -1, 118, 1, 120, 121, 4, 5, 6, 7, -1, -1, 10, -1, -1, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, -1, -1, 26, 27, -1, -1, -1, 31, -1, -1, 34, -1, 36, 37, 38, 39, 40, 41, 42, 43, 44, -1, -1, 47, 48, -1, -1, 51, 52, 53, 54, 55, 56, -1, 58, 59, -1, -1, 62, 63, 64, 65, 66, -1, 68, -1, 70, -1, -1, -1, -1, -1, 76, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 91, -1, -1, 94, 286, 287, 288, 289, -1, 291, 292, -1, -1, -1, 105, -1, -1, -1, -1, -1, -1, 112, 113, 114, -1, -1, -1, 118, 1, 120, 121, 4, 5, 6, 7, -1, -1, 10, -1, -1, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, -1, -1, 26, 27, -1, -1, -1, 31, -1, -1, 34, -1, 36, 37, 38, 39, 40, 41, 42, 43, 44, -1, -1, 47, 48, -1, -1, 51, 52, 53, 54, 55, 56, -1, 58, 59, -1, -1, 62, 63, 64, 65, 66, -1, 68, -1, 70, -1, -1, -1, -1, -1, 76, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, -1, 91, -1, -1, 94, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 105, -1, -1, -1, -1, -1, -1, -1, 113, 114, 115, -1, -1, 118, -1, 120, 121, 1, -1, 3, 4, 5, 6, 7, -1, -1, 10, -1, -1, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, -1, -1, 26, 27, -1, -1, -1, 31, -1, -1, 34, -1, 36, -1, -1, -1, 40, 41, 42, 43, 44, -1, -1, 47, 48, -1, -1, 51, 52, 53, 54, 55, 56, -1, 58, 59, -1, -1, 62, 63, 64, 65, 66, -1, 68, -1, 70, -1, -1, -1, -1, -1, 76, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 91, -1, -1, 94, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 105, -1, -1, -1, -1, -1, -1, 112, 113, 114, 115, -1, -1, 118, 1, 120, 121, 4, 5, 6, 7, -1, -1, 10, -1, -1, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, -1, -1, 26, 27, -1, -1, -1, 31, -1, -1, 34, -1, 36, -1, -1, -1, 40, 41, -1, 43, 44, -1, -1, 47, 48, -1, -1, 51, 52, 53, 54, 55, 56, -1, 58, 59, -1, -1, 62, 63, 64, 65, 66, -1, 68, -1, 70, 71, -1, -1, -1, -1, 76, 77, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 89, -1, 91, -1, -1, 94, -1, -1, -1, 98, -1, -1, -1, -1, -1, -1, 105, -1, -1, -1, -1, -1, -1, -1, -1, 114, -1, 116, -1, -1, 119, 120, 121, 1, -1, -1, 4, 5, 6, 7, -1, -1, 10, -1, -1, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, -1, -1, 26, 27, -1, -1, -1, 31, -1, -1, 34, -1, 36, -1, -1, -1, 40, 41, -1, 43, 44, -1, -1, 47, 48, -1, -1, 51, 52, 53, 54, 55, 56, -1, 58, 59, -1, -1, 62, 63, 64, 65, 66, -1, 68, -1, 70, 71, -1, -1, -1, -1, 76, 77, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 89, -1, 91, -1, -1, 94, -1, -1, -1, 98, -1, -1, -1, -1, -1, -1, 105, -1, -1, -1, -1, -1, -1, -1, -1, 114, -1, 116, -1, -1, 119, 120, 121, 1, -1, -1, 4, 5, 6, 7, -1, -1, 10, -1, -1, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, -1, -1, 26, 27, -1, -1, -1, 31, -1, -1, 34, -1, 36, -1, -1, -1, 40, 41, 42, 43, 44, -1, -1, 47, 48, -1, -1, 51, 52, 53, 54, 55, 56, -1, 58, 59, -1, -1, 62, 63, 64, 65, 66, -1, 68, -1, 70, -1, -1, -1, -1, -1, 76, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 91, -1, -1, 94, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 105, -1, -1, -1, -1, -1, -1, 112, 113, -1, -1, -1, -1, -1, 1, 120, 121, 4, 5, 6, 7, -1, -1, 10, -1, -1, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, -1, -1, 26, 27, -1, -1, -1, 31, -1, -1, 34, -1, 36, -1, -1, -1, 40, 41, 42, 43, 44, -1, -1, 47, 48, -1, -1, 51, 52, 53, 54, 55, 56, -1, 58, 59, -1, -1, 62, 63, 64, 65, 66, -1, 68, -1, 70, -1, -1, -1, -1, -1, 76, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 91, -1, -1, 94, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 105, -1, -1, -1, -1, 1, -1, 112, 4, 5, 6, 7, -1, 118, 10, 120, 121, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, -1, -1, 26, 27, -1, -1, -1, 31, -1, -1, 34, -1, 36, -1, -1, -1, 40, 41, -1, 43, 44, -1, -1, 47, 48, -1, -1, 51, 52, 53, 54, 55, 56, -1, 58, 59, -1, -1, 62, 63, 64, 65, 66, -1, -1, -1, 70, -1, 1, -1, -1, 4, 5, 6, 7, -1, -1, 10, -1, -1, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, -1, -1, 26, 27, -1, -1, -1, 31, -1, -1, 34, -1, 36, -1, -1, -1, 40, 41, -1, 43, 44, 116, -1, 47, 48, 120, 121, 51, 52, 53, 54, 55, 56, -1, 58, 59, -1, -1, 62, 63, 64, 65, 66, -1, -1, -1, 70, -1, 1, -1, -1, 4, 5, 6, 7, -1, -1, 10, -1, -1, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, -1, -1, 26, 27, -1, -1, -1, 31, -1, -1, 34, -1, 36, -1, -1, -1, 40, 41, -1, 43, 44, -1, -1, 47, 48, 120, 121, 51, 52, 53, 54, 55, 56, -1, 58, 59, 30, -1, 62, 63, 64, 65, 66, -1, -1, -1, 70, -1, -1, -1, -1, 45, 46, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 60, -1, -1, -1, -1, -1, -1, -1, 68, 30, -1, 71, 72, 73, -1, 75, -1, -1, -1, -1, -1, -1, -1, -1, 45, 46, -1, -1, -1, -1, 120, 121, -1, -1, 94, -1, -1, -1, -1, 60, -1, -1, -1, 103, 104, 105, -1, 68, -1, -1, 71, 72, 73, -1, 75, 115, -1, 117, 118, 119, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 94, -1, -1, -1, -1, -1, -1, -1, -1, 103, 104, 105, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 117, 118, 119, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const yytype_uint8 yystos[] = { 0, 123, 124, 0, 50, 125, 126, 68, 1, 3, 4, 5, 6, 7, 10, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 26, 27, 31, 34, 36, 40, 41, 43, 44, 47, 48, 51, 52, 53, 54, 55, 56, 58, 59, 62, 63, 64, 65, 66, 70, 114, 115, 120, 121, 127, 128, 130, 131, 135, 140, 141, 150, 152, 153, 154, 155, 156, 157, 158, 168, 171, 111, 68, 98, 113, 116, 1, 68, 70, 111, 138, 1, 7, 36, 105, 111, 138, 159, 1, 111, 138, 1, 111, 138, 97, 97, 76, 113, 142, 143, 142, 136, 137, 172, 1, 40, 70, 150, 111, 89, 111, 111, 111, 111, 111, 150, 118, 126, 1, 98, 112, 163, 112, 138, 138, 111, 138, 159, 163, 89, 160, 160, 112, 164, 111, 112, 163, 36, 57, 161, 148, 149, 151, 152, 168, 136, 137, 119, 142, 42, 68, 91, 94, 105, 139, 68, 163, 7, 37, 38, 39, 70, 162, 163, 163, 163, 165, 165, 70, 112, 1, 37, 38, 39, 129, 130, 135, 163, 160, 160, 1, 135, 6, 10, 16, 22, 43, 47, 70, 129, 164, 129, 138, 98, 172, 151, 151, 142, 167, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 114, 117, 118, 119, 149, 151, 114, 173, 174, 129, 68, 162, 162, 162, 111, 129, 135, 135, 135, 135, 113, 89, 89, 89, 112, 129, 113, 135, 76, 166, 112, 129, 112, 98, 68, 119, 173, 1, 144, 145, 146, 151, 115, 116, 172, 30, 45, 46, 60, 68, 71, 72, 73, 75, 94, 103, 104, 105, 115, 117, 118, 119, 186, 188, 189, 190, 191, 192, 193, 194, 74, 177, 112, 163, 112, 166, 166, 166, 166, 132, 133, 134, 131, 129, 166, 112, 112, 36, 173, 167, 68, 76, 116, 76, 172, 119, 193, 193, 193, 193, 173, 193, 193, 185, 186, 115, 88, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 75, 179, 180, 129, 112, 112, 112, 112, 129, 129, 129, 129, 112, 138, 144, 169, 145, 68, 147, 149, 76, 116, 173, 185, 187, 190, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 77, 111, 175, 176, 71, 72, 73, 89, 97, 103, 104, 181, 184, 112, 116, 20, 59, 62, 77, 170, 174, 116, 185, 89, 186, 186, 97, 181, 181, 89, 97, 182, 183, 181, 71, 71, 89, 178, 186, 112, 97, 89, 181, 89, 71, 176, 97, 71 }; #define yyerrok (yyerrstatus = 0) #define yyclearin (yychar = YYEMPTY) #define YYEMPTY (-2) #define YYEOF 0 #define YYACCEPT goto yyacceptlab #define YYABORT goto yyabortlab #define YYERROR goto yyerrorlab /* Like YYERROR except do call yyerror. This remains here temporarily to ease the transition to the new meaning of YYERROR, for GCC. Once GCC version 2 has supplanted version 1, this can go. */ #define YYFAIL goto yyerrlab #define YYRECOVERING() (!!yyerrstatus) #define YYBACKUP(Token, Value) \ do \ if (yychar == YYEMPTY && yylen == 1) \ { \ yychar = (Token); \ yylval = (Value); \ yytoken = YYTRANSLATE (yychar); \ YYPOPSTACK (1); \ goto yybackup; \ } \ else \ { \ yyerror (YY_("syntax error: cannot back up")); \ YYERROR; \ } \ while (YYID (0)) #define YYTERROR 1 #define YYERRCODE 256 /* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. If N is 0, then set CURRENT to the empty location which ends the previous symbol: RHS[0] (always defined). */ #define YYRHSLOC(Rhs, K) ((Rhs)[K]) #ifndef YYLLOC_DEFAULT # define YYLLOC_DEFAULT(Current, Rhs, N) \ do \ if (YYID (N)) \ { \ (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ } \ else \ { \ (Current).first_line = (Current).last_line = \ YYRHSLOC (Rhs, 0).last_line; \ (Current).first_column = (Current).last_column = \ YYRHSLOC (Rhs, 0).last_column; \ } \ while (YYID (0)) #endif /* YY_LOCATION_PRINT -- Print the location on the stream. This macro was not mandated originally: define only if we know we won't break user code: when these are the locations we know. */ #ifndef YY_LOCATION_PRINT # if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL # define YY_LOCATION_PRINT(File, Loc) \ fprintf (File, "%d.%d-%d.%d", \ (Loc).first_line, (Loc).first_column, \ (Loc).last_line, (Loc).last_column) # else # define YY_LOCATION_PRINT(File, Loc) ((void) 0) # endif #endif /* YYLEX -- calling `yylex' with the right arguments. */ #ifdef YYLEX_PARAM # define YYLEX yylex (YYLEX_PARAM) #else # define YYLEX yylex () #endif /* Enable debugging if requested. */ #if YYDEBUG # ifndef YYFPRINTF # include /* INFRINGES ON USER NAME SPACE */ # define YYFPRINTF fprintf # endif # define YYDPRINTF(Args) \ do { \ if (yydebug) \ YYFPRINTF Args; \ } while (YYID (0)) # define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ do { \ if (yydebug) \ { \ YYFPRINTF (stderr, "%s ", Title); \ yy_symbol_print (stderr, \ Type, Value); \ YYFPRINTF (stderr, "\n"); \ } \ } while (YYID (0)) /*--------------------------------. | Print this symbol on YYOUTPUT. | `--------------------------------*/ /*ARGSUSED*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) #else static void yy_symbol_value_print (yyoutput, yytype, yyvaluep) FILE *yyoutput; int yytype; YYSTYPE const * const yyvaluep; #endif { if (!yyvaluep) return; # ifdef YYPRINT if (yytype < YYNTOKENS) YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); # else YYUSE (yyoutput); # endif switch (yytype) { default: break; } } /*--------------------------------. | Print this symbol on YYOUTPUT. | `--------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) #else static void yy_symbol_print (yyoutput, yytype, yyvaluep) FILE *yyoutput; int yytype; YYSTYPE const * const yyvaluep; #endif { if (yytype < YYNTOKENS) YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); else YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); yy_symbol_value_print (yyoutput, yytype, yyvaluep); YYFPRINTF (yyoutput, ")"); } /*------------------------------------------------------------------. | yy_stack_print -- Print the state stack from its BOTTOM up to its | | TOP (included). | `------------------------------------------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_stack_print (yytype_int16 *bottom, yytype_int16 *top) #else static void yy_stack_print (bottom, top) yytype_int16 *bottom; yytype_int16 *top; #endif { YYFPRINTF (stderr, "Stack now"); for (; bottom <= top; ++bottom) YYFPRINTF (stderr, " %d", *bottom); YYFPRINTF (stderr, "\n"); } # define YY_STACK_PRINT(Bottom, Top) \ do { \ if (yydebug) \ yy_stack_print ((Bottom), (Top)); \ } while (YYID (0)) /*------------------------------------------------. | Report that the YYRULE is going to be reduced. | `------------------------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_reduce_print (YYSTYPE *yyvsp, int yyrule) #else static void yy_reduce_print (yyvsp, yyrule) YYSTYPE *yyvsp; int yyrule; #endif { int yynrhs = yyr2[yyrule]; int yyi; unsigned long int yylno = yyrline[yyrule]; YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", yyrule - 1, yylno); /* The symbols being reduced. */ for (yyi = 0; yyi < yynrhs; yyi++) { fprintf (stderr, " $%d = ", yyi + 1); yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], &(yyvsp[(yyi + 1) - (yynrhs)]) ); fprintf (stderr, "\n"); } } # define YY_REDUCE_PRINT(Rule) \ do { \ if (yydebug) \ yy_reduce_print (yyvsp, Rule); \ } while (YYID (0)) /* Nonzero means print parse trace. It is left uninitialized so that multiple parsers can coexist. */ int yydebug; #else /* !YYDEBUG */ # define YYDPRINTF(Args) # define YY_SYMBOL_PRINT(Title, Type, Value, Location) # define YY_STACK_PRINT(Bottom, Top) # define YY_REDUCE_PRINT(Rule) #endif /* !YYDEBUG */ /* YYINITDEPTH -- initial size of the parser's stacks. */ #ifndef YYINITDEPTH # define YYINITDEPTH 200 #endif /* YYMAXDEPTH -- maximum size the stacks can grow to (effective only if the built-in stack extension method is used). Do not make this value too large; the results are undefined if YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) evaluated with infinite-precision integer arithmetic. */ #ifndef YYMAXDEPTH # define YYMAXDEPTH 10000 #endif #if YYERROR_VERBOSE # ifndef yystrlen # if defined __GLIBC__ && defined _STRING_H # define yystrlen strlen # else /* Return the length of YYSTR. */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static YYSIZE_T yystrlen (const char *yystr) #else static YYSIZE_T yystrlen (yystr) const char *yystr; #endif { YYSIZE_T yylen; for (yylen = 0; yystr[yylen]; yylen++) continue; return yylen; } # endif # endif # ifndef yystpcpy # if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE # define yystpcpy stpcpy # else /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in YYDEST. */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static char * yystpcpy (char *yydest, const char *yysrc) #else static char * yystpcpy (yydest, yysrc) char *yydest; const char *yysrc; #endif { char *yyd = yydest; const char *yys = yysrc; while ((*yyd++ = *yys++) != '\0') continue; return yyd - 1; } # endif # endif # ifndef yytnamerr /* Copy to YYRES the contents of YYSTR after stripping away unnecessary quotes and backslashes, so that it's suitable for yyerror. The heuristic is that double-quoting is unnecessary unless the string contains an apostrophe, a comma, or backslash (other than backslash-backslash). YYSTR is taken from yytname. If YYRES is null, do not copy; instead, return the length of what the result would have been. */ static YYSIZE_T yytnamerr (char *yyres, const char *yystr) { if (*yystr == '"') { YYSIZE_T yyn = 0; char const *yyp = yystr; for (;;) switch (*++yyp) { case '\'': case ',': goto do_not_strip_quotes; case '\\': if (*++yyp != '\\') goto do_not_strip_quotes; /* Fall through. */ default: if (yyres) yyres[yyn] = *yyp; yyn++; break; case '"': if (yyres) yyres[yyn] = '\0'; return yyn; } do_not_strip_quotes: ; } if (! yyres) return yystrlen (yystr); return yystpcpy (yyres, yystr) - yyres; } # endif /* Copy into YYRESULT an error message about the unexpected token YYCHAR while in state YYSTATE. Return the number of bytes copied, including the terminating null byte. If YYRESULT is null, do not copy anything; just return the number of bytes that would be copied. As a special case, return 0 if an ordinary "syntax error" message will do. Return YYSIZE_MAXIMUM if overflow occurs during size calculation. */ static YYSIZE_T yysyntax_error (char *yyresult, int yystate, int yychar) { int yyn = yypact[yystate]; if (! (YYPACT_NINF < yyn && yyn <= YYLAST)) return 0; else { int yytype = YYTRANSLATE (yychar); YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); YYSIZE_T yysize = yysize0; YYSIZE_T yysize1; int yysize_overflow = 0; enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; int yyx; # if 0 /* This is so xgettext sees the translatable formats that are constructed on the fly. */ YY_("syntax error, unexpected %s"); YY_("syntax error, unexpected %s, expecting %s"); YY_("syntax error, unexpected %s, expecting %s or %s"); YY_("syntax error, unexpected %s, expecting %s or %s or %s"); YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); # endif char *yyfmt; char const *yyf; static char const yyunexpected[] = "syntax error, unexpected %s"; static char const yyexpecting[] = ", expecting %s"; static char const yyor[] = " or %s"; char yyformat[sizeof yyunexpected + sizeof yyexpecting - 1 + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) * (sizeof yyor - 1))]; char const *yyprefix = yyexpecting; /* Start YYX at -YYN if negative to avoid negative indexes in YYCHECK. */ int yyxbegin = yyn < 0 ? -yyn : 0; /* Stay within bounds of both yycheck and yytname. */ int yychecklim = YYLAST - yyn + 1; int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; int yycount = 1; yyarg[0] = yytname[yytype]; yyfmt = yystpcpy (yyformat, yyunexpected); for (yyx = yyxbegin; yyx < yyxend; ++yyx) if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) { if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) { yycount = 1; yysize = yysize0; yyformat[sizeof yyunexpected - 1] = '\0'; break; } yyarg[yycount++] = yytname[yyx]; yysize1 = yysize + yytnamerr (0, yytname[yyx]); yysize_overflow |= (yysize1 < yysize); yysize = yysize1; yyfmt = yystpcpy (yyfmt, yyprefix); yyprefix = yyor; } yyf = YY_(yyformat); yysize1 = yysize + yystrlen (yyf); yysize_overflow |= (yysize1 < yysize); yysize = yysize1; if (yysize_overflow) return YYSIZE_MAXIMUM; if (yyresult) { /* Avoid sprintf, as that infringes on the user's name space. Don't have undefined behavior even if the translation produced a string with the wrong number of "%s"s. */ char *yyp = yyresult; int yyi = 0; while ((*yyp = *yyf) != '\0') { if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) { yyp += yytnamerr (yyp, yyarg[yyi++]); yyf += 2; } else { yyp++; yyf++; } } } return yysize; } } #endif /* YYERROR_VERBOSE */ /*-----------------------------------------------. | Release the memory associated to this symbol. | `-----------------------------------------------*/ /*ARGSUSED*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep) #else static void yydestruct (yymsg, yytype, yyvaluep) const char *yymsg; int yytype; YYSTYPE *yyvaluep; #endif { YYUSE (yyvaluep); if (!yymsg) yymsg = "Deleting"; YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); switch (yytype) { default: break; } } /* Prevent warnings from -Wmissing-prototypes. */ #ifdef YYPARSE_PARAM #if defined __STDC__ || defined __cplusplus int yyparse (void *YYPARSE_PARAM); #else int yyparse (); #endif #else /* ! YYPARSE_PARAM */ #if defined __STDC__ || defined __cplusplus int yyparse (void); #else int yyparse (); #endif #endif /* ! YYPARSE_PARAM */ /* The look-ahead symbol. */ int yychar; /* The semantic value of the look-ahead symbol. */ YYSTYPE yylval; /* Number of syntax errors so far. */ int yynerrs; /*----------. | yyparse. | `----------*/ #ifdef YYPARSE_PARAM #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) int yyparse (void *YYPARSE_PARAM) #else int yyparse (YYPARSE_PARAM) void *YYPARSE_PARAM; #endif #else /* ! YYPARSE_PARAM */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) int yyparse (void) #else int yyparse () #endif #endif { int yystate; int yyn; int yyresult; /* Number of tokens to shift before error messages enabled. */ int yyerrstatus; /* Look-ahead token as an internal (translated) token number. */ int yytoken = 0; #if YYERROR_VERBOSE /* Buffer for error messages, and its allocated size. */ char yymsgbuf[128]; char *yymsg = yymsgbuf; YYSIZE_T yymsg_alloc = sizeof yymsgbuf; #endif /* Three stacks and their tools: `yyss': related to states, `yyvs': related to semantic values, `yyls': related to locations. Refer to the stacks thru separate pointers, to allow yyoverflow to reallocate them elsewhere. */ /* The state stack. */ yytype_int16 yyssa[YYINITDEPTH]; yytype_int16 *yyss = yyssa; yytype_int16 *yyssp; /* The semantic value stack. */ YYSTYPE yyvsa[YYINITDEPTH]; YYSTYPE *yyvs = yyvsa; YYSTYPE *yyvsp; #define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) YYSIZE_T yystacksize = YYINITDEPTH; /* The variables used to return semantic value and location from the action routines. */ YYSTYPE yyval; /* The number of symbols on the RHS of the reduced rule. Keep to zero when no symbol should be popped. */ int yylen = 0; YYDPRINTF ((stderr, "Starting parse\n")); yystate = 0; yyerrstatus = 0; yynerrs = 0; yychar = YYEMPTY; /* Cause a token to be read. */ /* Initialize stack pointers. Waste one element of value and location stack so that they stay on the same level as the state stack. The wasted elements are never initialized. */ yyssp = yyss; yyvsp = yyvs; goto yysetstate; /*------------------------------------------------------------. | yynewstate -- Push a new state, which is found in yystate. | `------------------------------------------------------------*/ yynewstate: /* In all cases, when you get here, the value and location stacks have just been pushed. So pushing a state here evens the stacks. */ yyssp++; yysetstate: *yyssp = yystate; if (yyss + yystacksize - 1 <= yyssp) { /* Get the current used size of the three stacks, in elements. */ YYSIZE_T yysize = yyssp - yyss + 1; #ifdef yyoverflow { /* Give user a chance to reallocate the stack. Use copies of these so that the &'s don't force the real ones into memory. */ YYSTYPE *yyvs1 = yyvs; yytype_int16 *yyss1 = yyss; /* Each stack pointer address is followed by the size of the data in use in that stack, in bytes. This used to be a conditional around just the two extra args, but that might be undefined if yyoverflow is a macro. */ yyoverflow (YY_("memory exhausted"), &yyss1, yysize * sizeof (*yyssp), &yyvs1, yysize * sizeof (*yyvsp), &yystacksize); yyss = yyss1; yyvs = yyvs1; } #else /* no yyoverflow */ # ifndef YYSTACK_RELOCATE goto yyexhaustedlab; # else /* Extend the stack our own way. */ if (YYMAXDEPTH <= yystacksize) goto yyexhaustedlab; yystacksize *= 2; if (YYMAXDEPTH < yystacksize) yystacksize = YYMAXDEPTH; { yytype_int16 *yyss1 = yyss; union yyalloc *yyptr = (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); if (! yyptr) goto yyexhaustedlab; YYSTACK_RELOCATE (yyss); YYSTACK_RELOCATE (yyvs); # undef YYSTACK_RELOCATE if (yyss1 != yyssa) YYSTACK_FREE (yyss1); } # endif #endif /* no yyoverflow */ yyssp = yyss + yysize - 1; yyvsp = yyvs + yysize - 1; YYDPRINTF ((stderr, "Stack size increased to %lu\n", (unsigned long int) yystacksize)); if (yyss + yystacksize - 1 <= yyssp) YYABORT; } YYDPRINTF ((stderr, "Entering state %d\n", yystate)); goto yybackup; /*-----------. | yybackup. | `-----------*/ yybackup: /* Do appropriate processing given the current state. Read a look-ahead token if we need one and don't already have one. */ /* First try to decide what to do without reference to look-ahead token. */ yyn = yypact[yystate]; if (yyn == YYPACT_NINF) goto yydefault; /* Not known => get a look-ahead token if don't already have one. */ /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */ if (yychar == YYEMPTY) { YYDPRINTF ((stderr, "Reading a token: ")); yychar = YYLEX; } if (yychar <= YYEOF) { yychar = yytoken = YYEOF; YYDPRINTF ((stderr, "Now at end of input.\n")); } else { yytoken = YYTRANSLATE (yychar); YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); } /* If the proper action on seeing token YYTOKEN is to reduce or to detect an error, take that action. */ yyn += yytoken; if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) goto yydefault; yyn = yytable[yyn]; if (yyn <= 0) { if (yyn == 0 || yyn == YYTABLE_NINF) goto yyerrlab; yyn = -yyn; goto yyreduce; } if (yyn == YYFINAL) YYACCEPT; /* Count tokens shifted since error; after three, turn off error status. */ if (yyerrstatus) yyerrstatus--; /* Shift the look-ahead token. */ YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); /* Discard the shifted token unless it is eof. */ if (yychar != YYEOF) yychar = YYEMPTY; yystate = yyn; *++yyvsp = yylval; goto yynewstate; /*-----------------------------------------------------------. | yydefault -- do the default action for the current state. | `-----------------------------------------------------------*/ yydefault: yyn = yydefact[yystate]; if (yyn == 0) goto yyerrlab; goto yyreduce; /*-----------------------------. | yyreduce -- Do a reduction. | `-----------------------------*/ yyreduce: /* yyn is the number of a rule to reduce with. */ yylen = yyr2[yyn]; /* If YYLEN is nonzero, implement the default value of the action: `$$ = $1'. Otherwise, the following line sets YYVAL to garbage. This behavior is undocumented and Bison users should not rely upon it. Assigning to YYVAL unconditionally makes the parser a bit smaller, and it avoids a GCC warning that YYVAL may be used uninitialized. */ yyval = yyvsp[1-yylen]; YY_REDUCE_PRINT (yyn); switch (yyn) { case 2: #line 229 "soapcpp2_yacc.y" { if (lflag) { custom_header = 0; custom_fault = 0; } else { add_header(); add_fault(); } compile(sp->table); freetable(classtable); freetable(enumtable); freetable(typetable); freetable(booltable); freetable(templatetable); yylineno = 0; ;} break; case 3: #line 249 "soapcpp2_yacc.y" { classtable = mktable(NULL); enumtable = mktable(NULL); typetable = mktable(NULL); booltable = mktable(NULL); templatetable = mktable(NULL); p = enter(booltable, lookup("false")); p->info.typ = mkint(); p->info.val.i = 0; p = enter(booltable, lookup("true")); p->info.typ = mkint(); p->info.val.i = 1; mkscope(mktable(mktable(NULL)), 0); ;} break; case 4: #line 265 "soapcpp2_yacc.y" { namespaceid = (yyvsp[(2) - (5)].sym)->name; ;} break; case 5: #line 266 "soapcpp2_yacc.y" { ;} break; case 6: #line 268 "soapcpp2_yacc.y" { add_soap(); add_qname(); add_XML(); ;} break; case 7: #line 273 "soapcpp2_yacc.y" { ;} break; case 8: #line 275 "soapcpp2_yacc.y" { ;} break; case 9: #line 276 "soapcpp2_yacc.y" { ;} break; case 10: #line 277 "soapcpp2_yacc.y" { ;} break; case 11: #line 278 "soapcpp2_yacc.y" { ;} break; case 12: #line 279 "soapcpp2_yacc.y" { synerror("input before ; skipped"); while (sp > stack) { freetable(sp->table); exitscope(); } yyerrok; ;} break; case 13: #line 289 "soapcpp2_yacc.y" { if ((yyvsp[(1) - (1)].s)[1] >= 'a' && (yyvsp[(1) - (1)].s)[1] <= 'z') { char *s; for (pp = &pragmas; *pp; pp = &(*pp)->next) ; *pp = (Pragma*)emalloc(sizeof(Pragma)); s = (char*)emalloc(strlen((yyvsp[(1) - (1)].s))+1); strcpy(s, (yyvsp[(1) - (1)].s)); (*pp)->pragma = s; (*pp)->next = NULL; } else if ((i = atoi((yyvsp[(1) - (1)].s)+2)) > 0) { yylineno = i; } else { sprintf(errbuf, "directive '%s' ignored (use #import to import files)", (yyvsp[(1) - (1)].s)); semwarn(errbuf); } ;} break; case 14: #line 319 "soapcpp2_yacc.y" { transient &= ~6; permission = 0; ;} break; case 15: #line 324 "soapcpp2_yacc.y" { ;} break; case 16: #line 326 "soapcpp2_yacc.y" { ;} break; case 17: #line 328 "soapcpp2_yacc.y" { ;} break; case 18: #line 330 "soapcpp2_yacc.y" { ;} break; case 19: #line 332 "soapcpp2_yacc.y" { ;} break; case 20: #line 333 "soapcpp2_yacc.y" { synerror("declaration expected"); yyerrok; ;} break; case 21: #line 338 "soapcpp2_yacc.y" { transient |= 1; ;} break; case 22: #line 340 "soapcpp2_yacc.y" { transient &= ~1; ;} break; case 23: #line 342 "soapcpp2_yacc.y" { permission = Sprivate; ;} break; case 24: #line 344 "soapcpp2_yacc.y" { permission = Sprotected; ;} break; case 25: #line 346 "soapcpp2_yacc.y" { permission = 0; ;} break; case 26: #line 348 "soapcpp2_yacc.y" { ;} break; case 27: #line 349 "soapcpp2_yacc.y" { ;} break; case 28: #line 351 "soapcpp2_yacc.y" { ;} break; case 29: #line 352 "soapcpp2_yacc.y" { ;} break; case 30: #line 353 "soapcpp2_yacc.y" { ;} break; case 31: #line 354 "soapcpp2_yacc.y" { ;} break; case 32: #line 356 "soapcpp2_yacc.y" { ;} break; case 33: #line 357 "soapcpp2_yacc.y" { sprintf(errbuf, "undefined type in declaration of '%s'", (yyvsp[(2) - (2)].sym)->name); synerror(errbuf); yyerrok; ;} break; case 34: #line 362 "soapcpp2_yacc.y" { synerror("function declaration?"); yyerrok; ;} break; case 35: #line 368 "soapcpp2_yacc.y" { if (((yyvsp[(3) - (6)].rec).sto & Stypedef) && sp->table->level == GLOBAL) { if (((yyvsp[(3) - (6)].rec).typ->type != Tstruct && (yyvsp[(3) - (6)].rec).typ->type != Tunion && (yyvsp[(3) - (6)].rec).typ->type != Tenum && (yyvsp[(3) - (6)].rec).typ->type != Tenumsc) || strcmp((yyvsp[(2) - (6)].sym)->name, (yyvsp[(3) - (6)].rec).typ->id->name)) { p = enter(typetable, (yyvsp[(2) - (6)].sym)); p->info.typ = mksymtype((yyvsp[(3) - (6)].rec).typ, (yyvsp[(2) - (6)].sym)); if ((yyvsp[(3) - (6)].rec).sto & Sextern) { p->info.typ->transient = -1; p->info.typ->extsym = (yyvsp[(2) - (6)].sym); } else if (is_external((yyvsp[(3) - (6)].rec).typ)) p->info.typ->transient = -3; /* extern and volatile */ else p->info.typ->transient = (yyvsp[(3) - (6)].rec).typ->transient; if (p->info.typ->width == 0) p->info.typ->width = 8; p->info.sto = (yyvsp[(3) - (6)].rec).sto; p->info.typ->synonym = (yyvsp[(3) - (6)].rec).typ->sym; if ((yyvsp[(5) - (6)].rec).hasmin) { p->info.typ->hasmin = (yyvsp[(5) - (6)].rec).hasmin; p->info.typ->incmin = (yyvsp[(5) - (6)].rec).incmin; p->info.typ->min = (yyvsp[(5) - (6)].rec).min; p->info.typ->synonym = NULL; } else { p->info.typ->hasmin = (yyvsp[(3) - (6)].rec).typ->hasmin; p->info.typ->incmin = (yyvsp[(3) - (6)].rec).typ->incmin; p->info.typ->min = (yyvsp[(3) - (6)].rec).typ->min; } if ((yyvsp[(5) - (6)].rec).hasmax) { p->info.typ->hasmax = (yyvsp[(5) - (6)].rec).hasmax; p->info.typ->incmax = (yyvsp[(5) - (6)].rec).incmax; p->info.typ->max = (yyvsp[(5) - (6)].rec).max; p->info.typ->synonym = NULL; } else { p->info.typ->hasmax = (yyvsp[(3) - (6)].rec).typ->hasmax; p->info.typ->incmax = (yyvsp[(3) - (6)].rec).typ->incmax; p->info.typ->max = (yyvsp[(3) - (6)].rec).typ->max; } if ((yyvsp[(5) - (6)].rec).pattern) { p->info.typ->pattern = (yyvsp[(5) - (6)].rec).pattern; p->info.typ->synonym = NULL; } else { p->info.typ->pattern = (yyvsp[(3) - (6)].rec).typ->pattern; } } (yyvsp[(2) - (6)].sym)->token = TYPE; } else { p = enter(sp->table, (yyvsp[(2) - (6)].sym)); p->tag = (yyvsp[(4) - (6)].s); p->info.typ = (yyvsp[(3) - (6)].rec).typ; p->info.sto = (Storage)((int)(yyvsp[(3) - (6)].rec).sto | permission); if ((yyvsp[(6) - (6)].rec).hasval) { p->info.hasval = True; switch ((yyvsp[(3) - (6)].rec).typ->type) { case Tchar: case Tuchar: case Tshort: case Tushort: case Tint: case Tuint: case Tlong: case Tulong: case Tllong: case Tullong: case Tenum: case Tenumsc: case Ttime: if ((yyvsp[(6) - (6)].rec).typ->type == Tint || (yyvsp[(6) - (6)].rec).typ->type == Tchar || (yyvsp[(6) - (6)].rec).typ->type == Tenum || (yyvsp[(6) - (6)].rec).typ->type == Tenumsc) { sp->val = p->info.val.i = (yyvsp[(6) - (6)].rec).val.i; if (((yyvsp[(3) - (6)].rec).typ->hasmin && (yyvsp[(3) - (6)].rec).typ->min > (double)(yyvsp[(6) - (6)].rec).val.i) || ((yyvsp[(3) - (6)].rec).typ->hasmin && !(yyvsp[(3) - (6)].rec).typ->incmin && (yyvsp[(3) - (6)].rec).typ->min == (double)(yyvsp[(6) - (6)].rec).val.i) || ((yyvsp[(3) - (6)].rec).typ->hasmax && (yyvsp[(3) - (6)].rec).typ->max < (double)(yyvsp[(6) - (6)].rec).val.i) || ((yyvsp[(3) - (6)].rec).typ->hasmax && !(yyvsp[(3) - (6)].rec).typ->incmax && (yyvsp[(3) - (6)].rec).typ->max == (double)(yyvsp[(6) - (6)].rec).val.i)) semerror("initialization constant outside value range"); } else { semerror("type error in initialization constant"); p->info.hasval = False; } break; case Tfloat: case Tdouble: case Tldouble: if ((yyvsp[(6) - (6)].rec).typ->type == Tfloat || (yyvsp[(6) - (6)].rec).typ->type == Tdouble || (yyvsp[(6) - (6)].rec).typ->type == Tldouble) { p->info.val.r = (yyvsp[(6) - (6)].rec).val.r; if (((yyvsp[(3) - (6)].rec).typ->hasmin && (yyvsp[(3) - (6)].rec).typ->min > (yyvsp[(6) - (6)].rec).val.r) || ((yyvsp[(3) - (6)].rec).typ->hasmin && !(yyvsp[(3) - (6)].rec).typ->incmin && (yyvsp[(3) - (6)].rec).typ->min == (yyvsp[(6) - (6)].rec).val.r) || ((yyvsp[(3) - (6)].rec).typ->hasmax && (yyvsp[(3) - (6)].rec).typ->max < (yyvsp[(6) - (6)].rec).val.r) || ((yyvsp[(3) - (6)].rec).typ->hasmax && !(yyvsp[(3) - (6)].rec).typ->incmax && (yyvsp[(3) - (6)].rec).typ->max == (yyvsp[(6) - (6)].rec).val.r)) semerror("initialization constant outside value range"); } else if ((yyvsp[(6) - (6)].rec).typ->type == Tint) { p->info.val.r = (double)(yyvsp[(6) - (6)].rec).val.i; if (((yyvsp[(3) - (6)].rec).typ->hasmin && (yyvsp[(3) - (6)].rec).typ->min > (double)(yyvsp[(6) - (6)].rec).val.i) || ((yyvsp[(3) - (6)].rec).typ->hasmin && !(yyvsp[(3) - (6)].rec).typ->incmin && (yyvsp[(3) - (6)].rec).typ->min == (double)(yyvsp[(6) - (6)].rec).val.i) || ((yyvsp[(3) - (6)].rec).typ->hasmax && (yyvsp[(3) - (6)].rec).typ->max < (double)(yyvsp[(6) - (6)].rec).val.i) || ((yyvsp[(3) - (6)].rec).typ->hasmax && !(yyvsp[(3) - (6)].rec).typ->incmax && (yyvsp[(3) - (6)].rec).typ->max == (double)(yyvsp[(6) - (6)].rec).val.i)) semerror("initialization constant outside value range"); } else { semerror("type error in initialization constant"); p->info.hasval = False; } break; default: if ((yyvsp[(3) - (6)].rec).typ->type == Tpointer && (((Tnode*)(yyvsp[(3) - (6)].rec).typ->ref)->type == Tchar || ((Tnode*)(yyvsp[(3) - (6)].rec).typ->ref)->type == Twchar) && (yyvsp[(6) - (6)].rec).typ->type == Tpointer && ((Tnode*)(yyvsp[(6) - (6)].rec).typ->ref)->type == Tchar) p->info.val.s = (yyvsp[(6) - (6)].rec).val.s; else if (bflag && (yyvsp[(3) - (6)].rec).typ->type == Tarray && ((Tnode*)(yyvsp[(3) - (6)].rec).typ->ref)->type == Tchar && (yyvsp[(6) - (6)].rec).typ->type == Tpointer && ((Tnode*)(yyvsp[(6) - (6)].rec).typ->ref)->type == Tchar) { if ((yyvsp[(3) - (6)].rec).typ->width / ((Tnode*)(yyvsp[(3) - (6)].rec).typ->ref)->width - 1 < (int)strlen((yyvsp[(6) - (6)].rec).val.s)) { semerror("char[] initialization constant too long"); p->info.val.s = ""; } else { p->info.val.s = (yyvsp[(6) - (6)].rec).val.s; } } else if (((yyvsp[(3) - (6)].rec).typ->type == Tpointer || is_smart((yyvsp[(3) - (6)].rec).typ)) && (((Tnode*)(yyvsp[(3) - (6)].rec).typ->ref)->id == lookup("std::string") || ((Tnode*)(yyvsp[(3) - (6)].rec).typ->ref)->id == lookup("std::wstring"))) { p->info.val.s = (yyvsp[(6) - (6)].rec).val.s; } else if ((yyvsp[(3) - (6)].rec).typ->id == lookup("std::string") || (yyvsp[(3) - (6)].rec).typ->id == lookup("std::wstring")) { p->info.val.s = (yyvsp[(6) - (6)].rec).val.s; } else if ((yyvsp[(3) - (6)].rec).typ->type == Tpointer && (yyvsp[(6) - (6)].rec).typ->type == Tint && (yyvsp[(6) - (6)].rec).val.i == 0) { p->info.val.i = 0; } else { semerror("type error in initialization constant"); p->info.hasval = False; } break; } } else { p->info.val.i = sp->val; } if ((yyvsp[(5) - (6)].rec).minOccurs < 0) { if ((yyvsp[(6) - (6)].rec).hasval || ((yyvsp[(3) - (6)].rec).sto & Sattribute) || (yyvsp[(3) - (6)].rec).typ->type == Tpointer || (yyvsp[(3) - (6)].rec).typ->type == Ttemplate || !strncmp((yyvsp[(2) - (6)].sym)->name, "__size", 6)) p->info.minOccurs = 0; else p->info.minOccurs = 1; } else { p->info.minOccurs = (yyvsp[(5) - (6)].rec).minOccurs; } p->info.maxOccurs = (yyvsp[(5) - (6)].rec).maxOccurs; if (sp->mask) sp->val <<= 1; else sp->val++; p->info.offset = sp->offset; if ((yyvsp[(3) - (6)].rec).sto & Sextern) p->level = GLOBAL; else if ((yyvsp[(3) - (6)].rec).sto & Stypedef) ; else if (sp->grow) sp->offset += p->info.typ->width; else if (p->info.typ->width > sp->offset) sp->offset = p->info.typ->width; } sp->entry = p; ;} break; case 36: #line 587 "soapcpp2_yacc.y" { if ((yyvsp[(1) - (2)].rec).sto & Stypedef) { sprintf(errbuf, "invalid typedef qualifier for '%s'", (yyvsp[(2) - (2)].sym)->name); semwarn(errbuf); } p = enter(sp->table, (yyvsp[(2) - (2)].sym)); p->info.typ = (yyvsp[(1) - (2)].rec).typ; p->info.sto = (yyvsp[(1) - (2)].rec).sto; p->info.hasval = False; p->info.offset = sp->offset; if (sp->grow) sp->offset += p->info.typ->width; else if (p->info.typ->width > sp->offset) sp->offset = p->info.typ->width; sp->entry = p; ;} break; case 37: #line 605 "soapcpp2_yacc.y" { (yyval.sym) = (yyvsp[(1) - (1)].sym); ;} break; case 38: #line 606 "soapcpp2_yacc.y" { (yyval.sym) = (yyvsp[(1) - (1)].sym); ;} break; case 39: #line 608 "soapcpp2_yacc.y" { (yyval.sym) = (yyvsp[(1) - (1)].sym); ;} break; case 40: #line 609 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator!"); ;} break; case 41: #line 610 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator~"); ;} break; case 42: #line 611 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator="); ;} break; case 43: #line 612 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator+="); ;} break; case 44: #line 613 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator-="); ;} break; case 45: #line 614 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator*="); ;} break; case 46: #line 615 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator/="); ;} break; case 47: #line 616 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator%="); ;} break; case 48: #line 617 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator&="); ;} break; case 49: #line 618 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator^="); ;} break; case 50: #line 619 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator|="); ;} break; case 51: #line 620 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator<<="); ;} break; case 52: #line 621 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator>>="); ;} break; case 53: #line 622 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator||"); ;} break; case 54: #line 623 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator&&"); ;} break; case 55: #line 624 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator|"); ;} break; case 56: #line 625 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator^"); ;} break; case 57: #line 626 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator&"); ;} break; case 58: #line 627 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator=="); ;} break; case 59: #line 628 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator!="); ;} break; case 60: #line 629 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator<"); ;} break; case 61: #line 630 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator<="); ;} break; case 62: #line 631 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator>"); ;} break; case 63: #line 632 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator>="); ;} break; case 64: #line 633 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator<<"); ;} break; case 65: #line 634 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator>>"); ;} break; case 66: #line 635 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator+"); ;} break; case 67: #line 636 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator-"); ;} break; case 68: #line 637 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator*"); ;} break; case 69: #line 638 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator/"); ;} break; case 70: #line 639 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator%"); ;} break; case 71: #line 640 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator++"); ;} break; case 72: #line 641 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator--"); ;} break; case 73: #line 642 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator->"); ;} break; case 74: #line 643 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator[]"); ;} break; case 75: #line 644 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator()"); ;} break; case 76: #line 645 "soapcpp2_yacc.y" { s1 = c_storage((yyvsp[(2) - (2)].rec).sto); s2 = c_type((yyvsp[(2) - (2)].rec).typ); s = (char*)emalloc(strlen(s1) + strlen(s2) + 10); strcpy(s, "operator "); strcat(s, s1); strcat(s, s2); (yyval.sym) = lookup(s); if (!(yyval.sym)) (yyval.sym) = install(s, ID); ;} break; case 77: #line 657 "soapcpp2_yacc.y" { if (!(p = entry(classtable, (yyvsp[(1) - (1)].sym)))) semerror("invalid constructor"); sp->entry = enter(sp->table, (yyvsp[(1) - (1)].sym)); sp->entry->info.typ = mknone(); sp->entry->info.sto = Snone; sp->entry->info.offset = sp->offset; sp->node.typ = mkvoid(); sp->node.sto = Snone; ;} break; case 78: #line 669 "soapcpp2_yacc.y" { if (!(p = entry(classtable, (yyvsp[(3) - (3)].sym)))) semerror("invalid destructor"); s = (char*)emalloc(strlen((yyvsp[(3) - (3)].sym)->name) + 2); s2 = strrchr((yyvsp[(3) - (3)].sym)->name, ':'); if (s2 && *(s2+1) && (s2 == (yyvsp[(3) - (3)].sym)->name || *(s2-1) != ':')) { strncpy(s, (yyvsp[(3) - (3)].sym)->name, s2 - (yyvsp[(3) - (3)].sym)->name + 1); strcat(s, "~"); strcat(s, s2 + 1); } else { strcpy(s, "~"); strcat(s, (yyvsp[(3) - (3)].sym)->name); } sym = lookup(s); if (!sym) sym = install(s, ID); sp->entry = enter(sp->table, sym); sp->entry->info.typ = mknone(); sp->entry->info.sto = (yyvsp[(1) - (3)].sto); sp->entry->info.offset = sp->offset; sp->node.typ = mkvoid(); sp->node.sto = Snone; ;} break; case 79: #line 697 "soapcpp2_yacc.y" { if ((yyvsp[(1) - (7)].e)->level == GLOBAL) { if (!((yyvsp[(1) - (7)].e)->info.sto & Sextern) && sp->entry && sp->entry->info.typ->type == Tpointer && ((Tnode*)sp->entry->info.typ->ref)->type == Tchar) { sprintf(errbuf, "last output parameter of service operation function prototype '%s' is a pointer to a char which will only return one byte: use char** instead to return a string", (yyvsp[(1) - (7)].e)->sym->name); semwarn(errbuf); } if ((yyvsp[(1) - (7)].e)->info.sto & Sextern) { (yyvsp[(1) - (7)].e)->info.typ = mkmethod((yyvsp[(1) - (7)].e)->info.typ, sp->table); } else if (sp->entry && (sp->entry->info.typ->type == Tpointer || sp->entry->info.typ->type == Treference || sp->entry->info.typ->type == Tarray || is_transient(sp->entry->info.typ))) { if ((yyvsp[(1) - (7)].e)->info.typ->type == Tint) { sp->entry->info.sto = (Storage)((int)sp->entry->info.sto | (int)Sreturn); (yyvsp[(1) - (7)].e)->info.typ = mkfun(sp->entry); (yyvsp[(1) - (7)].e)->info.typ->id = (yyvsp[(1) - (7)].e)->sym; if (!is_transient(sp->entry->info.typ)) { if (!is_response(sp->entry->info.typ)) { if (!is_XML(sp->entry->info.typ)) add_response((yyvsp[(1) - (7)].e), sp->entry); } else { add_result(sp->entry->info.typ); } } add_request((yyvsp[(1) - (7)].e)->sym, sp); } else { sprintf(errbuf, "return type of service operation function prototype '%s' must be integer", (yyvsp[(1) - (7)].e)->sym->name); semerror(errbuf); } } else { sprintf(errbuf, "last output parameter of service operation function prototype '%s' is a return parameter and must be a pointer or reference, or use %s(..., void) for one-way sends", (yyvsp[(1) - (7)].e)->sym->name, (yyvsp[(1) - (7)].e)->sym->name); semerror(errbuf); } } else if ((yyvsp[(1) - (7)].e)->level == INTERNAL) { (yyvsp[(1) - (7)].e)->info.typ = mkmethod((yyvsp[(1) - (7)].e)->info.typ, sp->table); (yyvsp[(1) - (7)].e)->info.sto = (Storage)((int)(yyvsp[(1) - (7)].e)->info.sto | (int)(yyvsp[(6) - (7)].sto) | (int)(yyvsp[(7) - (7)].sto)); transient &= ~1; } exitscope(); ;} break; case 80: #line 757 "soapcpp2_yacc.y" { (yyval.e) = sp->entry; ;} break; case 81: #line 759 "soapcpp2_yacc.y" { ;} break; case 82: #line 760 "soapcpp2_yacc.y" { ;} break; case 83: #line 762 "soapcpp2_yacc.y" { ;} break; case 84: #line 763 "soapcpp2_yacc.y" { ;} break; case 85: #line 764 "soapcpp2_yacc.y" { sprintf(errbuf, "undefined '%s'", (yyvsp[(2) - (2)].sym)->name); synerror(errbuf); ;} break; case 86: #line 768 "soapcpp2_yacc.y" { synerror("formal argument expected"); yyerrok; ;} break; case 87: #line 774 "soapcpp2_yacc.y" { if ((yyvsp[(4) - (6)].rec).sto & Stypedef) semwarn("typedef in function argument"); p = enter(sp->table, (yyvsp[(3) - (6)].sym)); p->info.typ = (yyvsp[(4) - (6)].rec).typ; p->info.sto = (yyvsp[(4) - (6)].rec).sto; if ((yyvsp[(5) - (6)].rec).minOccurs < 0) { if ((yyvsp[(6) - (6)].rec).hasval || ((yyvsp[(4) - (6)].rec).sto & Sattribute) || (yyvsp[(4) - (6)].rec).typ->type == Tpointer) p->info.minOccurs = 0; else p->info.minOccurs = 1; } else { p->info.minOccurs = (yyvsp[(5) - (6)].rec).minOccurs; } p->info.maxOccurs = (yyvsp[(5) - (6)].rec).maxOccurs; if ((yyvsp[(6) - (6)].rec).hasval) { p->info.hasval = True; switch ((yyvsp[(4) - (6)].rec).typ->type) { case Tchar: case Tuchar: case Tshort: case Tushort: case Tint: case Tuint: case Tlong: case Tulong: case Tenum: case Tenumsc: case Ttime: if ((yyvsp[(6) - (6)].rec).typ->type == Tint || (yyvsp[(6) - (6)].rec).typ->type == Tchar || (yyvsp[(6) - (6)].rec).typ->type == Tenum || (yyvsp[(6) - (6)].rec).typ->type == Tenumsc) { sp->val = p->info.val.i = (yyvsp[(6) - (6)].rec).val.i; if (((yyvsp[(4) - (6)].rec).typ->hasmin && (yyvsp[(4) - (6)].rec).typ->min > (double)(yyvsp[(6) - (6)].rec).val.i) || ((yyvsp[(4) - (6)].rec).typ->hasmin && !(yyvsp[(4) - (6)].rec).typ->incmin && (yyvsp[(4) - (6)].rec).typ->min == (double)(yyvsp[(6) - (6)].rec).val.i) || ((yyvsp[(4) - (6)].rec).typ->hasmax && (yyvsp[(4) - (6)].rec).typ->max < (double)(yyvsp[(6) - (6)].rec).val.i) || ((yyvsp[(4) - (6)].rec).typ->hasmax && !(yyvsp[(4) - (6)].rec).typ->incmax && (yyvsp[(4) - (6)].rec).typ->max == (double)(yyvsp[(6) - (6)].rec).val.i)) semerror("initialization constant outside value range"); } else { semerror("type error in initialization constant"); p->info.hasval = False; } break; case Tfloat: case Tdouble: case Tldouble: if ((yyvsp[(6) - (6)].rec).typ->type == Tfloat || (yyvsp[(6) - (6)].rec).typ->type == Tdouble || (yyvsp[(6) - (6)].rec).typ->type == Tldouble) { p->info.val.r = (yyvsp[(6) - (6)].rec).val.r; if (((yyvsp[(4) - (6)].rec).typ->hasmin && (yyvsp[(4) - (6)].rec).typ->min > (yyvsp[(6) - (6)].rec).val.r) || ((yyvsp[(4) - (6)].rec).typ->hasmin && !(yyvsp[(4) - (6)].rec).typ->incmin && (yyvsp[(4) - (6)].rec).typ->min == (yyvsp[(6) - (6)].rec).val.r) || ((yyvsp[(4) - (6)].rec).typ->hasmax && (yyvsp[(4) - (6)].rec).typ->max < (yyvsp[(6) - (6)].rec).val.r) || ((yyvsp[(4) - (6)].rec).typ->hasmax && !(yyvsp[(4) - (6)].rec).typ->incmax && (yyvsp[(4) - (6)].rec).typ->max == (yyvsp[(6) - (6)].rec).val.r)) semerror("initialization constant outside value range"); } else if ((yyvsp[(6) - (6)].rec).typ->type == Tint) { p->info.val.r = (double)(yyvsp[(6) - (6)].rec).val.i; if (((yyvsp[(4) - (6)].rec).typ->hasmin && (yyvsp[(4) - (6)].rec).typ->min > (double)(yyvsp[(6) - (6)].rec).val.i) || ((yyvsp[(4) - (6)].rec).typ->hasmin && !(yyvsp[(4) - (6)].rec).typ->incmin && (yyvsp[(4) - (6)].rec).typ->min == (double)(yyvsp[(6) - (6)].rec).val.i) || ((yyvsp[(4) - (6)].rec).typ->hasmax && (yyvsp[(4) - (6)].rec).typ->max < (double)(yyvsp[(6) - (6)].rec).val.i) || ((yyvsp[(4) - (6)].rec).typ->hasmax && !(yyvsp[(4) - (6)].rec).typ->incmax && (yyvsp[(4) - (6)].rec).typ->max == (double)(yyvsp[(6) - (6)].rec).val.i)) semerror("initialization constant outside value range"); } else { semerror("type error in initialization constant"); p->info.hasval = False; } break; default: if ((yyvsp[(4) - (6)].rec).typ->type == Tpointer && (((Tnode*)(yyvsp[(4) - (6)].rec).typ->ref)->type == Tchar || ((Tnode*)(yyvsp[(4) - (6)].rec).typ->ref)->type == Twchar) && (yyvsp[(6) - (6)].rec).typ->type == Tpointer && ((Tnode*)(yyvsp[(6) - (6)].rec).typ->ref)->type == Tchar) { p->info.val.s = (yyvsp[(6) - (6)].rec).val.s; } else if (((yyvsp[(4) - (6)].rec).typ->type == Tpointer || is_smart((yyvsp[(4) - (6)].rec).typ)) && (((Tnode*)(yyvsp[(4) - (6)].rec).typ->ref)->id == lookup("std::string") || ((Tnode*)(yyvsp[(4) - (6)].rec).typ->ref)->id == lookup("std::wstring"))) { p->info.val.s = (yyvsp[(6) - (6)].rec).val.s; } else if ((yyvsp[(4) - (6)].rec).typ->id == lookup("std::string") || (yyvsp[(4) - (6)].rec).typ->id == lookup("std::wstring")) { p->info.val.s = (yyvsp[(6) - (6)].rec).val.s; } else if ((yyvsp[(4) - (6)].rec).typ->type == Tpointer && (yyvsp[(6) - (6)].rec).typ->type == Tint && (yyvsp[(6) - (6)].rec).val.i == 0) { p->info.val.i = 0; } else { semerror("type error in initialization constant"); p->info.hasval = False; } break; } } p->info.offset = sp->offset; if ((yyvsp[(4) - (6)].rec).sto & Sextern) p->level = GLOBAL; else if (sp->grow) sp->offset += p->info.typ->width; else if (p->info.typ->width > sp->offset) sp->offset = p->info.typ->width; sp->entry = p; ;} break; case 88: #line 901 "soapcpp2_yacc.y" { if (sp->table->level != PARAM) (yyval.sym) = gensymidx("param", (int)++sp->val); else if (eflag) (yyval.sym) = gensymidx("_param", (int)++sp->val); else (yyval.sym) = gensym("_param"); ;} break; case 89: #line 909 "soapcpp2_yacc.y" { if (soap_version == 2 && *(yyvsp[(1) - (1)].sym)->name == '_' && sp->table->level == GLOBAL) { sprintf(errbuf, "SOAP 1.2 does not support anonymous parameters '%s'", (yyvsp[(1) - (1)].sym)->name); semwarn(errbuf); } (yyval.sym) = (yyvsp[(1) - (1)].sym); ;} break; case 90: #line 927 "soapcpp2_yacc.y" { (yyval.rec) = (yyvsp[(1) - (1)].rec); ;} break; case 91: #line 929 "soapcpp2_yacc.y" { (yyval.rec).typ = mkmethod(tmp.typ, sp->table); transient &= ~1; exitscope(); ;} break; case 92: #line 936 "soapcpp2_yacc.y" { (yyval.rec) = (yyvsp[(3) - (3)].rec); ;} break; case 93: #line 938 "soapcpp2_yacc.y" { (yyval.rec) = (yyvsp[(4) - (4)].rec); ;} break; case 94: #line 940 "soapcpp2_yacc.y" { (yyval.rec).typ = mkint(); (yyval.rec).sto = Snone; sp->node = (yyval.rec); ;} break; case 95: #line 945 "soapcpp2_yacc.y" { (yyval.rec).typ = (yyvsp[(2) - (2)].rec).typ; (yyval.rec).sto = (Storage)((int)(yyvsp[(1) - (2)].sto) | (int)(yyvsp[(2) - (2)].rec).sto); if (((yyval.rec).sto & Sattribute)) { if (is_smart((yyvsp[(2) - (2)].rec).typ)) { if (!is_primitive_or_string((yyvsp[(2) - (2)].rec).typ->ref) && !is_stdstr((yyvsp[(2) - (2)].rec).typ->ref) && !is_binary((yyvsp[(2) - (2)].rec).typ->ref) && !is_external((yyvsp[(2) - (2)].rec).typ->ref)) { semwarn("invalid attribute smart pointer @type"); (yyval.rec).sto = (Storage)((int)(yyval.rec).sto & ~Sattribute); } } else if ((yyvsp[(2) - (2)].rec).typ->type == Tpointer) { if (!is_primitive_or_string((yyvsp[(2) - (2)].rec).typ->ref) && !is_stdstr((yyvsp[(2) - (2)].rec).typ->ref) && !is_binary((yyvsp[(2) - (2)].rec).typ->ref) && !is_external((yyvsp[(2) - (2)].rec).typ->ref)) { semwarn("invalid attribute pointer @type"); (yyval.rec).sto = (Storage)((int)(yyval.rec).sto & ~Sattribute); } } else if ( !is_primitive_or_string((yyvsp[(2) - (2)].rec).typ) && !is_stdstr((yyvsp[(2) - (2)].rec).typ) && !is_binary((yyvsp[(2) - (2)].rec).typ) && !is_external((yyvsp[(2) - (2)].rec).typ)) { semwarn("invalid attribute @type"); (yyval.rec).sto = (Storage)((int)(yyval.rec).sto & ~Sattribute); } } sp->node = (yyval.rec); if ((yyvsp[(1) - (2)].sto) & Sextern) transient = 0; ;} break; case 96: #line 986 "soapcpp2_yacc.y" { if ((yyvsp[(1) - (2)].typ)->type == Tint) switch ((yyvsp[(2) - (2)].rec).typ->type) { case Tchar: (yyval.rec).typ = (yyvsp[(2) - (2)].rec).typ; break; case Tshort: (yyval.rec).typ = (yyvsp[(2) - (2)].rec).typ; break; case Tint: (yyval.rec).typ = (yyvsp[(1) - (2)].typ); break; case Tlong: (yyval.rec).typ = (yyvsp[(2) - (2)].rec).typ; break; case Tllong: (yyval.rec).typ = (yyvsp[(2) - (2)].rec).typ; break; default: semwarn("invalid int type specified"); (yyval.rec).typ = (yyvsp[(2) - (2)].rec).typ; } else if ((yyvsp[(1) - (2)].typ)->type == Tuint) switch ((yyvsp[(2) - (2)].rec).typ->type) { case Tchar: (yyval.rec).typ = mkuchar(); break; case Tshort: (yyval.rec).typ = mkushort(); break; case Tint: (yyval.rec).typ = (yyvsp[(1) - (2)].typ); break; case Tlong: (yyval.rec).typ = mkulong(); break; case Tllong: (yyval.rec).typ = mkullong(); break; default: semwarn("invalid unsigned type specified"); (yyval.rec).typ = (yyvsp[(2) - (2)].rec).typ; } else if ((yyvsp[(1) - (2)].typ)->type == Tlong) switch ((yyvsp[(2) - (2)].rec).typ->type) { case Tint: (yyval.rec).typ = (yyvsp[(1) - (2)].typ); break; case Tlong: (yyval.rec).typ = mkllong(); break; case Tuint: (yyval.rec).typ = mkulong(); break; case Tulong: (yyval.rec).typ = mkullong(); break; case Tdouble: (yyval.rec).typ = mkldouble(); break; default: semwarn("invalid use of 'long'"); (yyval.rec).typ = (yyvsp[(2) - (2)].rec).typ; } else if ((yyvsp[(1) - (2)].typ)->type == Tulong) switch ((yyvsp[(2) - (2)].rec).typ->type) { case Tint: (yyval.rec).typ = (yyvsp[(1) - (2)].typ); break; case Tlong: (yyval.rec).typ = mkullong(); break; case Tuint: (yyval.rec).typ = (yyvsp[(1) - (2)].typ); break; case Tulong: (yyval.rec).typ = mkullong(); break; default: semwarn("invalid use of 'long'"); (yyval.rec).typ = (yyvsp[(2) - (2)].rec).typ; } else if ((yyvsp[(2) - (2)].rec).typ->type == Tint) (yyval.rec).typ = (yyvsp[(1) - (2)].typ); else semwarn("invalid type specified (missing ';' or type name used as non-type identifier?)"); (yyval.rec).sto = (yyvsp[(2) - (2)].rec).sto; sp->node = (yyval.rec); ;} break; case 97: #line 1038 "soapcpp2_yacc.y" { (yyval.rec).typ = mkint(); (yyval.rec).sto = (yyvsp[(1) - (1)].sto); sp->node = (yyval.rec); if ((yyvsp[(1) - (1)].sto) & Sextern) transient = 0; ;} break; case 98: #line 1045 "soapcpp2_yacc.y" { (yyval.rec).typ = (yyvsp[(1) - (1)].typ); (yyval.rec).sto = Snone; sp->node = (yyval.rec); ;} break; case 99: #line 1050 "soapcpp2_yacc.y" { (yyval.rec).typ = (yyvsp[(2) - (2)].rec).typ; (yyval.rec).sto = (Storage)((int)(yyvsp[(1) - (2)].sto) | (int)(yyvsp[(2) - (2)].rec).sto); if (((yyval.rec).sto & Sattribute)) { if (is_smart((yyvsp[(2) - (2)].rec).typ)) { if (!is_primitive_or_string((yyvsp[(2) - (2)].rec).typ->ref) && !is_stdstr((yyvsp[(2) - (2)].rec).typ->ref) && !is_binary((yyvsp[(2) - (2)].rec).typ->ref) && !is_external((yyvsp[(2) - (2)].rec).typ->ref)) { semwarn("invalid attribute smart pointer @type"); (yyval.rec).sto = (Storage)((int)(yyval.rec).sto & ~Sattribute); } } else if ((yyvsp[(2) - (2)].rec).typ->type == Tpointer) { if (!is_primitive_or_string((yyvsp[(2) - (2)].rec).typ->ref) && !is_stdstr((yyvsp[(2) - (2)].rec).typ->ref) && !is_binary((yyvsp[(2) - (2)].rec).typ->ref) && !is_external((yyvsp[(2) - (2)].rec).typ->ref)) { semwarn("invalid attribute pointer @type"); (yyval.rec).sto = (Storage)((int)(yyval.rec).sto & ~Sattribute); } } else if ( !is_primitive_or_string((yyvsp[(2) - (2)].rec).typ) && !is_stdstr((yyvsp[(2) - (2)].rec).typ) && !is_binary((yyvsp[(2) - (2)].rec).typ) && !is_external((yyvsp[(2) - (2)].rec).typ)) { semwarn("invalid attribute @type"); (yyval.rec).sto = (Storage)((int)(yyval.rec).sto & ~Sattribute); } } sp->node = (yyval.rec); if ((yyvsp[(1) - (2)].sto) & Sextern) transient = 0; ;} break; case 100: #line 1091 "soapcpp2_yacc.y" { if ((yyvsp[(1) - (2)].typ)->type == Tint) switch ((yyvsp[(2) - (2)].rec).typ->type) { case Tchar: (yyval.rec).typ = (yyvsp[(2) - (2)].rec).typ; break; case Tshort: (yyval.rec).typ = (yyvsp[(2) - (2)].rec).typ; break; case Tint: (yyval.rec).typ = (yyvsp[(1) - (2)].typ); break; case Tlong: (yyval.rec).typ = (yyvsp[(2) - (2)].rec).typ; break; case Tllong: (yyval.rec).typ = (yyvsp[(2) - (2)].rec).typ; break; default: semwarn("invalid int type specified"); (yyval.rec).typ = (yyvsp[(2) - (2)].rec).typ; } else if ((yyvsp[(1) - (2)].typ)->type == Tuint) switch ((yyvsp[(2) - (2)].rec).typ->type) { case Tchar: (yyval.rec).typ = mkuchar(); break; case Tshort: (yyval.rec).typ = mkushort(); break; case Tint: (yyval.rec).typ = (yyvsp[(1) - (2)].typ); break; case Tlong: (yyval.rec).typ = mkulong(); break; case Tllong: (yyval.rec).typ = mkullong(); break; default: semwarn("invalid unsigned type specified"); (yyval.rec).typ = (yyvsp[(2) - (2)].rec).typ; } else if ((yyvsp[(1) - (2)].typ)->type == Tlong) switch ((yyvsp[(2) - (2)].rec).typ->type) { case Tint: (yyval.rec).typ = (yyvsp[(1) - (2)].typ); break; case Tlong: (yyval.rec).typ = mkllong(); break; case Tuint: (yyval.rec).typ = mkulong(); break; case Tulong: (yyval.rec).typ = mkullong(); break; case Tdouble: (yyval.rec).typ = mkldouble(); break; default: semwarn("invalid use of 'long'"); (yyval.rec).typ = (yyvsp[(2) - (2)].rec).typ; } else if ((yyvsp[(1) - (2)].typ)->type == Tulong) switch ((yyvsp[(2) - (2)].rec).typ->type) { case Tint: (yyval.rec).typ = (yyvsp[(1) - (2)].typ); break; case Tlong: (yyval.rec).typ = mkullong(); break; case Tuint: (yyval.rec).typ = (yyvsp[(1) - (2)].typ); break; case Tulong: (yyval.rec).typ = mkullong(); break; default: semwarn("invalid use of 'long'"); (yyval.rec).typ = (yyvsp[(2) - (2)].rec).typ; } else if ((yyvsp[(2) - (2)].rec).typ->type == Tint) (yyval.rec).typ = (yyvsp[(1) - (2)].typ); else semwarn("invalid type specified (missing ';' or type name used as non-type identifier?)"); (yyval.rec).sto = (yyvsp[(2) - (2)].rec).sto; sp->node = (yyval.rec); ;} break; case 101: #line 1143 "soapcpp2_yacc.y" { (yyval.typ) = mkvoid(); ;} break; case 102: #line 1144 "soapcpp2_yacc.y" { (yyval.typ) = mkbool(); ;} break; case 103: #line 1145 "soapcpp2_yacc.y" { (yyval.typ) = mkchar(); ;} break; case 104: #line 1146 "soapcpp2_yacc.y" { (yyval.typ) = mkwchart(); ;} break; case 105: #line 1147 "soapcpp2_yacc.y" { (yyval.typ) = mkshort(); ;} break; case 106: #line 1148 "soapcpp2_yacc.y" { (yyval.typ) = mkint(); ;} break; case 107: #line 1149 "soapcpp2_yacc.y" { (yyval.typ) = mklong(); ;} break; case 108: #line 1150 "soapcpp2_yacc.y" { (yyval.typ) = mkllong(); ;} break; case 109: #line 1151 "soapcpp2_yacc.y" { (yyval.typ) = mkullong(); ;} break; case 110: #line 1152 "soapcpp2_yacc.y" { (yyval.typ) = mksize(); ;} break; case 111: #line 1153 "soapcpp2_yacc.y" { (yyval.typ) = mkfloat(); ;} break; case 112: #line 1154 "soapcpp2_yacc.y" { (yyval.typ) = mkdouble(); ;} break; case 113: #line 1155 "soapcpp2_yacc.y" { (yyval.typ) = mkint(); ;} break; case 114: #line 1156 "soapcpp2_yacc.y" { (yyval.typ) = mkuint(); ;} break; case 115: #line 1157 "soapcpp2_yacc.y" { (yyval.typ) = mkuchar(); ;} break; case 116: #line 1158 "soapcpp2_yacc.y" { (yyval.typ) = mkushort(); ;} break; case 117: #line 1159 "soapcpp2_yacc.y" { (yyval.typ) = mkuint(); ;} break; case 118: #line 1160 "soapcpp2_yacc.y" { (yyval.typ) = mkulong(); ;} break; case 119: #line 1161 "soapcpp2_yacc.y" { (yyval.typ) = mktimet(); ;} break; case 120: #line 1163 "soapcpp2_yacc.y" { if (!(p = entry(templatetable, (yyvsp[(7) - (7)].sym)))) { p = enter(templatetable, (yyvsp[(7) - (7)].sym)); p->info.typ = mktemplate(NULL, (yyvsp[(7) - (7)].sym)); (yyvsp[(7) - (7)].sym)->token = TYPE; } (yyval.typ) = p->info.typ; ;} break; case 121: #line 1173 "soapcpp2_yacc.y" { sym = gensym("_Struct"); sprintf(errbuf, "anonymous class will be named '%s'", sym->name); semwarn(errbuf); if ((p = entry(classtable, sym))) { if (p->info.typ->ref || p->info.typ->type != Tclass) { sprintf(errbuf, "class '%s' already declared at %s:%d", sym->name, p->filename, p->lineno); semerror(errbuf); } } else { p = enter(classtable, sym); p->info.typ = mkclass(NULL, 0); } sym->token = TYPE; sp->table->sym = sym; p->info.typ->ref = sp->table; p->info.typ->width = sp->offset; p->info.typ->id = sym; (yyval.typ) = p->info.typ; exitscope(); ;} break; case 122: #line 1199 "soapcpp2_yacc.y" { if ((p = entry(classtable, (yyvsp[(1) - (5)].e)->sym)) && p->info.typ->ref) { if (is_mutable(p)) { if (merge((Table*)p->info.typ->ref, sp->table)) { sprintf(errbuf, "member name clash in class '%s' declared at line %d", (yyvsp[(1) - (5)].e)->sym->name, p->lineno); semerror(errbuf); } p->info.typ->width += sp->offset; } } else { p = reenter(classtable, (yyvsp[(1) - (5)].e)->sym); sp->table->sym = p->sym; p->info.typ->ref = sp->table; p->info.typ->width = sp->offset; p->info.typ->id = p->sym; if (p->info.typ->base) sp->table->prev = (Table*)entry(classtable, p->info.typ->base)->info.typ->ref; } (yyval.typ) = p->info.typ; exitscope(); ;} break; case 123: #line 1226 "soapcpp2_yacc.y" { p = reenter(classtable, (yyvsp[(1) - (7)].e)->sym); sp->table->sym = p->sym; if (!(yyvsp[(3) - (7)].e)) { semerror("invalid base class"); } else { sp->table->prev = (Table*)(yyvsp[(3) - (7)].e)->info.typ->ref; if (!sp->table->prev && !(yyvsp[(3) - (7)].e)->info.typ->transient) { sprintf(errbuf, "class '%s' has incomplete type (if this class is not serializable then declare 'extern class %s)'", (yyvsp[(3) - (7)].e)->sym->name, (yyvsp[(3) - (7)].e)->sym->name); semerror(errbuf); } p->info.typ->base = (yyvsp[(3) - (7)].e)->info.typ->id; } p->info.typ->ref = sp->table; p->info.typ->width = sp->offset; p->info.typ->id = p->sym; (yyval.typ) = p->info.typ; exitscope(); ;} break; case 124: #line 1249 "soapcpp2_yacc.y" { (yyvsp[(1) - (1)].e)->info.typ->id = (yyvsp[(1) - (1)].e)->sym; (yyval.typ) = (yyvsp[(1) - (1)].e)->info.typ; ;} break; case 125: #line 1254 "soapcpp2_yacc.y" { if (!(yyvsp[(3) - (3)].e)) { semerror("invalid base class"); } else { if (!(yyvsp[(3) - (3)].e)->info.typ->ref && !(yyvsp[(3) - (3)].e)->info.typ->transient) { sprintf(errbuf, "class '%s' has incomplete type (if this class is not serializable then declare 'extern class %s)'", (yyvsp[(3) - (3)].e)->sym->name, (yyvsp[(3) - (3)].e)->sym->name); semerror(errbuf); } (yyvsp[(1) - (3)].e)->info.typ->base = (yyvsp[(3) - (3)].e)->info.typ->id; } (yyvsp[(1) - (3)].e)->info.typ->id = (yyvsp[(1) - (3)].e)->sym; (yyval.typ) = (yyvsp[(1) - (3)].e)->info.typ; ;} break; case 126: #line 1272 "soapcpp2_yacc.y" { sym = gensym("_Struct"); sprintf(errbuf, "anonymous struct will be named '%s'", sym->name); semwarn(errbuf); if ((p = entry(classtable, sym))) { if (p->info.typ->ref || p->info.typ->type != Tstruct) { sprintf(errbuf, "struct '%s' already declared at %s:%d", sym->name, p->filename, p->lineno); semerror(errbuf); } else { p->info.typ->ref = sp->table; p->info.typ->width = sp->offset; } } else { p = enter(classtable, sym); p->info.typ = mkstruct(sp->table, sp->offset); } p->info.typ->id = sym; (yyval.typ) = p->info.typ; exitscope(); ;} break; case 127: #line 1299 "soapcpp2_yacc.y" { if ((p = entry(classtable, (yyvsp[(1) - (5)].e)->sym)) && p->info.typ->ref) { if (is_mutable(p)) { if (merge((Table*)p->info.typ->ref, sp->table)) { sprintf(errbuf, "member name clash in struct '%s' declared at line %d", (yyvsp[(1) - (5)].e)->sym->name, p->lineno); semerror(errbuf); } p->info.typ->width += sp->offset; } } else { p = reenter(classtable, (yyvsp[(1) - (5)].e)->sym); p->info.typ->ref = sp->table; p->info.typ->width = sp->offset; p->info.typ->id = p->sym; } (yyval.typ) = p->info.typ; exitscope(); ;} break; case 128: #line 1322 "soapcpp2_yacc.y" { if ((p = entry(classtable, (yyvsp[(2) - (2)].sym)))) { if (p->info.typ->type == Tstruct) { (yyval.typ) = p->info.typ; } else { sprintf(errbuf, "'struct %s' redeclaration (line %d)", (yyvsp[(2) - (2)].sym)->name, p->lineno); semerror(errbuf); (yyval.typ) = mkint(); } } else { p = enter(classtable, (yyvsp[(2) - (2)].sym)); (yyval.typ) = p->info.typ = mkstruct(NULL, 0); p->info.typ->id = (yyvsp[(2) - (2)].sym); } ;} break; case 129: #line 1344 "soapcpp2_yacc.y" { sym = gensym("_Union"); sprintf(errbuf, "anonymous union will be named '%s'", sym->name); semwarn(errbuf); if ((p = entry(classtable, sym))) { if (p->info.typ->ref) { sprintf(errbuf, "union or struct '%s' already declared at %s:%d", sym->name, p->filename, p->lineno); semerror(errbuf); } else { p->info.typ->ref = sp->table; p->info.typ->width = sp->offset; } } else { p = enter(classtable, sym); p->info.typ = mkunion(sp->table, sp->offset); } p->info.typ->id = sym; (yyval.typ) = p->info.typ; exitscope(); ;} break; case 130: #line 1371 "soapcpp2_yacc.y" { if ((p = entry(classtable, (yyvsp[(2) - (6)].sym)))) { if (p->info.typ->ref || p->info.typ->type != Tunion) { sprintf(errbuf, "union '%s' already declared at %s:%d", (yyvsp[(2) - (6)].sym)->name, p->filename, p->lineno); semerror(errbuf); } else { p = reenter(classtable, (yyvsp[(2) - (6)].sym)); p->info.typ->ref = sp->table; p->info.typ->width = sp->offset; } } else { p = enter(classtable, (yyvsp[(2) - (6)].sym)); p->info.typ = mkunion(sp->table, sp->offset); } p->info.typ->id = (yyvsp[(2) - (6)].sym); (yyval.typ) = p->info.typ; exitscope(); ;} break; case 131: #line 1395 "soapcpp2_yacc.y" { if ((p = entry(classtable, (yyvsp[(2) - (2)].sym)))) { if (p->info.typ->type == Tunion) { (yyval.typ) = p->info.typ; } else { sprintf(errbuf, "'union %s' redeclaration (line %d)", (yyvsp[(2) - (2)].sym)->name, p->lineno); semerror(errbuf); (yyval.typ) = mkint(); } } else { p = enter(classtable, (yyvsp[(2) - (2)].sym)); (yyval.typ) = p->info.typ = mkunion(NULL, 0); p->info.typ->id = (yyvsp[(2) - (2)].sym); } ;} break; case 132: #line 1417 "soapcpp2_yacc.y" { sym = gensym("_Enum"); sprintf(errbuf, "anonymous enum will be named '%s'", sym->name); semwarn(errbuf); if ((p = entry(enumtable, sym))) { if (p->info.typ->ref) { sprintf(errbuf, "enum '%s' already declared at %s:%d", sym->name, p->filename, p->lineno); semerror(errbuf); } else { p->info.typ->ref = sp->table; p->info.typ->width = 4; /* 4 = enum */ } } else { p = enter(enumtable, sym); p->info.typ = mkenum(sp->table); } p->info.typ->id = sym; (yyval.typ) = p->info.typ; exitscope(); ;} break; case 133: #line 1444 "soapcpp2_yacc.y" { sym = gensym("_Enum"); sprintf(errbuf, "anonymous enum will be named '%s'", sym->name); semwarn(errbuf); if ((p = entry(enumtable, sym))) { if (p->info.typ->ref) { sprintf(errbuf, "enum '%s' already declared at %s:%d", sym->name, p->filename, p->lineno); semerror(errbuf); } else { p->info.typ->ref = sp->table; p->info.typ->width = 9; /* 9 = mask */ } } else { p = enter(enumtable, sym); p->info.typ = mkmask(sp->table); } p->info.typ->id = sym; (yyval.typ) = p->info.typ; exitscope(); ;} break; case 134: #line 1471 "soapcpp2_yacc.y" { if ((p = entry(enumtable, (yyvsp[(1) - (6)].e)->sym))) if (!p->info.typ->ref) p->info.typ->ref = sp->table; p->info.typ->id = (yyvsp[(1) - (6)].e)->sym; (yyval.typ) = p->info.typ; exitscope(); ;} break; case 135: #line 1480 "soapcpp2_yacc.y" { if ((p = entry(enumtable, (yyvsp[(1) - (6)].e)->sym))) if (!p->info.typ->ref) p->info.typ->ref = sp->table; p->info.typ->id = (yyvsp[(1) - (6)].e)->sym; (yyval.typ) = p->info.typ; exitscope(); ;} break; case 136: #line 1489 "soapcpp2_yacc.y" { if ((p = entry(enumtable, (yyvsp[(1) - (6)].e)->sym))) { if (!p->info.typ->ref) { p->info.typ->ref = sp->table; p->info.typ->width = 9; /* 9 = mask */ } } p->info.typ->id = (yyvsp[(1) - (6)].e)->sym; (yyval.typ) = p->info.typ; exitscope(); ;} break; case 137: #line 1503 "soapcpp2_yacc.y" { if ((p = entry(enumtable, (yyvsp[(1) - (6)].e)->sym))) { if (!p->info.typ->ref) { p->info.typ->ref = sp->table; p->info.typ->width = 9; /* 9 = mask */ } } p->info.typ->id = (yyvsp[(1) - (6)].e)->sym; (yyval.typ) = p->info.typ; exitscope(); ;} break; case 138: #line 1516 "soapcpp2_yacc.y" { if ((p = entry(enumtable, (yyvsp[(2) - (2)].sym)))) { if (p->info.typ->type != Tenum) { sprintf(errbuf, "'enum %s' used where enum class is expected", (yyvsp[(2) - (2)].sym)->name); semwarn(errbuf); } (yyval.typ) = p->info.typ; } else { p = enter(enumtable, (yyvsp[(2) - (2)].sym)); (yyval.typ) = p->info.typ = mkenum(NULL); p->info.typ->id = (yyvsp[(2) - (2)].sym); } ;} break; case 139: #line 1533 "soapcpp2_yacc.y" { if ((p = entry(enumtable, (yyvsp[(2) - (2)].sym)))) { if (p->info.typ->type != Tenumsc) { sprintf(errbuf, "'enum class %s' used where enum is expected", (yyvsp[(2) - (2)].sym)->name); semwarn(errbuf); } (yyval.typ) = p->info.typ; } else { p = enter(enumtable, (yyvsp[(2) - (2)].sym)); (yyval.typ) = p->info.typ = mkenumsc(NULL); p->info.typ->id = (yyvsp[(2) - (2)].sym); (yyvsp[(2) - (2)].sym)->token = TYPE; } ;} break; case 140: #line 1551 "soapcpp2_yacc.y" { if ((p = entry(typetable, (yyvsp[(1) - (1)].sym)))) { (yyval.typ) = p->info.typ; } else if ((p = entry(classtable, (yyvsp[(1) - (1)].sym)))) { (yyval.typ) = p->info.typ; } else if ((p = entry(enumtable, (yyvsp[(1) - (1)].sym)))) { (yyval.typ) = p->info.typ; } else if ((yyvsp[(1) - (1)].sym) == lookup("std::string") || (yyvsp[(1) - (1)].sym) == lookup("std::wstring")) { p = enter(classtable, (yyvsp[(1) - (1)].sym)); (yyval.typ) = p->info.typ = mkclass(NULL, 8); p->info.typ->id = (yyvsp[(1) - (1)].sym); if (cflag) p->info.typ->transient = 1; /* make std::string transient in C */ else p->info.typ->transient = -2; /* otherwise volatile in C++ */ } else { sprintf(errbuf, "unknown type '%s'", (yyvsp[(1) - (1)].sym)->name); semerror(errbuf); (yyval.typ) = mkint(); } ;} break; case 141: #line 1582 "soapcpp2_yacc.y" { if ((p = entry(templatetable, (yyvsp[(1) - (4)].sym)))) { (yyval.typ) = mktemplate((yyvsp[(3) - (4)].rec).typ, (yyvsp[(1) - (4)].sym)); if (p->info.typ->transient) (yyval.typ)->transient = p->info.typ->transient; } else if ((yyvsp[(1) - (4)].sym) == lookup("std::deque")) { semwarn("To use std::deque, please also add #import \"import/stldeque.h\""); (yyval.typ) = mktemplate((yyvsp[(3) - (4)].rec).typ, (yyvsp[(1) - (4)].sym)); } else if ((yyvsp[(1) - (4)].sym) == lookup("std::list")) { semwarn("To use std::list, please also add #import \"import/stllist.h\""); (yyval.typ) = mktemplate((yyvsp[(3) - (4)].rec).typ, (yyvsp[(1) - (4)].sym)); } else if ((yyvsp[(1) - (4)].sym) == lookup("std::vector")) { semwarn("To use std::vector, please also add #import \"import/stlvector.h\""); (yyval.typ) = mktemplate((yyvsp[(3) - (4)].rec).typ, (yyvsp[(1) - (4)].sym)); } else if ((yyvsp[(1) - (4)].sym) == lookup("std::set")) { semwarn("To use std::set, please also add #import \"import/stlset.h\""); (yyval.typ) = mktemplate((yyvsp[(3) - (4)].rec).typ, (yyvsp[(1) - (4)].sym)); } else if ((yyvsp[(1) - (4)].sym) == lookup("std::queue")) { (yyval.typ) = mktemplate((yyvsp[(3) - (4)].rec).typ, (yyvsp[(1) - (4)].sym)); (yyval.typ)->transient = 1; /* not serializable */ } else if ((yyvsp[(1) - (4)].sym) == lookup("std::stack")) { (yyval.typ) = mktemplate((yyvsp[(3) - (4)].rec).typ, (yyvsp[(1) - (4)].sym)); (yyval.typ)->transient = 1; /* not serializable */ } else if ((yyvsp[(1) - (4)].sym) == lookup("std::shared_ptr") || (yyvsp[(1) - (4)].sym) == lookup("std::unique_ptr") || (yyvsp[(1) - (4)].sym) == lookup("std::auto_ptr")) { (yyval.typ) = mktemplate((yyvsp[(3) - (4)].rec).typ, (yyvsp[(1) - (4)].sym)); (yyval.typ)->transient = -2; /* volatile indicates smart pointer template */ } else if ((yyvsp[(1) - (4)].sym) == lookup("std::weak_ptr") || (yyvsp[(1) - (4)].sym) == lookup("std::function")) { (yyval.typ) = mktemplate((yyvsp[(3) - (4)].rec).typ, (yyvsp[(1) - (4)].sym)); (yyval.typ)->transient = 1; /* not serializable */ } else { semerror("undefined template"); (yyval.typ) = mkint(); } ;} break; case 142: #line 1639 "soapcpp2_yacc.y" { sprintf(errbuf, "undeclared '%s'", (yyvsp[(2) - (3)].sym)->name); synerror(errbuf); (yyval.typ) = mkint(); ;} break; case 143: #line 1644 "soapcpp2_yacc.y" { sprintf(errbuf, "perhaps trying to use a template with an undefined type parameter '%s'?", (yyvsp[(2) - (3)].sym)->name); synerror(errbuf); (yyval.typ) = mkint(); ;} break; case 144: #line 1649 "soapcpp2_yacc.y" { synerror("perhaps trying to use an undefined template or template with a non-type template parameter? Declare 'template class name'"); (yyval.typ) = mkint(); ;} break; case 145: #line 1654 "soapcpp2_yacc.y" { synerror("malformed class definition (use spacing around ':' to separate derived : base)"); yyerrok; (yyval.typ) = mkint(); ;} break; case 146: #line 1660 "soapcpp2_yacc.y" { synerror("malformed struct definition"); yyerrok; (yyval.typ) = mkint(); ;} break; case 147: #line 1666 "soapcpp2_yacc.y" { synerror("malformed union definition"); yyerrok; (yyval.typ) = mkint(); ;} break; case 148: #line 1672 "soapcpp2_yacc.y" { synerror("malformed enum definition"); yyerrok; (yyval.typ) = mkint(); ;} break; case 149: #line 1678 "soapcpp2_yacc.y" { if ((p = entry(classtable, (yyvsp[(2) - (2)].sym)))) { if (p->info.typ->ref) { if (!is_mutable(p)) { sprintf(errbuf, "struct '%s' already declared at %s:%d", (yyvsp[(2) - (2)].sym)->name, p->filename, p->lineno); semerror(errbuf); } } else { p = reenter(classtable, (yyvsp[(2) - (2)].sym)); } p->info.typ->transient = transient; } else { p = enter(classtable, (yyvsp[(2) - (2)].sym)); p->info.typ = mkstruct(NULL, 0); } (yyval.e) = p; ;} break; case 150: #line 1703 "soapcpp2_yacc.y" { if ((p = entry(classtable, (yyvsp[(2) - (2)].sym)))) { if (p->info.typ->ref) { if (!is_mutable(p)) { sprintf(errbuf, "class '%s' already declared at %s:%d (redundant 'class' specifier here?)", (yyvsp[(2) - (2)].sym)->name, p->filename, p->lineno); semerror(errbuf); } } else { p = reenter(classtable, (yyvsp[(2) - (2)].sym)); } p->info.typ->transient = transient; } else { p = enter(classtable, (yyvsp[(2) - (2)].sym)); p->info.typ = mkclass(NULL, 0); p->info.typ->id = p->sym; } (yyvsp[(2) - (2)].sym)->token = TYPE; (yyval.e) = p; ;} break; case 151: #line 1730 "soapcpp2_yacc.y" { if ((p = entry(enumtable, (yyvsp[(2) - (3)].sym)))) { if (p->info.typ->ref) { sprintf(errbuf, "enum '%s' already declared at %s:%d", (yyvsp[(2) - (3)].sym)->name, p->filename, p->lineno); semerror(errbuf); } } else { p = enter(enumtable, (yyvsp[(2) - (3)].sym)); p->info.typ = mkenum(0); } p->info.typ->width = (int)(yyvsp[(3) - (3)].i); (yyval.e) = p; ;} break; case 152: #line 1748 "soapcpp2_yacc.y" { if ((p = entry(enumtable, (yyvsp[(2) - (3)].sym)))) { if (p->info.typ->ref) { sprintf(errbuf, "enum '%s' already declared at %s:%d", (yyvsp[(2) - (3)].sym)->name, p->filename, p->lineno); semerror(errbuf); } } else { p = enter(enumtable, (yyvsp[(2) - (3)].sym)); p->info.typ = mkenumsc(0); } p->info.typ->width = (int)(yyvsp[(3) - (3)].i); (yyvsp[(2) - (3)].sym)->token = TYPE; (yyval.e) = p; ;} break; case 153: #line 1768 "soapcpp2_yacc.y" { if ((p = entry(enumtable, (yyvsp[(3) - (4)].sym)))) { if (p->info.typ->ref) { sprintf(errbuf, "enum '%s' already declared at %s:%d", (yyvsp[(3) - (4)].sym)->name, p->filename, p->lineno); semerror(errbuf); } else { p->info.typ = mkmask(0); } } else { p = enter(enumtable, (yyvsp[(3) - (4)].sym)); p->info.typ = mkmask(0); } (yyval.e) = p; ;} break; case 154: #line 1790 "soapcpp2_yacc.y" { if ((p = entry(enumtable, (yyvsp[(3) - (4)].sym)))) { if (p->info.typ->ref) { sprintf(errbuf, "enum '%s' already declared at %s:%d", (yyvsp[(3) - (4)].sym)->name, p->filename, p->lineno); semerror(errbuf); } else { p->info.typ = mkmasksc(0); } } else { p = enter(enumtable, (yyvsp[(3) - (4)].sym)); p->info.typ = mkmasksc(0); } (yyvsp[(3) - (4)].sym)->token = TYPE; (yyval.e) = p; ;} break; case 155: #line 1812 "soapcpp2_yacc.y" { (yyval.sym) = (yyvsp[(2) - (2)].sym); if (!c11flag) semwarn("To use scoped enumerations (enum class) you must also use soapcpp2 option -c++11"); ;} break; case 156: #line 1817 "soapcpp2_yacc.y" { (yyval.sym) = (yyvsp[(2) - (2)].sym); if (!c11flag) semwarn("To use scoped enumerations (enum class) you must also use soapcpp2 option -c++11"); ;} break; case 157: #line 1823 "soapcpp2_yacc.y" { (yyval.i) = 1; ;} break; case 158: #line 1824 "soapcpp2_yacc.y" { (yyval.i) = 4; ;} break; case 159: #line 1825 "soapcpp2_yacc.y" { (yyval.i) = 2; ;} break; case 160: #line 1826 "soapcpp2_yacc.y" { (yyval.i) = 4; ;} break; case 161: #line 1827 "soapcpp2_yacc.y" { (yyval.i) = 4; ;} break; case 162: #line 1828 "soapcpp2_yacc.y" { (yyval.i) = 8; ;} break; case 163: #line 1829 "soapcpp2_yacc.y" { (yyval.i) = 4; p = entry(typetable, (yyvsp[(2) - (2)].sym)); if (!p) p = entry(enumtable, (yyvsp[(2) - (2)].sym)); if (!p) semerror("enum underlying type must be one of int8_t, int16_t, int32_t, int64_t"); else (yyval.i) = p->info.typ->width; ;} break; case 164: #line 1839 "soapcpp2_yacc.y" { semerror("enum underlying type must be one of int8_t, int16_t, int32_t, int64_t"); (yyval.i) = 4; ;} break; case 165: #line 1843 "soapcpp2_yacc.y" { (yyval.i) = 4; /* 4 = enum */ ;} break; case 166: #line 1845 "soapcpp2_yacc.y" { ;} break; case 167: #line 1846 "soapcpp2_yacc.y" { ;} break; case 168: #line 1848 "soapcpp2_yacc.y" { (yyval.e) = (yyvsp[(2) - (2)].e); ;} break; case 169: #line 1849 "soapcpp2_yacc.y" { (yyval.e) = (yyvsp[(2) - (2)].e); ;} break; case 170: #line 1850 "soapcpp2_yacc.y" { (yyval.e) = (yyvsp[(2) - (2)].e); ;} break; case 171: #line 1851 "soapcpp2_yacc.y" { (yyval.e) = entry(classtable, (yyvsp[(1) - (1)].sym)); if (!(yyval.e)) { p = entry(typetable, (yyvsp[(1) - (1)].sym)); if (p && (p->info.typ->type == Tclass || p->info.typ->type == Tstruct)) (yyval.e) = p; } ;} break; case 172: #line 1860 "soapcpp2_yacc.y" { (yyval.e) = entry(classtable, (yyvsp[(2) - (2)].sym)); ;} break; case 173: #line 1862 "soapcpp2_yacc.y" { if (transient <= -2) transient = 0; permission = 0; enterscope(mktable(NULL), 0); sp->entry = NULL; ;} break; case 174: #line 1870 "soapcpp2_yacc.y" { if (transient <= -2) transient = 0; permission = 0; enterscope(mktable(NULL), 0); sp->entry = NULL; sp->grow = False; ;} break; case 175: #line 1879 "soapcpp2_yacc.y" { enterscope(mktable(NULL), 0); sp->entry = NULL; sp->mask = True; sp->val = 1; ;} break; case 176: #line 1886 "soapcpp2_yacc.y" { ;} break; case 177: #line 1887 "soapcpp2_yacc.y" { ;} break; case 178: #line 1889 "soapcpp2_yacc.y" { if (sp->table->level == INTERNAL) transient |= 1; permission = 0; enterscope(mktable(NULL), 0); sp->entry = NULL; sp->table->level = PARAM; ;} break; case 179: #line 1898 "soapcpp2_yacc.y" { (yyval.sto) = Sauto; ;} break; case 180: #line 1899 "soapcpp2_yacc.y" { (yyval.sto) = Sregister; ;} break; case 181: #line 1900 "soapcpp2_yacc.y" { (yyval.sto) = Sstatic; ;} break; case 182: #line 1901 "soapcpp2_yacc.y" { (yyval.sto) = Sexplicit; ;} break; case 183: #line 1902 "soapcpp2_yacc.y" { (yyval.sto) = Sextern; transient = 1; ;} break; case 184: #line 1903 "soapcpp2_yacc.y" { (yyval.sto) = Stypedef; ;} break; case 185: #line 1904 "soapcpp2_yacc.y" { (yyval.sto) = Svirtual; ;} break; case 186: #line 1905 "soapcpp2_yacc.y" { (yyval.sto) = Sconst; ;} break; case 187: #line 1906 "soapcpp2_yacc.y" { (yyval.sto) = Sfinal; ;} break; case 188: #line 1907 "soapcpp2_yacc.y" { (yyval.sto) = Soverride; ;} break; case 189: #line 1908 "soapcpp2_yacc.y" { (yyval.sto) = Sfriend; ;} break; case 190: #line 1909 "soapcpp2_yacc.y" { (yyval.sto) = Sinline; ;} break; case 191: #line 1910 "soapcpp2_yacc.y" { (yyval.sto) = SmustUnderstand; ;} break; case 192: #line 1911 "soapcpp2_yacc.y" { (yyval.sto) = Sreturn; ;} break; case 193: #line 1912 "soapcpp2_yacc.y" { (yyval.sto) = Sattribute; if (eflag) semwarn("SOAP RPC encoding does not support XML attributes"); ;} break; case 194: #line 1917 "soapcpp2_yacc.y" { (yyval.sto) = Sspecial; ;} break; case 195: #line 1918 "soapcpp2_yacc.y" { (yyval.sto) = Sextern; transient = -2; ;} break; case 196: #line 1919 "soapcpp2_yacc.y" { (yyval.sto) = Smutable; transient = -4; ;} break; case 197: #line 1921 "soapcpp2_yacc.y" { (yyval.sto) = Snone; ;} break; case 198: #line 1922 "soapcpp2_yacc.y" { (yyval.sto) |= Sconstobj; ;} break; case 199: #line 1923 "soapcpp2_yacc.y" { (yyval.sto) |= Sfinal; ;} break; case 200: #line 1924 "soapcpp2_yacc.y" { (yyval.sto) |= Soverride; ;} break; case 201: #line 1926 "soapcpp2_yacc.y" { (yyval.sto) = Snone; ;} break; case 202: #line 1927 "soapcpp2_yacc.y" { (yyval.sto) = Sabstract; ;} break; case 203: #line 1929 "soapcpp2_yacc.y" { (yyval.sto) = Snone; ;} break; case 204: #line 1930 "soapcpp2_yacc.y" { (yyval.sto) = Svirtual; ;} break; case 205: #line 1932 "soapcpp2_yacc.y" { (yyval.rec) = tmp = sp->node; ;} break; case 206: #line 1933 "soapcpp2_yacc.y" { /* handle const pointers, such as const char* */ if ((tmp.sto & Sconst)) tmp.sto = (Storage)(((int)tmp.sto & ~Sconst) | Sconstptr); tmp.typ = mkpointer(tmp.typ); tmp.typ->transient = transient; (yyval.rec) = tmp; ;} break; case 207: #line 1941 "soapcpp2_yacc.y" { tmp.typ = mkreference(tmp.typ); tmp.typ->transient = transient; (yyval.rec) = tmp; ;} break; case 208: #line 1946 "soapcpp2_yacc.y" { tmp.typ = mkrvalueref(tmp.typ); tmp.typ->transient = transient; (yyval.rec) = tmp; ;} break; case 209: #line 1952 "soapcpp2_yacc.y" { (yyval.rec) = tmp; ;} break; case 210: #line 1954 "soapcpp2_yacc.y" { if (!bflag && (yyvsp[(4) - (4)].rec).typ->type == Tchar) { sprintf(errbuf, "char[" SOAP_LONG_FORMAT "] will be serialized as an array of " SOAP_LONG_FORMAT " bytes: use soapcpp2 option -b to enable char[] string serialization or use char* for strings", (yyvsp[(2) - (4)].rec).val.i, (yyvsp[(2) - (4)].rec).val.i); semwarn(errbuf); } if ((yyvsp[(2) - (4)].rec).hasval && (yyvsp[(2) - (4)].rec).typ->type == Tint && (yyvsp[(2) - (4)].rec).val.i > 0 && (yyvsp[(4) - (4)].rec).typ->width > 0) { (yyval.rec).typ = mkarray((yyvsp[(4) - (4)].rec).typ, (int) (yyvsp[(2) - (4)].rec).val.i * (yyvsp[(4) - (4)].rec).typ->width); } else { (yyval.rec).typ = mkarray((yyvsp[(4) - (4)].rec).typ, 0); semerror("undetermined array size"); } (yyval.rec).sto = (yyvsp[(4) - (4)].rec).sto; ;} break; case 211: #line 1971 "soapcpp2_yacc.y" { (yyval.rec).typ = mkpointer((yyvsp[(3) - (3)].rec).typ); /* zero size array = pointer */ (yyval.rec).sto = (yyvsp[(3) - (3)].rec).sto; ;} break; case 212: #line 1976 "soapcpp2_yacc.y" { if ((yyvsp[(1) - (1)].rec).typ->type == Tstruct || (yyvsp[(1) - (1)].rec).typ->type == Tclass) { if (!(yyvsp[(1) - (1)].rec).typ->ref && !(yyvsp[(1) - (1)].rec).typ->transient && !((yyvsp[(1) - (1)].rec).sto & Stypedef)) { if ((yyvsp[(1) - (1)].rec).typ->type == Tstruct) sprintf(errbuf, "struct '%s' has incomplete type (if this struct is not serializable then declare 'extern struct %s)", (yyvsp[(1) - (1)].rec).typ->id->name, (yyvsp[(1) - (1)].rec).typ->id->name); else sprintf(errbuf, "class '%s' has incomplete type (if this class is not serializable then declare 'extern class %s)", (yyvsp[(1) - (1)].rec).typ->id->name, (yyvsp[(1) - (1)].rec).typ->id->name); semerror(errbuf); } } (yyval.rec) = (yyvsp[(1) - (1)].rec); ;} break; case 213: #line 1991 "soapcpp2_yacc.y" { (yyval.rec) = (yyvsp[(1) - (1)].rec); ;} break; case 214: #line 1992 "soapcpp2_yacc.y" { if ((yyvsp[(2) - (3)].rec).hasval) { (yyval.rec).typ = (yyvsp[(2) - (3)].rec).typ; (yyval.rec).hasval = True; (yyval.rec).val = (yyvsp[(2) - (3)].rec).val; } else { (yyval.rec).hasval = False; semerror("initialization expression not constant"); } ;} break; case 215: #line 2006 "soapcpp2_yacc.y" { (yyval.rec).hasval = False; ;} break; case 216: #line 2007 "soapcpp2_yacc.y" { if ((yyvsp[(2) - (2)].rec).hasval) { (yyval.rec).typ = (yyvsp[(2) - (2)].rec).typ; (yyval.rec).hasval = True; (yyval.rec).val = (yyvsp[(2) - (2)].rec).val; } else { (yyval.rec).hasval = False; semerror("initialization expression not constant"); } ;} break; case 217: #line 2021 "soapcpp2_yacc.y" { (yyval.s) = NULL; ;} break; case 218: #line 2022 "soapcpp2_yacc.y" { (yyval.s) = (yyvsp[(1) - (1)].s); ;} break; case 219: #line 2024 "soapcpp2_yacc.y" { (yyval.rec).minOccurs = -1; (yyval.rec).maxOccurs = 1; (yyval.rec).hasmin = False; (yyval.rec).hasmax = False; (yyval.rec).min = 0.0; (yyval.rec).max = 0.0; (yyval.rec).incmin = True; (yyval.rec).incmax = True; (yyval.rec).pattern = NULL; ;} break; case 220: #line 2035 "soapcpp2_yacc.y" { (yyval.rec).minOccurs = (yyvsp[(1) - (1)].i); (yyval.rec).maxOccurs = 1; if ((yyval.rec).minOccurs < 0) (yyval.rec).minOccurs = -1; (yyval.rec).hasmin = False; (yyval.rec).hasmax = False; (yyval.rec).min = 0.0; (yyval.rec).max = 0.0; (yyval.rec).incmin = True; (yyval.rec).incmax = True; (yyval.rec).pattern = NULL; ;} break; case 221: #line 2048 "soapcpp2_yacc.y" { (yyval.rec).minOccurs = (yyvsp[(1) - (2)].i); (yyval.rec).maxOccurs = 1; if ((yyval.rec).minOccurs < 0) (yyval.rec).minOccurs = -1; (yyval.rec).hasmin = False; (yyval.rec).hasmax = False; (yyval.rec).min = 0.0; (yyval.rec).max = 0.0; (yyval.rec).incmin = True; (yyval.rec).incmax = True; (yyval.rec).pattern = NULL; ;} break; case 222: #line 2061 "soapcpp2_yacc.y" { (yyval.rec).minOccurs = (yyvsp[(1) - (3)].i); (yyval.rec).maxOccurs = (yyvsp[(3) - (3)].i); if ((yyval.rec).minOccurs < 0 || (yyval.rec).maxOccurs < 0) { (yyval.rec).minOccurs = -1; (yyval.rec).maxOccurs = 1; } else if ((yyval.rec).minOccurs > (yyval.rec).maxOccurs) { (yyval.rec).minOccurs = -1; (yyval.rec).maxOccurs = 1; } (yyval.rec).hasmin = False; (yyval.rec).hasmax = False; (yyval.rec).min = 0.0; (yyval.rec).max = 0.0; (yyval.rec).incmin = True; (yyval.rec).incmax = True; (yyval.rec).pattern = NULL; ;} break; case 223: #line 2082 "soapcpp2_yacc.y" { (yyval.rec).minOccurs = -1; (yyval.rec).maxOccurs = (yyvsp[(2) - (2)].i); if ((yyval.rec).maxOccurs < 0) { (yyval.rec).minOccurs = -1; (yyval.rec).maxOccurs = 1; } (yyval.rec).hasmin = False; (yyval.rec).hasmax = False; (yyval.rec).min = 0.0; (yyval.rec).max = 0.0; (yyval.rec).incmin = True; (yyval.rec).incmax = True; (yyval.rec).pattern = NULL; ;} break; case 224: #line 2099 "soapcpp2_yacc.y" { (yyval.rec).hasmin = False; (yyval.rec).hasmax = False; (yyval.rec).minOccurs = -1; (yyval.rec).maxOccurs = 1; (yyval.rec).min = 0.0; (yyval.rec).max = 0.0; (yyval.rec).incmin = True; (yyval.rec).incmax = True; (yyval.rec).pattern = (yyvsp[(1) - (1)].s); ;} break; case 225: #line 2111 "soapcpp2_yacc.y" { (yyval.rec).hasmin = True; (yyval.rec).hasmax = False; (yyval.rec).incmin = (yyvsp[(3) - (3)].rec).incmin; (yyval.rec).incmax = (yyvsp[(3) - (3)].rec).incmax; (yyval.rec).minOccurs = (LONG64)(yyvsp[(2) - (3)].r); (yyval.rec).maxOccurs = 1; if ((yyval.rec).minOccurs < 0) (yyval.rec).minOccurs = -1; (yyval.rec).min = (yyvsp[(2) - (3)].r); (yyval.rec).max = 0.0; (yyval.rec).pattern = (yyvsp[(1) - (3)].s); ;} break; case 226: #line 2125 "soapcpp2_yacc.y" { (yyval.rec).hasmin = True; (yyval.rec).hasmax = True; (yyval.rec).incmin = (yyvsp[(3) - (4)].rec).incmin; (yyval.rec).incmax = (yyvsp[(3) - (4)].rec).incmax; (yyval.rec).minOccurs = (LONG64)(yyvsp[(2) - (4)].r); (yyval.rec).maxOccurs = (LONG64)(yyvsp[(4) - (4)].r); if ((yyval.rec).minOccurs < 0 || (yyval.rec).maxOccurs < 0) { (yyval.rec).minOccurs = -1; (yyval.rec).maxOccurs = 1; } else if ((yyval.rec).minOccurs > (yyval.rec).maxOccurs) { (yyval.rec).minOccurs = -1; (yyval.rec).maxOccurs = 1; } (yyval.rec).min = (yyvsp[(2) - (4)].r); (yyval.rec).max = (yyvsp[(4) - (4)].r); (yyval.rec).pattern = (yyvsp[(1) - (4)].s); ;} break; case 227: #line 2146 "soapcpp2_yacc.y" { (yyval.rec).hasmin = False; (yyval.rec).hasmax = True; (yyval.rec).incmin = (yyvsp[(2) - (3)].rec).incmin; (yyval.rec).incmax = (yyvsp[(2) - (3)].rec).incmax; (yyval.rec).minOccurs = -1; (yyval.rec).maxOccurs = (LONG64)(yyvsp[(3) - (3)].r); if ((yyval.rec).maxOccurs < 0) { (yyval.rec).minOccurs = -1; (yyval.rec).maxOccurs = 1; } (yyval.rec).min = 0.0; (yyval.rec).max = (yyvsp[(3) - (3)].r); (yyval.rec).pattern = (yyvsp[(1) - (3)].s); ;} break; case 228: #line 2163 "soapcpp2_yacc.y" { (yyval.s) = NULL; ;} break; case 229: #line 2164 "soapcpp2_yacc.y" { (yyval.s) = (yyvsp[(1) - (1)].s); ;} break; case 230: #line 2166 "soapcpp2_yacc.y" { (yyval.r) = (yyvsp[(1) - (1)].r); ;} break; case 231: #line 2167 "soapcpp2_yacc.y" { (yyval.r) = (double)(yyvsp[(1) - (1)].i); ;} break; case 232: #line 2168 "soapcpp2_yacc.y" { (yyval.r) = (double)(yyvsp[(1) - (1)].c); ;} break; case 233: #line 2169 "soapcpp2_yacc.y" { (yyval.r) = +(yyvsp[(2) - (2)].r); ;} break; case 234: #line 2170 "soapcpp2_yacc.y" { (yyval.r) = -(yyvsp[(2) - (2)].r); ;} break; case 235: #line 2172 "soapcpp2_yacc.y" { (yyval.rec).incmin = (yyval.rec).incmax = True; ;} break; case 236: #line 2173 "soapcpp2_yacc.y" { (yyval.rec).incmin = (yyval.rec).incmax = True; ;} break; case 237: #line 2174 "soapcpp2_yacc.y" { (yyval.rec).incmin = False; (yyval.rec).incmax = True; ;} break; case 238: #line 2175 "soapcpp2_yacc.y" { (yyval.rec).incmin = False; (yyval.rec).incmax = True; ;} break; case 239: #line 2177 "soapcpp2_yacc.y" { (yyval.rec).incmin = (yyval.rec).incmax = True; ;} break; case 240: #line 2178 "soapcpp2_yacc.y" { (yyval.rec).incmin = False; (yyval.rec).incmax = True; ;} break; case 241: #line 2179 "soapcpp2_yacc.y" { (yyval.rec).incmin = True; (yyval.rec).incmax = False; ;} break; case 242: #line 2180 "soapcpp2_yacc.y" { (yyval.rec).incmin = False; (yyval.rec).incmax = False; ;} break; case 243: #line 2181 "soapcpp2_yacc.y" { (yyval.rec).incmin = False; (yyval.rec).incmax = False; ;} break; case 244: #line 2183 "soapcpp2_yacc.y" { (yyval.rec).incmin = (yyval.rec).incmax = True; ;} break; case 245: #line 2184 "soapcpp2_yacc.y" { (yyval.rec).incmin = True; (yyval.rec).incmax = False; ;} break; case 246: #line 2185 "soapcpp2_yacc.y" { (yyval.rec).incmin = True; (yyval.rec).incmax = False; ;} break; case 247: #line 2194 "soapcpp2_yacc.y" { (yyval.rec) = (yyvsp[(3) - (3)].rec); ;} break; case 248: #line 2195 "soapcpp2_yacc.y" { (yyval.rec) = (yyvsp[(1) - (1)].rec); ;} break; case 249: #line 2199 "soapcpp2_yacc.y" { (yyval.rec).typ = (yyvsp[(3) - (5)].rec).typ; (yyval.rec).sto = Snone; (yyval.rec).hasval = False; ;} break; case 251: #line 2207 "soapcpp2_yacc.y" { (yyval.rec) = (yyvsp[(1) - (1)].rec); ;} break; case 252: #line 2210 "soapcpp2_yacc.y" { (yyval.rec).hasval = False; (yyval.rec).typ = mkint(); ;} break; case 253: #line 2214 "soapcpp2_yacc.y" { (yyval.rec) = (yyvsp[(1) - (1)].rec); ;} break; case 254: #line 2216 "soapcpp2_yacc.y" { (yyval.rec) = (yyvsp[(1) - (1)].rec); ;} break; case 255: #line 2219 "soapcpp2_yacc.y" { (yyval.rec).hasval = False; (yyval.rec).typ = mkint(); ;} break; case 256: #line 2222 "soapcpp2_yacc.y" { (yyval.rec) = (yyvsp[(1) - (1)].rec); ;} break; case 257: #line 2224 "soapcpp2_yacc.y" { (yyval.rec) = (yyvsp[(1) - (1)].rec); ;} break; case 258: #line 2227 "soapcpp2_yacc.y" { (yyval.rec) = iop("|", (yyvsp[(1) - (3)].rec), (yyvsp[(3) - (3)].rec)); ;} break; case 259: #line 2228 "soapcpp2_yacc.y" { (yyval.rec) = iop("^", (yyvsp[(1) - (3)].rec), (yyvsp[(3) - (3)].rec)); ;} break; case 260: #line 2229 "soapcpp2_yacc.y" { (yyval.rec) = iop("&", (yyvsp[(1) - (3)].rec), (yyvsp[(3) - (3)].rec)); ;} break; case 261: #line 2230 "soapcpp2_yacc.y" { (yyval.rec) = relop("==", (yyvsp[(1) - (3)].rec), (yyvsp[(3) - (3)].rec)); ;} break; case 262: #line 2231 "soapcpp2_yacc.y" { (yyval.rec) = relop("!=", (yyvsp[(1) - (3)].rec), (yyvsp[(3) - (3)].rec)); ;} break; case 263: #line 2232 "soapcpp2_yacc.y" { (yyval.rec) = relop("<", (yyvsp[(1) - (3)].rec), (yyvsp[(3) - (3)].rec)); ;} break; case 264: #line 2233 "soapcpp2_yacc.y" { (yyval.rec) = relop("<=", (yyvsp[(1) - (3)].rec), (yyvsp[(3) - (3)].rec)); ;} break; case 265: #line 2234 "soapcpp2_yacc.y" { (yyval.rec) = relop(">", (yyvsp[(1) - (3)].rec), (yyvsp[(3) - (3)].rec)); ;} break; case 266: #line 2235 "soapcpp2_yacc.y" { (yyval.rec) = relop(">=", (yyvsp[(1) - (3)].rec), (yyvsp[(3) - (3)].rec)); ;} break; case 267: #line 2236 "soapcpp2_yacc.y" { (yyval.rec) = iop("<<", (yyvsp[(1) - (3)].rec), (yyvsp[(3) - (3)].rec)); ;} break; case 268: #line 2237 "soapcpp2_yacc.y" { (yyval.rec) = iop(">>", (yyvsp[(1) - (3)].rec), (yyvsp[(3) - (3)].rec)); ;} break; case 269: #line 2238 "soapcpp2_yacc.y" { (yyval.rec) = op("+", (yyvsp[(1) - (3)].rec), (yyvsp[(3) - (3)].rec)); ;} break; case 270: #line 2239 "soapcpp2_yacc.y" { (yyval.rec) = op("-", (yyvsp[(1) - (3)].rec), (yyvsp[(3) - (3)].rec)); ;} break; case 271: #line 2240 "soapcpp2_yacc.y" { (yyval.rec) = op("*", (yyvsp[(1) - (3)].rec), (yyvsp[(3) - (3)].rec)); ;} break; case 272: #line 2241 "soapcpp2_yacc.y" { (yyval.rec) = op("/", (yyvsp[(1) - (3)].rec), (yyvsp[(3) - (3)].rec)); ;} break; case 273: #line 2242 "soapcpp2_yacc.y" { (yyval.rec) = iop("%", (yyvsp[(1) - (3)].rec), (yyvsp[(3) - (3)].rec)); ;} break; case 274: #line 2243 "soapcpp2_yacc.y" { (yyval.rec) = (yyvsp[(1) - (1)].rec); ;} break; case 275: #line 2246 "soapcpp2_yacc.y" { if ((yyvsp[(2) - (2)].rec).hasval) (yyval.rec).val.i = !(yyvsp[(2) - (2)].rec).val.i; (yyval.rec).typ = (yyvsp[(2) - (2)].rec).typ; (yyval.rec).hasval = (yyvsp[(2) - (2)].rec).hasval; ;} break; case 276: #line 2252 "soapcpp2_yacc.y" { if ((yyvsp[(2) - (2)].rec).hasval) (yyval.rec).val.i = ~(yyvsp[(2) - (2)].rec).val.i; (yyval.rec).typ = (yyvsp[(2) - (2)].rec).typ; (yyval.rec).hasval = (yyvsp[(2) - (2)].rec).hasval; ;} break; case 277: #line 2258 "soapcpp2_yacc.y" { if ((yyvsp[(2) - (2)].rec).hasval) { if (integer((yyvsp[(2) - (2)].rec).typ)) (yyval.rec).val.i = -(yyvsp[(2) - (2)].rec).val.i; else if (real((yyvsp[(2) - (2)].rec).typ)) (yyval.rec).val.r = -(yyvsp[(2) - (2)].rec).val.r; else typerror("string?"); } (yyval.rec).typ = (yyvsp[(2) - (2)].rec).typ; (yyval.rec).hasval = (yyvsp[(2) - (2)].rec).hasval; ;} break; case 278: #line 2271 "soapcpp2_yacc.y" { (yyval.rec) = (yyvsp[(2) - (2)].rec); ;} break; case 279: #line 2272 "soapcpp2_yacc.y" { if ((yyvsp[(2) - (2)].rec).typ->type == Tpointer) (yyval.rec).typ = (Tnode*)(yyvsp[(2) - (2)].rec).typ->ref; else typerror("dereference of non-pointer type"); (yyval.rec).sto = Snone; (yyval.rec).hasval = False; ;} break; case 280: #line 2280 "soapcpp2_yacc.y" { (yyval.rec).typ = mkpointer((yyvsp[(2) - (2)].rec).typ); (yyval.rec).sto = Snone; (yyval.rec).hasval = False; ;} break; case 281: #line 2286 "soapcpp2_yacc.y" { (yyval.rec).hasval = True; (yyval.rec).typ = mkint(); (yyval.rec).val.i = (yyvsp[(3) - (4)].rec).typ->width; ;} break; case 282: #line 2291 "soapcpp2_yacc.y" { (yyval.rec) = (yyvsp[(1) - (1)].rec); ;} break; case 283: #line 2294 "soapcpp2_yacc.y" { (yyval.rec) = (yyvsp[(2) - (3)].rec); ;} break; case 284: #line 2295 "soapcpp2_yacc.y" { if (!(p = enumentry((yyvsp[(1) - (1)].sym)))) p = undefined((yyvsp[(1) - (1)].sym)); else (yyval.rec).hasval = True; (yyval.rec).typ = p->info.typ; (yyval.rec).val = p->info.val; ;} break; case 285: #line 2303 "soapcpp2_yacc.y" { (yyval.rec).typ = mkint(); (yyval.rec).hasval = True; (yyval.rec).val.i = (yyvsp[(1) - (1)].i); ;} break; case 286: #line 2308 "soapcpp2_yacc.y" { (yyval.rec).typ = mkint(); (yyval.rec).hasval = True; (yyval.rec).val.i = 0; ;} break; case 287: #line 2313 "soapcpp2_yacc.y" { (yyval.rec).typ = mkfloat(); (yyval.rec).hasval = True; (yyval.rec).val.r = (yyvsp[(1) - (1)].r); ;} break; case 288: #line 2318 "soapcpp2_yacc.y" { (yyval.rec).typ = mkchar(); (yyval.rec).hasval = True; (yyval.rec).val.i = (yyvsp[(1) - (1)].c); ;} break; case 289: #line 2323 "soapcpp2_yacc.y" { (yyval.rec).typ = mkstring(); (yyval.rec).hasval = True; (yyval.rec).val.s = (yyvsp[(1) - (1)].s); ;} break; case 290: #line 2328 "soapcpp2_yacc.y" { (yyval.rec).typ = mkbool(); (yyval.rec).hasval = True; (yyval.rec).val.i = 0; ;} break; case 291: #line 2333 "soapcpp2_yacc.y" { (yyval.rec).typ = mkbool(); (yyval.rec).hasval = True; (yyval.rec).val.i = 1; ;} break; /* Line 1267 of yacc.c. */ #line 5460 "soapcpp2_yacc.tab.c" default: break; } YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); YYPOPSTACK (yylen); yylen = 0; YY_STACK_PRINT (yyss, yyssp); *++yyvsp = yyval; /* Now `shift' the result of the reduction. Determine what state that goes to, based on the state we popped back to and the rule number reduced by. */ yyn = yyr1[yyn]; yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) yystate = yytable[yystate]; else yystate = yydefgoto[yyn - YYNTOKENS]; goto yynewstate; /*------------------------------------. | yyerrlab -- here on detecting error | `------------------------------------*/ yyerrlab: /* If not already recovering from an error, report this error. */ if (!yyerrstatus) { ++yynerrs; #if ! YYERROR_VERBOSE yyerror (YY_("syntax error")); #else { YYSIZE_T yysize = yysyntax_error (0, yystate, yychar); if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM) { YYSIZE_T yyalloc = 2 * yysize; if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM)) yyalloc = YYSTACK_ALLOC_MAXIMUM; if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); yymsg = (char *) YYSTACK_ALLOC (yyalloc); if (yymsg) yymsg_alloc = yyalloc; else { yymsg = yymsgbuf; yymsg_alloc = sizeof yymsgbuf; } } if (0 < yysize && yysize <= yymsg_alloc) { (void) yysyntax_error (yymsg, yystate, yychar); yyerror (yymsg); } else { yyerror (YY_("syntax error")); if (yysize != 0) goto yyexhaustedlab; } } #endif } if (yyerrstatus == 3) { /* If just tried and failed to reuse look-ahead token after an error, discard it. */ if (yychar <= YYEOF) { /* Return failure if at end of input. */ if (yychar == YYEOF) YYABORT; } else { yydestruct ("Error: discarding", yytoken, &yylval); yychar = YYEMPTY; } } /* Else will try to reuse look-ahead token after shifting the error token. */ goto yyerrlab1; /*---------------------------------------------------. | yyerrorlab -- error raised explicitly by YYERROR. | `---------------------------------------------------*/ yyerrorlab: /* Pacify compilers like GCC when the user code never invokes YYERROR and the label yyerrorlab therefore never appears in user code. */ if (/*CONSTCOND*/ 0) goto yyerrorlab; /* Do not reclaim the symbols of the rule which action triggered this YYERROR. */ YYPOPSTACK (yylen); yylen = 0; YY_STACK_PRINT (yyss, yyssp); yystate = *yyssp; goto yyerrlab1; /*-------------------------------------------------------------. | yyerrlab1 -- common code for both syntax error and YYERROR. | `-------------------------------------------------------------*/ yyerrlab1: yyerrstatus = 3; /* Each real token shifted decrements this. */ for (;;) { yyn = yypact[yystate]; if (yyn != YYPACT_NINF) { yyn += YYTERROR; if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) { yyn = yytable[yyn]; if (0 < yyn) break; } } /* Pop the current state because it cannot handle the error token. */ if (yyssp == yyss) YYABORT; yydestruct ("Error: popping", yystos[yystate], yyvsp); YYPOPSTACK (1); yystate = *yyssp; YY_STACK_PRINT (yyss, yyssp); } if (yyn == YYFINAL) YYACCEPT; *++yyvsp = yylval; /* Shift the error token. */ YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); yystate = yyn; goto yynewstate; /*-------------------------------------. | yyacceptlab -- YYACCEPT comes here. | `-------------------------------------*/ yyacceptlab: yyresult = 0; goto yyreturn; /*-----------------------------------. | yyabortlab -- YYABORT comes here. | `-----------------------------------*/ yyabortlab: yyresult = 1; goto yyreturn; #ifndef yyoverflow /*-------------------------------------------------. | yyexhaustedlab -- memory exhaustion comes here. | `-------------------------------------------------*/ yyexhaustedlab: yyerror (YY_("memory exhausted")); yyresult = 2; /* Fall through. */ #endif yyreturn: if (yychar != YYEOF && yychar != YYEMPTY) yydestruct ("Cleanup: discarding lookahead", yytoken, &yylval); /* Do not reclaim the symbols of the rule which action triggered this YYABORT or YYACCEPT. */ YYPOPSTACK (yylen); YY_STACK_PRINT (yyss, yyssp); while (yyssp != yyss) { yydestruct ("Cleanup: popping", yystos[*yyssp], yyvsp); YYPOPSTACK (1); } #ifndef yyoverflow if (yyss != yyssa) YYSTACK_FREE (yyss); #endif #if YYERROR_VERBOSE if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); #endif /* Make sure YYID is used. */ return YYID (yyresult); } #line 2340 "soapcpp2_yacc.y" /* * ??? */ int yywrap(void) { return 1; } /**************************************\ Support routines \**************************************/ static Node op(const char *op, Node p, Node q) { Node r; Tnode *typ; r.typ = p.typ; r.sto = Snone; if (p.hasval && q.hasval) { if (integer(p.typ) && integer(q.typ)) switch (op[0]) { case '|': r.val.i = p.val.i | q.val.i; break; case '^': r.val.i = p.val.i ^ q.val.i; break; case '&': r.val.i = p.val.i & q.val.i; break; case '<': r.val.i = p.val.i << q.val.i; break; case '>': r.val.i = p.val.i >> q.val.i; break; case '+': r.val.i = p.val.i + q.val.i; break; case '-': r.val.i = p.val.i - q.val.i; break; case '*': r.val.i = p.val.i * q.val.i; break; case '/': r.val.i = p.val.i / q.val.i; break; case '%': r.val.i = p.val.i % q.val.i; break; default: typerror(op); } else if (real(p.typ) && real(q.typ)) switch (op[0]) { case '+': r.val.r = p.val.r + q.val.r; break; case '-': r.val.r = p.val.r - q.val.r; break; case '*': r.val.r = p.val.r * q.val.r; break; case '/': r.val.r = p.val.r / q.val.r; break; default: typerror(op); } else semerror("invalid constant operation"); r.hasval = True; } else { typ = mgtype(p.typ, q.typ); r.hasval = False; } return r; } static Node iop(const char *iop, Node p, Node q) { if (integer(p.typ) && integer(q.typ)) return op(iop, p, q); typerror("integer operands only"); return p; } static Node relop(const char *op, Node p, Node q) { Node r; Tnode *typ; r.typ = mkint(); r.sto = Snone; r.hasval = True; r.val.i = 1; sprintf(errbuf, "comparison '%s' not evaluated and considered true", op); semwarn(errbuf); if (p.typ->type != Tpointer || p.typ != q.typ) typ = mgtype(p.typ, q.typ); return r; } /**************************************\ Scope management \**************************************/ /* mkscope - initialize scope stack with a new table and offset */ static void mkscope(Table *table, int offset) { sp = stack-1; enterscope(table, offset); } /* enterscope - enter a new scope by pushing a new table and offset on the stack */ static void enterscope(Table *table, int offset) { if (++sp == stack+MAXNEST) execerror("maximum scope depth exceeded"); sp->table = table; sp->val = 0; sp->offset = offset; sp->grow = True; /* by default, offset grows */ sp->mask = False; } /* exitscope - exit a scope by popping the table and offset from the stack */ static void exitscope(void) { check(sp-- != stack, "exitscope() has no matching enterscope()"); } /**************************************\ Undefined symbol \**************************************/ static Entry* undefined(Symbol *sym) { Entry *p; sprintf(errbuf, "undefined identifier '%s'", sym->name); semwarn(errbuf); p = enter(sp->table, sym); p->level = GLOBAL; p->info.typ = mkint(); p->info.sto = Sextern; p->info.hasval = False; return p; } /* mgtype - return most general type among two numerical types */ Tnode* mgtype(Tnode *typ1, Tnode *typ2) { if (numeric(typ1) && numeric(typ2)) { if (typ1->type < typ2->type) return typ2; } else { typerror("non-numeric type"); } return typ1; } /**************************************\ Type checks \**************************************/ static int integer(Tnode *typ) { switch (typ->type) { case Tchar: case Tshort: case Tint: case Tlong: return True; default: break; } return False; } static int real(Tnode *typ) { switch (typ->type) { case Tfloat: case Tdouble: case Tldouble: return True; default: break; } return False; } static int numeric(Tnode *typ) { return integer(typ) || real(typ); } static void add_fault(void) { Table *t; Entry *p1, *p2, *p3, *p4; Symbol *s1, *s2, *s3, *s4; imported = NULL; s1 = lookup("SOAP_ENV__Code"); p1 = entry(classtable, s1); if (!p1 || !p1->info.typ->ref) { t = mktable(NULL); if (!p1) { p1 = enter(classtable, s1); p1->info.typ = mkstruct(t, 3*4); p1->info.typ->id = s1; } else { p1->info.typ->ref = t; } p2 = enter(t, lookup("SOAP_ENV__Value")); p2->info.typ = qname; p2->info.minOccurs = 0; p2 = enter(t, lookup("SOAP_ENV__Subcode")); p2->info.typ = mkpointer(p1->info.typ); p2->info.minOccurs = 0; } s2 = lookup("SOAP_ENV__Detail"); p2 = entry(classtable, s2); if (!p2 || !p2->info.typ->ref) { t = mktable(NULL); if (!p2) { p2 = enter(classtable, s2); p2->info.typ = mkstruct(t, 3*4); p2->info.typ->id = s2; } else { p2->info.typ->ref = t; } p3 = enter(t, lookup("__any")); p3->info.typ = xml; p3->info.minOccurs = 0; p3 = enter(t, lookup("__type")); p3->info.typ = mkint(); p3->info.minOccurs = 0; p3 = enter(t, lookup("fault")); p3->info.typ = mkpointer(mkvoid()); p3->info.minOccurs = 0; custom_fault = 0; } s4 = lookup("SOAP_ENV__Reason"); p4 = entry(classtable, s4); if (!p4 || !p4->info.typ->ref) { t = mktable(NULL); if (!p4) { p4 = enter(classtable, s4); p4->info.typ = mkstruct(t, 4); p4->info.typ->id = s4; } else { p4->info.typ->ref = t; } p3 = enter(t, lookup("SOAP_ENV__Text")); p3->info.typ = mkstring(); p3->info.minOccurs = 0; } s3 = lookup("SOAP_ENV__Fault"); p3 = entry(classtable, s3); if (!p3 || !p3->info.typ->ref) { t = mktable(NULL); if (!p3) { p3 = enter(classtable, s3); p3->info.typ = mkstruct(t, 9*4); p3->info.typ->id = s3; } else { p3->info.typ->ref = t; } p3 = enter(t, lookup("faultcode")); p3->info.typ = qname; p3->info.minOccurs = 0; p3 = enter(t, lookup("faultstring")); p3->info.typ = mkstring(); p3->info.minOccurs = 0; p3 = enter(t, lookup("faultactor")); p3->info.typ = mkstring(); p3->info.minOccurs = 0; p3 = enter(t, lookup("detail")); p3->info.typ = mkpointer(p2->info.typ); p3->info.minOccurs = 0; p3 = enter(t, s1); p3->info.typ = mkpointer(p1->info.typ); p3->info.minOccurs = 0; p3 = enter(t, s4); p3->info.typ = mkpointer(p4->info.typ); p3->info.minOccurs = 0; p3 = enter(t, lookup("SOAP_ENV__Node")); p3->info.typ = mkstring(); p3->info.minOccurs = 0; p3 = enter(t, lookup("SOAP_ENV__Role")); p3->info.typ = mkstring(); p3->info.minOccurs = 0; p3 = enter(t, lookup("SOAP_ENV__Detail")); p3->info.typ = mkpointer(p2->info.typ); p3->info.minOccurs = 0; } } static void add_soap(void) { Symbol *s = lookup("soap"); p = enter(classtable, s); p->info.typ = mkstruct(NULL, 0); p->info.typ->transient = -2; p->info.typ->id = s; } static void add_XML(void) { Symbol *s = lookup("_XML"); s->token = TYPE; p = enter(typetable, s); xml = p->info.typ = mksymtype(mkstring(), s); p->info.sto = Stypedef; } static void add_qname(void) { Symbol *s = lookup("_QName"); s->token = TYPE; p = enter(typetable, s); qname = p->info.typ = mksymtype(mkstring(), s); p->info.sto = Stypedef; } static void add_header(void) { Table *t; Entry *p; Symbol *s = lookup("SOAP_ENV__Header"); imported = NULL; p = entry(classtable, s); if (!p || !p->info.typ->ref) { t = mktable(NULL); if (!p) p = enter(classtable, s); p->info.typ = mkstruct(t, 0); p->info.typ->id = s; custom_header = 0; } } static void add_response(Entry *fun, Entry *ret) { Table *t; Entry *p, *q; Symbol *s; size_t i = 0, j, n = strlen(fun->sym->name); char *r = (char*)emalloc(n+100); strcpy(r, fun->sym->name); strcat(r, "Response"); do { for (j = 0; j < i; j++) r[n+j+8] = '_'; r[n+i+8] = '\0'; if (!(s = lookup(r))) s = install(r, ID); i++; } while (entry(classtable, s)); free(r); t = mktable(NULL); q = enter(t, ret->sym); q->info = ret->info; if (q->info.typ->type == Treference) q->info.typ = (Tnode*)q->info.typ->ref; p = enter(classtable, s); p->info.typ = mkstruct(t, 4); p->info.typ->id = s; fun->info.typ->response = p; } static void add_result(Tnode *typ) { Entry *p; if (!typ->ref || !((Tnode*)typ->ref)->ref) { semwarn("response struct/class must be declared before used in function prototype"); return; } for (p = ((Table*)((Tnode*)typ->ref)->ref)->list; p; p = p->next) if (p->info.sto & Sreturn) return; for (p = ((Table*)((Tnode*)typ->ref)->ref)->list; p; p = p->next) { if (p->info.typ->type != Tfun && !(p->info.sto & Sattribute) && !is_transient(p->info.typ) && !(p->info.sto & (Sprivate|Sprotected))) p->info.sto = (Storage)((int)p->info.sto | (int)Sreturn); return; } } static void add_request(Symbol *sym, Scope *sp) { Entry *p; unlinklast(sp->table); if ((p = entry(classtable, sym))) { if (p->info.typ->ref) { sprintf(errbuf, "service operation name clash: struct/class '%s' already declared at %s:%d", sym->name, p->filename, p->lineno); semerror(errbuf); } else { p->info.typ->ref = sp->table; p->info.typ->width = sp->offset; } } else { p = enter(classtable, sym); p->info.typ = mkstruct(sp->table, sp->offset); p->info.typ->id = sym; } if (p->info.typ->ref) { for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next) { if (q->info.typ->type == Treference || q->info.typ->type == Trvalueref) { sprintf(errbuf, "parameter '%s' of service operation function '%s()' in %s:%d cannot be passed by reference: use a pointer instead", q->sym->name, sym->name, q->filename, q->lineno); semwarn(errbuf); } else if ((q->info.sto & (Sconst | Sconstptr))) { if (!is_string(q->info.typ) && !is_wstring(q->info.typ)) { sprintf(errbuf, "parameter '%s' of service operation function '%s()' in %s:%d cannot be declared const", q->sym->name, sym->name, q->filename, q->lineno); semwarn(errbuf); } } else if ((q->info.sto & ~(Sattribute | Sextern | Sspecial))) { sprintf(errbuf, "invalid parameter '%s' of service operation function '%s()' in %s:%d", q->sym->name, sym->name, q->filename, q->lineno); semwarn(errbuf); } } } } gsoap-2.8.28/gsoap/src/error2.h0000644000175000017500000000363312653650160015561 0ustar ellertellert/* error2.h Error handling. gSOAP XML Web services tools Copyright (C) 2000-2008, Robert van Engelen, Genivia Inc. All Rights Reserved. This part of the software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ extern char errbuf[]; #ifdef WIN32_WITHOUT_SOLARIS_FLEX extern void soapcpp2error(const char*); #else extern void yyerror(const char*); #endif extern void lexerror(const char*); extern void synerror(const char *); extern void semerror(const char *); extern void semwarn(const char *); extern void compliancewarn(const char *); extern void typerror(const char*); extern void execerror(const char*); extern void progerror(const char*, const char*, int); extern int errstat(void); gsoap-2.8.28/gsoap/src/Makefile.am0000644000175000017500000000114212653650160016222 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = foreign 1.4 #LIBS= AM_YFLAGS=-d -v AM_LFLAGS=$(LEX_FLAGS) bin_PROGRAMS=soapcpp2 soapcpp2_CFLAGS=$(BISON_DEFINE) $(LEX_DEFINE) $(C_DEBUG_FLAGS) $(SOAPCPP2_IMPORTPATH) -D$(platform) soapcpp2_LDADD=$(YACC_LIB) $(LEXLIB) soapcpp2_SOURCES= soapcpp2_yacc.y soapcpp2_lex.l symbol2.c error2.c init2.c soapcpp2.c CLEANFILES= *~ soapcpp2_lex.c soapcpp2_yacc.c soapcpp2_yacc.h soapcpp2_yacc.output gsoap-2.8.28/gsoap/src/soapcpp2.h0000644000175000017500000002615312653650160016077 0ustar ellertellert/* soapcpp2.h Common declarations. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc. All Rights Reserved. This part of the software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include #include #include #include #include #include #include "error2.h" #ifndef VERSION # define VERSION "2.8.28" /* Current version */ # define GSOAP_VERSION 20828 #endif #ifdef WIN32 # pragma warning(disable : 4996) # ifndef WITH_BISON # define WITH_BISON # endif #endif /* #define DEBUG */ /* uncomment to debug */ #ifdef DEBUG # define check(expr, msg) (void)((expr) ? 0 : (progerror(msg, __FILE__, __LINE__), 0)) # define DBGLOG(DBGCMD) { DBGCMD; } #else # define check(expr, msg) (void)(expr) # define DBGLOG(DBGCMD) #endif #ifdef WIN32 # ifdef WITH_BISON # ifdef WIN32_WITHOUT_SOLARIS_FLEX # define yyparse soapcpp2parse # define yylex soapcpp2lex # define yyerror soapcpp2error # define yylval soapcpp2lval # define yychar soapcpp2char # define yydebug soapcpp2debug # define yynerrs soapcpp2nerrs # define yylineno soapcpp2lineno # define yytext soapcpp2text # define yyin soapcpp2in # define yywrap soapcpp2wrap # endif # endif #endif #ifdef WIN32 # define SOAP_PATHCAT "\\" # define SOAP_PATHSEP ";" # define LONG64 __int64 #else # define SOAP_PATHCAT "/" # define SOAP_PATHSEP ":" # define LONG64 long long #endif #ifndef ULONG64 # define ULONG64 unsigned LONG64 #endif #if defined(WIN32) # define SOAP_LONG_FORMAT "%I64d" # define SOAP_ULONG_FORMAT "%I64u" # define SOAP_XLONG_FORMAT "%I64x" #elif defined(TRU64) # define SOAP_LONG_FORMAT "%ld" # define SOAP_ULONG_FORMAT "%lu" # define SOAP_XLONG_FORMAT "%lx" #endif #ifndef SOAP_LONG_FORMAT # define SOAP_LONG_FORMAT "%lld" /* printf format for 64 bit ints */ #endif #ifndef SOAP_ULONG_FORMAT # define SOAP_ULONG_FORMAT "%llu" /* printf format for unsigned 64 bit ints */ #endif #ifndef SOAP_XLONG_FORMAT # define SOAP_XLONG_FORMAT "%llx" /* printf format for unsigned 64 bit hex ints */ #endif extern int yylineno; typedef enum Bool {False, True} Bool; typedef int Token; typedef enum Type { Tnone, Tvoid, Tchar, /* primitive types from here*/ Twchar, Tshort, Tint, Tlong, Tllong, Tfloat, Tdouble, Tldouble, Tuchar, Tushort, Tuint, Tulong, Tullong, Tsize, Ttime, Tenum, Tenumsc, Tclass, /* compound types from here */ Tstruct, Tunion, Tpointer, /* pointer T* */ Treference, /* reference T& */ Trvalueref, /* C+11 rvalue reference T&& */ Tarray, /* fixed size array T[N] */ Ttemplate, /* template class */ Tfun } Type; #define TYPES (Tfun+1) /* number of type (operators) enumerated above */ typedef enum Storage { Snone = 0, Sauto = 0x000001, Sregister = 0x000002, Sstatic = 0x000004, Sextern = 0x000008, Stypedef = 0x000010, Svirtual = 0x000020, Sconst = 0x000040, Sconstobj = 0x000080, Sfinal = 0x000100, Soverride = 0x000200, Sconstptr = 0x000400, Sfriend = 0x000800, Sinline = 0x001000, Sabstract = 0x002000, SmustUnderstand = 0x004000, Sreturn = 0x008000, Sattribute = 0x010000, Sspecial = 0x020000, Sexplicit = 0x040000, Sprivate = 0x080000, Sprotected = 0x100000, Smutable = 0x200000 } Storage; typedef enum Level { INTERNAL, GLOBAL, PARAM, LOCAL } Level; #define mknone() mktype(Tnone, NULL, 0) #define mkvoid() mktype(Tvoid, NULL, 0) #define mkbool() mktype(Tenum, booltable, 4) #define mkchar() mktype(Tchar, NULL, 1) /* int8_t */ #define mkwchart() mktype(Twchar, NULL, 4) /* wchar_t */ #define mkshort() mktype(Tshort, NULL, 2) /* int32_t */ #define mkint() mktype(Tint, NULL, 4) /* int32_t */ #define mklong() mktype(Tlong, NULL, 8) /* int32_t */ #define mkllong() mktype(Tllong, NULL, 8) /* int64_t */ #define mkfloat() mktype(Tfloat, NULL, 4) #define mkdouble() mktype(Tdouble, NULL, 8) #define mkldouble() mktype(Tldouble, NULL, 16) /* long double */ #define mkuchar() mktype(Tuchar, NULL, 1) /* uint8_t unsigned char */ #define mkushort() mktype(Tushort, NULL, 2) /* utin16_t unsigned short */ #define mkuint() mktype(Tuint, NULL, 4) /* uint32_t unsigned int */ #define mkulong() mktype(Tulong, NULL, 8) /* uint64_t unsigned long */ #define mkullong() mktype(Tullong, NULL, 8) /* uint64_t unsigned long long */ #define mksize() mktype(Tsize, NULL, 8) /* transient size_t */ #define mktimet() mktype(Ttime, NULL, 4) #define mkenum(t) mktype(Tenum, t, 4) #define mkenumsc(t) mktype(Tenumsc, t, 4) #define mkmask(t) mktype(Tenum, t, 9) #define mkmasksc(t) mktype(Tenumsc, t, 9) #define mkpointer(t) mktype(Tpointer, t, 4) #define mkreference(t) mktype(Treference,t, 4) #define mkrvalueref(t) mktype(Trvalueref,t, 4) #define mkclass(t, w) mktype(Tclass, t, w) #define mkstruct(t, w) mktype(Tstruct, t, w) #define mkunion(t, w) mktype(Tunion, t, w) #define mkarray(t, w) mktype(Tarray, t, w) #define mkfun(t) mktype(Tfun, t, 0) #define mkstring() mkpointer(mkchar()) typedef struct Symbol { char *name; Token token; struct Symbol *next; } Symbol; Symbol *install(const char*, Token), *lookup(const char*), *gensym(const char*), *gensymidx(const char*, int); typedef struct Tnode { Type type; void *ref; Symbol *id; /* struct/class/union/enum name */ Symbol *base; /* base class name */ Symbol *sym; /* typedef name */ Symbol *synonym; /* synonymous typedef base name for 'typedef base id */ Symbol *extsym; /* typedef sym of external type w/ custom serializer */ struct Entry *response; /* funcs only: points to response struct */ int width; int transient; const char *imported; struct Tnode *next; Bool visited; Bool recursive; /* recursive data type */ Bool generated; Bool wsdl; int num; Bool hasmin; Bool hasmax; Bool incmin; Bool incmax; double min; double max; const char *pattern; } Tnode; typedef union Value { LONG64 i; double r; const char *s; } Value; typedef struct IDinfo { Tnode *typ; Storage sto; Bool hasval; /* if true, identifier is constant */ Value val; /* ... with this value */ int offset; LONG64 minOccurs; LONG64 maxOccurs; } IDinfo; typedef struct Entry { Symbol *sym; const char *tag; IDinfo info; Level level; const char *filename; int lineno; struct Entry *next; } Entry; typedef struct Table { Symbol *sym; Level level; Entry *list; struct Table *prev; } Table; typedef struct FNinfo { Tnode *ret; Table *args; } FNinfo; typedef struct Node { Tnode *typ; Storage sto; Bool hasval; /* if true, this node has a constant value */ Value val; /* ... this is the value */ Bool hasmin; Bool hasmax; Bool incmin; Bool incmax; LONG64 minOccurs; LONG64 maxOccurs; double min; double max; const char *pattern; } Node; #define ACTION 0x0000 #define REQUEST_ACTION 0x0001 #define RESPONSE_ACTION 0x0002 #define FAULT_ACTION 0x0004 #define HDRIN 0x0010 #define HDROUT 0x0020 #define MIMEIN 0x0040 #define MIMEOUT 0x0080 #define COMMENT 0x0100 #define ENCODING 0x0200 #define RESPONSE_ENCODING 0x0400 #define STYLE 0x0800 #define FAULT 0x1000 #define PROTOCOL 0x2000 typedef struct Data { struct Data *next; const char *name; const char *text; } Data; typedef struct Method { struct Method *next; const char *name; short mess; /* see #defines above */ const char *part; } Method; typedef struct Service { struct Service *next; const char *ns; const char *name; const char *porttype; const char *portname; const char *binding; const char *definitions; const char *transport; const char *URL; const char *executable; const char *import; const char *URI; const char *URI2; const char *WSDL; const char *style; const char *encoding; const char *protocol; int xsi_type; const char *elementForm; const char *attributeForm; const char *documentation; struct Method *list; struct Data *data; } Service; typedef struct XPath { struct XPath *next; const char *name; const char *path; } XPath; typedef struct Pragma { struct Pragma *next; const char *pragma; } Pragma; extern Entry *enter(Table*, Symbol*), *entry(Table*, Symbol*), *reenter(Table*, Symbol*), *enumentry(Symbol*); extern int merge(Table*, Table*); extern Table *mktable(Table*); extern Tnode *mkmethod(Tnode*, Table*); extern char *emalloc(size_t); extern Tnode *mktype(Type, void*, int); extern Tnode *mksymtype(Tnode*, Symbol*); extern Tnode *mktemplate(Tnode*, Symbol*); extern int is_transient(Tnode*); extern int is_response(Tnode*); extern Table *typetable, *enumtable, *classtable, *booltable, *templatetable; extern void compile(Table*); extern void freetable(Table*); extern Entry *unlinklast(Table*); extern FILE *fmsg; extern int soap_version; extern int aflag; extern int Aflag; extern int bflag; extern int cflag; extern int c11flag; extern int Cflag; extern int eflag; extern int Ecflag; extern int Edflag; extern int Etflag; extern unsigned long fflag; extern int iflag; extern int jflag; extern int mflag; extern int nflag; extern int nflag; extern int lflag; extern int Lflag; extern int Qflag; extern int sflag; extern int Sflag; extern int Tflag; extern int tflag; extern int uflag; extern int vflag; extern int wflag; extern int xflag; extern int yflag; extern int zflag; extern char dirpath[1024]; extern const char *filename; extern const char *prefix; extern const char *importpath; extern int custom_header; extern int custom_fault; extern Pragma *pragmas; extern Service *services; extern XPath *xpaths; extern const char *namespaceid; extern int transient; extern int imports; extern const char *imported; extern int typeNO; extern const char *envURI; extern const char *encURI; extern const char *rpcURI; extern const char *xsiURI; extern const char *xsdURI; gsoap-2.8.28/gsoap/src/symbol2.c0000644000175000017500000271236112653650160015737 0ustar ellertellert/* symbol2.c Symbolic processing: type analysis and code generation. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2016, Robert van Engelen, Genivia Inc. All Rights Reserved. This part of the software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapcpp2.h" #ifdef HAVE_CONFIG_H #include "soapcpp2_yacc.h" #else #include "soapcpp2_yacc.tab.h" #endif const char *envURI = "http://schemas.xmlsoap.org/soap/envelope/"; const char *encURI = "http://schemas.xmlsoap.org/soap/encoding/"; const char *rpcURI = "http://www.w3.org/2003/05/soap-rpc"; const char *xsiURI = "http://www.w3.org/2001/XMLSchema-instance"; const char *xsdURI = "http://www.w3.org/2001/XMLSchema"; const char *tmpURI = "http://tempuri.org"; static Symbol *symlist = (Symbol*) 0; /* pointer to linked list of symbols */ static Symbol *nslist = (Symbol*) 0; /* pointer to linked list of namespace prefix symbols */ static Tnode *Tptr[TYPES]; Service *services = NULL; XPath *xpaths = NULL; /* TODO */ FILE *fout, *fhead, *fclient, *fserver, *fheader, *flib, *fmatlab, *fmheader; int partnum = 0; int typeNO = 1; /* unique nonzero type no. assigned to all types */ static int is_anytype_flag = 0; /* anytype is used */ static int has_nsmap = 0; int tagcmp(const char *s, const char *t); int tagncmp(const char *s, const char *t, size_t n); long minlen(Tnode *typ); long maxlen(Tnode *typ); int is_soap12(const char*); int has_detail_string(void); int has_Detail_string(void); void needs_lang(Entry *e); int is_mutable(Entry *e); int is_header_or_fault(Tnode *typ); int is_body(Tnode *typ); int is_volatile(Tnode* typ); int is_untyped(Tnode* typ); int is_primclass(Tnode* typ); int is_imported(Tnode* typ); int is_smart(Tnode*); int is_smart_shared(Tnode*); const char * make_shared(Tnode*); int is_container(Tnode* typ); int is_template(Tnode* typ); int is_mask(Tnode* typ); int is_attachment(Tnode* typ); int is_void(Tnode* typ); int has_external(Tnode *typ); int has_volatile(Tnode *typ); int is_unmatched(Symbol *sym); int is_invisible(const char *name); int is_invisible_empty(Tnode *p); int is_element(Tnode *typ); int is_eq_nons(const char *s, const char *t); int is_eq(const char *s, const char *t); int is_item(Entry *p); int is_self(Entry *p); const char *cstring(const char*, int); const char *xstring(const char*); const char *get_mxClassID(Tnode*); const char *t_ident(Tnode*); const char *c_ident(Tnode*); const char *ident(const char*); const char *soap_type(Tnode*); const char *soap_union_member(Tnode*, Entry*); const char *c_storage(Storage); const char *c_const(Storage); const char *c_init(Entry*); const char *c_type(Tnode*); const char *c_type_constptr_id(Tnode*, const char*); const char *c_type_id(Tnode*, const char*); const char *c_type_synonym(Tnode*, const char*); const char *xsi_type_cond(Tnode*, int); const char *xsi_type(Tnode*); const char *xsi_type_cond_u(Tnode*, int); const char *xsi_type_u(Tnode*); const char *the_type(Tnode*); const char *wsdl_type(Tnode*, const char*); const char *base_type(Tnode*, const char*); const char *xml_tag(Tnode*); const char *ns_qualifiedElement(Tnode*); const char *ns_qualifiedAttribute(Tnode*); const char *ns_convert(const char*); const char *field(Entry *p, const char *ns); const char *field_overridden(Table *t, Entry *p, const char *ns); const char *ns_add(Entry *p, const char *ns); const char *ns_addx(const char *tag, const char *ns); const char *ns_add_overridden(Table *t, Entry *p, const char *ns); const char *ns_remove(const char*); const char *ns_remove1(const char*); const char *ns_remove2(const char*, const char*); const char *res_remove(const char*); const char *ns_name(const char*); const char *ns_cname(const char*, const char*); const char *ns_fname(const char*); int has_class(Tnode*); const char *union_member(Tnode*); int has_union(Tnode*); int has_constructor(Tnode*); int has_destructor(Tnode*); int has_getter(Tnode*); int has_setter(Tnode*); int has_ns(Tnode*); int has_ns_t(Tnode*); int has_ns_eq(const char*, const char*); const char *strict_check(void); const char *ns_of(const char*); int eq_ns(const char*, const char*); const char *prefix_of(const char*); int has_offset(Tnode*); int is_bool(Tnode*); int is_boolean(Tnode*); int reflevel(Tnode *typ); Tnode* reftype(Tnode *typ); int is_response(Tnode*); int is_XML(Tnode*); int is_stdXML(Tnode *p); Entry *get_response(Tnode*); int is_primitive_or_string(Tnode*); int is_primitive(Tnode*); Entry *is_discriminant(Tnode*); Entry *is_dynamic_array(Tnode*); int is_transient(Tnode*); int is_external(Tnode*); int is_anyType(Tnode*); int is_anyAttribute(Tnode*); int is_binary(Tnode*); int is_hexBinary(Tnode*); int is_fixedstring(Tnode*); int is_string(Tnode*); int is_wstring(Tnode*); int is_stdstring(Tnode*); int is_stdwstring(Tnode*); int is_stdstr(Tnode*); int is_typedef(Tnode*); int is_synonym(Tnode*); int get_dimension(Tnode*); const char *has_soapref(Tnode*); int is_soapref(Tnode*); int is_document(const char*); int is_literal(const char*); int is_keyword(const char *); int is_repetition(Entry*); int is_choice(Entry*); int required_choice(Tnode*); int is_sequence(Entry*); int is_anytype(Entry*); const char *xsi_type_Tarray(Tnode*); const char *xsi_type_Darray(Tnode*); void matlab_def_table(Table*); void generate_defs(void); void generate_type(Tnode *); int no_of_var(Tnode*); const char *pointer_stuff(Tnode*); void in_defs(void); void in_defs2(void); void in_defs3(void); void out_defs(void); void mark_defs(void); void dup_defs(void); void del_defs(void); void in_attach(void); void soap_serialize(Tnode*); void soap_traverse(Tnode*); void soap_default(Tnode*); void soap_put(Tnode*); void soap_out(Tnode*); void soap_out_Darray(Tnode *); void soap_get(Tnode*); void soap_in(Tnode*); void soap_in_Darray(Tnode *); void soap_instantiate(Tnode *); void soap_dup(Tnode *); void soap_del(Tnode *); int get_Darraydims(Tnode *typ); const char* get_Darraysize(const char *a, int d); const char *nillable(Tnode *typ); void soap_serve(Table*); void generate_proto(Table*, Entry*); /* void generate_call(Table*, Entry*); void generate_server(Table*, Entry*); */ void detect_cycles(void); void detect_recursive_type(Tnode*); void generate_header(Table*); void get_namespace_prefixes(void); void generate_schema(Table*); void gen_schema(FILE*, Table*, const char*, const char*, int, const char*, const char*); void gen_type_documentation(FILE *fd, Entry *type, const char *ns); int gen_member_documentation(FILE *fd, Symbol *type, Entry *member, const char *ns, int scope); void gen_schema_elements_attributes(FILE *fd, Table *t, const char *ns, const char *ns1, const char *encoding, const char *style); void gen_schema_elements(FILE *fd, Tnode *p, const char *ns, const char *ns1); int gen_schema_element(FILE *fd, Tnode *p, Entry *q, const char *ns, const char *ns1); void gen_schema_attributes(FILE *fd, Tnode *p, const char *ns, const char *ns1); void gen_wsdl(FILE*, Table*, const char*, const char*, const char*, const char*, const char*, const char*, const char*, const char*); void gen_nsmap(FILE*); void gen_proxy(FILE*, Table*, Symbol*, const char*, const char*); void gen_object(FILE*, Table*, const char*); void gen_proxy_header(FILE*, Table*, Symbol*, const char*); void gen_proxy_code(FILE*, Table*, Symbol*, const char*); void gen_object_header(FILE*, Table*, Symbol*, const char*); void gen_object_code(FILE*, Table*, Symbol*, const char*); void gen_method(FILE *fd, Entry *method, int server); void gen_params(FILE *fd, Table *params, Entry *result, int flag); void gen_args(FILE *fd, Table *params, Entry *result, int flag); void gen_query_url(FILE *fd, Table *params); void gen_query_form(FILE *fd, Table *params); const char* gen_format(Tnode *typ); void gen_call_method(FILE *fd, Entry *method, const char *name); void gen_serve_method(FILE *fd, Table *table, Entry *param, const char *name); void gen_data(const char*, Table*, const char*, const char*); FILE *gen_env(const char*, const char*, int, const char*, int); void gen_xmlns(FILE*); void gen_field(FILE*, int, Entry*, const char*, const char*, const char*); void gen_val(FILE*, int, Tnode*, const char*, const char*, const char*); void gen_atts(FILE*, Table*, const char*); /* install - add new symbol */ Symbol * install(const char *name, Token token) { Symbol *p; p = (Symbol*)emalloc(sizeof(Symbol)); p->name = (char*)emalloc(strlen(name)+1); strcpy(p->name, name); p->token = token; p->next = symlist; symlist = p; return p; } /* lookup - search for an identifier's name. If found, return pointer to symbol table entry. Return pointer 0 if not found. */ Symbol * lookup(const char *name) { Symbol *p; for (p = symlist; p; p = p->next) if (!strcmp(p->name, name)) return p; return NULL; } /* gensymidx - generate new symbol from base name and index */ Symbol * gensymidx(const char *base, int idx) { char buf[1024]; Symbol *s; sprintf(buf, "%s_%d", base, idx); s = lookup(buf); if (s) return s; return install(buf, ID); } /* gensym - generate new symbol from base name */ Symbol * gensym(const char *base) { static int num = 1; return gensymidx(base, num++); } /* mktable - make a new symbol table with a pointer to a previous table */ Table * mktable(Table *table) { Table *p; p = (Table*)emalloc(sizeof(Table)); p->sym = lookup("/*?*/"); p->list = (Entry*) 0; if (table == (Table*) 0) p->level = INTERNAL; else p->level = (enum Level)(((int)table->level) + 1); p->prev = table; return p; } /* mkmethod - make a new method by calling mktype */ Tnode * mkmethod(Tnode *ret, Table *args) { FNinfo *fn = (FNinfo*)emalloc(sizeof(FNinfo)); fn->ret = ret; fn->args = args; return mktype(Tfun, fn, 0); } /* freetable - free space by removing a table */ void freetable(Table *table) { Entry *p, *q; if (table == (Table*) 0) return; for (p = table->list; p != (Entry*) 0; p = q) { q = p->next; free(p); } free(table); } /* unlinklast - unlink last entry added to table */ Entry * unlinklast(Table *table) { Entry **p, *q; if (table == (Table*)0) return (Entry*)0; for (p = &table->list; *p != (Entry*)0 && (*p)->next != (Entry*)0; p = &(*p)->next) ; q = *p; *p = (Entry*)0; return q; } /* enter - enter a symbol in a table. Error if already in the table */ Entry * enter(Table *table, Symbol *sym) { Entry *p, *q = NULL; again: for (p = table->list; p; q = p, p = p->next) { if (p->sym == sym && p->info.typ->type != Tfun) { char *s; sprintf(errbuf, "Duplicate declaration of '%s' (already declared at line %d), changing conflicting identifier name to new name '%s_'. Note: this problem may be caused by importing invalid XML schemas", sym->name, p->lineno, sym->name); semwarn(errbuf); s = (char*)emalloc(strlen(sym->name) + 2); strcpy(s, sym->name); strcat(s, "_"); sym = lookup(s); if (!sym) sym = install(s, ID); free(s); goto again; } } p = (Entry*)emalloc(sizeof(Entry)); p->sym = sym; p->tag = NULL; p->info.typ = NULL; p->info.sto = Snone; p->info.hasval = False; p->info.minOccurs = 1; p->info.maxOccurs = 1; p->info.offset = 0; p->level = table->level; p->filename = filename; p->lineno = yylineno; p->next = NULL; if (!q) table->list = p; else q->next = p; return p; } /* entry - return pointer to table entry of a symbol */ Entry * entry(Table *table, Symbol *sym) { Table *t; Entry *p; for (t = table; t; t = t->prev) for (p = t->list; p; p = p->next) if (p->sym == sym) return p; return (Entry*)0; } /* reenter - re-enter a symbol in a table. */ Entry * reenter(Table *table, Symbol *sym) { Entry *p, *q = NULL; for (p = table->list; p; q = p, p = p->next) if (p->sym == sym) break; if (p && p->next) { if (q) q->next = p->next; else table->list = p->next; for (q = p->next; q->next; q = q->next) ; q->next = p; p->next = NULL; } return p; } /* merge - append two tables if members are not duplicated */ int merge(Table *dest, Table *src) { Entry *p, *q; for (p = src->list; p; p = p->next) { q = entry(dest, p->sym); if (!q) { q = enter(dest, p->sym); q->info = p->info; } else if (q->info.typ != p->info.typ) return 1; } return 0; } Entry * enumentry(Symbol *sym) { const char *s = strstr(sym->name, "::"); if (s && s[2]) { Entry *e; char *t = (char*)emalloc(s - sym->name + 1); strncpy(t, sym->name, s - sym->name); t[s - sym->name] = '\0'; e = entry(enumtable, lookup(t)); free(t); if (!e) return NULL; return entry((Table*)e->info.typ->ref, lookup(s + 2)); } else { Table *t; for (t = enumtable; t; t = t->prev) { Entry *p; for (p = t->list; p; p = p->next) { Entry *e = entry((Table*)p->info.typ->ref, sym); if (e) return e; } } } return NULL; } /* mktype - make a (new) type with a reference to additional information and the width in bytes required to store objects of that type. A pointer to the type is returned which can be compared to check if types are identical. */ Tnode * mktype(Type type, void *ref, int width) { Tnode *p; if (type != Tstruct && type != Tclass && type != Tunion && ((type != Tenum && type != Tenumsc) || ref)) { for (p = Tptr[type]; p; p = p->next) { if (p->ref == ref && p->sym == (Symbol*)0 && p->width == width && ((p->transient == 1 && transient == 1) || (p->transient != 1 && transient != 1))) { if (imported && !p->imported) p->imported = imported; return p; /* type already exists in table */ } } } p = (Tnode*)emalloc(sizeof(Tnode)); /* install new type */ p->type = type; p->ref = ref; p->id = lookup("/*?*/"); p->base = NULL; p->sym = NULL; p->synonym = NULL; p->extsym = NULL; p->response = NULL; p->width = width; p->visited = False; p->recursive = False; p->generated = False; p->wsdl = False; p->next = Tptr[type]; p->transient = transient; p->imported = imported; p->hasmin = False; p->hasmax = False; p->incmin = True; p->incmax = True; p->min = 0.0; p->max = 0.0; p->pattern = NULL; p->num = typeNO++; Tptr[type] = p; DBGLOG(fprintf(stderr, "New type %s %s\n", c_type(p), p->imported)); if (type == Tpointer && ((Tnode*)ref)->imported && (((Tnode*)ref)->type == Tenum || ((Tnode*)ref)->type == Tenumsc || ((Tnode*)ref)->type == Tstruct || ((Tnode*)ref)->type == Tclass)) p->imported = ((Tnode*)ref)->imported; else if (lflag && !is_transient(p) && (type == Tenum || type == Tenumsc || type == Tstruct || type == Tclass)) mkpointer(p); return p; } Tnode * mksymtype(Tnode *typ, Symbol *sym) { Tnode *p; p = (Tnode*)emalloc(sizeof(Tnode)); /* install new type */ p->type = typ->type; p->ref = typ->ref; if (typ->id == lookup("/*?*/")) p->id = sym; else p->id = typ->id; p->sym = sym; p->synonym = NULL; p->extsym = typ->extsym; p->response = (Entry*)0; p->width = typ->width; p->visited = False; p->recursive = False; p->generated = False; p->wsdl = False; p->next = Tptr[typ->type]; p->transient = transient; p->imported = imported; p->hasmin = False; p->hasmax = False; p->incmin = True; p->incmax = True; p->min = 0.0; p->max = 0.0; p->pattern = NULL; p->num = typeNO++; Tptr[typ->type] = p; DBGLOG(fprintf(stderr, "New typedef %s %s\n", c_type(p), p->imported)); return p; } Tnode * mktemplate(Tnode *typ, Symbol *id) { Tnode *p; for (p = Tptr[Ttemplate]; p; p = p->next) { if (p->ref == typ && p->id == id && ((p->transient == 1 && transient == 1) || (p->transient != 1 && transient != 1))) { if (imported && !p->imported) p->imported = imported; return p; /* type alrady exists in table */ } } p = (Tnode*)emalloc(sizeof(Tnode)); /* install new type */ p->type = Ttemplate; p->ref = typ; p->id = id; p->sym = NULL; p->synonym = NULL; p->extsym = NULL; p->response = (Entry*)0; p->width = 0; p->generated = False; p->wsdl = False; p->next = Tptr[Ttemplate]; p->transient = transient; p->imported = imported; p->hasmin = False; p->hasmax = False; p->incmin = True; p->incmax = True; p->min = 0.0; p->max = 0.0; p->pattern = NULL; p->num = typeNO++; Tptr[Ttemplate] = p; return p; } /* DO NOT REMOVE OR ALTER (SEE LICENCE AGREEMENT AND COPYING.txt) */ void copyrightnote(FILE *fd, const char *fn) { fprintf(fd, "/* %s\n Generated by gSOAP " VERSION " from %s\n\ \n\ gSOAP XML Web services tools\n\ Copyright (C) 2000-2016, Robert van Engelen, Genivia Inc. All Rights Reserved.\n\ The soapcpp2 tool and its generated software are released under the GPL.\n\ This program is released under the GPL with the additional exemption that\n\ compiling, linking, and/or using OpenSSL is allowed.\n\ --------------------------------------------------------------------------------\n\ A commercial use license is available from Genivia Inc., contact@genivia.com\n\ --------------------------------------------------------------------------------\n\ */", fn, filename); } void banner(FILE *fd, const char *text) { int i; fprintf(fd, "\n\n/"); for (i = 0; i < 78; i++) fputc('*', fd); fprintf(fd, "\\\n *%76s*\n * %-75s*\n *%76s*\n\\", "", text, ""); for (i = 0; i < 78; i++) fputc('*', fd); fprintf(fd, "/\n"); } void identify(FILE *fd, const char *fn) { time_t t = time(NULL), *p = &t; char tmp[256]; strftime(tmp, 256, "%Y-%m-%d %H:%M:%S GMT", gmtime(p)); fprintf(fd, "\n\nSOAP_SOURCE_STAMP(\"@(#) %s ver " VERSION " %s\")\n", fn, tmp); } void compile(Table *table) { Entry *p; Tnode *typ; Pragma *pragma; int classflag = 0; int found; int filenum; const char *s; char base[1024]; char soapStub[1024]; char soapH[1024]; char soapC[1024]; char soapClient[1024]; char soapServer[1024]; char soapClientLib[1024]; char soapServerLib[1024]; char pathsoapStub[1024]; char pathsoapH[1024]; char pathsoapC[1024]; char pathsoapClient[1024]; char pathsoapServer[1024]; char pathsoapClientLib[1024]; char pathsoapServerLib[1024]; char soapMatlab[1024]; char pathsoapMatlab[1024]; char soapMatlabHdr[1024]; char pathsoapMatlabHdr[1024]; found = 0; for (p = table->list; p; p = p->next) if (p->info.typ->type == Tfun && !(p->info.sto & Sextern)) found = 1; if (!found) Sflag = Cflag = Lflag = 1; /* no service operations were found */ if (*dirpath) fprintf(fmsg, "Using project directory path: %s\n", dirpath); if (namespaceid) { prefix = namespaceid; fprintf(fmsg, "Using code namespace: %s\n", namespaceid); } strcpy(base, prefix); if (cflag) s = ".c"; else s = ".cpp"; strcpy(soapMatlab, base); strcat(soapMatlab, "Matlab.c"); strcpy(pathsoapMatlab, dirpath); strcat(pathsoapMatlab, soapMatlab ); strcpy(soapMatlabHdr, base); strcat(soapMatlabHdr, "Matlab.h"); strcpy(pathsoapMatlabHdr, dirpath); strcat(pathsoapMatlabHdr, soapMatlabHdr); strcpy(soapStub, base); strcat(soapStub, "Stub.h"); strcpy(pathsoapStub, dirpath); strcat(pathsoapStub, soapStub); strcpy(soapH, base); strcat(soapH, "H.h"); strcpy(pathsoapH, dirpath); strcat(pathsoapH, soapH); strcpy(soapC, base); if (fflag) strcat(soapC, "C_nnn"); else strcat(soapC, "C"); strcat(soapC, s); strcpy(pathsoapC, dirpath); strcat(pathsoapC, soapC); strcpy(soapClient, base); strcat(soapClient, "Client"); strcat(soapClient, s); strcpy(pathsoapClient, dirpath); strcat(pathsoapClient, soapClient); strcpy(soapServer, base); strcat(soapServer, "Server"); strcat(soapServer, s); strcpy(pathsoapServer, dirpath); strcat(pathsoapServer, soapServer); strcpy(soapClientLib, base); strcat(soapClientLib, "ClientLib"); strcat(soapClientLib, s); strcpy(pathsoapClientLib, dirpath); strcat(pathsoapClientLib, soapClientLib); strcpy(soapServerLib, base); strcat(soapServerLib, "ServerLib"); strcat(soapServerLib, s); strcpy(pathsoapServerLib, dirpath); strcat(pathsoapServerLib, soapServerLib); if (mflag) { fprintf(fmsg, "Saving %s Matlab definitions\n", pathsoapMatlab); fmatlab = fopen(pathsoapMatlab, "w"); if (!fmatlab) execerror("Cannot write to file"); copyrightnote(fmatlab, soapMatlab); fprintf(fmatlab, "\n#include \"%s\"\n", soapMatlabHdr); fprintf(fmsg, "Saving %s Matlab definitions\n", pathsoapMatlabHdr); fmheader = fopen(pathsoapMatlabHdr, "w"); if (!fmheader) execerror("Cannot write to file"); copyrightnote(fmheader, soapMatlabHdr); fprintf(fmheader, "\n#include \"mex.h\"\n#include \"%s\"\n", soapStub); } fprintf(fmsg, "Saving %s annotated copy of the source input\n", pathsoapStub); fheader = fopen(pathsoapStub, "w"); if (!fheader) execerror("Cannot write to file"); copyrightnote(fheader, soapStub); fprintf(fheader, "\n"); for (pragma = pragmas; pragma; pragma = pragma->next) fprintf(fheader, "\n%s", pragma->pragma); fprintf(fheader, "\n\n#ifndef %sStub_H\n#define %sStub_H", prefix, prefix); if (nflag) fprintf(fheader, "\n#ifndef WITH_NONAMESPACES\n#define WITH_NONAMESPACES\n#endif"); if (namespaceid) fprintf(fheader, "\n#ifndef WITH_NOGLOBAL\n#define WITH_NOGLOBAL\n#endif"); fprintf(fheader, "\n#include \"stdsoap2.h\""); fprintf(fheader, "\n#if GSOAP_VERSION != %d\n# error \"GSOAP VERSION %d MISMATCH IN GENERATED CODE VERSUS LIBRARY CODE: PLEASE REINSTALL PACKAGE\"\n#endif\n", GSOAP_VERSION, GSOAP_VERSION); if (cflag) fprintf(fheader, "\n#ifdef __cplusplus\nextern \"C\" {\n#endif"); if (namespaceid) fprintf(fheader, "\n\nnamespace %s {", namespaceid); fprintf(fmsg, "Saving %s declarations to #include\n", pathsoapH); fhead = fopen(pathsoapH, "w"); if (!fhead) execerror("Cannot write to file"); copyrightnote(fhead, soapH); fprintf(fhead, "\n\n#ifndef %sH_H\n#define %sH_H", prefix, prefix); fprintf(fhead, "\n#include \"%s\"", soapStub); if (cflag) fprintf(fhead, "\n#ifdef __cplusplus\nextern \"C\" {\n#endif"); if (namespaceid) fprintf(fhead, "\n\nnamespace %s {", namespaceid); fprintf(fhead, "\n#ifndef WITH_NOIDREF"); if (!cflag && !namespaceid) fprintf(fhead, "\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif"); fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_markelement(struct soap*, const void*, int);"); if (!cflag && !namespaceid) fprintf(fhead, "\n\n#ifdef __cplusplus\n}\n#endif"); fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_putindependent(struct soap*);"); fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_getindependent(struct soap*);"); fprintf(fhead, "\n#endif"); if (!cflag && !namespaceid) fprintf(fhead, "\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif"); fprintf(fhead, "\nSOAP_FMAC3 void *SOAP_FMAC4 soap_getelement(struct soap*, int*);"); fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_putelement(struct soap*, const void*, const char*, int, int);"); if (Ecflag) fprintf(fhead, "\nSOAP_FMAC3 void * SOAP_FMAC4 soap_dupelement(struct soap*, const void*, int);"); if (Edflag) fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_delelement(const void*, int);"); if (!cflag && !namespaceid) fprintf(fhead, "\n\n#ifdef __cplusplus\n}\n#endif"); fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_ignore_element(struct soap*);"); detect_cycles(); generate_header(table); generate_schema(table); if (!Sflag && !iflag && !jflag) { fprintf(fmsg, "Saving %s client calling stubs\n", pathsoapClient); fclient = fopen(pathsoapClient, "w"); if (!fclient) execerror("Cannot write to file"); copyrightnote(fclient, soapClient); fprintf(fclient, "\n\n#if defined(__BORLANDC__)"); fprintf(fclient, "\n#pragma option push -w-8060"); fprintf(fclient, "\n#pragma option push -w-8004"); fprintf(fclient, "\n#endif"); fprintf(fclient, "\n#include \"%sH.h\"", prefix); if (cflag) fprintf(fclient, "\n#ifdef __cplusplus\nextern \"C\" {\n#endif"); if (namespaceid) fprintf(fclient, "\n\nnamespace %s {", namespaceid); identify(fclient, soapClient); if (!Lflag) { flib = fopen(pathsoapClientLib, "w"); if (!flib) execerror("Cannot write to file"); copyrightnote(flib, soapClientLib); fprintf(fmsg, "Saving %s client stubs with serializers (use only for libs)\n", pathsoapClientLib); fprintf(flib, "\n\n/** Use this file in your project build instead of the two files %s and %s. This hides the serializer functions and avoids linking problems when linking multiple clients and servers. */\n", soapC, soapClient); fprintf(flib, "\n#ifndef WITH_NOGLOBAL\n#define WITH_NOGLOBAL\n#endif"); fprintf(flib, "\n#define SOAP_FMAC3 static"); fprintf(flib, "\n#include \"%s\"", soapC); fprintf(flib, "\n#include \"%s\"", soapClient); fprintf(flib, "\n\n/* End of %s */\n", soapClientLib); fclose(flib); } } if (!Cflag && !iflag && !jflag) { fprintf(fmsg, "Saving %s server request dispatcher\n", pathsoapServer); fserver = fopen(pathsoapServer, "w"); if (!fserver) execerror("Cannot write to file"); copyrightnote(fserver, soapServer); fprintf(fserver, "\n\n#if defined(__BORLANDC__)"); fprintf(fserver, "\n#pragma option push -w-8060"); fprintf(fserver, "\n#pragma option push -w-8004"); fprintf(fserver, "\n#endif"); fprintf(fserver, "\n#include \"%sH.h\"", prefix); if (cflag) fprintf(fserver, "\n#ifdef __cplusplus\nextern \"C\" {\n#endif"); if (namespaceid) fprintf(fserver, "\n\nnamespace %s {", namespaceid); identify(fserver, soapServer); if (!Lflag) { flib = fopen(pathsoapServerLib, "w"); if (!flib) execerror("Cannot write to file"); copyrightnote(flib, soapServerLib); fprintf(fmsg, "Saving %s server request dispatcher with serializers (use only for libs)\n", pathsoapServerLib); fprintf(flib, "\n\n/** Use this file in your project build instead of the two files %s and %s. This hides the serializer functions and avoids linking problems when linking multiple clients and servers. */\n", soapC, soapServer); fprintf(flib, "\n#ifndef WITH_NOGLOBAL\n#define WITH_NOGLOBAL\n#endif"); fprintf(flib, "\n#define SOAP_FMAC3 static"); fprintf(flib, "\n#include \"%s\"", soapC); fprintf(flib, "\n#include \"%s\"", soapServer); fprintf(flib, "\n\n/* End of %s */\n", soapServerLib); fclose(flib); } } if (!iflag && !jflag) soap_serve(table); classflag = 0; for (p = classtable->list; p; p = p->next) { if (p->info.typ->type == Tclass && p->info.typ->transient <= 0) { classflag = 1; break; } } for (p = enumtable->list; p; p = p->next) { if (p->info.typ->type == Tenumsc && p->info.typ->transient <= 0) { classflag = 1; break; } } if (classflag || Tptr[Ttemplate]) { if (cflag) semwarn("Option -c conflicts with the use of class definitions in the specified input"); } for (filenum = 1; partnum == 0; filenum++) { if (fflag) { char *t = strrchr(pathsoapC, '.'); sprintf(t-3, "%03d", filenum); *t = '.'; fprintf(fmsg, "Saving %s serializers (part %d)\n", pathsoapC, filenum); partnum = fflag; /* number of defs per file */ } else { fprintf(fmsg, "Saving %s serializers\n", pathsoapC); partnum = 1; } fout = fopen(pathsoapC, "w"); if (!fout) execerror("Cannot write to file"); copyrightnote(fout, soapC); fprintf(fout, "\n\n#if defined(__BORLANDC__)"); fprintf(fout, "\n#pragma option push -w-8060"); fprintf(fout, "\n#pragma option push -w-8004"); fprintf(fout, "\n#endif"); fprintf(fout, "\n\n#include \"%sH.h\"", prefix); if (cflag) fprintf(fout, "\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif"); if (namespaceid) fprintf(fout, "\n\nnamespace %s {", namespaceid); identify(fout, soapC); fflush(fout); if (filenum == 1) { if (!lflag) { fprintf(fout, "\n\n#ifndef WITH_NOGLOBAL"); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_getheader(struct soap *soap)\n{\n\tsoap->part = SOAP_IN_HEADER;\n\tsoap->header = soap_in_SOAP_ENV__Header(soap, \"SOAP-ENV:Header\", soap->header, NULL);\n\tsoap->part = SOAP_END_HEADER;\n\treturn soap->header == NULL;\n}"); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_putheader(struct soap *soap)\n{\n\tif (soap->version && soap->header)\n\t{\tsoap->part = SOAP_IN_HEADER;\n\t\tif (soap_out_SOAP_ENV__Header(soap, \"SOAP-ENV:Header\", 0, soap->header, NULL))\n\t\t\treturn soap->error;\n\t\tsoap->part = SOAP_END_HEADER;\n\t}\n\treturn SOAP_OK;\n}"); if (cflag) { fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serializeheader(struct soap *soap)\n{\n\tif (soap->version && soap->header)\n\t\tsoap_serialize_SOAP_ENV__Header(soap, soap->header);\n}"); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_header(struct soap *soap)\n{\n\tif (soap->header == NULL)\n\t{\tif ((soap->header = (struct SOAP_ENV__Header*)soap_malloc(soap, sizeof(struct SOAP_ENV__Header))))\n\t\t\tsoap_default_SOAP_ENV__Header(soap, soap->header);\n\t}\n}"); } else if ((p = entry(classtable, lookup("SOAP_ENV__Header"))) && p->info.typ->type == Tstruct) { fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serializeheader(struct soap *soap)\n{\n\tif (soap->version && soap->header)\n\t\tsoap_serialize_SOAP_ENV__Header(soap, soap->header);\n}"); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_header(struct soap *soap)\n{\n\tif (soap->header == NULL)\n\t{\tif ((soap->header = soap_new_SOAP_ENV__Header(soap)))\n\t\t\tsoap_default_SOAP_ENV__Header(soap, soap->header);\n\t}\n}"); } else { fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serializeheader(struct soap *soap)\n{\n\tif (soap->version && soap->header)\n\t\tsoap->header->soap_serialize(soap);\n}"); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_header(struct soap *soap)\n{\n\tif (soap->header == NULL)\n\t{\tif ((soap->header = soap_new_SOAP_ENV__Header(soap)))\n\t\t\tsoap->header->soap_default(soap);\n\t}\n}"); } if (cflag) { fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_fault(struct soap *soap)\n{\n\tif (soap->fault == NULL)\n\t{\tsoap->fault = (struct SOAP_ENV__Fault*)soap_malloc(soap, sizeof(struct SOAP_ENV__Fault));\n\t\tif (soap->fault == NULL)\n\t\t\treturn;\n\t\tsoap_default_SOAP_ENV__Fault(soap, soap->fault);\n\t}\n\tif (soap->version == 2 && !soap->fault->SOAP_ENV__Code)\n\t{\tsoap->fault->SOAP_ENV__Code = (struct SOAP_ENV__Code*)soap_malloc(soap, sizeof(struct SOAP_ENV__Code));\n\t\tsoap_default_SOAP_ENV__Code(soap, soap->fault->SOAP_ENV__Code);\n\t}\n\tif (soap->version == 2 && !soap->fault->SOAP_ENV__Reason)\n\t{\tsoap->fault->SOAP_ENV__Reason = (struct SOAP_ENV__Reason*)soap_malloc(soap, sizeof(struct SOAP_ENV__Reason));\n\t\tsoap_default_SOAP_ENV__Reason(soap, soap->fault->SOAP_ENV__Reason);\n\t}\n}"); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serializefault(struct soap *soap)\n{\n\tif (soap->fault)\n\t\tsoap_serialize_SOAP_ENV__Fault(soap, soap->fault);\n}"); } else if ((p = entry(classtable, lookup("SOAP_ENV__Fault"))) && p->info.typ->type == Tstruct) { fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_fault(struct soap *soap)\n{\n\tif (soap->fault == NULL)\n\t{\tsoap->fault = soap_new_SOAP_ENV__Fault(soap);\n\t\tif (soap->fault == NULL)\n\t\t\treturn;\n\t\tsoap_default_SOAP_ENV__Fault(soap, soap->fault);\n\t}\n\tif (soap->version == 2 && !soap->fault->SOAP_ENV__Code)\n\t{\tsoap->fault->SOAP_ENV__Code = soap_new_SOAP_ENV__Code(soap);\n\t\tsoap_default_SOAP_ENV__Code(soap, soap->fault->SOAP_ENV__Code);\n\t}\n\tif (soap->version == 2 && !soap->fault->SOAP_ENV__Reason)\n\t{\tsoap->fault->SOAP_ENV__Reason = soap_new_SOAP_ENV__Reason(soap);\n\t\tsoap_default_SOAP_ENV__Reason(soap, soap->fault->SOAP_ENV__Reason);\n\t}\n}"); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serializefault(struct soap *soap)\n{\n\tsoap_fault(soap);\n\tif (soap->fault)\n\t\tsoap_serialize_SOAP_ENV__Fault(soap, soap->fault);\n}"); } else { fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_fault(struct soap *soap)\n{\n\tif (soap->fault == NULL)\n\t{\tsoap->fault = soap_new_SOAP_ENV__Fault(soap);\n\t\tsoap->fault->soap_default(soap);\n\t}\n\tif (soap->version == 2 && !soap->fault->SOAP_ENV__Code)\n\t{\tsoap->fault->SOAP_ENV__Code = soap_new_SOAP_ENV__Code(soap);\n\t\tsoap_default_SOAP_ENV__Code(soap, soap->fault->SOAP_ENV__Code);\n\t}\n\tif (soap->version == 2 && !soap->fault->SOAP_ENV__Reason)\n\t{\tsoap->fault->SOAP_ENV__Reason = soap_new_SOAP_ENV__Reason(soap);\n\t\tsoap_default_SOAP_ENV__Reason(soap, soap->fault->SOAP_ENV__Reason);\n\t}\n}"); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serializefault(struct soap *soap)\n{\n\tsoap_fault(soap);\n\tif (soap->fault)\n\t\tsoap->fault->soap_serialize(soap);\n}"); } if ((p = entry(classtable, lookup("SOAP_ENV__Fault"))) && p->info.typ->type == Tstruct) { fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_putfault(struct soap *soap)\n{\n\tif (soap->fault)\n\t\treturn soap_put_SOAP_ENV__Fault(soap, soap->fault, \"SOAP-ENV:Fault\", NULL);\n\treturn SOAP_OK;\n}"); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_getfault(struct soap *soap)\n{\n\treturn (soap->fault = soap_get_SOAP_ENV__Fault(soap, NULL, \"SOAP-ENV:Fault\", NULL)) == NULL;\n}"); } else { fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_putfault(struct soap *soap)\n{\n\tsoap_fault(soap);\n\tif (soap->fault)\n\t\treturn soap->fault->soap_put(soap, \"SOAP-ENV:Fault\", NULL);\n\treturn SOAP_EOM;\n}"); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_getfault(struct soap *soap)\n{\n\tsoap_fault(soap);\n\tif (soap->fault)\n\t\treturn soap->fault->soap_get(soap, \"SOAP-ENV:Fault\", NULL) == NULL;\n\treturn SOAP_EOM;\n}"); } fprintf(fhead, "\n\nSOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultcode(struct soap *soap);"); fprintf(fout, "\n\nSOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultcode(struct soap *soap)\n{\n\tsoap_fault(soap);\n\tif (soap->version == 2 && soap->fault->SOAP_ENV__Code)\n\t\treturn (const char**)(void*)&soap->fault->SOAP_ENV__Code->SOAP_ENV__Value;\n\treturn (const char**)(void*)&soap->fault->faultcode;\n}"); if (cflag) fprintf(fout, "\n\nSOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultsubcode(struct soap *soap)\n{\n\tsoap_fault(soap);\n\tif (soap->version == 2)\n\t{\tif (soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode == NULL)\n\t\t{\tsoap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode = (struct SOAP_ENV__Code*)soap_malloc(soap, sizeof(struct SOAP_ENV__Code));\n\t\t\tsoap_default_SOAP_ENV__Code(soap, soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode);\n\t\t}\n\t\treturn (const char**)(void*)&soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode->SOAP_ENV__Value;\n\t}\n\treturn (const char**)(void*)&soap->fault->faultcode;\n}"); else fprintf(fout, "\n\nSOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultsubcode(struct soap *soap)\n{\n\tsoap_fault(soap);\n\tif (soap->version == 2)\n\t{\tif (soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode == NULL)\n\t\t{\tsoap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode = soap_new_SOAP_ENV__Code(soap);\n\t\t\tsoap_default_SOAP_ENV__Code(soap, soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode);\n\t\t}\n\t\treturn (const char**)(void*)&soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode->SOAP_ENV__Value;\n\t}\n\treturn (const char**)(void*)&soap->fault->faultcode;\n}"); fprintf(fout, "\n\nSOAP_FMAC3 const char * SOAP_FMAC4 soap_check_faultsubcode(struct soap *soap)\n{\n\tsoap_fault(soap);\n\tif (soap->version == 2)\n\t{\tif (soap->fault->SOAP_ENV__Code && soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode)\n\t\t\treturn soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode->SOAP_ENV__Value;\n\t\treturn NULL;\n\t}\n\treturn soap->fault->faultcode;\n}"); fprintf(fout, "\n\nSOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultstring(struct soap *soap)\n{\n\tsoap_fault(soap);\n\tif (soap->version == 2)\n\t\treturn (const char**)(void*)&soap->fault->SOAP_ENV__Reason->SOAP_ENV__Text;\n\treturn (const char**)(void*)&soap->fault->faultstring;\n}"); fprintf(fout, "\n\nSOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultdetail(struct soap *soap)\n{\n\tsoap_fault(soap);"); if (has_Detail_string()) { if (cflag) fprintf(fout, "\n\tif (soap->version == 2)\n\t{\tif (soap->fault->SOAP_ENV__Detail == NULL)\n\t\t{\tsoap->fault->SOAP_ENV__Detail = (struct SOAP_ENV__Detail*)soap_malloc(soap, sizeof(struct SOAP_ENV__Detail));\n\t\t\tsoap_default_SOAP_ENV__Detail(soap, soap->fault->SOAP_ENV__Detail);\n\t\t}\n\t\treturn (const char**)(void*)&soap->fault->SOAP_ENV__Detail->__any;\n\t}"); else fprintf(fout, "\n\tif (soap->version == 2)\n\t{\tif (soap->fault->SOAP_ENV__Detail == NULL)\n\t\t{\tsoap->fault->SOAP_ENV__Detail = soap_new_SOAP_ENV__Detail(soap);\n\t\t\tsoap_default_SOAP_ENV__Detail(soap, soap->fault->SOAP_ENV__Detail);\n\t\t}\n\t\treturn (const char**)(void*)&soap->fault->SOAP_ENV__Detail->__any;\n\t}"); } if (has_detail_string()) { if (cflag) fprintf(fout, "\n\tif (soap->fault->detail == NULL)\n\t{\tsoap->fault->detail = (struct SOAP_ENV__Detail*)soap_malloc(soap, sizeof(struct SOAP_ENV__Detail));\n\t\tsoap_default_SOAP_ENV__Detail(soap, soap->fault->detail);\n\t}\n\treturn (const char**)(void*)&soap->fault->detail->__any;\n}"); else fprintf(fout, "\n\tif (soap->fault->detail == NULL)\n\t{\tsoap->fault->detail = soap_new_SOAP_ENV__Detail(soap);\n\t\tsoap_default_SOAP_ENV__Detail(soap, soap->fault->detail);\n\t}\n\treturn (const char**)(void*)&soap->fault->detail->__any;\n}"); } if (!has_detail_string() && !has_Detail_string()) fprintf(fout, "\n\treturn NULL;\n}"); fprintf(fout, "\n\nSOAP_FMAC3 const char * SOAP_FMAC4 soap_check_faultdetail(struct soap *soap)\n{\n\tsoap_fault(soap);"); if (has_Detail_string()) fprintf(fout, "\n\tif (soap->version == 2 && soap->fault->SOAP_ENV__Detail)\n\t\treturn soap->fault->SOAP_ENV__Detail->__any;"); if (has_detail_string()) fprintf(fout, "\n\tif (soap->fault->detail)\n\t\treturn soap->fault->detail->__any;"); fprintf(fout, "\n\treturn NULL;\n}"); fprintf(fout, "\n\n#endif"); fprintf(fout, "\n\n#ifndef WITH_NOIDREF"); fprintf(fout, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_getindependent(struct soap *soap)\n{"); fprintf(fout, "\n\tint t;\n\tif (soap->version == 1)\n\t{\tfor (;;)\n\t\t{\tif (!soap_getelement(soap, &t))\n\t\t\t\tif ((soap->error && soap->error != SOAP_TAG_MISMATCH) || soap_ignore_element(soap))\n\t\t\t\t\tbreak;\n\t\t}\n\t}"); fprintf(fout, "\n\tif (soap->error == SOAP_NO_TAG || soap->error == SOAP_EOF)"); fprintf(fout, "\n\t\tsoap->error = SOAP_OK;"); fprintf(fout, "\n\treturn soap->error;"); fprintf(fout, "\n}\n#endif"); if (!cflag && !namespaceid) fprintf(fout, "\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif"); fprintf(fout, "\nSOAP_FMAC3 void * SOAP_FMAC4 soap_getelement(struct soap *soap, int *type)\n{\t(void)type;"); fprintf(fout, "\n\tif (soap_peek_element(soap))\n\t\treturn NULL;"); fprintf(fout, "\n#ifndef WITH_NOIDREF\n\tif (!*soap->id || !(*type = soap_lookup_type(soap, soap->id)))\n\t\t*type = soap_lookup_type(soap, soap->href);"); fprintf(fout, "\n\tswitch (*type)\n\t{"); DBGLOG(fprintf(stderr, "\n Calling in_defs( ).")); fflush(fout); in_defs(); DBGLOG(fprintf(stderr, "\n Completed in_defs( ).")); fprintf(fout, "\n\tdefault:\n#else\n\t*type = 0;\n#endif"); fprintf(fout, "\n\t{\tconst char *t = soap->type;\n\t\tif (!*t)\n\t\t\tt = soap->tag;"); fflush(fout); in_defs2(); fprintf(fout, "\n\t\tt = soap->tag;"); in_defs3(); fprintf(fout, "\n#ifndef WITH_NOIDREF\n\t}\n#endif\n\t}\n\tsoap->error = SOAP_TAG_MISMATCH;\n\treturn NULL;\n}"); if (!cflag && !namespaceid) fprintf(fout, "\n\n#ifdef __cplusplus\n}\n#endif"); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_ignore_element(struct soap *soap)\n{"); fprintf(fout, "\n\tif (!soap_peek_element(soap))"); fprintf(fout, "\n\t{\tint t;"); fprintf(fout, "\n\t\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"Unexpected element '%%s' in input (level = %%u, %%d)\\n\", soap->tag, soap->level, soap->body));"); fprintf(fout, "\n\t\tif (soap->mustUnderstand && !soap->other)"); fprintf(fout, "\n\t\t\treturn soap->error = SOAP_MUSTUNDERSTAND;"); /* old code: without option -s required SOAP_XML_STRICT to detect and flag extra elements; fprintf(fout, "\n\t\tif (((soap->mode & SOAP_XML_STRICT) && soap->part != SOAP_IN_HEADER) || !soap_match_tag(soap, soap->tag, \"SOAP-ENV:\"))\n\t\t{\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"REJECTING element '%%s'\\n\", soap->tag));\n\t\t\treturn soap->error = SOAP_TAG_MISMATCH;\n\t\t}"); */ fprintf(fout, "\n\t\tif ((%ssoap->part != SOAP_IN_HEADER) || !soap_match_tag(soap, soap->tag, \"SOAP-ENV:\"))\n\t\t{\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"REJECTING element '%%s'\\n\", soap->tag));\n\t\t\treturn soap->error = SOAP_TAG_MISMATCH;\n\t\t}", strict_check()); fprintf(fout, "\n\t\tif (!*soap->id || !soap_getelement(soap, &t))"); fprintf(fout, "\n\t\t{\tsoap->peeked = 0;"); fprintf(fout, "\n\t\t\tif (soap->fignore)\n\t\t\t\tsoap->error = soap->fignore(soap, soap->tag);\n\t\t\telse\n\t\t\t\tsoap->error = SOAP_OK;"); fprintf(fout, "\n\t\t\tDBGLOG(TEST, if (!soap->error) SOAP_MESSAGE(fdebug, \"IGNORING element '%%s'\\n\", soap->tag));"); fprintf(fout, "\n\t\t\tif (!soap->error && soap->body)"); fprintf(fout, "\n\t\t\t{\tsoap->level++;"); fprintf(fout, "\n\t\t\t\twhile (!soap_ignore_element(soap))"); fprintf(fout, "\n\t\t\t\t\t;"); fprintf(fout, "\n\t\t\t\tif (soap->error == SOAP_NO_TAG)"); fprintf(fout, "\n\t\t\t\t\tsoap->error = soap_element_end_in(soap, NULL);"); fprintf(fout, "\n\t\t\t}"); fprintf(fout, "\n\t\t}"); fprintf(fout, "\n\t}"); fprintf(fout, "\n\treturn soap->error;"); fprintf(fout, "\n}"); fprintf(fout, "\n\n#ifndef WITH_NOIDREF"); fprintf(fout, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_putindependent(struct soap *soap)\n{\n\tint i;\n\tstruct soap_plist *pp;"); fprintf(fout, "\n\tif (soap->version == 1 && soap->encodingStyle && !(soap->mode & (SOAP_XML_TREE | SOAP_XML_GRAPH)))"); fprintf(fout, "\n\t\tfor (i = 0; i < SOAP_PTRHASH; i++)"); fprintf(fout, "\n\t\t\tfor (pp = soap->pht[i]; pp; pp = pp->next)"); fprintf(fout, "\n\t\t\t\tif (pp->mark1 == 2 || pp->mark2 == 2)"); fprintf(fout, "\n\t\t\t\t\tif (soap_putelement(soap, pp->ptr, SOAP_MULTIREFTAG, pp->id, pp->type))\n\t\t\t\t\t\treturn soap->error;"); fprintf(fout, "\n\treturn SOAP_OK;\n}\n#endif"); if (!cflag && !namespaceid) fprintf(fout, "\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif"); fprintf(fout, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_putelement(struct soap *soap, const void *ptr, const char *tag, int id, int type)\n{\t(void)tag;"); fprintf(fout, "\n\tswitch (type)\n\t{"); fflush(fout); out_defs(); fprintf(fout, "\n\t}\n\treturn SOAP_OK;\n}"); if (!cflag && !namespaceid) fprintf(fout, "\n#ifdef __cplusplus\n}\n#endif"); fprintf(fout, "\n\n#ifndef WITH_NOIDREF"); if (!cflag && !namespaceid) fprintf(fout, "\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif"); if (is_anytype_flag) { fprintf(fout, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_markelement(struct soap *soap, const void *ptr, int type)\n{"); fprintf(fout, "\n\t(void)soap; (void)ptr; (void)type; /* appease -Wall -Werror */"); fprintf(fout, "\n\tswitch (type)\n\t{"); fflush(fout); mark_defs(); fprintf(fout, "\n\t}\n}"); } else { fprintf(fout, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_markelement(struct soap *soap, const void *ptr, int type)\n{"); fprintf(fout, "\n\t(void)soap; (void)ptr; (void)type; /* appease -Wall -Werror */"); fprintf(fout, "\n}"); } if (!cflag && !namespaceid) fprintf(fout, "\n#ifdef __cplusplus\n}\n#endif"); fprintf(fout, "\n#endif"); if (Ecflag) { if (!cflag && !namespaceid) fprintf(fout, "\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif"); fprintf(fout, "\n\nSOAP_FMAC3 void * SOAP_FMAC4 soap_dupelement(struct soap *soap, const void *ptr, int type)\n{"); fprintf(fout, "\n\tswitch (type)\n\t{"); fflush(fout); dup_defs(); fprintf(fout, "\n\t}\n\treturn NULL;\n}"); if (!cflag && !namespaceid) fprintf(fout, "\n#ifdef __cplusplus\n}\n#endif"); } if (Edflag) { if (!cflag && !namespaceid) fprintf(fout, "\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif"); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_delelement(const void *ptr, int type)\n{"); fprintf(fout, "\n\tswitch (type)\n\t{"); fflush(fout); del_defs(); fprintf(fout, "\n\t}\n}"); if (!cflag && !namespaceid) fprintf(fout, "\n#ifdef __cplusplus\n}\n#endif"); } } if (!cflag) { fprintf(fhead, "\nSOAP_FMAC3 void * SOAP_FMAC4 %s_instantiate(struct soap*, int, const char*, const char*, size_t*);", prefix); fprintf(fout, "\n\nSOAP_FMAC3 void * SOAP_FMAC4 %s_instantiate(struct soap *soap, int t, const char *type, const char *arrayType, size_t *n)\n{\t(void)type;\n\tswitch (t)\n\t{", prefix); if (classtable) { for (p = classtable->list; p; p = p->next) { if ((p->info.typ->type == Tclass || p->info.typ->type == Tstruct) && !is_transient(p->info.typ)) { if (is_header_or_fault(p->info.typ) || is_body(p->info.typ)) fprintf(fout, "\n#ifndef WITH_NOGLOBAL"); fprintf(fout, "\n\tcase %s:\n\t\treturn (void*)soap_instantiate_%s(soap, -1, type, arrayType, n);", soap_type(p->info.typ), c_ident(p->info.typ)); if (is_header_or_fault(p->info.typ) || is_body(p->info.typ)) fprintf(fout, "\n#endif"); } } } if (typetable) { for (p = typetable->list; p; p = p->next) { if ((p->info.typ->type == Tclass || p->info.typ->type == Tstruct) && !is_transient(p->info.typ)) { if (is_header_or_fault(p->info.typ) || is_body(p->info.typ)) fprintf(fout, "\n#ifndef WITH_NOGLOBAL"); fprintf(fout, "\n\tcase %s:\n\t\treturn (void*)soap_instantiate_%s(soap, -1, type, arrayType, n);", soap_type(p->info.typ), c_ident(p->info.typ)); if (is_header_or_fault(p->info.typ) || is_body(p->info.typ)) fprintf(fout, "\n#endif"); } } } for (typ = Tptr[Ttemplate]; typ; typ = typ->next) if (typ->ref && !is_transient(typ)) fprintf(fout, "\n\tcase %s:\n\t\treturn (void*)soap_instantiate_%s(soap, -1, type, arrayType, n);", soap_type(typ), c_ident(typ)); fprintf(fout, "\n\t}\n\treturn NULL;\n}"); fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 %s_fdelete(struct soap_clist*);", prefix); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 %s_fdelete(struct soap_clist *p)", prefix); fprintf(fout, "\n{\tswitch (p->type)\n\t{"); if (classtable) { for (p = classtable->list; p; p = p->next) { if ((p->info.typ->type == Tclass || p->info.typ->type == Tstruct) && !is_transient(p->info.typ)) { if (is_header_or_fault(p->info.typ) || is_body(p->info.typ)) fprintf(fout, "\n#ifndef WITH_NOGLOBAL"); fprintf(fout, "\n\tcase %s:", soap_type(p->info.typ)); fprintf(fout, "\n\t\tif (p->size < 0)\n\t\t\tSOAP_DELETE(static_cast<%s*>(p->ptr));\n\t\telse\n\t\t\tSOAP_DELETE_ARRAY(static_cast<%s*>(p->ptr));\n\t\tbreak;", c_type(p->info.typ), c_type(p->info.typ)); if (is_header_or_fault(p->info.typ) || is_body(p->info.typ)) fprintf(fout, "\n#endif"); } } } if (typetable) { for (p = typetable->list; p; p = p->next) if (p->info.typ->type == Tclass || p->info.typ->type == Tstruct) /* && is_external(p->info.typ)) */ { if (is_header_or_fault(p->info.typ) || is_body(p->info.typ)) fprintf(fout, "\n#ifndef WITH_NOGLOBAL"); fprintf(fout, "\n\tcase %s:", soap_type(p->info.typ)); fprintf(fout, "\n\t\tif (p->size < 0)\n\t\t\tSOAP_DELETE(static_cast<%s*>(p->ptr));\n\t\telse\n\t\t\tSOAP_DELETE_ARRAY(static_cast<%s*>(p->ptr));\n\t\tbreak;", c_type(p->info.typ), c_type(p->info.typ)); if (is_header_or_fault(p->info.typ) || is_body(p->info.typ)) fprintf(fout, "\n#endif"); } } for (typ = Tptr[Ttemplate]; typ; typ = typ->next) { if (typ->ref && !is_transient(typ)) { fprintf(fout, "\n\tcase %s:", soap_type(typ)); fprintf(fout, "\n\t\tif (p->size < 0)\n\t\t\tSOAP_DELETE(static_cast<%s*>(p->ptr));\n\t\telse\n\t\t\tSOAP_DELETE_ARRAY(static_cast<%s*>(p->ptr));\n\t\tbreak;", c_type(typ), c_type(typ)); } } fprintf(fout, "\n\tdefault:\n\t\treturn SOAP_ERR;"); fprintf(fout, "\n\t}\n\treturn SOAP_OK;"); fprintf(fout, "\n}"); fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 %s_fbase(int, int);", prefix); fprintf(fout, "\n\n#ifdef WIN32\n#pragma warning(push)\n// do not warn on switch w/o cases\n#pragma warning(disable:4065)\n#endif"); fprintf(fout, "\nSOAP_FMAC3 int SOAP_FMAC4 %s_fbase(int t, int b)", prefix); fprintf(fout, "\n{\n\tdo\n\t{\tswitch (t)\n\t\t{"); if (classtable) { for (p = classtable->list; p; p = p->next) { if ((p->info.typ->type == Tclass || p->info.typ->type == Tstruct) && p->info.typ->base && !is_transient(p->info.typ)) { Entry *e = entry(classtable, p->info.typ->base); if (e && !is_transient(e->info.typ)) fprintf(fout, "\n\t\tcase %s: t = %s; break;", soap_type(p->info.typ), soap_type(e->info.typ)); } } } fprintf(fout, "\n\t\tdefault: return 0;\n\t\t}\n\t}\n\twhile (t != b);\n\treturn 1;\n}"); fprintf(fout, "\n#ifdef WIN32\n#pragma warning(pop)\n#endif"); if (Tptr[Ttemplate] || classtable) { fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 %s_finsert(struct soap*, int, int, void*, size_t, const void*, void**);", prefix); if (!lflag) { fprintf(fout, "\n\n#ifndef WITH_NOIDREF"); fprintf(fout, "\n#ifdef WIN32\n#pragma warning(push)\n// do not warn on switch w/o cases\n#pragma warning(disable:4065)\n#endif"); fprintf(fout, "\nSOAP_FMAC3 void SOAP_FMAC4 %s_finsert(struct soap *soap, int t, int tt, void *p, size_t index, const void *q, void **x)", prefix); fprintf(fout, "\n{\n\t(void)soap; (void)t; (void)p; (void)index; (void)q; (void)x; /* appease -Wall -Werror */"); fprintf(fout, "\n\tswitch (tt)\n\t{"); for (typ = Tptr[Ttemplate]; typ; typ = typ->next) { if (typ->ref && !is_transient(typ)) { fprintf(fout, "\n\tcase %s:", soap_type(typ)); if (is_smart(typ)) { if (is_smart_shared(typ)) { fprintf(fout, "\n\t\tif (t == %s)\n\t\t{\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"Smart pointer %s type=%%d location=%%p object=%%p\\n\", t, p, q));\n\t\t\tif (!*x)\n\t\t\t\t*(%s)(*x = (void*)p) = %s<%s>(**(%s)q);", soap_type(reftype(typ->ref)), c_type(typ), c_type_id(typ, "*"), make_shared(typ), c_type(typ->ref), c_type_id(typ->ref, "**")); fprintf(fout, "\n\t\t\telse\n\t\t\t\t*(%s)p = *(%s)(*x);", c_type_id(typ, "*"), c_type_id(typ, "*")); } else { fprintf(fout, "\n\t\tif (t == %s)\n\t\t{\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"Smart pointer %s type=%%d location=%%p object=%%p\\n\", t, p, q));", soap_type(reftype(typ->ref)), c_type(typ)); fprintf(fout, "\n\t\t\t*(*(%s)p = %s(SOAP_NEW(%s))) = **(%s)q;", c_type_id(typ, "*"), c_type(typ), c_type(typ->ref), c_type_id(typ->ref, "**")); } } else { Tnode *ref = (Tnode*)typ->ref; if (is_smart(ref) && strcmp(typ->id->name, "std::set")) { fprintf(fout, "\n\t\tif (t == %s)\n\t\t{\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"Container %s insert type=%%d in %%d location=%%p object=%%p at index=%%lu\\n\", t, tt, p, q, (unsigned long)index));", soap_type(reftype(ref)), c_type(typ)); if (!strcmp(ref->id->name, "std::vector") || !strcmp(ref->id->name, "std::deque")) fprintf(fout, "\n\t\t\t%s::iterator i = ((%s)p)->begin() + index;", c_type(typ), c_type_id(typ, "*")); else fprintf(fout, "\n\t\t\t%s::iterator i = ((%s)p)->begin();\n\t\t\twhile (index--)\n\t\t\t\t++i;", c_type(typ), c_type_id(typ, "*")); if (is_smart_shared(ref)) fprintf(fout, "\n\t\t\tif (!*x)\n\t\t\t\t*(%s)(*x = &*i) = %s<%s>(**(%s)q);\n\t\t\telse\n\t\t\t\t*i = *(%s)*x;", c_type_id(ref, "*"), make_shared(ref), c_type(ref->ref), c_type_id(ref->ref, "**"), c_type_id(ref, "*")); else fprintf(fout, "\n\t\t\t*(*i = %s(SOAP_NEW(%s))) = **(%s)q;", c_type(ref), c_type(ref->ref), c_type_id(ref->ref, "**")); } else { fprintf(fout, "\n\t\tif (t == %s)\n\t\t{\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"Container %s insert type=%%d in %%d location=%%p object=%%p at index=%%lu\\n\", t, tt, p, q, (unsigned long)index));", soap_type(reftype(ref)), c_type(typ)); if (!strcmp(typ->id->name, "std::vector") || !strcmp(typ->id->name, "std::deque")) fprintf(fout, "\n\t\t\t(*(%s)p)[index] = *(%s)q;", c_type_id(typ, "*"), c_type_id(ref, "*")); else if (!strcmp(typ->id->name, "std::set")) fprintf(fout, "\n\t\t\t((%s)p)->insert(*(%s)q);", c_type_id(typ, "*"), c_type_id(ref, "*")); else fprintf(fout, "\n\t\t\t%s::iterator i = ((%s)p)->begin();\n\t\t\twhile (index--)\n\t\t\t\t++i;\n\t\t\t*i = *(%s)q;", c_type(typ), c_type_id(typ, "*"), c_type_id(ref, "*")); } } fprintf(fout, "\n\t\t}\n\t\tbreak;"); } } if (classtable) { for (p = classtable->list; p; p = p->next) { if (!is_transient(p->info.typ)) { if (is_header_or_fault(p->info.typ) || is_body(p->info.typ)) fprintf(fout, "\n#ifndef WITH_NOGLOBAL"); fprintf(fout, "\n\tcase %s:", soap_type(p->info.typ)); fprintf(fout, "\n\t\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"Copy %s type=%%d location=%%p object=%%p\\n\", t, p, q));", c_type(p->info.typ)); fprintf(fout, "\n\t\t*(%s*)p = *(%s*)q;\n\t\tbreak;", c_type(p->info.typ), c_type(p->info.typ)); if (is_header_or_fault(p->info.typ) || is_body(p->info.typ)) fprintf(fout, "\n#endif"); } } } if (typetable) { for (p = typetable->list; p; p = p->next) { if ((p->info.typ->type == Tclass || p->info.typ->type == Tstruct) && !is_transient(p->info.typ)) { if (is_header_or_fault(p->info.typ) || is_body(p->info.typ)) fprintf(fout, "\n#ifndef WITH_NOGLOBAL"); fprintf(fout, "\n\tcase %s:", soap_type(p->info.typ)); fprintf(fout, "\n\t\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"Copy %s type=%%d location=%%p object=%%p\\n\", t, p, q));", c_type(p->info.typ)); fprintf(fout, "\n\t\t*(%s*)p = *(%s*)q;\n\t\tbreak;", c_type(p->info.typ), c_type(p->info.typ)); if (is_header_or_fault(p->info.typ) || is_body(p->info.typ)) fprintf(fout, "\n#endif"); } } } fprintf(fout, "\n\tdefault:\n\t\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"Could not insert type = %%d in %%d\\n\", t, tt));"); fprintf(fout, "\n\t}"); fprintf(fout, "\n}"); fprintf(fout, "\n#ifdef WIN32\n#pragma warning(pop)\n#endif"); fprintf(fout, "\n#endif"); } } } } generate_defs(); if (namespaceid) fprintf(fout, "\n\n} // namespace %s\n", namespaceid); if (cflag) fprintf(fout, "\n\n#ifdef __cplusplus\n}\n#endif"); fprintf(fout, "\n\n#if defined(__BORLANDC__)"); fprintf(fout, "\n#pragma option pop"); fprintf(fout, "\n#pragma option pop"); fprintf(fout, "\n#endif"); fprintf(fout, "\n\n/* End of %s */\n", soapC); fclose(fout); } if (namespaceid) fprintf(fhead, "\n\n} // namespace %s\n", namespaceid); if (cflag) fprintf(fhead, "\n\n#ifdef __cplusplus\n}\n#endif"); fprintf(fhead, "\n\n#endif"); fprintf(fhead, "\n\n/* End of %s */\n", soapH); fclose(fhead); if (namespaceid) fprintf(fheader, "\n\n} // namespace %s\n", namespaceid); if (cflag) fprintf(fheader, "\n\n#ifdef __cplusplus\n}\n#endif"); fprintf(fheader, "\n\n#endif"); fprintf(fheader, "\n\n/* End of %s */\n", soapStub); fclose(fheader); if (mflag) { DBGLOG(fprintf(stderr, "\n Calling matlab_def_table( ).")); matlab_def_table(table); DBGLOG(fprintf(stderr, "\n Completed matlab_def_table( ).")); fclose(fmatlab); fclose(fmheader); } if (!Sflag && !iflag && !jflag) { if (namespaceid) fprintf(fclient, "\n\n} // namespace %s\n", namespaceid); if (cflag) fprintf(fclient, "\n\n#ifdef __cplusplus\n}\n#endif"); fprintf(fclient, "\n\n#if defined(__BORLANDC__)"); fprintf(fclient, "\n#pragma option pop"); fprintf(fclient, "\n#pragma option pop"); fprintf(fclient, "\n#endif"); fprintf(fclient, "\n\n/* End of %s */\n", soapClient); fclose(fclient); } if (!Cflag && !iflag && !jflag) { if (namespaceid) fprintf(fserver, "\n\n} // namespace %s\n", namespaceid); if (cflag) fprintf(fserver, "\n\n#ifdef __cplusplus\n}\n#endif"); fprintf(fserver, "\n\n#if defined(__BORLANDC__)"); fprintf(fserver, "\n#pragma option pop"); fprintf(fserver, "\n#pragma option pop"); fprintf(fserver, "\n#endif"); fprintf(fserver, "\n\n/* End of %s */\n", soapServer); fclose(fserver); } } void gen_class(FILE *fd, Entry *p) { Entry *Eptr; Tnode *typ = p->info.typ; const char *x; if (!typ->ref) { if (!is_transient(typ) && !is_external(typ) && !is_volatile(typ)) { sprintf(errbuf, "%s declared in %s:%d has no content", c_type(typ), p->filename, p->lineno); semwarn(errbuf); } return; } x = xsi_type(typ); if (!x || !*x) x = wsdl_type(typ, ""); fprintf(fd, "\n\n/* %s:%d */", p->filename, p->lineno); if (is_header_or_fault(typ) || is_body(typ)) fprintf(fd, "\n#ifndef WITH_NOGLOBAL"); fprintf(fd, "\n#ifndef %s", soap_type(typ)); fprintf(fd, "\n#define %s (%d)\n", soap_type(typ), typ->num); if (typ->recursive) fprintf(fd, "/* Type %s is a recursive data type (in)directly referencing itself through its (base) class members */\n", typ->id->name); if (is_volatile(typ)) fprintf(fd, "#if 0 /* Volatile: not declared here because it is declared already in a library or in other parts of the user's project */\n"); else if (is_transient(typ)) fprintf(fd, "/* Transient type: */\n"); else if (is_invisible(typ->id->name)) fprintf(fd, "/* Operation wrapper: */\n"); else if (is_hexBinary(typ)) fprintf(fd, "/* hexBinary schema type: */\n"); else if (is_binary(typ)) fprintf(fd, "/* base64Binary schema type: */\n"); else if (is_discriminant(typ)) fprintf(fd, "/* Choice: */\n"); else if (is_dynamic_array(typ)) { Eptr = ((Table*)typ->ref)->list; if (has_ns(typ) || is_untyped(typ)) fprintf(fd, "/* Sequence of %s schema type: */\n", x); else { if (!eflag && soap_version >= 0) { sprintf(errbuf, "using SOAP encoded array '%s' is not compliant with WS-I Basic Profile 1.0a", c_type(typ)); compliancewarn(errbuf); } fprintf(fd, "/* SOAP encoded array of %s schema type: */\n", x); } } else if (is_primclass(typ)) fprintf(fd, "/* %s simple type: */\n", x); else if (!strcmp(typ->id->name, "SOAP_ENV__Header")) fprintf(fd, "/* SOAP Header: */\n"); else if (!strcmp(typ->id->name, "SOAP_ENV__Fault")) fprintf(fd, "/* SOAP Fault: */\n"); else if (!strcmp(typ->id->name, "SOAP_ENV__Code")) fprintf(fd, "/* SOAP Fault Code: */\n"); else if (x && *x) fprintf(fd, "/* %s complex type: */\n", x); fflush(fd); if (typ->type == Tstruct) { int permission = -1; int flag = 0; DBGLOG(fprintf(stderr, "\nstruct %s\n", typ->id->name)); fprintf(fd, "struct %s\n{", ident(typ->id->name)); for (Eptr = ((Table*)typ->ref)->list; Eptr; Eptr = Eptr->next) { if (!cflag && permission != (Eptr->info.sto & (Sprivate | Sprotected))) { if (Eptr->info.sto & Sprivate) fprintf(fd, "\nprivate:"); else if (Eptr->info.sto & Sprotected) fprintf(fd, "\nprotected:"); else fprintf(fd, "\npublic:"); permission = (Eptr->info.sto & (Sprivate | Sprotected)); } if (cflag && Eptr->info.typ->type == Tfun) continue; if (cflag && (Eptr->info.sto & Stypedef)) continue; fprintf(fd, "\n\t%s", c_storage(Eptr->info.sto)); /*if (Eptr->info.typ->type == Tclass && !is_external(Eptr->info.typ) && Eptr->info.typ->classed == False || (Eptr->info.typ->type == Tpointer || Eptr->info.typ->type == Treference || Eptr->info.typ->type == Trvalueref) && Eptr->info.typ->ref && ((Tnode*)Eptr->info.typ->ref)->type == Tclass && !is_external(Eptr->info.typ->ref) && ((Tnode*)Eptr->info.typ->ref)->classed == False) fprintf(fd, "class "); */ if (Eptr->sym == typ->id && Eptr->info.typ->type == Tfun) /* to emit constructor in a struct: constructor has no return value */ ((FNinfo*)Eptr->info.typ->ref)->ret = mknone(); fprintf(fd, "%s", c_type_id(Eptr->info.typ, Eptr->sym->name)); if (Eptr->info.sto & Sconstobj) fprintf(fd, " const"); if (Eptr->info.sto & Sfinal) fprintf(fd, " final"); if (Eptr->info.sto & Soverride) fprintf(fd, " override"); if (Eptr->info.sto & Sconst) fprintf(fd, "%s;", c_init(Eptr)); else fprintf(fd, ";"); if (Eptr->info.sto & Sreturn) fprintf(fd, "\t/* SOAP 1.2 RPC return element (when namespace qualified) */"); if (is_external(Eptr->info.typ)) fprintf(fd, "\t/* external (custom serializer) */"); if (is_transient(Eptr->info.typ)) fprintf(fd, "\t/* transient (not serialized) */"); if (is_imported(Eptr->info.typ)) fprintf(fd, "\t/* type imported from %s */", Eptr->info.typ->imported); if (Eptr->info.sto & Sattribute) { if (Eptr->info.minOccurs >= 1) fprintf(fd, "\t/* required attribute of XSD type %s */", wsdl_type(Eptr->info.typ, "")); else fprintf(fd, "\t/* optional attribute of XSD type %s */", wsdl_type(Eptr->info.typ, "")); } if (flag) flag = 0; else if (Eptr->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fd, "\t/* not serialized */"); else if (Eptr->info.sto & SmustUnderstand) fprintf(fd, "\t/* mustUnderstand */"); else if (!is_dynamic_array(typ) && is_repetition(Eptr)) { if (Eptr->info.maxOccurs > 1) fprintf(fd, "\t/* sequence of " SOAP_LONG_FORMAT " to " SOAP_LONG_FORMAT " elements <%s> of XSD type %s */", Eptr->info.minOccurs, Eptr->info.maxOccurs, ns_convert(Eptr->next->sym->name), wsdl_type(Eptr->next->info.typ, "")); else fprintf(fd, "\t/* sequence of elements <%s> of XSD type %s */", ns_convert(Eptr->next->sym->name), wsdl_type(Eptr->next->info.typ, "")); flag = 1; } else if (is_anytype(Eptr)) { fprintf(fd, "\t/* any type of element <%s> (defined below)\n\t WARNING: do not create a cyclic data structure graph throught this element unless SOAP encoding or SOAP_XML_GRAPH are used for id-ref serialization */", ns_convert(Eptr->next->sym->name)); flag = 1; } else if (is_choice(Eptr)) { fprintf(fd, "\t/* union discriminant (of union defined below) */"); flag = 1; } else if (is_anyType(Eptr->info.typ)) fprintf(fd, "\t/* DOM content */"); else if (is_item(Eptr)) fprintf(fd, "\t/* mixed XML content */"); else if (Eptr->info.typ->type != Tfun && Eptr->info.typ->type != Tunion && !(Eptr->info.sto & (Sconst | Sprivate | Sprotected)) && !(Eptr->info.sto & Sattribute) && !is_transient(Eptr->info.typ) && !is_external(Eptr->info.typ) && strncmp(Eptr->sym->name, "__", 2)) { if (Eptr->info.maxOccurs > 1) fprintf(fd, "\t/* sequence of " SOAP_LONG_FORMAT " to " SOAP_LONG_FORMAT " elements of XSD type %s */", Eptr->info.minOccurs, Eptr->info.maxOccurs, wsdl_type(Eptr->info.typ, "")); else if (Eptr->info.minOccurs >= 1) fprintf(fd, "\t/* required element of XSD type %s */", wsdl_type(Eptr->info.typ, "")); else fprintf(fd, "\t/* optional element of XSD type %s */", wsdl_type(Eptr->info.typ, "")); } if (!is_dynamic_array(typ) && !is_primclass(typ)) { if ((Eptr->info.typ->type == Tint || Eptr->info.typ->type == Tsize) && !strncmp(Eptr->sym->name, "__size", 6)) { if (!Eptr->next || (Eptr->next->info.typ->type != Tpointer && !is_smart(Eptr->next->info.typ))) { sprintf(errbuf, "Member field '%s' is not followed by a pointer member field in struct '%s'", Eptr->sym->name, typ->id->name); semwarn(errbuf); } } else if (Eptr->info.typ->type == Tint && !strncmp(Eptr->sym->name, "__type", 6)) { if (!Eptr->next || ((Eptr->next->info.typ->type != Tpointer || ((Tnode*)Eptr->next->info.typ->ref)->type != Tvoid))) { sprintf(errbuf, "Member field '%s' is not followed by a void pointer member field in struct '%s'", Eptr->sym->name, typ->id->name); semwarn(errbuf); } } else if (Eptr->info.typ->type == Tint && !strncmp(Eptr->sym->name, "__union", 7)) { if (!Eptr->next || ((Eptr->next->info.typ->type != Tunion))) { sprintf(errbuf, "Member field '%s' is not followed by a union member field in struct '%s'", Eptr->sym->name, typ->id->name); semwarn(errbuf); } } else if ((Eptr->info.typ->type == Tint || Eptr->info.typ->type == Tsize) && (Eptr->info.sto & Sspecial)) { if (!Eptr->next || (Eptr->next->info.typ->type != Tpointer && !is_smart(Eptr->next->info.typ) && (Eptr->next->info.typ->type != Tunion))) { sprintf(errbuf, "Member field '%s' is not followed by a pointer or union member field in struct '%s'", Eptr->sym->name, typ->id->name); semwarn(errbuf); } } } } if (!cflag && !is_transient(typ) && !is_volatile(typ)) { fprintf(fd, "\npublic:\n\tint soap_type() const { return %d; } /* = unique type id %s */", typ->num, soap_type(typ)); if ((x = union_member(typ))) { sprintf(errbuf, "struct '%s' cannot be assigned a default constructor because it is used as a member of union '%s'", typ->id->name, ident(x)); semwarn(errbuf); } else { if (!has_constructor(typ)) { Table *t; Entry *p; fprintf(fd, "\n\t %s();", ident(typ->id->name)); for (t = (Table*)typ->ref; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.typ->type == Treference || p->info.typ->type == Trvalueref) { sprintf(errbuf, "no constructor for '%s' to explicitly initialize the reference member '%s'", typ->id->name, p->sym->name); semwarn(errbuf); } } } } /* not necessary to add a default destructor, C -> C++ transparency of structs if (!has_destructor(typ)) fprintf(fd, "\n\t ~%s() { }", ident(typ->id->name)); */ } if (Ecflag) fprintf(fd, "\n\tfriend SOAP_FMAC1 %s * SOAP_FMAC2 soap_dup_%s(struct soap*, %s*, %s);", c_type(typ), c_ident(typ), c_type(typ), c_type_constptr_id(typ, "const*")); if (Edflag) fprintf(fd, "\n\tfriend SOAP_FMAC1 void SOAP_FMAC2 soap_del_%s(%s);", c_ident(typ), c_type_constptr_id(typ, "const*")); fprintf(fd, "\n\tfriend SOAP_FMAC1 %s * SOAP_FMAC2 soap_instantiate_%s(struct soap*, int, const char*, const char*, size_t*);", c_ident(typ), c_ident(typ)); } if (!((Table*)typ->ref)->list) { if (cflag) fprintf(fd, "\n#ifdef WITH_NOEMPTYSTRUCT\n\tchar dummy;\t/* empty struct is a GNU extension */\n#endif"); } fprintf(fd, "\n};"); } else if (typ->type == Tclass) { int permission = -1; int flag = 0; DBGLOG(fprintf(stderr, "\nclass %s\n", typ->id->name)); fprintf(fd, "class SOAP_CMAC %s", ident(typ->id->name)); if (typ->base) fprintf(fd, " : public %s", ident(typ->base->name)); fprintf(fd, "\n{"); for (Eptr = ((Table*)typ->ref)->list; Eptr; Eptr = Eptr->next) { if (permission != (Eptr->info.sto & (Sprivate | Sprotected))) { if (Eptr->info.sto & Sprivate) fprintf(fd, "\nprivate:"); else if (Eptr->info.sto & Sprotected) fprintf(fd, "\nprotected:"); else fprintf(fd, "\npublic:"); permission = (Eptr->info.sto & (Sprivate | Sprotected)); } fprintf(fd, "\n\t%s", c_storage(Eptr->info.sto)); /* if (Eptr->info.typ->type == Tclass && !is_external(Eptr->info.typ) && Eptr->info.typ->classed == False || (Eptr->info.typ->type == Tpointer || Eptr->info.typ->type == Treference || Eptr->info.typ->type == Trvalueref) && Eptr->info.typ->ref && ((Tnode*)Eptr->info.typ->ref)->type == Tclass && !is_external(Eptr->info.typ->ref) && ((Tnode*)Eptr->info.typ->ref)->classed == False) fprintf(fd, "class "); */ fprintf(fd, "%s", c_type_id(Eptr->info.typ, Eptr->sym->name)); if (Eptr->info.sto & Sconstobj) fprintf(fd, " const"); if (Eptr->info.sto & Sfinal) fprintf(fd, " final"); if (Eptr->info.sto & Soverride) fprintf(fd, " override"); if (Eptr->info.sto & Sabstract) fprintf(fd, " = 0;"); else if (Eptr->info.sto & Sconst) fprintf(fd, "%s;", c_init(Eptr)); else fprintf(fd, ";"); if (Eptr->info.sto & Sreturn) fprintf(fd, "\t/* SOAP 1.2 RPC return element (when namespace qualified) */"); if (is_external(Eptr->info.typ)) fprintf(fd, "\t/* external (custom serializer) */"); if (Eptr->info.typ->type != Tfun && is_transient(Eptr->info.typ)) fprintf(fd, "\t/* transient (not serialized) */"); if (is_imported(Eptr->info.typ)) fprintf(fd, "\t/* type imported from %s */", Eptr->info.typ->imported); if (Eptr->info.sto & Sattribute) { if (Eptr->info.minOccurs >= 1) fprintf(fd, "\t/* required attribute of XSD type %s */", wsdl_type(Eptr->info.typ, "")); else fprintf(fd, "\t/* optional attribute of XSD type %s */", wsdl_type(Eptr->info.typ, "")); } if (flag) flag = 0; else if (Eptr->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fd, "\t/* not serialized */"); else if (Eptr->info.sto & SmustUnderstand) fprintf(fd, "\t/* mustUnderstand */"); else if (!is_dynamic_array(typ) && is_repetition(Eptr)) { if (Eptr->info.maxOccurs > 1) fprintf(fd, "\t/* sequence of " SOAP_LONG_FORMAT " to " SOAP_LONG_FORMAT " elements of XSD type %s */", Eptr->info.minOccurs, Eptr->info.maxOccurs, wsdl_type(Eptr->info.typ, "")); else if (Eptr->info.maxOccurs > 1) fprintf(fd, "\t/* sequence of " SOAP_LONG_FORMAT " to " SOAP_LONG_FORMAT " elements <%s> of XSD type %s */", Eptr->info.minOccurs, Eptr->info.maxOccurs, ns_convert(Eptr->next->sym->name), wsdl_type(Eptr->next->info.typ, "")); else fprintf(fd, "\t/* sequence of elements <%s> of XSD type %s */", ns_convert(Eptr->next->sym->name), wsdl_type(Eptr->next->info.typ, "")); flag = 1; } else if (is_anytype(Eptr)) { fprintf(fd, "\t/* any type of element <%s> (defined below)\n\t WARNING: do not create a cyclic data structure graph throught this element unless SOAP encoding or SOAP_XML_GRAPH are used for id-ref serialization */", ns_convert(Eptr->next->sym->name)); flag = 1; } else if (is_choice(Eptr)) { fprintf(fd, "\t/* union discriminant (of union defined below) */"); flag = 1; } else if (is_anyType(Eptr->info.typ)) fprintf(fd, "\t/* DOM content */"); else if (is_item(Eptr)) fprintf(fd, "\t/* mixed XML content */"); else if (Eptr->info.typ->type != Tfun && Eptr->info.typ->type != Tunion && !(Eptr->info.sto & (Sconst | Sprivate | Sprotected)) && !(Eptr->info.sto & Sattribute) && !is_transient(Eptr->info.typ) && !is_external(Eptr->info.typ) && strncmp(Eptr->sym->name, "__", 2)) { if (Eptr->info.minOccurs >= 1) fprintf(fd, "\t/* required element of XSD type %s */", wsdl_type(Eptr->info.typ, "")); else fprintf(fd, "\t/* optional element of XSD type %s */", wsdl_type(Eptr->info.typ, "")); } if (!is_dynamic_array(typ) && !is_primclass(typ)) { if ((Eptr->info.typ->type == Tint || Eptr->info.typ->type == Tsize) && !strncmp(Eptr->sym->name, "__size", 6)) { if (!Eptr->next || (Eptr->next->info.typ->type != Tpointer && !is_smart(Eptr->next->info.typ))) { sprintf(errbuf, "Member field '%s' is not followed by a pointer member field in class '%s'", Eptr->sym->name, typ->id->name); semwarn(errbuf); } } else if (Eptr->info.typ->type == Tint && !strncmp(Eptr->sym->name, "__type", 6)) { if (!Eptr->next || ((Eptr->next->info.typ->type != Tpointer || ((Tnode*)Eptr->next->info.typ->ref)->type != Tvoid))) { sprintf(errbuf, "Member field '%s' is not followed by a void pointer member field in class '%s'", Eptr->sym->name, typ->id->name); semwarn(errbuf); } } else if (Eptr->info.typ->type == Tint && !strncmp(Eptr->sym->name, "__union", 7)) { if (!Eptr->next || ((Eptr->next->info.typ->type != Tunion))) { sprintf(errbuf, "Member field '%s' is not followed by a union member field in class '%s'", Eptr->sym->name, typ->id->name); semwarn(errbuf); } } else if ((Eptr->info.typ->type == Tint || Eptr->info.typ->type == Tsize) && (Eptr->info.sto & Sspecial)) { if (!Eptr->next || (Eptr->next->info.typ->type != Tpointer && !is_smart(Eptr->next->info.typ) && (Eptr->next->info.typ->type != Tunion))) { sprintf(errbuf, "Member field '%s' is not followed by a pointer or union member field in class '%s'", Eptr->sym->name, typ->id->name); semwarn(errbuf); } } } } if (!is_transient(typ) && !is_volatile(typ)) { fprintf(fd, "\npublic:"); fprintf(fd, "\n\t/// Return the unique type ID value %s (%d)", soap_type(typ), typ->num); fprintf(fd, "\n\tvirtual int soap_type(void) const { return %d; }", typ->num); fprintf(fd, "\n\t/// Set object's data members to default values"); fprintf(fd, "\n\tvirtual void soap_default(struct soap*);"); fprintf(fd, "\n\t/// Serialize object to prepare for SOAP 1.1/1.2 encoded output (or with SOAP_XML_GRAPH) by analyzing its (cyclic) structures"); fprintf(fd, "\n\tvirtual void soap_serialize(struct soap*) const;"); if (Etflag) fprintf(fd, "\n\tvirtual void soap_traverse(struct soap*, const char *s, soap_walker, soap_walker);"); fprintf(fd, "\n\t/// Output object in XML, compliant with SOAP 1.1 encoding style, return error code or SOAP_OK"); fprintf(fd, "\n\tvirtual int soap_put(struct soap*, const char *tag, const char *type) const;"); fprintf(fd, "\n\t/// Output object in XML, with tag and optional id attribute and xsi:type, return error code or SOAP_OK"); fprintf(fd, "\n\tvirtual int soap_out(struct soap*, const char *tag, int id, const char *type) const;"); fprintf(fd, "\n\t/// Get object from XML, compliant with SOAP 1.1 encoding style, return pointer to object or NULL on error"); fprintf(fd, "\n\tvirtual void *soap_get(struct soap*, const char *tag, const char *type);"); fprintf(fd, "\n\t/// Get object from XML, with matching tag and type (NULL matches any tag and type), return pointer to object or NULL on error"); fprintf(fd, "\n\tvirtual void *soap_in(struct soap*, const char *tag, const char *type);"); fprintf(fd, "\n\t/// Return a new object of type %s, default initialized and not managed by a soap context", c_type(typ)); fprintf(fd, "\n\tvirtual %s *soap_alloc(void) const { return SOAP_NEW(%s); }", c_type(typ), c_type(typ)); if (Ecflag) { fprintf(fd, "\n\t/// Return a duplicate of this object by deep copying, replicating all deep cycles and shared pointers when a managing soap context is provided as argument.\n\t/// Deep copy is a tree when argument is NULL, but the presence of deep cycles will lead to non-termination.\n\t/// Use flag SOAP_XML_TREE with a managing context to copy into a tree without cycles and pointers to shared objects"); fprintf(fd, "\n\tvirtual %s *soap_dup(struct soap *soap = NULL, void *dest = NULL) const { return soap_dup_%s(soap, (%s*)dest, this); }", c_type(typ), c_ident(typ), c_type(typ)); } if (Edflag) { fprintf(fd, "\n\t/// Delete heap-allocated members of this object by deep deletion ONLY IF this object and all of its (deep) members are not managed by a soap context AND the deep structure is a tree (no cycles and co-referenced objects by way of multiple (non-smart) pointers pointing to the same data)\n\t/// Can be safely used after soap_dup(NULL) to delete the deep copy"); fprintf(fd, "\n\tvirtual void soap_del(void) const { soap_del_%s(this); }", c_ident(typ)); } if ((x = union_member(typ))) { sprintf(errbuf, "class '%s' cannot be assigned a default constructor because it is used as a member of union '%s'", typ->id->name, ident(x)); semwarn(errbuf); } else { if (!has_constructor(typ)) { Table *t; Entry *p; fprintf(fd, "\n\t %s() { %s::soap_default(NULL); }", c_ident(typ), c_ident(typ)); for (t = (Table*)typ->ref; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.typ->type == Treference || p->info.typ->type == Trvalueref) { sprintf(errbuf, "no constructor for '%s' to explicitly initialize the reference member '%s'", typ->id->name, p->sym->name); semwarn(errbuf); } } } } if (!has_destructor(typ)) fprintf(fd, "\n\tvirtual ~%s() { }", c_ident(typ)); } if (Ecflag) fprintf(fd, "\n\tfriend SOAP_FMAC1 %s * SOAP_FMAC2 soap_dup_%s(struct soap*, %s*, %s);", c_type(typ), c_ident(typ), c_type(typ), c_type_constptr_id(typ, "const*")); if (Edflag) fprintf(fd, "\n\tfriend SOAP_FMAC1 void SOAP_FMAC2 soap_del_%s(%s);", c_ident(typ), c_type_constptr_id(typ, "const*")); fprintf(fd, "\n\tfriend SOAP_FMAC1 %s * SOAP_FMAC2 soap_instantiate_%s(struct soap*, int, const char*, const char*, size_t*);", c_ident(typ), c_ident(typ)); /* the use of 'friend' causes problems linking static functions. Adding these friends could enable serializing protected/private members (which is not implemented) fprintf(fd, "\n\tfriend %s *soap_in_%s(struct soap*, const char*, %s*, const char*);", typ->id->name, typ->id->name, typ->id->name); fprintf(fd, "\n\tfriend int soap_out_%s(struct soap*, const char*, int, const %s*, const char*);", typ->id->name, typ->id->name); */ } fprintf(fd, "\n};"); } else if (typ->type == Tunion) { int i = 1; fprintf(fd, "union %s\n{", ident(typ->id->name)); for (Eptr = ((Table*)typ->ref)->list; Eptr; Eptr = Eptr->next) { fprintf(fd, "\n#define %s\t(%d)", soap_union_member(typ, Eptr), i); i++; fprintf(fd, "\n\t%s", c_storage(Eptr->info.sto)); fprintf(fd, "%s;", c_type_id(Eptr->info.typ, Eptr->sym->name)); if (Eptr->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fd, "\t/* const field cannot be deserialized */"); if (is_external(Eptr->info.typ)) fprintf(fd, "\t/* external (custom serializer) */"); if (is_transient(Eptr->info.typ)) fprintf(fd, "\t/* transient (not serialized) */"); if (Eptr->info.sto & Sattribute) { fprintf(fd, "\t/* attribute not allowed in union */"); sprintf(errbuf, "union '%s' contains attribute declarations", typ->id->name); semwarn(errbuf); } if (Eptr->info.sto & SmustUnderstand) fprintf(fd, "\t/* mustUnderstand */"); } if (!((Table*)typ->ref)->list) { if (cflag) fprintf(fd, "\n#ifdef WITH_NOEMPTYSTRUCT\n\tchar dummy;\t/* empty union is a GNU extension */\n#endif"); } fprintf(fd, "\n};"); } if (is_volatile(typ)) fprintf(fd, "\n#endif"); fprintf(fd, "\n#endif"); if (is_header_or_fault(typ) || is_body(typ)) fprintf(fd, "\n#endif"); fflush(fd); } void generate_header(Table *t) { Entry *p, *q; banner(fheader, "Enumerations"); fflush(fheader); if (enumtable) { Table *r = mktable(NULL); for (p = enumtable->list; p; p = p->next) { const char *x; int enum64 = False; if (is_imported(p->info.typ) || (is_transient(p->info.typ) && !p->info.typ->ref)) continue; x = xsi_type(p->info.typ); if (!x || !*x) x = wsdl_type(p->info.typ, ""); fprintf(fheader, "\n\n/* %s:%d */", p->filename, p->lineno); fprintf(fheader, "\n#ifndef %s", soap_type(p->info.typ)); fprintf(fheader, "\n#define %s (%d)", soap_type(p->info.typ), p->info.typ->num); if (is_volatile(p->info.typ)) fprintf(fheader, "\n#if 0 /* Volatile: not declared here */"); if (is_mask(p->info.typ)) fprintf(fheader, "\n/* Bitmask %s */", x); else fprintf(fheader, "\n/* %s */", x); if ((Table*)p->info.typ->ref) { for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next) { if (q->info.val.i > 0x7FFFLL || q->info.val.i < -0x8000LL) { enum64 = True; break; } } } if (cflag && p->info.typ->type == Tenum && p->sym->token == TYPE) fprintf(fheader, "\ntypedef "); else fprintf(fheader, "\n"); if (p->info.typ->width == 4 || is_mask(p->info.typ)) { if (p->info.typ->type == Tenumsc) { if (enum64) fprintf(fheader, "enum class %s : int64_t\n{", ident(p->info.typ->id->name)); else fprintf(fheader, "enum class %s\n{", ident(p->info.typ->id->name)); } else fprintf(fheader, "enum %s\n{", ident(p->info.typ->id->name)); } else { const char *t; switch (p->info.typ->width) { case 1: t = "int8_t"; break; case 2: t = "int16_t"; break; case 4: t = "int32_t"; break; default: t = "int64_t"; break; } if (p->info.typ->type == Tenumsc) fprintf(fheader, "enum class %s : %s\n{", ident(p->info.typ->id->name), t); else fprintf(fheader, "enum %s : %s\n{", ident(p->info.typ->id->name), t); } if ((Table*)p->info.typ->ref) { const char *c = "\n\t"; for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next) { Entry *e = NULL; if (p->info.typ->type == Tenum && (e = entry(r, q->sym)) && e->info.val.i == q->info.val.i) fprintf(fheader, " /* %s%s = " SOAP_LONG_FORMAT " */", c, ident(q->sym->name), q->info.val.i); else { if (q->info.val.i <= 0x7FFFLL && q->info.val.i >= -0x8000LL) fprintf(fheader, "%s%s = " SOAP_LONG_FORMAT, c, ident(q->sym->name), q->info.val.i); else fprintf(fheader, "%s%s = " SOAP_LONG_FORMAT "LL", c, ident(q->sym->name), q->info.val.i); if (p->info.typ->type == Tenum && !e) { e = enter(r, q->sym); e->info.val.i = q->info.val.i; } c = ",\n\t"; } } } if (cflag && p->info.typ->type == Tenum && p->sym->token == TYPE) fprintf(fheader, "\n} %s;", ident(p->sym->name)); else fprintf(fheader, "\n};"); if (is_volatile(p->info.typ)) fprintf(fheader, "\n#endif"); fprintf(fheader, "\n#endif"); } freetable(r); } banner(fheader, "Types with Custom Serializers"); fflush(fheader); if (typetable) { for (p = typetable->list; p; p = p->next) { if (is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_imported(p->info.typ)) { fprintf(fheader, "\n\n/* %s:%d */", p->filename, p->lineno); fprintf(fheader, "\n#ifndef %s", soap_type(p->info.typ)); fprintf(fheader, "\n#define %s (%d)", soap_type(p->info.typ), p->info.typ->num); fprintf(fheader, "\n%s%s;", c_storage(p->info.sto), c_type_synonym(p->info.typ, p->sym->name)); fprintf(fheader, "\n#endif"); } } } if (typetable) { for (p = typetable->list; p; p = p->next) { if (p->info.typ->type == Tclass && is_eq(p->info.typ->sym->name, "xsd__QName") && !is_external(p->info.typ) && !is_imported(p->info.typ)) { fprintf(fheader, "\n#ifndef %s", soap_type(p->info.typ)); fprintf(fheader, "\n#define %s (%d)", soap_type(p->info.typ), p->info.typ->num); fprintf(fheader, "\n%sstd::string %s;", c_storage(p->info.sto), ident(p->sym->name)); fprintf(fheader, "\n#endif\n"); } } } banner(fheader, "Classes, Structs, and Unions"); fflush(fheader); if (classtable) { for (p = classtable->list; p; p = p->next) { if (!is_imported(p->info.typ) && !is_volatile(p->info.typ) && p->info.typ->ref) { if (!is_header_or_fault(p->info.typ) && !is_body(p->info.typ)) { if (cflag && (p->info.typ->type == Tstruct || p->info.typ->type == Tunion) && p->sym->token == TYPE) fprintf(fheader, "\ntypedef "); else fprintf(fheader, "\n"); if (p->info.typ->type == Tstruct) fprintf(fheader, "struct %s", ident(p->sym->name)); else if (!cflag && p->info.typ->type == Tclass) fprintf(fheader, "class %s", ident(p->sym->name)); else if (p->info.typ->type == Tunion) fprintf(fheader, "union %s", ident(p->sym->name)); if (cflag && (p->info.typ->type == Tstruct || p->info.typ->type == Tunion) && p->sym->token == TYPE) fprintf(fheader, " %s;", ident(p->sym->name)); else fprintf(fheader, ";"); fprintf(fheader, "\t/* %s:%d */", p->filename, p->lineno); } } } for (p = classtable->list; p; p = p->next) if (!is_imported(p->info.typ)) gen_class(fheader, p); } banner(fheader, "Typedefs"); fflush(fheader); if (typetable) { for (p = typetable->list; p; p = p->next) { if (!wflag && !is_primitive_or_string(p->info.typ) && !is_external(p->info.typ) && !is_XML(p->info.typ) && !is_transient(p->info.typ) && !has_ns_t(p->info.typ) && !is_imported(p->info.typ) && !is_template(p->info.typ)) { sprintf(errbuf, "serializable typedef '%s' is not namespace qualified: schema definition for '%s' in WSDL file output may be invalid", p->sym->name, p->sym->name); semwarn(errbuf); } if (p->info.typ->type == Tclass && is_eq(p->info.typ->sym->name, "xsd__QName") && !is_external(p->info.typ) && !is_imported(p->info.typ)) continue; if ((!is_external(p->info.typ) && !is_imported(p->info.typ)) || is_synonym(p->info.typ)) { fprintf(fheader, "\n\n/* %s:%d */", p->filename, p->lineno); fprintf(fheader, "\n#ifndef %s", soap_type(p->info.typ)); fprintf(fheader, "\n#define %s (%d)", soap_type(p->info.typ), p->info.typ->num); fprintf(fheader, "\n%s%s;", c_storage(p->info.sto), c_type_synonym(p->info.typ, p->sym->name)); fprintf(fheader, "\n#endif"); } } } banner(fheader, "Externals"); fflush(fheader); if (t) { for (p = t->list; p; p = p->next) { if (p->info.typ->type != Tfun || (p->info.sto & Sextern)) { fprintf(fheader, "\n\n/* %s:%d */\n", p->filename, p->lineno); if (!(p->info.sto & Sstatic)) fprintf(fheader, "extern "); fprintf(fheader, "%s", c_storage(p->info.sto)); fprintf(fheader, "%s;", c_type_id(p->info.typ, p->sym->name)); } } } fflush(fheader); } void get_namespace_prefixes(void) { Symbol *p, *q; int i, n; const char *s; char buf[256]; if (nslist) return; for (p = symlist; p; p = p->next) { s = p->name; while (*s == '_' || *s == '~') s++; n = (int)(strlen(s) - 2); for (i = 1; i < n; i++) { if (s[i] == ':' || (s[i-1] != '_' && s[i] == '_' && s[i+1] == '_' && s[i+2] && s[i+2] != '_') || (s[i-1] != '_' && (!strncmp(s+i, "___DOT", 6) || !strncmp(s+i, "___USCORE", 9) || (!strncmp(s+i, "___x", 4) && isxdigit(s[i+4]) && isxdigit(s[i+5]) && isxdigit(s[i+6]) && isxdigit(s[i+7]))))) { if (s[i+1] == ':') { i++; continue; } strncpy(buf, s, i); buf[i] = '\0'; if (!strcmp(buf, "SOAP_ENV") || !strcmp(buf, "SOAP_ENC") || !strcmp(buf, "xsd") || !strcmp(buf, "xsi") || !strcmp(buf, "xml") || !strcmp(buf, "std") || !strncmp(buf, "soap_", 5)) goto nsnext; for (q = nslist; q; q = q->next) if (!strcmp(q->name, buf)) goto nsnext; q = (Symbol*)emalloc(sizeof(Symbol)); q->name = (char*)emalloc(i+1); strcpy(q->name, buf); q->name[i] = '\0'; q->next = nslist; nslist = q; break; } } nsnext: ; } q = (Symbol*)emalloc(sizeof(Symbol)); q->name = (char*)emalloc(4); strcpy(q->name, "xsd"); q->next = nslist; nslist = q; q = (Symbol*)emalloc(sizeof(Symbol)); q->name = (char*)emalloc(4); strcpy(q->name, "xsi"); q->next = nslist; nslist = q; q = (Symbol*)emalloc(sizeof(Symbol)); q->name = (char*)emalloc(9); strcpy(q->name, "SOAP-ENC"); q->next = nslist; nslist = q; q = (Symbol*)emalloc(sizeof(Symbol)); q->name = (char*)emalloc(9); strcpy(q->name, "SOAP-ENV"); q->next = nslist; nslist = q; } void generate_schema(Table *t) { Entry *p = NULL; Symbol *ns; const char *name = NULL; const char *URL = NULL; const char *executable = NULL; const char *URI = NULL; const char *style = NULL; const char *encoding = NULL; const char *protocol = NULL; const char *import = NULL; Service *sp = NULL; char buf[1024]; FILE *fd; int flag = 0; get_namespace_prefixes(); for (ns = nslist; ns; ns = ns->next) { if (!strcmp(ns->name, "SOAP-ENV") || !strcmp(ns->name, "SOAP-ENC") || !strcmp(ns->name, "xsi") || !strcmp(ns->name, "xsd")) continue; name = NULL; URL = NULL; executable = NULL; URI = NULL; style = NULL; encoding = NULL; import = NULL; for (sp = services; sp; sp = sp->next) { if (!tagcmp(sp->ns, ns->name)) { name = ns_cname(sp->name, NULL); URL = sp->URL; executable = sp->executable; URI = sp->URI; style = sp->style; encoding = sp->encoding; protocol = sp->protocol; import = sp->import; break; } } if (!URI) { char *s = (char*)emalloc(strlen(tmpURI) + strlen(ns->name) + 6); sprintf(s, "%s/%s.xsd", tmpURI, ns_convert(ns->name)); URI = s; } if (soap_version >= 0 && is_document(style) && encoding && !*encoding) { semwarn("Cannot use document style with SOAP encoding"); encoding = NULL; } if (!name) name = "Service"; if (!URL) URL = "http://localhost:80"; if (!import) flag = 1; if (t) { for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun && !(p->info.sto & Sextern) && has_ns_eq(ns->name, p->sym->name)) { if (name) fprintf(fmsg, "Using %s service name: %s\n", ns->name, name); if (protocol) fprintf(fmsg, "Using %s service protocol: %s\n", ns->name, protocol); if (style && soap_version >= 0) fprintf(fmsg, "Using %s service style: %s\n", ns->name, style); else if (!eflag && soap_version >= 0) fprintf(fmsg, "Using %s service style: document\n", ns->name); if (encoding && *encoding) fprintf(fmsg, "Using %s service encoding: %s\n", ns->name, encoding); else if (encoding && !*encoding && soap_version >= 0) fprintf(fmsg, "Using %s service encoding: encoded\n", ns->name); else if (!eflag && soap_version >= 0) fprintf(fmsg, "Using %s service encoding: literal\n", ns->name); if (URL) fprintf(fmsg, "Using %s service location: %s\n", ns->name, URL); if (executable) fprintf(fmsg, "Using %s service executable: %s\n", ns->name, executable); if (import) fprintf(fmsg, "Using %s schema import: %s\n", ns->name, import); else if (URI) fprintf(fmsg, "Using %s schema namespace: %s\n", ns->name, URI); if (sp && sp->name) sprintf(buf, "%s%s.wsdl", dirpath, ns_cname(name, NULL)); else sprintf(buf, "%s%s.wsdl", dirpath, ns_cname(ns->name, NULL)); if (!wflag && !import) { fprintf(fmsg, "Saving %s Web Service description\n", buf); fd = fopen(buf, "w"); if (!fd) execerror("Cannot write WSDL file"); gen_wsdl(fd, t, ns->name, name, URL, executable, URI, style, encoding, protocol); fclose(fd); } if (!cflag) { if (iflag || jflag) { const char *sname; if (sp && sp->name) sname = sp->name; else sname = ""; if (!Sflag) { const char *name1 = ns_cname(sname, "Proxy"); sprintf(buf, "%s%s%s.h", dirpath, prefix, name1); fprintf(fmsg, "Saving %s client proxy class\n", buf); fd = fopen(buf, "w"); if (!fd) execerror("Cannot write proxy class file"); sprintf(buf, "%s%s.h", prefix, name1); copyrightnote(fd, buf); gen_proxy_header(fd, t, ns, name1); fclose(fd); sprintf(buf, "%s%s%s.cpp", dirpath, prefix, name1); fprintf(fmsg, "Saving %s client proxy class\n", buf); fd = fopen(buf, "w"); if (!fd) execerror("Cannot write proxy class file"); sprintf(buf, "%s%s.cpp", prefix, name1); copyrightnote(fd, buf); gen_proxy_code(fd, t, ns, name1); fclose(fd); } if (!Cflag) { const char *name1 = ns_cname(sname, "Service"); sprintf(buf, "%s%s%s.h", dirpath, prefix, name1); fprintf(fmsg, "Saving %s service class\n", buf); fd = fopen(buf, "w"); if (!fd) execerror("Cannot write service class file"); sprintf(buf, "%s%s.h", prefix, name1); copyrightnote(fd, buf); gen_object_header(fd, t, ns, name1); fclose(fd); sprintf(buf, "%s%s%s.cpp", dirpath, prefix, name1); fprintf(fmsg, "Saving %s service class\n", buf); fd = fopen(buf, "w"); if (!fd) execerror("Cannot write service class file"); sprintf(buf, "%s%s.cpp", prefix, name1); copyrightnote(fd, buf); gen_object_code(fd, t, ns, name1); fclose(fd); } } else if (zflag == 1) { if (!Sflag && sp && sp->name) { sprintf(buf, "%s%s%s.h", dirpath, prefix, ns_cname(name, "Proxy")); fprintf(fmsg, "Saving %s simple client proxy (deprecated)\n", buf); fd = fopen(buf, "w"); if (!fd) execerror("Cannot write proxy file"); sprintf(buf, "%s%s.h", prefix, ns_cname(name, "Proxy")); copyrightnote(fd, buf); gen_proxy(fd, t, ns, name, URL); fclose(fd); } else if (!Sflag) { sprintf(buf, "%s%s.h", dirpath, ns_cname(prefix, "Proxy")); fprintf(fmsg, "Saving %s simple client proxy (deprecated)\n", buf); fd = fopen(buf, "w"); if (!fd) execerror("Cannot write proxy file"); sprintf(buf, "%s.h", ns_cname(prefix, "Proxy")); copyrightnote(fd, buf); gen_proxy(fd, t, ns, "Service", URL); fclose(fd); } if (!Cflag && sp && sp->name) { sprintf(buf, "%s%s%s.h", dirpath, prefix, ns_cname(name, "Object")); fprintf(fmsg, "Saving %s simple server object (deprecated)\n", buf); fd = fopen(buf, "w"); if (!fd) execerror("Cannot write server object file"); sprintf(buf, "%s%s.h", prefix, ns_cname(name, "Object")); copyrightnote(fd, buf); gen_object(fd, t, name); fclose(fd); } else if (!Cflag) { sprintf(buf, "%s%s.h", dirpath, ns_cname(prefix, "Object")); fprintf(fmsg, "Saving %s simple server object (deprecated)\n", buf); fd = fopen(buf, "w"); if (!fd) execerror("Cannot write server object file"); sprintf(buf, "%s.h", ns_cname(prefix, "Object")); copyrightnote(fd, buf); gen_object(fd, t, "Service"); fclose(fd); } } } if (!xflag) { strcpy(buf, dirpath); if (sp && sp->name) strcat(buf, ns_fname(name)); else strcat(buf, ns_fname(ns->name)); strcat(buf, "."); gen_data(buf, t, ns->name, encoding); } break; } } if (sp && sp->name) { has_nsmap = 1; if (nflag) sprintf(buf, "%s%s.nsmap", dirpath, prefix); else sprintf(buf, "%s%s.nsmap", dirpath, ns_cname(name, NULL)); fprintf(fmsg, "Saving %s namespace mapping table\n", buf); fd = fopen(buf, "w"); if (!fd) execerror("Cannot write nsmap file"); fprintf(fd, "\n#include \"%sH.h\"", prefix); if (nflag) fprintf(fd, "\nSOAP_NMAC struct Namespace %s_namespaces[] =\n", prefix); else fprintf(fd, "\nSOAP_NMAC struct Namespace namespaces[] =\n"); gen_nsmap(fd); fclose(fd); if (Tflag && !Cflag) { Entry *method; char soapTester[1024]; char pathsoapTester[1024]; const char *name1 = NULL; Tflag = 0; strcpy(soapTester, prefix); strcat(soapTester, "Tester"); if (cflag) strcat(soapTester, ".c"); else strcat(soapTester, ".cpp"); strcpy(pathsoapTester, dirpath); strcat(pathsoapTester, soapTester); fprintf(fmsg, "Saving %s server auto-test code\n", pathsoapTester); fd = fopen(pathsoapTester, "w"); if (!fd) execerror("Cannot write to file"); copyrightnote(fd, soapTester); fprintf(fd, "\n/*\n Stand-alone server auto-test code:\n Takes request from standard input or over TCP/IP socket and returns\nresponse to standard output or socket\n\n Compile:\n cc soapTester.c soapServer.c soapC.c stdsoap2.c\n\n Command line usage with redirect over stdin/out:\n > ./a.out < SomeTest.req.xml\n > ./a.out 12288 < SomeTest.req.xml\n Note: 12288 = SOAP_XML_INDENT | SOAP_XML_STRICT (see codes in stdsoap2.h)\n Command line usage to start server at port 8080:\n > a.out 12288 8080\n*/\n\n#include \""); if (iflag || jflag) { const char *sname; if (sp && sp->name) sname = sp->name; else sname = ""; name1 = ns_cname(sname, "Service"); fprintf(fd, "%s%s%s.h\"\n\n#ifndef SOAP_DEFMAIN\n# define SOAP_DEFMAIN main\t/* redefine to use your own main() */\n#endif\n\nint SOAP_DEFMAIN(int argc, char **argv)\n{\n\t%s service(argc > 1 ? atoi(argv[1]) : 0);\n\tif (argc <= 2)\n\t\treturn service.serve();\n\twhile (service.run(atoi(argv[2])) != SOAP_OK && service.%serror != SOAP_TCP_ERROR)\n\t\tservice.soap_print_fault(stderr);\n\treturn 0;\n}\n", dirpath, prefix, name1, name1, iflag ? "" : "soap->"); } else fprintf(fd, "%s%s.nsmap\"\n\n#ifndef SOAP_DEFMAIN\n# define SOAP_DEFMAIN main\t/* redefine to use your own main() */\n#endif\n\nint SOAP_DEFMAIN(int argc, char **argv)\n{\n\tstruct soap *soap = soap_new1(argc > 1 ? atoi(argv[1]) : 0);\n\tif (argc <= 2)\n\t\treturn %s_serve(soap);\n\tif (soap_valid_socket(soap_bind(soap, NULL, atoi(argv[2]), 100)))\n\t\twhile (soap_valid_socket(soap_accept(soap)))\n\t\t{\tif (%s_serve(soap))\n\t\t\t\tsoap_print_fault(soap, stderr);\n\t\t\tsoap_destroy(soap);\n\t\t\tsoap_end(soap);\n\t\t}\n\tsoap_destroy(soap);\n\tsoap_end(soap);\n\tsoap_free(soap);\n\treturn 0;\n}\n", dirpath, nflag?prefix:ns_cname(name, NULL), nflag?prefix:"soap", nflag?prefix:"soap"); for (method = t->list; method; method = method->next) { if (method->info.typ->type == Tfun && !(method->info.sto & Sextern)) { Entry *p = NULL, *q = entry(t, method->sym); Table *r; if (q) p = (Entry*)q->info.typ->ref; else { fprintf(stderr, "Internal error: no table entry\n"); return; } q = entry(classtable, method->sym); r = (Table*)q->info.typ->ref; if (iflag || jflag) fprintf(fd, "\n\n/** Auto-test server operation %s */\nint %s::%s(", method->sym->name, name1, ns_cname(method->sym->name, NULL)); else fprintf(fd, "\n\n/** Auto-test server operation %s */\nint %s(struct soap *soap", method->sym->name, ident(method->sym->name)); gen_params(fd, r, p, !iflag && !jflag); /* single param to single param echo */ if (p && r && r->list && r->list->info.typ == p->info.typ) fprintf(fd, "\n{\t/* Echo request-response parameter */\n\t*%s = *%s;\n\treturn SOAP_OK;\n}\n", ident(p->sym->name), ident(r->list->sym->name)); else if (p && r && r->list && p->info.typ->type == Tpointer && r->list->info.typ == (Tnode*)p->info.typ->ref) fprintf(fd, "\n{\t/* Echo request-response parameter */\n\t*%s = %s;\n\treturn SOAP_OK;\n}\n", ident(p->sym->name), ident(r->list->sym->name)); else if (p && r && r->list && p->info.typ->type == Treference && r->list->info.typ == (Tnode*)p->info.typ->ref) fprintf(fd, "\n{\t/* Echo request-response parameter */\n\t%s = %s;\n\treturn SOAP_OK;\n}\n", ident(p->sym->name), ident(r->list->sym->name)); else if (p && r && r->list && p->info.typ->type == Treference && r->list->info.typ->type == Tpointer && r->list->info.typ->ref == (Tnode*)p->info.typ->ref) fprintf(fd, "\n{\t/* Echo request-response parameter */\n\t%s = *%s;\n\treturn SOAP_OK;\n}\n", ident(p->sym->name), ident(r->list->sym->name)); /* params to wrapped params echo */ else { fprintf(fd, "\n{\t(void)soap; /* appease -Wall -Werror */"); if (r && p && p->info.typ->ref && ((Tnode*)p->info.typ->ref)->ref && (((Tnode*)p->info.typ->ref)->type == Tstruct || ((Tnode*)p->info.typ->ref)->type == Tclass)) { const char *s, *a; int d = 1; s = ident(p->sym->name); if (p->info.typ->type == Treference || p->info.typ->type == Trvalueref) a = "."; else a = "->"; for (p = ((Table*)((Tnode*)p->info.typ->ref)->ref)->list, q = r->list; p && q; p = p->next, q = q->next) { if (p->info.typ == q->info.typ) fprintf(fd, "\n\t%s%s%s = %s;", s, a, ident(p->sym->name), ident(q->sym->name)); else if (q->info.typ->type == Tpointer && p->info.typ == (Tnode*)q->info.typ->ref) fprintf(fd, "\n\t%s%s%s = *%s;", s, a, ident(p->sym->name), ident(q->sym->name)); else d = 0; } if (!d) fprintf(fd, "\n\t/* Returns incomplete response containing some default data values */"); } fprintf(fd, "\n\treturn SOAP_OK;\n}\n"); } fflush(fd); } } fclose(fd); } } } if (!wflag && !import) { sprintf(buf, "%s%s.xsd", dirpath, ns_cname(ns->name, NULL)); fprintf(fmsg, "Saving %s XML schema\n", buf); fd = fopen(buf, "w"); if (!fd) execerror("Cannot write schema file"); fprintf(fd, "\n"); if (t) for (p = t->list; p; p = p->next) if (p->info.typ->type == Tfun && !(p->info.sto & Sextern) && has_ns_eq(ns->name, p->sym->name)) { gen_schema(fd, t, ns->name, ns->name, 0, style, encoding); break; } if (!t || !p) gen_schema(fd, t, ns->name, ns->name, 0, style, encoding); fclose(fd); } } if (!has_nsmap) { if (Tflag && !Cflag && !iflag && !jflag) fprintf(fmsg, "Warning: cannot save soapTester, need directive //gsoap service name\n"); for (ns = nslist; ns; ns = ns->next) if (strcmp(ns->name, "SOAP-ENV") && strcmp(ns->name, "SOAP-ENC") && strcmp(ns->name, "xsi") && strcmp(ns->name, "xsd")) break; if (nflag) sprintf(buf, "%s%s.nsmap", dirpath, prefix); else if (ns && ns->name) sprintf(buf, "%s%s.nsmap", dirpath, ns_cname(ns->name, NULL)); else sprintf(buf, "%ssoap.nsmap", dirpath); fprintf(fmsg, "Saving %s namespace mapping table\n", buf); fd = fopen(buf, "w"); if (!fd) execerror("Cannot write nsmap file"); fprintf(fd, "\n#include \"%sH.h\"", prefix); if (nflag) fprintf(fd, "\nSOAP_NMAC struct Namespace %s_namespaces[] =\n", prefix); else fprintf(fd, "\nSOAP_NMAC struct Namespace namespaces[] =\n"); gen_nsmap(fd); fclose(fd); } } int chkhdr(const char *part) { Entry *p; p = entry(classtable, lookup("SOAP_ENV__Header")); if (p) for (p = ((Table*)p->info.typ->ref)->list; p; p = p->next) if (has_ns_eq(NULL, p->sym->name) && (!strcmp(part, p->sym->name) || is_eq_nons(part, p->sym->name))) return 1; sprintf(errbuf, "Cannot define method-header-part in WSDL: SOAP_ENV__Header \"%s\" member field is not qualified", part); semwarn(errbuf); return 0; } void gen_wsdl(FILE *fd, Table *t, const char *ns, const char *name, const char *URL, const char *executable, const char *URI, const char *style, const char *encoding, const char *protocol) { Entry *p, *q, *r; Symbol *s; Service *sp, *sp2; Method *m; const char *mimein = NULL, *mimeout = NULL; int prot, mask = 0x0; /* 0x1 = SOAP, 0x2 = GET, 0x4 = PUT, 0x8 = POST */ const char *action, *comment, *method_style = NULL, *method_encoding = NULL, *method_response_encoding = NULL; const char *portname; const char *binding; fprintf(fd, "\n"); for (sp = services; sp; sp = sp->next) if (!tagcmp(sp->ns, ns)) break; if (sp && sp->definitions) fprintf(fd, "definitions); else fprintf(fd, "WSDL) fprintf(fd, " targetNamespace=\"%s\"\n xmlns:tns=\"%s\"", sp->WSDL, sp->WSDL); else fprintf(fd, " targetNamespace=\"%s/%s.wsdl\"\n xmlns:tns=\"%s/%s.wsdl\"", URI, name, URI, name); if (sp && sp->binding) binding = ns_cname(sp->binding, NULL); else binding = name; if (sp && sp->portname) portname = ns_cname(sp->portname, NULL); else portname = name; for (s = nslist; s; s = s->next) { for (sp2 = services; sp2; sp2 = sp2->next) if (!tagcmp(sp2->ns, s->name) && sp2->URI) break; if (sp2) fprintf(fd, "\n xmlns:%s=\"%s\"", ns_convert(s->name), sp2->URI); else if (!strcmp(s->name, "SOAP-ENV")) fprintf(fd, "\n xmlns:SOAP-ENV=\"%s\"", envURI); else if (!strcmp(s->name, "SOAP-ENC")) fprintf(fd, "\n xmlns:SOAP-ENC=\"%s\"", encURI); else if (!strcmp(s->name, "xsi")) fprintf(fd, "\n xmlns:xsi=\"%s\"", xsiURI); else if (!strcmp(s->name, "xsd")) fprintf(fd, "\n xmlns:xsd=\"%s\"", xsdURI); else fprintf(fd, "\n xmlns:%s=\"%s/%s.xsd\"", ns_convert(s->name), tmpURI, ns_convert(s->name)); } if (is_soap12(encoding)) fprintf(fd, "\n xmlns:SOAP=\"http://schemas.xmlsoap.org/wsdl/soap12/\""); else fprintf(fd, "\n xmlns:SOAP=\"http://schemas.xmlsoap.org/wsdl/soap/\""); fprintf(fd, "\n xmlns:HTTP=\"http://schemas.xmlsoap.org/wsdl/http/\""); fprintf(fd, "\n xmlns:MIME=\"http://schemas.xmlsoap.org/wsdl/mime/\""); fprintf(fd, "\n xmlns:DIME=\"http://schemas.xmlsoap.org/ws/2002/04/dime/wsdl/\""); fprintf(fd, "\n xmlns:WSDL=\"http://schemas.xmlsoap.org/wsdl/\""); fprintf(fd, "\n xmlns=\"http://schemas.xmlsoap.org/wsdl/\">\n\n"); fprintf(fd, "\n\n"); for (s = nslist; s; s = s->next) gen_schema(fd, t, ns, s->name, !strcmp(s->name, ns), style, encoding); fprintf(fd, "\n\n"); fflush(fd); if (t) { for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun && !(p->info.sto & Sextern) && has_ns_eq(ns, p->sym->name)) { mimein = NULL; mimeout = NULL; comment = NULL; method_style = style; method_encoding = encoding; method_response_encoding = NULL; if (sp) { for (m = sp->list; m; m = m->next) { if (is_eq_nons(m->name, p->sym->name)) { if (m->mess&MIMEIN) mimein = m->part; if (m->mess&MIMEOUT) mimeout = m->part; if (m->mess == ENCODING) method_encoding = m->part; else if (m->mess == RESPONSE_ENCODING) method_response_encoding = m->part; else if (m->mess == STYLE) method_style = m->part; else if (m->mess == COMMENT) comment = m->part; } } } if (!method_response_encoding) method_response_encoding = method_encoding; if (get_response(p->info.typ)) fprintf(fd, "\n", ns_remove(p->sym->name)); else fprintf(fd, "\n", ns_remove(p->sym->name)); fflush(fd); if (is_document(method_style)) { if (is_invisible(p->sym->name)) { q = entry(classtable, p->sym); if (q) { q = ((Table*)q->info.typ->ref)->list; if (q) { if (is_invisible(q->sym->name)) { r = entry(classtable, q->sym); if (r) { r = ((Table*)r->info.typ->ref)->list; if (r) { fprintf(fd, " sym, r, ns, 1)) fprintf(fd, " \n"); } } } else { fprintf(fd, " sym, q, ns, 1)) fprintf(fd, " \n"); } } } } else { fprintf(fd, " sym, p, ns, 1)) fprintf(fd, " \n"); } } else { q = entry(classtable, p->sym); if (q) { for (q = ((Table*)q->info.typ->ref)->list; q; q = q->next) { if (!is_transient(q->info.typ) && !(q->info.sto & Sattribute) && q->info.typ->type != Tfun && !is_repetition(q) && !is_anytype(q)) { if (is_XML(q->info.typ) || is_stdXML(q->info.typ)) fprintf(fd, " \n"); else { fprintf(fd, " sym->name), wsdl_type(q->info.typ, ns)); if (gen_member_documentation(fd, p->sym, q, ns, 1)) fprintf(fd, " \n"); } } } } } if (mimein) fprintf(fd, " \n"); fprintf(fd, "\n\n"); fflush(fd); q = (Entry*)p->info.typ->ref; for (r = t->list; r; r = r->next) if (r != p && r->info.typ->type == Tfun && !(r->info.sto & Sextern) && q == (Entry*)r->info.typ->ref) q = NULL; if (q && is_transient(q->info.typ)) ; else if (q && !is_response(q->info.typ)) { fprintf(fd, "\n", ns_remove(p->sym->name)); if (is_document(method_style)) fprintf(fd, " \n", ns_add(p, ns)); else if (is_literal(method_response_encoding)) { fprintf(fd, " sym->name), ns_add(q, ns)); if (gen_member_documentation(fd, p->sym, q, ns, 1)) fprintf(fd, " \n"); } else if (is_XML((Tnode*)q->info.typ->ref) || is_stdXML((Tnode*)q->info.typ->ref)) fprintf(fd, " \n"); else { fprintf(fd, " sym->name), wsdl_type(q->info.typ, ns)); if (gen_member_documentation(fd, p->sym, q, ns, 1)) fprintf(fd, " \n"); } if (mimeout) fprintf(fd, " \n"); fprintf(fd, "\n\n"); } else if (q && q->info.typ->wsdl == False) { q->info.typ->wsdl = True; fprintf(fd, "\n", ns_remove(((Tnode*)q->info.typ->ref)->id->name)); if (is_document(method_style)) { if (has_ns_eq(NULL, ((Entry*)p->info.typ->ref)->sym->name)) fprintf(fd, " \n", ns_convert(((Entry*)p->info.typ->ref)->sym->name)); else if (is_invisible(((Tnode*)q->info.typ->ref)->id->name)) { r = ((Table*)((Tnode*)q->info.typ->ref)->ref)->list; if (r) { fprintf(fd, " sym, r, ns, 1)) fprintf(fd, " \n"); } } else { fprintf(fd, " info.typ->ref)->id->name)); if (gen_member_documentation(fd, p->sym, q, ns, 1)) fprintf(fd, " \n"); } } else { if (((Tnode*)q->info.typ->ref)->ref) { for (q = ((Table*)((Tnode*)q->info.typ->ref)->ref)->list; q; q = q->next) { if (!is_transient(q->info.typ) && !(q->info.sto & Sattribute) && q->info.typ->type != Tfun && !is_repetition(q) && !is_anytype(q)) { if (is_XML(q->info.typ) || is_stdXML(q->info.typ)) fprintf(fd, " \n"); else { fprintf(fd, " sym->name), wsdl_type(q->info.typ, ns)); if (gen_member_documentation(fd, p->sym, q, ns, 1)) fprintf(fd, " \n"); } } } } } if (mimeout) fprintf(fd, " \n"); fprintf(fd, "\n\n"); } fflush(fd); } } if (custom_header) { Table *r; fprintf(fd, "\n", name); r = (Table*)entry(classtable, lookup("SOAP_ENV__Header"))->info.typ->ref; if (r) { for (q = r->list; q; q = q->next) { if (!is_transient(q->info.typ) && !(q->info.sto & Sattribute) && q->info.typ->type != Tfun && !is_repetition(q) && !is_anytype(q)) fprintf(fd, " \n", ns_remove(q->sym->name), ns_add(q, ns)); } } fprintf(fd, "\n\n"); } if (custom_fault) { Table *r; fprintf(fd, "\n", name); r = (Table*)entry(classtable, lookup("SOAP_ENV__Detail"))->info.typ->ref; if (r) for (q = r->list; q; q = q->next) if (!is_transient(q->info.typ) && !is_repetition(q) && !is_anytype(q) && !(q->info.sto & Sattribute) && q->info.typ->type != Tfun && has_ns_eq(NULL, q->sym->name)) { fprintf(fd, " sym->name), ns_add(q, ns)); if (gen_member_documentation(fd, q->sym, q, ns, 1)) fprintf(fd, " \n"); } fprintf(fd, "\n\n"); } if (sp) { for (m = sp->list; m; m = m->next) { if (m->mess&FAULT && m->part) { Method *m2; int flag = 0; for (m2 = sp->list; m2 && m2 != m; m2 = m2->next) if (m2->mess&FAULT && !strcmp(m2->part, m->part)) flag = 1; if (!flag) { if (typetable) for (p = typetable->list; p; p = p->next) if ((m->mess&FAULT) && is_eq(m->part, p->info.typ->sym->name)) break; if (!p && classtable) for (p = classtable->list; p; p = p->next) if ((m->mess&FAULT) && is_eq(m->part, p->info.typ->id->name)) break; if (p) { fprintf(fd, "\n", ns_remove(m->part)); fprintf(fd, " \n", ns_convert(m->part)); fprintf(fd, "\n\n"); flag = 0; if (custom_fault) { Table *r; r = (Table*)entry(classtable, lookup("SOAP_ENV__Detail"))->info.typ->ref; if (r) for (q = r->list; q; q = q->next) if (!is_transient(q->info.typ) && !is_repetition(q) && !is_anytype(q) && !(q->info.sto & Sattribute) && q->info.typ->type != Tfun && (!strcmp(q->sym->name, m->part) || !strcmp(q->sym->name + 1, m->part))) { flag = 1; break; } } if (!flag) { sprintf(errbuf, "//gsoap %s method-fault %s %s directive does not refer to a member of struct SOAP_ENV__Detail: suggest to define struct SOAP_ENV__Detail with member %s", sp->ns, m->name, m->part, m->part); semwarn(errbuf); } } else { sprintf(errbuf, "//gsoap %s method-fault %s %s directive does not refer to struct/class or typedef: should globablly define fault %s as type (typedef or struct/class)", sp->ns, m->name, m->part, m->part); semwarn(errbuf); } } } } } fflush(fd); if (sp && sp->porttype) fprintf(fd, "\n", sp->porttype); else fprintf(fd, "\n", ns_cname(name, "PortType")); if (protocol) { if (strncmp(protocol, "SOAP", 4)) { if (strstr(protocol, "GET")) mask = 0x2; else if (strstr(protocol, "PUT")) mask = 0x4; else /* POST */ mask = 0x8; } else mask = 0x1; } for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun && !(p->info.sto & Sextern) && has_ns_eq(ns, p->sym->name)) { comment = NULL; if (sp) { for (m = sp->list; m; m = m->next) { if (m->mess == COMMENT && is_eq_nons(m->name, p->sym->name)) comment = m->part; else if (m->mess == PROTOCOL) { if (strncmp(m->part, "SOAP", 4)) { if (strstr(m->part, "GET")) mask |= 0x2; else if (strstr(m->part, "PUT")) mask |= 0x4; else /* POST */ mask |= 0x8; } else mask |= 0x1; } } } if (!mask) { if (soap_version < 0) mask = 0x8; /* -0 option: use POST */ else mask = 0x1; } fprintf(fd, " \n", ns_remove(p->sym->name)); if (comment) fprintf(fd, " %s\n", comment); else fprintf(fd, " Service definition of function %s\n", p->sym->name); if (get_response(p->info.typ)) fprintf(fd, " \n", ns_remove(p->sym->name)); else fprintf(fd, " \n", ns_remove(p->sym->name)); q = (Entry*)p->info.typ->ref; if (q && is_transient(q->info.typ)) ; else if (q && !is_response(q->info.typ)) fprintf(fd, " \n", ns_remove(p->sym->name)); else if (q) fprintf(fd, " \n", ns_remove(((Tnode*)q->info.typ->ref)->id->name)); if (sp) for (m = sp->list; m; m = m->next) if ((m->mess&FAULT) && is_eq_nons(m->name, p->sym->name)) fprintf(fd, " \n", ns_remove(m->part), ns_remove(m->part)); fprintf(fd, " \n"); } } fprintf(fd, "\n\n"); for (prot = 0x1; prot <= 0x8; prot <<= 1) { if ((prot & mask)) { const char *v = "", *b = ""; switch (prot) { case 0x1: v = ""; b = "SOAP"; break; case 0x2: v = "GET"; b = "HTTP"; break; case 0x4: v = "PUT"; b = "HTTP"; break; case 0x8: v = "POST"; b = "HTTP"; break; } fprintf(fd, "porttype) fprintf(fd, "type=\"tns:%s\">\n porttype); else fprintf(fd, "type=\"tns:%s\">\n porttype) fprintf(fd, "type=\"tns:%s\">\n porttype); else fprintf(fd, "type=\"tns:%s\">\n transport) fprintf(fd, " transport=\"%s\"/>\n", sp->transport); else fprintf(fd, " transport=\"http://schemas.xmlsoap.org/soap/http\"/>\n"); } else { if (sp && sp->porttype) fprintf(fd, "type=\"tns:%s\">\n \n", sp->porttype, v); else fprintf(fd, "type=\"tns:%s\">\n \n", ns_cname(name, "PortType"), v); } fflush(fd); for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun && !(p->info.sto & Sextern) && has_ns_eq(ns, p->sym->name)) { action = ""; mimein = NULL; mimeout = NULL; method_style = style; method_encoding = encoding; method_response_encoding = NULL; if (sp) { int v = 0x1; if (sp->protocol) { if (strncmp(sp->protocol, "SOAP", 4)) { if (strstr(sp->protocol, "GET")) v = 0x2; else if (strstr(sp->protocol, "PUT")) v = 0x4; else /* POST */ v = 0x8; } } for (m = sp->list; m; m = m->next) { if (is_eq_nons(m->name, p->sym->name)) { if (m->mess&MIMEIN) mimein = m->part; if (m->mess&MIMEOUT) mimeout = m->part; if (m->mess == ENCODING) method_encoding = m->part; else if (m->mess == RESPONSE_ENCODING) method_response_encoding = m->part; else if (m->mess == STYLE) method_style = m->part; else if (m->mess == ACTION || m->mess == REQUEST_ACTION) action = m->part; else if (m->mess == RESPONSE_ACTION) action = m->part; else if (m->mess == PROTOCOL) { if (strncmp(m->part, "SOAP", 4)) { if (strstr(m->part, "GET")) v = 0x2; else if (strstr(m->part, "PUT")) v = 0x4; else /* POST */ v = 0x8; } else v = 0x1; } } } if (soap_version < 0) v = 0x8; if (prot != v) continue; } if (!method_response_encoding) method_response_encoding = method_encoding; fprintf(fd, " \n", ns_remove(p->sym->name)); if (prot == 0x1) { if (is_document(style)) { if (is_document(method_style)) { if (is_soap12(encoding) && !*action) fprintf(fd, " \n"); else if (*action == '"') fprintf(fd, " \n", action); else fprintf(fd, " \n", action); } else if (is_soap12(encoding) && !*action) fprintf(fd, " \n"); else if (*action == '"') fprintf(fd, " \n", action); else fprintf(fd, " \n", action); } else { if (is_document(method_style)) { if (is_soap12(encoding) && !*action) fprintf(fd, " \n"); else if (*action == '"') fprintf(fd, " \n", action); else fprintf(fd, " \n", action); } else if (is_soap12(encoding) && !*action) fprintf(fd, " \n"); else if (*action == '"') fprintf(fd, " \n", action); else fprintf(fd, " \n", action); } } else { if (!*action) fprintf(fd, " \n"); else if (*action == '"') fprintf(fd, " \n", action); else fprintf(fd, " \n", action); } fprintf(fd, " \n"); q = entry(classtable, p->sym); if (prot == 0x1) { if (mimein) fprintf(fd, " \n \n"); if (is_literal(method_encoding) || (q && (q = (((Table*)q->info.typ->ref)->list)) && q && is_XML(q->info.typ))) { if (is_document(method_style)) fprintf(fd, " \n"); else fprintf(fd, " \n", URI); } else { if (encoding && *encoding) fprintf(fd, " \n", URI, encoding); else if (method_encoding && *method_encoding) fprintf(fd, " \n", URI, method_encoding); else fprintf(fd, " \n", URI, encURI); if (!eflag) { sprintf(errbuf, "operation '%s' is not compliant with WS-I Basic Profile 1.0a, reason: uses SOAP encoding", p->sym->name); compliancewarn(errbuf); } } if (custom_header) { m = NULL; if (sp) { for (m = sp->list; m; m = m->next) if (is_eq_nons(m->name, p->sym->name) && (m->mess&HDRIN)) { if (chkhdr(m->part)) fprintf(fd, " \n", name, ns_remove(m->part)); } } } if (mimein) { if (sp) { for (m = sp->list; m; m = m->next) { if (is_eq_nons(m->name, p->sym->name) && (m->mess&MIMEIN)) fprintf(fd, " \n \n \n", m->part); } } fprintf(fd, " \n \n"); } } else if (prot == 0x2) fprintf(fd, " \n"); else { if (mimein) fprintf(fd, " \n", mimein); else if (!q || is_document(method_style)) fprintf(fd, " \n"); else fprintf(fd, " \n", ns_remove(q->sym->name)); } fprintf(fd, " \n"); q = (Entry*)p->info.typ->ref; if (!q || !q->info.typ->ref) { fprintf(fd, " \n"); continue; } if (prot != 0x4) { fprintf(fd, " \n"); if (prot == 0x1) { if (mimeout) fprintf(fd, " \n \n"); if (is_literal(method_response_encoding) || is_XML((Tnode*)q->info.typ->ref)) { if (is_document(method_style)) fprintf(fd, " \n"); else fprintf(fd, " \n", URI); } else if (encoding && *encoding) fprintf(fd, " \n", URI, encoding); else if (method_response_encoding && *method_response_encoding) fprintf(fd, " \n", URI, method_response_encoding); else fprintf(fd, " \n", URI, encURI); if (custom_header) { if (sp) for (m = sp->list; m; m = m->next) if (is_eq_nons(m->name, p->sym->name) && (m->mess&HDROUT)) { if (chkhdr(m->part)) fprintf(fd, " \n", name, ns_remove(m->part)); } } if (mimeout) { if (sp) { for (m = sp->list; m; m = m->next) { if (is_eq_nons(m->name, p->sym->name) && (m->mess&MIMEOUT)) fprintf(fd, " \n \n \n", m->part); } } fprintf(fd, " \n \n"); } } else { q = (Entry*)p->info.typ->ref; if (is_document(method_style)) fprintf(fd, " \n"); else if (q && !is_transient(q->info.typ) && !is_response(q->info.typ) && is_literal(method_response_encoding)) fprintf(fd, " \n", ns_remove(q->sym->name)); else fprintf(fd, " \n"); } fprintf(fd, " \n"); } if (sp) for (m = sp->list; m; m = m->next) if ((m->mess&FAULT) && is_eq_nons(m->name, p->sym->name)) fprintf(fd, " \n \n \n", ns_remove(m->part), ns_remove(m->part)); fprintf(fd, " \n"); fflush(fd); } } fprintf(fd, "\n\n"); } } } fprintf(fd, "\n", name); if (sp && sp->documentation) fprintf(fd, " %s\n", sp->documentation); else fprintf(fd, " gSOAP " VERSION " generated service definition\n"); if (executable) fprintf(fd, " \n \n ", portname, binding, URL, executable); for (prot = 0x1; prot <= 0x8; prot <<= 1) { if ((prot & mask)) { const char *s, *t, *v = "", *b = ""; switch (prot) { case 0x1: v = ""; b = "SOAP"; break; case 0x2: v = "GET"; b = "HTTP"; break; case 0x4: v = "PUT"; b = "HTTP"; break; case 0x8: v = "POST"; b = "HTTP"; break; } fprintf(fd, " \n", portname, v, binding, v); for (s = URL; s; s = t) { int n; t = strchr(s, ' '); if (t) { n = (int)(t - s); t++; } else n = (int)strlen(s); fprintf(fd, " <%s:address location=\"%.*s\"/>\n", b, n, s); } fprintf(fd, " \n"); } } fprintf(fd, "\n\n\n"); } const char * default_value(Entry *e) { const char *a; Entry *q; static char buf[4096]; buf[0] = '\0'; if (e->info.sto & Sconst) a = "fixed"; else a = "default"; if (e->info.hasval) { switch (e->info.typ->type) { case Tchar: case Twchar: case Tuchar: case Tshort: case Tushort: case Tint: case Tuint: case Tlong: case Tllong: case Tulong: case Tullong: case Tsize: sprintf(buf, " %s=\"" SOAP_LONG_FORMAT "\"", a, e->info.val.i); break; case Tfloat: case Tdouble: case Tldouble: sprintf(buf, " %s=\"%g\"", a, e->info.val.r); break; case Ttime: break; /* should get value? */ case Tenum: case Tenumsc: for (q = ((Table*)e->info.typ->ref)->list; q; q = q->next) { if (q->info.val.i == e->info.val.i) { sprintf(buf, " %s=\"%s\"", a, ns_remove2(q->sym->name, c_ident(e->info.typ))); break; } } break; default: if (e->info.val.s && strlen(e->info.val.s) < sizeof(buf)-12) sprintf(buf, " %s=\"%s\"", a, xstring(e->info.val.s)); break; } } return buf; } const char * nillable(Tnode *typ) { if (typ->type == Tpointer) return "true"; return "false"; } void gen_schema(FILE *fd, Table *t, const char *ns1, const char *ns, int all, const char *style, const char *encoding) { int i, d; char cbuf[4]; Entry *p, *q, *r; Tnode *n; Symbol *s; Service *sp, *sp2; Method *m; int flag; if (!strcmp(ns, "SOAP-ENV") || !strcmp(ns, "SOAP-ENC") || !strcmp(ns, "xsi") || !strcmp(ns, "xsd")) return; for (sp = services; sp; sp = sp->next) if (!tagcmp(sp->ns, ns) && sp->URI) break; if (sp && sp->import) return; fprintf(fd, " URI); else fprintf(fd, "targetNamespace=\"%s/%s.xsd\"", tmpURI, ns_convert(ns)); for (s = nslist; s; s = s->next) { for (sp2 = services; sp2; sp2 = sp2->next) if (!tagcmp(sp2->ns, s->name) && sp2->URI) break; if (sp2) fprintf(fd, "\n xmlns:%s=\"%s\"", ns_convert(s->name), sp2->URI); else if (!strcmp(s->name, "SOAP-ENV")) { if (soap_version >= 0) fprintf(fd, "\n xmlns:SOAP-ENV=\"%s\"", envURI); } else if (!strcmp(s->name, "SOAP-ENC")) { if (soap_version >= 0) fprintf(fd, "\n xmlns:SOAP-ENC=\"%s\"", encURI); } else if (!strcmp(s->name, "xsi")) fprintf(fd, "\n xmlns:xsi=\"%s\"", xsiURI); else if (!strcmp(s->name, "xsd")) fprintf(fd, "\n xmlns:xsd=\"%s\"", xsdURI); else fprintf(fd, "\n xmlns:%s=\"%s/%s.xsd\"", ns_convert(s->name), tmpURI, ns_convert(s->name)); } fprintf(fd, "\n xmlns=\"%s\"\n", xsdURI); if (sp && (sp->elementForm || sp->attributeForm)) fprintf(fd, " elementFormDefault=\"%s\"\n attributeFormDefault=\"%s\">\n", sp->elementForm?sp->elementForm:"unqualified", sp->attributeForm?sp->attributeForm:"unqualified"); else if (style && !strcmp(style, "document")) fprintf(fd, " elementFormDefault=\"qualified\"\n attributeFormDefault=\"unqualified\">\n"); else fprintf(fd, " elementFormDefault=\"unqualified\"\n attributeFormDefault=\"unqualified\">\n"); fflush(fd); flag = 0; for (s = nslist; s; s = s->next) { for (sp2 = services; sp2; sp2 = sp2->next) if (sp2 != sp && !tagcmp(sp2->ns, s->name) && sp2->URI) break; if (sp2) { fprintf(fd, " URI); if (sp2->import) fprintf(fd, " schemaLocation=\"%s\"", sp2->import); fprintf(fd, "/>\n"); if (!strcmp(sp2->URI, encURI)) flag = 1; } } if (!flag) fprintf(fd, " ", encURI); fprintf(fd, "\n"); fflush(fd); if (typetable) { for (p = typetable->list; p; p = p->next) { if (is_transient(p->info.typ) || is_invisible(p->sym->name) || p->info.typ->type == Ttemplate) continue; if (is_element(p->info.typ) && (p->info.typ->type == Tclass || p->info.typ->type == Tstruct) && !is_stdstr(p->info.typ)) continue; if ((!is_external(p->info.typ) || is_volatile(p->info.typ)) && ((has_ns_eq(ns, p->sym->name)))) { /* typedefs that are used for SOAP Fault details */ m = NULL; if (p->info.typ->type != Tstruct && p->info.typ->type != Tclass) { for (sp2 = services; sp2 && !m; sp2 = sp2->next) { for (m = sp2->list; m; m = m->next) { if ((m->mess&FAULT) && m->part && is_eq(m->part, p->sym->name)) break; } } } if (m) { if (!uflag) fprintf(fd, " \n"); fprintf(fd, " \n", ns_remove(p->sym->name), base_type(p->info.typ, ns1)); gen_type_documentation(fd, p, ns); fprintf(fd, " \n"); continue; } if (is_primitive_or_string(p->info.typ) || (p->info.typ->type == Tpointer && is_primitive_or_string((Tnode*)p->info.typ->ref))) { fprintf(fd, " ", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); if (p->info.typ->pattern && p->info.typ->pattern[0] == '%' && p->info.typ->pattern[1]) { unsigned int n = (unsigned int)strtoul(p->info.typ->pattern + 1, NULL, 10); unsigned int f = 0; const char *s = strchr(p->info.typ->pattern, '.'); if (s) f = (unsigned int)strtoul(s + 1, NULL, 10); if (s && f && (p->info.typ->type == Tfloat || p->info.typ->type == Tdouble || p->info.typ->type == Tldouble)) { fprintf(fd, " \n", base_type(p->info.typ, ns1)); if (n) fprintf(fd, " \n", n); fprintf(fd, " \n", f); } else if (n && (p->info.typ->type == Tfloat || p->info.typ->type == Tdouble || p->info.typ->type == Tldouble)) { fprintf(fd, " \n", base_type(p->info.typ, ns1)); fprintf(fd, " \n", n); } else if (n && p->info.typ->type >= Tchar && p->info.typ->type <= Tullong) { fprintf(fd, " \n", base_type(p->info.typ, ns1)); fprintf(fd, " \n", n); } else { fprintf(fd, " \n", base_type(p->info.typ, ns1)); } } else { fprintf(fd, " \n", base_type(p->info.typ, ns1)); if (p->info.typ->pattern) fprintf(fd, " \n", p->info.typ->pattern); } if (is_primitive(p->info.typ) || (p->info.typ->type == Tpointer && is_primitive((Tnode*)p->info.typ->ref) && !is_string(p->info.typ) && !is_wstring(p->info.typ))) { if (p->info.typ->hasmin) { if (p->info.typ->type >= Tfloat && p->info.typ->type <= Tldouble) { if (p->info.typ->incmin) fprintf(fd, " \n", p->info.typ->min); else fprintf(fd, " \n", p->info.typ->min); } else { if (p->info.typ->incmin) fprintf(fd, " \n", (LONG64)p->info.typ->min); else fprintf(fd, " \n", (LONG64)p->info.typ->min); } } if (p->info.typ->hasmax) { if (p->info.typ->type >= Tfloat && p->info.typ->type <= Tldouble) { if (p->info.typ->incmax) fprintf(fd, " \n", p->info.typ->max); else fprintf(fd, " \n", p->info.typ->max); } else { if (p->info.typ->incmax) fprintf(fd, " \n", (LONG64)p->info.typ->max); else fprintf(fd, " \n", (LONG64)p->info.typ->max); } } } else { if (p->info.typ->hasmax && p->info.typ->max >= 0 && p->info.typ->incmin && p->info.typ->incmax && p->info.typ->min == p->info.typ->max) fprintf(fd, " \n", (ULONG64)p->info.typ->max); else { if (p->info.typ->hasmin && p->info.typ->min >= 0) { if (p->info.typ->incmin) fprintf(fd, " \n", (ULONG64)p->info.typ->min); else fprintf(fd, " \n", (ULONG64)p->info.typ->min + 1); } if (p->info.typ->hasmax && p->info.typ->max >= 0) { if (p->info.typ->incmax) fprintf(fd, " \n", (ULONG64)p->info.typ->max); else fprintf(fd, " \n", (ULONG64)p->info.typ->max - 1); } } } fprintf(fd, " \n \n"); } else if (is_fixedstring(p->info.typ)) { fprintf(fd, " ", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " \n", base_type(p->info.typ, ns1)); if (p->info.typ->hasmin && p->info.typ->min >= 0) { if (p->info.typ->incmin) fprintf(fd, " \n", (ULONG64)p->info.typ->min); else fprintf(fd, " \n", (ULONG64)p->info.typ->min + 1); } if (p->info.typ->hasmax && p->info.typ->max >= 0) { if (p->info.typ->incmax) fprintf(fd, " \n", (ULONG64)p->info.typ->max); else fprintf(fd, " \n", (ULONG64)p->info.typ->max - 1); } else fprintf(fd, " \n", get_dimension(p->info.typ) - 1); fprintf(fd, " \n \n"); } else { fprintf(fd, " ", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " \n \n", base_type(p->info.typ, ns1)); fprintf(fd, " \n \n \n"); } } } } fflush(fd); if (enumtable) { for (p = enumtable->list; p; p = p->next) { if (!is_transient(p->info.typ) && !is_invisible(p->sym->name) && ((!has_ns(p->info.typ) && all) || has_ns_eq(ns, p->sym->name))) { flag = 0; if ((Table*)p->info.typ->ref) { for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next) { if (!has_ns_eq(NULL, ns_remove2(q->sym->name, c_ident(p->info.typ)))) { flag = 1; break; } } if (flag == 1) { for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next) { const char *s = ns_remove2(q->sym->name, c_ident(p->info.typ)); while (*s && isdigit(*s)) s++; if (*s) { flag = 2; break; } } } } fprintf(fd, " ", wsdl_type(p->info.typ, NULL)); gen_type_documentation(fd, p, ns); if (is_mask(p->info.typ)) { fprintf(fd, " \n"); if (flag == 0) fprintf(fd, " \n"); else if (flag == 1) fprintf(fd, " \n"); else fprintf(fd, " \n"); if ((Table*)p->info.typ->ref) { for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next) { fprintf(fd, " sym->name, c_ident(p->info.typ))); if (gen_member_documentation(fd, p->sym, q, ns, q->info.typ->type == Tenumsc)) fprintf(fd, " "); if (!uflag) fprintf(fd, " \n", q->info.val.i); } } fprintf(fd, " \n \n \n"); } else { if (flag == 0) fprintf(fd, " \n"); else if (flag == 1) fprintf(fd, " \n"); else fprintf(fd, " \n"); if ((Table*)p->info.typ->ref) { for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next) { fprintf(fd, " sym->name, c_ident(p->info.typ))); if (gen_member_documentation(fd, p->sym, q, ns, q->info.typ->type == Tenumsc)) fprintf(fd, " "); if (!uflag) fprintf(fd, " \n", q->info.val.i); } } fprintf(fd, " \n \n"); } } } } fflush(fd); if (classtable) { for (p = classtable->list; p; p = p->next) { if (is_transient(p->info.typ) || is_invisible(p->sym->name)) continue; for (q = t->list; q; q = q->next) if (q->info.typ->type == Tfun && !(q->info.sto & Sextern) && p == get_response(q->info.typ)) break; /* omit the auto-generated and user-defined response struct/class (when necessary) */ if (!q) for (q = t->list; q; q = q->next) if (q->info.typ->type == Tfun && !(q->info.sto & Sextern) && !has_ns_eq(NULL, ((Entry*)q->info.typ->ref)->sym->name)) { r = entry(t, q->sym); if (r && r->info.typ->ref && is_response(((Entry*)r->info.typ->ref)->info.typ) && p->info.typ == (Tnode*)((Entry*)r->info.typ->ref)->info.typ->ref) break; } if (q) continue; /* classes that are used for SOAP Fault details */ m = NULL; for (sp2 = services; sp2 && !m; sp2 = sp2->next) for (m = sp2->list; m; m = m->next) if ((m->mess&FAULT) && m->part && is_eq(m->part, p->sym->name)) break; if (m) { if ((!has_ns(p->info.typ) && all) || has_ns_eq(ns, p->sym->name)) { if (!uflag) fprintf(fd, " \n"); fprintf(fd, " \n", ns_remove(p->sym->name), base_type(p->info.typ, ns1)); gen_type_documentation(fd, p, ns); fprintf(fd, " \n"); } } if (p->info.typ->ref && is_binary(p->info.typ)) { if ((!has_ns(p->info.typ) && all) || has_ns_eq(ns, p->sym->name)) { if (is_attachment(p->info.typ)) { fprintf(fd, " ", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " \n \n"); if (!eflag) fprintf(fd, " \n"); gen_schema_attributes(fd, p->info.typ, ns, ns1); fprintf(fd, " \n \n \n"); } else { fprintf(fd, " ", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " \n"); if (p->info.typ->hasmax && p->info.typ->max >= 0 && p->info.typ->incmin && p->info.typ->incmax && p->info.typ->min == p->info.typ->max) fprintf(fd, " \n", (ULONG64)p->info.typ->min); else { if (p->info.typ->hasmin && p->info.typ->min >= 0) { if (p->info.typ->incmin) fprintf(fd, " \n", (ULONG64)p->info.typ->min); else fprintf(fd, " \n", (ULONG64)p->info.typ->min + 1); } if (p->info.typ->hasmax && p->info.typ->max >= 0) { if (p->info.typ->incmax) fprintf(fd, " \n", (ULONG64)p->info.typ->max); else fprintf(fd, " \n", (ULONG64)p->info.typ->max - 1); } } fprintf(fd, " \n \n"); } } } else if (p->info.typ->ref && !is_transient(p->info.typ) && is_primclass(p->info.typ)) { if ((!has_ns(p->info.typ) && all) || has_ns_eq(ns, p->sym->name)) { q = ((Table*)p->info.typ->ref)->list; if (q && strncmp(q->sym->name, "xsd__anyType", 12)) { if (is_string(q->info.typ) || is_wstring(q->info.typ) || is_stdstring(q->info.typ) || is_stdwstring(q->info.typ)) { fprintf(fd, " ", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " \n \n", wsdl_type(q->info.typ, ns1)); gen_schema_attributes(fd, p->info.typ, ns, ns1); fprintf(fd, " \n \n \n"); } else if (is_primitive(q->info.typ) && q->info.typ->type != Tenum && q->info.typ->type != Tenumsc) { fprintf(fd, " ", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " \n \n", wsdl_type(q->info.typ, ns1)); gen_schema_attributes(fd, p->info.typ, ns, ns1); fprintf(fd, " \n \n \n"); } else if (!has_ns(q->info.typ)) { fprintf(fd, " ", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " \n \n", wsdl_type(q->info.typ, ns1)); gen_schema_attributes(fd, p->info.typ, ns, ns1); fprintf(fd, " \n \n \n"); } } } } else if (p->info.typ->ref && !is_transient(p->info.typ)) { q = ((Table*)p->info.typ->ref)->list; if (entry(t, p->sym) && (!q || !is_XML(q->info.typ))) ; else if (is_dynamic_array(p->info.typ)) { if (eflag || (!has_ns(p->info.typ) && !is_untyped(p->info.typ))) { if (all) { d = get_Darraydims(p->info.typ)-1; for (i = 0; i < d; i++) cbuf[i] = ','; cbuf[i] = '\0'; if (q->info.maxOccurs == 1) { fprintf(fd, " \n \n", wsdl_type(p->info.typ, NULL)); if (!is_literal(encoding)) fprintf(fd, " \n"); fprintf(fd, " \n \n \n", q->sym->name[5]?ns_remove(q->sym->name+5):"item", wsdl_type(q->info.typ, ns1), nillable((Tnode*)q->info.typ->ref)); if (!is_literal(encoding)) fprintf(fd, " \n \n", wsdl_type(p->info.typ, NULL), cbuf); fprintf(fd, " \n \n"); } else { fprintf(fd, " \n \n", wsdl_type(p->info.typ, NULL)); if (!is_literal(encoding)) fprintf(fd, " \n"); fprintf(fd, " \n \n \n", q->sym->name[5]?ns_remove(q->sym->name+5):"item", wsdl_type(q->info.typ, ns1), q->info.minOccurs, q->info.maxOccurs, nillable((Tnode*)q->info.typ->ref)); if (!is_literal(encoding)) fprintf(fd, " \n \n", wsdl_type(q->info.typ, ns1), cbuf); fprintf(fd, " \n \n"); } } } else if (p->info.typ->ref && ((Table*)p->info.typ->ref)->prev && !is_transient(entry(classtable, ((Table*)p->info.typ->ref)->prev->sym)->info.typ) && strncmp(((Table*)p->info.typ->ref)->prev->sym->name, "xsd__anyType", 12)) { if (q->info.maxOccurs == 1) { fprintf(fd, " ", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " \n \n \n", ns_convert(((Table*)p->info.typ->ref)->prev->sym->name)); fprintf(fd, " \n", q->sym->name[5]?ns_remove(q->sym->name+5):"item", wsdl_type(q->info.typ, ns1)); fprintf(fd, " \n \n \n"); gen_schema_attributes(fd, p->info.typ, ns, ns1); fprintf(fd, " \n"); } else { fprintf(fd, " ", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " \n \n \n", ns_convert(((Table*)p->info.typ->ref)->prev->sym->name)); fprintf(fd, " \n", q->sym->name[5]?ns_remove(q->sym->name+5):"item", wsdl_type(q->info.typ, ns1), q->info.minOccurs, q->info.maxOccurs, nillable((Tnode*)q->info.typ->ref)); fprintf(fd, " \n \n \n"); gen_schema_attributes(fd, p->info.typ, ns, ns1); fprintf(fd, " \n"); } } else { if (q->info.maxOccurs == 1) { fprintf(fd, " ", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " \n \n \n \n", q->sym->name[5]?ns_remove(q->sym->name+5):"item", wsdl_type(q->info.typ, ns1), nillable((Tnode*)q->info.typ->ref)); } else { fprintf(fd, " ", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " \n \n \n \n", q->sym->name[5]?ns_remove(q->sym->name+5):"item", wsdl_type(q->info.typ, ns1), q->info.minOccurs, q->info.maxOccurs, nillable((Tnode*)q->info.typ->ref)); } } } else if (is_discriminant(p->info.typ) && ((!has_ns(p->info.typ) && all) || has_ns_eq(ns, p->sym->name))) { if (p->info.typ->ref) { fprintf(fd, " \n", ns_remove(p->sym->name)); gen_schema_elements(fd, p->info.typ, ns, ns1); fprintf(fd, " \n"); } } else if (p->info.typ->type == Tstruct && ((!has_ns(p->info.typ) && all) || has_ns_eq(ns, p->sym->name))) { if (p->info.typ->ref) { fprintf(fd, " ", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " \n"); gen_schema_elements(fd, p->info.typ, ns, ns1); fprintf(fd, " \n"); gen_schema_attributes(fd, p->info.typ, ns, ns1); fprintf(fd, " \n"); } } else if (p->info.typ->type == Tclass && ((!has_ns(p->info.typ) && all) || has_ns_eq(ns, p->sym->name))) { if (p->info.typ->ref) { if (((Table*)p->info.typ->ref)->prev && !is_transient(entry(classtable, ((Table*)p->info.typ->ref)->prev->sym)->info.typ) && strncmp(((Table*)p->info.typ->ref)->prev->sym->name, "xsd__anyType", 12)) { fprintf(fd, " ", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " \n \n \n", ns_convert(((Table*)p->info.typ->ref)->prev->sym->name)); gen_schema_elements(fd, p->info.typ, ns, ns1); fprintf(fd, " \n \n \n"); gen_schema_attributes(fd, p->info.typ, ns, ns1); fprintf(fd, " \n"); } else { fprintf(fd, " ", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " \n"); gen_schema_elements(fd, p->info.typ, ns, ns1); fprintf(fd, " \n"); gen_schema_attributes(fd, p->info.typ, ns, ns1); fprintf(fd, " \n"); } } } } } } fflush(fd); for (n = Tptr[Tarray]; n; n = n->next) { if (is_transient(n) || is_fixedstring(n)) continue; if (is_literal(encoding)) fprintf(fd, " \n \n \n \n \n \n \n", c_ident(n), wsdl_type((Tnode*)n->ref, ns1), get_dimension(n)); else fprintf(fd, " \n \n \n \n \n \n \n", c_ident(n), xsi_type((Tnode*)n->ref), get_dimension(n)); fflush(fd); } gen_schema_elements_attributes(fd, t, ns, ns1, style, encoding); fprintf(fd, " \n\n"); } void gen_schema_elements(FILE *fd, Tnode *p, const char *ns, const char *ns1) { Entry *q; for (q = ((Table*)p->ref)->list; q; q = q->next) if (gen_schema_element(fd, p, q, ns, ns1)) q = q->next; } int gen_schema_element(FILE *fd, Tnode *p, Entry *q, const char *ns, const char *ns1) { const char *s, *t; if (is_transient(q->info.typ) || (q->info.sto & Sattribute) || q->info.typ->type == Tfun || q->info.typ->type == Tunion) return 0; if (is_repetition(q)) { if (is_sequence(q->next)) { fprintf(fd, " \n"); if (q->next->info.typ->ref) gen_schema_elements(fd, (Tnode*)q->next->info.typ->ref, ns, ns1); fprintf(fd, " \n"); return 1; } t = ns_convert(q->next->sym->name); if (*t == '-') fprintf(fd, " \n", q->next->sym->name); else if ((s = strchr(t+1, ':')) && (!strchr(q->next->sym->name+1, ':') || !has_ns_eq(ns, q->next->sym->name))) { if (((Tnode*)q->next->info.typ->ref)->type == Tpointer) { if (q->info.maxOccurs == 1) fprintf(fd, " info.minOccurs); else fprintf(fd, " info.minOccurs, q->info.maxOccurs); } else if (q->info.maxOccurs == 1) fprintf(fd, " info.minOccurs); else fprintf(fd, " info.minOccurs, q->info.maxOccurs); if (gen_member_documentation(fd, p->id, q, ns, 1)) fprintf(fd, " \n"); } else { const char *form = ""; if (!s) { s = t; if (*s == ':') { s++; form = " form=\"unqualified\""; } } else { s++; form = " form=\"qualified\""; } if (((Tnode*)q->next->info.typ->ref)->type == Tpointer) { if (q->info.maxOccurs == 1) fprintf(fd, " next->info.typ->ref, ns1), q->info.minOccurs, form); else fprintf(fd, " next->info.typ->ref, ns1), q->info.minOccurs, q->info.maxOccurs, form); } else if (q->info.maxOccurs == 1) fprintf(fd, " next->info.typ->ref, ns1), q->info.minOccurs, form); else fprintf(fd, " next->info.typ->ref, ns1), q->info.minOccurs, q->info.maxOccurs, form); if (gen_member_documentation(fd, p->id, q, ns, 1)) fprintf(fd, " \n"); } return 1; } else if ((q->info.typ->type == Ttemplate && !is_smart(q->info.typ)) || (q->info.typ->type == Tpointer && ((Tnode*)q->info.typ->ref)->type == Ttemplate) || (q->info.typ->type == Treference && ((Tnode*)q->info.typ->ref)->type == Ttemplate) || (q->info.typ->type == Trvalueref && ((Tnode*)q->info.typ->ref)->type == Ttemplate)) { t = ns_convert(q->sym->name); if (*t == '-') fprintf(fd, " \n", q->sym->name); else if ((s = strchr(t+1, ':')) && (!strchr(q->sym->name+1, ':') || !has_ns_eq(ns, q->sym->name))) { if (((Tnode*)q->info.typ->ref)->type == Tpointer) { if (q->info.maxOccurs == 1) fprintf(fd, " info.minOccurs); else fprintf(fd, " info.minOccurs, q->info.maxOccurs); } else if (q->info.maxOccurs == 1) fprintf(fd, " info.minOccurs); else fprintf(fd, " info.minOccurs, q->info.maxOccurs); if (gen_member_documentation(fd, p->id, q, ns, 1)) fprintf(fd, " \n"); } else { const char *form = ""; if (!s) { s = t; if (*s == ':') { s++; form = " form=\"unqualified\""; } } else { s++; form = " form=\"qualified\""; } if (((Tnode*)q->info.typ->ref)->type == Tpointer) { if (q->info.maxOccurs == 1) fprintf(fd, " info.typ->ref, ns1), q->info.minOccurs, form); else fprintf(fd, " info.typ->ref, ns1), q->info.minOccurs, q->info.maxOccurs, form); } else if (q->info.maxOccurs == 1) fprintf(fd, " info.typ->ref, ns1), q->info.minOccurs, form); else fprintf(fd, " info.typ->ref, ns1), q->info.minOccurs, q->info.maxOccurs, form); if (gen_member_documentation(fd, p->id, q, ns, 1)) fprintf(fd, " \n"); } } else if (is_anytype(q)) /* ... maybe need to show all possible types rather than xsd:anyType */ { fprintf(fd, " \n", ns_convert(q->next->sym->name), q->info.minOccurs, q->info.maxOccurs); return 1; } else if (is_choice(q)) { if (q->info.minOccurs == 0) fprintf(fd, " \n"); else fprintf(fd, " \n"); if (q->next->info.typ->ref) gen_schema_elements(fd, q->next->info.typ, ns, ns1); fprintf(fd, " \n"); return 1; } else if (is_sequence(q)) { if (q->info.minOccurs == 0) fprintf(fd, " \n"); else fprintf(fd, " \n"); if (q->info.typ->type == Tpointer) gen_schema_elements(fd, (Tnode*)q->info.typ->ref, ns, ns1); else if (q->info.typ->ref) gen_schema_elements(fd, q->info.typ, ns, ns1); fprintf(fd, " \n"); return 0; } else { t = ns_convert(q->sym->name); if (*t == '-') fprintf(fd, " \n", q->sym->name); else if ((s = strchr(t+1, ':')) && (!strchr(q->sym->name+1, ':') || !has_ns_eq(ns, q->sym->name))) { if (is_smart(q->info.typ) || q->info.typ->type == Tpointer || q->info.typ->type == Tarray || is_dynamic_array(q->info.typ)) fprintf(fd, " info.minOccurs, q->info.maxOccurs); else fprintf(fd, " info.minOccurs, q->info.maxOccurs); if (gen_member_documentation(fd, p->id, q, ns, 1)) fprintf(fd, " \n"); } else { const char *form = ""; if (!s) { s = t; if (*s == ':') { s++; form = " form=\"unqualified\""; } } else { s++; form = " form=\"qualified\""; } if (is_smart(q->info.typ) || q->info.typ->type == Tpointer || q->info.typ->type == Tarray || is_dynamic_array(q->info.typ)) fprintf(fd, " info.typ, ns1), q->info.minOccurs, q->info.maxOccurs, default_value(q), form); else fprintf(fd, " info.typ, ns1), q->info.minOccurs, q->info.maxOccurs, default_value(q), form); if (gen_member_documentation(fd, p->id, q, ns, 1)) fprintf(fd, " \n"); } } fflush(fd); return 0; } void gen_schema_elements_attributes(FILE *fd, Table *t, const char *ns, const char *ns1, const char *style, const char *encoding) { Entry *p, *q, *e; Table *elt, *att; Service *sp; Method *m; Symbol *sym; const char *s, *method_style, *method_encoding, *method_response_encoding; int all = !strcmp(ns, ns1); elt = mktable(NULL); att = mktable(NULL); if (t && all) { for (p = t->list; p; p = p->next) { if (!eflag && p->info.typ->type == Tfun && !(p->info.sto & Sextern) && has_ns_eq(ns, p->sym->name)) { method_encoding = encoding; method_response_encoding = NULL; method_style = style; for (sp = services; sp; sp = sp->next) { if (!tagcmp(sp->ns, ns)) { for (m = sp->list; m; m = m->next) { if (is_eq_nons(m->name, p->sym->name)) { if (m->mess == ENCODING) method_encoding = m->part; else if (m->mess == RESPONSE_ENCODING) method_response_encoding = m->part; else if (m->mess == STYLE) method_style = m->part; } } } } if (!method_response_encoding) method_response_encoding = method_encoding; q = entry(classtable, p->sym); if (q) { if (is_document(method_style)) { if (!is_invisible(p->sym->name)) { sym = p->sym; s = sym->name; if (*s == '_' && !(sym = lookup(s + 1))) sym = install(s + 1, ID); if (!entry(elt, sym)) { if (!uflag) fprintf(fd, " \n"); fprintf(fd, " \n \n \n", ns_remove(p->sym->name)); gen_schema_elements(fd, q->info.typ, ns, ns1); fprintf(fd, " \n"); gen_schema_attributes(fd, q->info.typ, ns, ns1); fprintf(fd, " \n \n"); e = enter(elt, sym); e->info = p->info; } } else { for (q = ((Table*)q->info.typ->ref)->list; q; q = q->next) { if (!(q->info.sto & Sextern) && !has_ns_eq(NULL, q->sym->name)) { sym = q->sym; s = sym->name; if (*s == '_' && !(sym = lookup(s + 1))) sym = install(s + 1, ID); if (!entry(elt, sym)) /* enter/entry w/o prefix is not useful to avoid clashes */ { if (!uflag) fprintf(fd, " \n"); fprintf(fd, " \n", ns_remove(q->sym->name), wsdl_type(q->info.typ, ns1)); e = enter(elt, sym); e->info = q->info; } } } } } q = (Entry*)p->info.typ->ref; for (e = t->list; e; e = e->next) if (e != p && e->info.typ->type == Tfun && !(e->info.sto & Sextern) && q == (Entry*)e->info.typ->ref) q = NULL; if (q && !is_transient(q->info.typ)) { if (!is_response(q->info.typ)) { if (is_document(method_style)) { if (!uflag) fprintf(fd, " \n"); fprintf(fd, " \n \n", ns_remove(p->sym->name)); fprintf(fd, " \n"); gen_schema_element(fd, p->info.typ, q, ns, ns1); fprintf(fd, " \n"); fprintf(fd, " \n \n"); } } else if (((Tnode*)q->info.typ->ref)->ref) { if (is_document(method_style)) { if (!has_ns_eq(NULL, q->sym->name)) { sym = ((Tnode*)q->info.typ->ref)->id; s = sym->name; if (*s == '_' && !(sym = lookup(s + 1))) sym = install(s + 1, ID); if (!entry(elt, sym)) { if (!uflag) fprintf(fd, " \n"); fprintf(fd, " \n \n", ns_remove(((Tnode*)q->info.typ->ref)->id->name)); fprintf(fd, " \n"); gen_schema_elements(fd, (Tnode*)q->info.typ->ref, ns, ns1); fprintf(fd, " \n"); gen_schema_attributes(fd, (Tnode*)q->info.typ->ref, ns, ns1); fprintf(fd, " \n \n"); e = enter(elt, sym); e->info = q->info; } } } } } } } } } if (t && !eflag) { for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun && !(p->info.sto & Sextern)) { q = (Entry*)p->info.typ->ref; if (q && !is_transient(q->info.typ)) { if (is_response(q->info.typ)) { if (has_ns_eq(ns, q->sym->name)) { sym = q->sym; s = sym->name; if (*s == '_' && !(sym = lookup(s + 1))) sym = install(s + 1, ID); if (!entry(elt, sym)) { if (!uflag) fprintf(fd, " \n"); fprintf(fd, " \n", ns_remove(q->sym->name), wsdl_type(q->info.typ, ns1)); e = enter(elt, sym); e->info = q->info; } } } } } } } for (p = typetable->list; p; p = p->next) { if (is_transient(p->info.typ) || is_primclass(p->info.typ) || is_dynamic_array(p->info.typ)) continue; if (is_element(p->info.typ) && has_ns_eq(ns, p->sym->name)) { m = NULL; for (sp = services; sp && !m; sp = sp->next) for (m = sp->list; m; m = m->next) if ((m->mess&FAULT) && m->part && is_eq(m->part, p->sym->name)) break; if (!m) { sym = p->sym; s = sym->name; if (*s == '_' && !(sym = lookup(s + 1))) sym = install(s + 1, ID); if (!entry(elt, sym)) { fprintf(fd, " \n", ns_remove(p->sym->name), base_type(p->info.typ, ns1)); e = enter(elt, sym); e->info = p->info; } } } } for (p = classtable->list; p; p = p->next) { if (!p->info.typ->ref || /* is_invisible(p->info.typ->id->name) || */ is_transient(p->info.typ) || is_primclass(p->info.typ) || is_dynamic_array(p->info.typ)) continue; for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next) { if (!is_repetition(q) && !is_anytype(q) && (!strchr(q->sym->name+1, ':') || !eq_ns(p->sym->name, q->sym->name)) && has_ns_eq(ns, q->sym->name) && !is_transient(q->info.typ) && q->info.typ->type != Tfun) { m = NULL; for (sp = services; sp && !m; sp = sp->next) for (m = sp->list; m; m = m->next) if ((m->mess&FAULT) && m->part && is_eq(m->part, q->sym->name)) break; if (m) continue; /* already generated element for fault */ if (!(q->info.sto & Sattribute) && (q->info.typ->type == Tclass || q->info.typ->type == Tstruct || is_typedef(q->info.typ))) if (is_element(q->info.typ) || is_eq(q->info.typ->id->name, q->sym->name)) continue; /* type is already an element or type name matches member name */ sym = q->sym; s = sym->name; if (*s == '_' && !(sym = lookup(s + 1))) sym = install(s + 1, ID); if (q->info.sto & Sattribute) { e = entry(att, sym); if (e) { if ((!is_primitive(q->info.typ) || e->info.typ->type != q->info.typ->type) && reftype(e->info.typ) != reftype(q->info.typ)) { sprintf(errbuf, "Member '%s::%s' of type '%s' at line %d has a type that does not correspond to the required unique type '%s' defined for root-level attribute '%s'", p->sym->name, q->sym->name, c_type(q->info.typ), q->lineno, c_type(e->info.typ), ns_convert(q->sym->name)); semwarn(errbuf); } } else { fprintf(fd, " \n", ns_remove(q->sym->name), wsdl_type(q->info.typ, ns1)); e = enter(att, sym); e->info = q->info; } } else { e = entry(elt, sym); if (e) { if ((!is_primitive(q->info.typ) || e->info.typ->type != q->info.typ->type) && reftype(e->info.typ) != reftype(q->info.typ)) { sprintf(errbuf, "Member '%s::%s' of type '%s' at line %d has a type that does not correspond to the required unique type '%s' defined for root-level element '%s'", p->sym->name, q->sym->name, c_type(q->info.typ), q->lineno, c_type(e->info.typ), ns_convert(q->sym->name)); semwarn(errbuf); } } else { fprintf(fd, " \n", ns_remove(q->sym->name), wsdl_type(q->info.typ, ns1)); e = enter(elt, sym); e->info = q->info; } } } } if (is_element(p->info.typ) && has_ns_eq(ns, p->sym->name)) { m = NULL; for (sp = services; sp && !m; sp = sp->next) for (m = sp->list; m; m = m->next) if ((m->mess&FAULT) && m->part && is_eq(m->part, p->sym->name)) break; if (!m) { sym = p->sym; s = sym->name; if (*s == '_' && !(sym = lookup(s + 1))) sym = install(s + 1, ID); if (!entry(elt, sym)) { fprintf(fd, " \n", ns_remove(p->sym->name), wsdl_type(p->info.typ, ns1)); e = enter(elt, sym); e->info = p->info; } } } } freetable(elt); freetable(att); } void gen_schema_attributes(FILE *fd, Tnode *p, const char *ns, const char *ns1) { Entry *q; const char *t, *s, *r; for (q = ((Table*)p->ref)->list; q; q = q->next) { if (q->info.sto & Sattribute && !(q->info.sto & (Sprivate | Sprotected))) { r = default_value(q); t = ns_convert(q->sym->name); if (*t == '-' || is_anyAttribute(q->info.typ)) fprintf(fd, " \n", q->sym->name); else if ((s = strchr(t+1, ':')) && (!strchr(q->sym->name+1, ':') || !has_ns_eq(ns, q->sym->name))) { if (r && *r) fprintf(fd, " \n", t, r); else if ((!is_smart(q->info.typ) && q->info.typ->type != Tpointer) || q->info.minOccurs) fprintf(fd, " \n", t); else if (q->info.maxOccurs == 0) fprintf(fd, " \n", t); else fprintf(fd, " \n", t); } else { const char *form = ""; if (!s) { s = t; if (*s == ':') { s++; form = " form=\"unqualified\""; } } else { s++; form = " form=\"qualified\""; } if (r && *r) fprintf(fd, " info.typ, ns1), r, form); else if ((!is_smart(q->info.typ) && q->info.typ->type != Tpointer) || q->info.minOccurs) fprintf(fd, " info.typ, ns1), form); else if (q->info.maxOccurs == 0) fprintf(fd, " info.typ, ns1)); else fprintf(fd, " info.typ, ns1), form); if (gen_member_documentation(fd, p->id, q, ns, 1)) fprintf(fd, " \n"); } fflush(fd); } } } void gen_type_documentation(FILE *fd, Entry *type, const char *ns) { Service *sp; Data *d; if (!type->sym) { fprintf(fd, "\n"); return; } for (sp = services; sp; sp = sp->next) { if (!tagcmp(sp->ns, ns)) { for (d = sp->data; d; d = d->next) { if (!strstr(d->name, "::") && is_eq_nons(d->name, type->sym->name)) { fprintf(fd, "\n \n %s\n \n", d->text); return; } } } } if (!uflag) fprintf(fd, "", type->sym->name); fprintf(fd, "\n"); } int gen_member_documentation(FILE *fd, Symbol *type, Entry *member, const char *ns, int scope) { Service *sp; Data *d; const char *t; if (!type || !member->sym) { fprintf(fd, "/>\n"); return 0; } t = ns_remove(type->name); for (sp = services; sp; sp = sp->next) { if (!tagcmp(sp->ns, ns)) { for (d = sp->data; d; d = d->next) { const char *s = strstr(d->name, "::"); if (s && !strncmp(t, d->name, s-d->name) && !strcmp(s + 2, member->sym->name)) { fprintf(fd, ">\n \n %s\n \n", d->text); return 1; } } } } fprintf(fd, "/>"); if (!uflag) { if (scope) fprintf(fd, "", type->name, member->sym->name); else fprintf(fd, "", member->sym->name); } fprintf(fd, "\n"); return 0; } void gen_nsmap(FILE *fd) { Symbol *ns1; Service *sp; fprintf(fd, "{\n"); for (ns1 = nslist; ns1; ns1 = ns1->next) { for (sp = services; sp; sp = sp->next) if (!tagcmp(sp->ns, ns1->name) && sp->URI) break; if (sp) { if (!strcmp(ns1->name, "SOAP-ENV")) { if (soap_version < 0) fprintf(fd, "\t{\"SOAP-ENV\", NULL, NULL, NULL},\n"); else fprintf(fd, "\t{\"%s\", \"%s\", \"%s\", NULL},\n", ns_convert(ns1->name), sp->URI, sp->URI2 ? sp->URI2 : envURI); } else if (!strcmp(ns1->name, "SOAP-ENC")) { if (soap_version < 0) fprintf(fd, "\t{\"SOAP-ENC\", NULL, NULL, NULL},\n"); else fprintf(fd, "\t{\"%s\", \"%s\", \"%s\", NULL},\n", ns_convert(ns1->name), sp->URI, sp->URI2 ? sp->URI2 : encURI); } else if (sp->URI2) fprintf(fd, "\t{\"%s\", \"%s\", \"%s\", NULL},\n", ns_convert(ns1->name), sp->URI, sp->URI2); else fprintf(fd, "\t{\"%s\", \"%s\", NULL, NULL},\n", ns_convert(ns1->name), sp->URI); } else if (!strcmp(ns1->name, "SOAP-ENV")) { if (soap_version < 0) fprintf(fd, "\t{\"SOAP-ENV\", NULL, NULL, NULL},\n"); else if (is_soap12(NULL)) fprintf(fd, "\t{\"SOAP-ENV\", \"%s\", \"http://schemas.xmlsoap.org/soap/envelope/\", NULL},\n", envURI); else fprintf(fd, "\t{\"SOAP-ENV\", \"%s\", \"http://www.w3.org/*/soap-envelope\", NULL},\n", envURI); } else if (!strcmp(ns1->name, "SOAP-ENC")) { if (soap_version < 0) fprintf(fd, "\t{\"SOAP-ENC\", NULL, NULL, NULL},\n"); else if (is_soap12(NULL)) fprintf(fd, "\t{\"SOAP-ENC\", \"%s\", \"http://schemas.xmlsoap.org/soap/encoding/\", NULL},\n", encURI); else fprintf(fd, "\t{\"SOAP-ENC\", \"%s\", \"http://www.w3.org/*/soap-encoding\", NULL},\n", encURI); } else if (!strcmp(ns1->name, "xsi")) fprintf(fd, "\t{\"xsi\", \"%s\", \"http://www.w3.org/*/XMLSchema-instance\", NULL},\n", xsiURI); else if (!strcmp(ns1->name, "xsd")) fprintf(fd, "\t{\"xsd\", \"%s\", \"http://www.w3.org/*/XMLSchema\", NULL},\n", xsdURI); else fprintf(fd, "\t{\"%s\", \"%s/%s.xsd\", NULL, NULL},\n", ns_convert(ns1->name), tmpURI, ns_convert(ns1->name)); } fprintf(fd, "\t{NULL, NULL, NULL, NULL}\n};\n"); } void gen_proxy(FILE *fd, Table *table, Symbol *ns, const char *name, const char *URL) { Entry *p, *q, *r; Table *t, *output; Service *sp; int flag; const char *name1; name1 = ns_cname(name, NULL); for (sp = services; sp; sp = sp->next) if (!tagcmp(sp->ns, ns->name)) break; fprintf(fd, "\n\n#ifndef %s%sProxy_H\n#define %s%sProxy_H\n#include \"%sH.h\"", prefix, name1, prefix, name1, prefix); if (nflag) fprintf(fd, "\nextern SOAP_NMAC struct Namespace %s_namespaces[];", prefix); if (namespaceid) fprintf(fd, "\n\nnamespace %s {", namespaceid); fprintf(fd, "\nclass %s\n{ public:\n\t/// Runtime engine context allocated in constructor\n\tstruct soap *soap;\n\t/// Endpoint URL of service '%s' (change as needed)\n\tconst char *endpoint;\n\t/// Constructor allocates soap engine context, sets default endpoint URL, and sets namespace mapping table\n", name1, name); if (nflag) fprintf(fd, "\t%s() { soap = soap_new(); if (soap) soap->namespaces = %s_namespaces; endpoint = \"%s\"; }\n", name1, prefix, URL); else { fprintf(fd, "\t%s()\n\t{ soap = soap_new(); endpoint = \"%s\"; if (soap && !soap->namespaces) { static const struct Namespace namespaces[] = \n", name1, URL); gen_nsmap(fd); fprintf(fd, "\tsoap->namespaces = namespaces; } }\n"); } fprintf(fd, "\t/// Destructor deletes deserialized data and engine context\n\tvirtual ~%s() { if (soap) { soap_destroy(soap); soap_end(soap); soap_free(soap); } }\n", name1); fflush(fd); for (r = table->list; r; r = r->next) { if (r->info.typ->type == Tfun && !(r->info.sto & Sextern) && has_ns_eq(ns->name, r->sym->name)) { p = entry(table, r->sym); if (p) q = (Entry*)p->info.typ->ref; else { fprintf(stderr, "Internal error: no table entry\n"); return; } p = entry(classtable, r->sym); if (!p) { fprintf(stderr, "Internal error: no parameter table entry\n"); return; } output = (Table*)p->info.typ->ref; fprintf(fd, "\t/// Invoke '%s' of service '%s' and return error code (or SOAP_OK)\n", ns_remove(r->sym->name), name); fprintf(fd, "\tvirtual int %s(", ident(r->sym->name)); flag = 0; for (t = output; t; t = t->prev) { p = t->list; if (p) { fprintf(fd, "%s%s", c_storage(p->info.sto), c_type_id(p->info.typ, p->sym->name)); for (p = p->next; p; p = p->next) fprintf(fd, ", %s%s", c_storage(p->info.sto), c_type_id(p->info.typ, p->sym->name)); flag = 1; } } if (is_transient(q->info.typ)) fprintf(fd, ") { return soap ? soap_send_%s(soap, endpoint, NULL", ident(r->sym->name)); else if (flag) fprintf(fd, ", %s%s) { return soap ? soap_call_%s(soap, endpoint, NULL", c_storage(q->info.sto), c_type_id(q->info.typ, q->sym->name), ident(r->sym->name)); else fprintf(fd, "%s%s) { return soap ? soap_call_%s(soap, endpoint, NULL", c_storage(q->info.sto), c_type_id(q->info.typ, q->sym->name), ident(r->sym->name)); /* the action is now handled by the soap_call/soap_send operation when we pass NULL */ #if 0 m = NULL; if (sp && (s = strstr(r->sym->name, "__"))) for (m = sp->list; m; m = m->next) if (m->part && m->mess == ACTION && !strcmp(m->name, s+2)) { if (*m->part == '"') fprintf(fd, "%s", m->part); else fprintf(fd, "\"%s\"", m->part); break; } if (!m) fprintf(fd, "NULL"); #endif for (t = output; t; t = t->prev) for (p = t->list; p; p = p->next) fprintf(fd, ", %s", ident(p->sym->name)); if (is_transient(q->info.typ)) fprintf(fd, ") : SOAP_EOM; }\n"); else fprintf(fd, ", %s) : SOAP_EOM; }\n", ident(q->sym->name)); fflush(fd); } } fprintf(fd, "};"); if (namespaceid) fprintf(fd, "\n\n} // namespace %s\n", namespaceid); fprintf(fd, "\n#endif\n"); } void gen_object(FILE *fd, Table *table, const char *name) { const char *name1; Entry *method; name1 = ns_cname(name, NULL); fprintf(fd, "\n\n#ifndef %s%sObject_H\n#define %s%sObject_H\n#include \"%sH.h\"", prefix, name1, prefix, name1, prefix); banner(fd, "Service Object"); if (namespaceid) fprintf(fd, "\n\nnamespace %s {", namespaceid); fprintf(fd, "\nclass %sService : public soap\n{ public:", name1); fprintf(fd, "\n\t%sService()\n\t{ static const struct Namespace namespaces[] =\n", name1); gen_nsmap(fd); fprintf(fd, "\n\tsoap_init(this); this->namespaces = namespaces; };"); fprintf(fd, "\n\t/// Destructor deletes deserialized data and engine context"); fprintf(fd, "\n\tvirtual ~%sService() { soap_destroy(this); soap_end(this); };", name1); fprintf(fd, "\n\t/// Bind service to port (returns master socket or SOAP_INVALID_SOCKET)"); fprintf(fd, "\n\tvirtual\tSOAP_SOCKET bind(const char *host, int port, int backlog) { return soap_bind(this, host, port, backlog); };"); fprintf(fd, "\n\t/// Accept next request (returns socket or SOAP_INVALID_SOCKET)"); fprintf(fd, "\n\tvirtual\tSOAP_SOCKET accept() { return soap_accept(this); };"); fprintf(fd, "\n#if defined(WITH_OPENSSL) || defined(WITH_GNUTLS)"); fprintf(fd, "\n\t/// Then accept SSL handshake, when SSL is used"); fprintf(fd, "\n\tvirtual\tint ssl_accept() { return soap_ssl_accept(this); };"); fprintf(fd, "\n#endif"); fprintf(fd, "\n\t/// Serve this request (returns error code or SOAP_OK)"); if (nflag) fprintf(fd, "\n\tvirtual\tint serve() { return %s_serve(this); };", prefix); else fprintf(fd, "\n\tvirtual\tint serve() { return soap_serve(this); };"); fprintf(fd, "\n};"); banner(fd, "Service Operations (you should define these globally)"); for (method = table->list; method; method = method->next) { if (method->info.typ->type == Tfun && !(method->info.sto & Sextern)) { Entry *p, *q = entry(table, method->sym); Table *output; if (q) p = (Entry*)q->info.typ->ref; else { fprintf(stderr, "Internal error: no table entry\n"); return; } q = entry(classtable, method->sym); output = (Table*)q->info.typ->ref; fprintf(fd, "\n\nSOAP_FMAC5 int SOAP_FMAC6 %s(struct soap*", ident(method->sym->name)); gen_params(fd, output, p, 1); fprintf(fd, ";"); } } if (namespaceid) fprintf(fd, "\n\n} // namespace %s\n", namespaceid); fprintf(fd, "\n\n#endif\n"); } void gen_proxy_header(FILE *fd, Table *table, Symbol *ns, const char *name) { Entry *p, *method; Table *t; fprintf(fd, "\n\n#ifndef %s%s_H\n#define %s%s_H\n#include \"%sH.h\"", prefix, name, prefix, name, prefix); if (namespaceid) fprintf(fd, "\n\nnamespace %s {", namespaceid); if (iflag) fprintf(fd, "\n\nclass SOAP_CMAC %s : public soap\n{ public:", name); else fprintf(fd, "\n\nclass SOAP_CMAC %s\n{ public:", name); if (!iflag) fprintf(fd, "\n\tstruct soap *soap;\n\tbool soap_own;"); fprintf(fd, "\n\t/// Endpoint URL of service '%s' (change as needed)", name); fprintf(fd, "\n\tconst char *soap_endpoint;"); fprintf(fd, "\n\t/// Variables globally declared in %s (non-static)", filename); for (p = table->list; p; p = p->next) if (p->info.typ->type != Tfun && !(p->info.sto & Sstatic)) fprintf(fd, "\n\t%s%s;", c_storage(p->info.sto), c_type_id(p->info.typ, p->sym->name)); fprintf(fd, "\n\t/// Constructor"); fprintf(fd, "\n\t%s();", name); fprintf(fd, "\n\t/// Copy constructor"); fprintf(fd, "\n\t%s(const %s& rhs);", name, name); if (iflag) { fprintf(fd, "\n\t/// Construct from another engine state"); fprintf(fd, "\n\t%s(const struct soap&);", name); } else { fprintf(fd, "\n\t/// Constructor to use/share an engine state"); fprintf(fd, "\n\t%s(struct soap*);", name); } fprintf(fd, "\n\t/// Constructor with endpoint URL"); fprintf(fd, "\n\t%s(const char *url);", name); fprintf(fd, "\n\t/// Constructor with engine input+output mode control"); fprintf(fd, "\n\t%s(soap_mode iomode);", name); fprintf(fd, "\n\t/// Constructor with URL and input+output mode control"); fprintf(fd, "\n\t%s(const char *url, soap_mode iomode);", name); fprintf(fd, "\n\t/// Constructor with engine input and output mode control"); fprintf(fd, "\n\t%s(soap_mode imode, soap_mode omode);", name); if (iflag) fprintf(fd, "\n\t/// Destructor deletes deserialized data and engine context"); else fprintf(fd, "\n\t/// Destructor deletes non-shared engine context only (use destroy() to delete deserialized data)"); fprintf(fd, "\n\tvirtual\t~%s();", name); fprintf(fd, "\n\t/// Initializer used by constructors"); fprintf(fd, "\n\tvirtual\tvoid %s_init(soap_mode imode, soap_mode omode);", name); fprintf(fd, "\n\t/// Create a new copy"); fprintf(fd, "\n\tvirtual\t%s *copy() SOAP_PURE_VIRTUAL;", name); fprintf(fd, "\n\t/// Copy assignment"); fprintf(fd, "\n\t%s& operator=(const %s&);", name, name); fprintf(fd, "\n\t/// Delete all deserialized data (with soap_destroy and soap_end)"); fprintf(fd, "\n\tvirtual\tvoid destroy();"); fprintf(fd, "\n\t/// Delete all deserialized data and reset to default"); fprintf(fd, "\n\tvirtual\tvoid reset();"); fprintf(fd, "\n\t/// Disables and removes SOAP Header from message"); fprintf(fd, "\n\tvirtual\tvoid soap_noheader();"); if (!namespaceid) { p = entry(classtable, lookup("SOAP_ENV__Header")); if (p) { t = (Table*)p->info.typ->ref; if (t && t->list && !is_void(t->list->info.typ)) { fprintf(fd, "\n\t/// Put SOAP Header in message"); fprintf(fd, "\n\tvirtual\tvoid soap_header("); gen_params(fd, t, NULL, 0); fprintf(fd, ";"); } } } fprintf(fd, "\n\t/// Get SOAP Header structure (NULL when absent)"); fprintf(fd, "\n\tvirtual\tconst SOAP_ENV__Header *soap_header();"); fprintf(fd, "\n\t/// Get SOAP Fault structure (NULL when absent)"); fprintf(fd, "\n\tvirtual\tconst SOAP_ENV__Fault *soap_fault();"); fprintf(fd, "\n\t/// Get SOAP Fault string (NULL when absent)"); fprintf(fd, "\n\tvirtual\tconst char *soap_fault_string();"); fprintf(fd, "\n\t/// Get SOAP Fault detail as string (NULL when absent)"); fprintf(fd, "\n\tvirtual\tconst char *soap_fault_detail();"); fprintf(fd, "\n\t/// Close connection (normally automatic, except for send_X ops)"); fprintf(fd, "\n\tvirtual\tint soap_close_socket();"); fprintf(fd, "\n\t/// Force close connection (can kill a thread blocked on IO)"); fprintf(fd, "\n\tvirtual\tint soap_force_close_socket();"); fprintf(fd, "\n\t/// Print fault"); fprintf(fd, "\n\tvirtual\tvoid soap_print_fault(FILE*);"); fprintf(fd, "\n#ifndef WITH_LEAN\n\t/// Print fault to stream"); fprintf(fd, "\n#ifndef WITH_COMPAT"); fprintf(fd, "\n\tvirtual\tvoid soap_stream_fault(std::ostream&);"); fprintf(fd, "\n#endif\n"); fprintf(fd, "\n\t/// Put fault into buffer"); fprintf(fd, "\n\tvirtual\tchar *soap_sprint_fault(char *buf, size_t len);\n#endif"); for (method = table->list; method; method = method->next) if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && has_ns_eq(ns->name, method->sym->name)) gen_method(fd, method, 0); fprintf(fd, "\n};"); if (namespaceid) fprintf(fd, "\n\n} // namespace %s\n", namespaceid); fprintf(fd, "\n#endif\n"); } void gen_proxy_code(FILE *fd, Table *table, Symbol *ns, const char *name) { Entry *p, *method, *param; Table *t; const char *soap; if (iflag) soap = "this"; else soap = "this->soap"; fprintf(fd, "\n\n#include \"%s%s.h\"", prefix, name); if (namespaceid) fprintf(fd, "\n\nnamespace %s {", namespaceid); if (iflag) { fprintf(fd, "\n\n%s::%s() : soap(SOAP_IO_DEFAULT)\n{\t%s_init(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT);\n}", name, name, name); fprintf(fd, "\n\n%s::%s(const %s& rhs)\n{\tsoap_copy_context(this, &rhs);\n\tthis->soap_endpoint = rhs.soap_endpoint;\n}", name, name, name); fprintf(fd, "\n\n%s::%s(const struct soap &_soap) : soap(_soap)\n{ }", name, name); fprintf(fd, "\n\n%s::%s(const char *url) : soap(SOAP_IO_DEFAULT)\n{\t%s_init(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT);\n\tsoap_endpoint = url;\n}", name, name, name); fprintf(fd, "\n\n%s::%s(soap_mode iomode) : soap(iomode)\n{\t%s_init(iomode, iomode);\n}", name, name, name); fprintf(fd, "\n\n%s::%s(const char *url, soap_mode iomode) : soap(iomode)\n{\t%s_init(iomode, iomode);\n\tsoap_endpoint = url;\n}", name, name, name); fprintf(fd, "\n\n%s::%s(soap_mode imode, soap_mode omode) : soap(imode, omode)\n{\t%s_init(imode, omode);\n}", name, name, name); fprintf(fd, "\n\n%s::~%s()\n{\n\tthis->destroy();\n\t}", name, name); } else { fprintf(fd, "\n\n%s::%s()\n{\tthis->soap = soap_new();\n\tthis->soap_own = true;\n\t%s_init(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT);\n}", name, name, name); fprintf(fd, "\n\n%s::%s(const %s& rhs)\n{\tthis->soap = rhs.soap;\n\tthis->soap_own = false;\n\tthis->soap_endpoint = rhs.soap_endpoint;\n}", name, name, name); fprintf(fd, "\n\n%s::%s(struct soap *_soap)\n{\tthis->soap = _soap;\n\tthis->soap_own = false;\n\t%s_init(_soap->imode, _soap->omode);\n}", name, name, name); fprintf(fd, "\n\n%s::%s(const char *url)\n{\tthis->soap = soap_new();\n\tthis->soap_own = true;\n\t%s_init(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT);\n\tsoap_endpoint = url;\n}", name, name, name); fprintf(fd, "\n\n%s::%s(soap_mode iomode)\n{\tthis->soap = soap_new();\n\tthis->soap_own = true;\n\t%s_init(iomode, iomode);\n}", name, name, name); fprintf(fd, "\n\n%s::%s(const char *url, soap_mode iomode)\n{\tthis->soap = soap_new();\n\tthis->soap_own = true;\n\t%s_init(iomode, iomode);\n\tsoap_endpoint = url;\n}", name, name, name); fprintf(fd, "\n\n%s::%s(soap_mode imode, soap_mode omode)\n{\tthis->soap = soap_new();\n\tthis->soap_own = true;\n\t%s_init(imode, omode);\n}", name, name, name); fprintf(fd, "\n\n%s::~%s()\n{\tif (this->soap_own)\n\t\tsoap_free(this->soap);\n}", name, name); } fprintf(fd, "\n\nvoid %s::%s_init(soap_mode imode, soap_mode omode)\n{\tsoap_imode(%s, imode);\n\tsoap_omode(%s, omode);\n\tsoap_endpoint = NULL;\n\tstatic const struct Namespace namespaces[] =\n", name, name, soap, soap); gen_nsmap(fd); fprintf(fd, "\tsoap_set_namespaces(%s, namespaces);\n}", soap); if (iflag) { fprintf(fd, "\n\n#ifndef WITH_PURE_VIRTUAL\n%s *%s::copy()\n{\t%s *dup = SOAP_NEW_COPY(%s(*(struct soap*)%s));\n\treturn dup;\n}\n#endif", name, name, name, name, soap); fprintf(fd, "\n\n%s& %s::operator=(const %s& rhs)\n{\tsoap_copy_context(this, &rhs);\n\tthis->soap_endpoint = rhs.soap_endpoint;\n\treturn *this;\n}", name, name, name); } else { fprintf(fd, "\n\n#ifndef WITH_PURE_VIRTUAL\n%s *%s::copy()\n{\t%s *dup = SOAP_NEW_COPY(%s);\n\tif (dup)\n\t\tsoap_copy_context(dup->soap, this->soap);\n\treturn dup;\n}\n#endif", name, name, name, name); fprintf(fd, "\n\n%s& %s::operator=(const %s& rhs)\n{\tif (this->soap_own)\n\t\tsoap_free(this->soap);\n\tthis->soap = rhs.soap;\n\tthis->soap_own = false;\n\tthis->soap_endpoint = rhs.soap_endpoint;\n\treturn *this;\n}", name, name, name); } fprintf(fd, "\n\nvoid %s::destroy()\n{\tsoap_destroy(%s);\n\tsoap_end(%s);\n}", name, soap, soap); fprintf(fd, "\n\nvoid %s::reset()\n{\tthis->destroy();\n\tsoap_done(%s);\n\tsoap_initialize(%s);\n\t%s_init(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT);\n}", name, soap, soap, name); fprintf(fd, "\n\nvoid %s::soap_noheader()\n{\t%s->header = NULL;\n}", name, soap); if (!namespaceid) { p = entry(classtable, lookup("SOAP_ENV__Header")); if (p) { t = (Table*)p->info.typ->ref; if (t && t->list && !is_void(t->list->info.typ)) { fprintf(fd, "\n\nvoid %s::soap_header(", name); gen_params(fd, t, NULL, 0); fprintf(fd, "\n{\t::soap_header(%s);", soap); for (param = t->list; param; param = param->next) { if (namespaceid) fprintf(fd, "\n\t((%s::SOAP_ENV__Header*)%s->header)->%s = %s;", namespaceid, soap, ident(param->sym->name), ident(param->sym->name)); else fprintf(fd, "\n\t%s->header->%s = %s;", soap, ident(param->sym->name), ident(param->sym->name)); } fprintf(fd, "\n}"); } } } fprintf(fd, "\n\nconst SOAP_ENV__Header *%s::soap_header()\n{\treturn %s->header;\n}", name, soap); fprintf(fd, "\n\nconst SOAP_ENV__Fault *%s::soap_fault()\n{\treturn %s->fault;\n}", name, soap); fprintf(fd, "\n\nconst char *%s::soap_fault_string()\n{\treturn *soap_faultstring(%s);\n}", name, soap); fprintf(fd, "\n\nconst char *%s::soap_fault_detail()\n{\treturn *soap_faultdetail(%s);\n}", name, soap); fprintf(fd, "\n\nint %s::soap_close_socket()\n{\treturn soap_closesock(%s);\n}", name, soap); fprintf(fd, "\n\nint %s::soap_force_close_socket()\n{\treturn soap_force_closesock(%s);\n}", name, soap); fprintf(fd, "\n\nvoid %s::soap_print_fault(FILE *fd)\n{\t::soap_print_fault(%s, fd);\n}", name, soap); fprintf(fd, "\n\n#ifndef WITH_LEAN\n#ifndef WITH_COMPAT\nvoid %s::soap_stream_fault(std::ostream& os)\n{\t::soap_stream_fault(%s, os);\n}\n#endif", name, soap); fprintf(fd, "\n\nchar *%s::soap_sprint_fault(char *buf, size_t len)\n{\treturn ::soap_sprint_fault(%s, buf, len);\n}\n#endif", name, soap); for (method = table->list; method; method = method->next) if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && !is_imported(method->info.typ) && has_ns_eq(ns->name, method->sym->name)) gen_call_method(fd, method, name); if (namespaceid) fprintf(fd, "\n\n} // namespace %s\n", namespaceid); fprintf(fd, "\n/* End of client proxy code */\n"); } void gen_object_header(FILE *fd, Table *table, Symbol *ns, const char *name) { Entry *p, *method; Table *t; fprintf(fd, "\n\n#ifndef %s%s_H\n#define %s%s_H\n#include \"%sH.h\"", prefix, name, prefix, name, prefix); if (namespaceid) fprintf(fd, "\n\nnamespace %s {", namespaceid); if (iflag) fprintf(fd, "\nclass SOAP_CMAC %s : public soap\n{ public:", name); else { fprintf(fd, "\nclass SOAP_CMAC %s\n{ public:", name); fprintf(fd, "\n\tstruct soap *soap;\n\tbool soap_own;"); } fprintf(fd, "\n\t/// Variables globally declared in %s (non-static)", filename); for (p = table->list; p; p = p->next) if (p->info.typ->type != Tfun && !(p->info.sto & Sstatic)) fprintf(fd, "\n\t%s%s;", c_storage(p->info.sto), c_type_id(p->info.typ, p->sym->name)); fprintf(fd, "\n\t/// Constructor"); fprintf(fd, "\n\t%s();", name); fprintf(fd, "\n\t/// Copy constructor"); fprintf(fd, "\n\t%s(const %s&);", name, name); if (iflag) { fprintf(fd, "\n\t/// Construct from another engine state"); fprintf(fd, "\n\t%s(const struct soap&);", name); } else { fprintf(fd, "\n\t/// Constructor to use/share an engine state"); fprintf(fd, "\n\t%s(struct soap*);", name); } fprintf(fd, "\n\t/// Constructor with engine input+output mode control"); fprintf(fd, "\n\t%s(soap_mode iomode);", name); fprintf(fd, "\n\t/// Constructor with engine input and output mode control"); fprintf(fd, "\n\t%s(soap_mode imode, soap_mode omode);", name); if (iflag) fprintf(fd, "\n\t/// Destructor deletes deserialized data and engine context"); else fprintf(fd, "\n\t/// Destructor deletes non-shared engine context only (use destroy() to delete deserialized data)"); fprintf(fd, "\n\tvirtual ~%s();", name); fprintf(fd, "\n\t/// Delete all deserialized data (with soap_destroy() and soap_end())"); fprintf(fd, "\n\tvirtual\tvoid destroy();"); fprintf(fd, "\n\t/// Delete all deserialized data and reset to defaults"); fprintf(fd, "\n\tvirtual\tvoid reset();"); fprintf(fd, "\n\t/// Initializer used by constructor"); fprintf(fd, "\n\tvirtual\tvoid %s_init(soap_mode imode, soap_mode omode);", name); fprintf(fd, "\n\t/// Create a new copy"); fprintf(fd, "\n\tvirtual\t%s *copy() SOAP_PURE_VIRTUAL;", name); fprintf(fd, "\n\t/// Copy assignment"); fprintf(fd, "\n\t%s& operator=(const %s&);", name, name); fprintf(fd, "\n\t/// Close connection (normally automatic)"); fprintf(fd, "\n\tvirtual\tint soap_close_socket();"); fprintf(fd, "\n\t/// Force close connection (can kill a thread blocked on IO)"); fprintf(fd, "\n\tvirtual\tint soap_force_close_socket();"); fprintf(fd, "\n\t/// Return sender-related fault to sender"); fprintf(fd, "\n\tvirtual\tint soap_senderfault(const char *string, const char *detailXML);"); fprintf(fd, "\n\t/// Return sender-related fault with SOAP 1.2 subcode to sender"); fprintf(fd, "\n\tvirtual\tint soap_senderfault(const char *subcodeQName, const char *string, const char *detailXML);"); fprintf(fd, "\n\t/// Return receiver-related fault to sender"); fprintf(fd, "\n\tvirtual\tint soap_receiverfault(const char *string, const char *detailXML);"); fprintf(fd, "\n\t/// Return receiver-related fault with SOAP 1.2 subcode to sender"); fprintf(fd, "\n\tvirtual\tint soap_receiverfault(const char *subcodeQName, const char *string, const char *detailXML);"); fprintf(fd, "\n\t/// Print fault"); fprintf(fd, "\n\tvirtual\tvoid soap_print_fault(FILE*);"); fprintf(fd, "\n#ifndef WITH_LEAN\n\t/// Print fault to stream"); fprintf(fd, "\n#ifndef WITH_COMPAT"); fprintf(fd, "\n\tvirtual\tvoid soap_stream_fault(std::ostream&);"); fprintf(fd, "\n#endif"); fprintf(fd, "\n\t/// Put fault into buffer"); fprintf(fd, "\n\tvirtual\tchar *soap_sprint_fault(char *buf, size_t len);\n#endif"); fprintf(fd, "\n\t/// Disables and removes SOAP Header from message"); fprintf(fd, "\n\tvirtual\tvoid soap_noheader();"); if (!namespaceid) { p = entry(classtable, lookup("SOAP_ENV__Header")); if (p) { t = (Table*)p->info.typ->ref; if (t && t->list && !is_void(t->list->info.typ)) { fprintf(fd, "\n\t/// Put SOAP Header in message"); fprintf(fd, "\n\tvirtual\tvoid soap_header("); gen_params(fd, t, NULL, 0); fprintf(fd, ";"); } } } fprintf(fd, "\n\t/// Get SOAP Header structure (NULL when absent)"); fprintf(fd, "\n\tvirtual\tconst SOAP_ENV__Header *soap_header();"); fprintf(fd, "\n\t/// Run simple single-thread (iterative, non-SSL) service on port until a connection error occurs (returns error code or SOAP_OK), use this->bind_flag = SO_REUSEADDR to rebind for a rerun"); fprintf(fd, "\n\tvirtual\tint run(int port);"); fprintf(fd, "\n#if defined(WITH_OPENSSL) || defined(WITH_GNUTLS)"); fprintf(fd, "\n\t/// Run simple single-thread SSL service on port until a connection error occurs (returns error code or SOAP_OK), use this->bind_flag = SO_REUSEADDR to rebind for a rerun"); fprintf(fd, "\n\tvirtual\tint ssl_run(int port);"); fprintf(fd, "\n#endif"); fprintf(fd, "\n\t/// Bind service to port (returns master socket or SOAP_INVALID_SOCKET)"); fprintf(fd, "\n\tvirtual\tSOAP_SOCKET bind(const char *host, int port, int backlog);"); fprintf(fd, "\n\t/// Accept next request (returns socket or SOAP_INVALID_SOCKET)"); fprintf(fd, "\n\tvirtual\tSOAP_SOCKET accept();"); fprintf(fd, "\n#if defined(WITH_OPENSSL) || defined(WITH_GNUTLS)"); fprintf(fd, "\n\t/// Then accept SSL handshake, when SSL is used"); fprintf(fd, "\n\tvirtual\tint ssl_accept();"); fprintf(fd, "\n#endif"); fprintf(fd, "\n\t/// Serve this request (returns error code or SOAP_OK)"); fprintf(fd, "\n\tvirtual\tint serve();"); fprintf(fd, "\n\t/// Used by serve() to dispatch a request (returns error or SOAP_OK)"); fprintf(fd, "\n\tvirtual\tint dispatch();"); if (jflag) fprintf(fd, "\n\tvirtual\tint dispatch(struct soap *soap);"); fprintf(fd, "\n\n\t///\n\t/// Service operations (you should define these):\n\t/// Note: compile with -DWITH_PURE_VIRTUAL for pure virtual methods\n\t///"); for (method = table->list; method; method = method->next) if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && has_ns_eq(ns->name, method->sym->name)) gen_method(fd, method, 1); fprintf(fd, "\n};"); if (namespaceid) fprintf(fd, "\n\n} // namespace %s\n", namespaceid); fprintf(fd, "\n#endif\n"); } void gen_method(FILE *fd, Entry *method, int server) { Table *params; Entry *result, *p; const char *soap; if (iflag) soap = "this"; else soap = "this->soap"; result = (Entry*)method->info.typ->ref; p = entry(classtable, method->sym); if (!p) execerror("no table entry"); params = (Table*)p->info.typ->ref; if (server || !is_transient(result->info.typ)) { if (is_transient(result->info.typ)) fprintf(fd, "\n\n\t/// Web service one-way operation '%s' (return error code, SOAP_OK (no response), or send_%s_empty_response())", ns_remove(method->sym->name), ns_remove(method->sym->name)); else fprintf(fd, "\n\n\t/// Web service operation '%s' (returns error code or SOAP_OK)", ns_remove(method->sym->name)); fprintf(fd, "\n\tvirtual\tint %s(", ns_cname(method->sym->name, NULL)); gen_params(fd, params, result, 0); if (!server) { fprintf(fd, " { return this->%s(NULL, NULL", ns_cname(method->sym->name, NULL)); gen_args(fd, params, result, 1); fprintf(fd, "; }"); fprintf(fd, "\n\tvirtual\tint %s(const char *endpoint, const char *soap_action", ns_cname(method->sym->name, NULL)); gen_params(fd, params, result, 1); } if (server) fprintf(fd, " SOAP_PURE_VIRTUAL;"); else fprintf(fd, ";"); if (is_transient(result->info.typ)) fprintf(fd, "\n\tvirtual\tint send_%s_empty_response(int httpcode) { return soap_send_empty_response(%s, httpcode); }", ns_cname(method->sym->name, NULL), soap); } else { fprintf(fd, "\n\n\t/// Web service one-way send operation 'send_%s' (returns error code or SOAP_OK)", ns_remove(method->sym->name)); fprintf(fd, "\n\tvirtual\tint send_%s(", ns_cname(method->sym->name, NULL)); gen_params(fd, params, result, 0); fprintf(fd, " { return this->send_%s(NULL, NULL", ns_cname(method->sym->name, NULL)); gen_args(fd, params, result, 1); fprintf(fd, "; }"); fprintf(fd, "\n\tvirtual\tint send_%s(const char *endpoint, const char *soap_action", ns_cname(method->sym->name, NULL)); gen_params(fd, params, result, 1); fprintf(fd, ";\n\t/// Web service one-way receive operation 'recv_%s' (returns error code or SOAP_OK)", ns_remove(method->sym->name)); fprintf(fd, ";\n\tvirtual\tint recv_%s(", ns_cname(method->sym->name, NULL)); fprintf(fd, "struct %s&);", ident(method->sym->name)); fprintf(fd, "\n\t/// Web service receive of HTTP Accept acknowledgment for one-way send operation 'send_%s' (returns error code or SOAP_OK)", ns_remove(method->sym->name)); fprintf(fd, "\n\tvirtual\tint recv_%s_empty_response() { return soap_recv_empty_response(%s); }", ns_cname(method->sym->name, NULL), soap); fprintf(fd, "\n\t/// Web service one-way synchronous send operation '%s' with HTTP Accept/OK response receive (returns error code or SOAP_OK)", ns_remove(method->sym->name)); fprintf(fd, "\n\tvirtual\tint %s(", ns_cname(method->sym->name, NULL)); gen_params(fd, params, result, 0); fprintf(fd, " { return this->%s(NULL, NULL", ns_cname(method->sym->name, NULL)); gen_args(fd, params, result, 1); fprintf(fd, "; }"); fprintf(fd, "\n\tvirtual\tint %s(const char *endpoint, const char *soap_action", ns_cname(method->sym->name, NULL)); gen_params(fd, params, result, 1); fprintf(fd, " { if (this->send_%s(endpoint, soap_action", ns_cname(method->sym->name, NULL)); gen_args(fd, params, result, 1); fprintf(fd, " || soap_recv_empty_response(%s)) return %s->error; return SOAP_OK; }", soap, soap); } } void gen_params(FILE *fd, Table *params, Entry *result, int flag) { Entry *param; for (param = params->list; param; param = param->next) fprintf(fd, "%s%s%s", flag || param != params->list ? ", " : "", c_storage(param->info.sto), c_type_id(param->info.typ, param->sym->name)); if (!result || is_transient(result->info.typ)) fprintf(fd, ")"); else fprintf(fd, "%s%s%s)", flag || params->list ? ", " : "", c_storage(result->info.sto), c_type_id(result->info.typ, result->sym->name)); } void gen_args(FILE *fd, Table *params, Entry *result, int flag) { Entry *param; for (param = params->list; param; param = param->next) fprintf(fd, "%s%s", flag || param != params->list ? ", " : "", param->sym->name); if (!result || is_transient(result->info.typ)) fprintf(fd, ")"); else fprintf(fd, "%s%s)", flag || params->list ? ", " : "", result->sym->name); } void gen_query_url(FILE *fd, Table *params) { Entry *param; int flag = 0; fprintf(fd, "\n\t(SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), 0), \"%%s?"); for (param = params->list; param; param = param->next) if (!is_transient(param->info.typ) && is_primitive_or_string(param->info.typ)) fprintf(fd, "%s%s=%s", flag++ ? "&" : "", ns_remove(param->sym->name), gen_format(param->info.typ)); fprintf(fd, "\", soap_endpoint"); for (param = params->list; param; param = param->next) { if (!is_transient(param->info.typ) && is_primitive_or_string(param->info.typ)) { if (is_stdstring(param->info.typ)) fprintf(fd, ", soap_encode_url_string(soap, %s.c_str())", ident(param->sym->name)); else if (is_string(param->info.typ)) fprintf(fd, ", soap_encode_url_string(soap, %s)", ident(param->sym->name)); else if (is_primitive(param->info.typ)) fprintf(fd, ", %s", ident(param->sym->name)); } } fprintf(fd, ");"); } void gen_query_form(FILE *fd, Table *params) { Entry *param; int flag = 0; fprintf(fd, "\n\tif ("); for (param = params->list; param; param = param->next) { if (!is_transient(param->info.typ) && is_primitive_or_string(param->info.typ)) { fprintf(fd, "soap_send(soap, \"%s%s=\")", flag++ ? "&" : "", ns_remove(param->sym->name)); if (is_stdstring(param->info.typ)) fprintf(fd, " || soap_send(soap, soap_encode_url_string(soap, %s.c_str()))\n\t || ", ident(param->sym->name)); else if (is_string(param->info.typ)) fprintf(fd, " || soap_send(soap, soap_encode_url_string(soap, %s))\n\t || ", ident(param->sym->name)); else if (is_primitive(param->info.typ)) fprintf(fd, " || soap_send(soap, soap_%s2s(soap, %s))\n\t || ", c_ident(param->info.typ), ident(param->sym->name)); } } } const char* gen_format(Tnode *typ) { if (is_string(typ) || is_stdstring(typ)) return "%s"; switch (typ->type) { case Tchar: return "%hhd"; case Tshort: return "%hd"; case Tint: return "%d"; case Tlong: return "%ld"; case Tllong: return SOAP_LONG_FORMAT; case Tfloat: return "%.9G"; case Tdouble: return "%.17lG"; case Tuchar: return "%hhu"; case Tushort: return "%hu"; case Tuint: return "%u"; case Tulong: return "%lu"; case Tullong: return SOAP_ULONG_FORMAT; default: return ""; } } void gen_call_method(FILE *fd, Entry *method, const char *name) { Service *sp; Method *m; int soap = (soap_version >= 0); int version = soap_version; int get = 0; int put = 0; int post = 0; int mime = 0; const char *style, *encoding; const char *xtag; const char *action = NULL, *method_encoding = NULL, *method_response_encoding = NULL; Table *params; Entry *param, *result, *p, *response = NULL; result = (Entry*)method->info.typ->ref; p = entry(classtable, method->sym); if (!p) execerror("no table entry"); params = (Table*)p->info.typ->ref; if (!is_response(result->info.typ) && !is_XML(result->info.typ)) response = get_response(method->info.typ); if (name) { if (!is_transient(result->info.typ)) fprintf(fd, "\n\nint %s::%s(const char *endpoint, const char *soap_action", name, ns_cname(method->sym->name, NULL)); else fprintf(fd, "\n\nint %s::send_%s(const char *endpoint, const char *soap_action", name, ns_cname(method->sym->name, NULL)); gen_params(fd, params, result, 1); } else if (!is_transient(result->info.typ)) { fprintf(fheader, "\n\nSOAP_FMAC5 int SOAP_FMAC6 soap_call_%s(struct soap *soap, const char *soap_endpoint, const char *soap_action", ident(method->sym->name)); gen_params(fheader, params, result, 1); fprintf(fd, "\n\nSOAP_FMAC5 int SOAP_FMAC6 soap_call_%s(struct soap *soap, const char *soap_endpoint, const char *soap_action", ident(method->sym->name)); gen_params(fd, params, result, 1); } else { fprintf(fheader, "\n\nSOAP_FMAC5 int SOAP_FMAC6 soap_send_%s(struct soap *soap, const char *soap_endpoint, const char *soap_action", ident(method->sym->name)); gen_params(fheader, params, result, 1); fprintf(fd, "\n\nSOAP_FMAC5 int SOAP_FMAC6 soap_send_%s(struct soap *soap, const char *soap_endpoint, const char *soap_action", ident(method->sym->name)); gen_params(fd, params, result, 1); } if (name) { if (iflag) fprintf(fd, "\n{\tstruct soap *soap = this;\n"); else fprintf(fd, "\n{\tstruct soap *soap = this->soap;\n"); } else { fprintf(fheader, ";"); fprintf(fd, "\n{"); } for (sp = services; sp; sp = sp->next) { if (has_ns_eq(sp->ns, method->sym->name)) { style = sp->style; encoding = sp->encoding; method_encoding = encoding; method_response_encoding = NULL; if (sp->protocol) { if (strstr(sp->protocol, "GET")) get = 1; else if (strstr(sp->protocol, "POST")) post = 1; else if (strstr(sp->protocol, "PUT")) put = 1; if (strncmp(sp->protocol, "SOAP", 4)) soap = 0; else if (strlen(sp->protocol) > 6) version = sp->protocol[6] - '0'; } for (m = sp->list; m; m = m->next) { if (is_eq_nons(m->name, method->sym->name)) { if (m->mess == ACTION || m->mess == REQUEST_ACTION) action = m->part; else if (m->mess == ENCODING) method_encoding = m->part; else if (m->mess == RESPONSE_ENCODING) method_response_encoding = m->part; else if (m->mess == PROTOCOL) { if (strstr(m->part, "GET")) get = 1; else if (strstr(m->part, "POST")) post = 1; else if (strstr(m->part, "PUT")) put = 1; if (strncmp(m->part, "SOAP", 4)) soap = 0; else if (strlen(m->part) > 6) version = m->part[6] - '0'; } else if (m->mess&MIMEIN && !strcmp(m->part, "application/x-www-form-urlencoded")) mime = 1; } } break; } } if (!get && !mime) fprintf(fd, "\tstruct %s soap_tmp_%s;", ident(method->sym->name), ident(method->sym->name)); if (response) fprintf(fd, "\n\tstruct %s *soap_tmp_%s;", c_ident(response->info.typ), c_ident(response->info.typ)); if (name) fprintf(fd, "\n\tif (endpoint)\n\t\tsoap_endpoint = endpoint;"); if (sp && sp->URL) fprintf(fd, "\n\tif (soap_endpoint == NULL)\n\t\tsoap_endpoint = \"%s\";", sp->URL); if (action) { fprintf(fd, "\n\tif (soap_action == NULL)\n\t\tsoap_action = "); if (*action == '"') fprintf(fd, "%s;", action); else fprintf(fd, "\"%s\";", action); } if (!method_response_encoding) method_response_encoding = method_encoding; if (!get && !mime) { for (param = params->list; param; param = param->next) { if (param->info.typ->type == Tarray) fprintf(fd, "\n\tsoap_memcpy(soap_tmp_%s.%s, sizeof(%s), %s, sizeof(%s));", ident(method->sym->name), ident(param->sym->name), c_type(param->info.typ), ident(param->sym->name), c_type(param->info.typ)); else fprintf(fd, "\n\tsoap_tmp_%s.%s = %s;", ident(method->sym->name), ident(param->sym->name), ident(param->sym->name)); } fprintf(fd, "\n\tsoap_begin(soap);"); if (!soap) fprintf(fd, "\n\tsoap_set_version(soap, 0); /* no SOAP */"); else if (version > 0) fprintf(fd, "\n\tsoap_set_version(soap, %d); /* SOAP1.%d */", version, version); if (soap && sp && sp->URI && method_encoding) { if (is_literal(method_encoding)) fprintf(fd, "\n\tsoap->encodingStyle = NULL;"); else if (method_encoding) fprintf(fd, "\n\tsoap->encodingStyle = \"%s\";", method_encoding); } else if (!eflag) fprintf(fd, "\n\tsoap->encodingStyle = NULL;"); if (soap) fprintf(fd, "\n\tsoap_serializeheader(soap);"); fprintf(fd, "\n\tsoap_serialize_%s(soap, &soap_tmp_%s);", ident(method->sym->name), ident(method->sym->name)); fprintf(fd, "\n\tif (soap_begin_count(soap))\n\t\treturn soap->error;"); fprintf(fd, "\n\tif (soap->mode & SOAP_IO_LENGTH)"); fprintf(fd, "\n\t{\tif (soap_envelope_begin_out(soap)"); if (soap) { fprintf(fd, "\n\t\t || soap_putheader(soap)"); fprintf(fd, "\n\t\t || soap_body_begin_out(soap)"); } fprintf(fd, "\n\t\t || soap_put_%s(soap, &soap_tmp_%s, \"%s\", NULL)", ident(method->sym->name), ident(method->sym->name), ns_convert(method->sym->name)); if (soap) fprintf(fd, "\n\t\t || soap_body_end_out(soap)"); fprintf(fd, "\n\t\t || soap_envelope_end_out(soap))"); fprintf(fd, "\n\t\t\t return soap->error;"); fprintf(fd, "\n\t}"); fprintf(fd, "\n\tif (soap_end_count(soap))\n\t\treturn soap->error;"); if (soap) fprintf(fd, "\n\tif (soap_connect(soap, soap_url(soap, soap_endpoint, NULL), soap_action)"); else { fprintf(fd, "\n\tsoap->http_content = \"text/xml\";"); if (put) fprintf(fd, "\n\tif (soap_connect_command(soap, SOAP_PUT, soap_url(soap, soap_endpoint, soap_action), soap_action)"); else fprintf(fd, "\n\tif (soap_connect_command(soap, SOAP_POST_FILE, soap_url(soap, soap_endpoint, soap_action), soap_action)"); } fprintf(fd, "\n\t || soap_envelope_begin_out(soap)"); if (soap) { fprintf(fd, "\n\t || soap_putheader(soap)"); fprintf(fd, "\n\t || soap_body_begin_out(soap)"); } fprintf(fd, "\n\t || soap_put_%s(soap, &soap_tmp_%s, \"%s\", NULL)", ident(method->sym->name), ident(method->sym->name), ns_convert(method->sym->name)); if (soap) fprintf(fd, "\n\t || soap_body_end_out(soap)"); fprintf(fd, "\n\t || soap_envelope_end_out(soap)"); fprintf(fd, "\n\t || soap_end_send(soap))"); fprintf(fd, "\n\t\treturn soap_closesock(soap);"); } else if (get) { if (params->list) { gen_query_url(fd, params); fprintf(fd, "\n\tif (soap_connect_command(soap, SOAP_GET, soap->msgbuf, soap_action))"); } else if (soap) fprintf(fd, "\n\tif (soap_connect_command(soap, SOAP_GET, soap_url(soap, soap_endpoint, NULL), soap_action))"); else fprintf(fd, "\n\tif (soap_connect_command(soap, SOAP_GET, soap_url(soap, soap_endpoint, soap_action), soap_action))"); fprintf(fd, "\n\t\treturn soap_closesock(soap);"); } else if (mime) { fprintf(fd, "\n\tsoap->http_content = \"application/x-www-form-urlencoded\";"); if (post) fprintf(fd, "\n\tif (soap_connect_command(soap, SOAP_POST_FILE, soap_url(soap, soap_endpoint, soap_action), soap_action))"); else if (put) fprintf(fd, "\n\tif (soap_connect_command(soap, SOAP_PUT, soap_url(soap, soap_endpoint, soap_action), soap_action))"); fprintf(fd, "\n\t\treturn soap_closesock(soap);"); gen_query_form(fd, params); fprintf(fd, "soap_end_send(soap))\n\t\treturn soap_closesock(soap);"); } if (is_transient(result->info.typ)) { fprintf(fd, "\n\treturn SOAP_OK;\n}"); if (name) { fprintf(fd, "\n\nint %s::recv_%s(", name, ns_cname(method->sym->name, NULL)); fprintf(fd, "struct %s& tmp)", ident(method->sym->name)); if (iflag) fprintf(fd, "\n{\tstruct soap *soap = this;\n"); else fprintf(fd, "\n{\tstruct soap *soap = this->soap;\n"); fprintf(fd, "\n\tstruct %s *%s = &tmp;", ident(method->sym->name), ident(result->sym->name)); } else { fprintf(fheader, "\n\nSOAP_FMAC5 int SOAP_FMAC6 soap_recv_%s(struct soap *soap, ", ident(method->sym->name)); fprintf(fd, "\n\nSOAP_FMAC5 int SOAP_FMAC6 soap_recv_%s(struct soap *soap, ", ident(method->sym->name)); fprintf(fheader, "struct %s *%s);\n", ident(method->sym->name), ident(result->sym->name)); fprintf(fd, "struct %s *%s)\n{", ident(method->sym->name), ident(result->sym->name)); } fprintf(fd, "\n\tsoap_default_%s(soap, %s);", ident(method->sym->name), ident(result->sym->name)); fprintf(fd, "\n\tsoap_begin(soap);"); } else if (result->info.typ->type == Tarray) fprintf(fd, "\n\tsoap_default_%s(soap, %s);", c_ident(result->info.typ), ident(result->sym->name)); else if (result->info.typ->type == Treference && ((Tnode*)result->info.typ->ref)->type == Tclass && !is_external((Tnode*)result->info.typ->ref) && !is_volatile((Tnode*)result->info.typ->ref)) fprintf(fd, "\n\tif (!&%s)\n\t\treturn soap_closesock(soap);\n\t%s.soap_default(soap);", ident(result->sym->name), ident(result->sym->name)); else if (((Tnode*)result->info.typ->ref)->type == Tclass && !is_external((Tnode*)result->info.typ->ref) && !is_volatile((Tnode*)result->info.typ->ref)) fprintf(fd, "\n\tif (!%s)\n\t\treturn soap_closesock(soap);\n\t%s->soap_default(soap);", ident(result->sym->name), ident(result->sym->name)); else if (result->info.typ->type == Treference && ((Tnode*)result->info.typ->ref)->type == Tpointer) fprintf(fd, "\n\t%s = NULL;", ident(result->sym->name)); else if (((Tnode*)result->info.typ->ref)->type == Tpointer) fprintf(fd, "\n\tif (!%s)\n\t\treturn soap_closesock(soap);\n\t*%s = NULL;", ident(result->sym->name), ident(result->sym->name)); else if (result->info.typ->type == Treference) fprintf(fd, "\n\tif (!&%s)\n\t\treturn soap_closesock(soap);\n\tsoap_default_%s(soap, &%s);", ident(result->sym->name), c_ident((Tnode*)result->info.typ->ref), ident(result->sym->name)); else if (!is_void(result->info.typ)) fprintf(fd, "\n\tif (!%s)\n\t\treturn soap_closesock(soap);\n\tsoap_default_%s(soap, %s);", ident(result->sym->name), c_ident((Tnode*)result->info.typ->ref), ident(result->sym->name)); fprintf(fd, "\n\tif (soap_begin_recv(soap)"); fprintf(fd, "\n\t || soap_envelope_begin_in(soap)"); fprintf(fd, "\n\t || soap_recv_header(soap)"); fprintf(fd, "\n\t || soap_body_begin_in(soap))"); fprintf(fd, "\n\t\treturn soap_closesock(soap);"); if (is_transient(result->info.typ)) { if (sflag) fprintf(fd, "\n\tsoap->mode |= SOAP_XML_STRICT;"); fprintf(fd, "\n\tsoap_get_%s(soap, %s, \"%s\", NULL);", ident(method->sym->name), ident(result->sym->name), ns_convert(method->sym->name)); fprintf(fd, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap->level == 2)\n\t\tsoap->error = SOAP_OK;"); fprintf(fd, "\n\tif (soap->error"); fprintf(fd, "\n\t || soap_body_end_in(soap)"); fprintf(fd, "\n\t || soap_envelope_end_in(soap)"); fprintf(fd, "\n\t || soap_end_recv(soap))"); fprintf(fd, "\n\t\treturn soap_closesock(soap);"); fprintf(fd, "\n\treturn soap_closesock(soap);\n}"); fflush(fd); return; } /* With RPC encoded responses, try to parse the fault first */ if (!is_literal(method_response_encoding)) { fprintf(fd, "\n\tif (soap_recv_fault(soap, 1))\n\t\treturn soap->error;"); xtag = ""; } else if ((wflag && !is_unmatched(result->sym)) || has_ns_eq(NULL, result->sym->name)) /* to ensure element name of response can be unqualified */ { if (response) xtag = xml_tag(response->info.typ); else xtag = ns_convert(result->sym->name); } else { if (response) xtag = xml_tag(response->info.typ); else xtag = xml_tag(result->info.typ); } if (sflag) fprintf(fd, "\n\tsoap->mode |= SOAP_XML_STRICT;"); if (response) { fprintf(fd, "\n\tsoap_tmp_%s = soap_get_%s(soap, NULL, \"%s\", NULL);", c_ident(response->info.typ), c_ident(response->info.typ), xtag); fprintf(fd, "\n\tif (!soap_tmp_%s || soap->error)\n\t\treturn soap_recv_fault(soap, 0);", c_ident(response->info.typ)); } else if ((result->info.typ->type == Treference || result->info.typ->type == Tpointer) && !is_invisible_empty((Tnode*)result->info.typ->ref)) { if (result->info.typ->type == Treference && ((Tnode *) result->info.typ->ref)->type == Tclass && !is_external((Tnode*)result->info.typ->ref) && !is_volatile((Tnode*)result->info.typ->ref) && !is_dynamic_array((Tnode*)result->info.typ->ref)) fprintf(fd, "\n\t%s.soap_get(soap, \"%s\", NULL);", ident(result->sym->name), xtag); else if (result->info.typ->type == Tpointer && ((Tnode *) result->info.typ->ref)->type == Tclass && !is_external((Tnode*)result->info.typ->ref) && !is_volatile((Tnode*)result->info.typ->ref) && !is_dynamic_array((Tnode*)result->info.typ->ref)) fprintf(fd, "\n\t%s->soap_get(soap, \"%s\", NULL);", ident(result->sym->name), xtag); else if (result->info.typ->type == Treference && ((Tnode *) result->info.typ->ref)->type == Tstruct && !is_external((Tnode*)result->info.typ->ref) && !is_volatile((Tnode*)result->info.typ->ref) && !is_dynamic_array((Tnode*)result->info.typ->ref)) { fprintf(fd, "\n\tsoap_get_%s(soap, &%s, \"%s\", NULL);", c_ident((Tnode*)result->info.typ->ref), ident(result->sym->name), xtag); } else if (result->info.typ->type == Tpointer && ((Tnode *) result->info.typ->ref)->type == Tstruct && !is_dynamic_array((Tnode*)result->info.typ->ref)) { fprintf(fd, "\n\tsoap_get_%s(soap, %s, \"%s\", NULL);", c_ident((Tnode*)result->info.typ->ref), ident(result->sym->name), xtag); } else if (result->info.typ->type == Tpointer && is_XML((Tnode*)result->info.typ->ref) && is_string((Tnode*)result->info.typ->ref)) { fprintf(fd, "\n\tsoap_inliteral(soap, NULL, (char**)%s);", ident(result->sym->name)); } else if (result->info.typ->type == Treference && is_XML((Tnode*)result->info.typ->ref) && is_string((Tnode*)result->info.typ->ref)) { fprintf(fd, "\n\tsoap_inliteral(soap, NULL, (char**)&%s);", ident(result->sym->name)); } else if (result->info.typ->type == Tpointer && is_XML((Tnode*)result->info.typ->ref) && is_wstring((Tnode*)result->info.typ->ref)) { fprintf(fd, "\n\tsoap_inwliteral(soap, NULL, (wchar_t**)%s);", ident(result->sym->name)); } else if (result->info.typ->type == Treference && is_XML((Tnode*)result->info.typ->ref) && is_wstring((Tnode*)result->info.typ->ref)) { fprintf(fd, "\n\tsoap_inwliteral(soap, NULL, (wchar_t**)&%s);", ident(result->sym->name)); } else if (result->info.typ->type == Treference) { fprintf(fd, "\n\tsoap_get_%s(soap, &%s, \"%s\", NULL);", c_ident(result->info.typ), ident(result->sym->name), xtag); } else { fprintf(fd, "\n\tsoap_get_%s(soap, %s, \"%s\", NULL);", c_ident(result->info.typ), ident(result->sym->name), xtag); } fprintf(fd, "\n\tif (soap->error)\n\t\treturn soap_recv_fault(soap, 0);"); } else if (is_literal(method_response_encoding)) { fprintf(fd, "\n\tif (soap_recv_fault(soap, 1))\n\t\treturn soap->error;"); } fflush(fd); fprintf(fd, "\n\tif (soap_body_end_in(soap)"); fprintf(fd, "\n\t || soap_envelope_end_in(soap)"); fprintf(fd, "\n\t || soap_end_recv(soap))"); fprintf(fd, "\n\t\treturn soap_closesock(soap);"); if (response) { if (result->info.typ->type == Tarray) fprintf(fd, "\n\tsoap_memcpy(%s, sizeof(%s), soap_tmp_%s->%s, sizeof(%s));", ident(result->sym->name), c_ident(response->info.typ), c_type(result->info.typ), ident(result->sym->name), c_type(result->info.typ)); else if (result->info.typ->type == Treference) fprintf(fd, "\n\t%s = soap_tmp_%s->%s;", ident(result->sym->name), c_ident(response->info.typ), ident(result->sym->name)); else { fprintf(fd, "\n\tif (%s && soap_tmp_%s->%s)", ident(result->sym->name), c_ident(response->info.typ), ident(result->sym->name)); fprintf(fd, "\n\t\t*%s = *soap_tmp_%s->%s;", ident(result->sym->name), c_ident(response->info.typ), ident(result->sym->name)); } } fprintf(fd, "\n\treturn soap_closesock(soap);"); fprintf(fd , "\n}"); fflush(fd); } void gen_serve_method(FILE *fd, Table *table, Entry *param, const char *name) { Service *sp = NULL; const char *style, *encoding; Entry *result, *p, *q, *pin, *pout, *response = NULL; Table *input; const char *xtag; Method *m; const char *method_encoding = NULL, *method_response_encoding = NULL; result = (Entry*)param->info.typ->ref; p = entry(classtable, param->sym); if (!p) execerror("no table entry"); if (!is_response(result->info.typ) && !is_XML(result->info.typ)) response = get_response(param->info.typ); q = entry(table, param->sym); if (!q) execerror("no table entry"); pout = (Entry*)q->info.typ->ref; if (name) { if (iflag) fprintf(fd, "\n\nstatic int serve_%s(%s *soap)\n{", ident(param->sym->name), name); else fprintf(fd, "\n\nstatic int serve_%s(struct soap *soap, %s *service)\n{", ident(param->sym->name), name); } else { fprintf(fheader, "\n\nSOAP_FMAC5 int SOAP_FMAC6 soap_serve_%s(struct soap*);", ident(param->sym->name)); fprintf(fd, "\n\nSOAP_FMAC5 int SOAP_FMAC6 soap_serve_%s(struct soap *soap)\n{", ident(param->sym->name)); } fprintf(fd, "\tstruct %s soap_tmp_%s;", ident(param->sym->name), ident(param->sym->name)); for (sp = services; sp; sp = sp->next) { if (has_ns_eq(sp->ns, param->sym->name)) { style = sp->style; encoding = sp->encoding; method_encoding = encoding; method_response_encoding = NULL; for (m = sp->list; m; m = m->next) { if (is_eq_nons(m->name, param->sym->name)) { if (m->mess == ENCODING) method_encoding = m->part; else if (m->mess == RESPONSE_ENCODING) method_response_encoding = m->part; } } break; } } if (!method_response_encoding) method_response_encoding = method_encoding; fflush(fd); if (!is_transient(pout->info.typ)) { if (pout->info.typ->type == Tarray && response) { fprintf(fd, "\n\tstruct %s soap_tmp_%s;", c_ident(response->info.typ), c_ident(response->info.typ)); fprintf(fd, "\n\tsoap_default_%s(soap, &soap_tmp_%s);", c_ident(response->info.typ), c_ident(response->info.typ)); } else if (pout->info.typ->type == Tpointer && !is_stdstring(pout->info.typ) && !is_stdwstring(pout->info.typ) && response) { fprintf(fd, "\n\tstruct %s soap_tmp_%s;", c_ident(response->info.typ), c_ident(response->info.typ)); fprintf(fd, "\n\t%s soap_tmp_%s;", c_type((Tnode*)pout->info.typ->ref), c_ident((Tnode*)pout->info.typ->ref)); fprintf(fd, "\n\tsoap_default_%s(soap, &soap_tmp_%s);", c_ident(response->info.typ), c_ident(response->info.typ)); if (((Tnode*)pout->info.typ->ref)->type == Tclass && !is_external((Tnode*)pout->info.typ->ref) && !is_volatile((Tnode*)pout->info.typ->ref) && !is_typedef((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\tsoap_tmp_%s.soap_default(soap);", c_ident((Tnode*)pout->info.typ->ref)); else if (((Tnode*)pout->info.typ->ref)->type == Tpointer) fprintf(fd, "\n\tsoap_tmp_%s = NULL;", c_ident((Tnode*)pout->info.typ->ref)); else fprintf(fd, "\n\tsoap_default_%s(soap, &soap_tmp_%s);", c_ident((Tnode*)pout->info.typ->ref), c_ident((Tnode*)pout->info.typ->ref)); fprintf(fd, "\n\tsoap_tmp_%s.%s = &soap_tmp_%s;", c_ident(response->info.typ), ident(pout->sym->name), c_ident((Tnode*)pout->info.typ->ref)); } else if (response) { fprintf(fd, "\n\tstruct %s soap_tmp_%s;", c_ident(response->info.typ), c_ident(response->info.typ)); fprintf(fd, "\n\tsoap_default_%s(soap, &soap_tmp_%s);", c_ident(response->info.typ), c_ident(response->info.typ)); } else if (((Tnode *)pout->info.typ->ref)->type == Tclass && !is_stdstring((Tnode*)pout->info.typ->ref) && !is_stdwstring((Tnode*)pout->info.typ->ref) && (is_external((Tnode*)pout->info.typ->ref) || is_volatile((Tnode*)pout->info.typ->ref) || is_typedef((Tnode*)pout->info.typ->ref)) && !is_dynamic_array((Tnode*)pout->info.typ->ref)) { fprintf(fd, "\n\t%s %s;", c_type((Tnode*)pout->info.typ->ref), ident(pout->sym->name)); fprintf(fd, "\n\tsoap_default_%s(soap, &%s);", c_ident((Tnode*)pout->info.typ->ref), ident(pout->sym->name)); } else if (((Tnode *)pout->info.typ->ref)->type == Tclass && !is_stdstring((Tnode*)pout->info.typ->ref) && !is_stdwstring((Tnode*)pout->info.typ->ref) && !is_dynamic_array((Tnode*)pout->info.typ->ref)) { fprintf(fd, "\n\t%s %s;", c_type((Tnode*)pout->info.typ->ref), ident(pout->sym->name)); fprintf(fd, "\n\t%s.soap_default(soap);", ident(pout->sym->name)); } else if (((Tnode *)pout->info.typ->ref)->type == Tstruct && !is_dynamic_array((Tnode*)pout->info.typ->ref)) { fprintf(fd, "\n\t%s %s;", c_type((Tnode*)pout->info.typ->ref), ident(pout->sym->name)); fprintf(fd, "\n\tsoap_default_%s(soap, &%s);", c_ident((Tnode *)pout->info.typ->ref), ident(pout->sym->name)); } else { fprintf(fd, "\n\t%s soap_tmp_%s;", c_type((Tnode*)pout->info.typ->ref), c_ident((Tnode*)pout->info.typ->ref)); if (is_string((Tnode*)pout->info.typ->ref) || is_wstring((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\tsoap_tmp_%s = NULL;", c_ident((Tnode*)pout->info.typ->ref)); else fprintf(fd, "\n\tsoap_default_%s(soap, &soap_tmp_%s);", c_ident((Tnode*)pout->info.typ->ref), c_ident((Tnode*)pout->info.typ->ref)); } } fprintf(fd, "\n\tsoap_default_%s(soap, &soap_tmp_%s);", ident(param->sym->name), ident(param->sym->name)); fflush(fd); q = entry(classtable, param->sym); if (!is_invisible_empty(q->info.typ)) { fprintf(fd, "\n\tif (!soap_get_%s(soap, &soap_tmp_%s, \"%s\", NULL))", ident(param->sym->name), ident(param->sym->name), ns_convert(param->sym->name)); fprintf(fd, "\n\t\treturn soap->error;"); } fprintf(fd, "\n\tif (soap_body_end_in(soap)"); fprintf(fd, "\n\t || soap_envelope_end_in(soap)"); fprintf(fd, "\n\t || soap_end_recv(soap))\n\t\treturn soap->error;"); if (name) { if (iflag) fprintf(fd, "\n\tsoap->error = soap->%s(", ns_cname(param->sym->name, NULL)); else fprintf(fd, "\n\tsoap->error = service->%s(", ns_cname(param->sym->name, NULL)); } else fprintf(fd, "\n\tsoap->error = %s(soap", ident(param->sym->name)); fflush(fd); input = (Table*) q->info.typ->ref; for (pin = input->list; pin; pin = pin->next) { if (pin->info.typ->type == Trvalueref) fprintf(fd, "%sstd::move(soap_tmp_%s.%s)", !name || pin != input->list ? ", " : "", ident(param->sym->name), ident(pin->sym->name)); else fprintf(fd, "%ssoap_tmp_%s.%s", !name || pin != input->list ? ", " : "", ident(param->sym->name), ident(pin->sym->name)); } if (is_transient(pout->info.typ)) fprintf(fd, ");"); else { if (!name || input->list) fprintf(fd, ", "); if (response) fprintf(fd, "soap_tmp_%s.%s);", c_ident(response->info.typ), ident(pout->sym->name)); else if (pout->info.typ->type == Treference && (((Tnode*)pout->info.typ->ref)->type == Tstruct || ((Tnode*)pout->info.typ->ref)->type == Tclass) && !is_stdstring((Tnode*)pout->info.typ->ref) && !is_stdwstring((Tnode*)pout->info.typ->ref) && !is_dynamic_array((Tnode*)pout->info.typ->ref)) fprintf(fd, "%s);", ident(pout->sym->name)); else if ((((Tnode*)pout->info.typ->ref)->type == Tstruct || ((Tnode*)pout->info.typ->ref)->type == Tclass) && !is_stdstring((Tnode*)pout->info.typ->ref) && !is_stdwstring((Tnode*)pout->info.typ->ref) && !is_dynamic_array((Tnode*)pout->info.typ->ref)) fprintf(fd, "&%s);", ident(pout->sym->name)); else if (pout->info.typ->type == Treference) fprintf(fd, "soap_tmp_%s);", c_ident((Tnode*)pout->info.typ->ref)); else fprintf(fd, "&soap_tmp_%s);", c_ident((Tnode*)pout->info.typ->ref)); } fprintf(fd, "\n\tif (soap->error)\n\t\treturn soap->error;"); if (!is_transient(pout->info.typ)) { if (sp && sp->URI && method_response_encoding) { if (is_literal(method_response_encoding)) fprintf(fd, "\n\tsoap->encodingStyle = NULL;"); else if (sp->encoding) fprintf(fd, "\n\tsoap->encodingStyle = \"%s\";", sp->encoding); else if (method_response_encoding) fprintf(fd, "\n\tsoap->encodingStyle = \"%s\";", method_response_encoding); else if (!eflag) fprintf(fd, "\n\tsoap->encodingStyle = NULL;"); } else if (!eflag) fprintf(fd, "\n\tsoap->encodingStyle = NULL;"); fprintf(fd, "\n\tsoap_serializeheader(soap);"); if (pout->info.typ->type == Tarray && response) fprintf(fd, "\n\tsoap_serialize_%s(soap, &soap_tmp_%s);", c_ident(response->info.typ), c_ident(response->info.typ)); else if (response) fprintf(fd, "\n\tsoap_serialize_%s(soap, &soap_tmp_%s);", c_ident(response->info.typ), c_ident(response->info.typ)); else if (((Tnode *)pout->info.typ->ref)->type == Tclass && !is_stdstring((Tnode*)pout->info.typ->ref) && !is_stdwstring((Tnode*)pout->info.typ->ref) && (is_external((Tnode*)pout->info.typ->ref) || is_volatile((Tnode*)pout->info.typ->ref) || is_typedef((Tnode*)pout->info.typ->ref)) && !is_dynamic_array((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\tsoap_serialize_%s(soap, &%s);", c_ident((Tnode*)pout->info.typ->ref), ident(pout->sym->name)); else if (((Tnode *)pout->info.typ->ref)->type == Tclass && !is_stdstring((Tnode*)pout->info.typ->ref) && !is_stdwstring((Tnode*)pout->info.typ->ref) && !is_dynamic_array((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\t%s.soap_serialize(soap);", ident(pout->sym->name)); else if (((Tnode *)pout->info.typ->ref)->type == Tstruct && !is_dynamic_array((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\tsoap_serialize_%s(soap, &%s);", c_ident((Tnode*)pout->info.typ->ref), ident(pout->sym->name)); else if (!is_XML((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\tsoap_serialize_%s(soap, &soap_tmp_%s);", c_ident((Tnode*)pout->info.typ->ref), c_ident((Tnode*)pout->info.typ->ref)); if (is_literal(method_response_encoding) && ((wflag && !is_unmatched(pout->sym)) || has_ns_eq(NULL, pout->sym->name))) /* to ensure element name of response can be unqualified */ xtag = ns_convert(pout->sym->name); else xtag = xml_tag(pout->info.typ); fprintf(fd, "\n\tif (soap_begin_count(soap))\n\t\treturn soap->error;"); fprintf(fd, "\n\tif (soap->mode & SOAP_IO_LENGTH)"); fprintf(fd, "\n\t{\tif (soap_envelope_begin_out(soap)"); fprintf(fd, "\n\t\t || soap_putheader(soap)"); fprintf(fd, "\n\t\t || soap_body_begin_out(soap)"); if (response) fprintf(fd, "\n\t\t || soap_put_%s(soap, &soap_tmp_%s, \"%s\", NULL)", c_ident(response->info.typ), c_ident(response->info.typ), xml_tag(response->info.typ)); else if (((Tnode*)pout->info.typ->ref)->type == Tclass && !is_stdstring((Tnode*)pout->info.typ->ref) && !is_stdwstring((Tnode*)pout->info.typ->ref) && (is_external((Tnode*)pout->info.typ->ref) || is_volatile((Tnode*)pout->info.typ->ref) || is_typedef((Tnode*)pout->info.typ->ref)) && !is_dynamic_array((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\t\t || soap_put_%s(soap, &%s, \"%s\", NULL)", c_ident((Tnode*)pout->info.typ->ref), ident(pout->sym->name), ns_convert(pout->sym->name)); else if (((Tnode*)pout->info.typ->ref)->type == Tclass && !is_stdstring((Tnode*)pout->info.typ->ref) && !is_stdwstring((Tnode*)pout->info.typ->ref) && !is_dynamic_array((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\t\t || %s.soap_put(soap, \"%s\", \"\")", ident(pout->sym->name), xtag); else if (((Tnode*)pout->info.typ->ref)->type == Tstruct && !is_dynamic_array((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\t\t || soap_put_%s(soap, &%s, \"%s\", NULL)", c_ident((Tnode*)pout->info.typ->ref), ident(pout->sym->name), xtag); else if (is_XML((Tnode*)pout->info.typ->ref) && is_string((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\t\t || soap_outliteral(soap, \"%s\", &soap_tmp_%s, NULL)", ns_convert(pout->sym->name), c_ident((Tnode*)pout->info.typ->ref)); else if (is_XML((Tnode*)pout->info.typ->ref) && is_wstring((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\t\t || soap_outwliteral(soap, \"%s\", &soap_tmp_%s, NULL)", ns_convert(pout->sym->name), c_ident((Tnode*)pout->info.typ->ref)); else fprintf(fd, "\n\t\t || soap_put_%s(soap, &soap_tmp_%s, \"%s\", NULL)", c_ident(pout->info.typ), c_ident((Tnode*)pout->info.typ->ref), ns_convert(pout->sym->name)); fprintf(fd, "\n\t\t || soap_body_end_out(soap)"); fprintf(fd, "\n\t\t || soap_envelope_end_out(soap))"); fprintf(fd, "\n\t\t\t return soap->error;"); fprintf(fd, "\n\t};"); fprintf(fd, "\n\tif (soap_end_count(soap)"); fprintf(fd, "\n\t || soap_response(soap, SOAP_OK)"); fprintf(fd, "\n\t || soap_envelope_begin_out(soap)"); fprintf(fd, "\n\t || soap_putheader(soap)"); fprintf(fd, "\n\t || soap_body_begin_out(soap)"); if (response) fprintf(fd, "\n\t || soap_put_%s(soap, &soap_tmp_%s, \"%s\", NULL)", c_ident(response->info.typ), c_ident(response->info.typ), xml_tag(response->info.typ)); else if (((Tnode *)pout->info.typ->ref)->type == Tclass && !is_stdstring((Tnode*)pout->info.typ->ref) && !is_stdwstring((Tnode*)pout->info.typ->ref) && (is_external((Tnode*)pout->info.typ->ref) || is_volatile((Tnode*)pout->info.typ->ref) || is_typedef((Tnode*)pout->info.typ->ref)) && !is_dynamic_array((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\t || soap_put_%s(soap, &%s, \"%s\", NULL)", c_ident((Tnode*)pout->info.typ->ref), ident(pout->sym->name), ns_convert(pout->sym->name)); else if (((Tnode *)pout->info.typ->ref)->type == Tclass && !is_stdstring((Tnode*)pout->info.typ->ref) && !is_stdwstring((Tnode*)pout->info.typ->ref) && !is_dynamic_array((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\t || %s.soap_put(soap, \"%s\", \"\")", ident(pout->sym->name), xtag); else if (((Tnode *)pout->info.typ->ref)->type == Tstruct && !is_dynamic_array((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\t || soap_put_%s(soap, &%s, \"%s\", NULL)", c_ident((Tnode*)pout->info.typ->ref), ident(pout->sym->name), xtag); else if (is_XML((Tnode*)pout->info.typ->ref) && is_string((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\t || soap_outliteral(soap, \"%s\", &soap_tmp_%s, NULL)", ns_convert(pout->sym->name), c_ident((Tnode*)pout->info.typ->ref)); else if (is_XML((Tnode*)pout->info.typ->ref) && is_wstring((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\t || soap_outwliteral(soap, \"%s\", &soap_tmp_%s, NULL)", ns_convert(pout->sym->name), c_ident((Tnode*)pout->info.typ->ref)); else fprintf(fd, "\n\t || soap_put_%s(soap, &soap_tmp_%s, \"%s\", NULL)", c_ident(pout->info.typ), c_ident((Tnode*)pout->info.typ->ref), ns_convert(pout->sym->name)); fprintf(fd, "\n\t || soap_body_end_out(soap)"); fprintf(fd, "\n\t || soap_envelope_end_out(soap)"); fprintf(fd, "\n\t || soap_end_send(soap))"); fprintf(fd, "\n\t\treturn soap->error;"); } fprintf(fd, "\n\treturn soap_closesock(soap);"); fprintf(fd, "\n}"); fflush(fd); } void gen_object_code(FILE *fd, Table *table, Symbol *ns, const char *name) { Entry *p, *method, *catch_method, *param; Table *t; const char *soap, *catch_action; if (iflag) soap = "this"; else soap = "this->soap"; fprintf(fd, "\n\n#include \"%s%s.h\"", prefix, name); if (namespaceid) fprintf(fd, "\n\nnamespace %s {", namespaceid); if (iflag) { fprintf(fd, "\n\n%s::%s() : soap(SOAP_IO_DEFAULT)\n{\t%s_init(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT);\n}", name, name, name); fprintf(fd, "\n\n%s::%s(const %s& rhs)\n{\tsoap_copy_context(this, &rhs);\n}", name, name, name); fprintf(fd, "\n\n%s::%s(const struct soap &_soap) : soap(_soap)\n{ }", name, name); fprintf(fd, "\n\n%s::%s(soap_mode iomode) : soap(iomode)\n{\t%s_init(iomode, iomode);\n}", name, name, name); fprintf(fd, "\n\n%s::%s(soap_mode imode, soap_mode omode) : soap(imode, omode)\n{\t%s_init(imode, omode);\n}", name, name, name); fprintf(fd, "\n\n%s::~%s()\n{\n\tthis->destroy();\n}", name, name); } else { fprintf(fd, "\n\n%s::%s()\n{\tthis->soap = soap_new();\n\tthis->soap_own = true;\n\t%s_init(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT);\n}", name, name, name); fprintf(fd, "\n\n%s::%s(const %s& rhs)\n{\tthis->soap = rhs.soap;\n\tthis->soap_own = false;\n}", name, name, name); fprintf(fd, "\n\n%s::%s(struct soap *_soap)\n{\tthis->soap = _soap;\n\tthis->soap_own = false;\n\t%s_init(_soap->imode, _soap->omode);\n}", name, name, name); fprintf(fd, "\n\n%s::%s(soap_mode iomode)\n{\tthis->soap = soap_new();\n\tthis->soap_own = true;\n\t%s_init(iomode, iomode);\n}", name, name, name); fprintf(fd, "\n\n%s::%s(soap_mode imode, soap_mode omode)\n{\tthis->soap = soap_new();\n\tthis->soap_own = true;\n\t%s_init(imode, omode);\n}", name, name, name); fprintf(fd, "\n\n%s::~%s()\n{\tif (this->soap_own)\n\t\tsoap_free(this->soap);\n}", name, name); } fprintf(fd, "\n\nvoid %s::%s_init(soap_mode imode, soap_mode omode)\n{\tsoap_imode(%s, imode);\n\tsoap_omode(%s, omode);\n\tstatic const struct Namespace namespaces[] =\n", name, name, soap, soap); gen_nsmap(fd); fprintf(fd, "\tsoap_set_namespaces(%s, namespaces);\n}", soap); fprintf(fd, "\n\nvoid %s::destroy()\n{\tsoap_destroy(%s);\n\tsoap_end(%s);\n}", name, soap, soap); fprintf(fd, "\n\nvoid %s::reset()\n{\tthis->destroy();\n\tsoap_done(%s);\n\tsoap_initialize(%s);\n\t%s_init(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT);\n}", name, soap, soap, name); if (iflag) { fprintf(fd, "\n\n#ifndef WITH_PURE_VIRTUAL\n%s *%s::copy()\n{\t%s *dup = SOAP_NEW_COPY(%s(*(struct soap*)%s));\n\treturn dup;\n}\n#endif", name, name, name, name, soap); fprintf(fd, "\n\n%s& %s::operator=(const %s& rhs)\n{\tsoap_copy_context(this, &rhs);\n\treturn *this;\n}", name, name, name); } else { fprintf(fd, "\n\n#ifndef WITH_PURE_VIRTUAL\n%s *%s::copy()\n{\t%s *dup = SOAP_NEW_COPY(%s);\n\tif (dup)\n\t\tsoap_copy_context(dup->soap, this->soap);\n\treturn dup;\n}\n#endif", name, name, name, name); fprintf(fd, "\n\n%s& %s::operator=(const %s& rhs)\n{\tif (this->soap_own)\n\t\tsoap_free(this->soap);\n\tthis->soap = rhs.soap;\n\tthis->soap_own = false;\n\treturn *this;\n}", name, name, name); } fprintf(fd, "\n\nint %s::soap_close_socket()\n{\treturn soap_closesock(%s);\n}", name, soap); fprintf(fd, "\n\nint %s::soap_force_close_socket()\n{\treturn soap_force_closesock(%s);\n}", name, soap); fprintf(fd, "\n\nint %s::soap_senderfault(const char *string, const char *detailXML)\n{\treturn ::soap_sender_fault(%s, string, detailXML);\n}", name, soap); fprintf(fd, "\n\nint %s::soap_senderfault(const char *subcodeQName, const char *string, const char *detailXML)\n{\treturn ::soap_sender_fault_subcode(%s, subcodeQName, string, detailXML);\n}", name, soap); fprintf(fd, "\n\nint %s::soap_receiverfault(const char *string, const char *detailXML)\n{\treturn ::soap_receiver_fault(%s, string, detailXML);\n}", name, soap); fprintf(fd, "\n\nint %s::soap_receiverfault(const char *subcodeQName, const char *string, const char *detailXML)\n{\treturn ::soap_receiver_fault_subcode(%s, subcodeQName, string, detailXML);\n}", name, soap); fprintf(fd, "\n\nvoid %s::soap_print_fault(FILE *fd)\n{\t::soap_print_fault(%s, fd);\n}", name, soap); fprintf(fd, "\n\n#ifndef WITH_LEAN\n#ifndef WITH_COMPAT\nvoid %s::soap_stream_fault(std::ostream& os)\n{\t::soap_stream_fault(%s, os);\n}\n#endif", name, soap); fprintf(fd, "\n\nchar *%s::soap_sprint_fault(char *buf, size_t len)\n{\treturn ::soap_sprint_fault(%s, buf, len);\n}\n#endif", name, soap); fprintf(fd, "\n\nvoid %s::soap_noheader()\n{\t%s->header = NULL;\n}", name, soap); if (!namespaceid) { p = entry(classtable, lookup("SOAP_ENV__Header")); if (p) { t = (Table*)p->info.typ->ref; if (t && t->list && !is_void(t->list->info.typ)) { fprintf(fd, "\n\nvoid %s::soap_header(", name); gen_params(fd, t, NULL, 0); fprintf(fd, "\n{\t::soap_header(%s);", soap); for (param = t->list; param; param = param->next) { if (namespaceid) fprintf(fd, "\n\t((%s::SOAP_ENV__Header*)%s->header)->%s = %s;", namespaceid, soap, ident(param->sym->name), ident(param->sym->name)); else fprintf(fd, "\n\t%s->header->%s = %s;", soap, ident(param->sym->name), ident(param->sym->name)); } fprintf(fd, "\n}"); } } } fprintf(fd, "\n\nconst SOAP_ENV__Header *%s::soap_header()\n{\treturn %s->header;\n}", name, soap); fprintf(fd, "\n\nint %s::run(int port)\n{\tif (!soap_valid_socket(%s->master) && !soap_valid_socket(this->bind(NULL, port, 100)))\n\t\treturn %s->error;\n\tfor (;;)\n\t{\tif (!soap_valid_socket(this->accept()))\n\t\t{\tif (%s->errnum == 0) // timeout?\n\t\t\t\t%s->error = SOAP_OK;\n\t\t\tbreak;\n\t\t}\n\t\tif (this->serve())\n\t\t\tbreak;\n\t\tthis->destroy();\n\t}\n\treturn %s->error;\n}", name, soap, soap, soap, soap, soap); fprintf(fd, "\n\n#if defined(WITH_OPENSSL) || defined(WITH_GNUTLS)"); fprintf(fd, "\nint %s::ssl_run(int port)\n{\tif (!soap_valid_socket(%s->master) && !soap_valid_socket(this->bind(NULL, port, 100)))\n\t\treturn %s->error;\n\tfor (;;)\n\t{\tif (!soap_valid_socket(this->accept()))\n\t\t{\tif (%s->errnum == 0) // timeout?\n\t\t\t\t%s->error = SOAP_OK;\n\t\t\tbreak;\n\t\t}\n\t\tif (this->ssl_accept() || this->serve())\n\t\t\tbreak;\n\t\tthis->destroy();\n\t}\n\treturn %s->error;\n}", name, soap, soap, soap, soap, soap); fprintf(fd, "\n#endif"); fprintf(fd, "\n\nSOAP_SOCKET %s::bind(const char *host, int port, int backlog)\n{\treturn soap_bind(%s, host, port, backlog);\n}", name, soap); fprintf(fd, "\n\nSOAP_SOCKET %s::accept()\n{\treturn soap_accept(%s);\n}", name, soap); fprintf(fd, "\n\n#if defined(WITH_OPENSSL) || defined(WITH_GNUTLS)"); fprintf(fd, "\nint %s::ssl_accept()\n{\treturn soap_ssl_accept(%s);\n}", name, soap); fprintf(fd, "\n#endif"); fprintf(fd, "\n\nint %s::serve()", name); fprintf(fd, "\n{\n#ifndef WITH_FASTCGI\n\tunsigned int k = %s->max_keep_alive;\n#endif\n\tdo\n\t{", soap); fprintf(fd, "\n\n#ifndef WITH_FASTCGI\n\t\tif (%s->max_keep_alive > 0 && !--k)\n\t\t\t%s->keep_alive = 0;\n#endif", soap, soap); fprintf(fd, "\n\n\t\tif (soap_begin_serve(%s))\n\t\t{\tif (%s->error >= SOAP_STOP)\n\t\t\t\tcontinue;\n\t\t\treturn %s->error;\n\t\t}", soap, soap, soap); fprintf(fd, "\n\t\tif (dispatch() || (%s->fserveloop && %s->fserveloop(%s)))\n\t\t{\n#ifdef WITH_FASTCGI\n\t\t\tsoap_send_fault(%s);\n#else\n\t\t\treturn soap_send_fault(%s);\n#endif\n\t\t}", soap, soap, soap, soap, soap); fprintf(fd, "\n\n#ifdef WITH_FASTCGI\n\t\tsoap_destroy(%s);\n\t\tsoap_end(%s);\n\t} while (1);\n#else\n\t} while (%s->keep_alive);\n#endif", soap, soap, soap); fprintf(fd, "\n\treturn SOAP_OK;"); fprintf(fd, "\n}\n"); for (method = table->list; method; method = method->next) { if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && has_ns_eq(ns->name, method->sym->name)) { if (jflag) fprintf(fd, "\nstatic int serve_%s(struct soap*, %s*);", ident(method->sym->name), name); else fprintf(fd, "\nstatic int serve_%s(%s*);", ident(method->sym->name), name); } } fprintf(fd, "\n\nint %s::dispatch()\n{", name); if (!iflag) { fprintf(fd, "\treturn dispatch(this->soap);\n}"); fprintf(fd, "\n\nint %s::dispatch(struct soap* soap)\n{", name); fprintf(fd, "\n\t%s_init(soap->imode, soap->omode);\n", name); soap = "soap"; } if (sflag) fprintf(fd, "\n\tsoap->mode |= SOAP_XML_STRICT;"); fprintf(fd, "\n\tsoap_peek_element(%s);", soap); catch_method = NULL; catch_action = NULL; for (method = table->list; method; method = method->next) { const char *action = NULL; if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && has_ns_eq(ns->name, method->sym->name)) { if (aflag) { Service *sp; for (sp = services; sp; sp = sp->next) { if (has_ns_eq(sp->ns, method->sym->name)) { Method *m; for (m = sp->list; m; m = m->next) { if (is_eq_nons(m->name, method->sym->name)) { if (m->mess == ACTION || m->mess == REQUEST_ACTION) action = m->part; } } } } } if (is_invisible(method->sym->name)) { Entry *param = entry(classtable, method->sym); if (param) param = ((Table*)param->info.typ->ref)->list; if (action) { if (*action == '"') { fprintf(fd, "\n\tif ("); if (param && !Aflag) fprintf(fd, "(!%s->action && !soap_match_tag(%s, %s->tag, \"%s\")) || ", soap, soap, soap, ns_convert(param->sym->name)); else { catch_method = method; catch_action = action; } fprintf(fd, "(%s->action && !strcmp(%s->action, %s))", soap, soap, action); } else { fprintf(fd, "\n\tif ("); if (param && !Aflag) fprintf(fd, "(!%s->action && !soap_match_tag(%s, %s->tag, \"%s\")) || ", soap, soap, soap, ns_convert(param->sym->name)); else { catch_method = method; catch_action = action; } fprintf(fd, "(%s->action && !strcmp(%s->action, \"%s\"))", soap, soap, action); } if (iflag) fprintf(fd, ")\n\t\treturn serve_%s(this);", ident(method->sym->name)); else fprintf(fd, ")\n\t\treturn serve_%s(%s, this);", ident(method->sym->name), soap); } else { if (Aflag) compliancewarn("Option -A requires a SOAPAction where none is defined"); if (param) { fprintf(fd, "\n\tif (!soap_match_tag(%s, %s->tag, \"%s\")", soap, soap, ns_convert(param->sym->name)); if (iflag) fprintf(fd, ")\n\t\treturn serve_%s(this);", ident(method->sym->name)); else fprintf(fd, ")\n\t\treturn serve_%s(%s, this);", ident(method->sym->name), soap); } else { catch_method = method; catch_action = action; } } } else { if (action) { if (*action == '"') { fprintf(fd, "\n\tif ("); if (!Aflag) fprintf(fd, "(!%s->action && !soap_match_tag(%s, %s->tag, \"%s\")) || ", soap, soap, soap, ns_convert(method->sym->name)); fprintf(fd, "(%s->action && !strcmp(%s->action, %s))", soap, soap, action); } else { fprintf(fd, "\n\tif ("); if (!Aflag) fprintf(fd, "(!%s->action && !soap_match_tag(%s, %s->tag, \"%s\")) || ", soap, soap, soap, ns_convert(method->sym->name)); fprintf(fd, "(%s->action && !strcmp(%s->action, \"%s\"))", soap, soap, action); } } else { if (Aflag) compliancewarn("Option -A requires a SOAPAction where none is defined"); fprintf(fd, "\n\tif (!soap_match_tag(%s, %s->tag, \"%s\")", soap, soap, ns_convert(method->sym->name)); } if (iflag) fprintf(fd, ")\n\t\treturn serve_%s(this);", ident(method->sym->name)); else fprintf(fd, ")\n\t\treturn serve_%s(%s, this);", ident(method->sym->name), soap); } } } if (catch_method) { if (Aflag && catch_action) { if (*catch_action == '"') { fprintf(fd, "\n\tif ("); fprintf(fd, "(%s->action && !strcmp(%s->action, %s))", soap, soap, catch_action); if (iflag) fprintf(fd, ")\n\t\treturn serve_%s(this);", ident(catch_method->sym->name)); else fprintf(fd, ")\n\t\treturn serve_%s(%s, this);", ident(catch_method->sym->name), soap); } else { fprintf(fd, "\n\tif ("); fprintf(fd, "(%s->action && !strcmp(%s->action, \"%s\"))", soap, soap, catch_action); if (iflag) fprintf(fd, ")\n\t\treturn serve_%s(this);", ident(catch_method->sym->name)); else fprintf(fd, ")\n\t\treturn serve_%s(%s, this);", ident(catch_method->sym->name), soap); } fprintf(fd, "\n\treturn %s->error = SOAP_NO_METHOD;", soap); } fprintf(fd, "\n\treturn serve_%s(this);\n}", ident(catch_method->sym->name)); } else fprintf(fd, "\n\treturn %s->error = SOAP_NO_METHOD;\n}", soap); for (method = table->list; method; method = method->next) if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && !is_imported(method->info.typ) && has_ns_eq(ns->name, method->sym->name)) gen_serve_method(fd, table, method, name); if (namespaceid) fprintf(fd, "\n\n} // namespace %s\n", namespaceid); fprintf(fd, "\n/* End of server object code */\n"); } void gen_response_begin(FILE *fd, int n, const char *s) { if (!is_invisible(s)) { fprintf(fd, "%*s<%sResponse", n, "", s); if (soap_version < 0) gen_xmlns(fd); fprintf(fd, ">\n"); } } void gen_response_end(FILE *fd, int n, const char *s) { if (!is_invisible(s)) fprintf(fd, "%*s\n", n, "", s); } void gen_element_begin(FILE *fd, int n, const char *s, const char *t) { if (!is_invisible(s)) { if (tflag && t && *t) fprintf(fd, "%*s<%s xsi:type=\"%s\"", n, "", s, t); else fprintf(fd, "%*s<%s", n, "", s); } } void gen_element_end(FILE *fd, int n, const char *s) { if (!is_invisible(s)) fprintf(fd, "%*s\n", n, "", s); else fprintf(fd, "\n"); } void gen_data(const char *buf, Table *t, const char *ns, const char *encoding) { Entry *p, *q, *r; FILE *fd; const char *method_encoding = NULL; const char *method_response_encoding = NULL; if (t) { for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun && !(p->info.sto & Sextern) && has_ns_eq(ns, p->sym->name)) { int get = 0, soap = 1, mime = 0; Service *sp; Method *m; const char *nse = ns_qualifiedElement(p->info.typ); const char *nsa = ns_qualifiedAttribute(p->info.typ); method_encoding = encoding; method_response_encoding = NULL; for (sp = services; sp; sp = sp->next) { if (!tagcmp(sp->ns, ns)) { for (m = sp->list; m; m = m->next) { if (is_eq_nons(m->name, p->sym->name)) { if (m->mess == ENCODING) method_encoding = m->part; else if (m->mess == RESPONSE_ENCODING) method_response_encoding = m->part; else if (m->mess&MIMEIN && !strcmp(m->part, "application/x-www-form-urlencoded")) mime = 1; else if (m->mess == PROTOCOL) { if (strncmp(m->part, "SOAP", 4)) soap = 0; if (strstr(m->part, "GET")) get = 1; } } } } } if (!method_response_encoding) method_response_encoding = method_encoding; /* request */ if (!get && !mime) { fd = gen_env(buf, ns_remove(p->sym->name), 0, method_encoding, soap); if (!fd) return; q = entry(classtable, p->sym); if (yflag) { fprintf(fd, "%*s\n"); } gen_element_begin(fd, 2, ns_convert(p->sym->name), NULL); if (q) { if (!is_invisible(p->sym->name)) { if (soap && soap_version < 0) gen_xmlns(fd); gen_atts(fd, (Table*)q->info.typ->ref, nsa); fprintf(fd, "\n"); } for (q = ((Table*)q->info.typ->ref)->list; q; q = q->next) gen_field(fd, 3, q, nse, nsa, method_encoding); } gen_element_end(fd, 2, ns_convert(p->sym->name)); if (soap && soap_version >= 0) fprintf(fd, " \n\n"); fclose(fd); } /* response */ q = (Entry*)p->info.typ->ref; if (!mime && q && !is_transient(q->info.typ)) { fd = gen_env(buf, ns_remove(p->sym->name), 1, method_response_encoding, soap); if (!fd) return; if (q && !is_response(q->info.typ)) { if (is_XML((Tnode*)q->info.typ->ref)) { gen_response_begin(fd, 2, ns_convert(p->sym->name)); gen_response_end(fd, 2, ns_convert(p->sym->name)); } else { gen_response_begin(fd, 2, ns_convert(p->sym->name)); gen_field(fd, 3, q, nse, nsa, method_response_encoding); gen_response_end(fd, 2, ns_convert(p->sym->name)); } } else if (q && q->info.typ->ref && ((Tnode*)q->info.typ->ref)->ref) { const char *xtag; nse = ns_qualifiedElement((Tnode*)q->info.typ->ref); nsa = ns_qualifiedAttribute((Tnode*)q->info.typ->ref); if ((wflag && !is_unmatched(q->sym)) || has_ns_eq(NULL, q->sym->name)) /* to ensure element name of response can be unqualified */ xtag = q->sym->name; else xtag = ((Tnode*)q->info.typ->ref)->id->name; if (yflag) fprintf(fd, "%*s\n", 2, "", ident(p->sym->name), c_type_id(q->info.typ, q->sym->name)); gen_element_begin(fd, 2, ns_addx(xtag, nse), NULL); if (!is_invisible(xtag)) { if (soap && soap_version < 0) gen_xmlns(fd); gen_atts(fd, (Table*)((Tnode*)q->info.typ->ref)->ref, nsa); fprintf(fd, "\n"); } for (r = ((Table*)((Tnode*)q->info.typ->ref)->ref)->list; r; r = r->next) gen_field(fd, 3, r, nse, nsa, method_response_encoding); gen_element_end(fd, 2, ns_addx(xtag, nse)); } fflush(fd); if (soap && soap_version >= 0) fprintf(fd, " \n\n"); fclose(fd); } } } } } void gen_field(FILE *fd, int n, Entry *p, const char *nse, const char *nsa, const char *encoding) { Entry *q; char tmp[32]; LONG64 i; int d; if (!(p->info.sto & (Sattribute | Sconst | Sprivate | Sprotected)) && !is_transient(p->info.typ) && p->info.typ->type != Tfun && strncmp(p->sym->name, "__size", 6) && strncmp(p->sym->name, "__type", 6) && !is_choice(p)) { if (is_soap12(encoding) && (p->info.sto & Sreturn) && (nse || has_ns_eq(NULL, p->sym->name)) && !is_literal(encoding)) fprintf(fd, "%*s%s\n", n, "", rpcURI, ns_add(p, nse)); if (is_XML(p->info.typ)) { if (yflag) fprintf(fd, "%*s\n", n, "", c_type_id(p->info.typ, p->sym->name)); gen_element_begin(fd, n, ns_add(p, nse), NULL); if (!is_invisible(p->sym->name)) fprintf(fd, ">"); else fprintf(fd, "%*s\n", n, ""); gen_element_end(fd, n, ns_add(p, nse)); } else { if (n >= 8 && !is_string(p->info.typ) && p->info.minOccurs <= 0) { return; } else if (n >= 8 && p->info.typ->type == Tpointer && !is_string(p->info.typ)) { gen_element_begin(fd, n, ns_add(p, nse), NULL); fprintf(fd, " xsi:nil=\"true\"/>"); return; } else if (n >= 16) { fprintf(fd, "%*s\n", n, ""); return; } else if (is_external(p->info.typ) && p->info.typ->sym) { gen_element_begin(fd, n, ns_add(p, nse), xsi_type(p->info.typ)); fprintf(fd, ">"); if (!strcmp(p->info.typ->sym->name, "xsd__boolean")) fprintf(fd, "false"); else if (!strcmp(p->info.typ->sym->name, "xsd__date")) fprintf(fd, "1999-12-31"); else if (!strcmp(p->info.typ->sym->name, "xsd__dateTime")) { char tmp[256]; time_t t = time(NULL), *p = &t; strftime(tmp, 256, "%Y-%m-%dT%H:%M:%SZ", gmtime(p)); fprintf(fd, "%s", tmp); } else if (!strcmp(p->info.typ->sym->name, "xsd__duration")) fprintf(fd, "PT0S"); else if (!strcmp(p->info.typ->sym->name, "xsd__time")) fprintf(fd, "12:34:56.789Z"); fflush(fd); } else if (is_fixedstring(p->info.typ)) { if (yflag) fprintf(fd, "%*s\n", n, "", c_type_id(p->info.typ, p->sym->name)); gen_element_begin(fd, n, ns_add(p, nse), xsi_type(p->info.typ)); fprintf(fd, ">"); fflush(fd); if (p->info.hasval && p->info.val.s) fprintf(fd, "%s", xstring(p->info.val.s)); else gen_val(fd, n, p->info.typ, nse, nsa, encoding); } else if (p->info.typ->type == Tarray) { i = ((Tnode*) p->info.typ->ref)->width; if (i) { i = p->info.typ->width / i; if (i > 4) i = 2; } if (yflag) fprintf(fd, "%*s\n", n, "", c_type_id(p->info.typ, p->sym->name)); gen_element_begin(fd, n, ns_add(p, nse), "SOAP-ENC:Array"); if (is_soap12(encoding)) fprintf(fd, " SOAP-ENC:itemType=\"%s\" SOAP-ENC:arraySize=\"" SOAP_LONG_FORMAT "\"", xsi_type_Tarray(p->info.typ), i); else if (!is_literal(encoding)) fprintf(fd, " SOAP-ENC:arrayType=\"%s[" SOAP_LONG_FORMAT "]\"", xsi_type_Tarray(p->info.typ), i); fprintf(fd, ">"); fflush(fd); gen_val(fd, n, p->info.typ, nse, nsa, encoding); } else if ((q = is_dynamic_array(p->info.typ)) && !is_binary(p->info.typ)) { if (!eflag && (has_ns(p->info.typ) || is_untyped(p->info.typ))) { if (yflag) fprintf(fd, "%*s\n", n, "", c_type_id(p->info.typ, p->sym->name)); gen_element_begin(fd, n, ns_add(p, nse), xsi_type(p->info.typ)); gen_atts(fd, (Table*)p->info.typ->ref, nsa); } else { d = get_Darraydims(p->info.typ); if (d) { for (i = 0; i < d-1; i++) { if (is_soap12(encoding)) tmp[2*i] = ' '; else tmp[2*i] = ','; tmp[2*i+1] = '1'; } tmp[2*d-2] = '\0'; } else *tmp = '\0'; if (yflag) fprintf(fd, "%*s\n", n, "", c_type_id(p->info.typ, p->sym->name)); gen_element_begin(fd, n, ns_add(p, nse), "SOAP-ENC:Array"); if (q->info.minOccurs > 0) { if (is_soap12(encoding)) fprintf(fd, " SOAP-ENC:itemType=\"%s\" SOAP-ENC:arraySize=\"" SOAP_LONG_FORMAT "%s\"", wsdl_type(q->info.typ, ""), q->info.minOccurs, tmp); else if (!is_literal(encoding)) fprintf(fd, " SOAP-ENC:arrayType=\"%s[" SOAP_LONG_FORMAT "%s]\"", wsdl_type(q->info.typ, ""), q->info.minOccurs, tmp); fprintf(fd, ">"); } else { if (is_soap12(encoding)) fprintf(fd, " SOAP-ENC:itemType=\"%s\" SOAP-ENC:arraySize=\"1%s\"", wsdl_type(q->info.typ, ""), tmp); else if (!is_literal(encoding)) fprintf(fd, " SOAP-ENC:arrayType=\"%s[1%s]\"", wsdl_type(q->info.typ, ""), tmp); fprintf(fd, ">"); } } fflush(fd); gen_val(fd, n, p->info.typ, nse, nsa, encoding); } else if ((p->info.typ->type == Tpointer || p->info.typ->type == Treference || p->info.typ->type == Trvalueref) && is_dynamic_array((Tnode*)p->info.typ->ref) && !is_binary((Tnode*)p->info.typ->ref)) { if (!eflag && (has_ns((Tnode*)p->info.typ->ref) || is_untyped((Tnode*)p->info.typ->ref))) { if (yflag) fprintf(fd, "%*s\n", n, "", c_type_id(p->info.typ, p->sym->name)); gen_element_begin(fd, n, ns_add(p, nse), xsi_type((Tnode*)p->info.typ->ref)); gen_atts(fd, (Table*)((Tnode*)p->info.typ->ref)->ref, nsa); } else { d = get_Darraydims((Tnode*)p->info.typ->ref); if (d) { for (i = 0; i < d-1; i++) { tmp[2*i] = ','; tmp[2*i+1] = '1'; } tmp[2*d-2] = '\0'; } else *tmp = '\0'; if (yflag) fprintf(fd, "%*s\n", n, "", c_type_id(p->info.typ, p->sym->name)); gen_element_begin(fd, n, ns_add(p, nse), "SOAP-ENC:Array"); if (is_soap12(encoding)) { if ((((Tnode*)p->info.typ->ref)->type == Tstruct || ((Tnode*)p->info.typ->ref)->type == Tclass) && ((Table*)((Tnode*)p->info.typ->ref)->ref)->list->info.minOccurs > 0) fprintf(fd, " SOAP-ENC:itemType=\"%s\" SOAP-ENC:arraySize=\"[" SOAP_LONG_FORMAT "%s\"", wsdl_type(((Table*)((Tnode*)p->info.typ->ref)->ref)->list->info.typ, ""), ((Table*)((Tnode*)p->info.typ->ref)->ref)->list->info.minOccurs, tmp); else fprintf(fd, " SOAP-ENC:itemType=\"%s\" SOAP-ENC:arraySize=\"1%s\"", wsdl_type(((Table*)((Tnode*)p->info.typ->ref)->ref)->list->info.typ, ""), tmp); } else if (!is_literal(encoding)) { if ((((Tnode*)p->info.typ->ref)->type == Tstruct || ((Tnode*)p->info.typ->ref)->type == Tclass) && ((Table*)((Tnode*)p->info.typ->ref)->ref)->list->info.minOccurs > 0) fprintf(fd, " SOAP-ENC:arrayType=\"%s[" SOAP_LONG_FORMAT "%s]\"", wsdl_type(((Table*)((Tnode*)p->info.typ->ref)->ref)->list->info.typ, ""), ((Table*)((Tnode*)p->info.typ->ref)->ref)->list->info.minOccurs, tmp); else fprintf(fd, " SOAP-ENC:arrayType=\"%s[1%s]\"", wsdl_type(((Table*)((Tnode*)p->info.typ->ref)->ref)->list->info.typ, ""), tmp); } fprintf(fd, ">"); } fflush(fd); gen_val(fd, n, (Tnode*)p->info.typ->ref, nse, nsa, encoding); } else if (p->info.typ->type == Tstruct || p->info.typ->type == Tclass) { /* if (!is_primclass(p->info.typ)) { const char *nse1 = ns_qualifiedElement(p->info.typ); const char *nsa1 = ns_qualifiedAttribute(p->info.typ); if (nse1) nse = nse1; if (nsa1) nsa = nsa1; } */ if (!is_invisible(p->sym->name)) { if (yflag) fprintf(fd, "%*s\n", n, "", c_type_id(p->info.typ, p->sym->name)); gen_element_begin(fd, n, ns_add(p, nse), xsi_type_u(p->info.typ)); gen_atts(fd, (Table*)p->info.typ->ref, nsa); } else if (is_anyType(p->info.typ)) fprintf(fd, "%*s\n", n, ""); } else if ((p->info.typ->type == Tpointer || p->info.typ->type == Treference || p->info.typ->type == Trvalueref) && (((Tnode*)p->info.typ->ref)->type == Tstruct || ((Tnode*)p->info.typ->ref)->type == Tclass)) { /* if (!is_primclass(p->info.typ->ref)) { const char *nse1 = ns_qualifiedElement(p->info.typ->ref); const char *nsa1 = ns_qualifiedAttribute(p->info.typ->ref); if (nse1) nse = nse1; if (nsa1) nsa = nsa1; } */ if (!is_invisible(p->sym->name)) { if (yflag) fprintf(fd, "%*s\n", n, "", c_type_id(p->info.typ, p->sym->name)); gen_element_begin(fd, n, ns_add(p, nse), xsi_type_u(p->info.typ)); gen_atts(fd, (Table*)((Tnode*)p->info.typ->ref)->ref, nsa); } else if (is_anyType(p->info.typ)) fprintf(fd, "%*s\n", n, ""); } else if (p->info.typ->type != Tunion) { if (!is_invisible(p->sym->name)) { if (yflag) fprintf(fd, "%*s\n", n, "", c_type_id(p->info.typ, p->sym->name)); gen_element_begin(fd, n, ns_add(p, nse), xsi_type_u(p->info.typ)); if (p->info.typ->type == Ttemplate) { if (((Tnode*)p->info.typ->ref)->type == Tpointer && (((Tnode*)((Tnode*)p->info.typ->ref)->ref)->type == Tclass || ((Tnode*)((Tnode*)p->info.typ->ref)->ref)->type == Tstruct)) gen_atts(fd, (Table*)((Tnode*)((Tnode*)p->info.typ->ref)->ref)->ref, nsa); else if (((Tnode*)p->info.typ->ref)->type == Tclass || ((Tnode*)p->info.typ->ref)->type == Tstruct) gen_atts(fd, (Table*)((Tnode*)p->info.typ->ref)->ref, nsa); else fprintf(fd, ">"); } else fprintf(fd, ">"); } } if (!is_external(p->info.typ)) { switch (p->info.typ->type) { case Tchar: case Tshort: case Tint: case Tlong: case Tllong: case Tuchar: case Tushort: case Tuint: case Tulong: case Tullong: if (p->info.hasval) fprintf(fd, SOAP_LONG_FORMAT, p->info.val.i); else if (p->info.typ->hasmin) fprintf(fd, SOAP_LONG_FORMAT, (LONG64)p->info.typ->min + (p->info.typ->incmin == False)); else fprintf(fd, "0"); break; case Tfloat: case Tdouble: case Tldouble: if (p->info.hasval) fprintf(fd, "%g", p->info.val.r); else if (p->info.typ->hasmin && p->info.typ->min > 0) fprintf(fd, "%g", p->info.typ->min * (1 + (p->info.typ->incmin == False)/1000)); else if (p->info.typ->hasmax && p->info.typ->max > 0) fprintf(fd, "%g", p->info.typ->max * (1 - (p->info.typ->incmax == False)/1000)); else if (p->info.typ->hasmin && p->info.typ->min < 0) fprintf(fd, "%g", p->info.typ->min * (1 - (p->info.typ->incmin == False)/1000)); else if (p->info.typ->hasmax && p->info.typ->max < 0) fprintf(fd, "%g", p->info.typ->max * (1 + (p->info.typ->incmax == False)/1000)); else fprintf(fd, "0.0"); break; case Ttime: { char tmp[256]; time_t t = time(NULL), *p = &t; strftime(tmp, 256, "%Y-%m-%dT%H:%M:%SZ", gmtime(p)); fprintf(fd, "%s", tmp); } break; case Tenum: case Tenumsc: if (p->info.hasval && p->info.typ->ref) { for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next) { if (p->info.val.i == q->info.val.i) { fprintf(fd, "%s", ns_remove2(q->sym->name, c_ident(p->info.typ))); break; } } } else gen_val(fd, n+1, p->info.typ, nse, nsa, encoding); break; case Tpointer: case Treference: case Trvalueref: if (is_string(p->info.typ) || is_wstring(p->info.typ)) { if (p->info.hasval && p->info.val.s) fprintf(fd, "%s", xstring(p->info.val.s)); else gen_val(fd, n, p->info.typ, nse, nsa, encoding); } else gen_val(fd, n, (Tnode*)p->info.typ->ref, nse, nsa, encoding); break; case Tclass: if (is_stdstr(p->info.typ)) { if (p->info.hasval && p->info.val.s) fprintf(fd, "%s", xstring(p->info.val.s)); else gen_val(fd, n, p->info.typ, nse, nsa, encoding); break; } case Tstruct: if (!is_dynamic_array(p->info.typ)) gen_val(fd, n, p->info.typ, nse, nsa, encoding); break; case Tunion: gen_val(fd, n, p->info.typ, nse, nsa, encoding); break; case Ttemplate: i = p->info.maxOccurs; if (i <= 1 || i > 4) i = p->info.minOccurs; if (i < 1) i = 1; do { /* a bit of a hack, with a copy of the code above */ { gen_val(fd, n, p->info.typ, nse, nsa, encoding); if (i > 1) { gen_element_end(fd, 0, ns_add(p, nse)); if (!is_invisible(p->sym->name)) { if (yflag) fprintf(fd, "%*s\n", n, "", c_type_id(p->info.typ, p->sym->name)); gen_element_begin(fd, n, ns_add(p, nse), xsi_type_u(p->info.typ)); if (p->info.typ->type == Ttemplate) { if (((Tnode*)p->info.typ->ref)->type == Tpointer && (((Tnode*)((Tnode*)p->info.typ->ref)->ref)->type == Tclass || ((Tnode*)((Tnode*)p->info.typ->ref)->ref)->type == Tstruct)) gen_atts(fd, (Table*)((Tnode*)((Tnode*)p->info.typ->ref)->ref)->ref, nsa); else if (((Tnode*)p->info.typ->ref)->type == Tclass || ((Tnode*)p->info.typ->ref)->type == Tstruct) gen_atts(fd, (Table*)((Tnode*)p->info.typ->ref)->ref, nsa); else fprintf(fd, ">"); } else fprintf(fd, ">"); } } fflush(fd); } } while (--i); break; default: break; } } if (p->info.typ->type != Tunion) gen_element_end(fd, 0, ns_add(p, nse)); fflush(fd); } } } void gen_atts(FILE *fd, Table *t, const char *nsa) { static unsigned long idnum = 0; Entry *q, *r; Tnode *p; int i; for (; t; t = t->prev) { for (q = t->list; q; q = q->next) { if (q->info.sto & Sattribute && !is_invisible(q->sym->name) && q->info.maxOccurs != 0) { fprintf(fd, " %s=\"", ns_add(q, nsa)); if ((q->info.typ->type == Tpointer || q->info.typ->type == Treference || q->info.typ->type == Trvalueref || q->info.typ->type == Ttemplate) && !is_string(q->info.typ)) p = (Tnode*)q->info.typ->ref; else p = q->info.typ; if (is_eq(q->sym->name, "id")) fprintf(fd, "%lu", ++idnum); /* id="#" should be unique */ else if (is_external(p) && p->sym) { if (!strcmp(p->sym->name, "xsd__boolean")) fprintf(fd, "false"); else if (!strcmp(p->sym->name, "xsd__date")) fprintf(fd, "1999-12-31"); else if (!strcmp(p->sym->name, "xsd__dateTime")) { char tmp[256]; time_t t = time(NULL), *p = &t; strftime(tmp, 256, "%Y-%m-%dT%H:%M:%SZ", gmtime(p)); fprintf(fd, "%s", tmp); } else if (!strcmp(p->sym->name, "xsd__duration")) fprintf(fd, "PT0S"); else if (!strcmp(p->sym->name, "xsd__time")) fprintf(fd, "12:34:56.789Z"); fflush(fd); } else { switch (p->type) { case Tchar: case Tshort: case Tint: case Tuchar: case Tushort: case Tuint: case Tlong: case Tulong: case Tllong: case Tullong: if (q->info.hasval) fprintf(fd, SOAP_LONG_FORMAT, q->info.val.i); else if (q->info.typ->hasmin) fprintf(fd, SOAP_LONG_FORMAT, (LONG64)q->info.typ->min + (q->info.typ->incmin == False)); else fprintf(fd, "0"); break; case Tfloat: case Tdouble: case Tldouble: if (q->info.hasval) fprintf(fd, "%g", q->info.val.r); else if (q->info.typ->hasmin && q->info.typ->min > 0) fprintf(fd, "%g", q->info.typ->min * (1 + (q->info.typ->incmin == False)/1000)); else if (q->info.typ->hasmax && q->info.typ->max > 0) fprintf(fd, "%g", q->info.typ->max * (1 - (q->info.typ->incmax == False)/1000)); else if (q->info.typ->hasmin && q->info.typ->min < 0) fprintf(fd, "%g", q->info.typ->min * (1 - (q->info.typ->incmin == False)/1000)); else if (q->info.typ->hasmax && q->info.typ->max < 0) fprintf(fd, "%g", q->info.typ->max * (1 + (q->info.typ->incmax == False)/1000)); else fprintf(fd, "0.0"); break; case Ttime: { char tmp[256]; time_t T = time(NULL); strftime(tmp, 256, "%Y-%m-%dT%H:%M:%SZ", gmtime(&T)); fprintf(fd, "%s", tmp); } break; case Tenum: case Tenumsc: if (q->info.hasval && p->ref) { for (r = ((Table*)p->ref)->list; r; r = r->next) { if (r->info.val.i == q->info.val.i) { fprintf(fd, "%s", ns_remove2(r->sym->name, c_ident(p))); break; } } } else if (p->ref) fprintf(fd, "%s", ns_remove2((((Table*)p->ref)->list)->sym->name, c_ident(p))); else fprintf(fd, "0"); break; case Tpointer: case Treference: case Trvalueref: case Ttemplate: if (is_string(p) || is_wstring(p)) { if (q->info.hasval && q->info.val.s) fprintf(fd, "%s", xstring(q->info.val.s)); else if (p->min > 0 && p->min < 10000) for (i = 0; i < (int)p->min; i++) fprintf(fd, "X"); } else if (is_stdstr(p)) { if (p->min > 0 && p->min < 10000) for (i = 0; i < (int)p->min; i++) fprintf(fd, "X"); } break; case Tclass: if (is_stdstr(p)) { if (q->info.hasval && q->info.val.s) fprintf(fd, "%s", xstring(q->info.val.s)); else if (p->min > 0 && p->min < 10000) for (i = 0; i < (int)p->min; i++) fprintf(fd, "X"); } break; default: break; } } if (yflag) fprintf(fd, " // %s //", c_type_id(q->info.typ, q->sym->name)); fprintf(fd, "\""); } } } fprintf(fd, ">"); fflush(fd); } void gen_val(FILE *fd, int n, Tnode *p, const char *nse, const char *nsa, const char *encoding) { Entry *q; LONG64 i; if (!is_transient(p) && p->type != Tfun && !is_XML(p)) { if (is_fixedstring(p)) { for (i = 0; i < p->width / ((Tnode*)p->ref)->width - 1; i++) fprintf(fd, "X"); } else if (p->type == Tarray) { i = ((Tnode*) p->ref)->width; if (i) { i = p->width / i; if (i > 4) i = 2; fprintf(fd, "\n"); for (; i > 0; i--) { fprintf(fd, "%*s", n+1, ""); gen_val(fd, n+1, (Tnode*)p->ref, nse, nsa, encoding); fprintf(fd, "\n"); } fprintf(fd, "%*s", n, ""); } } else if ((q = is_dynamic_array(p))) { if (!is_binary(p)) { fprintf(fd, "\n"); fprintf(fd, "%*s<%s>", n+1, "", q->sym->name[5]?q->sym->name+5:"item"); gen_val(fd, n+1, q->info.typ, nse, nsa, encoding); fprintf(fd, "\n", q->sym->name[5]?q->sym->name+5:"item"); fprintf(fd, "%*s", n, ""); } } switch (p->type) { case Tchar: case Tshort: case Tint: case Tlong: case Tllong: case Tuchar: case Tushort: case Tuint: case Tulong: case Tullong: fprintf(fd, "0"); break; case Tfloat: case Tdouble: case Tldouble: fprintf(fd, "0.0"); break; case Ttime: { char tmp[256]; time_t T = time(NULL); strftime(tmp, 256, "%Y-%m-%dT%H:%M:%SZ", gmtime(&T)); fprintf(fd, "%s", tmp); } break; case Tenum: case Tenumsc: if (p->ref && (q = ((Table*)p->ref)->list)) fprintf(fd, "%s", ns_remove2(q->sym->name, c_ident(p))); else fprintf(fd, "0"); break; case Tpointer: case Treference: case Trvalueref: case Ttemplate: if (is_string(p) || is_wstring(p)) { if (p->min > 0 && p->min < 10000) for (i = 0; i < (int)p->min; i++) fprintf(fd, "X"); } else if (is_stdstr(p)) { if (p->min > 0 && p->min < 10000) for (i = 0; i < (int)p->min; i++) fprintf(fd, "X"); } else gen_val(fd, n, (Tnode*)p->ref, nse, nsa, encoding); break; case Tclass: case Tstruct: nse = ns_qualifiedElement(p); nsa = ns_qualifiedAttribute(p); if (is_stdstr(p)) { if (p->min > 0 && p->min < 10000) for (i = 0; i < (int)p->min; i++) fprintf(fd, "X"); } else if (is_primclass(p)) { Table *t; for (t = (Table*)p->ref; t; t = t->prev) { Entry *r = entry(classtable, t->sym); r = t->list; while (r && !is_item(r)) r = r->next; if (r) { gen_val(fd, n, r->info.typ, nse, nsa, encoding); return; } } } else if (!is_dynamic_array(p) && p->ref) { Table *t; fprintf(fd, "\n"); for (t = (Table*)p->ref; t; t = t->prev) { for (q = t->list; q; q = q->next) { if (is_repetition(q)) { i = q->info.maxOccurs; if (i <= 1 || i > 4) i = q->info.minOccurs; if (i <= 1) i = 2; do gen_field(fd, n+1, q->next, nse, nsa, encoding); while (--i); q = q->next; } else gen_field(fd, n+1, q, nse, nsa, encoding); } } fprintf(fd, "%*s", n, ""); } break; case Tunion: if (((Table*)p->ref)->list) gen_field(fd, n, ((Table*)p->ref)->list, nse, nsa, encoding); break; break; default: break; } } } void gen_header(FILE *fd, const char *method, int response, const char *encoding) { if (custom_header) { Service *sp; Method *m = NULL; Entry *q; Table *r; if (yflag) { if (cflag) fprintf(fd, " \n"); else fprintf(fd, " \n"); } fprintf(fd, " \n"); q = entry(classtable, lookup("SOAP_ENV__Header")); if (q) { r = (Table*)q->info.typ->ref; if (r) { for (q = r->list; q; q = q->next) { if (!is_transient(q->info.typ) && !(q->info.sto & Sattribute) && q->info.typ->type != Tfun) { for (sp = services; sp; sp = sp->next) for (m = sp->list; m; m = m->next) if (is_eq(m->name, method) && (!strcmp(m->part, q->sym->name) || is_eq_nons(m->part, q->sym->name)) && ((!response && (m->mess&HDRIN)) || (response && (m->mess&HDROUT)))) { gen_field(fd, 2, q, NULL, NULL, encoding); break; } } } fprintf(fd, " \n"); } } } } FILE * gen_env(const char *buf, const char *method, int response, const char *encoding, int soap) { char tmp[1024]; FILE *fd; strcpy(tmp, buf); if (!soap) strcat(tmp, "REST."); #ifdef __vms if (!response) { sprintf(strrchr(tmp, '.'), "_%s_req.xml", method); fprintf(fmsg, "Saving %s sample SOAP/XML request\n", tmp); } else { sprintf(strrchr(tmp, '.'), "_%s_res.xml", method); fprintf(fmsg, "Saving %s sample SOAP/XML response\n", tmp); } #else strcpy(strrchr(tmp, '.')+1, method); if (!response) { strcat(tmp, ".req.xml"); fprintf(fmsg, "Saving %s sample SOAP/XML request\n", tmp); } else { strcat(tmp, ".res.xml"); fprintf(fmsg, "Saving %s sample SOAP/XML response\n", tmp); } #endif fd = fopen(tmp, "w"); if (!fd) execerror("Cannot write XML file"); fprintf(fd, "\n"); if (soap && soap_version >= 0) { fprintf(fd, "\n"); gen_header(fd, method, response, encoding); fprintf(fd, " \n"); } return fd; } void gen_xmlns(FILE *fd) { Symbol *s; Service *sp = NULL; for (s = nslist; s; s = s->next) { for (sp = services; sp; sp = sp->next) if (!tagcmp(sp->ns, s->name) && sp->URI) break; if (sp) fprintf(fd, "\n xmlns:%s=\"%s\"", ns_convert(s->name), sp->URI); else if (!strcmp(s->name, "SOAP-ENV")) { if (soap_version >= 0) fprintf(fd, "\n xmlns:SOAP-ENV=\"%s\"", envURI); } else if (!strcmp(s->name, "SOAP-ENC")) { if (soap_version >= 0) fprintf(fd, "\n xmlns:SOAP-ENC=\"%s\"", encURI); } else if (!strcmp(s->name, "xsi")) fprintf(fd, "\n xmlns:xsi=\"%s\"", xsiURI); else if (!strcmp(s->name, "xsd")) fprintf(fd, "\n xmlns:xsd=\"%s\"", xsdURI); else fprintf(fd, "\n xmlns:%s=\"%s/%s.xsd\"", ns_convert(s->name), tmpURI, ns_convert(s->name)); } } char * emalloc(size_t n) { char *p; if ((p = (char*)malloc(n)) == NULL) execerror("out of memory"); return p; } void soap_serve(Table *table) { Entry *method, *catch_method = NULL; const char *catch_action = NULL; if (!Cflag) { fprintf(fserver, "\n\n"); if (!cflag && !namespaceid) fprintf(fserver, "extern \"C\" "); fprintf(fserver, "SOAP_FMAC5 int SOAP_FMAC6 %s_serve(struct soap *soap)", nflag?prefix:"soap"); fprintf(fserver, "\n{\n#ifndef WITH_FASTCGI\n\tunsigned int k = soap->max_keep_alive;\n#endif\n\tdo\n\t{"); fprintf(fserver, "\n#ifndef WITH_FASTCGI\n\t\tif (soap->max_keep_alive > 0 && !--k)\n\t\t\tsoap->keep_alive = 0;\n#endif"); fprintf(fserver, "\n\t\tif (soap_begin_serve(soap))\n\t\t{\tif (soap->error >= SOAP_STOP)\n\t\t\t\tcontinue;\n\t\t\treturn soap->error;\n\t\t}"); if (namespaceid) fprintf(fserver, "\n\t\tif (%s::%s_serve_request(soap) || (soap->fserveloop && soap->fserveloop(soap)))\n\t\t{\n#ifdef WITH_FASTCGI\n\t\t\tsoap_send_fault(soap);\n#else\n\t\t\treturn soap_send_fault(soap);\n#endif\n\t\t}", namespaceid, nflag?prefix:"soap"); else fprintf(fserver, "\n\t\tif (%s_serve_request(soap) || (soap->fserveloop && soap->fserveloop(soap)))\n\t\t{\n#ifdef WITH_FASTCGI\n\t\t\tsoap_send_fault(soap);\n#else\n\t\t\treturn soap_send_fault(soap);\n#endif\n\t\t}", nflag?prefix:"soap"); fprintf(fserver, "\n\n#ifdef WITH_FASTCGI\n\t\tsoap_destroy(soap);\n\t\tsoap_end(soap);\n\t} while (1);\n#else\n\t} while (soap->keep_alive);\n#endif"); fprintf(fserver, "\n\treturn SOAP_OK;"); fprintf(fserver, "\n}"); fprintf(fserver, "\n\n#ifndef WITH_NOSERVEREQUEST\n"); if (!cflag && !namespaceid) fprintf(fserver, "extern \"C\" "); fprintf(fserver, "SOAP_FMAC5 int SOAP_FMAC6 %s_serve_request(struct soap *soap)\n{", nflag?prefix:"soap"); if (sflag) fprintf(fserver, "\n\tsoap->mode |= SOAP_XML_STRICT;"); fprintf(fserver, "\n\tsoap_peek_element(soap);"); for (method = table->list; method; method = method->next) { const char *action = NULL; if (method->info.typ->type == Tfun && !(method->info.sto & Sextern)) { if (aflag) { Service *sp; for (sp = services; sp; sp = sp->next) { if (has_ns_eq(sp->ns, method->sym->name)) { Method *m; for (m = sp->list; m; m = m->next) { if (is_eq_nons(m->name, method->sym->name)) { if (m->mess == ACTION || m->mess == REQUEST_ACTION) action = m->part; } } } } } if (is_invisible(method->sym->name)) { Entry *param = entry(classtable, method->sym); if (param) param = ((Table*)param->info.typ->ref)->list; if (action) { if (*action == '"') { fprintf(fserver, "\n\tif ("); if (param && !Aflag) fprintf(fserver, "(soap->action == NULL && !soap_match_tag(soap, soap->tag, \"%s\")) || ", ns_convert(param->sym->name)); else { catch_method = method; catch_action = action; } fprintf(fserver, "(soap->action && !strcmp(soap->action, %s))", action); } else { fprintf(fserver, "\n\tif ("); if (param && !Aflag) fprintf(fserver, "(soap->action == NULL && !soap_match_tag(soap, soap->tag, \"%s\")) || ", ns_convert(param->sym->name)); else { catch_method = method; catch_action = action; } fprintf(fserver, "(soap->action && !strcmp(soap->action, \"%s\"))", action); } fprintf(fserver, ")\n\t\treturn soap_serve_%s(soap);", ident(method->sym->name)); } else { if (Aflag) compliancewarn("Option -A requires a SOAPAction where none is defined"); if (param) { fprintf(fserver, "\n\tif (!soap_match_tag(soap, soap->tag, \"%s\")", ns_convert(param->sym->name)); fprintf(fserver, ")\n\t\treturn soap_serve_%s(soap);", ident(method->sym->name)); } else { catch_method = method; catch_action = action; } } } else { if (action) { if (*action == '"') { fprintf(fserver, "\n\tif ("); if (!Aflag) fprintf(fserver, "(soap->action == NULL && !soap_match_tag(soap, soap->tag, \"%s\")) || ", ns_convert(method->sym->name)); fprintf(fserver, "(soap->action && !strcmp(soap->action, %s))", action); } else { fprintf(fserver, "\n\tif ("); if (!Aflag) fprintf(fserver, "(soap->action == NULL && !soap_match_tag(soap, soap->tag, \"%s\")) || ", ns_convert(method->sym->name)); fprintf(fserver, "(soap->action && !strcmp(soap->action, \"%s\"))", action); } } else { if (Aflag) compliancewarn("Option -A requires a SOAPAction where none is defined"); fprintf(fserver, "\n\tif (!soap_match_tag(soap, soap->tag, \"%s\")", ns_convert(method->sym->name)); } fprintf(fserver, ")\n\t\treturn soap_serve_%s(soap);", ident(method->sym->name)); } } } if (catch_method) { if (Aflag && catch_action) { if (*catch_action == '"') { fprintf(fserver, "\n\tif ("); fprintf(fserver, "(soap->action && !strcmp(soap->action, %s))", catch_action); fprintf(fserver, ")\n\t\treturn soap_serve_%s(soap);", ident(catch_method->sym->name)); } else { fprintf(fserver, "\n\tif ("); fprintf(fserver, "(soap->action && !strcmp(soap->action, \"%s\"))", catch_action); fprintf(fserver, ")\n\t\treturn soap_serve_%s(soap);", ident(catch_method->sym->name)); } fprintf(fserver, "\n\treturn soap->error = SOAP_NO_METHOD;"); } else fprintf(fserver, "\n\treturn soap_serve_%s(soap);", ident(catch_method->sym->name)); } else fprintf(fserver, "\n\treturn soap->error = SOAP_NO_METHOD;"); fprintf(fserver, "\n}\n#endif"); banner(fheader, "Server-Side Operations"); for (method = table->list; method; method = method->next) if (method->info.typ->type == Tfun && !(method->info.sto & Sextern)) generate_proto(table, method); banner(fheader, "Server-Side Skeletons to Invoke Service Operations"); fprintf(fheader, "\n"); if (!cflag && !namespaceid) fprintf(fheader, "extern \"C\" "); fprintf(fheader, "SOAP_FMAC5 int SOAP_FMAC6 %s_serve(struct soap*);", nflag?prefix:"soap"); fprintf(fheader, "\n\n"); if (!cflag && !namespaceid) fprintf(fheader, "extern \"C\" "); fprintf(fheader, "SOAP_FMAC5 int SOAP_FMAC6 %s_serve_request(struct soap*);", nflag?prefix:"soap"); for (method = table->list; method; method = method->next) if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && !is_imported(method->info.typ)) gen_serve_method(fserver, table, method, NULL); } if (!Sflag) { banner(fheader, "Client-Side Call Stubs"); for (method = table->list; method; method = method->next) if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && !is_imported(method->info.typ)) gen_call_method(fclient, method, NULL); } } void generate_proto(Table *table, Entry *param) { Entry *q, *pout; Table *output; q = entry(table, param->sym); if (q) pout = (Entry*)q->info.typ->ref; else { fprintf(stderr, "Internal error: no table entry\n"); return; } q = entry(classtable, param->sym); output = (Table*)q->info.typ->ref; fprintf(fheader, "\n\nSOAP_FMAC5 int SOAP_FMAC6 %s(struct soap*", ident(param->sym->name)); gen_params(fheader, output, pout, 1); fprintf(fheader, ";"); } int tagcmp(const char *s, const char *t) { size_t i, n; n = strlen(s); for (i = 0; i < n; i++) { int c = t[i]; if (c == '_' && s[i] != '_') c = '-'; if (s[i] > c) return 1; if (s[i] < c) return -1; } return -(t[i] != 0); } int tagncmp(const char *s, const char *t, size_t n) { size_t i; for (i = 0; i < n; i++) { int c = t[i]; if (c == '_' && s[i] != '_') c = '-'; if (s[i] > c) return 1; if (s[i] < c) return -1; } return 0; } int is_qname(Tnode *p) { if (p->sym && is_string(p) && (is_eq(p->sym->name, "xsd__QName") || is_eq(p->sym->name, "QName"))) return 1; return p->id && is_string(p) && (is_eq(p->id->name, "xsd__QName") || is_eq(p->id->name, "QName")); } int is_stdqname(Tnode *p) { if (p->sym && p->type == Tclass && is_volatile(p) && (is_eq(p->sym->name, "xsd__QName") || is_eq(p->sym->name, "QName"))) return 1; return p->id && p->type == Tclass && is_volatile(p) && (is_eq(p->id->name, "xsd__QName") || is_eq(p->id->name, "QName")); } int is_XML(Tnode *p) { if (is_synonym(p)) return (is_string(p) || is_wstring(p)) && is_eq(p->synonym->name, "XML"); return (p->sym && (is_string(p) || is_wstring(p)) && is_eq(p->sym->name, "XML")) || ((p->type == Tpointer || p->type == Treference || p->type == Trvalueref) && is_XML((Tnode*)p->ref)); } int is_stdXML(Tnode *p) { return p->sym && (is_stdstring(p) || is_stdwstring(p)) && is_eq(p->sym->name, "XML"); } int is_response(Tnode *p) { return (p->type == Tpointer || p->type == Treference || p->type == Trvalueref) && p->ref && has_ns((Tnode*)p->ref) && ((((Tnode*)p->ref)->type == Tstruct || ((Tnode*)p->ref)->type == Tclass) && !is_external((Tnode*)p->ref) && !is_primclass((Tnode*)p->ref) && !is_dynamic_array((Tnode*)p->ref) && !is_stdstring((Tnode*)p->ref) && !is_stdwstring((Tnode*)p->ref)); } Entry* get_response(Tnode *p) { if (p->type == Tfun) return p->response; return 0; } int is_unmatched(Symbol *sym) { return sym->name[0] == '_' && sym->name[1] != '_' && strncmp(sym->name, "_DOT", 4) && strncmp(sym->name, "_USCORE", 7) && (strncmp(sym->name, "_x", 2) || !isxdigit(sym->name[2]) || !isxdigit(sym->name[3]) || !isxdigit(sym->name[4]) || !isxdigit(sym->name[5])); } int is_invisible(const char *name) { return name[0] == '-' || (name[0] == '_' && name[1] == '_' && strncmp(name, "__ptr", 5)); } int is_invisible_empty(Tnode *p) { if (p->type == Tstruct || p->type == Tclass) if (is_invisible(p->id->name)) if (!p->ref || !((Table*)p->ref)->list) return 1; return 0; } int is_element(Tnode *typ) { if (is_XML(typ) || is_stdXML(typ) || is_qname(typ) || is_stdqname(typ)) return 0; if (typ->sym) return is_unmatched(typ->sym); if (typ->type == Tstruct || typ->type == Tclass) return is_unmatched(typ->id); return 0; } int is_untyped(Tnode *typ) { Tnode *p; if (typ->sym) return is_unmatched(typ->sym); if (typ->type == Tpointer || typ->type == Treference || typ->type == Trvalueref || typ->type == Tarray) return is_untyped((Tnode*)typ->ref); if (typ->type == Tstruct || typ->type == Tclass) { if (is_dynamic_array(typ) && !has_ns(typ) && !is_binary(typ)) { p = (Tnode*)((Table*)typ->ref)->list->info.typ->ref; return is_untyped(p); } else return is_unmatched(typ->id); } return 0; } int is_primclass(Tnode *typ) { Table *t; if (typ->type == Tstruct || typ->type == Tclass) { if (!is_dynamic_array(typ)) { t = (Table*)typ->ref; while (t) { Entry *p = t->list; while (p && !is_item(p)) p = p->next; if (p) break; t = t->prev; } if (!t) return 0; t = (Table*)typ->ref; while (t) { Entry *p; for (p = t->list; p; p = p->next) if (!is_item(p) && p->info.typ->type != Tfun && !is_transient(p->info.typ) && p->info.sto != Sattribute && p->info.sto != Sprivate && p->info.sto != Sprotected) return 0; t = t->prev; } return 1; } } else if (typ->type == Tpointer || typ->type == Treference || typ->type == Trvalueref) return is_primclass((Tnode*)typ->ref); return 0; } int is_mask(Tnode *typ) { return ((typ->type == Tenum || typ->type == Tenumsc) && typ->width == 9); } int is_void(Tnode *typ) { if (!typ) return 1; if (typ->type == Tvoid) return 1; if (typ->type == Tpointer || typ->type == Treference || typ->type == Trvalueref || typ->type == Tarray || typ->type == Ttemplate) return is_void((Tnode*)typ->ref); return 0; } int is_transient(Tnode *typ) { if (!typ) return 1; if (typ->type == Tstruct && typ->id == lookup("soap")) return 1; if (is_external(typ) || is_volatile(typ)) return 0; if (typ->transient > 0) return 1; if (is_wstring(typ)) /* wchar_t* is serializable but wchar_t is transient */ return 0; switch (typ->type) { case Tpointer: case Treference: case Trvalueref: case Tarray: case Ttemplate: return is_transient((Tnode*)typ->ref); case Tnone: case Tvoid: case Twchar: /* wchar_t is transient */ case Tsize: /* size_t is transient */ return 1; default: break; } return 0; } int is_imported(Tnode* typ) { return typ->imported != NULL; } int is_external(Tnode* typ) { return typ->transient == -1 || typ->transient == -3; } int is_anyType(Tnode* typ) { if (!typ) return 0; if (typ->type == Tpointer || typ->type == Ttemplate) return is_anyType((Tnode*)typ->ref); return is_external(typ) && typ->type == Tstruct && !strcmp(typ->id->name, "soap_dom_element"); } int is_anyAttribute(Tnode* typ) { if (!typ) return 0; if (typ->type == Tpointer || typ->type == Ttemplate) return is_anyAttribute((Tnode*)typ->ref); return is_external(typ) && typ->type == Tstruct && !strcmp(typ->id->name, "soap_dom_attribute"); } int is_volatile(Tnode* typ) { return typ->transient == -2 || typ->transient == -3; } int is_smart(Tnode *p) { return p->type == Ttemplate && p->ref && is_volatile(p); } int is_smart_shared(Tnode *p) { if (is_smart(p)) { const char *s = strstr(p->id->name, "::"); if (s) return !strcmp(s, "::shared_ptr"); /* support shared_ptr STL and Boost */ } return 0; } const char * make_shared(Tnode *p) { const char *s = ""; /* should produce make_shared only if is_smart_shared(p) is true */ if (is_smart_shared(p)) { char *t; s = strstr(p->id->name, "::"); t = emalloc(s - p->id->name + 14); strncpy(t, p->id->name, s - p->id->name + 2); strcat(t, "make_shared"); s = t; } return s; } int is_container(Tnode *p) { if (p->type == Tpointer) return is_container((Tnode*)p->ref); return p->type == Ttemplate && !is_smart(p); } int is_template(Tnode *p) { if (p->type == Tpointer) return is_template((Tnode*)p->ref); return p->type == Ttemplate; } int is_repetition(Entry *p) { if (p) return p->next && p->next->info.typ->type == Tpointer && ((Tnode*)p->next->info.typ->ref)->type != Tvoid && (p->info.typ->type == Tint || p->info.typ->type == Tsize) && ((p->info.sto & Sspecial) || !strncmp(p->sym->name, "__size", 6)); return 0; } int is_item(Entry *p) { if (p) return !strcmp(p->sym->name, "__item"); return 0; } int is_self(Entry *p) { if (p) return !strcmp(p->sym->name, "__self"); return 0; } int is_choice(Entry *p) { if (p) if (p->next && p->next->info.typ->type == Tunion && p->info.typ->type == Tint && ((p->info.sto & Sspecial) || !strncmp(p->sym->name, "__union", 7))) return 1; return 0; } int required_choice(Tnode *typ) { if (typ->type == Tunion) { Entry *p; for (p = ((Table*)typ->ref)->list; p; p = p->next) { if (!(p->info.sto & (Sconst | Sprivate | Sprotected)) && !is_transient(p->info.typ) && (!(p->info.sto & Sattribute)) && !is_repetition(p) && !is_anytype(p)) { if (p->info.minOccurs <= 0) return 0; } } } return -1; } int is_sequence(Entry *p) { if (p) { Tnode *q = p->info.typ; if (q->type == Tpointer) q = (Tnode*)q->ref; if (q->type == Tstruct && is_invisible(p->sym->name) && is_invisible(q->id->name) && !is_transient(q)) return 1; } return 0; } int is_anytype(Entry *p) { if (p) { if (p->next && p->next->info.typ->type == Tpointer && ((Tnode*)p->next->info.typ->ref)->type == Tvoid && p->info.typ->type == Tint && ((p->info.sto & Sspecial) || !strncmp(p->sym->name, "__type", 6))) { is_anytype_flag = 1; return 1; } } return 0; } int is_keyword(const char *name) { Symbol *s = lookup(name); if (s) return s->token != ID; return 0; } int has_ptr(Tnode *typ) { Tnode *p; if (typ->type == Tpointer || typ->type == Treference || typ->type == Trvalueref) return 0; for (p = Tptr[Tpointer]; p; p = p->next) if ((Tnode*)p->ref == typ && p->transient != 1) return 1; return 0; } int has_detail_string(void) { Entry *p = entry(classtable, lookup("SOAP_ENV__Fault")); if (p && p->info.typ->ref && (p->info.typ->type == Tstruct || p->info.typ->type == Tclass)) { Entry *e = entry((Table*)p->info.typ->ref, lookup("detail")); if (e && e->info.typ->ref && e->info.typ->type == Tpointer && ((Tnode*)e->info.typ->ref)->type == Tstruct) { Entry *e2 = entry((Table*)((Tnode*)e->info.typ->ref)->ref, lookup("__any")); return e2 && is_string(e2->info.typ); } } return 0; } int has_Detail_string(void) { Entry *p = entry(classtable, lookup("SOAP_ENV__Fault")); if (p && p->info.typ->ref && (p->info.typ->type == Tstruct || p->info.typ->type == Tclass)) { Entry *e = entry((Table*)p->info.typ->ref, lookup("SOAP_ENV__Detail")); if (e && e->info.typ->ref && e->info.typ->type == Tpointer && ((Tnode*)e->info.typ->ref)->type == Tstruct) { Entry *e2 = entry((Table*)((Tnode*)e->info.typ->ref)->ref, lookup("__any")); return e2 && is_string(e2->info.typ); } } return 0; } int has_class(Tnode *typ) { Entry *p; if (!cflag && typ->type == Tstruct && typ->ref) { for (p = ((Table*)typ->ref)->list; p; p = p->next) { if (p->info.sto & Stypedef) continue; if (p->info.typ->type == Tclass || p->info.typ->type == Ttemplate) return 1; if (p->info.typ->type == Tstruct && has_class(p->info.typ)) return 1; } } return 0; } int has_external(Tnode *typ) { Entry *p; if ((typ->type == Tstruct || typ->type == Tclass) && typ->ref) { for (p = ((Table*)typ->ref)->list; p; p = p->next) { if (p->info.typ->type == Tstruct || p->info.typ->type == Tclass) { if (is_external(p->info.typ) || has_external(p->info.typ)) return 1; } } } return 0; } int has_volatile(Tnode *typ) { Entry *p; if ((typ->type == Tstruct || typ->type == Tclass) && typ->ref) { for (p = ((Table*)typ->ref)->list; p; p = p->next) { if (p->info.typ->type == Tstruct || p->info.typ->type == Tclass) { if (is_volatile(p->info.typ) || has_volatile(p->info.typ)) if (!is_stdstr(p->info.typ)) return 1; } } } return 0; } int has_ns(Tnode *typ) { if (typ->type == Tstruct || typ->type == Tclass || typ->type == Tenum || typ->type == Tenumsc) return has_ns_eq(NULL, typ->id->name); return 0; } int has_ns_t(Tnode *typ) { if (typ->sym) return has_ns_eq(NULL, typ->sym->name); return has_ns(typ); } /* needs_lang adds xml:lang attribute to matching struct/class member name we should use an annotation for soapcpp2's input this in the future instead of a hard-coded member name */ void needs_lang(Entry *e) { if (!strcmp(e->sym->name, "SOAP_ENV__Text")) fprintf(fout, "\n\tif (soap->lang)\n\t\tsoap_set_attr(soap, \"xml:lang\", soap->lang, 1);"); } int is_eq_nons(const char *s, const char *t) { size_t n, m; const char *r; while (*s == '_' || *s == ':') s++; while (*t == '_' || *t == ':') t++; if (!*s || !*t) return 0; r = strstr(t, "__"); if (r) t = r + 2; n = strlen(s) - 1; m = strlen(t) - 1; #ifdef SOAP_OLD_DIRECTIVE_NAME_MATCHING while (n > 0 && s[n] == '_') n--; while (m > 0 && t[m] == '_') m--; #endif if (n != m) return 0; return !strncmp(s, t, n + 1); } int is_eq(const char *s, const char *t) { size_t n, m; while (*s == '_' || *s == ':') s++; while (*t == '_' || *t == ':') t++; if (!*s || !*t) return 0; for (n = strlen(s) - 1; n && s[n] == '_'; n--) ; for (m = strlen(t) - 1; m && t[m] == '_'; m--) ; if (n != m) return 0; return !strncmp(s, t, n + 1); } int has_ns_eq(const char *ns, const char *s) { size_t n; while (*s == '_' || *s == ':') s++; if (!ns) { const char *t = strstr(s + 1, "__"); if (!t || (t[2] == 'x' && isxdigit(t[3]) && isxdigit(t[4]) && isxdigit(t[5]) && isxdigit(t[6])) || !strncmp(t+2, "DOT", 3) || !strncmp(t+2, "USCORE", 6)) { t = strchr(s, ':'); if (t && t[1] == ':') t = NULL; } return t && t[1] && t[2] && t[2] != '_'; } if ((n = strlen(ns)) < strlen(s)) return ((s[n] == '_' && s[n+1] == '_') || (s[n] == ':' && s[n+1] != ':')) && !tagncmp(ns, s, n); return 0; } const char * strict_check(void) { if (sflag) return ""; return "(soap->mode & SOAP_XML_STRICT) && "; } const char * ns_of(const char *name) { Service *sp; for (sp = services; sp; sp = sp->next) if (has_ns_eq(sp->ns, name)) break; if (sp) return sp->URI; return NULL; } int eq_ns(const char *s, const char *t) { return ns_of(s) == ns_of(t); } const char * prefix_of(const char *s) { const char *t; while (*s == '_' || *s == ':') s++; t = strstr(s + 1, "__"); if (!t) { t = strchr(s, ':'); if (t && t[1] == ':') t = NULL; } if (t && t[1] && t[2] && t[2] != '_') { char *r = (char*)emalloc(t - s + 1); strncpy(r, s, t - s); r[t - s] = '\0'; return r; } return s; } const char * ns_add_overridden(Table *t, Entry *p, const char *ns) { Entry *q; Symbol *s = t->sym; if (s) { do { for (q = t->list; q; q = q->next) if (!strcmp(q->sym->name, p->sym->name)) return ns_add(p, ns ? prefix_of(t->sym->name) : NULL); } while ((t = t->prev) != NULL); } return ns_add(p, ns); } const char * c_ident(Tnode *typ) { if (typ->sym && strcmp(typ->sym->name, "/*?*/")) return res_remove(typ->sym->name); return t_ident(typ); } const char * soap_type(Tnode *typ) { const char *t = c_ident(typ); char *s; if (namespaceid && (Qflag || !is_external(typ))) { s = (char*)emalloc(strlen(t) + strlen(namespaceid) + 12); strcpy(s, "SOAP_TYPE_"); strcat(s, namespaceid); strcat(s, "_"); } else { s = (char*)emalloc(strlen(t) + 11); strcpy(s, "SOAP_TYPE_"); } strcat(s, t); return s; } const char * soap_union_member(Tnode *typ, Entry *p) { const char *t = c_ident(typ); const char *n = ident(p->sym->name); char *s; if (namespaceid) { s = (char*)emalloc(strlen(t) + strlen(n) + strlen(namespaceid) + 14); strcpy(s, "SOAP_UNION_"); strcat(s, namespaceid); strcat(s, "_"); } else { s = (char*)emalloc(strlen(t) + strlen(n) + 13); strcpy(s, "SOAP_UNION_"); } strcat(s, t); strcat(s, "_"); strcat(s, n); return s; } const char * ident(const char *name) { if (name) { const char *s = strrchr(name, ':'); if (s && *(s+1) && (s == name || *(s-1) != ':')) return s+1; } return name; } /*t_ident gives the base type name (e.g. when typedef'ed) of a type in identifier format*/ const char * t_ident(Tnode *typ) { char *p; const char *q; if (typ->extsym) return ident(typ->extsym->name); if (typ->synonym) return ident(typ->synonym->name); switch(typ->type) { case Tnone: return ""; case Tvoid: return "void"; case Tchar: return "byte"; case Twchar: return "wchar"; case Tshort: return "short"; case Tint: return "int"; case Tlong: return "long"; case Tllong: return "LONG64"; case Tfloat: return "float"; case Tdouble: return "double"; case Tldouble: return "decimal"; case Tuchar: return "unsignedByte"; case Tushort: return "unsignedShort"; case Tuint: return "unsignedInt"; case Tulong: return "unsignedLong"; case Tullong: return "ULONG64"; case Tsize: return "size_t"; case Ttime: return "dateTime"; case Tstruct: case Tclass: case Tunion: case Tenum: if (is_bool(typ)) return "bool"; case Tenumsc: return res_remove(typ->id->name); case Treference: case Trvalueref: return c_ident((Tnode*)typ->ref); case Tpointer: if (is_string(typ)) return "string"; if (is_wstring(typ)) return "wstring"; p = (char*)emalloc((10+strlen(q = c_ident((Tnode*)typ->ref))) * sizeof(char)); strcpy(p, "PointerTo"); strcat(p, q); return p; case Tarray: p = (char*)emalloc((16+strlen(c_ident((Tnode*)typ->ref))) * sizeof(char)); if (((Tnode*)typ->ref)->width) sprintf(p, "Array%dOf%s", typ->width / ((Tnode*) typ->ref)->width, c_ident((Tnode*)typ->ref)); else sprintf(p, "ArrayOf%s", c_ident((Tnode*)typ->ref)); return p; case Ttemplate: if (typ->ref) { p = (char*)emalloc((11+strlen(res_remove(typ->id->name))+strlen(q = c_ident((Tnode*)typ->ref))) * sizeof(char)); strcpy(p, res_remove(typ->id->name)); strcat(p, "TemplateOf"); strcat(p, q); return p; } case Tfun: return "Function"; } return "anyType"; } void utf8(char **t, long c) { if (c < 0x0080) *(*t)++ = (char)c; else { if (c < 0x0800) *(*t)++ = (char)(0xC0 | ((c >> 6) & 0x1F)); else { if (c < 0x010000) *(*t)++ = (char)(0xE0 | ((c >> 12) & 0x0F)); else { if (c < 0x200000) *(*t)++ = (char)(0xF0 | ((c >> 18) & 0x07)); else { if (c < 0x04000000) *(*t)++ = (char)(0xF8 | ((c >> 24) & 0x03)); else { *(*t)++ = (char)(0xFC | ((c >> 30) & 0x01)); *(*t)++ = (char)(0x80 | ((c >> 24) & 0x3F)); } *(*t)++ = (char)(0x80 | ((c >> 18) & 0x3F)); } *(*t)++ = (char)(0x80 | ((c >> 12) & 0x3F)); } *(*t)++ = (char)(0x80 | ((c >> 6) & 0x3F)); } *(*t)++ = (char)(0x80 | (c & 0x3F)); } *(*t) = '\0'; } const char * ns_convert(const char *tag) { const char *t; char *s; size_t i, n; if (*tag == '_') { if (!strncmp(tag, "__ptr", 5)) { if (tag[5]) tag += 5; else tag = "item"; } else if (strncmp(tag, "_DOT", 4) && strncmp(tag, "_USCORE", 7) && (strncmp(tag, "_x", 2) || !isxdigit(tag[2]) || !isxdigit(tag[3]) || !isxdigit(tag[4]) || !isxdigit(tag[5]))) tag++; /* skip leading _ */ } for (n = strlen(tag); n > 0; n--) { if (tag[n-1] != '_') break; } t = s = (char*)emalloc(n+1); for (i = 0; i < n; i++) { if (tag[i] == '_') { if (tag[i+1] == '_' && !(tag[i+2] == 'x' && isxdigit(tag[i+3]) && isxdigit(tag[i+4]) && isxdigit(tag[i+5]) && isxdigit(tag[i+6]))) break; else if (!strncmp(tag+i, "_DOT", 4)) { *s++ = '.'; i += 3; } else if (!strncmp(tag+i, "_USCORE", 7)) { *s++ = '_'; i += 6; } else if (!strncmp(tag+i, "_x", 2) && isxdigit(tag[i+2]) && isxdigit(tag[i+3]) && isxdigit(tag[i+4]) && isxdigit(tag[i+5])) { char d[5]; strncpy(d, tag+i+2, 4); d[4] = '\0'; utf8(&s, strtoul(d, NULL, 16)); i += 5; } else *s++ = '-'; } else if (!strncmp(tag+i, "\\u", 2) && isxdigit(tag[i+2]) && isxdigit(tag[i+3]) && isxdigit(tag[i+4]) && isxdigit(tag[i+5])) { char d[5]; strncpy(d, tag+i+2, 4); d[4] = '\0'; utf8(&s, strtoul(d, NULL, 16)); i += 5; } else if (tag[i] == ':' && tag[i+1] == ':') break; else *s++ = tag[i]; } if (i < n) { *s++ = ':'; for (i += 2; i < n; i++) { if (tag[i] == '_') { if (!strncmp(tag+i, "_DOT", 4)) { *s++ = '.'; i += 3; } else if (!strncmp(tag+i, "_USCORE", 7)) { *s++ = '_'; i += 6; } else if (!strncmp(tag+i, "_x", 2) && isxdigit(tag[i+2]) && isxdigit(tag[i+3]) && isxdigit(tag[i+4]) && isxdigit(tag[i+5])) { char d[5]; strncpy(d, tag+i+2, 4); d[4] = '\0'; utf8(&s, strtoul(d, NULL, 16)); i += 5; } else *s++ = '-'; } else if (!strncmp(tag+i, "\\u", 2) && isxdigit(tag[i+2]) && isxdigit(tag[i+3]) && isxdigit(tag[i+4]) && isxdigit(tag[i+5])) { char d[5]; strncpy(d, tag+i+2, 4); d[4] = '\0'; utf8(&s, strtoul(d, NULL, 16)); i += 5; } else *s++ = tag[i]; } } *s = '\0'; return t; } const char * res_remove(const char *tag) { char *s; const char *t; if (!(t = strchr(tag, ':'))) return tag; if (t[1] != ':') tag = t + 1; if (!strchr(tag, ':')) return tag; s = (char*)emalloc(strlen(tag) + 1); t = strcpy(s, tag); while ((s = strchr(s, ':'))) *s = '_'; return t; } const char * ns_qualifiedElement(Tnode *typ) { Service *sp; const char *s = NULL; if (typ->sym) s = prefix_of(typ->sym->name); if (!s && typ->id) s = prefix_of(typ->id->name); if (!s) return NULL; for (sp = services; sp; sp = sp->next) { if (sp->elementForm && !tagcmp(sp->ns, s)) { if (!strcmp(sp->elementForm, "qualified")) return s; return NULL; } } for (sp = services; sp; sp = sp->next) if (!tagcmp(sp->ns, s)) if (sp->style && !strcmp(sp->style, "document")) return s; return NULL; } const char * ns_qualifiedAttribute(Tnode *typ) { Service *sp; const char *s = NULL; if (typ->sym) s = prefix_of(typ->sym->name); if (!s && typ->id) s = prefix_of(typ->id->name); if (!s) return NULL; for (sp = services; sp; sp = sp->next) { if (sp->attributeForm && !tagcmp(sp->ns, s)) { if (!strcmp(sp->attributeForm, "qualified")) return s; return NULL; } } return NULL; } const char * field(Entry *p, const char *ns) { const char *r; char *s; if (is_self(p)) return "tag"; r = ns_add(p, ns); s = (char*)emalloc(strlen(r) + 3); strcpy(s, "\""); strcat(s, r); strcat(s, "\""); return s; } const char * field_overridden(Table *t, Entry *p, const char *ns) { const char *r; char *s; if (is_self(p)) return "tag"; r = ns_add_overridden(t, p, ns); s = (char*)emalloc(strlen(r) + 3); strcpy(s, "\""); strcat(s, r); strcat(s, "\""); return s; } const char * ns_add(Entry *p, const char *ns) { if (p->tag) return ns_addx(p->tag, ns); return ns_addx(p->sym->name, ns); } const char * ns_addx(const char *tag, const char *ns) { const char *n; char *t; const char *s = ns_convert(tag); if (*s == ':') return s+1; if (!ns || *s == '-' || strchr(s, ':')) return s; n = ns_convert(ns); t = (char*)emalloc(strlen(n) + strlen(s) + 2); strcpy(t, n); strcat(t, ":"); strcat(t, s); return t; } const char * ns_name(const char *tag) { const char *t, *r, *s = tag; if (*s) { for (r = s+strlen(s)-1; r > s; r--) if (*r != '_') break; for (t = s + 1; t < r; t++) { if (t[0] == '_' && t[1] == '_') { s = t + 2; t++; } else if (t[0] == ':' && t[1] != ':') { s = t + 1; t++; } } } return s; } const char * ns_cname(const char *tag, const char *suffix) { char *s; const char *t; size_t i, n; if (!tag) return NULL; t = ns_name(tag); n = strlen(t); if (suffix) s = (char*)emalloc(n + strlen(suffix) + 2); else s = (char*)emalloc(n + 2); for (i = 0; i < n; i++) { if (!isalnum(t[i])) s[i] = '_'; else s[i] = t[i]; } s[i] = '\0'; if (suffix) strcat(s, suffix); if (is_keyword(t)) strcat(s, "_"); return s; } const char * ns_fname(const char *tag) { char *s; size_t i; s = (char*)emalloc(strlen(tag) + 1); strcpy(s, tag); for (i = 0; s[i]; i++) if (!isalnum(s[i])) s[i] = '_'; return s; } const char * ns_remove(const char *tag) { return ns_convert(ns_name(tag)); } const char * ns_remove1(const char *tag) { const char *t, *s = tag; int n = 2; if (*s) { for (t = s + 1; *t && n; t++) if (t[0] == '_' && t[1] == '_') { s = t + 2; t++; n--; } if (n || (s[0] == '_' && s[1] != 'x' && strncmp(s, "_USCORE", 7)) || !*s) s = tag; } return s; } const char * ns_remove2(const char *tag, const char *type) { size_t n; if (tag && type && !strncmp(tag, type, n = strlen(type)) && strlen(tag) > n + 2) return ns_convert(tag + n + 2); return ns_convert(tag); } const char * xsi_type_cond(Tnode *typ, int flag) { if (flag) return xsi_type(typ); return ""; } const char * xsi_type_cond_u(Tnode *typ, int flag) { if (flag) return xsi_type_u(typ); return ""; } const char * xsi_type_u(Tnode *typ) { Service *sp; const char *s = NULL; if (tflag) return xsi_type(typ); if (typ->sym) s = prefix_of(typ->sym->name); if (!s && typ->id) s = prefix_of(typ->id->name); if (!s) return ""; s = xsi_type(typ); for (sp = services; sp; sp = sp->next) if (sp->xsi_type && has_ns_eq(sp->ns, s)) return s; return ""; } const char * xsi_type(Tnode *typ) { if (!typ) return "NULL"; if (is_dynamic_array(typ) && !has_ns(typ) && !is_binary(typ)) return xsi_type_Darray(typ); if (typ->type == Tarray) return xsi_type_Tarray(typ); if (is_untyped(typ)) return ""; if (typ->sym) { if (!strncmp(typ->sym->name, "SOAP_ENV__", 10)) return ""; if (is_XML(typ)) return "xsd:anyType"; if (typ->type != Ttemplate) return ns_convert(typ->sym->name); } if (is_string(typ) || is_wstring(typ) || is_stdstring(typ) || is_stdwstring(typ)) return "xsd:string"; switch(typ->type) { case Tvoid: return "xsd:anyType"; case Tchar: return "xsd:byte"; case Twchar: return "wchar"; case Tshort: return "xsd:short"; case Tint: return "xsd:int"; case Tlong: case Tllong: return "xsd:long"; case Tfloat: return "xsd:float"; case Tdouble: return "xsd:double"; case Tldouble: return "xsd:decimal"; case Tuchar: return "xsd:unsignedByte"; case Tushort: return "xsd:unsignedShort"; case Tuint: return "xsd:unsignedInt"; case Tulong: case Tullong: return "xsd:unsignedLong"; case Ttime: return "xsd:dateTime"; case Tpointer: case Treference: case Trvalueref: return xsi_type((Tnode*)typ->ref); case Tenum: if (is_bool(typ)) return "xsd:boolean"; case Tenumsc: case Tstruct: case Tclass: if (!strncmp(typ->id->name, "SOAP_ENV__", 10)) return ""; return ns_convert(typ->id->name); case Ttemplate: if ((Tnode*)typ->ref) return xsi_type((Tnode*)typ->ref); break; default: break; } return ""; } const char * xml_tag(Tnode *typ) { if (!typ) return "NULL"; if ((typ->type == Tpointer && !is_string(typ) && !is_wstring(typ)) || typ->type == Treference || typ->type == Trvalueref) return xml_tag((Tnode*)typ->ref); if (typ->sym) return ns_convert(typ->sym->name); return the_type(typ); } const char * wsdl_type(Tnode *typ, const char *ns) { if (!typ) return "NULL"; if ((is_qname(typ) || is_stdqname(typ)) && ns) return "xsd:QName"; if (typ->sym) { if (is_XML(typ)) return "xsd:anyType"; else if (ns) return ns_convert(typ->sym->name); else return ns_remove(typ->sym->name); } return base_type(typ, ns); } const char * base_type(Tnode *typ, const char *ns) { int d; const char *s; char *t; if (is_string(typ) || is_wstring(typ) || is_stdstring(typ) || is_stdwstring(typ) || is_fixedstring(typ)) { if (ns) return "xsd:string"; return "string"; } if (is_dynamic_array(typ) && !is_binary(typ) && !has_ns(typ) && !is_untyped(typ)) { s = ns_remove(wsdl_type(((Table*)typ->ref)->list->info.typ, NULL)); if (ns && *ns) { t = (char*)emalloc(strlen(s)+strlen(ns_convert(ns))+13); strcpy(t, ns_convert(ns)); strcat(t, ":"); strcat(t, "ArrayOf"); } else { t = (char*)emalloc(strlen(s)+12); strcpy(t, "ArrayOf"); } strcat(t, s); d = get_Darraydims(typ); if (d) sprintf(t+strlen(t), "%dD", d); return t; } if (is_synonym(typ)) { if (ns) return ns_convert(typ->synonym->name); else return ns_remove(typ->synonym->name); } switch (typ->type) { case Tvoid : if (ns) return "xsd:anyType"; return "anyType"; case Tchar : if (ns) return "xsd:byte"; return "byte"; case Tshort : if (ns) return "xsd:short"; return "short"; case Tint : if (ns) return "xsd:int"; return "int"; case Tlong : case Tllong : if (ns) return "xsd:long"; return "long"; case Tfloat: if (ns) return "xsd:float"; return "float"; case Tdouble: if (ns) return "xsd:double"; return "double"; case Tldouble: if (ns) return "xsd:decimal"; return "decimal"; case Tuchar: if (ns) return "xsd:unsignedByte"; return "unsignedByte"; case Tushort: if (ns) return "xsd:unsignedShort"; return "unsignedShort"; case Tuint: if (ns) return "xsd:unsignedInt"; return "unsignedInt"; case Tulong: case Tullong: if (ns) return "xsd:unsignedLong"; return "unsignedLong"; case Ttime: if (ns) return "xsd:dateTime"; return "dateTime"; case Tpointer: case Treference: case Trvalueref: return wsdl_type((Tnode*)typ->ref, ns); case Tarray: if (is_fixedstring(typ)) { if (typ->sym) { if (ns) return ns_convert(typ->sym->name); return ns_remove(typ->sym->name); } if (ns) return "xsd:string"; return "string"; } if (ns && *ns) { t = (char*)emalloc((strlen(ns_convert(ns))+strlen(c_ident(typ))+2) * sizeof(char)); strcpy(t, ns_convert(ns)); strcat(t, ":"); strcat(t, c_ident(typ)); return t; } else return c_ident(typ); case Tenum: if (is_bool(typ)) { if (ns) return "xsd:boolean"; return "boolean"; } case Tenumsc: case Tstruct: case Tclass: if (!has_ns(typ) && ns && *ns) { t = (char*)emalloc((strlen(ns_convert(ns))+strlen(typ->id->name)+2) * sizeof(char)); strcpy(t, ns_convert(ns)); strcat(t, ":"); strcat(t, ns_convert(typ->id->name)); return t; } else if (ns) return ns_convert(typ->id->name); else return ns_remove(typ->id->name); case Tunion: if (ns) return "xsd:choice"; return "choice"; case Ttemplate: if ((Tnode*)typ->ref) return wsdl_type((Tnode*)typ->ref, ns); break; default: break; } return ""; } const char * the_type(Tnode *typ) { if (!typ) return "NULL"; if (typ->type == Tarray || (is_dynamic_array(typ) && !is_binary(typ) && (eflag || (!has_ns(typ) && !is_untyped(typ))))) return "SOAP-ENC:Array"; if (is_string(typ) || is_wstring(typ) || is_stdstring(typ) || is_stdwstring(typ)) return "string"; switch (typ->type) { case Tchar: return "byte"; case Twchar: return "wchar"; case Tshort: return "short"; case Tint : return "int"; case Tlong : case Tllong : return "long"; case Tfloat: return "float"; case Tdouble: return "double"; case Tldouble: return "decimal"; case Tuchar: return "unsignedByte"; case Tushort: return "unsignedShort"; case Tuint: return "unsignedInt"; case Tulong: case Tullong: return "unsignedLong"; case Ttime: return "dateTime"; case Tpointer: case Treference: case Trvalueref: return the_type((Tnode*)typ->ref); case Tarray: return "SOAP-ENC:Array"; case Tenum: if (is_bool(typ)) return "boolean"; case Tenumsc: case Tstruct: case Tclass: return ns_convert(typ->id->name); default: break; } return ""; } /* c_type returns the type to be used in parameter declaration*/ const char * c_type(Tnode *typ) { char *p = NULL; const char *q, *r; char tempBuf[10]; Tnode *temp; Entry *e; if (typ == NULL) return "NULL"; switch(typ->type) { case Tnone: return ""; case Tvoid: return "void"; case Tchar: return "char"; case Twchar: return "wchar_t"; case Tshort: return "short"; case Tint : return "int"; case Tlong : return "long"; case Tllong : return "LONG64"; case Tfloat: return "float"; case Tdouble: return "double"; case Tldouble: return "long double"; case Tuchar: return "unsigned char"; case Tushort: return "unsigned short"; case Tuint: return "unsigned int"; case Tulong: return "unsigned long"; case Tullong: return "ULONG64"; case Tsize: return "size_t"; case Ttime: return "time_t"; case Tstruct: q = ident(typ->id->name); p = (char*)emalloc((8+strlen(q)) * sizeof(char)); strcpy(p, "struct "); strcat(p, q); return p; case Tclass: return ident(typ->id->name); case Tunion: q = ident(typ->id->name); p = (char*)emalloc((7+strlen(q)) * sizeof(char)); strcpy(p, "union "); strcat(p, q); return p; case Tenum: if (is_bool(typ)) return "bool"; q = ident(typ->id->name); p = (char*)emalloc((6+strlen(q)) * sizeof(char)); strcpy(p, "enum "); strcat(p, q); return p; case Tenumsc: return ident(typ->id->name); case Tpointer: return c_type_id((Tnode*)typ->ref, "*"); case Treference: return c_type_id((Tnode*)typ->ref, "&"); case Trvalueref: return c_type_id((Tnode*)typ->ref, "&&"); case Tarray: temp = typ; while (((Tnode*) (typ->ref))->type == Tarray) typ = (Tnode*)typ->ref; p = (char*)emalloc((12 + strlen(q = c_type((Tnode*)typ->ref))) * sizeof(char)); if (((Tnode*)typ->ref)->type == Tpointer) sprintf(p, "%s", c_type((Tnode*)typ->ref)); else strcpy(p, q); typ = temp; while (typ->type == Tarray) { if (((Tnode*) typ->ref)->width) { sprintf(tempBuf, "[%d]", (typ->width / ((Tnode*) typ->ref)->width)); strcat(p, tempBuf); } typ = (Tnode*)typ->ref; } break; case Tfun: p = (char*)emalloc(1024); strcpy(p, c_type(((FNinfo*)typ->ref)->ret)); strcat(p, "("); for (e = ((FNinfo*)typ->ref)->args->list; e; e = e->next) { strcat(p, c_storage(e->info.sto)); if (e->info.typ->type != Tvoid) { strcat(p, c_type_id(e->info.typ, e->sym->name)); strcat(p, c_init(e)); } else strcat(p, "void"); if (e->next) strcat(p, ", "); } strcat(p, ")"); return p; case Ttemplate: if (typ->ref) { p = (char*)emalloc((strlen(q = c_type((Tnode*)typ->ref)) + strlen(r = ident(typ->id->name)) + 4) * sizeof(char)); strcpy(p, r); strcat(p, "<"); strcat(p, q); strcat(p, "> "); return p; } default: return "UnknownType"; } return p; } const char * c_storage(Storage sto) { static char buf[256]; buf[0] = '\0'; if (sto & Smutable) strcat(buf, "mutable "); if (sto & Sinline) strcat(buf, "inline "); if (sto & Sfriend) strcat(buf, "friend "); if (sto & Svirtual) strcat(buf, "virtual "); if (sto & Stypedef) strcat(buf, "typedef "); if (sto & Sexplicit) strcat(buf, "explicit "); if (sto & Sstatic) strcat(buf, "static "); if (sto & Sregister) strcat(buf, "register "); if (sto & Sauto) strcat(buf, "auto "); if (sto & Sconstptr) strcat(buf, "const "); if (sto & Sconst) strcat(buf, "const "); return buf; } const char * c_const(Storage sto) { if (sto & Sconst) return "const "; if (sto & Sconstptr) return "const "; return ""; } const char * c_init(Entry *e) { static char buf[4096]; buf[0] = '\0'; if (e && e->info.hasval) { switch (e->info.typ->type) { case Tchar: case Twchar: case Tuchar: case Tshort: case Tushort: case Tint: case Tuint: case Ttime: sprintf(buf, " = " SOAP_LONG_FORMAT, e->info.val.i); break; case Tlong: sprintf(buf, " = " SOAP_LONG_FORMAT "L", e->info.val.i); break; case Tulong: sprintf(buf, " = " SOAP_LONG_FORMAT "UL", e->info.val.i); break; case Tllong: sprintf(buf, " = " SOAP_LONG_FORMAT "LL", e->info.val.i); break; case Tullong: case Tsize: sprintf(buf, " = " SOAP_LONG_FORMAT "ULL", e->info.val.i); break; case Tfloat: case Tdouble: sprintf(buf, " = %g", e->info.val.r); break; case Tldouble: sprintf(buf, " = %gL", e->info.val.r); break; case Tenum: case Tenumsc: if (e->info.val.i <= 0x7FFFLL && e->info.val.i >= -0x8000LL) sprintf(buf, " = (%s)" SOAP_LONG_FORMAT, c_type(e->info.typ), e->info.val.i); else sprintf(buf, " = (%s)" SOAP_LONG_FORMAT "LL", c_type(e->info.typ), e->info.val.i); break; default: if (is_stdstring(e->info.typ) && e->info.val.s && strlen(e->info.val.s) < sizeof(buf)-6) sprintf(buf, " = \"%s\"", cstring(e->info.val.s, 0)); else if (is_stdwstring(e->info.typ) && e->info.val.s && strlen(e->info.val.s) < sizeof(buf)-6) sprintf(buf, " = L\"%s\"", cstring(e->info.val.s, 0)); else if (is_wstring(e->info.typ) && e->info.val.s && strlen(e->info.val.s) < sizeof(buf)-6) sprintf(buf, " = (wchar_t*)L\"%s\"", cstring(e->info.val.s, 0)); else if (e->info.val.s && strlen(e->info.val.s) < sizeof(buf)-6) sprintf(buf, " = (char*)\"%s\"", cstring(e->info.val.s, 0)); else if (e->info.typ->type == Tpointer) sprintf(buf, " = NULL"); break; } } return buf; } /* c_type_constptr_id returns the const* type to be used in parameter declaration */ const char * c_type_constptr_id(Tnode *typ, const char *name) { return c_type_id(typ, name); } /* c_type_id returns the type to be used in parameter declaration */ const char * c_type_id(Tnode *typ, const char *name) { const char *id; char *p = NULL; const char *q; char tempBuf[10]; Tnode *temp; Entry *e; if (!typ) return "NULL"; id = ident(name); switch(typ->type) { case Tnone: return id; case Tvoid: p = (char*)emalloc(6+strlen(id)); strcpy(p, "void "); strcat(p, id); break; case Tchar: p = (char*)emalloc(6+strlen(id)); strcpy(p, "char "); strcat(p, id); break; case Twchar: p = (char*)emalloc(9+strlen(id)); strcpy(p, "wchar_t "); strcat(p, id); break; case Tshort: p = (char*)emalloc(7+strlen(id)); strcpy(p, "short "); strcat(p, id); break; case Tint : p = (char*)emalloc(5+strlen(id)); strcpy(p, "int "); strcat(p, id); break; case Tlong : p = (char*)emalloc(6+strlen(id)); strcpy(p, "long "); strcat(p, id); break; case Tllong : p = (char*)emalloc(8+strlen(id)); strcpy(p, "LONG64 "); strcat(p, id); break; case Tfloat: p = (char*)emalloc(7+strlen(id)); strcpy(p, "float "); strcat(p, id); break; case Tdouble: p = (char*)emalloc(8+strlen(id)); strcpy(p, "double "); strcat(p, id); break; case Tldouble: p = (char*)emalloc(13+strlen(id)); strcpy(p, "long double "); strcat(p, id); break; case Tuchar: p = (char*)emalloc(15+strlen(id)); strcpy(p, "unsigned char "); strcat(p, id); break; case Tushort: p = (char*)emalloc(16+strlen(id)); strcpy(p, "unsigned short "); strcat(p, id); break; case Tuint: p = (char*)emalloc(14+strlen(id)); strcpy(p, "unsigned int "); strcat(p, id); break; case Tulong: p = (char*)emalloc(15+strlen(id)); strcpy(p, "unsigned long "); strcat(p, id); break; case Tullong: p = (char*)emalloc(9+strlen(id)); strcpy(p, "ULONG64 "); strcat(p, id); break; case Tsize: p = (char*)emalloc(8+strlen(id)); strcpy(p, "size_t "); strcat(p, id); break; case Ttime: p = (char*)emalloc(8+strlen(id)); strcpy(p, "time_t "); strcat(p, id); break; case Tstruct: q = ident(typ->id->name); p = (char*)emalloc((9+strlen(q)+strlen(id)) * sizeof(char)); strcpy(p, "struct "); strcat(p, q); strcat(p, " "); strcat(p, id); break; case Tclass: q = ident(typ->id->name); p = (char*)emalloc((2+strlen(q)+strlen(id)) * sizeof(char)); strcpy(p, q); strcat(p, " "); strcat(p, id); break; case Tunion: q = ident(typ->id->name); p = (char*)emalloc((8+strlen(q)+strlen(id)) * sizeof(char)); strcpy(p, "union "); strcat(p, q); strcat(p, " "); strcat(p, id); break; case Tenum: if (is_bool(typ)) { p = (char*)emalloc((strlen(id)+6)* sizeof(char)); strcpy(p, "bool "); strcat(p, id); return p; } q = ident(typ->id->name); p = (char*)emalloc((7+strlen(q)+strlen(id)) * sizeof(char)); strcpy(p, "enum "); strcat(p, q); strcat(p, " "); strcat(p, id); break; case Tenumsc: q = ident(typ->id->name); p = (char*)emalloc((7+strlen(q)+strlen(id)) * sizeof(char)); strcpy(p, q); strcat(p, " "); strcat(p, id); break; case Tpointer: p = (char*)emalloc(strlen(id)+2); p[0] = '*'; strcpy(p+1, id); return c_type_id((Tnode*)typ->ref, p); case Treference: p = (char*)emalloc(strlen(id)+2); p[0] = '&'; strcpy(p+1, id); return c_type_id((Tnode*)typ->ref, p); case Trvalueref: p = (char*)emalloc(strlen(id)+3); p[0] = '&'; p[1] = '&'; strcpy(p+2, id); return c_type_id((Tnode*)typ->ref, p); case Tarray: temp = typ; while (((Tnode*) (typ->ref))->type == Tarray) typ = (Tnode*)typ->ref; p = (char*)emalloc((12+strlen(q = c_type_id((Tnode*)typ->ref, id))) * sizeof(char)); strcpy(p, q); typ = temp; while (typ->type == Tarray) { if (((Tnode*) typ->ref)->width) { sprintf(tempBuf, "[%d]", (typ->width / ((Tnode*) typ->ref)->width)); strcat(p, tempBuf); } typ = (Tnode*)typ->ref; } break; case Tfun: if (id && strncmp(id, "operator ", 9)) q = c_type_id(((FNinfo*)typ->ref)->ret, id); else q = id; p = (char*)emalloc(1024); if (q) strcpy(p, q); strcat(p, "("); for (e = ((FNinfo*)typ->ref)->args->list; e; e = e->next) { strcat(p, c_storage(e->info.sto)); if (e->info.typ->type != Tvoid) { strcat(p, c_type_id(e->info.typ, e->sym->name)); strcat(p, c_init(e)); } else strcat(p, "void"); if (e->next) strcat(p, ", "); } strcat(p, ")"); break; case Ttemplate: if (typ->ref) { p = (char*)emalloc((strlen(q = c_type((Tnode*)typ->ref))+strlen(ident(typ->id->name))+strlen(id)+4) * sizeof(char)); strcpy(p, ident(typ->id->name)); strcat(p, "<"); strcat(p, q); strcat(p, "> "); strcat(p, id); break; } default: return "UnknownType"; } return p; } /* c_type_synonym returns the typedef synonym name as a type (if present) to be used in parameter declaration */ const char * c_type_synonym(Tnode *typ, const char *name) { if (typ->synonym) { const char *synonym = ident(typ->synonym->name); const char *id = ident(name); char *p = (char*)emalloc(strlen(synonym) + strlen(id) + 2); strcpy(p, synonym); strcat(p, " "); strcat(p, id); return p; } return c_type_id(typ, name); } const char * xsi_type_Tarray(Tnode *typ) { Tnode *t; int cardinality; char *p; const char *s; t = (Tnode*)typ->ref; if (is_fixedstring(typ)) { if (typ->sym) return ns_convert(typ->sym->name); return "xsd:string"; } cardinality = 1; while (t->type == Tarray || (is_dynamic_array(t) && !has_ns(t) && !is_untyped(t) && !is_binary(t))) { if (t->type == Tarray) t = (Tnode*)t->ref; else t = (Tnode*)((Table*)t->ref)->list->info.typ->ref; cardinality++; } s = xsi_type(t); if (!*s) s = wsdl_type(t, ""); p = (char*)emalloc(strlen(s)+cardinality+3); strcpy(p, s); if (cardinality > 1) { strcat(p, "["); for (; cardinality > 2; cardinality--) strcat(p, ", "); strcat(p, "]"); } return p; } const char * xsi_type_Darray(Tnode *typ) { Tnode *t; Entry *q; int cardinality; char *p; const char *s; if (!typ->ref) return ""; q = ((Table*)typ->ref)->list; while (q && q->info.typ->type == Tfun) q = q->next; t = (Tnode*)q->info.typ->ref; cardinality = 1; while (t->type == Tarray || (is_dynamic_array(t) && !has_ns(t) && !is_untyped(t) && !is_binary(t))) { if (t->type == Tarray) t = (Tnode*)t->ref; else { q = ((Table*)t->ref)->list; while (q && q->info.typ->type == Tfun) q = q->next; t = (Tnode*)q->info.typ->ref; } cardinality++; } s = xsi_type(t); if (!*s) s = wsdl_type(t, ""); p = (char*)emalloc(strlen(s)+cardinality*2+1); strcpy(p, s); if (cardinality > 1) { strcat(p, "["); for (; cardinality > 2; cardinality--) strcat(p, ", "); strcat(p, "]"); } return p; } void generate_type(Tnode *typ) { if (Etflag && is_XML(typ)) { soap_traverse(typ); return; } if (is_transient(typ) || typ->type == Twchar || is_XML(typ) || is_void(typ)) return; if (lflag && typ->type == Tint && !typ->sym) { fprintf(fhead, "\n\n#ifndef %s", soap_type(typ)); fprintf(fhead, "\n#define %s (%d)", soap_type(typ), typ->num); fprintf(fhead, "\n#endif"); fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_default_int(struct soap*, int*);"); fprintf(fhead, "\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_int(struct soap*, const char*, int, const int*, const char*);"); fprintf(fhead, "\nSOAP_FMAC1 int* SOAP_FMAC2 soap_in_int(struct soap*, const char*, int*, const char*);"); return; /* do not generate int serializers in libs */ } else if (is_imported(typ) && (typ->type != Tint || typ->sym)) return; if (is_typedef(typ) && (is_element(typ) || is_synonym(typ))) fprintf(fhead, "\n/* %s is a typedef synonym for %s */", c_ident(typ), t_ident(typ)); if (is_primitive(typ) || is_string(typ) || is_wstring(typ)) { if (!Qflag && is_external(typ) && namespaceid) { const char *id = namespaceid; fprintf(fhead, "\n\n}"); fprintf(fout, "\n\n}"); namespaceid = NULL; fprintf(fhead, "\n\n#ifndef %s", soap_type(typ)); fprintf(fhead, "\n#define %s (%d)", soap_type(typ), typ->num); fprintf(fhead, "\n#endif"); namespaceid = id; } fprintf(fhead, "\n\n#ifndef %s", soap_type(typ)); fprintf(fhead, "\n#define %s (%d)", soap_type(typ), typ->num); fprintf(fhead, "\n#endif"); fflush(fhead); soap_default(typ); soap_serialize(typ); if (Etflag) soap_traverse(typ); soap_out(typ); soap_in(typ); if (!Qflag && is_external(typ) && namespaceid) { fprintf(fhead, "\n\nnamespace %s {", namespaceid); fprintf(fout, "\n\nnamespace %s {", namespaceid); } if (is_string(typ) || is_wstring(typ)) { soap_dup(typ); soap_del(typ); } soap_put(typ); soap_get(typ); return; } switch(typ->type) { case Ttemplate: case Tenum: case Tenumsc: case Tpointer: case Tarray: case Tstruct: case Tclass: case Tunion: if (is_header_or_fault(typ) || is_body(typ)) { fprintf(fhead, "\n\n#ifndef WITH_NOGLOBAL"); fprintf(fout, "\n\n#ifndef WITH_NOGLOBAL"); } if (!Qflag && is_external(typ) && namespaceid) { const char *id = namespaceid; fprintf(fhead, "\n\n}"); fprintf(fout, "\n\n}"); namespaceid = NULL; fprintf(fhead, "\n\n#ifndef %s", soap_type(typ)); fprintf(fhead, "\n#define %s (%d)", soap_type(typ), typ->num); fprintf(fhead, "\n#endif"); namespaceid = id; } fprintf(fhead, "\n\n#ifndef %s", soap_type(typ)); fprintf(fhead, "\n#define %s (%d)", soap_type(typ), typ->num); fprintf(fhead, "\n#endif"); fflush(fhead); soap_default(typ); soap_serialize(typ); if (Etflag) soap_traverse(typ); soap_out(typ); soap_in(typ); if (!Qflag && is_external(typ) && namespaceid) { fprintf(fhead, "\n\nnamespace %s {", namespaceid); fprintf(fout, "\n\nnamespace %s {", namespaceid); } soap_dup(typ); soap_del(typ); soap_instantiate(typ); soap_put(typ); soap_get(typ); if (is_header_or_fault(typ) || is_body(typ)) { fprintf(fhead, "\n\n#endif"); fprintf(fout, "\n\n#endif"); } break; default: break; } } void matlab_gen_sparseStruct(void) { fprintf(fmheader, "\nstruct soapSparseArray{\n"); fprintf(fmheader, " int *ir;\n"); fprintf(fmheader, " int *jc;\n"); fprintf(fmheader, " double *pr;\n"); fprintf(fmheader, " int num_columns;\n"); fprintf(fmheader, " int num_rows;\n"); fprintf(fmheader, " int nzmax;\n"); fprintf(fmheader, "};\n"); } void matlab_c_to_mx_sparse(void) { fprintf(fmheader, "\nmxArray* c_to_mx_soapSparseArray(struct soapSparseArray);\n"); fprintf(fmatlab, "\nmxArray* c_to_mx_soapSparseArray(struct soapSparseArray a)\n"); fprintf(fmatlab, "{\n"); fprintf(fmatlab, " mxArray *b;\n"); fprintf(fmatlab, " b = mxCreateSparse(a.num_rows, a.num_columns, a.nzmax, mxREAL);\n"); fprintf(fmatlab, " mxSetIr(b,a.ir);\n"); fprintf(fmatlab, " mxSetJc(b,a.jc);\n"); fprintf(fmatlab, " mxSetPr(b,a.pr);\n"); fprintf(fmatlab, " return b;\n"); fprintf(fmatlab, "}\n"); } void matlab_mx_to_c_sparse(void) { fprintf(fmheader, "\nmxArray* mx_to_c_soapSparseArray(const mxArray *, struct soapSparseArray *);\n"); fprintf(fmatlab, "\nmxArray* mx_to_c_soapSparseArray(const mxArray *a, struct soapSparseArray *b)\n"); fprintf(fmatlab, "{\n"); fprintf(fmatlab, " if (!mxIsSparse(a))\n"); fprintf(fmatlab, " {\n"); fprintf(fmatlab, " mexErrMsgTxt(\"Input should be a sparse array.\");\n"); fprintf(fmatlab, " }\n"); fprintf(fmatlab, " /* Get the starting positions of the data in the sparse array. */ \n"); fprintf(fmatlab, " b->pr = mxGetPr(a);\n"); fprintf(fmatlab, " b->ir = mxGetIr(a);\n"); fprintf(fmatlab, " b->jc = mxGetJc(a);\n"); fprintf(fmatlab, " b->num_columns = mxGetN(a);\n"); fprintf(fmatlab, " b->num_rows = mxGetM(a);\n"); fprintf(fmatlab, " b->nzmax = mxGetNzmax(a);\n"); fprintf(fmatlab, "}\n"); } void matlab_mx_to_c_dynamicArray(Tnode* typ) { int d; Entry *p; p = is_dynamic_array(typ); fprintf(fmatlab, "{\n"); fprintf(fmatlab, "\tint i, numdims;\n"); fprintf(fmatlab, "\tconst int *dims;\n"); fprintf(fmatlab, "\tdouble *temp;\n"); fprintf(fmatlab, "\tint size = 1;\n"); fprintf(fmatlab, "\tint ret;\n"); fprintf(fmatlab, "\tnumdims = mxGetNumberOfDimensions(a);\n"); fprintf(fmatlab, "\tdims = mxGetDimensions(a);\n"); d = get_Darraydims(typ); fprintf(fmatlab, "\tif (numdims != %d)\n", d); fprintf(fmatlab, "\t\tmexErrMsgTxt(\"Incompatible array specifications in C and mx.\");\n"); /* fprintf(fmatlab, "\tfor (i=0;i__size[i] = dims[i];\n"); fprintf(fmatlab, "\t}\n"); */ if ((((Tnode *)p->info.typ->ref)->type != Tchar) && (((Tnode *)p->info.typ->ref)->type != Tuchar)) { fprintf(fmatlab, "\ttemp = (double*)mxGetPr(a);\n"); fprintf(fmatlab, "\tif (!temp)\n\t\tmexErrMsgTxt(\"mx_to_c_ArrayOfdouble: Pointer to data is NULL\");\n"); } fprintf(fmatlab, "\tfor (i = 0; i < numdims; i++) {\n"); fprintf(fmatlab, "\t\tif (b->__size[i] < dims[i])\n"); fprintf(fmatlab, "\t\t\tmexErrMsgTxt(\"Incompatible array dimensions in C and mx.\");\n"); fprintf(fmatlab, "\t\tsize *= dims[i];\n"); fprintf(fmatlab, "\t}\n"); if ((((Tnode *)p->info.typ->ref)->type != Tchar) && (((Tnode *)p->info.typ->ref)->type != Tuchar)) { fprintf(fmatlab, "\tfor (i = 0; i < size; i++)\n"); fprintf(fmatlab, "\t\tb->__ptr[i] = (%s)*temp++;\n", c_type((Tnode*)p->info.typ->ref)); } else { fprintf(fmatlab, "\tret = mxGetString(a, b->__ptr, size + 1);\n"); fprintf(fmatlab, "\tmexPrintf(\"ret = %%d, b->__ptr = %%s, size = %%d\", ret, b->__ptr, size);\n"); } fprintf(fmatlab, "\n}\n"); fflush(fmatlab); } void matlab_c_to_mx_dynamicArray(Tnode* typ) { int d, i; Entry *p; p = is_dynamic_array(typ); fprintf(fmatlab, "{\n"); fprintf(fmatlab, "\tmxArray *out;\n"); fprintf(fmatlab, "\t%s;\n", c_type_id((Tnode*)p->info.typ->ref, "*temp")); d = get_Darraydims(typ); fprintf(fmatlab, "\tint i;\n"); fprintf(fmatlab, "\tint ndim = %d, dims[%d] = {", d, d); for (i = 0; i < d; i++) { if (i == 0) fprintf(fmatlab, "a.__size[%d]", i); else fprintf(fmatlab, ", a.__size[%d]", i); } fprintf(fmatlab, "};\n"); fprintf(fmatlab, "\tint size = "); for (i = 0; i < d; i++) { if (i == 0) fprintf(fmatlab, "dims[%d]", i); else fprintf(fmatlab, "*dims[%d]", i); } fprintf(fmatlab, ";\n"); if ((((Tnode *)p->info.typ->ref)->type != Tchar) && (((Tnode *)p->info.typ->ref)->type != Tuchar)) { fprintf(fmatlab, "\tout = mxCreateNumericArray(ndim, dims, %s, mxREAL);\n", get_mxClassID((Tnode*)p->info.typ->ref)); fprintf(fmatlab, "\tif (!out)\n\t\tmexErrMsgTxt(\"Could not create mxArray.\");\n"); fprintf(fmatlab, "\ttemp = (%s) mxGetPr(out);\n", c_type_id((Tnode*)p->info.typ->ref, "*")); fprintf(fmatlab, "\tif (!temp)\n\t\tmexErrMsgTxt(\"matlab_array_c_to_mx: Pointer to data is NULL\");\n"); fprintf(fmatlab, "\tfor (i = 0; i < size; i++)\n"); fprintf(fmatlab, "\t\t*temp++ = a.__ptr[i];\n"); } else { fprintf(fmatlab, "\tout = mxCreateString(a.__ptr);\n"); fprintf(fmatlab, "\tif (!out)\n\t\tmexErrMsgTxt(\"Could not create mxArray.\");\n"); } fprintf(fmatlab, "\treturn out;\n}\n"); fflush(fmatlab); } const char* get_mxClassID(Tnode* typ) { switch(typ->type) { case Tdouble: return "mxDOUBLE_CLASS"; case Tfloat: return "mxSINGLE_CLASS"; case Tshort: return "mxINT16_CLASS"; case Tushort: return "mxUINT16_CLASS"; case Tint: return "mxINT32_CLASS"; case Tuint: return "mxUINT32_CLASS"; case Tlong: return "mxINT32_CLASS"; case Tulong: return "mxUINT32_CLASS"; case Tllong: return "mxINT64_CLASS"; case Tullong: return "mxUINT64_CLASS"; case Tchar: return "mxCHAR_CLASS"; case Tuchar: return "mxCHAR_CLASS"; default: return ""; } } /*Function not in use.*/ void matlab_array_c_to_mx(Tnode* typ) { Tnode* temp; int d, i; fprintf(fmatlab, "{\n\tint rows, r, cols, c;\n"); fprintf(fmatlab, "\tmxArray* out;\n"); fprintf(fmatlab, "\tdouble* temp;\n"); d = get_dimension(typ); fprintf(fmatlab, "\tint ndim = %d, dims[%d] = {", d, d); temp=typ; for (i = 0; i < d; i++) { if (i == 0) fprintf(fmatlab, "%d", temp->width / ((Tnode*) temp->ref)->width); else fprintf(fmatlab, ", %d", temp->width / ((Tnode*) temp->ref)->width); temp=(Tnode*)typ->ref; } fprintf(fmatlab, "};\n"); fprintf(fmatlab, "\tout = mxCreateNumericArray(ndim, dims, mxDOUBLE_CLASS, mxREAL);\n"); fprintf(fmatlab, "\ttemp = (double *) mxGetPr(out);\n"); fprintf(fmatlab, "\tif (!out)\n\t\tmexErrMsgTxt(\"Could not create mxArray.\");\n"); fprintf(fmatlab, "\tif (!temp)\n\t\tmexErrMsgTxt(\"matlab_array_c_to_mx: Pointer to data is NULL\");\n"); fprintf(fmatlab, "\trows = mxGetM(out);\n"); fprintf(fmatlab, "\tif (!rows)\n\t\tmexErrMsgTxt(\"matlab_array_c_to_mx: Data has zero rows\");\n"); fprintf(fmatlab, "\tcols = mxGetN(out);\n"); fprintf(fmatlab, "\tif (!cols)\n\t\tmexErrMsgTxt(\"matlab_array_c_to_mx: Data has zero columns\");\n"); fprintf(fmatlab, "\tfor (c = 0; c < cols; c++)\n"); fprintf(fmatlab, "\t\tfor (r = 0; r < rows; r++)\n"); fprintf(fmatlab, "\t\t\t*temp++ = z->a[r][c];\n"); fprintf(fmatlab, "\treturn out;\n}\n"); fflush(fmatlab); } void matlab_c_to_mx_pointer(Tnode* typ) { if (!typ->ref) return; fprintf(fmheader, "\nmxArray* c_to_mx_%s(%s);\n", c_ident(typ), c_type_id(typ, "")); fprintf(fmatlab, "\nmxArray* c_to_mx_%s(%s)\n", c_ident(typ), c_type_id(typ, "a")); fprintf(fmatlab, "{\n"); fprintf(fmatlab, "\tmxArray *fout;\n"); fprintf(fmatlab, "\tfout = c_to_mx_%s(*a);\n", c_ident((Tnode*)typ->ref)); fprintf(fmatlab, "\treturn fout;\n"); fprintf(fmatlab, "}\n"); } void matlab_mx_to_c_pointer(Tnode* typ) { if (!typ->ref) return; fprintf(fmheader, "\nvoid mx_to_c_%s(const mxArray*, %s);\n", c_ident(typ), c_type_id(typ, "*")); fprintf(fmatlab, "\nvoid mx_to_c_%s(const mxArray* a, %s)\n", c_ident(typ), c_type_id(typ, "*b")); fprintf(fmatlab, "{\n\tmx_to_c_%s(a, *b);\n", c_ident((Tnode*)typ->ref)); fprintf(fmatlab, "\n}\n"); } void func2(Tnode* typ) { Table *table, *t; Entry *p; fprintf(fmatlab, "\tif (!mxIsStruct(a))\n\t\tmexErrMsgTxt(\"Input must be a structure.\");\n"); table=(Table*)typ->ref; for (t = table; t != (Table*)0; t = t->prev) { for (p = t->list; p != (Entry*)0; p = p->next) { if (p->info.typ->type != Tfun && !is_void(p->info.typ) && !is_XML(p->info.typ)) { fprintf(fmatlab, "\t{mxArray *tmp = mxGetField(a, 0, \"%s\");\n", ident(p->sym->name)); fprintf(fmatlab, "\tif (!tmp) {\n"); fprintf(fmatlab, "\t\tmexErrMsgTxt(\"Above member field is empty!\");\n\t}\n"); fprintf(fmatlab, "\tmx_to_c_%s(tmp, &b->%s);}\n", c_ident(p->info.typ), ident(p->sym->name)); } } } } void matlab_mx_to_c_struct(Tnode* typ) { if (!typ->ref) return; if (is_dynamic_array(typ)) { fprintf(fmheader, "\nvoid mx_to_c_%s(const mxArray*, %s);\n", c_ident(typ), c_type_id(typ, "*")); fprintf(fmatlab, "\nvoid mx_to_c_%s(const mxArray* a, %s)\n", c_ident(typ), c_type_id(typ, "*b")); matlab_mx_to_c_dynamicArray(typ); return; } else if (strstr(c_type_id(typ, ""), "soapSparseArray")) { return; } fprintf(fmheader, "\nvoid mx_to_c_%s(const mxArray*, %s);\n", c_ident(typ), c_type_id(typ, "*")); fprintf(fmatlab, "\nvoid mx_to_c_%s(const mxArray* a, %s)\n", c_ident(typ), c_type_id(typ, "*b")); fprintf(fmatlab, "{\n"); func2(typ); fprintf(fmatlab, "\n}\n"); return; } void matlab_c_to_mx_struct(Tnode* typ) { Table *table, *t; Entry *p; int number_of_fields=0; if (!typ->ref) return; if (is_dynamic_array(typ)) { fprintf(fmheader, "\nmxArray* c_to_mx_%s(%s);\n", c_ident(typ), c_type_id(typ, "")); fprintf(fmatlab, "\nmxArray* c_to_mx_%s(%s)\n", c_ident(typ), c_type_id(typ, "a")); matlab_c_to_mx_dynamicArray(typ); return; } else if (strstr(c_type_id(typ, ""), "soapSparseArray")) return; fprintf(fmheader, "\nmxArray* c_to_mx_%s(%s);\n", c_ident(typ), c_type_id(typ, "")); fprintf(fmatlab, "\nmxArray* c_to_mx_%s(%s)\n", c_ident(typ), c_type_id(typ, "a")); table=(Table*)typ->ref; fprintf(fmatlab, "{\n\tconst char* fnames[] = {"); for (t = table; t != (Table*)0; t = t->prev) { for (p = t->list; p != (Entry*)0; p = p->next) { if (p->info.typ->type != Tfun && !is_void(p->info.typ) && !is_XML(p->info.typ)) { if (number_of_fields) fprintf(fmatlab, ", \"%s\"", ident(p->sym->name)); else fprintf(fmatlab, "\"%s\"", ident(p->sym->name)); number_of_fields++; } } } fprintf(fmatlab, "}; /* pointers to member field names */\n"); fprintf(fmatlab, "\tint rows = 1, cols = 1;\n\tint index = 0;\n\tint number_of_fields = %d;\n\tmxArray *struct_array_ptr;\n", number_of_fields); fprintf(fmatlab, "\t/* Create a 1x1 struct matrix for output */\n"); fprintf(fmatlab, "\tstruct_array_ptr = mxCreateStructMatrix(rows, cols, number_of_fields, fnames);\n\tmexPrintf(\"6\");\n\tif (struct_array_ptr == NULL) {\n\t\tmexPrintf(\"COULDNT CREATE A MATRIX\");}\n\tmexPrintf(\"7\");\n"); for (t = table; t != (Table*)0; t = t->prev) { for (p = t->list; p != (Entry*)0; p = p->next) { if (p->info.typ->type != Tfun && !is_void(p->info.typ) && !is_XML(p->info.typ)) { fprintf(fmatlab, "\t{mxArray *fout = c_to_mx_%s(a.%s);\n", c_ident(p->info.typ), ident(p->sym->name)); fprintf(fmatlab, "\tmxSetField(struct_array_ptr, index, \"%s\" , fout);}\n", ident(p->sym->name)); } } } fprintf(fmatlab, "\treturn struct_array_ptr;\n}\n"); } void matlab_c_to_mx_primitive(Tnode *typ) { fprintf(fmheader, "\nmxArray* c_to_mx_%s(%s);", c_ident(typ), c_type_id(typ, "")); fprintf(fmatlab, "\nmxArray* c_to_mx_%s(%s)\n", c_ident(typ), c_type_id(typ, "a")); fprintf(fmatlab, "{\n\tmxArray *fout;\n"); if ((typ->type == Tchar) || (typ->type == Tuchar)) { fprintf(fmatlab, "\tchar buf[2];\n"); fprintf(fmatlab, "\tbuf[0] = a;\n"); fprintf(fmatlab, "\tbuf[1] = \'\\0\';\n"); fprintf(fmatlab, "\tfout = mxCreateString(buf);\n"); fprintf(fmatlab, "\tif (!fout)\n"); fprintf(fmatlab, "\t\tmexErrMsgTxt(\"Could not create mxArray.\");\n"); } else { fprintf(fmatlab, "\tint ndim = 1, dims[1] = {1};\n"); fprintf(fmatlab, "\tfout = mxCreateNumericArray(ndim, dims, %s, mxREAL);\n", get_mxClassID(typ)); fprintf(fmatlab, "\t%s = (%s)mxGetPr(fout);\n", c_type_id(typ, "*temp"), c_type_id(typ, "*")); fprintf(fmatlab, "\tif (!fout)\n"); fprintf(fmatlab, "\t\tmexErrMsgTxt(\"Could not create mxArray.\");\n"); fprintf(fmatlab, "\tif (!temp) \n"); fprintf(fmatlab, "\t\tmexErrMsgTxt(\"matlab_array_c_to_mx: Pointer to data is NULL\");\n"); fprintf(fmatlab, "\t*temp++= a;\n"); } fprintf(fmatlab, "\treturn fout;\n}\n"); } void matlab_mx_to_c_primitive(Tnode *typ) { fprintf(fmheader, "\nvoid mx_to_c_%s(const mxArray *, %s);\n", c_ident(typ), c_type_id(typ, "*")); fprintf(fmatlab, "\nvoid mx_to_c_%s(const mxArray *a, %s)\n", c_ident(typ), c_type_id(typ, "*b")); if ((typ->type == Tchar) || (typ->type == Tuchar)) { fprintf(fmatlab, "{\n\tint ret;\n"); fprintf(fmatlab, "\tchar buf[2];\n"); fprintf(fmatlab, "\tret = mxGetString(a, buf, 2);\n"); fprintf(fmatlab, "\tmexPrintf(\"ret = %%d, buf = %%s\", ret, buf);\n"); fprintf(fmatlab, "\t*b = buf[0];\n"); } else { fprintf(fmatlab, "{\n\tdouble* data = (double*)mxGetData(a);\n"); fprintf(fmatlab, "\t*b = (%s)*data;\n", c_type(typ)); } fprintf(fmatlab, "\n}\n"); } void matlab_out_generate(Tnode *typ) { if (is_transient(typ) || typ->type == Twchar || is_XML(typ)) return; /* typeNO++; if (typeNO>=1024) execerror("Too many user-defined data types"); */ if (is_primitive(typ)) { matlab_c_to_mx_primitive(typ); matlab_mx_to_c_primitive(typ); return; } switch(typ->type) { case Tstruct: matlab_c_to_mx_struct(typ); matlab_mx_to_c_struct(typ); break; case Tpointer: matlab_c_to_mx_pointer(typ); matlab_mx_to_c_pointer(typ); break; default: break; } } /*his function is called first it first generates all routines and then in the second pass calls all routines to generate matlab_out for the table*/ void func1(Table *table, Entry *param) { Entry *q, *pout, *response=NULL; q=entry(table, param->sym); if (q) pout = (Entry*)q->info.typ->ref; else { fprintf(stderr, "Internal error: no table entry\n"); return; } q=entry(classtable, param->sym); if (!is_response(pout->info.typ)) { response = get_response(param->info.typ); } fprintf(fmheader, "\n\toutside loop struct %s soap_tmp_%s;", param->sym->name, param->sym->name); if (!is_response(pout->info.typ) && response) { fprintf(fmheader, "\n\tif..inside loop struct %s *soap_tmp_%s;", c_ident(response->info.typ), c_ident(response->info.typ)); } fflush(fmheader); } void matlab_def_table(Table *table) { Entry *q, *pout, *e, *response=NULL; int i; Tnode *p; /* for (q1 = table->list; q1 != (Entry*) 0; q1 = q1->next) if (q1->info.typ->type == Tfun) func1(table, q1); */ /* Sparse matrix code will be present by default */ matlab_gen_sparseStruct(); matlab_c_to_mx_sparse(); matlab_mx_to_c_sparse(); for (i = 0; i < TYPES; i++) { for (p = Tptr[i]; p != (Tnode*)0 ; p = p->next) { /* This is generated for everything declared in the ".h" file. To make sure that it doesnt get generated for functions do a comparison with p->sym->name, so that its not generated for functions. */ if (is_XML(p)) continue; if (strstr(c_ident(p), "SOAP_ENV_") != NULL) continue; for (q = table->list; q != (Entry*) 0; q = q->next) { if (strcmp(c_ident(p), q->sym->name) == 0) break; e=entry(table, q->sym); if (e) pout = (Entry*)e->info.typ->ref; else { fprintf(stderr, "Internal error: no table entry\n"); return; } if (!is_response(pout->info.typ)) { response = get_response(q->info.typ); } if (!is_response(pout->info.typ) && response) { if (strcmp(c_ident(p), c_ident(response->info.typ)) == 0) break; } } if (q == (Entry*) 0) matlab_out_generate(p); } } } void detect_cycles(void) { Tnode *p; for (p = Tptr[Tclass]; p; p = p->next) detect_recursive_type(p); for (p = Tptr[Tstruct]; p; p = p->next) detect_recursive_type(p); } void detect_recursive_type(Tnode *p) { if (p->type == Tclass || p->type == Tstruct || p->type == Tunion) { if (!p->recursive) { if (!p->visited) { Table *t; Entry *e; p->visited = True; for (t = (Table*)p->ref; t; t = t->prev) for (e = t->list; e; e = e->next) detect_recursive_type(e->info.typ); if ((p->type == Tclass || p->type == Tstruct) && p->base && !is_transient(p)) { e = entry(classtable, p->base); if (e && e->info.typ->recursive) p->recursive = True; else if (e && !e->info.typ->visited) { e->info.typ->visited = True; detect_recursive_type(e->info.typ); e->info.typ->visited = False; if (e->info.typ->recursive) p->recursive = True; } } p->visited = False; } else p->recursive = True; } } else if (p->type == Tpointer || p->type == Treference || p->type == Trvalueref || p->type == Tarray || p->type == Ttemplate) detect_recursive_type(p->ref); } void generate_defs(void) { int i; Tnode *p; for (i = 0; i < TYPES; i++) { for (p = Tptr[i]; p; p = p->next) { if (!p->generated && !is_transient(p) && p->type != Twchar && !is_void(p)) { p->generated = True; generate_type(p); if (fflag) if (--partnum == 0) return; } } } } int no_of_var(Tnode *typ) { Entry *p; Table *t; int i=0; if (typ->type == Tstruct || typ->type == Tclass) { t = (Table*)typ->ref; for (p = t->list; p != (Entry*) 0; p = p->next) { if (p->info.typ->type == Tpointer) i++; } } if ((((Tnode *)(typ->ref))->type == Tstruct) || (((Tnode *)(typ->ref))->type == Tclass) ) { t = (Table*)((Tnode*)(typ->ref))->ref; for (p = t->list; p != (Entry*) 0; p = p->next) { if (p->info.typ->type == Tpointer) i++; } } return i; } void in_defs(void) { int i; Tnode *p; for (i = 0; i < TYPES; i++) { for (p = Tptr[i]; p; p = p->next) { if (!is_element(p) && !is_transient(p) && p->type != Twchar && p->type != Tfun && p->type != Treference && p->type != Trvalueref && p->type != Tunion && !is_XML(p) && !is_header_or_fault(p) && !is_body(p) && !is_template(p)) { const char *s = xsi_type(p); if (!*s) s = wsdl_type(p, ""); if (*s == '-') continue; if (is_string(p)) fprintf(fout, "\n\tcase %s:\n\t{\tchar **s;\n\t\ts = soap_in_%s(soap, NULL, NULL, \"%s\");\n\t\treturn s ? *s : NULL;\n\t}", soap_type(p), c_ident(p), s); else if (is_wstring(p)) fprintf(fout, "\n\tcase %s:\n\t{\twchar_t **s;\n\t\ts = soap_in_%s(soap, NULL, NULL, \"%s\");\n\t\treturn s ? *s : NULL;\n\t}", soap_type(p), c_ident(p), s); else fprintf(fout, "\n\tcase %s:\n\t\treturn soap_in_%s(soap, NULL, NULL, \"%s\");", soap_type(p), c_ident(p), s); } } } } void in_defs2(void) { int i, j; Tnode *p; const char *s; for (i = 0; i < TYPES; i++) { /* make sure (wrapper) classes are checked first */ if (i == 0) j = Tclass; else if (i == Tclass) continue; else j = i; for (p = Tptr[j]; p; p = p->next) { if (!is_element(p) && !is_transient(p) && !is_template(p) && p->type != Twchar && p->type != Tfun && p->type != Treference && p->type != Trvalueref && p->type != Tunion && !is_XML(p) && !is_header_or_fault(p) && !is_body(p)) { s = xsi_type(p); if (!*s) s = wsdl_type(p, ""); if (*s == '-') continue; if (*s) { if (is_dynamic_array(p) && !is_binary(p) && !has_ns(p) && !is_untyped(p)) fprintf(fout, "\n\t\tif (*soap->arrayType && !soap_match_array(soap, \"%s\"))\n\t\t{\t*type = %s;\n\t\t\treturn soap_in_%s(soap, NULL, NULL, NULL);\n\t\t}", s, soap_type(p), c_ident(p)); else if (is_string(p)) fprintf(fout, "\n\t\tif (!soap_match_tag(soap, t, \"%s\"))\n\t\t{\tchar **s;\n\t\t\t*type = %s;\n\t\t\ts = soap_in_%s(soap, NULL, NULL, NULL);\n\t\t\treturn s ? *s : NULL;\n\t\t}", s, soap_type(p), c_ident(p)); else if (is_wstring(p)) fprintf(fout, "\n\t\tif (!soap_match_tag(soap, t, \"%s\"))\n\t\t{\twchar_t **s;\n\t\t\t*type = %s;\n\t\t\ts = soap_in_%s(soap, NULL, NULL, NULL);\n\t\t\treturn s ? *s : NULL;\n\t\t}", s, soap_type(p), c_ident(p)); else if (p->type != Tpointer) fprintf(fout, "\n\t\tif (!soap_match_tag(soap, t, \"%s\"))\n\t\t{\t*type = %s;\n\t\t\treturn soap_in_%s(soap, NULL, NULL, NULL);\n\t\t}", s, soap_type(p), c_ident(p)); } } } } } void in_defs3(void) { int i; Tnode *p; const char *s; for (i = 0; i < TYPES; i++) { for (p = Tptr[i]; p; p = p->next) { if (is_element(p) && !is_transient(p) && !is_template(p) && p->type != Twchar && p->type != Tfun && p->type != Treference && p->type != Trvalueref && p->type != Tunion && !is_XML(p) && !is_header_or_fault(p) && !is_body(p)) { s = xsi_type(p); if (!*s) s = wsdl_type(p, ""); if (*s == '-') continue; if (*s) { if (is_dynamic_array(p) && !is_binary(p) && !has_ns(p) && !is_untyped(p)) fprintf(fout, "\n\t\tif (*soap->arrayType && !soap_match_array(soap, \"%s\"))\n\t\t{\t*type = %s;\n\t\t\treturn soap_in_%s(soap, NULL, NULL, NULL);\n\t\t}", s, soap_type(p), c_ident(p)); else if (is_string(p)) fprintf(fout, "\n\t\tif (!soap_match_tag(soap, t, \"%s\"))\n\t\t{\tchar **s;\n\t\t\t*type = %s;\n\t\t\ts = soap_in_%s(soap, NULL, NULL, NULL);\n\t\t\treturn s ? *s : NULL;\n\t\t}", s, soap_type(p), c_ident(p)); else if (is_wstring(p)) fprintf(fout, "\n\t\tif (!soap_match_tag(soap, t, \"%s\"))\n\t\t{\twchar_t **s;\n\t\t\t*type = %s;\n\t\t\ts = soap_in_%s(soap, NULL, NULL, NULL);\n\t\t\treturn s ? *s : NULL;\n\t\t}", s, soap_type(p), c_ident(p)); else if (p->type != Tpointer) fprintf(fout, "\n\t\tif (!soap_match_tag(soap, t, \"%s\"))\n\t\t{\t*type = %s;\n\t\t\treturn soap_in_%s(soap, NULL, NULL, NULL);\n\t\t}", s, soap_type(p), c_ident(p)); } } } } } void out_defs(void) { int i; const char *s; Tnode *p; for (i = 0; i < TYPES; i++) { for (p = Tptr[i]; p; p = p->next) { if (is_transient(p) || is_template(p) || is_XML(p) || is_header_or_fault(p) || is_body(p)) continue; if (is_element(p)) { s = wsdl_type(p, ""); if (*s == '-') continue; if (p->type == Tarray) fprintf(fout, "\n\tcase %s:\n\t\treturn soap_out_%s(soap, \"%s\", id, (%s)ptr, NULL);", soap_type(p), c_ident(p), s, c_type_id((Tnode*)p->ref, "(*)")); else if (p->type == Tclass && !is_external(p) && !is_volatile(p) && !is_typedef(p)) fprintf(fout, "\n\tcase %s:\n\t\treturn ((%s)ptr)->soap_out(soap, \"%s\", id, NULL);", soap_type(p), c_type_id(p, "*"), s); else if (is_string(p)) fprintf(fout, "\n\tcase %s:\n\t\treturn soap_out_string(soap, \"%s\", id, (char*const*)(void*)&ptr, NULL);", soap_type(p), s); else if (is_wstring(p)) fprintf(fout, "\n\tcase %s:\n\t\treturn soap_out_wstring(soap, \"%s\", id, (wchar_t*const*)(void*)&ptr, NULL);", soap_type(p), s); else if (p->type == Tpointer) fprintf(fout, "\n\tcase %s:\n\t\treturn soap_out_%s(soap, \"%s\", id, (%s)ptr, NULL);", soap_type(p), c_ident(p), s, c_type_constptr_id(p, "const*")); else if (p->type != Tnone && p->type != Ttemplate && p->type != Twchar && !is_void(p) && p->type != Tfun && p->type != Treference && p->type != Trvalueref && p->type != Tunion) fprintf(fout, "\n\tcase %s:\n\t\treturn soap_out_%s(soap, \"%s\", id, (const %s)ptr, NULL);", soap_type(p), c_ident(p), s, c_type_id(p, "*")); } else { s = xsi_type(p); if (!*s) s = wsdl_type(p, ""); if (*s == '-') continue; if (p->type == Tarray) fprintf(fout, "\n\tcase %s:\n\t\treturn soap_out_%s(soap, tag, id, (%s)ptr, \"%s\");", soap_type(p), c_ident(p), c_type_id((Tnode*)p->ref, "(*)"), s); else if (p->type == Tclass && !is_external(p) && !is_volatile(p) && !is_typedef(p)) fprintf(fout, "\n\tcase %s:\n\t\treturn ((%s)ptr)->soap_out(soap, tag, id, \"%s\");", soap_type(p), c_type_id(p, "*"), s); else if (is_string(p)) fprintf(fout, "\n\tcase %s:\n\t\treturn soap_out_string(soap, tag, id, (char*const*)(void*)&ptr, \"%s\");", soap_type(p), s); else if (is_wstring(p)) fprintf(fout, "\n\tcase %s:\n\t\treturn soap_out_wstring(soap, tag, id, (wchar_t*const*)(void*)&ptr, \"%s\");", soap_type(p), s); else if (p->type == Tpointer) fprintf(fout, "\n\tcase %s:\n\t\treturn soap_out_%s(soap, tag, id, (%s)ptr, \"%s\");", soap_type(p), c_ident(p), c_type_constptr_id(p, "const*"), s); else if (p->type != Tnone && p->type != Ttemplate && p->type != Twchar && !is_void(p) && p->type != Tfun && p->type != Treference && p->type != Trvalueref && p->type != Tunion) fprintf(fout, "\n\tcase %s:\n\t\treturn soap_out_%s(soap, tag, id, (const %s)ptr, \"%s\");", soap_type(p), c_ident(p), c_type_id(p, "*"), s); } } } } void mark_defs() { int i; Tnode *p; for (i = 0; i < TYPES; i++) { for (p = Tptr[i]; p; p = p->next) { if (is_transient(p) || is_template(p) || is_XML(p) || is_header_or_fault(p) || is_body(p) || is_void(p)) continue; if (p->type == Tarray) continue; else if (p->type == Tclass && !is_external(p) && !is_volatile(p) && !is_typedef(p)) fprintf(fout, "\n\tcase %s:\n\t\t((%s)ptr)->soap_serialize(soap);\n\t\tbreak;", soap_type(p), c_type_id(p, "*")); else if (is_string(p)) fprintf(fout, "\n\tcase %s:\n\t\tsoap_serialize_string(soap, (char*const*)(void*)&ptr);\n\t\tbreak;", soap_type(p)); else if (is_wstring(p)) fprintf(fout, "\n\tcase %s:\n\t\tsoap_serialize_wstring(soap, (wchar_t*const*)(void*)&ptr);\n\t\tbreak;", soap_type(p)); else if (p->type == Tpointer) fprintf(fout, "\n\tcase %s:\n\t\tsoap_serialize_%s(soap, (%s)ptr);\n\t\tbreak;", soap_type(p), c_ident(p), c_type_constptr_id(p, "const*")); else if (p->type == Ttemplate && p->ref) fprintf(fout, "\n\tcase %s:\n\t\tsoap_serialize_%s(soap, (const %s)ptr);\n\t\tbreak;", soap_type(p), c_ident(p), c_type_id(p, "*")); else if (!is_primitive(p) && p->type != Tnone && p->type != Ttemplate && !is_void(p) && p->type != Tfun && p->type != Treference && p->type != Trvalueref && p->type != Tunion) fprintf(fout, "\n\tcase %s:\n\t\tsoap_serialize_%s(soap, (const %s)ptr);\n\t\tbreak;", soap_type(p), c_ident(p), c_type_id(p, "*")); } } } void dup_defs() { int i; Tnode *p; for (i = 0; i < TYPES; i++) { for (p = Tptr[i]; p; p = p->next) { if (is_transient(p) || is_template(p) || is_XML(p) || is_header_or_fault(p) || is_body(p) || is_void(p)) continue; if (p->type == Tarray) continue; else if (p->type == Tclass && !is_external(p) && !is_volatile(p) && !is_typedef(p)) fprintf(fout, "\n\tcase %s:\n\t\treturn (void*)((%s)ptr)->soap_dup(soap);", soap_type(p), c_type_id(p, "*")); else if (is_string(p)) fprintf(fout, "\n\tcase %s:\n\t\treturn (void*)soap_strdup(soap, (const char*)ptr);", soap_type(p)); else if (is_wstring(p)) fprintf(fout, "\n\tcase %s:\n\t\treturn (void*)soap_wstrdup(soap, (const wchar_t*)ptr);", soap_type(p)); else if (p->type == Tpointer) fprintf(fout, "\n\tcase %s:\n\t\treturn (void*)soap_dup_%s(soap, NULL, (%s)ptr);", soap_type(p), c_ident(p), c_type_constptr_id(p, "const*")); else if (p->type == Ttemplate && p->ref) fprintf(fout, "\n\tcase %s:\n\t\treturn (void*)soap_dup_%s(soap, NULL, (const %s)ptr);", soap_type(p), c_ident(p), c_type_id(p, "*")); else if (!is_primitive(p) && p->type != Tnone && p->type != Ttemplate && !is_void(p) && p->type != Tfun && p->type != Treference && p->type != Trvalueref && p->type != Tunion) fprintf(fout, "\n\tcase %s:\n\t\treturn (void*)soap_dup_%s(soap, NULL, (const %s)ptr);", soap_type(p), c_ident(p), c_type_id(p, "*")); else if (p->type != Tnone && p->type != Ttemplate && !is_void(p) && p->type != Tfun && p->type != Treference && p->type != Trvalueref && p->type != Tunion) fprintf(fout, "\n\tcase %s:\n\t\treturn soap_memdup(soap, ptr, sizeof(%s));", soap_type(p), c_type(p)); } } } void del_defs() { int i; Tnode *p; for (i = 0; i < TYPES; i++) { for (p = Tptr[i]; p; p = p->next) { if (is_transient(p) || is_template(p) || is_XML(p) || is_header_or_fault(p) || is_body(p) || is_void(p)) continue; if (p->type == Tarray) continue; else if (p->type == Tclass && !is_external(p) && !is_volatile(p) && !is_typedef(p)) fprintf(fout, "\n\tcase %s:\n\t\tstatic_cast(ptr)->soap_del();\n\t\tSOAP_DELETE(static_cast(ptr));\n\t\tbreak;", soap_type(p), c_type(p), c_type(p)); else if (is_string(p)) fprintf(fout, "\n\tcase %s:\n\t\tsoap_del_string((char*const*)(void*)&ptr);\n\t\tbreak;", soap_type(p)); else if (is_wstring(p)) fprintf(fout, "\n\tcase %s:\n\t\tsoap_del_wstring((wchar_t*const*)(void*)&ptr);\n\t\tbreak;", soap_type(p)); else if (p->type == Tpointer) fprintf(fout, "\n\tcase %s:\n\t\tsoap_del_%s((%s)ptr);\n\t\tSOAP_FREE(NULL, ptr);\n\t\tbreak;", soap_type(p), c_ident(p), c_type_constptr_id(p, "const*")); else if (p->type == Ttemplate && p->ref) fprintf(fout, "\n\tcase %s:\n\t\tsoap_del_%s((const %s)ptr);\n\t\tSOAP_DELETE(static_cast(ptr));\n\t\tbreak;", soap_type(p), c_ident(p), c_type_id(p, "*"), c_type(p)); else if (!is_primitive(p) && p->type != Tnone && p->type != Ttemplate && !is_void(p) && p->type != Tfun && p->type != Treference && p->type != Trvalueref && p->type != Tunion) { if (!cflag && p->type == Tstruct) fprintf(fout, "\n\tcase %s:\n\t\tsoap_del_%s((const %s)ptr);\n\t\tSOAP_DELETE(static_cast(ptr));\n\t\tbreak;", soap_type(p), c_ident(p), c_type_id(p, "*"), c_type(p)); else fprintf(fout, "\n\tcase %s:\n\t\tsoap_del_%s((const %s)ptr);\n\t\tSOAP_FREE(NULL, ptr);\n\t\tbreak;", soap_type(p), c_ident(p), c_type_id(p, "*")); } else if (p->type != Tnone && p->type != Ttemplate && !is_void(p) && p->type != Tfun && p->type != Treference && p->type != Trvalueref && p->type != Tunion) fprintf(fout, "\n\tcase %s:\n\t\tSOAP_FREE(NULL, (const %s)ptr);\n\t\tbreak;", soap_type(p), c_type_id(p, "*")); } } } void in_attach(void) { int i; Tnode *p; for (i = 0; i < TYPES; i++) { for (p = Tptr[i]; p; p = p->next) { if (is_attachment(p)) { if (p->type == Tclass) fprintf(fout, "\n\t\tcase %s:\n\t\t{\t%s a;\n\t\t\ta = (%s)soap_id_enter(soap, soap->dime.id, NULL, %s, sizeof(%s), NULL, NULL, %s_instantiate, %s_fbase);\n\t\t\tif (a)\n\t\t\t{\ta->__ptr = (unsigned char*)soap->dime.ptr;\n\t\t\t\ta->__size = soap->dime.size;\n\t\t\t\ta->id = (char*)soap->dime.id;\n\t\t\t\ta->type = (char*)soap->dime.type;\n\t\t\t\ta->options = (char*)soap->dime.options;\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn soap->error;\n\t\t\tbreak;\n\t\t}", soap_type(p), c_type_id(p, "*"), c_type_id(p, "*"), soap_type(p), c_type(p), prefix, prefix); else fprintf(fout, "\n\t\tcase %s:\n\t\t{\t%s a;\n\t\t\ta = (%s)soap_id_enter(soap, soap->dime.id, NULL, %s, sizeof(%s), NULL, NULL, NULL, NULL);\n\t\t\tif (!a)\n\t\t\t\treturn soap->error;\n\t\t\ta->__ptr = (unsigned char*)soap->dime.ptr;\n\t\t\ta->__size = soap->dime.size;\n\t\t\ta->id = (char*)soap->dime.id;\n\t\t\ta->type = (char*)soap->dime.type;\n\t\t\ta->options = (char*)soap->dime.options;\n\t\t\tbreak;\n\t\t}", soap_type(p), c_type_id(p, "*"), c_type_id(p, "*"), soap_type(p), c_type(p)); } else if (is_binary(p) && !is_transient(p)) { if (p->type == Tclass) fprintf(fout, "\n\t\tcase %s:\n\t\t{\t%s a;\n\t\t\ta = (%s)soap_id_enter(soap, soap->dime.id, NULL, %s, sizeof(%s), NULL, NULL, %s_instantiate, %s_fbase);\n\t\t\tif (!a)\n\t\t\t\treturn soap->error;\n\t\t\ta->__ptr = (unsigned char*)soap->dime.ptr;\n\t\t\ta->__size = soap->dime.size;\n\t\t\tbreak;\n\t\t}", soap_type(p), c_type_id(p, "*"), c_type_id(p, "*"), soap_type(p), c_type(p), prefix, prefix); else fprintf(fout, "\n\t\tcase %s:\n\t\t{\t%s a;\n\t\t\ta = (%s)soap_id_enter(soap, soap->dime.id, NULL, %s, sizeof(%s), NULL, NULL, NULL, NULL);\n\t\t\tif (!a)\n\t\t\t\treturn soap->error;\n\t\t\ta->__ptr = (unsigned char*)soap->dime.ptr;\n\t\t\ta->__size = soap->dime.size;\n\t\t\tbreak;\n\t\t}", soap_type(p), c_type_id(p, "*"), c_type_id(p, "*"), soap_type(p), c_type(p)); } } } } void soap_instantiate(Tnode *typ) { Table *Tptr; Entry *Eptr; int derclass = 0, flag = 0; const char *s; if (cflag) return; if (typ->type != Tstruct && typ->type != Tclass && typ->type != Ttemplate) return; if (typ->type != Tclass || !typ->sym || !is_eq(typ->sym->name, "xsd__QName") || is_imported(typ)) { if ((is_typedef(typ) && !is_external(typ)) || is_synonym(typ)) { fprintf(fhead, "\n\n#define soap_instantiate_%s soap_instantiate_%s\n", c_ident(typ), t_ident(typ)); fprintf(fhead, "\n\n#define soap_new_%s soap_new_%s\n", c_ident(typ), t_ident(typ)); if ((typ->type == Tclass || typ->type == Tstruct) && typ->ref) { fprintf(fhead, "\n\n#define soap_new_req_%s soap_new_req_%s\n", c_ident(typ), t_ident(typ)); fprintf(fhead, "\n\n#define soap_new_set_%s soap_new_set_%s\n", c_ident(typ), t_ident(typ)); } return; } } fprintf(fhead, "\nSOAP_FMAC1 %s * SOAP_FMAC2 soap_instantiate_%s(struct soap*, int, const char*, const char*, size_t*);", c_type(typ), c_ident(typ)); fprintf(fhead, "\n\ninline %s * soap_new_%s(struct soap *soap, int n = -1) { return soap_instantiate_%s(soap, n, NULL, NULL, NULL); }", c_type(typ), c_ident(typ), c_ident(typ)); if (typ->type == Tclass || typ->type == Tstruct) { fprintf(fhead, "\n\ninline %s * soap_new_req_%s(\n\tstruct soap *soap", c_type(typ), c_ident(typ)); if (!is_dynamic_array(typ)) { for (Tptr = (Table*)typ->ref, derclass = 0; Tptr; Tptr = Tptr->prev, derclass++) { for (Eptr = Tptr->list; Eptr; Eptr = Eptr->next) { if (is_repetition(Eptr) || is_anytype(Eptr)) flag = 2; if ((Eptr->info.minOccurs > 0 || flag) && !(Eptr->info.sto & (Sprivate | Sprotected | Sconst | Sstatic | Stypedef)) && Eptr->info.typ->type != Tfun && strcmp(Eptr->sym->name, "soap")) { if (flag) flag--; if (is_smart(Eptr->info.typ)) { if (is_smart_shared(Eptr->info.typ)) fprintf(fhead, ",\n\t%s %s", c_type_id(Eptr->info.typ, "&"), ident(Eptr->sym->name)); else fprintf(fhead, ",\n\t%s %s", c_type_id(Eptr->info.typ->ref, "*"), ident(Eptr->sym->name)); } else if (Eptr->info.typ->type == Ttemplate && is_smart(Eptr->info.typ->ref) && !is_smart_shared(Eptr->info.typ->ref)) continue; else if (Eptr->info.typ->type == Tclass || Eptr->info.typ->type == Tstruct || Eptr->info.typ->type == Tunion || Eptr->info.typ->type == Ttemplate) fprintf(fhead, ",\n\tconst %s& %s", c_type(Eptr->info.typ), ident(Eptr->sym->name)); else if ((Eptr->info.sto & Sconstptr)) fprintf(fhead, ",\n\tconst %s", c_type_id(Eptr->info.typ, Eptr->sym->name)); else if (Eptr->info.typ->type == Tarray) fprintf(fhead, ",\n\t%s const*%s", c_type(Eptr->info.typ->ref), ident(Eptr->sym->name)); else fprintf(fhead, ",\n\t%s", c_type_id(Eptr->info.typ, Eptr->sym->name)); if (derclass) fprintf(fhead, "%d", derclass); } } } } fprintf(fhead, ")\n{\t%s = soap_new_%s(soap);\n\tif (_p)\n\t{\t", c_type_id(typ, "*_p"), c_ident(typ)); if (!is_external(typ)) { if (typ->type == Tclass && !is_volatile(typ)) fprintf(fhead, "_p->soap_default(soap);"); else fprintf(fhead, "soap_default_%s(soap, _p);", c_ident(typ)); } flag = 0; if (!is_dynamic_array(typ)) { for (Tptr = (Table*)typ->ref, derclass = 0; Tptr; Tptr = Tptr->prev, derclass++) { for (Eptr = Tptr->list; Eptr; Eptr = Eptr->next) { if (is_repetition(Eptr) || is_anytype(Eptr)) flag = 2; if ((Eptr->info.minOccurs > 0 || flag) && !(Eptr->info.sto & (Sprivate | Sprotected | Sconst | Sstatic | Stypedef)) && Eptr->info.typ->type != Tfun && strcmp(Eptr->sym->name, "soap")) { if (flag) flag--; if (is_smart(Eptr->info.typ) && !is_smart_shared(Eptr->info.typ)) /* smart but not shared */ { if (typ->type == Tclass) fprintf(fhead, "\n\t\t_p->%s::%s = %s(%s", ident(Tptr->sym->name), ident(Eptr->sym->name), c_type(Eptr->info.typ), ident(Eptr->sym->name)); else fprintf(fhead, "\n\t\t_p->%s = %s(%s", ident(Eptr->sym->name), c_type(Eptr->info.typ), ident(Eptr->sym->name)); } else if (Eptr->info.typ->type == Tarray) { if (is_fixedstring(Eptr->info.typ)) fprintf(fhead, "\n\t\tsoap_strcpy(_p->%s::%s, %d, %s", ident(Tptr->sym->name), ident(Eptr->sym->name), get_dimension(Eptr->info.typ), ident(Eptr->sym->name)); else if (typ->type == Tclass) fprintf(fhead, "\n\t\tfor (int i = 0; i < %d; i++) _p->%s::%s[i] = %s", get_dimension(Eptr->info.typ), ident(Tptr->sym->name), ident(Eptr->sym->name), ident(Eptr->sym->name)); else fprintf(fhead, "\n\t\tfor (int i = 0; i < %d; i++) _p->%s[i] = %s", get_dimension(Eptr->info.typ), ident(Eptr->sym->name), ident(Eptr->sym->name)); } else if (Eptr->info.typ->type == Ttemplate && is_smart(Eptr->info.typ->ref) && !is_smart_shared(Eptr->info.typ->ref)) continue; else if (typ->type == Tclass) fprintf(fhead, "\n\t\t_p->%s::%s = %s", ident(Tptr->sym->name), ident(Eptr->sym->name), ident(Eptr->sym->name)); else fprintf(fhead, "\n\t\t_p->%s = %s", ident(Eptr->sym->name), ident(Eptr->sym->name)); if (derclass) fprintf(fhead, "%d", derclass); if (is_fixedstring(Eptr->info.typ)) fprintf(fhead, ");"); else if (Eptr->info.typ->type == Tarray) fprintf(fhead, "[i];"); else if (is_smart(Eptr->info.typ) && !is_smart_shared(Eptr->info.typ)) /* smart but not shared */ fprintf(fhead, ");"); else fprintf(fhead, ";"); } } } } fprintf(fhead, "\n\t}\n\treturn _p;\n}"); fprintf(fhead, "\n\ninline %s * soap_new_set_%s(\n\tstruct soap *soap", c_type(typ), c_ident(typ)); for (Tptr = (Table*)typ->ref, derclass = 0; Tptr; Tptr = Tptr->prev, derclass++) { for (Eptr = Tptr->list; Eptr; Eptr = Eptr->next) { if (!(Eptr->info.sto & (Sprivate | Sprotected | Sconst | Sstatic | Stypedef)) && Eptr->info.typ->type != Tfun && strcmp(Eptr->sym->name, "soap")) { if (is_smart(Eptr->info.typ)) { if (is_smart_shared(Eptr->info.typ)) fprintf(fhead, ",\n\t%s %s", c_type_id(Eptr->info.typ, "&"), ident(Eptr->sym->name)); else fprintf(fhead, ",\n\t%s %s", c_type_id(Eptr->info.typ->ref, "*"), ident(Eptr->sym->name)); } else if (Eptr->info.typ->type == Ttemplate && is_smart(Eptr->info.typ->ref) && !is_smart_shared(Eptr->info.typ->ref)) continue; else if (Eptr->info.typ->type == Tclass || Eptr->info.typ->type == Tstruct || Eptr->info.typ->type == Tunion || Eptr->info.typ->type == Ttemplate) fprintf(fhead, ",\n\tconst %s& %s", c_type(Eptr->info.typ), ident(Eptr->sym->name)); else if ((Eptr->info.sto & Sconstptr)) fprintf(fhead, ",\n\tconst %s", c_type_id(Eptr->info.typ, Eptr->sym->name)); else if (Eptr->info.typ->type == Tarray) fprintf(fhead, ",\n\t%s const*%s", c_type(Eptr->info.typ->ref), ident(Eptr->sym->name)); else fprintf(fhead, ",\n\t%s", c_type_id(Eptr->info.typ, Eptr->sym->name)); if (derclass) fprintf(fhead, "%d", derclass); } } } fprintf(fhead, ")\n{\t%s = soap_new_%s(soap);\n\tif (_p)\n\t{\t", c_type_id(typ, "*_p"), c_ident(typ)); if (!is_external(typ)) { if (typ->type == Tclass && !is_volatile(typ)) fprintf(fhead, "_p->soap_default(soap);"); else fprintf(fhead, "soap_default_%s(soap, _p);", c_ident(typ)); } for (Tptr = (Table*)typ->ref, derclass = 0; Tptr; Tptr = Tptr->prev, derclass++) { for (Eptr = Tptr->list; Eptr; Eptr = Eptr->next) { if (!(Eptr->info.sto & (Sprivate | Sprotected | Sconst | Sstatic | Stypedef)) && Eptr->info.typ->type != Tfun && strcmp(Eptr->sym->name, "soap")) { if (is_smart(Eptr->info.typ) && !is_smart_shared(Eptr->info.typ)) /* smart but not shared */ { if (typ->type == Tclass) fprintf(fhead, "\n\t\t_p->%s::%s = %s(%s", ident(Tptr->sym->name), ident(Eptr->sym->name), c_type(Eptr->info.typ), ident(Eptr->sym->name)); else fprintf(fhead, "\n\t\t_p->%s = %s(%s", ident(Eptr->sym->name), c_type(Eptr->info.typ), ident(Eptr->sym->name)); } else if (Eptr->info.typ->type == Tarray) { if (is_fixedstring(Eptr->info.typ)) fprintf(fhead, "\n\t\tsoap_strcpy(_p->%s::%s, %d, %s", ident(Tptr->sym->name), ident(Eptr->sym->name), get_dimension(Eptr->info.typ), ident(Eptr->sym->name)); else if (typ->type == Tclass) fprintf(fhead, "\n\t\tfor (int i = 0; i < %d; i++) _p->%s::%s[i] = %s", get_dimension(Eptr->info.typ), ident(Tptr->sym->name), ident(Eptr->sym->name), ident(Eptr->sym->name)); else fprintf(fhead, "\n\t\tfor (int i = 0; i < %d; i++) _p->%s[i] = %s", get_dimension(Eptr->info.typ), ident(Eptr->sym->name), ident(Eptr->sym->name)); } else if (Eptr->info.typ->type == Ttemplate && is_smart(Eptr->info.typ->ref) && !is_smart_shared(Eptr->info.typ->ref)) continue; else if (typ->type == Tclass) fprintf(fhead, "\n\t\t_p->%s::%s = %s", ident(Tptr->sym->name), ident(Eptr->sym->name), ident(Eptr->sym->name)); else fprintf(fhead, "\n\t\t_p->%s = %s", ident(Eptr->sym->name), ident(Eptr->sym->name)); if (derclass) fprintf(fhead, "%d", derclass); if (is_fixedstring(Eptr->info.typ)) fprintf(fhead, ");"); else if (Eptr->info.typ->type == Tarray) fprintf(fhead, "[i];"); else if (is_smart(Eptr->info.typ) && !is_smart_shared(Eptr->info.typ)) /* smart but not shared */ fprintf(fhead, ");"); else fprintf(fhead, ";"); } } } fprintf(fhead, "\n\t}\n\treturn _p;\n}"); } /* deprecated fprintf(fhead, "\n\ninline void soap_delete_%s(struct soap *soap, %s) { soap_delete(soap, p); }", c_ident(typ), c_type_id(typ, "*p")); */ fprintf(fout, "\n\nSOAP_FMAC1 %s * SOAP_FMAC2 soap_instantiate_%s(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size)", c_type(typ), c_ident(typ)); fprintf(fout, "\n{"); fprintf(fout, "\n\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"soap_instantiate_%s(%%p, %%d, %%s, %%s)\\n\", soap, n, type?type:\"\", arrayType?arrayType:\"\"));", c_ident(typ)); fprintf(fout, "\n\t(void)type; (void)arrayType; /* appease -Wall -Werror */"); for (Eptr = classtable->list; Eptr; Eptr = Eptr->next) { Tptr = ((Table *) Eptr->info.typ->ref); if (Tptr == ((Table *) typ->ref)) { continue; } derclass = 0; while (Tptr) { if (Tptr == (Table*)typ->ref) { derclass = 1; } Tptr = Tptr->prev; } if (derclass == 1 && !is_transient(Eptr->info.typ)) { if (is_dynamic_array(Eptr->info.typ) && !is_binary(Eptr->info.typ) && !has_ns(Eptr->info.typ) && !is_untyped(Eptr->info.typ)) fprintf(fout, "\n\tif (soap && arrayType && !soap_match_tag(soap, arrayType, \"%s\"))", xsi_type(Eptr->info.typ)); else fprintf(fout, "\n\tif (soap && type && !soap_match_tag(soap, type, \"%s\"))", the_type(Eptr->info.typ)); fprintf(fout, "\n\t\treturn soap_instantiate_%s(soap, n, NULL, NULL, size);", c_ident(Eptr->info.typ)); derclass = 0; } } fprintf(fout, "\n\t%s;\n\tsize_t k = sizeof(%s);", c_type_id(typ, "*p"), c_type(typ)); fprintf(fout, "\n\tif (n < 0)"); fprintf(fout, "\n\t{\tp = SOAP_NEW(%s);", c_type(typ)); if ((s = has_soapref(typ))) fprintf(fout, "\n\t\tif (p)\n\t\t\t((%s*)p)->%s = soap;", c_type(typ), s); fprintf(fout, "\n\t}\n\telse"); fprintf(fout, "\n\t{\tp = SOAP_NEW_ARRAY(%s, n);", c_type(typ)); fprintf(fout, "\n\t\tk *= n;"); if (s) fprintf(fout, "\n\t\tif (p)\n\t\t\tfor (int i = 0; i < n; i++)\n\t\t\t\t((%s*)p)[i].%s = soap;", c_type(typ), s); fprintf(fout, "\n\t}"); fprintf(fout, "\n\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"Instantiated %s location=%%p n=%%d\\n\", p, n));", c_type(typ)); fprintf(fout, "\n\tsoap_link(soap, p, %s, n, %s_fdelete);", soap_type(typ), prefix); fprintf(fout, "\n\tif (size)\n\t\t*size = k;"); fprintf(fout, "\n\treturn p;"); fprintf(fout, "\n}"); } void soap_dup(Tnode *typ) { if (!Ecflag) return; if (typ->type != Tstruct && typ->type != Tclass && typ->type != Ttemplate && typ->type != Tpointer) return; if (typ->type != Tclass || !(typ->sym && (is_stdstring(typ) || is_stdwstring(typ)) && is_eq(typ->sym->name, "xsd__QName")) || is_imported(typ)) { if ((is_typedef(typ) && !is_external(typ)) || is_synonym(typ)) { fprintf(fhead, "\n\n#define soap_dup_%s soap_dup_%s\n", c_ident(typ), t_ident(typ)); return; } } if (typ->type == Tstruct && (is_anyType(typ) || is_anyAttribute(typ))) return; fprintf(fhead, "\n\nSOAP_FMAC3 %s * SOAP_FMAC4 soap_dup_%s(struct soap*, %s*, %s);", c_type(typ), c_ident(typ), c_type(typ), c_type_constptr_id(typ, "const*")); fprintf(fout, "\n\nSOAP_FMAC3 %s * SOAP_FMAC4 soap_dup_%s(struct soap *soap, %s *d, %s)\n{", c_type(typ), c_ident(typ), c_type(typ), c_type_constptr_id(typ, "const*a")); if (typ->type == Tclass || typ->type == Tstruct) { fprintf(fout, "\n\tstruct soap_plist *pp = NULL;"); if (typ->recursive) fprintf(fout, "\n\tchar *mark = NULL;"); } fprintf(fout, "\n\tif (!a)\n\t\treturn NULL;"); if (typ->type == Tclass || typ->type == Tstruct) { if (typ->recursive) fprintf(fout, "\n\tif (!d && ((d = (%s*)soap_mark_lookup(soap, (const void*)a, %s, &pp, &mark)) || soap_mark_cycle(soap, pp)))\n\t\treturn d;", c_type(typ), soap_type(typ)); else fprintf(fout, "\n\tif (!d && (d = (%s*)soap_mark_lookup(soap, (const void*)a, %s, &pp, NULL)))\n\t\treturn d;", c_type(typ), soap_type(typ)); } if (cflag) fprintf(fout, "\n\tif (!d && !(d = (%s*)soap_malloc(soap, sizeof(%s))))\n\t\treturn NULL; /* ERROR */", c_type(typ), c_type(typ)); else if (typ->type == Tpointer) fprintf(fout, "\n\tif (!d && !(d = (%s*)soap_malloc(soap, sizeof(%s))))\n\t\treturn NULL; /* ERROR */", c_type(typ), c_type(typ)); else fprintf(fout, "\n\tif (!d && !(d = soap_new_%s(soap)))\n\t\treturn NULL; /* ERROR */", c_ident(typ)); if (typ->type == Tclass || typ->type == Tstruct) fprintf(fout, "\n\tsoap_mark_dup(soap, (void*)d, pp);"); fflush(fout); if (is_string(typ)) { fprintf(fout, "\n\t*d = NULL;\n\tif (*a)\n\t{\tstruct soap_plist *pp = NULL;\n\t\tif (!(*d = (%s)soap_mark_lookup(soap, (const void*)*a, %s, &pp, NULL)))", c_type(typ), soap_type(typ)); fprintf(fout, "\n\t\t\tsoap_mark_dup(soap, *d = soap_strdup(soap, *a), pp);\n\t}\n\telse\n\t\t*d = NULL;"); } else if (is_wstring(typ)) { fprintf(fout, "\n\tif (*a)\n\t{\tstruct soap_plist *pp = NULL;\n\t\tif (!(*d = (%s)soap_mark_lookup(soap, (const void*)*a, %s, &pp, NULL)))", c_type(typ), soap_type(typ)); fprintf(fout, "\n\t\t\tsoap_mark_dup(soap, *d = soap_wstrdup(soap, *a), pp);\n\t}\n\telse\n\t\t*d = NULL;"); } else if (typ->type == Tpointer) { Tnode *ref = typ->ref; if (ref->type == Tclass && !is_external(ref) && !is_volatile(ref) && !is_typedef(ref)) { fprintf(fout, "\n\tif (*a)\n\t\t*d = (*a)->soap_dup(soap);\n\telse\n\t\t*d = NULL;"); } else if (is_XML(ref) && is_string(ref)) { if (cflag) fprintf(fout, "\n\tif (*a && (*d = (%s)soap_malloc(soap, sizeof(%s))))\n\t\t**d = soap_strdup(soap, **a);\n\telse\n\t\t*d = NULL;", c_type(typ), c_type(ref)); else fprintf(fout, "\n\tif (*a && (*d = (%s)soap_malloc(soap, sizeof(%s))))\n\t\t**d = soap_strdup(soap, **a);\n\telse\n\t\t*d = NULL;", c_type(typ), c_type(ref)); } else if (is_XML(ref) && is_wstring(ref)) { if (cflag) fprintf(fout, "\n\tif (*a && (*d = (%s)soap_malloc(soap, sizeof(%s))))\n\t\t**d = soap_wstrdup(soap, **a);\n\telse\n\t\t*d = NULL;", c_type(typ), c_type(ref)); else fprintf(fout, "\n\tif (*a && (*d = (%s)soap_malloc(soap, sizeof(%s))))\n\t\t**d = soap_wstrdup(soap, **a);\n\telse\n\t\t*d = NULL;", c_type(typ), c_type(ref)); } else if (is_primitive(ref) || is_external(typ) || is_volatile(ref) || is_transient(ref)) { if (cflag) fprintf(fout, "\n\tif (*a && (*d = (%s)soap_malloc(soap, sizeof(%s))))\n\t\t**d = **a;\n\telse\n\t\t*d = NULL;", c_type(typ), c_type(ref)); else if (is_primitive(ref)) fprintf(fout, "\n\tif (*a && (*d = (%s)soap_malloc(soap, sizeof(%s))))\n\t\t**d = **a;\n\telse\n\t\t*d = NULL;", c_type(typ), c_type(ref)); else fprintf(fout, "\n\tif (*a && (*d = soap_new_%s(soap)))\n\t\t**d = **a;\n\telse\n\t\t*d = NULL;", c_ident(ref)); if (!is_primitive(ref) && is_transient(ref)) fprintf(fout, " /* transient (shallow copy) */"); } else if (ref->type == Tclass || ref->type == Tstruct || ref->type == Ttemplate || ref->type == Tpointer) { fprintf(fout, "\n\tif (*a)\n\t\t*d = soap_dup_%s(soap, NULL, *a);\n\telse\n\t\t*d = NULL;", c_ident(ref)); } } else if (is_smart(typ)) { Tnode *ref = typ->ref; if (is_smart_shared(typ)) { fprintf(fout, "\n\tif (*a)\n\t{\tstruct soap_plist *pp = NULL;\n\t\tchar *mark = NULL;\n\t\t%s *sp = (%s*)soap_mark_lookup(soap, (const void*)a->get(), %s, &pp, &mark);\n\t\tif (sp)\n\t\t\t*d = *sp;\n\t\telse if (soap_mark_cycle(soap, pp))\n\t\t\treturn d;\n\t\telse\n\t\t{\t", c_type(typ), c_type(typ), soap_type(typ)); if (ref->type == Tclass && !is_external(ref) && !is_volatile(ref) && !is_typedef(ref) && !is_transient(ref)) fprintf(fout, "*d = %s((*a)->soap_alloc());\n\t\t\tsoap_mark_dup(soap, (void*)d, pp);\n\t\t\t(*a)->soap_dup(soap, (void*)d->get());", c_type(typ)); else if (is_primitive(ref) || is_external(ref) || is_volatile(ref) || is_transient(ref)) fprintf(fout, "*d = %s<%s>(**a);", make_shared(typ), c_type(ref)); else if (ref->type == Tclass || ref->type == Tstruct || ref->type == Ttemplate || ref->type == Tpointer) fprintf(fout, "*d = %s<%s>();\n\t\t\tsoap_mark_dup(soap, (void*)d, pp);\n\t\t\tsoap_dup_%s(soap, d->get(), a->get());", make_shared(typ), c_type(ref), c_ident(ref)); fprintf(fout, "\n\t\t\tsoap_unmark(soap, mark);\n\t\t}\n\t}"); } else { if (ref->type == Tclass && !is_external(ref) && !is_volatile(ref) && !is_typedef(ref) && !is_transient(ref)) fprintf(fout, "\n\tif (*a)\n\t\t*d = %s((*a)->soap_dup(soap, (void*)(*a)->soap_alloc()));", c_type(typ)); else if (is_primitive(ref) || is_transient(ref)) fprintf(fout, "\n\tif (*a && (*d = %s(SOAP_NEW(%s))))\n\t\t**d = **a;", c_type(typ), c_type(ref)); else if (ref->type == Tclass || ref->type == Tstruct || ref->type == Ttemplate || ref->type == Tpointer) fprintf(fout, "\n\tif (*a)\n\t\t*d = %s(soap_dup_%s(soap, SOAP_NEW(%s), a->get()));", c_type(typ), c_ident(ref), c_type(ref)); } } else if (typ->type == Ttemplate) { Tnode *ref = typ->ref; if (strcmp(typ->id->name, "std::set") || is_primitive(ref) || is_external(ref) || is_volatile(ref) || is_transient(ref)) fprintf(fout, "\n\t*d = *a;"); if (!is_primitive(ref) && !is_external(ref) && !is_volatile(ref) && !is_transient(ref)) { if (!strcmp(typ->id->name, "std::set")) { fprintf(fout, "\n\t%s v;\n\tfor (%s::const_iterator i = a->begin(); i != a->end(); ++i)\n\t{\t", c_type(ref), c_type(typ)); if (is_XML(ref) && is_string(ref)) fprintf(fout, "v = soap_strdup(soap, *i);\n\t\td->insert(v);"); else if (is_XML(ref) && is_wstring(ref)) fprintf(fout, "v = soap_wstrdup(soap, *i);\n\t\td->insert(v);"); else if (ref->type == Tclass || ref->type == Tstruct || ref->type == Ttemplate || ref->type == Tpointer) fprintf(fout, "soap_dup_%s(soap, &v, &*i);\n\t\td->insert(v);", c_ident(ref)); else fprintf(fout, "\n\t\td->insert(*i);"); } else { fprintf(fout, "\n\t%s::iterator j = d->begin();\n\tfor (%s::const_iterator i = a->begin(); i != a->end(); ++i, ++j)\n\t{\t", c_type(typ), c_type(typ)); if (is_XML(ref) && is_string(ref)) fprintf(fout, "*j = soap_strdup(soap, *i);"); else if (is_XML(ref) && is_wstring(ref)) fprintf(fout, "*j = soap_wstrdup(soap, *i);"); else if (ref->type == Tclass || ref->type == Tstruct || ref->type == Ttemplate || ref->type == Tpointer) fprintf(fout, "soap_dup_%s(soap, &*j, &*i);", c_ident(ref)); } fprintf(fout, "\n\t}"); } } else if (typ->ref) { Entry *p = is_dynamic_array(typ); if (p) { if (is_binary(typ)) { if (cflag) fprintf(fout, "\n\td->__ptr = NULL;\n\td->__size = a->__size;\n\tif (a->__ptr && a->__size > 0)\n\t{\td->__ptr = (unsigned char*)soap_malloc(soap, a->__size);\n\t\tsoap_memcpy(d->__ptr, d->__size, a->__ptr, a->__size);\n\t}"); else fprintf(fout, "\n\td->__ptr = NULL;\n\td->__size = a->__size;\n\tif (a->__ptr && a->__size > 0)\n\t{\td->__ptr = (unsigned char*)soap_malloc(soap, a->__size);\n\t\tsoap_memcpy(d->__ptr, d->__size, a->__ptr, a->__size);\n\t}"); if (is_attachment(typ)) fprintf(fout, "\n\td->id = soap_strdup(soap, a->id);\n\td->type = soap_strdup(soap, a->type);\n\td->options = soap_strdup(soap, a->options); /* WARNING: cannot copy binary DIME attachment options correctly, MIME/MTOM is OK */"); } else { Tnode *ref = p->info.typ->ref; int dim = get_Darraydims(typ); const char *d = ident(p->sym->name); fprintf(fout, "\n\tif (a->%s)\n\t{", d); if (dim) fprintf(fout, "\tsize_t i, n = soap_size(a->__size, %d);", dim); else fprintf(fout, "\tint i, n = a->__size;"); if (cflag) fprintf(fout, "\n\t\td->%s = (%s)soap_malloc(soap, n * sizeof(%s));", d, c_type(p->info.typ), c_type(ref)); else if (is_primitive(ref) || ref->type == Tpointer) fprintf(fout, "\n\t\td->%s = (%s)soap_malloc(soap, n * sizeof(%s));", d, c_type(p->info.typ), c_type(ref)); else fprintf(fout, "\n\t\td->%s = soap_new_%s(soap, n);", d, c_ident(ref)); fprintf(fout, "\n\t\tfor (i = 0; i < n; i++)"); if (is_XML(ref) && is_string(ref)) fprintf(fout, "\n\t\t\td->%s[i] = soap_strdup(soap, a->%s[i]);", d, d); else if (is_XML(ref) && is_wstring(ref)) fprintf(fout, "\n\t\t\td->%s[i] = soap_wstrdup(soap, a->%s[i]);", d, d); else if (is_primitive(ref) || is_transient(ref)) fprintf(fout, "\n\t\t\td->%s[i] = a->%s[i];", d, d); else if (ref->type == Tclass || ref->type == Tstruct || ref->type == Ttemplate || ref->type == Tpointer) fprintf(fout, "\n\t\t\tsoap_dup_%s(soap, &d->%s[i], &a->%s[i]);", c_ident(ref), d, d); fprintf(fout, "\n\t}\n\telse\n\t\td->%s = NULL;", d); if (dim) fprintf(fout, "\n\tsoap_memcpy(&d->__size, sizeof(d->__size), &a->__size, sizeof(a->__size));"); else fprintf(fout, "\n\td->__size = a->__size;"); if (has_offset(typ)) { if (dim) fprintf(fout, "\n\tsoap_memcpy(&d->__offset, sizeof(d->__offset), &a->__offset, sizeof(a->__offset));"); else fprintf(fout, "\n\td->__offset = a->__offset;"); } } } else { Table *t = (Table*)typ->ref; const char *b = ""; const char *c = ""; if (typ->type == Tclass) { b = ident(t->sym->name); c = "::"; } if (t->prev) fprintf(fout, "\n\tsoap_dup_%s(soap, d, a);", ident(t->prev->sym->name)); for (p = ((Table*)typ->ref)->list; p; p = p->next) { const char *d = ident(p->sym->name); if (p->info.typ->type == Tfun || p->info.typ->type == Tunion) { continue; } else if (p->info.sto & Sconst) { fprintf(fout, "\n\t/* const %s skipped */", d); } else if (p->info.sto & Sstatic) { fprintf(fout, "\n\t/* static %s skipped */", d); } else if (p->info.sto & Stypedef) { fprintf(fout, "\n\t/* typedef %s skipped */", d); } else if (is_repetition(p)) { Tnode *ref = p->next->info.typ->ref; const char *e = ident(p->next->sym->name); fprintf(fout, "\n\td->%s%s%s = a->%s%s%s;\n\tif (a->%s%s%s > 0 && a->%s%s%s)", b, c, d, b, c, d, b, c, d, b, c, e); if (cflag) { if (ref->type == Tpointer && (p->next->info.sto & Sconstptr)) fprintf(fout, "\n\t{\tint i;\n\t\td->%s%s%s = (const %s)soap_malloc(soap, a->%s%s%s * sizeof(%s));", b, c, e, c_type(p->next->info.typ), b, c, d, c_type(ref)); else fprintf(fout, "\n\t{\tint i;\n\t\td->%s%s%s = (%s)soap_malloc(soap, a->%s%s%s * sizeof(%s));", b, c, e, c_type(p->next->info.typ), b, c, d, c_type(ref)); } else if (is_primitive(ref) || ref->type == Tpointer) { if (ref->type == Tpointer && (p->next->info.sto & Sconstptr)) fprintf(fout, "\n\t{\tint i;\n\t\td->%s%s%s = (const %s)soap_malloc(soap, a->%s%s%s * sizeof(%s));", b, c, e, c_type(p->next->info.typ), b, c, d, c_type(ref)); else fprintf(fout, "\n\t{\tint i;\n\t\td->%s%s%s = (%s)soap_malloc(soap, a->%s%s%s * sizeof(%s));", b, c, e, c_type(p->next->info.typ), b, c, d, c_type(ref)); } else { fprintf(fout, "\n\t{\tint i;\n\t\td->%s%s%s = soap_new_%s(soap, a->%s%s%s);", b, c, e, c_ident(ref), b, c, d); } fprintf(fout, "\n\t\tfor (i = 0; i < (int)a->%s%s%s; i++)", b, c, d); if (is_XML(ref) && is_string(ref)) fprintf(fout, "\n\t\t\td->%s%s%s[i] = soap_strdup(soap, a->%s%s%s[i]);", b, c, e, b, c, e); else if (is_XML(ref) && is_wstring(ref)) fprintf(fout, "\n\t\t\td->%s%s%s[i] = soap_wstrdup(soap, a->%s%s%s[i]);", b, c, e, b, c, e); else if (is_primitive(ref)) fprintf(fout, "\n\t\t\td->%s%s%s[i] = a->%s%s%s[i];", b, c, e, b, c, e); else if (ref->type == Tpointer && (p->next->info.sto & Sconstptr)) fprintf(fout, "\n\t\t\tsoap_dup_%s(soap, (%s)&d->%s%s%s[i], (%s)&a->%s%s%s[i]);", c_ident(ref), c_type_id(ref, "*"), b, c, e, c_type_id(ref, "const*"), b, c, e); else if (ref->type == Tclass || ref->type == Tstruct || ref->type == Ttemplate || ref->type == Tpointer) fprintf(fout, "\n\t\t\tsoap_dup_%s(soap, &d->%s%s%s[i], &a->%s%s%s[i]);", c_ident(ref), b, c, e, b, c, e); fprintf(fout, "\n\t}\n\telse\n\t\td->%s%s%s = NULL;", b, c, e); p = p->next; } else if (is_anytype(p)) { fprintf(fout, "\n\td->%s%s%s = a->%s%s%s ? soap_dupelement(soap, a->%s%s%s, d->%s%s%s = a->%s%s%s) : NULL;", b, c, ident(p->next->sym->name), b, c, ident(p->next->sym->name), b, c, ident(p->next->sym->name), b, c, d, b, c, d); p = p->next; } else if (is_choice(p)) { Entry *q; const char *e = ident(p->next->sym->name); fprintf(fout, "\n\td->%s%s%s = a->%s%s%s;", b, c, d, b, c, d); fprintf(fout, "\n\tswitch (a->%s%s%s)\n\t{", b, c, d); t = (Table*)p->next->info.typ->ref; if (t) { for (q = t->list; q; q = q->next) { const char *f = ident(q->sym->name); fprintf(fout, "\n\t\tcase %s:", soap_union_member(p->next->info.typ, q)); if (is_XML(q->info.typ) && is_string(q->info.typ)) fprintf(fout, "\n\t\t\td->%s%s%s.%s = soap_strdup(soap, a->%s%s%s.%s);", b, c, e, f, b, c, e, f); else if (is_XML(q->info.typ) && is_wstring(q->info.typ)) fprintf(fout, "\n\t\t\td->%s%s%s.%s = soap_wstrdup(soap, a->%s%s%s.%s);", b, c, e, f, b, c, e, f); else if (is_primitive(q->info.typ)) fprintf(fout, "\n\t\t\td->%s%s%s.%s = a->%s%s%s.%s;", b, c, e, f, b, c, e, f); else if (is_transient(q->info.typ)) fprintf(fout, "\n\t\t\td->%s%s%s.%s = a->%s%s%s.%s; /* transient (shallow copy) */", b, c, e, f, b, c, e, f); else if (q->info.typ->type == Tclass || q->info.typ->type == Tstruct || q->info.typ->type == Ttemplate || q->info.typ->type == Tpointer) fprintf(fout, "\n\t\t\tsoap_dup_%s(soap, &d->%s%s%s.%s, &a->%s%s%s.%s);", c_ident(q->info.typ), b, c, e, f, b, c, e, f); fprintf(fout, "\n\t\t\tbreak;"); } } fprintf(fout, "\n\t}"); p = p->next; } else if (is_XML(p->info.typ) && is_string(p->info.typ)) { fprintf(fout, "\n\td->%s%s%s = soap_strdup(soap, (char*)a->%s%s%s);", b, c, d, b, c, d); } else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) { fprintf(fout, "\n\td->%s%s%s = soap_wstrdup(soap, (char*)a->%s%s%s);", b, c, d, b, c, d); } else if (is_soapref(p->info.typ)) { fprintf(fout, "\n\td->%s%s%s = soap;", b, c, d); } else if (is_primitive(p->info.typ)) { fprintf(fout, "\n\td->%s%s%s = a->%s%s%s;", b, c, d, b, c, d); } else if (is_transient(p->info.typ)) { fprintf(fout, "\n\td->%s%s%s = a->%s%s%s; /* transient (shallow copy) */", b, c, d, b, c, d); } else if (p->info.typ->type == Tarray) { Tnode *ref = p->info.typ->ref; fprintf(fout, "\n\t{\tint i;\n\t\tfor (i = 0; i < %d; i++)", get_dimension(p->info.typ)); if (is_XML(ref) && is_string(ref)) fprintf(fout, "\n\t\t\td->%s%s%s[i] = soap_strdup(soap, a->%s%s%s[i]);", b, c, d, b, c, d); else if (is_XML(ref) && is_wstring(ref)) fprintf(fout, "\n\t\t\td->%s%s%s[i] = soap_wstrdup(soap, a->%s%s%s[i]);", b, c, d, b, c, d); else if (is_primitive(ref)) fprintf(fout, "\n\t\t\td->%s%s%s[i] = a->%s%s%s[i];", b, c, d, b, c, d); else if (is_transient(ref)) fprintf(fout, "\n\t\t\td->%s%s%s[i] = a->%s%s%s[i]; /* transient (shallow copy) */", b, c, d, b, c, d); else if (ref->type == Tclass || ref->type == Tstruct || ref->type == Ttemplate || ref->type == Tpointer) fprintf(fout, "\n\t\t\tsoap_dup_%s(soap, &d->%s%s%s[i], &a->%s%s%s[i]);", c_ident(ref), b, c, d, b, c, d); fprintf(fout, "\n\t}"); } else if (p->info.typ->type == Tpointer && (p->info.sto & Sconstptr)) { fprintf(fout, "\n\tsoap_dup_%s(soap, (%s)&d->%s%s%s, (%s)&a->%s%s%s);", c_ident(p->info.typ), c_type_id(p->info.typ, "*"), b, c, d, c_type_id(p->info.typ, "const*"), b, c, d); } else if (p->info.typ->type == Tclass || p->info.typ->type == Tstruct || p->info.typ->type == Ttemplate || p->info.typ->type == Tpointer) { fprintf(fout, "\n\tsoap_dup_%s(soap, &d->%s%s%s, &a->%s%s%s);", c_ident(p->info.typ), b, c, d, b, c, d); } else { fprintf(fout, "\n\t/* %s skipped */", d); } } } } else { fprintf(fout, "\n\t*d = *a;"); } if ((typ->type == Tclass || typ->type == Tstruct) && typ->recursive) fprintf(fout, "\n\tsoap_unmark(soap, mark);"); fprintf(fout, "\n\treturn d;\n}"); fflush(fout); } void soap_del(Tnode *typ) { if (!Edflag) return; if (typ->type != Tstruct && typ->type != Tclass && typ->type != Ttemplate && typ->type != Tpointer) return; if (typ->type != Tclass || !(typ->sym && (is_stdstring(typ) || is_stdwstring(typ)) && is_eq(typ->sym->name, "xsd__QName")) || is_imported(typ)) { if ((is_typedef(typ) && !is_external(typ)) || is_synonym(typ)) { fprintf(fhead, "\n\n#define soap_del_%s soap_del_%s\n", c_ident(typ), t_ident(typ)); return; } } if (typ->type == Tstruct && (is_anyType(typ) || is_anyAttribute(typ))) return; fprintf(fhead, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_del_%s(%s);", c_ident(typ), c_type_constptr_id(typ, "const*")); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_del_%s(%s)\n{", c_ident(typ), c_type_constptr_id(typ, "const*a")); fprintf(fout, "\n\tif (!a)\n\t\treturn;"); fflush(fout); if (is_string(typ) || is_wstring(typ)) { if (cflag) fprintf(fout, "\n\tif (*a)\n\t\tSOAP_FREE(NULL, *a);"); else fprintf(fout, "\n\tif (*a)\n\t\tSOAP_FREE(NULL, *a);"); } else if (typ->type == Tpointer) { Tnode *ref = typ->ref; if (ref->type == Tclass && !is_external(ref) && !is_volatile(ref) && !is_typedef(ref)) fprintf(fout, "\n\tif (*a)\n\t{\t(*a)->soap_del();\n\t\tSOAP_DELETE(*a);\n\t}"); else if (is_XML(ref)) { if (cflag) fprintf(fout, "\n\tif (*a)\n\t{\tif (**a)\n\t\t\tSOAP_FREE(NULL, **a);\n\t\tSOAP_FREE(NULL, *a);\n\t}"); else fprintf(fout, "\n\tif (*a)\n\t{\tif (**a)\n\t\t\tSOAP_FREE(NULL, **a);\n\t\tSOAP_FREE(NULL, *a);\n\t}"); } else if (is_primitive(ref) || is_external(typ) || is_volatile(ref) || is_transient(ref)) { if (cflag) fprintf(fout, "\n\tif (*a)\n\t\tSOAP_FREE(NULL, *a);"); else if (is_primitive(ref)) fprintf(fout, "\n\tif (*a)\n\t\tSOAP_FREE(NULL, *a);"); else fprintf(fout, "\n\tif (*a)\n\t\tSOAP_DELETE(*a);"); } else if (cflag) fprintf(fout, "\n\tif (*a)\n\t{\tsoap_del_%s(*a);\n\t\tSOAP_FREE(NULL, *a);\n\t}", c_ident(ref)); else if (ref->type == Tpointer) fprintf(fout, "\n\tif (*a)\n\t{\tsoap_del_%s(*a);\n\t\tSOAP_FREE(NULL, *a);\n\t}", c_ident(ref)); else if (ref->type == Tclass || ref->type == Tstruct || ref->type == Ttemplate) fprintf(fout, "\n\tif (*a)\n\t{\tsoap_del_%s(*a);\n\t\tSOAP_DELETE(*a);\n\t}", c_ident(ref)); } else if (is_smart(typ)) { Tnode *ref = typ->ref; if (is_smart_shared(typ)) { if (ref->type == Tclass && !is_external(ref) && !is_volatile(ref) && !is_typedef(ref) && !is_transient(ref)) fprintf(fout, "\n\tif (*a)\n\t\t(*a)->soap_del();"); else if (is_primitive(ref) || is_transient(ref)) ; else if (ref->type == Tclass || ref->type == Tstruct || ref->type == Ttemplate || ref->type == Tpointer) fprintf(fout, "\n\tif (*a)\n\t\tsoap_del_%s(a->get());", c_ident(ref)); } else { if (ref->type == Tclass && !is_external(ref) && !is_volatile(ref) && !is_typedef(ref) && !is_transient(ref)) fprintf(fout, "\n\tif (*a)\n\t\t(*a)->soap_del();"); else if (is_primitive(ref) || is_transient(ref)) ; else if (ref->type == Tclass || ref->type == Tstruct || ref->type == Ttemplate || ref->type == Tpointer) fprintf(fout, "\n\tif (*a)\n\t\tsoap_del_%s(a->get());", c_ident(ref)); } } else if (typ->type == Ttemplate) { Tnode *ref = typ->ref; if (!is_primitive(ref) && !is_external(typ) && !is_volatile(ref) && !is_transient(ref)) { fprintf(fout, "\n\tfor (%s::const_iterator i = a->begin(); i != a->end(); ++i)", c_type(typ)); if (is_XML(ref)) fprintf(fout, "\n\t\tSOAP_FREE(NULL, *i);"); else if (ref->type == Tclass || ref->type == Tstruct || ref->type == Ttemplate || ref->type == Tpointer) fprintf(fout, "\n\t\tsoap_del_%s(&*i);", c_ident(ref)); else fprintf(fout, "\n\t\t; /* skipped */"); } } else if (typ->ref) { Entry *p = is_dynamic_array(typ); if (p) { if (is_binary(typ)) { if (cflag) fprintf(fout, "\n\tif (a->__ptr)\n\t\tSOAP_FREE(NULL, a->__ptr);"); else fprintf(fout, "\n\tif (a->__ptr)\n\t\tSOAP_FREE(NULL, a->__ptr);"); if (is_attachment(typ)) { if (cflag) fprintf(fout, "\n\tif (a->id)\n\t\tSOAP_FREE(NULL, a->id);\n\tif (a->type)\n\t\tSOAP_FREE(NULL, a->type);\n\tif (a->options)\n\t\tSOAP_FREE(NULL, a->options);"); else fprintf(fout, "\n\tif (a->id)\n\t\tSOAP_FREE(NULL, a->id);\n\tif (a->type)\n\t\tSOAP_FREE(NULL, a->type);\n\tif (a->options)\n\t\tSOAP_FREE(NULL, a->options);"); } } else { Tnode *ref = p->info.typ->ref; int dim = get_Darraydims(typ); const char *d = ident(p->sym->name); fprintf(fout, "\n\tif (a->%s)\n\t{", d); if (!is_primitive(ref) && !is_transient(ref)) { if (dim) fprintf(fout, "\tsize_t i, n = soap_size(a->__size, %d);", dim); else fprintf(fout, "\tint i, n = a->__size;"); fprintf(fout, "\n\t\tfor (i = 0; i < n; i++)"); if (is_XML(ref)) fprintf(fout, "\n\t\t\tSOAP_FREE(NULL, a->%s[i]);", d); else if (ref->type == Tclass || ref->type == Tstruct || ref->type == Ttemplate || ref->type == Tpointer) fprintf(fout, "\n\t\t\tsoap_del_%s(&a->%s[i]);", c_ident(ref), d); } if (cflag || is_primitive(ref) || ref->type == Tpointer) fprintf(fout, "\n\t\tSOAP_FREE(NULL, a->%s);\n\t}", d); else fprintf(fout, "\n\t\tSOAP_DELETE_ARRAY(a->%s);\n\t}", d); } } else { Table *t = (Table*)typ->ref; const char *b = ""; const char *c = ""; if (typ->type == Tclass) { b = ident(t->sym->name); c = "::"; } if (t->prev) fprintf(fout, "\n\tsoap_del_%s(a);", ident(t->prev->sym->name)); for (p = ((Table*)typ->ref)->list; p; p = p->next) { const char *d = ident(p->sym->name); if (p->info.typ->type == Tfun || p->info.typ->type == Tunion || is_soapref(p->info.typ)) { continue; } else if (p->info.sto & Sconst) { fprintf(fout, "\n\t/* const %s skipped */", d); } else if (p->info.sto & Sstatic) { fprintf(fout, "\n\t/* static %s skipped */", d); } else if (p->info.sto & Stypedef) { fprintf(fout, "\n\t/* typedef %s skipped */", d); } else if (is_repetition(p)) { Tnode *ref = p->next->info.typ->ref; const char *e = ident(p->next->sym->name); fprintf(fout, "\n\tif (a->%s%s%s)\n\t{", b, c, e); if (!is_primitive(ref) && !is_transient(ref)) { fprintf(fout, "\tint i;\n\t\tfor (i = 0; i < (int)a->%s%s%s; i++)", b, c, d); if (is_XML(ref)) fprintf(fout, "\n\t\t\tSOAP_FREE(NULL, a->%s%s%s[i]);", b, c, e); else if (ref->type == Tpointer && (p->next->info.sto & Sconstptr)) fprintf(fout, "\n\t\t\tsoap_del_%s((%s)&a->%s%s%s[i]);", c_ident(ref), c_type_id(ref, "*"), b, c, e); else if (ref->type == Tclass || ref->type == Tstruct || ref->type == Ttemplate || ref->type == Tpointer) fprintf(fout, "\n\t\t\tsoap_del_%s(&a->%s%s%s[i]);", c_ident(ref), b, c, e); } if (cflag) fprintf(fout, "\n\t\tSOAP_FREE(NULL, a->%s%s%s);\n\t}", b, c, e); else if (is_primitive(ref) || ref->type == Tpointer) fprintf(fout, "\n\t\tSOAP_FREE(NULL, a->%s%s%s);\n\t}", b, c, e); else fprintf(fout, "\n\t\tSOAP_DELETE_ARRAY(a->%s%s%s);\n\t}", b, c, e); p = p->next; } else if (is_anytype(p)) { fprintf(fout, "\n\tif (a->%s%s%s)\n\t\tsoap_delelement(a->%s%s%s, a->%s%s%s);", b, c, ident(p->next->sym->name), b, c, ident(p->next->sym->name), b, c, d); p = p->next; } else if (is_choice(p)) { Entry *q; const char *e = ident(p->next->sym->name); fprintf(fout, "\n\tswitch (a->%s%s%s)\n\t{", b, c, d); t = (Table*)p->next->info.typ->ref; if (t) { for (q = t->list; q; q = q->next) { if (!is_primitive(q->info.typ) && !is_transient(q->info.typ)) { const char *f = ident(q->sym->name); fprintf(fout, "\n\t\tcase %s:", soap_union_member(p->next->info.typ, q)); if (is_XML(q->info.typ)) fprintf(fout, "\n\t\t\tif (a->%s%s%s.%s)\n\t\t\t\tSOAP_FREE(NULL, a->%s%s%s.%s);", b, c, e, f, b, c, e, f); else if (q->info.typ->type == Tclass || q->info.typ->type == Tstruct || q->info.typ->type == Ttemplate || q->info.typ->type == Tpointer) fprintf(fout, "\n\t\t\tsoap_del_%s(&a->%s%s%s.%s);", c_ident(q->info.typ), b, c, e, f); fprintf(fout, "\n\t\t\tbreak;"); } } } fprintf(fout, "\n\t}"); p = p->next; } else if (is_XML(p->info.typ)) { fprintf(fout, "\n\tif (a->%s%s%s)\n\t\tSOAP_FREE(NULL, a->%s%s%s);", b, c, d, b, c, d); } else if (p->info.typ->type == Tpointer && (p->info.sto & Sconstptr)) { fprintf(fout, "\n\tsoap_del_%s((%s)&a->%s%s%s);", c_ident(p->info.typ), c_type_id(p->info.typ, "*"), b, c, d); } else if (is_primitive(p->info.typ)) { fprintf(fout, "\n\t/* %s skipped */", d); } else if (is_transient(p->info.typ)) { fprintf(fout, "\n\t/* transient %s skipped */", d); } else if (p->info.typ->type == Tarray) { Tnode *ref = p->info.typ->ref; if (!is_primitive(ref) && !is_transient(ref)) { fprintf(fout, "\n\t{\tint i;\n\t\tfor (i = 0; i < %d; i++)", get_dimension(p->info.typ)); if (is_XML(ref)) fprintf(fout, "\n\t\t\tif (a->%s%s%s[i])\n\t\t\t\tSOAP_FREE(NULL, a->%s%s%s[i]);", b, c, d, b, c, d); else if (ref->type == Tclass || ref->type == Tstruct || ref->type == Ttemplate || ref->type == Tpointer) fprintf(fout, "\n\t\t\tsoap_del_%s(&a->%s%s%s[i]);", c_ident(ref), b, c, d); fprintf(fout, "\n\t}"); } } else if (p->info.typ->type == Tclass || p->info.typ->type == Tstruct || p->info.typ->type == Ttemplate || p->info.typ->type == Tpointer) { fprintf(fout, "\n\tsoap_del_%s(&a->%s%s%s);", c_ident(p->info.typ), b, c, d); } else { fprintf(fout, "\n\t/* %s skipped */", d); } } } } fprintf(fout, "\n}"); fflush(fout); } int get_dimension(Tnode *typ) { if (((Tnode*)typ->ref)->width) return typ->width / ((Tnode*) typ->ref)->width; return 0; } void soap_serialize(Tnode *typ) { int d; Table *table, *t; Entry *p; Tnode* temp; int cardinality; const char *self; if (is_primitive(typ)) return; if (is_typedef(typ) && (is_template(typ) || is_element(typ) || is_synonym(typ) || is_external(typ) || is_imported(typ)) && (!is_external(typ) || is_volatile(typ))) { if (typ->type == Tclass && !is_stdstring(typ) && !is_stdwstring(typ) && !is_volatile(typ)) fprintf(fhead, "\n\n#define soap_serialize_%s(soap, a) (a)->soap_serialize(soap)\n", c_ident(typ)); else fprintf(fhead, "\n\n#define soap_serialize_%s soap_serialize_%s\n", c_ident(typ), t_ident(typ)); return; } if ((p = is_dynamic_array(typ))) { if (typ->type == Tclass && !is_typedef(typ) && !is_volatile(typ)) { if (is_external(typ)) return; fprintf(fout, "\n\nvoid %s::soap_serialize(struct soap *soap) const\n{", c_ident(typ)); fprintf(fout, "\n\t(void)soap; /* appease -Wall -Werror */\n#ifndef WITH_NOIDREF"); if (is_binary(typ)) { if (is_attachment(typ)) { fprintf(fout, "\n\tif (this->__ptr && !soap_array_reference(soap, this, this->__ptr, this->__size, %s))", soap_type(typ)); fprintf(fout, "\n\t\tif (this->id || this->type)\n\t\t\tsoap->mode |= SOAP_ENC_DIME;\n#endif\n}"); } else fprintf(fout, "\n\tif (this->__ptr)\n\t\tsoap_array_reference(soap, this, this->__ptr, this->__size, %s);\n#endif\n}", soap_type(typ)); fflush(fout); return; } else { d = get_Darraydims(typ); if (d) { fprintf(fout, "\n\tif (this->%s && !soap_array_reference(soap, this, this->%s, %s, %s))", ident(p->sym->name), ident(p->sym->name), get_Darraysize("this", d), soap_type(typ)); fprintf(fout, "\n\t{\tsize_t i, n = soap_size(this->__size, %d);", d); fprintf(fout, "\n\t\tfor (i = 0; i < n; i++)"); } else { fprintf(fout, "\n\tif (this->%s && !soap_array_reference(soap, this, this->%s, this->__size, %s))", ident(p->sym->name), ident(p->sym->name), soap_type(typ)); fprintf(fout, "\n\t{\tfor (size_t i = 0; i < (size_t)this->__size; i++)"); } fprintf(fout, "\n\t\t{"); if (has_ptr((Tnode*)p->info.typ->ref)) fprintf(fout, "\tsoap_embedded(soap, this->%s + i, %s);", ident(p->sym->name), soap_type((Tnode*)p->info.typ->ref)); if (((Tnode*)p->info.typ->ref)->type == Tclass && !is_XML((Tnode*)p->info.typ->ref) && !is_external((Tnode*)p->info.typ->ref) && !is_volatile((Tnode*)p->info.typ->ref) && !is_typedef((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\tthis->%s[i].soap_serialize(soap);", ident(p->sym->name)); else if (is_string((Tnode*)p->info.typ->ref) && !is_XML((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_serialize_%s(soap, (char*const*)(this->%s + i));", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name)); else if (is_wstring((Tnode*)p->info.typ->ref) && !is_XML((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_serialize_%s(soap, (wchar_t*const*)(this->%s + i));", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name)); else if (!is_XML((Tnode*)p->info.typ->ref) && !is_primitive((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_serialize_%s(soap, this->%s + i);", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name)); fprintf(fout, "\n\t\t}\n\t}\n#endif\n}"); return; } } else { if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_serialize_%s(struct soap*, const %s);", c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap*, const %s);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap *soap, const %s)\n{", c_ident(typ), c_type_id(typ, "*a")); if (is_binary(typ)) { fprintf(fout, "\n\t(void)soap; (void)a; /* appease -Wall -Werror */\n#ifndef WITH_NOIDREF"); if (is_attachment(typ)) { fprintf(fout, "\n\tif (a->%s && !soap_array_reference(soap, a, a->%s, a->__size, %s))", ident(p->sym->name), ident(p->sym->name), soap_type(typ)); fprintf(fout, "\n\t\tif (a->id || a->type)\n\t\t\tsoap->mode |= SOAP_ENC_DIME;\n#endif\n}"); } else fprintf(fout, "\n\tif (a->%s)\n\t\tsoap_array_reference(soap, a, a->%s, a->__size, %s);\n#endif\n}", ident(p->sym->name), ident(p->sym->name), soap_type(typ)); fflush(fout); return; } else { fprintf(fout, "\n\t(void)soap; (void)a; /* appease -Wall -Werror */\n#ifndef WITH_NOIDREF"); d = get_Darraydims(typ); if (d) { fprintf(fout, "\n\tif (a->%s && !soap_array_reference(soap, a, a->%s, %s, %s))", ident(p->sym->name), ident(p->sym->name), get_Darraysize("a", d), soap_type(typ)); fprintf(fout, "\n\t{\tsize_t i, n = soap_size(a->__size, %d);", d); fprintf(fout, "\n\t\tfor (i = 0; i < n; i++)"); } else { fprintf(fout, "\n\tif (a->%s && !soap_array_reference(soap, a, a->%s, a->__size, %s))", ident(p->sym->name), ident(p->sym->name), soap_type(typ)); fprintf(fout, "\n\t{\tint i;\n\t\tfor (i = 0; i < a->__size; i++)"); } fprintf(fout, "\n\t\t{"); if (has_ptr((Tnode*)p->info.typ->ref)) fprintf(fout, "\tsoap_embedded(soap, a->%s + i, %s);", ident(p->sym->name), soap_type((Tnode*)p->info.typ->ref)); if (((Tnode*)p->info.typ->ref)->type == Tclass && !is_XML((Tnode*)p->info.typ->ref) && !is_external((Tnode*)p->info.typ->ref) && !is_volatile((Tnode*)p->info.typ->ref) && !is_typedef((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\ta->%s[i].soap_serialize(soap);", ident(p->sym->name)); else if (is_string((Tnode*)p->info.typ->ref) && !is_XML((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_serialize_%s(soap, (char*const*)(a->%s + i));", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name)); else if (is_wstring((Tnode*)p->info.typ->ref) && !is_XML((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_serialize_%s(soap, (wchar_t*const*)(a->%s + i));", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name)); else if (!is_XML((Tnode*)p->info.typ->ref) && !is_primitive((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_serialize_%s(soap, a->%s + i);", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name)); fprintf(fout, "\n\t\t}\n\t}\n#endif\n}"); fflush(fout); return; } } } if (is_stdstring(typ) || is_stdwstring(typ)) { fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap*, const %s);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap *soap, const %s)\n{\t(void)soap; (void)a; /* appease -Wall -Werror */\n}", c_ident(typ), c_type_id(typ, "*a")); return; } switch(typ->type) { case Tclass: if (!is_volatile(typ) && typ->ref) /* fall through to switch case Tstruct */ { if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_serialize_%s(struct soap*, const %s);", c_ident(typ), c_type_id(typ, "*")); return; } if (!is_typedef(typ)) { self = "this"; fprintf(fout, "\n\nvoid %s::soap_serialize(struct soap *soap) const\n{\n\t(void)soap; /* appease -Wall -Werror */", ident(typ->id->name)); } else { self = "p"; fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap*, const %s);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap *soap, const %s)\n{\n\t(void)soap; (void)p; /* appease -Wall -Werror */", c_ident(typ), c_type_id(typ, "*p")); } fprintf(fout, "\n#ifndef WITH_NOIDREF"); table = (Table*)typ->ref; for (p = table->list; p; p = p->next) { if (p->info.typ->type == Tfun || p->info.typ->type == Tunion || is_soapref(p->info.typ)) ; else if (p->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name)); else if (p->info.sto & Sattribute) ; else if (is_repetition(p)) { if (!is_XML(p->next->info.typ)) { fprintf(fout, "\n\tif (%s->%s::%s)", self, ident(table->sym->name), ident(p->next->sym->name)); fprintf(fout, "\n\t{\tint i;\n\t\tfor (i = 0; i < (int)%s->%s::%s; i++)\n\t\t{", self, ident(table->sym->name), ident(p->sym->name)); if (!is_invisible(p->next->sym->name)) if (has_ptr((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_embedded(soap, %s->%s::%s + i, %s);", self, ident(table->sym->name), ident(p->next->sym->name), soap_type((Tnode*)p->next->info.typ->ref)); if (((Tnode*)p->next->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->next->info.typ->ref) && !is_volatile((Tnode*)p->next->info.typ->ref) && !is_typedef((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t%s->%s::%s[i].soap_serialize(soap);", self, ident(table->sym->name), ident(p->next->sym->name)); else if (is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_serialize_%s(soap, (char*const*)(%s->%s::%s + i));", c_ident((Tnode*)p->next->info.typ->ref), self, ident(table->sym->name), ident(p->next->sym->name)); else if (is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_serialize_%s(soap, (wchar_t*const*)(%s->%s::%s + i));", c_ident((Tnode*)p->next->info.typ->ref), self, ident(table->sym->name), ident(p->next->sym->name)); else if (!is_primitive((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_serialize_%s(soap, %s->%s::%s + i);", c_ident((Tnode*)p->next->info.typ->ref), self, ident(table->sym->name), ident(p->next->sym->name)); fprintf(fout, "\n\t\t}\n\t}"); } p = p->next; } else if (is_anytype(p)) { fprintf(fout, "\n\tsoap_markelement(soap, %s->%s, %s->%s);", self, ident(p->next->sym->name), self, ident(p->sym->name)); p = p->next; } else if (is_choice(p)) { fprintf(fout, "\n\tsoap_serialize_%s(soap, %s->%s::%s, &%s->%s::%s);", c_ident(p->next->info.typ), self, ident(table->sym->name), ident(p->sym->name), self, ident(table->sym->name), ident(p->next->sym->name)); p = p->next; } else if (is_transient(p->info.typ)) { fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); } else if (p->info.typ->type == Tarray) { if (has_ptr(p->info.typ)) fprintf(fout, "\n\tsoap_embedded(soap, %s->%s::%s, %s);", self, ident(table->sym->name), ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout, "\n\tsoap_serialize_%s(soap, %s->%s::%s);", c_ident(p->info.typ), self, ident(table->sym->name), ident(p->sym->name)); } else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { if (has_ptr(p->info.typ)) fprintf(fout, "\n\tsoap_embedded(soap, &%s->%s::%s, %s);", self, ident(table->sym->name), ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout, "\n\t%s->%s::%s.soap_serialize(soap);", self, ident(table->sym->name), ident(p->sym->name)); } else if (!is_void(p->info.typ) && !is_XML(p->info.typ)) { if (!is_template(p->info.typ)) if (has_ptr(p->info.typ)) fprintf(fout, "\n\tsoap_embedded(soap, &%s->%s::%s, %s);", self, ident(table->sym->name), ident(p->sym->name), soap_type(p->info.typ)); if (is_string(p->info.typ)) fprintf(fout, "\n\tsoap_serialize_%s(soap, (char*const*)&%s->%s::%s);", c_ident(p->info.typ), self, ident(table->sym->name), ident(p->sym->name)); else if (is_wstring(p->info.typ)) fprintf(fout, "\n\tsoap_serialize_%s(soap, (wchar_t*const*)&%s->%s::%s);", c_ident(p->info.typ), self, ident(table->sym->name), ident(p->sym->name)); else if ((p->info.typ->type == Treference || p->info.typ->type == Trvalueref) && ((Tnode*)(p->info.typ->ref))->type == Tclass && !is_external(p->info.typ->ref) && !is_volatile(p->info.typ->ref)) fprintf(fout, "\n\t%s->%s::%s.soap_serialize(soap);", self, ident(table->sym->name), ident(p->sym->name)); else if ((p->info.typ->type == Treference || p->info.typ->type == Trvalueref) && !is_primitive(p->info.typ->ref)) fprintf(fout, "\n\tsoap_serialize_%s(soap, &%s->%s::%s);", c_ident(p->info.typ), self, ident(table->sym->name), ident(p->sym->name)); else if (!is_primitive(p->info.typ) && p->info.typ->type != Treference && p->info.typ->type != Trvalueref) fprintf(fout, "\n\tsoap_serialize_%s(soap, &%s->%s::%s);", c_ident(p->info.typ), self, ident(table->sym->name), ident(p->sym->name)); else if (!is_primitive(p->info.typ)) fprintf(fout, "\n\t/* %s skipped */", ident(p->sym->name)); } } if (table && table->prev) fprintf(fout, "\n\t%s->%s::soap_serialize(soap);", self, ident(table->prev->sym->name)); fprintf(fout, "\n#endif\n}"); break; } /* fall through to next case when class is volatile, since serializers cannot be member functions */ case Tstruct: if (is_external(typ) && !is_volatile(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_serialize_%s(struct soap*, const %s);", c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap*, const %s);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap *soap, const %s)\n{", c_ident(typ), c_type_id(typ, "*a")); fprintf(fout, "\n\t(void)soap; (void)a; /* appease -Wall -Werror */\n#ifndef WITH_NOIDREF"); table = (Table*)typ->ref; for (t = table; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun || p->info.typ->type == Tunion || is_soapref(p->info.typ)) ; else if (p->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name)); else if (p->info.sto & Sattribute) ; else if (is_repetition(p)) { if (!is_XML(p->next->info.typ)) { fprintf(fout, "\n\tif (a->%s)", ident(p->next->sym->name)); fprintf(fout, "\n\t{\tint i;\n\t\tfor (i = 0; i < (int)a->%s; i++)\n\t\t{", ident(p->sym->name)); if (!is_invisible(p->next->sym->name)) if (has_ptr((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_embedded(soap, a->%s + i, %s);", ident(p->next->sym->name), soap_type((Tnode*)p->next->info.typ->ref)); if (((Tnode*)p->next->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->next->info.typ->ref) && !is_volatile((Tnode*)p->next->info.typ->ref) && !is_typedef((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\ta->%s[i].soap_serialize(soap);", ident(p->next->sym->name)); else if (is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_serialize_%s(soap, (char*const*)(a->%s + i));", c_ident((Tnode*)p->next->info.typ->ref), ident(p->next->sym->name)); else if (is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_serialize_%s(soap, (wchar_t*const*)(a->%s + i));", c_ident((Tnode*)p->next->info.typ->ref), ident(p->next->sym->name)); else if (!is_primitive((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_serialize_%s(soap, a->%s + i);", c_ident((Tnode*)p->next->info.typ->ref), ident(p->next->sym->name)); fprintf(fout, "\n\t\t}\n\t}"); } p = p->next; } else if (is_anytype(p)) { fprintf(fout, "\n\tsoap_markelement(soap, a->%s, a->%s);", ident(p->next->sym->name), ident(p->sym->name)); p = p->next; } else if (is_choice(p)) { fprintf(fout, "\n\tsoap_serialize_%s(soap, a->%s, &a->%s);", c_ident(p->next->info.typ), ident(p->sym->name), ident(p->next->sym->name)); p = p->next; } else if (is_transient(p->info.typ)) { fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); } else if (p->info.typ->type == Tarray) { if (has_ptr(p->info.typ)) fprintf(fout, "\n\tsoap_embedded(soap, a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout, "\n\tsoap_serialize_%s(soap, a->%s);", c_ident(p->info.typ), ident(p->sym->name)); } else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { if (has_ptr(p->info.typ)) fprintf(fout, "\n\tsoap_embedded(soap, &a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout, "\n\ta->%s.soap_serialize(soap);", ident(p->sym->name)); } else if (!is_void(p->info.typ) && !is_XML(p->info.typ)) { if (!is_template(p->info.typ)) if (has_ptr(p->info.typ)) fprintf(fout, "\n\tsoap_embedded(soap, &a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); if (is_string(p->info.typ)) fprintf(fout, "\n\tsoap_serialize_%s(soap, (char*const*)&a->%s);", c_ident(p->info.typ), ident(p->sym->name)); else if (is_wstring(p->info.typ)) fprintf(fout, "\n\tsoap_serialize_%s(soap, (wchar_t*const*)&a->%s);", c_ident(p->info.typ), ident(p->sym->name)); else if ((p->info.typ->type == Treference || p->info.typ->type == Trvalueref) && ((Tnode*)(p->info.typ->ref))->type == Tclass && !is_external(p->info.typ->ref) && !is_volatile(p->info.typ->ref)) fprintf(fout, "\n\ta->%s.soap_serialize(soap);", ident(p->sym->name)); else if ((p->info.typ->type == Treference || p->info.typ->type == Trvalueref) && !is_primitive(p->info.typ->ref)) fprintf(fout, "\n\tsoap_serialize_%s(soap, &a->%s);", c_ident(p->info.typ), ident(p->sym->name)); else if (!is_primitive(p->info.typ) && p->info.typ->type != Treference && p->info.typ->type != Trvalueref) fprintf(fout, "\n\tsoap_serialize_%s(soap, &a->%s);", c_ident(p->info.typ), ident(p->sym->name)); else if (!is_primitive(p->info.typ)) fprintf(fout, "\n\t/* %s skipped */", ident(p->sym->name)); } } } fprintf(fout, "\n#endif\n}"); break; case Tunion: if (is_external(typ) && !is_volatile(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_serialize_%s(struct soap*, int, const %s);", c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap*, int, const %s);", c_ident(typ), c_type_id(typ, "*")); if (!typ->ref) return; fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap *soap, int choice, const %s)\n{", c_ident(typ), c_type_id(typ, "*a")); fprintf(fout, "\n\t(void)soap; (void)choice; (void)a; /* appease -Wall -Werror */\n#ifndef WITH_NOIDREF"); fprintf(fout, "\n\tswitch (choice)\n\t{"); table = (Table*)typ->ref; for (t = table; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun || p->info.typ->type == Tunion) ; else if (p->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name)); else if (p->info.sto & Sattribute) ; else if (is_repetition(p)) ; else if (is_anytype(p)) ; else if (is_transient(p->info.typ)) fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); else if (p->info.typ->type == Tarray) { fprintf(fout, "\n\tcase %s:", soap_union_member(typ, p)); if (has_ptr(p->info.typ)) fprintf(fout, "\n\t\tsoap_embedded(soap, a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout, "\n\t\tsoap_serialize_%s(soap, a->%s);", c_ident(p->info.typ), ident(p->sym->name)); fprintf(fout, "\n\t\tbreak;"); } else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { fprintf(fout, "\n\tcase %s:", soap_union_member(typ, p)); if (has_ptr(p->info.typ)) fprintf(fout, "\n\t\tsoap_embedded(soap, &a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout, "\n\t\ta->%s.soap_serialize(soap);", ident(p->sym->name)); fprintf(fout, "\n\t\tbreak;"); } else if (p->info.typ->type != Tfun && !is_void(p->info.typ) && !is_XML(p->info.typ)) { fprintf(fout, "\n\tcase %s:", soap_union_member(typ, p)); if (has_ptr(p->info.typ)) fprintf(fout, "\n\t\tsoap_embedded(soap, &a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); if (!is_primitive(p->info.typ)) fprintf(fout, "\n\t\tsoap_serialize_%s(soap, &a->%s);", c_ident(p->info.typ), ident(p->sym->name)); fprintf(fout, "\n\t\tbreak;"); } } } fprintf(fout, "\n\tdefault:\n\t\tbreak;\n\t}\n#endif\n}"); break; case Tpointer: if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_serialize_%s(struct soap*, %s);", c_ident(typ), c_type_constptr_id(typ, "const*")); return; } fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap*, %s);", c_ident(typ), c_type_constptr_id(typ, "const*")); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap *soap, %s)\n{\n\t(void)soap; (void)a; /* appease -Wall -Werror */\n#ifndef WITH_NOIDREF", c_ident(typ), c_type_constptr_id(typ, "const*a")); temp = (Tnode*)typ->ref; if (!temp) return; if (is_string(typ) || is_wstring(typ)) fprintf(fout, "\n\tsoap_reference(soap, *a, %s);", soap_type(typ)); else if (is_primitive(temp)) fprintf(fout, "\n\tsoap_reference(soap, *a, %s);", soap_type(temp)); else { if (is_dynamic_array(temp)) fprintf(fout, "\n\tif (*a)"); else fprintf(fout, "\n\tif (!soap_reference(soap, *a, %s))", soap_type(temp)); if (temp->type == Tclass && !is_external(temp) && !is_volatile(temp) && !is_typedef(temp)) fprintf(fout, "\n\t\t(*a)->soap_serialize(soap);"); else fprintf(fout, "\n\t\tsoap_serialize_%s(soap, *a);", c_ident(temp)); } fprintf(fout, "\n#endif\n}"); break; case Tarray: if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_serialize_%s(struct soap*, %s);", c_ident(typ), c_type_id(typ, "const")); return; } fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap*, %s);", c_ident(typ), c_type_id(typ, "const")); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap *soap, %s)\n{", c_ident(typ), c_type_id(typ, "const a")); if (!is_primitive((Tnode*)typ->ref)) { fprintf(fout, "\n\tint i;"); fprintf(fout, "\n\t(void)soap; (void)a; /* appease -Wall -Werror */\n#ifndef WITH_NOIDREF"); fprintf(fout, "\n\tfor (i = 0; i < %d; i++)", get_dimension(typ)); temp = (Tnode*)typ->ref;; cardinality = 1; while (temp->type == Tarray) { temp=(Tnode*)temp->ref; cardinality++; } fprintf(fout, "\n\t{"); if (has_ptr((Tnode*)typ->ref)) { fprintf(fout, "\tsoap_embedded(soap, a"); if (cardinality > 1) fprintf(fout, "[i]"); else fprintf(fout, "+i"); fprintf(fout, ", %s);", soap_type((Tnode*)typ->ref)); } if (((Tnode *)typ->ref)->type == Tclass && !is_external((Tnode*)typ->ref) && !is_volatile((Tnode*)typ->ref) && !is_typedef((Tnode*)typ->ref)) { fprintf(fout, "\n\ta[i].soap_serialize(soap)"); } else if (!is_primitive((Tnode*)typ->ref)) { fprintf(fout, "\n\tsoap_serialize_%s(soap, a", c_ident((Tnode*)typ->ref)); if (cardinality > 1) { fprintf(fout, "[i])"); } else { fprintf(fout, "+i)"); } } fprintf(fout, ";\n\t}"); fprintf(fout, "\n#endif\n}"); } else fprintf(fout, "\n\t(void)soap; (void)a; /* appease -Wall -Werror */\n}"); break; case Ttemplate: if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_serialize_%s(struct soap*, const %s);", c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap*, const %s);", c_ident(typ), c_type_id(typ, "*")); temp = (Tnode*)typ->ref; if (!temp) return; fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap *soap, const %s)\n{\n\t(void)soap; (void)a;/* appease -Wall -Werror */\n#ifndef WITH_NOIDREF", c_ident(typ), c_type_id(typ, "*a")); if (!is_XML(temp) && temp->type != Tfun && !is_void(temp)) { if (is_smart(typ)) { if (is_primitive(temp)) fprintf(fout, "\n\tsoap_reference(soap, a->get(), %s);", soap_type(temp)); else { if (is_dynamic_array(temp)) fprintf(fout, "\n\tif (*a)"); else fprintf(fout, "\n\tif (!soap_reference(soap, a->get(), %s))", soap_type(temp)); if (temp->type == Tclass && !is_external(temp) && !is_volatile(temp) && !is_typedef(temp)) fprintf(fout, "\n\t\t(*a)->soap_serialize(soap);"); else fprintf(fout, "\n\t\tsoap_serialize_%s(soap, a->get());", c_ident(temp)); } } else if (!is_primitive(temp)) { fprintf(fout, "\n\tfor (%s::const_iterator i = a->begin(); i != a->end(); ++i)", c_type(typ)); if (temp->type == Tclass && !is_external(temp) && !is_volatile(temp) && !is_typedef(temp)) fprintf(fout, "\n\t\t(*i).soap_serialize(soap);"); else fprintf(fout, "\n\t\tsoap_serialize_%s(soap, &(*i));", c_ident(temp)); } } fprintf(fout, "\n#endif\n}"); default: break; } } void soap_default(Tnode* typ) { int i, d; Table *table, *t; Entry *p; Tnode *temp; const char *s; int cardinality; if (typ->type == Tpointer && !is_string(typ)) return; if (typ->type != Tclass || !(typ->sym && (is_stdstring(typ) || is_stdwstring(typ)) && is_eq(typ->sym->name, "xsd__QName")) || is_imported(typ)) { if (is_typedef(typ) && (!is_external(typ) || is_volatile(typ))) { if (typ->type == Tclass && !is_stdstring(typ) && !is_stdwstring(typ) && !is_volatile(typ)) fprintf(fhead, "\n\n#define soap_default_%s(soap, a) (a)->%s::soap_default(soap)\n", c_ident(typ), t_ident(typ)); else if (typ->type == Tclass && is_eq(typ->sym->name, "xsd__QName")) fprintf(fhead, "\n\n#define soap_default_%s(soap, a) soap_default_std__string(soap, a)\n", c_ident(typ)); else fprintf(fhead, "\n\n#define soap_default_%s(soap, a) soap_default_%s(soap, a)\n", c_ident(typ), t_ident(typ)); return; } } p = is_dynamic_array(typ); if (p) { if (typ->type == Tclass && !is_volatile(typ)) { if (is_external(typ)) return; fprintf(fout, "\n\nvoid %s::soap_default(struct soap *soap)\n{", c_ident(typ)); if ((s = has_soapref(typ))) fprintf(fout, "\n\tthis->%s = soap;", s); else fprintf(fout, "\n\t(void)soap; /* appease -Wall -Werror */"); if (is_smart(p->info.typ)) fprintf(fout, "\n\tthis->%s.reset();", ident(p->sym->name)); else fprintf(fout, "\n\tthis->%s = NULL;", ident(p->sym->name)); d = get_Darraydims(typ); if (d) { for (i = 0; i < d; i++) { fprintf(fout, "\n\tthis->__size[%d] = 0;", i); if (has_offset(typ) && (((Table*)typ->ref)->list->next->next->info.sto & Sconst) == 0) fprintf(fout, "\n\tthis->__offset[%d] = 0;", i); } } else { fprintf(fout, "\n\tthis->__size = 0;"); if (has_offset(typ) && (((Table*)typ->ref)->list->next->next->info.sto & Sconst) == 0) fprintf(fout, "\n\tthis->__offset = 0;"); } if (is_attachment(typ)) fprintf(fout, "\n\tthis->id = NULL;\n\tthis->type = NULL;\n\tthis->options = NULL;"); fprintf(fout, "\n}"); } else { if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_default_%s(struct soap*, %s);", c_ident(typ), c_type_id(typ, "*")); return; } if (!cflag && !is_volatile(typ) && !has_constructor(typ) && !union_member(typ)) fprintf(fout, "\n\n%s::%s()\n{\n\tsoap_default_%s(NULL, this);\n}", c_ident(typ), c_ident(typ), c_ident(typ)); fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap*, %s);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap *soap, %s)\n{", c_ident(typ), c_type_id(typ, "*a")); if ((s = has_soapref(typ))) fprintf(fout, "\n\ta->%s = soap;", s); else fprintf(fout, "\n\t(void)soap; /* appease -Wall -Werror */"); fprintf(fout, "\n\ta->%s = NULL;", ident(p->sym->name)); d = get_Darraydims(typ); if (d) { for (i = 0; i < d; i++) { fprintf(fout, "\n\ta->__size[%d] = 0;", i); if (has_offset(typ) && (((Table*)typ->ref)->list->next->next->info.sto & Sconst) == 0) fprintf(fout, "\n\ta->__offset[%d] = 0;", i); } } else { fprintf(fout, "\n\ta->__size = 0;"); if (has_offset(typ) && (((Table*)typ->ref)->list->next->next->info.sto & Sconst) == 0) fprintf(fout, "\n\ta->__offset = 0;"); } if (is_attachment(typ)) fprintf(fout, "\n\ta->id = NULL;\n\ta->type = NULL;\n\ta->options = NULL;"); fprintf(fout, "\n}"); } fflush(fout); return; } if (is_primitive(typ) || is_string(typ)) { if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_default_%s(struct soap*, %s);", c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap*, %s);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap *soap, %s)\n{\n\t(void)soap; /* appease -Wall -Werror */\n#ifdef SOAP_DEFAULT_%s\n\t*a = SOAP_DEFAULT_%s;\n#else\n\t*a = (%s)0;\n#endif\n}", c_ident(typ), c_type_id(typ, "*a"), c_ident(typ), c_ident(typ), c_type(typ)); return; } if (is_fixedstring(typ)) { fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap*, char[]);", c_ident(typ)); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap *soap, char a[])\n{\n\t(void)soap; /* appease -Wall -Werror */\n\ta[0] = '\\0';\n}", c_ident(typ)); return; } if (is_stdstring(typ) || is_stdwstring(typ)) { fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap*, %s);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap *soap, %s)\n{\n\t(void)soap; /* appease -Wall -Werror */\n\tp->erase();\n}", c_ident(typ), c_type_id(typ, "*p")); return; } switch(typ->type) { case Tclass: if (!is_volatile(typ) && typ->ref) /* fall through to switch case Tstruct */ { if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_default_%s(struct soap*, %s);", c_ident(typ), c_type_id(typ, "*")); return; } table=(Table*)typ->ref; fprintf(fout, "\n\nvoid %s::soap_default(struct soap *soap)\n{", ident(typ->id->name)); if ((s = has_soapref(typ))) fprintf(fout, "\n\tthis->%s = soap;", s); else fprintf(fout, "\n\t(void)soap; /* appease -Wall -Werror */"); fflush(fout); if (table) { if (table->prev) fprintf(fout, "\n\tthis->%s::soap_default(soap);", ident(table->prev->sym->name)); for (p = table->list; p; p = p->next) { if (p->info.typ->type == Tfun || p->info.typ->type == Tunion) continue; if (p->info.sto & Sconst) fprintf(fout, "\n\t/* const %s skipped */", ident(p->sym->name)); else if (is_choice(p)) { fprintf(fout, "\n\tthis->%s::%s = %d;", ident(table->sym->name), ident(p->sym->name), required_choice(p->next->info.typ)); p = p->next; } else if (is_repetition(p) || is_anytype(p)) { fprintf(fout, "\n\tthis->%s::%s = 0;\n\tthis->%s::%s = NULL;", ident(table->sym->name), ident(p->sym->name), ident(table->sym->name), ident(p->next->sym->name)); p = p->next; } else { if (is_fixedstring(p->info.typ)) { if (p->info.hasval) fprintf(fout, "\n\tsoap_strcpy(this->%s::%s, %d, \"%s\");", ident(table->sym->name), ident(p->sym->name), get_dimension(p->info.typ), cstring(p->info.val.s, 0)); else fprintf(fout, "\n\tthis->%s::%s[0] = '\\0';", ident(table->sym->name), ident(p->sym->name)); } else if (p->info.typ->type == Tarray) { fprintf(fout, "\n\tsoap_default_%s(soap, this->%s::%s);", c_ident(p->info.typ), ident(table->sym->name), ident(p->sym->name)); } else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ) && !is_transient(p->info.typ)) fprintf(fout, "\n\tthis->%s::%s.%s::soap_default(soap);", ident(table->sym->name), ident(p->sym->name), c_ident(p->info.typ)); else if (p->info.hasval) { if (is_smart(p->info.typ)) { if (is_smart_shared(p->info.typ)) fprintf(fout, "\n\tthis->%s::%s = %s<%s>(%s\"%s\");", ident(table->sym->name), ident(p->sym->name), make_shared(p->info.typ), c_type(p->info.typ->ref), is_stdwstring(p->info.typ->ref) ? "L" : "", p->info.val.s); else fprintf(fout, "\n\tthis->%s::%s = %s(SOAP_NEW(%s)(%s\"%s\"));", ident(table->sym->name), ident(p->sym->name), c_type(p->info.typ), c_type(p->info.typ->ref), is_stdwstring(p->info.typ->ref) ? "L" : "", p->info.val.s); } else if (p->info.typ->type == Tpointer && is_stdstring((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\tstatic std::string soap_tmp_%s(\"%s\");\n\tthis->%s::%s = &soap_tmp_%s;", ident(p->sym->name), p->info.val.s, ident(table->sym->name), ident(p->sym->name), ident(p->sym->name)); else fprintf(fout, "\n\tthis->%s::%s%s;", ident(table->sym->name), ident(p->sym->name), c_init(p)); } else if (is_transient(p->info.typ) || is_void(p->info.typ)) fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); else if (p->info.typ->type == Tpointer && (!is_string(p->info.typ) || is_XML(p->info.typ) || (p->info.sto & Sconstptr))) fprintf(fout, "\n\tthis->%s::%s = NULL;", ident(table->sym->name), ident(p->sym->name)); else if (p->info.typ->type != Treference && p->info.typ->type != Trvalueref) fprintf(fout, "\n\tsoap_default_%s(soap, &this->%s::%s);", c_ident(p->info.typ), ident(table->sym->name), ident(p->sym->name)); else fprintf(fout, "\n\t/* %s skipped */", ident(p->sym->name)); } } } fprintf(fout, "\n}"); fflush(fout); break; } case Tstruct: if (is_external(typ) && !is_volatile(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_default_%s(struct soap*, %s);", c_ident(typ), c_type_id(typ, "*")); return; } if (!cflag && !is_volatile(typ) && !has_constructor(typ) && !union_member(typ)) fprintf(fout, "\n\n%s::%s()\n{\n\tsoap_default_%s(NULL, this);\n}", c_ident(typ), c_ident(typ), c_ident(typ)); fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap*, %s);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap *soap, %s)\n{", c_ident(typ), c_type_id(typ, "*a")); fflush(fout); if ((s = has_soapref(typ))) fprintf(fout, "\n\ta->%s = soap;", s); else fprintf(fout, "\n\t(void)soap; (void)a; /* appease -Wall -Werror */"); table = (Table*)typ->ref; for (t = table; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun || p->info.typ->type == Tunion) continue; if (p->info.sto & Sconst) fprintf(fout, "\n\t/* const %s skipped */", ident(p->sym->name)); else if (p->info.sto & (Sprivate | Sprotected)) fprintf(fout, "\n\t/* private/protected %s skipped */", ident(p->sym->name)); else if (is_choice(p)) { fprintf(fout, "\n\ta->%s = %d;", ident(p->sym->name), required_choice(p->next->info.typ)); p = p->next; } else if (is_repetition(p) || is_anytype(p)) { fprintf(fout, "\n\ta->%s = 0;\n\ta->%s = NULL;", ident(p->sym->name), ident(p->next->sym->name)); p = p->next; } else { if (is_fixedstring(p->info.typ)) { if (p->info.hasval) fprintf(fout, "\n\tsoap_strcpy(a->%s, %d, \"%s\");", ident(p->sym->name), get_dimension(p->info.typ), cstring(p->info.val.s, 0)); else fprintf(fout, "\n\ta->%s[0] = '\\0';", ident(p->sym->name)); } else if (p->info.typ->type == Tarray) fprintf(fout, "\n\tsoap_default_%s(soap, a->%s);", c_ident(p->info.typ), ident(p->sym->name)); else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ) && !is_transient(p->info.typ)) fprintf(fout, "\n\ta->%s.%s::soap_default(soap);", ident(p->sym->name), c_ident(p->info.typ)); else if (p->info.hasval) { if (is_smart(p->info.typ)) { if (is_smart_shared(p->info.typ)) fprintf(fout, "\n\tthis->%s = %s<%s>(%s\"%s\");", ident(p->sym->name), make_shared(p->info.typ), c_type(p->info.typ->ref), is_stdwstring(p->info.typ->ref) ? "L" : "", p->info.val.s); else fprintf(fout, "\n\tthis->%s = %s(SOAP_NEW(%s)(%s\"%s\"));", ident(p->sym->name), c_type(p->info.typ), c_type(p->info.typ->ref), is_stdwstring(p->info.typ->ref) ? "L" : "", p->info.val.s); } else if (p->info.typ->type == Tpointer && is_stdstring((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\tstatic std::string soap_tmp_%s(\"%s\");\n\ta->%s = &soap_tmp_%s;", ident(p->sym->name), p->info.val.s, ident(p->sym->name), ident(p->sym->name)); else fprintf(fout, "\n\ta->%s%s;", ident(p->sym->name), c_init(p)); } else if (is_transient(p->info.typ) || is_void(p->info.typ)) fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); else if (p->info.typ->type == Tpointer && (!is_string(p->info.typ) || is_XML(p->info.typ) || (p->info.sto & Sconstptr))) fprintf(fout, "\n\ta->%s = NULL;", ident(p->sym->name)); else if (p->info.typ->type != Treference && p->info.typ->type != Trvalueref) fprintf(fout, "\n\tsoap_default_%s(soap, &a->%s);", c_ident(p->info.typ), ident(p->sym->name)); else fprintf(fout, "\n\t/* %s skipped */", ident(p->sym->name)); } } } fprintf(fout, "\n}"); fflush(fout); break; case Tarray: if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_default_%s(struct soap*, %s);", c_ident(typ), c_type(typ)); return; } fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap*, %s);", c_ident(typ), c_type(typ)); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap *soap, %s)\n{", c_ident(typ), c_type_id(typ, "a")); fprintf(fout, "\n\tint i;"); fprintf(fout, "\n\t(void)soap; /* appease -Wall -Werror */"); fprintf(fout, "\n\tfor (i = 0; i < %d; i++)", get_dimension(typ)); temp = (Tnode*)typ->ref; cardinality = 1; while (temp->type == Tarray) { temp = (Tnode*)temp->ref; cardinality++; } if (((Tnode *)typ->ref)->type == Tclass && !is_external((Tnode*)typ->ref) && !is_volatile((Tnode*)typ->ref)) { if (cardinality>1) fprintf(fout, "a[i].%s::soap_default(soap)", t_ident((Tnode*)typ->ref)); else fprintf(fout, "(a+i)->soap_default(soap)"); } else if (((Tnode*)typ->ref)->type == Tpointer) fprintf(fout, "\n\ta[i] = NULL"); else { fprintf(fout, "\n\tsoap_default_%s(soap, a", c_ident((Tnode*)typ->ref)); if (cardinality>1) fprintf(fout, "[i])"); else fprintf(fout, "+i)"); } fprintf(fout, ";\n}"); break; case Ttemplate: if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_default_%s(struct soap*, %s);", c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap*, %s);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap *soap, %s)\n{", c_ident(typ), c_type_id(typ, "*p")); fprintf(fout, "\n\t(void)soap; /* appease -Wall -Werror */"); if (is_smart(typ)) fprintf(fout, "\n\tp->reset();"); else fprintf(fout, "\n\tp->clear();"); fprintf(fout, "\n}"); fflush(fout); break; default: break; } } void soap_traverse(Tnode* typ) { int d; Table *table, *t; Entry *p; Tnode* temp; int cardinality; if (is_primitive_or_string(typ) || is_fixedstring(typ)) { fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap *soap, %s, const char *s, soap_walker p, soap_walker q)\n{\t(void)soap; (void)q; /* appease -Wall -Werror */", c_ident(typ), c_type_id(typ, "*a")); fprintf(fout, "\n\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout, "\n\tif (q) q(soap, (void*)a, %s, s, \"%s\");\n}", soap_type(typ), c_type(typ)); return; } if (typ->type != Tclass || !(typ->sym && (is_stdstring(typ) || is_stdwstring(typ)) && is_eq(typ->sym->name, "xsd__QName")) || is_external(typ) || is_imported(typ)) if (is_typedef(typ) && !is_external(typ)) { if (typ->type == Tclass && !is_stdstring(typ) && !is_stdwstring(typ) && !is_volatile(typ)) fprintf(fhead, "\n\n#define soap_traverse_%s(soap, a, s, p, q) (a)->soap_traverse(soap, s, p, q)\n", c_ident(typ)); else if (typ->type == Tclass && is_eq(typ->sym->name, "xsd__QName")) fprintf(fhead, "\n\n#define soap_traverse_%s(soap, a, s, p, q) soap_traverse_std__string(soap, a, s, p, q)\n", c_ident(typ)); else fprintf(fhead, "\n\n#define soap_traverse_%s(soap, a, s, p, q) soap_traverse_%s(soap, a, s, p, q)\n", c_ident(typ), t_ident(typ)); return; } if (is_XML(typ)) { fprintf(fhead, "\n\n#define soap_traverse_%s(soap, a, s, p, q) soap_traverse_%s(soap, a, s, p, q)\n", c_ident(typ), t_ident(typ)); return; } if ((p = is_dynamic_array(typ))) { if (typ->type == Tclass && !is_volatile(typ)) { if (is_external(typ)) return; fprintf(fout, "\n\nvoid %s::soap_traverse(struct soap *soap, const char *s, soap_walker p, soap_walker q)\n{", c_ident(typ)); if (is_binary(typ)) { fprintf(fout, "\n\tif (this->%s && !soap_array_reference(soap, this, this->%s, this->__size, %s))\n\t{", ident(p->sym->name), ident(p->sym->name), soap_type(typ)); fprintf(fout, "\n\t\tif (p) p(soap, (void*)this, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout, "\n\t\tif (p) p(soap, (void*)this->%s, 0, \"%s\", NULL);", ident(p->sym->name), p->sym->name); if (is_attachment(typ)) { fprintf(fout, "\n\t\tif (this->id || this->type)\n\t\t\tsoap->mode |= SOAP_ENC_DIME;\n}"); fprintf(fout, "\n\t\tif (p) p(soap, (void*)this->id, SOAP_TYPE_string, \"id\", NULL);"); fprintf(fout, "\n\t\tif (q) q(soap, (void*)this->id, SOAP_TYPE_string, \"id\", NULL);"); fprintf(fout, "\n\t\tif (p) p(soap, (void*)this->type, SOAP_TYPE_string, \"type\", NULL);"); fprintf(fout, "\n\t\tif (q) q(soap, (void*)this->type, SOAP_TYPE_string, \"type\", NULL);"); fprintf(fout, "\n\t\tif (p) p(soap, (void*)this->options, 0, \"options\", NULL);"); fprintf(fout, "\n\t\tif (q) q(soap, (void*)this->options, 0, \"options\", NULL);"); } fprintf(fout, "\n\t\tif (q) q(soap, (void*)this->%s, 0, \"%s\", NULL);", ident(p->sym->name), p->sym->name); fprintf(fout, "\n\t\tif (q) q(soap, (void*)this, %s, s, \"%s\");\n\t}\n}", soap_type(typ), c_type(typ)); fflush(fout); return; } else { d = get_Darraydims(typ); if (d) { fprintf(fout, "\n\tif (this->%s && !soap_array_reference(soap, this, this->%s, %s, %s))\n\t{", ident(p->sym->name), ident(p->sym->name), get_Darraysize("this", d), soap_type(typ)); fprintf(fout, "\n\t\tif (p) p(soap, (void*)this, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout, "\n\t\tfor (size_t i = 0; i < soap_size(this->__size, %d); i++)", d); } else { fprintf(fout, "\n\tif (this->%s && !soap_array_reference(soap, this, this->%s, this->__size, %s))\n\t{", ident(p->sym->name), ident(p->sym->name), soap_type(typ)); fprintf(fout, "\n\t\tif (p) p(soap, (void*)this, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout, "\n\t\tfor (size_t i = 0; i < (size_t)this->__size; i++)"); } fprintf(fout, "\n\t\t{"); if (has_ptr((Tnode*)p->info.typ->ref)) fprintf(fout, "\tsoap_embedded(soap, this->%s + i, %s);", ident(p->sym->name), soap_type((Tnode*)p->info.typ->ref)); if (((Tnode*)p->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->info.typ->ref) && !is_volatile((Tnode*)p->info.typ->ref) && !is_typedef((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\tthis->%s[i].soap_traverse(soap, \"%s\", p, q);", ident(p->sym->name), p->sym->name); else fprintf(fout, "\n\t\t\tsoap_traverse_%s(soap, this->%s + i, \"%s\", p, q);", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name), ident(p->sym->name)); fprintf(fout, "\n\t\t}\n\t\tif (q) q(soap, (void*)this, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout, "\n\t}\n}"); return; } } else { if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap *soap, %s, const char *s, soap_walker p, soap_walker q)\n{", c_ident(typ), c_type_id(typ, "*a")); if (is_binary(typ)) { fprintf(fout, "\n\tif (a->%s && !soap_array_reference(soap, a, a->%s, a->__size, %s))\n\t{", ident(p->sym->name), ident(p->sym->name), soap_type(typ)); fprintf(fout, "\n\t\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout, "\n\t\tif (p) p(soap, (void*)a->%s, 0, \"%s\", NULL);", ident(p->sym->name), p->sym->name); if (is_attachment(typ)) { fprintf(fout, "\n\t\tif (a->id || a->type)\n\t\t\tsoap->mode |= SOAP_ENC_DIME;\n}"); fprintf(fout, "\n\t\tif (p) p(soap, (void*)a->id, SOAP_TYPE_string, \"id\", NULL);"); fprintf(fout, "\n\t\tif (q) q(soap, (void*)a->id, SOAP_TYPE_string, \"id\", NULL);"); fprintf(fout, "\n\t\tif (p) p(soap, (void*)a->type, SOAP_TYPE_string, \"type\", NULL);"); fprintf(fout, "\n\t\tif (q) q(soap, (void*)a->type, SOAP_TYPE_string, \"type\", NULL);"); fprintf(fout, "\n\t\tif (p) p(soap, (void*)a->options, 0, \"options\", NULL);"); fprintf(fout, "\n\t\tif (q) q(soap, (void*)a->options, 0, \"options\", NULL);"); } fprintf(fout, "\n\t\tif (q) q(soap, (void*)a->%s, 0, \"%s\", NULL);", ident(p->sym->name), p->sym->name); fprintf(fout, "\n\t\tif (q) q(soap, (void*)a, %s, s, \"%s\");\n\t}\n}", soap_type(typ), c_type(typ)); fflush(fout); return; } else { fprintf(fout, "\n\tsize_t i;"); d = get_Darraydims(typ); if (d) { fprintf(fout, "\n\tif (a->%s && !soap_array_reference(soap, a, a->%s, %s, %s))\n\t{", ident(p->sym->name), ident(p->sym->name), get_Darraysize("a", d), soap_type(typ)); fprintf(fout, "\n\t\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout, "\n\t\tfor (i = 0; i < soap_size(a->__size, %d); i++)", d); } else { fprintf(fout, "\n\tif (a->%s && !soap_array_reference(soap, a, a->%s, a->__size, %s))\n\t{", ident(p->sym->name), ident(p->sym->name), soap_type(typ)); fprintf(fout, "\n\t\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout, "\n\t\tfor (i = 0; i < (size_t)a->__size; i++)"); } fprintf(fout, "\n\t\t{"); if (has_ptr((Tnode*)p->info.typ->ref)) fprintf(fout, "\tsoap_embedded(soap, a->%s + i, %s);", ident(p->sym->name), soap_type((Tnode*)p->info.typ->ref)); if (((Tnode*)p->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->info.typ->ref) && !is_volatile((Tnode*)p->info.typ->ref) && !is_typedef((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\ta->%s[i].soap_traverse(soap, \"%s\", p, q);", ident(p->sym->name), p->sym->name); else fprintf(fout, "\n\t\t\tsoap_traverse_%s(soap, a->%s + i, \"%s\", p, q);", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name), p->sym->name); fprintf(fout, "\n\t\t}\n\t\tif (q) q(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout, "\n\t}\n}"); fflush(fout); return; } } } switch(typ->type) { case Tclass: if (!is_volatile(typ)) { if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ), c_type_id(typ, "*")); return; } table=(Table*)typ->ref; fprintf(fout, "\n\nvoid %s::soap_traverse(struct soap *soap, const char *s, soap_walker p, soap_walker q)\n{", ident(typ->id->name)); fprintf(fout, "\n\t(void)soap; /* appease -Wall -Werror */"); fprintf(fout, "\n\tif (p) p(soap, (void*)this, %s, s, \"%s\");", soap_type(typ), c_type(typ)); for (t = table; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun || p->info.typ->type == Tunion || is_soapref(p->info.typ)) ; else if (p->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name)); else if (is_transient(p->info.typ)) fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); else if (p->info.sto & Sattribute) ; else if (is_repetition(p)) { fprintf(fout, "\n\tif (this->%s::%s)", ident(t->sym->name), ident(p->next->sym->name)); fprintf(fout, "\n\t{\tint i;\n\t\tfor (i = 0; i < (int)this->%s::%s; i++)\n\t\t{", ident(t->sym->name), ident(p->sym->name)); if (!is_invisible(p->next->sym->name)) if (has_ptr((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_embedded(soap, this->%s::%s + i, %s);", ident(t->sym->name), ident(p->next->sym->name), soap_type((Tnode*)p->next->info.typ->ref)); if (((Tnode*)p->next->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->next->info.typ->ref) && !is_volatile((Tnode*)p->next->info.typ->ref) && !is_typedef((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tthis->%s::%s[i].soap_traverse(soap, \"%s\", p, q);", ident(t->sym->name), ident(p->next->sym->name), p->next->sym->name); else fprintf(fout, "\n\t\t\tsoap_traverse_%s(soap, this->%s::%s + i, \"%s\", p, q);", c_ident((Tnode*)p->next->info.typ->ref), ident(t->sym->name), ident(p->next->sym->name), p->next->sym->name); fprintf(fout, "\n\t\t}\n\t}"); p = p->next; } else if (is_anytype(p)) { p = p->next; } else if (is_choice(p)) { fprintf(fout, "\n\tsoap_traverse_%s(soap, this->%s::%s, &this->%s::%s, \"%s\", p, q);", c_ident(p->next->info.typ), ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->next->sym->name), p->next->sym->name); p = p->next; } else if (p->info.typ->type == Tarray) { if (has_ptr(p->info.typ)) fprintf(fout, "\n\tsoap_embedded(soap, this->%s::%s, %s);", ident(t->sym->name), ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout, "\n\tsoap_traverse_%s(soap, this->%s::%s, \"%s\", p, q);", c_ident(p->info.typ), ident(t->sym->name), ident(p->sym->name), p->sym->name); } else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { if (has_ptr(p->info.typ)) fprintf(fout, "\n\tsoap_embedded(soap, &this->%s::%s, %s);", ident(t->sym->name), ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout, "\n\tthis->%s::%s.soap_traverse(soap, \"%s\", p, q);", ident(t->sym->name), ident(p->sym->name), p->sym->name); } else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { if (!is_template(p->info.typ)) if (has_ptr(p->info.typ)) fprintf(fout, "\n\tsoap_embedded(soap, &this->%s::%s, %s);", ident(t->sym->name), ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout, "\n\tsoap_traverse_%s(soap, &this->%s::%s, \"%s\", p, q);", c_ident(p->info.typ), ident(t->sym->name), ident(p->sym->name), p->sym->name); } } } fprintf(fout, "\n\tif (q) q(soap, (void*)this, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout, "\n}"); break; } /* fall through to next case when class is volatile, since serializers cannot be member functions */ case Tstruct: if (is_external(typ) && !is_volatile(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ), c_type_id(typ, "*")); if (!typ->ref) return; fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap *soap, %s, const char *s, soap_walker p, soap_walker q)\n{", c_ident(typ), c_type_id(typ, "*a")); fprintf(fout, "\n\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); table=(Table*)typ->ref; for (t = table; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun || p->info.typ->type == Tunion || is_soapref(p->info.typ)) ; else if (p->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name)); else if (is_transient(p->info.typ)) fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); else if (p->info.sto & Sattribute) ; else if (is_repetition(p)) { fprintf(fout, "\n\tif (a->%s)", ident(p->next->sym->name)); fprintf(fout, "\n\t{\tint i;\n\t\tfor (i = 0; i < (int)a->%s; i++)\n\t\t{", ident(p->sym->name)); if (!is_invisible(p->next->sym->name)) if (has_ptr((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_embedded(soap, a->%s + i, %s);", ident(p->next->sym->name), soap_type((Tnode*)p->next->info.typ->ref)); if (((Tnode*)p->next->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->next->info.typ->ref) && !is_volatile((Tnode*)p->next->info.typ->ref) && !is_typedef((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\ta->%s[i].soap_traverse(soap, \"%s\", p, q);", ident(p->next->sym->name), p->next->sym->name); else fprintf(fout, "\n\t\t\tsoap_traverse_%s(soap, a->%s + i, \"%s\", p, q);", c_ident((Tnode*)p->next->info.typ->ref), ident(p->next->sym->name), p->next->sym->name); fprintf(fout, "\n\t\t}\n\t}"); p = p->next; } else if (is_anytype(p)) { p = p->next; } else if (is_choice(p)) { fprintf(fout, "\n\tsoap_traverse_%s(soap, a->%s, &a->%s, \"%s\", p, q);", c_ident(p->next->info.typ), ident(p->sym->name), ident(p->next->sym->name), p->next->sym->name); p = p->next; } else if (p->info.typ->type == Tarray) { if (has_ptr(p->info.typ)) fprintf(fout, "\n\tsoap_embedded(soap, a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout, "\n\tsoap_traverse_%s(soap, a->%s, \"%s\", p, q);", c_ident(p->info.typ), ident(p->sym->name), p->sym->name); } else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { if (has_ptr(p->info.typ)) fprintf(fout, "\n\tsoap_embedded(soap, &a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout, "\n\ta->%s.soap_traverse(soap, \"%s\", p, q);", ident(p->sym->name), p->sym->name); } else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { if (!is_template(p->info.typ)) if (has_ptr(p->info.typ)) fprintf(fout, "\n\tsoap_embedded(soap, &a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout, "\n\tsoap_traverse_%s(soap, &a->%s, \"%s\", p, q);", c_ident(p->info.typ), ident(p->sym->name), p->sym->name); } } } fprintf(fout, "\n\tif (q) q(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout, "\n}"); break; case Tunion: if (is_external(typ) && !is_volatile(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_traverse_%s(struct soap*, int, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ), c_type_id(typ, "*")); return; } table = (Table*)typ->ref; fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap*, int, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap *soap, int choice, %s, const char *s, soap_walker p, soap_walker q)\n{", c_ident(typ), c_type_id(typ, "*a")); fprintf(fout, "\n\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout, "\n\tswitch (choice)\n\t{"); for (t = table; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun || p->info.typ->type == Tunion) ; else if (p->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name)); else if (is_transient(p->info.typ)) fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); else if (p->info.sto & Sattribute) ; else if (is_repetition(p)) ; else if (is_anytype(p)) ; else if (p->info.typ->type == Tarray) { fprintf(fout, "\n\tcase %s:", soap_union_member(typ, p)); if (has_ptr(p->info.typ)) fprintf(fout, "\n\t\tsoap_embedded(soap, a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout, "\n\t\tsoap_traverse_%s(soap, a->%s, \"%s\", p, q);", c_ident(p->info.typ), ident(p->sym->name), p->sym->name); fprintf(fout, "\n\t\tbreak;"); } else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { fprintf(fout, "\n\tcase %s:", soap_union_member(typ, p)); if (has_ptr(p->info.typ)) fprintf(fout, "\n\t\tsoap_embedded(soap, &a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout, "\n\t\ta->%s.soap_traverse(soap, \"%s\", p, q);", ident(p->sym->name), p->sym->name); fprintf(fout, "\n\t\tbreak;"); } else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { fprintf(fout, "\n\tcase %s:", soap_union_member(typ, p)); if (has_ptr(p->info.typ)) fprintf(fout, "\n\t\tsoap_embedded(soap, &a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout, "\n\t\tsoap_traverse_%s(soap, &a->%s, \"%s\", p, q);", c_ident(p->info.typ), ident(p->sym->name), p->sym->name); fprintf(fout, "\n\t\tbreak;"); } } } fprintf(fout, "\n\tdefault:\n\t\tbreak;\n\t}"); fprintf(fout, "\n\tif (q) q(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout, "\n}"); break; case Tpointer: if (((Tnode*)typ->ref)->type == Tclass && !is_external((Tnode*)typ->ref) && !is_volatile((Tnode*)typ->ref) && !is_typedef((Tnode*)typ->ref)) { if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap *soap, %s, const char *s, soap_walker p, soap_walker q)\n{", c_ident(typ), c_type_id(typ, "*a")); p = is_dynamic_array((Tnode*)typ->ref); if (p) { d = get_Darraydims((Tnode*)typ->ref); if (d) fprintf(fout, "\n\tif (*a)"); else fprintf(fout, "\n\tif (*a)"); } else fprintf(fout, "\n\tif (!soap_reference(soap, *a, %s))", soap_type((Tnode*)typ->ref)); fprintf(fout, "\n\t\t(*a)->soap_traverse(soap, s, p, q);\n}"); } else { if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap *soap, %s, const char *s, soap_walker p, soap_walker q)\n{", c_ident(typ), c_type_id(typ, "*a")); if (is_primitive((Tnode*)typ->ref)) { fprintf(fout, "\n\tif (!soap_reference(soap, *a, %s))\n\t{", soap_type(typ)); fprintf(fout, "\n\t\tif (p) p(soap, (void*)*a, %s, s, \"%s\");", soap_type((Tnode*)typ->ref), c_type((Tnode*)typ->ref)); fprintf(fout, "\n\t\tif (q) q(soap, (void*)*a, %s, s, \"%s\");\n\t}\n}", soap_type((Tnode*)typ->ref), c_type((Tnode*)typ->ref)); } else if ((p = is_dynamic_array((Tnode*)typ->ref)) != NULL) { d = get_Darraydims((Tnode*)typ->ref); if (d) fprintf(fout, "\n\tif (*a)"); else fprintf(fout, "\n\tif (*a)"); fprintf(fout, "\n\t\tsoap_traverse_%s(soap, *a, s, p, q);\n}", c_ident((Tnode*)typ->ref)); } else { fprintf(fout, "\n\tif (!soap_reference(soap, *a, %s))", soap_type((Tnode*)typ->ref)); fprintf(fout, "\n\t\tsoap_traverse_%s(soap, *a, s, p, q);\n}", c_ident((Tnode*)typ->ref)); } } break; case Tarray: if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ), c_type(typ)); return; } fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ), c_type(typ)); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap *soap, %s, const char *s, soap_walker p, soap_walker q)", c_ident(typ), c_type_id(typ, "a")); if (is_primitive((Tnode*)typ->ref)) { fprintf(fout, "\n{"); fprintf(fout, "\n\t(void)soap; (void)a; /* appease -Wall -Werror */"); fprintf(fout, "\n\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); } else { fprintf(fout, "\n{\tsize_t i;"); fprintf(fout, "\n\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout, "\n\tfor (i = 0; i < %d; i++)", get_dimension(typ)); temp=(Tnode*)typ->ref;; cardinality = 1; while (temp->type == Tarray) { temp=(Tnode*)temp->ref; cardinality++; } fprintf(fout, "\n\t{"); if (has_ptr((Tnode*)typ->ref)) { fprintf(fout, "\tsoap_embedded(soap, a"); if (cardinality > 1) fprintf(fout, "[i]"); else fprintf(fout, "+i"); fprintf(fout, ", %s);", soap_type((Tnode*)typ->ref)); } if (((Tnode *)typ->ref)->type == Tclass && !is_external((Tnode*)typ->ref) && !is_volatile((Tnode*)typ->ref) && !is_typedef((Tnode*)typ->ref)) { fprintf(fout, "\n\ta[i].soap_traverse(soap, s, p, q)"); } else if (!is_primitive((Tnode*)typ->ref)) { fprintf(fout, "\n\tsoap_traverse_%s(soap, a", c_ident((Tnode*)typ->ref)); if (cardinality > 1) fprintf(fout, "[i], s, p, q)"); else fprintf(fout, "+i, s, p, q)"); } fprintf(fout, ";\n\t}"); } fprintf(fout, "\n\tif (q) q(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout, "\n}"); break; case Ttemplate: if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ), c_type_id(typ, "*")); temp = (Tnode*)typ->ref; if (!temp) return; fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap *soap, %s, const char *s, soap_walker p, soap_walker q)\n{\n\t(void)soap; (void)a; (void)s; (void)p; (void)q; /* appease -Wall -Werror */", c_ident(typ), c_type_id(typ, "*a")); if (!is_primitive(temp) && temp->type != Tfun && !is_void(temp)) { fprintf(fout, "\n\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout, "\n\tfor (%s::iterator i = a->begin(); i != a->end(); ++i)", c_type(typ)); if (temp->type == Tclass && !is_external(temp) && !is_volatile(temp) && !is_typedef(temp)) fprintf(fout, "\n\t\t(*i).soap_traverse(soap, s, p, q);"); else fprintf(fout, "\n\t\tsoap_traverse_%s(soap, &(*i), s, p, q);", c_ident(temp)); fprintf(fout, "\n\tif (q) q(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); } fprintf(fout, "\n}"); default: break; } } void soap_put(Tnode *typ) { const char *ci = c_ident(typ); const char *ct = c_type(typ); if (typ->type == Ttemplate || typ->type == Tunion) return; if (is_typedef(typ) && (is_element(typ) || is_synonym(typ))) { fprintf(fhead, "\n\n#define soap_put_%s soap_put_%s\n", c_ident(typ), t_ident(typ)); fprintf(fhead, "\n\n#define soap_write_%s soap_write_%s\n", c_ident(typ), t_ident(typ)); return; } if (typ->type == Tarray) { fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_put_%s(struct soap*, %s, const char*, const char*);", ci, c_type_id(typ, "const")); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_put_%s(struct soap *soap, %s, const char *tag, const char *type)\n{", ci, c_type_id(typ, "const a")); } else if (typ->type == Tclass && !is_external(typ) && !is_volatile(typ) && !is_typedef(typ)) fprintf(fout, "\n\nint %s::soap_put(struct soap *soap, const char *tag, const char *type) const\n{", ct); else if (typ->type == Tpointer) { fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_put_%s(struct soap*, %s, const char*, const char*);", ci, c_type_constptr_id(typ, "const*")); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_put_%s(struct soap *soap, %s, const char *tag, const char *type)\n{", ci, c_type_constptr_id(typ, "const*a")); } else { fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_put_%s(struct soap*, const %s, const char*, const char*);", ci, c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_put_%s(struct soap *soap, const %s, const char *tag, const char *type)\n{", ci, c_type_id(typ, "*a")); } fflush(fout); if (typ->type == Tclass && !is_external(typ) && !is_volatile(typ) && !is_typedef(typ)) fprintf(fout, "\n\tif (this->soap_out(soap, tag?tag:\"%s\", -2, type))\n\t\treturn soap->error;", xml_tag(typ)); else fprintf(fout, "\n\tif (soap_out_%s(soap, tag?tag:\"%s\", -2, a, type))\n\t\treturn soap->error;", ci, xml_tag(typ)); if (!is_invisible(typ->id->name)) fprintf(fout, "\n\treturn soap_putindependent(soap);\n}"); else fprintf(fout, "\n\treturn SOAP_OK;\n}"); #if 0 /* some compilers cannot handle this inlined function */ if (typ->type == Tclass && !is_external(typ) && !is_volatile(typ)) fprintf(fhead, "\n\ninline int soap_write_%s(struct soap *soap, %s) { if (p->soap_put(soap, \"%s\", NULL) || soap_end_send(soap)) return soap->error; return SOAP_OK; }\n", c_ident(typ), c_type_id(typ, "*p"), xml_tag(typ)); else if (typ->type != Treference) fprintf(fhead, "\n\ninline int soap_write_%s(struct soap *soap, %s) { if (soap_begin_send(soap) || soap_put_%s(soap, p, \"%s\", NULL) || soap_end_send(soap)) return soap->error; return SOAP_OK; }\n", c_ident(typ), c_type_id(typ, "*p"), c_ident(typ), xml_tag(typ)); #endif if (typ->type == Tclass && !is_external(typ) && !is_volatile(typ)) fprintf(fhead, "\n\n#ifndef soap_write_%s\n#define soap_write_%s(soap, data) ( soap_free_temp(soap), soap_begin_send(soap) || ((data)->soap_serialize(soap), 0) || (data)->soap_put(soap, \"%s\", NULL) || soap_end_send(soap), (soap)->error )\n#endif\n", c_ident(typ), c_ident(typ), xml_tag(typ)); else if (is_primitive(typ)) { if (namespaceid) fprintf(fhead, "\n\n#ifndef soap_write_%s\n#define soap_write_%s(soap, data) ( soap_free_temp(soap), soap_begin_send(soap) || %s::soap_put_%s(soap, data, \"%s\", NULL) || soap_end_send(soap), (soap)->error )\n#endif\n", c_ident(typ), c_ident(typ), namespaceid, c_ident(typ), xml_tag(typ)); else fprintf(fhead, "\n\n#ifndef soap_write_%s\n#define soap_write_%s(soap, data) ( soap_free_temp(soap), soap_begin_send(soap) || soap_put_%s(soap, data, \"%s\", NULL) || soap_end_send(soap), (soap)->error )\n#endif\n", c_ident(typ), c_ident(typ), c_ident(typ), xml_tag(typ)); } else if (typ->type != Treference) { if (namespaceid && (Qflag || !is_external(typ))) fprintf(fhead, "\n\n#ifndef soap_write_%s\n#define soap_write_%s(soap, data) ( soap_free_temp(soap), soap_begin_send(soap) || (%s::soap_serialize_%s(soap, data), 0) || %s::soap_put_%s(soap, data, \"%s\", NULL) || soap_end_send(soap), (soap)->error )\n#endif\n", c_ident(typ), c_ident(typ), namespaceid, c_ident(typ), namespaceid, c_ident(typ), xml_tag(typ)); else if (namespaceid) fprintf(fhead, "\n\n#ifndef soap_write_%s\n#define soap_write_%s(soap, data) ( soap_free_temp(soap), soap_begin_send(soap) || (soap_serialize_%s(soap, data), 0) || %s::soap_put_%s(soap, data, \"%s\", NULL) || soap_end_send(soap), (soap)->error )\n#endif\n", c_ident(typ), c_ident(typ), c_ident(typ), namespaceid, c_ident(typ), xml_tag(typ)); else fprintf(fhead, "\n\n#ifndef soap_write_%s\n#define soap_write_%s(soap, data) ( soap_free_temp(soap), soap_begin_send(soap) || (soap_serialize_%s(soap, data), 0) || soap_put_%s(soap, data, \"%s\", NULL) || soap_end_send(soap), (soap)->error )\n#endif\n", c_ident(typ), c_ident(typ), c_ident(typ), c_ident(typ), xml_tag(typ)); } fflush(fout); } Entry * is_dynamic_array(Tnode *typ) { Entry *p; Table *t; if ((typ->type == Tstruct || typ->type == Tclass) && typ->ref) { for (t = (Table*)typ->ref; t; t = t->prev) { p = t->list; while (p && p->info.typ->type == Tfun) p = p->next; if (p && (p->info.typ->type == Tpointer || is_smart(p->info.typ)) && !strncmp(ident(p->sym->name), "__ptr", 5)) if (p->next && (p->next->info.typ->type == Tint || (p->next->info.typ->type == Tarray && (((Tnode*)p->next->info.typ->ref)->type == Tint))) && !strcmp(ident(p->next->sym->name), "__size")) return p; } } return NULL; } Entry * is_discriminant(Tnode *typ) { Entry *p; Table *t; if ((typ->type == Tstruct || typ->type == Tclass) && typ->ref) { t = (Table*)typ->ref; /* only if this struct/class has a union and is not derived */ if (t && !t->prev) { p = t->list; if (p && p->info.typ->type == Tint && ((p->info.sto & Sspecial) || !strncmp(ident(p->sym->name), "__union", 7))) if (p->next && p->next->info.typ->type == Tunion) { Entry *q; for (q = p->next->next; q; q = q->next) { if (q->info.typ->type != Tfun && !is_void(q->info.typ) && !is_transient(q->info.typ)) return NULL; } return p; } } } return NULL; } int get_Darraydims(Tnode *typ) { Entry *p; Table *t; if ((typ->type == Tstruct || typ->type == Tclass) && typ->ref) { for (t = (Table*)typ->ref; t; t = t->prev) { p = t->list; while (p && p->info.typ->type == Tfun) p = p->next; if (p && (p->info.typ->type == Tpointer || is_smart(p->info.typ)) && !strncmp(ident(p->sym->name), "__ptr", 5)) if (p->next && p->next->info.typ->type == Tarray && ((Tnode*)p->next->info.typ->ref)->type == Tint && !strcmp(ident(p->next->sym->name), "__size")) return get_dimension(p->next->info.typ); } } return 0; } const char* get_Darraysize(const char *a, int d) { int i; char *s = (char*)emalloc(d * (strlen(a) + 16) + 1); *s = '\0'; for (i = 0; i < d; i++) { size_t l = strlen(s); sprintf(s + l, "%s%s->__size[%d]", i ? " * " : "", a, i); } return s; } int has_offset(Tnode *typ) { Entry *p; Table *t; if (typ->type == Tstruct || typ->type == Tclass) { for (t = (Table*)typ->ref; t; t = t->prev) { for (p = t->list; p; p = p->next) { if ((p->info.typ->type == Tint || (p->info.typ->type == Tarray && ((Tnode*)p->info.typ->ref)->type == Tint)) && !strcmp(ident(p->sym->name), "__offset")) return 1; } } } return 0; } int is_bool(Tnode *typ) { return (typ->type == Tenum && (Table*)typ->ref == booltable); } int is_boolean(Tnode *typ) { if (typ->type == Tenum) { if ((Table*)typ->ref == booltable) return 1; else { size_t n = strlen(ident(typ->id->name)); return n >= 7 && is_eq(ident(typ->id->name) + n - 7, "boolean"); } } return 0; } int is_hexBinary(Tnode *typ) { if (!is_binary(typ)) return 0; if (typ->sym) return typ->sym->name && strstr(typ->sym->name, "hex"); return typ->id && typ->id->name && strstr(typ->id->name, "hex"); } int is_binary(Tnode *typ) { if (!has_ns(typ) && !is_element(typ)) return 0; if (typ->type == Tstruct || typ->type == Tclass) { Table *t; for (t = (Table*)typ->ref; t; t = t->prev) { Entry *p; p = t->list; while (p && p->info.typ->type == Tfun) p = p->next; if (p && (p->info.typ->type == Tpointer || is_smart(p->info.typ)) && ((Tnode*)p->info.typ->ref)->type == Tuchar && !strcmp(ident(p->sym->name), "__ptr")) { p = p->next; return p && p->info.typ->type == Tint && !strcmp(ident(p->sym->name), "__size"); } } } return 0; } int is_attachment(Tnode *typ) { Entry *p; Table *t; if (!is_binary(typ) || is_transient(typ)) return 0; for (t = (Table*)typ->ref; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (is_string(p->info.typ) && !strcmp(p->sym->name, "id")) { p = p->next; if (!p || !is_string(p->info.typ) || strcmp(p->sym->name, "type")) break; p = p->next; if (!p || !is_string(p->info.typ) || strcmp(p->sym->name, "options")) break; return 1; } } } return 0; } int is_mutable(Entry *e) { return e->info.typ->transient == -4 || is_header_or_fault(e->info.typ); } int is_header_or_fault(Tnode *typ) { if (typ->type == Tpointer || typ->type == Treference) return is_header_or_fault((Tnode*)typ->ref); return (typ->type == Tstruct || typ->type == Tclass) && (!strcmp(ident(typ->id->name), "SOAP_ENV__Header") || !strcmp(ident(typ->id->name), "SOAP_ENV__Fault") || !strcmp(ident(typ->id->name), "SOAP_ENV__Code") || !strcmp(ident(typ->id->name), "SOAP_ENV__Detail") || !strcmp(ident(typ->id->name), "SOAP_ENV__Reason")); } int is_body(Tnode *typ) { if (typ->type == Tpointer || typ->type == Treference) return is_body((Tnode*)typ->ref); return (typ->type == Tstruct || typ->type == Tclass) && !strcmp(ident(typ->id->name), "SOAP_ENV__Body"); } long minlen(Tnode *typ) { if (!typ->hasmin || typ->min < 0 || typ->min > 2147483647) return 0; if (typ->incmin) return (long)typ->min; return (long)typ->min + 1; } long maxlen(Tnode *typ) { if (!typ->hasmax || typ->max < 0 || typ->max > 2147483647) return -1; if (typ->incmax) return (long)typ->max; return (long)typ->max - 1; } const char* pattern(Tnode *typ) { if (!typ->pattern || (typ->pattern[0] == '%' && typ->pattern[1])) return "NULL"; return cstring(typ->pattern, 1); } int is_soap12(const char *enc) { return !strcmp(envURI, "http://www.w3.org/2003/05/soap-envelope") || (enc && !strcmp(enc, "http://www.w3.org/2003/05/soap-encoding")); } int is_document(const char *style) { return soap_version < 0 || (!eflag && !style) || (style && !strcmp(style, "document")); } int is_literal(const char *encoding) { return soap_version < 0 || (!eflag && !encoding) || (encoding && !strcmp(encoding, "literal")); } const char * has_soapref(Tnode *typ) { Entry *p; Table *t; if (typ->type == Tstruct || typ->type == Tclass) for (t = (Table*)typ->ref; t; t = t->prev) for (p = t->list; p; p = p->next) if (is_soapref(p->info.typ) && (t == (Table*)typ->ref || !(p->info.sto & Sprivate))) return ident(p->sym->name); return NULL; } int is_soapref(Tnode *typ) { return typ->type == Tpointer && ((Tnode*)typ->ref)->type == Tstruct && ((Tnode*)typ->ref)->id == lookup("soap"); } const char * union_member(Tnode *typ) { Table *t; Entry *p, *q; for (p = classtable->list; p; p = p->next) if (p->info.typ->type == Tunion) for (t = (Table*)p->info.typ->ref; t; t = t->prev) for (q = t->list; q; q = q->next) if (typ == q->info.typ) return p->info.typ->id->name; return NULL; } int has_union(Tnode *typ) { Table *t; Entry *p; if (typ->type == Tclass || typ->type == Tstruct) { for (t = (Table*)typ->ref; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tunion) return 1; else if ((p->info.typ->type == Tstruct || p->info.typ->type == Tclass) && has_union(p->info.typ)) return 1; } } } return 0; } int has_constructor(Tnode *typ) { Table *t; Entry *p; if (typ->type == Tclass || typ->type == Tstruct) for (t = (Table*)typ->ref; t; t = t->prev) for (p = t->list; p; p = p->next) if (p->info.typ->type == Tfun && !strcmp(p->sym->name, typ->id->name) && ((FNinfo *)p->info.typ->ref)->ret->type == Tnone) if (!((FNinfo*)p->info.typ->ref)->args->list) return 1; return 0; } int has_destructor(Tnode *typ) { Entry *p; Table *t; if (typ->type == Tclass || typ->type == Tstruct) for (t = (Table*)typ->ref; t; t = t->prev) for (p = t->list; p; p = p->next) if (p->info.typ->type == Tfun && strchr(p->sym->name, '~')) return 1; return 0; } int has_getter(Tnode *typ) { Entry *p, *q; Table *t; if (typ->type == Tclass || (!cflag && typ->type == Tstruct)) { for (t = (Table*)typ->ref; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun && !strcmp(p->sym->name, "get") && ((FNinfo *)p->info.typ->ref)->ret->type == Tint) { q = ((FNinfo*)p->info.typ->ref)->args->list; if (q && q->info.typ->type == Tpointer && ((Tnode*)q->info.typ->ref)->type == Tstruct && ((Tnode*)q->info.typ->ref)->id == lookup("soap")) return 1; } } } } return 0; } int has_setter(Tnode *typ) { Entry *p, *q; Table *t; if (typ->type == Tclass || (!cflag && typ->type == Tstruct)) { for (t = (Table*)typ->ref; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun && !strcmp(p->sym->name, "set") && ((FNinfo *)p->info.typ->ref)->ret->type == Tint) { q = ((FNinfo*)p->info.typ->ref)->args->list; if (q && q->info.typ->type == Tpointer && ((Tnode*)q->info.typ->ref)->type == Tstruct && ((Tnode*)q->info.typ->ref)->id == lookup("soap")) return 1; } } } } return 0; } int is_primitive_or_string(Tnode *typ) { return is_primitive(typ) || is_string(typ) || is_wstring(typ) || is_stdstring(typ) || is_stdwstring(typ) || is_qname(typ) || is_stdqname(typ); } int is_primitive(Tnode *typ) { return typ->type >= Tchar && typ->type <= Tenumsc; } int is_string(Tnode *typ) { return typ->type == Tpointer && ((Tnode*)typ->ref)->type == Tchar && !((Tnode*)typ->ref)->sym; } int is_fixedstring(Tnode *typ) { return bflag && typ->type == Tarray && ((Tnode*)typ->ref)->type == Tchar; } int is_wstring(Tnode *typ) { return typ->type == Tpointer && ((Tnode*)typ->ref)->type == Twchar; } int is_stdstring(Tnode *typ) { return typ->type == Tclass && typ->id == lookup("std::string"); } int is_stdwstring(Tnode *typ) { return typ->type == Tclass && typ->id == lookup("std::wstring"); } int is_stdstr(Tnode *typ) { if (typ->type == Tpointer) return is_stdstring((Tnode*)typ->ref) || is_stdwstring((Tnode*)typ->ref); return is_stdstring(typ) || is_stdwstring(typ); } int is_typedef(Tnode *typ) { return typ->sym && !is_transient(typ); } /* synonym is a typedef of another typedef */ int is_synonym(Tnode *typ) { return is_typedef(typ) && typ->synonym != NULL; } int reflevel(Tnode *typ) { int level; for (level = 0; typ->type == Tpointer || is_smart(typ); level++) typ = (Tnode*)typ->ref; return level; } Tnode * reftype(Tnode *typ) { while ((typ->type == Tpointer && !is_string(typ) && !is_wstring(typ)) || typ->type == Treference || typ->type == Trvalueref || is_smart(typ)) typ = (Tnode*)typ->ref; return typ; } void soap_set_attr(Entry *p, const char *obj, const char *name, const char *tag) { Tnode *typ = p->info.typ; int flag = (p->info.minOccurs == 0 && !p->info.hasval); int pat = 0; if (p->info.sto & (Sconst | Sprivate | Sprotected)) return; if (typ->type == Treference || typ->type == Trvalueref) typ = typ->ref; if (p->info.typ->pattern && p->info.typ->pattern[0] == '%' && p->info.typ->pattern[1]) { if (typ->type == Tfloat) fprintf(fout, "\n\t{\tconst char *%s_tmp = soap->float_format;\n\t\tsoap->float_format = \"%s\";", name, p->info.typ->pattern); else if (typ->type == Tdouble) fprintf(fout, "\n\t{\tconst char *%s_tmp = soap->double_format;\n\t\tsoap->double_format = \"%s\";", name, p->info.typ->pattern); else if (typ->type == Tldouble) fprintf(fout, "\n\t{\tconst char *%s_tmp = soap->long_double_format;\n\t\tsoap->long_double_format = \"%s\";", name, p->info.typ->pattern); pat = 1; } if ((is_external(typ) || is_typedef(typ)) && !is_anyAttribute(typ) && !is_anyType(typ) && !is_smart(typ) && typ->type != Tpointer && !is_stdstr(typ) && !is_string(typ) && !is_wstring(typ) && !is_binary(typ)) fprintf(fout, "\n\tsoap_set_attr(soap, \"%s\", soap_%s2s(soap, %s->%s), 1);", tag, c_ident(typ), obj, name); else if (is_qname(typ)) fprintf(fout, "\n\tif (%s->%s)\n\t\tsoap_set_attr(soap, \"%s\", soap_QName2s(soap, (char*)%s->%s), 1);", obj, name, tag, obj, name); else if (is_string(typ)) fprintf(fout, "\n\tif (%s->%s)\n\t\tsoap_set_attr(soap, \"%s\", (char*)%s->%s, 1);", obj, name, tag, obj, name); else if (is_wstring(typ)) fprintf(fout, "\n\tif (%s->%s)\n\t\tsoap_set_attr(soap, \"%s\", soap_wchar2s(soap, (wchar_t*)%s->%s), 2);", obj, name, tag, obj, name); else if (is_stdqname(typ)) fprintf(fout, "\n\tif (!%s->%s.empty())\n\t\tsoap_set_attr(soap, \"%s\", soap_QName2s(soap, %s->%s.c_str()), 1);", obj, name, tag, obj, name); else if (is_stdstring(typ)) { if (flag) fprintf(fout, "\n\tif (!%s->%s.empty())", obj, name); fprintf(fout, "\n\tsoap_set_attr(soap, \"%s\", %s->%s.c_str(), 1);", tag, obj, name); } else if (is_stdwstring(typ)) { if (flag) fprintf(fout, "\n\tif (!%s->%s.empty())", obj, name); fprintf(fout, "\n\tsoap_set_attr(soap, \"%s\", soap_wchar2s(soap, %s->%s.c_str()), 2);", tag, obj, name); } else if (typ->type == Tllong || typ->type == Tullong) fprintf(fout, "\n\tsoap_set_attr(soap, \"%s\", soap_%s2s(soap, %s->%s), 1);", tag, c_type(typ), obj, name); else if (typ->type == Tenum || typ->type == Tenumsc) fprintf(fout, "\n\tsoap_set_attr(soap, \"%s\", soap_%s2s(soap, %s->%s), 1);", tag, c_ident(typ), obj, name); else if (is_smart(typ) || typ->type == Tpointer) { Tnode *ptr = (Tnode*)typ->ref; fprintf(fout, "\n\tif (%s->%s)", obj, name); if ((is_external(ptr) || is_typedef(ptr)) && !is_anyAttribute(ptr) && !is_anyType(ptr) && !is_stdstr(ptr) && !is_string(ptr) && !is_wstring(ptr) && !is_binary(ptr)) fprintf(fout, "\n\t\tsoap_set_attr(soap, \"%s\", soap_%s2s(soap, *%s->%s), 1);", tag, c_ident(ptr), obj, name); else if (is_qname(ptr)) fprintf(fout, "\n\t\tif (*%s->%s)\n\t\t\tsoap_set_attr(soap, \"%s\", soap_QName2s(soap, *(char**)%s->%s), 1);", obj, name, tag, obj, name); else if (is_string(ptr)) fprintf(fout, "\n\t\tif (*%s->%s)\n\t\t\tsoap_set_attr(soap, \"%s\", *(char**)%s->%s, 1);", obj, name, tag, obj, name); else if (is_wstring(ptr)) fprintf(fout, "\n\t\tif (*%s->%s)\n\t\t\tsoap_set_attr(soap, \"%s\", soap_wchar2s(soap, *(wchar_t**)%s->%s), 2);", obj, name, tag, obj, name); else if (ptr->type == Tllong || ptr->type == Tullong) fprintf(fout, "\n\t\tsoap_set_attr(soap, \"%s\", soap_%s2s(soap, *%s->%s), 1);", tag, c_type(ptr), obj, name); else if (ptr->type == Tenum || ptr->type == Tenumsc) fprintf(fout, "\n\t\tsoap_set_attr(soap, \"%s\", soap_%s2s(soap, *%s->%s), 1);", tag, c_ident(ptr), obj, name); else if (is_stdqname(ptr)) fprintf(fout, "\n\t\tsoap_set_attr(soap, \"%s\", soap_QName2s(soap, %s->%s->c_str()), 1);", tag, obj, name); else if (is_stdstring(ptr)) fprintf(fout, "\n\t\tsoap_set_attr(soap, \"%s\", %s->%s->c_str(), 1);", tag, obj, name); else if (is_stdwstring(ptr)) fprintf(fout, "\n\t\tsoap_set_attr(soap, \"%s\", soap_wchar2s(soap, %s->%s->c_str()), 2);", tag, obj, name); else if (is_primitive(ptr)) fprintf(fout, "\n\t\tsoap_set_attr(soap, \"%s\", soap_%s2s(soap, *%s->%s), 1);", tag, the_type(ptr), obj, name); else if (is_hexBinary(ptr)) fprintf(fout, "\n\t\tif (%s->%s->__ptr)\n\t\t\tsoap_set_attr(soap, \"%s\", soap_s2hex(soap, %s->%s->__ptr, NULL, %s->%s->__size), 1);", obj, name, tag, obj, name, obj, name); else if (is_binary(ptr)) fprintf(fout, "\n\t\tif (%s->%s->__ptr)\n\t\t\tsoap_set_attr(soap, \"%s\", soap_s2base64(soap, %s->%s->__ptr, NULL, %s->%s->__size), 1);", obj, name, tag, obj, name, obj, name); else if (is_anyAttribute(ptr)) fprintf(fout, "\n\t\tif (soap_out_%s(soap, \"%s\", -1, %s->%s, \"%s\"))\n\t\t\treturn soap->error;", c_ident(ptr), tag, obj, name, xsi_type_u(ptr)); else { sprintf(errbuf, "Member '%s' cannot be serialized as an XML attribute", name); semwarn(errbuf); } } else if (is_primitive(typ)) fprintf(fout, "\n\tsoap_set_attr(soap, \"%s\", soap_%s2s(soap, %s->%s), 1);", tag, the_type(typ), obj, name); else if (is_hexBinary(typ)) fprintf(fout, "\n\tif (%s->%s.__ptr)\n\t\tsoap_set_attr(soap, \"%s\", soap_s2hex(soap, %s->%s.__ptr, NULL, %s->%s.__size), 1);", obj, name, tag, obj, name, obj, name); else if (is_binary(typ)) fprintf(fout, "\n\tif (%s->%s.__ptr)\n\t\tsoap_set_attr(soap, \"%s\", soap_s2base64(soap, %s->%s.__ptr, NULL, %s->%s.__size), 1);", obj, name, tag, obj, name, obj, name); else if (is_anyAttribute(typ)) fprintf(fout, "\n\tif (soap_out_%s(soap, \"%s\", -1, &%s->%s, \"%s\"))\n\t\treturn soap->error;", c_ident(typ), tag, obj, name, xsi_type_u(typ)); else { sprintf(errbuf, "Member '%s' cannot be serialized as an XML attribute", name); semwarn(errbuf); } if (pat) { if (typ->type == Tfloat) fprintf(fout, "\n\t\tsoap->float_format = %s_tmp;\n\t}", name); else if (typ->type == Tdouble) fprintf(fout, "\n\t\tsoap->double_format = %s_tmp;\n\t}", name); else if (typ->type == Tldouble) fprintf(fout, "\n\t\tsoap->long_double_format = %s_tmp;\n\t}", name); } } void soap_attr_value(Entry *p, const char *obj, const char *name, const char *tag) { int flag = 0; Tnode *typ = p->info.typ; if (p->info.sto & (Sconst | Sprivate | Sprotected)) return; if (typ->type == Treference || typ->type == Trvalueref) typ = typ->ref; if (p->info.maxOccurs == 0) flag = 2; /* prohibited */ else if (p->info.minOccurs >= 1 && !p->info.hasval) flag = 1; /* required */ if (sflag && flag) flag += 2; /* prohibited/required if SOAP_XML_STRICT */ if ((is_external(typ) || is_typedef(typ)) && !is_anyAttribute(typ) && !is_anyType(typ) && !is_smart(typ) && typ->type != Tpointer && !is_stdstr(typ) && !is_string(typ) && !is_wstring(typ) && !is_binary(typ)) fprintf(fout, "\n\tif (soap_s2%s(soap, soap_attr_value(soap, \"%s\", %d), &%s->%s))\n\t\treturn NULL;", c_ident(typ), tag, flag, obj, name); else if (typ->type == Tllong || typ->type == Tullong) fprintf(fout, "\n\tif (soap_s2%s(soap, soap_attr_value(soap, \"%s\", %d), &%s->%s))\n\t\treturn NULL;", c_type(typ), tag, flag, obj, name); else if (typ->type == Tenum || typ->type == Tenumsc) fprintf(fout, "\n\tif (soap_s2%s(soap, soap_attr_value(soap, \"%s\", %d), &%s->%s))\n\t\treturn NULL;", c_ident(typ), tag, flag, obj, name); else if (is_qname(typ)) fprintf(fout, "\n\tif (soap_s2QName(soap, soap_attr_value(soap, \"%s\", %d), (char**)&%s->%s, %ld, %ld))\n\t\treturn NULL;", tag, flag, obj, name, minlen(typ), maxlen(typ)); else if (is_string(typ)) fprintf(fout, "\n\tif (soap_s2string(soap, soap_attr_value(soap, \"%s\", %d), (char**)&%s->%s, %ld, %ld))\n\t\treturn NULL;", tag, flag, obj, name, minlen(typ), maxlen(typ)); else if (is_wstring(typ)) fprintf(fout, "\n\tif (soap_s2wchar(soap, soap_attr_value(soap, \"%s\", %d), (wchar_t**)&%s->%s, %ld, %ld))\n\t\treturn NULL;", tag, flag, obj, name, minlen(typ), maxlen(typ)); else if (is_stdqname(typ)) fprintf(fout, "\n\tif (soap_s2std__QName(soap, soap_attr_value(soap, \"%s\", %d), &%s->%s, %ld, %ld))\n\t\treturn NULL;", tag, flag, obj, name, minlen(typ), maxlen(typ)); else if (is_stdstring(typ)) fprintf(fout, "\n\tif (soap_s2std__string(soap, soap_attr_value(soap, \"%s\", %d), &%s->%s, %ld, %ld))\n\t\treturn NULL;", tag, flag, obj, name, minlen(typ), maxlen(typ)); else if (is_stdwstring(typ)) fprintf(fout, "\n\tif (soap_s2std__wstring(soap, soap_attr_value(soap, \"%s\", %d), &%s->%s, %ld, %ld))\n\t\treturn NULL;", tag, flag, obj, name, minlen(typ), maxlen(typ)); else if (is_smart(typ) || typ->type == Tpointer) { Tnode *ptr = (Tnode*)typ->ref; const char *get = ""; if (!is_anyAttribute(ptr) && !is_anyType(ptr)) fprintf(fout, "\n\t{\tconst char *t = soap_attr_value(soap, \"%s\", %d);\n\t\tif (t)\n\t\t{", tag, flag); if (is_smart(typ)) { fprintf(fout, "\n\t\t\t%s->%s = %s(SOAP_NEW(%s));", obj, name, c_type(typ), c_type(ptr)); get = ".get()"; } else if (is_stdstr(ptr)) fprintf(fout, "\n\t\t\tif (!(%s->%s = soap_new_%s(soap)))\n\t\t\t{\tsoap->error = SOAP_EOM;\n\t\t\t\treturn NULL;\n\t\t\t}", obj, name, c_ident(ptr)); else fprintf(fout, "\n\t\t\tif (!(%s->%s = (%s)soap_malloc(soap, sizeof(%s))))\n\t\t\t{\tsoap->error = SOAP_EOM;\n\t\t\t\treturn NULL;\n\t\t\t}", obj, name, c_type(typ), c_type(ptr)); if ((is_external(ptr) || is_typedef(ptr)) && !is_anyAttribute(ptr) && !is_anyType(ptr) && !is_stdstr(ptr) && !is_string(ptr) && !is_wstring(ptr) && !is_binary(ptr)) fprintf(fout, "\n\t\t\tif (soap_s2%s(soap, t, %s->%s%s))\n\t\t\t\treturn NULL;", c_ident(ptr), obj, name, get); else if (ptr->type == Tllong || ptr->type == Tullong) fprintf(fout, "\n\t\t\tif (soap_s2%s(soap, t, %s->%s%s))\n\t\t\t\treturn NULL;", c_type(ptr), obj, name, get); else if (ptr->type == Tenum || ptr->type == Tenumsc) fprintf(fout, "\n\t\t\tif (soap_s2%s(soap, t, %s->%s%s))\n\t\t\t\treturn NULL;", c_ident(ptr), obj, name, get); else if (is_qname(ptr)) fprintf(fout, "\n\t\t\tif (soap_s2QName(soap, t, (char**)%s->%s%s, %ld, %ld))\n\t\t\t\treturn NULL;", obj, name, get, minlen(ptr), maxlen(ptr)); else if (is_string(ptr)) fprintf(fout, "\n\t\t\tif (soap_s2string(soap, t, (char**)%s->%s%s, %ld, %ld))\n\t\t\t\treturn NULL;", obj, name, get, minlen(ptr), maxlen(ptr)); else if (is_wstring(ptr)) fprintf(fout, "\n\t\t\tif (soap_s2wchar(soap, t, (wchar_t**)%s->%s%s, %ld, %ld))\n\t\t\t\treturn NULL;", obj, name, get, minlen(ptr), maxlen(ptr)); else if (is_stdqname(ptr)) fprintf(fout, "\n\t\t\tif (soap_s2std__QName(soap, t, %s->%s%s, %ld, %ld))\n\t\t\t\treturn NULL;", obj, name, get, minlen(ptr), maxlen(ptr)); else if (is_stdstring(ptr)) fprintf(fout, "\n\t\t\tif (soap_s2std__string(soap, t, %s->%s%s, %ld, %ld))\n\t\t\t\treturn NULL;", obj, name, get, minlen(ptr), maxlen(ptr)); else if (is_stdwstring(ptr)) fprintf(fout, "\n\t\t\tif (soap_s2std__wstring(soap, t, %s->%s%s, %ld, %ld))\n\t\t\t\treturn NULL;", obj, name, get, minlen(ptr), maxlen(ptr)); else if (is_hexBinary(ptr)) fprintf(fout, "\n\t\t\tif (!(%s->%s->__ptr = (unsigned char*)soap_hex2s(soap, t, NULL, 0, &%s->%s->__size)))\n\t\t\t\treturn NULL;", obj, name, obj, name); else if (is_binary(ptr)) fprintf(fout, "\n\t\t\tif (!(%s->%s->__ptr = (unsigned char*)soap_base642s(soap, t, NULL, 0, &%s->%s->__size)))\n\t\t\t\treturn NULL;", obj, name, obj, name); else if (is_smart(typ) && is_anyAttribute(ptr)) fprintf(fout, "\n\t\t\tif (!soap_in_%s(soap, \"%s\", %s->%s%s, \"%s\")\n\t\t\t\t%s->%s.reset();", c_ident(ptr), tag, obj, name, get, xsi_type(ptr), obj, name); else if (is_anyAttribute(ptr)) fprintf(fout, "\n\t\t\t%s->%s = soap_in_%s(soap, \"%s\", %s->%s, \"%s\");", obj, name, c_ident(ptr), tag, obj, name, xsi_type(ptr)); else if (is_primitive(ptr)) fprintf(fout, "\n\t\t\tif (soap_s2%s(soap, t, %s->%s%s))\n\t\t\t\treturn NULL;", the_type(ptr), obj, name, get); if (!is_anyAttribute(ptr) && !is_anyType(ptr)) fprintf(fout, "\n\t\t}\n\t\telse if (soap->error)\n\t\t\treturn NULL;\n\t}"); } else if (is_hexBinary(typ)) fprintf(fout, "\n\tif (!(%s->%s.__ptr = (unsigned char*)soap_hex2s(soap, soap_attr_value(soap, \"%s\", %d), NULL, 0, &%s->%s.__size)))\n\t\treturn NULL;", obj, name, tag, flag, obj, name); else if (is_binary(typ)) fprintf(fout, "\n\tif (!(%s->%s.__ptr = (unsigned char*)soap_base642s(soap, soap_attr_value(soap, \"%s\", %d), NULL, 0, &%s->%s.__size)))\n\t\treturn NULL;", obj, name, tag, flag, obj, name); else if (is_anyAttribute(typ)) fprintf(fout, "\n\tsoap_in_%s(soap, \"%s\", &%s->%s, \"%s\");", c_ident(typ), tag, obj, name, xsi_type(typ)); else if (is_primitive(typ)) fprintf(fout, "\n\tif (soap_s2%s(soap, soap_attr_value(soap, \"%s\", %d), &%s->%s))\n\t\treturn NULL;", the_type(typ), tag, flag, obj, name); if (is_smart(typ) || typ->type == Tpointer) { if (!is_string(typ) && !is_wstring(typ)) { Tnode *ptr = (Tnode*)typ->ref; if (!is_string(ptr) && !is_wstring(ptr) && !is_stdstr(ptr)) { if (ptr->hasmin) { if ((ptr->type >= Tfloat && ptr->type <= Tldouble) || is_external(ptr)) fprintf(fout, "\n\tif (%s->%s && *%s->%s %s %lG)\n\t{\tsoap->error = SOAP_LENGTH;\n\t\treturn NULL;\n\t}", obj, name, obj, name, ptr->incmin ? "<" : "<=", ptr->min); else if (ptr->min > 0 || ptr->type < Tuchar || ptr->type > Tullong) fprintf(fout, "\n\tif (%s->%s && *%s->%s %s " SOAP_LONG_FORMAT ")\n\t{\tsoap->error = SOAP_LENGTH;\n\t\treturn NULL;\n\t}", obj, name, obj, name, ptr->incmin ? "<" : "<=", (LONG64)ptr->min); } if (ptr->hasmax) { if ((ptr->type >= Tfloat && ptr->type <= Tldouble) || is_external(ptr)) fprintf(fout, "\n\tif (%s->%s && *%s->%s %s %lG)\n\t{\tsoap->error = SOAP_LENGTH;\n\t\treturn NULL;\n\t}", obj, name, obj, name, ptr->incmax ? ">" : ">=", ptr->max); else if (ptr->max >= 0 || ptr->type < Tuchar || ptr->type > Tullong) fprintf(fout, "\n\tif (%s->%s && *%s->%s %s " SOAP_LONG_FORMAT ")\n\t{\tsoap->error = SOAP_LENGTH;\n\t\treturn NULL;\n\t}", obj, name, obj, name, ptr->incmax ? ">" : ">=", (LONG64)ptr->max); } } } } else if (!is_stdstr(typ)) { if (typ->hasmin) { if ((typ->type >= Tfloat && typ->type <= Tldouble) || is_external(typ)) fprintf(fout, "\n\tif (%s->%s %s %lG)\n\t{\tsoap->error = SOAP_LENGTH;\n\t\treturn NULL;\n\t}", obj, name, typ->incmin ? "<" : "<=", typ->min); else if (typ->min > 0 || typ->type < Tuchar || typ->type > Tullong) fprintf(fout, "\n\tif (%s->%s %s " SOAP_LONG_FORMAT ")\n\t{\tsoap->error = SOAP_LENGTH;\n\t\treturn NULL;\n\t}", obj, name, typ->incmin ? "<" : "<=", (LONG64)typ->min); } if (typ->hasmax) { if ((typ->type >= Tfloat && typ->type <= Tldouble) || is_external(typ)) fprintf(fout, "\n\tif (%s->%s %s %lG)\n\t{\tsoap->error = SOAP_LENGTH;\n\t\treturn NULL;\n\t}", obj, name, typ->incmax ? ">" : ">=", typ->max); else if (typ->max >= 0 || typ->type < Tuchar || typ->type > Tullong) fprintf(fout, "\n\tif (%s->%s %s " SOAP_LONG_FORMAT ")\n\t{\tsoap->error = SOAP_LENGTH;\n\t\treturn NULL;\n\t}", obj, name, typ->incmax ? ">" : ">=", (LONG64)typ->max); } } } const char * ptr_cast(Table *t, const char *name) { const char *type = ident(t->sym->name); char *s = (char*)emalloc(strlen(type) + strlen(name) + 6); sprintf(s, "((%s*)%s)", type, name); return s; } void soap_out(Tnode *typ) { Table *table, *t; Entry *p = NULL; int cardinality, i, j, d; Tnode *n; const char *nse = ns_qualifiedElement(typ); const char *nsa = ns_qualifiedAttribute(typ); if (is_dynamic_array(typ)) { soap_out_Darray(typ); return; } if (is_external(typ) && !is_volatile(typ)) fprintf(fhead, "\nSOAP_FMAC3S const char* SOAP_FMAC4S soap_%s2s(struct soap*, %s);", c_ident(typ), c_type(typ)); if (is_typedef(typ) && (!is_external(typ) || is_volatile(typ)) && !is_qname(typ) && !is_stdqname(typ)) fprintf(fhead, "\n\n#define soap_%s2s soap_%s2s\n", c_ident(typ), t_ident(typ)); if (is_typedef(typ) && (is_element(typ) || is_synonym(typ) || is_external(typ)) && (!is_external(typ) || is_volatile(typ))) { fprintf(fhead, "\n\n#define soap_out_%s soap_out_%s\n", c_ident(typ), t_ident(typ)); return; } if (is_primitive(typ) && typ->type != Tenum && typ->type != Tenumsc) { if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, const %s, const char *type)\n{", c_ident(typ), c_type_id(typ, "*a")); if (typ->pattern && typ->pattern[0] == '%' && typ->pattern[1]) { fprintf(fout, "\n\tint err;"); if (typ->type == Tfloat) fprintf(fout, "\n\tconst char *s = soap->float_format;\n\tsoap->float_format = \"%s\";", typ->pattern); else if (typ->type == Tdouble) fprintf(fout, "\n\tconst char *s = soap->double_format;\n\tsoap->double_format = \"%s\";", typ->pattern); else if (typ->type == Tldouble) fprintf(fout, "\n\tconst char *s = soap->long_double_format;\n\tsoap->long_double_format = \"%s\";", typ->pattern); if (typ->type == Tllong || typ->type == Tullong) fprintf(fout, "\n\terr = soap_out%s(soap, tag, id, a, type, %s);", c_type(typ), soap_type(typ)); else fprintf(fout, "\n\terr = soap_out%s(soap, tag, id, a, type, %s);", the_type(typ), soap_type(typ)); if (typ->type == Tfloat) fprintf(fout, "\n\tsoap->float_format = s;"); else if (typ->type == Tdouble) fprintf(fout, "\n\tsoap->double_format = s;"); else if (typ->type == Tldouble) fprintf(fout, "\n\tsoap->long_double_format = s;"); fprintf(fout, "\n\treturn err;\n}"); } else { if (typ->type == Tllong || typ->type == Tullong) fprintf(fout, "\n\treturn soap_out%s(soap, tag, id, a, type, %s);\n}", c_type(typ), soap_type(typ)); else fprintf(fout, "\n\treturn soap_out%s(soap, tag, id, a, type, %s);\n}", the_type(typ), soap_type(typ)); } return; } if (is_fixedstring(typ)) { fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, const char[], const char*);", c_ident(typ)); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, const char a[], const char *type)\n{", c_ident(typ)); fprintf(fout, "\n\treturn soap_outstring(soap, tag, id, (char*const*)(void*)&a, type, %s);\n}", soap_type(typ)); return; } if (is_string(typ)) { if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, char*const*, const char*);", c_ident(typ)); return; } fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, char*const*, const char*);", c_ident(typ)); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, char *const*a, const char *type)\n{", c_ident(typ)); fprintf(fout, "\n\treturn soap_outstring(soap, tag, id, a, type, %s);\n}", soap_type(typ)); return; } if (is_wstring(typ)) { if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, wchar_t*const*, const char*);", c_ident(typ)); return; } fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, wchar_t*const*, const char*);", c_ident(typ)); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, wchar_t *const*a, const char *type)\n{", c_ident(typ)); fprintf(fout, "\n\treturn soap_outwstring(soap, tag, id, a, type, %s);\n}", soap_type(typ)); return; } if (is_stdstring(typ)) { if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, const std::string*, const char*);", c_ident(typ)); return; } fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, const std::string*, const char*);", c_ident(typ)); if (is_stdXML(typ)) fprintf(fout, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, const std::string *s, const char *type)\n{\n\tconst char *t = s->c_str();\n\treturn soap_outliteral(soap, tag, (char*const*)(void*)&t, type);\n}", c_ident(typ)); else fprintf(fout, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, const std::string *s, const char *type)\n{\n\tif ((soap->mode & SOAP_C_NILSTRING) && s->empty())\n\t\treturn soap_element_null(soap, tag, id, type);\n\tif (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, s, %s), type) || soap_string_out(soap, s->c_str(), 0) || soap_element_end_out(soap, tag))\n\t\treturn soap->error;\n\treturn SOAP_OK;\n}", c_ident(typ), soap_type(typ)); return; } if (is_stdwstring(typ)) { if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, const std::wstring*, const char*);", c_ident(typ)); return; } fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, const std::wstring*, const char*);", c_ident(typ)); if (is_stdXML(typ)) fprintf(fout, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, const std::wstring *s, const char *type)\n{\n\tconst wchar_t *t = s->c_str();\n\treturn soap_outwliteral(soap, tag, (wchar_t*const*)(void*)&t, type);\n}", c_ident(typ)); else fprintf(fout, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, const std::wstring *s, const char *type)\n{\n\tif ((soap->mode & SOAP_C_NILSTRING) && s->empty())\n\t\treturn soap_element_null(soap, tag, id, type);\n\tif (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, s, %s), type) || soap_wstring_out(soap, s->c_str(), 0) || soap_element_end_out(soap, tag))\n\t\treturn soap->error;\n\treturn SOAP_OK;\n}", c_ident(typ), soap_type(typ)); return; } switch(typ->type) { case Tstruct: if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, const %s, const char *type)\n{", c_ident(typ), c_type_id(typ, "*a")); if (has_setter(typ)) fprintf(fout, "\n\tif (((%s)a)->set(soap))\n\t\treturn soap->error;", c_type_id(typ, "*")); table = (Table*)typ->ref; for (t = table; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (is_repetition(p)) p = p->next; else if (p->info.sto & Sattribute) soap_set_attr(p, "a", ident(p->sym->name), ns_add(p, nsa)); else if (is_qname(p->info.typ)) fprintf(fout, "\n\tconst char *soap_tmp_%s = soap_QName2s(soap, a->%s);", ident(p->sym->name), ident(p->sym->name)); else if (is_stdqname(p->info.typ)) fprintf(fout, "\n\tstd::string soap_tmp_%s(soap_QName2s(soap, a->%s.c_str()));", ident(p->sym->name), ident(p->sym->name)); else if (p->info.typ->type == Tpointer && is_qname((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\tconst char *soap_tmp_%s = a->%s ? soap_QName2s(soap, *a->%s) : NULL;", ident(p->sym->name), ident(p->sym->name), ident(p->sym->name)); else if (p->info.typ->type == Tpointer && is_stdqname((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\tstd::string soap_temp_%s(a->%s ? soap_QName2s(soap, a->%s->c_str()) : \"\"), *soap_tmp_%s = a->%s ? &soap_temp_%s : NULL;", ident(p->sym->name), ident(p->sym->name), ident(p->sym->name), ident(p->sym->name), ident(p->sym->name), ident(p->sym->name)); } } fprintf(fout, "\n\t(void)soap; (void)tag; (void)id; (void)a; (void)type; /* appease -Wall -Werror */"); if (!table) { fprintf(fout, "\n\treturn SOAP_OK;\n}"); } else if (is_primclass(typ)) { for (table = (Table*)typ->ref; table; table = table->prev) { p = table->list; while (p && !is_item(p)) p = p->next; if (p) break; } if ((p->info.sto & SmustUnderstand) && !(p->info.sto & (Sconst | Sprivate | Sprotected)) && !(p->info.sto & Sattribute) && !is_transient(p->info.typ) && !is_void(p->info.typ) && p->info.typ->type != Tfun) fprintf(fout, "\n\tsoap->mustUnderstand = 1;"); if (p->info.typ->type == Tarray) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, a->%s, \"%s\");", c_ident(p->info.typ), ident(p->sym->name), xsi_type_u(typ)); else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) fprintf(fout, "\n\treturn a->%s.soap_out(soap, tag, id, \"%s\");", ident(p->sym->name), xsi_type_u(typ)); else if (is_qname(p->info.typ)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, (char*const*)(void*)&soap_tmp_%s, \"%s\");", c_ident(p->info.typ), ident(p->sym->name), xsi_type_u(typ)); else if (is_stdqname(p->info.typ)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, &soap_tmp_%s, \"%s\");", c_ident(p->info.typ), ident(p->sym->name), xsi_type_u(typ)); else if (p->info.typ->type == Tpointer && is_qname((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, (char*const*)soap_tmp_%s, \"%s\");", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name), xsi_type_u(typ)); else if (p->info.typ->type == Tpointer && is_stdqname((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, &soap_tmp_%s, \"%s\");", c_ident(p->info.typ), ident(p->sym->name), xsi_type_u(typ)); else if (is_XML(p->info.typ) && is_string(p->info.typ)) fprintf(fout, "\n\treturn soap_outliteral(soap, tag, (char*const*)&a->%s, NULL);", ident(p->sym->name)); else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) fprintf(fout, "\n\treturn soap_outwliteral(soap, tag, (wchar_t*const*)&a->%s, NULL);", ident(p->sym->name)); else if (is_string(p->info.typ)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, (char*const*)&a->%s, \"%s\");", c_ident(p->info.typ), ident(p->sym->name), xsi_type_u(typ)); else if (is_wstring(p->info.typ)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, (wchar_t*const*)&a->%s, \"%s\");", c_ident(p->info.typ), ident(p->sym->name), xsi_type_u(typ)); else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, &a->%s, \"%s\");", c_ident(p->info.typ), ident(p->sym->name), xsi_type_u(typ)); else fprintf(fout, "\n\treturn SOAP_OK;"); fprintf(fout, "\n}"); } else { if (!is_invisible(typ->id->name)) fprintf(fout, "\n\tif (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, %s), type))\n\t\treturn soap->error;", soap_type(typ)); fflush(fout); for (t = table; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.sto & Sreturn) { if (nse || has_ns_eq(NULL, p->sym->name)) { if (p->info.typ->type == Tpointer) fprintf(fout, "\n\tif (a->%s)\n\t\tsoap_element_result(soap, \"%s\");", ident(p->sym->name), ns_add(p, nse)); else fprintf(fout, "\n\tsoap_element_result(soap, \"%s\");", ns_add(p, nse)); } } if ((p->info.sto & SmustUnderstand) && !(p->info.sto & (Sconst | Sprivate | Sprotected)) && !is_transient(p->info.typ) && !is_void(p->info.typ) && p->info.typ->type != Tfun) fprintf(fout, "\n\tsoap->mustUnderstand = 1;"); needs_lang(p); if (p->info.typ->type == Tfun || p->info.typ->type == Tunion || is_soapref(p->info.typ)) ; else if (p->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name)); else if (p->info.sto & Sattribute) ; else if (is_repetition(p)) { fprintf(fout, "\n\tif (a->%s)", ident(p->next->sym->name)); fprintf(fout, "\n\t{\tint i;\n\t\tfor (i = 0; i < (int)a->%s; i++)", ident(p->sym->name)); if (((Tnode*)p->next->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->next->info.typ->ref) && !is_volatile((Tnode*)p->next->info.typ->ref) && !is_typedef((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tif (a->%s[i].soap_out(soap, \"%s\", -1, \"%s\"))\n\t\t\t\treturn soap->error;", ident(p->next->sym->name), ns_add(p->next, nse), xsi_type_cond_u((Tnode*)p->next->info.typ->ref, !has_ns_eq(NULL, p->next->sym->name))); else if (is_qname((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t{\tconst char *soap_tmp_%s = soap_QName2s(soap, a->%s[i]);\n\t\t\tif (soap_out_%s(soap, \"%s\", -1, (char*const*)(void*)&soap_tmp_%s, \"%s\"))\n\t\t\t\treturn soap->error;\n\t\t}", ident(p->next->sym->name), ident(p->next->sym->name), c_ident((Tnode*)p->next->info.typ->ref), ns_add(p->next, nse), ident(p->next->sym->name), xsi_type_cond_u((Tnode*)p->next->info.typ->ref, !has_ns_eq(NULL, p->next->sym->name))); else if (is_XML((Tnode*)p->next->info.typ->ref) && is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_outliteral(soap, \"%s\", (char*const*)(a->%s + i), NULL);", ns_add(p->next, nse), ident(p->next->sym->name)); else if (is_XML((Tnode*)p->next->info.typ->ref) && is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_outwliteral(soap, \"%s\", (wchar_t*const*)(a->%s + i), NULL);", ns_add(p->next, nse), ident(p->next->sym->name)); else if (is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_out_string(soap, \"%s\", -1, (char*const*)(a->%s + i), \"%s\");", ns_add(p->next, nse), ident(p->next->sym->name), xsi_type_cond_u((Tnode*)p->next->info.typ->ref, !has_ns_eq(NULL, p->next->sym->name))); else if (is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_out_wstring(soap, \"%s\", -1, (wchar_t*const*)(a->%s + i), \"%s\");", ns_add(p->next, nse), ident(p->next->sym->name), xsi_type_cond_u((Tnode*)p->next->info.typ->ref, !has_ns_eq(NULL, p->next->sym->name))); else fprintf(fout, "\n\t\t\tif (soap_out_%s(soap, \"%s\", -1, a->%s + i, \"%s\"))\n\t\t\t\treturn soap->error;", c_ident((Tnode*)p->next->info.typ->ref), ns_add(p->next, nse), ident(p->next->sym->name), xsi_type_cond_u((Tnode*)p->next->info.typ->ref, !has_ns_eq(NULL, p->next->sym->name))); fprintf(fout, "\n\t}"); p = p->next; } else if (is_anytype(p) && is_invisible(p->next->sym->name)) { fprintf(fout, "\n\tif (soap_putelement(soap, a->%s, tag, -1, a->%s))\n\t\treturn soap->error;", ident(p->next->sym->name), ident(p->sym->name)); p = p->next; } else if (is_anytype(p)) { fprintf(fout, "\n\tif (soap_putelement(soap, a->%s, \"%s\", -1, a->%s))\n\t\treturn soap->error;", ident(p->next->sym->name), ns_add(p->next, nse), ident(p->sym->name)); p = p->next; } else if (is_choice(p)) { fprintf(fout, "\n\tif (soap_out_%s(soap, a->%s, &a->%s))\n\t\treturn soap->error;", c_ident(p->next->info.typ), ident(p->sym->name), ident(p->next->sym->name)); p = p->next; } else if (is_transient(p->info.typ)) { fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); } else if (p->info.typ->type == Tarray) fprintf(fout, "\n\tsoap_out_%s(soap, %s, -1, a->%s, \"%s\");", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) fprintf(fout, "\n\tif (a->%s.soap_out(soap, %s, -1, \"%s\"))\n\t\treturn soap->error;", ident(p->sym->name), field(p, nse), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); else if (is_stdqname(p->info.typ)) fprintf(fout, "\n\tif (soap_out_%s(soap, %s, -1, &soap_tmp_%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); else { if (zflag != 2 && p->info.typ->type == Tpointer && !is_void(p->info.typ) && p->info.minOccurs > 0) fprintf(fout, "\n\tif (!a->%s)\n\t{\tif (soap_element_nil(soap, %s))\n\t\t\treturn soap->error;\n\t}\n\telse", ident(p->sym->name), field(p, nse)); if (is_qname(p->info.typ)) fprintf(fout, "\n\tif (soap_out_%s(soap, %s, -1, (char*const*)(void*)&soap_tmp_%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); else if (p->info.typ->type == Tpointer && is_qname((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\tif (soap_out_%s(soap, %s, -1, (char*const*)(void*)&soap_tmp_%s, \"%s\"))\n\t\treturn soap->error;", c_ident((Tnode*)p->info.typ->ref), field(p, nse), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); else if (p->info.typ->type == Tpointer && is_stdqname((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\tif (soap_out_%s(soap, %s, -1, &soap_tmp_%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); else if (is_XML(p->info.typ) && is_string(p->info.typ)) fprintf(fout, "\n\tsoap_outliteral(soap, %s, (char*const*)&a->%s, NULL);", field(p, nse), ident(p->sym->name)); else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) fprintf(fout, "\n\tsoap_outwliteral(soap, %s, (wchar_t*const*)&a->%s, NULL);", field(p, nse), ident(p->sym->name)); else if (is_string(p->info.typ)) fprintf(fout, "\n\tif (soap_out_%s(soap, %s, -1, (char*const*)&a->%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); else if (is_wstring(p->info.typ)) fprintf(fout, "\n\tif (soap_out_%s(soap, %s, -1, (wchar_t*const*)&a->%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) fprintf(fout, "\n\tif (soap_out_%s(soap, %s, -1, &a->%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); } } } if (!is_invisible(typ->id->name)) fprintf(fout, "\n\treturn soap_element_end_out(soap, tag);\n}"); else fprintf(fout, "\n\treturn SOAP_OK;\n}"); } fflush(fout); break; case Tclass: if (is_external(typ) && !is_volatile(typ)) { fprintf(fhead, "\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ), c_type_id(typ, "*")); return; } if (!is_volatile(typ) && !is_typedef(typ)) { if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fout, "\n\nint %s::soap_out(struct soap *soap, const char *tag, int id, const char *type) const", ident(typ->id->name)); fprintf(fout, "\n{\n\treturn soap_out_%s(soap, tag, id, this, type);\n}", c_ident(typ)); } fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, const %s, const char *type)\n{", c_ident(typ), c_type_id(typ, "*a")); fflush(fout); if (has_setter(typ)) fprintf(fout, "\n\tif (((%s)a)->set(soap))\n\t\treturn soap->error;", c_type_id(typ, "*")); table = (Table*)typ->ref; for (t = table; t; t = t->prev) { Entry *e = entry(classtable, t->sym); const char *nsa1 = e ? ns_qualifiedAttribute(e->info.typ) : nsa; for (p = t->list; p; p = p->next) { if (is_repetition(p)) p = p->next; else if (p->info.sto & Sattribute) soap_set_attr(p, ptr_cast(t, "a"), ident(p->sym->name), ns_add(p, nsa1)); else if (is_qname(p->info.typ)) fprintf(fout, "\n\tconst char *soap_tmp_%s = soap_QName2s(soap, a->%s);", ident(p->sym->name), ident(p->sym->name)); else if (is_stdqname(p->info.typ)) fprintf(fout, "\n\tstd::string soap_tmp_%s(soap_QName2s(soap, a->%s.c_str()));", ident(p->sym->name), ident(p->sym->name)); else if (p->info.typ->type == Tpointer && is_qname((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\tconst char *soap_tmp_%s = a->%s ? soap_QName2s(soap, *a->%s) : NULL;", ident(p->sym->name), ident(p->sym->name), ident(p->sym->name)); else if (p->info.typ->type == Tpointer && is_stdqname((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\tstd::string soap_temp_%s(a->%s ? soap_QName2s(soap, a->%s->c_str()) : \"\"), *soap_tmp_%s = a->%s ? &soap_temp_%s : NULL;", ident(p->sym->name), ident(p->sym->name), ident(p->sym->name), ident(p->sym->name), ident(p->sym->name), ident(p->sym->name)); } } fprintf(fout, "\n\t(void)soap; (void)tag; (void)id; (void)a; (void)type; /* appease -Wall -Werror */"); if (!table) { fprintf(fout, "\n\treturn SOAP_OK;\n}"); } else if (is_primclass(typ)) { for (t = table; t; t = t->prev) { p = t->list; while (p && !is_item(p)) p = p->next; if (p) break; } if ((p->info.sto & SmustUnderstand) && !(p->info.sto & (Sconst | Sprivate | Sprotected)) && !(p->info.sto & Sattribute) && !is_transient(p->info.typ) && !is_void(p->info.typ) && p->info.typ->type != Tfun) fprintf(fout, "\n\tsoap->mustUnderstand = 1;"); if (table && table->prev) { if (is_XML(p->info.typ) && is_string(p->info.typ)) fprintf(fout, "\n\treturn soap_outliteral(soap, tag, (char*const*)&a->%s::%s, \"%s\");", ident(t->sym->name), ident(p->sym->name), xsi_type(typ)); else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) fprintf(fout, "\n\treturn soap_outwliteral(soap, tag, (wchar_t*const*)&a->%s::%s, \"%s\");", ident(t->sym->name), ident(p->sym->name), xsi_type(typ)); else if (is_qname(p->info.typ)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, (char*const*)(void*)&soap_tmp_%s, \"%s\");", c_ident(p->info.typ), ident(p->sym->name), xsi_type(typ)); else if (is_string(p->info.typ)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, (char*const*)&a->%s::%s, \"%s\");", c_ident(p->info.typ), ident(t->sym->name), ident(p->sym->name), xsi_type(typ)); else if (is_wstring(p->info.typ)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, (wchar_t*const*)&a->%s::%s, \"%s\");", c_ident(p->info.typ), ident(t->sym->name), ident(p->sym->name), xsi_type(typ)); else if (p->info.typ->type == Tarray) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, a->%s::%s, \"%s\");", c_ident(p->info.typ), ident(t->sym->name), ident(p->sym->name), xsi_type(typ)); else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) fprintf(fout, "\n\treturn (a->%s::%s).soap_out(soap, tag, id, \"%s\");", ident(t->sym->name), ident(p->sym->name), xsi_type(typ)); else if (is_stdqname(p->info.typ)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, &soap_tmp_%s, \"%s\");", c_ident(p->info.typ), ident(p->sym->name), xsi_type(typ)); else if (p->info.typ->type == Tpointer && is_qname((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, (char*const*)(void*)&soap_tmp_%s, \"%s\");", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name), xsi_type_u(typ)); else if (p->info.typ->type == Tpointer && is_stdqname((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, &soap_tmp_%s, \"%s\");", c_ident(p->info.typ), ident(p->sym->name), xsi_type_u(typ)); else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, &a->%s::%s, \"%s\");", c_ident(p->info.typ), ident(t->sym->name), ident(p->sym->name), xsi_type(typ)); else fprintf(fout, "\n\treturn SOAP_OK;"); } else { if (is_XML(p->info.typ) && is_string(p->info.typ)) fprintf(fout, "\n\treturn soap_outliteral(soap, tag, (char*const*)&a->%s::%s, NULL);", ident(t->sym->name), ident(p->sym->name)); else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) fprintf(fout, "\n\treturn soap_outwliteral(soap, tag, (wchar_t*const*)&a->%s::%s, NULL);", ident(t->sym->name), ident(p->sym->name)); else if (is_qname(p->info.typ)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, (char*const*)(void*)&soap_tmp_%s, \"%s\");", c_ident(p->info.typ), ident(p->sym->name), xsi_type_u(typ)); else if (is_string(p->info.typ)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, (char*const*)&a->%s::%s, \"%s\");", c_ident(p->info.typ), ident(t->sym->name), ident(p->sym->name), xsi_type_u(typ)); else if (is_wstring(p->info.typ)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, (wchar_t*const*)&a->%s::%s, \"%s\");", c_ident(p->info.typ), ident(t->sym->name), ident(p->sym->name), xsi_type_u(typ)); else if (p->info.typ->type == Tarray) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, a->%s::%s, \"%s\");", c_ident(p->info.typ), ident(t->sym->name), ident(p->sym->name), xsi_type_u(typ)); else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) fprintf(fout, "\n\treturn (a->%s::%s).soap_out(soap, tag, id, \"%s\");", ident(t->sym->name), ident(p->sym->name), xsi_type_u(typ)); else if (is_stdqname(p->info.typ)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, &soap_tmp_%s, \"%s\");", c_ident(p->info.typ), ident(p->sym->name), xsi_type_u(typ)); else if (p->info.typ->type == Tpointer && is_qname((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, (char*const*)(void*)&soap_tmp_%s, \"%s\");", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name), xsi_type_u(typ)); else if (p->info.typ->type == Tpointer && is_stdqname((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, &soap_tmp_%s, \"%s\");", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name), xsi_type_u(typ)); else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, &a->%s::%s, \"%s\");", c_ident(p->info.typ), ident(t->sym->name), ident(p->sym->name), xsi_type_u(typ)); else fprintf(fout, "\n\treturn SOAP_OK;"); } fprintf(fout, "\n}"); } else { if (!is_invisible(typ->id->name)) { if (table && table->prev) fprintf(fout, "\n\tif (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, %s), \"%s\"))\n\t\treturn soap->error;", soap_type(typ), xsi_type(typ)); else fprintf(fout, "\n\tif (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, %s), type))\n\t\treturn soap->error;", soap_type(typ)); } fflush(fout); i = 0; /* Get the depth of the inheritance hierarchy */ for (t = table; t; t = t->prev) i++; /* Call routines to output the member data of the class */ /* Data members of the Base Classes are outputed first followed by the data members of the Derived classes. Overridden data members are output twice once for the base class they are defined in and once for the derived class that overwrites them */ for (; i > 0; i--) { Entry *e; const char *nse1; t = table; for (j = 0; j < i-1; j++) t = t->prev; e = entry(classtable, t->sym); nse1 = e ? ns_qualifiedElement(e->info.typ) : nse; for (p = t->list; p != (Entry*) 0; p = p->next) { if (p->info.sto & Sreturn) { if (nse1 || has_ns_eq(NULL, p->sym->name)) { if (p->info.typ->type == Tpointer) fprintf(fout, "\n\tif (a->%s)\n\t\tsoap_element_result(soap, \"%s\");", ident(p->sym->name), ns_add(p, nse1)); else fprintf(fout, "\n\tsoap_element_result(soap, \"%s\");", ns_add(p, nse1)); } } if ((p->info.sto & SmustUnderstand) && !(p->info.sto & (Sconst | Sprivate | Sprotected)) && !(p->info.sto & Sattribute) && !is_transient(p->info.typ) && !is_void(p->info.typ) && p->info.typ->type != Tfun) fprintf(fout, "\n\tsoap->mustUnderstand = 1;"); needs_lang(p); if (p->info.typ->type == Tfun || p->info.typ->type == Tunion || is_soapref(p->info.typ)) ; else if (p->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name)); else if (p->info.sto & Sattribute) ; else if (is_repetition(p)) { fprintf(fout, "\n\tif (a->%s::%s)", ident(t->sym->name), ident(p->next->sym->name)); fprintf(fout, "\n\t{\tint i;\n\t\tfor (i = 0; i < (int)a->%s::%s; i++)", ident(t->sym->name), ident(p->sym->name)); if (((Tnode*)p->next->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->next->info.typ->ref) && !is_volatile((Tnode*)p->next->info.typ->ref) && !is_typedef((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tif (a->%s::%s[i].soap_out(soap, %s, -1, \"%s\"))\n\t\t\t\treturn soap->error;", ident(t->sym->name), ident(p->next->sym->name), field_overridden(t, p->next, nse1), xsi_type_cond_u((Tnode*)p->next->info.typ->ref, !has_ns_eq(NULL, p->next->sym->name))); else if (is_qname((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t{\tconst char *soap_tmp_%s = soap_QName2s(soap, a->%s[i]);\n\t\t\tif (soap_out_%s(soap, %s, -1, (char*const*)(void*)&soap_tmp_%s, \"%s\"))\n\t\t\t\treturn soap->error;\n\t\t}", ident(p->next->sym->name), ident(p->next->sym->name), c_ident((Tnode*)p->next->info.typ->ref), field_overridden(t, p->next, nse1), ident(p->next->sym->name), xsi_type_cond_u((Tnode*)p->next->info.typ->ref, !has_ns_eq(NULL, p->next->sym->name))); else if (is_XML((Tnode*)p->next->info.typ->ref) && is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_outliteral(soap, %s, (char*const*)(a->%s::%s + i), NULL);", field_overridden(t, p->next, nse1), ident(t->sym->name), ident(p->next->sym->name)); else if (is_XML((Tnode*)p->next->info.typ->ref) && is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_outwliteral(soap, %s, (wchar_t*const*)(a->%s::%s + i), NULL);", field_overridden(t, p->next, nse1), ident(t->sym->name), ident(p->next->sym->name)); else if (is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_out_string(soap, \"%s\", -1, (char*const*)(a->%s::%s + i), \"%s\");", ns_add(p->next, nse), ident(t->sym->name), ident(p->next->sym->name), xsi_type_cond_u((Tnode*)p->next->info.typ->ref, !has_ns_eq(NULL, p->next->sym->name))); else if (is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_out_wstring(soap, \"%s\", -1, (wchar_t*const*)(a->%s::%s + i), \"%s\");", ns_add(p->next, nse), ident(t->sym->name), ident(p->next->sym->name), xsi_type_cond_u((Tnode*)p->next->info.typ->ref, !has_ns_eq(NULL, p->next->sym->name))); else fprintf(fout, "\n\t\t\tif (soap_out_%s(soap, %s, -1, a->%s::%s + i, \"%s\"))\n\t\t\t\treturn soap->error;", c_ident((Tnode*)p->next->info.typ->ref), field_overridden(t, p->next, nse1), ident(t->sym->name), ident(p->next->sym->name), xsi_type_cond_u((Tnode*)p->next->info.typ->ref, !has_ns_eq(NULL, p->next->sym->name))); fprintf(fout, "\n\t}"); p = p->next; } else if (is_anytype(p) && is_invisible(p->next->sym->name)) { fprintf(fout, "\n\tif (soap_putelement(soap, a->%s::%s, tag, -1, a->%s::%s))\n\t\treturn soap->error;", ident(t->sym->name), ident(p->next->sym->name), ident(t->sym->name), ident(p->sym->name)); p = p->next; } else if (is_anytype(p)) { fprintf(fout, "\n\tif (soap_putelement(soap, a->%s::%s, %s, -1, a->%s::%s))\n\t\treturn soap->error;", ident(t->sym->name), ident(p->next->sym->name), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name)); p = p->next; } else if (is_choice(p)) { fprintf(fout, "\n\tif (soap_out_%s(soap, a->%s::%s, &a->%s::%s))\n\t\treturn soap->error;", c_ident(p->next->info.typ), ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->next->sym->name)); p = p->next; } else if (is_item(p)) ; else if (is_transient(p->info.typ)) fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); else if (p->info.typ->type == Tarray) fprintf(fout, "\n\tsoap_out_%s(soap, %s, -1, a->%s::%s, \"%s\");", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) fprintf(fout, "\n\tif ((a->%s::%s).soap_out(soap, %s, -1, \"%s\"))\n\t\treturn soap->error;", ident(t->sym->name), ident(p->sym->name), field_overridden(t, p, nse1), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); else if (is_stdqname(p->info.typ)) fprintf(fout, "\n\tif (soap_out_%s(soap, %s, -1, &soap_tmp_%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); else { if (zflag != 2 && p->info.typ->type == Tpointer && !is_void(p->info.typ) && p->info.minOccurs > 0) fprintf(fout, "\n\tif (!a->%s::%s)\n\t{\tif (soap_element_nil(soap, %s))\n\t\t\treturn soap->error;\n\t}\n\telse", ident(t->sym->name), ident(p->sym->name), field_overridden(t, p, nse1)); if (is_qname(p->info.typ)) fprintf(fout, "\n\tif (soap_out_%s(soap, %s, -1, (char*const*)(void*)&soap_tmp_%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); else if (p->info.typ->type == Tpointer && is_qname((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\tif (soap_out_%s(soap, %s, -1, (char*const*)(void*)&soap_tmp_%s, \"%s\"))\n\t\treturn soap->error;", c_ident((Tnode*)p->info.typ->ref), field_overridden(t, p, nse1), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); else if (p->info.typ->type == Tpointer && is_stdqname((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\tif (soap_out_%s(soap, %s, -1, &soap_tmp_%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); else if (is_XML(p->info.typ) && is_string(p->info.typ)) fprintf(fout, "\n\tif (soap_outliteral(soap, %s, (char*const*)&a->%s::%s, NULL))\n\t\treturn soap->error;", field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name)); else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) fprintf(fout, "\n\tif (soap_outwliteral(soap, %s, (wchar_t*const*)&a->%s::%s, NULL))\n\t\treturn soap->error;", field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name)); else if (is_string(p->info.typ)) fprintf(fout, "\n\tif (soap_out_%s(soap, %s, -1, (char*const*)&a->%s::%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); else if (is_wstring(p->info.typ)) fprintf(fout, "\n\tif (soap_out_%s(soap, %s, -1, (wchar_t*const*)&a->%s::%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) fprintf(fout, "\n\tif (soap_out_%s(soap, %s, -1, &a->%s::%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); } } } i = 0; /* Get the depth of the inheritance hierarchy */ for (t = table; t; t = t->prev) i++; /* output __item(s) and inherited DOM at the end */ for (; i > 0; i--) { Entry *e; const char *nse1; t = table; for (j = 0; j < i-1; j++) t = t->prev; e = entry(classtable, t->sym); if (!t->prev && e && e->info.typ && e->info.typ->base && !strcmp(e->info.typ->base->name, "soap_dom_element")) fprintf(fout, "\n\tif (soap_out_xsd__anyType(soap, NULL, -1, static_cast(a), NULL))\n\t\treturn soap->error;"); nse1 = e ? ns_qualifiedElement(e->info.typ) : nse; for (p = t->list; p != (Entry*) 0; p = p->next) { if (p->info.typ->type == Tfun || p->info.typ->type == Tunion) ; else if (p->info.sto & (Sconst | Sprivate | Sprotected | Sattribute)) ; else if (is_repetition(p) || is_anytype(p) || is_choice(p)) p = p->next; else if (!is_item(p)) ; else if (is_transient(p->info.typ)) ; else if (p->info.typ->type == Tarray) fprintf(fout, "\n\tsoap_out_%s(soap, %s, -1, a->%s::%s, \"%s\");", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) fprintf(fout, "\n\tif ((a->%s::%s).soap_out(soap, %s, -1, \"%s\"))\n\t\treturn soap->error;", ident(t->sym->name), ident(p->sym->name), field_overridden(t, p, nse1), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); else if (is_stdqname(p->info.typ)) fprintf(fout, "\n\tif (soap_out_%s(soap, %s, -1, &soap_tmp_%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); else { if (zflag != 2 && p->info.typ->type == Tpointer && !is_void(p->info.typ) && p->info.minOccurs > 0) fprintf(fout, "\n\tif(a->%s::%s)\n\t{\tif (soap_element_nil(soap, %s))\n\t\t\treturn soap->error;\n\t}\n\telse", ident(t->sym->name), ident(p->sym->name), field_overridden(t, p, nse1)); if (is_qname(p->info.typ)) fprintf(fout, "\n\tif (soap_out_%s(soap, %s, -1, (char*const*)(void*)&soap_tmp_%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); else if (p->info.typ->type == Tpointer && is_qname((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\tif (soap_out_%s(soap, %s, -1, (char*const*)(void*)&soap_tmp_%s, \"%s\"))\n\t\treturn soap->error;", c_ident((Tnode*)p->info.typ->ref), field_overridden(t, p, nse1), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); else if (p->info.typ->type == Tpointer && is_stdqname((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\tif (soap_out_%s(soap, %s, -1, &soap_tmp_%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); else if (is_XML(p->info.typ) && is_string(p->info.typ)) fprintf(fout, "\n\tif (soap_outliteral(soap, %s, (char*const*)&a->%s::%s, NULL))\n\t\treturn soap->error;", field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name)); else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) fprintf(fout, "\n\tif (soap_outwliteral(soap, %s, (wchar_t*const*)&a->%s::%s, NULL))\n\t\treturn soap->error;", field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name)); else if (is_string(p->info.typ)) fprintf(fout, "\n\tif (soap_out_%s(soap, %s, -1, (char*const*)&a->%s::%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); else if (is_wstring(p->info.typ)) fprintf(fout, "\n\tif (soap_out_%s(soap, %s, -1, (wchar_t*const*)&a->%s::%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) fprintf(fout, "\n\tif (soap_out_%s(soap, %s, -1, &a->%s::%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); } fflush(fout); } } if (!is_invisible(typ->id->name)) fprintf(fout, "\n\treturn soap_element_end_out(soap, tag);\n}"); else fprintf(fout, "\n\treturn SOAP_OK;\n}"); } fflush(fout); break; case Tunion: if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, int, const %s);", c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, int, const %s);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, int choice, const %s)\n{", c_ident(typ), c_type_id(typ, "*a")); table = (Table*)typ->ref; fprintf(fout, "\n\t(void)soap; (void)a; /* appease -Wall -Werror */"); fprintf(fout, "\n\tswitch (choice)\n\t{"); for (p = table->list; p; p = p->next) { if (p->info.typ->type == Tfun || p->info.typ->type == Tunion) ; else if (p->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name)); else if (p->info.sto & Sattribute) ; else if (is_repetition(p)) ; else if (is_anytype(p)) ; else if (is_transient(p->info.typ)) fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); else if (p->info.typ->type == Tarray) { fprintf(fout, "\n\tcase %s:", soap_union_member(typ, p)); fprintf(fout, "\n\t\treturn soap_out_%s(soap, \"%s\", -1, a->%s, \"%s\");", c_ident(p->info.typ), ns_add(p, nse), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); } else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { fprintf(fout, "\n\tcase %s:", soap_union_member(typ, p)); fprintf(fout, "\n\t\treturn a->%s.soap_out(soap, \"%s\", -1, \"%s\");", ident(p->sym->name), ns_add(p, nse), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); } else if (is_qname(p->info.typ) || is_stdqname(p->info.typ)) { fprintf(fout, "\n\tcase %s:", soap_union_member(typ, p)); fprintf(fout, "\n\t{\tconst char *soap_tmp_%s = soap_QName2s(soap, a->%s);", ident(p->sym->name), ident(p->sym->name)); fprintf(fout, "\n\t\treturn soap_out_%s(soap, \"%s\", -1, (char*const*)(void*)&soap_tmp_%s, \"%s\");\n\t}", c_ident(p->info.typ), ns_add(p, nse), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); } else if (is_XML(p->info.typ) && is_string(p->info.typ)) { fprintf(fout, "\n\tcase %s:", soap_union_member(typ, p)); fprintf(fout, "\n\t\treturn soap_outliteral(soap, \"%s\", (char*const*)&a->%s, NULL);", ns_add(p, nse), ident(p->sym->name)); } else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) { fprintf(fout, "\n\tcase %s:", soap_union_member(typ, p)); fprintf(fout, "\n\t\treturn soap_outwliteral(soap, \"%s\", (wchar_t*const*)&a->%s, NULL);", ns_add(p, nse), ident(p->sym->name)); } else if (is_string(p->info.typ)) { fprintf(fout, "\n\tcase %s:", soap_union_member(typ, p)); fprintf(fout, "\n\t\treturn soap_out_%s(soap, \"%s\", -1, (char*const*)&a->%s, \"%s\");", c_ident(p->info.typ), ns_add(p, nse), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); } else if (is_wstring(p->info.typ)) { fprintf(fout, "\n\tcase %s:", soap_union_member(typ, p)); fprintf(fout, "\n\t\treturn soap_out_%s(soap, \"%s\", -1, (wchar_t*const*)&a->%s, \"%s\");", c_ident(p->info.typ), ns_add(p, nse), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); } else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { fprintf(fout, "\n\tcase %s:", soap_union_member(typ, p)); fprintf(fout, "\n\t\treturn soap_out_%s(soap, \"%s\", -1, &a->%s, \"%s\");", c_ident(p->info.typ), ns_add(p, nse), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); } } fprintf(fout, "\n\tdefault:\n\t\tbreak;\n\t}\n\treturn SOAP_OK;\n}"); fflush(fout); break; case Tpointer: if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char *, int, %s, const char *);", c_ident(typ), c_type_constptr_id(typ, "const*")); return; } fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char *, int, %s, const char *);", c_ident(typ), c_type_constptr_id(typ, "const*")); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, %s, const char *type)\n{", c_ident(typ), c_type_constptr_id(typ, "const*a")); if (is_template(typ)) { fprintf(fout, "\n\tif (!*a)"); fprintf(fout, "\n\t\treturn soap_element_null(soap, tag, id, type);"); fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, *a, type);", c_ident((Tnode*)typ->ref)); } else { p = is_dynamic_array((Tnode*)typ->ref); if (p) { d = get_Darraydims((Tnode*)typ->ref); if (d) fprintf(fout, "\n\tid = soap_element_id(soap, tag, id, *a, *s ? (*a)->%s : NULL, *s ? %s : 0, type, %s, NULL);", ident(p->sym->name), get_Darraysize("(*a)", d), soap_type((Tnode*)typ->ref)); else fprintf(fout, "\n\tid = soap_element_id(soap, tag, id, *a, *a ? (*a)->%s : NULL, *a ? (*a)->__size : 0, type, %s, NULL);", ident(p->sym->name), soap_type((Tnode*)typ->ref)); } else { if (((Tnode*)typ->ref)->recursive) fprintf(fout, "\n\tchar *mark;\n\tid = soap_element_id(soap, tag, id, *a, NULL, 0, type, %s, &mark);", soap_type((Tnode*)typ->ref)); else fprintf(fout, "\n\tid = soap_element_id(soap, tag, id, *a, NULL, 0, type, %s, NULL);", soap_type((Tnode*)typ->ref)); } fprintf(fout, "\n\tif (id < 0)\n\t\treturn soap->error;"); if (((Tnode *) typ->ref)->type == Tclass && !is_external((Tnode*)typ->ref) && !is_volatile((Tnode*)typ->ref) && !is_typedef((Tnode*)typ->ref)) { if (!p && ((Tnode*)typ->ref)->recursive) fprintf(fout, "\n\t(*a)->soap_out(soap, tag, id, type);\n\tsoap_unmark(soap, mark);\n\treturn soap->error;"); else fprintf(fout, "\n\treturn (*a)->soap_out(soap, tag, id, type);"); } else { if (!p && ((Tnode*)typ->ref)->recursive) fprintf(fout, "\n\tsoap_out_%s(soap, tag, id, *a, type);\n\tsoap_unmark(soap, mark);\n\treturn soap->error;", c_ident((Tnode*)typ->ref)); else fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, *a, type);", c_ident((Tnode*)typ->ref)); } } fprintf(fout, "\n}"); break; case Tarray: if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, %s, const char*);", c_ident(typ), c_type_id(typ, "const")); return; } fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, %s, const char*);", c_ident(typ), c_type_id(typ, "const")); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, %s, const char *type)\n{", c_ident(typ), c_type_id(typ, "const a")); fprintf(fout, "\n\tsize_t i;\n\t(void)type;"); fprintf(fout, "\n\tsoap_array_begin_out(soap, tag, soap_embedded_id(soap, id, a, %s), \"%s[%d]\", 0);", soap_type(typ), xsi_type_Tarray(typ), get_dimension(typ)); n=(Tnode*)typ->ref; cardinality = 1; while (n->type == Tarray) { n = (Tnode*)n->ref; cardinality++; } fprintf(fout, "\n\tfor (i = 0; i < %d; i++)\n\t{", get_dimension(typ)); if (((Tnode *)typ->ref)->type == Tclass && !is_external((Tnode*)typ->ref) && !is_volatile((Tnode*)typ->ref) && !is_typedef((Tnode*)typ->ref)) { if (cardinality>1) fprintf(fout, "\n\t\ta[i].soap_out(soap, \"item\", -1, \"%s\")", xsi_type_u((Tnode*)typ->ref)); else fprintf(fout, "\n\t\t(a+i)->soap_out(soap, \"item\", -1, \"%s\")", xsi_type_u((Tnode*)typ->ref)); } else { if (((Tnode *)typ->ref)->type != Tarray) { if (((Tnode *)typ->ref)->type == Tpointer) fprintf(fout, "\n\t\tsoap->position = 1;\n\t\tsoap->positions[0] = i;\n\t\tsoap_out_%s(soap, \"item\", -1, a", c_ident((Tnode*)typ->ref)); else fprintf(fout, "\n\t\tsoap_out_%s(soap, \"item\", -1, a", c_ident((Tnode*)typ->ref)); } else fprintf(fout, "\n\t\tsoap_out_%s(soap, \"item\", -1, a", c_ident((Tnode*)typ->ref)); if (cardinality>1) fprintf(fout, "[i], \"%s\")", xsi_type_u((Tnode*)typ->ref)); else fprintf(fout, "+i, \"%s\")", xsi_type_u((Tnode*)typ->ref)); } if (((Tnode *)typ->ref)->type == Tpointer) fprintf(fout, ";\n\t}\n\tsoap->position = 0;\n\treturn soap_element_end_out(soap, tag);\n}"); else fprintf(fout, ";\n\t}\n\treturn soap_element_end_out(soap, tag);\n}"); break; case Tenum: case Tenumsc: if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ), c_type_id(typ, "*")); if (!is_typedef(typ)) { fprintf(fout, "\n\nstatic const struct soap_code_map soap_codes_%s[] =\n{", c_ident(typ)); for (t = (Table*)typ->ref; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (typ->type == Tenumsc) fprintf(fout, "\t{ (LONG64)%s::%s, \"%s\" },\n", c_ident(typ), ident(p->sym->name), ns_remove2(p->sym->name, c_ident(typ))); else fprintf(fout, "\t{ (LONG64)%s, \"%s\" },\n", ident(p->sym->name), ns_remove2(p->sym->name, c_ident(typ))); } } fprintf(fout, "\t{ 0, NULL }\n"); fprintf(fout, "};"); } if (!is_typedef(typ)) { fprintf(fhead, "\nSOAP_FMAC3S const char* SOAP_FMAC4S soap_%s2s(struct soap*, %s);", c_ident(typ), c_type(typ)); fprintf(fout, "\n\nSOAP_FMAC3S const char* SOAP_FMAC4S soap_%s2s(struct soap *soap, %s)", c_ident(typ), c_type_id(typ, "n")); if (is_boolean(typ)) fprintf(fout, "\n{\n\t(void)soap; /* appease -Wall -Werror */\nreturn soap_code_str(soap_codes_%s, n != 0);\n}", c_ident(typ)); else if (!is_mask(typ)) { fprintf(fout, "\n{\tconst char *s = soap_code_str(soap_codes_%s, (long)n);", c_ident(typ)); fprintf(fout, "\n\tif (s)\n\t\treturn s;"); fprintf(fout, "\n\treturn soap_long2s(soap, (long)n);"); fprintf(fout, "\n}"); } else fprintf(fout, "\n{\n\treturn soap_code_list(soap, soap_codes_%s, (long)n);\n}", c_ident(typ)); } fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, const %s, const char *type)", c_ident(typ), c_type_id(typ, "*a")); fprintf(fout, "\n{\tif (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, %s), type)", soap_type(typ)); fprintf(fout, " || soap_send(soap, soap_%s2s(soap, *a)))\n\t\treturn soap->error;", c_ident(typ)); fprintf(fout, "\n\treturn soap_element_end_out(soap, tag);\n}"); break; case Ttemplate: if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ), c_type_id(typ, "*")); return; } if (is_typedef(typ)) { fprintf(fhead, "\n\n#define soap_out_%s soap_out_%s\n", c_ident(typ), t_ident(typ)); return; } fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ), c_type_id(typ, "*")); n = (Tnode*)typ->ref; if (!n) return; fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, const %s, const char *type)\n{", c_ident(typ), c_type_id(typ, "*a")); fprintf(fout, "\n\t(void)id; (void)type; /* appease -Wall -Werror */"); if (is_smart(typ)) { p = is_dynamic_array((Tnode*)typ->ref); if (p) { d = get_Darraydims((Tnode*)typ->ref); if (d) fprintf(fout, "\n\tid = soap_element_id(soap, tag, id, a->get(), *a ? (*a)->%s : NULL, *a ? %s : 0, type, %s, NULL);", ident(p->sym->name), get_Darraysize("(*a)", d), soap_type((Tnode*)typ->ref)); else fprintf(fout, "\n\tid = soap_element_id(soap, tag, id, a->get(), *a ? (*a)->%s : NULL, *a ? (*a)->__size : 0, type, %s, NULL);", ident(p->sym->name), soap_type((Tnode*)typ->ref)); } else if (((Tnode*)typ->ref)->recursive) fprintf(fout, "\n\tchar *mark;\n\tid = soap_element_id(soap, tag, id, a->get(), NULL, 0, type, %s, &mark);", soap_type((Tnode*)typ->ref)); else fprintf(fout, "\n\tid = soap_element_id(soap, tag, id, a->get(), NULL, 0, type, %s, NULL);", soap_type((Tnode*)typ->ref)); fprintf(fout, "\n\tif (id < 0)\n\t\treturn soap->error;"); if (((Tnode *) typ->ref)->type == Tclass && !is_external((Tnode*)typ->ref) && !is_volatile((Tnode*)typ->ref) && !is_typedef((Tnode*)typ->ref)) { if (!p && ((Tnode*)typ->ref)->recursive) fprintf(fout, "\n\t(*a)->soap_out(soap, tag, id, type);\n\tsoap_unmark(soap, mark);\n\treturn soap->error;"); else fprintf(fout, "\n\treturn (*a)->soap_out(soap, tag, id, type);"); } else { if (!p && ((Tnode*)typ->ref)->recursive) fprintf(fout, "\n\tsoap_out_%s(soap, tag, id, a->get(), type);\n\tsoap_unmark(soap, mark);\n\treturn soap->error;", c_ident((Tnode*)typ->ref)); else fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, a->get(), type);", c_ident((Tnode*)typ->ref)); } fprintf(fout, "\n}"); } else { fprintf(fout, "\n\tfor (%s::const_iterator i = a->begin(); i != a->end(); ++i)\n\t{", c_type(typ)); if (n->type == Tarray) fprintf(fout, "\n\t\tif (soap_out_%s(soap, tag, id, *i, \"%s\"))", c_ident(n), xsi_type_u(typ)); else if (n->type == Tclass && !is_external(n) && !is_volatile(n) && !is_typedef(n)) fprintf(fout, "\n\t\tif ((*i).soap_out(soap, tag, id, \"%s\"))", xsi_type_u(typ)); else if (is_qname(n)) fprintf(fout, "\n\t\tconst char *soap_tmp = soap_QName2s(soap, *i);\n\t\tif (soap_out_%s(soap, tag, id, (char*const*)(void*)&soap_tmp, \"%s\"))", c_ident(n), xsi_type_u(typ)); else if (is_stdqname(n)) fprintf(fout, "\n\t\tstd::string soap_tmp(soap_QName2s(soap, (*i).c_str()));\n\t\tif (soap_out_%s(soap, tag, id, &soap_tmp, \"%s\"))", c_ident(n), xsi_type_u(typ)); else if (is_XML(n) && is_string(n)) fprintf(fout, "\n\t\tif (soap_outliteral(soap, tag, (char*const*)&(*i), NULL))"); else if (is_XML(n) && is_wstring(n)) fprintf(fout, "\n\t\tif (soap_outwliteral(soap, tag, (wchar_t*const*)&(*i), NULL))"); else if (is_string(n)) fprintf(fout, "\n\t\tif (soap_out_%s(soap, tag, -1, (char*const*)&(*i), \"%s\"))", c_ident(n), xsi_type_u(typ)); else if (is_wstring(n)) fprintf(fout, "\n\t\tif (soap_out_%s(soap, tag, -1, (wchar_t*const*)&(*i), \"%s\"))", c_ident(n), xsi_type_u(typ)); else if (is_bool(n)) fprintf(fout, "\n\t\tbool b = (*i);\n\t\tif (soap_out_%s(soap, tag, id, &b, \"%s\"))", c_ident(n), xsi_type_u(typ)); else fprintf(fout, "\n\t\tif (soap_out_%s(soap, tag, id, &(*i), \"%s\"))", c_ident(n), xsi_type_u(typ)); fprintf(fout, "\n\t\t\treturn soap->error;"); fprintf(fout, "\n\t}\n\treturn SOAP_OK;\n}"); } break; default: break; } } void soap_out_Darray(Tnode *typ) { int i, j, d = 0; Table *t, *table; Entry *p; const char *nse = ns_qualifiedElement(typ); const char *nsa = ns_qualifiedAttribute(typ); const char *item; table = (Table*)typ->ref; fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ), c_type_id(typ, "*")); if (is_external(typ)) return; if (typ->type == Tclass && !is_volatile(typ) && !is_typedef(typ)) { fprintf(fout, "\n\nint %s::soap_out(struct soap *soap, const char *tag, int id, const char *type) const", c_type(typ)); fprintf(fout, "\n{\treturn soap_out_%s(soap, tag, id, this, type);\n}", c_ident(typ)); } fflush(fout); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, const %s, const char *type)\n{", c_ident(typ), c_type_id(typ, "*a")); if (has_setter(typ)) fprintf(fout, "\n\t((%s)a)->set(soap);", c_type_id(typ, "*")); if (!is_binary(typ)) { p = is_dynamic_array(typ); d = get_Darraydims(typ); if (d) fprintf(fout, "\n\tsize_t i, n = soap_size(a->__size, %d);", d); else fprintf(fout, "\n\tint i, n = a->__size;"); } if (typ->type == Tclass) { for (t = table; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.sto & Sattribute) soap_set_attr(p, ptr_cast(t, "a"), ident(p->sym->name), ns_add(p, nsa)); } } } else { for (t = table; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.sto & Sattribute) soap_set_attr(p, "a", ident(p->sym->name), ns_add(p, nsa)); } } } p = is_dynamic_array(typ); if (p->sym->name[5]) item = ns_addx(p->sym->name + 5, nse); else item = ns_addx("item", nse); if (!has_ns(typ) && !is_untyped(typ) && !is_binary(typ)) { const char *s = xsi_type(typ); if (is_untyped(p->info.typ)) s = wsdl_type(p->info.typ, "xsd"); if (d) { if (has_offset(typ)) fprintf(fout, "\n\tchar *t = a->%s ? soap_putsizesoffsets(soap, \"%s\", a->__size, a->__offset, %d) : NULL;", ident(p->sym->name), s, d); else fprintf(fout, "\n\tchar *t = a->%s ? soap_putsizesoffsets(soap, \"%s\", a->__size, NULL, %d) : NULL;", ident(p->sym->name), s, d); } else { if (has_offset(typ)) fprintf(fout, "\n\tchar *t = a->%s ? soap_putsizesoffsets(soap, \"%s\", &a->__size, &a->__offset, 1) : NULL;", ident(p->sym->name), s); else fprintf(fout, "\n\tchar *t = a->%s ? soap_putsizesoffsets(soap, \"%s\", &a->__size, NULL, 1) : NULL;", ident(p->sym->name), s); } } if (d) fprintf(fout, "\n\tid = soap_element_id(soap, tag, id, a, a->%s, %s, type, %s, NULL);", ident(p->sym->name), get_Darraysize("a", d), soap_type(typ)); else if (is_attachment(typ)) { fprintf(fout, "\n#ifndef WITH_LEANER\n\tid = soap_attachment(soap, tag, id, a, a->%s, a->__size, a->id, a->type, a->options, type, %s);", ident(p->sym->name), soap_type(typ)); fprintf(fout, "\n#else\n\tid = soap_element_id(soap, tag, id, a, a->%s, a->__size, type, %s, NULL);\n#endif", ident(p->sym->name), soap_type(typ)); } else fprintf(fout, "\n\tid = soap_element_id(soap, tag, id, a, a->%s, a->__size, type, %s, NULL);", ident(p->sym->name), soap_type(typ)); fprintf(fout, "\n\tif (id < 0)\n\t\treturn soap->error;"); fprintf(fout, "\n\tif ("); if (has_ns(typ) || is_untyped(typ) || is_binary(typ)) { if (table && table->prev) fprintf(fout, "soap_element_begin_out(soap, tag, id, \"%s\")", xsi_type(typ)); else fprintf(fout, "soap_element_begin_out(soap, tag, id, type)"); } else if (has_offset(typ)) { if (d) fprintf(fout, "soap_array_begin_out(soap, tag, id, t, soap_putoffsets(soap, a->__offset, %d))", d); else fprintf(fout, "soap_array_begin_out(soap, tag, id, t, soap_putoffsets(soap, &a->__offset, 1))"); } else fprintf(fout, "soap_array_begin_out(soap, tag, id, t, NULL)"); fprintf(fout, ")\n\t\treturn soap->error;"); if (is_hexBinary(typ)) fprintf(fout, "\n\tif (soap_puthex(soap, a->__ptr, a->__size))\n\t\treturn soap->error;"); else if (is_binary(typ)) fprintf(fout, "\n\tif (soap_putbase64(soap, a->__ptr, a->__size))\n\t\treturn soap->error;"); else { fprintf(fout, "\n\tfor (i = 0; i < n; i++)\n\t{"); if (!has_ns(typ) && !is_untyped(typ)) { if (d) { fprintf(fout, "\n\t\tsoap->position = %d;", d); for (i = 0; i < d; i++) { fprintf(fout, "\n\t\tsoap->positions[%d] = i", i); for (j = i+1; j < d; j++) fprintf(fout, "/a->__size[%d]", j); fprintf(fout, "%%a->__size[%d];", i); } if (is_XML((Tnode*)p->info.typ->ref) && is_string((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\tsoap_outliteral(soap, \"%s\", (char*const*)&a->%s[i], NULL);", item, ident(p->sym->name)); else if (is_XML((Tnode*)p->info.typ->ref) && is_wstring((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\tsoap_outwliteral(soap, \"%s\", (wchar_t*const*)&a->%s[i], NULL);", item, ident(p->sym->name)); else if (is_string((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\tsoap_out_%s(soap, \"%s\", -1, (char*const*)&a->%s[i], \"%s\");", c_ident(((Tnode *)p->info.typ->ref)), item, ident(p->sym->name), xsi_type_u(((Tnode *)p->info.typ->ref))); else if (is_wstring((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\tsoap_out_%s(soap, \"%s\", -1, (wchar_t*const*)&a->%s[i], \"%s\");", c_ident(((Tnode *)p->info.typ->ref)), item, ident(p->sym->name), xsi_type_u(((Tnode *)p->info.typ->ref))); else if (((Tnode *)p->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->info.typ->ref) && !is_volatile((Tnode*)p->info.typ->ref) && !is_typedef((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\ta->%s[i].soap_out(soap, \"%s\", -1, \"%s\");", ident(p->sym->name), item, xsi_type_u(((Tnode *)p->info.typ->ref))); else fprintf(fout, "\n\t\tsoap_out_%s(soap, \"%s\", -1, &a->%s[i], \"%s\");", c_ident(((Tnode *)p->info.typ->ref)), item, ident(p->sym->name), xsi_type_u(((Tnode *)p->info.typ->ref))); } else { fprintf(fout, "\n\t\tsoap->position = 1;\n\t\tsoap->positions[0] = i;"); if (is_XML((Tnode*)p->info.typ->ref) && is_string((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\tsoap_outliteral(soap, \"%s\", &a->%s[i], NULL);", item, ident(p->sym->name)); else if (is_XML((Tnode*)p->info.typ->ref) && is_wstring((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\tsoap_outwliteral(soap, \"%s\", &a->%s[i], NULL);", item, ident(p->sym->name)); else if (is_string((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\tsoap_out_%s(soap, \"%s\", -1, (char*const*)&a->%s[i], \"%s\");", c_ident(((Tnode *)p->info.typ->ref)), item, ident(p->sym->name), xsi_type_u(((Tnode *)p->info.typ->ref))); else if (is_wstring((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\tsoap_out_%s(soap, \"%s\", -1, (wchar_t*const*)&a->%s[i], \"%s\");", c_ident(((Tnode *)p->info.typ->ref)), item, ident(p->sym->name), xsi_type_u(((Tnode *)p->info.typ->ref))); else if (((Tnode *)p->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->info.typ->ref) && !is_volatile((Tnode*)p->info.typ->ref) && !is_typedef((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\ta->%s[i].soap_out(soap, \"%s\", -1, \"%s\");", ident(p->sym->name), item, xsi_type_u(((Tnode *)p->info.typ->ref))); else fprintf(fout, "\n\t\tsoap_out_%s(soap, \"%s\", -1, &a->%s[i], \"%s\");", c_ident(((Tnode *)p->info.typ->ref)), item, ident(p->sym->name), xsi_type_u(((Tnode *)p->info.typ->ref))); } } else { if (is_XML((Tnode*)p->info.typ->ref) && is_string((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\tsoap_outliteral(soap, \"%s\", &a->%s[i], NULL);", item, ident(p->sym->name)); else if (is_XML((Tnode*)p->info.typ->ref) && is_wstring((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\tsoap_outwliteral(soap, \"%s\", &a->%s[i], NULL);", item, ident(p->sym->name)); else if (is_string((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\tsoap_out_%s(soap, \"%s\", -1, (char*const*)&a->%s[i], \"%s\");", c_ident(((Tnode *)p->info.typ->ref)), item, ident(p->sym->name), xsi_type_u(((Tnode *)p->info.typ->ref))); else if (is_wstring((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\tsoap_out_%s(soap, \"%s\", -1, (wchar_t*const*)&a->%s[i], \"%s\");", c_ident(((Tnode *)p->info.typ->ref)), item, ident(p->sym->name), xsi_type_u(((Tnode *)p->info.typ->ref))); else if (((Tnode *)p->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->info.typ->ref) && !is_volatile((Tnode*)p->info.typ->ref) && !is_typedef((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\ta->%s[i].soap_out(soap, \"%s\", -1, \"%s\");", ident(p->sym->name), item, xsi_type_u(((Tnode *)p->info.typ->ref))); else fprintf(fout, "\n\t\tsoap_out_%s(soap, \"%s\", -1, &a->%s[i], \"%s\");", c_ident(((Tnode *)p->info.typ->ref)), item, ident(p->sym->name), xsi_type_u(((Tnode *)p->info.typ->ref))); } } if (is_binary(typ)) fprintf(fout, "\n\treturn soap_element_end_out(soap, tag);\n}"); else if (!has_ns(typ) && !is_untyped(typ)) fprintf(fout, "\n\t}\n\tsoap->position = 0;\n\treturn soap_element_end_out(soap, tag);\n}"); else fprintf(fout, "\n\t}\n\treturn soap_element_end_out(soap, tag);\n}"); } void soap_get(Tnode *typ) { Tnode *temp; if (typ->type == Ttemplate || typ->type == Tunion) return; if (is_typedef(typ) && (is_element(typ) || is_synonym(typ))) { fprintf(fhead, "\n\n#define soap_get_%s soap_get_%s\n", c_ident(typ), t_ident(typ)); fprintf(fhead, "\n\n#define soap_read_%s soap_read_%s\n", c_ident(typ), t_ident(typ)); return; } if (typ->type == Tarray) { /* ARRAY */ temp = typ; while (temp->type == Tarray) { temp = (Tnode*)temp->ref; } fprintf(fhead, "\nSOAP_FMAC3 %s * SOAP_FMAC4 soap_get_%s(struct soap*, %s, const char*, const char*);", c_type(temp), c_ident(typ), c_type(typ)); fprintf(fout, "\n\nSOAP_FMAC3 %s * SOAP_FMAC4 soap_get_%s(struct soap *soap, %s, const char *tag, const char *type)", c_type(temp), c_ident(typ), c_type_id(typ, "a")); fprintf(fout, "\n{\t%s;", c_type_id(temp, "(*p)")); fprintf(fout, "\n\tif ((p = soap_in_%s(soap, tag, a, type)))", c_ident(typ)); } else if (typ->type == Tclass && !is_external(typ) && !is_volatile(typ) && !is_typedef(typ)) { /* CLASS */ fprintf(fout, "\n\nvoid *%s::soap_get(struct soap *soap, const char *tag, const char *type)", c_type(typ)); fprintf(fout, "\n{\n\treturn soap_get_%s(soap, this, tag, type);\n}", c_ident(typ)); fprintf(fhead, "\nSOAP_FMAC3 %s SOAP_FMAC4 soap_get_%s(struct soap*, %s, const char*, const char*);", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 %s SOAP_FMAC4 soap_get_%s(struct soap *soap, %s, const char *tag, const char *type)\n{", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*p")); fprintf(fout, "\n\tif ((p = soap_in_%s(soap, tag, p, type)))", c_ident(typ)); } else { fprintf(fhead, "\nSOAP_FMAC3 %s SOAP_FMAC4 soap_get_%s(struct soap*, %s, const char*, const char*);", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 %s SOAP_FMAC4 soap_get_%s(struct soap *soap, %s, const char *tag, const char *type)\n{", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*p")); fprintf(fout, "\n\tif ((p = soap_in_%s(soap, tag, p, type)))", c_ident(typ)); } fprintf(fout, "\n\t\tif (soap_getindependent(soap))\n\t\t\treturn NULL;"); fprintf(fout, "\n\treturn p;\n}"); #if 0 /* some compilers cannot handle this inlined function */ if (typ->type != Treference) fprintf(fhead, "\n\ninline int soap_read_%s(struct soap *soap, %s) { if (soap_begin_recv(soap) || !soap_get_%s(soap, p, NULL, NULL) || soap_end_recv(soap)) return soap->error; return SOAP_OK; }\n", c_ident(typ), c_type_id(typ, "*p"), c_ident(typ)); #endif if (typ->type == Tclass && !is_external(typ) && !is_volatile(typ) && !is_typedef(typ)) { if (namespaceid) fprintf(fhead, "\n\n#ifndef soap_read_%s\n#define soap_read_%s(soap, data) ( ((data) ? ((data)->soap_default(soap), 0) : 0) || soap_begin_recv(soap) || !%s::soap_get_%s(soap, (data), NULL, NULL) || soap_end_recv(soap), (soap)->error )\n#endif\n", c_ident(typ), c_ident(typ), namespaceid, c_ident(typ)); else fprintf(fhead, "\n\n#ifndef soap_read_%s\n#define soap_read_%s(soap, data) ( ((data) ? ((data)->soap_default(soap), 0) : 0) || soap_begin_recv(soap) || !soap_get_%s(soap, (data), NULL, NULL) || soap_end_recv(soap), (soap)->error )\n#endif\n", c_ident(typ), c_ident(typ), c_ident(typ)); } else { if (namespaceid && (Qflag || !is_external(typ))) fprintf(fhead, "\n\n#ifndef soap_read_%s\n#define soap_read_%s(soap, data) ( ((data) ? (%s::soap_default_%s(soap, (data)), 0) : 0) || soap_begin_recv(soap) || !%s::soap_get_%s(soap, (data), NULL, NULL) || soap_end_recv(soap), (soap)->error )\n#endif\n", c_ident(typ), c_ident(typ), namespaceid, c_ident(typ), namespaceid, c_ident(typ)); else if (namespaceid) fprintf(fhead, "\n\n#ifndef soap_read_%s\n#define soap_read_%s(soap, data) ( ((data) ? (soap_default_%s(soap, (data)), 0) : 0) || soap_begin_recv(soap) || !%s::soap_get_%s(soap, (data), NULL, NULL) || soap_end_recv(soap), (soap)->error )\n#endif\n", c_ident(typ), c_ident(typ), c_ident(typ), namespaceid, c_ident(typ)); else fprintf(fhead, "\n\n#ifndef soap_read_%s\n#define soap_read_%s(soap, data) ( ((data) ? (soap_default_%s(soap, (data)), 0) : 0) || soap_begin_recv(soap) || !soap_get_%s(soap, (data), NULL, NULL) || soap_end_recv(soap), (soap)->error )\n#endif\n", c_ident(typ), c_ident(typ), c_ident(typ), c_ident(typ)); } fflush(fout); } void soap_in(Tnode *typ) { Entry *p = NULL; Table *table, *t; int total, strict, nonempty, flag, cardinality, i, j; long min, max; Tnode *n, *temp; const char *nse = ns_qualifiedElement(typ); const char *nsa = ns_qualifiedAttribute(typ); if (is_dynamic_array(typ)) { soap_in_Darray(typ); return; } if (is_external(typ) && !is_volatile(typ)) fprintf(fhead, "\nSOAP_FMAC3S int SOAP_FMAC4S soap_s2%s(struct soap*, const char*, %s);", c_ident(typ), c_type_id(typ, "*")); if (is_typedef(typ) && (!is_external(typ) || is_volatile(typ)) && !is_qname(typ) && !is_stdqname(typ)) fprintf(fhead, "\n\n#define soap_s2%s soap_s2%s\n", c_ident(typ), t_ident(typ)); if (is_typedef(typ) && (is_element(typ) || is_synonym(typ)) && (!is_external(typ) || is_volatile(typ))) { fprintf(fhead, "\n\n#define soap_in_%s soap_in_%s\n", c_ident(typ), t_ident(typ)); return; } if ((is_primitive_or_string(typ) && typ->type != Tenum && typ->type != Tenumsc) || (is_external(typ) && is_volatile(typ))) { if (is_stdqname(typ)) { fprintf(fhead, "\nSOAP_FMAC3 std::string * SOAP_FMAC4 soap_in_%s(struct soap*, const char*, std::string*, const char*);", c_ident(typ)); fprintf(fout, "\n\nSOAP_FMAC1 std::string * SOAP_FMAC2 soap_in_%s(struct soap *soap, const char *tag, std::string *s, const char *type)\n{\n\tif (soap_element_begin_in(soap, tag, 1, type))\n\t\treturn NULL;\n\tif (!s)\n\t\ts = soap_new_std__string(soap, -1);\n\tif (soap->null)\n\t\tif (s)\n\t\t\ts->erase();", c_ident(typ)); fprintf(fout, "\n\tif (soap->body && !*soap->href)\n\t{\tchar *t;\n\t\ts = (std::string*)soap_id_enter(soap, soap->id, s, %s, sizeof(std::string), soap->type, soap->arrayType, %s_instantiate, %s_fbase);\n\t\tif (s)\n\t\t{\tif (!(t = soap_string_in(soap, 2, %ld, %ld, %s)))\n\t\t\t\treturn NULL;\n\t\t\ts->assign(t);\n\t\t}\n\t}\n\telse\n\t\ts = (std::string*)soap_id_forward(soap, soap->href, soap_id_enter(soap, soap->id, s, %s, sizeof(std::string), soap->type, soap->arrayType, %s_instantiate, %s_fbase), 0, %s, %s, sizeof(std::string), 0, %s_finsert, NULL);\n\tif (soap->body && soap_element_end_in(soap, tag))\n\t\treturn NULL;\n\treturn s;\n}", soap_type(typ), prefix, prefix, minlen(typ), maxlen(typ), pattern(typ), soap_type(typ), prefix, prefix, soap_type(typ), soap_type(typ), prefix); return; } if (is_stdstring(typ)) { if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 std::string * SOAP_FMAC2 soap_in_%s(struct soap*, const char*, std::string*, const char*);", c_ident(typ)); return; } fprintf(fhead, "\nSOAP_FMAC3 std::string * SOAP_FMAC4 soap_in_%s(struct soap*, const char*, std::string*, const char*);", c_ident(typ)); if (is_stdXML(typ)) fprintf(fout, "\n\nSOAP_FMAC3 std::string * SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, std::string *s, const char *type)\n{\n\tchar *t;\n\t(void)type; /* appease -Wall -Werror */\n\tif (soap_inliteral(soap, tag, &t))\n\t{\tif (!s)\n\t\t\ts = soap_new_std__string(soap, -1);\n\t\ts->assign(t);\n\t\treturn s;\n\t}\n\treturn NULL;\n}", c_ident(typ)); else { fprintf(fout, "\n\nSOAP_FMAC3 std::string * SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, std::string *s, const char *type)\n{\n\t(void)type; /* appease -Wall -Werror */\n\tif (soap_element_begin_in(soap, tag, 1, NULL))\n\t\treturn NULL;\n\tif (!s)\n\t\ts = soap_new_std__string(soap, -1);\n\tif (soap->null)\n\t\tif (s)\n\t\t\ts->erase();", c_ident(typ)); fprintf(fout, "\n\tif (soap->body && !*soap->href)\n\t{\tchar *t;\n\t\ts = (std::string*)soap_id_enter(soap, soap->id, s, %s, sizeof(std::string), soap->type, soap->arrayType, %s_instantiate, %s_fbase);\n\t\tif (s)\n\t\t{\tif (!(t = soap_string_in(soap, 1, %ld, %ld, %s)))\n\t\t\t\treturn NULL;\n\t\t\ts->assign(t);\n\t\t}\n\t}\n\telse\n\t\ts = (std::string*)soap_id_forward(soap, soap->href, soap_id_enter(soap, soap->id, s, %s, sizeof(std::string), soap->type, soap->arrayType, %s_instantiate, %s_fbase), 0, %s, %s, sizeof(std::string), 0, %s_finsert, NULL);\n\tif (soap->body && soap_element_end_in(soap, tag))\n\t\treturn NULL;\n\treturn s;\n}", soap_type(typ), prefix, prefix, minlen(typ), maxlen(typ), pattern(typ), soap_type(typ), prefix, prefix, soap_type(typ), soap_type(typ), prefix); } return; } if (is_stdwstring(typ)) { if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC3 std::wstring * SOAP_FMAC4 soap_in_%s(struct soap*, const char*, std::wstring*, const char*);", c_ident(typ)); return; } if (is_stdXML(typ)) fprintf(fout, "\n\nSOAP_FMAC3 std::wstring * SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, std::wstring *s, const char *type)\n{\n\twchar_t *t;\n\t(void)type; /* appease -Wall -Werror */\n\tif (soap_inwliteral(soap, tag, &t))\n\t{\tif (!s)\n\t\t\ts = soap_new_std__wstring(soap, -1);\n\t\ts->assign(t);\n\t\treturn s;\n\t}\n\treturn NULL;\n}", c_ident(typ)); else { fprintf(fhead, "\nSOAP_FMAC3 std::wstring * SOAP_FMAC4 soap_in_%s(struct soap*, const char*, std::wstring*, const char*);", c_ident(typ)); fprintf(fout, "\n\nSOAP_FMAC3 std::wstring * SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, std::wstring *s, const char *type)\n{\n\t(void)type; /* appease -Wall -Werror */\n\tif (soap_element_begin_in(soap, tag, 1, NULL))\n\t\treturn NULL;\n\tif (!s)\n\t\ts = soap_new_std__wstring(soap, -1);\n\tif (soap->null)\n\t\tif (s)\n\t\t\ts->erase();", c_ident(typ)); fprintf(fout, "\n\tif (soap->body && !*soap->href)\n\t{\twchar_t *t;\n\t\ts = (std::wstring*)soap_id_enter(soap, soap->id, s, %s, sizeof(std::wstring), soap->type, soap->arrayType, %s_instantiate, %s_fbase);\n\t\tif (s)\n\t\t{\tif (!(t = soap_wstring_in(soap, 1, %ld, %ld, %s)))\n\t\t\t\treturn NULL;\n\t\t\ts->assign(t);\n\t\t}\n\t}\n\telse\n\t\ts = (std::wstring*)soap_id_forward(soap, soap->href, soap_id_enter(soap, soap->id, s, %s, sizeof(std::wstring), soap->type, soap->arrayType, %s_instantiate, %s_fbase), 0, %s, %s, sizeof(std::wstring), 0, %s_finsert, NULL);\n\tif (soap->body && soap_element_end_in(soap, tag))\n\t\treturn NULL;\n\treturn s;\n}", soap_type(typ), prefix, prefix, minlen(typ), maxlen(typ), pattern(typ), soap_type(typ), prefix, prefix, soap_type(typ), soap_type(typ), prefix); } return; } if (is_external(typ) && !is_volatile(typ)) { fprintf(fhead, "\nSOAP_FMAC1 %s * SOAP_FMAC2 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type(typ), c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 %s * SOAP_FMAC4 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type(typ), c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 %s * SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, %s, const char *type)\n{", c_type(typ), c_ident(typ), c_type_id(typ, "*a")); if (is_wstring(typ)) fprintf(fout, "\n\ta = soap_inwstring(soap, tag, a, type, %s, %ld, %ld, %s);", soap_type(typ), minlen(typ), maxlen(typ), pattern(typ)); else if (is_string(typ)) fprintf(fout, "\n\ta = soap_instring(soap, tag, a, type, %s, %d, %ld, %ld, %s);", soap_type(typ), is_qname(typ)+1, minlen(typ), maxlen(typ), pattern(typ)); else { if (typ->type == Tllong || typ->type == Tullong) fprintf(fout, "\n\ta = soap_in%s(soap, tag, a, type, %s);", c_type(typ), soap_type(typ)); else if (is_primitive_or_string(typ)) fprintf(fout, "\n\ta = soap_in%s(soap, tag, a, type, %s);", the_type(typ), soap_type(typ)); else fprintf(fout, "\n\ta = soap_in_%s(soap, tag, a, type);", t_ident(typ)); if (typ->hasmin) { if ((typ->type >= Tfloat && typ->type <= Tldouble) || is_external(typ)) fprintf(fout, "\n\tif (a && *a %s %lG)\n\t{\tsoap->error = SOAP_LENGTH;\n\t\treturn NULL;\n\t}", typ->incmin ? "<" : "<=", typ->min); else if (typ->min > 0 || typ->type < Tuchar || typ->type > Tullong) fprintf(fout, "\n\tif (a && *a %s " SOAP_LONG_FORMAT ")\n\t{\tsoap->error = SOAP_LENGTH;\n\t\treturn NULL;\n\t}", typ->incmin ? "<" : "<=", (LONG64)typ->min); } if (typ->hasmax) { if ((typ->type >= Tfloat && typ->type <= Tldouble) || is_external(typ)) fprintf(fout, "\n\tif (a && *a %s %lG)\n\t{\tsoap->error = SOAP_LENGTH;\n\t\treturn NULL;\n\t}", typ->incmax ? ">" : ">=", typ->max); else if (typ->max >= 0 || typ->type < Tuchar || typ->type > Tullong) fprintf(fout, "\n\tif (a && *a %s " SOAP_LONG_FORMAT ")\n\t{\tsoap->error = SOAP_LENGTH;\n\t\treturn NULL;\n\t}", typ->incmax ? ">" : ">=", (LONG64)typ->max); } } fprintf(fout, "\n\treturn a;\n}"); fflush(fout); return; } if (is_fixedstring(typ)) { int n = typ->width / ((Tnode*)typ->ref)->width; fprintf(fhead, "\nSOAP_FMAC3 char* SOAP_FMAC4 soap_in_%s(struct soap*, const char*, char[], const char*);", c_ident(typ)); fprintf(fout, "\n\nSOAP_FMAC3 char* SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, char a[], const char *type)\n{\tchar *p = NULL;\n\tif (!soap_instring(soap, tag, &p, type, %s, 1, 0, %d, %s))\n\t\treturn NULL;\n\tif (!p)\n\t{\tif (*soap->href)\n\t\t\tsoap_id_nullify(soap, soap->href);\n\t\telse\n\t\t\tsoap->error = SOAP_NULL;\n\t\treturn NULL;\n\t}\n\tsoap_strncpy(a, %d, p, %d);\n\treturn a;\n}", c_ident(typ), soap_type(typ), n - 1, pattern(typ), n, n - 1); return; } switch(typ->type) { case Tstruct: if (is_external(typ) && !is_volatile(typ)) { fprintf(fhead, "\nSOAP_FMAC1 %s SOAP_FMAC2 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, %s, const char *type)\n{", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*a")); table = (Table*)typ->ref; if (!typ->ref) { fprintf(fout, "\n\t(void)soap; (void)tag; (void)a; (void)type; /* appease -Wall -Werror */"); fprintf(fout, "\n\tif (!a)\n\t\tsoap->error = SOAP_TAG_MISMATCH;\n\treturn a;\n}"); } else if (is_primclass(typ)) { fprintf(fout, "\n\t(void)type; /* appease -Wall -Werror */"); fprintf(fout, "\n\tif (soap_element_begin_in(soap, tag, 1, NULL))\n\t\treturn NULL;"); if (!cflag) fprintf(fout, "\n\tif (!(a = (%s)soap_id_enter(soap, soap->id, a, %s, sizeof(%s), soap->type, soap->arrayType, %s_instantiate, %s_fbase)))\n\t\treturn NULL;", c_type_id(typ, "*"), soap_type(typ), c_type(typ), prefix, prefix); else fprintf(fout, "\n\tif (!(a = (%s)soap_id_enter(soap, soap->id, a, %s, sizeof(%s), NULL, NULL, NULL, NULL)))\n\t\treturn NULL;", c_type_id(typ, "*"), soap_type(typ), c_type(typ)); fprintf(fout, "\n\tsoap_revert(soap);\n\t*soap->id = '\\0';"); fprintf(fout, "\n\tsoap_default_%s(soap, a);", c_ident(typ)); for (t = (Table*)typ->ref; t; t = t->prev) { for (p = t->list; p; p = p->next) if (p->info.sto & Sattribute) soap_attr_value(p, "a", ident(p->sym->name), ns_add(p, nsa)); } fflush(fout); for (table = (Table*)typ->ref; table; table = table->prev) { p = table->list; while (p && !is_item(p)) p = p->next; if (p) break; } if (is_XML(p->info.typ) && is_string(p->info.typ)) fprintf(fout, "\n\tif (!soap_inliteral(soap, tag, (char**)&a->%s))", ident(p->sym->name)); else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) fprintf(fout, "\n\tif (!soap_inwliteral(soap, tag, (wchar_t**)&a->%s))", ident(p->sym->name)); else if (is_string(p->info.typ)) fprintf(fout, "\n\tif (!soap_in_%s(soap, tag, (char**)&a->%s, \"%s\"))", c_ident(p->info.typ), ident(p->sym->name), xsi_type(typ)); else if (is_wstring(p->info.typ)) fprintf(fout, "\n\tif (!soap_in_%s(soap, tag, (wchar_t**)&a->%s, \"%s\"))", c_ident(p->info.typ), ident(p->sym->name), xsi_type(typ)); else if (p->info.typ->type == Tarray) fprintf(fout, "\n\tif (!soap_in_%s(soap, tag, a->%s, \"%s\"))", c_ident(p->info.typ), ident(p->sym->name), xsi_type(typ)); else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) fprintf(fout, "\n\tif (!a->%s.soap_in(soap, tag, \"%s\"))", ident(p->sym->name), xsi_type(typ)); else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) fprintf(fout, "\n\tif (!soap_in_%s(soap, tag, &a->%s, \"%s\"))", c_ident(p->info.typ), ident(p->sym->name), xsi_type(typ)); fprintf(fout, "\n\t\treturn NULL;"); if (has_getter(typ)) fprintf(fout, "\n\tif (a->get(soap))\n\t\treturn NULL;"); fprintf(fout, "\n\treturn a;\n}"); } else { table = (Table*)typ->ref; if (!is_discriminant(typ)) { for (t = table; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (!(p->info.sto & (Sconst | Sprivate | Sprotected)) && !(p->info.sto & Sattribute) && p->info.typ->type != Tfun && !is_void(p->info.typ)) { if (is_anytype(p) || is_choice(p)) { p = p->next; fprintf(fout, "\n\tsize_t soap_flag_%s = " SOAP_LONG_FORMAT ";", ident(p->sym->name), p->info.maxOccurs); } else if (is_repetition(p)) { fprintf(fout, "\n\tstruct soap_blist *soap_blist_%s = NULL;", ident(p->next->sym->name)); p = p->next; } else if (!is_transient(p->info.typ) && !is_container(p->info.typ)) fprintf(fout, "\n\tsize_t soap_flag_%s = " SOAP_LONG_FORMAT ";", ident(p->sym->name), p->info.maxOccurs); } } } } if (!is_invisible(typ->id->name)) { fprintf(fout, "\n\tif (soap_element_begin_in(soap, tag, 0, type))\n\t\treturn NULL;"); } else if (!is_discriminant(typ)) { if (table && (table->prev || table->list)) fprintf(fout, "\n\tshort soap_flag;"); fprintf(fout, "\n\t(void)tag; (void)type; /* appease -Wall -Werror */"); } else fprintf(fout, "\n\t(void)tag; (void)type; /* appease -Wall -Werror */"); if (has_class(typ)) { if (is_invisible(typ->id->name)) fprintf(fout, "\n\ta = (%s)soap_id_enter(soap, \"\", a, %s, sizeof(%s), soap->type, soap->arrayType, %s_instantiate, %s_fbase);", c_type_id(typ, "*"), soap_type(typ), c_type(typ), prefix, prefix); else fprintf(fout, "\n\ta = (%s)soap_id_enter(soap, soap->id, a, %s, sizeof(%s), soap->type, soap->arrayType, %s_instantiate, %s_fbase);", c_type_id(typ, "*"), soap_type(typ), c_type(typ), prefix, prefix); } else if (is_invisible(typ->id->name)) fprintf(fout, "\n\ta = (%s)soap_id_enter(soap, \"\", a, %s, sizeof(%s), NULL, NULL, NULL, NULL);", c_type_id(typ, "*"), soap_type(typ), c_type(typ)); else fprintf(fout, "\n\ta = (%s)soap_id_enter(soap, soap->id, a, %s, sizeof(%s), NULL, NULL, NULL, NULL);", c_type_id(typ, "*"), soap_type(typ), c_type(typ)); fprintf(fout, "\n\tif (!a)\n\t\treturn NULL;"); fprintf(fout, "\n\tsoap_default_%s(soap, a);", c_ident(typ)); for (t = table; t; t = t->prev) { for (p = t->list; p; p = p->next) if (p->info.sto & Sattribute) soap_attr_value(p, "a", ident(p->sym->name), ns_add(p, nsa)); } if (!is_invisible(typ->id->name)) { if (!is_discriminant(typ)) { fprintf(fout, "\n\tif (soap->body && !*soap->href)\n\t{"); fprintf(fout, "\n\t\tfor (;;)\n\t\t{\tsoap->error = SOAP_TAG_MISMATCH;"); } else fprintf(fout, "\n\tif (!tag || *tag == '-' || (soap->body && !*soap->href))\n\t{"); } else if (!is_discriminant(typ)) { if (table && (table->prev || table->list)) fprintf(fout, "\n\t\tfor (soap_flag = 0;; soap_flag = 1)\n\t\t{\tsoap->error = SOAP_TAG_MISMATCH;"); } flag = 0; for (t = table; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun || p->info.typ->type == Tunion || is_soapref(p->info.typ)) ; else if (p->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fout, "\n\t\t/* non-serializable %s skipped */", ident(p->sym->name)); else if (p->info.sto & Sattribute) ; else if (is_repetition(p)) { if (is_unmatched(p->next->sym) || is_invisible(p->next->sym->name)) { p = p->next; continue; } flag = 1; fprintf(fout, "\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH && "); fprintf(fout, "!soap_element_begin_in(soap, %s, 1, NULL))", field(p->next, nse)); fprintf(fout, "\n\t\t\t{\tif (a->%s == NULL)\n\t\t\t\t{\tif (soap_blist_%s == NULL)\n\t\t\t\t\t\tsoap_blist_%s = soap_new_block(soap);", ident(p->next->sym->name), ident(p->next->sym->name), ident(p->next->sym->name)); if (((Tnode*)p->next->info.typ->ref)->type == Tclass || has_class((Tnode*)p->next->info.typ->ref) || (!cflag && ((Tnode*)p->next->info.typ->ref)->type == Tstruct)) fprintf(fout, "\n\t\t\t\t\ta->%s = soap_block<%s>::push(soap, soap_blist_%s);\n\t\t\t\t\tif (a->%s == NULL)\n\t\t\t\t\t\treturn NULL;", ident(p->next->sym->name), c_type(p->next->info.typ->ref), ident(p->next->sym->name), ident(p->next->sym->name)); else if (((Tnode*)p->next->info.typ->ref)->type == Tpointer && (p->next->info.sto & Sconstptr)) fprintf(fout, "\n\t\t\t\t\ta->%s = (const %s)soap_push_block(soap, soap_blist_%s, sizeof(%s));\n\t\t\t\t\tif (a->%s == NULL)\n\t\t\t\t\t\treturn NULL;", ident(p->next->sym->name), c_type(p->next->info.typ), ident(p->next->sym->name), c_type((Tnode*)p->next->info.typ->ref), ident(p->next->sym->name)); else fprintf(fout, "\n\t\t\t\t\ta->%s = (%s)soap_push_block(soap, soap_blist_%s, sizeof(%s));\n\t\t\t\t\tif (a->%s == NULL)\n\t\t\t\t\t\treturn NULL;", ident(p->next->sym->name), c_type(p->next->info.typ), ident(p->next->sym->name), c_type((Tnode*)p->next->info.typ->ref), ident(p->next->sym->name)); if (((Tnode*)p->next->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->next->info.typ->ref) && !is_volatile((Tnode*)p->next->info.typ->ref) && !is_typedef((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\t\ta->%s->soap_default(soap);", ident(p->next->sym->name)); else if (((Tnode*)p->next->info.typ->ref)->type != Tpointer && !is_XML((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\t\tsoap_default_%s(soap, a->%s);", c_ident((Tnode*)p->next->info.typ->ref), ident(p->next->sym->name)); else fprintf(fout, "\n\t\t\t\t\t*a->%s = NULL;", ident(p->next->sym->name)); fprintf(fout, "\n\t\t\t\t}"); fprintf(fout, "\n\t\t\t\tsoap_revert(soap);"); if (is_XML((Tnode*)p->next->info.typ->ref) && is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_inliteral(soap, %s, (char**)a->%s))", field(p->next, nse), ident(p->next->sym->name)); else if (is_XML((Tnode*)p->next->info.typ->ref) && is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_inwliteral(soap, %s, (wchar_t**)a->%s))", field(p->next, nse), ident(p->next->sym->name)); else if (is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, (char**)a->%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), field(p->next, nse), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); else if (is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, (wchar_t**)a->%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), field(p->next, nse), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); else fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, a->%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), field(p->next, nse), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); fprintf(fout, "\n\t\t\t\t{\ta->%s++;\n\t\t\t\t\ta->%s = NULL;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}", ident(p->sym->name), ident(p->next->sym->name)); p = p->next; } else if (is_anytype(p)) { flag = 1; fprintf(fout, "\n\t\t\tif (soap_flag_%s && soap->error == SOAP_TAG_MISMATCH)", ident(p->next->sym->name)); fprintf(fout, "\n\t\t\t\tif ((a->%s = soap_getelement(soap, &a->%s)))", ident(p->next->sym->name), ident(p->sym->name)); fprintf(fout, "\n\t\t\t\t{\tsoap_flag_%s = 0;", ident(p->next->sym->name)); fprintf(fout, "\n\t\t\t\t\tcontinue;"); fprintf(fout, "\n\t\t\t\t}"); p = p->next; } else if (is_discriminant(typ) && p->next) { flag = 1; fprintf(fout, "\n\t\tif (!soap_in_%s(soap, &a->%s, &a->%s))", c_ident(p->next->info.typ), ident(p->sym->name), ident(p->next->sym->name)); fprintf(fout, "\n\t\t\treturn NULL;"); break; } else if (is_choice(p)) { flag = 1; fprintf(fout, "\n\t\t\tif (soap_flag_%s && soap->error == SOAP_TAG_MISMATCH)", ident(p->next->sym->name)); fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, &a->%s, &a->%s))", c_ident(p->next->info.typ), ident(p->sym->name), ident(p->next->sym->name)); fprintf(fout, "\n\t\t\t\t{\tsoap_flag_%s = 0;", ident(p->next->sym->name)); fprintf(fout, "\n\t\t\t\t\tcontinue;"); fprintf(fout, "\n\t\t\t\t}"); p = p->next; } else if (is_transient(p->info.typ)) { fprintf(fout, "\n\t\t\t/* transient %s skipped */", ident(p->sym->name)); } else { flag = 1; if (!is_invisible(p->sym->name) && !is_primclass(typ) && p->info.typ->type != Tfun && !is_void(p->info.typ)) { if (is_string(p->info.typ) || is_wstring(p->info.typ) || is_stdstr(p->info.typ)) fprintf(fout, "\n\t\t\tif (soap_flag_%s && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))", ident(p->sym->name)); else if (is_container(p->info.typ)) fprintf(fout, "\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH)"); else fprintf(fout, "\n\t\t\tif (soap_flag_%s && soap->error == SOAP_TAG_MISMATCH)", ident(p->sym->name)); } if (is_unmatched(p->sym)) { if (is_XML(p->info.typ) && is_string(p->info.typ)) { fprintf(fout, "\n\t\t\t\tif (soap_inliteral(soap, NULL, (char**)&a->%s))", ident(p->sym->name)); } else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) { fprintf(fout, "\n\t\t\t\tif (soap_inwliteral(soap, NULL, (wchar_t**)&a->%s))", ident(p->sym->name)); } else if (is_string(p->info.typ)) { fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, NULL, (char**)&a->%s, \"%s\"))", c_ident(p->info.typ), ident(p->sym->name), xsi_type(p->info.typ)); } else if (is_wstring(p->info.typ)) { fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, NULL, (wchar_t**)&a->%s, \"%s\"))", c_ident(p->info.typ), ident(p->sym->name), xsi_type(p->info.typ)); } else if (p->info.typ->type == Tarray) { fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, NULL, a->%s, \"%s\"))", c_ident(p->info.typ), ident(p->sym->name), xsi_type(p->info.typ)); } else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { fprintf(fout, "\n\t\t\t\tif (a->%s.soap_in(soap, NULL, \"%s\"))", ident(p->sym->name), xsi_type(p->info.typ)); } else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, NULL, &a->%s, \"%s\"))", c_ident(p->info.typ), ident(p->sym->name), xsi_type(p->info.typ)); } } else if (!is_invisible(p->sym->name)) { if (is_XML(p->info.typ) && is_string(p->info.typ)) { fprintf(fout, "\n\t\t\t\tif (soap_inliteral(soap, %s, (char**)&a->%s))", field(p, nse), ident(p->sym->name)); } else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) { fprintf(fout, "\n\t\t\t\tif (soap_inwliteral(soap, %s, (wchar_t**)&a->%s))", field(p, nse), ident(p->sym->name)); } else if (is_string(p->info.typ)) { fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, (char**)&a->%s, \"%s\"))", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type(p->info.typ)); } else if (is_wstring(p->info.typ)) { fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, (wchar_t**)&a->%s, \"%s\"))", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type(p->info.typ)); } else if (p->info.typ->type == Tarray) { fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, a->%s, \"%s\"))", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type(p->info.typ)); } else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { fprintf(fout, "\n\t\t\t\tif (a->%s.soap_in(soap, %s, \"%s\"))", ident(p->sym->name), field(p, nse), xsi_type(p->info.typ)); } else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, &a->%s, \"%s\"))", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type(p->info.typ)); } } if (!is_invisible(p->sym->name) && !is_primclass(typ) && p->info.typ->type != Tfun && !is_void(p->info.typ)) { if (is_container(p->info.typ)) fprintf(fout, "\n\t\t\t\t\tcontinue;"); else { fprintf(fout, "\n\t\t\t\t{\tsoap_flag_%s--;", ident(p->sym->name)); fprintf(fout, "\n\t\t\t\t\tcontinue;"); fprintf(fout, "\n\t\t\t\t}"); } } } fflush(fout); } } if (!is_discriminant(typ)) { for (t = table; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (is_repetition(p) && (is_unmatched(p->next->sym) || (is_invisible(p->next->sym->name)))) { flag = 1; fprintf(fout, "\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH && "); if (is_unmatched(p->next->sym)) fprintf(fout, "!soap_element_begin_in(soap, NULL, 1, NULL))"); else if (is_invisible(p->next->sym->name)) fprintf(fout, "!soap_peek_element(soap))"); fprintf(fout, "\n\t\t\t{\tif (a->%s == NULL)\n\t\t\t\t{\tif (soap_blist_%s == NULL)\n\t\t\t\t\t\tsoap_blist_%s = soap_new_block(soap);", ident(p->next->sym->name), ident(p->next->sym->name), ident(p->next->sym->name)); if (((Tnode*)p->next->info.typ->ref)->type == Tclass || has_class((Tnode*)p->next->info.typ->ref) || (!cflag && ((Tnode*)p->next->info.typ->ref)->type == Tstruct)) fprintf(fout, "\n\t\t\t\t\ta->%s = soap_block<%s>::push(soap, soap_blist_%s);\n\t\t\t\t\tif (a->%s == NULL)\n\t\t\t\t\t\treturn NULL;", ident(p->next->sym->name), c_type(p->next->info.typ->ref), ident(p->next->sym->name), ident(p->next->sym->name)); else if (((Tnode*)p->next->info.typ->ref)->type == Tpointer && (p->next->info.sto & Sconstptr)) fprintf(fout, "\n\t\t\t\t\ta->%s = (const %s)soap_push_block(soap, soap_blist_%s, sizeof(%s));\n\t\t\t\t\tif (a->%s == NULL)\n\t\t\t\t\t\treturn NULL;", ident(p->next->sym->name), c_type(p->next->info.typ), ident(p->next->sym->name), c_type((Tnode*)p->next->info.typ->ref), ident(p->next->sym->name)); else fprintf(fout, "\n\t\t\t\t\ta->%s = (%s)soap_push_block(soap, soap_blist_%s, sizeof(%s));\n\t\t\t\t\tif (a->%s == NULL)\n\t\t\t\t\t\treturn NULL;", ident(p->next->sym->name), c_type(p->next->info.typ), ident(p->next->sym->name), c_type((Tnode*)p->next->info.typ->ref), ident(p->next->sym->name)); if (((Tnode*)p->next->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->next->info.typ->ref) && !is_volatile((Tnode*)p->next->info.typ->ref) && !is_typedef((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\t\ta->%s->soap_default(soap);", ident(p->next->sym->name)); else if (((Tnode*)p->next->info.typ->ref)->type != Tpointer && !is_XML((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\t\tsoap_default_%s(soap, a->%s);", c_ident((Tnode*)p->next->info.typ->ref), ident(p->next->sym->name)); else fprintf(fout, "\n\t\t\t\t\t*a->%s = NULL;", ident(p->next->sym->name)); fprintf(fout, "\n\t\t\t\t}"); if (!is_invisible(p->next->sym->name)) fprintf(fout, "\n\t\t\t\tsoap_revert(soap);"); if (is_unmatched(p->next->sym)) { if (is_XML((Tnode*)p->next->info.typ->ref) && is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_inliteral(soap, NULL, (char**)a->%s))", ident(p->next->sym->name)); else if (is_XML((Tnode*)p->next->info.typ->ref) && is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_inwliteral(soap, NULL, (wchar_t**)a->%s))", ident(p->next->sym->name)); else if (is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, NULL, (char**)a->%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); else if (is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, NULL, (wchar_t**)a->%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); else fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, NULL, a->%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); } else { if (is_XML((Tnode*)p->next->info.typ->ref) && is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_inliteral(soap, %s, (char**)a->%s))", field(p->next, nse), ident(p->next->sym->name)); else if (is_XML((Tnode*)p->next->info.typ->ref) && is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_inwliteral(soap, %s, (wchar_t**)a->%s))", field(p->next, nse), ident(p->next->sym->name)); else if (is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, (char**)a->%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), field(p->next, nse), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); else if (is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, (wchar_t**)a->%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), field(p->next, nse), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); else fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, a->%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), field(p->next, nse), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); } fprintf(fout, "\n\t\t\t\t{\ta->%s++;\n\t\t\t\t\ta->%s = NULL;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}", ident(p->sym->name), ident(p->next->sym->name)); p = p->next; } else if (is_repetition(p) || is_anytype(p) || is_choice(p)) { p = p->next; continue; } else if (is_invisible(p->sym->name) && !(p->info.sto & (Sconst | Sprivate | Sprotected)) && !is_transient(p->info.typ) && !(p->info.sto & Sattribute)) { flag = 1; if (is_string(p->info.typ) || is_wstring(p->info.typ) || is_stdstr(p->info.typ)) fprintf(fout, "\n\t\t\tif (soap_flag_%s && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))", ident(p->sym->name)); else if (is_container(p->info.typ)) fprintf(fout, "\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH)"); else fprintf(fout, "\n\t\t\tif (soap_flag_%s && soap->error == SOAP_TAG_MISMATCH)", ident(p->sym->name)); if (is_XML(p->info.typ) && is_string(p->info.typ)) fprintf(fout, "\n\t\t\t\tif (soap_inliteral(soap, %s, (char**)&a->%s))", field(p, nse), ident(p->sym->name)); else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) fprintf(fout, "\n\t\t\t\tif (soap_inwliteral(soap, %s, (wchar_t**)&a->%s))", field(p, nse), ident(p->sym->name)); else if (is_string(p->info.typ)) fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, (char**)&a->%s, \"%s\"))", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type(p->info.typ)); else if (is_wstring(p->info.typ)) fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, (wchar_t**)&a->%s, \"%s\"))", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type(p->info.typ)); else if (p->info.typ->type == Tarray) fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, a->%s, \"%s\"))", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type(p->info.typ)); else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) fprintf(fout, "\n\t\t\t\tif (a->%s.soap_in(soap, %s, \"%s\"))", ident(p->sym->name), field(p, nse), xsi_type(p->info.typ)); else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, &a->%s, \"%s\"))", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type(p->info.typ)); if (is_container(p->info.typ)) fprintf(fout, "\n\t\t\t\t\tcontinue;"); else { fprintf(fout, "\n\t\t\t\t{\tsoap_flag_%s--;", ident(p->sym->name)); fprintf(fout, "\n\t\t\t\t\tcontinue;"); fprintf(fout, "\n\t\t\t\t}"); } } } } for (t = table; t; t = t->prev) for (p = t->list; p; p = p->next) if (p->info.sto & Sreturn) if (nse || has_ns_eq(NULL, p->sym->name)) fprintf(fout, "\n\t\t\tsoap_check_result(soap, \"%s\");", ns_add(p, nse)); if (!flag && is_invisible(typ->id->name)) fprintf(fout, "\n\tsoap->error = SOAP_TAG_MISMATCH;\n\ta = NULL;"); if (!is_invisible(typ->id->name) || (table && (table->prev || table->list))) { fprintf(fout, "\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH)"); if (!is_invisible(typ->id->name) || is_discriminant(typ)) fprintf(fout, "\n\t\t\t\tsoap->error = soap_ignore_element(soap);"); else fprintf(fout, "\n\t\t\t\tif (soap_flag)\n\t\t\t\t{\tsoap->error = SOAP_OK;\n\t\t\t\t\tbreak;\n\t\t\t\t}"); if (!is_invisible(typ->id->name)) fprintf(fout, "\n\t\t\tif (soap->error == SOAP_NO_TAG)"); else fprintf(fout, "\n\t\t\tif (soap_flag && soap->error == SOAP_NO_TAG)"); fprintf(fout, "\n\t\t\t\tbreak;"); fprintf(fout, "\n\t\t\tif (soap->error)\n\t\t\t\treturn NULL;"); fprintf(fout, "\n\t\t}"); } } if (table && !is_discriminant(typ)) { for (p = table->list; p; p = p->next) { if (is_repetition(p)) { if (((Tnode*)p->next->info.typ->ref)->type == Tclass || has_class((Tnode*)p->next->info.typ->ref) || (((Tnode*)p->next->info.typ->ref)->type == Tstruct && !cflag)) { fprintf(fout, "\n\t\tif (a->%s)\n\t\t\tsoap_block<%s>::pop(soap, soap_blist_%s);", ident(p->next->sym->name), c_type(p->next->info.typ->ref), ident(p->next->sym->name)); fprintf(fout, "\n\t\tif (a->%s)\n\t\t{\ta->%s = soap_new_%s(soap, a->%s);\n\t\t\tif (!a->%s)\n\t\t\t\treturn NULL;\n\t\t\tsoap_block<%s>::save(soap, soap_blist_%s, a->%s);\n\t\t}\n\t\telse\n\t\t{\ta->%s = NULL;\n\t\t\tif (soap_blist_%s)\n\t\t\t\tsoap_block<%s>::end(soap, soap_blist_%s);\n\t\t}", ident(p->sym->name), ident(p->next->sym->name), c_ident(p->next->info.typ->ref), ident(p->sym->name), ident(p->next->sym->name), c_type(p->next->info.typ->ref), ident(p->next->sym->name), ident(p->next->sym->name), ident(p->next->sym->name), ident(p->next->sym->name), c_type(p->next->info.typ->ref), ident(p->next->sym->name)); } else { fprintf(fout, "\n\t\tif (a->%s)\n\t\t\tsoap_pop_block(soap, soap_blist_%s);", ident(p->next->sym->name), ident(p->next->sym->name)); if ((((Tnode*)p->next->info.typ->ref)->type == Tpointer && (p->next->info.sto & Sconstptr))) fprintf(fout, "\n\t\tif (a->%s)\n\t\t{\ta->%s = (const %s)soap_save_block(soap, soap_blist_%s, NULL, 1);\n\t\t}\n\t\telse\n\t\t{\ta->%s = NULL;\n\t\t\tif (soap_blist_%s)\n\t\t\t\tsoap_end_block(soap, soap_blist_%s);\n\t\t}", ident(p->sym->name), ident(p->next->sym->name), c_type(p->next->info.typ), ident(p->next->sym->name), ident(p->next->sym->name), ident(p->next->sym->name), ident(p->next->sym->name)); else fprintf(fout, "\n\t\tif (a->%s)\n\t\t{\ta->%s = (%s)soap_save_block(soap, soap_blist_%s, NULL, 1);\n\t\t}\n\t\telse\n\t\t{\ta->%s = NULL;\n\t\t\tif (soap_blist_%s)\n\t\t\t\tsoap_end_block(soap, soap_blist_%s);\n\t\t}", ident(p->sym->name), ident(p->next->sym->name), c_type(p->next->info.typ), ident(p->next->sym->name), ident(p->next->sym->name), ident(p->next->sym->name), ident(p->next->sym->name)); } p = p->next; } } } strict = 0; nonempty = 0; if (table && !is_discriminant(typ)) { for (p = table->list; p; p = p->next) { if (p->info.minOccurs > 0 && p->info.maxOccurs >= 0 && !(p->info.sto & (Sconst | Sprivate | Sprotected)) && !(p->info.sto & Sattribute) && p->info.typ->type != Tfun && !is_void(p->info.typ) && !is_transient(p->info.typ) && !is_container(p->info.typ) && !is_repetition(p) && !is_choice(p) && p->info.hasval == False) { if (is_item(p)) continue; if (is_anytype(p)) p = p->next; if (strict == 0) { fprintf(fout, "\n\t\tif (%s(soap_flag_%s > " SOAP_LONG_FORMAT "", strict_check(), ident(p->sym->name), p->info.maxOccurs - p->info.minOccurs); strict = 1; } else fprintf(fout, " || soap_flag_%s > " SOAP_LONG_FORMAT "", ident(p->sym->name), p->info.maxOccurs - p->info.minOccurs); nonempty = 1; } else if (is_container(p->info.typ)) { if (p->info.minOccurs > 0) { if (p->info.typ->type == Tpointer) { if (strict == 0) { fprintf(fout, "\n\t\tif (%s(!a->%s || a->%s->size() < " SOAP_LONG_FORMAT, strict_check(), ident(p->sym->name), ident(p->sym->name), p->info.minOccurs); strict = 1; } else fprintf(fout, " || !a->%s || a->%s->size() < " SOAP_LONG_FORMAT, ident(p->sym->name), ident(p->sym->name), p->info.minOccurs); } else { if (strict == 0) { fprintf(fout, "\n\t\tif (%s(a->%s.size() < " SOAP_LONG_FORMAT, strict_check(), ident(p->sym->name), p->info.minOccurs); strict = 1; } else fprintf(fout, " || a->%s.size() < " SOAP_LONG_FORMAT, ident(p->sym->name), p->info.minOccurs); } nonempty = 1; } if (p->info.maxOccurs > 1) { if (p->info.typ->type == Tpointer) { if (strict == 0) { fprintf(fout, "\n\t\tif (%s((a->%s && a->%s->size() > " SOAP_LONG_FORMAT ")", strict_check(), ident(p->sym->name), ident(p->sym->name), p->info.maxOccurs); strict = 1; } else fprintf(fout, " || (a->%s && a->%s->size() > " SOAP_LONG_FORMAT ")", ident(p->sym->name), ident(p->sym->name), p->info.maxOccurs); } else { if (strict == 0) { fprintf(fout, "\n\t\tif (%s(a->%s.size() > " SOAP_LONG_FORMAT, strict_check(), ident(p->sym->name), p->info.maxOccurs); strict = 1; } else fprintf(fout, " || a->%s.size() > " SOAP_LONG_FORMAT, ident(p->sym->name), p->info.maxOccurs); } } } else if (is_repetition(p)) { if (p->info.minOccurs > 0) { if (strict == 0) { fprintf(fout, "\n\t\tif (%s(a->%s < " SOAP_LONG_FORMAT, strict_check(), ident(p->sym->name), p->info.minOccurs); strict = 1; } else fprintf(fout, " || a->%s < " SOAP_LONG_FORMAT, ident(p->sym->name), p->info.minOccurs); nonempty = 1; } if (p->info.maxOccurs > 1) { if (strict == 0) { fprintf(fout, "\n\t\tif (%s(a->%s > " SOAP_LONG_FORMAT, strict_check(), ident(p->sym->name), p->info.maxOccurs); strict = 1; } else fprintf(fout, " || a->%s > " SOAP_LONG_FORMAT, ident(p->sym->name), p->info.maxOccurs); } p = p->next; } else if (is_choice(p)) { if (p->info.minOccurs != 0 && required_choice(p->next->info.typ) < 0) { if (strict == 0) { fprintf(fout, "\n\t\tif (%s(soap_flag_%s", strict_check(), ident(p->next->sym->name)); strict = 1; } else fprintf(fout, " || soap_flag_%s", ident(p->next->sym->name)); nonempty = 1; } p = p->next; } } if (strict) fprintf(fout, "))\n\t\t{\tsoap->error = SOAP_OCCURS;\n\t\t\treturn NULL;\n\t\t}"); } if (has_getter(typ)) fprintf(fout, "\n\t\tif (a->get(soap))\n\t\t\treturn NULL;"); if (!is_invisible(typ->id->name)) { if (is_discriminant(typ)) fprintf(fout, "\n\t\tif (tag && *tag != '-')\n\t\t{\tsoap->error = soap_ignore_element(soap);\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH || soap_element_end_in(soap, tag))\n\t\t\t\treturn NULL;\n\t\t}"); else fprintf(fout, "\n\t\tif (soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); if (nonempty) fprintf(fout, "\n\t}\n\telse if (%s!*soap->href)\n\t{\tsoap->error = SOAP_OCCURS;\n\t\treturn NULL;", strict_check()); fprintf(fout, "\n\t}\n\telse\n\t{\t"); if (!cflag) fprintf(fout, "a = (%s)soap_id_forward(soap, soap->href, (void*)a, 0, %s, %s, sizeof(%s), 0, %s_finsert, NULL);", c_type_id(typ, "*"), soap_type(typ), soap_type(typ), c_type(typ), prefix); else fprintf(fout, "a = (%s)soap_id_forward(soap, soap->href, (void*)a, 0, %s, %s, sizeof(%s), 0, NULL, NULL);", c_type_id(typ, "*"), soap_type(typ), soap_type(typ), c_type(typ)); fprintf(fout, "\n\t\tif (soap->body && soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); fprintf(fout, "\n\t}"); } fprintf(fout, "\n\treturn a;\n}"); } break; case Tclass: if (is_external(typ) && !is_volatile(typ)) { fprintf(fhead, "\nSOAP_FMAC1 %s SOAP_FMAC2 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*")); if (!is_volatile(typ) && !is_typedef(typ)) { fprintf(fout, "\n\nvoid *%s::soap_in(struct soap *soap, const char *tag, const char *type)", c_type(typ)); fprintf(fout, "\n{\treturn soap_in_%s(soap, tag, this, type);\n}", c_ident(typ)); fflush(fout); } fprintf(fout, "\n\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, %s, const char *type)\n{", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*a")); fprintf(fout, "\n\t(void)tag; (void)type; /* appease -Wall -Werror */"); if (!typ->ref) { fprintf(fout, "\n\t(void)soap; (void)a; /* appease -Wall -Werror */"); fprintf(fout, "\n\tif (!a)\n\t\tsoap->error = SOAP_TAG_MISMATCH;\n\treturn a;\n}"); } else if (is_primclass(typ)) { table = (Table*)typ->ref; fprintf(fout, "\n\tif (soap_element_begin_in(soap, tag, 1, NULL))\n\t\treturn NULL;"); fprintf(fout, "\n\tif (!(a = (%s)soap_id_enter(soap, soap->id, a, %s, sizeof(%s), soap->type, soap->arrayType, %s_instantiate, %s_fbase)))\n\t{\tsoap->error = SOAP_TAG_MISMATCH;\n\t\treturn NULL;\n\t}", c_type_id(typ, "*"), soap_type(typ), c_type(typ), prefix, prefix); fprintf(fout, "\n\tsoap_revert(soap);\n\t*soap->id = '\\0';"); if (table && table->prev) { fprintf(fout, "\n\tif (soap->alloced && soap->alloced != %s)", soap_type(typ)); fprintf(fout, "\n\t\treturn (%s)a->soap_in(soap, tag, type);", c_type_id(typ, "*")); } fprintf(fout, "\n\tif (soap->alloced)\n\t\ta->soap_default(soap);"); for (t = table; t; t = t->prev) { Entry *e = entry(classtable, t->sym); const char *nsa1 = e ? ns_qualifiedAttribute(e->info.typ) : nsa; for (p = t->list; p; p = p->next) if (p->info.sto & Sattribute) soap_attr_value(p, ptr_cast(t, "a"), ident(p->sym->name), ns_add(p, nsa1)); } fflush(fout); for (table = (Table*)typ->ref; table; table = table->prev) { p = table->list; while (p && !is_item(p)) p = p->next; if (p) break; } if (is_XML(p->info.typ) && is_string(p->info.typ)) fprintf(fout, "\n\tif (!soap_inliteral(soap, tag, (char**)&a->%s::%s))", ident(table->sym->name), ident(p->sym->name)); else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) fprintf(fout, "\n\tif (!soap_inwliteral(soap, tag, (wchar_t**)&a->%s::%s))", ident(table->sym->name), ident(p->sym->name)); else if (is_string(p->info.typ)) fprintf(fout, "\n\tif (!soap_in_%s(soap, tag, (char**)&a->%s::%s, \"%s\"))", c_ident(p->info.typ), ident(table->sym->name), ident(p->sym->name), xsi_type(typ)); else if (is_wstring(p->info.typ)) fprintf(fout, "\n\tif (!soap_in_%s(soap, tag, (wchar_t**)&a->%s::%s, \"%s\"))", c_ident(p->info.typ), ident(table->sym->name), ident(p->sym->name), xsi_type(typ)); else if (p->info.typ->type == Tarray) fprintf(fout, "\n\tif (!soap_in_%s(soap, tag, a->%s::%s, \"%s\"))", c_ident(p->info.typ), ident(table->sym->name), ident(p->sym->name), xsi_type(typ)); else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) fprintf(fout, "\n\tif (!(a->%s::%s).soap_in(soap, tag, \"%s\"))", ident(table->sym->name), ident(p->sym->name), xsi_type(typ)); else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) fprintf(fout, "\n\tif (!soap_in_%s(soap, tag, &a->%s::%s, \"%s\"))", c_ident(p->info.typ), ident(table->sym->name), ident(p->sym->name), xsi_type(typ)); fprintf(fout, "\n\t\treturn NULL;"); if (has_getter(typ)) fprintf(fout, "\n\tif (a->get(soap))\n\t\treturn NULL;"); fprintf(fout, "\n\treturn a;\n}"); } else { if (!is_invisible(typ->id->name)) { fprintf(fout, "\n\tif (soap_element_begin_in(soap, tag, 0, NULL))\n\t\treturn NULL;"); fprintf(fout, "\n\ta = (%s)soap_id_enter(soap, soap->id, a, %s, sizeof(%s), soap->type, soap->arrayType, %s_instantiate, %s_fbase);", c_type_id(typ, "*"), soap_type(typ), c_type(typ), prefix, prefix); } else fprintf(fout, "\n\ta = (%s)soap_id_enter(soap, \"\", a, %s, sizeof(%s), soap->type, soap->arrayType, %s_instantiate, %s_fbase);", c_type_id(typ, "*"), soap_type(typ), c_type(typ), prefix, prefix); fprintf(fout, "\n\tif (!a)\n\t\treturn NULL;"); table = (Table*)typ->ref; if (!is_discriminant(typ)) { if (table && table->prev && !is_invisible(typ->id->name)) { fprintf(fout, "\n\tif (soap->alloced && soap->alloced != %s)", soap_type(typ)); fprintf(fout, "\n\t{\tsoap_revert(soap);"); fprintf(fout, "\n\t\t*soap->id = '\\0';"); if (is_volatile(typ) || is_typedef(typ)) fprintf(fout, "\n\t\treturn soap_in_%s(soap, tag, a, type);", c_ident(typ)); else fprintf(fout, "\n\t\treturn (%s)a->soap_in(soap, tag, type);", c_type_id(typ, "*")); fprintf(fout, "\n\t}"); } } fprintf(fout, "\n\tif (soap->alloced)"); if (is_volatile(typ) || is_typedef(typ)) fprintf(fout, "\n\t\tsoap_default_%s(soap, a);", c_ident(typ)); else fprintf(fout, "\n\t\ta->soap_default(soap);"); for (t = table; t; t = t->prev) { Entry *e = entry(classtable, t->sym); const char *nsa1 = e ? ns_qualifiedAttribute(e->info.typ) : nsa; for (p = t->list; p; p = p->next) if (p->info.sto & Sattribute) soap_attr_value(p, ptr_cast(t, "a"), ident(p->sym->name), ns_add(p, nsa1)); } fflush(fout); i = 0; if (!is_discriminant(typ)) { for (t = table; t; t = t->prev) i++; for (; i > 0; i--) { t = table; for (j = 0; j < i-1; j++) t = t->prev; if (!t->prev) { Entry *e = entry(classtable, t->sym); if (e && e->info.typ && e->info.typ->base && !strcmp(e->info.typ->base->name, "soap_dom_element")) fprintf(fout, "\n\tsize_t soap_flag_soap_dom_element = 1;"); } for (p = t->list; p; p = p->next) { if (!(p->info.sto & (Sconst | Sprivate | Sprotected)) && !(p->info.sto & Sattribute) && p->info.typ->type != Tfun && !is_void(p->info.typ)) { if (is_anytype(p) || is_choice(p)) { p = p->next; fprintf(fout, "\n\tsize_t soap_flag_%s%d = " SOAP_LONG_FORMAT ";", ident(p->sym->name), i, p->info.maxOccurs); } else if (is_repetition(p)) { fprintf(fout, "\n\tstruct soap_blist *soap_blist_%s%d = NULL;", ident(p->next->sym->name), i); p = p->next; } else if (!is_transient(p->info.typ) && !is_container(p->info.typ)) fprintf(fout, "\n\tsize_t soap_flag_%s%d = " SOAP_LONG_FORMAT ";", ident(p->sym->name), i, p->info.maxOccurs); } } } } fflush(fout); if (!is_invisible(typ->id->name)) { if (!is_discriminant(typ)) { fprintf(fout, "\n\tif (soap->body && !*soap->href)\n\t{"); fprintf(fout, "\n\t\tfor (;;)\n\t\t{\tsoap->error = SOAP_TAG_MISMATCH;"); } else fprintf(fout, "\n\tif (!tag || *tag == '-' || (soap->body && !*soap->href))\n\t{"); } else if (!is_discriminant(typ)) { if (table && (table->prev || table->list)) fprintf(fout, "\n\t\tfor (short soap_flag = 0;; soap_flag = 1)\n\t\t{\tsoap->error = SOAP_TAG_MISMATCH;"); } table = (Table*)typ->ref; i = 0; flag = 0; for (t = table; t; t = t->prev) i++; for (; i > 0; i--) { Entry *e; const char *nse1; t = table; for (j = 0; j < i-1; j++) t = t->prev; e = entry(classtable, t->sym); nse1 = e ? ns_qualifiedElement(e->info.typ) : nse; for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun || p->info.typ->type == Tunion || is_soapref(p->info.typ)) ; else if (is_item(p)) ; else if (p->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fout, "\n\t\t\t/* non-serializable %s skipped */", ident(p->sym->name)); else if (p->info.sto & Sattribute) ; else if (is_repetition(p)) { if (is_unmatched(p->next->sym) || is_invisible(p->next->sym->name)) { p = p->next; continue; } flag = 1; fprintf(fout, "\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH && "); fprintf(fout, "!soap_element_begin_in(soap, %s, 1, NULL))", field(p->next, nse1)); fprintf(fout, "\n\t\t\t{\tif (a->%s::%s == NULL)\n\t\t\t\t{\tif (soap_blist_%s%d == NULL)\n\t\t\t\t\t\tsoap_blist_%s%d = soap_new_block(soap);", ident(t->sym->name), ident(p->next->sym->name), ident(p->next->sym->name), i, ident(p->next->sym->name), i); if (((Tnode*)p->next->info.typ->ref)->type == Tclass || has_class((Tnode*)p->next->info.typ->ref) || (!cflag && ((Tnode*)p->next->info.typ->ref)->type == Tstruct)) fprintf(fout, "\n\t\t\t\t\ta->%s::%s = soap_block<%s>::push(soap, soap_blist_%s%d);\n\t\t\t\t\tif (a->%s::%s == NULL)\n\t\t\t\t\t\treturn NULL;", ident(t->sym->name), ident(p->next->sym->name), c_type(p->next->info.typ->ref), ident(p->next->sym->name), i, ident(t->sym->name), ident(p->next->sym->name)); else if (((Tnode*)p->next->info.typ->ref)->type == Tpointer && (p->next->info.sto & Sconstptr)) fprintf(fout, "\n\t\t\t\t\ta->%s::%s = (const %s)soap_push_block(soap, soap_blist_%s%d, sizeof(%s));\n\t\t\t\t\tif (a->%s::%s == NULL)\n\t\t\t\t\t\treturn NULL;", ident(t->sym->name), ident(p->next->sym->name), c_type(p->next->info.typ), ident(p->next->sym->name), i, c_type((Tnode*)p->next->info.typ->ref), ident(t->sym->name), ident(p->next->sym->name)); else fprintf(fout, "\n\t\t\t\t\ta->%s::%s = (%s)soap_push_block(soap, soap_blist_%s%d, sizeof(%s));\n\t\t\t\t\tif (a->%s::%s == NULL)\n\t\t\t\t\t\treturn NULL;", ident(t->sym->name), ident(p->next->sym->name), c_type(p->next->info.typ), ident(p->next->sym->name), i, c_type((Tnode*)p->next->info.typ->ref), ident(t->sym->name), ident(p->next->sym->name)); if (((Tnode*)p->next->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->next->info.typ->ref) && !is_volatile((Tnode*)p->next->info.typ->ref) && !is_typedef((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\t\ta->%s::%s->soap_default(soap);", ident(t->sym->name), ident(p->next->sym->name)); else if (((Tnode*)p->next->info.typ->ref)->type != Tpointer && !is_XML((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\t\tsoap_default_%s(soap, a->%s::%s);", c_ident((Tnode*)p->next->info.typ->ref), ident(t->sym->name), ident(p->next->sym->name)); else fprintf(fout, "\n\t\t\t\t\t*a->%s::%s = NULL;", ident(t->sym->name), ident(p->next->sym->name)); fprintf(fout, "\n\t\t\t\t}"); fprintf(fout, "\n\t\t\t\tsoap_revert(soap);"); if (is_XML((Tnode*)p->next->info.typ->ref) && is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_inliteral(soap, %s, (char**)a->%s::%s))", field(p->next, nse1), ident(t->sym->name), ident(p->next->sym->name)); else if (is_XML((Tnode*)p->next->info.typ->ref) && is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_inwliteral(soap, %s, (wchar_t**)a->%s::%s))", field(p->next, nse1), ident(t->sym->name), ident(p->next->sym->name)); else if (is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, (char**)a->%s::%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), field(p->next, nse1), ident(t->sym->name), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); else if (is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, (wchar_t**)a->%s::%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), field(p->next, nse1), ident(t->sym->name), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); else fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, a->%s::%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), field(p->next, nse1), ident(t->sym->name), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); fprintf(fout, "\n\t\t\t\t{\ta->%s::%s++;\n\t\t\t\t\ta->%s::%s = NULL;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}", ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->next->sym->name)); p = p->next; } else if (is_anytype(p)) { flag = 1; fprintf(fout, "\n\t\t\tif (soap_flag_%s%d && soap->error == SOAP_TAG_MISMATCH)", ident(p->next->sym->name), i); fprintf(fout, "\n\t\t\t\tif ((a->%s::%s = soap_getelement(soap, &a->%s::%s)))", ident(t->sym->name), ident(p->next->sym->name), ident(t->sym->name), ident(p->sym->name)); fprintf(fout, "\n\t\t\t\t{\tsoap_flag_%s%d = 0;", ident(p->next->sym->name), i); fprintf(fout, "\n\t\t\t\t\tcontinue;"); fprintf(fout, "\n\t\t\t\t}"); p = p->next; } else if (is_discriminant(typ) && p->next) { flag = 1; fprintf(fout, "\n\t\tif (!soap_in_%s(soap, &a->%s, &a->%s))", c_ident(p->next->info.typ), ident(p->sym->name), ident(p->next->sym->name)); fprintf(fout, "\n\t\t\treturn NULL;"); i = 0; break; } else if (is_choice(p)) { flag = 1; fprintf(fout, "\n\t\t\tif (soap_flag_%s%d && soap->error == SOAP_TAG_MISMATCH)", ident(p->next->sym->name), i); fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, &a->%s::%s, &a->%s::%s))", c_ident(p->next->info.typ), ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->next->sym->name)); fprintf(fout, "\n\t\t\t\t{\tsoap_flag_%s%d = 0;", ident(p->next->sym->name), i); fprintf(fout, "\n\t\t\t\t\tcontinue;"); fprintf(fout, "\n\t\t\t\t}"); p = p->next; } else if (is_transient(p->info.typ)) { fprintf(fout, "\n\t\t\t/* transient %s skipped */", ident(p->sym->name)); } else { flag = 1; if (!is_invisible(p->sym->name) && !is_primclass(typ) && p->info.typ->type != Tfun && !is_void(p->info.typ)) { if (is_string(p->info.typ) || is_wstring(p->info.typ) || is_stdstr(p->info.typ)) fprintf(fout, "\n\t\t\tif (soap_flag_%s%d && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))", ident(p->sym->name), i); else if (is_container(p->info.typ)) fprintf(fout, "\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH)"); else fprintf(fout, "\n\t\t\tif (soap_flag_%s%d && soap->error == SOAP_TAG_MISMATCH)", ident(p->sym->name), i); } if (is_unmatched(p->sym)) { if (is_XML(p->info.typ) && is_string(p->info.typ)) { fprintf(fout, "\n\t\t\t\tif (soap_inliteral(soap, NULL, (char**)&a->%s::%s))", ident(t->sym->name), ident(p->sym->name)); } else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) { fprintf(fout, "\n\t\t\t\tif (soap_inwliteral(soap, NULL, (wchar_t**)&a->%s::%s))", ident(t->sym->name), ident(p->sym->name)); } else if (is_string(p->info.typ)) { fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, NULL, (char**)&a->%s::%s, \"%s\"))", c_ident(p->info.typ), ident(t->sym->name), ident(p->sym->name), xsi_type(p->info.typ)); } else if (is_wstring(p->info.typ)) { fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, NULL, (wchar_t**)&a->%s::%s, \"%s\"))", c_ident(p->info.typ), ident(t->sym->name), ident(p->sym->name), xsi_type(p->info.typ)); } else if (p->info.typ->type == Tarray) { fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, NULL, a->%s::%s, \"%s\"))", c_ident(p->info.typ), ident(t->sym->name), ident(p->sym->name), xsi_type(p->info.typ)); } else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { fprintf(fout, "\n\t\t\t\tif ((a->%s::%s).soap_in(soap, NULL, \"%s\"))", ident(t->sym->name), ident(p->sym->name), xsi_type(p->info.typ)); } else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, NULL, &a->%s::%s, \"%s\"))", c_ident(p->info.typ), ident(t->sym->name), ident(p->sym->name), xsi_type(p->info.typ)); } } else if (!is_invisible(p->sym->name)) { if (is_XML(p->info.typ) && is_string(p->info.typ)) { fprintf(fout, "\n\t\t\t\tif (soap_inliteral(soap, %s, (char**)&a->%s::%s))", field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name)); } else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) { fprintf(fout, "\n\t\t\t\tif (soap_inwliteral(soap, %s, (wchar_t**)&a->%s::%s))", field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name)); } else if (is_string(p->info.typ)) { fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, (char**)&a->%s::%s, \"%s\"))", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name), xsi_type(p->info.typ)); } else if (is_wstring(p->info.typ)) { fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, (wchar_t**)&a->%s::%s, \"%s\"))", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name), xsi_type(p->info.typ)); } else if (p->info.typ->type == Tarray) { fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, a->%s::%s, \"%s\"))", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name), xsi_type(p->info.typ)); } else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { fprintf(fout, "\n\t\t\t\tif ((a->%s::%s).soap_in(soap, %s, \"%s\"))", ident(t->sym->name), ident(p->sym->name), field_overridden(t, p, nse1), xsi_type(p->info.typ)); } else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, &a->%s::%s, \"%s\"))", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name), xsi_type(p->info.typ)); } } if (!is_invisible(p->sym->name) && !is_primclass(typ) && p->info.typ->type != Tfun && !is_void(p->info.typ)) { if (is_container(p->info.typ)) fprintf(fout, "\n\t\t\t\t\tcontinue;"); else { fprintf(fout, "\n\t\t\t\t{\tsoap_flag_%s%d--;", ident(p->sym->name), i); fprintf(fout, "\n\t\t\t\t\tcontinue;"); fprintf(fout, "\n\t\t\t\t}"); } } fflush(fout); } } } if (!is_discriminant(typ)) { Entry *e; const char *nse1; i = 0; for (t = table; t; t = t->prev) { i++; e = entry(classtable, t->sym); nse1 = e ? ns_qualifiedElement(e->info.typ) : nse; for (p = t->list; p; p = p->next) { if (is_repetition(p) && (is_unmatched(p->next->sym) || is_invisible(p->next->sym->name))) { flag = 1; fprintf(fout, "\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH && "); if (is_unmatched(p->next->sym)) fprintf(fout, "!soap_element_begin_in(soap, NULL, 1, NULL))"); else if (is_invisible(p->next->sym->name)) fprintf(fout, "!soap_peek_element(soap))"); fprintf(fout, "\n\t\t\t{\tif (a->%s::%s == NULL)\n\t\t\t\t{\tif (soap_blist_%s%d == NULL)\n\t\t\t\t\t\tsoap_blist_%s%d = soap_new_block(soap);", ident(t->sym->name), ident(p->next->sym->name), ident(p->next->sym->name), i, ident(p->next->sym->name), i); if (((Tnode*)p->next->info.typ->ref)->type == Tclass || has_class((Tnode*)p->next->info.typ->ref) || (!cflag && ((Tnode*)p->next->info.typ->ref)->type == Tstruct)) fprintf(fout, "\n\t\t\t\t\ta->%s::%s = soap_block<%s>::push(soap, soap_blist_%s%d);\n\t\t\t\t\tif (a->%s::%s == NULL)\n\t\t\t\t\t\treturn NULL;", ident(t->sym->name), ident(p->next->sym->name), c_type(p->next->info.typ->ref), ident(p->next->sym->name), i, ident(t->sym->name), ident(p->next->sym->name)); else if (((Tnode*)p->next->info.typ->ref)->type == Tpointer && (p->next->info.sto & Sconstptr)) fprintf(fout, "\n\t\t\t\t\ta->%s::%s = (const %s)soap_push_block(soap, soap_blist_%s%d, sizeof(%s));\n\t\t\t\t\tif (a->%s::%s == NULL)\n\t\t\t\t\t\treturn NULL;", ident(t->sym->name), ident(p->next->sym->name), c_type(p->next->info.typ), ident(p->next->sym->name), i, c_type((Tnode*)p->next->info.typ->ref), ident(t->sym->name), ident(p->next->sym->name)); else fprintf(fout, "\n\t\t\t\t\ta->%s::%s = (%s)soap_push_block(soap, soap_blist_%s%d, sizeof(%s));\n\t\t\t\t\tif (a->%s::%s == NULL)\n\t\t\t\t\t\treturn NULL;", ident(t->sym->name), ident(p->next->sym->name), c_type(p->next->info.typ), ident(p->next->sym->name), i, c_type((Tnode*)p->next->info.typ->ref), ident(t->sym->name), ident(p->next->sym->name)); if (((Tnode*)p->next->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->next->info.typ->ref) && !is_volatile((Tnode*)p->next->info.typ->ref) && !is_typedef((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\t\ta->%s::%s->soap_default(soap);", ident(t->sym->name), ident(p->next->sym->name)); else if (((Tnode*)p->next->info.typ->ref)->type != Tpointer && !is_XML((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\t\tsoap_default_%s(soap, a->%s::%s);", c_ident((Tnode*)p->next->info.typ->ref), ident(t->sym->name), ident(p->next->sym->name)); else fprintf(fout, "\n\t\t\t\t\t*a->%s::%s = NULL;", ident(t->sym->name), ident(p->next->sym->name)); fprintf(fout, "\n\t\t\t\t}"); if (!is_invisible(p->next->sym->name)) fprintf(fout, "\n\t\t\t\tsoap_revert(soap);"); if (is_unmatched(p->next->sym)) { if (is_XML((Tnode*)p->next->info.typ->ref) && is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_inliteral(soap, NULL, (char**)a->%s::%s))", ident(t->sym->name), ident(p->next->sym->name)); else if (is_XML((Tnode*)p->next->info.typ->ref) && is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_inwliteral(soap, NULL, (wchar_t**)a->%s::%s))", ident(t->sym->name), ident(p->next->sym->name)); else if (is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, NULL, (char**)a->%s::%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), ident(t->sym->name), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); else if (is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, NULL, (wchar_t**)a->%s::%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), ident(t->sym->name), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); else fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, NULL, a->%s::%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), ident(t->sym->name), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); } else { if (is_XML((Tnode*)p->next->info.typ->ref) && is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_inliteral(soap, %s, (char**)a->%s::%s))", field(p->next, nse1), ident(t->sym->name), ident(p->next->sym->name)); else if (is_XML((Tnode*)p->next->info.typ->ref) && is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_inwliteral(soap, %s, (wchar_t**)a->%s::%s))", field(p->next, nse1), ident(t->sym->name), ident(p->next->sym->name)); else if (is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, (char**)a->%s::%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), field(p->next, nse1), ident(t->sym->name), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); else if (is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, (wchar_t**)a->%s::%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), field(p->next, nse1), ident(t->sym->name), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); else fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, a->%s::%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), field(p->next, nse1), ident(t->sym->name), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); } fprintf(fout, "\n\t\t\t\t{\ta->%s::%s++;\n\t\t\t\t\ta->%s::%s = NULL;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}", ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->next->sym->name)); p = p->next; } else if (is_repetition(p) || is_anytype(p) || is_choice(p)) { p = p->next; continue; } else if (is_invisible(p->sym->name) && !(p->info.sto & (Sconst | Sprivate | Sprotected)) && !is_transient(p->info.typ) && !(p->info.sto & Sattribute)) { flag = 1; if (is_string(p->info.typ) || is_wstring(p->info.typ) || is_stdstr(p->info.typ)) fprintf(fout, "\n\t\t\tif (soap_flag_%s%d && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))", ident(p->sym->name), i); else if (is_container(p->info.typ)) fprintf(fout, "\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH)"); else fprintf(fout, "\n\t\t\tif (soap_flag_%s%d && soap->error == SOAP_TAG_MISMATCH)", ident(p->sym->name), i); if (is_XML(p->info.typ) && is_string(p->info.typ)) { fprintf(fout, "\n\t\t\t\tif (soap_inliteral(soap, %s, (char**)&a->%s::%s))", field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name)); } else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) { fprintf(fout, "\n\t\t\t\tif (soap_inwliteral(soap, %s, (wchar_t**)&a->%s::%s))", field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name)); } else if (is_string(p->info.typ)) { fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, (char**)&a->%s::%s, \"%s\"))", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name), xsi_type(p->info.typ)); } else if (is_wstring(p->info.typ)) { fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, (wchar_t**)&a->%s::%s, \"%s\"))", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name), xsi_type(p->info.typ)); } else if (p->info.typ->type == Tarray) { fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, a->%s::%s, \"%s\"))", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name), xsi_type(p->info.typ)); } else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { fprintf(fout, "\n\t\t\t\tif ((a->%s::%s).soap_in(soap, %s, \"%s\"))", ident(t->sym->name), ident(p->sym->name), field_overridden(t, p, nse1), xsi_type(p->info.typ)); } else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, &a->%s::%s, \"%s\"))", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name), xsi_type(p->info.typ)); } if (is_container(p->info.typ)) fprintf(fout, "\n\t\t\t\t\tcontinue;"); else { fprintf(fout, "\n\t\t\t\t{\tsoap_flag_%s%d--;", ident(p->sym->name), i); fprintf(fout, "\n\t\t\t\t\tcontinue;"); fprintf(fout, "\n\t\t\t\t}"); } } } if (!t->prev && e && e->info.typ && e->info.typ->base && !strcmp(e->info.typ->base->name, "soap_dom_element")) { fprintf(fout, "\n\t\t\tif (soap_flag_soap_dom_element && soap->error == SOAP_TAG_MISMATCH)\n\t\t\t\tif (soap_in_xsd__anyType(soap, NULL, static_cast(a), NULL))"); fprintf(fout, "\n\t\t\t\t{\tsoap_flag_soap_dom_element = 0;"); fprintf(fout, "\n\t\t\t\t\tcontinue;"); fprintf(fout, "\n\t\t\t\t}"); } } for (t = table; t; t = t->prev) for (p = t->list; p; p = p->next) if (p->info.sto & Sreturn) if (nse || has_ns_eq(NULL, p->sym->name)) fprintf(fout, "\n\t\t\tsoap_check_result(soap, \"%s\");", ns_add(p, nse)); if (!flag && is_invisible(typ->id->name)) fprintf(fout, "\n\tsoap->error = SOAP_TAG_MISMATCH;\n\ta = NULL;"); if (!is_invisible(typ->id->name) || (table && (table->prev || table->list))) { fprintf(fout, "\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH)"); if (!is_invisible(typ->id->name) || is_discriminant(typ)) fprintf(fout, "\n\t\t\t\tsoap->error = soap_ignore_element(soap);"); else fprintf(fout, "\n\t\t\t\tif (soap_flag)\n\t\t\t\t{\n\t\t\t\t\tsoap->error = SOAP_OK;\n\t\t\t\t\tbreak;\n\t\t\t\t}"); if (!is_invisible(typ->id->name)) fprintf(fout, "\n\t\t\tif (soap->error == SOAP_NO_TAG)"); else fprintf(fout, "\n\t\t\tif (soap_flag && soap->error == SOAP_NO_TAG)"); fprintf(fout, "\n\t\t\t\tbreak;"); fprintf(fout, "\n\t\t\tif (soap->error)\n\t\t\t\treturn NULL;"); fprintf(fout, "\n\t\t}"); } } if (!is_discriminant(typ)) { i = 0; for (t = table; t; t = t->prev) i++; for (; i > 0; i--) { t = table; for (j = 0; j < i-1; j++) t = t->prev; for (p = t->list; p; p = p->next) { if (is_repetition(p)) { if (((Tnode*)p->next->info.typ->ref)->type == Tclass || has_class((Tnode*)p->next->info.typ->ref) || (((Tnode*)p->next->info.typ->ref)->type == Tstruct && !cflag)) { fprintf(fout, "\n\t\tif (a->%s::%s)\n\t\t\tsoap_block<%s>::pop(soap, soap_blist_%s%d);", ident(t->sym->name), ident(p->next->sym->name), c_type(p->next->info.typ->ref), ident(p->next->sym->name), i); fprintf(fout, "\n\t\tif (a->%s::%s)\n\t\t{\ta->%s::%s = soap_new_%s(soap, a->%s::%s);\n\t\t\tif (!a->%s::%s)\n\t\t\t\treturn NULL;\n\t\t\tsoap_block<%s>::save(soap, soap_blist_%s%d, a->%s::%s);\n\t\t}\n\t\telse\n\t\t{\ta->%s::%s = NULL;\n\t\t\tif (soap_blist_%s%d)\n\t\t\t\tsoap_block<%s>::end(soap, soap_blist_%s%d);\n\t\t}", ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->next->sym->name), c_ident(p->next->info.typ->ref), ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->next->sym->name), c_type(p->next->info.typ->ref), ident(p->next->sym->name), i, ident(t->sym->name), ident(p->next->sym->name), ident(t->sym->name), ident(p->next->sym->name), ident(p->next->sym->name), i, c_type(p->next->info.typ->ref), ident(p->next->sym->name), i); } else { fprintf(fout, "\n\t\tif (a->%s::%s)\n\t\t\tsoap_pop_block(soap, soap_blist_%s%d);", ident(t->sym->name), ident(p->next->sym->name), ident(p->next->sym->name), i); if ((((Tnode*)p->next->info.typ->ref)->type == Tpointer && (p->next->info.sto & Sconstptr))) fprintf(fout, "\n\t\tif (a->%s::%s)\n\t\t{\ta->%s::%s = (const %s)soap_save_block(soap, soap_blist_%s%d, NULL, 1);\n\t\t}\n\t\telse\n\t\t{\ta->%s::%s = NULL;\n\t\t\tif (soap_blist_%s%d)\n\t\t\t\tsoap_end_block(soap, soap_blist_%s%d);\n\t\t}", ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->next->sym->name), c_type(p->next->info.typ), ident(p->next->sym->name), i, ident(t->sym->name), ident(p->next->sym->name), ident(p->next->sym->name), i, ident(p->next->sym->name), i); else fprintf(fout, "\n\t\tif (a->%s::%s)\n\t\t{\ta->%s::%s = (%s)soap_save_block(soap, soap_blist_%s%d, NULL, 1);\n\t\t}\n\t\telse\n\t\t{\ta->%s::%s = NULL;\n\t\t\tif (soap_blist_%s%d)\n\t\t\t\tsoap_end_block(soap, soap_blist_%s%d);\n\t\t}", ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->next->sym->name), c_type(p->next->info.typ), ident(p->next->sym->name), i, ident(t->sym->name), ident(p->next->sym->name), ident(p->next->sym->name), i, ident(p->next->sym->name), i); } p = p->next; } } } } strict = 0; nonempty = 0; if (!is_discriminant(typ)) { i = 0; for (t = table; t; t = t->prev) i++; for (; i > 0; i--) { t = table; for (j = 0; j < i-1; j++) t = t->prev; for (p = t->list; p; p = p->next) { if (p->info.minOccurs > 0 && p->info.maxOccurs >= 0 && !(p->info.sto & (Sconst | Sprivate | Sprotected)) && !(p->info.sto & Sattribute) && p->info.typ->type != Tfun && !is_void(p->info.typ) && !is_transient(p->info.typ) && !is_container(p->info.typ) && !is_repetition(p) && !is_choice(p) && p->info.hasval == False) { if (is_item(p)) continue; if (is_anytype(p)) p = p->next; if (strict == 0) { fprintf(fout, "\n\t\tif (%s(soap_flag_%s%d > " SOAP_LONG_FORMAT, strict_check(), ident(p->sym->name), i, p->info.maxOccurs - p->info.minOccurs); strict = 1; } else fprintf(fout, " || soap_flag_%s%d > " SOAP_LONG_FORMAT, ident(p->sym->name), i, p->info.maxOccurs - p->info.minOccurs); nonempty = 1; } else if (is_container(p->info.typ)) { if (p->info.minOccurs > 0) { if (p->info.typ->type == Tpointer) { if (strict == 0) { fprintf(fout, "\n\t\tif (%s(!a->%s::%s || a->%s::%s->size() < " SOAP_LONG_FORMAT, strict_check(), ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->sym->name), p->info.minOccurs); strict = 1; } else fprintf(fout, " || !a->%s::%s || a->%s::%s->size() < " SOAP_LONG_FORMAT, ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->sym->name), p->info.minOccurs); } else { if (strict == 0) { fprintf(fout, "\n\t\tif (%s(a->%s::%s.size() < " SOAP_LONG_FORMAT, strict_check(), ident(t->sym->name), ident(p->sym->name), p->info.minOccurs); strict = 1; } else fprintf(fout, " || a->%s::%s.size() < " SOAP_LONG_FORMAT, ident(t->sym->name), ident(p->sym->name), p->info.minOccurs); } nonempty = 1; } if (p->info.maxOccurs > 1) { if (p->info.typ->type == Tpointer) { if (strict == 0) { fprintf(fout, "\n\t\tif (%s((a->%s::%s && a->%s::%s->size() > " SOAP_LONG_FORMAT ")", strict_check(), ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->sym->name), p->info.maxOccurs); strict = 1; } else fprintf(fout, " || (a->%s::%s && a->%s::%s->size() > " SOAP_LONG_FORMAT ")", ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->sym->name), p->info.maxOccurs); } else { if (strict == 0) { fprintf(fout, "\n\t\tif (%s(a->%s::%s.size() > " SOAP_LONG_FORMAT, strict_check(), ident(t->sym->name), ident(p->sym->name), p->info.maxOccurs); strict = 1; } else fprintf(fout, " || a->%s::%s.size() > " SOAP_LONG_FORMAT, ident(t->sym->name), ident(p->sym->name), p->info.maxOccurs); } } } else if (is_repetition(p)) { if (p->info.minOccurs > 0) { if (strict == 0) { fprintf(fout, "\n\t\tif (%s(a->%s::%s < " SOAP_LONG_FORMAT, strict_check(), ident(t->sym->name), ident(p->sym->name), p->info.minOccurs); strict = 1; } else fprintf(fout, " || a->%s::%s < " SOAP_LONG_FORMAT, ident(t->sym->name), ident(p->sym->name), p->info.minOccurs); nonempty = 1; } if (p->info.maxOccurs > 1) { if (strict == 0) { fprintf(fout, "\n\t\tif (%s(a->%s::%s > " SOAP_LONG_FORMAT, strict_check(), ident(t->sym->name), ident(p->sym->name), p->info.maxOccurs); strict = 1; } else fprintf(fout, " || a->%s::%s > " SOAP_LONG_FORMAT, ident(t->sym->name), ident(p->sym->name), p->info.maxOccurs); } p = p->next; } else if (is_choice(p)) { if (p->info.minOccurs != 0 && required_choice(p->next->info.typ) < 0) { if (strict == 0) { fprintf(fout, "\n\t\tif (%s(soap_flag_%s%d", strict_check(), ident(p->next->sym->name), i); strict = 1; } else fprintf(fout, " || soap_flag_%s%d", ident(p->next->sym->name), i); nonempty = 1; } p = p->next; } } } if (strict) fprintf(fout, "))\n\t\t{\tsoap->error = SOAP_OCCURS;\n\t\t\treturn NULL;\n\t\t}"); } if (has_getter(typ)) fprintf(fout, "\n\t\tif (a->get(soap))\n\t\t\treturn NULL;"); if (!is_invisible(typ->id->name)) { if (is_discriminant(typ)) fprintf(fout, "\n\t\tif (tag && *tag != '-')\n\t\t{\tsoap->error = soap_ignore_element(soap);\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH || soap_element_end_in(soap, tag))\n\t\t\t\treturn NULL;\n\t\t}"); else fprintf(fout, "\n\t\tif (soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); if (nonempty) fprintf(fout, "\n\t}\n\telse if (%s!*soap->href)\n\t{\tsoap->error = SOAP_OCCURS;\n\t\treturn NULL;", strict_check()); fprintf(fout, "\n\t}\n\telse\n\t{"); fprintf(fout, "\ta = (%s)soap_id_forward(soap, soap->href, (void*)a, 0, %s, %s, sizeof(%s), 0, %s_finsert, %s_fbase);", c_type_id(typ, "*"), soap_type(typ), soap_type(typ), c_type(typ), prefix, prefix); fprintf(fout, "\n\t\tif (soap->body && soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); fprintf(fout, "\n\t}"); } fprintf(fout, "\n\treturn a;\n}"); } break; case Tunion: if (is_external(typ) && !is_volatile(typ)) { fprintf(fhead, "\nSOAP_FMAC1 %s SOAP_FMAC2 soap_in_%s(struct soap*, int*, %s);", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap*, int*, %s);", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap *soap, int *choice, %s)\n{", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*a")); fprintf(fout, "\n\t(void)a; /* appease -Wall -Werror */"); fprintf(fout, "\tsoap->error = SOAP_TAG_MISMATCH;"); table = (Table *)typ->ref; for (p = table->list; p; p = p->next) { if (p->info.typ->type == Tfun || p->info.typ->type == Tunion) ; else if (p->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name)); else if (p->info.sto & Sattribute) ; else if (is_transient(p->info.typ)) fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); else if (!is_invisible(p->sym->name)) { if (is_unmatched(p->sym)) { if (is_XML(p->info.typ) && is_string(p->info.typ)) fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_inliteral(soap, NULL, (char**)&a->%s))", ident(p->sym->name)); else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_inwliteral(soap, NULL, (wchar_t**)&a->%s))", ident(p->sym->name)); else if (p->info.typ->type == Tarray) fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_in_%s(soap, NULL, a->%s, \"%s\"))", c_ident(p->info.typ), ident(p->sym->name), xsi_type(p->info.typ)); else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && a->%s.soap_in(soap, NULL, \"%s\"))", ident(p->sym->name), xsi_type(p->info.typ)); else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { if (p->info.typ->type == Tpointer) fprintf(fout, "\n\ta->%s = NULL;", ident(p->sym->name)); fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_in_%s(soap, NULL, &a->%s, \"%s\"))", c_ident(p->info.typ), ident(p->sym->name), xsi_type(p->info.typ)); } } else { if (is_XML(p->info.typ) && is_string(p->info.typ)) fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_inliteral(soap, \"%s\", (char**)&a->%s))", ns_add(p, nse), ident(p->sym->name)); else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_inwliteral(soap, \"%s\", (wchar_t**)&a->%s))", ns_add(p, nse), ident(p->sym->name)); else if (p->info.typ->type == Tarray) fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_in_%s(soap, \"%s\", a->%s, \"%s\"))", c_ident(p->info.typ), ns_add(p, nse), ident(p->sym->name), xsi_type(p->info.typ)); else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && a->%s.soap_in(soap, \"%s\", \"%s\"))", ident(p->sym->name), ns_add(p, nse), xsi_type(p->info.typ)); else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { if (p->info.typ->type == Tpointer) fprintf(fout, "\n\ta->%s = NULL;", ident(p->sym->name)); fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_in_%s(soap, \"%s\", &a->%s, \"%s\"))", c_ident(p->info.typ), ns_add(p, nse), ident(p->sym->name), xsi_type(p->info.typ)); } } fprintf(fout, "\n\t{\t*choice = %s;", soap_union_member(typ, p)); fprintf(fout, "\n\t\treturn a;"); fprintf(fout, "\n\t}"); fflush(fout); } } table = (Table *)typ->ref; for (p = table->list; p; p = p->next) { if (p->info.typ->type == Tfun || p->info.typ->type == Tunion) ; else if (p->info.sto & (Sconst | Sprivate | Sprotected)) ; else if (is_transient(p->info.typ)) ; else if (p->info.sto & Sattribute) ; else if (is_invisible(p->sym->name)) { if (is_XML(p->info.typ) && is_string(p->info.typ)) fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_inliteral(soap, \"%s\", (char**)&a->%s))", ns_add(p, nse), ident(p->sym->name)); else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_inwliteral(soap, \"%s\", (wchar_t**)&a->%s))", ns_add(p, nse), ident(p->sym->name)); else if (p->info.typ->type == Tarray) fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_in_%s(soap, \"%s\", a->%s, NULL))", c_ident(p->info.typ), ns_add(p, nse), ident(p->sym->name)); else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && a->%s.soap_in(soap, \"%s\", NULL))", ident(p->sym->name), ns_add(p, nse)); else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { if (p->info.typ->type == Tpointer) fprintf(fout, "\n\ta->%s = NULL;", ident(p->sym->name)); fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_in_%s(soap, \"%s\", &a->%s, NULL))", c_ident(p->info.typ), ns_add(p, nse), ident(p->sym->name)); } fprintf(fout, "\n\t{\t*choice = %s;", soap_union_member(typ, p)); fprintf(fout, "\n\t\treturn a;"); fprintf(fout, "\n\t}"); fflush(fout); } } fprintf(fout, "\n\t*choice = %d;", required_choice(typ)); fprintf(fout, "\n\tif (!soap->error)\n\t\tsoap->error = SOAP_TAG_MISMATCH;\n\treturn NULL;\n}"); break; case Tpointer: if (is_external(typ) && !is_volatile(typ)) { fprintf(fhead, "\nSOAP_FMAC1 %s SOAP_FMAC2 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, %s, const char *type)\n{", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*a")); fprintf(fout, "\n\t(void)type; /* appease -Wall -Werror */\n\tif (soap_element_begin_in(soap, tag, 1, NULL))"); fprintf(fout, "\n\t\treturn NULL;"); if (is_template(typ->ref)) { fprintf(fout, "\n\tsoap_revert(soap);"); fprintf(fout, "\n\tif (!a)\n\t{\tif (!(a = (%s)soap_malloc(soap, sizeof(%s))))\n\t\t\treturn NULL;\n\t\t*a = NULL;\n\t}", c_type_id(typ, "*"), c_type(typ)); fprintf(fout, "\n\tif (!(*a = soap_in_%s(soap, tag, *a, type)))\n\t\treturn NULL;", c_ident((Tnode*)typ->ref)); fprintf(fout, "\n\treturn a;\n}"); } else if (((Tnode *) typ->ref)->type == Tclass && !is_external((Tnode*)typ->ref) && !is_volatile((Tnode*)typ->ref) && !is_typedef((Tnode*)typ->ref)) { fprintf(fout, "\n\tif (!a)\n\t\tif (!(a = (%s)soap_malloc(soap, sizeof(%s))))\n\t\t\treturn NULL;", c_type_id(typ, "*"), c_type(typ)); fprintf(fout, "\n\t*a = NULL;\n\tif (!soap->null && *soap->href != '#')"); fprintf(fout, "\n\t{\tsoap_revert(soap);"); fprintf(fout, "\n\t\tif (!(*a = (%s)soap_instantiate_%s(soap, -1, soap->type, soap->arrayType, NULL)))", c_type(typ), c_ident((Tnode*)typ->ref)); fprintf(fout, "\n\t\t\treturn NULL;"); fprintf(fout, "\n\t\t(*a)->soap_default(soap);"); fprintf(fout, "\n\t\tif (!(*a)->soap_in(soap, tag, NULL))"); fprintf(fout, "\n\t\t{\t*a = NULL;\n\t\t\treturn NULL;\n\t\t}"); fprintf(fout, "\n\t}\n\telse\n\t{\ta = (%s)soap_id_lookup(soap, soap->href, (void**)a, %s, sizeof(%s), %d, %s_fbase);", c_type_id(typ, "*"), soap_type(reftype(typ->ref)), c_type(reftype(typ->ref)), reflevel(typ->ref), prefix); fprintf(fout, "\n\t\tif (soap->body && soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); fprintf(fout, "\n\t}\n\treturn a;\n}"); } else { fprintf(fout, "\n\tif (!a)\n\t\tif (!(a = (%s)soap_malloc(soap, sizeof(%s))))\n\t\t\treturn NULL;", c_type_id(typ, "*"), c_type(typ)); fprintf(fout, "\n\t*a = NULL;\n\tif (!soap->null && *soap->href != '#')"); fprintf(fout, "\n\t{\tsoap_revert(soap);"); fprintf(fout, "\n\t\tif (!(*a = soap_in_%s(soap, tag, *a, type)))", c_ident((Tnode*)typ->ref)); fprintf(fout, "\n\t\t\treturn NULL;"); fprintf(fout, "\n\t}\n\telse\n\t{\ta = (%s)soap_id_lookup(soap, soap->href, (void**)a, %s, sizeof(%s), %d, NULL);", c_type_id(typ, "*"), soap_type(reftype(typ->ref)), c_type(reftype(typ->ref)), reflevel(typ->ref)); fprintf(fout, "\n\t\tif (soap->body && soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); fprintf(fout, "\n\t}\n\treturn a;\n}"); } break; case Tarray: temp = typ; while (temp->type == Tarray) temp = (Tnode*)temp->ref; if (is_external(typ) && !is_volatile(typ)) { fprintf(fhead, "\nSOAP_FMAC1 %s SOAP_FMAC2 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type_id(temp, "*"), c_ident(typ), c_type(typ)); return; } fprintf(fhead, "\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type_id(temp, "*"), c_ident(typ), c_type(typ)); fprintf(fout, "\n\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, %s, const char *type)\n{", c_type_id(temp, "*"), c_ident(typ), c_type_id(typ, "a")); fprintf(fout, "\n\tif (soap_element_begin_in(soap, tag, 0, NULL))"); fprintf(fout, "\n\t\treturn NULL;"); fprintf(fout, "\n\tif (soap_match_array(soap, type))"); fprintf(fout, "\n\t{\tsoap->error = SOAP_TYPE;\n\t\treturn NULL;\n\t}"); fprintf(fout, "\n\ta = (%s)soap_id_enter(soap, soap->id, a, %s, sizeof(%s), NULL, NULL, NULL, NULL);", c_type_id((Tnode*)typ->ref, "(*)"), soap_type(typ), c_type(typ)); fprintf(fout, "\n\tif (!a)\n\t\treturn NULL;"); fprintf(fout, "\n\tsoap_default_%s(soap, a);", c_ident(typ)); fprintf(fout, "\n\tif (soap->body && !*soap->href)"); total = get_dimension(typ); n = (Tnode*)typ->ref; cardinality = 1; while (n->type == Tarray) { total=total*get_dimension(n); n = (Tnode*)n->ref; cardinality++; } fprintf(fout, "\n\t{\tint i;\n\t\tfor (i = 0; i < %d; i++)", get_dimension(typ)); fprintf(fout, "\n\t\t{\tsoap_peek_element(soap);\n\t\t\tif (soap->position)\n\t\t\t{\ti = soap->positions[0];\n\t\t\t\tif (i < 0 || i >= %d)\n\t\t\t\t{\tsoap->error = SOAP_IOB;\n\t\t\t\t\treturn NULL;\n\t\t\t\t}\n\t\t\t}", get_dimension(typ)); fprintf(fout, "\n\t\t\tif (!soap_in_%s(soap, NULL, a", c_ident((Tnode*)typ->ref)); if (cardinality > 1) fprintf(fout, "[i]"); else fprintf(fout, "+i"); fprintf(fout, ", \"%s\"))", xsi_type((Tnode*)typ->ref)); fprintf(fout, "\n\t\t\t{\tif (soap->error != SOAP_NO_TAG)\n\t\t\t\t\treturn NULL;"); fprintf(fout, "\n\t\t\t\tsoap->error = SOAP_OK;"); fprintf(fout, "\n\t\t\t\tbreak;"); fprintf(fout, "\n\t\t\t}"); fprintf(fout, "\n\t\t}"); fprintf(fout, "\n\t\tif (soap->mode & SOAP_C_NOIOB)\n\t\t\twhile (soap_element_end_in(soap, tag) == SOAP_SYNTAX_ERROR)\n\t\t\t{\tsoap->peeked = 1;\n\t\t\t\tsoap_ignore_element(soap);\n\t\t\t}"); fprintf(fout, "\n\t\telse if (soap_element_end_in(soap, tag))\n\t\t{\tif (soap->error == SOAP_SYNTAX_ERROR)\n\t\t\t\tsoap->error = SOAP_IOB;\n\t\t\treturn NULL;\n\t\t}"); fprintf(fout, "\n\t}\n\telse\n\t{\ta = (%s)soap_id_forward(soap, soap->href, (void*)soap_id_enter(soap, soap->id, a, %s, sizeof(%s), NULL, NULL, NULL, NULL), 0, %s, %s, sizeof(%s), 0, NULL, NULL);", c_type_id((Tnode*)typ->ref, "(*)"), soap_type(typ), c_type(typ), soap_type(typ), soap_type(typ), c_type(typ)); fprintf(fout, "\n\t\tif (soap->body && soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); fprintf(fout, "\n\t}\n\treturn (%s)a;\n}", c_type_id(temp, "*")); break; case Tenum: case Tenumsc: if (is_external(typ) && !is_volatile(typ)) { fprintf(fhead, "\nSOAP_FMAC1 %s SOAP_FMAC2 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*")); if (!is_typedef(typ)) { fprintf(fhead, "\nSOAP_FMAC3S int SOAP_FMAC4S soap_s2%s(struct soap*, const char*, %s);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3S int SOAP_FMAC4S soap_s2%s(struct soap *soap, const char *s, %s)\n{", c_ident(typ), c_type_id(typ, "*a")); if (!is_mask(typ)) { fprintf(fout, "\n\tconst struct soap_code_map *map;"); t = (Table*)typ->ref; if (t && t->list && has_ns_eq(NULL, ns_remove2(t->list->sym->name, c_ident(typ)))) { fprintf(fout, "\n\tchar *t;"); fprintf(fout, "\n\tif (!s)\n\t\treturn soap->error;"); fprintf(fout, "\n\tsoap_s2QName(soap, s, &t, %ld, %ld);", minlen(typ), maxlen(typ)); fprintf(fout, "\n\tmap = soap_code(soap_codes_%s, t);", c_ident(typ)); } else { fprintf(fout, "\n\tif (!s)\n\t\treturn soap->error;"); fprintf(fout, "\n\tmap = soap_code(soap_codes_%s, s);", c_ident(typ)); } min = 0; max = 0; for (t = (Table*)typ->ref; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.val.i < min) min = (unsigned long)p->info.val.i; if (p->info.val.i > max) max = (unsigned long)p->info.val.i; } } if (is_boolean(typ)) fprintf(fout, "\n\tif (map)\n\t\t*a = (%s)(map->code != 0);\n\telse\n\t{\tlong n;\n\t\tif (soap_s2long(soap, s, &n) || n < 0 || n > 1)\n\t\t\treturn soap->error = SOAP_TYPE;\n\t\t*a = (%s)(n != 0);\n\t}\n\treturn SOAP_OK;\n}", c_type(typ), c_type(typ)); else if (sflag) fprintf(fout, "\n\tif (map)\n\t\t*a = (%s)map->code;\n\telse\n\t\treturn soap->error = SOAP_TYPE;\n\treturn SOAP_OK;\n}", c_type(typ)); else fprintf(fout, "\n\tif (map)\n\t\t*a = (%s)map->code;\n\telse\n\t{\tlong n;\n\t\tif (soap_s2long(soap, s, &n) || ((soap->mode & SOAP_XML_STRICT) && (n < %ld || n > %ld)))\n\t\t\treturn soap->error = SOAP_TYPE;\n\t\t*a = (%s)n;\n\t}\n\treturn SOAP_OK;\n}", c_type(typ), min, max, c_type(typ)); } else { t = (Table*)typ->ref; if (t && t->list && has_ns_eq(NULL, ns_remove1(t->list->sym->name))) { fprintf(fout, "\n\tchar *t;"); fprintf(fout, "\n\tsoap_s2QName(soap, s, &t, %ld, %ld);", minlen(typ), maxlen(typ)); fprintf(fout, "\n\t*a = (%s)soap_code_bits(soap_codes_%s, t);", c_type(typ), c_ident(typ)); } else fprintf(fout, "\n\t(void)soap; /* appease -Wall -Werror */\n\t*a = (%s)soap_code_bits(soap_codes_%s, s);", c_type(typ), c_ident(typ)); fprintf(fout, "\n\treturn SOAP_OK;\n}"); } } fprintf(fout, "\n\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, %s, const char *type)\n{", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*a")); if (is_boolean(typ)) { fprintf(fout, "\n\tif (soap_element_begin_in(soap, tag, 0, NULL))"); fprintf(fout, "\n\t\treturn NULL;"); fprintf(fout, "\n\tif (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, \":boolean\"))"); fprintf(fout, "\n\t{\tsoap->error = SOAP_TYPE;\n\t\treturn NULL;\n\t}"); } else if (typ->sym) { fprintf(fout, "\n\tif (soap_element_begin_in(soap, tag, 0, NULL))"); fprintf(fout, "\n\t\treturn NULL;"); fprintf(fout, "\n\tif (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, \"%s\"))", base_type(typ, "")); fprintf(fout, "\n\t{\tsoap->error = SOAP_TYPE;\n\t\treturn NULL;\n\t}"); } else { fprintf(fout, "\n\tif (soap_element_begin_in(soap, tag, 0, type))"); fprintf(fout, "\n\t\treturn NULL;"); } fprintf(fout, "\n\ta = (%s)soap_id_enter(soap, soap->id, a, %s, sizeof(%s), NULL, NULL, NULL, NULL);", c_type_id(typ, "*"), soap_type(typ), c_type(typ)); fprintf(fout, "\n\tif (!a)\n\t\treturn NULL;"); fprintf(fout, "\n\tif (soap->body && !*soap->href)\n\t{"); fprintf(fout, "\tif (soap_s2%s(soap, soap_value(soap), a) || soap_element_end_in(soap, tag))\n\t\t\treturn NULL;", c_ident(typ)); fprintf(fout, "\n\t}\n\telse\n\t{\ta = (%s)soap_id_forward(soap, soap->href, (void*)a, 0, %s, %s, sizeof(%s), 0, NULL, NULL);", c_type_id(typ, "*"), soap_type(typ), soap_type(typ), c_type(typ)); fprintf(fout, "\n\t\tif (soap->body && soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); fprintf(fout, "\n\t}\n\treturn a;\n}"); break; case Ttemplate: if (is_external(typ) && !is_volatile(typ)) { fprintf(fhead, "\nSOAP_FMAC1 %s SOAP_FMAC2 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*")); return; } if (is_typedef(typ)) { fprintf(fhead, "\n\n#define soap_in_%s soap_in_%s\n", c_ident(typ), t_ident(typ)); return; } n = (Tnode*)typ->ref; if (n->type == Tfun || is_void(n)) return; fprintf(fhead, "\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, %s, const char *type)\n{", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*a")); fprintf(fout, "\n\t(void)type; /* appease -Wall -Werror */"); if (is_smart(typ)) { fprintf(fout, "\n\tif (soap_element_begin_in(soap, tag, 1, NULL))"); fprintf(fout, "\n\t\treturn NULL;"); fprintf(fout, "\n\tif (!a && !(a = soap_new_%s(soap)))\n\t\treturn NULL;", c_ident(typ)); fprintf(fout, "\n\tif (!soap->null && *soap->href != '#')\n\t{"); if (is_smart_shared(typ)) { fprintf(fout, "\tvoid **x = soap_id_smart(soap, soap->id, %s, sizeof(%s));", soap_type(n), c_type(n)); if (n->type == Tclass && !is_external(n) && !is_volatile(n) && !is_typedef(n)) fprintf(fout, "\n\t\tif (x && *x)\n\t\t\t*a = *(%s)(*x);\n\t\telse\n\t\t{\t*a = %s(soap_instantiate_%s(soap, SOAP_NO_LINK_TO_DELETE, soap->type, soap->arrayType, NULL));\n\t\t\tif (x)\n\t\t\t\t*x = (void*)a;\n\t\t}", c_type_id(typ, "*"), c_type(typ), c_ident(n)); else fprintf(fout, "\n\t\tif (x && *x)\n\t\t\t*a = *(%s)(*x);\n\t\telse\n\t\t{\t*a = %s<%s>();\n\t\t\tif (x)\n\t\t\t\t*x = (void*)a;\n\t\t}", c_type_id(typ, "*"), make_shared(typ), c_type(n)); } else if (n->type == Tclass && !is_external(n) && !is_volatile(n) && !is_typedef(n)) fprintf(fout, "\t*a = %s(soap_instantiate_%s(soap, SOAP_NO_LINK_TO_DELETE, soap->type, soap->arrayType, NULL));", c_type(typ), c_ident(n)); else fprintf(fout, "\t*a = %s(SOAP_NEW(%s));", c_type(typ), c_type(n)); fprintf(fout, "\n\t\tsoap_revert(soap);"); if (is_XML(n) && is_string(n)) fprintf(fout, "\n\t\tif (!soap_inliteral(soap, tag, (char*const*)a->get()))\n\t\t\treturn NULL;"); else if (is_XML(n) && is_wstring(n)) fprintf(fout, "\n\t\tif (!soap_inwliteral(soap, tag, (wchar_t*const*)a->get()))\n\t\t\treturn NULL;"); else if (n->type == Tarray) fprintf(fout, "\n\t\tif (!soap_in_%s(soap, tag, a->get(), \"%s\"))\n\t\t\treturn NULL;", c_ident(n), xsi_type(n)); else if (n->type == Tclass && !is_external(n) && !is_volatile(n) && !is_typedef(n)) { fprintf(fout, "\n\t\t(*a)->soap_default(soap);"); fprintf(fout, "\n\t\tif (!(*a)->soap_in(soap, tag, NULL))\n\t\t\treturn NULL;"); } else { fprintf(fout, "\n\t\tsoap_default_%s(soap, a->get());", c_ident(n)); fprintf(fout, "\n\t\tif (!soap_in_%s(soap, tag, a->get(), \"%s\"))\n\t\t\treturn NULL;", c_ident(n), xsi_type(n)); } fprintf(fout, "\n\t}\n\telse\n\t{"); fprintf(fout, "\tif (!soap_id_forward(soap, soap->href, a, 0, %s, %s, sizeof(%s), %d, %s_finsert, %s_fbase))\n\t\t\treturn NULL;", soap_type(reftype(n)), soap_type(typ), c_type(reftype(n)), reflevel(n) + 1, prefix, prefix); /* reflevel + 1 since smart pointer accepts derived types */ fprintf(fout, "\n\t\tif (soap->body && soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); fprintf(fout, "\n\t}\n\treturn a;\n}"); } else if (c11flag && (!strcmp(typ->id->name, "std::deque") || !strcmp(typ->id->name, "std::list") || (!strcmp(typ->id->name, "std::vector") && !is_bool(n)))) /* use C++11 emplace_back */ { fprintf(fout, "\n\tshort soap_flag;"); fprintf(fout, "\n\tfor (soap_flag = 0;; soap_flag = 1)\n\t{"); fprintf(fout, "\n\t\tif (tag && *tag != '-')\n\t\t{\tif (soap_element_begin_in(soap, tag, 1, NULL))\n\t\t\t\tbreak;\n\t\t\tsoap_revert(soap);\n\t\t}"); fprintf(fout, "\n\t\tif (!a && !(a = soap_new_%s(soap)))\n\t\t\treturn NULL;", c_ident(typ)); if (!strcmp(typ->id->name, "std::vector") && !is_primitive(n) && n->type != Tpointer) { fprintf(fout, "\n\t\tif (!a->empty() && a->size() == a->capacity())\n\t\t{\tconst void *p = &a->front();"); fprintf(fout, "\n\t\t\ta->emplace_back();"); fprintf(fout, "\n\t\t\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"Vector capacity increased to %%lu to fit %%lu items: updating pointers\\n\", a->capacity(), a->size()));"); fprintf(fout, "\n\t\t\tsoap_update_pointers(soap, (const char*)&a->front(), (const char*)p, (a->size() - 1) * sizeof(%s));", c_type(n)); fprintf(fout, "\n\t\t}\n\t\telse\n\t\t{\ta->emplace_back();\n\t\t}"); fprintf(fout, "\n\t\t%s *n = &a->back();\n\t\t", c_type(n)); } else { fprintf(fout, "\n\t\ta->emplace_back();\n\t\t%s *n = &a->back();\n\t\t", c_type(n)); } if (n->type == Tpointer) fprintf(fout, "*n = NULL;"); else if (n->type == Tarray) fprintf(fout, "soap_default_%s(soap, n);", c_ident(n)); else if (n->type == Tclass && !is_external(n) && !is_volatile(n) && !is_typedef(n)) fprintf(fout, "n->soap_default(soap);"); else if (n->type != Tfun && !is_void(n) && !is_XML(n)) fprintf(fout, "soap_default_%s(soap, n);", c_ident(n)); if (!is_primitive(n) && n->type != Tpointer) fprintf(fout, "\n\t\tshort soap_shaky = soap_begin_shaky(soap);"); fprintf(fout, "\n\t\tif (tag && *tag != '-' && (*soap->id || *soap->href))\n\t\t{\tif ("); fprintf(fout, "!soap_id_forward(soap, *soap->id?soap->id:soap->href, a, (size_t)a->size() - 1, %s, %s, sizeof(%s), %d, %s_finsert, %s_fbase))\n\t\t\t\tbreak;\n\t\t\tif (", soap_type(reftype(n)), soap_type(typ), c_type(reftype(n)), reflevel(n), prefix, prefix); if (is_XML(n) && is_string(n)) fprintf(fout, "!soap_inliteral(soap, tag, NULL)"); else if (is_XML(n) && is_wstring(n)) fprintf(fout, "!soap_inwliteral(soap, tag, NULL)"); else if (n->type == Tarray) fprintf(fout, "!soap_in_%s(soap, tag, NULL, \"%s\")", c_ident(n), xsi_type(n)); else fprintf(fout, "!soap_in_%s(soap, tag, NULL, \"%s\")", c_ident(n), xsi_type(n)); fprintf(fout, ")\n\t\t\t\tbreak;\n\t\t}\n\t\telse\n\t\t{\t"); if (is_XML(n) && is_string(n)) fprintf(fout, "if (!soap_inliteral(soap, tag, n))"); else if (is_XML(n) && is_wstring(n)) fprintf(fout, "if (!soap_inwliteral(soap, tag, n))"); else if (n->type == Tarray) fprintf(fout, "if (!soap_in_%s(soap, tag, n, \"%s\"))", c_ident(n), xsi_type(n)); else fprintf(fout, "if (!soap_in_%s(soap, tag, n, \"%s\"))", c_ident(n), xsi_type(n)); fprintf(fout, "\n\t\t\t{\ta->pop_back();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}"); if (!is_primitive(n) && n->type != Tpointer) fprintf(fout, "\n\t\tsoap_end_shaky(soap, soap_shaky);"); fprintf(fout, "\n\t\tif (!tag || *tag == '-')\n\t\t\treturn a;\n\t}\n\tif (soap_flag && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))\n\t{\tsoap->error = SOAP_OK;\n\t\treturn a;\n\t}\n\treturn NULL;\n}"); } else { fprintf(fout, "\n\tshort soap_flag;"); fprintf(fout, "\n\tfor (soap_flag = 0;; soap_flag = 1)\n\t{"); fprintf(fout, "\n\t\tif (tag && *tag != '-')\n\t\t{\tif (soap_element_begin_in(soap, tag, 1, NULL))\n\t\t\t\tbreak;\n\t\t\tsoap_revert(soap);\n\t\t}"); fprintf(fout, "\n\t\tif (!a && !(a = soap_new_%s(soap)))\n\t\t\treturn NULL;", c_ident(typ)); fprintf(fout, "\n\t\t%s;\n\t\t", c_type_id(n, "n")); if (n->type == Tpointer) fprintf(fout, "n = NULL;"); else if (n->type == Tarray) fprintf(fout, "soap_default_%s(soap, &n);", c_ident(n)); else if (n->type == Tclass && !is_external(n) && !is_volatile(n) && !is_typedef(n)) fprintf(fout, "n.soap_default(soap);"); else if (n->type != Tfun && !is_void(n) && !is_XML(n)) fprintf(fout, "soap_default_%s(soap, &n);", c_ident(n)); if (!is_primitive(n) && n->type != Tpointer) fprintf(fout, "\n\t\tshort soap_shaky = soap_begin_shaky(soap);"); fprintf(fout, "\n\t\tif (tag && *tag != '-' && (*soap->id || *soap->href))\n\t\t{\tif ("); fprintf(fout, "!soap_id_forward(soap, *soap->id?soap->id:soap->href, a, (size_t)a->size(), %s, %s, sizeof(%s), %d, %s_finsert, %s_fbase))\n\t\t\t\tbreak;\n\t\t\tif (", soap_type(reftype(n)), soap_type(typ), c_type(reftype(n)), reflevel(n), prefix, prefix); if (is_XML(n) && is_string(n)) fprintf(fout, "!soap_inliteral(soap, tag, NULL)"); else if (is_XML(n) && is_wstring(n)) fprintf(fout, "!soap_inwliteral(soap, tag, NULL)"); else if (n->type == Tarray) fprintf(fout, "!soap_in_%s(soap, tag, NULL, \"%s\")", c_ident(n), xsi_type(n)); else fprintf(fout, "!soap_in_%s(soap, tag, NULL, \"%s\")", c_ident(n), xsi_type(n)); fprintf(fout, ")\n\t\t\t\tbreak;\n\t\t}\n\t\telse\n\t\t{\t"); if (is_XML(n) && is_string(n)) fprintf(fout, "if (!soap_inliteral(soap, tag, &n))"); else if (is_XML(n) && is_wstring(n)) fprintf(fout, "if (!soap_inwliteral(soap, tag, &n))"); else if (n->type == Tarray) fprintf(fout, "if (!soap_in_%s(soap, tag, &n, \"%s\"))", c_ident(n), xsi_type(n)); else fprintf(fout, "if (!soap_in_%s(soap, tag, &n, \"%s\"))", c_ident(n), xsi_type(n)); fprintf(fout, "\n\t\t\t\tbreak;\n\t\t}"); if (!is_primitive(n) && n->type != Tpointer) fprintf(fout, "\n\t\tsoap_end_shaky(soap, soap_shaky);"); if (!(!strcmp(typ->id->name, "std::list") || !strcmp(typ->id->name, "std::deque") || !strcmp(typ->id->name, "std::set")) && !is_primitive(n) && n->type != Tpointer) { fprintf(fout, "\n\t\tif (a->size())\n\t\t{\tconst void *p = &*a->begin();\n\t\t\tsoap_update_pointers(soap, (const char*)&(*a->insert(a->end(), n)), (const char*)&n, sizeof(%s));", c_type(n)); fprintf(fout, "\n\t\t\tif (p != &*a->begin())\n\t\t\t{\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"Container capacity increased: updating pointers\\n\"));"); fprintf(fout, "\n\t\t\t\tsoap_update_pointers(soap, (const char*)&*a->begin(), (const char*)p, (a->size() - 1) * sizeof(%s));\n\t\t\t}", c_type(n)); fprintf(fout, "\n\t\t}\n\t\telse\n\t\t{\tsoap_update_pointers(soap, (const char*)&(*a->insert(a->end(), n)), (const char*)&n, sizeof(%s));", c_type(n)); fprintf(fout, "\n\t\t}"); } else { if (is_primitive(n) || n->type == Tpointer) fprintf(fout, "\n\t\ta->insert(a->end(), n);"); else fprintf(fout, "\n\t\tsoap_update_pointers(soap, (const char*)&(*a->insert(a->end(), n)), (const char*)&n, sizeof(%s));", c_type(n)); } fprintf(fout, "\n\t\tif (!tag || *tag == '-')\n\t\t\treturn a;\n\t}\n\tif (soap_flag && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))\n\t{\tsoap->error = SOAP_OK;\n\t\treturn a;\n\t}\n\treturn NULL;\n}"); } break; default: break; } fflush(fout); } void soap_in_Darray(Tnode *typ) { int i, j, d; Entry *p; Table *t, *table; const char *nsa = ns_qualifiedAttribute(typ); table=(Table *)typ->ref; p = is_dynamic_array(typ); d = get_Darraydims(typ); if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 %s SOAP_FMAC2 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*")); if (typ->type == Tclass && !is_volatile(typ) && !is_typedef(typ)) { fprintf(fout, "\n\nvoid *%s::soap_in(struct soap *soap, const char *tag, const char *type)", c_type(typ)); fprintf(fout, "\n{\treturn soap_in_%s(soap, tag, this, type);\n}", c_ident(typ)); } fflush(fout); fprintf(fout, "\n\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, %s, const char *type)", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*a")); if (is_binary(typ)) fprintf(fout, "\n{"); else if (d) fprintf(fout, "\n{\tsize_t i, n;\n\tint j;\n\t%s;", c_type_id(p->info.typ, "p")); else fprintf(fout, "\n{\tint i, j;\n\t%s;", c_type_id(p->info.typ, "p")); fprintf(fout, "\n\tif (soap_element_begin_in(soap, tag, 1, NULL))\n\t\treturn NULL;"); if (is_hexBinary(typ)) fprintf(fout, "\n\tif (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, \":hexBinary\"))"); else if (is_binary(typ)) fprintf(fout, "\n\tif (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, \":base64Binary\") && soap_match_tag(soap, soap->type, \":base64\"))"); else if (has_ns(typ) || is_untyped(typ)) fprintf(fout, "\n\tif (*soap->type && soap_match_array(soap, \"%s\") && soap_match_tag(soap, soap->type, type))", xsi_type((Tnode*)p->info.typ->ref)); else fprintf(fout, "\n\tif (soap_match_array(soap, type))"); fprintf(fout, "\n\t{\tsoap->error = SOAP_TYPE;\n\t\treturn NULL;\n\t}"); if (typ->type == Tclass) { fprintf(fout, "\n\ta = (%s)soap_id_enter(soap, soap->id, a, %s, sizeof(%s), soap->type, soap->arrayType, %s_instantiate, %s_fbase);", c_type_id(typ, "*"), soap_type(typ), c_type(typ), prefix, prefix); fprintf(fout, "\n\tif (!a)\n\t\treturn NULL;"); fprintf(fout, "\n\ta->soap_default(soap);"); for (t = (Table*)typ->ref; t; t = t->prev) { for (p = t->list; p; p = p->next) if (p->info.sto & Sattribute) soap_attr_value(p, ptr_cast(t, "a"), ident(p->sym->name), ns_add(p, nsa)); } } else { fprintf(fout, "\n\ta = (%s)soap_id_enter(soap, soap->id, a, %s, sizeof(%s), NULL, NULL, NULL, NULL);", c_type_id(typ, "*"), soap_type(typ), c_type(typ)); fprintf(fout, "\n\tif (!a)\n\t\treturn NULL;"); fprintf(fout, "\n\tsoap_default_%s(soap, a);", c_ident(typ)); for (t = (Table*)typ->ref; t; t = t->prev) { for (p = t->list; p; p = p->next) if (p->info.sto & Sattribute) soap_attr_value(p, "a", ident(p->sym->name), ns_add(p, nsa)); } } fprintf(fout, "\n\tif (soap->body && !*soap->href)\n\t{"); p = is_dynamic_array(typ); if (is_binary(typ)) { if (is_hexBinary(typ)) fprintf(fout, "\n\t\ta->__ptr = soap_gethex(soap, &a->__size);"); else { fprintf(fout, "\n\t\ta->__ptr = soap_getbase64(soap, &a->__size, 0);"); if (is_attachment(typ)) fprintf(fout, "\n#ifndef WITH_LEANER\n\t\tif (soap_xop_forward(soap, &a->__ptr, &a->__size, &a->id, &a->type, &a->options))\n\t\t\treturn NULL;\n#endif"); } fprintf(fout, "\n\t\tif ((!a->__ptr && soap->error) || soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); } else { fprintf(fout, "\n\t\tif (*soap->arraySize)\n\t\t{"); if (d) { fprintf(fout, "\n\t\t\tn = soap_getsizes(soap->arraySize, a->__size, %d);", d); if (has_offset(typ)) fprintf(fout, "\n\t\t\tn -= j = soap_getoffsets(soap->arrayOffset, a->__size, a->__offset, %d);", d); else fprintf(fout, "\n\t\t\tn -= j = soap_getoffsets(soap->arrayOffset, a->__size, NULL, %d);", d); if (p->info.minOccurs > 0) fprintf(fout, "\n\t\t\tif (%sn < " SOAP_LONG_FORMAT ")\n\t\t\t{\tsoap->error = SOAP_OCCURS;\n\t\t\t\treturn NULL;\n\t\t\t}", strict_check(), p->info.minOccurs); if (p->info.maxOccurs > 1) fprintf(fout, "\n\t\t\t\tif (%sn > " SOAP_LONG_FORMAT ")\n\t\t\t{\tsoap->error = SOAP_OCCURS;\n\t\t\t\treturn NULL;\n\t\t\t}", strict_check(), p->info.maxOccurs); else fprintf(fout, "\n\t\t\tif (n > SOAP_MAXARRAYSIZE)\n\t\t\t{\tsoap->error = SOAP_OCCURS;\n\t\t\t\treturn NULL;\n\t\t\t}"); if (((Tnode*)p->info.typ->ref)->type == Tclass || (((Tnode*)p->info.typ->ref)->type == Tstruct && !cflag)) { fprintf(fout, "\n\t\t\ta->%s = soap_new_%s(soap, n);", ident(p->sym->name), c_ident((Tnode*)p->info.typ->ref)); if (!is_external((Tnode*)p->info.typ->ref) && !is_volatile((Tnode*)p->info.typ->ref) && !is_typedef((Tnode*)p->info.typ->ref) && ((Tnode*)p->info.typ->ref)->type == Tclass) fprintf(fout, "\n\t\t\tfor (i = 0; i < n; i++)\n\t\t\t\t(a->%s+i)->%s::soap_default(soap);", ident(p->sym->name), c_type((Tnode*)p->info.typ->ref)); else if (((Tnode*)p->info.typ->ref)->type == Tpointer) fprintf(fout, "\n\t\t\tfor (i = 0; i < n; i++)\n\t\t\t\tsoap_default_%s(soap, a->%s+i);", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name)); } else if (has_class((Tnode*)p->info.typ->ref)) { fprintf(fout, "\n\t\t\ta->%s = soap_new_%s(soap, n);", ident(p->sym->name), c_ident((Tnode*)p->info.typ->ref)); fprintf(fout, "\n\t\t\tfor (i = 0; i < n; i++)\n\t\t\t\tsoap_default_%s(soap, a->%s+i);", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name)); } else { fprintf(fout, "\n\t\t\ta->%s = (%s)soap_malloc(soap, n * sizeof(%s));", ident(p->sym->name), c_type_id((Tnode*)p->info.typ->ref, "*"), c_type((Tnode*)p->info.typ->ref)); if (((Tnode*)p->info.typ->ref)->type == Tpointer) fprintf(fout, "\n\t\t\tfor (i = 0; i < n; i++)\n\t\t\t\ta->%s[i] = NULL;", ident(p->sym->name)); else if (!is_XML((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\tfor (i = 0; i < n; i++)\n\t\t\t\tsoap_default_%s(soap, a->%s+i);", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name)); } fprintf(fout, "\n\t\t\tfor (i = 0; i < n; i++)"); fprintf(fout, "\n\t\t\t{\tsoap_peek_element(soap);\n\t\t\t\tif (soap->position == %d)", d); fprintf(fout, "\n\t\t\t\t{\ti = (size_t)("); for (i = 0; i < d; i++) { fprintf(fout, "soap->positions[%d]", i); for (j = 1; j < d-i; j++) fprintf(fout, "*a->__size[%d]", j); if (i < d-1) fprintf(fout, "+"); } fprintf(fout, "-j);"); fprintf(fout, "\n\t\t\t\t\tif (i >= n)\n\t\t\t\t\t{\tsoap->error = SOAP_IOB;\n\t\t\t\t\t\treturn NULL;\n\t\t\t\t\t}\n\t\t\t\t}"); fprintf(fout, "\n\t\t\t\tif (!soap_in_%s(soap, NULL, a->%s + i, \"%s\"))", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name), xsi_type((Tnode*)p->info.typ->ref)); fprintf(fout, "\n\t\t\t\t{\tif (soap->error != SOAP_NO_TAG)\n\t\t\t\t\t\treturn NULL;"); fprintf(fout, "\n\t\t\t\t\tsoap->error = SOAP_OK;"); fprintf(fout, "\n\t\t\t\t\tbreak;"); fprintf(fout, "\n\t\t\t\t}"); } else { fprintf(fout, "\n\t\t\tsoap_getsizes(soap->arraySize, &a->__size, 1);"); if (has_offset(typ)) fprintf(fout, "\n\t\t\ta->__size -= j = soap_getoffsets(soap->arrayOffset, &a->__size, &a->__offset, 1);"); else fprintf(fout, "\n\t\t\ta->__size -= j = soap_getoffsets(soap->arrayOffset, &a->__size, NULL, 1);"); if (p->info.minOccurs > 0) fprintf(fout, "\n\t\t\tif (%sa->__size < " SOAP_LONG_FORMAT ")\n\t\t\t{\tsoap->error = SOAP_OCCURS;\n\t\t\t\treturn NULL;\n\t\t\t}", strict_check(), p->info.minOccurs); if (p->info.maxOccurs > 1) fprintf(fout, "\n\t\t\tif (%sa->__size > " SOAP_LONG_FORMAT ")\n\t\t\t{\tsoap->error = SOAP_OCCURS;\n\t\t\t\treturn NULL;\n\t\t\t}", strict_check(), p->info.maxOccurs); else fprintf(fout, "\n\t\t\tif (a->__size > SOAP_MAXARRAYSIZE)\n\t\t\t{\tsoap->error = SOAP_OCCURS;\n\t\t\t\treturn NULL;\n\t\t\t}"); if (((Tnode*)p->info.typ->ref)->type == Tclass || (((Tnode*)p->info.typ->ref)->type == Tstruct && !cflag)) { fprintf(fout, "\n\t\t\ta->%s = soap_new_%s(soap, a->__size);", ident(p->sym->name), c_ident((Tnode*)p->info.typ->ref)); if (!is_external((Tnode*)p->info.typ->ref) && !is_volatile((Tnode*)p->info.typ->ref) && !is_typedef((Tnode*)p->info.typ->ref) && ((Tnode*)p->info.typ->ref)->type == Tclass) fprintf(fout, "\n\t\t\tfor (i = 0; i < a->__size; i++)\n\t\t\t\t(a->%s+i)->%s::soap_default(soap);", ident(p->sym->name), c_type((Tnode*)p->info.typ->ref)); else fprintf(fout, "\n\t\t\tfor (i = 0; i < a->__size; i++)\n\t\t\t\tsoap_default_%s(soap, a->%s+i);", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name)); } else if (has_class((Tnode*)p->info.typ->ref)) { fprintf(fout, "\n\t\t\ta->%s = soap_new_%s(soap, a->__size);", ident(p->sym->name), c_ident((Tnode*)p->info.typ->ref)); fprintf(fout, "\n\t\t\tfor (i = 0; i < a->__size; i++)\n\t\t\t\tsoap_default_%s(soap, a->%s+i);", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name)); } else { fprintf(fout, "\n\t\t\ta->%s = (%s)soap_malloc(soap, sizeof(%s) * a->__size);", ident(p->sym->name), c_type_id((Tnode*)p->info.typ->ref, "*"), c_type((Tnode*)p->info.typ->ref)); if (((Tnode*)p->info.typ->ref)->type == Tpointer) fprintf(fout, "\n\t\t\tfor (i = 0; i < a->__size; i++)\n\t\t\t\ta->%s[i] = NULL;", ident(p->sym->name)); else if (!is_XML((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\tfor (i = 0; i < a->__size; i++)\n\t\t\t\tsoap_default_%s(soap, a->%s+i);", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name)); } fprintf(fout, "\n\t\t\tfor (i = 0; i < a->__size; i++)"); fprintf(fout, "\n\t\t\t{\tsoap_peek_element(soap);\n\t\t\t\tif (soap->position)\n\t\t\t\t{\ti = soap->positions[0]-j;\n\t\t\t\t\tif (i < 0 || i >= a->__size)\n\t\t\t\t\t{\tsoap->error = SOAP_IOB;\n\t\t\t\t\t\treturn NULL;\n\t\t\t\t\t}\n\t\t\t\t}"); if (is_XML((Tnode*)p->info.typ->ref) && is_string((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (!soap_inliteral(soap, NULL, (char**)(a->%s + i)))", ident(p->sym->name)); else if (is_XML((Tnode*)p->info.typ->ref) && is_wstring((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (!soap_inwliteral(soap, NULL, (wchar_t**)(a->%s + i)))", ident(p->sym->name)); else if (is_string((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (!soap_in_%s(soap, NULL, (char**)(a->%s + i), \"%s\"))", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name), xsi_type((Tnode*)p->info.typ->ref)); else if (is_wstring((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (!soap_in_%s(soap, NULL, (wchar_t**)(a->%s + i), \"%s\"))", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name), xsi_type((Tnode*)p->info.typ->ref)); else fprintf(fout, "\n\t\t\t\tif (!soap_in_%s(soap, NULL, a->%s + i, \"%s\"))", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name), xsi_type((Tnode*)p->info.typ->ref)); fprintf(fout, "\n\t\t\t\t{\tif (soap->error != SOAP_NO_TAG)\n\t\t\t\t\t\treturn NULL;"); fprintf(fout, "\n\t\t\t\t\tsoap->error = SOAP_OK;"); fprintf(fout, "\n\t\t\t\t\tbreak;"); fprintf(fout, "\n\t\t\t\t}"); } fprintf(fout, "\n\t\t\t}\n\t\t}\n\t\telse"); fprintf(fout, "\n\t\t{\tif (soap_new_block(soap) == NULL)\n\t\t\t\treturn NULL;"); if (p->info.maxOccurs > 1) { if (d) { for (i = 1; i < d; i++) fprintf(fout, "\n\t\t\ta->__size[%d] = 1;", i); fprintf(fout, "\n\t\t\tfor (a->__size[0] = 0; a->__size[0] <= " SOAP_LONG_FORMAT "; a->__size[0]++)", p->info.maxOccurs); } else fprintf(fout, "\n\t\t\tfor (a->__size = 0; a->__size <= " SOAP_LONG_FORMAT "; a->__size++)", p->info.maxOccurs); } else { if (d) { for (i = 1; i < d; i++) fprintf(fout, "\n\t\t\ta->__size[%d] = 1;", i); fprintf(fout, "\n\t\t\tfor (a->__size[0] = 0; a->__size[0] < SOAP_MAXARRAYSIZE; a->__size[0]++)"); } else fprintf(fout, "\n\t\t\tfor (a->__size = 0; a->__size < SOAP_MAXARRAYSIZE; a->__size++)"); } if (((Tnode*)p->info.typ->ref)->type == Tclass || has_class((Tnode*)p->info.typ->ref) || (!cflag && ((Tnode*)p->info.typ->ref)->type == Tstruct)) fprintf(fout, "\n\t\t\t{\tp = soap_block<%s>::push(soap, NULL);\n\t\t\t\tif (!p)\n\t\t\t\t\tbreak;", c_type((Tnode*)p->info.typ->ref)); else fprintf(fout, "\n\t\t\t{\tp = (%s)soap_push_block(soap, NULL, sizeof(%s));\n\t\t\t\tif (!p)\n\t\t\t\t\tbreak;", c_type(p->info.typ), c_type((Tnode*)p->info.typ->ref)); if (((Tnode*)p->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->info.typ->ref) && !is_volatile((Tnode*)p->info.typ->ref) && !is_typedef((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\t\tp->soap_default(soap);"); else if (((Tnode*)p->info.typ->ref)->type == Tpointer) fprintf(fout, "\n\t\t\t\t*p = NULL;"); else if (!is_XML((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\t\tsoap_default_%s(soap, p);", c_ident((Tnode*)p->info.typ->ref)); if (is_XML((Tnode*)p->info.typ->ref) && is_string((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (!soap_inliteral(soap, NULL, p))"); else if (is_XML((Tnode*)p->info.typ->ref) && is_wstring((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (!soap_inwliteral(soap, NULL, p))"); else fprintf(fout, "\n\t\t\t\tif (!soap_in_%s(soap, NULL, p, \"%s\"))", c_ident((Tnode*)p->info.typ->ref), xsi_type((Tnode*)p->info.typ->ref)); fprintf(fout, "\n\t\t\t\t{\tif (soap->error == SOAP_NO_TAG)"); fprintf(fout, "\n\t\t\t\t\t\tsoap->error = SOAP_OK;"); fprintf(fout, "\n\t\t\t\t\tbreak;"); fprintf(fout, "\n\t\t\t\t}"); fprintf(fout, "\n\t\t\t}"); if (((Tnode*)p->info.typ->ref)->type == Tclass || has_class((Tnode*)p->info.typ->ref) || (!cflag && ((Tnode*)p->info.typ->ref)->type == Tstruct)) fprintf(fout, "\n\t\t\tsoap_block<%s>::pop(soap, NULL);", c_type((Tnode*)p->info.typ->ref)); else fprintf(fout, "\n\t\t\tsoap_pop_block(soap, NULL);"); if (p->info.minOccurs > 0) fprintf(fout, "\n\t\t\tif (%sa->__size < " SOAP_LONG_FORMAT ")\n\t\t\t{\tsoap->error = SOAP_OCCURS;\n\t\t\t\treturn NULL;\n\t\t\t}", strict_check(), p->info.minOccurs); if (p->info.maxOccurs > 1) fprintf(fout, "\n\t\t\tif (%sa->__size > " SOAP_LONG_FORMAT ")\n\t\t\t{\tsoap->error = SOAP_OCCURS;\n\t\t\t\treturn NULL;\n\t\t\t}", strict_check(), p->info.maxOccurs); if (((Tnode*)p->info.typ->ref)->type == Tclass || has_class((Tnode*)p->info.typ->ref) || (((Tnode*)p->info.typ->ref)->type == Tstruct && !cflag)) { fprintf(fout, "\n\t\t\tif (soap->blist->size)\n\t\t\t\ta->%s = soap_new_%s(soap, soap->blist->size/sizeof(%s));\n\t\t\telse\n\t\t\t\ta->%s = NULL;", ident(p->sym->name), c_ident((Tnode*)p->info.typ->ref), c_type((Tnode*)p->info.typ->ref), ident(p->sym->name)); fprintf(fout, "\n\t\t\tif (a->%s)\n\t\t\t\tsoap_block<%s>::save(soap, NULL, a->%s);\n\t\t\telse\n\t\t\t\tsoap_block<%s>::end(soap, NULL);", ident(p->sym->name), c_type((Tnode*)p->info.typ->ref), ident(p->sym->name), c_type((Tnode*)p->info.typ->ref)); } else fprintf(fout, "\n\t\t\ta->%s = (%s)soap_save_block(soap, NULL, NULL, 1);", ident(p->sym->name), c_type(p->info.typ)); fprintf(fout, "\n\t\t}"); fprintf(fout, "\n\t\tif (soap->error || soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); } if (has_getter(typ)) fprintf(fout, "\n\t\tif (a->get(soap))\n\t\t\treturn NULL;"); fprintf(fout, "\n\t}\n\telse\n\t{\t"); if (is_attachment(typ)) fprintf(fout, "\n#ifndef WITH_LEANER\n\t\tif (*soap->href != '#')\n\t\t{\tif (soap_attachment_forward(soap, &a->__ptr, &a->__size, &a->id, &a->type, &a->options))\n\t\t\t\treturn NULL;\n\t\t}\n\t\telse\n#endif\n\t\t\t"); if (typ->type == Tclass || (!cflag && typ->type == Tstruct)) fprintf(fout, "a = (%s)soap_id_forward(soap, soap->href, (void*)a, 0, %s, %s, sizeof(%s), 0, %s_finsert, %s_fbase);", c_type_id(typ, "*"), soap_type(typ), soap_type(typ), c_type(typ), prefix, prefix); else fprintf(fout, "a = (%s)soap_id_forward(soap, soap->href, (void*)a, 0, %s, %s, sizeof(%s), 0, NULL, NULL);", c_type_id(typ, "*"), soap_type(typ), soap_type(typ), c_type(typ)); fprintf(fout, "\n\t\tif (soap->body && soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); fprintf(fout, "\n\t}"); fprintf(fout, "\n\treturn a;\n}"); } const char * cstring(const char *s, int q) { size_t n; char *t; const char *r; for (n = 0, r = s; *r; n++, r++) { if (*r == '"' || *r == '\\') n++; else if (*r < 32) n += 3; } r = t = (char*)emalloc(n + 2*q + 1); if (q) *t++ = '"'; for (; *s; s++) { if (*s == '"' || *s == '\\') { *t++ = '\\'; *t++ = *s; } else if (*s < 32) { sprintf(t, "\\%03o", (unsigned int)(unsigned char)*s); t += 4; } else *t++ = *s; } if (q) *t++ = '"'; *t = '\0'; return r; } const char * xstring(const char *s) { size_t n; char *t; const char *r; for (n = 0, r = s; *r; n++, r++) { if (*r < 32 || *r >= 127) n += 4; else if (*r == '<' || *r == '>') n += 3; else if (*r == '&') n += 4; else if (*r == '"') n += 5; else if (*r == '\\') n += 1; } r = t = (char*)emalloc(n + 1); for (; *s; s++) { if (*s < 32 || *s >= 127) { sprintf(t, "&#%.2x;", (unsigned char)*s); t += 5; } else if (*s == '<') { strcpy(t, "<"); t += 4; } else if (*s == '>') { strcpy(t, ">"); t += 4; } else if (*s == '&') { strcpy(t, "&"); t += 5; } else if (*s == '"') { strcpy(t, """); t += 6; } else if (*s == '\\') { strcpy(t, "\\\\"); t += 2; } else *t++ = *s; } *t = '\0'; return r; } gsoap-2.8.28/gsoap/Makefile.in0000644000175000017500000015773712653650150015471 0ustar ellertellert# Makefile.in generated by automake 1.14 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = gsoap DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(include_HEADERS) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(pkgdatadir)" \ "$(DESTDIR)$(includedir)" LIBRARIES = $(lib_LIBRARIES) AR = ar ARFLAGS = cru AM_V_AR = $(am__v_AR_@AM_V@) am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libgsoap___a_AR = $(AR) $(ARFLAGS) libgsoap___a_LIBADD = am_libgsoap___a_OBJECTS = libgsoap___a-stdsoap2_cpp.$(OBJEXT) \ libgsoap___a-dom_cpp.$(OBJEXT) libgsoap___a_OBJECTS = $(am_libgsoap___a_OBJECTS) libgsoap_a_AR = $(AR) $(ARFLAGS) libgsoap_a_LIBADD = am_libgsoap_a_OBJECTS = libgsoap_a-stdsoap2.$(OBJEXT) \ libgsoap_a-dom.$(OBJEXT) libgsoap_a_OBJECTS = $(am_libgsoap_a_OBJECTS) libgsoapck___a_AR = $(AR) $(ARFLAGS) libgsoapck___a_LIBADD = am_libgsoapck___a_OBJECTS = libgsoapck___a-stdsoap2_ck_cpp.$(OBJEXT) \ libgsoapck___a-dom_cpp.$(OBJEXT) libgsoapck___a_OBJECTS = $(am_libgsoapck___a_OBJECTS) libgsoapck_a_AR = $(AR) $(ARFLAGS) libgsoapck_a_LIBADD = am_libgsoapck_a_OBJECTS = libgsoapck_a-stdsoap2_ck.$(OBJEXT) \ libgsoapck_a-dom.$(OBJEXT) libgsoapck_a_OBJECTS = $(am_libgsoapck_a_OBJECTS) libgsoapssl___a_AR = $(AR) $(ARFLAGS) libgsoapssl___a_LIBADD = am_libgsoapssl___a_OBJECTS = \ libgsoapssl___a-stdsoap2_ssl_cpp.$(OBJEXT) \ libgsoapssl___a-dom_cpp.$(OBJEXT) libgsoapssl___a_OBJECTS = $(am_libgsoapssl___a_OBJECTS) libgsoapssl_a_AR = $(AR) $(ARFLAGS) libgsoapssl_a_LIBADD = am_libgsoapssl_a_OBJECTS = libgsoapssl_a-stdsoap2_ssl.$(OBJEXT) \ libgsoapssl_a-dom.$(OBJEXT) libgsoapssl_a_OBJECTS = $(am_libgsoapssl_a_OBJECTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = SOURCES = $(libgsoap___a_SOURCES) $(libgsoap_a_SOURCES) \ $(libgsoapck___a_SOURCES) $(libgsoapck_a_SOURCES) \ $(libgsoapssl___a_SOURCES) $(libgsoapssl_a_SOURCES) DIST_SOURCES = $(libgsoap___a_SOURCES) $(libgsoap_a_SOURCES) \ $(libgsoapck___a_SOURCES) $(libgsoapck_a_SOURCES) \ $(libgsoapssl___a_SOURCES) $(libgsoapssl_a_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(nobase_pkgdata_DATA) HEADERS = $(include_HEADERS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ STRIP = @STRIP@ VERSION = @VERSION@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 SUBDIRS = . src wsdl @SAMPLE_DIRS@ CLEANFILES = soapcpp2 wsdl2h stdsoap2_cpp.cpp stdsoap2_ck.c stdsoap2_ck_cpp.cpp stdsoap2_ssl.c stdsoap2_ssl_cpp.cpp dom_cpp.cpp AM_CXXFLAGS = $(SOAPCPP2_DEBUG) -D$(platform) AM_CFLAGS = $(SOAPCPP2_DEBUG) -D$(platform) # Install all soapcpp2 and wsdl2h files into ${prefix}/share/gsoap nobase_pkgdata_DATA = $(srcdir)/import/* $(srcdir)/plugin/* $(srcdir)/WS/* $(srcdir)/custom/* $(srcdir)/extras/* lib_LIBRARIES = libgsoap.a libgsoap++.a libgsoapck.a libgsoapck++.a libgsoapssl.a libgsoapssl++.a libgsoap_a_SOURCES = stdsoap2.c dom.c libgsoap_a_CFLAGS = $(SOAPCPP2_DEBUG) $(SOAPCPP2_NONAMESPACES) $(SOAPCPP2_IPV6) -D$(platform) libgsoap___a_SOURCES = stdsoap2_cpp.cpp dom_cpp.cpp libgsoap___a_CXXFLAGS = $(SOAPCPP2_DEBUG) $(SOAPCPP2_NONAMESPACES) $(SOAPCPP2_IPV6) -D$(platform) libgsoapck_a_SOURCES = stdsoap2_ck.c dom.c libgsoapck_a_CFLAGS = $(SOAPCPP2_DEBUG) $(SOAPCPP2_NONAMESPACES) $(SOAPCPP2_IPV6) -D$(platform) -DWITH_COOKIES libgsoapck___a_SOURCES = stdsoap2_ck_cpp.cpp dom_cpp.cpp libgsoapck___a_CXXFLAGS = $(SOAPCPP2_DEBUG) $(SOAPCPP2_NONAMESPACES) $(SOAPCPP2_IPV6) -D$(platform) -DWITH_COOKIES libgsoapssl_a_SOURCES = stdsoap2_ssl.c dom.c libgsoapssl_a_CFLAGS = $(SOAPCPP2_DEBUG) $(SOAPCPP2_NONAMESPACES) $(SOAPCPP2_IPV6) -D$(platform) $(WSDL2H_EXTRA_FLAGS) -DWITH_DOM -DWITH_COOKIES libgsoapssl___a_SOURCES = stdsoap2_ssl_cpp.cpp dom_cpp.cpp libgsoapssl___a_CXXFLAGS = $(SOAPCPP2_DEBUG) $(SOAPCPP2_NONAMESPACES) $(SOAPCPP2_IPV6) -D$(platform) $(WSDL2H_EXTRA_FLAGS) -DWITH_DOM -DWITH_COOKIES BUILT_SOURCES = stdsoap2_cpp.cpp dom_cpp.cpp $(lib_LIBRARIES) include_HEADERS = stdsoap2.h all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: .SUFFIXES: .c .cpp .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-libLIBRARIES: $(lib_LIBRARIES) @$(NORMAL_INSTALL) @list='$(lib_LIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ echo " $(INSTALL_DATA) $$list2 '$(DESTDIR)$(libdir)'"; \ $(INSTALL_DATA) $$list2 "$(DESTDIR)$(libdir)" || exit $$?; } @$(POST_INSTALL) @list='$(lib_LIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ if test -f $$p; then \ $(am__strip_dir) \ echo " ( cd '$(DESTDIR)$(libdir)' && $(RANLIB) $$f )"; \ ( cd "$(DESTDIR)$(libdir)" && $(RANLIB) $$f ) || exit $$?; \ else :; fi; \ done uninstall-libLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LIBRARIES)'; test -n "$(libdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(libdir)'; $(am__uninstall_files_from_dir) clean-libLIBRARIES: -test -z "$(lib_LIBRARIES)" || rm -f $(lib_LIBRARIES) libgsoap++.a: $(libgsoap___a_OBJECTS) $(libgsoap___a_DEPENDENCIES) $(EXTRA_libgsoap___a_DEPENDENCIES) $(AM_V_at)-rm -f libgsoap++.a $(AM_V_AR)$(libgsoap___a_AR) libgsoap++.a $(libgsoap___a_OBJECTS) $(libgsoap___a_LIBADD) $(AM_V_at)$(RANLIB) libgsoap++.a libgsoap.a: $(libgsoap_a_OBJECTS) $(libgsoap_a_DEPENDENCIES) $(EXTRA_libgsoap_a_DEPENDENCIES) $(AM_V_at)-rm -f libgsoap.a $(AM_V_AR)$(libgsoap_a_AR) libgsoap.a $(libgsoap_a_OBJECTS) $(libgsoap_a_LIBADD) $(AM_V_at)$(RANLIB) libgsoap.a libgsoapck++.a: $(libgsoapck___a_OBJECTS) $(libgsoapck___a_DEPENDENCIES) $(EXTRA_libgsoapck___a_DEPENDENCIES) $(AM_V_at)-rm -f libgsoapck++.a $(AM_V_AR)$(libgsoapck___a_AR) libgsoapck++.a $(libgsoapck___a_OBJECTS) $(libgsoapck___a_LIBADD) $(AM_V_at)$(RANLIB) libgsoapck++.a libgsoapck.a: $(libgsoapck_a_OBJECTS) $(libgsoapck_a_DEPENDENCIES) $(EXTRA_libgsoapck_a_DEPENDENCIES) $(AM_V_at)-rm -f libgsoapck.a $(AM_V_AR)$(libgsoapck_a_AR) libgsoapck.a $(libgsoapck_a_OBJECTS) $(libgsoapck_a_LIBADD) $(AM_V_at)$(RANLIB) libgsoapck.a libgsoapssl++.a: $(libgsoapssl___a_OBJECTS) $(libgsoapssl___a_DEPENDENCIES) $(EXTRA_libgsoapssl___a_DEPENDENCIES) $(AM_V_at)-rm -f libgsoapssl++.a $(AM_V_AR)$(libgsoapssl___a_AR) libgsoapssl++.a $(libgsoapssl___a_OBJECTS) $(libgsoapssl___a_LIBADD) $(AM_V_at)$(RANLIB) libgsoapssl++.a libgsoapssl.a: $(libgsoapssl_a_OBJECTS) $(libgsoapssl_a_DEPENDENCIES) $(EXTRA_libgsoapssl_a_DEPENDENCIES) $(AM_V_at)-rm -f libgsoapssl.a $(AM_V_AR)$(libgsoapssl_a_AR) libgsoapssl.a $(libgsoapssl_a_OBJECTS) $(libgsoapssl_a_LIBADD) $(AM_V_at)$(RANLIB) libgsoapssl.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsoap___a-dom_cpp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsoap___a-stdsoap2_cpp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsoap_a-dom.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsoap_a-stdsoap2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsoapck___a-dom_cpp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsoapck___a-stdsoap2_ck_cpp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsoapck_a-dom.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsoapck_a-stdsoap2_ck.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsoapssl___a-dom_cpp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsoapssl___a-stdsoap2_ssl_cpp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsoapssl_a-dom.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsoapssl_a-stdsoap2_ssl.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` libgsoap_a-stdsoap2.o: stdsoap2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoap_a_CFLAGS) $(CFLAGS) -MT libgsoap_a-stdsoap2.o -MD -MP -MF $(DEPDIR)/libgsoap_a-stdsoap2.Tpo -c -o libgsoap_a-stdsoap2.o `test -f 'stdsoap2.c' || echo '$(srcdir)/'`stdsoap2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsoap_a-stdsoap2.Tpo $(DEPDIR)/libgsoap_a-stdsoap2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='stdsoap2.c' object='libgsoap_a-stdsoap2.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoap_a_CFLAGS) $(CFLAGS) -c -o libgsoap_a-stdsoap2.o `test -f 'stdsoap2.c' || echo '$(srcdir)/'`stdsoap2.c libgsoap_a-stdsoap2.obj: stdsoap2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoap_a_CFLAGS) $(CFLAGS) -MT libgsoap_a-stdsoap2.obj -MD -MP -MF $(DEPDIR)/libgsoap_a-stdsoap2.Tpo -c -o libgsoap_a-stdsoap2.obj `if test -f 'stdsoap2.c'; then $(CYGPATH_W) 'stdsoap2.c'; else $(CYGPATH_W) '$(srcdir)/stdsoap2.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsoap_a-stdsoap2.Tpo $(DEPDIR)/libgsoap_a-stdsoap2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='stdsoap2.c' object='libgsoap_a-stdsoap2.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoap_a_CFLAGS) $(CFLAGS) -c -o libgsoap_a-stdsoap2.obj `if test -f 'stdsoap2.c'; then $(CYGPATH_W) 'stdsoap2.c'; else $(CYGPATH_W) '$(srcdir)/stdsoap2.c'; fi` libgsoap_a-dom.o: dom.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoap_a_CFLAGS) $(CFLAGS) -MT libgsoap_a-dom.o -MD -MP -MF $(DEPDIR)/libgsoap_a-dom.Tpo -c -o libgsoap_a-dom.o `test -f 'dom.c' || echo '$(srcdir)/'`dom.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsoap_a-dom.Tpo $(DEPDIR)/libgsoap_a-dom.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dom.c' object='libgsoap_a-dom.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoap_a_CFLAGS) $(CFLAGS) -c -o libgsoap_a-dom.o `test -f 'dom.c' || echo '$(srcdir)/'`dom.c libgsoap_a-dom.obj: dom.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoap_a_CFLAGS) $(CFLAGS) -MT libgsoap_a-dom.obj -MD -MP -MF $(DEPDIR)/libgsoap_a-dom.Tpo -c -o libgsoap_a-dom.obj `if test -f 'dom.c'; then $(CYGPATH_W) 'dom.c'; else $(CYGPATH_W) '$(srcdir)/dom.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsoap_a-dom.Tpo $(DEPDIR)/libgsoap_a-dom.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dom.c' object='libgsoap_a-dom.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoap_a_CFLAGS) $(CFLAGS) -c -o libgsoap_a-dom.obj `if test -f 'dom.c'; then $(CYGPATH_W) 'dom.c'; else $(CYGPATH_W) '$(srcdir)/dom.c'; fi` libgsoapck_a-stdsoap2_ck.o: stdsoap2_ck.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoapck_a_CFLAGS) $(CFLAGS) -MT libgsoapck_a-stdsoap2_ck.o -MD -MP -MF $(DEPDIR)/libgsoapck_a-stdsoap2_ck.Tpo -c -o libgsoapck_a-stdsoap2_ck.o `test -f 'stdsoap2_ck.c' || echo '$(srcdir)/'`stdsoap2_ck.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsoapck_a-stdsoap2_ck.Tpo $(DEPDIR)/libgsoapck_a-stdsoap2_ck.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='stdsoap2_ck.c' object='libgsoapck_a-stdsoap2_ck.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoapck_a_CFLAGS) $(CFLAGS) -c -o libgsoapck_a-stdsoap2_ck.o `test -f 'stdsoap2_ck.c' || echo '$(srcdir)/'`stdsoap2_ck.c libgsoapck_a-stdsoap2_ck.obj: stdsoap2_ck.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoapck_a_CFLAGS) $(CFLAGS) -MT libgsoapck_a-stdsoap2_ck.obj -MD -MP -MF $(DEPDIR)/libgsoapck_a-stdsoap2_ck.Tpo -c -o libgsoapck_a-stdsoap2_ck.obj `if test -f 'stdsoap2_ck.c'; then $(CYGPATH_W) 'stdsoap2_ck.c'; else $(CYGPATH_W) '$(srcdir)/stdsoap2_ck.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsoapck_a-stdsoap2_ck.Tpo $(DEPDIR)/libgsoapck_a-stdsoap2_ck.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='stdsoap2_ck.c' object='libgsoapck_a-stdsoap2_ck.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoapck_a_CFLAGS) $(CFLAGS) -c -o libgsoapck_a-stdsoap2_ck.obj `if test -f 'stdsoap2_ck.c'; then $(CYGPATH_W) 'stdsoap2_ck.c'; else $(CYGPATH_W) '$(srcdir)/stdsoap2_ck.c'; fi` libgsoapck_a-dom.o: dom.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoapck_a_CFLAGS) $(CFLAGS) -MT libgsoapck_a-dom.o -MD -MP -MF $(DEPDIR)/libgsoapck_a-dom.Tpo -c -o libgsoapck_a-dom.o `test -f 'dom.c' || echo '$(srcdir)/'`dom.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsoapck_a-dom.Tpo $(DEPDIR)/libgsoapck_a-dom.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dom.c' object='libgsoapck_a-dom.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoapck_a_CFLAGS) $(CFLAGS) -c -o libgsoapck_a-dom.o `test -f 'dom.c' || echo '$(srcdir)/'`dom.c libgsoapck_a-dom.obj: dom.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoapck_a_CFLAGS) $(CFLAGS) -MT libgsoapck_a-dom.obj -MD -MP -MF $(DEPDIR)/libgsoapck_a-dom.Tpo -c -o libgsoapck_a-dom.obj `if test -f 'dom.c'; then $(CYGPATH_W) 'dom.c'; else $(CYGPATH_W) '$(srcdir)/dom.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsoapck_a-dom.Tpo $(DEPDIR)/libgsoapck_a-dom.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dom.c' object='libgsoapck_a-dom.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoapck_a_CFLAGS) $(CFLAGS) -c -o libgsoapck_a-dom.obj `if test -f 'dom.c'; then $(CYGPATH_W) 'dom.c'; else $(CYGPATH_W) '$(srcdir)/dom.c'; fi` libgsoapssl_a-stdsoap2_ssl.o: stdsoap2_ssl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoapssl_a_CFLAGS) $(CFLAGS) -MT libgsoapssl_a-stdsoap2_ssl.o -MD -MP -MF $(DEPDIR)/libgsoapssl_a-stdsoap2_ssl.Tpo -c -o libgsoapssl_a-stdsoap2_ssl.o `test -f 'stdsoap2_ssl.c' || echo '$(srcdir)/'`stdsoap2_ssl.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsoapssl_a-stdsoap2_ssl.Tpo $(DEPDIR)/libgsoapssl_a-stdsoap2_ssl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='stdsoap2_ssl.c' object='libgsoapssl_a-stdsoap2_ssl.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoapssl_a_CFLAGS) $(CFLAGS) -c -o libgsoapssl_a-stdsoap2_ssl.o `test -f 'stdsoap2_ssl.c' || echo '$(srcdir)/'`stdsoap2_ssl.c libgsoapssl_a-stdsoap2_ssl.obj: stdsoap2_ssl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoapssl_a_CFLAGS) $(CFLAGS) -MT libgsoapssl_a-stdsoap2_ssl.obj -MD -MP -MF $(DEPDIR)/libgsoapssl_a-stdsoap2_ssl.Tpo -c -o libgsoapssl_a-stdsoap2_ssl.obj `if test -f 'stdsoap2_ssl.c'; then $(CYGPATH_W) 'stdsoap2_ssl.c'; else $(CYGPATH_W) '$(srcdir)/stdsoap2_ssl.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsoapssl_a-stdsoap2_ssl.Tpo $(DEPDIR)/libgsoapssl_a-stdsoap2_ssl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='stdsoap2_ssl.c' object='libgsoapssl_a-stdsoap2_ssl.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoapssl_a_CFLAGS) $(CFLAGS) -c -o libgsoapssl_a-stdsoap2_ssl.obj `if test -f 'stdsoap2_ssl.c'; then $(CYGPATH_W) 'stdsoap2_ssl.c'; else $(CYGPATH_W) '$(srcdir)/stdsoap2_ssl.c'; fi` libgsoapssl_a-dom.o: dom.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoapssl_a_CFLAGS) $(CFLAGS) -MT libgsoapssl_a-dom.o -MD -MP -MF $(DEPDIR)/libgsoapssl_a-dom.Tpo -c -o libgsoapssl_a-dom.o `test -f 'dom.c' || echo '$(srcdir)/'`dom.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsoapssl_a-dom.Tpo $(DEPDIR)/libgsoapssl_a-dom.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dom.c' object='libgsoapssl_a-dom.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoapssl_a_CFLAGS) $(CFLAGS) -c -o libgsoapssl_a-dom.o `test -f 'dom.c' || echo '$(srcdir)/'`dom.c libgsoapssl_a-dom.obj: dom.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoapssl_a_CFLAGS) $(CFLAGS) -MT libgsoapssl_a-dom.obj -MD -MP -MF $(DEPDIR)/libgsoapssl_a-dom.Tpo -c -o libgsoapssl_a-dom.obj `if test -f 'dom.c'; then $(CYGPATH_W) 'dom.c'; else $(CYGPATH_W) '$(srcdir)/dom.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsoapssl_a-dom.Tpo $(DEPDIR)/libgsoapssl_a-dom.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dom.c' object='libgsoapssl_a-dom.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoapssl_a_CFLAGS) $(CFLAGS) -c -o libgsoapssl_a-dom.obj `if test -f 'dom.c'; then $(CYGPATH_W) 'dom.c'; else $(CYGPATH_W) '$(srcdir)/dom.c'; fi` .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` libgsoap___a-stdsoap2_cpp.o: stdsoap2_cpp.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoap___a_CXXFLAGS) $(CXXFLAGS) -MT libgsoap___a-stdsoap2_cpp.o -MD -MP -MF $(DEPDIR)/libgsoap___a-stdsoap2_cpp.Tpo -c -o libgsoap___a-stdsoap2_cpp.o `test -f 'stdsoap2_cpp.cpp' || echo '$(srcdir)/'`stdsoap2_cpp.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsoap___a-stdsoap2_cpp.Tpo $(DEPDIR)/libgsoap___a-stdsoap2_cpp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='stdsoap2_cpp.cpp' object='libgsoap___a-stdsoap2_cpp.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoap___a_CXXFLAGS) $(CXXFLAGS) -c -o libgsoap___a-stdsoap2_cpp.o `test -f 'stdsoap2_cpp.cpp' || echo '$(srcdir)/'`stdsoap2_cpp.cpp libgsoap___a-stdsoap2_cpp.obj: stdsoap2_cpp.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoap___a_CXXFLAGS) $(CXXFLAGS) -MT libgsoap___a-stdsoap2_cpp.obj -MD -MP -MF $(DEPDIR)/libgsoap___a-stdsoap2_cpp.Tpo -c -o libgsoap___a-stdsoap2_cpp.obj `if test -f 'stdsoap2_cpp.cpp'; then $(CYGPATH_W) 'stdsoap2_cpp.cpp'; else $(CYGPATH_W) '$(srcdir)/stdsoap2_cpp.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsoap___a-stdsoap2_cpp.Tpo $(DEPDIR)/libgsoap___a-stdsoap2_cpp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='stdsoap2_cpp.cpp' object='libgsoap___a-stdsoap2_cpp.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoap___a_CXXFLAGS) $(CXXFLAGS) -c -o libgsoap___a-stdsoap2_cpp.obj `if test -f 'stdsoap2_cpp.cpp'; then $(CYGPATH_W) 'stdsoap2_cpp.cpp'; else $(CYGPATH_W) '$(srcdir)/stdsoap2_cpp.cpp'; fi` libgsoap___a-dom_cpp.o: dom_cpp.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoap___a_CXXFLAGS) $(CXXFLAGS) -MT libgsoap___a-dom_cpp.o -MD -MP -MF $(DEPDIR)/libgsoap___a-dom_cpp.Tpo -c -o libgsoap___a-dom_cpp.o `test -f 'dom_cpp.cpp' || echo '$(srcdir)/'`dom_cpp.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsoap___a-dom_cpp.Tpo $(DEPDIR)/libgsoap___a-dom_cpp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dom_cpp.cpp' object='libgsoap___a-dom_cpp.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoap___a_CXXFLAGS) $(CXXFLAGS) -c -o libgsoap___a-dom_cpp.o `test -f 'dom_cpp.cpp' || echo '$(srcdir)/'`dom_cpp.cpp libgsoap___a-dom_cpp.obj: dom_cpp.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoap___a_CXXFLAGS) $(CXXFLAGS) -MT libgsoap___a-dom_cpp.obj -MD -MP -MF $(DEPDIR)/libgsoap___a-dom_cpp.Tpo -c -o libgsoap___a-dom_cpp.obj `if test -f 'dom_cpp.cpp'; then $(CYGPATH_W) 'dom_cpp.cpp'; else $(CYGPATH_W) '$(srcdir)/dom_cpp.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsoap___a-dom_cpp.Tpo $(DEPDIR)/libgsoap___a-dom_cpp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dom_cpp.cpp' object='libgsoap___a-dom_cpp.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoap___a_CXXFLAGS) $(CXXFLAGS) -c -o libgsoap___a-dom_cpp.obj `if test -f 'dom_cpp.cpp'; then $(CYGPATH_W) 'dom_cpp.cpp'; else $(CYGPATH_W) '$(srcdir)/dom_cpp.cpp'; fi` libgsoapck___a-stdsoap2_ck_cpp.o: stdsoap2_ck_cpp.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoapck___a_CXXFLAGS) $(CXXFLAGS) -MT libgsoapck___a-stdsoap2_ck_cpp.o -MD -MP -MF $(DEPDIR)/libgsoapck___a-stdsoap2_ck_cpp.Tpo -c -o libgsoapck___a-stdsoap2_ck_cpp.o `test -f 'stdsoap2_ck_cpp.cpp' || echo '$(srcdir)/'`stdsoap2_ck_cpp.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsoapck___a-stdsoap2_ck_cpp.Tpo $(DEPDIR)/libgsoapck___a-stdsoap2_ck_cpp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='stdsoap2_ck_cpp.cpp' object='libgsoapck___a-stdsoap2_ck_cpp.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoapck___a_CXXFLAGS) $(CXXFLAGS) -c -o libgsoapck___a-stdsoap2_ck_cpp.o `test -f 'stdsoap2_ck_cpp.cpp' || echo '$(srcdir)/'`stdsoap2_ck_cpp.cpp libgsoapck___a-stdsoap2_ck_cpp.obj: stdsoap2_ck_cpp.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoapck___a_CXXFLAGS) $(CXXFLAGS) -MT libgsoapck___a-stdsoap2_ck_cpp.obj -MD -MP -MF $(DEPDIR)/libgsoapck___a-stdsoap2_ck_cpp.Tpo -c -o libgsoapck___a-stdsoap2_ck_cpp.obj `if test -f 'stdsoap2_ck_cpp.cpp'; then $(CYGPATH_W) 'stdsoap2_ck_cpp.cpp'; else $(CYGPATH_W) '$(srcdir)/stdsoap2_ck_cpp.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsoapck___a-stdsoap2_ck_cpp.Tpo $(DEPDIR)/libgsoapck___a-stdsoap2_ck_cpp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='stdsoap2_ck_cpp.cpp' object='libgsoapck___a-stdsoap2_ck_cpp.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoapck___a_CXXFLAGS) $(CXXFLAGS) -c -o libgsoapck___a-stdsoap2_ck_cpp.obj `if test -f 'stdsoap2_ck_cpp.cpp'; then $(CYGPATH_W) 'stdsoap2_ck_cpp.cpp'; else $(CYGPATH_W) '$(srcdir)/stdsoap2_ck_cpp.cpp'; fi` libgsoapck___a-dom_cpp.o: dom_cpp.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoapck___a_CXXFLAGS) $(CXXFLAGS) -MT libgsoapck___a-dom_cpp.o -MD -MP -MF $(DEPDIR)/libgsoapck___a-dom_cpp.Tpo -c -o libgsoapck___a-dom_cpp.o `test -f 'dom_cpp.cpp' || echo '$(srcdir)/'`dom_cpp.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsoapck___a-dom_cpp.Tpo $(DEPDIR)/libgsoapck___a-dom_cpp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dom_cpp.cpp' object='libgsoapck___a-dom_cpp.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoapck___a_CXXFLAGS) $(CXXFLAGS) -c -o libgsoapck___a-dom_cpp.o `test -f 'dom_cpp.cpp' || echo '$(srcdir)/'`dom_cpp.cpp libgsoapck___a-dom_cpp.obj: dom_cpp.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoapck___a_CXXFLAGS) $(CXXFLAGS) -MT libgsoapck___a-dom_cpp.obj -MD -MP -MF $(DEPDIR)/libgsoapck___a-dom_cpp.Tpo -c -o libgsoapck___a-dom_cpp.obj `if test -f 'dom_cpp.cpp'; then $(CYGPATH_W) 'dom_cpp.cpp'; else $(CYGPATH_W) '$(srcdir)/dom_cpp.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsoapck___a-dom_cpp.Tpo $(DEPDIR)/libgsoapck___a-dom_cpp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dom_cpp.cpp' object='libgsoapck___a-dom_cpp.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoapck___a_CXXFLAGS) $(CXXFLAGS) -c -o libgsoapck___a-dom_cpp.obj `if test -f 'dom_cpp.cpp'; then $(CYGPATH_W) 'dom_cpp.cpp'; else $(CYGPATH_W) '$(srcdir)/dom_cpp.cpp'; fi` libgsoapssl___a-stdsoap2_ssl_cpp.o: stdsoap2_ssl_cpp.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoapssl___a_CXXFLAGS) $(CXXFLAGS) -MT libgsoapssl___a-stdsoap2_ssl_cpp.o -MD -MP -MF $(DEPDIR)/libgsoapssl___a-stdsoap2_ssl_cpp.Tpo -c -o libgsoapssl___a-stdsoap2_ssl_cpp.o `test -f 'stdsoap2_ssl_cpp.cpp' || echo '$(srcdir)/'`stdsoap2_ssl_cpp.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsoapssl___a-stdsoap2_ssl_cpp.Tpo $(DEPDIR)/libgsoapssl___a-stdsoap2_ssl_cpp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='stdsoap2_ssl_cpp.cpp' object='libgsoapssl___a-stdsoap2_ssl_cpp.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoapssl___a_CXXFLAGS) $(CXXFLAGS) -c -o libgsoapssl___a-stdsoap2_ssl_cpp.o `test -f 'stdsoap2_ssl_cpp.cpp' || echo '$(srcdir)/'`stdsoap2_ssl_cpp.cpp libgsoapssl___a-stdsoap2_ssl_cpp.obj: stdsoap2_ssl_cpp.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoapssl___a_CXXFLAGS) $(CXXFLAGS) -MT libgsoapssl___a-stdsoap2_ssl_cpp.obj -MD -MP -MF $(DEPDIR)/libgsoapssl___a-stdsoap2_ssl_cpp.Tpo -c -o libgsoapssl___a-stdsoap2_ssl_cpp.obj `if test -f 'stdsoap2_ssl_cpp.cpp'; then $(CYGPATH_W) 'stdsoap2_ssl_cpp.cpp'; else $(CYGPATH_W) '$(srcdir)/stdsoap2_ssl_cpp.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsoapssl___a-stdsoap2_ssl_cpp.Tpo $(DEPDIR)/libgsoapssl___a-stdsoap2_ssl_cpp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='stdsoap2_ssl_cpp.cpp' object='libgsoapssl___a-stdsoap2_ssl_cpp.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoapssl___a_CXXFLAGS) $(CXXFLAGS) -c -o libgsoapssl___a-stdsoap2_ssl_cpp.obj `if test -f 'stdsoap2_ssl_cpp.cpp'; then $(CYGPATH_W) 'stdsoap2_ssl_cpp.cpp'; else $(CYGPATH_W) '$(srcdir)/stdsoap2_ssl_cpp.cpp'; fi` libgsoapssl___a-dom_cpp.o: dom_cpp.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoapssl___a_CXXFLAGS) $(CXXFLAGS) -MT libgsoapssl___a-dom_cpp.o -MD -MP -MF $(DEPDIR)/libgsoapssl___a-dom_cpp.Tpo -c -o libgsoapssl___a-dom_cpp.o `test -f 'dom_cpp.cpp' || echo '$(srcdir)/'`dom_cpp.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsoapssl___a-dom_cpp.Tpo $(DEPDIR)/libgsoapssl___a-dom_cpp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dom_cpp.cpp' object='libgsoapssl___a-dom_cpp.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoapssl___a_CXXFLAGS) $(CXXFLAGS) -c -o libgsoapssl___a-dom_cpp.o `test -f 'dom_cpp.cpp' || echo '$(srcdir)/'`dom_cpp.cpp libgsoapssl___a-dom_cpp.obj: dom_cpp.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoapssl___a_CXXFLAGS) $(CXXFLAGS) -MT libgsoapssl___a-dom_cpp.obj -MD -MP -MF $(DEPDIR)/libgsoapssl___a-dom_cpp.Tpo -c -o libgsoapssl___a-dom_cpp.obj `if test -f 'dom_cpp.cpp'; then $(CYGPATH_W) 'dom_cpp.cpp'; else $(CYGPATH_W) '$(srcdir)/dom_cpp.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsoapssl___a-dom_cpp.Tpo $(DEPDIR)/libgsoapssl___a-dom_cpp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dom_cpp.cpp' object='libgsoapssl___a-dom_cpp.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoapssl___a_CXXFLAGS) $(CXXFLAGS) -c -o libgsoapssl___a-dom_cpp.obj `if test -f 'dom_cpp.cpp'; then $(CYGPATH_W) 'dom_cpp.cpp'; else $(CYGPATH_W) '$(srcdir)/dom_cpp.cpp'; fi` install-nobase_pkgdataDATA: $(nobase_pkgdata_DATA) @$(NORMAL_INSTALL) @list='$(nobase_pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgdatadir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgdatadir)" || exit 1; \ fi; \ $(am__nobase_list) | while read dir files; do \ xfiles=; for file in $$files; do \ if test -f "$$file"; then xfiles="$$xfiles $$file"; \ else xfiles="$$xfiles $(srcdir)/$$file"; fi; done; \ test -z "$$xfiles" || { \ test "x$$dir" = x. || { \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgdatadir)/$$dir'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgdatadir)/$$dir"; }; \ echo " $(INSTALL_DATA) $$xfiles '$(DESTDIR)$(pkgdatadir)/$$dir'"; \ $(INSTALL_DATA) $$xfiles "$(DESTDIR)$(pkgdatadir)/$$dir" || exit $$?; }; \ done uninstall-nobase_pkgdataDATA: @$(NORMAL_UNINSTALL) @list='$(nobase_pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \ $(am__nobase_strip_setup); files=`$(am__nobase_strip)`; \ dir='$(DESTDIR)$(pkgdatadir)'; $(am__uninstall_files_from_dir) install-includeHEADERS: $(include_HEADERS) @$(NORMAL_INSTALL) @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \ done uninstall-includeHEADERS: @$(NORMAL_UNINSTALL) @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-recursive all-am: Makefile $(LIBRARIES) $(DATA) $(HEADERS) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(pkgdatadir)" "$(DESTDIR)$(includedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-recursive clean-am: clean-generic clean-libLIBRARIES mostlyclean-am distclean: distclean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-includeHEADERS install-nobase_pkgdataDATA @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) install-data-hook install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-libLIBRARIES install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-includeHEADERS uninstall-libLIBRARIES \ uninstall-nobase_pkgdataDATA .MAKE: $(am__recursive_targets) all check install install-am \ install-data-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-libLIBRARIES cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am \ install-data-hook install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am \ install-includeHEADERS install-info install-info-am \ install-libLIBRARIES install-man install-nobase_pkgdataDATA \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic pdf pdf-am \ ps ps-am tags tags-am uninstall uninstall-am \ uninstall-includeHEADERS uninstall-libLIBRARIES \ uninstall-nobase_pkgdataDATA stdsoap2_ck.c: stdsoap2.cpp $(LN_S) -f $(srcdir)/stdsoap2.cpp stdsoap2_ck.c stdsoap2_cpp.cpp: stdsoap2.cpp $(LN_S) -f $(srcdir)/stdsoap2.cpp stdsoap2_cpp.cpp stdsoap2_ck_cpp.cpp: stdsoap2.cpp $(LN_S) -f $(srcdir)/stdsoap2.cpp stdsoap2_ck_cpp.cpp stdsoap2_ssl.c: stdsoap2.cpp $(LN_S) -f $(srcdir)/stdsoap2.cpp stdsoap2_ssl.c stdsoap2_ssl_cpp.cpp: stdsoap2.cpp $(LN_S) -f $(srcdir)/stdsoap2.cpp stdsoap2_ssl_cpp.cpp dom_cpp.cpp: dom.cpp $(LN_S) -f $(srcdir)/dom.cpp dom_cpp.cpp install-data-hook: $(LN_S) -f $(top_builddir)/gsoap/src/soapcpp2 $(top_builddir)/gsoap/soapcpp2 || echo "ok, link already exists". $(LN_S) -f $(top_builddir)/gsoap/wsdl/wsdl2h $(top_builddir)/gsoap/wsdl2h || echo "ok, link already exists". # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.28/gsoap/uddi2/0000755000175000017500000000000012654077575014426 5ustar ellertellertgsoap-2.8.28/gsoap/uddi2/uddi_v2.h0000644000175000017500000051611312653650160016124 0ustar ellertellert/** @mainpage gSOAP UDDI v2 Universal Description, Discovery and Integration, or UDDI, is the name of a group of web-based registries that expose information about a business or other entity and its technical interfaces. See the UDDI v2 specification @url http://uddi.org/pubs/ProgrammersAPI_v2.htm for more details. @section UDDI2_CLASSES Classes See Related Pages for examples. UDDI Inquire classes - @ref uddi2__find_USCOREbinding - @ref uddi2__find_USCOREbusiness - @ref uddi2__find_USCORErelatedBusinesses - @ref uddi2__find_USCOREservice - @ref uddi2__find_USCOREtModel - @ref uddi2__get_USCOREbindingDetail - @ref uddi2__get_USCOREbusinessDetail - @ref uddi2__get_USCOREbusinessDetailExt - @ref uddi2__get_USCOREserviceDetail - @ref uddi2__get_USCOREtModelDetail UDDI Publish classes - @ref uddi2__add_USCOREpublisherAssertions - @ref uddi2__delete_USCOREbinding - @ref uddi2__delete_USCOREbusiness - @ref uddi2__delete_USCOREservice - @ref uddi2__delete_USCOREtModel - @ref uddi2__delete_USCOREpublisherAssertions - @ref uddi2__discard_USCOREauthToken - @ref uddi2__get_USCOREassertionStatusReport - @ref uddi2__get_USCOREauthToken - @ref uddi2__get_USCOREpublisherAssertions - @ref uddi2__get_USCOREregisteredInfo - @ref uddi2__save_USCOREbinding - @ref uddi2__save_USCOREbusiness - @ref uddi2__save_USCOREservice - @ref uddi2__save_USCOREtModel - @ref uddi2__set_USCOREpublisherAssertions @section UDDI2_BINDINGS Binding Reference - @ref InquireSoap - @ref PublishSoap */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:find_binding // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__find_USCOREbinding @brief Represents a request to locate bindings that meet the specified requirements. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137712 */ /** @fn uddi2__find_USCOREbinding::uddi2__find_USCOREbinding(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the find_USCOREbinding class. */ /** @fn uddi2__find_USCOREbinding::uddi2__find_USCOREbinding(struct soap *soap, const char *tModelKey) @brief @param[in] soap gSOAP context @param[in] tModelKey string Creates an instance of the find_USCOREbinding class using the specified tModel key. */ /** @fn uddi2__find_USCOREbinding::uddi2__find_USCOREbinding(struct soap *soap, std::vector tModelKeys) @brief @param[in] soap gSOAP context @param[in] tModelKeys collection of tModel key strings Creates an instance of the find_USCOREbinding class using the specified tModel keys. */ /** @fn uddi2__bindingDetail* uddi2__find_USCOREbinding::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__bindingDetail object or NULL on error Send a request to a UDDI server to find binding details. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:find_business // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__find_USCOREbusiness @brief Represents a request to locate businesses that meet specific requirements. When the send method is called, the instance returns a uddi2__businessList object that contains a list of business that matched the search criteria. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137713 See also @ref example2. */ /** @fn uddi2__find_USCOREbusiness::uddi2__find_USCOREbusiness(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the find_USCOREbusiness class. */ /** @fn uddi2__find_USCOREbusiness::uddi2__find_USCOREbusiness(struct soap *soap, const char *name) @brief @param[in] soap gSOAP context Creates an instance of the find_USCOREbusiness class using the specified name of the requested business. */ /** @fn uddi2__find_USCOREbusiness::uddi2__find_USCOREbusiness(struct soap *soap, std::vector keyedReferences) @brief @param[in] soap gSOAP context Creates an instance of the find_USCOREbusiness class using the specified category references. */ /** @fn uddi2__find_USCOREbusiness::uddi2__find_USCOREbusiness(struct soap *soap, std::vector tModelKeys) @brief @param[in] soap gSOAP context Creates an instance of the find_USCOREbusiness class using the specified tModel keys. */ /** @fn uddi2__businessList *uddi2__find_USCOREbusiness::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__businessList object or NULL on error Send a request to a UDDI server to find a list of businesses. See also @ref example2. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:find_relatedBusinesses // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__find_USCORErelatedBusinesses @brief Represents a request to locate businesses that are related to a specific business. When the send method is called, the instance returns a uddi2__relatedBusinessList object that contains a list of business that matched the relationship set. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137714 */ /** @fn uddi2__find_USCORErelatedBusinesses::uddi2__find_USCORErelatedBusinesses(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the find_USCORErelatedBusiness class. */ /** @fn uddi2__find_USCORErelatedBusinesses::uddi2__find_USCORErelatedBusinesses(struct soap *soap, const char *businessKey) @brief @param[in] soap gSOAP context @param[in] businessKey string Creates an instance of the find_USCORErelatedBusiness class using the specified business key. */ /** @fn uddi2__relatedBusinessesList *uddi2__find_USCORErelatedBusinesses::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__relatedBusinessList object or NULL on error Send a request to a UDDI server to find a list of related businesses. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:find_service // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__find_USCOREservice @brief Represents a request to locate services that meet the specified requirements. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137715 See also @ref example1. */ /** @fn uddi2__find_USCOREservice::uddi2__find_USCOREservice(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the find_USCOREservice class. */ /** @fn uddi2__find_USCOREservice::uddi2__find_USCOREservice(struct soap *soap, const char *name) @brief @param[in] soap gSOAP context @param[in] name of the service Creates an instance of the find_USCOREservice class using the specified name. */ /** @fn uddi2__find_USCOREservice::uddi2__find_USCOREservice(struct soap *soap, std::vector keyedReferences) @brief @param[in] soap gSOAP context @param[in] keyedReferences collection of category keys Creates an instance of the find_USCOREservice class using the specified category keys. */ /** @fn uddi2__find_USCOREservice::uddi2__find_USCOREservice(struct soap *soap, std::vector tModelKeys) @brief @param[in] soap gSOAP context @param[in] tModelKeys collection of tModel key strings Creates an instance of the find_USCOREservice class using the specified tModel keys. */ /** @fn uddi2__serviceList* uddi2__find_USCOREservice::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__serviceList object or NULL on error Send a request to a UDDI server to find a list of services. See also @ref example1. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:find_tModel // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__find_USCOREtModel @brief Represents a request to locate a list of tModel entries that match a set of specific criteria. The result of a search is a uddi2__tModelList object that contains information about registered tModel data that matches the criteria. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137716 */ /** @fn uddi2__find_USCOREtModel::uddi2__find_USCOREtModel(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the find_USCOREtModel class. */ /** @fn uddi2__find_USCOREtModel::uddi2__find_USCOREtModel(struct soap *soap, const char *name) @brief @param[in] soap gSOAP context @param[in] name of the tModel Creates an instance of the find_USCOREtModel class using the specified tModel name. */ /** @fn uddi2__find_USCOREtModel::uddi2__find_USCOREtModel(struct soap *soap, std::vector keyedReferences) @brief @param[in] soap gSOAP context @param[in] keyedReferences collection of category keys Creates an instance of the find_USCOREtModel class using the specified category keys. */ /** @fn uddi2__tModelList* uddi2__find_USCOREtModel::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__tModelList object or NULL on error Send a request to a UDDI server to find a tModelList. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_bindingDetail // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREbindingDetail @brief Represents a request to get binding details from a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137717 */ /** @fn uddi2__get_USCOREbindingDetail::uddi2__get_USCOREbindingDetail(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREbindingDetail class. */ /** @fn uddi2__get_USCOREbindingDetail::uddi2__get_USCOREbindingDetail(struct soap *soap, const char *bindingKey) @brief @param[in] soap gSOAP context @param[in] bindingKey string Creates an instance of the get_USCOREbindingDetail class using the specified binding key. */ /** @fn uddi2__get_USCOREbindingDetail::uddi2__get_USCOREbindingDetail(struct soap *soap, std::vector bindingKeys) @brief @param[in] soap gSOAP context @param[in] bindingKeys collection of key strings Creates an instance of the get_USCOREbindingDetail class using the specified collection of binding keys. */ /** @fn uddi2__bindingDetail* uddi2__get_USCOREbindingDetail::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__bindingDetail object or NULL on error Send a request to a UDDI server to get the binding details. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_businessDetail // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREbusinessDetail @brief Represents a request to get business details from a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137718 */ /** @fn uddi2__get_USCOREbusinessDetail::uddi2__get_USCOREbusinessDetail(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREbusinessDetail class. */ /** @fn uddi2__get_USCOREbusinessDetail::uddi2__get_USCOREbusinessDetail(struct soap *soap, const char *businessKey) @brief @param[in] soap gSOAP context @param[in] businessKey string Creates an instance of the get_USCOREbusinessDetail class using the specified business key. */ /** @fn uddi2__get_USCOREbusinessDetail::uddi2__get_USCOREbusinessDetail(struct soap *soap, std::vector businessKeys) @brief @param[in] soap gSOAP context @param[in] businessKeys collection of key strings Creates an instance of the get_USCOREbusinessDetail class using the specified collection of business keys. */ /** @fn uddi2__businessDetail* uddi2__get_USCOREbusinessDetail::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__businessDetail object or NULL on error Send a request to a UDDI server to get the business details. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_businessDetailExt // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREbusinessDetailExt @brief Represents a request to get business details from a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137719 */ /** @fn uddi2__get_USCOREbusinessDetailExt::uddi2__get_USCOREbusinessDetailExt(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREbusinessDetailExt class. */ /** @fn uddi2__get_USCOREbusinessDetailExt::uddi2__get_USCOREbusinessDetailExt(struct soap *soap, const char *businessKey) @brief @param[in] soap gSOAP context @param[in] businessKey string Creates an instance of the get_USCOREbusinessDetailExt class using the specified business key. */ /** @fn uddi2__get_USCOREbusinessDetailExt::uddi2__get_USCOREbusinessDetailExt(struct soap *soap, std::vector businessKeys) @brief @param[in] soap gSOAP context @param[in] businessKeys collection of key strings Creates an instance of the get_USCOREbusinessDetailExt class using the specified collection of business keys. */ /** @fn uddi2__businessDetailExt* uddi2__get_USCOREbusinessDetailExt::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__businessDetailExt object or NULL on error Send a request to a UDDI server to get the business details. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_serviceDetail // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREserviceDetail @brief Represents a request to get service details from a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137720 */ /** @fn uddi2__get_USCOREserviceDetail::uddi2__get_USCOREserviceDetail(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREserviceDetail class. */ /** @fn uddi2__get_USCOREserviceDetail::uddi2__get_USCOREserviceDetail(struct soap *soap, const char *serviceKey) @brief @param[in] soap gSOAP context @param[in] serviceKey string Creates an instance of the get_USCOREserviceDetail class using the specified service key. */ /** @fn uddi2__get_USCOREserviceDetail::uddi2__get_USCOREserviceDetail(struct soap *soap, std::vector serviceKeys) @brief @param[in] soap gSOAP context @param[in] serviceKeys collection of key strings Creates an instance of the get_USCOREserviceDetail class using the specified collection of service keys. */ /** @fn uddi2__serviceDetail* uddi2__get_USCOREserviceDetail::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__serviceDetail object or NULL on error Send a request to a UDDI server to get the service details. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_tModelDetail // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREtModelDetail @brief Represents a request to get tModel details from a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137721 */ /** @fn uddi2__get_USCOREtModelDetail::uddi2__get_USCOREtModelDetail(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREtModelDetail class. */ /** @fn uddi2__get_USCOREtModelDetail::uddi2__get_USCOREtModelDetail(struct soap *soap, const char *tModelKey) @brief @param[in] soap gSOAP context @param[in] tModelKey string Creates an instance of the get_USCOREtModelDetail class using the specified tModel key. */ /** @fn uddi2__get_USCOREtModelDetail::uddi2__get_USCOREtModelDetail(struct soap *soap, std::vector tModelKeys) @brief @param[in] soap gSOAP context @param[in] tModelKeys collection of key strings Creates an instance of the get_USCOREtModelDetail class using the specified collection of tModel keys. */ /** @fn uddi2__tModelDetail* uddi2__get_USCOREtModelDetail::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__tModelDetail object or NULL on error Send a request to a UDDI server to get the tModel details. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:add_publisherAssertions // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__add_USCOREpublisherAssertions @brief Represents a request to add one or more publisher assertions to the assertion collection for an individual publisher. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137731 */ /** @fn uddi2__add_USCOREpublisherAssertions::uddi2__add_USCOREpublisherAssertions(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the add_USCOREpublisherAssertions class. */ /** @fn uddi2__add_USCOREpublisherAssertions::uddi2__add_USCOREpublisherAssertions(struct soap *soap, std::vector publisherAssertions) @brief @param[in] soap gSOAP context @param[in] publisherAssertions collection of publisher assertions Creates an instance of the add_USCOREpublisherAssertions class using the specified publisher assertions. */ /** @fn uddi2__dispositionReport *uddi2__add_USCOREpublisherAssertions::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__dispositionReport object or NULL on error Send a request to a UDDI server to add one or more publisher assertions to the assertion collection for an individual publisher. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:delete_binding // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__delete_USCOREbinding @brief Represents a request to delete a binding that meets the specified requirements. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137732 */ /** @fn uddi2__delete_USCOREbinding::uddi2__delete_USCOREbinding(struct soap *soap) @brief Creates an instance of the delete_USCOREbinding class. */ /** @fn uddi2__delete_USCOREbinding::uddi2__delete_USCOREbinding(struct soap *soap, const char *bindingKey) @brief @param[in] soap gSOAP context @param[in] bindingKey a binding key string Creates an instance of the delete_USCOREbinding class. */ /** @fn uddi2__delete_USCOREbinding::uddi2__delete_USCOREbinding(struct soap *soap, std::vector bindingKeys) @brief @param[in] soap gSOAP context @param[in] bindingKeys collection of binding keys Creates an instance of the delete_USCOREbinding class using the specified binding keys. */ /** @fn uddi2__dispositionReport *uddi2__delete_USCOREbinding::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__dispositionReport object or NULL on error Send a request to a UDDI service to delete a binding that meets the specified requirements. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:delete_business // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__delete_USCOREbusiness @brief Represents a request to delete a business that meets the specified requirements. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137733 */ /** @fn uddi2__delete_USCOREbusiness::uddi2__delete_USCOREbusiness(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the delete_USCOREbusiness class. */ /** @fn uddi2__delete_USCOREbusiness::uddi2__delete_USCOREbusiness(struct soap *soap, const char *businessKey) @brief @param[in] soap gSOAP context @param[in] businessKey a business key string Creates an instance of the delete_USCOREbusiness class using the specified business key. */ /** @fn uddi2__delete_USCOREbusiness::uddi2__delete_USCOREbusiness(struct soap *soap, std::vector businessKeys) @brief @param[in] soap gSOAP context @param[in] businessKeys collection of business keys Creates an instance of the delete_USCOREbusiness class using the specified business keys. */ /** @fn uddi2__dispositionReport *uddi2__delete_USCOREbusiness::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__dispositionReport object or NULL on error Send a request to a UDDI service to delete a business that meets the specified requirements. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:delete_service // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__delete_USCOREservice @brief Represents a request to delete a service that meets the specified requirements. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137735 */ /** @fn uddi2__delete_USCOREservice::uddi2__delete_USCOREservice(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the delete_USCOREservice class. */ /** @fn uddi2__delete_USCOREservice::uddi2__delete_USCOREservice(struct soap *soap, const char *serviceKey) @brief @param[in] soap gSOAP context @param[in] serviceKey a service key string Creates an instance of the delete_USCOREservice class using the specified service key. */ /** @fn uddi2__delete_USCOREservice::uddi2__delete_USCOREservice(struct soap *soap, std::vector serviceKeys) @brief @param[in] soap gSOAP context @param[in] serviceKeys collection of service keys Creates an instance of the delete_USCOREservice class using the specified service keys. */ /** @fn uddi2__dispositionReport *uddi2__delete_USCOREservice::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__dispositionReport object or NULL on error Send a request to a UDDI service to delete a service that meets the specified requirements. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:delete_tModel // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__delete_USCOREtModel @brief Represents a request to delete a tModel that meets the specified requirements. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137736 */ /** @fn uddi2__delete_USCOREtModel::uddi2__delete_USCOREtModel(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the delete_USCOREtModel class. */ /** @fn uddi2__delete_USCOREtModel::uddi2__delete_USCOREtModel(struct soap *soap, const char *tModelKey) @brief @param[in] soap gSOAP context @param[in] tModelKey a tModel key string Creates an instance of the delete_USCOREtModel class using the specified tModel key. */ /** @fn uddi2__delete_USCOREtModel::uddi2__delete_USCOREtModel(struct soap *soap, std::vector tModelKeys) @brief @param[in] soap gSOAP context @param[in] tModelKeys collection of tModel keys Creates an instance of the delete_USCOREtModel class using the specified tModel keys. */ /** @fn uddi2__dispositionReport *uddi2__delete_USCOREtModel::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__dispositionReport object or NULL on error Send a request to a UDDI service to delete a tModel that meets the specified requirements. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:delete_publisherAssertions // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__delete_USCOREpublisherAssertions @brief Represents a request to delete publisher assertions meeting the specified requirements. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137734 */ /** @fn uddi2__delete_USCOREpublisherAssertions::uddi2__delete_USCOREpublisherAssertions(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the delete_USCOREpublisherAssertions class. */ /** @fn uddi2__delete_USCOREpublisherAssertions::uddi2__delete_USCOREpublisherAssertions(struct soap *soap, std::vector publisherAssertions) @brief @param[in] soap gSOAP context @param[in] publisherAssertions a collection of publisher assertions Creates an instance of the delete_USCOREpublisherAssertions class using the specified collection of publisher assertions. */ /** @fn uddi2__dispositionReport *uddi2__delete_USCOREpublisherAssertions::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__dispositionReport object or NULL on error Send a request to a UDDI service to delete publisher assertions meeting the specified requirements. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:discard_authToken // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__discard_USCOREauthToken @brief Represents a request to discard an authorization token obtained with the get_USCOREauthToken class. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137737 */ /** @fn uddi2__discard_USCOREauthToken::uddi2__discard_USCOREauthToken(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the delete_USCOREauthToken class. */ /** @fn uddi2__discard_USCOREauthToken::uddi2__discard_USCOREauthToken(struct soap *soap, const char *authInfo) @brief @param[in] soap gSOAP context @param[in] authInfo authorization token provided by the UDDI server Creates an instance of the delete_USCOREauthToken class using the specified authentication token string. */ /** @fn uddi2__dispositionReport *uddi2__discard_USCOREauthToken::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__dispositionReport object or NULL on error Send a request to a UDDI service to discard an authentication token. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_assertionStatusReport // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREassertionStatusReport @brief Provides the ability to determine the status of current and outstanding publisher assertions. The results can be restricted by setting the completionStatus property. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137738 */ /** @fn uddi2__get_USCOREassertionStatusReport::uddi2__get_USCOREassertionStatusReport(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREassertionStatusReport class. */ /** @fn uddi2__get_USCOREassertionStatusReport::uddi2__get_USCOREassertionStatusReport(struct soap *soap, const char *completionStatus) @brief @param[in] soap gSOAP context @param[in] completionStatus completion status string Creates an instance of the get_USCOREassertionStatusReport class using the specified completion status. */ /** @fn uddi2__assertionStatusReport *uddi2__get_USCOREassertionStatusReport::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__assertionStatusReport object or NULL on error Send a request to a UDDI service to get the status of current and outstanding publisher assertions. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_authToken // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREauthToken @brief Represents a request to obtain an authorization token, which is represented by the uddi2__authToken class. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137739 */ /** @fn uddi2__get_USCOREauthToken::uddi2__get_USCOREauthToken(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREauthToken class. */ /** @fn uddi2__get_USCOREauthToken::uddi2__get_USCOREauthToken(struct soap *soap, const char *userid, const char *passwd) @brief @param[in] soap gSOAP context @param[in] userid the user ID string @param[in] passwd the password string Creates an instance of the get_USCOREauthToken class using the specified user ID and password. */ /** @fn uddi2__authToken *uddi2__get_USCOREauthToken::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__authToken object or NULL on error Send a request to a UDDI service to get a authorization token given a user ID and password. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_publisherAssertions // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREpublisherAssertions @brief Represents a request to obtain the full set of publisher assertions that are associated with an individual publisher. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137740 */ /** @fn uddi2__get_USCOREpublisherAssertions::uddi2__get_USCOREpublisherAssertions(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREpublisherAssetions class. */ /** @fn uddi2__publisherAssertions *uddi2__get_USCOREpublisherAssertions::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__publisherAssertions object or NULL on error Send a request to a UDDI service to get publisher assertions. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_registeredInfo // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREregisteredInfo @brief Represents a request to get all registered business entities and tModels controlled by an individual. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137741 */ /** @fn uddi2__get_USCOREregisteredInfo::uddi2__get_USCOREregisteredInfo(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREregisteredInfo class. */ /** @fn uddi2__registeredInfo *uddi2__get_USCOREregisteredInfo::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__registeredInfo object or NULL on error Send a request to a UDDI service to get all registered business entities and tModels controlled by an individual. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:save_binding // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__save_USCOREbinding @brief Represents a request to post binding information on a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137742 */ /** @fn uddi2__save_USCOREbinding::uddi2__save_USCOREbinding(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the save_USCOREbinding class. */ /** @fn uddi2__save_USCOREbinding::uddi2__save_USCOREbinding(struct soap *soap, uddi2__bindingTemplate &bindingTemplate) @brief @param[in] soap gSOAP context @param[in] bindingTemplate binding template Creates an instance of the save_USCOREbinding class using the specified binding template. */ /** @fn uddi2__save_USCOREbinding::uddi2__save_USCOREbinding(struct soap *soap, std::vector bindingTemplates) @brief @param[in] soap gSOAP context @param[in] bindingTemplates collection of binding templates Creates an instance of the save_USCOREbinding class using the specified binding templates. */ /** @fn uddi2__bindingDetail *uddi2__save_USCOREbinding::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__bindingDetail object or NULL on error Send a request to a UDDI server to post binding information on the server. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:save_business // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__save_USCOREbusiness @brief Represents a request to post business information on a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137743 */ /** @fn uddi2__save_USCOREbusiness::uddi2__save_USCOREbusiness(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the save_USCOREbusiness class. */ /** @fn uddi2__save_USCOREbusiness::uddi2__save_USCOREbusiness(struct soap *soap, uddi2__businessEntity &businessEntity) @brief @param[in] soap gSOAP context @param[in] businessEntity business entity Creates an instance of the save_USCOREbusiness class using the specified business entity. */ /** @fn uddi2__save_USCOREbusiness::uddi2__save_USCOREbusiness(struct soap *soap, std::vector businessEntities) @brief @param[in] soap gSOAP context @param[in] businessEntities collection of business entities Creates an instance of the save_USCOREbusiness class using the specified business entities. */ /** @fn uddi2__businessDetail *uddi2__save_USCOREbusiness::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__businessDetail object or NULL on error Send a request to a UDDI server to post business information on the server. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:save_service // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__save_USCOREservice @brief Represents a request to post service information on a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137744 */ /** @fn uddi2__save_USCOREservice::uddi2__save_USCOREservice(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the save_USCOREservice class. */ /** @fn uddi2__save_USCOREservice::uddi2__save_USCOREservice(struct soap *soap, uddi2__businessService &businessService) @brief @param[in] soap gSOAP context @param[in] businessService business service Creates an instance of the save_USCOREservice class using the specified service. */ /** @fn uddi2__save_USCOREservice::uddi2__save_USCOREservice(struct soap *soap, std::vector businessServices) @brief @param[in] soap gSOAP context @param[in] businessServices collection of business services Creates an instance of the save_USCOREservice class using the specified services. */ /** @fn uddi2__serviceDetail *uddi2__save_USCOREservice::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__serviceDetail object or NULL on error Send a request to a UDDI server to post service information on the server. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:save_tModel // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__save_USCOREtModel @brief Represents a request to post tModel information on a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137745 */ /** @fn uddi2__save_USCOREtModel::uddi2__save_USCOREtModel(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the save_USCOREtModel class. */ /** @fn uddi2__save_USCOREtModel::uddi2__save_USCOREtModel(struct soap *soap, uddi2__tModel &tModel) @brief @param[in] soap gSOAP context @param[in] tModel a tModel Creates an instance of the save_USCOREtModel class using the specified tModel. */ /** @fn uddi2__save_USCOREtModel::uddi2__save_USCOREtModel(struct soap *soap, std::vector tModels) @brief @param[in] soap gSOAP context @param[in] tModels collection of tModels Creates an instance of the save_USCOREtModel class using the specified tModels. */ /** @fn uddi2__tModelDetail *uddi2__save_USCOREtModel::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__tModelDetail object or NULL on error Send a request to a UDDI server to post tModel information on the server. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:set_publisherAssertions // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__set_USCOREpublisherAssertions @brief Represents a request to modify the existing publisher assertions for an individual publisher. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137746 */ /** @fn uddi2__set_USCOREpublisherAssertions::uddi2__set_USCOREpublisherAssertions(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the set_USCOREpublisherAssertions class. */ /** @fn uddi2__set_USCOREpublisherAssertions::uddi2__set_USCOREpublisherAssertions(struct soap *soap, std::vector publisherAssertions) @brief @param[in] soap gSOAP context @param[in] publisherAssertions collection of publisher assertions Creates an instance of the set_USCOREpublisherAssertions class using the specified collection of publisher assertions. */ /** @fn uddi2__publisherAssertions *uddi2__set_USCOREpublisherAssertions::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__publisherAssertions object or NULL on error Send a request to a UDDI server to post tModel information on the server. */ //////////////////////////////////////////////////////////////////////////////// // // Code Examples // //////////////////////////////////////////////////////////////////////////////// /** @page example1 Code Example 1: Finding a service This example shows you how to find Web services. In this case, the example finds Web services with names that begin with the word "magic". @code #include "inqH.h" int main(int argc, char **argv) { char *search_string = "magic"; if (argc > 1) search_string = argv[1]; // Create a gSOAP context struct soap *soap = soap_new(); // Create an object to find a business uddi2__find_USCOREservice fs(soap, search_string); // Send the request uddi2__serviceList *sl = fs.send("http://uddi.xmethods.net/inquire"); // Check if result is OK if (!sl) soap_print_fault(soap, stderr); // If OK, report the service name(s) and unique identification keys else if (sl->serviceInfos) { std::cout << "Search results on " << search_string << ":" << std::endl << std::endl; for (std::vector::const_iterator si = sl->serviceInfos->serviceInfo.begin(); si != sl->serviceInfos->serviceInfo.end(); ++si) { // Report serviceKey and businessKey std::cout << "serviceKey=" << (*si)->serviceKey << std::endl << "businessKey=" << (*si)->businessKey << std::endl; // Report names for (std::vector::const_iterator n = (*si)->name.begin(); n != (*si)->name.end(); ++n) std::cout << "name=" << (*n)->__item << std::endl; std::cout << std::endl; } } // Remove deserialized objects soap_destroy(soap); // Remove temporary data soap_end(soap); // Detach and free context soap_done(soap); free(soap); return 0; } @endcode To compile: - wsdl2h -tuddi2-typemap.dat inquire_v2.wsdl - soapcpp2 -I.. -pinq inquire_v2.h - g++ -DWITH_NONAMESPACES -I.. -o example1 example1.cpp inquire_v2.cpp inqC.cpp inqClient.cpp ../stdsoap2.cpp */ /** @page example2 Code Example 2: Finding a business This example shows you how to find a business from a UDDI server. @code #include "inqH.h" int main(int argc, char **argv) { char *search_string = "xmethods"; if (argc > 1) search_string = argv[1]; // Create a gSOAP context struct soap *soap = soap_new(); // Create an object to find a business uddi2__find_USCOREbusiness fb(soap, search_string); // Send the request uddi2__businessList *bl = fb.send("http://uddi.xmethods.net/inquire"); // Check if result is OK if (!bl) soap_print_fault(soap, stderr); // If OK, report the business name(s) and unique identification keys else if (bl->businessInfos) { std::cout << "Search results on " << search_string << ":" << std::endl << std::endl; for (std::vector::const_iterator bi = bl->businessInfos->businessInfo.begin(); bi != bl->businessInfos->businessInfo.end(); ++bi) { // Report businessKey std::cout << "businessKey=" << (*bi)->businessKey << std::endl; // Report names for (std::vector::const_iterator n = (*bi)->name.begin(); n != (*bi)->name.end(); ++n) std::cout << "name=" << (*n)->__item << std::endl; std::cout << std::endl; } } // Remove deserialized objects soap_destroy(soap); // Remove temporary data soap_end(soap); // Detach and free context soap_done(soap); free(soap); return 0; } @endcode To compile: - wsdl2h -tuddi2-typemap.dat inquire_v2.wsdl - soapcpp2 -I.. -pinq inquire_v2.h - g++ -DWITH_NONAMESPACES -I.. -o example2 example2.cpp inquire_v2.cpp inqC.cpp inqClient.cpp ../stdsoap2.cpp */ /** @page example3 Code Example 3: Publishing a WSDL and service on XMethods This example shows you how to publish a Web service. In this case, the example template code obtains an authorization token, saves the tModel with the WSDL URL in the server, and saves the business service information in the server. @code #include "pubH.h" const char *server = "https://uddi.xmethods.net/publish"; const char *userid = "..."; // user ID to access UDDI server const char *passwd = "..."; // password to access UDDI server int main(int argc, char **argv) { // Create a gSOAP context struct soap *soap = soap_new(); // Setup SSL context (optional) to verify server's credentials if (soap_ssl_client_context(soap, SOAP_SSL_DEFAULT, NULL, NULL, "cacerts.pem", NULL, NULL)) { soap_print_fault(soap, stderr); exit(1); } // Step 1: Get an authorization token from the UDDI server uddi2__get_USCOREauthToken get_authToken(soap, userid, passwd); uddi2__authToken *authToken = get_authToken.send(server); // Check if authorized if (!authToken) { soap_print_fault(soap, stderr); exit(1); } // Authorization info provided by server for this session char *authInfo = authToken->authInfo; // Step 2: Create a tModel for the WSDL to be published uddi2__tModel tModel; tModel.soap_default(soap); // Create the tModel and service name tModel.name = soap_new_uddi2__name(soap, -1); tModel.name->__item = "..."; tModel.name->xml__lang_ = "en"; // Create XMethods description elements (see http://www.xmethods.net/ve2/UDDI.po) uddi2__description *description = soap_new_uddi2__description(soap, 6); description[0].__item = "SHORT DESCRIPTION: ..."; description[0].xml__lang_ = "en"; description[1].__item = "SHORT DESCRIPTION: ..."; description[1].xml__lang_ = "en"; description[2].__item = "USAGE NOTES: ..."; description[2].xml__lang_ = "en"; description[3].__item = "HOMEPAGE URL: ..."; description[3].xml__lang_ = "en"; description[4].__item = "CONTACT EMAIL: ..."; description[4].xml__lang_ = "en"; description[5].__item = "IMPLEMENTATION: ..."; description[5].xml__lang_ = "en"; // Add the four description elements to the tModel tModel.description.push_back(description + 0); tModel.description.push_back(description + 1); tModel.description.push_back(description + 2); tModel.description.push_back(description + 4); // Add an overviewDoc element with description and overviewURL tModel.overviewDoc = soap_new_uddi2__overviewDoc(soap, -1); tModel.overviewDoc->soap_default(soap); tModel.overviewDoc->description.push_back(soap_new_uddi2__description(soap, -1)); tModel.overviewDoc->description[0]->__item = "WSDL source document"; tModel.overviewDoc->description[0]->xml__lang_ = "en"; tModel.overviewDoc->overviewURL = "http://.../my.wsdl#bindingName"; // Omit identifier bag tModel.identifierBag = NULL; // Add a category with a WSDL-specific keyedReference tModel.categoryBag = soap_new_uddi2__categoryBag(soap, -1); tModel.categoryBag->soap_default(soap); tModel.categoryBag->keyedReference.push_back(soap_new_uddi2__keyedReference(soap, -1)); tModel.categoryBag->keyedReference[0]->tModelKey = "..."; tModel.categoryBag->keyedReference[0]->keyName = "uddi-org:types"; tModel.categoryBag->keyedReference[0]->keyValue = "wsdlSpec"; tModel.authorizedName = "..."; tModel.operator_ = "..."; tModel.tModelKey = "..."; // Save the tModel uddi2__save_USCOREtModel save_tModel(soap, tModel); uddi2__tModelDetail *tModelDetail = save_tModel.send(server, authInfo); // Step 3: Create a new service to be published uddi2__businessService service; service.soap_default(soap); // Service name is the tModel name (XMethods) service.name.push_back(tModel.name); // Add two description elements to the service service.description.push_back(description + 4); service.description.push_back(description + 5); // Create binding template uddi2__bindingTemplate bindingTemplate; bindingTemplate.soap_default(soap); bindingTemplate.tModelInstanceDetails = soap_new_uddi2__tModelInstanceDetails(soap, -1); bindingTemplate.tModelInstanceDetails->tModelInstanceInfo.push_back(soap_new_uddi2__tModelInstanceInfo(soap, -1)); bindingTemplate.tModelInstanceDetails->tModelInstanceInfo[0]->instanceDetails = NULL; bindingTemplate.tModelInstanceDetails->tModelInstanceInfo[0]->tModelKey = tModel.tModelKey; bindingTemplate.accessPoint = soap_new_uddi2__accessPoint(soap, -1); bindingTemplate.accessPoint->__item = "..."; bindingTemplate.accessPoint->URLType = uddi2__URLType__http; bindingTemplate.hostingRedirector = NULL; bindingTemplate.serviceKey = "..."; bindingTemplate.bindingKey = "..."; // Add binding Template to service service.bindingTemplates = soap_new_uddi2__bindingTemplates(soap, -1); service.bindingTemplates->soap_default(soap); service.bindingTemplates->bindingTemplate.push_back(&bindingTemplate); service.categoryBag = NULL; service.serviceKey = "..."; service.businessKey = "..."; // Save the service uddi2__save_USCOREservice save_service(soap, service); uddi2__serviceDetail *serviceDetail = save_service.send(server, authInfo); // Step 4: Discard authorization token uddi2__discard_USCOREauthToken discard_authToken(soap, authInfo); uddi2__dispositionReport *dispositionReport = discard_authToken.send(server); // Remove deserialized objects soap_destroy(soap); // Remove temporary data soap_end(soap); // Detach and free context soap_done(soap); free(soap); return 0; } @endcode To compile: - wsdl2h -tuddi2-typemap.dat publish_v2.wsdl - soapcpp2 -I.. -ppub publish_v2.h - g++ -DWITH_OPENSSL -DWITH_NONAMESPACES -I.. -o example3 example3.cpp publish_v2.cpp pubC.cpp pubClient.cpp ../stdsoap2.cpp */ /* uddi_v2.h Generated by wsdl2h 1.2.0 from inquire_v2.wsdl publish_v2.wsdl and uddi2-typemap.dat 2005-04-24 00:29:41 GMT Copyright (C) 2001-2005 Robert van Engelen, Genivia Inc. All Rights Reserved. This part of the software is released under one of the following licenses: GPL or Genivia's license for commercial use. */ /* NOTE: - Compile this file with soapcpp2 to complete the code generation process. - Use wsdl2h option -l to view the software license terms. - Use wsdl2h options -c and -s to generate pure C code or C++ code without STL. - To build with STL, stlvector.h from the gSOAP distribution must be in the current directory. Or use soapcpp2 option -I with path to stlvector.h. - Use typemap.dat to control schema namespace bindings and type mappings. It is strongly recommended to customize the names of the namespace prefixes generated by wsdl2h. To do so, modify the prefix bindings in the Namespaces section below and add the modified lines to typemap.dat to rerun wsdl2h. - Use Doxygen (www.doxygen.org) to browse this file. */ /******************************************************************************\ * * * * * * \******************************************************************************/ //gsoapopt w #import "stlvector.h" /******************************************************************************\ * * * Schema Namespaces * * * \******************************************************************************/ /* NOTE: It is strongly recommended to customize the names of the namespace prefixes generated by wsdl2h. To do so, modify the prefix bindings below and add the modified lines to typemap.dat to rerun wsdl2h: inq2 = urn:uddi-org:inquiry_v2 uddi2 = urn:uddi-org:api_v2 pub2 = urn:uddi-org:publication_v2 */ //gsoap inq2 schema namespace: urn:uddi-org:inquiry_v2 //gsoap uddi2 schema namespace: urn:uddi-org:api_v2 //gsoap pub2 schema namespace: urn:uddi-org:publication_v2 //gsoap inq2 schema form: unqualified //gsoap uddi2 schema elementForm: qualified //gsoap uddi2 schema attributeForm: unqualified //gsoap pub2 schema form: unqualified /******************************************************************************\ * * * Schema Types * * * \******************************************************************************/ /// Primitive built-in type "xs:NMTOKEN" typedef char* xsd__NMTOKEN; /// Built-in attribute "xml:lang" typedef char* xml__lang; class uddi2__accessPoint; class uddi2__address; class uddi2__addressLine; class uddi2__assertionStatusItem; class uddi2__bindingTemplate; class uddi2__bindingTemplates; class uddi2__businessEntity; class uddi2__businessEntityExt; class uddi2__businessInfo; class uddi2__businessInfos; class uddi2__businessService; class uddi2__businessServices; class uddi2__categoryBag; class uddi2__contact; class uddi2__contacts; class uddi2__description; class uddi2__discoveryURL; class uddi2__discoveryURLs; class uddi2__dispositionReport; class uddi2__email; class uddi2__errInfo; class uddi2__findQualifiers; class uddi2__hostingRedirector; class uddi2__identifierBag; class uddi2__instanceDetails; class uddi2__keyedReference; class uddi2__keysOwned; class uddi2__name; class uddi2__overviewDoc; class uddi2__phone; class uddi2__publisherAssertion; class uddi2__relatedBusinessInfo; class uddi2__relatedBusinessInfos; class uddi2__result; class uddi2__serviceInfo; class uddi2__serviceInfos; class uddi2__sharedRelationships; class uddi2__tModel; class uddi2__tModelBag; class uddi2__tModelInfo; class uddi2__tModelInfos; class uddi2__tModelInstanceDetails; class uddi2__tModelInstanceInfo; class uddi2__add_USCOREpublisherAssertions; class uddi2__delete_USCOREbinding; class uddi2__delete_USCOREbusiness; class uddi2__delete_USCOREpublisherAssertions; class uddi2__delete_USCOREservice; class uddi2__delete_USCOREtModel; class uddi2__discard_USCOREauthToken; class uddi2__find_USCOREbinding; class uddi2__find_USCOREbusiness; class uddi2__find_USCORErelatedBusinesses; class uddi2__find_USCOREservice; class uddi2__find_USCOREtModel; class uddi2__get_USCOREassertionStatusReport; class uddi2__get_USCOREauthToken; class uddi2__get_USCOREbindingDetail; class uddi2__get_USCOREbusinessDetail; class uddi2__get_USCOREbusinessDetailExt; class uddi2__get_USCOREpublisherAssertions; class uddi2__get_USCOREregisteredInfo; class uddi2__get_USCOREserviceDetail; class uddi2__get_USCOREtModelDetail; class uddi2__save_USCOREbinding; class uddi2__save_USCOREbusiness; class uddi2__save_USCOREservice; class uddi2__save_USCOREtModel; class uddi2__set_USCOREpublisherAssertions; class uddi2__validate_USCOREvalues; class uddi2__assertionStatusReport; class uddi2__authToken; class uddi2__bindingDetail; class uddi2__businessDetail; class uddi2__businessDetailExt; class uddi2__businessList; class uddi2__publisherAssertions; class uddi2__registeredInfo; class uddi2__relatedBusinessesList; class uddi2__serviceDetail; class uddi2__serviceList; class uddi2__tModelDetail; class uddi2__tModelList; /// Schema "urn:uddi-org:api_v2":bindingKey simpleType restriction of xs:string typedef char* uddi2__bindingKey; /// Schema "urn:uddi-org:api_v2":businessKey simpleType restriction of xs:string typedef char* uddi2__businessKey; /// Schema "urn:uddi-org:api_v2":serviceKey simpleType restriction of xs:string typedef char* uddi2__serviceKey; /// Schema "urn:uddi-org:api_v2":tModelKey simpleType restriction of xs:string typedef char* uddi2__tModelKey; /// Schema "urn:uddi-org:api_v2":direction simpleType restriction of xs:NMTOKEN /// Note: enum values are prefixed with 'uddi2__direction' to avoid name clashes, please use wsdl2h option -e to omit this prefix enum uddi2__direction { uddi2__direction__fromKey, ///< xs:NMTOKEN value="fromKey" uddi2__direction__toKey, ///< xs:NMTOKEN value="toKey" }; /// Schema "urn:uddi-org:api_v2":truncated simpleType restriction of xs:NMTOKEN /// Note: enum values are prefixed with 'uddi2__truncated' to avoid name clashes, please use wsdl2h option -e to omit this prefix enum uddi2__truncated { uddi2__truncated__true_, ///< xs:NMTOKEN value="true" uddi2__truncated__false_, ///< xs:NMTOKEN value="false" }; /// Schema "urn:uddi-org:api_v2":URLType simpleType restriction of xs:NMTOKEN /// Note: enum values are prefixed with 'uddi2__URLType' to avoid name clashes, please use wsdl2h option -e to omit this prefix enum uddi2__URLType { uddi2__URLType__mailto, ///< xs:NMTOKEN value="mailto" uddi2__URLType__http, ///< xs:NMTOKEN value="http" uddi2__URLType__https, ///< xs:NMTOKEN value="https" uddi2__URLType__ftp, ///< xs:NMTOKEN value="ftp" uddi2__URLType__fax, ///< xs:NMTOKEN value="fax" uddi2__URLType__phone, ///< xs:NMTOKEN value="phone" uddi2__URLType__other, ///< xs:NMTOKEN value="other" }; /// Schema "urn:uddi-org:api_v2":keyType simpleType restriction of xs:NMTOKEN /// Note: enum values are prefixed with 'uddi2__keyType' to avoid name clashes, please use wsdl2h option -e to omit this prefix enum uddi2__keyType { uddi2__keyType__businessKey, ///< xs:NMTOKEN value="businessKey" uddi2__keyType__tModelKey, ///< xs:NMTOKEN value="tModelKey" uddi2__keyType__serviceKey, ///< xs:NMTOKEN value="serviceKey" uddi2__keyType__bindingKey, ///< xs:NMTOKEN value="bindingKey" }; /// Schema urn:uddi-org:api_v2:"address" class uddi2__address { public: /// Vector of uddi2__addressLine* with length 0..unbounded std::vector addressLine 0; /// Attribute useType of type xs:string @char* useType 0; ///< Optional attribute /// Attribute sortCode of type xs:string @char* sortCode 0; ///< Optional attribute /// Attribute tModelKey of type "urn:uddi-org:api_v2":tModelKey @uddi2__tModelKey tModelKey 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"assertionStatusItem" class uddi2__assertionStatusItem { public: /// Element reference "urn:uddi-org:api_v2":fromKey uddi2__businessKey fromKey 1; ///< Required element /// Element reference "urn:uddi-org:api_v2":toKey uddi2__businessKey toKey 1; ///< Required element /// Element reference "urn:uddi-org:api_v2":keyedReference uddi2__keyedReference* keyedReference 1; ///< Required element /// Element reference "urn:uddi-org:api_v2":keysOwned uddi2__keysOwned* keysOwned 1; ///< Required element /// Attribute completionStatus of type xs:string @char* completionStatus 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"bindingTemplate" class uddi2__bindingTemplate { public: /// Vector of uddi2__description* with length 0..unbounded std::vector description 0; /// Element reference "urn:uddi-org:api_v2":tModelInstanceDetails uddi2__tModelInstanceDetails* tModelInstanceDetails 1; ///< Required element // CHOICE OF ELEMENTS: /// Element reference "urn:uddi-org:api_v2":accessPoint uddi2__accessPoint* accessPoint 1; ///< Required element /// Element reference "urn:uddi-org:api_v2":hostingRedirector uddi2__hostingRedirector* hostingRedirector 1; ///< Required element // END CHOICE /// Attribute serviceKey of type "urn:uddi-org:api_v2":serviceKey @uddi2__serviceKey serviceKey 0; ///< Optional attribute /// Attribute bindingKey of type "urn:uddi-org:api_v2":bindingKey @uddi2__bindingKey bindingKey 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"bindingTemplates" class uddi2__bindingTemplates { public: /// Vector of uddi2__bindingTemplate* with length 0..unbounded std::vector bindingTemplate 0; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"businessEntity" class uddi2__businessEntity { public: /// Element reference "urn:uddi-org:api_v2":discoveryURLs uddi2__discoveryURLs* discoveryURLs 0; ///< Optional element /// Vector of uddi2__name* with length 0..unbounded std::vector name 1; /// Vector of uddi2__description* with length 0..unbounded std::vector description 0; /// Element reference "urn:uddi-org:api_v2":contacts uddi2__contacts* contacts 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":businessServices uddi2__businessServices* businessServices 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":identifierBag uddi2__identifierBag* identifierBag 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":categoryBag uddi2__categoryBag* categoryBag 0; ///< Optional element /// Attribute businessKey of type "urn:uddi-org:api_v2":businessKey @uddi2__businessKey businessKey 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 0; ///< Optional attribute /// Attribute authorizedName of type xs:string @char* authorizedName 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"businessEntityExt" class uddi2__businessEntityExt { public: /// Element reference "urn:uddi-org:api_v2":businessEntity uddi2__businessEntity* businessEntity 1; ///< Required element // TODO: // Schema extensibility is user-definable // Consult the protocol documentation to insert declarations here: _XML __any ; ///< Catch any element content in XML string /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"businessInfo" class uddi2__businessInfo { public: /// Vector of uddi2__name* with length 0..unbounded std::vector name 1; /// Vector of uddi2__description* with length 0..unbounded std::vector description 0; /// Element reference "urn:uddi-org:api_v2":serviceInfos uddi2__serviceInfos* serviceInfos 1; ///< Required element /// Attribute businessKey of type "urn:uddi-org:api_v2":businessKey @uddi2__businessKey businessKey 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"businessInfos" class uddi2__businessInfos { public: /// Vector of uddi2__businessInfo* with length 0..unbounded std::vector businessInfo 0; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"businessService" class uddi2__businessService { public: /// Vector of uddi2__name* with length 0..unbounded std::vector name 0; /// Vector of uddi2__description* with length 0..unbounded std::vector description 0; /// Element reference "urn:uddi-org:api_v2":bindingTemplates uddi2__bindingTemplates* bindingTemplates 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":categoryBag uddi2__categoryBag* categoryBag 0; ///< Optional element /// Attribute serviceKey of type "urn:uddi-org:api_v2":serviceKey @uddi2__serviceKey serviceKey 1; ///< Required attribute /// Attribute businessKey of type "urn:uddi-org:api_v2":businessKey @uddi2__businessKey businessKey 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"businessServices" class uddi2__businessServices { public: /// Vector of uddi2__businessService* with length 0..unbounded std::vector businessService 0; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"categoryBag" class uddi2__categoryBag { public: /// Vector of uddi2__keyedReference* with length 0..unbounded std::vector keyedReference 1; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"contact" class uddi2__contact { public: /// Vector of uddi2__description* with length 0..unbounded std::vector description 0; /// Element reference "urn:uddi-org:api_v2":personName char* personName 1; ///< Required element /// Vector of uddi2__phone* with length 0..unbounded std::vector phone 0; /// Vector of uddi2__email* with length 0..unbounded std::vector email 0; /// Vector of uddi2__address* with length 0..unbounded std::vector address 0; /// Attribute useType of type xs:string @char* useType 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"contacts" class uddi2__contacts { public: /// Vector of uddi2__contact* with length 0..unbounded std::vector contact 1; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"discoveryURLs" class uddi2__discoveryURLs { public: /// Vector of uddi2__discoveryURL* with length 0..unbounded std::vector discoveryURL 1; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"dispositionReport" class uddi2__dispositionReport { public: /// Vector of uddi2__result* with length 0..unbounded std::vector result 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute truncated of type "urn:uddi-org:api_v2":truncated @enum uddi2__truncated* truncated 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"findQualifiers" class uddi2__findQualifiers { public: /// Vector of char* with length 0..unbounded std::vector findQualifier 0; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"hostingRedirector" class uddi2__hostingRedirector { public: /// Attribute bindingKey of type "urn:uddi-org:api_v2":bindingKey @uddi2__bindingKey bindingKey 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"identifierBag" class uddi2__identifierBag { public: /// Vector of uddi2__keyedReference* with length 0..unbounded std::vector keyedReference 1; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"instanceDetails" class uddi2__instanceDetails { public: /// Vector of uddi2__description* with length 0..unbounded std::vector description 0; /// Element reference "urn:uddi-org:api_v2":overviewDoc uddi2__overviewDoc* overviewDoc 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":instanceParms char* instanceParms 0; ///< Optional element /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"keyedReference" class uddi2__keyedReference { public: /// Attribute tModelKey of type "urn:uddi-org:api_v2":tModelKey @uddi2__tModelKey tModelKey 0; ///< Optional attribute /// Attribute keyName of type xs:string @char* keyName 0; ///< Optional attribute /// Attribute keyValue of type xs:string @char* keyValue 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"keysOwned" class uddi2__keysOwned { public: /// Element reference "urn:uddi-org:api_v2":fromKey uddi2__businessKey fromKey 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":toKey uddi2__businessKey toKey 0; ///< Optional element /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"overviewDoc" class uddi2__overviewDoc { public: /// Vector of uddi2__description* with length 0..unbounded std::vector description 0; /// Element reference "urn:uddi-org:api_v2":overviewURL char* overviewURL 0; ///< Optional element /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"publisherAssertion" class uddi2__publisherAssertion { public: /// Element reference "urn:uddi-org:api_v2":fromKey uddi2__businessKey fromKey 1; ///< Required element /// Element reference "urn:uddi-org:api_v2":toKey uddi2__businessKey toKey 1; ///< Required element /// Element reference "urn:uddi-org:api_v2":keyedReference uddi2__keyedReference* keyedReference 1; ///< Required element /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"relatedBusinessInfo" class uddi2__relatedBusinessInfo { public: /// Element reference "urn:uddi-org:api_v2":businessKey uddi2__businessKey businessKey 1; ///< Required element /// Vector of uddi2__name* with length 0..unbounded std::vector name 1; /// Vector of uddi2__description* with length 0..unbounded std::vector description 0; /// Vector of uddi2__sharedRelationships* with length 0..2 std::vector sharedRelationships 1:2; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"relatedBusinessInfos" class uddi2__relatedBusinessInfos { public: /// Vector of uddi2__relatedBusinessInfo* with length 0..unbounded std::vector relatedBusinessInfo 0; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"result" class uddi2__result { public: /// Element reference "urn:uddi-org:api_v2":errInfo uddi2__errInfo* errInfo 0; ///< Optional element /// Attribute keyType of type "urn:uddi-org:api_v2":keyType @enum uddi2__keyType* keyType 0; ///< Optional attribute /// Attribute errno of type xs:int @int errno_ 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"serviceInfo" class uddi2__serviceInfo { public: /// Vector of uddi2__name* with length 0..unbounded std::vector name 0; /// Attribute serviceKey of type "urn:uddi-org:api_v2":serviceKey @uddi2__serviceKey serviceKey 1; ///< Required attribute /// Attribute businessKey of type "urn:uddi-org:api_v2":businessKey @uddi2__businessKey businessKey 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"serviceInfos" class uddi2__serviceInfos { public: /// Vector of uddi2__serviceInfo* with length 0..unbounded std::vector serviceInfo 0; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"sharedRelationships" class uddi2__sharedRelationships { public: /// Vector of uddi2__keyedReference* with length 0..unbounded std::vector keyedReference 1; /// Attribute direction of type "urn:uddi-org:api_v2":direction @enum uddi2__direction direction 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"tModel" class uddi2__tModel { public: /// Element reference "urn:uddi-org:api_v2":name uddi2__name* name 1; ///< Required element /// Vector of uddi2__description* with length 0..unbounded std::vector description 0; /// Element reference "urn:uddi-org:api_v2":overviewDoc uddi2__overviewDoc* overviewDoc 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":identifierBag uddi2__identifierBag* identifierBag 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":categoryBag uddi2__categoryBag* categoryBag 0; ///< Optional element /// Attribute tModelKey of type "urn:uddi-org:api_v2":tModelKey @uddi2__tModelKey tModelKey 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 0; ///< Optional attribute /// Attribute authorizedName of type xs:string @char* authorizedName 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"tModelBag" class uddi2__tModelBag { public: /// Vector of uddi2__tModelKey with length 0..unbounded std::vector tModelKey 1; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"tModelInfo" class uddi2__tModelInfo { public: /// Element reference "urn:uddi-org:api_v2":name uddi2__name* name 1; ///< Required element /// Attribute tModelKey of type "urn:uddi-org:api_v2":tModelKey @uddi2__tModelKey tModelKey 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"tModelInfos" class uddi2__tModelInfos { public: /// Vector of uddi2__tModelInfo* with length 0..unbounded std::vector tModelInfo 0; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"tModelInstanceDetails" class uddi2__tModelInstanceDetails { public: /// Vector of uddi2__tModelInstanceInfo* with length 0..unbounded std::vector tModelInstanceInfo 0; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"tModelInstanceInfo" class uddi2__tModelInstanceInfo { public: /// Vector of uddi2__description* with length 0..unbounded std::vector description 0; /// Element reference "urn:uddi-org:api_v2":instanceDetails uddi2__instanceDetails* instanceDetails 0; ///< Optional element /// Attribute tModelKey of type "urn:uddi-org:api_v2":tModelKey @uddi2__tModelKey tModelKey 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"add_publisherAssertions" class uddi2__add_USCOREpublisherAssertions { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Vector of uddi2__publisherAssertion* with length 0..unbounded std::vector publisherAssertion 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__add_USCOREpublisherAssertions(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__add_USCOREpublisherAssertions(struct soap*, std::vector publisherAssertions); /// Member declared in uddi2-typemap.dat uddi2__dispositionReport* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"delete_binding" class uddi2__delete_USCOREbinding { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Vector of uddi2__bindingKey with length 0..unbounded std::vector bindingKey 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREbinding(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREbinding(struct soap*, const char *bindingKey); /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREbinding(struct soap*, std::vector bindingKeys); /// Member declared in uddi2-typemap.dat uddi2__dispositionReport* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"delete_business" class uddi2__delete_USCOREbusiness { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Vector of uddi2__businessKey with length 0..unbounded std::vector businessKey 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREbusiness(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREbusiness(struct soap*, const char *businessKey); /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREbusiness(struct soap*, std::vector businessKeys); /// Member declared in uddi2-typemap.dat uddi2__dispositionReport* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"delete_publisherAssertions" class uddi2__delete_USCOREpublisherAssertions { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Vector of uddi2__publisherAssertion* with length 0..unbounded std::vector publisherAssertion 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREpublisherAssertions(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREpublisherAssertions(struct soap*, std::vector publisherAssertions); /// Member declared in uddi2-typemap.dat uddi2__dispositionReport* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"delete_service" class uddi2__delete_USCOREservice { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Vector of uddi2__serviceKey with length 0..unbounded std::vector serviceKey 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREservice(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREservice(struct soap*, const char *serviceKey); /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREservice(struct soap*, std::vector serviceKeys); /// Member declared in uddi2-typemap.dat uddi2__dispositionReport* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"delete_tModel" class uddi2__delete_USCOREtModel { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Vector of uddi2__tModelKey with length 0..unbounded std::vector tModelKey 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREtModel(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREtModel(struct soap*, const char *tModelKey); /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREtModel(struct soap*, std::vector tModelKeys); /// Member declared in uddi2-typemap.dat uddi2__dispositionReport* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"discard_authToken" class uddi2__discard_USCOREauthToken { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__discard_USCOREauthToken(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__discard_USCOREauthToken(struct soap*, const char *authInfo); /// Member declared in uddi2-typemap.dat uddi2__dispositionReport* send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"find_binding" class uddi2__find_USCOREbinding { public: /// Element reference "urn:uddi-org:api_v2":findQualifiers uddi2__findQualifiers* findQualifiers 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":tModelBag uddi2__tModelBag* tModelBag 1; ///< Required element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute maxRows of type xs:int @int* maxRows 0; ///< Optional attribute /// Attribute serviceKey of type "urn:uddi-org:api_v2":serviceKey @uddi2__serviceKey serviceKey 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__find_USCOREbinding(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__find_USCOREbinding(struct soap*, const char *tModelKey); /// Member declared in uddi2-typemap.dat uddi2__find_USCOREbinding(struct soap*, std::vector tModelKeys); /// Member declared in uddi2-typemap.dat uddi2__bindingDetail *send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"find_business" class uddi2__find_USCOREbusiness { public: /// Element reference "urn:uddi-org:api_v2":findQualifiers uddi2__findQualifiers* findQualifiers 0; ///< Optional element /// Vector of uddi2__name* with length 0..unbounded std::vector name 0; /// Element reference "urn:uddi-org:api_v2":identifierBag uddi2__identifierBag* identifierBag 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":categoryBag uddi2__categoryBag* categoryBag 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":tModelBag uddi2__tModelBag* tModelBag 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":discoveryURLs uddi2__discoveryURLs* discoveryURLs 0; ///< Optional element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute maxRows of type xs:int @int* maxRows 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__find_USCOREbusiness(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__find_USCOREbusiness(struct soap*, const char *name); /// Member declared in uddi2-typemap.dat uddi2__find_USCOREbusiness(struct soap*, std::vector tModelKeys); /// Member declared in uddi2-typemap.dat uddi2__find_USCOREbusiness(struct soap*, std::vector keyedReferences); /// Member declared in uddi2-typemap.dat uddi2__businessList *send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"find_relatedBusinesses" class uddi2__find_USCORErelatedBusinesses { public: /// Element reference "urn:uddi-org:api_v2":findQualifiers uddi2__findQualifiers* findQualifiers 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":businessKey uddi2__businessKey businessKey 1; ///< Required element /// Element reference "urn:uddi-org:api_v2":keyedReference uddi2__keyedReference* keyedReference 0; ///< Optional element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute maxRows of type xs:int @int* maxRows 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__find_USCORErelatedBusinesses(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__find_USCORErelatedBusinesses(struct soap*, const char *businessKey); /// Member declared in uddi2-typemap.dat uddi2__relatedBusinessesList *send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"find_service" class uddi2__find_USCOREservice { public: /// Element reference "urn:uddi-org:api_v2":findQualifiers uddi2__findQualifiers* findQualifiers 0; ///< Optional element /// Vector of uddi2__name* with length 0..unbounded std::vector name 0; /// Element reference "urn:uddi-org:api_v2":categoryBag uddi2__categoryBag* categoryBag 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":tModelBag uddi2__tModelBag* tModelBag 0; ///< Optional element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute maxRows of type xs:int @int* maxRows 0; ///< Optional attribute /// Attribute businessKey of type "urn:uddi-org:api_v2":businessKey @uddi2__businessKey businessKey 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__find_USCOREservice(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__find_USCOREservice(struct soap*, const char *name); /// Member declared in uddi2-typemap.dat uddi2__find_USCOREservice(struct soap*, std::vector tModelKeys); /// Member declared in uddi2-typemap.dat uddi2__find_USCOREservice(struct soap*, std::vector keyedReferences); /// Member declared in uddi2-typemap.dat uddi2__serviceList* send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"find_tModel" class uddi2__find_USCOREtModel { public: /// Element reference "urn:uddi-org:api_v2":findQualifiers uddi2__findQualifiers* findQualifiers 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":name uddi2__name* name 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":identifierBag uddi2__identifierBag* identifierBag 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":categoryBag uddi2__categoryBag* categoryBag 0; ///< Optional element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute maxRows of type xs:int @int* maxRows 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__find_USCOREtModel(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__find_USCOREtModel(struct soap*, const char *name); /// Member declared in uddi2-typemap.dat uddi2__find_USCOREtModel(struct soap*, std::vector keyedReferences); /// Member declared in uddi2-typemap.dat uddi2__tModelList* send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"get_assertionStatusReport" class uddi2__get_USCOREassertionStatusReport { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Element reference "urn:uddi-org:api_v2":completionStatus char* completionStatus 0; ///< Optional element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__get_USCOREassertionStatusReport(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREassertionStatusReport(struct soap*, const char *completionStatus); /// Member declared in uddi2-typemap.dat uddi2__assertionStatusReport* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"get_authToken" class uddi2__get_USCOREauthToken { public: /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute userID of type xs:string @char* userID 1; ///< Required attribute /// Attribute cred of type xs:string @char* cred 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__get_USCOREauthToken(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREauthToken(struct soap*, const char *userid, const char *passwd); /// Member declared in uddi2-typemap.dat uddi2__authToken* send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"get_bindingDetail" class uddi2__get_USCOREbindingDetail { public: /// Vector of uddi2__bindingKey with length 0..unbounded std::vector bindingKey 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__get_USCOREbindingDetail(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREbindingDetail(struct soap*, const char *bindingKey); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREbindingDetail(struct soap*, std::vector bindingKeys); /// Member declared in uddi2-typemap.dat uddi2__bindingDetail* send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"get_businessDetail" class uddi2__get_USCOREbusinessDetail { public: /// Vector of uddi2__businessKey with length 0..unbounded std::vector businessKey 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__get_USCOREbusinessDetail(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREbusinessDetail(struct soap*, const char *businessKey); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREbusinessDetail(struct soap*, std::vector businessKeys); /// Member declared in uddi2-typemap.dat uddi2__businessDetail* send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"get_businessDetailExt" class uddi2__get_USCOREbusinessDetailExt { public: /// Vector of uddi2__businessKey with length 0..unbounded std::vector businessKey 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__get_USCOREbusinessDetailExt(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREbusinessDetailExt(struct soap*, const char *businessKey); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREbusinessDetailExt(struct soap*, std::vector businessKeys); /// Member declared in uddi2-typemap.dat uddi2__businessDetailExt* send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"get_publisherAssertions" class uddi2__get_USCOREpublisherAssertions { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__get_USCOREpublisherAssertions(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__publisherAssertions* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"get_registeredInfo" class uddi2__get_USCOREregisteredInfo { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__get_USCOREregisteredInfo(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__registeredInfo* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"get_serviceDetail" class uddi2__get_USCOREserviceDetail { public: /// Vector of uddi2__serviceKey with length 0..unbounded std::vector serviceKey 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__get_USCOREserviceDetail(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREserviceDetail(struct soap*, const char *serviceKey); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREserviceDetail(struct soap*, std::vector serviceKeys); /// Member declared in uddi2-typemap.dat uddi2__serviceDetail* send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"get_tModelDetail" class uddi2__get_USCOREtModelDetail { public: /// Vector of uddi2__tModelKey with length 0..unbounded std::vector tModelKey 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__get_USCOREtModelDetail(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREtModelDetail(struct soap*, const char *tModelKey); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREtModelDetail(struct soap*, std::vector tModelKeys); /// Member declared in uddi2-typemap.dat uddi2__tModelDetail* send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"save_binding" class uddi2__save_USCOREbinding { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Vector of uddi2__bindingTemplate* with length 0..unbounded std::vector bindingTemplate 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__save_USCOREbinding(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__save_USCOREbinding(struct soap*, uddi2__bindingTemplate &bindingTemplate); /// Member declared in uddi2-typemap.dat uddi2__save_USCOREbinding(struct soap*, std::vector bindingTemplates); /// Member declared in uddi2-typemap.dat uddi2__bindingDetail* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"save_business" class uddi2__save_USCOREbusiness { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Vector of uddi2__businessEntity* with length 0..unbounded std::vector businessEntity 0; /// Vector of char* with length 0..unbounded std::vector uploadRegister 0; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__save_USCOREbusiness(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__save_USCOREbusiness(struct soap*, uddi2__businessEntity &businessEntity); /// Member declared in uddi2-typemap.dat uddi2__save_USCOREbusiness(struct soap*, std::vector businessEntities); /// Member declared in uddi2-typemap.dat uddi2__businessDetail* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"save_service" class uddi2__save_USCOREservice { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Vector of uddi2__businessService* with length 0..unbounded std::vector businessService 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__save_USCOREservice(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__save_USCOREservice(struct soap*, uddi2__businessService &businessService); /// Member declared in uddi2-typemap.dat uddi2__save_USCOREservice(struct soap*, std::vector businessServices); /// Member declared in uddi2-typemap.dat uddi2__serviceDetail* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"save_tModel" class uddi2__save_USCOREtModel { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Vector of uddi2__tModel* with length 0..unbounded std::vector tModel 0; /// Vector of char* with length 0..unbounded std::vector uploadRegister 0; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__save_USCOREtModel(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__save_USCOREtModel(struct soap*, uddi2__tModel &tModel); /// Member declared in uddi2-typemap.dat uddi2__save_USCOREtModel(struct soap*, std::vector tModels); /// Member declared in uddi2-typemap.dat uddi2__tModelDetail* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"set_publisherAssertions" class uddi2__set_USCOREpublisherAssertions { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Vector of uddi2__publisherAssertion* with length 0..unbounded std::vector publisherAssertion 0; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__set_USCOREpublisherAssertions(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__set_USCOREpublisherAssertions(struct soap*, std::vector publisherAssertions); /// Member declared in uddi2-typemap.dat uddi2__publisherAssertions* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"validate_values" class uddi2__validate_USCOREvalues { public: // CHOICE OF ELEMENTS: /// Vector of uddi2__businessEntity* with length 0..unbounded std::vector businessEntity 0; /// Vector of uddi2__businessService* with length 0..unbounded std::vector businessService 0; /// Vector of uddi2__tModel* with length 0..unbounded std::vector tModel 0; // END CHOICE /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"assertionStatusReport" class uddi2__assertionStatusReport { public: /// Vector of uddi2__assertionStatusItem* with length 0..unbounded std::vector assertionStatusItem 0; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"authToken" class uddi2__authToken { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"bindingDetail" class uddi2__bindingDetail { public: /// Vector of uddi2__bindingTemplate* with length 0..unbounded std::vector bindingTemplate 0; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute truncated of type "urn:uddi-org:api_v2":truncated @enum uddi2__truncated* truncated 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"businessDetail" class uddi2__businessDetail { public: /// Vector of uddi2__businessEntity* with length 0..unbounded std::vector businessEntity 0; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute truncated of type "urn:uddi-org:api_v2":truncated @enum uddi2__truncated* truncated 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"businessDetailExt" class uddi2__businessDetailExt { public: /// Vector of uddi2__businessEntityExt* with length 0..unbounded std::vector businessEntityExt 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute truncated of type "urn:uddi-org:api_v2":truncated @enum uddi2__truncated* truncated 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"businessList" class uddi2__businessList { public: /// Element reference "urn:uddi-org:api_v2":businessInfos uddi2__businessInfos* businessInfos 1; ///< Required element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute truncated of type "urn:uddi-org:api_v2":truncated @enum uddi2__truncated* truncated 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"publisherAssertions" class uddi2__publisherAssertions { public: /// Vector of uddi2__publisherAssertion* with length 0..unbounded std::vector publisherAssertion 0; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute authorizedName of type xs:string @char* authorizedName 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"registeredInfo" class uddi2__registeredInfo { public: /// Element reference "urn:uddi-org:api_v2":businessInfos uddi2__businessInfos* businessInfos 1; ///< Required element /// Element reference "urn:uddi-org:api_v2":tModelInfos uddi2__tModelInfos* tModelInfos 1; ///< Required element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute truncated of type "urn:uddi-org:api_v2":truncated @enum uddi2__truncated* truncated 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"relatedBusinessesList" class uddi2__relatedBusinessesList { public: /// Element reference "urn:uddi-org:api_v2":businessKey uddi2__businessKey businessKey 1; ///< Required element /// Element reference "urn:uddi-org:api_v2":relatedBusinessInfos uddi2__relatedBusinessInfos* relatedBusinessInfos 1; ///< Required element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute truncated of type "urn:uddi-org:api_v2":truncated @enum uddi2__truncated* truncated 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"serviceDetail" class uddi2__serviceDetail { public: /// Vector of uddi2__businessService* with length 0..unbounded std::vector businessService 0; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute truncated of type "urn:uddi-org:api_v2":truncated @enum uddi2__truncated* truncated 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"serviceList" class uddi2__serviceList { public: /// Element reference "urn:uddi-org:api_v2":serviceInfos uddi2__serviceInfos* serviceInfos 1; ///< Required element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute truncated of type "urn:uddi-org:api_v2":truncated @enum uddi2__truncated* truncated 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"tModelDetail" class uddi2__tModelDetail { public: /// Vector of uddi2__tModel* with length 0..unbounded std::vector tModel 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute truncated of type "urn:uddi-org:api_v2":truncated @enum uddi2__truncated* truncated 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"tModelList" class uddi2__tModelList { public: /// Element reference "urn:uddi-org:api_v2":tModelInfos uddi2__tModelInfos* tModelInfos 1; ///< Required element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute truncated of type "urn:uddi-org:api_v2":truncated @enum uddi2__truncated* truncated 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"accessPoint" class uddi2__accessPoint { public: char* __item ; /// Attribute URLType of type "urn:uddi-org:api_v2":URLType @enum uddi2__URLType URLType 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"addressLine" class uddi2__addressLine { public: char* __item ; /// Attribute keyName of type xs:string @char* keyName 0; ///< Optional attribute /// Attribute keyValue of type xs:string @char* keyValue 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"description" class uddi2__description { public: char* __item ; /// Attribute reference xml:lang @xml__lang xml__lang_ 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"discoveryURL" class uddi2__discoveryURL { public: char* __item ; /// Attribute useType of type xs:string @char* useType 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"email" class uddi2__email { public: char* __item ; /// Attribute useType of type xs:string @char* useType 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"errInfo" class uddi2__errInfo { public: char* __item ; /// Attribute errCode of type xs:string @char* errCode 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"name" class uddi2__name { public: char* __item ; /// Attribute reference xml:lang @xml__lang xml__lang_ 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"phone" class uddi2__phone { public: char* __item ; /// Attribute useType of type xs:string @char* useType 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /******************************************************************************\ * * * Services * * * \******************************************************************************/ //gsoap inq2 service name: InquireSoap //gsoap inq2 service type: Inquire //gsoap inq2 service namespace: urn:uddi-org:inquiry_v2 //gsoap pub2 service name: PublishSoap //gsoap pub2 service type: Publish //gsoap pub2 service namespace: urn:uddi-org:publication_v2 /** @mainpage Service Definitions @section Service_bindings Bindings - @ref InquireSoap - @ref PublishSoap */ /** @page InquireSoap Binding "InquireSoap" @section InquireSoap_operations Operations of Binding "InquireSoap" - @ref __inq2__find_USCOREbinding - @ref __inq2__find_USCOREbusiness - @ref __inq2__find_USCORErelatedBusinesses - @ref __inq2__find_USCOREservice - @ref __inq2__find_USCOREtModel - @ref __inq2__get_USCOREbindingDetail - @ref __inq2__get_USCOREbusinessDetail - @ref __inq2__get_USCOREbusinessDetailExt - @ref __inq2__get_USCOREserviceDetail - @ref __inq2__get_USCOREtModelDetail @section InquireSoap_ports Endpoints of Binding "InquireSoap" */ /** @page PublishSoap Binding "PublishSoap" @section PublishSoap_operations Operations of Binding "PublishSoap" - @ref __pub2__add_USCOREpublisherAssertions - @ref __pub2__delete_USCOREbinding - @ref __pub2__delete_USCOREbusiness - @ref __pub2__delete_USCOREpublisherAssertions - @ref __pub2__delete_USCOREservice - @ref __pub2__delete_USCOREtModel - @ref __pub2__discard_USCOREauthToken - @ref __pub2__get_USCOREassertionStatusReport - @ref __pub2__get_USCOREauthToken - @ref __pub2__get_USCOREpublisherAssertions - @ref __pub2__get_USCOREregisteredInfo - @ref __pub2__save_USCOREbinding - @ref __pub2__save_USCOREbusiness - @ref __pub2__save_USCOREservice - @ref __pub2__save_USCOREtModel - @ref __pub2__set_USCOREpublisherAssertions @section PublishSoap_ports Endpoints of Binding "PublishSoap" */ /******************************************************************************\ * * * SOAP Fault Detail * * * \******************************************************************************/ /// The SOAP Fault Detail element contains one of the following types serialized // in the __type and fault fields of the SOAP_ENV__Detail struct (see docs) class _dispositionReport { public: uddi2__dispositionReport* uddi2__dispositionReport_; struct soap *soap ; }; /******************************************************************************\ * * * InquireSoap * * * \******************************************************************************/ /******************************************************************************\ * * * __inq2__find_USCOREbinding * * * \******************************************************************************/ /// Operation "__inq2__find_USCOREbinding" of service binding "InquireSoap" /** Operation details: - SOAP document/literal style - SOAP action="find_binding" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___inq2__find_USCOREbinding(struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: uddi2__find_USCOREbinding* uddi2__find_USCOREbinding_, // response parameters: uddi2__bindingDetail* uddi2__bindingDetail_ ); @endcode C++ proxy class (defined in soapInquireSoapProxy.h): class InquireSoap; */ //gsoap inq2 service method-style: find_USCOREbinding document //gsoap inq2 service method-encoding: find_USCOREbinding literal //gsoap inq2 service method-action: find_USCOREbinding find_binding //gsoap inq2 service method-fault: find_USCOREbinding _dispositionReport int __inq2__find_USCOREbinding( uddi2__find_USCOREbinding* uddi2__find_USCOREbinding_, uddi2__bindingDetail* uddi2__bindingDetail_ ///< response parameter ); /******************************************************************************\ * * * __inq2__find_USCOREbusiness * * * \******************************************************************************/ /// Operation "__inq2__find_USCOREbusiness" of service binding "InquireSoap" /** Operation details: - SOAP document/literal style - SOAP action="find_business" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___inq2__find_USCOREbusiness(struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: uddi2__find_USCOREbusiness* uddi2__find_USCOREbusiness_, // response parameters: uddi2__businessList* uddi2__businessList_ ); @endcode C++ proxy class (defined in soapInquireSoapProxy.h): class InquireSoap; */ //gsoap inq2 service method-style: find_USCOREbusiness document //gsoap inq2 service method-encoding: find_USCOREbusiness literal //gsoap inq2 service method-action: find_USCOREbusiness find_business //gsoap inq2 service method-fault: find_USCOREbusiness _dispositionReport int __inq2__find_USCOREbusiness( uddi2__find_USCOREbusiness* uddi2__find_USCOREbusiness_, uddi2__businessList* uddi2__businessList_ ///< response parameter ); /******************************************************************************\ * * * __inq2__find_USCORErelatedBusinesses * * * \******************************************************************************/ /// Operation "__inq2__find_USCORErelatedBusinesses" of service binding "InquireSoap" /** Operation details: - SOAP document/literal style - SOAP action="find_relatedBusinesses" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___inq2__find_USCORErelatedBusinesses(struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: uddi2__find_USCORErelatedBusinesses* uddi2__find_USCORErelatedBusinesses_, // response parameters: uddi2__relatedBusinessesList* uddi2__relatedBusinessesList_ ); @endcode C++ proxy class (defined in soapInquireSoapProxy.h): class InquireSoap; */ //gsoap inq2 service method-style: find_USCORErelatedBusinesses document //gsoap inq2 service method-encoding: find_USCORErelatedBusinesses literal //gsoap inq2 service method-action: find_USCORErelatedBusinesses find_relatedBusinesses //gsoap inq2 service method-fault: find_USCORErelatedBusinesses _dispositionReport int __inq2__find_USCORErelatedBusinesses( uddi2__find_USCORErelatedBusinesses* uddi2__find_USCORErelatedBusinesses_, uddi2__relatedBusinessesList* uddi2__relatedBusinessesList_ ///< response parameter ); /******************************************************************************\ * * * __inq2__find_USCOREservice * * * \******************************************************************************/ /// Operation "__inq2__find_USCOREservice" of service binding "InquireSoap" /** Operation details: - SOAP document/literal style - SOAP action="find_service" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___inq2__find_USCOREservice(struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: uddi2__find_USCOREservice* uddi2__find_USCOREservice_, // response parameters: uddi2__serviceList* uddi2__serviceList_ ); @endcode C++ proxy class (defined in soapInquireSoapProxy.h): class InquireSoap; */ //gsoap inq2 service method-style: find_USCOREservice document //gsoap inq2 service method-encoding: find_USCOREservice literal //gsoap inq2 service method-action: find_USCOREservice find_service //gsoap inq2 service method-fault: find_USCOREservice _dispositionReport int __inq2__find_USCOREservice( uddi2__find_USCOREservice* uddi2__find_USCOREservice_, uddi2__serviceList* uddi2__serviceList_ ///< response parameter ); /******************************************************************************\ * * * __inq2__find_USCOREtModel * * * \******************************************************************************/ /// Operation "__inq2__find_USCOREtModel" of service binding "InquireSoap" /** Operation details: - SOAP document/literal style - SOAP action="find_tModel" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___inq2__find_USCOREtModel(struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: uddi2__find_USCOREtModel* uddi2__find_USCOREtModel_, // response parameters: uddi2__tModelList* uddi2__tModelList_ ); @endcode C++ proxy class (defined in soapInquireSoapProxy.h): class InquireSoap; */ //gsoap inq2 service method-style: find_USCOREtModel document //gsoap inq2 service method-encoding: find_USCOREtModel literal //gsoap inq2 service method-action: find_USCOREtModel find_tModel //gsoap inq2 service method-fault: find_USCOREtModel _dispositionReport int __inq2__find_USCOREtModel( uddi2__find_USCOREtModel* uddi2__find_USCOREtModel_, uddi2__tModelList* uddi2__tModelList_ ///< response parameter ); /******************************************************************************\ * * * __inq2__get_USCOREbindingDetail * * * \******************************************************************************/ /// Operation "__inq2__get_USCOREbindingDetail" of service binding "InquireSoap" /** Operation details: - SOAP document/literal style - SOAP action="get_bindingDetail" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___inq2__get_USCOREbindingDetail(struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: uddi2__get_USCOREbindingDetail* uddi2__get_USCOREbindingDetail_, // response parameters: uddi2__bindingDetail* uddi2__bindingDetail_ ); @endcode C++ proxy class (defined in soapInquireSoapProxy.h): class InquireSoap; */ //gsoap inq2 service method-style: get_USCOREbindingDetail document //gsoap inq2 service method-encoding: get_USCOREbindingDetail literal //gsoap inq2 service method-action: get_USCOREbindingDetail get_bindingDetail //gsoap inq2 service method-fault: get_USCOREbindingDetail _dispositionReport int __inq2__get_USCOREbindingDetail( uddi2__get_USCOREbindingDetail* uddi2__get_USCOREbindingDetail_, uddi2__bindingDetail* uddi2__bindingDetail_ ///< response parameter ); /******************************************************************************\ * * * __inq2__get_USCOREbusinessDetail * * * \******************************************************************************/ /// Operation "__inq2__get_USCOREbusinessDetail" of service binding "InquireSoap" /** Operation details: - SOAP document/literal style - SOAP action="get_businessDetail" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___inq2__get_USCOREbusinessDetail(struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: uddi2__get_USCOREbusinessDetail* uddi2__get_USCOREbusinessDetail_, // response parameters: uddi2__businessDetail* uddi2__businessDetail_ ); @endcode C++ proxy class (defined in soapInquireSoapProxy.h): class InquireSoap; */ //gsoap inq2 service method-style: get_USCOREbusinessDetail document //gsoap inq2 service method-encoding: get_USCOREbusinessDetail literal //gsoap inq2 service method-action: get_USCOREbusinessDetail get_businessDetail //gsoap inq2 service method-fault: get_USCOREbusinessDetail _dispositionReport int __inq2__get_USCOREbusinessDetail( uddi2__get_USCOREbusinessDetail* uddi2__get_USCOREbusinessDetail_, uddi2__businessDetail* uddi2__businessDetail_ ///< response parameter ); /******************************************************************************\ * * * __inq2__get_USCOREbusinessDetailExt * * * \******************************************************************************/ /// Operation "__inq2__get_USCOREbusinessDetailExt" of service binding "InquireSoap" /** Operation details: - SOAP document/literal style - SOAP action="get_businessDetailExt" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___inq2__get_USCOREbusinessDetailExt(struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: uddi2__get_USCOREbusinessDetailExt* uddi2__get_USCOREbusinessDetailExt_, // response parameters: uddi2__businessDetailExt* uddi2__businessDetailExt_ ); @endcode C++ proxy class (defined in soapInquireSoapProxy.h): class InquireSoap; */ //gsoap inq2 service method-style: get_USCOREbusinessDetailExt document //gsoap inq2 service method-encoding: get_USCOREbusinessDetailExt literal //gsoap inq2 service method-action: get_USCOREbusinessDetailExt get_businessDetailExt //gsoap inq2 service method-fault: get_USCOREbusinessDetailExt _dispositionReport int __inq2__get_USCOREbusinessDetailExt( uddi2__get_USCOREbusinessDetailExt* uddi2__get_USCOREbusinessDetailExt_, uddi2__businessDetailExt* uddi2__businessDetailExt_ ///< response parameter ); /******************************************************************************\ * * * __inq2__get_USCOREserviceDetail * * * \******************************************************************************/ /// Operation "__inq2__get_USCOREserviceDetail" of service binding "InquireSoap" /** Operation details: - SOAP document/literal style - SOAP action="get_serviceDetail" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___inq2__get_USCOREserviceDetail(struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: uddi2__get_USCOREserviceDetail* uddi2__get_USCOREserviceDetail_, // response parameters: uddi2__serviceDetail* uddi2__serviceDetail_ ); @endcode C++ proxy class (defined in soapInquireSoapProxy.h): class InquireSoap; */ //gsoap inq2 service method-style: get_USCOREserviceDetail document //gsoap inq2 service method-encoding: get_USCOREserviceDetail literal //gsoap inq2 service method-action: get_USCOREserviceDetail get_serviceDetail //gsoap inq2 service method-fault: get_USCOREserviceDetail _dispositionReport int __inq2__get_USCOREserviceDetail( uddi2__get_USCOREserviceDetail* uddi2__get_USCOREserviceDetail_, uddi2__serviceDetail* uddi2__serviceDetail_ ///< response parameter ); /******************************************************************************\ * * * __inq2__get_USCOREtModelDetail * * * \******************************************************************************/ /// Operation "__inq2__get_USCOREtModelDetail" of service binding "InquireSoap" /** Operation details: - SOAP document/literal style - SOAP action="get_tModelDetail" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___inq2__get_USCOREtModelDetail(struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: uddi2__get_USCOREtModelDetail* uddi2__get_USCOREtModelDetail_, // response parameters: uddi2__tModelDetail* uddi2__tModelDetail_ ); @endcode C++ proxy class (defined in soapInquireSoapProxy.h): class InquireSoap; */ //gsoap inq2 service method-style: get_USCOREtModelDetail document //gsoap inq2 service method-encoding: get_USCOREtModelDetail literal //gsoap inq2 service method-action: get_USCOREtModelDetail get_tModelDetail //gsoap inq2 service method-fault: get_USCOREtModelDetail _dispositionReport int __inq2__get_USCOREtModelDetail( uddi2__get_USCOREtModelDetail* uddi2__get_USCOREtModelDetail_, uddi2__tModelDetail* uddi2__tModelDetail_ ///< response parameter ); /******************************************************************************\ * * * PublishSoap * * * \******************************************************************************/ /******************************************************************************\ * * * __pub2__add_USCOREpublisherAssertions * * * \******************************************************************************/ /// Operation "__pub2__add_USCOREpublisherAssertions" of service binding "PublishSoap" /** Operation details: - SOAP document/literal style - SOAP action="add_publisherAssertions" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___pub2__add_USCOREpublisherAssertions(struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: uddi2__add_USCOREpublisherAssertions* uddi2__add_USCOREpublisherAssertions_, // response parameters: uddi2__dispositionReport* uddi2__dispositionReport_ ); @endcode C++ proxy class (defined in soapPublishSoapProxy.h): class PublishSoap; */ //gsoap pub2 service method-style: add_USCOREpublisherAssertions document //gsoap pub2 service method-encoding: add_USCOREpublisherAssertions literal //gsoap pub2 service method-action: add_USCOREpublisherAssertions add_publisherAssertions //gsoap pub2 service method-fault: add_USCOREpublisherAssertions _dispositionReport int __pub2__add_USCOREpublisherAssertions( uddi2__add_USCOREpublisherAssertions* uddi2__add_USCOREpublisherAssertions_, uddi2__dispositionReport* uddi2__dispositionReport_ ///< response parameter ); /******************************************************************************\ * * * __pub2__delete_USCOREbinding * * * \******************************************************************************/ /// Operation "__pub2__delete_USCOREbinding" of service binding "PublishSoap" /** Operation details: - SOAP document/literal style - SOAP action="delete_binding" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___pub2__delete_USCOREbinding(struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: uddi2__delete_USCOREbinding* uddi2__delete_USCOREbinding_, // response parameters: uddi2__dispositionReport* uddi2__dispositionReport_ ); @endcode C++ proxy class (defined in soapPublishSoapProxy.h): class PublishSoap; */ //gsoap pub2 service method-style: delete_USCOREbinding document //gsoap pub2 service method-encoding: delete_USCOREbinding literal //gsoap pub2 service method-action: delete_USCOREbinding delete_binding //gsoap pub2 service method-fault: delete_USCOREbinding _dispositionReport int __pub2__delete_USCOREbinding( uddi2__delete_USCOREbinding* uddi2__delete_USCOREbinding_, uddi2__dispositionReport* uddi2__dispositionReport_ ///< response parameter ); /******************************************************************************\ * * * __pub2__delete_USCOREbusiness * * * \******************************************************************************/ /// Operation "__pub2__delete_USCOREbusiness" of service binding "PublishSoap" /** Operation details: - SOAP document/literal style - SOAP action="delete_business" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___pub2__delete_USCOREbusiness(struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: uddi2__delete_USCOREbusiness* uddi2__delete_USCOREbusiness_, // response parameters: uddi2__dispositionReport* uddi2__dispositionReport_ ); @endcode C++ proxy class (defined in soapPublishSoapProxy.h): class PublishSoap; */ //gsoap pub2 service method-style: delete_USCOREbusiness document //gsoap pub2 service method-encoding: delete_USCOREbusiness literal //gsoap pub2 service method-action: delete_USCOREbusiness delete_business //gsoap pub2 service method-fault: delete_USCOREbusiness _dispositionReport int __pub2__delete_USCOREbusiness( uddi2__delete_USCOREbusiness* uddi2__delete_USCOREbusiness_, uddi2__dispositionReport* uddi2__dispositionReport_ ///< response parameter ); /******************************************************************************\ * * * __pub2__delete_USCOREpublisherAssertions * * * \******************************************************************************/ /// Operation "__pub2__delete_USCOREpublisherAssertions" of service binding "PublishSoap" /** Operation details: - SOAP document/literal style - SOAP action="delete_publisherAssertions" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___pub2__delete_USCOREpublisherAssertions(struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: uddi2__delete_USCOREpublisherAssertions* uddi2__delete_USCOREpublisherAssertions_, // response parameters: uddi2__dispositionReport* uddi2__dispositionReport_ ); @endcode C++ proxy class (defined in soapPublishSoapProxy.h): class PublishSoap; */ //gsoap pub2 service method-style: delete_USCOREpublisherAssertions document //gsoap pub2 service method-encoding: delete_USCOREpublisherAssertions literal //gsoap pub2 service method-action: delete_USCOREpublisherAssertions delete_publisherAssertions //gsoap pub2 service method-fault: delete_USCOREpublisherAssertions _dispositionReport int __pub2__delete_USCOREpublisherAssertions( uddi2__delete_USCOREpublisherAssertions* uddi2__delete_USCOREpublisherAssertions_, uddi2__dispositionReport* uddi2__dispositionReport_ ///< response parameter ); /******************************************************************************\ * * * __pub2__delete_USCOREservice * * * \******************************************************************************/ /// Operation "__pub2__delete_USCOREservice" of service binding "PublishSoap" /** Operation details: - SOAP document/literal style - SOAP action="delete_service" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___pub2__delete_USCOREservice(struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: uddi2__delete_USCOREservice* uddi2__delete_USCOREservice_, // response parameters: uddi2__dispositionReport* uddi2__dispositionReport_ ); @endcode C++ proxy class (defined in soapPublishSoapProxy.h): class PublishSoap; */ //gsoap pub2 service method-style: delete_USCOREservice document //gsoap pub2 service method-encoding: delete_USCOREservice literal //gsoap pub2 service method-action: delete_USCOREservice delete_service //gsoap pub2 service method-fault: delete_USCOREservice _dispositionReport int __pub2__delete_USCOREservice( uddi2__delete_USCOREservice* uddi2__delete_USCOREservice_, uddi2__dispositionReport* uddi2__dispositionReport_ ///< response parameter ); /******************************************************************************\ * * * __pub2__delete_USCOREtModel * * * \******************************************************************************/ /// Operation "__pub2__delete_USCOREtModel" of service binding "PublishSoap" /** Operation details: - SOAP document/literal style - SOAP action="delete_tModel" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___pub2__delete_USCOREtModel(struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: uddi2__delete_USCOREtModel* uddi2__delete_USCOREtModel_, // response parameters: uddi2__dispositionReport* uddi2__dispositionReport_ ); @endcode C++ proxy class (defined in soapPublishSoapProxy.h): class PublishSoap; */ //gsoap pub2 service method-style: delete_USCOREtModel document //gsoap pub2 service method-encoding: delete_USCOREtModel literal //gsoap pub2 service method-action: delete_USCOREtModel delete_tModel //gsoap pub2 service method-fault: delete_USCOREtModel _dispositionReport int __pub2__delete_USCOREtModel( uddi2__delete_USCOREtModel* uddi2__delete_USCOREtModel_, uddi2__dispositionReport* uddi2__dispositionReport_ ///< response parameter ); /******************************************************************************\ * * * __pub2__discard_USCOREauthToken * * * \******************************************************************************/ /// Operation "__pub2__discard_USCOREauthToken" of service binding "PublishSoap" /** Operation details: - SOAP document/literal style - SOAP action="discard_authToken" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___pub2__discard_USCOREauthToken(struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: uddi2__discard_USCOREauthToken* uddi2__discard_USCOREauthToken_, // response parameters: uddi2__dispositionReport* uddi2__dispositionReport_ ); @endcode C++ proxy class (defined in soapPublishSoapProxy.h): class PublishSoap; */ //gsoap pub2 service method-style: discard_USCOREauthToken document //gsoap pub2 service method-encoding: discard_USCOREauthToken literal //gsoap pub2 service method-action: discard_USCOREauthToken discard_authToken //gsoap pub2 service method-fault: discard_USCOREauthToken _dispositionReport int __pub2__discard_USCOREauthToken( uddi2__discard_USCOREauthToken* uddi2__discard_USCOREauthToken_, uddi2__dispositionReport* uddi2__dispositionReport_ ///< response parameter ); /******************************************************************************\ * * * __pub2__get_USCOREassertionStatusReport * * * \******************************************************************************/ /// Operation "__pub2__get_USCOREassertionStatusReport" of service binding "PublishSoap" /** Operation details: - SOAP document/literal style - SOAP action="get_assertionStatusReport" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___pub2__get_USCOREassertionStatusReport(struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: uddi2__get_USCOREassertionStatusReport* uddi2__get_USCOREassertionStatusReport_, // response parameters: uddi2__assertionStatusReport* uddi2__assertionStatusReport_ ); @endcode C++ proxy class (defined in soapPublishSoapProxy.h): class PublishSoap; */ //gsoap pub2 service method-style: get_USCOREassertionStatusReport document //gsoap pub2 service method-encoding: get_USCOREassertionStatusReport literal //gsoap pub2 service method-action: get_USCOREassertionStatusReport get_assertionStatusReport //gsoap pub2 service method-fault: get_USCOREassertionStatusReport _dispositionReport int __pub2__get_USCOREassertionStatusReport( uddi2__get_USCOREassertionStatusReport* uddi2__get_USCOREassertionStatusReport_, uddi2__assertionStatusReport* uddi2__assertionStatusReport_ ///< response parameter ); /******************************************************************************\ * * * __pub2__get_USCOREauthToken * * * \******************************************************************************/ /// Operation "__pub2__get_USCOREauthToken" of service binding "PublishSoap" /** Operation details: - SOAP document/literal style - SOAP action="get_authToken" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___pub2__get_USCOREauthToken(struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: uddi2__get_USCOREauthToken* uddi2__get_USCOREauthToken_, // response parameters: uddi2__authToken* uddi2__authToken_ ); @endcode C++ proxy class (defined in soapPublishSoapProxy.h): class PublishSoap; */ //gsoap pub2 service method-style: get_USCOREauthToken document //gsoap pub2 service method-encoding: get_USCOREauthToken literal //gsoap pub2 service method-action: get_USCOREauthToken get_authToken //gsoap pub2 service method-fault: get_USCOREauthToken _dispositionReport int __pub2__get_USCOREauthToken( uddi2__get_USCOREauthToken* uddi2__get_USCOREauthToken_, uddi2__authToken* uddi2__authToken_ ///< response parameter ); /******************************************************************************\ * * * __pub2__get_USCOREpublisherAssertions * * * \******************************************************************************/ /// Operation "__pub2__get_USCOREpublisherAssertions" of service binding "PublishSoap" /** Operation details: - SOAP document/literal style - SOAP action="get_publisherAssertions" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___pub2__get_USCOREpublisherAssertions(struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: uddi2__get_USCOREpublisherAssertions* uddi2__get_USCOREpublisherAssertions_, // response parameters: uddi2__publisherAssertions* uddi2__publisherAssertions_ ); @endcode C++ proxy class (defined in soapPublishSoapProxy.h): class PublishSoap; */ //gsoap pub2 service method-style: get_USCOREpublisherAssertions document //gsoap pub2 service method-encoding: get_USCOREpublisherAssertions literal //gsoap pub2 service method-action: get_USCOREpublisherAssertions get_publisherAssertions //gsoap pub2 service method-fault: get_USCOREpublisherAssertions _dispositionReport int __pub2__get_USCOREpublisherAssertions( uddi2__get_USCOREpublisherAssertions* uddi2__get_USCOREpublisherAssertions_, uddi2__publisherAssertions* uddi2__publisherAssertions_ ///< response parameter ); /******************************************************************************\ * * * __pub2__get_USCOREregisteredInfo * * * \******************************************************************************/ /// Operation "__pub2__get_USCOREregisteredInfo" of service binding "PublishSoap" /** Operation details: - SOAP document/literal style - SOAP action="get_registeredInfo" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___pub2__get_USCOREregisteredInfo(struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: uddi2__get_USCOREregisteredInfo* uddi2__get_USCOREregisteredInfo_, // response parameters: uddi2__registeredInfo* uddi2__registeredInfo_ ); @endcode C++ proxy class (defined in soapPublishSoapProxy.h): class PublishSoap; */ //gsoap pub2 service method-style: get_USCOREregisteredInfo document //gsoap pub2 service method-encoding: get_USCOREregisteredInfo literal //gsoap pub2 service method-action: get_USCOREregisteredInfo get_registeredInfo //gsoap pub2 service method-fault: get_USCOREregisteredInfo _dispositionReport int __pub2__get_USCOREregisteredInfo( uddi2__get_USCOREregisteredInfo* uddi2__get_USCOREregisteredInfo_, uddi2__registeredInfo* uddi2__registeredInfo_ ///< response parameter ); /******************************************************************************\ * * * __pub2__save_USCOREbinding * * * \******************************************************************************/ /// Operation "__pub2__save_USCOREbinding" of service binding "PublishSoap" /** Operation details: - SOAP document/literal style - SOAP action="save_binding" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___pub2__save_USCOREbinding(struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: uddi2__save_USCOREbinding* uddi2__save_USCOREbinding_, // response parameters: uddi2__bindingDetail* uddi2__bindingDetail_ ); @endcode C++ proxy class (defined in soapPublishSoapProxy.h): class PublishSoap; */ //gsoap pub2 service method-style: save_USCOREbinding document //gsoap pub2 service method-encoding: save_USCOREbinding literal //gsoap pub2 service method-action: save_USCOREbinding save_binding //gsoap pub2 service method-fault: save_USCOREbinding _dispositionReport int __pub2__save_USCOREbinding( uddi2__save_USCOREbinding* uddi2__save_USCOREbinding_, uddi2__bindingDetail* uddi2__bindingDetail_ ///< response parameter ); /******************************************************************************\ * * * __pub2__save_USCOREbusiness * * * \******************************************************************************/ /// Operation "__pub2__save_USCOREbusiness" of service binding "PublishSoap" /** Operation details: - SOAP document/literal style - SOAP action="save_business" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___pub2__save_USCOREbusiness(struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: uddi2__save_USCOREbusiness* uddi2__save_USCOREbusiness_, // response parameters: uddi2__businessDetail* uddi2__businessDetail_ ); @endcode C++ proxy class (defined in soapPublishSoapProxy.h): class PublishSoap; */ //gsoap pub2 service method-style: save_USCOREbusiness document //gsoap pub2 service method-encoding: save_USCOREbusiness literal //gsoap pub2 service method-action: save_USCOREbusiness save_business //gsoap pub2 service method-fault: save_USCOREbusiness _dispositionReport int __pub2__save_USCOREbusiness( uddi2__save_USCOREbusiness* uddi2__save_USCOREbusiness_, uddi2__businessDetail* uddi2__businessDetail_ ///< response parameter ); /******************************************************************************\ * * * __pub2__save_USCOREservice * * * \******************************************************************************/ /// Operation "__pub2__save_USCOREservice" of service binding "PublishSoap" /** Operation details: - SOAP document/literal style - SOAP action="save_service" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___pub2__save_USCOREservice(struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: uddi2__save_USCOREservice* uddi2__save_USCOREservice_, // response parameters: uddi2__serviceDetail* uddi2__serviceDetail_ ); @endcode C++ proxy class (defined in soapPublishSoapProxy.h): class PublishSoap; */ //gsoap pub2 service method-style: save_USCOREservice document //gsoap pub2 service method-encoding: save_USCOREservice literal //gsoap pub2 service method-action: save_USCOREservice save_service //gsoap pub2 service method-fault: save_USCOREservice _dispositionReport int __pub2__save_USCOREservice( uddi2__save_USCOREservice* uddi2__save_USCOREservice_, uddi2__serviceDetail* uddi2__serviceDetail_ ///< response parameter ); /******************************************************************************\ * * * __pub2__save_USCOREtModel * * * \******************************************************************************/ /// Operation "__pub2__save_USCOREtModel" of service binding "PublishSoap" /** Operation details: - SOAP document/literal style - SOAP action="save_tModel" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___pub2__save_USCOREtModel(struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: uddi2__save_USCOREtModel* uddi2__save_USCOREtModel_, // response parameters: uddi2__tModelDetail* uddi2__tModelDetail_ ); @endcode C++ proxy class (defined in soapPublishSoapProxy.h): class PublishSoap; */ //gsoap pub2 service method-style: save_USCOREtModel document //gsoap pub2 service method-encoding: save_USCOREtModel literal //gsoap pub2 service method-action: save_USCOREtModel save_tModel //gsoap pub2 service method-fault: save_USCOREtModel _dispositionReport int __pub2__save_USCOREtModel( uddi2__save_USCOREtModel* uddi2__save_USCOREtModel_, uddi2__tModelDetail* uddi2__tModelDetail_ ///< response parameter ); /******************************************************************************\ * * * __pub2__set_USCOREpublisherAssertions * * * \******************************************************************************/ /// Operation "__pub2__set_USCOREpublisherAssertions" of service binding "PublishSoap" /** Operation details: - SOAP document/literal style - SOAP action="set_publisherAssertions" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___pub2__set_USCOREpublisherAssertions(struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: uddi2__set_USCOREpublisherAssertions* uddi2__set_USCOREpublisherAssertions_, // response parameters: uddi2__publisherAssertions* uddi2__publisherAssertions_ ); @endcode C++ proxy class (defined in soapPublishSoapProxy.h): class PublishSoap; */ //gsoap pub2 service method-style: set_USCOREpublisherAssertions document //gsoap pub2 service method-encoding: set_USCOREpublisherAssertions literal //gsoap pub2 service method-action: set_USCOREpublisherAssertions set_publisherAssertions //gsoap pub2 service method-fault: set_USCOREpublisherAssertions _dispositionReport int __pub2__set_USCOREpublisherAssertions( uddi2__set_USCOREpublisherAssertions* uddi2__set_USCOREpublisherAssertions_, uddi2__publisherAssertions* uddi2__publisherAssertions_ ///< response parameter ); /* End of uddi_v2.h */ gsoap-2.8.28/gsoap/uddi2/uddi2-typemap.dat0000644000175000017500000016654612653650160017610 0ustar ellertellert# uddi2map.dat # # gSOAP type map bindings for UDDI v2 to run the gSOAP WSDL tool 'wsdl2h' # # Includes full documentation and examples of the gSOAP UDDI v2 API [ /** @mainpage gSOAP UDDI v2 Universal Description, Discovery and Integration, or UDDI, is the name of a group of web-based registries that expose information about a business or other entity and its technical interfaces. See the UDDI v2 specification @url http://uddi.org/pubs/ProgrammersAPI_v2.htm for more details. @section UDDI2_CLASSES Classes See Related Pages for examples. UDDI Inquire classes - @ref uddi2__find_USCOREbinding - @ref uddi2__find_USCOREbusiness - @ref uddi2__find_USCORErelatedBusinesses - @ref uddi2__find_USCOREservice - @ref uddi2__find_USCOREtModel - @ref uddi2__get_USCOREbindingDetail - @ref uddi2__get_USCOREbusinessDetail - @ref uddi2__get_USCOREbusinessDetailExt - @ref uddi2__get_USCOREserviceDetail - @ref uddi2__get_USCOREtModelDetail UDDI Publish classes - @ref uddi2__add_USCOREpublisherAssertions - @ref uddi2__delete_USCOREbinding - @ref uddi2__delete_USCOREbusiness - @ref uddi2__delete_USCOREservice - @ref uddi2__delete_USCOREtModel - @ref uddi2__delete_USCOREpublisherAssertions - @ref uddi2__discard_USCOREauthToken - @ref uddi2__get_USCOREassertionStatusReport - @ref uddi2__get_USCOREauthToken - @ref uddi2__get_USCOREpublisherAssertions - @ref uddi2__get_USCOREregisteredInfo - @ref uddi2__save_USCOREbinding - @ref uddi2__save_USCOREbusiness - @ref uddi2__save_USCOREservice - @ref uddi2__save_USCOREtModel - @ref uddi2__set_USCOREpublisherAssertions @section UDDI2_BINDINGS Binding Reference - @ref InquireSoap - @ref PublishSoap */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:find_binding // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__find_USCOREbinding @brief Represents a request to locate bindings that meet the specified requirements. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137712 */ /** @fn uddi2__find_USCOREbinding::uddi2__find_USCOREbinding(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the find_USCOREbinding class. */ /** @fn uddi2__find_USCOREbinding::uddi2__find_USCOREbinding(struct soap *soap, const char *tModelKey) @brief @param[in] soap gSOAP context @param[in] tModelKey string Creates an instance of the find_USCOREbinding class using the specified tModel key. */ /** @fn uddi2__find_USCOREbinding::uddi2__find_USCOREbinding(struct soap *soap, std::vector tModelKeys) @brief @param[in] soap gSOAP context @param[in] tModelKeys collection of tModel key strings Creates an instance of the find_USCOREbinding class using the specified tModel keys. */ /** @fn uddi2__bindingDetail* uddi2__find_USCOREbinding::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__bindingDetail object or NULL on error Send a request to a UDDI server to find binding details. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:find_business // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__find_USCOREbusiness @brief Represents a request to locate businesses that meet specific requirements. When the send method is called, the instance returns a uddi2__businessList object that contains a list of business that matched the search criteria. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137713 See also @ref example2. */ /** @fn uddi2__find_USCOREbusiness::uddi2__find_USCOREbusiness(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the find_USCOREbusiness class. */ /** @fn uddi2__find_USCOREbusiness::uddi2__find_USCOREbusiness(struct soap *soap, const char *name) @brief @param[in] soap gSOAP context Creates an instance of the find_USCOREbusiness class using the specified name of the requested business. */ /** @fn uddi2__find_USCOREbusiness::uddi2__find_USCOREbusiness(struct soap *soap, std::vector keyedReferences) @brief @param[in] soap gSOAP context Creates an instance of the find_USCOREbusiness class using the specified category references. */ /** @fn uddi2__find_USCOREbusiness::uddi2__find_USCOREbusiness(struct soap *soap, std::vector tModelKeys) @brief @param[in] soap gSOAP context Creates an instance of the find_USCOREbusiness class using the specified tModel keys. */ /** @fn uddi2__businessList *uddi2__find_USCOREbusiness::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__businessList object or NULL on error Send a request to a UDDI server to find a list of businesses. See also @ref example2. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:find_relatedBusinesses // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__find_USCORErelatedBusinesses @brief Represents a request to locate businesses that are related to a specific business. When the send method is called, the instance returns a uddi2__relatedBusinessList object that contains a list of business that matched the relationship set. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137714 */ /** @fn uddi2__find_USCORErelatedBusinesses::uddi2__find_USCORErelatedBusinesses(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the find_USCORErelatedBusiness class. */ /** @fn uddi2__find_USCORErelatedBusinesses::uddi2__find_USCORErelatedBusinesses(struct soap *soap, const char *businessKey) @brief @param[in] soap gSOAP context @param[in] businessKey string Creates an instance of the find_USCORErelatedBusiness class using the specified business key. */ /** @fn uddi2__relatedBusinessesList *uddi2__find_USCORErelatedBusinesses::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__relatedBusinessList object or NULL on error Send a request to a UDDI server to find a list of related businesses. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:find_service // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__find_USCOREservice @brief Represents a request to locate services that meet the specified requirements. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137715 See also @ref example1. */ /** @fn uddi2__find_USCOREservice::uddi2__find_USCOREservice(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the find_USCOREservice class. */ /** @fn uddi2__find_USCOREservice::uddi2__find_USCOREservice(struct soap *soap, const char *name) @brief @param[in] soap gSOAP context @param[in] name of the service Creates an instance of the find_USCOREservice class using the specified name. */ /** @fn uddi2__find_USCOREservice::uddi2__find_USCOREservice(struct soap *soap, std::vector keyedReferences) @brief @param[in] soap gSOAP context @param[in] keyedReferences collection of category keys Creates an instance of the find_USCOREservice class using the specified category keys. */ /** @fn uddi2__find_USCOREservice::uddi2__find_USCOREservice(struct soap *soap, std::vector tModelKeys) @brief @param[in] soap gSOAP context @param[in] tModelKeys collection of tModel key strings Creates an instance of the find_USCOREservice class using the specified tModel keys. */ /** @fn uddi2__serviceList* uddi2__find_USCOREservice::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__serviceList object or NULL on error Send a request to a UDDI server to find a list of services. See also @ref example1. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:find_tModel // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__find_USCOREtModel @brief Represents a request to locate a list of tModel entries that match a set of specific criteria. The result of a search is a uddi2__tModelList object that contains information about registered tModel data that matches the criteria. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137716 */ /** @fn uddi2__find_USCOREtModel::uddi2__find_USCOREtModel(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the find_USCOREtModel class. */ /** @fn uddi2__find_USCOREtModel::uddi2__find_USCOREtModel(struct soap *soap, const char *name) @brief @param[in] soap gSOAP context @param[in] name of the tModel Creates an instance of the find_USCOREtModel class using the specified tModel name. */ /** @fn uddi2__find_USCOREtModel::uddi2__find_USCOREtModel(struct soap *soap, std::vector keyedReferences) @brief @param[in] soap gSOAP context @param[in] keyedReferences collection of category keys Creates an instance of the find_USCOREtModel class using the specified category keys. */ /** @fn uddi2__tModelList* uddi2__find_USCOREtModel::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__tModelList object or NULL on error Send a request to a UDDI server to find a tModelList. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_bindingDetail // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREbindingDetail @brief Represents a request to get binding details from a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137717 */ /** @fn uddi2__get_USCOREbindingDetail::uddi2__get_USCOREbindingDetail(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREbindingDetail class. */ /** @fn uddi2__get_USCOREbindingDetail::uddi2__get_USCOREbindingDetail(struct soap *soap, const char *bindingKey) @brief @param[in] soap gSOAP context @param[in] bindingKey string Creates an instance of the get_USCOREbindingDetail class using the specified binding key. */ /** @fn uddi2__get_USCOREbindingDetail::uddi2__get_USCOREbindingDetail(struct soap *soap, std::vector bindingKeys) @brief @param[in] soap gSOAP context @param[in] bindingKeys collection of key strings Creates an instance of the get_USCOREbindingDetail class using the specified collection of binding keys. */ /** @fn uddi2__bindingDetail* uddi2__get_USCOREbindingDetail::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__bindingDetail object or NULL on error Send a request to a UDDI server to get the binding details. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_businessDetail // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREbusinessDetail @brief Represents a request to get business details from a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137718 */ /** @fn uddi2__get_USCOREbusinessDetail::uddi2__get_USCOREbusinessDetail(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREbusinessDetail class. */ /** @fn uddi2__get_USCOREbusinessDetail::uddi2__get_USCOREbusinessDetail(struct soap *soap, const char *businessKey) @brief @param[in] soap gSOAP context @param[in] businessKey string Creates an instance of the get_USCOREbusinessDetail class using the specified business key. */ /** @fn uddi2__get_USCOREbusinessDetail::uddi2__get_USCOREbusinessDetail(struct soap *soap, std::vector businessKeys) @brief @param[in] soap gSOAP context @param[in] businessKeys collection of key strings Creates an instance of the get_USCOREbusinessDetail class using the specified collection of business keys. */ /** @fn uddi2__businessDetail* uddi2__get_USCOREbusinessDetail::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__businessDetail object or NULL on error Send a request to a UDDI server to get the business details. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_businessDetailExt // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREbusinessDetailExt @brief Represents a request to get business details from a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137719 */ /** @fn uddi2__get_USCOREbusinessDetailExt::uddi2__get_USCOREbusinessDetailExt(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREbusinessDetailExt class. */ /** @fn uddi2__get_USCOREbusinessDetailExt::uddi2__get_USCOREbusinessDetailExt(struct soap *soap, const char *businessKey) @brief @param[in] soap gSOAP context @param[in] businessKey string Creates an instance of the get_USCOREbusinessDetailExt class using the specified business key. */ /** @fn uddi2__get_USCOREbusinessDetailExt::uddi2__get_USCOREbusinessDetailExt(struct soap *soap, std::vector businessKeys) @brief @param[in] soap gSOAP context @param[in] businessKeys collection of key strings Creates an instance of the get_USCOREbusinessDetailExt class using the specified collection of business keys. */ /** @fn uddi2__businessDetailExt* uddi2__get_USCOREbusinessDetailExt::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__businessDetailExt object or NULL on error Send a request to a UDDI server to get the business details. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_serviceDetail // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREserviceDetail @brief Represents a request to get service details from a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137720 */ /** @fn uddi2__get_USCOREserviceDetail::uddi2__get_USCOREserviceDetail(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREserviceDetail class. */ /** @fn uddi2__get_USCOREserviceDetail::uddi2__get_USCOREserviceDetail(struct soap *soap, const char *serviceKey) @brief @param[in] soap gSOAP context @param[in] serviceKey string Creates an instance of the get_USCOREserviceDetail class using the specified service key. */ /** @fn uddi2__get_USCOREserviceDetail::uddi2__get_USCOREserviceDetail(struct soap *soap, std::vector serviceKeys) @brief @param[in] soap gSOAP context @param[in] serviceKeys collection of key strings Creates an instance of the get_USCOREserviceDetail class using the specified collection of service keys. */ /** @fn uddi2__serviceDetail* uddi2__get_USCOREserviceDetail::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__serviceDetail object or NULL on error Send a request to a UDDI server to get the service details. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_tModelDetail // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREtModelDetail @brief Represents a request to get tModel details from a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137721 */ /** @fn uddi2__get_USCOREtModelDetail::uddi2__get_USCOREtModelDetail(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREtModelDetail class. */ /** @fn uddi2__get_USCOREtModelDetail::uddi2__get_USCOREtModelDetail(struct soap *soap, const char *tModelKey) @brief @param[in] soap gSOAP context @param[in] tModelKey string Creates an instance of the get_USCOREtModelDetail class using the specified tModel key. */ /** @fn uddi2__get_USCOREtModelDetail::uddi2__get_USCOREtModelDetail(struct soap *soap, std::vector tModelKeys) @brief @param[in] soap gSOAP context @param[in] tModelKeys collection of key strings Creates an instance of the get_USCOREtModelDetail class using the specified collection of tModel keys. */ /** @fn uddi2__tModelDetail* uddi2__get_USCOREtModelDetail::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__tModelDetail object or NULL on error Send a request to a UDDI server to get the tModel details. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:add_publisherAssertions // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__add_USCOREpublisherAssertions @brief Represents a request to add one or more publisher assertions to the assertion collection for an individual publisher. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137731 */ /** @fn uddi2__add_USCOREpublisherAssertions::uddi2__add_USCOREpublisherAssertions(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the add_USCOREpublisherAssertions class. */ /** @fn uddi2__add_USCOREpublisherAssertions::uddi2__add_USCOREpublisherAssertions(struct soap *soap, std::vector publisherAssertions) @brief @param[in] soap gSOAP context @param[in] publisherAssertions collection of publisher assertions Creates an instance of the add_USCOREpublisherAssertions class using the specified publisher assertions. */ /** @fn uddi2__dispositionReport *uddi2__add_USCOREpublisherAssertions::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__dispositionReport object or NULL on error Send a request to a UDDI server to add one or more publisher assertions to the assertion collection for an individual publisher. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:delete_binding // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__delete_USCOREbinding @brief Represents a request to delete a binding that meets the specified requirements. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137732 */ /** @fn uddi2__delete_USCOREbinding::uddi2__delete_USCOREbinding(struct soap *soap) @brief Creates an instance of the delete_USCOREbinding class. */ /** @fn uddi2__delete_USCOREbinding::uddi2__delete_USCOREbinding(struct soap *soap, const char *bindingKey) @brief @param[in] soap gSOAP context @param[in] bindingKey a binding key string Creates an instance of the delete_USCOREbinding class. */ /** @fn uddi2__delete_USCOREbinding::uddi2__delete_USCOREbinding(struct soap *soap, std::vector bindingKeys) @brief @param[in] soap gSOAP context @param[in] bindingKeys collection of binding keys Creates an instance of the delete_USCOREbinding class using the specified binding keys. */ /** @fn uddi2__dispositionReport *uddi2__delete_USCOREbinding::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__dispositionReport object or NULL on error Send a request to a UDDI service to delete a binding that meets the specified requirements. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:delete_business // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__delete_USCOREbusiness @brief Represents a request to delete a business that meets the specified requirements. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137733 */ /** @fn uddi2__delete_USCOREbusiness::uddi2__delete_USCOREbusiness(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the delete_USCOREbusiness class. */ /** @fn uddi2__delete_USCOREbusiness::uddi2__delete_USCOREbusiness(struct soap *soap, const char *businessKey) @brief @param[in] soap gSOAP context @param[in] businessKey a business key string Creates an instance of the delete_USCOREbusiness class using the specified business key. */ /** @fn uddi2__delete_USCOREbusiness::uddi2__delete_USCOREbusiness(struct soap *soap, std::vector businessKeys) @brief @param[in] soap gSOAP context @param[in] businessKeys collection of business keys Creates an instance of the delete_USCOREbusiness class using the specified business keys. */ /** @fn uddi2__dispositionReport *uddi2__delete_USCOREbusiness::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__dispositionReport object or NULL on error Send a request to a UDDI service to delete a business that meets the specified requirements. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:delete_service // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__delete_USCOREservice @brief Represents a request to delete a service that meets the specified requirements. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137735 */ /** @fn uddi2__delete_USCOREservice::uddi2__delete_USCOREservice(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the delete_USCOREservice class. */ /** @fn uddi2__delete_USCOREservice::uddi2__delete_USCOREservice(struct soap *soap, const char *serviceKey) @brief @param[in] soap gSOAP context @param[in] serviceKey a service key string Creates an instance of the delete_USCOREservice class using the specified service key. */ /** @fn uddi2__delete_USCOREservice::uddi2__delete_USCOREservice(struct soap *soap, std::vector serviceKeys) @brief @param[in] soap gSOAP context @param[in] serviceKeys collection of service keys Creates an instance of the delete_USCOREservice class using the specified service keys. */ /** @fn uddi2__dispositionReport *uddi2__delete_USCOREservice::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__dispositionReport object or NULL on error Send a request to a UDDI service to delete a service that meets the specified requirements. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:delete_tModel // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__delete_USCOREtModel @brief Represents a request to delete a tModel that meets the specified requirements. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137736 */ /** @fn uddi2__delete_USCOREtModel::uddi2__delete_USCOREtModel(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the delete_USCOREtModel class. */ /** @fn uddi2__delete_USCOREtModel::uddi2__delete_USCOREtModel(struct soap *soap, const char *tModelKey) @brief @param[in] soap gSOAP context @param[in] tModelKey a tModel key string Creates an instance of the delete_USCOREtModel class using the specified tModel key. */ /** @fn uddi2__delete_USCOREtModel::uddi2__delete_USCOREtModel(struct soap *soap, std::vector tModelKeys) @brief @param[in] soap gSOAP context @param[in] tModelKeys collection of tModel keys Creates an instance of the delete_USCOREtModel class using the specified tModel keys. */ /** @fn uddi2__dispositionReport *uddi2__delete_USCOREtModel::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__dispositionReport object or NULL on error Send a request to a UDDI service to delete a tModel that meets the specified requirements. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:delete_publisherAssertions // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__delete_USCOREpublisherAssertions @brief Represents a request to delete publisher assertions meeting the specified requirements. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137734 */ /** @fn uddi2__delete_USCOREpublisherAssertions::uddi2__delete_USCOREpublisherAssertions(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the delete_USCOREpublisherAssertions class. */ /** @fn uddi2__delete_USCOREpublisherAssertions::uddi2__delete_USCOREpublisherAssertions(struct soap *soap, std::vector publisherAssertions) @brief @param[in] soap gSOAP context @param[in] publisherAssertions a collection of publisher assertions Creates an instance of the delete_USCOREpublisherAssertions class using the specified collection of publisher assertions. */ /** @fn uddi2__dispositionReport *uddi2__delete_USCOREpublisherAssertions::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__dispositionReport object or NULL on error Send a request to a UDDI service to delete publisher assertions meeting the specified requirements. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:discard_authToken // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__discard_USCOREauthToken @brief Represents a request to discard an authorization token obtained with the get_USCOREauthToken class. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137737 */ /** @fn uddi2__discard_USCOREauthToken::uddi2__discard_USCOREauthToken(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the delete_USCOREauthToken class. */ /** @fn uddi2__discard_USCOREauthToken::uddi2__discard_USCOREauthToken(struct soap *soap, const char *authInfo) @brief @param[in] soap gSOAP context @param[in] authInfo authorization token provided by the UDDI server Creates an instance of the delete_USCOREauthToken class using the specified authentication token string. */ /** @fn uddi2__dispositionReport *uddi2__discard_USCOREauthToken::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__dispositionReport object or NULL on error Send a request to a UDDI service to discard an authentication token. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_assertionStatusReport // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREassertionStatusReport @brief Provides the ability to determine the status of current and outstanding publisher assertions. The results can be restricted by setting the completionStatus property. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137738 */ /** @fn uddi2__get_USCOREassertionStatusReport::uddi2__get_USCOREassertionStatusReport(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREassertionStatusReport class. */ /** @fn uddi2__get_USCOREassertionStatusReport::uddi2__get_USCOREassertionStatusReport(struct soap *soap, const char *completionStatus) @brief @param[in] soap gSOAP context @param[in] completionStatus completion status string Creates an instance of the get_USCOREassertionStatusReport class using the specified completion status. */ /** @fn uddi2__assertionStatusReport *uddi2__get_USCOREassertionStatusReport::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__assertionStatusReport object or NULL on error Send a request to a UDDI service to get the status of current and outstanding publisher assertions. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_authToken // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREauthToken @brief Represents a request to obtain an authorization token, which is represented by the uddi2__authToken class. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137739 */ /** @fn uddi2__get_USCOREauthToken::uddi2__get_USCOREauthToken(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREauthToken class. */ /** @fn uddi2__get_USCOREauthToken::uddi2__get_USCOREauthToken(struct soap *soap, const char *userid, const char *passwd) @brief @param[in] soap gSOAP context @param[in] userid the user ID string @param[in] passwd the password string Creates an instance of the get_USCOREauthToken class using the specified user ID and password. */ /** @fn uddi2__authToken *uddi2__get_USCOREauthToken::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__authToken object or NULL on error Send a request to a UDDI service to get a authorization token given a user ID and password. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_publisherAssertions // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREpublisherAssertions @brief Represents a request to obtain the full set of publisher assertions that are associated with an individual publisher. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137740 */ /** @fn uddi2__get_USCOREpublisherAssertions::uddi2__get_USCOREpublisherAssertions(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREpublisherAssetions class. */ /** @fn uddi2__publisherAssertions *uddi2__get_USCOREpublisherAssertions::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__publisherAssertions object or NULL on error Send a request to a UDDI service to get publisher assertions. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_registeredInfo // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREregisteredInfo @brief Represents a request to get all registered business entities and tModels controlled by an individual. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137741 */ /** @fn uddi2__get_USCOREregisteredInfo::uddi2__get_USCOREregisteredInfo(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREregisteredInfo class. */ /** @fn uddi2__registeredInfo *uddi2__get_USCOREregisteredInfo::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__registeredInfo object or NULL on error Send a request to a UDDI service to get all registered business entities and tModels controlled by an individual. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:save_binding // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__save_USCOREbinding @brief Represents a request to post binding information on a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137742 */ /** @fn uddi2__save_USCOREbinding::uddi2__save_USCOREbinding(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the save_USCOREbinding class. */ /** @fn uddi2__save_USCOREbinding::uddi2__save_USCOREbinding(struct soap *soap, uddi2__bindingTemplate &bindingTemplate) @brief @param[in] soap gSOAP context @param[in] bindingTemplate binding template Creates an instance of the save_USCOREbinding class using the specified binding template. */ /** @fn uddi2__save_USCOREbinding::uddi2__save_USCOREbinding(struct soap *soap, std::vector bindingTemplates) @brief @param[in] soap gSOAP context @param[in] bindingTemplates collection of binding templates Creates an instance of the save_USCOREbinding class using the specified binding templates. */ /** @fn uddi2__bindingDetail *uddi2__save_USCOREbinding::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__bindingDetail object or NULL on error Send a request to a UDDI server to post binding information on the server. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:save_business // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__save_USCOREbusiness @brief Represents a request to post business information on a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137743 */ /** @fn uddi2__save_USCOREbusiness::uddi2__save_USCOREbusiness(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the save_USCOREbusiness class. */ /** @fn uddi2__save_USCOREbusiness::uddi2__save_USCOREbusiness(struct soap *soap, uddi2__businessEntity &businessEntity) @brief @param[in] soap gSOAP context @param[in] businessEntity business entity Creates an instance of the save_USCOREbusiness class using the specified business entity. */ /** @fn uddi2__save_USCOREbusiness::uddi2__save_USCOREbusiness(struct soap *soap, std::vector businessEntities) @brief @param[in] soap gSOAP context @param[in] businessEntities collection of business entities Creates an instance of the save_USCOREbusiness class using the specified business entities. */ /** @fn uddi2__businessDetail *uddi2__save_USCOREbusiness::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__businessDetail object or NULL on error Send a request to a UDDI server to post business information on the server. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:save_service // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__save_USCOREservice @brief Represents a request to post service information on a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137744 */ /** @fn uddi2__save_USCOREservice::uddi2__save_USCOREservice(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the save_USCOREservice class. */ /** @fn uddi2__save_USCOREservice::uddi2__save_USCOREservice(struct soap *soap, uddi2__businessService &businessService) @brief @param[in] soap gSOAP context @param[in] businessService business service Creates an instance of the save_USCOREservice class using the specified service. */ /** @fn uddi2__save_USCOREservice::uddi2__save_USCOREservice(struct soap *soap, std::vector businessServices) @brief @param[in] soap gSOAP context @param[in] businessServices collection of business services Creates an instance of the save_USCOREservice class using the specified services. */ /** @fn uddi2__serviceDetail *uddi2__save_USCOREservice::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__serviceDetail object or NULL on error Send a request to a UDDI server to post service information on the server. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:save_tModel // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__save_USCOREtModel @brief Represents a request to post tModel information on a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137745 */ /** @fn uddi2__save_USCOREtModel::uddi2__save_USCOREtModel(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the save_USCOREtModel class. */ /** @fn uddi2__save_USCOREtModel::uddi2__save_USCOREtModel(struct soap *soap, uddi2__tModel &tModel) @brief @param[in] soap gSOAP context @param[in] tModel a tModel Creates an instance of the save_USCOREtModel class using the specified tModel. */ /** @fn uddi2__save_USCOREtModel::uddi2__save_USCOREtModel(struct soap *soap, std::vector tModels) @brief @param[in] soap gSOAP context @param[in] tModels collection of tModels Creates an instance of the save_USCOREtModel class using the specified tModels. */ /** @fn uddi2__tModelDetail *uddi2__save_USCOREtModel::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__tModelDetail object or NULL on error Send a request to a UDDI server to post tModel information on the server. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:set_publisherAssertions // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__set_USCOREpublisherAssertions @brief Represents a request to modify the existing publisher assertions for an individual publisher. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137746 */ /** @fn uddi2__set_USCOREpublisherAssertions::uddi2__set_USCOREpublisherAssertions(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the set_USCOREpublisherAssertions class. */ /** @fn uddi2__set_USCOREpublisherAssertions::uddi2__set_USCOREpublisherAssertions(struct soap *soap, std::vector publisherAssertions) @brief @param[in] soap gSOAP context @param[in] publisherAssertions collection of publisher assertions Creates an instance of the set_USCOREpublisherAssertions class using the specified collection of publisher assertions. */ /** @fn uddi2__publisherAssertions *uddi2__set_USCOREpublisherAssertions::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__publisherAssertions object or NULL on error Send a request to a UDDI server to post tModel information on the server. */ //////////////////////////////////////////////////////////////////////////////// // // Code Examples // //////////////////////////////////////////////////////////////////////////////// /** @page example1 Code Example 1: Finding a service This example shows you how to find Web services. In this case, the example finds Web services with names that begin with the word "magic". @code #include "inqH.h" int main(int argc, char **argv) { char *search_string = "magic"; if (argc > 1) search_string = argv[1]; // Create a gSOAP context struct soap *soap = soap_new(); // Create an object to find a business uddi2__find_USCOREservice fs(soap, search_string); // Send the request uddi2__serviceList *sl = fs.send("http://uddi.xmethods.net/inquire"); // Check if result is OK if (!sl) soap_print_fault(soap, stderr); // If OK, report the service name(s) and unique identification keys else if (sl->serviceInfos) { std::cout << "Search results on " << search_string << ":" << std::endl << std::endl; for (std::vector::const_iterator si = sl->serviceInfos->serviceInfo.begin(); si != sl->serviceInfos->serviceInfo.end(); ++si) { // Report serviceKey and businessKey std::cout << "serviceKey=" << (*si)->serviceKey << std::endl << "businessKey=" << (*si)->businessKey << std::endl; // Report names for (std::vector::const_iterator n = (*si)->name.begin(); n != (*si)->name.end(); ++n) std::cout << "name=" << (*n)->__item << std::endl; std::cout << std::endl; } } // Remove deserialized objects soap_destroy(soap); // Remove temporary data soap_end(soap); // Detach and free context soap_done(soap); free(soap); return 0; } @endcode To compile: - wsdl2h -tuddi2-typemap.dat inquire_v2.wsdl - soapcpp2 -I.. -pinq inquire_v2.h - g++ -DWITH_NONAMESPACES -I.. -o example1 example1.cpp inquire_v2.cpp inqC.cpp inqClient.cpp ../stdsoap2.cpp */ /** @page example2 Code Example 2: Finding a business This example shows you how to find a business from a UDDI server. @code #include "inqH.h" int main(int argc, char **argv) { char *search_string = "xmethods"; if (argc > 1) search_string = argv[1]; // Create a gSOAP context struct soap *soap = soap_new(); // Create an object to find a business uddi2__find_USCOREbusiness fb(soap, search_string); // Send the request uddi2__businessList *bl = fb.send("http://uddi.xmethods.net/inquire"); // Check if result is OK if (!bl) soap_print_fault(soap, stderr); // If OK, report the business name(s) and unique identification keys else if (bl->businessInfos) { std::cout << "Search results on " << search_string << ":" << std::endl << std::endl; for (std::vector::const_iterator bi = bl->businessInfos->businessInfo.begin(); bi != bl->businessInfos->businessInfo.end(); ++bi) { // Report businessKey std::cout << "businessKey=" << (*bi)->businessKey << std::endl; // Report names for (std::vector::const_iterator n = (*bi)->name.begin(); n != (*bi)->name.end(); ++n) std::cout << "name=" << (*n)->__item << std::endl; std::cout << std::endl; } } // Remove deserialized objects soap_destroy(soap); // Remove temporary data soap_end(soap); // Detach and free context soap_done(soap); free(soap); return 0; } @endcode To compile: - wsdl2h -tuddi2-typemap.dat inquire_v2.wsdl - soapcpp2 -I.. -pinq inquire_v2.h - g++ -DWITH_NONAMESPACES -I.. -o example2 example2.cpp inquire_v2.cpp inqC.cpp inqClient.cpp ../stdsoap2.cpp */ /** @page example3 Code Example 3: Publishing a WSDL and service on XMethods This example shows you how to publish a Web service. In this case, the example template code obtains an authorization token, saves the tModel with the WSDL URL in the server, and saves the business service information in the server. @code #include "pubH.h" const char *server = "https://uddi.xmethods.net/publish"; const char *userid = "..."; // user ID to access UDDI server const char *passwd = "..."; // password to access UDDI server int main(int argc, char **argv) { // Create a gSOAP context struct soap *soap = soap_new(); // Setup SSL context (optional) to verify server's credentials if (soap_ssl_client_context(soap, SOAP_SSL_DEFAULT, NULL, NULL, "cacerts.pem", NULL, NULL)) { soap_print_fault(soap, stderr); exit(1); } // Step 1: Get an authorization token from the UDDI server uddi2__get_USCOREauthToken get_authToken(soap, userid, passwd); uddi2__authToken *authToken = get_authToken.send(server); // Check if authorized if (!authToken) { soap_print_fault(soap, stderr); exit(1); } // Authorization info provided by server for this session char *authInfo = authToken->authInfo; // Step 2: Create a tModel for the WSDL to be published uddi2__tModel tModel; tModel.soap_default(soap); // Create the tModel and service name tModel.name = soap_new_uddi2__name(soap, -1); tModel.name->__item = "..."; tModel.name->xml__lang_ = "en"; // Create XMethods description elements (see http://www.xmethods.net/ve2/UDDI.po) uddi2__description *description = soap_new_uddi2__description(soap, 6); description[0].__item = "SHORT DESCRIPTION: ..."; description[0].xml__lang_ = "en"; description[1].__item = "SHORT DESCRIPTION: ..."; description[1].xml__lang_ = "en"; description[2].__item = "USAGE NOTES: ..."; description[2].xml__lang_ = "en"; description[3].__item = "HOMEPAGE URL: ..."; description[3].xml__lang_ = "en"; description[4].__item = "CONTACT EMAIL: ..."; description[4].xml__lang_ = "en"; description[5].__item = "IMPLEMENTATION: ..."; description[5].xml__lang_ = "en"; // Add the four description elements to the tModel tModel.description.push_back(description + 0); tModel.description.push_back(description + 1); tModel.description.push_back(description + 2); tModel.description.push_back(description + 4); // Add an overviewDoc element with description and overviewURL tModel.overviewDoc = soap_new_uddi2__overviewDoc(soap, -1); tModel.overviewDoc->soap_default(soap); tModel.overviewDoc->description.push_back(soap_new_uddi2__description(soap, -1)); tModel.overviewDoc->description[0]->__item = "WSDL source document"; tModel.overviewDoc->description[0]->xml__lang_ = "en"; tModel.overviewDoc->overviewURL = "http://.../my.wsdl#bindingName"; // Omit identifier bag tModel.identifierBag = NULL; // Add a category with a WSDL-specific keyedReference tModel.categoryBag = soap_new_uddi2__categoryBag(soap, -1); tModel.categoryBag->soap_default(soap); tModel.categoryBag->keyedReference.push_back(soap_new_uddi2__keyedReference(soap, -1)); tModel.categoryBag->keyedReference[0]->tModelKey = "..."; tModel.categoryBag->keyedReference[0]->keyName = "uddi-org:types"; tModel.categoryBag->keyedReference[0]->keyValue = "wsdlSpec"; tModel.authorizedName = "..."; tModel.operator_ = "..."; tModel.tModelKey = "..."; // Save the tModel uddi2__save_USCOREtModel save_tModel(soap, tModel); uddi2__tModelDetail *tModelDetail = save_tModel.send(server, authInfo); // Step 3: Create a new service to be published uddi2__businessService service; service.soap_default(soap); // Service name is the tModel name (XMethods) service.name.push_back(tModel.name); // Add two description elements to the service service.description.push_back(description + 4); service.description.push_back(description + 5); // Create binding template uddi2__bindingTemplate bindingTemplate; bindingTemplate.soap_default(soap); bindingTemplate.tModelInstanceDetails = soap_new_uddi2__tModelInstanceDetails(soap, -1); bindingTemplate.tModelInstanceDetails->tModelInstanceInfo.push_back(soap_new_uddi2__tModelInstanceInfo(soap, -1)); bindingTemplate.tModelInstanceDetails->tModelInstanceInfo[0]->instanceDetails = NULL; bindingTemplate.tModelInstanceDetails->tModelInstanceInfo[0]->tModelKey = tModel.tModelKey; bindingTemplate.accessPoint = soap_new_uddi2__accessPoint(soap, -1); bindingTemplate.accessPoint->__item = "..."; bindingTemplate.accessPoint->URLType = uddi2__URLType__http; bindingTemplate.hostingRedirector = NULL; bindingTemplate.serviceKey = "..."; bindingTemplate.bindingKey = "..."; // Add binding Template to service service.bindingTemplates = soap_new_uddi2__bindingTemplates(soap, -1); service.bindingTemplates->soap_default(soap); service.bindingTemplates->bindingTemplate.push_back(&bindingTemplate); service.categoryBag = NULL; service.serviceKey = "..."; service.businessKey = "..."; // Save the service uddi2__save_USCOREservice save_service(soap, service); uddi2__serviceDetail *serviceDetail = save_service.send(server, authInfo); // Step 4: Discard authorization token uddi2__discard_USCOREauthToken discard_authToken(soap, authInfo); uddi2__dispositionReport *dispositionReport = discard_authToken.send(server); // Remove deserialized objects soap_destroy(soap); // Remove temporary data soap_end(soap); // Detach and free context soap_done(soap); free(soap); return 0; } @endcode To compile: - wsdl2h -tuddi2-typemap.dat publish_v2.wsdl - soapcpp2 -I.. -ppub publish_v2.h - g++ -DWITH_OPENSSL -DWITH_NONAMESPACES -I.. -o example3 example3.cpp publish_v2.cpp pubC.cpp pubClient.cpp ../stdsoap2.cpp */ ] ################################################################################ # # UDDI v2 XML namespaces # ################################################################################ inq2 = "urn:uddi-org:inquiry_v2" pub2 = "urn:uddi-org:publication_v2" uddi2 = "urn:uddi-org:api_v2" ################################################################################ # # Type Definitions # ################################################################################ # Use regular C strings only: xsd__string = | char* | char* ################################################################################ # # Class/Struct Extensions # ################################################################################ # uddi2:find_binding object extended with con/de-structors and send() uddi2__find_USCOREbinding = $ uddi2__find_USCOREbinding(struct soap*); uddi2__find_USCOREbinding = $ uddi2__find_USCOREbinding(struct soap*, const char *tModelKey); uddi2__find_USCOREbinding = $ uddi2__find_USCOREbinding(struct soap*, std::vector tModelKeys); uddi2__find_USCOREbinding = $ uddi2__bindingDetail *send(const char *endpoint); # uddi2:find_business object extended with con/de-structors and send() uddi2__find_USCOREbusiness = $ uddi2__find_USCOREbusiness(struct soap*); uddi2__find_USCOREbusiness = $ uddi2__find_USCOREbusiness(struct soap*, const char *name); uddi2__find_USCOREbusiness = $ uddi2__find_USCOREbusiness(struct soap*, std::vector tModelKeys); uddi2__find_USCOREbusiness = $ uddi2__find_USCOREbusiness(struct soap*, std::vector keyedReferences); uddi2__find_USCOREbusiness = $ uddi2__businessList *send(const char *endpoint); # uddi2:find_relatedBusinesses object extended with con/de-structors and send() uddi2__find_USCORErelatedBusinesses = $ uddi2__find_USCORErelatedBusinesses(struct soap*); uddi2__find_USCORErelatedBusinesses = $ uddi2__find_USCORErelatedBusinesses(struct soap*, const char *businessKey); uddi2__find_USCORErelatedBusinesses = $ uddi2__relatedBusinessesList *send(const char *endpoint); # uddi2:find_service object extended with con/de-structors and send() uddi2__find_USCOREservice = $ uddi2__find_USCOREservice(struct soap*); uddi2__find_USCOREservice = $ uddi2__find_USCOREservice(struct soap*, const char *name); uddi2__find_USCOREservice = $ uddi2__find_USCOREservice(struct soap*, std::vector tModelKeys); uddi2__find_USCOREservice = $ uddi2__find_USCOREservice(struct soap*, std::vector keyedReferences); uddi2__find_USCOREservice = $ uddi2__serviceList* send(const char *endpoint); # uddi2:find_tModel object extended with con/de-structors and send() uddi2__find_USCOREtModel = $ uddi2__find_USCOREtModel(struct soap*); uddi2__find_USCOREtModel = $ uddi2__find_USCOREtModel(struct soap*, const char *name); uddi2__find_USCOREtModel = $ uddi2__find_USCOREtModel(struct soap*, std::vector keyedReferences); uddi2__find_USCOREtModel = $ uddi2__tModelList* send(const char *endpoint); # uddi2:get_bindingDetail object extended with con/de-structors and send() uddi2__get_USCOREbindingDetail = $ uddi2__get_USCOREbindingDetail(struct soap*); uddi2__get_USCOREbindingDetail = $ uddi2__get_USCOREbindingDetail(struct soap*, const char *bindingKey); uddi2__get_USCOREbindingDetail = $ uddi2__get_USCOREbindingDetail(struct soap*, std::vector bindingKeys); uddi2__get_USCOREbindingDetail = $ uddi2__bindingDetail* send(const char *endpoint); # uddi2:get_businessDetail object extended with con/de-structors and send() uddi2__get_USCOREbusinessDetail = $ uddi2__get_USCOREbusinessDetail(struct soap*); uddi2__get_USCOREbusinessDetail = $ uddi2__get_USCOREbusinessDetail(struct soap*, const char *businessKey); uddi2__get_USCOREbusinessDetail = $ uddi2__get_USCOREbusinessDetail(struct soap*, std::vector businessKeys); uddi2__get_USCOREbusinessDetail = $ uddi2__businessDetail* send(const char *endpoint); # uddi2:get_businessDetailExt object extended with con/de-structors and send() uddi2__get_USCOREbusinessDetailExt = $ uddi2__get_USCOREbusinessDetailExt(struct soap*); uddi2__get_USCOREbusinessDetailExt = $ uddi2__get_USCOREbusinessDetailExt(struct soap*, const char *businessKey); uddi2__get_USCOREbusinessDetailExt = $ uddi2__get_USCOREbusinessDetailExt(struct soap*, std::vector businessKeys); uddi2__get_USCOREbusinessDetailExt = $ uddi2__businessDetailExt* send(const char *endpoint); # uddi2:get_serviceDetail object extended with con/de-structors and send() uddi2__get_USCOREserviceDetail = $ uddi2__get_USCOREserviceDetail(struct soap*); uddi2__get_USCOREserviceDetail = $ uddi2__get_USCOREserviceDetail(struct soap*, const char *serviceKey); uddi2__get_USCOREserviceDetail = $ uddi2__get_USCOREserviceDetail(struct soap*, std::vector serviceKeys); uddi2__get_USCOREserviceDetail = $ uddi2__serviceDetail* send(const char *endpoint); # uddi2:get_tModelDetail object extended with con/de-structors and send() uddi2__get_USCOREtModelDetail = $ uddi2__get_USCOREtModelDetail(struct soap*); uddi2__get_USCOREtModelDetail = $ uddi2__get_USCOREtModelDetail(struct soap*, const char *tModelKey); uddi2__get_USCOREtModelDetail = $ uddi2__get_USCOREtModelDetail(struct soap*, std::vector tModelKeys); uddi2__get_USCOREtModelDetail = $ uddi2__tModelDetail* send(const char *endpoint); # uddi2:add_publisherAssertions object extended with con/de-structors and send() uddi2__add_USCOREpublisherAssertions = $ uddi2__add_USCOREpublisherAssertions(struct soap*); uddi2__add_USCOREpublisherAssertions = $ uddi2__add_USCOREpublisherAssertions(struct soap*, std::vector publisherAssertions); uddi2__add_USCOREpublisherAssertions = $ uddi2__dispositionReport* send(const char *endpoint, char *authInfo); # uddi2:delete_binding object extended with con/de-structors and send() uddi2__delete_USCOREbinding = $ uddi2__delete_USCOREbinding(struct soap*); uddi2__delete_USCOREbinding = $ uddi2__delete_USCOREbinding(struct soap*, const char *bindingKey); uddi2__delete_USCOREbinding = $ uddi2__delete_USCOREbinding(struct soap*, std::vector bindingKeys); uddi2__delete_USCOREbinding = $ uddi2__dispositionReport* send(const char *endpoint, char *authInfo); # uddi2:delete_business object extended with con/de-structors and send() uddi2__delete_USCOREbusiness = $ uddi2__delete_USCOREbusiness(struct soap*); uddi2__delete_USCOREbusiness = $ uddi2__delete_USCOREbusiness(struct soap*, const char *businessKey); uddi2__delete_USCOREbusiness = $ uddi2__delete_USCOREbusiness(struct soap*, std::vector businessKeys); uddi2__delete_USCOREbusiness = $ uddi2__dispositionReport* send(const char *endpoint, char *authInfo); # uddi2:delete_service object extended with con/de-structors and send() uddi2__delete_USCOREservice = $ uddi2__delete_USCOREservice(struct soap*); uddi2__delete_USCOREservice = $ uddi2__delete_USCOREservice(struct soap*, const char *serviceKey); uddi2__delete_USCOREservice = $ uddi2__delete_USCOREservice(struct soap*, std::vector serviceKeys); uddi2__delete_USCOREservice = $ uddi2__dispositionReport* send(const char *endpoint, char *authInfo); # uddi2:delete_tModel object extended with con/de-structors and send() uddi2__delete_USCOREtModel = $ uddi2__delete_USCOREtModel(struct soap*); uddi2__delete_USCOREtModel = $ uddi2__delete_USCOREtModel(struct soap*, const char *tModelKey); uddi2__delete_USCOREtModel = $ uddi2__delete_USCOREtModel(struct soap*, std::vector tModelKeys); uddi2__delete_USCOREtModel = $ uddi2__dispositionReport* send(const char *endpoint, char *authInfo); # uddi2:delete_publisherAssertions object extended with con/de-structors and send() uddi2__delete_USCOREpublisherAssertions = $ uddi2__delete_USCOREpublisherAssertions(struct soap*); uddi2__delete_USCOREpublisherAssertions = $ uddi2__delete_USCOREpublisherAssertions(struct soap*, std::vector publisherAssertions); uddi2__delete_USCOREpublisherAssertions = $ uddi2__dispositionReport* send(const char *endpoint, char *authInfo); # uddi2:discard_authToken object extended with con/de-structors and send() uddi2__discard_USCOREauthToken = $ uddi2__discard_USCOREauthToken(struct soap*); uddi2__discard_USCOREauthToken = $ uddi2__discard_USCOREauthToken(struct soap*, const char *authInfo); uddi2__discard_USCOREauthToken = $ uddi2__dispositionReport* send(const char *endpoint); # uddi2:get_assertionStatusReport object extended with con/de-structors and send() uddi2__get_USCOREassertionStatusReport = $ uddi2__get_USCOREassertionStatusReport(struct soap*); uddi2__get_USCOREassertionStatusReport = $ uddi2__get_USCOREassertionStatusReport(struct soap*, const char *completionStatus); uddi2__get_USCOREassertionStatusReport = $ uddi2__assertionStatusReport* send(const char *endpoint, char *authInfo); # uddi2:get_authToken object extended with con/de-structors and send() uddi2__get_USCOREauthToken = $ uddi2__get_USCOREauthToken(struct soap*); uddi2__get_USCOREauthToken = $ uddi2__get_USCOREauthToken(struct soap*, const char *userid, const char *passwd); uddi2__get_USCOREauthToken = $ uddi2__authToken* send(const char *endpoint); # uddi2:get_publisherAssertions object extended with con/de-structors and send() uddi2__get_USCOREpublisherAssertions = $ uddi2__get_USCOREpublisherAssertions(struct soap*); uddi2__get_USCOREpublisherAssertions = $ uddi2__publisherAssertions* send(const char *endpoint, char *authInfo); # uddi2:get_registeredInfo object extended with con/de-structors and send() uddi2__get_USCOREregisteredInfo = $ uddi2__get_USCOREregisteredInfo(struct soap*); uddi2__get_USCOREregisteredInfo = $ uddi2__registeredInfo* send(const char *endpoint, char *authInfo); # uddi2:save_binding object extended with con/de-structors and send() uddi2__save_USCOREbinding = $ uddi2__save_USCOREbinding(struct soap*); uddi2__save_USCOREbinding = $ uddi2__save_USCOREbinding(struct soap*, uddi2__bindingTemplate &bindingTemplate); uddi2__save_USCOREbinding = $ uddi2__save_USCOREbinding(struct soap*, std::vector bindingTemplates); uddi2__save_USCOREbinding = $ uddi2__bindingDetail* send(const char *endpoint, char *authInfo); # uddi2:save_business object extended with con/de-structors and send() uddi2__save_USCOREbusiness = $ uddi2__save_USCOREbusiness(struct soap*); uddi2__save_USCOREbusiness = $ uddi2__save_USCOREbusiness(struct soap*, uddi2__businessEntity &businessEntity); uddi2__save_USCOREbusiness = $ uddi2__save_USCOREbusiness(struct soap*, std::vector businessEntities); uddi2__save_USCOREbusiness = $ uddi2__businessDetail* send(const char *endpoint, char *authInfo); # uddi2:save_service object extended with con/de-structors and send() uddi2__save_USCOREservice = $ uddi2__save_USCOREservice(struct soap*); uddi2__save_USCOREservice = $ uddi2__save_USCOREservice(struct soap*, uddi2__businessService &businessService); uddi2__save_USCOREservice = $ uddi2__save_USCOREservice(struct soap*, std::vector businessServices); uddi2__save_USCOREservice = $ uddi2__serviceDetail* send(const char *endpoint, char *authInfo); # uddi2:save_tModel object extended with con/de-structors and send() uddi2__save_USCOREtModel = $ uddi2__save_USCOREtModel(struct soap*); uddi2__save_USCOREtModel = $ uddi2__save_USCOREtModel(struct soap*, uddi2__tModel &tModel); uddi2__save_USCOREtModel = $ uddi2__save_USCOREtModel(struct soap*, std::vector tModels); uddi2__save_USCOREtModel = $ uddi2__tModelDetail* send(const char *endpoint, char *authInfo); # uddi2:set_publisherAssertions object extended with con/de-structors and send() uddi2__set_USCOREpublisherAssertions = $ uddi2__set_USCOREpublisherAssertions(struct soap*); uddi2__set_USCOREpublisherAssertions = $ uddi2__set_USCOREpublisherAssertions(struct soap*, std::vector publisherAssertions); uddi2__set_USCOREpublisherAssertions = $ uddi2__publisherAssertions* send(const char *endpoint, char *authInfo); gsoap-2.8.28/gsoap/uddi2/Makefile0000644000175000017500000000402412653650160016050 0ustar ellertellert.SUFFIXES: .wsdl .xsd GSOAP=../bin/soapcpp2 WSDL2H=../bin/wsdl2h SOAPH=../stdsoap2.h SOAPC=../stdsoap2.c SOAPCPP=../stdsoap2.cpp SOAPDOMC=../dom.c SOAPDOMCPP=../dom.cpp CC=gcc CPP=g++ LIBS= COFLAGS=-O2 CWFLAGS=-Wall CIFLAGS=-I../ CMFLAGS=-DWITH_NONAMESPACES CFLAGS= $(CWFLAGS) $(COFLAGS) $(CIFLAGS) $(CMFLAGS) all: example1 example2 example1: example1.cpp inqClientLib.o inquire_v2.o $(SOAPCPP) envC.o $(CPP) $(CFLAGS) -o example1 example1.cpp inqClientLib.o inquire_v2.o $(SOAPCPP) envC.o example2: example2.cpp inqClientLib.o inquire_v2.o $(SOAPCPP) envC.o $(CPP) $(CFLAGS) -o example2 example2.cpp inqClientLib.o inquire_v2.o $(SOAPCPP) envC.o example3: example3.cpp pubClientLib.o publish_v2.o $(SOAPCPP) envC.o $(CPP) $(CFLAGS) -DWITH_OPENSSL -o example3 example3.cpp pubClientLib.o publish_v2.o $(SOAPCPP) envC.o -lssl -lcrypto uddiClientLib.cpp: uddi_v2.h inquire_v2.h publish_v2.h $(GSOAP) -I.. -C -p uddi uddi_v2.h $(GSOAP) -I.. -C -p inq inquire_v2.h $(GSOAP) -I.. -C -p pub publish_v2.h inqClientLib.cpp: inquire_v2.h $(GSOAP) -I.. -C -p inq inquire_v2.h pubClientLib.cpp: publish_v2.h $(GSOAP) -I.. -C -p pub publish_v2.h envC.cpp: echo '' > env.h $(GSOAP) -I.. -CSL -p env env.h .c.o: $(CPP) $(CFLAGS) -c $< .cpp.o: $(CPP) $(CFLAGS) -c $< uddi_v2.h: inquire_v2.wsdl publish_v2.wsdl uddi_v2.xsd uddi2-typemap.dat $(WSDL2H) -tuddi2-typemap.dat -ouddi_v2.h inquire_v2.wsdl publish_v2.wsdl inquire_v2.h: inquire_v2.wsdl uddi_v2.xsd uddi2-typemap.dat $(WSDL2H) -tuddi2-typemap.dat inquire_v2.wsdl publish_v2.h: publish_v2.wsdl uddi_v2.xsd uddi2-typemap.dat $(WSDL2H) -tuddi2-typemap.dat publish_v2.wsdl .PHONY: clean distclean clean: rm -f *.o *.log *.xml *.nsmap *Stub.h inqH.h pubH.h uddiH.h *Proxy.h *Object.h inqC*.cpp inqS*.cpp pubC*.cpp pubS*.cpp uddiC*.cpp uddiS*.cpp env*.h env*.cpp distclean: rm -f *.o *.log *.xml *.nsmap *Stub.h inqH.h pubH.h uddiH.h *Proxy.h *Object.h inqC*.cpp inqS*.cpp pubC*.cpp pubS*.cpp uddiC*.cpp uddiS*.cpp env*.h env*.cpp rm -f example1 example2 example3 gsoap-2.8.28/gsoap/uddi2/example2.cpp0000644000175000017500000000530212653650160016631 0ustar ellertellert/* example2.cpp Example UDDI V2 Client -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2004-2005, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "inqH.h" int main(int argc, char **argv) { char *search_string = "xmethods"; if (argc > 1) search_string = argv[1]; // Create a gSOAP context struct soap *soap = soap_new(); // Create an object to find a business uddi2__find_USCOREbusiness fb(soap, search_string); // Send the request uddi2__businessList *bl = fb.send("http://uddi.xmethods.net/inquire"); // Check if result is OK if (!bl) soap_print_fault(soap, stderr); // If OK, report the business name(s) and unique identification keys else if (bl->businessInfos) { std::cout << "Search results on " << search_string << ":" << std::endl << std::endl; for (std::vector::const_iterator bi = bl->businessInfos->businessInfo.begin(); bi != bl->businessInfos->businessInfo.end(); ++bi) { // Report businessKey std::cout << "businessKey=" << (*bi)->businessKey << std::endl; // Report names for (std::vector::const_iterator n = (*bi)->name.begin(); n != (*bi)->name.end(); ++n) std::cout << "name=" << (*n)->__item << std::endl; std::cout << std::endl; } } // Remove deserialized objects soap_destroy(soap); // Remove temporary data soap_end(soap); // Detach and free context soap_done(soap); free(soap); return 0; } gsoap-2.8.28/gsoap/uddi2/publish_v2.h0000644000175000017500000045566112653650160016657 0ustar ellertellert/** @mainpage gSOAP UDDI v2 Universal Description, Discovery and Integration, or UDDI, is the name of a group of web-based registries that expose information about a business or other entity and its technical interfaces. See the UDDI v2 specification @url http://uddi.org/pubs/ProgrammersAPI_v2.htm for more details. @section UDDI2_CLASSES Classes See Related Pages for examples. UDDI Inquire classes - @ref uddi2__find_USCOREbinding - @ref uddi2__find_USCOREbusiness - @ref uddi2__find_USCORErelatedBusinesses - @ref uddi2__find_USCOREservice - @ref uddi2__find_USCOREtModel - @ref uddi2__get_USCOREbindingDetail - @ref uddi2__get_USCOREbusinessDetail - @ref uddi2__get_USCOREbusinessDetailExt - @ref uddi2__get_USCOREserviceDetail - @ref uddi2__get_USCOREtModelDetail UDDI Publish classes - @ref uddi2__add_USCOREpublisherAssertions - @ref uddi2__delete_USCOREbinding - @ref uddi2__delete_USCOREbusiness - @ref uddi2__delete_USCOREservice - @ref uddi2__delete_USCOREtModel - @ref uddi2__delete_USCOREpublisherAssertions - @ref uddi2__discard_USCOREauthToken - @ref uddi2__get_USCOREassertionStatusReport - @ref uddi2__get_USCOREauthToken - @ref uddi2__get_USCOREpublisherAssertions - @ref uddi2__get_USCOREregisteredInfo - @ref uddi2__save_USCOREbinding - @ref uddi2__save_USCOREbusiness - @ref uddi2__save_USCOREservice - @ref uddi2__save_USCOREtModel - @ref uddi2__set_USCOREpublisherAssertions @section UDDI2_BINDINGS Binding Reference - @ref InquireSoap - @ref PublishSoap */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:find_binding // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__find_USCOREbinding @brief Represents a request to locate bindings that meet the specified requirements. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137712 */ /** @fn uddi2__find_USCOREbinding::uddi2__find_USCOREbinding(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the find_USCOREbinding class. */ /** @fn uddi2__find_USCOREbinding::uddi2__find_USCOREbinding(struct soap *soap, const char *tModelKey) @brief @param[in] soap gSOAP context @param[in] tModelKey string Creates an instance of the find_USCOREbinding class using the specified tModel key. */ /** @fn uddi2__find_USCOREbinding::uddi2__find_USCOREbinding(struct soap *soap, std::vector tModelKeys) @brief @param[in] soap gSOAP context @param[in] tModelKeys collection of tModel key strings Creates an instance of the find_USCOREbinding class using the specified tModel keys. */ /** @fn uddi2__bindingDetail* uddi2__find_USCOREbinding::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__bindingDetail object or NULL on error Send a request to a UDDI server to find binding details. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:find_business // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__find_USCOREbusiness @brief Represents a request to locate businesses that meet specific requirements. When the send method is called, the instance returns a uddi2__businessList object that contains a list of business that matched the search criteria. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137713 See also @ref example2. */ /** @fn uddi2__find_USCOREbusiness::uddi2__find_USCOREbusiness(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the find_USCOREbusiness class. */ /** @fn uddi2__find_USCOREbusiness::uddi2__find_USCOREbusiness(struct soap *soap, const char *name) @brief @param[in] soap gSOAP context Creates an instance of the find_USCOREbusiness class using the specified name of the requested business. */ /** @fn uddi2__find_USCOREbusiness::uddi2__find_USCOREbusiness(struct soap *soap, std::vector keyedReferences) @brief @param[in] soap gSOAP context Creates an instance of the find_USCOREbusiness class using the specified category references. */ /** @fn uddi2__find_USCOREbusiness::uddi2__find_USCOREbusiness(struct soap *soap, std::vector tModelKeys) @brief @param[in] soap gSOAP context Creates an instance of the find_USCOREbusiness class using the specified tModel keys. */ /** @fn uddi2__businessList *uddi2__find_USCOREbusiness::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__businessList object or NULL on error Send a request to a UDDI server to find a list of businesses. See also @ref example2. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:find_relatedBusinesses // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__find_USCORErelatedBusinesses @brief Represents a request to locate businesses that are related to a specific business. When the send method is called, the instance returns a uddi2__relatedBusinessList object that contains a list of business that matched the relationship set. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137714 */ /** @fn uddi2__find_USCORErelatedBusinesses::uddi2__find_USCORErelatedBusinesses(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the find_USCORErelatedBusiness class. */ /** @fn uddi2__find_USCORErelatedBusinesses::uddi2__find_USCORErelatedBusinesses(struct soap *soap, const char *businessKey) @brief @param[in] soap gSOAP context @param[in] businessKey string Creates an instance of the find_USCORErelatedBusiness class using the specified business key. */ /** @fn uddi2__relatedBusinessesList *uddi2__find_USCORErelatedBusinesses::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__relatedBusinessList object or NULL on error Send a request to a UDDI server to find a list of related businesses. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:find_service // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__find_USCOREservice @brief Represents a request to locate services that meet the specified requirements. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137715 See also @ref example1. */ /** @fn uddi2__find_USCOREservice::uddi2__find_USCOREservice(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the find_USCOREservice class. */ /** @fn uddi2__find_USCOREservice::uddi2__find_USCOREservice(struct soap *soap, const char *name) @brief @param[in] soap gSOAP context @param[in] name of the service Creates an instance of the find_USCOREservice class using the specified name. */ /** @fn uddi2__find_USCOREservice::uddi2__find_USCOREservice(struct soap *soap, std::vector keyedReferences) @brief @param[in] soap gSOAP context @param[in] keyedReferences collection of category keys Creates an instance of the find_USCOREservice class using the specified category keys. */ /** @fn uddi2__find_USCOREservice::uddi2__find_USCOREservice(struct soap *soap, std::vector tModelKeys) @brief @param[in] soap gSOAP context @param[in] tModelKeys collection of tModel key strings Creates an instance of the find_USCOREservice class using the specified tModel keys. */ /** @fn uddi2__serviceList* uddi2__find_USCOREservice::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__serviceList object or NULL on error Send a request to a UDDI server to find a list of services. See also @ref example1. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:find_tModel // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__find_USCOREtModel @brief Represents a request to locate a list of tModel entries that match a set of specific criteria. The result of a search is a uddi2__tModelList object that contains information about registered tModel data that matches the criteria. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137716 */ /** @fn uddi2__find_USCOREtModel::uddi2__find_USCOREtModel(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the find_USCOREtModel class. */ /** @fn uddi2__find_USCOREtModel::uddi2__find_USCOREtModel(struct soap *soap, const char *name) @brief @param[in] soap gSOAP context @param[in] name of the tModel Creates an instance of the find_USCOREtModel class using the specified tModel name. */ /** @fn uddi2__find_USCOREtModel::uddi2__find_USCOREtModel(struct soap *soap, std::vector keyedReferences) @brief @param[in] soap gSOAP context @param[in] keyedReferences collection of category keys Creates an instance of the find_USCOREtModel class using the specified category keys. */ /** @fn uddi2__tModelList* uddi2__find_USCOREtModel::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__tModelList object or NULL on error Send a request to a UDDI server to find a tModelList. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_bindingDetail // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREbindingDetail @brief Represents a request to get binding details from a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137717 */ /** @fn uddi2__get_USCOREbindingDetail::uddi2__get_USCOREbindingDetail(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREbindingDetail class. */ /** @fn uddi2__get_USCOREbindingDetail::uddi2__get_USCOREbindingDetail(struct soap *soap, const char *bindingKey) @brief @param[in] soap gSOAP context @param[in] bindingKey string Creates an instance of the get_USCOREbindingDetail class using the specified binding key. */ /** @fn uddi2__get_USCOREbindingDetail::uddi2__get_USCOREbindingDetail(struct soap *soap, std::vector bindingKeys) @brief @param[in] soap gSOAP context @param[in] bindingKeys collection of key strings Creates an instance of the get_USCOREbindingDetail class using the specified collection of binding keys. */ /** @fn uddi2__bindingDetail* uddi2__get_USCOREbindingDetail::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__bindingDetail object or NULL on error Send a request to a UDDI server to get the binding details. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_businessDetail // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREbusinessDetail @brief Represents a request to get business details from a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137718 */ /** @fn uddi2__get_USCOREbusinessDetail::uddi2__get_USCOREbusinessDetail(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREbusinessDetail class. */ /** @fn uddi2__get_USCOREbusinessDetail::uddi2__get_USCOREbusinessDetail(struct soap *soap, const char *businessKey) @brief @param[in] soap gSOAP context @param[in] businessKey string Creates an instance of the get_USCOREbusinessDetail class using the specified business key. */ /** @fn uddi2__get_USCOREbusinessDetail::uddi2__get_USCOREbusinessDetail(struct soap *soap, std::vector businessKeys) @brief @param[in] soap gSOAP context @param[in] businessKeys collection of key strings Creates an instance of the get_USCOREbusinessDetail class using the specified collection of business keys. */ /** @fn uddi2__businessDetail* uddi2__get_USCOREbusinessDetail::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__businessDetail object or NULL on error Send a request to a UDDI server to get the business details. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_businessDetailExt // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREbusinessDetailExt @brief Represents a request to get business details from a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137719 */ /** @fn uddi2__get_USCOREbusinessDetailExt::uddi2__get_USCOREbusinessDetailExt(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREbusinessDetailExt class. */ /** @fn uddi2__get_USCOREbusinessDetailExt::uddi2__get_USCOREbusinessDetailExt(struct soap *soap, const char *businessKey) @brief @param[in] soap gSOAP context @param[in] businessKey string Creates an instance of the get_USCOREbusinessDetailExt class using the specified business key. */ /** @fn uddi2__get_USCOREbusinessDetailExt::uddi2__get_USCOREbusinessDetailExt(struct soap *soap, std::vector businessKeys) @brief @param[in] soap gSOAP context @param[in] businessKeys collection of key strings Creates an instance of the get_USCOREbusinessDetailExt class using the specified collection of business keys. */ /** @fn uddi2__businessDetailExt* uddi2__get_USCOREbusinessDetailExt::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__businessDetailExt object or NULL on error Send a request to a UDDI server to get the business details. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_serviceDetail // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREserviceDetail @brief Represents a request to get service details from a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137720 */ /** @fn uddi2__get_USCOREserviceDetail::uddi2__get_USCOREserviceDetail(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREserviceDetail class. */ /** @fn uddi2__get_USCOREserviceDetail::uddi2__get_USCOREserviceDetail(struct soap *soap, const char *serviceKey) @brief @param[in] soap gSOAP context @param[in] serviceKey string Creates an instance of the get_USCOREserviceDetail class using the specified service key. */ /** @fn uddi2__get_USCOREserviceDetail::uddi2__get_USCOREserviceDetail(struct soap *soap, std::vector serviceKeys) @brief @param[in] soap gSOAP context @param[in] serviceKeys collection of key strings Creates an instance of the get_USCOREserviceDetail class using the specified collection of service keys. */ /** @fn uddi2__serviceDetail* uddi2__get_USCOREserviceDetail::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__serviceDetail object or NULL on error Send a request to a UDDI server to get the service details. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_tModelDetail // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREtModelDetail @brief Represents a request to get tModel details from a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137721 */ /** @fn uddi2__get_USCOREtModelDetail::uddi2__get_USCOREtModelDetail(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREtModelDetail class. */ /** @fn uddi2__get_USCOREtModelDetail::uddi2__get_USCOREtModelDetail(struct soap *soap, const char *tModelKey) @brief @param[in] soap gSOAP context @param[in] tModelKey string Creates an instance of the get_USCOREtModelDetail class using the specified tModel key. */ /** @fn uddi2__get_USCOREtModelDetail::uddi2__get_USCOREtModelDetail(struct soap *soap, std::vector tModelKeys) @brief @param[in] soap gSOAP context @param[in] tModelKeys collection of key strings Creates an instance of the get_USCOREtModelDetail class using the specified collection of tModel keys. */ /** @fn uddi2__tModelDetail* uddi2__get_USCOREtModelDetail::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__tModelDetail object or NULL on error Send a request to a UDDI server to get the tModel details. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:add_publisherAssertions // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__add_USCOREpublisherAssertions @brief Represents a request to add one or more publisher assertions to the assertion collection for an individual publisher. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137731 */ /** @fn uddi2__add_USCOREpublisherAssertions::uddi2__add_USCOREpublisherAssertions(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the add_USCOREpublisherAssertions class. */ /** @fn uddi2__add_USCOREpublisherAssertions::uddi2__add_USCOREpublisherAssertions(struct soap *soap, std::vector publisherAssertions) @brief @param[in] soap gSOAP context @param[in] publisherAssertions collection of publisher assertions Creates an instance of the add_USCOREpublisherAssertions class using the specified publisher assertions. */ /** @fn uddi2__dispositionReport *uddi2__add_USCOREpublisherAssertions::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__dispositionReport object or NULL on error Send a request to a UDDI server to add one or more publisher assertions to the assertion collection for an individual publisher. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:delete_binding // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__delete_USCOREbinding @brief Represents a request to delete a binding that meets the specified requirements. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137732 */ /** @fn uddi2__delete_USCOREbinding::uddi2__delete_USCOREbinding(struct soap *soap) @brief Creates an instance of the delete_USCOREbinding class. */ /** @fn uddi2__delete_USCOREbinding::uddi2__delete_USCOREbinding(struct soap *soap, const char *bindingKey) @brief @param[in] soap gSOAP context @param[in] bindingKey a binding key string Creates an instance of the delete_USCOREbinding class. */ /** @fn uddi2__delete_USCOREbinding::uddi2__delete_USCOREbinding(struct soap *soap, std::vector bindingKeys) @brief @param[in] soap gSOAP context @param[in] bindingKeys collection of binding keys Creates an instance of the delete_USCOREbinding class using the specified binding keys. */ /** @fn uddi2__dispositionReport *uddi2__delete_USCOREbinding::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__dispositionReport object or NULL on error Send a request to a UDDI service to delete a binding that meets the specified requirements. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:delete_business // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__delete_USCOREbusiness @brief Represents a request to delete a business that meets the specified requirements. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137733 */ /** @fn uddi2__delete_USCOREbusiness::uddi2__delete_USCOREbusiness(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the delete_USCOREbusiness class. */ /** @fn uddi2__delete_USCOREbusiness::uddi2__delete_USCOREbusiness(struct soap *soap, const char *businessKey) @brief @param[in] soap gSOAP context @param[in] businessKey a business key string Creates an instance of the delete_USCOREbusiness class using the specified business key. */ /** @fn uddi2__delete_USCOREbusiness::uddi2__delete_USCOREbusiness(struct soap *soap, std::vector businessKeys) @brief @param[in] soap gSOAP context @param[in] businessKeys collection of business keys Creates an instance of the delete_USCOREbusiness class using the specified business keys. */ /** @fn uddi2__dispositionReport *uddi2__delete_USCOREbusiness::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__dispositionReport object or NULL on error Send a request to a UDDI service to delete a business that meets the specified requirements. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:delete_service // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__delete_USCOREservice @brief Represents a request to delete a service that meets the specified requirements. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137735 */ /** @fn uddi2__delete_USCOREservice::uddi2__delete_USCOREservice(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the delete_USCOREservice class. */ /** @fn uddi2__delete_USCOREservice::uddi2__delete_USCOREservice(struct soap *soap, const char *serviceKey) @brief @param[in] soap gSOAP context @param[in] serviceKey a service key string Creates an instance of the delete_USCOREservice class using the specified service key. */ /** @fn uddi2__delete_USCOREservice::uddi2__delete_USCOREservice(struct soap *soap, std::vector serviceKeys) @brief @param[in] soap gSOAP context @param[in] serviceKeys collection of service keys Creates an instance of the delete_USCOREservice class using the specified service keys. */ /** @fn uddi2__dispositionReport *uddi2__delete_USCOREservice::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__dispositionReport object or NULL on error Send a request to a UDDI service to delete a service that meets the specified requirements. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:delete_tModel // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__delete_USCOREtModel @brief Represents a request to delete a tModel that meets the specified requirements. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137736 */ /** @fn uddi2__delete_USCOREtModel::uddi2__delete_USCOREtModel(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the delete_USCOREtModel class. */ /** @fn uddi2__delete_USCOREtModel::uddi2__delete_USCOREtModel(struct soap *soap, const char *tModelKey) @brief @param[in] soap gSOAP context @param[in] tModelKey a tModel key string Creates an instance of the delete_USCOREtModel class using the specified tModel key. */ /** @fn uddi2__delete_USCOREtModel::uddi2__delete_USCOREtModel(struct soap *soap, std::vector tModelKeys) @brief @param[in] soap gSOAP context @param[in] tModelKeys collection of tModel keys Creates an instance of the delete_USCOREtModel class using the specified tModel keys. */ /** @fn uddi2__dispositionReport *uddi2__delete_USCOREtModel::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__dispositionReport object or NULL on error Send a request to a UDDI service to delete a tModel that meets the specified requirements. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:delete_publisherAssertions // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__delete_USCOREpublisherAssertions @brief Represents a request to delete publisher assertions meeting the specified requirements. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137734 */ /** @fn uddi2__delete_USCOREpublisherAssertions::uddi2__delete_USCOREpublisherAssertions(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the delete_USCOREpublisherAssertions class. */ /** @fn uddi2__delete_USCOREpublisherAssertions::uddi2__delete_USCOREpublisherAssertions(struct soap *soap, std::vector publisherAssertions) @brief @param[in] soap gSOAP context @param[in] publisherAssertions a collection of publisher assertions Creates an instance of the delete_USCOREpublisherAssertions class using the specified collection of publisher assertions. */ /** @fn uddi2__dispositionReport *uddi2__delete_USCOREpublisherAssertions::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__dispositionReport object or NULL on error Send a request to a UDDI service to delete publisher assertions meeting the specified requirements. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:discard_authToken // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__discard_USCOREauthToken @brief Represents a request to discard an authorization token obtained with the get_USCOREauthToken class. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137737 */ /** @fn uddi2__discard_USCOREauthToken::uddi2__discard_USCOREauthToken(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the delete_USCOREauthToken class. */ /** @fn uddi2__discard_USCOREauthToken::uddi2__discard_USCOREauthToken(struct soap *soap, const char *authInfo) @brief @param[in] soap gSOAP context @param[in] authInfo authorization token provided by the UDDI server Creates an instance of the delete_USCOREauthToken class using the specified authentication token string. */ /** @fn uddi2__dispositionReport *uddi2__discard_USCOREauthToken::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__dispositionReport object or NULL on error Send a request to a UDDI service to discard an authentication token. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_assertionStatusReport // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREassertionStatusReport @brief Provides the ability to determine the status of current and outstanding publisher assertions. The results can be restricted by setting the completionStatus property. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137738 */ /** @fn uddi2__get_USCOREassertionStatusReport::uddi2__get_USCOREassertionStatusReport(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREassertionStatusReport class. */ /** @fn uddi2__get_USCOREassertionStatusReport::uddi2__get_USCOREassertionStatusReport(struct soap *soap, const char *completionStatus) @brief @param[in] soap gSOAP context @param[in] completionStatus completion status string Creates an instance of the get_USCOREassertionStatusReport class using the specified completion status. */ /** @fn uddi2__assertionStatusReport *uddi2__get_USCOREassertionStatusReport::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__assertionStatusReport object or NULL on error Send a request to a UDDI service to get the status of current and outstanding publisher assertions. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_authToken // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREauthToken @brief Represents a request to obtain an authorization token, which is represented by the uddi2__authToken class. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137739 */ /** @fn uddi2__get_USCOREauthToken::uddi2__get_USCOREauthToken(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREauthToken class. */ /** @fn uddi2__get_USCOREauthToken::uddi2__get_USCOREauthToken(struct soap *soap, const char *userid, const char *passwd) @brief @param[in] soap gSOAP context @param[in] userid the user ID string @param[in] passwd the password string Creates an instance of the get_USCOREauthToken class using the specified user ID and password. */ /** @fn uddi2__authToken *uddi2__get_USCOREauthToken::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__authToken object or NULL on error Send a request to a UDDI service to get a authorization token given a user ID and password. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_publisherAssertions // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREpublisherAssertions @brief Represents a request to obtain the full set of publisher assertions that are associated with an individual publisher. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137740 */ /** @fn uddi2__get_USCOREpublisherAssertions::uddi2__get_USCOREpublisherAssertions(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREpublisherAssetions class. */ /** @fn uddi2__publisherAssertions *uddi2__get_USCOREpublisherAssertions::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__publisherAssertions object or NULL on error Send a request to a UDDI service to get publisher assertions. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_registeredInfo // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREregisteredInfo @brief Represents a request to get all registered business entities and tModels controlled by an individual. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137741 */ /** @fn uddi2__get_USCOREregisteredInfo::uddi2__get_USCOREregisteredInfo(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREregisteredInfo class. */ /** @fn uddi2__registeredInfo *uddi2__get_USCOREregisteredInfo::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__registeredInfo object or NULL on error Send a request to a UDDI service to get all registered business entities and tModels controlled by an individual. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:save_binding // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__save_USCOREbinding @brief Represents a request to post binding information on a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137742 */ /** @fn uddi2__save_USCOREbinding::uddi2__save_USCOREbinding(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the save_USCOREbinding class. */ /** @fn uddi2__save_USCOREbinding::uddi2__save_USCOREbinding(struct soap *soap, uddi2__bindingTemplate &bindingTemplate) @brief @param[in] soap gSOAP context @param[in] bindingTemplate binding template Creates an instance of the save_USCOREbinding class using the specified binding template. */ /** @fn uddi2__save_USCOREbinding::uddi2__save_USCOREbinding(struct soap *soap, std::vector bindingTemplates) @brief @param[in] soap gSOAP context @param[in] bindingTemplates collection of binding templates Creates an instance of the save_USCOREbinding class using the specified binding templates. */ /** @fn uddi2__bindingDetail *uddi2__save_USCOREbinding::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__bindingDetail object or NULL on error Send a request to a UDDI server to post binding information on the server. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:save_business // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__save_USCOREbusiness @brief Represents a request to post business information on a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137743 */ /** @fn uddi2__save_USCOREbusiness::uddi2__save_USCOREbusiness(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the save_USCOREbusiness class. */ /** @fn uddi2__save_USCOREbusiness::uddi2__save_USCOREbusiness(struct soap *soap, uddi2__businessEntity &businessEntity) @brief @param[in] soap gSOAP context @param[in] businessEntity business entity Creates an instance of the save_USCOREbusiness class using the specified business entity. */ /** @fn uddi2__save_USCOREbusiness::uddi2__save_USCOREbusiness(struct soap *soap, std::vector businessEntities) @brief @param[in] soap gSOAP context @param[in] businessEntities collection of business entities Creates an instance of the save_USCOREbusiness class using the specified business entities. */ /** @fn uddi2__businessDetail *uddi2__save_USCOREbusiness::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__businessDetail object or NULL on error Send a request to a UDDI server to post business information on the server. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:save_service // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__save_USCOREservice @brief Represents a request to post service information on a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137744 */ /** @fn uddi2__save_USCOREservice::uddi2__save_USCOREservice(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the save_USCOREservice class. */ /** @fn uddi2__save_USCOREservice::uddi2__save_USCOREservice(struct soap *soap, uddi2__businessService &businessService) @brief @param[in] soap gSOAP context @param[in] businessService business service Creates an instance of the save_USCOREservice class using the specified service. */ /** @fn uddi2__save_USCOREservice::uddi2__save_USCOREservice(struct soap *soap, std::vector businessServices) @brief @param[in] soap gSOAP context @param[in] businessServices collection of business services Creates an instance of the save_USCOREservice class using the specified services. */ /** @fn uddi2__serviceDetail *uddi2__save_USCOREservice::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__serviceDetail object or NULL on error Send a request to a UDDI server to post service information on the server. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:save_tModel // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__save_USCOREtModel @brief Represents a request to post tModel information on a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137745 */ /** @fn uddi2__save_USCOREtModel::uddi2__save_USCOREtModel(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the save_USCOREtModel class. */ /** @fn uddi2__save_USCOREtModel::uddi2__save_USCOREtModel(struct soap *soap, uddi2__tModel &tModel) @brief @param[in] soap gSOAP context @param[in] tModel a tModel Creates an instance of the save_USCOREtModel class using the specified tModel. */ /** @fn uddi2__save_USCOREtModel::uddi2__save_USCOREtModel(struct soap *soap, std::vector tModels) @brief @param[in] soap gSOAP context @param[in] tModels collection of tModels Creates an instance of the save_USCOREtModel class using the specified tModels. */ /** @fn uddi2__tModelDetail *uddi2__save_USCOREtModel::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__tModelDetail object or NULL on error Send a request to a UDDI server to post tModel information on the server. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:set_publisherAssertions // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__set_USCOREpublisherAssertions @brief Represents a request to modify the existing publisher assertions for an individual publisher. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137746 */ /** @fn uddi2__set_USCOREpublisherAssertions::uddi2__set_USCOREpublisherAssertions(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the set_USCOREpublisherAssertions class. */ /** @fn uddi2__set_USCOREpublisherAssertions::uddi2__set_USCOREpublisherAssertions(struct soap *soap, std::vector publisherAssertions) @brief @param[in] soap gSOAP context @param[in] publisherAssertions collection of publisher assertions Creates an instance of the set_USCOREpublisherAssertions class using the specified collection of publisher assertions. */ /** @fn uddi2__publisherAssertions *uddi2__set_USCOREpublisherAssertions::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__publisherAssertions object or NULL on error Send a request to a UDDI server to post tModel information on the server. */ //////////////////////////////////////////////////////////////////////////////// // // Code Examples // //////////////////////////////////////////////////////////////////////////////// /** @page example1 Code Example 1: Finding a service This example shows you how to find Web services. In this case, the example finds Web services with names that begin with the word "magic". @code #include "inqH.h" int main(int argc, char **argv) { char *search_string = "magic"; if (argc > 1) search_string = argv[1]; // Create a gSOAP context struct soap *soap = soap_new(); // Create an object to find a business uddi2__find_USCOREservice fs(soap, search_string); // Send the request uddi2__serviceList *sl = fs.send("http://uddi.xmethods.net/inquire"); // Check if result is OK if (!sl) soap_print_fault(soap, stderr); // If OK, report the service name(s) and unique identification keys else if (sl->serviceInfos) { std::cout << "Search results on " << search_string << ":" << std::endl << std::endl; for (std::vector::const_iterator si = sl->serviceInfos->serviceInfo.begin(); si != sl->serviceInfos->serviceInfo.end(); ++si) { // Report serviceKey and businessKey std::cout << "serviceKey=" << (*si)->serviceKey << std::endl << "businessKey=" << (*si)->businessKey << std::endl; // Report names for (std::vector::const_iterator n = (*si)->name.begin(); n != (*si)->name.end(); ++n) std::cout << "name=" << (*n)->__item << std::endl; std::cout << std::endl; } } // Remove deserialized objects soap_destroy(soap); // Remove temporary data soap_end(soap); // Detach and free context soap_done(soap); free(soap); return 0; } @endcode To compile: - wsdl2h -tuddi2-typemap.dat inquire_v2.wsdl - soapcpp2 -I.. -pinq inquire_v2.h - g++ -DWITH_NONAMESPACES -I.. -o example1 example1.cpp inquire_v2.cpp inqC.cpp inqClient.cpp ../stdsoap2.cpp */ /** @page example2 Code Example 2: Finding a business This example shows you how to find a business from a UDDI server. @code #include "inqH.h" int main(int argc, char **argv) { char *search_string = "xmethods"; if (argc > 1) search_string = argv[1]; // Create a gSOAP context struct soap *soap = soap_new(); // Create an object to find a business uddi2__find_USCOREbusiness fb(soap, search_string); // Send the request uddi2__businessList *bl = fb.send("http://uddi.xmethods.net/inquire"); // Check if result is OK if (!bl) soap_print_fault(soap, stderr); // If OK, report the business name(s) and unique identification keys else if (bl->businessInfos) { std::cout << "Search results on " << search_string << ":" << std::endl << std::endl; for (std::vector::const_iterator bi = bl->businessInfos->businessInfo.begin(); bi != bl->businessInfos->businessInfo.end(); ++bi) { // Report businessKey std::cout << "businessKey=" << (*bi)->businessKey << std::endl; // Report names for (std::vector::const_iterator n = (*bi)->name.begin(); n != (*bi)->name.end(); ++n) std::cout << "name=" << (*n)->__item << std::endl; std::cout << std::endl; } } // Remove deserialized objects soap_destroy(soap); // Remove temporary data soap_end(soap); // Detach and free context soap_done(soap); free(soap); return 0; } @endcode To compile: - wsdl2h -tuddi2-typemap.dat inquire_v2.wsdl - soapcpp2 -I.. -pinq inquire_v2.h - g++ -DWITH_NONAMESPACES -I.. -o example2 example2.cpp inquire_v2.cpp inqC.cpp inqClient.cpp ../stdsoap2.cpp */ /** @page example3 Code Example 3: Publishing a WSDL and service on XMethods This example shows you how to publish a Web service. In this case, the example template code obtains an authorization token, saves the tModel with the WSDL URL in the server, and saves the business service information in the server. @code #include "pubH.h" const char *server = "https://uddi.xmethods.net/publish"; const char *userid = "..."; // user ID to access UDDI server const char *passwd = "..."; // password to access UDDI server int main(int argc, char **argv) { // Create a gSOAP context struct soap *soap = soap_new(); // Setup SSL context (optional) to verify server's credentials if (soap_ssl_client_context(soap, SOAP_SSL_DEFAULT, NULL, NULL, "cacerts.pem", NULL, NULL)) { soap_print_fault(soap, stderr); exit(1); } // Step 1: Get an authorization token from the UDDI server uddi2__get_USCOREauthToken get_authToken(soap, userid, passwd); uddi2__authToken *authToken = get_authToken.send(server); // Check if authorized if (!authToken) { soap_print_fault(soap, stderr); exit(1); } // Authorization info provided by server for this session char *authInfo = authToken->authInfo; // Step 2: Create a tModel for the WSDL to be published uddi2__tModel tModel; tModel.soap_default(soap); // Create the tModel and service name tModel.name = soap_new_uddi2__name(soap, -1); tModel.name->__item = "..."; tModel.name->xml__lang_ = "en"; // Create XMethods description elements (see http://www.xmethods.net/ve2/UDDI.po) uddi2__description *description = soap_new_uddi2__description(soap, 6); description[0].__item = "SHORT DESCRIPTION: ..."; description[0].xml__lang_ = "en"; description[1].__item = "SHORT DESCRIPTION: ..."; description[1].xml__lang_ = "en"; description[2].__item = "USAGE NOTES: ..."; description[2].xml__lang_ = "en"; description[3].__item = "HOMEPAGE URL: ..."; description[3].xml__lang_ = "en"; description[4].__item = "CONTACT EMAIL: ..."; description[4].xml__lang_ = "en"; description[5].__item = "IMPLEMENTATION: ..."; description[5].xml__lang_ = "en"; // Add the four description elements to the tModel tModel.description.push_back(description + 0); tModel.description.push_back(description + 1); tModel.description.push_back(description + 2); tModel.description.push_back(description + 4); // Add an overviewDoc element with description and overviewURL tModel.overviewDoc = soap_new_uddi2__overviewDoc(soap, -1); tModel.overviewDoc->soap_default(soap); tModel.overviewDoc->description.push_back(soap_new_uddi2__description(soap, -1)); tModel.overviewDoc->description[0]->__item = "WSDL source document"; tModel.overviewDoc->description[0]->xml__lang_ = "en"; tModel.overviewDoc->overviewURL = "http://.../my.wsdl#bindingName"; // Omit identifier bag tModel.identifierBag = NULL; // Add a category with a WSDL-specific keyedReference tModel.categoryBag = soap_new_uddi2__categoryBag(soap, -1); tModel.categoryBag->soap_default(soap); tModel.categoryBag->keyedReference.push_back(soap_new_uddi2__keyedReference(soap, -1)); tModel.categoryBag->keyedReference[0]->tModelKey = "..."; tModel.categoryBag->keyedReference[0]->keyName = "uddi-org:types"; tModel.categoryBag->keyedReference[0]->keyValue = "wsdlSpec"; tModel.authorizedName = "..."; tModel.operator_ = "..."; tModel.tModelKey = "..."; // Save the tModel uddi2__save_USCOREtModel save_tModel(soap, tModel); uddi2__tModelDetail *tModelDetail = save_tModel.send(server, authInfo); // Step 3: Create a new service to be published uddi2__businessService service; service.soap_default(soap); // Service name is the tModel name (XMethods) service.name.push_back(tModel.name); // Add two description elements to the service service.description.push_back(description + 4); service.description.push_back(description + 5); // Create binding template uddi2__bindingTemplate bindingTemplate; bindingTemplate.soap_default(soap); bindingTemplate.tModelInstanceDetails = soap_new_uddi2__tModelInstanceDetails(soap, -1); bindingTemplate.tModelInstanceDetails->tModelInstanceInfo.push_back(soap_new_uddi2__tModelInstanceInfo(soap, -1)); bindingTemplate.tModelInstanceDetails->tModelInstanceInfo[0]->instanceDetails = NULL; bindingTemplate.tModelInstanceDetails->tModelInstanceInfo[0]->tModelKey = tModel.tModelKey; bindingTemplate.accessPoint = soap_new_uddi2__accessPoint(soap, -1); bindingTemplate.accessPoint->__item = "..."; bindingTemplate.accessPoint->URLType = uddi2__URLType__http; bindingTemplate.hostingRedirector = NULL; bindingTemplate.serviceKey = "..."; bindingTemplate.bindingKey = "..."; // Add binding Template to service service.bindingTemplates = soap_new_uddi2__bindingTemplates(soap, -1); service.bindingTemplates->soap_default(soap); service.bindingTemplates->bindingTemplate.push_back(&bindingTemplate); service.categoryBag = NULL; service.serviceKey = "..."; service.businessKey = "..."; // Save the service uddi2__save_USCOREservice save_service(soap, service); uddi2__serviceDetail *serviceDetail = save_service.send(server, authInfo); // Step 4: Discard authorization token uddi2__discard_USCOREauthToken discard_authToken(soap, authInfo); uddi2__dispositionReport *dispositionReport = discard_authToken.send(server); // Remove deserialized objects soap_destroy(soap); // Remove temporary data soap_end(soap); // Detach and free context soap_done(soap); free(soap); return 0; } @endcode To compile: - wsdl2h -tuddi2-typemap.dat publish_v2.wsdl - soapcpp2 -I.. -ppub publish_v2.h - g++ -DWITH_OPENSSL -DWITH_NONAMESPACES -I.. -o example3 example3.cpp publish_v2.cpp pubC.cpp pubClient.cpp ../stdsoap2.cpp */ /* publish_v2.h Generated by wsdl2h 1.2.0 from publish_v2.wsdl and uddi2-typemap.dat 2005-04-24 00:29:41 GMT Copyright (C) 2001-2005 Robert van Engelen, Genivia Inc. All Rights Reserved. This part of the software is released under one of the following licenses: GPL or Genivia's license for commercial use. */ /* NOTE: - Compile this file with soapcpp2 to complete the code generation process. - Use wsdl2h option -l to view the software license terms. - Use wsdl2h options -c and -s to generate pure C code or C++ code without STL. - To build with STL, stlvector.h from the gSOAP distribution must be in the current directory. Or use soapcpp2 option -I with path to stlvector.h. - Use typemap.dat to control schema namespace bindings and type mappings. It is strongly recommended to customize the names of the namespace prefixes generated by wsdl2h. To do so, modify the prefix bindings in the Namespaces section below and add the modified lines to typemap.dat to rerun wsdl2h. - Use Doxygen (www.doxygen.org) to browse this file. */ /******************************************************************************\ * * * urn:uddi-org:publication_v2 * * * \******************************************************************************/ /* WSDL Documentation: Copyright (c) 2000 - 2002 by Accenture, Ariba, Inc., Commerce One, Inc. Fujitsu Limited, Hewlett-Packard Company, i2 Technologies, Inc., Intel Corporation, International Business Machines Corporation, Microsoft Corporation, Oracle Corporation, SAP AG, Sun Microsystems, Inc., and VeriSign, Inc. All Rights Reserved. WSDL Service Interface for UDDI Publication API V2.0 This WSDL document defines the publication API calls for interacting with the UDDI registry. The complete UDDI API specification is available at http://www.uddi.org/specification.html. */ //gsoapopt w #import "stlvector.h" /******************************************************************************\ * * * Schema Namespaces * * * \******************************************************************************/ /* NOTE: It is strongly recommended to customize the names of the namespace prefixes generated by wsdl2h. To do so, modify the prefix bindings below and add the modified lines to typemap.dat to rerun wsdl2h: pub2 = "urn:uddi-org:publication_v2" uddi2 = urn:uddi-org:api_v2 */ //gsoap pub2 schema namespace: urn:uddi-org:publication_v2 //gsoap uddi2 schema namespace: urn:uddi-org:api_v2 //gsoap pub2 schema form: unqualified //gsoap uddi2 schema elementForm: qualified //gsoap uddi2 schema attributeForm: unqualified /******************************************************************************\ * * * Schema Types * * * \******************************************************************************/ /// Primitive built-in type "xs:NMTOKEN" typedef char* xsd__NMTOKEN; /// Built-in attribute "xml:lang" typedef char* xml__lang; class uddi2__accessPoint; class uddi2__address; class uddi2__addressLine; class uddi2__assertionStatusItem; class uddi2__bindingTemplate; class uddi2__bindingTemplates; class uddi2__businessEntity; class uddi2__businessEntityExt; class uddi2__businessInfo; class uddi2__businessInfos; class uddi2__businessService; class uddi2__businessServices; class uddi2__categoryBag; class uddi2__contact; class uddi2__contacts; class uddi2__description; class uddi2__discoveryURL; class uddi2__discoveryURLs; class uddi2__dispositionReport; class uddi2__email; class uddi2__errInfo; class uddi2__findQualifiers; class uddi2__hostingRedirector; class uddi2__identifierBag; class uddi2__instanceDetails; class uddi2__keyedReference; class uddi2__keysOwned; class uddi2__name; class uddi2__overviewDoc; class uddi2__phone; class uddi2__publisherAssertion; class uddi2__relatedBusinessInfo; class uddi2__relatedBusinessInfos; class uddi2__result; class uddi2__serviceInfo; class uddi2__serviceInfos; class uddi2__sharedRelationships; class uddi2__tModel; class uddi2__tModelBag; class uddi2__tModelInfo; class uddi2__tModelInfos; class uddi2__tModelInstanceDetails; class uddi2__tModelInstanceInfo; class uddi2__add_USCOREpublisherAssertions; class uddi2__delete_USCOREbinding; class uddi2__delete_USCOREbusiness; class uddi2__delete_USCOREpublisherAssertions; class uddi2__delete_USCOREservice; class uddi2__delete_USCOREtModel; class uddi2__discard_USCOREauthToken; class uddi2__find_USCOREbinding; class uddi2__find_USCOREbusiness; class uddi2__find_USCORErelatedBusinesses; class uddi2__find_USCOREservice; class uddi2__find_USCOREtModel; class uddi2__get_USCOREassertionStatusReport; class uddi2__get_USCOREauthToken; class uddi2__get_USCOREbindingDetail; class uddi2__get_USCOREbusinessDetail; class uddi2__get_USCOREbusinessDetailExt; class uddi2__get_USCOREpublisherAssertions; class uddi2__get_USCOREregisteredInfo; class uddi2__get_USCOREserviceDetail; class uddi2__get_USCOREtModelDetail; class uddi2__save_USCOREbinding; class uddi2__save_USCOREbusiness; class uddi2__save_USCOREservice; class uddi2__save_USCOREtModel; class uddi2__set_USCOREpublisherAssertions; class uddi2__validate_USCOREvalues; class uddi2__assertionStatusReport; class uddi2__authToken; class uddi2__bindingDetail; class uddi2__businessDetail; class uddi2__businessDetailExt; class uddi2__businessList; class uddi2__publisherAssertions; class uddi2__registeredInfo; class uddi2__relatedBusinessesList; class uddi2__serviceDetail; class uddi2__serviceList; class uddi2__tModelDetail; class uddi2__tModelList; /// Schema "urn:uddi-org:api_v2":bindingKey simpleType restriction of xs:string typedef char* uddi2__bindingKey; /// Schema "urn:uddi-org:api_v2":businessKey simpleType restriction of xs:string typedef char* uddi2__businessKey; /// Schema "urn:uddi-org:api_v2":serviceKey simpleType restriction of xs:string typedef char* uddi2__serviceKey; /// Schema "urn:uddi-org:api_v2":tModelKey simpleType restriction of xs:string typedef char* uddi2__tModelKey; /// Schema "urn:uddi-org:api_v2":direction simpleType restriction of xs:NMTOKEN /// Note: enum values are prefixed with 'uddi2__direction' to avoid name clashes, please use wsdl2h option -e to omit this prefix enum uddi2__direction { uddi2__direction__fromKey, ///< xs:NMTOKEN value="fromKey" uddi2__direction__toKey, ///< xs:NMTOKEN value="toKey" }; /// Schema "urn:uddi-org:api_v2":truncated simpleType restriction of xs:NMTOKEN /// Note: enum values are prefixed with 'uddi2__truncated' to avoid name clashes, please use wsdl2h option -e to omit this prefix enum uddi2__truncated { uddi2__truncated__true_, ///< xs:NMTOKEN value="true" uddi2__truncated__false_, ///< xs:NMTOKEN value="false" }; /// Schema "urn:uddi-org:api_v2":URLType simpleType restriction of xs:NMTOKEN /// Note: enum values are prefixed with 'uddi2__URLType' to avoid name clashes, please use wsdl2h option -e to omit this prefix enum uddi2__URLType { uddi2__URLType__mailto, ///< xs:NMTOKEN value="mailto" uddi2__URLType__http, ///< xs:NMTOKEN value="http" uddi2__URLType__https, ///< xs:NMTOKEN value="https" uddi2__URLType__ftp, ///< xs:NMTOKEN value="ftp" uddi2__URLType__fax, ///< xs:NMTOKEN value="fax" uddi2__URLType__phone, ///< xs:NMTOKEN value="phone" uddi2__URLType__other, ///< xs:NMTOKEN value="other" }; /// Schema "urn:uddi-org:api_v2":keyType simpleType restriction of xs:NMTOKEN /// Note: enum values are prefixed with 'uddi2__keyType' to avoid name clashes, please use wsdl2h option -e to omit this prefix enum uddi2__keyType { uddi2__keyType__businessKey, ///< xs:NMTOKEN value="businessKey" uddi2__keyType__tModelKey, ///< xs:NMTOKEN value="tModelKey" uddi2__keyType__serviceKey, ///< xs:NMTOKEN value="serviceKey" uddi2__keyType__bindingKey, ///< xs:NMTOKEN value="bindingKey" }; /// Schema urn:uddi-org:api_v2:"address" class uddi2__address { public: /// Vector of uddi2__addressLine* with length 0..unbounded std::vector addressLine 0; /// Attribute useType of type xs:string @char* useType 0; ///< Optional attribute /// Attribute sortCode of type xs:string @char* sortCode 0; ///< Optional attribute /// Attribute tModelKey of type "urn:uddi-org:api_v2":tModelKey @uddi2__tModelKey tModelKey 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"assertionStatusItem" class uddi2__assertionStatusItem { public: /// Element reference "urn:uddi-org:api_v2":fromKey uddi2__businessKey fromKey 1; ///< Required element /// Element reference "urn:uddi-org:api_v2":toKey uddi2__businessKey toKey 1; ///< Required element /// Element reference "urn:uddi-org:api_v2":keyedReference uddi2__keyedReference* keyedReference 1; ///< Required element /// Element reference "urn:uddi-org:api_v2":keysOwned uddi2__keysOwned* keysOwned 1; ///< Required element /// Attribute completionStatus of type xs:string @char* completionStatus 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"bindingTemplate" class uddi2__bindingTemplate { public: /// Vector of uddi2__description* with length 0..unbounded std::vector description 0; /// Element reference "urn:uddi-org:api_v2":tModelInstanceDetails uddi2__tModelInstanceDetails* tModelInstanceDetails 1; ///< Required element // CHOICE OF ELEMENTS: /// Element reference "urn:uddi-org:api_v2":accessPoint uddi2__accessPoint* accessPoint 1; ///< Required element /// Element reference "urn:uddi-org:api_v2":hostingRedirector uddi2__hostingRedirector* hostingRedirector 1; ///< Required element // END CHOICE /// Attribute serviceKey of type "urn:uddi-org:api_v2":serviceKey @uddi2__serviceKey serviceKey 0; ///< Optional attribute /// Attribute bindingKey of type "urn:uddi-org:api_v2":bindingKey @uddi2__bindingKey bindingKey 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"bindingTemplates" class uddi2__bindingTemplates { public: /// Vector of uddi2__bindingTemplate* with length 0..unbounded std::vector bindingTemplate 0; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"businessEntity" class uddi2__businessEntity { public: /// Element reference "urn:uddi-org:api_v2":discoveryURLs uddi2__discoveryURLs* discoveryURLs 0; ///< Optional element /// Vector of uddi2__name* with length 0..unbounded std::vector name 1; /// Vector of uddi2__description* with length 0..unbounded std::vector description 0; /// Element reference "urn:uddi-org:api_v2":contacts uddi2__contacts* contacts 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":businessServices uddi2__businessServices* businessServices 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":identifierBag uddi2__identifierBag* identifierBag 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":categoryBag uddi2__categoryBag* categoryBag 0; ///< Optional element /// Attribute businessKey of type "urn:uddi-org:api_v2":businessKey @uddi2__businessKey businessKey 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 0; ///< Optional attribute /// Attribute authorizedName of type xs:string @char* authorizedName 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"businessEntityExt" class uddi2__businessEntityExt { public: /// Element reference "urn:uddi-org:api_v2":businessEntity uddi2__businessEntity* businessEntity 1; ///< Required element // TODO: // Schema extensibility is user-definable // Consult the protocol documentation to insert declarations here: _XML __any ; ///< Catch any element content in XML string /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"businessInfo" class uddi2__businessInfo { public: /// Vector of uddi2__name* with length 0..unbounded std::vector name 1; /// Vector of uddi2__description* with length 0..unbounded std::vector description 0; /// Element reference "urn:uddi-org:api_v2":serviceInfos uddi2__serviceInfos* serviceInfos 1; ///< Required element /// Attribute businessKey of type "urn:uddi-org:api_v2":businessKey @uddi2__businessKey businessKey 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"businessInfos" class uddi2__businessInfos { public: /// Vector of uddi2__businessInfo* with length 0..unbounded std::vector businessInfo 0; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"businessService" class uddi2__businessService { public: /// Vector of uddi2__name* with length 0..unbounded std::vector name 0; /// Vector of uddi2__description* with length 0..unbounded std::vector description 0; /// Element reference "urn:uddi-org:api_v2":bindingTemplates uddi2__bindingTemplates* bindingTemplates 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":categoryBag uddi2__categoryBag* categoryBag 0; ///< Optional element /// Attribute serviceKey of type "urn:uddi-org:api_v2":serviceKey @uddi2__serviceKey serviceKey 1; ///< Required attribute /// Attribute businessKey of type "urn:uddi-org:api_v2":businessKey @uddi2__businessKey businessKey 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"businessServices" class uddi2__businessServices { public: /// Vector of uddi2__businessService* with length 0..unbounded std::vector businessService 0; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"categoryBag" class uddi2__categoryBag { public: /// Vector of uddi2__keyedReference* with length 0..unbounded std::vector keyedReference 1; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"contact" class uddi2__contact { public: /// Vector of uddi2__description* with length 0..unbounded std::vector description 0; /// Element reference "urn:uddi-org:api_v2":personName char* personName 1; ///< Required element /// Vector of uddi2__phone* with length 0..unbounded std::vector phone 0; /// Vector of uddi2__email* with length 0..unbounded std::vector email 0; /// Vector of uddi2__address* with length 0..unbounded std::vector address 0; /// Attribute useType of type xs:string @char* useType 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"contacts" class uddi2__contacts { public: /// Vector of uddi2__contact* with length 0..unbounded std::vector contact 1; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"discoveryURLs" class uddi2__discoveryURLs { public: /// Vector of uddi2__discoveryURL* with length 0..unbounded std::vector discoveryURL 1; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"dispositionReport" class uddi2__dispositionReport { public: /// Vector of uddi2__result* with length 0..unbounded std::vector result 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute truncated of type "urn:uddi-org:api_v2":truncated @enum uddi2__truncated* truncated 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"findQualifiers" class uddi2__findQualifiers { public: /// Vector of char* with length 0..unbounded std::vector findQualifier 0; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"hostingRedirector" class uddi2__hostingRedirector { public: /// Attribute bindingKey of type "urn:uddi-org:api_v2":bindingKey @uddi2__bindingKey bindingKey 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"identifierBag" class uddi2__identifierBag { public: /// Vector of uddi2__keyedReference* with length 0..unbounded std::vector keyedReference 1; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"instanceDetails" class uddi2__instanceDetails { public: /// Vector of uddi2__description* with length 0..unbounded std::vector description 0; /// Element reference "urn:uddi-org:api_v2":overviewDoc uddi2__overviewDoc* overviewDoc 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":instanceParms char* instanceParms 0; ///< Optional element /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"keyedReference" class uddi2__keyedReference { public: /// Attribute tModelKey of type "urn:uddi-org:api_v2":tModelKey @uddi2__tModelKey tModelKey 0; ///< Optional attribute /// Attribute keyName of type xs:string @char* keyName 0; ///< Optional attribute /// Attribute keyValue of type xs:string @char* keyValue 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"keysOwned" class uddi2__keysOwned { public: /// Element reference "urn:uddi-org:api_v2":fromKey uddi2__businessKey fromKey 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":toKey uddi2__businessKey toKey 0; ///< Optional element /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"overviewDoc" class uddi2__overviewDoc { public: /// Vector of uddi2__description* with length 0..unbounded std::vector description 0; /// Element reference "urn:uddi-org:api_v2":overviewURL char* overviewURL 0; ///< Optional element /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"publisherAssertion" class uddi2__publisherAssertion { public: /// Element reference "urn:uddi-org:api_v2":fromKey uddi2__businessKey fromKey 1; ///< Required element /// Element reference "urn:uddi-org:api_v2":toKey uddi2__businessKey toKey 1; ///< Required element /// Element reference "urn:uddi-org:api_v2":keyedReference uddi2__keyedReference* keyedReference 1; ///< Required element /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"relatedBusinessInfo" class uddi2__relatedBusinessInfo { public: /// Element reference "urn:uddi-org:api_v2":businessKey uddi2__businessKey businessKey 1; ///< Required element /// Vector of uddi2__name* with length 0..unbounded std::vector name 1; /// Vector of uddi2__description* with length 0..unbounded std::vector description 0; /// Vector of uddi2__sharedRelationships* with length 0..2 std::vector sharedRelationships 1:2; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"relatedBusinessInfos" class uddi2__relatedBusinessInfos { public: /// Vector of uddi2__relatedBusinessInfo* with length 0..unbounded std::vector relatedBusinessInfo 0; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"result" class uddi2__result { public: /// Element reference "urn:uddi-org:api_v2":errInfo uddi2__errInfo* errInfo 0; ///< Optional element /// Attribute keyType of type "urn:uddi-org:api_v2":keyType @enum uddi2__keyType* keyType 0; ///< Optional attribute /// Attribute errno of type xs:int @int errno_ 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"serviceInfo" class uddi2__serviceInfo { public: /// Vector of uddi2__name* with length 0..unbounded std::vector name 0; /// Attribute serviceKey of type "urn:uddi-org:api_v2":serviceKey @uddi2__serviceKey serviceKey 1; ///< Required attribute /// Attribute businessKey of type "urn:uddi-org:api_v2":businessKey @uddi2__businessKey businessKey 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"serviceInfos" class uddi2__serviceInfos { public: /// Vector of uddi2__serviceInfo* with length 0..unbounded std::vector serviceInfo 0; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"sharedRelationships" class uddi2__sharedRelationships { public: /// Vector of uddi2__keyedReference* with length 0..unbounded std::vector keyedReference 1; /// Attribute direction of type "urn:uddi-org:api_v2":direction @enum uddi2__direction direction 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"tModel" class uddi2__tModel { public: /// Element reference "urn:uddi-org:api_v2":name uddi2__name* name 1; ///< Required element /// Vector of uddi2__description* with length 0..unbounded std::vector description 0; /// Element reference "urn:uddi-org:api_v2":overviewDoc uddi2__overviewDoc* overviewDoc 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":identifierBag uddi2__identifierBag* identifierBag 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":categoryBag uddi2__categoryBag* categoryBag 0; ///< Optional element /// Attribute tModelKey of type "urn:uddi-org:api_v2":tModelKey @uddi2__tModelKey tModelKey 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 0; ///< Optional attribute /// Attribute authorizedName of type xs:string @char* authorizedName 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"tModelBag" class uddi2__tModelBag { public: /// Vector of uddi2__tModelKey with length 0..unbounded std::vector tModelKey 1; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"tModelInfo" class uddi2__tModelInfo { public: /// Element reference "urn:uddi-org:api_v2":name uddi2__name* name 1; ///< Required element /// Attribute tModelKey of type "urn:uddi-org:api_v2":tModelKey @uddi2__tModelKey tModelKey 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"tModelInfos" class uddi2__tModelInfos { public: /// Vector of uddi2__tModelInfo* with length 0..unbounded std::vector tModelInfo 0; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"tModelInstanceDetails" class uddi2__tModelInstanceDetails { public: /// Vector of uddi2__tModelInstanceInfo* with length 0..unbounded std::vector tModelInstanceInfo 0; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"tModelInstanceInfo" class uddi2__tModelInstanceInfo { public: /// Vector of uddi2__description* with length 0..unbounded std::vector description 0; /// Element reference "urn:uddi-org:api_v2":instanceDetails uddi2__instanceDetails* instanceDetails 0; ///< Optional element /// Attribute tModelKey of type "urn:uddi-org:api_v2":tModelKey @uddi2__tModelKey tModelKey 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"add_publisherAssertions" class uddi2__add_USCOREpublisherAssertions { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Vector of uddi2__publisherAssertion* with length 0..unbounded std::vector publisherAssertion 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__add_USCOREpublisherAssertions(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__add_USCOREpublisherAssertions(struct soap*, std::vector publisherAssertions); /// Member declared in uddi2-typemap.dat uddi2__dispositionReport* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"delete_binding" class uddi2__delete_USCOREbinding { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Vector of uddi2__bindingKey with length 0..unbounded std::vector bindingKey 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREbinding(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREbinding(struct soap*, const char *bindingKey); /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREbinding(struct soap*, std::vector bindingKeys); /// Member declared in uddi2-typemap.dat uddi2__dispositionReport* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"delete_business" class uddi2__delete_USCOREbusiness { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Vector of uddi2__businessKey with length 0..unbounded std::vector businessKey 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREbusiness(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREbusiness(struct soap*, const char *businessKey); /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREbusiness(struct soap*, std::vector businessKeys); /// Member declared in uddi2-typemap.dat uddi2__dispositionReport* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"delete_publisherAssertions" class uddi2__delete_USCOREpublisherAssertions { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Vector of uddi2__publisherAssertion* with length 0..unbounded std::vector publisherAssertion 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREpublisherAssertions(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREpublisherAssertions(struct soap*, std::vector publisherAssertions); /// Member declared in uddi2-typemap.dat uddi2__dispositionReport* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"delete_service" class uddi2__delete_USCOREservice { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Vector of uddi2__serviceKey with length 0..unbounded std::vector serviceKey 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREservice(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREservice(struct soap*, const char *serviceKey); /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREservice(struct soap*, std::vector serviceKeys); /// Member declared in uddi2-typemap.dat uddi2__dispositionReport* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"delete_tModel" class uddi2__delete_USCOREtModel { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Vector of uddi2__tModelKey with length 0..unbounded std::vector tModelKey 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREtModel(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREtModel(struct soap*, const char *tModelKey); /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREtModel(struct soap*, std::vector tModelKeys); /// Member declared in uddi2-typemap.dat uddi2__dispositionReport* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"discard_authToken" class uddi2__discard_USCOREauthToken { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__discard_USCOREauthToken(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__discard_USCOREauthToken(struct soap*, const char *authInfo); /// Member declared in uddi2-typemap.dat uddi2__dispositionReport* send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"find_binding" class uddi2__find_USCOREbinding { public: /// Element reference "urn:uddi-org:api_v2":findQualifiers uddi2__findQualifiers* findQualifiers 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":tModelBag uddi2__tModelBag* tModelBag 1; ///< Required element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute maxRows of type xs:int @int* maxRows 0; ///< Optional attribute /// Attribute serviceKey of type "urn:uddi-org:api_v2":serviceKey @uddi2__serviceKey serviceKey 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__find_USCOREbinding(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__find_USCOREbinding(struct soap*, const char *tModelKey); /// Member declared in uddi2-typemap.dat uddi2__find_USCOREbinding(struct soap*, std::vector tModelKeys); /// Member declared in uddi2-typemap.dat uddi2__bindingDetail *send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"find_business" class uddi2__find_USCOREbusiness { public: /// Element reference "urn:uddi-org:api_v2":findQualifiers uddi2__findQualifiers* findQualifiers 0; ///< Optional element /// Vector of uddi2__name* with length 0..unbounded std::vector name 0; /// Element reference "urn:uddi-org:api_v2":identifierBag uddi2__identifierBag* identifierBag 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":categoryBag uddi2__categoryBag* categoryBag 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":tModelBag uddi2__tModelBag* tModelBag 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":discoveryURLs uddi2__discoveryURLs* discoveryURLs 0; ///< Optional element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute maxRows of type xs:int @int* maxRows 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__find_USCOREbusiness(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__find_USCOREbusiness(struct soap*, const char *name); /// Member declared in uddi2-typemap.dat uddi2__find_USCOREbusiness(struct soap*, std::vector tModelKeys); /// Member declared in uddi2-typemap.dat uddi2__find_USCOREbusiness(struct soap*, std::vector keyedReferences); /// Member declared in uddi2-typemap.dat uddi2__businessList *send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"find_relatedBusinesses" class uddi2__find_USCORErelatedBusinesses { public: /// Element reference "urn:uddi-org:api_v2":findQualifiers uddi2__findQualifiers* findQualifiers 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":businessKey uddi2__businessKey businessKey 1; ///< Required element /// Element reference "urn:uddi-org:api_v2":keyedReference uddi2__keyedReference* keyedReference 0; ///< Optional element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute maxRows of type xs:int @int* maxRows 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__find_USCORErelatedBusinesses(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__find_USCORErelatedBusinesses(struct soap*, const char *businessKey); /// Member declared in uddi2-typemap.dat uddi2__relatedBusinessesList *send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"find_service" class uddi2__find_USCOREservice { public: /// Element reference "urn:uddi-org:api_v2":findQualifiers uddi2__findQualifiers* findQualifiers 0; ///< Optional element /// Vector of uddi2__name* with length 0..unbounded std::vector name 0; /// Element reference "urn:uddi-org:api_v2":categoryBag uddi2__categoryBag* categoryBag 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":tModelBag uddi2__tModelBag* tModelBag 0; ///< Optional element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute maxRows of type xs:int @int* maxRows 0; ///< Optional attribute /// Attribute businessKey of type "urn:uddi-org:api_v2":businessKey @uddi2__businessKey businessKey 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__find_USCOREservice(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__find_USCOREservice(struct soap*, const char *name); /// Member declared in uddi2-typemap.dat uddi2__find_USCOREservice(struct soap*, std::vector tModelKeys); /// Member declared in uddi2-typemap.dat uddi2__find_USCOREservice(struct soap*, std::vector keyedReferences); /// Member declared in uddi2-typemap.dat uddi2__serviceList* send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"find_tModel" class uddi2__find_USCOREtModel { public: /// Element reference "urn:uddi-org:api_v2":findQualifiers uddi2__findQualifiers* findQualifiers 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":name uddi2__name* name 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":identifierBag uddi2__identifierBag* identifierBag 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":categoryBag uddi2__categoryBag* categoryBag 0; ///< Optional element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute maxRows of type xs:int @int* maxRows 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__find_USCOREtModel(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__find_USCOREtModel(struct soap*, const char *name); /// Member declared in uddi2-typemap.dat uddi2__find_USCOREtModel(struct soap*, std::vector keyedReferences); /// Member declared in uddi2-typemap.dat uddi2__tModelList* send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"get_assertionStatusReport" class uddi2__get_USCOREassertionStatusReport { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Element reference "urn:uddi-org:api_v2":completionStatus char* completionStatus 0; ///< Optional element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__get_USCOREassertionStatusReport(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREassertionStatusReport(struct soap*, const char *completionStatus); /// Member declared in uddi2-typemap.dat uddi2__assertionStatusReport* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"get_authToken" class uddi2__get_USCOREauthToken { public: /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute userID of type xs:string @char* userID 1; ///< Required attribute /// Attribute cred of type xs:string @char* cred 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__get_USCOREauthToken(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREauthToken(struct soap*, const char *userid, const char *passwd); /// Member declared in uddi2-typemap.dat uddi2__authToken* send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"get_bindingDetail" class uddi2__get_USCOREbindingDetail { public: /// Vector of uddi2__bindingKey with length 0..unbounded std::vector bindingKey 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__get_USCOREbindingDetail(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREbindingDetail(struct soap*, const char *bindingKey); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREbindingDetail(struct soap*, std::vector bindingKeys); /// Member declared in uddi2-typemap.dat uddi2__bindingDetail* send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"get_businessDetail" class uddi2__get_USCOREbusinessDetail { public: /// Vector of uddi2__businessKey with length 0..unbounded std::vector businessKey 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__get_USCOREbusinessDetail(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREbusinessDetail(struct soap*, const char *businessKey); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREbusinessDetail(struct soap*, std::vector businessKeys); /// Member declared in uddi2-typemap.dat uddi2__businessDetail* send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"get_businessDetailExt" class uddi2__get_USCOREbusinessDetailExt { public: /// Vector of uddi2__businessKey with length 0..unbounded std::vector businessKey 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__get_USCOREbusinessDetailExt(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREbusinessDetailExt(struct soap*, const char *businessKey); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREbusinessDetailExt(struct soap*, std::vector businessKeys); /// Member declared in uddi2-typemap.dat uddi2__businessDetailExt* send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"get_publisherAssertions" class uddi2__get_USCOREpublisherAssertions { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__get_USCOREpublisherAssertions(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__publisherAssertions* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"get_registeredInfo" class uddi2__get_USCOREregisteredInfo { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__get_USCOREregisteredInfo(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__registeredInfo* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"get_serviceDetail" class uddi2__get_USCOREserviceDetail { public: /// Vector of uddi2__serviceKey with length 0..unbounded std::vector serviceKey 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__get_USCOREserviceDetail(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREserviceDetail(struct soap*, const char *serviceKey); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREserviceDetail(struct soap*, std::vector serviceKeys); /// Member declared in uddi2-typemap.dat uddi2__serviceDetail* send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"get_tModelDetail" class uddi2__get_USCOREtModelDetail { public: /// Vector of uddi2__tModelKey with length 0..unbounded std::vector tModelKey 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__get_USCOREtModelDetail(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREtModelDetail(struct soap*, const char *tModelKey); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREtModelDetail(struct soap*, std::vector tModelKeys); /// Member declared in uddi2-typemap.dat uddi2__tModelDetail* send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"save_binding" class uddi2__save_USCOREbinding { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Vector of uddi2__bindingTemplate* with length 0..unbounded std::vector bindingTemplate 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__save_USCOREbinding(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__save_USCOREbinding(struct soap*, uddi2__bindingTemplate &bindingTemplate); /// Member declared in uddi2-typemap.dat uddi2__save_USCOREbinding(struct soap*, std::vector bindingTemplates); /// Member declared in uddi2-typemap.dat uddi2__bindingDetail* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"save_business" class uddi2__save_USCOREbusiness { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Vector of uddi2__businessEntity* with length 0..unbounded std::vector businessEntity 0; /// Vector of char* with length 0..unbounded std::vector uploadRegister 0; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__save_USCOREbusiness(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__save_USCOREbusiness(struct soap*, uddi2__businessEntity &businessEntity); /// Member declared in uddi2-typemap.dat uddi2__save_USCOREbusiness(struct soap*, std::vector businessEntities); /// Member declared in uddi2-typemap.dat uddi2__businessDetail* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"save_service" class uddi2__save_USCOREservice { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Vector of uddi2__businessService* with length 0..unbounded std::vector businessService 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__save_USCOREservice(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__save_USCOREservice(struct soap*, uddi2__businessService &businessService); /// Member declared in uddi2-typemap.dat uddi2__save_USCOREservice(struct soap*, std::vector businessServices); /// Member declared in uddi2-typemap.dat uddi2__serviceDetail* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"save_tModel" class uddi2__save_USCOREtModel { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Vector of uddi2__tModel* with length 0..unbounded std::vector tModel 0; /// Vector of char* with length 0..unbounded std::vector uploadRegister 0; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__save_USCOREtModel(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__save_USCOREtModel(struct soap*, uddi2__tModel &tModel); /// Member declared in uddi2-typemap.dat uddi2__save_USCOREtModel(struct soap*, std::vector tModels); /// Member declared in uddi2-typemap.dat uddi2__tModelDetail* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"set_publisherAssertions" class uddi2__set_USCOREpublisherAssertions { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Vector of uddi2__publisherAssertion* with length 0..unbounded std::vector publisherAssertion 0; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__set_USCOREpublisherAssertions(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__set_USCOREpublisherAssertions(struct soap*, std::vector publisherAssertions); /// Member declared in uddi2-typemap.dat uddi2__publisherAssertions* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"validate_values" class uddi2__validate_USCOREvalues { public: // CHOICE OF ELEMENTS: /// Vector of uddi2__businessEntity* with length 0..unbounded std::vector businessEntity 0; /// Vector of uddi2__businessService* with length 0..unbounded std::vector businessService 0; /// Vector of uddi2__tModel* with length 0..unbounded std::vector tModel 0; // END CHOICE /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"assertionStatusReport" class uddi2__assertionStatusReport { public: /// Vector of uddi2__assertionStatusItem* with length 0..unbounded std::vector assertionStatusItem 0; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"authToken" class uddi2__authToken { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"bindingDetail" class uddi2__bindingDetail { public: /// Vector of uddi2__bindingTemplate* with length 0..unbounded std::vector bindingTemplate 0; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute truncated of type "urn:uddi-org:api_v2":truncated @enum uddi2__truncated* truncated 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"businessDetail" class uddi2__businessDetail { public: /// Vector of uddi2__businessEntity* with length 0..unbounded std::vector businessEntity 0; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute truncated of type "urn:uddi-org:api_v2":truncated @enum uddi2__truncated* truncated 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"businessDetailExt" class uddi2__businessDetailExt { public: /// Vector of uddi2__businessEntityExt* with length 0..unbounded std::vector businessEntityExt 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute truncated of type "urn:uddi-org:api_v2":truncated @enum uddi2__truncated* truncated 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"businessList" class uddi2__businessList { public: /// Element reference "urn:uddi-org:api_v2":businessInfos uddi2__businessInfos* businessInfos 1; ///< Required element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute truncated of type "urn:uddi-org:api_v2":truncated @enum uddi2__truncated* truncated 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"publisherAssertions" class uddi2__publisherAssertions { public: /// Vector of uddi2__publisherAssertion* with length 0..unbounded std::vector publisherAssertion 0; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute authorizedName of type xs:string @char* authorizedName 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"registeredInfo" class uddi2__registeredInfo { public: /// Element reference "urn:uddi-org:api_v2":businessInfos uddi2__businessInfos* businessInfos 1; ///< Required element /// Element reference "urn:uddi-org:api_v2":tModelInfos uddi2__tModelInfos* tModelInfos 1; ///< Required element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute truncated of type "urn:uddi-org:api_v2":truncated @enum uddi2__truncated* truncated 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"relatedBusinessesList" class uddi2__relatedBusinessesList { public: /// Element reference "urn:uddi-org:api_v2":businessKey uddi2__businessKey businessKey 1; ///< Required element /// Element reference "urn:uddi-org:api_v2":relatedBusinessInfos uddi2__relatedBusinessInfos* relatedBusinessInfos 1; ///< Required element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute truncated of type "urn:uddi-org:api_v2":truncated @enum uddi2__truncated* truncated 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"serviceDetail" class uddi2__serviceDetail { public: /// Vector of uddi2__businessService* with length 0..unbounded std::vector businessService 0; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute truncated of type "urn:uddi-org:api_v2":truncated @enum uddi2__truncated* truncated 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"serviceList" class uddi2__serviceList { public: /// Element reference "urn:uddi-org:api_v2":serviceInfos uddi2__serviceInfos* serviceInfos 1; ///< Required element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute truncated of type "urn:uddi-org:api_v2":truncated @enum uddi2__truncated* truncated 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"tModelDetail" class uddi2__tModelDetail { public: /// Vector of uddi2__tModel* with length 0..unbounded std::vector tModel 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute truncated of type "urn:uddi-org:api_v2":truncated @enum uddi2__truncated* truncated 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"tModelList" class uddi2__tModelList { public: /// Element reference "urn:uddi-org:api_v2":tModelInfos uddi2__tModelInfos* tModelInfos 1; ///< Required element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute truncated of type "urn:uddi-org:api_v2":truncated @enum uddi2__truncated* truncated 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"accessPoint" class uddi2__accessPoint { public: char* __item ; /// Attribute URLType of type "urn:uddi-org:api_v2":URLType @enum uddi2__URLType URLType 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"addressLine" class uddi2__addressLine { public: char* __item ; /// Attribute keyName of type xs:string @char* keyName 0; ///< Optional attribute /// Attribute keyValue of type xs:string @char* keyValue 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"description" class uddi2__description { public: char* __item ; /// Attribute reference xml:lang @xml__lang xml__lang_ 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"discoveryURL" class uddi2__discoveryURL { public: char* __item ; /// Attribute useType of type xs:string @char* useType 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"email" class uddi2__email { public: char* __item ; /// Attribute useType of type xs:string @char* useType 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"errInfo" class uddi2__errInfo { public: char* __item ; /// Attribute errCode of type xs:string @char* errCode 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"name" class uddi2__name { public: char* __item ; /// Attribute reference xml:lang @xml__lang xml__lang_ 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"phone" class uddi2__phone { public: char* __item ; /// Attribute useType of type xs:string @char* useType 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /******************************************************************************\ * * * Services * * * \******************************************************************************/ //gsoap pub2 service name: PublishSoap //gsoap pub2 service type: Publish //gsoap pub2 service namespace: urn:uddi-org:publication_v2 /** @mainpage UDDI_Publication_API_V2 Definitions @section UDDI_Publication_API_V2_documentation Documentation Copyright (c) 2000 - 2002 by Accenture, Ariba, Inc., Commerce One, Inc. Fujitsu Limited, Hewlett-Packard Company, i2 Technologies, Inc., Intel Corporation, International Business Machines Corporation, Microsoft Corporation, Oracle Corporation, SAP AG, Sun Microsystems, Inc., and VeriSign, Inc. All Rights Reserved. WSDL Service Interface for UDDI Publication API V2.0 This WSDL document defines the publication API calls for interacting with the UDDI registry. The complete UDDI API specification is available at http://www.uddi.org/specification.html. @section UDDI_Publication_API_V2_bindings Bindings - @ref PublishSoap */ /** @page PublishSoap Binding "PublishSoap" @section PublishSoap_operations Operations of Binding "PublishSoap" - @ref __pub2__add_USCOREpublisherAssertions - @ref __pub2__delete_USCOREbinding - @ref __pub2__delete_USCOREbusiness - @ref __pub2__delete_USCOREpublisherAssertions - @ref __pub2__delete_USCOREservice - @ref __pub2__delete_USCOREtModel - @ref __pub2__discard_USCOREauthToken - @ref __pub2__get_USCOREassertionStatusReport - @ref __pub2__get_USCOREauthToken - @ref __pub2__get_USCOREpublisherAssertions - @ref __pub2__get_USCOREregisteredInfo - @ref __pub2__save_USCOREbinding - @ref __pub2__save_USCOREbusiness - @ref __pub2__save_USCOREservice - @ref __pub2__save_USCOREtModel - @ref __pub2__set_USCOREpublisherAssertions @section PublishSoap_ports Endpoints of Binding "PublishSoap" */ /******************************************************************************\ * * * SOAP Fault Detail * * * \******************************************************************************/ /// The SOAP Fault Detail element contains one of the following types serialized // in the __type and fault fields of the SOAP_ENV__Detail struct (see docs) class _dispositionReport { public: uddi2__dispositionReport* uddi2__dispositionReport_; struct soap *soap ; }; /******************************************************************************\ * * * PublishSoap * * * \******************************************************************************/ /******************************************************************************\ * * * __pub2__add_USCOREpublisherAssertions * * * \******************************************************************************/ /// Operation "__pub2__add_USCOREpublisherAssertions" of service binding "PublishSoap" /** Operation details: - SOAP document/literal style - SOAP action="add_publisherAssertions" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___pub2__add_USCOREpublisherAssertions(struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: uddi2__add_USCOREpublisherAssertions* uddi2__add_USCOREpublisherAssertions_, // response parameters: uddi2__dispositionReport* uddi2__dispositionReport_ ); @endcode C++ proxy class (defined in soapPublishSoapProxy.h): class PublishSoap; */ //gsoap pub2 service method-style: add_USCOREpublisherAssertions document //gsoap pub2 service method-encoding: add_USCOREpublisherAssertions literal //gsoap pub2 service method-action: add_USCOREpublisherAssertions add_publisherAssertions //gsoap pub2 service method-fault: add_USCOREpublisherAssertions _dispositionReport int __pub2__add_USCOREpublisherAssertions( uddi2__add_USCOREpublisherAssertions* uddi2__add_USCOREpublisherAssertions_, uddi2__dispositionReport* uddi2__dispositionReport_ ///< response parameter ); /******************************************************************************\ * * * __pub2__delete_USCOREbinding * * * \******************************************************************************/ /// Operation "__pub2__delete_USCOREbinding" of service binding "PublishSoap" /** Operation details: - SOAP document/literal style - SOAP action="delete_binding" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___pub2__delete_USCOREbinding(struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: uddi2__delete_USCOREbinding* uddi2__delete_USCOREbinding_, // response parameters: uddi2__dispositionReport* uddi2__dispositionReport_ ); @endcode C++ proxy class (defined in soapPublishSoapProxy.h): class PublishSoap; */ //gsoap pub2 service method-style: delete_USCOREbinding document //gsoap pub2 service method-encoding: delete_USCOREbinding literal //gsoap pub2 service method-action: delete_USCOREbinding delete_binding //gsoap pub2 service method-fault: delete_USCOREbinding _dispositionReport int __pub2__delete_USCOREbinding( uddi2__delete_USCOREbinding* uddi2__delete_USCOREbinding_, uddi2__dispositionReport* uddi2__dispositionReport_ ///< response parameter ); /******************************************************************************\ * * * __pub2__delete_USCOREbusiness * * * \******************************************************************************/ /// Operation "__pub2__delete_USCOREbusiness" of service binding "PublishSoap" /** Operation details: - SOAP document/literal style - SOAP action="delete_business" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___pub2__delete_USCOREbusiness(struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: uddi2__delete_USCOREbusiness* uddi2__delete_USCOREbusiness_, // response parameters: uddi2__dispositionReport* uddi2__dispositionReport_ ); @endcode C++ proxy class (defined in soapPublishSoapProxy.h): class PublishSoap; */ //gsoap pub2 service method-style: delete_USCOREbusiness document //gsoap pub2 service method-encoding: delete_USCOREbusiness literal //gsoap pub2 service method-action: delete_USCOREbusiness delete_business //gsoap pub2 service method-fault: delete_USCOREbusiness _dispositionReport int __pub2__delete_USCOREbusiness( uddi2__delete_USCOREbusiness* uddi2__delete_USCOREbusiness_, uddi2__dispositionReport* uddi2__dispositionReport_ ///< response parameter ); /******************************************************************************\ * * * __pub2__delete_USCOREpublisherAssertions * * * \******************************************************************************/ /// Operation "__pub2__delete_USCOREpublisherAssertions" of service binding "PublishSoap" /** Operation details: - SOAP document/literal style - SOAP action="delete_publisherAssertions" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___pub2__delete_USCOREpublisherAssertions(struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: uddi2__delete_USCOREpublisherAssertions* uddi2__delete_USCOREpublisherAssertions_, // response parameters: uddi2__dispositionReport* uddi2__dispositionReport_ ); @endcode C++ proxy class (defined in soapPublishSoapProxy.h): class PublishSoap; */ //gsoap pub2 service method-style: delete_USCOREpublisherAssertions document //gsoap pub2 service method-encoding: delete_USCOREpublisherAssertions literal //gsoap pub2 service method-action: delete_USCOREpublisherAssertions delete_publisherAssertions //gsoap pub2 service method-fault: delete_USCOREpublisherAssertions _dispositionReport int __pub2__delete_USCOREpublisherAssertions( uddi2__delete_USCOREpublisherAssertions* uddi2__delete_USCOREpublisherAssertions_, uddi2__dispositionReport* uddi2__dispositionReport_ ///< response parameter ); /******************************************************************************\ * * * __pub2__delete_USCOREservice * * * \******************************************************************************/ /// Operation "__pub2__delete_USCOREservice" of service binding "PublishSoap" /** Operation details: - SOAP document/literal style - SOAP action="delete_service" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___pub2__delete_USCOREservice(struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: uddi2__delete_USCOREservice* uddi2__delete_USCOREservice_, // response parameters: uddi2__dispositionReport* uddi2__dispositionReport_ ); @endcode C++ proxy class (defined in soapPublishSoapProxy.h): class PublishSoap; */ //gsoap pub2 service method-style: delete_USCOREservice document //gsoap pub2 service method-encoding: delete_USCOREservice literal //gsoap pub2 service method-action: delete_USCOREservice delete_service //gsoap pub2 service method-fault: delete_USCOREservice _dispositionReport int __pub2__delete_USCOREservice( uddi2__delete_USCOREservice* uddi2__delete_USCOREservice_, uddi2__dispositionReport* uddi2__dispositionReport_ ///< response parameter ); /******************************************************************************\ * * * __pub2__delete_USCOREtModel * * * \******************************************************************************/ /// Operation "__pub2__delete_USCOREtModel" of service binding "PublishSoap" /** Operation details: - SOAP document/literal style - SOAP action="delete_tModel" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___pub2__delete_USCOREtModel(struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: uddi2__delete_USCOREtModel* uddi2__delete_USCOREtModel_, // response parameters: uddi2__dispositionReport* uddi2__dispositionReport_ ); @endcode C++ proxy class (defined in soapPublishSoapProxy.h): class PublishSoap; */ //gsoap pub2 service method-style: delete_USCOREtModel document //gsoap pub2 service method-encoding: delete_USCOREtModel literal //gsoap pub2 service method-action: delete_USCOREtModel delete_tModel //gsoap pub2 service method-fault: delete_USCOREtModel _dispositionReport int __pub2__delete_USCOREtModel( uddi2__delete_USCOREtModel* uddi2__delete_USCOREtModel_, uddi2__dispositionReport* uddi2__dispositionReport_ ///< response parameter ); /******************************************************************************\ * * * __pub2__discard_USCOREauthToken * * * \******************************************************************************/ /// Operation "__pub2__discard_USCOREauthToken" of service binding "PublishSoap" /** Operation details: - SOAP document/literal style - SOAP action="discard_authToken" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___pub2__discard_USCOREauthToken(struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: uddi2__discard_USCOREauthToken* uddi2__discard_USCOREauthToken_, // response parameters: uddi2__dispositionReport* uddi2__dispositionReport_ ); @endcode C++ proxy class (defined in soapPublishSoapProxy.h): class PublishSoap; */ //gsoap pub2 service method-style: discard_USCOREauthToken document //gsoap pub2 service method-encoding: discard_USCOREauthToken literal //gsoap pub2 service method-action: discard_USCOREauthToken discard_authToken //gsoap pub2 service method-fault: discard_USCOREauthToken _dispositionReport int __pub2__discard_USCOREauthToken( uddi2__discard_USCOREauthToken* uddi2__discard_USCOREauthToken_, uddi2__dispositionReport* uddi2__dispositionReport_ ///< response parameter ); /******************************************************************************\ * * * __pub2__get_USCOREassertionStatusReport * * * \******************************************************************************/ /// Operation "__pub2__get_USCOREassertionStatusReport" of service binding "PublishSoap" /** Operation details: - SOAP document/literal style - SOAP action="get_assertionStatusReport" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___pub2__get_USCOREassertionStatusReport(struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: uddi2__get_USCOREassertionStatusReport* uddi2__get_USCOREassertionStatusReport_, // response parameters: uddi2__assertionStatusReport* uddi2__assertionStatusReport_ ); @endcode C++ proxy class (defined in soapPublishSoapProxy.h): class PublishSoap; */ //gsoap pub2 service method-style: get_USCOREassertionStatusReport document //gsoap pub2 service method-encoding: get_USCOREassertionStatusReport literal //gsoap pub2 service method-action: get_USCOREassertionStatusReport get_assertionStatusReport //gsoap pub2 service method-fault: get_USCOREassertionStatusReport _dispositionReport int __pub2__get_USCOREassertionStatusReport( uddi2__get_USCOREassertionStatusReport* uddi2__get_USCOREassertionStatusReport_, uddi2__assertionStatusReport* uddi2__assertionStatusReport_ ///< response parameter ); /******************************************************************************\ * * * __pub2__get_USCOREauthToken * * * \******************************************************************************/ /// Operation "__pub2__get_USCOREauthToken" of service binding "PublishSoap" /** Operation details: - SOAP document/literal style - SOAP action="get_authToken" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___pub2__get_USCOREauthToken(struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: uddi2__get_USCOREauthToken* uddi2__get_USCOREauthToken_, // response parameters: uddi2__authToken* uddi2__authToken_ ); @endcode C++ proxy class (defined in soapPublishSoapProxy.h): class PublishSoap; */ //gsoap pub2 service method-style: get_USCOREauthToken document //gsoap pub2 service method-encoding: get_USCOREauthToken literal //gsoap pub2 service method-action: get_USCOREauthToken get_authToken //gsoap pub2 service method-fault: get_USCOREauthToken _dispositionReport int __pub2__get_USCOREauthToken( uddi2__get_USCOREauthToken* uddi2__get_USCOREauthToken_, uddi2__authToken* uddi2__authToken_ ///< response parameter ); /******************************************************************************\ * * * __pub2__get_USCOREpublisherAssertions * * * \******************************************************************************/ /// Operation "__pub2__get_USCOREpublisherAssertions" of service binding "PublishSoap" /** Operation details: - SOAP document/literal style - SOAP action="get_publisherAssertions" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___pub2__get_USCOREpublisherAssertions(struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: uddi2__get_USCOREpublisherAssertions* uddi2__get_USCOREpublisherAssertions_, // response parameters: uddi2__publisherAssertions* uddi2__publisherAssertions_ ); @endcode C++ proxy class (defined in soapPublishSoapProxy.h): class PublishSoap; */ //gsoap pub2 service method-style: get_USCOREpublisherAssertions document //gsoap pub2 service method-encoding: get_USCOREpublisherAssertions literal //gsoap pub2 service method-action: get_USCOREpublisherAssertions get_publisherAssertions //gsoap pub2 service method-fault: get_USCOREpublisherAssertions _dispositionReport int __pub2__get_USCOREpublisherAssertions( uddi2__get_USCOREpublisherAssertions* uddi2__get_USCOREpublisherAssertions_, uddi2__publisherAssertions* uddi2__publisherAssertions_ ///< response parameter ); /******************************************************************************\ * * * __pub2__get_USCOREregisteredInfo * * * \******************************************************************************/ /// Operation "__pub2__get_USCOREregisteredInfo" of service binding "PublishSoap" /** Operation details: - SOAP document/literal style - SOAP action="get_registeredInfo" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___pub2__get_USCOREregisteredInfo(struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: uddi2__get_USCOREregisteredInfo* uddi2__get_USCOREregisteredInfo_, // response parameters: uddi2__registeredInfo* uddi2__registeredInfo_ ); @endcode C++ proxy class (defined in soapPublishSoapProxy.h): class PublishSoap; */ //gsoap pub2 service method-style: get_USCOREregisteredInfo document //gsoap pub2 service method-encoding: get_USCOREregisteredInfo literal //gsoap pub2 service method-action: get_USCOREregisteredInfo get_registeredInfo //gsoap pub2 service method-fault: get_USCOREregisteredInfo _dispositionReport int __pub2__get_USCOREregisteredInfo( uddi2__get_USCOREregisteredInfo* uddi2__get_USCOREregisteredInfo_, uddi2__registeredInfo* uddi2__registeredInfo_ ///< response parameter ); /******************************************************************************\ * * * __pub2__save_USCOREbinding * * * \******************************************************************************/ /// Operation "__pub2__save_USCOREbinding" of service binding "PublishSoap" /** Operation details: - SOAP document/literal style - SOAP action="save_binding" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___pub2__save_USCOREbinding(struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: uddi2__save_USCOREbinding* uddi2__save_USCOREbinding_, // response parameters: uddi2__bindingDetail* uddi2__bindingDetail_ ); @endcode C++ proxy class (defined in soapPublishSoapProxy.h): class PublishSoap; */ //gsoap pub2 service method-style: save_USCOREbinding document //gsoap pub2 service method-encoding: save_USCOREbinding literal //gsoap pub2 service method-action: save_USCOREbinding save_binding //gsoap pub2 service method-fault: save_USCOREbinding _dispositionReport int __pub2__save_USCOREbinding( uddi2__save_USCOREbinding* uddi2__save_USCOREbinding_, uddi2__bindingDetail* uddi2__bindingDetail_ ///< response parameter ); /******************************************************************************\ * * * __pub2__save_USCOREbusiness * * * \******************************************************************************/ /// Operation "__pub2__save_USCOREbusiness" of service binding "PublishSoap" /** Operation details: - SOAP document/literal style - SOAP action="save_business" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___pub2__save_USCOREbusiness(struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: uddi2__save_USCOREbusiness* uddi2__save_USCOREbusiness_, // response parameters: uddi2__businessDetail* uddi2__businessDetail_ ); @endcode C++ proxy class (defined in soapPublishSoapProxy.h): class PublishSoap; */ //gsoap pub2 service method-style: save_USCOREbusiness document //gsoap pub2 service method-encoding: save_USCOREbusiness literal //gsoap pub2 service method-action: save_USCOREbusiness save_business //gsoap pub2 service method-fault: save_USCOREbusiness _dispositionReport int __pub2__save_USCOREbusiness( uddi2__save_USCOREbusiness* uddi2__save_USCOREbusiness_, uddi2__businessDetail* uddi2__businessDetail_ ///< response parameter ); /******************************************************************************\ * * * __pub2__save_USCOREservice * * * \******************************************************************************/ /// Operation "__pub2__save_USCOREservice" of service binding "PublishSoap" /** Operation details: - SOAP document/literal style - SOAP action="save_service" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___pub2__save_USCOREservice(struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: uddi2__save_USCOREservice* uddi2__save_USCOREservice_, // response parameters: uddi2__serviceDetail* uddi2__serviceDetail_ ); @endcode C++ proxy class (defined in soapPublishSoapProxy.h): class PublishSoap; */ //gsoap pub2 service method-style: save_USCOREservice document //gsoap pub2 service method-encoding: save_USCOREservice literal //gsoap pub2 service method-action: save_USCOREservice save_service //gsoap pub2 service method-fault: save_USCOREservice _dispositionReport int __pub2__save_USCOREservice( uddi2__save_USCOREservice* uddi2__save_USCOREservice_, uddi2__serviceDetail* uddi2__serviceDetail_ ///< response parameter ); /******************************************************************************\ * * * __pub2__save_USCOREtModel * * * \******************************************************************************/ /// Operation "__pub2__save_USCOREtModel" of service binding "PublishSoap" /** Operation details: - SOAP document/literal style - SOAP action="save_tModel" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___pub2__save_USCOREtModel(struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: uddi2__save_USCOREtModel* uddi2__save_USCOREtModel_, // response parameters: uddi2__tModelDetail* uddi2__tModelDetail_ ); @endcode C++ proxy class (defined in soapPublishSoapProxy.h): class PublishSoap; */ //gsoap pub2 service method-style: save_USCOREtModel document //gsoap pub2 service method-encoding: save_USCOREtModel literal //gsoap pub2 service method-action: save_USCOREtModel save_tModel //gsoap pub2 service method-fault: save_USCOREtModel _dispositionReport int __pub2__save_USCOREtModel( uddi2__save_USCOREtModel* uddi2__save_USCOREtModel_, uddi2__tModelDetail* uddi2__tModelDetail_ ///< response parameter ); /******************************************************************************\ * * * __pub2__set_USCOREpublisherAssertions * * * \******************************************************************************/ /// Operation "__pub2__set_USCOREpublisherAssertions" of service binding "PublishSoap" /** Operation details: - SOAP document/literal style - SOAP action="set_publisherAssertions" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___pub2__set_USCOREpublisherAssertions(struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: uddi2__set_USCOREpublisherAssertions* uddi2__set_USCOREpublisherAssertions_, // response parameters: uddi2__publisherAssertions* uddi2__publisherAssertions_ ); @endcode C++ proxy class (defined in soapPublishSoapProxy.h): class PublishSoap; */ //gsoap pub2 service method-style: set_USCOREpublisherAssertions document //gsoap pub2 service method-encoding: set_USCOREpublisherAssertions literal //gsoap pub2 service method-action: set_USCOREpublisherAssertions set_publisherAssertions //gsoap pub2 service method-fault: set_USCOREpublisherAssertions _dispositionReport int __pub2__set_USCOREpublisherAssertions( uddi2__set_USCOREpublisherAssertions* uddi2__set_USCOREpublisherAssertions_, uddi2__publisherAssertions* uddi2__publisherAssertions_ ///< response parameter ); /* End of publish_v2.h */ gsoap-2.8.28/gsoap/uddi2/cacerts.pem0000644000175000017500000075424412653650160016557 0ustar ellertellert# Part of the source for this file is provided by Mozilla: # http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1 # This file was converted to PEM format with tools provided by OpenSSL. # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. GlobalSign Root CA ================== -----BEGIN CERTIFICATE----- MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== -----END CERTIFICATE----- GlobalSign Root CA - R2 ======================= -----BEGIN CERTIFICATE----- MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6 ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp 9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu 01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7 9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== -----END CERTIFICATE----- Verisign Class 3 Public Primary Certification Authority - G3 ============================================================ -----BEGIN CERTIFICATE----- MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1 EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj 055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC /Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0 xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== -----END CERTIFICATE----- Entrust.net Premium 2048 Secure Server CA ========================================= -----BEGIN CERTIFICATE----- MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx NzUwNTFaFw0yOTA3MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3 d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo0IwQDAOBgNVHQ8BAf8E BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJ KoZIhvcNAQEFBQADggEBADubj1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPy T/4xmf3IDExoU8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5bu/8j72gZyxKT J1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+bYQLCIt+jerXmCHG8+c8eS9e nNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/ErfF6adulZkMV8gzURZVE= -----END CERTIFICATE----- Baltimore CyberTrust Root ========================= -----BEGIN CERTIFICATE----- MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9 XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5 hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp -----END CERTIFICATE----- AddTrust Low-Value Services Root ================================ -----BEGIN CERTIFICATE----- MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRU cnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQsw CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBO ZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEB AQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY6 54eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWr oulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1 Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJui GMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8w HQYDVR0OBBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTAD AQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQswCQYDVQQGEwJT RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEw HwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxt ZBsfzQ3duQH6lmM0MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJlpz/+0WatC7xr mYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vj ccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk= -----END CERTIFICATE----- AddTrust External Root ====================== -----BEGIN CERTIFICATE----- MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821 +iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy 2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7 7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355 e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= -----END CERTIFICATE----- AddTrust Public Services Root ============================= -----BEGIN CERTIFICATE----- MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEUMBIGA1UEChML QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSAwHgYDVQQDExdBZGRU cnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJ BgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5l dHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEF AAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbu nyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1i d9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSG Aa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAw HM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0G A1UdDgQWBBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB /zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkGA1UEBhMCU0Ux FDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29yazEgMB4G A1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4 JNojVhaTdt02KLmuG7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL +YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh4SINhwBk/ox9 Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9H EufOX1362KqxMy3ZdvJOOjMMK7MtkAY= -----END CERTIFICATE----- AddTrust Qualified Certificates Root ==================================== -----BEGIN CERTIFICATE----- MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEUMBIGA1UEChML QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSMwIQYDVQQDExpBZGRU cnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcx CzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ IE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG 9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx 64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3 KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1tUvznoD1o L/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GR wVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HU MIHRMB0GA1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/ BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkwZzELMAkGA1UE BhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29y azEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQAD ggEBABmrder4i2VhlRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3P6CxB9bpT9ze RXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDB iFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5noxqE= -----END CERTIFICATE----- Entrust Root Certification Authority ==================================== -----BEGIN CERTIFICATE----- MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0 MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68 j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1 MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0 tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8 -----END CERTIFICATE----- RSA Security 2048 v3 ==================== -----BEGIN CERTIFICATE----- MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6MRkwFwYDVQQK ExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAy MjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAb BgNVBAsTFFJTQSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC AQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7 Jylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgb WhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iH KrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP +Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/ MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4E FgQUB8NRMKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmY v/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5gEydxiKRz44Rj 0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+f00/FGj1EVDVwfSQpQgdMWD/YIwj VAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395 nzIlQnQFgCi/vcEkllgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA pKnXwiJPZ9d37CAFYd4= -----END CERTIFICATE----- GeoTrust Global CA ================== -----BEGIN CERTIFICATE----- MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet 8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4 d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2 mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm Mw== -----END CERTIFICATE----- GeoTrust Global CA 2 ==================== -----BEGIN CERTIFICATE----- MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN R2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwHhcNMDQwMzA0MDUw MDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j LjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw ggEKAoIBAQDvPE1APRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/ NTL8Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hLTytCOb1k LUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL5mkWRxHCJ1kDs6ZgwiFA Vvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7S4wMcoKK+xfNAGw6EzywhIdLFnopsk/b HdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQF MAMBAf8wHQYDVR0OBBYEFHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNH K266ZUapEBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6tdEPx7 srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv/NgdRN3ggX+d6Yvh ZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywNA0ZF66D0f0hExghAzN4bcLUprbqL OzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkC x1YAzUm5s2x7UwQa4qjJqhIFI8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqF H4z1Ir+rzoPz4iIprn2DQKi6bA== -----END CERTIFICATE----- GeoTrust Universal CA ===================== -----BEGIN CERTIFICATE----- MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1 MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs 7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d 8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08 ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0 XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2 qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2 DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI P/rmMuGNG2+k5o7Y+SlIis5z/iw= -----END CERTIFICATE----- GeoTrust Universal CA 2 ======================= -----BEGIN CERTIFICATE----- MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0 MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0 DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17 j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2 WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP 20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG 8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2 +/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ 4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+ mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS -----END CERTIFICATE----- Visa eCommerce Root =================== -----BEGIN CERTIFICATE----- MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2 WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0 TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI /k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt 398znM/jra6O1I7mT1GvFpLgXPYHDw== -----END CERTIFICATE----- Certum Root CA ============== -----BEGIN CERTIFICATE----- MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQK ExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQTAeFw0wMjA2MTExMDQ2Mzla Fw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8u by4xEjAQBgNVBAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6x wS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdL kKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ 89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/K Uz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu/qpGWX7P NSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq hkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+ GXYkHAQaTOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvg GrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqTE5s7FCMTY5w/ 0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5xO/fIR/RpbxXyEV6DHpx8Uq79AtoS qFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs6GAqm4VKQPNriiTsBhYscw== -----END CERTIFICATE----- Comodo AAA Services root ======================== -----BEGIN CERTIFICATE----- MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm 7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z 8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C 12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== -----END CERTIFICATE----- Comodo Secure Services root =========================== -----BEGIN CERTIFICATE----- MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg TGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAw MDAwMFoXDTI4MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu Y2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAi BgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP ADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP 9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8j6ysNstc rbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rC oznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3V p6ea5EQz6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4E FgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w gYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL1NlY3VyZUNlcnRpZmlj YXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlm aWNhdGVTZXJ2aWNlcy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm 4J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtIgKvcnDe4IRRL DXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6Pw pCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1H RR3B7Hzs/Sk= -----END CERTIFICATE----- Comodo Trusted Services root ============================ -----BEGIN CERTIFICATE----- MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg TGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEw MDAwMDBaFw0yODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1h bmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUw IwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOC AQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh7 3TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9C1t2ul/y /9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6 juljatEPmsbS9Is6FARW1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsS ivnkBbA7kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1Ud DgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB /zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21vZG9jYS5jb20vVHJ1c3RlZENlcnRp ZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENl cnRpZmljYXRlU2VydmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw uleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32 pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxISjBc/lDb+XbDA BHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0l R+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O 9y5Xt5hwXsjEeLBi -----END CERTIFICATE----- QuoVadis Root CA ================ -----BEGIN CERTIFICATE----- MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7 MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0 aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6 tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi 5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi 5nrQNiOKSnQ2+Q== -----END CERTIFICATE----- QuoVadis Root CA 2 ================== -----BEGIN CERTIFICATE----- MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQx ODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4IC DwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6 XJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yk lvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbB lDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRcAitMOeGy lZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt 66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1Jdxn wQ5hYIizPtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOh D7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR7hYQe7xFSkyy BNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuIyV77zGHcizN300QyNQliBJIWENie J0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1Ud DgQWBBQahGK8SEwzJQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGU a6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2fBluornFdLwUv Z+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3 UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodm VjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK +JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrW IozchLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1 WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1B+TJYm5X f6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II 4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8 VCLAAVBpQ570su9t+Oza8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u -----END CERTIFICATE----- QuoVadis Root CA 3 ================== -----BEGIN CERTIFICATE----- MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8 nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4 ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2 Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp 8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto= -----END CERTIFICATE----- Security Communication Root CA ============================== -----BEGIN CERTIFICATE----- MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw 8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX 5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2 JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g 0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ 6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi FL39vmwLAw== -----END CERTIFICATE----- Sonera Class 2 Root CA ====================== -----BEGIN CERTIFICATE----- MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3 /Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt 0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH llpwrN9M -----END CERTIFICATE----- Staat der Nederlanden Root CA ============================= -----BEGIN CERTIFICATE----- MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJOTDEeMBwGA1UE ChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFhdCBkZXIgTmVkZXJsYW5kZW4g Um9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEyMTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4w HAYDVQQKExVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxh bmRlbiBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFt vsznExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw719tV2U02P jLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MOhXeiD+EwR+4A5zN9RGca C1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+UtFE5A3+y3qcym7RHjm+0Sq7lr7HcsBth vJly3uSJt3omXdozSVtSnA71iq3DuD3oBmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn6 22r+I/q85Ej0ZytqERAhSQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRV HSAAMDwwOgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMvcm9v dC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA7Jbg0zTBLL9s+DAN BgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k/rvuFbQvBgwp8qiSpGEN/KtcCFtR EytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzmeafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbw MVcoEoJz6TMvplW0C5GUR5z6u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3y nGQI0DvDKcWy7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw== -----END CERTIFICATE----- UTN USERFirst Hardware Root CA ============================== -----BEGIN CERTIFICATE----- MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UE BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAd BgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgx OTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0 eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVz ZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3 DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlI wrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFd tqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8 i4fDidNdoI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjf Pe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhbAgMBAAGjgbkw gbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFKFyXyYbKJhDlV0HN9WF lp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNF UkZpcnN0LUhhcmR3YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF BwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM //bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28GpgoiskliCE7/yMgUsogW XecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2 lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kn iCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67 nfhmqA== -----END CERTIFICATE----- Camerfirma Chambers of Commerce Root ==================================== -----BEGIN CERTIFICATE----- MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i ZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAx NjEzNDNaFw0zNzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZp cm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3Jn MSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOC AQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlU xFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41XQEMIwRH NaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jW DA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFV d9oKDMyXroDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1Ud EwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFtYmVyc2lnbi5v cmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p26EpW1eLTXYGduHRooowDgYDVR0P AQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hh bWJlcnNpZ24ub3JnMCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD VR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEBAAxBl8IahsAi fJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvD L8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wN UPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/n ADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1 erfutGWaIZDgqtCYvDi1czyL+Nw= -----END CERTIFICATE----- Camerfirma Global Chambersign Root ================================== -----BEGIN CERTIFICATE----- MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i ZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYx NDE4WhcNMzcwOTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJt YSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEg MB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAw ggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J 1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8O by4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl 6DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c 8lCrEqWhz0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/ BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJzaWduLm9yZy9j aGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4wTcbOX60Qq+UDpfqpFDAOBgNVHQ8B Af8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBj aGFtYmVyc2lnbi5vcmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y ZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0BAQUFAAOCAQEA PDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9Y gOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJ PJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4 IBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes t2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A== -----END CERTIFICATE----- NetLock Notary (Class A) Root ============================= -----BEGIN CERTIFICATE----- MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQI EwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6 dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9j ayBLb3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oX DTE5MDIxOTIzMTQ0N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQH EwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYD VQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFz cyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSM D7tM9DceqQWC2ObhbHDqeLVu0ThEDaiDzl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZ z+qMkjvN9wfcZnSX9EUi3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC /tmwqcm8WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LYOph7 tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2EsiNCubMvJIH5+hCoR6 4sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCCApswDgYDVR0PAQH/BAQDAgAGMBIG A1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaC Ak1GSUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pv bGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2Vn LWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0 ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFz IGxlaXJhc2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBh IGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVu b3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBh bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sg Q1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFp bCBhdCBjcHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5 ayZrU3/b39/zcT0mwBQOxmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjP ytoUMaFP0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQQeJB CWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxkf1qbFFgBJ34TUMdr KuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK8CtmdWOMovsEPoMOmzbwGOQmIMOM 8CgHrTwXZoi1/baI -----END CERTIFICATE----- XRamp Global CA Root ==================== -----BEGIN CERTIFICATE----- MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc /Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz 8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw= -----END CERTIFICATE----- Go Daddy Class 2 CA =================== -----BEGIN CERTIFICATE----- MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv 2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32 qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b vZ8= -----END CERTIFICATE----- Starfield Class 2 CA ==================== -----BEGIN CERTIFICATE----- MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3 QBFGmh95DmK/D5fs4C8fF5Q= -----END CERTIFICATE----- StartCom Certification Authority ================================ -----BEGIN CERTIFICATE----- MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0 NjM2WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/ Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt 2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z 6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/ untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT 37uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0 Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNj YS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUH AgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRw Oi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYg U3RhcnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5 LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0Q29tIENl cnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUgYXQgaHR0cDovL2NlcnQuc3Rh cnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilT dGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOC AgEAFmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8jhvh 3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUWFjgKXlf2Ysd6AgXm vB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHk fY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3 fsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZ EoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl 1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/7HW/ lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/FlUQqmMGqz9IgcgA38coro g14= -----END CERTIFICATE----- Taiwan GRCA =========== -----BEGIN CERTIFICATE----- MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG EwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X DTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv dmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD ggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN w8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5 BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O 1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO htX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov J5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7 Q3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t B6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB O9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8 lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV HRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2 09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj Zwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2 Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU D7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz DxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk Z6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk 7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy +fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS -----END CERTIFICATE----- Swisscom Root CA 1 ================== -----BEGIN CERTIFICATE----- MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQG EwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2VydGlmaWNhdGUgU2Vy dmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3QgQ0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4 MTgyMjA2MjBaMGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGln aXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIIC IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9m2BtRsiM MW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdihFvkcxC7mlSpnzNApbjyF NDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/TilftKaNXXsLmREDA/7n29uj/x2lzZAe AR81sH8A25Bvxn570e56eqeqDFdvpG3FEzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkC b6dJtDZd0KTeByy2dbcokdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn 7uHbHaBuHYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNFvJbN cA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo19AOeCMgkckkKmUp WyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjCL3UcPX7ape8eYIVpQtPM+GP+HkM5 haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJWbjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNY MUJDLXT5xp6mig/p/r+D5kNXJLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYw HQYDVR0hBBYwFDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzcK6FptWfUjNP9 MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzfky9NfEBWMXrrpA9gzXrzvsMn jgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7IkVh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQ MbFamIp1TpBcahQq4FJHgmDmHtqBsfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4H VtA4oJVwIHaM190e3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtl vrsRls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ipmXeascCl OS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HHb6D0jqTsNFFbjCYDcKF3 1QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksfrK/7DZBaZmBwXarNeNQk7shBoJMBkpxq nvy5JMWzFYJ+vq6VK+uxwNrjAWALXmmshFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCy x/yP2FS1k2Kdzs9Z+z0YzirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMW NY6E0F/6MBr1mmz0DlP5OlvRHA== -----END CERTIFICATE----- DigiCert Assured ID Root CA =========================== -----BEGIN CERTIFICATE----- MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO 9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW /lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF 66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i 8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe +o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== -----END CERTIFICATE----- DigiCert Global Root CA ======================= -----BEGIN CERTIFICATE----- MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5 BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H 4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y 7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm 8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886 UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= -----END CERTIFICATE----- DigiCert High Assurance EV Root CA ================================== -----BEGIN CERTIFICATE----- MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3 MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K -----END CERTIFICATE----- Certplus Class 2 Primary CA =========================== -----BEGIN CERTIFICATE----- MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR 5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+ 7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW //1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 l7+ijrRU -----END CERTIFICATE----- DST Root CA X3 ============== -----BEGIN CERTIFICATE----- MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1 cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9 UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ -----END CERTIFICATE----- DST ACES CA X6 ============== -----BEGIN CERTIFICATE----- MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQG EwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VT MRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NTha MFsxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UE CxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOC AQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzI DZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCa pCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKBXy314pow GCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPy MjwmR/onJALJfh1biEITajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1Ud EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3Qu Y29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnRy dXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMtaW5kZXguaHRtbDAdBgNVHQ4EFgQU CXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V2 5FYrnJmQ6AgwbN99Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t Fr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpRrscL9yuwNwXs vFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3 oKfN5XozNmr6mis= -----END CERTIFICATE----- SwissSign Gold CA - G2 ====================== -----BEGIN CERTIFICATE----- MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkNIMRUw EwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcN MDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dp c3NTaWduIEFHMR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0B AQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUq t2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5C jCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpg vd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbLtK/tREDF ylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvR AiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuend jIj3o02yMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkO peUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59je883WX0XaxR 7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxMgI93e2CaHt+28kgeDrpOVG2Y4OGi GqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw AwEB/zAdBgNVHQ4EFgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64 OfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe645R88a7A3hfm 5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr 44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOf Mke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6m Gu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxp mo/a77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJk vC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7XdVAyksLf KzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG2mqeSz53OiATIgHQv2ieY2Br NU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6Lqj viOvrv1vA+ACOzB2+httQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ -----END CERTIFICATE----- SwissSign Silver CA - G2 ======================== -----BEGIN CERTIFICATE----- MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCQ0gxFTAT BgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMB4X DTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0NlowRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3 aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG 9w0BAQEFAAOCAg8AMIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644 N0MvFz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7brYT7QbNHm +/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieFnbAVlDLaYQ1HTWBCrpJH 6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH6ATK72oxh9TAtvmUcXtnZLi2kUpCe2Uu MGoM9ZDulebyzYLs2aFK7PayS+VFheZteJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5h qAaEuSh6XzjZG6k4sIN/c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5 FZGkECwJMoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRHHTBs ROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTfjNFusB3hB48IHpmc celM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb65i/4z3GcRm25xBWNOHkDRUjvxF3X CO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ BAUwAwEB/zAdBgNVHQ4EFgQUF6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRB tjpbO8tFnb0cwpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0 cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBAHPGgeAn0i0P 4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShpWJHckRE1qTodvBqlYJ7YH39F kWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L 3XWgwF15kIwb4FDm3jH+mHtwX6WQ2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx /uNncqCxv1yL5PqZIseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFa DGi8aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2Xem1ZqSqP e97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQRdAtq/gsD/KNVV4n+Ssuu WxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJ DIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ub DgEj8Z+7fNzcbBGXJbLytGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u -----END CERTIFICATE----- GeoTrust Primary Certification Authority ======================================== -----BEGIN CERTIFICATE----- MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9 nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG 1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= -----END CERTIFICATE----- thawte Primary Root CA ====================== -----BEGIN CERTIFICATE----- MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3 MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ 1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89 jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA== -----END CERTIFICATE----- VeriSign Class 3 Public Primary Certification Authority - G5 ============================================================ -----BEGIN CERTIFICATE----- MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/ Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/ BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+ X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq -----END CERTIFICATE----- SecureTrust CA ============== -----BEGIN CERTIFICATE----- MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b 01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/ BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR 3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= -----END CERTIFICATE----- Secure Global CA ================ -----BEGIN CERTIFICATE----- MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g 8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi 0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+ OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5 3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW -----END CERTIFICATE----- COMODO Certification Authority ============================== -----BEGIN CERTIFICATE----- MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1 dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH +7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV 4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA 1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN +8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ== -----END CERTIFICATE----- Network Solutions Certificate Authority ======================================= -----BEGIN CERTIFICATE----- MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc /Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q 4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/ GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey -----END CERTIFICATE----- WellsSecure Public Root Certificate Authority ============================================= -----BEGIN CERTIFICATE----- MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoM F1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYw NAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN MDcxMjEzMTcwNzU0WhcNMjIxMjE0MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dl bGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYD VQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+rWxxTkqxtnt3CxC5FlAM1 iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjUDk/41itMpBb570OYj7OeUt9tkTmPOL13 i0Nj67eT/DBMHAGTthP796EfvyXhdDcsHqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8 bJVhHlfXBIEyg1J55oNjz7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiB K0HmOFafSZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/SlwxlAgMB AAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly9jcmwu cGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0PAQH/BAQDAgHGMB0GA1UdDgQWBBQm lRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0jBIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGB i6SBiDCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRww GgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEBALkVsUSRzCPI K0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd/ZDJPHV3V3p9+N701NX3leZ0 bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pBA4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSlj qHyita04pO2t/caaH/+Xc/77szWnk4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+es E2fDbbFwRnzVlhE9iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJ tylv2G0xffX8oRAHh84vWdw+WNs= -----END CERTIFICATE----- COMODO ECC Certification Authority ================================== -----BEGIN CERTIFICATE----- MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X 4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= -----END CERTIFICATE----- IGC/A ===== -----BEGIN CERTIFICATE----- MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYTAkZSMQ8wDQYD VQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVE Q1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZy MB4XDTAyMTIxMzE0MjkyM1oXDTIwMTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQI EwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NT STEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMIIB IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaIs9z4iPf930Pfeo2aSVz2 TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCW So7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYy HF2fYPepraX/z9E0+X1bF8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNd frGoRpAxVs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGdPDPQ tQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNVHSAEDjAMMAoGCCqB egF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAxNjAfBgNVHSMEGDAWgBSjBS8YYFDC iQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUFAAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RK q89toB9RlPhJy3Q2FLwV3duJL92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3Q MZsyK10XZZOYYLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2aNjSaTFR+FwNI lQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R0982gaEbeC9xs/FZTEYYKKuF 0mBWWg== -----END CERTIFICATE----- Security Communication EV RootCA1 ================================= -----BEGIN CERTIFICATE----- MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDElMCMGA1UEChMc U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMhU2VjdXJpdHkgQ29tbXVuaWNh dGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIzMloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UE BhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNl Y3VyaXR5IENvbW11bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC AQoCggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSERMqm4miO /VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gOzXppFodEtZDkBp2uoQSX WHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4z ZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDFMxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4 bepJz11sS6/vmsJWXMY1VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK 9U2vP9eCOKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG SIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HWtWS3irO4G8za+6xm iEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZq51ihPZRwSzJIxXYKLerJRO1RuGG Av8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDbEJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnW mHyojf6GPgcWkuF75x3sM3Z+Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEW T1MKZPlO9L9OVL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490 -----END CERTIFICATE----- OISTE WISeKey Global Root GA CA =============================== -----BEGIN CERTIFICATE----- MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5 IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9 Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ /yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4 +vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0= -----END CERTIFICATE----- Microsec e-Szigno Root CA ========================= -----BEGIN CERTIFICATE----- MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAwcjELMAkGA1UE BhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNyb3NlYyBMdGQuMRQwEgYDVQQL EwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0 MDYxMjI4NDRaFw0xNzA0MDYxMjI4NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVz dDEWMBQGA1UEChMNTWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMT GU1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB AQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2uuO/TEdyB5s87lozWbxXG d36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/N oqdNAoI/gqyFxuEPkEeZlApxcpMqyabAvjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjc QR/Ji3HWVBTji1R4P770Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJ PqW+jqpx62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcBAQRb MFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3AwLQYIKwYBBQUHMAKG IWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAPBgNVHRMBAf8EBTADAQH/MIIBcwYD VR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIBAQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3 LmUtc3ppZ25vLmh1L1NaU1ovMIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0A dAB2AOEAbgB5ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABTAHoAbwBsAGcA 4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABhACAAcwB6AGUAcgBpAG4AdAAg AGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABoAHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMA egBpAGcAbgBvAC4AaAB1AC8AUwBaAFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6 Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NO PU1pY3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxPPU1pY3Jv c2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdDtiaW5h cnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuBEGluZm9AZS1zemlnbm8uaHWkdzB1MSMw IQYDVQQDDBpNaWNyb3NlYyBlLVN6aWduw7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhT WjEWMBQGA1UEChMNTWljcm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhV MIGsBgNVHSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJIVTER MA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDASBgNVBAsTC2UtU3pp Z25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBSb290IENBghEAzLjnv04pGv2i3Gal HCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMT nGZjWS7KXHAM/IO8VbH0jgdsZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FE aGAHQzAxQmHl7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a 86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfRhUZLphK3dehK yVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/MPMMNz7UwiiAc7EBt51alhQB S6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU= -----END CERTIFICATE----- Certigna ======== -----BEGIN CERTIFICATE----- MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3 MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+ ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY 1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== -----END CERTIFICATE----- Deutsche Telekom Root CA 2 ========================== -----BEGIN CERTIFICATE----- MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5 MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5 bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8 rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU Cm26OWMohpLzGITY+9HPBVZkVw== -----END CERTIFICATE----- Cybertrust Global Root ====================== -----BEGIN CERTIFICATE----- MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4 MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA +Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW 0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin 89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT 8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2 MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi 5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2 hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW WL1WMRJOEcgh4LMRkWXbtKaIOM5V -----END CERTIFICATE----- ePKI Root Certification Authority ================================= -----BEGIN CERTIFICATE----- MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX 12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+ ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/ vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0 1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw= -----END CERTIFICATE----- T\xc3\x9c\x42\xC4\xB0TAK UEKAE K\xC3\xB6k Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 - S\xC3\xBCr\xC3\xBCm 3 ============================================================================================================================= -----BEGIN CERTIFICATE----- MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRSMRgwFgYDVQQH DA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJpbGltc2VsIHZlIFRla25vbG9q aWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSwVEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ry b25payB2ZSBLcmlwdG9sb2ppIEFyYcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNV BAsMGkthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUg S8O2ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAeFw0wNzA4 MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIxGDAWBgNVBAcMD0dlYnpl IC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmHF n3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBUQUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZl IEtyaXB0b2xvamkgQXJhxZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2Ft dSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7ZrIFNl cnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIBIjANBgkqhkiG9w0B AQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4hgb46ezzb8R1Sf1n68yJMlaCQvEhO Eav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yKO7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1 xnnRFDDtG1hba+818qEhTsXOfJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR 6Oqeyjh1jmKwlZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQIDAQABo0IwQDAd BgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF MAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmPNOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4 N5EY3ATIZJkrGG2AA1nJrvhY0D7twyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLT y9LQQfMmNkqblWwM7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYh LBOhgLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5noN+J1q2M dqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUsyZyQ2uypQjyttgI= -----END CERTIFICATE----- Buypass Class 2 CA 1 ==================== -----BEGIN CERTIFICATE----- MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMiBDQSAxMB4XDTA2 MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7M cXA0ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLXl18xoS83 0r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVBHfCuuCkslFJgNJQ72uA4 0Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/R uFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNC MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0P AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLPgcIV 1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+DKhQ7SLHrQVMdvvt 7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKuBctN518fV4bVIJwo+28TOPX2EZL2 fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHsh7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5w wDX3OaJdZtB7WZ+oRxKaJyOkLY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho -----END CERTIFICATE----- EBG Elektronik Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 ========================================================================== -----BEGIN CERTIFICATE----- MIIF5zCCA8+gAwIBAgIITK9zQhyOdAIwDQYJKoZIhvcNAQEFBQAwgYAxODA2BgNVBAMML0VCRyBF bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMTcwNQYDVQQKDC5FQkcg QmlsacWfaW0gVGVrbm9sb2ppbGVyaSB2ZSBIaXptZXRsZXJpIEEuxZ4uMQswCQYDVQQGEwJUUjAe Fw0wNjA4MTcwMDIxMDlaFw0xNjA4MTQwMDMxMDlaMIGAMTgwNgYDVQQDDC9FQkcgRWxla3Ryb25p ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTE3MDUGA1UECgwuRUJHIEJpbGnFn2lt IFRla25vbG9qaWxlcmkgdmUgSGl6bWV0bGVyaSBBLsWeLjELMAkGA1UEBhMCVFIwggIiMA0GCSqG SIb3DQEBAQUAA4ICDwAwggIKAoICAQDuoIRh0DpqZhAy2DE4f6en5f2h4fuXd7hxlugTlkaDT7by X3JWbhNgpQGR4lvFzVcfd2NR/y8927k/qqk153nQ9dAktiHq6yOU/im/+4mRDGSaBUorzAzu8T2b gmmkTPiab+ci2hC6X5L8GCcKqKpE+i4stPtGmggDg3KriORqcsnlZR9uKg+ds+g75AxuetpX/dfr eYteIAbTdgtsApWjluTLdlHRKJ2hGvxEok3MenaoDT2/F08iiFD9rrbskFBKW5+VQarKD7JK/oCZ TqNGFav4c0JqwmZ2sQomFd2TkuzbqV9UIlKRcF0T6kjsbgNs2d1s/OsNA/+mgxKb8amTD8UmTDGy Y5lhcucqZJnSuOl14nypqZoaqsNW2xCaPINStnuWt6yHd6i58mcLlEOzrz5z+kI2sSXFCjEmN1Zn uqMLfdb3ic1nobc6HmZP9qBVFCVMLDMNpkGMvQQxahByCp0OLna9XvNRiYuoP1Vzv9s6xiQFlpJI qkuNKgPlV5EQ9GooFW5Hd4RcUXSfGenmHmMWOeMRFeNYGkS9y8RsZteEBt8w9DeiQyJ50hBs37vm ExH8nYQKE3vwO9D8owrXieqWfo1IhR5kX9tUoqzVegJ5a9KK8GfaZXINFHDk6Y54jzJ0fFfy1tb0 Nokb+Clsi7n2l9GkLqq+CxnCRelwXQIDAJ3Zo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB /wQEAwIBBjAdBgNVHQ4EFgQU587GT/wWZ5b6SqMHwQSny2re2kcwHwYDVR0jBBgwFoAU587GT/wW Z5b6SqMHwQSny2re2kcwDQYJKoZIhvcNAQEFBQADggIBAJuYml2+8ygjdsZs93/mQJ7ANtyVDR2t FcU22NU57/IeIl6zgrRdu0waypIN30ckHrMk2pGI6YNw3ZPX6bqz3xZaPt7gyPvT/Wwp+BVGoGgm zJNSroIBk5DKd8pNSe/iWtkqvTDOTLKBtjDOWU/aWR1qeqRFsIImgYZ29fUQALjuswnoT4cCB64k XPBfrAowzIpAoHMEwfuJJPaaHFy3PApnNgUIMbOv2AFoKuB4j3TeuFGkjGwgPaL7s9QJ/XvCgKqT bCmYIai7FvOpEl90tYeY8pUm3zTvilORiF0alKM/fCL414i6poyWqD1SNGKfAB5UVUJnxk1Gj7sU RT0KlhaOEKGXmdXTMIXM3rRyt7yKPBgpaP3ccQfuJDlq+u2lrDgv+R4QDgZxGhBM/nV+/x5XOULK 1+EVoVZVWRvRo68R2E7DpSvvkL/A7IITW43WciyTTo9qKd+FPNMN4KIYEsxVL0e3p5sC/kH2iExt 2qkBR4NkJ2IQgtYSe14DHzSpyZH+r11thie3I6p1GMog57AP14kOpmciY/SDQSsGS7tY1dHXt7kQ Y9iJSrSq3RZj9W6+YKH47ejWkE8axsWgKdOnIaj1Wjz3x0miIZpKlVIglnKaZsv30oZDfCK+lvm9 AahH3eU7QPl1K5srRmSGjR70j/sHd9DqSaIcjVIUpgqT -----END CERTIFICATE----- certSIGN ROOT CA ================ -----BEGIN CERTIFICATE----- MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2 ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD 0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943 AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8 SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0 x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD -----END CERTIFICATE----- CNNIC ROOT ========== -----BEGIN CERTIFICATE----- MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJDTjEOMAwGA1UE ChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2MDcwOTE0WhcNMjcwNDE2MDcw OTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1Qw ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzD o+/hn7E7SIX1mlwhIhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tiz VHa6dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZOV/kbZKKT VrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrCGHn2emU1z5DrvTOTn1Or czvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gNv7Sg2Ca+I19zN38m5pIEo3/PIKe38zrK y5nLAgMBAAGjczBxMBEGCWCGSAGG+EIBAQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscC wQ7vptU7ETAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991S lgrHAsEO76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnKOOK5 Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvHugDnuL8BV8F3RTIM O/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7HgviyJA/qIYM/PmLXoXLT1tLYhFHxUV8 BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fLbuXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2 G8kS1sHNzYDzAgE8yGnLRUhj2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5m mxE= -----END CERTIFICATE----- ApplicationCA - Japanese Government =================================== -----BEGIN CERTIFICATE----- MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEcMBoGA1UEChMT SmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRpb25DQTAeFw0wNzEyMTIxNTAw MDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYTAkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zl cm5tZW50MRYwFAYDVQQLEw1BcHBsaWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB CgKCAQEAp23gdE6Hj6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4 fl+Kf5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55IrmTwcrN wVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cwFO5cjFW6WY2H/CPek9AE jP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDihtQWEjdnjDuGWk81quzMKq2edY3rZ+nYVu nyoKb58DKTCXKB28t89UKU5RMfkntigm/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRU WssmP3HMlEYNllPqa0jQk/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNV BAYTAkpQMRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOCseOD vOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADlqRHZ3ODrs o2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJhyzjVOGjprIIC8CFqMjSnHH2HZ9g /DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYD io+nEhEMy/0/ecGc/WLuo89UDNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmW dupwX3kSa+SjB1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL rosot4LKGAfmt1t06SAZf7IbiVQ= -----END CERTIFICATE----- GeoTrust Primary Certification Authority - G3 ============================================= -----BEGIN CERTIFICATE----- MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0 IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr 2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9 cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt -----END CERTIFICATE----- thawte Primary Root CA - G2 =========================== -----BEGIN CERTIFICATE----- MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5 8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== -----END CERTIFICATE----- thawte Primary Root CA - G3 =========================== -----BEGIN CERTIFICATE----- MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC +BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY 7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC 8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A= -----END CERTIFICATE----- GeoTrust Primary Certification Authority - G2 ============================================= -----BEGIN CERTIFICATE----- MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1 OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+ EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2 npaqBA+K -----END CERTIFICATE----- VeriSign Universal Root Certification Authority =============================================== -----BEGIN CERTIFICATE----- MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0 aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj 1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72 9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3 Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4 mJO37M2CYfE45k+XmCpajQ== -----END CERTIFICATE----- VeriSign Class 3 Public Primary Certification Authority - G4 ============================================================ -----BEGIN CERTIFICATE----- MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3 b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5 IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8 Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB /zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== -----END CERTIFICATE----- NetLock Arany (Class Gold) Főtanúsítvány ============================================ -----BEGIN CERTIFICATE----- MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610 dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6 c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu 0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw /HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1 neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= -----END CERTIFICATE----- Staat der Nederlanden Root CA - G2 ================================== -----BEGIN CERTIFICATE----- MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g Um9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oXDTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMC TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ 5291qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8SpuOUfiUtn vWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPUZ5uW6M7XxgpT0GtJlvOj CwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvEpMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiil e7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCR OME4HYYEhLoaJXhena/MUGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpI CT0ugpTNGmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy5V65 48r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv6q012iDTiIJh8BIi trzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEKeN5KzlW/HdXZt1bv8Hb/C3m1r737 qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMB AAGjgZcwgZQwDwYDVR0TAQH/BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcC ARYxaHR0cDovL3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqGSIb3DQEBCwUA A4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLySCZa59sCrI2AGeYwRTlHSeYAz +51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwj f/ST7ZwaUb7dRUG/kSS0H4zpX897IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaN kqbG9AclVMwWVxJKgnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfk CpYL+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxLvJxxcypF URmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkmbEgeqmiSBeGCc1qb3Adb CG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvkN1trSt8sV4pAWja63XVECDdCcAz+3F4h oKOKwJCcaNpQ5kUQR3i2TtJlycM33+FCY7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoV IPVVYpbtbZNQvOSqeK3Zywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm 66+KAQ== -----END CERTIFICATE----- CA Disig ======== -----BEGIN CERTIFICATE----- MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMK QnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwHhcNMDYw MzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlz bGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3 DQEBAQUAA4IBDwAwggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgm GErENx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnXmjxUizkD Pw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYDXcDtab86wYqg6I7ZuUUo hwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhWS8+2rT+MitcE5eN4TPWGqvWP+j1scaMt ymfraHtuM6kMgiioTGohQBUgDCZbg8KpFhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8w gfwwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0P AQH/BAQDAgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cuZGlz aWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5zay9jYS9jcmwvY2Ff ZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2svY2EvY3JsL2NhX2Rpc2lnLmNybDAa BgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEwDQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59t WDYcPQuBDRIrRhCA/ec8J9B6yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3 mkkp7M5+cTxqEEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/ CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeBEicTXxChds6K ezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFNPGO+I++MzVpQuGhU+QqZMxEA 4Z7CRneC9VkGjCFMhwnN5ag= -----END CERTIFICATE----- Juur-SK ======= -----BEGIN CERTIFICATE----- MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcNAQkBFglwa2lA c2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMRAw DgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMwMVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqG SIb3DQEJARYJcGtpQHNrLmVlMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVy aW1pc2tlc2t1czEQMA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC ggEBAIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOBSvZiF3tf TQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkzABpTpyHhOEvWgxutr2TC +Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvHLCu3GFH+4Hv2qEivbDtPL+/40UceJlfw UR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMPPbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDa Tpxt4brNj3pssAki14sL2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQF MAMBAf8wggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwICMIHD HoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDkAGwAagBhAHMAdABh AHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0AHMAZQBlAHIAaQBtAGkAcwBrAGUA cwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABzAGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABr AGkAbgBuAGkAdABhAG0AaQBzAGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nw cy8wKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcYP2/v6X2+MA4G A1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOiCfP+JmeaUOTDBS8rNXiRTHyo ERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+gkcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyL abVAyJRld/JXIWY7zoVAtjNjGr95HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678 IIbsSt4beDI3poHSna9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkh Mp6qqIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0ZTbvGRNs2 yyqcjg== -----END CERTIFICATE----- Hongkong Post Root CA 1 ======================= -----BEGIN CERTIFICATE----- MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1 ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT c4afU9hDDl3WY4JxHYB0yvbiAmvZWg== -----END CERTIFICATE----- SecureSign RootCA11 =================== -----BEGIN CERTIFICATE----- MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1 cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01 y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061 lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I= -----END CERTIFICATE----- ACEDICOM Root ============= -----BEGIN CERTIFICATE----- MIIFtTCCA52gAwIBAgIIYY3HhjsBggUwDQYJKoZIhvcNAQEFBQAwRDEWMBQGA1UEAwwNQUNFRElD T00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMB4XDTA4 MDQxODE2MjQyMloXDTI4MDQxMzE2MjQyMlowRDEWMBQGA1UEAwwNQUNFRElDT00gUm9vdDEMMAoG A1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMIICIjANBgkqhkiG9w0BAQEF AAOCAg8AMIICCgKCAgEA/5KV4WgGdrQsyFhIyv2AVClVYyT/kGWbEHV7w2rbYgIB8hiGtXxaOLHk WLn709gtn70yN78sFW2+tfQh0hOR2QetAQXW8713zl9CgQr5auODAKgrLlUTY4HKRxx7XBZXehuD YAQ6PmXDzQHe3qTWDLqO3tkE7hdWIpuPY/1NFgu3e3eM+SW10W2ZEi5PGrjm6gSSrj0RuVFCPYew MYWveVqc/udOXpJPQ/yrOq2lEiZmueIM15jO1FillUAKt0SdE3QrwqXrIhWYENiLxQSfHY9g5QYb m8+5eaA9oiM/Qj9r+hwDezCNzmzAv+YbX79nuIQZ1RXve8uQNjFiybwCq0Zfm/4aaJQ0PZCOrfbk HQl/Sog4P75n/TSW9R28MHTLOO7VbKvU/PQAtwBbhTIWdjPp2KOZnQUAqhbm84F9b32qhm2tFXTT xKJxqvQUfecyuB+81fFOvW8XAjnXDpVCOscAPukmYxHqC9FK/xidstd7LzrZlvvoHpKuE1XI2Sf2 3EgbsCTBheN3nZqk8wwRHQ3ItBTutYJXCb8gWH8vIiPYcMt5bMlL8qkqyPyHK9caUPgn6C9D4zq9 2Fdx/c6mUlv53U3t5fZvie27k5x2IXXwkkwp9y+cAS7+UEaeZAwUswdbxcJzbPEHXEUkFDWug/Fq TYl6+rPYLWbwNof1K1MCAwEAAaOBqjCBpzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKaz 4SsrSbbXc6GqlPUB53NlTKxQMA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUprPhKytJttdzoaqU 9QHnc2VMrFAwRAYDVR0gBD0wOzA5BgRVHSAAMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly9hY2VkaWNv bS5lZGljb21ncm91cC5jb20vZG9jMA0GCSqGSIb3DQEBBQUAA4ICAQDOLAtSUWImfQwng4/F9tqg aHtPkl7qpHMyEVNEskTLnewPeUKzEKbHDZ3Ltvo/Onzqv4hTGzz3gvoFNTPhNahXwOf9jU8/kzJP eGYDdwdY6ZXIfj7QeQCM8htRM5u8lOk6e25SLTKeI6RF+7YuE7CLGLHdztUdp0J/Vb77W7tH1Pwk zQSulgUV1qzOMPPKC8W64iLgpq0i5ALudBF/TP94HTXa5gI06xgSYXcGCRZj6hitoocf8seACQl1 ThCojz2GuHURwCRiipZ7SkXp7FnFvmuD5uHorLUwHv4FB4D54SMNUI8FmP8sX+g7tq3PgbUhh8oI KiMnMCArz+2UW6yyetLHKKGKC5tNSixthT8Jcjxn4tncB7rrZXtaAWPWkFtPF2Y9fwsZo5NjEFIq nxQWWOLcpfShFosOkYuByptZ+thrkQdlVV9SH686+5DdaaVbnG0OLLb6zqylfDJKZ0DcMDQj3dcE I2bw/FWAp/tmGYI1Z2JwOV5vx+qQQEQIHriy1tvuWacNGHk0vFQYXlPKNFHtRQrmjseCNj6nOGOp MCwXEGCSn1WHElkQwg9naRHMTh5+Spqtr0CodaxWkHS4oJyleW/c6RrIaQXpuvoDs3zk4E7Czp3o tkYNbn5XOmeUwssfnHdKZ05phkOTOPu220+DkdRgfks+KzgHVZhepA== -----END CERTIFICATE----- Microsec e-Szigno Root CA 2009 ============================== -----BEGIN CERTIFICATE----- MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG 0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm 1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02 yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi LXpUq3DDfSJlgnCW -----END CERTIFICATE----- GlobalSign Root CA - R3 ======================= -----BEGIN CERTIFICATE----- MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ 0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3 rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2 xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7 lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8 EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18 YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r kpeDMdmztcpHWD9f -----END CERTIFICATE----- Autoridad de Certificacion Firmaprofesional CIF A62634068 ========================================================= -----BEGIN CERTIFICATE----- MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY 7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx 51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi 6Et8Vcad+qMUu2WFbm5PEn4KPJ2V -----END CERTIFICATE----- Izenpe.com ========== -----BEGIN CERTIFICATE----- MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4MQswCQYDVQQG EwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wHhcNMDcxMjEz MTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMu QS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ 03rKDx6sp4boFmVqscIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAK ClaOxdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6HLmYRY2xU +zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFXuaOKmMPsOzTFlUFpfnXC PCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQDyCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxT OTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbK F7jJeodWLBoBHmy+E60QrLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK 0GqfvEyNBjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8Lhij+ 0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIBQFqNeb+Lz0vPqhbB leStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+HMh3/1uaD7euBUbl8agW7EekFwID AQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2luZm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+ SVpFTlBFIFMuQS4gLSBDSUYgQTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBG NjIgUzgxQzBBBgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O BBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUAA4ICAQB4pgwWSp9MiDrAyw6l Fn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWblaQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbga kEyrkgPH7UIBzg/YsfqikuFgba56awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8q hT/AQKM6WfxZSzwoJNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Cs g1lwLDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCTVyvehQP5 aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGkLhObNA5me0mrZJfQRsN5 nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJbUjWumDqtujWTI6cfSN01RpiyEGjkpTHC ClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZo Q0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z WrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== -----END CERTIFICATE----- Chambers of Commerce Root - 2008 ================================ -----BEGIN CERTIFICATE----- MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/ ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331 lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ 0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2 EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1 wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH 3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6 M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1 YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF 9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ -----END CERTIFICATE----- Global Chambersign Root - 2008 ============================== -----BEGIN CERTIFICATE----- MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0 ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB /gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp 1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0 dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG /5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6 ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg 9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z 09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B -----END CERTIFICATE----- Go Daddy Root Certificate Authority - G2 ======================================== -----BEGIN CERTIFICATE----- MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq 9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD +qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9 BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r 5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1 -----END CERTIFICATE----- Starfield Root Certificate Authority - G2 ========================================= -----BEGIN CERTIFICATE----- MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0 eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx 4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 -----END CERTIFICATE----- Starfield Services Root Certificate Authority - G2 ================================================== -----BEGIN CERTIFICATE----- MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2 h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6 -----END CERTIFICATE----- AffirmTrust Commercial ====================== -----BEGIN CERTIFICATE----- MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6 BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv 0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= -----END CERTIFICATE----- AffirmTrust Networking ====================== -----BEGIN CERTIFICATE----- MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24 /PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6 12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23 WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9 /ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= -----END CERTIFICATE----- AffirmTrust Premium =================== -----BEGIN CERTIFICATE----- MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV 5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs +7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04 6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5 /bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo +Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB /wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC 6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK +4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60 g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw== -----END CERTIFICATE----- AffirmTrust Premium ECC ======================= -----BEGIN CERTIFICATE----- MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X 57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM eQ== -----END CERTIFICATE----- Certum Trusted Network CA ========================= -----BEGIN CERTIFICATE----- MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4 fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0 cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1 mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI 03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= -----END CERTIFICATE----- Certinomis - Autorité Racine ============================= -----BEGIN CERTIFICATE----- MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjETMBEGA1UEChMK Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAkBgNVBAMMHUNlcnRpbm9taXMg LSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkG A1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYw JAYDVQQDDB1DZXJ0aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQAD ggIPADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jYF1AMnmHa wE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N8y4oH3DfVS9O7cdxbwly Lu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWerP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw 2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92N jMD2AR5vpTESOH2VwnHu7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9q c1pkIuVC28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6lSTC lrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1Enn1So2+WLhl+HPNb xxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB0iSVL1N6aaLwD4ZFjliCK0wi1F6g 530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql095gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna 4NH4+ej9Uji29YnfAgMBAAGjWzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G A1UdDgQWBBQNjLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9sov3/4gbIOZ/x WqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZMOH8oMDX/nyNTt7buFHAAQCva R6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40 nJ+U8/aGH88bc62UeYdocMMzpXDn2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1B CxMjidPJC+iKunqjo3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjv JL1vnxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG5ERQL1TE qkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWqpdEdnV1j6CTmNhTih60b WfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZbdsLLO7XSAPCjDuGtbkD326C00EauFddE wk01+dIL8hf2rGbVJLJP0RyZwG71fet0BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/ vgt2Fl43N+bYdJeimUV5 -----END CERTIFICATE----- Root CA Generalitat Valenciana ============================== -----BEGIN CERTIFICATE----- MIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJFUzEfMB0GA1UE ChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290 IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcNMDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3 WjBoMQswCQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UE CxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0G CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+WmmmO3I2 F0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKjSgbwJ/BXufjpTjJ3Cj9B ZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGlu6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQ D0EbtFpKd71ng+CT516nDOeB0/RSrFOyA8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXte JajCq+TA81yc477OMUxkHl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMB AAGjggM7MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBraS5n dmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIICIwYKKwYBBAG/VQIB ADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBl AHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIAYQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIA YQBsAGkAdABhAHQAIABWAGEAbABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQBy AGEAYwBpAPMAbgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA aQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMAaQBvAG4AYQBt AGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQAZQAgAEEAdQB0AG8AcgBpAGQA YQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBu AHQAcgBhACAAZQBuACAAbABhACAAZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAA OgAvAC8AdwB3AHcALgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0 dHA6Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+yeAT8MIGV BgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQswCQYDVQQGEwJFUzEfMB0G A1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5S b290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRh TvW1yEICKrNcda3FbcrnlD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdz Ckj+IHLtb8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg9J63 NI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XFducTZnV+ZfsBn5OH iJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmCIoaZM3Fa6hlXPZHNqcCjbgcTpsnt +GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM= -----END CERTIFICATE----- TWCA Root Certification Authority ================================= -----BEGIN CERTIFICATE----- MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP 4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG 9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== -----END CERTIFICATE----- Security Communication RootCA2 ============================== -----BEGIN CERTIFICATE----- MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++ +T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R 3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8 QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk 3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29 mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 -----END CERTIFICATE----- EC-ACC ====== -----BEGIN CERTIFICATE----- MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7 MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4 HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw 0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0 Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2 E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D 5EI= -----END CERTIFICATE----- Hellenic Academic and Research Institutions RootCA 2011 ======================================================= -----BEGIN CERTIFICATE----- MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI 1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa 71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u 8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH 3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/ MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8 MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD /md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N 7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4 -----END CERTIFICATE----- Actalis Authentication Root CA ============================== -----BEGIN CERTIFICATE----- MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQxDjAM BgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UE AwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDky MjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlz IFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTufClrJ wkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlNAJZa by/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45RnijMCO6 zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1f YVEiVRvjRuPjPdA1YprbrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2 oxgkg4YQ51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2Fbe8l EfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxeKF+w6D9Fz8+vm2/7 hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4Fv6MGn8i1zeQf1xcGDXqVdFUNaBr8 EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbnfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5 jF66CyCU3nuDuP/jVo23Eek7jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLY iDrIn3hm7YnzezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQALe3KHwGCmSUyI WOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70jsNjLiNmsGe+b7bAEzlgqqI0 JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDzWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKx K3JCaKygvU5a2hi/a5iB0P2avl4VSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+ Xlff1ANATIGk0k9jpwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC 4yyXX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+OkfcvHlXHo 2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7RK4X9p2jIugErsWx0Hbhz lefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btUZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXem OR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9 vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== -----END CERTIFICATE----- Trustis FPS Root CA =================== -----BEGIN CERTIFICATE----- MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQG EwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQLExNUcnVzdGlzIEZQUyBSb290 IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTExMzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNV BAoTD1RydXN0aXMgTGltaXRlZDEcMBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJ KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQ RUN+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihHiTHcDnlk H5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjjvSkCqPoc4Vu5g6hBSLwa cY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zt o3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlBOrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEA AaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAd BgNVHQ4EFgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01GX2c GE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmWzaD+vkAMXBJV+JOC yinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP41BIy+Q7DsdwyhEQsb8tGD+pmQQ9P 8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZEf1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHV l/9D7S3B2l0pKoU/rGXuhg8FjZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYl iB6XzCGcKQENZetX2fNXlrtIzYE= -----END CERTIFICATE----- StartCom Certification Authority ================================ -----BEGIN CERTIFICATE----- MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0 NjM3WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/ Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt 2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z 6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/ untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT 37uMdBNSSwIDAQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFulF2mHMMo0aEPQ Qa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCCATgwLgYIKwYBBQUHAgEWImh0 dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cu c3RhcnRzc2wuY29tL2ludGVybWVkaWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENv bW1lcmNpYWwgKFN0YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0 aGUgc2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0aWZpY2F0 aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3RhcnRzc2wuY29t L3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBG cmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5 fPGFf59Jb2vKXfuM/gTFwWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWm N3PH/UvSTa0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst0OcN Org+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNcpRJvkrKTlMeIFw6T tn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKlCcWw0bdT82AUuoVpaiF8H3VhFyAX e2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVFP0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA 2MFrLH9ZXF2RsXAiV+uKa0hK1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBs HvUwyKMQ5bLmKhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ8dCAWZvLMdib D4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnmfyWl8kgAwKQB2j8= -----END CERTIFICATE----- StartCom Certification Authority G2 =================================== -----BEGIN CERTIFICATE----- MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMN U3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg RzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UE ChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3Jp dHkgRzIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8O o1XJJZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsDvfOpL9HG 4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnooD/Uefyf3lLE3PbfHkffi Aez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/Q0kGi4xDuFby2X8hQxfqp0iVAXV16iul Q5XqFYSdCI0mblWbq9zSOdIxHWDirMxWRST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbs O+wmETRIjfaAKxojAuuKHDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8H vKTlXcxNnw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM0D4L nMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/iUUjXuG+v+E5+M5iS FGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9Ha90OrInwMEePnWjFqmveiJdnxMa z6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHgTuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8E BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJ KoZIhvcNAQELBQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K 2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfXUfEpY9Z1zRbk J4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl6/2o1PXWT6RbdejF0mCy2wl+ JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG /+gyRr61M3Z3qAFdlsHB1b6uJcDJHgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTc nIhT76IxW1hPkWLIwpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/Xld blhYXzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5lIxKVCCIc l85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoohdVddLHRDiBYmxOlsGOm 7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulrso8uBtjRkcfGEvRM/TAXw8HaOFvjqerm obp573PYtlNXLfbQ4ddI -----END CERTIFICATE----- Buypass Class 2 Root CA ======================= -----BEGIN CERTIFICATE----- MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1 g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn 9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b /+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU CqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff awrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI zRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn Bkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX Uq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs M+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF AAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI osHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S aq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd DnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD LfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0 oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC wWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS CTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN rJgWVqA= -----END CERTIFICATE----- Buypass Class 3 Root CA ======================= -----BEGIN CERTIFICATE----- MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR 5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh 7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH 2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV /afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8 ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2 KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz 6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi Cp/HuZc= -----END CERTIFICATE----- T-TeleSec GlobalRoot Class 3 ============================ -----BEGIN CERTIFICATE----- MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3 DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK 9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W 0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw== -----END CERTIFICATE----- EE Certification Centre Root CA =============================== -----BEGIN CERTIFICATE----- MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG EwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2Vy dGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIw MTAxMDMwMTAxMDMwWhgPMjAzMDEyMTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlB UyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRy ZSBSb290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IB DwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUyeuuOF0+W2Ap7kaJjbMeM TC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvObntl8jixwKIy72KyaOBhU8E2lf/slLo2 rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIwWFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw 93X2PaRka9ZP585ArQ/dMtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtN P2MbRMNE1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYDVR0T AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/zQas8fElyalL1BSZ MEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEF BQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEFBQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+Rj xY6hUFaTlrg4wCQiZrxTFGGVv9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqM lIpPnTX/dqQGE5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU 3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfM dcGWxZ0= -----END CERTIFICATE----- TURKTRUST Certificate Services Provider Root 2007 ================================================= -----BEGIN CERTIFICATE----- MIIEPTCCAyWgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvzE/MD0GA1UEAww2VMOcUktUUlVTVCBF bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP MA0GA1UEBwwGQW5rYXJhMV4wXAYDVQQKDFVUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgQXJhbMSxayAyMDA3MB4X DTA3MTIyNTE4MzcxOVoXDTE3MTIyMjE4MzcxOVowgb8xPzA9BgNVBAMMNlTDnFJLVFJVU1QgRWxl a3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTELMAkGA1UEBhMCVFIxDzAN BgNVBAcMBkFua2FyYTFeMFwGA1UECgxVVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp bGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7Fni4gKGMpIEFyYWzEsWsgMjAwNzCCASIw DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKu3PgqMyKVYFeaK7yc9SrToJdPNM8Ig3BnuiD9N YvDdE3ePYakqtdTyuTFYKTsvP2qcb3N2Je40IIDu6rfwxArNK4aUyeNgsURSsloptJGXg9i3phQv KUmi8wUG+7RP2qFsmmaf8EMJyupyj+sA1zU511YXRxcw9L6/P8JorzZAwan0qafoEGsIiveGHtya KhUG9qPw9ODHFNRRf8+0222vR5YXm3dx2KdxnSQM9pQ/hTEST7ruToK4uT6PIzdezKKqdfcYbwnT rqdUKDT74eA7YH2gvnmJhsifLfkKS8RQouf9eRbHegsYz85M733WB2+Y8a+xwXrXgTW4qhe04MsC AwEAAaNCMEAwHQYDVR0OBBYEFCnFkKslrxHkYb+j/4hhkeYO/pyBMA4GA1UdDwEB/wQEAwIBBjAP BgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAQDdr4Ouwo0RSVgrESLFF6QSU2TJ/s Px+EnWVUXKgWAkD6bho3hO9ynYYKVZ1WKKxmLNA6VpM0ByWtCLCPyA8JWcqdmBzlVPi5RX9ql2+I aE1KBiY3iAIOtsbWcpnOa3faYjGkVh+uX4132l32iPwa2Z61gfAyuOOI0JzzaqC5mxRZNTZPz/OO Xl0XrRWV2N2y1RVuAE6zS89mlOTgzbUF2mNXi+WzqtvALhyQRNsaXRik7r4EW5nVcV9VZWRi1aKb BFmGyGJ353yCRWo9F7/snXUMrqNvWtMvmDb08PUZqxFdyKbjKlhqQgnDvZImZjINXQhVdP+MmNAK poRq0Tl9 -----END CERTIFICATE----- D-TRUST Root Class 3 CA 2 2009 ============================== -----BEGIN CERTIFICATE----- MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQK DAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTAe Fw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NThaME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxE LVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIw DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOAD ER03UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42tSHKXzlA BF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9RySPocq60vFYJfxLLHLGv KZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsMlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7z p+hnUquVH+BGPtikw8paxTGA6Eian5Rp/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUC AwEAAaOCARowggEWMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ 4PGEMA4GA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVjdG9y eS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUyMENBJTIwMiUyMDIw MDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRlcmV2b2NhdGlvbmxpc3QwQ6BBoD+G PWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAw OS5jcmwwDQYJKoZIhvcNAQELBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm 2H6NMLVwMeniacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4KzCUqNQT4YJEV dT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8PIWmawomDeCTmGCufsYkl4ph X5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3YJohw1+qRzT65ysCQblrGXnRl11z+o+I= -----END CERTIFICATE----- D-TRUST Root Class 3 CA 2 EV 2009 ================================= -----BEGIN CERTIFICATE----- MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw OTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUwNDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw OTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfS egpnljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM03TP1YtHh zRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6ZqQTMFexgaDbtCHu39b+T 7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lRp75mpoo6Kr3HGrHhFPC+Oh25z1uxav60 sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure35 11H3a6UCAwEAAaOCASQwggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyv cop9NteaHNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFwOi8v ZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xhc3MlMjAzJTIwQ0El MjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1ERT9jZXJ0aWZpY2F0ZXJldm9jYXRp b25saXN0MEagRKBChkBodHRwOi8vd3d3LmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xh c3NfM19jYV8yX2V2XzIwMDkuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+ PPoeUSbrh/Yp3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNFCSuGdXzfX2lX ANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7naxpeG0ILD5EJt/rDiZE4OJudA NCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqXKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVv w9y4AyHqnxbxLFS1 -----END CERTIFICATE----- PSCProcert ========== -----BEGIN CERTIFICATE----- MIIJhjCCB26gAwIBAgIBCzANBgkqhkiG9w0BAQsFADCCAR4xPjA8BgNVBAMTNUF1dG9yaWRhZCBk ZSBDZXJ0aWZpY2FjaW9uIFJhaXogZGVsIEVzdGFkbyBWZW5lem9sYW5vMQswCQYDVQQGEwJWRTEQ MA4GA1UEBxMHQ2FyYWNhczEZMBcGA1UECBMQRGlzdHJpdG8gQ2FwaXRhbDE2MDQGA1UEChMtU2lz dGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMUMwQQYDVQQLEzpTdXBl cmludGVuZGVuY2lhIGRlIFNlcnZpY2lvcyBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMSUw IwYJKoZIhvcNAQkBFhZhY3JhaXpAc3VzY2VydGUuZ29iLnZlMB4XDTEwMTIyODE2NTEwMFoXDTIw MTIyNTIzNTk1OVowgdExJjAkBgkqhkiG9w0BCQEWF2NvbnRhY3RvQHByb2NlcnQubmV0LnZlMQ8w DQYDVQQHEwZDaGFjYW8xEDAOBgNVBAgTB01pcmFuZGExKjAoBgNVBAsTIVByb3ZlZWRvciBkZSBD ZXJ0aWZpY2Fkb3MgUFJPQ0VSVDE2MDQGA1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZp Y2FjaW9uIEVsZWN0cm9uaWNhMQswCQYDVQQGEwJWRTETMBEGA1UEAxMKUFNDUHJvY2VydDCCAiIw DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANW39KOUM6FGqVVhSQ2oh3NekS1wwQYalNo97BVC wfWMrmoX8Yqt/ICV6oNEolt6Vc5Pp6XVurgfoCfAUFM+jbnADrgV3NZs+J74BCXfgI8Qhd19L3uA 3VcAZCP4bsm+lU/hdezgfl6VzbHvvnpC2Mks0+saGiKLt38GieU89RLAu9MLmV+QfI4tL3czkkoh RqipCKzx9hEC2ZUWno0vluYC3XXCFCpa1sl9JcLB/KpnheLsvtF8PPqv1W7/U0HU9TI4seJfxPmO EO8GqQKJ/+MMbpfg353bIdD0PghpbNjU5Db4g7ayNo+c7zo3Fn2/omnXO1ty0K+qP1xmk6wKImG2 0qCZyFSTXai20b1dCl53lKItwIKOvMoDKjSuc/HUtQy9vmebVOvh+qBa7Dh+PsHMosdEMXXqP+UH 0quhJZb25uSgXTcYOWEAM11G1ADEtMo88aKjPvM6/2kwLkDd9p+cJsmWN63nOaK/6mnbVSKVUyqU td+tFjiBdWbjxywbk5yqjKPK2Ww8F22c3HxT4CAnQzb5EuE8XL1mv6JpIzi4mWCZDlZTOpx+FIyw Bm/xhnaQr/2v/pDGj59/i5IjnOcVdo/Vi5QTcmn7K2FjiO/mpF7moxdqWEfLcU8UC17IAggmosvp r2uKGcfLFFb14dq12fy/czja+eevbqQ34gcnAgMBAAGjggMXMIIDEzASBgNVHRMBAf8ECDAGAQH/ AgEBMDcGA1UdEgQwMC6CD3N1c2NlcnRlLmdvYi52ZaAbBgVghl4CAqASDBBSSUYtRy0yMDAwNDAz Ni0wMB0GA1UdDgQWBBRBDxk4qpl/Qguk1yeYVKIXTC1RVDCCAVAGA1UdIwSCAUcwggFDgBStuyId xuDSAaj9dlBSk+2YwU2u06GCASakggEiMIIBHjE+MDwGA1UEAxM1QXV0b3JpZGFkIGRlIENlcnRp ZmljYWNpb24gUmFpeiBkZWwgRXN0YWRvIFZlbmV6b2xhbm8xCzAJBgNVBAYTAlZFMRAwDgYDVQQH EwdDYXJhY2FzMRkwFwYDVQQIExBEaXN0cml0byBDYXBpdGFsMTYwNAYDVQQKEy1TaXN0ZW1hIE5h Y2lvbmFsIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExQzBBBgNVBAsTOlN1cGVyaW50ZW5k ZW5jaWEgZGUgU2VydmljaW9zIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExJTAjBgkqhkiG 9w0BCQEWFmFjcmFpekBzdXNjZXJ0ZS5nb2IudmWCAQowDgYDVR0PAQH/BAQDAgEGME0GA1UdEQRG MESCDnByb2NlcnQubmV0LnZloBUGBWCGXgIBoAwMClBTQy0wMDAwMDKgGwYFYIZeAgKgEgwQUklG LUotMzE2MzUzNzMtNzB2BgNVHR8EbzBtMEagRKBChkBodHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52 ZS9sY3IvQ0VSVElGSUNBRE8tUkFJWi1TSEEzODRDUkxERVIuY3JsMCOgIaAfhh1sZGFwOi8vYWNy YWl6LnN1c2NlcnRlLmdvYi52ZTA3BggrBgEFBQcBAQQrMCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9v Y3NwLnN1c2NlcnRlLmdvYi52ZTBBBgNVHSAEOjA4MDYGBmCGXgMBAjAsMCoGCCsGAQUFBwIBFh5o dHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9kcGMwDQYJKoZIhvcNAQELBQADggIBACtZ6yKZu4Sq T96QxtGGcSOeSwORR3C7wJJg7ODU523G0+1ng3dS1fLld6c2suNUvtm7CpsR72H0xpkzmfWvADmN g7+mvTV+LFwxNG9s2/NkAZiqlCxB3RWGymspThbASfzXg0gTB1GEMVKIu4YXx2sviiCtxQuPcD4q uxtxj7mkoP3YldmvWb8lK5jpY5MvYB7Eqvh39YtsL+1+LrVPQA3uvFd359m21D+VJzog1eWuq2w1 n8GhHVnchIHuTQfiSLaeS5UtQbHh6N5+LwUeaO6/u5BlOsju6rEYNxxik6SgMexxbJHmpHmJWhSn FFAFTKQAVzAswbVhltw+HoSvOULP5dAssSS830DD7X9jSr3hTxJkhpXzsOfIt+FTvZLm8wyWuevo 5pLtp4EJFAv8lXrPj9Y0TzYS3F7RNHXGRoAvlQSMx4bEqCaJqD8Zm4G7UaRKhqsLEQ+xrmNTbSjq 3TNWOByyrYDT13K9mmyZY+gAu0F2BbdbmRiKw7gSXFbPVgx96OLP7bx0R/vu0xdOIk9W/1DzLuY5 poLWccret9W6aAjtmcz9opLLabid+Qqkpj5PkygqYWwHJgD/ll9ohri4zspV4KuxPX+Y1zMOWj3Y eMLEYC/HYvBhkdI4sPaeVdtAgAUSM84dkpvRabP/v/GSCmE1P93+hvS84Bpxs2Km -----END CERTIFICATE----- China Internet Network Information Center EV Certificates Root ============================================================== -----BEGIN CERTIFICATE----- MIID9zCCAt+gAwIBAgIESJ8AATANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCQ04xMjAwBgNV BAoMKUNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyMUcwRQYDVQQDDD5D aGluYSBJbnRlcm5ldCBOZXR3b3JrIEluZm9ybWF0aW9uIENlbnRlciBFViBDZXJ0aWZpY2F0ZXMg Um9vdDAeFw0xMDA4MzEwNzExMjVaFw0zMDA4MzEwNzExMjVaMIGKMQswCQYDVQQGEwJDTjEyMDAG A1UECgwpQ2hpbmEgSW50ZXJuZXQgTmV0d29yayBJbmZvcm1hdGlvbiBDZW50ZXIxRzBFBgNVBAMM PkNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyIEVWIENlcnRpZmljYXRl cyBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm35z7r07eKpkQ0H1UN+U8i6y jUqORlTSIRLIOTJCBumD1Z9S7eVnAztUwYyZmczpwA//DdmEEbK40ctb3B75aDFk4Zv6dOtouSCV 98YPjUesWgbdYavi7NifFy2cyjw1l1VxzUOFsUcW9SxTgHbP0wBkvUCZ3czY28Sf1hNfQYOL+Q2H klY0bBoQCxfVWhyXWIQ8hBouXJE0bhlffxdpxWXvayHG1VA6v2G5BY3vbzQ6sm8UY78WO5upKv23 KzhmBsUs4qpnHkWnjQRmQvaPK++IIGmPMowUc9orhpFjIpryp9vOiYurXccUwVswah+xt54ugQEC 7c+WXmPbqOY4twIDAQABo2MwYTAfBgNVHSMEGDAWgBR8cks5x8DbYqVPm6oYNJKiyoOCWTAPBgNV HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUfHJLOcfA22KlT5uqGDSSosqD glkwDQYJKoZIhvcNAQEFBQADggEBACrDx0M3j92tpLIM7twUbY8opJhJywyA6vPtI2Z1fcXTIWd5 0XPFtQO3WKwMVC/GVhMPMdoG52U7HW8228gd+f2ABsqjPWYWqJ1MFn3AlUa1UeTiH9fqBk1jjZaM 7+czV0I664zBechNdn3e9rG3geCg+aF4RhcaVpjwTj2rHO3sOdwHSPdj/gauwqRcalsyiMXHM4Ws ZkJHwlgkmeHlPuV1LI5D1l08eB6olYIpUNHRFrrvwb562bTYzB5MRuF3sTGrvSrIzo9uoV1/A3U0 5K2JRVRevq4opbs/eHnrc7MKDf2+yfdWrPa37S+bISnHOLaVxATywy39FCqQmbkHzJ8= -----END CERTIFICATE----- Swisscom Root CA 2 ================== -----BEGIN CERTIFICATE----- MIIF2TCCA8GgAwIBAgIQHp4o6Ejy5e/DfEoeWhhntjANBgkqhkiG9w0BAQsFADBkMQswCQYDVQQG EwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2VydGlmaWNhdGUgU2Vy dmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3QgQ0EgMjAeFw0xMTA2MjQwODM4MTRaFw0zMTA2 MjUwNzM4MTRaMGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGln aXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAyMIIC IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAlUJOhJ1R5tMJ6HJaI2nbeHCOFvErjw0DzpPM LgAIe6szjPTpQOYXTKueuEcUMncy3SgM3hhLX3af+Dk7/E6J2HzFZ++r0rk0X2s682Q2zsKwzxNo ysjL67XiPS4h3+os1OD5cJZM/2pYmLcX5BtS5X4HAB1f2uY+lQS3aYg5oUFgJWFLlTloYhyxCwWJ wDaCFCE/rtuh/bxvHGCGtlOUSbkrRsVPACu/obvLP+DHVxxX6NZp+MEkUp2IVd3Chy50I9AU/SpH Wrumnf2U5NGKpV+GY3aFy6//SSj8gO1MedK75MDvAe5QQQg1I3ArqRa0jG6F6bYRzzHdUyYb3y1a SgJA/MTAtukxGggo5WDDH8SQjhBiYEQN7Aq+VRhxLKX0srwVYv8c474d2h5Xszx+zYIdkeNL6yxS NLCK/RJOlrDrcH+eOfdmQrGrrFLadkBXeyq96G4DsguAhYidDMfCd7Camlf0uPoTXGiTOmekl9Ab mbeGMktg2M7v0Ax/lZ9vh0+Hio5fCHyqW/xavqGRn1V9TrALacywlKinh/LTSlDcX3KwFnUey7QY Ypqwpzmqm59m2I2mbJYV4+by+PGDYmy7Velhk6M99bFXi08jsJvllGov34zflVEpYKELKeRcVVi3 qPyZ7iVNTA6z00yPhOgpD/0QVAKFyPnlw4vP5w8CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYw HQYDVR0hBBYwFDASBgdghXQBUwIBBgdghXQBUwIBMBIGA1UdEwEB/wQIMAYBAf8CAQcwHQYDVR0O BBYEFE0mICKJS9PVpAqhb97iEoHF8TwuMB8GA1UdIwQYMBaAFE0mICKJS9PVpAqhb97iEoHF8Twu MA0GCSqGSIb3DQEBCwUAA4ICAQAyCrKkG8t9voJXiblqf/P0wS4RfbgZPnm3qKhyN2abGu2sEzsO v2LwnN+ee6FTSA5BesogpxcbtnjsQJHzQq0Qw1zv/2BZf82Fo4s9SBwlAjxnffUy6S8w5X2lejjQ 82YqZh6NM4OKb3xuqFp1mrjX2lhIREeoTPpMSQpKwhI3qEAMw8jh0FcNlzKVxzqfl9NX+Ave5XLz o9v/tdhZsnPdTSpxsrpJ9csc1fV5yJmz/MFMdOO0vSk3FQQoHt5FRnDsr7p4DooqzgB53MBfGWcs a0vvaGgLQ+OswWIJ76bdZWGgr4RVSJFSHMYlkSrQwSIjYVmvRRGFHQEkNI/Ps/8XciATwoCqISxx OQ7Qj1zB09GOInJGTB2Wrk9xseEFKZZZ9LuedT3PDTcNYtsmjGOpI99nBjx8Oto0QuFmtEYE3saW mA9LSHokMnWRn6z3aOkquVVlzl1h0ydw2Df+n7mvoC5Wt6NlUe07qxS/TFED6F+KBZvuim6c779o +sjaC+NCydAXFJy3SuCvkychVSa1ZC+N8f+mQAWFBVzKBxlcCxMoTFh/wqXvRdpg065lYZ1Tg3TC rvJcwhbtkj6EPnNgiLx29CzP0H1907he0ZESEOnN3col49XtmS++dYFLJPlFRpTJKSFTnCZFqhMX 5OfNeOI5wSsSnqaeG8XmDtkx2Q== -----END CERTIFICATE----- Swisscom Root EV CA 2 ===================== -----BEGIN CERTIFICATE----- MIIF4DCCA8igAwIBAgIRAPL6ZOJ0Y9ON/RAdBB92ylgwDQYJKoZIhvcNAQELBQAwZzELMAkGA1UE BhMCY2gxETAPBgNVBAoTCFN3aXNzY29tMSUwIwYDVQQLExxEaWdpdGFsIENlcnRpZmljYXRlIFNl cnZpY2VzMR4wHAYDVQQDExVTd2lzc2NvbSBSb290IEVWIENBIDIwHhcNMTEwNjI0MDk0NTA4WhcN MzEwNjI1MDg0NTA4WjBnMQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsT HERpZ2l0YWwgQ2VydGlmaWNhdGUgU2VydmljZXMxHjAcBgNVBAMTFVN3aXNzY29tIFJvb3QgRVYg Q0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMT3HS9X6lds93BdY7BxUglgRCgz o3pOCvrY6myLURYaVa5UJsTMRQdBTxB5f3HSek4/OE6zAMaVylvNwSqD1ycfMQ4jFrclyxy0uYAy Xhqdk/HoPGAsp15XGVhRXrwsVgu42O+LgrQ8uMIkqBPHoCE2G3pXKSinLr9xJZDzRINpUKTk4Rti GZQJo/PDvO/0vezbE53PnUgJUmfANykRHvvSEaeFGHR55E+FFOtSN+KxRdjMDUN/rhPSays/p8Li qG12W0OfvrSdsyaGOx9/5fLoZigWJdBLlzin5M8J0TbDC77aO0RYjb7xnglrPvMyxyuHxuxenPaH Za0zKcQvidm5y8kDnftslFGXEBuGCxobP/YCfnvUxVFkKJ3106yDgYjTdLRZncHrYTNaRdHLOdAG alNgHa/2+2m8atwBz735j9m9W8E6X47aD0upm50qKGsaCnw8qyIL5XctcfaCNYGu+HuB5ur+rPQa m3Rc6I8k9l2dRsQs0h4rIWqDJ2dVSqTjyDKXZpBy2uPUZC5f46Fq9mDU5zXNysRojddxyNMkM3Ox bPlq4SjbX8Y96L5V5jcb7STZDxmPX2MYWFCBUWVv8p9+agTnNCRxunZLWB4ZvRVgRaoMEkABnRDi xzgHcgplwLa7JSnaFp6LNYth7eVxV4O1PHGf40+/fh6Bn0GXAgMBAAGjgYYwgYMwDgYDVR0PAQH/ BAQDAgGGMB0GA1UdIQQWMBQwEgYHYIV0AVMCAgYHYIV0AVMCAjASBgNVHRMBAf8ECDAGAQH/AgED MB0GA1UdDgQWBBRF2aWBbj2ITY1x0kbBbkUe88SAnTAfBgNVHSMEGDAWgBRF2aWBbj2ITY1x0kbB bkUe88SAnTANBgkqhkiG9w0BAQsFAAOCAgEAlDpzBp9SSzBc1P6xXCX5145v9Ydkn+0UjrgEjihL j6p7jjm02Vj2e6E1CqGdivdj5eu9OYLU43otb98TPLr+flaYC/NUn81ETm484T4VvwYmneTwkLbU wp4wLh/vx3rEUMfqe9pQy3omywC0Wqu1kx+AiYQElY2NfwmTv9SoqORjbdlk5LgpWgi/UOGED1V7 XwgiG/W9mR4U9s70WBCCswo9GcG/W6uqmdjyMb3lOGbcWAXH7WMaLgqXfIeTK7KK4/HsGOV1timH 59yLGn602MnTihdsfSlEvoqq9X46Lmgxk7lq2prg2+kupYTNHAq4Sgj5nPFhJpiTt3tm7JFe3VE/ 23MPrQRYCd0EApUKPtN236YQHoA96M2kZNEzx5LH4k5E4wnJTsJdhw4Snr8PyQUQ3nqjsTzyP6Wq J3mtMX0f/fwZacXduT98zca0wjAefm6S139hdlqP65VNvBFuIXxZN5nQBrz5Bm0yFqXZaajh3DyA HmBR3NdUIR7KYndP+tiPsys6DXhyyWhBWkdKwqPrGtcKqzwyVcgKEZzfdNbwQBUdyLmPtTbFr/gi uMod89a2GQ+fYWVq6nTIfI/DT11lgh/ZDYnadXL77/FHZxOzyNEZiCcmmpl5fx7kLD977vHeTYuW l8PVP3wbI+2ksx0WckNLIOFZfsLorSa/ovc= -----END CERTIFICATE----- CA Disig Root R1 ================ -----BEGIN CERTIFICATE----- MIIFaTCCA1GgAwIBAgIJAMMDmu5QkG4oMA0GCSqGSIb3DQEBBQUAMFIxCzAJBgNVBAYTAlNLMRMw EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp ZyBSb290IFIxMB4XDTEyMDcxOTA5MDY1NloXDTQyMDcxOTA5MDY1NlowUjELMAkGA1UEBhMCU0sx EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp c2lnIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCqw3j33Jijp1pedxiy 3QRkD2P9m5YJgNXoqqXinCaUOuiZc4yd39ffg/N4T0Dhf9Kn0uXKE5Pn7cZ3Xza1lK/oOI7bm+V8 u8yN63Vz4STN5qctGS7Y1oprFOsIYgrY3LMATcMjfF9DCCMyEtztDK3AfQ+lekLZWnDZv6fXARz2 m6uOt0qGeKAeVjGu74IKgEH3G8muqzIm1Cxr7X1r5OJeIgpFy4QxTaz+29FHuvlglzmxZcfe+5nk CiKxLU3lSCZpq+Kq8/v8kiky6bM+TR8noc2OuRf7JT7JbvN32g0S9l3HuzYQ1VTW8+DiR0jm3hTa YVKvJrT1cU/J19IG32PK/yHoWQbgCNWEFVP3Q+V8xaCJmGtzxmjOZd69fwX3se72V6FglcXM6pM6 vpmumwKjrckWtc7dXpl4fho5frLABaTAgqWjR56M6ly2vGfb5ipN0gTco65F97yLnByn1tUD3AjL LhbKXEAz6GfDLuemROoRRRw1ZS0eRWEkG4IupZ0zXWX4Qfkuy5Q/H6MMMSRE7cderVC6xkGbrPAX ZcD4XW9boAo0PO7X6oifmPmvTiT6l7Jkdtqr9O3jw2Dv1fkCyC2fg69naQanMVXVz0tv/wQFx1is XxYb5dKj6zHbHzMVTdDypVP1y+E9Tmgt2BLdqvLmTZtJ5cUoobqwWsagtQIDAQABo0IwQDAPBgNV HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUiQq0OJMa5qvum5EY+fU8PjXQ 04IwDQYJKoZIhvcNAQEFBQADggIBADKL9p1Kyb4U5YysOMo6CdQbzoaz3evUuii+Eq5FLAR0rBNR xVgYZk2C2tXck8An4b58n1KeElb21Zyp9HWc+jcSjxyT7Ff+Bw+r1RL3D65hXlaASfX8MPWbTx9B LxyE04nH4toCdu0Jz2zBuByDHBb6lM19oMgY0sidbvW9adRtPTXoHqJPYNcHKfyyo6SdbhWSVhlM CrDpfNIZTUJG7L399ldb3Zh+pE3McgODWF3vkzpBemOqfDqo9ayk0d2iLbYq/J8BjuIQscTK5Gfb VSUZP/3oNn6z4eGBrxEWi1CXYBmCAMBrTXO40RMHPuq2MU/wQppt4hF05ZSsjYSVPCGvxdpHyN85 YmLLW1AL14FABZyb7bq2ix4Eb5YgOe2kfSnbSM6C3NQCjR0EMVrHS/BsYVLXtFHCgWzN4funodKS ds+xDzdYpPJScWc/DIh4gInByLUfkmO+p3qKViwaqKactV2zY9ATIKHrkWzQjX2v3wvkF7mGnjix lAxYjOBVqjtjbZqJYLhkKpLGN/R+Q0O3c+gB53+XD9fyexn9GtePyfqFa3qdnom2piiZk4hA9z7N UaPK6u95RyG1/jLix8NRb76AdPCkwzryT+lf3xkK8jsTQ6wxpLPn6/wY1gGp8yqPNg7rtLG8t0zJ a7+h89n07eLw4+1knj0vllJPgFOL -----END CERTIFICATE----- CA Disig Root R2 ================ -----BEGIN CERTIFICATE----- MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNVBAYTAlNLMRMw EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp ZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQyMDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sx EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp c2lnIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbC w3OeNcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNHPWSb6Wia xswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3Ix2ymrdMxp7zo5eFm1tL7 A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbeQTg06ov80egEFGEtQX6sx3dOy1FU+16S GBsEWmjGycT6txOgmLcRK7fWV8x8nhfRyyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqV g8NTEQxzHQuyRpDRQjrOQG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa 5Beny912H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJQfYE koopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUDi/ZnWejBBhG93c+A Ak9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORsnLMOPReisjQS1n6yqEm70XooQL6i Fh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNV HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5u Qu0wDQYJKoZIhvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqfGopTpti72TVV sRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkblvdhuDvEK7Z4bLQjb/D907Je dR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W8 1k/BfDxujRNt+3vrMNDcTa/F1balTFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjx mHHEt38OFdAlab0inSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01 utI3gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18DrG5gPcFw0 sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3OszMOl6W8KjptlwlCFtaOg UxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8xL4ysEr3vQCj8KWefshNPZiTEUxnpHikV 7+ZtsH8tZ/3zbBt1RqPlShfppNcL -----END CERTIFICATE----- ACCVRAIZ1 ========= -----BEGIN CERTIFICATE----- MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UEAwwJQUNDVlJB SVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQswCQYDVQQGEwJFUzAeFw0xMTA1 MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQBgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwH UEtJQUNDVjENMAsGA1UECgwEQUNDVjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4IC DwAwggIKAoICAQCbqau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gM jmoYHtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWoG2ioPej0 RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpAlHPrzg5XPAOBOp0KoVdD aaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhrIA8wKFSVf+DuzgpmndFALW4ir50awQUZ 0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDG WuzndN9wrqODJerWx5eHk6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs7 8yM2x/474KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMOm3WR 5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpacXpkatcnYGMN285J 9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPluUsXQA+xtrn13k/c4LOsOxFwYIRK Q26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYIKwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRw Oi8vd3d3LmFjY3YuZXMvZmlsZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEu Y3J0MB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeTVfZW6oHlNsyM Hj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIGCCsGAQUFBwICMIIBFB6CARAA QQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUAcgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBh AO0AegAgAGQAZQAgAGwAYQAgAEEAQwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUA YwBuAG8AbABvAGcA7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBj AHQAcgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAAQwBQAFMA IABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUAczAwBggrBgEFBQcCARYk aHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2MuaHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0 dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRtaW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2 MV9kZXIuY3JsMA4GA1UdDwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZI hvcNAQEFBQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdpD70E R9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gUJyCpZET/LtZ1qmxN YEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+mAM/EKXMRNt6GGT6d7hmKG9Ww7Y49 nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepDvV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJ TS+xJlsndQAJxGJ3KQhfnlmstn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3 sCPdK6jT2iWH7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szAh1xA2syVP1Xg Nce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xFd3+YJ5oyXSrjhO7FmGYvliAd 3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2HpPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3p EfbRD0tVNEYqi4Y7 -----END CERTIFICATE----- TWCA Global Root CA =================== -----BEGIN CERTIFICATE----- MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcxEjAQBgNVBAoT CVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMTVFdDQSBHbG9iYWwgUm9vdCBD QTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQK EwlUQUlXQU4tQ0ExEDAOBgNVBAsTB1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3Qg Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2C nJfF10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz0ALfUPZV r2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfChMBwqoJimFb3u/Rk28OKR Q4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbHzIh1HrtsBv+baz4X7GGqcXzGHaL3SekV tTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1W KKD+u4ZqyPpcC1jcxkt2yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99 sy2sbZCilaLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYPoA/p yJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQABDzfuBSO6N+pjWxn kjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcEqYSjMq+u7msXi7Kx/mzhkIyIqJdI zshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMC AQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6g cFGn90xHNcgL1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WFH6vPNOw/KP4M 8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNoRI2T9GRwoD2dKAXDOXC4Ynsg /eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlg lPx4mI88k1HtQJAH32RjJMtOcQWh15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryP A9gK8kxkRr05YuWW6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3m i4TWnsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5jwa19hAM8 EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWzaGHQRiapIVJpLesux+t3 zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmyKwbQBM0= -----END CERTIFICATE----- TeliaSonera Root CA v1 ====================== -----BEGIN CERTIFICATE----- MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAwNzEUMBIGA1UE CgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJvb3QgQ0EgdjEwHhcNMDcxMDE4 MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYDVQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwW VGVsaWFTb25lcmEgUm9vdCBDQSB2MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+ 6yfwIaPzaSZVfp3FVRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA 3GV17CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+XZ75Ljo1k B1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+/jXh7VB7qTCNGdMJjmhn Xb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxH oLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkmdtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3 F0fUTPHSiXk+TT2YqGHeOh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJ oWjiUIMusDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4pgd7 gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fsslESl1MpWtTwEhDc TwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQarMCpgKIv7NHfirZ1fpoeDVNAgMB AAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qW DNXr+nuqF+gTEjANBgkqhkiG9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNm zqjMDfz1mgbldxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx 0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1TjTQpgcmLNkQfW pb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBedY2gea+zDTYa4EzAvXUYNR0PV G6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpc c41teyWRyu5FrgZLAMzTsVlQ2jqIOylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOT JsjrDNYmiLbAJM+7vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2 qReWt88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcnHL/EVlP6 Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVxSK236thZiNSQvxaz2ems WWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= -----END CERTIFICATE----- E-Tugra Certification Authority =============================== -----BEGIN CERTIFICATE----- MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNVBAYTAlRSMQ8w DQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamls ZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMw NTEyMDk0OFoXDTIzMDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmEx QDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxl cmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQD DB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A MIICCgKCAgEA4vU/kwVRHoViVF56C/UYB4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vd hQd2h8y/L5VMzH2nPbxHD5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5K CKpbknSFQ9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEoq1+g ElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3Dk14opz8n8Y4e0ypQ BaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcHfC425lAcP9tDJMW/hkd5s3kc91r0 E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsutdEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gz rt48Ue7LE3wBf4QOXVGUnhMMti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAq jqFGOjGY5RH8zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUXU8u3Zg5mTPj5 dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6Jyr+zE7S6E5UMA8GA1UdEwEB /wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEG MA0GCSqGSIb3DQEBCwUAA4ICAQAFNzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAK kEh47U6YA5n+KGCRHTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jO XKqYGwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c77NCR807 VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3+GbHeJAAFS6LrVE1Uweo a2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WKvJUawSg5TB9D0pH0clmKuVb8P7Sd2nCc dlqMQ1DujjByTd//SffGqWfZbawCEeI6FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEV KV0jq9BgoRJP3vQXzTLlyb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gT Dx4JnW2PAJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpDy4Q0 8ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8dNL/+I5c30jn6PQ0G C7TbO6Orb1wdtn7os4I07QZcJA== -----END CERTIFICATE----- T-TeleSec GlobalRoot Class 2 ============================ -----BEGIN CERTIFICATE----- MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgx MDAxMTA0MDE0WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0GCSqGSIb3 DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUdAqSzm1nzHoqvNK38DcLZ SBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiCFoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/F vudocP05l03Sx5iRUKrERLMjfTlH6VJi1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx970 2cu+fjOlbpSD8DT6IavqjnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGV WOHAD3bZwI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGjQjBA MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/WSA2AHmgoCJrjNXy YdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhyNsZt+U2e+iKo4YFWz827n+qrkRk4 r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPACuvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNf vNoBYimipidx5joifsFvHZVwIEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR 3p1m0IvVVGb6g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN 9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlPBSeOE6Fuwg== -----END CERTIFICATE----- Atos TrustedRoot 2011 ===================== -----BEGIN CERTIFICATE----- MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UEAwwVQXRvcyBU cnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0xMTA3MDcxNDU4 MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMMFUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsG A1UECgwEQXRvczELMAkGA1UEBhMCREUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCV hTuXbyo7LjvPpvMpNb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr 54rMVD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+SZFhyBH+ DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ4J7sVaE3IqKHBAUsR320 HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0Lcp2AMBYHlT8oDv3FdU9T1nSatCQujgKR z3bFmx5VdJx4IbHwLfELn8LVlhgf8FQieowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7R l+lwrrw7GWzbITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZ bNshMBgGA1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB CwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8jvZfza1zv7v1Apt+h k6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kPDpFrdRbhIfzYJsdHt6bPWHJxfrrh TZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pcmaHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a9 61qn8FYiqTxlVMYVqL2Gns2Dlmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G 3mB/ufNPRJLvKrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed -----END CERTIFICATE----- QuoVadis Root CA 1 G3 ===================== -----BEGIN CERTIFICATE----- MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQELBQAwSDELMAkG A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv b3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJN MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEg RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakE PBtVwedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWerNrwU8lm PNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF34168Xfuw6cwI2H44g4hWf6 Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh4Pw5qlPafX7PGglTvF0FBM+hSo+LdoIN ofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXpUhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/l g6AnhF4EwfWQvTA9xO+oabw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV 7qJZjqlc3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/GKubX 9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSthfbZxbGL0eUQMk1f iyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KOTk0k+17kBL5yG6YnLUlamXrXXAkg t3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOtzCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZI hvcNAQELBQADggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2cDMT/uFPpiN3 GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUNqXsCHKnQO18LwIE6PWThv6ct Tr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP +V04ikkwj+3x6xn0dxoxGE1nVGwvb2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh 3jRJjehZrJ3ydlo28hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fa wx/kNSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNjZgKAvQU6 O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhpq1467HxpvMc7hU6eFbm0 FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFtnh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOV hMJKzRwuJIczYOXD -----END CERTIFICATE----- QuoVadis Root CA 2 G3 ===================== -----BEGIN CERTIFICATE----- MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQELBQAwSDELMAkG A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv b3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJN MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIg RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFh ZiFfqq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMWn4rjyduY NM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ymc5GQYaYDFCDy54ejiK2t oIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+O7q414AB+6XrW7PFXmAqMaCvN+ggOp+o MiwMzAkd056OXbxMmO7FGmh77FOm6RQ1o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+l V0POKa2Mq1W/xPtbAd0jIaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZo L1NesNKqIcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz8eQQ sSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43ehvNURG3YBZwjgQQvD 6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l7ZizlWNof/k19N+IxWA1ksB8aRxh lRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALGcC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZI hvcNAQELBQADggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RCroijQ1h5fq7K pVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0GaW/ZZGYjeVYg3UQt4XAoeo0L9 x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4nlv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgz dWqTHBLmYF5vHX/JHyPLhGGfHoJE+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6X U/IyAgkwo1jwDQHVcsaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+Nw mNtddbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNgKCLjsZWD zYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeMHVOyToV7BjjHLPj4sHKN JeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4WSr2Rz0ZiC3oheGe7IUIarFsNMkd7Egr O3jtZsSOeWmD3n+M -----END CERTIFICATE----- QuoVadis Root CA 3 G3 ===================== -----BEGIN CERTIFICATE----- MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQELBQAwSDELMAkG A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv b3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJN MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMg RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286 IxSR/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNuFoM7pmRL Mon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXRU7Ox7sWTaYI+FrUoRqHe 6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+cra1AdHkrAj80//ogaX3T7mH1urPnMNA3 I4ZyYUUpSFlob3emLoG+B01vr87ERRORFHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3U VDmrJqMz6nWB2i3ND0/kA9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f7 5li59wzweyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634RylsSqi Md5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBpVzgeAVuNVejH38DM dyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0QA4XN8f+MFrXBsj6IbGB/kE+V9/Yt rQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZI hvcNAQELBQADggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnIFUBhynLWcKzS t/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5WvvoxXqA/4Ti2Tk08HS6IT7SdEQ TXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFgu/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9Du DcpmvJRPpq3t/O5jrFc/ZSXPsoaP0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGib Ih6BJpsQBJFxwAYf3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmD hPbl8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+DhcI00iX 0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HNPlopNLk9hM6xZdRZkZFW dSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ywaZWWDYWGWVjUTR939+J399roD1B0y2 PpxxVJkES/1Y+Zj0 -----END CERTIFICATE----- DigiCert Assured ID Root G2 =========================== -----BEGIN CERTIFICATE----- MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgw MTE1MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIw ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSAn61UQbVH 35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4HteccbiJVMWWXvdMX0h5i89vq bFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9HpEgjAALAcKxHad3A2m67OeYfcgnDmCXRw VWmvo2ifv922ebPynXApVfSr/5Vh88lAbx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OP YLfykqGxvYmJHzDNw6YuYjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+Rn lTGNAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTO w0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPIQW5pJ6d1Ee88hjZv 0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I0jJmwYrA8y8678Dj1JGG0VDjA9tz d29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4GnilmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAW hsI6yLETcDbYz+70CjTVW0z9B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0M jomZmWzwPDCvON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo IhNzbM8m9Yop5w== -----END CERTIFICATE----- DigiCert Assured ID Root G3 =========================== -----BEGIN CERTIFICATE----- MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYD VQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQ BgcqhkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJfZn4f5dwb RXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17QRSAPWXYQ1qAk8C3eNvJs KTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgF UaFNN6KDec6NHSrkhDAKBggqhkjOPQQDAwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5Fy YZ5eEJJZVrmDxxDnOOlYJjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy 1vUhZscv6pZjamVFkpUBtA== -----END CERTIFICATE----- DigiCert Global Root G2 ======================= -----BEGIN CERTIFICATE----- MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUx MjAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI2/Ou8jqJ kTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx1x7e/dfgy5SDN67sH0NO 3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQq2EGnI/yuum06ZIya7XzV+hdG82MHauV BJVJ8zUtluNJbd134/tJS7SsVQepj5WztCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyM UNGPHgm+F6HmIcr9g+UQvIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQAB o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV5uNu 5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY1Yl9PMWLSn/pvtsr F9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4NeF22d+mQrvHRAiGfzZ0JFrabA0U WTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NGFdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBH QRFXGU7Aj64GxJUTFy8bJZ918rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/ iyK5S9kJRaTepLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl MrY= -----END CERTIFICATE----- DigiCert Global Root G3 ======================= -----BEGIN CERTIFICATE----- MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQswCQYDVQQGEwJV UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYD VQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAw MDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5k aWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0C AQYFK4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FGfp4tn+6O YwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPOZ9wj/wMco+I+o0IwQDAP BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNp Yim8S8YwCgYIKoZIzj0EAwMDaAAwZQIxAK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y 3maTD/HMsQmP3Wyr+mt/oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34 VOKa5Vt8sycX -----END CERTIFICATE----- DigiCert Trusted Root G4 ======================== -----BEGIN CERTIFICATE----- MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBiMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEw HwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 MTIwMDAwWjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0G CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3yithZwuEp pz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9o k3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7Fsa vOvJz82sNEBfsXpm7nfISKhmV1efVFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGY QJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6 MUSaM0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCiEhtm mnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADMfRyVw4/3IbKyEbe7 f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFH dL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8 oR7FwI+isX4KJpn15GkvmB0t9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud DwEB/wQEAwIBhjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2SV1EY+CtnJYY ZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd+SeuMIW59mdNOj6PWTkiU0Tr yF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWcfFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy 7zBZLq7gcfJW5GqXb5JQbZaNaHqasjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iah ixTXTBmyUEFxPT9NcCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN 5r5N0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie4u1Ki7wb /UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mIr/OSmbaz5mEP0oUA51Aa 5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tK G48BtieVU+i2iW1bvGjUI+iLUaJW+fCmgKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP 82Z+ -----END CERTIFICATE----- WoSign ====== -----BEGIN CERTIFICATE----- MIIFdjCCA16gAwIBAgIQXmjWEXGUY1BWAGjzPsnFkTANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQG EwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxKjAoBgNVBAMTIUNlcnRpZmljYXRpb24g QXV0aG9yaXR5IG9mIFdvU2lnbjAeFw0wOTA4MDgwMTAwMDFaFw0zOTA4MDgwMTAwMDFaMFUxCzAJ BgNVBAYTAkNOMRowGAYDVQQKExFXb1NpZ24gQ0EgTGltaXRlZDEqMCgGA1UEAxMhQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkgb2YgV29TaWduMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA vcqNrLiRFVaXe2tcesLea9mhsMMQI/qnobLMMfo+2aYpbxY94Gv4uEBf2zmoAHqLoE1UfcIiePyO CbiohdfMlZdLdNiefvAA5A6JrkkoRBoQmTIPJYhTpA2zDxIIFgsDcSccf+Hb0v1naMQFXQoOXXDX 2JegvFNBmpGN9J42Znp+VsGQX+axaCA2pIwkLCxHC1l2ZjC1vt7tj/id07sBMOby8w7gLJKA84X5 KIq0VC6a7fd2/BVoFutKbOsuEo/Uz/4Mx1wdC34FMr5esAkqQtXJTpCzWQ27en7N1QhatH/YHGkR +ScPewavVIMYe+HdVHpRaG53/Ma/UkpmRqGyZxq7o093oL5d//xWC0Nyd5DKnvnyOfUNqfTq1+ez EC8wQjchzDBwyYaYD8xYTYO7feUapTeNtqwylwA6Y3EkHp43xP901DfA4v6IRmAR3Qg/UDaruHqk lWJqbrDKaiFaafPz+x1wOZXzp26mgYmhiMU7ccqjUu6Du/2gd/Tkb+dC221KmYo0SLwX3OSACCK2 8jHAPwQ+658geda4BmRkAjHXqc1S+4RFaQkAKtxVi8QGRkvASh0JWzko/amrzgD5LkhLJuYwTKVY yrREgk/nkR4zw7CT/xH8gdLKH3Ep3XZPkiWvHYG3Dy+MwwbMLyejSuQOmbp8HkUff6oZRZb9/D0C AwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFOFmzw7R 8bNLtwYgFP6HEtX2/vs+MA0GCSqGSIb3DQEBBQUAA4ICAQCoy3JAsnbBfnv8rWTjMnvMPLZdRtP1 LOJwXcgu2AZ9mNELIaCJWSQBnfmvCX0KI4I01fx8cpm5o9dU9OpScA7F9dY74ToJMuYhOZO9sxXq T2r09Ys/L3yNWC7F4TmgPsc9SnOeQHrAK2GpZ8nzJLmzbVUsWh2eJXLOC62qx1ViC777Y7NhRCOj y+EaDveaBk3e1CNOIZZbOVtXHS9dCF4Jef98l7VNg64N1uajeeAz0JmWAjCnPv/So0M/BVoG6kQC 2nz4SNAzqfkHx5Xh9T71XXG68pWpdIhhWeO/yloTunK0jF02h+mmxTwTv97QRCbut+wucPrXnbes 5cVAWubXbHssw1abR80LzvobtCHXt2a49CUwi1wNuepnsvRtrtWhnk/Yn+knArAdBtaP4/tIEp9/ EaEQPkxROpaw0RPxx9gmrjrKkcRpnd8BKWRRb2jaFOwIQZeQjdCygPLPwj2/kWjFgGcexGATVdVh mVd8upUPYUk6ynW8yQqTP2cOEvIo4jEbwFcW3wh8GcF+Dx+FHgo2fFt+J7x6v+Db9NpSvd4MVHAx kUOVyLzwPt0JfjBkUO1/AaQzZ01oT74V77D2AhGiGxMlOtzCWfHjXEa7ZywCRuoeSKbmW9m1vFGi kpbbqsY3Iqb+zCB0oy2pLmvLwIIRIbWTee5Ehr7XHuQe+w== -----END CERTIFICATE----- WoSign China ============ -----BEGIN CERTIFICATE----- MIIFWDCCA0CgAwIBAgIQUHBrzdgT/BtOOzNy0hFIjTANBgkqhkiG9w0BAQsFADBGMQswCQYDVQQG EwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxGzAZBgNVBAMMEkNBIOayg+mAmuagueiv geS5pjAeFw0wOTA4MDgwMTAwMDFaFw0zOTA4MDgwMTAwMDFaMEYxCzAJBgNVBAYTAkNOMRowGAYD VQQKExFXb1NpZ24gQ0EgTGltaXRlZDEbMBkGA1UEAwwSQ0Eg5rKD6YCa5qC56K+B5LmmMIICIjAN BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0EkhHiX8h8EqwqzbdoYGTufQdDTc7WU1/FDWiD+k 8H/rD195L4mx/bxjWDeTmzj4t1up+thxx7S8gJeNbEvxUNUqKaqoGXqW5pWOdO2XCld19AXbbQs5 uQF/qvbW2mzmBeCkTVL829B0txGMe41P/4eDrv8FAxNXUDf+jJZSEExfv5RxadmWPgxDT74wwJ85 dE8GRV2j1lY5aAfMh09Qd5Nx2UQIsYo06Yms25tO4dnkUkWMLhQfkWsZHWgpLFbE4h4TV2TwYeO5 Ed+w4VegG63XX9Gv2ystP9Bojg/qnw+LNVgbExz03jWhCl3W6t8Sb8D7aQdGctyB9gQjF+BNdeFy b7Ao65vh4YOhn0pdr8yb+gIgthhid5E7o9Vlrdx8kHccREGkSovrlXLp9glk3Kgtn3R46MGiCWOc 76DbT52VqyBPt7D3h1ymoOQ3OMdc4zUPLK2jgKLsLl3Az+2LBcLmc272idX10kaO6m1jGx6KyX2m +Jzr5dVjhU1zZmkR/sgO9MHHZklTfuQZa/HpelmjbX7FF+Ynxu8b22/8DU0GAbQOXDBGVWCvOGU6 yke6rCzMRh+yRpY/8+0mBe53oWprfi1tWFxK1I5nuPHa1UaKJ/kR8slC/k7e3x9cxKSGhxYzoacX GKUN5AXlK8IrC6KVkLn9YDxOiT7nnO4fuwECAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1Ud EwEB/wQFMAMBAf8wHQYDVR0OBBYEFOBNv9ybQV0T6GTwp+kVpOGBwboxMA0GCSqGSIb3DQEBCwUA A4ICAQBqinA4WbbaixjIvirTthnVZil6Xc1bL3McJk6jfW+rtylNpumlEYOnOXOvEESS5iVdT2H6 yAa+Tkvv/vMx/sZ8cApBWNromUuWyXi8mHwCKe0JgOYKOoICKuLJL8hWGSbueBwj/feTZU7n85iY r83d2Z5AiDEoOqsuC7CsDCT6eiaY8xJhEPRdF/d+4niXVOKM6Cm6jBAyvd0zaziGfjk9DgNyp115 j0WKWa5bIW4xRtVZjc8VX90xJc/bYNaBRHIpAlf2ltTW/+op2znFuCyKGo3Oy+dCMYYFaA6eFN0A kLppRQjbbpCBhqcqBT/mhDn4t/lXX0ykeVoQDF7Va/81XwVRHmyjdanPUIPTfPRm94KNPQx96N97 qA4bLJyuQHCH2u2nFoJavjVsIE4iYdm8UXrNemHcSxH5/mc0zy4EZmFcV5cjjPOGG0jfKq+nwf/Y jj4Du9gqsPoUJbJRa4ZDhS4HIxaAjUz7tGM7zMN07RujHv41D198HRaG9Q7DlfEvr10lO1Hm13ZB ONFLAzkopR6RctR9q5czxNM+4Gm2KHmgCY0c0f9BckgG/Jou5yD5m6Leie2uPAmvylezkolwQOQv T8Jwg0DXJCxr5wkf09XHwQj02w47HAcLQxGEIYbpgNR12KvxAmLBsX5VYc8T1yaw15zLKYs4SgsO kI26oQ== -----END CERTIFICATE----- COMODO RSA Certification Authority ================================== -----BEGIN CERTIFICATE----- MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCBhTELMAkGA1UE BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlv biBBdXRob3JpdHkwHhcNMTAwMTE5MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMC R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBB dXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR6FSS0gpWsawNJN3Fz0Rn dJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8Xpz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZ FGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+ 5eNu/Nio5JIk2kNrYrhV/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pG x8cgoLEfZd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z+pUX 2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7wqP/0uK3pN/u6uPQL OvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZahSL0896+1DSJMwBGB7FY79tOi4lu3 sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVICu9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+C GCe01a60y1Dma/RMhnEw6abfFobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5 WdYgGq/yapiqcrxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w DQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvlwFTPoCWOAvn9sKIN9SCYPBMt rFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+ nq6PK7o9mfjYcwlYRm6mnPTXJ9OV2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSg tZx8jb8uk2IntznaFxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwW sRqZCuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiKboHGhfKp pC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmckejkk9u+UJueBPSZI9FoJA zMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yLS0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHq ZJx64SIDqZxubw5lT2yHh17zbqD5daWbQOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk52 7RH89elWsn2/x20Kk4yl0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7I LaZRfyHBNVOFBkpdn627G190 -----END CERTIFICATE----- USERTrust RSA Certification Authority ===================================== -----BEGIN CERTIFICATE----- MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCBiDELMAkGA1UE BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UE BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCAEmUXNg7D2wiz 0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2j Y0K2dvKpOyuR+OJv0OwWIJAJPuLodMkYtJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFn RghRy4YUVD+8M/5+bJz/Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O +T23LLb2VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT79uq /nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6c0Plfg6lZrEpfDKE Y1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmTYo61Zs8liM2EuLE/pDkP2QKe6xJM lXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97lc6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8 yexDJtC/QV9AqURE9JnnV4eeUB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+ eLf8ZxXhyVeEHg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF MAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPFUp/L+M+ZBn8b2kMVn54CVVeW FPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KOVWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ 7l8wXEskEVX/JJpuXior7gtNn3/3ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQ Eg9zKC7F4iRO/Fjs8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM 8WcRiQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYzeSf7dNXGi FSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZXHlKYC6SQK5MNyosycdi yA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9c J2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRBVXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGw sAvgnEzDHNb842m1R0aBL6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gx Q+6IHdfGjjxDah2nGN59PRbxYvnKkKj9 -----END CERTIFICATE----- USERTrust ECC Certification Authority ===================================== -----BEGIN CERTIFICATE----- MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDELMAkGA1UEBhMC VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv biBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMC VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqfloI+d61SRvU8Za2EurxtW2 0eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinngo4N+LZfQYcTxmdwlkWOrfzCjtHDix6Ez nPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0GA1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNV HQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBB HU6+4WMBzzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbWRNZu 9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= -----END CERTIFICATE----- GlobalSign ECC Root CA - R4 =========================== -----BEGIN CERTIFICATE----- MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEkMCIGA1UECxMb R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD EwpHbG9iYWxTaWduMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprl OQcJFspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAwDgYDVR0P AQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61FuOJAf/sKbvu+M8k8o4TV MAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGXkPoUVy0D7O48027KqGx2vKLeuwIgJ6iF JzWbVsaj8kfSt24bAgAXqmemFZHe+pTsewv4n4Q= -----END CERTIFICATE----- GlobalSign ECC Root CA - R5 =========================== -----BEGIN CERTIFICATE----- MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEkMCIGA1UECxMb R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD EwpHbG9iYWxTaWduMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6 SFkc8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8kehOvRnkmS h5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd BgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYIKoZIzj0EAwMDaAAwZQIxAOVpEslu28Yx uglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7 yFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3 -----END CERTIFICATE----- Staat der Nederlanden Root CA - G3 ================================== -----BEGIN CERTIFICATE----- MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g Um9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloXDTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMC TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4y olQPcPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WWIkYFsO2t x1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqXxz8ecAgwoNzFs21v0IJy EavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFyKJLZWyNtZrVtB0LrpjPOktvA9mxjeM3K Tj215VKb8b475lRgsGYeCasH/lSJEULR9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUur mkVLoR9BvUhTFXFkC4az5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU5 1nus6+N86U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7Ngzp 07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHPbMk7ccHViLVlvMDo FxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXtBznaqB16nzaeErAMZRKQFWDZJkBE 41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTtXUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMB AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleu yjWcLhL75LpdINyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwpLiniyMMB8jPq KqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8Ipf3YF3qKS9Ysr1YvY2WTxB1 v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixpgZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA 8KCWAg8zxXHzniN9lLf9OtMJgwYh/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b 8KKaa8MFSu1BYBQw0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0r mj1AfsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq4BZ+Extq 1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR1VmiiXTTn74eS9fGbbeI JG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/QFH1T/U67cjF68IeHRaVesd+QnGTbksV tzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM94B7IWcnMFk= -----END CERTIFICATE----- Staat der Nederlanden EV Root CA ================================ -----BEGIN CERTIFICATE----- MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJOTDEeMBwGA1UE CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFhdCBkZXIgTmVkZXJsYW5kZW4g RVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0yMjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5M MR4wHAYDVQQKDBVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRl cmxhbmRlbiBFViBSb290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkk SzrSM4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nCUiY4iKTW O0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3dZ//BYY1jTw+bbRcwJu+r 0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46prfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8 Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13lpJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gV XJrm0w912fxBmJc+qiXbj5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr 08C+eKxCKFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS/ZbV 0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0XcgOPvZuM5l5Tnrmd 74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH1vI4gnPah1vlPNOePqc7nvQDs/nx fRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrPpx9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNC MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwa ivsnuL8wbqg7MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u2dfOWBfoqSmu c0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHSv4ilf0X8rLiltTMMgsT7B/Zq 5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTCwPTxGfARKbalGAKb12NMcIxHowNDXLldRqAN b/9Zjr7dn3LDWyvfjFvO5QxGbJKyCqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tN f1zuacpzEPuKqf2evTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi 5Dp6Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIaGl6I6lD4 WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeLeG9QgkRQP2YGiqtDhFZK DyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGy eUN51q1veieQA6TqJIc/2b3Z6fJfUEkc7uzXLg== -----END CERTIFICATE----- IdenTrust Commercial Root CA 1 ============================== -----BEGIN CERTIFICATE----- MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBKMQswCQYDVQQG EwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBS b290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQwMTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzES MBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENB IDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ld hNlT3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU+ehcCuz/ mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gpS0l4PJNgiCL8mdo2yMKi 1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1bVoE/c40yiTcdCMbXTMTEl3EASX2MN0C XZ/g1Ue9tOsbobtJSdifWwLziuQkkORiT0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl 3ZBWzvurpWCdxJ35UrCLvYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzy NeVJSQjKVsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZKdHzV WYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHTc+XvvqDtMwt0viAg xGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hvl7yTmvmcEpB4eoCHFddydJxVdHix uuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5NiGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZI hvcNAQELBQADggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH 6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwtLRvM7Kqas6pg ghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93nAbowacYXVKV7cndJZ5t+qnt ozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmV YjzlVYA211QC//G5Xc7UI2/YRYRKW2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUX feu+h1sXIFRRk0pTAwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/ro kTLql1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG4iZZRHUe 2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZmUlO+KWA2yUPHGNiiskz Z2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7R cGzM7vRX+Bi6hG6H -----END CERTIFICATE----- IdenTrust Public Sector Root CA 1 ================================= -----BEGIN CERTIFICATE----- MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBNMQswCQYDVQQG EwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3Rv ciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcNMzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJV UzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBS b290IENBIDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTy P4o7ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGyRBb06tD6 Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlSbdsHyo+1W/CD80/HLaXI rcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF/YTLNiCBWS2ab21ISGHKTN9T0a9SvESf qy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoS mJxZZoY+rfGwyj4GD3vwEUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFn ol57plzy9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9VGxyh LrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ2fjXctscvG29ZV/v iDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsVWaFHVCkugyhfHMKiq3IXAAaOReyL 4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gDW/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8B Af8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMw DQYJKoZIhvcNAQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHVDRDtfULAj+7A mgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9TaDKQGXSc3z1i9kKlT/YPyNt GtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8GlwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFt m6/n6J91eEyrRjuazr8FGF1NFTwWmhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMx NRF4eKLg6TCMf4DfWN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4 Mhn5+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJtshquDDI ajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhAGaQdp/lLQzfcaFpPz+vC ZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ 3Wl9af0AVqW3rLatt8o+Ae+c -----END CERTIFICATE----- Entrust Root Certification Authority - G2 ========================================= -----BEGIN CERTIFICATE----- MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMCVVMxFjAUBgNV BAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVy bXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ug b25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIw HhcNMDkwNzA3MTcyNTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoT DUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMx OTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25s eTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwggEi MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP /vaCeb9zYQYKpSfYs1/TRU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXz HHfV1IWNcCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hWwcKU s/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1U1+cPvQXLOZprE4y TGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0jaWvYkxN4FisZDQSA/i2jZRjJKRx AgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ6 0B7vfec7aVHUbI2fkBJmqzANBgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5Z iXMRrEPR9RP/jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v1fN2D807iDgi nWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4RnAuknZoh8/CbCzB428Hch0P+ vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmHVHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xO e4pIb4tF9g== -----END CERTIFICATE----- Entrust Root Certification Authority - EC1 ========================================== -----BEGIN CERTIFICATE----- MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkGA1UEBhMCVVMx FjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVn YWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXpl ZCB1c2Ugb25seTEzMDEGA1UEAxMqRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 IC0gRUMxMB4XDTEyMTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYw FAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2Fs LXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQg dXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt IEVDMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHy AsWfoPZb1YsGGYZPUxBtByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef 9eNi1KlHBz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE FLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVCR98crlOZF7ZvHH3h vxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nXhTcGtXsI/esni0qU+eH6p44mCOh8 kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G -----END CERTIFICATE----- CFCA EV ROOT ============ -----BEGIN CERTIFICATE----- MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJDTjEwMC4GA1UE CgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNB IEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkxMjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEw MC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQD DAxDRkNBIEVWIFJPT1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnV BU03sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpLTIpTUnrD 7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5/ZOkVIBMUtRSqy5J35DN uF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp7hZZLDRJGqgG16iI0gNyejLi6mhNbiyW ZXvKWfry4t3uMCz7zEasxGPrb382KzRzEpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7 xzbh72fROdOXW3NiGUgthxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9f py25IGvPa931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqotaK8K gWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNgTnYGmE69g60dWIol hdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfVPKPtl8MeNPo4+QgO48BdK4PRVmrJ tqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hvcWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAf BgNVHSMEGDAWgBTj/i39KNALtbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB /wQEAwIBBjAdBgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObTej/tUxPQ4i9q ecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdLjOztUmCypAbqTuv0axn96/Ua 4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBSESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sG E5uPhnEFtC+NiWYzKXZUmhH4J/qyP5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfX BDrDMlI1Dlb4pd19xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjn aH9dCi77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN5mydLIhy PDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe/v5WOaHIz16eGWRGENoX kbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+ZAAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3C ekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su -----END CERTIFICATE----- TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H5 ========================================================= -----BEGIN CERTIFICATE----- MIIEJzCCAw+gAwIBAgIHAI4X/iQggTANBgkqhkiG9w0BAQsFADCBsTELMAkGA1UEBhMCVFIxDzAN BgNVBAcMBkFua2FyYTFNMEsGA1UECgxEVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp bGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7Fni4xQjBABgNVBAMMOVTDnFJLVFJVU1Qg RWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSBINTAeFw0xMzA0MzAw ODA3MDFaFw0yMzA0MjgwODA3MDFaMIGxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMU0w SwYDVQQKDERUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnE n2kgSGl6bWV0bGVyaSBBLsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBFbGVrdHJvbmlrIFNlcnRp ZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIEg1MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB CgKCAQEApCUZ4WWe60ghUEoI5RHwWrom/4NZzkQqL/7hzmAD/I0Dpe3/a6i6zDQGn1k19uwsu537 jVJp45wnEFPzpALFp/kRGml1bsMdi9GYjZOHp3GXDSHHmflS0yxjXVW86B8BSLlg/kJK9siArs1m ep5Fimh34khon6La8eHBEJ/rPCmBp+EyCNSgBbGM+42WAA4+Jd9ThiI7/PS98wl+d+yG6w8z5UNP 9FR1bSmZLmZaQ9/LXMrI5Tjxfjs1nQ/0xVqhzPMggCTTV+wVunUlm+hkS7M0hO8EuPbJbKoCPrZV 4jI3X/xml1/N1p7HIL9Nxqw/dV8c7TKcfGkAaZHjIxhT6QIDAQABo0IwQDAdBgNVHQ4EFgQUVpkH HtOsDGlktAxQR95DLL4gwPswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZI hvcNAQELBQADggEBAJ5FdnsXSDLyOIspve6WSk6BGLFRRyDN0GSxDsnZAdkJzsiZ3GglE9Rc8qPo BP5yCccLqh0lVX6Wmle3usURehnmp349hQ71+S4pL+f5bFgWV1Al9j4uPqrtd3GqqpmWRgqujuwq URawXs3qZwQcWDD1YIq9pr1N5Za0/EKJAWv2cMhQOQwt1WbZyNKzMrcbGW3LM/nfpeYVhDfwwvJl lpKQd/Ct9JDpEXjXk4nAPQu6KfTomZ1yju2dL+6SfaHx/126M2CFYv4HAqGEVka+lgqaE9chTLd8 B59OTj+RdPsnnRHM3eaxynFNExc5JsUpISuTKWqW+qtB4Uu2NQvAmxU= -----END CERTIFICATE----- TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H6 ========================================================= -----BEGIN CERTIFICATE----- MIIEJjCCAw6gAwIBAgIGfaHyZeyKMA0GCSqGSIb3DQEBCwUAMIGxMQswCQYDVQQGEwJUUjEPMA0G A1UEBwwGQW5rYXJhMU0wSwYDVQQKDERUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls acWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBF bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIEg2MB4XDTEzMTIxODA5 MDQxMFoXDTIzMTIxNjA5MDQxMFowgbExCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExTTBL BgNVBAoMRFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBCaWxpxZ9pbSBHw7x2ZW5sacSf aSBIaXptZXRsZXJpIEEuxZ4uMUIwQAYDVQQDDDlUw5xSS1RSVVNUIEVsZWt0cm9uaWsgU2VydGlm aWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLEgSDYwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK AoIBAQCdsGjW6L0UlqMACprx9MfMkU1xeHe59yEmFXNRFpQJRwXiM/VomjX/3EsvMsew7eKC5W/a 2uqsxgbPJQ1BgfbBOCK9+bGlprMBvD9QFyv26WZV1DOzXPhDIHiTVRZwGTLmiddk671IUP320EED wnS3/faAz1vFq6TWlRKb55cTMgPp1KtDWxbtMyJkKbbSk60vbNg9tvYdDjTu0n2pVQ8g9P0pu5Fb HH3GQjhtQiht1AH7zYiXSX6484P4tZgvsycLSF5W506jM7NE1qXyGJTtHB6plVxiSvgNZ1GpryHV +DKdeboaX+UEVU0TRv/yz3THGmNtwx8XEsMeED5gCLMxAgMBAAGjQjBAMB0GA1UdDgQWBBTdVRcT 9qzoSCHK77Wv0QAy7Z6MtTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG 9w0BAQsFAAOCAQEAb1gNl0OqFlQ+v6nfkkU/hQu7VtMMUszIv3ZnXuaqs6fvuay0EBQNdH49ba3R fdCaqaXKGDsCQC4qnFAUi/5XfldcEQlLNkVS9z2sFP1E34uXI9TDwe7UU5X+LEr+DXCqu4svLcsy o4LyVN/Y8t3XSHLuSqMplsNEzm61kod2pLv0kmzOLBQJZo6NrRa1xxsJYTvjIKIDgI6tflEATseW hvtDmHd9KMeP2Cpu54Rvl0EpABZeTeIT6lnAY2c6RPuY/ATTMHKm9ocJV612ph1jmv3XZch4gyt1 O6VbuA1df74jrlZVlFjvH4GMKrLN5ptjnhi85WsGtAuYSyher4hYyw== -----END CERTIFICATE----- Certinomis - Root CA ==================== -----BEGIN CERTIFICATE----- MIIFkjCCA3qgAwIBAgIBATANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJGUjETMBEGA1UEChMK Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxHTAbBgNVBAMTFENlcnRpbm9taXMg LSBSb290IENBMB4XDTEzMTAyMTA5MTcxOFoXDTMzMTAyMTA5MTcxOFowWjELMAkGA1UEBhMCRlIx EzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMR0wGwYDVQQDExRD ZXJ0aW5vbWlzIC0gUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANTMCQos P5L2fxSeC5yaah1AMGT9qt8OHgZbn1CF6s2Nq0Nn3rD6foCWnoR4kkjW4znuzuRZWJflLieY6pOo d5tK8O90gC3rMB+12ceAnGInkYjwSond3IjmFPnVAy//ldu9n+ws+hQVWZUKxkd8aRi5pwP5ynap z8dvtF4F/u7BUrJ1Mofs7SlmO/NKFoL21prbcpjp3vDFTKWrteoB4owuZH9kb/2jJZOLyKIOSY00 8B/sWEUuNKqEUL3nskoTuLAPrjhdsKkb5nPJWqHZZkCqqU2mNAKthH6yI8H7KsZn9DS2sJVqM09x RLWtwHkziOC/7aOgFLScCbAK42C++PhmiM1b8XcF4LVzbsF9Ri6OSyemzTUK/eVNfaoqoynHWmgE 6OXWk6RiwsXm9E/G+Z8ajYJJGYrKWUM66A0ywfRMEwNvbqY/kXPLynNvEiCL7sCCeN5LLsJJwx3t FvYk9CcbXFcx3FXuqB5vbKziRcxXV4p1VxngtViZSTYxPDMBbRZKzbgqg4SGm/lg0h9tkQPTYKbV PZrdd5A9NaSfD171UkRpucC63M9933zZxKyGIjK8e2uR73r4F2iw4lNVYC2vPsKD2NkJK/DAZNuH i5HMkesE/Xa0lZrmFAYb1TQdvtj/dBxThZngWVJKYe2InmtJiUZ+IFrZ50rlau7SZRFDAgMBAAGj YzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTvkUz1pcMw6C8I 6tNxIqSSaHh02TAfBgNVHSMEGDAWgBTvkUz1pcMw6C8I6tNxIqSSaHh02TANBgkqhkiG9w0BAQsF AAOCAgEAfj1U2iJdGlg+O1QnurrMyOMaauo++RLrVl89UM7g6kgmJs95Vn6RHJk/0KGRHCwPT5iV WVO90CLYiF2cN/z7ZMF4jIuaYAnq1fohX9B0ZedQxb8uuQsLrbWwF6YSjNRieOpWauwK0kDDPAUw Pk2Ut59KA9N9J0u2/kTO+hkzGm2kQtHdzMjI1xZSg081lLMSVX3l4kLr5JyTCcBMWwerx20RoFAX lCOotQqSD7J6wWAsOMwaplv/8gzjqh8c3LigkyfeY+N/IZ865Z764BNqdeuWXGKRlI5nU7aJ+BIJ y29SWwNyhlCVCNSNh4YVH5Uk2KRvms6knZtt0rJ2BobGVgjF6wnaNsIbW0G+YSrjcOa4pvi2WsS9 Iff/ql+hbHY5ZtbqTFXhADObE5hjyW/QASAJN1LnDE8+zbz1X5YnpyACleAu6AdBBR8Vbtaw5Bng DwKTACdyxYvRVB9dSsNAl35VpnzBMwQUAR1JIGkLGZOdblgi90AMRgwjY/M50n92Uaf0yKHxDHYi I0ZSKS3io0EHVmmY0gUJvGnHWmHNj4FgFU2A3ZDifcRQ8ow7bkrHxuaAKzyBvBGAFhAn1/DNP3nM cyrDflOR1m749fPH0FFNjkulW+YZFzvWgQncItzujrnEj1PhZ7szuIgVRs/taTX/dQ1G885x4cVr hkIGuUE= -----END CERTIFICATE----- OISTE WISeKey Global Root GB CA =============================== -----BEGIN CERTIFICATE----- MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBtMQswCQYDVQQG EwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAw MzJaFw0zOTEyMDExNTEwMzFaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYD VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEds b2JhbCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3HEokKtaX scriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGxWuR51jIjK+FTzJlFXHtP rby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk 9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNku7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4o Qnc/nSMbsrY9gBQHTC5P99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvg GUpuuy9rM2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB /zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZI hvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrghcViXfa43FK8+5/ea4n32cZiZBKpD dHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0 VQreUGdNZtGn//3ZwLWoo4rOZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEui HZeeevJuQHHfaPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= -----END CERTIFICATE----- Certification Authority of WoSign G2 ==================================== -----BEGIN CERTIFICATE----- MIIDfDCCAmSgAwIBAgIQayXaioidfLwPBbOxemFFRDANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQG EwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxLTArBgNVBAMTJENlcnRpZmljYXRpb24g QXV0aG9yaXR5IG9mIFdvU2lnbiBHMjAeFw0xNDExMDgwMDU4NThaFw00NDExMDgwMDU4NThaMFgx CzAJBgNVBAYTAkNOMRowGAYDVQQKExFXb1NpZ24gQ0EgTGltaXRlZDEtMCsGA1UEAxMkQ2VydGlm aWNhdGlvbiBBdXRob3JpdHkgb2YgV29TaWduIEcyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB CgKCAQEAvsXEoCKASU+/2YcRxlPhuw+9YH+v9oIOH9ywjj2X4FA8jzrvZjtFB5sg+OPXJYY1kBai XW8wGQiHC38Gsp1ij96vkqVg1CuAmlI/9ZqD6TRay9nVYlzmDuDfBpgOgHzKtB0TiGsOqCR3A9Du W/PKaZE1OVbFbeP3PU9ekzgkyhjpJMuSA93MHD0JcOQg5PGurLtzaaNjOg9FD6FKmsLRY6zLEPg9 5k4ot+vElbGs/V6r+kHLXZ1L3PR8du9nfwB6jdKgGlxNIuG12t12s9R23164i5jIFFTMaxeSt+BK v0mUYQs4kI9dJGwlezt52eJ+na2fmKEG/HgUYFf47oB3sQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU+mCp62XF3RYUCE4MD42b4Pdkr2cwDQYJKoZI hvcNAQELBQADggEBAFfDejaCnI2Y4qtAqkePx6db7XznPWZaOzG73/MWM5H8fHulwqZm46qwtyeY P0nXYGdnPzZPSsvxFPpahygc7Y9BMsaV+X3avXtbwrAh449G3CE4Q3RM+zD4F3LBMvzIkRfEzFg3 TgvMWvchNSiDbGAtROtSjFA9tWwS1/oJu2yySrHFieT801LYYRf+epSEj3m2M1m6D8QL4nCgS3gu +sif/a+RZQp4OBXllxcU3fngLDT4ONCEIgDAFFEYKwLcMFrw6AF8NTojrwjkr6qOKEJJLvD1mTS+ 7Q9LGOHSJDy7XUe3IfKN0QqZjuNuPq1w4I+5ysxugTH2e5x6eeRncRg= -----END CERTIFICATE----- CA WoSign ECC Root ================== -----BEGIN CERTIFICATE----- MIICCTCCAY+gAwIBAgIQaEpYcIBr8I8C+vbe6LCQkDAKBggqhkjOPQQDAzBGMQswCQYDVQQGEwJD TjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxGzAZBgNVBAMTEkNBIFdvU2lnbiBFQ0MgUm9v dDAeFw0xNDExMDgwMDU4NThaFw00NDExMDgwMDU4NThaMEYxCzAJBgNVBAYTAkNOMRowGAYDVQQK ExFXb1NpZ24gQ0EgTGltaXRlZDEbMBkGA1UEAxMSQ0EgV29TaWduIEVDQyBSb290MHYwEAYHKoZI zj0CAQYFK4EEACIDYgAE4f2OuEMkq5Z7hcK6C62N4DrjJLnSsb6IOsq/Srj57ywvr1FQPEd1bPiU t5v8KB7FVMxjnRZLU8HnIKvNrCXSf4/CwVqCXjCLelTOA7WRf6qU0NGKSMyCBSah1VES1ns2o0Iw QDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUqv3VWqP2h4syhf3R MluARZPzA7gwCgYIKoZIzj0EAwMDaAAwZQIxAOSkhLCB1T2wdKyUpOgOPQB0TKGXa/kNUTyh2Tv0 Daupn75OcsqF1NnstTJFGG+rrQIwfcf3aWMvoeGY7xMQ0Xk/0f7qO3/eVvSQsRUR2LIiFdAvwyYu a/GRspBl9JrmkO5K -----END CERTIFICATE----- gsoap-2.8.28/gsoap/uddi2/example1.cpp0000644000175000017500000000537012653650160016635 0ustar ellertellert/* example1.cpp Example UDDI V2 Client -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2004-2005, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "inqH.h" int main(int argc, char **argv) { char *search_string = "magic"; if (argc > 1) search_string = argv[1]; // Create a gSOAP context struct soap *soap = soap_new(); // Create an object to find a business uddi2__find_USCOREservice fs(soap, search_string); // Send the request uddi2__serviceList *sl = fs.send("http://uddi.xmethods.net/inquire"); // Check if result is OK if (!sl) soap_print_fault(soap, stderr); // If OK, report the service name(s) and unique identification keys else if (sl->serviceInfos) { std::cout << "Search results on " << search_string << ":" << std::endl << std::endl; for (std::vector::const_iterator si = sl->serviceInfos->serviceInfo.begin(); si != sl->serviceInfos->serviceInfo.end(); ++si) { // Report serviceKey and businessKey std::cout << "serviceKey=" << (*si)->serviceKey << std::endl << "businessKey=" << (*si)->businessKey << std::endl; // Report names for (std::vector::const_iterator n = (*si)->name.begin(); n != (*si)->name.end(); ++n) std::cout << "name=" << (*n)->__item << std::endl; std::cout << std::endl; } } // Remove deserialized objects soap_destroy(soap); // Remove temporary data soap_end(soap); // Detach and free context soap_done(soap); free(soap); return 0; } gsoap-2.8.28/gsoap/uddi2/README.txt0000644000175000017500000000274312653650160016114 0ustar ellertellertgSOAP UDDI v2 See directory html/index.html for documentation and examples of the UDDI v2 API generated with gSOAP and Doxygen. The API is written in C++. However, wsdl2h option -c can be used to generate C code serializers for UDDI v2. The API implementation supports UDDI v2 inquiry and publish operations. A Makefile is included to build two example C++ clients, example1 and example2, to search services and businesses, respectively. Code can be generated for the inquiry API, publish API, and both combined. To do so, run wsdl2h on inquire_v2.wsdl and/or publish_v2.wsdl COMPILATION The build steps are generally as follows: # Run wsdl2h with mapping specified in uddi2-typemap.dat on the UDDI WSDL(s): $ wsdl2h -tuddi2-typemap.dat -ouddi_v2.h inquire_v2.wsdl publish_v2.wsdl # Run soapcpp2 on the generated .h file (-puddi saves sources as uddiXYZ): $ soapcpp2 -I.. -puddi uddi_v2.h # Complete the build: $ g++ -DWITH_NONAMESPACES -I.. -o main main.cpp inquire_v2.cpp publish_v2.cpp uddiC.cpp uddiClient.cpp ../stdsoap2.cpp # To avoid link errors combining multiple services, replace the last step with: $ echo '' > env.h $ soapcpp2 -I.. -penv env.h $ g++ -DWITH_NONAMESPACES -I.. -o main main.cpp inquire_v2.cpp publish_v2.cpp uddiClientLib.cpp ../stdsoap2.cpp USING DOXYGEN To generate documentation, use Doxygen on the generated header file, e.g. uddi_v2.h. Part of the documentation is included in the uddi2-typemap.dat file, which was used to generate the header file(s) with wsdl2h. gsoap-2.8.28/gsoap/uddi2/inquire_v2.cpp0000644000175000017500000003776012653650160017214 0ustar ellertellert/* inquire_v2.cpp UDDI V2 Inquiry Interface -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2004-2005, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "inqH.h" #undef SOAP_NMAC #define SOAP_NMAC static #define uddiH_H #include "InquireSoap.nsmap" //////////////////////////////////////////////////////////////////////////////// // // uddi2:find_binding // //////////////////////////////////////////////////////////////////////////////// uddi2__find_USCOREbinding::uddi2__find_USCOREbinding(struct soap *soap) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->generic = "2.0"; } uddi2__find_USCOREbinding::uddi2__find_USCOREbinding(struct soap *soap, const char *tModelKey) { // Initialize this object and associate it with the gSOAP context soap_default(soap); // Create a new UDDI tModelKey this->tModelBag = soap_new_uddi2__tModelBag(soap, -1); this->tModelBag->soap_default(soap); this->tModelBag->tModelKey.push_back(soap_strdup(soap, tModelKey)); this->generic = "2.0"; } uddi2__find_USCOREbinding::uddi2__find_USCOREbinding(struct soap *soap, std::vector tModelKeys) { // Initialize this object and associate it with the gSOAP context soap_default(soap); // Create a new UDDI tModelKey Bag this->tModelBag = soap_new_uddi2__tModelBag(soap, -1); this->tModelBag->soap_default(soap); this->tModelBag->tModelKey = tModelKeys; this->generic = "2.0"; } uddi2__bindingDetail *uddi2__find_USCOREbinding::send(const char *endpoint) { // Allocate result uddi2__bindingDetail *result = soap_new_uddi2__bindingDetail(soap, -1); // Invoke the wrapper soap_set_namespaces(soap, namespaces); if (soap_call___inq2__find_USCOREbinding(soap, endpoint, NULL, this, result)) return NULL; return result; } //////////////////////////////////////////////////////////////////////////////// // // uddi2:find_business // //////////////////////////////////////////////////////////////////////////////// uddi2__find_USCOREbusiness::uddi2__find_USCOREbusiness(struct soap *soap) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->generic = "2.0"; } uddi2__find_USCOREbusiness::uddi2__find_USCOREbusiness(struct soap *soap, const char *name) { // Initialize this object and associate it with the gSOAP context soap_default(soap); // Create a new UDDI name uddi2__name *uname = soap_new_uddi2__name(soap, -1); uname->soap_default(soap); uname->__item = soap_strdup(soap, name); this->name.push_back(uname); this->generic = "2.0"; } uddi2__find_USCOREbusiness::uddi2__find_USCOREbusiness(struct soap *soap, std::vector keyedReferences) { // Initialize this object and associate it with the gSOAP context soap_default(soap); // Create a new UDDI tModelBag this->categoryBag = soap_new_uddi2__categoryBag(soap, -1); this->categoryBag->soap_default(soap); this->categoryBag->keyedReference = keyedReferences; this->generic = "2.0"; } uddi2__find_USCOREbusiness::uddi2__find_USCOREbusiness(struct soap *soap, std::vector tModelKeys) { // Initialize this object and associate it with the gSOAP context soap_default(soap); // Create a new UDDI tModelBag this->tModelBag = soap_new_uddi2__tModelBag(soap, -1); this->tModelBag->soap_default(soap); this->tModelBag->tModelKey = tModelKeys; this->generic = "2.0"; } uddi2__businessList *uddi2__find_USCOREbusiness::send(const char *endpoint) { // Allocate result uddi2__businessList *result = soap_new_uddi2__businessList(soap, -1); // Invoke the wrapper soap_set_namespaces(soap, namespaces); if (soap_call___inq2__find_USCOREbusiness(soap, endpoint, NULL, this, result)) return NULL; return result; } //////////////////////////////////////////////////////////////////////////////// // // uddi2:find_relatedBusinesses // //////////////////////////////////////////////////////////////////////////////// uddi2__find_USCORErelatedBusinesses::uddi2__find_USCORErelatedBusinesses(struct soap *soap) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->generic = "2.0"; } uddi2__find_USCORErelatedBusinesses::uddi2__find_USCORErelatedBusinesses(struct soap *soap, const char *businessKey) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->businessKey = soap_strdup(soap, businessKey); this->generic = "2.0"; } uddi2__relatedBusinessesList *uddi2__find_USCORErelatedBusinesses::send(const char *endpoint) { // Allocate result uddi2__relatedBusinessesList *result = soap_new_uddi2__relatedBusinessesList(soap, -1); // Invoke the wrapper soap_set_namespaces(soap, namespaces); if (soap_call___inq2__find_USCORErelatedBusinesses(soap, endpoint, NULL, this, result)) return NULL; return result; } //////////////////////////////////////////////////////////////////////////////// // // uddi2:find_service // //////////////////////////////////////////////////////////////////////////////// uddi2__find_USCOREservice::uddi2__find_USCOREservice(struct soap *soap) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->generic = "2.0"; } uddi2__find_USCOREservice::uddi2__find_USCOREservice(struct soap *soap, const char *name) { // Initialize this object and associate it with the gSOAP context soap_default(soap); // Create a new UDDI name uddi2__name *uname = soap_new_uddi2__name(soap, -1); uname->soap_default(soap); uname->__item = soap_strdup(soap, name); this->name.push_back(uname); this->generic = "2.0"; } uddi2__find_USCOREservice::uddi2__find_USCOREservice(struct soap *soap, std::vector keyedReferences) { // Initialize this object and associate it with the gSOAP context soap_default(soap); // Create a new UDDI tModelBag this->categoryBag = soap_new_uddi2__categoryBag(soap, -1); this->categoryBag->soap_default(soap); this->categoryBag->keyedReference = keyedReferences; this->generic = "2.0"; } uddi2__find_USCOREservice::uddi2__find_USCOREservice(struct soap *soap, std::vector tModelKeys) { // Initialize this object and associate it with the gSOAP context soap_default(soap); // Create a new UDDI tModelBag this->tModelBag = soap_new_uddi2__tModelBag(soap, -1); this->tModelBag->soap_default(soap); this->tModelBag->tModelKey = tModelKeys; this->generic = "2.0"; } uddi2__serviceList* uddi2__find_USCOREservice::send(const char *endpoint) { // Allocate result uddi2__serviceList *result = soap_new_uddi2__serviceList(soap, -1); // Invoke the wrapper soap_set_namespaces(soap, namespaces); if (soap_call___inq2__find_USCOREservice(soap, endpoint, NULL, this, result)) return NULL; return result; } //////////////////////////////////////////////////////////////////////////////// // // uddi2:find_tModel // //////////////////////////////////////////////////////////////////////////////// uddi2__find_USCOREtModel::uddi2__find_USCOREtModel(struct soap *soap) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->generic = "2.0"; } uddi2__find_USCOREtModel::uddi2__find_USCOREtModel(struct soap *soap, const char *name) { // Initialize this object and associate it with the gSOAP context soap_default(soap); // Create a new UDDI name this->name = soap_new_uddi2__name(soap, -1); this->name->soap_default(soap); this->name->__item = soap_strdup(soap, name); this->generic = "2.0"; } uddi2__find_USCOREtModel::uddi2__find_USCOREtModel(struct soap *soap, std::vector keyedReferences) { // Initialize this object and associate it with the gSOAP context soap_default(soap); // Create a new UDDI tModelBag this->categoryBag = soap_new_uddi2__categoryBag(soap, -1); this->categoryBag->soap_default(soap); this->categoryBag->keyedReference = keyedReferences; this->generic = "2.0"; } uddi2__tModelList* uddi2__find_USCOREtModel::send(const char *endpoint) { // Allocate result uddi2__tModelList *result = soap_new_uddi2__tModelList(soap, -1); // Invoke the wrapper soap_set_namespaces(soap, namespaces); if (soap_call___inq2__find_USCOREtModel(soap, endpoint, NULL, this, result)) return NULL; return result; } //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_bindingDetail // //////////////////////////////////////////////////////////////////////////////// uddi2__get_USCOREbindingDetail::uddi2__get_USCOREbindingDetail(struct soap *soap) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->generic = "2.0"; } uddi2__get_USCOREbindingDetail::uddi2__get_USCOREbindingDetail(struct soap *soap, const char *bindingKey) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->bindingKey.push_back(soap_strdup(soap, bindingKey)); this->generic = "2.0"; } uddi2__get_USCOREbindingDetail::uddi2__get_USCOREbindingDetail(struct soap *soap, std::vector bindingKeys) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->bindingKey = bindingKeys; this->generic = "2.0"; } uddi2__bindingDetail *uddi2__get_USCOREbindingDetail::send(const char *endpoint) { // Allocate result uddi2__bindingDetail *result = soap_new_uddi2__bindingDetail(soap, -1); // Invoke the wrapper soap_set_namespaces(soap, namespaces); if (soap_call___inq2__get_USCOREbindingDetail(soap, endpoint, NULL, this, result)) return NULL; return result; } //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_businessDetail // //////////////////////////////////////////////////////////////////////////////// uddi2__get_USCOREbusinessDetail::uddi2__get_USCOREbusinessDetail(struct soap *soap) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->generic = "2.0"; } uddi2__get_USCOREbusinessDetail::uddi2__get_USCOREbusinessDetail(struct soap *soap, const char *businessKey) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->businessKey.push_back(soap_strdup(soap, businessKey)); this->generic = "2.0"; } uddi2__get_USCOREbusinessDetail::uddi2__get_USCOREbusinessDetail(struct soap *soap, std::vector businessKeys) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->businessKey = businessKeys; this->generic = "2.0"; } uddi2__businessDetail *uddi2__get_USCOREbusinessDetail::send(const char *endpoint) { // Allocate result uddi2__businessDetail *result = soap_new_uddi2__businessDetail(soap, -1); // Invoke the wrapper soap_set_namespaces(soap, namespaces); if (soap_call___inq2__get_USCOREbusinessDetail(soap, endpoint, NULL, this, result)) return NULL; return result; } //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_businessDetailExt // //////////////////////////////////////////////////////////////////////////////// uddi2__get_USCOREbusinessDetailExt::uddi2__get_USCOREbusinessDetailExt(struct soap *soap) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->generic = "2.0"; } uddi2__get_USCOREbusinessDetailExt::uddi2__get_USCOREbusinessDetailExt(struct soap *soap, const char *businessKey) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->businessKey.push_back(soap_strdup(soap, businessKey)); this->generic = "2.0"; } uddi2__get_USCOREbusinessDetailExt::uddi2__get_USCOREbusinessDetailExt(struct soap *soap, std::vector businessKeys) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->businessKey = businessKeys; this->generic = "2.0"; } uddi2__businessDetailExt *uddi2__get_USCOREbusinessDetailExt::send(const char *endpoint) { // Allocate result uddi2__businessDetailExt *result = soap_new_uddi2__businessDetailExt(soap, -1); // Invoke the wrapper soap_set_namespaces(soap, namespaces); if (soap_call___inq2__get_USCOREbusinessDetailExt(soap, endpoint, NULL, this, result)) return NULL; return result; } //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_serviceDetail // //////////////////////////////////////////////////////////////////////////////// uddi2__get_USCOREserviceDetail::uddi2__get_USCOREserviceDetail(struct soap *soap) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->generic = "2.0"; } uddi2__get_USCOREserviceDetail::uddi2__get_USCOREserviceDetail(struct soap *soap, const char *serviceKey) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->serviceKey.push_back(soap_strdup(soap, serviceKey)); this->generic = "2.0"; } uddi2__get_USCOREserviceDetail::uddi2__get_USCOREserviceDetail(struct soap *soap, std::vector serviceKeys) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->serviceKey = serviceKeys; this->generic = "2.0"; } uddi2__serviceDetail *uddi2__get_USCOREserviceDetail::send(const char *endpoint) { // Allocate result uddi2__serviceDetail *result = soap_new_uddi2__serviceDetail(soap, -1); // Invoke the wrapper soap_set_namespaces(soap, namespaces); if (soap_call___inq2__get_USCOREserviceDetail(soap, endpoint, NULL, this, result)) return NULL; return result; } //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_tModelDetail // //////////////////////////////////////////////////////////////////////////////// uddi2__get_USCOREtModelDetail::uddi2__get_USCOREtModelDetail(struct soap *soap) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->generic = "2.0"; } uddi2__get_USCOREtModelDetail::uddi2__get_USCOREtModelDetail(struct soap *soap, const char *tModelKey) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->tModelKey.push_back(soap_strdup(soap, tModelKey)); this->generic = "2.0"; } uddi2__get_USCOREtModelDetail::uddi2__get_USCOREtModelDetail(struct soap *soap, std::vector tModelKeys) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->tModelKey = tModelKeys; this->generic = "2.0"; } uddi2__tModelDetail *uddi2__get_USCOREtModelDetail::send(const char *endpoint) { // Allocate result uddi2__tModelDetail *result = soap_new_uddi2__tModelDetail(soap, -1); // Invoke the wrapper soap_set_namespaces(soap, namespaces); if (soap_call___inq2__get_USCOREtModelDetail(soap, endpoint, NULL, this, result)) return NULL; return result; } gsoap-2.8.28/gsoap/uddi2/publish_v2.cpp0000644000175000017500000005145112653650160017177 0ustar ellertellert/* publish_v2.cpp UDDI V2 Publish Interface -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2004-2005, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "pubH.h" #define SOAP_NMAC static #define uddiH_H #include "PublishSoap.nsmap" //////////////////////////////////////////////////////////////////////////////// // // uddi2:add_publisherAssertions // //////////////////////////////////////////////////////////////////////////////// uddi2__add_USCOREpublisherAssertions::uddi2__add_USCOREpublisherAssertions(struct soap *soap) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->generic = "2.0"; } uddi2__add_USCOREpublisherAssertions::uddi2__add_USCOREpublisherAssertions(struct soap *soap, std::vector publisherAssertions) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->publisherAssertion = publisherAssertions; this->generic = "2.0"; } uddi2__dispositionReport *uddi2__add_USCOREpublisherAssertions::send(const char *endpoint, char *authInfo) { // Set authorization token this->authInfo = authInfo; // Allocate result uddi2__dispositionReport *result = soap_new_uddi2__dispositionReport(soap, -1); // Invoke the wrapper soap_set_namespaces(soap, namespaces); if (soap_call___pub2__add_USCOREpublisherAssertions(soap, endpoint, NULL, this, result)) return NULL; return result; } //////////////////////////////////////////////////////////////////////////////// // // uddi2:delete_binding // //////////////////////////////////////////////////////////////////////////////// uddi2__delete_USCOREbinding::uddi2__delete_USCOREbinding(struct soap *soap) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->generic = "2.0"; } uddi2__delete_USCOREbinding::uddi2__delete_USCOREbinding(struct soap *soap, const char *bindingKey) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->bindingKey.push_back(soap_strdup(soap, bindingKey)); this->generic = "2.0"; } uddi2__delete_USCOREbinding::uddi2__delete_USCOREbinding(struct soap *soap, std::vector bindingKeys) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->bindingKey = bindingKeys; this->generic = "2.0"; } uddi2__dispositionReport *uddi2__delete_USCOREbinding::send(const char *endpoint, char *authInfo) { // Set authorization token this->authInfo = authInfo; // Allocate result uddi2__dispositionReport *result = soap_new_uddi2__dispositionReport(soap, -1); // Invoke the wrapper soap_set_namespaces(soap, namespaces); if (soap_call___pub2__delete_USCOREbinding(soap, endpoint, NULL, this, result)) return NULL; return result; } //////////////////////////////////////////////////////////////////////////////// // // uddi2:delete_business // //////////////////////////////////////////////////////////////////////////////// uddi2__delete_USCOREbusiness::uddi2__delete_USCOREbusiness(struct soap *soap) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->generic = "2.0"; } uddi2__delete_USCOREbusiness::uddi2__delete_USCOREbusiness(struct soap *soap, const char *businessKey) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->businessKey.push_back(soap_strdup(soap, businessKey)); this->generic = "2.0"; } uddi2__delete_USCOREbusiness::uddi2__delete_USCOREbusiness(struct soap *soap, std::vector businessKeys) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->businessKey = businessKeys; this->generic = "2.0"; } uddi2__dispositionReport *uddi2__delete_USCOREbusiness::send(const char *endpoint, char *authInfo) { // Set authorization token this->authInfo = authInfo; // Allocate result uddi2__dispositionReport *result = soap_new_uddi2__dispositionReport(soap, -1); // Invoke the wrapper soap_set_namespaces(soap, namespaces); if (soap_call___pub2__delete_USCOREbusiness(soap, endpoint, NULL, this, result)) return NULL; return result; } //////////////////////////////////////////////////////////////////////////////// // // uddi2:delete_service // //////////////////////////////////////////////////////////////////////////////// uddi2__delete_USCOREservice::uddi2__delete_USCOREservice(struct soap *soap) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->generic = "2.0"; } uddi2__delete_USCOREservice::uddi2__delete_USCOREservice(struct soap *soap, const char *serviceKey) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->serviceKey.push_back(soap_strdup(soap, serviceKey)); this->generic = "2.0"; } uddi2__delete_USCOREservice::uddi2__delete_USCOREservice(struct soap *soap, std::vector serviceKeys) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->serviceKey = serviceKeys; this->generic = "2.0"; } uddi2__dispositionReport *uddi2__delete_USCOREservice::send(const char *endpoint, char *authInfo) { // Set authorization token this->authInfo = authInfo; // Allocate result uddi2__dispositionReport *result = soap_new_uddi2__dispositionReport(soap, -1); // Invoke the wrapper soap_set_namespaces(soap, namespaces); if (soap_call___pub2__delete_USCOREservice(soap, endpoint, NULL, this, result)) return NULL; return result; } //////////////////////////////////////////////////////////////////////////////// // // uddi2:delete_tModel // //////////////////////////////////////////////////////////////////////////////// uddi2__delete_USCOREtModel::uddi2__delete_USCOREtModel(struct soap *soap) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->generic = "2.0"; } uddi2__delete_USCOREtModel::uddi2__delete_USCOREtModel(struct soap *soap, const char *tModelKey) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->tModelKey.push_back(soap_strdup(soap, tModelKey)); this->generic = "2.0"; } uddi2__delete_USCOREtModel::uddi2__delete_USCOREtModel(struct soap *soap, std::vector tModelKeys) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->tModelKey = tModelKeys; this->generic = "2.0"; } uddi2__dispositionReport *uddi2__delete_USCOREtModel::send(const char *endpoint, char *authInfo) { // Set authorization token this->authInfo = authInfo; // Allocate result uddi2__dispositionReport *result = soap_new_uddi2__dispositionReport(soap, -1); // Invoke the wrapper soap_set_namespaces(soap, namespaces); if (soap_call___pub2__delete_USCOREtModel(soap, endpoint, NULL, this, result)) return NULL; return result; } //////////////////////////////////////////////////////////////////////////////// // // uddi2:delete_publisherAssertions // //////////////////////////////////////////////////////////////////////////////// uddi2__delete_USCOREpublisherAssertions::uddi2__delete_USCOREpublisherAssertions(struct soap *soap) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->generic = "2.0"; } uddi2__delete_USCOREpublisherAssertions::uddi2__delete_USCOREpublisherAssertions(struct soap *soap, std::vector publisherAssertions) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->publisherAssertion = publisherAssertions; this->generic = "2.0"; } uddi2__dispositionReport *uddi2__delete_USCOREpublisherAssertions::send(const char *endpoint, char *authInfo) { // Set authorization token this->authInfo = authInfo; // Allocate result uddi2__dispositionReport *result = soap_new_uddi2__dispositionReport(soap, -1); // Invoke the wrapper soap_set_namespaces(soap, namespaces); if (soap_call___pub2__delete_USCOREpublisherAssertions(soap, endpoint, NULL, this, result)) return NULL; return result; } //////////////////////////////////////////////////////////////////////////////// // // uddi2:discard_authToken // //////////////////////////////////////////////////////////////////////////////// uddi2__discard_USCOREauthToken::uddi2__discard_USCOREauthToken(struct soap *soap) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->generic = "2.0"; } uddi2__discard_USCOREauthToken::uddi2__discard_USCOREauthToken(struct soap *soap, const char *authInfo) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->authInfo = soap_strdup(soap, authInfo); this->generic = "2.0"; } uddi2__dispositionReport *uddi2__discard_USCOREauthToken::send(const char *endpoint) { // Allocate result uddi2__dispositionReport *result = soap_new_uddi2__dispositionReport(soap, -1); // Invoke the wrapper soap_set_namespaces(soap, namespaces); if (soap_call___pub2__discard_USCOREauthToken(soap, endpoint, NULL, this, result)) return NULL; return result; } //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_assertionStatusReport // //////////////////////////////////////////////////////////////////////////////// uddi2__get_USCOREassertionStatusReport::uddi2__get_USCOREassertionStatusReport(struct soap *soap) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->generic = "2.0"; } uddi2__get_USCOREassertionStatusReport::uddi2__get_USCOREassertionStatusReport(struct soap *soap, const char *completionStatus) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->completionStatus = soap_strdup(soap, completionStatus); this->generic = "2.0"; } uddi2__assertionStatusReport *uddi2__get_USCOREassertionStatusReport::send(const char *endpoint, char *authInfo) { // Set authorization token this->authInfo = authInfo; // Allocate result uddi2__assertionStatusReport *result = soap_new_uddi2__assertionStatusReport(soap, -1); // Invoke the wrapper soap_set_namespaces(soap, namespaces); if (soap_call___pub2__get_USCOREassertionStatusReport(soap, endpoint, NULL, this, result)) return NULL; return result; } //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_authToken // //////////////////////////////////////////////////////////////////////////////// uddi2__get_USCOREauthToken::uddi2__get_USCOREauthToken(struct soap *soap) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->generic = "2.0"; } uddi2__get_USCOREauthToken::uddi2__get_USCOREauthToken(struct soap *soap, const char *userid, const char *passwd) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->userID = soap_strdup(soap, userid); this->cred = soap_strdup(soap, passwd); this->generic = "2.0"; } uddi2__authToken *uddi2__get_USCOREauthToken::send(const char *endpoint) { // Allocate result uddi2__authToken *result = soap_new_uddi2__authToken(soap, -1); // Invoke the wrapper soap_set_namespaces(soap, namespaces); if (soap_call___pub2__get_USCOREauthToken(soap, endpoint, NULL, this, result)) return NULL; return result; } //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_publisherAssertions // //////////////////////////////////////////////////////////////////////////////// uddi2__get_USCOREpublisherAssertions::uddi2__get_USCOREpublisherAssertions(struct soap *soap) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->generic = "2.0"; } uddi2__publisherAssertions *uddi2__get_USCOREpublisherAssertions::send(const char *endpoint, char *authInfo) { // Set authorization token this->authInfo = authInfo; // Allocate result uddi2__publisherAssertions *result = soap_new_uddi2__publisherAssertions(soap, -1); // Invoke the wrapper soap_set_namespaces(soap, namespaces); if (soap_call___pub2__get_USCOREpublisherAssertions(soap, endpoint, NULL, this, result)) return NULL; return result; } //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_registeredInfo // //////////////////////////////////////////////////////////////////////////////// uddi2__get_USCOREregisteredInfo::uddi2__get_USCOREregisteredInfo(struct soap *soap) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->generic = "2.0"; } uddi2__registeredInfo *uddi2__get_USCOREregisteredInfo::send(const char *endpoint, char *authInfo) { // Set authorization token this->authInfo = authInfo; // Allocate result uddi2__registeredInfo *result = soap_new_uddi2__registeredInfo(soap, -1); // Invoke the wrapper soap_set_namespaces(soap, namespaces); if (soap_call___pub2__get_USCOREregisteredInfo(soap, endpoint, NULL, this, result)) return NULL; return result; } //////////////////////////////////////////////////////////////////////////////// // // uddi2:save_binding // //////////////////////////////////////////////////////////////////////////////// uddi2__save_USCOREbinding::uddi2__save_USCOREbinding(struct soap *soap) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->generic = "2.0"; } uddi2__save_USCOREbinding::uddi2__save_USCOREbinding(struct soap *soap, uddi2__bindingTemplate &bindingTemplate) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->bindingTemplate.push_back(&bindingTemplate); this->generic = "2.0"; } uddi2__save_USCOREbinding::uddi2__save_USCOREbinding(struct soap *soap, std::vector bindingTemplates) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->bindingTemplate = bindingTemplates; this->generic = "2.0"; } uddi2__bindingDetail *uddi2__save_USCOREbinding::send(const char *endpoint, char *authInfo) { // Set authorization token this->authInfo = authInfo; // Allocate result uddi2__bindingDetail *result = soap_new_uddi2__bindingDetail(soap, -1); // Invoke the wrapper soap_set_namespaces(soap, namespaces); if (soap_call___pub2__save_USCOREbinding(soap, endpoint, NULL, this, result)) return NULL; return result; } //////////////////////////////////////////////////////////////////////////////// // // uddi2:save_business // //////////////////////////////////////////////////////////////////////////////// uddi2__save_USCOREbusiness::uddi2__save_USCOREbusiness(struct soap *soap) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->generic = "2.0"; } uddi2__save_USCOREbusiness::uddi2__save_USCOREbusiness(struct soap *soap, uddi2__businessEntity &businessEntity) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->businessEntity.push_back(&businessEntity); this->generic = "2.0"; } uddi2__save_USCOREbusiness::uddi2__save_USCOREbusiness(struct soap *soap, std::vector businessEntities) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->businessEntity = businessEntities; this->generic = "2.0"; } uddi2__businessDetail *uddi2__save_USCOREbusiness::send(const char *endpoint, char *authInfo) { // Set authorization token this->authInfo = authInfo; // Allocate result uddi2__businessDetail *result = soap_new_uddi2__businessDetail(soap, -1); // Invoke the wrapper soap_set_namespaces(soap, namespaces); if (soap_call___pub2__save_USCOREbusiness(soap, endpoint, NULL, this, result)) return NULL; return result; } //////////////////////////////////////////////////////////////////////////////// // // uddi2:save_service // //////////////////////////////////////////////////////////////////////////////// uddi2__save_USCOREservice::uddi2__save_USCOREservice(struct soap *soap) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->generic = "2.0"; } uddi2__save_USCOREservice::uddi2__save_USCOREservice(struct soap *soap, uddi2__businessService &businessService) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->businessService.push_back(&businessService); this->generic = "2.0"; } uddi2__save_USCOREservice::uddi2__save_USCOREservice(struct soap *soap, std::vector businessServices) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->businessService = businessServices; this->generic = "2.0"; } uddi2__serviceDetail *uddi2__save_USCOREservice::send(const char *endpoint, char *authInfo) { // Set authorization token this->authInfo = authInfo; // Allocate result uddi2__serviceDetail *result = soap_new_uddi2__serviceDetail(soap, -1); // Invoke the wrapper soap_set_namespaces(soap, namespaces); if (soap_call___pub2__save_USCOREservice(soap, endpoint, NULL, this, result)) return NULL; return result; } //////////////////////////////////////////////////////////////////////////////// // // uddi2:save_tModel // //////////////////////////////////////////////////////////////////////////////// uddi2__save_USCOREtModel::uddi2__save_USCOREtModel(struct soap *soap) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->generic = "2.0"; } uddi2__save_USCOREtModel::uddi2__save_USCOREtModel(struct soap *soap, uddi2__tModel &tModel) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->tModel.push_back(&tModel); this->generic = "2.0"; } uddi2__save_USCOREtModel::uddi2__save_USCOREtModel(struct soap *soap, std::vector tModels) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->tModel = tModels; this->generic = "2.0"; } uddi2__tModelDetail *uddi2__save_USCOREtModel::send(const char *endpoint, char *authInfo) { // Set authorization token this->authInfo = authInfo; // Allocate result uddi2__tModelDetail *result = soap_new_uddi2__tModelDetail(soap, -1); // Invoke the wrapper soap_set_namespaces(soap, namespaces); if (soap_call___pub2__save_USCOREtModel(soap, endpoint, NULL, this, result)) return NULL; return result; } //////////////////////////////////////////////////////////////////////////////// // // uddi2:set_publisherAssertions // //////////////////////////////////////////////////////////////////////////////// uddi2__set_USCOREpublisherAssertions::uddi2__set_USCOREpublisherAssertions(struct soap *soap) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->generic = "2.0"; } uddi2__set_USCOREpublisherAssertions::uddi2__set_USCOREpublisherAssertions(struct soap *soap, std::vector publisherAssertions) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->publisherAssertion = publisherAssertions; this->generic = "2.0"; } uddi2__publisherAssertions *uddi2__set_USCOREpublisherAssertions::send(const char *endpoint, char *authInfo) { // Set authorization token this->authInfo = authInfo; // Allocate result uddi2__publisherAssertions *result = soap_new_uddi2__publisherAssertions(soap, -1); // Invoke the wrapper soap_set_namespaces(soap, namespaces); if (soap_call___pub2__set_USCOREpublisherAssertions(soap, endpoint, NULL, this, result)) return NULL; return result; } gsoap-2.8.28/gsoap/uddi2/example3.cpp0000644000175000017500000001507012653650160016635 0ustar ellertellert/* example3.cpp Example UDDI V2 Client -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2004-2005, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "pubH.h" const char *server = "https://uddi.xmethods.net/publish"; const char *userid = "..."; // user ID to access UDDI server const char *passwd = "..."; // password to access UDDI server int main(int argc, char **argv) { // Create a gSOAP context struct soap *soap = soap_new(); // Setup SSL context (optional) to verify server's credentials if (soap_ssl_client_context(soap, SOAP_SSL_DEFAULT, NULL, NULL, "cacerts.pem", NULL, NULL)) { soap_print_fault(soap, stderr); exit(1); } // Step 1: Get an authorization token from the UDDI server uddi2__get_USCOREauthToken get_authToken(soap, userid, passwd); uddi2__authToken *authToken = get_authToken.send(server); // Check if authorized if (!authToken) { soap_print_fault(soap, stderr); exit(1); } // Authorization info provided by server for this session char *authInfo = authToken->authInfo; // Step 2: Create a tModel for the WSDL to be published uddi2__tModel tModel; tModel.soap_default(soap); // Create the tModel and service name tModel.name = soap_new_uddi2__name(soap, -1); tModel.name->__item = "..."; tModel.name->xml__lang_ = "en"; // Create XMethods description elements (see http://www.xmethods.net/ve2/UDDI.po) uddi2__description *description = soap_new_uddi2__description(soap, 6); description[0].__item = "SHORT DESCRIPTION: ..."; description[0].xml__lang_ = "en"; description[1].__item = "SHORT DESCRIPTION: ..."; description[1].xml__lang_ = "en"; description[2].__item = "USAGE NOTES: ..."; description[2].xml__lang_ = "en"; description[3].__item = "HOMEPAGE URL: ..."; description[3].xml__lang_ = "en"; description[4].__item = "CONTACT EMAIL: ..."; description[4].xml__lang_ = "en"; description[5].__item = "IMPLEMENTATION: ..."; description[5].xml__lang_ = "en"; // Add the four description elements to the tModel tModel.description.push_back(description + 0); tModel.description.push_back(description + 1); tModel.description.push_back(description + 2); tModel.description.push_back(description + 4); // Add an overviewDoc element with description and overviewURL tModel.overviewDoc = soap_new_uddi2__overviewDoc(soap, -1); tModel.overviewDoc->soap_default(soap); tModel.overviewDoc->description.push_back(soap_new_uddi2__description(soap, -1)); tModel.overviewDoc->description[0]->__item = "WSDL source document"; tModel.overviewDoc->description[0]->xml__lang_ = "en"; tModel.overviewDoc->overviewURL = "http://.../my.wsdl#bindingName"; // Omit identifier bag tModel.identifierBag = NULL; // Add a category with a WSDL-specific keyedReference tModel.categoryBag = soap_new_uddi2__categoryBag(soap, -1); tModel.categoryBag->soap_default(soap); tModel.categoryBag->keyedReference.push_back(soap_new_uddi2__keyedReference(soap, -1)); tModel.categoryBag->keyedReference[0]->tModelKey = "..."; tModel.categoryBag->keyedReference[0]->keyName = "uddi-org:types"; tModel.categoryBag->keyedReference[0]->keyValue = "wsdlSpec"; tModel.authorizedName = "..."; tModel.operator_ = "..."; tModel.tModelKey = "..."; // Save the tModel uddi2__save_USCOREtModel save_tModel(soap, tModel); uddi2__tModelDetail *tModelDetail = save_tModel.send(server, authInfo); // Step 3: Create a new service to be published uddi2__businessService service; service.soap_default(soap); // Service name is the tModel name (XMethods) service.name.push_back(tModel.name); // Add two description elements to the service service.description.push_back(description + 4); service.description.push_back(description + 5); // Create binding template uddi2__bindingTemplate bindingTemplate; bindingTemplate.soap_default(soap); bindingTemplate.tModelInstanceDetails = soap_new_uddi2__tModelInstanceDetails(soap, -1); bindingTemplate.tModelInstanceDetails->tModelInstanceInfo.push_back(soap_new_uddi2__tModelInstanceInfo(soap, -1)); bindingTemplate.tModelInstanceDetails->tModelInstanceInfo[0]->instanceDetails = NULL; bindingTemplate.tModelInstanceDetails->tModelInstanceInfo[0]->tModelKey = tModel.tModelKey; bindingTemplate.accessPoint = soap_new_uddi2__accessPoint(soap, -1); bindingTemplate.accessPoint->__item = "..."; bindingTemplate.accessPoint->URLType = uddi2__URLType__http; bindingTemplate.hostingRedirector = NULL; bindingTemplate.serviceKey = "..."; bindingTemplate.bindingKey = "..."; // Add binding Template to service service.bindingTemplates = soap_new_uddi2__bindingTemplates(soap, -1); service.bindingTemplates->soap_default(soap); service.bindingTemplates->bindingTemplate.push_back(&bindingTemplate); service.categoryBag = NULL; service.serviceKey = "..."; service.businessKey = "..."; // Save the service uddi2__save_USCOREservice save_service(soap, service); uddi2__serviceDetail *serviceDetail = save_service.send(server, authInfo); // Step 4: Discard authorization token uddi2__discard_USCOREauthToken discard_authToken(soap, authInfo); uddi2__dispositionReport *dispositionReport = discard_authToken.send(server); // Remove deserialized objects soap_destroy(soap); // Remove temporary data soap_end(soap); // Detach and free context soap_done(soap); free(soap); return 0; } gsoap-2.8.28/gsoap/uddi2/inquire_v2.h0000644000175000017500000043123312653650160016652 0ustar ellertellert/** @mainpage gSOAP UDDI v2 Universal Description, Discovery and Integration, or UDDI, is the name of a group of web-based registries that expose information about a business or other entity and its technical interfaces. See the UDDI v2 specification @url http://uddi.org/pubs/ProgrammersAPI_v2.htm for more details. @section UDDI2_CLASSES Classes See Related Pages for examples. UDDI Inquire classes - @ref uddi2__find_USCOREbinding - @ref uddi2__find_USCOREbusiness - @ref uddi2__find_USCORErelatedBusinesses - @ref uddi2__find_USCOREservice - @ref uddi2__find_USCOREtModel - @ref uddi2__get_USCOREbindingDetail - @ref uddi2__get_USCOREbusinessDetail - @ref uddi2__get_USCOREbusinessDetailExt - @ref uddi2__get_USCOREserviceDetail - @ref uddi2__get_USCOREtModelDetail UDDI Publish classes - @ref uddi2__add_USCOREpublisherAssertions - @ref uddi2__delete_USCOREbinding - @ref uddi2__delete_USCOREbusiness - @ref uddi2__delete_USCOREservice - @ref uddi2__delete_USCOREtModel - @ref uddi2__delete_USCOREpublisherAssertions - @ref uddi2__discard_USCOREauthToken - @ref uddi2__get_USCOREassertionStatusReport - @ref uddi2__get_USCOREauthToken - @ref uddi2__get_USCOREpublisherAssertions - @ref uddi2__get_USCOREregisteredInfo - @ref uddi2__save_USCOREbinding - @ref uddi2__save_USCOREbusiness - @ref uddi2__save_USCOREservice - @ref uddi2__save_USCOREtModel - @ref uddi2__set_USCOREpublisherAssertions @section UDDI2_BINDINGS Binding Reference - @ref InquireSoap - @ref PublishSoap */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:find_binding // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__find_USCOREbinding @brief Represents a request to locate bindings that meet the specified requirements. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137712 */ /** @fn uddi2__find_USCOREbinding::uddi2__find_USCOREbinding(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the find_USCOREbinding class. */ /** @fn uddi2__find_USCOREbinding::uddi2__find_USCOREbinding(struct soap *soap, const char *tModelKey) @brief @param[in] soap gSOAP context @param[in] tModelKey string Creates an instance of the find_USCOREbinding class using the specified tModel key. */ /** @fn uddi2__find_USCOREbinding::uddi2__find_USCOREbinding(struct soap *soap, std::vector tModelKeys) @brief @param[in] soap gSOAP context @param[in] tModelKeys collection of tModel key strings Creates an instance of the find_USCOREbinding class using the specified tModel keys. */ /** @fn uddi2__bindingDetail* uddi2__find_USCOREbinding::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__bindingDetail object or NULL on error Send a request to a UDDI server to find binding details. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:find_business // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__find_USCOREbusiness @brief Represents a request to locate businesses that meet specific requirements. When the send method is called, the instance returns a uddi2__businessList object that contains a list of business that matched the search criteria. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137713 See also @ref example2. */ /** @fn uddi2__find_USCOREbusiness::uddi2__find_USCOREbusiness(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the find_USCOREbusiness class. */ /** @fn uddi2__find_USCOREbusiness::uddi2__find_USCOREbusiness(struct soap *soap, const char *name) @brief @param[in] soap gSOAP context Creates an instance of the find_USCOREbusiness class using the specified name of the requested business. */ /** @fn uddi2__find_USCOREbusiness::uddi2__find_USCOREbusiness(struct soap *soap, std::vector keyedReferences) @brief @param[in] soap gSOAP context Creates an instance of the find_USCOREbusiness class using the specified category references. */ /** @fn uddi2__find_USCOREbusiness::uddi2__find_USCOREbusiness(struct soap *soap, std::vector tModelKeys) @brief @param[in] soap gSOAP context Creates an instance of the find_USCOREbusiness class using the specified tModel keys. */ /** @fn uddi2__businessList *uddi2__find_USCOREbusiness::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__businessList object or NULL on error Send a request to a UDDI server to find a list of businesses. See also @ref example2. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:find_relatedBusinesses // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__find_USCORErelatedBusinesses @brief Represents a request to locate businesses that are related to a specific business. When the send method is called, the instance returns a uddi2__relatedBusinessList object that contains a list of business that matched the relationship set. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137714 */ /** @fn uddi2__find_USCORErelatedBusinesses::uddi2__find_USCORErelatedBusinesses(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the find_USCORErelatedBusiness class. */ /** @fn uddi2__find_USCORErelatedBusinesses::uddi2__find_USCORErelatedBusinesses(struct soap *soap, const char *businessKey) @brief @param[in] soap gSOAP context @param[in] businessKey string Creates an instance of the find_USCORErelatedBusiness class using the specified business key. */ /** @fn uddi2__relatedBusinessesList *uddi2__find_USCORErelatedBusinesses::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__relatedBusinessList object or NULL on error Send a request to a UDDI server to find a list of related businesses. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:find_service // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__find_USCOREservice @brief Represents a request to locate services that meet the specified requirements. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137715 See also @ref example1. */ /** @fn uddi2__find_USCOREservice::uddi2__find_USCOREservice(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the find_USCOREservice class. */ /** @fn uddi2__find_USCOREservice::uddi2__find_USCOREservice(struct soap *soap, const char *name) @brief @param[in] soap gSOAP context @param[in] name of the service Creates an instance of the find_USCOREservice class using the specified name. */ /** @fn uddi2__find_USCOREservice::uddi2__find_USCOREservice(struct soap *soap, std::vector keyedReferences) @brief @param[in] soap gSOAP context @param[in] keyedReferences collection of category keys Creates an instance of the find_USCOREservice class using the specified category keys. */ /** @fn uddi2__find_USCOREservice::uddi2__find_USCOREservice(struct soap *soap, std::vector tModelKeys) @brief @param[in] soap gSOAP context @param[in] tModelKeys collection of tModel key strings Creates an instance of the find_USCOREservice class using the specified tModel keys. */ /** @fn uddi2__serviceList* uddi2__find_USCOREservice::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__serviceList object or NULL on error Send a request to a UDDI server to find a list of services. See also @ref example1. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:find_tModel // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__find_USCOREtModel @brief Represents a request to locate a list of tModel entries that match a set of specific criteria. The result of a search is a uddi2__tModelList object that contains information about registered tModel data that matches the criteria. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137716 */ /** @fn uddi2__find_USCOREtModel::uddi2__find_USCOREtModel(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the find_USCOREtModel class. */ /** @fn uddi2__find_USCOREtModel::uddi2__find_USCOREtModel(struct soap *soap, const char *name) @brief @param[in] soap gSOAP context @param[in] name of the tModel Creates an instance of the find_USCOREtModel class using the specified tModel name. */ /** @fn uddi2__find_USCOREtModel::uddi2__find_USCOREtModel(struct soap *soap, std::vector keyedReferences) @brief @param[in] soap gSOAP context @param[in] keyedReferences collection of category keys Creates an instance of the find_USCOREtModel class using the specified category keys. */ /** @fn uddi2__tModelList* uddi2__find_USCOREtModel::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__tModelList object or NULL on error Send a request to a UDDI server to find a tModelList. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_bindingDetail // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREbindingDetail @brief Represents a request to get binding details from a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137717 */ /** @fn uddi2__get_USCOREbindingDetail::uddi2__get_USCOREbindingDetail(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREbindingDetail class. */ /** @fn uddi2__get_USCOREbindingDetail::uddi2__get_USCOREbindingDetail(struct soap *soap, const char *bindingKey) @brief @param[in] soap gSOAP context @param[in] bindingKey string Creates an instance of the get_USCOREbindingDetail class using the specified binding key. */ /** @fn uddi2__get_USCOREbindingDetail::uddi2__get_USCOREbindingDetail(struct soap *soap, std::vector bindingKeys) @brief @param[in] soap gSOAP context @param[in] bindingKeys collection of key strings Creates an instance of the get_USCOREbindingDetail class using the specified collection of binding keys. */ /** @fn uddi2__bindingDetail* uddi2__get_USCOREbindingDetail::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__bindingDetail object or NULL on error Send a request to a UDDI server to get the binding details. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_businessDetail // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREbusinessDetail @brief Represents a request to get business details from a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137718 */ /** @fn uddi2__get_USCOREbusinessDetail::uddi2__get_USCOREbusinessDetail(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREbusinessDetail class. */ /** @fn uddi2__get_USCOREbusinessDetail::uddi2__get_USCOREbusinessDetail(struct soap *soap, const char *businessKey) @brief @param[in] soap gSOAP context @param[in] businessKey string Creates an instance of the get_USCOREbusinessDetail class using the specified business key. */ /** @fn uddi2__get_USCOREbusinessDetail::uddi2__get_USCOREbusinessDetail(struct soap *soap, std::vector businessKeys) @brief @param[in] soap gSOAP context @param[in] businessKeys collection of key strings Creates an instance of the get_USCOREbusinessDetail class using the specified collection of business keys. */ /** @fn uddi2__businessDetail* uddi2__get_USCOREbusinessDetail::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__businessDetail object or NULL on error Send a request to a UDDI server to get the business details. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_businessDetailExt // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREbusinessDetailExt @brief Represents a request to get business details from a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137719 */ /** @fn uddi2__get_USCOREbusinessDetailExt::uddi2__get_USCOREbusinessDetailExt(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREbusinessDetailExt class. */ /** @fn uddi2__get_USCOREbusinessDetailExt::uddi2__get_USCOREbusinessDetailExt(struct soap *soap, const char *businessKey) @brief @param[in] soap gSOAP context @param[in] businessKey string Creates an instance of the get_USCOREbusinessDetailExt class using the specified business key. */ /** @fn uddi2__get_USCOREbusinessDetailExt::uddi2__get_USCOREbusinessDetailExt(struct soap *soap, std::vector businessKeys) @brief @param[in] soap gSOAP context @param[in] businessKeys collection of key strings Creates an instance of the get_USCOREbusinessDetailExt class using the specified collection of business keys. */ /** @fn uddi2__businessDetailExt* uddi2__get_USCOREbusinessDetailExt::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__businessDetailExt object or NULL on error Send a request to a UDDI server to get the business details. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_serviceDetail // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREserviceDetail @brief Represents a request to get service details from a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137720 */ /** @fn uddi2__get_USCOREserviceDetail::uddi2__get_USCOREserviceDetail(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREserviceDetail class. */ /** @fn uddi2__get_USCOREserviceDetail::uddi2__get_USCOREserviceDetail(struct soap *soap, const char *serviceKey) @brief @param[in] soap gSOAP context @param[in] serviceKey string Creates an instance of the get_USCOREserviceDetail class using the specified service key. */ /** @fn uddi2__get_USCOREserviceDetail::uddi2__get_USCOREserviceDetail(struct soap *soap, std::vector serviceKeys) @brief @param[in] soap gSOAP context @param[in] serviceKeys collection of key strings Creates an instance of the get_USCOREserviceDetail class using the specified collection of service keys. */ /** @fn uddi2__serviceDetail* uddi2__get_USCOREserviceDetail::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__serviceDetail object or NULL on error Send a request to a UDDI server to get the service details. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_tModelDetail // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREtModelDetail @brief Represents a request to get tModel details from a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137721 */ /** @fn uddi2__get_USCOREtModelDetail::uddi2__get_USCOREtModelDetail(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREtModelDetail class. */ /** @fn uddi2__get_USCOREtModelDetail::uddi2__get_USCOREtModelDetail(struct soap *soap, const char *tModelKey) @brief @param[in] soap gSOAP context @param[in] tModelKey string Creates an instance of the get_USCOREtModelDetail class using the specified tModel key. */ /** @fn uddi2__get_USCOREtModelDetail::uddi2__get_USCOREtModelDetail(struct soap *soap, std::vector tModelKeys) @brief @param[in] soap gSOAP context @param[in] tModelKeys collection of key strings Creates an instance of the get_USCOREtModelDetail class using the specified collection of tModel keys. */ /** @fn uddi2__tModelDetail* uddi2__get_USCOREtModelDetail::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__tModelDetail object or NULL on error Send a request to a UDDI server to get the tModel details. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:add_publisherAssertions // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__add_USCOREpublisherAssertions @brief Represents a request to add one or more publisher assertions to the assertion collection for an individual publisher. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137731 */ /** @fn uddi2__add_USCOREpublisherAssertions::uddi2__add_USCOREpublisherAssertions(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the add_USCOREpublisherAssertions class. */ /** @fn uddi2__add_USCOREpublisherAssertions::uddi2__add_USCOREpublisherAssertions(struct soap *soap, std::vector publisherAssertions) @brief @param[in] soap gSOAP context @param[in] publisherAssertions collection of publisher assertions Creates an instance of the add_USCOREpublisherAssertions class using the specified publisher assertions. */ /** @fn uddi2__dispositionReport *uddi2__add_USCOREpublisherAssertions::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__dispositionReport object or NULL on error Send a request to a UDDI server to add one or more publisher assertions to the assertion collection for an individual publisher. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:delete_binding // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__delete_USCOREbinding @brief Represents a request to delete a binding that meets the specified requirements. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137732 */ /** @fn uddi2__delete_USCOREbinding::uddi2__delete_USCOREbinding(struct soap *soap) @brief Creates an instance of the delete_USCOREbinding class. */ /** @fn uddi2__delete_USCOREbinding::uddi2__delete_USCOREbinding(struct soap *soap, const char *bindingKey) @brief @param[in] soap gSOAP context @param[in] bindingKey a binding key string Creates an instance of the delete_USCOREbinding class. */ /** @fn uddi2__delete_USCOREbinding::uddi2__delete_USCOREbinding(struct soap *soap, std::vector bindingKeys) @brief @param[in] soap gSOAP context @param[in] bindingKeys collection of binding keys Creates an instance of the delete_USCOREbinding class using the specified binding keys. */ /** @fn uddi2__dispositionReport *uddi2__delete_USCOREbinding::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__dispositionReport object or NULL on error Send a request to a UDDI service to delete a binding that meets the specified requirements. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:delete_business // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__delete_USCOREbusiness @brief Represents a request to delete a business that meets the specified requirements. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137733 */ /** @fn uddi2__delete_USCOREbusiness::uddi2__delete_USCOREbusiness(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the delete_USCOREbusiness class. */ /** @fn uddi2__delete_USCOREbusiness::uddi2__delete_USCOREbusiness(struct soap *soap, const char *businessKey) @brief @param[in] soap gSOAP context @param[in] businessKey a business key string Creates an instance of the delete_USCOREbusiness class using the specified business key. */ /** @fn uddi2__delete_USCOREbusiness::uddi2__delete_USCOREbusiness(struct soap *soap, std::vector businessKeys) @brief @param[in] soap gSOAP context @param[in] businessKeys collection of business keys Creates an instance of the delete_USCOREbusiness class using the specified business keys. */ /** @fn uddi2__dispositionReport *uddi2__delete_USCOREbusiness::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__dispositionReport object or NULL on error Send a request to a UDDI service to delete a business that meets the specified requirements. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:delete_service // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__delete_USCOREservice @brief Represents a request to delete a service that meets the specified requirements. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137735 */ /** @fn uddi2__delete_USCOREservice::uddi2__delete_USCOREservice(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the delete_USCOREservice class. */ /** @fn uddi2__delete_USCOREservice::uddi2__delete_USCOREservice(struct soap *soap, const char *serviceKey) @brief @param[in] soap gSOAP context @param[in] serviceKey a service key string Creates an instance of the delete_USCOREservice class using the specified service key. */ /** @fn uddi2__delete_USCOREservice::uddi2__delete_USCOREservice(struct soap *soap, std::vector serviceKeys) @brief @param[in] soap gSOAP context @param[in] serviceKeys collection of service keys Creates an instance of the delete_USCOREservice class using the specified service keys. */ /** @fn uddi2__dispositionReport *uddi2__delete_USCOREservice::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__dispositionReport object or NULL on error Send a request to a UDDI service to delete a service that meets the specified requirements. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:delete_tModel // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__delete_USCOREtModel @brief Represents a request to delete a tModel that meets the specified requirements. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137736 */ /** @fn uddi2__delete_USCOREtModel::uddi2__delete_USCOREtModel(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the delete_USCOREtModel class. */ /** @fn uddi2__delete_USCOREtModel::uddi2__delete_USCOREtModel(struct soap *soap, const char *tModelKey) @brief @param[in] soap gSOAP context @param[in] tModelKey a tModel key string Creates an instance of the delete_USCOREtModel class using the specified tModel key. */ /** @fn uddi2__delete_USCOREtModel::uddi2__delete_USCOREtModel(struct soap *soap, std::vector tModelKeys) @brief @param[in] soap gSOAP context @param[in] tModelKeys collection of tModel keys Creates an instance of the delete_USCOREtModel class using the specified tModel keys. */ /** @fn uddi2__dispositionReport *uddi2__delete_USCOREtModel::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__dispositionReport object or NULL on error Send a request to a UDDI service to delete a tModel that meets the specified requirements. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:delete_publisherAssertions // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__delete_USCOREpublisherAssertions @brief Represents a request to delete publisher assertions meeting the specified requirements. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137734 */ /** @fn uddi2__delete_USCOREpublisherAssertions::uddi2__delete_USCOREpublisherAssertions(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the delete_USCOREpublisherAssertions class. */ /** @fn uddi2__delete_USCOREpublisherAssertions::uddi2__delete_USCOREpublisherAssertions(struct soap *soap, std::vector publisherAssertions) @brief @param[in] soap gSOAP context @param[in] publisherAssertions a collection of publisher assertions Creates an instance of the delete_USCOREpublisherAssertions class using the specified collection of publisher assertions. */ /** @fn uddi2__dispositionReport *uddi2__delete_USCOREpublisherAssertions::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__dispositionReport object or NULL on error Send a request to a UDDI service to delete publisher assertions meeting the specified requirements. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:discard_authToken // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__discard_USCOREauthToken @brief Represents a request to discard an authorization token obtained with the get_USCOREauthToken class. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137737 */ /** @fn uddi2__discard_USCOREauthToken::uddi2__discard_USCOREauthToken(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the delete_USCOREauthToken class. */ /** @fn uddi2__discard_USCOREauthToken::uddi2__discard_USCOREauthToken(struct soap *soap, const char *authInfo) @brief @param[in] soap gSOAP context @param[in] authInfo authorization token provided by the UDDI server Creates an instance of the delete_USCOREauthToken class using the specified authentication token string. */ /** @fn uddi2__dispositionReport *uddi2__discard_USCOREauthToken::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__dispositionReport object or NULL on error Send a request to a UDDI service to discard an authentication token. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_assertionStatusReport // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREassertionStatusReport @brief Provides the ability to determine the status of current and outstanding publisher assertions. The results can be restricted by setting the completionStatus property. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137738 */ /** @fn uddi2__get_USCOREassertionStatusReport::uddi2__get_USCOREassertionStatusReport(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREassertionStatusReport class. */ /** @fn uddi2__get_USCOREassertionStatusReport::uddi2__get_USCOREassertionStatusReport(struct soap *soap, const char *completionStatus) @brief @param[in] soap gSOAP context @param[in] completionStatus completion status string Creates an instance of the get_USCOREassertionStatusReport class using the specified completion status. */ /** @fn uddi2__assertionStatusReport *uddi2__get_USCOREassertionStatusReport::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__assertionStatusReport object or NULL on error Send a request to a UDDI service to get the status of current and outstanding publisher assertions. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_authToken // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREauthToken @brief Represents a request to obtain an authorization token, which is represented by the uddi2__authToken class. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137739 */ /** @fn uddi2__get_USCOREauthToken::uddi2__get_USCOREauthToken(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREauthToken class. */ /** @fn uddi2__get_USCOREauthToken::uddi2__get_USCOREauthToken(struct soap *soap, const char *userid, const char *passwd) @brief @param[in] soap gSOAP context @param[in] userid the user ID string @param[in] passwd the password string Creates an instance of the get_USCOREauthToken class using the specified user ID and password. */ /** @fn uddi2__authToken *uddi2__get_USCOREauthToken::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__authToken object or NULL on error Send a request to a UDDI service to get a authorization token given a user ID and password. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_publisherAssertions // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREpublisherAssertions @brief Represents a request to obtain the full set of publisher assertions that are associated with an individual publisher. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137740 */ /** @fn uddi2__get_USCOREpublisherAssertions::uddi2__get_USCOREpublisherAssertions(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREpublisherAssetions class. */ /** @fn uddi2__publisherAssertions *uddi2__get_USCOREpublisherAssertions::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__publisherAssertions object or NULL on error Send a request to a UDDI service to get publisher assertions. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_registeredInfo // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREregisteredInfo @brief Represents a request to get all registered business entities and tModels controlled by an individual. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137741 */ /** @fn uddi2__get_USCOREregisteredInfo::uddi2__get_USCOREregisteredInfo(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREregisteredInfo class. */ /** @fn uddi2__registeredInfo *uddi2__get_USCOREregisteredInfo::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__registeredInfo object or NULL on error Send a request to a UDDI service to get all registered business entities and tModels controlled by an individual. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:save_binding // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__save_USCOREbinding @brief Represents a request to post binding information on a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137742 */ /** @fn uddi2__save_USCOREbinding::uddi2__save_USCOREbinding(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the save_USCOREbinding class. */ /** @fn uddi2__save_USCOREbinding::uddi2__save_USCOREbinding(struct soap *soap, uddi2__bindingTemplate &bindingTemplate) @brief @param[in] soap gSOAP context @param[in] bindingTemplate binding template Creates an instance of the save_USCOREbinding class using the specified binding template. */ /** @fn uddi2__save_USCOREbinding::uddi2__save_USCOREbinding(struct soap *soap, std::vector bindingTemplates) @brief @param[in] soap gSOAP context @param[in] bindingTemplates collection of binding templates Creates an instance of the save_USCOREbinding class using the specified binding templates. */ /** @fn uddi2__bindingDetail *uddi2__save_USCOREbinding::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__bindingDetail object or NULL on error Send a request to a UDDI server to post binding information on the server. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:save_business // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__save_USCOREbusiness @brief Represents a request to post business information on a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137743 */ /** @fn uddi2__save_USCOREbusiness::uddi2__save_USCOREbusiness(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the save_USCOREbusiness class. */ /** @fn uddi2__save_USCOREbusiness::uddi2__save_USCOREbusiness(struct soap *soap, uddi2__businessEntity &businessEntity) @brief @param[in] soap gSOAP context @param[in] businessEntity business entity Creates an instance of the save_USCOREbusiness class using the specified business entity. */ /** @fn uddi2__save_USCOREbusiness::uddi2__save_USCOREbusiness(struct soap *soap, std::vector businessEntities) @brief @param[in] soap gSOAP context @param[in] businessEntities collection of business entities Creates an instance of the save_USCOREbusiness class using the specified business entities. */ /** @fn uddi2__businessDetail *uddi2__save_USCOREbusiness::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__businessDetail object or NULL on error Send a request to a UDDI server to post business information on the server. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:save_service // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__save_USCOREservice @brief Represents a request to post service information on a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137744 */ /** @fn uddi2__save_USCOREservice::uddi2__save_USCOREservice(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the save_USCOREservice class. */ /** @fn uddi2__save_USCOREservice::uddi2__save_USCOREservice(struct soap *soap, uddi2__businessService &businessService) @brief @param[in] soap gSOAP context @param[in] businessService business service Creates an instance of the save_USCOREservice class using the specified service. */ /** @fn uddi2__save_USCOREservice::uddi2__save_USCOREservice(struct soap *soap, std::vector businessServices) @brief @param[in] soap gSOAP context @param[in] businessServices collection of business services Creates an instance of the save_USCOREservice class using the specified services. */ /** @fn uddi2__serviceDetail *uddi2__save_USCOREservice::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__serviceDetail object or NULL on error Send a request to a UDDI server to post service information on the server. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:save_tModel // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__save_USCOREtModel @brief Represents a request to post tModel information on a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137745 */ /** @fn uddi2__save_USCOREtModel::uddi2__save_USCOREtModel(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the save_USCOREtModel class. */ /** @fn uddi2__save_USCOREtModel::uddi2__save_USCOREtModel(struct soap *soap, uddi2__tModel &tModel) @brief @param[in] soap gSOAP context @param[in] tModel a tModel Creates an instance of the save_USCOREtModel class using the specified tModel. */ /** @fn uddi2__save_USCOREtModel::uddi2__save_USCOREtModel(struct soap *soap, std::vector tModels) @brief @param[in] soap gSOAP context @param[in] tModels collection of tModels Creates an instance of the save_USCOREtModel class using the specified tModels. */ /** @fn uddi2__tModelDetail *uddi2__save_USCOREtModel::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__tModelDetail object or NULL on error Send a request to a UDDI server to post tModel information on the server. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:set_publisherAssertions // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__set_USCOREpublisherAssertions @brief Represents a request to modify the existing publisher assertions for an individual publisher. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137746 */ /** @fn uddi2__set_USCOREpublisherAssertions::uddi2__set_USCOREpublisherAssertions(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the set_USCOREpublisherAssertions class. */ /** @fn uddi2__set_USCOREpublisherAssertions::uddi2__set_USCOREpublisherAssertions(struct soap *soap, std::vector publisherAssertions) @brief @param[in] soap gSOAP context @param[in] publisherAssertions collection of publisher assertions Creates an instance of the set_USCOREpublisherAssertions class using the specified collection of publisher assertions. */ /** @fn uddi2__publisherAssertions *uddi2__set_USCOREpublisherAssertions::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__publisherAssertions object or NULL on error Send a request to a UDDI server to post tModel information on the server. */ //////////////////////////////////////////////////////////////////////////////// // // Code Examples // //////////////////////////////////////////////////////////////////////////////// /** @page example1 Code Example 1: Finding a service This example shows you how to find Web services. In this case, the example finds Web services with names that begin with the word "magic". @code #include "inqH.h" int main(int argc, char **argv) { char *search_string = "magic"; if (argc > 1) search_string = argv[1]; // Create a gSOAP context struct soap *soap = soap_new(); // Create an object to find a business uddi2__find_USCOREservice fs(soap, search_string); // Send the request uddi2__serviceList *sl = fs.send("http://uddi.xmethods.net/inquire"); // Check if result is OK if (!sl) soap_print_fault(soap, stderr); // If OK, report the service name(s) and unique identification keys else if (sl->serviceInfos) { std::cout << "Search results on " << search_string << ":" << std::endl << std::endl; for (std::vector::const_iterator si = sl->serviceInfos->serviceInfo.begin(); si != sl->serviceInfos->serviceInfo.end(); ++si) { // Report serviceKey and businessKey std::cout << "serviceKey=" << (*si)->serviceKey << std::endl << "businessKey=" << (*si)->businessKey << std::endl; // Report names for (std::vector::const_iterator n = (*si)->name.begin(); n != (*si)->name.end(); ++n) std::cout << "name=" << (*n)->__item << std::endl; std::cout << std::endl; } } // Remove deserialized objects soap_destroy(soap); // Remove temporary data soap_end(soap); // Detach and free context soap_done(soap); free(soap); return 0; } @endcode To compile: - wsdl2h -tuddi2-typemap.dat inquire_v2.wsdl - soapcpp2 -I.. -pinq inquire_v2.h - g++ -DWITH_NONAMESPACES -I.. -o example1 example1.cpp inquire_v2.cpp inqC.cpp inqClient.cpp ../stdsoap2.cpp */ /** @page example2 Code Example 2: Finding a business This example shows you how to find a business from a UDDI server. @code #include "inqH.h" int main(int argc, char **argv) { char *search_string = "xmethods"; if (argc > 1) search_string = argv[1]; // Create a gSOAP context struct soap *soap = soap_new(); // Create an object to find a business uddi2__find_USCOREbusiness fb(soap, search_string); // Send the request uddi2__businessList *bl = fb.send("http://uddi.xmethods.net/inquire"); // Check if result is OK if (!bl) soap_print_fault(soap, stderr); // If OK, report the business name(s) and unique identification keys else if (bl->businessInfos) { std::cout << "Search results on " << search_string << ":" << std::endl << std::endl; for (std::vector::const_iterator bi = bl->businessInfos->businessInfo.begin(); bi != bl->businessInfos->businessInfo.end(); ++bi) { // Report businessKey std::cout << "businessKey=" << (*bi)->businessKey << std::endl; // Report names for (std::vector::const_iterator n = (*bi)->name.begin(); n != (*bi)->name.end(); ++n) std::cout << "name=" << (*n)->__item << std::endl; std::cout << std::endl; } } // Remove deserialized objects soap_destroy(soap); // Remove temporary data soap_end(soap); // Detach and free context soap_done(soap); free(soap); return 0; } @endcode To compile: - wsdl2h -tuddi2-typemap.dat inquire_v2.wsdl - soapcpp2 -I.. -pinq inquire_v2.h - g++ -DWITH_NONAMESPACES -I.. -o example2 example2.cpp inquire_v2.cpp inqC.cpp inqClient.cpp ../stdsoap2.cpp */ /** @page example3 Code Example 3: Publishing a WSDL and service on XMethods This example shows you how to publish a Web service. In this case, the example template code obtains an authorization token, saves the tModel with the WSDL URL in the server, and saves the business service information in the server. @code #include "pubH.h" const char *server = "https://uddi.xmethods.net/publish"; const char *userid = "..."; // user ID to access UDDI server const char *passwd = "..."; // password to access UDDI server int main(int argc, char **argv) { // Create a gSOAP context struct soap *soap = soap_new(); // Setup SSL context (optional) to verify server's credentials if (soap_ssl_client_context(soap, SOAP_SSL_DEFAULT, NULL, NULL, "cacerts.pem", NULL, NULL)) { soap_print_fault(soap, stderr); exit(1); } // Step 1: Get an authorization token from the UDDI server uddi2__get_USCOREauthToken get_authToken(soap, userid, passwd); uddi2__authToken *authToken = get_authToken.send(server); // Check if authorized if (!authToken) { soap_print_fault(soap, stderr); exit(1); } // Authorization info provided by server for this session char *authInfo = authToken->authInfo; // Step 2: Create a tModel for the WSDL to be published uddi2__tModel tModel; tModel.soap_default(soap); // Create the tModel and service name tModel.name = soap_new_uddi2__name(soap, -1); tModel.name->__item = "..."; tModel.name->xml__lang_ = "en"; // Create XMethods description elements (see http://www.xmethods.net/ve2/UDDI.po) uddi2__description *description = soap_new_uddi2__description(soap, 6); description[0].__item = "SHORT DESCRIPTION: ..."; description[0].xml__lang_ = "en"; description[1].__item = "SHORT DESCRIPTION: ..."; description[1].xml__lang_ = "en"; description[2].__item = "USAGE NOTES: ..."; description[2].xml__lang_ = "en"; description[3].__item = "HOMEPAGE URL: ..."; description[3].xml__lang_ = "en"; description[4].__item = "CONTACT EMAIL: ..."; description[4].xml__lang_ = "en"; description[5].__item = "IMPLEMENTATION: ..."; description[5].xml__lang_ = "en"; // Add the four description elements to the tModel tModel.description.push_back(description + 0); tModel.description.push_back(description + 1); tModel.description.push_back(description + 2); tModel.description.push_back(description + 4); // Add an overviewDoc element with description and overviewURL tModel.overviewDoc = soap_new_uddi2__overviewDoc(soap, -1); tModel.overviewDoc->soap_default(soap); tModel.overviewDoc->description.push_back(soap_new_uddi2__description(soap, -1)); tModel.overviewDoc->description[0]->__item = "WSDL source document"; tModel.overviewDoc->description[0]->xml__lang_ = "en"; tModel.overviewDoc->overviewURL = "http://.../my.wsdl#bindingName"; // Omit identifier bag tModel.identifierBag = NULL; // Add a category with a WSDL-specific keyedReference tModel.categoryBag = soap_new_uddi2__categoryBag(soap, -1); tModel.categoryBag->soap_default(soap); tModel.categoryBag->keyedReference.push_back(soap_new_uddi2__keyedReference(soap, -1)); tModel.categoryBag->keyedReference[0]->tModelKey = "..."; tModel.categoryBag->keyedReference[0]->keyName = "uddi-org:types"; tModel.categoryBag->keyedReference[0]->keyValue = "wsdlSpec"; tModel.authorizedName = "..."; tModel.operator_ = "..."; tModel.tModelKey = "..."; // Save the tModel uddi2__save_USCOREtModel save_tModel(soap, tModel); uddi2__tModelDetail *tModelDetail = save_tModel.send(server, authInfo); // Step 3: Create a new service to be published uddi2__businessService service; service.soap_default(soap); // Service name is the tModel name (XMethods) service.name.push_back(tModel.name); // Add two description elements to the service service.description.push_back(description + 4); service.description.push_back(description + 5); // Create binding template uddi2__bindingTemplate bindingTemplate; bindingTemplate.soap_default(soap); bindingTemplate.tModelInstanceDetails = soap_new_uddi2__tModelInstanceDetails(soap, -1); bindingTemplate.tModelInstanceDetails->tModelInstanceInfo.push_back(soap_new_uddi2__tModelInstanceInfo(soap, -1)); bindingTemplate.tModelInstanceDetails->tModelInstanceInfo[0]->instanceDetails = NULL; bindingTemplate.tModelInstanceDetails->tModelInstanceInfo[0]->tModelKey = tModel.tModelKey; bindingTemplate.accessPoint = soap_new_uddi2__accessPoint(soap, -1); bindingTemplate.accessPoint->__item = "..."; bindingTemplate.accessPoint->URLType = uddi2__URLType__http; bindingTemplate.hostingRedirector = NULL; bindingTemplate.serviceKey = "..."; bindingTemplate.bindingKey = "..."; // Add binding Template to service service.bindingTemplates = soap_new_uddi2__bindingTemplates(soap, -1); service.bindingTemplates->soap_default(soap); service.bindingTemplates->bindingTemplate.push_back(&bindingTemplate); service.categoryBag = NULL; service.serviceKey = "..."; service.businessKey = "..."; // Save the service uddi2__save_USCOREservice save_service(soap, service); uddi2__serviceDetail *serviceDetail = save_service.send(server, authInfo); // Step 4: Discard authorization token uddi2__discard_USCOREauthToken discard_authToken(soap, authInfo); uddi2__dispositionReport *dispositionReport = discard_authToken.send(server); // Remove deserialized objects soap_destroy(soap); // Remove temporary data soap_end(soap); // Detach and free context soap_done(soap); free(soap); return 0; } @endcode To compile: - wsdl2h -tuddi2-typemap.dat publish_v2.wsdl - soapcpp2 -I.. -ppub publish_v2.h - g++ -DWITH_OPENSSL -DWITH_NONAMESPACES -I.. -o example3 example3.cpp publish_v2.cpp pubC.cpp pubClient.cpp ../stdsoap2.cpp */ /* inquire_v2.h Generated by wsdl2h 1.2.0 from inquire_v2.wsdl and uddi2-typemap.dat 2005-04-24 00:29:41 GMT Copyright (C) 2001-2005 Robert van Engelen, Genivia Inc. All Rights Reserved. This part of the software is released under one of the following licenses: GPL or Genivia's license for commercial use. */ /* NOTE: - Compile this file with soapcpp2 to complete the code generation process. - Use wsdl2h option -l to view the software license terms. - Use wsdl2h options -c and -s to generate pure C code or C++ code without STL. - To build with STL, stlvector.h from the gSOAP distribution must be in the current directory. Or use soapcpp2 option -I with path to stlvector.h. - Use typemap.dat to control schema namespace bindings and type mappings. It is strongly recommended to customize the names of the namespace prefixes generated by wsdl2h. To do so, modify the prefix bindings in the Namespaces section below and add the modified lines to typemap.dat to rerun wsdl2h. - Use Doxygen (www.doxygen.org) to browse this file. */ /******************************************************************************\ * * * urn:uddi-org:inquiry_v2 * * * \******************************************************************************/ /* WSDL Documentation: Copyright (c) 2000 - 2002 by Accenture, Ariba, Inc., Commerce One, Inc. Fujitsu Limited, Hewlett-Packard Company, i2 Technologies, Inc., Intel Corporation, International Business Machines Corporation, Microsoft Corporation, Oracle Corporation, SAP AG, Sun Microsystems, Inc., and VeriSign, Inc. All Rights Reserved. WSDL Service Interface for UDDI Inquiry API V2.0 This WSDL document defines the inquiry API calls for interacting with the UDDI registry. The complete UDDI API specification is available at http://www.uddi.org/specification.html. */ //gsoapopt w #import "stlvector.h" /******************************************************************************\ * * * Schema Namespaces * * * \******************************************************************************/ /* NOTE: It is strongly recommended to customize the names of the namespace prefixes generated by wsdl2h. To do so, modify the prefix bindings below and add the modified lines to typemap.dat to rerun wsdl2h: inq2 = "urn:uddi-org:inquiry_v2" uddi2 = urn:uddi-org:api_v2 */ //gsoap inq2 schema namespace: urn:uddi-org:inquiry_v2 //gsoap uddi2 schema namespace: urn:uddi-org:api_v2 //gsoap inq2 schema form: unqualified //gsoap uddi2 schema elementForm: qualified //gsoap uddi2 schema attributeForm: unqualified /******************************************************************************\ * * * Schema Types * * * \******************************************************************************/ /// Primitive built-in type "xs:NMTOKEN" typedef char* xsd__NMTOKEN; /// Built-in attribute "xml:lang" typedef char* xml__lang; class uddi2__accessPoint; class uddi2__address; class uddi2__addressLine; class uddi2__assertionStatusItem; class uddi2__bindingTemplate; class uddi2__bindingTemplates; class uddi2__businessEntity; class uddi2__businessEntityExt; class uddi2__businessInfo; class uddi2__businessInfos; class uddi2__businessService; class uddi2__businessServices; class uddi2__categoryBag; class uddi2__contact; class uddi2__contacts; class uddi2__description; class uddi2__discoveryURL; class uddi2__discoveryURLs; class uddi2__dispositionReport; class uddi2__email; class uddi2__errInfo; class uddi2__findQualifiers; class uddi2__hostingRedirector; class uddi2__identifierBag; class uddi2__instanceDetails; class uddi2__keyedReference; class uddi2__keysOwned; class uddi2__name; class uddi2__overviewDoc; class uddi2__phone; class uddi2__publisherAssertion; class uddi2__relatedBusinessInfo; class uddi2__relatedBusinessInfos; class uddi2__result; class uddi2__serviceInfo; class uddi2__serviceInfos; class uddi2__sharedRelationships; class uddi2__tModel; class uddi2__tModelBag; class uddi2__tModelInfo; class uddi2__tModelInfos; class uddi2__tModelInstanceDetails; class uddi2__tModelInstanceInfo; class uddi2__add_USCOREpublisherAssertions; class uddi2__delete_USCOREbinding; class uddi2__delete_USCOREbusiness; class uddi2__delete_USCOREpublisherAssertions; class uddi2__delete_USCOREservice; class uddi2__delete_USCOREtModel; class uddi2__discard_USCOREauthToken; class uddi2__find_USCOREbinding; class uddi2__find_USCOREbusiness; class uddi2__find_USCORErelatedBusinesses; class uddi2__find_USCOREservice; class uddi2__find_USCOREtModel; class uddi2__get_USCOREassertionStatusReport; class uddi2__get_USCOREauthToken; class uddi2__get_USCOREbindingDetail; class uddi2__get_USCOREbusinessDetail; class uddi2__get_USCOREbusinessDetailExt; class uddi2__get_USCOREpublisherAssertions; class uddi2__get_USCOREregisteredInfo; class uddi2__get_USCOREserviceDetail; class uddi2__get_USCOREtModelDetail; class uddi2__save_USCOREbinding; class uddi2__save_USCOREbusiness; class uddi2__save_USCOREservice; class uddi2__save_USCOREtModel; class uddi2__set_USCOREpublisherAssertions; class uddi2__validate_USCOREvalues; class uddi2__assertionStatusReport; class uddi2__authToken; class uddi2__bindingDetail; class uddi2__businessDetail; class uddi2__businessDetailExt; class uddi2__businessList; class uddi2__publisherAssertions; class uddi2__registeredInfo; class uddi2__relatedBusinessesList; class uddi2__serviceDetail; class uddi2__serviceList; class uddi2__tModelDetail; class uddi2__tModelList; /// Schema "urn:uddi-org:api_v2":bindingKey simpleType restriction of xs:string typedef char* uddi2__bindingKey; /// Schema "urn:uddi-org:api_v2":businessKey simpleType restriction of xs:string typedef char* uddi2__businessKey; /// Schema "urn:uddi-org:api_v2":serviceKey simpleType restriction of xs:string typedef char* uddi2__serviceKey; /// Schema "urn:uddi-org:api_v2":tModelKey simpleType restriction of xs:string typedef char* uddi2__tModelKey; /// Schema "urn:uddi-org:api_v2":direction simpleType restriction of xs:NMTOKEN /// Note: enum values are prefixed with 'uddi2__direction' to avoid name clashes, please use wsdl2h option -e to omit this prefix enum uddi2__direction { uddi2__direction__fromKey, ///< xs:NMTOKEN value="fromKey" uddi2__direction__toKey, ///< xs:NMTOKEN value="toKey" }; /// Schema "urn:uddi-org:api_v2":truncated simpleType restriction of xs:NMTOKEN /// Note: enum values are prefixed with 'uddi2__truncated' to avoid name clashes, please use wsdl2h option -e to omit this prefix enum uddi2__truncated { uddi2__truncated__true_, ///< xs:NMTOKEN value="true" uddi2__truncated__false_, ///< xs:NMTOKEN value="false" }; /// Schema "urn:uddi-org:api_v2":URLType simpleType restriction of xs:NMTOKEN /// Note: enum values are prefixed with 'uddi2__URLType' to avoid name clashes, please use wsdl2h option -e to omit this prefix enum uddi2__URLType { uddi2__URLType__mailto, ///< xs:NMTOKEN value="mailto" uddi2__URLType__http, ///< xs:NMTOKEN value="http" uddi2__URLType__https, ///< xs:NMTOKEN value="https" uddi2__URLType__ftp, ///< xs:NMTOKEN value="ftp" uddi2__URLType__fax, ///< xs:NMTOKEN value="fax" uddi2__URLType__phone, ///< xs:NMTOKEN value="phone" uddi2__URLType__other, ///< xs:NMTOKEN value="other" }; /// Schema "urn:uddi-org:api_v2":keyType simpleType restriction of xs:NMTOKEN /// Note: enum values are prefixed with 'uddi2__keyType' to avoid name clashes, please use wsdl2h option -e to omit this prefix enum uddi2__keyType { uddi2__keyType__businessKey, ///< xs:NMTOKEN value="businessKey" uddi2__keyType__tModelKey, ///< xs:NMTOKEN value="tModelKey" uddi2__keyType__serviceKey, ///< xs:NMTOKEN value="serviceKey" uddi2__keyType__bindingKey, ///< xs:NMTOKEN value="bindingKey" }; /// Schema urn:uddi-org:api_v2:"address" class uddi2__address { public: /// Vector of uddi2__addressLine* with length 0..unbounded std::vector addressLine 0; /// Attribute useType of type xs:string @char* useType 0; ///< Optional attribute /// Attribute sortCode of type xs:string @char* sortCode 0; ///< Optional attribute /// Attribute tModelKey of type "urn:uddi-org:api_v2":tModelKey @uddi2__tModelKey tModelKey 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"assertionStatusItem" class uddi2__assertionStatusItem { public: /// Element reference "urn:uddi-org:api_v2":fromKey uddi2__businessKey fromKey 1; ///< Required element /// Element reference "urn:uddi-org:api_v2":toKey uddi2__businessKey toKey 1; ///< Required element /// Element reference "urn:uddi-org:api_v2":keyedReference uddi2__keyedReference* keyedReference 1; ///< Required element /// Element reference "urn:uddi-org:api_v2":keysOwned uddi2__keysOwned* keysOwned 1; ///< Required element /// Attribute completionStatus of type xs:string @char* completionStatus 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"bindingTemplate" class uddi2__bindingTemplate { public: /// Vector of uddi2__description* with length 0..unbounded std::vector description 0; /// Element reference "urn:uddi-org:api_v2":tModelInstanceDetails uddi2__tModelInstanceDetails* tModelInstanceDetails 1; ///< Required element // CHOICE OF ELEMENTS: /// Element reference "urn:uddi-org:api_v2":accessPoint uddi2__accessPoint* accessPoint 1; ///< Required element /// Element reference "urn:uddi-org:api_v2":hostingRedirector uddi2__hostingRedirector* hostingRedirector 1; ///< Required element // END CHOICE /// Attribute serviceKey of type "urn:uddi-org:api_v2":serviceKey @uddi2__serviceKey serviceKey 0; ///< Optional attribute /// Attribute bindingKey of type "urn:uddi-org:api_v2":bindingKey @uddi2__bindingKey bindingKey 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"bindingTemplates" class uddi2__bindingTemplates { public: /// Vector of uddi2__bindingTemplate* with length 0..unbounded std::vector bindingTemplate 0; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"businessEntity" class uddi2__businessEntity { public: /// Element reference "urn:uddi-org:api_v2":discoveryURLs uddi2__discoveryURLs* discoveryURLs 0; ///< Optional element /// Vector of uddi2__name* with length 0..unbounded std::vector name 1; /// Vector of uddi2__description* with length 0..unbounded std::vector description 0; /// Element reference "urn:uddi-org:api_v2":contacts uddi2__contacts* contacts 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":businessServices uddi2__businessServices* businessServices 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":identifierBag uddi2__identifierBag* identifierBag 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":categoryBag uddi2__categoryBag* categoryBag 0; ///< Optional element /// Attribute businessKey of type "urn:uddi-org:api_v2":businessKey @uddi2__businessKey businessKey 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 0; ///< Optional attribute /// Attribute authorizedName of type xs:string @char* authorizedName 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"businessEntityExt" class uddi2__businessEntityExt { public: /// Element reference "urn:uddi-org:api_v2":businessEntity uddi2__businessEntity* businessEntity 1; ///< Required element // TODO: // Schema extensibility is user-definable // Consult the protocol documentation to insert declarations here: _XML __any ; ///< Catch any element content in XML string /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"businessInfo" class uddi2__businessInfo { public: /// Vector of uddi2__name* with length 0..unbounded std::vector name 1; /// Vector of uddi2__description* with length 0..unbounded std::vector description 0; /// Element reference "urn:uddi-org:api_v2":serviceInfos uddi2__serviceInfos* serviceInfos 1; ///< Required element /// Attribute businessKey of type "urn:uddi-org:api_v2":businessKey @uddi2__businessKey businessKey 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"businessInfos" class uddi2__businessInfos { public: /// Vector of uddi2__businessInfo* with length 0..unbounded std::vector businessInfo 0; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"businessService" class uddi2__businessService { public: /// Vector of uddi2__name* with length 0..unbounded std::vector name 0; /// Vector of uddi2__description* with length 0..unbounded std::vector description 0; /// Element reference "urn:uddi-org:api_v2":bindingTemplates uddi2__bindingTemplates* bindingTemplates 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":categoryBag uddi2__categoryBag* categoryBag 0; ///< Optional element /// Attribute serviceKey of type "urn:uddi-org:api_v2":serviceKey @uddi2__serviceKey serviceKey 1; ///< Required attribute /// Attribute businessKey of type "urn:uddi-org:api_v2":businessKey @uddi2__businessKey businessKey 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"businessServices" class uddi2__businessServices { public: /// Vector of uddi2__businessService* with length 0..unbounded std::vector businessService 0; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"categoryBag" class uddi2__categoryBag { public: /// Vector of uddi2__keyedReference* with length 0..unbounded std::vector keyedReference 1; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"contact" class uddi2__contact { public: /// Vector of uddi2__description* with length 0..unbounded std::vector description 0; /// Element reference "urn:uddi-org:api_v2":personName char* personName 1; ///< Required element /// Vector of uddi2__phone* with length 0..unbounded std::vector phone 0; /// Vector of uddi2__email* with length 0..unbounded std::vector email 0; /// Vector of uddi2__address* with length 0..unbounded std::vector address 0; /// Attribute useType of type xs:string @char* useType 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"contacts" class uddi2__contacts { public: /// Vector of uddi2__contact* with length 0..unbounded std::vector contact 1; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"discoveryURLs" class uddi2__discoveryURLs { public: /// Vector of uddi2__discoveryURL* with length 0..unbounded std::vector discoveryURL 1; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"dispositionReport" class uddi2__dispositionReport { public: /// Vector of uddi2__result* with length 0..unbounded std::vector result 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute truncated of type "urn:uddi-org:api_v2":truncated @enum uddi2__truncated* truncated 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"findQualifiers" class uddi2__findQualifiers { public: /// Vector of char* with length 0..unbounded std::vector findQualifier 0; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"hostingRedirector" class uddi2__hostingRedirector { public: /// Attribute bindingKey of type "urn:uddi-org:api_v2":bindingKey @uddi2__bindingKey bindingKey 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"identifierBag" class uddi2__identifierBag { public: /// Vector of uddi2__keyedReference* with length 0..unbounded std::vector keyedReference 1; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"instanceDetails" class uddi2__instanceDetails { public: /// Vector of uddi2__description* with length 0..unbounded std::vector description 0; /// Element reference "urn:uddi-org:api_v2":overviewDoc uddi2__overviewDoc* overviewDoc 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":instanceParms char* instanceParms 0; ///< Optional element /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"keyedReference" class uddi2__keyedReference { public: /// Attribute tModelKey of type "urn:uddi-org:api_v2":tModelKey @uddi2__tModelKey tModelKey 0; ///< Optional attribute /// Attribute keyName of type xs:string @char* keyName 0; ///< Optional attribute /// Attribute keyValue of type xs:string @char* keyValue 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"keysOwned" class uddi2__keysOwned { public: /// Element reference "urn:uddi-org:api_v2":fromKey uddi2__businessKey fromKey 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":toKey uddi2__businessKey toKey 0; ///< Optional element /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"overviewDoc" class uddi2__overviewDoc { public: /// Vector of uddi2__description* with length 0..unbounded std::vector description 0; /// Element reference "urn:uddi-org:api_v2":overviewURL char* overviewURL 0; ///< Optional element /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"publisherAssertion" class uddi2__publisherAssertion { public: /// Element reference "urn:uddi-org:api_v2":fromKey uddi2__businessKey fromKey 1; ///< Required element /// Element reference "urn:uddi-org:api_v2":toKey uddi2__businessKey toKey 1; ///< Required element /// Element reference "urn:uddi-org:api_v2":keyedReference uddi2__keyedReference* keyedReference 1; ///< Required element /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"relatedBusinessInfo" class uddi2__relatedBusinessInfo { public: /// Element reference "urn:uddi-org:api_v2":businessKey uddi2__businessKey businessKey 1; ///< Required element /// Vector of uddi2__name* with length 0..unbounded std::vector name 1; /// Vector of uddi2__description* with length 0..unbounded std::vector description 0; /// Vector of uddi2__sharedRelationships* with length 0..2 std::vector sharedRelationships 1:2; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"relatedBusinessInfos" class uddi2__relatedBusinessInfos { public: /// Vector of uddi2__relatedBusinessInfo* with length 0..unbounded std::vector relatedBusinessInfo 0; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"result" class uddi2__result { public: /// Element reference "urn:uddi-org:api_v2":errInfo uddi2__errInfo* errInfo 0; ///< Optional element /// Attribute keyType of type "urn:uddi-org:api_v2":keyType @enum uddi2__keyType* keyType 0; ///< Optional attribute /// Attribute errno of type xs:int @int errno_ 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"serviceInfo" class uddi2__serviceInfo { public: /// Vector of uddi2__name* with length 0..unbounded std::vector name 0; /// Attribute serviceKey of type "urn:uddi-org:api_v2":serviceKey @uddi2__serviceKey serviceKey 1; ///< Required attribute /// Attribute businessKey of type "urn:uddi-org:api_v2":businessKey @uddi2__businessKey businessKey 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"serviceInfos" class uddi2__serviceInfos { public: /// Vector of uddi2__serviceInfo* with length 0..unbounded std::vector serviceInfo 0; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"sharedRelationships" class uddi2__sharedRelationships { public: /// Vector of uddi2__keyedReference* with length 0..unbounded std::vector keyedReference 1; /// Attribute direction of type "urn:uddi-org:api_v2":direction @enum uddi2__direction direction 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"tModel" class uddi2__tModel { public: /// Element reference "urn:uddi-org:api_v2":name uddi2__name* name 1; ///< Required element /// Vector of uddi2__description* with length 0..unbounded std::vector description 0; /// Element reference "urn:uddi-org:api_v2":overviewDoc uddi2__overviewDoc* overviewDoc 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":identifierBag uddi2__identifierBag* identifierBag 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":categoryBag uddi2__categoryBag* categoryBag 0; ///< Optional element /// Attribute tModelKey of type "urn:uddi-org:api_v2":tModelKey @uddi2__tModelKey tModelKey 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 0; ///< Optional attribute /// Attribute authorizedName of type xs:string @char* authorizedName 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"tModelBag" class uddi2__tModelBag { public: /// Vector of uddi2__tModelKey with length 0..unbounded std::vector tModelKey 1; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"tModelInfo" class uddi2__tModelInfo { public: /// Element reference "urn:uddi-org:api_v2":name uddi2__name* name 1; ///< Required element /// Attribute tModelKey of type "urn:uddi-org:api_v2":tModelKey @uddi2__tModelKey tModelKey 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"tModelInfos" class uddi2__tModelInfos { public: /// Vector of uddi2__tModelInfo* with length 0..unbounded std::vector tModelInfo 0; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"tModelInstanceDetails" class uddi2__tModelInstanceDetails { public: /// Vector of uddi2__tModelInstanceInfo* with length 0..unbounded std::vector tModelInstanceInfo 0; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"tModelInstanceInfo" class uddi2__tModelInstanceInfo { public: /// Vector of uddi2__description* with length 0..unbounded std::vector description 0; /// Element reference "urn:uddi-org:api_v2":instanceDetails uddi2__instanceDetails* instanceDetails 0; ///< Optional element /// Attribute tModelKey of type "urn:uddi-org:api_v2":tModelKey @uddi2__tModelKey tModelKey 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"add_publisherAssertions" class uddi2__add_USCOREpublisherAssertions { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Vector of uddi2__publisherAssertion* with length 0..unbounded std::vector publisherAssertion 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__add_USCOREpublisherAssertions(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__add_USCOREpublisherAssertions(struct soap*, std::vector publisherAssertions); /// Member declared in uddi2-typemap.dat uddi2__dispositionReport* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"delete_binding" class uddi2__delete_USCOREbinding { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Vector of uddi2__bindingKey with length 0..unbounded std::vector bindingKey 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREbinding(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREbinding(struct soap*, const char *bindingKey); /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREbinding(struct soap*, std::vector bindingKeys); /// Member declared in uddi2-typemap.dat uddi2__dispositionReport* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"delete_business" class uddi2__delete_USCOREbusiness { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Vector of uddi2__businessKey with length 0..unbounded std::vector businessKey 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREbusiness(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREbusiness(struct soap*, const char *businessKey); /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREbusiness(struct soap*, std::vector businessKeys); /// Member declared in uddi2-typemap.dat uddi2__dispositionReport* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"delete_publisherAssertions" class uddi2__delete_USCOREpublisherAssertions { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Vector of uddi2__publisherAssertion* with length 0..unbounded std::vector publisherAssertion 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREpublisherAssertions(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREpublisherAssertions(struct soap*, std::vector publisherAssertions); /// Member declared in uddi2-typemap.dat uddi2__dispositionReport* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"delete_service" class uddi2__delete_USCOREservice { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Vector of uddi2__serviceKey with length 0..unbounded std::vector serviceKey 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREservice(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREservice(struct soap*, const char *serviceKey); /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREservice(struct soap*, std::vector serviceKeys); /// Member declared in uddi2-typemap.dat uddi2__dispositionReport* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"delete_tModel" class uddi2__delete_USCOREtModel { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Vector of uddi2__tModelKey with length 0..unbounded std::vector tModelKey 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREtModel(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREtModel(struct soap*, const char *tModelKey); /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREtModel(struct soap*, std::vector tModelKeys); /// Member declared in uddi2-typemap.dat uddi2__dispositionReport* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"discard_authToken" class uddi2__discard_USCOREauthToken { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__discard_USCOREauthToken(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__discard_USCOREauthToken(struct soap*, const char *authInfo); /// Member declared in uddi2-typemap.dat uddi2__dispositionReport* send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"find_binding" class uddi2__find_USCOREbinding { public: /// Element reference "urn:uddi-org:api_v2":findQualifiers uddi2__findQualifiers* findQualifiers 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":tModelBag uddi2__tModelBag* tModelBag 1; ///< Required element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute maxRows of type xs:int @int* maxRows 0; ///< Optional attribute /// Attribute serviceKey of type "urn:uddi-org:api_v2":serviceKey @uddi2__serviceKey serviceKey 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__find_USCOREbinding(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__find_USCOREbinding(struct soap*, const char *tModelKey); /// Member declared in uddi2-typemap.dat uddi2__find_USCOREbinding(struct soap*, std::vector tModelKeys); /// Member declared in uddi2-typemap.dat uddi2__bindingDetail *send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"find_business" class uddi2__find_USCOREbusiness { public: /// Element reference "urn:uddi-org:api_v2":findQualifiers uddi2__findQualifiers* findQualifiers 0; ///< Optional element /// Vector of uddi2__name* with length 0..unbounded std::vector name 0; /// Element reference "urn:uddi-org:api_v2":identifierBag uddi2__identifierBag* identifierBag 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":categoryBag uddi2__categoryBag* categoryBag 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":tModelBag uddi2__tModelBag* tModelBag 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":discoveryURLs uddi2__discoveryURLs* discoveryURLs 0; ///< Optional element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute maxRows of type xs:int @int* maxRows 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__find_USCOREbusiness(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__find_USCOREbusiness(struct soap*, const char *name); /// Member declared in uddi2-typemap.dat uddi2__find_USCOREbusiness(struct soap*, std::vector tModelKeys); /// Member declared in uddi2-typemap.dat uddi2__find_USCOREbusiness(struct soap*, std::vector keyedReferences); /// Member declared in uddi2-typemap.dat uddi2__businessList *send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"find_relatedBusinesses" class uddi2__find_USCORErelatedBusinesses { public: /// Element reference "urn:uddi-org:api_v2":findQualifiers uddi2__findQualifiers* findQualifiers 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":businessKey uddi2__businessKey businessKey 1; ///< Required element /// Element reference "urn:uddi-org:api_v2":keyedReference uddi2__keyedReference* keyedReference 0; ///< Optional element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute maxRows of type xs:int @int* maxRows 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__find_USCORErelatedBusinesses(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__find_USCORErelatedBusinesses(struct soap*, const char *businessKey); /// Member declared in uddi2-typemap.dat uddi2__relatedBusinessesList *send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"find_service" class uddi2__find_USCOREservice { public: /// Element reference "urn:uddi-org:api_v2":findQualifiers uddi2__findQualifiers* findQualifiers 0; ///< Optional element /// Vector of uddi2__name* with length 0..unbounded std::vector name 0; /// Element reference "urn:uddi-org:api_v2":categoryBag uddi2__categoryBag* categoryBag 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":tModelBag uddi2__tModelBag* tModelBag 0; ///< Optional element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute maxRows of type xs:int @int* maxRows 0; ///< Optional attribute /// Attribute businessKey of type "urn:uddi-org:api_v2":businessKey @uddi2__businessKey businessKey 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__find_USCOREservice(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__find_USCOREservice(struct soap*, const char *name); /// Member declared in uddi2-typemap.dat uddi2__find_USCOREservice(struct soap*, std::vector tModelKeys); /// Member declared in uddi2-typemap.dat uddi2__find_USCOREservice(struct soap*, std::vector keyedReferences); /// Member declared in uddi2-typemap.dat uddi2__serviceList* send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"find_tModel" class uddi2__find_USCOREtModel { public: /// Element reference "urn:uddi-org:api_v2":findQualifiers uddi2__findQualifiers* findQualifiers 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":name uddi2__name* name 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":identifierBag uddi2__identifierBag* identifierBag 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":categoryBag uddi2__categoryBag* categoryBag 0; ///< Optional element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute maxRows of type xs:int @int* maxRows 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__find_USCOREtModel(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__find_USCOREtModel(struct soap*, const char *name); /// Member declared in uddi2-typemap.dat uddi2__find_USCOREtModel(struct soap*, std::vector keyedReferences); /// Member declared in uddi2-typemap.dat uddi2__tModelList* send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"get_assertionStatusReport" class uddi2__get_USCOREassertionStatusReport { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Element reference "urn:uddi-org:api_v2":completionStatus char* completionStatus 0; ///< Optional element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__get_USCOREassertionStatusReport(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREassertionStatusReport(struct soap*, const char *completionStatus); /// Member declared in uddi2-typemap.dat uddi2__assertionStatusReport* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"get_authToken" class uddi2__get_USCOREauthToken { public: /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute userID of type xs:string @char* userID 1; ///< Required attribute /// Attribute cred of type xs:string @char* cred 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__get_USCOREauthToken(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREauthToken(struct soap*, const char *userid, const char *passwd); /// Member declared in uddi2-typemap.dat uddi2__authToken* send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"get_bindingDetail" class uddi2__get_USCOREbindingDetail { public: /// Vector of uddi2__bindingKey with length 0..unbounded std::vector bindingKey 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__get_USCOREbindingDetail(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREbindingDetail(struct soap*, const char *bindingKey); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREbindingDetail(struct soap*, std::vector bindingKeys); /// Member declared in uddi2-typemap.dat uddi2__bindingDetail* send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"get_businessDetail" class uddi2__get_USCOREbusinessDetail { public: /// Vector of uddi2__businessKey with length 0..unbounded std::vector businessKey 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__get_USCOREbusinessDetail(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREbusinessDetail(struct soap*, const char *businessKey); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREbusinessDetail(struct soap*, std::vector businessKeys); /// Member declared in uddi2-typemap.dat uddi2__businessDetail* send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"get_businessDetailExt" class uddi2__get_USCOREbusinessDetailExt { public: /// Vector of uddi2__businessKey with length 0..unbounded std::vector businessKey 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__get_USCOREbusinessDetailExt(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREbusinessDetailExt(struct soap*, const char *businessKey); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREbusinessDetailExt(struct soap*, std::vector businessKeys); /// Member declared in uddi2-typemap.dat uddi2__businessDetailExt* send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"get_publisherAssertions" class uddi2__get_USCOREpublisherAssertions { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__get_USCOREpublisherAssertions(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__publisherAssertions* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"get_registeredInfo" class uddi2__get_USCOREregisteredInfo { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__get_USCOREregisteredInfo(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__registeredInfo* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"get_serviceDetail" class uddi2__get_USCOREserviceDetail { public: /// Vector of uddi2__serviceKey with length 0..unbounded std::vector serviceKey 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__get_USCOREserviceDetail(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREserviceDetail(struct soap*, const char *serviceKey); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREserviceDetail(struct soap*, std::vector serviceKeys); /// Member declared in uddi2-typemap.dat uddi2__serviceDetail* send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"get_tModelDetail" class uddi2__get_USCOREtModelDetail { public: /// Vector of uddi2__tModelKey with length 0..unbounded std::vector tModelKey 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__get_USCOREtModelDetail(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREtModelDetail(struct soap*, const char *tModelKey); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREtModelDetail(struct soap*, std::vector tModelKeys); /// Member declared in uddi2-typemap.dat uddi2__tModelDetail* send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"save_binding" class uddi2__save_USCOREbinding { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Vector of uddi2__bindingTemplate* with length 0..unbounded std::vector bindingTemplate 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__save_USCOREbinding(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__save_USCOREbinding(struct soap*, uddi2__bindingTemplate &bindingTemplate); /// Member declared in uddi2-typemap.dat uddi2__save_USCOREbinding(struct soap*, std::vector bindingTemplates); /// Member declared in uddi2-typemap.dat uddi2__bindingDetail* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"save_business" class uddi2__save_USCOREbusiness { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Vector of uddi2__businessEntity* with length 0..unbounded std::vector businessEntity 0; /// Vector of char* with length 0..unbounded std::vector uploadRegister 0; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__save_USCOREbusiness(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__save_USCOREbusiness(struct soap*, uddi2__businessEntity &businessEntity); /// Member declared in uddi2-typemap.dat uddi2__save_USCOREbusiness(struct soap*, std::vector businessEntities); /// Member declared in uddi2-typemap.dat uddi2__businessDetail* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"save_service" class uddi2__save_USCOREservice { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Vector of uddi2__businessService* with length 0..unbounded std::vector businessService 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__save_USCOREservice(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__save_USCOREservice(struct soap*, uddi2__businessService &businessService); /// Member declared in uddi2-typemap.dat uddi2__save_USCOREservice(struct soap*, std::vector businessServices); /// Member declared in uddi2-typemap.dat uddi2__serviceDetail* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"save_tModel" class uddi2__save_USCOREtModel { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Vector of uddi2__tModel* with length 0..unbounded std::vector tModel 0; /// Vector of char* with length 0..unbounded std::vector uploadRegister 0; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__save_USCOREtModel(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__save_USCOREtModel(struct soap*, uddi2__tModel &tModel); /// Member declared in uddi2-typemap.dat uddi2__save_USCOREtModel(struct soap*, std::vector tModels); /// Member declared in uddi2-typemap.dat uddi2__tModelDetail* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"set_publisherAssertions" class uddi2__set_USCOREpublisherAssertions { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Vector of uddi2__publisherAssertion* with length 0..unbounded std::vector publisherAssertion 0; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__set_USCOREpublisherAssertions(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__set_USCOREpublisherAssertions(struct soap*, std::vector publisherAssertions); /// Member declared in uddi2-typemap.dat uddi2__publisherAssertions* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"validate_values" class uddi2__validate_USCOREvalues { public: // CHOICE OF ELEMENTS: /// Vector of uddi2__businessEntity* with length 0..unbounded std::vector businessEntity 0; /// Vector of uddi2__businessService* with length 0..unbounded std::vector businessService 0; /// Vector of uddi2__tModel* with length 0..unbounded std::vector tModel 0; // END CHOICE /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"assertionStatusReport" class uddi2__assertionStatusReport { public: /// Vector of uddi2__assertionStatusItem* with length 0..unbounded std::vector assertionStatusItem 0; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"authToken" class uddi2__authToken { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"bindingDetail" class uddi2__bindingDetail { public: /// Vector of uddi2__bindingTemplate* with length 0..unbounded std::vector bindingTemplate 0; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute truncated of type "urn:uddi-org:api_v2":truncated @enum uddi2__truncated* truncated 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"businessDetail" class uddi2__businessDetail { public: /// Vector of uddi2__businessEntity* with length 0..unbounded std::vector businessEntity 0; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute truncated of type "urn:uddi-org:api_v2":truncated @enum uddi2__truncated* truncated 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"businessDetailExt" class uddi2__businessDetailExt { public: /// Vector of uddi2__businessEntityExt* with length 0..unbounded std::vector businessEntityExt 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute truncated of type "urn:uddi-org:api_v2":truncated @enum uddi2__truncated* truncated 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"businessList" class uddi2__businessList { public: /// Element reference "urn:uddi-org:api_v2":businessInfos uddi2__businessInfos* businessInfos 1; ///< Required element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute truncated of type "urn:uddi-org:api_v2":truncated @enum uddi2__truncated* truncated 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"publisherAssertions" class uddi2__publisherAssertions { public: /// Vector of uddi2__publisherAssertion* with length 0..unbounded std::vector publisherAssertion 0; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute authorizedName of type xs:string @char* authorizedName 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"registeredInfo" class uddi2__registeredInfo { public: /// Element reference "urn:uddi-org:api_v2":businessInfos uddi2__businessInfos* businessInfos 1; ///< Required element /// Element reference "urn:uddi-org:api_v2":tModelInfos uddi2__tModelInfos* tModelInfos 1; ///< Required element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute truncated of type "urn:uddi-org:api_v2":truncated @enum uddi2__truncated* truncated 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"relatedBusinessesList" class uddi2__relatedBusinessesList { public: /// Element reference "urn:uddi-org:api_v2":businessKey uddi2__businessKey businessKey 1; ///< Required element /// Element reference "urn:uddi-org:api_v2":relatedBusinessInfos uddi2__relatedBusinessInfos* relatedBusinessInfos 1; ///< Required element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute truncated of type "urn:uddi-org:api_v2":truncated @enum uddi2__truncated* truncated 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"serviceDetail" class uddi2__serviceDetail { public: /// Vector of uddi2__businessService* with length 0..unbounded std::vector businessService 0; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute truncated of type "urn:uddi-org:api_v2":truncated @enum uddi2__truncated* truncated 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"serviceList" class uddi2__serviceList { public: /// Element reference "urn:uddi-org:api_v2":serviceInfos uddi2__serviceInfos* serviceInfos 1; ///< Required element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute truncated of type "urn:uddi-org:api_v2":truncated @enum uddi2__truncated* truncated 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"tModelDetail" class uddi2__tModelDetail { public: /// Vector of uddi2__tModel* with length 0..unbounded std::vector tModel 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute truncated of type "urn:uddi-org:api_v2":truncated @enum uddi2__truncated* truncated 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"tModelList" class uddi2__tModelList { public: /// Element reference "urn:uddi-org:api_v2":tModelInfos uddi2__tModelInfos* tModelInfos 1; ///< Required element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute truncated of type "urn:uddi-org:api_v2":truncated @enum uddi2__truncated* truncated 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"accessPoint" class uddi2__accessPoint { public: char* __item ; /// Attribute URLType of type "urn:uddi-org:api_v2":URLType @enum uddi2__URLType URLType 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"addressLine" class uddi2__addressLine { public: char* __item ; /// Attribute keyName of type xs:string @char* keyName 0; ///< Optional attribute /// Attribute keyValue of type xs:string @char* keyValue 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"description" class uddi2__description { public: char* __item ; /// Attribute reference xml:lang @xml__lang xml__lang_ 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"discoveryURL" class uddi2__discoveryURL { public: char* __item ; /// Attribute useType of type xs:string @char* useType 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"email" class uddi2__email { public: char* __item ; /// Attribute useType of type xs:string @char* useType 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"errInfo" class uddi2__errInfo { public: char* __item ; /// Attribute errCode of type xs:string @char* errCode 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"name" class uddi2__name { public: char* __item ; /// Attribute reference xml:lang @xml__lang xml__lang_ 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"phone" class uddi2__phone { public: char* __item ; /// Attribute useType of type xs:string @char* useType 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /******************************************************************************\ * * * Services * * * \******************************************************************************/ //gsoap inq2 service name: InquireSoap //gsoap inq2 service type: Inquire //gsoap inq2 service namespace: urn:uddi-org:inquiry_v2 /** @mainpage UDDI_Inquiry_API_V2 Definitions @section UDDI_Inquiry_API_V2_documentation Documentation Copyright (c) 2000 - 2002 by Accenture, Ariba, Inc., Commerce One, Inc. Fujitsu Limited, Hewlett-Packard Company, i2 Technologies, Inc., Intel Corporation, International Business Machines Corporation, Microsoft Corporation, Oracle Corporation, SAP AG, Sun Microsystems, Inc., and VeriSign, Inc. All Rights Reserved. WSDL Service Interface for UDDI Inquiry API V2.0 This WSDL document defines the inquiry API calls for interacting with the UDDI registry. The complete UDDI API specification is available at http://www.uddi.org/specification.html. @section UDDI_Inquiry_API_V2_bindings Bindings - @ref InquireSoap */ /** @page InquireSoap Binding "InquireSoap" @section InquireSoap_operations Operations of Binding "InquireSoap" - @ref __inq2__find_USCOREbinding - @ref __inq2__find_USCOREbusiness - @ref __inq2__find_USCORErelatedBusinesses - @ref __inq2__find_USCOREservice - @ref __inq2__find_USCOREtModel - @ref __inq2__get_USCOREbindingDetail - @ref __inq2__get_USCOREbusinessDetail - @ref __inq2__get_USCOREbusinessDetailExt - @ref __inq2__get_USCOREserviceDetail - @ref __inq2__get_USCOREtModelDetail @section InquireSoap_ports Endpoints of Binding "InquireSoap" */ /******************************************************************************\ * * * SOAP Fault Detail * * * \******************************************************************************/ /// The SOAP Fault Detail element contains one of the following types serialized // in the __type and fault fields of the SOAP_ENV__Detail struct (see docs) class _dispositionReport { public: uddi2__dispositionReport* uddi2__dispositionReport_; struct soap *soap ; }; /******************************************************************************\ * * * InquireSoap * * * \******************************************************************************/ /******************************************************************************\ * * * __inq2__find_USCOREbinding * * * \******************************************************************************/ /// Operation "__inq2__find_USCOREbinding" of service binding "InquireSoap" /** Operation details: - SOAP document/literal style - SOAP action="find_binding" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___inq2__find_USCOREbinding(struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: uddi2__find_USCOREbinding* uddi2__find_USCOREbinding_, // response parameters: uddi2__bindingDetail* uddi2__bindingDetail_ ); @endcode C++ proxy class (defined in soapInquireSoapProxy.h): class InquireSoap; */ //gsoap inq2 service method-style: find_USCOREbinding document //gsoap inq2 service method-encoding: find_USCOREbinding literal //gsoap inq2 service method-action: find_USCOREbinding find_binding //gsoap inq2 service method-fault: find_USCOREbinding _dispositionReport int __inq2__find_USCOREbinding( uddi2__find_USCOREbinding* uddi2__find_USCOREbinding_, uddi2__bindingDetail* uddi2__bindingDetail_ ///< response parameter ); /******************************************************************************\ * * * __inq2__find_USCOREbusiness * * * \******************************************************************************/ /// Operation "__inq2__find_USCOREbusiness" of service binding "InquireSoap" /** Operation details: - SOAP document/literal style - SOAP action="find_business" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___inq2__find_USCOREbusiness(struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: uddi2__find_USCOREbusiness* uddi2__find_USCOREbusiness_, // response parameters: uddi2__businessList* uddi2__businessList_ ); @endcode C++ proxy class (defined in soapInquireSoapProxy.h): class InquireSoap; */ //gsoap inq2 service method-style: find_USCOREbusiness document //gsoap inq2 service method-encoding: find_USCOREbusiness literal //gsoap inq2 service method-action: find_USCOREbusiness find_business //gsoap inq2 service method-fault: find_USCOREbusiness _dispositionReport int __inq2__find_USCOREbusiness( uddi2__find_USCOREbusiness* uddi2__find_USCOREbusiness_, uddi2__businessList* uddi2__businessList_ ///< response parameter ); /******************************************************************************\ * * * __inq2__find_USCORErelatedBusinesses * * * \******************************************************************************/ /// Operation "__inq2__find_USCORErelatedBusinesses" of service binding "InquireSoap" /** Operation details: - SOAP document/literal style - SOAP action="find_relatedBusinesses" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___inq2__find_USCORErelatedBusinesses(struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: uddi2__find_USCORErelatedBusinesses* uddi2__find_USCORErelatedBusinesses_, // response parameters: uddi2__relatedBusinessesList* uddi2__relatedBusinessesList_ ); @endcode C++ proxy class (defined in soapInquireSoapProxy.h): class InquireSoap; */ //gsoap inq2 service method-style: find_USCORErelatedBusinesses document //gsoap inq2 service method-encoding: find_USCORErelatedBusinesses literal //gsoap inq2 service method-action: find_USCORErelatedBusinesses find_relatedBusinesses //gsoap inq2 service method-fault: find_USCORErelatedBusinesses _dispositionReport int __inq2__find_USCORErelatedBusinesses( uddi2__find_USCORErelatedBusinesses* uddi2__find_USCORErelatedBusinesses_, uddi2__relatedBusinessesList* uddi2__relatedBusinessesList_ ///< response parameter ); /******************************************************************************\ * * * __inq2__find_USCOREservice * * * \******************************************************************************/ /// Operation "__inq2__find_USCOREservice" of service binding "InquireSoap" /** Operation details: - SOAP document/literal style - SOAP action="find_service" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___inq2__find_USCOREservice(struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: uddi2__find_USCOREservice* uddi2__find_USCOREservice_, // response parameters: uddi2__serviceList* uddi2__serviceList_ ); @endcode C++ proxy class (defined in soapInquireSoapProxy.h): class InquireSoap; */ //gsoap inq2 service method-style: find_USCOREservice document //gsoap inq2 service method-encoding: find_USCOREservice literal //gsoap inq2 service method-action: find_USCOREservice find_service //gsoap inq2 service method-fault: find_USCOREservice _dispositionReport int __inq2__find_USCOREservice( uddi2__find_USCOREservice* uddi2__find_USCOREservice_, uddi2__serviceList* uddi2__serviceList_ ///< response parameter ); /******************************************************************************\ * * * __inq2__find_USCOREtModel * * * \******************************************************************************/ /// Operation "__inq2__find_USCOREtModel" of service binding "InquireSoap" /** Operation details: - SOAP document/literal style - SOAP action="find_tModel" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___inq2__find_USCOREtModel(struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: uddi2__find_USCOREtModel* uddi2__find_USCOREtModel_, // response parameters: uddi2__tModelList* uddi2__tModelList_ ); @endcode C++ proxy class (defined in soapInquireSoapProxy.h): class InquireSoap; */ //gsoap inq2 service method-style: find_USCOREtModel document //gsoap inq2 service method-encoding: find_USCOREtModel literal //gsoap inq2 service method-action: find_USCOREtModel find_tModel //gsoap inq2 service method-fault: find_USCOREtModel _dispositionReport int __inq2__find_USCOREtModel( uddi2__find_USCOREtModel* uddi2__find_USCOREtModel_, uddi2__tModelList* uddi2__tModelList_ ///< response parameter ); /******************************************************************************\ * * * __inq2__get_USCOREbindingDetail * * * \******************************************************************************/ /// Operation "__inq2__get_USCOREbindingDetail" of service binding "InquireSoap" /** Operation details: - SOAP document/literal style - SOAP action="get_bindingDetail" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___inq2__get_USCOREbindingDetail(struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: uddi2__get_USCOREbindingDetail* uddi2__get_USCOREbindingDetail_, // response parameters: uddi2__bindingDetail* uddi2__bindingDetail_ ); @endcode C++ proxy class (defined in soapInquireSoapProxy.h): class InquireSoap; */ //gsoap inq2 service method-style: get_USCOREbindingDetail document //gsoap inq2 service method-encoding: get_USCOREbindingDetail literal //gsoap inq2 service method-action: get_USCOREbindingDetail get_bindingDetail //gsoap inq2 service method-fault: get_USCOREbindingDetail _dispositionReport int __inq2__get_USCOREbindingDetail( uddi2__get_USCOREbindingDetail* uddi2__get_USCOREbindingDetail_, uddi2__bindingDetail* uddi2__bindingDetail_ ///< response parameter ); /******************************************************************************\ * * * __inq2__get_USCOREbusinessDetail * * * \******************************************************************************/ /// Operation "__inq2__get_USCOREbusinessDetail" of service binding "InquireSoap" /** Operation details: - SOAP document/literal style - SOAP action="get_businessDetail" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___inq2__get_USCOREbusinessDetail(struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: uddi2__get_USCOREbusinessDetail* uddi2__get_USCOREbusinessDetail_, // response parameters: uddi2__businessDetail* uddi2__businessDetail_ ); @endcode C++ proxy class (defined in soapInquireSoapProxy.h): class InquireSoap; */ //gsoap inq2 service method-style: get_USCOREbusinessDetail document //gsoap inq2 service method-encoding: get_USCOREbusinessDetail literal //gsoap inq2 service method-action: get_USCOREbusinessDetail get_businessDetail //gsoap inq2 service method-fault: get_USCOREbusinessDetail _dispositionReport int __inq2__get_USCOREbusinessDetail( uddi2__get_USCOREbusinessDetail* uddi2__get_USCOREbusinessDetail_, uddi2__businessDetail* uddi2__businessDetail_ ///< response parameter ); /******************************************************************************\ * * * __inq2__get_USCOREbusinessDetailExt * * * \******************************************************************************/ /// Operation "__inq2__get_USCOREbusinessDetailExt" of service binding "InquireSoap" /** Operation details: - SOAP document/literal style - SOAP action="get_businessDetailExt" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___inq2__get_USCOREbusinessDetailExt(struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: uddi2__get_USCOREbusinessDetailExt* uddi2__get_USCOREbusinessDetailExt_, // response parameters: uddi2__businessDetailExt* uddi2__businessDetailExt_ ); @endcode C++ proxy class (defined in soapInquireSoapProxy.h): class InquireSoap; */ //gsoap inq2 service method-style: get_USCOREbusinessDetailExt document //gsoap inq2 service method-encoding: get_USCOREbusinessDetailExt literal //gsoap inq2 service method-action: get_USCOREbusinessDetailExt get_businessDetailExt //gsoap inq2 service method-fault: get_USCOREbusinessDetailExt _dispositionReport int __inq2__get_USCOREbusinessDetailExt( uddi2__get_USCOREbusinessDetailExt* uddi2__get_USCOREbusinessDetailExt_, uddi2__businessDetailExt* uddi2__businessDetailExt_ ///< response parameter ); /******************************************************************************\ * * * __inq2__get_USCOREserviceDetail * * * \******************************************************************************/ /// Operation "__inq2__get_USCOREserviceDetail" of service binding "InquireSoap" /** Operation details: - SOAP document/literal style - SOAP action="get_serviceDetail" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___inq2__get_USCOREserviceDetail(struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: uddi2__get_USCOREserviceDetail* uddi2__get_USCOREserviceDetail_, // response parameters: uddi2__serviceDetail* uddi2__serviceDetail_ ); @endcode C++ proxy class (defined in soapInquireSoapProxy.h): class InquireSoap; */ //gsoap inq2 service method-style: get_USCOREserviceDetail document //gsoap inq2 service method-encoding: get_USCOREserviceDetail literal //gsoap inq2 service method-action: get_USCOREserviceDetail get_serviceDetail //gsoap inq2 service method-fault: get_USCOREserviceDetail _dispositionReport int __inq2__get_USCOREserviceDetail( uddi2__get_USCOREserviceDetail* uddi2__get_USCOREserviceDetail_, uddi2__serviceDetail* uddi2__serviceDetail_ ///< response parameter ); /******************************************************************************\ * * * __inq2__get_USCOREtModelDetail * * * \******************************************************************************/ /// Operation "__inq2__get_USCOREtModelDetail" of service binding "InquireSoap" /** Operation details: - SOAP document/literal style - SOAP action="get_tModelDetail" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___inq2__get_USCOREtModelDetail(struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: uddi2__get_USCOREtModelDetail* uddi2__get_USCOREtModelDetail_, // response parameters: uddi2__tModelDetail* uddi2__tModelDetail_ ); @endcode C++ proxy class (defined in soapInquireSoapProxy.h): class InquireSoap; */ //gsoap inq2 service method-style: get_USCOREtModelDetail document //gsoap inq2 service method-encoding: get_USCOREtModelDetail literal //gsoap inq2 service method-action: get_USCOREtModelDetail get_tModelDetail //gsoap inq2 service method-fault: get_USCOREtModelDetail _dispositionReport int __inq2__get_USCOREtModelDetail( uddi2__get_USCOREtModelDetail* uddi2__get_USCOREtModelDetail_, uddi2__tModelDetail* uddi2__tModelDetail_ ///< response parameter ); /* End of inquire_v2.h */ gsoap-2.8.28/gsoap/typemap.dat0000644000175000017500000004363512653650160015565 0ustar ellertellert# typemap.dat # Use this file to define namespace prefix and type bindings for # the generated header files by the 'wsdl2h' tool. typemap.dat is the # default file processed by 'wsdl2h' to customize its output. You can use # wsdl2h option -t to specify an alternate file. ####### XML NAMESPACE BINDINGS # XML namespace prefix bindings can be provided to override the default # choice of the ns1, ns2, ... prefixes generated by wsdl2h. It is highly # recommended to provide namespace prefixes for your project's XML # namespaces. In this way, changes to the WSDL (or newer releases of # wsdl2h) will have a minimal impact on coding. # Bindings for namespace prefixes are of the form: # prefix = "URI" ####### XSD TYPE BINDINGS # Type bindings can be provided to bind XML schema types to C/C++ # types for your project. # Type bindings are of the form: # prefix__type = declaration | use | ptr-use # where 'prefix__type' is the C/C++-translation of the schema type, # 'declaration' introduces the type in the header file, the optional # 'use' specifies how the type is used directly, and the optional # 'ptr-use' specifies how the type is used as a pointer type. # For example, to use wide stirngs in C: # xsd__string = | wchar_t* | wchar_t* # which replaced the default char* mapping in C of xsd:string. # To use C++ std::wstring for xsd:string: # xsd__string = | std::wstring # After enabling one of these lines, all XSD strings will be remapped. # Note that the 'declaration' part is empty in these case as expected. # # When a type binding requires only the usage to be changed and the # declaration part must be kept intact, then the declaration part can be # replaced by elipsis ..., as in: # prefix__type = ... | use | ptr-use # This ensure that the wsdl2h-generated type definition is preserved, # while the use and ptr-use are remapped. # For example, this is useful to map schema polymorphic types to C types, # where we need to be able to both handle a base type and its extensions # as per schema extensibility. Say base type ns:base allows derived # extensions and we need to map this to C types as follows: # ns__base = ... | int __type_base; void* # where __type_base and void* are used to (de)serialize any data type, # including base and its derived types. ####### CLASS/STRUCT MEMBER ADDITIONS # Additional data and function members can be provided to extend a # wsdl2h-generated struct or class. # Class and struct extensions are of the form: # prefix__type = $ member-declaration # For example, to add a constructor and destructor to class myns__record: # myns__record = $ myns__record(); # myns__record = $ ~myns__record(); ####### TYPE EQUIVALENCES # Type equivalence mappings can be given to map a type to another type: # prefix__type1 == prefix__type2 # which replaces 'prefix__type1' by 'prefix__type2' in the wsdl2h output. # For example: # SOAP_ENC__boolean == xsd__boolean # which replaces 'SOAP_ENC__boolean' with the C/C++ type information that # corresponds to `xsd__boolean' which is 'bool' for C++. # Target C/C++ type names (names without prefix) can also be replaced: # float == double # which replaces all 'float' with 'double' in the wsdl2h output. Beware # that replacement types may lead to xsi:type mismatches and SOAP # encoding id-ref mismatches when parsing inbound XML messages. ####### BUILT-IN VARIABLES # The variable '$CONTAINER' defines the container to emit in the # generated declarations, which is std::vector by default. # For example: # $CONTAINER = std::list # The variable '$POINTER' defines the smart pointer to emit in the # generated declarations, replacing '*'. For example: # $POINTER = std::shared_ptr # Not all pointers in the generated output can be replaced by smart # pointers when standard pointers are used as union members and pointers # to arrays. ####### USER-DEFINED CONTENT # Any other content to be included in the generated header file can be # provided by enclosing it within brackets [ and ]. These brackets MUST # appear at the start of a new line. # For example, to add an #import directive to the wsdl2h-generated output: # [ # #import "wsa5.h" # ] #------------------------------------------------------------------------------- #gSOAP XML Web services tools #Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc. All Rights Reserved. #This software is released under one of the following two licenses: #GPL or Genivia's license for commercial use. #------------------------------------------------------------------------------- #A commercial use license is available from Genivia, Inc., contact@genivia.com #------------------------------------------------------------------------------- [ // Reminder: Modify typemap.dat to customize the header file generated by wsdl2h ] # Remember: type bindings are given on a single line (use \ to continue # with the next line). Here is an example binding for the XSD int type # that maps to an 'int': # xsd__int = | int # To use regular char* strings instead of std::string, use: # xsd__string = | char* | char* # For char* serialized with xsi:type when using soapcpp2 option -t, use: # xsd__string = typedef char *xsd__string; | xsd__string | xsd__string # The following mapping is internally applied by wsdl2h for C (not C++): # (assuming option -e is used to remove the xsd__boolean__ name prefix) # xsd__boolean = enum xsd__boolean { false_, true_ }; | enum xsd__boolean # Uncomment the line below to use __int128_t for xsd:integer instead of # mapping xsd:integer to string. # Must compile and link custom/int128.c with the project. # xsd__integer = #import "custom/int128.h" | xsd__integer # Or if the xsd:integer value range is bounded to int64_t, then: # xsd__integer = typedef int64_t xsd__integer; # Uncomment the line below to use long double for xsd:decimal instead of # mapping xsd:decimal to string. # Must compile and link custom/long_double.c with the project. # xsd__decimal = #import "custom/long_double.h" | long double # Or if your system supports __float128 then you can use: # xsd__decimal = #import "custom/float128.h" | xsd__decimal # Or if the xsd:decimal value range is bounded to double, then: # xsd__decimal = typedef double xsd__decimal; # Uncomment the line below to use struct tm instead of time_t xsd:dateTime # Must compile and link custom/struct_tm.c with the project. # xsd__dateTime = #import "custom/struct_tm.h" | xsd__dateTime # Uncomment the line below to use timeval with usec precision xsd:dateTime # Must compile and link custom/struct_timeval.c with the project. # xsd__dateTime = #import "custom/struct_timeval.h" | xsd__dateTime # Uncomment the line below to use std::chrono::system_clock::time_point # for xsd:dateTime. # Must compile and link custom/chrono_time_point.c with the project. # xsd__dateTime = #import "custom/chrono_time_point.h" | xsd__dateTime # Uncomment the line below to use struct tm for xsd:date instead of # mapping xsd:date to string. # Must compile and link custom/struct_tm_date.c with the project. # xsd__date = #import "custom/struct_tm_date.h" | xsd__date # Uncomment the line below to use LONG64 int for xsd:duration instead of # mapping xsd:duration to string (in milliseconds precision). # Must compile and link custom/duration.c with the project. xsd__duration = #import "custom/duration.h" | xsd__duration # Uncomment the line below to use C++11 std::chrono::nanoseconds for # xsd:duration instead of mapping xsd:duration to string. # Must compile and link custom/chrono_duration.cpp with the project. # xsd__duration = #import "custom/chrono_duration.h" | xsd__duration # Uncomment the line below to use ULONG64 int for xsd:time instead of # mapping xsd:time to string (also comes with high usec precision) # Must compile and link custom/time.c with the project. # xsd__time = #import "custom/long_time.h" | xsd__time # When compiling WITH_LEAN there is no hexBinary serializer. You can # remap the hexBinary type to a string as follows: # xsd__hexBinary = | char* # When wsdl2h option -d is used, xsd:any is mapped to xsd__anyType DOM # declared in dom.h and implemented in dom.c/dom.cpp. You can remap # xsd:any, for example to a pointer to a DOM node as follows: # xsd__any = | xsd__anyType* # When SOAP 1.2 Faults should carry multiple SOAP_ENV__Text elements with # xml:lang attributes, then remap SOAP_ENV__Reason as follows: # [ # struct SOAP_ENV__Reason # { # char *SOAP_ENV__Text; // at least one SOAP-ENV:Text for the gSOAP engine # $int size; # struct SOAP_ENV__Text *SOAP_ENV__Text_; // array of more SOAP-ENV:Text # }; # struct SOAP_ENV__Text # { # char *__item; # @char *xml__lang; # }; # ] # SOAP-ENV mapping (note: SOAP Body content is mapped to an XML string) SOAP_ENV__Envelope = struct SOAP_ENV__Envelope { struct SOAP_ENV__Header *SOAP_ENV__Header; _XML SOAP_ENV__Body; }; | struct SOAP_ENV__Envelope SOAP_ENV__Header = | struct SOAP_ENV__Header SOAP_ENV__Fault = | struct SOAP_ENV__Fault SOAP_ENV__Detail = | struct SOAP_ENV__Detail SOAP_ENV__Code = | struct SOAP_ENV__Code SOAP_ENV__Subcode = | struct SOAP_ENV__Subcode SOAP_ENV__Reason = | struct SOAP_ENV__Reason # Temporary URI tempuri = "http://tempuri.org/" # Empty URI empty = "" # .NET WCF DataContract Serialization Schema ser = arr = "http://schemas.microsoft.com/2003/10/Serialization/Arrays" # .NET WCF DataContract Serialization Schema remappings _ser__anyURI == xsd__anyURI _ser__boolean == xsd__boolean _ser__base64Binary == xsd__base64Binary _ser__byte == xsd__byte _ser__dateTime == xsd__dateTime _ser__decimal == xsd__decimal _ser__double == xsd__double _ser__float == xsd__float _ser__int == xsd__int _ser__long == xsd__long _ser__QName == xsd__QName _ser__short == xsd__short _ser__string == xsd__string _ser__unsignedByte == xsd__unsignedByte _ser__unsignedInt == xsd__unsignedInt _ser__unsignedLong == xsd__unsignedLong _ser__unsignedShort == xsd__unsignedShort # .NET WCF ser:anyType represents an object (see import/ser.h): _ser__anyType = | struct __ser__anyType | struct __ser__anyType # .NET WCF ser:char element and type represents a Unicode character _ser__char = | int ser__char = | int # .NET WCF ser:duration element and type maps to xsd:duration _ser__duration == xsd__duration ser__duration == xsd__duration # .NET WCF ser:guid pattern = "[\da-fA-F]{8}-[\da-fA-F]{4}-[\da-fA-F]{4}-[\da-fA-F]{4}-[\da-fA-F]{12}" _ser__guid = | char* ser__guid = | char* # .NET WCF samples mssamh = "http://Microsoft.Samples.Http" mssamhi = "http://Microsoft.Samples.Http/Imports" mssamt = "http://Microsoft.Samples.TransportSecurity" mssamti = "http://Microsoft.Samples.TransportSecurity/Imports" mssamm = "http://Microsoft.Samples.MessageSecurity" mssammi = "http://Microsoft.Samples.MessageSecurity/Imports" mssadh = "http://Microsoft.Samples.DualHttp" mssadhi = "http://Microsoft.Samples.DualHttp/Imports" # MTOM xop and xmime are imported from xop.h, xmime.h, and xmlmime.h: # Note: changed xmlmime to xmime to avoid other MTOM tools from # complaining that 'xml' is reserved. xop = xmime = xmime4 = xmime5 = # xop:Include is imported from xop.h and redefined as _xop__Include: xop__Include = #import "xop.h" | _xop__Include # xmime/xmlmime:contentType attribute is a string: _xmime__contentType = | char* | char* _xmime4__contentType = | char* | char* _xmime5__contentType = | char* | char* # exc-c14n c14n = # WS-Addressing (2003, 2004, and 2005 schemas) # See import/wsa.h, import/wsa3.h etc for definitions and code examples # The API is defined in plugin/wsaapi.c, plugin/wsaapi3.c, etc. wsa = wsa3 = wsa4 = wsa5 = # The types below should not use pointers, so we add a 3rd column: _wsa__Action = | | _wsa__Action _wsa__MessageID = | | _wsa__MessageID _wsa__To = | | _wsa__To _wsa3__Action = | | _wsa3__Action _wsa3__MessageID = | | _wsa3__MessageID _wsa3__To = | | _wsa3__To _wsa4__Action = | | _wsa4__Action _wsa4__MessageID = | | _wsa4__MessageID _wsa4__To = | | _wsa4__To _wsa5__Action = | | _wsa5__Action _wsa5__MessageID = | | _wsa5__MessageID _wsa5__To = | | _wsa5__To # WS-ReliableMessaging 1.1 and 1.0 (and obsolete WS-Reliability 2004) wsrm = wsrm5 = wsrm4 = # WS-Discovery 1.1 (2009/01) and 1.0 (2004/08 with WS-Addressing) # To upgrade WS-Discovery to WS-Addressing 2005/08, uncomment wsdd5: wsdd = #wsdd5 = wsdd10 = wsdd5__HelloType = | wsdd__HelloType wsdd5__ByeType = | wsdd__ByeType wsdd5__ProbeType = | wsdd__ProbeType wsdd5__ProbeMatchesType = | wsdd__ProbeMatchesType wsdd5__ProbeMatchType = | wsdd__ProbeMatchType wsdd5__ResolveType = | wsdd__ResolveType wsdd5__ResolveMatchesType = | wsdd__ResolveMatchesType wsdd5__ResolveMatchType = | wsdd__ResolveMatchType wsdd5__ScopesType = | wsdd__ScopesType wsdd5__SecurityType = | wsdd__SecurityType wsdd5__SigType = | wsdd__SigType wsdd5__AppSequenceType = | wsdd__AppSequenceType wsdd10__HelloType = | wsdd__HelloType wsdd10__ByeType = | wsdd__ByeType wsdd10__ProbeType = | wsdd__ProbeType wsdd10__ProbeMatchesType = | wsdd__ProbeMatchesType wsdd10__ProbeMatchType = | wsdd__ProbeMatchType wsdd10__ResolveType = | wsdd__ResolveType wsdd10__ResolveMatchesType = | wsdd__ResolveMatchesType wsdd10__ResolveMatchType = | wsdd__ResolveMatchType wsdd10__ScopesType = | wsdd__ScopesType wsdd10__SecurityType = | wsdd__SecurityType wsdd10__SigType = | wsdd__SigType wsdd10__AppSequenceType = | wsdd__AppSequenceType # WS-Policy wsp = # WS-SecureConversation 1.4 wsc = wsc2 = # WS-Trust 1.2 and 1.3 wst = wst12 = # SAML bindings saml1 = saml2 = # WS-Security wsse 2004 v1.0 and 1.1 and old wsse 2002 schema wsse11 = wsse = wsse2 = _wsse2__Security == _wsse__Security wsse2__Security == wsse__Security # wsu 2004 wsu = _wsu__Id = | char* _wsu__Created = | time_t _wsu__Expires = | time_t wsu__AttributedDateTime = | time_t wsu__AttributedURI = | char* # Bindings for ds and xenc for WS-Security protocols: ds = xenc = # xlink xlink = _xlink__actuate = | char* _xlink__arcrole = | char* _xlink__from = | char* _xlink__href = | char* _xlink__label = | char* _xlink__role = | char* _xlink__show = | char* _xlink__to = | char* _xlink__title = | char* _xlink__type = | char* # wsrp routing protocol (deprecated) wsrp = # BPEL 2.0 bpel = "http://docs.oasis-open.org/wsbpel/2.0/process/executable" bpelabs = "http://docs.oasis-open.org/wsbpel/2.0/process/abstract" plnk = "http://docs.oasis-open.org/wsbpel/2.0/plnktype" sref = "http://docs.oasis-open.org/wsbpel/2.0/serviceref" vprop = "http://docs.oasis-open.org/wsbpel/2.0/varprop" # ONVIF recommended prefixes as per 8/20/12 # http://www.onvif.org/onvif/ver10/device/wsdl/devicemgmt.wsdl # http://www.onvif.org/onvif/ver10/event/wsdl/event.wsdl # http://www.onvif.org/onvif/ver10/display.wsdl # http://www.onvif.org/onvif/ver10/deviceio.wsdl # http://www.onvif.org/onvif/ver20/imaging/wsdl/imaging.wsdl # http://www.onvif.org/onvif/ver10/media/wsdl/media.wsdl # http://www.onvif.org/onvif/ver20/ptz/wsdl/ptz.wsdl # http://www.onvif.org/onvif/ver10/receiver.wsdl # http://www.onvif.org/onvif/ver10/recording.wsdl # http://www.onvif.org/onvif/ver10/search.wsdl # http://www.onvif.org/onvif/ver10/network/wsdl/remotediscovery.wsdl # http://www.onvif.org/onvif/ver10/replay.wsdl # http://www.onvif.org/onvif/ver20/analytics/wsdl/analytics.wsdl # http://www.onvif.org/onvif/ver10/analyticsdevice.wsdl # http://www.onvif.org/onvif/ver10/schema/onvif.xsd tds = "http://www.onvif.org/ver10/device/wsdl" tev = "http://www.onvif.org/ver10/events/wsdl" tls = "http://www.onvif.org/ver10/display/wsdl" tmd = "http://www.onvif.org/ver10/deviceIO/wsdl" timg = "http://www.onvif.org/ver20/imaging/wsdl" trt = "http://www.onvif.org/ver10/media/wsdl" tptz = "http://www.onvif.org/ver20/ptz/wsdl" trv = "http://www.onvif.org/ver10/receiver/wsdl" trc = "http://www.onvif.org/ver10/recording/wsdl" tse = "http://www.onvif.org/ver10/search/wsdl" trp = "http://www.onvif.org/ver10/replay/wsdl" tan = "http://www.onvif.org/ver20/analytics/wsdl" tad = "http://www.onvif.org/ver10/analyticsdevice/wsdl" tdn = "http://www.onvif.org/ver10/network/wsdl" tt = "http://www.onvif.org/ver10/schema" # OASIS recommended prefixes wsnt = "http://docs.oasis-open.org/wsn/b-2" wsntw = "http://docs.oasis-open.org/wsn/bw-2" wsrfbf = "http://docs.oasis-open.org/wsrf/bf-2" wsrfr = "http://docs.oasis-open.org/wsrf/r-2" wsrfrw = "http://docs.oasis-open.org/wsrf/rw-2" wstop = "http://docs.oasis-open.org/wsn/t-1" # Prefix bindings for WhiteMesa interoperability testing round 2: i = "http://soapinterop.org/" s = "http://soapinterop.org/xsd" # Prefix binding for Amazon Web Services: aws = "urn:PI/DevCentral/SoapService" # Prefix binding for Mappoint Web services: mpt = "http://s.mappoint.net/mappoint-30/" gsoap-2.8.28/gsoap/doc/0000755000175000017500000000000012653650146014152 5ustar ellertellertgsoap-2.8.28/gsoap/doc/.DS_Store0000644000175000017500000001400412653650144015632 0ustar ellertellertBud1 bindin databindingbwspblobbplist00  ]ShowStatusBar[ShowPathbar[ShowToolbar[ShowTabView_ContainerShowSidebar\WindowBounds\SidebarWidth[ShowSidebar   _{{351, 313}, {770, 460}}x '3?Kbo| databindingvSrnlongdombwspblobbplist00  ]ShowStatusBar[ShowPathbar[ShowToolbar[ShowTabView_ContainerShowSidebar\WindowBounds\SidebarWidth[ShowSidebar   _{{351, 313}, {770, 460}}x '3?Kbo|domvSrnlongwssebwspblobbplist00  ]ShowStatusBar[ShowPathbar[ShowToolbar[ShowTabView_ContainerShowSidebar\WindowBounds\SidebarWidth[ShowSidebar   _{{91, 330}, {770, 460}}x '3?Kbo|wssevSrnlong  @ @ @ @ E DSDB ` @ @ @gsoap-2.8.28/gsoap/doc/wsa/0000755000175000017500000000000012654077574014755 5ustar ellertellertgsoap-2.8.28/gsoap/doc/wsa/Doxyfile0000644000175000017500000002307312653650144016455 0ustar ellertellert# Doxyfile 1.3.8 #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- PROJECT_NAME = "WS-Addressing" PROJECT_NUMBER = "2.8 Stable" PROJECT_LOGO = "../GeniviaLogo2_trans_noslogan.png" OUTPUT_DIRECTORY = CREATE_SUBDIRS = NO OUTPUT_LANGUAGE = English USE_WINDOWS_ENCODING = NO BRIEF_MEMBER_DESC = YES REPEAT_BRIEF = YES ABBREVIATE_BRIEF = "The $name class" \ "The $name widget" \ "The $name file" \ is \ provides \ specifies \ contains \ represents \ a \ an \ the ALWAYS_DETAILED_SEC = NO INLINE_INHERITED_MEMB = NO FULL_PATH_NAMES = NO STRIP_FROM_PATH = STRIP_FROM_INC_PATH = SHORT_NAMES = NO JAVADOC_AUTOBRIEF = NO MULTILINE_CPP_IS_BRIEF = NO DETAILS_AT_TOP = NO INHERIT_DOCS = YES DISTRIBUTE_GROUP_DOC = NO TAB_SIZE = 8 ALIASES = OPTIMIZE_OUTPUT_FOR_C = NO OPTIMIZE_OUTPUT_JAVA = NO SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- EXTRACT_ALL = YES EXTRACT_PRIVATE = YES EXTRACT_STATIC = YES EXTRACT_LOCAL_CLASSES = YES EXTRACT_LOCAL_METHODS = NO HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_CLASSES = NO HIDE_FRIEND_COMPOUNDS = NO HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = NO CASE_SENSE_NAMES = NO HIDE_SCOPE_NAMES = NO SHOW_INCLUDE_FILES = YES INLINE_INFO = YES SORT_MEMBER_DOCS = YES SORT_BRIEF_DOCS = NO SORT_BY_SCOPE_NAME = NO GENERATE_TODOLIST = YES GENERATE_TESTLIST = YES GENERATE_BUGLIST = YES GENERATE_DEPRECATEDLIST= YES ENABLED_SECTIONS = MAX_INITIALIZER_LINES = 30 SHOW_USED_FILES = YES #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- QUIET = NO WARNINGS = YES WARN_IF_UNDOCUMENTED = YES WARN_IF_DOC_ERROR = YES WARN_FORMAT = "$file:$line: $text" WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- INPUT = ../../plugin/wsaapi.h ../../plugin/wsaapi.c FILE_PATTERNS = *.c \ *.cc \ *.cxx \ *.cpp \ *.c++ \ *.java \ *.ii \ *.ixx \ *.ipp \ *.i++ \ *.inl \ *.h \ *.hh \ *.hxx \ *.hpp \ *.h++ \ *.idl \ *.odl \ *.cs \ *.php \ *.php3 \ *.inc \ *.m \ *.mm \ *.C \ *.CC \ *.C++ \ *.II \ *.I++ \ *.H \ *.HH \ *.H++ \ *.CS \ *.PHP \ *.PHP3 \ *.M \ *.MM RECURSIVE = NO EXCLUDE = EXCLUDE_SYMLINKS = NO EXCLUDE_PATTERNS = EXAMPLE_PATH = EXAMPLE_PATTERNS = * EXAMPLE_RECURSIVE = NO IMAGE_PATH = INPUT_FILTER = FILTER_PATTERNS = FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- SOURCE_BROWSER = NO INLINE_SOURCES = NO STRIP_CODE_COMMENTS = YES REFERENCED_BY_RELATION = NO REFERENCES_RELATION = NO VERBATIM_HEADERS = NO #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- ALPHABETICAL_INDEX = NO COLS_IN_ALPHA_INDEX = 5 IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- GENERATE_HTML = YES HTML_OUTPUT = html HTML_FILE_EXTENSION = .html HTML_HEADER = ../doxygen_header.html HTML_FOOTER = ../doxygen_footer.html HTML_STYLESHEET = HTML_ALIGN_MEMBERS = YES GENERATE_HTMLHELP = NO CHM_FILE = HHC_LOCATION = GENERATE_CHI = NO BINARY_TOC = NO TOC_EXPAND = NO DISABLE_INDEX = NO ENUM_VALUES_PER_LINE = 4 GENERATE_TREEVIEW = NO TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- GENERATE_LATEX = NO LATEX_OUTPUT = latex LATEX_CMD_NAME = latex MAKEINDEX_CMD_NAME = makeindex COMPACT_LATEX = NO PAPER_TYPE = a4wide EXTRA_PACKAGES = LATEX_HEADER = PDF_HYPERLINKS = NO USE_PDFLATEX = NO LATEX_BATCHMODE = NO LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- GENERATE_RTF = NO RTF_OUTPUT = rtf COMPACT_RTF = NO RTF_HYPERLINKS = NO RTF_STYLESHEET_FILE = RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- GENERATE_MAN = NO MAN_OUTPUT = man MAN_EXTENSION = .3 MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- GENERATE_XML = NO XML_OUTPUT = xml XML_SCHEMA = XML_DTD = XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- GENERATE_PERLMOD = NO PERLMOD_LATEX = NO PERLMOD_PRETTY = YES PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- ENABLE_PREPROCESSING = YES MACRO_EXPANSION = NO EXPAND_ONLY_PREDEF = NO SEARCH_INCLUDES = YES INCLUDE_PATH = INCLUDE_FILE_PATTERNS = PREDEFINED = EXPAND_AS_DEFINED = SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- TAGFILES = GENERATE_TAGFILE = ALLEXTERNALS = NO EXTERNAL_GROUPS = YES PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- CLASS_DIAGRAMS = NO HIDE_UNDOC_RELATIONS = YES HAVE_DOT = YES CLASS_GRAPH = YES COLLABORATION_GRAPH = YES UML_LOOK = NO TEMPLATE_RELATIONS = NO INCLUDE_GRAPH = YES INCLUDED_BY_GRAPH = YES CALL_GRAPH = NO GRAPHICAL_HIERARCHY = YES DOT_IMAGE_FORMAT = png DOT_PATH = /usr/local/bin DOTFILE_DIRS = MAX_DOT_GRAPH_WIDTH = 1024 MAX_DOT_GRAPH_HEIGHT = 1024 MAX_DOT_GRAPH_DEPTH = 1000 GENERATE_LEGEND = YES DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- SEARCHENGINE = NO gsoap-2.8.28/gsoap/doc/wsdd/0000755000175000017500000000000012654077574015124 5ustar ellertellertgsoap-2.8.28/gsoap/doc/wsdd/Doxyfile0000644000175000017500000002324412653650146016626 0ustar ellertellert# Doxyfile 1.3.8 #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- PROJECT_NAME = "WS-Discovery" PROJECT_NUMBER = "2.8 Stable" PROJECT_LOGO = "../GeniviaLogo2_trans_noslogan.png" OUTPUT_DIRECTORY = CREATE_SUBDIRS = NO OUTPUT_LANGUAGE = English USE_WINDOWS_ENCODING = NO BRIEF_MEMBER_DESC = YES REPEAT_BRIEF = YES ABBREVIATE_BRIEF = "The $name class" \ "The $name widget" \ "The $name file" \ is \ provides \ specifies \ contains \ represents \ a \ an \ the ALWAYS_DETAILED_SEC = NO INLINE_INHERITED_MEMB = NO FULL_PATH_NAMES = NO STRIP_FROM_PATH = STRIP_FROM_INC_PATH = SHORT_NAMES = NO JAVADOC_AUTOBRIEF = NO MULTILINE_CPP_IS_BRIEF = NO DETAILS_AT_TOP = NO INHERIT_DOCS = YES DISTRIBUTE_GROUP_DOC = NO TAB_SIZE = 8 ALIASES = OPTIMIZE_OUTPUT_FOR_C = NO OPTIMIZE_OUTPUT_JAVA = NO SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- EXTRACT_ALL = YES EXTRACT_PRIVATE = YES EXTRACT_STATIC = YES EXTRACT_LOCAL_CLASSES = YES EXTRACT_LOCAL_METHODS = NO HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_CLASSES = NO HIDE_FRIEND_COMPOUNDS = NO HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = NO CASE_SENSE_NAMES = NO HIDE_SCOPE_NAMES = NO SHOW_INCLUDE_FILES = YES INLINE_INFO = YES SORT_MEMBER_DOCS = YES SORT_BRIEF_DOCS = NO SORT_BY_SCOPE_NAME = NO GENERATE_TODOLIST = YES GENERATE_TESTLIST = YES GENERATE_BUGLIST = YES GENERATE_DEPRECATEDLIST= YES ENABLED_SECTIONS = MAX_INITIALIZER_LINES = 30 SHOW_USED_FILES = YES #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- QUIET = NO WARNINGS = YES WARN_IF_UNDOCUMENTED = YES WARN_IF_DOC_ERROR = YES WARN_FORMAT = "$file:$line: $text" WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- INPUT = ../../plugin/wsddapi.h ../../plugin/wsddapi.c ../../plugin/wsaapi.h ../../plugin/wsaapi.c ../../import/wsdd.h ../../import/wsdx.h ../../import/wsa5.h FILE_PATTERNS = *.c \ *.cc \ *.cxx \ *.cpp \ *.c++ \ *.java \ *.ii \ *.ixx \ *.ipp \ *.i++ \ *.inl \ *.h \ *.hh \ *.hxx \ *.hpp \ *.h++ \ *.idl \ *.odl \ *.cs \ *.php \ *.php3 \ *.inc \ *.m \ *.mm \ *.C \ *.CC \ *.C++ \ *.II \ *.I++ \ *.H \ *.HH \ *.H++ \ *.CS \ *.PHP \ *.PHP3 \ *.M \ *.MM RECURSIVE = NO EXCLUDE = EXCLUDE_SYMLINKS = NO EXCLUDE_PATTERNS = EXAMPLE_PATH = EXAMPLE_PATTERNS = * EXAMPLE_RECURSIVE = NO IMAGE_PATH = INPUT_FILTER = FILTER_PATTERNS = FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- SOURCE_BROWSER = NO INLINE_SOURCES = NO STRIP_CODE_COMMENTS = YES REFERENCED_BY_RELATION = NO REFERENCES_RELATION = NO VERBATIM_HEADERS = NO #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- ALPHABETICAL_INDEX = NO COLS_IN_ALPHA_INDEX = 5 IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- GENERATE_HTML = YES HTML_OUTPUT = html HTML_FILE_EXTENSION = .html HTML_HEADER = ../doxygen_header.html HTML_FOOTER = ../doxygen_footer.html HTML_STYLESHEET = HTML_ALIGN_MEMBERS = YES GENERATE_HTMLHELP = NO CHM_FILE = HHC_LOCATION = GENERATE_CHI = NO BINARY_TOC = NO TOC_EXPAND = NO DISABLE_INDEX = NO ENUM_VALUES_PER_LINE = 4 GENERATE_TREEVIEW = NO TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- GENERATE_LATEX = NO LATEX_OUTPUT = latex LATEX_CMD_NAME = latex MAKEINDEX_CMD_NAME = makeindex COMPACT_LATEX = NO PAPER_TYPE = a4wide EXTRA_PACKAGES = LATEX_HEADER = PDF_HYPERLINKS = NO USE_PDFLATEX = NO LATEX_BATCHMODE = NO LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- GENERATE_RTF = NO RTF_OUTPUT = rtf COMPACT_RTF = NO RTF_HYPERLINKS = NO RTF_STYLESHEET_FILE = RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- GENERATE_MAN = NO MAN_OUTPUT = man MAN_EXTENSION = .3 MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- GENERATE_XML = NO XML_OUTPUT = xml XML_SCHEMA = XML_DTD = XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- GENERATE_PERLMOD = NO PERLMOD_LATEX = NO PERLMOD_PRETTY = YES PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- ENABLE_PREPROCESSING = YES MACRO_EXPANSION = NO EXPAND_ONLY_PREDEF = NO SEARCH_INCLUDES = YES INCLUDE_PATH = INCLUDE_FILE_PATTERNS = PREDEFINED = EXPAND_AS_DEFINED = SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- TAGFILES = GENERATE_TAGFILE = ALLEXTERNALS = NO EXTERNAL_GROUPS = YES PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- CLASS_DIAGRAMS = NO HIDE_UNDOC_RELATIONS = YES HAVE_DOT = YES CLASS_GRAPH = YES COLLABORATION_GRAPH = YES UML_LOOK = NO TEMPLATE_RELATIONS = NO INCLUDE_GRAPH = YES INCLUDED_BY_GRAPH = YES CALL_GRAPH = NO GRAPHICAL_HIERARCHY = YES DOT_IMAGE_FORMAT = png DOT_PATH = /usr/local/bin DOTFILE_DIRS = MAX_DOT_GRAPH_WIDTH = 1024 MAX_DOT_GRAPH_HEIGHT = 1024 MAX_DOT_GRAPH_DEPTH = 1000 GENERATE_LEGEND = YES DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- SEARCHENGINE = NO gsoap-2.8.28/gsoap/doc/uddi2/0000755000175000017500000000000012654077574015172 5ustar ellertellertgsoap-2.8.28/gsoap/doc/uddi2/Doxyfile0000644000175000017500000002303712653650144016672 0ustar ellertellert# Doxyfile 1.3.8 #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- PROJECT_NAME = "UDDI v2" PROJECT_NUMBER = "2.8 stable" PROJECT_LOGO = "../GeniviaLogo2_trans_noslogan.png" OUTPUT_DIRECTORY = CREATE_SUBDIRS = NO OUTPUT_LANGUAGE = English USE_WINDOWS_ENCODING = NO BRIEF_MEMBER_DESC = YES REPEAT_BRIEF = YES ABBREVIATE_BRIEF = "The $name class" \ "The $name widget" \ "The $name file" \ is \ provides \ specifies \ contains \ represents \ a \ an \ the ALWAYS_DETAILED_SEC = NO INLINE_INHERITED_MEMB = NO FULL_PATH_NAMES = NO STRIP_FROM_PATH = STRIP_FROM_INC_PATH = SHORT_NAMES = NO JAVADOC_AUTOBRIEF = NO MULTILINE_CPP_IS_BRIEF = NO DETAILS_AT_TOP = NO INHERIT_DOCS = YES DISTRIBUTE_GROUP_DOC = NO TAB_SIZE = 8 ALIASES = OPTIMIZE_OUTPUT_FOR_C = NO OPTIMIZE_OUTPUT_JAVA = NO SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- EXTRACT_ALL = YES EXTRACT_PRIVATE = YES EXTRACT_STATIC = YES EXTRACT_LOCAL_CLASSES = YES EXTRACT_LOCAL_METHODS = NO HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_CLASSES = NO HIDE_FRIEND_COMPOUNDS = NO HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = NO CASE_SENSE_NAMES = NO HIDE_SCOPE_NAMES = NO SHOW_INCLUDE_FILES = YES INLINE_INFO = YES SORT_MEMBER_DOCS = YES SORT_BRIEF_DOCS = NO SORT_BY_SCOPE_NAME = NO GENERATE_TODOLIST = YES GENERATE_TESTLIST = YES GENERATE_BUGLIST = YES GENERATE_DEPRECATEDLIST= YES ENABLED_SECTIONS = MAX_INITIALIZER_LINES = 30 SHOW_USED_FILES = YES #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- QUIET = NO WARNINGS = YES WARN_IF_UNDOCUMENTED = YES WARN_IF_DOC_ERROR = YES WARN_FORMAT = "$file:$line: $text" WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- INPUT = ../../uddi2/uddi_v2.h FILE_PATTERNS = *.c \ *.cc \ *.cxx \ *.cpp \ *.c++ \ *.java \ *.ii \ *.ixx \ *.ipp \ *.i++ \ *.inl \ *.h \ *.hh \ *.hxx \ *.hpp \ *.h++ \ *.idl \ *.odl \ *.cs \ *.php \ *.php3 \ *.inc \ *.m \ *.mm \ *.C \ *.CC \ *.C++ \ *.II \ *.I++ \ *.H \ *.HH \ *.H++ \ *.CS \ *.PHP \ *.PHP3 \ *.M \ *.MM RECURSIVE = NO EXCLUDE = EXCLUDE_SYMLINKS = NO EXCLUDE_PATTERNS = EXAMPLE_PATH = EXAMPLE_PATTERNS = * EXAMPLE_RECURSIVE = NO IMAGE_PATH = INPUT_FILTER = FILTER_PATTERNS = FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- SOURCE_BROWSER = NO INLINE_SOURCES = NO STRIP_CODE_COMMENTS = YES REFERENCED_BY_RELATION = NO REFERENCES_RELATION = NO VERBATIM_HEADERS = NO #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- ALPHABETICAL_INDEX = NO COLS_IN_ALPHA_INDEX = 5 IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- GENERATE_HTML = YES HTML_OUTPUT = html HTML_FILE_EXTENSION = .html HTML_HEADER = ../doxygen_header.html HTML_FOOTER = ../doxygen_footer.html HTML_STYLESHEET = HTML_ALIGN_MEMBERS = YES GENERATE_HTMLHELP = NO CHM_FILE = HHC_LOCATION = GENERATE_CHI = NO BINARY_TOC = NO TOC_EXPAND = NO DISABLE_INDEX = NO ENUM_VALUES_PER_LINE = 4 GENERATE_TREEVIEW = NO TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- GENERATE_LATEX = NO LATEX_OUTPUT = latex LATEX_CMD_NAME = latex MAKEINDEX_CMD_NAME = makeindex COMPACT_LATEX = NO PAPER_TYPE = a4wide EXTRA_PACKAGES = LATEX_HEADER = PDF_HYPERLINKS = NO USE_PDFLATEX = NO LATEX_BATCHMODE = NO LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- GENERATE_RTF = NO RTF_OUTPUT = rtf COMPACT_RTF = NO RTF_HYPERLINKS = NO RTF_STYLESHEET_FILE = RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- GENERATE_MAN = NO MAN_OUTPUT = man MAN_EXTENSION = .3 MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- GENERATE_XML = NO XML_OUTPUT = xml XML_SCHEMA = XML_DTD = XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- GENERATE_PERLMOD = NO PERLMOD_LATEX = NO PERLMOD_PRETTY = YES PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- ENABLE_PREPROCESSING = YES MACRO_EXPANSION = NO EXPAND_ONLY_PREDEF = NO SEARCH_INCLUDES = YES INCLUDE_PATH = INCLUDE_FILE_PATTERNS = PREDEFINED = EXPAND_AS_DEFINED = SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- TAGFILES = GENERATE_TAGFILE = ALLEXTERNALS = NO EXTERNAL_GROUPS = YES PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- CLASS_DIAGRAMS = NO HIDE_UNDOC_RELATIONS = YES HAVE_DOT = YES CLASS_GRAPH = YES COLLABORATION_GRAPH = YES UML_LOOK = NO TEMPLATE_RELATIONS = NO INCLUDE_GRAPH = YES INCLUDED_BY_GRAPH = YES CALL_GRAPH = NO GRAPHICAL_HIERARCHY = YES DOT_IMAGE_FORMAT = png DOT_PATH = /usr/local/bin DOTFILE_DIRS = MAX_DOT_GRAPH_WIDTH = 1024 MAX_DOT_GRAPH_HEIGHT = 1024 MAX_DOT_GRAPH_DEPTH = 1000 GENERATE_LEGEND = YES DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- SEARCHENGINE = NO gsoap-2.8.28/gsoap/doc/wsse/0000755000175000017500000000000012654077575015145 5ustar ellertellertgsoap-2.8.28/gsoap/doc/wsse/Doxyfile0000644000175000017500000002344312653650146016647 0ustar ellertellert# Doxyfile 1.3.8 #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- PROJECT_NAME = "WS-Security" PROJECT_NUMBER = "2.8 Stable" PROJECT_LOGO = "../GeniviaLogo2_trans_noslogan.png" OUTPUT_DIRECTORY = CREATE_SUBDIRS = NO OUTPUT_LANGUAGE = English USE_WINDOWS_ENCODING = NO BRIEF_MEMBER_DESC = YES REPEAT_BRIEF = YES ABBREVIATE_BRIEF = "The $name class" \ "The $name widget" \ "The $name file" \ is \ provides \ specifies \ contains \ represents \ a \ an \ the ALWAYS_DETAILED_SEC = NO INLINE_INHERITED_MEMB = NO FULL_PATH_NAMES = NO STRIP_FROM_PATH = STRIP_FROM_INC_PATH = SHORT_NAMES = NO JAVADOC_AUTOBRIEF = NO MULTILINE_CPP_IS_BRIEF = NO DETAILS_AT_TOP = NO INHERIT_DOCS = YES DISTRIBUTE_GROUP_DOC = NO TAB_SIZE = 8 ALIASES = OPTIMIZE_OUTPUT_FOR_C = NO OPTIMIZE_OUTPUT_JAVA = NO SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- EXTRACT_ALL = YES EXTRACT_PRIVATE = YES EXTRACT_STATIC = YES EXTRACT_LOCAL_CLASSES = YES EXTRACT_LOCAL_METHODS = NO HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_CLASSES = NO HIDE_FRIEND_COMPOUNDS = NO HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = NO CASE_SENSE_NAMES = NO HIDE_SCOPE_NAMES = NO SHOW_INCLUDE_FILES = YES INLINE_INFO = YES SORT_MEMBER_DOCS = YES SORT_BRIEF_DOCS = NO SORT_BY_SCOPE_NAME = NO GENERATE_TODOLIST = YES GENERATE_TESTLIST = YES GENERATE_BUGLIST = YES GENERATE_DEPRECATEDLIST= YES ENABLED_SECTIONS = MAX_INITIALIZER_LINES = 30 SHOW_USED_FILES = YES #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- QUIET = NO WARNINGS = YES WARN_IF_UNDOCUMENTED = YES WARN_IF_DOC_ERROR = YES WARN_FORMAT = "$file:$line: $text" WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- INPUT = ../../plugin/wsseapi.h ../../plugin/wsseapi.c ../../plugin/smdevp.h ../../plugin/smdevp.c ../../plugin/mecevp.h ../../plugin/mecevp.c ../../plugin/threads.h ../../plugin/threads.c ../../import/wsse.h ../../import/ds.h ../../import/xenc.h ../../import/wsu.h ../../import/c14n.h FILE_PATTERNS = *.c \ *.cc \ *.cxx \ *.cpp \ *.c++ \ *.java \ *.ii \ *.ixx \ *.ipp \ *.i++ \ *.inl \ *.h \ *.hh \ *.hxx \ *.hpp \ *.h++ \ *.idl \ *.odl \ *.cs \ *.php \ *.php3 \ *.inc \ *.m \ *.mm \ *.C \ *.CC \ *.C++ \ *.II \ *.I++ \ *.H \ *.HH \ *.H++ \ *.CS \ *.PHP \ *.PHP3 \ *.M \ *.MM RECURSIVE = NO EXCLUDE = EXCLUDE_SYMLINKS = NO EXCLUDE_PATTERNS = EXAMPLE_PATH = EXAMPLE_PATTERNS = * EXAMPLE_RECURSIVE = NO IMAGE_PATH = INPUT_FILTER = FILTER_PATTERNS = FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- SOURCE_BROWSER = NO INLINE_SOURCES = NO STRIP_CODE_COMMENTS = YES REFERENCED_BY_RELATION = NO REFERENCES_RELATION = NO VERBATIM_HEADERS = NO #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- ALPHABETICAL_INDEX = NO COLS_IN_ALPHA_INDEX = 5 IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- GENERATE_HTML = YES HTML_OUTPUT = html HTML_FILE_EXTENSION = .html HTML_HEADER = ../doxygen_header.html HTML_FOOTER = ../doxygen_footer.html HTML_STYLESHEET = HTML_ALIGN_MEMBERS = YES GENERATE_HTMLHELP = NO CHM_FILE = HHC_LOCATION = GENERATE_CHI = NO BINARY_TOC = NO TOC_EXPAND = NO DISABLE_INDEX = NO ENUM_VALUES_PER_LINE = 4 GENERATE_TREEVIEW = NO TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- GENERATE_LATEX = NO LATEX_OUTPUT = latex LATEX_CMD_NAME = latex MAKEINDEX_CMD_NAME = makeindex COMPACT_LATEX = NO PAPER_TYPE = a4wide EXTRA_PACKAGES = LATEX_HEADER = PDF_HYPERLINKS = NO USE_PDFLATEX = NO LATEX_BATCHMODE = NO LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- GENERATE_RTF = NO RTF_OUTPUT = rtf COMPACT_RTF = NO RTF_HYPERLINKS = NO RTF_STYLESHEET_FILE = RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- GENERATE_MAN = NO MAN_OUTPUT = man MAN_EXTENSION = .3 MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- GENERATE_XML = NO XML_OUTPUT = xml XML_SCHEMA = XML_DTD = XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- GENERATE_PERLMOD = NO PERLMOD_LATEX = NO PERLMOD_PRETTY = YES PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- ENABLE_PREPROCESSING = YES MACRO_EXPANSION = NO EXPAND_ONLY_PREDEF = NO SEARCH_INCLUDES = YES INCLUDE_PATH = INCLUDE_FILE_PATTERNS = PREDEFINED = EXPAND_AS_DEFINED = SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- TAGFILES = GENERATE_TAGFILE = ALLEXTERNALS = NO EXTERNAL_GROUPS = YES PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- CLASS_DIAGRAMS = NO HIDE_UNDOC_RELATIONS = YES HAVE_DOT = YES CLASS_GRAPH = YES COLLABORATION_GRAPH = YES UML_LOOK = NO TEMPLATE_RELATIONS = NO INCLUDE_GRAPH = YES INCLUDED_BY_GRAPH = YES CALL_GRAPH = NO GRAPHICAL_HIERARCHY = YES DOT_IMAGE_FORMAT = png DOT_PATH = /usr/local/bin DOTFILE_DIRS = MAX_DOT_GRAPH_WIDTH = 1024 MAX_DOT_GRAPH_HEIGHT = 1024 MAX_DOT_GRAPH_DEPTH = 1000 GENERATE_LEGEND = YES DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- SEARCHENGINE = NO gsoap-2.8.28/gsoap/doc/apache/0000755000175000017500000000000012654077574015404 5ustar ellertellertgsoap-2.8.28/gsoap/doc/apache/Doxyfile0000644000175000017500000002315112653650144017101 0ustar ellertellert# Doxyfile 1.3.8 #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- PROJECT_NAME = "Apache Module" PROJECT_NUMBER = "2.8 Stable" PROJECT_LOGO = "../GeniviaLogo2_trans_noslogan.png" OUTPUT_DIRECTORY = CREATE_SUBDIRS = NO OUTPUT_LANGUAGE = English USE_WINDOWS_ENCODING = NO BRIEF_MEMBER_DESC = YES REPEAT_BRIEF = YES ABBREVIATE_BRIEF = "The $name class" \ "The $name widget" \ "The $name file" \ is \ provides \ specifies \ contains \ represents \ a \ an \ the ALWAYS_DETAILED_SEC = NO INLINE_INHERITED_MEMB = NO FULL_PATH_NAMES = NO STRIP_FROM_PATH = STRIP_FROM_INC_PATH = SHORT_NAMES = NO JAVADOC_AUTOBRIEF = NO MULTILINE_CPP_IS_BRIEF = NO DETAILS_AT_TOP = NO INHERIT_DOCS = YES DISTRIBUTE_GROUP_DOC = NO TAB_SIZE = 8 ALIASES = OPTIMIZE_OUTPUT_FOR_C = NO OPTIMIZE_OUTPUT_JAVA = NO SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- EXTRACT_ALL = YES EXTRACT_PRIVATE = YES EXTRACT_STATIC = YES EXTRACT_LOCAL_CLASSES = YES EXTRACT_LOCAL_METHODS = NO HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_CLASSES = NO HIDE_FRIEND_COMPOUNDS = NO HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = NO CASE_SENSE_NAMES = NO HIDE_SCOPE_NAMES = NO SHOW_INCLUDE_FILES = YES INLINE_INFO = YES SORT_MEMBER_DOCS = YES SORT_BRIEF_DOCS = NO SORT_BY_SCOPE_NAME = NO GENERATE_TODOLIST = YES GENERATE_TESTLIST = YES GENERATE_BUGLIST = YES GENERATE_DEPRECATEDLIST= YES ENABLED_SECTIONS = MAX_INITIALIZER_LINES = 30 SHOW_USED_FILES = YES #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- QUIET = NO WARNINGS = YES WARN_IF_UNDOCUMENTED = YES WARN_IF_DOC_ERROR = YES WARN_FORMAT = "$file:$line: $text" WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- INPUT = ../../mod_gsoap/mod_gsoap-0.9/apache_20/README.md ../../mod_gsoap/mod_gsoap-0.9/apache_20 FILE_PATTERNS = *.c \ *.cc \ *.cxx \ *.cpp \ *.c++ \ *.java \ *.ii \ *.ixx \ *.ipp \ *.i++ \ *.inl \ *.h \ *.hh \ *.hxx \ *.hpp \ *.h++ \ *.idl \ *.odl \ *.cs \ *.php \ *.php3 \ *.inc \ *.m \ *.mm \ *.C \ *.CC \ *.C++ \ *.II \ *.I++ \ *.H \ *.HH \ *.H++ \ *.CS \ *.PHP \ *.PHP3 \ *.M \ *.MM RECURSIVE = NO EXCLUDE = EXCLUDE_SYMLINKS = NO EXCLUDE_PATTERNS = EXAMPLE_PATH = EXAMPLE_PATTERNS = * EXAMPLE_RECURSIVE = NO IMAGE_PATH = INPUT_FILTER = FILTER_PATTERNS = FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- SOURCE_BROWSER = NO INLINE_SOURCES = NO STRIP_CODE_COMMENTS = YES REFERENCED_BY_RELATION = NO REFERENCES_RELATION = NO VERBATIM_HEADERS = NO #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- ALPHABETICAL_INDEX = NO COLS_IN_ALPHA_INDEX = 5 IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- GENERATE_HTML = YES HTML_OUTPUT = html HTML_FILE_EXTENSION = .html HTML_HEADER = ../doxygen_header.html HTML_FOOTER = ../doxygen_footer.html HTML_STYLESHEET = HTML_ALIGN_MEMBERS = YES GENERATE_HTMLHELP = NO CHM_FILE = HHC_LOCATION = GENERATE_CHI = NO BINARY_TOC = NO TOC_EXPAND = NO DISABLE_INDEX = NO ENUM_VALUES_PER_LINE = 4 GENERATE_TREEVIEW = NO TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- GENERATE_LATEX = NO LATEX_OUTPUT = latex LATEX_CMD_NAME = latex MAKEINDEX_CMD_NAME = makeindex COMPACT_LATEX = NO PAPER_TYPE = a4wide EXTRA_PACKAGES = LATEX_HEADER = PDF_HYPERLINKS = NO USE_PDFLATEX = NO LATEX_BATCHMODE = NO LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- GENERATE_RTF = NO RTF_OUTPUT = rtf COMPACT_RTF = NO RTF_HYPERLINKS = NO RTF_STYLESHEET_FILE = RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- GENERATE_MAN = NO MAN_OUTPUT = man MAN_EXTENSION = .3 MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- GENERATE_XML = NO XML_OUTPUT = xml XML_SCHEMA = XML_DTD = XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- GENERATE_PERLMOD = NO PERLMOD_LATEX = NO PERLMOD_PRETTY = YES PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- ENABLE_PREPROCESSING = YES MACRO_EXPANSION = NO EXPAND_ONLY_PREDEF = NO SEARCH_INCLUDES = YES INCLUDE_PATH = INCLUDE_FILE_PATTERNS = PREDEFINED = EXPAND_AS_DEFINED = SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- TAGFILES = GENERATE_TAGFILE = ALLEXTERNALS = NO EXTERNAL_GROUPS = YES PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- CLASS_DIAGRAMS = NO HIDE_UNDOC_RELATIONS = YES HAVE_DOT = YES CLASS_GRAPH = YES COLLABORATION_GRAPH = YES UML_LOOK = NO TEMPLATE_RELATIONS = NO INCLUDE_GRAPH = YES INCLUDED_BY_GRAPH = YES CALL_GRAPH = NO GRAPHICAL_HIERARCHY = YES DOT_IMAGE_FORMAT = png DOT_PATH = /usr/local/bin DOTFILE_DIRS = MAX_DOT_GRAPH_WIDTH = 1024 MAX_DOT_GRAPH_HEIGHT = 1024 MAX_DOT_GRAPH_DEPTH = 1000 GENERATE_LEGEND = YES DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- SEARCHENGINE = NO gsoap-2.8.28/gsoap/doc/fonts/0000755000175000017500000000000012653650144015301 5ustar ellertellertgsoap-2.8.28/gsoap/doc/fonts/inconsolata-webfont.ttf0000755000175000017500000012614012653650144022003 0ustar ellertellertFFTM]kZGDEF8 OS/2mNX`cmap@cvt 8fpgmS/egasp$glyf%8,headn6hheaAs$hmtxnilocarmaxp| nameA,Upost7n3Tprep{Ewebf*SX=Yv|33d  /kPfEd@ % & ~Sx    " & / : _ !"% Rx    " & / 9 _ !"%pL7  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ardeixpkvjsgwl|cnm}bعyqzzqv|fR]D,KLPXJvY#?+X=YKLPX}Y ԰.-, ڰ +-,KRXE#Y!-,i @PX!@Y-,+X!#!zXYKRXXY#!+XFvYXYYY-, \Z-,"PX \\Y-,$PX@\\Y-, 9/- , }+XY %I# &JPXea PX8!!Ya RX8!!YY- ,+X!!Y- , Ұ +- , /+\X G#Faj X db8!!Y!Y- , 9/ GFa# #JPX#RX@8!Y#PX@e8!YY-,+X=!! ֊KRX #I UX8!!Y!!YY-,# /+\X# XKS!YX&I## I#a8!!!!Y!!!!!Y-, ڰ+-, Ұ+-, /+\X G#Faj G#F#aj` X db8!!Y!!Y-, %Jd# PX<Y-,@@BBKcKc UX RX#b #Bb #BY @RX CcB CcB ce!Y!!Y-,Cc#Cc#-DdU./<2<2/<2<23!%!!D $hUDqdXG+ +/ִ + ++ / +$901$462"47>32#.qGdHHd2 17 %g0dGGdG4$ ",, 3-5EK,UL/3 +2 /ְ2  +2!+  99999017654&54632?654&54632, 6"#9D2- 5"#9D1g>3V89?@H>3V89?@H3+3/333*+222 +@ +/$3*+ $2 /ֱ++ + !+6?Z+ ?X+ . .  +++ +  +  + + + +?g+  ++++?g+  + ++ #99 .......@ ................@9901??77777?3 *)|+() * -|-,x+)^]a[Lc`woaYz519A0/-3:20 +@0/ +/7/$327 +@ +B/ֱ2 2/+6222.$:$2.=+2) C+299)=99019%)26A$97901?&'.546753&'4/&'#5&>54'&'zX fI(=V*sX  F|nGox&o"&[\/_pf#FzmHK? o{ No  Uu& [Mm|x^@b \xHe8: (3 +'+, ++2"' +2 ' +4/ֱ+  +))/+%5+ $9/) '"9992  $%$999014632"&332654.#"4632#"32654&":^_$Ê5*"!&>$&?\^_^_ B+)@BRBssqk1F GP3H H$⚙ SOJSYLLJ #0;j!+3'+9?>54&#"Jvvtxe? EVxq@dkP&P;/ Q]d{GUT:8Q+w@rvd7H][|sZObXs**a5nd(FGZTKU*/ +/ְ2 +  99017654&54632- 5"#9D1g>3V89?@HgT/ֱ+017#"&#"&>  Ch}j\ykS /ֱ +01654'7'*nls2(zU&73% 'U5J E7pp ӄj  ͔}jYT[3\/ R/32 +@ + +@ + / ְ2 2 +@  + +@ + +015!3!!#\j^T}^}Rr(/ +/ֱ + ++0167654.'.54632R9.E19U5K0%! */F^L@r//+015!@pb5+ ++ + /ִ + + +01%462"&pGdGGdG_0EE`FE~Q//+01z}l>f+K+#+,/ֱ )+ -+) $9# +$9014>32#".7.#"32>54'fHuM;tiO/1Pjp9MvI(j70aQ3L)o:#HG6"t\6q֓g0YqERTD|S[!Lngne%++/ֱ +901%3#NcOML.]+(+-+// ֱ  +@ +0+ +,99(9-+9!$90135>7>54&#"'>32!276Kx"B!)fKsh8m(M=.GD+:1 ZlA1DH%fH, S`oіAyjC+BC2GI& f.U,+  +, +// ֱ)  # 0+ )999&9#99901?32654&#"527>54&#"'>32#"&l 4K)n#F@H~`\O32.'.#">32#"&'&732654.#"68{vc  H&"CZC2*SD}b;՗X6` vY(CL)GE𙞞tn!>f|GS9haWROxD!\t )++ /ֱ+9015!#6ӁqvVw}EutOhB{ "1j+ +/2/ֱ #  /# + ,  3+,#  $9/  )$901467.54632#"&73264&'>54&#"{rXjȑo]n⧤he|^z4.BBMbvUSqAm6-]~\12oǢ`''2/X:, )HPpj!-r +++%  +./ֱ""+/+"99 (+$9)9 99+%999014632#"'7326767#"&732676&#"՘m/,67|tc P)L'.,O΋\E*r\b鑒tn$VZqAIḇUGpbb9+ +/ +/ְ 2 + 2 ++01%462"&462"&pGdGGdGGdGGdG_0EE`FE0EF`EERrbP/ +/ֱ  +/ 3 ++ $99990167654.'.54632462"&R9.E19U(GdGGdG5K0%! */F^LF0EF`EEGa5 5Gi4^j8\\/// +015!5!\II\~~~~Qa75 5Q:caj8cyS"+d*/& +/,/ֱ #+( ++-+%&)*$9(9 9&"$901>32#5467>54&#"462"&Bu4!: 9 ">A-{\N1HdGGdH}eqӗ.S8</3[BUURqDB&BF&[~`Q?0FF`FE@5G0+++ 90 +B0 +H/ֱ%%+6 6+@22I+6 +0$9-.99+-9999B%999014>32#5#"&5467>;4&#"327#".%3267>=#"@yc7Oi@^D.R"1;X Qߔg-xk.nL?aN`oU$rBӅs}V&CcU.hmC]0-U0<'8 ,+3+ + / + 9013#!!핍k|Yuc#0c++0$# +$1/ֱ$2+*  2+* 9#9$ 90 9013!2#'327>54&'&+5327>54&'&+cj2>Z%XagVkpe)bC8l9AGLEB}v;;AD>9p&X\#$pe+}vFG|!y`89bS'>!++ !+(/ֱ)+ $9 9014>32&54654'.#"3267#".S@c~@4 (J͔K,j}YKn65qK)NF q$|HM,x G+ + + /ֱ 2 +@ +2@  + +013!!!!!xy]&~ @++ + /ֱ 2 +@  +@  + +013!!!!#~o|J)p$++$ +*/ֱ+! 2! +@ +++$999!9!9 $9014>32&'.#"327#5!#".J%>UXdR(v7e ST0@ybwnlX[Fb<ot†i>(rcg CT^Yx։pN0| AD(`oO+3+ 3  + /ֱ 222+ 2 + 90133!3#!o  " 0b9 G + 2+2 /ֱ  +@ +2 +@ +2 +0153#5!#!y xxxwe H++2!/ֱ +@ + +@ +"+9901?327>45#5!##"&e_*`0a6 G+]Uvu'/Q6"J*xx(32#".3267654'.#"<<]}x=n=NLz|]R'@UW-F*92)L+SS?( _%zvz|(auxP!UXy|gcJmxD++ +/ֱ2+ + 99013!2+!27>54&'&+x3@X&X_^V%U>1a36@o< ,Ci+>/2D/ֱ--%+9+ E+%3>9999999 999> %3$9014>323267""#"'.'&545.732>54'.#"<<]}x=o.q6G/z;mlN1&@TY/%IVA,4*L,TT>'_%{xfx01  = 4hؘu{S#CjyӁibJos[+ 3+ +/ֱ 2+ + 99 9 9 9013!2##327>54&'&+sx3AZ&V_t'a36@oj3^1++ 4/ֱ# # +2+5+#99 '1$9+9 +$901?32654'&$'&54632&54'.#"#"&jU /bk&Bܩi@Z 'Vi}+1cA_ZxϏ<J\////ֱ  +@ +2 +01!!5!!9IA#z9-+ +2/ִ ++9013 9,m 3fG\//+01!!Gs'}xs^( / +/ִ ++ 9017&'.'i7!@ ->1'+3='9;)!jkd{!9i++%+0 +:/ֱ""+,22;+"9%0$9999017467>354.'&#"'632#5#"&73267>=#"#"#"#"dmj7[e6dHn-kYQ&" ?  YRSS'#$%@Zh]PK1eGg~vB`F(F*!>`zS0W++! +-1/ֱ2'+2+9' $9-!9990133>32#"&'32>54.#"z ,YGmADpJT.47)1>/ AO;));P?FtS MY;rvzx?OD|z13M*-G~R^P2I?s3++ /ֱ!+$901432.'.#"3267#"so8h *4R-G/UBc[Rz#% ;6cHL\S3[++$+// +@ +4/ֱ  +)22 5+ 99/$ 999014>323#&=#".73267654'.#"\0Nik8_"  ,ZFkA#6HD"LWZ.,TP1gmIWJ4  ?6!'QO\32!327#".7!654'&#"dGyV=piM h-@UO)^R;f`yE"JZ;:P~L1iOGJ?v\GU>t^"R!+/32/ #/!ְ2 2 ! +@  +! +@! +$+ 9901535467>32&'&'.#"!!#!0djC lA9B80V;+ Z"GJA`[u[*\OrLX5;q,t,yyyna'V\Y*LYTx-GX;.- n@'MM9$'CJLN$)0L%? @yyxwQ!H+3 +"/ֱ!2!+ #+ 99 90133>32#4.'&#" 7[Q#"2MB{#Q  RiWNM4.4Q;S/%I3+? _+2+/ /ֱ +@ + +@ + + + $901353#5!3462"wt>X>>XvxvX==X=c?#Y+/ #/ $/ֱ +@ ++! %+"#$9 99017326765!5!#"&462"c_ -F'=e.hW>X>>X %>84a zLj5ZaEX==X=Q-+ 3+/ֱ2+99013; #"(F5u,X{S   s_Q <+2/ /ֱ +@ + +@ + +0135!!5!!vdw%vN.j+"33++ 3)2//ֱ. 2.#+" "+0+#.9" 9 9) 9990133>32>32#46.'&#"#4'.#"N"f8>\ sDa14=0' 0B/\3@M;>JJV-;e)  4TARZ!$$W6PtG+ 3++/ֱ2 + + 990133>32#4.'&#"7[Q#"2MB|#RiWNM4.4Q;S/%H4SD++ /ֱ+ !+99 99014>32#".732654&#"SHxXQuFEuTXwGuoprjJ@xuqzCI~t̼z,S+++(/-/ֱ22"+ .+"99( 999013>32#"&'#32>54.#"z0ZGnBDqJU/ uFAQ>*,=S>GwLX:qw|x>OF/TTLV>C,GTaN1 J>:W)S+++%/*/ֱ+ 22 ++99% 999014>3253##"73267654'.#"WEsN*L6--YmKG1[M.su?#" O\`R32.'&#"˚,keE 6e:HIajgF B0/W1$8u6`5+ +&7/ֱ)) +08+)99  &-5$90!"999&  0$901?32654'.'.54632&4'.#"#"uT ?If^(6$0ȟh@V %XQt]$:3^\27SAK,; )+=!lLG0QI7E-I!M6gT3#+ +3#2$/!ֱ! +@ +%+6?+ #.  ##+?+   +  +  +  #9 9 .... # ........@9!990173?!!327#"'.547  2 Y;_r.F/x n,+z0NIUtid$`C7!M+++3"/!ֱ+ 2#+9990133267653#&5457#"&'.!`8Av!% .X]( B73+ .¯+ . ?P+ .     ......@  ..........@9013376'453# # Z: <_]jtQ-*^a &+3+3 / + 99013 33 #aIX[8l."2+3!/ #/ֱ$+ !9990173276?3673#".L5I:!  4'7%,Zy =#JE  Ohc1fg 5+ 2+ /+9 99015!5!!26gC-# eŁe9lDP`=/://3Q/ ֱIL22! -022R+:=E9-I99(9 $999$9015327654&547>:;#"&:;#*.'&54654'&#l(]-5e")/48>GG/!R .d!76T !- 9LJ @6-$r6*Xr/7w`\  t 3_cA_+ *GwL!p: s  X*5)E8/ֱ  +013mPV-/.//Q/Hֱ9<22  22R+.-%9 <99A9E9990153:;#"*+53:>7654&54>7&'&54654'.#>84/)"e5-\(*X*6r$-6@ JL9 -! T67!d. R!/Gt  \`w7/r)5*X  s :p!LwG* +_Ac_3 U4+/ /+ 999 99901>323267#".#"U/T/S<7? .N2^1W.O95@"]MQg -- ADNLq"/0"~qdXH+ +/ +/ִ + ++ +$901462"4673#"&'&qGdHHd:%g 17 dGGdG.-5E 4$ ",, c_%,+!// 3*/-/ֱ& &"+.+6&!"."!.ɰ6?u+ "! ""+?t+ ! ! +! +! + ! +?+ "#"+)"+*"+#" #9)9! 9 9 #).....@   #)*..........@* $99014?&5464&'&'3267+'7&7c SZ :__J5JAevp_Y.   t  E3<7cGL*Ã&P66+03++46 /( 6 +!3 27/ֱ$ $ +@$! +$+ / &2  +@ +8+  99$"(4$9(4-99 $99  99017>7654'#53&54632.'.#"3#632327#".#"P;&'GjӔqZ  I'Y˰KF8UB7jk6y?je nKuC@hq x9LuvQyU9jU-.MPt8!r/!/ "/ֱ+#+$9 $9 $9$9!$9  $9017&47'76327'#"'264&"s:;tItRhdSrIq=Nn54'.'k6\5[o^(5\KFCe0sbIPjm)dXTDACŘgrn!""(v~)4@}  #1#_CZ7?MyDo+|AwaTg,M]A^:5/z>?l,~D{\b5'B'g:( F!Q//3 2 /ֱ  + +01462"$462":;54'&#"'632#5#"&7327>=#"&"j=<(4? H'\}BGeV^|hH9WE" <#2><7oo7g  G"=ZTtEB2aAEX}^-@A:,$ C}4 557OR07PR0.URY0.URBP0/ +@ +/ֱ  +@ ++015!#E{@r//+015!@'=)4 /*+(/**+(* +@( +4/*+/*+5/ִ++)+*2)/+!+!++6+) 99/ '$$9!&99%9(%&99*$$94!901432 .732654& 32#327654'&+%dO]\128C5bjI!).!Ie12Ql'VS17WN,-"//+ ++015!ss!E/ //ֱ  ++ $9 99901462"&72654&"梢~Z~ZZ~Z q⢡tD``ED``\# _ / /32 +@ + +@ +/ ְ2 2 +@  +2 +@ +2+015!3!!#5!\j^K}^}e4%R/ /&/ֱ +@ +'+9 99 %$901>32!276!5>7>54&#"-^x_pu2u (jEi37TF8a oPZ_gXO]8 Z7m:Q*J+3J2%?0X.//*+/"1/ ֱ+ %2+ (9+999(9%99901732654.#"532654&#"'>32#"&_ R,Kj #M7([OVC4f$K4Nq@4AV|Tj &  N7"&g>+0I2-L=BZ8W d@cF- / +/ִ ++01k-W1*\%+3 2+3/+/ֱ * + ,+%9"9 "($9016533267653326?#"&'#"&'1([28d*8 7 ^6@`#OK~ p r@63!###.nd.qH@wza+!j p0b./ + + /ִ + + +01462"&pGdGGdG0EE`FEB] + #+ +/*+/ ִ + ++ 9999 9901732654'&+73#"B3Zq5)7<X "3=viUI aA<\d +/ֱ +901%3#Yyg37gG////ֱ+  +99 99015!4632#"&732654&"]9hU36Zl:|oKJomn7oo>.WY_[/Ƭx{}}4 7'7%'7P7"P7U0RU0 qk  /3+2  +@  + +@ +//ִ$++2+2 +@ + +@ ++ 999 99  9 $90173#7533##5'35 Fhxa}H?gg]x)s7h:nNL kk //*+2)/*+/0/ִ$+&++& +@& +1+ 99& $99 99) $/$9 9990173# >32!276!5>7654&#" Fhxa}$K`{MZ](*  6 U6UUC8-Mx)s7@HkLRF@J- gH,W.BE:);(qx.2=@+ +)+3/93>+723> +@3< +>3 +@>5 +,/*+/+0/0 +*+A/ ִ)+ #+)?+<27+:27? +@79 +?7 +@?3 +B+ &9?)>970599,>@99&9#1$901732654.#"532654&#"'>32#"&7533##5'35L, I@E6*Q<)r>Z}3)4DdCzca}H?gg]iU5>,R2"&;($<15hH-F O4On8s7h:nNLS"+u + /+/& +,/ֱ +  (+$ +$/( +-+$9 9  %&*+$9 999014>7>=33267#"&462"4!: 9 ">A-{\N1hBuHdGGdO.S8</3[BUURqDB&BF&[~`Qaeq`FE10EU ,+3+  +/+ 9013#!7!핍k|wQ90YuȏUU ,+3+  +/+ 9013#!%!핍k|9Q+Yu~U,+3+ +/+9013#!%3'!핍k|& ,C8YuNj"%L+3+# +// &/'+#%9"9999013#!63232>7#".#"!핍k|pw&J=* L/ֱ2+'?+2@ !"*,78$96/'-99 *99 9014>32&54654'.#"3267#"'732654'&+7.S@c~@4 (J͔K,j4c "3=vil3Zq5)7<AyxY7w_%tC   DPTHEVm OA<\LUI 0dxU G+ + +/ֱ 2 +@ +2@  ++013!!!!!7xyQ90]&ƏUxU G+ + +/ֱ 2 +@ +2@  ++013!!!!!%xy9R]&~xU O+ + +/ֱ 2 +@ +2@  ++  9013!!!!!%3'xy` ,C]&NxO p+ + +/3 2/ֱ 2 +@ +2 + + 2+ 99013!!!!!462"$462"xy[&g++" +%3#2'/ְ2 "2 +@% + +@ ++ (+ 990153!2#!3267>54&'.+3#>c^>nnUzD`1[b57FN5'iv.QԮC(k !=sK*6[vgj ) +3+3+!/&/*/ֱ + 2++ 9!)$9  999  99!$)999&9999901333#63232>7#".#"gr6pw&J. L=X5(M4A%7+O 7% ! . RKF0;09E<U*.I++%//ֱ + 0+ +-$9% 99901>32#".3267654'.#"7<<]}x=n=NLz|]R'@UW-F*92)L+SS?(YQ90 _%zvz|(auxP!UXy|gcJmƏU<U*.I++%//ֱ + 0+ +-$9% 99901>32#".3267654'.#"%<<]}x=n=NLz|]R'@UW-F*92)L+SS?(9R _%zvz|(auxP!UXy|gcJm~<U*1I++%2/ֱ + 3+ +.$9% 99901>32#".3267654'.#"%3'<<]}x=n=NLz|]R'@UW-F*92)L+SS?( ,C _%zvz|(auxP!UXy|gcJmN<j0Fy+7+A(/-/G/ֱ11<+ H+19<$(0$9 %9A7 999(+0999-%9901>32#".63232>7#".#"3267654'.#"<<]}x=n=NLz|]Cpw&J. L=X5(M4A%7+L'@UW-F*92)L+SS?( _%zvz|(a% ! . RKF0;09EuxP!UXy|gcJm<O*2:l++%2/93. 52;/ֱ,+0 04+8 8 + <+40%$9% 99901>32#".3267654'.#"462"$462"<<]}x=n=NLz|]R'@UW-F*92)L+SS?(327#"''7&&#"3267654/<<]}x=j^nqNL54&'&+x Lo6X_^V5kIa36@oqZ4t++"/#,/5/ֱ44+ +))/ ) +@)" +6+)4$9#99, 90134>7>32#"'732654&'&+5327>54&#"q.kWLsڞw^I;OcK
;:$:H\4c#b;54.'&#"'632#5#"&73267>=#"&7dmj7[e6dHn-kYQ&" ~4YRSxgS'"$%@Zh]PK1eGg~vB`F(F*!>` W>d{!59k++%+. +:/ֱ""+,22;+"9%068$9999017467>;54.'&#"'632#5#"&73267>=#"&dmj7[e6dHn-kYQ&" ~4YRSS'"$%@Zh]PK1eGg~vB`F(F*!>`7-Wd{{!5<r++%+. +=/ֱ""+,22>+"9%068:$999999017467>;54.'&#"'632#5#"&73267>=#"&3'dmj7[e6dHn-kYQ&" ~4YRS',`S'"$%@Zh]PK1eGg~vB`F(F*!>`' Fdh!=Q++A+J +4/*:/$R/ֱ>>+H2212S+>"99@ $*4=AL$9/099J9999*4"=99:1899017467>;54.'&#"'632#5#"&63232>7#".#"3267>=#"&dmj7[e6dHn-ipx&K<* L=X5!>1-3%6+0kYQ&" ~4YRSS'"$%@Zh]PK1eGg~1&@ . RKF -. 8FB`F(F*!>`d{Q!5=E++%+. +=/D39 @2F/ֱ""7+; ;+,22C ? ?/C G+;7%999?0999C 9.9999017467>;54.'&#"'632#5#"&73267>=#"&462"$462"dmj7[e6dHn-kYQ&" ~4YRS=V<`V<$+>C+;+;+,22H+7"9>9C%089<=$9; 9.9999EA6:;7$9017467>;54.'&#"'632#5#"&73267>=#"&462"'264&"dmj7[e6dHn-kYQ&" ~4YRSXnmm2F22F2S'"$%@Zh]PK1eGg~vB`F(F*!>`Yjjj'67N666IU.+43(:2+3 Q2E. +"3J2!V/ֱ7 7C+2#J2#K+ W+799C 4999#199K(.999 *9E(*1999 !9990174676?54'.#"'>32>32327#"&'#"&73267>&=%54'.#"_\L{- Q0+SH+|EJy!"uA;o$Vh=_7I,{CN*!|JoY?,J,l2023B'J3'T)"5D%3=/)Z6;D;;D;<)pEAN_Y.;DJT4:KBAL|B^2.&5 NT )S,+0M;ds5r3+3+%/**+1/+6/ֱ-+"7+-@ %'23$91*"(99$901432.'.#"3267#"'732654'&+7&so8h *4R-G/Ux "3=vil3Zq5)7<[Rz#% ;6cLA<\LUI d&*C++"  ++/ֱ 2,+ 999014>32!327#".7!6&#"7dGyV=piMh-@UO)^R;f`yEq)QP"JZ[XP~L1iOGJ?vs>tW>d&*C++"  ++/ֱ 2,+ 999014>32!327#".7!6&#"dGyV=piMh-@UO)^R;f`yEq)QP<|w>"JZ[XP~L1iOGJ?vs>t-Wd{&-C++"  +./ֱ 2/+ 999014>32!327#".7!6&#"3'dGyV=piMh-@UO)^R;f`yEq)QP<,_|w>"JZ[XP~L1iOGJ?vs>t FdQ%.6++*&  +&%/53! 127/ֱ &2 +# 0+4 8+#  %990*$94'(999 99&9014>32!327#".462"!6&#"462"dGyV=piMh-@UO)^R;f`yE=V<"JZ[XP~L1iOGJ?vhV<t@V<+ H+2+/ֱ +@ + +@ ++ 9901353#5!3wdvxvk-W+{ J+2+/ֱ +@ + +@ ++ 99901353#5!33'w,_vxv[ F+Q l+2+/3 2/ ְ2 + +@ ++ + 999901353#5!3462"$462"w4.#"Sc=s%_r^T#P7hu/YT36VX,5cR1%k|Ja:P3"5K=\2څ\d&QʓK!,Uth7u+ 3++./$4/8/ֱ2 + 9+799 $.4$9 )+99$.7994+2990133>32#4.'&#"63232>7#".#"7[Q#"2MB|#spx&K<* L=X5!>1-3%6+RiWNM4.4Q;S/%H4&@ . RKF -. 8FS#G++$/ֱ+ %+ "$9 99014>32#".732654&#"7SHxXQuFEuTXwGuoprgjJ@xuqzCI~t̼W>S#G++$/ֱ+ %+ "$9 99014>32#".732654&#"SHxXQuFEuTXwGuoprjJ@xuqzCI~t̼-WS{&G++'/ֱ+ (+ #$9 99014>32#".732654&#"3'SHxXQuFEuTXwGuopr#,_jJ@xuqzCI~t̼ FSh.:u+2+8&/+/;/ֱ//5+ <+/95!&.$9 #982 99&).999+#9014>32#".63232>7#".#"32654&#"SHxXQuFEuTXwGgpw&K<* L=X5(M4A%7+&uoprjJ@xuqzCI~R&@ . RKF0;09Ec̼SQ'/o++%/.3 *20/ֱ+ "+ - "+) )/- 1+)%$9% 99014>32#".462"32654&#"462"SHxXQuFEuTXwG327#"''7.7&#"326'SHxXQOLmQEuTdYSj[GPD;28r=@oLjJ":qzC.7B}dE $Ne#K+++3$/ֱ+ 2%+ "99990133267653#&?#"&'.7!`8Av!% .X](g B7#K+++3$/ֱ+ 2%+ "99990133267653#&?#"&'.!`8Av!% .X](" B732#"&'32>54.#"|0ZGnBDqJU/ uFAQ>*,=S>Gw$ LX:qw|x>OF/TTLV>C,GTaN1 J>:.Q"*2r+3!/ */13& -23/$ֱ( (,+0 0,+4+($ !$9,99.199 !9990173276?3673#"462"$462".L5I:!  4'7%,Zyf325!!!!!!5#"&'&3267.#"E/IdD&U*@gV).9W*5Q )9!/U( maJ:]&@NLAUE8<$RPu +CQ"+&312+ 3?M2D" +DR/ֱ,,E+E +@E8 +S+E,@  "&432>32!327#"'#".'&732654.54>54&#"!54.'.#" :,L9d!'m :)-U$WK*.SlSW1--1XY(/#:B A;:PXoTSN;w]MI,$NNCsD '2>9LC+*E&'4;::Od++3/3 2/ ֱ ++ + 99999013 3#462"$462":97#".#"pw&K<* L=X5(M4A%7+&@ . RKF0;09E@r5!@@r5!@@r5!@@5!@@5!@u(/ +/ֱ + ++0147#"&uF;,E19U>6I0& */F^Rr(/ +/ֱ + ++0167654.'.54632R;,E19U-6I0&! */F^LRr(/ +/ֱ + ++0167654.'.54632R9.E19U5K0%! */F^Li'N/%3 +2(/ֱ + ++ +" +)+990147#"&%47#"&G;,E19UF;,E19U>6I0& */F^L>6I0& */F^}F)N/)3 +$2*/ֱ + ++'' +! +++)990167654.'.54632%67654.'.54632};,E19Ub;,E19U-6I2$! */F^L>6I0&! */F^L}F)N/)3 +$2*/ֱ + ++'' +! +++)990167654.'.54632%67654.'.54632}9.E19Ub9.E19U5K2#! */F^L>5K0%! */F^L^ ./ + + /ִ + + +01462#"^eeeIHdddT+33 + 22+ +/ִ + + ++ ++017462"&%462"&%462"&GdGGdGbGdGGdGaGdGGdG_0EE`FE10EE`FE10EE`FE)}4/ִ ++015)7PR0.UR)}4/ִ ++901%'7)P7U0C6f0+++0 +#3%20 +327/ְ62!&2 8++-990173547#7367>32.'&#"!!!!327#".'CRrh1&emg4m3[}i*,!.?3L~]:w6lzaNw N6vwSB`3o[ v:?w}TFDTghBem$}+ 33*+2 +@ +22/ִ+ +@ + +@ +++ 2+++ 9 9015!##3?3#/$Ÿ]PHMMCV>= qRR3ה{pmH5+ ++ +/ִ + ++011!\_<||jn Dq3z:JU\Rpfc{pRG\Q@cSnxJoeWSg<x<sj@g3#S:g Gdzs\dOcNSzWuQ a.glUqcPJ\1pB   Sxxxx>g<<<<<<gggg:xqddddddsddddSSSSSSS.|. :5j5j#H[ uRR}}^H))C$,,,,~."Jr2JJv, * f | " T ( t \ :|6Z$Nd P<p|h v$8N N !J!" "D"#$#$D$f$$%R%p%&&f&&'h''(*(L(()<)*++R++,0,--r..D../b>>?(?@@@A(AABtBC2CDDjDEXEF&FGBHHbHHHHHHHHHHHHHHHHI IINIIJ JJKKnKnKKKL6LLV r 6 6  L LX $     0Created by Raph Levien using his own tools and FontForge. Copyright 2006 Raph Levien. Released under the SIL Open Font License, http://scripts.sil.org/OFL.InconsolataMediumFontForge 2.0 : Inconsolata : 7-2-2009Inconsolata MediumVersion 001.010 InconsolataWebfont 1.0Sat Jun 28 16:52:12 2014f  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a bcdefghjikmlnoqprsutvwxzy{}|~    glyph1glyph2uni00A0uni00ADuni00B2uni00B3uni00B5uni00B9uni2000uni2001uni2002uni2003uni2004uni2005uni2006uni2007uni2008uni2009uni200Auni2010uni2011 figuredashuni202Funi205FEurouni25FCKPXYF+X!YKRX!Y+\X E+D E++D E~++D E++D E\++D EJ++D E++D E+D E +Fv+D E +Fv+D E +Fv+D E :+Fv+D E9+Fv+D E*+Fv+D E+Fv+D E+Fv+D EL+Fv+D E>+Fv+D E$+Fv+D E-+Fv+DY+S*gsoap-2.8.28/gsoap/doc/fonts/inconsolata-webfont.eot0000755000175000017500000005307212653650144022000 0ustar ellertellert:V\U  LP/kˡInconsolata Medium Version 001.010 $Inconsolata MediumBSGPr4248+B`WhKqJx"U:r,/4\ liʚELFMC>^+H,'mSfZ}o6euX6H7I5ۦF}f.Lx/R F`H0sKL e#fɩd4P?a?H g,WWA&/),sAFn%ؿtЃ71/GsX<=9o/_ gDË|h(E'T8XmfQ8'UJBhTmE20h.Ŧ3C3΃Z~nKP"b0E7<ñj0 b9Kw I7(JeX<ԗ/<;)QKIH@>AElLY<}!$b1$ v)Ak4 !8? di2ݯq@К.H'E1'?b JQ 0=xH r%\z' 7ƀnrHl/ ˆ_p?b17 Wv߮Nmqa'&+X7_e%pU SfMHSbUռ"L0, &h[W8R($ekUޅ@?-)PPvE6~Ҍdru$2|T6МMܚDI b@ FܮEf8 X}͡33`cR{uWRA=ףUI?w[D6ڻ+e$$w-k`kNHaT7iuKDf!$#U;z hS u2[xqIPs)\+dfkExWe39XazrYTfۧ!6KGD/[q5K.F!6[X[}Ut\#g-Ws cuTQ.VNz!ڗ-{Nx.Ǡ8(2 ,M n+@1He{Jʩ:!AVSjޞa}Bt h5r`\`_OcGn^R5@G/UԦ>Y@.l԰g©9ԡZHWfPridJcH+0SG!^K(ÇG J[z /V;9J9Yн.<>5J0/S%(x $0# _)vǛ) rQ+@hsKy;dYkK¼Mhy;}mֈI;Uzc \u^U|=4k!dHfd"Rd$+V1(ς<>-s%[pnfv`ef{J `9 tV >&TFASeyԥ(ơGH É&srJ_!"҆6 \,Tk% H3Թ:r"6Ę?ڴ&([-38$(PWc CH` h'%Bܵfp$E#٫D*w@OYML6qLw3;9U0_ aRZ` P3?n0aͺn>ZE;,h'[ 55f0|3jE\L5]ISH#Y>ySh{-v8? ^"#qD(rR2RH&ܯ罻7l{DGD) VnHIVR+2Y6a3ɶӼynZ[C9Md-!D,?Aۭ^"G6Vк/-^9š"-E =D/m<8xfeI:'5i%9PeiҫV#XZ6-` x%Hsbbqݹ@^h"((-pԞ:>:/q")m^D{]Ix@1 ~,u\\Vz"\ +܋XHK7=9#NfrR1F~;BJv5`SPFEji3`\w|:aF1UV„PU#%G:Hk|s }WSswL* fݻJ (Z2j+ J˿۬M}32(E,83Jk(&23.X2z3A:&G ?R`]?vXW[J=z! )| ]Uٽ }:({d]кg mc'ܙ" I;>R0} (9=V0${: y"D~ɏR*N9 B;([͠E1Έk0A `K$C1Yhq@F"lTp2| ;F~*n/=i.I<[tց::j`3Jo| u'-1Hs#>?<rQW$A(l̇}`%${?7ހ}kɸI;9~0CW t_3ϛw" MU`}) D0j#凓ȼYNv*mːd, IY~'ha]ȘJ++ޫK$m%X4q N lژh]Ez`jtEgGfYNՄ# CcE[1~x]D"_l<ẩϙE > )Fm}($J%om Ojh. OT3t:>]$ 1ޖ_>{.l,B=רB@CW f&xQ >8hJ2iP'nWbCIс*"4(LD##9%&(;S%&X-6ZHaަ|PC4 4S3T!!h[duou9uU\Ѵ] rN0*M I 9ZEэ%;m."O!B`NdVތPd5.4E'SH%tLmG's H* cWe:-jbX)I@ o03@TZu!.4`]ָڶ*/vN2yxĕfȩmb&b?:Aıf,eX5AV5ː㆜F+`BmV 梠{i+愕nFE#rjG8 ˞wNG[uR|}@~Wq`oJO!Gb@xKH Kۂe&W($I%jNnM1/>%,Z:35 3ؒq\.Pgxֽ~yu@ 01>]YhA3 < Az^d.<^R<`!(EJ\\3 AKEi"Ow't ULl h%[u?D ogi3}\Awhf + Мy&2@yx07K.i](7w*_Eq:ᬌ? a[Kh{eYmsݜ#=Ƙe0HFdx5UèquTvH.Kdu愱w 6xC* $'拓nz$KгyYnɬ(zB#YG/j[[Bݕ c퇾 pq1Yr40ܨgh]cLQBȅt"΀ڡZT*%]'~H 6E9Aa7^!%h~)Oǖ+G"d !]oX)n1D+Pxg#5&:'Jo"-| y(r>o)DH ,mMPf?O 9m. CJ_wӴDK -鎲rR('uY߼)V.{>tHJh~YHFJr8b%3"d-|E"CT45 5Աݼ|B3W ʥl''"Emֵch˲ nkG^,JPZ"%;s[=E odBy+\RmXFs@Z@QD)s^!#%1pd f 0,rHNȴTz*h~57RIӡoq>+] tf`~)!ݺi4u'!iJSQ53e1 02Vݴw0Yz9##H y NHzW23Fx`)ᙔ *ByKx,e$r>ȅaI\$n?IBf`rx۵ě]0B .S50ݡJEX=2B3Kԯ17UVOaEw5-Tu ygڟԓJ9>2=(UKa"^c䔻]pJREUuMp 9C>]F<K$f9Ċgx55KĸUM/pU2G)2 U\6Ox׈G¿laɮo6 o_ ߣPtpR]<,ǑjxE~ JfX)W,y#Dskו4`m6mshfLvɊ@XZd/>k֧b1K9ɎXprF &q_N-5pZ9@8@CP4|~ql@C!<}jө7,e/tFkφtLf7/0@W6CxJ59ΠZK>w.ڤpHr>}Fw3;=Y4Ț*n;+|Y} zǢNc*͈9]a"61ug)"0*ûh$!vhsX,.Zx&'FI#wJ*f hP)Ws(vawvYIeU}7/z: p02.a`ͬ t,o85[".[8{AeUkVh\IA\?X,L8*e T]k܎Qyf#(4s ~,=`Du9ŎNUo=U٣eWFf1uhC& 0cgR`dgߤ(HPmQGj)i+I)tF1"&q; jQ4(9쌶&DmaC|hD2B?bֆh_vA(1ոa\ŬIAz~Jwy*ͅ]:VCf w@TwRq{HBoRiTn'fcph\h!grْ T iEYZ8lhTqݕd ?tU#SGBJ0 '"MXcsmZ2:YTB2 hm9>Xe4>Ad(ǿT?lJr%UܽǓ$1-厰,K=a 铩ct8WL&Ȭs(+@oZ*,YmtaLwY,;=˷^n1[7BC#A+2RSHswX`JH00NSGX)4yyeYkA}+k$î\)<-3n\ PnG&䠠ַفSAdV?&wyXB9@(7C 0Sf: eaS=?Yk/?6I҈ HtEj!˼Bg Ӧ@bG>`Jmgc5Ә! ]% zf_8Q$=fdI]0J,,L0m{P2pg~+NβF(k?T~Cy@ A4-eSâ0Oط\:!Eo\!|Dr`KABe>NQTJ#,iJf˽;&0 0X}[l7n<Ƕ$5WNhr@@j݆/FTd"+xZ0`3͆$p6~Kߙ!, `;\VDYs I2&9Q ( @ZItθ3fBMQ^>  .#VFI٥_O\o TE0 a@!jöAw-$1#h0MW|ͦ2tg=vfES<<^v Tt.'FNРxeg@JY\b 0IHQ䡮0U0W/Dr?24zW WUN /ѯspF_"I vs |$͚a Cӕ8^ΗӠ5AQ!p;y~:Uӌ5.˨Po a6K$F#b44.$ZZjQ-Λ2J?љ,OwGI{gQ8]Љtڪ,.}VuP*zW W`9ADGУb6``B^DCUSm1A~ɉ<F|CSnˋDVKHrq)V)GPye0Y &¥]Jt% 3~ZQOo`~>VPtm j%ր B}@ 7ZlXC-QiǪR>Uqzdڣ gBfah$ RjcҮ nƳ@hڑw];șUoq0I,r˹tr"Vc\egdrt\FEa;<2_Ō]r`Hi(("DzЗ<=b_6a!쨷lb,m6GMϲrt TN83-N9c|D>)^d1+HM31cݤH0L g?d^Q'7cgΌv'oSRmMbE Q:_!$:>,v3c%:NmGQaQ~4Fnh=l+ ,ujRp>\117Q@aQJR` WZM5w&:}jAe1Z/pAL5Ck@JQ0l*u(h@tP~ɶ)FITHH@W\ / HL/ Vk7P;" y{JhUul>$u[JGrļ'9\dn>8F?yjKmnno~+\G k+E8rHh]W\!o:p7x&R _֢b$HwËd"Xiw̗GȨhƝ_ /Lc`b,-eVe a%LFr1T\An21Yu[!_g*hqJSŨhbp^w%%4 bR 8j. b* ~#P"=WBl#~H2&~X-@V/ʸӅ΁.&Zdon w+ G*813R+r˽/yA0: lM#;+?nSئހqAڐQHL)X Cf?*z{CXԙa^9#ͭaaQ\O4a$pb\:*ъV=TQ-q+ϸoҴY-,.:Q/)?d;-w':tRGc=YmV\*űCE,^! [zLWf %MH")łAQ~V'xTVXۗ%0$+% ,bg664Qk?yر?cp)A욌-'fFf6/̪ -=`eO&l:YFd&t_ :R`0~mI}Htv Pp}*ԇb-kDb|b:Rn^$YпJ\e*r!xj5`<8p-r1/bhsBYУ \_@2RƔ"<(EAP2k0=x hby;nݣgǁ%(iZr"Vʜ=}~gDizPy8E>ѭx}~BzBzN2tkb?Ɗ.qY}`0L3L !~!4aJ&JX:`V8@!ҁ;(F̩V ]-@[m*w@ɬť[4PUP<@0  G[j9`ǻkn-~G^bJHQ„`:SeM=L=PIga53H !`-j$ ہ-HbT\(2'/6aURT!UȖζ7֕!dQH+-PaC"qh R` ?`1M d|P_:3 "(@PƐϣ"(䪽jE_e Y]k=cb=V]ck-G0l?UlզBƞei"dTI"|=j-uި2ӽAJ9`!3p8̂LhDq " KKCTݴw''t o.G-9b xI幚{G t`.q 2ty=PI^HӪXyǑ8)$ :t+@-6CdA|Zɽ&L,1<עqS SkSۄC[n ^_̊?߮P,K5r*xHE,޶OFQOT|Z@1G3ޞ"dĤ B5'|f:,hx[B!^ҿ,p(vwMNzHڐ|A$vWRH'nW΁j^6;c5 .`[P x`sr6T*ڼUϛLJ!qu blMI?L.(OJcSVF*$pWf jV<#l$G1 =ڀO( b~l9!EQۓ+SlS;*Ct6 ;XSyQ&D\1-.4)p|pthqsyev FՍ|LLA;`EW+FoYAFFcܶfi+h<,ˍLtgan3|@X˜ֆ̡(B-l[YԦaho[\ٗHzU,Y/_66Lj+No@X0*li=mQGQ(i9\rd xEiX t& ̽]c'{\ ==6-7'$9C#EҎ4AF̆+SKrۅW-H ѣwz?,Z(XT+!\]fR޾f qj(DKT3)LW/a9 ۴FlCtvDo5,1ڸl71g.v $l +9,\ 102wE4tXGYkehHLR.,ÐM0b>絽8Ͳ%l$ʘmZleч+p7cMw:(z' ARϹmtdLxX'!u=+Ab[I Ny@oHǿ%*n4` F M(H𹃎J0Hy|rku][GGFWb=ֽV :-C4~c$_FU sKS wjn`v2ȤE0tG@m"R:hPBX!ռjaE1gZe[ɰtw >c~-*M( `SLFq˲r^n1s ȲR  :=W{Iurn_İA{5y9X:0g$T{E]KzV5=jkbhi?VqLJ$oHY qBaxӀB >%Nƍ%IB`ƹPtG.nU#E>&LW qlq_@Z?;l'q:3 \%o҉t# 71 rI/ȁf_.@Pk [ 嬱!eǰy kP(b(+h=یzkmP:v4Fg %1ΠIHVMDWҼ`-1Kԋ~é(1 YV"~DoaHۄ\"`v-t2gZXjV;2r. d3߄a 6<fԎ= wOW@Q Prf>pYz߂z\C d?isސnuu2Fp`\S`i~X`Yu4 s {/Ps/Ŵ,UI Jg,Z.7YslxEsSst+.Eػ5'Ƿu^uI~ }1H[F (Â-?g줥+koAKb-m e]n`ߑ R4*K3=l c䔉*~fQk&Y,i>ʃ['3hs!oBY~V2f zVA1ͅ5NNj ~eƨ-#DX}ԥ)9ꖺI/VUP9{eҦ腒#֚ԗ: s(*uBC!d/ Cg3K5O%h<` -p@!:I62`Y 93y[,&?mU+뮪05,;خq/ 2?Ez؂CG DB{&Mv`P$c"7ÚHo|H 61-^5丄&;䞱t@SN"H4lo!87ppl+> ҮRަd@ D%?5Y0^#ҝ6O/A|51LqJE;eQG a`36JC٤R~}U72b:߇zFY$&bF R'+wji xdz2,)`@) Spe> [3 =s}MM\1Jm0?Ff_  PP\%&b܈Xk5TSᲯ@-]CdvMH1&`Ij=`wn]g֪=v̯A$hdbpP LpP绵`ԍE2OB] K#i_C(X~A֑6Sx[qzF%7PlӃFR$}# \tIfJ^dt?Mê:ˣoG#SrD5@Ûz-4URQۊ^ >1R {cLॳn@lzF;19i  5K(ոFP]u5/e.r:ٚ@fQ iڵe<{txYtDU1`͒#YPMWN%t]#31EAs5/H3qvex06B_#\Z> xz 繻mF>9sH d'-wEੲSyo.!bPSp%H+Hn D^&})pN&f+YǛ[SCRtXY97Кd ߍ?,行QP L?k$N +=D*i an[XQ\S6Hl L˛x@ Fې)p]&BiYlw煐R j:y{7v1#[&݆[lj3`LE+ː$ #@NDk?_`Qp,_6A@wѵh9QM@w禺3> 6zSyɵ]|E32Ghh *5PA`x->$. ΢^1 Q!%mlS2n{ @},y5H" wGݫ%N'Sr+`T? 6 *1Y *B+r=|r0{d^9V:L N5r~5,AlmyWɘF] `pm^¯$'IxS'{I@WVx8S+ce2Qc 4O zj?U WNsaǵ.OsCkI 5L<xFZ yf2\GE63%(Fq#gjݵ @q7 NZ:b-`8F'R4żGt+ DHwrNUAo kzi ْ4P5!M#4nR]2y@x1o0ꗪnFM-űLzfķ6"2[#x;G RKIԍ 'Eq_L h:ގ?c0-kZ"e13bo>XW ++׈pX.3Jٱ݈mb#;Ex%Lx*5;Ɉ>7NȞ+KZGb)۹'wv0`~j@ rA{Őm/Dp֙||N[ HGŋ$P,H 4ǶE;4]j_u>/B}kTc9p ̀4Ph5MQXAGj\>D67_dg`9 8nT̅EmJ m,:<"$| E!TTƠ&0RCQg; -tb2(qyDh^C)uC MQi7JFC)-"ڨ0lK >G+Fr>>ZbB SC7̣@L dd)8o&@SO gZiYI ĬNS4=,4Ѿ65ݲx)20.WQMaͳ|_Tr&na&-Kiܒnh8'p <3M;%{A}!đmp Б|H6$GI DNjAڊ3"gYדC3TxI )ŝ5%3@\WDq!_ :(QK$3pӝ :qn&f#%;`܏aXJ5\ago0A\AElb]؅Z- ަlߟJ%"`'V$3s!rbqkb9s8`<3zvc3g Ϥ0G QzLסX5ՑëcPcFv2B4%VKۦNyRf<}P)"u̿Xoą VL2x4o"wM frM&#= JPiEj,fAR:<4Ā ^HHnZ9w[hƈcؙ{ 8 ^$ԃ.۵|@:U9 kj h oJNk[49w~ ͏Gh9}ϺS[Y#HDT[XS \9 ^U[ 4g&xh(TG0jcw hP=Du(8QB (烆lp غ|#!*:Z/Iӈ31ɩd^~Gy$TLx.%"7Át\W?XFy/Ar*q<YdQ 2@6l_־bάS?W-jv"rC<渆EԐ4~dD0?+CSL04!Ҟ%?%He(sORߓ8(rSLpPT4;')ˈ}gX4luJWO@y.@SA`r8ł4kڀUpzK~2pdKT.bDX$L"B7ngsoap-2.8.28/gsoap/doc/fonts/inconsolata-webfont.woff0000755000175000017500000006214012653650144022146 0ustar ellertellertwOFFd``FFTM]kZGDEF OS/2Y`mNcmapx@cvt 88 fpgmeS/gasp|glyfW"%8head\16nhhea\ $Ashmtx\niloca^Ηrmaxp`H name`hQA,Uposta7n3prepcE{webfdX*S=Yv|xc`d``b `b`§@1!xc`f~՘u!{y-Ytի֬]n[l۱}RR3V,,~R1!캜@{IMz7v2!3k4;;sΙ3KʑwkS$6NH덌Zlfu є;j=o)M;Z ;4: !qKͺb00.?R4j˰Ѽ34@Skm!qK˦6$tUS]`*́Vy &ҷ$, b 9@HƼIJ;ㆵƑ6O'ӿZxԽ |[Օ?[oOWY-ٖ-ْmYޝKg ξ;! Y!l-@ߓai3Е63mtJ)} $a$s|r0J5 iH?DevCcᒑ9-Z;Ԑ$x?&z"zRLjѳ2dAܹ9LT3Lh2""RnD"=>K?[ VGBU#ZY+t%ªӮqU&:]N^saB6w\5+ zv󖊕+;Tz|eeXYomq̻$ h73L7##RAl@e4|Hʎ**샒"HHrF<8*k͉d%KBʳ -^S]I:fL>n.[})M4tt4o378 LR2!IHҞϔ$+E$Ct&GH?gqb}OJ3"s.A)", \j,.pz$Ijr^l>#}b3,’!2LP79j[Ufki9pxo;~]f>=|znΘww|G>ss̯2ք`^NWv~XXXdܼ|wAv-!dM7~\̄mjboR=w {]:_C9]ƑBqtR_V\3jOe<2cw_~{^f*C_>>UݑKw.u@h& \ƅJZǫ}h.񼩲c: y;gnԮϮs&h?S3L crP=H- -`PȀ4 JXik*E9 M(PzQv##^eKJ/0>˔uRj8R]ꠉ}82m&D@Pw>׷|n}os +{hhu̪NB;n>塇v|1йH-I`矛[KKMfvʳŇ;bB&PS'mzdewdqB-K=ʭf1vAYm2 z0ߧVv"CHZiu%[V$k7uL-ܵv?9J=V& f:Z]NF0S? ~DJS?\QIT- mc{}C6{jooydV$1$a %L%aD괡$ap IwQb6(MjuV oiRhCg^/.$Y{qovr;CaFiv #XbFG鵆/Vq0[^*a Vf6Y,m~S=5hH/}l }v iz@YLq+Q&k˙3 ZuM$-X&YlꠠkIE[6ˡ_ a.fF"Qsp9=7WX2x-*`B$&iA5!UeT PJҪtE fsu@g\bh& qAXeX-ONvHM'wL_8o- j՚ ɍaU{Bɺ :y?[WZ9薻;4n̥xuW0.|cb@kOP[{d=HZjpj.I r (H##`.RRR !XyD7q9櫎JMh+4Wդ 'x8sNmxl߹u]&/NkήtH8sy_cOa~6b~,@[.eZ(`ZH=&3TQH %mTu: K.)(Y7:􂲢dDq&114-O';ɲ\tWA.=:1>f'dxnG9fx# i I=llMRFer>?\~X]**uZKqXCu,W;}vݸe\{n-U oxs]{ׁԽw;Â)d̖4{V1YS*09f:EcxNjIU֨b|l΂wj Jj|RSZSs7 U+pXMOo{b YP{:GΜwyOXSv;P<(糏4ƈ(m pb-XV[qw~|޶SS?M}?u!; N >>O9Eu'8V_8 ;"q`#"Z/1QszTGr92X=%#/L>x*DA|ݳen}a wkV}Żƹ\虹E"[teϾ'=l42L+99mS/@~Axr5#l$G1(@Y SF@| J,OcpO[ɇxpWy _~)+N~o=Yhb z(A.4a~fˊZꨎv}[=5鞲ކ׷m\U<K6^ct0aZ0ζn=:aLL.S^%3^\\<% fQ0AX|z% `=/΢ RK%Z`!.;ڲsg6w 5<,˧rK.^x+vmp$Ps'n=f#  tZӰV IlTW~8.9[ ڟZt(دGa}0iQƽvLdNS7zLN:`~̀N_|j_j{.{>$ ]Rm".(xnTԘ>yn1o0YSnWLW _7!(gz3X QRU 4T4W"u5]9x7Fhٵ'~cAC؍۾~֦bӖg-Ż6M!{R KO irvLU*\!guHi=,IVF6ߢ6QYltT cvYr^1\r㣄5=̚K!aHYFJ]>]`n 5=5aP"Q9樘tȘ*die0mM˚:Ox]D񦾾K G$8ކZa@ H(. r'iq C6`Mf7EUU<8^UbYɪv|wB-yhvU Fk|]b)ε3v\\{ JEK&REti,!IJ$,K$z%>8Y֤fꔛ\ +QԚg:\³sqGaL}zjn0Q6DFMwZ kXd>HsaDGPJO8j]zuߨ SgueTQO F1hjo%Kjط;Τ>|ve%Ƿ73w?ٳzE~z%O숌0ZՃ+"kqPÃ2x,kPb9(`G ]xvQOS%eUx׿XforNnoS^IWV6MG59)($_F/ZY O74T8]%pH0;bo gokl|#]~ݔʻ-E&n-*l֬ {}fIm}.O,Ց !IxNUkNۙ_m9]ouyAG[a-ϧrAzwc,%B*vjRrעIظl2S3u WW \aIuQ *TJKFLxʘiᶦ=p~Z_bL#CҶA)X %- Yhで< ԍiƁRc"nrՏFMДɇ}ޣ6O7nzG$_&xCok|ɝmWiXv-Kltdjd!L‹_i6 @dA_`XtJy%0>u)(Qq~=8ݲoڷL34-7i-HU/ZAz1b7 d2:xFd&YzAb$WHwSb[S7o!T0FmC-Q6J\&e85YN"D u' {&uC`OkR+vUu(穌hWӉN\⭒ F5V{q9V]|Ȯ79Bؓ"NDؐLfC"S6vkJ_PYw7ʼnn@`kT]2#2st|@*2I^ɌG>C^O%؉/ >kW)W1L:QQ!_TCF'_#2X_b[Ru鸼{O,L΋K:Co>vb ZFQMV` v:jL\N7lPIlŔeX򦼜ʠi 1dzݽk\JЁq/L v@-,@*gNЫRctN b[ˢQL@Hd8h/({5R~B2hM/WZi>X|tK \7ܬTs+;oógkMw >]4sϘv ZYthڤU/㖶zjRnŗL9igG^xՃI\Ĝu쨤A9JIzkPg9R_Eڥd2B&-jqy(9usPм['lkpU\.la|eoI]?Ђk{ȷ5%V̶Շr֥lnA n9=msٶ]̡ ˂+f>c:aɔ%8yr08{JaAIEwQV }?,N^Qgѵh{Agk2 FyC4-6XBJ,4F3Ĩ?`~}\VVty6a:k;3n3efUgG ښ|CB3tIPGCЧvfPtĩz$|ZsY ~RfQ7-ROSbslӯΟ5mj}o;g66mڕCyLR`:UUL`*`Z&d`.Ƀ̈́`f |~j -ڑ+Aw YarU9ۃrR_ i '̹"kRW7Mes]XaAԚ~Au{ϳbks%0i JF7NWđe}6-nf% aU"xLqsO/Loʟ]^?=+=9Y3gΩ6|/]׻hy+vH*Bi͵+G&& @0'F]ǟkµۻ 7졙\m ?I3YL -~-rb-y, Xwvэ dD)OmooxjӖϓxk7{}=O|咽av `eyd#(4;8d噭"k4A[NPb12<U+0WԲFݧ+qxø ?rk0no/hTZ8ݱ37{Dܺ/Z_T5{ieRijt]H2UDk&=eeHXm`VLB#hjLZ bY/6Sg tsڶ;wO &*;:ZUkJBug;pyBrqwճbJ?r_rD!C?YGYd@R V4/JWPs4.cKLI^$sx駗cMfKά[7C:ӤK0^D_yv5]6uT|1`-&^ZqB˞'_'ԛVn^-hm\RQҸ6v?bĞm,\:>y4io2LVdI 8VHF{98u.H*Y0\* \uUu<jeKk[wx=ij.zXV;q)59Z]y+7k.3ShD %]]"n1hg̉,$x )NY-OL(\VK^ " :[:8Nt8V#Vſ K0)؟~AVe}(//KJv d}bFo5Zd9CZ?s*FgSfw9 ' L&#jCxհY5KӼZ}|7,Fraɱ<}ɔk/b ۏmn1S'(/a x16K>>Kc[F&^yHb*76nI U* Ru >& 늟^#*KkcS15 yM3!cs-8wVLzܩ牎'*xEeݕa^o4FWy]7 O%uߚO %= 6K>E,ב~re_;j8rau B3 t#b!Po9Nn0^9T oKH(ODKc5.AvNfǛ9^lQIusx(\d[=FiOL;嗗p))#Tvx#dz̡D)p=# 05R ^_یMd:,$y-,G8탧)"qz)q'bMg~-Cn,%$|D huNIp<6s|ݒ%l=]g߷iɼO="ٿMeb *-ߖ?k~J˯z)~C2.ý&~I֠!zIj, 4D8Xn1Y' JQ UB` P~ D|xD||٨faߪ>pR̪/UlZOֻ}dYZǿvfK[6xweT VN/??\0yׄ=;i٬ՂƗM^ԺRmnj^[omɅ˫-A8.\3+9W+cV]?(@=~PTQ81ִ\yavclm8+<& vm-x>`F0i.QqMzH 6;;ˬ`_Qo@C_+-Zf{b5t+D0hJƕ'LFBa+FF'(y͕/z=O??E޻n{ZMWp-9iϗʟ__w?0<|Tjs3K4^8_t{uK?8WA&$s8 뢈hDiB(`(ZD5( bL`靹E!E10Q\2~ф QN였Z1ix,{:fmlNvױ ,޳Ý9mnOښH|F\|GkҪ968ֶqeֶ{Օӏdz^\b c&.5QjFO<$;3ȼ/q4[TdNHeNV) IGi19_b?ȶL0S/őR=Oq)^}y"ˣEbDyVM7 *7c (&x#„ ʮs8ʿ"Q*0fGTl"9CT|7_z_VFkW߱|މޒwTp̬1_fL&Se6Xa:v P*gԒ j֭?` t`aL 24ؔR>'-k;LQdn/diϣ .*<o}< Kr~s_2zKP T3 Q~I%= iK:Mbz5*Ja,AzHyes0Gh V F6`0ΞDG0:UVј}jpꕮjp:3oD']޴=JuFŽmbYU:8m%M]T5MJBh&W-cYYȁ?Yã8PvXnDJyb 춃:z<]H mJ(ۥ8!ZD:C\ꨫ_<%ZzόIF丣8Ǽ`UN̔T~qϬ;{>3%.Yj)T11Z89~eˊckx/g/ g`/xv k 4ha3@l.<>p{ZR>'{ʣԳ_Rd$1Yr)$IĆb5sJBҩȂ@RoQ)Q(X$+^cUc"+WWmQW#9 +ss҂Z1Y\ӲTk}6&2t'ɖΦ lp{[Aqevʖ'Ν:!^#۸LFdZ.S I͚GQ67]N<0RZ2H@b"?LmXB·v?'Cv;W4W>&]傾 3*SS*R9\赌f x&WLHh0*6¨ڜlDeƙ4 iEP?ĝ .ɞGo.q z_,qǭGRL,9M//cYA/!bW fl[?$yz`ձ+x#1n#Qsʏ(EsΑd)djq$YFaQ^Xq|8'V3]='um\fBٟ|fޒ3 "n{ո%Nq E1"|0S/Q^}ғQE#W<>G83d̉I"O|gaИE.3Iz*4fGrb5cK\3ʘ 2 8f̘KTmn ?~v|}}LJUz(c>Wό-:tD0?Ef%;cq@@}i1Umr;KYfa~uVwQMf_r]lkX7cR{E}Em: O2ƠLjj,#Ԙ#R6`QrZ9zz"]t.ň*a3Lej뉅3Bh&er9Bµ衁+W +Y a斑ALIYyP)m83PLCᵊ!kTjb7(!ha^K vWb4t =IUn%ް3kC`do2۰/bKxQl %yJ+GzR?H2?!r 3hd2#3M$)VQhiuB= @fly€ʞk60 YWWfn7nQ4^7ů4Pn1{ajwCB{>rNsO!^c1T#$|</IbF+f:KxO--tz>8RbʤfƏyMy٘\q3Éd3Rg4Szi6cӴ ŠhMSgJ a4!PSqeo%rS]2kde:e Ѝˠe s9]b1sbM `9PycMҶl|̍41]qyZQiZVRl{*ᣝNjyF "6VX hy V!݋ CRr5+VlhJ;XcvLARQLYβF51R\\Ҵnڰ='SrxA}/`? ٵ)*`G{^42%1e=ǸI"L>P,qkqy&yn2@6Y YI{9SR=rjRMw8' 8g#HxN#uHw鷨BԾf#TÑyn6i}vSfSLUUހh-ߥƛ" ,#f|^igvighlUܰU%RWZ4ŝ^Jtx*,PVk/%#T۴\nmP&:}svx:z8z-xT8Jc]GZPX19 tzh FX m[ W \U* 7%Yf*pEH WflZb,S%6Z\&_J]f@ESXL?9Ͻ&^QgQ4Y5J,[Id]:Mh ]TiN;iZ==du)szs6OdҥsW#,b͞ƒ[3j"D6;lwvĔ唫S. "CoLL&nڅ~MᮑQl  |h^7GMyB QS0ʴߟ;#"|[0zصڹh˗43 KV?-܈ G~@S طURDU"PXeL4~8mp3Lj+0gDW+|jR8a'`Vb^7pmHwfyڇ{2#?m.>Gۀ3zNpV)Q.hʔK@ ͸'J{&c=Nuomk'^&ԫf!NشXʟ}K/^7_w^T1Fw܂/"Ed Z.$WR z1Dd **:Ժ1[2lV?\r6U:+8͜>to=Gv.X?uʼnI 4uZXŸs:{n~ܓoԯFNozd%gWcUމ Cž}h3gnԉ&;Ѽ@;~\/^4zno;*Cwt/ǵ!9._rT|<_x%×(_M|i×iԡ-ɵJ9l`m>zO} &'?wәGGu 2|"r)~\D.D3r ֔Z52*τM>-Z]aiUck<9Rèy>~Y({B)Dz|.0|릾 YR(qP=YbI EF3*z񆜗ZiZ23Os7<~Â[0Tos{^fjL cIJ*&s+m1\Z;=: mƐat+gU8;&.NEA!<>=*ŤVBJx$&xcJm+|J+1vb:3𽦙dZR\o7OS3")XrmzEhf~ghO[.o{kœl.5ۑqI|bm+ȡye]b )[g~bYgJ|[=()_S?5ljkb]2/\?kVUݤqݏ86),5 %3BW*[SiOj1\ؘpERed PTi'ٔVR ř_'6Ӧb`MS(q`oh:AbU-D6wq\L)e3J#:[;p;WYcE1F[+035h/'G:5f6^PJsǴ^L^6io}<- -QZ?hZ"MZvѧ>3>Mt <|5U@U@*@I1٫EEI D 8+4+WxPSdWlT9ti [ϖad>?wPn%n 5+ܒ1왞ig-ctygph2&T {,MhMo׌osql+~-[?3m0'oM̉kf@=̈́WP{*3W2]6FoNʊa;mYOˈXʘԘ1vbS)HGik7Vfc2*,,cr2+PMD$H<0ryI Fdepzk5o"hQڋ}}#=%5-$i-:7ooI995uf+=.?rE`a/@v1 zT^PǢ@P`M1nMGܙ7$W)=OgƭKE?Yų~s7+V3{nYӵnZW=qa4AjXXw|$oY~m2qn6<.':nwz}߶~xÞpxh8)'Ώ)WxNqESμ\87nwōƱKqōD$qy?čyFכwy?ݼRip ?Nf_yM=PH &>#rZ<'8Y)@[m4M[a/SHFEǵ(\i(Hܰ{!7c6RR+FZR3V31͡ C)]`J؉y4./2_a]OC`*@ IJdŋٺ''J_Å Bٖ2cc-|\aEW.Pk2z O5K6e#p+yAڬ}R55x:K}>P=,_$E}λqo)b ҘM B;9B_]UT~M!7 VY=40xU4l *ڽ~y3{5: ok]ծuk݃n![Q$M4a"(.&D|H B􃽣F14O_oY:wn|i'V{Uc%,Yal"M6`d``.)!! eк_urh[7lA1WqC]A8ئUX/vJ:f+ BЕх0bVDEo*Û|DPMgPvhLVR+нf]i~J&rI8w oVh#Ɇ-h>kƓ;oSSV~8s??9vT~tnb. q㘅U`XVEg  Bڐ{CH兔uZs-ukZg b4󜛋wfPT\HWz u% !R"*i!aYpV{j,9̮Li4Vt$'u53H~љƦ%{oTV}/Hͼ.oi<wOn;lu57ծ~[lO 1xzas$1rHW?}nYl-sm0:ejƲ4ռb֦V`V*hvd;d)'Y6/z"{ S O  q\{ a,b14UxZI"N6cnp/jS%۴~^*iNW{.#\ ɪBi2Msba)U9·1]Rr^(/b/zlMN[dR+<0BmEDeUq`&.7^Ղ^SUE et*sm?֠Q7܉`%wFdIRڕME] YPXƪrh84E‡ffFG`1~q'GUbq'"Ƨި} ޛJܩd3JNg UQS6:s$ZB+2 !;z$wq VXqW s=t+[3M2-ZJdz^FzQ 3= /^Ƅ<=ƃQn$ChWm1@EIo\xL]ڄȐoBw3<3ls(?b9mU3co;ӳi`1;=O {``mn~]w{̼9.?-|wsF<#)J=!hxLD uF{)[{#+r6poh^-XpL[Yt"u6lu`U^GW?e;forЮ8y=%'Ce#y'sBz )E?;xc`d```dox~  poD, $ !Mxc`d``[/S @ {TxuMGDQTL**iS31mDfdmErTFE"Y ZU0<99Ϲ7)+PM+09ƋЅKXe<#G p=8f]G7aK6d ;:d<c\^̍1w֢׹4kχ0Pf}iɬc]a~UgM[x +Y^{Nws ~>ޛbtmvߣH|#ĽeEG\#ƵR_:xxّ9Ϙwgl&[jC| 4$E1QjIqq;~U}DPo]ǁV[\iz]Ao^cnbxc``Ё:k&11cRIJ + &l^l;YqpLyW w9  [ߌ;Q]$z VN%|IGd(h 19'$$j$H̐!%U&uOZEz~ W)z)RRPrQzEE%MOejj5&4j?3W_XqDF*yng~9-H8$ 'K$HɤJdIٴ=H':Ӆt#'Mҏ @CE.&yS@!`0a Ǎ")J(F3c<$&3Lc:3,ʘM9s<*Q6=[N81`o~6nV8 ~$)泀T*<1O{i}XL %KYr>45 YZֳ|*g85^Z-1+q/ (I,)*i9sV%ܔLbd}5~pj֔Ŗ{\JSYWC44.eT){nK]꺳: *+Vex-M$k;Loo=xE̱P^V"JLn<I &}X$Njp xI9✗ [g -!"$jIӠ؅ԗ Q_rM-b6A)3[f#f ؾ2#f*01cP ]0oF [S*gsoap-2.8.28/gsoap/doc/fonts/inconsolata-webfont.svg0000755000175000017500000017170112653650144022010 0ustar ellertellert gsoap-2.8.28/gsoap/doc/genivia_content.css0000644000175000017500000000377612653650144020053 0ustar ellertellert/* font face requires Genivia Website fonts */ @font-face { font-family: 'inconsolatamedium'; src: url('../../fonts/inconsolata-webfont.eot'); src: url('../../fonts/inconsolata-webfont.eot?#iefix') format('embedded-opentype'), url('../../fonts/inconsolata-webfont.woff') format('woff'), url('../../fonts/inconsolata-webfont.ttf') format('truetype'), url('../../fonts/inconsolata-webfont.svg#inconsolatamedium') format('svg'); font-weight: normal; font-style: normal; } #titlearea { padding: 0px; margin: 0px; width: 100%; border-bottom: 0px; } div.textblock { margin-left: 10%; margin-right: 10%; } a.el { font-weight: normal; } pre { font-family: inconsolatamedium, monospace, serif !important; font-size: 1.1em !important; } code { display: inline-block; background-color: #ffe; font-family: inconsolatamedium, monospace, serif !important; } div.header { visibility: hidden; } div.toc { padding: 14px 25px; background: #fafafa; border: 1px solid rgba(38, 91, 142, 0.5); border-radius: 7px 7px 7px 7px; float: right; height: auto; margin: 0px 20px 10px 10px; width: 200px; } div.toc h3 { visibility: hidden; } div.fragment { border: 1px solid rgba(38, 91, 142, 0.5); border-left: 10px solid #c0504d; background-color: #ffe; padding-left: 10px; padding-right: 6px; padding-top: 6px; padding-bottom: 6px; margin-left: 0px; font: 100 1em; line-height: normal; overflow: auto; } div.line { line-height: normal; } pre.fragment { border: 0px; background-color: hsl(0, 0%, 25%); color: hsl(0, 0%, 100%); padding: 6px; margin-left: 0px; font: 100 1em; line-height: normal; overflow: auto; white-space: pre; } table.doxtable { border-collapse: collapse; margin-top: 4px; margin-bottom: 4px; margin-left: 0px; background-color: #ffe; } table.doxtable th { background-color: #c0504d; color: #FFFFFF; font-size: 110%; padding-bottom: 4px; padding-top: 5px; } gsoap-2.8.28/gsoap/doc/isapi/0000755000175000017500000000000012654077574015270 5ustar ellertellertgsoap-2.8.28/gsoap/doc/isapi/Doxyfile0000644000175000017500000002314212653650144016765 0ustar ellertellert# Doxyfile 1.3.8 #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- PROJECT_NAME = "ISAPI Extension" PROJECT_NUMBER = "2.8 Stable" PROJECT_LOGO = "../GeniviaLogo2_trans_noslogan.png" OUTPUT_DIRECTORY = CREATE_SUBDIRS = NO OUTPUT_LANGUAGE = English USE_WINDOWS_ENCODING = NO BRIEF_MEMBER_DESC = YES REPEAT_BRIEF = YES ABBREVIATE_BRIEF = "The $name class" \ "The $name widget" \ "The $name file" \ is \ provides \ specifies \ contains \ represents \ a \ an \ the ALWAYS_DETAILED_SEC = NO INLINE_INHERITED_MEMB = NO FULL_PATH_NAMES = NO STRIP_FROM_PATH = STRIP_FROM_INC_PATH = SHORT_NAMES = NO JAVADOC_AUTOBRIEF = NO MULTILINE_CPP_IS_BRIEF = NO DETAILS_AT_TOP = NO INHERIT_DOCS = YES DISTRIBUTE_GROUP_DOC = NO TAB_SIZE = 8 ALIASES = OPTIMIZE_OUTPUT_FOR_C = NO OPTIMIZE_OUTPUT_JAVA = NO SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- EXTRACT_ALL = YES EXTRACT_PRIVATE = YES EXTRACT_STATIC = YES EXTRACT_LOCAL_CLASSES = YES EXTRACT_LOCAL_METHODS = NO HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_CLASSES = NO HIDE_FRIEND_COMPOUNDS = NO HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = NO CASE_SENSE_NAMES = NO HIDE_SCOPE_NAMES = NO SHOW_INCLUDE_FILES = YES INLINE_INFO = YES SORT_MEMBER_DOCS = YES SORT_BRIEF_DOCS = NO SORT_BY_SCOPE_NAME = NO GENERATE_TODOLIST = YES GENERATE_TESTLIST = YES GENERATE_BUGLIST = YES GENERATE_DEPRECATEDLIST= YES ENABLED_SECTIONS = MAX_INITIALIZER_LINES = 30 SHOW_USED_FILES = YES #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- QUIET = NO WARNINGS = YES WARN_IF_UNDOCUMENTED = YES WARN_IF_DOC_ERROR = YES WARN_FORMAT = "$file:$line: $text" WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- INPUT = ../../mod_gsoap/gsoap_win/isapi/README.md ../../mod_gsoap/gsoap_win/isapi/gsoap/ FILE_PATTERNS = *.c \ *.cc \ *.cxx \ *.cpp \ *.c++ \ *.java \ *.ii \ *.ixx \ *.ipp \ *.i++ \ *.inl \ *.h \ *.hh \ *.hxx \ *.hpp \ *.h++ \ *.idl \ *.odl \ *.cs \ *.php \ *.php3 \ *.inc \ *.m \ *.mm \ *.C \ *.CC \ *.C++ \ *.II \ *.I++ \ *.H \ *.HH \ *.H++ \ *.CS \ *.PHP \ *.PHP3 \ *.M \ *.MM RECURSIVE = NO EXCLUDE = EXCLUDE_SYMLINKS = NO EXCLUDE_PATTERNS = EXAMPLE_PATH = EXAMPLE_PATTERNS = * EXAMPLE_RECURSIVE = NO IMAGE_PATH = INPUT_FILTER = FILTER_PATTERNS = FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- SOURCE_BROWSER = NO INLINE_SOURCES = NO STRIP_CODE_COMMENTS = YES REFERENCED_BY_RELATION = NO REFERENCES_RELATION = NO VERBATIM_HEADERS = NO #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- ALPHABETICAL_INDEX = NO COLS_IN_ALPHA_INDEX = 5 IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- GENERATE_HTML = YES HTML_OUTPUT = html HTML_FILE_EXTENSION = .html HTML_HEADER = ../doxygen_header.html HTML_FOOTER = ../doxygen_footer.html HTML_STYLESHEET = HTML_ALIGN_MEMBERS = YES GENERATE_HTMLHELP = NO CHM_FILE = HHC_LOCATION = GENERATE_CHI = NO BINARY_TOC = NO TOC_EXPAND = NO DISABLE_INDEX = NO ENUM_VALUES_PER_LINE = 4 GENERATE_TREEVIEW = NO TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- GENERATE_LATEX = NO LATEX_OUTPUT = latex LATEX_CMD_NAME = latex MAKEINDEX_CMD_NAME = makeindex COMPACT_LATEX = NO PAPER_TYPE = a4wide EXTRA_PACKAGES = LATEX_HEADER = PDF_HYPERLINKS = NO USE_PDFLATEX = NO LATEX_BATCHMODE = NO LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- GENERATE_RTF = NO RTF_OUTPUT = rtf COMPACT_RTF = NO RTF_HYPERLINKS = NO RTF_STYLESHEET_FILE = RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- GENERATE_MAN = NO MAN_OUTPUT = man MAN_EXTENSION = .3 MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- GENERATE_XML = NO XML_OUTPUT = xml XML_SCHEMA = XML_DTD = XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- GENERATE_PERLMOD = NO PERLMOD_LATEX = NO PERLMOD_PRETTY = YES PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- ENABLE_PREPROCESSING = YES MACRO_EXPANSION = NO EXPAND_ONLY_PREDEF = NO SEARCH_INCLUDES = YES INCLUDE_PATH = INCLUDE_FILE_PATTERNS = PREDEFINED = EXPAND_AS_DEFINED = SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- TAGFILES = GENERATE_TAGFILE = ALLEXTERNALS = NO EXTERNAL_GROUPS = YES PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- CLASS_DIAGRAMS = NO HIDE_UNDOC_RELATIONS = YES HAVE_DOT = YES CLASS_GRAPH = YES COLLABORATION_GRAPH = YES UML_LOOK = NO TEMPLATE_RELATIONS = NO INCLUDE_GRAPH = YES INCLUDED_BY_GRAPH = YES CALL_GRAPH = NO GRAPHICAL_HIERARCHY = YES DOT_IMAGE_FORMAT = png DOT_PATH = /usr/local/bin DOTFILE_DIRS = MAX_DOT_GRAPH_WIDTH = 1024 MAX_DOT_GRAPH_HEIGHT = 1024 MAX_DOT_GRAPH_DEPTH = 1000 GENERATE_LEGEND = YES DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- SEARCHENGINE = NO gsoap-2.8.28/gsoap/doc/databinding/0000755000175000017500000000000012654077574016427 5ustar ellertellertgsoap-2.8.28/gsoap/doc/databinding/Doxyfile0000644000175000017500000002353312653650144020130 0ustar ellertellert# Doxyfile 1.3.8 #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- PROJECT_NAME = "Data Bindings" PROJECT_NUMBER = "2.8 Stable" PROJECT_LOGO = "../GeniviaLogo2_trans_noslogan.png" OUTPUT_DIRECTORY = CREATE_SUBDIRS = NO OUTPUT_LANGUAGE = English USE_WINDOWS_ENCODING = NO BRIEF_MEMBER_DESC = YES REPEAT_BRIEF = YES ABBREVIATE_BRIEF = "The $name class" \ "The $name widget" \ "The $name file" \ is \ provides \ specifies \ contains \ represents \ a \ an \ the ALWAYS_DETAILED_SEC = NO INLINE_INHERITED_MEMB = NO FULL_PATH_NAMES = NO STRIP_FROM_PATH = STRIP_FROM_INC_PATH = SHORT_NAMES = NO JAVADOC_AUTOBRIEF = NO MULTILINE_CPP_IS_BRIEF = NO DETAILS_AT_TOP = NO INHERIT_DOCS = YES DISTRIBUTE_GROUP_DOC = NO TAB_SIZE = 8 ALIASES = OPTIMIZE_OUTPUT_FOR_C = NO OPTIMIZE_OUTPUT_JAVA = NO SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- EXTRACT_ALL = YES EXTRACT_PRIVATE = YES EXTRACT_STATIC = YES EXTRACT_LOCAL_CLASSES = YES EXTRACT_LOCAL_METHODS = NO HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_CLASSES = NO HIDE_FRIEND_COMPOUNDS = NO HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = NO CASE_SENSE_NAMES = NO HIDE_SCOPE_NAMES = NO SHOW_INCLUDE_FILES = YES INLINE_INFO = YES SORT_MEMBER_DOCS = YES SORT_BRIEF_DOCS = NO SORT_BY_SCOPE_NAME = NO GENERATE_TODOLIST = YES GENERATE_TESTLIST = YES GENERATE_BUGLIST = YES GENERATE_DEPRECATEDLIST= YES ENABLED_SECTIONS = MAX_INITIALIZER_LINES = 30 SHOW_USED_FILES = YES #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- QUIET = NO WARNINGS = YES WARN_IF_UNDOCUMENTED = YES WARN_IF_DOC_ERROR = YES WARN_FORMAT = "$file:$line: $text" WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- INPUT = ../../samples/databinding/README.md ../../samples/databinding/address.h ../../samples/databinding/address.cpp ../../samples/databinding/graph.h ../../samples/databinding/graph.cpp ../../samples/databinding/addressH.h ../../samples/databinding/graphH.h ../../samples/databinding/addressStub.h ../../samples/databinding/graphStub.h FILE_PATTERNS = *.c \ *.cc \ *.cxx \ *.cpp \ *.c++ \ *.java \ *.ii \ *.ixx \ *.ipp \ *.i++ \ *.inl \ *.h \ *.hh \ *.hxx \ *.hpp \ *.h++ \ *.idl \ *.odl \ *.cs \ *.php \ *.php3 \ *.inc \ *.m \ *.mm \ *.C \ *.CC \ *.C++ \ *.II \ *.I++ \ *.H \ *.HH \ *.H++ \ *.CS \ *.PHP \ *.PHP3 \ *.M \ *.MM RECURSIVE = YES EXCLUDE = EXCLUDE_SYMLINKS = NO EXCLUDE_PATTERNS = EXAMPLE_PATH = EXAMPLE_PATTERNS = * EXAMPLE_RECURSIVE = NO IMAGE_PATH = INPUT_FILTER = FILTER_PATTERNS = FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- SOURCE_BROWSER = YES INLINE_SOURCES = NO STRIP_CODE_COMMENTS = YES REFERENCED_BY_RELATION = NO REFERENCES_RELATION = NO VERBATIM_HEADERS = NO #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- ALPHABETICAL_INDEX = NO COLS_IN_ALPHA_INDEX = 5 IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- GENERATE_HTML = YES HTML_OUTPUT = html HTML_FILE_EXTENSION = .html HTML_HEADER = ../doxygen_header.html HTML_FOOTER = ../doxygen_footer.html HTML_STYLESHEET = HTML_ALIGN_MEMBERS = YES GENERATE_HTMLHELP = NO CHM_FILE = HHC_LOCATION = GENERATE_CHI = NO BINARY_TOC = NO TOC_EXPAND = NO DISABLE_INDEX = NO ENUM_VALUES_PER_LINE = 4 GENERATE_TREEVIEW = YES TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- GENERATE_LATEX = NO LATEX_OUTPUT = latex LATEX_CMD_NAME = latex MAKEINDEX_CMD_NAME = makeindex COMPACT_LATEX = NO PAPER_TYPE = a4wide EXTRA_PACKAGES = LATEX_HEADER = PDF_HYPERLINKS = NO USE_PDFLATEX = NO LATEX_BATCHMODE = NO LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- GENERATE_RTF = NO RTF_OUTPUT = rtf COMPACT_RTF = NO RTF_HYPERLINKS = NO RTF_STYLESHEET_FILE = RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- GENERATE_MAN = NO MAN_OUTPUT = man MAN_EXTENSION = .3 MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- GENERATE_XML = NO XML_OUTPUT = xml XML_SCHEMA = XML_DTD = XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- GENERATE_PERLMOD = NO PERLMOD_LATEX = NO PERLMOD_PRETTY = YES PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- ENABLE_PREPROCESSING = YES MACRO_EXPANSION = NO EXPAND_ONLY_PREDEF = NO SEARCH_INCLUDES = YES INCLUDE_PATH = INCLUDE_FILE_PATTERNS = PREDEFINED = EXPAND_AS_DEFINED = SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- TAGFILES = GENERATE_TAGFILE = ALLEXTERNALS = NO EXTERNAL_GROUPS = YES PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- CLASS_DIAGRAMS = NO HIDE_UNDOC_RELATIONS = YES HAVE_DOT = YES CLASS_GRAPH = YES COLLABORATION_GRAPH = YES UML_LOOK = NO TEMPLATE_RELATIONS = NO INCLUDE_GRAPH = YES INCLUDED_BY_GRAPH = YES CALL_GRAPH = NO GRAPHICAL_HIERARCHY = YES DOT_IMAGE_FORMAT = png DOT_PATH = /usr/local/bin DOTFILE_DIRS = MAX_DOT_GRAPH_WIDTH = 1024 MAX_DOT_GRAPH_HEIGHT = 1024 MAX_DOT_GRAPH_DEPTH = 1000 GENERATE_LEGEND = YES DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- SEARCHENGINE = NO gsoap-2.8.28/gsoap/doc/wsrm/0000755000175000017500000000000012654077574015153 5ustar ellertellertgsoap-2.8.28/gsoap/doc/wsrm/Doxyfile0000644000175000017500000002340112653650146016650 0ustar ellertellert# Doxyfile 1.3.8 #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- PROJECT_NAME = "WS-ReliableMessaging" PROJECT_NUMBER = "2.8 Stable" PROJECT_LOGO = "../GeniviaLogo2_trans_noslogan.png" OUTPUT_DIRECTORY = CREATE_SUBDIRS = NO OUTPUT_LANGUAGE = English USE_WINDOWS_ENCODING = NO BRIEF_MEMBER_DESC = YES REPEAT_BRIEF = YES ABBREVIATE_BRIEF = "The $name class" \ "The $name widget" \ "The $name file" \ is \ provides \ specifies \ contains \ represents \ a \ an \ the ALWAYS_DETAILED_SEC = NO INLINE_INHERITED_MEMB = NO FULL_PATH_NAMES = NO STRIP_FROM_PATH = STRIP_FROM_INC_PATH = SHORT_NAMES = NO JAVADOC_AUTOBRIEF = NO MULTILINE_CPP_IS_BRIEF = NO DETAILS_AT_TOP = NO INHERIT_DOCS = YES DISTRIBUTE_GROUP_DOC = NO TAB_SIZE = 8 ALIASES = OPTIMIZE_OUTPUT_FOR_C = NO OPTIMIZE_OUTPUT_JAVA = NO SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- EXTRACT_ALL = YES EXTRACT_PRIVATE = YES EXTRACT_STATIC = YES EXTRACT_LOCAL_CLASSES = YES EXTRACT_LOCAL_METHODS = NO HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_CLASSES = NO HIDE_FRIEND_COMPOUNDS = NO HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = NO CASE_SENSE_NAMES = NO HIDE_SCOPE_NAMES = NO SHOW_INCLUDE_FILES = YES INLINE_INFO = YES SORT_MEMBER_DOCS = YES SORT_BRIEF_DOCS = NO SORT_BY_SCOPE_NAME = NO GENERATE_TODOLIST = YES GENERATE_TESTLIST = YES GENERATE_BUGLIST = YES GENERATE_DEPRECATEDLIST= YES ENABLED_SECTIONS = MAX_INITIALIZER_LINES = 30 SHOW_USED_FILES = YES #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- QUIET = NO WARNINGS = YES WARN_IF_UNDOCUMENTED = YES WARN_IF_DOC_ERROR = YES WARN_FORMAT = "$file:$line: $text" WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- INPUT = ../../plugin/wsrmapi.h ../../plugin/wsrmapi.c ../../plugin/wsaapi.h ../../plugin/wsaapi.c ../../plugin/mq.h ../../plugin/mq.c ../../custom/duration.h ../../custom/duration.c ../../import/wsrm.h ../../import/wsrx.h ../../import/wsa5.h FILE_PATTERNS = *.c \ *.cc \ *.cxx \ *.cpp \ *.c++ \ *.java \ *.ii \ *.ixx \ *.ipp \ *.i++ \ *.inl \ *.h \ *.hh \ *.hxx \ *.hpp \ *.h++ \ *.idl \ *.odl \ *.cs \ *.php \ *.php3 \ *.inc \ *.m \ *.mm \ *.C \ *.CC \ *.C++ \ *.II \ *.I++ \ *.H \ *.HH \ *.H++ \ *.CS \ *.PHP \ *.PHP3 \ *.M \ *.MM RECURSIVE = NO EXCLUDE = EXCLUDE_SYMLINKS = NO EXCLUDE_PATTERNS = EXAMPLE_PATH = EXAMPLE_PATTERNS = * EXAMPLE_RECURSIVE = NO IMAGE_PATH = INPUT_FILTER = FILTER_PATTERNS = FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- SOURCE_BROWSER = NO INLINE_SOURCES = NO STRIP_CODE_COMMENTS = YES REFERENCED_BY_RELATION = NO REFERENCES_RELATION = NO VERBATIM_HEADERS = NO #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- ALPHABETICAL_INDEX = NO COLS_IN_ALPHA_INDEX = 5 IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- GENERATE_HTML = YES HTML_OUTPUT = html HTML_FILE_EXTENSION = .html HTML_HEADER = ../doxygen_header.html HTML_FOOTER = ../doxygen_footer.html HTML_STYLESHEET = HTML_ALIGN_MEMBERS = YES GENERATE_HTMLHELP = NO CHM_FILE = HHC_LOCATION = GENERATE_CHI = NO BINARY_TOC = NO TOC_EXPAND = NO DISABLE_INDEX = NO ENUM_VALUES_PER_LINE = 4 GENERATE_TREEVIEW = NO TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- GENERATE_LATEX = NO LATEX_OUTPUT = latex LATEX_CMD_NAME = latex MAKEINDEX_CMD_NAME = makeindex COMPACT_LATEX = NO PAPER_TYPE = a4wide EXTRA_PACKAGES = LATEX_HEADER = PDF_HYPERLINKS = NO USE_PDFLATEX = NO LATEX_BATCHMODE = NO LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- GENERATE_RTF = NO RTF_OUTPUT = rtf COMPACT_RTF = NO RTF_HYPERLINKS = NO RTF_STYLESHEET_FILE = RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- GENERATE_MAN = NO MAN_OUTPUT = man MAN_EXTENSION = .3 MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- GENERATE_XML = NO XML_OUTPUT = xml XML_SCHEMA = XML_DTD = XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- GENERATE_PERLMOD = NO PERLMOD_LATEX = NO PERLMOD_PRETTY = YES PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- ENABLE_PREPROCESSING = YES MACRO_EXPANSION = NO EXPAND_ONLY_PREDEF = NO SEARCH_INCLUDES = YES INCLUDE_PATH = INCLUDE_FILE_PATTERNS = PREDEFINED = EXPAND_AS_DEFINED = SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- TAGFILES = GENERATE_TAGFILE = ALLEXTERNALS = NO EXTERNAL_GROUPS = YES PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- CLASS_DIAGRAMS = NO HIDE_UNDOC_RELATIONS = YES HAVE_DOT = YES CLASS_GRAPH = YES COLLABORATION_GRAPH = YES UML_LOOK = NO TEMPLATE_RELATIONS = NO INCLUDE_GRAPH = YES INCLUDED_BY_GRAPH = YES CALL_GRAPH = NO GRAPHICAL_HIERARCHY = YES DOT_IMAGE_FORMAT = png DOT_PATH = /usr/local/bin DOTFILE_DIRS = MAX_DOT_GRAPH_WIDTH = 1024 MAX_DOT_GRAPH_HEIGHT = 1024 MAX_DOT_GRAPH_DEPTH = 1000 GENERATE_LEGEND = YES DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- SEARCHENGINE = NO gsoap-2.8.28/gsoap/doc/GeniviaLogo2_trans_noslogan.png0000644000175000017500000002372612653650144022264 0ustar ellertellertPNG  IHDR- 0 DiCCPICC ProfileH wTl/]"e齷.H& KYe7D"V$(bh(+X "J F;'Nw>}w(!a@P"f'0D6p(h@_63u_ -Z[3C+K;?r!YLD)c#c1 ʪ2N|bO h{yIHD.VV>RV:|{ [RF ”"MF1L1[Te'Jx%C%_%RJ#4GcӸu:(G73%Ie%e{SC add1T4UT*TTTUzUUUoScemUkS{Q7UPWߣ~A}b}9Հ5L5"5iјi<9Ъ:5MvhWh~Tfz1U.椎NTgNΌ|ݵͺHz,T NI}mPw ,tӆF -5j4oL50^l\k|g24mr6u0M713fͱBZA EEŰ%2res+}VV(٬Ԗk[c{Îjgʮ=~mCNNb&q'}d]N,:+Uʺuv^|o]5˟[7wM׍mȝ}CǃQSϓY9eu빷ػ{^>*}7l6 8`k`f 7!p2)hEPW0%8*:Qi8# z<ἶ0-AQ#p5#m"GvGѢG.7xt~g|LbLCtOlyPU܊|BLB}&:$%Zh`EꋲJO$O&&N~ rRSvLrgIsKۖ6^>!` /22fLge̜͊j&d'g* 3]9Z99"3Qhh'\(wanLHyy5yoc( z.ٴdloaqu.Yf WB+SVv[UjtCkHk2zmWbuj.Y￾HH\4uލ6W|ĺ})76T}39usocٞ---zl=TX|d[ fEqūI/WWA!1TRվS疝ӫox4صin={j-n`[k k+x\S-ۆzEjpjh8qn6Ik:8w7ޜw[nn?uݼ3V/~ڟM~nr:53(ѽȳ_ry?ZrL{퓓~מ.x:LlfW_w=7~oLM˃_uNO=|zfڛCoYož_Cggg` pHYs  8IDATx=XTs6:*EbƠшԧ(XE F3jĵk'cH5h,o5*"ҤK]ʶ{wYRļ˿L;s̙3gf\qDM!R@ w[7A_߰> uUakBsO(9<޽{}R =0q=qRäE8G|x@Z6}pxr?tk4/P7wu)}ɖh MsΎE!/t'rZw{}37lږ'B)i[q#h##88!ƍ7 "N }tc\kTBXV#qyN#yAĠGs6Wvg+UrSy"M?C 9okk˹WH$'a[l92l(!>,tKn3[/dʅ0Gc8 -xzRB1(0_$GpZN&J(Tqz7BAS|._}t!] ĵx{醃^lH7=Tcf7E/!.土uw=^͘1[#(U>\n%LL'NjQ}=ö,w;2C?_0LYudsQQQANO)0h|X,?xAxqk\k2|ʤ9erMXG0Z3 Qt'Bo(mqjeZC!DvmG~ը0@Pb+!:;}8rfsz jcgm^ ϤV3[fyƒpP :rL]Ouzm 7q`F j'g-|P媚!Xo%imlCtEQ_s~-:v^ "͸.#f۾-α,cYAPk >Y! @ɲ7/wKcX38.KrAPqBU1̝;imhuZTuCZ Ԝ8I셽a}QPuR/Y2ohl|Ar}9͇8~âHnQȷf|$@ r#90q OORsvv{l!mMJo0k[cC2&yyy\rrr|ZZ x ̹8!¶MĩmE"~\BxX:'V;;hjՠˮGiJ-UjjPu}m#Grޱ t#I=8CBI)ZjvZ1¿ZIoe3/ 0$z؅ũS?ynZ:!$ P5>r`Y 0 j ;2NFf)㋙x <NIQ%c(f5/OPBB9%w]bbaBsY=S&z|9qy1s$,,:8Xc7Maov,c?F*`䖪,M2O)ᄋ F~7>.Tq'4>S@l+Yy8W"K'CްkF vԨQӯ\MsM9xx΂׸-i6"-E`=c9ϧyDѵk3ѹdt0 Kp=gnXZæh !ثQkzmINiհr`@/\`u">ImaJ<>ݸ\>u2خ璎ˇ1s*n*RÆtL`P凷ҍisi9vL7`wp:uARFfT2MZ|R!u:Dru|7(ZBҠ..^W@X}y#Lf9to93[)ƆԩSIǎe:OqWhƀ:L-X@4r*8)@nnn༊`n(U_m8-fVǖ 'Ɉ}bۺ}hQn ]ïMP1oC<9Kvۅ`3( ,k 0B`n2˿lwڷZa><6]~;EL%m| ߩO<_x%hUM>Jӡ%Kx>~ =XknqHmp 60@P ?7WҐrb$X.~Q0s`y sv}E`vFGh\Po񧻻(Uio\*a qɅ]-ƌQ 0vz xpG@\k#gUE3pD dΝ98_@S ;ҦM3`iHԘ {c66nOzaWUjeNU#ps|zt0r"[iލM|o8k0Nêg@'eU%0}I3Bu@W'>P@fi sr}ם^\_HN a!tuuϩj_PΑnaUA2H19.*MIHb"GgHtELĕED]^cJ\\'YieK!1ԙieuqp_+h  )B` ;Ǡo~OOOeU9'M {rw䝟e.PQzp|OB0!b'|<8d'o\9{& 3 &4u~8ySvR~n H*RO^{\LgRKʫ4 J18ZRK5]OTԨ#F,?}&| +T?ԡCtNlAF*! f$p.Z `e98OAD)ޱ?_ͺ/& :PcH <E0V r*RGbG apCU$FJ׺pI 9`G /rҥKWn޼FFAjn[?PV X8b/[%r]l*5 zKG;MN΁l(3ZQ:9%d0/ەU wO>֡mKYPgP..[g4Tuou LKtW1''.=и,BCCBux8׭7&͌P=4LS`bH'470{Xkr(ea6΍JDS&K?, ;w(.[5fvtT0;/i,#Rk:7uIlmZ#s@>j{{r*e*5hdIwzjJf;dZNcgDS).1xUj OYCR6%I.?]%*u=#t0 Rʞ=׿Iq "$Ӽ렴A-z:X.8cvihsN8w[H2f9`怙f9`怙f@M>s5l ӦMOL{9jm۶ypPJh\zUFbP@=ZfehmYT* lTCr˜ޖS%˫Ѐ!%47OWj腖_~g ;:tP5bs!xlL 1&0M,󡭮aSuKl0>H(%fOoBKH%h$bAdtħCLC>~GCˣV@CƅEʒs{^p(1QiI S傡C%`h[ 1P)xt8h4 ˋ>y];>vNe>"+&F`/ 41l& tep8ܼ6!}xo1 :`HHH˗'!xQdWXLsرk L0bz|<ƚ%9!r8e6)'tG`<8'ULj.-ɛo^]ğpzS}n'GQTMXͿ nlgR",g#1/ezz} فѐb8NEE]aXurW6;IB5hk;h^p7 /))b $-i YL&1=Hb?IVi,K:;X?xS"(n@q0ּ>>ecƌ{ 80CAD33q޽M+ws7|w0c b_ _ .A Xl-!YP(F1 ju Ӫ"]E qʗ ӑ4OW9VX%GJyk5Ps2:.gܑGݾQH+fm:>C 4*߰0MDOG^L9UE."oZpf"83VczceQ;zrouulkg}zz2g-w<$XxQPPxx wŠAaUg B5| VYձp?et!d `ɍ=:υAn8 c-#?xNHAz!w,وHQ7%HvD+ٍp6_GjBBtg#@^'I_xQLW NdOUC[7FpIX c"R,Yò& VqJ`7~fh@1z4>y?hy? ֎mO4T͈>$G$fmaa'"Ic/++91ܘ^{DL}oONΪ,)^`ʸ>}ߝ6 `w-iZ'4r HS*qARiA*t@^'>'>~VIz޻wovXXXwܹszzz΄oHYG&.֭[_>޻f_ AX:`İM95/he8{۬ofw |3KAޠ34 nY!_z8b-&"շb_ =`i,d%d.s?$*I]"=pZ+?ԍGOxO@ś&-ܓ|7*d/$0/9 KZ5 a)4U 6Ƽecq4],A%grTHO!" 5n#sUKT<çot‚]ӏ@# 2Q AW"]va`2_2???~k+ٳᠽ! z7Rb PWf*bF{KSp:]k |f܉x-d DH?Ti[f/#/x藫6]F;R wttb~TBA!ɑM@g.v*sPC!Hܭ4'߬i[؛ @'Ze%\J$_IZ 9doc%9BeҜ*_!by?_ ;tWk%H`BZqy<_no2,:.#Ws'Vi'TXja|+Zd HS`+Os kwUTV6RA]#s i!]Fy;xsn#eYz`›6`ցCI Gy>)i#&|)zQHn]ryx\\(W}.5 &׼%DȾvk“{)7s30s30s30s3?ͭF" IENDB`gsoap-2.8.28/gsoap/doc/soapdoc2.html0000644000175000017500000372373412653650144016573 0ustar ellertellert gSOAP 2.8.28 User Guide

gSOAP 2.8.28 User Guide

Robert van Engelen
Genivia Inc
www.genivia.com

Jan 31, 2016
 
[This document is also available in PDF format]



Contents

Introduction
    1.1  Getting Started
    1.2  Quick Start: Developing a Web Service Client Application
    1.3  Quick Start: Developing a Web Service
    1.4  Quick Start: XML Data Bindings
    1.5  Feature Overview
Notational Conventions
Differences Between gSOAP Versions 2.4 (and Earlier) and 2.5
Differences Between gSOAP Versions 2.1 (and Earlier) and 2.2
Differences Between gSOAP Versions 1.X and 2.X
Interoperability
Quick User Guide
    7.1  How to Build SOAP/XML Clients
        7.1.1  Example
        7.1.2  XML Namespace Considerations
        7.1.3  Example
        7.1.4  How to Generate C++ Client Proxy Classes
        7.1.5  XSD Type Encoding Considerations
        7.1.6  Example
        7.1.7  How to Change the Response Element Name
        7.1.8  Example
        7.1.9  How to Specify Multiple Output Parameters
        7.1.10  Example
        7.1.11  How to Specify Output Parameters With struct/class Compound Data Types
        7.1.12  Example
        7.1.13  How to Specify Anonymous Parameter Names
        7.1.14  How to Specify a Method with No Input Parameters
        7.1.15  How to Specify a Method with No Output Parameters
    7.2  How to Build SOAP/XML Web Services
        7.2.1  Example
        7.2.2  MSVC++ Builds
        7.2.3  How to Create a Stand-Alone Server
        7.2.4  How to Create a Multi-Threaded Stand-Alone Service
        7.2.5  How to Pass Application Data to Service Methods
        7.2.6  Web Service Implementation Aspects
        7.2.7  How to Generate C++ Server Object Classes
        7.2.8  How to Chain C++ Server Classes to Accept Messages on the Same Port
        7.2.9  How to Generate WSDL Service Descriptions
        7.2.10  Example
        7.2.11  How to Use Client Functionalities Within a Service
    7.3  Asynchronous One-Way Message Passing
    7.4  Implementing Synchronous One-Way Message Passing over HTTP
    7.5  How to Use the SOAP Serializers and Deserializers to Save and Load Application Data using XML Data Bindings
        7.5.1  Mapping XML Schema to C/C++ with wsdl2h
        7.5.2  Mapping C/C++ to XML Schema with soapcpp2
        7.5.3  Serializing C/C++ Data to XML
        7.5.4  Deserializing C/C++ Data from XML
        7.5.5  Example
        7.5.6  Serializing and Deserializing Class Instances to Streams
        7.5.7  How to Specify Default Values for Omitted Data
The wsdl2h WSDL and Schema Importer
    8.1  wsdl2h Options
    8.2  Customizing Data Bindings With The typemap.dat File
Using the soapcpp2 Compiler and Code Generator
    9.1  soapcpp2 Options
    9.2  SOAP 1.1 Versus SOAP 1.2 and Dynamic Switching
    9.3  The soapdefs.h Header File
    9.4  How to Build Modules and Libraries with the #module Directive
    9.5  How to use the #import Directive
    9.6  How to Use #include and #define Directives
    9.7  Compiling a SOAP/XML Client Application with soapcpp2
    9.8  Compiling a SOAP/XML Web Service with soapcpp2
    9.9  Compiling Web Services and Clients in ANSI C
    9.10  Limitations of gSOAP
    9.11  Library Build Flags
    9.12  Run Time Flags
    9.13  Memory Management
        9.13.1  Memory Allocation and Management Policies
        9.13.2  Intra-Class Memory Management
    9.14  Debugging
    9.15  Generating an Auto Test Server for Client Testing
    9.16  Generating Deep Copy and Deletion Code
    9.17  Required Libraries
10  The gSOAP Service Operation Specification Format
    10.1  Service Operation Parameter Passing
    10.2  Error Codes
    10.3  C/C++ Identifier Name to XML Tag Name Mapping
    10.4  Namespace Mapping Table
11  gSOAP Serialization and Deserialization Rules
    11.1  SOAP RPC Encoding Versus Document/Literal and xsi:type Info
    11.2  Primitive Type Encoding
    11.3  How to Represent Primitive C/C++ Types as XSD Types
        11.3.1  How to Use Multiple C/C++ Types for a Single Primitive XSD Type
        11.3.2  How to use C++ Wrapper Classes to Specify Polymorphic Primitive Types
        11.3.3  XSD Schema Type Decoding Rules
        11.3.4  Multi-Reference Strings
        11.3.5  "Smart String" Mixed-Content Decoding
        11.3.6  C++ Strings
        11.3.7  Changing the Encoding Precision of float and double Types
        11.3.8  INF, -INF, and NaN Values of float and double Types
    11.4  Enumeration Serialization
        11.4.1  Serialization of Symbolic Enumeration Constants
        11.4.2  Encoding of Enumeration Constants
        11.4.3  Initialized Enumeration Constants
        11.4.4  How to "Reuse" Symbolic Enumeration Constants
        11.4.5  Boolean Enumeration Serialization for C
        11.4.6  Bitmask Enumeration Serialization
    11.5  Struct Serialization
    11.6  Class Instance Serialization
        11.6.1  Example
        11.6.2  Initialized static const Fields
        11.6.3  Class Methods
        11.6.4  Getter and Setter Methods
        11.6.5  Streaming XML with Getter and Setter Methods
        11.6.6  Polymorphism, Derived Classes, and Dynamic Binding
        11.6.7  XML Attributes
        11.6.8  QName Attributes and Elements
    11.7  Union Serialization
    11.8  Serializing Pointer Types
        11.8.1  Multi-Referenced Data
        11.8.2  NULL Pointers and Nil Elements
    11.9  Void Pointers
    11.10  Fixed-Size Arrays
    11.11  Dynamic Arrays
        11.11.1  SOAP Array Bounds Limits
        11.11.2  One-Dimensional Dynamic SOAP Arrays
        11.11.3  Example
        11.11.4  One-Dimensional Dynamic SOAP Arrays With Non-Zero Offset
        11.11.5  Nested One-Dimensional Dynamic SOAP Arrays
        11.11.6  Multi-Dimensional Dynamic SOAP Arrays
        11.11.7  Encoding XML Generics Containing Dynamic Arrays
        11.11.8  STL Containers
        11.11.9  Polymorphic Dynamic Arrays and Lists
        11.11.10  How to Change the Tag Names of the Elements of a SOAP Array or List
    11.12  Base64Binary XML Schema Type Encoding
    11.13  hexBinary XML Schema Type Encoding
    11.14  Literal XML Encoding Style
        11.14.1  Serializing and Deserializing Mixed Content XML With Strings
12  SOAP Fault Processing
13  SOAP Header Processing
14  MIME Attachments
    14.1  Sending a Collection of MIME Attachments (SwA)
    14.2  Retrieving a Collection of MIME Attachments (SwA)
15  DIME Attachments
    15.1  Sending a Collection of DIME Attachments
    15.2  Retrieving a Collection of DIME Attachments
    15.3  Serializing Binary Data in DIME
    15.4  Streaming DIME
    15.5  Streaming Chunked DIME
    15.6  WSDL Bindings for DIME Attachments
16  MTOM Attachments
    16.1  Generating MultipartRelated MIME Attachment Bindings in WSDL
    16.2  Sending and Receiving MTOM Attachments
    16.3  Streaming MTOM/MIME
    16.4  Redirecting Inbound MTOM/MIME Streams Based on SOAP Body Content
    16.5  Streaming Chunked MTOM/MIME
17  XML Validation
    17.1  Occurrence Constraints
        17.1.1  Default Values
        17.1.2  Elements with minOccurs and maxOccurs Restrictions
        17.1.3  Required and Prohibited Attributes
    17.2  Value Constraints
        17.2.1  Data Length Restrictions
        17.2.2  Value Range Restrictions
        17.2.3  Pattern Restrictions
    17.3  Element and Attribute Qualified/Unqualified Forms
18  SOAP/XML Over UDP
    18.1  Using WS-Addressing with SOAP-over-UDP
    18.2  Client-side One-way Unicast
    18.3  Client-side One-way Multicast
    18.4  Client-side Request-Response Unicast
    18.5  Client-side Request-Response Multicast
    18.6  SOAP-over-UDP Server
    18.7  SOAP-over-UDP Multicast Receiving Server
19  Advanced Features
    19.1  Internationalization
    19.2  Customizing the WSDL and Namespace Mapping Table File Contents With gSOAP Directives
        19.2.1  Example
    19.3  Transient Data Types
    19.4  Serialization "as is" with Volatile Data Types
    19.5  How to Declare User-Defined Serializers and Deserializers
    19.6  How to Serialize Data Without Generating XSD Type Attributes
    19.7  Function Callbacks for Customized I/O and HTTP Handling
    19.8  HTTP 1.0 and 1.1
    19.9  HTTP 307 Temporary Redirect Support
    19.10  HTTP GET Support
    19.11  TCP and HTTP Keep-Alive
    19.12  HTTP Chunked Transfer Encoding
    19.13  HTTP Buffered Sends
    19.14  HTTP Authentication
    19.15  HTTP NTLM Authentication
    19.16  HTTP Proxy NTLM Authentication
    19.17  HTTP Proxy Basic Authentication
    19.18  Messaging Speed and Performance Improvement Tips
    19.19  Timeout Management for Non-Blocking Operations
    19.20  Socket Options and Flags
    19.21  Secure Web Services with HTTPS/SSL
    19.22  Secure Clients with HTTPS/SSL
    19.23  SSL Authentication Callbacks
    19.24  SSL Certificates and Key Files
    19.25  SSL Hardware Acceleration
    19.26  SSL on Windows
    19.27  Zlib Compression
    19.28  Client-Side Cookie Support
    19.29  Server-Side Cookie Support
    19.30  Connecting Clients Through Proxy Servers
    19.31  FastCGI Support
    19.32  How to Create gSOAP Applications With a Small Memory Footprint
    19.33  How to Eliminate BSD Socket Library Linkage
    19.34  How to Combine Multiple Client and Server Implementations into one Executable
    19.35  How to Build a Client or Server in a C++ Code Namespace
    19.36  How to Create Client/Server Libraries
        19.36.1  C++ Clients Example
        19.36.2  C Clients Example
        19.36.3  C Services Chaining Example
    19.37  How to Create DLLs
        19.37.1  Create the Base stdsoap2.dll
        19.37.2  Creating Client and Server DLLs
    19.38  gSOAP Plug-ins
        19.38.1  The Message Logging and Statistics Plug-in
        19.38.2  RESTful Interface: The HTTP GET Plug-in
        19.38.3  RESTful Interface: The HTTP POST Plug-in
        19.38.4  The HTTP MD5 Checksum Plug-in
        19.38.5  The HTTP Digest Authentication Plug-in
        19.38.6  The WS-Addressing Plug-in
        19.38.7  The WS-ReliableMessaging Plug-in
        19.38.8  The WS-Security Plug-in
        19.38.9  WS-Discovery

Copyright (C) 2000-2015 Robert A. van Engelen, Genivia Inc, All Rights Reserved.

1  Introduction

The gSOAP tools provide an automated SOAP and XML data binding for C and C++ based on compiler technologies. The tools simplify the development of SOAP/XML Web services and XML application in C and C++ using autocode generation and advanced mapping methods. Most toolkits for Web services adopt a WSDL/SOAP-centric view and offer APIs that require the use of class libraries for XML-specific data structures. This forces a user to adapt the application logic to these libraries because users have to write code to populate XML and extract data from XML using a vendor-specific API. This often leads to fragile solutions with little or no assurances for data consistency, type safety, and XML validation. By contrast, gSOAP provides a type-safe and transparent solution through the use of compiler technology that hides irrelevant WSDL-, SOAP-, REST-, and XML-specific protocol details from the user, while automatically ensuring XML validity checking, memory management, and type-safe serialization. The gSOAP tools automatically map native and user-defined C and C++ data types to semantically equivalent XML data types and vice-versa. As a result, full SOAP/REST XML interoperability is achieved with a simple API relieving the user from the burden of WSDL/SOAP/XML details, thus enabling him or her to concentrate on the application-essential logic.
The gSOAP tools support the integration of (legacy) C/C++ codes (and other programming languages when a C interface is available), embedded systems, and real-time software in SOAP/XML applications that share computational resources and information with other SOAP applications, possibly across different platforms, language environments, and disparate organizations located behind firewalls.
The gSOAP tools are also popular to implement XML data binding in C and C++. This means that application-native data structures can be encoded in XML automatically, without the need to write conversion code. The tools also produce XML schemas for the XML data binding, so external applications can consume the XML data based on the schemas.

1.1  Getting Started

To start building Web services applications or automate XML data bindings with gSOAP, you need:
  • The gSOAP package from http://www.genivia.com/Products/downloads.html (select gSOAP toolkit standard edition from the list of software packages)
  • A C or C++ compiler.
  • You may want to install OpenSSL and the Zlib libraries to enable SSL (HTTPS) and compression. These libraries are available for most platforms and are often already installed.
The gSOAP software is self-contained, so there is no need to download any third-party software (unless you want to use OpenSSL and the library is not already installed, or if you need to rebuild the soapcpp2 tool, see below).
The gSOAP packages available from SourceForge include pre-build tools in the gsoap/bin directory:
  • The wsdl2h WSDL/schema importer and data binding mapper tool.
  • The soapcpp2 stub/skeleton compiler and code generator.
Binaries of these two tools are included in the gSOAP package in gsoap/bin for Windows, Linux, and Mac OS plarforms, see also the README files in the package for more details.
Although gSOAP tools are available in binary format for several platforms, the code generated by these tools are all equivalent. This means that the generated source codes can be transferred to other platforms and locally compiled.
If you don't have the binaries or if you want to rebuild them, you need
  • A C compiler and Bison (or Yacc) to build soapcpp2.
  • A C compiler and Flex (or Lex) to build soapcpp2.
  • A C++ compiler to build wsdl2h.
Bison and Flex are preferred. Both are released under open source licenses that are compatible with gSOAP's licenses.
The gSOAP engine is built as a library libgsoap.a and libgsoap++.a with separate versions that support SSL. See the README.txt instructions on how to build these libraries with the platform-independent gSOAP package's autoconf and automake. Alternatively, you can compile and link the engine's source code stdsoap2.c (or stdsoap2.cpp for C++) directly with your code.
The gSOAP packages contain numerous examples in the samples directory. Run make to build the example applications. The examples are also meant to demonstrate different features of gSOAP. A streaming MTOM attachment server and client application demonstrate efficient file exchanges in samples/mtom-stream. An SSL-secure Web server application demonstrates the generation of dynamic content for Web browsing and Web services functionality at the same time, see samples/webservice. And much more.

1.2  Quick Start: Developing a Web Service Client Application

The gSOAP tools minimize application adaptation efforts for building Web Services by using a XML data binding for C and C++ implemented by advanced XML schema analyzers and source-to-source code generation tools. The gSOAP wsdl2h tool imports one or more WSDLs and XML schemas and generates a gSOAP header file with familiar C/C++ syntax to define the Web service operations and the C/C++ data types. The gSOAP soapcpp2 compiler then takes this header file and generates XML serializers for the data types (soapH.h and soapC.cpp), the client-side stubs (soapClient.cpp), and server-side skeletons (soapServer.cpp).
The gSOAP soapcpp2 compiler can also generate WSDL definitions for implementing a service from scratch, i.e. without defining a WSDL first. This "closes the loop" in that it enables Web services development from WSDL or directly from a set op C/C++ operations in a header file without the need for users to analyze Web service details.
You only need to follow a few steps to execute the tools from the command line or Makefile (see also MSVC++ project examples in the samples directory with tool integration in the MSVC++ IDE). For example, to generate code for the calculator Web service, we run the wsdl2h tool from the command line on the URL of the WSDL and use option -o to specify the output file:

> wsdl2h -o calc.h http://www.genivia.com/calc.wsdl

This generates the calc.h service definition header file with service operation definitions and types for the operation's data. This header file is then to be processed with soapcpp2 to generate the stub and/or skeleton code and XML serialization routines. The calc.h file includes all documentation, so you can use Doxygen (http://www.doxygen.org) to automatically generate the documentation pages for your development.
The wsdl2h-generated service definitions header file also contains information on the use of the service, such as WS-Policy assertions when applicable.
In this example we are developing a C++ API for the calculator service. By default, gSOAP assumes you will use C++ with STL. To build without STL, use option -s:

> wsdl2h -s -o calc.h http://www.genivia.com/calc.wsdl

To build a pure C application, use option -c:

> wsdl2h -c -o calc.h http://www.genivia.com/calc.wsdl

Important: Visual Studio users shopuld make sure to compile all gSOAP source files in C++ compilation mode. If you migrate to a project file .vcproj, please set CompileAs="2" in your .vcproj file. We have not yet generated the stubs for the C/C++ API. To do so, run the soapcpp2 compiler:

> soapcpp2 -i -C -Iimport calc.h

Option -i (and alternatively option -j) indicates that we want C++ proxy and server objects that include the client (and server) code, -C indicates client-side only files (soapcpp2 generates both client and server stubs and skeletons by default). Option -I is needed to import the stlvector.h file from the import directory in the gSOAP package to support serialization of STL vectors.
Suppose we develop a C++ client for the calculator service using wsdl2h -o calc.h http://www.genivia.com/calc.wsdl and soapcpp2 -i -C calc.h.
We use the generated soapcalcProxy class and calc.nsmap XML namespace mapping table to access the Web service. The soapcalcProxy class is a proxy to invoke the service:

#include "soapcalcProxy.h"
#include "calc.nsmap"
int main()
{
   calcProxy service;
   double result;
   if (service.add(1.0, 2.0, result) == SOAP_OK)
      std::cout << "The sum of 1.0 and 2.0 is " << result << std::endl;
   else
      service.soap_stream_fault(std::cerr);
   service.destroy(); // delete data and release memory
}

To complete the build, compile the code above and compile and link this with the generated soapC.cpp, soapcalcProxy.cpp, and the run-time gSOAP engine -lgsoap++ (or use source stdsoap2.cpp in case libgsoap++.a is not installed) with your code.
Suppose we develop a client in C using wsdl2h -c -o calc.h http://www.genivia.com/calc.wsdl and soapcpp2 -C calc.h. In this case our code uses a simple C function call to invoke the service and we also need to explicitly delete data and the context with soap_end and soap_free:


#include "soapH.h"
#include "calc.nsmap"
int main()
{
   struct soap *soap = soap_new();
   double result;
   if (soap_call_ns__add(soap, 1.0, 2.0, &result) == SOAP_OK)
      printf("The sum of 1.0 and 2.0 is %lg\n", result);
   else
      soap_print_fault(soap, stderr);
   soap_end(soap);
   soap_free(soap);
}

The calculator example is fairly simple and used here to illustrate the development process. The development process for large-scale XML applications is similar. More extensive examples can be found in the samples directory in the gSOAP package.

1.3  Quick Start: Developing a Web Service

Developing a service application is easy too. We will use CGI here because it is a simple mechanism. This is not the preferred deployment mechanism. Because CGI is slow and stateless. Faster services can be developed as a stand-alone gSOAP HTTP/HTTPS server (but see comments at the end of this section) or, as preferred, the use of Apache module or IIS with the mod_gsoap ISAPI extension (included in the gSOAP package under gsoap/mod_gsoap with instructions).
Suppose we implement a CGI-based service that returns the time in GMT. The Common Gateway Interface (CGI) is a simple mechanism to publish services on your Web site.
For this example we start with a gSOAP header file, currentTime.h which contains the service definitions. Such a file can be obtained from a WSDL using wsdl2h when a WSDL is available. When a WSDL is not available, you can define the service in C/C++ definitions in a newly created header file and let the gSOAP tools generate the source code and WSDL for you.
Our currentTime service only has an output parameter, which is the current time defined in our currentTime.h gSOAP service specification:

// File: currentTime.h
//gsoap ns service name: currentTime
//gsoap ns service namespace: urn:currentTime
//gsoap ns service location: http://www.yourdomain.com/currentTime.cgi
int ns__currentTime(time_t& response);

Note that we associate an XML namespace prefix ns and namespace name urn:currentTime with the service WSDL and SOAP/XML messages. The gSOAP tools use a special convention for identifier names that are part of a namespace: a namespace prefix (ns in this case) followed by a double underscore __. This convention is used to resolve namespaces and to avoid name clashes. The ns namespace prefix is bound to the urn:currentTime namespace name with the //gsoap directive. The //gsoap directives are used to set the properties of the service, in this case the name, namespace, and location endpoint.
The service implementation for CGI requires a soap_serve call on a soap context created with soap_new. The service operations are implemented as functions, which are called by the RPC dispatcher soap_serve:

// File: currentTime.cpp
#include "soapH.h" // include the generated declarations
#include "currentTime.nsmap" // include the XML namespace mappings
int main()
{
   // create soap context and serve one CGI-based request:
   return soap_serve(soap_new());
}
int ns__currentTime(struct soap *soap, time_t& response)
{
   response = time(0);
   return SOAP_OK;
}

Note that we pass the soap struct with the gSOAP context information to the service routine. This can come in handy to determine properties of the connection and to dynamically allocate data with soap_malloc(soap, num_bytes) that will be automatically deleted when the service is finished.
We run the soapcpp2 compiler on the header file to generate the server-side code:

> soapcpp2 -S currentTime.h

and then compile the CGI binary:

> c++ -o currentTime.cgi currentTime.cpp soapC.cpp soapServer.cpp stdsoap2.cpp

You will find stdsoap2.cpp in the gsoap dir. Or after installation you can link with libgsoap++ instead of using the stdsoap2.cpp source:

> c++ -o currentTime.cgi currentTime.cpp soapC.cpp soapServer.cpp -lgsoap++

To activate the service, copy the currentTime.cgi binary to your bin-cgi directory using the proper file permissions.
The soapcpp2 tool generated the WSDL definitions currentTime.wsdl. You can use the WSDL to advertize your service. You don't need to use this WSDL to develop a gSOAP client. You can use the currentTime.h file with soapcpp2 option -C to generate client-side code.
A convenient aspect of CGI is that it exchanges messages over standard input/output. Therefore, you can run the CGI binary on the auto-generated example request XML file to test your server:

> ./currentTime.cgi < currentTime.currentTime.req.xml

and this displays the server response in SOAP XML.
The above approach works also for C. Just use soapcpp2 option -c in addition to the -S option to generate ANSI C code. Of course, in C we use pointers instead of references and the currentTime.h file should be adjusted to use C-only types.
A more elegant server implementation in C++ can be obtained by using the soapcpp2 option -i (or -j) to generate C++ client-side proxy and server-side service objects as classes that you can use to build clients and services in C++. The option removes the generation of soapClient.cpp and soapServer.cpp, since these are no longer needed when we have classes that implement the client and server logic:

> soapcpp2 -i -S currentTime.h

This generates soapcurrentTimeService.h and soapcurrentTimeService.cpp files, as well as auxiliary files soapStub.h (included by default by all codes) and currentTime.nsmap.
Using the currentTimeService object we rewrite the CGI server as:

// File: currentTime.cpp
#include "soapcurrentTimeService.h" // include the proxy declarations
#include "currentTime.nsmap" // include the XML namespace mappings
int main()
{
   // create server and serve one CGI-based request:
   currentTimeService server;
   server.serve();
   server.destroy();
}
int currentTimeService::currentTime(time_t& response)
{
   response = time(0);
   return SOAP_OK;
}

Compile with

> c++ -o currentTime.cgi currentTime.cpp soapC.cpp soapcurrentTimeService.cpp -lgsoap++

and install the binary as CGI. To install the CGI binary please consult your Web server documentation on how to deploy CGI applications.
To run the server as a stand-alone iterative (non-multithreaded) server on port 8080:

while (server.run(8080) != SOAP_TCP_ERROR)
   server.soap_stream_fault(std::cerr);

To implement threaded services, please see Section 7.2.4. These stand-alone Web Services that handle multiple SOAP requests by spawning a thread for each request. Thread pooling is also an option. The use of Apache and IIS modules to deploy gSOAP services is preferred to ensure load balancing, access control, tracing, and so on.
For more information on server-side service classes, see Section 7.2.7. For more information on client-side proxy classes, see Section 7.1.4.

1.4  Quick Start: XML Data Bindings

Or in other words, how to map schemas (XSD files) to C/C++ bindings for automatically reading and writing XML data.
The XML C/C++ data binding in gSOAP provides and automated mechanism to encode any C and C++ data type in XML (and decode XML back to C/C++ data). An XML schema (XSD file) can be transformed into a set of C or C++ definitions that can be readily incorporated into your application to manipulate XML with much more ease than DOM or SAX. Essentially, each XML component definition in an XML schema has a C/C++ data type representation that has equivalent type properties. The advantage of this approach is immediately apparent when we look at an XSD complexType that maps to a class:

XSD C++
<complexType name="Address"> class ns__Address
   <sequence> {
      <element name="name" type="string"/>    std::string name;
      <element name="home" type="tns:Location" minOccurs="0"/>    ns__Location *home;
      <element name="phone" type="unsignedLong"/>    ULONG64 phone;
      <element name="dob" type="dateTime"/>    time_t dob;
   </sequence>
   <attribute name="ID" type="int" use="required"/>    @int ID;
</complexType> }

In this way, an automatic mapping between XML elements of the XML schema and members of a class is created to
No DOM traversals and SAX events are needed. In addition, the XML C/C++ data binding makes XML manipulation type safe. That is, the type safety of C/C++ ensures that only valid XML documents can be parsed and generated.
The wsdl2h tool performs the mapping of WSDL and XML schemas to C and/or C++ automatically. The output of wsdl2h is an annotated header file that includes comments and documentation on the use of the C/C++ declarations in a SOAP/XML client/server or in a generic application for reading and writing XML using the auto-generated serializers.
We will illustrate this further with an example. Suppose we have an XML document with a book record:

<book isbn="1234567890">
   <title>Farewell John Doe</title>
   <publisher>ABC's is our Name</publisher>
</book>

An example XML schema that defines the book element and type could be

<schema ...>
   <element name="book">
      <complexType>
         <sequence>
            <element name="title" type="string" minOccurs="1"/>
            <element name="publisher" type="string" minOccurs="1"/>
         </sequence>
         <attribute name="isbn" type="unsignedLong" use="required"/>
      </complexType>
   </element>
</schema>

Using wsdl2h we translate the XML schema that defines the book type and root element to a class definition:

class book
{
   @ULONG64 isbn;
   std::string title;
   std::string publisher;
}

Note that annotations such as @ are used to distinguish attributes from elements. These annotations are gSOAP-specific and are handled by the soapcpp2 tool to generate serializers for the data type(s) for reading and writing XML.
The soapcpp2 tool generates all the necessary code to parse and generate XML for book objects. Validation constraints such as minOccurs="1" and use="required" are included in the generated code as checks.
To write the XML representation of a book, we first create a soap engine context and use it with soap_write_book (generated by soapcpp2) to write the object in XML to standard output:

soap *ctx = soap_new1(SOAP_XML_INDENT); // new context with option
book bk;
bk.isbn = 1234567890;
bk.title = "Farewell John Doe";
bk.publisher = "ABC's is our Name";
if (soap_write_book(ctx, &bk) != SOAP_OK)
   ... error ...
soap_destroy(ctx); // clean up allocated class instances
soap_end(ctx); // clean up allocated temporaries
soap_free(ctx); // delete context

The ctx gSOAP engine context (type struct soap) controls settings and holds state, such as XML formatting, (e.g. SOAP_XML_INDENT), serialization options, current state, and I/O settings. Simply set the output stream (std::ostream) ctx->os of the context to redirect the content, e.g. to a file or string. Also, when serializing a graph rather than an XML tree (SOAP_XML_TREE option forces trees) the XML output conforms to SOAP encoding for object graphs based on id-ref, see Section 7.5 for details.
To read the XML representation from standard input into a book object, use:

soap *ctx = soap_new1(SOAP_XML_STRICT); // new context with option
book bk;
if (soap_read_book(ctx, &bk) != SOAP_OK)    ... error ...
else
   cout << bk.isbn << ", " << bk.title << ", " << bk.publisher << endl;
... further use of bk ...
soap_destroy(ctx); // delete deserialized objects
soap_end(ctx); // delete temporaries
soap_free(ctx); // delete context

Automatic built-in strict XML validation (enabled with SOAP_XML_STRICT) ensures that data members are present so we can safely print them in this example, thus ensuring consistency of data with the XML schema. Set the ctx->is input stream to read from a file/string stream instead of stdin.
The soap_destroy and soap_end calls deallocate the deserialized content, so use with care. In general, memory management is automatic in gSOAP to avoid leaks.
The above uses a very simple example schema. The gSOAP toolkit handles all XML schema constructs defined by the XML schema standard. The toolkit is also able to (de)serialize pointer-based C/C++ data structures (including cyclic graphs), structs/classes, unions, enums, STL containers, and even special data types such as struct tm. Therefore, the toolkit works in two directions: from WSDL/schema to C/C++ and from C/C++ to WSDL/schema.
The gSOAP toolkit also handles multiple schemas defined in multiple namespaces. Normally the namespace prefixes of XML namespaces are added to the C/C++ type definitions to ensure type uniqueness. For example, if we would combine two schemas in the same application where both schemas define a book object, we need to resolve this conflict. In gSOAP this is done using namespace prefixes, rather than C++ namespaces (research has pointed out that XML namespaces are not equivalent to C++ namespaces). Thus, the book class might actually be bound to an XML namespace and the class would be named ns__book, where ns is bound to the corresponding namespace.
The following options are available to control serialization:

soap->encodingStyle = NULL; // to remove SOAP 1.1/1.2 encodingStyle
soap_mode(soap, SOAP_XML_TREE); // XML without id-ref (no cycles!)
soap_mode(soap, SOAP_XML_GRAPH); // XML with id-ref (including cycles)
soap_set_namespaces(soap, struct Namespace *nsmap); //to set xmlns bindings

Other flags can be used to format XML, see Section 9.12.
For more details on XML databinding support for C and C++, see Section 7.5.

1.5  Feature Overview

The highlights of gSOAP are:
  • Unique interoperability features: the tools generate type-safe SOAP marshalling routines to (de)serialize native and user-defined C and C++ data structures.
  • Support WSDL 1.1, WSDL 2.0, REST, SOAP 1.1, SOAP 1.2, SOAP RPC encoding style, and document/literal style. gSOAP is one of the few SOAP toolkits that support the full range of SOAP 1.1 RPC encoding features including sparse multi-dimensional arrays and polymorphic types. For example, a service operation with a base class parameter may accept derived class instances from a client. Derived class instances keep their identity through dynamic binding. The toolkit also supports all XSD 1.0 and 1.1 schema type constructs and has been tested against the W3C XML Schema Patterns for Databinding Interoperability working group and of gSOAP release 2.8.x passes all tests.
  • Supports WS-Security, WS-Addressing, WS-ReliableMessaging, C14N exclusive canonicalization. The protocols are implemented using code generation with wsdl2h and soapcpp2. The gSOAP tools can be used to generate messaging protocols for other WS-* protocols.
  • gSOAP supports XML-RPC and RSS protocols. Examples are provided.
  • JSON support is included in the XML-RPC library to switch between XML-RPC and JSON protocols. For more details, see the samples/xml-rpc-json folder in the package.
  • The wsdl2h tool supports WS-Policy. Policy assertions are included in the generated service description header file with recommendations and usage hints.
  • gSOAP supports MIME (SwA), DIME, and MTOM attachments and has streaming capabilities to direct the data stream to/from resources. gSOAP is the only toolkit that supports streaming MIME, DIME, and MTOM attachment transfers, which allows you to exchange binary data of practically unlimited size in the fastest possible way (streaming) while ensuring the usefulness of XML interoperability.
  • gSOAP supports SOAP-over-UDP.
  • gSOAP supports IPv4 and IPv6.
  • gSOAP supports Zlib deflate and gzip compression (for HTTP, TCP/IP, and XML file storage).
  • gSOAP supports SSL (HTTPS) using OpenSSL and optionally using GNUTLS.
  • gSOAP supports HTTP/1.0, HTTP/1.1 keep-alive, chunking, basic authentication, and digest authentication using a plugin.
  • gSOAP supports SOAP one-way messaging.
  • The schema-specific XML pull parser is fast and efficient and does not require intermediate data storage for demarshalling to save space and time.
  • The soapcpp2 compiler includes a WSDL and schema generator for convenient Web Service publishing.
  • The soapcpp2 compiler generates sample input and output messages for verification and testing (before writing any code). An option (-T) can be used to automatically implement echo message services for testing.
  • The wsdl2h tool converts WSDL and XSD files to gSOAP header files for automated client and server development.
  • Generates source code for stand-alone Web Services and client applications.
  • Ideal for small devices such as Palm OS, Symbian, Pocket PC, because the memory footprint is small.
  • Ideal for building web services that are compute-intensive and are therefore best written in C and C++.
  • Platform independent: Windows, Unix, Linux, Mac OS X, Pocket PC, Palm OS, Symbian, VXWorks, etc.
  • Supports serializing of application's native C and C++ data structures, which allows you to save and load XML serialized data structures to and from files.
  • Selective input and output buffering is used to increase efficiency, but full message buffering to determine HTTP message length is not used. Instead, a three-phase serialization method is used to determine message length. As a result, large data sets such as base64-encoded images can be transmitted with or without DIME attachments by small-memory devices such as PDAs.
  • Supports C++ single class inheritance, dynamic binding, overloading, arbitrary pointer structures such as lists, trees, graphs, cyclic graphs, fixed-size arrays, (multi-dimensional) dynamic arrays, enumerations, built-in XSD Schema types including base64Binary encoding, and hexBinary encoding.
  • No need to rewrite existing C/C++ applications for Web service deployment. However, parts of an application that use unions, pointers to sequences of elements in memory, and void* need to be modified, but only if the data structures that adopt them are required to be serialized or deserialized as part of a service operation invocation.
  • Three-phase marshalling: 1) analysis of pointers, single-reference, multi-reference, and cyclic data structures, 2) HTTP message-length determination, and 3) serialization as per SOAP 1.1 encoding style or user-defined encoding styles.
  • Two-phase demarshalling: 1) SOAP parsing and decoding, which involves the reconstruction of multi-reference and cyclic data structures from the payload, and 2) resolution of "forward" pointers (i.e. resolution of the forward href attributes in SOAP).
  • Full and customizable SOAP Fault processing (client receive and service send).
  • Customizable SOAP Header processing (send and receive), which for example enables easy transaction processing for the service to keep state information.

2  Notational Conventions

The typographical conventions used by this document are:
Sans serif or italics font
denotes C and C++ source code, file names, and shell/batch commands.
Bold font
denotes C and C++ keywords.
Courier font
denotes HTTP header content, HTML, XML, XML Schema content and WSDL content.
[Optional]
denotes an optional construct.
The keywords "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in RFC-2119.

3  Differences Between gSOAP Versions 2.4 (and Earlier) and 2.5

To comply with WS-I Basic Profile 1.0a, gSOAP 2.5 and higher adopts SOAP document/literal by default. There is no need for concern, because the WSDL parser wsdl2h automatically takes care of the differences when you provide a WSDL document, because SOAP RPC encoding, literal, and document style are supported. A new soapcpp2 compiler option was added -e for backward compatibility with gSOAP 2.4 and earlier to adopt SOAP RPC encoding by default in case you want to develop a service that uses SOAP encoding. You can also use the gSOAP soapcpp2 compiler directives to specify SOAP encoding for individual operarations, when desired.

4  Differences Between gSOAP Versions 2.1 (and Earlier) and 2.2

You should read this section only if you are upgrading from gSOAP 2.1 to 2.2 and later.
Run-time options and flags have been changed to enable separate recv/send settings for transport, content encodings, and mappings. The flags are divided into four classes: transport (IO), content encoding (ENC), XML marshalling (XML), and C/C++ data mapping (C). The old-style flags soap_disable_X and soap_enable_X, where X is a particular feature, are deprecated. See Section 9.12 for more details.

5  Differences Between gSOAP Versions 1.X and 2.X

You should read this section only if you are upgrading from gSOAP 1.X to 2.X.
gSOAP versions 2.0 and later have been rewritten based on versions 1.X. gSOAP 2.0 and later is thread-safe, while 1.X is not. All files in the gSOAP 2.X distribution are renamed to avoid confusion with gSOAP version 1.X files:

gSOAP 1.X gSOAP 2.X
soapcpp soapcpp2
soapcpp.exe soapcpp2.exe
stdsoap.h stdsoap2.h
stdsoap.c stdsoap2.c
stdsoap.cpp stdsoap2.cpp

Changing the version 1.X application codes to accommodate gSOAP 2.X does not require a significant amount of recoding. The change to gSOAP 2.X affects all functions defined in stdsoap2.c[pp] (the gSOAP runtime context API) and the functions in the sources generated by the gSOAP soapcpp2 compiler (the gSOAP RPC+marshalling API). Therefore, clients and services developed with gSOAP 1.X need to be modified to accommodate a change in the calling convention used in 2.X: In 2.X, all gSOAP functions (including the service operation proxy routines) take an additional parameter which is an instance of the gSOAP runtime context that includes file descriptors, tables, buffers, and flags. This additional parameter is always the first parameter of any gSOAP function.
The gSOAP runtime context is stored in a struct soap type. A struct was chosen to support application development in C without the need for a separate gSOAP implementation. An object-oriented approach with a class for the gSOAP runtime context would have prohibited the implementation of pure C applications. Before a client can invoke service operations or before a service can accept requests, a runtime context needs to be allocated and initialized. Three new functions are added to gSOAP 2.X:

Function Description
soap_init(struct soap *soap) Initializes a context (required only once)
struct soap *soap_new() Allocates, initializes, and returns a pointer to a runtime context
struct soap *soap_copy(struct soap *soap) Allocates a new runtime context and copies contents of the context such that the new environment does not share any data with the original context

A context can be reused as many times as necessary and does not need to be reinitialized in doing so. A dynamically allocated context is deallocated with soap_free.
A new context is only required for each new thread to guarantee exclusive access to a new runtime context by each thread. For example, the following code stack-allocates the runtime context which is used for multiple service operation calls:

int main()
{
   struct soap soap;
   ...
   soap_init(&soap); // initialize runtime context
   ...
   soap_call_ns__method1(&soap, ...); // make a remote call
   ...
   soap_call_ns__method2(&soap, ...); // make another remote call
   ...
   soap_destroy(&soap); // remove deserialized class instances (C++ only)
   soap_end(&soap); // clean up and remove deserialized data
   soap_done(&soap); // detach context (last use and no longer in scope)
   ...
}

The runtime context can also be heap allocated:

int main()
{
   struct soap *soap;
   ...
   soap = soap_new(); // allocate and initialize runtime context
   if (!soap) // couldn't allocate: stop
   ...
   soap_call_ns__method1(soap, ...); // make a remote call
   ...
   soap_call_ns__method2(soap, ...); // make another remote call
   ...
   soap_destroy(soap); // remove deserialized class instances (C++ only)
   soap_end(soap); // clean up and remove deserialized data
   soap_free(soap); // detach and free runtime context
}

A service needs to allocate and initialize an context before calling soap_serve:

int main()
{
   struct soap soap;
   soap_init(&soap);
   soap_serve(&soap);
}

Or alternatively:

int main()
{
   soap_serve(soap_new());
}

The soap_serve dispatcher handles one request or multiple requests when HTTP keep-alive is enabled (with the SOAP_IO_KEEPALIVE flag see Section 19.11).
A service can use multi-threading to handle requests while running some other code that invokes service operations:

int main()
{
   struct soap soap1, soap2;
   pthread_t tid;
   ...
   soap_init(&soap1);
   if (soap_bind(&soap1, host, port, backlog) < 0) exit(1);
   if (soap_accept(&soap1) < 0) exit(1);
   pthread_create(&tid, NULL, (void*(*)(void*))soap_serve, (void*)&soap1);
   ...
   soap_init(&soap2);
   soap_call_ns__method(&soap2, ...); // make a remote call
   ...
   soap_end(&soap2);
   ...
   pthread_join(tid, NULL); // wait for thread to terminate
   soap_end(&soap1); // release its data
}

In the example above, two runtime contexts are required. In comparison, gSOAP 1.X statically allocates the runtime context, which prohibits multi-threading (only one thread can invoke service operations and/or accept requests due to the single runtime context).
Section 7.2.4 presents a multi-threaded stand-alone Web Service that handles multiple SOAP requests by spawning a thread for each request.

6  Interoperability

gSOAP interoperability has been verified with the following SOAP implementations and toolkits:
Apache 2.2
Apache Axis
ASP.NET
Cape Connect
Delphi
easySOAP++
eSOAP
Frontier
GLUE
Iona XMLBus
kSOAP
MS SOAP
Phalanx
SIM
SOAP::Lite
SOAP4R
Spray
SQLData
WCF
White Mesa
xSOAP
ZSI
4S4C

7  Quick User Guide

This user guide offers a quick way to get started with gSOAP. This section requires a basic understanding of the SOAP protocol and some familiarity with C and/or C++. In principle, SOAP clients and SOAP Web services can be developed in C and C++ with the gSOAP soapcpp2 compiler without a detailed understanding of the SOAP protocol when gSOAP client-server applications are built as an ensamble and only communicate within this group (i.e. meaning that you don't have to worry about interoperability with other SOAP implementations). This section is intended to illustrate the implementation of gSOAP Web services and clients that connect to and interoperate with other SOAP implementations such as Apache Axis, SOAP::Lite, and .NET. This requires some details of the SOAP and WSDL protocols to be understood.

7.1  How to Build SOAP/XML Clients

In general, the implementation of a SOAP client application requires a stub (also called service proxy) for each service operation that the client invokes. The primary stub's responsibility is to marshall the parameter data, send the request with the parameters to the designated SOAP service over the wire, to wait for the response, and to demarshall the parameter data of the response when it arrives. The client application invokes the stub routine for a service operation as if it would invoke a local function. To write a stub routine in C or C++ by hand is a tedious task, especially if the input and/or output parameters of a service operation contain elaborate data structures such as objects, structs, containers, arrays, and pointer-linked graph structures. Fortunately, the gSOAP wsdl2h WSDL parser tool and soapcpp2 stub/skeleton and serialization code generator tool automate the development of SOAP/XML Web service client and server applications.
The soapcpp2 tool generates the necessary gluing code (also called stubs and skeletons) to build web service clients and services. The input to the soapcpp2 tool consists of an service definition-annotated C/C++ header file. The header file can be generated from a WSDL (Web Service Description Language) documentation of a service with the gSOAP wsdl2h WSDL parser tool.
Consider the following command (entered at the Linux/Unix/Windows command line prompt):

> wsdl2h -o calc.h http://www.genivia.com/calc.wsdl

This generates the file Web service description calc.h in an annotated C++ header file. The WSDL specification (possibly consisting of multiple imported WSDL files and XSD schema files) is mapped to C++ using C++ databindings for SOAP/XML. The generated header file contains data types and messages to operate the service, and meta information related to WSDL and XML schemas.
To generate a service definition header file to develop a pure C client application, use the -c option:

> wsdl2h -c -o calc.h http://www.genivia.com/calc.wsdl

For more details on the WSDL parser and its options, see 8.
The service definition calc.h header file is further processed by the gSOAP soapcpp2 compiler to generate the gluing code's logic to invoke the Web service from a client.
Looking into the file calc.h we see that the SOAP service methods are specified as function prototypes. For example, the add function to add two double floats:

int ns2__add(double a, double b, double& result);

The ns2__add function uses an XML namespace prefix to distinguish it from operations defined in other namespaces, thus preventing name clashes. The convention to add an XML namespace prefix to the names of operations, types, and struct and class members is universally used by the gSOAP tools and automatically created by wsdl2h, but it is not mandatory when translating existing C/C++ types and operations to web services. Thus, the prefix notation can be omitted from type names defined in an header file with to run soapcpp2 to create clients and services that exchange existing (i.e. application-native) data types.
These function prototypes are translated by the gSOAP soapcpp2 tool to stubs and proxies for remote calls:

soapStub.h annotated copy of the input definitions
soapH.h serializers
soapC.cpp serializers
soapClient.cpp client calling stubs

Thus, the logic of the generated stub routines allow C and C++ client applications to seamlessly interact with existing SOAP Web services as illustrated by the client code example in the next section.
The input and output parameters of a SOAP service operation may be primitive data types or complex compound data types such as containers and pointer-based linked data structures. These are defined in the header file that is either generated by the WSDL parser or specified by hand. The gSOAP soapcpp2 tool automatically generates XML serializers and XML deserializers for the data types to enable the generated stub routines to encode and decode the contents of the parameters of the service operations in SOAP/XML.
Note that the gSOAP soapcpp2 tool also generates skeleton routines soapServer.cpp for each of the service operations specified in the header file. The skeleton routines can be readily used to implement one or more of the service operations in a new SOAP Web service. These skeleton routines are not used for building SOAP clients in C++, although they can be used to build mixed SOAP client/server applications (peer applications).

7.1.1  Example

The add service operation (declared in the calc.h file obtained with the wsdl2h tool in the previous section) adds two float values. The WSDL description of the service provides the endpoint to invoke the service operations and the XML namespace used by the operations:

Endpoint URL: http://websrv.cs.fsu.edu/ engelen/calcserver.cgi
XML namespace: urn:calc

Each service operation has a SOAP action, which is an optional string to identify the operation (mainly used with WS-Addressing), an operation request message and a response message. The request and response messages for SOAP RPC-encoded services are simply represented by C functions with input and output parameters. For the add operation, the SOAP binding details are:

SOAP style: RPC
SOAP encoding: encoded
SOAP action: "" (empty string)

This information is translated to the wsdl2h-generated header file with the service definitions. The calc.h header file for C++ generated by wsdl2h contains the following directives and declarations: (the actual contents may vary depending on the release version and the options used to control the output):

//gsoap ns2 service name: calc //gsoap ns2 service type: calcPortType //gsoap ns2 service port: http://websrv.cs.fsu.edu/ engelen/calcserver.cgi
//gsoap ns2 service namespace: urn:calc

//gsoap ns2 service method-protocol: add SOAP
//gsoap ns2 service method-style: add rpc
//gsoap ns2 service method-encoding: add http://schemas.xmlsoap.org/soap/encoding/
//gsoap ns2 service method-action: add ""
int ns2__add(double a, double b, double& result);

The other calculator operations are similar and elided here for clarity.
The //gsoap directives are required for the soapcpp2 tool to generate code that is compliant to the SOAP protocol. For this service the SOAP protocol with the common "RPC encoding style" is used. For //gsoap directive details, see Section 19.2.
The service operations are declared as function prototypes, with all non-primitive parameter types needed by the operation declared in the header file (all parameter types are primitive in this case).
The calculator add opertion takes two double floats a and b, and returns the sum in result. By convention, all parameters are input parameters except the last. The last parameter is always the output parameter. A struct or class is used to wrap multiple output parameters, see also Section 7.1.9. This last parameter must be a pointer or reference. By contrast, the input parameters support pass by value or by pointer, but not pass by C++ reference.
The function prototype associated with a service operation always returns an int. The value indicates success (0 or equivalently SOAP_OK) or failure (any nonzero value). See Section 10.2 for the nonzero error codes.
The role of the namespace prefix (ns2__) in the service operation name in the function prototype declaration is discussed in detail in 7.1.2. Basically, a namespace prefix is added to a function name or type name with a pair of underscores, as in ns2__add, where ns2 is the namespace prefix and add is the service operation name. This mechanism ensures uniqueness of operations and types associated with a service.
It is strongly recommended to set the namespace prefix to a name of your choice. This avoids problems when running wsdl2h on multiple WSDLs where the sequence of prefixes ns1, ns2, and so on are arbitrarily assigned to the services. To choose a prefix name for all the operations and types of a service, say prefix c__ for the calculator service, add the following line to typemap.dat:

c = "urn:calc"

and rerun wsdl2h. The typemap.dat configures wsdl2h to use specific bindings and data types for services. The result is that c__add is used to uniquely identify the operation rather than the more arbitrary name ns2__add.
Note on the use of underscores in names: a single underscore in an identifier name will be translated into a dash in XML, because dashes are more frequently used in XML compared to underscores, see Section 10.3.
Next, the gSOAP soapcpp2 tool is invoked from the command line to process the calc.h service definitions:

> soapcpp2 calc.h

The tool generates the stub routines for the service operations. Stub routines can be invoked by a client program to invoke the remote service operations. The interface of the generated stub routine is identical to the function prototype in the calc.h service defintion file, but with additional parameters to pass the gSOAP engine's runtime context soap, an endpoint URL (or NULL for the default), and a SOAP action (or NULL for the default):

int soap_call_c__add(struct soap *soap, char *URL, char *action, double a, double b, double& result);

This stub routine is saved in soapClient.cpp. The file soapC.cpp contains the serializer and deserializer routines for the data types used by the stub. You can use option -c for the soapcpp2 tool to generate pure C code, when needed.
Note: the soap parameter must be a valid pointer to a gSOAP runtime context. The URL can be set to override the default endpoint address (the endpoint defined by the WSDL). The action parameter can be set to override the default SOAP action.
The following example C/C++ client program uses the stub:

#include "soapH.h" // include all interfaces (library and generated)
#include "calc.nsmap" // import the generated namespace mapping table
int main()
{
   double sum;
   struct soap soap; // the gSOAP runtime context
   soap_init(&soap); // initialize the context (only once!)
   if (soap_call_c__add(&soap, NULL, NULL, 1.0, 2.0, &sum) == SOAP_OK)
      std::cout << "Sum = " << sum << std::endl;
   else // an error occurred
      soap_print_fault(&soap, stderr); // display the SOAP fault message on the stderr stream
   soap_destroy(&soap); // delete deserialized class instances (for C++)
   soap_end(&soap); // remove deserialized data and clean up
   soap_done(&soap); // detach the gSOAP context
   return 0;
}

The call returns SOAP_OK (zero) on success and a nonzero error on failure. When an error occurred the fault is displayed with the soap_print_fault function. Use soap_sprint_fault(struct soap*, char *buf, size_t len) to print the error to a string, and use soap_stream_fault(struct soap*, std::ostream&) to send it to a stream (C++ only).
The following functions can be used to explicitly setup a gSOAP runtime context (struct soap):

Function Description
soap_init(struct soap *soap) Initializes a runtime context
soap_init1(struct soap *soap, soap_mode iomode) Initializes a runtime context and set in/out mode flags
soap_init2(struct soap *soap, soap_mode imode, soap_mode omode) Initializes a runtime context and set in/out mode flags
struct soap *soap_new() Allocates, initializes, and returns a pointer to a runtime context
struct soap *soap_new1(soap_mode iomode) Allocates, initializes, and returns a pointer to a runtime context and set in/out mode flags
struct soap *soap_new2(soap_mode imode, soap_mode omode) Allocates, initializes, and returns a pointer to a runtime context and set in/out mode flags
struct soap *soap_copy(struct soap *soap) Allocates a new runtime context and copies a context (deep copy, i.e. the new context does not share any data with the other context)
soap_done(struct soap *soap) Reset, close communications, and remove callbacks
soap_free(struct soap *soap) Reset and deallocate the context created with soap_new or soap_copy

A runtime context can be reused as many times as necessary for client-side remote calls and does not need to be reinitialized in doing so. A new context is required for each new thread to guarantee exclusive access to runtime context by threads. Also the use of any client calls within an active service method requires a new context.
The soapcpp2 code generator tool also generates a service proxy class for C++ client applications (and service objects for server applications) with the -i (or -j) option:

> soapcpp2 -i calc.h

The proxy is defined in:

soapcalcProxy.h client proxy class
soapcalcProxy.cpp client proxy class

Note: without the -i option only old-style service proxies and objects are generated, which are less flexible and no longer recommended. Use -j as an alternative to -i to generate classes with the same functionality, but that are not inherited from struct soap and use a pointer to a struct soap engine context that can be shared with other proxy and service class instances. This choice is also important when services are chained, see Section 7.2.8.
The generated C++ proxy class initializes the gSOAP runtime context and offers the service interface as a collection of methods:

#include "soapcalcProxy.h" // get proxy
#include "calc.nsmap" // import the generated namespace mapping table
int main()
{
   calcProxy calc(SOAP_XML_INDENT);
   double sum;
   if (calc.add(1.0, 2.0, sum) == SOAP_OK)
      std::cout << "Sum = " << sum << std::endl;
   else
      calc.soap_stream_fault(std::cerr);
   return calc.error; // nonzero when error
}

The proxy class is derived from the gSOAP runtime context structure struct soap and thus inherits (option -i) all state information of the runtime. The proxy constructor takes context mode parameters to initialize the context, e.g. SOAP_XML_INDENT in this example.
The code is compiled and linked with soapcalcProxy.cpp, soapC.cpp, and stdsoap2.cpp (or use libgsoap++.a).
The proxy class name is extracted from the WSDL content and may not always be in a short format. Feel free to change the entry

//gsoap ns2 service name: calc

and rerun soapcpp2 to generate code that uses the new name.
When the example client application is invoked, a SOAP request is performed:

POST / engelen/calcserver.cgi HTTP/1.1
Host: websrv.cs.fsu.edu
User-Agent: gSOAP/2.7
Content-Type: text/xml; charset=utf-8
Content-Length: 464
Connection: close
SOAPAction: ""

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope
   xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
   xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:xsd="http://www.w3.org/2001/XMLSchema"
   xmlns:c="urn:calc">
   <SOAP-ENV:Body SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
      <c:add>
         <a>1</a>
         <b>2</b>
      </c:add>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

The SOAP response message:

HTTP/1.1 200 OK
Date: Wed, 05 May 2010 16:02:21 GMT
Server: Apache/2.0.52 (Scientific Linux)
Content-Length: 463
Connection: close
Content-Type: text/xml; charset=utf-8

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope
   xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
   xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:xsd="http://www.w3.org/2001/XMLSchema"
   xmlns:ns="urn:calc">
   <SOAP-ENV:Body SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
      <ns:addResponse>
         <result>3</result>
      </ns:addResponse>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

A client can invoke a sequence of service operations:

#include "soapcalcProxy.h" // get proxy
#include "calc.nsmap" // import the generated namespace mapping table
int main()
{
   calcProxy calc(SOAP_IO_KEEPALIVE); // keep-alive improves connection performance
   double sum = 0.0;
   double val[] = 5.0, 3.5, 7.1, 1.2 ;
   for (int i = 0; i < 4; i++)
      if (calc.add(sum, val[i], sum))
         return calc.error;
   std::cout << "Sum = " << sum << std::endl;
   return 0;
}

In the above, no data is deallocated until the proxy is deleted. To deallocate deserialized data between the calls, use:

   for (int i = 0; i < 4; i++)
   {
      if (calc.add(sum, val[i], sum))
         return calc.error;
      calc.destroy();
   }

Deallocation is safe here, since the float values were copied and saved in sum. In other scenarios one must make sure data is copied or removed from the deallocation chain with:

soap_unlink(struct soap *soap, const void *data)

which is to be invoked on each data item to be preserved, before destroying deallocated data. When the proxy is deleted, also all deserialized data is deleted. To delegate deletion to another runtime context for later removal, use:

soap_delegate_deletion(struct soap *soap_from, struct soap *soap_to)

For example

struct soap soap;
soap_init(&soap);
{ // create proxy
   calcProxy calc;
   ... data generated ...
   soap_delegate_deletion(&calc, &soap);
} // proxy deleted
... data used ...
soap_destroy(&soap);
soap_end(&soap);
soap_done(&soap);

In C (use wsdl2h -c) the example program would be written as:

#include "soapH.h"
#include "calc.nsmap"
int main()
{
   struct soap soap;
   double sum = 0.0;
   double val[] = 5.0, 3.5, 7.1, 1.2 ;
   int i;
   for (i = 0; i < 4; i++)
   soap_init1(&soap, SOAP_IO_KEEPALIVE);
      if (soap_call_c__add(&soap, NULL, NULL, sum, val[i], &sum))
         return soap.error;
   printf("Sum = %lg\n", sum);
   soap_end(&soap);
   soap_done(&soap);
   return 0;
}

The code above is compiled and linked with soapClient.c, soapC.c, and stdsoap2.c (or use libgsoap.a).

7.1.2  XML Namespace Considerations

The declaration of the ns2__add function prototype (discussed in the previous section) uses the namespace prefix ns2__ of the service operation namespace, which is distinguished by a pair of underscores in the function name to separate the namespace prefix from the service operation name. The purpose of a namespace prefix is to associate a service operation name with a service in order to prevent naming conflicts, e.g. to distinguish identical service operation names used by different services.
Note that the XML response of the service example uses a namespace prefix that may be different (e.g. ns) as long as it bound to the same namespace name urn:calc through the xmlns:ns="urn:calc binding. The use of namespace prefixes and namespace names is also required to enable SOAP applications to validate the content of SOAP messages. The namespace name in the service response is verified by the stub routine by using the information supplied in a namespace mapping table that is required to be part of gSOAP client and service application codes. The table is accessed at run time to resolve namespace bindings, both by the generated stub's data structure serializer for encoding the client request and by the generated stub's data structure deserializer to decode and validate the service response. The namespace mapping table should not be part of the header file input to the gSOAP soapcpp2 tool. Service details including namespace bindings may be provided with gSOAP directives in a header file, see Section 19.2.
The namespace mapping table is:

struct Namespace namespaces[] =
{   // {"ns-prefix", "ns-name"}
   {"SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/"}, // MUST be first
   {"SOAP-ENC", "http://schemas.xmlsoap.org/soap/encoding/"}, // MUST be second
   {"xsi", "http://www.w3.org/2001/XMLSchema-instance"}, // MUST be third
   {"xsd", "http://www.w3.org/2001/XMLSchema"}, // 2001 XML Schema
   {"ns2", "urn:calc"}, // given by the service description
   {NULL, NULL} // end of table
};

The first four namespace entries in the table consist of the standard namespaces used by the SOAP 1.1 protocol. In fact, the namespace mapping table is explicitly declared to enable a programmer to specify the SOAP encoding style and to allow the inclusion of namespace-prefix with namespace-name bindings to comply to the namespace requirements of a specific SOAP service. For example, the namespace prefix ns2, which is bound to urn:calc by the namespace mapping table shown above, is used by the generated stub routine to encode the add request. This is performed automatically by the gSOAP soapcpp2 tool by using the ns2 prefix of the ns2__add method name specified in the calc.h header file. In general, if a function name of a service operation, struct name, class name, enum name, or field name of a struct or class has a pair of underscores, the name has a namespace prefix that must be defined in the namespace mapping table.
The namespace mapping table will be output as part of the SOAP Envelope by the stub routine. For example:

...
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
   xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:xsd="http://www.w3.org/2001/XMLSchema"
   xmlns:ns2="urn:calc"
   SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
...

The namespace bindings will be used by a SOAP service to validate the SOAP request.

7.1.3  Example

The incorporation of namespace prefixes into C++ identifier names is necessary to distinguish service operations that share the same name but are provided by separate Web services and/or organizations. It avoids potential name clashes, while sticking to the C syntax. The C++ proxy classes generated with soapcpp2 -i (or -j) drop the namespace prefix from the method names
The namespace prefix convention is also be applied to non-primitive types. For example, class names are prefixed to avoid name clashes when the same name is used by multiple XML schemas. This ensures that the XML databinding never suffers from conflicting schema content. For example:

class e__Address // an electronic address from schema 'e'
{
   char *email;
   char *url;
};
class s__Address // a street address from schema 's'
{
   char *street;
   int number;
   char *city;
};

The namespace prefix is separated from the name of a data type by a pair of underscores (__).
An instance of e__Address is encoded by the generated serializer for this type as an Address element with namespace prefix e:

<e:Address xsi:type="e:Address">
   <email xsi:type="string">me@home</email>
   <url xsi:type="string">www.me.com</url>
</e:Address>

While an instance of s__Address is encoded by the generated serializer for this type as an Address element with namespace prefix s:

<s:Address xsi:type="s:Address">
   <street xsi:type="string">Technology Drive</street>
   <number xsi:type="int">5</number>
   <city xsi:type="string">Softcity</city>
</s:Address>

The namespace mapping table of the client program must have entries for e and s that refer to the XML Schemas of the data types:

struct Namespace namespaces[] =
{ ...
   {"e", "http://www.me.com/schemas/electronic-address"},
   {"s", "http://www.me.com/schemas/street-address"},
...

This table is required to be part of the client application to allow access by the serializers and deserializers of the data types at run time.

7.1.4  How to Generate C++ Client Proxy Classes

Proxy classes for C++ client applications are automatically generated by the gSOAP soapcpp2 tool, as was shown in Section 7.1.1.
There is a new and improved code generation capability for proxy classes, which is activated with the soapcpp2 -i (or j) option. These new proxy classes are derived from the soap structure, have a cleaner interface and offer more capabilites.
With C++, you can also use wsdl2h option -qname to generate the proxy in a C++ namespace name. This is very useful if you want to create multiple proxies for services by repeated use of wsdl2h and combine them in one code. Alternatively, you can run wsdl2h just once on all service WSDLs and have soapcpp2 generate multiple proxies for you. The latter approach does not use C++ namespaces and may reduce the overall amount of code.
To illustrate the generation of a "standard" (old-style) proxy class, the calc.h header file example of the previous section is augmented with the appropriate directives to enable the gSOAP soapcpp2 tool to generate the proxy class. Directives are included in the generated header file by the wsdl2h WSDL importer:

// Content of file "calc.h":
//gsoap ns2 service name: calc
//gsoap ns2 service port: http://websrv.cs.fsu.edu/ engelen/calcserver.cgi
//gsoap ns2 service protocol: SOAP1.1
//gsoap ns2 service style: rpc
//gsoap ns2 service encoding: encoded
//gsoap ns2 service namespace: urn:calc

//gsoap ns2 service method-protocol: add SOAP
//gsoap ns2 service method-style: add rpc
//gsoap ns2 service method-encoding: add encoded
//gsoap ns2 service method-action: add ""
int ns2__add(double a, double b, double& result);

//gsoap ns2 service method-protocol: sub SOAP
//gsoap ns2 service method-style: sub rpc
//gsoap ns2 service method-encoding: sub encoded
//gsoap ns2 service method-action: sub ""
int ns2__sub(double a, double b, double& result);

//gsoap ns2 service method-protocol: mul SOAP
//gsoap ns2 service method-style: mul rpc
//gsoap ns2 service method-encoding: mul encoded
//gsoap ns2 service method-action: mul ""
int ns2__mul(double a, double b, double& result);

...

The first three directives provide the service details, which is used to name the proxy class, the service location port (endpoint), and the XML namespace. The subsequent groups of three directives per method define the operation's SOAP style (RPC) and encoding (SOAP encoded), and SOAP action string. These directives can be provided for each service operation when the SOAPAction is required, such as with SOAP1.1 RPC encoded and when WS-Addressing is used. In this example, the service protocol is set by default for all operations to use SOAP 1.1 RPC encoding. For //gsoap directive details, see Section 19.2.
The soapcpp2 tool takes this header file and generates a proxy soapcalcProxy.h with the following contents (not using option -i):

#include "soapH.h"
class calc
{ public:
   struct soap *soap;
   const char *endpoint;
   calc() { ... };
   ~calc() { ... };
   virtual int ns2__add(double a, double b, double& result) { return soap ? soap_call_ns2__add(soap, endpoint, NULL, a, b, result) : SOAP_EOM; };
   virtual int ns2__sub(double a, double b, double& result) { return soap ? soap_call_ns2__sub(soap, endpoint, NULL, a, b, result) : SOAP_EOM; };
   virtual int ns2__mul(double a, double b, double& result) { return soap ? soap_call_ns2__mul(soap, endpoint, NULL, a, b, result) : SOAP_EOM; };
   ...
};

The gSOAP context and endpoint are declared public to enable access.
This generated proxy class can be included into a client application together with the generated namespace table as shown in this example:

#include "soapcalcProxy.h" // get proxy
#include "calc.nsmap" // get namespace bindings
int main()
{
   calc s;
   double r;
   if (s.ns2__add(1.0, 2.0, r) == SOAP_OK)
      std::cout << r << std::endl;
   else
      soap_print_fault(s.soap, stderr);
   return 0;
}

The constructor allocates and initializes a gSOAP context for the instance.
You can use soapcpp2 option -n together with -p to create a local namespaces table to avoid link conflicts when you need multiple namespace tables or need to combine multiple clients, see also Sections 9.1 and 19.36, and you can use a C++ code namespace to create a namespace qualified proxy class, see Section 19.35.
The soapcpp2 -i option to generate proxy classes derived from the base soap structure. In addition, these classes offer more functionality as illustrated in Section 7.1.1.

7.1.5  XSD Type Encoding Considerations

Many SOAP services require the explicit use of XML Schema types in the SOAP payload. The default encoding, which is also adopted by the gSOAP soapcpp2 tool, assumes SOAP RPC encoding which only requires the use of types to handle polymorphic cases. Nevertheless, the use of XSD typed messages is advised to improve interoperability. XSD types are introduced with typedef definitions in the header file input to the gSOAP soapcpp2 tool. The type name defined by a typedef definition corresponds to an XML Schema type (XSD type). For example, the following typedef declarations define various built-in XSD types implemented as primitive C/C++ types:

// Contents of header file:
...
typedef char *xsd__string; // encode xsd__string value as the xsd:string schema type
typedef char *xsd__anyURI; // encode xsd__anyURI value as the xsd:anyURI schema type
typedef float xsd__float; // encode xsd__float value as the xsd:float schema type
typedef long xsd__int; // encode xsd__int value as the xsd:int schema type
typedef bool xsd__boolean; // encode xsd__boolean value as the xsd:boolean schema type
typedef unsigned long long xsd__positiveInteger; // encode xsd__positiveInteger value as the xsd:positiveInteger schema type
...

This easy-to-use mechanism informs the gSOAP soapcpp2 tool to generate serializers and deserializers that explicitly encode and decode the primitive C++ types as built-in primitive XSD types when the typedefed type is used in the parameter signature of a service operation (or when used nested within structs, classes, and arrays). At the same time, the use of typedef does not force any recoding of a C++ client or Web service application as the internal C++ types used by the application are not required to be changed (but still have to be primitive C++ types, see Section 11.3.2 for alternative class implementations of primitive XSD types which allows for the marshalling of polymorphic primitive types).

7.1.6  Example

Reconsider the calculator example, now rewritten with explicit XSD types to illustrate the effect:

// Contents of file "calc.h":
typedef double xsd__double;
int ns2__add(xsd__string a, xsd__double b, xsd__double &Result);

When processed by the gSOAP soapcpp2 tool it generates source code for the function soap_call_ns2__add, which is identical to the C-style SOAP call:

int soap_call_ns2__add(struct soap *soap, char *URL, char *action, double a, double b, double& result);

The client application does not need to be rewritten and can still call the proxy using the "old" C-style function signatures. In contrast to the previous implementation of the stub however, the encoding and decoding of the data types by the stub has been changed to explicitly use the XSD types in the message payload.
For example, when the client application calls the proxy, the proxy produces a SOAP request with an xsd:double (the xsi:type is shown when the soapcpp2 -t option is used):

...
<SOAP-ENV:Body>
   <ns2:add>
      <a xsi:type="xsd:string">1.0</a>
      <b xsi:type="xsd:string">2.0</b>
   </ns2:add>
</SOAP-ENV:Body>
...

The service response is:

...
<soap:Body>
   <n:addResponse xmlns:n="urn:calc">
      <result xsi:type="xsd:double">3.0</result>
   </n:addResponse>
</soap:Body>
...

The validation of this service response by the stub routine takes place by matching the namespace names (URIs) that are bound to the xsd namespace prefix. The stub also expects the addResponse element to be associated with URI urn:calc through the binding of the namespace prefix ns2 in the namespace mapping table. The service response uses namespace prefix n for the addResponse element. This namespace prefix is bound to the same URI urn:calc and therefore the service response is valid. When the XML is not well formed or does not pass validation, the response is rejected and a SOAP fault is generated. The validation level can be increased with the SOAP_XML_STRICT flag, but this is not advised for SOAP RPC encoded messaging.

7.1.7  How to Change the Response Element Name

There is no standardized convention for the response element name in a SOAP RPC encoded response message, although it is recommended that the response element name is the method name ending with "Response". For example, the response element of add is addResponse.
The response element name can be specified explicitly using a struct or class declaration in the header file. This name must be qualified by a namespace prefix, just as the operation name should use a namespace prefix. The struct or class name represents the SOAP response element name used by the service. Consequently, the output parameter of the service operation must be declared as a field of the struct or class. The use of a struct or a class for the service response is fully SOAP 1.1 compliant. In fact, the absence of a struct or class indicates to the soapcpp2 tool to automatically generate a struct for the response which is internally used by a stub.

7.1.8  Example

Reconsider the calculator service operation specification which can be rewritten with an explicit declaration of a SOAP response element as follows:

// Contents of "calc.h":
typedef double xsd__double;
struct ns2__addResponse {xsd__double result;};
int ns2__add(xsd__string a, xsd__double b, struct ns2__addResponse &r);

The SOAP request and response messages are the same as before:

...
<SOAP-ENV:Body>
   <ns2:add>
      <a xsi:type="xsd:string">1.0</a>
      <b xsi:type="xsd:string">2.0</b>
   </ns2:add>
</SOAP-ENV:Body>
...

The difference is that the service response is required to match the specified addResponse name and its namespace URI:

...
<soap:Body>
   <n:addResponse xmlns:n='urn:calc'>
      <result xsi:type="xsd:double">3.0</result>
   </n:addResponse>
</soap:Body>
...

This use of a struct or class enables the adaptation of the default SOAP response element name and/or namespace URI when required.

7.1.9  How to Specify Multiple Output Parameters

The gSOAP soapcpp2 tool compiler uses the convention that the last parameter of the function prototype declaration of a service operation in a header file is also the only single output parameter of the method. All other parameters are considered input parameters of the service operation. To specify a service operation with multiple output parameters, a struct or class must be declared for the service operation response, see also 7.1.7. The name of the struct or class must have a namespace prefix, just as the service method name. The fields of the struct or class are the output parameters of the service operation. Both the order of the input parameters in the function prototype and the order of the output parameters (the fields in the struct or class) is not significant. However, the SOAP 1.1 specification states that input and output parameters may be treated as having anonymous parameter names which requires a particular ordering, see Section 7.1.13.

7.1.10  Example

As an example, consider a hypothetical service operation getNames with a single input parameter SSN and two output parameters first and last. This can be specified as:

// Contents of file "getNames.h":
int ns3__getNames(char *SSN, struct ns3__getNamesResponse {char *first; char *last;} &r);

The gSOAP soapcpp2 tool takes this header file as input and generates source code for the function soap_call_ns3__getNames. When invoked by a client application, the proxy produces the SOAP request:

...
<SOAP-ENV:Envelope ... xmlns:ns3="urn:names" ...>
...
<ns3:getNames>
<SSN>999 99 9999</SSN>
</ns3:getNames>
...

The response by a SOAP service could be:

...
<m:getNamesResponse xmlns:m="urn:names">
<first>John</first>
<last>Doe</last>
</m:getNamesResponse>
...

where first and last are the output parameters of the getNames service operation of the service.
As another example, consider a service operation copy with an input parameter and an output parameter with identical parameter names (this is not prohibited by the SOAP 1.1 protocol). This can be specified as well using a response struct:

// Content of file "copy.h":
int X_rox__copy_name(char *name, struct X_rox__copy_nameResponse {char *name;} &r);

The use of a struct or class for the service operation response enables the declaration of service operations that have parameters that are passed both as input and output parameters.
The gSOAP soapcpp2 compiler takes the copy.h header file as input and generates the soap_call_X_rox__copy_name proxy. When invoked by a client application, the proxy produces the SOAP request:

...
<SOAP-ENV:Envelope ... xmlns:X-rox="urn:copy" ...>
...
<X-rox:copy-name>
<name>SOAP</name>
</X-rox:copy-name>
...

The response by a SOAP copy service could be something like:

...
<m:copy-nameResponse xmlns:m="urn:copy">
<name>SOAP</name>
</m:copy-nameResponse>
...

The name will be parsed and decoded by the proxy and returned in the name field of the struct X_rox__copy_nameResponse &r parameter.

7.1.11  How to Specify Output Parameters With struct/class Compound Data Types

If the single output parameter of a service operation is a complex data type such as a struct or class it is necessary to specify the response element of the service operation as a struct or class at all times. Otherwise, the output parameter will be considered the response element (!), because of the response element specification convention used by gSOAP, as discussed in 7.1.7.

7.1.12  Example

This is best illustrated with an example. The Flighttracker service by ObjectSpace provides real time flight information for flights in the air. It requires an airline code and flight number as parameters. The service operation name is getFlightInfo and the method has two string parameters: the airline code and flight number, both of which must be encoded as xsd:string types. The method returns a getFlightResponse response element with a return output parameter that is of complex type FlightInfo. The type FlightInfo is represented by a class in the header file, whose field names correspond to the FlightInfo accessors:

// Contents of file "flight.h":
typedef char *xsd__string;
class ns2__FlightInfo
{
   public:
   xsd__string airline;
   xsd__string flightNumber;
   xsd__string altitude;
   xsd__string currentLocation;
   xsd__string equipment;
   xsd__string speed;
};
struct ns1__getFlightInfoResponse {ns2__FlightInfo return_;};
int ns1__getFlightInfo(xsd__string param1, xsd__string param2, struct ns1__getFlightInfoResponse &r);

The response element ns1__getFlightInfoResponse is explicitly declared and it has one field: return_ of type ns2__FlightInfo. Note that return_ has a trailing underscore to avoid a name clash with the return keyword, see Section 10.3 for details on the translation of C++ identifiers to XML element names.
The gSOAP soapcpp2 compiler generates the soap_call_ns1__getFlightInfo proxy. Here is an example fragment of a client application that uses this proxy to request flight information:

struct soap soap;
...
soap_init(&soap);
...
soap_call_ns1__getFlightInfo(&soap, "testvger.objectspace.com/soap/servlet/rpcrouter",
   "urn:galdemo:flighttracker", "UAL", "184", r);
...
struct Namespace namespaces[] =
{
   {"SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/"},
   {"SOAP-ENC","http://schemas.xmlsoap.org/soap/encoding/"},
   {"xsi", "http://www.w3.org/2001/XMLSchema-instance"},
   {"xsd", "http://www.w3.org/2001/XMLSchema"},
   {"ns1", "urn:galdemo:flighttracker"},
   {"ns2", "http://galdemo.flighttracker.com"},
   {NULL, NULL}
};

When invoked by a client application, the proxy produces the SOAP request:

POST /soap/servlet/rpcrouter HTTP/1.1
Host: testvger.objectspace.com
Content-Type: text/xml
Content-Length: 634
SOAPAction: "urn:galdemo:flighttracker"

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
   xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:xsd="http://www.w3.org/2001/XMLSchema"
   xmlns:ns1="urn:galdemo:flighttracker"
   xmlns:ns2="http://galdemo.flighttracker.com"
   SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<ns1:getFlightInfo xsi:type="ns1:getFlightInfo">
<param1 xsi:type="xsd:string">UAL</param1>
<param2 xsi:type="xsd:string">184</param2>
</ns1:getFlightInfo>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

The Flighttracker service responds with:

HTTP/1.1 200 ok
Date: Thu, 30 Aug 2001 00:34:17 GMT
Server: IBM_HTTP_Server/1.3.12.3 Apache/1.3.12 (Win32)
Set-Cookie: sesessionid=2GFVTOGC30D0LGRGU2L4HFA;Path=/
Cache-Control: no-cache="set-cookie,set-cookie2"
Expires: Thu, 01 Dec 1994 16:00:00 GMT
Content-Length: 861
Content-Type: text/xml; charset=utf-8
Content-Language: en

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<SOAP-ENV:Body>
<ns1:getFlightInfoResponse xmlns:ns1="urn:galdemo:flighttracker"
   SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<return xmlns:ns2="http://galdemo.flighttracker.com" xsi:type="ns2:FlightInfo">
<equipment xsi:type="xsd:string">A320</equipment>
<airline xsi:type="xsd:string">UAL</airline>
<currentLocation xsi:type="xsd:string">188 mi W of Lincoln, NE</currentLocation>
<altitude xsi:type="xsd:string">37000</altitude>
<speed xsi:type="xsd:string">497</speed>
<flightNumber xsi:type="xsd:string">184</flightNumber>
</return>
</ns1:getFlightInfoResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

The proxy returns the service response in variable r of type struct ns1__getFlightInfoResponse and this information can be displayed by the client application with the following code fragment:

cout << r.return_.equipment << " flight " << r.return_.airline << r.return_.flightNumber
    << " traveling " << r.return_.speed << " mph " << " at " << r.return_.altitude
    << " ft, is located " << r.return_.currentLocation << endl;

This code displays the service response as:

A320 flight UAL184 traveling 497 mph at 37000 ft, is located 188 mi W of Lincoln, NE

Note: the flight tracker service is no longer available since 9/11/2001. It is kept in the documentation as an example to illustrate the use of structs/classes and response types.

7.1.13  How to Specify Anonymous Parameter Names

The SOAP RPC encoding protocol allows parameter names to be anonymous. That is, the name(s) of the output parameters of a service operation are not strictly required to match a client's view of the parameters names. Also, the input parameter names of a service operation are not strictly required to match a service's view of the parameter names. The gSOAP soapcpp2 compiler can generate stub and skeleton routines that support anonymous parameters. Parameter names are implicitly anonymous by omitting the parameter names in the function prototype of the service operation. For example:

// Contents of "calc.h":
typedef double xsd__double;
int ns2__add(xsd__string, xsd__double, xsd__double &);

To make parameter names explicitly anonymous on the receiving side (client or service), the parameter names should start with an underscore (_) in the function prototype in the header file.
For example:

// Contents of "calc.h":
typedef double xsd__double;
int ns2__add(xsd__string _a, xsd__double _b, xsd__double & _return);

In this example, the _a, _b, and _return are anonymous parameters. As a consequence, the service response to a request made by a client created with gSOAP using this header file specification may include any name for the output parameter in the SOAP payload. The input parameters may also be anonymous. This affects the implementation of Web services in gSOAP and the matching of parameter names by the service.
Caution: when anonymous parameter names are used, the order of the parameters in the function prototype of a service operation is significant.

7.1.14  How to Specify a Method with No Input Parameters

To specify a service operation that has no input parameters, just provide a function prototype with one parameter which is the output parameter (some C/C++ compilers will not compile and complain about an empty struct: use compile flag -DWITH_NOEMPTYSTRUCT to compile the generated code for these cases). This struct is generated by gSOAP to contain the SOAP request message. To fix this, provide one input parameter of type void* (gSOAP can not serialize void* data). For example:

struct ns3__SOAPService
{
   public:
   int ID;
   char *name;
   char *owner;
   char *description;
   char *homepageURL;
   char *endpoint;
   char *SOAPAction;
   char *methodNamespaceURI;
   char *serviceStatus;
   char *methodName;
   char *dateCreated;
   char *downloadURL;
   char *wsdlURL;
   char *instructions;
   char *contactEmail;
   char *serverImplementation;
};
struct ArrayOfSOAPService {struct ns3__SOAPService *__ptr; int __size;};
int ns__getAllSOAPServices(void *_, struct ArrayOfSOAPService &_return);

The ns__getAllSOAPServices method has one void* input parameter which is ignored by the serializer to produce the request message.
Most C/C++ compilers allow empty structs and therefore the void* parameter is not required.

7.1.15  How to Specify a Method with No Output Parameters

To specify a service operation that has no output parameters, just define a function prototype with a response struct that is empty. For example:

enum ns__event { off, on, stand_by };
int ns__signal(enum ns__event in, struct ns__signalResponse { } *out);

Since the response struct is empty, no output parameters are specified.
Some SOAP resources refer to SOAP RPC with empty responses as one way SOAP messaging. However, we refer to one-way massaging by asynchronous explicit send and receive operations as described in Section 7.3. The latter view of one-way SOAP messaging is also in line with Basic Profile 1.0.

7.2  How to Build SOAP/XML Web Services

The gSOAP soapcpp2 compiler generates skeleton routines in C++ source form for each of the service operations specified as function prototypes in the header file processed by the gSOAP soapcpp2 compiler. The skeleton routines can be readily used to implement the service operations in a new SOAP Web service. The compound data types used by the input and output parameters of service operations must be declared in the header file, such as structs, classes, arrays, and pointer-based data structures (graphs) that are used as the data types of the parameters of a service operation. The gSOAP soapcpp2 compiler automatically generates serializers and deserializers for the data types to enable the generated skeleton routines to encode and decode the contents of the parameters of the service operations. The gSOAP soapcpp2 compiler also generates a service operation request dispatcher routine that will serve requests by calling the appropriate skeleton when the SOAP service application is installed as a CGI application on a Web server.

7.2.1  Example

The following example specifies three service operations to be implemented by a new SOAP Web service:

// Contents of file "calc.h":
typedef double xsd__double;
int ns__add(xsd__double a, xsd__double b, xsd__double &result);
int ns__sub(xsd__double a, xsd__double b, xsd__double &result);
int ns__sqrt(xsd__double a, xsd__double &result);

The add and sub methods are intended to add and subtract two double floating point numbers stored in input parameters a and b and should return the result of the operation in the result output parameter. The sqrt method is intended to take the square root of input parameter a and to return the result in the output parameter result. The xsd__double type is recognized by the gSOAP soapcpp2 compiler as the xsd:double XSD Schema data type. The use of typedef is a convenient way to associate primitive C types with primitive XML Schema data types.
To generate the skeleton routines, the gSOAP soapcpp2 compiler is invoked from the command line with:

> soapcpp2 calc.h

The compiler generates the skeleton routines for the add, sub, and sqrt service operations specified in the calc.h header file. The skeleton routines are respectively, soap_serve_ns__add, soap_serve_ns__sub, and soap_serve_ns__sqrt and saved in the file soapServer.cpp. The generated file soapC.cpp contains serializers and deserializers for the skeleton. The compiler also generates a service dispatcher: the soap_serve function handles client requests on the standard input stream and dispatches the service operation requests to the appropriate skeletons to serve the requests. The skeleton in turn calls the service operation implementation function. The function prototype of the service operation implementation function is specified in the header file that is input to the gSOAP soapcpp2 compiler.
Here is an example Calculator service application that uses the generated soap_serve routine to handle client requests:

// Contents of file "calc.cpp":
#include "soapH.h"
#include < math.h > // for sqrt()
int main()
{
   return soap_serve(soap_new()); // use the service operation request dispatcher
}
// Implementation of the "add" service operation:
int ns__add(struct soap *soap, double a, double b, double &result)
{
   result = a + b;
   return SOAP_OK;
}
// Implementation of the "sub" service operation:
int ns__sub(struct soap *soap, double a, double b, double &result)
{
   result = a - b;
   return SOAP_OK;
}
// Implementation of the "sqrt" service operation:
int ns__sqrt(struct soap *soap, double a, double &result)
{
   if (a > = 0)
   {
      result = sqrt(a);
      return SOAP_OK;
   }
   else
      return soap_receiver_fault(soap, "Square root of negative number", "I can only take the square root of a non-negative number");
}
// As always, a namespace mapping table is needed:
struct Namespace namespaces[] =
{   // {"ns-prefix", "ns-name"}
   {"SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/"},
   {"SOAP-ENC", "http://schemas.xmlsoap.org/soap/encoding/"},
   {"xsi", "http://www.w3.org/2001/XMLSchema-instance"},
   {"xsd", "http://www.w3.org/2001/XMLSchema"},
   {"ns", "urn:simple-calc"}, // bind "ns" namespace prefix
   {NULL, NULL}
};

Note that the service operations have an extra input parameter which is a pointer to the gSOAP runtime context. The implementation of the service operations MUST return a SOAP error code. The code SOAP_OK denotes success, while SOAP_FAULT denotes an exception with details that can be defined by the user. The exception description can be assigned to the soap->fault->faultstring string and details can be assigned to the soap->fault->detail string. This is SOAP 1.1 specific. SOAP 1.2 requires the soap->fault->SOAP_ENV__Reason and the soap->fault->SOAP_ENV__Detail strings to be assigned. Better is to use the soap_receiver_fault function that allocates a fault struct and sets the SOAP Fault string and details regardless of the SOAP 1.1 or SOAP 1.2 version used. The soap_receiver_fault function returns SOAP_FAULT, i.e. an application-specific fault. The fault exception will be passed on to the client of this service.
This service application can be readily installed as a CGI application. The service description would be:

Endpoint URL: the URL of the CGI application
SOAP action: "" (2 quotes)
Remote method namespace: urn:simple-calc
Remote method name: add
   Input parameters: a of type xsd:double and b of type xsd:double
   Output parameter: result of type xsd:double
Remote method name: sub
   Input parameters: a of type xsd:double and b of type xsd:double
   Output parameter: result of type xsd:double
Remote method name: sqrt
   Input parameter: a of type xsd:double
   Output parameter: result of type xsd:double or a SOAP Fault

The soapcpp2 compile generates a WSDL file for this service, see Section 7.2.9.
Unless the CGI application inspects and checks the environment variable SOAPAction which contains the SOAP action request by a client, the SOAP action is ignored by the CGI application. SOAP actions are specific to the SOAP protocol and provide a means for routing requests and for security reasons (e.g. firewall software can inspect SOAP action headers to grant or deny the SOAP request. Note that this requires the SOAP service to check the SOAP action header as well to match it with the service operation.)
The header file input to the gSOAP soapcpp2 compiler does not need to be modified to generate client stubs for accessing this service. Client applications can be developed by using the same header file as for which the service application was developed. For example, the soap_call_ns__add stub routine is available from the soapClient.cpp file after invoking the gSOAP soapcpp2 compiler on the calc.h header file. As a result, client and service applications can be developed without the need to know the details of the SOAP encoding used.

7.2.2  MSVC++ Builds

  • Win32 builds need winsock2 (MS Visual C++ "ws2_32.lib") To do this in Visual C++ 6.0, go to "Project", "settings", select the "Link" tab (the project file needs to be selected in the file view) and add "ws2_32.lib" to the "Object/library modules" entry.
  • Use files with extension .cpp only (don't mix .c with .cpp).
  • Turn pre-compiled headers off.
  • When creating a new project, you can specify a custom build step to automatically invoke the gSOAP soapcpp2 compiler on a gSOAP header file. In this way you can incrementally build a new service by adding new operations and data types to the header file. To specify a custom build step, select the "Project" menu item "Settings" and select the header file in the File view pane. Select the "Custom Build" tab and enter 'soapcpp2.exe "$(inputPath)"' in the "Command" pane. Enter 'soapStub.h soapH.h soapC.cpp soapClient.cpp soapServer.cpp'. Don't forget to add the soapXYZProxy.h soapXYZObject.h files that are generated for C++ class proxies and server objects named XYZ. Click "OK". Run soapcpp2 once to generate these files (you can simply do this by selecting your header file and select "Compile"). Add the files to your project. Each time you make a change to the header file, the project sources are updated automatically.
  • You may want to use the WinInet interface available in the mod_gsoap directory of the gSOAP package to simplify Internet access and deal with encryption, proxies, and authentication. API instructions are included in the source.
  • For the PocketPC, run the wsdl2h WSDL parser with option -s to prevent the generation of STL code. In addition, time_t serialization is not supported, which means that you should add the following line to typemap.dat indicating a mapping of xsd__dateTime to char*: xsd__dateTime = - char* - char*.

7.2.3  How to Create a Stand-Alone Server

The deployment of a Web service as a CGI application is an easy means to provide your service on the Internet. However, the performance of CGI is not great. Also, gSOAP services can be run as stand-alone services on any port by utilizing the built-in HTTP and TCP/IP stacks. However, the preferred mechanism to deploy a service is through an Apache module or IIS module. These servers and modules are designed for server load balancing and access control.
To create a stand-alone service, only the main routine of the service needs to be modified as follows. Instead of just calling the soap_serve routine, the main routine is changed into:

int main()
{
   struct soap soap;
   int m, s; // master and slave sockets
   soap_init(&soap);
   m = soap_bind(&soap, "machine.genivia.com", 18083, 100);
   if (m < 0)
      soap_print_fault(&soap, stderr);
   else
   {
      fprintf(stderr, "Socket connection successful: master socket = %d\n", m);
      for (int i = 1; ; i++)
      {
         s = soap_accept(&soap);
         if (s < 0)
         {
            soap_print_fault(&soap, stderr);
            break;
         }
         fprintf(stderr, "%d: accepted connection from IP=%d.%d.%d.%d socket=%d", i,
            (soap.ip >> 24)&0xFF, (soap.ip >> 16)&0xFF, (soap.ip >> 8)&0xFF, soap.ip&0xFF, s);
         if (soap_serve(&soap) != SOAP_OK) // process RPC request
            soap_print_fault(&soap, stderr); // print error
         fprintf(stderr, "request served\n");
         soap_destroy(&soap); // clean up class instances
         soap_end(&soap); // clean up everything and close socket
      }
   }
   soap_done(&soap); // close master socket and detach context
}

The soap_serve dispatcher handles one request or multiple requests when HTTP keep-alive is enabled (with the SOAP_IO_KEEPALIVE flag see Section 19.11).
The gSOAP functions that are frequently used for server-side coding are:

Function Description
soap_new() Allocates and Initializes gSOAP context
soap_init(struct soap *soap) Initializes a stack-allocated gSOAP context (required once)
soap_bind(struct soap *soap, char *host, int port, int backlog) Returns master socket (backlog = max. queue size for requests). When host==NULL: host is the machine on which the service runs
soap_accept(struct soap *soap) Returns slave socket
soap_end(struct soap *soap) Clean up deserialized data (except class instances) and temporary data
soap_free_temp(struct soap *soap) Clean up temporary data only
soap_destroy(struct soap *soap) Clean up deserialized class instances (note: this function will be renamed with option -n
soap_done(struct soap *soap) Reset and detach context: close master/slave sockets and remove callbacks
soap_free(struct soap *soap) Detach and deallocate context (soap_new())

The host name in soap_bind may be NULL to indicate that the current host should be used.
The soap.accept_timeout attribute of the gSOAP runtime context specifies the timeout value for a non-blocking soap_accept(&soap) call. See Section 19.19 for more details on timeout management.
See Section 9.13 for more details on memory management.
A client application connects to this stand-alone service with the endpoint machine.genivia.com:18083. A client may use the http:// prefix. When absent, no HTTP header is sent and no HTTP-based information will be communicated to the service.

7.2.4  How to Create a Multi-Threaded Stand-Alone Service

Stand-alone multi-threading a Web Service is essential when the response times for handling requests by the service are (potentially) long or when keep-alive is enabled, see Section 19.11. In case of long response times, the latencies introduced by the unrelated requests may become prohibitive for a successful deployment of a stand-alone service. When HTTP keep-alive is enabled, a client may not close the socket on time, thereby preventing other clients from connecting.
However, the preferred mechanism to deploy a service is through an Apache module or IIS module. These servers and modules are designed for server load balancing and access control.
The following example illustrates the use of threads to improve the quality of service by handling new requests in separate threads:

#include "soapH.h"
#include < pthread.h >
#define BACKLOG (100) // Max. request backlog
int main(int argc, char **argv)
{
   struct soap soap;
   soap_init(&soap);
   if (argc < 2) // no args: assume this is a CGI application
   {
      soap_serve(&soap); // serve request, one thread, CGI style
      soap_destroy(&soap); // dealloc C++ data
      soap_end(&soap); // dealloc data and clean up
   }
   else 
   {
      soap.send_timeout = 60; // 60 seconds
      soap.recv_timeout = 60; // 60 seconds
      soap.accept_timeout = 3600; // server stops after 1 hour of inactivity
      soap.max_keep_alive = 100; // max keep-alive sequence
      void *process_request(void*);
      struct soap *tsoap;
      pthread_t tid;
      int port = atoi(argv[1]); // first command-line arg is port
      SOAP_SOCKET m, s;
      m = soap_bind(&soap, NULL, port, BACKLOG);
      if (!soap_valid_socket(m))
         exit(1);
      fprintf(stderr, "Socket connection successful %d\n", m);
      for (;;)
      {
         s = soap_accept(&soap);
         if (!soap_valid_socket(s))
         {
            if (soap.errnum)
            {
               soap_print_fault(&soap, stderr);
               exit(1);
            }
            fprintf(stderr, "server timed out\n");
            break;
         }
         fprintf(stderr, "Thread %d accepts socket %d connection from IP %d.%d.%d.%d\n", i, s, (soap.ip >> 24)&0xFF, (soap.ip >> 16)&0xFF, (soap.ip >> 8)&0xFF, soap.ip&0xFF);
         tsoap = soap_copy(&soap); // make a safe copy
         if (!tsoap)
            break;
         pthread_create(&tid, NULL, (void*(*)(void*))process_request, (void*)tsoap);
      }
   }
   soap_done(&soap); // detach soap struct
   return 0;
}
void *process_request(void *soap)
{
   pthread_detach(pthread_self());
   soap_serve((struct soap*)soap);
   soap_destroy((struct soap*)soap); // dealloc C++ data
   soap_end((struct soap*)soap); // dealloc data and clean up
   soap_done((struct soap*)soap); // detach soap struct
   free(soap);
   return NULL;
}

Note: the code does not wait for threads to join the main thread upon program termination.
The soap_serve dispatcher handles one request or multiple requests when HTTP keep-alive is set with SOAP_IO_KEEPALIVE. The soap.max_keep_alive value can be set to the maximum keep-alive calls allowed, which is important to avoid a client from holding a thread indefinitely. The send and receive timeouts are set to avoid (intentionally) slow clients from holding a socket connection too long. The accept timeout is used to let the server terminate automatically after a period of inactivity.
The following example uses a pool of servers to limit the machine's resource utilization:

#include "soapH.h"
#include < pthread.h >
#define BACKLOG (100) // Max. request backlog
#define MAX_THR (10) // Max. threads to serve requests
int main(int argc, char **argv)
{
   struct soap soap;
   soap_init(&soap);
   if (argc < 2) // no args: assume this is a CGI application
   {
      soap_serve(&soap); // serve request, one thread, CGI style
      soap_destroy(&soap); // dealloc C++ data
      soap_end(&soap); // dealloc data and clean up
   }
   else 
   {
      struct soap *soap_thr[MAX_THR]; // each thread needs a runtime context
      pthread_t tid[MAX_THR];
      int port = atoi(argv[1]); // first command-line arg is port
      SOAP_SOCKET m, s;
      int i;
      m = soap_bind(&soap, NULL, port, BACKLOG);
      if (!soap_valid_socket(m))
         exit(1);
      fprintf(stderr, "Socket connection successful %d\n", m);
      for (i = 0; i < MAX_THR; i++)
         soap_thr[i] = NULL;
      for (;;)
      {
         for (i = 0; i < MAX_THR; i++)
         {
            s = soap_accept(&soap);
            if (!soap_valid_socket(s))
            {
               if (soap.errnum)
               {
                  soap_print_fault(&soap, stderr);
                  continue; // retry
               }
               else
               {
                  fprintf(stderr, "Server timed out\n");
                  break;
               }
            }
            fprintf(stderr, "Thread %d accepts socket %d connection from IP %d.%d.%d.%d\n", i, s, (soap.ip >> 24)&0xFF, (soap.ip >> 16)&0xFF, (soap.ip >> 8)&0xFF, soap.ip&0xFF);
            if (!soap_thr[i]) // first time around
            {
               soap_thr[i] = soap_copy(&soap);
               if (!soap_thr[i])
               exit(1); // could not allocate
            }
            else// recycle soap context
            {
               pthread_join(tid[i], NULL);
               fprintf(stderr, "Thread %d completed\n", i);
               soap_destroy(soap_thr[i]); // deallocate C++ data of old thread
               soap_end(soap_thr[i]); // deallocate data of old thread
            }
            soap_thr[i]->socket = s; // new socket fd
            pthread_create(&tid[i], NULL, (void*(*)(void*))soap_serve, (void*)soap_thr[i]);
         }
      }
      for (i = 0; i < MAX_THR; i++)
         if (soap_thr[i])
         {
            soap_done(soap_thr[i]); // detach context
            free(soap_thr[i]); // free up
         }
   }
   return 0;
}

The following functions can be used to setup a gSOAP runtime context (struct soap):

Function Description
soap_init(struct soap *soap) Initializes a runtime context (required only once)
struct soap *soap_new() Allocates, initializes, and returns a pointer to a runtime context
struct soap *soap_copy(struct soap *soap) Allocates a new runtime context and copies a context (deep copy, i.e. the new context does not share any data with the other context)
the argument context such that the new context does not share data with the argument context
soap_done(struct soap *soap) Reset, close communications, and remove callbacks

A new context is initiated for each thread to guarantee exclusive access to runtime contexts.
For clean termination of the server, the master socket can be closed and callbacks removed with soap_done(struct soap *soap).
The advantage of the code shown above is that the machine cannot be overloaded with requests, since the number of active services is limited. However, threads are still started and terminated. This overhead can be eliminated using a queue of requests (open sockets) as is shown in the code below.


#include "soapH.h"
#include < pthread.h >
#define BACKLOG (100) // Max. request backlog
#define MAX_THR (10) // Size of thread pool
#define MAX_QUEUE (1000) // Max. size of request queue
SOAP_SOCKET queue[MAX_QUEUE]; // The global request queue of sockets
int head = 0, tail = 0; // Queue head and tail
void *process_queue(void*);
int enqueue(SOAP_SOCKET);
SOAP_SOCKET dequeue();
pthread_mutex_t queue_cs;
pthread_cond_t queue_cv;
int main(int argc, char **argv)
{
   struct soap soap;
   soap_init(&soap);
   if (argc < 2) // no args: assume this is a CGI application
   {
      soap_serve(&soap); // serve request, one thread, CGI style
      soap_destroy(&soap); // dealloc C++ data
      soap_end(&soap); // dealloc data and clean up
   }
   else
   {
      struct soap *soap_thr[MAX_THR]; // each thread needs a runtime context
      pthread_t tid[MAX_THR];
      int port = atoi(argv[1]); // first command-line arg is port
      SOAP_SOCKET m, s;
      int i;
      m = soap_bind(&soap, NULL, port, BACKLOG);
      if (!soap_valid_socket(m))
         exit(1);
      fprintf(stderr, "Socket connection successful %d\n", m);
      pthread_mutex_init(&queue_cs, NULL);
      pthread_cond_init(&queue_cv, NULL);
      for (i = 0; i < MAX_THR; i++)
      {
         soap_thr[i] = soap_copy(&soap);
         fprintf(stderr, "Starting thread %d\n", i);
         pthread_create(&tid[i], NULL, (void*(*)(void*))process_queue, (void*)soap_thr[i]);
      }
      for (;;)
      {
         s = soap_accept(&soap);
         if (!soap_valid_socket(s))
         {
            if (soap.errnum)
            {
               soap_print_fault(&soap, stderr);
               continue; // retry
            }
            else
            {
               fprintf(stderr, "Server timed out\n");
               break;
            }
         }
         fprintf(stderr, "Thread %d accepts socket %d connection from IP %d.%d.%d.%d\n", i, s, (soap.ip >> 24)&0xFF, (soap.ip >> 16)&0xFF, (soap.ip >> 8)&0xFF, soap.ip&0xFF);
         while (enqueue(s) == SOAP_EOM)
            sleep(1);
      }
      for (i = 0; i < MAX_THR; i++)
      {
         while (enqueue(SOAP_INVALID_SOCKET) == SOAP_EOM)
            sleep(1);
      }
      for (i = 0; i < MAX_THR; i++)
      {
         fprintf(stderr, "Waiting for thread %d to terminate... ", i);
         pthread_join(tid[i], NULL);
         fprintf(stderr, "terminated\n");
         soap_done(soap_thr[i]);
         free(soap_thr[i]);
      }
      pthread_mutex_destroy(&queue_cs);
      pthread_cond_destroy(&queue_cv);
   }
   soap_done(&soap);
   return 0;
}
void *process_queue(void *soap)
{
   struct soap *tsoap = (struct soap*)soap;
   for (;;)
   {
      tsoap->socket = dequeue();
      if (!soap_valid_socket(tsoap->socket))
         break;
      soap_serve(tsoap);
      soap_destroy(tsoap);
      soap_end(tsoap);
      fprintf(stderr, "served\n");
   }
   return NULL;
}
int enqueue(SOAP_SOCKET sock)
{
   int status = SOAP_OK;
   int next;
   pthread_mutex_lock(&queue_cs);
   next = tail + 1;
   if (next >= MAX_QUEUE)
      next = 0;
   if (next == head)
      status = SOAP_EOM;
   else
   {
      queue[tail] = sock;
      tail = next;
      pthread_cond_signal(&queue_cv);
   }
   pthread_mutex_unlock(&queue_cs);
   return status;
}
SOAP_SOCKET dequeue()
{
   SOAP_SOCKET sock;
   pthread_mutex_lock(&queue_cs);
   while (head == tail)
      pthread_cond_wait(&queue_cv, &queue_cs);
   sock = queue[head++];
   if (head >= MAX_QUEUE)
      head = 0;
   pthread_mutex_unlock(&queue_cs);
   return sock;
}

Note: the plugin/threads.h and plugin/threads.c code can be used for a portable implementation. Instead of POSIX calls, use MUTEX_LOCK, MUTEX_UNLOCK, and COND_WAIT. These are wrappers for Win API calls or POSIX calls.

7.2.5  How to Pass Application Data to Service Methods

The void *soap.user field can be used to pass application data to service methods. This field should be set before the soap_serve() call. The service method can access this field to use the application-dependent data. The following example shows how a non-static database handle is initialized and passed to the service methods:


{ ...
   struct soap soap;
   database_handle_type database_handle;
   soap_init(&soap);    soap.user = (void*)database_handle;
   ...
   soap_serve(&soap); // call the service operation dispatcher to handle request
   ...
}
int ns__myMethod(struct soap *soap, ...)
{ ...
   fetch((database_handle_type*)soap->user);
// get data    ...
   return SOAP_OK;
}

Another way to pass application data around in a more organized way is accomplished with plugins, see Section 19.38.

7.2.6  Web Service Implementation Aspects

The same client header file specification issues apply to the specification and implementation of a SOAP Web service. Refer to
  • 7.1.2 for namespace considerations.
  • 7.1.5 for an explanation on how to change the encoding of the primitive types.
  • 7.1.7 for a discussion on how the response element format can be controlled.
  • 7.1.9 for details on how to pass multiple output parameters from a service operation.
  • 7.1.11 for passing complex data types as output parameters.
  • 7.1.13 for anonymizing the input and output parameter names.

7.2.7  How to Generate C++ Server Object Classes

Server object classes for C++ server applications are automatically generated by the gSOAP soapcpp2 compiler.
There are two modes for generating classes. Use soapcpp2 option -i (or -j) to generate improved class definitions where the class' member functions are the service methods.
The older examples (without the use of soapcpp2 option -i and -j) use a C-like approach with globally defined service methods, which is illustated here with a calculator example:


// Content of file "calc.h":
//gsoap ns service name: Calculator
//gsoap ns service protocol: SOAP
//gsoap ns service style: rpc
//gsoap ns service encoding: encoded
//gsoap ns service location: http://www.cs.fsu.edu/~engelen/calc.cgi
//gsoap ns schema namespace: urn:calc
//gsoap ns service method-action: add ""
int ns__add(double a, double b, double &result);
int ns__sub(double a, double b, double &result);
int ns__mul(double a, double b, double &result);
int ns__div(double a, double b, double &result);

The first three directives provide the service name which is used to name the service class, the service location (endpoint), and the schema. The fourth directive defines the optional SOAPAction for the method, which is a string associated with SOAP 1.1 operations. Compilation of this header file with soapcpp2 -i creates a new file soapCalculatorObject.h with the following contents:

#include "soapH.h"
class CalculatorObject : public soap
{ public:
   Calculator() { ... };
   ~Calculator() { ... };
   int serve() { return soap_serve(this); };
};

This generated server object class can be included into a server application together with the generated namespace table as shown in this example:

#include "soapCalculatorObject.h" // get server object
#include "Calculator.nsmap" // get namespace bindings
int main()
{
   CalculatorObject c;
   return c.serve(); // calls soap_serve to serve as CGI application (using stdin/out)
}
// C-style global functions implement server operations (soapcpp2 w/o option -i)
int ns__add(struct soap *soap, double a, double b, double &result)
{
   result = a + b;
   return SOAP_OK;
}
... sub(), mul(), and div() implementations ...

You can use soapcpp2 option -n together with -p to create a local namespace table to avoid link conflict when you need to combine multiple tables and/or multiple servers, see also Sections 9.1 and 19.36, and you can use a C++ code namespace to create a namespace qualified server object class, see Section 19.35.
The example above serves requests over stdin/out. Use the bind and accept calls to create a stand-alone server to service inbound requests over sockets, see also 7.2.3.
A better alternative is to use the soapcpp2 option -i. The C++ proxy and server objects are derived from the soap context struct, which simplifies the proxy invocation and service operation implementations.
Compilation of the above header file with the gSOAP compiler soapcpp2 option -i creates new files soapCalculatorService.h and soapCalculatorService.cpp (rather than the C-style soapServer.cpp).
This generated server object class can be included into a server application together with the generated namespace table as shown in this example:

#include "soapCalculatorService.h" // get server object
#include "Calculator.nsmap" // get namespace bindings
int main()
{
   soapCalculatorService c;
   return c.serve(); // calls soap_serve to serve as CGI application (using stdin/out)
}
// The 'add' service method (soapcpp2 w/ option -i)
int soapCalculatorService::add(double a, double b, double &result)
{
   result = a + b;
   return SOAP_OK;
}
... sub(), mul(), and div() implementations ...

Note that the service operation does not need a prefix (ns__) and there is no soap context struct passed to the service operation since the service object itself is the context (it is derived from the soap struct).

7.2.8  How to Chain C++ Server Classes to Accept Messages on the Same Port

When combining multiple services into one application, you can run wsdl2h on multiple WSDLs to generate the single all-inclusive service definitions header file. This header file is then processed with soapcpp2, for example to generate server class objects with option -i and -q to separate the service codes with C++ namespaces, see Section 19.35.
This works well, but the problem is that we end up with multiple classes, each for a collection of service operations the class is supposed to implement. But what if we need to provide one endpoint port for all services and operations? In this case invoking the server object's serve method is not sufficient, since only one service can accept requests while we want multiple services to listen to the same port.
The approach is to chain the service dispatchers, as shown below:

Abc::soapABCService abc; // generated with soapcpp2 -i -S -qAbc
Uvw::soapUVWService uvw; // generated with soapcpp2 -i -S -qUvw
Xyz::soapXYZService xyz; // generated with soapcpp2 -i -S -qXyz
...
abc.bind(NULL, 8080, 100);
...
abc.accept();
// when using SSL: ssl_accept(&abc);
...
if(soap_begin_serve(&abc)) // available in 2.8.2 and later
   abc.soap_stream_fault(std::cerr);
elseif (abc.dispatch() == SOAP_NO_METHOD)
{
   soap_copy_stream(&uvw, &abc);
   if (uvw.dispatch() == SOAP_NO_METHOD)
   {
      soap_copy_stream(&xyz, &uvw);
      if (xyz.dispatch())
      {
         soap_send_fault(&xyz); // send fault to client
         xyz.soap_stream_fault(std::cerr);
      }
      soap_free_stream(&xyz); // free the copy
      xyz.destroy();
   }
   else
   {
      soap_send_fault(&uvw); // send fault to client
      uvw.soap_stream_fault(std::cerr);
   }
   soap_free_stream(&uvw); // free the copy
   uvw.destroy();
}
else
   abc.soap_stream_fault(std::cerr);
abc.destroy();
...

The dispatch method parses the SOAP/XML request and invokes the service operations, unless there is no matching operation and SOAP_NO_METHOD is returned. The soap_copy_stream ensures that the service object uses the currently open socket. The copied streams are freed with soap_free_stream. Do not enable keep-alive support, as the socket may stay open indefinitely afterwards as a consequence. Also, the dispatch method does not send a fault to the client, which has to be explicitly done with the soap_send_fault operation when an error occurs.
In this way, multiple services can be chained to accept messages on the same port. This approach also works with SSL for HTTPS services.
However, this approach is not recommended for certain plugins, because plugins must be registered with all service objects and some plugins require state information to be used across the service objects, which will add significantly to the complexity.
When plugin complications arise, it is best to have all services share the same context. This means that soapcpp2 option -j should be used instead of option -i. Each service class has a pointer member to a soap struct context. This member pointer should point to the same soap context.
With option -j and -q the code to chain the services is as follows, based on a single struct soap engine context:

struct soap *soap = soap_new();
Abc::soapABCService abc(soap); // generated with soapcpp2 -j -S -qAbc
Uvw::soapUVWService uvw(soap); // generated with soapcpp2 -j -S -qUvw
Xyz::soapXYZService xyz(soap); // generated with soapcpp2 -j -S -qXyz

soap_bind(soap, NULL, 8080, 100);
soap_accept(soap);
if (soap_begin_serve(soap))
   ... error
else if (abc.dispatch() == SOAP_NO_METHOD)
{
   if (uvw.dispatch() == SOAP_NO_METHOD)
   {
      if (xyz.dispatch() == SOAP_NO_METHOD)
         ... error
   }
}
soap_destroy(soap);
soap_end(soap);
soap_free(soap); // only safe when abc, uvw, xyz are also deleted

7.2.9  How to Generate WSDL Service Descriptions

The gSOAP stub and skeleton compiler soapcpp2 generates WSDL (Web Service Description Language) service descriptions and XML Schema files when processing a header file. The tool produces one WSDL file for a set of service operations, which must be provided. The names of the function prototypes of the service operations must use the same namespace prefix and the namespace prefix is used to name the WSDL file. If multiple namespace prefixes are used to define service operations, multiple WSDL files will be created and each file describes the set of service operations belonging to a namespace prefix.
In addition to the generation of the ns.wsdl file, a file with a namespace mapping table is generated by the gSOAP compiler. An example mapping table is shown below:

struct Namespace namespaces[] =
{
   {"SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/"},
   {"SOAP-ENC", "http://schemas.xmlsoap.org/soap/encoding/"},
   {"xsi", "http://www.w3.org/2001/XMLSchema-instance", \"http://www.w3.org/*/XMLSchema-instance"},
   {"xsd", "http://www.w3.org/2001/XMLSchema", \"http://www.w3.org/*/XMLSchema"},
   {"ns", "http://tempuri.org"},
   {NULL, NULL}
};

This file can be incorporated in the client/service application, see Section 10.4 for details on namespace mapping tables.
To deploy a Web service, copy the compiled CGI service application to the designated CGI directory of your Web server. Make sure the proper file permissions are set (chmod 755 calc.cgi for Unix/Linux). You can then publish the WSDL file on the Web by placing it in the appropriate Web server directory.
The gSOAP soapcpp2 compiler also generates XML Schema files for all C/C++ complex types (e.g. structs and classes) when declared with a namespace prefix. These files are named ns.xsd, where ns is the namespace prefix used in the declaration of the complex type. The XML Schema files do not have to be published as the WSDL file already contains the appropriate XML Schema definitions.
To customize the WSDL output, it is essential to use //gsoap directives to declare the service name, the endpoint port, and namespace:

//gsoap ns service name: example
//gsoap ns servire port: http://www.mydomain.com/example
//gsoap ns service namespace: urn:example

These are minimal settings. More details and settings for the service operations should be declared as well. See Section 19.2 for more details.

7.2.10  Example

For example, suppose the following methods are defined in the header file:

typedef double xsd__double;
int ns__add(xsd__double a, xsd__double b, xsd__double &result);
int ns__sub(xsd__double a, xsd__double b, xsd__double &result);
int ns__sqrt(xsd__double a, xsd__double &result);

Then, one WSDL file will be created with the file name ns.wsdl that describes all three service operations:

<?xml version="1.0" encoding="UTF-8"?>
<definitions name="Service"
   xmlns="http://schemas.xmlsoap.org/wsdl/"
   targetNamespace="http://location/Service.wsdl"
   xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
   xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
   xmlns:SOAP="http://schemas.xmlsoap.org/wsdl/soap/"
   xmlns:WSDL="http://schemas.xmlsoap.org/wsdl/"
   xmlns:xsd="http://www.w3.org/2000/10/XMLSchema"
   xmlns:tns="http://location/Service.wsdl"
   xmlns:ns="http://tempuri.org">
<types>
   <schema
      xmlns="http://www.w3.org/2000/10/XMLSchema"
      targetNamespace="http://tempuri.org"
      xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
      xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
      <complexType name="addResponse">
         <all>
            <element name="result" type="double" minOccurs="0" maxOccurs="1"/>
         </all>
         <anyAttribute namespace="##other"/>
      </complexType>
      <complexType name="subResponse">
         <all>
            <element name="result" type="double" minOccurs="0" maxOccurs="1"/>
         </all>
         <anyAttribute namespace="##other"/>
      </complexType>
      <complexType name="sqrtResponse">
         <all>
            <element name="result" type="double" minOccurs="0" maxOccurs="1"/>
         </all>
         <anyAttribute namespace="##other"/>
      </complexType>
   </schema>
</types>
<message name="addRequest">
   <part name="a" type="xsd:double"/>
   <part name="b" type="xsd:double"/>
</message>
<message name="addResponse">
   <part name="result" type="xsd:double"/>
</message>
<message name="subRequest">
   <part name="a" type="xsd:double"/>
   <part name="b" type="xsd:double"/>
</message>
<message name="subResponse">
   <part name="result" type="xsd:double"/>
</message>
<message name="sqrtRequest">
   <part name="a" type="xsd:double"/>
</message>
<message name="sqrtResponse">
   <part name="result" type="xsd:double"/>
</message>
<portType name="ServicePortType">
   <operation name="add">
      <input message="tns:addRequest"/>
      <output message="tns:addResponse"/>
   </operation>
   <operation name="sub">
      <input message="tns:subRequest"/>
      <output message="tns:subResponse"/>
   </operation>
   <operation name="sqrt">
      <input message="tns:sqrtRequest"/>
      <output message="tns:sqrtResponse"/>
   </operation>
</portType>
<binding name="ServiceBinding" type="tns:ServicePortType">
   <SOAP:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
   <operation name="add">
      <SOAP:operation soapAction="http://tempuri.org#add"/>
      <input>
         <SOAP:body use="encoded" namespace="http://tempuri.org"
            encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
      </input>
      <output>
         <SOAP:body use="encoded" namespace="http://tempuri.org"
            encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
      </output>
   </operation>
   <operation name="sub">
      <SOAP:operation soapAction="http://tempuri.org#sub"/>
      <input>
         <SOAP:body use="encoded" namespace="http://tempuri.org"
            encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
      </input>
      <output>
         <SOAP:body use="encoded" namespace="http://tempuri.org"
            encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
      </output>
   </operation>
   <operation name="sqrt">
      <SOAP:operation soapAction="http://tempuri.org#sqrt"/>
      <input>
         <SOAP:body use="encoded" namespace="http://tempuri.org"
            encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
      </input>
      <output>
         <SOAP:body use="encoded" namespace="http://tempuri.org"
            encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
      </output>
   </operation>
</binding>
<service name="Service">
   <port name="ServicePort" binding="tns:ServiceBinding">
      <SOAP:address location="http://location/Service.cgi"/>
   </port>
</service>
</definitions>

The above uses all default settings for the service name, port, and namespace which should be set in the header file with //gsoap directives (Section 19.2).

7.2.11  How to Use Client Functionalities Within a Service

A gSOAP service implemented with CGI may make direct client calls to other services from within its service operations, without setting up a new context. A stand-alone service application must setup a new soap struct context, e.g. using soap_copy and delete it after the call.
The server-side client call is best illustrated with an example. The following example is a more sophisticated example that combines the functionality of two Web services into one new SOAP Web service. The service provides a currency-converted stock quote. To serve a request, the service in turn requests the stock quote and the currency-exchange rate from two XMethods services (these services are no longer available by XMethods, but are used here as an example).
In addition to being a client of two XMethods services, this service application can also be used as a client of itself to test the implementation. As a client invoked from the command-line, it will return a currency-converted stock quote by connecting to a copy of itself installed as a CGI application on the Web to retrieve the quote after which it will print the quote on the terminal.
The header file input to the gSOAP soapcpp2 compiler is given below. The example is for illustrative purposes only (the XMethods services are not operational):

// Contents of file "quotex.h":
int ns1__getQuote(char *symbol, float &result); // XMethods delayed stock quote service service operation
int ns2__getRate(char *country1, char *country2, float &result); // XMethods currency-exchange service service operation
int ns3__getQuote(char *symbol, char *country, float &result); // the new currency-converted stock quote service

The quotex.cpp client/service application source is:

// Contents of file "quotex.cpp":
#include "soapH.h" // include generated proxy and SOAP support
int main(int argc, char **argv)
{
   struct soap soap;
   float q;
   soap_init(&soap);
   if (argc < = 2)
      soap_serve(&soap);
   else if (soap_call_ns3__getQuote(&soap, "http://www.cs.fsu.edu/\symbol{126}engelen/quotex.cgi", "", argv[1], argv[2], q))
      soap_print_fault(&soap, stderr);
   else 
      printf("\nCompany %s: %f (%s)\n", argv[1], q, argv[2]);
   return 0;
}
int ns3__getQuote(struct soap *soap, char *symbol, char *country, float &result)
{
   float q, r;
   int socket = soap->socket; // save socket (stand-alone service only, does not support keep-alive)
   if (soap_call_ns1__getQuote(soap, "http://services.xmethods.net/soap", "", symbol, &q) == 0 &&
      soap_call_ns2__getRate(soap, "http://services.xmethods.net/soap", NULL, "us", country, &r) == 0)
   {
      result = q*r;
      soap->socket = socket;
      return SOAP_OK;
   }
   soap->socket = socket;
   return SOAP_FAULT; // pass soap fault messages on to the client of this app
}
/* Since this app is a combined client-server, it is put together with
* one header file that describes all service operations. However, as a consequence we
* have to implement the methods that are not ours. Since these implementations are
* never called (this code is client-side), we can make them dummies as below.
*/
int ns1__getQuote(struct soap *soap, char *symbol, float &result)
{ return SOAP_NO_METHOD; } // dummy: will never be called
int ns2__getRate(struct soap *soap, char *country1, char *country2, float &result)
{ return SOAP_NO_METHOD; } // dummy: will never be called

struct Namespace namespaces[] =
{
   {"SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/"},
   {"SOAP-ENC", "http://schemas.xmlsoap.org/soap/encoding/"},
   {"xsi", "http://www.w3.org/2001/XMLSchema-instance", "http://www.w3.org/*/XMLSchema-instance"},
   {"xsd", "http://www.w3.org/2001/XMLSchema", "http://www.w3.org/*/XMLSchema"},
   {"ns1", "urn:xmethods-delayed-quotes"},
   {"ns2", "urn:xmethods-CurrencyExchange"},
   {"ns3", "urn:quotex"},
   {NULL, NULL}
};

To compile:

> soapcpp2 quotex.h
> c++ -o quotex.cgi quotex.cpp soapC.cpp soapClient.cpp soapServer.cpp stdsoap2.cpp -lsocket -lxnet -lnsl

Note: under Linux and Mac OS X you can often omit the -l libraries.
The quotex.cgi executable is installed as a CGI application on the Web by copying it in the designated directory specific to your Web server. After this, the executable can also serve to test the service. For example

> quotex.cgi IBM uk

returns the quote of IBM in uk pounds by communicating the request and response quote from the CGI application. See http://xmethods.com/detail.html?id=5 for details on the currency abbreviations.
When combining clients and service functionalities, it is required to use one header file input to the compiler. As a consequence, however, stubs and skeletons are available for all service operations, while the client part will only use the stubs and the service part will use the skeletons. Thus, dummy implementations of the unused service operations need to be given which are never called.
Three WSDL files are created by gSOAP: ns1.wsdl, ns2.wsdl, and ns3.wsdl. Only the ns3.wsdl file is required to be published as it contains the description of the combined service, while the others are generated as a side-effect (and in case you want to develop these separate services).

7.3  Asynchronous One-Way Message Passing

SOAP RPC client-server interaction is synchronous: the client blocks until the server responds to the request. gSOAP also supports asynchronous one-way message passing and the interoperable synchronous one-way message passing over HTTP. The two styles are similar, but only the latter is interoperable and is compliant to Basic Profile 1.0. The interoperable synchronous one-way message passing style over HTTP is discussed in Section 7.4 below.
SOAP messaging routines are declared as function prototypes, just like service operations for SOAP RPC. However, the output parameter is a void type to indicate the absence of a return value.
For example, the following header file specifies an event message for SOAP messaging:

int ns__event(int eventNo, void);

The gSOAP soapcpp2 tool generates the following functions in soapClient.cpp:

int soap_send_ns__event(struct soap *soap, const char URL, const char action, int event);
int soap_recv_ns__event(struct soap *soap, struct ns__event *dummy);

The soap_send_ns__event function transmits the message to the destination URL by opening a socket and sending the SOAP encoded message. The socket will remain open after the send and has to be closed with soap_closesock(). The open socket connection can also be used to obtain a service response, e.g. with a soap_recv function call.
The soap_recv_ns__event function waits for a SOAP message on the currently open socket (soap.socket) and fills the struct ns__event with the ns__event parameters (e.g. int eventNo). The struct ns__event is automatically created by gSOAP and is a mirror image of the ns__event parameters:

struct ns__event
{ int eventNo;
}

The gSOAP generated soapServer.cpp code includes a skeleton routine to accept the message. (The skeleton routine does not respond with a SOAP response message.)

int soap_serve_ns__event(struct soap *soap);

The skeleton routine calls the user-implemented ns__event(struct soap *soap, int eventNo) routine (note the absence of the void parameter!).
As usual, the skeleton will be automatically called by the service operation request dispatcher that handles both the service operation requests (RPCs) and messages:

int main()
{ soap_serve(soap_new());
}
int ns__event(struct soap *soap, int eventNo)
{
   ... // handle event
   return SOAP_OK;
}

7.4  Implementing Synchronous One-Way Message Passing over HTTP

One-way SOAP message passing over HTTP as defined by the SOAP specification and Basic Profile 1.0 is synchrounous, meaning that the server must respond with an HTTP OK header (or HTTP 202 Accepted) and an empty body. To implement synchrounous one-way messaging, the same setup for asynchrounous one-way messaing discussed in Section 7.3 is used, but with one simple addition at the client and server side for HTTP transfer.
At the server side, we have to return an empty HTTP OK response. Normally with one-way messaging the gSOAP engine closes the socket when the service operation is finished, which is not desirable for synchronous one-way message exchanges over HTTP: an HTTP response should be send. This is accomplished as follows. For each one-way operation implemented in C/C++, we replace the return SOAP_OK with:

int ns__event(struct soap *soap, int eventNo)
{
   ... // handle event
   return soap_send_empty_response(soap, SOAP_OK); // SOAP_OK: return HTTP 202 ACCEPTED
}

At the client side, the empty response header must be parsed as follows:

if (soap_send_ns__event(soap, eventNo) != SOAP_OK
   || soap_recv_empty_response(soap) != SOAP_OK)
   soap_print_fault(soap, stderr);
...

The synchronous (and asynchronous) one-way messaging supports HTTP keep-alive and chunking.
Note: soap_send_empty_response returns the error code SOAP_STOP to force the engine to stop producing a response message after the service operation completed, which allows soap_send_empty_response to be used with any service operation that should return HTTP 202.

7.5  How to Use the SOAP Serializers and Deserializers to Save and Load Application Data using XML Data Bindings

The gSOAP XML databindings for C and C++ allow a seamless integration of XML in C and C++ applications. Data can be serialized in XML and vice versa. WSDL and XML schema files can be converted to C or C++ definitions. C and C++ definitions can be translated to WSDL and schemas to support legacy ANSI C applications for example.
Learn more about XML data binding for C and C++ with gSOAP by visiting the Developer Center http://www.genivia.com/dev.html and the new and most up-to-date XML data binding documentation http://www.genivia.com/doc/databinding/html.

7.5.1  Mapping XML Schema to C/C++ with wsdl2h

Command:

> wsdl2h [options] XSD and WSDL files ...

The WSDL 1.1 and 2.0 standards are supported. If you have trouble with WSDL 2.0 please contact the author. The entire XML schema 1.1 standard is supported, except XPath expressions and assertions. This covers all of the following schema components with their optional [ attributes ] shown:

<xs:any [minOccurs, maxOccurs] >
<xs:anyAttribute>
<xs:all>
<xs:choice [minOccurs, maxOccurs] >
<xs:sequence [minOccurs, maxOccurs] >
<xs:group [name, ref] >
<xs:attributeGroup [name, ref] >
<xs:attribute [name, ref, type, use, default, fixed, form, wsdl:arrayType] >
<xs:element [name, ref, type, default, fixed, form, nillable, abstract,
substitutionGroup, minOccurs, maxOccurs] >
<xs:simpleType [name] >
<xs:complexType [name, abstract, mixed] >

The supported facets are:

<xs:enumeration>
<xs:simpleContent>
<xs:complexContent>
<xs:list>
<xs:extension>
<xs:restriction>
<xs:length>
<xs:minLength>
<xs:maxLength>
<xs:minInclusive>    validated only for integer types
<xs:maxInclusive>    validated only for integer types
<xs:minExclusive>    validated only for integer types
<xs:maxExclusive>    validated only for integer types
<xs:precision>    maps to float/double with C formatted output
<xs:scale>    maps to float/double with C formatted output
<xs:totalDigits>    maps to float/double with C formatted output
<xs:fractionDigits>    maps to float/double with C formatted output
<xs:pattern>    not automatically validated, see note below
<xs:union>    maps to string, content not validated

Other:

<xs:import>
<xs:include>
<xs:redefine>
<xs:override>
<xs:annotation>

All primitive XSD types are supported. A subset of the default type mappings is shown below. User-defined mappings can be added to typemap.dat to let wsdl2h (re)map XSD types to C/C++ types.

xsd:string    maps to string (char*,wchar_t*,std::string,std::wstring)
xsd:boolean    maps to bool (C++) or enum xsd__boolean (C)
xsd:float    maps to float
xsd:double    maps to double
xsd:decimal    maps to string, or use "#import "custom/decimal.h"
xsd:precisionDecimal    maps to string
xsd:duration    maps to string, or use "#import "custom/duration.h"
xsd:dateTime    maps to time_t, or use "#import "custom/struct_tm.h"
xsd:time    maps to string
xsd:date    maps to string
xsd:gYearMonth    maps to string
xsd:gYear    maps to string
xsd:gMonth    maps to string
xsd:hexBinary    maps to struct xsd__hexBinary
xsd:base64Bianry    maps to struct xsd__base64Binary
xsd:anyURI    maps to string
xsd:anyType    maps to an XML string or DOM with wsdl2h -d
xsd:anyAtomicType    maps to string
xsd:anySimpleType    maps to string
xsd:QName    maps to _QName (string normalization rules apply)
xsd:NOTATION    maps to string

Note: automatic validation of xs:pattern restricted content is possible with a hook to a regex pattern matching engine, see the fsvalidate and fwvalidate callbacks in Section 19.7.
Note: string targets are defined in the typemap.dat file used by wsdl2h to map XSD types. This allows the use of char*, wsha_t*, std::string, and std::wstring string types for all XSD types mapped to strings.
All non-primitive XSD types are supported (with the default mapping shown):

xsd:normalizedString    maps to string
xsd:token    maps to string
xsd:language    maps to string
xsd:IDREFS    maps to string
xsd:ENTITIES    maps to string
xsd:NMTOKEN    maps to string
xsd:NMTOKENS    maps to string
xsd:Name    maps to string
xsd:NCName    maps to string
xsd:ID    maps to string
xsd:IDREF    maps to string
xsd:ENTITY    maps to string
xsd:integer    maps to string
xsd:nonPositiveInteger    maps to string
xsd:negativeInteger    maps to string
xsd:long    maps to LONG64
xsd:int    maps to int
xsd:short    maps to short
xsd:byte    maps to byte
xsd:nonNegativeInteger    maps to string
xsd:unsignedLong    maps to ULONG64
xsd:unsignedInt    maps to unsigned int
xsd:unsignedShort    maps to unsigned short
xsd:unsignedByte    maps to unsigned byte
xsd:positiveInteger    maps to string
xsd:yearMonthDuration    maps to string
xsd:dayTimeDuration    maps to string
xsd:dateTimeStamp    maps to string

There are several initialization flags to control XML serialization at runtime:
  • XML validation is more stricly enforced with SOAP_XML_STRICT.
  • XML namespaces are supported, unless disabled with SOAP_XML_IGNORENS.
  • XML exclusive canonicalization is enabled with SOAP_XML_CANONICAL.
  • XML default xmlns="..." namespace bindings are enforced with SOAP_XML_DEFAULTNS.
  • XML is indented for enhanced readability with SOAP_XML_INDENT.
  • XML xsi:nil for NULL elements is serialized with SOAP_XML_NIL.
Strict validation catches all structural XML validation violations. For primitive type values, it depends on the C/C++ target type that XSD types are mapped to, to catch primitive value content pattern violations. Primitive value content validation is performed on non-string types such as numerical and time values. String values are not automatocally validated, unless a xs:pattern is given and the fsvalidate and fwvalidate callbacks are implemented by the user. Alternatively, deserialized string content can be checked at the application level.
To obtain C and/or C++ type definitions for XML schema components, run wsdl2h on the schemas to generate a header file. This header file defines the C/C++ type representations of the XML schema components. The header file is then processed by the soapcpp2 tool to generate the serializers for these types. See Section 1.4 for an overview to use wsdl2h and soapcpp2 to map schemas to C/C++ types to obtain XML data bindings.

7.5.2  Mapping C/C++ to XML Schema with soapcpp2

To generate serialization code, execute:

> soapcpp2 [options] header_file.h

The following C/C++ types are supported in the header file:

bool 
enum, enum* ('enum*' indicates serialized as a bitmask)
(unsigned) char, short, int, long, long long (also LONG64), size_t
float, double, longdouble(#import "custom/long_double.h")
std::string, std::wstring, char[], char*, wchar_t*
_XML (a char* type to hold literal XML string content)
_QName (a char* type with normalized QName content of the form prefix:name)
struct, class (with single inheritance)
std::vector, std::list, std::deque, std::set (#import "import/stl.h")
union (requires preceding discriminant member field)
typedef
time_t
template < > class(requires begin(), end(), size(), and insert() methods)
void* (requires a preceding __type field to indicate the object pointed to)
struct xsd__hexBinary (special pre-defined type to hold binary content)
struct xsd__base64Binary (special pre-defined type to hold binary content)
struct tm (#import "custom/struct_tm.h")
struct timeval (#import "custom/struct_timeval.h")
pointers to any of the above (any pointer-linked structures are serializable, including cyclic graphs)
fixed-size arrays of all of the above

Additional features and potential limitations:
  • A header file should not include any code statements, only data type declarations.
  • Nested classes and nested types are unnested.
  • Use #import "file.h" instead of #include to import other header files. The #include and #define directives are accepted, but deferred to the generated code.
  • C++ namespaces are supported (must cover entire header file content)
  • Optional DOM support can be used to store mixed content or literal XML content. Otherwise, mixed content may be lost. Use soapcpp2 option -d for DOM support. Learn more about the DOM API for C and C++ by visiting the Developer Center http://www.genivia.com/doc/dom/html.
  • Types are denoted transient using the 'extern' qualifier, which prevents serialization as desired:

    extern class name; // class 'name' is not serialized
    struct name { extern char *name; int num; }; // 'name' is not serialized

  • Only public members of a class can be serialized:

    class name { private: char *secret; }; // 'secret' is not serialized

  • Types declared "volatile" means that they are declared elsewhere in the project's code base and should not be redefined in the soapcpp2-generated code nor changed/augmented by the soapcpp2 tool:

    volatile class name { ... }; // defined here just to generate the serializers

  • Classes and structs declared "mutable" means that they can be augmented with additional members, rather than leading to a redefinition error:

    mutable class name { int n; }; // class has a member 'n' mutable class name { float x; }; // and also a member 'x'

    The SOAP_ENV__Header struct is mutable as well as the SOAP_ENV__Fault, SOAP_ENV__Detail, SOAP_ENV__Reason, and SOAP_ENV__Code structs.
  • struct/class members are serialized as attributes when qualified with '@':

    struct record { @char *name; int num; }; // attribute name, element num

  • Strings with 8-bit content can hold ASCII (default) or UTF8. The latter is possible by enabling the SOAP_C_UTFSTRING flag. When enabled, all std::string and char* strings MUST contain UTF8.
The soapcpp2 tool generates serializers and deserializers for all wsdl2h-generated or user-defined data structures that are specified in the header file input to the compiler. The serializers and deserializers can be found in the generated soapC.cpp file. These serializers and deserializers can be used separately by an application without the need to build a full client or service application. This is useful for applications that need to save or export their data in XML or need to import or load data stored in XML format.

7.5.3  Serializing C/C++ Data to XML

We assume that the wsdl2h tool was used to map XML schema types to C/C++ data types. The soapcpp2 tool then generates the (de)serializers for the C/C++ types. You can also use soapcpp2 directly on a header file that declares annotated C/C++ data types to serialize.
The following attributes can be set to control the destination and source for serialization and deserialization:

Variable Description
int soap.socket socket file descriptor for input and output (or set to SOAP_INVALID_SOCKET)
ostream *soap.os C++ only: output stream used for send operations
constchar**soap.os C only: points to a string pointer to be set with the managed string content
istream *soap.is C++ only: input stream used for receive operations
constchar*soap.is C only: string with input to parse (this pointer advances)
int soap.sendfd when soap.socket=SOAP_INVALID_SOCKET, this fd is used for send operations
int soap.recvfd when soap.socket=SOAP_INVALID_SOCKET, this fd is used for receive operations

The following initializing and finalizing functions can be used:

Function Description
void soap_begin_send(struct soap*) start a send/write phase
int soap_end_send(struct soap*) flush the buffer
int soap_begin_recv(struct soap*) start a rec/read phase (if an HTTP header is present, parse it first)
int soap_end_recv(struct soap*) perform a id/href consistency check on deserialized data

These operations do not open or close the connections. The application should open and close connections or files and set the soap.socket, soap.os or soap.sendfd, soap.is or soap.recvfd streams or descriptors. When soap.socket < 0 and none of the streams and descriptors are set, then the standard input and output will be used.
The following options are available to control serialization:

soap->encodingStyle = NULL; // to remove SOAP 1.1/1.2 encodingStyle
soap_mode(soap, SOAP_XML_TREE); // XML without id-ref (no cycles!)
soap_mode(soap, SOAP_XML_GRAPH); // XML with id-ref (including cycles)
soap_set_namespaces(soap, struct Namespace *nsmap); //to set xmlns bindings

See also Section 9.12 to control the I/O buffering and content encoding such as compression and DIME encoding.
We assume that the wsdl2h tool was used to map XML schema types to C/C++ data types. The soapcpp2 tool then generates the (de)serializers for the C/C++ types.
To serialize data to an XML stream, two functions should be called to prepare for serialization of the data and to send the data, respectively. The first function, soap_serialize, analyzes pointers and determines if multi-references are required to encode the data and if cycles are present the object graph. The second function, soap_put, produces the XML output on a stream.
The soap_serialize and soap_put (and both combined by soap_write) functions are statically generated specific to a data type. For example, soap_serialize_float(&soap, &d) is called to serialize an float value and soap_put_float(&soap, &d, "number", NULL) is called to output the floating point value in SOAP tagged with the name <number>. The soap_write_float(&soap, &d) conveniently combines the initialization of output, writing the data, and finalizing the output.
To initialize data, the soap_default function of a data type can be used. For example, soap_default_float(&soap, &d) initializes the float to 0.0. The soap_default functions are useful to initialize complex data types such as arrays, structs, and class instances. Note that the soap_default functions do not need the gSOAP runtime context as a first parameter.
The following table lists the type naming conventions used by gSOAP:

Type Type Name
char* string
wchar_t* wstring
char byte
bool bool
double double
int int
float float
long long
LONG64 LONG64 (Win32)
long long LONG64 (Unix/Linux)
short short
time_t time
unsigned char unsignedByte
unsigned int unsignedInt
unsigned long unsignedLong
ULONG64 unsignedLONG64 (Win32)
unsigned long long unsignedLONG64 (Unix/Linux)
unsigned short unsignedShort
T[N] ArrayNOfType where Type is the type name of T
T* PointerToType where Type is the type name of T
struct Name Name
class Name Name
enum Name Name

Consider for example the following C code with a declaration of p as a pointer to a struct ns__Person:

struct ns__Person { char *name; } *p;

To serialize p, its address is passed to the function soap_serialize_PointerTons__Person generated for this type by the gSOAP soapcpp2 compiler:

soap_serialize_PointerTons__Person(&soap, &p);

The address of p is passed, so the serializer can determine whether p was already serialized and to discover co-referenced objects and cycles in graph data structures that require SOAP encoding with id-ref serialization. To generate the output, the address of p is passed to the function soap_put_PointerTons__Person together with the name of an XML element and an optional type string (to omit a type, use NULL):

soap_begin_send(&soap);
soap_put_PointerTons__Person(&soap, &p, "ns:element-name", "ns:type-name");
soap_end_send(&soap);

or the shorthand for the above (without the xsi type):

soap_write_PointerTons__Person(&soap, &p);

This produces:

<ns:element-name xmlns:SOAP-ENV="..." xmlns:SOAP-ENC="..." xmlns:ns="..."
   ... xsi:type="ns:type-name">
<name xsi:type="xsd:string">...</name>
</ns:element-name>

The serializer is initialized with the soap_begin_send(soap) function and closed with soap_end_send(soap). All temporary data structures and data structures deserialized on the heap are destroyed with the soap_destroy and soap_end functions (in this order).
The soap_done function should be used to reset the context, i.e. the last use of the context. To detach and deallocate the context, use soap_free.
To remove the temporary data only and keep the deserialized data on the heap, use soap_free_temp. Temporary data structures are only created if the encoded data uses pointers. Each pointer in the encoded data has an internal hash table entry to determine all multi-reference parts and cyclic parts of the complete data structure.
You can assign an output stream in C++ to soap.os and in C an output string soap.os, or a file descriptor to soap.sendfd.
For example, to assign a file descriptor:

soap.sendfd = open(file, O_RDWR | O_CREAT, S_IWUSR | S_IRUSR);
soap_serialize_PointerTons__Person(&soap, &p);
soap_begin_send(&soap);
soap_put_PointerTons__Person(&soap, &p, "ns:element-name", "ns:type-name");
soap_end_send(&soap);

The above can be abbreviated to

soap.sendfd = open(file, O_RDWR | O_CREAT, S_IWUSR | S_IRUSR);
soap_write_PointerTons__Person(&soap, &p);

The soap_serialize function is optional. It MUST be used when the object graph contains cycles. It MUST be called to preserve the logical coherence of pointer-based data structures, where pointers may refer to co-referenced objects. By calling soap_serialize, data structures shared through pointers are serialized only once and referenced in XML using id-refs attributes. The actual id-refs used depend on the SOAP encoding. To turn off SOAP encoding, remove or avoid using the SOAP-ENV and SOAP-ENC namespace bindings in the namespace table. In addition, the SOAP_XML_TREE and SOAP_XML_GRAPH flags can be used to control the output by restricting serialization to XML trees or by enabling multi-ref graph serialization with id-ref attribuation.
To save the data as an XML tree (with one root) without any id-ref attributes, use the SOAP_XML_TREE flag. The data structure MUST NOT contain pointer-based cycles.
To preserve the exact structure of the data object graph and create XML with one root, use the SOAP_XML_GRAPH output-mode flag (see Section 9.12). Use this flag and the soap_serialize function to prepare the serialization of data with in-line id-ref attributes. Using the SOAP_XML_GRAPH flag assures the preservation of the logical structure of the data
For example, to encode the contents of two variables var1 and var2 that may share data through pointer structures, the serializers are called before the output routines:

T1 var1;
T2 var2;
struct soap soap;
...
soap_init(&soap); // initialize
[soap_omode(&soap, flags);] // set output-mode flags (e.g. SOAP_ENC_XML|SOAP_ENC_ZLIB)
soap_begin(&soap); // start new (de)serialization phase
soap_set_omode(&soap, SOAP_XML_GRAPH);
soap_serialize_Type1(&soap, &var1);
soap_serialize_Type2(&soap, &var2);
...
[soap.socket = a_socket_file_descriptor;] // when using sockets
[soap.os = an_output_stream;] // C++
[soap.sendfd = an_output_file_descriptor;] // C
soap_begin_send(&soap);
soap_put_Type1(&soap, &var1, "[namespace-prefix:]element-name1", "[namespace-prefix:]type-name1");
soap_put_Type2(&soap, &var2, "[namespace-prefix:]element-name2", "[namespace-prefix:]type-name2");
...
soap_end_send(&soap); // flush
soap_destroy(&soap); // remove deserialized C++ objects
soap_end(&soap); // remove deserialized data structures
soap_done(&soap); // finalize last use of this context
...

where Type1 is the type name of T1 and Type2 is the type name of T2 (see table above). The strings [namespace-prefix:]type-name1 and [namespace-prefix:]type-name2 describe the schema types of the elements. Use NULL to omit this type information.
For serializing class instances, method invocations MUST be used instead of function calls, for example obj.soap_serialize(&soap) and obj.soap_put(&soap, "elt", "type"). This ensures that the proper serializers are used for serializing instances of derived classes.
You can serialize a class instance to a stream as follows:

struct soap soap;
myClass obj;
... populate obj
soap_init(&soap); // initialize
soap_begin(&soap); // start new (de)serialization phase
soap_set_omode(&soap, SOAP_XML_GRAPH);
obj.serialize(&soap);
soap.os = &cout; // send to cout
soap_begin_send(&soap);
obj.put(&soap, "[namespace-prefix:]element-name1", "[namespace-prefix:]type-name1");
soap_end_send(&soap); // flush
...
soap_destroy(&soap); // remove deserialized C++ objects
soap_end(&soap); // remove deserialized data
soap_done(&soap); // finalize last use of this context

For gSOAP 2.8.28 and later, in C we use soap\.os to obtain a string with the XML serialized data:

struct soap soap;
struct myClass obj;
constchar*out;
... populate obj
soap_init(&soap); // initialize
soap_begin(&soap); // start new (de)serialization phase
soap_set_omode(&soap, SOAP_XML_GRAPH);
soap_serialize(&soap, &obj);
soap.os = &out; // string to set
soap_begin_send(&soap);
soap_put(&soap, &obj, "[namespace-prefix:]element-name1", "[namespace-prefix:]type-name1");
soap_end_send(&soap); // flush
... // out has XML content string managed by context
soap.os = NULL; // stop sending to string
...
soap_end(&soap); // remove deserialized data
soap_done(&soap); // finalize last use of this context

When you declare a soap struct pointer as a data member in a class, you can overload the << operator to serialize the class to streams:

ostream &operator<<(ostream &o, const myClass &e)
{
   if (!e.soap)
   ... error: need a soap struct to serialize (could use global struct) ...
   else 
   {
      ostream *os = e.soap->os;
      e.soap->os = &o;
      soap_set_omode(e.soap, SOAP_XML_GRAPH);       e.serialize(e.soap);
      soap_begin_send(e.soap);
      e.put(e.soap, "myClass", NULL);
      soap_end_send(e.soap);
      e.soap->os = os;
      soap_clr_omode(e.soap, SOAP_XML_GRAPH);
   }
   return o;
}

Of course, when you construct an instance you must set its soap struct to a valid context. Deserialized class instances with a soap struct data member will have their soap structs set automatically, see Section 9.13.2.
In principle, XML output for a data structure can be produced with soap_put without calling the soap_serialize function first. In this case, the result is similar to SOAP_XML_TREE which means that no id-refs are output. Cycles in the data structure will crash the serialization algorithm, even when the SOAP_XML_GRAPH is set.
Consider the following struct:

// Contents of file "tricky.h":
struct Tricky
{
   int *p;
   int n;
   int *q;
};

The following fragment initializes the pointer fields p and q to the value of field n:

struct soap soap;
struct Tricky X;
X.n = 1;
X.p = &X.n;
X.q = &X.n;
soap_init(&soap);
soap_begin(&soap);
soap_serialize_Tricky(&soap, &X);
soap_put_Tricky(&soap, &X, "Tricky", NULL);
soap_end(&soap); // Clean up temporary data used by the serializer

What is special about this data structure is that n is 'fixed' in the Tricky structure, and p and q both point to n. The gSOAP serializers strategically place the id-ref attributes such that n will be identified as the primary data source, while p and q are serialized with ref/href attributes.
The resulting output is:

<Tricky xsi:type="Tricky">
<p href="#2"/> <n xsi:type="int">1</n> <q href="#2"/> <r xsi:type="int">2</r> </Tricky> <id id="2" xsi:type="int">1</id>

which uses an independent element at the end to represent the multi-referenced integer, assuming the SOAP-ENV and SOAP-ENC namespaces indicate SOAP 1.1 encoding.
With the SOAP_XML_GRAPH flag the output is:

<Tricky xsi:type="Tricky">
<p href="#2"/> <n id="2" xsi:type="int">1</n> <q href="#2"/> </Tricky>

In this case, the XML is self-contained and multi-referenced data is accurately serialized. The gSOAP generated deserializer for this data type will be able to accurately reconstruct the data from the XML (on the heap).

7.5.4  Deserializing C/C++ Data from XML

We assume that the wsdl2h tool was used to map XML schema types to C/C++ data types. The soapcpp2 tool then generates the (de)serializers for the C/C++ types. You can also use soapcpp2 directly on a header file that declares annotated C/C++ data types to serialize.
To deserialize a data type from XML, the soap_get (or the simpler soap_read) function for the data type to be deserialized is used. The outline of a program that deserializes two variables var1 and var2 is for example:

T1 var1;
T2 var2;
struct soap soap;
...
soap_init(&soap); // initialize at least once
[soap_imode(&soap, flags);] // set input-mode flags
soap_begin(&soap); // begin new decoding phase
[soap.is = an_input_stream;] // C++
[soap.recvfd = an_input_file_desriptpr;] // C
soap_begin_recv(&soap); // if HTTP/MIME/DIME/GZIP headers are present, parse them
if (!soap_get_Type1(&soap, &var1, "[namespace-prefix:]element-name1", "[namespace-prefix:]type-name1"))
   ... error ...
if (!soap_get_Type2(&soap, &var2, "[namespace-prefix:]element-name2", "[namespace-prefix:]type-name1"))
   ... error ...
...
soap_end_recv(&soap); // check consistency of id/hrefs
soap_destroy(&soap); // remove deserialized C++ objects
soap_end(&soap); // remove deserialized data
soap_done(&soap); // finalize last use of the context

The strings [namespace-prefix:]type-name1 and [namespace-prefix:]type-name2 are the schema types of the elements and should match the xsi:type attribute of the receiving message. To omit the match, use NULL as the type. For class instances, method invocation can be used instead of a function call if the object is already instantiated, i.e. obj.soap_get(&soap, "...", "...").
The soap_begin call resets the deserializers. The soap_destroy and soap_end calls remove the temporary data structures and the decoded data that was placed on the heap.
To remove temporary data while retaining the deserialized data on the heap, the function soap_free_temp should be called instead of soap_destroy and soap_end.
One call to the soap_get_Type function of a type Type scans the entire input to process its XML content and to capture SOAP 1.1 independent elements (which contain multi-referenced objects). As a result, soap.error will set to SOAP_EOF. Also storing multiple objects into one file will fail to decode them properly with multiple soap_get calls. A well-formed XML document should only have one root anyway, so don't save multiple objects into one file. If you must save multiple objects, create a linked list or an array of objects and save the linked list or array. You could use the soap_in_Type function instead of the soap_get_Type function. The soap_in_Type function parses one XML element at a time.
You can deserialize class instances from a stream as follows:

myClass obj;
struct soap soap;
soap_init(&soap); // initialize
soap.is = &cin; // read from cin
soap_begin_recv(&soap); // if HTTP header is present, parse it
if (soap_get_myClass(&soap, &obj, "myClass", NULL) == NULL)
   ... error ...
soap_end_recv(&soap); // check consistency of id/hrefs
...
soap_destroy(&soap); // remove deserialized C++ objects
soap_end(&soap); // remove deserialized data
soap_done(&soap); // finalize last use of the context

This can be abbreviated to:

myClass obj;
struct soap soap;
soap_init(&soap); // initialize
soap.is = &cin; // read from cin
if (soap_read_myClass(&soap, &obj, NULL) != SOAP_OK)
   ... error ...
...
soap_destroy(&soap); // remove deserialized C++ objects
soap_end(&soap); // remove deserialized data
soap_done(&soap); // finalize last use of the context

When declaring a soap struct pointer as a data member in a class, you can overload the >> operator to parse and deserialize a class instance from a stream:

istream &operator>>(istream &i, myClass &e)
{
   if (!e.soap)
   ... error: need soap struct to deserialize (could use global struct)...
   istream *is = e.soap->is;
   e.soap->is = &i;
   if (soap_read_myClass(e.soap, &e) != SOAP_OK)
      ... error ...
   e.soap->is = is;
   return i;
}

For gSOAP 2.8.28 and later, you can parse XML from strings as follows:

struct myClass obj;
struct soap soap;
soap_init(&soap); // initialize
soap.is = "..."; // this is the string with XML to parse
if (soap_read_myClass(&soap, &obj, NULL) != SOAP_OK)
   ... error ...
soap.is = NULL; // stop parsing from strings
...
soap_end(&soap); // remove deserialized data
soap_done(&soap); // finalize last use of the context

When declaring a soap struct pointer as a data member in a class, you can overload the >> operator to parse and deserialize a class instance from a stream or string stream:

istream &operator>>(istream &i, myClass &e)
{
   if (!e.soap)
   ... error: need soap struct to deserialize (could use global struct)...
   istream *is = e.soap->is;
   e.soap->is = &i;
   if (soap_read_myClass(e.soap, &e) != SOAP_OK)
      ... error ...
   e.soap->is = is;
   return i;
}

7.5.5  Example

As an example, consider the following data type declarations:

// Contents of file "person.h":
typedef char *xsd__string;
typedef char *xsd__Name;
typedef unsigned int xsd__unsignedInt;
enum ns__Gender {male, female};
class ns__Address
{
   public:
   xsd__string street;
   xsd__unsignedInt number;
   xsd__string city;
};
class ns__Person
{
   public:
   xsd__Name name;
   enum ns__Gender gender;
   ns__Address address;
   ns__Person *mother;
   ns__Person *father;
};

The following program uses these data types to write to standard output a data structure that contains the data of a person named "John" living at Downing st. 10 in Londen. He has a mother "Mary" and a father "Stuart". After initialization, the class instance for "John" is serialized and encoded in XML to the standard output stream using gzip compression (requires the Zlib library, compile sources with -DWITH_GZIP):

// Contents of file "person.cpp":
#include "soapH.h"
int main()
{
   struct soap soap;
   ns__Person mother, father, john;
   mother.name = "Mary";
   mother.gender = female;
   mother.address.street = "Downing st.";
   mother.address.number = 10;
   mother.address.city = "London";
   mother.mother = NULL;
   mother.father = NULL;
   father.name = "Stuart";
   father.gender = male;
   father.address.street = "Main st.";
   father.address.number = 5;
   father.address.city = "London";
   father.mother = NULL;
   father.father = NULL;
   john.name = "John";
   john.gender = male;
   john.address = mother.address;
   john.mother = &mother;
   john.father = &father;
   soap_init(&soap);
   soap_omode(&soap, SOAP_ENC_ZLIB | SOAP_XML_GRAPH); // see 9.12
   soap_begin(&soap);
   soap_begin_send(&soap);
   john.soap_serialize(&soap);
   john.soap_put(&soap, "johnnie", NULL);
   soap_end_send(&soap);
   soap_destroy(&soap);
   soap_end(&soap);
   soap_done(&soap);
}
struct Namespace namespaces[] =
{
   {"SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/"},
   {"SOAP-ENC","http://schemas.xmlsoap.org/soap/encoding/"},
   {"xsi", "http://www.w3.org/2001/XMLSchema-instance"},
   {"xsd", "http://www.w3.org/2001/XMLSchema"},
   {"ns", "urn:person"}, // Namespace URI of the "Person" data type
   {NULL, NULL}
};

The header file is processed and the application compiled on Linux/Unix with:

> soapcpp2 person.h
> c++ -DWITH_GZIP -o person person.cpp soapC.cpp stdsoap2.cpp -lsocket -lxnet -lnsl -lz

(Depending on your system configuration, the libraries libsocket.a, libxnet.a, libnsl.a are required. Compiling on Linux typically does not require the inclusion of those libraries.) See 19.27 for details on compression with gSOAP.
Running the person application results in the compressed XML output:

<johnnie xsi:type="ns:Person" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
   xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:xsd="http://www.w3.org/2001/XMLSchema"
   xmlns:ns="urn:person"
   SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<name xsi:type="xsd:Name">John</name>
<gender xsi:type="ns:Gender">male</gender>
<address xsi:type="ns:Address">
<street id="3" xsi:type="xsd:string">Dowling st.</street>
<number xsi:type="unsignedInt">10</number>
<city id="4" xsi:type="xsd:string">London</city>
</address>
<mother xsi:type="ns:Person">
<name xsi:type="xsd:Name">Mary</name>
<gender xsi:type="ns:Gender">female</gender>
<address xsi:type="ns:Address">
<street href="#3"/>
<number xsi:type="unsignedInt">5</number>
<city href="#4"/>
</address>
</mother>
<father xsi:type="ns:Person">
<name xsi:type="xsd:Name">Stuart</name>
<gender xsi:type="ns:Gender">male</gender>
<address xsi:type="ns:Address">
<street xsi:type="xsd:string">Main st.</street>
<number xsi:type="unsignedInt">13</number>
<city href="#4"/>
</address>
</father>
</johnnie>

The following program fragment decodes this content from standard input and reconstructs the original data structure on the heap:

#include "soapH.h"
int main()
{
   struct soap soap;
   ns__Person *mother, *father, *john = NULL;
   soap_init(&soap);
   soap_imode(&soap, SOAP_ENC_ZLIB); // optional: gzip is detected automatically
   soap_begin(&soap);
   if ((john = soap_get_ns__Person(&soap, NULL, NULL, NULL)) == NULL)
      ... error ...
   mother = john->mother;
   father = john->father;
   ...
   soap_end_recv(&soap);
   soap_free_temp(&soap); // Clean up temporary data but keep deserialized data
}
struct Namespace namespaces[] =
{
   {"SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/"},
   {"SOAP-ENC","http://schemas.xmlsoap.org/soap/encoding/"},
   {"xsi", "http://www.w3.org/2001/XMLSchema-instance"},
   {"xsd", "http://www.w3.org/2001/XMLSchema"},
   {"ns", "urn:person"}, // Namespace URI of the "Person" data type
   {NULL, NULL}
};

It is REQUIRED to either pass NULL to the soap_get routine, or a valid pointer to a data structure that can hold the decoded content. If the data john was already allocated then it does not need to be allocated again as the following demonstrates. The following program fragment decodes the SOAP content in a struct ns__Person allocated on the stack:

#include "soapH.h"
int main()
{
   struct soap soap;
   ns__Person *mother, *father, john;
   soap_init(&soap);
   soap_default_ns__Person(&soap, &john);
   soap_imode(&soap, SOAP_ENC_ZLIB); // optional
   soap_begin(&soap);
   soap_begin_recv(&soap);
   if (soap_get_ns__Person(&soap, &john, "johnnie", NULL) == NULL)
      ... error ...
   ...
}
struct Namespace namespaces[] =
   ...

Note the use of soap_default_ns__Person. This routine is generated by the gSOAP soapcpp2 tool and assigns default values to the fields of john.

7.5.6  Serializing and Deserializing Class Instances to Streams

C++ applications can define appropriate stream operations on objects for (de)serialization of objects on streams. This is best illustrated with an example. Section 7.5.3 gives details on serializing types in general. Consider the class

class ns__person
{ public:
   char *name;
   struct soap *soap; // we need this, see below
   ns__person();
   ~ns__person();
};

The struct soap member is used to bind the instances to a gSOAP context for (de)serialization. We use the gSOAP soapcpp2 compiler from the command prompt to generate the class (de)serializers (assuming that person.h contains the class declaration):

> soapcpp2 person.h

gSOAP generates the (de)serializers and an instantiation function for the class soap_new_ns__person(struct soap *soap, int num) to instantiate one or more objects and associate them with a gSOAP context for deallocation with soap_destroy(soap). To instantiate a single object, omit the num parameter or set to -1. To instantiate an array of objects, set num ≥ 0.

#include "soapH.h"
#include "ns.nsmap"
...
struct soap *soap = soap_new();
ns__person *p = soap_new_ns__person(soap);
...
cout << p; // serialize p in XML
...
in >> p; // parse XML and deserialize p
...
soap_destroy(soap); // deletes p too
soap_end(soap);
soap_done(soap);

The stream operations are implemented as follows

ostream &operator<<(ostream &o, const ns__person &p)
{
   if (!p.soap)
      return o; // need a gSOAP context to serialize
   p.soap->os = &o;
   soap_omode(p.soap, SOAP_XML_TREE); // XML tree or graph
   p.soap_serialize(p.soap);
   soap_begin_send(p.soap);
   if (p.soap_put(p.soap, "person", NULL)
       | | soap_end_send(p.soap))
      ; // handle I/O error
   return o;
}
istream &operator>>(istream &i, ns__person &p)
{
   if (!p.soap)
      return o; // need a gSOAP context to parse XML and deserialize
   p.soap->is = &i;
   if (soap_begin_recv(p.soap)
       | | p.soap_in(p.soap, NULL, NULL)
       | | soap_end_recv(p.soap))
      ; // handle I/O error
   return i;
}

7.5.7  How to Specify Default Values for Omitted Data

The gSOAP soapcpp2 compiler generates soap_default functions for all data types. The default values of the primitive types can be easily changed by defining any of the following macros in the stdsoap2.h file:

#define SOAP_DEFAULT_bool
#define SOAP_DEFAULT_byte
#define SOAP_DEFAULT_double
#define SOAP_DEFAULT_float
#define SOAP_DEFAULT_int
#define SOAP_DEFAULT_long
#define SOAP_DEFAULT_LONG64
#define SOAP_DEFAULT_short
#define SOAP_DEFAULT_string
#define SOAP_DEFAULT_time
#define SOAP_DEFAULT_unsignedByte
#define SOAP_DEFAULT_unsignedInt
#define SOAP_DEFAULT_unsignedLong
#define SOAP_DEFAULT_unsignedLONG64
#define SOAP_DEFAULT_unsignedShort
#define SOAP_DEFAULT_wstring

Instead of adding these to stdsoap2.h, you can also compile with option -DWITH_SOAPDEFS_H and include your definitions in file soapdefs.h. The absence of a data value in a receiving SOAP message will result in the assignment of a default value to a primitive type upon deserialization.
Default values can also be assigned to individual struct and class fields of primitive type. For example,

struct MyRecord
{
   char *name = "Unknown";
   int value = 9999;
   enum Status { active, passive } status = passive;
}

Default values are assigned to the fields on receiving a SOAP/XML message in which the data values are absent.
Because method requests and responses are essentially structs, default values can also be assigned to method parameters. The default parameter values do not control the parameterization of C/C++ function calls, i.e. all actual parameters must be present when calling a function. The default parameter values are used in case an inbound request or response message lacks the XML elements with parameter values. For example, a Web service can use default values to fill-in absent parameters in a SOAP/XML request:

int ns__login(char *uid = "anonymous", char *pwd = "guest", bool granted);

When the request message lacks uid and pwd parameters, e.g.:

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope
   xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
   xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:xsd="http://www.w3.org/2001/XMLSchema"
   xmlns:ns="http://tempuri.org">
   <SOAP-ENV:Body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
      <ns:login>
      </ns:login>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

then the service uses the default values. In addition, the default values will show up in the SOAP/XML request and response message examples generated by the gSOAP compiler.

8  The wsdl2h WSDL and Schema Importer

The wsdl2h tool is an advanced application that converts one or more WSDLs to C/C++. It can also be used without WSDLs to convert XML schemas (XSD files) to C/C++ to implement XML data bindings in C and C++.
The creation of C and C++ applications from one of more WSDL service descriptions is a two-step process.
To convert a WSDL to C++, use:

> wsdl2h file.wsdl

to generate a C++ header file file.h. This generated header file is a Web service specification that contains the parameter types and service function definitions in an understandable format in C++ (or ANSI C as shown below). Web service operations are represented as function prototypes. Schema types are represented by semantically equivalent C/C++ types that are convenient and natural to use in a C/C++ application. The generated header file also contains various annotations related to the Web service properties defined in the WSDL.
To generate ANSI C, use option -c:

> wsdl2h -c file.wsdl

Multiple WSDL specifications can be processed at once and saved to one file with the -o option:

> wsdl2h -o file.h file1.wsdl file2.wsdl file3.wsdl

You can retrieve WSDLs from one of more URLs:

> wsdl2h -o file.h http://www.example.com/example.wsdl

To convert XML schemas to C or C++ XML data binding code, use:

> wsdl2h -o file.h file1.xsd file2.xsd file3.xsd

The wsdl2h-generated header file file.h is processed by the soapcpp2 tool to auto-generate the advanced data binding logic to convert the C/C++ data to XML and vice versa at runtime for your SOAP/XML application.
To process a gSOAP header file file.h (generated by wsdl2h) to generate advanced XML data bindings for C++, use:

> soapcpp2 -i -Iimport file.h

When the header file file.h was generated for C++, then this command generates a couple of C++ source files (more details will follow in Section 9) that implement XML encoders for the data binding. Option -i generates a client proxy objects and service objects to invoke and serve SOAP/XML operations, respectively. Option -Iimport sets the import directory for imported files from the package's import, such as stlvector.h for STL vector serialization support.
When the header file file.h was generated for ANSI C, then the above command generates a couple of C files that implement XML encoders, client stubs for remote invocation, and service skeletons for service operations.
Consider for example the following commands to implement a c++ client of a service:

> wsdl2h -o calc.h http://www.genivia.com/calc.wsdl
...
> soapcpp2 -i -Iimport calc.h

The first command generates calc.h from the WSDL at the specified URL. The header file is then processed by the soapcpp2 tool to generate the proxies (and service objects that we will not use) for the client application.
The C++ client application uses the auto-generated soapcalcProxy.h class and calc.nsmap XML namespace table to access the Web service. Both need to be #include-d in your source. Then compile and link the soapcalcProxy.cpp, soapC.cpp and stdsoap2.cpp sources to complete the build.

8.1  wsdl2h Options

The wsdl2h tool is an advanced XML data binding tool for converting WSDLs and XML schemas (XSD files) to C or C++. The tool takes WSDL and/or XSD files or URLs and converts these to a C or C++ specification in one easy-to-read C/C++ header file. The header file is not intended to be included in your code directly!. It should be converted by soapcpp2 to generate the logic for the data bindings. It can however be safely converted by a documentation tool such as Doxygen to analyze and represent the service operations and data in a convenient layout. To this end, the header file is self-explanatory.
The wsdl2h tool generates only one file, the header file that includes all of the information obtained from all WSDL and schema files provided to the tool at the command-line prompt. The default output file name of wsdl2h is the first WSDL/schema input file name but with extension .h instead of .wsdl (or .xsd). When an input file is absent or a WSDL file from a Web location is accessed, the header output will be produced on the standard output unless option -o is used to direct the output to a file.
The wsdl2h command-line options are:

Option Description
-a generate indexed struct names for local elements with anonymous types
-b bi-directional operations to serve one-way response messages (duplex)
-c generate C source code
-d use DOM to populate xs:any and xsd:anyType elements
-e don't qualify enum names
This option is for backward compatibility with gSOAP 2.4.1 and earlier.
The option does not produce code that conforms to WS-I Basic Profile 1.0a.
-f generate flat C++ class hierarchy for schema extensions
-g generate global top-level element declarations
-h print help information
-I path use path to locate source files for #import
-i don't import (advanced option)
-j don't generate SOAP_ENV__Header and SOAP_ENV__Detail definitions
-k don't generate SOAP_ENV__Header mustUnderstand qualifiers
-l include license information in output
-m use xsd.h module to import primitive types
-N name use name for service prefixes to produce a service for each binding
-n name use name as the base namespace prefix name instead of ns
-o file output to file
-P don't create polymorphic types inherited from xsd__anyType
-p create polymorphic types inherited from base xsd__anyType
This is automatically performed when WSDL contains polymorphic definitions
-q name use name for the C++ namespace of all declarations
-r host[:port[:uid:pwd]] connect via proxy host, port, and proxy credentials
-r:uid:pwd connect with authentication credentials (digest auth requires SSL)
-R generate REST operations for REST bindings in the WSDL
-s don't generate STL code (no std::string and no std::vector)
-t file use type map file instead of the default file typemap.dat
-U map Unicode XML names to UTF8-encoded Unicode C/C++ identifiers
-u don't generate unions
-v verbose output
-W suppress warnings
-w always wrap response parameters in a response struct
-x don't generate _XML any/anyAttribute extensibility elements
-y generate typedef synonyms for structs and enums
-z1 compatibility with 2.7.6e: generate pointer-based arrays
-z2 compatibility with 2.7.15: qualify element/attribute referenced members
-z3 compatibility with 2.7.16 to 2.8.7: qualify element/attribute references
-z4 compatibility up to 2.8.11: don't generate union structs in std::vector
-z5 compatibility up to 2.8.15
-z6 compatibility up to 2.8.17
-_ don't generate _USCORE (replace with Unicode _x005f)

Note: see README.txt in the wsdl directory for the latest information on installation and options to of the wsdl2h WSDL/schema importer.

8.2  Customizing Data Bindings With The typemap.dat File

The typemap.dat file for the wsdl2h tool is intended to customize or optimize the type bindings by mapping schema types to C/C++ types. It contains custom XML Schema to C/C++ type bindings and a few bindings are defined for convenience.
Here is an example typemap file's content:

# This file contains custom definitions of the XML Schema types and
# C/C++ types for your project, and XML namespace prefix definitions.
# The wsdl2h WSDL importer consults this file to determine bindings.

[
// This comment will be included in the generated .h file
// You can include any additional declarations, includes, imports, etc.
// within [ ] sections. The brackets MUST appear at the start of a line
]
# XML namespace prefix definitions can be provided to override the
# default choice of ns1, ns2, ... prefixes. For example:

i = "http://www.soapinterop.org/"
s = "http://www.soapinterop.org/xsd"

Type bindings can be provided to bind XML schema types to C/C++ types for your project. Type bindings have four parts:

prefix__type = declaration | use | ptr-use

where 'prefix__type' is the C/C++-translation of the schema type, 'declaration' introduces the C/C++ type in the header file, the optional 'use' specifies how the type is used directly, and the optional 'ptr-use' specifies how the type is used as a pointer type.


# Example XML Schema and C/C++ type bindings:

xsd__int = | int
xsd__string = | char* | char*
xsd__boolean = enum xsd__boolean false_, true_ ; | enum xsd__boolean
xsd__base64Binary = class xsd__base64Binary unsigned char *__ptr; int __size; ; | xsd__base64Binary | xsd__base64Binary
# You can extend structs and classes with member data and functions.
# For example, adding a constructor to ns__myClass: ns__myClass = $ ns__myClass();
# The general form is # class_name = $ member;

The i and s prefixes are declared such that the header file output by the WSDL parser will use these to produce C/C++ code. XML Schema types are associated with an optional C/C++ type declaration, a use reference, and a pointer-use reference. The pointer-use reference of the xsd__byte type for example, is int* because char* is reserved for strings.
When a type binding requires only the usage to be changed, the declaration part can be given by an elipsis ..., as in:

prefix__type = ... | use | ptr-use

This ensures that the wsdl2h-generated type definition is preserved, while the use and ptr-use are remapped.
This method is useful to serialize dynamic types in C, where elements types int XML carry the xsi:type attribute.
The following example illustrates an "any" type mapping for the ns:sometype XSD type in a schema. This type will be replaced with a "any" type wrapper that supports dynamic serialization with xsi:type:

[
struct __any
{
   int __type;
   void *__item;
}
]
xsd__anyType = ... | struct __any | struct __any

where __type and __item are used to (de)serialize any data type in the wrapper, including base and its derived types based on xsi:type attribuation.
To support complexType extensions that are dynamically bound in C code, i.e. polymorphic types based on inheritance hierarchies, we can redeclare the base type of a hierarchy as a wrapper type and use the __type to serialize base or derived types. One addition is needed to support base type serialization without the use of xsi:type attributes. The absence of this attribute requires the serialization of the base type.
Basically, we need to be able to both handle a base type and its extensions as per schema extensibility. Say base type ns:base is a complexType that is extended by several other complexTypes. To implement dynamic binding in C to serialize the base type and derived types, we define:

[
struct __ns__base
{
   int __type;
   void *__item;
   struct ns__base *__self;
}
]
ns__base = ... | struct __ns__base | struct __ns__base

The __self field refers to the element tag (basically a struct member name) to which the ns:base type is associated. So for example, we see in the soapcpp2-generated output:

struct ns__data
{
   ...
   struct __ns__base name;
   ...
};

where __item represents name when the __ns__base is serialized with an xsi:type attribute, and __self represents name when the __ns__base is serialized wwithout an xsi:type attribute. Therefore, the dynamic binding defaults to struct ns__base *__self when no dynamic type information in XML is available.
Additional data and function members can be provided to extend a generated struct or class. Class and struct extensions are of the form:

prefix__type = $ member-declaration

For example, to add a constructor and destructor to class myns__record:

myns__record = $ myns__record(); myns__record = $ ~myns__record();

Type remappings can be given to map a type to another type:

prefix__type1 == prefix__type2

which replaces prefix__type1 by prefix__type2 in the wsdl2h output. For example:

SOAP_ENC__boolean == xsd__boolean

where SOAP_ENC__boolean is mapped to xsd__boolean, which in turn may be mapped to a C enum xsd__boolean type or C++ bool type.

9  Using the soapcpp2 Compiler and Code Generator

The soapcpp2 compiler and code generator is invoked from the command line and optionally takes the name of a header file as an argument or, when the file name is absent, parses the standard input:

> soapcpp2 [aheaderfile.h]

where aheaderfile.h is a C/C++ header file generated by wsdl2h or developed manually to specify the SOAP/XML service operations as function prototypes and the C/C++ data types to be auto-mapped to XML.
The soapcpp2 tool produces C/C++ source files. These files are used to implement SOAP/XML clients and services, and to implement the advanced XML data binding logic to convert C/C++ data into XML and vice versa.
The type of files generated by soapcpp2 are:

File Name Description
soapStub.h A modified and annotated header file produced from the input header file
soapH.h Main header file to be included by all client and service sources
soapC.cpp Serializers and deserializers for the specified data structures
soapClient.cpp Client stub routines for remote operations
soapServer.cpp Service skeleton routines
soapClientLib.cpp Client stubs combined with local static (de)serializers
soapServerLib.cpp Service skeletons combined with local static (de)serializers
soapXYZProxy.h A C++ proxy object (link with soapC.cpp soapClient.cpp)
soapXYZProxy.h With option -i: proxy object (link with soapC.cpp and soapXYZProxy.cpp)
soapXYZProxy.cpp With option -i: proxy code
soapXYZObject.h A C++ server object (link with soapC.cpp and soapServer.cpp)
soapXYZService.h With option -i: server object (link with soapC.cpp and soapXYZService.cpp)
soapXYZService.cpp With option -i: server code
.xsd An ns.xsd file is generated with an XML Schema for each namespace prefix ns used by a data structure in the header file input to the compiler, see Section 7.2.9
.wsdl A ns.wsdl file is generated with an WSDL description for each namespace prefix ns used by a service operation in the header file input to the compiler, see Section 7.2.9
.xml Several SOAP/XML request and response files are generated. These are example message files are valid provided that sufficient schema namespace directives are added to the header file or the generated .nsmap namespace table for the client/service is not modified by hand
.nsmap A ns.nsmap file is generated for each namespace prefix ns used by a service operation in the header file input to the compiler, see Section 7.2.9. The file contains a namespace mapping table that can be used in the client/service sources

Both client and service applications are developed from a header file that specifies the service operations. If client and service applications are developed with the same header file, the applications are guaranteed to be compatible because the stub and skeleton routines use the same serializers and deserializers to encode and decode the parameters. Note that when client and service applications are developed together, an application developer does not need to know the details of the internal SOAP encoding used by the client and service.
The soapClientLib.cpp and soapServerLib.cpp can be used to build (dynamic) client and server libraries. The serialization routines are local (static) to avoid link symbol conflicts. You must create a separate library for SOAP Header and Fault handling, as described in Section 19.36.
The following files are part of the gSOAP package and are required to build client and service applications:

File Name Description
stdsoap2.h Header file of stdsoap2.cpp runtime library
stdsoap2.c Runtime C library with XML parser and run-time support routines
stdsoap2.cpp Runtime C++ library identical to stdsoap2.c

9.1  soapcpp2 Options

The soapcpp2 source-to-source compiler supports the following command-line options:

Option Description
-1 generate SOAP 1.1 bindings
-2 generate SOAP 1.2 bindings
-0 no SOAP bindings, use REST
-C generate client-side code only
-S generate server-side code only
-T generate server auto-test code
-Ec generate extra routines for deep data copying
-Ed generate extra routines for deep data deletion
-Et generate extra routines for data traversals with walker functions
-L do not generate soapClientLib/soapServerLib
-a use SOAPAction with WS-Addressing to invoke server-side operations
-A require SOAPAction to invoke server-side operations
-b serialize byte arrays char[N] as string
-c generate pure C code
-d < path > save sources in directory specified by < path >
-e generate SOAP RPC encoding style bindings
-f N multiple soapC files, with N serializer definitions per file (N ≥ 10)
-h print a brief usage message
-i generate service proxies and objects inherited from soap struct
-j generate C++ service proxies and objects that can share a soap struct
-I < path > use < path > for #import (paths separated with ':' or ';' for windows)
-l generate linkable modules (experimental)
-m generate Matlabtm code for MEX compiler
-n when used with -p, enables multi-client and multi-server builds:
sets compiler option WITH_NONAMESPACES, see Section 9.11
saves the namespace mapping table with name < name > _namespaces instead of namespaces
renames soap_serve() into < name > _serve() and soap_destroy() into < name > _destroy()
-p < name > save sources with file name prefix < name > instead of "soap"
-q < name > use name for the C++ namespace of all declarations
-s generates deserialization code with strict XML validation checks
-t generates code to send typed messages (with the xsi:type attribute)
-u uncomment comments in WSDL/schema output by suppressing XML comments
-v verbose output
-w do not generate WSDL and schema files
-x do not generate sample XML message files
-y include C/C++ type access information in sample XML messages
-z1 compatibility: generate old-style C++ service proxies and objects
-z2 compatibility with 2.7.x: omit XML output for NULL pointers

For example

> soapcpp2 -cd '../projects' -pmy file.h

Saves the sources:

../projects/myH.h
../projects/myC.c
../projects/myClient.c
../projects/myServer.c
../projects/myStub.h

MS Windows users can use the usual "/" for options, for example:

soapcpp2 /cd '..\projects' /pmy file.h

Compiler options c, i, n, l, w can be set in the gSOAP header file using the //gsoapopt directive. For example,

// Generate pure C and do not produce WSDL output:
//gsoapopt cw
int ns__myMethod(char*,char**); // takes a string and returns a string

9.2  SOAP 1.1 Versus SOAP 1.2 and Dynamic Switching

gSOAP supports SOAP 1.1 by default. SOAP 1.2 support is automatically turned on when the appropriate SOAP 1.2 namespace is used, which shows up in the namespace mapping table:

struct Namespace namespaces[] =
{
   {"SOAP-ENV", "http://www.w3.org/2003/05/soap-envelope", ... },
   {"SOAP-ENC", "http://www.w3.org/2003/05/soap-encoding, ... "},
   ...
}

Normally the soapcpp2-generated namespace table allows dynamic switching between SOAP 1.1 to SOAP 1.2 by providing the SOAP 1.2 namespace as a pattern in the third column of a namespace table:

struct Namespace namespaces[] =
{
   {"SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/", "http://www.w3.org/*/soap-encoding"},
   {"SOAP-ENC", "http://schemas.xmlsoap.org/soap/encoding/", "http://www.w3.org/*/soap-envelope"},
   ...
}

where the "*" in the third column of the namespace URI pattern is a meta wildcard. This is used to match and accept inbound namespaces.
This way, gSOAP Web services can respond to either SOAP 1.1 or SOAP 1.2 requests. gSOAP will automatically return SOAP 1.2 responses for SOAP 1.2 requests.
The gSOAP soapcpp2 tool generates a .nsmap file with SOAP-ENV and SOAP-ENC namespace patterns similar to the above. Since clients issue a send first, they will always use SOAP 1.1 for requests when the namespace table is similar as shown above. Clients can accept SOAP 1.2 responses by inspecting the response message.
To use SOAP 1.2 by default and allow SOAP 1.1 messages to be received, use the soapcpp2 -2 option to generate SOAP 1.2 conformant .nsmap and .wsdl files. Alternatively, add the following line to your service definitions header file (generated by wsdl2h) for soapcpp2:

#import "import/soap12.h"

Caution: SOAP 1.2 does not support partially transmitted arrays. So the __offset field of a dynamic array is meaningless.
Caution: SOAP 1.2 requires the use of SOAP_ENV__Code, SOAP_ENV__Reason, and SOAP_ENV__Detail fields in a SOAP_ENV__Fault fault struct, while SOAP 1.1 uses faultcode, faultstring, and detail fields. Use soap_receiver_fault_subcode(struct soap *soap, const char *subcode, const char *faultstring, const char *detail) to set a SOAP 1.1/1.2 fault at the server-side with a fault subcode (SOAP 1.2). Use soap_sender_fault_subcode(struct soap *soap, const char *subcode, const char *faultstring, const char *detail) to set a SOAP 1.1/1.2 unrecoverable Bad Request fault at the server-side with a fault subcode (SOAP 1.2).

9.3  The soapdefs.h Header File

The soapdefs.h header file is included in stdsoap2.h when compiling with option -DWITH_SOAPDEFS_H:

> c++ -DWITH_SOAPDEFS_H -c stdsoap2.cpp

The soapdefs.h file allows users to include definitions and add includes without requiring changes to stdsoap2.h. You can also specify the header file name to include as a macro SOAPDEFS_h to override the name soapdefs.h:

> c++ -DSOAPDEFS_H=mydefs.h -c stdsoap2.cpp

For example,

// Contents of soapdefs.h
#include < ostream >
#define SOAP_BUFLEN 65536 // use large send/recv buffer

The following header file can now refer to ostream:

extern class ostream; // ostream can't be (de)serialized, but need to be declared to make it visible to gSOAP
class ns__myClass
{ ...
   virtual void print(ostream &s) const; // need ostream here
   ...
};

See also Section 19.3.

9.4  How to Build Modules and Libraries with the #module Directive

The #module directive is used to build modules. A library can be build from a module and linked with multiple Web services applications. The directive should appear at the top of the header file and has the following formats:

#module "name"

and

#module "name" "fullname"

where name must be a unique short name for the module. The name is case insensitive and MUST not exceed 4 characters in length. The fullname, when present, represents the full name of the module.
The rest of the content of the header file includes type declarations and optionally the declarations of service operations and SOAP Headers/Faults. When the gSOAP soapcpp2 compiler processes the header file module, it will generate the source codes for a library. The Web services application that uses the library should use a header file that imports the module with the #import directive.
For example:

/* Contents of module.h */
#module "test"
long;
char*;
struct ns__S
{ ... }

The module.h header file declares a long, char*, and a struct ns__X. The module name is "test", so the gSOAP soapcpp2 compiler produces a testC.cpp file with the (de)serializers for these types. The testC.cpp library can be separately compiled and linked with an application that is built from a header file that imports "module.h" using #import "module.h". You should also compile testClient.cpp when you want to build a library that includes the service opertions that you defined in the module header file.
There are some limitations on a sequence of module imports. A module MUST be imported into another header to use the module content and you MUST place this import statement before all other statements in the file, including other imports (except when these are also modules). It is also advised to put all basic data type definitions in the root module of a module import hierarchy, e.g. using typedef to declare XSD types (see also Section 11.3).
You cannot use a module alone to build a SOAP or XML application. That is, the final gSOAP header file in the import chain SHOULD NOT be a module.
When multiple modules are linked, the types that they declare MUST be declared in one module only to avoid name clashes and link errors. You cannot create two modules that share the same type declaration and link the modules. When necessary, you should consider creating a module hierarchy such that types are declared only once and by only one module when these modules must be linked.

9.5  How to use the #import Directive

The #import directive is used to include gSOAP header files into other gSOAP header files for processing with the gSOAP compiler soapcpp2. The C #include directive cannot be used to include gSOAP header files. The #include directive is reserved to control the post-gSOAP compilation process, see 9.6.
The #import directive is used for two purposes: you can use it to include the contents of a header file into another header file and you can use it to import a module, see 9.4.
An example of the #import directive:

#import "mydefs.gsoap"
int ns__mymethod(xsd__string in, xsd__int *out);

where "mydefs.gsoap" is a gSOAP header file that defines xsd__string and xsd__int:

typedef char *xsd__string;
typedef int xsd__int;

When importing a module, where the module content is declared with #module, then note that this module MUST place the import statement before all other statements in the header file, including other imports (except when these are also modules).

9.6  How to Use #include and #define Directives

The #include and #define directives are normally ignored by the gSOAP soapcpp2 compiler and just passed on to the generated code. Thus, the gSOAP compiler will not actually parse the contents of the header files provided by the #include directives in a header file. Instead, the #include and #define directives will be added to the generated soapH.h header file before any other header file is included. Therefore, #include and #define directives can be used to control the C/C++ compilation process of the sources of an application. However, they have no effect on soapcpp2.
The following example header file refers to ostream by including < ostream > :

#include < ostream >
#define WITH_COOKIES // use HTTP cookie support (you must compile stdsoap2.cpp with -DWITH_COOKIES)
#define WITH_OPENSSL // enable HTTPS/SSL support (you must compile stdsoap2.cpp with -DWITH_OPENSSL)
#define WITH_GNUTLS // enable HTTPS/SSL support (you must compile stdsoap2.cpp with -DWITH_GNUTLS)
#define SOAP_DEFAULT_float FLT_NAN // use NaN instead of 0.0
extern class ostream; // ostream can't be (de)serialized, but need to be declared to make it visible to gSOAP
class ns__myClass
{ ...
   virtual void print(ostream &s) const; // need ostream here
   ...
};

This example also uses #define directives for various settings in the target source code.
Caution: Note that the use of #define in the header file does not automatically result in compiling stdsoap2.cpp with these directives. You MUST use the -DWITH_COOKIES and -DWITH_OPENSSL (or -DWITH_GNUTLS options when compiling stdsoap2.cpp before linking the object file with your codes. As an alternative, you can use #define WITH_SOAPDEFS_H and put the #define directives in the soapdefs.h file.

9.7  Compiling a SOAP/XML Client Application with soapcpp2

After invoking the gSOAP soapcpp2 tool on a header file description of a service, the client application can be compiled on a Linux machine as follows:

> c++ -o myclient myclient.cpp stdsoap2.cpp soapC.cpp soapClient.cpp

Or on a Unix machine:

> c++ -o myclient myclient.cpp stdsoap2.cpp soapC.cpp soapClient.cpp -lsocket -lxnet -lnsl

(Depending on your system configuration, the libraries libsocket.a, libxnet.a, libnsl.a or dynamic *.so versions of those libraries are required.)
The myclient.cpp file must include soapH.h and must define a global namespace mapping table. A typical client program layout with namespace mapping table is shown below:

// Contents of file "myclient.cpp"
#include "soapH.h";
...
// A service operation invocation:
   soap_call_some_remote_method(...);
...
struct Namespace namespaces[] =
{   // {"ns-prefix", "ns-name"}
   {"SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/"},
   {"SOAP-ENC", "http://schemas.xmlsoap.org/soap/encoding/"},
   {"xsi", "http://www.w3.org/2001/XMLSchema-instance"},
   {"xsd", "http://www.w3.org/2001/XMLSchema"},
   {"ns1", "urn:my-remote-method"},
   {NULL, NULL}
};
...

A mapping table is generated by the gSOAP soapcpp2 compiler that can be used in the source, see Section 7.2.9.

9.8  Compiling a SOAP/XML Web Service with soapcpp2

After invoking the gSOAP soapcpp2 tool on a header file description of the service, the server application can be compiled on a Linux machine as follows:

> c++ -o myserver myserver.cpp stdsoap2.cpp soapC.cpp soapServer.cpp

Or on a Unix machine:

> c++ -o myserver myserver.cpp stdsoap2.cpp soapC.cpp soapServer.cpp -lsocket -lxnet -lnsl

(Depending on your system configuration, the libraries libsocket.a, libxnet.a, libnsl.a or dynamic *.so versions of those libraries are required.)
The myserver.cpp file must include soapH.h and must define a global namespace mapping table. A typical service program layout with namespace mapping table is shown below:

// Contents of file "myserver.cpp"
#include "soapH.h";
int main()
{
   soap_serve(soap_new());
}
...
// Implementations of the service operations as C++ functions
...
struct Namespace namespaces[] =
{   // {"ns-prefix", "ns-name"}
   {"SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/"},
   {"SOAP-ENC", "http://schemas.xmlsoap.org/soap/encoding/"},
   {"xsi", "http://www.w3.org/2001/XMLSchema-instance"},
   {"xsd", "http://www.w3.org/2001/XMLSchema"},
   {"ns1", "urn:my-remote-method"},
   {NULL, NULL}
};
...

When the gSOAP service is compiled and installed as a CGI application, the soap_serve function acts as a service dispatcher. It listens to standard input and invokes the method via a skeleton routine to serve a SOAP client request. After the request is served, the response is encoded in SOAP and send to standard output. The method must be implemented in the server application and the type signature of the method must be identical to the service operations specified in the header file. That is, the function prototype in the header file must be a valid prototype of the method implemented as a C/C++ function.

9.9  Compiling Web Services and Clients in ANSI C

The gSOAP soapcpp2 compiler can be used to create pure C Web services and clients. The gSOAP stub and skeleton compiler soapcpp2 generates .cpp files by default. The compiler generates .c files with the -c option. However, these files only use C syntax and data types if the header file input to soapcpp2 uses C syntax and data types. For example:

> soapcpp2 -c quote.h
> cc -o quote quote.c stdsoap2.c soapC.c soapClient.c

Warnings will be issued by the compiler when C++ class declarations occur in the header file.

9.10  Limitations of gSOAP

gSOAP is SOAP 1.1 and SOAP 1.2 compliant and supports SOAP RPC and document/literal operations.
From the perspective of the C/C++ language, a few C++ language features are not supported by gSOAP and these features cannot be used in the specification of SOAP service operations.
There are certain limitations for the following C++ language constructs:
STL and STL templates
The gSOAP soapcpp2 compiler supports C++ strings std::string and std::wstring (see Section 11.3.6) and the STL containers std::deque, std::list, std::vector, and std::set, (see Section 11.11.8).
Templates
The gSOAP soapcpp2 compiler is a preprocessor that cannot determine the template instantiations used by the main program, nor can it generate templated code. You can however implement containers similar to the STL containers.
Multiple inheritance
Single class inheritance is supported. Multiple inheritance cannot be supported due to limitations of the SOAP protocol.
Abstract methods
A class must be instantiatable to allow decoding of instances of the class.
Directives
Directives and pragmas such as #include and #define are interpreted by the gSOAP soapcpp2 compiler. However, the interpretation is different compared to the usual handling of directives, see Section 9.6. If necessary, a traditional C++ preprocessor can be used for the interpretation of directives. For example, Unix and Linux users can use "cpp -B" to expand the header file, e.g. cpp -B myfile.h - soapcpp2. Use the gSOAP #import directive to import gSOAP header files, see 9.5.
C and C++ programming statements
All class methods of a class should be declared within the class declaration in the header file, but the methods should not be implemented in code. All class method implementations must be defined within another C++ source file and linked to the application.
The following data types require some attention to ensure they are serialized:
union types
A union data type can not be serialized unless run-time information is associated with a union in a struct/class as discussed in Section 11.7. An alternative is to use a struct with a pointer type for each field. Because NULL pointers are not encoded, the resulting encoding will appear as a union type if only one pointer field is valid (i.e. non-NULL) at the time that the data type is encoded.
void and void* types
The void data type cannot be serialized unless run-time type information is associated with the pointer using a int __type field in the struct/class that contains the void*. The void* data type is typically used to point to some object or to some array of some type of objects at run-time. The compiler cannot determine the type of data pointed to and the size of the array pointed to. A struct or class with a void* field can be augmented to support the (de)serialization of the void* using a int __type field as described in Section 11.9.
Pointers to sequences of elements in memory
Any pointer, except for C strings which are pointers to a sequence of characters, are treated by the compiler as if the pointer points to only one element in memory at run-time. Consequently, the encoding and decoding routines will ignore any subsequent elements that follow the first in memory. For the same reason, arrays of undetermined length, e.g. float a[] cannot be used. gSOAP supports dynamic arrays using a special type convention, see Section 11.11.
Uninitialized pointers
Obviously, all pointers that are part of a data structure must be valid or NULL to enable serialization of the data structure at run time.
There are a number of programming solutions that can be adopted to circumvent these limitations. Instead of using void*, a program can in some cases be modified to use a pointer to a known type. If the pointer is intended to point to different types of objects, a generic base class can be declared and the pointer is declared to point to the base class. All the other types are declared to be derived classes of this base class. For pointers that point to a sequence of elements in memory dynamic arrays should be used instead, see 11.11.

9.11  Library Build Flags

The following macros (#defines) can be used to enable certain optional features when building the libgsoap library or when compiling and linking stdsoap2.c and stdsoap2.cpp:

Macro Description
WITH_SOAPDEFS_H includes the soapdefs.h file for custom settings, see Section 9.3
SOAPDEFS_H the header file to include, if different from soapdefs.h (see above)
WITH_COOKIES enables HTTP cookies, see Sections 19.28 19.29
WITH_OPENSSL enables OpenSSL, see Sections 19.22 19.21
WITH_GNUTLS enables GNUTLS, see Sections 19.22 19.21
WITH_IPV6 enables IPv6 support (compile ALL sources with this macro set)
WITH_IPV6_V6ONLYIPv6-only server option (compile ALL sources with this macro set)
WITH_NO_IPV6_V6ONLYresets IPv6-only server option (compile ALL sources with this macro set)
WITH_TCPFIN use TCP FIN after sends when socket is ready to close
WITH_FASTCGI enables FastCGI, see Sections 19.31
WITH_GZIP enables gzip and deflate compression, see Section 19.27
WITH_ZLIB enables deflate compression only, see Section 19.27
WITH_FAST use faster memory allocation for WITH_LEAN/WITH_LEANER
WITH_NOIO eliminates need for file IO and BSD socket library, see Section 19.33
WITH_NOIDREF eliminates href/ref and id attributes to (de)serialize multi-ref data,
or alternatively use the SOAP_XML_TREE runtime flag
WITH_NOHTTP eliminates HTTP stack to reduce code size
WITH_NOZONE silently ignores the timezone in time conversions, time is local time, not GMT
WITH_LEAN creates a small-footprint executable, see Section 19.32
WITH_LEANER creates an even smaller footprint executable, see Section 19.32
WITH_COMPAT removes dependency on C++ stream libraries, eliminating C++ exceptions
WITH_NONAMESPACESremoves dependence on global namespaces table, MUST set it
explicitly with soap_set_.namespaces()
see also Section 10.4
WITH_PURE_VIRTUAL for C++ abstract service classes with pure virtual methods
WITH_NOEMPTYSTRUCT inserts a dummy member in empty structs to allow compilation
WITH_NOGLOBAL omit SOAP Header and Fault serialization code,
prevents duplicate definitions with generated soapXYZLib code
WITH_NOCDATA do not retain the parsed CDATA sections in literal XML strings (convert)
WITH_CDATA retain the parsed CDATA sections in literal XML strings (no conversion, default)
WITH_C_LOCALE use locale functions when available to ensure locale-independent
number conversions (force the use of C locale)
WITH_CASEINSENSITIVETAGS enable case insensitive XML parsing
WITH_REPLACE_ILLEGAL_UTF8 replaces UTF8 content that is outside the allowed range of XML 1.0

Other compile-time flags:

Macro Description
SOCKET_CLOSE_ON_EXIT prevents a server port from staying in listening mode after exit
by internally setting fcntl(sock, F_SETFD, FD_CLOEXEC)

Compile-time flags to change the default engine settings:

Macro Description
SOAP_BUFLEN the length of the internal message buffer (affects socket comms)
SOAP_TAGLEN maximum length of XML tags and URL domain names (buffering)
SOAP_SSL_RSA_BITS the length of the RSA key (2048 by default)
SOAP_UNKNOWN_CHAR an 8 bit code that represents a character that could not be converted
to an ASCII char (e.g. from Unicode, applicable when SOAP_C_UTFSTRING is off)

Caution: it is important that all of these macros MUST be consistently defined to compile all sources, such as stdsoap2.cpp, soapC.cpp, soapClient.cpp, soapServer.cpp, and all application sources that include stdsoap2.h or soapH.h. If the macros are not consistently used, the application will crash due to a mismatches in the declaration and access of the gSOAP context.

9.12  Run Time Flags

gSOAP provides flags to control the input and output mode settings at runtime. These flags are divided into four categories: transport (IO), content encoding (ENC), XML marshalling (XML), and C/C++ data mapping (C).
Although gSOAP is fully SOAP 1.1 compliant, some SOAP implementations may have trouble accepting multi-reference data and/or require explicit nil data so these flags can be used to put gSOAP in "safe mode". In addition, the embedding (or inlining) of multi-reference data is adopted in the SOAP 1.2 specification, which gSOAP automatically supports when handling with SOAP 1.2 messages.
To set and clear flags for inbound message processing use:

soap_set_imode(soap, inflag);
soap_clr_imode(soap, inflag);

To set and clear the flags for outbound message processing use:

soap_set_omode(soap, outflag);
soap_clr_imode(soap, outflag);

To allocate and initialize a gSOAP context with inbound and outbound flags use:

soap_new2(soap, inflag, outflag);

To initialize an unitialized gSOAP context with inbound and outbound flags use:

soap_init2(soap, inflag, outflag);

The input-mode and output-mode flags for inbound and outbound message processing are:

Flag Description
SOAP_IO_FLUSH in: disable buffering and flush output (default for all file-based output)
SOAP_IO_BUFFER in: enable buffering (default for all socket-oriented connections)
SOAP_IO_STORE in: store entire message to calculate HTTP content length
SOAP_IO_CHUNK out: use HTTP chunking
SOAP_IO_LENGTH out: (internal flag) require apriori calculation of content length
SOAP_IO_KEEPALIVE in&out: attempt to keep socket connections alive (open)
SOAP_IO_UDP in&out: use UDP (datagram) transport, maximum message length is SOAP_BUFLEN
SOAP_ENC_XML out: use plain XML encoding without HTTP headers (useful with SOAP_ENC_ZLIB)
SOAP_ENC_DIME out: use DIME encoding (automatic when DIME attachments are used)
SOAP_ENC_MIME out: use MIME encoding (activate using soap_set_mime)
SOAP_ENC_MTOM out: use MTOM XOP attachments (instead of DIME)
SOAP_ENC_ZLIB out: compress encoding with Zlib (deflate or gzip format)
SOAP_ENC_SSL in&out: encrypt with SSL (automatic with "https:" endpoints)
SOAP_XML_INDENT out: produces indented XML output
SOAP_XML_CANONICAL out: produces canonical XML output
SOAP_XML_DEFAULTNS out: forces output of xmlns="..." default namespace declarations
SOAP_XML_IGNORENS in: ignores the use of XML namespaces in input
SOAP_XML_STRICT in: XML strict validation
SOAP_XML_TREE out: serialize data as XML trees (no multi-ref, duplicate data when necessary)
in: ignore id attributes (do not resolve id-ref)
SOAP_XML_GRAPH out: serialize data as an XML graph with inline multi-ref (SOAP 1.2 default)
SOAP_XML_NIL out: serialize NULL data as xsi:nil attributed elements
SOAP_XML_NOTYPE out: disable xsi:type attributes
SOAP_C_NOIOB in: do not fault with SOAP_IOB
SOAP_C_UTFSTRING in&out: (de)serialize 8-bit strings "as is" (strings MUST have UTF-8 encoded content)
SOAP_C_MBSTRING in&out: enable multibyte character support (depends on locale)
SOAP_C_NILSTRING out: serialize empty strings as nil (ommited element)

The flags can be selectively turned on/off at any time, for example when multiple Web services are accessed by a client that require special treatment.
All flags are orthogonal, except SOAP_IO_FLUSH, SOAP_IO_BUFFER, SOAP_IO_STORE, and SOAP_IO_CHUNK which are enumerations and only one of these I/O flags can be used. Also the XML serialization flags SOAP_XML_TREE and SOAP_XML_GRAPH should not be mixed.
The flags control the inbound and outbound message transport, encoding, and (de)serialization. The following functions are used to set and reset the flags for input and output modes:

Function Description
soap_init2(struct soap *soap, int imode, int omode) Initialize the runtime and set flags
soap_imode(struct soap *soap, int imode) Set all input mode flags
soap_omode(struct soap *soap, int omode) Set all output mode flags
soap_set_imode(struct soap *soap, int imode) Enable input mode flags
soap_set_omode(struct soap *soap, int omode) Enable output mode flags
soap_clr_imode(struct soap *soap, int omode) Disable input mode flags
soap_clr_omode(struct soap *soap, int omode) Disable output mode flags

The default setting is SOAP_IO_DEFAULT for both input and output modes.
For example

struct soap soap;
soap_init2(&soap, SOAP_IO_KEEPALIVE,
   SOAP_IO_KEEPALIVE | SOAP_ENC_ZLIB | SOAP_XML_TREE | SOAP_XML_CANONICAL);
if (soap_call_ns__myMethod(&soap, ...))
...

sends a compressed client request with keep-alive enabled and all data serialized as canonical XML trees.
In many cases, setting the input mode will have no effect, especially with HTTP transport because gSOAP will determine the optimal input buffering and the encoding used for an inbound message. The flags that have an effect on handling inbound messages are SOAP_IO_KEEPALIVE, SOAP_ENC_SSL (but automatic when "https:" endpoints are used or soap_ssl_accept), SOAP_C_NOIOB, SOAP_C_UTFSTRING, and SOAP_C_MBSTRING.
Caution: The SOAP_XML_TREE serialization flag can be used to improve interoperability with SOAP implementations that are not fully SOAP 1.1 compliant. However, a tree serialization will duplicate data when necessary and will crash the serializer for cyclic data structures.
Additional run-time flags to control sockets.
Use the following selection of flags that are OS dependent to control sockets for send/sendto/recv/recvfrom operations:


socket_flags Description
MSG_NOSIGNAL disables sigpipe (check your OS, this is not portable)
MSG_DONTROUTE bypass routing, use direct interface

Use the following selection of flags to set client-side socket connection flags (setsockopt):


connect_flags Description
SO_NOSIGPIPE disables sigpipe (check your OS, this is not portable)
SO_DEBUG turns on recording of debugging information in the underlying protocol modules
SO_BROADCAST permits sending of broadcast messages (e.g. with UDP) when permitted
SO_LINGER set soap.linger_time (set this value as needed)

Use the following selection of flags to set server-side socket connection accept flags (setsockopt):


accept_flags Description
SO_NOSIGPIPE disables sigpipe (check your OS, this is not portable)
SO_DEBUG turns on recording of debugging information in the underlying protocol modules
SO_REUSEADDR reuse bind address immediately (prevents bind reject)
SO_LINGER set soap.linger_time (set this value as needed)

For example, soap.accept_flags = (SO_NOSIGPIPE - SO_LINGER) disables sigpipe signals and set linger time value given by soap.linger_time (zero by default).

9.13  Memory Management

Understanding gSOAP's run-time memory management is important to optimize client and service applications by eliminating memory leaks and/or dangling references.
There are two forms of dynamic (heap) allocations made by gSOAP's runtime for serialization and deserialization of data. Temporary data is created by the runtime such as hash tables to keep pointer reference information for serialization and hash tables to keep XML id/href information for multi-reference object deserialization. Deserialized data is created upon receiving SOAP messages. This data is stored on the heap and requires several calls to the malloc library function to allocate space for the data and new to create class instances. All such allocations are tracked by gSOAP's runtime by linked lists for later deallocation. The linked list for malloc allocations uses some extra space in each malloced block to form a chain of pointers through the malloced blocks. A separate malloced linked list is used to keep track of class instance allocations.
If you want to preserve the deserialized data before deleting a soap context, you can assign management of the data and delegate responsibility of deletion to another soap context using soap_delegate_deletion(struct soap *soap_from, struct soap *soap_to). This moves all deserialized and temporary data to the other soap context soap_to, which will delete its data and all the delegated data it is responsible for when you call soap_destroy and soap_end. This can be particularly useful for making client calls inside a server operation, i.e. a mixed server/client. The client call inside the server operation requires a new soap context, e.g. copied from the server's with soap_copy. Before destroying the client context with soap_free, the data can be delegated to the server's context with soap_delegate_deletion. See samples/mashup/machupserver.c code for an example.
Note that gSOAP does not per se enforce a deallocation policy and the user can adopt a deallocation policy that works best for a particular application. As a consequence, deserialized data is never deallocated by the gSOAP runtime unless the user explicitly forces deallocation by calling functions to deallocate data collectively or individually.
The deallocation functions are:

Function Call Description
soap_destroy(struct soap *soap) Remove all dynamically allocated C++ objects.
must be called before soap_end()
soap_end(struct soap *soap) Remove temporary data and deserialized data except
class instances
soap_free_temp(struct soap *soap) Instead of soap_destroy and soap_end:
remove temporary data only
soap_dealloc(struct soap *soap, void *p) Remove malloced data at p. When p==NULL: remove all
dynamically allocated (deserialized) data except class instances
soap_delete(struct soap *soap, void *p) Remove class instance at p. When p==NULL: remove all
dynamically allocated (deserialized) class instances
(this is identical to calling soap_destroy(struct soap *soap))
soap_unlink(struct soap *soap, void *p) Unlink data/object at p from gSOAP's deallocation chain
so gSOAP won't deallocate it
soap_done(struct soap *soap) Detach context (reset runtime context)
soap_free(struct soap *soap) Detach and free context (allocated with soap_new)

Temporary data (i.e. the hash tables) are automatically removed with calls to the soap_free_temp function which is also made by soap_end and soap_done or when the next call to a stub or skeleton routine is made to send a message or receive a message. Deallocation of non-class based data is straightforward: soap_end removes all dynamically allocated deserialized data (data allocated with soap_malloc. That is, when the client/service application does not use any class instances that are (de)marshalled, but uses structs, arrays, etc., then calling the soap_end function is safe to remove all deserialized data. The function can be called after processing the deserialized data of a service operation call or after a number of service operation calls have been made. The function is also typically called after soap_serve, when the service finished sending the response to a client and the deserialized client request data can be removed.
Individual data objects can be unlinked from the deallocation chain if necessary, to prevent deallocation by the collective soap_end or soap_destroy functions.

9.13.1  Memory Allocation and Management Policies

There are three situations to consider for memory deallocation policies for class instances:
  1. the program code deletes the class instances and the class destructors in turn SHOULD delete and free any dynamically allocated data (deep deallocation) without calling the soap_end and soap_destroy functions,
  2. or the class destructors SHOULD NOT deallocate any data and the soap_end and soap_destroy functions can be called to remove the data.
  3. or the class destructors SHOULD mark their own deallocation and mark the deallocation of any other data deallocated by it's destructors by calling the soap_unlink function. This allows soap_destroy and soap_end to remove the remaining instances and data without causing duplicate deallocations.
It is advised to use pointers to class instances that are used within other structs and classes to avoid the creation of temporary class instances during deserialization. The problem with temporary class instances is that the destructor of the temporary may affect data used by other instances through the sharing of data parts accessed with pointers. Temporaries and even whole copies of class instances can be created when deserializing SOAP multi-referenced objects. A dynamic array of class instances is similar: temporaries may be created to fill the array upon deserialization. To avoid problems, use dynamic arrays of pointers to class instances. This also enables the exchange of polymorphic arrays when the elements are instances of classes in an inheritance hierarchy. In addition, allocate data and class instances with soap_malloc and soap_new_X functions (more details below).
To summarize, it is advised to pass class data types by pointer to a service operation. For example:

class X { ... };
ns__remoteMethod(X *in, ...);

Response elements that are class data types can be passed by reference, as in:

class X { ... };
class ns__remoteMethodResponse { ... };
ns__remoteMethod(X *in, ns__remoteMethodResponse &out);

But dynamic arrays declared as class data types should use a pointer to a valid object that will be overwritten when the function is called, as in:

typedef int xsd__int;
class X { ... };
class ArrayOfint { xsd__int *__ptr; int __size; };
ns__remoteMethod(X *in, ArrayOfint *out);

Or a reference to a valid or NULL pointer, as in:

typedef int xsd__int;
class X { ... };
class ArrayOfint { xsd__int *__ptr; int __size; };
ns__remoteMethod(X *in, ArrayOfint *&out);

The gSOAP memory allocation functions can be used in client and/or service code to allocate temporary data that will be automatically deallocated. These functions are:

Function Call Description
void *soap_malloc(struct soap *soap, size_t n) return pointer to n bytes
Class *soap_new_Class(struct soap *soap) instantiate Class
Class *soap_new_Class(struct soap *soap, int n) instantiate array of n objects
Class *soap_new_set_Class(struct soap *soap, m1, ..., mn) instantiate and set members mi
Class *soap_new_req_Class(struct soap *soap, m1, ..., mn) instantiate and set required-only mi

The soap_new_X functions are generated by the gSOAP soapcpp2 compiler for every class X in the header file.
Space allocated with soap_malloc will be released with the soap_end and soap_dealloc functions. All objects instantiated with soap_new_X(struct soap*) are removed altogether with soap_destroy(struct soap*). To remove just a single object, use soap_delete_X(struct soap*, X*).
For example, the following service uses temporary data in the service operation implementation:

int main()
{ ...
   struct soap soap;
   soap_init(&soap);
   soap_serve(&soap);
   soap_end(&soap);
   ...
}

An example service operation that allocates a temporary string is:

int ns__itoa(struct soap *soap, int i, char **a)
{
   *a = (char*)soap_malloc(soap, 11);
   sprintf(*a, "%d", i);
   return SOAP_OK;
}

This temporary allocation can also be used to allocate strings for the SOAP Fault data structure. For example:

int ns__mymethod(...)
{ ...
   if (exception)
   {
      char *msg = (char*)soap_malloc(soap, 1024); // allocate temporary space for detailed message
      sprintf(msg, "...", ...); // produce the detailed message
      return soap_receiver_fault(soap, "An exception occurred", msg); // return the server-side fault
   }
   ...
}

Use soap_receiver_fault(struct soap *soap, const char *faultstring, const char *detail) to set a SOAP 1.1/1.2 fault at the server-side. Use soap_sender_fault(struct soap *soap, const char *faultstring, const char *detail) to set a SOAP 1.1/1.2 unrecoverable Bad Request fault at the server-side. Sending clients are not supposed to retry messages after a Bad Request, while errors at the receiver-side indicate temporary problems.
The above functions do not include a SOAP 1.2 Subcode element. To include Subcode element, use soap_receiver_fault_subcode(struct soap *soap, const char *subcode, const char *faultstring, const char *detail) to set a SOAP 1.1/1.2 fault with Subcode at the server-side. Use soap_sender_fault_subcode(struct soap *soap, const char *subcode, const char *faultstring, const char *detail) to set a SOAP 1.1/1.2 unrecoverable Bad Request fault with Subcode at the server-side.
gSOAP provides a function to duplicate a string into gSOAP's memory space:

char *soap_strdup(struct soap *soap, const char *s)

The function allocates space for s with soap_malloc, copies the string, and returns a pointer to the duplicated string. When s is NULL, the function does not allocate and copy the string and returns NULL.

9.13.2  Intra-Class Memory Management

When a class declaration has a struct soap * field, this field will be set to point to the current gSOAP runtime context by gSOAP's deserializers and by the soap_new_Class functions. This simplifies memory management for class instances. The struct soap* pointer is implicitly set by the gSOAP deserializer for the class or explicitly by calling the soap_new_X function for class X. For example:

class Sample
{ public:
   struct soap *soap; // reference to gSOAP's run-time
   ...
   Sample();
   ~Sample();
};

The constructor and destructor for class Sample are:

Sample::Sample()
{ this->soap = NULL;
}
Sample::~Sample()
{ soap_unlink(this->soap, this);
}

The soap_unlink() call removes the object from gSOAP's deallocation chain. In that way, soap_destroy can be safely called to remove all class instances. The following code illustrates the explicit creation of a Sample object and cleanup:

struct soap *soap = soap_new(); // new gSOAP runtime
Sample *obj = soap_new_Sample(soap); // new Sample object with obj->soap set to runtime
...
delete obj; // also calls soap_unlink to remove obj from the deallocation chain
soap_destroy(soap); // deallocate all (other) class instances
soap_end(soap); // clean up

Here is another example:

class ns__myClass
{ ...
   struct soap *soap; // set by soap_new_ns__myClass()
   char *name;
   void setName(const char *s);
   ...
};

Calls to soap_new_ns__myClass(soap) will set the soap field in the class instance to the current gSOAP context. Because the deserializers invoke the soap_new functions, the soap field of the ns__myClass instances are set as well. This mechanism is convenient when Web Service methods need to return objects that are instantiated in the methods. For example

int ns__myMethod(struct soap *soap, ...)
{
   ns__myClass *p = soap_new_ns__myClass(soap);
   p->setName("SOAP");
   return SOAP_OK;
}
void ns__myClass::ns__setName(const char *s)
{
   if (soap)
      name = (char*)soap_malloc(soap, strlen(s)+1);
   else 
      name = (char*)malloc(strlen(s)+1);
   strcpy(name, s);
}
ns__myClass::ns__myClass()
{
   soap = NULL;
   name = NULL;
}
ns__myClass::~ns__myClass()
{
   if (!soap && name) free(name);
   soap_unlink(soap, this);
}

Calling soap_destroy right after soap_serve in the Web Service will destroy all dynamically allocated class instances.

9.14  Debugging

To activate debugging and message logging, set the #define DEBUG macro on the compiler's command line (typically as a compiler option -DDEBUG) or in stdsoap2.h, and recompile your code together with stdsoap2.c or stdsoap2.cpp (instead of libgsoap). When using libgsoap and libgsoap++, reinstall the software with \.configure using option -enable-debug.
When your client and server applications run, they will log their activity in three separate files:

File Description
SENT.log The SOAP content transmitted by the application
RECV.log The SOAP content received by the application
TEST.log A log containing various activities performed by the application

Caution: The client and server applications may run slow due to the logging activity.
Hint: Set macro DEBUG_STAMP instead of DEBUG to add time stamps to TEST.log. This works on platforms supporting the gettimeofday function.
Caution: When installing a CGI application on the Web with debugging activated, the log files may sometimes not be created due to file access permission restrictions imposed on CGI applications. To get around this, create empty log files with universal write permissions. Be careful about the security implication of this.
You can test a service CGI application without deploying it on the Web. To do this, create a client application for the service and activate message logging by this client. Remove any old SENT.log file and run the client (which connects to the Web service or to another dummy, but valid address) and copy the SENT.log file to another file, e.g. SENT.tst. Then redirect the SENT.tst file to the service CGI application. For example,

> ./myservice.cgi < SENT.tst

This should display the service response on the terminal.
The file names of the log files and the logging activity can be controlled at the application level. This allows the creation of separate log files by separate services, clients, and threads. For example, the following service logs all SOAP messages (but no debug messages) in separate directories:

struct soap soap;
soap_init(&soap);
...
soap_set_recv_logfile(&soap, "logs/recv/service12.log"); // append all messages received in /logs/recv/service12.log
soap_set_sent_logfile(&soap, "logs/sent/service12.log"); // append all messages sent in /logs/sent/service12.log
soap_set_test_logfile(&soap, NULL); // no file name: do not save debug messages
...
soap_serve(&soap);
...

Likewise, messages can be logged for individual client-side service operation calls.

9.15  Generating an Auto Test Server for Client Testing

The soapcpp2 -T option generates an auto-test server application in soapTester.cpp, which is to be compiled and linked with the code generated for a server implementation, i.e. soapServer.cpp (or with the generated server object class) and soapC.cpp. The feature also supports C, so use the soapcpp2 -c option to generate C.
The auto-test server can be used to test a client application. Suppose the generated code is compiled into the executable named tester (compile soapServer.cpp, soapC.cpp, and stdsoap2.cpp or link libgsoap++). We can use the IO redirect to "send" it a message saved in a file, for example one of the sample request messages generated by soapcpp2:

> ./tester < example.req.xml

which then returns the response with default XML values displayed on the terminal.
To run the auto test service on a port to test a client against, use two command-line arguments. The first argument is the OR-ed values of the gSOAP runtime context flags such as SOAP_IO_KEEPALIVE (0x10 = 16) and the second argument is the port number:

> ./tester 16 8080

This starts an iterative stand-alone server on port 8080. This way, messages can be sent to http://localhost:8080 to test the client. The data in the response messages are copied from the request messages when possible, or XML default values, or empty otherwise.

9.16  Generating Deep Copy and Deletion Code

The soapcpp2 -Ec option generates deep copy code for each type T:
T * soap_dup_T(struct soap*, T *dst, const T *src) deep copy src into dst, replicating all deep cycles and shared pointers when a managing soap context is provided as argument. When dst is NULL, allocates space for dst. Deep copy is a tree when argument is NULL, but the presence of deep cycles will lead to non-termination. Use flag SOAP_XML_TREE with managing context to copy into a tree without cycles and pointers to shared objects. Returns dst (or allocated space when dst is NULL).
For classes T, also a deep copy method is generated with option -Ec:
virtual T * T::soap_dup(struct soap*) const returns a duplicate of this object by deep copying, replicating all deep cycles and shared pointers when a managing soap context is provided as argument. Deep copy is a tree when argument is NULL, but the presence of deep cycles will lead to non-termination. Use flag SOAP_XML_TREE with managing context to copy into a tree without cycles and pointers to shared objects.
The soapcpp2 -Ed option generates deep deletion code for each type T:
void soap_del_T(const T*) deletes all heap-allocated members of this object by deep deletion ONLY IF this object and all of its (deep) members are not managed by a soap context AND the deep structure is a tree (no cycles and co-referenced objects by way of multiple (non-smart) pointers pointing to the same data). Can be safely used after soap_dup(NULL) to delete the deep copy. Does not delete the object itself.
For classes T, also a deep deletion method is generated with option -Ed:
virtual void T::soap_del() const deletes all heap-allocated members of this object by deep deletion ONLY IF this object and all of its (deep) members are not managed by a soap context AND the deep structure is a tree (no cycles and co-referenced objects by way of multiple (non-smart) pointers pointing to the same data).Can be safely used after soap_dup(NULL) to delete the deep copy. Does not delete the object itself.

9.17  Required Libraries

  • The socket library is essential and requires the inclusion of the appropriate libraries with the compile command for Sun Solaris systems:

    > c++ -o myclient myclient.cpp stdsoap2.cpp soapC.cpp soapClient.cpp -lsocket -lxnet -lnsl

    These library loading options are not required with Linux.
  • The gSOAP runtime uses the math library for the NaN, INF, and -INF floating point representations. The library is not strictly necessary and the < math.h > header file import can be commented out from the stdsoap2.h header file. The application can be linked without the -lm math library e.g. under Sun Solaris:

    > c++ -o myclient myclient.cpp stdsoap2.cpp soapC.cpp soapClient.cpp -lsocket -lxnet -lnsl

10  The gSOAP Service Operation Specification Format

A service operation is specified as a C/C++ function prototype in a header file. The function is REQUIRED to return int, which is used to represent a SOAP error code, see Section 10.2. Multiple service operations MAY be declared together in one header file.
The general format of a service operation specification is:

[int] [namespace_prefix__]method_name([inparam1, inparam2, ...,] outparam);

where
namespace_prefix__
is the optional namespace prefix of the method (see identifier translation rules 10.3)
method_name
it the service operation name (see identifier translation rules 10.3)
inparam
is the declaration of an input parameter of the service operation
outparam
is the declaration of the output parameter of the service operation
This simple form can only pass a single, non-struct and non-class type output parameter. See 10.1 for passing multiple output parameters. The name of the declared function namespace_prefix__ method_name must be unique and cannot match the name of a struct, class, or enum declared in the same header file.
The method request is encoded in SOAP as an XML element and the namespace prefix, method name, and input parameters are encoded using the format:

<[namespace-prefix:]method_name xsi:type="[namespace-prefix:]method_name>
<inparam-name1 xsi:type="...">...</inparam-name1>
<inparam-name2 xsi:type="...">...</inparam-name2>
...
</[namespace-prefix:]method_name>

where the inparam-name accessors are the element-name representations of the inparam parameter name declarations, see Section 10.3. (The optional parts are shown enclosed in [].)
The XML response by the Web service is of the form:

<[namespace-prefix:]method-nameResponse xsi:type="[namespace-prefix:]method-nameResponse>
<outparam-name xsi:type="...">...</outparam-name>
</[namespace-prefix:]method-nameResponse>

where the outparam-name accessor is the element-name representation of the outparam parameter name declaration, see Section 10.3. By convention, the response element name is the method name ending in Response. See 10.1 on how to change the declaration if the service response element name is different.
The gSOAP soapcpp2 tool generates a stub routine for the service operation. This stub is of the form:

int soap_call_[namespace_prefix__]method_name(struct soap *soap, char *URL, char *action, [inparam1, inparam2, ...,] outparam);

This proxy can be called by a client application to perform the service operation call.
The gSOAP soapcpp2 tool generates a skeleton routine for the service operation. The skeleton function is:

int soap_serve_[namespace_prefix__]method_name(struct soap *soap);

The skeleton routine, when called by a service application, will attempt to serve a request on the standard input. If no request is present or if the request does not match the method name, SOAP_NO_METHOD is returned. The skeleton routines are automatically called by the generated soap_serve routine that handles all requests.

10.1  Service Operation Parameter Passing

The input parameters of a service operation MUST be passed by value. Input parameters cannot be passed by reference with the & reference operator, but an input parameter value MAY be passed by a pointer to the data. Of course, passing a pointer to the data is preferred when the size of the data of the parameter is large. Also, to pass instances of (derived) classes, pointers to the instance need to be used to avoid passing the instance by value which requires a temporary and prohibits passing derived class instances. When two input parameter values are identical, passing them using a pointer has the advantage that the value will be encoded only once as multi-reference (hence, the parameters are aliases). When input parameters are passed using a pointer, the data pointed to will not be modified by the service operation and returned to the caller.
The output parameter MUST be passed by reference using & or by using a pointer. Arrays are passed by reference by default and do not require the use of the reference operator &.
The input and output parameter types have certain limitations, see Section 9.10
If the output parameter is a struct or class type, it is considered a service operation response element instead of a simple output parameter value. That is, the name of the struct or class is the name of the response element and the struct or class fields are the output parameters of the service operation, see also 7.1.7. Hence, if the output parameter has to be a struct or class, a response struct or class MUST be declared as well. In addition, if a service operation returns multiple output parameters, a response struct or class MUST be declared. By convention, the response element is the service operation name ending with "Response".
The general form of a response element declaration is:

struct [namespace_prefix__]response_element_name
{
   outparam1;
   outparam2;
   ...
};

where
namespace_prefix__
is the optional namespace prefix of the response element (see identifier translation rules 10.3)
response_element_name
it the name of the response element (see identifier translation rules 10.3)
outparam
is the declaration of an output parameter of the service operation
The general form of a service operation specification with a response element declaration for (multiple) output parameters is:

[int] [namespace_prefix__]method_name([inparam1, inparam2, ...,] struct [namespace_prefix__]response_element_name {outparam1[, outparam2, ...]} &anyparam);

The choice of name for anyparam has no effect on the SOAP encoding and decoding and is only used as a place holder for the response.
The method request is encoded in SOAP as an independent element and the namespace prefix, method name, and input parameters are encoded using the format:

<[namespace-prefix:]method-name xsi:type="[namespace-prefix:]method-name>
<inparam-name1 xsi:type="...">...</inparam-name1>
<inparam-name2 xsi:type="...">...</inparam-name2>
...
</[namespace-prefix:]method-name>

where the inparam-name accessors are the element-name representations of the inparam parameter name declarations, see Section 10.3. (The optional parts resulting from the specification are shown enclosed in [].)
The method response is expected to be of the form:

<[namespace-prefix:]response-element-name xsi:type="[namespace-prefix:]response-element-name>
<outparam-name1 xsi:type="...">...</outparam-name1>
<outparam-name2 xsi:type="...">...</outparam-name2>
...
</[namespace-prefix:]response-element-name>

where the outparam-name accessors are the element-name representations of the outparam parameter name declarations, see Section 10.3. (The optional parts resulting from the specification are shown enclosed in [].)
The input and/or output parameters can be made anonymous, which allows the deserialization of requests/responses with different parameter names as is endorsed by the SOAP 1.1 specification, see Section 7.1.13.

10.2  Error Codes

The error codes returned by the stub and skeleton routines are listed below.

Code Description
SOAP_OK No error
SOAP_CLI_FAULT* The service returned a client fault (SOAP 1.2 Sender fault)
SOAP_SVR_FAULT* The service returned a server fault (SOAP 1.2 Receiver fault)
SOAP_TAG_MISMATCH An XML element didn't correspond to anything expected
SOAP_TYPE An XML Schema type mismatch
SOAP_SYNTAX_ERROR An XML syntax error occurred on the input
SOAP_NO_TAG Begin of an element expected, but not found
SOAP_IOB Array index out of bounds
SOAP_MUSTUNDERSTAND* An element needs to be ignored that need to be understood
SOAP_NAMESPACE Namespace name mismatch (validation error)
SOAP_FATAL_ERROR Internal error
SOAP_USER_ERROR User error (reserved for soap.user usage
SOAP_FAULT An exception raised by the service
SOAP_NO_METHOD The dispatcher did not find a matching operation for a request
SOAP_NO_DATA No data in HTTP message
SOAP_GET_METHOD HTTP GET operation not handled, see Section 19.10
SOAP_EOM Out of memory
SOAP_MOE Memory overflow/corruption error (DEBUG mode)
SOAP_NULL An element was null, while it is not supposed to be null
SOAP_DUPLICATE_ID Element's ID duplicated (multi-ref encoding)
SOAP_MISSING_ID Element ID missing for an href/ref (multi-ref encoding)
SOAP_HREF Reference to object is incompatible with the object refered to
SOAP_UTF_ERROR An UTF-encoded message decoding error occured
SOAP_UDP_ERROR Message too large to store in UDP packet
SOAP_TCP_ERROR A connection error occured
SOAP_HTTP_ERROR An HTTP error occured
SOAP_NTLM_ERROR An NTLM authentication handshake error occured
SOAP_SSL_ERROR An SSL error occured
SOAP_ZLIB_ERROR A Zlib error occured
SOAP_PLUGIN_ERROR Failed to register plugin
SOAP_MIME_ERROR MIME parsing error
SOAP_MIME_HREF MIME attachment has no href from SOAP body error
SOAP_MIME_END End of MIME attachments protocol error
SOAP_DIME_ERROR DIME formatting error or DIME size exceeds SOAP_MAXDIMESIZE
SOAP_DIME_END End of DIME attachments protocol error
SOAP_DIME_HREF DIME attachment has no href from SOAP body
(and no DIME callbacks were defined to save the attachment)
SOAP_DIME_MISMATCH DIME version/transmission error
SOAP_VERSIONMISMATCH* SOAP version mismatch or no SOAP message
SOAP_DATAENCODINGUNKNOWN SOAP 1.2 DataEncodingUnknown fault
SOAP_REQUIRED Attributed required validation error
SOAP_PROHIBITED Attributed prohibited validation error
SOAP_OCCURS Element minOccurs/maxOccurs validation error
SOAP_LENGTH Element length validation error
SOAP_FD_EXCEEDED Too many open sockets
(for non-win32 systems not supporting poll())
SOAP_EOF Unexpected end of file, no input, or timeout receiving data
SOAP_ERR Error (for internal use)

The error codes that are returned by a stub routine (proxy) upon receiving a SOAP Fault from the server are marked (*). The remaining error codes are generated by the proxy itself as a result of problems with a SOAP payload. The error code is SOAP_OK when the service operation call was successful (the SOAP_OK predefined constant is guaranteed to be 0). The error code is also stored in soap.error, where soap is a variable that contains the current runtime context. The function soap_print_fault(struct soap *soap, FILE *fd) can be called to display an error message on fd where current value of the soap.error variable is used by the function to display the error. The function soap_print_fault_location(struct soap *soap, FILE *fd) prints the location of the error if the error is a result from parsing XML. Use soap_sprint_fault(struct soap*, char *buf, size_t len) to print the error to a string.
A service operation implemented in a SOAP service MUST return an error code as the function's return value. SOAP_OK denotes success and SOAP_FAULT denotes an exception. The exception details can be assigned with the soap_receiver_fault(struct soap *soap, const char *faultstring, const char *detail) which sets the strings soap.fault->faultstring and soap.fault->detail for SOAP 1.1, and soap.fault->SOAP_ENV__Reason and soap.fault->SOAP_ENV__Detail for SOAP 1.2, where soap is a variable that contains the current runtime context, see Section 12. A receiver error indicates that the service can't handle the request, but can possibly recover from the error. To return an unrecoverable SOAP 1.1/1.2 error, use soap_sender_fault(struct soap *soap, const char *faultstring, const char *detail).
To return a HTTP error code a service method can simply return the HTTP error code number. For example, return 404; returns a "404 Not Found" HTTP error back to the client. The soap.error is set to the HTTP error code at the client side. The HTTP 1.1 error codes are:

# Error
201 Created
202 Accepted
203 Non-Authoritative Information
204 No Content
205 Reset Content
206 Partial Content
300 Multiple Choices
301 Moved Permanently
302 Found
303 See Other
304 Not Modified
305 Use Proxy
307 Temporary Redirect
400 Bad Request
401 Unauthorized
402 Payment Required
403 Forbidden
404 Not Found
405 Method Not Allowed
406 Not Acceptable
407 Proxy Authentication Required
408 Request Time-out
409 Conflict
410 Gone
411 Length Required
412 Precondition Failed
413 Request Entity Too Large
414 Request-URI Too Large
415 Unsupported Media Type
416 Requested range not satisfiable
417 Expectation Failed
500 Internal Server Error
501 Not Implemented
502 Bad Gateway
503 Service Unavailable
504 Gateway Time-out
505 HTTP Version not supported

The error codes are given for informational purposes only. The HTTP protocol requires the proper actions after an error is issued. gSOAP's HTTP 1.0/1.1 handling is automatic.

10.3  C/C++ Identifier Name to XML Tag Name Mapping

One of the "secrets" behind the power and flexibility of gSOAP's encoding and decoding of service operation names, class names, type identifiers, and struct or class fields is the ability to specify namespace prefixes with these names that are used to denote their encoding style. More specifically, a C/C++ identifier name of the form

[namespace_prefix__]element_name

where the prefix and the element name are separated by double underscores will be encoded in XML as

<[namespace-prefix:]element-name ...>

The underscore pair (__) separates the namespace prefix from the element name. Each namespace prefix has a namespace URI specified by a namespace mapping table 10.4, see also Section 7.1.2. The namespace URI is a unique identification that can be associated with the service operations and data types. The namespace URI disambiguates potentially identical service operation names and data type names used by disparate organizations.
XML element names are NCNames (restricted strings) that MAY contain hyphens, dots, and underscores. The special characters in the XML element names of service operations, structs, classes, typedefs, and fields can be controlled using the following conventions: A single underscore in a namespace prefix or identifier name is replaced by a hyphen (-) in the XML element name. For example, the identifier name SOAP_ENC__ur_type is represented in XML as SOAP-ENC:ur-type. The sequence _DOT is replaced by a dot (.), and the sequence _USCORE is replaced by an underscore (_) in the corresponding XML element name. For example:

class n_s__biz_DOTcom
{
   char *n_s__biz_USCOREname;
};

is encoded in XML as:

<n-s:biz.com xsi:type="n-s:biz.com">
   <n-s:biz_name xsi:type="string">Bizybiz</n-s:biz_name>
</n-s:biz.com>

Trailing underscores of an identifier name are not translated into the XML representation. This is useful when an identifier name clashes with a C++ keyword. For example, return is often used as an accessor name in a SOAP response element. The return element can be specified as return_ in the C++ source code. Note that XML should be treated as case sensitive, so the use of e.g. Return may not always work to avoid a name clash with the return keyword. The use of trailing underscores also allows for defining structs and classes with essentially the same XML Schema type name, but that have to be distinguished as seperate C/C++ types.
For decoding, the underscores in identifier names act as wildcards. An XML element is parsed and matches the name of an identifier if the name is identical to the element name (case insensitive) and the underscores in the identifier name are allowed to match any character in the element name. For example, the identifier name I_want__soap_fun_the_bea___DOTcom matches the element name I-want:SOAP4fun@the-beach.com.
By default, soapcpp2 generates data bindings in which all XML elements are and attributes are unqualified:

//gsoap x schema namespace: urn:x
struct x__record
{
   @char * type;
   char * name;
};

where the name element and the type attribute are unqualified in the XML content (for example to facilitate SOAP RPC encoding).
The rules for SOAP services that are document style are different:

//gsoap x schema namespace: urn:x
//gsoap x service style: document
struct x__record
{
   @char * type;
   char * name;
};

where x is associated with a service. For document style all elements are qualified and attributes are unqualified.
To force qualification of elements and attributes, use the "form" directive:

//gsoap x schema namespace: urn:x
//gsoap x schema form: qualified
struct x__record
{
   @char * type;
   char * name;
};

You can also use "elementForm" and "attributeForm" directives to (un)qualify element and attributes of the schema, respectively.
Because the soapcpp2-generated serializers follow the qualified/unqualified forms of the schemas, there is normally no need to explicitly qualify struct/class members because automatic encoding rules will be used.
If explicit qualification is needed, this can be done using the prefix convention:

//gsoap x schema namespace: urn:x
//gsoap y schema namespace: urn:y
struct x__record
{
   @char * xsi__type;
   char * y__name;
};

which ensures that there cannot be any name clashes between members of the same name defined in different schemas (consider for example name and y__name), but this can clutter the representation when clashes do not occur.
An alternative to the prefix convention is the use of "colon notation" in the gSOAP header file. This deviation from the C/C++ syntax allows you to bind type names and struct and class members to qualified and unqualified XML tag names explicitly, thus bypassing the default mechanism that automatically qualifies or unqualifies element and attribute tag names based on the schema element/attribute form.
The colon notation for type names, struct/class names and members overrides the prefix qualification rules explicitly:

//gsoap x schema namespace: urn:x
//gsoap y schema namespace: urn:y
struct x:record
{
   @char * xsi:type;
   char * y:name;
};

where x and y are namespace prefixes that MUST be declared with a directive. The xsi:type member is an XML attribute in the xsi namespace. The soapcpp2 tool maps this to the following struct without the annotations:

// This code is generated from the above by soapcpp2 in soapStub.h:
struct record
{
   char *type; /* optional attribute of type xsd:string */
   char *name; /* optional element of type xsd:string */
};

The soapcpp2 tool also generates XML schemas with element and attribute references. That is, y:name is referenced from the y schema by the x:record complexType defined in the x schema.
The colon notation also allows you to override the element/attribute form to unqualified for qualified schemas:

//gsoap x schema namespace: urn:x
//gsoap x schema form: qualified
struct x:record
{
   @char * :type;
   char * :name;
};

where the colon notation ensures that both type and name are unqualified in the XML content, which overrides the default qualified forms of the x schema.
Note that the use of colon notation to bind namespace prefixes to type names (typedef, enum, struct, and class names) translates to code without the prefixes. This means that name clashes can occur between types with identical unquaified names:

enum x:color { RED, WHITE, BLUE };
enum y:color { YELLOW, ORANGE }; // illegal enum name: name clash with x:color

while prefixing with double underscores never lead to clashes:

enum x__color { RED, WHITE, BLUE };
enum y__color { YELLOW, ORANGE }; // no name clash

Also note that colon notation has a very different role than the C++ scope operator ::. The scope operator cannot be used in places where we need colon notation, such as struct/class member fields.
The default mechanism that associates XML tag names with the names of struct and class member fields can be overriden by "retagging" names with the annotation of `tag` placed next to the member field name. This is particularly useful to support legacy code for which the fixed naming of member fields cannot be easily changed. For example:

//gsoap x schema namespace: urn:x
//gsoap x schema form: qualified
struct x:record
{
   @char * t`type`;
   char * s`full-name`;
};

This maps the t member to the x:type XML attribute tag and s member to the x:full-name XML element tag. Note that both tags are namespace qualified as per schema declaration.
As of gSOAP 2.8.23, Unicode characters in C/C++ identifiers are accepted by soapcpp2 when the source file is encoded in UTF8. C/C++ Unicode names are mapped to Unicode XML tags. For C/C++ source code portability reasons, the wsdl2h tool still converts Unicode XML tag names to ASCII C/C++ identifiers using the _xHHHH naming convention for HHHH character code points. Option wsdl2h -U maps Unicode letters in XML tag names to UTF8-encoded Unicode letters in C/C++ identifiers.

10.4  Namespace Mapping Table

A namespace mapping table MUST be defined by clients and service applications. The mapping table is used by the serializers and deserializers of the stub and skeleton routines to produce a valid SOAP payload and to validate an incoming SOAP payload. A typical mapping table is shown below:

struct Namespace namespaces[] =
{   // {"ns-prefix", "ns-name"}
   {"SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/"}, // MUST be first
   {"SOAP-ENC", "http://schemas.xmlsoap.org/soap/encoding/"}, // MUST be second
   {"xsi", "http://www.w3.org/2001/XMLSchema-instance"}, // MUST be third
   {"xsd", "http://www.w3.org/2001/XMLSchema"}, // Required for XML Schema types
   {"ns1", "urn:my-service-URI"}, // The namespace URI of the service operations
   {NULL, NULL} // end of table
};

Each namespace prefix used by a identifier name in the header file specification (see Section 10.3) MUST have a binding to a namespace URI in the mapping table. The end of the namespace mapping table MUST be indicated by the NULL pair. The namespace URI matching is case insensitive. A namespace prefix is distinguished by the occurrence of a pair of underscores (__) in an identifier.
An optional namespace pattern MAY be provided with each namespace mapping table entry. The patterns provide an alternative namespace matching for the validation of decoded SOAP messages. In this pattern, dashes (-) are single-character wildcards and asterisks (*) are multi-character wildcards. For example, to decode different versions of XML Schema type with different authoring dates, four dashes can be used in place of the specific dates in the namespace mapping table pattern:

struct Namespace namespaces[] =
{   // {"ns-prefix", "ns-name", "ns-name validation pattern"}
...
   {"xsi", "http://www.w3.org/2001/XMLSchema-instance", "http://www.w3.org/----/XMLSchema-instance"},
   {"xsd", "http://www.w3.org/2001/XMLSchema", "http://www.w3.org/----/XMLSchema"},
...

Or alternatively, asterisks can be used as wildcards for multiple characters:

struct Namespace namespaces[] =
{   // {"ns-prefix", "ns-name", "ns-name validation pattern"}
...
   {"xsi", "http://www.w3.org/2001/XMLSchema-instance", "http://www.w3.org/*/XMLSchema-instance"},
   {"xsd", "http://www.w3.org/2001/XMLSchema", "http://www.w3.org/*/XMLSchema"},
...

A namespace mapping table is automatically generated together with a WSDL file for each namespace prefix that is used for a service operation specified in the header file. This namespace mapping table has entries for all namespace prefixes. The namespace URIs need to be filled in. These appear as http://tempuri.org in the table. See Section 19.2 on how to specify the namespace URIs in the header file.
For decoding elements with namespace prefixes, the namespace URI associated with the namespace prefix (through the xmlns attribute of an XML element) is searched from the beginning to the end in a namespace mapping table, and for every row the following tests are performed as part of the validation process:
  1. the string in the second column matches the namespace URI (case insensitive)
  2. the string in the optional third column matches the namespace URI (case insensitive), where - is a one-character wildcard and * is a multi-character wildcard
When a match is found, the namespace prefix in the first column of the table is considered semantically identical to the namespace prefix used by the XML element to be decoded, though the prefix names may differ. A service will respond with the namespace that it received from a client in case it matches a pattern in the third column.
For example, let's say we have the following structs:

struct a__elt { ... };
struct b__elt { ... };
struct k__elt { ... };

and a namespace mapping table in the program:

struct Namespace namespaces[] =
{   // {"ns-prefix", "ns-name", "ns-name validation pattern"}
...
   {"a", "some uri"},
   {"b", "other uri"},
   {"c", "his uri", "* uri"},
...

Then, the following XML elements will match the structs:

<n:elt xmlns:n="some URI">       matches the struct name a__elt
...
<m:elt xmlns:m="other URI">       matches the struct name b__elt
...
<k:elt xmlns:k="my URI">       matches the struct name c__elt
...

The response of a service to a client request that uses the namespaces listed above, will include my URI for the name space of element k.
It is possible to use a number of different namespace tables and select the one that is appropriate. For example, an application might contact many different Web services all using different namespace URIs. If all the URIs are stored in one table, each service operation invocation will dump the whole namespace table in the SOAP payload. There is no technical problem with that, but it can be ugly when the table is large. To use different namespace tables, declare a pointer to a table and set the pointer to a particular table before service operation invocation. For example:

struct Namespace namespacesTable1[] = { ... };
struct Namespace namespacesTable2[] = { ... };
struct Namespace namespacesTable3[] = { ... };
struct Namespace *namespaces;
...
struct soap soap;
...
soap_init(&soap);
soap_set_namespaces(&soap, namespaceTable1);
soap_call_remote_method(&soap, URL, Action, ...);
...

11  gSOAP Serialization and Deserialization Rules

This section describes the serialization and deserialization of C and C++ data types for SOAP 1.1 and 1.2 compliant encoding and decoding.

11.1  SOAP RPC Encoding Versus Document/Literal and xsi:type Info

The wsdl2h tool automatically generates a header file specialized for SOAP RPC encoding or document/literal style. The serialization and deserialization rules for C/C++ objects is almost identical for these styles, except for the following important issues.
With SOAP RPC encoding style, care must be taken to ensure typed messages are produced for interoperability and compatibility reasons. To ensure that the gSOAP engine automatically generates typed (xsi:type attributed) messages, use soapcpp2 option -t, see also Section 9.1. While gSOAP can handle untyped messages, some toolkits fail to find deserializers when the xsi:type information is absent.
When starting the development of a gSOAP application from a header file, the soapcpp2 compiler will generate WSDL and schema files for SOAP 1.1 document/literal style by default (use the //gsoap directives to control this, see Section 19.2). Use soapcpp2 options -2, -e, and -t to generate code for SOAP 1.2, RPC encoding, and typed messages.
With SOAP RPC encoding, generic complexTypes with maxOccurs="unbounded" are not allowed and SOAP encoded arrays must be used. Also XML attributes and unions (XML schema choice) are not allowed with SOAP RPC encoding.
Also with SOAP RPC encoding, multi-reference accessors are common to encode co-referenced objects and object digraphs. Multi-reference encoding is not supported in document/literal style, which means that cyclic object digraphs cannot be serialized (the engine will crash). Also DAGs are represented as XML trees in document/literal style messaging.

11.2  Primitive Type Encoding

The default encoding rules for the primitive C and C++ data types are given in the table below:

Type XSD Type
bool boolean
char* (C string) string
char byte
long double decimal (with #import "custom/long_double.h")
double double
float float
int int
long long
LONG64 long
long long long
short short
time_t dateTime
struct tm dateTime (with #import "custom/struct_tm.h")
unsigned char unsignedByte
unsigned int unsignedInt
unsigned long unsignedLong
ULONG64 unsignedLong
unsigned long long unsignedLong
unsigned short unsignedShort
wchar_t* string

Objects of type void and void* cannot be encoded. Enumerations and bit masks are supported as well, see 11.4.

11.3  How to Represent Primitive C/C++ Types as XSD Types

By default, encoding of the primitive types will take place as per SOAP encoding style. The encoding can be changed to any XML Schema type (XSD type) with an optional namespace prefix by using a typedef in the header file input to the gSOAP soapcpp2 tool. The declaration enables the implementation of built-in XML Schema types (also known as XSD types) such as positiveInteger, xsd:anyURI, and xsd:date for which no built-in data structures in C and C++ exist but which can be represented using standard data structures such as strings, integers, and floats.
The typedef declaration is frequently used for convenience in C. A typedef declares a type name for a (complex) type expression. The type name can then be used in other declarations in place of the more complex type expression, which often improves the readability of the program code.
The gSOAP soapcpp2 compiler interprets typedef declarations the same way as a regular C compiler interprets them, i.e. as types in declarations. In addition however, the gSOAP soapcpp2 compiler will also use the type name in the encoding of the data in SOAP. The typedef name will appear as the XML element name of an independent element and as the value of the xsi:type attribute in the SOAP payload.
Many built-in primitive and derived XSD types such as xsd:anyURI, positiveInteger, and decimal can be stored by standard primitive data structures in C++, such as strings, integers, floats, and doubles. To serialize strings, integers, floats, and doubles as built-in primitive and derived XSD types, a typedef declaration can be used to declare an XSD type.
For example, the declaration

typedef unsigned int xsd__positiveInteger;

creates a named type positiveInteger which is represented by unsigned int in C++. For example, the encoding of a positiveInteger value 3 is

<positiveInteger xsi:type="xsd:positiveInteger">3</positiveInteger>

The built-in XML Schema datatype hierarchy from the XML Schema Part 2 documentation http://www.w3.org/TR/xmlschema-2 is depicted below.
Figure 1: Built-in Datatype Hierarchy
The built-in primitive and derived numerical XML Schema types are listed below together with their recommended typedef declarations. Note that the SOAP encoding schemas for primitive types are derived from the built-in XML Schema types, so SOAP_ENC__ can be used as a namespace prefix instead of xsd__.
xsd:anyURI
Represents a Uniform Resource Identifier Reference (URI). Each URI scheme imposes specialized syntax rules for URIs in that scheme, including restrictions on the syntax of allowed fragment identifiers. It is recommended to use strings to store xsd:anyURI XML Schema types. The recommended type declaration is:

typedef char *xsd__anyURI;

xsd:base64Binary
Represents Base64-encoded arbitrary binary data. For using the xsd:base64Binary XSD Schema type, the use of the base64Binary representation of a dynamic array is strongly recommended, see Section 11.12. However, the type can also be declared as a string and the encoding will be string-based:

typedef char *xsd__base64Binary;

With this approach, it is the responsibility of the application to make sure the string content is according to the Base64 Content-Transfer-Encoding defined in Section 6.8 of RFC 2045.
xsd:boolean
For declaring an xsd:boolean XSD Schema type, the use of a bool is strongly recommended. If a pure C compiler is used that does not support the bool type, see Section 11.4.5. The corresponding type declaration is:

typedef bool xsd__boolean;

Type xsd__boolean declares a Boolean (0 or 1), which is encoded as

<xsd:boolean xsi:type="xsd:boolean">...</xsd:boolean>

xsd:byte
Represents a byte (-128...127). The corresponding type declaration is:

typedef char xsd__byte;

Type xsd__byte declares a byte which is encoded as

<xsd:byte xsi:type="xsd:byte">...</xsd:byte>

xsd:dateTime
Represents a date and time. The lexical representation is according to the ISO 8601 extended format CCYY-MM-DDThh:mm:ss where "CC" represents the century, "YY" the year, "MM" the month and "DD" the day, preceded by an optional leading "-" sign to indicate a negative number. If the sign is omitted, "+" is assumed. The letter "T" is the date/time separator and "hh", "mm", "ss" represent hour, minute and second respectively. It is recommended to use the time_t type to store xsd:dateTime XSD Schema types and the type declaration is:

typedef time_t xsd__dateTime;

However, note that calendar times before the year 1902 or after the year 2037 cannot be represented. Upon receiving a date outside this range, the time_t value will be set to -1.
Strings (char*) can be used to store xsd:dateTime XSD Schema types. The type declaration is:

typedef char *xsd__dateTime;

In this case, it is up to the application to read and set the dateTime representation.
xsd:date
Represents a date. The lexical representation for date is the reduced (right truncated) lexical representation for dateTime: CCYY-MM-DD. It is recommended to use strings (char*) to store xsd:date XSD Schema types. The type declaration is:

typedef char *xsd__date;

xsd:decimal
Represents arbitrary precision decimal numbers. It is recommended to use the double type to store xsd:decimal XSD Schema types and the type declaration is:

typedef double xsd__decimal;

Type xsd__decimal declares a double floating point number which is encoded as

<xsd:double xsi:type="xsd:decimal">...</xsd:double>

xsd:double
Corresponds to the IEEE double-precision 64-bit floating point type. The type declaration is:

typedef double xsd__double;

Type xsd__double declares a double floating point number which is encoded as

<xsd:double xsi:type="xsd:double">...</xsd:double>

xsd:duration
Represents a duration of time. The lexical representation for duration is the ISO 8601 extended format PnYn MnDTnH nMnS, where nY represents the number of years, nM the number of months, nD the number of days, T is the date/time separator, nH the number of hours, nM the number of minutes and nS the number of seconds. The number of seconds can include decimal digits to arbitrary precision. It is recommended to use strings (char*) to store xsd:duration XSD Schema types. The type declaration is:

typedef char *xsd__duration;

xsd:float
Corresponds to the IEEE single-precision 32-bit floating point type. The type declaration is:

typedef float xsd__float;

Type xsd__float declares a floating point number which is encoded as

<xsd:float xsi:type="xsd:float">...</xsd:float>

xsd:hexBinary
Represents arbitrary hex-encoded binary data. It has a lexical representation where each binary octet is encoded as a character tuple, consisting of two hexadecimal digits ([0-9a-fA-F]) representing the octet code. For example, "0FB7" is a hex encoding for the 16-bit integer 4023 (binary representation is 111110110111. For using the xsd:hexBinary XSD Schema type, the use of the hexBinary representation of a dynamic array is strongly recommended, see Section 11.13. However, the type can also be declared as a string and the encoding will be string-based:

typedef char *xsd__hexBinary;

With this approach, it is solely the responsibility of the application to make sure the string content consists of a sequence of octets.
xsd:int
Corresponds to a 32-bit integer in the range -2147483648 to 2147483647. If the C++ compiler supports 32-bit int types, the type declaration can use the int type:

typedef int xsd__int;

Otherwise, the C++ compiler supports 16-bit int types and the type declaration should use the long type:

typedef long xsd__int;

Type xsd__int declares a 32-bit integer which is encoded as

<xsd:int xsi:type="xsd:int">...</xsd:int>

xsd:integer
Corresponds to an unbounded integer. Since C++ does not support unbounded integers as a standard feature, the recommended type declaration is:

typedef long long xsd__integer;

Type xsd__integer declares a 64-bit integer which is encoded as an unbounded xsd:integer:

<xsd:integer xsi:type="xsd:integer">...</xsd:integer>

Another possibility is to use strings to represent unbounded integers and do the translation in code.
xsd:long
Corresponds to a 64-bit integer in the range -9223372036854775808 to 9223372036854775807. The type declaration is:

typedef long long xsd__long;

Or in Visual C++:

typedef LONG64 xsd__long;

Type xsd__long declares a 64-bit integer which is encoded as

<xsd:long xsi:type="xsd:long">...</xsd:long>

xsd:negativeInteger
Corresponds to a negative unbounded integer ( < 0). Since C++ does not support unbounded integers as a standard feature, the recommended type declaration is:

typedef long long xsd__negativeInteger;

Type xsd__negativeInteger declares a 64-bit integer which is encoded as a xsd:negativeInteger:

<xsd:negativeInteger xsi:type="xsd:negativeInteger">...</xsd:negativeInteger>

Another possibility is to use strings to represent unbounded integers and do the translation in code.
xsd:nonNegativeInteger
Corresponds to a non-negative unbounded integer ( > 0). Since C++ does not support unbounded integers as a standard feature, the recommended type declaration is:

typedef unsigned long long xsd__nonNegativeInteger;

Type xsd__nonNegativeInteger declares a 64-bit unsigned integer which is encoded as a non-negative unbounded xsd:nonNegativeInteger:

<xsd:nonNegativeInteger xsi:type="xsd:nonNegativeInteger">...</xsd:nonNegativeInteger>

Another possibility is to use strings to represent unbounded integers and do the translation in code.
xsd:nonPositiveInteger
Corresponds to a non-positive unbounded integer ( ≤ 0). Since C++ does not support unbounded integers as a standard feature, the recommended type declaration is:

typedef long long xsd__nonPositiveInteger;

Type xsd__nonPositiveInteger declares a 64-bit integer which is encoded as a xsd:nonPositiveInteger:

<xsd:nonPositiveInteger xsi:type="xsd:nonPositiveInteger">...</xsd:nonPositiveInteger>

Another possibility is to use strings to represent unbounded integers and do the translation in code.
xsd:normalizedString
Represents normalized character strings. Normalized character strings do not contain the carriage return (#xD), line feed (#xA) nor tab (#x9) characters. It is recommended to use strings to store xsd:normalizeString XSD Schema types. The type declaration is:

typedef char *xsd__normalizedString;

Type xsd__normalizedString declares a string type which is encoded as

<xsd:normalizedString xsi:type="xsd:normalizedString">...</xsd:normalizedString>

It is solely the responsibility of the application to make sure the strings do not contain carriage return (#xD), line feed (#xA) and tab (#x9) characters.
xsd:positiveInteger
Corresponds to a positive unbounded integer ( ≥ 0). Since C++ does not support unbounded integers as a standard feature, the recommended type declaration is:

typedef unsigned long long xsd__positiveInteger;

Type xsd__positiveInteger declares a 64-bit unsigned integer which is encoded as a xsd:positiveInteger:

<xsd:positiveInteger xsi:type="xsd:positiveInteger">...</xsd:positiveInteger>

Another possibility is to use strings to represent unbounded integers and do the translation in code.
xsd:short
Corresponds to a 16-bit integer in the range -32768 to 32767. The type declaration is:

typedef short xsd__short;

Type xsd__short declares a short 16-bit integer which is encoded as

<xsd:short xsi:type="xsd:short">...</xsd:short>

xsd:string
Represents character strings. The type declaration is:

typedef char *xsd__string;

Type xsd__string declares a string type which is encoded as

<xsd:string xsi:type="xsd:string">...</xsd:string>

The type declaration for wide character strings is:

typedef wchar_t *xsd__string;

Both type of strings can be used at the same time, but requires one typedef name to be changed by appending an underscore which is invisible in XML. For example:

typedef wchar_t *xsd__string_;

xsd:time
Represents a time. The lexical representation for time is the left truncated lexical representation for dateTime: hh:mm:ss.sss with optional following time zone indicator. It is recommended to use strings (char*) to store xsd:time XSD Schema types. The type declaration is:

typedef char *xsd__time;

xsd:token
Represents tokenized strings. Tokens are strings that do not contain the line feed (#xA) nor tab (#x9) characters, that have no leading or trailing spaces (#x20) and that have no internal sequences of two or more spaces. It is recommended to use strings to store xsd:token XSD Schema types. The type declaration is:

typedef char *xsd__token;

Type xsd__token declares a string type which is encoded as

<xsd:token xsi:type="xsd:token">...</xsd:token>

It is solely the responsibility of the application to make sure the strings do not contain the line feed (#xA) nor tab (#x9) characters, that have no leading or trailing spaces (#x20) and that have no internal sequences of two or more spaces.
xsd:unsignedByte
Corresponds to an 8-bit unsigned integer in the range 0 to 255. The type declaration is:

typedef unsigned char xsd__unsignedByte;

Type xsd__unsignedByte declares a unsigned 8-bit integer which is encoded as

<xsd:unsignedByte xsi:type="xsd:unsignedByte">...</xsd:unsignedByte>

xsd:unsignedInt
Corresponds to a 32-bit unsigned integer in the range 0 to 4294967295. If the C++ compiler supports 32-bit int types, the type declaration can use the int type:

typedef unsigned int xsd__unsignedInt;

Otherwise, the C++ compiler supports 16-bit int types and the type declaration should use the long type:

typedef unsigned long xsd__unsignedInt;

Type xsd__unsignedInt declares an unsigned 32-bit integer which is encoded as

<xsd:unsignedInt xsi:type="xsd:unsignedInt">...</xsd:unsignedInt>

xsd:unsignedLong
Corresponds to a 64-bit unsigned integer in the range 0 to 18446744073709551615. The type declaration is:

typedef unsigned long long xsd__unsignedLong;

Or in Visual C++:

typedef ULONG64 xsd__unsignedLong;

Type xsd__unsignedLong declares an unsigned 64-bit integer which is encoded as

<xsd:unsignedLong xsi:type="xsd:unsignedLong">...</xsd:unsignedLong>

xsd:unsignedShort
Corresponds to a 16-bit unsigned integer in the range 0 to 65535. The type declaration is:

typedef unsigned short xsd__unsignedShort;

Type xsd__unsginedShort declares an unsigned short 16-bit integer which is encoded as

<xsd:unsignedShort xsi:type="xsd:unsignedShort">...</xsd:unsignedShort>

Other XSD Schema types such as gYearMonth, gYear, gMonthDay, gDay, xsd:gMonth, QName, NOTATION, etc., can be encoded similarly using a typedef declaration.

11.3.1  How to Use Multiple C/C++ Types for a Single Primitive XSD Type

Trailing underscores (see Section 10.3) can be used in the type name in a typedef to enable the declaration of multiple storage formats for a single XML Schema type. For example, one part of a C/C++ application's data structure may use plain strings while another part may use wide character strings. To enable this simultaneous use, declare:

typedef char *xsd__string;
typedef wchar_t *xsd__string_;

Now, the xsd__string and xsd__string_ types will both be encoded and decoded as XML string types and the use of trailing underscores allows multiple declarations for a single XML Schema type.

11.3.2  How to use C++ Wrapper Classes to Specify Polymorphic Primitive Types

SOAP 1.1 supports polymorphic types, because XSD Schema types form a hierarchy. The root of the hierarchy is called xsd:anyType (xsd:ur-type in the older 1999 schema). So, for example, an array of xsd:anyType in SOAP may actually contain any mix of element types that are the derived types of the root type. The use of polymorphic types is indicated by the WSDL and schema descriptions of a Web service and can therefore be predicted/expected for each particular case.
On the one hand, the typedef construct provides a convenient way to associate C/C++ types with XML Schema types and makes it easy to incorporate these types in a (legacy) C/C++ application. However, on the other hand the typedef declarations cannot be used to support polymorphic XML Schema types. Most SOAP clients and services do not use polymorphic types. In case they do, the primitive polymorphic types can be declared as a hierarchy of C++ classes that can be used simultaneously with the typedef declarations.
The general form of a primitive type declaration that is derived from a super type is:

class xsd__type_name: [public xsd__super_type_name]
{ public: Type __item;
   [public:] [private] [protected:]
   method1;
   method2;
   ...
};

where Type is a primitive C type. The __item field MUST be the first field in this wrapper class.
For example, the XML Schema type hierarchy can be copied to C++ with the following declarations:

class xsd__anyType { };
class xsd__anySimpleType: public xsd__anyType { };
typedef char *xsd__anyURI;
class xsd__anyURI_: public xsd__anySimpleType { public: xsd__anyURI __item; };
typedef bool xsd__boolean;
class xsd__boolean_: public xsd__anySimpleType { public: xsd__boolean __item; };
typedef char *xsd__date;
class xsd__date_: public xsd__anySimpleType { public: xsd__date __item; };
typedef time_t xsd__dateTime;
class xsd__dateTime_: public xsd__anySimpleType { public: xsd__dateTime __item; };
typedef double xsd__double;
class xsd__double_: public xsd__anySimpleType { public: xsd__double __item; };
typedef char *xsd__duration;
class xsd__duration_: public xsd__anySimpleType { public: xsd__duration __item; };
typedef float xsd__float;
class xsd__float_: public xsd__anySimpleType { public: xsd__float __item; };
typedef char *xsd__time;
class xsd__time_: public xsd__anySimpleType { public: xsd__time __item; };
typedef char *xsd__decimal;
class xsd__decimal_: public xsd__anySimpleType { public: xsd__decimal __item; };
typedef char *xsd__integer;
class xsd__integer_: public xsd__decimal_ { public: xsd__integer __item; };
typedef LONG64 xsd__long;
class xsd__long_: public xsd__integer_ { public: xsd__long __item; };
typedef long xsd__int;
class xsd__int_: public xsd__long_ { public: xsd__int __item; };
typedef short xsd__short;
class xsd__short_: public xsd__int_ { public: xsd__short __item; };
typedef char xsd__byte;
class xsd__byte_: public xsd__short_ { public: xsd__byte __item; };
typedef char *xsd__nonPositiveInteger;
class xsd__nonPositiveInteger_: public xsd__integer_ { public: xsd__nonPositiveInteger __item; };
typedef char *xsd__negativeInteger;
class xsd__negativeInteger_: public xsd__nonPositiveInteger_ { public: xsd__negativeInteger __item; };
typedef char *xsd__nonNegativeInteger;
class xsd__nonNegativeInteger_: public xsd__integer_ { public: xsd__nonNegativeInteger __item; };
typedef char *xsd__positiveInteger;
class xsd__positiveInteger_: public xsd__nonNegativeInteger_ { public: xsd__positiveInteger __item; };
typedef ULONG64 xsd__unsignedLong;
class xsd__unsignedLong_: public xsd__nonNegativeInteger_ { public: xsd__unsignedLong __item; };
typedef unsigned long xsd__unsignedInt;
class xsd__unsignedInt_: public xsd__unsginedLong_ { public: xsd__unsignedInt __item; };
typedef unsigned short xsd__unsignedShort;
class xsd__unsignedShort_: public xsd__unsignedInt_ { public: xsd__unsignedShort __item; };
typedef unsigned char xsd__unsignedByte;
class xsd__unsignedByte_: public xsd__unsignedShort_ { public: xsd__unsignedByte __item; };
typedef char *xsd__string;
class xsd__string_: public xsd__anySimpleType { public: xsd__string __item; };
typedef char *xsd__normalizedString;
class xsd__normalizedString_: public xsd__string_ { public: xsd__normalizedString __item; };
typedef char *xsd__token;
class xsd__token_: public xsd__normalizedString_ { public: xsd__token __item; };

Note the use of the trailing underscores for the class names to distinguish the typedef type names from the class names. Only the most frequently used built-in schema types are shown. It is also allowed to include the xsd:base64Binary and xsd:hexBinary types in the hierarchy:

class xsd__base64Binary: public xsd__anySimpleType { public: unsigned char *__ptr; int __size; };
class xsd__hexBinary: public xsd__anySimpleType { public: unsigned char *__ptr; int __size; };

See Sections 11.12 and 11.13.
Methods are allowed to be added to the classes above, such as constructors and getter/setter methods, see Section 11.6.4.
Wrapper structs are supported as well, similar to wrapper classes. But they cannot be used to implement polymorphism. Rather, the wrapper structs facilitate the use of XML attributes with a primitive typed object, see 11.6.7.

11.3.3  XSD Schema Type Decoding Rules

The decoding rules for the primitive C and C++ data types is given in the table below:

Type Allows Decoding of Precision Lost?
bool [xsd:]boolean no
char* (C string) any type, see 11.3.5 no
wchar_t * (wide string) any type, see 11.3.5 no
double [xsd:]double no
[xsd:]float no
[xsd:]long no
[xsd:]int no
[xsd:]short no
[xsd:]byte no
[xsd:]unsignedLong no
[xsd:]unsignedInt no
[xsd:]unsignedShort no
[xsd:]unsignedByte no
[xsd:]decimal possibly
[xsd:]integer possibly
[xsd:]positiveInteger possibly
[xsd:]negativeInteger possibly
[xsd:]nonPositiveInteger possibly
[xsd:]nonNegativeInteger possibly
float [xsd:]float no
[xsd:]long no
[xsd:]int no
[xsd:]short no
[xsd:]byte no
[xsd:]unsignedLong no
[xsd:]unsignedInt no
[xsd:]unsignedShort no
[xsd:]unsignedByte no
[xsd:]decimal possibly
[xsd:]integer possibly
[xsd:]positiveInteger possibly
[xsd:]negativeInteger possibly
[xsd:]nonPositiveInteger possibly
[xsd:]nonNegativeInteger possibly
long long [xsd:]long no
[xsd:]int no
[xsd:]short no
[xsd:]byte no
[xsd:]unsignedLong possibly
[xsd:]unsignedInt no
[xsd:]unsignedShort no
[xsd:]unsignedByte no
[xsd:]integer possibly
[xsd:]positiveInteger possibly
[xsd:]negativeInteger possibly
[xsd:]nonPositiveInteger possibly
[xsd:]nonNegativeInteger possibly



Type Allows Decoding of Precision Lost?
long [xsd:]long possibly, if long is 32 bit
[xsd:]int no
[xsd:]short no
[xsd:]byte no
[xsd:]unsignedLong possibly
[xsd:]unsignedInt no
[xsd:]unsignedShort no
[xsd:]unsignedByte no
int [xsd:]int no
[xsd:]short no
[xsd:]byte no
[xsd:]unsignedInt possibly
[xsd:]unsignedShort no
[xsd:]unsignedByte no
short [xsd:]short no
[xsd:]byte no
[xsd:]unsignedShort no
[xsd:]unsignedByte no
char [xsd:]byte no
[xsd:]unsignedByte possibly
unsigned long long [xsd:]unsignedLong no
[xsd:]unsignedInt no
[xsd:]unsignedShort no
[xsd:]unsignedByte no
[xsd:]positiveInteger possibly
[xsd:]nonNegativeInteger possibly
unsigned long [xsd:]unsignedLong possibly, if long is 32 bit
[xsd:]unsignedInt no
[xsd:]unsignedShort no
[xsd:]unsignedByte no
unsigned int [xsd:]unsignedInt no
[xsd:]unsignedShort no
[xsd:]unsignedByte no
unsigned short [xsd:]unsignedShort no
[xsd:]unsignedByte no
unsigned char [xsd:]unsignedByte no
time_t [xsd:]dateTime no(?)

Due to limitations in representation of certain primitive C++ types, a possible loss of accuracy may occur with the decoding of certain XSD Schema types as is indicated in the table. The table does not indicate the possible loss of precision of floating point values due to the textual representation of floating point values in SOAP.
All explicitly declared XSD Schema encoded primitive types adhere to the same decoding rules. For example, the following declaration:

typedef unsigned long long xsd__nonNegativeInteger;

enables the encoding and decoding of xsd:nonNegativeInteger XSD Schema types (although decoding takes place with a possible loss of precision). The declaration also allows decoding of xsd:positiveInteger XSD Schema types, because of the storage as a unsigned long long data type.

11.3.4  Multi-Reference Strings

If more than one char pointer points to the same string, the string is encoded as a multi-reference value. Consider for example

char *s = "hello", *t = s;

The s and t variables are assigned the same string, and when serialized, t refers to the content of s:

<string id="123" xsi:type="string">hello</string>
...
<string href="#123"/>

The example assumed that s and t are encoded as independent elements.
Note: the use of typedef to declare a string type such as xsd__string will not affect the multi-reference string encoding. However, strings declared with different typedefs will never be considered multi-reference even when they point to the same string. For example

typedef char *xsd__string;
typedef char *xsd__anyURI;
xsd__anyURI *s = "http://www.myservice.com";
xsd__string *t = s;

The variables s and t point to the same string, but since they are considered different types their content will not be shared in the SOAP payload through a multi-referenced string.

11.3.5  "Smart String" Mixed-Content Decoding

The implementation of string decoding in gSOAP allows for mixed content decoding. If the SOAP payload contains a complex data type in place of a string, the complex data type is decoded in the string as plain XML text.
For example, suppose the getInfo service operation returns some detailed information. The service operation is declared as:

// Contents of header file "getInfo.h":
getInfo(char *detail);

The proxy of the service is used by a client to request a piece of information and the service responds with:

HTTP/1.1 200 OK
Content-Type: text/xml
Content-Length: nnn

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
   xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:xsd="http://www.w3.org/2001/XMLSchema"
<SOAP-ENV:Body>
<getInfoResponse>
<detail>
<picture>Mona Lisa by <i>Leonardo da Vinci</i></picture>
</detail>
</getInfoResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

As a result of the mixed content decoding, the detail string contains "<picture>Mona Lisa by <i>Leonardo da Vinci</i></picture>".

11.3.6  C++ Strings

gSOAP supports C++ strings std::string and std::wstring wide character strings. For example:

typedef std::string xsd__string;
class ns__myClass
{ public:
   xsd__string s; // serialized with xsi:type="xsd:string"
   std::string t; // serialized without xsi:type
...
};

Caution: Please avoid mixing std::string and C strings (char*) in the header file when using SOAP 1.1 encoding. The problem is that multi-referenced strings in SOAP encoded messages cannot be assigned simultaneously to a std::string and a char* string.

11.3.7  Changing the Encoding Precision of float and double Types

The double encoding format is by default set to "%.18G" (see a manual on printf text formatting in C), i.e. at most 18 digits of precision to limit a loss in accuracy. The float encoding format is by default "%.9G", i.e. at most 9 digits of precision.
The encoding format of a double type can be set by assigning a format string to soap.double_format, where soap is a variable that contains the current runtime context. For example:

struct soap soap;
soap_init(&soap); // sets double_format = "%.18G"
soap.double_format = "%e"; // redefine

which causes all doubles to be encoded in scientific notation. Likewise, the encoding format of a float type can be set by assigning a format string to the static soap_float_format string variable. For example:

struct soap soap;
soap_init(&soap); // sets float_format = "%.9G"
soap.float_format = "%.4f"; // redefine

which causes all floats to be encoded with four digits precision.
Caution: The format strings are not automatically reset before or after SOAP communications. An error in the format string may result in the incorrect encoding of floating point values.
A special case for C format string patterns is introduced in gSOAP 2.8.18. A C format string that is used as a pattern for a typedef float or double in the gSOAP header file is used to format the output of the floating point value in XML. For example:

typedef float time__ratio "%5.2f";

This will output the float with 5 digits total and 2 digits after the decimal point.
When xs:totalDigits and xs:fractionDigits are given in a XSD file, then also a C format string is produced to output floating point values with the proper precision and scale. For example:

<simpleType name="ratio">
   <restriction base="xsd:float">
      <totalDigits value="5"/>
      <fractionDigits value="2"/>
   </restriction>
</simpleType>

11.3.8  INF, -INF, and NaN Values of float and double Types

The gSOAP runtime stdsoap2.cpp and header file stdsoap2.h support the marshalling of IEEE INF, -INF, and NaN representations. Under certain circumstances this may break if the hardware and/or C/C++ compiler does not support these representations. To remove the representations, remove the inclusion of the < math.h > header file from the stdsoap2.h file. You can control the representations as well, which are defined by the macros:

#define FLT_NAN
#define FLT_PINFTY
#define FLT_NINFTY
#define DBL_NAN
#define DBL_PINFTY
#define DBL_NINFTY

11.4  Enumeration Serialization

Enumerations are generally useful for the declaration of named integer-valued constants, also called enumeration constants.

11.4.1  Serialization of Symbolic Enumeration Constants

The gSOAP soapcpp2 tool encodes the constants of enumeration-typed variables in symbolic form using the names of the constants when possible to comply to SOAP's enumeration encoding style. Consider for example the following enumeration of weekdays:

enum weekday {Mon, Tue, Wed, Thu, Fri, Sat, Sun};

The enumeration-constant Mon, for example, is encoded as

<weekday xsi:type="weekday">Mon</weekday>

The value of the xsi:type attribute is the enumeration-type identifier's name. If the element is independent as in the example above, the element name is the enumeration-type identifier's name.
The encoding of complex types such as enumerations requires a reference to an XML Schema through the use of a namespace prefix. The namespace prefix can be specified as part of the enumeration-type identifier's name, with the usual namespace prefix conventions for identifiers. This can be used to explicitly specify the encoding style. For example:

enum ns1__weekday {Mon, Tue, Wed, Thu, Fri, Sat, Sun};

The enumeration-constant Sat, for example, is encoded as:

<ns1:weekday xsi:type="ns1:weekday">Sat</ns1:weekday>

The corresponding XML Schema for this enumeration data type would be:

<xsd:element name="weekday" type="tns:weekday"/>
<xsd:simpleType name="weekday">
   <xsd:restriction base="xsd:string">
      <xsd:enumeration value="Mon"/>
      <xsd:enumeration value="Tue"/>
      <xsd:enumeration value="Wed"/>
      <xsd:enumeration value="Thu"/>
      <xsd:enumeration value="Fri"/>
      <xsd:enumeration value="Sat"/>
      <xsd:enumeration value="Sun"/>
   </xsd:restriction>
</xsd:simpleType>

11.4.2  Encoding of Enumeration Constants

If the value of an enumeration-typed variable has no corresponding named constant, the value is encoded as a signed integer literal. For example, the following declaration of a workday enumeration type lacks named constants for Saturday and Sunday:

enum ns1__workday {Mon, Tue, Wed, Thu, Fri};

If the constant 5 (Saturday) or 6 (Sunday) is assigned to a variable of the workday enumeration type, the variable will be encoded with the integer literals 5 and 6, respectively. For example:

<ns1:workday xsi:type="ns1:workday">5</ns1:workday>

Since this is legal in C++ and SOAP allows enumeration constants to be integer literals, this method ensures that non-symbolic enumeration constants are correctly communicated to another party if the other party accepts literal enumeration constants (as with the gSOAP soapcpp2 tool).
Both symbolic and literal enumeration constants can be decoded.
To enforce the literal enumeration constant encoding and to get the literal constants in the WSDL file, use the following trick:

enum ns1__nums { _1 = 1, _2 = 2, _3 = 3 };

The difference with an enumeration type without a list of values and the enumeration type above is that the enumeration constants will appear in the WSDL service description.

11.4.3  Initialized Enumeration Constants

The gSOAP soapcpp2 compiler supports the initialization of enumeration constants, as in:

enum ns1__relation {LESS = -1, EQUAL = 0, GREATER = 1};

The symbolic names LESS, EQUAL, and GREATER will appear in the SOAP payload for the encoding of the ns1__relation enumeration values -1, 0, and 1, respectively.

11.4.4  How to "Reuse" Symbolic Enumeration Constants

A well-known deficiency of C and C++ enumeration types is the lack of support for the reuse of symbolic names by multiple enumerations. That is, the names of all the symbolic constants defined by an enumeration cannot be reused by another enumeration. To force encoding of the same symbolic name by different enumerations, the identifier of the symbolic name can end in an underscore (_) or any number of underscores to distinguish it from other symbolic names in C++. This guarantees that the SOAP encoding will use the same name, while the symbolic names can be distinguished in C++. Effectively, the underscores are removed from a symbolic name prior to encoding.
Consider for example:

enum ns1__workday {Mon, Tue, Wed, Thu, Fri};
enum ns1__weekday {Mon_, Tue_, Wed_, Thu_, Fri_, Sat_, Sun_};

which will result in the encoding of the constants of enum ns1__weekday without the underscore, for example as Mon.
As an alternative to the trailing underscores that can get quite long for commonly used symbolic enum names, you can use the following convention with double underscores to add the enum name to the enum constants:

enum prefixedname { prefixedname__enumconst1, prefixedname__enumconst2, ... };

where the type name of the enumeration prefixedname is a prefixed name, such as:

enum ns1__workday { ns1__workday__Mon, ns1__workday__Tue, ns1__workday__Wed, ns1__workday__Thu, ns1__workday__Fri };
enum ns1__weekday { ns1__workday__Mon, ns1__workday__Tue, ns1__workday__Wed, ns1__workday__Thu, ns1__workday__Fri, ns1__workday__Sat, ns1__workday__Sun };

This ensures that the XML schema enumeration values are still simply Mon, Tue, Wed, Thu, Fri, Sat, and Sun.
Caution: The following declaration:

enum ns1__workday {Mon, Tue, Wed, Thu, Fri};
enum ns1__weekday {Sat = 5, Sun = 6};

will not properly encode the weekday enumeration when you assume that workdays are part of weekdays, because it lacks the named constants for workday in its enumeration list. All enumerations must be self-contained and cannot use enum constants of other enumerations.

11.4.5  Boolean Enumeration Serialization for C

When developing a C Web service application, the C++ bool type should not be used since it is not usually supported by the C compiler. Instead, an enumeration type should be used to serialize true/false values as xsd:boolean Schema type enumeration values. The xsd:boolean XML Schema type is defined as:

enum xsd__boolean {false_, true_};

The value false_, for example, is encoded as:

<xsd:boolean xsi:type="xsd:boolean">false</xsd:boolean>

Peculiar of the SOAP boolean type encoding is that it only defines the values 0 and 1, while the built-in XML Schema boolean type also defines the false and true symbolic constants as valid values. The following example declaration of an enumeration type lacks named constants altogether to force encoding of the enumeration values as literal constants:

enum SOAP_ENC__boolean {};

The value 0, for example, is encoded with an integer literal:

<SOAP-ENC:boolean xsi:type="SOAP-ENC:boolean">0<SOAP-ENC:boolean>

11.4.6  Bitmask Enumeration Serialization

A bitmask is an enumeration of flags such as declared with C#'s [Flags] enum annotation. gSOAP supports bitmask encoding and decoding for interoperability. However, bitmask types are not standardized with SOAP RPC.
A special syntactic convention is used in the header file input to the gSOAP soapcpp2 compiler to indicate the use of bitmasks with an asterisk:

enum * name { enum-constant, enum-constant, ... };

The gSOAP soapcpp2 compiler will encode the enumeration constants as flags, i.e. as a series of powers of 2 starting with 1. The enumeration constants can be or-ed to form a bitvector (bitmask) which is encoded and decoded as a list of symbolic values in SOAP. For example:

enum * ns__machineStatus { ON, BELT, VALVE, HATCH};
int ns__getMachineStatus(char *name, char *enum ns__machineStatus result);

Note that the use of the enum does not require the asterisk, only the definition. The gSOAP soapcpp2 compiler generates the enumeration:

enum ns__machineStatus { ON=1, BELT=2, VALVE=4, HATCH=8};

A service operation implementation in a Web service can return:

int ns__getMachineStatus(struct soap *soap, char *name, enum ns__machineStatus result)
{ ...
   *result = BELT - HATCH;
   return SOAP_OK;
}

11.5  Struct Serialization

A struct data type is encoded as an XML Schema complexType (SOAP-encoded compound data type) such that the struct name forms the data type's element name and schema type and the fields of the struct are the data type's accessors. This encoding is identical to the class instance encoding without inheritance and method declarations, see Section 11.6 for further details. However, the encoding and decoding of structs is more efficient compared to class instances due to the lack of inheritance and the requirement by the serialization routines to check inheritance properties at run time.
Certain type of fields of a struct can be (de)serialized as XML attributes using the @ type qualifier. See Section 11.6.7 for more details.
See Section 10.3 for more details on the struct/class member field serialization and the resulting element and attribute qualified forms.

11.6  Class Instance Serialization

A class instance is serialized as an XML Schema complexType (SOAP-encoded compound data type) such that the class name forms the data type's element name and schema type and the data member fields are the data type's accessors. Only the data member fields are encoded in the SOAP payload. Class methods are not encoded.
The general form of a class declaration is:

class [namespace_prefix__]class_name1 [:[public:] [private:] [protected:] [namespace_prefix__]class_name2]
{
   [public:] [private:] [protected:]
   field1;
   field2;
   ...
   [public:] [private:] [protected:]
   method1;
   method2;
   ...
};

where
namespace_prefix__
is the optional namespace prefix of the compound data type (see identifier translation rules 10.3)
class_name1
is the element name of the compound data type (see identifier translation rules 10.3).
class_name2
is an optional base class.
field
is a field declaration (data member). A field MAY be declared static and const and MAY be initialized.
method
is a method declaration. A method MAY be declared virtual, but abstract methods are not allowed. The method parameter declarations are REQUIRED to have parameter identifier names.
[public:] [private:] [protected:]
are OPTIONAL. Only members with public acces permission can be serialized.
A class name is REQUIRED to be unique and cannot have the same name as a struct, enum, or service operation name specified in the header file input to the gSOAP soapcpp2 compiler. The reason is that service operation requests are encoded similarly to class instances in SOAP and they are in principle undistinguishable (the method parameters are encoded just as the fields of a class).
Only single inheritance is supported by the gSOAP soapcpp2 compiler. Multiple inheritance is not supported, because of the limitations of the SOAP protocol.
If a constructor method is present, there MUST also be a constructor declaration with empty parameter list.
Classes should be declared "volatile" if you don't want gSOAP to add serialization methods to these classes, see Section 19.4 for more details.
Class templates are not supported by the gSOAP soapcpp2 compiler, but you can use STL containers, see Section 11.11.8. You can also define your own containers similar to STL containers.
Certain type of fields of a struct can be (de)serialized as XML attributes using the @ type qualifier. See Section 11.6.7 for more details.
See Section 10.3 for more details on the struct/class member field serialization and the resulting element and attribute qualified forms.
Arrays may be embedded within a class (and struct) using a pointer field and size information, see Section 11.11.7. This defines what is sometimes referred to in SOAP as "generics".
Void pointers may be used in a class (or struct), but you have to add a type field so the gSOAP runtime can determine the type of object pointed to, see Section 11.9.
A class instance is encoded as:

<[namespace-prefix:]class-name xsi:type="[namespace-prefix:]class-name">
<basefield-name1 xsi:type="...">...</basefield-name1>
<basefield-name2 xsi:type="...">...</basefield-name2>
...
<field-name1 xsi:type="...">...</field-name1>
<field-name2 xsi:type="...">...</field-name2>
...
</[namespace-prefix:]class-name>

where the field-name accessors have element-name representations of the class fields and the basefield-name accessors have element-name representations of the base class fields. (The optional parts resulting from the specification are shown enclosed in [].)
The decoding of a class instance allows any ordering of the accessors in the SOAP payload. However, if a base class field name is identical to a derived class field name because the field is overloaded, the base class field name MUST precede the derived class field name in the SOAP payload for decoding. gSOAP guarantees this, but interoperability with other SOAP implementations is cannot be guaranteed.

11.6.1  Example

The following example declares a base class ns__Object and a derived class ns__Shape:

// Contents of file "shape.h":
class ns__Object
{
   public:
   char *name;
};
class ns__Shape : public ns__Object
{
   public:
   int sides;
   enum ns__Color {Red, Green, Blue} color;
   ns__Shape();
   ns__Shape(int sides, enum ns__Green color);
   ~ns__Shape();
};

The implementation of the methods of class ns__Shape must not be part of the header file and need to be defined elsewhere.
An instance of class ns__Shape with name Triangle, 3 sides, and color Green is encoded as:

<ns:Shape xsi:type="ns:Shape">
<name xsi:type="string">Triangle</name>
<sides xsi:type="int">3</sides>
<color xsi:type="ns:Color">Green</color>
</ns:shape>

The namespace URI of the namespace prefix ns must be defined by a namespace mapping table, see Section 10.4.

11.6.2  Initialized static const Fields

A data member field of a class declared as static const is initialized with a constant value at compile time. This field is encoded in the serialization process, but is not decoded in the deserialization process. For example:

// Contents of file "triangle.h":
class ns__Triangle : public ns__Object
{
   public:
   int size;
   static const int sides = 3;
};

An instance of class ns__Triangle is encoded in SOAP as:

<ns:Triangle xsi:type="ns:Triangle">
<name xsi:type="string">Triangle</name>
<size xsi:type="int">15</size>
<sides xsi:type="int">3>/sides>
</ns:Triangle>

Decoding will ignore the sides field's value.
Caution: The current gSOAP implementation does not support encoding static const fields, due to C++ compiler compatibility differences. This feature may be provided the future.

11.6.3  Class Methods

A class declaration in the header file input to the gSOAP soapcpp2 compiler MAY include method declarations. The method implementations MUST NOT be part of the header file but are required to be defined in another C++ source that is externally linked with the application. This convention is also used for the constructors and destructors of the class.
Dynamic binding is supported, so a method MAY be declared virtual.

11.6.4  Getter and Setter Methods

Setter and getter methods are invoked at run time upon serialization and deserialization of class instances, respectively. The use of setter and getter methods adds more flexibility to the serialization and deserialization process.
A setter method is called in the serialization phase from the virtual soap_serialization method generated by the gSOAP soapcpp2 compiler. You can use setter methods to process a class instance just before it is serialized. A setter method can be used to convert application data, such as translating transient application data into serializable data, for example. You can also use setter methods to retrieve dynamic content and use it to update a class instance right before serialization. Remember setters as "set to serialize" operations.
Getter methods are invoked after deserialization of the instance. You can use them to adjust the contents of class instances after all their members have been deserialized. Getters can be used to convert deserialized members into transient members and even invoke methods to process the deserialized data on the fly.
Getter and setter methods have the following signature:

[virtual] int get(struct soap *soap) [const];
[virtual] int set(struct soap *soap);

The active soap struct will be passed to the get and set methods. The methods should return SOAP_OK when successful. A setter method should prepare the contents of the class instance for serialization. A getter method should process the instance after deserialization.
Here is an example of a base64 binary class:

class xsd__base64Binary
{ public:
   unsignedchar *__ptr;
   int__size;
   int get(struct soap *soap);
   int set(struct soap *soap);
};

Suppose that the type and options members of the attachment should be set when the class is about to be serialized. This can be accomplished with the set method from the information provided by the __ptr to the data and the soap struct passed to the set method (you can pass data via the void*soap.user field).
The get method is invoked after the base64 data has been processed. You can use it for post-processing purposes.
Here is another example. It defines a primitive update type. The class is a wrapper for the time_t type, see Section 11.3.2. Therefore, elements of this type contain xsd:dateType data.

class update
{ public:
   time_t __item;
   int set(struct soap *soap);
};

The setter method assigns the current time:

int update::set(struct soap *soap)
{
   this->__item = time(NULL);
   return SOAP_OK;
}

Therefore, serialization results in the inclusion of a time stamp in XML.
Caution: a get method is invoked only when the XML element with its data was completely parsed. The method is not invoked when the element is an xsi:nil element or has an href attribute.
Caution: The soap_serialize method of a class calls the setter (when provided). However, the soap_serialize method is declared const while the setter should be allowed to modify the contents of the class instance. Therefore, the gSOAP-generated code recasts the instance and the const is removed when invoking the setter.

11.6.5  Streaming XML with Getter and Setter Methods

Getter methods enable streaming XML operations. A getter method is invoked when the object is deserialized and the rest of the SOAP/XML message has not been processed yet. For example, you can add a getter method to the SOAP Header class to implement header processing logic that is activated as soon as the SOAP Header is received. An example code is shown below:

class h__Authentication
{ public:
   char *id;
   int get(struct soap *soap);
};
class SOAP_ENV__Header
{ public:
   h__Authentication *h__authentication;
};

The Authentication SOAP Header field is instantiated and decoded. After decoding, the getter method is invoked, which can be used to check the id before the rest of the SOAP message is processed.

11.6.6  Polymorphism, Derived Classes, and Dynamic Binding

Interoperability between client and service applications developed with gSOAP is established even when clients and/or services use derived classes instead of the base classes used in the declaration of the service operation parameters. A client application MAY use pointers to instances of derived classes for the input parameters of a service operation. If the service was compiled with a declaration and implementation of the derived class, the service operation base class input parameters are demarshalled and a derived class instance is created instead of a base class instance. If the service did not include a declaration of the derived class, the derived class fields are ignored and a base class instance is created. Therefore, interoperability is guaranteed even when the client sends an instance of a derived classes and when a service returns an instance of a derived class.
The following example declares Base and Derived classes and a service operation that takes a pointer to a Base class instance and returns a Base class instance:

// Contents of file "derived.h"
class Base
{
   public:
   char *name;
   Base();
   virtual void print();
};
class Derived : public Base
{
   public:
   int num;
   Derived();
   virtual void print();
};
int method(Base *in, struct methodResponse { Base *out; } &result);

This header file specification is processed by the gSOAP soapcpp2 compiler to produce the stub and skeleton routines which are used to implement a client and service. The pointer of the service operation is also allowed to point to Derived class instances and these instances will be marshalled as Derived class instances and send to a service, which is in accord to the usual semantics of parameter passing in C++ with dynamic binding.
The Base and Derived class method implementations are:

// Method implementations of the Base and Derived classes:
#include "soapH.h"
...
Base::Base()
{
   cout << "created a Base class instance" << endl;
}
Derived::Derived()
{
   cout << "created a Derived class instance" << endl;
}
Base::print()
{
   cout << "print(): Base class instance " << name << endl;
}
Derived::print()
{
   cout << "print(): Derived class instance " << name << " " << num << endl;
}

Below is an example CLIENT application that creates a Derived class instance that is passed as the input parameter of the service operation:

// CLIENT
#include "soapH.h"
int main()
{
   struct soap soap;
   soap_init(&soap);
   Derived obj1;
   Base *obj2;
   struct methodResponse r;
   obj1.name = "X";
   obj1.num = 3;
   soap_call_method(&soap, url, action, &obj1, r);
   r.obj2->print();
}
...

The following example SERVER1 application copies a class instance (Base or Derived class) from the input to the output parameter:

// SERVER1
#include "soapH.h"
int main()
{
   soap_serve(soap_new());
}
int method(struct soap *soap, Base *obj1, struct methodResponse &result)
{
   obj1->print();
   result.obj2 = obj1;
   return SOAP_OK;
}
...

The following messages are produced by the CLIENT and SERVER1 applications:

CLIENT: created a Derived class instance
SERVER1: created a Derived class instance
SERVER1: print(): Derived class instance X 3
CLIENT: created a Derived class instance
CLIENT: print(): Derived class instance X 3

Which indicates that the derived class kept its identity when it passed through SERVER1. Note that instances are created both by the CLIENT and SERVER1 by the demarshalling process.
Now suppose a service application is developed that only accepts Base class instances. The header file is:

// Contents of file "base.h":
class Base
{
   public:
   char *name;
   Base();
   virtual void print();
};
int method(Base *in, Base *out);

This header file specification is processed by the gSOAP soapcpp2 tool to produce skeleton routine which is used to implement a service (so the client will still use the derived classes).
The method implementation of the Base class are:

// Method implementations of the Base class:
#include "soapH.h"
...
Base::Base()
{
   cout << "created a Base class instance" << endl;
}
Base::print()
{
   cout << "print(): Base class instance " << name << endl;
}

And the SERVER2 application is that uses the Base class is:

// SERVER2
#include "soapH.h"
int main()
{
   soap_serve(soap_new());
}
int method(struct soap *soap, Base *obj1, struct methodResponse &result)
{
   obj1->print();
   result.obj2 = obj1;
   return SOAP_OK;
}
...

Here are the messages produced by the CLIENT and SERVER2 applications:

CLIENT: created a Derived class instance
SERVER2: created a Base class instance
SERVER2: print(): Base class instance X
CLIENT: created a Base class instance
CLIENT: print(): Base class instance X

In this example, the object was passed as a Derived class instance to SERVER2. Since SERVER2 only implements the Base class, this object is converted to a Base class instance and send back to CLIENT.

11.6.7  XML Attributes

The SOAP RPC/LIT and SOAP DOC/LIT encoding styles support XML attributes in SOAP messages while SOAP RPC with "Section 5" encoding does not support XML attributes other than the SOAP and XSD specific attributes. SOAP RPC "Section 5" encoding has advantages for cross-language interoperability and data encodings such as graph serialization. However, RPC/LIT and DOC/LIT enables direct exchange of XML documents, which may include encoded application data structures. Language interoperability is compromised, because no mapping between XML and the typical language data types is defined. The meaning of the RPC/LIT and DOC/LIT XML content is Schema driven rather than application/language driven.
gSOAP supports XML attribute (de)serialization of members in structs and classes. Attributes are primitive XSD types, such as strings, enumerations, boolean, and numeric types. To declare an XML attribute in a struct/class, the qualifier @ is used with the type of the attribute. The type must be primitive type (including enumerations and strings), which can be declared with or without a typedef to associate a XSD type with the C/C+ type. For example

typedef char *xsd__string;
typedef bool *xsd__boolean;
enum ns__state { _0, _1, _2 };
struct ns__myStruct
{
   @xsd__string ns__type; // encode as XML attribute 'ns:type' of type 'xsd:string'
   @xsd__boolean ns__flag = false; // encode as XML attribute 'ns:flag' of type 'xsd:boolean'
   @enum ns__state ns__state = _2; // encode as XML attribute 'ns:state' of type 'ns:state'
   struct ns__myStruct *next;
};

The @ qualifier indicates XML attribute encoding for the ns__type, ns__flag, and ns__state fields. Note that the namespace prefix ns is used to distinguish these attributes from any other attributes such as xsi:type (ns:type is not to be confused with xsi:type).
Default values can be associated with any field that has a primitive type in a struct/class, as is illustrated in this example. The default values are used when the receiving message does not contain the corresponding values.
String attributes are optional. Other type of attributes should be declared as pointers to make them optional:

struct ns__myStruct
{
   @int *a; // omitted when NULL
};

Because a service operation request and response is essentially a struct, XML attributes can also be associated with method requests and responses. For example

int ns__myMethod(@char *ns__name, ...);

Attributes can also be attached to the dynamic arrays, binary types, and wrapper classes/structs of primitive types. Wrapper classes are described in Section 11.3.2. For example

struct xsd__string
{
   char *__item;
   @xsd__boolean flag;
};

and

struct xsd__base64Binary
{
   unsigned char *__ptr;
   int __size;
   @xsd__boolean flag;
};

The attribute declarations MUST follow the __item, __ptr, and __size fields which define the characteristics of wrapper structs/classes and dynamic arrays.
Caution: Do not use XML attributes with SOAP RPC encoding. You can only use attributes with RPC literal encoding.

11.6.8  QName Attributes and Elements

gSOAP ensures the proper decoding of XSD QNames. An element or attribute with type QName (Qualified Name) contains a namespace prefix and a local name. You can declare a QName type as a typedef char *xsd__QName. Values of type QName are internally handled as regular strings. gSOAP takes care of the proper namespace prefix mappings when deserializing QName values. For example

typedef char *xsd__QName;
struct ns__myStruct
{
   xsd__QName elt = "ns:xyz"; // QName element with default value "ns:xyz"
   @xsd__QName att = "ns:abc"; // QName attribute with default value "ns:abc"
};

When the elt and att fields are serialized, their string contents are just transmitted (which means that the application is responsible to ensure proper formatting of the QName strings prior to transmission). When the fields are deserialized however, gSOAP takes care mapping the qualifiers to the appropriate namespace prefixes. Suppose that the inbound value for the elt is x:def, where the namespace name associated with the prefix x matches the namespace name of the prefix ns (as defined in the namespace mapping table). Then, the value is automatically converted into ns:def. If the namespace name is not in the table, then x:def is converted to "URI":def where "URI" is the namespace URI bound to x in the message received. This enables an application to retrieve the namespace information, whether it is in the namespace mapping table or not.
Note: QName is a pre-defined typedef type and used by gSOAP to (de)serialize SOAP Fault codes which are QName elements.

11.7  Union Serialization

A union is only serialized if the union is used within a struct or class declaration that includes a int __union field that acts as a discriminant or selector for the union fields. The selector stores run-time usage information about the union fields. That is, the selector is used to enumerate the union fields such that the gSOAP engine is able to select the correct union field to serialize.
A union within a struct or class with a selector field represents xs:choice within a Schema complexType component. For example:

struct ns__PO
{ ... };
struct ns__Invoice
{ ... };
union ns__PO_or_Invoice
{
   struct ns__PO po;
   struct ns__Invoice invoice;
};
struct ns__composite
{
   char *name;
   int __union;
   union ns__PO_or_Invoice value;
};

The union ns__PO_or_Invoice is expanded as a xs:choice:

<complexType name="composite">
   <sequence>
      <element name="name" type="xsd:string"/>
      <choice>
         <element name="po" type="ns:PO"/>
         <element name="invoice" type="ns:Invoice"/>
      </choice>
   </sequence>
</complexType>

Therefore, the name of the union and field can be freely chosen. However, the union name should be qualified (as shown in the example) to ensure instances of XML Schemas with elementFormDefault="qualified" are correctly serialized (po and invoice are ns: qualified).
The int __union field selector's values are determined by the soapcpp2 compiler. Each union field name has a selector value formed by:

SOAP_UNION_union-name_field-name

These selector values enumerate the union fields starting with 1. The value 0 (or any negative value) can be assigned to omit the serialization of the union, but only if explicitly allowed by validation rules, which requires minOccurs="0" for the xs:choice as follows:

struct ns__composite
{
   char *name;
   int __union 0; // <choice minOccurs="0">
   union ns__PO_or_Invoice value;
};

This way we can treat the union as an optional data item by setting __union=0.
Since 2.7.16 it is also possible to use a '$' as a special marker to annotate a selector field that must be of type int and the field name is no longer relevant:

struct ns__composite
{
   char *name;
   $int select 0; // <choice minOccurs="0">
   union ns__PO_or_Invoice value;
};

The following example shows how the struct ns__composite instance is initialized for serialization using the above declaration:

struct ns__composite data;
data.name = "...";
data.select = SOAP_UNION_ns__PO_or_Invoice_po; // select PO
data.value.po.number = ...; // populate the PO

Note that failing to set the selector to a valid union field can lead to a crash of the gSOAP serializer because it will attempt to serialize an invalid union field.
For deserialization of union types, the selector will be set to one of the union field selector values, as determined by the XML payload. The selector will be set to 0 or -1 when no union member was deserialized, where a negative value indicates that a member was required by validation rules. Strict validation enabled with SOAP_XML_STRICT results in a validation fault.
When more than one union is used in a struct or class, the __union selectors must be renamed to avoid name clashes by using suffixes as in:

struct ns__composite
{
   char *name;
   $int sel_value; // = SOAP_UNION_ns__PO_or_Invoice_[po - invoice]
   union ns__PO_or_Invoice value;
   $int sel_data; // = SOAP_UNIO_ns__Email_or_Fax_[email - fax]
   union ns__Email_or_Fax data;
};

11.8  Serializing Pointer Types

The serialization of a pointer to a data type amounts to the serialization of the data type in SOAP and the SOAP encoded representation of a pointer to the data type is indistinguishable from the encoded representation of the data type pointed to.

11.8.1  Multi-Referenced Data

A data structure pointed to by more than one pointer is serialized as SOAP multi-reference data. This means that the data will be serialized only once and identified with a unique id attribute. The encoding of the pointers to the shared data is done through the use of href or ref attributes to refer to the multi-reference data. See Section 9.12 on options to control the serialization of multi-reference data. To turn multi-ref off, use SOAP_XML_TREE to process plain tree-based XML. To completely eliminate multi-ref (de)serialization use the WITH_NOIDREF compile-time flag with all source code (including stdsoap2.c and stdsoap2.cpp) to permanently disable id-href processing. Cyclic C/C++ data structures are encoded with multi-reference SOAP encoding. Consider for example the following a linked list data structure:

typedef char *xsd__string;
struct ns__list
{
   xsd__string value;
   struct ns__list *next;
};

Suppose a cyclic linked list is created. The first node contains the value "abc" and points to a node with value "def" which in turn points to the first node. This is encoded as:

<ns:list id="1" xsi:type="ns:list">
   <value xsi:type="xsd:string">abc</value>
   <next xsi:type="ns:list">
      <value xsi:type="xsd:string">def</value>
      <next href="#1"/>
   </next>
</ns:list>

In case multi-referenced data is received that "does not fit in a pointer-based structure", the data is copied. For example, the following two structs are similar, except that the first uses pointer-based fields while the other uses non-pointer-based fields:

typedef long xsd__int;
struct ns__record
{
   xsd__int *a;
   xsd__int *b;
} P;
struct ns__record
{
   xsd__int a;
   xsd__int b;
} R;
...
   P.a = &n;
   P.b = &n;
...

Since both a and b fields of P point to the same integer, the encoding of P is multi-reference:

<ns:record xsi:type="ns:record">
   <a href="#1"/>
   <b href="#1"/>
</ns:record>
<id id="1" xsi:type="xsd:int">123</id>

Now, the decoding of the content in the R data structure that does not use pointers to integers results in a copy of each multi-reference integer. Note that the two structs resemble the same XML data type because the trailing underscore will be ignored in XML encoding and decoding.

11.8.2  NULL Pointers and Nil Elements

A NULL pointer is not serialized, unless the pointer itself is pointed to by another pointer (but see Section 9.12 to control the serialization of NULLs). For example:

struct X
{
   int *p;
   int **q;
}

Suppose pointer q points to pointer p and suppose p=NULL. In that case the p pointer is serialized as

<... id="123" xsi:nil="true"/>

and the serialization of q refers to href="#123". Note that SOAP 1.1 does not support pointer to pointer types (!), so this encoding is specific to gSOAP. The pointer to pointer encoding is rarely used in codes anyway. More common is a pointer to a data type such as a struct with pointer fields.
Caution: When the deserializer encounters an XML element that has a xsi:nil="true" attribute but the corresponding C++ data is not a pointer or reference, the deserializer will terminate with a SOAP_NULL fault when the SOAP_XML_STRICT flag is set. The types section of a WSDL description contains information on the "nilability" of data.

11.9  Void Pointers

In general, void pointers (void*) cannot be (de)serialized because the type of data referred to is untyped. To enable the (de)serialization of the void pointers that are members of structs or classes, you can insert a int __type field right before the void pointer field. The int __ type field contains run time information on the type of the data pointed to by void* member in a struct/class to enable the (de)serialization of this data. The int __type field is set to a SOAP_TYPE_X value, where X is the name of a type. gSOAP generates the SOAP_TYPE_X definitions in soapH.h and uses them internally to uniquely identify the type of each object. The type naming conventions outlined in Section 7.5.3 are used to determine the type name for X.
Here is an example to illustrate the (de)serialization of a void* field in a struct:

struct myStruct
{
   int __type; // the SOAP_TYPE pointed to by p
   void *p;
};

The __type integer can be set to 0 at run time to omit the serialization of the void pointer field.
The following example illustrates the initialization of myStruct with a void pointer to an int:

struct myStruct S;
int n;
S.p = &n;
S.__type = SOAP_TYPE_int;

The serialized output of S contains the integer.
The deserializer for myStruct will automatically set the __type field and void pointer to the deserialized data, provided that the XML content for p carries the xsi:type attribute from which gSOAP can determine the type.
Important: when (de)serializing strings via a void* field, the void* pointer MUST directly point to the string value rather than indirectly as with all other types. For example:

struct myStruct S;
S.p = (void*)"Hello";
S.__type = SOAP_TYPE_string;

This is the case for all string-based types, including types defined with typedef char*.
You may use an arbitrary suffix with the __type fields to handle multiple void pointers in structs/classes. For example

struct myStruct
{
   int __typeOfp; // the SOAP_TYPE pointed to by p
   void *p;
   int __typeOfq; // the SOAP_TYPE pointed to by q
   void *q;
};

Because service method parameters are stored within structs, you can use __type and void* parameters to pass polymorphic arguments without having to define a C++ class hierarchy (Section 11.6.6). For example:

typedef char *xsd__string;
typedef int xsd__int;
typedef float xsd__float;
enum ns__status { on, off };
struct ns__widget { xsd__string name; xsd__int part; }; int ns__myMethod(int __type, void *data, struct ns__myMethodResponse { int __type; void *return_; } *out);

This method has a polymorphic input parameter data and a polymorphic output parameter return_. The __type parameters can be one of SOAP_TYPE_xsd__string, SOAP_TYPE_xsd__int, SOAP_TYPE_xsd__float, SOAP_TYPE_ns__status, or SOAP_TYPE_ns__widget. The WSDL produced by the gSOAP soapcpp2 compiler declares the polymorphic parameters of type xsd:anyType which is "too loose" and doesn't allow the gSOAP importer to handle the WSDL accurately. Future gSOAP releases might replace xsd:anyType with a choice schema type that limits the choice of types to the types declared in the header file.

11.10  Fixed-Size Arrays

Fixed size arrays are encoded as per SOAP 1.1 one-dimensional array types. Multi-dimensional fixed size arrays are encoded by gSOAP as nested one-dimensional arrays in SOAP. Encoding of fixed size arrays supports partially transmitted and sparse array SOAP formats.
The decoding of (multi-dimensional) fixed-size arrays supports the SOAP multi-dimensional array format as well as partially transmitted and sparse array formats.
An example:

// Contents of header file "fixed.h":
struct Example
{
   float a[2][3];
};

This specifies a fixed-size array part of the struct Example. The encoding of array a is:

<a xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="float[][2]">
<SOAP-ENC:Array xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="float[3]"
<float xsi:type="float">...</float>
<float xsi:type="float">...</float>
<float xsi:type="float">...</float>
</SOAP-ENC:Array>
<SOAP-ENC:Array xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="float[3]"
<float xsi:type="float">...</float>
<float xsi:type="float">...</float>
<float xsi:type="float">...</float>
</SOAP-ENC:Array>
</a>

Caution: Any decoded parts of a (multi-dimensional) array that do not "fit" in the fixed size array are ignored by the deserializer.

11.11  Dynamic Arrays

As the name suggests, dynamic arrays are much more flexible than fixed-size arrays and dynamic arrays are better adaptable to the SOAP encoding and decoding rules for arrays. In addition, a typical C application allocates a dynamic array using malloc, assigns the location to a pointer variable, and deallocates the array later with free. A typical C++ application allocates a dynamic array using new, assigns the location to a pointer variable, and deallocates the array later with delete. Such dynamic allocations are flexible, but pose a problem for the serialization of data: how does the array serializer know the length of the array to be serialized given only a pointer to the sequence of elements? The application stores the size information somewhere. This information is crucial for the array serializer and has to be made explicitly known to the array serializer by packaging the pointer and array size information within a struct or class.

11.11.1  SOAP Array Bounds Limits

SOAP encoded arrays use the SOAP-ENC:Array type and the SOAP-ENC:arrayType attribute to define the array dimensionality and size. As a security measure to avoid denial of service attacks based on sending a huge array size value requiring the allocation of large chunks of memory, the total number of array elements set by the SOAP-ENC:arrayType attribute cannot exceed SOAP_MAXARRAYSIZE, which is set to 100,000 by default. This constant is defined in stdsoap2.h. This constant only affects multi-dimensional arrays and the dimensionality of the receiving array will be lost when the number of elements exceeds 100,000. One-dimensional arrays will be populated in sequential order as expected.

11.11.2  One-Dimensional Dynamic SOAP Arrays

A special form of struct or class is used to define one-dimensional dynamic SOAP-encoded arrays. Each array has a pointer variable and a field that records the number of elements the pointer points to in memory.
The general form of the struct declaration that contains a one-dimensional dynamic SOAP-encoded array is:

struct some_name
{
   Type *__ptr; // pointer to array of elements in memory
   int __size; // number of elements pointed to
   [[static const] int __offset [= ...];] // optional SOAP 1.1 array offset
   ... // anything that follows here will be ignored
};

where Type MUST be a type associated with an XML Schema or MUST be a primitive type. If these conditions are not met, a vector-like XML (de)serialization is used (see Section 11.11.7). A primitive type can be used with or without a typedef. If the array elements are structs or classes, then the struct/class type names should have a namespace prefix for schema association, or they should be other (nested) dynamic arrays.
An alternative to a struct is to use a class with optional methods that MUST appear after the __ptr and __size fields:

class some_name
{
   public:
   Type *__ptr;
   int __size;
   [[static const] int __offset [= ...];]
   method1;
   method2;
   ... // any fields that follow will be ignored
};

To encode the data type as an array, the name of the struct or class SHOULD NOT have a namespace prefix, otherwise the data type will be encoded and decoded as a generic vector, see Section 11.11.7.
The deserializer of a dynamic array can decode partially transmitted and/or SOAP sparse arrays, and even multi-dimensional arrays which will be collapsed into a one-dimensional array with row-major ordering.
Caution: SOAP 1.2 does not support partially transmitted arrays. So the __offset field of a dynamic array is ignored.

11.11.3  Example

The following example header file specifies the XMethods Service Listing service getAllSOAPServices service operation and an array of SOAPService data structures:

// Contents of file "listing.h":
class ns3__SOAPService
{
   public:
   int ID;
   char *name;
   char *owner;
   char *description;
   char *homepageURL;
   char *endpoint;
   char *SOAPAction;
   char *methodNamespaceURI;
   char *serviceStatus;
   char *methodName;
   char *dateCreated;
   char *downloadURL;
   char *wsdlURL;
   char *instructions;
   char *contactEmail;
   char *serverImplementation;
};
class ServiceArray
{
   public:
   ns3__SOAPService *__ptr; // points to array elements
   int __size; // number of elements pointed to
   ServiceArray();
   ~ServiceArray();
   void print();
};
int ns__getAllSOAPServices(ServiceArray &return_);

An example client application:

#include "soapH.h" ...
// ServiceArray class method implementations:
ServiceArray::ServiceArray()
{
   __ptr = NULL;
   __size = 0;
}
ServiceArray::~ServiceArray()
{ // destruction handled by gSOAP
}
void ServiceArray::print()
{
   for (int i = 0; i < __size; i++)
      cout << __ptr[i].name << ": " << __ptr[i].homepage << endl;
}
...
// Request a service listing and display results:
{
   struct soap soap;
   ServiceArray result;
   const char *endpoint = "www.xmethods.net:80/soap/servlet/rpcrouter";
   const char *action = "urn:xmethodsServicesManager#getAllSOAPServices";
   ...
   soap_init(&soap);
   soap_call_ns__getAllSOAPServices(&soap, endpoint, action, result);
   result.print();
   ...
   soap_destroy(&soap); // dealloc class instances
   soap_end(&soap); // dealloc deserialized data
   soap_done(&soap); // cleanup and detach soap struct
}

11.11.4  One-Dimensional Dynamic SOAP Arrays With Non-Zero Offset

The declaration of a dynamic array as described in 11.11 MAY include an int __offset field. When set to an integer value, the serializer of the dynamic array will use this field as the start index of the array and the SOAP array offset attribute will be used in the SOAP payload. Note that array offsets is a SOAP 1.1 specific feature which is not supported in SOAP 1.2.
For example, the following header file declares a mathematical Vector class, which is a dynamic array of floating point values with an index that starts at 1:

// Contents of file "vector.h":
typedef float xsd__float;
class Vector
{
   xsd__float *__ptr;
   int __size;
   int __offset;
   Vector();
   Vector(int n);
   float& operator[](int i);
}

The implementations of the Vector methods are:

Vector::Vector()
{
   __ptr = NULL;
   __size = 0;
   __offset = 1;
}
Vector::Vector(int n)
{
   __ptr = (float*)malloc(n*sizeof(float));
   __size = n;
   __offset = 1;
}
Vector::~Vector()
{
   if (__ptr)
      free(__ptr);
}
float& Vector::operator[](int i)
{
   return __ptr[i-__offset];
}

An example program fragment that serializes a vector of 3 elements:

struct soap soap;
soap_init(&soap);
Vector v(3);
v[1] = 1.0;
v[2] = 2.0;
v[3] = 3.0;
soap_begin(&soap);
v.serialize(&soap);
v.put("vec");
soap_end(&soap);

The output is a partially transmitted array:

<vec xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="xsd:float[4]" SOAP-ENC:offset="[1]">
<item xsi:type="xsd:float">1.0</item>
<item xsi:type="xsd:float">2.0</item>
<item xsi:type="xsd:float">3.0</item>
</vec>

Note that the size of the encoded array is necessarily set to 4 and that the encoding omits the non-existent element at index 0.
The decoding of a dynamic array with an __offset field is more efficient than decoding a dynamic array without an __offset field, because the __offset field will be assigned the value of the SOAP-ENC:offset attribute instead of padding the initial part of the array with default values.

11.11.5  Nested One-Dimensional Dynamic SOAP Arrays

One-dimensional dynamic arrays MAY be nested. For example, using class Vector declared in the previous section, class Matrix is declared:

// Contents of file "matrix.h":
class Matrix
{
   public:
   Vector *__ptr;
   int __size;
   int __offset;
   Matrix();
   Matrix(int n, int m);
   ~Matrix();
   Vector& operator[](int i);
};

The Matrix type is essentially an array of pointers to arrays which make up the rows of a matrix. The encoding of the two-dimensional dynamic array in SOAP will be in nested form.

11.11.6  Multi-Dimensional Dynamic SOAP Arrays

The general form of the struct declaration for K-dimensional (K > 1) dynamic arrays is:

struct some_name
{
   Type *__ptr;
   int __size[K];
   int __offset[K];
   ... // anything that follows here will be ignored
};

where Type MUST be a type associated with an XML Schema, which means that it must be a typedefed type in case of a primitive type, or a struct/class name with a namespace prefix for schema association, or another dynamic array. If these conditions are not met, a generic vector XML (de)serialization is used (see Section 11.11.7).
An alternative is to use a class with optional methods:

class some_name
{
   public:
   Type *__ptr;
   int __size[K];
   int __offset[K];
   method1;
   method2;
   ... // any fields that follow will be ignored
};

In the above, K is a constant denoting the number of dimensions of the multi-dimensional array.
To encode the data type as an array, the name of the struct or class SHOULD NOT have a namespace prefix, otherwise the data type will be encoded and decoded as a generic vector, see Section 11.11.7.
The deserializer of a dynamic array can decode partially transmitted multi-dimensional arrays.
For example, the following declaration specifies a matrix class:

typedef double xsd__double;
class Matrix
{
   public:
   xsd__double *__ptr;
   int __size[2];
   int __offset[2];
};

In contrast to the matrix class of Section 11.11.5 that defined a matrix as an array of pointers to matrix rows, this class has one pointer to a matrix stored in row-major order. The size of the matrix is determined by the __size field: __size[0] holds the number of rows and __size[1] holds the number of columns of the matrix. Likewise, __ offset[0] is the row offset and __offset[1] is the columns offset.

11.11.7  Encoding XML Generics Containing Dynamic Arrays

The XML "generics" concept discussed in the SOAP encoding protocols extends the concept of a SOAP struct by allowing repetitions of elements within the struct. This is just a form of a repetition of XML elements without the SOAP-encoded array requirements. While SOAP-encoded arrays are more expressive (offset information to encode sparse arrays for example), simple repetitions of values are used more frequently.
A simple generic reperition is an array-like data structure with a repetition of an element. To achieve this, declare a dynamic array as a struct or class with a name that is qualified with a namespace prefix. SOAP arrays are declared without prefix.
For example, we define a Map structure that contains a sequence of pairs of key-val:

struct ns__Map
{
   int __size; // number of pairs
   struct ns__Binding {char *key; char *val;} *pair;
};

Since 2.7.16 it is also possible to use a '$' as a special marker to annotate a size field that must be of type int or size_t and the field name is no longer relevant:

struct ns__Map
{
   $int length; // number of pairs
   struct ns__Binding {char *key; char *val;} *pair;
};

This declares a dynamic array pointed to by pair and size __size. The array will be serialized and deserialized as a sequence of pairs:

<ns:Map xsi:type="ns:Map">
<pair xsi:type="ns:Binding">
<key>Joe</key>
<val>555 77 1234</val>
</pair>
<pair xsi:type="ns:Binding">
<key>Susan</key>
<val>555 12 6725</val>
</pair>
<pair xsi:type="ns:Binding">
<key>Pete</key>
<val>555 99 4321</val>
</pair>
</ns:Map>

Deserialization is less efficient compared to a SOAP-encoded array, because the size of the sequence is not part of the SOAP encoding. Internal buffering is used by the deserializer to collect the elements. When the end of the list is reached, the buffered elements are copied to a newly allocated space on the heap for the dynamic array.
Multiple arrays can be used in a struct/class to support the concept of "generics". Each array results in a repetition of elements in the struct/class. This is achieved with a int __size (or $int) field in the struct/class where the next field (i.e. below the __size field) is a pointer type. The pointer type is assumed to point to an array of values at run time. The __size field holds the number of values at run time. Multiple arrays can be embedded in a struct/class with __size fields that have a distinct names. To make the __size fields distinct, you can end them with a unique name suffix such as __sizeOfstrings, for example.
The general convention for embedding arrays is:

struct ns__SomeStruct
{
   ...
   int __sizename1; // number of elements pointed to
   Type1 *field1; // by this field
   ...
   int __sizename2; // number of elements pointed to
   Type2 *field2; // by this field
   ...
};

where name1 and name2 are identifiers used as a suffix to distinguish the __size field. These names can be arbitrary and are not visible in XML.
In 2.7.16 and higher this is simplified with a '$' marker:

struct ns__SomeStruct
{
   ...
   $int name1; // number of elements pointed to
   Type1 *field1; // by this field
   ...
   $int name2; // number of elements pointed to
   Type2 *field2; // by this field
   ...
};

For example, the following struct has two embedded arrays:

struct ns__Contact
{
   char *firstName;
   char *lastName;
   $intnPhones; // number of Phones
   ULONG64 *phoneNumber; // array of phone numbers
   $intnEmails; // number of emails
   char **emailAddress; // array of email addresses
   char *socSecNumber;
};

The XML serialization of an example ns__Contact is:

<mycontact xsi:type="ns:Contact">
   <firstName>Joe</firstName>
   <lastName>Smith</lastName>
   <phoneNumber>5551112222</phoneNumber>
   <phoneNumber>5551234567</phoneNumber>
   <phoneNumber>5552348901</phoneNumber>
   <emailAddress>Joe.Smith@mail.com</emailAddress>
   <emailAddress>Joe@Smith.com</emailAddress>
   <socSecNumber>999999999</socSecNumber>
</mycontact>

11.11.8  STL Containers

gSOAP supports the STL containers std::deque, std::list, std::set, and std::vector.
STL containers can only be used within classes to declare members that contain multiple values. This is somewhat similar to the embedding of arrays in structs in C as explained in Section 11.11.7, but the STL container approach is more flexible.
You need to import stldeque.h, stllist.h, stlset.h, or stlvector.h to enable std::deque, std::list, std::set, and std::vector (de)serialization. Here is an example:

#import "stlvector.h"
class ns__myClass
{ public:
   std::vector < int > *number;
   std::vector < xsd__string > *name;
   ...
};

The use of pointer members is not required but advised. The reason is that interoperability with other SOAP toolkits may lead to copying of ns__ myClass instances at run time when (de)serializing multi-referenced data. When a copy is made, certain parts of the containers will be shared between the copies which could lead to disaster when the classes with their containers are deallocated. Another way to avoid this is to declare class ns__myClass within other data types via a pointer. (Interoperability between gSOAP clients and services does not lead to copying.)
The XML Schema that corresponds to the ns__myClass type is

<complexType name="myClass">
   <sequence>
      <element name="number" type="xsd:int" minOccurs="1" maxOccurs="unbounded"/>
      <element name="name" type="xsd:string" minOccurs="1" maxOccurs="unbounded"/>
      ...
   </sequence>
</complexType>

You can specify the minOccurs and maxOccurs values as explained in Section 19.2.
You can also implement your own containers similar to STL containers. The containers must be class templates and should define a forward iterator type, and provide the following methods:
  • void clear() empty the container;
  • iterator begin() return iterator to beginning;
  • const_iterator begin() const return const iterator to beginning;
  • iterator end() return iterator to end;
  • const_iterator end() const return const iterator to end;
  • size_t size() return size;
  • iterator insert(iterator pos, const_reference val) insert element.
The iterator should be a forward iterator with a dereference operator to access the container's elements, it must be comparable (equal/unequal), and be pre-incrementable (++it). The const iterator is used by gSOAP to send a sequence of XML element values. The insert method is used to populate a container with Container::iterator i = container.insert(container.end(), val).
Here is in example user-defined container template class:

// simple_vector.h
template <class T>
class simple_vector
{
public:
   typedef T value_type;
   typedef value_type * pointer;
   typedef const value_type * const_pointer;
   typedef value_type & reference;
   typedef const value_type & const_reference;
   typedef pointer iterator;
   typedef const_pointer const_iterator;
protected:
   iterator head;
   iterator tail;
   size_t capacity;
public:
   simple_vector() { head = tail = NULL; }
   simple_vector(const simple_vector& v)
   { operator=(v); }
   ~simple_vector() { if (head) delete[] head; }
   void clear() { tail = head; }
/* the member functions below are required for (de)serialization of templates */
   iterator begin() { return head; }
   const_iterator begin() const { return head; }
   iterator end() { return tail; }
   const_iterator end() const { return tail; }
   size_t size() const { return tail - head; }
   iterator insert(iterator pos, const_reference val)
   {
      if (!head)
         head = tail = new value_type[capacity = 1];
      else if (tail >= head + capacity)
      {
         iterator i = head;
         iterator j = new value_type[capacity *= 2];
         iterator k = j;
         while (i < tail)
            *k++ = *i++;
         if (pos)
            pos = j + (pos - head);
         tail = j + (tail - head);
         delete[] head;
         head = j;
      }
      if (pos && pos >= head && pos < tail)
      {
         iterator i = tail;
         iterator j = i - 1;
         while (j != pos)
            *i- = *j-;
         *pos = val;
      }
      else 
      {
         pos = tail;
         *tail++ = val;
      }
      return pos;
   }
   simple_vector& operator=(const simple_vector& v)
   {
      head = tail = NULL;
      capacity = v.capacity;
      if (v.head)
      {
         head = tail = new value_type[capacity];
         iterator i = v.head;
         while (i != v.tail)
            *tail++ = *i++;
      }
      return *this;
   }
};

To enable the container, we add the following two lines to our gSOAP header file:

#include "simpleVector.h"
template  < class T > class simpleVector;

The container class should not be defined in the gSOAP header file. It must be defined in a separate header file (e.g. "simpleVector.h"). The template  < class T > class simpleVector declaration ensures that gSOAP will recognize simpleVector as a container class.
Caution: when parsing XML content the container elements may not be stored in the same order given in the XML content. When gSOAP parses XML it uses the insert container methods to store elements one by one. However, element content that is "forwarded" with href attributes will be appended to the container. Forwarding can take place with multi-referenced data that is referred to from the main part of the SOAP 1.1 XML message to the independent elements that carry ids. Therefore, your application should not rely on the preservation of the order of elements in a container.

11.11.9  Polymorphic Dynamic Arrays and Lists

Polymorphic arrays (arrays of polymorphic element types) can be encoded when declared as an array of pointers to class instances. For example:

class ns__Object
{
   public:
   ...
};
class ns__Data: public ns__Object
{
   public:
   ...
};
class ArrayOfObject
{
   public:
   ns__Object **__ptr; // pointer to array of pointers to Objects
   int __size; // number of Objects pointed to
   int __offset; // optional SOAP 1.1 array offset
};
class ns__Objects
{
   public:
   std::vector < ns__Object* > objects; // vector of pointers to objects
};

The pointers in the array can point to the ns__Object base class or ns__Data derived class instances which will be serialized and deserialized accordingly in SOAP. That is, the array elements are polymorphic.
Since we can't use dynamic binding to support polymorphism in C, another mechanism is available based on the serialization of void pointers, that is, dynamic serialization of data referenced by void pointers, see Section 11.9.

struct __wrapper
{
   int __type; // type T represented by SOAP_TYPE_T
   void *__item; // pointer to data of type T
};
struct ArrayOfObject
{
   struct __wrapper __ptr; // pointer to array of pointers to Objects
   int __size; // number of Objects pointed to
   int __offset; // optional SOAP 1.1 array offset
};
struct ns__Objects
{
   int __size;
   struct __wrapper *objects; // array of pointers to wrapped types
};

11.11.10  How to Change the Tag Names of the Elements of a SOAP Array or List

The __ptr field in a struct or class declaration of a dynamic array may have an optional suffix part that describes the name of the tags of the SOAP array XML elements. The suffix is part of the field name:

Type *__ptrarray_elt_name

The suffix describes the tag name to be used for all array elements. The usual identifier to XML translations apply, see Section 10.3. The default XML element tag name for array elements is item (which corresponds to the use of field name __ptritem).
Consider for example:

struct ArrayOfstring
{
   xsd__string *__ptrstring;    int __size; };

The array is serialized as:

<array xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="xsd:string[2]">
<string xsi:type="xsd:string">Hello</string>
<string xsi:type="xsd:string">World</string>
</array>

SOAP 1.1 and 1.2 do not require the use of a specific tag name for array elements. gSOAP will deserialize a SOAP array while ignoring the tag names. Certain XML Schemas used in doc/literal encoding may require the declaration of array element tag names.

11.12  Base64Binary XML Schema Type Encoding

The base64Binary XML Schema type is a special form of dynamic array declared with a pointer (__ptr) to an unsigned char array.
For example using a struct:

struct xsd__base64Binary
{
   unsigned char *__ptr;
   int __size;
};

Or with a class:

class xsd__base64Binary
{
   public:
   unsigned char *__ptr;
   int __size;
};

When compiled by the gSOAP soapcpp2 tool, this header file specification will generate base64Binary serializers and deserializers.
The SOAP_ENC:base64 encoding is another type for base 64 binary encoding specified by the SOAP data type schema and some SOAP applications may use this form (as indicated by their WSDL descriptions). It is declared by:

struct SOAP_ENC__base64
{
   unsigned char *__ptr;
   int __size;
};

Or with a class:

class SOAP_ENC__base64
{
   unsigned char *__ptr;
   int __size;
};

When compiled by the gSOAP soapcpp2 tool, this header file specification will generate SOAP-ENC:base64 serializers and deserializers.
The advantage of using a class is that methods can be used to initialize and manipulate the __ptr and __size fields. The user can add methods to this class to do this. For example:

class xsd__base64Binary
{
   public:
   unsigned char *__ptr;
   int __size;
   xsd__base64Binary(); // Constructor
   xsd__base64Binary(struct soap *soap, int n); // Constructor
   ~xsd__base64Binary(); // Destructor
   unsigned char *location(); // returns the memory location
   int size(); // returns the number of bytes
};

Here are example method implementations:

xsd__base64Binary::xsd__base64Binary()
{
   __ptr = NULL;
   __size = 0;
}
xsd__base64Binary::xsd__base64Binary(struct soap *soap, int n)
{
   __ptr = (unsigned char*)soap_malloc(soap, n);
   __size = n;
}
xsd__base64Binary::~xsd__base64Binary()
{ }
unsigned char *xsd__base64Binary::location()
{
   return __ptr;
}
int xsd__base64Binary::size()
{
   return __size;
}

The following example in C/C++ reads from a raw image file and encodes the image in SOAP using the base64Binary type:

...
FILE *fd = fopen("image.jpg", "rb");
xsd__base64Binary image(&soap, filesize(fd));
fread(image.location(), image.size(), 1, fd);
fclose(fd);
soap_begin_send(&soap);
image.soap_serialize(&soap);
image.soap_put(&soap, "jpegimage", NULL);
soap_end_send(&soap);
...

where filesize is a function that returns the size of a file given a file descriptor.
Reading the xsd:base64Binary encoded image.

...
xsd__base64Binary image;
soap_begin_recv(&soap);
image.get(&soap, "jpegimage");
soap_end_recv(&soap);
...

The struct or class name soap_enc__base64 should be used for SOAP-ENC:base64 schema type instead of xsd__base64Binary.

11.13  hexBinary XML Schema Type Encoding

The hexBinary XML Schema type is a special form of dynamic array declared with the name xsd__hexBinary and a pointer (__ptr) to an unsigned char array, similar to the base64Binary type described in the previous section. The only difference with the base64Binary type is the hexadecimal content instead of base64 content. Both types are declared identically, with the exception that the word "hex" occurs in the struct/class name.
For example, using a struct:

struct xsd__hexBinary
{
   unsigned char *__ptr;
   int __size;
};

Or using a class:

class xsd__hexBinary
{
   public:
   unsigned char *__ptr;
   int __size;
};

or if a binary type such as xsd__base64Binary is defined, then we can simply use a typedef to introduce the hex variant:

class xsd__base64Binary // serializes into base64 content
{
   public:
   unsigned char *__ptr;
   int __size;
};
typedef xsd__base64Binary xsd__hexBinary; // serializes into hex content

When compiled by the gSOAP soapcpp2 tool, this header file specification will generate hexBinary serializers and deserializers.

11.14  Literal XML Encoding Style

gSOAP supports document/literal encoding by default. Just as with SOAP RPC encoding, literal encoding requires the XML Schema of the message data to be provided e.g. in WSDL in order for the gSOAP soapcpp2 compiler to generate the (de)serialization routines.
The //gsoap service encoding, //gsoap service method-encoding, and //gsoap service method-response-encoding directives explicitly enable SOAP encoded or literal encoded messages. For example, to enable RPC encoding style for the entire service, use:

//gsoap ns service encoding: encoded

To enable encoding for particular service methods, use:

//gsoap ns service method-encoding: myMethod encoded
int ns__myMethod(...)

To enable encoding for particular service methods responses when the method request is literal, use:

//gsoap ns service method-response-encoding: myMethod encoded
int ns__myMethod(...)

Instead of the encoded value, you can use literal, or a specific encoding style value.
Consider the following example that uses the directive to make the literal encoding explicit. The LocalTimeByZipCode service operation of the LocalTime service provides the local time given a zip code and uses literal encoding (with MS .NET). The following header file declares the method:

int LocalTimeByZipCode(char *ZipCode, char **LocalTimeByZipCodeResult);

Note that none of the data types need to be namespace qualified using namespace prefixes.

//gsoap ns service name: localtime
//gsoap ns service encoding: literal
//gsoap ns service namespace: http://alethea.net/webservices/
int ns__LocalTimeByZipCode(char *ZipCode, char **LocalTimeByZipCodeResult);

In this case, the method name requires to be associated with a schema through a namespace prefix, e.g. ns is used in this example. See Section 19.2 for more details on gSOAP directives. With these directives, the gSOAP soapcpp2 compiler generates client and server sources with the specified settings.
The example client program is:

#include "soapH.h"
#include "localtime.nsmap" // include generated map file
int main()
{
   struct soap soap;
   char *t;
   soap_init(&soap);
   if (soap_call_ns__LocalTimeByZipCode(&soap, "http://alethea.net/webservices/LocalTime.asmx", "http://alethea.net/webservices/LocalTimeByZipCode", "32306", &t))
      soap_print_fault(&soap, stderr);
   else
      printf("Time = %s\n", t);
   return 0;
}

To illustrate the manual doc/literal setting, the following client program sets the required properties before the call:

#include "soapH.h"
#include "localtime.nsmap" // include generated map file
int main()
{
   struct soap soap;
   char *t;
   soap_init(&soap);
   soap.encodingStyle = NULL; // don't use SOAP encoding
   soap_set_omode(&soap, SOAP_XML_TREE);" // don't produce multi-ref data (but can accept)
   if (soap_call_ns__LocalTimeByZipCode(&soap, "http://alethea.net/webservices/LocalTime.asmx", "http://alethea.net/webservices/LocalTimeByZipCode", "32306", &t))
      soap_print_fault(&soap, stderr);
   else
      printf("Time = %s\n", t);
   return 0;
}

The SOAP request is:

POST /webservices/LocalTime.asmx HTTP/1.0
Host: alethea.net
Content-Type: text/xml; charset=utf-8
Content-Length: 479
SOAPAction: "http://alethea.net/webservices/LocalTimeByZipCode"

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope
   xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
   xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:xsd="http://www.w3.org/2001/XMLSchema"
   <SOAP-ENV:Body>
      <LocalTimeByZipCode xmlns="http://alethea.net/webservices/">
<ZipCode>32306</ZipCode></LocalTimeByZipCode>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

11.14.1  Serializing and Deserializing Mixed Content XML With Strings

To declare a literal XML "type" to hold XML documents in regular strings, use:

typedef char *XML;

To declare a literal XML "type" to hold XML documents in wide character strings, use:

typedef wchar_t *XML;

Note: only one of the two storage formats can be used. The differences between the use of regular strings versus wide character strings for XML documents are:
  • Regular strings for XML documents MUST hold UTF-8 encoded XML documents. That is, the string MUST contain the proper UTF-8 encoding to exchange the XML document in SOAP messages.
  • Wide character strings for XML documents SHOULD NOT hold UTF-8 encoded XML documents. Instead, the UTF-8 translation is done automatically by the gSOAP runtime marshalling routines.
Here is a C++ example of a service operation specification in which the parameters of the service operation uses literal XML encoding to pass an XML document to a service and back:

typedef char *XML;
ns__GetDocument(XML m__XMLDoc, XML &m__XMLDoc_);

and in C:

typedef char *XML;
ns__GetDocument(XML m__XMLDoc, XML *m__XMLDoc_);

The ns__Document is essentially a struct that forms the root of the XML document. The use of the underscore in the ns__Document response part of the message avoids the name clash between the structs. Assuming that the namespace mapping table contains the binding of ns to http://my.org/ and the binding of m to http://my.org/mydoc.xsd, the XML message is:

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope
   xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
   xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:xsd="http://www.w3.org/2001/XMLSchema"
   xmlns:ns="http://my.org/"
   xmlns:m="http://my.org/mydoc.xsd"
   SOAP-ENV:encodingStyle="">
   <SOAP-ENV:Body>
      <ns:GetDocument>
         <XMLDoc xmlns="http://my.org/mydoc.xsd">
            ...
         </XMLDoc>
      </ns:Document>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

When using literal encoding of method parameters and response as shown in the example above, the literal XML encoding style MUST be specified by setting soap.encodingStyle. For example, to specify no constraints on the encoding style (which is typical) use NULL:

struct soap soap;
soap_init(&soap);
soap.encodingStyle = NULL;

As a result, the SOAP-ENV:encodingStyle attribute will not appear in the SOAP payload.
For interoperability with Apache SOAP, use

struct soap soap;
soap_init(&soap);
soap.encodingStyle = "http://xml.apache.org/xml-soap/literalxml";

When the response parameter is an XML type, it will store the entire XML response content but without the enveloping response element.
The XML type can be used as part of any data structure to enable the rendering and parsing of custom XML documents. For example:

typedef char *XML;
struct ns__Data /* data in namespace 'ns' */
{
   int number;
   char *name;
   XML m__document; /* XML document in default namespace 'm' */
};
ns__Example(struct ns__Data data, struct ns__ExampleResponse { struct ns__Data data; } *out);

12  SOAP Fault Processing

A predeclared standard SOAP Fault data structure is generated by the gSOAP soapcpp2 tool for exchanging exception messages. The built-in struct SOAP_ENV__Fault data structure is defined as:

struct SOAP_ENV__Fault
{
   _QName faultcode; // _QName is builtin
   char *faultstring;
   char *faultactor;
   struct SOAP_ENV__Detail *detail;
   struct SOAP_ENV__Code *SOAP_ENV__Code; // MUST be a SOAP_ENV__Code struct defined below
   char *SOAP_ENV__Reason;
   char *SOAP_ENV__Node;
   char *SOAP_ENV__Role;
   struct SOAP_ENV__Detail *SOAP_ENV__Detail; // SOAP 1.2 detail field
}; struct SOAP_ENV__Code
{
   _QName SOAP_ENV__Value;
   struct SOAP_ENV__Code *SOAP_ENV__Subcode; };
struct SOAP_ENV__Detail
{
   int __type; // The SOAP_TYPE_ of the object serialized as Fault detail
   void *fault; // pointer to the fault object, or NULL
   char *__any; // any other detail element content (stored in XML format)
};

The first four fields in SOAP_ENV__Fault are SOAP 1.1 specific. The last five fields are SOAP 1.2 specific. You can redefine these structures in the header file. For example, you can use a class for the SOAP_ENV__Fault and add methods for convenience.
The data structure content can be changed to the need of an application, but this is generally not necessary because the application-specific SOAP Fault details can be serialized via the __type and fault fields in the SOAP_ENV__Detail field, see Section 11.9 on the serialization of data refered to by __type and fault.
The __type field allows application data to be serialized as part of the SOAP Fault. The application data SHOULD be defined as XML elements, which requires you to declare the type names with a leading underscore to ensure that the types are compatible with XML elements and not just simpleTypes and complexTypes.
When the skeleton of a service operation returns an error (see Section 10.2), then soap.fault contains the SOAP Fault data at the receiving side (client).
Server-side faults are raised with soap_sender_fault or soap_receiver_fault. The soap_sender_fault call should be used to inform that the sender is at fault and the sender (client) should not resend the request. The soap_receiver_fault call should be used to indicate a temporary server-side problem, so a sender (client) can resend the request later. For example:

int ns1__myMethod(struct soap *soap, ...)
{
   ...
   return soap_receiver_fault(soap, "Resource temporarily unavailable", NULL); // return fault to sender
}

In the example, the SOAP Fault details were empty (NULL). You may pass an XML fragment, which will be literally included in the SOAP Fault message. For WS-I Basic Profile compliance, you must pass an XML string with one or more namespace qualified elements, such as:

return soap_receiver_fault(soap, "Resource temporarily unavailable", " < errorcode xmlns='http://tempuri.org' > 123 < /errorcode > < errorinfo xmlns='http://tempuri.org' > abc < /errorinfo > ");

When a service operation must raise an exception with application SOAP Fault details, it does so by assigning the soap.fault field of the current reference to the runtime context with appropriate data associated with the exception and by returning the error SOAP_FAULT. For example:

   soap_receiver_fault(soap, "Stack dump", NULL);
   if (soap->version == 2) // SOAP 1.2 is used
   {
      soap->fault->SOAP_ENV__Detail = (struct SOAP_ENV__Detail*)soap_malloc(soap, sizeof(struct SOAP_ENV__Detail);
      soap->fault->SOAP_ENV__Detail->__type = SOAP_TYPE_ns1__myStackDataType; // stack type
      soap->fault->SOAP_ENV__Detail->fault = sp; // point to stack
      soap->fault->SOAP_ENV__Detail->__any = NULL; // no other XML data
   }
   else 
   {
      soap->fault->detail = (struct SOAP_ENV__Detail*)soap_malloc(soap, sizeof(struct SOAP_ENV__Detail);
      soap->fault->detail->__type = SOAP_TYPE_ns1__myStackDataType; // stack type
      soap->fault->detail->fault = sp; // point to stack
      soap->fault->detail->__any = NULL; // no other XML data
   }
   return SOAP_FAULT; // return from service operation call

When soap_receiver_fault allocates a fault struct, this data is removed with the soap_end call (or soap_dealloc). Note that the soap_receiver_fault function is called to allocate the fault struct and set the fault string and detail fields, i.e. soap_receiver_fault(soap, "Stack dump", NULL). The advantage is that this is independent of SOAP 1.1 and SOAP 1.2. However, setting the custom detail fields requires inspecting the SOAP version used, using the soap->version attribute which is 1 for SOAP 1.1 and 2 for SOAP 1.2.
Each service operation implementation in a service application can return a SOAP Fault upon an exception by returning an error code, see Section 7.2.1 for details and an example. In addition, a SOAP Fault can be returned by a service application through calling the soap_send_fault function. This is useful in case the initialization of the application fails, as illustrated in the example below:

int main()
{
   struct soap soap;
   soap_init(&soap);
   some initialization code
   if (initialization failed)
   {
      soap.error = soap_receiver_fault(&soap, "Init failed", NULL); // set the error condition (SOAP_FAULT)
      soap_send_fault(&soap); // Send SOAP Fault to client
      return 0; // Terminate
   }
}

13  SOAP Header Processing

A predeclared standard SOAP Header data structure is generated by the gSOAP soapcpp2 tool for exchanging SOAP messages with SOAP Headers. This predeclared data structure is:

struct SOAP_ENV__Header { };

which declares and empty header (some C and C++ compilers don't accept empty structs, use compile flag -DWITH_NOEMPTYSTRUCT to avoid these errors).
To adapt the data structure to a specific need for SOAP Header processing, a new struct SOAP_ENV__Header can be added to the header file input to the gSOAP compiler. A class for the SOAP Header data structure can be used instead of a struct.
For example, the following header can be used for transaction control:

struct SOAP_ENV__Header
{ char *t__transaction;
};

with client-side code:

   struct soap soap;
   soap_init(&soap);
...
soap.header = NULL; // do not use a SOAP Header for the request (as set with soap_init)
soap.actor = NULL; // do not use an actor (receiver is actor)
soap_call_method(&soap, ...);
if (soap.header) // a SOAP Header was received
   cout << soap.header->t__transaction;
// Can reset, modify, or set soap.header here before next call
soap_call_method(&soap, ...); // reuse the SOAP Header of the service response for the request
...

The SOAP Web service response can include a SOAP Header with a transaction number that the client is supposed to use for the next service operation invocation to the service. Therefore, the next request includes a transaction number:

...
<SOAP-ENV:Envelope ...>
<SOAP-ENV:Header>
<transaction xmlns="..." xsi:type="int">12345</transaction>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
...
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

This is just an example and the transaction control is not a feature of SOAP but can be added on by the application layer to implement stateful transactions between clients and services. At the client side, the soap.actor attribute can be set to indicate the recipient of the header (the SOAP SOAP-ENV:actor attribute).
A Web service can read and set the SOAP Header as follows:

int main()
{
   struct soap soap;
   soap.actor = NULL; // use this to accept all headers (default)
   soap.actor = "http://some/actor"; // accept headers destined for "http://some/actor" only
   soap_serve(&soap);
}
...
int method(struct soap *soap, ...)
{
   if (soap->header) // a Header was received
      ... = soap->header->t__transaction;
   else 
      soap->header = soap_malloc(sizeof(struct SOAP_ENV__Header)); // alloc new header
...       soap->header->t__transaction = ...;
   return SOAP_OK;
}

See Section 19.2 on how to generate WSDL with the proper method-to-header-part bindings.
The SOAP-ENV:mustUnderstand attribute indicates the requirement that the recipient of the SOAP Header (who must correspond to the SOAP-ENV:actor attribute when present or when the attribute has the value SOAP-ENV:actor="http://schemas.xmlsoap.org/soap/actor/next") MUST handle the Header part that carries the attribute. gSOAP handles this automatically on the background. However, an application still needs to inspect the header part's value and handle it appropriately. If a service operation in a Web service is not able to do this, it should return SOAP_MUSTUNDERSTAND to indicate this failure.
The syntax for the header file input to the gSOAP soapcpp2 compiler is extended with a special storage qualifier mustUnderstand. This qualifier can be used in the SOAP Header declaration to indicate which parts should carry a SOAP-ENV:mustUnderstand="1" attribute. For example:

struct SOAP_ENV__Header
{
   char *t__transaction;
   mustUnderstand char *t__authentication;
};

When both fields are set and soap.actor="http://some/actor" then the message contains:

<SOAP-ENV:Envelope ...>
<SOAP-ENV:Header>
<transaction xmlns="...">5</transaction>
<authentication xmlns="..."
   SOAP-ENV:actor="http://some/actor" SOAP-ENV:mustUnderstand="1">XX
</authentication>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
...
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

14  MIME Attachments

The gSOAP toolkit supports MIME attachments as per SOAP with Attachments (SwA) specification (http://www.w3.org/TR/SOAP-attachments). In the following discussion, MIME attachment data is assumed to be resident in memory for sending operations and MIME attachments received will be stored in memory. MTOM and DIME attachments on the other hand can be streamed and therefore MTOM/DIME attachment data does not need to be stored in memory, see Section 15 and 16.
Transmitting multipart/related MIME attachments with a SOAP/XML message is accomplished with two functions, soap_set_mime and soap_set_mime_attachment. The first function is for initialization purposes and the latter function is used to specify meta data and content data for each attachment.

14.1  Sending a Collection of MIME Attachments (SwA)

The following functions should be used to set up a collection of multipart/related MIME attachments for transmission with a SOAP/XML message.

Function
void soap_set_mime(struct soap *soap, const char *boundary, const char *start)
This function must be called first to initialize MIME attachment send operations (receives are automatic). The function specifies a MIME boundary and start content ID used for the SOAP message body. When boundary is NULL, an appropriate MIME boundary will be choosen (important: boundaries cannot occur in the SOAP/XML message and cannot occur in any of the MIME attachments content). When a specific boundary value is provided, gSOAP will NOT verify that the boundary is valid. When start is NULL, the start ID of the SOAP message is <SOAP-ENV:Envelope>.
int soap_set_mime_attachment(struct soap *soap, char *ptr, size_t size, enum soap_mime_encoding encoding, const char *type, const char *id, const char *location, const char *description)
This function adds a new attachment to the list of attachments, where ptr and size refer to the block of memory that holds the attachment data. The encoding parameter specifies the content encoding of this block, where the value of encoding is one of SOAP_MIME_7BIT, SOAP_MIME_8BIT, SOAP_MIME_BINARY, SOAP_MIME_QUOTED_PRINTABLE, SOAP_MIME_BASE64, SOAP_MIME_IETF_TOKEN, or SOAP_MIME_X_TOKEN. These constants reflect the content encoding defined in RFC2045 and you MUST adhere to the content encoding rules defined by RFC2045. When in doubt, use SOAP_MIME_BINARY, since this encoding type covers any content. The mandatory type string parameter is the MIME type of the data. The id string parameter is the content ID of the MIME attachment. The optional location string parameter is the content location of the attachment. The optional description string parameter holds a textual description of the attachment (it may not contain any control characters). All parameter values are copied, except ptr which must point to a valid location of the attachment data during the transfer. The value SOAP_OK is returned when the attachment was added. Otherwise a gSOAP error code is returned.
void soap_clr_mime(struct soap *soap)
Disables MIME attachments, e.g. to avoid MIME attachments to be part of a SOAP Fault response message.

When providing a MIME boundary with soap_set_mime, you have to make sure the boundary cannot match any SOAP/XML message content. Or you can simply pass NULL and let gSOAP select a safe boundary for you.
The internal list of attachments is destroyed with soap_end, you should call this function sometime after the message exchange was completed (the content of the block of memory referred to by the ptr parameter is unaffected).
The following example shows how a multipart/related HTTP message with three MIME attachments is set up and transmitted to a server. The first attachment contains the SOAP message. The second and third attachments contain image data. In this example we let the SOAP message body refer to the attachments using href attributes. The struct claim__form data type includes a definition of a href attribute for this purpose.

struct claim__form form1, form2;
form1.href = "cid:claim061400a.tiff@claiming-it.com";
form2.href = "cid:claim061400a.jpeg@claiming-it.com";
/* initialize and enable MIME */
soap_set_mime(soap, "MIME_boundary", "<claim061400a.xml@claiming-it.com>");
/* add a base64 encoded tiff image (tiffImage points to base64 data) */
soap_set_mime_attachment(soap, tiffImage, tiffLen, SOAP_MIME_BASE64, "image/tiff",
         "<claim061400a.tiff@claiming-it.com>", NULL, NULL);
/* add a raw binary jpeg image (jpegImage points to raw data) */
soap_set_mime_attachment(soap, jpegImage, jpegLen, SOAP_MIME_BINARY, "image/jpeg",
         "<claim061400a.jpeg@claiming-it.com>", NULL, NULL);
/* send the forms as MIME attachments with this invocation */
if (soap_call_claim__insurance_claim_auto(soap, form1, form2, ...))
   // an error occurred
else
   // process response

Note: the above example assumes that the boundary MIME_boundary does not match any part of the SOAP/XML message.
The claim__form struct is declared in the gSOAP header file as:

struct claim__form
{ @char *href;
};

This data type defines the parameter data of the operation. The claim forms in the SOAP/XML message consist of hrefs to the claim forms attached. The produced message is similar to the last example shown in the SOAP with Attachments specification (http://www.w3.org/TR/SOAP-attachments). Note that the use of href or other attributes for referring to the MIME attachments is optional according to the SwA standard.
To associate MIME attachments with the request and response of a service operation in the generated WSDL, please see Section 16.1.
The server-side code to transmit MIME attachments back to a client is similar:

int claim__insurance_claim_auto(struct soap *soap, ...)
{
   soap_set_mime(soap, NULL, NULL); // enable MIME
   // add a HTML document (htmlDoc points to data, where the HTML doc is stored in compliance with 7bit encoding RFC2045)
   if (soap_set_mime_attachment(soap, htmlDoc, strlen(htmlDoc), SOAP_MIME_7BIT, "text/html",
         "<claim061400a.html@claiming-it.com>", NULL, NULL))
   {
      soap_clr_mime(soap); // don't want fault with attachments
      return soap->error;
   }
   return SOAP_OK;
}

It is also possible to attach data to a SOAP fault message.
Caution: DIME in MIME is supported. However, gSOAP will not verify whether the MIME boundary is present in the DIME attachments and therefore will not select a boundary that is guaranteed to be unique. Therefore, you must provide a MIME boundary with soap_set_mime that is unique when using DIME in MIME.

14.2  Retrieving a Collection of MIME Attachments (SwA)

MIME attachments are automatically parsed and stored in memory. After receiving a set of MIME attachments, either at the client-side or the server-side, the list of MIME attachments can be traversed to extract meta data and the attachment content. The first attachment in the collection of MIME attachments always contains meta data about the SOAP message itself (because the SOAP message was processed the attachment does not contain any useful data).
To traverse the list of MIME attachments in C, you use a loop similar to:

struct soap_multipart *attachment;
for (attachment = soap.mime.list; attachment; attachment = attachment->next)
{
   printf("MIME attachment:\n");
   printf("Memory=%p\n", (*attachment).ptr);
   printf("Size=%ul\n", (*attachment).size);
   printf("Encoding=%d\n", (int)(*attachment).encoding);
   printf("Type=%s\n", (*attachment).type?(*attachment).type:"null");
   printf("ID=%s\n", (*attachment).id?(*attachment).id:"null");
   printf("Location=%s\n", (*attachment).location?(*attachment).location:"null");
   printf("Description=%s\n", (*attachment).description?(*attachment).description:"null");
}

C++ programmers can use an iterator instead, as in:

for (soap_multipart::iterator attachment = soap.mime.begin(); attachment != soap.mime.end(); ++attachment)
{
   cout << "MIME attachment:" << endl;
   cout << "Memory=" << (void*)(*attachment).ptr << endl;
   cout << "Size=" << (*attachment).size << endl;
   cout << Ëncoding=" << (*attachment).encoding << endl;
   cout << "Type=" << ((*attachment).type?(*attachment).type:"null") << endl;
   cout << "ID=" << ((*attachment).id?(*attachment).id:"null") << endl;
   cout << "Location=" << ((*attachment).location?(*attachment).location:"null") << endl;
   cout << "Description=" << ((*attachment).description?(*attachment).description:"null") << endl;
}

Note: keep in mind that the first attachment is associated with the SOAP message and you may want to ignore it.
A call to soap_end removes all of the received MIME data. To preserve an attachment in memory, use soap_unlink on the ptr field of the soap_multipart struct. Recall that the soap_unlink function is commonly used to prevent deallocation of deserialized data.

15  DIME Attachments

The gSOAP toolkit supports DIME attachments as per DIME specification, see http://msdn.microsoft.com/library/en-us/dnglobspec/html/draft-nielsen-dime-02.txt
Applications developed with gSOAP can transmit binary DIME attachments with or without streaming messages. Without streaming, all data is stored and retrieved in memory, which can be prohibitive when transmitting large files on small devices. The maximum DIME attachment size is limited to 8 MB by default as set with SOAP_MAXDIMESIZE in stdsoap2.h. In contrast, with DIME streaming, data handlers are used to pass the data to and from a resource, such as a file or device. With DIME output streaming, raw binary data is send from a data source in chunks on the fly without buffering the entire content to save memory. With DIME input streaming, raw binary data will be passed to data handlers (callbacks).

15.1  Sending a Collection of DIME Attachments

The following functions can be used to explicitly set up a collection of DIME attachments for transmission with a SOAP/XML message body. The attachments can be streamed, as described in Section 15.4. Without streaming, each attachment must refer to a block of data in memory.

Function
void soap_set_dime(struct soap *soap)
This function must be called first to initialize DIME attachment send operations (receives are automatic).
int soap_set_dime_attachment(struct soap *soap, char *ptr, size_t size, const char *type, const char *id, unsigned short optype, const char *option)
This function adds a new attachment to the list of attachments, where ptr and size refer to the block of memory that holds the attachment data (except when DIME streaming callback handlers are used as described in Section 15.4. The type string parameter is the MIME type of the data. The id string parameter is the content ID of the DIME attachment. The option string parameter holds optional text (gSOAP supports DIME options, but it can send only one) and optype is a user-defined option type (as per DIME option specification format). All parameter values are copied, except ptr. The value SOAP_OK is returned when the attachment was added. Otherwise a gSOAP error code is returned.
void soap_clr_dime(struct soap *soap)
Disables DIME attachments, unless the serialized SOAP message contains attachments for transmission.

These functions allow DIME attachments to be added without requiring message body references. This is also referred to as the open DIME attachment style. The closed attachment style requires all DIME attachments to be referenced from the SOAP message body with href (or similar) references. For the closed style, gSOAP supports an automatic binary data serialization method, see Section 15.3.

15.2  Retrieving a Collection of DIME Attachments

DIME attachments are automatically parsed and stored in memory (or passed to the streaming handlers, when applicable). After receiving a set of DIME attachments, either at the client-side or the server-side, the list of DIME attachments can be traversed to extract meta data and the attachment content.
To traverse the list of DIME attachments in C, you use a loop similar to:

struct soap_multipart *attachment;
for (attachment = soap.dime.list; attachment; attachment = attachment->next)
{
   printf("DIME attachment:\n");
   printf("Memory=%p\n", (*attachment).ptr);
   printf("Size=%ul\n", (*attachment).size);
   printf("Type=%s\n", (*attachment).type?(*attachment).type:"null");
   printf("ID=%s\n", (*attachment).id?(*attachment).id:"null");
}

C++ programmers can use an iterator instead, as in:

for (soap_multipart::iterator attachment = soap.dime.begin(); attachment != soap.dime.end(); ++attachment)
{
   cout << "DIME attachment:" << endl;
   cout << "Memory=" << (void*)(*attachment).ptr << endl;
   cout << "Size=" << (*attachment).size << endl;
   cout << "Type=" << ((*attachment).type?(*attachment).type:"null") << endl;
   cout << "ID=" << ((*attachment).id?(*attachment).id:"null") << endl;
}

The options field is available as well. The options content is formatted according to the DIME specification: the first two bytes are reserved for the option type, the next two bytes store the size of the option data, followed by the (binary) option data.
A call to soap_end removes all of the received DIME data. To preserve an attachment in memory, use soap_unlink on the ptr field of the soap_multipart struct. Recall that the soap_unlink function is commonly used to prevent deallocation of deserialized data.

15.3  Serializing Binary Data in DIME

Binary data stored in extended xsd:base64Binary and xsd:hexBinary types can be serialized and deserialized as DIME attachments. These attachments will be transmitted prior to the sequence of secondary DIME attachments defined by the user with soap_set_dime_attachment as explained in the previous section. The serialization process is automated and DIME attachments will be send even when soap_set_dime or soap_set_dime_attachment are not used.
The xsd:base64Binary XSD type is defined in gSOAP as a struct or class by

struct xsd__base64Binary
{
   unsigned char *__ptr; // pointer to raw binary data
   int __size; // size of the block of data
};

To enable serialization of the data in DIME, we extend this type with three additional fields:

struct xsd__base64Binary
{
   unsigned char *__ptr;
   int __size;
   char *id;
   char *type;
   char *options;
};

The three additional fields consist of an id field for attachment referencing (typically a content id (CID) or UUID), a type field to specify the MIME type of the binary data, and an options field to piggy-back additional information with a DIME attachment. The order of the declaration of the fields is significant. In addition, no other fields or methods may be declared before any of these fields in the struct/class, but additional fields and methods may appear after the field declarations. An extended xsd__hexBinary declaration is similar.
The id and type fields contain text. The set the DIME-specific options field, you can use the soap_dime_option function:

char *soap_dime_option(struct soap *soap, unsigned short type, const char *option)

returns a string with this encoding. For example

struct xsd__base64Binary image;
image.__ptr = ...;
image.__size = ...;
image.id = "uuid:09233523-345b-4351-b623-5dsf35sgs5d6";
image.type = "image/jpeg";
image.options = soap_dime_option(soap, 0, "My wedding picture");

When either the id or type field values are non-NULL at run time, the data will be serialized as a DIME attachment. The SOAP/XML message refers to the attachments using href attributes. This generally works will with SOAP RPC, because href attributes are permitted. However, with document/literal style the referencing mechanism must be explicitly defined in the schema of the binary type. The gSOAP declaration of an extended binary type is

struct ns__myBinaryDataType
{
   unsigned char *__ptr;
   int __size;
   char *id;
   char *type;
   char *options;
};

C++ programmers can use inheritance instead of textual extension required in C, as in

class xsd__base64Binary
{
   unsigned char *__ptr;
   int __size;
};
class ns__myBinaryDataType : xsd__base64Binary
{
   char *id;
   char *type;
   char *options;
};

This defines an extension of xsd:base64Binary, such that the data can be serialized as DIME attachments using href attributes for referencing. When a different attribute name is in fact used, it must be explicitly defined:

//gsoap WSref schema import: http://schemas.xmlsoap.org/ws/2002/04/reference/
struct ns__myBinaryDataType
{
   unsigned char *__ptr;
   int __size;
   char *id;
   char *type;
   char *options;
   @char *WSref__location;
};

The example above uses the location attribute defined in the content reference schema, as defined in one of the vendor's specific WSDL extensions for DIME (http://www.gotdotnet.com/team/xml_wsspecs/dime/WSDL-Extension-for-DIME.htm).
When receiving DIME attachments, the DIME meta data and binary data content is stored in binary data types only when the XML parts of the message uses href attributes to refer to these attachments. The gSOAP toolkit may support automatic (de)serialization with other user-defined (or WSDL-defined) attributes in future releases.
Messages may contain binary data that references external resources not provided as attachments. In that case, the __ptr field is NULL and the id field refers to the external data source.
The dime_id_format attribute of the current gSOAP run-time context can be set to the default format of DIME id fields. The format string MUST contain a %d format specifier (or any other int-based format specifier). The value of this specifier is a non-negative integer, with zero being the value of the DIME attachment id for the SOAP message. For example,

struct soap soap;
soap_init(&soap);
soap.dime_id_format = "uuid:09233523-345b-4351-b623-5dsf35sgs5d6-%x";

As a result, all attachments with a NULL id field will use a gSOAP-generated id value based on the format string.
Caution: Care must be taken not to introduce duplicate content id values, when assigning content id values to the id fields of DIME extended binary data types. Content ids must be unique.

15.4  Streaming DIME

Streaming DIME is achieved with callback functions to fetch and store data during transmission. Three function callbacks for streaming DIME output and three callbacks for streaming DIME input are available.


Callback (function pointer)
void *(*soap.fdimereadopen)(struct soap *soap, void *handle, const char *id, const char *type, const char *options)
Called by the gSOAP run-time DIME attachment sender to start reading from a (binary) data source for outbound transmission. The content will be read from the application's data source in chunks using the fdimeread callback and streamed into the SOAP/XML/DIME output stream. The handle contains the value of the __ptr field of an attachment struct/class, which could be a pointer to specific information such as a file descriptor or a pointer to a string to be passed to this callback. Both __ptr and __size fields should have been set by the application prior to the serialization of the content. The id, type, and options arguments are the DIME id, type, and options, respectively. The callback should return handle, or another pointer value which will be passed as a handle to fdimeread and fdimereadclose. The callback should return NULL and set soap->error when an error occurred. The callback should return NULL (and not set soap->error) when this particular DIME attachment is not to be streamed.
size_t (*soap.fdimeread)(struct soap *soap, void *handle, char *buf, size_t len)
Called by the gSOAP run-time DIME attachment sender to read more data from a (binary) data source for streaming into the output stream. The handle contains the value returned by the fdimereadopen callback. The buf argument is the buffer of length len into which a chunk of data should be stored. The actual amount of data stored in the buffer may be less than len and this amount should be returned by the application. A return value of 0 indicates an error (the callback may set soap->errnum to errno). The __size field of the attachment struct/class should have been set by the application prior to the serialization of the content. The value of __size indicates the total size of the content to be transmitted. When the __size is zero then DIME chunked transfers can be used under certain circumstances to stream content without prior determination of attachment size, see Section 15.5 below.
void(*soap.fdimereadclose)(struct soap *soap, void *handle)
Called by the gSOAP run-time DIME attachment sender at the end of the streaming process to close the data source. The handle contains the value returned by the fdimereadopen callback. The fdimewriteclose callback is called after successfully transmitting the data or when an error occurred.
void *(*soap.fdimewriteopen)(struct soap *soap, const char *id, const char *type, const char *options)
Called by the gSOAP run-time DIME attachment receiver to start writing an inbound DIME attachment to an application's data store. The content is streamed into an application data store through multiple fdimewrite calls from the gSOAP attachment receiver. The id, type, and options arguments are the DIME id, type, and options respectively. The callback should return a handle which is passed to the fdimewrite and fdimewriteclose callbacks. The __ptr field of the attachment struct/class is set to the value of this handle. The __size field is set to the total size of the attachment after receiving the entire content. The size is unknown in advance because DIME attachments may be chunked.
int (*soap.fdimewrite)(struct soap *soap, void *handle, const char *buf, size_t len)
Called by the gSOAP run-time DIME attachment receiver to write part of an inbound DIME attachment to an application's data store. The handle contains the value returned by the fdimewriteopen callback. The buf argument contains the data of length len. The callback should return a gSOAP error code (e.g. SOAP_OK when no error occurred).
void(*soap.fdimewriteclose)(struct soap *soap, void *handle)
Called by the gSOAP run-time DIME attachment receiver at the end of the streaming process to close the data store. The fdimewriteclose callback is called after successfully receiving the data or when an error occurred. The handle contains the value returned by the fdimewriteopen callback.

In addition, a void*user field in the struct soap data structure is available to pass user-defined data to the callbacks. This way, you can set soap.user to point to application data that the callbacks need such as a file name for example.
The following example illustrates the client-side initialization of an image attachment struct to stream a file into a DIME attachment:

int main()
{
   struct soap soap;
   struct xsd__base64Binary image;
   FILE *fd;
   struct stat sb;
   soap_init(&soap);
   if (!fstat(fileno(fd), &sb) && sb.st_size > 0)
   { // because we can get the length of the file, we can stream it
      soap.fdimereadopen = dime_read_open;
      soap.fdimereadclose = dime_read_close;
      soap.fdimeread = dime_read;
      image.__ptr = (unsigned char*)fd; // must set to non-NULL (this is our fd handle which we need in the callbacks)
      image.__size = sb.st_size; // must set size
   }
   else
   { // don't know the size, so buffer it
      size_t i;
      int c;
      image.__ptr = (unsigned char*)soap_malloc(&soap, MAX_FILE_SIZE);
      for (i = 0; i < MAX_FILE_SIZE; i++)
      {
         if ((c = fgetc(fd)) == EOF)
            break;
         image.__ptr[i] = c;
      }
      fclose(fd);
      image.__size = i;
   }
   image.type = "image/jpeg";
   image.options = soap_dime_option(&soap, 0, "My picture");
   soap_call_ns__method(&soap, ...);
   ...
}
void *dime_read_open(struct soap *soap, void *handle, const char *id, const char *type, const char *options)
{ return handle;
}
void dime_read_close(struct soap *soap, void *handle)
{ fclose((FILE*)handle);
}
size_t dime_read(struct soap *soap, void *handle, char *buf, size_t len)
{ return fread(buf, 1, len, (FILE*)handle);
}

The following example illustrates the streaming of a DIME attachment into a file by a client:

int main()
{ struct soap soap;
   soap_init(&soap);
   soap.fdimewriteopen = dime_write_open;
   soap.fdimewriteclose = dime_write_close;
   soap.fdimewrite = dime_write;
   soap_call_ns__method(&soap, ...);
   ...
}
void *dime_write_open(struct soap *soap, const char *id, const char *type, const char *options)
{
   FILE *handle = fopen("somefile", "wb");
   if (!handle)
   {
      soap->error = SOAP_EOF;
      soap->errnum = errno; // get reason
   }
   return (void*)handle;
}
void dime_write_close(struct soap *soap, void *handle)
{ fclose((FILE*)handle);
}
int dime_write(struct soap *soap, void *handle, const char *buf, size_t len)
{
   size_t nwritten;
   while (len)
   {
      nwritten = fwrite(buf, 1, len, (FILE*)handle);
      if (!nwritten)
      {
         soap->errnum = errno; // get reason
         return SOAP_EOF;
      }
      len -= nwritten;
      buf += nwritten;
   }
   return SOAP_OK;
}

Note that compression can be used with DIME to compress the entire message. However, compression requires buffering to determine the HTTP content length header, which cancels the benefits of streaming DIME. To avoid this, you should use chunked HTTP (with the output-mode SOAP_IO_CHUNK flag) with compression and streaming DIME. At the server side, when you set SOAP_IO_CHUNK before calling soap_serve, gSOAP will automatically revert to buffering (SOAP_IO_STORE flag is set). You can check this flag with (soap->omode & SOAP_IO) == SOAP_IO_CHUNK to see if the client accepts chunking. More information about streaming chunked DIME can be found in Section 15.5.
Caution: The options field is a DIME-specific data structure, consisting of a 4 byte header containing the option type info (hi byte, lo byte), option string length (hi byte, lo byte), followed by a non-'\0' terminated string. The gSOAP DIME handler recognizes one option at most.

15.5  Streaming Chunked DIME

gSOAP automatically handles inbound chunked DIME attachments (streaming or non-streaming). To transmit outbound DIME attachments, the attachment sizes MUST be determined in advance to calculate HTTP message length required to stream DIME over HTTP. However, gSOAP also supports the transmission of outbound chunked DIME attachments without prior determination of DIME attachment sizes when certain conditions are met. These conditions require either non-HTTP transport (use the output-mode SOAP_ENC_XML flag), or chunked HTTP transport (use the output-mode SOAP_IO_CHUNK flag). You can also use the SOAP_IO_STORE flag (which is also used automatically with compression to determine the HTTP content length header) but that cancels the benefits of streaming DIME.
To stream chunked DIME, set the __size field of an attachment to zero and enable HTTP chunking. The DIME fdimeread callback then fetches data in chunks and it is important to fill the entire buffer unless the end of the data has been reached and the last chunk is to be send. That is, fdimeread should return the value of the last len parameter and fill the entire buffer buf for all chunks except the last.

15.6  WSDL Bindings for DIME Attachments

The wsdl2h WSDL parser recognizes DIME attachments and produces an annotated header file. Both open and closed layouts are supported for transmitting DIME attachments. For closed formats, all DIME attachments must be referenced from the SOAP message, e.g. using hrefs with SOAP encoding and using the application-specific reference attribute included in the base64Binary struct/class for doc/lit.
The gSOAP compiler soapcpp2 does not produce a WSDL with DIME extensions. DIME is an older binary format that has no WSDL protocol support, unlike MIME and MTOM.

16  MTOM Attachments

MTOM (Message Transmission Optimization Mechanism) is a relatively new format for transmitting attachments with SOAP messages (see http://www.w3.org/TR/soap12-mtom). MTOM is a W3C working draft as of this writing. MTOM attachments are essentially MIME attachments with standardized mechanisms for cross referencing attachments from the SOAP body, which is absent in (plain) MIME attachments and optional with DIME attachments.
Unlike the name suggests, the speed by which attached data is transmitted is not increased compared to MIME, DIME, or even XML encoded base64 data (at least the performance differences in gSOAP will be small). The advantage of the format is the standardized attachment reference mechanism, which should improve interoperability.
The MTOM specification mandates SOAP 1.2 and the use of the XOP namespace. The XOP Include element xop:Include is used to reference attachment(s) from the SOAP message body.
Because references from within the SOAP message body to attachments are mandatory with MTOM, the implementation of the serialization and deserialization of MTOM MIME attachments in gSOAP uses the extended binary type comparable to DIME support in gSOAP. This binary type is predefined in the import/xop.h file:

//gsoap xop schema import: http://www.w3.org/2004/08/xop/include
struct _xop__Include
{
   unsigned char *__ptr;
   int __size;
   char *id;
   char *type;
   char *options;
};
typedef struct _xop__Include _xop__Include;

The additional id, type, and option fields enable MTOM attachments for the data pointed to by __ptr of size __size. The process for sending and receiving MTOM XOP attachments is fully automated. The id field references the attachment (typically a content id CID or UUID). When set to NULL, gSOAP assigns a unique CID. The type field specifies the required MIME type of the binary data, and the optional options field can be used to piggy-back descriptive text with an attachment. The order of the declaration of the fields is significant.
You can explicitly import the xop.h in your header file to use the MTOM attachments in your service, for example:

#import "import/soap12.h"
/* alternatively, without the import above, use:
//gsoap SOAP-ENV schema namespace: http://www.w3.org/2003/05/soap-envelope
//gsoap SOAP-ENC schema namespace: http://www.w3.org/2003/05/soap-encoding
*/
#import "import/xop.h"
#import "import/xmime5.h"

//gsoap x schema namespace: http://my.first.mtom.net
struct x__myData
{
   _xop__Include xop__Include; // attachment
   @char *xmime5__contentType; // and its contentType
};
int x__myMTOMtest(struct x__myData *in, struct x__myData *out);

As you can see, there is really no difference between the specification of MTOM and DIME attachments in a gSOAP header file. Except that you MUST use SOAP 1.2 and the xop__Include element.
When an instance of x__myDataType is serialized and either or both the id and type fields are non-NULL, the data is transmitted as MTOM MIME attachment if the SOAP_ENC_MTOM flag is set in the gSOAP's soap struct context:

struct soap *soap = soap_new1(SOAP_ENC_MTOM);

Without this flag, the attachments will be transmitted in DIME format (Section 15). If your current clients and services are based on non-streaming DIME attachments using the SOAP body reference mechanism (thus, without using the soap_set_dime_attachment function) or plain base64 binary XML data elements, it is very easy to adopt MTOM by renaming the binary types to xop__Include and using the SOAP_ENC_MTOM flag with the SOAP 1.2 namespace.

16.1  Generating MultipartRelated MIME Attachment Bindings in WSDL

To generate multipartRelated bindings in the WSDL file, use the //gsoap ... service method-mime-type directive (see also Section 19.2. The directive can be repeated for each attachment you want to associate with a method's request and response messages.
For example:

#import "import/soap12.h"
#import "import/xop.h"
#import "import/xmime5.h"

//gsoap x schema namespace: http://my.first.mtom.net
struct x__myData
{
   _xop__Include xop__Include; // attachment
   @char *xmime5__contentType; // and its contentType
};
//gsoap x service method-mime-type: myMTOMtest text/xml
int x__myMTOMtest(struct x__myData *in, struct x__myData *out);

The //gsoap x service method-mime-type directive indicates that this operation accepts text/xml MIME attachments. See the SOAP-with-Attachment specification for the MIME types to use (for example, */* is a wildcard). If the operation has more than one attachment, just repeat this directive for each attachment you want to bind to the operation.
To bind attachments only to the request message of an operation, use //gsoap x service method-input-mime-type. Similarly, to bind attachments only to the response message of an operation, use //gsoap x service method-ouput-mime-type.
The wsdl2h WSDL parser recognizes MIME attachments and produces an annotated header file. However, the ordering of MIME parts in the multipartRelated elements is not reflected in the header file. Application developers should adhere the standards and ensure that multipart/related attachments are transmitted in compliance with the WSDL operation declarations.

16.2  Sending and Receiving MTOM Attachments

A receiver must be informed to recognize MTOM attachments by setting the SOAP_ENC_MTOM flag of the gSOAP context. Otherwise, the regular MIME attachment mechanism (SwA) will be used to store attachments.
When using wsdl2h to build clients and/or services, you should use the typemap.dat file included in the distribution package. The typemap.dat file defines the XOP namespace and XML MIME namespaces as imported namespaces:

xop = < http://www.w3.org/2004/08/xop/include >
xmime5 = < http://www.w3.org/2005/05/xmlmime >
xmime4 = < http://www.w3.org/2004/11/xmlmime >

The wsdl2h tool uses the typemap.dat file (see also option -t) to convert WSDL into a gSOAP header file. In this case we don't want the wsdl2h tool to read the XOP schema and translate it, since we have a pre-defined _xop__Include element to handle XOP for MTOM. This _xop__Include element is defined in xop.h. Therefore, the bindings shown above will not translate the XOP and XML MIME schemas to code, but generates #import statements instead:

#import "xop.h"
#import "xmime5.h"

The #import statements are only added for those namespaces that are actually used by the service.
Let's take a look at an example. The wsdl2h importer generates a header file with #import "xop.h" from a WSDL that references XOP, for example:

#import "xop.h"
#import "xmime5.h"
struct ns__Data
{
   _xop__Include xop__Include;
   @char *xmime5__contentType;
};

Suppose the WSDL defines an operation:

int ns__echoData(struct ns__Data *in, struct ns__Data *out);

After generating the stubs/proxies with the soapcpp2 compiler, we can invoke the stub at the client side with:

struct soap *soap = soap_new1(SOAP_ENC_MTOM);
struct ns__Data data;
data.xop__Include.__ptr = (unsigned char*)"<b>Hello world!</b>";
data.xop__Include.__size = 20;
data.xop__Include.id = NULL; // CID automatically generated by gSOAP engine
data.xop__Include.type = "text/html"; // MIME type
data.xop__Include.options = NULL; // no descriptive info added
data.xmime5__contentType = "text/html"; // MIME type
if (soap_call_ns__echoData(soap, endpoint, action, &data, &data))    soap_print_fault(soap, stderr); else
   printf("Got data\n");
soap_destroy(soap); // remove deserialized class instances
soap_end(soap); // remove temporary and deserialized data
soap_free(soap); // detach and free context

Note that the xop__Include.type field must be set to transmit MTOM attachments, otherwise plain base64 XML will be used.
At the server side, we show an example of an operation handler that just copies the input data to output:

int ns__echoData(struct soap *soap, struct ns__Data *in, struct ns__data *out)
{
   *out = *in;
   return SOAP_OK;
}

The server must use the SOAP_ENC_MTOM flag to initialize the soap struct to receive and send MTOM attachments.

16.3  Streaming MTOM/MIME

Streaming MTOM/MIME is achieved with callback functions to fetch and store data during transmission. Three function callbacks for streaming MTOM/MIME output and three callbacks for streaming MTOM/MIME input are available.


Callback (function pointer)
void *(*soap.fmimereadopen)(struct soap *soap, void *handle, const char *id, const char *type, const char *description)
Called by the gSOAP run-time MTOM/MIME attachment sender to start reading from a (binary) data source for outbound transmission. The content will be read from the application's data source in chunks using the fmimeread callback and streamed into the SOAP/XML/MTOM/MIME output stream. The handle contains the value of the __ptr field of an attachment struct/class, which could be a pointer to specific information such as a file descriptor or a pointer to a string to be passed to this callback. Both __ptr and __size fields should have been set by the application prior to the serialization of the content. The id, type, and description arguments are the MTOM/MIME id, type, and description, respectively. The callback should return handle, or another pointer value which will be passed as a handle to fmimeread and fmimereadclose. The callback should return NULL and set soap->error when an error occurred. The callback should return NULL (and not set soap->error) when this particular MTOM/MIME attachment is not to be streamed.
size_t (*soap.fmimeread)(struct soap *soap, void *handle, char *buf, size_t len)
Called by the gSOAP run-time MTOM/MIME attachment sender to read more data from a (binary) data source for streaming into the output stream. The handle contains the value returned by the fmimereadopen callback. The buf argument is the buffer of length len into which a chunk of data should be stored. The actual amount of data stored in the buffer may be less than len and this amount should be returned by the application. A return value of 0 indicates an error (the callback may set soap->errnum to errno). The __size field of the attachment struct/class should have been set by the application prior to the serialization of the content. The value of __size indicates the total size of the content to be transmitted. When the __size is zero then MTOM/MIME chunked transfers can be used under certain circumstances to stream content without prior determination of attachment size, see Section 16.5 below.
void(*soap.fmimereadclose)(struct soap *soap, void *handle)
Called by the gSOAP run-time MTOM/MIME attachment sender at the end of the streaming process to close the data source. The handle contains the value returned by the fmimereadopen callback. The fmimewriteclose callback is called after successfully transmitting the data or when an error occurred.
void *(*soap.fmimewriteopen)(struct soap *soap, void *handle, const char *id, const char *type, const char *description, enum soap_mime_encoding encoding)
Called by the gSOAP run-time MTOM/MIME attachment receiver to start writing an inbound MTOM/MIME attachment to an application's data store. The content is streamed into an application data store through multiple fmimewrite calls from the gSOAP attachment receiver. The handle argument is normally NULL, unless soap_get_mime_attachment is used that passes the handle to the callback, see Section 16.4. The id, type, and description arguments are the MTOM/MIME id, type, and description respectively. The encoding enumeration value indicates the MIME content transfer encoding, which is one of SOAP_MIME_NONE, SOAP_MIME_7BIT, SOAP_MIME_8BIT, SOAP_MIME_BINARY, SOAP_MIME_QUOTED_PRINTABLE, SOAP_MIME_BASE64, SOAP_MIME_IETF_TOKEN, SOAP_MIME_X_TOKEN. Content decoding may have to be considered by the application based on this value. The callback should return a non-NULL handle which is passed to the fmimewrite and fmimewriteclose callbacks. The __ptr field of the attachment struct/class is set to the value of this handle. The __size field is set to the total size of the attachment after receiving the entire content. The size is unknown in advance because MTOM/MIME attachments may be chunked.
int (*soap.fmimewrite)(struct soap *soap, void *handle, const char *buf, size_t len)
Called by the gSOAP run-time MTOM/MIME attachment receiver to write part of an inbound MTOM/MIME attachment to an application's data store. The handle contains the value returned by the fmimewriteopen callback. The buf argument contains the data of length len. The callback should return a gSOAP error code (e.g. SOAP_OK when no error occurred).
void(*soap.fmimewriteclose)(struct soap *soap, void *handle)
Called by the gSOAP run-time MTOM/MIME attachment receiver at the end of the streaming process to close the data store. The fmimewriteclose callback is called after successfully receiving the data or when an error occurred. The handle contains the value returned by the fmimewriteopen callback.

In addition, a void*user field in the struct soap data structure is available to pass user-defined data to the callbacks. This way, you can set soap.user to point to application data that the callbacks need such as a file name for example.
The following example illustrates the client-side initialization of an image attachment struct to stream a file into a MTOM attachment without HTTP chunking (HTTP streaming chunked MTOM transfer is presented in Section 16.5):

int main()
{
   struct soap soap;
   struct xsd__base64Binary image;
   FILE *fd;
   struct stat sb;
   soap_init1(&soap, SOAP_ENC_MTOM); // mandatory to enable MTOM
   if (!fstat(fileno(fd), &sb) && sb.st_size > 0)
   { // because we can get the length of the file, we can stream it without chunking
      soap.fmimereadopen = mime_read_open;
      soap.fmimereadclose = mime_read_close;
      soap.fmimeread = mime_read;
      image.__ptr = (unsigned char*)fd; // must set to non-NULL (this is our fd handle which we need in the callbacks)
      image.__size = sb.st_size; // must set size
   }
   else
   { // don't know the size, so buffer it
      size_t i;
      int c;
      image.__ptr = (unsigned char*)soap_malloc(&soap, MAX_FILE_SIZE);
      for (i = 0; i < MAX_FILE_SIZE; i++)
      {
         if ((c = fgetc(fd)) == EOF)
            break;
         image.__ptr[i] = c;
      }
      fclose(fd);
      image.__size = i;
   }
   image.type = "image/jpeg"; // MIME type
   image.options = "This is my picture"; // description of object
   soap_call_ns__method(&soap, ...);
   ...
}
void *mime_read_open(struct soap *soap, void *handle, const char *id, const char *type, const char *description)
{ return handle;
}
void mime_read_close(struct soap *soap, void *handle)
{ fclose((FILE*)handle);
}
size_t mime_read(struct soap *soap, void *handle, char *buf, size_t len)
{ return fread(buf, 1, len, (FILE*)handle);
}

The following example illustrates the streaming of a MTOM/MIME attachment into a file by a client:

int main()
{ struct soap soap;
   soap_init(&soap);
   soap.fmimewriteopen = mime_write_open;
   soap.fmimewriteclose = mime_write_close;
   soap.fmimewrite = mime_write;
   soap_call_ns__method(&soap, ...);
   ...
}
void *mime_write_open(struct soap *soap, const char *id, const char *type, const char *description, enum soap_mime_encoding encoding)
{
   FILE *handle = fopen("somefile", "wb");
   // We ignore the MIME content transfer encoding here, but should check
   if (!handle)
   {
      soap->error = SOAP_EOF;
      soap->errnum = errno; // get reason
   }
   return (void*)handle;
}
void mime_write_close(struct soap *soap, void *handle)
{ fclose((FILE*)handle);
}
int mime_write(struct soap *soap, void *handle, const char *buf, size_t len)
{
   size_t nwritten;
   while (len)
   {
      nwritten = fwrite(buf, 1, len, (FILE*)handle);
      if (!nwritten)
      {
         soap->errnum = errno; // get reason
         return SOAP_EOF;
      }
      len -= nwritten;
      buf += nwritten;
   }
   return SOAP_OK;
}

Note that compression can be used with MTOM/MIME to compress the entire message. However, compression requires buffering to determine the HTTP content length header, which cancels the benefits of streaming MTOM/MIME. To avoid this, you should use chunked HTTP (with the output-mode SOAP_IO_CHUNK flag) with compression and streaming MTOM/MIME. At the server side, when you set SOAP_IO_CHUNK before calling soap_serve, gSOAP will automatically revert to buffering (SOAP_IO_STORE flag is set). You can check this flag with (soap->omode & SOAP_IO) == SOAP_IO_CHUNK to see if the client accepts chunking. More information about streaming chunked MTOM/MIME can be found in Section 16.5.
Note that the example above for mime_read uses a handle that points to the open file FILE*. The simple example above is not recommended when the platform imposes a limit on the number of open file descriptors. You can use the handle to pass along more information than just the file descriptor. So for example, when the number of open file descriptors is limited on your platform, you should let the handle point to a structure with file-related information. The C++ example below illustrates this:

file.xop__Include = soap_new__xop__Include(soap);
file.xop__Include->id = NULL;
file.xop__Include->type = type;
file.xop__Include->options = NULL;

file.xmime5__contentType = type;
file.filename = filename;

// The object holding all information to read data
FileStreamIn *ins = new FileStreamIn(errorhandler);
ins->setFilePath(path);
ins->setFileName(filename);

file.xop__Include->__size = size;
file.xop__Include->__ptr = (unsigned char*)ins;

To read the MTOM data for transmission:

void *mime_read_open(struct soap *soap, void *handle, const char *id, const char *type, const char *description)
{
   if (!handle)
      return NULL;
   FileStreamIn *ins = (FileStreamIn*)handle;
   if (!ins->open())
   {
      soap->error = SOAP_ERR;
      return NULL;
   }
   return handle;
}
void mime_read_close(struct soap *soap, void *handle)
{
   if (!handle)
      return;
   FileStreamIn *ins = (FileStreamIn*)handle;
   delete ins;
}
size_t mime_read(struct soap *soap, void *handle, char *buf, size_t len)
{
   if (!handle)
      return 0;
   FileStreamIn *ins = (FileStreamIn*)handle;
   size_t nread = ins->read(buf, len);
   if (ins->streamError())
   {
      soap->error = ins->streamError();
      return 0;
   }
   return nread;
}

16.4  Redirecting Inbound MTOM/MIME Streams Based on SOAP Body Content

When it is preferable or required to redirect inbound MTOM/MIME attachment streams based on SOAP message body content, where for example the names of the resources are listed in the SOAP message body, an alternative mechanism must be used. This mechanism can be used both at the client and server side.
Because the routing of the streams is accomplished with explicit function calls, this method should only be used when required and should not be considered optional. That is, when you enable this method, you MUST check for pending MTOM/MIME attachments and handle them appropriately. This is true even when you don't expect MTOM/MIME attachments in the payload, because the peer may trick you by sending attachments anyway and you should be prepared to accept or reject them.
The explicit MTOM/MIME streaming mechanism consists of three API functions:

Function
void soap_post_check_mime_attachments(struct soap *soap)
Enables post-message body inbound streaming MTOM/MIME attachments. The presence of attachments must be explicitly checked using the function below.
int soap_check_mime_attachments(struct soap *soap)
Should be called after a client-side call (e.g. soap_call_ns__method) to check the presence of attachments. Returns 1 (true) when attachments are present. If present, each attachment MUST be processed with the function below.
struct soap_multipart *soap_get_mime_attachment(struct soap *soap, void *handle)
Parses an attachment and invokes the MIME callbacks (when set). The handle parameter is passed to fmimewriteopen. The handle may contain any data that is extracted from the SOAP message body to guide the redirection of the stream in the callbacks. The return value is a struct with a char *ptr field that contains the handle value returned by the fmimewriteopen callback, and char *id, char *type, and char *description fields with the optional MIME id, type, and description info.

Example client-side code in C:

struct soap *soap = soap_new1(SOAP_ENC_MTOM);
soap_post_check_mime_attachments(soap);
...
if (soap_call_ns__myMethod(soap, ...))
   soap_print_fault(soap, stderr); // an error occurred
else
{
   if (soap_check_mime_attachments(soap))    { // attachments are present, channel is still open
      {
         do
         {
            ... // get data 'handle' from SOAP response and pass to callbacks
            ... // set the fmime callbacks, if needed
            struct soap_multipart *content = soap_get_mime_attachment(soap, (void*)handle);
            printf("Received attachment with id=%s and type=%s\n", content->id?content->id:"", content->type?content->type:"");
         } while (content);
         if (soap->error)
            soap_print_fault(soap, stderr);
      }
   }
}
...
soap_destroy(soap);
soap_end(soap);
soap_free(soap); // detach and free context

The server-side service operations are implemented as usual, but with additional checks for MTOM/MIME attachments:

struct soap *soap = soap_new1(SOAP_ENC_MTOM);
soap_post_check_mime_attachments(soap);
...
soap_serve(soap);
...
int ns__myMethod(struct soap *soap, ...)
{    ... // server-side processing logic
   if (soap_check_mime_attachments(soap))    { // attachments are present, channel is still open
      {
         do
         {
            ... // get data 'handle' from SOAP request and pass to callbacks
            ... // set the fmime callbacks, if needed
            struct soap_multipart *content = soap_get_mime_attachment(soap, (void*)handle);
            printf("Received attachment with id=%s and type=%s\n", content->id?content->id:"", content->type?content->type:"");
         } while (content);
         if (soap->error)
            return soap->error;
      }
   }
   ... // server-side processing logic
   return SOAP_OK;
}

16.5  Streaming Chunked MTOM/MIME

gSOAP automatically handles inbound chunked MTOM/MIME attachments (streaming or non-streaming). To transmit outbound MTOM/MIME attachments, the attachment sizes MUST be determined in advance to calculate HTTP message length required to stream MTOM/MIME over HTTP. However, gSOAP also supports the transmission of outbound chunked MTOM/MIME attachments without prior determination of MTOM/MIME attachment sizes when certain conditions are met. These conditions require either non-HTTP transport (use the output-mode SOAP_ENC_XML flag), or chunked HTTP transport (use the output-mode SOAP_IO_CHUNK flag). You can also use the SOAP_IO_STORE flag (which is also used automatically with compression to determine the HTTP content length header) but that cancels the benefits of streaming MTOM/MIME.
To stream chunked MTOM/MIME, set the __size field of an attachment to zero and enable HTTP chunking. The MTOM/MIME fmimeread callback then fetches data in chunks of any size between 1 and the value of the len argument. The fmimeread callback should return 0 upon reaching the end of the data stream.

17  XML Validation

The gSOAP XML parser applies basic rules to validate content. Constraints are not automatically verified unless explicitly set using flags. This helps to avoid interoperability problems with toolkits that do not strictly enforce validation rules. In addition, we cannot always use strict validation for SOAP RPC encoded messages, since SOAP RPC encoding adopts a very loose serialization format.
Validation constraints are enabled with the SOAP_XML_STRICT input mode flag set, e.g. with soap_set_imode(soap, SOAP_XML_STRICT) or soap_new(SOAP_XML_STRICT), see Section 9.12 for the complete list of flags.

17.1  Occurrence Constraints

17.1.1  Default Values

Default values can be defined for optional elements and attributes, which means that the default value will be used when the element or attribute value is not present in the parsed XML. See also Section 7.5.7 and examples in subsequent subsections below.
Default values must be primitive types, integer, float, string, etc. Default values can be specified for struct and class members, as shown in the example below:

struct ns__MyRecord
{
   int n = 5; // optional element with default value 5
   char *name = "none"; // optional element with default value "none"
   @enum ns__color { RED, WHITE, BLUE } color = RED; // optional attribute with default value RED
};

Upon deserialization of absent data, these members will be set accordingly. When classes are instantiated with soap_new_ClassName the instance will be initialized with default values.

17.1.2  Elements with minOccurs and maxOccurs Restrictions

To force the validation of minOccurs and maxOccurs contraints the SOAP_XML_STRICT input mode flag must be set. The minOccurs and maxOccurs constraints are specified for fields of a struct and members of a class in a header file using the following syntax:

Type fieldname [minOccurs[:maxOccurs]] [= value]

The minOccurs and maxOccurs values must be integer literals. A default value can be provided. When minOccurs is not specified, it is assumed to be zero.
For example

struct ns__MyRecord
{
   int n = 5; // element with default value 5, minOccurs=0, maxOccurs=1
   int m 1; // element with minOccurs=1
   int __size 0:10; // sequence <item> with minOccurs=0, maxOccurs=10
   int *item;
   std::vector<double> nums 2; // sequence <nums> with minOccurs=2, maxOccurs=unbounded
};
struct arrayOfint
{
   int *__ptr 1:100; // minOccurs=1, maxOccurs=100
   int size;
};

Pointer-based struct fields and class members are allowed to be nillable when minOccurs is zero.

17.1.3  Required and Prohibited Attributes

Similar to the minOccurs and maxOccurs annotations defined in the previous section, attributes in a struct or class can be annotated with occurrence constraints to make them optional (0), required (1), or prohibited (0:0). Default values can be assigned to optional attributes.
For example

struct ns__MyRecord
{
   @int m 1; // required attribute (occurs at least once)
   @int n = 5; // optional attribute with default value 5
   @int o 0; // optional attribute (may or may not occur)
   @int p 0:0; // prohibited attribute
};

Remember to set the SOAP_XML_STRICT input mode flag to enable the validation of attribute occurrence constraints.

17.2  Value Constraints

17.2.1  Data Length Restrictions

A schema simpleType is defined with a typedef by taking a base primitive to defined a derived simpleType. For example:

typedef int time__seconds;

This defines the following schema type in time.xsd:

<simpleType name="seconds">
   <restriction base="xsd:int"/>
</simpleType>

A complexType with simpleContent is defined with a wrapper struct/class:

struct time__date
{
   char *__item; // some custom format date (restriction of string)
   @enum time__zone { EST, GMT, ... } zone;
}

This defines the following schema type in time.xsd:

<complexType name="date">
   <simpleContent>
      <extension base="xsd:string"/>
   </simpleContent>
   <attribute name="zone" type="time:zone" use="optional"/>
</complexType> <simpleType name="zone">
   <restriction base="xsd:string">
      <enumeration value="EST"/>
      <enumeration value="GMT"/>
      ...
   </restriction>
</simpleType>

Data value length constraints of simpleTypes and complexTypes with simpleContent are defined as follows.

typedef char *ns__string256 0:256; // simpleType restriction of string with max length 256 characters
typedef char *ns__string10 10:10; // simpleType restriction of string with length of 10 characters
typedef std::string *ns__string8 8; // simpleType restriction of string with at least 8 characters
struct ns__data // simpleContent wrapper
{
   char *__item :256; // simpleContent with at most 256 characters
   @char *name 1; // required name attribute
};
struct time__date // simpleContent wrapper
{
   char *__item :100;
   @enum time__zone { EST, GMT, ... } zone = GMT;
}

Remember to set the SOAP_XML_STRICT input mode flag to enable the validation of value length constraints.

17.2.2  Value Range Restrictions

Similar to data length constraints for string-based data, integer and floatig point value range constraints on numeric simpleTypes and complexTypes with simpleContent are declared with low : high, where low and high are optional.
As of gSOAP 2.8.26, floating point value ranges and integer ranges can be exclusive by adding < on either side of the ':' range operator:
Range Validitation check
1 1 ≤ x
1 : 1 ≤ x
  : 10 x ≤ 10
1 : 10 1 ≤ x ≤ 10
1 < : < 10 1 < x < 10 (shorthand form: 1 < 10)
1 : < 10 1 ≤ x < 10
  : < 10 x < 10 (shorhand form: < 10)
1 < : 1 < x (shorthand form: 1 < )
1 < : 10 1 < x ≤ 10
Example:


typedef int ns__int10 0:10; // simpleType restriction of int 0..10
typedef LONG64 ns__long -1000000:1000000; // simpleType restriction of long64 -1000000..1000000
typedef float ns__float -1.0 < : < 10.5; // simpleType restriction of float in (-1,10.5)
struct ns__data // simpleContent wrapper
{
   int __item 0:10; // simpleContent range 0..10
   @char *name 1; // required name attribute
};

17.2.3  Pattern Restrictions

Patterns can be defined for simpleType content. However, patterns are currently not enforced in the validation process though possibly in future releases.
To associate a pattern with a simpleType, you can define a simpleType with a typedef and a pattern string:

typedef int time__second "[1-5]?[0-9] - 60";

This defines the following schema type in time.xsd:

<simpleType name="second">
   <restriction base="xsd:int">
      <pattern value="[1-5]?[0-9] - 60"/>
   </restriction>
</simpleType>

The pattern string MUST contain a valid regular expression.
A special case for C format string patterns is introduced in gSOAP 2.8.18. When xs:totalDigits and xs:fractionDigits are given in a XSD file, then a C format string is produced to output floating point values with the proper precision and scale. For example:

<simpleType name="ratio">
   <restriction base="xsd:float">
      <totalDigits value="5"/>
      <fractionDigits value="2"/>
   </restriction>
</simpleType>

produces:

typedef float time__ratio "%5.2f";

The format string is used to format the output the floating point value in XML.

17.3  Element and Attribute Qualified/Unqualified Forms

Struct, class, and union members represent elements and attributes that are automatically qualified or unqualified depending on the schema element and attribute default forms. The gSOAP engine always validates the prefixes of elements and attributes. When a namespace mismatch occurs, the element or attribute is not consumed which can lead to a validation error (unless the complexType is extensible or when SOAP_XML_STRICT is turned off).
See Section 10.3 for details on the the struct/class/union member identifier translation rules. Consider for example:

//gsoap ns schema elementForm: qualified
//gsoap ns schema attributeForm: unqualified
struct ns__record
{
   @char * type;
   char * name;
};

Here, the ns__record struct is serialized with qualified element name and unqualified attribute type:

<ns:record type="...">
   <ns:name>...</ns:name>
</ns:record>

The "colon notation" for struct/class/union member field names is used to override element and attribute qualified or unqualified forms. To override the form for individual members that represent elements and attributes, use a namespace prefix and colon with the member name:

//gsoap ns schema elementForm: qualified
//gsoap ns schema attributeForm: unqualified
struct ns__record
{
   @char * ns:type;
   char * :name;
};

where name is unqualified and type is qualified:

<ns:record ns:type="...">
   <name>...</name>
</ns:record>

The colon notation is a syntactic notation used only in the gSOAP header file syntax, it is not translated to the C/C++ output.
The colon notation does not avoid name clashes between members. For example:

struct x__record
{
   @char * name;
   char * x:name;
};

results in a redefinition error, since both members have the same name. To avoid name clashes, use a underscore suffix:

struct x__record
{
   @char * name;
   char * x:name_;
};

Not that the namespace prefix convention can be used instead:

struct x__record
{
   @char * name;
   char * x__name;
};

which avoids the name clash. However, the resulting schema is different since the last example generates a global name element definition that is referenced by the local element.
More specifically, the difference between the namespace prefix convention with double underscores and colon notation is that the namespace prefix convention generates schema element/attribute references to elements/attributes at the top level, while the colon notation only affects the local element/attribute namespace qualification by form overriding. This is best illustrated by an example:

struct x__record
{
   char * :name;
   char * x:phone;
   char * x__fax;
   char * y__zip;
};

which generates the following x.xsdschema:

<complexType name="record">
   <sequence>
      <element name="name" type="xsd:string" minOccurs="0" maxOccurs="1" nillable="true" form="unqualified"/>
      <element name="phone" type="xsd:string" minOccurs="0" maxOccurs="1" nillable="true" form="qualified"/>
      <element ref="x:fax" minOccurs="0" maxOccurs="1"/>
      <element ref="y:zip" minOccurs="0" maxOccurs="1"/>
   </sequence>
</complexType>
<element name="fax" type="xsd:string"/>

and the y.xsd schema defines contains:

<element name="zip" type="xsd:string"/>

18  SOAP/XML Over UDP

UDP is a simple, unreliable datagram protocol: UDP sockets are connectionless. UDP address formats are identical to those used by TCP. In particular UDP provides a port identifier in addition to the normal Internet address format. The UDP port space is separate from the TCP port space (i.e. a UDP port may not be "connected" to a TCP port). In addition broadcast packets may be sent (assuming the underlying network supports this) by using a reserved "broadcast address"; this address is network interface dependent.
Client-side messages with SOAP-over-UDP endpoint URLs (soap.udp://...) will be automatically transmitted as datagrams. Server-side applications should set the SOAP_IO_UDP mode flag to accept UDP requests, e.g. using soap_init1 or soap_set_mode.
The maximum message length for datagram packets is restricted by the buffer size SOAP_BUFLEN, which is 65536 by default, unless compiled with WITH_LEAN to support small-scale embedded systems. For UDP transport SOAP_BUFLEN must not exceed the maximum UDP packet size 65536 (the size of datagram messages is constrained by the UDP packet size 216=65536 as per UDP standard). You can use gzip compression to reduce the message size, but note that compressed SOAP-over-UDP is a gSOAP-specific feature because it is not part of the SOAP-over-UDP specification.
The SOAP-over-UDP specification relies on WS-Addressing. The wsa.h file in the import directory defines the WS-Addressing elements for client and server applications.
The gSOAP implementation conforms to the SOAP-over-UDP requirements:
  • SOAP-over-UDP server endpoint URL format: soap.udp://host:port/path
  • Support one-way message-exchange pattern (MEP) where a SOAP envelope is carried in a user datagram.
  • Support request-response message-exchange pattern (MEP) where SOAP envelopes are carried in user datagrams.
  • Support multicast transmission of SOAP envelopes carried in user datagrams.
  • Support both SOAP 1.1 and SOAP 1.2 envelopes.
The following additional features are also available, but are not supported by the SOAP-over-UDP specification:
  • Zlib/gzip message compression (compile -DWITH_GZIP).
  • SOAP with DIME attachments over UDP.
  • SOAP with MIME attachments (SwA) over UDP.
  • Support for IPv6 (compile -DWITH_IPV6)

18.1  Using WS-Addressing with SOAP-over-UDP

A SOAP-over-UDP application MUST use WS-Addressing to control message delivery as per SOAP-over-UDP specification.
The wsa.h file in the import directory defines the WS-Addressing elements. To include the WS-Addressing elements in the SOAP Header for messaging, a struct SOAP_ENV__Header structure must be defined in your header file with the appropriate WS-Addressing elements. For example:

#import "wsa.h"
struct SOAP_ENV__Header
{
   mustUnderstand _wsa__MessageID wsa__MessageID 0;
   mustUnderstand _wsa__RelatesTo *wsa__RelatesTo 0;
   mustUnderstand _wsa__From *wsa__From 0;
   mustUnderstand _wsa__ReplyTo *wsa__ReplyTo 0;
   mustUnderstand _wsa__FaultTo *wsa__FaultTo 0;
   mustUnderstand _wsa__To wsa__To 0;
   mustUnderstand _wsa__Action wsa__Action 0;
};

We also included a //gsoap wsa schema import directive in the wsa.h file to enable the generation of WSDL specifications that import (instead of includes) the WS-Addressing elements. Note that the //gsoapopt w directive must not be present in your header file to enable WSDL generation.
One-way SOAP-over-UDP messages (see Section 7.3) should be declared to include the wsa:MessageID, wsa:To, and wsa:Action elements in the SOAP Header of the request message as follows:

//gsoap ns service method-header-part: sendString wsa__MessageID
//gsoap ns service method-header-part: sendString wsa__To
//gsoap ns service method-header-part: sendString wsa__Action
int ns__sendString(char *str, void);

Request-response SOAP-over-UDP messages should be declared to include the wsa:MessageID, wsa:To, wsa:Action, and wsa:ReplyTo elements in the SOAP Header of the request message, and the the wsa:MessageID, wsa:To, wsa:Action, and wsa:RelatesTo elements in the SOAP Header of the response message:

//gsoap ns service method-header-part: echoString wsa__MessageID
//gsoap ns service method-header-part: echoString wsa__To
//gsoap ns service method-header-part: echoString wsa__Action
//gsoap ns service method-input-header-part: sendString wsa__ReplyTo
//gsoap ns service method-output-header-part: echoString wsa__RelatesTo
int ns__echoString(char *str, char **res);

For the content requirements of these elements, please consult the SOAP-over-UDP specification and/or read the next sections explaining SOAP-over-UDP unicast, multicast, one-way, and request-response client and server applications.

18.2  Client-side One-way Unicast

This example assumes that the gSOAP header file includes the SOAP Header with WS-Addressing elements and the ns__sendString function discussed in Section 18.1

struct soap soap;
struct SOAP_ENV__Header header; // the SOAP Header
soap_init(&soap);
soap.send_timeout = 1; // 1s timeout
soap_default_SOAP_ENV__Header(&soap, &header); // init SOAP Header
header.wsa__MessageID = "message ID";
header.wsa__To = "server URL";
header.wsa__Action = "server action";
soap.header = &header; // bind the SOAP Header for transport
// Send the message over UDP:
if (soap_send_ns__echoString(&soap, "soap.udp://...", NULL, "hello world!"))
   soap_print_fault(&soap, stderr); // report error
soap_end(&soap); // cleanup
soap_destroy(&soap); // cleanup
soap_done(&soap); // close connection (should not use soap struct after this)

18.3  Client-side One-way Multicast

This example is similar to the one-way unicast example discussed above, but uses a broadcast address and the SO_BROADCAST socket option:

struct soap soap;
struct SOAP_ENV__Header header; // the SOAP Header
in_addr_t addr = inet_addr("1.2.3.4"); // optional
soap_init(&soap);
soap.send_timeout = 1; // 1s timeout
soap.connect_flags = SO_BROADCAST; // required for broadcast
soap.ipv4_multicast_if = &addr; // optional for IPv4: see setsockopt IPPROTO_IP IP_MULTICAST_IF
soap.ipv6_multicast_if = addr; // optional for IPv6: multicast sin6_scope_id
soap.ipv4_multicast_ttl = 1; // optional, see setsockopt IPPROTO_IP, IP_MULTICAST_TTL
soap_default_SOAP_ENV__Header(&soap, &header); // init SOAP Header
header.wsa__MessageID = "message ID";
header.wsa__To = "server URL";
header.wsa__Action = "server action";
soap.header = &header; // bind the SOAP Header for transport
// Send the message over UDP to a broadcast address:
if (soap_send_ns__echoString(&soap, "soap.udp://...", NULL, "hello world!"))
   soap_print_fault(&soap, stderr); // report error
soap_destroy(&soap); // cleanup
soap_end(&soap); // cleanup
soap_done(&soap); // close connection (should not use soap struct after this)

Please refer to the socket options for IPPROTO_IP IP_MULTICAST_IF to specify the default interface for multicast datagrams to be sent from. This is a struct in_addr (in_addr_t for sin6_scope_id) interface value. Otherwise, the default interface set by the system administrator will be used (if any).
Please refer to the socket options for IPPROTO_IP IP_MULTICAST_TTL to limit the lifetime of the packet. Multicast datagrams are sent with a default value of 1, to prevent them to be forwarded beyond the local network. This parameter can be set between 1 to 255.

18.4  Client-side Request-Response Unicast

This example assumes that the gSOAP header file includes the SOAP Header with WS-Addressing elements and the ns__echoString function discussed in Section 18.1

struct soap soap;
struct SOAP_ENV__Header header; // the SOAP Header
struct wsa__EndpointReferenceType replyTo; // (anonymous) reply address
char *res; // server response
soap_init(&soap);
soap.send_timeout = 1; // 1s timeout
soap.recv_timeout = 1; // 1s timeout
soap_default_SOAP_ENV__Header(&soap, &header); // init SOAP Header
soap_default_wsa__EndpointReferenceType(&soap, &replyTo); // init reply address
replyTo.Address = "http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous";
header.wsa__MessageID = "message ID";
header.wsa__To = "server URL";
header.wsa__Action = "server action";
header.wsa__ReplyTo = &replyTo;
soap.header = &header; // bind the SOAP Header for transport
// Send and receive messages over UDP:
if (soap_call_ns__echoString(&soap, "soap.udp://...", NULL, "hello world!", &res))
{
   if (soap.error == SOAP_EOF && soap.errnum == 0)
      // Timeout: no response from server (message already delivered?)
   else
      soap_print_fault(&soap, stderr);
}
else
   // UDP server response is stored in 'res'
// check SOAP header received, if applicable
check_header(&soap.header);
soap_destroy(&soap); // cleanup
soap_end(&soap); // cleanup
soap_done(&soap); // close connection (should not use soap struct after this)

18.5  Client-side Request-Response Multicast

This example is similar to the request-response unicast example discussed above, but uses a broadcast address and the SO_BROADCAST socket option. Because we expect to receive multiple responses, we also need to use separate request-response messages to send one request and consume multiple responses. In this example we defined a bcastString request and a bcastStringResponse response message, which are essentially declared as one-way messages in the header file:

//gsoap ns service method-header-part: bcastString wsa__MessageID
//gsoap ns service method-header-part: bcastString wsa__To
//gsoap ns service method-header-part: bcastString wsa__Action
//gsoap ns service method-header-part: bcastString wsa__ReplyTo
int ns__bcastString(char *str, void);
//gsoap ns service method-header-part: bcastStringResponse wsa__MessageID
//gsoap ns service method-header-part: bcastStringResponse wsa__To
//gsoap ns service method-header-part: bcastStringResponse wsa__Action
//gsoap ns service method-header-part: bcastStringResponse wsa__RelatesTo
int ns__bcastStringResponse(char *res, void);

To obtain response one-way operations, use the wsdl2h -b option.
The client code includes a loop to receive response messages until a timeout occurs:

struct soap soap;
struct SOAP_ENV__Header header;
struct wsa__EndpointReferenceType replyTo;
char *res;
soap_init(&soap);
soap.connect_flags = SO_BROADCAST;
soap.send_timeout = 1; // 1s timeout
soap.recv_timeout = 1; // 1s timeout
soap_default_SOAP_ENV__Header(&soap, &header);
soap.header = &header;
soap_default_wsa__EndpointReferenceType(&soap, &replyTo);
replyTo.Address = "http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous";
header.wsa__MessageID = "message ID";
header.wsa__To = "server URL";
header.wsa__Action = "server action";
header.wsa__ReplyTo = &replyTo;
if (soap_send_ns__bcastString(&soap, "soap.udp://...", NULL, "hello world!"))
   soap_print_fault(&soap, stderr);
else
{
   for (;;)
   {
      if (soap_recv_ns__bcastStringResponse(&soap, &res))
         break;
      // Got response 'res' from a server
   }
   if (soap.error == SOAP_EOF && soap.errnum == 0)
      // Timeout: no more messages received
   else
      soap_print_fault(&soap, stderr);
}
soap_destroy(&soap); // cleanup
soap_end(&soap); // cleanup
soap_done(&soap); // close connection (should not use soap struct after this)

Note that a server for the bcastString does not need to use two-one way messages. Thus, multicast request-response message pattern can be declared and implemented as request-response operations at the server side.

18.6  SOAP-over-UDP Server

The following example code illustrates a SOAP-over-UDP server for one-way sendString and request-response echoString messages. This example assumes that the gSOAP header file includes the SOAP Header with WS-Addressing elements and the ns__echoString function discussed in Section 18.1.

int main()
{
   struct soap soap;
   soap_init1(&soap, SOAP_IO_UDP); // must set UDP flag
   // bind to host (NULL=current host) and port:
   if (!soap_valid_socket(soap_bind(&soap, host, port, 100)))
   {
      soap_print_fault(&soap, stderr);
      exit(1);
   }
   for (;;)
   {
      if (soap_serve(&soap))
         soap_print_fault(&soap, stderr); // report the problem
      soap_destroy(&soap);
      soap_end(&soap);
   }
   soap_done(&soap); // close connection
}
int ns__echoString(struct soap *soap, char *str, char **res)
{
   if (!soap->header)
      return soap_sender_fault(soap, "No SOAP header", NULL);
   if (!soap->header->wsa__MessageID)
      return soap_sender_fault(soap, "No WS-Addressing MessageID", NULL);
   soap->header->wsa__RelatesTo = (struct wsa__Relationship*)soap_malloc(soap, sizeof(struct wsa__Relationship));
   soap_default_wsa__Relationship(soap, soap->header->wsa__RelatesTo);
   soap->header->wsa__RelatesTo->__item = soap->header->wsa__MessageID;
   // must check for duplicate messages
   if (check_received(soap->header->wsa__MessageID))
   {
      // Request message already received
      return SOAP_STOP; // don't return response
   }
   if (!soap->header->wsa__ReplyTo || !soap->header->wsa__ReplyTo->Address)
      return soap_sender_fault(soap, "No WS-Addressing ReplyTo address", NULL);
   soap->header->wsa__To = soap->header->wsa__ReplyTo->Address;
   soap->header->wsa__MessageID = soap_strdup(soap, soap_int2s(soap, id_count++)) ;
   soap->header->wsa__Action = "http://genivia.com/udp/echoStringResponse";
   *res = str;
   return SOAP_OK;
}
int ns__sendString(struct soap *soap, char *str)
{
   if (!soap->header)
      return SOAP_STOP;
   if (!soap->header->wsa__MessageID)
      return SOAP_STOP;
   // must check for duplicate messages
   if (check_received(soap->header->wsa__MessageID))
      return SOAP_STOP;
   return SOAP_OK;
}
int ns__sendStringResponse(struct soap *soap, char *res)
{ return SOAP_NO_METHOD; } // we don't expect to serve this message

The server binds to a host and port and accepts messages in a tight sequential loop. Because UDP does not have the equivalent of an accept the messages cannot be dispatched to threads, the soap_serve waits for a message and immediately accepts it. You can use a receive timeout to make soap_serve non-blocking.
To obtain response one-way operations from a WSDL, use the wsdl2h -b option. This produces additional one-way operations to support asynchronous handling of response messages in the same way requests are handled.

18.7  SOAP-over-UDP Multicast Receiving Server

For UDP multicast support, follow the suggestions in Section 18.6 and change the initialization parts of the code to enable UDP multicast port binding by to telliing the kernel which multicast groups you are interested in:


int main()
{
   struct soap soap;
   struct ip_mreq mcast;
   soap_init1(&soap, SOAP_IO_UDP);
   if (!soap_valid_socket(soap_bind(&soap, host, port, 100)))
   {
      soap_print_fault(&soap, stderr);
      exit(1);
   }
   mcast.imr_multiaddr.s_addr = inet_addr("put IP multicast address of group here");
   mcast.imr_interface.s_addr = htonl(INADDR_ANY);
   if (setsockopt(soap.master, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mcast, sizeof(mcast))<0)
      ... error ...

19  Advanced Features

19.1  Internationalization

gSOAP uses regular strings by default. Regular strings cannot be used to hold UCS characters outside of the character range [1,255]. gSOAP can handle wide-character content in two ways. First, applications can utilize wide-character strings (wchar_t*) instead of regular strings to store wide-character content. For example, the xsd:string string schema type can be declared as a wide-character string and used subsequently:

typedef wchar_t *xsd__string;
...
int ns__myMethod(xsd__string input, xsd__string *output);

Second, regular strings can be used to hold wide-character content in UTF-8 format. This is accomplished with the SOAP_C_UTFSTRING flag (for both input/output mode), see Section 9.12. With this flag set, gSOAP will deserialize XML into regular strings in UTF-8 format. An application is responsible for filling regular strings with UTF-8 content to ensure that strings can be correctly serialized XML. Third, the SOAP_C_MBSTRING flag (for both input/output mode) can be used to activate multibyte character support. Multibyte support depends on the locale settings for dealing with extended natural language encodings.
Both regular strings and wide-character strings can be used together within an application. For example, the following header file declaration introduces two string schema types:

typedef wchar_t *xsd__string;
typedef char *xsd__string_; // trailing '_' avoids name clash
...
int ns__myMethod(xsd__string input, xsd__string_ *output);

The input string parameter is a wide-character string and the output string parameter is a regular string. The regular string has UCS character content in the range [1,255] unless the SOAP_C_UTFSTRING flag is set. With this flag, the string has UTF-8 encoded content.
Please consult the UTF-8 specification for details on the UTF-8 format. Note that the ASCII character set [1-127] is a subset of UTF-8. Therefore, with the SOAP_C_UTFSTRING flag set, strings may hold ASCII character data and UTF-8 extensions.

19.2  Customizing the WSDL and Namespace Mapping Table File Contents With gSOAP Directives

A header file can be augmented with directives for the gSOAP soapcpp2 tool to automatically generate customized WSDL and namespace mapping tables contents. The WSDL and namespace mapping table files do not need to be modified by hand (Sections 7.2.9 and 10.4). In addition, the sample SOAP/XML request and response files generated by the compiler are valid provided that XML Schema namespace information is added to the header file with directives so that the gSOAP soapcpp2 compiler can produce example SOAP/XML messages that are correctly namespace qualified. These compiler directive are specified as //-comments. (Note: blanks can be used anywhere in the directive, except between // and gsoap.)
Three directives are currently supported that can be used to specify details associated with namespace prefixes used by the service operation names in the header file. To specify the name of a Web Service in the header file, use:

//gsoap namespace-prefix service name: service-name

where namespace-prefix is a namespace prefix used by identifiers in the header file and service-name is the name of a Web Service (only required to create new Web Services). The name may be followed by text up to the end of the line which is incorporated into the WSDL service documentation. Alternatively, the service documentation can be provided with the directive below.
To specify the name of the WSDL definitions in the header file, use:

//gsoap namespace-prefix service definitions: definitions-name

where namespace-prefix is a namespace prefix used by identifiers in the header file and definitions-name is the name of the WSDL definitions. By default, the WSDL definitions name is the same as the service name.
To specify the documentation of a Web Service in the header file, use:

//gsoap namespace-prefix service documentation: text

where namespace-prefix is a namespace prefix used by identifiers in the header file and text is the documentation text up to the end of the line. The text is incorporated into the WSDL service documentation.
To specify the portType of a Web Service in the header file, use:

//gsoap namespace-prefix service portType: portType-name

or just

//gsoap namespace-prefix service type: portType-name

or using WSDL 2.0 terms

//gsoap namespace-prefix service interface: portType-name

where namespace-prefix is a namespace prefix used by identifiers in the header file and portType-name is the portType name of the WSDL service portType.
To specify the port name of a Web Service in the header file, use:

//gsoap namespace-prefix service portName: port-name

where namespace-prefix is a namespace prefix used by identifiers in the header file and port-name is the name of the WSDL service port element. By default, the port name is the same as the service name.
To specify the binding name of a Web Service in the header file, use:

//gsoap namespace-prefix service binding: binding-name

where namespace-prefix is a namespace prefix used by identifiers in the header file and binding-name is the binding name of the WSDL service binding element. By default, the binding name is the same as the service name.
To specify the binding's transport protocol of a Web Service in the header file, use:

//gsoap namespace-prefix service transport: transport-URL

where namespace-prefix is a namespace prefix used by identifiers in the header file and transport-URL is the URL of the transport protocol such as http://schemas.xmlsoap.org/soap/http for HTTP. HTTP transport is assumed by default.
To specify the location (or port endpoint) of a Web Service in the header file, use:

//gsoap namespace-prefix service location: URL

or alternatively

//gsoap namespace-prefix service endpoint: URL

or

//gsoap namespace-prefix service port: URL

where URL is the location of the Web Service (only required to create new Web Services). The URL specifies the path to the service executable (so URL/service-executable is the actual location of the executable when declared).
To specify the name of the executable of a Web Service in the header file, use:

//gsoap namespace-prefix service executable: executable-name

where executable-name is the name of the executable of the Web Service.
When doc/literal encoding is required for the entire service, the service encoding can be specified in the header file as follows:

//gsoap namespace-prefix service encoding: literal

or when the SOAP-ENV:encodingStyle attribute is different from the SOAP 1.1/1.2 encoding style:

//gsoap namespace-prefix service encoding: encoding-style

To specify the namespace URI of a Web Service in the header file, use:

//gsoap namespace-prefix service namespace: namespace-URI

where namespace-URI is the URI associated with the namespace prefix.
In addition, the schema namespace URI can be specified in the header file:

//gsoap namespace-prefix schema namespace: namespace-URI

where namespace-URI is the schema URI associated with the namespace prefix. If present, it defines the schema-part of the generated WSDL file and the URI in the namespace mapping table. This declaration is useful when the service declares its own data types that need to be associated with a namespace. Furthermore, the header file for client applications do not need the full service details and the specification of the schema namespaces for namespace prefixes suffices. In addition, a second namespace can be defined that is only used to match the namespaces of inbound XML:

//gsoap namespace-prefix schema namespace2: namespace-URI-pattern

If the first namespace does not match the inbound parsed XML, then the second will be tried. This pattern may contain '*' multichar wildcards and '-' single chard wildcards. This allows two or more namespace versions to be handled by the same namespace prefix.
The directive above specifies a new schema and the gSOAP soapcpp2 compiler generates a schema files (.xsd) file for the schema. An existing schema namespace URI can be imported with:

//gsoap namespace-prefix schema import: namespace-URI

where namespace-URI is the schema URI associated with the namespace prefix. gSOAP does not produce XML Schema files for imported schemas and imports the schema namespaces in the generated WSDL file.
A schema namespace URI can be imported from a location with:

//gsoap namespace-prefix schema namespace: namespace-URI
//gsoap namespace-prefix schema import: schema-location

The elementFormDefault and attributeFormDefault qualification of a schema can be defined with:

//gsoap namespace-prefix schema elementForm: qualified
//gsoap namespace-prefix schema attributeForm: qualified

or:

//gsoap namespace-prefix schema elementForm: unqualified
//gsoap namespace-prefix schema attributeForm: unqualified

A shortcut to define the default qualification of elements and attributes of a schema:

//gsoap namespace-prefix schema form: qualified

or:

//gsoap namespace-prefix schema form: unqualified

To include xsi:type attributes in the runtime XML element output for specific schemas, use:

//gsoap namespace-prefix schema typed: yes

Note that soapcpp2 -t enables xsi:type for all elements in the runtime XML output.
To document a data type, use:

//gsoap namespace-prefix schema type-documentation: type-name //text

where type-name is the unqualified name of the data type and text is a line of text terminated by a newline. Do not use any XML reserved characters in text such as < and > . Use well-formed XML and XHTML markup instead. For example:

//gsoap ns schema type-documentation: tdata stores <a href="transaction.html">transaction</a> data
class ns__tdata
{ ... }

To document a data type's fields and members, use:

//gsoap namespace-prefix schema type-documentation: type-name::field //text

where type-name is the unqualified name of the data type, field is a field, member, or enum name, and text is a line of text terminated by a newline. Do not use any XML reserved characters in text such as < and > . Use well-formed XML and XHTML markup instead. For example:

//gsoap ns schema type-documentation: tdata::id the transaction number
//gsoap ns schema type-documentation: tdata::state transaction state
//gsoap ns schema type-documentation: tstate::INIT initial state
//gsoap ns schema type-documentation: tstate::DONE final state
class ns__tdata
{ @int id;
   enum ns__tstate { INIT, DONE } state;
   ...
}

The documentation form above can also be used to document SOAP/XML message parts in the generated WSDL. For the type-name use the function name. For the field names, you can use the function name and/or the function argument names.
To document a method, use:

//gsoap namespace-prefix service method-documentation: method-name //text

where method-name is the unqualified name of the method and text is a line of text terminated by a newline. Do not use any XML reserved characters in text such as < and > . Use well-formed XML and XHTML markup instead. For example:

//gsoap ns service method-documentation: getQuote returns a <i>stock quote</i>
int ns__getQuote(char *symbol, float &_result);

To specify the SOAP Action for a SOAP method, use:

//gsoap namespace-prefix service method-action: method-name action

where method-name is the unqualified name of the method and action is a string without spaces and blanks (the string can be quoted when preferred). For example:

//gsoap ns service method-action: getQuote ""
int ns__getQuote(char *symbol, float &_result);

Or, alternatively for the input action (part of the request):

//gsoap ns service method-input-action: getQuote ""
int ns__getQuote(char *symbol, float &_result);

To specify the HTTP "location" of REST methods to a perform POST/GET/PUT action, use:

//gsoap namespace-prefix service method-action: method-name action

where method-name is the unqualified name of the method and action is a string without spaces and blanks (the string can be quoted when preferred). This directive requires that the protocol: directive for this method is set to HTTP, POST, GET, or PUT.
A response action and fault action are defined by:

//gsoap namespace-prefix service method-output-action: method-name action //gsoap namespace-prefix service method-fault-action: method-name action

To override the SOAP or REST protocol of an operation (SOAP by default), use:

//gsoap namespace-prefix service method-protocol: method-name protocol

where protocol is one of

SOAP default SOAP transport (supports 1.1 and 1.2)
SOAP1.1 SOAP 1.1 only
SOAP1.2 SOAP 1.2 only
SOAP-GET one-way SOAP with HTTP GET
SOAP1.1-GET one-way SOAP 1.1 with HTTP GET
SOAP1.2-GET one-way SOAP 1.1 with HTTP GET
HTTP REST HTTP (POST or one-way PUT)
POST REST HTTP POST
GET one-way REST HTTP GET
PUT one-way REST HTTP PUT
DELETE REST HTTP DELETE

When document style is preferred for a particular service method, use:

//gsoap namespace-prefix service method-style: method-name document

When SOAP RPC encoding is required for a particular service method, use:

//gsoap namespace-prefix service method-encoding: method-name encoded

When literal encoding is required for a particular service method, use:

//gsoap namespace-prefix service method-encoding: method-name literal

or when the SOAP-ENV:encodingStyle attribute is different from the SOAP 1.1/1.2 encoding style, use:

//gsoap namespace-prefix service method-encoding: method-name encoding-style

When SOAP RPC encoding is required for a particular service method response when the request message is literal, use:

//gsoap namespace-prefix service method-response-encoding: method-name encoded

When literal encoding is required for a particular service method response when the request message is encoded, use:

//gsoap namespace-prefix service method-response-encoding: method-name literal

or when the SOAP-ENV:encodingStyle attribute is different from the SOAP 1.1/1.2 encoding style, use:

//gsoap namespace-prefix service method-response-encoding: method-name encoding-style

Note that the method-response-encoding is set to the value of method-encoding by default.
When header processing is required, each method declared in the WSDL should provide a binding to the parts of the header that may appear as part of a method request message. Such a binding is given by:

//gsoap namespace-prefix service method-header-part: method-name header-part

For example:

struct SOAP_ENV__Header
{
   char *h__transaction;
   struct UserAuth *h__authentication;
};

Suppose method ns__login uses both header parts (at most), then this is declared as:

//gsoap ns service method-header-part: login h__transaction
//gsoap ns service method-header-part: login h__authentication
int ns__login(...);

Suppose method ns__search uses only the first header part, then this is declared as:

//gsoap ns service method-header-part: search h__transaction
int ns__search(...);

Note that the method name and header part names MUST be namespace qualified. The headers MUST be present in all operations that declared the header parts.
To specify the header parts for the method input (method request message), use:

//gsoap namespace-prefix service method-input-header-part: method-name header-part

Similarly, to specify the header parts for the method output (method response message), use:

//gsoap namespace-prefix service method-output-header-part: method-name header-part

The declarations above only affect the WSDL. For example:

struct SOAP_ENV__Header
{
   char *h__transaction;
   struct UserAuth *h__authentication;
};
//gsoap ns service method-input-header-part: login h__authentication
//gsoap ns service method-input-header-part: login h__transaction
//gsoap ns service method-output-header-part: login h__transaction
int ns__login(...);

The headers MUST be present in all operations that declared the header parts.
To specify MIME attachments for the method input and output (method request and response messages), use:

//gsoap namespace-prefix service method-mime-type: method-name mime-type

You can repeat this directive for all multipartRelated MIME attachments you want to associate with the method.
To specify MIME attachments for the method input (method request message), use:

//gsoap namespace-prefix service method-input-mime-type: method-name mime-type

Similarly, to specify MIME attachments for the method output (method response message), use:

//gsoap namespace-prefix service method-output-mime-type: method-name mime-type

You can repeat these directives for all multipartRelated MIME attachments you want to associate with the method.

19.2.1  Example

The use of directives is best illustrated with an example. The example uses a hypothetical stock quote service and exchange rate service, actual services such as these are available for free on the web.

//gsoap ns1 service namespace: urn:GetQuote
int ns1__getQuote(char *symbol, float &result);

//gsoap ns2 service namespace: urn:CurrencyExchange
int ns2__getRate(char *country1, char *country2, float &result);

//gsoap ns3 service name: quotex
//gsoap ns3 service style: rpc
//gsoap ns3 service encoding: encoded
//gsoap ns3 service port: http://www.mydomain.com/quotex.cgi
//gsoap ns3 service namespace: urn:quotex
int ns3__getQuote(char *symbol, char *country, float &result);

The quotex.h example is a new Web Service created by combining two existing Web Services: a Stock Quote service and a Currency Exchange service.
Namespace prefix ns3 is used for the new quotex Web Service with namespace URI urn:quotex, service name quotex, and endpoint port http://www.mydomain.com/quotex.cgi.
Since the new Web Service invokes the ns1__getQuote and ns2__getRate service operations, the service namespaces and other details such as style and encoding of these methods are given by directives. After invoking the gSOAP soapcpp2 tool on the quotex.h header file:

> soapcpp2 quotex.h

the WSDL of the new quotex Web Service is saved as quotex.wsdl. Since the service name, endpoint port, and namespace URI were provided in the header file, the generated WSDL file can be published together with the compiled Web Service installed as a CGI application.
The namespace mapping table for the quotex.cpp Web Service implementation is saved as quotex.nsmap. This file can be directly included in quotex.cpp instead of specified by hand in the source of quotex.cpp:

#include "quotex.nsmap"

The automatic generation and inclusion of the namespace mapping table requires compiler directives for all namespace prefixes to associate each namespace prefix with a namespace URI. Otherwise, namespace URIs have to be manually added to the table (they appear as http://tempuri.org).

19.3  Transient Data Types

There are situations when certain data types have to be ignored by gSOAP for the compilation of (de)marshalling routines. For example, in certain cases only a few members of a class or struct need not be (de)serialized, or the base class of a derived class should not be (de)serialized. Certain built-in classes such as ostream cannot be (de)serialized. Data parts that should be kept invisible to gSOAP are called "transient". Transient data types and transient struct/class members are declared with the extern keyword or are declared within [ and ] blocks in the header file. The extern keyword has a special meaning to the gSOAP soapcpp2 compiler and won't affect the generated codes. The special [ and ] block construct can be used with data type declarations and within struct and class declarations. The use of extern or [ ] achieve the same effect, but [ ] may be more convenient to encapsulate transient types in a larger part of the header file. The use of extern with typedef is reserved for the declaration of user-defined external (de)serializers for data types, see Section 19.5.
First example:

extern class ostream; // ostream can't be (de)serialized, but need to be declared to make it visible to gSOAP
class ns__myClass
{ ...
   virtual void print(ostream &s) const; // need ostream here
   ...
};

Second example:

[
   class myBase // base class need not be (de)serialized
   { ... };
]
class ns__myDerived : myBase
{ ... };

Third example:

[ typedef int transientInt; ]
class ns__myClass
{
   int a; // will be (de)serialized
   [
   int b; // transient field
   char s[256]; // transient field
   ]
   extern float d; // transient field
   char *t; // will be (de)serialized
   transientInt *n; // transient field
   [
   virtual void method(char buf[1024]); // does not create a char[1024] (de)serializer
   ]
};

In this example, class ns__myClass has three transient fields: b, s, and n which will not be (de)serialized in SOAP. Field n is transient because the type is declared within a transient block. Pointers, references, and arrays of transient types are transient. The single class method is encapsulated within [ and ] to prevent gSOAP from creating (de)serializers for the char[1024] type. gSOAP will generate (de)serializers for all types that are not declared within a [ and ] transient block.

19.4  Serialization "as is" with Volatile Data Types

Volatile-declared data types in gSOAP are assumed to be part of an existing non-modifiable software package, such as a built-in library. It would not make sense to redefine the data types in a gSOAP header file. In certain cases it could also be problematic to have classes augmented with serializer methods. When you need to (de)serialize such data types "as is", you must declare them in a gSOAP header file and use the volatile qualifier.
Consider for example struct tm, declared in time.h. The structure may actually vary between platforms, but the tm structure includes at least the following fields:

volatile struct tm
{
   int tm_sec; /* seconds (0 - 60) */
   int tm_min; /* minutes (0 - 59) */
   int tm_hour; /* hours (0 - 23) */
   int tm_mday; /* day of month (1 - 31) */
   int tm_mon; /* month of year (0 - 11) */
   int tm_year; /* year - 1900 */
   int tm_wday; /* day of week (Sunday = 0) */
   int tm_yday; /* day of year (0 - 365) */
   int tm_isdst; /* is summer time in effect? */
   char *tm_zone; /* abbreviation of timezone name */
   long tm_gmtoff; /* offset from UTC in seconds */
};

Note that we qualified the structure volatile in the gSOAP header file to inform the gSOAP soapcpp2 compiler that it should not attempt to redeclare it. We can now readily serialize and deserialize the tm structure. The following program fragment serializes the local time stored in a tm structure to stdout:

struct soap *soap = soap_new();
...
time_t T = time(NULL);
struct tm *t = localtime(&T);
struct soap *soap = soap_new();
soap_write_tm(soap, t);
soap_destroy(soap);
soap_end(soap);
soap_free(soap); // detach and free context

It is also possible to serialize the tm fields as XML attributes using the @qualifier, see Section 11.6.7.
If you must produce a schema file, say time.xsd, that defines an XML schema and namespace for the tm struct, you can add a typedef declaration to the header file:

typedef struct tm time__struct_tm;

We used the typedef name time__struct_tm rather than time__ tm, because a schema name clash will occur with the latter since taking off the time prefix will result in the same name being used.
Classes should be declared volatile to prevent modification of these classes by ithe gSOAP soapcpp2 source code output. Note that gSOAP adds serialization methods to classes to support polymorphism. However, this is a problem when you can't modify class declarations because they are part of a non-modifiable software package. The solution is to declare these classes volatile, similar to the tm structure example illustrated above. You can also use a typedef to associate a schema with a class.

19.5  How to Declare User-Defined Serializers and Deserializers

Users can declare their own (de)serializers for specific data types instead of relying on the gSOAP-generated (de)serializers. To declare a external (de)serializer, declare a type with extern typedef. gSOAP will not generate the (de)serializers for the type name that is declared. For example:

extern typedef char *MyData;
struct Sample
{
   MyData s; // use user-defined (de)serializer for this field
   char *t; // use gSOAP (de)serializer for this field
};

The user is required to supply the following routines for each extern typedef'ed name T:

void soap_serialize_T(struct soap *soap, const T *a)
void soap_default_T(struct soap *soap, T *a)
void soap_out_T(struct soap *soap, const char *tag, int id, const T *a, const char *type)
T *soap_in_T(struct soap *soap, const char *tag, T *a, const char *type)

The function prototypes can be found in soapH.h.
For example, the (de)serialization of MyData can be done with the following code:

void soap_serialize_MyData(struct soap *soap, MyData *const*a)
{ } // no need to mark this node (for multi-ref and cycle detection)
void soap_default_MyData(&soap, MyData **a)
{ *a = NULL }
void soap_out_MyData(struct soap *soap, const char *tag, int id, MyData *const*a, const char *type)
{
   soap_element_begin_out(soap, tag, id, type); // print XML beginning tag
   soap_send(soap, *a); // just print the string (no XML conversion)
   soap_element_end_out(soap, tag); // print XML ending tag
}
MyData **soap_in_MyData(struct soap *soap, const char *tag, MyData **a, const char *type)
{
   if (soap_element_begin_in(soap, tag))
      return NULL;
   if (!a)
      a = (MyData**)soap_malloc(soap, sizeof(MyData*));
   if (soap->null)
      *a = NULL; // xsi:nil element
   if (*soap->type && soap_match_tag(soap, soap->type, type))
   {
      soap->error = SOAP_TYPE;
      return NULL; // type mismatch
   }
   if (*soap->href)
      a = (MyData**)soap_id_forward(soap, soap->href, a, SOAP_MyData, sizeof(MyData*))
   else if (soap->body)
   {
      char *s = soap_value(soap); // fill buffer
      *a = (char*)soap_malloc(soap, strlen(s)+1);
      strcpy(*a, s);
   }
   if (soap->body && soap_element_end_in(soap, tag))
      return NULL;
   return a;

More information on custom (de)serialization will be provided in this document or in a separate document in the future. The writing of the (de)serializer code requires the use of the low-level gSOAP API.

19.6  How to Serialize Data Without Generating XSD Type Attributes

gSOAP serializes data in XML with xsi:type attributes when the types are declared with namespace prefixes to indicate the schema type of the data contained in the elements. SOAP 1.1 and 1.2 requires xsi:type attributes in the presence of polymorphic data or when the type of the data cannot be deduced from the SOAP payload. The namespace prefixes are associated with the type names of typedefs (Section 11.3) for primitive data types, struct/class names, and enum names.
To prevent the output of these xsi:type attributes in the XML serialization, you can simply use type declarations that do not include these namespace prefixes. That is, don't use the typedefs for primitive types and use unqualified type names with structs, classes, and enums.
However, there are two issues. Firstly, if you want to use a primitive schema type that has no C/C++ counterpart, you must declare it as a typedef name with a leading underscore, as in:

typedef char *_xsd__date;

This will produce the necessary xsd:date information in the WSDL output by the gSOAP soapcpp2 compiler. But the XML serialization of this type at run time won't include the xsi:type attribute. Secondly, to include the proper schema definitions in the WSDL produced by the gSOAP soapcpp2 compiler, you should use qualified struct, class, and enum names with a leading underscore, as in:

struct _ns__myStruct
{ ... };

This ensures that myStruct is associated with a schema, and therefore included in the appropriate schema in the generated WSDL. The leading underscore prevents the XML serialization of xsi:type attributes for this type in the SOAP/XML payload.

19.7  Function Callbacks for Customized I/O and HTTP Handling

gSOAP provides five callback functions for customized I/O and HTTP handling:

Callback (function pointer)
SOAP_SOCKET (*soap.fopen)(struct soap *soap, const char *endpoint, const char *host, int port)
Called from a client proxy to open a connection to a Web Service located at endpoint. Input parameters host and port are micro-parsed from endpoint. Should return a valid file descriptor, or SOAP_INVALID_SOCKET and soap->error set to an error code. Built-in gSOAP function: tcp_connect
int (*soap.fclose)(struct soap *soap)
Called by client proxy multiple times, to close a socket connection before a new socket connection is established and at the end of communications when the SOAP_IO_KEEPALIVE flag is not set and soap.keep_alive ≠ 0 (indicating that the other party supports keep alive). Should return SOAP_OK, or a gSOAP error code. Built-in gSOAP function: tcp_disconnect



Callback (function pointer)
int (*soap.fget)(struct soap *soap)
Called by the main server loop upon an HTTP GET request. The SOAP_GET_METHOD error is returned by default. This callback can be used to respond to HTTP GET methods with content, see Section 19.10. Should return SOAP_OK, or a gSOAP error code. Built-in gSOAP function: http_get
int (*soap.fput)(struct soap *soap)
Called by the main server loop upon an HTTP PUT request. The SOAP_PUT_METHOD error is returned by default. This callback can be used to respond to HTTP PUT. Should return SOAP_OK, or a gSOAP error code. Built-in gSOAP function: http_put
int (*soap.fdel)(struct soap *soap)
Called by the main server loop upon an HTTP DELETE request. The SOAP_DELETE_METHOD error is returned by default. This callback can be used to respond to HTTP DELETE methods. Should return SOAP_OK, or a gSOAP error code. Built-in gSOAP function: http_del
int (*soap.fhead)(struct soap *soap)
Called by the main server loop upon an HTTP HEAD request. The SOAP_HEAD_METHOD error is returned by default. This callback can be used to respond to HTTP HEAD methods. Should return SOAP_OK, or a gSOAP error code. Built-in gSOAP function: http_get
int (*soap.fform)(struct soap *soap)
Called by the main server loop when a user-defined fparsehdr callback returned SOAP_FORM to signal that the HTTP body must be processed by this form handler callback. The HTTP POST form data MUST be read, otherwise keep-alive messages will end up out of sync. Should return SOAP_OK or a gSOAP error code. Built-in gSOAP function: none.
int (*soap.fpost)(struct soap *soap, const char *endpoint, const char *host, int port, const char *path, const char *action, size_t count)
Called from a client proxy to generate the HTTP header to connect to endpoint. Input parameters host, port, and path are micro-parsed from endpoint, action is the SOAP action, and count is the length of the SOAP message or 0 when SOAP_ENC_XML is set or when SOAP_IO_LENGTH is reset. Use function soap_send(struct soap *soap, char *s) to write the header contents. Should return SOAP_OK, or a gSOAP error code. Built-in gSOAP function: http_post.
int (*soap.fposthdr)(struct soap *soap, const char *key, const char *val)
Called by http_post and http_response (through the callbacks). Emits HTTP key: val header entries. Should return SOAP_OK, or a gSOAP error code. Built-in gSOAP function: http_post_header.
int (*soap.fresponse)(struct soap *soap, int soap_error_code, size_t count)
Called from a service to generate the response HTTP header. Input parameter soap_error_code is a gSOAP error code (see Section 10.2 and count is the length of the SOAP message or 0 when SOAP_ENC_XML is set or when SOAP_IO_LENGTH is reset. Use function soap_send(struct soap *soap, char *s) to write the header contents. Should return SOAP_OK, or a gSOAP error code Built-in gSOAP function: http_response
int (*soap.fparse)(struct soap *soap)
Called by client proxy and service to parse an HTTP header (if present). When user-defined, this routine must at least skip the header. Use function int soap_getline(struct soap *soap, char *buf, int len) to read HTTP header lines into a buffer buf of length len (returns empty line at end of HTTP header). Should return SOAP_OK, or a gSOAP error code. Built-in gSOAP function: http_parse
int (*soap.fparsehdr)(struct soap *soap, const char *key, const char *val)
Called by http_parse (through the fparse callback). Handles HTTP key: val header entries to set gSOAP's internals. Should return SOAP_OK, SOAP_STOP (see fstop) or a gSOAP error code. Built-in gSOAP function: http_parse_header



Callback (function pointer)
int (*soap.fsend)(struct soap *soap, const char *s, size_t n)
Called for all send operations to emit contents of s of length n. Should return SOAP_OK, or a gSOAP error code. Built-in gSOAP function: fsend
size_t (*soap.frecv)(struct soap *soap, char *s, size_t n)
Called for all receive operations to fill buffer s of maximum length n. Should return the number of bytes read or 0 in case of an error, e.g. EOF. Built-in gSOAP function: frecv
int (*soap.fignore)(struct soap *soap, const char *tag)
Called when an unknown XML element was encountered on the input. The tag parameter is the offending XML element tag name. Should return SOAP_OK, or a gSOAP error code such as SOAP_TAG_MISMATCH to throw an exception. Built-in gSOAP function: none.
int (*soap.fconnect)(struct soap *soap, const char *endpoint, const char *host, int port)
When non-NULL, this callback is called for all client-to-server connect operations instead of the built-in socket connect code. Therefore, it can be used to override the built-in connection establishment. Parameter endpoint contains the server endpoint URL, host the domain name or IP, and port the port number. Should return SOAP_OK, or a gSOAP error code. Built-in gSOAP function: none
SOAP_SOCKET (*soap.faccept)(struct soap *soap, SOAP_SOCKERT s, struct sockaddr *a, int *n)
Called by soap_accept. This is a wrapper routine for accept. Given master socket s should return a valid socket descriptor or SOAP_INVALID_SOCKET and set soap->error to an error code. Built-in gSOAP function: tcp_accept
int (*soap.fresolve)(struct soap *soap, const char *addr, struct in_addr *inaddr)
Called by soap_bind if a host name is given and soap_connect to resolve a domain name addr. Should set in_addr *a and return SOAP_OK or return SOAP_ERR upon failure.
Built-in gSOAP function: tcp_gethost
int (*soap.fpoll)(struct soap *soap)
Used by clients to check if the server is still responsive.
Built-in gSOAP function: soap_poll
int (*soap.fserveloop)(struct soap *soap)
Called after successful invocation of a server operation in the server loop, immediately after sending the response to a client. Can be used to clean up resources (e.g. using soap_end()) while serving a long sequence of keep-alive connections. Should return SOAP_OK, or set soap->error to a gSOAP error code and return soap->error. Built-in gSOAP function: none.
void (*soap.fmalloc)(struct soap *soap, size_t n)
Use to override memory allocation for deserialized C data. Memory allocated via this callback will not be automatically released by the gSOAP engine. The application must release this data by keeping track of the allocations. Note: it is not safe to traverse deserialized data structures and free each node, since data might be shared (SOAP multiref) and some allocated data such as the HTTP SOAPAction might no be part of the structure.
Built-in gSOAP function: none.
int (*soap.fheader)(struct soap *soap)
Called immediately after parsing a SOAP Header. The SOAP Header struct referenced by soap->header can be inspected and verified. The function should return SOAP_OK or a fault.
Built-in gSOAP function: none.
void (*soap.fsvalidate)(struct soap *soap, const char *pattern, const char *string)
Called to validate a non-NULL string against a non-NULL pattern. Patterns use XML schema regex syntax. Allows user-defined pattern validation. Should return SOAP_OK when the string matches the pattern or SOAP_PATTERN when the string does not match.
Built-in gSOAP function: none.
void (*soap.fwvalidate)(struct soap *soap, const char *pattern, const wchar_t *string)
Called to validate a non-NULL wide string against a non-NULL pattern. Patterns use XML schema regex syntax. Allows user-defined pattern validation. Should return SOAP_OK when the string matches the pattern or SOAP_PATTERN when the string does not match.
Built-in gSOAP function: none.
void (*soap.fseterror)(struct soap *soap, const char **code, const char **string)
Called to set the SOAP Fault code and string values based on the value of soap->error. Allows user-defined messages to be associated with gSOAP error codes to override gSOAP's built-in error messages.
Built-in gSOAP function: none.

In addition, a void*user field in the struct soap data structure is available to pass user-defined data to the callbacks.
The following example uses I/O function callbacks for customized serialization of data into a fixed-size buffer and deserialization back into a datastructure:

char buf[10000]; // XML buffer
int len1 = 0; // #chars written
int len2 = 0; // #chars read
// mysend: put XML in buf[]
int mysend(struct soap *soap, const char *s, size_t n)
{
   if (len1 + n > sizeof(buf))
      return SOAP_EOF;
   strcpy(buf + len1, s);
   len1 += n;
   return SOAP_OK;
}
// myrecv: get XML from buf[]
size_t myrecv(struct soap *soap, char *s, size_t n)
{
   if (len2 + n > len1)
      n = len1 - len2;
   strncpy(s, buf + len2, n);
   len2 += n;
   return n;
}
int main()
{
   struct soap soap;
   struct ns__person p;
   soap_init(&soap);
   len1 = len2 = 0; // reset buffer pointers
   p.name = "John Doe";
   p.age = 25;
   soap.fsend = mysend; // assign callback
   soap.frecv = myrecv; // assign callback
   soap_begin_send(&soap);
   soap_set_omode(&soap, SOAP_XML_TREE);
   soap_serialize_ns__person(&soap, &p);
   soap_put_ns__person(&soap, &p, "ns:person", NULL);
   soap_end_send(&soap);
   if (soap.error)
   {
      soap_print_fault(&soap, stdout);
      exit(1);
   }
   soap_begin_recv(&soap);
   soap_get_ns__person(&soap, &p, "ns:person", NULL);
   soap_end_recv(&soap);
   if (soap.error)
   {
      soap_print_fault(&soap, stdout);
      exit(1);
   }
   soap_destroy(&soap);
   soap_end(&soap);
   soap_done(&soap); // disable callbacks
}

A fixed-size buffer to store the outbound message sent is not flexible to handle large content. To store the message in an expanding buffer, use for example:

struct buffer
{
   size_t len;
   size_t max;
   char *buf;
};
int main()
{
   struct buffer *h = malloc(sizeof(struct buffer));
   h->len = 0;
   h->max = 0;
   h->buf = NULL;
   soap.user = (void *)h; // pass buffer as a handle to the callback
   soap.fsend = mysend; // assign callback
   ...
   if (h->len)
   {
      ... // use h->buf[0..h->len-1] content
      // then cleanup:
      h->len = 0;
      h->max = 0;
      free(h->buf);
      h->buf = NULL;
   }
   ...
}
int mysend(struct soap *soap, const char *s, size_t n)
{
   struct buffer *h = (struct buffer*)soap->user; // get buffer through handle
   int m = h->max, k = h->len + n;
   // need to increase space?
   if (m == 0)
      m = 1024;
   else 
      while (k >= m)
         m *= 2;
   if (m != h->max)
   {
      char *buf = malloc(m);
      memcpy(buf, h->buf, h->len);
      h->max = m;
      if(h->buf)
         free(h->buf);
      h->buf = buf;
   }
   memcpy(h->buf + h->len, s, n);
   h->len += n;
   return SOAP_OK;
}

The soap_done function can be called to reset the callback to the default internal gSOAP I/O and HTTP handlers.
The following example illustrates customized I/O and (HTTP) header handling. The SOAP request is saved to a file. The client proxy then reads the file contents as the service response. To perform this trick, the service response has exactly the same structure as the request. This is declared by the struct ns__test output parameter part of the service operation declaration. This struct resembles the service request (see the generated soapStub.h file created from the header file).
The header file is:

//gsoap ns service name: callback
//gsoap ns service namespace: urn:callback
struct ns__person
{
   char *name;
   int age;
};
int ns__test(struct ns__person in, struct ns__test &out);

The client program is:

#include "soapH.h"
...
SOAP_SOCKET myopen(struct soap *soap, const char *endpoint, const char *host, int port)
{
   if (strncmp(endpoint, "file:", 5))
   {
      printf("File name expected\n");
      return SOAP_INVALID_SOCKET;
   }
   if ((soap->sendfd = soap->recvfd = open(host, O_RDWR | O_CREAT, S_IWUSR | S_IRUSR)) < 0)
      return SOAP_INVALID_SOCKET;
   return soap->sendfd;
}
void myclose(struct soap *soap)
{
   if (soap->sendfd > 2) // still open?
      close(soap->sendfd); // then close it
   soap->recvfd = 0; // set back to stdin
   soap->sendfd = 1; // set back to stdout
}
int mypost(struct soap *soap, const char *endpoint, const char *host, const char *path, const char *action, size_t count)
{
   return soap_send(soap, "Custom-generated file\n"); // writes to soap->sendfd
}
int myparse(struct soap *soap)
{
   char buf[256];
   if (lseek(soap->recvfd, 0, SEEK_SET) < 0 || soap_getline(soap, buf, 256)) // go to begin and skip custom header
      return SOAP_EOF;
   return SOAP_OK;
}
int main()
{
   struct soap soap;
   struct ns__test r;
   struct ns__person p;
   soap_init(&soap); // reset
   p.name = "John Doe";
   p.age = 99;
   soap.fopen = myopen; // use custom open
   soap.fpost = mypost; // use custom post
   soap.fparse = myparse; // use custom response parser
   soap.fclose = myclose; // use custom close
   soap_call_ns__test(&soap, "file://test.xml", "", p, r);
   if (soap.error)
   {
      soap_print_fault(&soap, stdout);
      exit(1);
   }
   soap_end(&soap);
   soap_init(&soap); // reset to default callbacks
}

SOAP 1.1 and 1.2 specify that XML elements may be ignored when present in a SOAP payload on the receiving side. gSOAP ignores XML elements that are unknown, unless the XML attribute mustUnderstand="true" is present in the XML element. It may be undesirable for elements to be ignored when the outcome of the omission is uncertain. The soap.fignore callback can be set to a function that returns SOAP_OK in case the element can be safely ignored, or SOAP_MUSTUNDERSTAND to throw an exception, or to perform some application-specific action. For example, to throw an exception as soon as an unknown element is encountered on the input, use:

int myignore(struct soap *soap, const char *tag)
{
   return SOAP_MUSTUNDERSTAND; // never skip elements (secure)
}
...
soap.fignore = myignore;
soap_call_ns__method(&soap, ...); // or soap_serve(&soap);

To selectively throw an exception as soon as an unknown element is encountered but element ns:xyz can be safely ignored, use:

int myignore(struct soap *soap, const char *tag)
{
   if (soap_match_tag(soap, tag, "ns:xyz") != SOAP_OK)
      return SOAP_MUSTUNDERSTAND;
   return SOAP_OK;
}
...
soap.fignore = myignore;
soap_call_ns__method(&soap, ...); // or soap_serve(&soap)
...
struct Namespace namespaces[] =
{
   {"SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/"},
   {"SOAP-ENC","http://schemas.xmlsoap.org/soap/encoding/"},
   {"xsi", "http://www.w3.org/2001/XMLSchema-instance"},
   {"xsd", "http://www.w3.org/2001/XMLSchema"},
   {"ns", "some-URI"}, // the namespace of element ns:xyz
   {NULL, NULL}

Function soap_match_tag compares two tags. The third parameter may be a pattern where * is a wildcard and - is a single character wildcard. So for example soap_match_tag(tag, "ns:*") will match any element in namespace ns or when no namespace prefix is present in the XML message.
The callback can also be used to keep track of unknown elements in an internal data structure such as a list:

struct Unknown
{
   char *tag;
   struct Unknown *next;
};
int myignore(struct soap *soap, const char *tag)
{
   char *s = (char*)soap_malloc(soap, strlen(tag)+1);
   struct Unknown *u = (struct Unknown*)soap_malloc(soap, sizeof(struct Unknown));
   if (s && u)
   {
      strcpy(s, tag);
      u->tag = s;
      u->next = ulist;
      ulist = u;
   }
}
...
struct soap *soap;
struct Unknown *ulist = NULL;
soap_init(&soap);
soap.fignore = myignore;
soap_call_ns__method(&soap, ...); // or soap_serve(&soap)
// print the list of unknown elements
soap_end(&soap); // clean up

19.8  HTTP 1.0 and 1.1

gSOAP uses HTTP 1.1 by default. You can revert to HTTP 1.0 as follows:

struct soap soap;
soap_init(&soap);
...
soap.http_version = "1.0";

This sets the HTTP version and reconfigures the engine to revert to HTTP 1.0. Note that you cannot use HTTP chunking with HTTP 1.0.

19.9  HTTP 307 Temporary Redirect Support

The client-side handling of HTTP 307 code "Temporary Redirect" and any of the redirect codes 301, 302, and 303 are not automated in gSOAP. Client application developers may want to consider adding a few lines of code to support redirects. It was decided not to automatically support redirects for the following reasons:
  • Redirecting a secure HTTPS address to a non-secure HTTP address via 307 creates a security vulnerability.
  • Cyclic redirects must be detected (e.g. allowing only a limited number of redirect levels).
  • Redirecting HTTP POST will result in re-serialization and re-post of the entire SOAP request. The SOAP request message must be re-posted in its entirity when re-issuing the SOAP operation to a new address.
To implement client-side 307 redirect, add the following lines of code:

char *endpoint = NULL; // use default endpoint given in WSDL (or add another one here)
int n = 10; // max redirect count
while (n− −)
{
   if (soap_call_ns1__myMethod(soap, endpoint, ...))
   {
      if ((soap->error >= 301 && soap->error <= 303) || soap->error == 307)
         endpoint = soap_strdup(soap, soap->endpoint); // endpoint from HTTP 301, 302, 303, 307 Location header
      else
         { ... report and handle error
            break;
         }
   }
   else
      break;
}

19.10  HTTP GET Support

To implement your own HTTP (HTTPS) GET request responses, you need to set the soap.fget callback. The callback is required to produce a response to the request in textual form, such as a Web page or a SOAP/XML response. This method does not work with CGI.
The following example produces a Web page upon a HTTP GET request (e.g. from a browser):

struct soap *soap = soap_new();
soap->fget = http_get;
...
soap_serve(soap);
...
int http_get(struct soap *soap)
{
   soap_response(soap, SOAP_HTML); // HTTP response header with text/html
   soap_send(soap, "<HTML>My Web server is operational.</HTML>");
   soap_end_send(soap);
   return SOAP_OK;
}

The example below produces a WSDL file upon a HTTP GET with path ?wsdl:

int http_get(struct soap *soap)
{
   FILE *fd = NULL;
   char *s = strchr(soap->path, '?');
   if (!s || strcmp(s, "?wsdl"))
      return SOAP_GET_METHOD;
   fd = fopen("myservice.wsdl", "rb"); // open WSDL file to copy
   if (!fd)
      return 404; // return HTTP not found error
   soap->http_content = "text/xml"; // HTTP header with text/xml content
   soap_response(soap, SOAP_FILE);
   for (;;)
   {
      size_t r = fread(soap->tmpbuf, 1, sizeof(soap->tmpbuf), fd);
      if (!r)
         break;
      if (soap_send_raw(soap, soap->tmpbuf, r))
         break; // can't send, but little we can do about that
   }
   fclose(fd);
   soap_end_send(soap);
   return SOAP_OK;
}

Using one-way SOAP/XML message, you can also return a SOAP/XML response:

int http_get(struct soap *soap)
{
   if ((soap->omode & SOAP_IO) != SOAP_IO_CHUNK)
      soap_set_omode(soap, SOAP_IO_STORE); // if not chunking we MUST buffer entire content to determine content length
   soap_response(soap, SOAP_OK);
   return soap_send_ns1__mySendMethodResponse(soap, "", NULL, ... params ...);
}

where ns1__mySendMethodResponse is a one-way message declared in a gSOAP header file as:

int ns1__mySendMethodResponse(... params ..., void);

The generated soapClient.cpp includes the sending-side stub function.

19.11  TCP and HTTP Keep-Alive

gSOAP supports keep-alive socket connections. To activate keep-alive support, set the SOAP_IO_KEEPALIVE flag for both input and output modes, see Section 9.12. For example

struct soap soap;
soap_init2(&soap, SOAP_IO_KEEPALIVE, SOAP_IO_KEEPALIVE);

When a client or a service communicates with another client or service that supports keep alive, the attribute soap.keep_alive will be set to 1, otherwise it is reset to 0 (indicating that the other party will close the connection). The connection maybe terminated on either end before the communication completed, for example when the server keep-alive connection has timed out. This generates a "Broken Pipe" signal on Unix/Linux platforms. This signal can be caught with a signal handler:

signal(SIGPIPE, sigpipe_handle);

where, for example:

void sigpipe_handle(int x) { }

Alternatively, broken pipes can be kept silent by setting:

soap.socket_flags = MSG_NOSIGNAL;

This setting will not generate a sigpipe but read/write operations return SOAP_EOF instead. Note that Win32 systems do not support signals and lack the MSG_NOSIGNAL flag. The sigpipe handling and flags are not very portable.
A connection will be kept open only if the request contains an HTTP 1.0 header with "Connection: Keep-Alive" or an HTTP 1.1 header that does not contain "Connection: close". This means that a gSOAP client method call should use "http://" in the endpoint URL of the request to the stand-alone service to ensure HTTP headers are used.
If the client does not close the connection, the server will wait forever when no recv_timeout is specified. In addition, other clients will be denied service as long as a client keeps the connection to the server open. To prevent this from happening, the service should be multi-threaded such that each thread handles the client connection:

int main(int argc, char **argv)
{
   struct soap soap, *tsoap;
   pthread_t tid;
   int m, s;
   soap_init2(&soap, SOAP_IO_KEEPALIVE, SOAP_IO_KEEPALIVE);
   soap.max_keep_alive = 100; // at most 100 calls per keep-alive session
   soap.accept_timeout = 600; // optional: let server time out after ten minutes of inactivity
   m = soap_bind(&soap, NULL, 18000, BACKLOG); // use port 18000 on the current machine
   if (m < 0)
   {
      soap_print_fault(&soap, stderr);
      exit(1);
   }
   fprintf(stderr, "Socket connection successful %d\n", m);
   for (count = 0; count >= 0; count++)
   {
      soap.socket_flags = MSG_NOSIGNAL; // use this
      soap.accept_flags = SO_NOSIGPIPE; // or this to prevent sigpipe
      s = soap_accept(&soap);
      if (s < 0)
      {
         if (soap.errnum)
            soap_print_fault(&soap, stderr);
         else
            fprintf(stderr, "Server timed out\n"); // Assume timeout is long enough for threads to complete serving requests
         break;
      }
      fprintf(stderr, "Accepts socket %d connection from IP %d.%d.%d.%d\n", s, (int)(soap.ip >> 24)&0xFF, (int)(soap.ip >> 16)&0xFF, (int)(soap.ip >> 8)&0xFF, (int)soap.ip&0xFF);
      tsoap = soap_copy(&soap);
      pthread_create(&tid, NULL, (void*(*)(void*))process_request, (void*)tsoap);
   }
   return 0;
}
void *process_request(void *soap)
{
   pthread_detach(pthread_self());
   ((struct soap*)soap)->recv_timeout = 300; // Timeout after 5 minutes stall on recv
   ((struct soap*)soap)->send_timeout = 60; // Timeout after 1 minute stall on send
   soap_serve((struct soap*)soap);
   soap_destroy((struct soap*)soap);
   soap_end((struct soap*)soap);
   soap_free((struct soap*)soap);
   return NULL;
}

To prevent a malicious client from keeping a thread waiting forever by keeping the connection open, timeouts are set in the process_request routine as shown. See Section 19.19 for more details on timeout settings.
A gSOAP client call will automatically attempt to re-establish a connection to a server when the server has terminated the connection for any reason. This way, a sequence of calls can be made to the server while keeping the connection open. Client stubs will poll the server to check if the connection is still open. When the connection was terminated by the server, the client will automatically reconnect.
A client should reset SOAP_IO_KEEPALIVE just before the last call to a server to close the connection after this last call. This will close the socket after the call and also informs the server to gracefully close the connection.
The client-side can also set the TCP keep-alive socket properties, using the soap.tcp_keep_alive flag (set to 1 to enable), soap.tcp_keep_idle to set the TCP_KEEPIDLE value, soap.tcp_keep_intvl to set the TCP_KEEPINTVL value, and soap.tcp_keep_cnt to set the TCP_KEEPCNT value.
If a client is in the middle of soap call that might take a long time and the server goes away/down the caller does not get any feedback until the soap.recv_timeout is reached. Enabling TCP keep alive on systems that support it allows for a faster connection teardown detection for applications that need it.

19.12  HTTP Chunked Transfer Encoding

gSOAP supports HTTP chunked transfer encoding. Un-chunking of inbound messages takes place automatically. Outbound messages are never chunked, except when the SOAP_IO_CHUNK flag is set for the output mode. Most Web services, however, will not accept chunked inbound messages.

19.13  HTTP Buffered Sends

The entire outbound message can be stored to determine the HTTP content length rather than the two-phase encoding used by gSOAP which requires a separate pass over the data to determine the length of the outbound message. Setting the flag SOAP_IO_STORE for the output mode will buffer the entire message. This can speed up the transmission of messages, depending on the content, but may require significant storage space to hold the verbose XML message.
Zlib compressed transfers require buffering. The SOAP_IO_STORE flag is set when the SOAP_ENC_ZLIB flag is set to send compressed messages. The use of chunking significantly reduces memory usage and may speed up the transmission of compressed SOAP/XML messages. This is accomplished by setting the SOAP_IO_CHUNK flag with SOAP_ENC_ZLIB for the output mode.

19.14  HTTP Authentication

HTTP authentication (basic) is enabled at the client-side by setting the soap.userid and soap.passwd strings to a username and password, respectively. A server may request user authentication and denies access (HTTP 401 error) when the client tries to connect without HTTP authentication (or with the wrong authentication information).
Here is an example client code fragment to set the HTTP authentication username and password:

struct soap soap;
soap_init(&soap);
soap.userid = "guest";
soap.passwd = "visit";
...

A client SOAP request will have the following HTTP header:

POST /XXX HTTP/1.0
Host: YYY
User-Agent: gSOAP/2.2
Content-Type: text/xml; charset=utf-8
Content-Length: nnn
Authorization: Basic Z3Vlc3Q6Z3Vlc3Q=
...

A client MUST set the soap.userid and soap.passwd strings for each call that requires client authentication. The strings are reset after each successful or unsuccessful call.
When present, the value of the WWW-Authenticate HTTP header with the authentication realm can be obtained from the soap.authrealm string. This is useful for clients to respond intelligently to authentication requests.
A stand-alone gSOAP Web Service can enforce HTTP authentication upon clients, by checking the soap.userid and soap.passwd strings. These strings are set when a client request contains HTTP authentication headers. The strings SHOULD be checked in each service method (that requires authentication to execute).
Here is an example service method implementation that enforced client authentication:

int ns__method(struct soap *soap, ...)
{
   if (!soap->.userid || !soap->.passwd || strcmp(soap->.userid, "guest") || strcmp(soap->.passwd, "visit"))
      return 401;
...
}

When the authentication fails, the service response with a SOAP Fault message and a HTTP error code "401 Unauthorized". The HTTP error codes are described in Section 10.2.

19.15  HTTP NTLM Authentication

HTTP NTLM authentication is enabled at the client-side by installing libntlm from http://www.nongnu.org/libntlm and compiling all project source codes with -DWITH_NTLM.
In your application code set the soap.userid, soap.passwd, and soap.authrealm strings to a username, password, and the authentication domain respectively. A server may request NTLM authentication and denies access (HTTP 401 authentication required or HTTP 407 HTTP proxy authentication required) when the client tries to connect without HTTP authentication (or with the wrong authentication information).
Here is an example client code fragment to set the NTLM authentication username and password:

struct soap soap;
soap_init1(&soap, SOAP_IO_KEEPALIVE);
if (soap_call_ns__method(&soap, ...))
{ if (soap.error == 401)
   { soap.userid = "Zaphod";
      soap.passwd = "Beeblebrox";
      soap.authrealm = "Ursa-Minor";
      if (soap_call_ns__method(&soap, ...))
         ...

The following NTLM handshake between the client C and server S is performed:

1: C -> S POST ...
Content-Type: text/xml; charset=utf-8
2: C <- S 401 Unauthorized
WWW-Authenticate: NTLM
3: C -> S GET ...
Authorization: NTLM <base64-encoded type-1-message>
4: C <- S 401 Unauthorized
WWW-Authenticate: NTLM <base64-encoded type-2-message>
5: C -> S POST ...
Content-Type: text/xml; charset=utf-8
Authorization: NTLM <base64-encoded type-3-message>
6: C <- S 200 OK

where stages 1 and 2 indicates a client attempting to connect without authorization information, which is the first method call in the code above. Stage 3 to 6 happen with the proper client authentication set with soap.userid, soap.passwd, and soap.authrealm provided. NTLM authenticates connections, not requests. When the connection is kept alive, subsequent messages can be exchanged without re-authentication.
To avoid the overhead of the first rejected call, use:

struct soap soap;
soap_init1(&soap, SOAP_IO_KEEPALIVE);
soap.userid = "Zaphod";
soap.passwd = "Beeblebrox";
soap.authrealm = "Ursa-Minor";
soap.ntlm_challenge = "";
if (soap_call_ns__method(&soap, ...))
   ...

When the authentication fails (stage 1 and 2), the service response with a SOAP Fault message and a HTTP error code "401 Unauthorized". The HTTP error codes are described in Section 10.2.
On windows, an alternative is to use the WinInet module, which has built-in NTLM support. The WinInet for gSOAP module is available in the mod_gsoap directory of the gSOAP package. Instructions for WinInet use are included there.

19.16  HTTP Proxy NTLM Authentication

For HTTP 407 Proxy Authentication Required, set the proxy userid and passwd:

struct soap soap;
soap_init1(&soap, SOAP_IO_KEEPALIVE);
soap.proxy_host = "...";
soap.proxy_port = ...;
if (soap_call_ns__method(&soap, ...))
{ if (soap.error == 407)
   { soap.proxy_userid = "Zaphod";
      soap.proxy_passwd = "Beeblebrox";
      soap.authrealm = "Ursa-Minor";
      if (soap_call_ns__method(&soap, ...))
         ...

To avoid the overhead of the first rejected call, use:

struct soap soap;
soap_init1(&soap, SOAP_IO_KEEPALIVE);
soap.proxy_host = "...";
soap.proxy_port = ...;
soap.proxy_userid = "Zaphod";
soap.proxy_passwd = "Beeblebrox";
soap.authrealm = "Ursa-Minor";
soap.ntlm_challenge = "";
if (soap_call_ns__method(&soap, ...))
   ...

19.17  HTTP Proxy Basic Authentication

HTTP proxy authentication (basic) is enabled at the client-side by setting the soap.proxy_userid and soap.proxy_passwd strings to a username and password, respectively. For example, a proxy server may request user authentication. Otherwise, access is denied by the proxy (HTTP 407 error). Example client code fragment to set proxy server, username, and password:

struct soap soap;
soap_init(&soap);
soap.proxy_host = "xx.xx.xx.xx"; // IP or domain
soap.proxy_port = 8080;
soap.proxy_userid = "guest";
soap.proxy_passwd = "guest";
...

A client SOAP request will have the following HTTP header:

POST /XXX HTTP/1.0
Host: YYY
User-Agent: gSOAP/2.2
Content-Type: text/xml; charset=utf-8
Content-Length: nnn
Proxy-Authorization: Basic Z3Vlc3Q6Z3Vlc3Q=
...

When X-Forwarded-For headers are returned by the proxy, the header can be accessed in the soap.proxy_from string.
The CONNECT method is used for HTTP proxy authentication:

CONNECT server.example.com:80 HTTP/1.1

In some cases, it may be necessary to use the Host HTTP header with the CONNECT protocol:

CONNECT server.example.com:80 HTTP/1.1
Host: server.example.com:80

If so, compile the gSOAP code with -DWITH_CONNECT_HOST to include the Host HTTP header with the CONNECT protocol.

19.18  Messaging Speed and Performance Improvement Tips

Here are some tips you can use to speed up gSOAP. gSOAP's default settings are choosen to maximize portability and compatibility. The settings can be tweaked to optimize the performance as follows:
  • Increase the buffer size SOAP_BUFLEN by changing the SOAP_BUFLEN macro in stdsoap2.h. Use buffer size 218=262144 for example.
  • Use HTTP keep-alive at the client-side, see 19.11, when the client needs to make a series of calls to the same server. Server-side keep-alive support can greatly improve performance of both client and server. But be aware that clients and services under Unix/Linux require signal handlers to catch dropped connections.
  • Use HTTP chunked transfers, see 19.12.
  • Do NOT use gzip compression, since the overhead of compression is typically higher than the bandwidth gains.
  • Set the SOAP_XML_TREE flag to disable id-ref multi-ref object (de)serialization. This boosts performance significantly and works with SOAP document/literal style (i.e. no id-ref graph serialization as required with SOAP encoding style).
  • Compile stdsoap2.c and stdsoap2.cpp and all other source codes with -DWITH_NOIDREF to improve performance even better by permanently disabling id-ref multi-ref object (de)serialization.
  • Do NOT use DEBUG mode, since the overhead of logging is significant.

19.19  Timeout Management for Non-Blocking Operations

Socket connect, accept, send, and receive timeout values can be set to manage socket communication timeouts. The soap.connect_timeout, soap.accept_timeout, soap.send_timeout, and soap.recv_timeout attributes of the current gSOAP runtime context soap can be set to the appropriate user-defined socket send, receive, and accept timeout values. A positive value measures the timeout in seconds. A negative timeout value measures the timeout in microseconds (10−6 sec).
The soap.connect_timeout specifies the timeout for soap_call_ns__method calls.
The soap.accept_timeout specifies the timeout for soap_accept(&soap) calls.
The soap.send_timeout and soap.recv_timeout specify the timeout for non-blocking socket I/O operations.
Example:

struct soap soap;
soap_init(&soap);
soap.send_timeout = 10;
soap.recv_timeout = 10;

This will result in a timeout if no data can be send in 10 seconds and no data is received within 10 seconds after initiating a send or receive operation over the socket. A value of zero disables timeout, for example:

soap.send_timeout = 0;
soap.recv_timeout = 0;

When a timeout occurs in send/receive operations, a SOAP_EOF exception will be raised ("end of file or no input"). Negative timeout values measure timeouts in microseconds, for example:

#define uSec *-1
#define mSec *-1000
soap.accept_timeout = 10 uSec;
soap.send_timeout = 20 mSec;
soap.recv_timeout = 20 mSec;

The macros improve readability.
Caution: many Linux versions do not support non-blocking connect(). Therefore, setting soap.connect_timeout for non-blocking soap_call_ns__method calls may not work under Linux.
Caution: interrupts (EINTR) can affect the blocking time in I/O operations. The maximum number of EINTR that will not trigger an error is set by SOAP_MAXEINTR in stdsoap2.h, which is 10 by default. Each EINTR may increase the blocking time by up to one second, up to SOAP_MAXEINTR seconds total.

19.20  Socket Options and Flags

gSOAP's socket communications can be controlled with socket options and flags. The gSOAP run-time context struct soap flags are: int soap.socket_flags to control socket send() and recv() calls, int soap.connect_flags to set client connection socket options, int soap.bind_flags to set server-side port bind socket options, int soap.accept_flags to set server-side request message accept socket options. See the manual pages of send and recv for soap.socket_flags values and see the manual pages of setsockopt for soap.connect_flags, soap.bind_flags, and soap.accept_flags (SOL_SOCKET) values. These SO_ socket option flags (see setsockopt manual pages) can be bit-wise or-ed to set multiple socket options at once. The client-side flag soap.connect_flags=SO_LINGER is supported with values l_onoff=1 and l_linger=soap.linger_time. The soap.linger_time determines the wait time (the time resolution is system dependent, though according to some experts only zero and nonzero values matter). The linger option can be used to manage the number of connections that remain in TIME_WAIT state at the server side.
For example, to disable sigpipe signals on Unix/Linux platforms use: soap.socket_flags = MSG_NOSIGNAL and/or soap.connect_flags = SO_NOSIGPIPE (i.e. client-side connect) depending on your platform.
Use soap.bind_flags=SO_REUSEADDR to enable server-side port reuse and local port sharing (but be aware of the possible security implications such as port hijacking).
Note that multiple socket options can be explicitly set with setsockopt as follows:

int sock = soap_bind(soap, host, port, backlog);
if (soap_valid_socket(sock))
{
   setsockopt(sock, ..., ..., ..., ...);    setsockopt(sock, ..., ..., ..., ...);

19.21  Secure Web Services with HTTPS/SSL

 
When a Web Service is installed as CGI, it uses standard I/O that is encrypted/decrypted by the Web server that runs the CGI application. HTTPS/SSL support must be configured for the Web server (not CGI-based Web Service application itself).
To enable SSL for stand-alone gSOAP servers, first install OpenSSL and use option -DWITH_OPENSSL to compile the sources with your C or C++ compiler (or use -DWITH_GNUTLS if you prefer GNUTLS), for example:

> c++ -DWITH_OPENSSL -o myprog myprog.cpp stdsoap2.cpp soapC.cpp soapServer.cpp -lssl -lcrypto

With GNUTLS:

> c++ -DWITH_GNUTLS -o myprog myprog.cpp stdsoap2.cpp soapC.cpp soapServer.cpp -lgnutls -lgcrypt -lgpg-error

SSL support for stand-alone gSOAP Web services is enabled by calling soap_ssl_accept to perform the SSL/TLS handshake after soap_accept. In addition, a key file, a CA file (or path to certificates), DH file (if RSA is not used), and password need to be supplied. Instructions on how to do this can be found in the OpenSSL documentation http://www.openssl.org. See also Section 19.24.
Let's take a look at an example SSL secure multi-threaded stand-alone SOAP Web Service:

int main()
{
   int m, s;
   pthread_t tid;
   struct soap soap, *tsoap;
   soap_ssl_init(); /* init OpenSSL (just once) */
   if (CRYPTO_thread_setup()) // OpenSSL
   {
      fprintf(stderr, "Cannot setup thread mutex\n");
      exit(1);
   }
   soap_init(&soap);
   if (soap_ssl_server_context(&soap,
      SOAP_SSL_DEFAULT,
      "server.pem", /* keyfile: required when server must authenticate to clients (see SSL docs on how to obtain this file) */
      "password", /* password to read the key file (not used with GNUTLS) */
      "cacert.pem", /* optional cacert file to store trusted certificates */
      NULL, /* optional capath to directory with trusted certificates */
      "dh512.pem", /* DH file name or DH key len bits (minimum is 512, e.g. "512") to generate DH param, if NULL use RSA */
      NULL, /* if randfile!=NULL: use a file with random data to seed randomness */
      NULL /* optional server identification to enable SSL session cache (must be a unique name) */    ))
   {
      soap_print_fault(&soap, stderr);
      exit(1);
   }
   m = soap_bind(&soap, NULL, 18000, 100); // use port 18000
   if (m < 0)
   {
      soap_print_fault(&soap, stderr);
      exit(1);
   }
   fprintf(stderr, "Socket connection successful: master socket = %d\n", m);
   for (;;)
   {
      s = soap_accept(&soap);
      fprintf(stderr, "Socket connection successful: slave socket = %d\n", s);
      if (s < 0)
      {
         soap_print_fault(&soap, stderr);
         break;
      }
      tsoap = soap_copy(&soap); /* should call soap_ssl_accept on a copy */
      if (!tsoap)
         break;
      pthread_create(&tid, NULL, &process_request, (void*)tsoap);
   }
   soap_done(&soap); /* deallocates SSL context */
   CRYPTO_thread_cleanup(); // OpenSSL
   return 0;
}
void *process_request(void *soap)
{
   pthread_detach(pthread_self());
   if (soap_ssl_accept((struct soap*)soap))
      soap_print_fault(tsoap, stderr);
   else
      soap_serve((struct soap*)soap);
   soap_destroy((struct soap*)soap);
   soap_end((struct soap*)soap);
   soap_free((struct soap*)soap); // done and free context
   return NULL;
}

The soap_ssl_server_context function initializes the server-side SSL context. The server.pem key file is the server's private key concatenated with its certificate. The cacert.pem is used to authenticate clients and contains the client certificates. Alternatively a directory name can be specified. This directory is assumed to contain the certificates. The dh512.pem file specifies that DH will be used for key agreement instead of RSA. A numeric value greater than 512 can be provided instead as a string constant (e.g. "512") to allow the engine to generate the DH parameters on the fly (this can take a while) rather than retrieving them from a file. The randfile entry can be used to seed the PRNG. The last entry enable server-side session caching. A unique server name is required.
The GNUTLS mutex lock setup is automatically peformed in the gSOAP engine, but only when POSIX threads are detected and available.
OpenSSL requires mutex locks to be explicitly setup in your code for multithreaded applications, for which we need to call CRYPTO_thread_setup() and CRYPTO_thread_cleanup(). These routines can be found in openssl/crypto/threads/th-lock.c and are also used in the SSL example codes samples/ssl. These routines are required to setup locks for multi-threaded applications that use SSL.
We give a Windows and POSIX threads implementation of these here:

#include < unistd.h > /* defines _POSIX_THREADS if pthreads are available */
#ifdef _POSIX_THREADS
# include < pthread.h >
#endif
#if defined(WIN32)
# define MUTEX_TYPE HANDLE
# define MUTEX_SETUP(x) (x) = CreateMutex(NULL, FALSE, NULL)
# define MUTEX_CLEANUP(x) CloseHandle(x)
# define MUTEX_LOCK(x) WaitForSingleObject((x), INFINITE)
# define MUTEX_UNLOCK(x) ReleaseMutex(x)
# define THREAD_ID GetCurrentThreadID()
#elif defined(_POSIX_THREADS)
# define MUTEX_TYPE pthread_mutex_t
# define MUTEX_SETUP(x) pthread_mutex_init(&(x), NULL)
# define MUTEX_CLEANUP(x) pthread_mutex_destroy(&(x))
# define MUTEX_LOCK(x) pthread_mutex_lock(&(x))
# define MUTEX_UNLOCK(x) pthread_mutex_unlock(&(x))
# define THREAD_ID pthread_self()
#else
# error "You must define mutex operations appropriate for your platform"
# error "See OpenSSL /threads/th-lock.c on how to implement mutex on your platform"
#endif
struct CRYPTO_dynlock_value { MUTEX_TYPE mutex; };
static MUTEX_TYPE *mutex_buf;
static struct CRYPTO_dynlock_value *dyn_create_function(const char *file, int line)
{
   struct CRYPTO_dynlock_value *value;
   value = (struct CRYPTO_dynlock_value*)malloc(sizeof(struct CRYPTO_dynlock_value));
   if (value)
      MUTEX_SETUP(value->mutex);
   return value;
}
static void dyn_lock_function(int mode, struct CRYPTO_dynlock_value *l, const char *file, int line)
{
   if (mode & CRYPTO_LOCK)
      MUTEX_LOCK(l->mutex);
   else
      MUTEX_UNLOCK(l->mutex);
}
static void dyn_destroy_function(struct CRYPTO_dynlock_value *l, const char *file, int line)
{
   MUTEX_CLEANUP(l->mutex);
   free(l);
}
void locking_function(int mode, int n, const char *file, int line)
{
   if (mode & CRYPTO_LOCK)
      MUTEX_LOCK(mutex_buf[n]);
   else
      MUTEX_UNLOCK(mutex_buf[n]);
}
unsigned long id_function()
{
   return (unsigned long)THREAD_ID;
}
int CRYPTO_thread_setup()
{
   int i;
   mutex_buf = (MUTEX_TYPE*)malloc(CRYPTO_num_locks() * sizeof(MUTEX_TYPE));
   if (!mutex_buf)
      return SOAP_EOM;
   for (i = 0; i < CRYPTO_num_locks(); i++)
      MUTEX_SETUP(mutex_buf[i]);
   CRYPTO_set_id_callback(id_function);
   CRYPTO_set_locking_callback(locking_function);
   CRYPTO_set_dynlock_create_callback(dyn_create_function);
   CRYPTO_set_dynlock_lock_callback(dyn_lock_function);
   CRYPTO_set_dynlock_destroy_callback(dyn_destroy_function);
   return SOAP_OK;
}
void CRYPTO_thread_cleanup()
{
   int i;
   if (!mutex_buf)
      return;
   CRYPTO_set_id_callback(NULL);
   CRYPTO_set_locking_callback(NULL);
   CRYPTO_set_dynlock_create_callback(NULL);
   CRYPTO_set_dynlock_lock_callback(NULL);
   CRYPTO_set_dynlock_destroy_callback(NULL);
   for (i = 0; i < CRYPTO_num_locks(); i++)
      MUTEX_CLEANUP(mutex_buf[i]);
   free(mutex_buf);
   mutex_buf = NULL;
}

For Unix and Linux, make sure you have signal handlers set in your service and/or client applications to catch broken connections (SIGPIPE):

signal(SIGPIPE, sigpipe_handle);

where, for example:

void sigpipe_handle(int x) { }

By default, clients are not required to authenticate. To support client authentication use the following:

   if (soap_ssl_server_context(&soap,
      SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION,
      "server.pem",
      "password",
      "cacert.pem",
      NULL,
      "dh512.pem",
      NULL,
      NULL
   ))
   {
      soap_print_fault(&soap, stderr);
      exit(1);
   }

This requires each client to authenticate with its certificate.
Since release version 2.8.20 SSL v3 is disabled. To enable SSL v3 together with TLS v1.0, v1.1, and v1.2 use SOAP_SSLv3_TLSv1 in soap_ssl_server_context. To use TLS v1.1 only use SOAP_TLSv1_1. To use TLS v1.2 only use SOAP_TLSv1_2. To use SSL v3 only use SOAP_SSLv3.
The cacert file and capath are optional. Either one can be specified when clients must run on non-trusted systems (capath is not used with GNUTLS). We want to avoid storing trusted certificates in the default location on the file system when that is not secure. Therefore, a flat cacert.pem file or directory can be specified to store trusted certificates.
The gSOAP distribution includes a cacerts.pem file with the certificates of all certificate authorities such as Verisign. You can use this file to verify the authentication of servers that provide certificates issued by these CAs.
The cacert.pem, client.pem, and server.pem files in the gSOAP distribution are examples of self-signed certificates. The client.pem and server.pem contain the client/server private key concatenated with the certificate. The keyfiles (client.pem and server.pem) are created by concatenating the private key PEM with the certificate PEM. The keyfile SHOULD NEVER be shared with any party. With OpenSSL, you can encrypt the keyfiles with a password to offer some protection and the password is used in the client/server code to read the keyfile. GNUTLS does not support this feature and cannot encrypt or decrypt a keyfile.
Caution: it is important that the WITH_OPENSSL macro MUST be consistently defined to compile the sources, such as stdsoap2.cpp, soapC.cpp, soapClient.cpp, soapServer.cpp, and all application sources that include stdsoap2.h or soapH.h. If the macros are not consistently used, the application will crash due to a mismatches in the declaration and access of the gSOAP context.

19.22  Secure Clients with HTTPS/SSL

To utilize HTTPS/SSL, you need to install the OpenSSL library on your platform or GNUTLS for a light-weight SSL/TLS library. After installation, compile all the sources of your application with option -DWITH_OPENSSL (or -DWITH_GNUTLS when using GNUTLS). For example on Linux:

> c++ -DWITH_OPENSSL myclient.cpp stdsoap.cpp soapC.cpp soapClient.cpp -lssl -lcrypto

or Unix:

> c++ -DWITH_OPENSSL myclient.cpp stdsoap.cpp soapC.cpp soapClient.cpp -lxnet -lsocket -lnsl -lssl -lcrypto

or you can add the following line to soapdefs.h:

#define WITH_OPENSSL

and compile with option -DWITH_SOAPDEFS_H to include soapdefs.h in your project. Alternatively, compile with GNUTLS:

> c++ -DWITH_GNUTLS myclient.cpp stdsoap.cpp soapC.cpp soapClient.cpp -lgnutls -lgcrypt -lgpg-error

A client program simply uses the prefix https: instead of http: in the endpoint URL of a service operation call to a Web Service to use encrypted transfers (if the service supports HTTPS). You need to specify the client-side key file and password of the keyfile:

soap_ssl_init(); /* init OpenSSL (just once) */
if (soap_ssl_client_context(&soap,
   SOAP_SSL_DEFAULT,
   "client.pem", /* keyfile: required only when client must authenticate to server (see SSL docs on how to obtain this file) */
   "password", /* password to read the key file (not used with GNUTLS) */
   "cacerts.pem", /* cacert file to store trusted certificates (needed to verify server) */    NULL, /* capath to directory with trusted certificates */
   NULL /* if randfile!=NULL: use a file with random data to seed randomness */
))
{
   soap_print_fault(&soap, stderr);
   exit(1);
}
soap_call_ns__mymethod(&soap, "https://domain/path/secure.cgi", "", ...);

By default, server authentication is enabled and the cacerts.pem or capath (not used with GNUTLS) must be set so that the CA certificates of the server(s) are accessible at run time. The cacerts.pem file included in the package contains the certificates of common CAs. This file must be supplied with the client, if server authentication is required. Althernatively, you can use the plugin/cacerts.h and plugin/cacerts.c code to embed CA certificates in your client code.
Other client-side SSL options are SOAP_SSL_SKIP_HOST_CHECK to skip the host name verification check and SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE to allow connecting to a host with an expired certificate. For example,


soap_ssl_init(); /* init OpenSSL (just once) */
if (soap_ssl_client_context(&soap,
   SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION
    - SOAP_SSL_SKIP_HOST_CHECK,
    - SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE,
   "client.pem", /* keyfile: required only when client must authenticate to server (see SSL docs on how to obtain this file) */
   "password", /* password to read the key file (not used with GNUTLS) */
   "cacerts.pem", /* cacert file to store trusted certificates (needed to verify server) */    NULL, /* capath to directory with trusted certificates */
   NULL /* if randfile!=NULL: use a file with random data to seed randomness */
))
{
   soap_print_fault(&soap, stderr);
   exit(1);
}
soap_call_ns__mymethod(&soap, "https://domain/path/secure.cgi", "", ...);

For systems based on Microsoft windows, the WinInet module can be used instead, see mod_gsoap/gsoap_win/wininet.
Since release version 2.8.20 SSL v3 is disabled. To enable SSL v3 together with TLS v1.0, v1.1, and v1.2 use SOAP_SSLv3_TLSv1 in soap_ssl_server_context. To use TLS v1.1 only use SOAP_TLSv1_1. To use TLS v1.2 only use SOAP_TLSv1_2. To use SSL v3 only use SOAP_SSLv3.
To disable server authentication for testing purposes, use the following:

if (soap_ssl_client_context(&soap,
   SOAP_SSL_NO_AUTHENTICATION,
   NULL,
   NULL,
   NULL,
   NULL,
   NULL
))
{
   soap_print_fault(&soap, stderr);
   exit(1);
}

This also assumes that the server does not require clients to authenticate (the keyfile is absent).
Make sure you have signal handlers set in your application to catch broken connections (SIGPIPE):

signal(SIGPIPE, sigpipe_handle);

where, for example:

void sigpipe_handle(int x) { }

Caution: it is important that the WITH_OPENSSL macro MUST be consistently defined to compile the sources, such as stdsoap2.cpp, soapC.cpp, soapClient.cpp, soapServer.cpp, and all application sources that include stdsoap2.h or soapH.h. If the macros are not consistently used, the application will crash due to a mismatches in the declaration and access of the gSOAP context. Caution: concurrent client calls MUST be made using separate soap structs copied with soap_copy from an originating struct initialized with soap_ssl_client_context. In addition, the thread initialization code discussed in Section 19.21 MUST be used to properly setup OpenSSL in a multi-threaded client application.

19.23  SSL Authentication Callbacks

The fsslauth callback function controls OpenSSL/GNUTLS authentication initialization:

Callback (function pointer)
int (*soap.fsslauth)(struct soap *soap)
Initialize the authentication information for clients and services, such as the certificate chain, password, read the key and/or DH file, generate an RSA key, and initialization of the RNG. Should return a gSOAP error code or SOAP_OK. Built-in gSOAP function: ssl_auth_init

The fsslverify callback function controls OpenSSL peer certificate verification, via internally invoking SSL_CTX_set_verify:

Callback (function pointer)
int (*soap.fssverify)(int ok, X509_STORE_CTX *store
Used to control the certificate verification behaviour when the SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION or SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION flags are specified with soap_ssl_client_context and soap_ssl_server_context. It receives two arguments: ok indicates, whether the verification of the certificate in question was passed (ok=1) or not (]blkok=0). If the callback returns 0, the verification process is immediately stopped with "verification failed" state. A verification failure alert is sent to the peer and the TLS/SSL handshake is terminated. If the callback returns 1, the verification process is continued. Built-in gSOAP function: ssl_verify_callback and ssl_verify_callback_allow_expired_certificate. These functions are used when fsslverify is initially set to NULL and were not reassigned before soap_ssl_client_context or soap_ssl_server_context are called.

19.24  SSL Certificates and Key Files

The gSOAP distribution includes a cacerts.pem file with the certificates of all certificate authorities (such as Verisign). You can use this file to verify the authentication of servers that provide certificates issued by these CAs. Just set the cafile parameter to the location of this file on your file system. Therefore, when you obtain a certifice signed by a trusted CA such as Verisign, you can simply use the cacerts.pem file to develop client applications that can verify the authenticity of your server.
Althernatively, you can use the plugin/cacerts.h and plugin/cacerts.c code to embed CA certificates in your client code.
For systems based on Microsoft windows, the WinInet module can be used instead, see the README.txt located in the package under mod_gsoap/gsoap_win/wininet.
The other .pem files in the gSOAP distribution are examples of self-signed certificates for testing purposes (cacert.pem, client.pem, server.pem). The client.pem and server.pem contain the private key and certificate of the client or server, respectively. The keyfiles (client.pem and server.pem) are created by concatenating the private key PEM with the certificate PEM. The keyfile SHOULD NEVER be shared with any party. With OpenSSL, you can encrypt the keyfiles with a password to offer some protection and the password is used in the client/server code to read the keyfile. GNUTLS does not support this feature and cannot encrypt or decrypt a keyfile.
You can also create your own self-signed certificates. There is more than one way to generate the necessary files for clients and servers. See http://www.openssl.org for information on OpenSSL and http://sial.org/howto/openssl/ca/ on how to setup and manage a local CA and http://sial.org/howto/openssl/self-signed/ on how to setup self-signed test certificates.
It is possible to convert IIS-generated certificates to PEM format with the openssl library and openssl command-line tool:

openssl x509 -in mycert.cer -inform DER -out mycert.pem -outform PEM

This converts the CRT-formatted mycert.cer to PEM-formatted mycert.pem.
Here is the simplest way to setup self-signed certificates. First you need to create a private Certificate Authority (CA). The CA is used in SSL to verify the authenticity of a given certificate. The CA acts as a trusted third party who has authenticated the user of the signed certificate as being who they say. The certificate is signed by the CA, and if the client trusts the CA, it will trust your certificate. For use within your organization, a private CA will probably serve your needs. However, if you intend use your certificates for a public service, you should probably obtain a certificate from a known CA (e.g. VeriSign). In addition to identification, your certificate is also used for encryption.
Creating certificates should be done through a CA to obtain signed certificates. But you can create your own certificates for testing purposes as follows.
  • Go to the OpenSSL bin directory (/usr/local/ssl by default and /System/Library/OpenSSL on Mac OS X)
  • There should be a file called openssl.cnf
  • Create a new directory in your home account, e.g. $HOME/CA, and copy the openssl.cnf file to this directory
  • Modify openssl.cnf by changing the 'dir' value to HOME/CA
  • Copy the README.txt, root.sh, and cert.sh scripts from the gSOAP distribution package located in the samples/ssl directory to HOME/CA
  • Follow the README.txt instructions
You now have a self-signed CA root certificate cacert.pem and a server.pem (or client.pem) certificate in PEM format. The cacert.pem certificate is used in the cafile parameter of the soap_ssl_client_context (or soap_ssl_server_context) at the client (or server) side to verify the authenticity of the peer. You can also provide a capath parameter to these trusted certificates. The server.pem (or client.pem) must be provided with the soap_ssl_server_context at the server side (or soap_ssl_client_context at the client side) together with the password you entered when generating the certificate using cert.sh to access the file. These certificates must be present to grant authentication requests by peers. In addition, the server.pem (and client.pem) include the host name of the machine on which the application runs (e.g. localhost), so you need to generate new certificates when migrating a server (or client).
Finally, you need to generate Diffie-Helmann (DH) parameters for the server if you wish to use DH instead of RSA. There are two options:
  1. Set the dhfile parameter to the numeric DH prime length in bits required (for example "1024") to let the engine generate DH parameters at initialization. This can be time consuming.
  2. Provide a file name for the dhfile parameter of soap_ssl_server_context. The file should be generated beforehand. To do so with the OpenSSL command line tool, use:

    > openssl dhparam -outform PEM -out dh.pem 512

    File dh512.pem is the output file and 512 is the number of bits used.

19.25  SSL Hardware Acceleration

You can specify a hardware engine to enable hardware support for cryptographic acceleration. This can be done once in a server or client with the following statements:

static const char *engine = "cswift"; /* engine name */
int main()
{
   ...
   ENGINE *e;
   if (!(e = ENGINE_by_id(engine)))
      fprintf(stderr, "Error finding engine %s\n", engine);
   else if (!ENGINE_set_default(e, ENGINE_METHOD_ALL))
      fprintf(stderr, "Error using engine %s\n", engine);
   ...

The following table lists the names of the hardware and software engines:

Name Description
openssl The default software engine for cryptographic operations
openbsd_dev_crypto OpenBSD supports kernel level cryptography
cswift CryptoSwift acceleration hardware
chil nCipher CHIL acceleration hardware
atalla Compaq Atalla acceleration hardware
nuron Nuron acceleration hardware
ubsec Broadcom uBSec acceleration hardware
aep Aep acceleration hardware
sureware SureWare acceleration hardware

19.26  SSL on Windows

Set the full path to libssl.lib and libcrypto.lib under the MSVC++ "Projects" menu, then choose "Link": "Object/Modules". Please make sure libssl32.dll and libeay32.dll can be loaded by gSOAP applications, thus they must be installed properly on the target machine.
If you're using compilation settings such as /MTd then link to the correct libeay32MTd.lib and ssleay32MTd.lib libraries.
Alternatively, you can use the WinInet interface available in the mod_gsoap directory of the gSOAP package. API instructions are included in the source.

19.27  Zlib Compression

To enable deflate and gzip compression with Zlib, install Zlib from http://www.zlib.org if not already installed on your system. Compile stdsoap2.cpp (or stdsoap2.c) and all your sources that include stdsoap2.h or soapH.h with compiler option -DWITH_GZIP and link your code with the Zlib library, e.g. -lz on Unix/Linux platforms.
The gzip compression is orthogonal to all transport encodings such as HTTP, SSL, DIME, and can be used with other transport layers. You can even save and load compressed XML data to/from files.
gSOAP supports two compression formats: deflate and gzip. The gzip format is used by default. The gzip format has several benefits over deflate. Firstly, gSOAP can automatically detect gzip compressed inbound messages, even without HTTP headers, by checking for the presence of a gzip header in the message content. Secondly, gzip includes a CRC32 checksum to ensure messages have been correctly received. Thirdly, gzip compressed content can be decompressed with other compression software, so you can decompress XML data saved by gSOAP in gzip format.
Gzip compression is enabled by compiling the sources with -DWITH_GZIP. To transmit gzip compressed SOAP/XML data, set the output mode flags to SOAP_ENC_ZLIB. For example:

soap_init(&soap);
...
soap_set_omode(&soap, SOAP_ENC_ZLIB); // enable Zlib's gzip
if (soap_call_ns__myMethod(&soap, ...))
...
soap_clr_omode(&soap, SOAP_ENC_ZLIB); // disable Zlib's gzip
...

This will send a compressed SOAP/XML request to a service, provided that Zlib is installed and linked with the application and the -DWITH_GZIP option was used to compile the sources. Receiving compressed SOAP/XML over HTTP either in gzip or deflate formats is automatic. The SOAP_ENC_ZLIB flag does not have to be set at the server side to accept compressed messages. Reading and receiving gzip compressed SOAP/XML without HTTP headers (e.g. with other transport protocols) is also automatic.
To control the level of compression for outbound messages, you can set the soap.z_level to a value between 1 and 9, where 1 is the best speed and 9 is the best compression (default is 6). For example

soap_init(&soap);
...
soap_set_omode(&soap, SOAP_ENC_ZLIB);
soap.z_level = 9; // best compression
...

To verify and monitor compression rates, you can use the values soap.z_ratio_in and soap.z_ratio_out. These two float values lie between 0.0 and 1.0 and express the ratio of the compressed message length over uncompressed message length.

soap_call_ns__myMethod(&soap, ...);
...
printf("Compression ratio: %f%% (in) %f%% (out)\n", 100*soap.z_ratio_out, 100*soap.z_ratio_in);
...

Note: lower ratios mean higher compression rates.
Compressed transfers require buffering the entire output message to determine HTTP message length. This means that the SOAP_IO_STORE flag is automatically set when the SOAP_ENC_ZLIB flag is set to send compressed messages. The use of HTTP chunking significantly reduces memory usage and may speed up the transmission of compressed SOAP/XML messages. This is accomplished by setting the SOAP_IO_CHUNK flag with SOAP_ENC_ZLIB for the output mode. However, some Web servers do not accept HTTP chunked request messages (even when they return HTTP chunked messages!). Stand-alone gSOAP services always accept chunked request messages.
To restrict the compression to the deflate format only, compile the sources with -DWITH_ZLIB. This limits compression and decompression to the deflate format. Only plain and deflated messages can be exchanged, gzip is not supported with this option. Receiving gzip compressed content is automatic, even in the absence of HTTP headers. Receiving deflate compressed content is not automatic in the absence of HTTP headers and requires the flag SOAP_ENC_ZLIB to be set for the input mode to decompress deflated data.
Caution: it is important that the WITH_GZIP and WITH_ZLIB macros MUST be consistently defined to compile the sources, such as stdsoap2.cpp, soapC.cpp, soapClient.cpp, soapServer.cpp, and all application sources that include stdsoap2.h or soapH.h. If the macros are not consistently used, the application will crash due to a mismatches in the declaration and access of the gSOAP context.

19.28  Client-Side Cookie Support

Client-side cookie support is optional. To enable cookie support, compile all sources with option -DWITH_COOKIES, for example:

> c++ -DWITH_COOKIES -o myclient stdsoap2.cpp soapC.cpp soapClient.cpp

or add the following line to stdsoap.h:

#define WITH_COOKIES

Client-side cookie support is fully automatic. So just (re)compile stdsoap2.cpp with -DWITH_COOKIES to enable cookie-based session control in your client.
A database of cookies is kept and returned to the appropriate servers. Cookies are not automatically saved to a file by a client. An example cookie file manager is included as an extras in the distribution. You should explicitly remove all cookies before terminating a gSOAP context by calling soap_free_cookies(soap) or by calling soap_done(soap).
To avoid "cookie storms" caused by malicious servers that return an unreasonable amount of cookies, gSOAP clients/servers are restricted to a database size that the user can limit (32 cookies by default), for example:

struct soap soap;
soap_init(&soap);
soap.cookie_max = 10;

The cookie database is a linked list pointed to by soap.cookies where each node is declared as:

struct soap_cookie
{
   char *name;
   char *value;
   char *domain;
   char *path;
   long expire; /* client-side: local time to expire; server-side: seconds to expire */
   unsigned int version;
   short secure;
   short session; /* server-side */
   short env; /* server-side: 1 = got cookie from client */
   short modified; /* server-side: 1 = client cookie was modified */
   struct soap_cookie *next;
};

Since the cookie database is linked to a soap struct, each thread has a local cookie database in a multi-threaded implementation.

19.29  Server-Side Cookie Support

Server-side cookie support is optional. To enable cookie support, compile all sources with option -DWITH_COOKIES, for example:

> c++ -DWITH_COOKIES -o myserver ...

gSOAP provides the following cookie API for server-side cookie session control:

Function
struct soap_cookie *soap_set_cookie(struct soap *soap, const char *name, const char *value, const char *domain, const char *path);
Add a cookie to the database with name name and value value. domain and path may be NULL to use the current domain and path given by soap_cookie_domain and soap_cookie_path. If successful, returns pointer to a cookie node in the linked list, or NULL otherwise.
struct soap_cookie *soap_cookie(struct soap *soap, const char *name, const char *domain, const char *path);
Find a cookie in the database with name name and value value. domain and path may be NULL to use the current domain and path given by soap_cookie_domain and soap_cookie_path. If successful, returns pointer to a cookie node in the linked list, or NULL otherwise.
char *soap_cookie_value(struct soap *soap, const char *name, const char *domain, const char *path);
Get value of a cookie in the database with name name. domain and path may be NULL to use the current domain and path given by soap_cookie_domain and soap_cookie_path. If successful, returns the string pointer to the value, or NULL otherwise.
long soap_cookie_expire(struct soap *soap, const char *name, const char *domain, const char *path);
Get expiration value of the cookie in the database with name name (in seconds). domain and path may be NULL to use the current domain and path given by soap_cookie_domain and soap_cookie_path. Returns the expiration value, or -1 if cookie does not exist.
int soap_set_cookie_expire(struct soap *soap, const char *name, long expire, const char *domain, const char *path);
Set expiration value expire of the cookie in the database with name name (in seconds). domain and path may be NULL to use the current domain and path given by soap_cookie_domain and soap_cookie_path. If successful, returns SOAP_OK, or SOAP_EOF otherwise.
int soap_set_cookie_session(struct soap *soap, const char *name, const char *domain, const char *path);
Set cookie in the database with name name to be a session cookie. This means that the cookie will be returned to the client. (Only cookies that are modified are returned to the client). domain and path may be NULL to use the current domain and path given by soap_cookie_domain and soap_cookie_path. If successful, returns SOAP_OK, or SOAP_EOF otherwise.
int soap_clr_cookie_session(struct soap *soap, const char *name, const char *domain, const char *path);
Clear cookie in the database with name name to be a session cookie. domain and path may be NULL to use the current domain and path given by soap_cookie_domain and soap_cookie_path. If successful, returns SOAP_OK, or SOAP_EOF otherwise.
void soap_clr_cookie(struct soap *soap, const char *name, const char *domain, const char *path);
Remove cookie from the database with name name. domain and path may be NULL to use the current domain and path given by soap_cookie_domain and soap_cookie_path.
int soap_getenv_cookies(struct soap *soap);
Initializes cookie database by reading the 'HTTP_COOKIE' environment variable. This provides a means for a CGI application to read cookies send by a client. If successful, returns SOAP_OK, or SOAP_EOF otherwise.
void soap_free_cookies(struct soap *soap);
Release cookie database.

The following global variables are used to define the current domain and path:

Attribute value
const char *cookie_domain MUST be set to the domain (host) of the service
const char *cookie_path MAY be set to the default path to the service
int cookie_max maximum cookie database size (default=32)

The cookie_path value is used to filter cookies intended for this service according to the path prefix rules outlined in RFC2109.
The following example server adopts cookies for session control:

int main()
{
   struct soap soap;
   int m, s;
   soap_init(&soap);
   soap.cookie_domain = "...";
   soap.cookie_path = "/"; // the path which is used to filter/set cookies with this destination
   if (argc < 2)
   {
      soap_getenv_cookies(&soap); // CGI app: grab cookies from 'HTTP_COOKIE' env var
      soap_serve(&soap);
   }
   else
   {
      m = soap_bind(&soap, NULL, atoi(argv[1]), 100);
      if (m < 0)
         exit(1);
      for (int i = 1; ; i++)
      {
         s = soap_accept(&soap);
         if (s < 0)
            exit(1);
         soap_serve(&soap);
         soap_end(&soap); // clean up
         soap_free_cookies(&soap); // remove all old cookies from database so no interference occurs with the arrival of new cookies
      }
   }
   return 0;
}
int ck__demo(struct soap *soap, ...)
{
   int n;
   const char *s;
   s = soap_cookie_value(soap, "demo", NULL, NULL); // cookie returned by client?
   if (!s)
      s = "init-value"; // no: set initial cookie value
   else 
      ... // modify 's' to reflect session control
   soap_set_cookie(soap, "demo", s, NULL, NULL);
   soap_set_cookie_expire(soap, "demo", 5, NULL, NULL); // cookie may expire at client-side in 5 seconds
   return SOAP_OK;
}

19.30  Connecting Clients Through Proxy Servers

When a client needs to connect to a Web Service through a proxy server, set the soap.proxy_host string and soap.proxy_port integer attributes of the current soap runtime context to the proxy's host name and port, respectively. For example:

struct soap soap;
soap_init(&soap);
soap.proxy_host = "proxyhostname";
soap.proxy_port = 8080;
if (soap_call_ns__method(&soap, "http://host:port/path", "action", ...))
   soap_print_fault(&soap, stderr);
else
   ...

The attributes soap.proxy_host and soap.proxy_port keep their values through a sequence of service operation calls, so they only need to be set once.
When X-Forwarded-For headers are returned by the proxy, the header can be accessed in the soap.proxy_from string.

19.31  FastCGI Support

To enable FastCGI support, install FastCGI and compile all sources (do not use libgsoap but compile stdsoap2.c) and your application sources with option -DWITH_FASTCGI or add

#define WITH_FASTCGI

to stdsoap2.h and recompile the project code.
Caution: Do not link against the libgsoap libraries as these are not suitable for FastCGI. Compile stdsoap2.c (or stdsoap2.cpp) instead.

19.32  How to Create gSOAP Applications With a Small Memory Footprint

To compile gSOAP applications intended for small memory devices, you may want to remove all non-essential features that consume precious code and data space. To do this, compile the gSOAP sources with -DWITH_LEAN (i.e. #define WITH_LEAN) to remove many non-essential features. The features that will be disabled are:
  • No I/O timeouts. Note that many socket operations already obey some form of timeout handling, such as a connect timeout for example.
  • No UDP support
  • No HTTP keep alive
  • No HTTP cookies
  • No HTTP authentication
  • No HTTP chunked output (but input is OK)
  • No HTTP compressed output (but input is OK when compiled with WITH_GZIP)
  • No send/recv timeouts
  • No socket flags (no soap.socket_flag, soap.connect_flag, soap.bind_flag, soap.accept_flag)
  • No canonical XML output
  • No logging
  • Limited TCP/IP and HTTP error diagnostic messages
  • No support for time_t serialization
  • No support for hexBinary XML attribute serialization (remap hexBinary to strings by adding a remap entry to typemap.dat)
Use -DWITH_LEANER to make the executable even smaller by removing DIME and MIME attachment handling, LONG64 (64 bit) serialization, wchar_t* serialization, and support for XML DOM operations. Note that DIME/MIME attachments are not essential to achieve SOAP/XML interoperability. DIME attachments are a convenient way to exchange non-text-based (i.e. binary) content, but are not required for basic SOAP/XML interoperability. Attachment requirements are predictable. That is, applications won't suddenly decide to use DIME or MIME instead of XML to exchange content.
It is safe to try to compile your application with -DWITH_LEAN, provided that your application does not rely on I/O timeouts. When no linkage error occurs in the compilation process, it is safe to assume that your application will run just fine.

19.33  How to Eliminate BSD Socket Library Linkage

The stdsoap2.c and stdsoap2.cpp gSOAP runtime libraries should be linked with a BSD socket library in the project build, e.g. winsock2 for Win32. To eliminate the need to link a socket library, you can compile stdsoap2.c (for C) and stdsoap2.cpp (for C++) with the -DWITH_NOIO macro set (i.e. #define WITH_NOIO). This eliminates the dependency on the BSD socket API, IO streams, FILE type, and errno.
As a consequence, you MUST define callbacks to replace the missing socket stack. To do so, add to your code the following definitions:

struct soap soap;
soap_init(&soap);
/* fsend is used to transmit data in blocks */
soap.fsend = my_send;
/* frecv is used to receive data in blocks */
soap.frecv = my_recv;
/* fopen is used to connect */
soap.fopen = my_tcp_connect;
/* fclose is used to disconnect */
soap.fclose = my_tcp_disconnect;
/* fclosesocket is used only to close the master socket in a server upon soap_done() */
soap.fclosesocket = my_tcp_closesocket;
/* fshutdownsocket is used after completing a send operation to send TCP FIN */
soap.fshutdownsocket = my_tcp_shutdownsocket;
/* setting fpoll is optional, leave it NULL to omit polling the server */
soap.fpoll = my_poll;
/* faccept is used only by a server application */
soap.faccept = my_accept;

These functions are supposed to provide a (minimal) transport stack. See Section 19.7 for more details on the use of these callbacks. All callback function pointers should be non-NULL, except fpoll.
You cannot use soap_print_fault and soap_print_fault_location to print error diagnostics. Instead, the value of soap.error, which contains the gSOAP error code, can be used to determine the cause of a fault.

19.34  How to Combine Multiple Client and Server Implementations into one Executable

The wsdl2h tool can be used to import multiple WSDLs and schemas at once. The service definitions are combined in one header file to be parsed by soapcpp2. It is important to assign namespace prefixes to namespace URIs using the typemap.dat file. Otherwise, wsdl2h will assign namespace prefixes ns1, ns2, and so on to the service operations and schema types. Thus, any change to a WSDL or schema may result in a new prefix assignment. For more details, please see Section 8.2.
Another approach to combine multiple client and service applications into one executable is by using C++ namespaces to structurally separate the definitions or by creating C libraries for the client/server objects as explained in subsequent sections. This is automated with wsdl2h option -q.
Both approaches are demonstrated by example in the gSOAP distribution, the samples/link (C only) and samples/link++ (C++ with C++ namespaces) examples.

19.35  How to Build a Client or Server in a C++ Code Namespace

You can use a C++ code namespace of your choice in your header file to build a client or server in that code namespace. In this way, you can create multiple clients and servers that can be combined and linked together without conflicts, which is explained in more detail in the next section (which also shows an example combining two client libraries defined in two C++ code namespaces).
Use wsdl2h option -qname to generate definitions in the C++ name namespace. This option can also be used in combination with C++ proxy and server object generation, using soapcpp2 options -i (or -j) and -p.
At most one namespace can be defined for the entire gSOAP header file. The code namespace MUST completely encapsulate the entire contents of the header file:

namespace myNamespaceName {
... gSOAP header file contents ...
}

When compiling this header file with the gSOAP soapcpp2 compiler, all type definitions, the (de)serializers for these types, and the stub/skeleton codes will be placed in this namespace. The XML namespace mapping table (saved in a .nsmap file) will not be placed in the code namespace to allow it to be linked as a global object. You can use option -n to create local XML namespace tables, see Section 9.1 (but remember that you explicitly need to initialize the soap.namespaces to point to a table at run time). The generated files are prefixed with the code namespace name instead of the usual soap file name prefix to enable multiple client/server codes to be build in the same project directory (a code namespace automatically sets the -p compiler option, see Section 9.1 for options).
Because the SOAP Header and Fault serialization codes will also be placed in the namespace, they cannot be called from the stdsoap2.cpp run time library code and are therefore rendered unusable. Therefore, these serializers are not compiled at all (enforced with #define WITH_NOGLOBAL). To add SOAP Header and Fault serializers, you MUST compile them separately as follows. First, create a new header file env.h with the SOAP Header and Fault definitions. You can leave this header file empty if you want to use the default SOAP Header and Fault. Then compile this header file with:

> soapcpp2 -penv env.h

The generated envC.cpp file holds the SOAP Header and Fault serializers and you can link this file with your client or server application.

19.36  How to Create Client/Server Libraries

The gSOAP soapcpp2 compiler produces soapClientLib.cpp and soapServerLib.cpp codes that are specifically intended for building static or dynamic client/server libraries. These codes export the stubs and skeletons, but keep all marshaling code (i.e. parameter serializers and deserializers) local (i.e.  as static functions) to avoid link symbol conflicts when combining multiple clients and/or servers into one executable. Note that it is far simpler to use the wsdl2h tool on multiple WSDL files to generate a header file that combines all service definitions. However, the approach presented in this section is useful when creating (dynamic) libraries for client and server objects, such as DLLs as described in Section 19.37.
Do not link soapClientLib.cpp or soapServerLib.cpp together with soapC.cpp, soapClient.cpp, and soapServer.cpp. The library versions already include all of the necessary definitions.
To build multiple libraries in the same project directory, you can define a C++ code namespace in your header file (see Section 19.35) or you can use soapcpp2 with option -p to rename the generated soapClientLib.cpp and soapServerLib.cpp (and associated) files. The -p option specifies the file name prefix to replace the soap prefix. The libraries don't have to be C++ codes. You can use option -c to generate C code. A clean separation of libraries can also be achieved with C++ code namespaces, see Section 19.35.
The library codes do not define SOAP Header and Fault serializers. You MUST add SOAP Header and Fault serializers to your application, which are compiled separately as follows. First, create a new header file env.h with the SOAP Header and Fault definitions. You can leave this header file empty if you want to use the default SOAP Header and Fault. Then compile this header file with:

> soapcpp2 -penv env.h

The generated envC.cpp file holds the SOAP Header and Fault serializers and you can create a (dynamic) library for it to link this code with your client or server application.
You MUST compile the stdsoap2.cpp library using -DWITH_NONAMESPACES:

> c++ -DWITH_NONAMESPACES -c stdsoap2.cpp

This omits the reference to the global namespaces table, which is nowhere to be defined since we will use XML namespaces for each client/service separately. Therefore, you MUST explicitly set the namespaces value of the gSOAP context in your code every time after initialization of the soap struct with the soap_set_namespaces(struct soap*, const struct Namespace*) function.
For example, suppose we have two clients defined in header files client1.h and client2.h. We first generate the envH.h file for the SOAP Header and Fault definitions:

> soapcpp2 -c -penv env.h

Then we generate the code for client1 and client2:

> soapcpp2 -c -n -pmyClient1 client1.h
> soapcpp2 -c -n -pmyClient2 client2.h

This generates myClient1ClientLib.c and myClient2ClientLib.c (among many other files). These two files should be compiled and linked with your application. The source code of your application should include the generated envH.h, myClient1H.h, myClient2.h files and myClient1.nsmap, myClient2.nsmap files:

#include "envH.h" // include this file first!
#include "myClient1H.h" // include client 1 stubs
#include "myClient2H.h" // include client 2 stubs
...
#include "myClient1H.nsmap" // include client 1 nsmap
#include "myClient2H.nsmap" // include client 2 nsmap
...
soap_init(&soap);
soap_set_namespaces(&soap, myClient1_namespaces);
... make Client 1 invocations ...
...
soap_set_namespaces(&soap, myClient2_namespaces);
... make Client 2 invocations ...

It is important to use soapcpp2 option -n, see Section 9.1, to rename the namespace tables so we can include them all without running into redefinitions.
Note: Link conflicts may still occur in the unlikely situation that identical service operation names are defined in two or more client stubs or server skeletons when these methods share the same XML namespace prefix. You may have to use C++ code namespaces to avoid these link conflicts or rename the namespace prefixes used by the service operation defined in the header files.

19.36.1  C++ Clients Example

As an example we will build a Delayed Stock Quote client library and a Currency Exchange Rate client library.
First, we create an empty header file env.h (which may contain optional SOAP Header and Fault definitions), and compile it as follows:

> soapcpp2 -penv env.h
> c++ -c envC.cpp

We also compile stdsoap2.cpp without namespaces:

> c++ -c -DWITH_NONAMESPACES stdsoap2.cpp

Note: when you forget to use -DWITH_NONAMESPACES you will get an unresolved link error for the global namespaces table. You can define a dummy table to avoid having to recompile stdsoap2.cpp.
Second, we create the Delayed Stock Quote header file specification, which may be obtained using the WSDL importer. If you want to use C++ namespaces then you need to manually add the namespace declaration to the generated header file:

namespace quote {
//gsoap ns service name: Service
//gsoap ns service style: rpc
//gsoap ns service encoding: encoded
//gsoap ns service location: http://services.xmethods.net/soap
//gsoap ns schema namespace: urn:xmethods-delayed-quotes
//gsoap ns service method-action: getQuote ""
int ns__getQuote(char *symbol, float &Result);
}

We then compile it as a library and we use option -n to rename the namespace table to avoid link conflicts later:

> soapcpp2 -n quote.h
> c++ -c quoteClientLib.cpp

If you don't want to use a C++ code namespace, you should compile quote.h "as is" with soapcpp2 option -pquote:

> soapcpp2 -n -pquote quote.h
> c++ -c quoteClientLib.cpp

Third, we create the Currency Exchange Rate header file specification:

namespace rate {
//gsoap ns service name: Service
//gsoap ns service style: rpc
//gsoap ns service encoding: encoded
//gsoap ns service location: http://services.xmethods.net/soap
//gsoap ns schema namespace: urn:xmethods-CurrencyExchange
//gsoap ns service method-action: getRate ""
int ns__getRate(char *country1, char *country2, float &Result);
}

Similar to the Quote example above, we compile it as a library and we use option -n to rename the namespace table to avoid link conflicts:

> soapcpp2 -n rate.h

Fourth, we consider linking the libraries to the main program. The main program can import the quoteServiceProxy.h and rateServiceProxy.h files to obtain client proxies to invoke the services. The proxy implementations are defined in quoteClient.cpp. The -n option also affects the generation of the C++ proxy codes to ensure that the gSOAP context is properly initialized with the appropriate namespace table (so you don't have to initialize explicitly - this feature is only available with C++ proxy and server object classes).

#include "quoteServiceProxy.h" // get quote Service proxy
#include "rateServiceProxy.h" // get rate Service proxy
#include "quote.nsmap" // get quote namespace bindings
#include "rate.nsmap" // get rate namespace bindings
int main(int argc, char *argv[])
{
   if (argc < = 1)
   {
      std::cerr << "Usage: main ticker [currency]" << std::endl
      exit(0);
   }
   quote::Service quote;
   float q;
   if (quote.getQuote(argv[1], q)) // get quote
      soap_print_fault(quote.soap, stderr);
   else
   {
      if (argc > 2)
      {
         rate::Service rate;
         float r;
         if (rate.getRate("us", argv[2], r)) // get rate in US dollars
            soap_print_fault(rate.soap, stderr);
         else
            q *= r; // convert the quote
      }
      std::cout << argv[1] << ": " << q << std::endl;
   }
   return 0;
}

Compile and link this application with stdsoap2.o, envC.o, quoteServerProxy.o, and rateServerProxy.o.
To compile and link a server object is very similar. For example, assume that we need to implement a calculator service and we want to create a library for it.

namespace calc {
//gsoap ns service name: Service
//gsoap ns service style: rpc
//gsoap ns service encoding: encoded
//gsoap ns service location: http://www.cs.fsu.edu/~engelen/calc.cgi
//gsoap ns schema namespace: urn:calc
int ns__add(double a, double b, double &result);
int ns__sub(double a, double b, double &result);
int ns__mul(double a, double b, double &result);
int ns__div(double a, double b, double &result);
}

We compile this with:

> soapcpp2 -n calc.h

The effect of the -n option is that it creates local namespace tables, and a modified calcServiceObject.h server class definitions that properly initialize the gSOAP run time with the table.

#include "calcServiceObject.h" // get Service object
#include "calc.nsmap" // get calc namespace bindings
...
calc::Service calc;
calc.serve(); // calls request dispatcher to invoke one of the functions below
...
int calc::Service::add(double a, double b, double &result);
{ result = a + b; returnSOAP_OK; }
int calc::Service::sub(double a, double b, double &result);
{ result = a - b; returnSOAP_OK; }
int calc::Service::mul(double a, double b, double &result);
{ result = a * b; returnSOAP_OK; }
int calc::Service::div(double a, double b, double &result);
{ result = a / b; returnSOAP_OK; }

In fact, the calc::Service class is derived from the struct soap. So the context is available as this, which can be passed to all gSOAP functions that require a soap struct context.
The example above serves requests over stdin/out. Use the bind and accept calls to create a stand-alone server to service inbound requests over sockets, see 7.2.3.

19.36.2  C Clients Example

This is the same example as above, but the clients are build with pure C.
We create a env.h that contains the joint SOAP Header and SOAP Fault definitions. You may have to copy-paste these from the other header files. Then, compile it as follows:

> soapcpp2 -c -penv env.h
> cc -c envC.c

We also compile stdsoap2.c without namespaces:

> cc -c -DWITH_NONAMESPACES stdsoap2.c

Second, we create the Delayed Stock Quote header file specification, which may be obtained using the WSDL importer.

//gsoap ns service name: Service
//gsoap ns service style: rpc
//gsoap ns service encoding: encoded
//gsoap ns service location: http://services.xmethods.net/soap
//gsoap ns schema namespace: urn:xmethods-delayed-quotes
//gsoap ns service method-action: getQuote ""
int ns__getQuote(char *symbol, float *Result);

We compile it as a library and we use options -n and -p to rename the namespace table to avoid link conflicts:

> soapcpp2 -c -n -pquote quote.h
> cc -c quoteClientLib.c

Third, we create the Currency Exchange Rate header file specification:

//gsoap ns service name: Service
//gsoap ns service style: rpc
//gsoap ns service encoding: encoded
//gsoap ns service location: http://services.xmethods.net/soap
//gsoap ns schema namespace: urn:xmethods-CurrencyExchange
//gsoap ns service method-action: getRate ""
int ns__getRate(char *country1, char *country2, float *Result);

We compile it as a library and we use options -n and -p to rename the namespace table to avoid link conflicts:

> soapcpp2 -c -n -prate rate.h
> cc -c rateClientLib.c

The main program is:

#include "quoteStub.h" // get quote Service stub
#include "rateStub.h" // get rate Service stub
#include "quote.nsmap" // get quote namespace bindings
#include "rate.nsmap" // get rate namespace bindings
int main(int argc, char *argv[])
{
   if (argc < = 1)
   {
      fprintf(stderr, "Usage: main ticker [currency]\n");
      exit(0);
   }
   struct soap soap;
   float q;
   soap_init(&soap);
   soap_set_namespaces(&soap, quote_namespaces);
   if (soap_call_ns__getQuote(&soap, "http://services.xmethods.net/soap", "", argv[1], &q)) // get quote
      soap_print_fault(&soap, stderr);
   else
   {
      if (argc > 2)
      {
         soap_set_namespaces(&soap, rate_namespaces);
         float r;
         if (soap_call_ns__getRate(&soap, "http://services.xmethods.net/soap", "", "us", argv[2], &r)) // get rate in US dollars
            soap_print_fault(&soap, stderr);
         else
            q *= r; // convert the quote
      }
      printf("%s: %f \n", argv[1], q);
   }
   return 0;
}

Compile and link this application with stdsoap2.o, envC.o, quoteClientLib.o, and rateClientLib.o.
To compile and link a server library is very similar. Assuming that the server is named "calc" (as specified with options -n and -p), the application needs to include the calcStub.h file, link the calcServerLib.o file, and call calc_serve(&soap) function at run time.

19.36.3  C Services Chaining Example

We build a C application for multiple services served on one port.
We create a env.h that contains the joint SOAP Header and SOAP Fault definitions. You may have to copy-paste these from the other header files. Then, compile it as follows:

> soapcpp2 -c -penv env.h
> cc -c envC.c

We also compile stdsoap2.c without namespaces:

> cc -c -DWITH_NONAMESPACES stdsoap2.c

Say we have a service definition in quote.h. We compile it as a library and we use options -n and -p to rename the namespace table to avoid link conflicts:

> soapcpp2 -c -n -pquote quote.h
> cc -c quoteClientLib.c

We do the same for a service definition in rate.h:

> soapcpp2 -c -n -prate rate.h
> cc -c rateClientLib.c

To serve both the quote and rate services on the same port, we chain the service dispatchers as follows:

struct soap *soap = soap_new();
soap_bind(soap, NULL, 8080, 100);
soap_accept(soap);
if (soap_begin_serve(soap))
   soap_send_fault(&abc); // send fault to client
else if (quote_serve_request(soap) == SOAP_NO_METHOD)
{
   if (rate_serve_request(soap))       soap_send_fault(soap); // send fault to client
}
else if (soap.error)
   soap_send_fault(soap); // send fault to client
soap_destroy(soap);
soap_end(soap);
soap_free(soap);

This chaining can be arbitrarily deep. When the previous request fails with a SOAP_NO_METHOD then next request dispatcher can be tried.
The server should also define the service operations:

int ns__getQuote(struct soap *soap, char *symbol, float *Result);
{ *Result = ... ;
   return SOAP_OK;
}
int ns__getRate(struct soap *soap, char *country1, char *country2, float *Result);
{ *Result = ... ;
   return SOAP_OK;
}

19.37  How to Create DLLs

19.37.1  Create the Base stdsoap2.dll

First, create a new header file env.h with the SOAP Header and Fault definitions. You can leave this header file empty if you want to use the default SOAP Header and Fault. Then compile this header file with:

> soapcpp2 -penv env.h

The generated envC.cpp file holds the SOAP Header and Fault serializers, which need to be part of the base library functions. The SOAP Header and Fault structures are generated by wsdl2h and are also located in the .h files for plugins such as wsse.h. You should copy these Header and Fault structures into env.h to ensure processing by these plugins succeeds.
The next step is to create stdsoap2.dll which consists of the file stdsoap2.cpp and envC.cpp and optionally the plugins you want to use such as wsseapi.c (rename to .cpp to avoid warnings). This DLL contains all common functions needed for all other clients and servers based on gSOAP. Compile envC.cpp and stdsoap2.cpp into stdsoap2.dll using the C++ compiler option -DWITH_NONAMESPACES and the MSVC Pre-Processor definitions SOAP_FMAC1=__declspec(dllexport) and SOAP_FMAC3=__declspec(dllexport) as shown below from the MSVC command prompt:

C: cl /c /I. /EHsc /DWITH_NONAMESPACES /DSOAP_FMAC1=__declspec(dllexport) /DSOAP_FMAC3=__declspec(dllexport) envC.cpp stdsoap2.cpp
C: link /LIBPATH ws2_32.lib /OUT:mygsoap.dll /DLL envC.obj stdsoap2.obj

Alternatively, you can compile with -DWITH_SOAPDEFS_H and put the macro definitions in soapdefs.h. This exports all functions which are preceded by the macro SOAP_FMAC1 in the soapcpp2.cpp source file and macro SOAP_FMAC3 in the envC.cpp source file.

19.37.2  Creating Client and Server DLLs

Compile the soapClientLib.cpp and soapServerLib.cpp sources as DLLs by using the MSVC Pre-Processor definitions SOAP_FMAC5=__declspec(dllexport) and SOAP_CMAC=__declspec(dllexport), and by using the C++ compiler option -DWITH_NONAMESPACES. This DLL links to stdsoap2.dll.
To create multiple DLLs in the same project directory, you SHOULD use option -p to rename the generated soapClientLib.cpp and soapServerLib.cpp (and associated) files. The -p option specifies the file name prefix to replace the soap prefix. A clean separation of libraries can also be achieved with C++ namespaces, see Section 19.35.
Unless you use the client proxy and server object classes (soapXProxy.h and soapXObject.h where X is the name of the service), all client and server applications MUST explicitly set the namespaces value of the gSOAP context:

soap_init(&soap);
soap_set_namespaces(&soap, namespaces);

where the namespaces[] table should be defined in the client/server source. These tables are generated in the .nsmap files. You can rename the tables using option -n, see Section 9.1.

19.38  gSOAP Plug-ins

The gSOAP plug-in feature enables a convenient extension mechanism of gSOAP capabilities. When the plug-in registers with gSOAP, it has full access to the run-time settings and the gSOAP function callbacks. Upon registry, the plug-in's local data is associated with the gSOAP run-time. By overriding gSOAP's function callbacks with the plug-in's function callbacks, the plug-in can extend gSOAP's capabilities. The local plug-in data can be accessed through a lookup function, usually invoked within a callback function to access the plug-in data. The registry and lookup functions are:

int soap_register_plugin_arg(struct soap *soap, int (*fcreate)(struct soap *soap, struct soap_plugin *p, void *arg), void *arg)
void* soap_lookup_plugin(struct soap*, const char*);

Other functions that deal with plug-ins are:

int soap_copy(struct soap *soap);
void soap_done(struct soap *soap);

The soap_copy function returns a new dynamically allocated gSOAP context that is a copy of another, such that no data is shared between the copy and the original context. The soap_copy function invokes the plug-in copy callbacks to copy the plug-ins' local data. The soap_copy function returns a gSOAP error code or SOAP_OK. The soap_done function de-registers all plugin-ins, so this function should be called to cleanly terminate a gSOAP run-time context.
An example will be used to illustrate these functions. This example overrides the send and receive callbacks to copy all messages that are sent and received to the terminal (stderr).
First, we write a header file plugin.h to define the local plug-in data structure(s) and we define a global name to identify the plug-in:

#include "stdsoap2.h"
#define PLUGIN_ID "PLUGIN-1.0" // some name to identify plugin
struct plugin_data // local plugin data
{
   int (*fsend)(struct soap*, const char*, size_t); // to save and use send callback
   size_t (*frecv)(struct soap*, char*, size_t); // to save and use recv callback
};
int plugin(struct soap *soap, struct soap_plugin *plugin, void *arg);

Then, we write the plugin registry function and the callbacks:

#include "plugin.h"
static const char plugin_id[] = PLUGIN_ID; // the plugin id
static int plugin_init(struct soap *soap, struct plugin_data *data);
static int plugin_copy(struct soap *soap, struct soap_plugin *dst, struct soap_plugin *src);
static void plugin_delete(struct soap *soap, struct soap_plugin *p);
static int plugin_send(struct soap *soap, const char *buf, size_t len);
static size_t plugin_recv(struct soap *soap, char *buf, size_t len);
// the registry function:
int plugin(struct soap *soap, struct soap_plugin *p, void *arg)
{
   p->id = plugin_id;
   p->data = (void*)malloc(sizeof(struct plugin_data));
   p->fcopy = plugin_copy; /* optional: when set the plugin must copy its local data */
   p->fdelete = plugin_delete;
   if (p->data)
      if (plugin_init(soap, (struct plugin_data*)p->data))
      {
         free(p->data); // error: could not init
         return SOAP_EOM; // return error
      }
   return SOAP_OK;
}
static int plugin_init(struct soap *soap, struct plugin_data *data)
{
   data->fsend = soap->fsend; // save old recv callback
   data->frecv = soap->frecv; // save old send callback
   soap->fsend = plugin_send; // replace send callback with new
   soap->frecv = plugin_recv; // replace recv callback with new
   return SOAP_OK;
}
// copy plugin data, called by soap_copy() // This is important: we need a deep copy to avoid data sharing by two run-time contexts
static int plugin_copy(struct soap *soap, struct soap_plugin *dst, struct soap_plugin *src)
{
   if (!(dst->data = (struct plugin_data*)malloc(sizeof(struct plugin_data))))
      return SOAP_EOM;
   *dst->data = *src->data;
   return SOAP_OK;
}
// plugin deletion, called by soap_done()
static void plugin_delete(struct soap *soap, struct soap_plugin *p)
{ free(p->data); // free allocated plugin data
}
// the new send callback
static int plugin_send(struct soap *soap, const char *buf, size_t len)
{
   struct plugin_data *data = (struct plugin_data*)soap_lookup_plugin(soap, plugin_id); // fetch plugin's local data
   fwrite(buf, len, 1, stderr); // write message to stderr
   return data->fsend(soap, buf, len); // pass data on to old send callback
}
// the new receive callback
static size_t plugin_recv(struct soap *soap, char *buf, size_t len)
{
   struct plugin_data *data = (struct plugin_data*)soap_lookup_plugin(soap, plugin_id); // fetch plugin's local data
   size_t res = data->frecv(soap, buf, len); // get data from old recv callback
   fwrite(buf, res, 1, stderr);
   return res;
}

The fdelete callback of struct soap_plugin MUST be set to register the plugin. It is the responsibility of the plug-in to handle registry (init), copy, and deletion of the plug-in data and callbacks.
A plugin is copied with the soap_copy() call. This function copies a soap struct and the chain of plugins. It is up to the plugin implementation to share the plugin data or not:
  1. if the fcopy() callback is set by the plugin initialization, this callback will be called to allow the plugin to copy its local data upon a soap_copy() call. When soap_done() is called on the soap struct copy, the fdelete() callback is called for deallocation and cleanup of the local data.
  2. if the fcopy() callback is not set, then the plugin data will be shared (i.e. the data pointer points to the same address). The fdelete() callback will not be called upon a soap_done() on a copy of the soap struct. The fdelete() callback will be called for the original soap struct with which the plugin was registered.
The example plug-in should be used as follows:

struct soap soap;
soap_init(&soap);
soap_register_plugin(&soap, plugin);
...
soap_done(&soap);

Note: soap_register_plugin(...) is an alias for soap_register_plugin_arg(..., NULL). That is, it passes NULL as an argument to plug-in's registry callback.
A number of example plug-ins are included in the gSOAP package's plugin directory. Some of these plug-ins are discussed.

19.38.1  The Message Logging and Statistics Plug-in

The message logging and access statistics plug-in can be used to selectively log inbound and outbound messages to a file or stream. It also keeps access statistics to log the total number of bytes sent and received.
To use the plug-in, compile and link your application with logging.c located in the plugin directory of the package. To enable the plug-in in your code, register the plug-in and set the streams as follows:

#include "logging.h"
size_t bytes_in;
size_t bytes_out;
...
if (soap_register_plugin(&soap, logging))
   soap_print_fault(&soap, stderr); // failed to register
...
soap_set_logging_inbound(&soap, stdout);
soap_set_logging_outbound(&soap, stdout);
... process messages ...
soap_set_logging_inbound(&soap, NULL); // disable logging
soap_set_logging_outbound(&soap, NULL); // disable logging
soap_get_logging_stats(&soap, &bytes_out, &bytes_in);

If you use soap_copy to copy the soap struct with the plug-in, the plug-in's data will be shared by the copy. Therefore, the statistics are not 100% guaranteed to be accurate for multi-threaded services since race conditions on the counters may occur. Mutex is not used to update the counters to avoid introducing expensive synchronization points. If 100% server-side accuracy is required, add mutex at the points indicated in the logging.c code.

19.38.2  RESTful Interface: The HTTP GET Plug-in

Client-side and server-side use of RESTful HTTP GET operations are supported with the HTTP GET plug-in plugin/httpget.c. The HTTP GET plug-in allows your server to handle RESTful HTTP GET requests and at the same time still serve SOAP-based POST requests. The plug-in provides support to client applications to issue HTTP GET operations to a server.
Note that HTTP GET requests can also be handled at the server side with the fget callback, see Section 19.7. However, the HTTP GET plug-in also keeps statistics on the number of successful POST and GET exchanges and failed operations (HTTP faults, SOAP Faults, etc.). It also keeps hit histograms accumulated for up to a year of runtime.
To use the plug-in, compile and link your application with httpget.c located in the plugin directory of the package. To enable the plug-in in your code, register the plug-in with your HTTP GET handler function as follows:

#include "httpget.h"
...
if (soap_register_plugin_arg(&soap, httpget, (void*)my_http_get_handler))
   soap_print_fault(&soap, stderr); // failed to register
...
struct http_get_data *httpgetdata;
httpgetdata = (struct http_get_data*)soap_lookup_plugin(&soap, http_get_id);
if (!httpgetdata)
   ... // if the plug-in registered OK, there is certainly data but can't hurt to check
... process messages ...
size_t get_ok = httpgetdata->stat_get;
size_t post_ok = httpgetdata->stat_post;
size_t errors = httpgetdata->stat_fail;
...
time_t now = time(NULL);
struct tm *T;
T = localtime(&now);
size_t hitsthisminute = httpgetdata->min[T->tm_min];
size_t hitsthishour = httpgetdata->hour[T->tm_hour];
size_t hitstoday = httpgetdata->day[T->tm_yday];

An HTTP GET handler can simply produce some HTML content, or any other type of content by sending data:

int my_http_get_handler(struct *soap)
{
   soap->http_content = "text/html";
   soap_response(soap, SOAP_FILE);
   soap_send(soap, «html>Hello</html>");
   soap_end_send(soap);
   return SOAP_OK; // return SOAP_OK or HTTP error code, e.g. 404
}

If you use soap_copy to copy the soap struct with the plug-in, the plug-in's data will be shared by the copy. Therefore, the statistics are not 100% guaranteed to be accurate for multi-threaded services since race conditions on the counters may occur. Mutex is not used to update the counters to avoid introducing expensive synchronization points. If 100% server-side accuracy is required, add mutex at the points indicated in the httpget.c code.
The client-side use of HTTP GET is provided by the soap_get_connect operation. To receive a SOAP/XML (response) message ns:methodResponse, use:

#include "httpget.h"
...
soap_register_plugin(&soap, http_get);
...
if (soap_get_connect(&soap, endpoint, action))
   ... connect error ...
else if (soap_recv_ns__methodResponse(&soap, ... params ...))
   ... error ...
else
   ... ok ...
soap_destroy(&soap);
soap_end(&soap);
soap_done(&soap);

To receive any HTTP Body data into a buffer, use:

#include "httpget.h"
...
char *response = NULL;
soap_register_plugin(&soap, http_get);
...
if (soap_get_connect(&soap, endpoint, NULL))
   ... connect error ...
else if (soap_begin_recv(&soap))
   ... error ...
else
   response = soap_get_http_body(&soap);
soap_end_recv(&soap);
... use the 'response' string (NULL indicates no body or error)
soap_destroy(&soap);
soap_end(&soap);
soap_done(&soap);

19.38.3  RESTful Interface: The HTTP POST Plug-in

Client-side and server-side use of RESTful HTTP POST, PUT, and DELETE operations are supported with the HTTP POST plug-in plugin/httppost.c.
The HTTP POST plug-in allows your server to handle RESTful HTTP POST requests and at the same time still serve SOAP-based POST requests. The plug-in also provides support for client applications to issue HTTP POST operations to a server.
To simplify the server-side handling of POST requests, handlers can be associated with media types:

struct http_post_handlers my_handlers[] =
{ { "image/jpg", jpeg_handler },
   { "image/ *", image_handler },
   { "text/html", html_handler },
   { "text/ *", text_handler },
   { "text/ *;*", text_handler },
   { "POST", generic_POST_handler },
   { "PUT", generic_PUT_handler },
   { "DELETE", generic_DELETE_handler },
   { NULL }
};

Note that '*' can be used as a wildcard and some media types may have optional parameters (after ';'). The handlers are functions that will be invoked when a POSTed request message matching media type is send to the server.
An example image handler that checks the specific image type:

int image_handler(struct soap *soap)
{ const char *buf;
   size_t len;
   // if necessary, check type in soap->http_content
   if (soap->http_content && !soap_tag_cmp(soap->http_content, "image/gif")
      return 404; // HTTP error 404
   if (soap_http_body(soap, &buf, &len) != SOAP_OK)
      return soap->error;
   // ... now process image in buf
   // reply with empty HTTP OK response:
   soap_response(soap, SOAP_OK);
   soap_end_send(soap);
   return SOAP_OK;
}

The HTTP POST plug-in provides a soap_http_body operation as illustrated above to copy the HTTP Body content into a buffer.
The above example returns HTTP OK. If content is supposed to be returned, then use:

   soap->http_content = "image/jpeg"; // a jpeg image to return back
   soap_response(soap, SOAP_FILE); // SOAP_FILE sets custom http content
   soap_send_raw(soap, buf, len); // send image
   soap_end_send(soap);

For client applications to use HTTP POST, use the soap_post_connect operation:

char *buf; // holds the HTTP request/response body data
size_t len; // length of data
...
if (soap_post_connect(soap, "URL", "SOAP action or NULL", "media type")
   || soap_send_raw(soap, buf, len);
   || soap_end_send(soap))
   ... error ...
if (soap_begin_recv(&soap)
   || soap_http_body(&soap, &buf, &len)
   || soap_end_recv(&soap))
   ... error ...
// ... use buf[0..len-1]
soap_end(soap);

Similarly, soap_put_connect and soap_delete_connect commands are provided for PUT and DELETE handling.

19.38.4  The HTTP MD5 Checksum Plug-in

The HTTP MD5 plug-in works in the background to automatically verify the content of messages using MD5 checksums. With the plug-in, messages can be transferred over (trusted but) unreliable connections. The plug-in can be used on the client side and server side.
To use the plug-in, compile and link your application with httpmd5.c and md5evp.c located in the plugin directory of the package. The md5evp.c implementation uses the EVP interface to compute MD5 checksums with OpenSSL (compiled with -DWITH_OPENSSL).
To enable the plug-in in your code, register the plug-in as follows:

#include "httpmd5.h"
...
if (soap_register_plugin(&soap, http_md5))
   soap_print_fault(&soap, stderr); // failed to register

Once registered, MD5 checksums are produced for all outbound messages. Inbound messages with MD5 checksums in the HTTP header are automatically verified.
The plug-in requires you to set the SOAP_IO_STORE flag when sending SOAP with attachments:

#include "httpmd5.h"
...
struct soap soap;
soap_init1(&soap, SOAP_IO_STORE);
if (soap_register_plugin(&soap, http_md5)
   soap_print_fault(&soap, stderr); // failed to register
... now safe to send SOAP with attachments ...

Unfortunately, this eliminates streaming.

19.38.5  The HTTP Digest Authentication Plug-in

The HTTP digest authentication plug-in enables a more secure authentication scheme compared to basic authentication. HTTP basic authentication sends unencrypted userids and passwords over the net, while digest authentication does not exchange passwords but exchanges checksums of passwords (and other data such as nonces to avoid replay attacks). For more details, please see RFC 2617.
The HTTP digest authentication can be used next to the built-in basic authentication, or basic authentication can be rejected to tighten security. The server must have a database with userid's and passwords (in plain text form). The client, when challenged by the server, checks the authentication realm provided by the server and sets the userid and passwords for digest authentication. The client application can temporarily store the userid and password for a sequence of message exchanges with the server, which is faster than repeated authorization challenges and authentication responses.
At the client side, the plug-in is registered and service invocations are checked for authorization challenges (HTTP error code 401). When the server challenges the client, the client should set the userid and password and retry the invocation. The client can determine the userid and password based on the authentication realm part of the server's challenge. The authentication information can be temporarily saved for multiple invocations.
Client-side example:

#include "httpda.h"
...
if soap_register_plugin(&soap, http_da))
   soap_print_fault(&soap, stderr); // failed to register
...
if (soap_call_ns__method(&soap, ...) != SOAP_OK)
{
   if (soap.error == 401) // challenge: HTTP authentication required
   {
      if (!strcmp(soap.authrealm, authrealm)) // determine authentication realm       {
         struct http_da_info info; // to store userid and passwd
         http_da_save(&soap, &info, authrealm, userid, passwd); // set userid and passwd for this realm
         if (soap_call_ns__method(&soap, ...) == SOAP_OK) // retry
         { ...
            soap_end(&soap); // userid and passwd were deallocated
            http_da_restore(&soap, &info); // restore userid and passwd
            if (!soap_call_ns__method(&soap, ...) == SOAP_OK) // another call
               ...
            http_da_release(&soap, &info); // remove userid and passwd

This code supports both basic and digest authentication.
The server can challenge a client using HTTP code 401. With the plug-in, HTTP digest authentication challenges are send. Without the plug-in, basic authentication challenges are send.
Each server method can implement authentication as desired and may enforce digest authentication or may also accept basic authentication responses. To verify digest authentication responses, the server should compute and compare the checksums using the plug-in's http_da_verify_post function for HTTP POST requests (and http_da_verify_get for HTTP GET requests with the HTTP GET plugin) as follows:

#include "httpda.h"
...
if (soap_register_plugin(&soap, http_da))
   soap_print_fault(&soap, stderr); // failed to register
...
soap_serve(&soap);
...
int ns__method(struct soap *soap, ...)
{
   if (soap->userid && soap->passwd) // client used basic authentication
   { // may decide not to handle, but if ok then go ahead and compare info:
      if (!strcmp(soap->userid, userid) && !strcmp(soap->passwd, passwd))
      { ... handle request ...
         return SOAP_OK;
      }
   }
   else if (soap->authrealm && soap->userid) // Digest authentication
   {
      passwd = ... // database lookup on userid and authrealm to find passwd
      if (!strcmp(soap->authrealm, authrealm) && !strcmp(soap->userid, userid))
      {
         if (!http_da_verify_post(soap, passwd))
         { ... handle request ...
            return SOAP_OK;
         }
      }
   }
   soap->authrealm = authrealm; // set realm for challenge
   return 401; // Not authorized, challenge digest authentication
}

For more details, including how to configure HTTP Digest authentication for proxies, please see the doc/httpda/html/index.html documentation in the gSOAP package.

19.38.6  The WS-Addressing Plug-in

The WSA WS-Addressing plug-in and the source code are extensively documented in the doc/wsa directory of the gSOAP package. Please refer to the documentation included in the package.
The plug-in code is located in the plugin directory:

wsaapi.h and wsaapi.c WS-Addressing plugin (C and C++)

To enable WS-Addressing 2005 (and support for 8/2004), the service definitions header file for soapcpp2 should include the following imports:

#import "import/wsa5.h"

This imports the SOAP header elements required by WS-Addressing.
For more details, please see the doc/wsa/html/index.html documentation in the gSOAP package.

19.38.7  The WS-ReliableMessaging Plug-in

The WSRM WS-ReliableMessaging plug-in and the source code are extensively documented in the doc/wsrm directory of the gSOAP package. Please refer to the documentation included in the package.
The plug-in code is located in the plugin directory:

wsrmapi.h and wsrmapi.c WS-ReliableMessaging plugin (C and C++)

Also needed are:

threads.h and threads.c Multithreading and locking support

To enable WS-ReliableMessaging, the service definitions header file for soapcpp2 should include the following imports:

#import "import/wsrm.h"
#import "import/wsa5.h"

This imports the SOAP header elements required by WS-ReliableMessaging.
For more details, please see the doc/wsrm/html/index.html documentation in the gSOAP package.

19.38.8  The WS-Security Plug-in

The WSSE WS-Security plug-in and the source code are extensively documented in the doc/wsse directory of the gSOAP package. Please refer to the documentation included in the package for details.
The plug-in code is located in the plugin directory:

wsseapi.h and wsseapi.c WS-Security plugin (C and C++)

Also needed are:

smdevp.h and smdevp.c Streaming XML signature and message digest engine
mecevp.h and mecevp.c Streaming XML encryption engine
threads.h and threads.c Multithreading and locking support

To enable WS-Secrutiy, the service definitions header file for soapcpp2 should include the following imports:

#import "import/wsse.h"

This imports the SOAP header elements required by WS-Security.
For more details, please see the doc/wsse/html/index.html documentation in the gSOAP package.

19.38.9  WS-Discovery

The WS-Discovery implementation is documented in the doc/wsdd directory of the gSOAP package. Please refer to the documentation included in the package for details.
Basically, to add WS-Discovery support the following event handlers must be defined and linked:

void wsdd_event_Hello(struct soap *soap,
unsigned int InstanceId,
const char *SequenceId,
unsigned int MessageNumber,
const char *MessageID,
const char *RelatesTo,
const char *EndpointReference,
const char *Types,
const char *Scopes,
const char *MatchBy,
const char *XAddrs,
unsigned int MetadataVersion)



void wsdd_event_Bye(struct soap *soap,
unsigned int InstanceId,
const char *SequenceId,
unsigned int MessageNumber,
const char *MessageID,
const char *RelatesTo,
const char *EndpointReference,
const char *Types,
const char *Scopes,
const char *MatchBy,
const char *XAddrs,
unsigned int MetadataVersion)



soap_wsdd_mode wsdd_event_Probe(struct soap *soap,
const char *MessageID,
const char *ReplyTo,
const char *Types,
const char *Scopes,
const char *MatchBy,
struct wsdd__ProbeMatchesType *ProbeMatches)



void wsdd_event_ProbeMatches(struct soap *soap,
unsigned int InstanceId,
const char *SequenceId,
unsigned int MessageNumber,
const char *MessageID,
const char *RelatesTo,
struct wsdd__ProbeMatchesType *ProbeMatches)



soap_wsdd_mode wsdd_event_Resolve(struct soap *soap,
const char *MessageID,
const char *ReplyTo,
const char *EndpointReference,
struct wsdd__ResolveMatchesType *ResolveMatches)



void wsdd_event_ResolveMatches(struct soap *soap,
unsigned int InstanceId,
const char *SequenceId,
unsigned int MessageNumber,
const char *MessageID,
const char *RelatesTo,
const char *EndpointReference,
const char *Types,
const char *Scopes,
const char *MatchBy,
const char *XAddrs,
unsigned int MetadataVersion)

These event handlers will be invoked when inbound WS-Discovery messages arrive using:


if (!soap_valid_socket(soap_bind(soap, NULL, port, 100)))
   .. error
if (soap_wsdd_listen(soap, timeout))
   ... error

which will listen for timeout seconds to inbound WS-Discovery messages on a port and dispatches them to the event handlers. A negative timeout is measured in ns.



File translated from TEX by TTHgold, version 4.00.
On 31 Jan 2016, 08:32.
gsoap-2.8.28/gsoap/doc/dom/0000755000175000017500000000000012654077574014742 5ustar ellertellertgsoap-2.8.28/gsoap/doc/dom/Doxyfile0000644000175000017500000002315312653650144016441 0ustar ellertellert# Doxyfile 1.3.8 #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- PROJECT_NAME = "Level-2 DOM v5" PROJECT_NUMBER = "2.8 Stable" PROJECT_LOGO = "../GeniviaLogo2_trans_noslogan.png" OUTPUT_DIRECTORY = CREATE_SUBDIRS = NO OUTPUT_LANGUAGE = English USE_WINDOWS_ENCODING = NO BRIEF_MEMBER_DESC = YES REPEAT_BRIEF = YES ABBREVIATE_BRIEF = "The $name class" \ "The $name widget" \ "The $name file" \ is \ provides \ specifies \ contains \ represents \ a \ an \ the ALWAYS_DETAILED_SEC = NO INLINE_INHERITED_MEMB = NO FULL_PATH_NAMES = NO STRIP_FROM_PATH = STRIP_FROM_INC_PATH = SHORT_NAMES = NO JAVADOC_AUTOBRIEF = NO MULTILINE_CPP_IS_BRIEF = NO DETAILS_AT_TOP = NO INHERIT_DOCS = YES DISTRIBUTE_GROUP_DOC = NO TAB_SIZE = 8 ALIASES = OPTIMIZE_OUTPUT_FOR_C = NO OPTIMIZE_OUTPUT_JAVA = NO SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- EXTRACT_ALL = YES EXTRACT_PRIVATE = YES EXTRACT_STATIC = YES EXTRACT_LOCAL_CLASSES = YES EXTRACT_LOCAL_METHODS = NO HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_CLASSES = NO HIDE_FRIEND_COMPOUNDS = NO HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = NO CASE_SENSE_NAMES = NO HIDE_SCOPE_NAMES = NO SHOW_INCLUDE_FILES = YES INLINE_INFO = YES SORT_MEMBER_DOCS = YES SORT_BRIEF_DOCS = NO SORT_BY_SCOPE_NAME = NO GENERATE_TODOLIST = YES GENERATE_TESTLIST = YES GENERATE_BUGLIST = YES GENERATE_DEPRECATEDLIST= YES ENABLED_SECTIONS = MAX_INITIALIZER_LINES = 30 SHOW_USED_FILES = YES #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- QUIET = NO WARNINGS = YES WARN_IF_UNDOCUMENTED = YES WARN_IF_DOC_ERROR = YES WARN_FORMAT = "$file:$line: $text" WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- INPUT = ../../import/dom.h ../../dom.cpp ../../samples/dom/dom2calc.cpp ../../samples/dom/README.md FILE_PATTERNS = *.c \ *.cc \ *.cxx \ *.cpp \ *.c++ \ *.java \ *.ii \ *.ixx \ *.ipp \ *.i++ \ *.inl \ *.h \ *.hh \ *.hxx \ *.hpp \ *.h++ \ *.idl \ *.odl \ *.cs \ *.php \ *.php3 \ *.inc \ *.m \ *.mm \ *.C \ *.CC \ *.C++ \ *.II \ *.I++ \ *.H \ *.HH \ *.H++ \ *.CS \ *.PHP \ *.PHP3 \ *.M \ *.MM RECURSIVE = NO EXCLUDE = EXCLUDE_SYMLINKS = NO EXCLUDE_PATTERNS = EXAMPLE_PATH = EXAMPLE_PATTERNS = * EXAMPLE_RECURSIVE = NO IMAGE_PATH = INPUT_FILTER = FILTER_PATTERNS = FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- SOURCE_BROWSER = NO INLINE_SOURCES = NO STRIP_CODE_COMMENTS = YES REFERENCED_BY_RELATION = NO REFERENCES_RELATION = NO VERBATIM_HEADERS = NO #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- ALPHABETICAL_INDEX = NO COLS_IN_ALPHA_INDEX = 5 IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- GENERATE_HTML = YES HTML_OUTPUT = html HTML_FILE_EXTENSION = .html HTML_HEADER = ../doxygen_header.html HTML_FOOTER = ../doxygen_footer.html HTML_STYLESHEET = HTML_ALIGN_MEMBERS = YES GENERATE_HTMLHELP = NO CHM_FILE = HHC_LOCATION = GENERATE_CHI = NO BINARY_TOC = NO TOC_EXPAND = NO DISABLE_INDEX = NO ENUM_VALUES_PER_LINE = 4 GENERATE_TREEVIEW = NO TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- GENERATE_LATEX = NO LATEX_OUTPUT = latex LATEX_CMD_NAME = latex MAKEINDEX_CMD_NAME = makeindex COMPACT_LATEX = NO PAPER_TYPE = a4wide EXTRA_PACKAGES = LATEX_HEADER = PDF_HYPERLINKS = NO USE_PDFLATEX = NO LATEX_BATCHMODE = NO LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- GENERATE_RTF = NO RTF_OUTPUT = rtf COMPACT_RTF = NO RTF_HYPERLINKS = NO RTF_STYLESHEET_FILE = RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- GENERATE_MAN = NO MAN_OUTPUT = man MAN_EXTENSION = .3 MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- GENERATE_XML = NO XML_OUTPUT = xml XML_SCHEMA = XML_DTD = XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- GENERATE_PERLMOD = NO PERLMOD_LATEX = NO PERLMOD_PRETTY = YES PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- ENABLE_PREPROCESSING = NO MACRO_EXPANSION = NO EXPAND_ONLY_PREDEF = NO SEARCH_INCLUDES = YES INCLUDE_PATH = INCLUDE_FILE_PATTERNS = PREDEFINED = EXPAND_AS_DEFINED = SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- TAGFILES = GENERATE_TAGFILE = ALLEXTERNALS = NO EXTERNAL_GROUPS = YES PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- CLASS_DIAGRAMS = NO HIDE_UNDOC_RELATIONS = YES HAVE_DOT = YES CLASS_GRAPH = YES COLLABORATION_GRAPH = YES UML_LOOK = NO TEMPLATE_RELATIONS = NO INCLUDE_GRAPH = YES INCLUDED_BY_GRAPH = YES CALL_GRAPH = NO GRAPHICAL_HIERARCHY = YES DOT_IMAGE_FORMAT = png DOT_PATH = /usr/local/bin DOTFILE_DIRS = MAX_DOT_GRAPH_WIDTH = 1024 MAX_DOT_GRAPH_HEIGHT = 1024 MAX_DOT_GRAPH_DEPTH = 1000 GENERATE_LEGEND = YES DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- SEARCHENGINE = NO gsoap-2.8.28/gsoap/doc/genivia_tabs.css0000644000175000017500000000320112653650144017311 0ustar ellertellert.tab_home { text-align: center; padding-top: 5px; padding-right: 10px; padding-left: 10px; font-size: 18px; } .tab_home a { color: #808080; text-decoration: none; } .tab_home a:hover { color: #D71E1E; text-decoration: none; } .tabs, .tabs2, .tabs3 { /* background-image: url('tab_b.png'); */ background: #c0504d; width: 90%; z-index: 101; font-size: 16px; font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; padding-left: 10%; } .tabs2 { font-size: 12px; } .tabs3 { font-size: 10px; } .tablist { margin: 0; padding: 0; display: table; } .tablist li { float: left; display: table-cell; /* background-image: url('tab_b.png'); */ line-height: 36px; list-style: none; } .tablist a { display: block; /* padding: 0 20px; */ padding: 6px 20px 6px 20px; /* background-image:url('tab_s.png'); font-weight: bold; background-repeat:no-repeat; background-position:right; color: #283A5D; */ color: rgba(255, 255, 255, 0.9); /* text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); */ text-decoration: none; outline: none; } .tabs3 .tablist a { padding: 0 10px; } .tablist a:hover { /* background-image: url('tab_h.png'); background-repeat:repeat-x; */ background: #E23232; color: #fff; /* text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); */ text-decoration: none; } .tablist li.current a { color: #ffffff; background: #E23232; /* background-image: url('tab_a.png'); background-repeat:repeat-x; color: #fff; text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); */ } gsoap-2.8.28/gsoap/doc/doxygen_footer.html0000644000175000017500000000055712653650144020100 0ustar ellertellert
gsoap-2.8.28/gsoap/doc/httpda/0000755000175000017500000000000012654077574015447 5ustar ellertellertgsoap-2.8.28/gsoap/doc/httpda/Doxyfile0000644000175000017500000002324212653650144017145 0ustar ellertellert# Doxyfile 1.3.8 #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- PROJECT_NAME = "HTTP Digest Authentication" PROJECT_NUMBER = "2.8 Stable" PROJECT_LOGO = "../GeniviaLogo2_trans_noslogan.png" OUTPUT_DIRECTORY = CREATE_SUBDIRS = NO OUTPUT_LANGUAGE = English USE_WINDOWS_ENCODING = NO BRIEF_MEMBER_DESC = YES REPEAT_BRIEF = YES ABBREVIATE_BRIEF = "The $name class" \ "The $name widget" \ "The $name file" \ is \ provides \ specifies \ contains \ represents \ a \ an \ the ALWAYS_DETAILED_SEC = NO INLINE_INHERITED_MEMB = NO FULL_PATH_NAMES = NO STRIP_FROM_PATH = STRIP_FROM_INC_PATH = SHORT_NAMES = NO JAVADOC_AUTOBRIEF = NO MULTILINE_CPP_IS_BRIEF = NO DETAILS_AT_TOP = NO INHERIT_DOCS = YES DISTRIBUTE_GROUP_DOC = NO TAB_SIZE = 8 ALIASES = OPTIMIZE_OUTPUT_FOR_C = NO OPTIMIZE_OUTPUT_JAVA = NO SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- EXTRACT_ALL = YES EXTRACT_PRIVATE = YES EXTRACT_STATIC = YES EXTRACT_LOCAL_CLASSES = YES EXTRACT_LOCAL_METHODS = NO HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_CLASSES = NO HIDE_FRIEND_COMPOUNDS = NO HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = NO CASE_SENSE_NAMES = NO HIDE_SCOPE_NAMES = NO SHOW_INCLUDE_FILES = YES INLINE_INFO = YES SORT_MEMBER_DOCS = YES SORT_BRIEF_DOCS = NO SORT_BY_SCOPE_NAME = NO GENERATE_TODOLIST = YES GENERATE_TESTLIST = YES GENERATE_BUGLIST = YES GENERATE_DEPRECATEDLIST= YES ENABLED_SECTIONS = MAX_INITIALIZER_LINES = 30 SHOW_USED_FILES = YES #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- QUIET = NO WARNINGS = YES WARN_IF_UNDOCUMENTED = YES WARN_IF_DOC_ERROR = YES WARN_FORMAT = "$file:$line: $text" WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- INPUT = ../../plugin/httpda.h ../../plugin/httpda.c ../../plugin/threads.h ../../plugin/threads.c ../../plugin/md5evp.h ../../plugin/md5evp.c FILE_PATTERNS = *.c \ *.cc \ *.cxx \ *.cpp \ *.c++ \ *.java \ *.ii \ *.ixx \ *.ipp \ *.i++ \ *.inl \ *.h \ *.hh \ *.hxx \ *.hpp \ *.h++ \ *.idl \ *.odl \ *.cs \ *.php \ *.php3 \ *.inc \ *.m \ *.mm \ *.C \ *.CC \ *.C++ \ *.II \ *.I++ \ *.H \ *.HH \ *.H++ \ *.CS \ *.PHP \ *.PHP3 \ *.M \ *.MM RECURSIVE = NO EXCLUDE = EXCLUDE_SYMLINKS = NO EXCLUDE_PATTERNS = EXAMPLE_PATH = EXAMPLE_PATTERNS = * EXAMPLE_RECURSIVE = NO IMAGE_PATH = INPUT_FILTER = FILTER_PATTERNS = FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- SOURCE_BROWSER = NO INLINE_SOURCES = NO STRIP_CODE_COMMENTS = YES REFERENCED_BY_RELATION = NO REFERENCES_RELATION = NO VERBATIM_HEADERS = NO #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- ALPHABETICAL_INDEX = NO COLS_IN_ALPHA_INDEX = 5 IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- GENERATE_HTML = YES HTML_OUTPUT = html HTML_FILE_EXTENSION = .html HTML_HEADER = ../doxygen_header.html HTML_FOOTER = ../doxygen_footer.html HTML_STYLESHEET = HTML_ALIGN_MEMBERS = YES GENERATE_HTMLHELP = NO CHM_FILE = HHC_LOCATION = GENERATE_CHI = NO BINARY_TOC = NO TOC_EXPAND = NO DISABLE_INDEX = NO ENUM_VALUES_PER_LINE = 4 GENERATE_TREEVIEW = NO TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- GENERATE_LATEX = NO LATEX_OUTPUT = latex LATEX_CMD_NAME = latex MAKEINDEX_CMD_NAME = makeindex COMPACT_LATEX = NO PAPER_TYPE = a4wide EXTRA_PACKAGES = LATEX_HEADER = PDF_HYPERLINKS = NO USE_PDFLATEX = NO LATEX_BATCHMODE = NO LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- GENERATE_RTF = NO RTF_OUTPUT = rtf COMPACT_RTF = NO RTF_HYPERLINKS = NO RTF_STYLESHEET_FILE = RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- GENERATE_MAN = NO MAN_OUTPUT = man MAN_EXTENSION = .3 MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- GENERATE_XML = NO XML_OUTPUT = xml XML_SCHEMA = XML_DTD = XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- GENERATE_PERLMOD = NO PERLMOD_LATEX = NO PERLMOD_PRETTY = YES PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- ENABLE_PREPROCESSING = YES MACRO_EXPANSION = NO EXPAND_ONLY_PREDEF = NO SEARCH_INCLUDES = YES INCLUDE_PATH = INCLUDE_FILE_PATTERNS = PREDEFINED = EXPAND_AS_DEFINED = SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- TAGFILES = GENERATE_TAGFILE = ALLEXTERNALS = NO EXTERNAL_GROUPS = YES PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- CLASS_DIAGRAMS = NO HIDE_UNDOC_RELATIONS = YES HAVE_DOT = YES CLASS_GRAPH = YES COLLABORATION_GRAPH = YES UML_LOOK = NO TEMPLATE_RELATIONS = NO INCLUDE_GRAPH = YES INCLUDED_BY_GRAPH = YES CALL_GRAPH = NO GRAPHICAL_HIERARCHY = YES DOT_IMAGE_FORMAT = png DOT_PATH = /usr/local/bin DOTFILE_DIRS = MAX_DOT_GRAPH_WIDTH = 1024 MAX_DOT_GRAPH_HEIGHT = 1024 MAX_DOT_GRAPH_DEPTH = 1000 GENERATE_LEGEND = YES DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- SEARCHENGINE = NO gsoap-2.8.28/gsoap/doc/index.html0000644000175000017500000000063712653650144016153 0ustar ellertellert Redirect
The contents you are looking for have moved. You will be redirected to the new location automatically.
gsoap-2.8.28/gsoap/doc/xml-rpc-json/0000755000175000017500000000000012654077575016515 5ustar ellertellertgsoap-2.8.28/gsoap/doc/xml-rpc-json/Doxyfile0000644000175000017500000002334612653650146020221 0ustar ellertellert# Doxyfile 1.3.8 #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- PROJECT_NAME = "XML-RPC & JSON/JSONPath" PROJECT_NUMBER = "2.8 Stable" PROJECT_LOGO = "../GeniviaLogo2_trans_noslogan.png" OUTPUT_DIRECTORY = CREATE_SUBDIRS = NO OUTPUT_LANGUAGE = English USE_WINDOWS_ENCODING = NO BRIEF_MEMBER_DESC = YES REPEAT_BRIEF = YES ABBREVIATE_BRIEF = "The $name class" \ "The $name widget" \ "The $name file" \ is \ provides \ specifies \ contains \ represents \ a \ an \ the ALWAYS_DETAILED_SEC = NO INLINE_INHERITED_MEMB = NO FULL_PATH_NAMES = NO STRIP_FROM_PATH = STRIP_FROM_INC_PATH = SHORT_NAMES = NO JAVADOC_AUTOBRIEF = NO MULTILINE_CPP_IS_BRIEF = NO DETAILS_AT_TOP = NO INHERIT_DOCS = YES DISTRIBUTE_GROUP_DOC = NO TAB_SIZE = 8 ALIASES = OPTIMIZE_OUTPUT_FOR_C = NO OPTIMIZE_OUTPUT_JAVA = NO SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- EXTRACT_ALL = YES EXTRACT_PRIVATE = YES EXTRACT_STATIC = YES EXTRACT_LOCAL_CLASSES = YES EXTRACT_LOCAL_METHODS = NO HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_CLASSES = NO HIDE_FRIEND_COMPOUNDS = NO HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = NO CASE_SENSE_NAMES = NO HIDE_SCOPE_NAMES = NO SHOW_INCLUDE_FILES = YES INLINE_INFO = YES SORT_MEMBER_DOCS = YES SORT_BRIEF_DOCS = NO SORT_BY_SCOPE_NAME = NO GENERATE_TODOLIST = YES GENERATE_TESTLIST = YES GENERATE_BUGLIST = YES GENERATE_DEPRECATEDLIST= YES ENABLED_SECTIONS = MAX_INITIALIZER_LINES = 30 SHOW_USED_FILES = YES #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- QUIET = NO WARNINGS = YES WARN_IF_UNDOCUMENTED = YES WARN_IF_DOC_ERROR = YES WARN_FORMAT = "$file:$line: $text" WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- INPUT = ../../samples/xml-rpc-json/README.md ../../samples/xml-rpc-json/xml-rpc.h ../../samples/xml-rpc-json/xml-rpc-iters.h ../../samples/xml-rpc-json/json.h FILE_PATTERNS = *.c \ *.cc \ *.cxx \ *.cpp \ *.c++ \ *.java \ *.ii \ *.ixx \ *.ipp \ *.i++ \ *.inl \ *.h \ *.hh \ *.hxx \ *.hpp \ *.h++ \ *.idl \ *.odl \ *.cs \ *.php \ *.php3 \ *.inc \ *.m \ *.mm \ *.C \ *.CC \ *.C++ \ *.II \ *.I++ \ *.H \ *.HH \ *.H++ \ *.CS \ *.PHP \ *.PHP3 \ *.M \ *.MM RECURSIVE = NO EXCLUDE = EXCLUDE_SYMLINKS = NO EXCLUDE_PATTERNS = EXAMPLE_PATH = EXAMPLE_PATTERNS = * EXAMPLE_RECURSIVE = NO IMAGE_PATH = INPUT_FILTER = FILTER_PATTERNS = FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- SOURCE_BROWSER = NO INLINE_SOURCES = NO STRIP_CODE_COMMENTS = YES REFERENCED_BY_RELATION = NO REFERENCES_RELATION = NO VERBATIM_HEADERS = NO #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- ALPHABETICAL_INDEX = NO COLS_IN_ALPHA_INDEX = 5 IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- GENERATE_HTML = YES HTML_OUTPUT = html HTML_FILE_EXTENSION = .html HTML_HEADER = "../doxygen_header.html" HTML_FOOTER = "../doxygen_footer.html" HTML_STYLESHEET = HTML_EXTRA_STYLESHEET = "../genivia_content.css" HTML_ALIGN_MEMBERS = YES GENERATE_HTMLHELP = NO CHM_FILE = HHC_LOCATION = GENERATE_CHI = NO BINARY_TOC = NO TOC_EXPAND = NO DISABLE_INDEX = NO ENUM_VALUES_PER_LINE = 4 GENERATE_TREEVIEW = NO TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- GENERATE_LATEX = NO LATEX_OUTPUT = latex LATEX_CMD_NAME = latex MAKEINDEX_CMD_NAME = makeindex COMPACT_LATEX = NO PAPER_TYPE = a4wide EXTRA_PACKAGES = LATEX_HEADER = PDF_HYPERLINKS = NO USE_PDFLATEX = NO LATEX_BATCHMODE = NO LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- GENERATE_RTF = NO RTF_OUTPUT = rtf COMPACT_RTF = NO RTF_HYPERLINKS = NO RTF_STYLESHEET_FILE = RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- GENERATE_MAN = NO MAN_OUTPUT = man MAN_EXTENSION = .3 MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- GENERATE_XML = NO XML_OUTPUT = xml XML_SCHEMA = XML_DTD = XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- GENERATE_PERLMOD = NO PERLMOD_LATEX = NO PERLMOD_PRETTY = YES PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- ENABLE_PREPROCESSING = YES MACRO_EXPANSION = NO EXPAND_ONLY_PREDEF = NO SEARCH_INCLUDES = YES INCLUDE_PATH = INCLUDE_FILE_PATTERNS = PREDEFINED = EXPAND_AS_DEFINED = SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- TAGFILES = GENERATE_TAGFILE = ALLEXTERNALS = NO EXTERNAL_GROUPS = YES PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- CLASS_DIAGRAMS = NO HIDE_UNDOC_RELATIONS = YES HAVE_DOT = YES CLASS_GRAPH = YES COLLABORATION_GRAPH = YES UML_LOOK = NO TEMPLATE_RELATIONS = NO INCLUDE_GRAPH = YES INCLUDED_BY_GRAPH = YES CALL_GRAPH = NO GRAPHICAL_HIERARCHY = YES DOT_IMAGE_FORMAT = png DOT_PATH = /usr/local/bin DOTFILE_DIRS = MAX_DOT_GRAPH_WIDTH = 1024 MAX_DOT_GRAPH_HEIGHT = 1024 MAX_DOT_GRAPH_DEPTH = 1000 GENERATE_LEGEND = YES DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- SEARCHENGINE = NO gsoap-2.8.28/gsoap/doc/wsse-lite/0000755000175000017500000000000012654077575016100 5ustar ellertellertgsoap-2.8.28/gsoap/doc/wsse-lite/Doxyfile0000644000175000017500000002313712653650146017602 0ustar ellertellert# Doxyfile 1.3.8 #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- PROJECT_NAME = "WS-Security Lite" PROJECT_NUMBER = "2.8 Stable" PROJECT_LOGO = "../GeniviaLogo2_trans_noslogan.png" OUTPUT_DIRECTORY = CREATE_SUBDIRS = NO OUTPUT_LANGUAGE = English USE_WINDOWS_ENCODING = NO BRIEF_MEMBER_DESC = YES REPEAT_BRIEF = YES ABBREVIATE_BRIEF = "The $name class" \ "The $name widget" \ "The $name file" \ is \ provides \ specifies \ contains \ represents \ a \ an \ the ALWAYS_DETAILED_SEC = NO INLINE_INHERITED_MEMB = NO FULL_PATH_NAMES = NO STRIP_FROM_PATH = STRIP_FROM_INC_PATH = SHORT_NAMES = NO JAVADOC_AUTOBRIEF = NO MULTILINE_CPP_IS_BRIEF = NO DETAILS_AT_TOP = NO INHERIT_DOCS = YES DISTRIBUTE_GROUP_DOC = NO TAB_SIZE = 8 ALIASES = OPTIMIZE_OUTPUT_FOR_C = NO OPTIMIZE_OUTPUT_JAVA = NO SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- EXTRACT_ALL = YES EXTRACT_PRIVATE = YES EXTRACT_STATIC = YES EXTRACT_LOCAL_CLASSES = YES EXTRACT_LOCAL_METHODS = NO HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_CLASSES = NO HIDE_FRIEND_COMPOUNDS = NO HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = NO CASE_SENSE_NAMES = NO HIDE_SCOPE_NAMES = NO SHOW_INCLUDE_FILES = YES INLINE_INFO = YES SORT_MEMBER_DOCS = YES SORT_BRIEF_DOCS = NO SORT_BY_SCOPE_NAME = NO GENERATE_TODOLIST = YES GENERATE_TESTLIST = YES GENERATE_BUGLIST = YES GENERATE_DEPRECATEDLIST= YES ENABLED_SECTIONS = MAX_INITIALIZER_LINES = 30 SHOW_USED_FILES = YES #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- QUIET = NO WARNINGS = YES WARN_IF_UNDOCUMENTED = YES WARN_IF_DOC_ERROR = YES WARN_FORMAT = "$file:$line: $text" WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- INPUT = ../../plugin/wsseapi-lite.h ../../plugin/wsseapi-lite.c ../../import/wsse.h FILE_PATTERNS = *.c \ *.cc \ *.cxx \ *.cpp \ *.c++ \ *.java \ *.ii \ *.ixx \ *.ipp \ *.i++ \ *.inl \ *.h \ *.hh \ *.hxx \ *.hpp \ *.h++ \ *.idl \ *.odl \ *.cs \ *.php \ *.php3 \ *.inc \ *.m \ *.mm \ *.C \ *.CC \ *.C++ \ *.II \ *.I++ \ *.H \ *.HH \ *.H++ \ *.CS \ *.PHP \ *.PHP3 \ *.M \ *.MM RECURSIVE = NO EXCLUDE = EXCLUDE_SYMLINKS = NO EXCLUDE_PATTERNS = EXAMPLE_PATH = EXAMPLE_PATTERNS = * EXAMPLE_RECURSIVE = NO IMAGE_PATH = INPUT_FILTER = FILTER_PATTERNS = FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- SOURCE_BROWSER = NO INLINE_SOURCES = NO STRIP_CODE_COMMENTS = YES REFERENCED_BY_RELATION = NO REFERENCES_RELATION = NO VERBATIM_HEADERS = NO #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- ALPHABETICAL_INDEX = NO COLS_IN_ALPHA_INDEX = 5 IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- GENERATE_HTML = YES HTML_OUTPUT = html HTML_FILE_EXTENSION = .html HTML_HEADER = ../doxygen_header.html HTML_FOOTER = ../doxygen_footer.html HTML_STYLESHEET = HTML_ALIGN_MEMBERS = YES GENERATE_HTMLHELP = NO CHM_FILE = HHC_LOCATION = GENERATE_CHI = NO BINARY_TOC = NO TOC_EXPAND = NO DISABLE_INDEX = NO ENUM_VALUES_PER_LINE = 4 GENERATE_TREEVIEW = NO TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- GENERATE_LATEX = NO LATEX_OUTPUT = latex LATEX_CMD_NAME = latex MAKEINDEX_CMD_NAME = makeindex COMPACT_LATEX = NO PAPER_TYPE = a4wide EXTRA_PACKAGES = LATEX_HEADER = PDF_HYPERLINKS = NO USE_PDFLATEX = NO LATEX_BATCHMODE = NO LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- GENERATE_RTF = NO RTF_OUTPUT = rtf COMPACT_RTF = NO RTF_HYPERLINKS = NO RTF_STYLESHEET_FILE = RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- GENERATE_MAN = NO MAN_OUTPUT = man MAN_EXTENSION = .3 MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- GENERATE_XML = NO XML_OUTPUT = xml XML_SCHEMA = XML_DTD = XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- GENERATE_PERLMOD = NO PERLMOD_LATEX = NO PERLMOD_PRETTY = YES PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- ENABLE_PREPROCESSING = YES MACRO_EXPANSION = NO EXPAND_ONLY_PREDEF = NO SEARCH_INCLUDES = YES INCLUDE_PATH = INCLUDE_FILE_PATTERNS = PREDEFINED = EXPAND_AS_DEFINED = SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- TAGFILES = GENERATE_TAGFILE = ALLEXTERNALS = NO EXTERNAL_GROUPS = YES PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- CLASS_DIAGRAMS = NO HIDE_UNDOC_RELATIONS = YES HAVE_DOT = YES CLASS_GRAPH = YES COLLABORATION_GRAPH = YES UML_LOOK = NO TEMPLATE_RELATIONS = NO INCLUDE_GRAPH = YES INCLUDED_BY_GRAPH = YES CALL_GRAPH = NO GRAPHICAL_HIERARCHY = YES DOT_IMAGE_FORMAT = png DOT_PATH = /usr/local/bin DOTFILE_DIRS = MAX_DOT_GRAPH_WIDTH = 1024 MAX_DOT_GRAPH_HEIGHT = 1024 MAX_DOT_GRAPH_DEPTH = 1000 GENERATE_LEGEND = YES DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- SEARCHENGINE = NO gsoap-2.8.28/gsoap/doc/wininet/0000755000175000017500000000000012654077574015640 5ustar ellertellertgsoap-2.8.28/gsoap/doc/wininet/Doxyfile0000644000175000017500000002313612653650144017340 0ustar ellertellert# Doxyfile 1.3.8 #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- PROJECT_NAME = "WinInet Plugin" PROJECT_NUMBER = "2.8 Stable" PROJECT_LOGO = "../GeniviaLogo2_trans_noslogan.png" OUTPUT_DIRECTORY = CREATE_SUBDIRS = NO OUTPUT_LANGUAGE = English USE_WINDOWS_ENCODING = NO BRIEF_MEMBER_DESC = YES REPEAT_BRIEF = YES ABBREVIATE_BRIEF = "The $name class" \ "The $name widget" \ "The $name file" \ is \ provides \ specifies \ contains \ represents \ a \ an \ the ALWAYS_DETAILED_SEC = NO INLINE_INHERITED_MEMB = NO FULL_PATH_NAMES = NO STRIP_FROM_PATH = STRIP_FROM_INC_PATH = SHORT_NAMES = NO JAVADOC_AUTOBRIEF = NO MULTILINE_CPP_IS_BRIEF = NO DETAILS_AT_TOP = NO INHERIT_DOCS = YES DISTRIBUTE_GROUP_DOC = NO TAB_SIZE = 8 ALIASES = OPTIMIZE_OUTPUT_FOR_C = NO OPTIMIZE_OUTPUT_JAVA = NO SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- EXTRACT_ALL = YES EXTRACT_PRIVATE = YES EXTRACT_STATIC = YES EXTRACT_LOCAL_CLASSES = YES EXTRACT_LOCAL_METHODS = NO HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_CLASSES = NO HIDE_FRIEND_COMPOUNDS = NO HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = NO CASE_SENSE_NAMES = NO HIDE_SCOPE_NAMES = NO SHOW_INCLUDE_FILES = YES INLINE_INFO = YES SORT_MEMBER_DOCS = YES SORT_BRIEF_DOCS = NO SORT_BY_SCOPE_NAME = NO GENERATE_TODOLIST = YES GENERATE_TESTLIST = YES GENERATE_BUGLIST = YES GENERATE_DEPRECATEDLIST= YES ENABLED_SECTIONS = MAX_INITIALIZER_LINES = 30 SHOW_USED_FILES = YES #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- QUIET = NO WARNINGS = YES WARN_IF_UNDOCUMENTED = YES WARN_IF_DOC_ERROR = YES WARN_FORMAT = "$file:$line: $text" WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- INPUT = ../../mod_gsoap/gsoap_win/wininet/README.md ../../mod_gsoap/gsoap_win/wininet FILE_PATTERNS = *.c \ *.cc \ *.cxx \ *.cpp \ *.c++ \ *.java \ *.ii \ *.ixx \ *.ipp \ *.i++ \ *.inl \ *.h \ *.hh \ *.hxx \ *.hpp \ *.h++ \ *.idl \ *.odl \ *.cs \ *.php \ *.php3 \ *.inc \ *.m \ *.mm \ *.C \ *.CC \ *.C++ \ *.II \ *.I++ \ *.H \ *.HH \ *.H++ \ *.CS \ *.PHP \ *.PHP3 \ *.M \ *.MM RECURSIVE = NO EXCLUDE = EXCLUDE_SYMLINKS = NO EXCLUDE_PATTERNS = EXAMPLE_PATH = EXAMPLE_PATTERNS = * EXAMPLE_RECURSIVE = NO IMAGE_PATH = INPUT_FILTER = FILTER_PATTERNS = FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- SOURCE_BROWSER = NO INLINE_SOURCES = NO STRIP_CODE_COMMENTS = YES REFERENCED_BY_RELATION = NO REFERENCES_RELATION = NO VERBATIM_HEADERS = NO #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- ALPHABETICAL_INDEX = NO COLS_IN_ALPHA_INDEX = 5 IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- GENERATE_HTML = YES HTML_OUTPUT = html HTML_FILE_EXTENSION = .html HTML_HEADER = ../doxygen_header.html HTML_FOOTER = ../doxygen_footer.html HTML_STYLESHEET = HTML_ALIGN_MEMBERS = YES GENERATE_HTMLHELP = NO CHM_FILE = HHC_LOCATION = GENERATE_CHI = NO BINARY_TOC = NO TOC_EXPAND = NO DISABLE_INDEX = NO ENUM_VALUES_PER_LINE = 4 GENERATE_TREEVIEW = NO TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- GENERATE_LATEX = NO LATEX_OUTPUT = latex LATEX_CMD_NAME = latex MAKEINDEX_CMD_NAME = makeindex COMPACT_LATEX = NO PAPER_TYPE = a4wide EXTRA_PACKAGES = LATEX_HEADER = PDF_HYPERLINKS = NO USE_PDFLATEX = NO LATEX_BATCHMODE = NO LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- GENERATE_RTF = NO RTF_OUTPUT = rtf COMPACT_RTF = NO RTF_HYPERLINKS = NO RTF_STYLESHEET_FILE = RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- GENERATE_MAN = NO MAN_OUTPUT = man MAN_EXTENSION = .3 MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- GENERATE_XML = NO XML_OUTPUT = xml XML_SCHEMA = XML_DTD = XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- GENERATE_PERLMOD = NO PERLMOD_LATEX = NO PERLMOD_PRETTY = YES PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- ENABLE_PREPROCESSING = YES MACRO_EXPANSION = NO EXPAND_ONLY_PREDEF = NO SEARCH_INCLUDES = YES INCLUDE_PATH = INCLUDE_FILE_PATTERNS = PREDEFINED = EXPAND_AS_DEFINED = SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- TAGFILES = GENERATE_TAGFILE = ALLEXTERNALS = NO EXTERNAL_GROUPS = YES PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- CLASS_DIAGRAMS = NO HIDE_UNDOC_RELATIONS = YES HAVE_DOT = YES CLASS_GRAPH = YES COLLABORATION_GRAPH = YES UML_LOOK = NO TEMPLATE_RELATIONS = NO INCLUDE_GRAPH = YES INCLUDED_BY_GRAPH = YES CALL_GRAPH = NO GRAPHICAL_HIERARCHY = YES DOT_IMAGE_FORMAT = png DOT_PATH = /usr/local/bin DOTFILE_DIRS = MAX_DOT_GRAPH_WIDTH = 1024 MAX_DOT_GRAPH_HEIGHT = 1024 MAX_DOT_GRAPH_DEPTH = 1000 GENERATE_LEGEND = YES DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- SEARCHENGINE = NO gsoap-2.8.28/gsoap/doc/soapdoc2.pdf0000644000175000017500000374724312653650144016401 0ustar ellertellert%PDF-1.4 % 3 0 obj << /Length 1102 /Filter /FlateDecode >> stream xX[s8~6xH&9GR&B;ˋ>}>O>=~M-\g2 Beh*t"\X 9'%pGgÖ$'W5|`3ΩaYRBjXߴ0"/`(4{sHۖ7c? ‚T2+NEkhq{aֶ/eӌzܖѶ-T&+FjrQ  GM̸Rd̪_)E;mKGb%H?K.s 1T1VpBE P=m$P1K-ª2–+B:Am)gJF8x΄Fư䬯› BIGh^hn(wc vc\*hEX|b}L<"U?4ȑ[V'uץ"Qrn^}=>fO`:⚪G(pwJ %""B0| 84ru#%G&AlA8Uj+U:Q!YRL?a~;@ߦY_ UN*#by>ö&m)aJ>V!H03Ag׉` NF=wYD;=B,ob'jh0,-i?fU3㪃|0#ca+c3V|X}7rz~R wC̆.]; 㱪>{T<(&q^_Ao,aw%K ]t2dU-&EL8۔8R=Y'_<2 Y'jeBPFZQJ1Su9`B@?9E i"^_V[sGK$0d_!rAB//MAJQ'ity n׉*_u<&pi@k}xb?#2PEx7BOk:WvпH7eLo30i7ifi;t!|y'?B2sˬ$FAO:K ud JGj҇{_ݏ;k endstream endobj 2 0 obj << /Type /Page /Contents 3 0 R /Resources 1 0 R /MediaBox [0 0 612 792] /Parent 22 0 R >> endobj 1 0 obj << /Font << /F16 6 0 R /F17 9 0 R /F26 12 0 R /F28 15 0 R /F29 18 0 R /F8 21 0 R >> /ProcSet [ /PDF /Text ] >> endobj 25 0 obj << /Length 1572 /Filter /FlateDecode >> stream xZrH+DcSUVTM͢G1SP n@,gW2^$FM 8ϽFo{^Q^D{"O=_p#^_8IB*-IwC:^UG/Ht¸sE0i qnP:(}eCt *sD4L<jNs^]eMc $+m wW܇ґ2ötpQ. )s ?is2tӗyuGe:Skfcʰ҄&^"J!<,\'ϻpxs-q!PBɾNdŲ\ɶg0 ?צe5L bg7 kg[Pb 减+ *MAJcV5[teI@xZϐA L YYċ2d2鉻OrhJcKnm6T>4ؤ;r\A˒? Տ[BHkQU W(]t}}; +a׈:7މA ۗ9xlQڦ uux Qwdd[ίODaVX< \nuݑM<39DSr62ГG#tUYz&4 ͠bVg̅J}z&f5@g9OܵD4ll+m"; ZzoeU*k5pՉ𮢽ptEZAy~(ksPĜs|w;qk`r(L$+*WouW.pR1 X]&MJ6m /|f?e3rNƼ L^=ǝ9XM-zₓBF/>֜AmX7U|Pj P_ ߪT.=0!Oue*HfKᙷplrxU;k. MWTV'xAhe MҒXv pJ5TEe9=Hi_k٨m׶ͫEoq7A> aGĆ?ʮ4od' !U؎yWD^JKO~=^@Ͽǀv9 35<'†CMѩ0hL;W0Z,*ED$H/=:lk5ޖ Წi+.pfh.CS90{غ,XΐeWO8Z"1%竨-'̯-7#Ʃ endstream endobj 24 0 obj << /Type /Page /Contents 25 0 R /Resources 23 0 R /MediaBox [0 0 612 792] /Parent 22 0 R >> endobj 23 0 obj << /Font << /F8 21 0 R /F29 18 0 R >> /ProcSet [ /PDF /Text ] >> endobj 28 0 obj << /Length 1876 /Filter /FlateDecode >> stream xZr6}Wxj\^7Gw|KI=(3T뻋@JL8r[؃g/ы#.+oo4ݓ塷lo4ˑ0't3tsۄ.<^wƋLxW8}g<%='tՃ<)*ip$=(Ȅ+- q£V<9_T)f^^q;]CHy[tc=8ҽ\#8;\xׁJr(ٴxY:V[d~h@K ҽ7I)Wktji:RcŜr0'5 qh׸Vni +/qp+ǟm> "W!h, q/`0RR +/*:ia@jl? .VԂ/b87b͛}ʹoGA$` 5,|PҒBC#9:=}eqXsP,UϵCƓJmc'Vo2Of xn7_n5Lcc5C:er'aTEbW  .ExfljÒ /kꞥqzuTګD9g#ue0`CWI+kJ ˋ>]FqT%K-py7uAҩNR^Q0qSij*X)G6ϧ_0#juif{l Y*|d'Vmi52YIR 9<UŹلߴYRve}_@mMDD⛕Su*]h}84¾n˜B|5.t r@mbY*YwԛB = ֮C=Z%SD´Qfyݦ$NRǙ}P;2  :|YY3 P Vط`Z.k/鮈h >Bw4j]&ӤH&'=RA#Oм m84UA|EwO/e?'\ie C.^4"!bM#`i!WUiJ6Ҕq]z8nLB >T1~9z}WxROe 1ɗW#=ME$IXH^Њg;gGҦg8[&M{ȍp7pC!?(dOZ&.TK7" Ux=z/9 endstream endobj 27 0 obj << /Type /Page /Contents 28 0 R /Resources 26 0 R /MediaBox [0 0 612 792] /Parent 22 0 R >> endobj 26 0 obj << /Font << /F29 18 0 R /F8 21 0 R >> /ProcSet [ /PDF /Text ] >> endobj 31 0 obj << /Length 1524 /Filter /FlateDecode >> stream xZ[sF~ Dȗ4N#ʹ1S e'}\ 8nY;]0߷߹.1scܴ?8|8rm82#¸Z$̢u<9cLu91#QQngsTZ Z}7~ض0>1VPPf*.~"uT[_$nVH^sƱ=s+8THa$ q^["&A-sRD%;'!!Ā=P7U.M)a y `3u}MɫYIF+(|edęrD8 T*ExZ 㻗ӥhvwey{([4Q`$2Qh6 N[tІK1:K-z9?w=je:ޠ%uڎɻ**iuB.w~* L{V<2wI%,*tG%,;N"\P&(1GO'@{=%~ EQsr{.Gr:Gz-LƋFNN=#ZIL٧OT]SnYYe 1mN't-Rqg]NJqZ'_MxA($֜_aѸ1* H=zpq"xh&|VdB/  b@neb׳p%;J5_9RR]ی=.ZR@>jq8FX4vV):wÒp37_\1 ?,o}'/d"h).6BurX]e,dRS2Bl,Zjߥ"Owd Ce ^{,lUpA9O4e8`y3瑵Ȑf`/pg^.Gbx{ ]QID^y(EžBBPQ®Q 'e$jߖjKso(/YeJ׹%lCܢ9i\u&uex2NQ uۑV$⬭75n&Qឿ+SC'ء3Bm8+jGVֶWӔ;#)xv2G=[ zL(O.Mâ"";~P9)չ[AWs<]I1>ȩJ-3 G&Q&> endobj 29 0 obj << /Font << /F8 21 0 R /F29 18 0 R >> /ProcSet [ /PDF /Text ] >> endobj 34 0 obj << /Length 1411 /Filter /FlateDecode >> stream xMwH.aPLē1=},3S>Dtވ^z{oFDO"]OD!#{Oףr/]J+3& NQ窘72]1s5z vU6qw?!N&ڔھ ;-MR#ٯGPQ7\OnNe`oݼt4-M-v:Ot=(ⶨO2J#<橚ӳJtx1[<%h8nF]m6oޠǦdψnbbiWyf|V7.]vKw[Q̠Ai \D\KF)v\oۊ( {F0:k5nU=}<|[V#_ z.|>\S_&f endstream endobj 33 0 obj << /Type /Page /Contents 34 0 R /Resources 32 0 R /MediaBox [0 0 612 792] /Parent 22 0 R >> endobj 32 0 obj << /Font << /F29 18 0 R /F8 21 0 R >> /ProcSet [ /PDF /Text ] >> endobj 37 0 obj << /Length 1760 /Filter /FlateDecode >> stream xZr6}WhDMG2hqƎ=Zwzy$ZƘ"5bwRM&-=h gw.x4zspN܏]wC ݸz3鰸NﺁlLH8'8pYd(d9=$;e^?N}OD>|ΝYGNY9T9ꑎuM]xl}ξȳHv\\l`,zTL_)5p7 _ l $>s 91 B7\(@3굕c}!FQyby*opcgË.KM۱*IqNK[bc+} w^XP܄*m؈ A*PBe9q$ pBY{i{88!x`o跮~C'R7 =tG}<9P3 pn&L,]Zr2 aR( ϨGjjE'3Py |L CQ3hmЛDn7 {Tf VwxKƄ!ƨ_;Ʈm" ̄?O8`HfhfWpӱ(o4khUV)<'.8L=i :)~K<2 &9qj}~٫-jhvjFTL #-d{dmz WZ6k(V X}oVwr[n :o "xB*+Ԓβ߀t, 0k&i|z{"6St9 63vjaԪ& َjzT MR(V]N5L|ՀIlF]'"ƅuG+MX9JTUTωU6 ׅK>߁Շn_Fq?!7FoqW endstream endobj 36 0 obj << /Type /Page /Contents 37 0 R /Resources 35 0 R /MediaBox [0 0 612 792] /Parent 22 0 R >> endobj 35 0 obj << /Font << /F29 18 0 R /F8 21 0 R >> /ProcSet [ /PDF /Text ] >> endobj 40 0 obj << /Length 879 /Filter /FlateDecode >> stream x՘]s@+I! 3j>:fQfr APŊ22iFv>FXғ> cXb _l,=;.!!Ḕ2{`{n2I=3uBM]jXv5I5LQ{=*YR9!80)É f:O!r1*<% +KV!I ?En0qGұph.RKC1{ jP I?(Go!~~4ȳ`4R8苿!(PPm1h̔%_G_b<˩:GҒxsǕv&S.h*LDd~WPE <3/(AbH|W T?x D#Y_Ϋ*JӴRٲZfj!b';XX!_ss6@4/QA CU+a@y|?B:3^y2 @yNk k1jŀ7Z٦PqWצJ,ex *\; K5oz嬱)db눍8xOAc1-جO qmD]`IE?l&: v%khs$K( oa9Kl F#Ӆn IXȓH‹.r)2/śTf j,WQ_Anc#{p >z@܃q`RN&̊ۤ`,/L!nZCn}*&S bTerax w endstream endobj 39 0 obj << /Type /Page /Contents 40 0 R /Resources 38 0 R /MediaBox [0 0 612 792] /Parent 44 0 R >> endobj 38 0 obj << /Font << /F8 21 0 R /F30 43 0 R >> /ProcSet [ /PDF /Text ] >> endobj 47 0 obj << /Length 2994 /Filter /FlateDecode >> stream xڍY[s6~ȣ=eMN;Mf^Eۚʒ+z@:%H$A\>߼~}~ IC?&"Z(?4$^ ]\%Ѣj-f׿=}O`n |X0.Wi,/D2^/3$dg[}&VD\5s݉N0-ee&hd2dPh7]5ڷ F _~|ضUq( 2]EbמUm;n#kP}E,W&TW}9_L߫;Ҿ,nAwqAh=œ?.nuWAe4.B jg +YJ)(K_a$.vBx{qHo7_)ߖYNS;}.EriDpfŢäd?8 DU)' ɤN|# r_{G{Ó+ѝоU]E!5O[ht~Ί(,wbCvU|u8VDVfwΦNhK~F#,vRTtd똜=ᮬ U) R~EކM4UĩIsAy`DzefajJxʘt;c]q~hE.&vTPy`z6|AJf1‚Gf>iĬi.Ķo<{ (v+gT 4a Z3hk+lv ?^%<d@Ӡmj=7axO9ZWbr..*):* eM(<1d{ܺsHѵ=%􃊛g;VCY)2ij;4{Lg]Jbm͙@1&pZ  _2&\l;UɹB~Uu&to?0BD^^e3c |W]_ƈD¤^B%~8"SL12%!m}_셌cIMZ/Yף7Q?x8`/'zCPl %qd"x`j!"//ʂ=vg*UGˬ<8]wZ8YÆO([7 3e; <4 cޝm)sl*>!GD,8@I8r lx =CMs.B.YotkV /`ákhNYSĻ#{vw1V`zcX)ۏEQЇ^3{ â'!My%vHs:f G@ n!PWҜkW1.J$LaXCfI7T:qV1iNC<^bY}(J␰i{oF"2Ne9}CwqN1F2#m%'"0iNC넃EXy=P4-bJVw;"we#N4wxy~~`Fl:X$ąZ]?{ns)fs<|2s/2.4{,|ajJ׋^7v EFbQhT&i?a-fqi Yu{ɾj0q 5F9 6psn'IѮs@; ke0Zw;YobxX0pZ-4%r.'S}hx+Dw[xQ'+hR2PtBʯ$L%XblNA!==Dy))HAU)B.yo\$,!b㘆k{WOO6[e*֟~Z?{SpoY.r%AN2 P*YbAWTWՎG(Si/"I9hOgƕ$u6R :% &osClEٟ}Яϊ;E7`ϻ qZkjcJd|-\u9<ˋ&ܵ4B '+ Mk[6n)lMi|Qr#%݋b{Mm ԼK ӫ8@C0\l',.]=׫3ôtSܾ4LpyC`T] é ķA7ta0pJoAn,wt$Z!a~nmrc!O${<rB΅s|T8HXYZDp[< N?jY:# pD陨)!Nj_~v%Ɩ?~ 7I>C9ά,)2'EY:ʌ[ͦA(A\]Ex`5+ endstream endobj 46 0 obj << /Type /Page /Contents 47 0 R /Resources 45 0 R /MediaBox [0 0 612 792] /Parent 44 0 R >> endobj 45 0 obj << /Font << /F28 15 0 R /F8 21 0 R /F32 50 0 R /F33 53 0 R /F35 56 0 R >> /ProcSet [ /PDF /Text ] >> endobj 59 0 obj << /Length 3065 /Filter /FlateDecode >> stream xڭZ[s6~%Ԥ iqgҝ>-qBZ=7x>$NC]Paqux*NU*4~PgC($}qrU""P< +4[U-Ow@lVQ:>Wkz+|]&4ޖJuwPM ƎFy|li$ZBE٠(G]25awY2L׸`U dZ`G~ZnI|>=i"ZX%Ul|CAd; )GeoB rm{?2wLU w h!]/S>Ȥf`\LJi{waC;.)*hyǶKS%$$7$%-@EH]?/oXH.k,X^.`bc2-FG9;W=. [ݝz.7jX(3*+\ D^V`!%mkJ6ia .hj:i$Ɔ6ޗNRm3_eQr dWJ6" V (f(iĔnQh9\ 2/e)f@q„ˮj]`jWLGθ pnz_Hɑݜ:I~+`슧o,v侰g# jo c=WYB= 6M=#.3HqH~ܠ<87ؖ"UIJ}9Gͳlw .@75#so$s5e7p<~wfH6'LDq^0KX09쪢ݔ#asxM[-Y&R޸F% eց:v#A#crb \@p 0-#7HBi Oc͎4t~fnԔ:%Vz}P婙Y&5uyc[Tf/">QSҌ'hVB%2*qfA!"x/Mxs0tEs/ +gK)t|tUOM㦤;| פr@|k ![aBTǯyK{Q-1M0I j8#XjT|oWN]R΢yEDOpGC4]M.u|%Fb,&)Y&!/xp4ug tdR)|.1y,і@UX>: %ʬ(^mhÙz3ܲH)D\-?(R*뭐g~ԐZ%~Wi܊?5ۣTsJaR"-z){Y)b9y]Ho^أ>#Ç㛯}Fq C"ӗ|{T[,ZLK),,|o;k[RqGs[!Y?YBBܤ x-9l(SXП t']sC}H&ő~c5Pukl7xqur 1-soB)B[,d^Qg`Ycb-.?' |͏ endstream endobj 58 0 obj << /Type /Page /Contents 59 0 R /Resources 57 0 R /MediaBox [0 0 612 792] /Parent 44 0 R >> endobj 57 0 obj << /Font << /F32 50 0 R /F8 21 0 R /F35 56 0 R /F33 53 0 R /F28 15 0 R >> /ProcSet [ /PDF /Text ] >> endobj 62 0 obj << /Length 2929 /Filter /FlateDecode >> stream xڽZ[o~܇rao)Z qb@h@-]:\rJV~}mȡu胰s3C}wMz*D_$~|\aSþ\YW0ȼU=w>@IȿEuaڸ'1-矮3/z}+9 t§6Wmj$29ig/ b~Cu ~מ`~Ws b*21)лGAtxnyD*B-M^o4cViwܑmHfXdT|]^՝HI61/< (^ 7#jåv98;O%QG)eng(=}D݅v'A B[]5T\@ w_Ip+'ŏdfc4rAjijQ yAi"\ Leqvdu]?>ZO,в@1}oS$?Eᠻx˃ނ](⹻=R5<>K=v PY9<8XzHuze<-Ð.[`$NT4) g ֭pTG؎GR#YңږMPכ,=vE=gXF#J!QpЙEY}g/eg/ʤVpejحZ$%!AƏg[4 l6*p&~a.-15, 1@,DS%K'(#A.YQB~OR8 fZ/ ҂Zв\5ņ |ac; 'I2^߾knSLK  E'qz?J~dIϑau0͏H\t`Y~=Vf@KxI/A}Vq1^{D'@!Ʉu|]«cςITXRMXØPX4ǡw|jap?IVbMrYgxYyb0=HSKDZ /p8c%FiJCd36D1V2aM?U)<6nжO>VwH#DjPKDVآ-<շFC%MKא%7S!S넌8͉P{QfR[ˆ$v]:.ct:87ƚE\as{$mFH||ؖ SzKrFGֈ*:"T} Jg;qFgC@<tzMsh*{^g1{s6k)سPWəT%v9*XWB~)m4Y.>NLb6#I#[&[D3}v\F ć0Qj јY,?!f5?.SP2t`(UF x<6d{: bQ8Tb4R$ pXm@{n (v.f@C\:N*e ș(eJVNH(lQ(ʡ,h,ZT'0΀$fo\zdp/;[&^TDzu%ӺFċFLRFcT_ka}E1 r?pFguj`$\ֶڣ:0e \x;!BeU?%jXQ\/ [ }× WY5WYt/gjBAl9%(O X֊g9%JR{h"ur5zs_)anvI4oG!g:?^U􍫢o\N ѩfJ {tޣ|ԂM&4ܸKDjy=O=aCp F/"''/}Ç8]1,b|d̘ F6zX\b#zEPBs07Ȁ -L*߷EDX>'$&iIb%&N);7%.H{72荵JRh9>!Pt{y<2v-ցA Vj7eaF+l6r/\~~/UR%gGdpJ 6wLG!.:[' l^>b&Dbd˳#OOta W^'Lx3g:GA0U54 *j &yvc_ACORw%1a_bx,@/A`z;U{ endstream endobj 61 0 obj << /Type /Page /Contents 62 0 R /Resources 60 0 R /MediaBox [0 0 612 792] /Parent 44 0 R >> endobj 60 0 obj << /Font << /F8 21 0 R /F35 56 0 R /F11 65 0 R /F33 53 0 R /F29 18 0 R /F38 68 0 R /F32 50 0 R >> /ProcSet [ /PDF /Text ] >> endobj 71 0 obj << /Length 3235 /Filter /FlateDecode >> stream xnF_!bNf&C2I&`X,䁦(E*$5CbUuUu]7Wx$ԫn%D("xF6_tS旿m`Z(?Y>P#IpcAYd旞\7rp^[\g\p#`!OXv'y/yR~B\H JF$R$~毶 _$^2IV %8o=*FȾ&)H$ @ k 0o&2kWY}H"cesJ-XY>Gu{:SYXiuEY3T܋9Rğp!'2GB'_BBɁSP)#E Dyxh0`PqPb[s3"E* PIVPyH(9Gy@[C_BIUoX  s?:mj<4zdWWl[R;ygux/Γ>5!528 k3YFBEE53Zg5:^:VMݞ (]|"ǂjvIo`&b}7opHXG.@Y[cdK;nGi4gL_1q(a$=gN%~QCrtZqP nQ/^: F늃 }mQ-"t~6敷jd~^.H"Ҍh0%䅾1liAjRF >%Ga1MxF8 $+>OY>@K"Uhړn!ȅ\dHu$Ҳ̷C"扣{ 2H$<(R72#QA`xa*k 葕E^J(|Glb quV{èW[ :ݫ;\yU|,Jس~\J" \F0V(xz (6c3$>?h}9/:qoNcreͫ5zc?K9wE+j,xtUm߭R22y } }mͳU>RȵYcyv58}BEVt%}x$g%fwl,EmBmOHycH#"?G }-smH+ #PP&gMx}3TMB'Om[Q˭eOq@_wpð 0롂'Y卐-) f:sHش?qB#IˆU7]ゾupPu$\ haq"LD_hqy#dMjDm7hJ 姽6>+0ϴ[`lnƇihe˭֞>d6 ȕM;5j)=K JN@.{~mQwFepn'c3#hMĭ\&f5[G[/T\ d3.i TSߕAdf,K[9Ek9뎛\56Kd fmض@q_R|𬲎p\8 v8ztm(\pozi&'v)]y+D7m6=~5_*a a9.Pc +ijy19tBjz Yosc I[ 8Ķsb|~)]:fzP&ϷخUre <(6ju HQ8\KH  a[ U߆&_{Qm?mt&A>,s6wA7pȱ#E}r/ODíMͿ |cfdbD?py#d G% cfts/ppQ:(>+M # Wڧ~wO+LJ`|w%q%N;%4n򅙯F˦ ΄Y1o](y)xk{͎Ϸ[Z+ll?`ࠌ?/|>H^-f`Vr&DD<\jU6/C1'$|mnIKS w J(qJ@(661pYdd\y/(3̪ﴨZos!6G^=$V0*טlcĆ$ΈMP8=3] /nEE/_x7O}^=L'ѵTT7Uć;+v,Ib+A= -#>@ofaȁ?/F 3gG+jXUO>^|y%[Be8yhrH "@ߝ WlKo\^ZpWym}jBnfP M@ .V,n endstream endobj 70 0 obj << /Type /Page /Contents 71 0 R /Resources 69 0 R /MediaBox [0 0 612 792] /Parent 44 0 R >> endobj 69 0 obj << /Font << /F38 68 0 R /F35 56 0 R /F33 53 0 R /F32 50 0 R /F8 21 0 R /F28 15 0 R >> /ProcSet [ /PDF /Text ] >> endobj 74 0 obj << /Length 2732 /Filter /FlateDecode >> stream xZo¸[3"-޶w} p-VbHK Op8Cyssq.]@eA]$f B|h,Hfm DJ/k8A+x$i?#;4ٲ{m˼3>ǣmLGvy?Te@ڢFBaףt@0hedʄkj;QlTEGwQ?|\Ykݴ\ rźDIy_6lM+o Y;YVNp0O)WZ,]{DJ~iL=8.F_~ ˀ oh#} SWWG\=%fs[Z9jdZtZߕb*(~j8:Raj .@ zM`F]w.~)Xl.wY88P: 4_?<\'3XTy75*b/S zyM0H^+Q f7Pha׿" UBV&QF37='=8BN\;12w1<1vL\ X=ڀAؓ>> Dm !'G'`!P:8.  u2 sA{#-^0Y WT{E;¸x{ŒeSu|.?d8 (0n$$MU5!Ozᕏ8qY>rl&$I<MtS?T@((y6N'i qz ϛ%v4xU0(NfI\3$4\IDހOT!8;x ;Go FHUy~: ",RA>b{yZ4;=HЖ~D ͇W:w;U0W@8SaNBW+\69"\6% KG%?6Bg.o<* 8GN#[X%_!c$g ۾ˈ#AZek첱w$Qe_ 򝩙rK$,HE m)Bo-*sdv;/:W59A=&g{bvםdOd_Rs6GRnLq`t:RBggq"w=E<ԧ7yKl/Ԑ=}B<s͟ǡgR(s}78 Tk5`6m`\Bݥe3',YEu[6! BAjТSS #iݠ)ɫB!Š=zĢ86ŽagM\c$P^68*iX[)#vWֲݹm]Жd(jښ;$GaΔT><3s)*n̮:}?-%ஷ|>7a {|\H8]ea7u Ev['sq8%Nͺ,T8}-;RyPΞGN-_z '{I׋JZ?z9LB:'7M/O"Xl?KnN/e;?n3%ţu3Wh֬-哚$?ͩ%iWh\1Tc ܷꜭU#knMmNIh3|=kIZStV6U64fVMW}9TvX/|Qs];3OkfSA|W$ndK d暋#` IO/!NAГ+9'L[jO<:hf)Ni3g4Gge L3;-@k/QJV*gB zUKw_L5bIqFpv܇f7s@l̇0ɏy؇v}B p)M6i?[v endstream endobj 73 0 obj << /Type /Page /Contents 74 0 R /Resources 72 0 R /MediaBox [0 0 612 792] /Parent 44 0 R >> endobj 72 0 obj << /Font << /F8 21 0 R /F35 56 0 R /F38 68 0 R /F32 50 0 R /F11 65 0 R >> /ProcSet [ /PDF /Text ] >> endobj 77 0 obj << /Length 2484 /Filter /FlateDecode >> stream xڽY[oܸ~dVh 6i]vI+HIc;{.$%4NC也^\r477i*Tob/^ 7ŏΟ?ݾ|#‹ҍGn]wJq~캭tJj`0V{$y+JLҷ37ewO%[zb"E'KsOB pM|[Cu #'J qoOr.$*q>Aݕ+ #n&QM D$*{U@d];2ձ2Mn4 l*F +IʡEǾjvZDUUF4dK5lb!xJ_AJW6I2$yDZ'N`zn`]&4YqUv 3*F/Z*ƳR-JہO- @/&~r-iz`X&n v7opf{`&~_ }u$ֶ4 Ac /b@q(7_ɋR$rf !mM#kn"i0.@x߼5 *Q༡L[H"Ng. U3X z >R5%yJl,P.x߹G_Q]sT'u<9h 3.iAGVV|fUS@Yqݶu('eǦ6~~avb:C,sP{" IF8&|3L;lV5(%s ʤ'>A= M՚)x?zm "rĖH5Lb` BrO| ŰYz]\'{Ca|0N=/d Iø8Ș~2S"{yFDUc0z{]=hy B%w7<pz8C9cY\N8׼Jwn+k0M7X>mhɀ=Sum0Ag)&{sBdZkW:IZ*5x/W'M0(~kg+,[ .HֱZkJGb5#%(k1~靣:W.WphѿSI9 #5*+yȡY^YQ 5g-#ּ5) +WY,҂. (;Ò$#iС |빾;SJ '!8g+6H<v$CpD'eROmLQ)tٜNo[&sdCW j+ՊHjCw ^qCng:Ŝ Io ISINf]D3 5gS@Ӗ.ВE:Y3\/ 7eeF'm']cҶ-p=_Rd&3q#f/W+~xb~[gTwZ O'VZE:Bõm$ii*$?m oƒdc_P"MRU_\嚳a?g?`{!s, 'B +]GAKZ+ΠkHi+né d R/ZU&0GY ilCXsI5PGzfpe_Ϳ,mwӑzןL=> endobj 75 0 obj << /Font << /F11 65 0 R /F35 56 0 R /F8 21 0 R /F38 68 0 R /F32 50 0 R >> /ProcSet [ /PDF /Text ] >> endobj 81 0 obj << /Length 2878 /Filter /FlateDecode >> stream xڭr۶_'Ƣ ҩ'wif>@$mqB Il%Igppzy{t&)ͼlv{7KYem񧣛dȩ~u')q8yI ~ӥːۓ4pZ^ءwaRxN5o~SxNxI:'t[}l(UOy*p0#=Tm{o,[Z`)q,@*gd·kK]?:+!8m`\9,K7#N-J9s &2p//=_!x}=TEYW`F e,0\ Gb;^\#w0o:z}{7S3?TnF8ǣ?fő7s,=sUVG꣛,5 {>Xq j8tp4uL){;+Z\EfRnEe6ט{aeKEj sc8Ö5 c:(@j4Kad[ݡB#0}xQҨg4 jIP8 0!ijjqޠ# V9SXBC 4-MIdr ǻ!d>vi۳#.q G1@pry*=Kz ,Pɺ&\#WV6lJNU=o[GkMAD=5$v;k;04X4}{x0&g(wU=3DcW"hר_P\yx :^1iElQ\)7 ^1eM] (`k:EQxxr_r͉,b3F+u ǂjO%֦re/AZ6YE$K (ݿAF@gYMՠǷJ-gy_'Tr>qżElJykdHj 8p5wGZVv9QuUEQwHFp:&N+?r~CK O#3+F΅4^]ߏU7~qサ-Tv}ʵ+;ߛHRg 觎 Rj;=zSa:b"Փ'xG ^*wU0IC;Qm!`f5Vaoa|b>XS*B.`ZX,X3_Iw}@)xdؠ7Y@8s<ɥ21g[6KX" 1%iA`` 2 I|\I]2Uf4FaCQ{ψlH@#s{]?Jd[܋d22`Ay Dۦg1 `8Zд/s|$DXI<L\t"'m' +2To.6&#CR LpMɗ,IJh#\ԃIg 繞.2 n߻etai"n>+)Ts . Y蠼{ti3]塇^} ۗN$\l)!&zxl~BjwAq:Bu.}8R!XNM)X,"5RNQ ʇԝ>;ũ-%q¿kA+2L/ 3y(R^}gX-Lmz*/K9m\ҋhE:FzÂ[M3> endobj 79 0 obj << /Font << /F8 21 0 R /F38 68 0 R /F35 56 0 R /F28 15 0 R /F33 53 0 R /F32 50 0 R >> /ProcSet [ /PDF /Text ] >> endobj 84 0 obj << /Length 2000 /Filter /FlateDecode >> stream xڭXr6}WhR-!;NSL-64dl뻋(Rd\g[ X,v.l=[snȎy 1u~l|--'p\ZGub |%~ZIi/"&Ϫ4!70z)W^9'E߬h3~e5ͮj fԌiJ-\ jh䉖0f\볹=<7R8U@ʁeJ:oPxqM\eeɴ6<.P3(dA-CW)tM^r9+Z٠Njh$ڵ1ݰ lIqIm|+2 PicY_ڨ:^`ܫ#@P)% .V]0aI&'s(бe()u8=Fթ#ZLでl*Pey[rS>>a:'jH p9{4opuv*MVnxB;mgO^zZtp ]A[&$17۸VmsK)iƵ.S-Vp?۩yZIRS& -F?2r`Ӑ` ~~|>Gg$v}&4.d$uJNa(*:/_'I[KjPz;܀NtOBltnZ:{0nK_Yz^ukОY:4Q H3ی3Nsl;.xenTVXYFFJnTafܘct͑bTn]nړie|"7q)ZK&2TTz}2gQ,_0OA[#/LMqP͒Z$GX#6=}RyB? ٤*z<SxB s}hb;}KI~Qa '@N(+FFeG2^>b*@ׯ7Un ZR7`oc#lkPXB"bxRj6Ke ^^\$ՒĆz BD'(O#MRo遍J?jkj6FRdS5#cOXr,(:ކd3ȿ~-lPo#Xw z%H^Di:$Om"} jZS}ѕ)bNƣh~iθ:ӣ~ܳ{p6$I &C>2.`QkmwM_sBٯ#(%o:( L4J5RnT~>r <hՀF5aVtߘ& 3ާ{C?TɆ&$5a= O$o2gTʫk)[jmVj)waH59GAX P!&;4s|{ =O޸+7xl\z!<滢[m.4|Htf=45RXBǣcu]\;ŋD^( rcK6=8s"BUqsa7L=l>N]\6" $uOx)EzjwA!Nt}}]Q-o>QП /^Zʕn\"g/h endstream endobj 83 0 obj << /Type /Page /Contents 84 0 R /Resources 82 0 R /MediaBox [0 0 612 792] /Parent 78 0 R >> endobj 82 0 obj << /Font << /F8 21 0 R /F33 53 0 R /F35 56 0 R /F38 68 0 R /F32 50 0 R >> /ProcSet [ /PDF /Text ] >> endobj 87 0 obj << /Length 3799 /Filter /FlateDecode >> stream xڽ]sF]bŋprJʉcEJ<]$_3Ju/ZzzzzG__}$KMZ`jqeY\vE0/§B8Q0/B ZoO879ߝ^&{x=$?Z }MRA䅡]>,21!Q=LWz&LGt]tooJ- XT!kOoOaWߒ61'MPMw@D=JJ)/"yIt7iu%}񦒷'=2+|*o&<<jlzZyQMvMNӽC|ΧyvƿCvwǒema:Ziy.yS^Sa\0 ˫AfelqX`QoNTXd97e8@8r3AL>0!j9b[L2GкA:Vd@-Li90^dBZ&j<3XwoN/ @];3 dU@uQ1A u@ h:&>BK}P{q2}u78YzKSSmHhKw]z{2dVmxs7uvY}ڭٍL?Z0Pt~^'1:~V'!h9g,gZ#*s2 lʏ&Ԃk5@6>p!m{C/Leq=Hc/Woy9|1DD Ol ^|CAA"+ʚn9K_hؚ&g`8~uvlѢzy^l,]*֠"]XA pk\;x'P<3slR#Wdg,F uP{j 1躝QbL]B ]9;շh "Tqل~$Hq32fh82&WBtyWK[gs_~؏ ?s^~Ƹ3*-4Ŕ@{1sM'E+ICga(& & :4t#ȫ[i{v` (DZ\!9DTztEuNՋ )=%^i@_F$1"LQ9{~>Ѵ֠4$8N j` qd%&%|qbTȋY/AqzpS$$ţM~J<4FH gdʼlI5p{ So2T がtEWc\nyA.) scB3^96% Hye61% O^Q"$0_3Ex)+0*U{I<^CR ;X0зK0rD,*xa)H0GM>wr߫=2ѱDGv-1#aZoJߔnUT# {a[$HH!7K3pؕ0X.|L#Ky|Hjf΄z嫊^Ud3o K[,۬ʮY]!*9 WOv@ףW1kyv235+N.PΪ'p0lV: 2w i[Gv.Ps5Ubv A˝5<1jBswP&G[UQ$XϥQxd[VH 6H;?{[k,+ Z~OKG3nqCۊ?%{`U#FYt3-6 =ck,/Mߞ&!Rsȏq'W)Aܽ,mr#r  BLc4}e#6sWLW4 (}6#/Հ9d3Fjy吝?\OomgD/>肻ot yj]D>@wQKGNOбkI$YőkHМ 7%LllcݠR7Xr6QՖ񣧵ìqׅ Z֒0f^V8N2z42glIeUP 7/m$G@0a;=fjl..3{SI7k!8pi-}A430dohIq۬O~0%KT(Փߘ} 3?8V 'gO#X{R7(==nPs{%V(PgqdV@r[-RiYqm:N]>6|?VF26pݿL}Ӱ.Sߝ GL=.Pֈz_.?Vd_ڿa_f~W % XjO濔նj߰IoSg ,IU-׎P$9N;b`;PBێgy!]p=H>wkBQ貸:-ɈO֚u/֘A5^\‰W|ϤuɎ⓾=3;[tQ2: m endstream endobj 86 0 obj << /Type /Page /Contents 87 0 R /Resources 85 0 R /MediaBox [0 0 612 792] /Parent 78 0 R >> endobj 85 0 obj << /Font << /F38 68 0 R /F35 56 0 R /F30 43 0 R /F8 21 0 R /F33 53 0 R >> /ProcSet [ /PDF /Text ] >> endobj 90 0 obj << /Length 2768 /Filter /FlateDecode >> stream xZYsF~ׯ#0'Gvb,[+eWy_} vUrmJce}v/b+zcK"c:dsYY8Ndv0Х_gi/3{̶8ZC۶8^TgʊXz_+S2'~y,ˏ`U4UddmF)-Mu1-Uhv_I$UN`+Xi1(_ƋA$@6m@(&ް0t(&pu&e&6P,وBJnBD͡'aqV|;ӄp")+鋻3ĜqctQ4: 9{0["^[VpK"`EǔMKc:<^ؐ;`DN:%;,džJ\^[VBTmxPE;dHePxB+?q:Ltv9Tۡ쑐\(9:-a@&d/CΉˇi=^D 7$'<9>& ;Nc+R m4 0 )ؒI'+2`TE( UUZONi~O1@ʨ c-~{R!/-ΠmSaG3,< *i.4^qSGIvs, q+M'Z)gE+C|卋!$a;^=b*0?gV5X'A)W{kފ=&epkVk^9W%4낉;ags8pKavyEO~"ćpyMEl'g  ZG[ڝdLXVĽn0J9x FS&'6TXQk>d  Xp4eZa;=J'Fq#m^ʐ!Zyn?}8ge)61w$)uR#Eiyn(f. (6eA8j$r:eE? ghOC&JskdU6)WU(t Hg'N\Pt;d 'lu:Jb]I=ʤ&':߬Wcx:u ]7_NLjmUbkK%酪7懕^ >!D$b~DHaJ2o("ڿxZ/G ,h0P17e:y'MQ-'TRT[c1/gaټNYKI Tlw]M4 "8Kg;ckSx)ʏoDyJ?`ip*v?O>}dXYDi0e qDV2+!}ZP2n󓨀j XNX.爛 "r+&vS)t y+@bD )&`ZwTe{MٲEǗ]dp1ViV -/ ]RE~|GpF]1]Gi0ťt X`ۖG}1}IOl_D_/Jm'w_C.՜OYRĈ9>r.\z`)k.c.)#)?w_nѳ $CMUPP>ܝN1E$pݡGB׹8C-ї+=}a]1Y<z؍ N8,e=`WJ+_vI57Wg3n^ ZoK,W;KW& /T۰Hr˔=r'RbD\zWv~1/QH._aɫ5R6$q I.b"JMk2$BVoﯯk.Z`tiC=e3$^$MJvnhJ>+ܓ endstream endobj 89 0 obj << /Type /Page /Contents 90 0 R /Resources 88 0 R /MediaBox [0 0 612 792] /Parent 78 0 R >> endobj 88 0 obj << /Font << /F35 56 0 R /F38 68 0 R /F8 21 0 R /F28 15 0 R /F32 50 0 R /F29 18 0 R /F30 43 0 R >> /ProcSet [ /PDF /Text ] >> endobj 93 0 obj << /Length 2673 /Filter /FlateDecode >> stream xڽYɒ+f m$x4:m"l`Y!hZ;*ƲkId-eݳ?'&^FղޔeMemsr&(%ܯ/Tx*aa0P]?8Sݾ#Zl9Y#j2U$n1S5)q@` 1>b:@̣|t7#g[I;[h0I;(y$7jw,QQ";a;L-UqJ0 jn6|GnY3 q>M(F(POx o7F?))!4N)L'PU a4eZ81lD=0,sf>=wEyN9专 ݱ8j{+<>/8)b#h6 7<7k̠ʹMzd)G̘5!šG?t<ѐq7wb "}HJ $/On[%q'7fyE)K2=̂iTT}߄JW7 >\}ۭi$UrɆ#vEмr@ipṯ~›]]زyoۯƻ.[Ri!ؗ-vrvl:76dV-‡z{=g{4.lF&U/>*."8E76ҝUCt S fq„;=J,:,7|2ꘝaA1=<r5Ќ ʈыQ@ZT !^rё:eF3UX@hюF:{To XFUȜnRA{ΥBhN x|fc8T 'WL!Z>UЭm ӠV!>_t )EdA,f$2_cue5m&8;Ny?Ş#l U}o|}O}dУ:ܓw>>R}1W#=^2[4۟?Ut#EzR#1R-)L$*ޛ@ܸf - WiakAh Ha29*g>{!WXНQ䖴ͩJ񙊱-n"RC%q$j.@wLfͣYeKx"F1w/Tz/L)g1I/PeDoƧOvNJ>-U+Koy;L#NCԗ$#Y}ݢxJnQV"K)pM1%XMbWqg"ҋ{ȮgWfkWYCx=Gebߞf]1ܺDCO.J Nio {EۄPLOVUi2L!O*9FE?-CPH/m dLkzS]ׁθ DR9xr,gc('9 #zyq՟kpVN@Y{D?No7jGH,KnS~{o' endstream endobj 92 0 obj << /Type /Page /Contents 93 0 R /Resources 91 0 R /MediaBox [0 0 612 792] /Parent 78 0 R >> endobj 91 0 obj << /Font << /F32 50 0 R /F8 21 0 R /F35 56 0 R /F38 68 0 R /F29 18 0 R >> /ProcSet [ /PDF /Text ] >> endobj 96 0 obj << /Length 2700 /Filter /FlateDecode >> stream xڽYYsF~ׯ` #ΛLet8ÈHT@ j1DT'OM+7,'q,ПDn"\_NgwWF/_.ĽfҖa"Sz:N6yR:iUEvt{#w;a~b=OFU-Lܔ(KgYNgp&e8uDJkޜo*qLYyYlYn/ܢ Lz"|ƻ"gB¢gUUvZ2Y, `ƩnP 4L]R3N pKk:AUnŪĽUF7yOsYP#`'@Y|pEM W }/ v._V1 'y$I'šи{mA-!Oh)ܓCId] sigJ)FD ÿo싂/j}KdYb3Ȏ8/"Eß;!ۼ-@P&/v0Xn/3,6̐UE5/O5x%0m_튧؂Zi% ,bbE:FN!d!lDɆ: v=1-X4~T"F5̩iՀG!5b}2f;cnrCd66X&0ɀ , 9*"0(<1A`ר ΜΦ #>uP$×,V$(^zF:dNmB@v%G Y]n`1 I|*لF!DxD}+ aE/ df,<4ے;AWCl.,HjY.YQ\> o(8j q式  <" ?/\Tziff.45%g+ɟǮvYNGm25p7|x goxHjZJE=7Cr""F[2H)DPz<es!zJЗ"69-̯mqaoZ,@BDcm2 ĩ׃7^8_S]߼zw-<\=\9?~كLJn =-p 2koW^#ە۫i9w9{xwwusST/Qa25h y@Y~^F7%d 첦dE!0'er鰚{x3ܤL;HYIYskhP"y5l˓+ u3&>;L*> Ag$`k*DnIMhMе/]vrC~ᩃ-4))On |_Ո>`ՠ2< q@Z#f|X3KQ/rFqY{0d &}偏T69@3JF 6F$ r:!!Nq@ܜܶ?< Dy53jcX1 "UroГ̎5o3 Wn)sqX楡D'RٮG'|2KSE]ALE]USϢǫj]\3ȗم—1My=b]#gcD@}KC"gFض=~82H޾,kSsZs&HJޙt:Jc^8H/ m/fXngU\kh5tV=QBu u|[[1aZ!?(7ӕd@Z!p9`+*oa d3x{L \a,F^nՌk\I kl4GoXˏ{:ɚR#m{5$پⶅD5 f5K)jҽy%kTO{}77qm=Sjt#yBQx{Ӟ57,/)y6DngŒ+.}q//kEfƞ:ঔ[ήg܉$R@A $g̝rBEO0viysnז̐h?z$PU-Nj|H'#ޤ #Hf͚h+)dEb!cLjfh}[X y::Nppgi};%ۊ)>o[ SL"k,|/)3e=,Wpd)6P+<)zL !]2 bѦ6N:Q*Fz9ebm?3H% endstream endobj 95 0 obj << /Type /Page /Contents 96 0 R /Resources 94 0 R /MediaBox [0 0 612 792] /Parent 97 0 R >> endobj 94 0 obj << /Font << /F32 50 0 R /F8 21 0 R /F33 53 0 R /F28 15 0 R /F35 56 0 R /F38 68 0 R /F17 9 0 R >> /ProcSet [ /PDF /Text ] >> endobj 100 0 obj << /Length 2935 /Filter /FlateDecode >> stream xZK۸ϯБJF\|f{*%Nq;E qES:S00~X7 U j1aA{GA{-QaO)4xh=MUCӞx~aw>Mxsl\ΰtߕ[iσ=r u׃SL!Ļut?\ߙg]߰)b9AP(S땸`dA:-]5PKdY( HXxjqa6B i Q)i.wVp4 MhN: ^<~,kNN$Zzv\eD}&? G{cBBd N^heK'~RZt¨WV.F<3?x^GeIRdmyAu>阥'jK_P׻Ck_@k"g l?۵GK#RQk[+e%qFHK6zt:B4r@wGIFlm|J"m)hiqĸ[D^ g}# m>,=dx4t}?!{͂k*5CI n@vǿ.U|G .}3['Ka֡\R&sAgpeP: YbHf|6kB$TD6F:\ą1"k8k;q8&ܵx'ZfNtwcw'hB.q~r$X2vRb2aQTu$8'@JFyTXɒh8\բsh$/' H RYcI6-RTJۉ,J1I_.ģpװ5P@B0p%'qڎWy{C=9_0BTCO nMg{g%L|iB.#<}tw+z86\h˸3TìJXx@x /·;J@ruv\ūr2 ?+R뮵Tx|{S;XpF1;od^ HtoZ W,AU[ dEQP/h<NdbR.`? v¥h>fβlHE(HBT?YL1tgnGP1"! f]dѐoҰ|ڏu_ћ&ٕ )Lo&1$xW}~qb1|4Tn7?S6+4Daf zBȘűIBT™Ifoh04dR. [^Cݞ*I-6Κ&E?p˹b$ ۀ?X]+6a.u"QNqx9w%scOB~ '\69E T(Z;Z܉~eK^|Pfq9{^~&l # |'gQa~7R[*r0d_"xҳ(ZOw/g:,{?y&518Iș$ CcێXE5mB- ČɉWI)f]%l@'V! F.wz@F z͊\oa39P=TTAɟ#v4 M݁T=p^сcU֣IL (yULV;+'w P{]*,VuȮ`j!!_Ek_åo\ *-tH|gh\V镦7FT%R%](N{t_E<Ҭ52^䊇KT2?b3U9r o@I8¾8sIVmY5ܫǤ(U@H$g%r?JMJ%9%3zI endstream endobj 99 0 obj << /Type /Page /Contents 100 0 R /Resources 98 0 R /MediaBox [0 0 612 792] /Parent 97 0 R >> endobj 98 0 obj << /Font << /F28 15 0 R /F8 21 0 R /F29 18 0 R /F35 56 0 R /F38 68 0 R /F32 50 0 R >> /ProcSet [ /PDF /Text ] >> endobj 103 0 obj << /Length 1746 /Filter /FlateDecode >> stream xڽYMs6WTjJ LNv&DK#1HwX!bz-}ЫoQ,U7 ea$>t_-6LY,2Q'>}<|Y*6e߂Q= ' {X ʮ~6) MdJTo|cifxa5|l\'19Edɒig4*Ydm:"k8Y0PV|gYVj6.OyH4Y-0e{F W AM SrX61벷k_iFS}jhxo6L@c0~x˷KC4H0C N[Bmgu h&4#NwL 8h6m3ZM*Y˨ߩ԰"u=j`ֻ ue"*5A6&a.U0KT[1 |rS竃i{ls\=KXٚC>'*4h|b\甈ӸJxJkG%,lDM&+Z!s/헷A|fAyǻ:( O(0>_㬣 ].-"ݱkLwE+UD> endobj 101 0 obj << /Font << /F38 68 0 R /F35 56 0 R /F32 50 0 R /F8 21 0 R >> /ProcSet [ /PDF /Text ] >> endobj 106 0 obj << /Length 1801 /Filter /FlateDecode >> stream xڭXKs6W&>^4$șf&Ɂ`5E*ǿ>,Nb]$X,vbuH_~ꜞ;rb?~ gx(r7SO'bwؙTv*ݢɽfYl`b%Lf%.vmm=fÓ˼I"ٖQ{Sjefij>d< ~wCg6w;" RV+Ԃ#;jM:k %"^IEiPDyecžN"H4,/|OZjS{ܓRaHǁ!4v>rJEMYMIWf?ɴ̬sg7Xk-rt"HGRr"Ojm,&v &5}!YMH~䟎^ w`.R6RR(UHBюBBSmjFK5}ʹaw2PR̂%">VЍKe9~ R!GL?`kj$ \aa׀ٽA)罀k&ǜg1g>OۃY#ƅ@$ $1~t3cJؗ1xAk fуԾt?㼊u!"G rQE-H Jn@ZҐ fE Ŭ+} V*LA E')i>>؊YVmJEKkHW0hWmlZMkY v 4F d< _aaP33ezƕ>QaRٽ)A)BBlGOF r,j7 s|&ғ @5waՖeA#1/@c^h4#А{ ܮ/L.SDulXJdudރוޔS/0A蚛l.Gv>c. \uHtTM.P]cnP bXۥNYJYI'7V )sE%PSKn1{܎`ǞƠqׂ&P9|[ܭPhL5JY-3·e-Y*AdU:L%$nw7tm2#F+eY8;B-A,ֶ߽A ` m-d;]m:(L-n+}L(_J33&l1Aa0 /dL0 YE󲂠gxʞ3u][`eFqaC(ۮ(]F.lgֶ9c߷S%mT=odx)A8D@h(NC" *DW -{ZOQk=#:[qsuX3߻0{۷0)yk?R$X{\r ^T:2PNM+.萕EڠmIRmN2ov]/*qV:O0578gIt^Y]-͜bϟXSTY3x;uk_댻'k1!㫑7Uiӻ۱@w3{T,BaAn3d߰/ŅR^J/,& endstream endobj 105 0 obj << /Type /Page /Contents 106 0 R /Resources 104 0 R /MediaBox [0 0 612 792] /Parent 97 0 R >> endobj 104 0 obj << /Font << /F8 21 0 R /F38 68 0 R /F35 56 0 R /F32 50 0 R /F11 65 0 R /F28 15 0 R >> /ProcSet [ /PDF /Text ] >> endobj 109 0 obj << /Length 2741 /Filter /FlateDecode >> stream xڕY[w~_'+$x݇f8mZ+=h]dHZwn!&/ f6o0<e& ?Û_n{m{w_XkMp ŵXFzBKz`Bc8¬#̪@R43 <?wؽ5žSU=ȏD39rv*>^Y2=~Oxt/yͱnWq@'u8ya>OApEZOJb(Cp˧irofBY(3wUʝYjK֫/EPsV+xZ8fss}ȦWqfAr Aj5h\jC, <:QW{$WҳKټP퉋pq|,:8v >OSzs_+0O0zn2RS>NJDf>sN[ qK 'N9#B| %t?#T??sEQAqXTLc*!qQ^oJ(p˷Z2xYzn윢@..3Ns(_є<9cFOPD`u=N5 p$<]*p]qBB `fU"Bž9OAT d*zd_\39~9s@ȍGLX竣؈~3EspK4^ bd΅ߝs9tD ^Foq\@XZڕ;rZ,fxZ)a)0(\.l# c"#M;IrٲȧGȪ3]"7LaE,Ƈq"K4JMh=Y79ڄ:˘'ZH I G IoV2w9$b(X5$3{i7pOT;i6SN[=&Šک/]BX+El^CvyNr<8{R^*v>4v\Cw$h&>ckM^)7347e]Q_|eTKlWK.UMx[I $eX 5(EidZ~yjxnYkf-QQZO_@'*e`"~d`EXT<\v0A#t(yՔAƕP$|+goieawC;88˄nFGrhKs@E% ù_yOEI>̰ht'k-YR:0sC@Sf?:_{لZBj DT: JpP(iK|olg, i: ['"L0<\Fn (ϖNyt<ɸ`c.A9N{ď3o)#`R1`͊0%0ϼ jDWaˮ}?b8&Nlx=*xB%!4b+=ázx gAK8 KO]MWē!UH:v^(A\$b?w[Ll'ӬH B\/,~[Us쇛q45C5pGE2(cCSƘ*3$ȊϢExMXlP6B`rwe"UlT>zO zno0(t,NtkciaPi#B,>?8*D("KU.{ˮвwO@y8C)1A))C ajJ OQ5{v yvB7#J%ݡ @%e-B.9ؒsLpZɼL[O2#yRaʖiZ zЉ|T)KYbJ>;_L$n>ӳW/Fn-iysR?,R\ e6ٯ- ﶩσbBryE.46i1ѯ+/8rÅv#psGyOg > endobj 107 0 obj << /Font << /F8 21 0 R /F28 15 0 R /F35 56 0 R /F30 43 0 R /F29 18 0 R /F11 65 0 R >> /ProcSet [ /PDF /Text ] >> endobj 112 0 obj << /Length 3227 /Filter /FlateDecode >> stream xZY~_čYC'@lb6Y`n #[$OߺHIzvMbJőaU(juyݝo7:_ۍZWjX]W  iu!MWmģ4 H 8J6% =3#/?F(7y{}E_lqӞ>vL?BO?Pr8y[ZK !@#O+ˁxVKqIhJ(YG/Fje]lwG詈.; -ztmY^u&#z+_H摶)67kXPū.]LB(ۏNÝBؗ-u4<]sG&xx+p Duus]Y5݌uwZyX7_m0Y"7 GQ! ˏ<6:&.-S[\=o-qq1ڀ$p5{"ZL@bMdH[՞Op-(U:rFO" ~FNξhI<އ5L @?_=zr;V & $x G1C,|+_&-3 K*2*=eʢ,? 0>ſ%7k$"*%ݘ4ʄi~C.T4|c\:B-x )A~^6LCsq<>]2~Q6y@œ8 1=Ⱦ9Zt@`Q PT4/(OSG{xVJzhIos/j~ɹ|8Rέ7`_ͻܫ݌L&q\Zp5.]2c"+YX%V."m~o<V6K#B1VM#:[R XTze\jj7#~jlaMO9kq+dh ;0# ΂,x}~>x;:˞!Č3eH Hɉ( h+=έB |s=7tLynOh-Z[qiG /ؤkN!a31Ic}%1g\ `8p&㋠Ưs`fr-#|ihZëzWUw,Am夕|/i qOBՅ4:ScI[Por_\0P\bCE+4\''/=\l"I!J4Yc&U V(#r54-B"R!*!"{Fh/p`DoTiݡ>NT6[ Y"1$%0Nt,i,hd I`8?cs HZ'[(0y2Ƃ^BI/=B'[SxߖĂ)!aZfg͌J4H7B39Tjӣ7;UYs p=F反/@; RJc0ҽv/d]uT$@?xL9S'- 0Iq,8בk,Ep_˞ 1\,&4s+HXynɭY4^24ń@cay0%ӑ I%) w`caH$? z^7gu#f{<Y|Uկ{W~`ޚ/{`A橂(L3\T! zxbd7./k4?k8{8F -wͅωLFI& y lEw#\e^JFvOsXL*qs\-quF# )com6m):[^ t *ҎvdE8KA_ϔsc+5Ҿ_ х!vhРbF? [I>zB؍D33bM"=An1mud-)L n.hTESP is@B`]v8p`oxzrtb~]^k húS2K΁ 5j-UӒK;Nգ85wr!r*=FbDFPŜ8YR僟3v=@\?8yU/W0:/ΰj-Ȃ 6YHH(OE*saTI R75kL))U; B⥪_EfAQ_gj/R}žMQB#$7vu!5Z6A+ZH\lE 6Ff}tFͫaG7*/'W;MZ) o\Y$h{KOgR"(Ndy2KqOm6ˆk@pUN/nKclQ|`(O}=]gˁ: @~ lōޑ {ۥYCYΒJZ^0G B/޿I-*q>:&-H)R) e^jp!‰E٧xIIPvQΥһnoH=9-3Fز:PW#Â5?36taBH, R)ek'moV endstream endobj 111 0 obj << /Type /Page /Contents 112 0 R /Resources 110 0 R /MediaBox [0 0 612 792] /Parent 97 0 R >> endobj 110 0 obj << /Font << /F8 21 0 R /F35 56 0 R /F11 65 0 R /F29 18 0 R /F38 68 0 R >> /ProcSet [ /PDF /Text ] >> endobj 115 0 obj << /Length 3139 /Filter /FlateDecode >> stream xڵZKs6WL5S`@|iO>dVR@)9&9_nt$-gHh4uC/voU HeYjTH_ױfrf?g:VvotڪPf_1WH#$J8H)s>(& \r#nJE%|kjM2/,aY[dn.pĩE=#NBY\GZmX ZD}}Wv$gY6ao}]}{`h'"/8WƆt\ ^~ApwF.NKN ·QVH&8'}r/@q`".ڐ?>WE֏bpYڑoq{PJґGU5KZ Ppߖy@I0vE+4Hcբ{)*&opKQ(fhJ2sAغ巼iT(q\"ny:9 F|s }pGc1z5pg!;BЇaV4k 9-t0|t!6 @V'oa&.b=KJ7͚޹e]w`n 8,םr[xh; /d?#|+lAPF^MCB5YS:F3B Pݶ,{(z8n<%Ϙ}bqP xr`mfobS C˭=,H1`Q) Αb]vRC։χ#%Q}AzڨEpLe*~!((.\_ .`Th )ůU~!W?\HtuP"MR~..YBcⱱy;6'{1.q _g$\fNU 8UIml3U7<1C.l(5TSew C-Fp<EٟyU5[j_emHnD_lFu'#Z,L] X(yc?9hR֤OJ hڃF .c,:h^jj4EgPNbKTܸ-]$t {,۾G|il>bR79k̟}yp!an!nцsĆ۲ [KSWg١bKHnP7T݋{0 \eDB=sO4 eDw+E QWAVԕw~I ˪Զi9LT1n7EAGCZ&Ch w d\!f#u;z}3`PW-BMAAHUATH{3 <_K-.R3?\Ņ'w7=A +_tKz煚˓P2rXssl쌇)(W[(g[w-t^F/BL$x 5HnZO{.mڙxX L.QD$7hgV[K9ۛolKM.>##UCuKKPx{q耦“PKfgt/mѦuySPY,˫Gtþ]x|i0* Nb/`OZu ܹ.MQ1'[O9۫2/kwQ7یaU3!7@Of iL6KnÜ ֳ_D3G:ٺYs?Ԑb }> endobj 113 0 obj << /Font << /F29 18 0 R /F8 21 0 R /F35 56 0 R /F33 53 0 R /F38 68 0 R >> /ProcSet [ /PDF /Text ] >> endobj 119 0 obj << /Length 3363 /Filter /FlateDecode >> stream xZܶ~ZERO-8 >|AR$nj;Vi$><~37WϿ62yon6ڤa.Hnn~i[tZM[[v'%l?2z~ pϿ&yqeBK ivP8/7WܨX,NՏ?*|} gxJA>Apwn-^؍[t4@Cby'XeSؕU4ꁈq>+j?u3oKJlw/ WEӼfQ ɂZSQiWBeW;~*wIe;1 َ\@$/ 5 .XU 2mT@9 5QFWʮ "l~,f3\(Ph4HtaHZ(|ĎJDdSۑJ,<~Ȏ{!'"X+Dӹ."MF^Q MNrau$${74<"eL_(a؎ez Cͦ3y'%hkkGLm'& ѡ')efK<'*ˮE0?/#°A-R=YvY#,_r*<qrঙx*i^NUũso4;9z@rA&l)caBx+әYx e+t*<&v@\ W3QؚAޓtl0ȇ@h#5o`$jB t01 ŔF!w}d}FI$XqyO7kMy\<)x(y%0)T><`EcxYL&*ѹ0"3m7bOB4𴧢k1UcluC8kiFxC/0:43&aMi d\zL8'oբs1jJ$X dnmŀ.ojH3,KK0\94$ԓ?|s̒eA6UM VRk+Y#?Sa)5C6K/`WԼ@נUsjn쌾ݿM gq︗?ci];9 Hˎ`pl. ^lm\82 ?#G5hh(ؙ^<$ r-S*EsÈu;6Iy+h Ni0 @LjI2QI؁4%kLHhvhOfjLf*f0oyZߡ?-Ŧ t.Fx>Dҷ<}딅[ 5ZakUve;KCljcͅMJ`^zFh*2[鐏jZmw\+&*}Ђ%{.:N/$3[d)JTنe[;#?HU3ikD@HYP!̢-N# "Q0 ,J^Q(' &/X/>bӢ4D+W$'K pw 6xu;8qI .k½ =WxJ8s73JB6tsY/A.&Y4fP(Kjv\c^zL0o8,z4+(ww2fŞ$=] @X.wVr2L%t,3L\.&!Y{D@<ހbyNs2S)*\uk lX3ޟG)_~q^2כ1jQv/ҫE-sw9 _]R]=άxG4tNX0@lj0'[&X뵞~#- I~F)ocqZkS_8]~)vvVT ”#)#w| {֑ JF+.-#xW9>]Bd)f7wIO endstream endobj 118 0 obj << /Type /Page /Contents 119 0 R /Resources 117 0 R /MediaBox [0 0 612 792] /Parent 116 0 R >> endobj 117 0 obj << /Font << /F8 21 0 R /F35 56 0 R /F29 18 0 R /F33 53 0 R /F11 65 0 R /F38 68 0 R /F32 50 0 R >> /ProcSet [ /PDF /Text ] >> endobj 122 0 obj << /Length 3328 /Filter /FlateDecode >> stream x[[۶~_G-<$isNSӇ4e*kw7"]Gt>$K`0oWWϾjN&0.M]liWheG4Ʉ\$Vkι/gXV?Z~7KRCЖ{׽m~K3b&ZSJtyWWDHtA"2UTg$Qbzs/b{,~JjB^J_W֞:bQV)2 `\ #vJ&S mC߮X uyÐyu}'p;1i(|dP`T˂A"U.Ӳ㵎 ,$ p|&axM /@4#Zs% 9+߳,@{ ˷`[GhO/' -$GqoL@D"D09˦z^I &{/ΝG*#v:8Iiǒk"3ꫯnGQT9/^A-{!/LQFc}t>,XBX*Y`q@;}9bhz`XɆ~j [uPض/7c]۰h{X, 9㵎D, ,̇rݙaj84G>kZT=1wmpq霶1x[2XI.5޺:{Odwј) '|+|om@J<# Tۢ1hQ48;cmѩ44E];Tbki Rء6/6G|pk/wOD!n&$RΤ׎y:ejG,4}khLW[汹]dBSqmfRgu^m˜ǩ 6ތn{O>օqc} <&>󰈡Hb^⹱d m煤%{ `[< _ EA1dS[2P@ &!&%.Cl:b64I:2hE?!$YX؋h4LҺ]o]նsKc]Zlu凳-vSx pH|$ !t#Ҕm) ١!ߕ-ЇHRx:OAyyVeNy#f;`X*i&y@z6״)U ̕q\q4 l'fdctj_$,\6W`틩U P@N 'F0Q\qj"(v!' J&onGV ܜKYǯ ҔB@)'ZMB~/*:5ЩN@3 ‰LН >%Jz]vbKw +ڵ91u>b <}rFA?(8>Jh|iѠЀ`bfp_,fL9bu=MhܚtJ XE6[PO ] f*#fQ,h(1\`ALgq ) d5M ӽ]i"U V@}G/G#_9s:_GB?d3!N)hj}niq/1`@}v_45a@2ghEA[*= 2 LkE._BP3ר9f0r S ֟Bftlk1l\d,#'QE $ (ܐ?X_;+6={їi*De|=蘝G=|yza/b=x^z`6HLں.+ \{TMa`P2 -2ybTоq10(l,=DRcXrT7v >.;fDv~v9:CHv?ǧwQ5E~kR~2(cįqTߡ7鷘LxWPBq,/=06 :xD%7݊gLy[4hB{0.=7Yt|gfY:FQۈ`f je?#fgӸ4~*ALb9=I9 ౜MY8* =$Ô0eʌaf`UbkkOG&+l;S%2 tB0 ʂ1O ʑl&7zG㌞=g3 9GrOezoex^4txX4zsɽ.KM"_o5/xL1;﯎`WwngB=O;iJS67Yul~s>=+΀ff%J[eEq4a\)|:2WI(xeKAbmP@3[Usȗ{d͑en{M!6ylD6mJ7e"%)TyM0bb,'aQHQrx/g brwg&=4=SqdvF[Bo۽79N-pQk/;fјpP9Ԅ~jQno2ʺda.̌ 鷅=^lAY{TaҔ&"eIMȅHƳZw(tHljNjuM$Z$XY絎NAvO'3T Lw3#Z|Q1p NqK|@dc^q ]q"μ,!!emo@:pO+kw!X8h`nܝ nmB6ՁV )@@'N+Qt[Vo  Tv|n+ld^,;b~æকUۆoO4_yo-ry:"֋{><(<6e-6tyTY?1ei4&g%@vqm&: "r~Nec܄Qgdf7_\̷8n]Zh޺oeXgӻAݳ箭y ҽܚ1ݱe.ԗ'rS:oK泬v7mPGn05?vr\`[6qc'+єEOĬkC%p 9MC0,fR. uV( {< MR_'{?cZcu9fBH%J`:d"GwN&KL@JJdtKK endstream endobj 121 0 obj << /Type /Page /Contents 122 0 R /Resources 120 0 R /MediaBox [0 0 612 792] /Parent 116 0 R >> endobj 120 0 obj << /Font << /F38 68 0 R /F35 56 0 R /F11 65 0 R /F32 50 0 R /F8 21 0 R /F29 18 0 R >> /ProcSet [ /PDF /Text ] >> endobj 125 0 obj << /Length 2566 /Filter /FlateDecode >> stream xڭYێF}/lټ8#ڳY MqFRBRq~M"u`? fuu]N*}~-*iWU U"jׯ9RQ }db/_;O}ヒŎE%+4HQCBM7? IX۬U=~d1e%!,}[Z e` #pә|UxD{'YI,TyU5.YTۼʺnoe`ԘQ~8|)&~*&RdM_<_aMvnْT$pϪ|# 0i7Z65l nQOзߡz<NJvh?d%TB\a`l.׾1oE΢OZ+63ء| X]{B]=2Z# B{t( ulxuջ'Q-jYf~k?6[0Y*.:_f-4չoP *4]:K;4|!ck qmd{ikr,VV80T:b>X 6}Xֻ:('[RR%]~OfFTZ&v^i_;ez0v4%'~ڃ5Ls$XPt$$HGWXjxO(⁖dlxFK6\8(]HXAOIal8 BHhYQڀ)[-nt]Q\ "v;g%Wglu JD Z%BѨšzl-/x)_`qq&۲+!#r}[L5XxHjJPR'E(p!C7[ &਻,̜B߱!o:TIVZcxu^O@D'Ȧn=OP5nuO=Uj%ROH_Њ]ÂBQ$Ĝ).@XzGTzM-ɫ [;dc'?P{~U1@5pȞpP&%0 vcS- .$кDB|䎈{bVFn2\\4lT_߯~5XmWiz@4]Ij磌۫|' ۅ)~9K)$"z9YԊcޢ7q_-ED+x "~I]3W.Bj< v[XW"e"=_@ pt叄͝H<3'& slc+إ#N^ Ёnxtcy >tuT$)n"}KiS$Ӊ7ѕIxpp; Bo{ߌF%"D#8D4 0"6rk-PJgZ+ a?!fZBd]K+65"f /k \VM\1"̅fevqcwxzF!{[$2Op\:ݩ*ٯGفޖyv#xxFܮhܵw~,*cN{ çŠywDSƻDjU`QhE~_7k).'R}\0{(ww;"E=|D5fǫdC>Aqg} )ﲶ+O.HywNNk낆n]^5'6`]%0 '~GG endstream endobj 124 0 obj << /Type /Page /Contents 125 0 R /Resources 123 0 R /MediaBox [0 0 612 792] /Parent 116 0 R >> endobj 123 0 obj << /Font << /F11 65 0 R /F35 56 0 R /F8 21 0 R /F38 68 0 R /F33 53 0 R /F32 50 0 R >> /ProcSet [ /PDF /Text ] >> endobj 128 0 obj << /Length 1237 /Filter /FlateDecode >> stream xV[s6~Wx3˒|'%& -tۙ4-=d/M۝NgbtOIqe|T uM>Qѝ6Oa٠lcMU Vtj"_X Ҥֶl]H%bygˑJԷ5!ȷm> &ٖ%UF#ˑNeβbP[Dz\ ?#KE+L"j޻W =W!PB(,dWA}!u6$TO2"o)pVwVvPgxcI+pDQDz\t}CA,]{vAM6GEUVƕ9督Sj#ii3mzx'Lm h&ms- i2>[ f@V^ϧAD A n?vD۠du¢3am{k L$qfށ;ckhy , 0,YVƋ8sq|g%,[5ݶkT;:߯(ٮ4v4M1Xmʅ_;#wWot @~bŊw@ 6Iya 9ꐱZ0PBB.^ĨGWR.WJ` jX&󅴫۸niV(bT~ga*/Ty =/}H{ː92'&q[Y 8#i 8{3Bqڸ*>\Y_aKA0kT{g90yb6I}H AӮ8+_@02}Oy1F)|/z?Ko]Vof%cLjC}N)*jӴ &ɴY=ӄ\TJKDiMx+k+NEt's/Z4Ad:Z/jgo:붟Q9ml(IbIp>{*mq4f"[\ogŽ WY}CdŵrTMD[[yƂp/X삒i¶jyv˕V M[vIvUuKXqsq-mjm$D(qgA穏<ϫPn?H endstream endobj 127 0 obj << /Type /Page /Contents 128 0 R /Resources 126 0 R /MediaBox [0 0 612 792] /Parent 116 0 R >> endobj 126 0 obj << /Font << /F33 53 0 R /F8 21 0 R /F35 56 0 R /F38 68 0 R /F32 50 0 R /F11 65 0 R >> /ProcSet [ /PDF /Text ] >> endobj 131 0 obj << /Length 1859 /Filter /FlateDecode >> stream xڭYKs6Whܙ D :%m3MN3=8>0$esB.EI}w$R~Lt@rawa~1{AyFD/Vs36OiFheWvdQ..> FHT ySWQKIAϗLJ-/#2-޻w"eVEb)D?": ){ TY 8%'CU[v[+8yN$w x=ԂSe{FL|)xB_&v "ʿ.{7Tk(Ө:#Cn4D4+mKC} L|a>jJX1.JuxTVyUmFePg) "Lx@̽wC՚(0Ƣ'|Tv%$afU4'JJ_pDNnIXlf6M o=.c8df$cs56 Bz5^i8ESNk%>B ˛Kx]_g9ykanRBY|? 4u:`JI,aYε{Qw*jBh*3qֻ&?Ƈ8-IB<-d9u &z;n4r;֋;)KC_(xX#fz³'>myxn7awZ*'[kx_k]Smg\0s\t+J͋3:4Ddj~cJ$zI2>PK $$Έ̤_^5um%"YL eOHBK^!&V2WT]~?HYe5;?af`KX<Йg`˺}sqR[Fb:YAJtP|*<:WloCwHշ gc΢|Kd!BHSoYa` sPK4g<čWճ`k~C >qSH*|T׺Lq)rpz 27}P?Ţ/,!v;L6$h01vPӐ: FBj7j&)3H%3"dv au`.t?D^V6:|{apHAL֠nf[EW '9a<XTu~{6qU6}ҹymp5AV 1 3B n;!T)x;NʯSKBmĘ=>p3H;&B414l endstream endobj 130 0 obj << /Type /Page /Contents 131 0 R /Resources 129 0 R /MediaBox [0 0 612 792] /Parent 116 0 R >> endobj 129 0 obj << /Font << /F38 68 0 R /F35 56 0 R /F11 65 0 R /F32 50 0 R /F8 21 0 R /F33 53 0 R >> /ProcSet [ /PDF /Text ] >> endobj 134 0 obj << /Length 3205 /Filter /FlateDecode >> stream xZ[6~_aخiԅJmN.2[,Acklamɕ䙴~υ(Km}Ѽs;|y{ZE.T/n2ʅ"oͲ뷷B$蘈ċ{I+c%ȓ7:ZҲ(~^i'zߊGJ9ԙejGcFQSDb*GjvMq¶WF ʈ$5$Bj~z6ZlŷWйYz͹ jUA vRnM > }PmS;tZs8$FN |- $3"r7*K䦹^dlwP-7h+mpsDCCƢa4V=V~jh"< vW+&-2vgSHKsr*OoTL̥P]E 9aFh )U%v38q䡺; ϝD136͇y>*W=p:|yہe+#hn@C[Tlp!@5uWm˶+(MO@H% Ѳv¬@FNM2H a+ ,㟊 }fr@iyS*F:1fpߩm] 8m[9m#m˭л:pPsGPS@Yl:N8Y0WJd wS,<  鄉b )3!)L:pq1J 0gՆꀄOťI0`η`q/1gXV]_!U'p@ݵPT.f8DKTT@gqN{V>֑0z84m9C gáN. 2ZcTPnh9wa,ٔVھ .Ll8cQ{Թ9Zn*OVܪPKyͻ @NlMcRtASE0FN۵":Eqp'Obr58Raָ@D!=Ԕ١%JHA= ̀"JiqQߞ`b/L gn ifI,NquT#  gLAGu^=nui]Dz΅T#dW .d!{[e XhSPFWi"C,ux:Aeb,cD@QF=dqqnJ 1'/RəvS*,DDd ?'2xI@$O\ؙSQ@4 .Xt=4n\S)mFM*(}YvOx=4O,R'ؑpxPO\*p}ۜw{*%:HF҄|MxusgN;:,vjܹf&fm8`ա)Q:Ш`a#cʍ: sb K]1Ҭ?UK5R6.i`C?KRtfף lє jzIP17J!7w2q9rY\b9`6} x4Dj>-]F4s3uLH..*X;?q3Sm G h0aebt# q9=sdMsb =9ρNf/ݡ8_xz:÷->W\A钏Py*ZFo@6pU&y dG1|R6^qs3ƣ$h]207 &Vgk[zKR2ɣhX3#0ֹup9QLtHYv.z4Q $߭[c?=lʶ*cu[(km2bǵV̮z$GL*}D|>M̰l5&huSi\EN(fooNOچ >}= GmR]>>qkMwƹf2%Ry5A l:tVw<[DKZŐ@~^d[Q\ ~Lƹ2Pu rdיjo\8lC ._I'&3E WI½޼uOs+7|yɔ1TFgxZ?)=`gәD$bWje ~CAahҗ~z|6A Ytbp uY?.}hEzF˜9SO|;l6PAgޤY?L0sjвfglѽU#s6~.Z̀{"`ݼۤoMM=ĝ Ifڻ{i~||8̋" P3t!'6ҙ0ZU;8Hgi;ݳy=Z77s'Ciy.o5Ì3f̖*o6݄11}.N8;\k@!?dZi57S PFH yeu}ryaDqC빧㧌x1ϨIl_@eRဂװ#Q&s?zv<s;cpla|h> endobj 132 0 obj << /Font << /F38 68 0 R /F35 56 0 R /F11 65 0 R /F33 53 0 R /F32 50 0 R /F8 21 0 R /F29 18 0 R >> /ProcSet [ /PDF /Text ] >> endobj 138 0 obj << /Length 2721 /Filter /FlateDecode >> stream xYݏ۸߿K^L" pbm{eZ-$y{}g8$EYM+9wWBplq{HE3ƕXn f t˕XTwK< zxܕ|?.4xVjF |@vi iQ㊧Ԗ0/q9p63NUMM#FzxBc[̅z$s>f X "id" 6P[{EsO8)}|xac"hT זXP\o6ē#^Vv٠dxnN-B?J,LA-QG'>{3Ш8mHM 3tt{R.2Pp΢8Z]H$ř0oʂ3n[h&xWuFos/p }3$3LOm}]bRL!h512T0dە8#|_}Ym CVף9^]:8 1>b>T6[2\s~(@|ҮoOE?=Xckw 'HACu3JeVY$tչrie;A4enTLF3 >Jl$ Q,rvygłIՎEZ%VX, '× f&؇4d‰ K"*{z: p n9J@^\[(CrDi%>\\yȏGa m[6̡bW|MxA mpפ7v׃<K VoEN`+?mh gw  "7xG) `h <C0xOQ^wv]ؕc@950AKcJoΠvh~o-,-\g=vcu>Y?!\?h.1xjERWΑ9ۓP}hEyTDZh!f<@QzPAGsK&ߨ`ϝHg6Nf|Ku\B/kxzVkrSh Ꝭ)#1~a{aq5Id@kD;.@Xn7$}g noh 4|qPv=kVO6?6 n-[KF ǧGY{E{-4RO^Q6qH0,G45t`"hϭNNj3$ .x~7T7SF4pM1V*&> W𲷨->sg@|44Uް8wemY pw)lNj$ʽ$ W"#DЙn@±7f^AtǴKIz0S [WnˡPwKw/ "}{LjH7hr-0׵Bgzj^#,flluS~5S0ʾvFɰkɌ{5P|з^ gJtYmS̉d쩛DBV`k@bmWረi5av_Dx!t8 .ƪo!z/;ں9kpcȘJIH+OYk BC[Li:v3^A;p) glﶱoKj`YXUk4.-f,/sBeQ@7Us%6BK0nf\I%?zB2H-T^c{jJ8"'sz=.!\/PnF8{>#%^PgCrMz #ƨQddQnzb׳@w [t& ?>_R+fEWP4F_hN Kln\\"pʍXw3 $!4 $}0/@ tݗ VgN &ign.M" endstream endobj 137 0 obj << /Type /Page /Contents 138 0 R /Resources 136 0 R /MediaBox [0 0 612 792] /Parent 135 0 R >> endobj 136 0 obj << /Font << /F8 21 0 R /F33 53 0 R /F35 56 0 R /F38 68 0 R /F29 18 0 R /F32 50 0 R >> /ProcSet [ /PDF /Text ] >> endobj 141 0 obj << /Length 2546 /Filter /FlateDecode >> stream xڥY[6~_aIԴH:&].f,A#qlH8_BJIZ/RFzqHSbT\[s(Zu׫PޗO,/hRahﲲ:mYo۶ٙ5-d2)CG q<y]Jz-Y}S?EW*&+5xeeW:JougunGGQB)T:\p+ B.d8QҎ|w'Q\_|dq/d.vWJIj{RPA @b% OƔ$VÝ7-B:Lʎee꼹^+L|3(m+ |WZhd=5ۦ-q*h걱~tvt!Y7Ulq2[ P aC;S#kqOFhvLhtK}@ˌ`j=gtucO|x%U$`J"|+N}ۉ݌(,_ߛ|[7UyE |:u}=dY!]ٽy?`]5~% tGeiFwP{ G^=P &D ځT`lٴQCggvǞnu<}p ;!Qs)X$⒂WˆY7\qtpK3S)'u#[bx$ _0\Agvt 9O2a)}0CpQ) 7r,61ueچļotV1E@wyyKGJ6Wv9i@@0r&! iw2:ʜ2X~;>a ĘwC`Gxq(n>.`msVn,/T_ji*֪̳89!]h9{Lg_qcM .g5c1` s8BB8+fF<Uؒ٤0۵%PVJ'hd< !P?6נN4@ت|txo '^@~o~y>[A803ڧREw$u$srPG*Q.W῔p Xn;ޟ!$ơov0}<"A\06w7͸]j2o^] (bH=nxSY[9=\۲[)9 H1tX?r0%KMZ×5jsrʌ-Zt^CجuB7CI;{=};ml~1w$t㽶/h aXBn.a4C*/urПO_P" 㑄Ӛհ@&FE@2;Y'Egy%qW);"YIP) fyh\'AOXXkrFY=zh.: 8IvAB q<²{22K &xypز vkx9# 0[;xXp۔HK |n.'(e\0*,XO' 9`F!ސT=XdtBӊ^CP_P|7DIe@ 0ix9NxĆ%"L4*)ƨQNC8B3;O sUQzWvKpE=l[4d9c HÑH|CgWT߶HƓ *[s6Ci=SJ juO7ԙ7Uoښ3g*UdϐdYźĶ#!T6#qO,,X]ډ m,e $( oEIoWl(䩪H5r_T*T}rNP:Qڛ*qhɹ=@ wcUOX{d \ɹ.Uj͊`؍.eS~Vτe{a5-䧛sз^sxԽ2V8Ql9äI“P'O=¦Kf`O1>J g!V׶3[ p}yx 727:wYش"̔dʗ/E/)sc endstream endobj 140 0 obj << /Type /Page /Contents 141 0 R /Resources 139 0 R /MediaBox [0 0 612 792] /Parent 135 0 R >> endobj 139 0 obj << /Font << /F33 53 0 R /F8 21 0 R /F35 56 0 R /F38 68 0 R /F32 50 0 R /F29 18 0 R /F30 43 0 R >> /ProcSet [ /PDF /Text ] >> endobj 144 0 obj << /Length 2276 /Filter /FlateDecode >> stream xZo_!\V ={y(.A4$n<m)컗٥H}wr-}r9_]^+2Z&زX7UFRI94Aϛ*ؽE.r|&며jUH'4RJM.~s8Y?M?,? ׄȧDË@f2w#@lYwYlYk|ZLI.KnxJ) F''ѝ4h9(&O&M"E=I" K՚XmMc7E0_~7F"a6r\_cg *ܼW7GX+ܽ+|z[ȫv U]ttgN .ROۆP$+[k1缇ڜ-MWQ+f\L~\fjzDOl Ir;C2<9_?ͻCZHw r4d=$N#`}AZm)Wƥ2wˆ^41ߐ+8=|_pߑRDdOȠ{о|/lĻzsl$APWtlІX+du'd,JZ\Cp~x> D> {m3ܯZq3x8YS9y ܑf@`,L$;|5-/W`6 9*"}nBU.oHZ-oK(|P0;.5ʿC!1R{˚ȯ'y~ʿsE ׽8\k߂r':} ᬁEsn>v*ȊϤȅN_]+ gEB`4k gs~Uakм$MMeɔ EھLע^'qaѦ ,WgnǶ19I!55/1 YIW{&/Ѽ80   ;ҥ[y@ܳE_\`Qg'"'+獎}+\# 4=Rvf: ymȚK?sMj\n7_ .<ШK D<6,QKi'4(g˭z-gI,Ĥh6P"i6N\Œ ›>'1v6uՃQ[h/7'@"+ $X5}} IN%< rl&GBkw3kьa7 sdI,,ڀRmHQ0Ejb> endobj 142 0 obj << /Font << /F35 56 0 R /F38 68 0 R /F8 21 0 R /F32 50 0 R >> /ProcSet [ /PDF /Text ] >> endobj 147 0 obj << /Length 3228 /Filter /FlateDecode >> stream xZK6ϯPe/ANr8qUM63VG4HYlO~ )d/@ϯ+7HtvY5Q*XήW̯o˅|su)_*7Dϗu- wY+C~wPv^fwvWF^_i3KEh.ezPJhmղIJI%V[ BQ6޴/;JO4 mL V'F PNl  /~u|N-W;a4(BK4bc!G O툿K~vf5Cٲ +a#RH'i}5ät=g6G7WW|sh&<#B9SchPEC)!2 bQ I%l},c1P݄iGi-9) e%(SxFw< 2:Pio.VL$%CKEsԘnH-KtXo=>dbB׹M=y%"j3TH`O)Sg^mzppPo|$姟Œ]wÑJD`ԄA}2BF撰P+ch^8JQ9W -Lz$]| dMAI8qG.&<Z%E1! O!\WỰUK?\ޣH 2LA^H]cSEC97]ie|\EZe{7Vo*x}겠%-9mM*'U0oԠ{MLORJ5ZuE$ʢz;|j)Jk@YYAV VJZ F H= ;x5qJZA%oK[S5紑 g໌Fx~#zStaGvj|,{[AS$ͮ`h*A{ʯ on{6Lr:1q̓GcIq8~sp 6>R|4 (8.ӓlr>fqfXCRX)!%10ᰘG6z o*yBWHUPF9wܽfkt]8 5g؅T?$qmgN)p R3?R;6ő|Մ6ÎJm:K"28'p  ;#mKJޟO,؇-˅'=Mjz{CqDZЧfq`{⺄i䀀"Ê'C E[/_>gFɏk˺jRպ2xGڷOBZ'Z68wj;NXC|讬EDrwL;)/g}>{O_4! y(Sl,*h+tOͦª @B/<-#624uw>^S DbQwkX$9,vݳs]1t؀'呅ǧAI⑕; f|,PCWgz{wH޳'6m1Z,яD$;t#o.z~&,] $|nH? R֞4*?adQ CN G=";0u9iVw?Ѻ#%]S(O.RA6{~&l[Awd''c1G=/thsXO3P2]FsBÕO&>žoYSv,){βcjcVɁ*ym"t䞟Iˎ!d15*T]S=1C1ν/<AL~t# (8M $jy8 `K lLHC_j%܉7hj<|hCSy x-t {pQ4[9  IH#?'#BK|۽$Ei` }fW7uDO8ڮs&rk{PYshE8=wڻ*G;k:؆?*x 2k*J_^.ПYY5Oy X >tℂŃ6:=ɣ#x*Y闇A]sK^+4%q V7t Y }grcFSH(#4 QXŏ endstream endobj 146 0 obj << /Type /Page /Contents 147 0 R /Resources 145 0 R /MediaBox [0 0 612 792] /Parent 135 0 R >> endobj 145 0 obj << /Font << /F8 21 0 R /F35 56 0 R /F38 68 0 R /F32 50 0 R /F11 65 0 R /F29 18 0 R /F33 53 0 R >> /ProcSet [ /PDF /Text ] >> endobj 150 0 obj << /Length 2397 /Filter /FlateDecode >> stream xnFhmucvl `4qnJM";$۲~RE[ɪW޾۫BIdqu"Z\mvY\$ڥv_?`$4xE IR~Gͮ|Habmnw,2^~XP^^Y=P-Y ~7%n{5|q|c1V:m^I{lUrӋ2"̚c@j.owpϦˆop1"m:^MXiN {GШr{lC֤a8~9b*l1*ĽލoDNFdzsʏDʩk}]N*"^', lΌ]gH9 u9Iebgu$4[Jb9xWmV.;Xt~a/9e;Fu4% : }XG&FJHmPnWm]:/JkT%G+~Ev ? E'wƵ I@t0_~m^,Y\ Tሰ*~=ZSXKqNʒfƲ (BG-}*,`gSԨ q6lŦȵ0K>/_3P"`= Rw}(Ls9AR&4rGWjjΓXXzwà:mZ>Ht>ա|0,kʍ";!ED#R͝em~@4eպaQfx.7l] '!H۔& YlZy&:ޙPO=b'y[2 QNbpSq sӛuJ"^a})+)OZKr<(`KaҸr E'$`\} ћi|^]mM@ ꬋt1DN?kH# Q^9蚏>Q!|˱t%_3Hh{~@ r=WP8H-sH]^@9Q!sONxڠ2FA'Z*~"dM蚀7kN[ endstream endobj 149 0 obj << /Type /Page /Contents 150 0 R /Resources 148 0 R /MediaBox [0 0 612 792] /Parent 135 0 R >> endobj 148 0 obj << /Font << /F8 21 0 R /F35 56 0 R /F38 68 0 R /F29 18 0 R /F33 53 0 R >> /ProcSet [ /PDF /Text ] >> endobj 153 0 obj << /Length 2977 /Filter /FlateDecode >> stream xZYoF~ׯ!O}Rb:ᕕl8 ClȁXH>WG'oӅ EfEI<^j7QuʻcT͆KurK dA7Uv]n lz.c۞mwjcgtpN-tya %ɻ+c뒄Er+/Rj`i(Mgɻvנzw%U4{veG5e z,֨}"l޵+_#faW~ K{zad-uk+$;]eѵN4"I'_M[N%_x6q6 _j @4@GXBtq ϡYX)U}8Wҭ{tṲ̈́,7D~rE.![\Q ӑ\Aeg^υVi"p(Q~ZSwLDѦjLQx# B<W.PعյU,< y$I)pBdl S 7Wm@ 7F`q!Y=R 't=8**/gZ%~l;4S -/Zh(iq, 3|Qf/[Lp]2<IDdst]NEK\ =꿉f]|!쮉_YE\>zvnӢY*6Lr MyV%gKQ>9Fgb cк ܮrȗ&. gx)Α3{a;nh]*9׷'ǒ(/FZ[95T Ϟ:CP8 #"L1 m=iAPi4g8;4~rHXKl|]$`%bѧu{Vvϡق@MTRzYhMmqupF@g CRY1 y2lh/`EpS~h}Ėzlxnvj؏-W+9hIFg^xdho"ͤ_, J1u3Ƣw.\ENB+h p]Y aeQZ}&q|Nx tLaqe$:GsF69kp /vLqVvk`E71!&#s4S|*^D=euj\B"HUzn)I+гX1TE&yVgŌQI]s2ŻOl>&GXj1L8/}<}R2ߴU1MTZ2˪sGA~(f`W뗬CÂpB뮼U]W9~1$`5_0G sI6=W3EZ05,.ܶS2%NNx pԮj}Vxt4|v:xR)2ĺc{KX[5^yC$ݿ}W\d Dh 4Ai+|IFBCғgR:`@.qA 2}W2 | b<)+R}PA+^fN 1X͹E։|0LKN.:3 |b #UkQ92cFHe=lHYZռ֜a΁VfXP[mf +#az21Y@ڐ^zL!Í X8zDA:$p4R `!3 Hd|5'VN,8'~`Vt9pa;2DPxLc.BZ٣}0!_PY sǓg gxM /$\'Z}s =B~y:g]L=I?~_O_54>Ȝ櫕?v/SF*kNmg`d½$9_*xb©r@ ) ~ bu+ endstream endobj 152 0 obj << /Type /Page /Contents 153 0 R /Resources 151 0 R /MediaBox [0 0 612 792] /Parent 154 0 R >> endobj 151 0 obj << /Font << /F8 21 0 R /F33 53 0 R /F35 56 0 R /F29 18 0 R /F38 68 0 R /F32 50 0 R >> /ProcSet [ /PDF /Text ] >> endobj 157 0 obj << /Length 2480 /Filter /FlateDecode >> stream xYs۸_CD0t$ܴ7S'RBRvw H\"b߂O~r,"˘H" 3F|q5`-e.V,웶¼!1Eu7y6_bve՞WoZTk]1&oegyߞ~k7`Pd3$NX [k|jʛl%R3Cx}[˕TpIaȃ-&FR O Dmt7GDu3#&%Xn)VԒ9 jnzrꊺ"@ӷlo5mW0*xpt[ ٶwWTR1 8"% Rb$(=޺I+dѸwZddߍgؗ(n'8!E#tr:%qp+$,bB8ˣkbO$YOṀu]f-w(AP#-MtNum |?Y@~[ݹQ>cq-{*;g73%p0bm"HFNg# ;<iM& FKL?PsW}g;xaKj69-eb٢5zI *M#nJ+Z$1vQiɮ'ם3CGd&\#k`+K"AH9mG7!x\[l\`7Vh=:jGt{e!򙓱%VwpFp*fm^B90 HSK>K Λ= հ0V4}_3%O;4cr(4G8vt<1,Љ+X'*S SW9zUnE To>2n J3Z_^=i5FxW۫X۹B<[rT ˶&$$ajH{Dhup(C$aBď_QUU,vav+fo(:s[7gBlVJ >w^nZ"4ʇ>ǎ5/X󚏕|ZIzU94[K%u֎yPK8x۱p͐հ%jIՖav`;YylGh#Hq $0a ֽ܏8t2l,]aT%;3y4w A-@Jop^KATgG]kX13?YѴs*PT7S]@*0xDW%F]m[;gڠwJ `$/,[pLR7Cϒ fWuIr0\FK7]jg|&΢ػ06AΚ#60Ad Cr6 @z Ԛ ;Iw# %^R>igX)O9\P"(Q[km}tT,mƄ4m5n3 +j[J(hUW@Ew Kw0IO~eǀ:1V"ɇT .2rb!2 Xw'_O~=\lN/'!`{P*D@S٧=+`B@\y7#.hl]:V ҭ!F*@{]*x=):BVE~\?Zp3GE?1h{@4u6!tqw]Slfo]aDL o.8j]*W5ҙxw}rAYsJ> endobj 155 0 obj << /Font << /F33 53 0 R /F8 21 0 R /F38 68 0 R /F29 18 0 R /F35 56 0 R /F32 50 0 R >> /ProcSet [ /PDF /Text ] >> endobj 160 0 obj << /Length 2605 /Filter /FlateDecode >> stream xZKsWltp-ST!U.E4~.PUAOOwOO=RTZ]߮THV6LEۢiwի ~?*\Q$RcuޖH./]vۇj%:!^IVQ(0EiI@j!>&gұ*F`4$LMRGU9 IG*-0뙀(RjEy/CU i2qܟ~oj{ޞBCL#*Ϯѳ <1X ibh!QO3yG y y*ipO%OȨWic&:l#oc@q!`0pdFy(ĉ#9KvLB'eP=^Q{4h POI J<哐A6| #䓀>rkZWnކ1|E>Ts^ >`~zlf^#rRHVZ""VH_7 옵 P6'~tMȄq#NofL3QHvS"u@[7ev۪d3S X86sNs;!y8༟堽#&q1*a E$V,P@vv<]yL6sZyAe\( j.ǫ+<+IW6'>{"YWXyY ܎Ms)u D FfS'Z$;< 㲜 u9T_F0`&Bx",yPTi[Ou$piE{^27 ) S_8ҍQ`-e,x@vp亐ѵqƤakgi瓀+ OpeJŪ/4•n PGc"x+l1e0+>lsEP SyKv =$߳B:l]Cݿ._W~@} ү?ݗU{sԟbT_xBqv6uzu1]C0ݼkmjz~þO0pb]=b!180@ Q(bߏvߚ:_$Z;4:]IvX x_owj qi/8=̋ n_+Ϡ"BQdن- &K$So4F֐"_$Y)$p-j wүv"Fݽ Ca9\bWO;őK:-8f""WkmCޱ;2:?[:o\# )@<~Mp֨,ם kݸudwIr*YqƿqN"CJRG> endobj 158 0 obj << /Font << /F33 53 0 R /F8 21 0 R /F35 56 0 R /F38 68 0 R /F32 50 0 R /F29 18 0 R >> /ProcSet [ /PDF /Text ] >> endobj 163 0 obj << /Length 2995 /Filter /FlateDecode >> stream xZKsFWxHq8/ǻVv!Вv!)K."4t~'wj(Ih2|ӄPF:&,HW) &j2J8pT09T`d8΂r=rU,hP+բ|uN$@8OԈW{\\n?+)g]ÈTدbno`lI#&ui&0~;1l_jQk3mT]P9CFSq(M L4-E$HR/e2Gv ,DHyԘ70BB/a0O7t[^oހX3;KvA>/$YZbKl%8' z~V7ԵG>$5k-jDpk74"bn7Ĵ@RoPI&[}z:}ސRc4ʵF!=_VyaŅ Gc1aخnRWnP%כƬkf_x%ba(ECreX4;MO0ja'm`Ε0%%̒LAZn!'oI\p+z*_[yYsRolPvc@X04i˓8\>om dyv-6YY wS YYY蠵.A`Bcd„=`+8aVXDεfƽkҺ5J"MB7jޖE ꢐFaa φ&#sO>ϯe7)WC"JDX,r (b(`<[|='t |-9DzP{.=Ju:IP+v  $k]PJ` x<:?KضU}G聣G2` u&!ש!$g]KyɃ?# UPY7Ê| );Alɺ'$?T"mĮkCgFcBC, !bPf D ϋ-=C09P,<5wk[lX\ޛ7m2[AdM"T=msYXam._gn #a]y\3kk7@H]^Us"R4dJ%` [s@x ~ MR>u,nð 2 +ɟ[kzrb *>8 5?M.([1ϫZ[Wip{%żXϘUtRi)ګn0$2,uU-JAG )M{ɟc"ۼmOp[¼2ϭOi RZn1Zt.`ɶjVHڳ+5D=6 V9(;~GOBw.S24[so ; Rwpf8R& Jqo|veq4 'eviga\$Hjr@1f:Lt1zyb!CS?] ,9ZKU=17Nו~w?Qx$x>!~wjtѡP$^=UjsKmк-Wngڌ _j'mw]3sa֕Ƽh_7n1]- 0\r5SO s^2BJͤ?I![}kiuOVŞņ!ZnmsckSc#x>hsjLDf:LH {!p1A׳! a-%ځ3+H*!1vW_5:r ̛YΪrcrv=A*j>!=N|U]HB/F]$"T2 SƇvSkKQ`oЁ` /&xY/zӞt䏔6 ?Nq_>{lHd UZRlT Ygx=vlG(qrvd߃$L(z"oǧcm::rNe|;+{Ԡuz20y{{KnvAL[8l) >e7=آ-x58VmJgvٜS$VnGxyG#b¶F .yQ2bJNz57g:*1( ;br66(V=ֶJbhPޙ)%V>bГwb}(_ 5h ;;r>\? TQ4j#zѽW6 1If$jtn_bd.Y.~o.݋Sغ|28mՄ&]~mE“М ^bjYt1< A^eqyߗݔAU}fjK($L endstream endobj 162 0 obj << /Type /Page /Contents 163 0 R /Resources 161 0 R /MediaBox [0 0 612 792] /Parent 154 0 R >> endobj 161 0 obj << /Font << /F8 21 0 R /F35 56 0 R /F33 53 0 R /F38 68 0 R /F32 50 0 R >> /ProcSet [ /PDF /Text ] >> endobj 166 0 obj << /Length 1133 /Filter /FlateDecode >> stream xVn8}Wz"EY)NMvn2c ѭ;CQIڢ~% ̱ӧ*.r-w"æ]M,XZicμF+̀x`E#njjXԔ|\M*N]b@$h"YE.G6@C+JaU|bv݈'+Iٟ6u40~U +N!7^ bP/Ig)o4pZ?o[5q"85ԤnXdU@0dhA` bQ#x;edECX,S10}}y+{QQְƈ("iMJk*B!r06l#u@̱X21.KDrM2z.Ԁ %PtTIG]K?%D|lO?O(>ų[cfN^rKn 'qU-M3- Z =l;m`awB0cS|"uֶXg&bppӜv *XtH,Y5ʗgiمK>eu/Xi֣ׄ4"ElOmxI< ?xC:PZDEP &\l1€[8vxؙaD;E8mHg i!qUq}gjc i'*s 1]{׆RU70v<4"0K Qk?8m]U֗/'/\F-dB"M ?! endstream endobj 165 0 obj << /Type /Page /Contents 166 0 R /Resources 164 0 R /MediaBox [0 0 612 792] /Parent 154 0 R >> endobj 164 0 obj << /Font << /F33 53 0 R /F8 21 0 R >> /ProcSet [ /PDF /Text ] >> endobj 169 0 obj << /Length 3137 /Filter /FlateDecode >> stream x]۶~-o$'/N&:q:yHxwPLRvw?)]{@`/,vMp[\.Z؉\*EKͥʢ?FmZ;Cw🠧\as:—eß.42UqWotp¥S +"&Z8?2~5lSBfn,RTw!.~@R\h cAvNj_xE,`ڱ-6J?TPB(&*XU=)PwE zSwm} ϤnV^ByF٧`e@01fet۴/UDӇnDyV!arKzWUY3\%$jXZGKaj[ƙMdq%$c@*3 `?7K~!xW36e#T@VPm )&LfaW\wجUZ@3ԉ (x\IkI԰ );KioQ5[,0^3X@ÓI.lfDYijmP9ڶULְO'b::˴Q 6 y]BZ#l ~CCb,%yCSr;i` gV`ځ+{D 8 ɚ?b=tK rL%KЃsY7 Z5]FZT RVoꄓ=F+)TKܻ'0Y[{G\6EQ{ Q<џWޒ{ yA>w!ߨEZ`V[&~gP.B=g`GX9QAcA5 _ߚK p2Bo*{_ J`a: 6=i޳nj1m8(eO]+~?s༎<le󣄨y;}EkN4ec4*A @Fi>BK$R 0ޯ[${hSj nͦ8tJ8Rv6S"\iB~!/ZAZ j~b)W( H2d пzj?S'g?Ğ}A<( 5Cu5/ HRN¢##P%Y`q`RQ'O$ Q!9[3HN C! ZSH$8tZE x_p\aNB44CL5vQ[5FCfU38۲ WcThtW_@lYvFfQDEup5 #ΤPn냈V^'N +u,;X]ٰT f0Rβ/5K(H!_l.:Aq|CU٣}>.9C:817gYڠoHV[Ry ؕ[EgZn<JjeIt}C|H$0_O~%QHowl 'Im."xrWaJt+k9BuK3, zka!nf^C,V0=$&*1B&#zN&(&#zN&dL21LgYRO2:K'IL:{..E,IƓ(:OManN+@$z& бx ,*S}BML-("=D& Ec"/'K_qmJn 뎳~r`4`crlIQa(3v"#I g-m7SAdL4HPn 1?Y11܄8)٧j8u0R6z1gP<wE:2K.O?):D69*#7CB/5 endstream endobj 168 0 obj << /Type /Page /Contents 169 0 R /Resources 167 0 R /MediaBox [0 0 612 792] /Parent 154 0 R >> endobj 167 0 obj << /Font << /F8 21 0 R /F35 56 0 R /F38 68 0 R /F11 65 0 R /F33 53 0 R /F29 18 0 R >> /ProcSet [ /PDF /Text ] >> endobj 172 0 obj << /Length 2664 /Filter /FlateDecode >> stream x]s6ݿBO7T!@@$KⳝhTINo @I9q^"r]ѳxLlf3%f*6,N|Kgx<7\vZF]MgQ, D<*p-؊oayx_ o ,m;z:&.i翞"es@xnM rEsSŠ)hv5yWWyGW8N 5 I¯ B^[ĝeNMo7zSZzR;*zC#ezf$*3&bX"qHdml QA^#p)x6NweJ;P~{oxgRh&E2Rx%GVG磘Ig07fv}$=ΎP--@] _dA3їFg첝v+: c9.%TY'_uH>8q;OJjS)2;Mh;Z"?ړ#,awRLO4qI*ik"oÉ q]HŒkM]F5K̓ ec{D?tc>jGtdUbbW/:5=ʞLSQspGWJX?NQbgH5 T8ZV <}31KMRA &(8!h=#'ā pzSg>o&^ܦr1؂{WUUAspܧf9"3L 27g9Ba" K4r N( g"˾$c)X&x) *]P %96,Wolp ÇA _axqKL%7&2ըxP 6("y,R=}&rX:'LaN cfPBEvCaCqPfd~sz XD׽LZp ^ޟ }kGBHst*&cG{V3)bpo/c J0} =И`<ޙ}#ݶb]aniLfQ";tx<Rn(Ѷp._l\{L=Q;HH2e ,cw'tLa@oo#(CGNԛdgŭc {9ٰO[k2h`{ʰ̨tn՜`>lj>#ei߹ihHPY9 P.YfxŖ>{c9 [H`ɻ6MWm 5u\|]ir8܆(|kaSoZ<\*t^l]9xopsIU? ZgPvS P$IC|m=c^O*pBU6Kfܤ``G8V%)b{t!֠)ԣ9&c[נ9) ܠ|Z= py-<{.$?kWW<͘2 52)+z-+< o゙."C{)|2PB|:Ոa1K瓈!cNO;c$WM"0. 嗀2@KC&|]FLi:u]]@t!Zgf;aƐݻF3o'I82i+D*H0ß/ci&PHq_X_Vq%&B78 > P#4)pȵujbaQ;vf? KEYcۖ(QQ,;lC}^_$K.ozw78O"RD}"%I,ȄHI']Q,}R:l݁㛲~S$'p4JbWY&׻5G/.#~iEҖ .lmn\g16~[kj!$w?*7uO endstream endobj 171 0 obj << /Type /Page /Contents 172 0 R /Resources 170 0 R /MediaBox [0 0 612 792] /Parent 173 0 R >> endobj 170 0 obj << /Font << /F29 18 0 R /F8 21 0 R /F38 68 0 R /F35 56 0 R /F32 50 0 R >> /ProcSet [ /PDF /Text ] >> endobj 176 0 obj << /Length 3789 /Filter /FlateDecode >> stream xk #yC"k4Hw@gZgȯH%k d?욢Ùp8}w&̴Vy^ͼ$Wӳ_^-,Zt= kKyM漅jOP E@s~|V>-~{ËDI$Iəs:z=,WyfqDf0OX?_!Lt09 Y#*2]+E% SА9UYw#sB&;/i:ߗ6<HGLJ|~+!j\ox{ 4P]\gKm:.끜7E8A=T憉bO]de̓ޝq$ "?B5qa2c+`B:mbM 8c%d= _DܩK-*! UJX<.e2*a\bZlUyLTM9 ^p2#Hc[}7g^zPCk~A4`^VHoWPh&F"-8vU*VgjdحyкeBB=y `T3d@/.й#zޜ8,<,P2,l±d{ 5+ keUq1B&Sc ebWg`sQIxn6I@x,HMNhՀ nF[="pdF ʢ8lܠO8Xrܚ/ 05k&z%& Țz͢F-HAZZVt"Q#3eWl &"h427qz7eT睁F@ӪoĖ.этa[TI:C]4C,NJlOesW. Jرhu+ng)z#l8W=F{ǣGuDgiEZ|j͠tVvIj/;Uj,=a(ڜ٢@cԠ!`Wi 9O*ȇF3Eۦ9#ܘwx);!6~ `mvȗFg- ~+htF^rWVaq Zxc|g }^h 6~uIפdޟo]0 kh#Vi7߾;g23rOYh77쇛D$gcZzC|{&8|=Ȁ? ]{TjsaXӌ)M)<${6|v&pJ83s:mʲB)plBKu 0d뫆!pT,>Q*$=3tY|`0t?Ƃfiƍ *nٽ3.qeclZRPڡUM9^$?jٻj$˓0@Vh-a?7jf & ޶ g pGD_ XCJ⺠6|ϖvӵ e, vRc1k~)x*|tڭ?z4bcrxSMS8HlYwJk +^%yDɤ&zS3VĂԁQ ,[>JVq?88J(QоՋUaV_Q-Z"bڞ[뱟6(XiG\柄Ȉk4¥sZRx gY)Q`S e8]P: ; ?Zv `N̈́J7P8 Pۧ!PpM.#a4Q˞' rb{q$p\eE;*o$S.ZOsHa>.ϛ5GT%`[_cTeX_NJu)_)tMNitZRꇶE`յxשu TŀuNP\0H^om"Iurxzp5ͤ &4Տ4akA6bœ2k&vn.fWRx`zW\ p[u0ZX5OІE =<6gfy]S_MZEQR>HoZ\j F\?I7-R X͉;'& b`XW ?qIW3 !G4 ;_H ԄbōrU)FʋVmLee:~?!?@\Ԑ)CTDtb$|fCFrNE%}yf-_bCaZ/}0t`&HZf@i6hp!(β{LJw\'ÒL_òxFqzگqոe*q\ (hJ endstream endobj 175 0 obj << /Type /Page /Contents 176 0 R /Resources 174 0 R /MediaBox [0 0 612 792] /Parent 173 0 R >> endobj 174 0 obj << /Font << /F28 15 0 R /F8 21 0 R /F35 56 0 R /F29 18 0 R /F38 68 0 R /F33 53 0 R /F11 65 0 R >> /ProcSet [ /PDF /Text ] >> endobj 179 0 obj << /Length 2725 /Filter /FlateDecode >> stream xZ_s۸Ш3 @0i;sL]kә\h9(l.Hzb'w,jLD bH>}M&0 G߮*ͫhuE\.Rc>JNhaG Fvzŏ`0JYb3)dwv 3;ηˀia o HzTpJY#Z. %б{Us:fTCyST*7ccѼ%TW=)&MXsHn n9vUtEZ mBc|q:x@K0ɧ`v ~< Xx<,6{Z&5 bow͓kT,-c) PjnǬ4|f= p" &yzm!v)TnPm6u,-ŪlӮ"ِQYRT b޵ zfXTH<;FZ!; {l+.B,)>z5n4<R(Q:+t >(SW;`7ab3Ij{/C>z%,1[m.iX -JzH?eD$*,R#j| 2e_W]M?͢"~3\yȎ ?ccI"ByY:Z$p[kB97vp\ڴ5]$g1 ~_casc"8<cK4Wω1c2 |&ۏ1n͋L]2&4x/2|eؑHivxqʘ6C .X BW"["s (:N:FbOb!X<" %`(p b]D}A^SpW#f+`:ZB0L@ b= >$Z0nmx= wƂwQ`[yGsxu|b{I QUGG"6 =h[ݟ9_9vڵpϘ vMB6,/]RWc߸nIޡl BXrtPeHVljxxMvS;# 'P3/'ISqҾI4BC`Ztȫ7=pmKfBLQv+Sْ\j۳Z#ǟe_p"PBˬ-drwwM6EɿߟyS VcJid12VFP+!bzJ҆őYK>A)/Z J̰.w0M`B3Dz_f#!AB !Lzl } nK_aIeDl 01'8fBI:bYV 0-H0+bJ~[SG0{6]Jw6$*laf\'H2;uAo8f3wB*-(A,?=H8li MW}N(\4B@ Lɖo2%m\SVgM %/VrI觖>.^T#< TYKħ=Ů㔏)d4X)qdS7u7k\S}C,WUw)%b%xPa}(e[9͈X(ϢOfD Ǵ@}}e ){xcTE%ũ(#ҽt1><0HbZ> endobj 177 0 obj << /Font << /F35 56 0 R /F11 65 0 R /F38 68 0 R /F32 50 0 R /F8 21 0 R /F33 53 0 R >> /ProcSet [ /PDF /Text ] >> endobj 182 0 obj << /Length 3121 /Filter /FlateDecode >> stream xZo6_0f$)Kvڇ]V#6N/RҮW(x)7<8yE,..^a8Z\l~ ؝vɷ'""1/[ߜ|8p9 ߟơ|qsUTSZ CX=-g((۲=.҉|UF/(= eB9֑Jl˶jgKm㠅L23*AD&z%8ZU07g |^bFXUPR(*ju T0kk\jKx,@@!ISh?|p\pF8'>[+؞nc`WtQ$" {\K\ю΃KYU/X>E QtD0QHOօ 1-MU‡0]_u*¥߽Nq,Ӧu[MtN&DOx3Fi ex[цݏ-$M'WaRf^|^@aw^NHNht-4;=P3"U?*~C:hh[0;uAl┉]طۧ]u庨G]8_d_l63,u4-j3m:a He1*Mdvp=O;#`jiDmn.H[IL8#_LꈭA4*;}a_Q2iFn+LeSG Jl*GIDŀ,[|c8[A4 y.`O5Qc9rgHfY@9̆P fTEQ6D%~,ϝLCUœABf8'c=1jnѶ  Ϛ-I|((fd/|,4a"8#'aSG j,ְdCj-ɴMM}?V&L@$0s_Z]|IOSC@t @ZB?@Zn6قL?["fِO}H#FcU֥U&5"_qoMGg J|Aok3"Va8]p;~ Hqkd$OdD-?(x7@"}U#LS_!L3 ]Ȉ g[~Et ̶&hq^ ,$@~Tu1DӇPY |LIh[rDbXBM8$\hv7{ yמ r9̗j|=K Hk-!w;qk~%<$%B!T!P4v+Uz'lFrsH0K.^j :>ε(495d`A>dG =<։p#dOO(;WRY5$fԝAwJtiHut) 59M ᎟ d1%ڐB)[X;6m.$^O,ͽ5} !dl1(s;a #KÜmS}fƧoL~V Ցht~%@;7,{o@7G`UL70)>mp>>=`Y`鋃]h@}FH ~2$%y43ӎ3ʏNa&qǷ`tz3VkGUG5mTjXǴ$NBR endstream endobj 181 0 obj << /Type /Page /Contents 182 0 R /Resources 180 0 R /MediaBox [0 0 612 792] /Parent 173 0 R >> endobj 180 0 obj << /Font << /F35 56 0 R /F8 21 0 R /F33 53 0 R /F29 18 0 R /F32 50 0 R >> /ProcSet [ /PDF /Text ] >> endobj 185 0 obj << /Length 3312 /Filter /FlateDecode >> stream xڵmsF3iPcm]`I/Iݦqۙjzm?`% T@N|s?t)7GO_YOg׳4a"g _^^1_ O|x۬Z1F. 1_(yhx,i,B"j9 y[g;@t!| W_>`kw* KE -xacuw?[(?IJ nbU|Fl4 b,D&Ca]=\+ ^>(r#Q[Կڰed:3fMK,Ae0F^NqIb)dm :1 |5P#zBF2y8sbh/U`9K~=<9W_xMcgQeBi vX*QU^0G \U*뢥א(7Ek#FY::eY2r;g.[޽BLOb[3K,Xte2f{LM;?=a؆cFǽ! tob, lb֠-Ce%]E$Gph _% O03BplaЏ˟P:^RFGY:oK̫X[mq7` G BSAcq-zF'J;X뱈QL#BfF(?a~ZOYX`Vwk.I\zID"2)LhԙlV\b(Y4pW[U ew0$VAbZ#Ё:p\ .( Mm{1Ŧ1nnyY?HB;ge51PK!mo(u L$LQFRPt'8i15^H*hI٘ԄAK Yv5=xwS,/.llWgPⴻ%3lP>lD1=d%E`/6`ͱX h JRsqkSg&&6-0># +A~Az|* EH<daL Քd|~OEWSvrvݸk@H<Z%Ng 8ŵ!9| #œA[AUv"d84g"F>D-D4=dc# !"Wԃ,Q/\'! hNe9f *D^o'Ov43h_KNw= %9[ہ95 7=6>L<%)!;'JaWעllAN:ztFCbßabx<`:.ءE/D0%M+#=&CO $kfS1ЅEşNhЮyJvso6kw5CoTDT*0NBR6Fu"&iPR?̝I)(Q>yrOᔑAKϸq "BC=d8 AIMrǞ y1ȋ]CԧD\riبU aq-z&,͑h*/?ׇԐBe0`T (DБ+` |k&[Co567$GK1> endobj 183 0 obj << /Font << /F8 21 0 R /F35 56 0 R /F32 50 0 R /F38 68 0 R /F33 53 0 R /F29 18 0 R /F11 65 0 R >> /ProcSet [ /PDF /Text ] >> endobj 188 0 obj << /Length 3550 /Filter /FlateDecode >> stream xڵr6_Î܉H";}Htnw]{mh8H_H92H888 x T.oBH$r&X\o~]/\_E b!t)y/6Nj8&_R[OrY(pFUWq_BoB+.8QP] Ԅ@tܬ(Q4בd M"b8,# &<5~ˢ{~uj=L<0q$Id$L&] B$,jeUx-D4K=MU1> 7 \2ฒIq2YyNHT`O=#Tfs%҂Z D":sۑN`WWJ7ӆ, 82ǏUoŧO(όϸk~j(B9Na`S+ԩ"~~F:&`YвF+M $6DoYo_jw@$D2ϼ[ZPzWN`}Z.LB/ c%*L0Y!ܢ6 d™ΚPdУ}1v \%$݊^+MdGlJ RYd&]{dx.@EZC_%p3CfZ &᷋A ρkiy3 kJ-um|DBuBT:0K+@zT(*UQW9۫ #<[2> Iv`R\qބ<98roߟ~DSDQ`j L*Fhj‹]EfGةW>WY)O?`3i )U^PwITA/bŕħPulq? L-HL0;;'(f̸Ppt&".bL;.$R &WҊ~ [ OPY bN]ϟuqd-a9(<9LLn+:; xs1~vvRoB ~Ys&,S11~'OɗND9>$9&_ RL;mgL`͙$:- EFU-WS0+ZBSPUSDG[M(Ī?-"ǣ׀L 0'0CXT8&=RX5Ɍ.߉w/kRݽR~M|f |խ+eb|0͗>CBe1:N^益eS=TX܍-\NHf>DL6: }OG~1svW:]#_|9c@ uC@ i, ;#Tu1c-Oy{ }|7 |T!$ y 'T.uH{f)S)} 02b{v04U2TZ ȷr t7% heQToKF B;~Joknq$zG*6uW=׍5GUɘi-x&JdNL5ՠa*FZ&D@wSXP ~~m~f)n-,9z4h]ʶ9XdzKl7<aLl)0\a#ct'߱E>8 ֨$&Rã=.:y6.7I8 $eŸ{cn0n pG&6CӘ|Ղ0@u0dMrV/O"҆8V3vnޠ!l`hZSKm.[DﺖjT7 p–j7v.Qq/<!ʢ$˕61h3Srf╻K.@9lB (B`x_ >/g"ו^\``w|HжPFX;"Psq[b#|G,)qK$>tm61寮3qLco1b2wDg[}$ɵ0\;ʢhnmp* ?NT<  ) 0L6[S&`9ԯGWl*.#V} NLeM= endstream endobj 187 0 obj << /Type /Page /Contents 188 0 R /Resources 186 0 R /MediaBox [0 0 612 792] /Parent 173 0 R >> endobj 186 0 obj << /Font << /F35 56 0 R /F33 53 0 R /F32 50 0 R /F8 21 0 R /F29 18 0 R /F38 68 0 R /F30 43 0 R >> /ProcSet [ /PDF /Text ] >> endobj 191 0 obj << /Length 2402 /Filter /FlateDecode >> stream xڵZms۸_ӌ3Hf撹w6׉)Fl%Q) lGLbBbwWoQ.QDU ]?N/ӘK:])֧I6Vayin}6 WX-3lZz jHpw}^U(Ԛ6 (y_a+D7{f7 /ݬX#K{G4'R(-u v|KsC&ָF$脂fӟqoQ)G-%I2ʼn$)3Zϖ=7`4u'AO:~QR5>c=$<LF {k՜1&WDf>r9(k{W ;'*).|y_-9K_1 i_k+={CUv|&ȹ=᪨)Qi*h '%|vUr4$Dʒ7Zj>(#T&/bHԴ,pDݸyZWV["psF,bI#rDVi4 %\7XS”V\Oɇ:a+pF̺ LXh]3́P/A<JZ,BtFF%ca/}/umfg/Edmiګ hvY{W @`B+~nz5!AiԆ"I"hY$dviXH4_}Z)y1&Q4$E$+=NA*,JޝBLaD=LR yclRp}N57C{ؖbG`X 6|ùEXTv$f2i ;,V쁍%6G<20).ꍟ=tѺ|u)fmuS~FRi:*Kݺ T J)?ږ*$u xҴrdY$Yd= *~ٞz 4Ízm9. Skt!nj(l6icʦI3KI8qZ T~谨 GCHvMB MUgwٌ xxg"FYM-yTّX68.T݆:NيD%ID։gLO+˛s~Mlje-1~> _UjC #,>G~s*h?(z,V>w4zaN:Go|l.[ d,gSJrY<:2Y x_pwGl~9iw Xkv^Qϻo4u=i*Ǝ(!D&s\{`Dž&y|fd9*P? o0k9~}n\Õ:P=n8O;[Y](vsE zj*A7ߺQمz>qC=.9^˙>K'oOI(pBS7a湲m=sayY}ih6*fx/͇rk- S0Dx*aG\+BT%݆J7hMPp? )x0DDm`X@& Xmx0 'abfN1dnl]cž 㤌?~n-qb/@v>7-n4'R>*pXUeG׾ o?Sh} AB/_KawEit/B9v endstream endobj 190 0 obj << /Type /Page /Contents 191 0 R /Resources 189 0 R /MediaBox [0 0 612 792] /Parent 192 0 R >> endobj 189 0 obj << /Font << /F8 21 0 R /F35 56 0 R /F11 65 0 R /F38 68 0 R /F32 50 0 R /F33 53 0 R >> /ProcSet [ /PDF /Text ] >> endobj 195 0 obj << /Length 2876 /Filter /FlateDecode >> stream xڭZm! A& IP8{Tq|l[ޅtϋ4ڑy_nr6H|D0.G)]>&/1ىţRI6uBgGtD"2Q$KItqx4;G?ńgjt 1Y6Z1~>U9]칶3rJLѰYq1X?iC5}:8ǏϜ\~\5΀1!.ޮ!`oS! OwIh uY-%8 c C]jx $+b NQ&$͒QP[;H[ uf)pNvk`vJR}ċikкֶzp JDF O iUEN!P-#h5ˆ4"d"TSXTr!b<'`)l=cvx bp;M NAV Fڍ1/8qQ5f!@pBƍ"6^׭s+7x2끚w+M Xl̷˺1o14–|fXK'd/t/mJ͸rmBd:_X%mZ);}b"Lzh3p%@#TX$/#y)I]p ʜJW:O'9 m2ID.id1]?SgjJ\r8e>oy%~ ~_ЍL*og|/ DvHam .]U?A"Scj$2vl1"OYx4mD| Ihrf$%Bgo OR0"pd!lݵw0(,\-`$$8XU{a` #a0~Zkg4Y] T؊ 1˛\7 n13=iakMcnQ}d0_ hZUmL 3.Ji/5VRsLRH ecٸx &BDiO7+Es|L[b[}mnLB0pպzZ)*lDqg~4hqЖ3kXf`se)EŴ8I%HAoE%v۸@"5*nz w}АQ젲kJ+W1ZPeZ:-⭭lF1;SI9tM{d),0D2x,!zzzdDۤ#5~8%5:֥] sk2\nJ lO&i^~OF[/V:gMj2-}$\-rpSgvŪfqO =\.v-kФJ2É׊uСc$1?ћOɆ1glO%;$z#ROSv,N ֊2Fβv ׸<1aotTl],\wuo^uy nqJіI C $\2Nhz + Q`zw6;r}jrM[s[]i<cDUذ.;hR'®S;+nBro)&f;NϾw@8*N+ϖĺ*JTt^Ox<ԵCl@v"6cˁTJCL%zRߑ#dtEB\%Mu_#}>;:J3 BLRȂ`tEzd> endobj 193 0 obj << /Font << /F32 50 0 R /F35 56 0 R /F38 68 0 R /F8 21 0 R /F11 65 0 R /F33 53 0 R >> /ProcSet [ /PDF /Text ] >> endobj 198 0 obj << /Length 1977 /Filter /FlateDecode >> stream xY[F~ϯp@ ϸ"*,ReBdm,{lH*6N|͙s e%g L' gsMχrp98{¢!,"V=tDt#z ွXc}wQ>' <$i@(y^(& RnURc#+cҕqюQFwqdCh W} qwȥ6+jH0FJ`pEb7 f9A`Ub!Z L6Nx=%e_ İnIYTbw4R:t_[?v˼ a%ˮ:%/Vw6Of%q欁WVߩ]!#6P3l|y/GbXͯ,{xq/(g7*"Ң8lS`]k3-Zkݲet z۝]fOӟn*'QS±'ռ,ٲvW (rQM.-8Cd.v桯='Q&Ƴ8x?0/+A#Sm"KTW cK4eWv?i4,-<h`dAƨX]8_V٨'t3۞SAƒ;. )rw8ŹD XRлZIw)uV֔`jj=)-9b;F]a3a%=VN+mE(f Ӎs[Xm:l1ߚC3V+9&z1u?YV!+py\q򹣷ݑb4w*!CpKͿL>UmJ[4埫TNכU3;n2 Ԡv6"n 2FJ8O͗ ~7FzuvQ.YXT  {F;duaiN`KUyW`eE9Iqϫ:@~/ eZ7v c퓯eYW* QAURprVU{i>vBzjO??9})g3 DΥ)w(LNsG7`=el+EX3}V`7Ġ6UۏNkZѻo@+`o&:ҜCf/z=V:[s Rb4{#qY,AϠm?T`Ks-<(PLP{Pi+BPdVgF*>GL;m+r(' -ݖi#zzh`%H@] X03-EQz$GW5 ל #Ğۏms;V!oUh^7+$ *R'`PhPԩ|8c Hдy`t>bάmRH` zm6v cYoY˕1T XR\04TJUS+?X_5*M]g5GwRZeva6"3'sڂ׶>[7GvIcULc,"PXm8V9 Y[Qc|Uoӌ̥a@>M^nn wbNkɸpv`֮ٙ\77;;_-Y"bO)/I~0ׯy0t'UUq^sMJ 5Z{UfH WL`Y%9 endstream endobj 197 0 obj << /Type /Page /Contents 198 0 R /Resources 196 0 R /MediaBox [0 0 612 792] /Parent 192 0 R >> endobj 196 0 obj << /Font << /F38 68 0 R /F35 56 0 R /F32 50 0 R /F11 65 0 R /F33 53 0 R /F8 21 0 R >> /ProcSet [ /PDF /Text ] >> endobj 201 0 obj << /Length 2988 /Filter /FlateDecode >> stream xZm67]1")J$&m%A[[MoCJ%;ڇb,>C?0#L*GG0Q9K%]Oߍ4xeuZ^eHβD&8qg^<x,z4Y\|x>M//1Fn9fܘ"nB߫7ȁE#dN` &teyBΫK8' (00(Շ,3.1{>iWfدS[e(XR?j t(/L1(1K4;(> ʴi\ȱa)RUZ]FB^]FAc7#sƍG8Q̉HkB(nhe 53P#%LVnJYb%8:) w1e '1UoRcuᖾ"5G INhp]zeȑ[Նxw%ꯀ 21|zl/x1mo햬vo z̗#|3uNo9;;ޕ d4~uٮ9 k;. B̽alt/H}x{t]ѵtbFv1^xd5(j^vu]iX{d1C>oO&wTLk*l[ L;nA~=[`|'M8:(쫬[DJg}I&,5դ&;ɖx ؘ]Lm\ȴ*1[t(5B: 9 xhE`JU:hh4tY`Ox8ƵZp[Lzkvs(vNvK^~7BT9p'0'fjn&]ߡm?cwys8s'4wYP]سC `1?]?,S(ytGz'ݞחOɓx;i 3B$a!?依 ?!uiy&q "@:JPBq:(g)L5Zz:d>OMk6{iAWR(Mbqs82=sZqsWoO>iO7Lz{ٖ_:փthDyw;YԀI&iqPQ5PhHߎ{ Yzr=|.xx7,\!bg C#_@ړ$$]pje/a(g.v{޶Ne]]׬"a\񎅔ˁ 2yS9>bWpheE$]m}=0f"h im@ᶉOt߳ MyTl}OYf,N~Z+y!| ֌C{. _e|CL-oՄby70  fHS\D(WsL]ρ4,U7O;L#J1XrN" E n{)9DiT`O)nC;ۧ ffysXǩK%j֡ 4 谎hQ'6*8deib#w'K%LEPɂNǦCQkRq&9R.|ri/ry @Yq܇٤GZE am2/%v]#m{ZܛUtgVヸ ^6uZwz ]birX{Tv!t0Wnt3ά\:tGy'SLkMȪ:&D&QiWUSX. 1E\ӂdB´їƏtji(iE|[Ptź]ڶ--4i}Ԥ$P;L=f`E!]죑{Ux뽙u{*}~ i@H #=QH+ 9w7Ww~+ p\#A_ x v@(l h kÞcӿ>~^Y;χk/ɷP{}*!;>Bl?A*f^5!sFPIg@AW*sEmH=<XqΞz endstream endobj 200 0 obj << /Type /Page /Contents 201 0 R /Resources 199 0 R /MediaBox [0 0 612 792] /Parent 192 0 R >> endobj 199 0 obj << /Font << /F29 18 0 R /F35 56 0 R /F38 68 0 R /F8 21 0 R /F11 65 0 R /F32 50 0 R >> /ProcSet [ /PDF /Text ] >> endobj 204 0 obj << /Length 2101 /Filter /FlateDecode >> stream xZ[D~ϯ0ZO~QRV -r>ġ6qJgq٫o~ %!Q5M.W32,%%ebqQ YxsXE~[,,v]?}|I_rB4CXR{w2Ʀ]PN#͗vNHBAFI-a$Y\NN^ro'1#bLr9h.&gcؗ}8̈́宬Nc(fBV ]Axܶ,.ed)cHp: Y5H2kq]l-Cg?loݧc7Qr$؃ۇSXw)&RM̙ۄ-*$$LFšH(w-y xV YuUR?*f z'N"'~L!NG udI%RDi"uP+QI!9h+ӟ"/w*\R)ہn4q2<;:tٚ5YVk_ZڮP1\ luxQ@XӿwRl>F.P7e ;p T#Xv H0O6P]˱tUTҲC~6|YS;~~Fw<0Hлºe,Bx9~fCR{cl2.k ,]wj`9GPGPR_ms1(ay,°Сu7*ywf0j?ߟt;|` Y"@wڮ, 6ZŢXT%D8d1Vey/OԨJ ;B k46̈́N_4Ϊ]@Բ &g ՃPjYUmӣt]: A`k_v(CJ ӬJHf*W̺4v&h |1$;mwQWNaw\f6vj $Lu%u4RMv{&+1 Huz@v"e c1l.۸T2\&YTs$qe$Z߫tAŤ"!C*Ү[n4+FLy+m*3gvu 6VⲾz܏DO DF5i2JPqm; r !ȯ5TiT;Y o25ʭ[L.Cv"?:6EGX̀>  _ A֑ @vi3>PE5'vVu d!nc>BZ[v4}0K*ni-&1дzLXoɏˤm n!\t͛B%fF &YCVW|~i>} CPr(UUOϞ}ܾ"}tcASFBc g@֦rR$e+OUI`9zIl&ĺO/\y!_"i0I&4R-ʍ䞊z[ng|M O@P4yC0 Z}Asu`g~%,֭*Q:aF!v@GɠveMc IEaHƧ6j4>0D LxTj][K^]rA8XsK/E s/Eٶ퓴coQ{ATl_hyM_}9,H7 F!_$^Ychlk7G}wa &~%EFBjcPMs}VuB5FkN] sg5Vwure>1ir17{s)!ّǮDW[>M,Mզcz_{5"( 2ǦJ!ھiz endstream endobj 203 0 obj << /Type /Page /Contents 204 0 R /Resources 202 0 R /MediaBox [0 0 612 792] /Parent 192 0 R >> endobj 202 0 obj << /Font << /F35 56 0 R /F33 53 0 R /F38 68 0 R /F11 65 0 R /F32 50 0 R /F8 21 0 R >> /ProcSet [ /PDF /Text ] >> endobj 207 0 obj << /Length 2054 /Filter /FlateDecode >> stream xڵZr6}W}HMJͤ3nΤ8+Τy`,:TJڿF"HArqv`~O~D!d~(d aNza;H,hFh[ovW{I"Vh]Rz~j?ww$X&<v麀owOSB%" ^n$&'n'KCV.Pf[ \NÈg,ӲnyyQj|rWj310jfA+>ғD  $2d >n''?d1ʓƈ(N(RrVɛFUuM4,GBfC KZE(جah9A <4 ɀ&A춲 v?("QGgF NȨ@Lr+ u} 2bV{vxC|${^kF(@cg `S>D4Zst^ͨnU}meX7# ;̷r\IN;ծ)O"[3ؔnSuweak쫷Z"9Hޔ"eBK` =܌*ē@Yd$ m6x/^Ɯ ͎ejkӰCL+]r}hH(-6][օIT[}-J3he#C+ EC(0ySUd4c`N00 mm*}H+WHqgT1pz]8)M]mZ{P[,y>#0f8!P1ap# bs!ĶyyHza1 Vk"x C8Pm=⁳So\~(P]D@itj^l3-ʞag"Grўm\ [` Iv[t 8hƈj D}g^g (@^ 4 8W b{2fJ맔=5(2|OU)͐ 4`ņBRM~݈\ .a?yQSv"ț ZRJ2 `{4#لx*b5:J_kKQM źE p@,;IA c$/䁱$܁X}@LQ_#ȿg \2@TҾM{τXe ϗ",M&BǠHPb PI"R}^s+V{1Z[ ,o)QkA95ۺߌB3Fm.z.34͍%5]d:$(t/2 \>]CCr mj t>pV[C6WXy: 5>nC~tMh/ʮnݮ*fߜnBQBυ;!ZlؤHNP*ԯ7sۧCvr-O -r/#URj4"rfx9N<ѫ;2.TuWJ~KAaCd]sb7D`RskٲbqOF5?u5d*k(Rp1ٕ5$PC+TC]Xڼj# K͹eٸ՜@0I~!_ɜR\HTJDwE/s$]op##bDn=SpN ,eߜ %ձx^8ؗhh<bZ̋ f[e@r"v?Gj!Swz:񴖸/: ^b`i{`yZ&k= Sjj>d:h%.>E@\9(So)={w? t þwta9ǥr=1{$w _狊 e -{~{|CR!K $H ׶u#߽zŃґh}+PƢnp-?^!\+*Z,Y>ˣݸZf\bQW殺K@:XF zj#o O% 3 rM h8ɇ%kY2kCCIiM#eT4G4%:z M$lڅr*EX"Ή$Ȳ6 d!j SW@;1Zۇl8{qRg_(\ C.DVg1vH'NVAy$ endstream endobj 209 0 obj << /Type /Page /Contents 210 0 R /Resources 208 0 R /MediaBox [0 0 612 792] /Parent 211 0 R >> endobj 208 0 obj << /Font << /F29 18 0 R /F8 21 0 R /F38 68 0 R /F35 56 0 R /F32 50 0 R /F33 53 0 R >> /ProcSet [ /PDF /Text ] >> endobj 214 0 obj << /Length 2489 /Filter /FlateDecode >> stream xZs _tDC_Lw;k{KdY'K%%ݗ L[r4ٙ>Y@A?^-Og3nY5㡘ݮnE pT녘ËpD͋d}U6=u4߷߫h i̔3ndMd=0K+ ia4{U6RL$ 1EIlgzArFNRi!b:Iw -oW*L{\,{KhMzT gUc&B(Fv^J9p/|btjA-sTmKeKJ XӧmqLIU@Uy_e]s R+ML,)e1OJK"QG>I484욬)L(:l QfM&…=>Ur)32"p>C<hVf;mgTV(۟^OR!ϕ>$ޓTԹuNRo,3vk&N X]><cwmϊ5wRuSTE4Θohdoaee}b[:_{WtN#3AH<چww8D,L=uWgb&dȔ(Lj}|8S:=3gBJ2jV]}*_"R(ԓ%)"1JtʺWC;k}3tHlOⲚ*9\x(!uol(ȚCLӷG}.1EO HKߐ3_x=_('Pl8s, lW|A3%^10 >Ӗ`:gU tʤTyD!T 1l:K\d0͖*!e*LQvm'v)ɃKZ.,_mVFVN6 (JCZ   Q/mgJ7Vi^kBMY@6 #óт[duwM4^O2MCCdmz  FK!TͿ; qSuֶv/^ۈs"}F?mw(Qm#1k+wxpyih;-Zրݾ20< ʜRȼ.&a'x'&=lX|=-'#ip ۿ`~l`Yu48fa Weiyk·|Ѡ~'߼ JĘKƶ_Q_f [z!8d (KhK j ՝ -}@I:GXRګ5%Z!"z_^>_^BIzH<MMQ+w6 gKV~V݆Rxխyk|fJ\ի6 Y輁KDÝ6t)jzlRvpJ!aL+S V- A"W*KlI+ͬd3]=e{aS#uW".#ZD ӹb.  endstream endobj 213 0 obj << /Type /Page /Contents 214 0 R /Resources 212 0 R /MediaBox [0 0 612 792] /Parent 211 0 R >> endobj 212 0 obj << /Font << /F8 21 0 R /F35 56 0 R /F33 53 0 R /F38 68 0 R /F32 50 0 R >> /ProcSet [ /PDF /Text ] >> endobj 217 0 obj << /Length 2925 /Filter /FlateDecode >> stream xڭْ۸}B!vR$NvsS3v8#f9,@PH`h4ƫJ~䫛U Hn?yE]oty*u I<?{e(P!n2~k҃{qh\g鍆Γ9gu;.XLG1n)8JCK(׸ N\<HkQ2Eqϩ$,P~NUEנ:)BI4Լq!eÙ }ELʳYV(T[10G,m -iKt`k(Rv}L22 MuJ 9,[n=26[ 'g*Q=2/mo=o=- :c,dӐq+ܹ_XC{U8ޭua͙IWR R <) n*4DE7AĀ\;C)^!п;wM4?\YkF{?AʉLIĞ`n{ jaEퟔ]X8ߵH Í@:憅BR XL_82KB1+3q³HYy_90p=YR!!^/1lϢi695S4SVdz UŖZy0hh^D1ǎgjyܺ8E1ܞ=w1D6>D:n;d[mCEPw(יNْ^K}N[:VuqfX 6Q7 $!Γ6XGQ2hntAp)"}VF]~:Y>o9_ONzuf131$䊚BE2D!ʴ{)Oh:>pUSZ:0m `wKqkB (gBuma-sس]vhe}=71EPڈw$IҊ[DV&@Vh 6kQ4*mG{g2]HlypGHSb 4@y߷46ºbx<,jcdNy7O]h׹yФigO>lԸ 9$QrI2URp(_uIcaDsCz,y*=e 9<zp_r&5z;.1ƥ<ݚҊS>f7K:IY-mLJ[DUhhRϾISK"+`'}& y$> endobj 215 0 obj << /Font << /F8 21 0 R /F38 68 0 R /F35 56 0 R /F32 50 0 R /F29 18 0 R >> /ProcSet [ /PDF /Text ] >> endobj 220 0 obj << /Length 2939 /Filter /FlateDecode >> stream xڭZ[s6~SF)7!f'i;ݶD[l%Q!);9 bù]_P Ì뛅1bƆ2Y\]~e| >W𯸌e ;0Xn !Gb[:o/ۍ5X2ruUʼnJ;)rq'd~a/$aF)tb=<-VFo,tg&q sOXAWWV AXa Njo</yul_Bk|"x,HBKPVůNjE"fd{,1fd]m/.AE+ {h.ɘм[Zf B e@`B°N֯3^yfL4kLd K^h[SÊxg W݂HΚ I!E@"< ' F2GtZHzJkB{Z?~{Ut(ô44ceƔ O<ӀVMʄ)v "Uu@2 LBa͓SI6 ޟ(6cҾtAĜ5)YG3!S}xwְXI]mN .`@.P)J3bEؤؽ;h(srX󬔠0Қw4МN>t&9(A&LmcEDGz~A|L<7 I68`x70ײis , iBŊexfQcl"Az0-FeM4$ -y3ثJ;^mbߺBT2HFZH#X&gzAEքs,s$4>j&<<58ȉX}ETI Tp;vqUjxHd牫ة꧐j/%L$?=5OLN֮q18pgvap~Hȁ^dE}P}=N}%)cYZ&(cM=IkrSʠ\y9yz58zo< uoP96*Qd`:xRU `ˌCY\B(Ln[DLÚgh8Box,Y?zZ}ev|<%TsX"e6w9Z6:w=x1ȓœC3Cl#kz~k&S}_vns]}աP-\8rGLy[jG *AEU =cWM$.W͌`/ǺG\,63G*&PZ)zGpD: #e<MJMVj_e$E26KL%R볨Cm >5Péaf @FaAHf'bkc#Ք$,UCt:GEZkUkwwi5Lձw Sec9A-Ɏ,\u(;겏V";v^A-.$&)ԜaꌥPql0ﰢll)&*z/Ks&~k!4!c8:~_fdWd\72 E|Jj tBk,PX]}~YJ{Ѵ tUYpk|i?(~%7mQ#@^ K5%Z ~y͛mSaXjȜA:5_[yiJTB^ )~p'՞n m9ng(&wZ(^:aU'5˚7ձd{ÚY6L$R63+ U2N@6<<=u=q| *JXMᄐݬ<8^#f0n2A=oc#9uLؗ-@`X=+)WV"&XAn}hD]"E%o _u=VzUMSaޮ"9Z]έ< 6=h(K1|vuex 5Rn]o.rZwtXGV]Q xpSR~DS{6Yǧ^ϭE=ޖ]@ƖRN/},}>rd4꾖‹-ۧ5NvC&3KuJ3GOU;7a |׺!MDJR@<gW`c%v!8aҤ6r>qLoDkEq כͦ:nSnL/V n Ɠ!Iw18yAoQR]̂Fͻ L7/ش1K>h®!0}&P32o C endstream endobj 219 0 obj << /Type /Page /Contents 220 0 R /Resources 218 0 R /MediaBox [0 0 612 792] /Parent 211 0 R >> endobj 218 0 obj << /Font << /F35 56 0 R /F38 68 0 R /F32 50 0 R /F8 21 0 R >> /ProcSet [ /PDF /Text ] >> endobj 223 0 obj << /Length 2575 /Filter /FlateDecode >> stream xڭvFӉ3FcS^vL'3OrDB$=b\SU 4^f/յog'_RO" 2K.gGfa8G&DUnr4rTӔocw5c_ht"0+tt5o#\%rKp7ܔ4gqqk|UG.ϗP:6xĕ6[K8',qq 8xH\Φ"Kz!@Did!|CR$ J$pqVN9?#8땡xw1(*ZXV/ a(]cF7|Cq nyY0CgULѴ`F&$"oBءHW}DY E3ea2FA "K(&Z(蟼"ܲ8 f }º( P_zk!'>=)Ƙ[R2Zox{Q 7{ ڈr]qm![WL~@ gƾe>8w ;tCޥC'D0gzT(2);eR|XXgEEͅrq=s  zs~ΤAP(%B:;Jo4azy;ia:2=8DaXް>+B%txQL?P wYFBC<{W1q(:Џ":b,fAj-T0R.FxiHv&~dHj'4ԑq\1[V[Χ6iC"ċ׈>(EZ |-,֏!M^2Ga*8&^s+uدQ8a^EJ<>jĉ#`b;9.VA#q_`$R= oaFE;2J> J (J qq:.XЀ8Q_#𫼳+XHX/JtZC-t @`P~ kVT^wH:~aԕ'(H,ݐa9A;y_A֏%Z"FM8D{*8ViM$SXw'\bM75"j2JeōYQl\1j#5Vx"?2 FnPa"P5B8Go/EA5.2"=/)Κ-6~"0]K8]:L7W4!ZdcgvY\eYC*;{%t[pQ"p51\o00jt|1AoyAA[Q^ 5>f P7T2z^.,UNSAT|4uԨZzΝ1,, ZA~]$o\ ԦA{W4]52a'J@e=Ӵv/aLQӏ5Ol -KƖ ӷ˙vC6X^+aӶEvZ1fk"fMp@A@k8 n;=@6 LT5j.Rs9JTNιmNYw4OnԾZ`\ph 1k"|IZ0E#cQj55JPƦKsY< +AṜ9bm;3snnqG[3DD%~ Z׀+eYt5)7tи bC&T UW5E knP'ŬsEiu>`ֽ4!mC)G8(w}/p9 ~II.OJYُwPnIJ7p1:}1.mMqW%XxuXq8- Ŏwj[rE@dyp3rT3fYeO,Z6wzߡqh]?G~Up{5/h կSf76;Lū?N9=]5bt6TM;>JܭJ'X߶<9d406#|2ĒܡY&D.fF@S1i쁞iR &\D~pupοp˿ӻjjfOne7!L,G庪xNSmr$h?ve5ܹ{+dwɾ>A}=Pj/1]l9OcQy;y:){X6^Cdżg !&H ]@~ ʯK(79Ï"EsP~NDD8f endstream endobj 222 0 obj << /Type /Page /Contents 223 0 R /Resources 221 0 R /MediaBox [0 0 612 792] /Parent 211 0 R >> endobj 221 0 obj << /Font << /F8 21 0 R /F35 56 0 R /F38 68 0 R /F32 50 0 R /F29 18 0 R /F33 53 0 R >> /ProcSet [ /PDF /Text ] >> endobj 226 0 obj << /Length 2479 /Filter /FlateDecode >> stream xr]_CK7v&qN3vڝ$&1M_sZ3 gbzd(0|%j,~ nVE;DҔDyœ[ hXռn6X#\KygqUd-wP0/,-m7!pCziv;KAWfV | o,lcCWo7ߏDj$簩 *%΁%T(pǩFicMYU:睁bRaGǯrJ{kyG˦'Dd&;Kᄔ"!B;Q^,޷164ͼmO<%i'0VO| `= Y1Z1nF"t_!l+KϽ̄[R[K /@{U`#*p2V'hB}ĥ,Ѯyϭ0~>OW Sr{>Bb)/*G"oHJX޿``:?yI@-]epQK !0%8mLS@lTbhS H.F ;*RBig"I\8\GRO0RǾH|WSUzd`|s4'[kPZ8XJ:RW'D(mHtCȜauۃpA >{_&"EO\8]t!+| s*ąvGAjjp롥Mz""8 cJ :Z:TfÂP,@e; nԾR;Wo va>6騈,ՙuŸy$ Xu2GX=`]{K"܇rưCB~e1q>א)XzbzOvq&:j]FNJ1ɗ2L&BCrdok}$k8d\8M J|+o?7xG 7=Tddg!x ƕMEW:4?Θ41LS?TYGg5fo?!tVeɫ}NJssa;@ފÌ4L8痣wV${vQv}l.<\?Շ▛!rGv$!=> endobj 224 0 obj << /Font << /F8 21 0 R /F33 53 0 R /F35 56 0 R /F38 68 0 R /F29 18 0 R >> /ProcSet [ /PDF /Text ] >> endobj 229 0 obj << /Length 582 /Filter /FlateDecode >> stream xVAo0W zI6fR7ikM`b&}BBheR!{dzx=tcYky4bb#v <"o8S}T6Ah^kb@!21ƈ`_7 kCB ׶KEE-M̨j(@%Y." "ԓD244+PXb1"W<N x${`hv?S PA0O%B 6Fiqc1KXqy풂 w<_ĬZMs%KDG|ÖhL"W{2(WK&JўUoR+Nr% /l @JG󁭀fΤOZQndfԚa2BC]RM$`5Z7f#K%.q,swQ4GH"E85=^≮Pc}cTj4Qx "wAfy%b6< Lk?> endobj 227 0 obj << /Font << /F33 53 0 R /F8 21 0 R >> /ProcSet [ /PDF /Text ] >> endobj 233 0 obj << /Length 527 /Filter /FlateDecode >> stream xVn0+{!-vVj{٪ꁀZ cjkc`I$jӶD{ C<7ű,CQP6. s;kotDIPc)5 LQz3*L `"@$2E(?NZz r$GXmR鹝Yw-ej8*q{EhEzRjTi KVx,>boTF EAay?+ׅdL{)9C, Ã>3TzipA oMqXAX bZ]xK^5?ue^Z!5[KwbˢC6rZZv4wL80r.wZЀ//~.:sGw;E6Ac#OtZ "SsƐR:Y +ˀA7rMN3B N`%fl ݥចQ@ty4y9n{Mn_N endstream endobj 232 0 obj << /Type /Page /Contents 233 0 R /Resources 231 0 R /MediaBox [0 0 612 792] /Parent 230 0 R >> endobj 231 0 obj << /Font << /F33 53 0 R /F8 21 0 R >> /ProcSet [ /PDF /Text ] >> endobj 236 0 obj << /Length 3011 /Filter /FlateDecode >> stream xZmoܸ_pq:"7^E{+䃼] ֒6Qw^HJ$hd%gy'Ӆ rH" Bܼ[^^g+2:[dYtqk;PeF@ʪ ef5I%\רwiywEXI-А g@pia{jx@e@k-0FKK0T6 ..vmx!:Zvt`? :=]Q[ $L @Ju"D(be,4 1(>* u:{}fEp Adcѿ6і ؑˀT$QKpE=@.+'eg]yrIx?7/.e7 80(wx,dVXCм- h8gۑS$xB CRGabEX́3nyxmNHq{H.UVU>`v B$QֱKTV0 ,`5Ggֽَ w eR&fCGF.w$X|m-<B؟(aRcʓ'xQ+'k5fJ:"S!*r'DU&Sd|)vy㒡#;)`T* $XùY_;O0y9eE4Ez4vQߖ&hM0q&;A>@&a&T$MwPc2M>ldr.\|*C x|EJPViñ.l٤-v| 4_\BO(8N78< 8aգQ< |ImG ;4AApC%%lɫ% Ki_t Rhz#EM~sdBB)%6b9l`"4 tfn)GaOIy N<3r}l'~ߑ(\U; }tJ>zϿp2Ūmv BWUs~ZsI+c Ɋ2д+# Hdi<e&w5ޮ{"fN1Kl@N&DˆB!U80DY8I80:,͚W.хSs zPɽv;a><E;$UQw2XoW*I Ce>">Te2y1gDJ5 Od nȹhj++_,lX[hcid`-ffَTzIC>BaĄb}S$u)ӌ7}9:Iɻ6}B ܓQk$ZOT orz s⒫~H'"C'т 9K׀HWmkl0];tPS~JFd?Aben\[۞A2Xof9=nr薁â/ZJE#>b !w>+KY-yU[|Ց[U*+f|?Ӏ@hciu yUW]^uN~wJ קNrKFIal-nH{Q" oI> <=}:I.V}&ԉHbuƣrIn,'6ٙh:Mhy{grLH+g"Cٌ7T(Rvճ+uuHCF0 _,q8L|1yVز\~1.j`jBkQQii(Lz:8 Kn߁|cOK |]-O7~sȃb/3/V=&6,HUI@CCGVvʼn;Aψ!"~(-a͚UW[}v@zb zI@6c8iwǽ>3 N!E^J2EĿ#JD;49ZH)?HH,# !4.SHu ?`ao]s؟# xMgSr5f;>#4"լ.,ZZ)Ǟ \ ZPH=JSU=?պ`Aa>}yJ( {4%tmFnް M>_ >G nI; g&'X P9sKx_*ZFQ\ Z~bk / j=&#q#<;xtǬ"Dɻ#j @!e!tƌn/uSd ,N endstream endobj 235 0 obj << /Type /Page /Contents 236 0 R /Resources 234 0 R /MediaBox [0 0 612 792] /Parent 230 0 R >> endobj 234 0 obj << /Font << /F8 21 0 R /F35 56 0 R /F29 18 0 R /F38 68 0 R /F32 50 0 R /F11 65 0 R /F33 53 0 R >> /ProcSet [ /PDF /Text ] >> endobj 239 0 obj << /Length 2717 /Filter /FlateDecode >> stream xr]_҃ĆK.v="KٕEԂ E鞞,%T0}Fd:XA1Af,T|p>4,/xT*{o8 |Ed(lrp0 Lf !Y6 UPELV@pXAС˓LX2Q|:y[0 @:S83ij%QA %>8KcnNå`Qf~9D2W w_n@A*}*2=< A4K ԳeXV-b} T)P#gY_Ӣ pԀ pq 5w &Nɠt8F?`UpY_#"# ř{!S,#DvsB3_h9^l OEVt̠TY=N_⑱CHy#BǦ1gB<.TW?%i˫GUj&*j'Ud2R]J=IOS8`U3..W[8 !m87z‡auю=vĆ0X|t~>rݛJ gq dF"Z/_R p6"S|CɘPk\w\"m[%YNDT;0H7Ex_WUuɀBN[%dLwtG.`bxsYJUA'&7a y h%$4E Sa\oQZUK]dxkӞp%Q]! 9 -@_}#,#mpd}O2)< O`ͼi+}VCo$,Ke xN_]1RX:q :< +J܅H;@_!qy y-$]̛Ɗv^_55/ < 素qU,Z6R!r!a<+1ri;0SxQ:ud6l9"g_4lh!VK mHEd$!7L%A\ђvڈZ :-=.xYR h[l 8y(y[bv( ƕn2Æ 2VȹM]WEcĦo4J_FFUwd8=pJML@U#JM˒Th beo٢*4]q- ٫^15 ;S<&椠ʦX"1>EaLͧqGlqF+D0xYv "{`Gع pq6Oiaz,8 WBA&3JmOZFŊ!(OA[2 :qBcmモN`no o\v~S~r?Iڼ_oV˥ o^ r o ` fY@m.q`tp!GL1qk|'cCysGatSH==h 'YK&")y9N_CE&FGNOߍbo71( jJf-!EO?`2 4C5_8 'L*k:w233 4CFZl;1Vr 1KP]ׅ.UT;~8Q+ʣ ת9<(3 Zcv>Ck;do 5{XDGC7˩/8GQ4lh4$8ga,M6rwcL*{-[ݯ"6tj/[l|F"fL(3o~U9YxM\O?cgaczL 5B2͐Esl toʋ:o_@䄮(8 ejו ŔzO'GY ڙ eC;Z44( KvG!5εci:Կ١#O Mn;iv ;dn܇ )-*}~w} =-Vx\& n4xbe@t endstream endobj 238 0 obj << /Type /Page /Contents 239 0 R /Resources 237 0 R /MediaBox [0 0 612 792] /Parent 230 0 R >> endobj 237 0 obj << /Font << /F38 68 0 R /F35 56 0 R /F32 50 0 R /F33 53 0 R /F8 21 0 R /F11 65 0 R >> /ProcSet [ /PDF /Text ] >> endobj 242 0 obj << /Length 3650 /Filter /FlateDecode >> stream xr]_GʥA+n.R~@Pcj%9!h~G1o.N^}TiqzquԩK yz9aםd۟pUavx:W_j{Z"LZ"?M o`wH!6uSeσ`T-KH!rMذ_1c$MhPUoaխurǣM'|%ZѮ@zMڔ|t,z=:J펧 NSqt fO0U.`2=Xgäsm`:'DORH+\@'`x TI38bjwH<]~:+8Z諭/aRvQf, (( E(D&K~D%.Y7W+֭^Ԛ@;{^K@ؑ3tN2ـ_6$7),)Mcv+DYsv"E/ jZD}]0{ר$l[4{u!k9쭿FXnh4d#E}ަcbࣰ]]|~C/jBe%'h!;ng.Yn8&x("(8y#knJ%4OG F`w9 c~0QG}K)c9;FNrS3xSBx"#Qhdud~;h\ drpg4>љ+{mY"h9K~v8w^#{ZNZ?|Djhg2t00o-T<5nĺt"FASTk*}1رFRDh߷s`&%Z.lbasZLa.g2+u d\#v!% 1 U`(Y֪~59I #H-ۨ~ /l-EQ ʄ8*K ~6~_?8~*&-,ɗ@ U{*q@'O'#z@93OϨ)gS0|}Cc7æ"A @A,rpD'>Ԧ#E8]1C狮@q)\Zs.b&FX"1xA$|^WO r;+XOk4:kAɏ_kMfϸH@= .، LcErt-ZPfSv{8Yh%*qcr߆zeR^1楾з9Gy`j9'eiRNOi}5"wUqJ;;f詻Q͹XیS ˄Uc|pXN .<# '#:ѫQTٱ$;vڃ̟ϑ.jBTXmdi\Ē [ ƌ^3 ,ʎLa/`wT-Y |0BrR]1e!DFkycͨŏ4VƦ#5QAI) ܮM5=P>z6(Gn7PA"28Р+.x/٣ZwU9 j`Qp e0VBpXtWbG/yJ:Ϲ?=[Qh 6KBI'\>"r~UWI#y mE =>s+bPl\yZe0_f&)7%? [*,g~Kկk2<*f/Ǘ̲>b+vGQv3xa҃M]8 @5DEׅE*Gy h% endstream endobj 241 0 obj << /Type /Page /Contents 242 0 R /Resources 240 0 R /MediaBox [0 0 612 792] /Parent 230 0 R >> endobj 240 0 obj << /Font << /F8 21 0 R /F35 56 0 R /F33 53 0 R /F29 18 0 R /F28 15 0 R /F38 68 0 R /F32 50 0 R >> /ProcSet [ /PDF /Text ] >> endobj 245 0 obj << /Length 3138 /Filter /FlateDecode >> stream xZKϯoǦrXo첝wlg$["$85*'UH$h47&["OvBf\HV7]]|=йN9a3D=\}}sMJ+dև߮~Y6Wr&V,Jm=8G̾"T4ޖױk}‡r&˄:/d1DȪJKu 6,M3+KsNVV֫'餷D$65\֎ -6DӣV ՖX% u*4f ֠ZkE [mn+OFb-[8VJCY!^6 K oAfdJd@_~,*3}Ra/^<^}N[X/笝쾬He C4&+Ev5:2 \ yUle",%aݖ鍱QǬ1Q׷m='r=ESʮP`AJ-Nh7!#NKxVrA|Fƣl$*hvc~_n(gͧ7Ը BS 7 *j '. `E֏!_j]y};4x8(A,6d].NFj75I.+ .XH_T9%=rGRxH3K]9'wk8XW"kήAtl/pFN/sTq/WҦinLY=n[TgO>->/ %3>W}n>MUXg)O p(]_F[NNH-g&n61> DբOtP!N.k0@H_wކj9ji֡I! endstream endobj 244 0 obj << /Type /Page /Contents 245 0 R /Resources 243 0 R /MediaBox [0 0 612 792] /Parent 230 0 R >> endobj 243 0 obj << /Font << /F38 68 0 R /F35 56 0 R /F8 21 0 R /F32 50 0 R /F28 15 0 R >> /ProcSet [ /PDF /Text ] >> endobj 248 0 obj << /Length 1715 /Filter /FlateDecode >> stream xXKoFWH!KQpM4"\VJ"]Jr}$%K[fggfg2oH7b5^(FޙcD~t=|g?chMhK}A미; e"?Ѭ-$Ց1X֌m j.Qq&"ppNqmSS,r>qĕh5 Vk^}3I2A]ZMt~' Y߁җ?'B?pAHd% Aߵfnag Yho9,QPZ3'Pʨu#M^Wl^uN^p8>;@=:  -xİҕ=l`\I"p%/pC1Ws⠒, +2fC]hñfƧ؟AFſ<# BB.O ]D 8J0 E$2c|9]Նp 0:-jںĎktJV<-S/|@ 6jmvKԍፂY}b--jqr Ia  k,scVw8e`=Guխ? (?q)Y\@Ok}n6L=)s4GwywRg.GΟvth2 BӏApԔ 4Qccj:ZU.nZL܍)&|#wl0S=nYSW-?=8iIYMؤ]QSٺ, hZrN~zH5ןYK.4=w.b mqygN.g$RPiT 3;V8Ysd@dzB7 tq E6ʼnc7\=0-gn4\=)6+;G"̓߰".ZLs#w=&8o ]2V4i}ܩE'p>z1zH@vQ/ۥfS{u"qhygHk[ iWm2A%?ynϖP 0*adTZne|Z bڈOl[zJ?(kXWacYw08ѶAWbAt#[ 9{s:, &uU]>@ݸ Q)AE! mOr|vcYm4(l'͈ajho˞?`Ep_՗4m3Jfkt|V2 Sϩ:t9u> endobj 246 0 obj << /Font << /F28 15 0 R /F8 21 0 R /F33 53 0 R /F29 18 0 R /F11 65 0 R /F35 56 0 R >> /ProcSet [ /PDF /Text ] >> endobj 252 0 obj << /Length 2302 /Filter /FlateDecode >> stream xYYo~ׯl^8>I A=lw!!!'$uק3쑴R64ή~:9EJREE$t vםmuuݕ7ߗ~:!HŋHϿYJdU/i2A 9gASW8%|kZ3.%KS[3_8Ye_0B ېRJ9b]veSϑ& I@ٮCn3=4oatQOa>ޖƀ~ghmEn~=-C:}g9\psoײ>e{pc)$R7x|׷ύ"`Z7aiWkk N4xmv\Xuo. @ϯ [r u ǝQ\Yxkd@NH p)e 4MH?$ak(M5O`=\Pi;dH r]ZPP e I2/?yqYűMѶe~{V~鉘b3ыT2 v(e- [[|>o>~7ڿ3h ovf2To aEusil,&z/ Y/Jmz^XKUrb5׆ s#WDYa'upO"Ə$ˤ$CbE*F8PU*™[FϹ(mBb9mΈJ\=Q[/፬;g36[U'' BG*isG@2q܌)Gٺ>?lyxݢn1Z[<;0f/4ETlk >뵦 F{_S&Ez+) ]Rb"ښQ0|IW`DșM 938I)}͠vG3IrI 湬l X= Uf+@1ԗ5&3X)xp6yyugkW۫M4a8|s8м?"eakOW3]xzC75ͫjѣ,,Vx4vŹԩ+ {xQ;Za3F(tZS^%^L)^oHh=$-OP$`s>˘H.%v,H?t"k?4uyF_!~CW~{Rymes-r(KkPq)-Px% $[ \pgd`QL QFQx0q5bA3^d]2=*~KD'P)I"oi u=T˩ e!sDiD"fQǯ5{V%I?w?OzP}k[O:X !W sN!1@Q-sء3󗏙gS|0F(1фD {YR,`"NDP"Q& 8%Am٪e+b*ldSUjOe2O7?}|I9iQ8.,}ll$ 2W62x\BRtC%TR˹cl!Ķt=rY7#lե=/es31 £n) ,hݱ骸3aQk06ߘZF$(| qQ3LIewa3} 'Rk.eu>(aZ7QIk5a"i=yaO("MDH4E%&zz5`^7\ߙwY[ `*}vO[ ۢ2 cL(UO<6bAF)e:;c&Qeg;lxNihM%؜#|Z W+6ْcx4n $ks&]í%UrA9Ojn2(`ibzs{mY]6GH%ba4S6Tcv$R}d0{[+9'|w+%%_9x|DXn|Su% & 5^-T}'Wvh`hĤ'aYiOzhӷJ8ȋZRwYYw{}``-)t'l*qBC/ endstream endobj 251 0 obj << /Type /Page /Contents 252 0 R /Resources 250 0 R /MediaBox [0 0 612 792] /Parent 249 0 R >> endobj 250 0 obj << /Font << /F33 53 0 R /F8 21 0 R /F35 56 0 R /F29 18 0 R /F38 68 0 R >> /ProcSet [ /PDF /Text ] >> endobj 255 0 obj << /Length 2364 /Filter /FlateDecode >> stream xڽYKs8W$ՌW1GFJUf@[ĊHjE*뷻HɎ"A_u7~{s)e?d'~2˾Q?5^f&Vɏx>-7I=ePa" -Iu1IrXJxZGvsn̿YK'SuVQFy'j3?]\N۞, ,Nj˫t]Lfb:M>̮I&^˵(m+OYt֩фbK,pOf> s y%Y/=˳yɷx|@/&&vmKm.s<4f>\VyGy]]wO= &'R)<ʧ9}ޗJ1Ƀ@oz=Gaz{xv~, BM{DQC{jGI%%`α۷ 罌YZq|uJcr êQLdJ!J*oqopn2aS]~ (~L&Q؏?|Pov54+=5puiԯUsXhf?.;o7."#sCMBK%'{Xgr rg(ޜˀ-5J{_>2߿ 7Vf8Nu>Ѻ67 sT}c;yx5mȸEҕlT3&&&.@,UNYƛ q˂pQk]-ѡđ#Z_'`p8(QP6:a6E,=@_0/hNԍ$ݖ]v%BBDh6{rWkvZc=P +s, =F ~fp[iG-އq&Ɠ}f^W)lxNsBkK1> endobj 253 0 obj << /Font << /F33 53 0 R /F8 21 0 R /F32 50 0 R /F35 56 0 R /F29 18 0 R >> /ProcSet [ /PDF /Text ] >> endobj 258 0 obj << /Length 2979 /Filter /FlateDecode >> stream xZ[o8~ϯ0:c5#b`n[#KK{.$EYJ"v_";L" ,Q$DӼ]-T2|Ta0_-rlw+7uQ/T:Ze(rg˹y|mFg2%<عE5Oat+Be{~6k?_rfbRi,,|&g0;XSD(,xb'wS> yhI\yU~lU"2=[J-0# EmHLE03Åt?Z9+I!F1mrA%GK iɆЈHPוڌEhiz\ UO2}=[2:\4vlE[#]/zb@?%vK5-xy_"rszMύQ&Heޑ`ND$p?2 rEI.rS z#9*?3;qxNCP4ޒ&aj7%k`LEBe XAo:/s|n9'Z[&CW\RzƑhb!&$K&D[}jvć1<)|gY0,ρY6۞)U} {IسDH8x3`!rkq4,<]􋺾l1*#;"PԇBbc/;"HO:Pr)?h:[=Irr7R Bj:Y7IiZ(<J˞Coi)`"pepd%cU1xZed%$nWT⒉Mzd 1H$CC Kz{J5ZPQTEO 6#66+vyY+J& _Umh=nulǶs9q}3!oHC O!4 -H3  } YR˞ȇT#<Y'g0P$'ٖ!hLKJ(X;yr2$i9dž~<3ޡLv(4 XQ;'鸳P&jꮨ;kS"JQ}DzXDf֜#KhâS<7bm8tD S^jƠ-63210%5W\Hx9XL! [:b:?X?>RL?Wm'SA0=V.-Qe7gux{ =Enmb jyiRexWm7D^&kѢuadǍAyUlZdPc3)R3h}]^Ca+2yv/%Amxf{W}E~Z%MzP <"D#!wPPlPT? -GlRiJ? ! Sj!l姉[>% ٗ@gZ'/Z(QN\N4}RPC0Ln|fuhM$=:" ҧ􈍁3h=!)~2ӑljܒn;Oma@6d5,P%>P^F&9CkK B3>ޠ ȒeZ'%Xr^>Uʰs'B~Yѯ#B=ץ uhstU( ݯ*.mlS%8퇅w.7!om9G&vֻۡ9"ZNSv˅WkJ-"?T[Xc(5%\ם'HrƐpֶE'G J?,{G%1xJ?ִl,gl;,oۜ#M\.MմI \Z͗)~Ep?rXsi37-}͓lt};ded졃?x1oxėKuZ6 `Sqrٝsa$l]G QޖX5s󑐙:fun[-?NEdYfRx4" l_[- endstream endobj 257 0 obj << /Type /Page /Contents 258 0 R /Resources 256 0 R /MediaBox [0 0 612 792] /Parent 249 0 R >> endobj 256 0 obj << /Font << /F8 21 0 R /F35 56 0 R /F29 18 0 R /F11 65 0 R /F38 68 0 R /F32 50 0 R /F33 53 0 R >> /ProcSet [ /PDF /Text ] >> endobj 261 0 obj << /Length 3063 /Filter /FlateDecode >> stream xvD=_Klu75 .V|VuU)9CbIݪU_\]j&czЉq&b#g_2]~KWrPnvO_Dy^t*vUS覩o`Qw Z97͚_=sU?eBO.4E:MO8 yv~k,*+mF"o=>/M^k.o182nI-7}k/4 |.#tTF'h- l:h¸`~:A%f Ɉ= , 2Djq&RZkTa=o [$ʟ$ -x靼 I3_,D~y@dqSztSۅ ySձpG>2Ĝe]4*15M!`hHtl&uMfNtk_6˝(.!`y]y)G7BhyCk:l~K8)p3۠'%n]^gD?TsaT^WUk ^m4#n# ŧ.\\_T`0c[OLp:ho=o$VMb'R-pE_.T;z %t%wӚ&m, L k G)@ښ{$ f!rE(z]( զ,B٣zMbHo~*촟BH%R}UiWJ֊g7!d ;RԞ9l)$ ,.~ҽD$z%d&e)14=lh:whw=u=ynt:Lm5]+MɨuDǖDF'0ǖqINET BzmPJqQU}R9fF؞h.·mmv]_MXH|N!ñ|O$si UŌ|L0I@ΐo.*o&suUoX :Q_-puPC6$?$9;klf.'g ᶳ.ϐwLΤAΌh]n`SOדxi e#Ddf@ُE&*z&mȑ|5n1]RX$R=*\Cq,U3"HdGK_OYvnb1Ci6& Or&H:X1w![ {_ n\YB@`=݅nb~v~R]tR?."o߁-lF֝|&{H( fy|4^z Ů vjAL7i:wѕ$MC^kj ',Wt+{ЯoWŵ秊 Iz 8ȥv~SsDӯ&{C\NZEv 3pל ;Ti2w*|rA\:R[Hm>,1l2(Ҥ={V'a &a`2}u 1G (4y]H2(*(dq,'E?g=q{]Xw@Q A8؋D$%7 e6і[aoOfBCT(WCuXBafWf)dޛkx:wbPM^:\~U*7CWv]ۢFㄑ%gܭ6RmtOmCo|8ge<7kk蛯z=L܅oF?n4>{Ym`6eQac/Q{-W%gb_-{c08>^_2]֛鼀 {M;o`70&I1o-eHk̕ YBƔPevqzkmcVِ6zߢ}4408hQ>>c^ؒnuyb*axgKP5 eeZyCӆ0^ӓaT}zziXо^;|A^YNn7<().-NcIdU Rh @6u¨[h7v{b}îj8Sm7?#.B| > endobj 259 0 obj << /Font << /F32 50 0 R /F8 21 0 R /F29 18 0 R /F38 68 0 R /F35 56 0 R >> /ProcSet [ /PDF /Text ] >> endobj 264 0 obj << /Length 4287 /Filter /FlateDecode >> stream x[m4bL֫m p= f}3,_ZǻNJUc˭VQ-ȡeo>&J)N>҉wࡷ ^:w+/qÙAfvSN%3Lqqj7u\Az+م@ˈހ+vm}Ưɕ}nnJL|Ym6]֧9gevy (">C`lq`sWddw~ 4aeU@Xnw:mnj2㨜j3s_YF]̻Dj1z>no@0 ;C1#2} FLe dx*׽$l #txw SO5"`t*BعsY=x&Ϻ7~k)˼#?Wd߇ umP1wLEH߷ ReC@bd%-4kRV`(#zXmR.1z>v6h lApα>t>F7Z$X Lմ00DZ)WS;uDL@JVڱUɊ*z]|xRǞ@s KzbVVo-sX# SDAdY_ΐÖv D,Qcˣ$1 me>IևӺ<䓛GV%/ԻD^R8d%HmP14^:g23 L*2HfxJ\ǽ=<{"XYQAMH SD>d,ɐtGyZsL__+ϒP*> \ʯ [8^`riI]s$"ל"Humh+x1Gzy~Z3w4=_v \/[sESfo|;CR[(XϩRmcb3]cO(yq*J:jPd/"V 7 t-nmW띕$k,,?v&f$S|/YI,nbm,nL`lL%WVՌjpjx*`o(Wqpӹ|U;+b8(.UVY2bjJqXt˙# ~K2L͙0!:9OXx U+7Q 3qS0Mo5ɜO!xR ^ؕ\\cw4ACяNoC8DWQp1UZ9SL:˸d*sn֮ iV lJ5zQ^Eol׋8su_x de䅅f\e1T|3)-b5{}l;ݹ誻ׁI_t43~q z z^-$;0 J q '*ie)LwZ-R TeSD-R2?}P)!`d)FiJ]n #@LZ^:Z1 _X+lAopa(ăTf8m6ZNWۨ^m^D}=O$'I 6\{ӓrdV;A ]5U 9KKsU⩭H<\Y-SX`tTq<,xew)UbA˨2\?җO{B=n{~8V .@xmQ6j겳z]<;ճ7W,7:ȿyўu= / _݅rt/"Ur8I_\1B$;,tY?p%zjWC5zJ_8xc98⠋}m9'D]Kt7:rUUmpIG[/z + +b 3q!U.c )@!9}8BYhTH~IV _@S2}[<0K^9>>wCvPPYMStNC"P[S6t6A`W0p Cy4J"a} P HxÕl[HA}:Y-³xG1J,\imms+yZr I-5΃,-IleOwi.:⡆iDL(T 9<{n{:}!1(:dϹ1eu?D샘j%|U@rYTCް@0978KNV {0շY(Ase)OEKEN?t5\ѪP}rEFl9ދqA@~)$XKm!lK;%R\ #|أ4',nPa K=AHƷfH\n}j~͜q͌Վ 9(_uw?p-maq K,1`jg>)({ϸNأkI$Bą8EpіDMUJj>40/NW `k@A|~yUm?H9˕PZ5Yu=YQI$kH5F"׉h$nH1'k\3 "Sq4LiO%fT9kSV{إ6R0qiҕey1߇G䲭!W>ЎRs8pЙ/75]5D13npwi:rwu5En+6'L`QV $&7CJ IO,AT!ؽoarIYD(蝫It34oI>F=\KHXT~Nbi/k*c4'QUOcnzjuD? Ѕw&C=*~ ؚ4'6S"B-W9$(C.@;B>̪^V l9d6͝ *S=mZkUt:L*[#g# \%9: {RQ{Ȣ@|^}2plNu H~릢XMcB6#?@Zl~%d%>7ǣ މA0;A=q IjmqI7yힶe;`(|-/rfSmR9hr/JuZ;Iaj;oϩh}h(}hu.@iXr.w endstream endobj 263 0 obj << /Type /Page /Contents 264 0 R /Resources 262 0 R /MediaBox [0 0 612 792] /Parent 249 0 R >> endobj 262 0 obj << /Font << /F29 18 0 R /F38 68 0 R /F35 56 0 R /F8 21 0 R /F11 65 0 R /F33 53 0 R >> /ProcSet [ /PDF /Text ] >> endobj 267 0 obj << /Length 2727 /Filter /FlateDecode >> stream xZ[oF~PHA8gҧ-p.yP,¦T=g.мHYywΜ;I9 k |%*뇋?/|EN5G vp Jſ/hfY퇫ofAsI )al/V-?V)VZOq×ojsM0so9+k[8]˄:>#{ 1Cz!5]-Yd.X)iǙY92K eLkБW0RpF4͆T=P:ix:hM>Y~.e.ޟd vhOl?'hyY'''r>ŮKu91~dp7?)ñK]+" o4Xqtg\qa΁<[)KpVMn,q = q*J3#%Jlab2xb亣cu㽭ܚ ƃ# 7-H 1i'_zgqX6>XGwrߐ޾ Pr;8⠚e8hXpz"akI,^?G[a<ɳI0tWP+aʑHYe /R[`;Jy#ʿ2 *DdՇhK8WTG׮iIP bJf/ꉗgPP!;*u@}$۹?ctV@!0nOO)Iu$x+Xs` ,<`)輫 dw c{V1}szl5!@hJ1ADA d7 W[(6-G/o ?9#«\A Z_[r:G2??׸rrS[roMQuB)V6jxO+$$x.1 QzN ',3yN X3:B="%O/ dʻGd85*\e$`\"P pAZĀg ~vHӪu蓳MM_?bE8$R0Ճ~`;%x[|hH]r`粉Hۦt(2!Q7p*WGT ԁUR" $gz̀s(} @<ÁsP!>3zRLg߸HŤ{sM~V~ui%\/ȍ&IE)44P4',X,$] d'#ʠϒ[Otzp'3 FA;?611 \^gf&0S=֍a =<\I_]ZdZ:cU&Qk nQX9f"鹧ݯwwf]*ǶAkO/j=8: Oyy90^U*$VL`d9,LV8)궬zP1OBB<4e@j"|-A:P*uJ> endobj 265 0 obj << /Font << /F29 18 0 R /F38 68 0 R /F35 56 0 R /F8 21 0 R /F32 50 0 R >> /ProcSet [ /PDF /Text ] >> endobj 271 0 obj << /Length 3891 /Filter /FlateDecode >> stream x[ݓ۶BsĤdq6$vsNDߩDUb}wI_N$,oXDbq~u•XT'd/Yծw嶺3Ego_=//$}ˋa 5o-X|3,3BU,>6g}% ć>.2c/6Y#zw{LSGT>'k6~S :(+#g ]\Q,:tr}&F![]Vú'eQES$6u>//|Kl3h6sXn/}obu.HxNb{]hx{7O*vrx| ,BEfe݀B$phiMsX)cHEȆa9SVew!.7u3PP,OJ\泈њT*뉨ڭ|YR˒V Kj{dfs ΣָAET+OԺ—~\ǃPk ƒ't<=W G(Tn5<|?ՊzRAHtI{B3LPsPiK*h ԯel+_@BM$31y,/b:ZKd%P5VpmHDVD!$!5d0k`xUG0@}@CtpYl(1@pIBJUx,8 6t'4VaP |nui}$ǷCejU/y Taxk}D2i2~b&X0jS6֑4[9}__"IY!ɗ34m/\tA(7dy Ȍ*2!?G\6| Rj " gzXRq@k$3gaY"R(}g!C0`~"vRl{#`'>Ի' Oq/CiwzlR9H| r(*T<ɧ)!FXdhuҊb#М~e'?Gk ,(S gQ P[Rh2b5 %ЂlX;S햵ln.~-k9U,zc8EhpH3yh:M05cˆu𓚭ߑh &1bcmZFOfgǔ_2lǍŮ=@vLe-?-7|PqkC@oC<Ex&yǖ>V喞׶?A#;x$$mx?j5ZHGSZx{ʥ8/25 $!5jT Zgp}RSygiMLDyo޽}cKd-(t|W$9[Zq@lh>яǸW#xf\ç5'{Ɗї6s 2͋ LqaK$P+,W Юā|e}`lu7[~ ::b f'EKkE'6Qh(@A]p3 #v^趏h`_6k4kB'=ԬнiK*).)ތݝ]m-k;57v, U 5Uicj$A,/Kk/0V$!^3W kݽ&"9w\,-G}&Y<}؅p?C>DYoAX9?8=,:9@k{<w <5 v6>؇úzɓ  zHy4@z,W+)"|%sɐi*9΃\I&+0H$Zq@lr1$Γ>@]4 a0JLZޕT,N?ÈtM_>\A0* h|{(wԗ 4gԖ/ Hpq oހԼ? [3lѦ];r`eof!)Iܻ姥UcnĊC7W5N O}%^no$]S+Y-i|g;J|x4|L|k@~dB&Zq@lP`Op;R)(/AwIeyw0wi\M DC,=w*Sfٛ6g"RMAw=~߿==T*bX*1.{Vttֈ7?KW< oV Fi*n-,z 5ttb "L7  K:dǮT"Opsmoׂ:^KLo*zKw/ǟFed dPLÖ5͗LYkD/BWE*Xfi~3) <Є:||S#Rq@kR,Y|g4݉binf\ j뿎6Y&+Dw7T%+j5 OwvI8=ݴH mUYknz)^4amp$GSE 2dCB&4 {] $E4f$HM wel0=˄=BBfeK+ٖ;6ȡԉPov#a%YDgY'j[l#O:CYV_`'/b6iGe9j/(lRIYw endstream endobj 270 0 obj << /Type /Page /Contents 271 0 R /Resources 269 0 R /MediaBox [0 0 612 792] /Parent 268 0 R >> endobj 269 0 obj << /Font << /F33 53 0 R /F8 21 0 R /F35 56 0 R /F32 50 0 R >> /ProcSet [ /PDF /Text ] >> endobj 274 0 obj << /Length 2994 /Filter /FlateDecode >> stream x[mo_qCh.IIIZ:FV/N[ ]NAv3Ù 9yv|;3bv|6p-fZB%9:f?|{|fa MԳyKgt%šM vvu8aZ_b-gP-)$SR97GqH`H/#V n0#B6&Ba5HE(Em9ql-R?h]^Byxݢc#|]qbVUZX}UqFUs D>/XgUPӳ(6hs"5ěRእ:U p4 s_ ؀R$1h>舭iuY;ٯ2Uo0(-m_ Q_WMqw:ߺ{M9/GxrWB`r7bMWFc~]^2,jvX8U" h0WO"\ KUx"bM˧Q35 ,@M30Nja AU U7JOO`g5?x>f},M# {z k=}ݛCtqE}a[{t zP}Qn+\xRi\T&`j1qBX`*)/:nι&,DIp:́3kD񯠲o^Y6]:2Ad&PGzac6CDadLiI;tb}n8| Y=F/- $ K0Db~OE )XZq1w<9d ͎m1PP@Y&2F6n 1QNNZH~E?q?(TD!+{+ x#"Os8&Hgz'Yx"$ON9)ńifrsE2 5M <^R;^}Kko~Cŝ&;S}p1&0pE7*-|'bPכ-? 9Ě&gARvzSWC) x' yWS[f~41N5Vb-8ˮ'g›zvkwɍ6v#ыs?" 5Ě)5UjMrCsuA{fJ2R6Onfq@aKQB*D5MQJ#yvt[h&4P AnCe*qG ,{E}AQy!VZ K[JfmFѯ ``m`+Ԭ3̓mׇ.)LDܢYKy]a{]T "f'.}|2hHS-=Uc"*Mv8%!0 ZeT_eJj Ɗ}rV3_&`>cݡ6 QepeqMXy,y,]y,c^ɏQ?cA?Ė<k,s66oPR\`1vhSy_B~:m p68G4`1hMj5mjT m Ω?+q7t40CJ)Ý\[ ظp7 r҇F)b+o2hߪ>֣l6t}ТSڸoZp,JmLBĊ=Q3-$0ZL\0WV޷l wpk kIՓ67{T8@bd `-,\)R/XJwgd˟k x#Фޅ!C=A$@ +=M*^BF H4D(Mn?˰vSo:&E!LT+=lv}_D[H?#ˤ~Q9L$S_Rn9"fYûh%GrPg΅Gy:= rl+e&ِai^Damuntw, ff[,Ohwi8 endstream endobj 273 0 obj << /Type /Page /Contents 274 0 R /Resources 272 0 R /MediaBox [0 0 612 792] /Parent 268 0 R >> endobj 272 0 obj << /Font << /F8 21 0 R /F35 56 0 R /F38 68 0 R /F17 9 0 R /F33 53 0 R >> /ProcSet [ /PDF /Text ] >> endobj 277 0 obj << /Length 2650 /Filter /FlateDecode >> stream x]s]̘gs$&iN;"!)IhYݻpH)5: w/뫗0&9K""g󺩎f0,QjY2;,RJ_=Kwb93Z?a׀u5^ ,z-r_7M|^ /S)e_džΖn1X*HHT5y*:sq'ؾzs}]43SG,9b]hf?\ELtvvWԸ_[LKjT δ:EHGQNw_[m|i)29Ih L+!;ϧAnH[9xGLYa_7ByXIBroA:dz5mW( D( eRn2aO$yYxjI"LBCu0xOX+AD='EY5nO"a"RSPQ]^H<*oDiDEbZ@X'd\k_aB3rySu06}بl眒Y2oy#.٭ qTb쐝$*-!LJE@4FR]S:{ aTC4ɛky{|f+̼)R@}aXH&pwW![K|<`:{b.p:]f2ɟ]`)IIiÁN> ׼1Փ=^'`RMd|`HY0p= ]e$־_uʦY?nO u\!}Ki9Ty7F, { Ҟ$akJ]=-*HZX+ߓ^ G9:)f8`u~P; wEoVqTC:! !%$=~Cހ 7*} t7r]zc6챀\Y1bUy:dDžsܮ MyZPcC9Y%=% }V*0JY{[Uʵ}E,I`9 Û5?vS{IOK2 <9Kt6>1gK1kC6҈A:}CZLBu4Fp@d[z8(w/gE*fSP]D@NM 8%O#a2]b< %΋6T@$Ct[p3ZxL$VL%$9Tɋ!INi `B3;i gdϨ~x;^=]&E:[\gh!9R5 IEa0}Uܰ69(~\g21;dgu@&VCbGg!LL4k$x\y+^2Pl PM#c2] eG:x&ϚX <{XM^/GR(6)24Mm\~'K endstream endobj 276 0 obj << /Type /Page /Contents 277 0 R /Resources 275 0 R /MediaBox [0 0 612 792] /Parent 268 0 R >> endobj 275 0 obj << /Font << /F38 68 0 R /F35 56 0 R /F17 9 0 R /F8 21 0 R /F33 53 0 R /F32 50 0 R >> /ProcSet [ /PDF /Text ] >> endobj 280 0 obj << /Length 2500 /Filter /FlateDecode >> stream xڽY۶Bsi {LM2j}$x%qBQw>>DꢎoEbw߂GjlP?<#<-ϓ@`3) "ʊʒ #og4$8}}Xl0S@C*$u&'g @  )"o5TNvyxrn^z trR _"ʪ,w|yM)v:SdҴſxRrWBHh0qW#QI qՎ4&I~hحyVNmM(v:_ zt,3EWa12ʈHE 9]vƳϧ⚘S"{>mhkw|!XX^8Ox/Ͽz8o==!oG ا|a񚵘}K 9P` Gc!᨟Fim, vCM!&z)^dT0;!H*!ah(4rZ^D"qG&:{ ܆uX(R ʳfOP \DCӈfy=.#0sUSŜ_ p)b_[m4e؋?NOzl>NKŒNw%0S%M92Q[|c~06-LK\V%vnL4--3\!!E0"$L8y6p$!Ɏ / Ac<<+:?˯Xpt&DX҂d8}$0p~D~y"| ~hӪa;PBU+lypOZ;&G߼ǣjS?[Z uFB;""u8W_3njxAR2m>樬fE#Y3?(iHtn7`l0'C=َRD:%|9p7WB~ ؆ېAyr*}.C$.7Q5,P9E]ÌmjПX3ݡ4}pE{]N!P>{Q=ܦ/ءWA{5n~꼼|WE[^A_W#;,juuY:KxP.D"ʖ//űRqVlj iѸ*1%,*[AЪ*iEp[L}Mf@EL`C^eyʴXv넆Q%0387IT 4 D=Iݿ0`8ͻ<:)dE[f H<[c!yP1hXm KR@4W}8 ÈU}4_-YY#jh"! u?$rY^Dr`ow(_Q  Ya}V.2)d2X>Ϫ0-]|, < it`<׈0 ][K2+})y[2X!k@FZj*PC-A"^h\*e4>`uZwW;ijg[$"$ ?u=vUYrZj-aL9Sk C^IQ~_ݶ0j~l҄n2-=|M] G|S2daMO^_b 'ጞ|ޭIXtp Bx_g4ef\m"h]co3{tBjq)2Hƶ:A,Є;-l9՞,'0g,Ӧo.ڃWf%.@=??v2sUPI:Pٰ/cj0}\ ķ@\Jď5_Vc[R *l_e$h˕n8(rN_ " endstream endobj 279 0 obj << /Type /Page /Contents 280 0 R /Resources 278 0 R /MediaBox [0 0 612 792] /Parent 268 0 R >> endobj 278 0 obj << /Font << /F32 50 0 R /F38 68 0 R /F35 56 0 R /F8 21 0 R /F33 53 0 R /F29 18 0 R >> /ProcSet [ /PDF /Text ] >> endobj 283 0 obj << /Length 3772 /Filter /FlateDecode >> stream x[۶~nbċtq;I'I>GWJ<_.}w )9b;ibwϯ.O Qzru=) 2=ɒB$FN?LOW_]|qu!' '2aL6.yOdqLH.!bJ,w fLkyF1SKOw[k3i)2+Ea--AXBZ`5"bH4^%ְovFU!2c7hSn/gZkjɩ#>񠘞poz p$+)s&$MPE^ʓhuE!WR7?&6yz9~q 9uS۲.3ŧKhVHhz^he6B=(%4퇮 PV8 ($5`)=OLkIÄN nQ91oPg$iw{jWy -ū+TX׆jjvfZsJ $Ҳ!ԙr$ N% A"2wFc EX[ ǻuuGƹ9gб~G7dG4TjOF4뎤TY̴fm.$ C {0<_0Ǵ5tF҉d1z'}FcR#I>; eWœ'\4 erÓ jn1bJl\D\^eu̓B'xxT1zl]Xqysx~dXNQ} B3Ǝb 1k8,2aM&Q-a~@g3EgpM]ƑW|7՛/^Û/Oo酛\Tx4d+uÑݞZĨ&آhEuע p"^4-ؼ~^," _!,M$WMQo˗9z@PrI{4JM2Cܱvbiʥʦ7a<,LM1Wu ~#XSjaMюmH:B.ЬHbsU0mDk|5}is6B˦q r 6UcUlzI{qX93qbX>cJ?mI wqG.y___B6^*9Q6b" tc kX)s*`u'Y p jyԛ5-D1v`\ON) 5*l=:\rHTY,<@v7aiSMW-*ѣ* LuEZy י@s^AӚE:G'0g'0? mZ?Ay +|k0C)B48ɳt瞠KCjύX,"sʞ _ >tVp(3/K$ET.^o=:E7{ܐ0UC-#d^ LKI>jn]ag8A]eyH :8>!Y`Zr z +Kͥ{տY7(R^@cژnU)R-6#>1`U/+z JiJwNݼzÃ33J}&Uv<*c[6$ηumX ]I" i"b`h cACMSH1aT!$d1NzRqిXpW.| aFBP"8XH̀^ rӚEĺʈ [IH"!] %Z HQeci "HZk?LQqT Vp"oBSl򘈕&ˆ }xN%Tz9"5h\"WSy& :1bZ|HSaB IX+@m`KVNN*c ! Ã׻*vGܩC_߼fMa;=@|Cq@'3D*+|7/Lw_-uH $-*:xjI<*@/w7e(:8&| .-7,-z]W.guQ*C  a\8Z \kAGBL"jFsWcnZ#L 2Lg@AӦBr(Hdz}!5u۠~ 27_f. t|qCf 7yb|YQ![:'[br?by 5D\I;ԁqWY/cc=Dyt4tŵ`Gr%eD!-ҍi2π_Lw>Tgi"b]@DbV, ѥ2tIf:T|XnRѭ?EҰ !tm$dzSFIiR*}FtGlz,0Y4FD= . %W cuKn] 9ϲLM[KNm`f*ܖW^. , &5huvra1_Aqr͌5ȕL0:mp0 ⬉.W:>gPD*_Ak(C[`c8Saq`,ObpfD 6M5,9=˜vHJ%.XS;h fTBf?DHRt6&0= W؇yY31 V8ƷI|XQDaUѵe_/3ȯdtAiO # W/Ε}Ϸxɿ+  \mǜύ}pܲ,-Ys"^Hf"bc9(,Yb! m~!pSA<%"KKĽ!DCfřw,"s+' OL 8la,[hqGǗl)W͌klD~K[.:3ʝӝsaH#]QWC⫡1_ɫDžD7Y/? endstream endobj 282 0 obj << /Type /Page /Contents 283 0 R /Resources 281 0 R /MediaBox [0 0 612 792] /Parent 268 0 R >> endobj 281 0 obj << /Font << /F8 21 0 R /F35 56 0 R /F38 68 0 R /F17 9 0 R /F33 53 0 R /F29 18 0 R >> /ProcSet [ /PDF /Text ] >> endobj 286 0 obj << /Length 1612 /Filter /FlateDecode >> stream xYo6_!׉IQ"W@[]nh hJ¶2IiD[.Ba{q$xdv@,PYHd&$ߝ (!jSG5T |O%zWX->4Ghm1 Ӊ,3AR[H HÁuoزLّX6{8Tq3qSm*XmLU޴KՙYhac ?[4sИXlQl$}xy9G,s.>yB5ʳLx8`E俾z7Vjd(;/dIĝ(֜l`$&0=t /ds/gC4Ac()JkKZu4h;} K"슀+L6ڤ.DS*D.WV8|UBt]\ D֛]}Xb1zo[Eyl@ AA0tsӉ8ЗƓ*Hnx,c6l< Xv蔓 2|,Â!|</.:ip̯0 2 R)TsƔ$*Q[eW*w:|#YJ7̌Е ]R/X/>{K׎z|.Xsw_Iب`aSv_tCu46lZ;S"{s}XSnm)2[x8Ad Kz^U˒Q l37TrGDݻYNmܐ7F)gYLA?!ReU.l endstream endobj 285 0 obj << /Type /Page /Contents 286 0 R /Resources 284 0 R /MediaBox [0 0 612 792] /Parent 287 0 R >> endobj 284 0 obj << /Font << /F35 56 0 R /F8 21 0 R /F38 68 0 R /F33 53 0 R /F32 50 0 R >> /ProcSet [ /PDF /Text ] >> endobj 290 0 obj << /Length 2095 /Filter /FlateDecode >> stream xYo6BuB^|J=`ݽhŖcl)K%;)4bSp8pf8b[$.6 B1SɂaY~TG8*IXe`50,-ݒ1(e !2̪\pV0vaK!D]ƶ$)m{.hFUy9jW^n^pYaWf+tHtoWxvbױ8EV)0\s1DFQE"&dB\D/ۋ ??wzV wBDN}s1h&9, ΃~i݌::6%,ID'k70/*TP2Pz$U$HGʱ:+U8}_ҺFئVK1s'?G}q0t'$2{fqBbNu63NBpPά:Txd'JJʒLhbxL8DX( +a߀Hv{,. $Zуܓ`ftL(UG: @oBFjl 9'g ί 0E3#u𜀓C8$ ə!3,,`D+3n9+h\+of ca) !zyw]#s[XjNX' ѓg2ĸeE냫qD(1@g}FMf"d|\pnyHPFP$NAL gO~ D*<<ZdDJl"8jq]e-=k3\ph *dB:T_9Lyq9K ЋzcxN1ސEm> endobj 288 0 obj << /Font << /F38 68 0 R /F35 56 0 R /F33 53 0 R /F32 50 0 R /F29 18 0 R /F8 21 0 R >> /ProcSet [ /PDF /Text ] >> endobj 293 0 obj << /Length 2189 /Filter /FlateDecode >> stream xڭYYsF~`EU8Vٲwc,k-9IL" Jʯ9@i_=z4PD_3OEY{l2?f?VA&pQܪ6 !'Ϗ\CDA8Wc*o9W&GvG-? Q$톟q~챀"`$R1ctL `RcЦ?BtY} dH?yY$e1W2JWD1/>wQI}o=W/ҝ ztUUPiPE0qMZ$qg?"Uj^C@YϚ'n[D<khTX3`iˈTcr^~Ⱦ|h%z] U~m9 DȻxÐ xt;{*s|^Q3e2,gF/H2D*%^_13cR1-F>}dDoG(7%,Ƌ'Q_jhy-b/{ TeE@|·W1dA]xP-b;A5X(uKRL<1z63 ;Z{\ʃ6/z|IȥP/Kk?_2#:|q )W NPǰ>;HKk/HA)Q];fKÖ(–-0$چSԆ0n}A ;klE@-bծAZ9&+LС.>!p8Tۍˮ͢=~!+,V;y([B!~4/#^QDdp6na6<ۥgۤ a/Bþ@7v#k% uplPUY:T6I<IJdwC!4?nvC?J}}B !@2Hb%m cIZJ}5ж' xeBb5քvGf RONnVOY ݲJn~ceNWY=PF$h>.t 6MRjM3 xfV}m3!/~UWz0WF]" a&Mv#؃!`ߡY91ˈFMPC%es+&zׂ)0ۅYeR _S9%8'q8D"'CV:krRKv<%`I}7ݙ%l~j25ǡfg_` N\ BvB4`-d?˳da~2uz{sK>z!l~R}biy-b$asͥe /!W;h V9#͠W&%iEGJMw}=eތ&ƨ0Nq|Âzm3WDyY^}L6ѐ`@ثRe%OrqW@\` B=PnCTa g.3_aMjgstu򛗠u^ %^.%i<%rZ8_x Hd? y _ϡvAГN޿xJ K/W\c@3L˥P2[~ن&نY yS"88'1d6 endstream endobj 292 0 obj << /Type /Page /Contents 293 0 R /Resources 291 0 R /MediaBox [0 0 612 792] /Parent 287 0 R >> endobj 291 0 obj << /Font << /F35 56 0 R /F33 53 0 R /F32 50 0 R /F38 68 0 R /F8 21 0 R /F11 65 0 R >> /ProcSet [ /PDF /Text ] >> endobj 296 0 obj << /Length 1591 /Filter /FlateDecode >> stream xX[6~`LgbLnd6ibdԀ Iذ`}w.:7~`m-$gk3Z!a‡P>h|MY9Z&Vcl6dcAbn2ˢo F$+(r}fi#JI-(YylEg}tw_܎n~lI6RNs)x#jS@ȢG.s ˸zX45|X'oEva"٤G9b^1,a ʊ\=[ʭ\<'^ilt6 γ86:1SYYW}q+}_x8 fp.'np9{<-SW,'yl@U먨!RwQ.Jư}qa- CCcje>dPc.V0,y",q2xC(~! .$\H_T)kܟŶ+Z_G !?cf4ićkm9!vd%nnMIzp=|G ȊsA3#u,:y2clofiP0=vr;3ɥ$\-CgMO<&ށ7Nh}ySXs%_E_1[ī%U֪qD"@ okHVR\SdFJyEMj$߸jLbpvf.%w[Ym;{F|QVQ}RSJ&SISx:lF<_iV?* endstream endobj 295 0 obj << /Type /Page /Contents 296 0 R /Resources 294 0 R /MediaBox [0 0 612 792] /Parent 287 0 R >> endobj 294 0 obj << /Font << /F33 53 0 R /F8 21 0 R /F35 56 0 R /F38 68 0 R /F32 50 0 R >> /ProcSet [ /PDF /Text ] >> endobj 299 0 obj << /Length 2755 /Filter /FlateDecode >> stream x]s6ݿBd4EM.in7Mc<0-1G:>o.Hfz/&,_ޜ]MQPnnGq̤Q#cƵ?o'o~r4Avfq$G._<1~;L?LRe]aE5õ%HqJ*uW8.]l`hM_#_z2HErT-nYT@#yu yV!ƃXf\b<1: L߳{]14!ɹOWzLWYY,53+!6a?~a&ldseHNDV{ `: My_h9 b[d2ШLʂ]#QŒ^4|g oՍT8^'UէEI)WX;W 2*599>#Ł;3 9[5>|xE{s&x: Ϯ~i0Mi Kpt7٫I>"d:)Pݲ"Em|\:a&I<;[M,3,Tͺ-/1u@I~T&%}h\=۳_ڭ3Ƴ/K sA6GjV:*&vٻ` @\ZJ9IE'&MIn%JgpFQ͛C^5Ai: X,(N^Pi9DK:'ddx@{p|FXЦF쫲l˂uh7Vvډfכr9Ym$)]:^'ʁw2$qU riz=Z)f~1^ 8j^[0>:݂8钣}O`rQL]V9⿳e+w"WVCXï< >b ;֡^qPvX#A@@m|}"bHG1X 8Ƶiq0Sj`R5RԝtM5(./>R nw2ؾϙm/N^.f#IRWMZB扏cv,QJ2C AxUfokZwJP9o[zlV ٞw~~T#weOyfhCfg|M7-B"$di}M=MSUkzrgFfKhS*<7?]l!goځ]B9Hȶ", :py\"[zm!y6#{> endobj 297 0 obj << /Font << /F32 50 0 R /F35 56 0 R /F8 21 0 R /F38 68 0 R /F29 18 0 R >> /ProcSet [ /PDF /Text ] >> endobj 302 0 obj << /Length 2296 /Filter /FlateDecode >> stream xZ[o}ׯ`7Bsؤ`&p<0mk!K*%gQC8R15w=ߙ]m2FII>+xVВPɲPE*g+6~\1-\&~pukVqၝy0_|a}ٟ,Oyu|v0תݥ>*,Ձg64/<~VJFYy"&%+ bz)ͦOʂpv- fﮌ>]8{=k"FmW76fb|ݪ➫9eD1j?E965nKI} ?s|)5_1cEtA]'cU¹OSozV9Ђ3>0cUIhEOR28\pf90 +#6^K)|ɀTjŚ,OB\/Z ?JSL) 46gh'z%m(o7 ֤-/|~x eEɰE$255HD>D1P8@a<CV2"pCeX, ,ˆZeԋ#iR|"Y4fLv,;Hv[,+)!wyvh|OA("x~'@A2C uVW\pjiqoc"'h=]FFUnn^ =7렡U74~ f"gBe 58|:=Yy"_s"{jҦMyVֲ 28+).dV~X:{R#&\*[as\ Ð1;tKǐȅRJGv'޼WMX3*K}RSI(*_瞥w V%Δ-S^)XVeaJ*dj"9"8pSѮˡ۫f4i=؃D n>PLL鷬R &춬ud83H( ){[1h/l" =SB@wSoꋁk0F;1㽦!k {`. Or]R~7ޤޤ9QA9ЍQ=0^e\e AKYviz#MVN<@7{?&f*(c)̧> endobj 300 0 obj << /Font << /F8 21 0 R /F35 56 0 R /F11 65 0 R /F38 68 0 R /F32 50 0 R /F33 53 0 R >> /ProcSet [ /PDF /Text ] >> endobj 305 0 obj << /Length 2750 /Filter /FlateDecode >> stream xڵZs6_ɽPG34%;i@K)E*"e.AQed,\,~bwu6m &oscz'ht*~ #^A{,;XN1Hz0ϑI.X:VnPc.&Rf⯬ל /fE\AOpG19T ť|[] OߣX2 7oSy80s=Za’(u+$a:z]^T(bR"%pq<zeǭ`dαX{+aESx@z"{e72?֞XU[MuP 32g` ZXZ ]h"{e72?֞XֲSy~8F'SZ5M̽ʘr^q9OVǽ㧿-S/UVMs؟k }k{HXN02`N`uݶ<|[_,gȜX{O`u{Xr=u@AȜX{O`u{XwS֟#_dDL hu-7ulunDClvFZpF] k$REr˪*mґaƆ_[WKenST}Ca-^ ZvX&TB\a-䦄4 !4ڃ)c嗿VXbۆX4x'-jkNut|(gWR/:K؈-.% ;:lFx"1\EZq?Mc6(`" `x@AmCAt3w*.La\i$-i?=Xy3% #'cxY> t1TԹ[PGMWFT$0N<8C#E[nuvL-0۟I%K⒀nEa42Kim#0 T: ,H;gO¡c ,AЀ|[aTz7"f0"4A ;lɩ  w|4a\/fٓD6Vc?,~ p}MWCY.٤:z(|췺/;һa n0/hA5mbVݵx<"íf:+ShT6jވ0܄C n67>%;%nGB,sk:6nLeCQ #Ux$|o=0M$Rv4]k̒MT!ƨ;?іD;k]n6a Q[|/jZ ę~Iv.3٧ٛEdU xHZRfPBx /SCfkrZjOzEˮpACcFR+`Vmk(@C/Q څ(PGXzH'o- iȇrY y\P ioSjmhU.aMM"=>ޏ}Uu<f׭7xS>G88 gG@swzYIfOJ݂S~"Mzz&mv q&Y%_7KE7:\ ; HHl:K@8"4 ,6t ؊^ȡ# WI{5JmH ^/q͌u@\KfͦA|~kHSѧL endstream endobj 304 0 obj << /Type /Page /Contents 305 0 R /Resources 303 0 R /MediaBox [0 0 612 792] /Parent 306 0 R >> endobj 303 0 obj << /Font << /F29 18 0 R /F8 21 0 R /F35 56 0 R /F38 68 0 R /F32 50 0 R >> /ProcSet [ /PDF /Text ] >> endobj 309 0 obj << /Length 2061 /Filter /FlateDecode >> stream xڭXYs6~ׯTI4$n2Lڤڴ&a3<=xH8o|]l^KLEj2vSr|\C?tnuMY߶Wl.DW?U}fIsEa{jf>ٍT'@kN4m4nNlқ֕uQ4d3]DFffT#|uvn^1{GBƼCNp#؈u{̨; ⹾R{-{߮Q^wbNyc6P99`C&Nn͹ڳ @!KIY0hlL19iqŋaZK)V@P5vf@;M2p*vͩkͲ4YUҞck]VD#mAby45ծTCx! ^8LD1o%  sr\pŏ︥J źB ,==c8#ydĖ$$"NF"𽯹2q|Dّ|†/CƉ8 bHx6?&`&ٖ\U'N1̆EÊWIK;U \xz\1zN)Ēu sq+)cgZUކF39LvXapjOo%Vlh,nW|PSrļ.K[&vWqES6/~xx0%a;b38%~DD f2l,UC5٪OsIS[m]9wm}V HxT_0 rå _@8l9 Sۤb,#3-g*ީ)T@\Q:5G.MP29"ƗT c`4c_'d1m҈mi%Q7=X 6~ qKVf$#3S1>LZsRtZ)܅*S`jv'ʂifuv*AbOTX2Ŀ^R^D 5M1euHK`C0NCRI\p<7=U<Ǥ훩ھz:@3+)T$M6t 5ȏeu5 Q[5>Ï0) 23,f{,(IrrI8H08gp<l4[G7jyix"C82u{ TMkF~]BR7Zd O(=}edyk~OZi͕lzJs%R 'I,rؿ< endstream endobj 308 0 obj << /Type /Page /Contents 309 0 R /Resources 307 0 R /MediaBox [0 0 612 792] /Parent 306 0 R >> endobj 307 0 obj << /Font << /F33 53 0 R /F8 21 0 R /F28 15 0 R /F35 56 0 R /F11 65 0 R >> /ProcSet [ /PDF /Text ] >> endobj 312 0 obj << /Length 3112 /Filter /FlateDecode >> stream xڝZKsܸW(Cf;Tz*oiX)*Ɂ3$rjȑ@pHYr.F{. OE:5ia.MqO݉Whs/lNT8@գ;꾈 ū|oSHUGG)!eUϷ&,,F$߽.T났GF0=89"YPc;nZ."À40pwF>p띵Ń[^5$s̨2hW > ٘X2Qzc1E0 8pa|F8,}8Hd x۞ɱJE-P $ ZيEc WGQ\NM5tm?%BPNmj~)8~5 qԪŞ<<~P΂dIG,q<" Hڌ߽Hk KCa4`\ח̏+؅ٜow?^1 @rEah[: !)kؗT#wGַ^]EMS3%$E-3mC9;оA$8K$J?nqgx{PXM4c NW .є*]aBra"SA+L0A{tsnc=$1@;FsI{]k'jM-䫓' ȕ$9F>lᬶ []/H|FSpLG]& |ɽճp {CkMurs 84Qk,` ׍V =.`!M2=/ $35:cRQ#w*%zn&D㣘2tku, VK ma–UjE{uEs#%e$.?$ðUP8Vl9484 }~ |)О#'> endobj 310 0 obj << /Font << /F11 65 0 R /F35 56 0 R /F8 21 0 R /F28 15 0 R /F29 18 0 R >> /ProcSet [ /PDF /Text ] >> endobj 315 0 obj << /Length 2878 /Filter /FlateDecode >> stream xrۺ_>T[oYidk4,{)R!`!(;M xp' H%$bKbyڬgt/z<%F},IQ^-hUco3q;,m.꺭cbBȪez8a .Dl';f.F;zY&0fDdڿq#A?n<=< aT1w 2tUO 2e}5$BYXC=|O=9\"G-\E!%ʱA^lʸU*L{!È`%s̿v=c=?D10@E4TIKh&ցѦJ9Pu+?_bq:[[t@zM$ڥ6cZOD'$2 e[Jz҆xL1:|9LCŃ#_,P 1N C-\BsH, ƭ\\U[_CxWi^ ÄKiJmzT7%ehe Mmэ kӊU)@wУ$!MN6 qf[ꍴGEj∦嫶nSVRצ[Y˾uZe{yWXn8F 79IS8)g%$0w9 )8POM-ҷ2_ȪgYOa%zAd.D(М1N2.s5M2-d;ʦfkENȜ=&_aѲA ֭tmEj]Xu6("L`eav+eq5Ey?&Q&c6:#Y;Hd2V(ѭLr2tC 35=4N n[܈m׬n\-udgy%|· g{؇ l[_0+k7l,~$ աa^aE&OiyopI|eSVH9"FgΦgTb^a HUfZ`ehƺ܏|,2SD7n[[|\D`"+{@_^ZYsTb=B[GN 8O)gu[ctI<ӁVU}|3+P)Gws8;\7#E{s-bէ5&Bx6#'}$=?R"ڠ`Ob?Wa`E>|nZC`}w~4Uv햾_KB=Cnc,qǠoFjNd_"_ǿ+ң({hvhq6ބ0)6oFwz0ѓ%5F>=cdFmDBdl~t˪;((>1 2F7&4@uGvu7xT4*Z۽ 0n$4}Ym|@Ο{=OXw RM羷4S^`k[ffE teag34콇'R͵?h,/ PD} XssuU=PuQxTd\lz ݓ[hHK|!A4!o=/0ESSU \Ҥ~gFOtIӁ|3e@f{[6tC܃p3${>?{4Mmrؑל{>_MH/2J\;Nax S_ӆ_*d endstream endobj 314 0 obj << /Type /Page /Contents 315 0 R /Resources 313 0 R /MediaBox [0 0 612 792] /Parent 306 0 R >> endobj 313 0 obj << /Font << /F8 21 0 R /F35 56 0 R /F29 18 0 R >> /ProcSet [ /PDF /Text ] >> endobj 318 0 obj << /Length 2920 /Filter /FlateDecode >> stream xrF]_n a\vN\T%m9[ %-_} @JrU q0GO_=.O?x&H`vy=,9\~bq&=u6R{hqs6Q6)./kξ\rPE'?@1Dx4ED$)J8`&hT.aU,qf ?w_FLlaخq+dV]H(]fyͻPh,%vMɿY\U"nYF˙x.=AMCfs"R @~nq5AYc7F'Jn?աlnd ֈm 8gmF.{3Png?/VM}s~~{{+2ҩRnEYݜ_P`H#"c% [?ۊ<*t|ELrIe~?~z;:쵑c7wvsd8~dD u%FB$?: (갎N;i=pu[<664xtyњ?3P$& fɟ'?ć.B2Ifc>8g *FaP@>y}8řNpqYEAH X/Ib](Px%`TFH?++ vL{RR DRGI aZj 'C HA>$>/36T;EL ?}qt0Ef$&U.|384LK7eY8 4p+-\O@&5G h+](@.:2,]b(mTxerK#qS{$.rƌ6)[z =2ZN5xWKTBl)]`omMoiGZ;~Aguyxpdb˽5#=Gm B`Dox{/^7q, wd$VI$$Xژ+)|>ccOB$P Ɩ(ˋp8F(:B0 㚊8h"% z !/*|FjsXvEve†%Y •EV@ҭLM7tOR{:w!2w񴗮ڍ8O֓𳰎Q~o)f|}k,z 9kd_4?~} Aqgd;|;hO,4"F"00{qɖ&ep@c s+!Ìx9:$26υF"Y`F&no]үuע8  2 8u-TNE}H@ẬYcv@<Тs*ё*DaM(;q >G9NkyCj?A<'峻&sw6wXqI2G\0έMr%%w1x v҆m(bVtvQ"t/V~.";t!R[S|{ *NT>Uu"EycT&T\ՄdLj"x(A'p/#F.ŭ⧍gtFA6Oi`M7N,dMۉA`<+:qW| )qEuѻ߹z>Z9m36yy/#$^13R{__>~صmz7]wF*gavokxȾM*M&Ӫ6&2sM7"Aҳi1DPh~b0_RrqIdmfq"_qRi֕"8xq6ƑW*4Qr-r.Y,DZ0Xz5O/Z/P]tDSb[{+DZJ0j @wޓ ͫk*A"7~ea +1^$`A社*"3l~qrR+(K}<(*?#eHr[g b@eNyʭە \!~R :+rHIҮCӥ5_5ibd6CmU:ƹo[迢V c!It>Sg?31o幷Ovu5H-PW]&[0vYOi̽.DYro<#7[ܾ+sc탿nV֝kL_*2(8Ɂ[l>2淥;. endstream endobj 317 0 obj << /Type /Page /Contents 318 0 R /Resources 316 0 R /MediaBox [0 0 612 792] /Parent 306 0 R >> endobj 316 0 obj << /Font << /F28 15 0 R /F8 21 0 R /F35 56 0 R /F33 53 0 R /F32 50 0 R /F38 68 0 R >> /ProcSet [ /PDF /Text ] >> endobj 321 0 obj << /Length 2705 /Filter /FlateDecode >> stream xZo8_{h-aypI3m_R;,:@>Ė(Ho~ ǜsL0ci7/C]ܕO_o~_\r&(W۫߯|MtUʤGxNwnKުWX) O`R3eX9.i>?K%TwaR+`Fg.p6́4}h)2'1xhe.8,̀hɵaJRhf5)p)dzdw͓5 ״z)S 3wf-A `)QT2JIfL62flJVJt=f/Yr;{C %x%` ɜ ĜC]|ۗkJ6d`)T53@v2m[QRиcz3~Ԭ'qŔ ys*F<¹XƬ GKU ҄̐^>Ic:%" fr@cOWc V{Zv;4trVYPe,i֒2TsoÌ˓ŐOfC-č5A"2>i~P =`MpP/Ůp3syoU^UbdGIw}{uOA=Zv_?}5Qe:MoƃXx# QI>H)ŭLUac$btB}6 Aj݉)Ĵ,@1%X<԰Jt2>B8"rTK +}][0с4πk$F9rX-F.jr$+F1}ܣmtdxXZ ^2˂x^MAw-Ȩpn?W)äf]`4F'7NA;Mc~8Hn;a?sGMK9 o.2Ȉd6nsMŏt!(bƌ[t x"@VA  <{߼y$ IO۵{d0 ѥC<Ӳ05(~r&7oS!c=K<O: d}o/e uGV4piOODl ](]k}M 0Ї΀LW4aD!p~}"xݠ1dc0 }VYu_SH~YLR98J9CAV[EӪЛz-Fdp\AaQz\r i}@@Q:){M;뚽L͜b\"vpA,½-}5*ECKLbهqS8ȥFŴذpo޳$R63ӳXA96CH W$ FD}6bOkJx ⥜YkR,@jR|4P }m>x(}.3$ \¥? endstream endobj 320 0 obj << /Type /Page /Contents 321 0 R /Resources 319 0 R /MediaBox [0 0 612 792] /Parent 306 0 R >> endobj 319 0 obj << /Font << /F33 53 0 R /F32 50 0 R /F8 21 0 R /F35 56 0 R /F38 68 0 R >> /ProcSet [ /PDF /Text ] >> endobj 324 0 obj << /Length 2767 /Filter /FlateDecode >> stream xZKoFWil&&Ff`fx&sD"Z9oߪH&EV?uxNI2#'WdL⓫16r =d9˴&OՙNIBt-$I`B\LpIde]"W86p"bbLl*'.>I&E2"a2OϲB™x8fBp)(;i J.Xbm32jP 3cS]96;ٴm՜`m6H_$eb@B,5k0%\0% ̀T38 g9`-PM9jFZ^ɫUzBZ՟pX.zqcl_ndQ,o[Ziq[Z{XsX8ԇH}h!<- " x}=ݔVD>i è'aڪ{gzK ̨o XPb@ A[qG<̼"<f{qLEg#-{_gj?M{[O!c΅b1 w8QgvzEY~_Û.! (_Ax#nj ĉ.pj_uk_M3*a& Ѵݲ:L8%XonNDsg$BV:yoN.t:Z g8 pcx(THĶfu`y Lq7\d&亪C[tOOs۳r~!blv+!ڷ3 "oswynfS==.|isOI6*JF[+M5<)r7ܖuކqd{) Ii|PL/I*=mH@|NıpV)մږx(4/k u023.W_Tr&uω/P5;JbIzZ‚M'iBl?V+r]@ѱ}lk.#I9LP,wWUT i8#k%B u& ke93{pr}7bp̂y#x@X8`]R4OKƲ+!؝{3mD'>]vQ\ bѬv\4и,5^%x覂8 oakDBkˀev#I eqjM;6Idcx~ȱ@WٳB?'q=$MM,5܆=F|^GM7ڪ7xx-6'&/#^I٭}~8$Kb|bn!ڈSȹ}]f?n~ ВС^yI t}NGf,&.Um:Qѽ{Yrݓr1׶|-UoإM7U3֎ ]~0el݂` > endobj 322 0 obj << /Font << /F35 56 0 R /F32 50 0 R /F8 21 0 R /F33 53 0 R /F38 68 0 R /F28 15 0 R /F11 65 0 R /F17 9 0 R >> /ProcSet [ /PDF /Text ] >> endobj 328 0 obj << /Length 2956 /Filter /FlateDecode >> stream xڵr6_Gi!x[n&I3MM17Tl\də,MY,Syro>]7[]y<ƞi:\{uus+q-5۫T:KER(fV_UXI0%ndD*Shf!b)绮x[aoDJH)Q*aF):!o<U|ÄyP T/*?=έx=.me]gE24ֽs{<psğ^Y9_,g~|P"}'8%3~ŏan?jXyg6SbNɟ7epbWOX%K4L`vYk MG`<9TӇH__8QE'?,}Q?=pQUїdoNBadC|v`b{31;=˴?Iϲ$tHľ}d׊8izd{:,#Y+)tcԔ95J32}J1ZΝ.xHp5io 0rĦ% vivEӢn(3a]lytL!O{*~xθj pXn\~( s7=Hmn A-ǩqK)냞][pKdjle([PŦ$rg7tg,T=R"Tz iILE-rE:NNHD`sɼQa"rv%i4 *?GT]eEF ]E)sj6㒍q/CUyGڔÎ``ATժH8BeTh+:WV^+ƬTAl_NckX/F*KBt䓼d;!ۡ7X[t yH 2Elj+SSI~F{ʧ.L5}x]Om{pcuAY&ioiӻ>&T8Gy|,%b/PBؖŸxKod66dfEu =(NJ>uS0n&<JL N7hЋH,|BeW/;E ,NN`;(ndAŹpt[fDZC> endobj 326 0 obj << /Font << /F29 18 0 R /F35 56 0 R /F8 21 0 R /F28 15 0 R >> /ProcSet [ /PDF /Text ] >> endobj 331 0 obj << /Length 2563 /Filter /FlateDecode >> stream xZ[sH~ׯP>X,mgkNR3SN2;TR!l A2~ 4(VfAМ>\:?: C|>iH7NKxy/7@q*Wl*B݈8/Po<@"d=#.#lו+2yޥ\ X^mpQ,mpAۆ2 s֠yƳҕl{n3q1pf45r¬!Bc)bYj*<\Fi!]7&ʿ*CD>͊hVF|CI:yZ.m1K)Ib0JmM| ׋JlAH7PTdǷ9j}®G.(H:cplVd:N d)mc?O'>xZ86ՆƸm+x@,c`R>Qi}qEMd|zܰhU}VQqmhgP 8LrCsx߷=qPhh,M)o^IjLEQ8֔.2 )dhJ&ި aBΖ'۵XcпPgj=>6h_ڰ> uNU-|LPŕj k%JL2q~g%Е9{j(Zf|1\w%yҩFUTk*/Q!)ؗ};{B{ fl! 键[)iwIP;. P:wY0}ڹQެO/DCioHU#wS(樤[RN4.6x ~|0Uf-6 Xߵztw7ɺ,sf'(q\2G6 N *&hfd @M&%Rj b}oxl 28|J$ZPy&a]y{pGmX塡ezSMP(Yމnx1נ31_O`ۡ]I=*SͅnR*MÀn+1Ks|nhJ"Ue80K)"Tl8;Q!aoBim YVd,EgcȖr|㪈WόLcֳ:TPW}8.=,m2v &.*ȁd 7>3r- ֏l5jVUQA\ 51&_$f?9t- :COک>.S`/B}exe^FfEk|#2j-(ڱ9AiTBML{+:[eӞ֭Bs'UrCH]mgNtBB/ZRʝ> Qnl~VթoC ݿؽ%;@emhG0{}T{d$_5Wlkg{dOmpNO5Qn aڝGm)?m 4ej͹^.Ijt Lu쀿K9h3aтv2lR[WJ _5}Ee(×t!wuS['AjkɠU2f`fo<pr7JJ P 3Poq6S}{|jXVgN 9xpe+ W2@Ūl%c:~Vq]nL{c˴q -T [/tD /zS7!$x;[jW[[KZ > rz9iJN0ϜQA~Ζqjc0{\Y߽wɼ&pg8sɽ<_ۙ%|Sݿ¯/XV_1h]+5<V-l8|x{l>\>'<;S2bmB}V&>&*X|S_4>KcɏAFCɨ~+n:3wzfiS1[?Qi\o ɐMA! g$p䇙!^_0 endstream endobj 330 0 obj << /Type /Page /Contents 331 0 R /Resources 329 0 R /MediaBox [0 0 612 792] /Parent 325 0 R >> endobj 329 0 obj << /Font << /F29 18 0 R /F35 56 0 R /F8 21 0 R /F11 65 0 R /F32 50 0 R /F7 334 0 R /F33 53 0 R >> /ProcSet [ /PDF /Text ] >> endobj 337 0 obj << /Length 2563 /Filter /FlateDecode >> stream xYK`!fOrז+X}u%&\9B 3=_?曻d%}aUnz~]Kw۬Uu4uSͱ<`gv?~:XaZTFd ?+Ҵc&nvzhZj4GQڌu’V" f"0ƊnsEqh5j\h)|Xns$?1_V;ҥF;Ӗ#(S0^Ø.i)P``^!(@`}eIIĕRV qI_iq^h@"@+l}Zr_cr x Knj hջ4y}`5_/,1Hlo,ZX[z[{RrV5v(C* ]PL ^, $ dʜG_0[Ɵc?.ꜝ(*r3!@@4t|g$~Nj.צW!>|Ӵ \E"}A0}7po>Ϛ((oRL\ƏQ8M5P`J+&YĶ4t3 6 @PcR.Q;G9R&$怜Vr^u&c@pߡ Ə1E[/Z#QvGb @7j)Vf1ZdO__W!` k!V•Kj{{db,GG[6m1pCL?6nolBc|9lx;"y/E5:",S03O]Wyӻ w\"(Y҃@7J}ă=75=,kԸX8nm58`.W_0 ?ڸ1SSVCau.Q.n?l];zy8)mg9ёx'רWT>iN {h>hOl>eN4ہ!f(+JDzRޭ/9S$oGs?~Pf?p4MS IghՄ:g?r8é't8(=g2p\}l鹄0c%`88aTD&+4؈/=t^%DYq[ E8S6M'qn6?0DȺD%{lUC(1 Ej thh_A잷{Ql\(DG5>n2ԋ$%HF\I-q|K,,``JK\wr[_׻ p  DԜ{:+ު ?ZH¦ ,s4/-Ow0O`(y^?Ƚd60> endobj 335 0 obj << /Font << /F8 21 0 R /F35 56 0 R /F32 50 0 R /F38 68 0 R /F28 15 0 R /F29 18 0 R >> /ProcSet [ /PDF /Text ] >> endobj 340 0 obj << /Length 3044 /Filter /FlateDecode >> stream xZ|x[z/\IEZ[n}gDY:v%kQxƊ]̬٬`Ⳬɋ8I;OyR󟯾z:+ɬԳ&?7s'v Y$ xPYB;x̓ G[|qoؗM[x^sS[xkaSmtcebTq\q٪3\t63%v^l.^s6[^d.2&|vE1\V[_\^#P@"U`ҨYR.Xa`Rˁv?e\ұv''vw^P#4O 5Ke,iUN6H)iUBrCuEl`qAr N`p*iGܾMHϚLI}Q~9lh }{jF$XKgy ZiDld"ϙC^_l,g6cXl<2- 18 KRغ9l{%iD~Xa|ZOj%8 ,(@珦2rG*S> ۩/F$%rJa*|3NVq@sì6ufXQn\RsT>`Vrh/ VD_JM 'CF<.LHV k,݆N(J<og՜?^{Z>ߓXdAM7a&9Rfn Hܯu>Q  A0ba".H+`v"OMSTΔ[/3IV\Tƌ΋4MPMi xؕ9#+*V`q9XS-5껪eƚa:ϠF79cB<oy 1#kȟt^tm" EWE;61(bΒ';j Vm[Xs 48;vJLOرpPd|ޞxG' <2,oUUt?>q,V)6YZCeC4 @yRK aOkXD)#EYDYwy¡CC͝jRXdSPUp m g҈ $B\' x B g{ \a:Ϝ =Ny>*a)XnNSgSN `̧(ɚOp }R` Ô0"Np(Ҹm998jkĘ{˥M~FD7CrӘwן <<$a1~1Dc@B)DJ9$J'W+̆Fs'怓VӛDgF-0/qNMVl5B%+ς TԞEh [,z;sI}w1#FWu:ɞu ƧݾAC /țQ3  naV7anq%QSJ<1X β cVߌgyEckTy2u];#~> |3+Y4,?8gGZiDl2i,64.i @,k̀7k.ܯwIZ~?*VD jlyulԱ88Y?t8~pC}K k"( ¯+K ܹ6JYZ펭BE :r{[<`u? !*{I{dQnC> Ωq2Id4eUCH!m'EFR˃VMAzBHY 1jG+M4{̻(JClO Ӕn6`WPûsǙe 0q\> \pp7՗[W(i1Jq6$KY]8S-ܳKN^ (CT TEl5r_1bO[bmmo^Bx e\[uyOSguLy(>dnY!lᆃw0@*i(!Ͽ dhȖr 涊ڢF6r}B/r]dP *X s)@[Gč6ūȀ.A,g8YθUz{8:Y!BrQļ/ NIxܽ;c>}֍\/X(ju?U@IhmPB8NI/9IS-ݨ/_>x\}}ȁo 8_ 9 0W o;F3 ߗeoФz~&:_)0Oyb_ `N$g2 KJx3 rW7\;5(-Yn8 b^o@OEos&הy1ذͻ 5}*ĵA N%oAwۉ 4; P#H}MsYyy3p}<` &?| %RZMh۹%\:Yqa/Y`uS6{rUO=>P"wՙ?[i$f8=N-dw%t )T"AJFr>B/gݟmѡIӟ`rԧ׽>JS;@aPK/yC֐D6꺭]0!ev/Q߳^t=%tp `eT;CmwtNDr-[hۻ*+J:gQ9mUڸ١!qvOU6ͮٔ20DɵB_ endstream endobj 339 0 obj << /Type /Page /Contents 340 0 R /Resources 338 0 R /MediaBox [0 0 612 792] /Parent 325 0 R >> endobj 338 0 obj << /Font << /F29 18 0 R /F8 21 0 R /F35 56 0 R /F38 68 0 R /F28 15 0 R /F11 65 0 R /F32 50 0 R >> /ProcSet [ /PDF /Text ] >> endobj 343 0 obj << /Length 2676 /Filter /FlateDecode >> stream xYKWjk%l'[&5M>p(ΈeJԒԎ'>HJɦR\D<Fuw&^*O~*J: sZ|ulunQMcW_o&*!-:J(&#ldD8dk7ׁl[ǗkuNJ^;BūO7@uXoP-\UlsVV G{IjcQ`S"}Pu=mΒ0/ݏɋ1, Z{˻JN BU鶧_΃d6 :=]Dg'!h瑁O 4ҙrtJa`6! քHD CueGL̢Ъ}U쪎ۿ62^E١Jp Ne]E8ԭމM=M$Š%ݲ!6D{b:?Qr x'k4-3 3$Md@}o<nĤ7q(-^7ɵ1`HEh\h$%,)ۃܘlM8gkҜ8L-i>qLea7f]52~5\VUL**KYݬ9" QY!9qNx9v4Q 瞪Z;%QJ]ёJ?,D#jc^>\"T.RMEZЃ S *5Z ցr"8F ؉pSسʢg*bm2@oD+69xX{dz[e%2C .s{oljǫ7 FEb4?47W䀳;K B.CHl,'VۗPTtsy4;/a*Ղ"0MO0t)'9 CiԾ<%cBJx  =7#xjx.=jv<:JsEcX_FJ{=eM;$VYc&3 ]Rؚc)y dB~b."M^8dm@x 8Xœoyc2ӑUa\QSZ$h38$tSp#ʍ6b4:8w `%|U"|̉@6_l3>#ҕ*PY'n1RoGmm-Ҍ{]\u G[Z1+7IgFϷ'>ØZ8:WR _ϩ}1Ww|P_4%vA+v0wG̀z-8-J%ңq6pU8S _>H'79CG,w' :L*=hK-6 Jhǀ@BغüPd9")+fFP*IdM׀hlS/wⰒJ:恇m˶ B]4ܸegk=L,$9qAP7uU8z'p}LA+Ȏ{*KQCR*'*Txr>]+ugQ|a[.^D010 B49IVtolR tN[|ƄtnT;>SZ{lѲL)0x'),L)8ߙrЍ"d22öA@oK>ѻ/T#x |}>(Mv4<yq!-!t)֚ m_Y24uHJ3e5IY凭( H?1i? 1\;1G_Pc3f$;h\#G`<<$p {-v@ 0낅v')e Ƌ ☃`*:yչTs`E,TLW'2 endstream endobj 342 0 obj << /Type /Page /Contents 343 0 R /Resources 341 0 R /MediaBox [0 0 612 792] /Parent 325 0 R >> endobj 341 0 obj << /Font << /F35 56 0 R /F30 43 0 R /F8 21 0 R /F38 68 0 R /F32 50 0 R /F29 18 0 R >> /ProcSet [ /PDF /Text ] >> endobj 346 0 obj << /Length 3236 /Filter /FlateDecode >> stream xZs6_Ig6/Hnn&%+HۼJ*Rv|b~3>A`bw'oD2'I,&qhXd6偞8:x r*Ep;X}]k^+gx:0 ^UqDOt rNfB3a"0I"$8;Xqf1,)`[EY#0SZE2 _K7` o%ruЋ4:i[[zKt-sy~?B;O|Ψܢ&H1ɌK[ o@mASV+&)qA+Qʆ |\Ml S8WeJ?1(Gn y Ur,zܑ `> +4Ǻ²xgN/%E V2&+cN鸳IENx2{.C a:; -oeFI@JIݖKb"l,ʪ hB|di]KƓj@))]N5E̒?&TtOOHôAHoql][WRo4:epgpl>ukGPk,Jf:om4=`#n_bĸrWC}J;a:v- 9H_AϊoQ0YxNlhx[>!㖭e/33D*8Z s=õƲe8Բn3'7&V 䂎 8F^rx/h:Cl0H>3J<1ϡϞzuZ+$K/˭.B$79,4a9 Z((|n*b&Pr3F\7mJr!9쓠mF˪V_Vf Nm~p̢n_Te*vr0:YgBUKzT$`O!}`&Ck;T\"X29rHc-.+@>`bF}8F-\Eʘ\g_rKqzxOS'}ߤUAƋ04eñ7*&/JڈMgZzA^,"~X =CѠntz"p@Hָ1K6䮲߆|XqѸ7EQ!-`22?ad !.OSq jưOJw~n?f2H3̐gJL~nE+ -Bwe={ve&h:٘$k<4qxé(Lآv'wb+c v3_n%@﯄ʑm@[Q^xWKTTPWo]-]DmΧϝ6ֻ5%]/)&}KbE/FsN3j4[,KRw8Uf) :0k5td wvKpdy66CYXoI6dKe&] Hȡwcr%2V. ?1|3^r kuރk-)Cњu S_HE7 "/?|e8|}N<⯻'QE킼H[AnCWB] `% v̆l#oNcUN~mHg.z ?vy4Ժ#5ki\hCx{}:`} դy<֬ClB͂ꇏ# Ps)~J!ٻwB:@t-܉@ʝ^uֿ,!y\$T"O~ {HYܢ)HYKk>AF)w@h$ Eh |X֬ClHX͂?>ߣ1ሻa[xal<hލ;":V;끸 ,pxf vt94_tt?~LG=@d:^Ùmf:~,~֬Cl? މfAo!{~(@c15x* ܉ä+V2 0*GVꯣTO8=F^"w)yبjH]#\+=_|˚\eZMG{.|NW&L`&Ȧ^EzZSO'q@k^5Qy.1oo^RAbʲ0oɾ+v(YQ[^hC~Sv iwSRwFV#z._e@07NY sT6;cd|@5V~Λ |Ǘޞ9܉Dpj!bsdyN~9pGkxv@8ͯ׆cH9Z?aw9B)b5~ϟߞ8Ǭ%删RxOSzPP㧷gg'#"n\w! QZ}_|PfF"$<@x̖!6YJ)"܇ ɘi%2N@a7`3"֍.ຐo쏁]1MA}Oy&/n19B>08q)WlnX{ 𿂢9dLPTb+2z.'":Ca :] 631Cpu\G,-Clg*ts!y}`x ޠloߝ )ª WNek6q xBE Z7ţEX C/㼗X:Ė1qD(}.9_@"C1o'$`c q7>̓s'~LI(B;w;"H0b;~TnC/bI7h>@}i$,=)dh5k#@)\of{1\9͖B * Iwۥ*uhɿۊ׀bk"}/(f(ERfc Bj ]+695|4ڜMjxKsiܨ#= E= G()&no܀o:WZTRhҝU$ձLЋ3.`K6 'M\e1Y#\gL7E=ʜr= oLA֔ qk3/? b\C ͦm5fʢJB֗7CVuGCH ws;$W8f+`&o 5MNtc<;Ro Fբ7$)(=cZ;t{ڮ0p>" 88CԳF3#d?9XwQv橵^wxmWKGW e=|7Ut>4}ٚurzi }ުEK3\ؓDip,#~88&dJ_/R~d(d#ȞFG[ɂ{'{p,MBB9R~FЏN,fdHn:. '{Mk| hW*` &;(=`$SԔ Df8H3O(N;{_.}/Ve{'Tjk҂E<6cut5l˦b60/6HW3J}UQ}sT# Ãs@(O>90y ^ٸәϱ*ѻyv=Jxd^jM-KN\}ykǪ?ӓ4{;3?Te;O&Ka˃bdg] endstream endobj 349 0 obj << /Type /Page /Contents 350 0 R /Resources 348 0 R /MediaBox [0 0 612 792] /Parent 347 0 R >> endobj 348 0 obj << /Font << /F8 21 0 R /F35 56 0 R /F29 18 0 R /F28 15 0 R /F11 65 0 R /F38 68 0 R /F32 50 0 R >> /ProcSet [ /PDF /Text ] >> endobj 353 0 obj << /Length 2711 /Filter /FlateDecode >> stream xr]_Q^\b=팣Ƶ33 1-{. @$K$.ro敔D$^$PDxZ..[}i]R /LgZ\rYxW|3m?J.ptXm&hTDv&D%ڏbD[]o?Wf+-w0[TPw "ZI!1|TQᒆ_?{~ ya=^Zj Ѿ9ƣ&Pnu ֢prTWȪ)v*F"ґuiJE[ ϦDiR'fZ$jrY,%bew s~_"bOiEL%)o@NhQCc9-5kJUgC{feV?PCLBDt!]} Uď {>lu4ĨlG KQv LcfIv3DX J&=rؚ;9bV2v7elLKCYÁL솷tUiOA,_[HpO\F쀟ML0yӷ)9EG8q0j|k+*yV ]4͆_UW݉֒*}=*?|4T i8Gux-00h=Eđ@*>-*V`l@qFw¾/+x *A/`4Ob{-~:ċ[{B&b'<{`?`Z2՗"{^ RYd#܏7X#Bpl"~({1#(2G hBe f(sRYPk#upЛE15ckX;VjGxClkٌܒbza]p޻"y/u  8X~^3\`Eϧ7%<{ ;m 0 #b_pկtufow6TVA^)ϢjlӛbψN6Yfz"GL'IH~,hV6LNcAvs`VzY=n!.E$!\=Ha=ފ[DǼ<ӡF)AE^DXH{[>xɚ[Tqpk ڙY- ,][FLO*'+3|!q>Rjufߡ$|`y+NfoՔ?[* <"K9nDԻE?R$~=mqS4qp:k&SoȪ1nRWCu]T@4'8 \qӚ34=7hU~'<ݲ^{tJFabT`(MSdmO`I+c;3UVOV!ДpR>"2eќ¬be5&mRbWN6S YLw :S ΨEN^~X%‰[ŪD-K4`E{×0~cL M%u6׾ԐvX4 PC%:Fr׷@tj?^>N$gV |&O;cc_܇Uk۔>.*>x^[)gV J-Y(%$,-lY}W)TL tBoycUjF[2<*m vw)=ggB'׿{f<|2ܾn4eO™ydFQ+_d?VG\ =uf_K=mἺi+OY< {$޾?pYapon/z˫sf˛f ]ޓiO`X\TJ|e_c> P_9M[YHo endstream endobj 352 0 obj << /Type /Page /Contents 353 0 R /Resources 351 0 R /MediaBox [0 0 612 792] /Parent 347 0 R >> endobj 351 0 obj << /Font << /F11 65 0 R /F35 56 0 R /F8 21 0 R /F38 68 0 R /F32 50 0 R /F28 15 0 R /F29 18 0 R >> /ProcSet [ /PDF /Text ] >> endobj 356 0 obj << /Length 3343 /Filter /FlateDecode >> stream xZKsW 6֎0|8!uH> vAXrǧ_3 %9H ̣_7&ZIr}{,.TPxڸm ozKnS,{u?6VG`O߽Ǫ _oMLqɣWoQ \GQ4=\Q{|lk=.9fk36c_6$  U(M`[ݞzʸV~]ԵGP~2ȉ&b\Hù|^J [쐕U9緲S;!W{^s~`a[k&NNB7c.`f˹B ~*X)`vNޣr )hnM񷇪J>3n('658߄ 244-r>=4k6 QosMqẙ27oaonEUFf2,"ldE g*R;RteCߖGYfy*9]0C Kϻ/YI@a7 P^U\b߂K $ViQ$fIjmLAķ*5'"W=MT|WᓀJ-ùZQ[^,i&*3"xQ̂ɒ/b'V$#qٺ e}  M?E6L7^16*1Ik:Պf~JMF娩V.S??¥eQʲϫ{ldW=fw (ŠPt`h_ 0rcBai[(3!8 ֓슘B -S`)$|8[Sk)[`k YzP0)ؑZ>f־Rmu M\۹j2tEo'hoJ48 YCk^@q$.  1k`T7c8ԤT/m\4d["kg5<V:ȃ5R &-v`CWL5׀E씱W|(۹#?|!D W"(_hGsy3V$w<{(f5s`$Wc’@Ѐ3&0[>˞n";U}5gFgCCpKj_!8?j D,A^kdՑ VcDΥu^x pi.vv=ϡ$zbM0N.ŖEIVGY(anlσd1N4F` l'M0 gS#@-opx,ƒlp$*T I e=%I}/͈& lЙHx1.m "K=:[|j:=E#@/1O)%'> endobj 354 0 obj << /Font << /F28 15 0 R /F8 21 0 R /F29 18 0 R /F35 56 0 R /F33 53 0 R /F38 68 0 R >> /ProcSet [ /PDF /Text ] >> endobj 359 0 obj << /Length 1762 /Filter /FlateDecode >> stream xڍWI6WE.ƌ(ZzK"h9%9mEGKί[HYE[(_PaViJ\\mO[72hp؛v-nQ z\<̷4E(쁿ճa&8!(plpruel"WtXu&V|8 ?,ѥgmy;~4!Tͱ㵧S N<-pנLMij#qNҠ) Q,~iG}V`E4uip ٠yg)XŒP<lyAjbڟ\V$fGvgMa3$~y٦F!;6pa :3^BA&Js.J5|h6}u6bIcMj^׀ͧ$YU; dVm3}cp_w/4jB_vDN_DRtt~sEP"ōJSw_}I y endstream endobj 358 0 obj << /Type /Page /Contents 359 0 R /Resources 357 0 R /MediaBox [0 0 612 792] /Parent 347 0 R >> endobj 357 0 obj << /Font << /F29 18 0 R /F8 21 0 R /F38 68 0 R /F35 56 0 R /F28 15 0 R >> /ProcSet [ /PDF /Text ] >> endobj 362 0 obj << /Length 4155 /Filter /FlateDecode >> stream xڭ\[w6~Уt!x7Gmkinhys`@(;6NOcJgsyσx/M^SyXϿc~x'Xyu2; 'ZC"6=i/ei=L@΄,!"~Qn}2OҨ qPC~B KQ6}ΒH&XtҴ6.?`Ifpq^2q|6kAMBL6Ld۳Ĭ=&-6~!qC=|խBtn= e~c n]]WOo79J+9#hTZNSE1` @hIt ^3vuBCJCT[hab)4ZsXhXFAf2'^ڪb_/sfq~. nenVL3@Y ܛIrXOb Qp+`u[Z#..~gm"!fx{wȏǹ0UP2eobo D[y0Ƴ t[ n r|>M_ dPf" Q> !g^J= n> |T7-_s|曟2 n lr^.z&Z:I~P-+mCo]??Nrao8}A\CUuXןV_3Yb0ĺ@k^:-Ht:p˯%(QgV?lA[> LSF\hK{:⣉#5 kKETJExq"X +HYn`B0 6.ͅЁ' 6u[ 7QDԑg%!(6nw*Oi\>oZQ}a\z,r])CFb݊Mk$9L.ϟE;b|D!"J]-!%Il"хߵtgi[R꛲%\:D]@a!ud[,b"k$AVчH#U }*@H8RaX7h FHͽ|Bl$Vs h2G;hp07k b #H\c׆X7iT x%7mV>{,< e̕TBeE b5{๖Vj(2kdz[d"[偂L,K>Ĭ@.ieV8i0k:>=Dȼ $oۯKR/ Avr+ jUa||DL!֭´FʓêX/i*^ncG1EYiuۺM.l =W6!L&nֶ~f,KRF*c*!ƯW z% {$ l*gIDm.nA%}W2aGICP0|&ӴL}|S'4Ra5 6 |mGt;PI4:ܺ;T<bv!ֽhq>ǹ戴X#)c]2"eط;ag, Z:(q!_|7wŊzNzw"{}Hu]H|Y7znL;!5JZGY+{EuD,>|;p-Ac?̍\ nКcXS(2ǸV4[18Rk RUwNI}*G,^\`uYX7ijiZ~ogjV//47SǮQ O2z!Нh,VN;+9K)Z3u~MsUT 2_dW*TNיi;ިӵb9j"-6ZI}O ̫urL$'"Z˵T6R٘1v^w_+WE(ITXh =^: b TӋ̫n\F~/rU"۔XSo)aa?靺c걒zڱ<`-%rf Lm/jH}@YzM%Kla{oJy|Wn5Rfl|>ȺLOmvVr} ؘ\e;2m:‱^|Wn j|91|Q;& Dub™Kd&ic%<^O: OYR>?b7XAïxtQ6,ِM bU2o7&T=+SP7"K7с;8qK, PN^eY f/'"d!<(vZGuыDp,dTIq ]!6Ԉ-g\sUUb"y]`h -b-HЀ8^!?ȅ: [EyJy>K}7 Ӵ^R6PL9.y4|h-fh$`̍sa?T[iZ{Zڐereo;c y^ݍUi),K*n)q8gyJojEδudGOK^;١h -b&;8 w,#~oz (:3B9ieَg>FP!1H#WfP; ԋ56^:숏4kpN6gC/\/AH,O#ު2cI5[O2$y NvuhEuy!sTD  &*WR01sU&}}55~ dl[E=Ѹ`k> endobj 360 0 obj << /Font << /F29 18 0 R /F35 56 0 R /F8 21 0 R /F38 68 0 R >> /ProcSet [ /PDF /Text ] >> endobj 365 0 obj << /Length 1874 /Filter /FlateDecode >> stream xڭXM6W=ȚI}d @$$ˑl_ eienZ(qfȯVoT:Htj9_eksXH[,WԻŧo@XsX,#? X+ZzE_,U B0e)KXnxr+'D :ϛ n1-Gt9_gdG_.י=(u/J`^J- ۷YH{| ^a[4n2;iH$ajYl^ P *p(!@ވ']#]Ď|fM|͝z U _=*nv%Ižg{\AC |3̀ƐYI`9?*}()o,]9A?fpIH{ W7.UAF3a#C3 xsha,U4RmC$4N gMFrb!]”) 's. lF2bGTX_<__ M~7I{#84Yw) TcuSC ;B`MrrD W0Ѕʖ3}yP񠊖3B?L6n)eex|Ng菘^iSvKW1Sci[ uڤ9EAf5K4fN[03 l6P**T]#KX8{a%DD~4PI4_W/y6og2M $Of{tX+7vz? Ktt |_6m*V8(M۠_ٖ =FuhX!v϶gzyIG5hغl+eXۥC#_Y|Q.#MpUo0jG])^ɶG9-clʸoV,` ^&`gɭy/bYm;Xpdz!{G| 2w`T]l/B`d:03ŎZ”?c߹4l)$ur⽋ٿι8Hs.>CyҾߌ;Utovy_>pba })c7"}/ endstream endobj 364 0 obj << /Type /Page /Contents 365 0 R /Resources 363 0 R /MediaBox [0 0 612 792] /Parent 366 0 R >> endobj 363 0 obj << /Font << /F29 18 0 R /F8 21 0 R /F35 56 0 R /F28 15 0 R >> /ProcSet [ /PDF /Text ] >> endobj 369 0 obj << /Length 4289 /Filter /FlateDecode >> stream x\Ys8~PÖ5BH93>-16ktDM_F-TbIZ_7rrgeL> b<$ab&gn4β$.p8ݔj4j9e$/d$AbN~%N'Y:f`q(󓛓XYc6vTE8Ʊ)tCl ,mfda؄dR4_~`nX2e! XgFo@oggi$e8\˜磱r8+\o %ؔny/˙~#|W ޮ3P">‹|7V8[rn2ͷ̊^@hoɝqC)YE1'MÜZX;shLs|ezLMyR](mwZnV|Ē{$خFcPtēJE5^mb^WrYL+Zۣ8lj$b"NUW*yE_y;QMY hJ?y}X0rOtӁ,K.XWoqq+ QVHG{'F7eѵvҘeU˨Ёuqzf4TH$۠ß׎@~u)~۩aCv{SO(J\yrZ?[d, |w-4>`Ynt2p`xrnዋsP?%W+t5ixvu0dRk󔭉qx`@$H)>DH vИeY˰āߏ%Åwd!MIɗKZM=ErƢ# .+%+v",I$oEx9#SQ 2ä /NXF f{ÈE/X k6Q8«=l "?HV76L6bq 1zcƬ)Y²P;6dΑb{-_3%2{fG GJe}L,M&Gd K9EFV:LD\Ɩ$k`Wxpe1ipJPb{2ZXҘc 6k]،:^_>bHS0ܽ'[T+\d0)ddŲ)À*LjF^tK;q f1n4CGX+U̘#J'6iTtCVF*0X ]A`%#94:PEB4p[x!6,_#7ۢ9)8d"⏳4Y=9eGXјc,6ki]،9.t]>&חI)=\S,V% .UZض2zeS[@?}z[ės,8~"GZ7&ndk[fOvvPE*MkIEݏZ>;Lddi/9Acl] 'l75ٓ`@hZT\iyU!yϿ{ͨ@έO:Zƾ\D-4IhTX?ך}:$,J9%!nZ(SXI%oSpH0o&GvҘ>euڅJPWƒru@jY;?hYk]=d!|ߗv !} Qo (j>"d*u۩^f y1߿Ë!ý|QP:~p{R?/A2o3Q.˙.\47'?ኻ[`6 ^I. PW!jY!=ʨ i³WeռՠN[hZ2WʛiT dvј>eׅ(5|R+諵P96%dVٕ5qouoױi=)y&D3uіca~-;- ̖%71o;w[~6{)%&77_ީNpGp,p;޼~7awn; gwz,eѠr!@E)j2kwzeL3Osq.ˡ.\CEM\-+QkCƨC@iї;t*K.Tp˗iW,sEVb20)&vS/d<ܩJ {ПX'VوaJ$c$z:4k%I/ y:Qy\T>=G6XC>#7ߋ?$Ǚ8*R(tՑS€ej8H@Ē;f0E7 oL(g=&? WgӾxu˂~ce𤆝@uON5&̷bi7J1=T|k,2 \1K/_UPfa.^)Nܮ>oI2FNݡy8(RU}EE%oZR)ME ~(r/[^ զ_ݭ;nH~6b}ʄ'q'8T}YcG؞smc$pHPEaŪ(ymM, ~#Ҿm ܦy'"3B$,X$ X"c'@4AbO3:oREq{^rX, njg TO:;Ǩ i^{@Yܧ-*p0j}/Xı^:Dк+Ku܅8xvuYu_~(==W]wZ:Ol6t=ȖuPm=XMdO@M0!c]5vǺ ʏ긊 |"Yݸ2 \MBW7a:q(#^9XÔdn\`oa1Kl_a^<{P5QN)Lao8dTbp4 8q; sXlEjTzd(rZӹ#\Vov)TاlXlUukJVS9Vɵv%T5g,7Qa.Kj@=ײh$]3P ֮#)huY*T^]QTk˘ja튢1C2n/HV76)j]lVCu]F=5gW}޷dNxs^kess`3FqݏXj7j3 7aP-A4F7=EqZ6pwǞ_v$'NTOԩSQ.K.\:ÙL<HØT2RGڡ6ra*u'ZU{84)IvDU-,H"I+5vW7~&,/xEaO.f56C UC>O(=nfRܙe~S{m|'T'PY4^ݿByj3u( Qkb endstream endobj 368 0 obj << /Type /Page /Contents 369 0 R /Resources 367 0 R /MediaBox [0 0 612 792] /Parent 366 0 R >> endobj 367 0 obj << /Font << /F29 18 0 R /F35 56 0 R /F8 21 0 R /F33 53 0 R /F38 68 0 R >> /ProcSet [ /PDF /Text ] >> endobj 372 0 obj << /Length 3701 /Filter /FlateDecode >> stream x[YoF~+v7,aqgY[6-qd&BQ`M6E6`AA N7vI%7tf'b2ie.|Sާ%_CƵ!煗ּg)W3`/,g]ӴHC~5zY'VLGA-r5us2E5UM]j T?S.l0ubqcobyն(z[(mHMZI!㠚n> AXyl&3nomoZJȋvgB C]e>ۇ{Htt=%rg_leǡV' xNB 9ms R @hլ/YC^ *ړfhk|^Am{K~ˎUY~~@7 D|d <ǃpeirx\>ok_JпJxW:̘NK(`JRWg@c7B>ĘU)㛣heLtBh0A5zUJoą00ehsEvش9ͥ tY"MZ [u4oRS2LtآkТ5RRj?Ndt 0~c3C>T1'D5[V/_ʃwl5'T7U0j.vn*L moj-?͡JbЭ9ؚ:ljK|ȃ d #CaClE6 Y$H:\aCU!|Ayae)Rnэ/l3*ł+B-=Q@-fN=_M$EMtU-pّ9[8x.W j7xq4l;$X!yeꞟڊVk}1ib+Bd8a^ix35LT OF7h}e-TgEY&vRf xM>yG'>ڻ"bޟrZh"+ BSQ|,*({Dž(yPhe7/"[8ەTt[2XRu8`qBh=RPtA/A M霁EvE?_@<ͪ]GFSM|aδP bxt4s\/؟<)8vGC5H(t .[p \H0x^"R@گ־sT\<!Ӗ1c 2 7]y@Eveu zmG[|WQ ;"ԷzP;o3D=BrKWrLdRi<+-ĺ*!dW%F(fmp8BᑉPtx./rpCkk;8Nu$Ww[?`A8z9V2 7_ӎ i#aeW+-"3q:lLKeD78/yˑhkJٵ74,D&mO^ܦSNx=Q~ 5uu>1~V<f z_ik+hలj{H(  E1aQ2K可mQ Q0J7:@<2⭰Uأ*KsM4uϯ;PÎٺ{w[YuI ԽJXeoB \p]mo&8ƸElZP?gǽ endstream endobj 371 0 obj << /Type /Page /Contents 372 0 R /Resources 370 0 R /MediaBox [0 0 612 792] /Parent 366 0 R >> endobj 370 0 obj << /Font << /F35 56 0 R /F32 50 0 R /F38 68 0 R /F8 21 0 R /F29 18 0 R /F28 15 0 R >> /ProcSet [ /PDF /Text ] >> endobj 375 0 obj << /Length 4477 /Filter /FlateDecode >> stream x;rFrw~oj5"YY!w-n=`1$~z l9@JyՙminˬRӷ/csYEgy^ێX_v0^ozՊggM}_Uݷ{|I ѫd  'pn坏#!戨ԛy-F`nۥ*wn_9}9C4/V[^yw Xq/2q.E3}YxG~҇czٵ@~;Bǯ{~ BjaBC 6FSG DD3 >1;@N&'5Z5cWy1lDeZ#/?E~ .SB@doLnES-y(q/֑s$ȃs2 _:68w2$#/޴Zo Ahږ#9U)4k#&V0_zG\0!([-aD>6"?clf'ڽcY+|yK+0X@ݏ6TUX4K@*sІ &f0s~@ 5D(OQp{H#1TyU;$#.נ[i0@hZ+Wyb0`A\@;Qpmň ZڡX{d=Bz.9|ϙ<Dρ)=F2t6\]Kң D1-1x߇W̑;b ^~̟: F&0@A[J+<ϕj{ݮo?dV3mo|%wo!-2s)kL\M b >UyikT r7*M[([8]|Z3 B fUU9| 4SYrm4m* V^yד8|gA>S"_<Ӗ.ip81=o.3-'+&{i,JbZTv+6dy eY qs(ħM7S\c<̲TY@oLLM7g*sy\P<}Д=Y"ˍ$D@ͭUHP)E!L)m#c``lm(e;Q D=7J'qfK"C%&^Q^%mKl"rh7䑔 rQP"њ)h sCjTX,wM+q 1O R `= e9er ̢Kbh[fLKF:}RrAl~~YPR7sKL+=U^L+oқk(<.y/ݠ=ynYF"@ ]^#(.|)\|X@{Y./U6~Îy6S, R)1u7 B-bX$aǙTPΘ9hH?34> H}m^J_%/J`ˋ”E@-Ep y)rdfF6P=``Y7EO !b\$k 5J`s-q6]Rh\Ba=ʙ+Uzygk^L`|=4(-V4,Q]U+ ".] &wahQua-^=Q3L tIj@L@+z}zF bM, Pώ`tԫ>ԫ#D rפvgl򴎌 P=Rzts*s6ΤzP9 :âqكn9^CnHflU*EfOȰA3 ez`?WW6SwlGA!ʋxWd@AeV-~hdKڌJEFϖZeەF ڬ_aXvg9"?qj8m>a-`S!6MT@/U΍JP\ҋ38a!5+/HS.ˑڴB/ 8r`? w7wtBgbn0Xt8OTA|/E \۪<263]tE!l Ƹ%aEZr=;/2'~7d FI[PzT$N{cļနCC?#ǫpNNƾτ;-bӵS^k`7]dP#UK_?u?W(W~ -{r2jn~3ܟ~v1s2+',XJSzb2L{ݏZ, BrVH-p+٩4rjBBAzFN%kiɜXu"q[Vʣ99ob6T*i莮6_Ԟxst3))?Dxi ƽ^C7X r7qe=O0<;94jTUN({ʔ3:ζ8bܯW!Fm%l 9U`s9k*W_ߕ*a]:DWWԐ88'-\P*uFTkAFV*1(fa~33Ft<3Wy 9x|FFm"sպCwALh:ܠm>ʧ=24Bw{g nrlO9'3eJҿf{/ ۓztO>r2R΋}KUq .^>W5Hrl g~3s:̷n`ʟͶ:mH4w?ٚXy8|4m=u?$]:+FOnhā?wV2KTA`mdΛ$H`-` !)x7.s qW/EUA:d MO-@yŖMD!%mM 'Sե=5)ҼPc"Z&1TVWq{^ؚʙYL17"yЍSjWH5?xe"2E/܌CqOVl%ZŬ*+mDU>Ƀܙ& WM<5⋜NKܒ` 1f±O~`1{IH_noXv(V]3݉n?=G|,z.TzX4X*:.xIXۄ6lwڛ~\kg;Er6sw3:ӏ 8~2گG`-ҏ:׏|t}iN*-w>nزjwIWڳژ"CeѡIF^͗+[a}cBRny 1Ҷ>v,"XԆ:D-U(؏}63"xW6+%e5[Yhj>uFR TLg3oIkÜKf!%%XA> endobj 373 0 obj << /Font << /F8 21 0 R /F35 56 0 R /F38 68 0 R /F29 18 0 R >> /ProcSet [ /PDF /Text ] >> endobj 378 0 obj << /Length 3229 /Filter /FlateDecode >> stream xے}OBs *P9*A֮dk,_hdjOs鞾?W*X?2"Z[M6[>oݺl_̗}m6.Ro7[iYM#`$[?u--Xu&#/-r}`%U|/VjL؂.}r(3R*4ϭq.`:*(oCXPuVG xB*p1^Hg+W r_Rq]$@\N2zGj}s;sI=7/Ay=I:9IdUDEjPT"S ZD&4֬vǻ!^wqd| 8RE: 5wǃ:Xا#4҅b*&" G)hЛ(I9:&ceO53ӳDx2f_#o:=eod@ěvI6{ai8E*k:`HƬwM]y犯.2'1&**Xsl9G^Hیppw5]ʆZZ-RW Zi$x hfŔ6>8+9wMyڣЗޑ4%Atؘ)`G4as>vV#(tR`k]$D`O 2id$?ip @S-}n\|e[tLX>;q9-̵K^sq`5B-w{pgYn\ԎmdKӛ(LO(/<} mlE<"bTMz~1ÂR*=($登Q}pTc1mki puOd_1w&Yh Q "Jz˖YjQ6JyX$XA`>!Qxn36q.V6Y K(9P,W0^g#┪h_sv [8p%"Pu-Qpg* eW]L8O(L!7$P|(NJkz?W5tF.%s\K(ҕx`a7 Nȍq9!sC$U!g"%? 7V;W |du\={2!.9.$XB`+vv\9޵сJ<$P-=psVN:Oe-ᒒv6\YE;F>cmZ|ԝGlNr֡mj8sʸ5K""ws[F ĀEXęN4),&âQYvN`0#+y? D|}ṗȺdLHRHY>E.GT꼈" T0#sѱk>B B\}GT|3&>5]Ǣ>? *n W(uR (XJa|]X-I_&#/c,kUX\fꙗi+WUS{*v/As06Ƅ6g)wa:o@)uay "qz}'6Ay׸bV?śŽ$Nf%x=UÁ<|ʣ±Zӵ{*i|Yx#-,rR[Y~zrO(H2`[eL4Z5qeK9\SAsׅ66 WN"+ "v ƙFk1yHdFMkȢ2cGDIe^"^`#,LG*ȡa=vNZ}R%I)S,C<.$z/Ȋz,3"GLWCTy%yYstOAjCRqgB16gG 3~3Dm`S+@hM`Xï"AIJuǖn&erKȀ46=LwCb( pQvKbJB<)$9DWzݎ_YQcngZgU`[aMMQ_rH*x|0zcކݻ`J)C) :M1))Qp7 wO+ HR/[Z?^11sjۨQc"gTK@he1ydLŪZq,_UL0e! ?bkm2Cؔ)h˔Qj<,-sk~-^ր܂+bl2~ ! J_(%¸eUAq*RwrG ⬌5[5@86g"\sq}JEe*.m븆ee?-皾 g#g_dJ|~u L,÷k_{ \"sGř" endstream endobj 377 0 obj << /Type /Page /Contents 378 0 R /Resources 376 0 R /MediaBox [0 0 612 792] /Parent 366 0 R >> endobj 376 0 obj << /Font << /F8 21 0 R /F35 56 0 R /F29 18 0 R /F38 68 0 R /F32 50 0 R >> /ProcSet [ /PDF /Text ] >> endobj 381 0 obj << /Length 3145 /Filter /FlateDecode >> stream x[Kϯ ĠfdwN`' >gF$%ή׿>U 5rX E6˛_s0(]CXeaH!f}.y}xX^׷\"7_۲[r´Z_k\q+ ]PHIˎjw?U {.5fbhm\#% %\]@"%"j$9T >]^J4Rڅf񘪊 K1?Mք1!$}2RrWܥ@&@BY^`աZ2}O"DIo̍ fVZ|72(!Ai=?Edzs#U EvTHbdLSPȇ=bǨ&s'(A/FIKF0/BE?p. ($8 M4URA)4`lO$%;ԻbfY( Y7ŘfCyl%-A=b`YB^ܟC}[v16S[JU9V!(?/a-+$j:/[lS.$Kҷb搞^J9Ú%M)ًI?'wXB>}B^_|ߧXՙ-"Ҽs2}53O_T 7{E;"ͮ9|pYvv/4{C>hbӀ,UWd_{mB"Vx˼k6, @cS=$ )w.kO+q-%0ƍ$7p@G*c{x\TlJ!"ׅ#~euF3Hr}Z`Sr>{Q}!$VACݢ%&UT JCݧ' mj.pYǯ&@ u2!wR'%~ 0b.7#b#na __3i%|HRbZbr3zRvXH:`*]@a4(Dpӕ.@\leT]s(z49%aOt$FMG_8O$NGbT$WOija.'lEcGRPV1d>PgskX;g@ 5uW m2xKcoOtH ޞ8 9w_nզ*;YXsbX1yqdؤ1lGs^,N$ WbW+4Xlۯ`Jrk!Z_]UHƣO'e!7={q ]ׇ&.eC#"HIx9hG( zbQN6g_8N\WrS|:ԿPcb<I:qa.Mc^.)sy$J?qu췶UBa  č3"j&u 9`.SW:OE{" 68[uXq6t0 VwjxTNԺ :vHj U әGRĮ(7y"O P +;CƶZU;$KE?֤~jHޯG@b=j?~@͔WIM)he ƚ)Gs͹QH Y )6p=TQBġ]vi!7a͉ (ӚK1_oC0L'ivWW0@46u;5hr"W[{twOqS d(3I ]cҵÉBF3ȅd@شAXI pfyքr6 ֿ?ǣNm훘ʮV/q hNڌEh5zY+#bi@i\@" kͶur)hMv`ĘK8]͝RNs bF|P;^j5Ҳk{ʭKqn]TW"?nW>Sً#rtC#}َzG>T~T_b;W[*K[υ#`7'[/vǸr<>f+DȤ-OE1S.VF).,v=<"6څ>茰qS~fmH^b3|4慚Ii8NcY_F>En/Ę;-_+NVHDsnd$ ~$"WF*,T!aLtbufqs fF8qQ{UytE*o=?#e&Xۦ: Q~c7I& %GJ9dQx}]Md s">7%@v>S`Vm'pi 4/) vea`p_.}2>61N -[ hjK0Ҽ9nFc z P˞VKaGߠ#y 7*sp_rq؋-CڣIGќp;Phw)\Qzt]K_~`vƽUuwc'+ ܙ2ڦI4%ڝB_^ endstream endobj 380 0 obj << /Type /Page /Contents 381 0 R /Resources 379 0 R /MediaBox [0 0 612 792] /Parent 366 0 R >> endobj 379 0 obj << /Font << /F38 68 0 R /F35 56 0 R /F32 50 0 R /F8 21 0 R /F29 18 0 R /F7 334 0 R /F10 384 0 R >> /ProcSet [ /PDF /Text ] >> endobj 387 0 obj << /Length 2981 /Filter /FlateDecode >> stream xڵZK۸ϯPē`rXUڼTm8Vi$H؞E"Fn|ۛ7i(D~QBzgȌ\ܮN]{=xȈb ͟oo$d dgxϿdM& Y% _?;VV(,R a]H򼥥֍ijTdfK!IIPTJQXKLBg*hx>H܈I=3'1vq VR8ByxؠP1t6C{!}e EE5pnoJ9a pN e+U󚘊{2Rm$Ohp$L~N%2St +g<7@oKcIxds@jqg*nVk'U6*7;]s ź55iW|Uh%q؁$/: G WmYoLH)Y5e#U{BnjP:9[0\hX=iJcY9oqbFt5T })O68$CV}\Ul`;$ Z~{eB$mlH`;fh*fHXASiSC=J"?;n7S#S"Ss\ R9Fj&I{,a"kF(yfSÔFXw>e8 x]ɱq2*=V3b{fG;$p>ak36]wMC.j  H$̗Nџ]DaL5Dj̛]+LTc(ܒ8 Έ)5WvvlL ^Ypa ~C]+x_wXFyAEu4^Xyyf3¨nBց{0. /?Ί9̶aUֹ'8ox3'5P2#G?B4ûrs%zO#\Fy XmwWE f%!ͱGZtb^s7&1B:Kd-t<m"Ss 8p),zTwկ%DnuۊUJf<능J‘lCKz,aQU9찳EG)F[%UyAQ݊5yyڞ9k1Zܹ5x*ë-/MGvu'a9Q2t7PF4,;=!Ay֫t(($rQ SڳOb(L>Y]"&Cy<^Bd`5 dK%\X>\r\W\>KrM:fwϟM~hes|CtRr_5@DhC XG] P=BC< i$Į\yirWddG^[ҔE'e Ix]򑄗Bɵ̿pur)mMAMسC*5$sA-> HO9([K1ljܺb})Jh!) 5Eq~1`C`yce=V;oCb`9D1 J d~MAt6}Ql 7iɫ#\E3éCm-Q)3ޠ!2 xKs4ewq1I7-]џp!fRXoI{}f aMEZ+0-jIc C0BttU+75Wvŕ~G^8A);*yRڢhO.7!``E o8S.,LʕdjȂ9<MM 4Q,Ҝ3Mp[0:Q]pKޡ1qf  Vۛ7<&#@*IiH+qlT(/tO̵U^ ۏ?KLˆ5 ) (cŒFɯKW]O)qpo]݂}}CxD\OP`;[6K[Boem )_ ro*8UvFV\t/ao|iFlA,B23rETp;=?\p3ڮ9r=e+8JqI%X8}G?<}XxH]d]Ve;D: ZD'{c1w̋wah Tsy4J&TVxi軕$** K>ߙ0ngL`P죂`ɸC\}L%MA;F naѽoˬ# 'Sa0ÎZ((Әa:q誏cєQ!avd7-EW\he \=-tl/'Hs/3~"rF$8fܑ6߸/N;38L0\#_Vޞ?7IB뙕?NCa[|tÏf,~v8mkBa9fg3}ԝ8Z2!֝2."܌O>+9؄Uo|M̔W?{كDsf&J(kfr; *α+2&~uŻt漳H@fE 5; endstream endobj 386 0 obj << /Type /Page /Contents 387 0 R /Resources 385 0 R /MediaBox [0 0 612 792] /Parent 388 0 R >> endobj 385 0 obj << /Font << /F38 68 0 R /F35 56 0 R /F32 50 0 R /F8 21 0 R /F29 18 0 R >> /ProcSet [ /PDF /Text ] >> endobj 391 0 obj << /Length 2606 /Filter /FlateDecode >> stream xZK`PFHTEDZҦr}H2IlH!=ĐY%~M zP3Kl%f73k b%TM=gnռ|9,?6` dXܳ7 A9m bO$ROSY@y)(|yɊoAo_MInX{i6b'?P\ u36c"YU1lՏ?ξDX3{5%klZ]=ׇNgcu߀v j mz äor+$cy@,*-\-k%*+#mp`)3AUyʄ"\a+X#sQV]l?w`K͢7nn/޽GMJ]عoh- Omޯ\5R~!0qմU'<&|x E^'}V#-]"h¸'J%mZ3M4#-/O34<z5F_mҸaGzӭOzpϽ ,㗁ud`GN(Aw"'pn.>6>np.U^gOb1.|>FwF)@w}ZB|G_AL!TCpE)ThKP٤fS* ;@ʄ$9$Yu)ҠЛ!W^/|Ds=C[ߦo9 9/3+ޏ ;tH7MP84$}v^ʄ4Y26 xyCb,%F8R8d/7Fg桅rVf1' ]lYGDS>0j3"B۲Y5}J1ImuZB*{d_p=SBt}U&̦瀏X5l8l!#߆Y|dxP]ڼ_M8+)FC,C* )31U&2`HsP?!˦Y v5ȬK3 !9G:Vߠ5 >%Nc25= JlΈG kS7Y9Em.O 5 ?-< Cջ]jK"bM 2LB5s+HY) L=&u AZuO. ӿϦ_Fj:&x~CIJpeDx i"V4BGc@3 xK\\F8p.X4?b D&ppXir8|4r'N9Yw-e[Fh밠9%T\l?eAvIWyqݫLj1M{诠bNgg2L!: o8ά}W0RYZHs3LR]F\~c;_@.3iͦM4W"[ڤ+pl 1{8,Of<[#G•^d}G@;0̹uwػۃG(GPlT'󲒶xv]hI=B=U^/AH`2KY|=7brN{qk7>)"8޴q&9gWmJ` @>E}>@QB#`tx?'_r:iػ)|̸bf@}^ W@2$a!?)9Nu*xK*:)P.#g7X XGqk͠ѓlܛM #ذDɊ/;/FG"ɶzRƂr\~30}~v"a"> endobj 389 0 obj << /Font << /F35 56 0 R /F32 50 0 R /F33 53 0 R /F8 21 0 R /F38 68 0 R >> /ProcSet [ /PDF /Text ] >> endobj 394 0 obj << /Length 3063 /Filter /FlateDecode >> stream xZ[~_F"FD]6m 4: 4(4#DI@{υ(K`S"ysѼ^}6ҫ\Iެd /R cX7F@ME5>ȨL# D`VyM+l$̄+ D$BFr;^|Ïj Eg;BxD橾zw7GJ 0z k,,^}^(S3rvU}xLCQ&pS0$X P',h,e$ Rx6ƾ ӽhېMb 5Y2_oL*E$i:0\Z@عAWO =i|UxPLBl(0e* ;PZV*j8NYp(QѲh841` 62e?ڍsH$*d(` @+DCE`I}H "^ˠ/sI@"a |5,7Y_̻{b٬J:#rU X8nX+ڼgy$XdNA "lUE#3;c蔈@:g/cX-U~|uYA ,[kuA"Qp0CsQOn"i~^<;n'j0@!fcT_ybaRpdehgִSU!׿'k1B%FҀ4Yst)!8?ќeEd < Wqa?H5is!MD*1lq' eA 1$# esB@36Bc] ۋTk'1(Aqj4<$Jpj&;܇6yIrCn8ɚN!WIgSZӜ΄r@ #!Wb, AkAuxqbW&H(ʆO:UNũ5A6a6s9O>Y.RΖHqh+=r,&`<PTސmW7NUK6 Y:&Jb <υDj pH췉qf)P,5H/#8Pʱr,"ObZkX&d*̀r<{ӥZN k&cuh+y<*R[SY;6`*?O]iYZ*:NL𒒂]9?2(~D%0Y+XQ#rWN yq^xK䫲ߡVĉ5 Hu\77_o10noMyjٚJߨpz4viw܂h "'N~W,t%ÊQ|/e޾y{򱛿'ΙpBaGS亊7cW9|˳PB,h_'*lCze""|,YZE).P TA9\¤F+ؚI 8*J A'/܌8N18-.A t6 šgrCq5lB+`|[K ~ЉTWea'JxBqa6GsPY館r@T)'VՆVǽ\]CoU _Y9Ht,(' _ndX_r>#j {aLڙC{fA uec[bs `BQ~2o؅@PՆIC'<LKf&l$:שDz : oAov]}(Wf+g)( x TbŇk^}g\$ zgI'RUF?3ݝ_K &Ք%k(U]|N m!x\z<9î+9ڌ6l!_c{Du-I uyW,P2"om[ݤ:m, p4frEj`_sf¾yilR>q·~K/ثiBڬ&jaO$)˒+)Xy B;S#rҝ 1A41UՏ 7iTc*{v9\nY*%t剳X٢akoa5ό^SLUB\˻ h ad +-<}!Y,a(w4 [QhvɎvǏ>\tٜ͑Z]P0J%rGY$HHisB 3׀\w|h1:,&$YdXRwLO@!Ιw.y0k2ӁR0xτ8u#0~ 6Ja\4p;/i+9AA9yp+2=mYp@U~ 4GECƒ@BbWlU?7&Q*1tnX|+dۆ<-z0sY=}V> endobj 392 0 obj << /Font << /F35 56 0 R /F32 50 0 R /F38 68 0 R /F8 21 0 R /F28 15 0 R /F29 18 0 R /F11 65 0 R >> /ProcSet [ /PDF /Text ] >> endobj 397 0 obj << /Length 3505 /Filter /FlateDecode >> stream xڭZYs6~PaKJF0oB4oL2)7w\Zs1cHǻEjQuË3О8rw2n`]E]6 |a˗5fIdNj2qFڶ.[D:7+eM!`+Ik.I)m3nOqݕ9[Syݝͩp'N*DSa֕}wZw#vE3>謵u6Jo{b}ނΞ쀷lsVE3 Nhf%*rS k]~#v]@υUE/v[Ҧu J N5?HYf^1=WP+h#gK7p,jƌ$=-t(-D xQ2ٲز*Z991{)Wޥ-î~PXXw=ޭi##''}5z1) #Y 2rrG V8Cf[dPsKdCmL* ނ\Y; WɑѢ! Xn1~ {yS򔡾6Ǩ`MрEfƎ6>tx=(P\s]0M*d8̚E# #_"a]u2=XNhxt'EKʜ ұΗ7f%,LesbM&'2X%$Mo/'*MפϢ&I䅢'ډ?*B]&( 4S[&NE:@jY} LV9YL:0ߡ zvD@/.BqjG 2%J[N,Sg pv *xiwðՔXkEXGjuӱ?å^YVhȦ&ie!\57Ӄ#z tWVt7aw-tb \KqOې+qlry63 >To'pw͗o=v^y;l7AN9,B<˛dAǏ]qE6ϣN?שQYezx'nf`c.ch}0w'ex^=m}0~ᨙ my*̌g\-1|kѽ*⋙@@4OƉ8 _ߦWOCt @"iWV+<#X[ έ9KSl/rz?DNc6v t$DՔZ!|g rp 2…S1]c :BT{`aSi .TtzՐyV89!lr!e{iLf b*b{mp]ݖg;Tk=zm#309ʦt@8nq Ժ5#i\bv8<5~I2|?_5~k^xX'rDu6WD=vjV6=2!UʁiRA U@U_XE=~=X.oeь ،;7xj6Be˪2{]p\Zyl FlJro C5L*( `qɩУg\ۻ{al|Z rV}tl_HO֖It-*e]r|a/LBGzԖ/DP"QO^.cK$JAX%Fw3rbh`jU ?FjQuQas/)ҴVO}LbZi^Jq1 {:؈6K"aT\w㦛8:XM5QlNvIc 3L<նP8QN%7(P/`u><9{ ), h_ܔ.KE=[a` Az ؛9!|`Wyw.*Lq#b_\{&C&TBАPm= ExLJV'8yNj *z ݮrAˤ d>9avͺL0 +;_\Ϯ)e7#Z>,uѻ p* rGibS"H6At^{W;zKA+ ә垒xy ”z%>(.,[E%Ks+DS}4$i&.`#K†" e#,—u/R@4Y3L(~[ع8wy^#/l&i τjZ@27oC}Hތql?>oܿ}%i(=Z=uA2Ȳ3L`t|Y¦z+Hj˰Çnv)"<DD>~X%nU'1Si`CϫPd %.{ ?kӎN BütIgNk =*8˫"j endstream endobj 396 0 obj << /Type /Page /Contents 397 0 R /Resources 395 0 R /MediaBox [0 0 612 792] /Parent 388 0 R >> endobj 395 0 obj << /Font << /F35 56 0 R /F8 21 0 R /F28 15 0 R /F11 65 0 R /F33 53 0 R /F38 68 0 R >> /ProcSet [ /PDF /Text ] >> endobj 400 0 obj << /Length 3261 /Filter /FlateDecode >> stream xZKs6W̑ژ0V۪JJ[-z;3p8_AQ{@h4k4ӋrU%fUUT*zuyhXGؚ,ZwsSF+sY#9 @v{AܫOpmv蛣2T-} v#ۦpkx 9vdTeMk:FoQ(_@}3^٪RU uRټy*{3ҝ>П$**ʫLʬֻ޽OVdYҪ\C;QV3ٛ_<fɆbTEQQt9+%%+M6f"5K<—DM{߂Ѯ׷--кۣx<{[fc-aHg-*Q+P5s`yijHae_i={RZ$MSG5!`yoz8*o26g5s4FY(Ht~+Ǥ\y);Z1M7T`Prf<iFP7]CM>YkcV*әzU2L/qjJUj- -cn5dE/IrL;{+ xd5s$s~5ilg"|ՃBZUFBsd\pDy,8,Pqw7`'+0ugfE[D56W7zXvhk0旄:Ej- 4<P)$.4D[ [[[KKc?j%4CHDuBhp{R;Rܞ+w')hd߸WCZ'VUo?Cg|pMӈg4~F/R ϥ&!:=:"RiKR}L Nca'X5Ք#Is7qwC@cm=&eM)iz ~֪ 0'O*Qfp^_#z NNEUxtN`ni[G/*R}).83RPٟ'̲;Yf:)4/+F$ymM/%9V es#SeKK_sD !0,IS7~'2X*߂.&4Y V~l 8`6܀)zhKvO2wP`٦T}̹Ɠ8]mXÿ[@P鴮K@  F$Ŋ@.GBp ~N%M|;2M 92 ]GbvD^f96A,H%ri ]#Pc'iH)p"6 .m2~l鄸mY#n oȞT 6okg!8i&LnoRlp#9KDDsDD?'`3 .iGe(CO&Ij[śJJq_X`J|!N("+?hPhZPY޳8b(p7 m$8p>7G8[= }KY? VƋd(܏n[1(}> M?JuX{6WϾ[Ijx|zഓP ۂ =j}8l(&Ȩv$c0\9&| .ВP"гo?ɂ@vmܖvC 1ɣ8YQwWw[0J)Qh{pR?O8/9'W4Y9VUEh$Х=%]HO..#`>Fd&NK&ZUn% u)U}Lkd􇫋?OP0+yA$3dEH>xeR}}s1&8o0' Z|pF5XwwMiz l%Y¬݉{lvJtY$p`iMi'DnSpX3BbDÃm׵T$jfias0 &HOoU$;n! ZS@'`81V-U ,q8@@ J.S:?&-aiVX 3 5 m7j~/)\3gmoJ>^Q(r )vV-Z_Wn.an/|f)[ױ?ky B)w]j7>[1!K)U94pð殌~׆nDS-o,%l-IGFMݐͯp{|_-_ _o ~ݣTvp"(#pw1ǫ)ȑUkR_̡hM_MK_kӗㅆ$>'p7%saCC O-[A Br!,#ouL຃Tx8ӟ |!>k\.cRx pn?f{>C? FנV.x7Rį$VP }|I a!4"U@v!5_͍1U&ߣTgJy_xͬô*_M/wo 8`6o! rT7O3+ȗQy=y|y1lO~~Nx. j;f!*@qL׃dQEYL>#k4>";9ILֹi4G_3vJhaHn_C*OC8·m '+pSwpxϔ endstream endobj 399 0 obj << /Type /Page /Contents 400 0 R /Resources 398 0 R /MediaBox [0 0 612 792] /Parent 388 0 R >> endobj 398 0 obj << /Font << /F8 21 0 R /F35 56 0 R /F38 68 0 R /F28 15 0 R /F32 50 0 R /F11 65 0 R /F33 53 0 R /F17 9 0 R >> /ProcSet [ /PDF /Text ] >> endobj 403 0 obj << /Length 2972 /Filter /FlateDecode >> stream xZ~ORp\s.]@&hI+ZZ$Yy쮖90o˯n}Y%RnngVl^YdrwW_\YLF䕌,_~VW컫\>u.dU\m^]-,aP<[z!(f= V+X)"Z: $k3oïkd&t'Cݭw[~o 4}$_"g9KUռ[K9 6bw@ % +pR2kݣl 6 k`E!QFgowk{z9iC]%h>c}䩾I)S8 *=7Yrz9PUAY%T)e羹Cٮxeٖ3cEOLC&jSፚݦ"m3owwP lò0WޮxG yk'jQh:OjG12hsL^_5-/0[\繰9V4[{ )8ǨRLw $]lhKQB nN"j?EtP' +7Q^6C6*׳R`:f#6Eʸ ٕAD8:a1. `!Y::-Jez:>. PV\f2JveA{3/{tz) ̠. kD/ F+K1zvm\/h U?ݧ}/&tRK3P01^uxlN^z܀NV+^ItBh#0 21^B/^/(_ƸC^嘗l^ϋ/Ml`mlr~}WOSa>g fqޮR,нn]Ci# )]UsRT6DE䞏ۑA,,S֣kavJk=<$w@IPVR%LFMO7V*'g%0!M<hnSj!ő07w(YznZțϱ ŰرǴ9r{3C%HzxP.I]m2yKMiVoOCt)"g` MR, lB{Bt]ge GIܿ4(_d)l!C$IqކAߌ5eq\FQ5|# xRMB'1x`4dl51!^"\OöID>.E?d>an~pƈ7':L+P@JZ·+T&cNlЫ9KacagR8< S:”0,ŏ 5l/xdKRH;O7x{,!f^DxQ3 :./o+P16٣0(!Z$k,5H@P"9U\܃'<|ׂи%4z0帄{/x){h=_&X *7BI}Nnɪ0'o.gV +KMT pIe!`pB yW7 9J^'-rLu8YC@:V!'+ۓ.)yn"y' s=.TDycXBXS%e04LjĠ40$"WwǮ&NLG>:Z/y&Ď\nn6xU#]t4> endobj 401 0 obj << /Font << /F35 56 0 R /F8 21 0 R /F38 68 0 R /F33 53 0 R /F17 9 0 R >> /ProcSet [ /PDF /Text ] >> endobj 406 0 obj << /Length 3163 /Filter /FlateDecode >> stream xZ[o~ϯ0+$vf.: ,vɢ(fAc+Jdg}υ}I(<<~{sXI)1UVybEZ&rRU :wfsuՖ=v:K"/q37AgW6n~G 6A*#enqԮx|?=wvώ rsKeUY $Mx, L/ces*٦6YC+HyQxvjXPyӉ > j+Ƒ|\LӃ8IڬFKT;n\%2qa#a$c{E4zޱ<0#acZ)Oqœ7B'Ų'ne|[˒LSqhe yq#oֿ@IGe\cF~~cPmQwn!DTd|_Z n3 $WQ>'aOTaMZ4Sw0ڐzh;|dBkCחd\11ɾj/(jvΫ@fkc'M PgEPVD1>_,]Qh^n;S~nΆK3έw=hu"AR=8#kzs=I d{o|-aY9#Y,.LҊfh&d& mG%OB`a>( 7:DX3xڹWS?Խ/?ݬo dEGcHZ8t/"HyӮ+Ac|ciXeא#w h‘9A;O@5@:QMk6HH̵s8`vݻPfuX}]x(=H\; S{.3*"|>j1C-iLs.+ XOeqi  9vLMf]5NbQ'E8pBh]IstO;dfG Du}8 %5@A2ٸ&2}uma>`cpFfIMq AwZQ[&>0Y鿣[&.W7Bt'''4<Ԗ9dr$?7Lv_FJڿO/َ\ypkx.<@J㞡Q/v7u(q?,\A >,6ew?mY |:XY! +(Qdۢ[k-6B9|Os1[#$W`5J<qo(etjGgP8~u!2^EM~jRPpgc-ED v NtlKo~)*7zac Y:\|Zt%4Ģ螻Uj$EЗ_묾R(N_Vi,/nBAK~Hji@>̓ђ_묖 ژգ\F&_:f,ѧZ_D}^Qz\Npl,NwKyW'~;B_8!!xi =j /'ak!` _"D(ct!T_pӗڿ[DU,)/O3=8؁;Ij"Iѐ)"+9$f1],sf%)O+P![eq!٨ endstream endobj 405 0 obj << /Type /Page /Contents 406 0 R /Resources 404 0 R /MediaBox [0 0 612 792] /Parent 407 0 R >> endobj 404 0 obj << /Font << /F28 15 0 R /F8 21 0 R /F35 56 0 R /F38 68 0 R /F33 53 0 R /F17 9 0 R /F32 50 0 R >> /ProcSet [ /PDF /Text ] >> endobj 410 0 obj << /Length 1262 /Filter /FlateDecode >> stream xXKo6W9I=`7@[zib3J4w^zr6EzHp^L* ~Yf*l| \@vx& 4:_mBgy#ߒEܶ $u%s{!xy[p-#kX4Na} un~uڪ8(0?1 v(䥐 0Z"Y"und_͕QDұ!Y_NF=Ss6/?Y;TX1W@v`]~֚6oѪlhA!b'iYr态Y8ҏP{ hTٮn! >ٸWGs!pb: :#vio O BfB&gA(ʔR7 ܩ9Bm]Sh>13H#ǜnԴXpΧ'PCWU;QIa z@;p'7y%M+ztXyyB;婇l$}W82P]v>;XUH˾zN+@'"\ᛖ6/B9mG8a[~ͻg0Vs$=_˷o§Ç;.4aF0x1PP^pBJcaN2!Ȃ :>05Eo"N$WCYLAvt2൨=-&X-M ]xDrw|AMӾ(Ga+:m{IWCcV&'9R:Aߖv& endstream endobj 409 0 obj << /Type /Page /Contents 410 0 R /Resources 408 0 R /MediaBox [0 0 612 792] /Parent 407 0 R >> endobj 408 0 obj << /Font << /F8 21 0 R /F33 53 0 R /F17 9 0 R /F35 56 0 R /F28 15 0 R >> /ProcSet [ /PDF /Text ] >> endobj 413 0 obj << /Length 4319 /Filter /FlateDecode >> stream x\[WF~W-fOԣԭ0 ly`&K~VM-%Ds [OujQ Q&HМd1>n/W;&4GO{LIHyw5"C,};b('yG)Is wqj?t|7ۏ(ls?oyZ1io2ucA@sIMa橇JlH+Wt|=i"K¤tW\aVCL?#wG[ #9#kxj)G9'Y8@`yꇇ'ǎ3|Ɍ,؆V?vIwCM'5\,!jIRu/9h 0֥$F:00}i1mPL"Q"S۾^_.%u?za>;Nc'M %3w$l]ҀȘu\Z+ZG,/[*p\6МʴA*A?y/xoI,^*ڣ@Lq.U[q.7Krҥץ<%J7$ҊŧZfٓR-߱ܡP~0ܪ"y?ZuۚT(2aqM_4SĶdļZ8#l&K)ӞmhE >5JK&5sA2Xz-v 2 Uro>J4^72N@yN(|֤,>P?zIcP+mjJ/v&#A;d&;e42JK+սdQ0}5>?G\bj ;d;)R#~93I#JǞJJ:'},n]8h㲆jm=va)@yG+lWT5$ѐfbW':L?^s4{ϵ1mJﴍ-W9E- *E4͆)Րxo/sz^6J&$ygARp[FK~0҆+uvL[gM u;ֳ{]]H$jiScNZO[Ԥ"V e*ܱ:9?nY{.v-iΕM۸Gxmb䡸Sߥ5aDho7"XM'4q7Ty(!K)8T184LYvd+jnT:ߚ.#vjͷhZ'.Qx\Z;CLCΕpg)7kV mFb(> lcްCy==J1YRugtTn'm"@x(Im,JdtVXYQsof_ YEz{/ lSYvy¨Ρ)Pui6luߛ(g5#4XJ7=wNDڃYҥdn-lp$E<<(9B[.u#Ӈh^O<8^iE&)UMvM.@q0 v`87D$0"39Յ7Ta7Q;T?&rt$ob<+ޚȺZt3VL»{iAl-p뗏X8= #8ևݰQY!!mY[̖ m檷nVʤOgxF{=kŐDU󔋥y' ">trq<3'1ḻwN"XTC~Ӯd+)%,8/)x9سG^ #V8y049;9?8<9?V{?d'V5ŶG+zn։@`JD 0~4#H4u7TC_/sv9+`*):ݮoT.\ON|fb0g~ ֺQ]Ќ9yҊRxC!F!67UE>&jbü#*F8jrV{NC55c{Yvjv볕}' -H(6"\ wt^ paM+.i%.=$0 w}:lNZ r5{gG]/DR92'))ň endstream endobj 412 0 obj << /Type /Page /Contents 413 0 R /Resources 411 0 R /MediaBox [0 0 612 792] /Parent 407 0 R >> endobj 411 0 obj << /Font << /F29 18 0 R /F35 56 0 R /F8 21 0 R >> /ProcSet [ /PDF /Text ] >> endobj 416 0 obj << /Length 2885 /Filter /FlateDecode >> stream xZo_!9OIl{.>oQd[s,,'2ei,⇾$?|ffWo?rVI&[ƵHf_&uy=VMʦlɢdy-&0(&{ѮhhhMm$"ki'O~2uqy9u4j[]S_柟`Qy;Uk~ zj{Gڻu MK=V m}“PhwԛR|TKl=9IqgSc84%`նBр\x dYT;;S'q)lc& ׹)7+İ+}6EjDZD{)z3y@k%] .PPZl +#x`IO<4#7o?(XfS.e2MEd6 ϮD$JgL2IsVꏫ_~'_qls8/0\l~璣# 8]Q q,A3)bv1jFNYò7FoF3ЊvPiPF<&oM *%uk m؂kuWJ.zEpM'r^S,?p_pvѢ9|~:yc|JRUIM#Z))휹[uk{YȘ+\<6-z0/<*վmvx K{.otV0\ߡ{?Z,3t9>\[|l0 }Ǟ{ȋ;OrLפLͬgeU1c@"L,[Sah*6t?ucZ׻ N֎;Y'dB~ U3B+N dMhX>iSv|3R!~>m/v`+fqGZ_t~ʋ;3u b0s*u"yZS#6;F|RWyiY|*,cjeE |O+)PBׅNsH2`H5>&;WeM˞If+8 v~fRE?U3D` d,;EHFsSOWM5 Fj hUv:Ƽ١ 4[1 yn&qx(,^R]ō!1h0o.Xڅ9*ꍇC R#Tq AZg\zSny*Sa\tjcbI%ڃ~ȰP1T^)%c]5 gP{Wǁ5$DuVy 7S=I;dGlΆQXuL0=9Vʅ ${W셟F1kᲄvCQR1syt55}|$ҌLB7,3+ZӈH 1 ?,$Z=̀Aa_AO<P\gJTU*WO*OWA3\Wݢ _c9DhǷV$Mܙ 6*7rDHXvƲMcðV<컑˘!v .}e YdfQ鰍>I/šyd,!AX9"+qֱt QǸ'0#V6-,5,YiDkV8, s?N{X>W %X3_WϙK>\0UP虩bj ٯS(yvMV 4B)o/,V=s2mJN/rԱLu9%m(^Ec-fyv%A2l0 U7![Ai1l ѰpBS35=,I.GL[*`^B񬤥e\ %(;D=sq>9޲K88 3<ҦzkH*y~|mb;@ z=uD#.\{ohX(-b:Pk)Iem#7(> endobj 414 0 obj << /Font << /F8 21 0 R /F35 56 0 R /F38 68 0 R /F33 53 0 R >> /ProcSet [ /PDF /Text ] >> endobj 419 0 obj << /Length 1705 /Filter /FlateDecode >> stream xڭX[oV ~0hӢI50É,;lɑ%ٯoGn.$ɏHEMy4*@MfG0]NIy6Wy>NTYfr9}\G^-&'ou>< TONTltxoڙڦX|Y A({.'lc:&ygiN.@%xK!c!Ի wD(-fY[CSi v={EGڒ( zecPsѸ,6_1fm Xp5[[=+gр^UvϩݮZd.JLP%fCy+}TO \qG!]țxƝ`{ \ƛ=O@ 7̤6N r˖M E#\JwD8^C\C*:zhj*# M%D.TT.,;V=JBܴ'e$|r3+*wT, "/%FnZ L~J"BVxh7{3WV1w;,Q S{j?XLfPK,$lyVcK:-y&5CBQOx;X n™Ə 8M4̝5<4QĭPTk~lE_,>4\nvu{θ+N"?kYXa*Fnp "=.b $*:Y_m$AG# m'Jlva!O?NzRmrWo@&6('刯QjuHSm$D|c JhVDN^צg1fBxhrճFidǵ3 zIvCZQ|.I?)ýbtѝ| sC- <+<Z s߫tJ:a⓿X:W=YUTZɿKY|df9p : I=r0o9 Pf1({L*~G1p s;r0Ze~gA)RZ+? Qrz> endobj 417 0 obj << /Font << /F29 18 0 R /F8 21 0 R /F28 15 0 R /F17 9 0 R /F35 56 0 R >> /ProcSet [ /PDF /Text ] >> endobj 422 0 obj << /Length 3635 /Filter /FlateDecode >> stream xnF_!̓d933@d&q,<m)Hv~n"-[>Uu\],&W7TM(U+fsYv&H+Y8jwk]Q͔6<;wr:Mʦ<^7ap9%?f0q슚wܗ}aUOG<@9jwh2Z&#z׸z^I&D#U*T's iDJ1nB-W]QoE1r";8|^7s^؋Of]G ̭r^Ϭ؅VMNG$zc0Fm<eE$7[n o MEA͍QHݻăOlllȑ[Y?: L΢,xF/f .E.lxp0q,#s@~^W=#˙:'`*>PeqIw\rLŒ VZf 7,lXŒ^=W lxݳ; Om13cBh/kuYݢQ=r?ޯJc&D{|سpC ϗ5ukn< +r,DcAdd!"!6O5+0ARa⸂ ĥg#KFp9],[r+^v \-%OOާx50,Uڊ41XEbJkF1e3eHaA}@pK`ҧ C!%3%0mn@Y F$\weDICȜš..&đ"#ŊQv4JF!Qw^wq;" #2i}ކ\%F15~vL `I̍^vּlpRAoBD_F8oD.#IVL뒟BE<7x2M`䨽;?Q"ȕCg6H< = Ocψ'ǟލDg`aG@}jMٽSGj4>3ڎ30w8 c9CN)Ox `3J[>0ǃ0 1Hh%r B@"Ԃ:>j* Re*`;*7Ykx!YV:iOI*CDD@#_t] (,> x%`bS Lbs$E{]7WaPpz|1^ [ 8 _zIjށ5zI1 g\ ):ű9b+d*{I_D:W LzxOÀ-# Y6'kC!3K֔Pɱ}agռ+iTKWWTG|MңԃF5[J ڨB߶++ݾySu :Ƥ@( AyH3DC +m[렄k4P0(=@>Fc)RӅ\dT€(yU]J.!m܆; PD݉S|"E-NJcm6KbNeّ.:ʲ4%!*{gT_|?f\5J؎-`3GY[#uTB6_瑱0`ln `MffۯQ%̯Dܮ ^Ət%G*Ý0w@hm۶dH,kfۮ,UH%LTDvJ%/fGf4p{'%I:iJh O9jz/ CA]#ڽkYڟA tpG,#4bxc}S:ɻU=^IsJJI,*? }DΦ\V0њ":naN$ 3 !ٷq6[^ {ieY[w@DӬ)uUTen'x^R5z*y 25g7369YK![P# -LFSAa&O),:r#iˤK_ɷ´L$Lbo ;XݐH)rK¦R ̜)(Rk][WVQ0RA@?â,X-:EZ~<#{Ǝ A4fTqVo~W%6N;'#Vbqi?dI$T"7L0us>q&TP (W _]تQ;3EUOG1YRؖ}i>irTL n#c~tHCcy&%|{go:f'G#kX8ea?<@Zw=t2Q"]]> SWf(=2z< S,H n";>@$Tm> endobj 420 0 obj << /Font << /F8 21 0 R /F33 53 0 R /F17 9 0 R /F29 18 0 R /F35 56 0 R /F38 68 0 R /F32 50 0 R >> /ProcSet [ /PDF /Text ] >> endobj 425 0 obj << /Length 1780 /Filter /FlateDecode >> stream xXKoFW9E>J/mhТiC$,eTlw)I4pҋ$g3 Ld.^ h/ 3]KFTPRJE}g#Q,b>˨Pr6Y4{4yv?x\gs3hGZyvGM?oEL$ 'M?^.0COzR ؈r.noޅjz/Y:2˼BBd^^6 jX} L(#},F Ԡ3֖jO<4Zd _A-ZF`ICp*qY!^]7c8*@Z "XF&_fˡ 7qP$vXS[\?U+.N b%! E8E@3ޱ l6[;.a9)e)=5ZDb* ZS]!U8R+ˠ+*o}lAes)Uc>"X3 m-= dwq<p܄_ yǿO=2~7φFEC_k a .caE|:VPH"C9ĘP16yRd LX1H*c;W`Pl7[3C5> 9g>8 ʧN&Wnu*=.v;WͿʶc뚒n$/nOj# ZŊ@eG+|1qԎGZ tT?Ә o !,.#·~\hdV>0U@4^0n8i&'ߐ܌ٹ|ϴ>V*W6)laS.a:TվiKnp6'wC_bpD;0QŴGu",ɿj"Gj";nN!J 2h(C`C A۹(Ju,dB3F9;3w]-/,?e.8-UE;~x %ԈTM-Pl[X am:);~:6I=H'[dDV;\; Djʩo Xm:/+۬hҥ=h+elG,ucUao{̤0JË,tGR2,o e",y ,ԙVZd&T 8<#U`|m;Ll{SGN6" *":1eǁ J {Mٌ d3Jvݎܿ):ncJ%y (` endstream endobj 424 0 obj << /Type /Page /Contents 425 0 R /Resources 423 0 R /MediaBox [0 0 612 792] /Parent 426 0 R >> endobj 423 0 obj << /Font << /F32 50 0 R /F35 56 0 R /F38 68 0 R /F8 21 0 R >> /ProcSet [ /PDF /Text ] >> endobj 429 0 obj << /Length 2208 /Filter /FlateDecode >> stream xYK6WD9#/q&[vJ9p$j*I#ǐLnNF/F3؍g,TЍzu1_hO:IޤU4\:*rRWNS߽8A~pw杛B:e{x# 4rɩM1o-UqO`B%y7en[X9E$Mށ"|*X%~#˲OmZ y*Bk_D^0[H-|/&=lOY+9<Y_˯?  H>m:_z q Uۼȩ yl5ESu?DRv$Gm"{ƂF9| d14l`|Do\ѢM~Y1i8ЄP-'T.#3=OMl H셰ӓ u8܊,El|p/p1:EN4 czJ7%iEUG0}=vc8P/"Fd/)64Da;7ΫA(q~xxeջWVѰIODI8"mEHOtI&/6EI:Z"/à =lRnj-0r~# L@L [H%ZM1x* HAbMTg+<~D-#'t=`io|c⁣@_1 F8TjĖ:QOlFPJ֚"p3 I6Q&Hrڭ9(F]# z 1젪Eo;Q2j;qZMy>Ezmf`ªmAؤ {SIMC(RJi۞ɹj\gV1=n<~Aƃ|0Rkzh"vS2iFjgK_AuD(Mh?g aJ %WC=iVgUi :emxKxىO+]pp07VZ0ZHPɔ-\l7+ Jz*lglθny!3Ja*l1` ۍ;cio} M 3^s;@ӆ4jOlG"M !aꑹ{xh?}/LO,h&qo]%eoJnLps۪my\Fvo D\m$-\ mnanp82(h۱ J$+)H͜k&q^le?J03%O-ܚ&D+ h$ߧuo")&,ۆD-Ȑ x[Ң6o`TlS!8:SPyD18jtx0savEGDhvmonX_P_ _aG{WC'hkg(~LP/Fw?j?j世4,_G;LkəV`Ga%ռKl{&T*ҁ(+w/n/ ' endstream endobj 428 0 obj << /Type /Page /Contents 429 0 R /Resources 427 0 R /MediaBox [0 0 612 792] /Parent 426 0 R >> endobj 427 0 obj << /Font << /F8 21 0 R /F29 18 0 R /F35 56 0 R /F38 68 0 R /F32 50 0 R /F33 53 0 R >> /ProcSet [ /PDF /Text ] >> endobj 432 0 obj << /Length 2906 /Filter /FlateDecode >> stream xZYs~k]H\HT* ,"_$˩ʃsO7_wd,YOtqq"R?jqٻӥ17\V/P-*{ͽ7EŒ6X.o)3P6yӮqvݯ*pnj̳ ijۼ=;3,R? c_fԡϫNuh-<8Q,BG^D6ϿI$M,n*MI*?B_[+X*Iˑ<'RO'xu]i#׀pu PH nCP~A|}k**&,0˼2c(A/S/~:jxϱ;]7.\/]Ĵzl'\F5̳Tc )+M=*[#X:eu|UW+F ۬יj;!W@gʛ^Ym3Y[7pd՚Ȃȷ֩1 Ojb+ߚ@ڄEk=CҼA$$V dYHː0nըrhi҆kg}wc[G:íWC}PKQkSzCB/ky :s݊텉]ÙS>Ⱘ;Y>!d#0Im Vq}GE2Įpx( ZT[8>IY=fӫ2%>ۑҘHܩN,+ Io}}Pdj}aʔ9lAcB:=;lzkT|A;ll=φπ;.eHǕIu49q]T3Ơ|E2 1 [n68krVgSEOiw2 QG W@` Lb,({Ra|3`Ń9jeC#{710{g!r_N٤W0p9[&)((Wjuٞ׺v>|9O{Jf{eDVg=Tf#;Y7, qsM7h)8g4gMxd)+2ƃv,_G1zk0rLuBq2ǻxj"'I5$HI7bv$C&a' Vѡe@h(*a=b9*1tgm͑by3UB/uI@>?X?  7<>̃S0VX< T7-w>Yq̏MpG0 Y@ٚ#.qݱfDv91ȵvT `ЭSm.Ҏ-DP8kCC7!7 _Jl~sG3ݐ83,x>q Oqx 9L"!!nl4,)wLje,(H^xu3 8!pQ8x}sVQRpzB 9KAA‘i]PꙜ7bM.ygQqXI0w0*";X7fiY{DMsGoIO ؆̄0bOE ?z6~ &fZ;zw!bm t?W37J95Ğt{P;P`l ޳Ð6ٺOS35YKTi}"yh$ ;Mgwiog)G4~1Yn?H>ɲi Ic@IcHy5 "_{TIHq΋ӂ0"ccUXwD<)>W1bہt:,gb;?b`P`lпC7PJM..,/Q´r3'> u xҽp$Ӑ&JZ^mr9JAocEvӇvKn/2 Z+ WZxfZx؇S@ 8CdMAwXنu llh9ycf,wMX]])6 u֧w_rXEi?*oXlVPyS͜u7~~{>Ny!㼼WNu!IWu:1)yP=%d׷K{><t`??u -Տrl;[q™.k]1/N VU^}]nW3Q'?^i#{uncbC3Y1>9B ĩل q6+}"ؘ}=<CjܶƧwH;*aEAVc wQU EC fhlfAL- felUxMGW4=2\ ENG2 Tgzg1&"}Z&/;R6o8Q/bR_‡:|Qa$/ǕM&I^JcʥsPIaw~փ/^]9>O2/?U)8$liJ{ endstream endobj 431 0 obj << /Type /Page /Contents 432 0 R /Resources 430 0 R /MediaBox [0 0 612 792] /Parent 426 0 R >> endobj 430 0 obj << /Font << /F8 21 0 R /F38 68 0 R /F35 56 0 R /F32 50 0 R /F29 18 0 R /F30 43 0 R /F33 53 0 R /F28 15 0 R >> /ProcSet [ /PDF /Text ] >> endobj 435 0 obj << /Length 2828 /Filter /FlateDecode >> stream x]ܶ~OZëI}胃ƀ\H Vv+i"EdM ,E=}{wu&_(,bu*0z|Wn:v덉uЖ_oTpZV`Tʩ#a''TkڭjEݍgM*vrخ.+ [2/mtƈ}I$)X  Uw߯F0 ;s* k8 yYUIpʭ}[6v~(Oa,pMYغ ;Ņf Rx|#/[ȻhltA6j7&Ya4EGa* naԷZETi ~T`zZTԁ4o9Y6Pr(-q-{k8bbehBFGyf"(d5;zՠGaHG LMΊ8SӶ`aK@7dzu(6JeEu~ٳǮ ѭPsJD*Mj{ѪV_E0a(V+ ,ku{W* uIf {VQѴ+$Q_D3$.Hmq"6MZt΃ľ<~W uPФ6mЄFH)v =)\؈!0n6mUꈧD+ߏ k2 ZGVrB .eeC, Tsh.a ;=o4e؀}d;Q^@D`:ni'7d8v=X3hc %0251 !YvafZ/쏝82ҩU38F1M)=pnqnJ͂CqdK=~F^݆_랿n_+Kf)WKO@rFl9l9 uI]0UCw fy$Vm=meeP?nF8;zֹWWh mMj" p ZүǾAu/vpsNrˈkE_o;bP881 8n0MslBJݣթI.n-;Y?S FDP ݘ~Vb;ʸFw \ 1P]tuq""zc;ޝalmZUD$N4e )Sn'1ܶܮƕDsxLsEHuu̓Vy\s3{VNi-$.)BQS\;dۘDSٹ4 u/e1c 'P6玗k*U" 0lloZ ͩIZgmzا x2 vt`;2hrL-/" /G6Sa's8Ӷt4Rg`[sX9jJA,^bF`l~1.M1F9JnI?y#&E0ZMKpD:jYpca&M9c0eMdl⸶-[xsX $^/Ec+W! vqiR] +[S]jkKw, T^ F%Q4É>`gDV卶i{?fZ字ձ۾;S+: 1/SjœR5H;AAM'—ϫ9yZx2S4"V=>y,MXbb0  1QMɊ9 vWqfi[o]fv *W.sDf}zEi-Vɿ3&Y!12S)U&++3C1<ޱ:m^]IN;> Isfx,Rܽ{y9[s6-GԺZ*_)ՇɣV2A"@Y?b.I&F'⽖B_UЋoXdwOt,`{{j]^fƣ(u`CkGv5u iB7h.Z 0K3ٿ&R> endobj 433 0 obj << /Font << /F8 21 0 R /F35 56 0 R /F38 68 0 R /F32 50 0 R /F33 53 0 R >> /ProcSet [ /PDF /Text ] >> endobj 438 0 obj << /Length 2074 /Filter /FlateDecode >> stream xZoF;7cӤ@ 4@Ki>mH俿}+ڽ;߼vO_DQ_ ,8_]\rٴP,V![~ʶjYexlWa4$)â,s6nJC,u;YC: ۳reƙajFMg.I,Y[7vu[^mq7FYn'L b8jTY`,f 2w*Ӣ cxpFA QD7|u o2t<9؉$-fS#z*N-␲+Zsfnvi7uMqץ8 #4v7=)8n9uj "GaןQo1+;MQ&[];C:y֍e r乩G[Fms1fxe=Rʖ(7+}P`{䲿>19*}t?R*jh(k <ij7f}"$8XݩJ[!~rEklF8a950M4i1/=H8&b iƿĠ/B~R 3D\5#v9G> endobj 436 0 obj << /Font << /F8 21 0 R /F38 68 0 R /F35 56 0 R /F32 50 0 R /F33 53 0 R >> /ProcSet [ /PDF /Text ] >> endobj 441 0 obj << /Length 2156 /Filter /FlateDecode >> stream xڕX[6~ϯIBbD]HAm -˶dHr'~ύXʶ}1E򝏇nn{K]gw? p7AB$t wҸS_=~55Ex_tE"8jx~VEv?j^gQUFZmOe"jп/h$o˝QSrS1%k?[Uǥf P}+wxS8pkx5nJ f*Ѳ 8x0s" <ɛ*AFUydPYWSřǁ@^E lGx#y]G#+E3MD'57N|#_AL 7 +@6gYَ{9zxhHRPM3TdE++< QIi @`lVQ ó-@3.@uN#)otYցk.c_A$T5Ũ* @jԪ @=EOpdrCX|~^6cyʄ|#sx:gy.+Mx#q`r>?Cr$Sq6<@vCǓfNgs'0e$|@ouk'#|' Gr‰: ĉZ %-5a:T-@ {`H=YX R%M8|jE[J#6JTrtbGâDa zL[?grE/mñ>Gݜb0 RoV pdE 69Ɣ&FXdc1/Ue 4r_#/SNK`j I("g<ݷ\]sA`MT7=ilpT$TD/)хBƨc:kg<~9em!hZ&"Zl`lڴOMk:tjk )llI "5?a5³;}dK5(f8A+`{(w_qεncO? 9S ^|]Cv2p$%>!n4ݴšn |E_:H}y$^NXGA|e_N7QUMj9Q> endobj 439 0 obj << /Font << /F28 15 0 R /F8 21 0 R /F33 53 0 R /F35 56 0 R >> /ProcSet [ /PDF /Text ] >> endobj 444 0 obj << /Length 2805 /Filter /FlateDecode >> stream xڭZ[s۶~PdrIڝLOhyB*Iq @B"M31,vowEEҨYDb^qbs-~BGGȲB8.嵲VW7/" D-n"1T0-Y*<+S,awwEp iP~Fګt}aj2Tk(h*qKƠ"nkK1^Y%c"^?K`ZS## 痼1KCI(@9nA.EP0/&X:e¿V ^)fWK)6&Q0MIr %Mд=|Fq{AKTanlI-DЧPY{12L AoHk/[-C:G3W'={5?iNDYb6R]ğfO'|vg{_=eChOp_n',E.bt1#?+nj!BiBA )6=ahy_Xϰ\3&YhcogԄ42=:C곱iP/51&!C-aM0), (d`[뮄-5L..6N2NÌ\sFt;AoƢ_Q'}4#T\+2e jN9wy2c;D $[h#BgZy̦(d N$jR*=nDʅ8*uee~) `&ʹMq: 2ʡj^oL&VO83u(u^ t,')CEn wb`( ao6˦Z3;t'9MLqL 5% $Py5 ipժxAWzZBz`\mCݔ8qo}(xbG=%i98ٻwC8X-?l^iWn7x,ZV-ngWcU&*yBOh^itq`{ȉnHq^s<ǻh|; 2TsاYv#߀Nت ͎O!=!8ّ=q \Zq Vs+LVbNT{byz Y'M(7EcTRVegtؙ3o21݊|DN"LQ Jwz⇰ZWV reQtIքT F8:ۭ Kνc YcQhWd S\S$K6穹ytz_7Hh%喈%eǎ{M`Lwܭdlk"/-4ԱX|Oz.!.xy V#Glf$~I9>8щH!a_!Ҙ d<_)۷K/r3E ev;Jp"FFa@Ȓm5q!U1TюB LY^ղtḿFR,MhRsoSQ(1 $ދ`i,,xկ0dr$U80uCr2Y K+ǘ%q瞨Y8"u 21ld@FE\x Ѧ?XI0T;2%tXVR!r -i?zpkViM\`&*:Ǥ1iiALrvхhqbo$;,'Coj7 ~5w}QۈA͆Y ٛ\Y+G|q7i>mp곳ޥ<{W#[ ˢmwӠʤW]iG Ni9c*~Qda!Oƕ殘RdJh,9B&*B,q2w3Γ˃V1UkqxܔYCFF0[;gxe IvE?ι% -AL͓AW Q14wT[wŅB.?,(d^7pT&'I i7_f>/!7Ծ"y6}5"6 cK䛹Bǜ,H/Z%y쓇M";7c첲BF|Q̷옘+l Ј$m5:zY6qU+<|uObݹ r;\OmU֛/ Ojip\lj5p6mGØUoeKG6mWx?-: +Ah+b4rZ@$j˰l킕qm7󚣣03zAQr(IA5LɫI1jDơf^V&&G[5qzԕ|d.woPeͱ endstream endobj 443 0 obj << /Type /Page /Contents 444 0 R /Resources 442 0 R /MediaBox [0 0 612 792] /Parent 445 0 R >> endobj 442 0 obj << /Font << /F29 18 0 R /F38 68 0 R /F33 53 0 R /F35 56 0 R /F8 21 0 R /F28 15 0 R >> /ProcSet [ /PDF /Text ] >> endobj 448 0 obj << /Length 2894 /Filter /FlateDecode >> stream xZms۸_'!`.Lin6vJ-N%%_}@J.)`,ϳ ef5eR5KLZ.?\|b]\ZjXCRAYu_/\L2 iv'/O$439`T~'?'쇓Pn=2fHd&''S"))Ԡ-}{d*@`( vAٕo.$f&C_Hx!"ly7L*AΏ*ߑᵛG+&JRkUAаMe6d9A e;j&%U$%vג2Sf^4T.6PYZoFuêwΩ-`ct-\H%☦,U v2&}؝+~c')0qa$ȷ#&rj<Cg֎WxpP:X 7u{"kg)#6<^QN})({[pM? Μ7.g[璎oz[ީuSضFenY¡b%EqӪ&պX&92w#(JҊ6o+b`,EIȚxp;kLVdQx}-_IL| N!ŭT?2fROWhh41v;hGNb䗋ȑjO#bj=:II\8KQ:0)`*}٩F쥴 'ˑf FٗPKJ5G2ށP<*쑻v#).>p[G$9yvPjxZx蠥מWFΉ|8K ( 0_=IZ 9xuF :Ncܗ`4"!i wo'Tw!ΜL* {QmoVd[D*]Z4NhQ_8%!fW!abQ%0k(ZABxHe&Z-ߖd`{s~ǿ7[b216C3/axzGc)Zm+=Jlǎ)'+v#m9K:P:R~*i7M~vDA9}- ]ecuNjK]O1LFumҨb grplc+Ls8lDJqɱȥzR}#5&!XkWԙ( 5=@O*q(ky[$~Ȅԟ(3rD/&9t ͛%{ܸ$@5-4}!]֧rI8BB 5 @BaFćW:&QhPzX_gқlwy98 RzOӐX`3ɹh82$`&KRZlC5' pV,\펰 |~Ɉ & z֜|7vpf&߶57/m Z@CյmSa25l70#s t 5!m=`>d2=T*z]h SLbi\ѩ0^3&qzPp r2+7{mJj:`iɠ4ؖ*mnuPm;5:qXľg#DXJnd0A؍[T ʴ`/ }Cc"b2z>BO-/b9n]1 Q~Xo5Jg?9b;Zj(W[eq i;)UJ'-fjMQ3Υ>h b1>HH}+k X&y]z ?o7^zP>J SpК8 aG]C#:r7ЇO8DCMh.l[E7Ӑ %lf<:cjE[i ;\xr\ՁtmkЕ7Ĵ]WTtUF; .Nqq~JW6ܐݳέl/O5rQvkӉЏMw68$9jAan:f|9}jb^eYL x%0ljj5n={rUva__]=U3CSÐ9_^t>o-B) 䭰T+7[K0w >"oP֊,Ķ:_ˣ)uڱV(y  endstream endobj 447 0 obj << /Type /Page /Contents 448 0 R /Resources 446 0 R /MediaBox [0 0 612 792] /Parent 445 0 R >> endobj 446 0 obj << /Font << /F38 68 0 R /F35 56 0 R /F8 21 0 R /F33 53 0 R /F29 18 0 R >> /ProcSet [ /PDF /Text ] >> endobj 451 0 obj << /Length 2546 /Filter /FlateDecode >> stream xZKsFWtRx8b;ʵi֕@*[>HkΞ\OA$+3dҪb>^(U|\v[t5[/0q jW MJ7fܮ ]]Plyv`rW޴0WNi+>Nh'Ed?Kr>R_SK|?tRH8Rkᔣտt8\^d+@y[&cl?w̓ c#5PuĈ}z R\G4U ѭRulcMK \o2*@JgGHl ky6B /t>4{xuG _ڊeUf~ixvЫzy[d9 ۽]:~,B<.U-aDu-lCtrV E6[L/ : 1̑,O "G*,]=.6[ d-7t;t@ cn) /}_:S;dg-Q\O泯g"ă/wP^6Wi8dQsRfꌀ< ʟ JT &b̦|xerҰ25Hmg}rFybfV#K}q0)JI7# Q ~ `p*vpm7fr{9cpj<=wK[-)ݝSb}5<~/vorqWxKHG)u((8BV,PI250:K%)V"({gD/VLð4`F/S(%<'<@t<9pO> > endobj 449 0 obj << /Font << /F8 21 0 R /F35 56 0 R /F33 53 0 R /F38 68 0 R /F29 18 0 R >> /ProcSet [ /PDF /Text ] >> endobj 454 0 obj << /Length 2323 /Filter /FlateDecode >> stream xYrܸ}'6axSW(٭u%V%4pZ'>}x9lEheTRd2[^,L, ij%Z4x[(V_{wie& $ه%Z(hKTVXSw_f!-0Yw)T-w -4s_T6bPX2sFnIL6YG:oyCi-nb]MqX ]F{xr+4 jhfz?n}$Q4w Ur[n-V.Ɨo 9o3T 5lF6߃o*iZw`N #E $= ηEϛǩ#͜B;Ȃ*(6 Xݷ ɠ0wȢ^g4fcwbZݷ%kwE3<-)?[gA ,r-HS @M&qEn.ۢ`Q]OΟn^4MnI{Zhs~{zwnLZ7ULd}?2EDhS Ԇ~#䢌Sjz@:IK$(M~+(ԟ0@Iړg"O{^3&x$4.$g kAuX5xp 1zA#ۡECѰO4}óyCCqKTgC7ցxVꌹ|U7Au,7Z ś}&\&FσU?AV:f`7s7c^ ïLO6NOS>d2$w:hpr}YU3ra㰆:,=Pg$mņ2 iC֑(=ZjfF4yGQL ؑxxS$1]gj[>z7w`u1Θ-^Qv3I[9 D" >:T::w?VN#QO Cp%2+Gelaށpcqp3NXԱwI`J?جFc#F6Likr&6H[kORioo||oVRYdvzCgYs5chB xæ3׬AUvoyuƑ1*Z7R(5àhf 5^MT_ yF%2(]do!DFhNJ c/48 VRtvؘ#K!IOm+=(5o x )XkmD<XH}ռ G cӆn}[~ 8im2@i4ʝ9v}VA6[%ljU<,B>)`܋ FH ΰWg*H@ȉ0hZ`$q4n FjkYsf˜>lb}Vi2e]QIF۲/XKF'F68R33o@ab>ũ>)T*)¥Ff܏ O-,MJk9J`^_ۍ,npz_U4Jh:cXڜ"o=dDu7|5،oӌ5Lkxu`3%R`XƝΎ438{WQ dիsFLo4>qyNcS~$ބqu yt>G͓~8AAű Jik rY[JJIk @&Ť':2Kz"4{ZոBU`~ǒU pzEUr ~X| eΞֵ?}'n9x+@Ї0N# B*S7ƭ5H%TjWv{q\^>$3d2]Yt"O 0ᩃ]? !OᏱe\rfa^'l>3>1 ^ +Yk uN}/L}ɫJ,@¤H endstream endobj 453 0 obj << /Type /Page /Contents 454 0 R /Resources 452 0 R /MediaBox [0 0 612 792] /Parent 445 0 R >> endobj 452 0 obj << /Font << /F8 21 0 R /F35 56 0 R /F33 53 0 R /F29 18 0 R /F38 68 0 R >> /ProcSet [ /PDF /Text ] >> endobj 457 0 obj << /Length 2066 /Filter /FlateDecode >> stream xZYo~_A/Go6 쇅 %!קnޚ k ~9u}UM}yyցl@*T02>zh/uu*e'V<(^𔯷\bIvJERTmޕ.hŷY Ed%)2-AKh;u[۝*j~c'x +Ӱ>P)aÃ?X4RQZD:i^"kܴ2ԆW%J @_}t8;IUw1DdY:YcOt۝:OVeSly"A纜7X7Eޝs& ~iѾ>@=;= ި&W 6d!ۗK  hVu[-šAuQ!`>'ho3p:|sA l U$@_~a#70gmp̺_=8R&gDn$ϗ#)EHzdP9wR0ed+oT =OU#OwWR&hs۱*=gID J{dؑ>T-A/,!4L'j5d8M^qR ?(;_lC)][Tޱt ʖ <pkF패):l6JLoc6ww]'Eȫj^p7싥ˊs_V,9j2@] qc.AJ"MXE޹9{U`<䎼y-_.A;RRq1_txEF;zqA 9$3zbt3AbxGV wV!xd7^mx,E`8Pw}OyDGڍݑ%&Q~/& W xm02>',I9G,9Ϟ] *& yNolq P:ȏY$2і *UIJ`O* XKU$u!mayFgWQ<+mqAyӠhPAXC|5VȱtH*I<poX).{%S; eV߹k~ө-E$1+<ƴyڗ#Z=bx !=TSBۦ?z"t1,C"sP֔n9!-wY$3u#B"u S>"Hoz'zĺvǕCGZ$ rǨ^ %:nCOo 0V3Yь/kĚ:xLj=;m},=每8@ O%hCk|M) endstream endobj 456 0 obj << /Type /Page /Contents 457 0 R /Resources 455 0 R /MediaBox [0 0 612 792] /Parent 445 0 R >> endobj 455 0 obj << /Font << /F33 53 0 R /F8 21 0 R /F11 65 0 R /F38 68 0 R /F35 56 0 R /F32 50 0 R >> /ProcSet [ /PDF /Text ] >> endobj 460 0 obj << /Length 2353 /Filter /FlateDecode >> stream xZKsFW c@I\'qURyHUDB"*$!%o?f@)]" 13==_?WًZ,oTi`#|hWwUS}[/^@F"2###AD[~h ej?ẙ/¶œ4`R@Ög{qkDXZ?8bδ걦IfkF*`_ $nI/R7pj_9~kuEN}"`e&biЌMFÝn t@`($iּ+:)iP椞*)PvS&Bjg1:KVyTfrGQ&X(PR$|;( K6po-$E3wA`dr2P: Ԉ8 VEz"382˂LfvfP,Ia 4XyEN֓HR$Q9FNo88KŴInC,=Ai"a"$Q?Uu(M,:<3R4ht<_XUN#Y) @2h-"b0` #DRJ8RW!kO$끲Y.AjLra@iE Y^￘XK!w/ ܛ|9aGt8bS^#maM}{.jf [Y{.i0dh 5\;톩$b}[K tm%&.JBCgGM7'#݂3^ ň} OMNJuC"UXƝR`rk 0+MB"[T_N˝9 )*kdE/JҝOhD=~Ƒr9ɎgJH@ -0V|Dl9qp̄ɧ֛4 DlɄ5cy֔:FK nFHh?s.~: '(r1đ֌Q@~jںR~#nR& ڢ R `e:XQiLI)M 8L}Q$`PʧO\#+NzDJɬczKH!`1 DV 9%~Qg@izWNɉ oJ>j `8G zq1c`]n{żT(^Rjx,a sqn?Y ×v#(@Xԍ)l9ZY`ίaH_=P" *IbBm:,) _US4!8<.?Ÿ/ou0nQ2Rg .J tc)`ə;r+L\<;kfqàyg w%yۢK%xznM}0ogrf#6Kɑ;[1tב/9rOcH7<ˬaφ7DA öc02PwKpJ}sO$DEl#=azC|[ζ>Vq4N@;m9DU38 b$o 7ζx(Wc[pS{3<'d_-`5By JuMKBgX3Vn^bO8 O_`9sja]MTu2x R㿴}Ň0Ǵ\s;hw->T0`ɐUgָ9uʏV0Zv1%vh`]P{{]0o:6]PPVNi`_q }űot;du @δHbiGZ}1>|I։ݴўc3IgAsP {iRc9Kkڛj|;j]wD;M?;$PKm{= endstream endobj 459 0 obj << /Type /Page /Contents 460 0 R /Resources 458 0 R /MediaBox [0 0 612 792] /Parent 445 0 R >> endobj 458 0 obj << /Font << /F33 53 0 R /F8 21 0 R /F32 50 0 R /F38 68 0 R /F35 56 0 R >> /ProcSet [ /PDF /Text ] >> endobj 463 0 obj << /Length 2077 /Filter /FlateDecode >> stream xYm6_!Ḧd. Ф!E.b};]+Q e%hj43ɓ] f3aef ųa:V=>u6SW8|ׇ͠H]L|ݯr>Lˣm.~Tނ%ݖpLÛwS̹uh^jXo{ZplQc[XmSVd3.V>xdmrD Zo8|8 j9W->I\;(2XuHc0PafUH~Ui֡*a7KnB1\jXÇߓu8Wn= .GTd|(ܢӥ,74Va{ϐ5/Q n7:ߖS=Q3o$4$aHLs,~_<\nŋjW+'JՐҘ 4i;z[zENS46,%.W9l]V8]Mhͦ3%]>o}BE5iM9 qΜ'ѫ[!?>tG A"jQA/Ps LB2iyt.E&?'8UdV++Dfb^fߊl1)&e`\0}v3;m&U ea'T̄2w"g{SBd˒ n T9߻97SU%&XMg Ǹþ3ef @/WkL>seȕ]Oj7+ ?$Ċҳ[w$Eeqj}ӫT0$ QZi-=43Tճ*ʹS4m7"<>M@#|й3@t/Ng Y]28]M #WoA!0##і_>zQ)tuM h!n#e1H1o}nY"B lw>Ezz]__\VOۍ} xNt+ qqZP}qnD݈W3Zp!$Sݎrib"'lCsz8Le$uB&# m‘ zÓ{t Z0ych_¿!D_ß4$sz̫=()P2LuIaLc*ݽ>%Odz 3^=@-@N?n&Ήtɒs[NoUm`w5؂i0kqO]5 ~Ē`ber9u?=?)o?7.^%xkY${߫cCU|+}7L\ z$y;jC S#6*Hq)> endstream endobj 462 0 obj << /Type /Page /Contents 463 0 R /Resources 461 0 R /MediaBox [0 0 612 792] /Parent 464 0 R >> endobj 461 0 obj << /Font << /F8 21 0 R /F33 53 0 R /F38 68 0 R /F35 56 0 R >> /ProcSet [ /PDF /Text ] >> endobj 467 0 obj << /Length 3615 /Filter /FlateDecode >> stream x[KsW6g =lv"*,ICտO?fQr"3==ūot>SR2]̜9 iRˆRQ[//&3_/mwkzbojN~ Ϲ|Q% ?=T-Tfh p߭'+ZT6'Q$I6ZfvLhh_E'4-rX=dz)ou`C*pq l ϻfW5ǵ-  WwDX[=oNumey@dKXWƛno#K)e}{&`b}kr 9)?@Tr+ޓHz)xS#>\㐋]]39S3223K~W_]_0=fp-B)Q#H,Uf#v8ˤ2'$#Ap綷:\`gSD}|đڌjGK5Ns.AG!noer^5 x$^AqHFw} B?XAm&nxV_}8_u]n|x7݌' k¿(<N8B-!znhaӌK4p<"̠ Im{ZΏIY| gjD5Ħ.JO'N"FnM1%"*iwÄO b\(Z1ύ{BM4/17u1|?a/AWhoV$6[YxӹQʜE'nOdjw5 = E1z4k1x!I8Z^,c-{o[ FUh'ME=2(Z/Wߡ2sY + GhwHTq-,Ro]aBKۻ21;m>QbM$^xP;+^"v(rنKfYYG(}xK'r%ilO5? P3mL[jxpsh:L|vvkn'"B^ؘr%2k4uJ(A`znn0BKEfץ.p \.HJ dŽ64:#&3kF'w!#G^HB)D{a'IdѮB z[no}8+mKԥ~dtݡ/|7<{O2l\\U_g՜KyY{h"^aW x=f tٱ3K4ixg3a { QR$cEMBYhºPq> N¹nqu܈B&Hς!L6Z\$hG4!&UYѣ;H|Nu N'u<N',q5";Nn Zy(B/C>^;;`m }^ZXN*x2C"1>BRIݓA0t~ /ZF'x"3Kr},[84)ޢrvtxIĊ @Pw%ngi{bˈpEARxM pF$ZG 1ԩLD*`8V FM/-/W}wnm+JMq?ӟ U@ST|_kZ*i9њ⡯ϨUwC-w_`G\hI4 o]HW!/+ 4 MJ&'(eR 1g8 \أj)@b>R+c1M^fbTM1TaSV'ɹ|"'raL9㻅?\z@ Tm z~~Xo#@iO!2:a&9Jq11 iz6[*e)HNqdJQ]U^?4]o:VI5}w&:6۟:6̓ȵu0L@騐IB>jBĆ'V}$O&/He&:󟩄cYH P?Auo)ng"iasq9]n'V'FXggz~Nl~1O)]zRYEb.=EC3L*,{FC?vz?iryaȚ(ٌychwc8%\Ϗ j,?sPW&5lJK6?xCmv gCj" endstream endobj 466 0 obj << /Type /Page /Contents 467 0 R /Resources 465 0 R /MediaBox [0 0 612 792] /Parent 464 0 R >> endobj 465 0 obj << /Font << /F29 18 0 R /F8 21 0 R /F38 68 0 R /F35 56 0 R /F33 53 0 R /F17 9 0 R /F32 50 0 R >> /ProcSet [ /PDF /Text ] >> endobj 470 0 obj << /Length 4456 /Filter /FlateDecode >> stream x]KsW(jݛT6I9m [̊,m$9קf-k%@xD "X\ AÕAHVn~pw.~y56Ơt .BѯJ:uſ.~En. )0g)T ]ۮ+#@7E4 2z~wo^u/׽J`q˶5qX/PałS7]uZkU.:Fզ j!pRyG^_3ǐSj{[}A2=CdJ!%1fqdr\M< MƐzeBSWu6 MGIS"^U7BO,@΁{s)듐M=y@aꓩlPkgZSi }>v:T/N0i:`+muA(t}OF8/:%9h#*Fg~xĻi5x!jjTΪ:Zri%/og/"ǒ *RMۡPd'8]gs/wazeڙ,Dt L۶ItRo u*4 4' 8ۊQY%uzYEf+ۈj,V5Qc:j $ѡ*V2y&݉b[- Ü5qtҗn,:y+h0oi*v:c* G'c{%ѬdΜѿ-%e;8Եmiy g錊+lإ | a1g {^Ckg$lfoV΢_{r]U0:-㇇V46\H+QFa1̺`HeGL B%;W@}ɭ 9]۰dEpf"VB3WERu*KUjARob)醷әn(cڥX )A p@kQhC.OY(L%IFLiTBvҪ=鴪ol0IʹhHV)3M%?l]RX[h7 ex!&)K5HVLJf93VDF88?)\#L2VjKwZ4;}LWfRyc2ݶ:JJ @"4ԶbG@Qk BCmsEL+:F|c^;DFε"V@Zqd)x&n3Hs;ܶ3m}hll!6f^]췏#sq?u\45O縖Ƞ\,V,Ukbf: †y Bc+x/O6bOdS9#@|iw)݌t<x K_Z%S du_?PpSck{<#A(U6,yoGG2¼ vqg6n*M5fK}Ձqؒ ^hr(uus)-7L,"T|2bMu vH13IMZ'+٧u:.rOGq-ɉ E͕5 ptcXشp4y8QRR\+VDI~5+PC-mF48x*e6@)ڂ|HS1oj| y5cb#S#F'mA9ߞL19XmX4VjK˼8'x:/Z6ċ{<Ӽط)637]꫎x"?Gv 8gTYS :`]ks\ hYE4Lm+Vdⳇi^f^(eY\|BЈJ?]#|Qi'oL捩 qT͌vfǾM/V˩9ŗSn9+h2',K} 1xy[G%#DehuS2p8n$Ќx|VXi ,3jB:h'3YڰhqlqX7(yoε"vˮ)u #/GZn,lK;ea=iD\^gp:RάGŻ@64ryogYM5Kmz WކYDR_Uȷl8G 8]wEV ; Ud/ QY,ωDt(*Y_A n0LjmfP(w`juȩ/\͈);5ꀘAqp.eR+,<Ř/ `[a $66\/*u"@{^x)q([)>HD3~ו6,%[;zۙqH{9?)T ; 4pF"2&=X`&YqMcQ rw*h6%7ےƾ&׈Y}!f5  }S55}h_8ľzϾq)uhŸ̫n\ޞ cvGȽ#= gbA1r!lv̩V-|q0Wbo9 h} 6Uw9(SCK!ɒms^}iCӥRO54Y$Π.> "^xq5Հ"q+nfcQDw%SO/(2gpTk(K禭KϠ`|lBۀe¹n$i ͊ZS(/|xKɎ_MrNW=*;ǚ x~5O8ho[[opwk9L~ w]S 7H9^>ІYjy+Kh`¬5{yւyDZ0噞D7bUZ(~BbU y "`u]x>~IJ&UsLTI;g(d{<oߦo&.-q4 m,fDHO t"f K򯍯J4bS*5D,gH'lU b|NdOLqm KcP10yq~Ȭiy&oe^Nt@B;wgp&+Rx~qs{R?3I^[Û*A.U7SC[V|2 cYMC יj2")݊XUW2DA M_ފppyH.ݒo//e $e6zx뛷<>'9E!!㙦MAVDUzW.?  K!kŜ|Z~h EK0R_ChP^IK3ڙ^D{4HNa nlX/UGN7 ħk~tEfѝD\X5p}=i^D<*NLif=!d#ܐ5GdnʅFlȹS144=Uxm-hS*[Lѵ2XU3-*(sbE|#Bjɯy|iRrT[7"슧3HTa_3|).>lwq0]o6S|qm77>\hJ;&zs4'na|WbO?`#|W"u: > endobj 468 0 obj << /Font << /F38 68 0 R /F35 56 0 R /F32 50 0 R /F8 21 0 R >> /ProcSet [ /PDF /Text ] >> endobj 473 0 obj << /Length 1457 /Filter /FlateDecode >> stream xXM6W(51OLn4@E AkXr7 IIZM|%r8y3zb꽉%hqiij ,Zw6 Cv/yu{a"Kl*pTDiQbUP4^T5W4U6o9I2Wǿۯp-{}ms. ")Y72dr0%f?/fhX@*JSKj;6F>(DL 68Ɔrv;Ws&h~b ~˔zѵe݁{w2D.yveY;P i $Z0!O̙&|Osd >,O"MHc=T jzH d&K8i#q$f4) QIň2z])ݲzcvБ[׭3{Qu1ZÈNl"?Kl=ؿyEsJGV"/sy,ڬ Nɽl}|ZpmT>JN0bVl2sk϶}t)> endobj 471 0 obj << /Font << /F8 21 0 R /F38 68 0 R /F35 56 0 R /F32 50 0 R /F29 18 0 R >> /ProcSet [ /PDF /Text ] >> endobj 476 0 obj << /Length 786 /Filter /FlateDecode >> stream xZ]O0}ϯ3-׎{/؆&&> endobj 474 0 obj << /Font << /F29 18 0 R /F38 68 0 R /F17 9 0 R /F33 53 0 R /F8 21 0 R /F35 56 0 R >> /ProcSet [ /PDF /Text ] >> endobj 479 0 obj << /Length 707 /Filter /FlateDecode >> stream xY]o0}ϯc"-^U[Uմ1( 4$6$SCLl{ulab J da#F+Qa4y2` YXB2y^nX, ]CXgC/`JI% ~w\|a`ϓ!*-$)Q<+_%S|J_$ʻE!&"Isg4> VlkϙӇ \WFS|#AEyKSrͰlZwo^C6CYX׼/vr(7 L?K\GNO[S,SLGlAgoGݸ}Ghx{ :<lA},tKU"'$6оO(~$,\vk/N/l|w!qu)]{2(7>GG}^DlʼnJ[elhݏՖjoh_fSMh宁k̀+ R Rվw4q*}6jIqsG ፛f-uӼVㅾ1Sxiՠ*/Qך֥ endstream endobj 478 0 obj << /Type /Page /Contents 479 0 R /Resources 477 0 R /MediaBox [0 0 612 792] /Parent 464 0 R >> endobj 477 0 obj << /Font << /F29 18 0 R /F38 68 0 R /F17 9 0 R /F33 53 0 R /F8 21 0 R /F35 56 0 R >> /ProcSet [ /PDF /Text ] >> endobj 482 0 obj << /Length 2715 /Filter /FlateDecode >> stream xkoFBњi> @D[QOb~}类\J[pHHg볋LƢ,S,.Dlzsn?Q5_4MR-;ޮ]u`~sUD8ioҒt_&02WCo~ vay ,JfQK;]} aKu%.}w7%Y<[H-ScZ|3_hDu5O5񪢣-owh j#hK$g]Yėe~zikV5Se_g~m801_G{t6D{̠mA%`3E+¶#I!7 OoЮeݑJ%I 2D}'iT6_񽣯3\{q@jO Ë!wtD> I}yn@BS.w Pi)|DzY/[EDL78%u:r0H6drڔz;&΢$ niѓ&7 Ą#3Sn%o 6k۶a-՞%$_"‹:H5zR B!!W* #h- F 6JBp9ح_$,39S:R rsgxY,t` Y͙E^YsvuO)!p{#R=c hDfO$;.P^1kصYBpLثmyL'ٲqpӁs4;>6 IBS $t 闲(wæ* .&ˆ߭ 2 мT01K=Mf_(a!wPvIDHS4ugU7]'@;}dCetvs H+yK7qxٓ1DHTήQ| r~cIDׂL:'Эia[湈BXԭ X5֠ƀB(yB L#޽ |9PEm9~;&2&#W"q&6- -OHѪcfZr]5&rG1dcv6ysN78K")2oc+aY!+}ҫ.ͦnWIHpxKBmAV>RPP8s|HR>_$5c8i&zas'{ ~;;>v !-=OS<쮶5VNδ$WwPRS Vp8ir!w7u}r6}vm,_pfR:Ly{d&9--r2cG0"[bW@Z>J챫/9;@ݾ_Jr P1:Bּ> bx3FI]*έZ7. i0'>&y^PR='~:pEj(|xʱ %  _4D*uQJd}jQ\xPoeȴW%M1'- ")G١a&che7!fȢ:]hpHsK_:Ddf`68 9Pc!N1 ocX..` r`p UIQ4^T!APfABL 3Sʤ]A =sZ 0:2YTM%j ~L\0LGarQ|D>Uvz/))8/=Jd>$S)O ńJDP|dm2NO<Jm _zh mv<00YkL\( KRJ꺒bT%H a?xjygZDstdlH·{| G^[yXq~tA {- {n&<łt珰}l{3IS'Z݇?짺^ixÖlPP}. fGTwֵ7k7UՄ6ͺ!ǹt=,y҄gqw@G؞{d)W.1"9)poN endstream endobj 481 0 obj << /Type /Page /Contents 482 0 R /Resources 480 0 R /MediaBox [0 0 612 792] /Parent 483 0 R >> endobj 480 0 obj << /Font << /F8 21 0 R /F38 68 0 R /F35 56 0 R /F33 53 0 R /F29 18 0 R >> /ProcSet [ /PDF /Text ] >> endobj 486 0 obj << /Length 2277 /Filter /FlateDecode >> stream xX[۶~08|ӢH]lH5=s(AkimZr\HY^I<Ŧp83f,FoU86Djx#Xc_"՛&Sw[M^65~izDzd*Yԛ)VyC˕X_'-~㩔„!p&>PY($ tdك@QbMZlƯ:K_ 4 DiDh mZA@'Ix':{acSK|Q&㉇I`<0K<+j릳%vE=IV@XiST%ϥ8gy0uk,Бf b4W;Se_,fR4 B/}i MO|2+xM~jf'8nĎwyjnOYLk${wӷeo]΢}Ssպiv٬^mZvSWNT @슎хh=y.(W?T-( Pw}ZuS/bʞn.u?pa.es7?WezWvڻ.n尾*^,/E,g:cg_"j\f QB;_3 U>T!<6<]8'78\VZhWn8T3`FcVE~! aYs͞Y[T*SּA*ݏ(֖T"5g\oK./$X$]J0E`s4SU) G#!2Q/p~TMZqVu``LY=ՀC8Fث.5߾xYU~ݷԱЁn͔g[$Qh2 )tP$v"YnNQ%)I]ߠY$Qpw&OvqdGq'!YؿjXSt%)ev1BXx.+ x>7#_(xGBَ 7k3e^kN;y_V ^ hSED\Ӻ BP=m)%?g,Zm_- C- ZZ2ͶOt d|ǾN=}6v #.#+瓌1VA~+!(2!^ϐ."TYx9;+@)LKG|\ż`ı7W # I@2LQ>i\drB@ՁS9+<J]H!׳3VWEJbtNEtZU9 gHpod.-%n@yjE 8 41i[ΐo0ipKtXs@P O:D':OP&qFO:tˁ`4 3T=&‹)3crU*/0W\&6≮|otdtALN@ ?-[Z-eZ"`i;U>l]d_tʈHE1hK.[t}LA@J"PU]"ոTis`%u2vNwT,vH%6 +r(dV,?*t k 0'Lx'l6͠6fdMgGtglu>?~Hs)Pn, W&ĖNvja̗..K仁*Qԕe)W(NaҪZcǁ#!C]ؓalj"K1K[Pd8 10CyLxUA |Rwm5,jw,Qmi9LjRcy8OpN ?b i+]}3@g1d(A:c< CW/R˿c#2,&괆)ppѶƢ E%'*jbC4xLeʟ7Nk7I(%WuM|:^#jEEQˠweP.G}w@Ry]0ujx3VN nks7BHH%McEnDpOjOB7H& endstream endobj 485 0 obj << /Type /Page /Contents 486 0 R /Resources 484 0 R /MediaBox [0 0 612 792] /Parent 483 0 R >> endobj 484 0 obj << /Font << /F35 56 0 R /F38 68 0 R /F8 21 0 R /F33 53 0 R /F29 18 0 R /F32 50 0 R >> /ProcSet [ /PDF /Text ] >> endobj 489 0 obj << /Length 2488 /Filter /FlateDecode >> stream xڽYQs6~иs74 7L$7DwLZ,N%QGQqo (s/I,>ogd>Lr4]f",,Nh:%ڵ~֎eI2I.㉔xNMЄsDaxG,Q3h>/ţY<,fR;xz>Lھ>ë8]@[g`<)hXXOwŅvoI4 v*R1)gz+!s&y"pVВݯș0K~񈁛7;t'pp3WKͳ&)<|%leS_clJ|ccL2m֙ +sfgy4+;wGjE.)O8{3^& j34w(arٝmi+<̦nQ#OT(Xص*2:jNdYp4..-}dXa'a*&H`a@=tE$Ylh ت"==svcCPWۄ<:g%qpF' ,>پ(M&S p&AH0q`ؗ:nXhˆ&O4@]~Sx-EgǨa|4!.K {-ZX޲-~eT^َ3rq4u2H 1["DYV{o˒7 SS̵bE#2 ?Q Ri[0rcG~Vi U$XQRjg,Vgܒ^;P+l%.(Us'ӑBy] nv0#<-,eu'+K';rݯ0mQ3!HP~GFOPCL;Burjvj=<`-SOAtI8j΀X9C͡D,FU0 X"R*Iti{r Dem2< V_(&_ lNB8[]f;\RrY.MKc;2e 0 u@JWESzJL)~V_vGFƶΗeb W6  сP.jNwkHeL `qᱶ!7vZKaoJzix֒'zSnrWA?+6ź|uP_B$})h&;u7bXA&4sut` gq~ڞ+܋P@#u'!8`dpG_0:2gxk6.˿S%fA %AQ8CR\7(ЮcԔJZ﮲Ĥci ]&wۡ *c.d_.Ј% ճ\k _94b^h]E[4tƾ_߿f_V3mI>C[6%Q6rp2F܄Q)&eY][lfgD+bOHMSZsJz^ ~焢qߵu^)շbh;lUo#5Fw~_7&-סڔ.NP) p_7jl6#L6WD@( AR b&"=uq(ן&ctF<,W@Ajf2V0守=G=Gz >R⑵2e2.6?rj xR'> endobj 487 0 obj << /Font << /F38 68 0 R /F35 56 0 R /F8 21 0 R /F29 18 0 R /F33 53 0 R /F11 65 0 R >> /ProcSet [ /PDF /Text ] >> endobj 492 0 obj << /Length 1746 /Filter /FlateDecode >> stream xXIoFWD1ghhР-$ (H%qz93oԫFES)E4TЍ2{?r.g›;R*oz;rn 6f 5۹C}JWb?,\܀Wnzܩ|bVUB(Q%U/w6zK5kk"v[e/ͽ("LPXo'͚3s?kR%.PJ/ c>d}d ܡ R 1v@ êC\5H}(F}\rEciF o+@fa)ךRNSu;R"? r/䊯c]\6] X̼0tc:̓ k&pzRRAcsykH ֖,ij4+Lc 4>q A43OWzyޚf]/HBYb*jSK~T ,ߑ/Ѐг |ó+pFď]ݙEl+hgfdVmf7/lAU7V,bA1Cqt=ҶB$C F' 7P3-A`QBZ6œ{Iu$TSسۼ%QteKx o,:p|o{Uwd[[=Ym54w9F]ً?BTG07xQGgt`˚R3b;ݙ6’kG̓+i.: ^ tmBamO]e9T1v> endobj 490 0 obj << /Font << /F28 15 0 R /F8 21 0 R /F29 18 0 R /F35 56 0 R /F38 68 0 R /F32 50 0 R /F33 53 0 R >> /ProcSet [ /PDF /Text ] >> endobj 495 0 obj << /Length 2811 /Filter /FlateDecode >> stream xZs6_5gLs]c#Q2'4R\ N2s}@`X.v˛guPfH" 2?f󋧔˕4QQ]-WhoSJxCXh45ӼCNnO^b#_g3Imb/Ef!k~.N=$ÝY`ur?ņb~mJXP؆m9"ģlJsSpba<_A؛vF $c=MU'?vXwdEcfd״wB|^oc=,?U*t T,G;MuS_DN_w ).n.L P+/b^\]v˯bs,~|{ʲ݅4\w+28#K = :ս )zC2 F>}l A6%jK :wMהw{t_D~ZC7ֲ46P b?VC x-ch?uǏ.pXv$~f2Y~Du FaVq9eǿ9]BE2G\L"f0M/0y_V7Ѷ8e? Hb{J1N4ų.136|ya\Q4q(?o"0R4NEϧrŁ= A;Q8ґ{W>?<77?D=s6*%ה֠0"PraU  {*prA e}ٻkҜ5{~*61^%fk:|63|w3ut(,x6yzOoޱk;L:gH|oCҖ_hiN'̤p|kf;}v)I$kfA~ ,s6 Z+Cɚ ~hWMÑqxe!v"cT;>*J5,tץB 3"w:,p5X>qa77UQ&^sz._oָ3Z5BCnυ[#<9InP`ʞ*5$.-u0@1pEKO[FwzsZ =x縢c5-TB VGUo"U(t_3s^G*g6<>YJB:Ya ^7&-)s69<-0SV;Qgãr#<*nTד;^ur]mvkB!3*&aV`'(sV+ɷV+8nOv1gVᆧ>¨"?^ xnnԹpk$t`.|ZlNvAXRb&S6<>OHvτ:ٝ6&-fd7n)lX#JYJlXX;gGX%̖00!T:F :o9 tbPRy.eCq:Qja-!iW|uq-4`է/A?ֳoʑahk.x_uLf Rgr,OPgv__.E2~PS/aBQ_od'0%MNTl1RП,,t0*cny@qi"δHKo| _o ;% DzSď4!$e̯ԻZiSPM5fy g?$qɾ WBĆj,Jd{ig:RtS16@RH>R֫#17 SI*|wϮ4o g`1s4i2zzۆ6O(bQ]~ s@.hWe.$vcY`8}l 鯿e'UTS~Z5pƎc%:B`ߜ ) endstream endobj 497 0 obj << /Type /Page /Contents 498 0 R /Resources 496 0 R /MediaBox [0 0 612 792] /Parent 483 0 R >> endobj 496 0 obj << /Font << /F38 68 0 R /F35 56 0 R /F32 50 0 R /F8 21 0 R /F33 53 0 R /F29 18 0 R >> /ProcSet [ /PDF /Text ] >> endobj 501 0 obj << /Length 2708 /Filter /FlateDecode >> stream xYs6_=D8$H =w$ILZ-NTt(RbܛE"b__vK9xI'd&wQ٭/B'VhM$\jE' DME겖|}ɻr8NʹD g[\e5 ffITʤ"'әe@j!:ASFOH2Gk7(plT1,r!A~h{ͻJI#=XՊ9OFh&Va2_, "=ғ⠗`αW;I6cb3Lz?Wk~ʙ1*0 Eه xA5by\ )oKˁ1Bv.roPwkϫwD<⾩c4=4Ï%Xc1ܑgG3@ MaW1.M~q~)9p{#V;S g|?J)xq::u@u>x`I}~eDbۄ6tND% ^o:m@cOB+(.{qdh̊DΗ4bq4 7&o12l=;>ۿQnAM$L$?D"-XxwshZb ϣS*) {*I x~*T\pQ3 ReՊ8 }I˘>/ ׮}QY}" ׷| 0iD %+4K*B=:IC,2?Ks4MG麩vہ08C =h$W%l2WE(аܟDZS¨>]"4=?0wabk_ҚaLݓ8N;x@E`m>RdˊwWmFnPR^*Ma?N =Yp&&k$;݈2X&3k8)tq[DWgqfm B{F.x \b(&A,TCK#}&Gcpzy*Ur b\[ɱBz вY1X-2U}^t bmђ`lH')[uozHK?TbU0IgOWkUhCʼnX6Ep.I{&v[z:t6['KCO.;bg۠| KyAUMmJ|ߛBn[[z̢2q./tJn{ kgAnzD_Y\Jk(~X;}%y`"JKeX{Ѷn\X6;_ q tK/tqLSLl9?(\R\ȽʯڰCj >t fj{=Vmr4Z!v37 0&R$Je;ͫ.pt A/gYADS켘Үs΄UNM]CaF&;e[ɐ `-4L{wjJ%)ph/7f|?3Knsm{[5tAZ4{w{S .48*l)8pis a endstream endobj 500 0 obj << /Type /Page /Contents 501 0 R /Resources 499 0 R /MediaBox [0 0 612 792] /Parent 502 0 R >> endobj 499 0 obj << /Font << /F38 68 0 R /F35 56 0 R /F32 50 0 R /F8 21 0 R /F33 53 0 R /F29 18 0 R /F30 43 0 R /F28 15 0 R >> /ProcSet [ /PDF /Text ] >> endobj 505 0 obj << /Length 2458 /Filter /FlateDecode >> stream xrFί-`U8Ƽ0%qMT%*Pv=/ D=Ẹof/~(4':󫛹bsk :Z˾K Xgٟ0u\,aT#̹ xZk 8)㤔<7(=z+iߴ1@4-sDYÀvHAn2_kG7DÞv{ O}Yp'2Pq1Y&%9;Eᖭ1EN|)rF(eI9B(5"_yF))+Mki!\\נ]gQ倣\ESʀ921aoڎPaO^z"*VU]getmM0VFUR(oemm!]VM zgɨHHoEgqc1(5B?03(IK9'zR&3+%W+Ĩ$<0?1@@$a)?7<֩#JpD*M N0mkVn z4~6))s1"<2!FMz5~:OTQ/ǏkjD)/qwUHyNJglzC\`PFP|)a} P Jf6SÃˑ>rʑR& l2ɢOpÝ}7 @xv-G 6MJ&N`|`19lUͣB%oVuHBHo)WFJȷ=sbޑO6~=M 1n*S{@!@}Z`-#`4ED@` n3QX[TB٤ǭiE2WBà9)` ʩ wapñ?9H7+sm 5BpW͑%7MnCBcu0*) KBY1{wQ/P]y n/SEdy"iqf!P?@"}ekbZ@ EClƊu8٫t=VSo.0řabkNq5c=}hQ4iHzH(֣-quݎtv+'={vbuJ@-(ԋ")MWOi]o7k5!DHjYb] jŢv:<-I9F8%) H6hB-jPO@1JDxY5OByAIӯlBoy\;K*vV-X C+̟ikhQWF FwNEle6Xߧ/& R^w۶?ŧ\0_ } @) :== 1ʿ魂8ǽjkz?.,G.2; a a<Q9GG´//a~y7=bX {igoUje⠘&R*FC} Β'!¨Ё4OmnQ@hŶT+R!, _|}0~!iWoak~=>m/]sKpFOa[p!3޶ֻ}%U.V^|>: 6w%&02ly>ND>mU9d6 wA9:3(јxBA!hMpׇ>*Ua9>_4bElC^_K'5-ݐ۸th۷0/sx#;=]t6;z 51OACjeWt G oEil=F4* Hyj>6 endstream endobj 504 0 obj << /Type /Page /Contents 505 0 R /Resources 503 0 R /MediaBox [0 0 612 792] /Parent 502 0 R >> endobj 503 0 obj << /Font << /F8 21 0 R /F38 68 0 R /F35 56 0 R /F28 15 0 R /F17 9 0 R /F32 50 0 R /F29 18 0 R >> /ProcSet [ /PDF /Text ] >> endobj 508 0 obj << /Length 2768 /Filter /FlateDecode >> stream xYo6b/bZ Z zI>ȒlЮ6*'cwAUſ L۾jΈ*"OZVH `BxηH ){PQ g" MXn{_ #*@uH;Z{R: nQO<>@f-OGt.b3 ]6O{V:ZEngiNoFڱ?%w#cR:,bv8 ^rr[\UK&uSvb41ku;̅槻@z,vxAQ8CJn>p @b8ENJahmg(|@]F'A'$E Viw|ᐱ?rOUvQWWi$dUşkX~?0|8mi gP Ǻkmui9~ ?}J'ޏ=FؙL&g`-q$BIFyb.,k+7b{ssH[s^a\DQZg+ѡa3UF#ӯo2H-%ΕٿW>(Cy!\T %g0baPRŨ]13ECG%G|9ѡgw+8s"MW1{wH69 3Գ`Q)*ь6XCmS3}:!gIf?C* 33<8/l*`8;n9E^O%EM)桙b,GpF~iN"hK{~iEe } NSk6S&N%Xp&u6V<{t0E~ *R|ELuTD12q@)ٚ_ʨ]O]-]41IXTFZwS+E|>̫2:@5ߧs8ٌnJ,W۝IfU_ԳZ$X>j Kcqd22"I\D .(7L%S/Gϼ@exdDs_PšOW+ܲL:?`L.+,OCs5>?0a.2w%+]1030 b Nڤ !_ÿo.Oh_;z_5~@˺vvxVO|FU:/[CSB O$#<>xŒ+X h~i=NA`KX!xtx(S~3\9>0%Xl .&_r :8JH(]17%i"t< ؛|yEב oЍ@jg4p @i. !'[sFñ]e)juo6xڲR+!foSoOZP%"RmCkTv:~X! IiY;׻vji T ;m`p%rڣmſfo_ՆZ/ F ^j%wsrxJBW"Azo\*JV7%Bƹ_zǓligM%D); +Vt>]k|P ujYf,QcW+]<]D+V.$x _#GXёݷnnSgMAYeo$ka,FcF2;x:/1x, yT]ZW,RK{񬕍ǹH~ʘx?ܞ_( EFbCpr/LAv I8 eXqn`yu.@Z9A6Qb{m ohܭ+-f=-YN(ξ9Ä( [&U,TodzwMun~< ʳ#> endobj 506 0 obj << /Font << /F8 21 0 R /F38 68 0 R /F35 56 0 R /F33 53 0 R /F17 9 0 R /F29 18 0 R >> /ProcSet [ /PDF /Text ] >> endobj 511 0 obj << /Length 1836 /Filter /FlateDecode >> stream xXKs6Wpt:'8gLI.ic@KD"$>w2)m2c"bowb:]`D=VN5`xw/\;bL:Ʀ3!V"P8YƏgeQL?xX <0!tà0 [֘47@n(海Uӻ6?xaE>/v~#erg^} }recح r/˼@_-VNˢq P:< ŲlKYdSZLdSSDA ؃0y{ydh|*6_Ϊh|ݘYӑn th9 f4-B;±~B`!w'b/92bBeiu^Vg0iUZ߶ų*5hoe 8 !78d-8\{ uGpxWOa/ WE#x-*zq,,ZķTVMzζ)5ΡP e>e7pi8) >_[\[ί\5|3J?h~"%"ԂUīmKWpņ/3#H))Kfb-P= e]g+^=.W9$[!/>Wdy{J \ !=h .ǝzgJ:mTq橽zu W.KM̅kJ94?G*KՍw'6 ;.} e?kqcKpa5151Жf^Q:G[7A* ߝ0A^4Kn|MXk>7ĽbDdBɝ|6+,5Hzwe{ПL.ʺ V]!:~_E$'aG$C Figі> endobj 509 0 obj << /Font << /F32 50 0 R /F38 68 0 R /F35 56 0 R /F8 21 0 R /F33 53 0 R /F29 18 0 R >> /ProcSet [ /PDF /Text ] >> endobj 514 0 obj << /Length 2867 /Filter /FlateDecode >> stream xZKܶﯘ%3V&@e$9)EN9d3&h@pȵKh4뫯W:REToWYeQ"Woffk~mqluSp*Pm>^wq*T\Hܬ"gP+c %Ҷjp?&Ies/qVXY!WƦMyn aIRlnL|p OSr-dJzfpl%< -qNu>q3ݵ~5IUfL$_`efgjkRf[ЪeyAOW@'=`C4Z{d:H#Yyiy6[k_H#uy}a%˩kqS jσáٝӒ3E+ SHZ 7Giu†QܬVcv&Qԉ^ͭ ;Q*١6<>2g}ky]mj M$x !>Y^{gm,hH;dw983B#R7H&?ᎻLd8(۸H!!`H~jJ< XlJσW/^#q~D] O|w0*/B_[Y8l.$As5ce7Jт_q@%KQգZb% *kʴ ǘnM4ƍKl9-$ӂ.Ӡgr᜜ͮw YrapFu"!Ohz}I!Z)Me#_zc_E"(QE^[sVXm^I B\Anq4$g97̛G<:VVLQLL9P G~v?kEL)V3]`5BxH4Y\ .;W 4%@o|V>8Ga!F)`-i {{Jn}NS*ISzɃ)pK[e,(@1>:*ѐ&pT{iS+R]]y?l9=p6 sW qyS\p(ߡ2Ŋ 6TDŃ@0Ox. vT[p/a[nv\ >qt)B8 d]91Ȃ;2-W t9}w e 2YL=[YPet+A?ι r׵qX!@;j૘$Z-LU>^xp'W P;_#q ZzBVbhj*fHy\XdC"]vy9G[mR 澃a@¦Xw3 ^S1qۓ 5w;0 SO}1d$1t 3v:TeId#"qԋi+͞2 k| ?]E]f2Q:jM65kMua.t\A+{8TTpt/yA rS똏JơO|'^ɵA.0s^;lRC;0iVRJ/ވK\)5r"thQ},˽hr sX@m^,?T;Yݻ"̿|U/}\뛒wJ);؆j:jp=vbW,>qr0άʠ<#P 8ď̑ag6UQzZ^j_.ѯAXcXnjU:z:4|?W00c{en73XDTGByc&̂Y&P#gZ0}Fy{IT=_. %@bӐʩܑ1HmW`"\ qxnV-i@})%-,)s8s.=4Ax C ~*S fM4n.)/Ě2 }a endstream endobj 513 0 obj << /Type /Page /Contents 514 0 R /Resources 512 0 R /MediaBox [0 0 612 792] /Parent 502 0 R >> endobj 512 0 obj << /Font << /F8 21 0 R /F35 56 0 R /F29 18 0 R /F38 68 0 R /F17 9 0 R /F32 50 0 R >> /ProcSet [ /PDF /Text ] >> endobj 517 0 obj << /Length 2853 /Filter /FlateDecode >> stream xr_G)Sb  A3N6tlN'$D[l%Q!i{7_s@RnÃs_^xm2y/.Zdq.b-+<Wʖu[¯ɗmS+ex5 8vU-W|_Ӹ75m5i?1/ܔ%-ɨW]EژUq3H]N|2I 0:ܥgL}SYĐL>8Gf)*$$61Y&$б P&2t n4N6.JY*=hCce"Hz鋇i\:+GoVߎ3;YA$Ԯdg$$ }9./?g,(9@Bb&h8E #LY¢](536E=b` 8Q`P((1ovXgN:oD0"w@JebL& D?X=5MR+\0IOQH͘ǹhs=J/*C7kV (2 ),cVLtTc 匡f3Cjo5HP:/gDle4ePP]"Q/m_CF&CJ&ɝ|}]O2CLl浣A6}vfd6 pB(N-?M i,U3cPqMȠ4Gn*6Tw?-#FA (6C&䅋1&Ŝx%ylhl*42 "}uN h4FjMyW, :'5P߹ ƥ/3.qxS˅rݶK_QA>tGu2[U>`f\ 1F$Nd048(F‰1&#-C։q*|Fg P-:;x_~VᰄNZΈ^"`ᶹFweWܡH7ÖʓLkѐN?7tPw d sD-qx+ Li6CmY݌ @j"M2M䨥|4kɉgzԏPn8EuuҜ=GAy#f}>=ɀ'۵lNC p$)vyyȦ-g6T+ݨL>:`V)#6bsK Qp3 )>6DJdt &@T5J=ر@kAR].ARxhkqOWNc R;Vr+5mM<C;mEX d[|Uax`$Dr14L)#|@悳@lV8iG5Y‚؇qc6ȄUR(kOOǀy8]֙yzkk=4EO VG|nLl$ܓLquFcGfT$}4"yHhcJ#M蚲W^xD(dXE9hm3t g,un xNSr.=t+[~lԈ[-1Y®chmrT HcU48zsT kC95ޱ-+v.Qn> Gʶ83d}y6yogH/X$ȭ {kqpq5 .;1'rp,Y0 Iá+Ly^8GHd.`QlRQ7C 4ا;B׬zЗfhxQAm@ P!Jg%W[]}s9>jKf:5NMq07\wŒ.u 87e)]AC=6W{0et|6-`p'ҧ[6KNPXFy& =HH)L>TI{E6ŮˡOGp̧* #lJw>_P;7;q`T0zԳOs3f͊tu]NVs4 M(a "}_}ixf-,+rę(͌]XE#y J6, 9~*Jlg*k k(Ȟ:e?" *N e_нv~?T"g.<FPx  (Y endstream endobj 516 0 obj << /Type /Page /Contents 517 0 R /Resources 515 0 R /MediaBox [0 0 612 792] /Parent 502 0 R >> endobj 515 0 obj << /Font << /F8 21 0 R /F35 56 0 R /F38 68 0 R /F33 53 0 R /F32 50 0 R /F29 18 0 R >> /ProcSet [ /PDF /Text ] >> endobj 520 0 obj << /Length 2263 /Filter /FlateDecode >> stream xYK8W`!gbDꙜғ,0`/d[%Cw֋e!1EX{ss ?aU~_ݩ\_7?xyFE~U@.Ne3T& چOR-Zeާ/M)ؗaT{z^EV9Q  \ h`?q7YOv-כX)G3 '䁟x G9)u$∵c&_#{<`Ą;PvnMɳcRVP&Ks?ҩ}*? ,B:PNVx= Q:VJ=iR"Ȱ* \E˞;kӝ%FP0/Z+qozOGSE$F?]{J4!۪|fU쫜/ݯZ{=۪jR!4(#dוq3=YV&s^=K2񭍤lb#"+JoњU2H@!0UJ{sokFB3JJC[0]aMPŇA$_g"\a, WBzX*pKaۧ5O&"əV=N1Yeªr.6X)&#'TppP5e௧&)O 8Z[252 _C`Ѕ.]{o`YBQrw\)zb=Dzx޳dDBZDˎ/QasUpa"%Ju0ߚ URhuRƅB*_D Ơ8y;ƸtTY|O.an,xD8kSAFW"=WLZ6LDa~ ;vwW3>,T@l; 3Y6T1ej9-5B0Fh5(]D_mv[P Dj$0s[x5!:_5H0gT5jMq wMaq2cek/n5{Wk&L,D3┞f>ǵpDsY(dr{HAn-W~G/+O6N^,]/!kʎWv/(3 KV],X3^X0nA-Z> endobj 518 0 obj << /Font << /F8 21 0 R /F35 56 0 R /F29 18 0 R /F38 68 0 R /F32 50 0 R >> /ProcSet [ /PDF /Text ] >> endobj 524 0 obj << /Length 1372 /Filter /FlateDecode >> stream xX[oV~_\b1;Tǎ4jZ{UUJ@8!baݟߙs`صݪÊ0ol>9~å 7hAQ7K2JD$@|izbSeU4tFs'x`YRx&EL_HmDnb S.ko4[O 7()确'pèFD\~thfh O -kSp%i8P < C=$8Ӹўjbʊk`Jk`CѻLa尕 m7 SkRQ9 Rv/$b XUgvkfW{q! $kX%jSU8X@HFE)7DW%/w+ C#N_%U>m٧Ѐ(~R?]*C<"Q`V gJk\,r0͝[f ZOr'n&>FdžyjW.O:l- -NJ)cm v1JZSV=9jfUYo \M>ؘxs`||}}A]& dM{awdV YoQuS#"phXLOMѬPO |Be1a Ȭb961'vWw0FTU>֪9] +e4I B& ̪ ckA'վ8ItXnBrX)5/Sm ,\mx)s+?co_w6Dp)Iģ l#"f$Q-uAu%j¤_"Y4@@+ǢW,Bbw0ljgߏtvUFBhה16>oo#<ƷL ΁Nf"0 恡1quq;tqI7N"`[eYkc6O>2ke0kg̱;4)[N6j^TҒT$TQ\lĺ#U$fh4k11K0}peRmwk"ګTtͣxjUm4`a"s#d`p] 1C\ssq+atd ;:ċ=p^O^3*Hz- J3k1a,,*Ҷ^UuU =n s=hu;a7Nʑ> endobj 522 0 obj << /Font << /F35 56 0 R /F11 65 0 R /F32 50 0 R /F8 21 0 R /F38 68 0 R /F33 53 0 R >> /ProcSet [ /PDF /Text ] >> endobj 527 0 obj << /Length 1652 /Filter /FlateDecode >> stream xXo6_ad #R%}ke[jt>(k%ϒ)KN{HLQ5N_'c4Hq,q@|ћһp.z"ﮨ^{Ml ć,H/e]!/nWa4NY: Q'%I4J/|deNĮaHhڬZcw%ﳒf]Y,~e9e", SX@/gdb\"iWd*E)Y =UfB t9`y9{"'DyY$HTd9z< "m:{$Ƕ(?q`/n;:1Ym| p@bTzk# 02^kEH~"f"oJ߰D ڇpthED%XcziG HziVoeNn)Z]Hq]MK#̕Rzwo T/.!lbğ&wQV_RBtCIrI/tntmamln_ t<S t@?E|mURḀ2bbCwU;X f8hlWKJ'E 2ul47)X ^v|Ut^2:R)c TZ, SBAȻ3/CJKܦ6{!V1S-uIZ1ZKM;Ձ]RF;$\[ᬐxQlVFzSTzs*EGE6mβ+J]Mk;)nt|@L,fqu߀fS&f8.&P]#m֌Mf]Uz pe|?J15tAuPRW9L|WTrs9\!ߓ16kl?%N= ;Ct_gX@GШc+NfV~pҗaQjY!B&<F{A=.a#55}=|0i0ܗc0act#Tӿ^XDC) "F+~s$ù_<9wb1Lʄv/7 w:E9|ǃgV;Xly'3YQ[4&t騡F H pF&z`㷣yqȽHrne^l_:EQl*γ`y3j^+'L5U dh@4tv[ OԒ{f\vf+?,iv\Ȥ/ᕑ6ove/8)Δ% > endobj 525 0 obj << /Font << /F8 21 0 R /F35 56 0 R /F38 68 0 R /F32 50 0 R /F11 65 0 R >> /ProcSet [ /PDF /Text ] >> endobj 530 0 obj << /Length 3239 /Filter /FlateDecode >> stream xr6_ڗ#8xlΑJؕ$DJCR>"eVj` q89Z6֋B%zVF..6?W_.h XI)lPuRҁT&"EHPLqPX:ۥJTes'9JRh:oVTZWc㹰^گh+rJ"ԞHڿ;|I5X |uqo!LT$e<>?◧@8L}d)tzfAL>;5OhZL[Li!U2ć[ }E6irw9C'bw/qWQgyDٴҊXؐ_3vUsg C`s9 W>6A>́A5+_2#lp A #͚#=R2(3I'z/%!"q(l J쿪#jH4L*I XJ+T [Ĝnn<{]gٶ*o*\IPLS.;^މ}tKr2$H4ցݓ|iD+PBR`%| GtG.; DZt"M~(1uPNPuj1{V2XoFfXmXghڕ eCQRa{W|OJ!Tܽe{sFPVMjITie WnȠ/S*$!̶ؗ@N#o@Jɖg 適Cojƥ Kpll7^[1}"䫷VC?$*m_LM/wVG"w\|;_hq!Zɚq[AjTs1e>C@[xciUVXş\#5SwV7 Qⱦ}cX;UQi@->DE[Ժˮh;=`=5E,C)g׳1vMhGP^r:Y9'C$2 V@:zUka) HI\(PG!zfncJNkB&@ƾ++O{UMLKRTᳩHcױb7bԚ--A+a)؋6N(ƍ8lk72*`Á0@W d;t k6rTtɌ;_7f5SJ`hX[vC(Zjf; )S?r؇СsQ@i]u/O) }fejm:r?s`8jtRt.%)PM3^(t_79e$ Y9e/uzr'i"Bi;5 Hcsy!^b1N0:+ʴ;x @`#$iD3+J$J@ÿ́i UTYGd Y*D;џ,A$0R#TũС*@1@797 'A3OJE)|c 3IHeL]3wW"cF2{:2v5"ݹȭ|g23#; h 9c!$pjǸLc1}ae)`#ȣjۗYٜp>~,]!κW,??Ơ70ϏH3C"h{qѫSKϼTX T"4##X 8nh/G]vIxEo8wn6cZlf:=>+wS3Os~gKMI+* ؗDx OPv(GWU.K݂܆D t0+`ҏ=3R8+_AIedKܚ3 endstream endobj 529 0 obj << /Type /Page /Contents 530 0 R /Resources 528 0 R /MediaBox [0 0 612 792] /Parent 521 0 R >> endobj 528 0 obj << /Font << /F32 50 0 R /F35 56 0 R /F33 53 0 R /F38 68 0 R /F8 21 0 R /F29 18 0 R >> /ProcSet [ /PDF /Text ] >> endobj 533 0 obj << /Length 2422 /Filter /FlateDecode >> stream xYKs6WH<$_b!e'qz+Ɂ4 ɑ!ő-J̀@h4~[Xq_ 8q"G2h2L{dX4?TX=GdU1J%67<,?e)kG:l[]vծHY^od^{C8#a߿"iCWGJjaS8a]1J mö?R>bwUc \ބے)6~Y##^-Ytn枷QͶyp4]52\fܾ^dV i7As)MR넯EvEQ+Ak='_ ؍<~ 8,s|£SA`Eg5;u3ȣC Pȡ[~ےl٦d)zR-wEWv{hWw"P3ĻB-8}m H5H*"{M}6ZF멿F3!!(e`kpˠn=Laf3&p0؎vZ6upX ɴwta8FX0db"w̗\[QvA P{to# :%8TPG}?i@9>L ?K E6`16&>bqYmiP# ;Rl %=9HMi-K)"還vB3#!L%1Wd_ FdbzFQXGxW5.uě[;%uzAǍy[?} e@#wC_]b׵C>);~1@Q.VK6Q@7wHB劈 /Fأ*XμX<ƛVGY?#o0_f&H>X?}(bE !#E"ȳ;?Knphb<Qel VhX+U^M9ڱ+4҆T"Xe*E "h;Q~@ CdAF[`HMqX9ND@(&܋n *u|/_ wq/b拈acB 槓5vt๮(5x*'a< L O5b4zϑ=L6X]:_;CL?Ԝs/jzǣ̱UjiLT.:*Bavm]"7*Gw~S+TI~k:~I#yBB!MOxt .QgjvtDE$xtRg2Hsaͳ~\άm:72 7vrI1!Q2%`<kbL,]vU?Tk| f͊SqycbOen|"_7{zhz,Tfq}8`EZʱm*%RC;$:pؽ8<y| ҧk> endobj 531 0 obj << /Font << /F8 21 0 R /F38 68 0 R /F35 56 0 R /F32 50 0 R /F29 18 0 R >> /ProcSet [ /PDF /Text ] >> endobj 536 0 obj << /Length 2969 /Filter /FlateDecode >> stream xZKs6W|R# $z ↆVe727@{hCiNkz;7W FwYJ"P N2S-E#FU'y^vs{ٲe vI4%gE}JZU4,#GB74Z^h7 \58iS/ Jk=no`ݡ   >B&ؓGFMw/'A7%[wU70gi5 3ܻC.>wLVuA_5 .m0RIOW~t_eH `{h)k? d㕸XӤۅf_A++NAP=w-  6鈈0L&2+1JFcC@[I«Wv5Ipէom5cIX#a #9>cA'&aXE%+1\AzBUzeS4ƒn6x-āɎjtm'pC3GM)A\zv/]m=D{w X@ӓ4!9a8H` )a k nlcB K,Xސ&,[n0;v۵´ɒ9!'؇@؀_:(vbKm!>`;fJIEֽ@CыY'TDs؀.=jb&тO 9+<ߌ |Vz; P@+IF\CF~ʳТFP |5y|[  Wt={$WOLEf`z|Zz`8 ~*b"qYHwL[#kr(|P85p44U BҕIW5}q|XtQׇ!e6Ge 8dM^tB<$RZ"kcɤO 92jXq }FpEA3$H>GDp2qkt"#GÈY?F "rw\ F}-64\e{0TH&xĨ/V2_M$PFsNxvKĈ3H ߷5qb+w;R\w `":zS8u&j lfjWca엟?m5cc:`q$e\8gs\}-( \@oG Ӱh Qe A,w668Iꋞ`@q"tll7 YXg- 0I뒥1iaNP[gWr84 kX&b1$a ܔNxOdֲ3-2b׾uyR>:A{ @J6cdS\G2H @xteτGdȖ@ʡg82z-(׵l * gaz5 Pb]%GISn(Yw|{t5rA.u$w1SF҅gUM-ZO廚EO?2z-X5:(b yZPbw$SˈKb>JCof@mx11~|1z`F:oo\'v:B:{wȊUć2_~[KL4'Y[ endstream endobj 535 0 obj << /Type /Page /Contents 536 0 R /Resources 534 0 R /MediaBox [0 0 612 792] /Parent 521 0 R >> endobj 534 0 obj << /Font << /F38 68 0 R /F35 56 0 R /F32 50 0 R /F8 21 0 R /F33 53 0 R /F28 15 0 R /F30 43 0 R >> /ProcSet [ /PDF /Text ] >> endobj 539 0 obj << /Length 2675 /Filter /FlateDecode >> stream xZmoܸ_0ȺER|Q\C/$E\>(-tWr$wCjNEJ5|8C|urJY2-gW3.Ƴtf%)]~XJyoSJ 3>Oe5euszW͒قs)Eru,OX8w(UGPV0(를vO j1@Iy y1->njg˲ܭOW0u$C/aHZ;WES\MBX;n 0v^LC 5s$ jV(ʺ#V'V$ OLl yyE7'@nBb9tLjn]{_3aϽpﮚh𯙉}Y{[ozCmIYR&qQ%Si^uk_k7%79CE%4KZ5p>KwX\oVQ9/qѝڋZݢC޻N^N&JRhRs+˻Ϋη#Hڂbu:aABnzXvhuMIJԋPl+Us&W"Vl#93C X5p:#qɁH2a 5;mMlPT00{ru¡)qДgJ+rs?$v0\cf2 1p  3B[gr0DɽAAyxjQzu &[ݼhRh΅kdlUtdygYE>{v1ٶFxd $з\ I/q۱T(7͞,I)S:0huy&*VPnISUP`᝙rB_!၍I-v x7il ?T= E$l -"~fN@8H[aӒ$`pIV {OyzQ1 b 1zejj khQYo.+BBn&K"ÙOr -ԞAr4Ejwux{4tlIe=Lt ^dpPJU]yR,pHgfaѤ=ہ 퀣TQ q|XoηtA+Д/u.yϦYO9e& k PZJX*pŧ;2L =zY(W`I$sHcd?RP{-}Tv Dи GU)i/O FV%}Ch7&pl0OKګ*̯4~&r~ ȐjmDT=+Ji|q95llgK W;{SG""«*M;뱦B L"-+Z0z{19~7J(t`+zq$g`yxq$8=ot\y)Ҟ>ӄJ ,5Pi+eP]+z&I/|k+_3ֺDgenr-ð l|rAqpȣ@C)k{vzve| b"$|3$r1mL}7,!![xO{}5(e[@Ra񬺂Mk(%6#޽tB Y2Í&:Țs.jbJ Xήխ0;yoDϝ}vz,? D0aO{QhHc&xB՝+R7A=t兹sGBO_ʾj&8cyha #RV~_ RWq L$^"Ů LwKȞV)<1F 4|/1(c }?Q=1N#} rpP!dF dɇyL17,(% }S#lG,uZdyJC([?R7, {HԺk7'OxbceFG^bN$&1`GxF q!ʀ=`&D'ѹDI)蔰p}=p+M`K\ޘWlPDlxj6jؾvuL>Y?3sX~?eϣI=yFhv"Sپ_KqRӋ{8sI@NUG*R)gZxYHD5T@肬Uk3@7\1`rn#xxf@(Qe dcaMS;; 4/04m 56M f㸔uL0ag>]Ɏ>1 VOF@|̪m:|(ȹWlGݯ/ Yٮi1zS=voę4W56 u%/`|k9uM|D-0kÕ _I` endstream endobj 538 0 obj << /Type /Page /Contents 539 0 R /Resources 537 0 R /MediaBox [0 0 612 792] /Parent 540 0 R >> endobj 537 0 obj << /Font << /F33 53 0 R /F8 21 0 R /F38 68 0 R /F35 56 0 R /F30 43 0 R /F32 50 0 R >> /ProcSet [ /PDF /Text ] >> endobj 543 0 obj << /Length 3483 /Filter /FlateDecode >> stream x]o6ݿb܃UDR Ц .5.z@eWʒ+iQ|\i%oRdqW"Gpt!0"$(ͻ2]NM-W"(2ʥǦf|_tQRD:*YDq[L@ueLY~)zIP"?QAY:LHUwޖR{< > G Cy>/il I IB-%䎞@$ f>0kPHB!CnukOl۶9v'`l6coˎM(5vlh]7J,*. X+g-8\ssLdƟ'p -Oh3~g qePK)p[0"E= `JSxIU:] %48=sEPbD` Pd!h}/u{6N%sX᩵n'a\(b vOY?߯Ǻo떂?A%Q sCzzzB6VqS3鈺"KiO&A1Y&q>޾,qnq&+)ՠ)# A 8f̱W5` (_8Z\)bw:Y7M&fJTBQ%{7 YhaMP=S[uy1!G:Lf*5"!:LZB96P փ]su~ U%V/D/=- Ҷ_tɐ< Ao?!O_Pؘfq-}c8dpۑHAQ2(4 bQhj5:L fՈ\3p$MEtDK&|+y9\ɃW1u`"!m򎞇R${\9\ LaZ|5gQ8Y\I ͈R?uәD^cc zSC,Y,WoQGȰabJB`W!2N l{8[)J=Bg8})ft&x8"9oD+bsEUx}Yv0짵jlz& S a߼/gYkc|Y1u0T^+]f!Ueqj|]mX$݅x`J*ІcЙr%gە]Ztzg l=ͲzVYHpoq*wz( %!.7Γ@%!js|L,G-!lO</1<ԭH0ݵx  )&j^&'J|vM<WWnv79ݔ.MUaήuWFlZQ]?Ni&)|Շ~"#X Gq>^6 :ZHpꟽJB[ޑ3SJHdd{%LA،*xDŰ$;#KDk"sB%!q@ }Qs XL[ywBZ;1ȥ+-f@8 !mucp]6-vԍ!M2O32_xov=5H^dFmɏ{=/{J*>SH2m_pCEcJ1˫J.x6W(﯀Qú JulerO endstream endobj 542 0 obj << /Type /Page /Contents 543 0 R /Resources 541 0 R /MediaBox [0 0 612 792] /Parent 540 0 R >> endobj 541 0 obj << /Font << /F8 21 0 R /F38 68 0 R /F35 56 0 R /F32 50 0 R /F28 15 0 R /F29 18 0 R /F33 53 0 R >> /ProcSet [ /PDF /Text ] >> endobj 546 0 obj << /Length 1863 /Filter /FlateDecode >> stream xXmoH_a夓vl"H HHv%7.K fvv;v"xcγONGϔ R*8=L:Hxʸi>|%:QxӖJM|珎,B4Ůö)Ώg:c#~?>ʖ(hRk0(xj$?߭Vkfmb% r JM;+$' IBqL:B1繳,rZ( fV ..*{J9몪Qk5w/ (3"2-#BQn*D$,k ߢEYAS]ˎ6XM)uFOZG. ';I'EČ6;ZiQJ)^ozs6Jփ "n[/`_y"|0v c5V_A< LaUChwsE |D1e G XװƑ R⯞UĤN`XE) }. O2.4hZé װ!Q퐹LYsخK0LKC$$@ťHz2ht5wrE[c:#O 9"K1\ %w4,L=eګLQV.ˠ(%w@rx`p4clΤ_D(펙dtjV-YpT:Ru4?Td_&Qܞfٿ*SrW~έ{?.U9qXTތ1i[pd4*]>œ?F oJ`cQjкHCٔ7lϴ&fAbYϔԉWSyٓuم[F?Dt A)LQY| \mq/v"~JV9HlM~n1 %C$tS,X茠{:գ2#@>!pA2C5pZW Ϙ_X.Pw[]tBfT3lz{xQHUSxYS߃sdja> endobj 544 0 obj << /Font << /F33 53 0 R /F8 21 0 R /F38 68 0 R /F35 56 0 R /F32 50 0 R /F29 18 0 R >> /ProcSet [ /PDF /Text ] >> endobj 549 0 obj << /Length 3319 /Filter /FlateDecode >> stream xZsBug:R$Ȼ^g4$i4$@KŎ$:}>yT&-a 7i# gbO/6ݔ-,t>WB ōuX |l{xϛC=RlC% \ lp,Hc^G 7+Cjb@ RY S7{LnPHu!dܧ_+osobP5u߾&IJXq(ťs Lb|%KbEfwMVG ȻРw m3. b>IgV x~eU=TBxgtWXu!X-t]EN%1`D~[hrFΓ?Z=Fl*:z].v?ϤCx$P(a䖺*-CkSƁcgbRF NrX\FIm{@u!Uln7Aڣ m^'.PL'{>_?Y~cv4(m)mADFhl몋IY0lâ]'>O[ Csb?®]_("gjVB,SJXmfŏ g 9B SGhKVvZyWLԲG `&!<.͇}5.Ä:h-US#TQ#)x% 3B01Ii6@ŀyʗS"O;yY6ܞkٿ>z96Fѕw!up8R;i>>P%ⰺ ~%(>~sE0աGg\-nCjآK2%`Dn幌rXVoКWp/ @X89F4sJ/ h#dT09x$N]h")pnUPnG5~S)0apH(iN赗yWHk Us 7@=URUߣEndd]aPi=ABՇ)PPp_HAvpU  vb J\Xӌݚ@Eni jQŏ)僅H4Tl 2~90D4/獀HhۙX h-,7B,NwF,@fOWt-0XHk>[Nyx_D؂Vq.EΔH#.Y!Mi'xb3fѲ<NJg;֊*UYn4=Zz?\a ?>juxO!Xէ-tl oeŔPPsq4ZTe%!V1Hy4-Aƞ~S? xm&RQ(nB\q'$cFa|խ,dG=M[qE9"t0HVdT01+ UZO~U 6e!Gpo& %>ACcjQz>fgXFas=x5D;3e`up6Tڨ-?3>@׻NB8oR3zXބ8}SO!euvZeb<#FS:©HOT$럒^(;?mAݿP5@Jy> u7/m8TSca'!T=3ݘHkMIOLT@bY WL>dZyPQhoex!p9fWDt23:5M)z7i~TPpL0N]3P6HB((DD%UpwԻ{el:y0Ղ$S)jAL֛>O%dczC]k~91'lz"Ve}\ F~8KS<5|@ӠiȒY½sGegoAMb 5 nkl!?ڗyνީoȻ6b!)x!I}@7"C !bzmbоE(EWSyJGo&[}?NN8J](2'shWc9phRd>3:CaኲDz UU;⾇=\Ĩw `iتgP@xȎEQEdolgHp;>TWz皊%֬D W_krn 4OXäiMZTUת<jFW;6&xŦ}}?!xD r \85-qS>+e2H@)N$Yzw?a xf3zXRN^q&*~Ut3T.1Y+,jˬ HˈvUo{ ׿eFM:`___]ݜ:TkxM !ըSã,zx̪Xu`ߦ hG6ƖgC%ݐJ2鎮`x ~>UW zу `8}ܷW7(Z') 6AY0N!S[ endstream endobj 548 0 obj << /Type /Page /Contents 549 0 R /Resources 547 0 R /MediaBox [0 0 612 792] /Parent 540 0 R >> endobj 547 0 obj << /Font << /F33 53 0 R /F8 21 0 R /F35 56 0 R /F38 68 0 R /F29 18 0 R /F28 15 0 R /F30 43 0 R /F32 50 0 R >> /ProcSet [ /PDF /Text ] >> endobj 552 0 obj << /Length 3340 /Filter /FlateDecode >> stream x[KFϯ|Y1w}6Hv=@8>gD@""e{뷪[X DYb뫗︜$W|v}3s4,'=ehfZl>_}͖W竌̾&egFE~5+7{pAA 3K >ʥ%v3OxbU൭0PJ؈v'΀^F le/17U[݁;"o*Sؤ3%Ȍ=#`J*,3Ƭ{y{ >z &5u*&u7sά?೚jTIWxUmLua @F-F[ǮVl1!L$aO,'Zo0Έ[wߔo\J{͘ ¢EUݍ1S=9xF:H<7w^jUt$*1fzHB0Ne$DJ:w zܸO/U#Td/_yz_Pk0 hq5(Qz=B }>"`}~=ᰐDc:C~8#LQ ~xQ3*O~SvƚFaBX]mݺb;qQp EG/BŸs\oم4J& toG ly~X:[pmQ/'Bh)+vZxE -lbW> a.;\z(pH)ZƧO-6,nIm]/ͮsV6Ras?H}nѺghUlZٶ ̘V!kf2{,y؈(J]Γ=8فWg2>cOId`n4D>C1@y" {G]paÝVE'̄3>)էAJ ~&*w }L)OK3;`)&Pq("rI>.Էg~pa/PIs鰬wE3 nnGz0ONiU% 9vv83pr3VԎ~hjcZHB((x N#*4{xO*LJ0w3a3Ef=(jy[v}:m5o~|*aNe z\AL&%֚(ɞK8}Zb#5&cΦ]n<]}HC=\ Tɏ=.s"WwR\16jVZ:Yb9VOMD>W1A3H/*VGTș9əؗ8G*kebT!wၑo9NG pN(O"`3vt$֯DK[sHݖcG`(A0qlgǑˤ X=1I&i1( 2"E}=\#Y{B۲aZ\.4:).x .>c&oc{*Ua~=I%1Þ#%*%ByZy ԇM2 09و33cdf IN8 YV#Lq KX.:-9T , oICMJ0Ѱ?D$Z_ A5e@`ld_piypG@%3NhvZ'y\.B/* u<#l5#X3}V`g |(8 jF_HZ l Hš%gip 3g5/8Ow.S7>'"$lز"!I#!76mzdL B1buRX_2|1lHy<Ӽqa {|s=zk@uV2dz1M,w-*qV;wa =DljmS5z?a*%}= b iN υx8~qPwvɸB͍{F|:MX߃&J305!|]U T\yޟu";\#7̝ƏE9 )(Hk Sa6 +n wi0zHwo@lAyܮ n(5p{ŵ W< 3w@ySݮ쀩;ܖvXSeۈ~Cyz[}'7jh>_"0!'sh/XM_jx/LF]Y@ZUj=g3e0=Y=.̢|넸o'۰S|)48˿s $8` endstream endobj 551 0 obj << /Type /Page /Contents 552 0 R /Resources 550 0 R /MediaBox [0 0 612 792] /Parent 540 0 R >> endobj 550 0 obj << /Font << /F35 56 0 R /F8 21 0 R /F38 68 0 R /F32 50 0 R /F33 53 0 R /F28 15 0 R >> /ProcSet [ /PDF /Text ] >> endobj 555 0 obj << /Length 2686 /Filter /FlateDecode >> stream xYYo~ׯ/a@z]$CԐϐcǒSW󚑽:j:{kСlquH" 3:*Ww~reu!n\3-~y xXM| yێ_ǫ_jEآ&U%wa U4TyȷFʄFr圃eniPT\};mr#Z'*8?*gv\؁ƙJfeqD?y#{ܕyv?^*m?>c ~l{% +U ~1IaFڦ{o?>;%4aWRDS?xEdQ&kTeD:?TĘY@vrCk\KHmp!5nn݊cҞ07-(bMW%ȦFwҲmyȡCijh:~RUY K:̤Rb/oKƴniZxrOd-;(x@yV ?A<7 `(X"+/-d ̑[ q>5ےXG 9~%9ʉE˞W5>xQ KY$}'g"#+3gϹΥeh_ûly1G˯1K5.-t?eTX&Zg._HqU(ڃH !eb<jro|((:Hr], qyȃ?QnXCX5Br-Or)>H)  /84)!@6L{Z4@ A\HLα# 3hNrFEؠ_zx.ݛ!( C*(q&|龂0;NM|wӣӉfNGʆn!0p]EV~nn(ĆK.$i|qY2qqNƕ3c%ʔNS9H]ޟ8jljG!p1 C@l8 ZH>4 $ ? Bc!sdCZ+@)'B`%bU rSv'B8t6 {b̟c R׷+vތ0D*;2tz}A"4摟r&GTXXY>l|-dmKfNu4^2B|n̑#U8Pv DpgsW+aY7향 0=W\#_--~:;GC<E‡)TisUF$}خE-a׷#a)𺧸AFMv9'¶GDpv6!Q<:fJ?o?qɑd4_rL/BBӴ\6L֘NDm C,N kTCP0./ .(+ Q(* FkϗP}idCOAY:M6*% Kk^-MGZ&r7>Q$e|RVl caY5˻OX]+0?dEE. jI9dmP+ ڪs:d>.k/$򕾑Pv†EC;hE@GTŠ^Ҁ|l]')k_Th_d9]x-eq6ڻw"2ҖU%\2$Ē٧fq jZ!]M?*7m:2Wkv\-Sەz#QGf:)©,iɧؓ.YWS.@ p[F#L4釹͆ ̄ BC#e򻲞T|VV֑4J"k*{dHc`iĴHSl}{k W'׭EùsOor0`'|$tɅ?azti B'Oś \(Ѓ< p? H4{ N::O)8ľ63)']l|_i endstream endobj 554 0 obj << /Type /Page /Contents 555 0 R /Resources 553 0 R /MediaBox [0 0 612 792] /Parent 540 0 R >> endobj 553 0 obj << /Font << /F8 21 0 R /F38 68 0 R /F35 56 0 R /F33 53 0 R /F29 18 0 R /F28 15 0 R >> /ProcSet [ /PDF /Text ] >> endobj 558 0 obj << /Length 2739 /Filter /FlateDecode >> stream xZ_ܶOȓx"EId>i6w 8~wjwW[Iwp3 N93 f!aY/ (+-7wͦI[xh)#j(w<J# ]n^t95 {rT`{"{r`0%Y:L]V=g\9c}`p*д³rYWE=kt :e+D$zn)Ȓ!a%CNp}$S[IE.l|m.f8 p:= %) )+$HᬐnlBRG>b䇟Dyqsܬ Q3`aJoRHn@RKNJSfqzDs7EMIGָfRtw>ڊ[Iu׷Ƌ8Gk #J1N**Fݓx"&!95,7B_x"28,b,dy·럯Ay7O"G?n`'֒"1j,՞޾~ڹya@qZ;=ֻ?^)#&l ^2d`SHDX|%<%YaFHAGA0Y Jߴbԯeoq_,YU_ri÷ (uϻnPv_U-{iP/G/H-D!yY9a]Ҟ{[ ڊ68P9F,21LYxT+Zzp2k$F)Mj@#֡Ĥ5v0i@}7WYN-?c#Ss{@aZ$<(L+|$:N(ىh dBs\놓&y2Ce _ʥcvh ֨;laÐqpu.KlV5"3D߁`œ tp;-VfJ*&8 ~H /JN)s |=etu3kuv8MnphNG4͙;ܺsk&aǥVˊ%d~puKdacUe؋0_+&JARf4}Ȍ $* ӧ0cMoM{ V> endobj 556 0 obj << /Font << /F8 21 0 R /F38 68 0 R /F35 56 0 R /F32 50 0 R /F17 9 0 R /F29 18 0 R >> /ProcSet [ /PDF /Text ] >> endobj 562 0 obj << /Length 1519 /Filter /FlateDecode >> stream xY[sF~Ф3ƛrCh4 4 O)FRȒdBo9{%k z}[br^LPxW1"">.i^ac_U;N虚-sHjcr 6]qN06fs6\毱\͸ޖ^O&ͫr^nUV/7 8pYֳ9!W3}gRLO/ܬTwۛJ呾\ꅦFTdoN !>[n'-U+˿aVi~1YT&}svhh66⻍O^Q]o,vlIleۓBrsTkc4(x/ y=vX2ݕ~P.ƑODdl[aB5DUj >zUǡ$\E-&.&X1qA"HOV˷K'{>DһgJX{ br>3c=Ĝq\B#nJ $.S$q`J ]̘Z+Y2iUW{+s*# I 7 (c ~7>?l0T{a~gz8OJ3u0lyVbZՎR(i|gIy㔔KP>J%Β*5Ńz1y.Ki:,xĠI÷?{O YtU}_"oZskP=jw㛴m_kӮ7AGj&|2PM{i)ڽ7z5< r0-:%w7څ&cU_Ƞ㵶p_#gS |\B< endstream endobj 561 0 obj << /Type /Page /Contents 562 0 R /Resources 560 0 R /MediaBox [0 0 612 792] /Parent 559 0 R >> endobj 560 0 obj << /Font << /F38 68 0 R /F35 56 0 R /F32 50 0 R /F8 21 0 R /F11 65 0 R >> /ProcSet [ /PDF /Text ] >> endobj 565 0 obj << /Length 2126 /Filter /FlateDecode >> stream xY[oF~ׯ@@ J>C6)yhMzE*s̐Hic wC~uxLˌ\_,y1!2X}]fgW2DO1u݌vuEsE?OWjͣvwj-hۼo(f/?.uY7+DP+ı\לLk1GMmqxg/H6Ҥqɗ?"^~ \njgj!Xf\[-k}(0L ZXpix T"O)/6q~crLPapRwR<;U5#P:e&}T QEɲ3e'A`5`1ԮIWk$c|G~xܨ8NF坓0l I񗆭L؃Emּ{wŭK6>nQQ*P7/f~yf _"/AE[vh 9bl `R} Cuņ(+8%]#G R;C]S7\b^tr(Jw@!EL{-[/Q;8T$m_䧛A?[AzE?~I4Ku[,8hϤAfA2=uwIJ0c2%K\ FiRAFj4) THIh NRґ5V>b#_F2-k˜ ~\iE0ESu`1Yu{V#3>7EYCgEC7qSnI6{s_? @ t@%p/{4z֋mtdHi= 8zȍЀ"9[+0\f n'Afζ`DxG" m=!y)~Sx wrف+B;^0/-]7k VԶE f;rRhj˾YAeJOq22E]$r*^}rܔv%J6.B&)!1>FM)5D؈O .PIG41;b\"\\ݥh_ C;l]hîvY$O7 ? z+}J?\w_y IhO]Wm^h?U[ ?=;WŷإPsXWرۧf;j<:/k)'Pfxƭa* 2tSb<8ܸ֥i& `{ /ƫq=e jPNТdn"37bS(}Q$L%r;L93D[pǁ4V΂(,x&,]0)0 xzwB x2,xY2Mx8&`I›J'I~z!&{3 h N.Dս,:12pGf+:</=C=P9pLg^w˔)rӊfHzC=ٚNJe:Sv؟~u]~<jw}/N? 1K ta4aoDN1Plz˝#R㣌w18cPY!=Q#%N1J;8@>6Y97~Br{54 'rg^e/2<99ԵAOǸ=yMIoeM'%!}Kw881+y<̚4LlT\x:|Enظ8j[wg1Aƻ}fCm<_wp?Cp e&TzIe5}:^ÙW> endobj 563 0 obj << /Font << /F38 68 0 R /F35 56 0 R /F32 50 0 R /F29 18 0 R /F8 21 0 R >> /ProcSet [ /PDF /Text ] >> endobj 568 0 obj << /Length 1918 /Filter /FlateDecode >> stream xYKo8W>fħDPM ,[qȒWxwdR)%!|t˱&ZRMǁ/|y]S|?<0|D>cC,YG..r?|xGPteGCJ&x{0/-~L[MbJxvy)R+ 0SGvg>4Mg iEOY!7y [o`5إ`aQo3P5Ⲷ`&SI$"54$"(zh3)* %YϹO`>k)B)xςe.YO'HHn邐(yiCu9:.Pcka"\;06DM@ـ.|UDk;iSZ) NT#VB\櫴"xU^ر>c"5nr 4 eUlC@T1o3Z2V{j,C9M=YX %RfC4PfgFV&4p:|mkߝwHv^Z+Ʊ..ӻS`횷j c mmh'JÍJVƌ1M!`qף/:Йȅ-vxbWι3G^ܺ+zky('Rh,G*3CᆯSdݦoO}B!%CXr-ʕA33r@g:Y"{ Z)1C}?4tqjx>nB(6MJ"NV3臨;[Jp 8]Re3iL@hA{c_dufIILm\Oc5j[Ds8+1i! .?}Qƃ\SkQ9hEvϱ@{X}l{ c苃/Q4.ue6ve(*koXf+hu7ʋҭK0b*J:HߏJp QUֵ؁\o6FUGptht;d6[XmZ緶Sbd] qh q*}S\V1Jr,gw+<32{W'r6;lN0/1%f3?wmR[v hc{)073 J)S`֜u'lGۤs޶tw_/+ˁbחFr8QaL&9*Sm6];|:휘y_$0|NݝnA/fPx&jON3h*GL9{cI[d~]c$Xtv^bpd{eo+EI|؞*JO^%]f-~'N!g χk}ByG;RC2Z󁟾\ YiH 4-] sܟ=mH\>Hp@ǂ:bd 1ElLguf(@ tegXnFaHdj@+@ endstream endobj 567 0 obj << /Type /Page /Contents 568 0 R /Resources 566 0 R /MediaBox [0 0 612 792] /Parent 559 0 R >> endobj 566 0 obj << /Font << /F35 56 0 R /F32 50 0 R /F38 68 0 R /F8 21 0 R /F33 53 0 R /F29 18 0 R >> /ProcSet [ /PDF /Text ] >> endobj 571 0 obj << /Length 2340 /Filter /FlateDecode >> stream xYm۸_O\Č"R z/iX_Q [ [%v73R,m6Ŧ+gP߭f/2|u3e: ,x5Ϳe6l\E'P$~OHd譚o. (K!,3JiqQl JV2z3{w7t,e[h[;T#v?:Uˠk)nT3 fnB4PtiLf)#U&D;*VjP.I2Un ~oli-3L#T wBOX g ϱ'-(c,.ho1fةŔv"%lPӛNL3xf몏廮Jd_@F;2nƽbAEh=(<E/`o)Mډhq9h #S3HCxTJ%/_R.L߷[S-gwNv@|ޖ?n7CTT V1>wR%@3l!v}4SS9QeRzj$eHK.9iQvx+,}hGq_\4U(mb8t7?Sj*%#Vۗ'7C+EK/ 6ܴ4wn֩Mnjms(7΍ ͅ_h0lT^\[иSAݪR`t,7|"=> R|B* Ȟpj|( iboQ2_OI6tΧ]Ȉ'y XKݦJoюH FL}j]~=Va|Za:_LiͤVU8KzO m -ɕ* A5 eF=# RnEK=a .PK۱C b]ReJLNub/*\` û4MŌNWB~#dqݷ;4=j`Ǘ5-''n7=٨Gbxy$Nsږ cb?ɱ<6Q6D"u;7ݢA]\d*_»bڅh5(;*PB9"B=VR1>oa-ⷃ=2a \& a{'UxY]a\1kδ~2O@2tܡg`C]9d*瑰7s້s\gL-&Via1氨4B;;s&!~2]3fI0F, 7MƬ7&I yʁxG<LGZ13aC Q_ endstream endobj 570 0 obj << /Type /Page /Contents 571 0 R /Resources 569 0 R /MediaBox [0 0 612 792] /Parent 559 0 R >> endobj 569 0 obj << /Font << /F35 56 0 R /F38 68 0 R /F32 50 0 R /F8 21 0 R /F29 18 0 R /F11 65 0 R >> /ProcSet [ /PDF /Text ] >> endobj 574 0 obj << /Length 2553 /Filter /FlateDecode >> stream xY[o~ׯ+-VcΕdش FmJBRq_sH6lEs=sw|}1;Y'TN/2Jvodbs(v짋GGΥB˸[>.G,EBڑi:͔H?;RV(CXI |5]VVn+Kv㮕6B%pگ6rӞHi2%T,U++%4:kZѢxYk<ÕY[Hy ݡϞ^XE參k_ < nvoxW?d:[dq~ W_TEsm^7(#R+kNmt`(6w kOGo2F.]C/ Y mU mx00LjD[Vyڴo^\"xVS _ynLJbBD/ ]b2tWs8tJ*x[aH}u3J$MBoGRppB Va! )FBޏRtfB 4X@.H;Pd׼xIq"+746<qFbqV$_%LTVvZh{:KVkv(dQ)[IEu=ʆ;a}79QՋ_ߑ|~[an.Q$"r#?cRDu<\ڵأK y&"-ry#SgtTg 0{XpF[ab{,8PMy,*5yw 1LhC`u I-~€cNX-6Δl~Wny]bXfuwe52w׌%ٶhۡi=ksU;n2Eucо1 AYE8Ļ:.FpFc?PM삼oOت*cCP? e:3ՓgǛ8;5M'rC]dQޓ1,`֥ >=_ԍAJ(R'jl6msGB`#ͤ~{> TBl{Q4C^>\3K [WAdzxHM` $ sw:kwF1A%)m6цɝɋ)e8V fk|Lsށ$hLfIB~؀T{䡤xBX>R #Xp脇QNDFe^sWko()sQ>Ṟ],pCZ&`Hd)`~9jB =^B{02:?/1ըy- ?S^yT׼W ];G5q^FR͊ $8x>8,!Xj70qNu8 YpFC@xg\3N$Ka mDdo&Aj,Plj:ITj=~Y5!C}p;;cP$(ڢnR2m>C{?MBXĐl>l-$)4zeko,†+eJ8엁7f`~0O{&ń0%H'l b'3TI\HŹN!mr %`a.6꿘U~#sX<8Iix{_rA*e> endobj 572 0 obj << /Font << /F38 68 0 R /F35 56 0 R /F32 50 0 R /F8 21 0 R /F29 18 0 R /F33 53 0 R >> /ProcSet [ /PDF /Text ] >> endobj 577 0 obj << /Length 2608 /Filter /FlateDecode >> stream xZoFB :DkMs.hѠ-bhhDq.[羘pv7]8; {r=S/R#'ߒE{5I:I)<әU6^Է?m/^WSleWuNQ|.V{~sUٟ zR-iTg*S*"wdR*V*jv3JT{|Kއ}*3Wf\R9m.XD[&(x;m`#A(~)NIð/k; B*2 >e_-0Ԇ:lk~FvgX&O9n% ϕ\j@ >݀E8u3p( lv(ɢd~XUL8%#|Z:2詁QVh:؝40*K,8.m-:]h e">5`bWs$xٮnUk<@5#.6mNFE%ٔ7Hp&}Vu-bZr'Y,k~K[ дNP[p?h!zxݞņmxP8[E-O6r;sRܪDto_bH[8_Xᭋ]x\0J$g\{ a/( 5 !+> ~6ڽƧ:QptBR VŲLvQU&71\ (qڬ3#2ca65}q&a( !29>{:YR{*ku׆\Ara@Y+kJĶݒRRGo06  =YԦ0VP!@P}}E W$)W3cR~b@ƴ#0fhyfIJ4cྰdhaJD*$nZGU&Vg"}zthr36-|@%Z˱d ۊ}EbдErdABy-ͻY* Y_ 1 hR(^}x.M0^R \<#WMQ # jIXPS: G)a僑=9ފ@N+9މiDR90걔;^6 H rD ' j6 ~Ħ2yZQM~YIMJG65~mXi1tĭPYUXR#_^nj:N8C:PzjdcDJ3L9&'ܙs\*1%^F-c1:a|{վ60\krT.CӄflEI_U |Z:+ ReZqQZ 4i:iT+ɹ'h(oQek]%ǚn#u[y 9OAP&c; /l"N8>J}#Iأ'S[MJ+<Itm~~P&I??j/b63y$ !q[Ps+]Ş+ s@XĎm+VjbXI6)llLM(U^ƄMo: `6=eNAyۑghzHnipg] PD^ Y]),wCϾNtCC!JBUީ ZYGf5V8vL[# pbv# VP<9+wV;Rnٜ(G2S{M $Z.F:RrG:N^AeXBܑ${GmfnC2<=,,`^S #:Π6kqڎfC3 'Y@JO} ׄ(xA{=]ȭ4xwfX3uRn>!ή݆p)dz1!nχUT}ө4/X8ԲZj/A.1]^xٿ 調e6"cML!P`g_Mؑg4SxT?\O+A\:CլkHL^AY9_]A]; ѾI♦2Tu`Mo}:O6Zu{xPW.s%Q܈دꣽ,ơ)U- -qvozt ¹ܮkuX&a¾WmƯ9\QA78N:<$|J< endstream endobj 576 0 obj << /Type /Page /Contents 577 0 R /Resources 575 0 R /MediaBox [0 0 612 792] /Parent 578 0 R >> endobj 575 0 obj << /Font << /F33 53 0 R /F8 21 0 R /F38 68 0 R /F35 56 0 R /F32 50 0 R >> /ProcSet [ /PDF /Text ] >> endobj 581 0 obj << /Length 2393 /Filter /FlateDecode >> stream xYmobq!K(kb$m h$$_;3$bi7wÉK 3/jq](X^,f"U״aӮ~z'al`ՂÌK(&XmvO~__,jycq`ZiX\.ޱL1>ŚSB-yÈ)Q+5lp!0fԱi)i%bD&{ ~úi?$ EӔ.= <[CgQqoZQ^X ZGi[Yc;91/wzf1Ϗ[ @cd1(D`'$+7DZ =:|}KlgwE(,32l!/ޥH묙uH|uwM_Λn{sm&?|tDn7\ԒLqAHɮr*Γ"5is0=$=*sQ? " X$Rƒi,"T x8g"LoPAܫ9 H1,RqSmAo-}g~[y|v DWى}> gEb/wy=;#dhY}. ;᫗,A(,JEK ޥFzeܟmɈf$g51axϯB4zR?ʆZ']Kz" qE+`1CTwy6F6f 'o/D}р!.F Ick#V,uMOOSȟ`pȦ2\-j3bQ4X`hZ&/e:b =wg"C[Q9n@hnV0c,A$1")@EcFa>6@PG3ۅrqpIY{QhX 9LAwR[&w\sd E1 U An%#/)&cغY\`өOm:UO5u]E7 3P&!.6z _`Eɫ$# %ۘaۓTzc4tv$|_?JO7kԋ8IBd"DHh|ճ]-VfO (աhku kG05Pt:P4D }A$ٗ~(3p>F ׬Ng1]f Y5.6v:#3,6S4n.K[~c]<9Z˛iA3NT67Lt! g.B$ nʝ@ g` xEbb8u%p]S]F,vd>fp %Ŕyt/P? 0f|&-Pu5vmPpOc<4 I_ jqC"Q |Gex+HK.32gr4/86ȷIRt$F6Fp2{7wy.6Bm@S8D MFClD$lyf5 24Q̾Mdjܑ….BF9FqI`M'ەDIa7URp`0 ̓Sգ&VggCG6d~a :7fպ;i Y ұ_:3 endstream endobj 580 0 obj << /Type /Page /Contents 581 0 R /Resources 579 0 R /MediaBox [0 0 612 792] /Parent 578 0 R >> endobj 579 0 obj << /Font << /F38 68 0 R /F35 56 0 R /F32 50 0 R /F8 21 0 R /F33 53 0 R /F29 18 0 R /F11 65 0 R >> /ProcSet [ /PDF /Text ] >> endobj 584 0 obj << /Length 2225 /Filter /FlateDecode >> stream xY[o~ׯHM8xf 4A"6-V$yE"Z{\8w#}%5+ꖊGtoAPoH_ [^=v}[w(݆'Z0!DF!$`E8=Wh2D5st^R=|i88uQ~lˈ.JP{d>;e^ Zxo;(ZMªɢOxDUQ",RkN}XUiNΌ0ؖ6x)94Wz &f Xj׃ݯ7(mw3 Te7=,n9rCV'K+4XL=~8tu >KЪu։  #8cS:n/1VBE|֫Jo:uLl}eR[rs?Dܶ* ĝW 7KyO1|#ٱ-&ДrC%T fj]i aK,cGc"٣tc+YCn7㢄u cPuu=(źEȺb[ qjU9ü6~ ZB}E$QXtNYs'D~_fϿńcB|1gU=c>#} wa$`KqjY,p5G4ĕ2BDfκ(s6E;ω;[!Ñ]^/&2^'4hnU=B*\0)s>Bgxrp`G7$34.$qi톦LdR u8fm`> endobj 582 0 obj << /Font << /F33 53 0 R /F8 21 0 R /F32 50 0 R /F38 68 0 R /F35 56 0 R >> /ProcSet [ /PDF /Text ] >> endobj 587 0 obj << /Length 1528 /Filter /FlateDecode >> stream xYKoFW0@;$!@{Eݓ* Yv$F/+.i*$f83;77"H ]dkD၄OIvnLtU]_~r9!?$#@g >L0bZe#uv7H+&NhTAWR!SHiyTU߸MxOޣ _ܯiq˧",INt aQ Y>?ݽR 'Ea߿F@!,rjl soךy۵#0+՟ o_# U ŽėוuR6JG DǿbЄ/2n|*K5eeյ{bDyP xPF2t_-UDq6εX`^(zV+{ .xMiP?rofN{tP7`q+hQreA^om/,r8ȸ&X҄kTU5_U_mu%'v,wu1˭31{cjIUu 5؟c̖Qݔuݍ:#e=|ɃnVh=C }WiX_AX e+ʣy6*6"6ڒbor-Ys [i T^WR86!ȸPߔrsi ,AFR$V1E _Y8q+3D>"1 Rs248~[fLcЕu#E2"[>8veUN" ~"0c[;gZ\"aV"vŮݷs7_x{啿ŵ[Ql\P*0%` vVq۵ӕ%ká4KY%"BQn0sr ap4>G̪sxPO@Vu١BNJ endstream endobj 586 0 obj << /Type /Page /Contents 587 0 R /Resources 585 0 R /MediaBox [0 0 612 792] /Parent 578 0 R >> endobj 585 0 obj << /Font << /F35 56 0 R /F38 68 0 R /F32 50 0 R /F8 21 0 R >> /ProcSet [ /PDF /Text ] >> endobj 590 0 obj << /Length 2205 /Filter /FlateDecode >> stream xY[o~ׯʩ' o޶@EH160([TI*\fxi;i @_ssѷ׋Wh,RLHIࢵ~%/WZ(^fA.% UO)(",Aե QDR:H)'#TvW4S2:6dNX mfD^^"r Hh^>]PdaF*2K ]RT d.J!y@y u|M~侦9ssNύ/6S\AkhJJlc.l̩ KGAT@u,mۻ^9y?]csT\E1El}|vq"&^*ͥˆ?-A0Dj>5ZH 2Q[itSLH+c}97M/s p, [mz//ֱ1o Ϸ#15{{1JP/S\7$Lt< 7 ܐbFNv3ׇL T( <5 C!U<FATBș&qEpz*Z`2,׮bAz /dFbf '8p:׎m&4L/4!\C4Szq1Q5NE>e8G&`DHdCe-ߌ^5Vķ]t+ٍf&`z`M*R=D/s\̷g02:z zD?JSl1?O)al V}ˣv1yT,6N8 MyȘCXkI$̞M5^LqDh ?3p̡i7WWogkwbƈq& u&Aę)3)ԬybË?^dGuK4`u]"ZL*%LD& cJm ,|#hoIn endstream endobj 589 0 obj << /Type /Page /Contents 590 0 R /Resources 588 0 R /MediaBox [0 0 612 792] /Parent 578 0 R >> endobj 588 0 obj << /Font << /F35 56 0 R /F32 50 0 R /F38 68 0 R /F8 21 0 R /F11 65 0 R /F29 18 0 R /F33 53 0 R >> /ProcSet [ /PDF /Text ] >> endobj 593 0 obj << /Length 2577 /Filter /FlateDecode >> stream xZ[oܶ~X]wNN7'EQM h<ȻB{V3ËD,E7á8?:L%$㓌ZB%/Oϯ\H5ʰֽh5õEΆc(Nⱎ'c cByD2=D V `Ay`U.cg~ O0OϪ$ ݨ{%%!Ml߉ >@ ̉|- J#LÜ݇1y ֥S()eejY?E!3 益I}P+{\y!Wpy"R>sz੢Iyݐ~jD޸2d Fx+p~vؾ)<;ݬsG n| =)l#q/KhDn˟ڼ8_M]-es9rX0'?W:d4V" endstream endobj 592 0 obj << /Type /Page /Contents 593 0 R /Resources 591 0 R /MediaBox [0 0 612 792] /Parent 578 0 R >> endobj 591 0 obj << /Font << /F8 21 0 R /F35 56 0 R /F38 68 0 R /F32 50 0 R /F11 65 0 R /F29 18 0 R /F33 53 0 R >> /ProcSet [ /PDF /Text ] >> endobj 596 0 obj << /Length 2200 /Filter /FlateDecode >> stream xZKoQD%;dbI`dIЭJ:>U,Զ}MQ%cXw7msr\~NHLXxrY^|Z LZrƱaӲ[6g{n$|vzlv$\Rxz΄I /9W](7$ߕ0gx+48Ȗ&FSuV6\d6n_/O$iBfC-γm D J稉vېLZP:C +%M(?Oٮ]9[m0a -X70j/t?ʆoqx#xvMDS}yh}@ tv C)=&X(9sZWbdBhs91@G{v%.B,F?W0/^|w౒V ]݉+ɸщ.+~iA<33yLIsLE>ɢ]C:jPJ3:I mfeSe2O3[P8V^\;ZVp!ӷ ~jO(35 I4l]ƸWhzgx} Bvפbž(a3xpe @VPc󍆥1U&ávd),vt恜# 9OeB9P}(0ު9'Ӝp{5'%۫mkݹ K)Tx-kleN͌;Ɣ=LW&xΦQix4cABiQEcMW1 i"&[IŰ/įƱoɁ~gT[w)P{|o=$<;ӚēUœxRr"XSB1WHeB=d"X/;T,B/>NBk朄6SapiX ^p9> endobj 594 0 obj << /Font << /F8 21 0 R /F28 15 0 R /F33 53 0 R /F35 56 0 R /F38 68 0 R /F32 50 0 R >> /ProcSet [ /PDF /Text ] >> endobj 600 0 obj << /Length 2035 /Filter /FlateDecode >> stream xZK7+|HAldGZWTr9%9€I-aqoO%̓.oj9l!VOO7dX-Ef-rj ,>Nظɟj$"(R`O4c91fߣ|DGkYGXc÷ѯkVp ,L dӖ%?Kehv =]i"ύlǬ"aV\rCBߤ] T@i8IVCfd̍mKC׶z~E;#qX ?XNY_Ic${WwN/庑'$hp ]vV 脾_ߠD?.獓WF+Դe_L )TF1J,Ep•ZaEo] 1F!;*bo&`@0bf3vGDȱ%BAT(2A$*%E/ Ғk +X\à`5-~) pʈ*rN%k? V>J>0:a JN$ף;"K#N_($HZ/9|^8_ (RTnV9lsLЙH9!D'[WXbJKi,\u^9B+‘VV_D+*ub␊|r/$[ F~I%`,YDn0K٧L!; C,4: h6|<[j>C 8,Whv@,l[Sy@9.2`|!p!̏l(Np8b\[e?a\䎚&梔Od^@XygFKZHL2,/V~j+qpKJL\. 0 nI\aX'Zs_a12RqЏ{q6:'3@5P -y0U|'= ݍXigAMZ{vX1U=#jTn&xZ%ە KĉR)iOrWۮ"P 6̆c08M?1S#Wu\.K*;rxhuP֏`wSسjWgA[U-~3Ó:uTo]Uu"\W*% r[Ͻh8n[ow8g_|MsM3"lNWW7^ݻ4g9oF~/4U5m',iS endstream endobj 599 0 obj << /Type /Page /Contents 600 0 R /Resources 598 0 R /MediaBox [0 0 612 792] /Parent 597 0 R >> endobj 598 0 obj << /Font << /F38 68 0 R /F35 56 0 R /F32 50 0 R /F8 21 0 R /F33 53 0 R >> /ProcSet [ /PDF /Text ] >> endobj 603 0 obj << /Length 2335 /Filter /FlateDecode >> stream xZKoFW9,Ef)9;Y.@Kͅ^I~!Rq`_L,V]UUU?\:+XadvuVf6/XxvevSg3Yug8^8LI²ܙl:/,~:˙,\VgggjTi&7Xnju٬|`]S>UƏu9nt&ԫf TgݦZpryj5(.t3t&O^ *Ŵ1zL+у_߯aнģѕc={jK/ac{_z%ER 2HvppXEbN{p&+9uAPU႕\ YPzsf$9;'Z _yꮊt-,Ym7w|?&i. mC-;(0_s ŜPQl]at Hq8>S7 XU⪤kQ6 6ẁ!\\ נ|ը915i7@}Q#Km deZFN- 4!.)&.??u 9 ?bjU!0=Ln_|z/gparT#pL;u+[\b]Qxk0|MOCkZq"r\KП g}R`?{OYWSRŅOG69 (nAE9-rQkoNTw7a-i%:aIxF֘b4XPa̾^)U>?#Α"KvAd0Dг}ŅJ͋{ٯ~}x޾ C#-AR' aPgziABܠx9u9XLƕdj=j@߼hC߮PP:xE)(ܶKn}z3c Կ`'3Ty~E34s"N9O.F\^6@܂J2qE콵k;xF&߮J2~տW#&Sv& R}1UFZ*>GiȖl٠9xceQ6ňߠԴЍ$e<6Cޜn$&_ulB4_H7z9e3иP)3]u {Idc+{d^@`GU1Hָwc%ǒh/YK%)V+OX9 4NX[b;p$R[\s4&?#+sd?y8ȉG)GrISLCIK⃂籄/$w T0MQLy@fcq*I9Ls+#&%mi줚Hb- ewf Sz?/agrgRm;vCRqL x>ȪkIrCk&kD(|б##LڴRXT endstream endobj 602 0 obj << /Type /Page /Contents 603 0 R /Resources 601 0 R /MediaBox [0 0 612 792] /Parent 597 0 R >> endobj 601 0 obj << /Font << /F35 56 0 R /F33 53 0 R /F8 21 0 R /F38 68 0 R /F28 15 0 R /F32 50 0 R >> /ProcSet [ /PDF /Text ] >> endobj 606 0 obj << /Length 2200 /Filter /FlateDecode >> stream xYK6W5b].;ͨ*MrZIjƓ_~$(r{_ui'XֈLDk7ucOM}RȤ`$ФHD*SڒZxzˮ>ڢ 7ܝVW7pC@3ɛ"-(n3xQ :ZpcCh{ȧTR(Λ^T)͛b{KhW3+$zT PwТSbyHx2uX+pf6O\jԐJƔz^*QW( 뚜u-%> <u=Qқ26W g#46O(ؒAkZ2r^bgL{+/s0&#@qLqyd0ZjAHF%+ol""B F12 \f8#[!eP {Ƹ?E4ىQ'ȶ]ŞzGS3N7b MLz:{3n=}&>G8Z}O+ZNg@͢ǑcUۅw)RSr(0Z_~s]^K|B&P"=*׋oϰXKX[T*:)/߰3noҲ!KU^9&:#\w &77SAӡE:7VMneBL6۠΃ɛ&( A 3Q*62PAE#Nl*`T2tmp/Uȃq)z48O]B4tz1;QOk3j(noST=B 8Qq\G_额 w3n"> sXC¹N(UKkB&BX7zCwiQjfXu f3'JlFg^cpoAJ {Ɏ>+=$C-}[-9*# "9_/r a0n3v+dXE 8Yփc>}t2j% Lˁ ծ֋gPV2$> endobj 604 0 obj << /Font << /F28 15 0 R /F8 21 0 R /F35 56 0 R /F38 68 0 R /F32 50 0 R >> /ProcSet [ /PDF /Text ] >> endobj 609 0 obj << /Length 1687 /Filter /FlateDecode >> stream xXnF}W*JENvMZ)&yLrߙHH1)̼!r5{\s1XȈIdnP;&!=jLfGdQ1پ g|}]1u y<Beo5GK#|feVF!D y€߼Yf׫鄣):[M%Ï x7]_@4';AF{'%`,קp[1hcw-`k*tҺ &h D%ͧf?:DClӾ|ˡ2sb,,KGX(Bg>XSRY<'^*\&i*Nī^\izBzXdR)ɒ' w^ O'Z;ډjщ6(D;w1SΧ;p}-^Axv ~kS*g}ՍfT%\:M)s2ɕ &fO p9yjVKeN&KxHTڙP,^kN3 Ye ^؈@]녗]׭: ,xe#T9HX ћ*@"U$-nvm.l׼{Z.5z| 34>Q?e|e5_BLϗ|Y%v|Ve|YΗ7KφnՏ0+`&L-#f/O UN)iS&N&,R &5[\ :NfYoNƦ#kB*懩R16IR.̛Ƃ4oV%?t]^`&)rsssfgzTcEنͨEFfk/[do߿y5*r:K &HKqI,2 gCPn1t  _;EջO,[n5Ӂ endstream endobj 608 0 obj << /Type /Page /Contents 609 0 R /Resources 607 0 R /MediaBox [0 0 612 792] /Parent 597 0 R >> endobj 607 0 obj << /Font << /F38 68 0 R /F35 56 0 R /F33 53 0 R /F32 50 0 R /F8 21 0 R >> /ProcSet [ /PDF /Text ] >> endobj 612 0 obj << /Length 2183 /Filter /FlateDecode >> stream xYY6~ׯP/1kvgțTyIΈTHΕ_h"E2"@FzqVK؋e(3O:qV.w8psfŝ~QT+WFI _:o(o,4d3Z j%h*:\.wo>1I^m KtU=2~#%Z_@'׼B02j\쏏۔CV9_8Yauĉ1=#C80+wvy)d+~tCzhUNoUWCR,dl Ajxm @\+ٿLw.umus]]Q&np""ZmN'HBSWz!ONzAHl,y]dmUXU^Y;% p(@fv})1۱CRObtYg {dv.gD?.:l7+zy)E7@ h֦0.򓦚=J 8"B_ߖە ߹lUճμʱ@DN~!_y7uwAbجj,n2iPuin8l> endobj 610 0 obj << /Font << /F29 18 0 R /F8 21 0 R /F38 68 0 R /F35 56 0 R /F32 50 0 R /F33 53 0 R >> /ProcSet [ /PDF /Text ] >> endobj 615 0 obj << /Length 2413 /Filter /FlateDecode >> stream xZs۸_FEN{3N?$\KozDۚHU],@&-ɋIb? hv.8ei"Ǘc8\MX clOL%,Mu-Nb΋g-_o<{_Mhgv i)"a0=9-Oi'4eC7NV:oQżFNmf׎F72\5qVg'Nm`EyO&7yYHOlY+b9?NN1R2RKj^Ο&0-!E3^\ɕ[{ }qn|("$͢@↬+Ge,I8 * 2o[>qKb4c<76'S+'8ڌNĒ(w*8{M/N#>$ʢ#[z3gٸ\Pu ‹eBCB* ZbQoKJM"ή(ݲvq"&ġM_ չWcb'TZ@Mۺޜfп6gnop2r* j}W?Nf^pe%o|fe1`IV!3!g,8S‚^uO˵{da1F@KAM$xNc4 ~ܭW됟!!5~~EӃ>k:h(!do8j2+XؘYs[ѨOu9~<u@'`_ߋDCNK+JPQO"u__4M6Ry<53$c"πRw( *\[6=R+2\hp>=Ru)#6R2 7M˷ͭG*AwtzPF fÊrE^[_`i.Faz.辸rJn(R2Wg-WuCg$=Br Jdža\%!xE-f+<<и.dK,Acdi$BAfItXNQ!7@Pi5Fs!JwyS`8 e7|kP+cIx2,yE-f2fÍeJcvhAT?q<dx}mkuQs ̤ yE-f2͆(/wdЮz,Q$J.P W(?A'4fb . u˝WOњFt2/摌h@B~FWbwE(!@lH-uqt-RH>ql>;4sw鋼Ζ!!kczB]]BOA"5ZxE-f,afC,C> endobj 613 0 obj << /Font << /F33 53 0 R /F8 21 0 R /F35 56 0 R /F38 68 0 R /F32 50 0 R /F28 15 0 R >> /ProcSet [ /PDF /Text ] >> endobj 619 0 obj << /Length 3942 /Filter /FlateDecode >> stream x[Ys6~P%C\$dSlڤ&cy%z,94A1&3"Aٍn^=Bۙ.׳sBzVdNdF.V/ 9U9}WZjR8kuu|&PJ2r9|g}~q&q63+J9]!2-o8l:f_eBr3!ݜt6g/ξ"!2{Q{P25+)Q9) 0.3Xjv:],Z/H-'jKN)YVc&=߁זUn[h!ܵ%vb(M1bm)Om0Q' cFS/J=RLjPg)`^s@0RN4"\.9|)3J V}9_hIO ʂK=1n-TW N 'qMq Se!tićO7jXՇ*h_4 {J<UJ /^i(ڱS8x 'ql%8fZ؀k#TwVS5sQ*apʮI\0xAE m"Ok!()MnwE' $l2q.\s. !S5IlʔF2x.G\tM`އ̒aK,iʼ/0@O3KhڜP!G:!<*$! (c&@4, * [TA5-HK&V4<mƲ;[/Π0qKn1>$ 3"!ַa 3V^I;{xP񺰼>6q[o%(%- ai`60_2:`ޒ/l?p,pdNߞ`)֨J̄:t{+ʲ7Ok7׀^:x]zXB ېd~C+/KPBQ=~[L2~9Ql;dn{@* ЛC"&y?"wO㿁|&WS5`z QNQr"(fCy/.ha+\\ܴ=\)-w!6kHoz˿?MZcoɁkr/KQJ((l\jx`h,X l!;:qLj?+dJ#*Y_0EBl )A=\Ix dtKF8j!S4 Hn| -n–YkSh&UjP8MK.@ϗuιp%&a +9/xm>Ֆokߴ`b"V{~Jqܿ2<\_Պ|ojO ?!Bopun=a- ٮw"@~(piTTAW=/>5quҼFQV\ ^Č=.{Z@. ?8UM4 1@vw{RcãRR0QHH۾ lBbRj98/u]XE`'E|<wJ\^gAg> 7q xL:8ś/]oC<“bZ߻~sDD ?_|$jyqxG=yZ վ:Vu^bY\cX/~hAo ˵jVԂM uP@պpxq,f`94PY`fd<+QCJcXtn#LdZ*̀VsY$֩t9~WLy5Tu7Crt6TF>oLK'K5@K8+=e9~2Õ:u0a:5>2}0rsMC! lʃM='z[A716m45JC(.W.hK_7f\ϘkWWDžt;.{3uR#^þQ=bM"uFDmp:pH^y/!e>̞@6?>h>g 󷍧cc#2=+1 {%@K+ Uؼ;"Xk2o(Bu1$Ҕiˡ+/PC6F#!y۷BUrфVOÅYn־2…Rz~ѡ`3NWq*u"!> ?"3jjiw1PZDR}ka#c7Ixxs(]&kvmyih5mC1x4KZp5)IXXsHQ?h -q-D#oW'1P\=衞; oogO@Bn7>eZv"!_(daH17aW:[ Xغl߷͕(:.l-a3tGLyqH!Z6gV]IwN>} Q?WS~ '4_Yٻ mHC*xjOܲ[!ٸ ";vHY:Si#aq'%a{I-ZZ>5AI?(ت;Oj;:.@vxsm}=xG^ !CJN:T|[oyUHU{$]в> _n_F햇b;d'OaTb1ܴ'+D&2G7}Q4rMI38u܊w]hxFLJ~1]U{l"}24J< ^kޗ d0a}وvO.7U͕&K6`nRxÓ,ET/6"4fӋŗL*V͸[[ʗ,;-WO@Z3V96m<фj܌YZs%3@9Tڶ4dEyo` |fêSM7OiyoDL)N5pn~V;Z$JasxVNĠ5 ͺ he h6>vJ` g 1EgtDk^|ϫȳJLC BQ_zO/;! uԶׇOI_gD\d6 G*=@СItXM:dadY"|&FJlLp3RMVX\^-.w}jډ2BҏɽǸ1QE*ʒR/X_ endstream endobj 618 0 obj << /Type /Page /Contents 619 0 R /Resources 617 0 R /MediaBox [0 0 612 792] /Parent 616 0 R >> endobj 617 0 obj << /Font << /F35 56 0 R /F38 68 0 R /F32 50 0 R /F8 21 0 R /F11 65 0 R >> /ProcSet [ /PDF /Text ] >> endobj 622 0 obj << /Length 3522 /Filter /FlateDecode >> stream xَ}BC}Y8@ {ק)R8"q^FYK;a8&w':B%ͿMۂM׷bZ f{[p3mbZr;=߮\;_K?=aQ[|\2o 7^Z|XƯuxix7 .vZÝ'tR0At!oKo {Xz|`uPG\+Ri)r__/e!U\=eZW7#UUkDv}wfqI ;y %p3#7w-~qQ֞FQVF1NmOFQog$r_z~ Kw b~@VQfו w:M'X . gWf-#Nluw?ND8;ה0&Nu͛7Ȁ}c&)%\惈ho_]Ww#Hi CLv8.K )O f',A+m'Zi"% V밄 F AvUPjAP HFXjMh#{(pF'Mz> y᳸5+P؋(3L;4AY^we 4#Df4&Q  3<W~Yt|aDH}GBI"~*ʁ(?/?Y Q` *1(i[2KGS.et ;Xf/h!)#Ե@ K L;6XE71T7$8kx<^c*S.-ZtP}CL1\?$}&t)2`gCWZs!tטkrڡIbmIÈ0_qP"|uH.nmtb/thf5`¶07ܴ͗%܈qpqMp[Y/(p@YlP9r7;,?fV/ptiߘZ,ͼw޴ˎ:*pʎ_ dWb,~vޅ5\x‡(K.<׻hDE^fiP͍ߢ۝#*9S`F_Mb$=;q%Qwe# O M 2ąd\(іs4߾zubxhe뫸WpԳ @uuk>ZP-١.ӿ-g^vi %34>T2=Q yu:`D]5;5h#6 9G Ϭi rI$Xè*K,koS>*I.ڪQ` G: 1AhjGK TTqaOUlFRCOmTFgFAxh瞅iDZrܷ?p2Gc 0 -m)*FA-M69­o+BADODc[y4!fKFڣ7nkcT4l0(zgvg=?#?ǹJŧ\3|:״f7V>fc+[?vb\TPl XO#4.o9q9V'xYŶck^1.]B7+h"*Xux%oӁf! =7Hу*2X='e߻*@8Pi4U@/)ykW$e] RڴˇoPn@ɢ8 v/MwvjA=# hC_]l"Y6 ~ )c0800eze.nٻ`, )8nIr/ v&Y|\ ŀXm̨qBdD-?Pnp"fIQ0kP|a=H~2/ !gXsYiF(PS8d3>n$(xYps =Λh1 pϠX 5O yڷZk8e¼Wp,|$oP*{l=S˚b9He=Eh"mX{y+Ww̕sx"k鈖jvN̕ V 2xA1Jt3̟0_5z!c}!xdKߺ{S 0O+qwg\t ><>.uS\]6[ю>O-ak7ćU`+Wۘ#! .cfl9?u9d)\? c9}Zay9m÷Gw:b@oJa/5IHj~QjǶc5٭$p8a#S6#5ٙ羶mS| YzKHHp1Sw8Yj]hF+ftkv4jD$]Y9|GN,bu V9(o>x8A0D㐌m#C4g-!L+P>\, YW X X U"-_/ƘgCӛF4MӉ`3+*4 2rW X[Hkm'3AA=yѽ I"lSvGXEKǛ]))7z0zq~5ǯOף"kf4/QZ'+rQ54Z**ktCOm[-ezF{#> q c,a*h)" ?t endstream endobj 621 0 obj << /Type /Page /Contents 622 0 R /Resources 620 0 R /MediaBox [0 0 612 792] /Parent 616 0 R >> endobj 620 0 obj << /Font << /F8 21 0 R /F35 56 0 R /F38 68 0 R /F33 53 0 R /F32 50 0 R >> /ProcSet [ /PDF /Text ] >> endobj 625 0 obj << /Length 2500 /Filter /FlateDecode >> stream xYYsF~`!KnsU%;riS^YbJ-`Pǿ@]Rm^! -&'xrHaY*ztY0`~^@??|5? \#zH0=Wzj^nʎW(@)+rE`i%=8ό]0FiҀS` rYUi<Ӹd4.(4PE!O`źLs/qq"#f4J]ni SO 'S _ew9&]s A/I/2lH(@zl۱m:^S{|Ruv"@%PD# B?)*~$ؓR:)Ċ yl~uP@#[R 1O  ,W+]8c^oZ瀎DLnγ©Q뫖lȘ6I5O`\B؆Scxy>AK"5&žCH"eZÏC#A"V*ggo/afg܀Y|r]i -c[[|]b׸mp:]DvzNvuiQ IQ`HRFŀy(cG) =+e|p{2veȗ `P0AK,H܁{3p)5xI`m-3|8he4ߩЛXEXAF|*!bG,h"3Bհ==p&pPUi3aEnA4,/rL=`fm!fSX;OT o߅&W _.ʦӲ0p(utI^rU!{(QAjZ'uCP>tBAJ#TB+PY]^G T20T̄>E.+jhoh?CQJ&lTtG\as:&dqaS :ʆ0X"@8`BcaTlװeNZ+ wEC&!pH!<|=9D+NM;#Kw[ȤOonSS΄nr1o _y&&{,U|Y~z'ݻ%mE AvD[KAoZ,/wc 8ގ "q<6 [ ^eML/{=k]$4'7=oyXصo!hq Ze_!#(=a2PǰoHTk/[|68׵? :rjannrjHGR%WY<k:JxH;tAofWOCYVkOVqRV1a-_ቬ X_+ͦ;k.}4OcvرqJB+1#ބ='m@9^a٘mT#WiAcTjejn-uCϽ~Mf@ ɂcOQ(L?]BHlH^8};Yqm=2U|2Zl_!}wmQy/̳:7/yq!Q'_yWC8y`@zBg=>>]꾾([ޜ k/풜Z%[gJyguP˹ IujC'1g N={UmJh9FAIQ> endobj 623 0 obj << /Font << /F28 15 0 R /F8 21 0 R /F35 56 0 R /F38 68 0 R /F32 50 0 R /F11 65 0 R /F33 53 0 R >> /ProcSet [ /PDF /Text ] >> endobj 628 0 obj << /Length 2662 /Filter /FlateDecode >> stream xZs_C f# gbO:[uf<@$$r  Jv~<[Ng~*sxs([l2>AeoݷžޚD͓#eaUj7b[/k ߭NtuU‡σAWghTьϸHә8K5-gk4[E"&tv,m>ggB+1=@s%gZ'~A#?[ӟPZ" *ԡ-lLp<%֦sn&oq0XCK&w—Xmg)fSP7>#B%5D ~HժȜR& tRN y҃WJ|XM{f{GP < n"r'ۇۼ*N*_"45.Z:OЩ8eSTD,|;/ъw;HFv>X H5Ng%' i[lZŠVZA7úͬүwzg' B\Oc#|Op*`w88i0'Yw얖)Nμ_ xre}'hNNj(|O}Yg}$ Q߱ ;^ȯqˡp?~x=nd.חf~qz,]sh s۸ \ 0ɨ;հ"^<a+HO~k4fävc X*[.֦b8b>qD/H tl_4-/o/7[{? [ Sںji/\vA˲I3p ʔ%PѸbP`=yƸ*Xye>х SR>w¡v {NO"Nv$?hwC=wGLAh3 &S .3w=bϦAINqṔäP2GQ)Fw>Gr u(z|,`0%x-(!Fj 썬&qqy~lxKWmQ;`6NOw3(OҀu-;ulpeOE|B9Ty=]sAA>H/Y}0;}6-|1|D3(_FGYy endstream endobj 627 0 obj << /Type /Page /Contents 628 0 R /Resources 626 0 R /MediaBox [0 0 612 792] /Parent 616 0 R >> endobj 626 0 obj << /Font << /F8 21 0 R /F35 56 0 R /F33 53 0 R /F38 68 0 R /F32 50 0 R >> /ProcSet [ /PDF /Text ] >> endobj 631 0 obj << /Length 1382 /Filter /FlateDecode >> stream xڭWK6W(1-zEMAdimTY^ EWcl}Aa/69q8[r'[m<*^"ZX,o>o/Uo^ͥyҨά/i!.-&OUnUc-ޫ̓Q*%s ԓLew\hC ;V淴34 "sD: -hk%X*o>D 05߰R,VSt܁yZ1 @;H*AHcg4Xtز?C_8D $fe5QY".j5lnxG-LXhYJϱ9:L>X]߀iǺ}uX7rݣ ZFn9횅xZtXB6bdװ3#7Ao`芁Oسh-(4}⑬#YV.n=s'vq>n:u5:+\$^N r&E> ~o#|z %bGؒBt eNYjp=hģ0|QG1lN׳Jkn[9 cGGnk h# UcYs42JB R& q^]Ѻg)҃iLࠇd=8,)1p b(\>KvP\Y@_U" hE\B ͆pNj 60[V@,T&)vo6&1"кox/.T͡Y3S_,gw m52xh}TB\A\I> endobj 629 0 obj << /Font << /F33 53 0 R /F28 15 0 R /F8 21 0 R /F35 56 0 R >> /ProcSet [ /PDF /Text ] >> endobj 634 0 obj << /Length 4851 /Filter /FlateDecode >> stream x\ܶŖ?ͪ4 :TTQ"KN|μn_?rwTlnt7+/3'/R(/,E.ry]"tp Y ^]t<ų,EYYfzًmlq5nyבt 3@(DRI?nDX6*h#Vm;F.M&re"+Qr|5O14ZPc\y~l4܉ҘuFpYy&s  mwvdJaj2 s ]!\ W(b9ⶺrg"˭f +fOWΌuewuh~ 8>ײ0\ߢcf7wpYV;[_;nBAy@5BjXɊgm~ΤgrUi7&j[]'C0d H7 A)n>"ڿ}cks0SQ\͍'#'= =ְx-IG3B"R ,0lpL9{WO_2o7$8y6n^"xέGY/*mi,-v{f,`͚|o+w6/Ȳˊw2Um6[RM7ꞛ4~z~k]g?p_q5Ӧ餇Q|ȺoOu>1(46󚚶`PSRU> o.WyO:/IbL^O'U^|v%biY/b,#;u V&أJT拾9s͒쑙ֵMq)@*OKk*w0Hg$/˳A4WfXz<\`a߽}|^mw6q,`S&? P:fV8kGk ꈝ^|סs+%E{^ay7#@8(Q*`a̓W2yyZFϯ_ a󴦁9 +a<=&.H̵aұ)1ޅ59`ZL .ӚV0I}i`3RgAhM2K~T[|cfNU{'m?7qX^/0%[O;޼Eؚ=&?DdYclKvH?Ufrnw'|kjI{߰ӑ#L[P1[c{W< l[/qwv01(`F {M^.ZoA ߆yT[{&,RzH= OTR 9 [󴦁噀KdCYx)Y0dǛa[wJڭĆ 7 Yk+_˸XcC҅P OJ I^*u,>tQK7e[? vUCfO ]VX&v1* o"CѨa0.uaeB֊705eq1IS/q?o!sdI>$%{x^-1.-~y 6Y*)~┆0 ~)8y΍2gg16X7$.i_ 뤿өV!'n=+Y5"Ν¾ݮ|bԿw Hlog?|W-] R nb\S5[x߮sf>Ģ?C(Ұ|ݑAG!quG@v W];5xnd؊|*\yms\1;])glM'<#Asɉ#M)t,)t?<9g?ڊ?ZRM6"{}N$W?\!(J}C&c>ϋkKK3ȍv5O d\;Do2c+̦e,0}Oo W-}7R_U^\vn*2}|hC ?iPQt3"Ծ2LҺC_F[saW@ >CKBT勑?'N?07d,Y=y|XJ#Tizr]sޯҢp%w+o+Ao:T8V\JY򣮬pA1tb'>qZ֨zTNWNsim0vZRM 8P"!rF48/MIz!9 m 덲ᏯƆy]PHMXFR)r|K1yBl$Vlj*7IQd,Ih ~"/e[ZӟTDY̺<mƔe狣וʈ''+fg -M;p&UvkuH9{/8O* 95eIH,MRmU_|J~UC5oX**Z9Cuk\OT_Hs">'ju54fSK6hmx&4+qզ 45R>C h# oˡ:fN0N9dw+υEnoЧ[u۬7T=nz F8&<\R* y?]r-NIZxHB_". z}"@g-|1@A&5~ΤcMiJSp\g [F EY[2݃ZmS#377,DA%Vq6uFԔ2J2r1kc(c!>)Ѳ Wͦ& Qepg6rxLK݃0({PL c$w>uxsJ4?abC8 ;P""ImHvǭ-=!m)Bw#yRB {OfRn " P=,J1XUzWR`B zĢ18GRpP^H1S)٥=֐ZX~·f Hr"H|J(O$kŠⱡj86VC) G+xY(V;'3/27p֣$~+I$Bv:<#Y%sSfv߱\0E?uR ^˼\ZVDE8dY%?CXM+=jd2 <@UHB]f=~TXi?NLݓg#)ѼxLEV =.& -ICSiT`σӚƦ`e-?򥃁 OGd:*W|+s!{zB^0҉Q482 l|#oy_*°tvs[HZxM xF}ҭٴ0,y% t䄒b1ÂԜG;bܷ1?(S؂'N<> endobj 632 0 obj << /Font << /F29 18 0 R /F38 68 0 R /F35 56 0 R /F8 21 0 R /F33 53 0 R >> /ProcSet [ /PDF /Text ] >> endobj 638 0 obj << /Length 3014 /Filter /FlateDecode >> stream xZk6>藵#$*Y}EӝfE[,4fֶiQED]]>//.v4ֳY Y"2rvy~(ů]|}}!g3)[.hf]DBnבi:](m/\Q e_J >|zM<ؼil:{vpq$T,ku#׿D6Ŗgzb9ݫ]v=ZHڷoaOǯ֙?V_9%uMsVhz|3 ?%׌ 5>ċvzHbEGT-u,t nAZ*f.LWݲŪ}6ҝLJ5~j-Z T4[*=$ 656D#vE${zE~W _|ZYK?|?/nI짧kRd'ZH~yeGyYaLtVv;f#N|,b6BKolX>4bОGwCLz/5=ސYڄ2ȓnjMʤkmُyҵ&  e&94U׍R &j\ ∺(b̯Ce)d~r( w`7Xn:V4)̶D{zFxPMy;LFRHTU7&YhQ-[1 X!M)IR՛( @>6ؚU xI Ax\IABq! DK;̾ F{&8\4vV|b2_`3?@|=Ut,WdA,1. ÃxТ.XF ;_0@u<LKzbW ٘EHГ&e "e啅haK몸cM[@a Q m; =FIU4J $z3]Aa(ڪ֡}%7!J./pj]g>Z& GѬ|Yd5QД7(iQAkq N( Zl!T'%"@wE=*X3!|WFŠyީY0CldK`nB6X5T!f_Ҭ6!׮}5yEFvGW4]34Îh+~;qDS0)oHJZ")L` ҉0񯎤 W4)[ k "d#vCLTJ_ .<0S8Q*?3*rj>qeGHR4N~;.3@~\S8V9)~{u/8#OsyZC9nBŜAE9!k?^cW&p\}\Swۗ1mYAEhlPQ9{Q8M5 ^\}}GyD,bP t*PxϿ6闦Au&8f2OߠoJEv h̍{UeGوeH[enؼilka<༮ipΒEu}i2PPҶ1 ͙NfD0LW59/&T;!/FXײlӫ?!m vzX^4,ᮇ% pwKRo1'Dž($8?j)Vy}$B)d$IiGi(>6Kc<e>z8 },1wA?da]ˎYR:2843껑nb C=ᬍ )$n[|﫵i9)בblr`䰇ZWr|8Rk | Q /^˾R@ϰi|][_ -*R]oS-ߠs8/XN{e7yx ORVmnHxP4t^.8:FӇhRBP@XDO~_wbL=5kkEzƏƇ0R;fh޴jNm방wRV1a pbl͍1k*Yi?N Owq0R1*f̽) ;K&kQ6 '"d&RFhgƪQ u80rP8ơϰ2MgȊ=+>l2!ZcZ_6jS[o\'U 1f΅N endstream endobj 637 0 obj << /Type /Page /Contents 638 0 R /Resources 636 0 R /MediaBox [0 0 612 792] /Parent 635 0 R >> endobj 636 0 obj << /Font << /F35 56 0 R /F33 53 0 R /F38 68 0 R /F8 21 0 R /F32 50 0 R /F29 18 0 R >> /ProcSet [ /PDF /Text ] >> endobj 641 0 obj << /Length 2616 /Filter /FlateDecode >> stream xڵZYsF~ׯUc0%Zc;UI%{Dz2pЎ뷏 -QʃD`{zO*I)bkgW׳PB?4s 5_H{TY9+n /-aPÿtdS܁Ͽǧ{3kJs-5Nzj>t\~yE'#lP1 +HXDEKл5O/xQz6:iew<}C5[9{j|a`7MZq.V#H] Kx(2:"!2/U[\؄2 ZM״HǧբV[g OFA:g6J ~҇&&ћ* ,TlYv3TMo+n_HDiLnɼ;PFzW)KS@uF}`rxVv˿`ayږN5:-n耣5PQWnxZ <\mNnR27l>Il?F`1ZLk5l*6hZZ; hvv 1+:E0RCB˖MnsGD&:"L@r]#MFL Ma2`M%,z2,۝s$g5}ſwsVNBsFk'W,qkPP$+nqCmoh,BcT&rDB?3i"lh\?ğr G/ dzq#O>?tuܭlymtIwtUX؝@뺜k߫@H+B: p$ȭIku|\83qюɘ9|ϳ(})c@p)|HUE{EZsBf_@8]UG-cI;rL`ͺ"\S12ZFSal{D[h?Hm)p3IF Jŋ;Pqk1n#߰GSx ,e5xrDq{Vd_`}lDrŋ>H6`y`VL8> û'zS9n 57<($6z6V)%6P4qt~ j<ͣKem8BiX(S>UkЕ9{#4Fgы. _hc8\5KRa8(O[vڠrеQ9%H!fA/F 5 'bGk0%"ܐQx~5iES<z] ԏ'aMV6 GKpl,+\ d`zJd7|6ڲNR ~a*#5#1nÇMU޺"=vtkw<[p7 78 ;>t0MЉ[p^ND'.3h}ަF#VlJ_3&C‚ |L:J_>) Cm)9Ik|(`ֵD!20 vW˞ \Qc ;Fq-.Vie5iϑ1+ "ŧT>KJ(Ṋ_KA>!bb`(8@B[绶w E޹K?z0uy([oqavvȪ{I'+@Fb?#sLjI!D.I&vx\ٶ,b-^ZQ=W3@µRYYP!ޗ +P_ô^y0%ru.qtB}v…~i)]>zQV̐5EH@u֑95^D|=9-cZ~v :[[ƺ]"PkҸj'9U\+Cť4ي{FEhbhW!+ޞiu h%r,x8y+w@A`2?ސ0 %$'Tz/y&?&}3nv6|>zr_(0oO)K﬋k>[QCN9cي.]EXu7_/ qu#a6&9: endstream endobj 640 0 obj << /Type /Page /Contents 641 0 R /Resources 639 0 R /MediaBox [0 0 612 792] /Parent 635 0 R >> endobj 639 0 obj << /Font << /F28 15 0 R /F8 21 0 R /F38 68 0 R /F35 56 0 R /F33 53 0 R /F32 50 0 R >> /ProcSet [ /PDF /Text ] >> endobj 644 0 obj << /Length 3613 /Filter /FlateDecode >> stream xڽ˒ܶ_1GJCmeIUr⒓ݪ4CIV׻_%g[9ģhJEaU#V_iC-mٯ7R:;쏂zC+*8'ݮ7*(5lc=p]+#r-+`{Q-af^8þ=ghQ:LLA뇮*4~XoLQ=!P7\omTО5tXu8JnՌ3 jj'“nqh8 sNtJDdТUEeQqpBhCm77ʃ+ԦNG0s(Ѓ@wye+G&3Py@4˃۽@9_#"t>\`wZbz*h{DCDar9NdB?<j8A"sC809[؝#-,8kE'EE/dtDPrtFuTqEE30ٱcmd;]$$}Gن?m:}%(geQ'p bᓽAYeE.DR:͝ *z% EJ#O#-Ҕ^̒JɚOLu[d&M''٤mdN R"naiڵ$5\,4SSOL3p/0hA"&.F7C" f~ Ɖ2P!@у^V>G1ae^ =qA9 ]+Il?"ZXGT\MѷSܒ4&-Ϙ n;,3*!w3Xc'=T&z&C`Ez6;r_t3*}$OSY;p\ 钺$gvQ)Eu%[FAt}z Z{٬JRp)̑0r/ 'pE4)3ZTCu`j q l:g&_LSy nyܒ8dۮ>V32ayeic5A ESͰ>aſ>4`8Uiʃ 'uz8Ԯ5 umi@ݛ}FaaB0`T&F¹q Ў FpO_8MaRG- U;'FF"<1 |j.#̣'./^:̘ThL0vgʼ$CBpTdo3Q/wJˁ6∂ARuOٍwY^ ?Q*ɭi@3'flym[.$u;y,7մ"},E۶gE,ЯQq,{y˶n8jo2;ߟN['~ij~|ltE4~yKI(ۧwDZ2;*ޞQqfÀ(ݡ'EpweL!k3=y0qO~˕"{^ y8o1=Բx&,,A%Q6hp/آD,?Q䢇*`Ftb|ywي=69/5}/A;{…œPm fYѾ6ݒ GPjx>b/\8g8uYܛ) /tt>qg=46Ruqէ endstream endobj 643 0 obj << /Type /Page /Contents 644 0 R /Resources 642 0 R /MediaBox [0 0 612 792] /Parent 635 0 R >> endobj 642 0 obj << /Font << /F8 21 0 R /F35 56 0 R /F28 15 0 R /F29 18 0 R /F38 68 0 R /F33 53 0 R >> /ProcSet [ /PDF /Text ] >> endobj 647 0 obj << /Length 2879 /Filter /FlateDecode >> stream xZ[oF~( %Մs#NAi(]aDD%R8sHo*/65̹|O~$i'4*ѓ$JEdttWf0T$L"Ter鑄h"'8YџGMGǣHM:2M'#%R_^Լ##AV ժ)6LӺ͵Ydu>i9[G sDǰ$뼚hZ!H"[d xu kK=`6, &V𣠛f> qzkMtut#sdۑ0__عTGZ&pI_Cixz63u:2Z:է~n'g;;MjSCoD%Sd@G"UC|]7ܷ|4 65 ~!P9usj`q2V"V"~-pEA_ џl>6V1 *aax:=} j\ENpç=7ԟ{\}a8oNXhSWoHi? 0QJTBg1Oכ7 vSEaq3]d%O<|CZGx {]d^\s<-4#l@.)Ĩ@ĂOŰeF/k6L&t Rq5vf RJN)}(0SBM|0lgN[\tzű௝tsbYD^.{7d͜= gjw60^TvZTWcYS 7#EfUzj(=AY@1&19/nޏ`A1Cb\Q\B> ݶyC<ƏEѰ_`"'ۜCNG4  h9){*)|$N,X' VTF 01n*a0rV|й:ע3+gTrKC:Xysf"AHy{R̚Ss^VcxxA EQA73 ";"3"3gŒ8ֿZXȰ؉E$L S+4/f(k6ʾ>  %3:_Whx1(ro Nk2E^mp$-LM)ޢ8YsDQqMl|(Y&}}Cj0=GzmyR E8 naÓrN]cZÎ 9٠3_vSG6D4 ٦%=s{OMK=z$R) kU&b1;غQr &@/  x 9AŌYL(ܯccЊW)ƦsNਉ[.IU՚DpԽ >n̶mܘ@ c>*Ϊ<RrlU܆%!xxT~k^R\i%k !Du\ WQ?Љ~,Jtw !ps>aQeJyQU{8FW[ȨqSK-_i0mYe<>˶ylh!hcnyD!5=c7~%`qҖ}OFw"w1Er,I#4TI Q .|8exZČfpyGb6/~:>9V%Q͆ī} CǠ= ep%?gUq'^?Y2#ZXc')_HyG o<w*laχeǖX^.r`^~`" ޞ ,@2ov UE{ w*[TW]Q%#`@'6\ivn!$gsn lIZ ḪCΚ]PH]d!FM% 0 $+Kw\Mחy9nNgRY0~& ҄/,k6J e}$PSG|l^~lj-؅6VVLA˪1DYo(I.uv.S(fU=vm`k.<˾8?cou>%A>A03=I]lMg/ULM磾% ?@A-٘`|DF?~Ad spkghml+x]T, 7tk7>1_ݚlqʹ{όt.;PەﬠNPp/i 9tE+ ۷l2UQ6yݭ\ 熤r'wNF}qIZU#%BXu#D3`396TgwT[s2T-Q\+|erc_}z y7E+E =Kז y]fk6l;Jno/C[Nw|.hRXW*KVnQA<0z2,`Fh$S?ao endstream endobj 646 0 obj << /Type /Page /Contents 647 0 R /Resources 645 0 R /MediaBox [0 0 612 792] /Parent 635 0 R >> endobj 645 0 obj << /Font << /F38 68 0 R /F35 56 0 R /F33 53 0 R /F32 50 0 R /F8 21 0 R /F28 15 0 R >> /ProcSet [ /PDF /Text ] >> endobj 650 0 obj << /Length 2615 /Filter /FlateDecode >> stream xZs6_Z>I7$\:Iwq)WrI.Hrs:!\v_Ћߪtfj52,'bvh]"*B)-7\r0'a&3/LTu,w] |LtƜ kg ljŻu :#H,DjaH)`r߼=4PU;AD2mxv=~8(ŌQ(ZSQL 5P8o1R- ?4۹L|⣴?E{Ӗ xn|G\z%T5GxJ Yni@E2aRHjSiE2D0/[<*[ ]lsb-e~gVy̗nAc#vAVmR l譐nl9I;_*Tg.VE]T˲Z v{dBR#c4=_~"=Aos`ecH72Ȩ~>a,#MN0x7;8opO~>NGW'ryfN5 eжLK}$"x3":`p&[Hbo8IA׻MJE!|AFCԛ|a`% >u0³ KY{q 3׹JKYLeav0ƴP4mkzbNΜm,`r.#Cr;[[)hA>zVtpQUdx΂]ևT|GMZ - CWdOQ|\3pb nD/VmQӖ 6,늒W^ɕhNm Ùl `<6WH ;Y+wex8t!ݢHӄNam8z Mo?/#5wM-``T |~nڮ f0 ԢGkdvMn;gF(!}<{"Jly݌ Ʋ4 `ڨ^_M:e 2.y@/%t|ϴYj=bcheBnó-(? c%`tu ˱2ނRËmNDTiC߈,ۛi|b;K9&vgoj^_OYD&nQj`!L=`[yyڅ5٠XLa@E> 5wjo穦D),u;{[L`r*nkD gD܆\TX]gbͯ OT'i&pl/I dۙ*X<>y|D/@7r&wz0GCŌ[gАO?kBp=8<`HL("dePPz2bq7+eucT t'=Zw^¡ %3cH/; bۂzϪ5֢Gl{a͹ $? cֽI 3`lKB_2g>Pb ܔKZńzא6$]odOу@&sIZjRߺ2~"C+C^` w512l@54WQ@Q Zzb,9T4xF$EvKk?tlqꏐ%P)JƵuXo^7oa&kgbOGJm?q{APg5VWziC(tC *1( fCՄ*!VtDEJj۾XW!hWP\[*>7& v>?Q5M1VB'~i5@=5 mzWm2GTݨIJZ}2{zL!]8Dn}7NN`Okh>gU>L?uqٺ|XK8ڪWJ& <5k ss"œ^SYK0`h~zVNQE&Vaה r}{ꔟkEs2 LI?%E(RI3J;(XQ}| +N18u4)>;gÚOy-vՓs:;_xmu6/4ޠ5u`T` :y]-eBղ{ݴEy۵uڃ ᦥ|~]v@p»?Y]5J {Cx k<'~&;Wq'9 :dWPIY<Qvzsz5Mzua>(wN56#ʀ4| endstream endobj 649 0 obj << /Type /Page /Contents 650 0 R /Resources 648 0 R /MediaBox [0 0 612 792] /Parent 635 0 R >> endobj 648 0 obj << /Font << /F38 68 0 R /F35 56 0 R /F32 50 0 R /F8 21 0 R /F33 53 0 R >> /ProcSet [ /PDF /Text ] >> endobj 653 0 obj << /Length 2804 /Filter /FlateDecode >> stream xZoFB(;Rpͣ@Z%Tl篿y+A$wgggfgg~3ˋZ-2zqy2HLF.._˟*Ri;;+_I)("~)림:jxyyÅ\H E%"Lp/"\t [x̲B֙_*Fb%u*Ld+OgdCO#i0F2fgU/U/>\&YT˕&x\cnAqnebCH -1lSC\]:Yh4hz+EXt=8|Q˗Z۩)řUl<ÖyƟijGpӠ|US фXL>}wӅ EfBGWPR宂MMEPҎ5?i&{zE wڿ4 vjuӫ+E꼽 j%\E*]f j;<(% ytr+Dz=z{*szkz"V>ߠC޳MLcWSdޡ8Xvص{iz Fg۝qM,%ګC׼l$"e;mu(dTxdyؕ6FV4W!\^q"ʴg3EܷR 8˔6_]0o<;Hٕ!{QuG >䝸;qcrPC9,6zk“q蜉Ęp*"\J+O,T&̏gi(5 s;mzŇ#|~bE7~ ')A "^7a~V~bi'!HBL1 h'1ݿ< @ s̬nB1ۥn;֜9O|)D R$:3%q3xzSDF &C*KA: ZynSn@ ]v~U#h<Dbkkv\ B-d>TW.劐>VSg$5 `My4M׃]t]tcRIǛzoioO0q̓)+~ S8rBwpavȷ%Sgv&VZCyVk ?)]^ \=T%oa8j0}_Hq$M0[J@{[=OǾ9@" ;tn(3 ~!VVwc=B#$z^7*+vUY<K4s`[˼}bn݅45.M\&؛z 88@u6)n5$ ucYaDn9Vwq.\SGm蒠6^O\9PuSB3O!"$ Zǔ ]0?~rJɞ)! 0U126sWV -l إ(e{b/nF Ȱr!yD "`Ygjy!bnsmhj7JaqTόu)b@Ɠ$:)~AHwlL<Aɿn%"֧\ >Z&˖! @nzK-APXVL³1Kf0][!:ICÔCyD'6s̆3GS0FR!, S1>7#VN-3؋tFb]<#f[66ao$ʧ"ㅂ ϋk1 RDV, ?\KaD-%T0l2^,:Vٟf^+LհrWjD#X$8@Xb tOKaU4֑̔PDWX9a$*ku.*շw@?ԜT?c_Czʟ}1$ yrf[6ҤcEo*%f^bXF-1h{o]Xm˺l󾴫*{AVʸ6C-~(#}{㇌ ~ 2ʚ)XP- iխ^zldFcw4n&g [4ȡy4搓U~ZAT'T3ڍ>Mev0E6u rV?xhlij/L=D endstream endobj 652 0 obj << /Type /Page /Contents 653 0 R /Resources 651 0 R /MediaBox [0 0 612 792] /Parent 654 0 R >> endobj 651 0 obj << /Font << /F32 50 0 R /F35 56 0 R /F38 68 0 R /F8 21 0 R /F33 53 0 R /F29 18 0 R >> /ProcSet [ /PDF /Text ] >> endobj 657 0 obj << /Length 349 /Filter /FlateDecode >> stream xmRn0 +r 2 iI;۴C tE0A8mm~ُ<֫=++3+2-YݾqiɅNR)[?wCjHҼ4u/ Ʉ,d,UF(K[..$!xP5. :z D ;?x3҇OGb?{'(Qh R ro#q9!'=8@[-Z Fԇ** ߟ Da%?.m1qN";12nl?l"e×[$5Dk6w<׺$GI:rJdRSiQj]h' endstream endobj 656 0 obj << /Type /Page /Contents 657 0 R /Resources 655 0 R /MediaBox [0 0 612 792] /Parent 654 0 R >> endobj 655 0 obj << /Font << /F28 15 0 R /F8 21 0 R >> /ProcSet [ /PDF /Text ] >> endobj 660 0 obj << /Length 4895 /Filter /FlateDecode >> stream x\[ou~ׯ۶֕U/Xg; l5Tf}ΥX䌜MX5/u=u9q[BV=_^oߔBxx ǛnFqam6o?ܼV~O_cSrn4w[iOTmGn [M?i ax Ue`/Hf{^h/?;㲠JQHcww~qMx^4'#6f #UlneUn5eQ)zv"^j脫>61U`C]{:U妛O]J8(W B//]mnpԅ Qxc5)攲09ۧ,6gTd˦݆(!n|euCѵ-7~#͟tf^w?{\NV愽{~EkLH0]^uZ"pO|ߵax#.35}M-G{=nנĻ}Ei/л '1j[@k>3u-͇0.m|(#C.s{ 7Gut0tT t=@(V?C}0V](*## ok̃JGEc`G¯b #4`URf$Sh&La4[)ts)7TI#@C$i 5?p]8 p45?{bUدX5 k eymA v|$W(mHR\>[~ ,O~ MI# 6O;dc10Ut/sYFFv;\D:4e z"əS`ehd;[Gs-n_ĥM#@[\*9X->E-*?0AK8nމt0,vj/ȧҁeD<ϫ8NPʤS!!7 Ij|@:dž(5ע1tas5K:[,심)x<~%>9q-) œ`?]Wtj;REpGķ?ȝb /Us5ҌU 0HYh#Zh'(-pya|Z-+nSZ'S$-T;⚺&*GhfVzFQ*'9bpQ;X Ùe@q*ˑK0v.tW*am6U@ eBԡOz{P^lM~sehJ\| K yh"-0Gdo-%bT798գ ʶ2KGy YrGK9 H ŧ`x 1O۞ >I<5<7}Ӆ BRG z]:";"G0A^R֨ C^Rl(">Rku{k/=Gw5eX0Eǡ J CDeX_Xq1:~U9/nitU0m3o4߈#A/ n\VEb 8 L%b1 hH 'ϧt2|j)̭\ er.In)TOD#9#DdٚZKp])@/Gz"{ivI!ʏ`+HzIW@GBPt ɿGm%`6͎6TLeNqdמ!RCa7aJQCЈm)!&u7r Ǵ9  17@qyL-*"OlkPVD@a@jȉbB f ||P5,ITsXoB^Klg:Shΐi46{h=3`k5pQy5˙"'Q:Ԃ*$ļ *3TNh|2P D{`b>YjOfs^"ˁ2,WK2yJBak"=?2P6S֑?)n=~6S;NUK»x,MRBs5Q !!1 IKZsaHB/\TK/4BzM#*!V~AR5ijRYT:j@G&]}W3g:n:~u/tn>1vRh"EŠj|@VWS^qX"%yX4ׅZ ExTk.ɤlw kjg0:>1;msPBŀ&'(A[Zc`5~?Y#g#R!'DcIaJ!}R,X BEm,V)g0V*|lXɇb!_T}cK8;=6 9ЍrDQ6IN yUo9o0l$89-f<Ĝ.PTK67Ü#!(&=A}/:G%J ,%֙\kf~u+j;&;#˩<ƒ{&*H l= IF]-ӚWlQjGPrd| /&R%D.6 r13fGx !!SeO) ַmʈ!`3;E%U!ӊ$жvZHd&`sD@jK@qu#X㒐X%s&K51a 85YlZ>"ہ2d<{;8"4^2:}Y<$$g~ȹq6MP޵(GjM[ FHkQjQ`y\ ?P/ET`XXՠ4 Slf`sDQƒ_[]Iq PG ~WgXYFѐk+:a9 c7~2|V2рKLqLl9sA#p$( ,{8/z_#oGïF8T+^хĚmuD(Z쵢2Ut$\d?#CĊ7-Bǻ ].A_Ԥ2T fe"q*܆bPt!LjVvA1H_$MX 0;6Ӭv`\ \ۯ cm浓xl-zQ  @S(^ͨ2F$C=4,jJHkZTPEAjgU]C#lW̎>ɿ]I^)ԃs*R^φ!S b`!=/ m*=Jefyy\V(M:MPI%|\.Tg˕oDJ5z>|P\ O3\f 'UI ~y [Mv JM@0ӫ-z-MtK] _%όұMM>W3( )UƩ5K -ڡ^I)-[ѢPhZt6_z.%!õ@_{*>w ]v > endobj 658 0 obj << /Font << /F29 18 0 R /F38 68 0 R /F35 56 0 R /F8 21 0 R /F33 53 0 R >> /ProcSet [ /PDF /Text ] >> endobj 663 0 obj << /Length 2575 /Filter /FlateDecode >> stream xZYo~_xV_lvkVE~f89 OU<$9d^u(1D(QF EO(D ,^y߸2ߟ)kR|VpwH|sG?_(apė7JJ>]wsr{OӸ.ͽ{UݸxXT]Llޕ[/2_#u^-nfͷZnka^U7ÍUw~UzE rdw^_/>w+ ΅ 1JyFx& ,ʏKq,%R `Glr3M) y3:ƈI"WAiX>ʧ7=7$~o-I'gew3h`0 XFRƣf٧4Zhat0c͌}&]gpw &BZEK1"@a .*3go)hw:iZk%w~ثr@+4Y6Q*rX}CpMReT3@GJZriVOeY W'zȠr"8H n̋ aB;;ę^;q_Ytr&P.*)ܓE$D'" ^飽WFq!QFi5B+0ݭ[,M3`$2%>HLExElX)0fJ)0iM3JQSZ-@Vl-mH4eta\ ّH%-ZU2?ՏX Yw҃P #R SvHA;-~( \muV[pP܃]AI|tQ[K& AcFo_!X}ߥ*>{D i T 3;&;waM}ñSʽ#: 퍅e`Mq/=nxk7A+kŗ}$"ߌ150NCwEBϛ<;Ţ@kcN3HU7W`pH^uR#ybHإF&ZtI4;)]@x^нAIؗOT'خ$Ke$fǩ1JZj ^Or Neבku>Å<@~;.3~L zdlrm@*Q!:8OjRP'A7Qlra@)D6|!ϐvt5ɵPC40iM3f W4Gſz520n.)wf4meve4"Yåq|>v !. n̑h%-bإAc4 -LˑfK;i:l}:=O/0AXmB}Td$ ^[WYk?~^kPP`]3VZ_w=֥uq*8ʲHJЂ\[ 4RaT<hasIP!ԡ*M[eH<: %7-~Fa<Qɭ,WL8o\ m[Gd v0@aqI# \V $4yZӌqxaSlŌnHW,nE6$5;DZIBct ٞ8 _4['kC8> W ႘1 8Y^Xl ;E!dl>ZOwWNrB juQ("HlA[1'k2HaӚf,cDaӓq;m6%w.TFv_}}y.A*) X]춶ţ|rH)Һoi; eP!nGC ]vgKnW?gvG"OʵNF>TPf"8H?"?;*Ȁh%-bA0f< iST4 c{6ALFbӁ ըS(R07J91BY?) ldn~D\кؾnK|gfۧG\aJIhsXE}3u\]7lU8i7I/M2wD{&-=,mQ܎pOk2H[D L␶ܴv=%fT endstream endobj 662 0 obj << /Type /Page /Contents 663 0 R /Resources 661 0 R /MediaBox [0 0 612 792] /Parent 654 0 R >> endobj 661 0 obj << /Font << /F8 21 0 R /F38 68 0 R /F35 56 0 R /F32 50 0 R /F11 65 0 R >> /ProcSet [ /PDF /Text ] >> endobj 666 0 obj << /Length 2842 /Filter /FlateDecode >> stream xZYsH~!#eb77édn[y%ZbE=̯_})ډUbFxZQLnFy΄#,U|t5m\W?85SVRq;-RN~-?LK&8f^ְf:,fhk\fKvm_fj[3ԃ>(8ezkvHf΢5lP Gvm ~xsCև0{)>m^V(,.v f-|d-EYBVTa,J9I: 9ϛ:e=J e]e*X-zYQxcyJG;x3<Ns$A܍W5Snޓ9˔YXAERΔ'cEb|6w4q2 ,yYÚA`fxC%B2 xN)s@lӏ]5Ynl9H 5r#˅aY1,_. -4J5MWr8~ӥ;ϖS\ejq9"O*;RVԟ_?}蘖꙰o\oK"kPȶ݄>fiٛ`l랺#e* @)6 iQ7v9LVdd% a= WqATkt v-Kw{(j`CPBoo=|L fU8C*P 䔞y<QW*yV󥴜6bB?-9YICXONSlM\xN4΢5Yf!5fMf9p.1/ {8b, ـPrP`lX A((4pva ]6ձhT"ŔTܘoPQt<2c2@\p(H/.R)3iP~LA!X"%{I=nŎI 9F^ԠNZ3mNHR.{YICXoeG'e sn ˞c ud gAqu>0aeWRν&nGeA{Ig!dK62X!|j}%!Oᐨ6|{QW8$\B_ruqٳe !p"8ZAְZ伥@8O Em}0ĕ)oo$|\g2ri|7Q/r!K ve]HxyMuC<9 ȓq@1)s'H4]ԴvBZɤ6W:T10޶)„rw],H-?@hGY5>vqU`Kʘa$4[I37`>}ջM m[nk *d~wr/gPR :6(OШanMcPK^AQHCRcF`v 8Pa*ǯ(;UxzC1ЇM#꿭{_)\ƵJ.[dʛ}Z[IotWQZK#CfM}Wj[ӡ 喚7 0- endstream endobj 665 0 obj << /Type /Page /Contents 666 0 R /Resources 664 0 R /MediaBox [0 0 612 792] /Parent 654 0 R >> endobj 664 0 obj << /Font << /F38 68 0 R /F35 56 0 R /F32 50 0 R /F33 53 0 R /F8 21 0 R /F29 18 0 R >> /ProcSet [ /PDF /Text ] >> endobj 669 0 obj << /Length 3391 /Filter /FlateDecode >> stream xڭZ[s۶~#5$2MO]$g>"mq"*IUI~@Ң]~JagQX/HLXza =?ZPo|_AW\$^A{ԡw?OYpwo| ~dxXWp{Tw$^~}W|]ۼ.`]wURerӚ#Q0fWO"VY>ÙFʾcʿ(谻o4- vc09xP(N8zji:eW=~%|m\`pkxO%7Hx/TGjY8h] lmPjdwEgFwm7EPiAzϿEq,~|?̲BYn]k5Z cĘ-f~+XdoxWy'QCxk=˛t_C2b_AA'/ƾ>_=4OO*6āM}kF"cdm,9c+I`ǰ%k=V s W~~?fS?ٜ1i# ӕ6?(N@ 4 ]+_%)Q'd]IzVZ:8UP`(Ѯ<[u2 } ԑ*3!koi[mP[P%1?=LK:KO7WGhifr EB @hS*64C+@ 2.Q4F0 &AK@A) ږyQd4vGǮK^0l$FxY Y# h= HˀS_Wgi&(>U&ߞ;*1Ę؛Sȡ>v?ZR2-hMFaRA:JazY7 2l0KrI'6W]D[Jf̞=nˍD̎AxR )w,&t$;~nuծ z~8fXn W@˅ڣ(8ԕi,gM^8–z-YǎO%13Xp0P8/H&#=wT| - zk/'Z|j} #iU6AB<8[!Bz}s= ר~$m&ts=k P\[D\W" n̏R_\暾N8+~Sin}ծK^j ٓ[C|zCz;%=9Q$xĎcC>$3|3<;֣q0RO?ii.\ 9{L:8XT*.*9B.`+K|F1|Я:%l _ yW-l3lF*+y UoB̌JG%!U ]}7>S! 2oʚ>&q4lڦ>8826eH[.&{(y &щ8J%RW炽q\N)ĺZL\odHEׁWa看S2@8}>`1s8vLJRxC\'b f&\$Itw&0Yb%Mu@mH$~*9CNoƥF%F<5?L~JY.BHd.58m/ M 4҉\sRHd!~` {` LH)qCm BY!i>Yߊ{>״bO <~C{Q=ơ?Ltxs$JqwD[sRW-0zEᔊ4m0KFw^a endstream endobj 668 0 obj << /Type /Page /Contents 669 0 R /Resources 667 0 R /MediaBox [0 0 612 792] /Parent 654 0 R >> endobj 667 0 obj << /Font << /F28 15 0 R /F8 21 0 R /F35 56 0 R /F33 53 0 R >> /ProcSet [ /PDF /Text ] >> endobj 672 0 obj << /Length 2973 /Filter /FlateDecode >> stream xZYoH~fb7,$x0Nf1Zmb%Jίߪn"%#L~#4NGˑ#,V|4X]Tͯ;ṭ|/dT]tVy942ce3Z L.uO+}wvowkxmhxw]+#Fׅg6O??јKUJjR7%=IA>Q`QfQ"|r5 n3QFa,q^|͇ g;Z8l1@e1f4-!KsBa!K{D,i!K= =w :dSlޜ-.j҄o0-ˁȄ~a&iHE "_x=s}8 RS}9,aU sQVUji,(jK3/lwEU=P*h 6 x¾MjNŐ&5d3EQM3ysFv3m˪rV[_{2h 1DpA?O,!űA%H ϡj0yp:4H)94ԯ9fniY`:Xen69*haW_66cE;Ι LTYOzJ)Ώе{;:.M^z;Rq$u(e,< [X}{f9ËOI_uKZҋ{T]?|嗗)I-©xKq-wPt"MvLb2XR#1 {N3Áh@Ŧ>Q:x\HqKpj q׫U3ttJ.DǤ1l;Jݞr=FN#YI^nֵp{Uܩx)/ ) |qSv]`(cEHh KvAQZmj lC/1 O*&0ʽ4Wx U s#V#Z7@AdlCdD3Y)Pz:Ьйq:ySAc9Cm% EQ;yu 1Eb 7qn]ƁC ; bB(mJ_h\/tG#=8G_N $2? L#.6}U)3yApۛ|C[A,#]՗ n@{^Ȭ`Eytrm,w`&0Z;IӠ DI'6VHc=yG^)}!\pK8NJ=g1P CI-m[V+ m|Vj馁al+b5d_};)3u6R1MƂgSJ(S-~PglyJz"H6M)7cݦ#@BԳ Pt@B sAG21z3Lqd¤Б΃`b z"Sqy_OzuXVVQJ4;~(jN<7/n!`;05H-%š7 (YUY騚bQ)Wny^ԉ0d$G'b!tB8^P\ zDpKk\$[PF]!|pNn R)Ӆ4 uaLR LGo+> __;M9lkC k>/6Z y!8 "1|# ~aZΗ=(x)p;X{ ] s1RۺT-WqKe^,ѡ#מ+ЉO)%@k"ֳV'sP=LiM(moSPf1o}kٕ?F7lJq6|PƣĻƋ(ءYa t[k 6Es7دc\†Џ@k"֯b18Ģ.!{pzIO8f)R. 4y> endobj 670 0 obj << /Font << /F8 21 0 R /F35 56 0 R /F38 68 0 R /F32 50 0 R >> /ProcSet [ /PDF /Text ] >> endobj 676 0 obj << /Length 3320 /Filter /FlateDecode >> stream xr_IJD0q!H&/iLZ-Tl{.D6z&D\s?|u}v6Xq>jƹ]/>TݹV;;+D Uˤ:VGWDu\ej#2n=V_yd[`ۍ:eɰ8Rs7ܺmp(?I|U.q2!)F&ѻ[|DԚ{H/\jhXW%f+x=X Q\P p"Mцkh9mPpa}aI Á{n2jd+hE/ DG^hq=+NPqbh*0JFU/ΐ{݊κxY.r_ejDZ@nb0go$39S6!涙ѳ׳~g˳xY,t ͙y_akP%e3+]qm54fZ̖զmnhvŖ;葨\ 3Gf$i&E{| $BZy&KD[>#3Yjr[#3-1i-,?N40$4Sax <"ImwyIDg61"3DݹjkDi2,'Rf@< :[*IndˉJG`[E4ny48)/m Yk(@Hj IJe &~ڢyw~k<+V&\0+:fYI,i^7Xw+9(t8+ {sP#(2ڒ~ ,@ђX,-/Gbhө*_Gts"KW b2V1_TTۆ<<&# [{8 V&΍W&) Wf .84kJi9ܹNџfsG-_`QsT¢Y{1VŠז'w{skƮl=^=wR3Os0\hgvOǰ**$R+njs ~d9, TbE@ɩ}7[mxLz)PR%wxO^)_Z>snV]_]\#@ݰk;1'^vE7PH8gd@+sc H g¦+ 8SDzTK@7 0ݎhz.}':nyoE3OxRex=iaմ:W{n !gs dHʏ8W"=}߯^S ED8g( ocUbUPJ$/|d P *$ .gr%Ci.D9~ۙxoPΙ]Z^:5 i=c&"$tE[4Iy+vzVgw7!܏X032OrQ-Sx-y1+~0lfCWwBA='rs!=M-D#j2ڋrLP"GF+$\H[LۜJXh1m1G\v*xTenr: @!9&IL3 90گO|əMǛ5h9 IGWb3G>J )LGs!CAyAl}_r~#`AM%ܙ@K:F"cV!;ِ2`\(ͭ;vSǺd>4X-VR^Ⱥws~Jݴ_D6e0[m5Ub׏@LYXؕ~(==-g -E1fz~:  p-z<>9I<Ini[ɾްP{F5-`I6CcWc?OY'mrrI&R,f>bzqHy!5}V 9{@OJQCİ*|a}qbCڑ'"N<J#^˱DvEt 4p_w1h|=L7Z#):r*pgܕX^q@h?2mRZү%&PIo)Z-Br/{ZS9::e[zruC*i֝K6nNDYJ2[uְ&#z^碫^ HF" СT+暗야+y]\~8jIL(E/qks%>Rz^'Ώho9q0H"-{{XZ_6;4Y ] ʧ][+Oe9:AL_e` †5 2I ]afw-ӘSAAޏlň M]-b鳈/pG`D}F=T`d"'IgP$ҧX  tiUp9tJ Af q_""3LoCbP,fZ8iS+1M~M-3?]7d G(p u9ZRqU, endstream endobj 675 0 obj << /Type /Page /Contents 676 0 R /Resources 674 0 R /MediaBox [0 0 612 792] /Parent 673 0 R >> endobj 674 0 obj << /Font << /F8 21 0 R /F35 56 0 R /F28 15 0 R /F38 68 0 R /F32 50 0 R /F33 53 0 R >> /ProcSet [ /PDF /Text ] >> endobj 679 0 obj << /Length 2991 /Filter /FlateDecode >> stream xZmoF_\D}㒛ŵuznr -QQIItܯ])ىƀaRrvfv^N?%=w5Ųs˸oE:g_~:;ϗgUr_2yzYp&3@F̈vW,4\p˄P=lY=-Kp7Q8Iu3!O8hv;X3 O)\mdHy>wZH;h ?$0kF1-b&bDM1_" b w uf W+!ݰiawq{Bgcm&m X( _bl%rzV]H0[\:24 OQĄ 2΅I`B ?#~榇GY: O ʙx byJx Ϸ91Zwp~A?rgR7o % V fi@vD}v6q <+I9G)K6gv2zi|AnR'TYԱDc&(qcJ{d[z!lK`'Vc,SgxcUFmu8%KHӴ*\;Aڭ./ WW'`II.zO~' g& s&O$f'N]QxR05$/d]=[@@>J$a2feu[4jͳa=M/]8C  OkP#_@a+e5>`.ky 4<,2LIC66sYhlT$N{$Ň}Ai,5m6To$~7>^d0 W@H_\P${⧭X4aSH(`^^%ZBPm!}JIjXu: i( kz\ Ze0БmEم|Aj)8 ҏcrRBH&!;qeiq2um Ȫ̬(AMa)a8xPaRB| sYY7y֡.G'e4Cձ ӒPj^+zAwӧ :\.RQP,e[XUϲb8 _ \yUmYe[3b4˽+37@("僌|{-]܃7Z[FՄ.l2i`VHGa:̤ ~$Ěi-IX`՛K#Bίے~_lxd}%#yd?{0i-Q`1eg'jSPDA](fQ4߳.'"&mb&\F4F[3]-]1i,>vz1YPuus/W6gHFMrxݱ3o-ԡ֜zcbtk 떟|>I+=$i0ٚY8tOP|RO^x3κW_vҽп_^\$ qs<\q7C:2㰁;yt뭆/oqךH"[nٿ>~LY ;>-j(J6M/__&GXXՓQ񖝽C\,݁ߋ{‚6zYV9=bu[]mU{WD,܆| eOQ4+;{ucB8ywM['@~\xWm(nA2BGvЉ֠F1jBJ-AdØu1 :c:!QL+Y vG2jD> 謄+pjLHߦ#7WaK)O 5H :Z(a-&xr%*F+fv*]#:dq#RSm7qxeVu~ԸYV^#(L4"H6[woMstD0AN:l;O<,w\gTub7t*u10!(T֠FTj-a ZǝrkD5N!ώ4| q(;nOE hRʇ+ Ia[b8[k|tZ e1tZ9CNܶř-:+ΏN8IZn)ꜥOt5=M9p^: 8+6]T\%? :U endstream endobj 678 0 obj << /Type /Page /Contents 679 0 R /Resources 677 0 R /MediaBox [0 0 612 792] /Parent 673 0 R >> endobj 677 0 obj << /Font << /F8 21 0 R /F35 56 0 R /F11 65 0 R /F38 68 0 R /F32 50 0 R /F33 53 0 R >> /ProcSet [ /PDF /Text ] >> endobj 682 0 obj << /Length 1247 /Filter /FlateDecode >> stream xVM6 W(w".)6ClfvIrrƖ@JkWnڎsņH@=_̮^s,։q-myMMGi.M9x}R3oZrNԘ]/fx"aNoy32gd7>~mgwGWI@E&dZps8'a cH^ՐrtiU~.]<1F1DܮIt.{mMonVfq{}_,fWs}vN~S#.}mQ5@S9bў/jV: nQRGMb䔃e3 U tY 5y$o*I0>D5I5!,u0/?e N3O-*zǠmדŲy`!xp󰟏ʫ/ffߓ~o\؝1TIìUOo&U\L`Uθ/ҋ)=3%Q<Ӌ$3Ǝ1cf%M@w)fZ1)]Ģ `S5CoH5Vo eֻUKH렸f^:M QßKK&s_0K ?5sUh׈\yh\ѐp=(1d> endobj 680 0 obj << /Font << /F8 21 0 R /F35 56 0 R /F38 68 0 R /F32 50 0 R /F28 15 0 R >> /ProcSet [ /PDF /Text ] >> endobj 685 0 obj << /Length 5747 /Filter /FlateDecode >> stream x<ێ~lX8&'qEYR+1{.$uU;-VY⦄⦪ ԍUaKqܽWyzQEY@ݯ|@=5[p};~@5Lf=P3'{1< Ax؅r'8ˉ"axA-q>Ñ'X\]+nC` pkHqAp4fqENO>|V3?><_R~̷ \ʐ(QTXnpBKIpw8Fi:VUBũ5( :/A7K# Ot^nh!Pt7Fl9v?B p ={Kć]f/a*.b4zNe MʣnRE_w 3ue7S7pZ] M>淾|`TFgX}܇`W(iU~yt%t|HZbϝkfdVp@%eiAY8]m,< o h@B9_7QQnz~%Ze6 eaF7B`g\]X+i8B WhLn 9`uߠ^(dlȚw"N u$pBDA:z[wVϊȄ e2j3Cdۤ`ޥt /Z+qq Z9pݖ󙅍~)T3Ոk%{fmx_6 KxsETNC^n<VGwۓYoA!V2Me^/ +MrEu*"=j#k)0TA f.-x[Ke]i+$q]H)#jPs#jTnR!azKH.4B5  dTJe6ҳraw5 ,ƚ>֊]kM"3# m6. .vV^RM,>PY.)o<5yk?B|?3R<zQ~g.:. U)qD0\C]Gw}ɨ i#2M"?3Hl*K+\e`jp* ^<çr`w>S*|/. 4"5ͽnGQS<}n :C_\!o{`6?[3 nD >P`:ٸ[l17Ba=w`Z/-C6>G+2RѼdrԎlgmPooHx3|Ƨ1eJ:̓#&f`ہaC+ɸt(=d&qݦ~=agZ ۲7Z$b)4%m駬`J+#Ɠr9DDf̽IVK)Q,o+\XX2p8YJ&KQ:2+JIړEL=lCu8GR!2b}E]5r;u'9"Zf:TȠfC8 1i"&[ p%n_BU~-\tv6f$Q`H`B`-V rkB+1'nsw)mN&ؚMޔ)0XN_ [m`*^&V[ɚ|ϝvhCfYZ${LR*ȟxT΋a# ќF(`xՖoZMd-ZG%h$|:O  [ŶUfnAV>FV^FSb@+OPVpE}~SE})3`D)Xn^ԇzR.y<ӂvu[\6Gylp9aTgEQFXU+ivyul,)APy, DQ4Jzi`n}\## ǝ(#]jv kJ;WvCcox/?3*O)V|a=d(B%J* (<,I`3`}I* ȑE= `M"fJo!ӇpU j  V 9eUItaYgUX X $3[~,u 3Vm!@a*ئ 0D| k$#9Jc"gxb4bzps%q|9XsC K0^]k1"8BhO2; ^?{@F_",2WA:aM#f(s7ޢq= S:|aMc(1QnѴ-|7dM_[zK06̕Vl\o>5Kzk 2">muX +\]0$KL1šDKqDpiĐm* ^4^^R4Gß4)-lh0*# ]ڋ,Վ `M#hVd͝k``McU|wkee쏽b%@\|:5lDrdԟP A paoVDgf>Wa(g+ca)!pgd~9%ӭkgB)}ˆ F}RCZItB@]56<⹣Gè"RtT@cvr/ms|F: %1MPRX"؁E 7+mk̎)դ|tPJX Sn|h0VS<ML7g>3_pi@ßX$~m>ð?$DpB]Šw0QGBsx>Y0Vo c}qڅm} 5a^) -d]ax]SQvts 5B3t+UyM}~N eO94Lv=/y ;o;NYPΥu ]l(S?7R& T.|/qqmOxt'}Wgwr-΀qs2Gag?yS=|$4:TᓒyvW|DyO$@$^=@OǢU*"D endstream endobj 684 0 obj << /Type /Page /Contents 685 0 R /Resources 683 0 R /MediaBox [0 0 612 792] /Parent 673 0 R >> endobj 683 0 obj << /Font << /F29 18 0 R /F38 68 0 R /F35 56 0 R /F8 21 0 R /F33 53 0 R >> /ProcSet [ /PDF /Text ] >> endobj 688 0 obj << /Length 2941 /Filter /FlateDecode >> stream xZ[s6~!K!A`ݙdǙu'nډ;4DYl$JkQu_B");:C">9뛳7z(1ԌnfRjlt3]XHei1fQUDD7ob dD_VOIvS&I&wsxBDShy=I/TIݟyYe9J)Ӭcg-6{Qlo6i8QQV,pϨVwO-d;fn~Os`$yJx*@)Q!e2+Jddl1cxiκ〷&ɩLÙ!/cⳉ!#:bpvAO4%$g>􌎾9D=z1%̘򌃛3kR 2z#Ho5C[RlG@kAKKnϛnlr$Yme|(nC(pn㫧7u*L\ 7Tvp'|y#pɄ'9Bu'owp HقNz /.7mBH_55ئP! &(mE+f]A7.\H*W8F>E^7A=Sw:,`q.0]gmݧό2sυ F PhH Zh7A6s }MQ+|qtʽ>YqW s@sOIՋf~>].7KGjLlεV *s@ʐbcD#z,\9&h+(NuQ,H  UG*7u L9EsDXO: L)i ei]BL*afbT2XA]Ih9 A_69(`IyZ j-_2@sx,Zwl)'h$;7uǁ0 sji {0tdJ(̐)x'4$ mB1`,e/HvxϩӔܒPt**nJOq8:j0AauY zMHUvW+u2I֒pU،}.ЦFH6]wdZ)=@Ȉ^RݽABv%Zj |h@#TzyZqXOɗB m<`Z yȓç0(IŘpϠ 9x ܃@2`@R7B_'&&Oؓ: ݛ+vt1 #Lo=ׯ?c*i9tuPTlm}`lIyZo{,%*ICBnMf}֙Ҥ(ZK_mt"YX9_؍] p(Hb̎]V 41œ!Isn: .G0,nFW Z'WCIZAr7-R }VFV=1zM]EZ-ͳO=]VIT}hXR#@jtXI6a+(œZX2҉Sb@I̻.gҦY3{YtpΒ/&7 07/Y>Ŏo{]F섋}^_[i4%ig[.it|y]nYC۪dr_ǻ]qusXMS~p!@in?o?W H#u̴`[D铠:[> endobj 686 0 obj << /Font << /F8 21 0 R /F38 68 0 R /F35 56 0 R /F32 50 0 R /F11 65 0 R >> /ProcSet [ /PDF /Text ] >> endobj 691 0 obj << /Length 2450 /Filter /FlateDecode >> stream xZKs6Wp琒f0$v*[lyj&lR9dr%ZbE"go7RHvC.66h!F`~Cx$B% _oPT!,Y%1L[:}馘h0^vfW%*ν0eItWcdNx3nJ( fZsDVC/:!D)&,T%BM "8Y^y:ucXc&Y*:CQ-3.WbW+*uhc .#uZHLGNBv$[p"u ,72U}j,\Gӯ^t7^]9_fql֩GIW)tUZA (]ZyPjm!{Nw\vbYbj ]ٰNP?XcAc3HQ_@14iC^G[NF x%:Fs^x-f7\j/4\F2d#֖9:O|:]<ō ëck8SQ_.Dg6R|vax֎ 1H#`y-fYAfI af QvI|Vw._TDqqSռNJR6Mn{| wv  0>x-f}b76#XnT?[M:5MZ=鋋4/v_}8^{Mm܏l/98QϩQk9/Ua5 .fqb>p,<+y-f}oTf Ȉt![Ϧn\QM+88uǙ#9,_V&{ˁ@}i9p`fp0v03B1sɾ*IzƣGTnu !v5%T?> endstream endobj 690 0 obj << /Type /Page /Contents 691 0 R /Resources 689 0 R /MediaBox [0 0 612 792] /Parent 692 0 R >> endobj 689 0 obj << /Font << /F32 50 0 R /F8 21 0 R /F38 68 0 R /F35 56 0 R /F33 53 0 R >> /ProcSet [ /PDF /Text ] >> endobj 695 0 obj << /Length 2601 /Filter /FlateDecode >> stream xZs_tH8qf=Qj٩>t<$h"! #}wGT}p~]\1#bH??&tl6ͧIQN~ #K^DQ3Jf.^]POGtD!l}IGtEJ5O v`VI%V )v#bDe\7?T-e}x,!iٵ7K(LbzsM.& pg_=[#n:)'г!:j*:P^WPQ"i D Dx.yHY1{&Ajdog*:.hxkb- h;\kD|Wh Um =9gUƗ8|OpBbifv=bh}j8AvYmמesD 37wo`k ;p١@\#7r7o3 # PE$qR`cʱyWT1Cyjpf/nw ?wQlG]h;dcR ΡO\4uTJ5C6bQbʬ :[^NAtiÀC^XtWiqmk“qH*Xz̢6 N)}܎ |-u^9 Āc(MQ$hV8"l3Vp`'l`k)8|(lΰ$:*6TB*{=tbKdD0'v Զvփ5&@ CؙdP\ cOD` #΢S|^*תyȴÙ|犔0m7D/VЄg ++9 >n֛'iCɘ>#\sDsŽKB-SRo֙vР;4Jk݁{B4i+spbS 2R`rV-摞tݦn`eL+?.k]U~o1!U,]>omXs_Bª:1T?s~k[sm@2ߔѳ\oT˱AD !&]5.VٶkRCR[2d!oNi<@̾NPrU"0 $x-!(U=u *ٸÆ<0π;z X{K[G'{J5Q9Ha @mD4R lgaΙL4QC&"4$96%<>m b.ck㺰i+b}R%nJGM(pje.뭆j?7"V5wb#65ݔ7|.uw.: Q "{jES($w+:zZIXObÈ9VtPQ[}i@Q-m7:<XFcXV$>]sX^GGlm$\e] U6xcA3)eYyIOe(e}4ɶ4- ٚa%hKB^ֽ]*}ӯbUIXh;)v7Z7> N Tإjfɽ甤)9BáZԈZM$O ՞V ֍BCJ%kZI=`q5Mf]Bq$Dk!!]ay/DCɪC!zPe1RMck 64Q>`3VY:n8^#+k; bB(7418G5]g3<2Zelæ &ݔ('h?ѧaϸ>u}dn~2]B-ĵX(:j!Ah̩zh́;Xt kj T|` \ݚ endstream endobj 694 0 obj << /Type /Page /Contents 695 0 R /Resources 693 0 R /MediaBox [0 0 612 792] /Parent 692 0 R >> endobj 693 0 obj << /Font << /F8 21 0 R /F35 56 0 R /F38 68 0 R /F33 53 0 R /F32 50 0 R >> /ProcSet [ /PDF /Text ] >> endobj 698 0 obj << /Length 3216 /Filter /FlateDecode >> stream xZKϯPN6񎑃G⬘HE<;W!RAF\$U_WWUWU7m:TL26%:=[~qQ7dR?(:Zm x2GwPBkEMqZ_n 7"~ kmCqh C7| yj1pPۻ }Lϴq*,NI<[no}lu~ #G M.4?e+mZ|[t|NQehy64)VWe {U":("x.eI#ca7B3%J4H7>K<*HZVj|+! {$ӎGf-+"1l,Z_{7~(Wji8vA}N$;Y{c E#І< Z+E6#bbXQz z۔u!XjJY.ʱLf5%9n %ufۢY{sI)DqK]|]mجM ~9SOC 8 |sZ'7`уr^{tЉ]SҸ|@y<\@ǻN$IC* (9K~[ ;r&Nb{/$t;iLٱ)eB:f])l7MmKiLtͭ.0 !QPep6Pc]cp~-dIlTND=`ύLb,_$ȅb.+ OucSΤq%^@'`+4l$X_[hhЃ@SLI Oʃс}yTkOC~cMh#}1]~H0r;:(;b{-`,Ui&,d?nrmpVP@f[r멋h(-n}E;~{CfE6*A|;@ E&%/̦ʦg)345 vޝ"<3p0G]~N}#i A?2]h-z }Cl() BuaTtr]JelV)'}lےCShFC쮳Ep|Qh[g:Fj0QIl&:S `)5*1ڧs]kB0z;Lo)yu<㨉d:gQl-LyU ,a|j)xb:w>n!W?J7GtP"N<U(%y!gM[sePP\K\mzo2|*Z DI2_Pe~L2c<@w4Q&'.þl$RI:, ~]Q>^曍O˵Ein&e곚 p_P}u'Չ[vSX(ZaYЊ qay9"׭}feP8Yϡkr&[\f{͊FYKJIh30ZZ%l o|>!1Yїj '"261PaC<8d̏:0‡]zX ><0A4;siNUg _??7Ĉ!^5V|ۄkdI\NXCxh}HE3㌲μ2 Riem#:nr)Ńc7xU {Z1Blm?g(O;N%Ř~ [WfG*Em$]ufnM x͆Sr}F/p|*@Z ̫v]Е&29O18!{ 7ǵڨ(</3.bOMCXuu_꼔8nqw<=Yoz7bwK oVsW2X V,'PWj5NJ>H _Q eD/9_XRڋvBq 0uOaH!uyZ7-ClG+0 UfZAƑʠo?Aʘfu ذ(6,R濃\4ѓ !b[4xv !!?Z߶8 *]q^%u J3=@wYRZezˡGLOݰԄCxCOLՂ endstream endobj 697 0 obj << /Type /Page /Contents 698 0 R /Resources 696 0 R /MediaBox [0 0 612 792] /Parent 692 0 R >> endobj 696 0 obj << /Font << /F38 68 0 R /F35 56 0 R /F33 53 0 R /F32 50 0 R /F28 15 0 R /F8 21 0 R /F29 18 0 R >> /ProcSet [ /PDF /Text ] >> endobj 701 0 obj << /Length 2087 /Filter /FlateDecode >> stream xZ[D~ϯVBd3E R&ލYoK=gfq|IX<@Ve|;s'? 3j1ZKx*)J6]w TTO*ܪɳ tʦLp"UZZl&M^I ,EL"tJIRJg dj{t ;N3s f1b:jje,"$"aU LZ=\s3EQ˭WDZ$J9`{\(zySN')ɓ;/om=6ht\>xWB - 3 u Xܞ`"Bu"rc~1/\\\n/w :6`[J eXn}xPnQumo|&=?DZ+2|ś=L50G=Rr(斤RuF)cǍ%\"CZIDaZlr |[(&DDEk AѬ3cX J\ƁaqT6eiŽi Hnq'|}͗_{ |2mNjEt]&MQ& I/G$"%PIHo՚ q80@#!0iQehWڦ]tJ,XEEZID-Z U ͠KT/Z8!~>C*b$5ed&}LLHM(q8gx,뭓y(w IQ@.<8Λc0.YjHqL+9[g8.9*=<^-ݼt~;|o[̎PX{:}}?X vA ϡXJjvОkmV. ℵ݅e7oO7j"@j1ife=m(TNmېP.{NIgb* 'uWXˈ9x^;Uwy Rî"$ rWZ،"q!al#؜5t,agGb%3'EzX&!Q; DZ; }q!ate t~0>r08 =k*C?Zf*Ie#X).Vs3)Ig9(EGg eFq [7Ux/FAREQ Yט{QmIP[Z0C&[]ga,ܦ `(PK,B¿>\oPj7 w.q+J( :NXFWX!K?e)_{f+j hʁVd9Xz2U"*c`*CpKHe dDeT"d`#غ%~L`uv"]@/.>;qXىjGWFFvyU| pҜ%ƄQ  endstream endobj 700 0 obj << /Type /Page /Contents 701 0 R /Resources 699 0 R /MediaBox [0 0 612 792] /Parent 692 0 R >> endobj 699 0 obj << /Font << /F38 68 0 R /F35 56 0 R /F32 50 0 R /F33 53 0 R /F8 21 0 R >> /ProcSet [ /PDF /Text ] >> endobj 704 0 obj << /Length 3310 /Filter /FlateDecode >> stream xZYsF~ׯ` 2a +UvQXLv<@$$ 4Z58J񖴕q0GOOwO=z<{NgJ6fYgI` TWOs|˶γm]$ ڛQa5_,^"9_8wQFl#_[\?j*+;d;^y߱Wp|:O\͡gH8V.c0F\fmpf#@z[ qu`W[Al(P8ZCBÅ (*#-*Xt׶h"9Nhw <7@*9mx&Lld/a?Bu>{Vif#j4ۂf6ESccQg֣g2>=7r.Nuh2ttlۢSo/]dG} .`{E&1=s4.W7(Y"mA79q /+峢!h[noUxL:] \Q&K<X5h):EgiVmb[u^D3ؠW56Ux>qs/p(Yh 8dpڞ}<`> fߟځmϴoS+_O{eYhc_q!w#1oLQ$9Z)0Ak eAb+{va`; ĚLu#m{!A31~>LI:FӁ$۰{vViZeoR=bQ?sj &UlG%IBA#qCB GW%v7U?_pڷJfѣh-&SpмsZJ[iZe4ڐ-B9oߟ@Wt + bn ƎQ)ݝx:2~e. w膁G2ީ]uy.6 CvȬ Q_0Fzej2Nk2k:pvɤEG FlfL'ejC' v1#@w>F$(('Xv12C=[|#֩U"J=ƶ![ ѵ<`aXyۡ`|uf<)96WHߌ${t\;cy`M0t@Ŭ+Ѐ.bOw%Д{bUjFdSGv.87UjbS _:mT_1{gj6J9}Y3I1~W֚+lgZ,; }e;?ح(1>k:o R@J5-*-HJ9YSYʍ ! du#⧱leuFE5ٍg0; Ou):Ox @ꢫBMYˤơx&J_HhC%$P;NL}ςPEC@ƅRK'DW=ᮐ^WSzU819M]9_ 7NaTZ+*dCўʨ< (M HZ)bQpqM)XᔾK M⽑l=1BsoH$;YI2twIP =h`}ʲ{SLI7njek=z3b!S } EgU8#[WV)LG產Fd]1fd) . EN e^Yѕp d!}lvOL穐،B^gփȌx+!=iȷD dS5iXO¾z}UɈEci/yԃ\i,FvU]LNܚ"8<@UOYڧ9Mi:.EXyRs$ʏS4l JB?Nh!.b bq$D6_: (<15 |$GU-kL,)۸g(Vܺe*OeqMBCOOZ2#a= jI[sd4,6mfJ8/)yƶWԖj@ =ؓ bi[m2J$/uu~цqUJpTʐΛ$+" Cƶlts{|[\98Z_I]yQ,߶m$NJlXabnZaۙswGRcZ A:|0b*uDrX'z+\apI_]}VSD~q> endobj 702 0 obj << /Font << /F28 15 0 R /F8 21 0 R /F35 56 0 R /F29 18 0 R /F38 68 0 R /F32 50 0 R >> /ProcSet [ /PDF /Text ] >> endobj 707 0 obj << /Length 2514 /Filter /FlateDecode >> stream xZ[s6~У oN٦lgNuvg<p"=7PHq \spW˳篓YT,ֳXl~7utmY꧑AM& ̮ζY,qDŽ( }js{5[Og7i24mδ&|AU0(UEt-P 7}GfPH *7lKʱ @k07-mOi(tjǾSQ> J(b_%1eDE7-?~ƷƭA~MnҬE ~r-!ǪŁ,* pI:^O?7|CnG/@gT zR# }eIa &rA &1q`c8sp_d5#i x-8sT >V[VRw kX] WjBULkePc{nTYu(#þ-Lڿ-Ͻ0T#?4stۚ3[.)SBb@磥:} )N\D].,#{|D[1Pg5U*n {DnEsud-qy1J?p-cw|H" DI4y.sN|*d.`BUU+OÖ:͗|N}㍃szAlMb&F& .eEi>"؋?`±rp0eel'؈ę#! j $ endstream endobj 706 0 obj << /Type /Page /Contents 707 0 R /Resources 705 0 R /MediaBox [0 0 612 792] /Parent 692 0 R >> endobj 705 0 obj << /Font << /F8 21 0 R /F35 56 0 R /F29 18 0 R /F17 9 0 R /F38 68 0 R /F32 50 0 R /F33 53 0 R >> /ProcSet [ /PDF /Text ] >> endobj 710 0 obj << /Length 1788 /Filter /FlateDecode >> stream xXKoFW>QEK&iS hm^6m(3C7 ث|K#H2R}:I=$Ϝ6o@v55K8"9|AzIkaACzk,Bq̀,!sd i%}fJ3mc|@A\Nm Y 3F$BnbQHf9`ԙT]2ޫl]yܻX7l(ǪTbo!\oiJ. ]@W@\CIdS 3\cST |pOD&`H>8NO0믽K?xo9&zBwʯ6d*:K`^ (hN3HC?v=.>]mBU;bc73%im[]2-ˣc(>6-DC;R<8sx\Zbဪo0m``]}pQ9aMEEmzf{~c~Lw2Gxn-;0E*et0j cG+6ЍWtfi]AoL bCͭNSwwz92{[#io=|%<\ ӖA8AKBKLj:}; ,^]#KLƳE;lY8rߕÇuaa`,A<Ҭۢnt~>P4 p`JVHigyN$O;{u F;rQ=,gWȵBL?NB3Ä5kD>:,,`, La'3NYs ]S]7h {Ý Af[3&{3 MR;чv){}ffL M?9`S5<@[yLG eDQy?&>)QuM?Cb{wu#ԥx,>> endobj 708 0 obj << /Font << /F28 15 0 R /F29 18 0 R /F8 21 0 R /F38 68 0 R /F35 56 0 R /F33 53 0 R /F32 50 0 R >> /ProcSet [ /PDF /Text ] >> endobj 714 0 obj << /Length 2586 /Filter /FlateDecode >> stream xZoȗp]EI i\[( 8pO$QTSl}܃wʅA۳g+7̗jvv9If{Ƶ-f{ߞPӁJϬ3uM 'ߝ312o'o~K+Q)!3Al) O©>p3762 N{ 8{дh@qGKS&.ݺ/8Lx~c\1gTq1ϸ=d#K0MK?Wu?_J 2_^էrJݐ}R؍ !y2t+Uz[U=PjX>7eQ]Q_Vת]FJm^ŰUHxJ䞊cmT+ ZH&M#a_2P[e*G^cM&Tڮ>DyR? "ǘMj`' jAvE6!~Gb]-ΫC2~+y b:1Se\'U|s\weEEs0yG/,^׭t/&(| A]F JF+nC%b#z-}6qiC#eK.HiGKՎ?Yz j]7ذFLQ>ewz?0GDF梆9Nڢs숂_ݰ+$Fs^qN>f}Lw;LH1~˜OB^N2*QAx) GpT-~Xo1OQ\g@Q͗9li2N41Ey IҊiIfu%g։#AMkBGk~BC}(RFUSt^Sy_zo^]O fl4c x̤;q4m?ڇڿcu%?T, Fia&:?ޓmj񼩝78VrgJsCGQig;1k5IY=pERRӏJ"31J[c#l ~*l'Vgs[Ê޾>4 Q>f0\fnX3N_S qqSM7?JMF*+ eQ!oCrHS=~Z-ϱSC Nʓ+HyʻةƤTE۔\Dm=BS\h"i=FQܯqQDn UM·AD3vY4 &Fx U`zH-m=oeT ﻑӬN8(I&!'hZ_E`"'# Mҳ]MrČjD%>ftŚ53q Lؖz:RZӅ{b7ݸkBLz0ЅXʞ9Kl2͓YJM3זikTk*9NLGבi.> endobj 712 0 obj << /Font << /F38 68 0 R /F35 56 0 R /F32 50 0 R /F8 21 0 R /F29 18 0 R /F11 65 0 R >> /ProcSet [ /PDF /Text ] >> endobj 717 0 obj << /Length 2102 /Filter /FlateDecode >> stream xX[6~0X@^ĴH'mv۴ݢE/by؜HrfBJHbbsC~]l E2S,,Dv6ޗjEQ72W20 7{ۦFլT</cCߚ{x\UU, QPdy I<\߄(i^ZY(k\H^HILñ2ۏG$|yљW(wZJQ$ /lM׷/WVj_*uߛ֮,|+ɻx4ذ?ɬѺWS9qZR a7D^oylA7@H{MsVI <КS[nc;sjjAf`Q.Tz_آj41@<:螛h+Lrax*4mhigGOTrZYSTFE,,}.7]w3!s2I\"]rG&<'h%-80NCSy7F h okM/D?<fdF{7<9P_{d*<;s(4ʱC)9(M,P-LWZ#f,Gʎ_[wtBH8Z1?wLe:GVQHI BTe8mR)ҢsLY|]H r)B22/Z~.["*|BBsZ\/~$%ĘM,y|uóT:茦d0/.T/g‚e!]=ѷa.i=1kC ꣟#ۜ!6ccș7 !F=o0I~/b&[<"+`@?o#I@`H~ԉ7n?8" 3O~f=%W0 @9*)w]93 v$mۺ洮5щ&CL{éx^kP9nSqh;d2AjT;kV[V)8B)Gޭ>8>A8l5f $ N/NKIB(t@&P knӲVEsAZ!4}VAId$)@F;ʾfz*u:cӽi Pxva1^b<dqijݬYXw;úΞtu)Fݩ^p/FųS hȡ0d4D(L@0X7v-aWH+tvWŸr.1۴0 uWӨ5-Kڢ*ml G7uWĞ|y[?=@snm} zT1K0Dg-'j=ʚ-BnۛRIܿ ~m.E (Om= %"RHD$е!P:v)} ȗռ""et*~3͘=pb˽=guW$/ݪKOz=dc`oX˙i-u>JwE\.ZRz|Ze*IukY7=YY5VߕHRG^<·J_CMw6)7GGD$:7C;w) }i-Rr*.-a<|s'OcXƨp$7‘ :#$}Ñ=gβ,-PO/%1=7ޟ.JYwZ03QH%EyyODv7tכ"R'q|vq_jGhB\ /&34_t^/6,_ㄎuIQPXJ endstream endobj 716 0 obj << /Type /Page /Contents 717 0 R /Resources 715 0 R /MediaBox [0 0 612 792] /Parent 711 0 R >> endobj 715 0 obj << /Font << /F8 21 0 R /F35 56 0 R /F33 53 0 R /F38 68 0 R /F28 15 0 R /F32 50 0 R >> /ProcSet [ /PDF /Text ] >> endobj 720 0 obj << /Length 1785 /Filter /FlateDecode >> stream xnF]_AIlAF$E[(&αD96A$1;;;̋b}9; 'TN3^/7],HmRw%U_ɫe,i|+[iұvIpe8kUr?Å7xdŎ'er{Ъj+^;WEˬ|g_B0Uܹo7/YI-|#%,[$C*8Ip'8ׁ#ܕQrqE3~E;{ugD88>Sw9~nWD:fxû>iyTgWuGm3fӜ;YaY".Ek_E2ڌ#ghY8>' ڽy:3=5HKaWy4ZhúLwb EBY)#b.חM\ -"i߫\ *TBB<[ӈV'OHw(3F˴*EZJ$xߍ߄A{,I)/͎ d Us|"}첚g랉D}OX;`FvLqG׉ IّXP4L*uqV7Q߁58gyۅQHl:`Uۅ`ء-qy^U-#!}EeCS,.fh(WLnިQnl!,׀[9l4`CpЇLsINA)o Ư4p$l()es O.슦؂*^azGl[LLD*[1̺J 1P^_qֱcQy^1mOHd=mݳxt0x 2{y-ȣ=\k8@"%|,\B|K3rFx~/?U;o\%]:)YG` I_+w)qvng9-dSiLZ)ODaGYL/<)d}Ոd}Pu0G)_-[Bʴdž? q N!#:C-HLQ {=5o JkKF P35#8$MlmОZ;,\v7YeVfuv*^RWp' XH}r_i+, :@&Zpk;3-ND [K8WVdZe3jwq!kIm3AvcJJCFT*=AsqR6Yf[ 硽ڞjAC^2ˤj͢U6iOؼ;C{2x~o&uAhNkGvGdExzB!#rQ(R+ endstream endobj 719 0 obj << /Type /Page /Contents 720 0 R /Resources 718 0 R /MediaBox [0 0 612 792] /Parent 711 0 R >> endobj 718 0 obj << /Font << /F8 21 0 R /F35 56 0 R /F38 68 0 R /F32 50 0 R /F33 53 0 R >> /ProcSet [ /PDF /Text ] >> endobj 723 0 obj << /Length 2691 /Filter /FlateDecode >> stream xY[s۸~0 l:dM8v6@ E*${.Ew7Ng"x.xvqr2]HdQZ$jD\\]yUve* e u@cRÆ~ʂdz|`.w7|pTKeuR#˒u+k+\mï i|@۠hH%}2su.y-B 3}0eAYlPrCɋ|S|>|^W\FipX+Kl@tbXfNUe%OU(!| \9Cy[چs\q2Nl6x*#oۭLf"?yqq"a ZȅP`X+XmN>k(N't#!l9Q"K3V;Hxz E8:T#Р_^։[,Ա 2"3>C`:_hsl06seq79g}<'oͰmGg&aga m =DCMD'Ld/D 8S2^LkR1߀03a&|3Raz|ę `fl=JHAL3_+ L*ZgN|Ȯ]bi (;űx^>C؞K#aGBqs<) I\܇xa j7ۺ݂XFJRONQp !z?ɂX&Ųt[`1@f6Ufu7~HsHZe  Q"$8LHONwͧ٫,NX䃵"o!ry^;7ľ_c8C9_7d~@ޞi18;4MlPo^c[4t裊u$"n4▱HT:sKGW5e\pWM̋c 9t#@7> @DE O&LZ o{S ~ rb7-'hox)l*. 5=*IAۜ_`=@X0ve]嗾·|`7@'jRY dxoylI'Z0 \,y}"֣a3ٽh85 !%#(X=qyP5ѬIQv-Y)%K2<{OXգc")i9,;n '8leגr3h?c&XXl|\~!S1aWuWt0qh.F)y]ِA`#ҺV"_I~@x2;X}6sJ ^+%} )"Iy tȞ7سK|Ճ SEboe!C JZӑ! V5!2GPVB*>GNFml}J&I}tW2"@IweK:.9Z˖Ɂl{=~pmijIカ% &(ў}%eER1M&9L'`[O:;@_3R5owbh)?;3dUa '*˄{%j|vƉ07x;aXpkLlyhm1PwSVO*hͶ'ac)LE׫ hX#Nh2NG~(ORQ;"׮3lZpQ~Z%gvC/eՕe1~ۇAL>,Of k EK<@ӑoy#iᑀ\%ǝBZㅏ>,9ZN%5{PaȢ ͝pu`$NE&U ɕuZYhT+or#Z);s'`{޳֦wvlFh/Cx.}_?x Wke4פ_5{4x| t.'9 YX[$vY\>>|,}9\nlՎot i" jTֶ endstream endobj 722 0 obj << /Type /Page /Contents 723 0 R /Resources 721 0 R /MediaBox [0 0 612 792] /Parent 711 0 R >> endobj 721 0 obj << /Font << /F8 21 0 R /F38 68 0 R /F35 56 0 R /F32 50 0 R /F33 53 0 R /F28 15 0 R /F18 726 0 R >> /ProcSet [ /PDF /Text ] >> endobj 729 0 obj << /Length 2476 /Filter /FlateDecode >> stream xZKs6Wik /S;ٱ&SǁhUztA(Yb|1A {;1Kt412qbG/'Ž>N8ZO>82bK v|~PL"M">.ט k߳eN#2bwUmҷw!'P5> `q<+oF(i:{8YUqiX&TFwa] 2_[rSOp5ּMu*P{65E/K=JYHg B! 9! X,8Cs.ذ!=.\nZ~eHnxE -E1D|Η풜e[zA ;9̔&͖H |hqNX&.Z/ ~30Ǚ$ De zCvVj[fb{]--,`t?:n>rlZÐ[gjW5=wOFA:@W^Upg%E LJvJ_,z+*w[Q_ = _^pp$%HIx,G臋Ԏ3`M?TQ=WLRɛQ|'&05uFS1#M [Ue3}rx7fՠ1Bm1xiWɃ_ #l " usA/yJa5 MGEd,OH4Č$ 8Ʃ;h'~L%¸ z 6l9tK_)=}dNv^۰=o=l^RzwZ )Kb`)?!ބÐV|Nv^Ҟ۰=!mSY> endobj 727 0 obj << /Font << /F8 21 0 R /F35 56 0 R /F32 50 0 R /F30 43 0 R /F28 15 0 R /F38 68 0 R >> /ProcSet [ /PDF /Text ] >> endobj 732 0 obj << /Length 3113 /Filter /FlateDecode >> stream x[s6_C0At饙krsyhHtYrD*N]$(Sc%r[䅙I>9h1I'?SrLEŪj7Ѽہbo'/d:YId+哄|6Ҋz*j(/q/(6SammY2rIc>_$rgTz1-zQәcq]Yx ̈́pBgY\`t-r]nܬ-2HXI%KUn-~_,Zk8[L+$Q ?Emg./n$M bnAZέ@x]$\ϐtm+hʿSG5i~-wW`iITMXW0OJ s`ƙR.d \`*gqTUq}vWdmtaH?0영VNgyK[r0 +Pz5~&KkmKqYVvoWvcKț4.xG`XƖ8 ٪ؖ )(]qB%)e[̧i@xHƅr*3Lmc/9@aK,>/F}Y+[Z qmQ(8B-p}f6h]a-?w (/0)V:FՆi0O,RqW&pT &?SQzAjbh Kl(`[BQY_g5-]qn~9?`d'RrVN2X*%Q2(a27kxN`9::;o*9,@Ҍ +XCCK3 ӠuQnPP Ɯw.@zhъ3GnSw$ga;ѠÔ+M^vyP*|dg'(4L P"ff %D*iPAt7Led(#_McUoY!$7 Pi\sh> ڷ'ຳ鱎eg'O&(2XSIAeʲ؈629s0QY|$-l;ݳ4FQ\"T ,@(wCR⬔,HQJ}[^ MQ!&hJo#Ll|[HE7Pձ L*5c  5o{AllLr=.+W ڋh\6-`.Z= /_ o܆te|N f\FXMy] 6*O7# l0` OJ:hdPux9@FqWX>]}O."C}3GӅB ^;.w9nzieFA*r.'/2h4}Od|Ocn;xIO]w(v5bEo73KNワ 7^ \ 72[_@C=5tsSIKG{M6`\=Dݭ4w=7x MejAmzA!Ф-gxc} 1܎LBȍv+TaܱutP՞0(g:8);u͊lt 'h-%mDZin4Y_jTGL#I_0; #J;HzSNI;3+v]c$2 RPjj;P,/x<[-ۈqGf)MrZ drIr{^ J &7~^r Z3Hbi0 MBp_;_,/X/=Z`0mhN"7,(8zמs!h3Ltbw Ho8ewbY,c=0 +Fā< Tylr`ObGn͇^XV]U-:|cDt$l7wEeG"ՃZ4z!`gN]ܼiJ%K$>L^% hdӆ)e!AB pꙌeFus eS]#ǻ”B`hX3=v`L ~Nya`)OcQ..l7 8;"twI&)<#f}͔ iPziݎp?Y=s K~3Í2w7nU ĽPYTPJN 9^7 g#Hd\N`l7' VeWNNkw#W{k6 +Etm*o]9.<}\L#Zych.ηo6Mg$vY "GS@Pwߜy1p5m~:o`*НB9f)4Yop>=|AݲPf^38Xߪ l8mEc0ڝ5xzr;v f{jj?!Y\}Mi:F,Bwe ̚ʅ+O< =-8`6q8tXatncu(Cmtjȕ#P<&=l]R$>s'a:h'i(Ve>jMvBҮe6}bU[| Tt%UԖCe6!m3[}f\loF{n\K9!,:,ᴁ|evLq['v?>\U endstream endobj 731 0 obj << /Type /Page /Contents 732 0 R /Resources 730 0 R /MediaBox [0 0 612 792] /Parent 733 0 R >> endobj 730 0 obj << /Font << /F8 21 0 R /F35 56 0 R /F38 68 0 R /F28 15 0 R /F30 43 0 R >> /ProcSet [ /PDF /Text ] >> endobj 736 0 obj << /Length 3904 /Filter /FlateDecode >> stream x[K6ϯ%, &ڃG)gwIıU+"5F(Re0#>׍FwxysqHGLȊM2(>2鄏L9jz"ib2֌߬C=yTn䷛~%vB3Q7d-~[}x?w !m×m?OD =C` -n#׮l_bN&)OEjvu膾,6<E%qIsvW/។rts”zH7z)dlp'ɈQL%fdlhߒ"t0p0eՅ`YſkB@iZzcE;C@/߽A!WM[' ,% )|5Cd\xuY3/?ȒDzԔԫvYՖȘU0ߒ? :1E5:ˑYQiM#b);D| G?-lYJC``գK%3~0{?^֎Ss V]CSGg X3ijYbݒbbFp&DiM#bmMcAw-layZؤ`Jg lsXU s Z &>fOsɧkL0%s;":_dqT|)3aN#]5F5ZhW79D7D D%h"y3 }r=ҙeiȡ6g ($Щblzgo9~A^}W$dڢŌŽ,!TL=vp90ͳ?kul_;d fV/TUwmU *!SO.T.zJ|gYnjN+Dmn q;@^H1n)iߺ2A2DtT/@oY yucd I Ab@p v|at1 eSͅO>ۓS֛CT;Z Ԩ`Ji0+T1Ũ `l2Fa)iMSnkoB |v$bh-:k0viÃtrـwj;zW抑¥18LC`' ĒgO&wR+&}Oi<Ԩ"C#刿V\ :}. n(@Btn^ 7 NG8ūեa'bk_^e.GVݗK_&eVI+&z$sR8-nK_(vwtu-?=R!+RM3L+uUz8ωB[h \C-LgbI (O:W >86^~鄋Yu>U!{چKhtX 9+wҿwׯS2O.qһ} o9[,r F4.ψE iB6R0JGiDCk!G3m #zV?@m%CAJ^MY=U֫MW7jnNʔnW IYDdRPRVV>^C=oBg^noWNq z nNs8^r;v jZy&n RYܔ~maGEf ~GZ^S|Ac*ܖ%E<]sTe)(%]r]Yq0(Q6Wr Qsl+t$pv8$"ATv&KDAӚFh0ðp"ۭTebD\>kt4 ΔiZAB!@Z(XhiʆNf ԭ#uJA* +{ tjD23 4nH YzEހM0ͫ._ <&GAm7!b͔.Z!9Mېʷ76L3HD8?hM#brsUYwx73$4{JJa zكt${ lw`%klV?6 }*P["Z:T@Rz9 LF58_ӸuYA Z!N? Z;>4<(+pVƃI b#?=&Q L1ț4Asբ JD:#և)R;B¤Ck"BnE'@trM|WE(^Q8-?/wScp, fh; 0 o`ca_ŇCw 3ҫt4ڜj9u~wFV j͝Gj$F| !$8'A@.T_Z0l8ԓ 3=3=?EYM%&|H )؟8Q>Pw_+sIϝ}~l,znjͯ WQG7 e}:7mucW0:Ňv/ѣ cDS,p:6"TArLF¹LWi9Sg&nPҶuNYfLŭ;-IYP1xC $03FB0 L!#%A clCFB3 mCFCF1{_ёrt8:K9zzS~^"nɘnd ANFNېos >x"x/؆\ը=k7؃8/] <(x[ 3;[Ju},I!1i3[~E})|ˉ ]=* F%s$ƺQϞBV{* HuWqwǫW35Xy;)Kjice$ endstream endobj 735 0 obj << /Type /Page /Contents 736 0 R /Resources 734 0 R /MediaBox [0 0 612 792] /Parent 733 0 R >> endobj 734 0 obj << /Font << /F28 15 0 R /F8 21 0 R /F35 56 0 R /F38 68 0 R /F30 43 0 R >> /ProcSet [ /PDF /Text ] >> endobj 739 0 obj << /Length 2794 /Filter /FlateDecode >> stream xZݏ6߿—>T!JPE[fs/mvmD\K4͐Cd6^EM7ųoe4IY$MH$ S*>.,i1 t a6ꇋo.$Tk立.~5䇋~ԓ0OBTxwTĄJ`tG!վ<,caī׳@J9y[+&yUQ3T ,u(  cA nY" 8K4 u|69y7Ži5P%J^]lj/Q?oFU}KZruĸ<{T8MAq_Λe*fҝA/w)<5b(aJħi<'g񎟃)(e)?u8oo)a"Eh"VK j Uhᑳ߽=k͢{;% ~?~\,cLhq\gHn3 Þ/51R7s[k Ƶsǟ^Ч;\ /a]CN @Li>8RAGkGJn;l+<}Qa\O`Q"G8a>Xz WEh|͗$. ϟ=c ?>K޿y/ #QnӭE<X΢Bf8d xW^BLĀP.:ɒRВRpLi3㛷Z?}jeZ$S= ѨuBY+(k a7eE-w~`E{c-u'[_`?#?aemHue5|4I O V:v?kcЈa7h]٘A#6Gq,/2N1,~*oiITL~^fAVlu(ļE/ŰibIb/s[SuY Xy2'Ah!D{c%~RbL(- Lk}ksbDrAZI؈_inEti_D+Q5+ Sy6$`RKRɴҏ#G젴nquLjj:G0|t3>-=b9Ɩځ^)+`zmK-J\v%^5vέ'egIRP3L)/kb2\cE".k,z&q> D \XV9;\yV7v{=diRh**le"\%SfZ~غ4.p֜!W*B)怎 <lx[wM1]]w;P!uGwHYԖ`f6Tm HV& v}'M)1bWCT Sƕ8ͻVzWA^]kk|w5(PF b@C섥IWƸ`z$53"aO+4.~2ż_pRpgl,Xzj eR˼ݵZJ 8+kS'uѕ't?&3݌ls~cRXYlzT>}aQЮ5z*|FFc`.É%b,Li\сc6$άUJw4 Dk12Qp䃶خ ' -?, $ ݜE-b12|PLa"/e8 9Ka/e0a!?#/9l6l_inF )ՄPpjet㗋/ 'OCFw5_dx<ݎs-vCR4Z#vpF\+aQ~ۙyف#&š-ٟ~%48Jr3tBl(E*!4s'+pb?mFs\Q ;k62;Rط9#9l-ck2klP<\9ϧ2i9\)'[Kw2dX"X">d%>4 =મG;žiu=XJmmf0:DFHcb18fJ(! {Zm QD?V@0rIM(qH㮃QykE.+ m z96?o5ƺ`;v%+ݕݬLMosu0y> endobj 737 0 obj << /Font << /F35 56 0 R /F30 43 0 R /F38 68 0 R /F32 50 0 R /F28 15 0 R /F8 21 0 R >> /ProcSet [ /PDF /Text ] >> endobj 742 0 obj << /Length 2771 /Filter /FlateDecode >> stream xZ[s6~PJ3!+A&tn&}h@KD$~ŋ݊3tRps~:($%i,&W74%\)MN2)fr/go؄lf޳؜yt<_(i2 cJXN6gIZ]&yZQ@cL* wM=@"!%~){a?swe>\M")H,#R W?Oz$>}K+ ugq}R?f%$ Qoъbm9#*Uld|޵)J4s)A4 xg<aMh K8If;cT&R8M`9f&w?FXߨu8sZ]-ot Xb1N՝^[Ke@*7̘d;5~ӱKh9#` gϕc`q PL%I5Mk7~q=-WulMfP,Y"_&3 _ةW^bl/ʭAeެӒBYtKΟ|>LP7YEl`2'3~y;l9rNyv|ܪoqLEY|ݔib> T[hϻ6R:`V oUvΑ]Nc ;79$J߂S a7g,s8!Z~3r?[ZhB[PWۇ|i'OQ>o;EٱO8D~;hzm UY<2&J&QDr'RhK𖨕&ǧɚ2"7PRe_Q$ 9p2q$citMήMI%f[HS 'X.sBȹ[۷ςd\z3&*%nw9?,>^8(Iъb I>[ +̟:|\h D-!B nRNTـ6cuڵ.޴73AAZ΋)i^p FnNO1D1MJNTK+ u\*.Ģ!G9Z$ ]&_kwB~g.0+,#iY5ymxUl HBu6fgKS_HTK|S_qurA{gʍ:sU=Q*C{nۼ6}Ɠ 2օP o=,[A8e iviE(.h_c2pYIsFA2ɑ|h9?ERJ3@/ygp5 W:8@hTH+ uv{4ǰq9Z-(`od;uDFcPKmHZHրXoկjgW#bjo73{kPb1O"q r*᭷8rorFˀX?wnK=N ](ۡolp2|ܯv7R/wޒwER^U_djxl2DBlgGb+r}ru{Wh#pƪIC?[_OtxJ7Lr/* 7iΌډ͡j> 8^ᚚ$6!\=vIvEfyr=&S`(Hss_4i@ǃn=\ޑ}3KJP1[Zu5#lfʆv\ -AYEK6!y0WI|&^wXѧx7|oZ9D+cD?r|6/; K13]׵UP2+wd6 BU=i91hz*yLE,qi|Nq4얬XQMp?.pٸt;-dRI}6_KtF]R}xiOeU(һ=k8\^Skָ7Vh+nKө#Ư~Lzj ; ۱/ Ȧ~ ޠ{"fѫ%m5CI޴hJg9.HS'v%-(O} \XpZ]F;jXhEMC̪ 'D+siF$x\eS+S0YЮU9% ċ ˎlke1J}Ͽ3 .w>A'ztb}/䩝Q > ŊAV}vhip02o1:1!=Il_@P endstream endobj 741 0 obj << /Type /Page /Contents 742 0 R /Resources 740 0 R /MediaBox [0 0 612 792] /Parent 733 0 R >> endobj 740 0 obj << /Font << /F35 56 0 R /F30 43 0 R /F38 68 0 R /F32 50 0 R /F8 21 0 R /F28 15 0 R >> /ProcSet [ /PDF /Text ] >> endobj 745 0 obj << /Length 2932 /Filter /FlateDecode >> stream x\Y~_!&ecsafRSÑ֕J9~Hh\X)ʯO8 !RiAglb儦0.' N.N_~ tM.JlP)5IJeZl7HuNdk6Ɍ"&gNg䧳p'o:%Ԙ#Fi}$J"f[ #PTJ|nFo# :)$,#6Jh"dZqBy^IĬC(J͌i+jS*c5 O "2Ӏrnek,O Aw;os+PN7 Z:*wDYL53SPuOz^IĬAd2/ʝ XAye8Tzq*,c;W4OaZ6sN+a2sEuo*y Tq|MpҶ g^wvWN>6]Լ)W/q DWYX 0du8ƫsPz[1.mm EL** nJTDhKkUj386cё݇wb܍"T='b $=%YR`sSG%Qy~BZD 7q&J2G$./o6G@\ŦwXMJ Ӊ|J"fyo;tۥl$ JJDp_| At;ݻbͭ{WO~棸D6R }eqm԰g]m87D*slVGf`FX 3J8LJ=k454cwe;?'ߡ/X{rz#\=ċ:=z֎vlD쎁4JPᨤ~FBe<,)`ex  ,_K3-BçmBxJ :&ÉCj,!'Bhpe|+.owe%n$膏!vx cjXzk̋0h`!bxX"+ (vT[UF͎u {37",ap(5"K+~9ӮC~?B7R&8)e]Bl*GX*!bֻ 4npJ2$jx0 jI6;i!.b^l!u?e kFېN"+w-qjn}]?88Yeq&[d-M~D:6% \z/ =/uB^TJR3F2虂) Pk<31LjTZmJxf<k{@!Z |aG#"{DՌfD2r+I:r{J"f#,C+ExnlVqj'8߸/wN~SvSϥ=;|Gs+#Fxz绁5L7wV)5WUm￷gPdTGRǰ"=qJwSsB3gF~XhGzzw? 0B11C7P#kx(~T*7ӻ 4(^7Ww݉WJuBn@:#A$lp[ E I|a3bNxӴ7.t^+;Cc^58 yQ`At:n1k:v#Dh_-1 AG݁ fA&vS~?d;' ׇ29tBʞƦ؅RcUY x~~Y79YlovnVBzzZBDqoq.wZ4C[mGOq = 1<$سW1ذ4ߪ5Ka9Tv2a#<'b:y^ ?[gb{dqd=~LJ2:07KQb[q;xRʴ/; 44݆ H#U[}t/`+ F;l\ռz7<wF݆}؅t? G6Cw1} Upzۓfԝvׁ洺kj;@hu4}Zyw%1U"į 3AY憬"!NjNRzW1IQUDpO`iHFy QP/cXӇa `ˮ=Bey7X3|b]nC߿߲E{Y^jbqh,&5( ];RʏDvo1~ҀZ}64]xcYE6! xܔ׍}<ڑ?jLо7\agߐYt6iq^5V56r"$?9{|Vp+>Q'X71KD*n\> endobj 743 0 obj << /Font << /F32 50 0 R /F38 68 0 R /F35 56 0 R /F33 53 0 R /F8 21 0 R >> /ProcSet [ /PDF /Text ] >> endobj 748 0 obj << /Length 3259 /Filter /FlateDecode >> stream x˒_Uye'&ry.UNZ`IVHAOR>MuLWyt_YzXWk?Ï#Bh^L&Y16lNBb]2"@X0D|CB$pC;D;M&a^ RxWS(=. K'iMſ=|a8Xm|,eGRu!. 4:5W QaÖ́4X#|ӮAzL"GzUYqvNY"kJ2HֻejnjjP'w_ܖ!5w8}Y#u<hQ3MD\OSyUF+^!pQ-XCԭ*aYmkAm .w_>$ϩ4_PU%K-I>jp[+ڸD)(%t!CFNFvUlF%d 4bghu9!)YVr3w4ʒAh6SO=-x`(Y͈Hu[QFEfZ0ܸYw҃/I qrM3y* ljģaF!% >z.Zb5adyd]o+zRCԾ|ѥ/pJH8Qe@$2*Pa}o*twN'O*&+i&o|?zѲ/03#yؘ5lz\LYt,*:w (idZrTQ4o7xY,hr,hac/tVP& tUY7(ėd㶠:3&ǡ!CdS<XEϴ Fp ʂAX]lY (LP,Q.e;N(Pq0hPcu$@uN 4BC~5EK ^ŁRS"%T1zo,( @F̀"53=FvQBܓК48K'N`øK#+䅃d)ʺbH0=¶Zj?:͇֜ʠ p5(BZMyR\~H6A \- _r.BuJbb{TX̯A# ,NEFIf-J2Tc]-݃BF:^/ [ 1JX\;)e]Y$Kp$VV^.dV^sk!J{Gi14Y[;)𢡊t/z]t$:a{?_)dkY?_;6[NP*QmDe-Cyw̆k|Cei!3^pdCa%&P.H-v56ғ( $Ϗ .lǀ>1<DUHe{r^HmɶȎ`xpGfA'H5*Qvm | 9wMZ"zrdkd\kA!PB lYmjץFvbM:穆4=EgsO/7Wy+т9Ž9~$H#b>'5 CbH<%Tv;;ՇSmlW*eX9~`Agv,;G\~hu]"=|7l}}Av#ʇ3(3lB.ioM~)LH~2pIFW ϟbl%d[1ZVg/>W|DqꖞN[>qS6 9&à~L]"\s=.v=b슯~B@J^=PɅ`GzRА~46GJÚ:SCV<C> endobj 746 0 obj << /Font << /F8 21 0 R /F35 56 0 R /F28 15 0 R /F38 68 0 R /F32 50 0 R /F33 53 0 R >> /ProcSet [ /PDF /Text ] >> endobj 751 0 obj << /Length 3268 /Filter /FlateDecode >> stream xZKs6W-3)"d;뭤lv񁚡fX;NHdo?)y]Rݍ~|˳"zEdq|ULli_>~,70\dW2_[座`;uyU$ ܎SG{}]պ{]<0Zqcc9Ul~UeӮ>]QD 1Y}.opWpRK zy ~߬]Unh'zlME(eL/ҷ :^JpowsrnJ|Y{U,0gZD2Y\+>6յݔT.Xp^Cʕ4K.X/E%"3zeFp쏳,^x xc9ggGE(8-jH^i_LLBLh4A_THCYl&/i a|&;Gƈ<%0i:БNgCgB(4&)R,5rB,r52'%YO&IܺfB5(G |4D>7LZyP ;Jhwx}#v;QY6Y!TђOu7I.:t͕Z( @egkn\͕FY虪"M3O3rvsRbC~{s FR>ReL?ͮȤk-(㩷azi/tð-9pb-XE'IStH9N=(^bP## !H8j]XskOEC+$t ˖c'Tuǿ "T6׈gv MǖpR`2_g7Lärbwu\Jx3QˇveǍ]pcL8%nmc z2M?Ӂ7A<&gԘXׇ (]Fw~mఉmˆ$B$݄*'eg=MDf#~|q }\5)n  Қt^ GzPwmǍ6W.C&GcU=@_Tp:ȧj'|*Wx6ݻ=%fZۜ90$DyʩÝMMԘݭmuX7ȑD7%J.//M_43H?d11.tmi[[ZP(y}詗D/X/$BTy͞M/[o '%Pz*0K#^Oؼ@w6?SV,7%*ֽO*~XcSVZD?0!նu Na"`XWg,'ȯ %n |w7```bw8i/?\|Hӿ@3.<"+.W2+Lp:k8=B#͐ |%RLr 6$t{MZrk*\ [:l{"iXGހM)t'E5656씧퍥"pq-˅)]!U| v&q]B5%޵+wBuΤPN2_}޶^UL Cܶ:Tm:tʷ\@&d> aCPpWj.NQzc=kl]v&M\nWvNVivXOڬK~Mnxm!xx عO+*Sr{ĆL]/kO@ 7alRYFҘ еxƫ1k~|\J'le fDAï!P`Þrp59 '^aT_dHGkgoW) Z*[zD.Ae/sUd i#a@Hϐ Kޅa`0wsɷrOu~>}\*|2aWBH| ،!iT$9,&vt>~4#'[hsX>|6f'צg$B&N[2iF%rUq&R[C&r(sTBǚS{L=qqr`:"(wf.֑['`_ <*̌gsXԧ Ns[1lt =4vK+;`Ovv5nm#/uӺs)"~{ Xw 66| #3Bx𥳐!3<Ы)Xpc|B[)#ln\}G#J%;NPUC5? g(xf>yQ{z$Q@ӗb HL\)bŏސذ"+"9aE&+ p{?e9ТL=㊽Fjk0CT=W(|>˙28Y?7HCęCYb Jmk+z?OIq)}]'*'uC] Ϝ8`qhD~jm> endobj 749 0 obj << /Font << /F8 21 0 R /F38 68 0 R /F35 56 0 R /F28 15 0 R /F30 43 0 R >> /ProcSet [ /PDF /Text ] >> endobj 755 0 obj << /Length 1603 /Filter /FlateDecode >> stream xYKo7W] %cAETȒ]%1Z]úGjR~"=ϡ2//9ZI5j l\osy #yPI+oXW>)GpYaI Rs~#,mh~*sOk˿QS20z\Sw9 KrMr@R"يOUZur_jCF+4,u+DE \?R@"@a`#L>qv+},EtTmDi9̌E\x@0~= 6!qyՉ 7ƪgʄ4J1)iL ̉И8MG]\{MjSi(`9erfYYg { [ĄܹY N'*Xl!n/cUE,3玱M5[ը"v;M7dƬ~ 1*yȳ-w-rs S\zE;~V; 3oEK_741e8=L@G%89 5$ _/ux38`%PIXCxc&P Ze0P},ׂ Wyŗ8n{A 0$_i]xyi!/S)`":|NuCrȻd(׎(PJbjW>ZؓAAՇ }du{-{Lڼ,q[zvN51FN2@8SlA4r l\#OO<ٍufHAeHA^K9pXmja+˺b/*b Ixh xJH c|BFnM/X6 @j0rc),Dvj5[}Gdb67;X5ey[Tn ~oCfz3.:>ġyb^S0G^_H'`aDyaU5,H.xhOՖl~Djq"ha"g?n_* $«F\=AUOHF@^z"`)ep7 endstream endobj 754 0 obj << /Type /Page /Contents 755 0 R /Resources 753 0 R /MediaBox [0 0 612 792] /Parent 752 0 R >> endobj 753 0 obj << /Font << /F35 56 0 R /F30 43 0 R /F8 21 0 R >> /ProcSet [ /PDF /Text ] >> endobj 758 0 obj << /Length 2166 /Filter /FlateDecode >> stream xYKs6W-I oJR-g&Tmr*9!)KEJ7/4_708!Iw:Y;\ﴎdXGCf?A6e|DWOEPo}*X3[$Ϣ$fXC {|F#6;ITPw,=YHF᯿,TDXP( e)IɜJ;|0lm?M#!O_4aMP;p"#TT3=[ud:mp_}R5AB+ьqߵ<4ޡ+gPlkK6Vîa ,)OTGJ$Jk|ž/D}&<  >n@W u?Xǻ֌GX˭^N #uV"]i8=1CPc=hW[=(sLoc~I;@Ar E9 B⨜ `%IP񑵸PW \!?'Շ}=O!sĚُ<ہ%ʓaHw^7`K xǥsL!=\@Ah[;ܛ+hHa$7!ZE4lXTm"2p3lCbB\?sP[X3C!d$2mО1pQpn-5ݑõ"(p/Gn2 vnNkD4^#8f@q~,KQ[*M 36꼀'-rt13Q"q藃ы@Yo[ ǯ&< عoR*h*E4_m䙙'ٮ "(Ɍ]?9_~T=mܕӄ[i K '۲I iO&x bTD .D$=d&8wHegԷJx-AMU8N4R^/\Mﯿ{.z*U)[^UWd[\K7jeTY[)6TI%gxUyHYᶦMO玍rm21BAcɮSX"0W1"UTF"u0HrKT,lxߖc2 Cqx;sn\~9AwY]쪵F.hPĶ؄ *^ =ӣ֍٘ G-&E^j←ie.:Znp5,#4 `3`UN,sQƲRCɬh@-1oyx J2bnOS?p-A|!mS_aδu 4=pφ&;j-vp4m6ٯ=RSٴ)<[j4~+ Jb̠uM}jz2pEA3ףڬ1qyHt_oj@ooKm AEIgMEz*'WuhvѸ,Aף:mWn_ rWn+CIs;Dt1,$~P?K#13B$

dƹ>Rlzncǚ |0+O)u+ı?Y٦d ] U1ʬTttޓI݊~?@zgcz쳔O[gf\ 8_؟~NXd:/hN4*DT^ޡ^}x_,iU endstream endobj 757 0 obj << /Type /Page /Contents 758 0 R /Resources 756 0 R /MediaBox [0 0 612 792] /Parent 752 0 R >> endobj 756 0 obj << /Font << /F35 56 0 R /F30 43 0 R /F8 21 0 R /F33 53 0 R >> /ProcSet [ /PDF /Text ] >> endobj 761 0 obj << /Length 1729 /Filter /FlateDecode >> stream xXYo6~_!ZERHmޠ<+Xk8CR$g87l8yC'iISb~*@:{rrf|z{qLe(]5P߾ nprH +&nKOWK Aiݖ^OӝΏDѝ"gIOS"JR*oYk!eP#ĩ XC*vrQTĮie[[ͭ]@e:k\oMYZpni%hb%q^F};`hiQ!ǓR(Q0" RA݁sb:!ޯsW_^҆s(k((&~o%EtyF+TvqǫUtm:- Wh;1VY/*o %PG(R>}G{ƚR \>.x aouI̼`8n[3!CS6= -/aUFy'2$HU$0=ޓ4b\a$v6`CDJczL"7/y'wϗI0*Ϭt }B9t#ˁFSYNg1hz0_o !~`^>f3k*gcH ƨ>/O! `.4*B≜9k{֗+ A^X!@ dG )_qxɺV\|c_՝hCOw42^qAzA9i"ilk5Pl^c*.gZ8ZU2V7 E6Naûӕ_\uk t_oi~B)o !m5l$`fOݖF`'.RmcllMpKaN1npA_-jGR$zP2{&o_l{`"3iBijuaH'a+WbHEZ/ӠlsqIKȾ7}PpJ)RcAb_Sh1?u9g1@Q̖j?\UvGzy᧒_"R=ɜ/z5*]VÔïRp&$!7 {Ce٢ ='1CFNsq,VJvQ|*b )? Dȅԙ{U~]lrj}aQdB{A! ^ _\{QW*Ә5U!muXa(>f$c)t)v$ԾgxO*dX()$my2g_fcjszٿhGձgs/S~hS3Z!m4?{B!XvVLPQ+$?ߘrg>=yJ)OQJKVdž7õPjt:qT/1Gz,>Oe6ޝmkm8!c=W őZ q8rnd yNƾi %$bqc`B>ƃ>&<=lh'5l[)N!Ĝ 6@6\Gr;nŦȖCn0 Oߙx6ZN!&Vj$oT3 endstream endobj 760 0 obj << /Type /Page /Contents 761 0 R /Resources 759 0 R /MediaBox [0 0 612 792] /Parent 752 0 R >> endobj 759 0 obj << /Font << /F35 56 0 R /F30 43 0 R /F8 21 0 R /F33 53 0 R /F11 65 0 R /F38 68 0 R /F32 50 0 R >> /ProcSet [ /PDF /Text ] >> endobj 764 0 obj << /Length 2291 /Filter /FlateDecode >> stream xZoF_!@\:Aq-^[hX-D"e:KQsDKrfvv>7[9]^NTN8chj|7u=L(mfG[wLxs1 plΣbRʨ l.RUl"˵-.aݮl(ww;RJdηj[lfXeδNb1ރnCKfcR̥J7b: K2eIo#cZ0ѮNt`k{}9Y^TuIkd|zDs7t5VZHP:=P㘞Ӷ`w U5)g"[w<k&$KUfՑ+ELsc㪠kRm}x4x\끵uFk]\#[z ufY"ҲjE@^L)+(,!srmQc0D"(Lfﶲnb< >@;Up_u5}F*tEf~Y[J"錉wKn;z\M[+'ۙ+Cm?gIڡٰ,[.U]^l= QF/PӰ=HdL\MEp.L 4Ɉ?ՏR_[[hNmWqKB٫ybaB.S)L2"E]a+XzüM+oJfxrʁDO7F*.zuP[[?R 1Zj}ÄfUبWYꅝUfUXPW?*R(U'SP,g,F=d9{)lDvx*TSp[k~<%w a="xcC WϯndYUnʸ${WnR]' gWGn16m0'7ҕa:}複8Yʘix1SZ8YdL')j'Cq0yC6ޠ**Qoc-L|j^\3*_ઢ<="c[N]G!Fg>r d,ɧ˺א",j`HM ώa8P&mf99~( %teeR q4N?& G%!6 o_@4!ǩt@N\cudJOֶ]ν@yGh\3UP: OCm,P{:6m|@MWׅuA 3Z$βOܘ!uɓnXM9ɗcE+G^+Q;[]%J/Џv_/2 KF]JV?R#s*AzQ)xʵd|j$4_Z_i|!}#w˥oT7=!"%b^5hrָ=DWů&Q|wX\.~y9,r3}sXc*B> 3G endstream endobj 763 0 obj << /Type /Page /Contents 764 0 R /Resources 762 0 R /MediaBox [0 0 612 792] /Parent 752 0 R >> endobj 762 0 obj << /Font << /F35 56 0 R /F30 43 0 R /F8 21 0 R /F11 65 0 R /F38 68 0 R /F32 50 0 R /F33 53 0 R >> /ProcSet [ /PDF /Text ] >> endobj 767 0 obj << /Length 1546 /Filter /FlateDecode >> stream xXKs6WḦ́0˷QtM̴Z,NeR&8]iѲd\$X`_>o Xl5$R(>ɖyk]ُod#I4 Vjro%LERԗڵ6ݔ{c` uљ0R^2_D׮aG5ErDh9ahmQJTH5m]L n6_ sg=ҍ{ OYF> xX"B)\ [ebDGًvagXAWaRf6 @v6tbηE dy5a@oK6 gtg\X$">7$" |HXଗ|3-( N!rfBu!dO!M:|0b W> lCY HD߈V~I'U`(pǸ*7g08YF} ㌫RS|ub;-SͶ:;~ <<`!7{&P։Q%:= sr"<<ٴ1F?Olve_~#JLNOc~]֖eW[4:mW5X9$bAC^/"4XO4h 8Qxs}A"H2u^(۱n#,Pbm࠿|? ,Utn7d< ].мI)ErB*$9 Lvo7Cb90_8i*Ws/rsb9yR^۶F]{( -PͥJ wk62sP-.8̏ҼM jqWdP(}A{@R K{ +vԛԃ`*j|s&oD;w`f2 =A `, w;ݴ݃Dot?* 9߸\HZ]o`߽h8y11d4=44ZPLbBnt!|1^ N endstream endobj 766 0 obj << /Type /Page /Contents 767 0 R /Resources 765 0 R /MediaBox [0 0 612 792] /Parent 752 0 R >> endobj 765 0 obj << /Font << /F8 21 0 R /F30 43 0 R /F35 56 0 R /F33 53 0 R >> /ProcSet [ /PDF /Text ] >> endobj 770 0 obj << /Length 2066 /Filter /FlateDecode >> stream xYM6WhWԢ MSv-@IN3RWr i7z)iDμ_/'&6ZFIJDhczba %\0 j-%޸C,aҰ)ޜ)m cSwTIۯ4PC\,tMu}EZOلgoNav$wnX)JKuXLJ,O\Ȓs#l*y1(D:?zd|jiE|lVg"Yd"#PqPdǾ^ޞxژ\Nu0e_&ը6Fqt!0uE㈍N7K (ݮ8Ȼ֑gH?EB]wdY ʿw]`:x!\ (8uѯBC0{IgpWt.ܺ'.Vcn&LvGHt>Y;sjѴn. ˌ!Rv⍣TI^Q7x}4jw5G8:j@`ޖ[/7A2rj)A7]KO^ȷE3zE-\s4ݣA#"s? ~>]̀8%꽄* ŗ_$`'@6]x4#B.l8VG3ndMH A 4"&Sȹ3 -$4t*h42VDל6݌O,˔ꓶ˓0K\<[/8#H  2߳h2B| @1W|yFꏘgRufޏ=Ubx%6Sj۩q m._I iHm&*x> e踪e]#}f6P:;w7]YB+v3>aB5ʥ̩ ; re<}|H- >8)ȸ]}){ĝz8}CE+#Be ៉NBЮ'}%~6}6<(b2l¿|~RJBa`pδypj eg.2̤yJt4 o >PIe,d9gay߄bRHB26\~5t!L _Cd~㎐cAp5<Ɨ䁑_M> endobj 768 0 obj << /Font << /F8 21 0 R /F35 56 0 R /F30 43 0 R /F33 53 0 R /F38 68 0 R /F32 50 0 R >> /ProcSet [ /PDF /Text ] >> endobj 774 0 obj << /Length 2003 /Filter /FlateDecode >> stream xYIsFW4EVX4$LceRv0BH5R.b/_{KC]N~04IhW$:2H&BZ5\|j/Q׉DDN% yٷs5/JN..' TMsBnl=|]N9q"I-PI2]OHVwVAW;CO1b>O@7-sZO^lDG"RWT[đ P"q\y񡡏e:7jVX_ &,Z70vBF"ig6RDa+tK(7BX B'Q3^7=e,cgJHm=z+Pgg׻228|M;ۑT042O{K.EPy$llp QZ;[ Kh_ @b!ht$B301R2lu&32[;32(;U4,2F}%9'_xL)"N7F*;}F@E,]8R 9s8HPNȵ bh 17 a%NL5(! ? z>S%E",4Gz_.=#_C;QmՈ37H՚램jōr۬$Hk\&=`AIUUy2 r6 r-y]Wy +;l Ik zWeł5#,T -edH7 ^ αhf;@[UT0ȥC(ܠ` h>u&Lq8[vE%fgG n2bŁQĉ*ٳy{gGeY= 2ytd/:Je[mycuv!GMO(&v 8 }| ϞVKQ6ڀM}O1*~]>.(6rOQ,Ө Z2 ԺgORtg~.pdQPrFhۆlܙ "mFC6!C6 ü#ژ1eaX =+p?KՈm$V'WFӹ԰X}늊жiBd8oop!N9?|_Sp?KE>JP6~Sڛ#ʯD匋Vd~,ŸzNc^\Gn^3MHKw 7kU@>ϱUpO+?10\^!w VWKxIO۴/=ۜ+:>[g/y5xf2J^j,#3hzL$Įe4`Y-Loqm|wX3)VoF8Cjse:؈8i1/*PO$GQ7~v}&-)ک7e_ z]#i qP(%ղrq02FH>8zpq%' x8ޅ§Zq?>OsO> =E1/x^|p~Ys;;E[AUQnMYlDVnw".Y/[7ʜ UՄNӡ˼ v&ϑwJϸAmdC?-0 endstream endobj 773 0 obj << /Type /Page /Contents 774 0 R /Resources 772 0 R /MediaBox [0 0 612 792] /Parent 771 0 R >> endobj 772 0 obj << /Font << /F38 68 0 R /F35 56 0 R /F32 50 0 R /F8 21 0 R /F30 43 0 R /F29 18 0 R >> /ProcSet [ /PDF /Text ] >> endobj 777 0 obj << /Length 3445 /Filter /FlateDecode >> stream xZY~_!8@"VO_@{ lq>p$ΈDΒN~}nba!y>Z^]WJBUW,juu}{6oo~mU!mUJ҈wZC٪{qntO0:yϔڢ4?n$rN&n0ngqzٷnz{{C"'vk@kefldD-)nV*QOљӀROxayA"(!W^ ȕevDd;]\+)L-*J"/OaG*H7g B)O0P x,I-XDFZjLL,OO&)$ɤVH)bb2@[sf-V6ƖrƻJ4l ,ť'њ!{pCػqvA倉Qqjl88f0ԇ@g|7SvnCMZ5 gyV nX?tP.E/LY{o~į_3w}[aux0jy۶m/IL0Skr_91nx"V#~KAf~{[ c5n(/|)C JBgH5'|e4eSF"Q=cDKrY}[kAusA($KrqKj{>v}4"KÍtH6eРlpA@j w-ɯ{Mtk5~qLyәUSu*_HDGlq1<9k#K2P:W |k9Wi|_6AS@04|qɏW߻GJ&1̏YBt!~9B˻;}!2zHɨ9|qT<4XJ\Nv1`E2حty#ĻՄ»S&"33cS֑VzM- IgJh>S"!ZXm07?44nv~ _HMߋ +0(h~ tff Py*Hѥy&h)IvsCFaWQhVy1|wT6}cq'ʨX+1|zd)$1&#LaT=IszRc,F]|> xCjN_ꇆ=EL9:owL tI+bi;!ُ&SP9CpPG` ~HwcL|m¡p!#8?QޑaWې[J;qu=av4ϰ#'zn QESit`(hBPH{:vqV#.62[ AbzIy|ak;A71@|܄d:5wg.ÖN63ɗbPtf>!A ).f+3p"_0ǒёM?dLQSlss `0rcH6'YSƒ'/,TInd\mHVOJ0UnxT{>z"S3rU7TO=: ʙn-4~qw 4SD9j9{iHL ٿ_j L|{*GF۱/_%koÆ\' U..{+'cd$)u6`=Y&$H Z"ㅢ(C iv\MP_ߌSqH&$u/Dr6a^$TsJV.ѓVa22%xN/ƪB%P ǣ\|Ò2 -rN*SGiwa endstream endobj 776 0 obj << /Type /Page /Contents 777 0 R /Resources 775 0 R /MediaBox [0 0 612 792] /Parent 771 0 R >> endobj 775 0 obj << /Font << /F8 21 0 R /F35 56 0 R /F11 65 0 R /F29 18 0 R /F28 15 0 R /F38 68 0 R /F32 50 0 R >> /ProcSet [ /PDF /Text ] >> endobj 780 0 obj << /Length 2363 /Filter /FlateDecode >> stream xYKs8Wr"SLȜ6MU河e-+!);_?h$E&{Fϯŧ,1< RqbŃuxYn6ZK)k/r'?) Bgk˕ \ 5,׉a[Lpퟣ5?UQt[|=#jSfh`Гh-Jwmddq|]VXQnbPrMZEz77%c2\ ,u 3n`-5d|ݘ߯VeKD l"Wo`_V1y`-3יg'mXDxR.QVo+<-˵(dr3P]6Ym+ayо^Rd>?VqXn;ê­k* V^"rvs2(q>sJ&sG\C<Ĵ6:r8TյE\̡ -v6%ͯ_׵=n!sUۅ4[Pl+"v!ӉZfAzNU6slo)S+k߯Bw/[2Շb4K*q/Yy᥷i׌?h'n/@ ۜ KƟxD=Vm,EyYb7w%k#~wcnЅ6 WdtGS뢀mx\,WUMO 8J1]%Pؓ!;:L aT@9 =9D "ÿ噒b|,Qܩrcm[ޕmloaTӴ-/m~X:l--ÂA|8$X*4⾶Iu=-ѫȲ*v topgT!X,\Z)cTBƔ#ȂHw`H<oDD[-IC]bPOscm8r7w&8D5HC##7 &;0P\Xܴ-|=Vu6Yϵ`YP[_}٣<ѕMg ^èr7SVS™y4ԅntZmsb[̌͞ui ;}Q99t~[e2X3GI{g{ Q'aDEұ~o/ 2Ns8L]2vx'PJ8#h8Nle$~K@wD3z1Ui/Ǯ')>Xޤ=}RYӊό[7T{Scl3ܕFA|p.0H<>^e s:}'ĀT }omo,tw@a{7~tF"&О5Ѻ fS͠h7ݩDfOqS_( LjI}\L\,^',9*dNdGwg~CS`RV-J1¶&NάXh7.b r9jvQt8IRT>'PI;iT:Gq\?PLO endstream endobj 779 0 obj << /Type /Page /Contents 780 0 R /Resources 778 0 R /MediaBox [0 0 612 792] /Parent 771 0 R >> endobj 778 0 obj << /Font << /F8 21 0 R /F35 56 0 R /F38 68 0 R /F32 50 0 R /F28 15 0 R >> /ProcSet [ /PDF /Text ] >> endobj 783 0 obj << /Length 3033 /Filter /FlateDecode >> stream xZr}W)Y RIle')i+I~HHb-HZӗ@kmʋ 3=ݧ{uEBƹP.R\l~nw hV,bv(pכ+ #B.NDgǟ*^|w g'J<]uu}Ϡjuʾ Ç\d2P?.e|\iׯFnD?6G1C^ ZXL]R֞ Q"Β@4Pv"/f6ReFno;/59BMOZfrӨ9B[dT:z"HF%aN~jS-dz)땝ɠYEH9Pd48!d(%磔Hԅ@ Nc"hĢgG  +; !W;cΰT'Sq@tƎEvvGr}H!oW:-ݗN o-ubRC§I{5DELsVeS,A~@S?rܒEM C;w3 Q~^U9ܴ%LCjaD5)f&yР]W@F-Y@!w|K:$r=N KE2v LT:>e0?gUBYJ~;X1d'XoR iT/Ef u!͵r2U6]]HڂU9Ss»Kh5\/e}hgj~v;.E=җgMRgO[x+hA@mwi؄@Q;ۊR6oҠm/;8K|ГhtwbJ42~p]~Gؐ,~l~^(:|=!"ar~8QuTF 9BVRY䤚~WQs.A~e+P(*֏!ӆUp*OOhfZB $֏ n x<g7x`jmkQUq&,<u&aVAh D$30AS"xZyCf`\=pVeܡU"dc~3ZOMp??ʣ5Q"'\zՍ^9g/*vqIw7OXjO$^ NyΙNt Uz]f:њm7@Ā(\*A)hq ]3Hʾh(#9x{ev2hئ=@I6`B@&4/2#.4tX*3(%镝AB.d!1q!1u~;޾Qޙ`Nv| -2(VUZhk9P,3[Z2 @`zoc6-[n#⾽} ;ǖY~}Dرʺ=\_k.Q$i3 gorhץ<6B HFrFWoWS:Cb)Pyu|LQbvES<9~l0& 5q_'s~n}Pz 1dL}٧l?"{ Wwifб/Ǻ%gLqTn ]XBd>xUԁپ_VA~l22>KKkTq,l*ZB"3@faK])E2c6 nu}4ȘPMLvs ~x50I qW_ޕ&Mf{=g8Khu 1!c.TEVUT85"K%f>lMEfǦqOptج+ &$f & ja{^PmeBnP $E!$n=vnacs R¡6_y<V_y&7EN8w(*5~v?$(]{wxZS7G0 kn!JLTpޟrf su/08߻V[ "d(H *;r@ OZ3nxeiɊQG #-PP7^ g{}-v1|)_Q|ww}p|=c֏͚ڽ]mwbƸ~ k"p3XC ;H3S&fk4GT~(`MmLضd6bM}S##~q::S:CSr:+7> endobj 781 0 obj << /Font << /F38 68 0 R /F35 56 0 R /F32 50 0 R /F8 21 0 R /F28 15 0 R >> /ProcSet [ /PDF /Text ] >> endobj 786 0 obj << /Length 2936 /Filter /FlateDecode >> stream x[[o#~P_RI~"4A$muI[ʒ#8pRKd`x$s>~<vy7$ӛ~x@fz7/]36}F&WahqJ͡1R^q< S̻Ix'Doo9} Φ>ƒ&~~&/w+$^B1wWo^^pNvq/ٲD\ |;NF2wIK, QQpeS8Y~8=|g,kl=NS+@|% yj#P ~v4MA3{ =A)lz=^.G Es^;tdb|duԀy Jp a|WO]2PBě#,v>+nq;x6#j Y:Xc;e|M̘e[I$&R oKai͏Q ЌHe&oS<+S]ʾvv?o5c~VpgӁW0y/-;]kWk lJ5=[ V08f `ǡUC š\یX֚#kj[ayXnJխNn&`J}Y:Y1Xn2XSâ眶~TBMeP24L><.84݆6GijCibbjx_x2ơ)B"(A〷Ըi:fC'67귾oujsLW Vzߟ4PA)Hb*`> {jyGsCjŭeK}إbr]%_=W!Dp~,jz,` cγQhF ,8Qxa^VctƫlM2Q$[ENKa ;;rcsT&RwE*+/(4☞&$Ve/_)Rn2BM͠t` {=&.fAv( Zs%&tj ZHBͥ5Vj lAfRD3` ӄ,9)q*~A1b RUFqnoOZBugu+tr!XҦʥ2O?,ڄlP}W:wl]9T%PݭaPx?A֏ ݄6H~|{LUWK]i!!Zi WK,}D(]mz՟ +q=<'X-3ezM_}j ?91Cs?"A|IZv`7R\J Z Ne3aŇ3 4 5LbF3f+a?Dv,:T8vTj (F9sfTu[viZѼCsAnVi7M,y=V,vf|X@8v(qJ8((0-. Vn*mKΏ|(ŧ_q#L._xn'C5GW86x g ^n]9D2'fD7P㻷p[fuIۻS>%;n[{q"oGiߝui-YN^*eLcNG|1DfKmTԆ֩]a4ƤSpeC{V]%;&g$'!2RngY8Ul)](#'2|^VpB8=fE3c8uD| ~SoE6fEP;TO (bcǂ(@_HAXI<.=+lH Pyc`Ot.aq)%*A~Cc9;0UuAcRF"OJ+:UuC7&)>tߒcCSTSr^8lJZ : Gּy"wUN4=l D* ;>)&Tb-Lm< 7k m(06*k2 VȰ`خ(3d&|\`#H[ȢOwўPh3a$ q7oY,PA#Zbt87$Ym*hC5;Fe@ VIGqXw!K8g]#RdHG+^}r2:xӝ?g9C[u'`T t@b-ҢS71d21&q-/g>uSb~tOqq(,t WmPhCȝOgNP!ޗ -C &S|͜Шs(Y?Kd3Uշ=H 62*ǞdȤ>F<ØUN^\%nvg*^(PEPxkܨl a3RJ–.R4qσfx:tHWzr 7>gBˋ?B!%γىs+LHX_y:͟MgӍ3VZǃx JgߪΟI#|S`,*P'dBV멒{?pbj"</wŧo{l-YYna)$€3OdV..Pm jjBnل߃,G [/!#/K<zeY hIBi$[g \ 1K&Ҿ풉y&I2uBjꃴyB~?@}.T$U=N8DUQݽV ړao(qQuYIQKxp?6s qҌfa3Avoɕ)!?+!\UOu?_.s(3.X?؁ܧjtfv] zXr+EJ(B%+ќDrU%{#fl T#7~Cߜu m.lչ\3 !Mœkk],j&VOL&0|F+,;!rȴ2Qk= Fa:'gq >\h = 3\^T4D ABLi&4;]Bc <叟uCia5YZi;j " 5)zЩ8 G6HV!B2s}m*NG@#[9nuEׇ膪^ jwhsQ?6+NH$CF7ϔrʃDI>L!%T9:p?\XUi۵[ųr|Cp>n3 {7 o)Vf>ฬ(ߨ *58}x{N߷?Y}H>^'ଏ؀|' V/1-1\ի?ztnZGW?"ʛ-=/I9=OD~1s0炔zQ.-+ CNʴ)Zu[Ck[yNK膛%  TQ+7'eq endstream endobj 788 0 obj << /Type /Page /Contents 789 0 R /Resources 787 0 R /MediaBox [0 0 612 792] /Parent 790 0 R >> endobj 787 0 obj << /Font << /F38 68 0 R /F35 56 0 R /F8 21 0 R /F28 15 0 R /F33 53 0 R /F32 50 0 R >> /ProcSet [ /PDF /Text ] >> endobj 793 0 obj << /Length 1490 /Filter /FlateDecode >> stream xڭX[oF~_#Da2wJjRJ<Waa˲N{\X0ة╥9͙s0(3eMYTV>|zE7+JɣoN 3&ڭ^]Z1ztz7!Fz3F4E].Dk\cS$eqଈqmP:bɧ7Ae w!ٻ56Hٻ\Mx?OXj+"'&7t6SH%vf{ a{X ̳jк| p;nR!q#f~G6m)oD(*;T)!/ˌ.~=,5 E,{M`O٫t*"Z1J RTo`gܠpV a{+~8u+ըnF4ͮ@t;T2UݢJP {łihGΌ"4*$4~{ p ]P> iunDѬ 7/(eLсn"n[vm>XcqޞI)F kHWhɮqt( }LP5^WVϲbmk6BV*wOT(T8O`N/=?^T<ϣzXE -6g_BQq !CǥډH&HR ]CvtKɐ>|{ڵ֮ت^WMݧ[틏w8%업E! :=`׵hxv]+V0'ł\C_YbHDS>q 3V1#8f1ef 302xY5Co/xTB?+K 5Ƞn8sQ8!ywC jH(s ;eN endstream endobj 792 0 obj << /Type /Page /Contents 793 0 R /Resources 791 0 R /MediaBox [0 0 612 792] /Parent 790 0 R >> endobj 791 0 obj << /Font << /F29 18 0 R /F35 56 0 R /F38 68 0 R /F8 21 0 R /F33 53 0 R /F32 50 0 R >> /ProcSet [ /PDF /Text ] >> endobj 796 0 obj << /Length 4981 /Filter /FlateDecode >> stream x\Ys$~6'T0o+yf=Tx#l?ԐECdnjv7WPE ;vC1 H$e&dcnĩahN/O~>? = %pO sD N> tH)(}}qo;uiqzq;N/c{w<|Y#\*zܯz[z _=7rm;ş~}a8H_NI+IrwB;bLn#X.z (9asJw?vb՗pF&u(-P'^>51y+7A뻋 ه-"o~ܓFs&f?GF_d\-OqĪ'κERMA+[ɓoa\c#i-8Q Ր4"j>ĉ])G)DѾٶ?n7?2Wu_p6%h-<94^ᒄ??l'Q].uWDǠzx$drC_w۠WWpLA+x|Kk|xv.tFqB> Kb8}bC%?U3(T+EGHx%|Dv_n4j b `#r/0ŠLe9^ ̴R È f C)!hB.faFo A5=l 6u8anKc)@jKI X*pVYbU* Sȣ5ZUp7Uw7S B`4 S`k`6]*?UXοMha&>BՉ8~ >">YC|le mކ^rgt^b𽻚eU0 `Ł1'*!{(a(y;]VpH-s$QӒ SfY Kf>rEэӈnSSL%㪌] A0zw;S C,+losi?Xh.{$ZMAlW`饲w+XY2ȣH5Zpg_88\JBpI_WL<2ęc!;"R@,f&U Ap/vvYϛ Ͷ@,ʧP)FmN -'*Lv~boPn ]Z a<0: y%</?LD"8p8v@.Qn}i:}|Ya|žhMQn_?|˰;SxmB!.$4irs1qߢݻJ^Tܛdvj?^>ރ6ۮ*qU`Afn]#Z:켙2X SAq# ݶ>cWGXl>~5>Y:5bL>p r\&jʷ[488iMaEN4gj (#_?'H'(4]8oKcLK{T+lӘfL67Xv$Px7ÎmpSxp|Պ N<A1xNX[i5i0L}wCd8?NuPMQxKy 鼃!沘w3T-8L8㏤/!db85߽&%9Hk-h,^fhnbʯۇ}&H:qRx:uq[|@€<]HwX i5i aa6 WuVII;o y6{On$,q}}"Q4Ĭ6sbR3LĆY'YWGD`P`1j b~KaL0pS+%^!ݨƘR[ cC>.iB .PKW:"Wq/a;{6&sA#N;B[P z,,:"Ep=[Jpsᕛ5KP=ӗ3+jX^O_Wڤz/yI ZXL3 Sِ@)hMaB A0< 8%$Ot.W: Qr 5QkU#0 A,Q~WǗonCݹOvާ[o1CA,z }~+i&3_H(Wl=ed% 3?Ζ݀fg E5KX|l>}:rBc!Dj,ղF 3huMٳl(jt-@"9EAiəY ʫ砂h[<\,@)hM@J3+~ujca.ZN1-Epkm-,V'9ө[ϭOFC.{"M!슌suίÞpahv*ޥ[kKDzD4j ZS 2Bfa.ZNQFu Om g 挻p6&g}t7JT#Ew1],5[Tprzz$ZMAlJ:Y/aِ qPPX0'_еo6Z4 { ʖ2I?•%ZXjH5=J`J-e*%l `,%F! 2?,4$cNæ 0f*a N_ wy\iO8#R;GQJij,q[\2WVç/hsεbvN$چ ?၃27,vPsLH B78jxb$)P?Eq\>1x Gm6QtlMaY;˥S~/Q,I/6(*>pG'j b$eۀl~[ނ8 l0T6{ZMA'>N,:\,5TI"qW?]FC]pf stQC6-U/m*+Pk莬FO޺9%!̔8> 3oR/]jA wX0 yb0q"l-?d^B?8X5eO ϣqax[y>C51VlJsN<x[GcQҨ_a`޹0I#ɢ0i-3WݤJ`"Ec7=c ; Qy endstream endobj 795 0 obj << /Type /Page /Contents 796 0 R /Resources 794 0 R /MediaBox [0 0 612 792] /Parent 790 0 R >> endobj 794 0 obj << /Font << /F29 18 0 R /F38 68 0 R /F35 56 0 R /F8 21 0 R >> /ProcSet [ /PDF /Text ] >> endobj 799 0 obj << /Length 5272 /Filter /FlateDecode >> stream x\[6~I\Fy*'dNrT-qfTH$/ldoU@/_7RyYݓ?ǿœO\\X{qD+WO^?',Փ?}'m.`ʫR\\-1Y4K%g]fֳޮ2[>l\cϡ_< spK k(ZT=YKiEֲ\8%gvu.}oK1˯vu`{1}˭8cvHg=Lf-797<;97a*1SN;밊CS`1w@QueQodF1XeAx<847́P46i@g~Pdv1a͝} M/][wJ9jS,¤i}uՂڸ5|ocזMHL 7((0Q<Y6F$m1ร-^0o |PS`#NiD&͞ ;4*hٯǩn5{Ai,8Ҟ,"6uT`ÀMD4z;L>(WG@[X /9ran7}S~>y? S iP"bSw]]B\ J 8gu|z^RwZ\nw*a7ܒ{nh4%yؿEȉ؉}om֠uie f)=(Q-ǰw8*~Y'U|IdT'k!x) ,wSDqD~U`X8uؗJdYy) q2 chA>%@^K9jl#܎aZ:? 3#cxurw0!{p*aލ lT1i0Α"Z9< F0sOCur}G `Pż߬SYX13^|GPnΈ|FA( G]EĦ 6 *Ny\xv#BMQ +XȻ%Xˑ:-T ;50cǴWk} չџ SD/8IAX>b _He-AJ8 rhk QieDa@ Q05e^r4ἴ .l8Wsn+ NY?/8HY:> X Ŋp!%''y$[>r_89٬=*).GG-uwKb ;*Q* _6V2yNG+MQj2 ;_]EQg~" Ǝa P :6!UJyg 㪀?$0ۮlTO@vmâؿtzYqfBeY9v9*L^;YM$t9,#hM + uIڟҘP 0*t(KqL[z G=Nu7]8LǘO3RaN0EĦ ,L!U27q@rΑk0EZ @3S0E碨YvASaL1d|:$,?7.D ptO&wr?ӑ1_#0FI+iO(c;5b &8}:e9"#֑ px>$%`e)y1M$27q5-&/T5r"Af@A,lVu̩#"bb~gtKt^j k}>lۭ),1|E2y8iT01R'X'o>с:J:9V@Ueѕ*pիoeֻNpTDj3vURn]PA'TueZYD,%řO;50稪(UU#k;4V|N?r ݊Ϣj^f:uo\GS(X$%h, )t`e{LwᏚDtT8Fb!& wwNfhWÚ+ggl4Zڻf2 %'J͚RQ50w͝d"|)W&~6n3(1\Gz1;T#7o):8"bU 1 3I\\RpKUrX]r8ə/bm2c~oʿzN'QޱϚծՊĉ{ءR/ԱB-]P0(WiXObZYD,QAaBC؃ CU~I,(16΅dHxҟkg"[C_d]w gz|̡* ޡ*UV(a>,w|WDlӂu.=ˡ摋*;-ϴ6/ SVStǾnӡP*t8*EK˿|De *Tjz/lxlOBX^LMÒa*رg.֛!]l(ԃ`H6!s_83Y;!Z3YH@ " ? -<䨪jv坪d~#.lO`KnZ>w[x1{ˆrL9sJُU\-~oiQrŝk7k'0Icb^1!'R`2]|Bnvݵrm\2tRXfeohID1XL&Z7O]6ϗVR_r>f3Bvfv. M EN-05VQs,f,pu<Ҩ/OxZYDl7ӅpW}yݰwwU/kU瞣2txXo .`$)?͉{rC0C ʞCHm`l]3[/Éegen(oM^5G7.ŹvDJWD:ntGugwxw пwe0X3cH*ţd޸xkBdbdo$7e ^:*SJx>2ת#잣EĦv|9l¡mX[P~E5[S\HN #LK=hv#\ o9RَVKYXoﮞqZW?c#)kG [w 8\7;o5eY~ioKvz#ThoQި]?\#QRAg -`dd Q"RS3%RЎxLeE|W³(Ӿo]m|Ə&x;ؤ3r] 7J_.4ܳgtpG.ݭD=&>g|awwֵ~P(Vu\+7bSq}*i\ 7܍R1?f"&O #+d&~ϳа|F>zh-17QXd> aYBO+"sVQ5XW|d2D endstream endobj 798 0 obj << /Type /Page /Contents 799 0 R /Resources 797 0 R /MediaBox [0 0 612 792] /Parent 790 0 R >> endobj 797 0 obj << /Font << /F29 18 0 R /F38 68 0 R /F35 56 0 R /F8 21 0 R /F33 53 0 R /F30 43 0 R >> /ProcSet [ /PDF /Text ] >> endobj 802 0 obj << /Length 2162 /Filter /FlateDecode >> stream xڽZ[oF~ׯ @ ֘3Ù!c[l4 H@K#T&"\~3rx-Wl9\fv&hH0 n6b F4Y/JCX8 {}M spRZ૯(Hze ss(օϴq|[(¾<ӡ"?jG:ȲĒ"/+s)!! E ^G5l0T0gY'q CB$1ĉ}~XKZ:QFwX||FD)j0,1?$(VclTkΦO<؉ o- fOĉt{W CSfV gPy.2WQb e>,Qp@A5fO$PYuN;hj}ʤmxZȒDPoi:G*Nܦdd_cnfZ;&1me-=a}A 55ӝ(ӴG-Ɔk+׫G.:p{!ĦK dAG`?@+k HzZkoPş]ƛuAB$ZQJ=Vh" Ʌ@<?RđBiq EOKXj4xlF4 : 1_=`CvnɈӳ 1J6 P9GK- > endobj 800 0 obj << /Font << /F8 21 0 R /F38 68 0 R /F35 56 0 R /F32 50 0 R /F11 65 0 R >> /ProcSet [ /PDF /Text ] >> endobj 805 0 obj << /Length 1579 /Filter /FlateDecode >> stream xڽXK6WV ߤ$E (Pt{Js+Ke7dɢwQ,p ߎ^DLv!D aN٧qSnG$G4tѧ8pa&_`]Ge:_?[Viv 'fBxq'y=-H`plrGkE2y2$%ݬÑ1$)a w a֨3 ArneTiq ` N:! yfC2PFYXpmhMi9;1Jby@~Z^r$֡լT87R3_E\  q!Qb9oꖥA5+}vԣׅ NJC*-~ηG*MZTOAer!4hLNE@ggEvNg6W9oJz g7Z 4O H~})v}]47{N~2B>_6UBͷp'B2NRu'&D˫x E.}<(HsǣE~ta3jvs}~H֨04Yc(N`EM}*Y}tfAiP~le jQٓ%|!EN\םː|F 7#a$s]vnA˅޸wn܆⺵ge1B)Dعh=v0V4>v>|sLש]\11(+v Δ[Wt[ 7\$m钤JjZSÆ(P&"2<W!fwo#aPCfyPT۔+I30l^kp:̘y.'z~fI~v6êOWT5Mlת$ʲ%.HSa¾fi)ǡ9~ endstream endobj 804 0 obj << /Type /Page /Contents 805 0 R /Resources 803 0 R /MediaBox [0 0 612 792] /Parent 790 0 R >> endobj 803 0 obj << /Font << /F35 56 0 R /F32 50 0 R /F8 21 0 R /F38 68 0 R /F33 53 0 R >> /ProcSet [ /PDF /Text ] >> endobj 808 0 obj << /Length 2439 /Filter /FlateDecode >> stream xZKsW*Y0u^夬DEfI@ *>3 @ )"=',b89OOa,|8,FL~2#Sxm6![ui4B_z4dј+~9K2.}i-Cz?văhSdǑ0hc2.Ge#D,igS jf;)bn>pm߻Q$h5zҏX\kbEKfi'[ⷊ/U^oQU_@p gKT[{ Ppȇ\k@ 5Tzqp6? B& b>Kޭ׃Vckbu/{I7 "ýi1,Ȏa1bA\"k%N7evS,P%I|:,qY_*"0 &ЮL^7jcġ^=7%,3SG]Y~ ݭt{q~I(t4jT0y~2yoÝWyaN"?M0/ %.'Xne)[߭,rM]eug\->g*7YabZCtN~ 'w֨"ZXrCS VmwXF`B n\帎814J4dxunb4遞ԍP:BDX|av"?8ޖlcuŃ>"XB˂H @:bYj`례gxY~OzF&[;pz; 4pL*#:%[*NU:\rd֘dFlnL85f`qo '@Zb˨QT KyJFUXNJBO?) #7(K ZR (h; wig:ǰOmYeI9=tC1.d>~S 0܌ 4yK*PM@^!}VX7G#2!}finEg)RƭR} q7LYeC-3uK6aju"fh+MNEfAO)9;[py(@ 緦]ƺdHWچ1u:7"Aj:̦DN_fs5/&oVf.#` L3 2IN?H;(֝kH&vbŋC4]d#}ݱ.*А|% f0,̓ByR݈CDHW8!^^>4̛-@Ƙ]TX'^C?-U,Hlfn>,S|=ٟ b`q]\zC:RyB*^̎W}!C(7>n5Y3ӘvXЉ$4?h"[{`b=+x'ncpFiu$]sqr#MɎQ 1ơ5=m)&3#ˁSY=Hhƣ -qY?EG.~e.᷽*cA/:0ť@'_Ɩ{۷M Rbą;ѭ#MBgsKSsJ#'s4ۯhIA%P iuponUBU 4s;^"Qo1`~EW}cGoOavG'}4,/#u\> I&zCnt\PJ(JFyh6XAfWؓj/"u\>CYtzV%cosU NɖL]bSpz!tBc`$Q=^zATDoHVLl5?spWd*}tg`{j^7Uh?4[A=@ݠFC)E\_v endstream endobj 807 0 obj << /Type /Page /Contents 808 0 R /Resources 806 0 R /MediaBox [0 0 612 792] /Parent 809 0 R >> endobj 806 0 obj << /Font << /F35 56 0 R /F33 53 0 R /F38 68 0 R /F32 50 0 R /F8 21 0 R /F11 65 0 R >> /ProcSet [ /PDF /Text ] >> endobj 812 0 obj << /Length 2635 /Filter /FlateDecode >> stream xnF_!p̹rlhi@Z$T,{\HN}ҐIĂNnˋ?nAœRJiu rB%Q\$Bl\DtzdZ5XC\Kil-KNTe =}˗CNgUٴ~.x<dLbnNj;A"!oǿmeN߀>v5V}}$]ޱbtcD*eʗ!Ӧoήn(@: '%Nf?>OgpcBt9c$թ{Z]Cy\Q'cġ%$ID6[ ڂzJ4C < JLfBU,s@yȷu9$=בL#Wƞ"*jH!8Uܗ9aNݱc۴!eh5,6[1)'T{Ha8u9:}x6o컶r6gM~H8$Q^GULSúo{yn2!*eGD~%pz5RHpL?^ FIjh[PDc\'|_1eqyӉ)x p;Mh) %Loi>%Ci/ƙXs y\G5kh4~ wۅ up`Ḧ+iCRee[{k cˢ62Q]qmLϫ<9($%wN~~d W )]{bE$6bOꧥcR+*$I<(@6gAjtwR}O]4`w_]|e rh4!OB^6#H! PC1#yԫ)ƎHWӎgSҸS6BRi"D J0(.$MUZu67b/,HmpE,$ c&eq]KZLZ:(8WklWۿVNU?Cjؙ[}ٲ9MS*B/D j^drOmnU?h>p tiX}}K[ %|%|OM '>]קkn5VȽEڡ18[W/gǰtcz!!,NNXaLϒˢ:ΖH i,'$QYA`P{LQ;;q 4=*Y~. 3xpk a$Ab)ue@dqn;ㅒ+#1+ X8df6,&:ΟDƪ{zg8y䵝U@Ǻ3R!rxOt4"Q'tvH`<]KFO$a)3 ޘp{ R,Yo<ߙ$:2cuFvq~Ʃcs}1Av7 bVӬ.]uv L|-,WYk~ OuM (} {nV_eYucavu_~ },kV _U6JxM%V* 30˽~*YM1"M&A%_"Yl<Bgun[d4Y\i,XM ZuнްM`K. }D=a#XA)^}xԑDA1;*+ A ʎW 18c<%m(`l*"l*"}T2]U&_XF2ҼZcKo:!1'9=먌,M_&N` PQe.<&I endstream endobj 811 0 obj << /Type /Page /Contents 812 0 R /Resources 810 0 R /MediaBox [0 0 612 792] /Parent 809 0 R >> endobj 810 0 obj << /Font << /F32 50 0 R /F38 68 0 R /F35 56 0 R /F33 53 0 R /F11 65 0 R /F8 21 0 R >> /ProcSet [ /PDF /Text ] >> endobj 815 0 obj << /Length 2284 /Filter /FlateDecode >> stream xY_s8#*%m;s{ivoL$r֒d?)K$g?ޓ$@~ۡ,ja3Ƶ^N?G#(Dlh1{T#iZpF򂞳 V@1_Ѽ|vi67XUpDX hpΊjClJ_ǦW/<~˟f,K*A%AQY,3:s[)"}]~TuC+5 l/݊#S&S5a;f^͖NR/p9&ݭgsûܵ`Zf~UY72cցhߒUDl`6~dU-#~pMWV5+<ܒZfR /e8$Be\u4ۢ& >C%ӠDl1>y9Y6\$lլ+n0a˖07t&+wn:ҥl+#_T3#{qPsUoޭaο)8#Ü|(Ș(((L6_7!_h(vG"['Ѡ[:i}wp%TJf<.}ze^apqcx<+2IL8$!E:$T7{>>A: U0y& /' }9o@ݱ;]Y_aA$bxOn>BxNc:kp 탩Rf!)KœaED-`-}@ 3jB)G 5vo1!{p^@JG+|J_ٗq͢܂Xƾ$8]8y^N?reoMڠ[5y㵞=bRa+IT,l;IʒL 5T%,_B#_:LmjI] a_ߚmk.!nȯ]a81"DO\Qsi17m5[2GFե8~uqw3Q4̘]`Si8W2wy6p;IjprAiXRL'' Qb;;6QIWs!%M*BWh1k 4S}\ë՚^f}݌+mӨ( JC DvXy fb݂aDRoMhJ!YW2 R-|]7fo^NOM& kAr<ͼ'퓻nN_`ѸG9j[cg}O7 fkfݏ%,iЇe@W`̀WSoиފWƃ?])dDͺz>dA/K謾z>3hu{" PW߯>Ոv/hUV] 'Zp(BmZЭj> endobj 813 0 obj << /Font << /F8 21 0 R /F33 53 0 R /F38 68 0 R /F35 56 0 R /F32 50 0 R >> /ProcSet [ /PDF /Text ] >> endobj 818 0 obj << /Length 2344 /Filter /FlateDecode >> stream xڭY[~_! s<ᵮ4i'p7(<""LQ=Evx_3g9׫h,fe*H"љҡYv.~&i ҷ6z_xuB/|cTE^1uD4^wW]^WzV6K0dbw,W}u}Ϟx#f_jf,Dy]2q< 2Q2igbJbE*}f,SvuEG%CI!jy_Ys *H(cGu 2&:A+z%A6q-Z5c?0Vf?b HwtY?ꔉU&y.]vJAf@4B2%ott,0#@2b&C``޻ Mx$gtǑj Ӽa^Lgeqޑ/eI,QEN-0 ,SWNCyzT9TЍ۪H !ZG1(oAO+&D4=eXf5%V,dS(ULp8?Bu{nCT\T{t{m*йɧB2X !yR.K6h8K Xadniu{cT ޖ#j~,0 XB+IDBqRp$Xm^!UF!=H8H4L.h(E!/+'ib0uޑ!i1zϦ{fbs|l]٣{3 "y-l $[lܮ{ <.x&tFjbeP3 &sW&6 Á~}qLZp_[miAejs$6#КŽ"ئ+T.P=UaMy?u%cs2 25x#_JC)vb9yr \tn5縏YK vUW|ÿ9Hq18"QZXJ=mPj#ɢÏװ LAIǺcJ x4[\.l%e4 8(H?Ǹ 1~v,:LʭaxP1FT46FB)R}H֡/w@! v@"_lkTUrff% lCB4MIi﮻Uhjw[ID]X.L(Uuj5Fمݯ IwZg<սIi͗VIJf[njI/ÿ響RwYr!)*M sH!{#flʝE~wEFPg||ܰ3 H M$O {)5lxrXmUg0phCҁI!)hpL̜mdt8σA?4B `6YM_^ٙlI&,D53JgYއ@%DfiLT=˻+r[Խ'1YhsCx cg S^u cY/ |s>q$t_=Ǫ$uQ:9 gfwGbgV/OcG:ec+  6=ĉA2T>T~PiLI Fz˟\"$/|%N( <nOOXzQ\+uJym?͌9`w+._ ~ns Da'K{6k·s[Ey  ^qR?Ocʙ1P;2q}=!f I)75¤:z0qi56ϟ+ޜ6jj3 \8J\CdA:M. endstream endobj 817 0 obj << /Type /Page /Contents 818 0 R /Resources 816 0 R /MediaBox [0 0 612 792] /Parent 809 0 R >> endobj 816 0 obj << /Font << /F35 56 0 R /F28 15 0 R /F8 21 0 R /F38 68 0 R /F32 50 0 R /F33 53 0 R >> /ProcSet [ /PDF /Text ] >> endobj 821 0 obj << /Length 2215 /Filter /FlateDecode >> stream xYK6Wpb*eb$8Wq2ɎNRIU6DToo7(Rl鐋FtසGTDIĨ&\(*Y4?bNF cD+eŜH/h\wNکᒤ6{$Rų:g #xFx AFi0}xǃDd*i|]a(RY`J4gA? Hb=/Z^6?x- ⦶K 0fe~[lUEKx<ϟT0r&ۗPӢ d2'`RKɴZ,%VEוZ yVOhPQ9,rJ2&P 6j4[ft%/WzBc .1V#'Dp1j0[vSD­y Nr+%gt%6,BqKh{R~~VR< ,W 'm8Çy!FRy&NW( EW{)5Cld#+)IK6ykrd+@B:}q4Y"!Pv8x qHO'xM07~AG0޾M} | l*GӲH'ζI@8kQMx?,~PbCY7rTh?6ĄBa0٤^slXȑ3ƞ{05-X|H*Z5 L."gY+ uYy50Eraw`wch;>{qdFuYR_->1Y}Ee{7;ď%e+іPueVv<c:== &fJ &%t7>ygJ*<[We}سd54^#Үd[|4+D*%鈫9o:]IY]Ic#@5ˠa.AFGe1\r]ϸ'n1&u֚Es\>=`;m2M᠀ԟNʓħ~4lꓭC j΁@g)4nu%4ᛱz½Wvejh]9smKCoZK:~t'P>7.#qjvT|[>f[h>*|Dspf71⯶\MsSxuo|'ǝѓ0#_ a/SOŎNBVb \˜yK1 [CBr@9fӅ endstream endobj 820 0 obj << /Type /Page /Contents 821 0 R /Resources 819 0 R /MediaBox [0 0 612 792] /Parent 809 0 R >> endobj 819 0 obj << /Font << /F32 50 0 R /F38 68 0 R /F35 56 0 R /F28 15 0 R /F8 21 0 R /F33 53 0 R >> /ProcSet [ /PDF /Text ] >> endobj 824 0 obj << /Length 3076 /Filter /FlateDecode >> stream xZYsF~ׯ!m#̅élFfyHD}̀NUy9uCgґDe(Q$Ddh<-)E/T* x#>iI(Yᖳ3 sHV"5fF ϳ~FӳhY$ta eYٿ[Rv=GpHnDfE_dUe,T+ld* 6Oe^RۗT Z`\Zzo IxGN5x^ (-&7`L`(ӂmGH ,B%(#cib=}*48mD~$59"4<;ZyNSE=T$a(dIGRiҋ7-> F*a2cv:V M*(>ҭV!wk#UykVC5G0k6Y޶^CzDiG hl '6= Wa@wغgGbK8IO(0qWQc\\==F1OQLj͓EՔ.j ΁h0 ;~m qF6:jx~QTfN$Y):Hvt ~g@d @ĊnDb1}p4Ng0H"pH[(Z;-AVĐXRd)(IBR&Ȏb 1ȐĴb%lf56J f:a%JWmd,ܟ/+AejVWSQ"lw|񦨦fLBZrL >竫HB\Ƙ`EF|aPK2];SBưo8t"2ɵX`u0O Ɛ}@>B~ pZyIRiH,(/eiS eEVS^(TL.2 "kC3 G1R(4Dk /M*?)<|8W&'>Ld.}~L!wJCNl7ghxjYQ)'JHM/eK1Y^k-7"Κܡ+3Pe5 7o-IS֕B*8j-o*3jR` 5Քoc7(Vr|i#8Z`FFWWTn# 3[lPmx`6L6hVQ86&lI Pq7w-$b0la:B1nib=h&Bʴ9 [a]3>]޽D)t[^11 &.\msq*ȅaeVaWxcڡ ۈI dWx5_D{ҏ\M߬@1&P v @1lH;xoo,ꓰH\Y|]2J:̖ JvoS )aij^+G0W ͬ} -LBw _>|@Pq`T%Q0P6~PY޸ ½BIqDPL@Rll.C;sCSyvIݰB>bL caaMejr]%vN5RL*aTrd?HZpdyt)GSwr@YYPq3($v4ҽU>[EÏL?b;Emtz;9VTc5"=t--[; ,jϫ62m74^HY@{Qrau;<0*fIЖ^hzZ _ܹe;!~CO -3]`R/#+ZabB |H'=f_\>{8_c.; %ǞmՓ{|]3?2}*9)gxg_/^U}iBSys[AccR7VfsqOg5DXGwNv(OZq PטM^zɧgX]yq;)}"T)G6&pKkHGmd.˂W6m}>a$(ILL+*͵=#6  TL_?CqˢnJ Nc٢)d ,xgYomeRj? :!j,)tW[|5.u}|-DUH>`#)~;,r @q{ඞu_Ay9 A^ `jcj0.ƅuqPm/lM ݦyjZމpV`|zy.H_xO_趫}d xZbMF)vfZpi{bU"ۭ# 3lj\IAm!%§wq Lz9'¶=~ 9Ft JO+ ag -MHr '!7\F"QT7 jqU>NeC~(D S\R=f*5pJupJijw="?oy2ٛDo撩S|x0' c jnD7@ #)Ȁ;ON\O~Oב7sDŊK /wq$ 0FJC6ms;Β`Ҋ7/Z}C (JƁ{eFHtH"p_9hK8FMS\`l${ endstream endobj 823 0 obj << /Type /Page /Contents 824 0 R /Resources 822 0 R /MediaBox [0 0 612 792] /Parent 809 0 R >> endobj 822 0 obj << /Font << /F8 21 0 R /F38 68 0 R /F35 56 0 R /F32 50 0 R /F33 53 0 R /F28 15 0 R >> /ProcSet [ /PDF /Text ] >> endobj 827 0 obj << /Length 3064 /Filter /FlateDecode >> stream xZmoF_!h f\ 8$uK|g4H%DR3Rdppvv^囻,n2 )Z  fy4|x\&s;%>T<[l>7Wy ȱXkǹyw| eiP$)9phZ׫W/_2_rH(Kp-zj1,"\kC^Lv^+I@1 -MaHHS95dTzBDU͋aVĺB)~ϗպܒrwwcy6f` Wa4%ƤYc&ޞTF 1P}v.0ؐqh23~|e_pjeAt#6 )1Eou#0|V8 4qwejryӅOE7$,xSVrFjC44ɦ%=z>%?̉fACֳ6epXGH:5w.{g2ҕ#<éIgܦ+pu `] x#Xse sᔸtfO<=4 e(-j񢇡bZ2f SYbwr K/V KNEg_2ev;lel@W3ۊ k[̋+0Se0ጧQ nW1V Haqقb(9떁)$(Yd -H3ǎX=Ta/ooQoo0_^_*e*H)vʭY_ 44bY^u&SK6܆…K7߻&;,6<2^Ǭ`͂(G:Ɯ%":ac(tlcۆ _+hL`eC*Um~R[̥Ud6\2p,4 ^sg#vVuGaPIG[+u eY:vt@"!5a/ Z F6ZDfudj30림a%.JW10p`t4(gXݞeM?~}mH8 P\jn?7٦ejABrkVbi t؇e/Ac܀c̻ HҲlEnpDhn"L Xq{Db›mYA@(@e:[,cf=¨c 9i䳼ˇipweI{Suo;LeT~+ww5rNVs'F^nEwPL+/Bz!s_&F&yPzǙxBR-W1/jGc j 4w':(~M{PT%\\7ԍNم~*p9gqi+#finHO"uPTl%8i,ssuvo$pP JiW37 G $xdY^Ǭai q{gה@?T=0FP 1m/lhȑ/M۲\I3xo 51V4G71+61ʅy$%HN#uX@GH{A] eZʝuk<IX``on/p/LUҔLeU3)GTC~h{+S͟?)Qv"S;-W4'tf c+kǹ9y3A<3F͸I{U6/ۄag7W8;'4!EZwR3?$mţ"M`=DxI֭.Fa C(| oHr<2-$@(IkTbcy [ð{ B)HǞY^ǬAպY6x;n>e;AC } 3 r 4_T ڊ:5CJuT!Iҭ/]ɺ\v#KUH@(}슆Ztp)bNͷY|UoWFP@B=j7YW͂])P!mro""Haoq7>hx{;rhD^'L$:^F jNGzh\vCz+ }%qaw3(/+ќflYMwvC@92Yτ$fj{TKuNzQCtֵp;~7aaچviѸۆPpyyxޯBHS'[MwG- 5QFHŠ|j1|es+ ZʧX;h^5ԔʨN-4Θv TFD[+x>^WPOp"q]mו9HXm;1={ endstream endobj 826 0 obj << /Type /Page /Contents 827 0 R /Resources 825 0 R /MediaBox [0 0 612 792] /Parent 828 0 R >> endobj 825 0 obj << /Font << /F8 21 0 R /F33 53 0 R /F35 56 0 R /F38 68 0 R /F32 50 0 R /F11 65 0 R >> /ProcSet [ /PDF /Text ] >> endobj 831 0 obj << /Length 3594 /Filter /FlateDecode >> stream xڭZY۸~_G*Wvfk뵝=8gX$}@Rd'ryģh4>W˛h,ֳLP r{Ta卜OΤJEn?&} '̲F,柞Z d C=A1_?((' LJ00-L$8"\ dܫnx1E )3XYhqܱޏu:S 6Ȳ!G&KaDfDͿRrꠚ/L4W)+kW-Iv\ձն,:8x@Վo>zFšG~3vS* ґ!/Nʹ3_;( V~ՖԺZD&#-T9(ŭZZA[Qug-Y Ж NvnJ yPn4J<\SӜ:2R&grkc6rRxhF::5ت*va5'}Y5 W/w%+h-He(3X_>T5_ڎX;y`rkg[Pa,;[Yqv;b>ҝV eb,x{}|'dpc[DQ:wˡ.lm~E>$5lƃ5f{bmܬ4}?`hϺљZ [>o5S:CJ ջ?]-3MMB Ud/O(X^j„YWar+нs|FMuؒ0g=ħOrQ0BGԐyMS`ͤY.5|"Tn;Gp]!0{Y!G~S>Lq/ O m)6~$!<%4hI(_63>Bu"a i-xΆf{ks̲-˄[\rqk\$ I賒b@Jsr+#^-;SSL0Y&XYveHtAj)6kc6=aHѠpoޏ""d8b9^ŒFD/spo߀B)\}tpnksmyV$~}նj8Dpc|ۦbrϪ5Sl=C(2.],ю3XөĒ$=,C%L^t&SĚ Q;9Sj3`V Me=UL,ÊI+Ļ H1Z$)Ue#O|x`"ĘxvC1(%b?B&RrX76Yr dαf""Jm 5T1.16Omt1-Ehy]Pe"@r휪2%VQ&\/_hR8\5ZޠHTP}a ޠ-[[LM pUv񺸓mcS;) $>a|-&Z$p/ʩi;,Rh/ÍBr76Elq>-E!pH& b0?=\cAi  EP^kDA,"A ԩ|e4g_~$^M5pN)KU̲hd:1}^E459 :OpO6bY|3kA+u4鮟U#2ߕ\is0ܬL%KKQzd8rʩ[76 7LMkJi?wcE85HsptF#;`>wW~4I ߢ坖עlwP$Nc2,˾XwKPN&iTx;\;w}!;t"TaJȫF@v98mUfO{mek3?`T[{磻-ZBuG*EC޵;GCY2ȉrόq \#%Uj| Jb\jt4q0Yѯ?E:m[">2 ϖކ WȌHՂXv_aB%}yv: R1,3}ҲZt. el ,R},2%Den}p >FaPdU;f2-d]C;% Ӥ}ܾ{}*T$J&ʱ$Tq_޾y5Ť1 Ql+NkH2\6]3iO^Vs_0,Xrb ơ]1Cc 0C|WՖƧaV+U%\VY 9!%;ޘmѝ!HEk>Ŭ.N. s)̋_#3wl X?aUfږƉm33ʵO[ׄ$"/}m)!Q(TV1%E"ɤpIe HŬ. g@Eqb,!m_1ʒkVaoTMUr.ʥC#0ĚHG `[C]7vJeRmrA endstream endobj 830 0 obj << /Type /Page /Contents 831 0 R /Resources 829 0 R /MediaBox [0 0 612 792] /Parent 828 0 R >> endobj 829 0 obj << /Font << /F35 56 0 R /F38 68 0 R /F32 50 0 R /F8 21 0 R /F28 15 0 R >> /ProcSet [ /PDF /Text ] >> endobj 834 0 obj << /Length 2195 /Filter /FlateDecode >> stream xڵXoܸ mѢHqA 8mpErNzv-tWr$i3x%)Y1喇qn6틕ysa(t[D{bGR#/k&y옭 O>kZu+;=t0EoZbKO tJ6em4WY?gםc]`G``REn73*|}To% &'lt=~V1z 6=nhW ].8:+Qc¹toN Ŋ18\;Um{ I޼l oV[ +=Q] ldh-f m; cƊ[$S'8i"zﴡde.=;R\c}$>/;廋!Vpfߪj6wKK{%˴&o_ڝr8>eY^@Wu 6Gq6Ⱦ_}_U2vIbc Ed'F$rKt!߬Y-۠7 y8I.nuH(ai6zS-=&uL"xA#땤N vy$GcV4;,6+T"&*4dh |l gq@4xEKHc8VDAΫ+}Cd| ԥr>:ɳt(' ??γND,n\ ze]/ TS;Zh02 uE"AY mcw&Sg!uvUZ TrDܱ s،"R #u}e!i薚3F) cSP\EԐV 5]E%13wtc:PxԄ[rFKkH= +t!AoSmQ'X"=cd'z8ӤKpp=HMI4pHFL5|t #tIvGJ2Z*pa =c[8Ёioㇿ.Pen]7s;LlCJ]' k~#9u(ۇu|ţ^Ntl/fz9= rJƞ,͇ܠ%؛қ|2GzPS_<1!Zv,\U:qEl& eb7tZgm4&9q rFNbT8ǝ:`%}=]_l.z"r?M@]3Bܻ(1TD$.F"߬2Ɉ8uBwiR \qKa NOHZْ_LH0Ad? -1I Ԕ?jBP:=8`"|uQv?02 G* J̨{>+h4h _=(gIWοt.TP05>$LcF!gO".ÿV*=W9i:m 7(BdoӁ!;Ym)/n^+ٻTw'i+CV2b:w6Ӏ>8m/n`ۻ'ÞaOl:xҶ~*8izBK F ru*G5j endstream endobj 833 0 obj << /Type /Page /Contents 834 0 R /Resources 832 0 R /MediaBox [0 0 612 792] /Parent 828 0 R >> endobj 832 0 obj << /Font << /F28 15 0 R /F8 21 0 R /F35 56 0 R /F38 68 0 R /F33 53 0 R /F32 50 0 R >> /ProcSet [ /PDF /Text ] >> endobj 837 0 obj << /Length 2366 /Filter /FlateDecode >> stream xڽYYsF~ׯ`a Fs^*8vL\I K r~1%>H盾zvq'J$ 'I'L dSTyBp+C gfBvw< 2+Fy tyJg]}[J_B'3g1-$:dNE^^7"UpK6K͘f F9L-2 V4pM8IDb "7A(lh|#Yg4FV@V:"c:T l4WWN d(T_,(+}|k%t 2-P@F{s<_+TMqˍ T޼9M:Kq 풚vA)j> g?:>$]जI6H =/w9Y\wR$-JB$N\ou=#YF_ tڍf ,PXG? L !a XzV'`h r[A/^_܉4na_w~tqzTH2'.x@F< q uT%r|jp_ gz;\G-&6rvD(y;'( P$j]Uc5HQ:/nWIz$墙셱7Yk/|Sdݧ* 1:A Uz &H@O֖Ŭ%u 35P]AF;⹋Kq'.Ep#HP $Acp(!/Kf/88".@zp)vVV=kyfNi%$o(By{s!v-Y;V'kȊB}? RyP9^a) xނ,F/{1;Mk)*jԚ ,IxfCk2 V4n!P ;04p`AQ=O:B#'PAdNeIłsw|ִ~,FyClac9x;X!3Pa}:zŠ^/GP~*A0Ɵg$qVN탌Pf5mݬڻφU;rX=\թ3CF3_jab= @>ʬ^#. v2"`oClL3`:K؈DHwu5faG(hMQOıZ8IcX2N.P !7ö,Bv˱@3{QJICzlrk"z,dc blp?!sjЮ㣴Nqehtlzk(JC+:yeI}rZ2`~,`c\]HQ,7K*-JXȃ*4U;muɣٽ?b~sLg⋻̽4`u*l>{O,GWٌ7ˆ KUyۊ$dGݰ]%>ݟ0PWl[e3GkrJ*Cz\њ\K95Sۚ\YP5\M 둚\7E3|߀u(S|m endstream endobj 836 0 obj << /Type /Page /Contents 837 0 R /Resources 835 0 R /MediaBox [0 0 612 792] /Parent 828 0 R >> endobj 835 0 obj << /Font << /F28 15 0 R /F8 21 0 R /F35 56 0 R /F33 53 0 R /F38 68 0 R /F32 50 0 R >> /ProcSet [ /PDF /Text ] >> endobj 840 0 obj << /Length 2473 /Filter /FlateDecode >> stream xڽZKsWtHU $僶JȱrW") Eͯw?fȁ@R%D{ogVg66VBGEjEjd4a"c.&Dk?&f2u()ͲC[j]7+ |*OGqG[Kh꾏oq/8 .ghHFҤHȣog?F4,ږ\BZݟ)aKVg~B%+ >_i0N ΖjkEBy(JbPJRY')շ.aaI\ Z QKiJpPk cr?Z\eH+uL4-B퀧\P#EV⺜$V ʭ'=ZG^s?3o7luB?$Xz%d*lj8u!pV#OK0́4s[#EWϪ8۪Fhxܻ/2 #B 8Eftϛ<*6kS-;~;) pl XA8eo5?La᱙ Ĭ5&La]=tb~.@`-㩏 S`\) +7 Vnlwܐ "1_Uެ ,C>J w0nr?zShKTn+L#Dzn/r`.~jދݫhʂA=3de ,+7 kڱ??<8j:8vt^ow r$F ^U7nSbU+R`PY. wb6ȵ<)pyd5\bv9W?ڨvk7h,YG[ޟs;Z^DHպGNqӼhy~oCasNy g…\ZpKkQ䆸9`H`]d5* g|v<@ %Rz ʄ)6zޙ]Z넂_w)$F^,njCނliWI}& 3.UPV(#JP) u{ʊgd"g&(L&g/4L^81rXI6ͶRfXwr 6\aIxW)KzQU Ҽwd.,agKB=e/Q%_.u Xm_TPy4D"ʼn A%֞r&T!\nڮ_A*?6_/V=Ga vs_kvuPS4ɠF)yT1_ek!c\;*Bɾ`dX" E? :UjPa⠼l\|81~brLaKڰ'ZJ=fDavBʐ) , E}AR-*j$e$#)@= Ɨ'\`=<3?4g}N( /L ]HBwXI'eBr;0 n!1u1ZKQp/HVZB0>xn&,+ ݐsxRخz!Cf{V9*,~JԺL/_:a՛V^ v9J<ZV 9?\+•j?VReZRSXk OZ)\ZS+Xr4N.f:  h^ޝ(ȑsuXNGɝ _ joviFjs1ABv Ӽt0 c (c !dAlzpT2wJ6R7g6ĶQj]i.}^,|`GZj} c?nc%H=͟*SuZ8';>UM{rv|bæ SX˼v +r6A!7ynS"ZfEeܚqrXq끖%K t; w;b4ԏƐA%܂ J V 8#ruǟ;:`u{o!@@lNt6]Nl[%?%~,Q # endstream endobj 839 0 obj << /Type /Page /Contents 840 0 R /Resources 838 0 R /MediaBox [0 0 612 792] /Parent 828 0 R >> endobj 838 0 obj << /Font << /F35 56 0 R /F38 68 0 R /F8 21 0 R /F28 15 0 R /F32 50 0 R >> /ProcSet [ /PDF /Text ] >> endobj 843 0 obj << /Length 2164 /Filter /FlateDecode >> stream xڵXK۸W|H%D|Ìc̖cY;{%Hb- y4F5{=nr1,be cAȽiRX ёTd, C/ &|)%n|Ksβ(:ba{qAY‚4ojx?O&ԻqxyD,rr;g;^٥s<EY DŊ.Amsg ckf" G慒Eu,Y/6zN'@=1' t>}754^5U^iMn &)'n4'HжlSM[A<;cb&ƜA ==/H$Sm: ^uɳ9$Dz#/fieg253crʁh0h|xALȰİW8/6na-Ҫ?4qW%@c} &VQa)KbaoURSrN<3z߼]HDi+?1>x_lTmn^8ESk;hulgrz'\.U[ǧ3op_iϹ.leKor)F=FY2}ᅳ'wx9Vj~[r9LRأhкEQ[mrOcmy!7/؋Sx6}LGdƦǜ !?: %ք֚PBɴI ҈AߤHcbUOBCқNm 诛Qgϻ3q+b2Ё8<cˎ[+;[' B0 + /ady a?^^)/l2eI {WhkP囱€E\-Buc#$ ##wT2W!SݑZC*[LBO2H ;rse۞Yli17E>{pʦ=&ǽy2$e+>ݞ4F 6%˙n2QiR42+ARZF =씊y'Ad"}k3 QtCG `tW}ܓk5ӂ+ZRՅspU5I2+ 'pVRAe2H\YشчbƲ.eGCuX(~X!3ZrG E V] MgR4Lt{Z)if\ yތhn+Rc",5 YYI r݆̔(wh斲o:'~*ިg+̼3k? >cZ{$vŦ·Z|and,a ڕqg+75u,۝\;+k}Ka'd,G.%MJZڧ#t܃W24"E$\/t endstream endobj 842 0 obj << /Type /Page /Contents 843 0 R /Resources 841 0 R /MediaBox [0 0 612 792] /Parent 828 0 R >> endobj 841 0 obj << /Font << /F38 68 0 R /F35 56 0 R /F8 21 0 R /F33 53 0 R /F28 15 0 R /F32 50 0 R /F18 726 0 R >> /ProcSet [ /PDF /Text ] >> endobj 846 0 obj << /Length 2830 /Filter /FlateDecode >> stream xZKsWZ`1OIju+bʩ ,I}c5yEfzz{~@W/(9iRh<yeiZӟȮMH^7ױ,Lv۶Ϳ\"E 7*|n[OѬ^\*UQ[(neh=2z)ofnfkTC[7+[e}ƣՓṛS=6衤e*T ]%u3VJE$}ݞcKa滪VW3**$Uy"wo? JT:#aUb|d3MW^K:^D#<( ½-ճ=8`*8667Y>U!j#(ofx\Hmrniݖ 6TeUD&{%c1/gؘ~x1I~^jS dGVvO pQ"ul;>:m5mג]BI=^ehf,WRn֡)GjY|ⲏ5  <03Mˊٽ\])NkgJoo=Wi1pœG1r64f2hs:|"zE9%H#[f``J%gu@Qb!M4&k-ƚLGߗr^!Cqc暮_e6zϫ.|vMhU;84,X%p_2_Grk%xG gTYL_e^qlڂc(_(:$hm%0VSs5?QD洑A& .py T!Ew^E &VԨl'**C] L#؁bS azW0z6!4x0"!\xid3椟Þ6ՙfGBVcKN6KOGd{̟R(I3ofGdyT޶ KA9uc3} ݷK,-bP+!ɌW NQsiqf&szñwe<~U;a{ pC+g} dLC]k]͆Y< H 6:PB{ ,X"AP.3f wQ̡>?c:~T.;4a 56e!`(0x'}ߢ. Gq?eDR5s^Zάבz.Pqx0_BOx@w"D̔n]#]^(N^$BUG|RB&wbMevyx6;qk͹UVO#,9LX=<WoqXpg=ci endstream endobj 845 0 obj << /Type /Page /Contents 846 0 R /Resources 844 0 R /MediaBox [0 0 612 792] /Parent 850 0 R >> endobj 844 0 obj << /Font << /F32 50 0 R /F8 21 0 R /F35 56 0 R /F28 15 0 R /F24 849 0 R /F18 726 0 R /F38 68 0 R >> /ProcSet [ /PDF /Text ] >> endobj 853 0 obj << /Length 4109 /Filter /FlateDecode >> stream xڭvFmF/@3Ǒ=8R$p e맖fi;&FuU׾臛/ˑRȑli1:'Jn _\ܚUxS/:/8=槧/vF(S E\xyVQ9|J xDJ9~]Ý>-#mZOfk][hv \z랬U2Yi @?j_1VMm+TYКWIh >! > Ez o-?7h޶55Uin=f]m`YJ ~xvqs&`e6β,Yjl>.M'up&47Ũ0D3XLӼaCj!g&y㈁T Yt :@Kf2-c`W&3/&QcldfښÉy4:Cˆ/ɖ vNp_ǻCFGY^d a;-s;Fon 2Uƌd]r\ =i V~kZ}>^HWv/ltjU6La),cZ"`P2 lF(%b0'҂q_GIZyAh{hȣ 3r|[kto&, }QXP/RW9x{a0luӌaC mC~~_.E/ש0z'WTOm`1^,?x3 jw"s2J.@g[REKζ_TS|d>W H;`IAWSjUĮW К-'a0v͏+!0x_;]Uce$H3)Gp$QXOt E]1J0y8ܮjm((P`Tjyca1(_ E N+VYejW&K 3+l%6!i/%٬JL=e#^y=uh-{ ׀r"`B,f9 xבmb`(⫄_s>c>UFQݴq#.S$_tK].P^ -Їv8j;=͹R `_J"`}.U* Ƈ1td&h8>Ŧ+X>`I:>w']h߫B=['} VCIK)%Hh%DJB&O $&%i&|8E%^AbOиχl@@G9^p<_P-LjCtjk='A=֕]پ@!*@˼Pb:"M7S" 0 Q(_tjr}Քg)RZrGL9XIAR8kDj"b ^|Z|gM=ݼV.hEPH.füϙۢv͖ 1%tU,tZX%KH`u;iJ_AtE!JgTDA-@TA ӗ+@7f .T晆N$Ja/?)pgLjʑ:]x2cŞjtz[oKeR*eC,{_]/# =V:O + "B ̄6d=!Ⱦ IV3 :J'o ^DFKm]?odNhNj( \2_I5h_j[3^5WE꫉P\.0`Q@\tH_1Sk %Dn c:Jm.;CW+iq|ciI.Kb}c"odqsgCѳeTDD&u< Y&ćB́9Sʷpg奉rkEٱXRf2BKRz@7w! AmͩV5MPjgu)<$ַ3hy/.4@3:|M} }:.d/ao.lrtzۓ"^+b@ L(e6}i SҴUΆIRu/c B3c& ,i@׾Q"jFBk)lyݦv=xλwE Qf$8_{[R7mk:Ne^BZ@8xYVsVOc>k:-$|qPug"p1o/_ '>x:TFQE4 eBȑ21iU.+}x_j 10bu ^5Fsۋ-ʨ,P2Y>81JښPWz()!;ϭfnw+D)٭-H]gMZRn?K3 s`>SJȨt81$՗&b%L 8uCp/X1|wAxV!>g;p['oOóR&:i){!6ڋF> (~6X e0 @ozTSDTCL0Syn@/M.9lv~WV~#JuMbϺf:duN:bOQǕvzxNMAT:q=4` |k (xe(#vC>hC2 J):CJRI\tapR(Gna%7QaC^Q'T}15?T /s$ $"<ȡN\jMyS!6P4CͰ؀5ԷيDrA:\H'p2IvyzdϪRjS,Bq:QJt/viX_UwGAJ~n>aƩLk7yk4eM 8vOjyxwCSt,G{~U`ںi$/",OigOCt8~"љiNЯH$qP[~G n;rwp 1 Enkqx?IC@FýG^"gx1JQ3<I+gWFL&gY|M`^@ds ^GE L~6t'+n}=R$L^5%yW6/0WRϮv`3*`y4&?"_X<&D֚yDraCśA+MZ1ϵrA>sGVWH`L->zx#]O.Oa熂 'n'rJ"`}n@a "zrzx s [],xu>WKN)$I~K?鴴xd4r endstream endobj 852 0 obj << /Type /Page /Contents 853 0 R /Resources 851 0 R /MediaBox [0 0 612 792] /Parent 850 0 R >> endobj 851 0 obj << /Font << /F8 21 0 R /F29 18 0 R /F35 56 0 R /F28 15 0 R /F38 68 0 R /F32 50 0 R >> /ProcSet [ /PDF /Text ] >> endobj 856 0 obj << /Length 2713 /Filter /FlateDecode >> stream xZs۸_zW*A2u&n2I9sӹ-ѶzT$(Ҋ3KX糌eZ/gYD"gIH?={%~Ld?CE4m9_Ɠ'VF3>`YwԗO'V'ד,8bb;1]yj &6KƭH^=ř 62YZGlA 5&XC.VO e 5XJ"3#A:) nvOYZGl,41n͑t+W> oq0v}E@xJ?{Dx5y*a.ݕۅ(n[#5Mc% }}9 9 ?7t1R6jiP55 A%y0iig2Lg|$քu^YggV]%f@'Pn(ف$5-EYpYQťvu1F͞r/cv!t1a"+5wӧdSDi_#l-1nׁB;;5f,85حNͭwLCۗoB0)w)d@.$>Vt*JXH:[ o}̎Dk(\KK8)D\֕5V~B1: *T/ ? s Q.UXZGl); a:ΚNzڋ0~s+h t WTwt!Q~QMy ~X|s]T4ռ1 $6Atu]ծiSG 3D|0”T(}*o|A!~p7^[۬Ef]iVQo`hyW0Q9}`2L5VWc~/HG_qMcmUK빛u9w1ﯬGt֕ޅӲaiK޽%8p~[iaug\kVΏkM2.=Nɝc-ij$t뮑d|j_L ~~|c }c!Qv#mάV$п[C4Xj(wcv铥:؝a3'H߷j }%jZ% ZG-tN60(#,[ ;QuH(\gB ۂO͟;:[j3} =b d;4i;NZ`9O?K8Z8/M/RCB<}A/u^[4dQ黕iը$X(ȁc޷" RaOk ,]bkDGRiEn zBgB ň=Q)ŴHیsHh]y鑣ra+\?{n3bF 9#>ʟ5b#«((!Y)T'#ٱ,(4_RǠ ~69wBF'Ywו?h&:[R/Cw6vnR~4z.`7#bϒ>|v XK@M8vHgH endstream endobj 855 0 obj << /Type /Page /Contents 856 0 R /Resources 854 0 R /MediaBox [0 0 612 792] /Parent 850 0 R >> endobj 854 0 obj << /Font << /F11 65 0 R /F35 56 0 R /F8 21 0 R /F38 68 0 R /F32 50 0 R /F33 53 0 R >> /ProcSet [ /PDF /Text ] >> endobj 859 0 obj << /Length 3412 /Filter /FlateDecode >> stream xڭZ۶~LS#i;<$sc$$hwG$G AR|9>b/,fH#=)@Y 2T7?4O㋥R"5&56[\)HFi,dVo/~]r:MfZ @Ijʋt#5cRTA-lfUXMPUsR_!۳e(j"HuQR\"Cv`&z &"LYUDq *&[!z[1?L4{q(BP-r_=}n :k߸=Z<{3[H_Mi?8ݍg 1)-G)-;RNDj2>XSOxݗkZeey|kZBIu9J' 8ְgq9(Jkw\ui}s֙U =r ,&ҒLzOЖ,}G Ù]qLCh|XZK؄/хa p֒V<ǑMsVQAt9Z'$n]nдvӑ5\i*mDLI"DyA*B09*X:JfƀQĊ􈍱 q 2vyF238@٤W o(;Hhy_x͋q^3*A<}\^ [ _)mjcSu&-L&H[I_bG:+$5C_W甿jqv䔭@F}{7^wh+`>)Q.'. -FH GlJLeUjN#qp&i䓅2<^zk5x{qfGf7Қ:΁I!Z&tGEč|AD'bhXK1;1Y#FڔAU{..uڡ,nf|Y`5tc`ṑނ!RCÁy#8ܞ:!:2ګg;b_q6rj!gruM){ѝͧcXaRQ5d mҴYg+L0ʝ_J'1 QO(@Yx'1qVfn11-ewnpH=g[́IǒP< oHntI*l xx VokZ *sgn:hUl2]ȋRߑIdlnzRj/_=cˬN읋vz^#QvIXkBdCmXq6歳ab͚;}Ӓc5DBK:s_] S4t[Bs8q`sǍ0b~Rq+g3ų|la-?VUWh^`_Ak7ڸe@4ѫ2dܪg*Cs1‹Rzx&OU=}%x:$;l{S1bUNRQ&f-l[\NqNS2mݱ]ѝٓ^ ;ʀlWlńv8$1 ,Ŏ0Nv@ 8>FDKҏ'>č$q?GkwB݂Ҟd|&-LJ0需ߚObzTyh2aT 4Q`äuPJ(<GIE)ʀ T+h{xՍEPI su:60c!zǗ|L m\%rUܵCe40tX=l=p͖'pt.:ypngf Sv+9Clrt /TMwQk-g6EZ+^~!GqtF)rOA҈XGN3Glp:u R(:si 69q 790 ́ endstream endobj 858 0 obj << /Type /Page /Contents 859 0 R /Resources 857 0 R /MediaBox [0 0 612 792] /Parent 850 0 R >> endobj 857 0 obj << /Font << /F32 50 0 R /F35 56 0 R /F33 53 0 R /F38 68 0 R /F11 65 0 R /F8 21 0 R >> /ProcSet [ /PDF /Text ] >> endobj 862 0 obj << /Length 2872 /Filter /FlateDecode >> stream x[[o7~@a!l qDAHZr,{e)m9p4K<|s%' 5Ėb4YK#M-&wB./;\f:9cRJوhiGY(-K?1 ˈrT0FRC]" _WINgQ&oT_N  {/_@GlĴ$\Qa]^{:OkF5%'p8xs XE2  ^{/=;=vR0֖A2%#gAo /7nnVf=g |{z dž>7(3>O`\e. E XLU c۫d[G;'Ջ gY=+Ch"X&uTXC[*e̵ ]sssB+/?,f{8>?9;D˜j~1;C:ǫ#9ȜjlQoa/7p+DrT2AHE֍>Oy1[mVHi'{%O j AH~ L׍,!iǖ&N)U$`mmb>:G':iD&5Lr"nsߌSo̝L218mqLnE s͕ C4YFA\2np$Ůİ25NSbj[{aܑ])!3I o$a̎6n_wX*I57kP,)ZL& 5)C+"m2Ztv*aP o_aBfl{%Z,"DAD!BYl< ;A9B5MgwIQܶ8E0%1s˜~a)Fsk8W0(,R)5b RT³f /^Ö^Xv[,sߖ˜4:vRjE5( / ة0K!yvkfbYK|}XN1㘴[8Vdare _\~3Hm[f+UHR7< ܒB0lͭ3 U,nY?]>~g٬wq2o$@r?9#oRTNA.7K?c~}S/;zv]/C2inWLmMwr^GSq{kW'-Dž i -|d/ XE֑8Q\TtUFj+Bcȩgb+7)!zE_',o'u E#_",$Tr'mIKb\Q>%՚(银P44ߋ5zeX)d)0#^U$`r%ɌCZ{A+ߔMk&0S)|Avf - ׬A.׳m»2È5P0@ W;K\o/Y}b,o[;K Z̾ksA8e0E)z1_uѷ4S67;/Nla:9'k{*^}Jj# Gΰ7 x#l}zj;i:v|Zh b2ܯ rKT*t 5}&TIXj!d099 \2yl =6MG} Uxz&̽*b#֠fA(sߙ%Lek'Z@m j(! |󎹆 1!f|A& 0%jEHAoc>9I$)$ߊju jeO g)+$[߬mpjO') Zۜ{ZO;p끎z{ P_lf*㷾/V *\ٞ iH:pA$o4p}}VOwaLh7 /ͮ,ͣ ]شbP\CTP4j0qB`VeZVV@Ԏ=(JE U$`Txa1~5yyAv⮾m_zY \Mb:kP`\c ؑ%<JMn"dW*0gl3`xg&Vݙx(#J5}"k;4̏.YA+:LARi!\PVpR!7I*AfuaEo9VW+rF p~ XE֑ۺc{5xq0}oeC1˯,nm_shUW6f橰 ;ٻf y>c lx 85ȑmp*.PQP3i暠˜]|7XudQC Fs QL<,;mnm2!# #xj^w; VuQN8#Sa`Å[c"$`v+l"W: ?c endstream endobj 861 0 obj << /Type /Page /Contents 862 0 R /Resources 860 0 R /MediaBox [0 0 612 792] /Parent 850 0 R >> endobj 860 0 obj << /Font << /F35 56 0 R /F11 65 0 R /F38 68 0 R /F32 50 0 R /F33 53 0 R /F8 21 0 R >> /ProcSet [ /PDF /Text ] >> endobj 865 0 obj << /Length 2883 /Filter /FlateDecode >> stream x[]w6}aF( 4Inu4Q=<(D\}$ Ih  ُp6*>\%L.,)L G'A+ 6SJfpYКSRp=(\hrb-bDWsD9zano{}.['g:` F f8{\ ­|Pkgo~k=u2ɉz }cߕc*QfԏMCծi*0^M.-AKhN>k5,A! .Cd;71I# ,I&i HnzQg-gcã{NX8ݗ͟;a9.r&f85>`5 Cj`{^~^Ejxg!D*E(Èy8Ɵ,hp;SAb"ϩ&Z,BnHt^*ɋ["eL+XӶC nZHxP:KgT3BHR`/㦇C$1L֝pY/Np8]>-0) O %8k 0s6[+;a=v _aPqZ=Ҹjv^["r;|6`}bi 뺐ј/jx\~.;)dM :c%"G`Kb}0k4& 5SfFˆC9S?Sr6ٿx;ihi.tOsk,L WtNuEW/LҰ* Ӏd#3-˻{o(Xw^+,̋`aNkX "R7%!V<`ɘ ,,V%c1kj[W5}F PjIn6}[% Ј[+,48Z06LY8z$G,'jQneEF+WS![Qrl%'劫n6}d[% ۈ7kڶ Ҫ,V#+801f>E#B825Ʊn'E[EĭB$j!"1tm1 P[LR>zx|хLa,TlhCY&yz*6J)A1{+dY؅ Y X@6 3[MV6-6W8DX6x' PI_`qgiPq- VyPE`BPeP%T1?wJ+<-D:P6Nm(?Y$_*aktNQ1UOq*"͓r/'Xu0 8keX0DS+r:Ň6Ke(VrV4Hs-dݻ;_FF pJoqv[r8]]X ]ᄲG'z^ۆf^} xp-ҷ;lK_a>4<,Bo,fSq-sׇKd\N3X U;iu9 anʯ>{Lejƕmy=z)W{c ,gYBOM0pL)$-ٽ?* ï[0[+ *Ha F`e"W"ZFBM4^f_o曹5 /wS'['iG,hCm-1Z P'Zzq&9\Wl:m]{"6!k1-4Q|+ڸ=6~qbXJ#ޖ ybd? ܫ%3~N]`Ss2u ߖx|Eb;OfoH 5N.RѦ'. `sfe*X $rz#\0Bc)LTge`A4,xsP XIVԐD] s 4J3(Q'_G0'N_ob~pF[Zݴݣ*FND 2HLHl_n1!4e endstream endobj 864 0 obj << /Type /Page /Contents 865 0 R /Resources 863 0 R /MediaBox [0 0 612 792] /Parent 850 0 R >> endobj 863 0 obj << /Font << /F32 50 0 R /F38 68 0 R /F35 56 0 R /F11 65 0 R /F8 21 0 R >> /ProcSet [ /PDF /Text ] >> endobj 868 0 obj << /Length 3358 /Filter /FlateDecode >> stream xڭZ[s6~aF޻3;ӦiNdJ;;mh8K*I~Asg/E.$\/JB"Z_mM\]džaYP^W/^J)1-{Էs_mw0+-RןG)y8L+>O+p`=xӥIdJk;{>S@@.BCHt,B>?b{&?IPo-ALςQ h5'bϝ6+^\ ,%<R'ͮ+">f ?(Ft~źQ 0$F}JLbqI9D':K, }~}yaޏ~"_Nu"w:S s5,Pfjio yex2) ;3u< ?IhqŽFƗh[!1D,z8]-V,69)[KiرZ}5مSTNd@pس-Q%0wT1\$a2ra7qk5X%nfN\oDjn;q+hSF&+_ZG-!̰$貭j[e>> endobj 866 0 obj << /Font << /F35 56 0 R /F32 50 0 R /F8 21 0 R /F29 18 0 R /F28 15 0 R /F11 65 0 R >> /ProcSet [ /PDF /Text ] >> endobj 872 0 obj << /Length 3316 /Filter /FlateDecode >> stream x[s6_t6GnfGizԖwhL3o PIә7wy~y9?8|Lg)O'ILb2.dTS? Cn$YIlF /Ƕ6kxXopǩ/k.z3ePMRF!/␥wl;[W;.Z0Rf.5_(dQq]?s!KǷ78`6?@ODDi:$'~O|gaL>B3n&yZА--!v$B,8߽tw @J< zͶXHwlu){psIAʔ&Jœxcio`LI,;ypIx*ǁjh CM"ƓMDa6h>\oZ;:ǣ @?W+bX<1[ Rޯ9X/;ZyUf5 4s\nh^ z%B8T. (BK^xߞ^O΍ ,fA4= J$,|HE2,"@nPIӔb]%B6 "T6;u5[lԻӬǃ׭MyxK, coм6āAϼ^LFppVm;DfJikvgUzcC[#YvqZM n+n0NocGO*#ibaiU[]!gRF{0#<[:^Sӭzh֣ vN`peI臘P,rzHTіX-29 6`FoEn Мeġ, "cZ#Bcj[8pB=Hw3t2Ҝ5MBZ' 8Ohh !O6MYkj<䯌 7UXߡ8z8p \x$)OG&40RЂg X ,%XJ׫i4H :0LrYKj9s 118w* CQ<\Q*/EssvWӘZu z\'cX4[js!Yzl؛[n;lKʦ05FEihg ']϶;rǣ_j7;2L]\g^1d}c($&h_`qb#dIUFޡw̉BHD@לN%O輹M 9uȏ&4B[RwEdaù`̴|h3 p}F l 4N v1Le֖G gwaH lxH"+Z+ ~zqrFPG* phIalՙy#%(]w7=Z'O`o#ry#{ SQ2 ΔzbJmh&(v jUŮd 60 @Ckz-Wxn{Νrz it;R,mwj wN*IQ Oׄa(II%bv uOn `00P"n+wh7a1$%#R,X;xd;]KO6:T{2^?v/q (84Lⶲ)Z]ַ? /#֭R"5T|AXn10H;eEA(akpY^vVIڻ9{bV[ۮ/O2[7٭f dᤋMjE1D^^̵k--ӨUPByI2EǴLm6[23VQ t SR!]ánNĆƔx´Oť0f&:x{}9# Mʀo络v*Baʩ*$ K$)ݧQa f doSGk ke؉,7P >D(iE$1Ǹ&EB왤)I3)} ڭ JY #d:(bSH~gHrBKZ*J*"x7zsW]it/V!t [ޮq5WY)3e,h.SK4ҰJQʒ^0-ӰSIȟ/`#[dωsmiin܇1a.$ک#8x䋅p1C{I@8vl,KfG|[{`Iq{eKwu/$#/"혇6AU@3% A$Gfi  ҌZ޼;w18t`00u;~3;'4K1 V% ss+Fנ`Xݘe+{ *(H["#ZE^(dĤb=ArJ` e22"5 ,`Qvu?vC9Kk`Sgz P"^u $j$0Dنx<;Ú} k ]B^H={"ԅ 9cTZu!ikkZ0 ar& k,ofv5x g(-˧~kaKKv㷐@3-Rr _(9Gt=x i|-(- 6t}-(- @s B8-SQ!bC!_DD"3W.֭ͺ8!50!ͻ?ѝuIB0w3IBw2w13;oo7KoV $(:\?>X&&+q$j(b.K %@3 ')$r\DjV Q'X,V_2.`ddo. X{X$͘15"9͊l'P!ج&t 5 2 e:Vj 'X}L _}>QTGHAĭQ 3 endstream endobj 871 0 obj << /Type /Page /Contents 872 0 R /Resources 870 0 R /MediaBox [0 0 612 792] /Parent 869 0 R >> endobj 870 0 obj << /Font << /F8 21 0 R /F35 56 0 R /F11 65 0 R /F38 68 0 R /F32 50 0 R >> /ProcSet [ /PDF /Text ] >> endobj 875 0 obj << /Length 3123 /Filter /FlateDecode >> stream xrFS[{p\N-yt 0(C oUy{'g19[͸3!<}go{[H)+7\e]ᵙ} ;=13zL鵠KRuaՖm Ê|KT_f <-8gt}pxͻ:.ޭ.8g|Et͂P2⯋g ˅d3dz`q۷byZt8`L;E)Ҧ q>4Z1d;1DF2\Ͷ,OG#K{aG͛E}H `ȐI~,E kH:Z'Y6J̝+ j+3bWTBπfB:MP%`±tkuO֦ށ'[S^ݮKS2N>ݥ\#654ظOsP\ Hs֙~L)t!B}E4W~EM Zt]UqW4yՀP Nuc؅{K"Nr7殧&5C-Ud~%9χf׀H 4 k a j'xDZtvVÇ6`faMc3а.j7CK@yвтRVoW]zWo`cuusd2]ԢۄVe59׳Ԗ;-9Z[> <-w-jv[cW^X$)7Z Fɭo_\&j70P1oz~yQ _Ǵl!F,*ڮB P@z6(|k[+E@ymeҵ0!JI|a8h|s*ϓ̬%Qe3ۖwKY^CJmR T)v Zt"o lkdV:bR`hyt F=P V ȄA$MوFou!`U$D E0Vrses5=Փxx%!;M~(PD6C 0 @K-z5RgQjeS[N.7 ;AUr[>4[ƠB*7WH, (CB2ll]C=nKƞ5ʎqa9n`)1w@Oa%DĻSl)5;Qi ݽ,I1<[3 5dž}]fvhCJt1i31}ZQ śO1NG:ۥڔ=`z  lwfvPt6d?LE} 7yzŽZ7dىj#S-8ɏ=/$}QXXb>VS:[{i8Ĵ3]{ytvuqH9u;ը/%pƣD H!l ylhAU~)v~Z$/ Y`gzODMiMkRrS$Kv_E`cZFmX&! Rbkqr4`pféDyB`MQ`gBFY@ ?baeXxWd1T!lC13vi@gG(G|> endobj 873 0 obj << /Font << /F35 56 0 R /F32 50 0 R /F8 21 0 R /F38 68 0 R /F29 18 0 R /F28 15 0 R >> /ProcSet [ /PDF /Text ] >> endobj 878 0 obj << /Length 4581 /Filter /FlateDecode >> stream xڵ[[sܶ~ׯiRč3QZrNz8^-%׊{. .)*㑗9POy":"OTN}_IzIܝ>u-Ӌ&oWmuzO~䢮ز-wJrUs(\%ESKs-Bvo'LǦ."nM'z 8)lDey'Ҵjb$ `pRj ;.//f[!T)Hho-gAUV$"e`E/Vi<48r\5=58R Τ%֓Df4FD?xn ֋]YP- KhG| i:bqovӦSB7teb bb˿.x3X!W$)/kO1r[D7 NH\G@~r`1+f~}kQ)oB$^[=Iᢖ&OO3cZ&˧uŽQ&-]7 {:Fz }AU\"P I]Û6,`[p.Ie7ѩK,؆c'К V X`)Ch|1DܩH<Xg%][odFcPr\{QP22Ӌk:Q2 +M0.zp'FvF-=H KD@OZ +_p;|xLLf̭e6ۅIlDМ=˓4?gTГZFFKPs~K03X5 =ZC-!m@ӚǦRo3/a]`1wD驰8`_a<1BSaib lZ/:\׏OV$RO\M'Ea-]6%.FIȎӚfk4r"+@ 5hU# <2/c/B 7jk`/],M߲KEο{Ld0H1L)$h[%ًZFVOD )Ӛ]"FQHoXE\ *q"7hJDiy)ZsT+[CSuvl<6 u.L,= QZ oגW]N|e+QqPmQ7\f;js# 7J4."_oТr]߱rk~ N%7&,Le *E){'L98]b%?*6e4;xD`ֈo:õΈ ZWo/1%4ay~k&f'fXfE6`;YJM˜N(5C٭H|v ,=훰nWV<\ݗk=6ڴwJbLiEsvAhgO7;Okwf$4Hi/4z<L;f aPK_JJ=[ؕfK6𘬻 쳙\Kk Vd^TqB[CmՍM5-K *6kL :L\e3K<ˈԔ`dZF&*B" 8)HqhLjp\D칔\`ŪQbWvrVU`0p,0Pq/;4'!*r$?}OO(_$\/#_|Wm6Mfs$K%|d>UڑDsL+J\]cmxIT* hIލq O$O G- Y>]M*ixvX_;'ݞŞֻʆ}:"XÅf3|>r}tze{\H0T`tqއ!ƐuL~.@m0l"Eˍw5#宯[IYXoS#_p0 Zn=TjkV)S9q$: UryUHCa/6>,\#%t䷾#>tԈMA*5<3C4cǴy@dڢ {^7  nw _"{_s" Xa%D_(JE_SxN<jLkxХߔ(~66,މcv m Y0@''a4< yuAS'rT16Մ HEd&|(~.A|bi~ !:@,!=&225mRAd`2OֱhIj(g Z,cϯv':r8Qw`)tYO+!J&iO1֚7h`smYv%% 4i$d FP= 7cȳ5j49՗|AuN*a?DHǷnb\q`7ލjHۈgZS0[;6q~u7~L8lZ>,?xۯ^v/hf߭ڻ2tT݁0Rц㜢YnWVr45F]I9:iv^44Q`8'Kbs57La})4/%e'~V9%~ײv$Qj[l05|muV^ ?I& jI2jZ{(߶U9%YI}`5IC)Dy !DO',S?ÉSji;وONt }磉f )-g-NIsvϩ, rbK^ӥz]_&]2c s$Sfy7v|@ѡ6j3)"Ơ CikS-C m>0#|m2U`"rH KJ>-3iSI endstream endobj 877 0 obj << /Type /Page /Contents 878 0 R /Resources 876 0 R /MediaBox [0 0 612 792] /Parent 869 0 R >> endobj 876 0 obj << /Font << /F29 18 0 R /F38 68 0 R /F35 56 0 R /F8 21 0 R /F28 15 0 R >> /ProcSet [ /PDF /Text ] >> endobj 881 0 obj << /Length 3246 /Filter /FlateDecode >> stream xڭَF}B09lyxl8HgEDID(R!)OߺI D/Ruw5>}HfsS/=f?=/nV[nn?-t9t5gOt<~|r9T 4KAaǻWOL]0'_5ZtnuFݛNЖ U/0d́Y7sT:%~\D{NY@ȳX>,u(@C7R߰ϟ2bv6Nu4lyѻewder.KR0qg>e?= +)!F!3$$6 H]4ªlMn+hшb{fT4wkyD&-3hIJě" AinLGP9VuEgN.ڂNDEc4D>[+c|=!&aEM| v R6 Gy㜱 ʈX+o~DpGBF: tK+gx4[G`ӏ&XJ]6eiS}aޑ>0z%.jY< E .H@B46$^:Nn#XL{$kzzi GC.M=ΩzVEh,4Exst0 0q@8I)^ x[pYu+ j2PG@28e~-EY k$'{N&ȼ`cRҺYg/'6 i١HLia,-<&z&49Ã*ϗ-: ?R!OY##⁧"<$ܧсq%.<0d)A_]{ X)T  X.s3 QˀS>d.h|γr+;T̵'ro]u%:QtƷHZkLP[.A0 RX?ǂg fV9Jg@#a'DMTkLc5EpuZ8$sy z`?D# MߋG^,)?ZUvUV :x >׉R\<ċ1S󖓮L)*Kޱr^( "-yb@)iF)-@UF<'IX+ 79N2\)ȶwy_S#:&!FOپO/1q(4D<.GxQBp $?'p> Q>Ԡ|ĩ,i:*VaBrH?t5?+CE-eh JZ}[I}`+s\^+Q,x AƟqM5|%Ivop"㐫ց7'ͼLQ@C+NO1<yYz5TK[Y;,aVFY$ &`gdt߳єmgaN"JKC`(Hn':g.}5)L"hUbqj/eq@45>!a?eaQ^6 ]F>?x^M2ə٨U{7v(OBø"B&J1XLE1K  5nѳccܩTGk$*_Oʩ*-) 9ոt475l LE) N+%pl \p~y٥?WCєŧLF%e@y)O,N9 6n2TyeF_YU3u-ɥ`[|$z`v$u$9){`nv+Js6}>2]ֆI$c^n1QQ<Q 3³GRK ww=gD iu_i 4tTGzJ=ʓ{ag"+2)Cyμu7+/btQ*0a bWŚNhN endstream endobj 880 0 obj << /Type /Page /Contents 881 0 R /Resources 879 0 R /MediaBox [0 0 612 792] /Parent 869 0 R >> endobj 879 0 obj << /Font << /F8 21 0 R /F35 56 0 R /F32 50 0 R >> /ProcSet [ /PDF /Text ] >> endobj 884 0 obj << /Length 2619 /Filter /FlateDecode >> stream xڭYYoF~n v{Ɠ` IhPBRߺL~ţ꫓'goOכEzƘE짞'G{K7}R9MԉXutJ g_eUXW7_8{cEꥑA~*< X^(ұh:R}ltA.f! <G=.9>Q_1ϼڝ~/b}/~8=&;=݉$=)rG.PcL=tܶxr"Z>hBqKtp,[ ȳH)21^GR#AMc|/ApL\o78\)>!utul~Wy"}Tp T/ R"u9n3%N BzNe+wE]D#a'xg\_+dQvȁdWW)%=^hioKn;8UtpwQ 0h{18/\: W=WԌVOդ4%7q V-;IJ yeC&޾{vO"WDx#deI76 ww}N,G<61g1y@S׊49'>`0:hā6ESgkk%Ij+ `;x<@hM>#8\_PL+G( mth<DG6<j]nwsdrtЗ@(ʒ3;w%5t#SjKq+x4gevdj(?hG,ޜG7__r(iZ8Jg) #=%NA~iGT(هNS&&2τ4$e6]Y$F{̲FBe0&+٤Q GsCTb;BY 7ܔh %m:=E}e6Nx6nVvxF}ٗ=ء5B&j3L۬RUJIq ^۴26,c u0I<pZxe$4; |4=%2Keu=$ʬÕz{N.T-Kv ~eU㴯igi.w!eDX{A<r74f&)ǡk Pc5xڲ]Y6yMJʧ{v#ߛ5*:t7r>pmu[l)4'MDG rciIϞpNSP+?oZؤwhCnAqA5}ngP+lš|=o[qt7(4[-WƊ@oݓD>4QtѐhN.tX;;s endstream endobj 883 0 obj << /Type /Page /Contents 884 0 R /Resources 882 0 R /MediaBox [0 0 612 792] /Parent 869 0 R >> endobj 882 0 obj << /Font << /F8 21 0 R /F35 56 0 R /F11 65 0 R /F28 15 0 R /F38 68 0 R /F32 50 0 R /F29 18 0 R >> /ProcSet [ /PDF /Text ] >> endobj 887 0 obj << /Length 3517 /Filter /FlateDecode >> stream xڽ]۶~Zi_$Nj'N[7NS'y%މcIH~} #E{r> ~aw'7WT>R8kg7LͲĉt 9 e@{[i </~LKLfKerfy l^uk"mbF:\sת楀ykpͶzh:7Ǧnyڛ-R[hөuDVHMs}p7ܛZ$:S[c_7:[#Ejl ``) kh}Z,ʁ^hӾhpFe'$;ӱ)weOAggNT# p2.b_`6_ԇ!j zdiPvP\,) (ϡ2i!<wWͦѹZ{-rz=E nF Sw|V" @3ZU J1ؗ 8Pߣ*U${&F`k7:_}wsLδUBfnTYV߯~-ُW.}v"sݕ.wk{_-e=Ac])WCT$.{t ѱj5&7~]Ł z祸C)&ryDH<(̞x(G#i#;4S‚/*y]܏rʑ/ f(i\*UGĖޓWѦQԁ`xOI RW{fSж@Iy86bύ}; OFXwq WX7CgK[' ԣP-;\K lX۫"T ePJhp.u!3D j%2y oA*ou F$:a$a:JcΉ t_LXRPJTSƖT_0j0*& l8x}5>Q k>F9[rY%rD^MITKF4\Kuk!Q;+ D "0_ N_0k0jd=Y6S B$G N;s/'Te)_x8ddOP*pp<k˸Y`HQtxxTHmכpxIk/BZ5M89 N.L.kE%W) ܣ *op-cg[@8X6PyE"L 6E;UEpC,*G̩k5'r|QɕCI] 8;)X/.]:86Bi^wVÂ^#3bjw6+l,9[$4m*wj^@=\yT,U t *l%Qp-#dJhDaU}CM8/%DFcs)K`^<+2/ƅ1ZvFT }O7qRmP9, Dыd8aLC&MFuo4{wM:Ӊ70W9Mqn]w]tqAdVGw|>ؖkH%e3zZFȆ;&8mAe󸦉7"ڏƏ G /W.V٠5A$@q*LE A>1{ &c-ew/j}M|9Y|\^t Fpؖc~rۢ$ʄ1DS<& #ԶѣV<4ÞSLo )Umf#&+"!Tl`$2y\ӄiG|#l&`d]& "ŝٔ޸;}z6Go|c3H&,y& endstream endobj 886 0 obj << /Type /Page /Contents 887 0 R /Resources 885 0 R /MediaBox [0 0 612 792] /Parent 888 0 R >> endobj 885 0 obj << /Font << /F28 15 0 R /F8 21 0 R /F33 53 0 R /F35 56 0 R /F29 18 0 R /F38 68 0 R >> /ProcSet [ /PDF /Text ] >> endobj 891 0 obj << /Length 3753 /Filter /FlateDecode >> stream xڭZmbrK!#$@:WRe/9u9 K<3$`a2BZ-OlejeH *+-Wyj>Ѿ9ɒGٝ= ﺮnJ-V2zc=J|x9迗_b*RJH0H)H&_<7|JVrR^~=js8Kf!]RºٿˊG>mfe0n+%yݜ$&`->ČH^:Yu-2aRafFrNiYf&ʹ.OP=,o&[R eG{ڬd"lbQXq~4}hy[ǪR ,fZGsM}}u\7C[u6t*{kRK#R<.uހJy- mxԢt_X65Hk~;q}M p3SU^WnNic~%XJZ}k% Xu&EOVk\2"J и+׶s +px iD]4W ޭѓopOBs=ҡƖq1=lq*@خiãGe*qȱJLP jmwM cXl@pi}whn >+~v<2bl3i[w7^*_іc.]"4=_u5$ꖦ3%~Vmzn; Dt4=}{S>^nDV鞏$+dB8_T-?[@ 0j]2m_;H<|' ڣ,v-b|ۚz8B\ H02Sv[A]O5[|=!.;?*6p?'7^.Oe]IK{vFGO|ܢc,mDQ%RcH9ZHJ_H1TȲ 8r⑰%C0ilKO!3҉ԓѓ V#ҀOlzSnCMؿ@I|7bI ^G"Ȥ: ^0A3~[/83l`x-Rc/Նs:`ncYefM~%dQ-4K 5E۵x‰fjm8a&o9=%s@ʄe\MO-D/ks]q$^#LfiFd#+κ:,NYiKsS80aGbڸᕛ?kR a_/`h Q ^e@4ؽЈE#Ys0Z FhF5'n1JGJ)\'Du'԰3\E0='+z`XkHC,l %~7q5y*nh٬ Y?=552b..7KE)Yr{2[dHi/mx ّz$Nmv|p,?'aa2{нʗNV<6/_~1:G+՗/_,Bn H{ gpQ+wm_r"4B *_)Xjf;ګVEO_ˊGE>cs :ؽ~D]Ay9\7~olG喤ܯM!5bm}KoO-*qGPV!X>ˊ΄J3ukz{VYV<6_1a>۔:V.$Lܛpt:0۰zae1ѧ{JO(9)y5 ¡8]+, {/s kkNx>Kg+T*5@Cd@9c5J-flpl2v]/)5+o}QA;NqofpMaW*!^ɊG'a@: fiWd )7:K>fjɄD;fxbRdxxY'M%lbMNV~:Ҙ#BRMJ>6˂}I-G_q8x+כcD"۝$H9%6۽So[q@jC,}U3rlq׹̖^T]A(b(B ӕ1sC z Co|qaZ4L'|GnF! /['o9 1ef\u_`}VzR+g2+`i"h=?q⑰"Y0Fh/dx &*MQ9bဨO" 7Ldx$lcD r O&́ KB^~>o| endstream endobj 890 0 obj << /Type /Page /Contents 891 0 R /Resources 889 0 R /MediaBox [0 0 612 792] /Parent 888 0 R >> endobj 889 0 obj << /Font << /F35 56 0 R /F32 50 0 R /F8 21 0 R /F29 18 0 R /F28 15 0 R /F11 65 0 R /F38 68 0 R >> /ProcSet [ /PDF /Text ] >> endobj 894 0 obj << /Length 1266 /Filter /FlateDecode >> stream xڭWKs6WH9!LI9uzp:LiH[U],(Q㤶/".>|^[?q"Df~e]'e'bܵ{i'װLg7w1eW q7J6c=m45HdY5~[~>$%R3ovu,[!nMwcMbuZd5kٓ鑂)"id7ig0bb!pnVZEA0 Df3{ dΪ;wҙ|Lعwqr&]g; 18RCZȬbC@L95 +u%w BmmrV%`҄ŔI)ۤ Cu`W/۠1/uu[0 3z*.O7s/<3FaG1C6gJH1zQ.c ~y(g&PTr̥6uj"Ûxĭ*BԓVֵTbv*)v:I]#ǎM?>jѧȪjvvՄAr:=n'|q(mOydQӇʬ jP?RQBa徿 X߁Ȗ\:Jci |wq xy/&QH`@[/NO &$ˆ-L5_!HCrY 6(ϩ!),׊)pCwkx^YrmI7M)'Κt2Z`6d*ДEHc]=c>+& IO!o@[84 8 p . )1ŮE&= lv0o9m< <:F"R4RhοmOx,=m3B.4lA6LdɟLmXh)U]6ya$q Z5jWv|6y\}@}?NʉXq' 3XN D 4A Ե/m gGl10+B0`֊|.c4RϳF`֊p܏w͵kDZclrP* nָcLÿբ0bxwry:%:溲=B&*sT+, ;= endstream endobj 893 0 obj << /Type /Page /Contents 894 0 R /Resources 892 0 R /MediaBox [0 0 612 792] /Parent 888 0 R >> endobj 892 0 obj << /Font << /F8 21 0 R /F35 56 0 R /F38 68 0 R /F32 50 0 R /F28 15 0 R /F11 65 0 R >> /ProcSet [ /PDF /Text ] >> endobj 897 0 obj << /Length 4756 /Filter /FlateDecode >> stream x\Ks#We"7TN7C*+Q+V(R!]'>x ̊cRIaGĊƫF^+f-_>\[K׺DSxsW7V-^v7tqwfW_^hfqW \Pkgy{՟2-3QDn:"*։x<^N(mQ4@BTbx 6*9#~#2gQIandff}->50#g5bUEe v(;z@G6Fayd XuFuل`fC g vW?"Kh0᫻x=nx8ti$a>!VAXI,GXJ믡)+"Kh 6 k}52Fi*w= J;.+ز!3vFҗAXy!g="bUOPd}gz X?I_VOP rgܑI6\=q:B㰽/JŮ#]Md 7hLmiueC0B]a4ʧ ?}7бϿ=pȥ%A}9:})绗qp3}w-C !,w(OҽzikCAyzDzeц2{;7*q*XֳH BMuYuA%1 @A /`j$s3ь PhIRf)X|1ӄ7OTP ,v(4~ؾ:|nO>T4 9=6ِfDC$ؔ˙m4l9hI#x֬l-$˘Zf`=҅ x5**䐨GyWսK%O*MQJg%ub_m) s7L&Xִz:6@1D`s`>) 6?~*>T,mN+wuݾrӎAT:Z9M(]9i2A6LdsH\Ur~ 67G50,E6W/\ash;ː؜Ԡ()'t`#l9eեs0˘ëjI9x.\>00[^80Q1 ,:5%r ,]DLjU|5veuaF.?i 1eqi\妈s q.eeRuCVPr;!|y˹W޺ !<O$kyp :@qKTFdFD\2q-~Ƿ$cM+&i;;t? jMR1^cg,"U$JQ@l%,1Ug`Ss- f8QTNuA1hbf,"U$nЙdٕjh`W*cWN;=]"k1)\d:oA0@Gyge7|5׾K'rpkN\ ]?΂[jl15Q#4Z5BXkJx"VU>1U#*2DRSpAF€UoF.ȧ1|ƺNF"v` ѳ+TBEK)8Ӓ7ѭ{bjÊXxbWhtz! +%@6^NK)KHїP0} )Ђ#[&RqVV~$i9|.\JM~r|Ӫ2oNH3ʙMJUKcD6lΧQ!j*45F%)NBټo׮̫|WH[_ b٩妽]}"9Et;Wn;+tTtسb;C%RPti*RޛX7/iH*gXe}9 ZN*lt.0?;Bw/#ůϊOYcehZI #hOn <2 \ h(+-/`1BC%hi[nӊrWר#/&Z^h2&F2U8f8@g/`?T2]71&(Dq=~s6^]24xlzoB쏝ȹU0gUB5=wN09XK<%fH1yDTHW}t0p6a܇9?5Gt5CF#c.9-X/gr+_REU 迒m#Cf(؞~; d<|NBe%f$Qrȓ'ף<>\'6Nԛ.EþQ?ccQmq=U8dVwƩbS93X*JNXʿ;fiFαpiWI,n׹ [8w|n}ȃ]`]GHyM.2wF}vB'2ymJ4Ѱr#BXy*@GJK72G j\Md6H\i"'` c9K|1`gia W[G /kŀy.߅&w%vFD"CٮB59AB!-3s@WL[]_a>0}Y4(Zra=ˇqOQ\dHC ܱFۧ*]OG2} 0wC)-<3\.QeVSM|0u uѾQQlQ)%}J~phGA;7pf&8ЌtB]+.N9 k xlx!&?%ԺZ #>,لs q71<}bֶ |?g%b+Res XxDX/)<|䣲1igMZ͒rFFj#hb 'F3aZMEb 8VNZu btJV5u 0鱖Xj+HTgvFj;!EvH;0qPs8! kܝmݑ\k[1?Z2.͵Fe֛k-i)~"^"W%5ᔖrqZv*^O(:pR3S2z3O_KKa4,EsW.v-|$ VHQkp 5yR/9[QJwU e3Pٹ [f<$ ?iTݴi\^8.xz]P^o*nq[=F `y:R#.xesH 4.Rۅ92|*fk*W< XjN susM),3i+=-;. ye~yrÍZMٔpnlJ#h.[6Ogݭ{{ΙjK+ѱm6Lar{wᆙPg7w (Ӑ%|Yc-307&EqO.F ymC]q ߺtx>x"|7 ceR“9nVSȳogƬM_V5>\SoޅȶU;pV::e'lu5w\Y-zA^SX `@e6jbQ2V7Ջ/97MhYehV]xc\Zf`=iITȪ,WdHCfxntDō\v}%Ag/`S޵\Ic0(?s ^23kh.ސq͐U/^] k`KoNo||ȯx;i(`qoC{n:[-\Cr bm1~K]xI@tؼ}{hSH 3ь KQ&T~ЎWG5TlXe:d`l1E& %ptC }G>XP.ILѥȅCh%7wSZii~LC i`Z ejNc9,]Kﰄe;$뇕 }x&aDZ:rDz԰/ ]{e"nmu6O_œI *u+7:ů8sk_Y̢Z)bV`ET*S&o endstream endobj 896 0 obj << /Type /Page /Contents 897 0 R /Resources 895 0 R /MediaBox [0 0 612 792] /Parent 888 0 R >> endobj 895 0 obj << /Font << /F29 18 0 R /F38 68 0 R /F35 56 0 R /F8 21 0 R >> /ProcSet [ /PDF /Text ] >> endobj 900 0 obj << /Length 2057 /Filter /FlateDecode >> stream xڭYKFW=Rf=LW*qy<6'Ybe*(vH'hz~e1J,mdxd%Tffz!P%V G9GS,Y̓iw)'LgDX2\l&L޼rB'^&=)aF '6x9e7]D$v>cCТ)h!D-fJO]:Ӭ ].ê.-e :4 -tٰXSH}|oEt ?ul.HCX鶜Y#G=$[8KA^r i~ U38Xϋp[/ zu3*H?75RU"aӯUZ7'Dԟ]VxY9~ PzyDN:.l7""zLt)y%DhOt]ySѧG&N1J#(΋+0Ij7tb=/.=:Wwo; .a5<7ClzЬ 6k8mҏY6a3m14Π4Tu$S7 Ehk|<^&g$ޠ^??|S#4)=]l]-і:1狅G)CO|NDݱg5jLV%t= Ψra{3L)Z1yqWa64Ya` qP%VɅT3;xG:cێ(xʹp+4)ǰцB!iR1AfS8^u/4y؟T ^BmKݥB^U89eCsio%#}v 2,(Qfw^j'݆5O ?H Vp"/UEewe>D:H'ZuO"-QP"sU.NMb@p7Hjp$I+PoBJ!tt%Ӯ0hb# /p͓o<2%[y>]'V6Ν)~&^qHgMc !vWwٞtwn?ET4\5{5"~˽yԯItd\,byQw]ȿMҼfį H-{sJIef;OW}P{^=P//pOo:8Џ7(cZb?ȷ ;/3d5&~֟[ʔˢnDx uYecSpe> endobj 898 0 obj << /Font << /F8 21 0 R /F35 56 0 R /F38 68 0 R /F32 50 0 R /F11 65 0 R >> /ProcSet [ /PDF /Text ] >> endobj 903 0 obj << /Length 2699 /Filter /FlateDecode >> stream xڭZs۸_IgZj& Gns.ܴI:q'Z-6#8_(ٵb ]fZܹ,54U@s( yq\t0WЦqpƧr;:Z;Wns.Ը;u%v/oHQ\E8erf WO)h:cT #KUvk cP[xe5AX wn{ 87$y<'5RN50q7Moi1 VbbcW]Ͼ+[/אb4s)ۡ<eϽUPtws8 W7 0LDl!m^sS41*v<-kQd.';Ǥʤ&љbB&WiIGYE!akr#3ՙJ"Up(MfB+`?P -r_QI" )̒G9ftHӴvB+ChJҼ0v"[5qE\O^qM(DHRD 1OUVmX}>t pN~3&N& 4 FQ岟ebi{J4ezo3nq'pf<p"iU\R )%ՂL90֟<@Q) \Љ2oiRL+阠5Ϥ$4KkԣFOG-ݞjгKfÂGcEvwF`ʁn *, H]h9Wu[${P%u~'2EgDD}WGCm%9A /Xe!Mf1$Cmv*%r\SU5ȔG#XyI0א@'Ǩ(a1 ׾'#s.Qs˛boG ‰kv+]WQq"pEʀYf!|9~w˕N,@iib#Gk<9$#~36)]w#D-H##=>/H[zPƻq^ B婭.&h)@{Юalܥ #^WzŚA"D-(1|heIW DZ;ce>­C,=+R%ߺwW? Ä_UAEqSKcզм9~up׈ZϕJo_!v_u=K|!R+596^,Gm+U `cAA A!z$M&#+,# ^9vb0@ U]њ<4[Hr`.# 3)lwu/) dMm &FD ?,o.$)N}oN3;̬|$ONł1:%LNENjS#+;z=~: EWT+8c;xU1][o<ܠLt;U2@c $ 'u173Wۧ5Mr?0fcJpS)j܇a<}rz={e7Xݩ(vǀM}xi@MN )l]a͋.=,9|Y2/ig; Tҩ;1 U|GfX#$ʂpzcE9:(&x]?V;4BCH/uԈO-["Jl ɶ\XV/ŗTm 9@͕@7+z!{qIg1)^ IZwH.l~SW?b9ZL:4uE;Jvf#q endstream endobj 902 0 obj << /Type /Page /Contents 903 0 R /Resources 901 0 R /MediaBox [0 0 612 792] /Parent 888 0 R >> endobj 901 0 obj << /Font << /F28 15 0 R /F8 21 0 R /F35 56 0 R /F38 68 0 R /F30 43 0 R /F29 18 0 R /F32 50 0 R >> /ProcSet [ /PDF /Text ] >> endobj 906 0 obj << /Length 2890 /Filter /FlateDecode >> stream xڵZYsF~ׯ`VR96vl'J$˻VʩMhcf bb0GOO_4V4H'ד$:28HE`2u[ / ~HI7ąXQDd  ENa 7^<^:+ewx7y.W f.MS7Dx,EU 0&md@/(Սk`kq [@9 K5سLC7$Ɔg#I I*t% .tnt7@wSU=SXifUᆀtuKS^ NK#!q\XluNYWr6[7 !QeRzd, f U |qz[8uu]kHz-apؔ8GfDq˜/@6K(ѐ(Pyh]FDrۑE<6 I@tBctĺDUB Q m{ڭy1ҊYF`3fCpXMAeC2tOqښ/ d0-KK(ĴGah[Z?`JoQ|J[ٜvE38U*)X%z 5칈{,j}jݵ,-3 w )yŃo-,݊,}FWc7Z_lUKh* F?vR}qD3{̨+k {ȇ0lMTr,eEѸ9Zsܻ 6;ooz$V1KrXMQyR iUt.N/Fe,_SZgs|Cbv^_9ɜX=3”RN dIzu~dI{f*R`.hOy1F [٩';kwL L/#9>{sI nslݎas#:={9"֥=wqϝD rƎ~Ul͸@?C)cI 7U,wH#5=z|V+U;p Rbv*'XH(֬Gl`s! nlU-;iON"MLayn[eaWc.m*g]fW+kq7o3;Ǿ!Gǚa SpU͇> endobj 904 0 obj << /Font << /F32 50 0 R /F8 21 0 R /F35 56 0 R /F28 15 0 R /F38 68 0 R >> /ProcSet [ /PDF /Text ] >> endobj 910 0 obj << /Length 3474 /Filter /FlateDecode >> stream xڭZ[s~ׯGt7פUuk'V*eY`VҿϹuo"=HMù|ҼxDb[eJB{zczXoWXﱣ[6u]l{ ެ~6JYkK?'\wJT|%8K Wŧ_~ V7YzWY_h?K3..Hm,͈S$5algZe π6O+&fb? {v=L=k\.)x?ѝgUM9Uê~?LC8TBmwA a/0/=G8lTnC1,JJ3L-*b лY̓kgr@U pL Y1(IȄ/ΘfDl.2 v2#uyTgA7 \. _ 6Px,`${Yޮ|`i-?*aVu喼/{_w=R8( :8u{yuD0NC`7Sc;%Evn, YErݶ e^J1vXWpg^2 mA{E@(zb(DH(8Y=phu҄| 5iM,nC0TR4/P2n4V>I)Hy 1c?*UhRˢ^JBpze S`H^% U 37HcbP&=d CpD5w7EI:d@I3eӡT~P5bw Ñ;H4/\``^>U[mZpl<7Z.WiS?ȅdSs$0,Ɋ*Kɭ;]S5B`=ȖߦY"EAܠq2境` ӒRfG9%P.لAykTw2%a;bE{nؽs'W|'D2in ?ȦIl%>}WǎӀܙT@,\$O鸸Gr(b&ZoFiȠۇqAmPR /ӢuoE X{* ֝ZH_lL؄qHYuFgi$И&1(\w.~.26>;jIYD@&N5S>ұ ᨃ)b5xp,'12'!錥L.҆o]5q;<}|o.=a}C^F޻5HiGV&T$}nXErseoQ+PۺaM>956& rkq"żP2-lO Pu\<H*4݋G>ƪlO t+ _إ9iBtkjgD/ݰYHQAzH Ma\- JBI=(㍍Ez D=YG& #Y-?.MW|::`W/=J#?&T~7=~b/48ϫ?ͧ9t'Ӊ௓$1θ[JD`q.sZJl`F;rN<9ʫ#٨P:Cb|=tJpCo?qhcqiS6VX1(_.ȏȈ a>Ma:9ODu!缾dL-T9&l˷GTKuw9\RCyZ,?Zn68foD^Vhf J~QZMeI8*+`8 Ȅ'4(/馴γrJ-31 І\\\RJ|HJY ;'-zhɵIKG&R/i_Pڟb2 %!@ËXpʼ$!C p,!k6rmU\s3 s|^="HDvcӔ=7{>F!=i=y>j>=fcg@ƅkިYR< [dod*BiSA&Ugw|,y= @fTh:-ib0h~[2_͡DЏR}Mpm#wkpƧ{豩ݩP6}7 vm0p a%)wmuJlʌA?1WhXգC cNYRAN|ppf1FIc':B.CE6C /ꢵGQ?5iB]TC:7bQҴ ď t "rJAfڛrzN$, 3;f {!j HM4gr' P+[[ީ9ζ=\ XPnGZ>48~*il KNd]/ICWǘk^@CJ*&BrZ'ڞ"ٗ endstream endobj 909 0 obj << /Type /Page /Contents 910 0 R /Resources 908 0 R /MediaBox [0 0 612 792] /Parent 907 0 R >> endobj 908 0 obj << /Font << /F35 56 0 R /F8 21 0 R /F28 15 0 R /F30 43 0 R >> /ProcSet [ /PDF /Text ] >> endobj 913 0 obj << /Length 3635 /Filter /FlateDecode >> stream xڥZIsW*@aO/XsH8RN"! 6$8mhʓ\ޗ~5\ʕrwyswYUЕҩ9\dw2IRs70/eV4c-` .YNK*ηZW<Ϡ`Te4N)uJ4E _sCSo=&,zǦ\%Lg;hUNd ʦ*hD'a`55MFOeJ,?0i[ɛ)dL$< 5\;p3p=lضk`2MǀxQ9ͦ-ۡ?ȔiLQ `+&O:O)qݵ(˒g`ɡvTIosp4I$x+Nm:5=^T !$R[Y =xLJψo<#Mr+`lg7qkO\<2ˤ==)E-{qxj܂,4CCk `Ph)[́2 CZ)mZF =S!qG[VNX@/dQWI9e9@&K(/,i㭷]\o.rUye r{aUUVR./ZVbo)ʍbcӰ!w[8ޛ cUy"nP'!F|7DU>gUԕ"TqX,27<i+ 2;zx`dau.<0vUcS/AhO19ey&Cӻ?ߜ+-R474{zEfewJn nzAaM Y7!bwKƴAs,A;񯍒1Eœ6&D}zbg`ΫW" GN=#hK-w`qNo'7!$z`K30t~8)`p`p08 P;{"Z 'w]FAK6W"i+ 0nv⬀>/FM!JL9!.|t>eG;Tj 9a!cxd圥B,wn qк3֋֟QOTZBcF]Btb`.Z\ $]| Zw?@!T~9Rϙs9LX2ZlыFu @c+9(I6ȍv?"!L{$Б8[seHf5//3^zƣYHW>]Uu2<t5q'7ayr~&얟U3;CiQ1KN=SƼ|)Ura1* ._ B,Ӛ"Cg@p,{4c R˳Éw*mG,8׀ '/$'`Y q&139:9l:gid's s[i`35$D̹{]Ҁw>?lvq/1 iG>,qI' l$/}HXܽTȼ *7/ 1|!:&k75u2ĜѳdwulY1)kq2k$C|}Fv6PPbL_TuM`| BlmrJOy|.FP8 %2qOdb eu[ QH`dx䉆:yKYb5-9 i{S;Sڒ>U3S҆hG3cŠifo;y@&Qn6kLKy±'KSB> endobj 911 0 obj << /Font << /F38 68 0 R /F35 56 0 R /F32 50 0 R /F8 21 0 R /F11 65 0 R /F28 15 0 R >> /ProcSet [ /PDF /Text ] >> endobj 916 0 obj << /Length 2819 /Filter /FlateDecode >> stream xڵk6 _(6f$>iHhA+kclɵl~pIvMQ8oˋ/Y},yDęEvsռkZ57uFjޯ+L/a6+@hG{. ^,2x: ==_UH`3u_FX[dzhiY448~?3ͺlGRH@ sA`UoaT%<œ&oߞ^-9t H@0XUƃ$ʌɔ((x"@ZuimeHz[3] g~wah-݂Gu&N,׿Xaѿ^4h'9y_JK[ZdR#iS_!rsK΍!ͻ1D `%_Fx4e3ͬ^ulu~ʳ #l{x{/j`-`bL IS&?zHᛟ 7(opHNifc9ra2tʯ|w? 4Z3k`-`#ũZf'ؑNc֧N4bH.3e_{h}Ք.\=[ mګbCcbk% xKqJͺ.4ִѴ8yļ^xV\a;?pZAd0<ܑ_)11c_vζ=k /#vkӮڿKFGnhœ؝D cHW(< }ч`O021ip&CE-8Y`]EΙnh wf`qK#ɭ;1(zVO v欇7[v1' &CBj 0ŹZD4^2KZ26v-I.L=BKQ?-"(1eZ[5?U7:2ladF'Sj^g eKʶO8.K ^ͤYuNS)jchQbC/ڥ<sE1糲B;J[p{@;^U?&Y$CÉrSW:V|DX ;FbF2S2Y1z;!Frwǧ NI`&\S`-KȾ1[j8L\MC8SB3/'I"Mqy}]4LjpVA=FRjD+I+k7˅༪0? 5HWoMsy_a[vr}::օnl3&'O'Nw<qџ=)ģE-z "-D9&'!?EY,`+--unMz,cMT^0.O=N}=Ej0]֭mQ@vc(Z7 1ӜOm r`رjj$6xp]2j~MW0H -;QIc)̏m,}'I $dU%uH'$pO\t6oV(%S#l)ߝ;h-5s'{-)gJ1VPLB]l=#$@wN7 |1Dᘾ ) Ur#_0.<1Vృ6ܠ:4Ml9Z-Ů?\-qdO"C> y/B2*g+{L(J09] CfDLa&Zzӭ~1~iͷq?8 J<,7: |n`5*{EӣưӦR䈶,'fN)ÉL4Q8qr"Q?1q(KFfZո$nYkJbl1HLiOvVs!Xv8;c41h{6m>'kGph+?Gs}h|b۝M[LoF^a/'rMQA;y v(o2qia2/N$9RG)_;TD۪Nu.Mߪ^)>*lRYpGs#EQ-ח[nKے~m.d 4VQq pUstzvz4ugXFWR:҅V{=el t1@YձtU0A mj _RtuXh))zpa CHF&>;ho(Ce\N˷b:=/ZDbC>p>uY7zqcyH:&T>'R҇ g\5NQvbo)"i4PqK?>O e@|n<{nߌ}[ّpQ66Bq}X ۦӲ7Η w)5`U]Qti=yj|ObRu_HiDw.LJK endstream endobj 915 0 obj << /Type /Page /Contents 916 0 R /Resources 914 0 R /MediaBox [0 0 612 792] /Parent 907 0 R >> endobj 914 0 obj << /Font << /F8 21 0 R /F35 56 0 R /F11 65 0 R /F38 68 0 R >> /ProcSet [ /PDF /Text ] >> endobj 919 0 obj << /Length 2116 /Filter /FlateDecode >> stream xX[6~0+o"/fҙMmXBe#s{.$GJt}HsG~s8{ӥ"fe,S!TH|)QW{c˼^u7lꗫ$#)rP蔅%5,Uo%<~oTX542ȫ =ʳ/an׬|^t0tVT+< N?U(Z{ooş{k;5tH`V#[yaHYWhYPze /AD+ޔ8v/`Qb[ugmcV;6 y[n*MLEJƀ|w:[GB(Cy_ݬhs6NFoYil.lqɫmoVZPaVRRl!qYٕM *hM0lkl\4;ΒGف7nU5=`D bR_3VBF1+*5Kygwc*g,޷;jcKϟĭ=Ġ4,%d G ikˬ:4Z7=sQHE3MAhA!ya,ݗbs"z.㖣lUō Vʥ\S"C$Tnq,&MЖBr"MR۫wVm ւD{9? [?a\=cp*mh2(Lz? JiZD  ~L0i sӴۼ6;*'+hbg ~&V!l`b'FN(ĎW#]2-lZco;*J *iMۻXzT ,Ҁ UBYkJܦ45<]vmIDLxA{1 訐mwJ|<d\AQP:J8qDjʡ2TJ6 G >/aihD찌PqpB .AzZ&*eFƻ6.r|蘏}@@_)!G ,-%2lK;?3[}_O,? U;4``}1"W6"mDއ |ϝEӦB+{{S!CQ4tt9gb?)6԰ &-A/dǢ]#O6nV"-"e .z5K!T_h7Zv߆{16sp, L+_NUÊ@+g5gBj HG EFi7m8%ζL O|܅dmk!.|qdXr棼 "5Ro 2O$YqсA=AfX(0a:xvO_!=4SKϔ(w !b:lա&URNMn@ jb6 ""_qxT/ff l:@{>|SƋ?+u:i6?R[ڌI[t3ޢS{NIӿttO'\7{ 3&ig(.&*rĔy\<a=7eg6[^N9 h70U'Oiz|7/yq%X=g}a܌ Be$~¸w_, ],R<9)'PwZVcـEst^:\&L/KO VG78Q DX +>f=Xs(I`NB#ߛM)cF\~.2f4BY2_9CMK]7c8t;8P`% ݭ Y3g MaHbK{ffhgX |=opz$pҕ&!X<IlsP4^ endstream endobj 918 0 obj << /Type /Page /Contents 919 0 R /Resources 917 0 R /MediaBox [0 0 612 792] /Parent 907 0 R >> endobj 917 0 obj << /Font << /F29 18 0 R /F8 21 0 R /F35 56 0 R /F11 65 0 R /F38 68 0 R /F32 50 0 R >> /ProcSet [ /PDF /Text ] >> endobj 922 0 obj << /Length 2131 /Filter /FlateDecode >> stream xڵYKs6W]*Alf*9dh#2Iy~)R\3{hv7~frXāyI-H%R5L~HXqr*=_(ON@ ϛΝ.&׉+TM2'(6zGI `,ҋ|O#'4ౖؐ'@*nph̃Ȑ}AC n|~xr.zJDqhF^7|o_=CuytT"vc )KѯdsS8X'8;Mi~WؕFhntS9x?D7}Y@´l58y'a5*u_%X(91-~K&0Ҹk#7I^.*UpCtj)&R^b6͖xʆ=?RH{E23m W?|efPϕ6k UH GI .<+ust^5ڞClk gkL0efe"OP(N' 6+\3eReµ׷G<[--`umzFEژs2+!b_~lk//?Ğ^OހmWKRFʬ.C&wl3#&6pcZs!!:7yB Y֗G+9fŐ{8f.yBÉ,%lt(1QQ:r]&WӼY0Ok{HqdjIQAk'0B=G,v)qnv oA{rLI͵b$Fbr5./θr0AJ̮rsėpyE2r*3W㚙*m{0=G.n M} .۵pՍS69Pc#/wY4 NwB= j_GQ}_>zniҵ94:2zP ]\ln0F\W{? O? ^Cs ;[_hiu`^з?wV]|gV]n]zwNzOUn=8gn(]EkՆn{_| y tĈJqҼރદz>|ca5>R@0 Љki@-oard7jV-8@P@Q3'ZC!!=y&G{NU$za;'} UMyR^N1z|%@nG98 Ԡj*]oO'诠z6cQE^3zxHBTuex;F"K ׭!6 ^+v_ɞط]oW"_=4^v um[ ;6zܢh]3B]Dng20mHA[CN~h!u<.v쪱GkH&{wL8O=j7Zq endstream endobj 921 0 obj << /Type /Page /Contents 922 0 R /Resources 920 0 R /MediaBox [0 0 612 792] /Parent 907 0 R >> endobj 920 0 obj << /Font << /F35 56 0 R /F38 68 0 R /F32 50 0 R /F8 21 0 R /F11 65 0 R /F33 53 0 R >> /ProcSet [ /PDF /Text ] >> endobj 925 0 obj << /Length 2303 /Filter /FlateDecode >> stream xZK6W 6-zPd ${ {Hr%YXr,і;m2YU,~,Ww7K>Kdys2|yhvǝ˝*\OJun.oM-śIأ*+4/͏2\&,$J1ȥյ]6^0ݘcむ"_ X^)^;].K}q;(N\%9}q¢8n *p٣WP2QC ڎs!5ktOz`Zef&1̺Y@tW..lTi5' S e0^j"F7a2= y9KP7[6ȍ4zEld̒lmk>:Nv9-E!zCV ]F"`c聰M&lnV{|{2 tѷ9*erbcZ__>Ɠj 6!:BEelB! =n'/|B,WlxW/ D-'B#׋zQsDx\$,}!IrFG/~z v${gL@ n)3R|âHYIL@'HۡwoNz<,,D`y.u*IC.:LoJJx4dFL`̌LJSR{a(dV͖vfHRA6/?a<2oȝBj\g6fvS8rjH_t%3Lt3,qBLNt4P-QQ xh@.ˁ炆(#G`A1ړHR0"IMj ]ˬ;qpB2)[7 ]VS^_*"Y]QPgRO9+W +wu]&<4|~YYu_r' GO~atVS$ 0Gٻc*!W=[hRYkT՛v(Sգa3ÿ45{@ &N9";xt4 ׯp^ۍ/J'혂 DsoI Xvg4.tG=!l絉f05vC~˄ʵ,o$$kmտf\*@S6s k(#`8,)k)9 `z/eaCqQ0, $$sldy#a`"z?Ţ$RYR Q9?sQY E``ArRD !FfQB>A346C0Y8cC?sD 2^`ʓK!zvɈTcO&u "e|) G`2'F@+[a85q<7]Fyus$fBK- uO6r}aB{Sq$PÝFNZV=i;F,!t۲.`I0: To=mt/bD_b{ ^hYCp.@|-]b^ghH'k }I')ﻁE;D1ճ47@jIE5kGd55%7wUs4=2ݒ{z榟J,}gaU319sR]LLJ1\<)@Y 6; 搐܏<>?P~gD:n Iu_!P 1Fr[Fİب BIӰ FkəJH8I9u)·=3eV-4ѥ:TfVy+.ݣ+lqf \;N8oV endstream endobj 924 0 obj << /Type /Page /Contents 925 0 R /Resources 923 0 R /MediaBox [0 0 612 792] /Parent 926 0 R >> endobj 923 0 obj << /Font << /F8 21 0 R /F35 56 0 R /F38 68 0 R /F32 50 0 R /F11 65 0 R /F29 18 0 R >> /ProcSet [ /PDF /Text ] >> endobj 929 0 obj << /Length 1612 /Filter /FlateDecode >> stream xXY6~/r"uo&A9"̓VRVjlkɻ,9yI'ݟ&bK"qkƊp}iWqQUv4v:~={/ f+yd2d4Vߞ0A|!W;uM2M?cōvP3n^~5EEq/s/r.7 $6),M&ܸVU;c[ߊ>  ."}Q,RB]xmjZh;:Qtɋatdzxm-Z,k }r&ޖͮAU@fu/l.]`_%" ه}O]W)we޶o0V*Xon(b:z&= 01m9 8~TE|> endobj 927 0 obj << /Font << /F8 21 0 R /F35 56 0 R /F11 65 0 R /F38 68 0 R >> /ProcSet [ /PDF /Text ] >> endobj 932 0 obj << /Length 2434 /Filter /FlateDecode >> stream xڭZmo6_aЅ\Č&QmТ( 6a7Yյeǒߙ!)KlE C2?ߍn~z$8I8*>} Qr7 LT6xJhVZh^!77+Ǽ[xN~j2lĹ^8r YQnHK2FUZC% xݰ&,9yD _ȕLqgt"9|Г*Q}r0!gc;F>mh0SiӾoX? `ݴdk: H-"U✕JkXW%C{'SQ4>e; vsXrcXbWh8TI8ywo8 z$B˃t}< O j L>NmCtLu_Fhp\3&`Lj4tgp(d21Oj${Z>lDMiKχiKδ m9\wP$jfB&4'nmÄࢮ7<2>eb웥d%p*wI|^|N$ bXFHYTHq'pVYTBW7z5m pwȢqmD"4< >'4Zu1u/JYN'H"|YgI8H)wY0mض8BBRI: Sp 8IʚW]sڦ1j{$).:-Uj @} 3\B/,o<@=Saׇ|9r>dvĹHס< kXXou +k6PfM.ep9YqŌ`!QL.B4`сft>Ã? Ġ 8#g OgMՕ @Ʈ͔@!ItɻV`~4\璆;]#E0[/MA˄W ` (X.6keM[:ltxyNi/ 8SQUTЧR]'F|nNdpǏO~Gyx֧}H݃BWU;ޟhN%(&t}ǎp L'Ξmmlx$0+yZ84B Ό9 [b:x_n+zOt˓3X_ݢиXYZk_ +1|5WCPxy[6 CKSk#w,|.-?C`ELui.Qǟu醍ى5i l0(zć6M^~>M}~JDzָQؾ.JbŪXh6~*S^Q}XX{PTdg.@ت6͵@8w+g#JM!m3BSkအP Dxr`3agx{鋀2= !`iI)=CN(Iӫ2yӸ^7t)pI",=XżAGO:t0.EghV|GASERĸPGne>am N9HACo;-a} eSkLߖb>S4,a/oXT}eO쩧|;{gqA`v 5j$au2b?\-ȁ|K .yKiJ˷t>"M,ȍX[;9/Y̷) | wt&-!#+7!l |>?TN': 06FvZV+mAp-jCY,"3炙e$)HP=]Vk:q =l3lZ_ ê\B,`R81@B/6EB7h endstream endobj 931 0 obj << /Type /Page /Contents 932 0 R /Resources 930 0 R /MediaBox [0 0 612 792] /Parent 926 0 R >> endobj 930 0 obj << /Font << /F35 56 0 R /F38 68 0 R /F32 50 0 R /F11 65 0 R /F8 21 0 R /F29 18 0 R >> /ProcSet [ /PDF /Text ] >> endobj 935 0 obj << /Length 2514 /Filter /FlateDecode >> stream xZݏ6߿O;~I"["&mwbkcἶ#3CRVp(z8n.^ 1fjrs;\Mrnbr}ٟ7?=TiJ3;~>%Ji2KĔʍ_̤+$pB7DLDΙVe~w?dq'?]pØ3aB2kZ]\_ڒJ$" +kdǙG0efLI;}@9Ym m%;͘r;% *eBVjВbzҍc;#{+%몁fV85b,cTHj",њOߢ2<~uAUVE.x(:=֋ #a%6blV$ԲTI,-l6Ρr]ܕћ3,-u“'YzS-ԪB=ɱpVfc1NSt&(ݦ QcÞe§81K ?m~uƠ힯r\G.eҲ\:Xc,K7 j w1[2] `C%Fڡj\!&9W֘GLsߏ)rRo] >"njD1Mz~&֜S߁ 4em;2C*1/\;Nν@OLMx19>9o;xY4GR0^zUO,ECleY{F ʊ8;nVj6=!XHέvM7#mYuϷlO_}ă.9hT zDU]\"r?e%c a(S2a@DĆ ڴ{Gf"bS8a^]u3C@y}\1ęׯJ=!s5⤼Z^i4 [>TLD[@Ayz*<$"6TJ8֐)6Waig1@SXeS`ϻ LtnI%ݒN"W,Y2*4fjP+rsO"+T/y %UܑHJ5Ӣ0ծøF"Kqȫ& h2'YTv:ZIDlwL|!C0ighBo3X?M4!(\7XeP Pg#:*r~-f,\yRGR"en{L՛!AzWĭX QrQPp=(9 ũ%J"bCӒ!A=G8wB>{GȆNC"t2f\g#*/;Ÿu? 8p_\bv1ފ Z`GJ݌>,Ga kNB=@IA*Půy,V9-X9_@+/coˠlodlQBM>2|q >g#vX °MO",JG~ 9jܪ|0v*l@jYwCv:}t^݂٢?WܚElBO.;ǧ% ຺XmV!mn*-ڹWt8Hsfxs×t:+qکADԹaհdajvpif0{l99AR޽B?uk4FAբm.u0 O:Lu[b03e#SU.c/7}.V;Qy;sky&@Tqدѵ ^u_s'`& e1Sh{92nٓ'$t޷Yՠzxѵ)UЪC'PB|ZH`c=\DP:F8:t TOG{kg}=rIHk5R`QcNl$"6sY: k7@9t Ipk2Ǯ6+0v*'d[nTzYy2BEA T?d d|AFЄIL;+<qZXT /+s3%S)ލ>K+bAڑVxL| b*FM;?5 (\^*jg ݽ^łpBʑ4Ȳurq7d^gUsAMxnxu#;jVa[b_twk\UY`qs! ;DoFZ[?n]sNymmu)> endobj 933 0 obj << /Font << /F11 65 0 R /F35 56 0 R /F8 21 0 R /F38 68 0 R /F32 50 0 R /F28 15 0 R /F29 18 0 R >> /ProcSet [ /PDF /Text ] >> endobj 938 0 obj << /Length 3826 /Filter /FlateDecode >> stream x]s6ݿBO=y!A7:ͤɍkoz}%RKK:Hݙ>A`]V]<}!,yggy.3"1rvu.~|Bn"IYBߛ]?](7_.| t/·fL&"OrЙF*JZUBhCs5FI[Qr/hHS1L|×Uo9S͟e^*z^lWifšj|STŷOxlqqyȌs E۽mRjaڵW'x{Hy.걩 2}{Aث&5Qؤ.u9F>P hKDoAR[R>W@SԍIΟzO4 2D)MbX#/wz{PߢcEHKBƍ0^\(4S,D0XU4d`1H! Z}Yr`XBѺLWB/.  1Ɔ⚤|! FX9?\đ'_Mfrf,hQ7cgg[2[$OlvD<](.NO!-#VBS&8ZcOvMǹ7ƥ*kgޭ噯5ټhFa]LH<;oXg-+~>]Sϟ |/0K02 aj߁U֢lʹq/0>i=N<ڂ 6rDT$ɣ`(Z7CVRCV᫦O;OĻXgI.:5B&̛М&VY'Df bwyӜ#u%zt?`&٨pBE%Q Jnu-27ān| =`# -e\w{op..럮<5Ċ-gSrh.Oα-k$bn8$Pd5pc PrvML~;(R czE=`cEMΟ.q>6 o٣`oϗc"fcT?pzyؾ.Ԍ#{71}*7S@71 "qj.]9˖ʣn}/KRO@T@dpBa-zgϢԺ`o>@1\s v%);|lwgnlaf$(>A/)O3qT WvF87 hgr߁Yc,Y'E ^#=-vzӥS|? 5[cw :^1(hLXòR k6o?!@}uH+vc?ClSwy K&ztxYN% j,px%P( w)yN7opU o,-_m:/՟0s[awͻWϹ}hi 0fӮ}Y[,O= Up00qUF-`HQλ@/DJ1ةwN۲_*{E%^@cNk?+G/,0ePUmn4Љge*/heR*iB3z,,G2T%A8cnf]S'۰Z=d\dž?`"8$G=R f{b*q Zaڈ KE$ʏt7QTk4ƀkEF5N-%5ӽjv|n eItt.QԢ5@-XV?ħ60 b2>UEnvXvfBKmܴ u7 fLmpȒ<͟Le/6&nUolOKܝ42hI~m*k[\iBwwXmg{9^BMݫ km5Ok `IeMyqY^]r \>d"li$'b@w͈1b*_zǚNmag慪㱚sqۉ 0i/ƌuАfAE`2WR)jaRY@ZbBKJ̎U*d"Ni_I랡,>N?8~VGk&BcahmofǶ6D.C#+i4F# ZG7lb>8,/?;7i~!ֵ &K՝0&5w :pߦ:Ų_~'# h7KE}ԫ-B+dAւQYd'ޏ1Խ?aDE_jeu#V( X~Ng60.ю ~iÞA8@aԉ,d0~Hc endstream endobj 937 0 obj << /Type /Page /Contents 938 0 R /Resources 936 0 R /MediaBox [0 0 612 792] /Parent 926 0 R >> endobj 936 0 obj << /Font << /F11 65 0 R /F35 56 0 R /F8 21 0 R /F29 18 0 R /F28 15 0 R >> /ProcSet [ /PDF /Text ] >> endobj 941 0 obj << /Length 3418 /Filter /FlateDecode >> stream x[oF_! s w7EzECݧ^ȒO⒎+w9|,ԌDzv}3l&sMrAg׫~Zdv|X05w7ڧy =5f6 (EFz UK{i,}6k6_"s!u{uY>('fǶƇjqkQdYDޡDM{IYk)E.ڽ+h<)̋2vaqe;Tp{(ݺx l, JŠ*PkkT>(-lh 흑*ܪkN/nG[vkV˥ޣl#[0 +X nefە^K+cIrXկw\4%G`0g+HIͦutEGG,meV{(rV F,f_{>[].rµ=uNֳ F○ceط=x -‚Șn`)IytX ʜ ژf. /ĝÚNkE }_ym@J2a(LFil)`z~i|[7@O]b\Z]SˆE 4 !d_pG /b kkbPgd - Z$)0*>l2eU2F9`JކF"h% |YA*OeE`C_-‚HCeI,âÚfQj,f1XQQB=MR؛* r;j\U őW@W:Z_,Q\]fLprG)7?4f[p6Ř杪?V!--'9 qՇY󳻚OwAr,IʼnbeX"KKz{@4b/ҙN^9al(P01+ axZ|XYPOqzdleJCcd#wQcMɒ b3 PY&KE`CYG$6F}AQ1hBz2ޮ<۫Ox7]63|uDCi+Kyۚ.V[ D!䠱 /Oax{8lGh{`&lyѭ&x9l͕i'&]רNcǯ-B7dknM<ŐOcYAVXU9UID<:sXY6,$8ba'̔Ʉ5 a%1 "tx=HUv .ĠVj7 3 %'믅TDP)T$d%QꙀInE`CEB|o<d,oP:[kJ^}1͎\{;=]onr5xpY 8M+…cҏ1?b֓^TRj2!ekzPRv+)U$l|Ugfbn[c2X˸clpp`;Ut.#Æw.f`n=pvG;4}ZP"o`gmkKJ8C8蓅- Az^oPˣ8U& ?6fWβ O g=9;EeN }n!׻]}X^{cQmڈn,HbJ۱b;jaS丑pu[r])B^$mCueG#Ӱ3#}HW8(`b²6OB-sEQ wf~U]]$^D<\^͆,P Fkb ܜ"keΕD&v&tMۼW6"/~'Hݢk7wFflNSO"Y)JDaUY_zoxČ&^FJ_jƽG _.4@,icE` t "of폿~ `^;/_m^{#WXxEo\ӄ) 6%1Et|gU$XuXCH%r&ݚtK]o~@rg ] %n ֓H]|]^>=)P =˟]Q*.]8Beְ z&iHO6GUG} ; { G]T8&! H N}:q簲l !gѥ˛.U8Dϱ3Gz0Q.HY%cgǚ(3+q'n~p>~M8*l0}yQC>JTImDh @)OE` ",ϖvwb%y:KhFhI{'w C컵u`;V̴)XfOnlH~1e~TT@h鸀g5$sN>cԑ"% S;)#рi~hL2=-pѼCL4,XtݦAȣl#:d,8yjQAO@eV3$Kfh 9-Zi&?S=&wD,ec|EkR\BI(=aZy??00="9vj.fLxN3cFgL&GF>ggptt3D<8"v ɉjlm66p]tkzbhXY)8 Zfߕм,p{mnޟ8@8ʧ ~_ZgcE?{0ੌp&㙣9 (OW=V Cq@;2,) 0pSy_DZ4RNtE`[|Ȅ(w q{IjzT5'l}9w@E/߫[9 {v?/ endstream endobj 940 0 obj << /Type /Page /Contents 941 0 R /Resources 939 0 R /MediaBox [0 0 612 792] /Parent 926 0 R >> endobj 939 0 obj << /Font << /F8 21 0 R /F38 68 0 R /F35 56 0 R /F32 50 0 R /F33 53 0 R >> /ProcSet [ /PDF /Text ] >> endobj 944 0 obj << /Length 2731 /Filter /FlateDecode >> stream x[[o~ϯp9X7dJbN-_LYbGJۗXj88f|s\.4_-h %.nֿ,c3IPܼwQwk3-r.|«%\psE|AT3ǫ^kX_rµZuN֋+Fn{ATee{֒Yvƽt:~0@<%ZJ殏\C`B <0 V &t]A'4HE_ O+*d'DQ368bT#OZ}DA0=<>LRi R,xY vpSH>S!]nì*Gϩ)I"a}VsBK:4C>Bv~V+qT1Z}-^6탣!ZSXFYYY$,44Dfퟙmޥ0Oq a1W P€A8jee( |8(J"!/:4C r?m b^^^ۗLī$PrITΧ-e'+-L(ȻUGG M~4&>ɀo,5 ZL$ ȼ\Ҙ$ۅ1:Wum>;cD0}[}o,>桲<ݽ[?pݢb/F@wYytjيſfN**_cQ? LYh$k6V;c3!0W.޽K,K= &^((\C4/yC-6Eo`'~ @&,耛jGs t1}NIwNTA8DK ^6p^ 6/+%)$^oceHl ȉ#Ck =`%( P gM\VV K,{|Kg(W& %/ͶzYr߂{~EcTB+6>-ї(8֞cq=bK"YiosR-g&MtNfY O7ս\@,zYrRwu3c'KCɗ>`\0H6,QC jjfpôYɥ~,Cij́5ӂ0&R8|,PU c/XX<*:Y*O5fi Yd^eEJ<{Y Ȥ5bY(Kpխ6RBNc~BkܽFa {;wEm B{4NiW]6x-؞[=^Kj ]OCu"@Sl<6KeB8D:{ffBn3]O 9KF0MI "d%eGQ5 }oQ OUVԨ (~o+gTÜ ȡ, gӋ `UouBl:_'dB[9Pl O8JP21%=!<͢'d*:B8͡x dc{B+&B&g"dPɄB)Xz"a}JI?u9"3ȿ 08XQlw SmeR ɮ3?'T 9Ϧs|r.F 3*僣ZN( !nOVrKmeN&h?QzR9^6DZarOW<#HH -,|'+ |^0o?{7[p ؒekoZL!h|iZgDI`g[N Q˿15K.fnZ cO(ED^#ɂTgۺ2m}rlD2tD-.GHOb;Ɏ;x뗆$DQd+v0ŽAW endstream endobj 943 0 obj << /Type /Page /Contents 944 0 R /Resources 942 0 R /MediaBox [0 0 612 792] /Parent 945 0 R >> endobj 942 0 obj << /Font << /F35 56 0 R /F33 53 0 R /F38 68 0 R /F32 50 0 R /F8 21 0 R >> /ProcSet [ /PDF /Text ] >> endobj 948 0 obj << /Length 2986 /Filter /FlateDecode >> stream xڭZߏ6~߿%ZzAkkBdgioCʔ%+NW)~f83n}3aE-Z,6.]iV,.KjpP\4_,n,,Ft2&]p'ιݍ{|!RZf zwߛ_ _xÙƜ klfUuߝU}!I%YbEoװ[-_~ 6I ƥXUnW&˻H7O0ޯ۲zCe9ŬiSѴG|msZ?g,At+c¼A.V fY(hK^s6n5j.+Cwءb k1?ҶPᚎW.6gn"}[`ٔIl&|Y>4q:N+fpyKM>_+q C ߦV‹[i/4vA8Ιl˼B=obfdfg?UEoWpw6^5=M"8Dt)6Z'G2@YS }GY`aDpP"sPX^I 4()XܕFYz>2s1-kYDMmY3Qj2f"l":F)sÔ--n3|F˧ ,IpMQm1$Ƹs|x|pQ "wKt9t%UEӁ^A(y$ub´ x,&eKqemv!6j&F GWX76Siq!VxJG>^^B% ɞQtjGA⣳7mTuQidٱpl ijdH# /^ ̀NspgY d& _ૂ U1tׄ+'= 3,9JL.88U'=gp X9(`(Q1򯓀'HSt/^{ scIY ;˛[Z&mc@>4Lu >b[6W } .$ݡd+eN4~*d\q./\Naxf&΢#L 7HJT~4i%Ir8E2Ud"a0٤[%"߸H;A:H1_ 253$nh DYzY1p ~Ȼ#WK)$o3Y$v"aHsί~\i$P ~![6]"?} . c|I*5qEe:u6>/k`bL{܌L& RLוrpF fRe%+ijh$ȚԈ ӉdJ`5 PIQ,:FyY8&1co Qw!i0z1oiT- Cб5"CJ5O;_HKBu]UtN{|)#MSthڴ%0ym.Cs+˳H_xBu-;Cc]=mJ{ o? !|3?d4yf$JLS8̀UYrֈ0~wE\JlB!Q铂`A)\?yBPHy2qD}Z HYJkD[8*[ھ8- dK5!DEVV5ؙRWxK][@蔻p}RClŋFg3Lu>`|TTޔȗzTj\]uq[ŻA.j47.tU-2Lދ|:|ݓWMMS>aѺv4 y\c-U`ٴs*QQeXC4!>eK=2aCtM*|B2Π`+p}KΪD|0n9kJ_psXJѳ2Hѝ'?`aWx_o9ɕMv} ܜAp{!v@d|HK]}k.0rv<4`SV0ZfkƦpƴc ڶ;SQVླPgxNЍ!9d[g! l1E}f),f e_YU$laԵg|S'/\h9P/k(<3JPrzIvvUʒLϤݓsZs;4h7Z?c5qIoJ]> ]|{VP%4GU$ly58a`uP˚h28ՕP`כIe܁#1# bz$k ѾS'o$X36!p~2@/k`!Q=9jjpl9{wjeeG *jHGXӦl K2J]l9LphCyyY qizآRe)DTeMK9D}}hFJyM&aYfbIef90cl3fDخ`:fL ̈_q$GA$X%$׵+*E㐳B3*/3 endstream endobj 947 0 obj << /Type /Page /Contents 948 0 R /Resources 946 0 R /MediaBox [0 0 612 792] /Parent 945 0 R >> endobj 946 0 obj << /Font << /F8 21 0 R /F35 56 0 R /F38 68 0 R /F29 18 0 R >> /ProcSet [ /PDF /Text ] >> endobj 951 0 obj << /Length 3471 /Filter /FlateDecode >> stream xڭ[Y~_Q*1Wa*;%l)"$jyPק$^{%0GOO_wFL.^:QER\Nn.ss'J~}s56_?Qu~ËW6,TY2_&4ٔw8BC[r/-Tu\exrv\p([(] _"q5wH;ҼswoI*oNh7ݢL(G}%< ]\ &OFwD"1REge[%}iɢV3!Z`((3/oGjR;Kzn6 [Vae[7m=mM:I}sU-׸V("Drÿ?*%IrVDvwv(̶mUYO}wSi)24?zn7j O7;:pǪ j)FalQؠ#=d;Lf#wd $(yv=SU-RiU+/L:j0pLlo`=(NkIldE4.!fO q~#wiYʎ=7 nQ\3sll>:HI%Y N{Lqglʬ5AvVeE.DdeNNE+⁦kU:gӅ^!c4 +|7[F߯߶ޔ˫q  -儛.wTZky QIbg4jގEAn77K#xrwLl۷ ?oX_̰!bτ ~a3x@"4p E+#C@QI__K-CQȧ$ʧ1""1GCw)!фao.0d:]Vw(+lFpKufGDL\%A;Ib}RZMo|@mbs=zn/{Fwii8*$ş&aKTܡTA1$ƀY8vԺitV#}@>xR]B% 3O 9#i.۽y;y L%m+H6wdh%hRVC8 W^9Uis7v τ|oIz{ͨF(K`Z'A!8@@"}΋! :v@7sKdB=],qGU4e^|0ϒ5 B|4BL$pAW nf3מES.,/I2qlk&qxitI&#@T MYM+X6gu7 Tqc{3ߖ+(SnacN-]/2b97qOpH5TզL{Ms\Vwr?5 ַҋ:Pޑc.#4e6G[m7WZ6 RᮖʽC.ӽy Ѧȕ-Vy&W( >=CcWZ´b#6U<9Az=d0 ʥaPhf0+]A0vw8Mz&i B k9j6%&alb\򆃎Z>I~Wi,cY HJ>@VwrTÖ:V =@G|E&LZNl-T$W Y *qh0iM{3&B٧yw DP@0|j#qǧaPhf0uLm7u$F9tΪmW/^p!&A(jJKMFhyİBuCɺ\$v5C?4ƯX[0iE?)$RޟVNiQ' .w hzPybRE+QE!4>;B4*=&"Cga1:ɢXd9BB; 0̜iuL2տgJdWIB(p+mfFָC8Tz#4Kf?IW^YwiV=7 tN#Vm;$V%i(m(l2#fyt㊳l<:s2v۔dACo(SdZy,CA c:%_cr@6=B4=LI~ϨNk;˾?}guuNSٙkOa1⺕qZ7h3hO^ ȥBgLuR2%]PY/N!Gf΂hmWIHh@֤!8oUݸɫ' @V;m<ǢnvQ7xlVO><̣oUS1ҏ%=3< N&J|agA` xDֆc{bۅ}֡%EVrzMMQgnuR6IV M 3EUCO{CYא1`2?ZD14' "C)eɺ͡ݯ`\8ƺ[KYwOh2W%_,^d(݌YUa9|Ƽr{G߰_#tFfmE5 ,{ojKyȍE+NV錯Cr `8}Օ#@&AކpuFj:w |2XIM\}Y1uP ~ Np& |e^@`ßSV9Ah8ljk!'.z?|wpN0ի>4S;gԘָClN &>.Wmt඗~>k_Tg=ӄ45[yiv=M3 {U!x ^J">,NSY1W߿~٩|?*vni endstream endobj 950 0 obj << /Type /Page /Contents 951 0 R /Resources 949 0 R /MediaBox [0 0 612 792] /Parent 945 0 R >> endobj 949 0 obj << /Font << /F8 21 0 R /F35 56 0 R /F29 18 0 R /F38 68 0 R /F33 53 0 R /F32 50 0 R >> /ProcSet [ /PDF /Text ] >> endobj 954 0 obj << /Length 2486 /Filter /FlateDecode >> stream xZms_LsRDŽ Kڙ^^;Lg|%T"rb4)91x"ž|\]ӘJNSL~OgU?.\-&|rYtCN~|?]MXOk8n':wɿV嵘a=>|}.枔z$I7Ks(W(I!gq>)#k5-fGeu4,W=\b: uW3T4J |$hLk/sKߚ"sg=M(\!2Py&T\!K O./ۗsT2a"F:)P>x=@%~XDQ`8rb ;)cs/YvYE ,wGtBЉH¯d!a&Tz=ij=L_?P5A1 5*0n"k1"t, Z;硯C .Hކܨ^HGWu:YNj9׏wyY~kZG3 2KWI8 =f:)4Pc7 1(D1kXZ|B9[emQvL$RF oRgU-+ى"/jC2qqDeA7Ʈ-(ri9njnuYg^.dQp>dY63,ɔၠ%,LxlVC,Fw܃Xfފ[|ȶ4Q%*;W!!2ZY)ӝ1S,pxo;[ )k<2@/;gLL@ S\7ΪܸM8˳:3bQع*Ƹ ;85#j-eNw[lYRs|YEed+.Yף`kkZ(fgd;ˤvk&ͻ ۠ݝs-1*PF2B9$_c p@rhYkus_⯏隮q$ E]i=qZCzPbH2LRPiABxy-f!U$H(qpY^q (ڸE6lCFhgpul<̶pB%1r Myg-8ejL:w^XliJaȖ+<6CZK_^Yl|շ;@|惫ycNޖT1.l 16tTf#UGENeAՊth]N\VB¹Y7[c0>d^v7lCB\!}H)DBPg;5Z̆bc?8,"W=XP4EVUrgIC~{R2kmɶT4 > daK}Llg-1]llm1Ku HPU.9v( #9G{*-B0qrѴh*jE S'E"#It`v\"Kc7L!I),|)Z̎Jh̺MLц)0su5mFBSl]kC:2or^{5|MsKSr̥-9M/̆<%?B`sq?ŸHw޾=ؑ7H|Hсq;4-GmehWvAYvQn׏8ewѲќ.GelFuNGmS{ 38w æw0 D4D͙ DH.ł]@nf+=Uݼd!hR2  y:cA"!qpY^qc5Wb~4 #qXڹފ{f+&`L-fGGsF(,Ӹ$\BnzYh~)|ʰ>Vv4O^ZǭK:[> Xg&%͉PEp,??(7HbvԂ֞.Kbv\"KgHXr`v\ KTC)S@u3rpopu0&Kf_&Kh :BX=޸3^2f=r)! '9r;Vw> lÃ*@}a>fʿ۫>:@uea 6st=fn>8:֒5';~$/1"5qwN] &C"a9}4u `ZSZ9 )'K endstream endobj 953 0 obj << /Type /Page /Contents 954 0 R /Resources 952 0 R /MediaBox [0 0 612 792] /Parent 945 0 R >> endobj 952 0 obj << /Font << /F35 56 0 R /F38 68 0 R /F32 50 0 R /F8 21 0 R /F33 53 0 R /F29 18 0 R >> /ProcSet [ /PDF /Text ] >> endobj 957 0 obj << /Length 3069 /Filter /FlateDecode >> stream xڽZ[Ӹ~_ klIl*.!<&d䶎aןnu˖c' ')RmgJQ(0FLPGp|=*;lQ4|?.(Vt;_,#o^oJza|eUkj?ߗb}qKKz1}Zۊ+5e ~ӳpY(Tn(3)4Ԣ'+@?#PD`lͤ$qNeFh":Gc➩ ..j)%8 hu[Lvgړ^d#'@P&ЈDFyEݯ%" y=(|vf *rβfXHZVxº˚BBWQG#J H⼫ ' @m+#&*TmEy=pOm57=uU Ñ;efBkYxBFU*Yɽ4Z;[rq:\8+rը:у8MEb( Ha'?gJI:+ {׏"60az.YV 2"H*(]^xdjDFkJxz7&9ڣIu>O)plUbcJq,ɎHxz(Jz@J2D؜ؤ-`'-}+2fPBOXIJz@&0$$6-\bU$qSo__oJL80@&Gxz% piдƇ+(E?By;_G[hP- =i@Aib @֘Lk䉰#jL跍YlIuY юR㤊U!B#bG R Gnxº[C7\} n2/B7CN`buic:G8YnUj` 2⟮Ƒ_lqxºk1i=v !O6GAy̲3P;Oz35n/+ڻD5 ~Ƕ4*L@Qq1enO1K8Z[Uא BCk`EOqcM홿pK'@88BdBf-u=`2>|H)tDN:Z ִPWyDŲJ.%ǹ]gUDsVP(=x."2JH9n_uDfѡaGzm/e8H= tΗ Bf#% B뷥|^>gOZ6k;_+av` Nԡ)HH1p%}P%$;A͛X@q{"7  W 9.uipm8] DEО7Ws1}e]1muG^4z'͑N1:I:4 %xۗ[=+2:8Yb1D,[:s}!W#l}qt=g4Xa| >\T_n {wLVo5u~{pZHPi֨RrA\~RcJHyR=\^Ե;1?mnlͱFQ4;532Y&M8E.]@n>VPHH:ý!ިba2}(}ʎ4"L 2 endstream endobj 956 0 obj << /Type /Page /Contents 957 0 R /Resources 955 0 R /MediaBox [0 0 612 792] /Parent 945 0 R >> endobj 955 0 obj << /Font << /F8 21 0 R /F38 68 0 R /F35 56 0 R /F32 50 0 R >> /ProcSet [ /PDF /Text ] >> endobj 960 0 obj << /Length 2673 /Filter /FlateDecode >> stream xڽZK6ϯP9U.*eċi-;d9x}%Jb5ʏn4@&x3\f h|,cY,g,˘H,2)>[m><?> t"#ӜPJ<Nj_ mAW rd3 @y^GCѾ>4X=ЛkrD6 -sim0zqg43KE:Ei<[>_VWǫ,}qxvWeif?UWWB+`LYy}u{3h(Mo=>iQ`ghUbhW@2n.Cg6<ÃK`l(8Lٝ4gU}+ͤlSV=hb*I'fUWs_a?"(a>s`z1)2!Eg#?S r<$:++"lXV8XX\^9иnಗrCTPԵU+ xN3r)S56db],<5$ޡ&6vA5fs.o5#MD2"i Rv.CeQF,3/.aEfCaY?ezdDLH']l %8F {<'5 %y1Sw"_{0B0"E HGZ"WEU4Xo*5-<_̆ءLgA8k &ܗb_`4~nA3~y׶tG%eK)KDt$ASg X: 4?`+^j[0iGoQAuڄ%=wDFLmɃ5omO`x@}:=A%R %~랬fwwdGuxpXG?N == #uX" LѢE&- |Vb% |dzD%,?4ӥXV]ъ40[<#=_Pf/UAevFў&ZB-m HZ:$\tt@L;b gYDy*aQ(xA({щnJWDySq0, ՛ YNXF@ {2}'KCpK'6lv";<Rq'$]%@*q+ww MrX@'Gٌl%MH:_g&ف{ !؁-mu9Zbh2r7^;~$e1"5f"/ok* e’xE4pu̬#dr2Ϸo]qnp[GH #& 0JkceZ{= %zyg♻ؔ6INܚ[/RU&1w% J\\w~Y l OJ2@$KІ@oO@sF(ؤk N(h(KVH41)/$d΢G =e1U6 "l4-BB"cOw 2"ukUu3 QbXFz4(:145o wGijjܙ#o.iY]N2t)1pbVC "M]Dx endstream endobj 959 0 obj << /Type /Page /Contents 960 0 R /Resources 958 0 R /MediaBox [0 0 612 792] /Parent 945 0 R >> endobj 958 0 obj << /Font << /F38 68 0 R /F35 56 0 R /F33 53 0 R /F8 21 0 R /F29 18 0 R >> /ProcSet [ /PDF /Text ] >> endobj 963 0 obj << /Length 3168 /Filter /FlateDecode >> stream xڭ˒6>_dʄ Ϥrpqg7SC6ZpD -u.nudQ-$a$*s2+ȇf) ͚I0ҷi {ՠ,$\;x-G;Уqj?߱dYw<4/\F"%A`cAuĹȢ+E8|GK&;i^mZKxB]Gͦ'zql0x\)t/C<.R<#lZ7MqD <d- "J;&9-.p"$L'-j ÜYAw ?n`,&/I(%Gn>2cXE bIcb}{Gl!Oe٭0[VŚsz1:7FJޱIgoÝPO&T$)æ* :,HB#,Kx|Df)O$DKk:=T7I=EC]nȽic ȁ*S$8?4m{Ok<}·G.JW*[T"wre1Ģ@yS {~p+dɃ$,(\Y&f6:ABMkV}mPvi'3pSMmO2~ q* {\LMڙ;Yи|L6Y88gHK˅)!@D"LI_DubTʭ*jDTWo(Q' <}!OFd7Qʥ DrJ Czǃ{9w\m\zG,DBw." m@Z#heY jf ke;f4?~5F( BLX ە*6Sc*+Pu BU)LWb৷hƯ'P^E81U}hǙ$6q,U*q%,O^ [f,ٌiHX[™}!>;䓏 )8B&> endobj 961 0 obj << /Font << /F29 18 0 R /F8 21 0 R /F35 56 0 R /F38 68 0 R /F32 50 0 R >> /ProcSet [ /PDF /Text ] >> endobj 967 0 obj << /Length 2507 /Filter /FlateDecode >> stream xڽZێF}Pڄ=Ɏ" gaA)%ʼx!G3^ yҬ:uz~XܾI4"*RvE) XeM iP\4eȕ }-iPfvSN] ``}kd]8to7(wOt|5qg.}/Ŕ.,p6Wܾr9*ELh/"mO8³hA77-hMDJp080Reʛw7B'+9TIpEh:6j%IZVy$#I$Fj}4 Iq% &)IX2T "F8feRNPfP< Z;sw|0H͔y[$# L DJ8XI"ȒNV86$pd1%)8*jYYՊIu,MH\IC+뼆*"iiRR΃5+`+$)YBJdHKqܔ]fA!_khc8fkV'=(QR!VzK)"qTIQΈ"_*.M@9@~BTwEZ>T0Hu++"1RBۑ8Rpv LumVqEH+3oXY2ӤO㎤) M ¦vb`L%l򒷗& ^Zf߱ ιc3B&"ore B}f"Jc3+@ЮSsr?c͌@D71Ձ;A%\;ڣ3E(C˂`UzZBuFZgp*ȣwSQ#b|Ⱦ2[;SNCO&=k[/*%2ul^91B ͨC39y5N r8?dN [iG\ti=¾r 31tN94/([ͫIHc ,n> ¦*S'Dr Lђw&I1?/AxDSW%ݵ}(b )RF>MtMb7ՄW' ʮTuy=tg'şaM^4aL޿ET(Otq0g7=\p9}Ws[R  /GY@>O8. JeeW+HH54tjȢlcQ|6se?)qRѓy;%"v¯ 1VV86E-ʩ\N#ԅTq> 't_(gNf+lݚ""83l>{ -R ~ 5F>_gyfyf˪>M֕M̥0Ooum> mK,'Gڠ88 kT@1G{LE,yo^ endstream endobj 966 0 obj << /Type /Page /Contents 967 0 R /Resources 965 0 R /MediaBox [0 0 612 792] /Parent 964 0 R >> endobj 965 0 obj << /Font << /F8 21 0 R /F35 56 0 R /F38 68 0 R /F32 50 0 R /F33 53 0 R /F29 18 0 R >> /ProcSet [ /PDF /Text ] >> endobj 970 0 obj << /Length 1612 /Filter /FlateDecode >> stream xXK6WEBbZ|[$hzP,*?*i7ߙnP)˚"373œkNJVfrXMʒ\NdEk]<:SGXQ7S)e42\(eog OXhdT9Xlިl(hREFhMj7̊nkw(tN[57wsX TZ==]&d &TFWx OMZ-{MznHkwYF~; O%ゃY4WK .faΚğ tv9hC.jh`f>$@ZƠ8͢jMaț \O饝{68kYu4(#w}sYT`tmdU 8*JQQL,G$t7fMFz)0`逨()bs:ҝ<;́v7J)aLQSc&S`eg~;nP يx@X>Vx*.؄'pX. VQ~zʳ)Hé'Z9aQ?4PX=PJ _'sWš#Pw+A}cB>Il$3XSRQR*lz{c k7HKd"=o\!_kt;QLΉ7vhcsTpp Q,BF$3.b(ŤlbS.> endobj 968 0 obj << /Font << /F35 56 0 R /F8 21 0 R /F29 18 0 R >> /ProcSet [ /PDF /Text ] >> endobj 973 0 obj << /Length 1357 /Filter /FlateDecode >> stream xYrH}W(R˘00Z*^K٪$D K@q=Yȵ`8}·Ly4$*Tp̋CEBAaO WCa\LQs?<|w6i^"”ANr?`t#^l~-}MLN 5~#Ho 3%6yfOF8h<Q#M" bwv[g٦_X(7,r=pbLZn B^ y:ӯ~ӛ)/Ÿ1`~ZÁs&kEe!.0t 5~ e[8cJdj.+K sQ86@Є0!穾5Eq'ۺif9|Ns/`0OZق6Ȥ^bUA8ЏNs;GїV90Ɇ83机_QSHEaI:_W6'vNC 0ALtWS (t{3QzԣzDzY[zưf=FTY^!*haciӢ""us\ofLPXŔdzA jէ0 JDs,fb( U:7J)h@C!qXHe}S&6Fs­r)>3(ٶQU6G6m;6_ \[ѪV!jӟ]Agcmٻ8ҵG΋롟~u:3otU@5ݵ[DZ,6Wt(wU^`T]%=hr G迯Qفb44]PIӵMHEeh[ k9Gi['䜶egMNvY{&O"l0 "l.l/%lE~AaM큖P 80 z XP}# TPN(X IhW̶OAzi7<-~Jh4wJ=)1넜K1Fk(}z^Wyq+qR韥j*`F\z+)+"LOO*QDb|j,1lb7g}OĤZؽv?gw{[wWP:χBOX--sT 9begZ6˺K  |i:U"_tvk;Tzk4PI"x7MC lg4t5 {٦'Nxa/O4il jsMCݵI 2DKD~yIST_T`N P$yc%5] endstream endobj 972 0 obj << /Type /Page /Contents 973 0 R /Resources 971 0 R /MediaBox [0 0 612 792] /Parent 964 0 R >> endobj 971 0 obj << /Font << /F29 18 0 R /F8 21 0 R /F35 56 0 R /F38 68 0 R >> /ProcSet [ /PDF /Text ] >> endobj 976 0 obj << /Length 1176 /Filter /FlateDecode >> stream xڵWMo8Whov"){k.-J,,#~g,GhCbJ$g㼡._~&2ֲ(A-J*vJ)U:bZϾ?>ۧ9: 8xw=OQgv#C!G|(31}Vy :bzC'8ȎӴfюD%JyM"%|OL@ljLH,֓x3iM1g`=5?)"1D(fA8sAbڰ$zuF1VH bqXe p,OAR!MU8oet`{^-30WJSPL!4Bl ܗ#CL Bl1rAV}.t'f?W#pkv6}e%q;wuy>ΊrzKOR0t@EɡʚYTs4 >!s{ ˺ӂT+M`猪ɫrL 8ܒ[h E<+9$d>UJGnpSn 8n/Y]펱W;ըPJ/2'd =j֭ y/ fҺλ-i1QBPw H(#80HbqR?FR>ڲcȲy[q>2CˤE~h4༭łi.5QNBNII^ ol7H%m^T}iƋ9U!y\1 H,TJA Qz(BFL(jF S͔{~İS2>&Z+;oIkiMO/|"{=GxD ] \FTfK[{3C@5];k2(q4m+-@qNqeq$OnzǗU9Mr 3?@&3o%ʺ,k֮w;?s8vuDhgVv)шatxjuR-KSA)u'++| endstream endobj 975 0 obj << /Type /Page /Contents 976 0 R /Resources 974 0 R /MediaBox [0 0 612 792] /Parent 964 0 R >> endobj 974 0 obj << /Font << /F38 68 0 R /F35 56 0 R /F8 21 0 R >> /ProcSet [ /PDF /Text ] >> endobj 848 0 obj << /Length1 745 /Length2 580 /Length3 532 /Length 1113 /Filter /FlateDecode >> stream xSU uLOJu+53Rp P03RUu.JM,sI,IR04Tp,MW04U00222*Rp/,L(Qp)2WpM-LNSM,HZRQZZTeh\ǥrg^Z9D8&UZT tБ @'T*qJB7ܭ4'/1d<(0s3s* s JKR|SRЕB曚Y.Y옗khg`l ,vˬHM ,IPHK)N楠;z`{;iCb,WRY`P "0*ʬP6300*B+.׼̼t#S3ĢJ.QF Ն y) @(CV!-  y Q.L_89WT(Z 440U07EQ\ZTWN'2ᗚZuZ~uKmm+\_XŪڗ7D쨛Rl:/P1dɫϾ(l=Uhd_OܗEkv-X1tލ`i_y. 1dz:un~Q?3/S}] $e~s]F1ʻϯVltVtl_]ׂhWVM\|esWgE): ؾ|׻7/)xXmyjVrYXe]gL?=;paG[bgtN]Xg_%kUc>=#It|yfl(zXu)ODݝL̷a!kܚ`5y.z4&waSkiϰ˗L #~ә{:-и:8]ؔmbnT5sc%W YK5LZ23IӂcOzFӍk3,ua&zC :;PF $&&esM~sI endstream endobj 849 0 obj << /Type /Font /Subtype /Type1 /Encoding 977 0 R /FirstChar 0 /LastChar 0 /Widths 978 0 R /BaseFont /ITWQGB+CMSY8 /FontDescriptor 847 0 R >> endobj 847 0 obj << /Ascent 750 /CapHeight 683 /Descent -194 /FontName /ITWQGB+CMSY8 /ItalicAngle -14.035 /StemV 89 /XHeight 431 /FontBBox [-30 -955 1185 779] /Flags 4 /CharSet (/minus) /FontFile 848 0 R >> endobj 978 0 obj [826 ] endobj 977 0 obj << /Type /Encoding /Differences [ 0 /minus 1/.notdef] >> endobj 725 0 obj << /Length1 751 /Length2 1248 /Length3 532 /Length 1799 /Filter /FlateDecode >> stream xR}} }h,, rPHN~6L$ c3-Bd%NN' GD򁑓f2PGBl\@?Ƅ!~͝?qH  fA9?h8?YpS7i p, E '{a,wWZ(*@/{N]FOqх5O |3ihҧsc!gFpƒZhmނy6-N&9a(kߢsyLƳ± D$8?/21`E .GGV `(kND1>~$pKLK[`\q[Ys>z3 *0XSH$`mEJ/"SB(~]d>pb!&=iWDKiW:yLjsY^WJ$^K ]VUtDyduUK/aD:R~}3 g͌=ScVݿQZ2q#筣*rMAº5ݵٖBO-?DePZNP(9*uQ+@]VΩgݛVR۽}H$c̢˪7vYf=bեamvG:u%=={ۏĘUGAnǥrphLrꃷu3zڞUn8|n-l0BJZ2q2Qo{nze-!GK/]*W-NoBv_L0}@zYe::K4}rwIW Y,lh SguPndNt}Ipmrj}yLYDT*uX2\&͘nv6CvV/ReH7v9Z_fK! ?;GF ]n(,z{[E|xL@|-n}6X۰#ٳ1:$/I$qf"LQAP: ))ͣ|-O> O0clw7' endstream endobj 726 0 obj << /Type /Font /Subtype /Type1 /Encoding 979 0 R /FirstChar 49 /LastChar 54 /Widths 980 0 R /BaseFont /ZOUIJC+CMR8 /FontDescriptor 724 0 R >> endobj 724 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /ZOUIJC+CMR8 /ItalicAngle 0 /StemV 76 /XHeight 431 /FontBBox [-36 -250 1070 750] /Flags 4 /CharSet (/one/six) /FontFile 725 0 R >> endobj 980 0 obj [531 0 0 0 0 531 ] endobj 979 0 obj << /Type /Encoding /Differences [ 0 /.notdef 49/one 50/.notdef 54/six 55/.notdef] >> endobj 383 0 obj << /Length1 759 /Length2 1351 /Length3 532 /Length 1913 /Filter /FlateDecode >> stream xR{8T%:TD):Le.Pj. qNEY f/u+n¨bq~Y =CtĔK%A7S_۾M|R+vgn O7e}؉HgG y[9AY,)1MO|Gq&&%FePhɐ$]#FOa7˜V^|#s<mrt DxO kQ$$ȏΒ(IӻTcKmp@*]ff62/sVmTZm `%cye]u^McjOOѮ#c{M8c:N.\?\5naIKiǧ8>iyNΆlcHKs~ݮ vD+3\;m{|PjCe #b>aPV=9ax`M_[NԆ7XfWz+ً~`{)ʏ6u) ͇Uکu\0Mf)gǕ᲋YE/9`݆ieLuv1I;+x;KwYjz>c_~FWI u]{d7k}jMY +╟Otg:GhgWە~,)E$VWd{{)ǸBo#p"i˺Ÿ\ W,#ܛI{Kk^:"vY tvSg^o"j\}8M|iv>ꆜ0^rX7ȿq.UZw5Y.CݫL !! !ӜbGz>՘}OhxmqmX-=|#AoGoAMaanI q_^'6)<و>HrϋC~E= sӦg0#^8c5 e=17ffwwςWOVCR{Rk/GZJK+Vo@qkt3 t\cG{*+}ԥ#3Q]3p { 6ߟeeL׎XD7 "4p}-5KU2_Þvɮz͊}VF; _>đ? b"TBp\L endstream endobj 384 0 obj << /Type /Font /Subtype /Type1 /Encoding 981 0 R /FirstChar 105 /LastChar 110 /Widths 982 0 R /BaseFont /VQZJYJ+CMMI7 /FontDescriptor 382 0 R >> endobj 382 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /VQZJYJ+CMMI7 /ItalicAngle -14.04 /StemV 81 /XHeight 431 /FontBBox [0 -250 1171 750] /Flags 4 /CharSet (/i/n) /FontFile 383 0 R >> endobj 982 0 obj [404 0 0 0 0 706 ] endobj 981 0 obj << /Type /Encoding /Differences [ 0 /.notdef 105/i 106/.notdef 110/n 111/.notdef] >> endobj 333 0 obj << /Length1 765 /Length2 1371 /Length3 532 /Length 1933 /Filter /FlateDecode >> stream xR{<.C.qt̸LE3cB/c^;Lh++K9e7:]HA&:THj˺L?|}y=}~_]a6 Ra.bB0%XN$`:@&Ld2pD<@6'[ ] 00p2\'H\,Dx< M1X B\ٺ:7Hl~V,ȋAMICȆ!C0fn0: D/Lm97f<H#W# p ~ !~.ar 7%( @;€&'ܨ\fhl̎P}]|6ns΄0ߢ L 7 (}?~lE`6E `xL! Y A Pf\Ah$@ì_0zqh!wH̐ ?tt &D`BDgDdO"\dcyМ>M ̲_^D|Z'z=ۭVRhHrM̄VܪF̗NxQߦDg?LM-p^LTj6HoUo?;'K x'vK_BɇZ9qQ멜]i1#=,NK ϐat߾|YkUΝY I=J{OǬ2'2)i#xzix?j 1r87Ly4-|^"3uc#eOS6;|y~yzU 4.hL1i7r 2zu%1迊+uofU%Z CĮYꍨZ{mqD$;H~5"^~"WvO^eqfvBeCVCጴևZ Y~HV ݭkI w=¼Yֲ'sZNɍrTœ*7OI.4Ȩo!|pkte z4^_5={3bXհN*pwI|\4ӽWD KIz <3Y6)ʚ_;1?ǪekH/$Ѯ^rMiߦ`fr!sn\s 54[{ynO'~Į8}~T6czA>y7.mβIاL-..'n&rw`O+缲enVZCiAeuCȳ'F=Y~ U>+*׿~izm(GVr22WjU*0̥&O tq%" B+ 3p:Fi;M[w)e)sdʪ_Zij02fw)) Ə7\9tjǞe`mDD1|@ޮ\x0/̟,!p$ endstream endobj 334 0 obj << /Type /Font /Subtype /Type1 /Encoding 983 0 R /FirstChar 49 /LastChar 116 /Widths 984 0 R /BaseFont /UEWYKY+CMR7 /FontDescriptor 332 0 R >> endobj 332 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /UEWYKY+CMR7 /ItalicAngle 0 /StemV 79 /XHeight 431 /FontBBox [-27 -250 1122 750] /Flags 4 /CharSet (/one/m/t) /FontFile 333 0 R >> endobj 984 0 obj [569 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 938 0 0 0 0 0 0 446 ] endobj 983 0 obj << /Type /Encoding /Differences [ 0 /.notdef 49/one 50/.notdef 109/m 110/.notdef 116/t 117/.notdef] >> endobj 67 0 obj << /Length1 1136 /Length2 4882 /Length3 532 /Length 5599 /Filter /FlateDecode >> stream xWX떀RD:E. ( $@$H H/ҥ*Ioґ*2qsfg[Zoַ~6f m(By`1#umm٧`># G!01XT yaǜ Vh#I 0C0@ex2vvO8`N0Gg @h9 $vRFZ?>r9:aI.FBڹ0Kbc c! /!~ל# sW a s0G?Saɢ2n! 0ma 4s!T }c 38fW0oL 0c12G;y GbBH`hF <8 s\1 ^$ yHJ(9aw+(, EM"$ YE`>>z bzY^C5 k ߈=y 1kѰbF| 1.#^C5hN(W/ "|^-Ⅳ# ],YafAe e!hT\-;RĘR8T"λ1/N9X7ODaKZZ -xxh>SRsejر06 C}´b_ǽ3r܂_o}8$ʲHl٨[[8TD墾Q]~%MTǝL<'ZQz<&걼.W YI ֌?<%Fr3^0–910,䄭(P(L :x G7Ϧ$Y͈Of(q q1=t|Ci{^F >Ծ18`ar[!`<VGq YkJ̎~6q)*;6~)ˣQAPحHuz³3i\hymoQFCۄԴ?Ybe=8y^3vvrx*Y%tn2|Nu ;O#ȋ"ԐZE1]R"g7N i89K[o԰NXąBT |= [|4˩V?k<) 㗧e/>Y CT"\ =8CnZtGEaCvUXwjO?;n_;o^z=~[Sdg mS 4IgRA䕭.1H<2-Z%.ɭy3a@XETf^}{NdC E"窿 _K̭Rl [g+ ~n'F1IL +C&>ZniEYy^ʲQvj}i*L*}?L-_KapwBRݪ5}G]ҁjYG=)H"+2Mb/ɾ}_4* /me#ֺ:3#e@\ufioaU,ԧˣHp]gUkdϻ4)xxoNufTS&f59=e=X󺳫:R,k:(gxǚlx ;ydaLM-+p`U-zfW mKɤns+U^~ v{WGa'ϳO6aﷴ-/1G&+ZkLœN&y+~B.’(c%.iLĦ&)Mꀰ;|/ދw$3lgO鎟F±zx.4IlьI&* *Oh>SR>q|KHXis{Z;IBDAPc/ jV-{*j4di4*C$q(z2eBYIfS=M0ۈ嶟{YUcTol3,΂CZ1oD =T%V3gƩPڟrL [w;Qcݲ|F*};/$i83^"ӥqE{.{T@c=+eQ<ߊI|8x⌗iȻͶTKIjNJԲb"SETtCrBz8{`O4JzA_j(ډsE^`s%ք_nɂ|6݁-9S^!A|"B$Lz@W5+Jq#)ll؅bo6Ϳ݂ٹL}tWMTt˰_jN0W2 gUȩSp;.҃HuGb\_2{%YdzvYM)ɗ6Gmc.Xe|Q]p\Oij^,45ֻ"@j76?c$dL=Y)/ر-4nq\fl^.ȭ0'd(PX;36qt{ʾArGBV/JEZ.'y7/o B>PQI4?zN)g96盺޲k/BBC=0*&B|f)E>soNG,Jk26E\-%:OdĨ)tr48y_gmF)޳1kO)Tnm_ʳ Zߊƫ=u┤ ˌ)<|M{K1"T:&93*4 3]g)@y*q|:˭UE/FGko+H!*rj|QYIr ǂ^Ѓ:Ƴ%d]cJXXXD-k! i 2dӽJV(uMe1E,ől^ugG mV5.6Z5m+ÒܽqCx'#12z1XmU|6IX2zr v.]^gt7F e)t4G)y Tᩡ׎SNQT,XprlgR&ܴKe]i50n*wHßk/n# [ ]ƫ- xJ6x[iɒ"i @f`wu=3`m`lgx.I>=|R(2I.'|k*&?;gNd' 6&U%FլHdɿkm]S:H1rHr*XZؖac:|&Ӯ~Ti1,n,F216r WbfHoh/!?*)Tuo51 D~vTbv/ٜyiոde-w`{ m0Og{`Nu4mS"fc0DcRz9yg(* N%jk]zѫ*mMMq;M 5Pm)D-UDg-9!Nf`jה=-(c1G82o>]DZw7A*on_luϪ(1y⵮2vRZrk ^}lB=hW<SZ}8`U;h~:.P=GOJ6 >+n<-!2*0=Zjp Hw gŜ!pW mZ;_w y S񰐗> Rp#TLYZk cqC|E}aCmXBLuBbDž*GgE<+MNAcf.G!*ւ;t9ԅ jL#4֭4FKO zs H'Z${/L<$`P dw@;x74KOYK@eaI%/cXEZ đz<:X++7iqȖԞ;#(2sM_,eͻ g罏;c4U|3nɟ`N@BlBVS[ͺIewڪQ8ajo& "bL3+9ڥFM)03+H>l$.%m 9UI$ a_LwxM5`252lz,^˱~.ֈ3Bs巽ƶg.BÑ ͟~jEKҲW^rp4Fv~͜FN)%uokJ;$:`c_yms?Gt8kEEJj.)%g (`a3sDfO endstream endobj 68 0 obj << /Type /Font /Subtype /Type1 /Encoding 985 0 R /FirstChar 13 /LastChar 122 /Widths 986 0 R /BaseFont /SZTTOW+CMSSBX10 /FontDescriptor 66 0 R >> endobj 66 0 obj << /Ascent 694 /CapHeight 694 /Descent -194 /FontName /SZTTOW+CMSSBX10 /ItalicAngle 0 /StemV 136 /XHeight 458 /FontBBox [-71 -250 1099 780] /Flags 4 /CharSet (/fl/asterisk/B/a/b/c/d/e/f/g/h/i/k/l/m/n/o/p/r/s/t/u/v/w/x/y/z) /FontFile 67 0 R >> endobj 986 0 obj [586 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 550 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 733 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 525 561 489 561 511 336 550 561 256 0 531 256 867 561 550 561 0 372 422 404 561 500 744 500 500 476 ] endobj 985 0 obj << /Type /Encoding /Differences [ 0 /.notdef 13/fl 14/.notdef 42/asterisk 43/.notdef 66/B 67/.notdef 97/a/b/c/d/e/f/g/h/i 106/.notdef 107/k/l/m/n/o/p 113/.notdef 114/r/s/t/u/v/w/x/y/z 123/.notdef] >> endobj 64 0 obj << /Length1 828 /Length2 2174 /Length3 532 /Length 2769 /Filter /FlateDecode >> stream xRy8{(6{blӬ2&eLY&KL30̢14"J=jt) RAd)Is]ݿqG#F3 B షQxL&1Pf&&f(` pA<; a\H^0ȒhP)LCe<a27w0F4h *1wONl:0QElEp)`Ѧ! 1I㰙!k֯&s;]~1),S' \ġ\T/9HcD~:(LՆ8@a2x`NauMՉ$EHN"sMW # @7{ƒ >BPh Q<=ʡ1ApDDdD/qD9<@B `x@}=Iz?kf&72BXI 1="g&~1&(Du߈.dNOLgH| qY1 ٲ7^/#F-ܢz2q\B#gm(F7y^h-@PR6#u/`I5b":Sݑey.htDغbK4dR$sL{NGY2 Vl }w*iirnʐO暑/j=,6x ) KmUI1Aק-\t@볯)R3-2ե],+vEBatXQ=pf:{Rf׮/NFiK]3li1|Rm>&X;vo=Qze]2Mqnc 3iI`ER8*wU'.cv]dlS /*&2t8}jVJ*km@)qEъ&39Ms䝢ћ1GևB'EXZF(h0] zF] "fųp+qciя'mѯry)#j?֞qX?*ds3QG;vn_ό:S;Vn|OGN=~r̷ /}la \ߑ"t,Y=(Q(,QgJ+IgVҔkl)Au"SulQI؉xzc #߱6e:݂T4Z)3={(A)\w}6k8qPhbݛRc#)P.e_)O, %9Wr{&/}/QU6=2]|n.I䬓'zq,{o ;O띩Ir;*_&@Y|.}|(ݭT1..z[uXy•j޿~@Ź4I<#huIM`.%@fv<^TPO+-8E?dV.\%cRԻWzsumMkt3ܦt-?8=8?[u'kn:)И$EEԧ܈kkW`OҞpP>E4i)EV^b W)׈S\d{h~P6β=#-%o"QkedXz Wڹm(ü`wGcvzhAt6>+>ιnB2RT+47?~w_Tl/Xuɔ}_ 6['h-~ )p* }F&x`X>SUKf1"-bliҾ-`ǜF 7Nl:T'bP R< endstream endobj 65 0 obj << /Type /Font /Subtype /Type1 /Encoding 987 0 R /FirstChar 60 /LastChar 120 /Widths 988 0 R /BaseFont /MUAKKM+CMMI10 /FontDescriptor 63 0 R >> endobj 63 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /MUAKKM+CMMI10 /ItalicAngle -14.04 /StemV 72 /XHeight 431 /FontBBox [-32 -250 1048 750] /Flags 4 /CharSet (/less/greater/K/N/T/x) /FontFile 64 0 R >> endobj 988 0 obj [778 0 778 0 0 0 0 0 0 0 0 0 0 0 0 849 0 0 803 0 0 0 0 0 584 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 572 ] endobj 987 0 obj << /Type /Encoding /Differences [ 0 /.notdef 60/less 61/.notdef 62/greater 63/.notdef 75/K 76/.notdef 78/N 79/.notdef 84/T 85/.notdef 120/x 121/.notdef] >> endobj 55 0 obj << /Length1 2340 /Length2 11385 /Length3 532 /Length 12611 /Filter /FlateDecode >> stream xUX\ݶh w N ww ]Kp  @w Z{dx.Bc>[ҫU5 i+3; @BIC †LM- Z$ ;??;@BH-\t&Af@ dahͬA^,q;;'\ ;Ȝ`nm 0YZ; 1sx6ws!w D @@v^s22. N.fg _g P{;п@n=* 6wvZY,v.A-Y)˨{'?;AU?i0d}=l,ll쐉g_/r0[;@7 B q| Obv<,gC!{jؿ/ A\v@ 27n3 `up7sT,^<Vs% `u9z D]'?oWqAAv ɐ.Rؾ!9ڹ u/H=V^VZx%n ~1btz@*9_"b2 vr5Ϯ^VϾX5910D+tc!!C[g90|9/< TΗ }! A%_,B\_(B=8ɽDF . /qQ|! A\_A\T_BhE .Z/q~!˻E⇸hf r+rsvsޮ@Nc%x>ڮhHaZk:Gb_Q ٧wtFbt%7u3G*S%IY}ytP!<:vZai81SJ¹V<0`Wƃm-nO7xXfcK3{|wn.{UR{ t:?27n؅T?piVqDk5?SrVOmόBO&( i(8V\|zA>k,pHmemS}]nXiĢ7-+9)ɨ{7wUțk7JMH ( ==x9@qܒ7W _9/rۄc~s 5 L=21Қ/,1eng ؔd]c>/&b¯UyN5GU1 ͇wl )Jb%ݵ/\ D؉u١ں(ATd kdOLJ/}.r ?b5kZ'97)nȼbrI$l3عĖA2;'n,s5,Sy^ATN˘N|<26x>-XAI ~{c2ǞB#sC&j3N bJTjW*տ)bQ"*ߺr4u%hXOVd&fB"+^LCVf*X:K&M\{KRO Ɠ j~bKn3UJ2}v=/GVyØ93GĆ>QR2Y=c-Bc&/# X{'uLq:>I9Tj)) 9?9OXĞ_tyhV8{K>l "y%亶%caN/P{d-iȟ/w+e;%g͘T/#} ^"1JY4QŎ5~ u$>G?$ț*!0soq(jYmöKPtEۯAENߟC`k#TkEԥ rڟ߇[tN8b׶\s ҍ.YC8Jk?2)GhG5 -y|:#j{0Z|M~<¦H4*lYkΐeiإE# F*Z4;x!K`pXыU H#YHmxP\1w5E@r5[d!PqU+]8⡩@[6߼*b2|b} Y;Y^w}Z*hBNSgzOK6IR'׆Ci2#䄜3!+q (?%wXrRLK7 l9Ҋ:SI "f ~`Ea4 3i{_(ōe S9<[t~M!:ELjWfmq_!h F^@od(5;b_I`]l$a; //]z1?%0 s5"~pE)6lbw/l-s: X`/Ku~Rq<2KBStb73ԡʵG8U"\0av;kKXiȕR|IO5_5rJ[Jjq/}&Mfhkwkh}b>FWu,N()KOfL^.I %(>I0W2gހ.l#8+ X)˝/ -_ZW8dr#Cr>ϼ]5 /_!L9OU)UIB\.γzmʋ)Q'YxR9_ -=af +|?u,v[&bv D4nՎQ@[I`uԉPwEN  j#RG/BM.o#i W!BV6ka~K5S^zF4 b\H{_ԩUa͒i`a5Fcε6FJPo)~B\&(:e+r&Da&brx.rc03׻5}< xKIBl]nҨqC%õc֨3ҫ[ ,}*sQ^Þ}7-T8Xκ09J)a]IsV];۴84 ق˓$dLLY[ͨD`5^ao-EPjehb__OSx#dl 7p5].uA|^:%)MApb<WbVYݙ,%2edrc+m3ŇN_.|\qV>MZz|皍Ho=̡,z* &_*T$4 g`#?]OLdVG+l0CǿMzchsh OL jUC?-FU?3mrv\FwIzMQ?t;Һ!=T伳.n2l(tTiqv?ܻ5C"OmBoPX`Q#:M/;N2ATc8TG\M&P6߸rYZN*pXcLDt:y+_l;D-R3wgMJXX 3ryѥM24+햹B|a/T ^҈["ɐG24|=r׉m.l|!=Cfޕ n80eoVhIPݟBEi=p r{~2 (L^?Fuv@{Ɍ5ݤp(BL?vw)$ɘcʚOWGXZm}0fҵZ ^=GzVR)4|BT͠QzzZͱSC2Ac|̖eԨM#a#ջߒ٤xw"#>~Z t Io<hk=X;@HτL'fQC >QDQ5vD|LZ'94UcIO$ܒ:76A2q *uE{hQMv:N{܃!dC[w!BwᾤVid4V~Ow-ac)R~SJ¹|!(82^ RP ~gS,= HV3ED\TN d,"2_V{%1*uzq tN)T3WFĺ^LT("6|{di A': 9KA@LՁs;f{)}<&ɠ-<8*0uk%60,[ݻ⨬HdwG:Fp-)bj@}])sÒFAޔ>&{ӈhLcsk~ٸɌl bbZͷL#){iSӜI!%[ >#뮗Qf=h y =0,ޏ}ߏiL,v@K2%kYPjB~°)=t2lɥCxMx z ŕ8R%+WiFEu=G8 ͢ckյ2]wi rmHȔ1'Q༠Oi(.$rex|wɫIt,TW6}7Ոٰ F6S8[EdmJP!0dȊSEN#?(v*?+SAQ5Nw=A>뱆I|\٭ug[Vw,Py?~~DZt;{dĜAE+m MGEڹg9U 'ni8Bq|z[6fN{,rInAl,T`k 4~?u2ƚ,%J:JK|MD<o*'b8qFTip5;-bkSUS ];m|Kh6Ѻg\Fc "ytkv֡Ej@-БwȤ*yν1AJmy ,VrLuR!6%{iшť=J6./?հ̷ Fp#`۪\S1vhm*Hܫ0Ő7–-'ٲ\~ϭ&ߍOReGC֤_C--fzay79Wi3ν1[W4_-'h]G4W7O>{NBKBMÁblU1tKkn"*es67"徢}Ss\ݟk|WbN!|D|3cKd,y] Qzn_T [j|@]zDž+| ~CA:Mw}|=]Bu%|-@4)go03L_7?IuܬQ`kl~%/i&Y =Ugͤbv p4y1 =}0zQh5L8Tm?qYT䲻 5uG[xOVHgL5|c{'J&!{/aqذ— y*6RHy¡Z^$q)&l7huۖ<[\rR4tљ+" [S>}5\$8çѩ6X^LMClY_N=G/T-@X3kà^~5=8|8C){RJL؟e$4\r$K>qzٕ/XU?xrcT.WDbx0snwRLʷ*ke8[ I4l?{fQVbZڪrf_)|\ W>=q?[AL2dA;I"Ȃ՞V)Bc-"q5ݔ pK}]}n]ay  Wew}i= ZnFcy*؇x=)-'V_z -$.V* 0pd@.x<.N2Qd{{JC;S|I JUɩ 'yoczUJ;/j~@=ha7략vo6 UI!//SϮ,FISK҅3dvdyNFi2ʞ#n²PaHD_5:9px~ ̓h|&|w׉ZE5WrFx6D~:/V=Vp. ͅP\Ō{&e?׮Z|=#qo\ۓsqZqԽntbXwy/I(ORޘ­FECq7JtTy$q]^e[M}Xf[OzHz %7X ’mc^kYIy}(o"pCuWq`PP_p=_0ڡ}KCxz|wOrX%È)">REnftsˣ£RMtONNY#4*GbgW'[f1AD/KܑU ¬k?(,OabT mP6q>0?]t®hx|?[Ɇ3VE[bPC}CC5*)g\.B̚ 6YQnu Sb\5i!kOȖ|ȒԍW'_q~HqPQ xVnljYSe 1BW0.i) QΥإWgRYInAtehjҠbYpZ^WZ6U$Ƌ Ί Wg*_ll{-7ξ${I탿0qIPGa\*TGϻ}eCHō، 3l8Ҩ@쉿u:yHpY/`/ٿ&Cb419 ɗwjzSVd-8yl,?acwq:'EiȣQL>18_h$:6Ї *F~6@jD/(Z?'6*wOoRI%2s1ef]m5A)zbDzGmkƐ =ן[~!i #+.yVۻ >3u~T4{')]ul̜8N«h&UFO>Jr|I&mfbU0@RBj464h$H5];bBA=4nW^~^$oWpJN*Qtb1F.l T tJ @XA+M#UnS=͇o+|P\F-mƒB 3+}]HI uٹH+MyuWPA*' -Iߐs=Z) AANÌ #۞*J=Z͗#Bk)s}2\IQW?.,;Ijm%:V#knRG/ U[N߀@Sۤ0<.v/vG/th/wԑZ %6E,2.v+F}| Jhu_X@^E3ޭ"mV+[pILoB  hH|CX<[(WBpjJӷ eZdبvrK,a9=~kqk!q75U?uv[13|aXwIbsL\1 PcQ/U=S[-j_ˑ{Sbfϸ`K 26HWo/NPCGܜ`#tr+1nߺwx#6;VtC჉&a4bWP(U¬mpҒ.wg]X_+YГ3a^m Jd`[]3 S/> EVi^a8vlV80/5}|hjwjɚ\EqfM;6ò h.Жv5y1YU}CBxEAcK, iᰌ_&SK^DݐM;_SCOku砎p$]gɀU=MF#V3aeU$҉+TX>#FDWY # 2&ndf 6MDJRbFE?>QmL$k:9]7{']jhMS-D#y,z;7&*n`a N oEsoO9I5F5K'8l6gO 8$1Sz1#PY;R~o? k<rS'7 S,}.3r](Whge3”$V,ʃ-D]>LVU:_*qG)$UmTGEZg"e+? fNU .9 I^h&k)JGhgOw@RAExo+3R |Vc+vb3zbNv%s*rm;:;7C,B~e c-"L8Qi]ޅZ&QOd4fNm)@Sw[tV-T_~ɰu(W|.;2#̩vM~u> endobj 54 0 obj << /Ascent 694 /CapHeight 694 /Descent -194 /FontName /RGRWWC+CMSS10 /ItalicAngle 0 /StemV 78 /XHeight 444 /FontBBox [-61 -250 999 759] /Flags 4 /CharSet (/ff/fi/fl/exclam/quotedblright/numbersign/dollar/percent/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/exclamdown/equal/questiondown/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/quotedblleft/bracketright/dotaccent/quoteleft/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/endash/emdash/tilde/dieresis) /FontFile 55 0 R >> endobj 990 0 obj [583 536 536 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 319 500 833 500 833 758 278 389 389 500 778 278 333 278 500 500 500 500 500 500 500 500 500 500 500 278 278 319 778 472 472 667 667 667 639 722 597 569 667 708 278 472 694 542 875 708 736 639 736 646 556 681 687 667 944 667 667 611 289 500 289 0 278 278 481 517 444 517 444 306 500 517 239 267 489 239 794 517 500 517 517 342 383 361 517 461 683 461 461 435 500 1000 0 500 500 ] endobj 989 0 obj << /Type /Encoding /Differences [ 0 /.notdef 11/ff/fi/fl 14/.notdef 33/exclam/quotedblright/numbersign/dollar/percent/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/exclamdown/equal/questiondown/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/quotedblleft/bracketright 94/.notdef 95/dotaccent/quoteleft/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/endash/emdash 125/.notdef 126/tilde/dieresis 128/.notdef] >> endobj 52 0 obj << /Length1 2264 /Length2 15029 /Length3 532 /Length 16262 /Filter /FlateDecode >> stream xUX\Ͷ;ww 5X8w $ww^dQc|k5*2e5&Q3 3:+)3+8`b`/a#ee'usqH=V.t$V .;ƶjVOfRQ[[Rp&U8n3f66R3+SR=?N<6su!7$EJ/M:R'Et7 =?R׸g89 fNʺZ[HY+d,e0Sr1$u؛oPe Mנg'_Π "f#7x<@,.KHA5!5w"QRа? q8:Ll߃\,v&t=Mb`kk |8{GRc;PTGyFK' eJf6AТm]%:G@t_V8;[G@+E8\ {q.%WHb\ ]s+2@ΠA\AfG!@V|gͶ]4vV ߋ 287dlIxyN H݉-N gwHV@&; d&N 'wȽE@. N w(>\ N wE@.r|';\ ohljp`1sr;?'^+::7fyxxAV&27v_ A!L!H//9 )ۿd~_d_<!/Y +d +d?Oc,K4r5-11o&NR&vЉ>f .Nz[^aq?:)W2 \7_A mi?aB?pl[,[뮛nW4G#ԟM3\JSFJt 2ri%`W҃yl5B9TRJ9VVǃ|/\1r_?=De- Kc/am@@ V_Be^ՕZ5jncbClyބ7'Z ^gr)dU#> h6ΐA2!Œ׸ J' ݂dt7" Fܤv#݌](_z) Ĵ^19;ý'c);vm_QmsQ=tҎreޒZ#Ҩ%Bm 2}̞'۷J,MfEroGF/c].$"rx.tpXKc߹H"T0Wxĭ'vcٓÆ]{,6@WIپUIHC9y G"ҒIܬPD3 6;r4 C+R'/z[FK}3 .<@r ICt(|\Bs`bꉼFayc[ jX= E- jqCLyU$-9׳, }>[Zy)q$BchJ} X0jh`[EeIiٔxTeNDs4 F KL[Շ5b`z.5pv5G- #dr@&f0Bj ]8IWXFbHTY[Jntb.5 Vܨ4o؍){/^ݼ 07 Yԇ{ޓ& [Un~F {̿Dw ^0 b7ktR~@훌4`CGiƺ/@@a޴ eyJ\du&u`OHX ciHڵ!"r w< 3۔:7Ia=}v)&)>L;਱hGO;=1ukR\"4{g%S蚂3]1~$Z[hXdpyfz 5^x~qu++.AԚ6v^[XMݹj}Ü}]Ì2FN ~DJ,".R`v?5h :\x:XCiTMCxryXP>332}ԨYݽ‘g=GITNnF4m y;~ ƶ3 K>\T)I֧bQF BMXgsWfmwMhcCő,Omn[p߶LЃER~b#crRkVQsoB%>_Fם48T(cgѵzPy xieŠ{>|HNjn.طZV]Z\-#ĭ+Y~a1>+/Ȓ2ug߈~pZE(Y/*]o:`Vs꩐e&3OhtŏV'9q$],Ei~Gu! HX.(#y6PC?^D*K_gqy]47E~9 &[R`phm~nGTM$4,19kFq1a4N('c̽o|{==F M7pt1Z}V&ħ'Ƈ1l=j|N@AjX9bfQpqu_PKy>h|1m eFn9?oһi #jv1Oɸ}H-g?{d<#ޜa(AѱBeD-)S ?\xaH% k!#cs #}^2H1E;"4pQRb#k/ndPy(>0X(=+X[7}Њn^V}5CB-;Gޔ-!=WWFsGI7ledn@M8>9T/ pOYݶDC ʼnupoGt&ek#~k0_>VZ~;vRnGkNX[gN UXeZmo ۲LIł`v`Yo7ĊqGc3:iHta3uѬ/z"3}B#xU  w4) .nCCp/@/-=9ep$F7R W+[#ȺﺺdžwS"}:[WGSL6 㫲m V"7GͩtT4[Bκkѧ~J!iaQa..EV˧(hY[Ch@z.e5e7``KAI {O`AV.\+,.C#89NY](kFネWf 2XCs _ZJ.E޸MY9ٷYEilt!}>F #S[̘] YOGx9sgP$~D|w9!\mYRޡ^ߠw'N(Qpj-K'Delĝ@4}5.l[^GS{ۈ֢wgzyNb茫@_M pѩ$B[|gYкt^?S U Qx0s~~c"6t 7'<~*սeAр٫U0S]i⎍v+,i4~TIeI7د*wmqS$/i/Xf;rQ2uy@Cf9JVXf/`O:@g>M_c0Y$eOREЗ*Tk! c9:O@:l7x3!ҘA%P}{$%#ØEjUk0Xs==:hx b8 s0=YP-!<~`ڟ8bU@k8Qy5:B|!gD%XZ'*JMSq0^}˸8v!u$E[rux|'A|kp5Q.aR3t.,M"C=Ί89x ѿ=U<*5"6-YzL֣C:^#|7B ?XIof٘Cv=m?bމ֧6vtH'I3$?߹g%s'}3ݽ@TVk=v]v3Sa`題1ϐC8czYy7N3b4,Bh\ ٤64 0ׇcړ:\ .y-EUq.EڑZy3EC]x٪HHG*YwʤRF륽`H iQ a &88gdFtWOãDc~`S$P;kEJBYM˼"#HhdJ8d s[t,JjQΆlǦ∟#@1Ŕ}<̾a# {@ٮEZN}a-Kh^Ψ[`tc!Jx$ke:W33BgvA,.kK4 J9棏/*rƾGaUa@WiDT]EScR c_V6ީji1gp-H|EYMMcdewiY{ '4ݙࡓTm,OyE'`9h=lwIڑc>Eo4+sB{Lzɸ'3m(Ə;c!a7dW8C /!> ktĝ) :3vf{1a8>oĨn-Hݹ ;B|z<>2CݯG:fzx;/ TM]Y\xUܘ1㊯{`yp$22J?R/ ?fjr*$i,JبZsgǨ䰂gY Y"0$JʺbC,ֈiW|J{ H~z&w]*i,R6EXT{2x-8بEjf"F\"$rD[xXh5PEжʜwx۹Hu.Í=2ח< {*nba0~ > rL tSK$sC%6*sql=U[S.g&mZ~X\B#|Cwc,<)q9~$f4 |h,WOwSԔJ~Ñ?PQ㐈M@a6+1 F \}j>ʔ`[($o~f wy[?o<XhJ6`kMܲF4A*ÀM/[]0M@= K\-KS,Wl#k-ፕxO":+uVmLx|@aQ tbmV{mzF(QB){PwqɞV\rK Lf\O 6I-ˊ&Ϊ.,& If?M<6o^gB.!>O2 Qڅ s{s3DHY(i/DC CkVEK@g4AF_RЇk>MS9\Bn· ̀?6Y_>E {ƬSy|.,`\ heIt% zv(;LMBMbdߴ5wh@tpkp@"yeפb粘bעb$iavUc2_ARZCh$RIɩ,K-n'nvMda(7_75pJ^鮵ƂY5G>ΉAg3*Rpȼ#SjXM -;R ?[k!bp5'Hs)%?Kˁ p_E~ 3h" |BXwHăв5MP0/5$7">_6DoaV[d?Q ;,WAgR_Zwc"O*b/'цAK '-Qed^{42U.ɉZvlLl]sBPt'/?N/xVDOXZ1#"F;۝Yo.ˋ,s98R v,'w0 /xp$g9u|'^J?8:`(\MwuP}oR 4T|G=A"zrQo*],Vʖ@Tfr)E$imT-MKZ">=$%CQdx m\PMIDZXWBU!;VZ] yF.=VH1#O79cɨPcΠ&?BA8,01tJԭ`LpyʟvGLWM&}~P:;?v z^%W(ְڵD,h&4uXB #h E8ڷٷĒOr#Хar/%RHP;;;}J!p0e>{>L[Z:0jLl7ʃzݛ,QdN*`1s׆G>X`} jRiv_(_7nO“a&i)me ! %;ǚ~bH77nhԠ KřVIjɇ&DFB`Er;^^ZPv}ےq0ϝo]l`=Ou$X%"dt ȜPPnm8w$R۴[Z졾ZchUg"I'Npyc3 ;K[2w2voІQWHu] 3F6/L-%zف-Ԛ1  #,TZ[Fj\Œ zB|DzP X(bSA\dKBЉ9.]MO"8' !W"8o,hٹ=2Xf>Zh*BlDk%yFR]˞n8+'LXui:μoI װ=i,sf[Ie٘L\HXڅZp1bΒ"Sm;0D Gc J6c򽍯)N2ɮ~vXJyyU ]Jd%aLKL@Xi,Dף3n>yp_ :CS=3}W䥮Nb&5UP٩VrIcjkGo( %r\?i]VsQCs:|JEAfH/HBgL.[(W\}0qzTSFm"5]_{G(54(.W?qXj I|}C&Йo}][XqEeLNĴ_<5 f 7?Keck_u䰨@UAX_H:X[ 'FjFa| ٜced|sh8b6fA:B-]h2մάx#(r6:J{ 7DXlG'"A(ĤcjF+XpkK1W\1#Mt+a{GI/<2?tq3q!9E|efUEH$aQN$؋7w"%LDJFovML"?n>c` KH/5[qjl@;FW)cV;頫l5 |DPd%+Uc?BFU ?]rŹ@g^b_Ah~@"Jnư6(/;,ǖE =m8-˴ c-y:{tTFGՇF@.QaFĴ܇G^~CQIN0!I ׋p\| 6V3lK2YQwڹnpao!`~.|e'k_lsl o$ 07; Ht`?cbUjFR(LΥc3Moc(P,) zvZxa$:asRg,|FcAt8`6\J(1cNVmi8{k ӌİ$V$Gǐosڊ鬣[bOa02[X[qU)X12EGYGsWLQ'g7 Ji?RJxĪLBF=s{ lD*]֝ 吶"@/fFxJvm I}N&qH]0I3%9܂j1H<=uv]OPl1y&LεxH k݋KmEP|Q欎~g-rmLۢ$-J`)u+hd&?TKjLWk9]q@Dp4&[Y"N06&x7 ̑DFM`@LS%,yj5rڇ *h5msEUuj88[Cw5mPd3 p"2CC^ ,> ig64m %T|WѬ46KS="ܝ@ːb|)󉬾=ƨqKRhw⸠wV=R[)DRTli 36I6=.PEI!vh6G^j|XF D8R5\Nrc@n֒ՠ8kUm ŋ xATFCdHmo4l]^ՍH'ZͳA'CZpDxDqQvSikʄԛ~V.ze^B~ʑ\o1zχX'z/"4b9klm;]ӃlRhnz͙iaI{(|*#- Z_# (NПlquIm\6%;->SC1!מ/\݄kE=/CER{ѕDؠK>pi5C:@-czդKOkhJaMu_=)LLgz^V5Jd-"-XC/xhrhB b~w+}% %#HzM1WʴXBy3ŊMc*fX7姮ةs$XzJ]Rƻ˲_F9KKmPv1$~ھ8L8^"#$%f:$6r3M$ٶ&yɖ.9e\h\M _Z,rc6rPTmzV}nc ~:KjhzK@rv;<ʑ߷J(INhfÏ-z3z8Fd)Is7NnIKb`O$>To^fg\*tz2>; >"Qy MeS݉4)pHKFo?p=:pݞlZm! r*b uL`bG'cwbH~ˀ \Z%@h5pVm"idQy=Cmw9G:Gzmɳx)!*(ǪjGPn ˢ<Q DrH~j;ypBc`Q7$C,d!(|M3Iv֖"ZkWs:3j{?pY.g~>Ynm8 8Z;bXR^}pԻS\O+Gxvz]Bǫj~p8^Sahg0$Ł^_GϢ#_W64꒘Flg71t~oO~5TdyKAaFKI-` &>|A5a_с&#4yc>D1>дa1l bYӷFel(MxAVOZftר9rm(a<̴'h7PѴ` 7~bR>ы;ߕԫRauzԒ;bq]E_!%[SJ.rr?9LRr7| 3P8h3[&:rH>dKEk&XBZ褙=tz]q V`f\G9(ެd^+,@;,-eklph?kP.ٜMI;NiU^26vZ8"3^ 9DA M?ՂFT2s{t~ʖy>T,;> E۾AMkG)9KXleaZs 2*<}v u]PUOxo*sVӄS)k4X! l)zs̾:^.C=re!d'"Ă?H9_yo >dIF9尫Uf02UzX6rbP"lyz39H"$/rSG2`9*CX9rG0y,@|XYݤ)XˏR҃K+DK.DٞnϿ0B8DO܄8%j= 04td{>o~::Gߢa s*F&+0jWnsz0&E{K#PVAس+EiO tHg9)&_^ Q{F}(1:%ßD58MخEDk&.#/۝rJDJe[C Ԋ~ԉ8q-xgy'}G.ff3$Ɛ+Ӧg#:<ߏRfS @LTլO׋xAkW={Vx|? P_,E} A슧ڳ>qjYu7+i4{ޙ>+xye35j|f}2E*^Zl\j\@kÞk.#lkĆsc>)匙_ٽ>C>aOzKHڼ'R@~Lɒ )%)3I#L+hdؗo9Is8>0ze5CIԜR^21wʉ-cv B͋mQq a=UW:?c>$a0Hb[m,~ Z5D$p>05w13E/iX:cg[`א9[x:]7Io`v6.-^ך z>Ƈi,OrE"5tywފ]2Ct b8 ]i5[ؓ=HNâ̒Ky{ƳezR7LoO{BMhkD>_+{nZrI).ʤScKxMoQ#>/\j";hա[}R!ܯwέa/'@ UM+W1o2sgY^GƶK,3_cC!'W2 #T~`X|nn5gϯmUZJ<ʇ7D3fՀ*P*~ـEKoF e_sU˃O'ѫ/b#+/b^"U-L& !-W}Yo枓>~g|bdI'nz+LNc鿚;y}mz7 QNJEB?+(r̦KPu'I8]AjSyi._䉑bb1wlnmnryELT)?;WLKME&,~ s鄗tbz*ẕ5nQw)S![gxlU:.X«)/* T3nMɌKy{jPhb |c_EG '#>݋ҤKi exBE綑&aH]S [c!iq1E&S6?sGۍRN{lw%GH7ZhEU_Y x(UB߻ݾiǵSN -$Ь\.Qw2*|\(l4*0}ch]Tr%a|&- [ @-v%}E 7|'{Qo5 H`nl%$-we$fӺ:.F.F[ٟc Ĕw譔L>#0:OnX>"9+`QLh\{ZDn&5@tS_~4f3q's8w|ݙ@~5E ǯ11vqt9 !yhƾJġoɊcιiNM8:cN"z- }^ ]B=q]g2k c`ZyMZ+*u23_K x nL?h12 Sf6K-,;@i6?q. U;p7%| C1ҡ'6Gs 0jI+샛3wbn6ȊGAėՍp;+s%z\sLR4#4Iz 1J^KV޿,W5e@3I,w?% gH,aػ.\xSM.ҰW2Qc7E]=v=7raGdlLh8$|?eoe:XӦ-zGcNKd{ X bS[1h΅ endstream endobj 53 0 obj << /Type /Font /Subtype /Type1 /Encoding 991 0 R /FirstChar 33 /LastChar 126 /Widths 992 0 R /BaseFont /WMMFTX+CMTT10 /FontDescriptor 51 0 R >> endobj 51 0 obj << /Ascent 611 /CapHeight 611 /Descent -222 /FontName /WMMFTX+CMTT10 /ItalicAngle 0 /StemV 69 /XHeight 431 /FontBBox [-4 -235 731 800] /Flags 4 /CharSet (/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/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/underscore/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) /FontFile 52 0 R >> endobj 992 0 obj [525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 0 525 0 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 ] endobj 991 0 obj << /Type /Encoding /Differences [ 0 /.notdef 33/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/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 94/.notdef 95/underscore 96/.notdef 97/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 127/.notdef] >> endobj 49 0 obj << /Length1 927 /Length2 1594 /Length3 532 /Length 2230 /Filter /FlateDecode >> stream xRgXSiCP^( )@D@ ! J $ ]"2G #A@EE`)6`:8?ws|9﫭Nt'P> ǡq X%$ 6ˊM  `MHm@4:jmd  "XGdܖnp7 rA |@Bbٳl L 9\6 -R,T$ƙ N `0I%'1!+ M9/@ k#1 2Ec>5i@\(!PI .,V`,,uI$A,^`W5nS@A'`"|y}5̦@,`8 o\(`1h_h*\+0!Vw ]Y?!\?ڟ(Жv70,\K_dT޿_/[oqgCߓ`&$p퀱1>/Drx [M`HFf'VnKEq+3!J;:'z7T~NKсl)%:.'<A?tWG'dt^OˊR1 goF3Ye/?핖uKP6+Bڨ*"ɜ=QkE%3CAzQ\L S̯w9]J-^#N{޽ h6!\%AB^ļP)dECg݉!H[jÆzy꒱*;GG]cUf*ؿ>04: 8>˳s$ U3/1 z;mEÑL1PWJd fQ"ѧ* +kDacgwI D`fX=ʝ䃳]Ż}nUVzMִY"4M>k |֊pQnTNH6+S&W{L:$<Ƕt.:F+ob[2n(YcY&L\vdWzIQ7Dk]}ȩ>t)Ύnn\=3wG>,TgKَ>nG%' \U_(%Yj~KR[ h 2ko^lok.4L_pX+Kd^{ x5Ul٢Nɥ9 0T$A-*AbPCn1׺fԎiPnV91yjI'RAar6*YI}jΞ?^$H?iԆVzro8 .uaFKђpM/.`/]`dxu6!G6>dQ_XIx*9# <͂e]ŗɿe!\7ޱ cz|)YN+V5Ut˞/s=<,wl:`RR,AIHv|]:]h(Њ<-,A9W^>%ΌD3+XYhViD6'<7OFv7bl+v;LÔ5,h'ÂNvu;h~z* nݠjϬOjD!/?!@f$$q|I endstream endobj 50 0 obj << /Type /Font /Subtype /Type1 /Encoding 993 0 R /FirstChar 0 /LastChar 110 /Widths 994 0 R /BaseFont /BMCUPE+CMSY10 /FontDescriptor 48 0 R >> endobj 48 0 obj << /Ascent 750 /CapHeight 683 /Descent -194 /FontName /BMCUPE+CMSY10 /ItalicAngle -14.035 /StemV 85 /XHeight 431 /FontBBox [-29 -960 1116 775] /Flags 4 /CharSet (/minus/bullet/lessequal/greaterequal/negationslash/braceleft/braceright/bar/backslash) /FontFile 49 0 R >> endobj 994 0 obj [778 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 0 0 0 0 778 778 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 500 0 0 278 0 0 0 500 ] endobj 993 0 obj << /Type /Encoding /Differences [ 0 /minus 1/.notdef 15/bullet 16/.notdef 20/lessequal/greaterequal 22/.notdef 54/negationslash 55/.notdef 102/braceleft/braceright 104/.notdef 106/bar 107/.notdef 110/backslash 111/.notdef] >> endobj 42 0 obj << /Length1 1434 /Length2 9840 /Length3 532 /Length 10705 /Filter /FlateDecode >> stream xUX\۶qww 58 +4@pA[Ͻ'}~kk9碡P`3J]YJrlv66q$ ' l/isn<6[+ȩT{HmI@رSpx` ew};jl%4gD6w $6+Y,#UӖQy0Hgayc(Ny$NF4X GˇnXJaNC ;3~ACM< [9OiqN3IUk%FZ)s,o/c2&֤'o@B/JeJDoq Np  o_).2AN3VI(;@>HWFJJgB ,,Ha٤P>=E}{Z7F a2Vʖwuho4I8 3fh+OY,C|ذmP҈^ W#4G8;]~#qY!R^'Щ 浶 IէT|ͯsȐY<+^H"qyH$P6k ّl8j \ށ845W+B g>U#;@6Yҹl?r%fL3m^g으+?;؞iXF9s1_XU^x? %?p!oS{z ]&I0&̓,bæ>j_Ź7xMtҁ$;it*MlK%ia߰OW3~W?U̪0~pؘRs&"K|l-/ˢ;4J|J}RKk8ip]fPČɤd^P  dv6YSeeRaEO%c)=5L,=lW^ yRP6b`FAQlϯYnVE׍Rày\N>%wr6)މz~]$X]g܏_(t~ٖK*xT[r} vc]SCNִ ;?-ELGAf)G\-2_O(}XzFF~ҊD A/iiQͫ|iz`$gG@ ċ89cnڵuq[͠/)FaX6:%ڱᩢ0|(=90G9 A]NFJ#W-}gͶweê*Dp Ғ%˲ȦZmӶna<u\s(daLH1I>x4UPlnـYDtY :;bg/ yNο'0K ׹̷݉ ]kb `QoߤUR# xM,g#L@e>I3|dMbF܉P3\:L0!jUUl^A?v?m(8BE8aV@(8aDŞ8-f#3F^/ ȁC@63HlDA8?Gp15<jS掃(PH\"9ɲJ.aw#+4Uwf am6˔O_^D^UK-H` ?FXI7 YK50<@׀W8,(+5놫 No;'eKq/;:,"Z*V dgށ6:^z/t s?{B$h:B#/7g',OVԨzm~6e ]'Nؖ|-I7O ]~AG ^1L0]p)F__" Sw u:"pNj14FNI)DYZXK{L<{/q5?ϩ.QV fj`E <'t5(3; 4KkT/ު>qG;A:'@n0qM-5lSQ H8 Xa>k4IT"6v  5V.bn8 '$mQ !aLi'_gnOبZv;z"yu3oېEv7.K{OR_ASg*-,md(`-%[w{Y(;tS9;ޜ{*a"H!6R8~*ηXyƺvۀ{PsTPGd;\^6DƛdSPn&v՘ o ,Pt%&6^\J.y~⇑0gB 6%4:HHkE mɍ]Q8#+NNp02m0qc~M[3(xxr5\TKu;d% LOOˮGln,d|'QS+~+ig.ueڴDWdh YՃN nb9Au|c!w/Z'_7DulJNߟh}TÃ0?'h&K߹q4W!DO˼NEΤ -uRtG! ft1p9]QNPI2yO85d}uGĔqEtȥu@JƌԆC/SCj+y0u.7[@h6XT|YxyLA ҟ\؛ƅO w)l  Ƭ0$ MGgGJ!,З>Rپ ~2z~Pk c:D 92Wж:IOZ!9 ^YOFČM鎦/ZuC42!Uq!h@HI婠uHWZ(Y7 ÜGݪLJVe:9j6ޱA$(ĞF_\99=uW{ ZcxYBz'GWMnV}Rt 7;=6~voev uMFHw#j Rΐ1UP5`LE_*jZ&k&ZS鿋K,.o>pmO.v9& ?+sޠ1]{<:PGoj3Ev$uUhȸ}C:`d[gn&q"v:v~JE*I \pnTYb63Qاԝt/m]P@wIo u0ܭxALИYݽ{E;k5u$(rvs./m㐺W٘FG5"p[f ͵\>ɯ"ߑA 5g*59]HY2s3M}`wsȎzÐSODj*fRϾj I_#t%="AX#C *GF01*=f;F A.˺|bow̟Wq&}mJOh& b㠣 w -o˔*Pj-YLi/՚ 㿐mmZbA#lHyZU1}gTJԧ Uز%22㒽ܻop[T~&6h7)g)@\kfZV #mw&kT ,U ,E ME]f6?e2I:]4A#TE6CJF?[J\*kvLzľZY.]JD)_«ɑ{k cZ1um{s2H+ˢ:S4Ol)5f?U4l^ TCʤs6*?39u_];b sjS6Fh ,B~@m"Kݐ-"XlNtP`l,"Eٲ4M 8cMâw O7xFt5x}hzA9i*)Jv=/ћHXJAGJ=@C$Nb7+>0_'%,"$]XV"^Qe %bhWR 6Hl` ϽvF+P=H}@'C|HI>Q^=mb&yJQt` {rRQG#!L6gfvBf<4xTfLHT9)jLh2vE|Ʒ%g95̙$tB2X MųfXn*IuY +w"&PLl,16T/p8 8,7j_zd۩֮շ"h.4=ә7J/FNNdvtRh̐ kg93BV{IL ϏgO+T+!WLraOrB? mvOl S"a&Y.EߒwE0 }@!+7+GAn[<ئVC tZG܅G8 I`(%Vqfb8 ` aY!kޅ7A#SBx )T{FW J;[ݽޯOi9Ű fKGԂpʷn(m}&XpkQH'cҍxOS?5ͥ $wI c\ "4اTglspw?>*¼X3rX5I]%w(u*! Wni&]Q'AIڲ UCU2y$cpἤCQy:| bI%f8-Jk;Zu|Z.hKǥe!A)\ -WQKS|Rn݄|K`X?T(YdnpEVBZ23 9?Mn }q .*lrcGZO% Qg;/a{郃9<nE~+CRivkN+#(m4Hw*Uv +> ^_:"u[ϵbv> Zmg$ 5tHu;CΈW"WZ㤫lк'9!0'fYi■*-|q2 gK'}6b?;W<}u:S:b`Ѻ q'Od~~RmF""ުcxo;ai,F֎_(Tn"De HCې K!"7֜ݳpqu-R<[>ZgϺ1}p݉k,|Qk-ŧ-HKNtZpgAP6mW~R5hlzPOf~O|SJɌpi/ՏVY4-!*4c갡9~Wx=L1/~,-[3tfvZjbA}x]6ӂ*g=HD+K9~pK3;zHqZZN]\2c>r.g.j=̔+I6/_ŻJ_{;܌♯͞s# _FjV3`!ʕ bg*AD`hhs}մYq+dG}T6>-FvvS3)fVL _yqq';K  K޿o xy4Swp?w*}Ua~Ht=I* ƲTR iJ@ัK6ɵ9&;V> 1 p"X9;`8ctPAt~mv:+~meImh*ef;/v,aЩ6l& Ct/jLhWU \/e҆ ;97];N-V[_ \鍖};%,M.EIfo߯r˗GjᏫGlwbcn.!;꫋0ߤ(zKr":_(^IFWc)'WA'U՗`ܹFrVAh#@E] I)*e.$ڜ<`\ Gla^KkZUɅ>h]6^&IrFD@z+)<d b3_աJ#VQl斨QVk7Nxi \я?gU[P0DpJܹZ +Ԇ0 ?q&VE0l/`wѨS"a& j:u躰U2ٕˤ]i |FDԞ[%IbEX'?z_rbϐ:9g4방r<ǣ}drӂp+{+gVe;/l#МbI %f9M֤r(cԗ>U.U8\ xs:uJK a{or1l(OFh;azvݕJ`Qg~٦<>YޏͦUuSo{Ow彁nGggR xstdt{ў\^pY=]g5[WRJ_K0NӲx4Ngb9 q_tFXyV&+!e&xOc_O "׳" 8]s̳X#Pt ",>(чE%i٦"%c3 ՚=/1^pN3=<7x+No٩7iNȬpž/܎*խ͗TsNߌecTtݓg 5!?0j6XVwԳ.u aU9pT܎&.%]@ F J2 Q}C N[2TMQQAh9'ɊIϨ%gOi"g\>9WAA' N(^kQgǝ6ۨl=d'kkEF+Y9KX+1z1rFh/`[$M{WfCi>#;}]lSv1z!HjxZC_sNH'xדPt2Da$|VOz^xkCQ~*o~[\%@m2xSʵNVa 7x)zvY%;"H3Jݏ"7z C/klJ QV 6:UO0IsK8Oēd_2iz5¡>iATe4d9gVXE^uZ Zu"1m`~6%k;q0|HʤXeߦ13/FV,kg{a c9.<`MC(StA<`  9(DnpׄNt 2[2 G314=l% !p&Frb0tx{ z[w4ء@Qx*B4+Pm[eVu 5TR*jܰ0TwMhk SkŨ5SQMp-ZzP]~-$`b]1p鵉^iqvfnقZNr] :pX\Čhlՙz`ؚ+SM(4Dz4Xo]K9cjByܔhreV7p{p6t]ZXhWk!?ܟt4xlA? 12C&yr׳D _sHJWC 0SB0YB}UOL`f 4urۙ: /m: endstream endobj 43 0 obj << /Type /Font /Subtype /Type1 /Encoding 995 0 R /FirstChar 12 /LastChar 121 /Widths 996 0 R /BaseFont /OVXEOZ+CMTI10 /FontDescriptor 41 0 R >> endobj 41 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /OVXEOZ+CMTI10 /ItalicAngle -14.04 /StemV 68 /XHeight 431 /FontBBox [-163 -250 1146 969] /Flags 4 /CharSet (/fi/parenleft/parenright/comma/hyphen/period/slash/zero/one/two/five/colon/A/C/D/E/G/I/L/R/T/U/X/a/b/c/d/e/f/g/h/i/k/l/m/n/o/p/r/s/t/u/v/x/y) /FontFile 42 0 R >> endobj 996 0 obj [562 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 409 409 0 0 307 358 307 511 511 511 511 0 0 511 0 0 0 0 307 0 0 0 0 0 0 743 0 716 755 678 0 774 0 386 0 0 627 0 0 0 0 0 729 0 716 743 0 0 743 0 0 0 0 0 0 0 0 511 460 460 511 460 307 460 511 307 0 460 256 818 562 511 511 0 422 409 332 537 460 0 464 486 ] endobj 995 0 obj << /Type /Encoding /Differences [ 0 /.notdef 12/fi 13/.notdef 40/parenleft/parenright 42/.notdef 44/comma/hyphen/period/slash/zero/one/two 51/.notdef 53/five 54/.notdef 58/colon 59/.notdef 65/A 66/.notdef 67/C/D/E 70/.notdef 71/G 72/.notdef 73/I 74/.notdef 76/L 77/.notdef 82/R 83/.notdef 84/T/U 86/.notdef 88/X 89/.notdef 97/a/b/c/d/e/f/g/h/i 106/.notdef 107/k/l/m/n/o/p 113/.notdef 114/r/s/t/u/v 119/.notdef 120/x/y 122/.notdef] >> endobj 20 0 obj << /Length1 2206 /Length2 16982 /Length3 532 /Length 18219 /Filter /FlateDecode >> stream xڬstͺ۞cĶ'm۶9=1'ws>սzuW=UWUu?Ċ*B&Fv. <9ef&309) njD<,-\T"tٚ:Y ],LmcT-M]<B66p(::013L,]Fvp(Iٙ86qu&7S'g_' Q8);?:::MLoWuəXV)CKc!;sSӿC&.3CgML0sR`QWUME?_qh3 ?39`d <=@bx3,LL=@aF;{#`N|fNpl(p7O3+8Ϳ?-F;W[ݟ0O`dlj\FC[`Dg 8_Q%:3 pe6uc`ag-lc\şp%^NEۙف.ف.Ng]d}tPx@YgS\T[5?Zw(hjp/T?A8JB#*"!b!N`D$NR(#.2".r". !.(!!!˗?tQC@?tq]忮m yo 3@?40S, &?/ B`J,B`NJLX@'(WbZO:hB_9 VN?/Z@+׿h*@+hʮ#,lM,v_=]_vhf1ڲ1oUzKXXl%$ yk 624[UYHGGDxQ]>JSW KGnGY^x7Yr$ȝ-w [)C DU7AݚC885ijlC)XQ2+"7QR 6gah\w='<`ƣw*`( \ 7| fUG0Ryau^bs"ܮڻ49tJYi-WK~%WR>x dv|] bPkA#[bk eebx1# 8|x f :Y<[ S)#VN#|}ulqqs;2&7`{JZ#\Nʙxi'1$AT a A̔q+ )2-8`[c֗"ԇL'Qd,V M5fsg [o,Fi:&A7^156-=#,M*Rxsy b24﷫üљf0K%F <Vf{H#a5PlЯAc狫 pn> ̹P;J i1ow򾾉g>=b dT_KK, z*]m;(ߐ7mI8ET O[0DQD/?1d=ޙGˈP,*a\t5;#;*_"]4 !(Gݳc'ۑI`_CRnɌe1=oرgZ9LxzG s꛿&TΉLm̹'Aua+"Q Xz 9Yq @-(rVWZp) !bx^ާ\tӘ#+@'l\d]ǒk< 5[_3쎐ZM&ʹMy_#5Pz;bȴ{] ;yo[ Kmm2`fN8$rYCjP H*!Xs O; p8$ wa[n*,5 "4$*=CV'd´w(]*B7F>(W }52.C+'aP1]mtؗ.ڨ7緞f6uffN=} AOh6=ϋNc uI)ra)+QX Xǧaɦ|g=3F<;w  2)2Z޸{LY`a]k]>1s): 1ɢ`$Pܵ& 2wx'̷LjxL{Ĕfu8Zom -Zy?v}#^\Bn^t?d8臬li^UqjR1q7j7 d0njrBy9A/GlR$x3DtKB;)3v94{ ;D3kGʤ'X}x$ڴL^eDNؔrµqm/$W$SgLE r}$ xw`e`Ǯ?ʌ7.rOȤiHBߙ?z22o1h0jFM47:1$c?łb2dbऐJ3C؋ z#Akno hxWINϢ\ͥ:ߠ짟=Bgkh19jzӮ">580S޺!k "j4:B-׋iq&rUI3ԷKO!IT"|afi/fr[,rٷV%S?Y-ZͨNh!vlmic•.SlN$*rN!ʉ}3IO }ytlN).3ut购ߍ"?kDߤ AD3/}T o)$M2P-?r[%m#T"k^a(C0xuGUH]'qq/{h+pSߕY!~S&ZbK;U^/=_3ia'CҫBpk4}4~Ur~V3\{$r*,cPEt)C0W` :-E-P}뽶ggjcm˖+ #a d%Jλ&x₰:):٠!X{-zUmYDTAKa( 6EdckhoRPċB, CH];V}^3 lQJ A/"I2 Jփ0; *\jY50l'Mpϙwx &^k*of Ɵ#v X1YyTVxUy>qf0'K`t4HϐI a5?Pw-ޑGG2CV*.b^]&sGbWS=?ǨbUNDv淅WY}s Mhm,&ߵNV>y*)C(o@=g;T_~k]y=]ߠlUhܖdq8kV"eф!%"CMJѩ!>/IB03mѿY2q uT? NaKdyo? D_sV\#sK@\rK>wfE "}g3)s[ SE܋=f?ׁ^*&+|! ɡI !NLHhl–E^gȃƩK#t9ualY5B,ğjzWa=?TH9t1XL=@ $#<0h3ވNp!!NⶦzA+WfY@pӈMHS)F-uİ"re+~{{z~ޅr-8Q$g~aǛ5.E>$M9[莓6O% ҧ3ɸ:) ~wZy+@VGCwZqsVJe$Yi! 7s\3,vL Г5 !$'_1t~ϵgHzK%@W#+mL7[G~5M?'O@_*%F+g0&X{A(Wߤ^IlBxDlGILI0^E>qr`8PRl$ La,4yf'~u/F `Lcq2`ɨV\bxfcՃ4u#J>Woμm%+w?08rMW;uA|mF>ö-Mi- Ro:@3Lϱ}^{p ړ]k.`M+s"%\l{5:5)7(l<_*tَH0oԸҭw]]eX:&W7p04|;lC}< )B*061vΏ4bL16j%.JK(ٵ/lf aĒkbrP,cR dMhGQ#74Z&C *bLYS"T1߀5~T:,?zJ螈6khW-Oס/DS%=򃞁ɋXKڂ)n]7jS4YCe9$=&6;{6r-y%m0Yƍ+\3#CјǞJbb? FGe+k*('Q$4#$Lzo7P~E97It:SrͻVͥ;nVq[X௨ OՖ]z2rʕ9ɫQo2᫡]4!mM9VUCb)zп!2E])P W :H[1D .d$^Q~x3$/Qg۩ `<#[,Mpp{]V+[A PTKft|FXgXIhx7h3W>xjҪ&I֚hRX.V:`g M};J璨I=Bi#3WM(a8:8.֭O5ӱ3m^r6͵~jaXedU~w.Fz B0q6IB߅9ߍ]v`LCAU>"d5fq}"gb_O|1*G>&ME"#YRg@>!V V,az,0k6w2۾8hC2;(k+X8^-9Ѷx-64 {Kq>(-AvpO>Xp#IH6r;@qWL-=OT>c9z -"+# I ُCB~9X3-%lM_wpSaI7ue/6a> EvBo=g'{»^u}w),):h)6I[&5 N{N}d*;QZRʿڸ49\~Dߣ?2BMOQN4e nslJOlEb~2Y/Em.48cz!Q޽CqB+ 1 \7j>vQ f-ͤ3WQsNQRSB곕SkPfw*#nOq՟#W}fiF+;9*XHߝ^q0sit 5#gͦnx|٧b],~j Ju1C!d!3#4Yǟgm\]RS0Phˆl8!۔<(D/E%.ؚpLd=EX`:啪~RԍʻAe-b:Z!9"f/uKrhȠk" L`al`3!%"j:bTkGx2Lr?S7]̂]iIзd :H!%կRs*9?=.1~D  L#zq΃NF:Sv>Βl̕?IbZ[L؈Y|S9BN/;.ϒWL^19z{{33$ W I6ښC,PjKċ[55f<*,L3,g\Bёj:,msAqw[4Q&Ӡ(N*Bd/}Һ~2x'.</g* q|U"" &1Xg>Vku&^OBsD80BHB*U#;§`H+m$ V(ڲR$R&{8ũY}R=t ls|:$;nz}Ș#u'ͪ/4 ?~j0eS0I ` ~$T?EG!`m%>a|A:T4ZKve[nd~,>CP)j~8g(BN& vӋձV+h8e ʙp2ҘIrcbx 1dMْoOHp8w{G&+9L+sV?I{U:}Ⱦ!gߧLr4[Wvl8)#RXv)ʭ) ]Iя&Zr)N~'b#ZmɤƗ}b L ]O]5{ɵX h7q6 m"β9ULQw۔BR?fdb-m7`:d,R{9)@C~_XF`t,h=]3&\ J5w3ZТ/h8A.}vC$a*r=,B0,)O;?ò\TRTןy:5eY%&\jβbhfnGVf׬y| MnjC)%e*b0'%E9 D ۦƅ`x]۴SC%7 PK"X C͑Cs~\3 Q dn/[ψ]۸k}y O󥼱GL?]@.T `5r ko@O*#cE&씯jd~6$EG.\oeWLDyTQ#x){T|w㮵p#ݙrm*\^ͳ, 6,:*dɉ>A 0`<ﳨ4 $f :s|@ylҬ3WgNr= eLz"|]xmdjW+ !'0 Ef@WKF\5oqqou6r;ԇk[u9tݫN3 ._PDcTNk nXUR{%(1nHф4< q"%:0qܔʄ{4Nm7 SAy~@TW!elZ{)Ҧ52 j/EV?+1ɽmiYux ETS;)veюRo3,WN94Q~=QvlPEo?8.$m)25P*D]%HI].}$Xyv/Ht`Y㭾I~h+)x\z- UOoīRjzʔ%;SIC(\|}mz,CC̆}"#B¹\0+hghs5i4>r27 yUKB6!?NyӾ.˗)+<13o*OyLO bZ+ Fz@a?5bM|:9%C1~X]1+o"Zܼ:Ł@~s۔l(pt4z!u){jF-K q6޷r+u{<sRϾ.Y3:cQVHXs:otajzHS >!<V]Uߴn&9@P pi>tULXcܱW#QѸ<^8cwNDO2Y pܓ_VBL{egi|Ej׺!yQR^J${x8l6bJ naϛ:H;b 8A_7ДG:rеTї!h,;h!4v+)Յ|R|2|hL7,׮ohg@|LΉ`"P܁:5 )B\@Xm֩dtŕ2v1aʃD4dn ;}| =s84`V }/+S\VpЪ$w+͓6YReO |gMK1k#\vOzMcv[|#p#.ɚw5fuUG#?MD&1H1cc;-|^ue;T\2CT1R?&6RXaRt; ,Ӄu 4BMwY% 9[)?rER?4S+ygF,x3WO0G7M'^ Y`S\OKsOӰ;N*9QAu-30>8 f; ]6~ghxMlސxqdNn[ZB 41 M&IdNzkAqc*ژ1amjje5G y9m1.9#гe AteBLbcH_N(菿6hb"fhJH` XTC-Y_j{"L[ġO0?'N K`73}"`ܯC.@T4DKW`Vq~3bK*~fޣܽUMyIqiupq$DP\坵B 5QkNkiƲ|ËH'8>)A/KJ {!i>Ԟ8D<*%&$6*Ro~< щw|ǻOpSV{Pv.Y?e5Y[mzf;/*f7+r"𭴙ZZCJ )UhQF Ki.>NTR,w3 BrGfK62F(FFg5s]c錈ju,uVxH̪C$VK"jbƄaBߕv<3es ;5٠br6ݵ܍]$/3m%mlm4}m}c1߷ƻQ|G&5^&m{ӷɤi"#{gF4q<`Aߎ}lCK%C X?Yi^O9)H6u=b8r!9̤*.8ٝ|2aCqL6G*5Y,n=^wco=_ ̓B&W$5tG#Vvِã’s"ȮI9E5w^XdK}򏼐&Nb me;][ykV. AͻoD: :\Nrp1H{HGk0!%̇pcw0gL<a/3m/B N]|u}yE縍ݚ:\xW3qJgoC^F!:C ت0xG$E4L]tenë1gA4Ҷi|,WJ[!_[Es36G֨3)92-e|>HqP S53lA XzUsUa[VxNP[-"x2+I/]X+{ @V%tb$g"ǒЅN!ڒ55(5J53(Pv@ L R;4y9)_a(>+=N'<h#Lq6R]BB0;qtV~]vK98 O8O)o#GfPE[&w!C:}N:*6+}]ր#s?lj gOc¼ѿJJu}'d6G"U;bҷ<:[ wTe>Gm~2l~(Oʵ# w64EyؠN%I+8ӋG"׵ŨȜ`8:ltVNuGFA™Z9U1HC';BrCeEW8Ոё>H$Ohl9]J\&ZOZ2ւH=$ou# ^dVQBh&,Rĺt k9ĺsYS^%F*DBzD~VG\w vIS K h :p2_6YYk L]3 P_QMɬDA8ڒH`wT>}V9֙-uzd(͎d'ڨށ@Lے!m?x%TvUev"1 w큧ytA'S6뻛NZo߳PmtK|ʱ'8v>95uӆ\KLEm-ElMk-OX VJP'x5MMƆg_C&Ppy݈&=dB%}z6/RR|XzfH8Å@ *;N3C8ƗZ6A|9\`zcrȫAB>ö-unW ^ JF:#8PR;)x"1&w4%D{dlyPzNΛ pѠSkvM39DQQ|3;zɢA3pHnVGU+ST/ U>Rbx\/繂hf9;U*-t:ݰF[Ar{>/ S9̲":C9\*eJDGRc(,K+PF7KԌҶw杔STÉ5Rзzf".!Đö9$O6bI[8w-ˤ~4\ߵ秩[Xz]|X*>! ve3]]ڭ,u'CKO|0M(~l2EƟ\*K磗 Rz>~ΫuFt(DKS(ѭf8y7؛!2^#bm|ۃjaݱ /KPb\g(C`=&X ?i8h5|F [uR/(%S6F#*c_r_PZ{V;#UK?'/XblLwLoH`[g@Zicv3|/pMg6(?qV"~e;}<':/h7Ӳ1 טF5*ŽjNu*JN!y^iXF- ']CIw!LYErkPZ[1Q28 ?v`j5^0an7\Œ葃Z6V~}ф Tֽdeb>w F=er*&[.&] V΂'_C%@X |^fWBƙMHw''pܰsDh .2&Y inC+'fTN(mGswoxDkFHީ=T0 % z仌 _cm'ul8t`]8cUP"L^L:|Q%9+[ҢMHU򯋐=qeC LۢR>lԏ1Ϯ= <)?wbPϦn~BT Μ3!c,w9s6G˱e̙{( C2aI&#˕2HdL+19sc`32W}9x<RDxV:NHQEVbM;@9zGtصuku2zNrr*M;iRgR]GZuV^{&4NM4PXfsi|q ԇNNaps? ˃g4bM46:dv-q-؄K{)v}+CV !fU:%FkpuiҋR$Q\1$m!K"L@2@_EF˘4OOIw pzF&eD7OxकQ EXBR9%-v5&<$~q1n_*Z>oiOr!伲FcuEv; 8Ս4Ml {N;}W_VK`h[JC!cYǕ4/$K]WvCJk/Pƕ.0BYTr Ę\ }W<ӝ.{~;̀Go~bYk@7tAuVt+r>%I?479cɾ5SkeѭB&~?}nUyT{dv{=MXǝE `е,eJ()Q\4qh'K]ҧFZg$ui2xJ7C>J4 ,u˳ً.g_ 6J[r*<3'4\昽vFsyNU-ŹrnE,îbc7bZ:+O~B& s&Yrxb̪&J1S,g$dwl0$ܮZlڡ=P&880 v1'4q÷"نS* /٤dž7X篅M,Ǻ.U,> endobj 19 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /CCQFTQ+CMR10 /ItalicAngle 0 /StemV 69 /XHeight 431 /FontBBox [-251 -250 1009 969] /Flags 4 /CharSet (/ff/fi/fl/ffi/exclam/quotedblright/numbersign/dollar/percent/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/equal/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/quotedblleft/bracketright/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/endash) /FontFile 20 0 R >> endobj 998 0 obj [583 556 556 833 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 278 500 833 500 833 778 278 389 389 500 778 278 333 278 500 500 500 500 500 500 500 500 500 500 500 278 278 0 778 0 472 778 750 708 722 764 681 653 785 750 361 514 778 625 917 750 778 681 778 736 556 722 750 750 1028 750 750 611 278 500 278 0 0 0 500 556 444 556 444 306 500 556 278 306 528 278 833 556 500 556 528 392 394 389 556 528 722 528 528 444 500 ] endobj 997 0 obj << /Type /Encoding /Differences [ 0 /.notdef 11/ff/fi/fl/ffi 15/.notdef 33/exclam/quotedblright/numbersign/dollar/percent/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon 60/.notdef 61/equal 62/.notdef 63/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/quotedblleft/bracketright 94/.notdef 97/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/endash 124/.notdef] >> endobj 17 0 obj << /Length1 1920 /Length2 13920 /Length3 532 /Length 14990 /Filter /FlateDecode >> stream xUXm  X!@pww\~u,>뮧ꪺ&%W0lih8B2 ZzzAxRR!{G Fф51s0sҳ“@n@3sG?Nlk{ @ 28<P4q0w61g`&f@x4Iؘla6v#g{(dR"A6VncSx:Y8 XgpQ'++YSh k['G{ 8AJ#h`412 t51:L Le71:UiiIU1ml1w Т7Ld 10 &hcl 0q+9[0s;3??F# tvN GcCl 3t&6V&c0Z991 XilMJ ~ ?Χ\kQC`-jEήN3q\џ/d31!$\_.W\_dEY`U^R @!X_t`U?#U9`UN!X_V׮r B*ޮ W&pwi)X3y9ك~K^&&&F #.bo܉f Q5m~ѐVCRvꏥ)Hw\BZ=FEϾE%~uMqoSLq۱%;Bn>fZ.K??ʖ'VރY&rJgeSMR QMDdW2mHtjuB{̅͊}Ճx0)h WZ- KwV^Yf}qݘ ]^:ճKӭZ-Rl M{ZuՃͼ*Oca^!J˭d%泳ɯhCiؕẄ́?85~͌b H v7-<{wdM^!)`؅e Z50ӽ 骏'!4;Ff _h9I+yտ`~BE+""D> &M%[V2933ZWl@/VNfZFsIr`6d;kDnG2bHM,uYDB8S<&"Ώ*}E TTKVe 6xcoX|1ՓevjOh /Ck [I }"k4q̛3;'&d'D]_+CI} 5Rnuj0LX(LՏo{ "٩.%Ï yH6<1˵_O quX{nL'aq!+Xv 0_6rvc <ms] X:ZMk0Euu /Lߙ?Ƿ DwsM~a9/t.qtt/W}FPC TIe- u4n^wztޛ 7=:US}۔Ryk"NOYF ẀryE:O?qu }oU^x&re3MVҦ7#ykuH ';@6S^d3*'P)T*g[Q Q`;u%ee0!ny9Q*:FF7• Gyvz|kɜgnq2@QlM۰2!tL LR$fQFmÉ8G}Lb|g"4ՒzqY*nkF^9[Q7m򧣱g m>$7}N]KqNf;Ok1s @P>h0i_OqWZD)D7Rק4a۲̟;^v0.F~M=q4U /USfZy m}A\:fNJM@sݪeKtCvC96|tm d{NrUc_[|cJ$ԕc&WUpn" jO MLsVf.PLv\`Mˡ7ˤzߪ.z@`7>' *ފ]ʻ Xyeq@q$I[)!~u sn=—`jt5;1 ؈ANmk+$^ qS  <&G9YrSO{Oyc,о0Ň^·W 2h72m'>! 3t[?ї> QD!-cm1o7g[RA[(f>o"FQhI=>9xA)LofqT^үB-F'б˜ 2..ʸpم k?t__P$f MvbOb]qn@Nv3|raZ'0:-is+l[OhxW~wKӨA#9T#4l})ZUGRV*EJ&a7b[ޘ=\ѧG+sCw b ^.XR=ɰk4[ʓcԝ-B'L%})wAS !Oҭڸ.Q h# /9hGU+0ȢMY<6p4Ǡ{sxhFpؽQUK]ÔT|H)xEG}4KT9TU5Ik  J%śs&d=aOt8a2Yt7GK9%a{[pq|H>k_ {tѠ# 0D_~ƐL7DNz[_IBA[wnM¬cwDTqkoU:=I_U+@RT.سxJJ*eR bG{{N+?(p,tze[*;;Zʺ6D2D 6dU(Ѿ" Ց:w,mv[]܄u#l2)_#;2߻)+"*:.^b`Uސ[mq( c\$LxWL EXՐ,QC[$H- ΘF2>5ι. V\Wc=0:ZF[~8<=7 G8q' y%xgC:/õ酣ڟ†i,f[Ԋ tjuVM\D8 cLi5\6=?%Ey?1T`0x1#_ \y0}1 |y[RFtok$ Ji-}*S2R{28 IZ]$l6UNP&2}@_*WCT UFQ&SH* %j73!P筪Ku,B,8v:AgJv_ 0B{a{$Ks߈P[J a}> ̜CuЗu{3O! U~T{$zJ5+F5h.5>3Ϩ;,0*pKxe[f"迡Gg56rՈ&3ݐ/MqV-Rw]%2K(Sε1?\@CI%.`ݺ~ɛ;>ߥɖqy-^2o4 xѻ"/UZ<}Jl顾e I4M^4W~Tk/m`\h*8j,mI^g&%T* ,G骗ptK^@`%qJYxT)En~ 5Nu OyEEeJ!6DQrQziEH xQ-ՊkUUyŊVx@VOPgSA9c,6Ra #[ę"\EyD:VйuyUܮO-Bٍ1XL>yFd7 H$^1N̥#p VW^+UfDdO9{"'W3GAg7ʫRLnYښFGC.CI/9UaLk!*-;M>+DvO}Sx}לo 2k{׭`fGțH,b̉S֗j1dGߑ1.Dwѥd뺭1ߛg " 00[Ef3έ3y^Llmaa@6\G!~a- Ӿ:\}Jtud Jh@Z,d*SwBQؠkʠq=(ߥH]|"әflޥ*P P=hëV%Kj^vۥ(;b?!1is23T߿~3#4.t]b)d"wTMnhw޽9ŻiOO7#7J/)wgW>1$e\︈q̱Deʠc^+'1  &W_<09THciȝ3 vڎ4T%vB;ڠ05[αZ&Q" '%ۍKAtms C \ƅq` !;GΘtʫSJ_15ū(d%፪qokĎ 9Ȏ$خ9n4s"_v ZD2n@@o?"?ANzhN7A~$ٞ\Ydl ZĄq@f kF`6ϟ00q;m틚Q#iW4q%\\ ~Wńr)܂fGHe)H>D,r1`.6DO]% ޲'؝ >q%v~2]RT*䁁!;OWW$ MOVT򡆤W[[GL#2s}|COÉ&Qff9^[m tLτW3[m0QYWYo XPRYC(k/7K9ň ˖Cݐҹ{ĞP2j4/sIcMxw8յׂ9-gIb [Ew3-e =>~R=&yf2RvY@/qE1MU5rc=`$CgLEIpq?ޏ Iw%aRTY} o$3&U!A\;%TƛZly 7vX@6[Vn^jE0flۧ!75[oD,4*=Ҽ:urE o 9_Ym/3v1Iw0XJY4Zd3s5O b Ӂ{fN1ܬ֕>d{71 $|rfя=tD[+Gڃ30P]ڈ(qS$YQ&,גW-G g\;&Hzc " "p[Zj㙜 `hIaޗ'A %#[ F*qAAp@\niQQ$ S׾dMSLBNG5:9wjyVۖ \XisH-!Qr4txr V?Qը%t`#8.,HFK8(ŠfzU| 5-',aOdwSY5HgDqZe.swVnb%q#w=:nV_u %=Yluąo.}wQ VIޞ:̹9R4#[KK tv ~ : H a"EPF#OFi(@̿-4F5Ī}(Aw$%c/k5P=e}/53 hUd(#WƑni͑oÊ~D 9cUlQBچYyAOA>U?RTΐLd&m"kzpg#ɆD}UpnQQj m>q#@ ?h>6dϮ W (Ȉ&NvFj<& b~:}$mјpQ./k$zǬAR"'䫸/%ԯ*?cȄPbgzCݎ\(;+Oz9H}#Z;O1Z}x6BP:?sEWg˪&p430o+˖Vgx4p j{W2QDX$Y;ۑ? Ԛ9*~h_kͿĽ]+:)*EV+ \5;l[>Kfi-s9hcA v^ߢ+xQh!O(€ɘ;TL@a(]ߎáy1B{^b@U\2rG QUH~j2 _,x=G;=ouImħU/zMDjFN7OʸJ<0? dJf^sv\tJ` z[a1>QfdaIVw{Ю\judl= WD}sĴAi$nt*ŭY7p~;4:nhWcP]1'poE~/ΰ-ri잘Ԁ ڡ TSxbYoN2F:;InΣ aΔq8Bȱ֧XӯU#9QIJ5jŃ́e[72Mhv|W*^êOzQ9>H1kHM? FVvcҫyc9+A:DIyKV!2P86~飜7e=U~0ΌʾgY{?1BhAN;9w YJ{VN,PQp:qYE &*YgJٗ~bņvgXaT2 sZ]7 ~? {. Q;Z{p):bݗmֶ ZvA*DB3rqp)mLHR޲j){ uY gU5%q1U֝y0HXqsmpml'piyIX)Z$u+d/}.NBmU!ZEAHf˶N䒎NEcq oA@/̯DGS Wޟg.?WQ@`Ч~e ww:Q&"8M 95 #A4DcG*, BꮚUQ}!&OD1"\ScC-O" 9ݮŔ*/m`J{' 'ۉG죌ȾO IqO?5ԡEFYCxVl0+l!#pHLə#--12e0:\&H:jӁy8 غ# W$ ݽ7)7ؙFbo:N]3Pg:dn~cC8Z8H`[5+qmY4a43:yZMLuFU-& STmR4fJ==~r-;__.IANQ [}!/YHQ’uV ^;RYR dT;2'7ΊB,i֌_MݙtE:KoG nMMI },ܬ:> dDSPxJH&GƱu#g~<)1 ӐF>\ O@Hzao ?2Ze="&مEXn39HͰ/a\,A0d` 4rqY r{ְW0#t`_qKi]clSqJ)JRSb8RpO3g?emĮ~O&ˊֲ_1tY*h+KC "|-\]ϺASd :m17GC-ԘU+(^N7,^-gP-ُde=V &Mnþu8]ObtYةz1vIl V[ @Dz(FYtM[4&x64>9}z2Zrjta[0H7a-jD&6& }U,Rc`BHl=>N%2Ry֩UIu#̦Xp7gތCe&6acMx)B`E9ΚzKS WL0}>lUW>^ B|hY+~$iȏRCk{#lE и_Y1[{u.n#y%Lc&~7?t-XLihȯEMSZ7?gq{An 64Ŕjݻoߺ_{{ϙC21 gH:ϗ P\.8 "RF)@%AWa  i;%=ڝZfQh_AZݹְ;TWd,p#zux[![t1u*l $ @uBU Cn7_:jW(gfd4ܠ4s#&{mnɆ+UnB00U,pyF}@ޯdjPrturPihL͆J" l:_۲;r᪌W&1B!.ɨJot\쏭7I86uE{zgEcn1<@">-7ݕ1$җI~=a;bvS,)٠q / ! )4  LvqL lhVmef'!՚Omy?˻g@*%|c,-3z_wXlkY`<ѱy?A)Gg=*RNnԸ#=,ҩA!Epx̨n"2[.ɬ2;K:ľz<%Amd)J㘮%p[z[ul3O2Rzt5 1"L8Zst7 z|?`4]kT4 {nye_s[ֵ)E;Lr%]TXש<)Z.'ڞC^SsGD/C4S&ۯyk说!9ac Fq ?|Tm +xҕCg_>+|6 #( a|\jWpLB7KvuD,*m_~h 4;KJ1ߩc>\ -.r5C{ƒ|1n:GTj f:J0E=T׎NJ-+ڌTB3E9oC L >Y0T\L{X:wDYaab6v5N:rHFk 9돑Bٸʘ==k#}I}nٰaM/A:ûW#z{U^řt})dVRU)bLg~}IDa ~三Oe[L,mi%ob~ѳ$+UD/)r31ߒ-;]iHUTb?()e:c^ܿJU;_k16r֣^>-AB0o!EK:soAs+0Zif{30d֒qc5-DR{Peh ᘜl~ E#+{G% endstream endobj 18 0 obj << /Type /Font /Subtype /Type1 /Encoding 999 0 R /FirstChar 11 /LastChar 122 /Widths 1000 0 R /BaseFont /VLLJVG+CMBX10 /FontDescriptor 16 0 R >> endobj 16 0 obj << /Ascent 694 /CapHeight 686 /Descent -194 /FontName /VLLJVG+CMBX10 /ItalicAngle 0 /StemV 114 /XHeight 444 /FontBBox [-301 -250 1164 946] /Flags 4 /CharSet (/ff/fi/fl/exclam/quotedblright/numbersign/parenleft/parenright/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/question/A/B/C/D/E/F/G/H/I/L/M/N/O/P/Q/R/S/T/U/V/W/X/Z/quotedblleft/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) /FontFile 17 0 R >> endobj 1000 0 obj [671 639 639 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 350 603 958 0 0 0 0 447 447 0 894 319 383 319 575 575 575 575 575 575 575 575 575 575 575 319 0 0 0 0 543 0 869 818 831 882 756 724 904 900 436 0 0 692 1092 900 864 786 864 862 639 800 885 869 1189 869 0 703 0 603 0 0 0 0 559 639 511 639 527 351 575 639 319 351 607 319 958 639 575 639 607 474 454 447 639 607 831 607 607 511 ] endobj 999 0 obj << /Type /Encoding /Differences [ 0 /.notdef 11/ff/fi/fl 14/.notdef 33/exclam/quotedblright/numbersign 36/.notdef 40/parenleft/parenright 42/.notdef 43/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon 59/.notdef 63/question 64/.notdef 65/A/B/C/D/E/F/G/H/I 74/.notdef 76/L/M/N/O/P/Q/R/S/T/U/V/W/X 89/.notdef 90/Z 91/.notdef 92/quotedblleft 93/.notdef 97/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 123/.notdef] >> endobj 14 0 obj << /Length1 1816 /Length2 11629 /Length3 532 /Length 12637 /Filter /FlateDecode >> stream xc|oOlۍĜIضm6F6nxv}?=gZZlj9/*2e5&QsGS+3?@\AL̊DE%Z;:Hl||lQ7K;+ rЊL &V@{p 3;5Ջ jgPg @͙fS?F29#w ,Kv^s#l,.fghbOznbomNn@@rZs_md\MD,YHY{͕]ͬ&v.ŁSl`ґfCekWu/'_2e?I:9[;72B 0q|@Ol /vw_@v0Z98,n@sS?8ٛs ,d8v@?ɜl589a;7?pQ+/'+_93h'`q3qxA|G࿙ 9X +㟉;8Y 2kޔ3X+xXm\`UEfvqˈ!p ?.c%x&xz<i|'wꅲ?uhP㖯[lAͦgw@s誟QV[Y)!˃bL!:`mXWdhJN%[tj^@; 6ǨuYtor!qK!/5$. 6R%u}ʔ{L2[VN&SVł%4/w%1"m*%/hY{e+jXIn‡m: ;S^(-儩 5 ("#,?4U5̊c ʗX*r-άd,>I@.LџX=r{ c\Xb˵XB'܁/JK'ucE~նXZ36#^D c~5րU]h'evb`)xg)/JGOw[1 +0vL#GN\;\L|qb3#mX4@@Y9)3Ս͖ۙ;g 7 zn$;jσOA̠Vg, _:'Ş>w)  'A8.EFLrƤ  C: ͿtK9R(y[):V}넦&dO,\(Ҋx(F}g$1Qf/;޿>!ʱO/'lKԏDoq$ |Z ê]7*ddIYڞBoQ_J7psb<Jc+TLƾNoANӱp+gu"hg:ܽ.N!!NPݦlTrţ RNq$V6x`\!;%*p8hoIڋ$]eŸB Č\Uׂ)ƕI`.Bt1 ib|.˹?Xp=2Q yx2~֍Fh rharJ3MWi&vR5>cpiXïwgBn'}X huK@BT22&&ݢࢽa46A:0 ,EGƙ'\7TB|rM2ZGJOxp:Ȅr3AӦ$=$Tqyk瓂]G%M)@BPrtXjŷEA@9jGۀ&YcIEuL A_Х`pԷuA6g?' <ȝ EN[:Czc!9NiʜY q6".mI! 3^p.̫ZaЮ 8EC<X)%$uN DLGL^jq2VL5Sj*eYņ3.2qd>Z  bjO:.m"n Q4b+Σ)8^H65[IMO"5ӭ{n遍;1Hݐ>Xψݥ9J%]iIDDi2II+].D,$x>f i1lLoңy~hx9Jqφ4U׷ [Zt7&!4C  9V ITN Űݦ[j!͸ѕ m@d`´r#.0hA/ YS=Xe\<1ݔL+r tÿ@:=}¼-0BO){1q5u݀3 A @;y x>H:m|ߕISkj?oE4lmX4Qnw:ڮX~M52'b,~Ec|c/Wq~af8N*:/O ٛw\7ye8x_p[zn" @Cj(g~]5,42%KX8.Qg_^Gvx2$\_~0Nl c{Y Fh׬C>GKZ-Ejɋnwb'/,G_% ](rG{4SOV3}^%s%-24οt7vIFv#osMm(RYɧyg3ZI a~v! %[<Ö2[~SK&p, 7UPfQVN%~'|^@D%]mv>KUS w!Q"yjĕ珡&/^G5: cxJ[ ςm$6{nQ"{ bXC$0a/D _5V>.[ا-}%%#DϯU撿d+yMIyex}RrB2c4/@gLTܫ%[ KN*h2Pc%z`2ch Zae$(aA.Zaؼɐ"Ǘy/*ʌ%nˈ7,vd0SL.2+YkTfm|,E?>W}ڏJ#iʍẅNOAio]*=-HŢ8Bp:rev|"Q41J#JG9x O&^tID#;pԻ)b7]Rr61]@5K8'+&8&H[FDXr Z:)">%;Jm*X:=B)[ U`#K(6t/RBӢ H.-͆_eրJDjՒ>(g7Emoȟ9vej;tv"t+(Ue)ݝ"hs Tѣ\b-B=9lo9u&)y+ 7зM@ +O!bmvI<v3]W|YߦB(^qGhzҹ#5\ TĔQ G /huETr?Lfe,lru*crб?A}46LE@[7:4nμwߌ[I\$K7t,=6WQ, 7t*_w:v:t>FW$HAz# ,{^2YBK,)OO^nOAB0gߛB;F)tkVq +?1Mn@*-MwonZ#Y(FdAVmEt>lɲ̒_Ow_fKiZ$ʭ6[G08GPAإ= hM=BX9Ϲ'Q~ORvis«*.xRCץ4) x^L˓pOJ{PWh[s c,O~^@Tg6: у|JI 8x- 4;kZ@14ۈζlAah/k8{ Pj+4wTǰLX >dx* Ek|1#ֻuA@~uJ{bX owEʬM³ra^RWQ v֖'Fۧw~o%Ḛ4):m̉_1NL*|j9IPVga;K4-*Τvzw`Me#p|zm1'{o3o]"\1 3*C!D.>"B6Aɴ܋9['3=NN][-JbeSۯ5Ez$ڋ󙉖3kZyg".޼ '[męst)2iIe'}Ff׸opWf~ I S#wa*49l Gttd +rX x+P5lg&҃ByUo]Q~9a@A4#YNzR7STh9xOvq;g+D]ϓaBm,0|Ւk%qTm3覆zgx|cCDt9+T˒\ׇ/?=䜎6f3m4%  b3g<鞩)Bqb#%_KÂ44vFCCraX2j_l8*&:T.IkS^j!6pAx9EmKZtH _cgI+_˥LsCJ1`- I+TJ7H#C/9",]YjmMD /өi<⠠ :~e1|TiUqЂ{L)kt]QfeʆP5 jonD-خ{/ rW{21`T`MGl;E-oOrY~L:dVg;7=4~"uUzn׶6UVM~wDo>ns+ vms;Y,~F 4mN6g˥3*: :{ /,ZjO37Mn~+n?lսs>`Kr&dI -Z@ t15:g8cx{$sy)pޢ?zS^jH'%4ܒR5`I&V4^nSb.}`ޏS7Opx %š?'3 !gƑW?"X\ :B_8H۽-t@Ipģ̭ȹHMWǕ~6ePH9snj{Ek~E\;wǐEjɶ^)Ӳ̈́IoRMg.Q]r$;W5k(}Wokmvx"~^%vWFBduޣRf+5&'rsɨt-~"nt1^ii\ˤH ԍ]q|Pe?p𠉽D=9V|?au-pd1( "r'9QW*Ƨ? 7aH:CJn,*ClzyzQ\ z )DGoջy5l.b̅dc#=4o‹(1" tKmoAZy#ʅ~b-˻N2˼hM(nU czv:hL,oz,,el-Ee9&oE. Ksjڤ6ZpbV]̩ q;#7|c ]ޅ>65N]U}-u5^I6$//$\$}/>N,إd/0yf_#ޖK&U2BCgP|DJCAoOzCqNO%4%T5.W=NvԜ")I*}BՉ+ ~5:@/}\y LjTcAS`WEAU;dO4 EYuSIz'a V&TNU*anw0MyL'˒ep!s'\T|Z0 +V4CmOdCf\o SXY͝N]Tb# V^gyXsFz\6B^)bFeƆgqFolO8=[&+LZt﵎tbe,[#Qiu:N=)nӰDᝢYcBN.E uwˠr-T<E- qWFcI繸 ,mK5Ʌ\_gpQIxҁx|b%a2:!On;eW.f)xRyvQO? + %:}l 2 v.$dcwllMոҤ&RPW MH\Sn `\ h5(ڐl9Fb~>O@j!%GޛUK>+Ђ(n{ 1lsg$Ó["\fT62&GCӧDb܃ 9$W D|PC,2{)3>|P$Ɓg)BsX]yη {t)*tMʨlTaoyi7oBp? (+nuak>bIQ \#Z&UKЅFN(o}5~%a60ca$Mf{im?5 E&[ԫ)C6@Yxcl爬v\o;旗}<7 utn̾2ZXXeFx˞L"T)(,sDkØT*ǚ;';Rs4ZnmPCƛ/dUa 獥nleoLgE #У/=pภZ,{ y)a+ qgRz5 yT>Uf7M!tєoH\YK uxV&8-@#OijE)oM#cXi%W+8AQD.tH:VÕϜtw&nЬkZݑ[&/s2DM\wt(mLT?R3+C%'6taYϸEex"˄Oiׄ/5ʲe6`K^4MTmVt0w=Ā[P ٹҀD -)}c82 jj-O$whZ$šOD%b㘭PG=fm! qe oY~Ǝ7,ѵ7"?v'fTI:4&g)Vb@5C>@]6h|*T䞘 (ŘDA뽉٘B>eɭ9j` \&.\OnLdaq /G㙖3suHWs/M^$q_zq_KTg|s5( W~U~¥YG˓\'ɔ8u`Nu`^tLR9 Gk'>َqB3Ww(s􍐩)l'PULāX-t!]ir ː{˹ՒHX'XͰsHsc~T*3`MGk|/>PJϒQ#,ݕ~nژȠ+G#ZN"z([Laݲ\ 3z2|UXy13nmuJRRZYOulH)1U5z>La}!hj,&L6mZHQX:7-Zvx9{!~=ba;>cvRqf_Az?~`5:"TvՌeuC1lHOi?/&; ,08iVlX 딽 >tM%ڸ { Ǵzk 0J.eծ'w5p:W$8CMzD^5@Xw՝kx5vW5|egﵘNFxR1렬RrTْH2+sC)We/:}&gc᧬Oczӷ !_ג| j.c~82n ]3*?R*e[4 >dwM{[!:@k7(Sv} "p9{{Dܪб{\ & p.;E&ѾѰߊtԪ?u 3- "HaSAW,@hLd3eՁ;^`_'}ǺarxqGŠ^CgM H&3 &!Pkr:E65(#W_?A 1^]J-#Wyf,9b 'ʑk WhҵЌ+ ڦ,A:(NR!Nw`->dàhf^E,tኸg\dͯ0k5ՠU]5ol_aõV]4Uzeg7};=H[_gKR?֢cmHmlֹL6Eλ_vpG ?bj.tp='8NvL2(\-0<5j{1)ף{`[/kzze!)7H-OJjP/Ӽ1Q=Q. ZmHG>UHj3@ϻ4u@}.OGmⰺa%wiIP¯ȓQ_<ǝyA E@C}9ٕd|1bNѯ OL P]v|(w)V#HOD ݜGjLHkE~ڔ9Nߊ%%*;>${{$}Bd%M TqE~rF:̲ׄUZv`?-Ƿ zٙ?\l7vZ1V:QRj-kP4UOKg2c|X۟ G+~oëP/|H13u0T -r%sVGMZ%N?J.g-N khYآ4n1R-͍8x<:D$"ccH%g ##itpaN5܌NϸBier5G{N??EQ[8L2ͯ }1p$7Uv_5¡HN01ĒQcMrOT_:3!&+XYy0>*_O-zYl&WSI(;=Oν&Q//匪xHa,{5A}3-ހt!+r"kfwi%gܮweC݇/SkYd|x̷7\g"(kgW_}w簾U;(PHYb!фT5 /_Nhh0A3glhAk]<9@Zd:Ur?Csō05"c4Z C]?Tw^H(gI[pCM!(1,Si6nk@(}Q%51(y%\=J8CZ m ̕k=j\(dO9?I? {·H+|mg!_|cko]r~BvzxX _Qhru7"0a endstream endobj 15 0 obj << /Type /Font /Subtype /Type1 /Encoding 1001 0 R /FirstChar 11 /LastChar 122 /Widths 1002 0 R /BaseFont /FYKCIX+CMBX12 /FontDescriptor 13 0 R >> endobj 13 0 obj << /Ascent 694 /CapHeight 686 /Descent -194 /FontName /FYKCIX+CMBX12 /ItalicAngle 0 /StemV 109 /XHeight 444 /FontBBox [-53 -251 1139 750] /Flags 4 /CharSet (/ff/fi/quotedblright/numbersign/parenleft/parenright/plus/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/A/B/C/D/E/F/G/H/I/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Z/a/b/c/d/e/f/g/h/i/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z) /FontFile 14 0 R >> endobj 1002 0 obj [656 625 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 581 938 0 0 0 0 438 438 0 875 0 375 313 563 563 563 563 563 563 563 563 563 563 563 313 0 0 0 0 0 0 850 800 813 862 738 707 884 880 419 0 881 676 1067 880 845 769 845 839 625 782 865 850 1162 850 0 688 0 0 0 0 0 0 547 625 500 625 513 344 563 625 313 0 594 313 938 625 563 625 594 459 444 438 625 594 813 594 594 500 ] endobj 1001 0 obj << /Type /Encoding /Differences [ 0 /.notdef 11/ff/fi 13/.notdef 34/quotedblright/numbersign 36/.notdef 40/parenleft/parenright 42/.notdef 43/plus 44/.notdef 45/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon 59/.notdef 65/A/B/C/D/E/F/G/H/I 74/.notdef 75/K/L/M/N/O/P/Q/R/S/T/U/V/W/X 89/.notdef 90/Z 91/.notdef 97/a/b/c/d/e/f/g/h/i 106/.notdef 107/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z 123/.notdef] >> endobj 11 0 obj << /Length1 889 /Length2 2573 /Length3 532 /Length 3189 /Filter /FlateDecode >> stream xy< CH8Ʊ/c,#a${fa0vS$kYHY-ɑ-ٲfw<9=_.1a3K9m D9"2d=&/BNSR=3I]F{קU퐩xRq%a#=#G$ td^&USyٳv`mwy7qz-d]2H\aYR{m,_6%v̛ iۇ[']KSELBFzG${'x:;MhE,aK;(WTgLG|_<jZ^Q"A>wY&mw8z"_bssɁX}11>p^7ݓj<h%2ş s: =%&ƶ[s0fMH}y1 -dZ[Tɢ*9Pێ[\tcOl0rdT:Yx)ۮ0[#bkCUҧr,"M{=Z뱮o.\Ki{L'PPJ / h]繱?-;lF{xkkb5a]tV '{9F&1RD#ː쟈]Yn(Bχ]"a-QxGC#y?&ܽe.g0e$QQ1}PwےӶvHR=GWTXu_fЌ h&2kVUɦF?Ͽ}Cqf,e۩&0߶4. ,/R'@D>Ւػ gzm婢%ucP]Eqb"QQe/=/x{!ΣY-H!Ӕv[,T ջzן=KG%SL(!8_S'!00ijt>0Cِn8$A8{ߒ9sЀ]f3ӭ/Pu^}8gdoxDS}*|ɘ/F^bۜ%x6{>UzBI0.TTa͢{AcK+_FyMLsUg}͂lxG\-SVu Ǟ>XV ^fd/9詘RijI#EC1A[Yoeb:? bkLև' o5҂NzáES/濉,P#s˒~fⷶ8X7Zpqm-Ϣhim3GaE7.ݡQ.d)|x>$AztUȴ,. -^xk2jtQw5Yq8_T1K>>;99d5:Otk6ЃpN 235VI>sXjh eNhZBZF ?^[=TR)wfZQk_5~ݍ`͘nsi8Ngc륫kҹ$EJ |C+fG1"vhPbVT\3<{_wiS{)Íf~i%jk [ÿFL)?6^hQ|Zw,ܴ`X {d*p`uN5+wM[)sN- חPW@OG|-3tqUc6{d(Θ ݆v?Gzd|q/r5Køg'﹜ЏN֯!wh/اUY*LC(kuLD ]k Jwgws6Tw62ߧ 9U_X[x䨋r:5/ Bm޶biǜ/$ =g# Iիi,`5jr(tcVO#6͹m"2Y>p #֧ #ͫcKA+ߑteNASNOkUS5pQIqGڕ ZNwWFU(WgOazL+pC6,bk".< j4qEV. ^g$79Ohɨ{kݶΜB,xpٙ6H]L4EM y4ŮoW8r6ű(Yo. ֖ ,K)ඍ/-1+{˫7 Lw$Gu'T "\X%#Ż̃7X#8^HT>?!ƃ(2D@ = endstream endobj 12 0 obj << /Type /Font /Subtype /Type1 /Encoding 1003 0 R /FirstChar 46 /LastChar 119 /Widths 1004 0 R /BaseFont /SNJEYN+CMTT12 /FontDescriptor 10 0 R >> endobj 10 0 obj << /Ascent 611 /CapHeight 611 /Descent -222 /FontName /SNJEYN+CMTT12 /ItalicAngle 0 /StemV 65 /XHeight 431 /FontBBox [-1 -234 524 695] /Flags 4 /CharSet (/period/a/c/e/g/i/m/n/o/v/w) /FontFile 11 0 R >> endobj 1004 0 obj [515 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 515 0 515 0 515 0 515 0 515 0 0 0 515 515 515 0 0 0 0 0 0 515 515 ] endobj 1003 0 obj << /Type /Encoding /Differences [ 0 /.notdef 46/period 47/.notdef 97/a 98/.notdef 99/c 100/.notdef 101/e 102/.notdef 103/g 104/.notdef 105/i 106/.notdef 109/m/n/o 112/.notdef 118/v/w 120/.notdef] >> endobj 8 0 obj << /Length1 1148 /Length2 4963 /Length3 532 /Length 5706 /Filter /FlateDecode >> stream xW\S[)tPK(DAz]iC ]*"^DPAAHHӉU朗_ko{u jpB Qhd@BBxjB=%%' \RST87_<YPsE0(`pF5`P C#<|j A@p)j 8!Ph,OC:X$wO 'MD&Dp #҆8^ S` ?6鿥h\<=xc]jۛtwVA԰( ;&h}p @B1_qoľeAZR[ }@X3__?bLI@2Bϗh,q P<KM "eh,@ KKaq%bOHua8WWEPH㰈_ =2Dv# KDHX:R)M~qP-{~%ҿϥD9iټP&O)Rԗ_簍ns\B)#o4A`!t(LORJ+_Z=?<+7ȫ7 c oSP y > ə}*-G2;n٧Y6dFlkx@WWK>٠O [\1s돦WFulfO;w Eq0*sȻAN WTQLܴں ̨śh٦ȢKUQN%KUk{;J.C~GޅY!}D|}*|-dc^ԓKnKN"yԶO:Rf ж#iк%jQzmT#Y[=yJq h70mGw%)n$RNqOb s2檖\W쀅XO_yŃ֠#Q<ЏmRCdk8ͅ~%/S3 S}䇪}GC9+FJI%LHy G%v7tùuM_!PG Uӄ<ȝPahgDxC?[$G7{A"XF:au">MQcSeTRm\acTBpסmrٕg#V*. %uQj):1`!%LS8ø4A!! /~r,P!vlq?[ʌg61oĥm22`_86qN\_7%.^YU~Fzw:}|5Z]|aKHyt^ +ɼv&ƈ@q7+:+_Ub[{}81vMn%ĉ1asaf3XgӯM ǸćX UEwTB}[ͩ\0!Y~aH|eR 7Z<0/jzrͽ[QJ%PoyeYF 4gZgK >Rs3 `ƅ (% -n9+)mF+td7-&Xu49nX WY.>ŭP(ͅd;YCvNJ>rfC>W*d;c3A7߰ײXS2DQWpox?9DSSfL֦K=ټo&iK J5OQ,n-Co'=( cФ 8ӢA{ؼ/g/Evkg#щ ;- g6Lg-_<$%_.Ug p:$ ֠E٤EƼJ6Sۂ&iדV8*UaPy]kʕw:ijӠm=\YBzUEv#W_D.Ce(E;W A/M>*<.XcY8P/%`]>kL m& 0Pg*7t' K>d|@ݑcy.IFwB[Z3692^e Hx\lC,?X[`@. l2򢲗h6̦&L1ϵ-G?TbDȵ7t*ȵl,tz6T6r.OY^*hiWBeT4 "ֶ@v9"P h%@M/3YU b5<$zq/) 3ЕӾS}@^m*ꃞc=Mu&&de[v;y3{x1p\MjT7R3لC@Z.\fC˜ 6ٜD4 >nǙ8}Ҽ+{:Yg]a:51/|{4e]Y.F/-!_@t,)b^~wt>/oG4Fl$w9]7:qr"~᝿4|HZUFw /#m D}Qn-?'{w-=Atԛ7uBwT&҂ʜT@%|:q/3smƒrxT"ҹNm.g1?Ybp!v>$zFw5t[lPgbj& [.*#mIHAg f (xq50`R@t@ߤ:`]]Q#B;q닠Տ}'>2*ӍZ>6tP{GF\m(Ef`D2+fLg.<ρt1-liԎ!;F/2R@*KVHoȂ~MU=sl*Ywhc ŅwLjHlmEyLfGMںeat&$4/9MYl)esw1MQ[߁@3V/l 8zu.p/,uuy˥_ĘS\Y*DLE AiKM 6(t=?br^oR\bT3xJ9mkV>xf !+YZh}5~vvXl4粦W)ؓ%{(6,ͻ{V*쥌2~}x:$I*!hjKwAkZ~[oăMq)-16A LGI<떰}}$m];65ޅ?M?ZԘ~ ( O4:ʈ1s[@)lr-K.p²Evqt@smӚ8Zc.ۦܳOEI9&[y-XeVϮ3Jށ ?^ q-D %$Ӿx"ZKGg|Т}[W\@ِ Kq'47.QF(:!LmF]Zƍtk__fPɃ_v8*߱h&i}>H{fj.e7n!d;N)SZwwdˏj}^﵍ _b+NC9Ȗ`J"rGf9t%,X ҫCob{W wX0,YYcz2?g,krW@Z6GqUyߞ{ӴѐJ .̽+nRgpup%3GTx2N^&D>y5/N׫CvtKX:4uɰ9 n85+Q77v!f{^~sG@2r\I1w?|_ =pP-BSw endstream endobj 9 0 obj << /Type /Font /Subtype /Type1 /Encoding 1005 0 R /FirstChar 44 /LastChar 121 /Widths 1006 0 R /BaseFont /JWGJST+CMR12 /FontDescriptor 7 0 R >> endobj 7 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /JWGJST+CMR12 /ItalicAngle 0 /StemV 65 /XHeight 431 /FontBBox [-34 -251 988 750] /Flags 4 /CharSet (/comma/zero/one/two/three/six/E/G/I/J/R/bracketleft/bracketright/a/b/c/e/g/i/l/n/o/r/t/u/v/y) /FontFile 8 0 R >> endobj 1006 0 obj [272 0 0 0 490 490 490 490 0 0 490 0 0 0 0 0 0 0 0 0 0 0 0 0 0 666 0 768 0 353 503 0 0 0 0 0 0 0 721 0 0 0 0 0 0 0 0 272 0 272 0 0 0 490 544 435 0 435 0 490 0 272 0 0 272 0 544 490 0 0 381 0 381 544 517 0 0 517 ] endobj 1005 0 obj << /Type /Encoding /Differences [ 0 /.notdef 44/comma 45/.notdef 48/zero/one/two/three 52/.notdef 54/six 55/.notdef 69/E 70/.notdef 71/G 72/.notdef 73/I/J 75/.notdef 82/R 83/.notdef 91/bracketleft 92/.notdef 93/bracketright 94/.notdef 97/a/b/c 100/.notdef 101/e 102/.notdef 103/g 104/.notdef 105/i 106/.notdef 108/l 109/.notdef 110/n/o 112/.notdef 114/r 115/.notdef 116/t/u/v 119/.notdef 121/y 122/.notdef] >> endobj 5 0 obj << /Length1 963 /Length2 3463 /Length3 532 /Length 4120 /Filter /FlateDecode >> stream xyh4P'"v@ pxgWM(&(< 1ԿuXcOMoixOo"QhߥV?Qog H,I E?C/]e!:HWCo,@̭/I9_9S$G[g/fJw?* (/uGap ! ?r3($ ~iHYPz8 S Q?BPBfJɟ+ @&8rߤ@L&Eo 濉roA) E,uRb~#L?@6/@JV[IN):'o#(1F@cx'p;szӋSkT5 a 0!>z0̲@K>Ezh֥G荸 > 7kN[K7 [aZ6(Hpu%TOT6> pktȈW"QrlI t=an9\?f8YF?D0L).9;U8|K ;Y&FYl#6mK%#}|a'Wu[dMI3xFKI*`O5Uƨ ؔp"OKgO(s7ʄmv?5]rImvtSyaL76fb%jC1 In6i;&`[Kw‡D1_>現XD/a :.E-/. .(Z֎YsSL7疼6^8%6PnLo6`hx0҃!NL_lA :71M*H^'\"=!i"Y%OB ]6$t'upNH75E%sX𳏝,c~ī_ݝ!dar UZj՞ΏutNL,([+Y(yMǀb>W)mWy4w|Rj&gA;01T_ }R& {۝s6yBp^zAFpU|Lih8ΫGK.l V~['lS4YW]MD)?ٵsfjS p8ʗNjsΤ~J1Lv 4#}iޖq}䜛^DL 9:'q5Wͬ3@<nDst\FK{ٻ',{McD?-6Cxr.IPgY5% a )E3C3 ÅPMZ/|9Q)$-??'k[B+4\"t>ɻ̵>|7EqUVqdø#2_/V~ލAVidֿx#YfǼ~N=-6m@G;zQRC=07r˗_I5ԸUTSGԫ,j*5]xUQI&q$rP-7<\AUc {iN!`=^G.pbAHWpP]Etj=UW[O[sn՗.SG=wSw2G?7XDUȿIP'x A'ۥ;l 7 :Va=˦n/ij(O@x޲)'+6s{8ύe)۷P;kڃlZ3Xh`NVrF-PHg)N$&+MOah[g -ؚT_O!WBCϕ % 8{v-xIDs.E[# ͱ#OnK8QG\1Ѣ^*KIZ{UDں7J||йƒ-}bK6y54#:pW̷obzֽtn/=ePQ`{s,] >f4BxOyT:b`:QxhبI9;1I4F}SD);!id6B>?Ab|g9BetP׻gjP,Cuz͜J -Q\k#ØKȦVbבzG{Q -;ʗ~脑odڌ9w&QJ1 G;=mVC@ˉ˜֤ZNB<^dn7^k9ט\0+Wck34C(\ ZJEw~O]l-^wUOr S^dɓ~=E^yi*crI.Z =Yc۟#4[rƧM4϶sIYO(!1 1*US6 EK9s_ϲ0 9:& 쎝2h\V{K!_>V{~JPxfăvC ~%vzQO#ùg;C`b=9뢳\aG^C- ,+Qk> endobj 4 0 obj << /Ascent 694 /CapHeight 683 /Descent -195 /FontName /GMSXEQ+CMR17 /ItalicAngle 0 /StemV 53 /XHeight 431 /FontBBox [-33 -250 945 749] /Flags 4 /CharSet (/period/two/eight/A/G/O/P/S/U/d/e/g/i/r/s/u) /FontFile 5 0 R >> endobj 1008 0 obj [250 0 0 0 459 0 0 0 0 0 459 0 0 0 0 0 0 0 0 693 0 0 0 0 0 726 0 0 0 0 0 0 0 720 628 0 0 511 0 693 0 0 0 0 0 0 0 0 0 0 0 0 0 0 511 406 0 459 0 250 0 0 0 0 0 0 0 0 354 359 0 511 ] endobj 1007 0 obj << /Type /Encoding /Differences [ 0 /.notdef 46/period 47/.notdef 50/two 51/.notdef 56/eight 57/.notdef 65/A 66/.notdef 71/G 72/.notdef 79/O/P 81/.notdef 83/S 84/.notdef 85/U 86/.notdef 100/d/e 102/.notdef 103/g 104/.notdef 105/i 106/.notdef 114/r/s 116/.notdef 117/u 118/.notdef] >> endobj 22 0 obj << /Type /Pages /Count 6 /Parent 1009 0 R /Kids [2 0 R 24 0 R 27 0 R 30 0 R 33 0 R 36 0 R] >> endobj 44 0 obj << /Type /Pages /Count 6 /Parent 1009 0 R /Kids [39 0 R 46 0 R 58 0 R 61 0 R 70 0 R 73 0 R] >> endobj 78 0 obj << /Type /Pages /Count 6 /Parent 1009 0 R /Kids [76 0 R 80 0 R 83 0 R 86 0 R 89 0 R 92 0 R] >> endobj 97 0 obj << /Type /Pages /Count 6 /Parent 1009 0 R /Kids [95 0 R 99 0 R 102 0 R 105 0 R 108 0 R 111 0 R] >> endobj 116 0 obj << /Type /Pages /Count 6 /Parent 1009 0 R /Kids [114 0 R 118 0 R 121 0 R 124 0 R 127 0 R 130 0 R] >> endobj 135 0 obj << /Type /Pages /Count 6 /Parent 1009 0 R /Kids [133 0 R 137 0 R 140 0 R 143 0 R 146 0 R 149 0 R] >> endobj 154 0 obj << /Type /Pages /Count 6 /Parent 1010 0 R /Kids [152 0 R 156 0 R 159 0 R 162 0 R 165 0 R 168 0 R] >> endobj 173 0 obj << /Type /Pages /Count 6 /Parent 1010 0 R /Kids [171 0 R 175 0 R 178 0 R 181 0 R 184 0 R 187 0 R] >> endobj 192 0 obj << /Type /Pages /Count 6 /Parent 1010 0 R /Kids [190 0 R 194 0 R 197 0 R 200 0 R 203 0 R 206 0 R] >> endobj 211 0 obj << /Type /Pages /Count 6 /Parent 1010 0 R /Kids [209 0 R 213 0 R 216 0 R 219 0 R 222 0 R 225 0 R] >> endobj 230 0 obj << /Type /Pages /Count 6 /Parent 1010 0 R /Kids [228 0 R 232 0 R 235 0 R 238 0 R 241 0 R 244 0 R] >> endobj 249 0 obj << /Type /Pages /Count 6 /Parent 1010 0 R /Kids [247 0 R 251 0 R 254 0 R 257 0 R 260 0 R 263 0 R] >> endobj 268 0 obj << /Type /Pages /Count 6 /Parent 1011 0 R /Kids [266 0 R 270 0 R 273 0 R 276 0 R 279 0 R 282 0 R] >> endobj 287 0 obj << /Type /Pages /Count 6 /Parent 1011 0 R /Kids [285 0 R 289 0 R 292 0 R 295 0 R 298 0 R 301 0 R] >> endobj 306 0 obj << /Type /Pages /Count 6 /Parent 1011 0 R /Kids [304 0 R 308 0 R 311 0 R 314 0 R 317 0 R 320 0 R] >> endobj 325 0 obj << /Type /Pages /Count 6 /Parent 1011 0 R /Kids [323 0 R 327 0 R 330 0 R 336 0 R 339 0 R 342 0 R] >> endobj 347 0 obj << /Type /Pages /Count 6 /Parent 1011 0 R /Kids [345 0 R 349 0 R 352 0 R 355 0 R 358 0 R 361 0 R] >> endobj 366 0 obj << /Type /Pages /Count 6 /Parent 1011 0 R /Kids [364 0 R 368 0 R 371 0 R 374 0 R 377 0 R 380 0 R] >> endobj 388 0 obj << /Type /Pages /Count 6 /Parent 1012 0 R /Kids [386 0 R 390 0 R 393 0 R 396 0 R 399 0 R 402 0 R] >> endobj 407 0 obj << /Type /Pages /Count 6 /Parent 1012 0 R /Kids [405 0 R 409 0 R 412 0 R 415 0 R 418 0 R 421 0 R] >> endobj 426 0 obj << /Type /Pages /Count 6 /Parent 1012 0 R /Kids [424 0 R 428 0 R 431 0 R 434 0 R 437 0 R 440 0 R] >> endobj 445 0 obj << /Type /Pages /Count 6 /Parent 1012 0 R /Kids [443 0 R 447 0 R 450 0 R 453 0 R 456 0 R 459 0 R] >> endobj 464 0 obj << /Type /Pages /Count 6 /Parent 1012 0 R /Kids [462 0 R 466 0 R 469 0 R 472 0 R 475 0 R 478 0 R] >> endobj 483 0 obj << /Type /Pages /Count 6 /Parent 1012 0 R /Kids [481 0 R 485 0 R 488 0 R 491 0 R 494 0 R 497 0 R] >> endobj 502 0 obj << /Type /Pages /Count 6 /Parent 1013 0 R /Kids [500 0 R 504 0 R 507 0 R 510 0 R 513 0 R 516 0 R] >> endobj 521 0 obj << /Type /Pages /Count 6 /Parent 1013 0 R /Kids [519 0 R 523 0 R 526 0 R 529 0 R 532 0 R 535 0 R] >> endobj 540 0 obj << /Type /Pages /Count 6 /Parent 1013 0 R /Kids [538 0 R 542 0 R 545 0 R 548 0 R 551 0 R 554 0 R] >> endobj 559 0 obj << /Type /Pages /Count 6 /Parent 1013 0 R /Kids [557 0 R 561 0 R 564 0 R 567 0 R 570 0 R 573 0 R] >> endobj 578 0 obj << /Type /Pages /Count 6 /Parent 1013 0 R /Kids [576 0 R 580 0 R 583 0 R 586 0 R 589 0 R 592 0 R] >> endobj 597 0 obj << /Type /Pages /Count 6 /Parent 1013 0 R /Kids [595 0 R 599 0 R 602 0 R 605 0 R 608 0 R 611 0 R] >> endobj 616 0 obj << /Type /Pages /Count 6 /Parent 1014 0 R /Kids [614 0 R 618 0 R 621 0 R 624 0 R 627 0 R 630 0 R] >> endobj 635 0 obj << /Type /Pages /Count 6 /Parent 1014 0 R /Kids [633 0 R 637 0 R 640 0 R 643 0 R 646 0 R 649 0 R] >> endobj 654 0 obj << /Type /Pages /Count 6 /Parent 1014 0 R /Kids [652 0 R 656 0 R 659 0 R 662 0 R 665 0 R 668 0 R] >> endobj 673 0 obj << /Type /Pages /Count 6 /Parent 1014 0 R /Kids [671 0 R 675 0 R 678 0 R 681 0 R 684 0 R 687 0 R] >> endobj 692 0 obj << /Type /Pages /Count 6 /Parent 1014 0 R /Kids [690 0 R 694 0 R 697 0 R 700 0 R 703 0 R 706 0 R] >> endobj 711 0 obj << /Type /Pages /Count 6 /Parent 1014 0 R /Kids [709 0 R 713 0 R 716 0 R 719 0 R 722 0 R 728 0 R] >> endobj 733 0 obj << /Type /Pages /Count 6 /Parent 1015 0 R /Kids [731 0 R 735 0 R 738 0 R 741 0 R 744 0 R 747 0 R] >> endobj 752 0 obj << /Type /Pages /Count 6 /Parent 1015 0 R /Kids [750 0 R 754 0 R 757 0 R 760 0 R 763 0 R 766 0 R] >> endobj 771 0 obj << /Type /Pages /Count 6 /Parent 1015 0 R /Kids [769 0 R 773 0 R 776 0 R 779 0 R 782 0 R 785 0 R] >> endobj 790 0 obj << /Type /Pages /Count 6 /Parent 1015 0 R /Kids [788 0 R 792 0 R 795 0 R 798 0 R 801 0 R 804 0 R] >> endobj 809 0 obj << /Type /Pages /Count 6 /Parent 1015 0 R /Kids [807 0 R 811 0 R 814 0 R 817 0 R 820 0 R 823 0 R] >> endobj 828 0 obj << /Type /Pages /Count 6 /Parent 1015 0 R /Kids [826 0 R 830 0 R 833 0 R 836 0 R 839 0 R 842 0 R] >> endobj 850 0 obj << /Type /Pages /Count 6 /Parent 1016 0 R /Kids [845 0 R 852 0 R 855 0 R 858 0 R 861 0 R 864 0 R] >> endobj 869 0 obj << /Type /Pages /Count 6 /Parent 1016 0 R /Kids [867 0 R 871 0 R 874 0 R 877 0 R 880 0 R 883 0 R] >> endobj 888 0 obj << /Type /Pages /Count 6 /Parent 1016 0 R /Kids [886 0 R 890 0 R 893 0 R 896 0 R 899 0 R 902 0 R] >> endobj 907 0 obj << /Type /Pages /Count 6 /Parent 1016 0 R /Kids [905 0 R 909 0 R 912 0 R 915 0 R 918 0 R 921 0 R] >> endobj 926 0 obj << /Type /Pages /Count 6 /Parent 1016 0 R /Kids [924 0 R 928 0 R 931 0 R 934 0 R 937 0 R 940 0 R] >> endobj 945 0 obj << /Type /Pages /Count 6 /Parent 1016 0 R /Kids [943 0 R 947 0 R 950 0 R 953 0 R 956 0 R 959 0 R] >> endobj 964 0 obj << /Type /Pages /Count 5 /Parent 1017 0 R /Kids [962 0 R 966 0 R 969 0 R 972 0 R 975 0 R] >> endobj 1009 0 obj << /Type /Pages /Count 36 /Parent 1018 0 R /Kids [22 0 R 44 0 R 78 0 R 97 0 R 116 0 R 135 0 R] >> endobj 1010 0 obj << /Type /Pages /Count 36 /Parent 1018 0 R /Kids [154 0 R 173 0 R 192 0 R 211 0 R 230 0 R 249 0 R] >> endobj 1011 0 obj << /Type /Pages /Count 36 /Parent 1018 0 R /Kids [268 0 R 287 0 R 306 0 R 325 0 R 347 0 R 366 0 R] >> endobj 1012 0 obj << /Type /Pages /Count 36 /Parent 1018 0 R /Kids [388 0 R 407 0 R 426 0 R 445 0 R 464 0 R 483 0 R] >> endobj 1013 0 obj << /Type /Pages /Count 36 /Parent 1018 0 R /Kids [502 0 R 521 0 R 540 0 R 559 0 R 578 0 R 597 0 R] >> endobj 1014 0 obj << /Type /Pages /Count 36 /Parent 1018 0 R /Kids [616 0 R 635 0 R 654 0 R 673 0 R 692 0 R 711 0 R] >> endobj 1015 0 obj << /Type /Pages /Count 36 /Parent 1019 0 R /Kids [733 0 R 752 0 R 771 0 R 790 0 R 809 0 R 828 0 R] >> endobj 1016 0 obj << /Type /Pages /Count 36 /Parent 1019 0 R /Kids [850 0 R 869 0 R 888 0 R 907 0 R 926 0 R 945 0 R] >> endobj 1017 0 obj << /Type /Pages /Count 5 /Parent 1019 0 R /Kids [964 0 R] >> endobj 1018 0 obj << /Type /Pages /Count 216 /Parent 1020 0 R /Kids [1009 0 R 1010 0 R 1011 0 R 1012 0 R 1013 0 R 1014 0 R] >> endobj 1019 0 obj << /Type /Pages /Count 77 /Parent 1020 0 R /Kids [1015 0 R 1016 0 R 1017 0 R] >> endobj 1020 0 obj << /Type /Pages /Count 293 /Kids [1018 0 R 1019 0 R] >> endobj 1021 0 obj << /Type /Catalog /Pages 1020 0 R >> endobj 1022 0 obj << /Producer (pdfeTeX-1.30.4) /Creator (TeX) /CreationDate (D:20160131083218-05'00') /PTEX.Fullbanner (This is pdfeTeX, Version 3.141592-1.30.4-2.2 (Web2C 7.5.5) kpathsea version 3.5.5) >> endobj xref 0 1023 0000000000 65535 f 0000001301 00000 n 0000001196 00000 n 0000000015 00000 n 0001007234 00000 n 0001002836 00000 n 0001007075 00000 n 0001001895 00000 n 0000995910 00000 n 0001001736 00000 n 0000995283 00000 n 0000991812 00000 n 0000995121 00000 n 0000990558 00000 n 0000977637 00000 n 0000990396 00000 n 0000976299 00000 n 0000961026 00000 n 0000976138 00000 n 0000959518 00000 n 0000941018 00000 n 0000959359 00000 n 0001007966 00000 n 0000003187 00000 n 0000003079 00000 n 0000001427 00000 n 0000005332 00000 n 0000005224 00000 n 0000003268 00000 n 0000007125 00000 n 0000007017 00000 n 0000005413 00000 n 0000008805 00000 n 0000008697 00000 n 0000007206 00000 n 0000010834 00000 n 0000010726 00000 n 0000008886 00000 n 0000011982 00000 n 0000011874 00000 n 0000010915 00000 n 0000939897 00000 n 0000928911 00000 n 0000939737 00000 n 0001008076 00000 n 0000015245 00000 n 0000015137 00000 n 0000012063 00000 n 0000928125 00000 n 0000925616 00000 n 0000927966 00000 n 0000924109 00000 n 0000907565 00000 n 0000923949 00000 n 0000905926 00000 n 0000893033 00000 n 0000905766 00000 n 0000018615 00000 n 0000018507 00000 n 0000015362 00000 n 0000021849 00000 n 0000021741 00000 n 0000018732 00000 n 0000892486 00000 n 0000889437 00000 n 0000892326 00000 n 0000888667 00000 n 0000882785 00000 n 0000888505 00000 n 0000025413 00000 n 0000025305 00000 n 0000021990 00000 n 0000028462 00000 n 0000028354 00000 n 0000025542 00000 n 0000031251 00000 n 0000031143 00000 n 0000028579 00000 n 0001008187 00000 n 0000034434 00000 n 0000034326 00000 n 0000031368 00000 n 0000036751 00000 n 0000036643 00000 n 0000034563 00000 n 0000040855 00000 n 0000040747 00000 n 0000036868 00000 n 0000043928 00000 n 0000043820 00000 n 0000040972 00000 n 0000046930 00000 n 0000046822 00000 n 0000044069 00000 n 0000049935 00000 n 0000049827 00000 n 0000047047 00000 n 0001008298 00000 n 0000053200 00000 n 0000053091 00000 n 0000050075 00000 n 0000055267 00000 n 0000055156 00000 n 0000053329 00000 n 0000057366 00000 n 0000057255 00000 n 0000055373 00000 n 0000060429 00000 n 0000060318 00000 n 0000057496 00000 n 0000063978 00000 n 0000063867 00000 n 0000060559 00000 n 0000067428 00000 n 0000067316 00000 n 0000064096 00000 n 0001008413 00000 n 0000071102 00000 n 0000070990 00000 n 0000067546 00000 n 0000074765 00000 n 0000074653 00000 n 0000071244 00000 n 0000077654 00000 n 0000077542 00000 n 0000074895 00000 n 0000079214 00000 n 0000079102 00000 n 0000077784 00000 n 0000081396 00000 n 0000081284 00000 n 0000079344 00000 n 0000084924 00000 n 0000084812 00000 n 0000081526 00000 n 0001008531 00000 n 0000087980 00000 n 0000087868 00000 n 0000085066 00000 n 0000090849 00000 n 0000090737 00000 n 0000088110 00000 n 0000093460 00000 n 0000093348 00000 n 0000090991 00000 n 0000096987 00000 n 0000096875 00000 n 0000093566 00000 n 0000099719 00000 n 0000099607 00000 n 0000097129 00000 n 0000103007 00000 n 0000102895 00000 n 0000099837 00000 n 0001008649 00000 n 0000105810 00000 n 0000105698 00000 n 0000103137 00000 n 0000108738 00000 n 0000108626 00000 n 0000105940 00000 n 0000112056 00000 n 0000111944 00000 n 0000108868 00000 n 0000113500 00000 n 0000113388 00000 n 0000112174 00000 n 0000116912 00000 n 0000116800 00000 n 0000113582 00000 n 0000119899 00000 n 0000119787 00000 n 0000117042 00000 n 0001008767 00000 n 0000123999 00000 n 0000123887 00000 n 0000120017 00000 n 0000127059 00000 n 0000126947 00000 n 0000124141 00000 n 0000130503 00000 n 0000130391 00000 n 0000127189 00000 n 0000134126 00000 n 0000134014 00000 n 0000130621 00000 n 0000138011 00000 n 0000137899 00000 n 0000134268 00000 n 0000140748 00000 n 0000140636 00000 n 0000138153 00000 n 0001008885 00000 n 0000143947 00000 n 0000143835 00000 n 0000140878 00000 n 0000146247 00000 n 0000146135 00000 n 0000144077 00000 n 0000149558 00000 n 0000149446 00000 n 0000146377 00000 n 0000151982 00000 n 0000151870 00000 n 0000149688 00000 n 0000154359 00000 n 0000154247 00000 n 0000152112 00000 n 0000157011 00000 n 0000156899 00000 n 0000154477 00000 n 0001009003 00000 n 0000159823 00000 n 0000159711 00000 n 0000157141 00000 n 0000163059 00000 n 0000162947 00000 n 0000159941 00000 n 0000166309 00000 n 0000166197 00000 n 0000163177 00000 n 0000169183 00000 n 0000169071 00000 n 0000166415 00000 n 0000171985 00000 n 0000171873 00000 n 0000169313 00000 n 0000172878 00000 n 0000172766 00000 n 0000172103 00000 n 0001009121 00000 n 0000173680 00000 n 0000173568 00000 n 0000172960 00000 n 0000176966 00000 n 0000176854 00000 n 0000173762 00000 n 0000180018 00000 n 0000179906 00000 n 0000177108 00000 n 0000183991 00000 n 0000183879 00000 n 0000180148 00000 n 0000187464 00000 n 0000187352 00000 n 0000184133 00000 n 0000189490 00000 n 0000189378 00000 n 0000187582 00000 n 0001009239 00000 n 0000192115 00000 n 0000192003 00000 n 0000189620 00000 n 0000194790 00000 n 0000194678 00000 n 0000192233 00000 n 0000198080 00000 n 0000197968 00000 n 0000194908 00000 n 0000201478 00000 n 0000201366 00000 n 0000198222 00000 n 0000206076 00000 n 0000205964 00000 n 0000201596 00000 n 0000209126 00000 n 0000209014 00000 n 0000206206 00000 n 0001009357 00000 n 0000213328 00000 n 0000213216 00000 n 0000209244 00000 n 0000216621 00000 n 0000216509 00000 n 0000213434 00000 n 0000219581 00000 n 0000219469 00000 n 0000216738 00000 n 0000222403 00000 n 0000222291 00000 n 0000219710 00000 n 0000226498 00000 n 0000226386 00000 n 0000222533 00000 n 0000228432 00000 n 0000228320 00000 n 0000226627 00000 n 0001009475 00000 n 0000230838 00000 n 0000230726 00000 n 0000228550 00000 n 0000233350 00000 n 0000233238 00000 n 0000230968 00000 n 0000235264 00000 n 0000235152 00000 n 0000233480 00000 n 0000238330 00000 n 0000238218 00000 n 0000235382 00000 n 0000240937 00000 n 0000240825 00000 n 0000238448 00000 n 0000244010 00000 n 0000243898 00000 n 0000241067 00000 n 0001009593 00000 n 0000246382 00000 n 0000246270 00000 n 0000244128 00000 n 0000249805 00000 n 0000249693 00000 n 0000246500 00000 n 0000252994 00000 n 0000252882 00000 n 0000249923 00000 n 0000256201 00000 n 0000256089 00000 n 0000253088 00000 n 0000259229 00000 n 0000259117 00000 n 0000256331 00000 n 0000262307 00000 n 0000262195 00000 n 0000259347 00000 n 0001009711 00000 n 0000265609 00000 n 0000265497 00000 n 0000262460 00000 n 0000268471 00000 n 0000268359 00000 n 0000265715 00000 n 0000882301 00000 n 0000880087 00000 n 0000882141 00000 n 0000271369 00000 n 0000271257 00000 n 0000268613 00000 n 0000274736 00000 n 0000274624 00000 n 0000271499 00000 n 0000277747 00000 n 0000277635 00000 n 0000274878 00000 n 0000281306 00000 n 0000281194 00000 n 0000277877 00000 n 0001009829 00000 n 0000284295 00000 n 0000284183 00000 n 0000281448 00000 n 0000287341 00000 n 0000287229 00000 n 0000284437 00000 n 0000291019 00000 n 0000290907 00000 n 0000287483 00000 n 0000293104 00000 n 0000292992 00000 n 0000291149 00000 n 0000297570 00000 n 0000297458 00000 n 0000293222 00000 n 0000299743 00000 n 0000299631 00000 n 0000297676 00000 n 0001009947 00000 n 0000304331 00000 n 0000304219 00000 n 0000299849 00000 n 0000308343 00000 n 0000308231 00000 n 0000304449 00000 n 0000313143 00000 n 0000313031 00000 n 0000308473 00000 n 0000316671 00000 n 0000316559 00000 n 0000313249 00000 n 0000320127 00000 n 0000320015 00000 n 0000316789 00000 n 0000879747 00000 n 0000877551 00000 n 0000879585 00000 n 0000323444 00000 n 0000323332 00000 n 0000320270 00000 n 0001010065 00000 n 0000326361 00000 n 0000326249 00000 n 0000323562 00000 n 0000329735 00000 n 0000329623 00000 n 0000326479 00000 n 0000333575 00000 n 0000333463 00000 n 0000329877 00000 n 0000337159 00000 n 0000337047 00000 n 0000333705 00000 n 0000340477 00000 n 0000340365 00000 n 0000337312 00000 n 0000343950 00000 n 0000343838 00000 n 0000340594 00000 n 0001010183 00000 n 0000345546 00000 n 0000345434 00000 n 0000344091 00000 n 0000350175 00000 n 0000350063 00000 n 0000345663 00000 n 0000353347 00000 n 0000353235 00000 n 0000350269 00000 n 0000355351 00000 n 0000355239 00000 n 0000353453 00000 n 0000359296 00000 n 0000359184 00000 n 0000355468 00000 n 0000361410 00000 n 0000361298 00000 n 0000359437 00000 n 0001010301 00000 n 0000363917 00000 n 0000363805 00000 n 0000361516 00000 n 0000367146 00000 n 0000367034 00000 n 0000364047 00000 n 0000370321 00000 n 0000370209 00000 n 0000367300 00000 n 0000372706 00000 n 0000372594 00000 n 0000370439 00000 n 0000375173 00000 n 0000375061 00000 n 0000372824 00000 n 0000378277 00000 n 0000378165 00000 n 0000375279 00000 n 0001010419 00000 n 0000381494 00000 n 0000381382 00000 n 0000378407 00000 n 0000384351 00000 n 0000384239 00000 n 0000381612 00000 n 0000386985 00000 n 0000386873 00000 n 0000384469 00000 n 0000389362 00000 n 0000389250 00000 n 0000387103 00000 n 0000392038 00000 n 0000391926 00000 n 0000389492 00000 n 0000394426 00000 n 0000394314 00000 n 0000392156 00000 n 0001010537 00000 n 0000398340 00000 n 0000398228 00000 n 0000394532 00000 n 0000403130 00000 n 0000403018 00000 n 0000398481 00000 n 0000404886 00000 n 0000404774 00000 n 0000403236 00000 n 0000405983 00000 n 0000405871 00000 n 0000405004 00000 n 0000407012 00000 n 0000406900 00000 n 0000406112 00000 n 0000410049 00000 n 0000409937 00000 n 0000407141 00000 n 0001010655 00000 n 0000412637 00000 n 0000412525 00000 n 0000410167 00000 n 0000415448 00000 n 0000415336 00000 n 0000412767 00000 n 0000417517 00000 n 0000417405 00000 n 0000415578 00000 n 0000420663 00000 n 0000420551 00000 n 0000417659 00000 n 0000424458 00000 n 0000424346 00000 n 0000420793 00000 n 0000427489 00000 n 0000427377 00000 n 0000424588 00000 n 0001010773 00000 n 0000430294 00000 n 0000430182 00000 n 0000427643 00000 n 0000433396 00000 n 0000433284 00000 n 0000430435 00000 n 0000435554 00000 n 0000435442 00000 n 0000433525 00000 n 0000438744 00000 n 0000438632 00000 n 0000435684 00000 n 0000441919 00000 n 0000441807 00000 n 0000438873 00000 n 0000444505 00000 n 0000444393 00000 n 0000442049 00000 n 0001010891 00000 n 0000446188 00000 n 0000446076 00000 n 0000444623 00000 n 0000448163 00000 n 0000448051 00000 n 0000446318 00000 n 0000451713 00000 n 0000451601 00000 n 0000448281 00000 n 0000454458 00000 n 0000454346 00000 n 0000451843 00000 n 0000457738 00000 n 0000457626 00000 n 0000454576 00000 n 0000460748 00000 n 0000460636 00000 n 0000457880 00000 n 0001011009 00000 n 0000464554 00000 n 0000464442 00000 n 0000460878 00000 n 0000466752 00000 n 0000466640 00000 n 0000464696 00000 n 0000470394 00000 n 0000470282 00000 n 0000466882 00000 n 0000474081 00000 n 0000473969 00000 n 0000470548 00000 n 0000477090 00000 n 0000476978 00000 n 0000474211 00000 n 0000480152 00000 n 0000480040 00000 n 0000477220 00000 n 0001011127 00000 n 0000481993 00000 n 0000481881 00000 n 0000480281 00000 n 0000484430 00000 n 0000484318 00000 n 0000482111 00000 n 0000486659 00000 n 0000486547 00000 n 0000484548 00000 n 0000489322 00000 n 0000489210 00000 n 0000486789 00000 n 0000492198 00000 n 0000492086 00000 n 0000489452 00000 n 0000495129 00000 n 0000495017 00000 n 0000492328 00000 n 0001011245 00000 n 0000497833 00000 n 0000497721 00000 n 0000495247 00000 n 0000500393 00000 n 0000500281 00000 n 0000497975 00000 n 0000502232 00000 n 0000502120 00000 n 0000500511 00000 n 0000504736 00000 n 0000504624 00000 n 0000502338 00000 n 0000507648 00000 n 0000507536 00000 n 0000504878 00000 n 0000510183 00000 n 0000510071 00000 n 0000507790 00000 n 0001011363 00000 n 0000512541 00000 n 0000512429 00000 n 0000510313 00000 n 0000515187 00000 n 0000515075 00000 n 0000512659 00000 n 0000517710 00000 n 0000517598 00000 n 0000515317 00000 n 0000519708 00000 n 0000519596 00000 n 0000517828 00000 n 0000522202 00000 n 0000522090 00000 n 0000519826 00000 n 0000524938 00000 n 0000524826 00000 n 0000522332 00000 n 0001011481 00000 n 0000529203 00000 n 0000529091 00000 n 0000525068 00000 n 0000533036 00000 n 0000532924 00000 n 0000529321 00000 n 0000535847 00000 n 0000535735 00000 n 0000533154 00000 n 0000538844 00000 n 0000538732 00000 n 0000535989 00000 n 0000540537 00000 n 0000540425 00000 n 0000538962 00000 n 0000545687 00000 n 0000545575 00000 n 0000540643 00000 n 0001011599 00000 n 0000549012 00000 n 0000548900 00000 n 0000545805 00000 n 0000551951 00000 n 0000551839 00000 n 0000549142 00000 n 0000555887 00000 n 0000555775 00000 n 0000552081 00000 n 0000559089 00000 n 0000558977 00000 n 0000556017 00000 n 0000562027 00000 n 0000561915 00000 n 0000559219 00000 n 0000565142 00000 n 0000565030 00000 n 0000562145 00000 n 0001011717 00000 n 0000565814 00000 n 0000565702 00000 n 0000565272 00000 n 0000570984 00000 n 0000570872 00000 n 0000565896 00000 n 0000573870 00000 n 0000573758 00000 n 0000571102 00000 n 0000577023 00000 n 0000576911 00000 n 0000573988 00000 n 0000580737 00000 n 0000580625 00000 n 0000577153 00000 n 0000584009 00000 n 0000583897 00000 n 0000580843 00000 n 0001011835 00000 n 0000587628 00000 n 0000587516 00000 n 0000584115 00000 n 0000590942 00000 n 0000590830 00000 n 0000587758 00000 n 0000592512 00000 n 0000592400 00000 n 0000591072 00000 n 0000598570 00000 n 0000598458 00000 n 0000592630 00000 n 0000601822 00000 n 0000601710 00000 n 0000598688 00000 n 0000604583 00000 n 0000604471 00000 n 0000601940 00000 n 0001011953 00000 n 0000607495 00000 n 0000607383 00000 n 0000604701 00000 n 0000611022 00000 n 0000610910 00000 n 0000607613 00000 n 0000613444 00000 n 0000613332 00000 n 0000611164 00000 n 0000617065 00000 n 0000616953 00000 n 0000613562 00000 n 0000619902 00000 n 0000619790 00000 n 0000617195 00000 n 0000622024 00000 n 0000621912 00000 n 0000620043 00000 n 0001012071 00000 n 0000624945 00000 n 0000624833 00000 n 0000622166 00000 n 0000627370 00000 n 0000627258 00000 n 0000625075 00000 n 0000629478 00000 n 0000629366 00000 n 0000627500 00000 n 0000632480 00000 n 0000632368 00000 n 0000629596 00000 n 0000877211 00000 n 0000875132 00000 n 0000877052 00000 n 0000635292 00000 n 0000635180 00000 n 0000632623 00000 n 0000638728 00000 n 0000638616 00000 n 0000635422 00000 n 0001012189 00000 n 0000642943 00000 n 0000642831 00000 n 0000638846 00000 n 0000646048 00000 n 0000645936 00000 n 0000643061 00000 n 0000649142 00000 n 0000649030 00000 n 0000646178 00000 n 0000652397 00000 n 0000652285 00000 n 0000649272 00000 n 0000655967 00000 n 0000655855 00000 n 0000652515 00000 n 0000659558 00000 n 0000659446 00000 n 0000656097 00000 n 0001012307 00000 n 0000661472 00000 n 0000661360 00000 n 0000659676 00000 n 0000663925 00000 n 0000663813 00000 n 0000661566 00000 n 0000665953 00000 n 0000665841 00000 n 0000664031 00000 n 0000668579 00000 n 0000668467 00000 n 0000666095 00000 n 0000670460 00000 n 0000670348 00000 n 0000668721 00000 n 0000672825 00000 n 0000672713 00000 n 0000670566 00000 n 0001012425 00000 n 0000675151 00000 n 0000675039 00000 n 0000672955 00000 n 0000678919 00000 n 0000678807 00000 n 0000675281 00000 n 0000681617 00000 n 0000681505 00000 n 0000679061 00000 n 0000684961 00000 n 0000684849 00000 n 0000681735 00000 n 0000688208 00000 n 0000688096 00000 n 0000685079 00000 n 0000691126 00000 n 0000691014 00000 n 0000688326 00000 n 0001012543 00000 n 0000692939 00000 n 0000692827 00000 n 0000691256 00000 n 0000698243 00000 n 0000698131 00000 n 0000693069 00000 n 0000703814 00000 n 0000703702 00000 n 0000698349 00000 n 0000706299 00000 n 0000706187 00000 n 0000703944 00000 n 0000708189 00000 n 0000708077 00000 n 0000706417 00000 n 0000710939 00000 n 0000710827 00000 n 0000708307 00000 n 0001012661 00000 n 0000713897 00000 n 0000713785 00000 n 0000711069 00000 n 0000716504 00000 n 0000716392 00000 n 0000714027 00000 n 0000719159 00000 n 0000719047 00000 n 0000716622 00000 n 0000721697 00000 n 0000721585 00000 n 0000719289 00000 n 0000725096 00000 n 0000724984 00000 n 0000721827 00000 n 0000728483 00000 n 0000728371 00000 n 0000725226 00000 n 0001012779 00000 n 0000732400 00000 n 0000732288 00000 n 0000728613 00000 n 0000734906 00000 n 0000734794 00000 n 0000732518 00000 n 0000737595 00000 n 0000737483 00000 n 0000735036 00000 n 0000740391 00000 n 0000740279 00000 n 0000737725 00000 n 0000742866 00000 n 0000742754 00000 n 0000740509 00000 n 0000746032 00000 n 0000745920 00000 n 0000743009 00000 n 0000874827 00000 n 0000873436 00000 n 0000874669 00000 n 0001012897 00000 n 0000750478 00000 n 0000750366 00000 n 0000746176 00000 n 0000753514 00000 n 0000753402 00000 n 0000750608 00000 n 0000757249 00000 n 0000757137 00000 n 0000753644 00000 n 0000760444 00000 n 0000760332 00000 n 0000757379 00000 n 0000763650 00000 n 0000763538 00000 n 0000760574 00000 n 0000767319 00000 n 0000767207 00000 n 0000763768 00000 n 0001013015 00000 n 0000770958 00000 n 0000770846 00000 n 0000767449 00000 n 0000774392 00000 n 0000774280 00000 n 0000771076 00000 n 0000779296 00000 n 0000779184 00000 n 0000774522 00000 n 0000782853 00000 n 0000782741 00000 n 0000779414 00000 n 0000785759 00000 n 0000785647 00000 n 0000782947 00000 n 0000789611 00000 n 0000789499 00000 n 0000785901 00000 n 0001013133 00000 n 0000793687 00000 n 0000793575 00000 n 0000789741 00000 n 0000795288 00000 n 0000795176 00000 n 0000793829 00000 n 0000800367 00000 n 0000800255 00000 n 0000795418 00000 n 0000802723 00000 n 0000802611 00000 n 0000800473 00000 n 0000805733 00000 n 0000805621 00000 n 0000802841 00000 n 0000808958 00000 n 0000808846 00000 n 0000805875 00000 n 0001013251 00000 n 0000812743 00000 n 0000812631 00000 n 0000809076 00000 n 0000816677 00000 n 0000816565 00000 n 0000812849 00000 n 0000819819 00000 n 0000819707 00000 n 0000816807 00000 n 0000822234 00000 n 0000822122 00000 n 0000819925 00000 n 0000824688 00000 n 0000824576 00000 n 0000822364 00000 n 0000827314 00000 n 0000827202 00000 n 0000824818 00000 n 0001013369 00000 n 0000829249 00000 n 0000829137 00000 n 0000827444 00000 n 0000831982 00000 n 0000831870 00000 n 0000829355 00000 n 0000834819 00000 n 0000834707 00000 n 0000832112 00000 n 0000838980 00000 n 0000838868 00000 n 0000834961 00000 n 0000842709 00000 n 0000842597 00000 n 0000839098 00000 n 0000845751 00000 n 0000845639 00000 n 0000842827 00000 n 0001013487 00000 n 0000849048 00000 n 0000848936 00000 n 0000845869 00000 n 0000852818 00000 n 0000852706 00000 n 0000849154 00000 n 0000855627 00000 n 0000855515 00000 n 0000852948 00000 n 0000859019 00000 n 0000858907 00000 n 0000855757 00000 n 0000861991 00000 n 0000861879 00000 n 0000859125 00000 n 0000865470 00000 n 0000865358 00000 n 0000862109 00000 n 0001013605 00000 n 0000868288 00000 n 0000868176 00000 n 0000865588 00000 n 0000870223 00000 n 0000870111 00000 n 0000868418 00000 n 0000871867 00000 n 0000871755 00000 n 0000870317 00000 n 0000873342 00000 n 0000873230 00000 n 0000871973 00000 n 0000875058 00000 n 0000875034 00000 n 0000877449 00000 n 0000877413 00000 n 0000879985 00000 n 0000879949 00000 n 0000882665 00000 n 0000882503 00000 n 0000889220 00000 n 0000888926 00000 n 0000892860 00000 n 0000892706 00000 n 0000907003 00000 n 0000906556 00000 n 0000925100 00000 n 0000924708 00000 n 0000928668 00000 n 0000928410 00000 n 0000940567 00000 n 0000940237 00000 n 0000960514 00000 n 0000960087 00000 n 0000977161 00000 n 0000976764 00000 n 0000991371 00000 n 0000990984 00000 n 0000995693 00000 n 0000995502 00000 n 0001002408 00000 n 0001002177 00000 n 0001007664 00000 n 0001007467 00000 n 0001013715 00000 n 0001013831 00000 n 0001013951 00000 n 0001014071 00000 n 0001014191 00000 n 0001014311 00000 n 0001014431 00000 n 0001014551 00000 n 0001014671 00000 n 0001014750 00000 n 0001014877 00000 n 0001014976 00000 n 0001015050 00000 n 0001015105 00000 n trailer << /Size 1023 /Root 1021 0 R /Info 1022 0 R /ID [<5543B1B785BF801557A6F5F971B147C2> <5543B1B785BF801557A6F5F971B147C2>] >> startxref 1015312 %%EOF gsoap-2.8.28/gsoap/doc/doxygen_header.html0000644000175000017500000000235412653650144020027 0ustar ellertellert Genivia - $title

  Genivia Home Documentation
$title

updated $date
 
gsoap-2.8.28/gsoap/samples/0000755000175000017500000000000012653650174015052 5ustar ellertellertgsoap-2.8.28/gsoap/samples/dime/0000755000175000017500000000000012653650164015767 5ustar ellertellertgsoap-2.8.28/gsoap/samples/dime/Makefile.in0000644000175000017500000004725112653650164020045 0ustar ellertellert# Makefile.in generated by automake 1.14 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = dimeclient$(EXEEXT) dimeserver$(EXEEXT) DIST_COMMON = $(srcdir)/../Makefile.defines \ $(srcdir)/../Makefile.cpp_rules $(srcdir)/Makefile.in \ $(srcdir)/Makefile.am $(top_srcdir)/mkinstalldirs \ $(top_srcdir)/depcomp subdir = gsoap/samples/dime ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = am__objects_2 = soapC.$(OBJEXT) am__objects_3 = soapClient.$(OBJEXT) $(am__objects_2) am_dimeclient_OBJECTS = dimeclient.$(OBJEXT) $(am__objects_1) \ $(am__objects_3) dimeclient_OBJECTS = $(am_dimeclient_OBJECTS) am__DEPENDENCIES_1 = dimeclient_DEPENDENCIES = $(SOAP_CPP_LIB) $(am__DEPENDENCIES_1) am__objects_4 = soapServer.$(OBJEXT) $(am__objects_2) am_dimeserver_OBJECTS = dimeserver.$(OBJEXT) $(am__objects_1) \ $(am__objects_4) dimeserver_OBJECTS = $(am_dimeserver_OBJECTS) dimeserver_DEPENDENCIES = $(SOAP_CPP_LIB) $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(dimeclient_SOURCES) $(dimeserver_SOURCES) DIST_SOURCES = $(dimeclient_SOURCES) $(dimeserver_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ STRIP = @STRIP@ VERSION = @VERSION@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 SOAPHEADER = dime.h AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a SOAP_CPP_SRC = $(SOAP_CPP_CLIENT) soapServer.cpp $(SOAP_H_FILES) $(SOAP_NS) LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_CPP_SRC) CLEANFILES = $(SOAP_CPP_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.cpp soap*Proxy.h soap*Proxy.cpp soap*Object.h soap*Service.h soap*Service.cpp soapClient.cpp soapServer.cpp soapClientLib.cpp soapServerLib.cpp *~ SOAP_NS = dime.nsmap dime.wsdl dimeclient_SOURCES = dimeclient.cpp $(SOAPHEADER) $(SOAP_CPP_CLIENT) dimeclient_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) dimeserver_SOURCES = dimeserver.cpp $(SOAPHEADER) $(SOAP_CPP_SERVER) dimeserver_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) -lpthread all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_rules $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/dime/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/dime/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_rules: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) dimeclient$(EXEEXT): $(dimeclient_OBJECTS) $(dimeclient_DEPENDENCIES) $(EXTRA_dimeclient_DEPENDENCIES) @rm -f dimeclient$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(dimeclient_OBJECTS) $(dimeclient_LDADD) $(LIBS) dimeserver$(EXEEXT): $(dimeserver_OBJECTS) $(dimeserver_DEPENDENCIES) $(EXTRA_dimeserver_DEPENDENCIES) @rm -f dimeserver$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(dimeserver_OBJECTS) $(dimeserver_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dimeclient.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dimeserver.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapC.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapClient.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapServer.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am $(SOAP_CPP_SRC) : $(SOAPHEADER) $(SOAP) -L -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $(SOAPHEADER) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.28/gsoap/samples/dime/dimeserver.cpp0000644000175000017500000004066412653650154020651 0ustar ellertellert/* dimeserver.cpp Example streaming DIME server. Supports three methods: putData stores multiple data sets on the server and returns named keys to each data set. The keys are unique and provide access to the data. Once data is stored, it cannot be removed. getData retrieves data sets given a set of named keys. getImage is an example file-based image retrieval method Data is stored in the current directory or the directory specified by the TMPDIR environment variable. Runs as CGI (not multi-threaded) or multi-threaded stand-alone Web service Copyright (C) 2000-2003 Robert A. van Engelen, Genivia, Inc. All Rights Reserved. NOTE: THE SERVER WILL ONLY SEND FILES THAT ARE IN THE CURRENT DIR FOR SECURITY REASONS. HOWEVER, THE AUTHOR IS NOT RESPONSIBLE FOR ANY DAMAGES THAT MAY RESULT FROM THE USE OF THIS PROGRAM. Usage: For stand-alone Web service functionality, run from the command line with port number as command line argument, e.g. > dimeserver 8085 & Use port 80 to run as HTTP Web server accessible over the Web Change the 'endpoint' in 'dimeclient.cpp' to endpoint="http://machine:8085" where 'machine' is the host name of the machine on which the service runs, or 'localhost' if the server runs on the same machine. Be careful to run the client in a separate directory from the server. Otherwise, the client and server may interfere in their file access. The service is multi-threaded. Multi-threading is not required, but can improve QoS. Remove the pthread code to obtain a non-multi-threaded service. Unix/Linux: add a sigpipe handler to avoid broken pipes with stand-alone server. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" #include "dime.nsmap" #include // use fstat() for streaming DIME #include #include #ifdef _POSIX_THREADS #include // use Pthreads #endif #define BACKLOG (100) // max request backlog #define MAX_FILE_SIZE (10000) // max file size when buffering file for HTTP 1.0 and file size cannot be determined //////////////////////////////////////////////////////////////////////////////// // // Forward decls // //////////////////////////////////////////////////////////////////////////////// static void *process_request(void*); static int getdata(struct soap*, const char*, ns__Data&); static void saveData(ns__Data&, const char*); static void sigpipe_handle(int); //////////////////////////////////////////////////////////////////////////////// // // Streaming DIME attachment content handlers // //////////////////////////////////////////////////////////////////////////////// static void *dime_read_open(struct soap*, void*, const char*, const char*, const char*); static void dime_read_close(struct soap*, void*); static size_t dime_read(struct soap*, void*, char*, size_t); static void *dime_write_open(struct soap*, const char*, const char*, const char*); static void dime_write_close(struct soap*, void*); static int dime_write(struct soap*, void*, const char*, size_t); //////////////////////////////////////////////////////////////////////////////// // // Data for streaming DIME write handler // //////////////////////////////////////////////////////////////////////////////// struct dime_write_handle { char *name; // file name FILE *fd; // file fd }; //////////////////////////////////////////////////////////////////////////////// // // Static data // //////////////////////////////////////////////////////////////////////////////// static const char *TMPDIR = "."; //////////////////////////////////////////////////////////////////////////////// // // Main // //////////////////////////////////////////////////////////////////////////////// int main(int argc, char **argv) { struct soap soap; char *s = getenv("TMPDIR"); if (s) TMPDIR = s; // use HTTP chunking when possible // chunking allows streaming of DIME content without requiring DIME attachment size to be set // DIME attachments can be streamed without chunking only if the attachment size is set soap_init1(&soap, SOAP_IO_KEEPALIVE | SOAP_IO_CHUNK); // set DIME callbacks soap.fdimereadopen = dime_read_open; soap.fdimereadclose = dime_read_close; soap.fdimeread = dime_read; soap.fdimewriteopen = dime_write_open; soap.fdimewriteclose = dime_write_close; soap.fdimewrite = dime_write; if (argc < 2) { // no args: assume this is a CGI application // serve request soap_serve(&soap); // cleanup class instances soap_destroy(&soap); // cleanup soap_end(&soap); } else { #ifdef _POSIX_THREADS pthread_t tid; #endif struct soap *tsoap; int port; int m, s, i; // Unix SIGPIPE, this is OS dependent: // soap.accept_flags = SO_NOSIGPIPE; // some systems like this // soap.socket_flags = MSG_NOSIGNAL; // others need this // signal(SIGPIPE, sigpipe_handle); // or a sigpipe handler (portable) // port is first command line argument port = atoi(argv[1]); // bind to current host and specified port m = soap_bind(&soap, NULL, port, BACKLOG); // if we could not bind, exit if (m < 0) { soap_print_fault(&soap, stderr); exit(1); } fprintf(stderr, "Socket connection successful %d\n", m); // die after 24 hrs waiting for activity on port soap.accept_timeout = 24*60*60; // IO timeouts soap.send_timeout = 30; soap.recv_timeout = 30; // loop through requests for (i = 1; ; i++) { // accept request s = soap_accept(&soap); // if timeout or error, report if (s < 0) { if (soap.errnum) soap_print_fault(&soap, stderr); else fprintf(stderr, "Server timed out\n"); break; } fprintf(stderr, "Thread %d accepts socket %d connection from IP %d.%d.%d.%d\n", i, s, (int)(soap.ip>>24)&0xFF, (int)(soap.ip>>16)&0xFF, (int)(soap.ip>>8)&0xFF, (int)soap.ip&0xFF); // copy soap environment and spawn thread (if Pthreads is installed) tsoap = soap_copy(&soap); #ifdef _POSIX_THREADS pthread_create(&tid, NULL, (void*(*)(void*))process_request, (void*)tsoap); #else process_request((void*)tsoap); #endif } } // detach soap_done(&soap); return 0; } void *process_request(void *soap) { #ifdef _POSIX_THREADS pthread_detach(pthread_self()); #endif // serve request (or multiple requests with keep-alive enabled) soap_serve((struct soap*)soap); // cleanup class instances soap_destroy((struct soap*)soap); // cleanup soap_end((struct soap*)soap); // detach and free thread's copy of soap environment soap_free((struct soap*)soap); return NULL; } //////////////////////////////////////////////////////////////////////////////// // // Server methods // //////////////////////////////////////////////////////////////////////////////// int ns__putData(struct soap *soap, arrayOfData *data, arrayOfName *names) { // gSOAP switches to SOAP_IO_STORE when SOAP_IO_CHUNK (HTTP chunking) is not supported by the client // Since it is undesirable to use SOAP_IO_STORE with streaming, we reset it to SOAP_IO_BUFFER if ((soap->omode & SOAP_IO) == SOAP_IO_STORE) soap->omode = (soap->omode & ~SOAP_IO) | SOAP_IO_BUFFER; // return name (key) for each data item names->resize(data->size()); for (int i = 0; i < data->size(); i++) { char *s, *name; // the id field is set when DIME was used so the dime_write callbacks already saved the file if ((*data)[i].id) { assert((*data)[i].__ptr); name = ((struct dime_write_handle*)(*data)[i].__ptr)->name; } else { name = tempnam(TMPDIR, "data"); fprintf(stderr, "Saving file %s\n", name); saveData((*data)[i], name); } s = strrchr(name, '/'); if (!s) s = strrchr(name, '\\'); if (!s) s = name; else s++; (*names)[i] = soap_strdup(soap, s); if (!(*data)[i].id) { // free data alloced with tempnam() free(name); } } return SOAP_OK; } int ns__getData(struct soap *soap, arrayOfName *names, arrayOfData *data) { // gSOAP switches to SOAP_IO_STORE when SOAP_IO_CHUNK (HTTP chunking) is not supported by the client. // Since it is undesirable to use SOAP_IO_STORE, we reset it to SOAP_IO_BUFFER if ((soap->omode & SOAP_IO) == SOAP_IO_STORE) soap->omode = (soap->omode & ~SOAP_IO) | SOAP_IO_BUFFER; if (!names) return soap_sender_fault(soap, "Names required", NULL); data->resize(names->size()); for (int i = 0; i < names->__size; i++) { if (!(*names)[i]) return soap_sender_fault(soap, "Name required", NULL); if (getdata(soap, (*names)[i], (*data)[i])) return soap_sender_fault(soap, "Access denied", NULL); } return SOAP_OK; } int ns__getImage(struct soap *soap, char *name, ns__Data& image) { if (!name) return soap_sender_fault(soap, "Name required", NULL); if (getdata(soap, name, image)) return soap_sender_fault(soap, "Access denied", NULL); image.type = (char*)"image/jpeg"; image.options = soap_dime_option(soap, 0, name); return SOAP_OK; } //////////////////////////////////////////////////////////////////////////////// // // Helper functions // //////////////////////////////////////////////////////////////////////////////// static int getdata(struct soap *soap, const char *name, ns__Data& data) { struct stat sb; FILE *fd = NULL; if (name && !strchr(name, '/') && !strchr(name, '\\') && !strchr(name, ':')) { char *s = (char*)soap_malloc(soap, strlen(TMPDIR) + strlen(name) + 2); strcpy(s, TMPDIR); strcat(s, "/"); strcat(s, name); fd = fopen(s, "rb"); if (!fd) { strcpy(s, name); fd = fopen(s, "rb"); } } if (!fd) return SOAP_EOF; if ((soap->omode & SOAP_IO) == SOAP_IO_CHUNK) // chunked response is possible { data.__ptr = (unsigned char*)fd; // must set to non-NULL (this is our fd handle which we need in the callbacks) data.__size = 0; // zero size streams data with HTTP chunking } else if (!fstat(fileno(fd), &sb) && sb.st_size > 0) { // since we can get the length of the file, we can stream it data.__ptr = (unsigned char*)fd; // must set to non-NULL (this is our fd handle which we need in the callbacks) data.__size = sb.st_size; } else // we can't use HTTP chunking and we don't know the size, so buffer it { int i; data.__ptr = (unsigned char*)soap_malloc(soap, MAX_FILE_SIZE); for (i = 0; i < MAX_FILE_SIZE; i++) { int c; if ((c = fgetc(fd)) == EOF) break; data.__ptr[i] = c; } fclose(fd); data.__size = i; } data.type = (char*)""; // specify non-NULL id or type to enable DIME data.options = soap_dime_option(soap, 0, name); return SOAP_OK; } static void saveData(ns__Data& data, const char *name) { char *buf = (char*)data.__ptr; int len = data.__size; FILE *fd = fopen(name, "wb"); if (!fd) { fprintf(stderr, "Cannot save file %s\n", name); return; } while (len) { size_t nwritten = fwrite(buf, 1, len, fd); if (!nwritten) { fprintf(stderr, "Cannot write to %s\n", name); return; } len -= nwritten; buf += nwritten; } } static void sigpipe_handle(int x) { } //////////////////////////////////////////////////////////////////////////////// // // Streaming DIME attachment content handlers // //////////////////////////////////////////////////////////////////////////////// static void *dime_read_open(struct soap *soap, void *handle, const char *id, const char *type, const char *options) { // we should return NULL without setting soap->error if we don't want to use the streaming callback for this DIME attachment. The handle contains the non-NULL __ptr field value which should have been set in the application. // return value of this function will be passed on to the fdimeread and fdimereadclose callbacks. The return value will not affect the __ptr field. return handle; } static void dime_read_close(struct soap *soap, void *handle) { fclose((FILE*)handle); } static size_t dime_read(struct soap *soap, void *handle, char *buf, size_t len) { return fread(buf, 1, len, (FILE*)handle); } static void *dime_write_open(struct soap *soap, const char *id, const char *type, const char *options) { // we can return NULL without setting soap->error if we don't want to use the streaming callback for this DIME attachment struct dime_write_handle *handle = (struct dime_write_handle*)soap_malloc(soap, sizeof(struct dime_write_handle)); if (!handle) { soap->error = SOAP_EOM; return NULL; } char *name = tempnam(TMPDIR, "data"); fprintf(stderr, "Saving file %s\n", name); handle->name = soap_strdup(soap, name); free(name); handle->fd = fopen(handle->name, "wb"); if (!handle->fd) { soap->error = SOAP_EOF; // could not open file for writing soap->errnum = errno; // get reason return NULL; } return (void*)handle; } static void dime_write_close(struct soap *soap, void *handle) { fclose(((struct dime_write_handle*)handle)->fd); } static int dime_write(struct soap *soap, void *handle, const char *buf, size_t len) { while (len) { size_t nwritten = fwrite(buf, 1, len, ((struct dime_write_handle*)handle)->fd); if (!nwritten) { soap->errnum = errno; // get reason return SOAP_EOF; } len -= nwritten; buf += nwritten; } return SOAP_OK; } //////////////////////////////////////////////////////////////////////////////// // // ns__Data class // //////////////////////////////////////////////////////////////////////////////// ns__Data::ns__Data() { __ptr = NULL; __size = 0; id = NULL; type = NULL; options = NULL; soap = NULL; } //////////////////////////////////////////////////////////////////////////////// // // arrayOfData class // //////////////////////////////////////////////////////////////////////////////// arrayOfData::arrayOfData() { __ptr = NULL; __size = 0; soap = NULL; } arrayOfData::arrayOfData(struct soap *soap, int n) { __ptr = NULL; __size = 0; this->soap = soap; resize(n); } arrayOfData::~arrayOfData() { resize(0); } int arrayOfData::size() { return __size; } void arrayOfData::resize(int n) { if (__ptr) { if (soap) // if created by soap environment soap_delete(soap, __ptr); // then delete else delete[] __ptr; } __size = n; if (n <= 0) __ptr = NULL; else if (soap) __ptr = soap_new_ns__Data(soap, n); else __ptr = new ns__Data[n]; } ns__Data& arrayOfData::operator[](int i) const { assert(__ptr && i >= 0 && i < __size); return __ptr[i]; } //////////////////////////////////////////////////////////////////////////////// // // arrayOfName class // //////////////////////////////////////////////////////////////////////////////// arrayOfName::arrayOfName() { __ptr = NULL; __size = 0; soap = NULL; } arrayOfName::arrayOfName(struct soap *soap, int n) { __ptr = NULL; __size = 0; this->soap = soap; resize(n); } arrayOfName::~arrayOfName() { resize(0); } int arrayOfName::size() { return __size; } void arrayOfName::resize(int n) { if (__ptr) { if (soap) // if created by soap environment soap_delete(soap, __ptr); // then delete else free(__ptr); } __size = n; if (n <= 0) __ptr = NULL; else { if (soap) __ptr = (char**)soap_malloc(soap, sizeof(char*) * n); else __ptr = (char**)malloc(sizeof(char*) * n); memset(__ptr, 0, n); } } char*& arrayOfName::operator[](int i) const { assert(__ptr && i >= 0 && i < __size); return __ptr[i]; } gsoap-2.8.28/gsoap/samples/dime/README.txt0000644000175000017500000000264612653650154017474 0ustar ellertellertExample DIME attachment processing. Note: DIME attachments are deprecated in favor of MTOM attachments. This demo illustrates streaming DIME attachments. DIME is an efficient binary attachment format. DIME has been deprecated by the DIME authors in favor of MTOM MIME-based attachments. Client and server examples are included. Both use streaming DIME attachment processing using data handlers. The service implements three streaming operations: putData stores multiple data sets on the server and returns named references to each data set getData retrieves data sets given named references. getImage is an example file-based image retrieval method Usage (server side): For stand-alone Web service functionality, run from the command line with port number as command line argument: dimeserver 8085 & Usage (client side): dimeclient dimeclient name dimeclient [-p] [-g] name ... dimeclient Without args retrieves image.jpg dimeclient name Retrieves image stored under name dimeclient -p name1 name2 ... Stores files name1, name2, etc. The storage keys are printed. The keys provide access to the data on the server. dimeclient -g name1 name2 ... Retrieves files stored under keys name1, name2, etc. The keys must correspond to the keys returned when storing files. Files are stored locally under the key name. All files are stored and retrieved in the current directory. gsoap-2.8.28/gsoap/samples/dime/Makefile.am0000644000175000017500000000121612653650154020022 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 noinst_PROGRAMS = dimeclient dimeserver SOAPHEADER = dime.h include ../Makefile.defines include ../Makefile.cpp_rules SOAP_NS = dime.nsmap dime.wsdl dimeclient_SOURCES = dimeclient.cpp $(SOAPHEADER) $(SOAP_CPP_CLIENT) dimeclient_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) dimeserver_SOURCES = dimeserver.cpp $(SOAPHEADER) $(SOAP_CPP_SERVER) dimeserver_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) -lpthread gsoap-2.8.28/gsoap/samples/dime/dimeclient.cpp0000644000175000017500000003006512653650154020613 0ustar ellertellert/* dimeclient.cpp Example streaming DIME client for DIME server (dimeserver.cpp). Supports three methods: putData stores multiple data sets on the server and returns named references to each data set getData retrieves data sets given named references. getImage is an example file-based image retrieval method Change the endpoint in dime.h to your needs. Copyright (C) 2000-2003 Robert A. van Engelen, Genivia, Inc. All Rights Reserved. Usage (server): Start dimeserver on your host at port 8085 (see dimeserver.cpp): dimeserver 8085 & Usage (client): dimeclient dimeclient name dimeclient [-p] [-g] name ... dimeclient Without args retrieves image.jpg dimeclient name Retrieves image stored under name dimeclient -p name1 name2 ... Stores files name1, name2, etc. The storage keys are printed. The keys provide access to the data on the server. dimeclient -g name1 name2 ... Retrieves files stored under keys name1, name2, etc. The keys must correspond to the keys returned when storing files. Files are stored locally under the key name. Unix/Linux: add a sigpipe handler to avoid broken pipes. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" #include "dime.nsmap" #include // use the default endpoint set in dime.h for demo: const char *endpoint = NULL; // use the localhost for -p and -g (put and get): const char *localhost = "http://localhost:8085"; //////////////////////////////////////////////////////////////////////////////// // // Forward decls // //////////////////////////////////////////////////////////////////////////////// static void putData(struct soap*, int, char**); static void getData(struct soap*, int, char**); static void getImage(struct soap*, char*); static void saveData(ns__Data&, const char*); //////////////////////////////////////////////////////////////////////////////// // // Streaming DIME attachment content handlers // //////////////////////////////////////////////////////////////////////////////// static void *dime_read_open(struct soap*, void*, const char*, const char*, const char*); static void dime_read_close(struct soap*, void*); static size_t dime_read(struct soap*, void*, char*, size_t); static void *dime_write_open(struct soap*, const char*, const char*, const char*); static void dime_write_close(struct soap*, void*); static int dime_write(struct soap*, void*, const char*, size_t); //////////////////////////////////////////////////////////////////////////////// // // Main // //////////////////////////////////////////////////////////////////////////////// int main(int argc, char **argv) { struct soap soap; // use HTTP 1.1 chunking // HTTP chunking allows streaming of DIME content without requiring DIME attachment size to be set // DIME attachments can be streamed without chunking ONLY if the attachment size is set soap_init1(&soap, SOAP_IO_CHUNK); // set DIME callbacks soap.fdimereadopen = dime_read_open; soap.fdimereadclose = dime_read_close; soap.fdimeread = dime_read; soap.fdimewriteopen = dime_write_open; soap.fdimewriteclose = dime_write_close; soap.fdimewrite = dime_write; // connect timeout value (not supported by Linux) soap.connect_timeout = 10; // IO timeouts soap.send_timeout = 30; soap.recv_timeout = 30; // Unix/Linux SIGPIPE, this is OS dependent: // soap.accept_flags = SO_NOSIGPIPE; // some systems like this // soap.socket_flags = MSG_NOSIGNAL; // others need this // signal(SIGPIPE, sigpipe_handle); // or a sigpipe handler (portable) if (argc < 3) { char *name; if (argc < 2) name = (char*)"image.jpg"; else name = argv[1]; getImage(&soap, name); } else { switch (argv[1][1]) { case 'p': endpoint = localhost; putData(&soap, argc, argv); break; case 'g': endpoint = localhost; getData(&soap, argc, argv); break; default: fprintf(stderr, "Usage: [-p] [-g] name ...\n"); exit(0); } } soap_destroy(&soap); soap_end(&soap); soap_done(&soap); return SOAP_OK; } //////////////////////////////////////////////////////////////////////////////// // // Helper functions // //////////////////////////////////////////////////////////////////////////////// static void putData(struct soap *soap, int argc, char **argv) { arrayOfData data; arrayOfName names; data.resize(argc - 2); for (int i = 2; i < argc; i++) { data[i - 2].__ptr = (unsigned char*)argv[i]; // MUST set id or type to enable DIME // zero size indicates streaming DIME (this requires HTTP chunking) data[i - 2].type = (char*)""; } if (soap_call_ns__putData(soap, endpoint, NULL, &data, &names)) soap_print_fault(soap, stderr); else { printf("Data stored with keys:\n"); for (int j = 0; j < names.size(); j++) printf("\t%s\n", names[j]); printf("Use these keys to retrieve the data\n"); } } static void getData(struct soap *soap, int argc, char **argv) { arrayOfData data; arrayOfName names; names.resize(argc - 2); for (int i = 2; i < argc; i++) names[i - 2] = argv[i]; soap->user = (void*)names.__ptr; if (soap_call_ns__getData(soap, endpoint, NULL, &names, &data)) soap_print_fault(soap, stderr); else { for (int j = 0; j < data.size(); j++) if (!data[j].id) saveData(data[j], argv[j + 2]); printf("Data retrieved\n"); } } static void getImage(struct soap *soap, char *name) { ns__Data image; arrayOfName temp; temp.resize(1); temp[0] = name; soap->user = (void*)temp.__ptr; if (soap_call_ns__getImage(soap, endpoint, NULL, name, image)) soap_print_fault(soap, stderr); else if (image.id) { if (image.__size) printf("Got image %s size=%d type=%s through streaming DIME\n", name, image.__size, image.type?image.type:""); else printf("Got image %s type=%s through chunked streaming DIME\n", name, image.type?image.type:""); } else { printf("Got image %s\n", name); saveData(image, name); } } static void saveData(ns__Data& data, const char *name) { char *buf = (char*)data.__ptr; int len = data.__size; FILE *fd = fopen(name, "wb"); if (!fd) { fprintf(stderr, "Cannot save file %s\n", name); return; } while (len) { size_t nwritten = fwrite(buf, 1, len, fd); if (!nwritten) { fprintf(stderr, "Cannot write to %s\n", name); return; } len -= nwritten; buf += nwritten; } printf("Saved file %s\n", name); } //////////////////////////////////////////////////////////////////////////////// // // Streaming DIME attachment content handlers // //////////////////////////////////////////////////////////////////////////////// static void *dime_read_open(struct soap *soap, void *handle, const char *id, const char *type, const char *options) { FILE *fd; // we should return NULL without setting soap->error if we don't want to use the streaming callback for this DIME attachment. The handle contains the non-NULL __ptr field value which should have been set in the application. // return value of this function will be passed on to the fdimeread and fdimereadclose callbacks. The return value will not affect the __ptr field. fd = fopen((char*)handle, "rb"); return (void*)fd; } static void dime_read_close(struct soap *soap, void *handle) { fclose((FILE*)handle); } static size_t dime_read(struct soap *soap, void *handle, char *buf, size_t len) { return fread(buf, 1, len, (FILE*)handle); } static void *dime_write_open(struct soap *soap, const char *id, const char *type, const char *options) { // we can return NULL without setting soap->error if we don't want to use the streaming callback for this DIME attachment FILE *handle = NULL; char *name; // get file name from options (here we assume it's not '\0' terminated), but the gsoap engine adds NULs to DIME options after reading content if (options) { size_t len = ((unsigned char)options[2] << 8) | ((unsigned char)options[3]); // option string length name = (char*)soap_malloc(soap, len + 1); strncpy(name, options + 4, len); name[len] = '\0'; handle = fopen(name, "wb"); if (!handle) { soap->error = SOAP_EOF; // could not open file for writing soap->errnum = errno; // get reason return NULL; } } else soap->error = soap_receiver_fault(soap, "Cannot save to file, because no file name was present in attachment", NULL); return (void*)handle; } static void dime_write_close(struct soap *soap, void *handle) { fclose((FILE*)handle); } static int dime_write(struct soap *soap, void *handle, const char *buf, size_t len) { while (len) { size_t nwritten = fwrite(buf, 1, len, (FILE*)handle); if (!nwritten) { soap->errnum = errno; // get reason return SOAP_EOF; } len -= nwritten; buf += nwritten; } return SOAP_OK; } //////////////////////////////////////////////////////////////////////////////// // // ns__Data class // //////////////////////////////////////////////////////////////////////////////// ns__Data::ns__Data() { __ptr = NULL; __size = 0; id = NULL; type = NULL; options = NULL; soap = NULL; } //////////////////////////////////////////////////////////////////////////////// // // arrayOfData class // //////////////////////////////////////////////////////////////////////////////// arrayOfData::arrayOfData() { __ptr = NULL; __size = 0; soap = NULL; } arrayOfData::arrayOfData(struct soap *soap, int n) { __ptr = NULL; __size = 0; this->soap = soap; resize(n); } arrayOfData::~arrayOfData() { resize(0); } int arrayOfData::size() { return __size; } void arrayOfData::resize(int n) { if (__ptr) { if (soap) // if created by soap environment soap_delete(soap, __ptr); // then delete else delete[] __ptr; } __size = n; if (n <= 0) __ptr = NULL; else if (soap) __ptr = soap_new_ns__Data(soap, n); else __ptr = new ns__Data[n]; } ns__Data& arrayOfData::operator[](int i) const { assert(__ptr && i >= 0 && i < __size); return __ptr[i]; } //////////////////////////////////////////////////////////////////////////////// // // arrayOfName class // //////////////////////////////////////////////////////////////////////////////// arrayOfName::arrayOfName() { __ptr = NULL; __size = 0; soap = NULL; } arrayOfName::arrayOfName(struct soap *soap, int n) { __ptr = NULL; __size = 0; this->soap = soap; resize(n); } arrayOfName::~arrayOfName() { resize(0); } int arrayOfName::size() { return __size; } void arrayOfName::resize(int n) { if (__ptr) { if (soap) // if created by soap environment soap_delete(soap, __ptr); // then delete else free(__ptr); } __size = n; if (n <= 0) __ptr = NULL; else { if (soap) __ptr = (char**)soap_malloc(soap, sizeof(char*) * n); else __ptr = (char**)malloc(sizeof(char*) * n); memset(__ptr, 0, n); } } char*& arrayOfName::operator[](int i) const { assert(__ptr && i >= 0 && i < __size); return __ptr[i]; } gsoap-2.8.28/gsoap/samples/dime/dime.h0000644000175000017500000000530112653650154017054 0ustar ellertellert/* -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap ns service name: dime //gsoap ns service style: rpc //gsoap ns service encoding: encoded //gsoap ns service namespace: http://websrv.cs.fsu.edu/~engelen/dime.wsdl //gsoap ns service location: http://websrv.cs.fsu.edu/~engelen/dimesrv.cgi //gsoap ns schema namespace: urn:dime //gsoap ns schema type-documentation: Data contains DIME attachment data class ns__Data { unsigned char *__ptr; /* points to data */ int __size; /* size of data */ char *id; /* dime attachment ID (set to NULL to obtain unique cid) */ char *type; /* dime attachment content type */ char *options; /* dime attachment options (optional) */ ns__Data(); struct soap *soap; /* soap context that created this instance */ }; class arrayOfData /* SOAP array of data */ { ns__Data *__ptr; int __size; arrayOfData(); arrayOfData(struct soap*, int); virtual ~arrayOfData(); int size(); void resize(int); ns__Data& operator[](int) const; struct soap *soap; }; class arrayOfName /* SOAP array of strings */ { char **__ptr; int __size; arrayOfName(); arrayOfName(struct soap*, int); virtual ~arrayOfName(); int size(); void resize(int); char*& operator[](int) const; struct soap *soap; }; int ns__putData(arrayOfData *data, arrayOfName *names); int ns__getData(arrayOfName *names, arrayOfData *data); int ns__getImage(char *name, ns__Data &image); gsoap-2.8.28/gsoap/samples/udp/0000755000175000017500000000000012653650172015640 5ustar ellertellertgsoap-2.8.28/gsoap/samples/udp/udp.wsdl0000644000175000017500000001143212653650156017326 0ustar ellertellert Demo (anonymous) request-response MEP over UDP Demo one-way MEP over UDP gSOAP 2.8.28 generated service definition gsoap-2.8.28/gsoap/samples/udp/Makefile.in0000644000175000017500000004567212653650156017725 0ustar ellertellert# Makefile.in generated by automake 1.14 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = udpclient$(EXEEXT) udpserver$(EXEEXT) DIST_COMMON = $(srcdir)/../Makefile.defines \ $(srcdir)/../Makefile.c_rules $(srcdir)/Makefile.in \ $(srcdir)/Makefile.am $(top_srcdir)/mkinstalldirs \ $(top_srcdir)/depcomp subdir = gsoap/samples/udp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = am__objects_2 = soapC.$(OBJEXT) am__objects_3 = soapClient.$(OBJEXT) $(am__objects_2) am_udpclient_OBJECTS = udpclient.$(OBJEXT) $(am__objects_1) \ $(am__objects_3) udpclient_OBJECTS = $(am_udpclient_OBJECTS) udpclient_LDADD = $(LDADD) am__DEPENDENCIES_1 = udpclient_DEPENDENCIES = $(SOAP_C_LIB) $(am__DEPENDENCIES_1) am__objects_4 = soapServer.$(OBJEXT) $(am__objects_2) am_udpserver_OBJECTS = udpserver.$(OBJEXT) $(am__objects_1) \ $(am__objects_4) udpserver_OBJECTS = $(am_udpserver_OBJECTS) udpserver_LDADD = $(LDADD) udpserver_DEPENDENCIES = $(SOAP_C_LIB) $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(udpclient_SOURCES) $(udpserver_SOURCES) DIST_SOURCES = $(udpclient_SOURCES) $(udpserver_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ STRIP = @STRIP@ VERSION = @VERSION@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 SOAPHEADER = udp.h AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a SOAP_C_SRC = $(SOAP_C_CLIENT) soapServer.c $(SOAP_H_FILES) $(SOAP_NS) LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_C_SRC) CLEANFILES = $(SOAP_C_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.c soapClient.c soapClientLib.c soapServer.c soapServerLib.c *~ SOAP_NS = udp.nsmap udpclient_SOURCES = udpclient.c $(SOAPHEADER) $(SOAP_C_CLIENT) udpserver_SOURCES = udpserver.c $(SOAPHEADER) $(SOAP_C_SERVER) all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.c_rules $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/udp/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/udp/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.c_rules: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) udpclient$(EXEEXT): $(udpclient_OBJECTS) $(udpclient_DEPENDENCIES) $(EXTRA_udpclient_DEPENDENCIES) @rm -f udpclient$(EXEEXT) $(AM_V_CCLD)$(LINK) $(udpclient_OBJECTS) $(udpclient_LDADD) $(LIBS) udpserver$(EXEEXT): $(udpserver_OBJECTS) $(udpserver_DEPENDENCIES) $(EXTRA_udpserver_DEPENDENCIES) @rm -f udpserver$(EXEEXT) $(AM_V_CCLD)$(LINK) $(udpserver_OBJECTS) $(udpserver_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapC.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapClient.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapServer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/udpclient.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/udpserver.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am $(SOAP_C_SRC) : $(SOAPHEADER) $(SOAP) -cL -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $(SOAPHEADER) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.28/gsoap/samples/udp/udpclient.c0000644000175000017500000000733512653650156020005 0ustar ellertellert/* udpclient.c SOAP-over-UDP demo client with zlib compression and WS-Addressing -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" #include "udp.nsmap" #define SERVER "soap.udp://localhost:10000" // use NULL for address set in WSDL int main(int argc, char **argv) { struct soap soap; struct SOAP_ENV__Header header; struct wsa__EndpointReferenceType replyTo; char *res; char *mid1 = "id1"; char *mid2 = "id2"; if (argc > 1) mid1 = argv[1]; if (argc > 2) mid2 = argv[2]; soap_init(&soap); soap.send_timeout = 1; soap.recv_timeout = 1; /* To compress the request message (compile with -DWITH_GZIP): */ #ifdef WITH_GZIP soap_set_omode(&soap, SOAP_ENC_ZLIB); #endif /* To transmit MIME attachments: soap_set_mime(&soap, NULL, NULL); soap_set_mime_attachment(&soap, "abc", 3, SOAP_MIME_7BIT, "text/xml", "cid:abc", NULL, NULL); */ /* To transmit DIME attachments: soap_set_dime(&soap); soap_set_dime_attachment(&soap, "abc", 3, "cid:abc", "text/xml", 0, NULL); */ /* Prepare SOAP Header */ soap_default_SOAP_ENV__Header(&soap, &header); soap.header = &header; soap_default_wsa__EndpointReferenceType(&soap, &replyTo); replyTo.Address = "http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous"; /* Set WS-Addressing elements for request-response unicast */ header.wsa__MessageID = mid1; /* or use soap_wsa_rand_uuid(soap) for UUID */ header.wsa__To = "http://genivia.com/udp/server"; header.wsa__Action = "http://genivia.com/udp/echoString"; header.wsa__ReplyTo = &replyTo; /* Make request-response call */ if (soap_call_ns__echoString(&soap, SERVER, NULL, "hello world!", &res)) { if (soap.error == SOAP_EOF && soap.errnum == 0) printf("Timeout: message probably already delivered\n"); else soap_print_fault(&soap, stderr); } else printf("UDP server response: %s\n", res); /* Reset the SOAP Header */ soap_default_SOAP_ENV__Header(&soap, &header); soap.header = &header; /* Set WS-Addressing elements for one-way unicast */ header.wsa__MessageID = mid2; /* or use soap_wsa_rand_uuid(soap) for UUID */ header.wsa__To = "http://genivia.com/udp/server"; header.wsa__Action = "http://genivia.com/udp/sendString"; /* Send one-way message */ if (soap_send_ns__sendString(&soap, NULL, NULL, "hello world!")) soap_print_fault(&soap, stderr); soap_destroy(&soap); soap_end(&soap); soap_done(&soap); return 0; } gsoap-2.8.28/gsoap/samples/udp/udp.h0000644000175000017500000001044712653650156016611 0ustar ellertellert/* udp.h SOAP-over-UDP demo specification for udpclient and udpserver examples Requires WS-Addressing from import/wsa.h -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //////////////////////////////////////////////////////////////////////////////// // // Import WS-Addressing // //////////////////////////////////////////////////////////////////////////////// //gsoap wsa schema import: http://schemas.xmlsoap.org/ws/2004/08/addressing #import "wsa.h" // wsa.h is in the import directory //////////////////////////////////////////////////////////////////////////////// // // Demo UDP service // //////////////////////////////////////////////////////////////////////////////// //gsoap ns service name: udp //gsoap ns service namespace: urn:gsoap-udp-demo //gsoap ns service location: soap.udp://localhost:10000 // I would have assumed UDP transport to be defined in the WSDL bindings, // but this doesn't appear to be possible, so we will use the default HTTP // transport binding and omit the transport directive below. // ---> //gsoap ns service transport: ... ??? //////////////////////////////////////////////////////////////////////////////// // // SOAP-over-UDP SOAP Headers with WS-Addressing // //////////////////////////////////////////////////////////////////////////////// struct SOAP_ENV__Header { mustUnderstand _wsa__MessageID wsa__MessageID 0; ///< WS-Addressing mustUnderstand _wsa__RelatesTo *wsa__RelatesTo 0; ///< WS-Addressing mustUnderstand _wsa__From *wsa__From 0; ///< WS-Addressing mustUnderstand _wsa__ReplyTo *wsa__ReplyTo 0; ///< WS-Addressing mustUnderstand _wsa__FaultTo *wsa__FaultTo 0; ///< WS-Addressing mustUnderstand _wsa__To wsa__To 0; ///< WS-Addressing mustUnderstand _wsa__Action wsa__Action 0; ///< WS-Addressing }; //////////////////////////////////////////////////////////////////////////////// // // echoString (anonymous) request-response MEP over UDP // //////////////////////////////////////////////////////////////////////////////// //gsoap ns service method-documentation: echoString Demo (anonymous) request-response MEP over UDP //gsoap ns service method-header-part: echoString wsa__MessageID //gsoap ns service method-header-part: echoString wsa__To //gsoap ns service method-header-part: echoString wsa__Action //gsoap ns service method-input-header-part: sendString wsa__ReplyTo //gsoap ns service method-output-header-part: echoString wsa__RelatesTo int ns__echoString(char *str, char **res); //////////////////////////////////////////////////////////////////////////////// // // sendString one-way MEP over UDP // //////////////////////////////////////////////////////////////////////////////// //gsoap ns service method-documentation: sendString Demo one-way MEP over UDP //gsoap ns service method-header-part: sendString wsa__MessageID //gsoap ns service method-header-part: sendString wsa__To //gsoap ns service method-header-part: sendString wsa__Action int ns__sendString(char *str, void); gsoap-2.8.28/gsoap/samples/udp/README.txt0000644000175000017500000002137512653650156017350 0ustar ellertellert SOAP-over-UDP Conformance ----------- The SOAP-over-UDP specification relies on WS-Addressing. The WS-Addressing.h file defines the WS-Addressing elements for client and server applications. The implementation conforms to the SOAP-over-UDP requirements: * SOAP-over-UDP server endpoint URL format: soap.udp://host:port/path * Support one-way message-exchange pattern (MEP) where a SOAP envelope is carried in a user datagram. * Support request-response message-exchange pattern (MEP) where SOAP envelopes are carried in user datagrams. * Support multicast transmission of SOAP envelopes carried in user datagrams. * Support both SOAP 1.1 and SOAP 1.2 envelopes. The SOAP-over-UDP specification can be found at: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnglobspec/html/soap-over-udp.asp Features -------- The following additional features are also available: * Zlib/gzip message compression (compile -DWITH_GZIP and link with -lgsoapssl). * SOAP with DIME attachments over UDP. * SOAP with MIME attachments (SwA) over UDP. * Support for IPv6 (compile -DWITH_IPV6) Message retransmission ---------------------- Retransmission is implemented using a retry and exponential back-off algorithm as per SOAP-over-UDP retransmission requirements, see SOAP-over-UDP Appendix I. Duplicate message detection --------------------------- The user is responsible for implementing a duplicate message detection algorithm, see SOAP-over-UDP Appendix II. An example algorithm is given in udpserver.c Closing the socket ------------------ The socket is not automatically closed. At the server side the socket should never be closed (its bound). At the client side the socket is closed with soap_done() or soap_free(). Or close the socket explicitly with soap_closesocket(soap.socket). Usage ----- * Header file: //gsoap wsa schema import: http://schemas.xmlsoap.org/ws/2004/08/addressing #import "was.h" struct SOAP_ENV__Header { mustUnderstand wsa__AttributedURI wsa__MessageID 0; mustUnderstand struct wsa__Relationship *wsa__RelatesTo 0; mustUnderstand struct wsa__EndpointReferenceType *wsa__From 0; mustUnderstand struct wsa__EndpointReferenceType *wsa__ReplyTo 0; mustUnderstand struct wsa__EndpointReferenceType *wsa__FaultTo 0; mustUnderstand struct wsa__EndpointReferenceType *wsa__Recipient 0; mustUnderstand wsa__AttributedURI wsa__To 0; mustUnderstand wsa__AttributedURI wsa__Action 0; }; ... your declarations go here (request-response and one-way) ... ... for example: int ns__echoString(char *str, char **res); int ns__sendString(char *str, void); int ns__sendStringResponse(char *res, void); * Client-side one-way unicast/multicast: struct soap soap; struct SOAP_ENV__Header header; soap_init(&soap); if (multicast) soap.connect_flags = SO_BROADCAST; soap.send_timeout = 1; // 1s timeout soap_default_SOAP_ENV__Header(&soap, &header); soap.header = &header; header.wsa__MessageID = ""; header.wsa__To = ""; header.wsa__Action = ""; if (soap_send_ns__echoString(&soap, "soap.udp://...", NULL, "hello world!")) soap_print_fault(&soap, stderr); soap_destroy(&soap); // cleanup soap_end(&soap); // cleanup soap_done(&soap); // close connection (should not use soap struct after this) * Client-side request-response unicast: struct soap soap; struct SOAP_ENV__Header header; struct wsa__EndpointReferenceType replyTo; char *res; soap_init(&soap); soap.send_timeout = 1; // 1s timeout soap.recv_timeout = 1; // 1s timeout soap_default_SOAP_ENV__Header(&soap, &header); soap.header = &header; soap_default_wsa__EndpointReferenceType(&soap, &replyTo); replyTo.Address = "http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous"; header.wsa__MessageID = ""; header.wsa__To = ""; header.wsa__Action = ""; header.wsa__ReplyTo = &replyTo; if (soap_call_ns__echoString(&soap, "soap.udp://...", NULL, "hello world!", &res)) { if (soap.error == SOAP_EOF && soap.errnum == 0) printf("Timeout: message probably already delivered\n"); else soap_print_fault(&soap, stderr); } else printf("UDP server response: %s\n", res); soap_destroy(&soap); // cleanup soap_end(&soap); // cleanup soap_done(&soap); // close connection (should not use soap struct after this) * Client-side request-response multicast: struct soap soap; struct SOAP_ENV__Header header; struct wsa__EndpointReferenceType replyTo; char *res; soap_init(&soap); soap.connect_flags = SO_BROADCAST; soap.send_timeout = 1; // 1s timeout soap.recv_timeout = 1; // 1s timeout soap_default_SOAP_ENV__Header(&soap, &header); soap.header = &header; soap_default_wsa__EndpointReferenceType(&soap, &replyTo); replyTo.Address = "http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous"; header.wsa__MessageID = ""; header.wsa__To = ""; header.wsa__Action = ""; header.wsa__ReplyTo = &replyTo; if (soap_send_ns__echoString(&soap, "soap.udp://...", NULL, "hello world!")) soap_print_fault(&soap, stderr); else { for (;;) { if (soap_recv_ns__sendStringResponse(&soap, &res)) break; printf("Multicast response: %s\n", res); } if (soap.error == SOAP_EOF && soap.errnum == 0) printf("Timeout: no more messages received\n"); else soap_print_fault(&soap, stderr); } soap_destroy(&soap); // cleanup soap_end(&soap); // cleanup soap_done(&soap); // close connection (should not use soap struct after this) * Server-side struct soap soap; soap_init1(&soap, SOAP_IO_UDP); // must set UDP flag if (!soap_valid_socket(soap_bind(&soap, host, port, 100))) { soap_print_fault(&soap, stderr); exit(1); } for (;;) { if (soap_serve(&soap)) soap_print_fault(&soap, stderr); // just report the problem soap_destroy(&soap); soap_end(&soap); } soap_done(&soap); ... int ns__echoString(struct soap *soap, char *str, char **res) { if (!soap->header) return soap_sender_fault(soap, "No SOAP header", NULL); if (!soap->header->wsa__MessageID) return soap_sender_fault(soap, "No WS-Addressing MessageID", NULL); soap->header->wsa__RelatesTo = (struct wsa__Relationship*)soap_malloc(soap, sizeof(struct wsa__Relationship)); soap_default_wsa__Relationship(soap, soap->header->wsa__RelatesTo); soap->header->wsa__RelatesTo->__item = soap->header->wsa__MessageID; // must check for duplicate messages if (check_received(soap->header->wsa__MessageID)) { printf("Request message %s already received\n", soap->header->wsa__MessageID); return SOAP_STOP; // don't return response } if (!soap->header->wsa__ReplyTo || !soap->header->wsa__ReplyTo->Address) return soap_sender_fault(soap, "No WS-Addressing ReplyTo address", NULL); soap->header->wsa__To = soap->header->wsa__ReplyTo->Address; soap->header->wsa__MessageID = soap_strdup(soap, soap_int2s(soap, id_count++)) ; soap->header->wsa__Action = "http://genivia.com/udp/echoStringResponse"; *res = str; return SOAP_OK; } ... int ns__sendString(struct soap *soap, char *str) { if (!soap->header) return SOAP_STOP; if (!soap->header->wsa__MessageID) return SOAP_STOP; // must check for duplicate messages if (check_received(soap->header->wsa__MessageID)) return SOAP_STOP; return SOAP_OK; } ... int ns__sendStringResponse(struct soap *soap, char *res) { return SOAP_NO_METHOD; } // we don't expect to serve this message Built steps ----------- A Makefile is included to build client and server applications. To build the example client: make udpclient To build the example server: make udpserver To generate the wsa.h file: wsdl2h -c -t ../../WS/WS-typemap.dat -o wsa.h http://schemas.xmlsoap.org/ws/2004/08/addressing Then manually replace in WS-Addressing.h //gsoapopt cw with //gsoapopt c to ensure .wsdl and .xsd files are generated for your Web service applications. Example run ----------- Start udpserver in a shell window (window 1): $ ./udpserver Execute udpclient in another shell window (window 2): $ ./udpclient Window 1 displays (server): Accepting requests... Request message id1 accepted Response message 1 returned Accepting requests... One-way message id2 accepted and serviced Accepting requests... Window 2 displays (client): UDP server response: hello world! Re-execute the udpclient (window 2): $ ./udpclient Window 1 displays (server): Request message id1 already received SOAP FAULT: SOAP-ENV:Client "Stopped: no response sent" Accepting requests... One-way message id2 already received Accepting requests... Window 2 displays (client): Timeout: message probably already delivered gsoap-2.8.28/gsoap/samples/udp/udpserver.c0000644000175000017500000001500212653650156020023 0ustar ellertellert/* udpserver.c SOAP-over-UDP demo server with zlib compression and WS-Addressing -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2011, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" #include "udp.nsmap" #define MAX_HISTORY (1000) char *received_id[MAX_HISTORY]; int last_received; void init_received(); int check_received(const char *id); int id_count = 1; #define MULTICAST_GROUP (NULL) /* use a group IP such as "225.0.0.37" */ #define PORT 10000 int main() { struct soap soap; init_received(); soap_init1(&soap, SOAP_IO_UDP); /* reuse address */ soap.bind_flags = SO_REUSEADDR; /* bind */ if (!soap_valid_socket(soap_bind(&soap, NULL, PORT, 100))) { soap_print_fault(&soap, stderr); exit(1); } /* optionally join a multicast group */ if (MULTICAST_GROUP) { struct ip_mreq mreq; mreq.imr_multiaddr.s_addr = inet_addr(MULTICAST_GROUP); mreq.imr_interface.s_addr = htonl(INADDR_ANY); if (setsockopt(soap.socket, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0) exit(1); } /* serve requests */ for (;;) { printf("Accepting requests\n"); /* accept (not really needed for UDP, so can be omitted) */ if (!soap_valid_socket(soap_accept(&soap))) { soap_print_fault(&soap, stderr); exit(1); } if (soap_serve(&soap)) soap_print_fault(&soap, stderr); soap_destroy(&soap); soap_end(&soap); } soap_done(&soap); return 0; } void init_received() { int i; for (i = 0; i < MAX_HISTORY; i++) received_id[i] = NULL; last_received = 0; } int check_received(const char *id) { int i; if (!id) return 1; /* Check if Message ID already received */ for (i = 0; i < MAX_HISTORY; i++) { if (received_id[i] && !strcmp(id, received_id[i])) return 1; } if (received_id[last_received]) free(received_id[last_received]); received_id[last_received++] = strdup(id); /* Wrap to overwrite old IDs */ if (last_received >= MAX_HISTORY) last_received = 0; return 0; } int check_header(struct soap *soap) { /* MUST have received a SOAP Header */ if (!soap->header) return soap_sender_fault(soap, "No SOAP header", NULL); /* ... with a Message ID */ if (!soap->header->wsa__MessageID) return soap_sender_fault(soap, "No WS-Addressing MessageID", NULL); soap->header->wsa__RelatesTo = (struct wsa__Relationship*)soap_malloc(soap, sizeof(struct wsa__Relationship)); soap_default_wsa__Relationship(soap, soap->header->wsa__RelatesTo); soap->header->wsa__RelatesTo->__item = soap->header->wsa__MessageID; return SOAP_OK; } int ns__echoString(struct soap *soap, char *str, char **res) { char port[16]; /* Get Header info and setup response Header */ if (check_header(soap)) { printf("Malformed header\n"); return SOAP_FAULT; /* there was a problem */ } /* If message with MessageID already received, ignore it */ if (check_received(soap->header->wsa__MessageID)) { printf("Request message %s already received\n", soap->header->wsa__MessageID); return SOAP_STOP; } /* Get name of client */ getnameinfo((struct sockaddr*)&soap->peer, soap->peerlen, soap->host, sizeof(soap->host), port, 16, NI_DGRAM | NI_NAMEREQD | NI_NUMERICSERV); printf("Request message %s from %s:%s accepted\n", soap->header->wsa__MessageID, soap->host, port); /* Check ReplyTo has Address */ if (!soap->header->wsa__ReplyTo || !soap->header->wsa__ReplyTo->Address) return soap_sender_fault(soap, "No WS-Addressing ReplyTo address", NULL); /* Copy Header info into response Header */ soap->header->wsa__To = soap->header->wsa__ReplyTo->Address; /* Add info to response Header */ soap->header->wsa__MessageID = soap_strdup(soap, soap_int2s(soap, id_count++)); soap->header->wsa__Action = "http://genivia.com/udp/echoStringResponse"; /* Copy request string into response string */ printf("Response message %s returned\n", soap->header->wsa__MessageID); *res = str; return SOAP_OK; } int ns__sendString(struct soap *soap, char *str) { if (check_header(soap)) printf("Malformed header\n"); else if (check_received(soap->header->wsa__MessageID)) printf("One-way message %s already received\n", soap->header->wsa__MessageID); else printf("One-way message %s accepted and serviced\n", soap->header->wsa__MessageID); return SOAP_OK; } int SOAP_ENV__Fault(struct soap *soap, char *faultcode, char *faultstring, char *faultactor, struct SOAP_ENV__Detail *detail, struct SOAP_ENV__Code *SOAP_ENV__Code, struct SOAP_ENV__Reason *SOAP_ENV__Reason, char *SOAP_ENV__Node, char *SOAP_ENV__Role, struct SOAP_ENV__Detail *SOAP_ENV__Detail) { printf("Received one-way SOAP Fault message:\n"); /* populate the fault struct from the operation arguments to print it */ soap_fault(soap); /* SOAP 1.1 */ soap->fault->faultcode = faultcode; soap->fault->faultstring = faultstring; soap->fault->faultactor = faultactor; soap->fault->detail = detail; /* SOAP 1.2 */ soap->fault->SOAP_ENV__Code = SOAP_ENV__Code; soap->fault->SOAP_ENV__Reason = SOAP_ENV__Reason; soap->fault->SOAP_ENV__Node = SOAP_ENV__Node; soap->fault->SOAP_ENV__Role = SOAP_ENV__Role; soap->fault->SOAP_ENV__Detail = SOAP_ENV__Detail; /* set error */ soap->error = SOAP_FAULT; soap_print_fault(soap, stdout); return soap_send_empty_response(soap, SOAP_OK); /* HTTP 202 Accepted */ } gsoap-2.8.28/gsoap/samples/udp/Makefile.am0000644000175000017500000000077012653650156017702 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 noinst_PROGRAMS = udpclient udpserver SOAPHEADER = udp.h include ../Makefile.defines include ../Makefile.c_rules SOAP_NS = udp.nsmap udpclient_SOURCES = udpclient.c $(SOAPHEADER) $(SOAP_C_CLIENT) udpserver_SOURCES = udpserver.c $(SOAPHEADER) $(SOAP_C_SERVER) gsoap-2.8.28/gsoap/samples/template/0000755000175000017500000000000012653650172016663 5ustar ellertellertgsoap-2.8.28/gsoap/samples/template/primes.cpp0000644000175000017500000000556612653650156020704 0ustar ellertellert/* primes.cpp Prime sieve example that demsontrates the use of a user-defined simple_vector container and auto-generated code to display the container contents in XML. Build: > soapcpp2 -CS primes.h > c++ -o primes primes.cpp soapC.cpp stdsoap2.cpp Usage: > ./primes -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2011, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ // include all generated header files: #include "soapH.h" #include int main() { primes p; // also instantiates the 'soap' context p.sieve(100); // sieve primes primes q; q = p; // to show that copy constructor and assignment are OK q.write(); // write primes in XML return 0; } // sieving primes in the simple_vector<> container: void primes::sieve(int n) { prime.clear(); prime.insert(prime.end(), 1); prime.insert(prime.end(), 2); for (int i = 3; i <= n; i += 2) { bool composite = false; for (simple_vector::const_iterator j = prime.begin(); j != prime.end(); ++j) { if (*j != 1 && i % *j == 0) { composite = true; break; } } if (!composite) prime.insert(prime.end(), i); } } // the writer uses the fact that the primes class inherits the context: void primes::write() { soap_set_omode(this, SOAP_XML_INDENT); // show with indentation please soap_write_primes(this, this); // soap_write_prime is generated } // the destructor cleans up the 'soap' context primes::~primes() { soap_destroy(this); soap_end(this); } // we need a dummy namespace table, even though we don't use XML namespaces: SOAP_NMAC struct Namespace namespaces[] = { {NULL, NULL, NULL, NULL} }; gsoap-2.8.28/gsoap/samples/template/Makefile.in0000644000175000017500000004530412653650156020740 0ustar ellertellert# Makefile.in generated by automake 1.14 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = primes$(EXEEXT) DIST_COMMON = $(srcdir)/../Makefile.defines \ $(srcdir)/../Makefile.cpp_rules $(srcdir)/Makefile.in \ $(srcdir)/Makefile.am $(top_srcdir)/mkinstalldirs \ $(top_srcdir)/depcomp subdir = gsoap/samples/template ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = am__objects_2 = soapC.$(OBJEXT) am_primes_OBJECTS = primes.$(OBJEXT) $(am__objects_1) $(am__objects_2) primes_OBJECTS = $(am_primes_OBJECTS) primes_LDADD = $(LDADD) am__DEPENDENCIES_1 = primes_DEPENDENCIES = $(SOAP_CPP_LIB) $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(primes_SOURCES) DIST_SOURCES = $(primes_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ STRIP = @STRIP@ VERSION = @VERSION@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 SOAPHEADER = primes.h SOAP_FLAGS = -CS AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a SOAP_CPP_SRC = $(SOAP_CPP_CLIENT) soapServer.cpp $(SOAP_H_FILES) $(SOAP_NS) LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_CPP_SRC) CLEANFILES = $(SOAP_CPP_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.cpp soap*Proxy.h soap*Proxy.cpp soap*Object.h soap*Service.h soap*Service.cpp soapClient.cpp soapServer.cpp soapClientLib.cpp soapServerLib.cpp *~ SOAP_NS = $(SOAP_NS_DEF) primes_SOURCES = primes.cpp $(SOAPHEADER) simple_vector.h $(SOAP_CPP_CORE) all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_rules $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/template/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/template/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_rules: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) primes$(EXEEXT): $(primes_OBJECTS) $(primes_DEPENDENCIES) $(EXTRA_primes_DEPENDENCIES) @rm -f primes$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(primes_OBJECTS) $(primes_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/primes.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapC.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am $(SOAP_CPP_SRC) : $(SOAPHEADER) $(SOAP) -L -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $(SOAPHEADER) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.28/gsoap/samples/template/simple_vector.h0000644000175000017500000001042512653650156021713 0ustar ellertellert/* simple_vector.h Defines the simple_vector<> template as an example on how to define custom containers that can be auto-serialized in XML with gSOAP. In order for the auto-generated XML serializers to work for templates, we must define at least these methods: void clear() iterator begin() const_iterator begin() const iterator end() const_iterator end() const size_t size() const iterator insert(iterator pos, const_reference val) where begin() gives a forward iterator over the container. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2010, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ // declare the simple_vector<> template: #include template class simple_vector { public: typedef T value_type; typedef value_type * pointer; typedef const value_type * const_pointer; typedef value_type & reference; typedef const value_type & const_reference; typedef pointer iterator; typedef const_pointer const_iterator; protected: iterator head; iterator tail; size_t capacity; public: simple_vector() { head = tail = NULL; } simple_vector(const simple_vector& v) { operator=(v); } ~simple_vector() { if (head) delete[] head; } void clear() { tail = head; } /* the member functions below are required for (de)serialization of templates */ iterator begin() { return head; } const_iterator begin() const { return head; } iterator end() { return tail; } const_iterator end() const { return tail; } size_t size() const { return tail - head; } iterator insert(iterator pos, const_reference val) { if (!head) head = tail = new value_type[capacity = 1]; else if (tail >= head + capacity) { iterator i = head; iterator j = new value_type[capacity *= 2]; iterator k = j; while (i < tail) *k++ = *i++; if (pos) pos = j + (pos - head); tail = j + (tail - head); delete[] head; head = j; } if (pos && pos >= head && pos < tail) { iterator i = tail; iterator j = i - 1; while (j != pos) *i-- = *j--; *pos = val; } else { pos = tail; *tail++ = val; } return pos; } simple_vector& operator=(const simple_vector& v) { head = tail = NULL; capacity = v.capacity; if (v.head) { head = tail = new value_type[capacity]; iterator i = v.head; while (i != v.tail) *tail++ = *i++; } return *this; } }; gsoap-2.8.28/gsoap/samples/template/primes.h0000644000175000017500000000370012653650156020335 0ustar ellertellert/* primes.h Declarations for the soapcpp2 compiler to define a primes class derived from the 'soap' context and to define a simple_vector template. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2010, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ // declare the simple_vector<> template: template class simple_vector; // declare a primes class that inherits a context for SOAP/XML serialization: class primes: struct soap { public: simple_vector prime; // container of ints void sieve(int n); void write(); virtual ~primes(); }; // #include is deferred to the generated code, which will then include the defs: #include "simple_vector.h" // defines simple_vector<> gsoap-2.8.28/gsoap/samples/template/README.txt0000644000175000017500000000551212653650156020366 0ustar ellertellert How container templates are serialized ====================================== In the gSOAP header file (the file processed by soapcpp2) a container template can be declared as follows: template class mycontainer; and mycontainer can be used as needed in the same gSOAP header file to serialize mycontainers of values in XML similar to std::vector: mycontainer ... mycontainer ... etc Compare this to: std::vector Note that the template class code itself should NOT be defined anywhere in the header file, but separately in a header file. You can include this header file with (not import): #include "mycontainer.h" // do not use #import: need mycontainer.h later That is, The "real" container template must be defined in a regular header file and implemented. For XML serialization to work with the template, the template class C container must define at least the following public members: void C::clear() C::iterator C::begin() C::const_iterator C::begin() const C::iterator C::end() C::const_iterator C::end() const size_t C::size() const C::iterator C::insert(C::iterator pos, const T& val) These members allow the gSOAP serializers to read and write the container content from/to XML. Of course, how you define these is up to you. A container can also store just one value, or you can use it to serialize trees and graphs, or even produce and consume content dynamically. You could define the templates as processors of (de)serialized XML content embedded in XML messages. Because the serializers are invoked twice to send a message over HTTP (one pass to compute the content length when chunking is off, then to send the HTTP body), you MUST ensure that the template instance's iterator produces the same content in the two-phase HTTP count/send (or use chunking). Example ------- The example code in this directory is kept small to highlight the basic features. The possibilities are endless. In order to use container templates, you need at least one file that defines the container and its implementation. In the example code here, we defined the container template in: simple_vector.h The application is a prime sieve: primes.cpp which computes primes and stores them in the container. The primes application uses the 'primes' class defined in the gSOAP header file: primes.h which is parsed by soapcpp2 to generate all the 'primes' class serialization routines to dump the XML content of the container, i.e. the list of primes. Note that the 'primes' class is derived from the soap struct, which means that a soap struct is associated with the class to allow a serialization context to be carried along with it. This also minimizes the need to write code to setup the soap context for XML serialization etc. gsoap-2.8.28/gsoap/samples/template/Makefile.am0000644000175000017500000000072212653650156020722 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 noinst_PROGRAMS = primes SOAPHEADER = primes.h SOAP_FLAGS = -CS include ../Makefile.defines include ../Makefile.cpp_rules SOAP_NS = $(SOAP_NS_DEF) primes_SOURCES = primes.cpp $(SOAPHEADER) simple_vector.h $(SOAP_CPP_CORE) gsoap-2.8.28/gsoap/samples/Makefile.c_rules0000644000175000017500000000074112653650156020147 0ustar ellertellert## common Makefile rules for building the C - soap samples ## SOAP_C_SRC = $(SOAP_C_CLIENT) soapServer.c $(SOAP_H_FILES) $(SOAP_NS) $(SOAP_C_SRC) : $(SOAPHEADER) $(SOAP) -cL -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $(SOAPHEADER) LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_C_SRC) CLEANFILES = $(SOAP_C_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.c soapClient.c soapClientLib.c soapServer.c soapServerLib.c *~ gsoap-2.8.28/gsoap/samples/wsa/0000755000175000017500000000000012653650172015642 5ustar ellertellertgsoap-2.8.28/gsoap/samples/wsa/Makefile.in0000644000175000017500000006716512653650156017730 0ustar ellertellert# Makefile.in generated by automake 1.14 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = wsademo$(EXEEXT) DIST_COMMON = $(srcdir)/../Makefile.defines \ $(srcdir)/../Makefile.c_rules $(srcdir)/Makefile.in \ $(srcdir)/Makefile.am $(top_srcdir)/mkinstalldirs \ $(top_srcdir)/depcomp subdir = gsoap/samples/wsa ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = am__objects_2 = wsademo-soapC.$(OBJEXT) am__objects_3 = wsademo-soapClient.$(OBJEXT) $(am__objects_2) am__objects_4 = $(am__objects_3) wsademo-soapServer.$(OBJEXT) \ $(am__objects_1) $(am__objects_1) am_wsademo_OBJECTS = wsademo-wsademo.$(OBJEXT) $(am__objects_1) \ $(am__objects_4) wsademo-wsaapi.$(OBJEXT) wsademo_OBJECTS = $(am_wsademo_OBJECTS) am__DEPENDENCIES_1 = wsademo_DEPENDENCIES = $(SOAP_C_LIB_SSL) $(am__DEPENDENCIES_1) wsademo_LINK = $(CCLD) $(wsademo_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(wsademo_SOURCES) DIST_SOURCES = $(wsademo_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ STRIP = @STRIP@ VERSION = @VERSION@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = foreign 1.4 SOAPHEADER = wsademo.h SOAP_FLAGS = -a AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a SOAP_C_SRC = $(SOAP_C_CLIENT) soapServer.c $(SOAP_H_FILES) $(SOAP_NS) LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_C_SRC) CLEANFILES = $(SOAP_C_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.c soapClient.c soapClientLib.c soapServer.c soapServerLib.c *~ SOAP_NS = wsademo.nsmap wsademo.wsdl wsademo_CFLAGS = -DWITH_OPENSSL -DWITH_GZIP wsademo_SOURCES = wsademo.c $(SOAPHEADER) $(SOAP_C_SRC) ../../plugin/wsaapi.c wsademo_LDADD = $(SOAP_C_LIB_SSL) $(SAMPLE_EXTRA_LIBS) -lssl -lcrypto -lz all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.c_rules $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/wsa/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/wsa/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.c_rules: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) wsademo$(EXEEXT): $(wsademo_OBJECTS) $(wsademo_DEPENDENCIES) $(EXTRA_wsademo_DEPENDENCIES) @rm -f wsademo$(EXEEXT) $(AM_V_CCLD)$(wsademo_LINK) $(wsademo_OBJECTS) $(wsademo_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsademo-soapC.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsademo-soapClient.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsademo-soapServer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsademo-wsaapi.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsademo-wsademo.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` wsademo-wsademo.o: wsademo.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsademo_CFLAGS) $(CFLAGS) -MT wsademo-wsademo.o -MD -MP -MF $(DEPDIR)/wsademo-wsademo.Tpo -c -o wsademo-wsademo.o `test -f 'wsademo.c' || echo '$(srcdir)/'`wsademo.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsademo-wsademo.Tpo $(DEPDIR)/wsademo-wsademo.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='wsademo.c' object='wsademo-wsademo.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsademo_CFLAGS) $(CFLAGS) -c -o wsademo-wsademo.o `test -f 'wsademo.c' || echo '$(srcdir)/'`wsademo.c wsademo-wsademo.obj: wsademo.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsademo_CFLAGS) $(CFLAGS) -MT wsademo-wsademo.obj -MD -MP -MF $(DEPDIR)/wsademo-wsademo.Tpo -c -o wsademo-wsademo.obj `if test -f 'wsademo.c'; then $(CYGPATH_W) 'wsademo.c'; else $(CYGPATH_W) '$(srcdir)/wsademo.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsademo-wsademo.Tpo $(DEPDIR)/wsademo-wsademo.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='wsademo.c' object='wsademo-wsademo.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsademo_CFLAGS) $(CFLAGS) -c -o wsademo-wsademo.obj `if test -f 'wsademo.c'; then $(CYGPATH_W) 'wsademo.c'; else $(CYGPATH_W) '$(srcdir)/wsademo.c'; fi` wsademo-soapClient.o: soapClient.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsademo_CFLAGS) $(CFLAGS) -MT wsademo-soapClient.o -MD -MP -MF $(DEPDIR)/wsademo-soapClient.Tpo -c -o wsademo-soapClient.o `test -f 'soapClient.c' || echo '$(srcdir)/'`soapClient.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsademo-soapClient.Tpo $(DEPDIR)/wsademo-soapClient.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapClient.c' object='wsademo-soapClient.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsademo_CFLAGS) $(CFLAGS) -c -o wsademo-soapClient.o `test -f 'soapClient.c' || echo '$(srcdir)/'`soapClient.c wsademo-soapClient.obj: soapClient.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsademo_CFLAGS) $(CFLAGS) -MT wsademo-soapClient.obj -MD -MP -MF $(DEPDIR)/wsademo-soapClient.Tpo -c -o wsademo-soapClient.obj `if test -f 'soapClient.c'; then $(CYGPATH_W) 'soapClient.c'; else $(CYGPATH_W) '$(srcdir)/soapClient.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsademo-soapClient.Tpo $(DEPDIR)/wsademo-soapClient.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapClient.c' object='wsademo-soapClient.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsademo_CFLAGS) $(CFLAGS) -c -o wsademo-soapClient.obj `if test -f 'soapClient.c'; then $(CYGPATH_W) 'soapClient.c'; else $(CYGPATH_W) '$(srcdir)/soapClient.c'; fi` wsademo-soapC.o: soapC.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsademo_CFLAGS) $(CFLAGS) -MT wsademo-soapC.o -MD -MP -MF $(DEPDIR)/wsademo-soapC.Tpo -c -o wsademo-soapC.o `test -f 'soapC.c' || echo '$(srcdir)/'`soapC.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsademo-soapC.Tpo $(DEPDIR)/wsademo-soapC.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapC.c' object='wsademo-soapC.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsademo_CFLAGS) $(CFLAGS) -c -o wsademo-soapC.o `test -f 'soapC.c' || echo '$(srcdir)/'`soapC.c wsademo-soapC.obj: soapC.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsademo_CFLAGS) $(CFLAGS) -MT wsademo-soapC.obj -MD -MP -MF $(DEPDIR)/wsademo-soapC.Tpo -c -o wsademo-soapC.obj `if test -f 'soapC.c'; then $(CYGPATH_W) 'soapC.c'; else $(CYGPATH_W) '$(srcdir)/soapC.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsademo-soapC.Tpo $(DEPDIR)/wsademo-soapC.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapC.c' object='wsademo-soapC.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsademo_CFLAGS) $(CFLAGS) -c -o wsademo-soapC.obj `if test -f 'soapC.c'; then $(CYGPATH_W) 'soapC.c'; else $(CYGPATH_W) '$(srcdir)/soapC.c'; fi` wsademo-soapServer.o: soapServer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsademo_CFLAGS) $(CFLAGS) -MT wsademo-soapServer.o -MD -MP -MF $(DEPDIR)/wsademo-soapServer.Tpo -c -o wsademo-soapServer.o `test -f 'soapServer.c' || echo '$(srcdir)/'`soapServer.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsademo-soapServer.Tpo $(DEPDIR)/wsademo-soapServer.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapServer.c' object='wsademo-soapServer.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsademo_CFLAGS) $(CFLAGS) -c -o wsademo-soapServer.o `test -f 'soapServer.c' || echo '$(srcdir)/'`soapServer.c wsademo-soapServer.obj: soapServer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsademo_CFLAGS) $(CFLAGS) -MT wsademo-soapServer.obj -MD -MP -MF $(DEPDIR)/wsademo-soapServer.Tpo -c -o wsademo-soapServer.obj `if test -f 'soapServer.c'; then $(CYGPATH_W) 'soapServer.c'; else $(CYGPATH_W) '$(srcdir)/soapServer.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsademo-soapServer.Tpo $(DEPDIR)/wsademo-soapServer.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapServer.c' object='wsademo-soapServer.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsademo_CFLAGS) $(CFLAGS) -c -o wsademo-soapServer.obj `if test -f 'soapServer.c'; then $(CYGPATH_W) 'soapServer.c'; else $(CYGPATH_W) '$(srcdir)/soapServer.c'; fi` wsademo-wsaapi.o: ../../plugin/wsaapi.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsademo_CFLAGS) $(CFLAGS) -MT wsademo-wsaapi.o -MD -MP -MF $(DEPDIR)/wsademo-wsaapi.Tpo -c -o wsademo-wsaapi.o `test -f '../../plugin/wsaapi.c' || echo '$(srcdir)/'`../../plugin/wsaapi.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsademo-wsaapi.Tpo $(DEPDIR)/wsademo-wsaapi.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/wsaapi.c' object='wsademo-wsaapi.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsademo_CFLAGS) $(CFLAGS) -c -o wsademo-wsaapi.o `test -f '../../plugin/wsaapi.c' || echo '$(srcdir)/'`../../plugin/wsaapi.c wsademo-wsaapi.obj: ../../plugin/wsaapi.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsademo_CFLAGS) $(CFLAGS) -MT wsademo-wsaapi.obj -MD -MP -MF $(DEPDIR)/wsademo-wsaapi.Tpo -c -o wsademo-wsaapi.obj `if test -f '../../plugin/wsaapi.c'; then $(CYGPATH_W) '../../plugin/wsaapi.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/wsaapi.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsademo-wsaapi.Tpo $(DEPDIR)/wsademo-wsaapi.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/wsaapi.c' object='wsademo-wsaapi.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsademo_CFLAGS) $(CFLAGS) -c -o wsademo-wsaapi.obj `if test -f '../../plugin/wsaapi.c'; then $(CYGPATH_W) '../../plugin/wsaapi.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/wsaapi.c'; fi` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am $(SOAP_C_SRC) : $(SOAPHEADER) $(SOAP) -cL -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $(SOAPHEADER) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.28/gsoap/samples/wsa/wsademo.c0000644000175000017500000002056712653650156017461 0ustar ellertellert/* wsademo.c WS-Addressing demo service. See the wsademo.h header file for details. gSOAP XML Web services tools Copyright (C) 2000-2008, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under one of the following licenses: GPL, the gSOAP public license, or Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2008, Robert van Engelen, Genivia Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" #include "wsademo.nsmap" #include "wsaapi.h" /* from plugin/wsaapi.h */ /******************************************************************************\ * * Common Constants * \******************************************************************************/ const char *FromAddress = "http://localhost:11000"; const char *ToAddress = "http://localhost:11001"; const char *ReplyToAddress = "http://localhost:11002"; const char *FaultToAddress = "http://localhost:11003"; /* the SOAP and WSA actions, as defined in wsdldemo.h service definitions */ const char *RequestAction = "urn:wsademo/wsademoPort/wsademo"; const char *ResponseAction = "urn:wsademo/wsademoPort/wsademoResponse"; /******************************************************************************\ * * Main * \******************************************************************************/ int main(int argc, char **argv) { struct soap *soap = soap_new1(SOAP_XML_INDENT); soap_register_plugin(soap, soap_wsa); if (argc < 2) { /* no args: act as CGI service over stdin/out */ if (soap_serve(soap)) { soap_print_fault(soap, stderr); soap_print_fault_location(soap, stderr); } } else { int port = atoi(argv[1]); if (port) { /* stand-alone server serving messages over port */ soap->bind_flags = SO_REUSEADDR; if (!soap_valid_socket(soap_bind(soap, NULL, port, 100))) { soap_print_fault(soap, stderr); exit(1); } printf("Server is running\n"); while (soap_valid_socket(soap_accept(soap))) { if (soap_serve(soap)) { soap_print_fault(soap, stderr); soap_print_fault_location(soap, stderr); } printf("Request served\n"); soap_destroy(soap); soap_end(soap); } } else { /* client */ struct ns__wsademoResult res; const char *RequestMessageID; RequestMessageID = soap_wsa_rand_uuid(soap); soap_wsa_request(soap, RequestMessageID, ToAddress, RequestAction); if (argc >= 3) { if (strchr(argv[2], 'f')) soap_wsa_add_From(soap, FromAddress); if (strchr(argv[2], 'r')) soap_wsa_add_ReplyTo(soap, ReplyToAddress); if (strchr(argv[2], 'n')) { #ifdef SOAP_WSA_2005 soap_wsa_add_NoReply(soap); #else printf("'NoReply' feature not available with WS-Addressing 2003/2004\n"); #endif } if (strchr(argv[2], 'e')) soap_wsa_add_FaultTo(soap, FaultToAddress); } if (soap_call_ns__wsademo(soap, ToAddress, NULL, argv[1], &res)) { #ifdef SOAP_WSA_2005 wsa5__FaultCodesType fault; const char *info; if (soap->error == 202) /* HTTP ACCEPTED */ printf("Request was accepted\n"); else if (soap_wsa_check_fault(soap, &fault, &info)) { switch (fault) { case wsa5__EndpointUnavailable: fprintf(stderr, "Server %s is currently not available.\n", info?info:""); break; default: fprintf(stderr, "A wsa fault %d occurred:\n", (int)fault); soap_print_fault(soap, stderr); break; } } else soap_print_fault(soap, stderr); #else if (soap->error == 202) /* HTTP ACCEPTED */ printf("Request was accepted\n"); else soap_print_fault(soap, stderr); #endif } else if (res.out) printf("Result = %s\n", res.out); } } soap_destroy(soap); soap_end(soap); soap_done(soap); free(soap); return 0; } /******************************************************************************\ * * Service Operation of Main Server * \******************************************************************************/ int ns__wsademo(struct soap *soap, char *in, struct ns__wsademoResult *result) { const char *ResponseMessageID; if (soap_wsa_check(soap)) return soap->error; printf("Received '%s'\n", in?in:"(null)"); /* simulate a wsa Fault */ if (in && !strcmp(in, "error")) { printf("Simulating WS-Addressing Fault\n"); #if defined(SOAP_WSA_2005) return soap_wsa_error(soap, SOAP_WSA(EndpointUnavailable), ToAddress); #elif defined(SOAP_WSA_2003) return soap_wsa_error(soap, "Endpoint is not available"); #else return soap_wsa_error(soap, SOAP_WSA(EndpointUnavailable)); #endif } /* simulate a user-defined SOAP Fault */ if (in && !strcmp(in, "fault")) { printf("Simulating Server Operation Fault\n"); return soap_wsa_sender_fault(soap, "The demo service wsademo() operation returned a fault", NULL); } result->out = in; ResponseMessageID = soap_wsa_rand_uuid(soap); return soap_wsa_reply(soap, ResponseMessageID, ResponseAction); } /******************************************************************************\ * * Relayed Response Handler for ReplyTo Server * \******************************************************************************/ int ns__wsademoResult(struct soap *soap, char *out) { if (soap_wsa_check(soap)) return soap_send_empty_response(soap, 500); /* HTTP 500 error */ printf("Received Result = %s\n", out?out:""); return soap_send_empty_response(soap, SOAP_OK); /* HTTP 202 */ } /******************************************************************************\ * * Relayed SOAP-ENV:Fault Handler for FaultTo Server * \******************************************************************************/ int SOAP_ENV__Fault(struct soap *soap, char *faultcode, char *faultstring, char *faultactor, struct SOAP_ENV__Detail *detail, struct SOAP_ENV__Code *SOAP_ENV__Code, struct SOAP_ENV__Reason *SOAP_ENV__Reason, char *SOAP_ENV__Node, char *SOAP_ENV__Role, struct SOAP_ENV__Detail *SOAP_ENV__Detail) { printf("Received Fault:\n"); /* populate the fault struct from the operation arguments to print it */ soap_fault(soap); /* SOAP 1.1 */ soap->fault->faultcode = faultcode; soap->fault->faultstring = faultstring; soap->fault->faultactor = faultactor; soap->fault->detail = detail; /* SOAP 1.2 */ soap->fault->SOAP_ENV__Code = SOAP_ENV__Code; soap->fault->SOAP_ENV__Reason = SOAP_ENV__Reason; soap->fault->SOAP_ENV__Node = SOAP_ENV__Node; soap->fault->SOAP_ENV__Role = SOAP_ENV__Role; soap->fault->SOAP_ENV__Detail = SOAP_ENV__Detail; /* set error */ soap->error = SOAP_FAULT; soap_print_fault(soap, stdout); return soap_send_empty_response(soap, SOAP_OK); /* HTTP 202 Accepted */ } gsoap-2.8.28/gsoap/samples/wsa/wsademo.h0000644000175000017500000001646112653650156017464 0ustar ellertellert/* wsademo.h WS-Addressing demo service. See usage comments below. gSOAP XML Web services tools Copyright (C) 2000-2008, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under one of the following licenses: GPL, the gSOAP public license, or Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2008, Robert van Engelen, Genivia Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- This example application demonstrates server-side and client-side logic for services based on WS-Addressing. At the server side, WS-Addressing enables forwarding/relaying of service responses and faults to other services. At the client side, a relayed response or fault will not be received and an HTTP ACCEPTED (code 202) is delivered instead, assuming that the relay was successful. This header file illustrates two gSOAP soapcpp2 tooling tricks to enable services to accept SOAP Fault messages and to create a one-way service operation to handle responses. Compile with (note the use of soapcpp2 -a to handle http action header): soapcpp2 -a -c -Iimport wsademo.h cc -Iplugin -o wsademo wsademo.c stdsoap2.c soapC.c soapClient.c soapServer.c plugin/wsaapi.c Usage: After compilation, start the main server at port 11001: > ./wsademo 11001 In a new window, start a return service at port 11002: > ./wsademo 11002 This service handles response messages from the main service. In a new window, start a fault service at port 11003: > ./wsademo 11003 This service handles faults from the main service. In a new window, run the client: > ./wsademo hello This example shows the server returning "hello" to the client. > ./wsademo fault This example shows the server returning a SOAP fault to the client: "The demo service wsademo() operation returned a fault". > ./wsademo hello r This example shows the server returning "hello" to the return service. > ./wsademo hello n This example shows the server accepting the message without reply. > ./wsademo error e This example shows the server returning a wsa fault to fault service: "The endpoint is unable to process the message at this time". > ./wsademo fault e This example shows the server returning a SOAP fault to fault service. "The demo service wsademo() operation returned a fault". Note: when the response service is down, the response cannot be relayed and the client (or fault service) will be informed about the failure. */ #import "soap12.h" #import "wsa5.h" //gsoap ns service name: wsademo demonstrates WS-Addressing capabilities //gsoap ns service port: http://localhost:11001 //gsoap ns service type: wsademoPort //gsoap ns service namespace: urn:wsademo /* To generate SOAP-ENV:Fault struct via a one-way service operation. * This allows us to implement a one-way service operation that accepts Faults. * Because a service operation input parameters has a corresponding struct, we * automatically generate the (original) SOAP_ENV__Fault struct on the fly! * Note: it is important to associate the wsa fault action with this operation * as defined below. The action is version-dependent, here we use 2005/08. * This declaration is now part of the wsa5.h imported specification and hereby * removed from this code. //gsoap SOAP_ENV service method-action: Fault http://www.w3.org/2005/08/addressing/soap/fault int SOAP_ENV__Fault ( _QName faultcode, // SOAP 1.1 char *faultstring, // SOAP 1.1 char *faultactor, // SOAP 1.1 struct SOAP_ENV__Detail *detail, // SOAP 1.1 struct SOAP_ENV__Code *SOAP_ENV__Code, // SOAP 1.2 struct SOAP_ENV__Reason *SOAP_ENV__Reason, // SOAP 1.2 char *SOAP_ENV__Node, // SOAP 1.2 char *SOAP_ENV__Role, // SOAP 1.2 struct SOAP_ENV__Detail *SOAP_ENV__Detail, // SOAP 1.2 void ); */ /* For the server side we need to generate a response struct for each * operation to implement one-way service response operations that can be * relayed. Because the service operation has a corresponding struct, we can * use that struct as a response parameter for the second two-way service * operation. This step is required to implement a wsa-capable server. */ //gsoap ns service method-header-part: wsademoResult wsa5__MessageID //gsoap ns service method-header-part: wsademoResult wsa5__RelatesTo //gsoap ns service method-header-part: wsademoResult wsa5__From //gsoap ns service method-header-part: wsademoResult wsa5__ReplyTo //gsoap ns service method-header-part: wsademoResult wsa5__FaultTo //gsoap ns service method-header-part: wsademoResult wsa5__To //gsoap ns service method-header-part: wsademoResult wsa5__Action //gsoap ns service method-action: wsademoResult urn:wsademo/wsademoPort/wsademoResponse //gsoap ns service method-documentation: wsademoResult accepts a string value from a relayed response int ns__wsademoResult(char *out, void); //gsoap ns service method-header-part: wsademo wsa5__MessageID //gsoap ns service method-header-part: wsademo wsa5__RelatesTo //gsoap ns service method-header-part: wsademo wsa5__From //gsoap ns service method-header-part: wsademo wsa5__ReplyTo //gsoap ns service method-header-part: wsademo wsa5__FaultTo //gsoap ns service method-header-part: wsademo wsa5__To //gsoap ns service method-header-part: wsademo wsa5__Action //gsoap ns service method-action: wsademo urn:wsademo/wsademoPort/wsademo //gsoap ns service method-output-action: wsademo urn:wsademo/wsademoPort/wsademoResponse //gsoap ns service method-documentation: wsademo echos a string value and relays the response to the wsa replyTo address (if present) int ns__wsademo(char *in, struct ns__wsademoResult *result); gsoap-2.8.28/gsoap/samples/wsa/README.txt0000644000175000017500000000072512653650156017346 0ustar ellertellert This application demonstrates server-side and client-side logic for services based on WS-Addressing. At the server side, WS-Addressing enables forwarding/relaying of service responses and faults to other services. At the client side, a relayed response or fault will not be received and an HTTP ACCEPTED (code 202) is delivered instead, assuming that the relay was successful. For more details, please see wsademo.h. Instructions about the demo are included therein. gsoap-2.8.28/gsoap/samples/wsa/Makefile.am0000644000175000017500000000111012653650156017671 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = foreign 1.4 noinst_PROGRAMS = wsademo SOAPHEADER = wsademo.h SOAP_FLAGS = -a include ../Makefile.defines include ../Makefile.c_rules SOAP_NS = wsademo.nsmap wsademo.wsdl wsademo_CFLAGS = -DWITH_OPENSSL -DWITH_GZIP wsademo_SOURCES = wsademo.c $(SOAPHEADER) $(SOAP_C_SRC) ../../plugin/wsaapi.c wsademo_LDADD = $(SOAP_C_LIB_SSL) $(SAMPLE_EXTRA_LIBS) -lssl -lcrypto -lz gsoap-2.8.28/gsoap/samples/rss/0000755000175000017500000000000012653650172015657 5ustar ellertellertgsoap-2.8.28/gsoap/samples/rss/Makefile.in0000644000175000017500000004375212653650156017741 0ustar ellertellert# Makefile.in generated by automake 1.14 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = rss$(EXEEXT) DIST_COMMON = $(srcdir)/../Makefile.defines \ $(srcdir)/../Makefile.c_rules $(srcdir)/Makefile.in \ $(srcdir)/Makefile.am $(top_srcdir)/mkinstalldirs \ $(top_srcdir)/depcomp subdir = gsoap/samples/rss ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = am__objects_2 = soapC.$(OBJEXT) am_rss_OBJECTS = rss.$(OBJEXT) $(am__objects_1) $(am__objects_2) rss_OBJECTS = $(am_rss_OBJECTS) rss_LDADD = $(LDADD) am__DEPENDENCIES_1 = rss_DEPENDENCIES = $(SOAP_C_LIB) $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(rss_SOURCES) DIST_SOURCES = $(rss_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ STRIP = @STRIP@ VERSION = @VERSION@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 SOAPHEADER = rss.h AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a SOAP_C_SRC = $(SOAP_C_CLIENT) soapServer.c $(SOAP_H_FILES) $(SOAP_NS) LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_C_SRC) CLEANFILES = $(SOAP_C_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.c soapClient.c soapClientLib.c soapServer.c soapServerLib.c *~ SOAP_NS = $(SOAP_NS_DEF) rss_SOURCES = rss.c $(SOAPHEADER) $(SOAP_C_CORE) all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.c_rules $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/rss/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/rss/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.c_rules: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) rss$(EXEEXT): $(rss_OBJECTS) $(rss_DEPENDENCIES) $(EXTRA_rss_DEPENDENCIES) @rm -f rss$(EXEEXT) $(AM_V_CCLD)$(LINK) $(rss_OBJECTS) $(rss_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rss.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapC.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am $(SOAP_C_SRC) : $(SOAPHEADER) $(SOAP) -cL -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $(SOAPHEADER) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.28/gsoap/samples/rss/rss.h0000644000175000017500000000554012653650156016645 0ustar ellertellert/* rss.h Supports RSS 0.91, 0.92 and 2.0 Retrieve RSS feeds and formats the messages in HTML. Use CSS to format the HTML layout. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap dc schema namespace: http://purl.org/dc/elements/1.1/ /// Container for mixed XML content (XML gSOAP built-in) typedef char *XML; /// element struct channel { char *title; ///< channel title element char *link; ///< channel link element char *language; char *copyright; XML description; ///< description may contain XHTML that is preserved in XML struct image *image; ///< optional image element int __size; ///< an array of items of size __size struct item *item; ///< an array of item elements time_t *dc__date; ///< RSS 2.0 dc schema element (optional) }; /// element struct item { char *title; ///< item title element char *link; ///< item link element XML description; ///< description may contain XHTML that is preserved in XML char *pubDate; time_t *dc__date; ///< RSS 2.0 dc schema element }; /// element struct image { char *title; ///< image title element char *url; ///< image URL element char *link; ///< image link element int width 0:1 = 0; ///< optional, default value = 0 int height 0:1 = 0; ///< optional, default value = 0 XML description; ///< description may contain XHTML that is preserved in XML }; /// element struct rss { @char *version = "2.0"; ///< version attribute (optional, default="2.0") struct channel channel; ///< channel element }; gsoap-2.8.28/gsoap/samples/rss/README.txt0000644000175000017500000000260412653650156017361 0ustar ellertellert RSS Support =========== The gSOAP RSS library supports RSS 0.91, 0.92, and 2.0 Examples -------- An example RSS client and server are included. As a command-line client displays RSS feeds in text format. As a server reformats formats RSS feeds in HTML to be displayed in your web pages via a JavaScript (see below). Usage (client) -------------- > rss [maxitems] URL Prints RSS content in text format. Examples: > rss 10 http://newsrss.bbc.co.uk/rss/newsonline_world_edition/front_page/rss.xml > rss 10 http:// < your_rss_file.xml Usage (server) -------------- Installed as CGI application prints Javascript code to view RSS feeds in Web pages. The Javascript code produced by this application is executed with the following example script embedded in the Web page, e.g. to display BBC news: To control the appearance with cascading style sheets: rss_box the bounding div for the entire display rss_table the table with title, image, and items rss_title the title of the feed and link style if displayed rss_image the image rss_bar the dividing bar rss_item the title of the item rss_desc the description of the item gsoap-2.8.28/gsoap/samples/rss/rsstest.html0000444000175000017500000000052612653650156020257 0ustar ellertellert

BBC World News

gsoap-2.8.28/gsoap/samples/rss/Makefile.am0000644000175000017500000000063712653650156017723 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 noinst_PROGRAMS = rss SOAPHEADER = rss.h include ../Makefile.defines include ../Makefile.c_rules SOAP_NS = $(SOAP_NS_DEF) rss_SOURCES = rss.c $(SOAPHEADER) $(SOAP_C_CORE) gsoap-2.8.28/gsoap/samples/rss/rss.c0000644000175000017500000003120512653650156016635 0ustar ellertellert/* rss.c Supports RSS 0.91, 0.92, and 2.0 Server to retrieve RSS feeds and format the messages in HTML. Compile: $ soapcpp2 -c -CSL rss.h $ cc rss.c stdsoap2.c soapC.c Usage (client): $ rss [maxitems] URL Prints RSS content in text format. Examples: rss 10 http://newsrss.bbc.co.uk/rss/newsonline_world_edition/front_page/rss.xml rss 10 http:// < your_rss_file.xml Usage (server): Installed as CGI application prints Javascript code to view RSS feeds in Web pages. The Javascript code produced by this application is executed with the following example script embedded in the Web page, e.g. to display BBC news: To control the appearance with cascading style sheets: rss_box the bounding div for the entire display rss_table the table with title, image, and items rss_title the title of the feed and link style if displayed rss_image the image of the feed rss_bar the dividing bar between items rss_item the title of the item rss_date the date of the item rss_desc the description of the item -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" #define STR(s) ((s)?(s):"") /* Maximum number of HTTP redirects */ #define MAX_REDIRECTS 10 static void docwrite0(struct soap *soap, const char *s); static void docwrite1(struct soap *soap, const char *s1, const char *s2, const char *s3); static void docwrite2(struct soap *soap, const char *s1, const char *s2, const char *s3, const char *s4, const char *s5); static void docerror(struct soap *soap, const char *s); static void strwrite(struct soap *soop, const char *s); static char *query_key(char *buf, size_t len, char **s); static char *query_val(char *buf, size_t len, char **s); int main(int argc, char **argv) { struct soap *soap = soap_new1(SOAP_C_UTFSTRING); /* preserve UTF8 string content */ const char *endpoint = NULL; struct rss *rss; int maxitems = 10; /* max items to show */ int show_date = 1; /* show date yes/no */ int i; /* RSS has no encoding style */ soap->encodingStyle = NULL; /* get URL of RSS feed or run as CGI app */ if (argc >= 3) { maxitems = atoi(argv[1]); endpoint = argv[2]; } else if (argc >= 2) endpoint = argv[1]; else { char *query = getenv("QUERY_STRING"); /* CGI app: get query string */ char *keybuf; char *valbuf; int len; if (query) { len = strlen(query); keybuf = (char*)soap_malloc(soap, len + 1); valbuf = (char*)soap_malloc(soap, len + 1); while (query) { char *key = query_key(keybuf, len, &query); /* decode next query string key */ char *val = query_val(valbuf, len, &query); /* decode next query string value (if any) */ /* get endpoint and max number of items to display */ if (key && val) { if (!strcmp(key, "rss")) endpoint = soap_strdup(soap, val); else if (!strcmp(key, "max")) maxitems = atoi(val); else if (!strcmp(key, "date")) show_date = (*val == 'y'); } } } if (!endpoint) { docerror(soap, "No RSS URL"); exit(0); } } /* connect and parse HTTP header (max HTTP redirects) */ for (i = 0; i < MAX_REDIRECTS; i++) { /* HTTP GET and parse HTTP header */ if (soap_connect_command(soap, SOAP_GET, endpoint, NULL) || soap_begin_recv(soap)) { if ((soap->error >= 301 && soap->error <= 303) || soap->error == 307) endpoint = soap_strdup(soap, soap->endpoint); /* HTTP redirects */ else { soap_print_fault(soap, stderr); exit(soap->error); } } else break; } /* parse RSS */ rss = soap_get_rss(soap, NULL, "rss", NULL); /* close connection */ soap_end_recv(soap); soap_closesock(soap); if (argc < 2) { /* CGI application: produce Javascript */ if (rss && (!strcmp(rss->version, "0.91") || !strcmp(rss->version, "0.92") || !strcmp(rss->version, "2.0"))) { soap_begin_send(soap); soap->http_content = "application/javascript"; soap_response(soap, SOAP_FILE); /* SOAP_FILE specifies http_content should be used */ docwrite0(soap, "
"); docwrite0(soap, ""); if (rss->channel.title) { if (rss->channel.link) docwrite2(soap, ""); else docwrite1(soap, ""); } if (rss->channel.image && rss->channel.image->url) { struct image *image = rss->channel.image; if (image->link) docwrite2(soap, ""); else if (rss->channel.link) docwrite2(soap, ""); else docwrite1(soap, ""); if (!rss->channel.title && image->title) docwrite1(soap, ""); if (!rss->channel.description && image->description) docwrite1(soap, ""); } if (rss->channel.description) docwrite1(soap, ""); if (rss->channel.copyright) docwrite1(soap, ""); if (rss->channel.__size < maxitems) maxitems = rss->channel.__size; for (i = 0; i < maxitems; i++) { struct item *item = &rss->channel.item[i]; docwrite0(soap, ""); if (item->title) { if (item->link) docwrite2(soap, ""); else docwrite1(soap, ""); if (show_date && item->pubDate) docwrite1(soap, ""); else if (show_date && item->dc__date) docwrite1(soap, ""); if (item->description) docwrite1(soap, ""); } } docwrite0(soap, "
", rss->channel.title, "
", rss->channel.title, "
Channel Image
Channel Image
Channel Image
", image->title, "
", image->description, "
", rss->channel.description, "
", rss->channel.copyright, "
", item->title, "
", item->title, "
Posted ", item->pubDate, "
Posted ", ctime(item->dc__date), "
", item->description, "
"); docwrite0(soap, "
"); soap_end_send(soap); } else { docerror(soap, "No RSS 0.91, 0.92, or 2.0 data"); exit(0); } } else if (rss) { /* Interactive: produce text output */ if (!strcmp(rss->version, "0.91") || !strcmp(rss->version, "0.92") || !strcmp(rss->version, "2.0")) { printf("Title: %s\n", STR(rss->channel.title)); printf("Link: %s\n", STR(rss->channel.link)); printf("Language: %s\n", STR(rss->channel.language)); printf("Description: %s\n", STR(rss->channel.description)); if (rss->channel.image) { printf("Image title: %s\n", STR(rss->channel.image->title)); printf("Image url: %s\n", STR(rss->channel.image->url)); printf("Image link: %s\n", STR(rss->channel.image->link)); printf("Image dimensions: %d x %d\n", rss->channel.image->width, rss->channel.image->height); printf("Image description: %s\n", STR(rss->channel.image->description)); } if (rss->channel.__size < maxitems) maxitems = rss->channel.__size; for (i = 0; i < maxitems; i++) { printf("\n%3d Title: %s\n", i+1, STR(rss->channel.item[i].title)); printf(" Link: %s\n", STR(rss->channel.item[i].link)); printf(" Description: %s\n", STR(rss->channel.item[i].description)); if (rss->channel.item[i].pubDate) printf(" Posted: %s\n", rss->channel.item[i].pubDate); else if (rss->channel.item[i].dc__date) printf(" Posted: %s\n", ctime(rss->channel.item[i].dc__date)); } printf("\nCopyright: %s\n", STR(rss->channel.copyright)); } else fprintf(stderr, "RSS 0.91, 0.92, or 2.0 content expected\n"); } else soap_print_fault(soap, stderr); soap_end(soap); soap_done(soap); soap_free(soap); return 0; } static void docwrite0(struct soap *soap, const char *s) { soap_send3(soap, "document.write(\"", s, "\");\n"); } static void docwrite1(struct soap *soap, const char *s1, const char *s2, const char *s3) { soap_send2(soap, "document.write(\"", s1); strwrite(soap, s2); soap_send2(soap, s3, "\");\n"); } static void docwrite2(struct soap *soap, const char *s1, const char *s2, const char *s3, const char *s4, const char *s5) { soap_send2(soap, "document.write(\"", s1); strwrite(soap, s2); soap_send(soap, s3); strwrite(soap, s4); soap_send2(soap, s5, "\");\n"); } static void docerror(struct soap *soap, const char *s) { soap_begin_send(soap); soap->http_content = "application/javascript"; soap_response(soap, SOAP_FILE); soap_send(soap, s); soap_end_send(soap); } static void strwrite(struct soap *soap, const char *s) { while (*s) { const char *t; for (t = s; *t; t++) if (*t == '\\' || *t == '"' || *t == '\n') break; soap_send_raw(soap, s, t - s); if (*t == '\\') { soap_send(soap, "\\\\"); t++; } else if (*t == '"') { soap_send(soap, "\\\""); t++; } else if (*t == '\n') { t++; if (*t == '\n') { soap_send(soap, "

"); /* two line breaks? Probably a new paragraph was intended */ t++; } else soap_send(soap, " "); } s = t; } } static const char *decode_url(char *buf, size_t len, const char *val) { const char *s; char *t; if (!buf) return NULL; for (s = val; *s; s++) if (*s != ' ' && *s != '=') break; if (*s == '"') { t = buf; s++; while (*s && *s != '"' && --len) *t++ = *s++; *t = '\0'; do s++; while (*s && *s != '&' && *s != '='); } else { t = buf; while (*s && *s != '&' && *s != '=' && --len) { switch (*s) { case '+': *t++ = ' '; case ' ': s++; break; case '%': *t++ = ((s[1] >= 'A' ? (s[1]&0x7) + 9 : s[1] - '0') << 4) + (s[2] >= 'A' ? (s[2]&0x7) + 9 : s[2] - '0'); s += 3; break; default: *t++ = *s++; } } *t = '\0'; } if (*s == '&') s++; return s; } static char *query_key(char *buf, size_t len, char **s) { char *t = *s; if (t && *t) { *s = (char*)decode_url(buf, len, t); return buf; } return *s = NULL; } static char *query_val(char *buf, size_t len, char **s) { char *t = *s; if (t && *t == '=') { *s = (char*)decode_url(buf, len, t); return buf; } return NULL; } /* RSS 0.91 doesn't use namespaces, but RSS 2.0 does, which means that soap->namespace=NULL when serializing RSS 0.91 feeds */ struct Namespace namespaces[] = { { "dc", "http://purl.org/dc/elements/1.1/" }, { NULL, NULL } }; gsoap-2.8.28/gsoap/samples/link/0000755000175000017500000000000012653650156016007 5ustar ellertellertgsoap-2.8.28/gsoap/samples/link/gmt.h0000644000175000017500000000002112653650156016740 0ustar ellertellertt__gmt(time_t*); gsoap-2.8.28/gsoap/samples/link/xmas.h0000644000175000017500000001515112653650156017133 0ustar ellertellert// Reminder: Modify typemap.dat to customize the header file generated by wsdl2h /* xmas.h Generated by wsdl2h 1.2.9l from xmas.wsdl and typemap.dat 2007-12-30 21:53:07 GMT Copyright (C) 2001-2007 Robert van Engelen, Genivia Inc. All Rights Reserved. This part of the software is released under one of the following licenses: GPL or Genivia's license for commercial use. */ /* NOTE: - Compile this file with soapcpp2 to complete the code generation process. - Use soapcpp2 option -I to specify paths for #import To build with STL, 'stlvector.h' is imported from 'import' dir in package. - Use wsdl2h options -c and -s to generate pure C code or C++ code without STL. - Use 'typemap.dat' to control schema namespace bindings and type mappings. It is strongly recommended to customize the names of the namespace prefixes generated by wsdl2h. To do so, modify the prefix bindings in the Namespaces section below and add the modified lines to 'typemap.dat' to rerun wsdl2h. - Use Doxygen (www.doxygen.org) to browse this file. - Use wsdl2h option -l to view the software license terms. DO NOT include this file directly into your project. Include only the soapcpp2-generated headers and source code files. */ //gsoapopt cw /******************************************************************************\ * * * http://www.genivia.com/mashup.wsdl * * * \******************************************************************************/ /******************************************************************************\ * * * Import * * * \******************************************************************************/ /******************************************************************************\ * * * Schema Namespaces * * * \******************************************************************************/ /* NOTE: It is strongly recommended to customize the names of the namespace prefixes generated by wsdl2h. To do so, modify the prefix bindings below and add the modified lines to typemap.dat to rerun wsdl2h: ns1 = "http://www.genivia.com/mashup.wsdl" ns2 = "urn:daystoxmas" */ //gsoap ns2 schema namespace: urn:daystoxmas //gsoap ns2 schema form: qualified /******************************************************************************\ * * * Schema Types * * * \******************************************************************************/ /// Element "urn:daystoxmas":daystoxmas. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "urn:daystoxmas":commingtotown of complexType. /// "urn:daystoxmas":commingtotown is a complexType. struct _ns2__commingtotown { /// Element days of type xs:int. int days 1; ///< Required element. }; /******************************************************************************\ * * * Services * * * \******************************************************************************/ //gsoap ns1 service name: mashup //gsoap ns1 service type: PortType //gsoap ns1 service port: http://www.cs.fsu.edu/~engelen/mashup.cgi //gsoap ns1 service namespace: http://www.genivia.com/mashup.wsdl //gsoap ns1 service transport: http://schemas.xmlsoap.org/soap/http /** @mainpage Service Definitions @section Service_bindings Bindings - @ref mashup */ /** @page mashup Binding "mashup" @section mashup_operations Operations of Binding "mashup" - @ref __ns1__dtx @section mashup_ports Endpoints of Binding "mashup" - http://www.cs.fsu.edu/~engelen/mashup.cgi Note: use wsdl2h option -N to change the service binding prefix name */ /******************************************************************************\ * * * mashup * * * \******************************************************************************/ /******************************************************************************\ * * * __ns1__dtx * * * \******************************************************************************/ /// Operation "__ns1__dtx" of service binding "mashup" /** Operation details: - SOAP document/literal style C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___ns1__dtx( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: _XML ns2__daystoxmas, // response parameters: struct _ns2__commingtotown* ns2__commingtotown ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __ns1__dtx( struct soap *soap, // request parameters: _XML ns2__daystoxmas, // response parameters: struct _ns2__commingtotown* ns2__commingtotown ); @endcode */ //gsoap ns1 service method-style: dtx document //gsoap ns1 service method-encoding: dtx literal //gsoap ns1 service method-action: dtx "" int __ns1__dtx( _XML ns2__daystoxmas, ///< Request parameter struct _ns2__commingtotown* ns2__commingtotown ///< Response parameter ); /* End of xmas.h */ gsoap-2.8.28/gsoap/samples/link/env.h0000644000175000017500000000156012653650156016752 0ustar ellertellert/* env.h Defines SOAP-ENV Header and Fault global structures shared by client and service modules to process SOAP headers and faults when combining multiple client and/or services into one executable. Defines SOAP Fault and SOAP Header structures, which will be shared by client and service modules. The Header structure should contain all fields required by the clients and services. To obtain these, look into the wsdl2h-generated .h files for struct SOAP_ENV__Header and struct SOAP_ENV__Detail. Copy these below to make them globally visible to the gSOAP engine and plugins. Copyright (C) 2000-2003 Robert A. van Engelen, Genivia inc. All Rights Reserved. Compile: soapcpp2 -penv env.h c++ -c envC.cpp c++ -DWITH_NONAMESPACES -c stdsoap2.cpp */ #import "header.h" // optional user-defined headers #import "fault.h" // optional user-defined fault details gsoap-2.8.28/gsoap/samples/link/Makefile0000644000175000017500000000302412653650156017446 0ustar ellertellert# Simple Makefile for C example with muliple client linkage WSDL2H=../../wsdl/wsdl2h GSOAP=../../src/soapcpp2 SOAPH=../../stdsoap2.h SOAPC=../../stdsoap2.c SOAPCPP=../../stdsoap2.cpp SOAPDOMC=../../dom.c SOAPDOMCPP=../../dom.cpp CC=gcc CPP=g++ LIBS= COFLAGS=-O2 CWFLAGS=-Wall CIFLAGS=-I.. -I../.. CMFLAGS= CFLAGS= $(CWFLAGS) $(COFLAGS) $(CIFLAGS) $(CMFLAGS) all: xmas xmas: xmas.c envC.o stdsoap2.o gmtClientLib.o calcClientLib.o xmasServerLib.o $(CC) $(CFLAGS) -o xmas xmas.c envC.o stdsoap2.o gmtClientLib.o calcClientLib.o xmasServerLib.o stdsoap2.o: $(SOAPH) $(SOAPC) $(CC) $(CFLAGS) -DWITH_NONAMESPACES -c $(SOAPC) envC.o: env.h header.h fault.h $(GSOAP) -c -CS -penv env.h $(CC) $(CFLAGS) -c envC.c gmtClientLib.c: gmt.h $(GSOAP) -c -C -n -pgmt gmt.h gmtClientLib.o: gmtClientLib.c $(CC) $(CFLAGS) -c gmtClientLib.c calcClientLib.c:calc.h $(GSOAP) -c -C -n -pcalc calc.h calcClientLib.o:calcClientLib.c $(CC) $(CFLAGS) -c calcClientLib.c xmasServerLib.c:xmas.h $(GSOAP) -c -S -n -pxmas xmas.h xmasServerLib.o:xmasServerLib.c $(CC) $(CFLAGS) -c xmasServerLib.c xmas.h: xmas.wsdl $(WSDL2H) -c xmas.wsdl .PHONY: clean distclean clean: rm -f *.o soapH.h soapStub.h soapC.cpp soapClient.cpp soapServer.cpp soapClientLib.cpp soapServerLib.cpp soap*Proxy.h soap*Proxy.cpp soap*Service.h soap*Service.cpp distclean: rm -f *.o soapH.h soapStub.h soapC.cpp soapClient.cpp soapServer.cpp soapClientLib.cpp soapServerLib.cpp soap*Proxy.h soap*Proxy.cpp soap*Service.h soap*Service.cpp rm -f *.xsd *.xml *.nsmap *.log rm -f xmas gsoap-2.8.28/gsoap/samples/link/xmas.wsdl0000444000175000017500000000426612653650156017660 0ustar ellertellert gsoap-2.8.28/gsoap/samples/link/xmas.c0000644000175000017500000000720412653650156017126 0ustar ellertellert/* xmas.c Example CGI service with multiple C client static linkage To generate non-client-server header and fault handlers: $ soapcpp2 -c -CS -penv env.h The gmt client: $ soapcpp2 -c -C -n -pgmt gmt.h The calc client: $ soapcpp2 -c -C -n -pcalc calc.h The xmas server: $ soapcpp2 -c -S -n -pxmas xmas.h cc -o xmas.cgi xmas.c stdsoap2.c envC.c xmasServerLib.c gmtClientLib.c calcClientLib.c The namespace table must include all proper namespace bindings. When multiple namespace tables are used, then the namespace tables can be reset using soap_set_namespaces() -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "envH.h" #include "gmtH.h" #include "calcH.h" #include "xmasH.h" #include "gmt.nsmap" #include "calc.nsmap" #include "xmas.nsmap" int main() { struct soap soap; soap_init(&soap); soap_set_namespaces(&soap, xmas_namespaces); return xmas_serve(&soap); } /******************************************************************************\ * * Server operation * \******************************************************************************/ int __ns1__dtx(struct soap *soap, _XML x, struct _ns2__commingtotown *response) { struct soap *csoap = soap_copy(soap); struct tm tm; time_t now, xmas; double sec, days; soap_set_namespaces(csoap, gmt_namespaces); if (soap_call_t__gmt(csoap, "http://www.cs.fsu.edu/~engelen/gmtlitserver.cgi", NULL, &now)) { soap_end(csoap); soap_free(csoap); return soap_receiver_fault(soap, "Cannot connect to GMT server", NULL); } tm.tm_sec = 0; tm.tm_min = 0; tm.tm_hour = 0; tm.tm_mday = 25; tm.tm_mon = 11; tm.tm_year = gmtime(&now)->tm_year; /* this year */ tm.tm_isdst = 0; tm.tm_zone = NULL; xmas = soap_timegm(&tm); if (xmas < now) { tm.tm_year++; /* xmas just passed, go to next year */ xmas = soap_timegm(&tm); } sec = difftime(xmas, now); soap_set_namespaces(csoap, calc_namespaces); if (soap_call_ns__add(csoap, NULL, NULL, sec, 86400, &days)) { soap_end(csoap); soap_free(csoap); return soap_receiver_fault(soap, "Cannot connect to calc server", NULL); } soap_end(csoap); soap_free(csoap); response->days = (int)days; return SOAP_OK; } /* dummy namespaces to prevent link errors when not using WITH_NONAMSPACES */ SOAP_NMAC struct Namespace namespaces[] = { {NULL, NULL, NULL, NULL} }; gsoap-2.8.28/gsoap/samples/link/README.txt0000644000175000017500000000330112653650156017502 0ustar ellertellert How to combine multiple clients and servers into one executable? 1. Run wsdl2h once on all WSDLs together. The wsdl2h tool can import multiple WSDL files at once to combine multiple clients and service into one executable. See the samples/mashup and samples/mashup++ examples. 2. Run wsdl2h on each WSDL and use soapcpp2 compiler options. If there is a need to build clients and services from multiple gSOAP header files, then an alternative approach is required demonstrated by the material included in this part of the gSOAP package. The advantages of #1 is that you end up with smaller code, because redundant definitions are eliminated. The advantage of #2 is a more modular setup, thus supporting dynamic linking of separately compiled service modules. However, the build process requires additional steps depending on C or C++. The C++ project build process is simpler, because C++ namespaces can be used to separate the definitions as is shown in the samples/link++ example. The C examples in this directory illustrate how multiple clients and services can be compiled and linked into one executable from multiple gSOAP header files. The C examples accomplish this by static linkage. When linking multiple soapcpp2-generated files, a single file with shared SOAP Header definitions is required. This means that all SOAP Header members must be collected into a single SOAP Header definition. Similar requirements are needed for SOAP Faults (SOAP Fault details to be more precise). So the first step is to generate header and fault handlers: $ soapcpp2 -c -CS -penv env.h Then each file.h is compiled with: $ soapcp2 -c -p .h Compile the ClientLib.c or ServerLib.c code. gsoap-2.8.28/gsoap/samples/link/header.h0000644000175000017500000000120412653650156017405 0ustar ellertellert/* header.h Example SOAP Header definitions, to demonstrate the use of env.h. This file defines the SOAP Header data structure shared by client and service modules Copyright (C) 2000-2002 Robert A. van Engelen. All Rights Reserved. */ //gsoap h schema namespace: http://websrv.cs.fsu.edu/~engelen/h.xsd // h:authentication type of SOAP Header element struct h__authentication { @char *userid; // userid XML attribute @char *passwd; // passwd XML attribute }; // add the above to the SOAP Header elements: struct SOAP_ENV__Header { struct h__authentication *h__credentials; // rendered as XML }; gsoap-2.8.28/gsoap/samples/link/calc.h0000644000175000017500000001041012653650156017056 0ustar ellertellert/* calc.h This is a gSOAP header file with web service definitions. The service operations and type definitions use familiar C/C++ syntax. The following methods are defined by this gSOAP service definition: add(a,b) sub(a,b) mul(a,b) div(a,b) pow(a,b) Compilation in C (see samples/calc): $ soapcpp2 -c calc.h $ cc -o calcclient calcclient.c stdsoap2.c soapC.c soapClient.c $ cc -o calcserver calcserver.c stdsoap2.c soapC.c soapServer.c Compilation in C++ (see samples/calc++): $ soapcpp2 -i calc.h $ cc -o calcclient++ calcclient.cpp stdsoap2.cpp soapC.cpp soapcalcProxy.cpp $ cc -o calcserver++ calcserver.cpp stdsoap2.cpp soapC.cpp soapcalcService.cpp Note that soapcpp2 option -i generates proxy and service classes, which encapsulate the method operations in the class instead of defining them as global functions as in C. The //gsoap directives are used to bind XML namespaces and to define Web service properties: //gsoap service name: //gsoap service style: [rpc|document] //gsoap service encoding: [literal|encoded] //gsoap service namespace: //gsoap service location: Web service operation properties: //gsoap service method-style: [rpc|document] //gsoap service method-encoding: [literal|encoded] //gsoap service method-action: //gsoap service method-documentation: and type schema properties: //gsoap schema namespace: //gsoap schema elementForm: [qualified|unqualified] //gsoap schema attributeForm: [qualified|unqualified] //gsoap schema documentation: //gsoap schema type-documentation: where is an XML namespace prefix, which is used in C/C++ operation names, e.g. ns__add(), and type names, e.g. xsd__int. See the documentation for the full list of //gsoap directives. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap ns service name: calc Simple calculator service //gsoap ns service protocol: SOAP //gsoap ns service style: rpc //gsoap ns service encoding: encoded //gsoap ns service namespace: http://websrv.cs.fsu.edu/~engelen/calc.wsdl //gsoap ns service location: http://websrv.cs.fsu.edu/~engelen/calcserver.cgi //gsoap ns schema namespace: urn:calc //gsoap ns service method-documentation: add Sums two values int ns__add(double a, double b, double *result); //gsoap ns service method-documentation: sub Subtracts two values int ns__sub(double a, double b, double *result); //gsoap ns service method-documentation: mul Multiplies two values int ns__mul(double a, double b, double *result); //gsoap ns service method-documentation: div Divides two values int ns__div(double a, double b, double *result); //gsoap ns service method-documentation: pow Raises a to b int ns__pow(double a, double b, double *result); gsoap-2.8.28/gsoap/samples/link/fault.h0000644000175000017500000000234612653650156017300 0ustar ellertellert/* fault.h Example SOAP Fault detail definitions, to demonstrate the use of env.h. Defines optional SOAP Fault derail data structures Copyright (C) 2000-2004 Robert A. van Engelen. All Rights Reserved. */ /* Add any data structure you want to serialize as part of the SOAP Fault detail element. The detail element '__type' and 'value' fields should be set to transmit data. The fields are set when data of corresponding types are received. For example, we define an of name with a string vector (note the leading _ in the following declaration): class _f__myData { public: std::vector *data; }; To return a fault from your service application: soap_sender_fault(soap, "An error occurred", NULL)); // set soap fault soap->fault->detail = (struct SOAP_ENV__Detail*)soap_malloc(soap, sizeof(struct SOAP_ENV__Detail)); soap->fault->detail->__type = SOAP_TYPE__f__myData; soap->fault->detail->value = soap_new__f__myData(soap, -1); return SOAP_FAULT; In addition, you can modify the SOAP_ENV__Detail struct and add your own set of fields, as in: struct SOAP_ENV__Detail { struct f__myDataType f__myData; int __type; void *value; char *__any; // or use '_XML __any' to store literal XML content }; */ gsoap-2.8.28/gsoap/samples/polytest/0000755000175000017500000000000012653650172016733 5ustar ellertellertgsoap-2.8.28/gsoap/samples/polytest/Makefile.in0000644000175000017500000004610612653650156021011 0ustar ellertellert# Makefile.in generated by automake 1.14 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = polytest.cgi$(EXEEXT) DIST_COMMON = $(srcdir)/../Makefile.defines \ $(srcdir)/../Makefile.cpp_rules $(srcdir)/Makefile.in \ $(srcdir)/Makefile.am $(top_srcdir)/mkinstalldirs \ $(top_srcdir)/depcomp subdir = gsoap/samples/polytest ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = am__objects_2 = soapC.$(OBJEXT) am__objects_3 = soapClient.$(OBJEXT) $(am__objects_2) am__objects_4 = $(am__objects_3) soapServer.$(OBJEXT) $(am__objects_1) \ $(am__objects_1) am_polytest_cgi_OBJECTS = polymorph.$(OBJEXT) $(am__objects_1) \ $(am__objects_4) polytest_cgi_OBJECTS = $(am_polytest_cgi_OBJECTS) polytest_cgi_LDADD = $(LDADD) am__DEPENDENCIES_1 = polytest_cgi_DEPENDENCIES = $(SOAP_CPP_LIB) $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(polytest_cgi_SOURCES) DIST_SOURCES = $(polytest_cgi_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ STRIP = @STRIP@ VERSION = @VERSION@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 SOAPHEADER = polymorph.h AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a SOAP_CPP_SRC = $(SOAP_CPP_CLIENT) soapServer.cpp $(SOAP_H_FILES) $(SOAP_NS) LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_CPP_SRC) CLEANFILES = $(SOAP_CPP_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.cpp soap*Proxy.h soap*Proxy.cpp soap*Object.h soap*Service.h soap*Service.cpp soapClient.cpp soapServer.cpp soapClientLib.cpp soapServerLib.cpp *~ SOAP_NS = polymorph.nsmap polymorph.wsdl polytest_cgi_SOURCES = polymorph.cpp $(SOAPHEADER) $(SOAP_CPP_SRC) all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_rules $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/polytest/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/polytest/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_rules: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) polytest.cgi$(EXEEXT): $(polytest_cgi_OBJECTS) $(polytest_cgi_DEPENDENCIES) $(EXTRA_polytest_cgi_DEPENDENCIES) @rm -f polytest.cgi$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(polytest_cgi_OBJECTS) $(polytest_cgi_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/polymorph.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapC.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapClient.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapServer.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am $(SOAP_CPP_SRC) : $(SOAPHEADER) $(SOAP) -L -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $(SOAPHEADER) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.28/gsoap/samples/polytest/polymorph.cpp0000644000175000017500000001175212653650156021500 0ustar ellertellert/* polymorph.cpp Polymorphic object exchange example. This application is both a client and CGI-based server to demonstrate object exchange (derived types + overriding) Server: install as CGI. Client: invoke from the command line, for example: $ polytest.cgi o $ polytest.cgi s $ polytest.cgi q $ polytest.cgi l Modify the server string below to target your server URL endpoint. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" const char *server = "http://www.cs.fsu.edu/~engelen/polytest2.cgi"; using namespace std; int main(int argc, char **argv) { struct soap soap; ns__polytestResponse r; soap_init(&soap); if (argc <= 1) soap_serve(&soap); // if no args, act as a CGI Web service else { switch (*argv[1]) { case 'o': { ns__Object o("SOAP"); cout << "Sending: "; o.print(); soap_call_ns__polytest(&soap, server, "", &o, r); break; } case 's': { ns__Shape s("Triangle", 3); cout << "Sending: "; s.print(); soap_call_ns__polytest(&soap, server, "", &s, r); break; } case 'q': { ns__Shape q("Cubicle", 2); cout << "Sending: "; q.print(); soap_call_ns__polytest(&soap, server, "", &q, r); break; } case 'l': { ns__List l(4); l[0] = new ns__Object("SOAP"); l[1] = new ns__Shape("Triangle", 3); l[2] = new ns__Square("Cubicle", 2); ns__List l2(1); l[3] = &l2; l2[0] = new ns__Object("End"); cout << "Sending: "; l.print(); soap_call_ns__polytest(&soap, server, "", &l, r); break; } default: fprintf(stderr, "Unknown command\nPlease use 'o', 's', 'q', or 'l'\n"); return -1; } if (soap.error) soap_print_fault(&soap, stderr); else { cout << "Received: "; r.out->print(); } } return 0; } ns__Object::ns__Object() { name = (char*)"Object"; } ns__Object::ns__Object(const char *name) { this->name = (char*)name; } ns__Object::~ns__Object() { } void ns__Object::print() { cout << "Object: " << (name?name:"") << endl; } ns__Shape::ns__Shape() { name = (char*)"Shape"; sides = 0; } ns__Shape::ns__Shape(const char *name, int sides) { this->name = (char*)name; this->sides = sides; } ns__Shape::~ns__Shape() { } void ns__Shape::print() { cout << "Shape: " << (name?name:"") << " sides=" << sides << endl; } ns__Square::ns__Square() { name = (char*)"Square"; ns__Shape::sides = 4; } ns__Square::ns__Square(const char *name, int size) { this->name = (char*)name; this->size = size; ns__Shape::sides = 4; } ns__Square::~ns__Square() { } void ns__Square::print() { cout << "Square: " << (name?name:"") << " size=" << size << endl; } ns__List::ns__List() { __ptr = 0; __size = 0; } ns__List::ns__List(int size) { __ptr = (ns__Object**)malloc(size*sizeof(ns__Object*)); __size = size; } ns__List::~ns__List() { } ns__Object*& ns__List::operator[](int i) { return __ptr[i]; } void ns__List::print() { cout << "List: [" << endl; for (int i = 0; i < __size; i++) __ptr[i]->print(); cout << "]" << endl; } // Web service remote method implementation: int ns__polytest(struct soap *soap, ns__Object *in, struct ns__polytestResponse &result) { result.out = in; return SOAP_OK; } struct Namespace namespaces[] = { {"SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/", "http://www.w3.org/*/soap-envelope", NULL}, {"SOAP-ENC", "http://schemas.xmlsoap.org/soap/encoding/", "http://www.w3.org/*/soap-encoding", NULL}, {"xsi", "http://www.w3.org/2000/XMLSchema-instance", "http://www.w3.org/*/XMLSchema-instance", NULL}, {"xsd", "http://www.w3.org/2000/XMLSchema", "http://www.w3.org/*/XMLSchema", NULL}, {"ns", "urn:copy"}, {NULL, NULL} }; gsoap-2.8.28/gsoap/samples/polytest/polymorph.h0000644000175000017500000000530212653650156021137 0ustar ellertellert/* polymorph.h Polymorphic object exchange example. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap ns service name: polymorph //gsoap ns service style: rpc //gsoap ns service encoding: encoded //gsoap ns service namespace: http://websrv.cs.fsu.edu/~engelen/polymorph.wsdl //gsoap ns service location: http://websrv.cs.fsu.edu/~engelen/polytest.cgi //gsoap ns schema namespace: urn:copy class ns__Object { public: char *name; ns__Object(); ns__Object(const char *name); virtual ~ns__Object(); virtual void print(); }; class ns__Shape: public ns__Object { public: char *name; // test overriding, both the ns__Object:name and ns__Shape:name are encoded int sides; ns__Shape(); ns__Shape(const char *name, int sides); virtual ~ns__Shape(); virtual void print(); }; class ns__Square: public ns__Shape { public: char *name; // test overriding static const int sides = 4; // will not be endoded and decoded int size; ns__Square(); ns__Square(const char *name, int size); virtual ~ns__Square(); virtual void print(); }; class ns__List: public ns__Object // ns__List is a dynamic array { public: ns__Object **__ptr; // array of pointers to objects int __size; ns__List(); ns__List(int size); virtual ~ns__List(); virtual ns__Object*& operator[](int i); virtual void print(); }; ns__polytest(ns__Object *in, struct ns__polytestResponse { ns__Object *out; } &result); gsoap-2.8.28/gsoap/samples/polytest/Makefile.am0000644000175000017500000000072212653650156020772 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 noinst_PROGRAMS = polytest.cgi SOAPHEADER = polymorph.h include ../Makefile.defines include ../Makefile.cpp_rules SOAP_NS = polymorph.nsmap polymorph.wsdl polytest_cgi_SOURCES = polymorph.cpp $(SOAPHEADER) $(SOAP_CPP_SRC) gsoap-2.8.28/gsoap/samples/Makefile.in0000644000175000017500000004437712653650156017136 0ustar ellertellert# Makefile.in generated by automake 1.14 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = gsoap/samples DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ STRIP = @STRIP@ VERSION = @VERSION@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = foreign 1.4 SUBDIRS = \ autotest calc calc++ databinding dime dom oneway oneway++ \ factory factorytest \ gmt googleapi hello httpcookies lu magic mashup mashup++ \ chaining chaining++ primes \ mtom mtom-stream polytest roll router rss ssl template udp varparam \ wsa wsrm wsse xml-rpc-json rest all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic cscopelist-am ctags ctags-am \ distclean distclean-generic distclean-tags distdir dvi dvi-am \ html html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags tags-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.28/gsoap/samples/hello/0000755000175000017500000000000012653650170016151 5ustar ellertellertgsoap-2.8.28/gsoap/samples/hello/Makefile.in0000644000175000017500000004730312653650156020231 0ustar ellertellert# Makefile.in generated by automake 1.14 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = helloclient$(EXEEXT) helloserver$(EXEEXT) DIST_COMMON = $(srcdir)/../Makefile.defines \ $(srcdir)/../Makefile.cpp_rules $(srcdir)/Makefile.in \ $(srcdir)/Makefile.am $(top_srcdir)/mkinstalldirs \ $(top_srcdir)/depcomp subdir = gsoap/samples/hello ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = am__objects_2 = soapC.$(OBJEXT) am__objects_3 = soapClient.$(OBJEXT) $(am__objects_2) am_helloclient_OBJECTS = helloclient.$(OBJEXT) $(am__objects_1) \ $(am__objects_3) helloclient_OBJECTS = $(am_helloclient_OBJECTS) am__DEPENDENCIES_1 = helloclient_DEPENDENCIES = $(SOAP_CPP_LIB) $(am__DEPENDENCIES_1) am__objects_4 = soapServer.$(OBJEXT) $(am__objects_2) am_helloserver_OBJECTS = helloserver.$(OBJEXT) $(am__objects_1) \ $(am__objects_4) helloserver_OBJECTS = $(am_helloserver_OBJECTS) helloserver_DEPENDENCIES = $(SOAP_CPP_LIB) $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(helloclient_SOURCES) $(helloserver_SOURCES) DIST_SOURCES = $(helloclient_SOURCES) $(helloserver_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ STRIP = @STRIP@ VERSION = @VERSION@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 SOAPHEADER = hello.h AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a SOAP_CPP_SRC = $(SOAP_CPP_CLIENT) soapServer.cpp $(SOAP_H_FILES) $(SOAP_NS) LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_CPP_SRC) CLEANFILES = $(SOAP_CPP_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.cpp soap*Proxy.h soap*Proxy.cpp soap*Object.h soap*Service.h soap*Service.cpp soapClient.cpp soapServer.cpp soapClientLib.cpp soapServerLib.cpp *~ SOAP_NS = h.nsmap h.wsdl helloclient_SOURCES = helloclient.cpp $(SOAPHEADER) $(SOAP_CPP_CLIENT) helloclient_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) helloserver_SOURCES = helloserver.cpp $(SOAPHEADER) $(SOAP_CPP_SERVER) helloserver_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_rules $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/hello/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/hello/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_rules: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) helloclient$(EXEEXT): $(helloclient_OBJECTS) $(helloclient_DEPENDENCIES) $(EXTRA_helloclient_DEPENDENCIES) @rm -f helloclient$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(helloclient_OBJECTS) $(helloclient_LDADD) $(LIBS) helloserver$(EXEEXT): $(helloserver_OBJECTS) $(helloserver_DEPENDENCIES) $(EXTRA_helloserver_DEPENDENCIES) @rm -f helloserver$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(helloserver_OBJECTS) $(helloserver_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/helloclient.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/helloserver.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapC.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapClient.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapServer.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am $(SOAP_CPP_SRC) : $(SOAPHEADER) $(SOAP) -L -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $(SOAPHEADER) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.28/gsoap/samples/hello/helloclient.cpp0000644000175000017500000000026612653650156021167 0ustar ellertellert#include "soapH.h" #include "h.nsmap" int main() { char *s; soap_call_h__hello(soap_new(), "http://www.cs.fsu.edu/~engelen/hellolitserver.cgi", "", s); return !printf("%s\n", s); } gsoap-2.8.28/gsoap/samples/hello/helloserver.cpp0000644000175000017500000000027112653650156021213 0ustar ellertellert#include "soapH.h" #include "h.nsmap" int main() { return soap_serve(soap_new()); } int h__hello(struct soap *soap, char *&s) { s = soap_strdup(soap, "Hello World!"); return SOAP_OK; } gsoap-2.8.28/gsoap/samples/hello/README.txt0000644000175000017500000000103112653650156017646 0ustar ellertellertThis directory contains a "one-liner" service: gSOAP Web service and client applications that are only one line long (not counting the usual #includes). The oneliners are small, but they can do a number of useful things. The complete list of oneliners is: samples/gmt return current time in GMT samples/hello "Hello World!" samples/roll rolling a die You can use the client programs right away after compilation since they connect to our server. To run the server examples you have to install them as CGI applications. gsoap-2.8.28/gsoap/samples/hello/Makefile.am0000644000175000017500000000120612653650156020210 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 noinst_PROGRAMS = helloclient helloserver SOAPHEADER = hello.h include ../Makefile.defines include ../Makefile.cpp_rules SOAP_NS = h.nsmap h.wsdl helloclient_SOURCES = helloclient.cpp $(SOAPHEADER) $(SOAP_CPP_CLIENT) helloclient_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) helloserver_SOURCES = helloserver.cpp $(SOAPHEADER) $(SOAP_CPP_SERVER) helloserver_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) gsoap-2.8.28/gsoap/samples/hello/hello.h0000644000175000017500000000002212653650156017423 0ustar ellertellerth__hello(char*&); gsoap-2.8.28/gsoap/samples/varparam/0000755000175000017500000000000012653650172016661 5ustar ellertellertgsoap-2.8.28/gsoap/samples/varparam/Makefile.in0000644000175000017500000004571412653650156020743 0ustar ellertellert# Makefile.in generated by automake 1.14 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = varparam$(EXEEXT) DIST_COMMON = $(srcdir)/../Makefile.defines \ $(srcdir)/../Makefile.cpp_rules $(srcdir)/Makefile.in \ $(srcdir)/Makefile.am $(top_srcdir)/mkinstalldirs \ $(top_srcdir)/depcomp subdir = gsoap/samples/varparam ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = am__objects_2 = soapC.$(OBJEXT) am__objects_3 = soapClient.$(OBJEXT) $(am__objects_2) am_varparam_OBJECTS = varparam.$(OBJEXT) $(am__objects_1) \ $(am__objects_3) soapServer.$(OBJEXT) varparam_OBJECTS = $(am_varparam_OBJECTS) varparam_LDADD = $(LDADD) am__DEPENDENCIES_1 = varparam_DEPENDENCIES = $(SOAP_CPP_LIB) $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(varparam_SOURCES) DIST_SOURCES = $(varparam_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ STRIP = @STRIP@ VERSION = @VERSION@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 SOAPHEADER = varparam.h AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a SOAP_CPP_SRC = $(SOAP_CPP_CLIENT) soapServer.cpp $(SOAP_H_FILES) $(SOAP_NS) LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_CPP_SRC) CLEANFILES = $(SOAP_CPP_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.cpp soap*Proxy.h soap*Proxy.cpp soap*Object.h soap*Service.h soap*Service.cpp soapClient.cpp soapServer.cpp soapClientLib.cpp soapServerLib.cpp *~ SOAP_NS = varparam.nsmap varparam.wsdl varparam_SOURCES = varparam.cpp $(SOAPHEADER) $(SOAP_CPP_CLIENT) soapServer.cpp all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_rules $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/varparam/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/varparam/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_rules: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) varparam$(EXEEXT): $(varparam_OBJECTS) $(varparam_DEPENDENCIES) $(EXTRA_varparam_DEPENDENCIES) @rm -f varparam$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(varparam_OBJECTS) $(varparam_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapC.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapClient.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapServer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/varparam.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am $(SOAP_CPP_SRC) : $(SOAPHEADER) $(SOAP) -L -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $(SOAPHEADER) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.28/gsoap/samples/varparam/README.txt0000644000175000017500000000047612653650156020370 0ustar ellertellertSOAP RPC variable polymorphic parameters example. Although rarely used, the SOAP RPC encoding specification supports variable parameter lists. In addition, parameters can be polymorphic. Both features are demonstrated in this example. Because dynamic type binding is required, this feature is only supported in C++. gsoap-2.8.28/gsoap/samples/varparam/varparam.h0000644000175000017500000002003412653650156020644 0ustar ellertellert/* varparam.h Example use of variable parameter lists with the full XML schema type hierarchy implemented as a C++ class hierarchy. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap ns service name: varparam //gsoap ns service style: rpc //gsoap ns service encoding: encoded //gsoap ns service namespace: urn:varparam //gsoap ns service location: http://websrv.cs.fsu.edu/~engelen/varparam.cgi #include extern class std::ostream; // transient (external) type class xsd__anyType { char *__item; // default is string, also to hold mixed-content when receiving typeless XML struct soap *soap; // points to current gSOAP environment that created this object xsd__anyType(); virtual ~xsd__anyType(); virtual xsd__anyType*& operator[](int i); virtual void print(std::ostream &s) const; }; class xsd__anySimpleType: xsd__anyType { xsd__anySimpleType(); virtual ~xsd__anySimpleType(); virtual void print(std::ostream &s) const; }; class xsd__anyURI: xsd__anySimpleType { xsd__anyURI(); virtual ~xsd__anyURI(); xsd__anyURI(char *s); virtual void print(std::ostream &s) const; }; class xsd__boolean: xsd__anySimpleType { bool __item; xsd__boolean(); virtual ~xsd__boolean(); xsd__boolean(bool b); virtual void print(std::ostream &s) const; }; class xsd__date: xsd__anySimpleType // requires "CCYY-MM-DD" string values { xsd__date(); virtual ~xsd__date(); xsd__date(char *s); virtual void print(std::ostream &s) const; }; class xsd__dateTime: xsd__anySimpleType { time_t __item; // remove time_t __item to use char*__item with "CCYY-MM-DDThh:mm:ssi" for dates outside the range 1902-2037 xsd__dateTime(); virtual ~xsd__dateTime(); xsd__dateTime(time_t t); virtual void print(std::ostream &s) const; }; class xsd__double: xsd__anySimpleType { double __item; xsd__double(); virtual ~xsd__double(); xsd__double(double d); virtual void print(std::ostream &s) const; }; class xsd__duration: xsd__anySimpleType // requires "PnYnMnDTnHnMnS" string values { xsd__duration(); virtual ~xsd__duration(); xsd__duration(char *s); virtual void print(std::ostream &s) const; }; class xsd__float: xsd__anySimpleType { float __item; xsd__float(); virtual ~xsd__float(); xsd__float(float f); virtual void print(std::ostream &s) const; }; class xsd__time: xsd__anySimpleType // requires "hh:mm:ss" string values { xsd__time(); virtual ~xsd__time(); xsd__time(char *s); virtual void print(std::ostream &s) const; }; class xsd__string: xsd__anySimpleType { xsd__string(); xsd__string(char *s); virtual ~xsd__string(); virtual void print(std::ostream &s) const; }; class xsd__normalizedString: xsd__string // requires strings without CR, LF, TAB { xsd__normalizedString(); xsd__normalizedString(char *s); virtual ~xsd__normalizedString(); virtual void print(std::ostream &s) const; }; class xsd__token: xsd__normalizedString // requires strings without CR, LF, TAB, no leading/trailing spaces, and no sequences of more than one space { xsd__token(); xsd__token(char *s); virtual ~xsd__token(); virtual void print(std::ostream &s) const; }; class xsd__decimal: xsd__anySimpleType // requires decimal as string values, can use double, but possible loss of precision { xsd__decimal(); virtual ~xsd__decimal(); xsd__decimal(char *s); virtual void print(std::ostream &s) const; }; class xsd__integer: xsd__decimal // requires integer as string values, can use loong long, but possible loss of data { xsd__integer(); virtual ~xsd__integer(); xsd__integer(char *s); virtual void print(std::ostream &s) const; }; class xsd__nonPositiveInteger: xsd__integer // requires non-positive integer as string values { xsd__nonPositiveInteger(); virtual ~xsd__nonPositiveInteger(); xsd__nonPositiveInteger(char *s); virtual void print(std::ostream &s) const; }; class xsd__negativeInteger: xsd__nonPositiveInteger // requires negative integer as string values { xsd__negativeInteger(); virtual ~xsd__negativeInteger(); xsd__negativeInteger(char *s); virtual void print(std::ostream &s) const; }; class xsd__nonNegativeInteger: xsd__integer // requires non-negative integer as string values { xsd__nonNegativeInteger(); virtual ~xsd__nonNegativeInteger(); xsd__nonNegativeInteger(char *s); virtual void print(std::ostream &s) const; }; class xsd__positiveInteger: xsd__nonNegativeInteger // requires positive integer as string values { xsd__positiveInteger(); virtual ~xsd__positiveInteger(); xsd__positiveInteger(char *s); virtual void print(std::ostream &s) const; }; class xsd__long: xsd__integer { LONG64 __item; xsd__long(); virtual ~xsd__long(); xsd__long(LONG64 ll); virtual void print(std::ostream &s) const; }; class xsd__int: xsd__long { int __item; xsd__int(); virtual ~xsd__int(); xsd__int(int i); virtual void print(std::ostream &s) const; }; class xsd__short: xsd__int { short __item; xsd__short(); virtual ~xsd__short(); xsd__short(short h); virtual void print(std::ostream &s) const; }; class xsd__byte: xsd__short { char __item; xsd__byte(); virtual ~xsd__byte(); xsd__byte(char c); virtual void print(std::ostream &s) const; }; class xsd__unsignedLong: xsd__nonNegativeInteger { ULONG64 __item; xsd__unsignedLong(); virtual ~xsd__unsignedLong(); xsd__unsignedLong(ULONG64 ull); virtual void print(std::ostream &s) const; }; class xsd__unsignedInt: xsd__unsignedLong { unsigned int __item; xsd__unsignedInt(); virtual ~xsd__unsignedInt(); xsd__unsignedInt(unsigned int ui); virtual void print(std::ostream &s) const; }; class xsd__unsignedShort: xsd__unsignedInt { unsigned short __item; xsd__unsignedShort(); virtual ~xsd__unsignedShort(); xsd__unsignedShort(unsigned short uh); virtual void print(std::ostream &s) const; }; class xsd__unsignedByte: xsd__unsignedShort { unsigned char __item; xsd__unsignedByte(); virtual ~xsd__unsignedByte(); xsd__unsignedByte(unsigned char uc); virtual void print(std::ostream &s) const; }; class xsd__base64Binary: xsd__anySimpleType { unsigned char *__ptr; int __size; xsd__base64Binary(); virtual ~xsd__base64Binary(); xsd__base64Binary(char *s); virtual void print(std::ostream &s) const; }; class xsd__hexBinary: xsd__anySimpleType { unsigned char *__ptr; int __size; xsd__hexBinary(); virtual ~xsd__hexBinary(); xsd__hexBinary(char *s); virtual void print(std::ostream &s) const; }; class array: xsd__anyType { xsd__anyType **__ptr; int __size; array(); virtual ~array(); array(int n); virtual xsd__anyType*& operator[](int i); virtual void print(std::ostream &s) const; }; int ns__varStringParamTest(int __size, char **param, int &return_); int ns__varPolyParamTest(int __size, xsd__anyType **param, struct ns__varPolyParamTestResponse { int __size; xsd__anyType **param; } &out); gsoap-2.8.28/gsoap/samples/varparam/Makefile.am0000644000175000017500000000073012653650156020717 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 noinst_PROGRAMS = varparam SOAPHEADER = varparam.h include ../Makefile.defines include ../Makefile.cpp_rules SOAP_NS = varparam.nsmap varparam.wsdl varparam_SOURCES = varparam.cpp $(SOAPHEADER) $(SOAP_CPP_CLIENT) soapServer.cpp gsoap-2.8.28/gsoap/samples/varparam/varparam.cpp0000644000175000017500000002720612653650156021207 0ustar ellertellert/* varparam.cpp Example use of variable parameter lists with the full XML schema type hierarchy implemented as a C++ class hierarchy. Demonstrates the use of variable number of parameters and polymorphic parameters. The 'trick' is to use __size parameters. The __size fields can be used in structs/classes to embed arrays. Because a request message of a remote method is essentially a struct, the use of __size in parameters of a method has the effect of sending a variable number of parameters. Run the executable as client from the command line with one argument to test the polymorphic parameter exchange. Run with more arguments to send the arguments as a variable parameter list to the server. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" #include "varparam.nsmap" const char *endpoint = "http://websrv.cs.fsu.edu/~engelen/varparam.cgi"; #define N 100 // max number of parameters int main(int argc, char **argv) { struct soap soap; struct ns__varPolyParamTestResponse r; int n; xsd__anyType *p[N]; // array of polymorphic parameters soap_init(&soap); if (argc < 2) { soap_serve(&soap); soap_destroy(&soap); soap_end(&soap); return 0; } if (argc < 3) { p[0] = new xsd__anyURI((char*)endpoint); p[1] = new xsd__string(argv[1]); p[2] = new xsd__boolean(true); p[3] = new xsd__dateTime(time(NULL)); p[4] = new xsd__double(1234567.89); p[5] = new xsd__base64Binary((char*)"encoded in base64"); p[6] = new xsd__hexBinary((char*)"encoded in hex"); p[7] = new array(4); (*p[7])[0] = new xsd__int(7); (*p[7])[1] = NULL; (*p[7])[2] = new xsd__token((char*)"x"); (*p[7])[3] = p[1]; p[8] = p[1]; n = 9; // actual number of parameters if (soap_call_ns__varPolyParamTest(&soap, endpoint, "", n, p, r)) soap_print_fault(&soap, stderr); else { std::cout << "Server has echoed:" << std::endl; for (int i = 0; i < r.__size; i++) r.param[i]->print(std::cout); std::cout << std::endl; } for (int i = 0; i < n; i++) delete p[i]; } else { if (soap_call_ns__varStringParamTest(&soap, endpoint, "", argc, argv, n)) soap_print_fault(&soap, stderr); else printf("Server has responded to %d strings\n", n); } soap_destroy(&soap); soap_end(&soap); soap_done(&soap); return 0; } //////////////////////////////////////////////////////////////////////////////// // // Remote method implementations // //////////////////////////////////////////////////////////////////////////////// int ns__varStringParamTest(struct soap *soap, int __size, char **param, int &return_) { return_ = __size; return SOAP_OK; } int ns__varPolyParamTest(struct soap *soap, int __size, xsd__anyType **param, struct ns__varPolyParamTestResponse &out) { out.__size = __size; out.param = param; return SOAP_OK; } //////////////////////////////////////////////////////////////////////////////// // // XSD schema class hierarchy // //////////////////////////////////////////////////////////////////////////////// xsd__anyType::xsd__anyType() { soap = NULL; // This will be set by gSOAP environment later (upon deserialization or calling soap_new_X() } xsd__anyType::~xsd__anyType() { soap_unlink(soap, this); // Let gSOAP not deallocate this object again if this object was explicitly removed } xsd__anyType*& xsd__anyType::operator[](int i) { static xsd__anyType *p = this; // trick: we don't expect the operator to be applied, but we need a method return p; } void xsd__anyType::print(std::ostream &s) const { s << ""; } xsd__anySimpleType::xsd__anySimpleType() { } xsd__anySimpleType::~xsd__anySimpleType() { } void xsd__anySimpleType::print(std::ostream &s) const { s << ""; } xsd__anyURI::xsd__anyURI() { } xsd__anyURI::~xsd__anyURI() { } xsd__anyURI::xsd__anyURI(char *s) { __item = s; } void xsd__anyURI::print(std::ostream &s) const { s << ""; } xsd__boolean::xsd__boolean() { } xsd__boolean::~xsd__boolean() { } xsd__boolean::xsd__boolean(bool b) { __item = b; } void xsd__boolean::print(std::ostream &s) const { s << ""; } xsd__date::xsd__date() { } xsd__date::~xsd__date() { } xsd__date::xsd__date(char *s) { __item = s; } void xsd__date::print(std::ostream &s) const { s << ""; } xsd__dateTime::xsd__dateTime() { } xsd__dateTime::~xsd__dateTime() { } xsd__dateTime::xsd__dateTime(time_t t) { __item = t; } void xsd__dateTime::print(std::ostream &s) const { s << ""; } xsd__double::xsd__double() { } xsd__double::~xsd__double() { } xsd__double::xsd__double(double d) { __item = d; } void xsd__double::print(std::ostream &s) const { s << ""; } xsd__duration::xsd__duration() { } xsd__duration::~xsd__duration() { } xsd__duration::xsd__duration(char *s) { __item = s; } void xsd__duration::print(std::ostream &s) const { s << ""; } xsd__float::xsd__float() { } xsd__float::~xsd__float() { } xsd__float::xsd__float(float f) { __item = f; } void xsd__float::print(std::ostream &s) const { s << ""; } xsd__time::xsd__time() { } xsd__time::~xsd__time() { } xsd__time::xsd__time(char *s) { __item = s; } void xsd__time::print(std::ostream &s) const { s << ""; } xsd__string::xsd__string() { } xsd__string::~xsd__string() { } xsd__string::xsd__string(char *s) { __item = s; } void xsd__string::print(std::ostream &s) const { s << ""; } xsd__normalizedString::xsd__normalizedString() { } xsd__normalizedString::~xsd__normalizedString() { } xsd__normalizedString::xsd__normalizedString(char *s) { __item = s; } void xsd__normalizedString::print(std::ostream &s) const { s << ""; } xsd__token::xsd__token() { } xsd__token::~xsd__token() { } xsd__token::xsd__token(char *s) { __item = s; } void xsd__token::print(std::ostream &s) const { s << ""; } xsd__decimal::xsd__decimal() { } xsd__decimal::~xsd__decimal() { } xsd__decimal::xsd__decimal(char *s) { __item = s; } void xsd__decimal::print(std::ostream &s) const { s << ""; } xsd__integer::xsd__integer() { } xsd__integer::~xsd__integer() { } xsd__integer::xsd__integer(char *s) { __item = s; } void xsd__integer::print(std::ostream &s) const { s << ""; } xsd__nonPositiveInteger::xsd__nonPositiveInteger() { } xsd__nonPositiveInteger::~xsd__nonPositiveInteger() { } xsd__nonPositiveInteger::xsd__nonPositiveInteger(char *s) { __item = s; } void xsd__nonPositiveInteger::print(std::ostream &s) const { s << ""; } xsd__negativeInteger::xsd__negativeInteger() { } xsd__negativeInteger::~xsd__negativeInteger() { } xsd__negativeInteger::xsd__negativeInteger(char *s) { __item = s; } void xsd__negativeInteger::print(std::ostream &s) const { s << ""; } xsd__nonNegativeInteger::xsd__nonNegativeInteger() { } xsd__nonNegativeInteger::~xsd__nonNegativeInteger() { } xsd__nonNegativeInteger::xsd__nonNegativeInteger(char *s) { __item = s; } void xsd__nonNegativeInteger::print(std::ostream &s) const { s << ""; } xsd__positiveInteger::xsd__positiveInteger() { } xsd__positiveInteger::~xsd__positiveInteger() { } xsd__positiveInteger::xsd__positiveInteger(char *s) { __item = s; } void xsd__positiveInteger::print(std::ostream &s) const { s << ""; } xsd__long::xsd__long() { } xsd__long::~xsd__long() { } xsd__long::xsd__long(LONG64 ll) { __item = ll; } void xsd__long::print(std::ostream &s) const { s << ""; } xsd__int::xsd__int() { } xsd__int::~xsd__int() { } xsd__int::xsd__int(int i) { __item = i; } void xsd__int::print(std::ostream &s) const { s << ""; } xsd__short::xsd__short() { } xsd__short::~xsd__short() { } xsd__short::xsd__short(short h) { __item = h; } void xsd__short::print(std::ostream &s) const { s << ""; } xsd__byte::xsd__byte() { } xsd__byte::~xsd__byte() { } xsd__byte::xsd__byte(char c) { __item = c; } void xsd__byte::print(std::ostream &s) const { s << ""; } xsd__unsignedLong::xsd__unsignedLong() { } xsd__unsignedLong::~xsd__unsignedLong() { } xsd__unsignedLong::xsd__unsignedLong(ULONG64 ull) { __item = ull; } void xsd__unsignedLong::print(std::ostream &s) const { s << ""; } xsd__unsignedInt::xsd__unsignedInt() { } xsd__unsignedInt::~xsd__unsignedInt() { } xsd__unsignedInt::xsd__unsignedInt(unsigned int ui) { __item = ui; } void xsd__unsignedInt::print(std::ostream &s) const { s << ""; } xsd__unsignedShort::xsd__unsignedShort() { } xsd__unsignedShort::~xsd__unsignedShort() { } xsd__unsignedShort::xsd__unsignedShort(unsigned short uh) { __item = uh; } void xsd__unsignedShort::print(std::ostream &s) const { s << ""; } xsd__unsignedByte::xsd__unsignedByte() { } xsd__unsignedByte::~xsd__unsignedByte() { } xsd__unsignedByte::xsd__unsignedByte(unsigned char uc) { __item = uc; } void xsd__unsignedByte::print(std::ostream &s) const { s << ""; } xsd__base64Binary::xsd__base64Binary() { } xsd__base64Binary::~xsd__base64Binary() { } xsd__base64Binary::xsd__base64Binary(char *s) { __size = strlen(s)+1; __ptr = (unsigned char*)s; } void xsd__base64Binary::print(std::ostream &s) const { s << ""; } xsd__hexBinary::xsd__hexBinary() { } xsd__hexBinary::~xsd__hexBinary() { } xsd__hexBinary::xsd__hexBinary(char *s) { __size = strlen(s)+1; __ptr = (unsigned char*)s; } void xsd__hexBinary::print(std::ostream &s) const { s << ""; } array::array() { } array::~array() { } array::array(int n) { __size = n; __ptr = (xsd__anyType**)soap_malloc(soap, n*sizeof(xsd__anyType*)); } xsd__anyType*& array::operator[](int i) { return __ptr[i]; } void array::print(std::ostream &s) const { s << "print(s); else s << "<[none]>"; s << ">"; } gsoap-2.8.28/gsoap/samples/wsse/0000755000175000017500000000000012653650172016031 5ustar ellertellertgsoap-2.8.28/gsoap/samples/wsse/Makefile.in0000644000175000017500000012064012653650156020103 0ustar ellertellert# Makefile.in generated by automake 1.14 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = wssedemo$(EXEEXT) wsselite$(EXEEXT) DIST_COMMON = $(srcdir)/../Makefile.defines \ $(srcdir)/../Makefile.c_rules $(srcdir)/Makefile.in \ $(srcdir)/Makefile.am $(top_srcdir)/mkinstalldirs \ $(top_srcdir)/depcomp subdir = gsoap/samples/wsse ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = am__objects_2 = wssedemo-soapC.$(OBJEXT) am__objects_3 = wssedemo-soapClient.$(OBJEXT) $(am__objects_2) am__objects_4 = $(am__objects_3) wssedemo-soapServer.$(OBJEXT) \ $(am__objects_1) $(am__objects_1) am_wssedemo_OBJECTS = wssedemo-wssedemo.$(OBJEXT) $(am__objects_1) \ $(am__objects_4) wssedemo-stdsoap2.$(OBJEXT) \ wssedemo-dom.$(OBJEXT) wssedemo-wsseapi.$(OBJEXT) \ wssedemo-smdevp.$(OBJEXT) wssedemo-mecevp.$(OBJEXT) wssedemo_OBJECTS = $(am_wssedemo_OBJECTS) am__DEPENDENCIES_1 = wssedemo_DEPENDENCIES = $(am__DEPENDENCIES_1) wssedemo_LINK = $(CCLD) $(wssedemo_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ am__objects_5 = soapC.$(OBJEXT) am__objects_6 = soapClient.$(OBJEXT) $(am__objects_5) am__objects_7 = $(am__objects_6) soapServer.$(OBJEXT) $(am__objects_1) \ $(am__objects_1) am_wsselite_OBJECTS = wsselite.$(OBJEXT) $(am__objects_1) \ $(am__objects_7) stdsoap2.$(OBJEXT) wsseapi-lite.$(OBJEXT) wsselite_OBJECTS = $(am_wsselite_OBJECTS) wsselite_DEPENDENCIES = $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(wssedemo_SOURCES) $(wsselite_SOURCES) DIST_SOURCES = $(wssedemo_SOURCES) $(wsselite_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ STRIP = @STRIP@ VERSION = @VERSION@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = foreign 1.4 SOAPHEADER = wssedemo.h AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a SOAP_C_SRC = $(SOAP_C_CLIENT) soapServer.c $(SOAP_H_FILES) $(SOAP_NS) LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_C_SRC) CLEANFILES = $(SOAP_C_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.c soapClient.c soapClientLib.c soapServer.c soapServerLib.c *~ SOAP_NS = wssedemo.nsmap wssedemo_CFLAGS = -DWITH_DOM -DWITH_OPENSSL -DWITH_GZIP wssedemo_SOURCES = wssedemo.c $(SOAPHEADER) $(SOAP_C_SRC) ../../stdsoap2.c ../../dom.c ../../plugin/wsseapi.c ../../plugin/smdevp.c ../../plugin/mecevp.c wssedemo_LDADD = $(SAMPLE_EXTRA_LIBS) -lssl -lcrypto -lz wsselite_SOURCES = wsselite.c $(SOAPHEADER) $(SOAP_C_SRC) ../../stdsoap2.c ../../plugin/wsseapi-lite.c wsselite_LDADD = $(SAMPLE_EXTRA_LIBS) all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.c_rules $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/wsse/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/wsse/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.c_rules: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) wssedemo$(EXEEXT): $(wssedemo_OBJECTS) $(wssedemo_DEPENDENCIES) $(EXTRA_wssedemo_DEPENDENCIES) @rm -f wssedemo$(EXEEXT) $(AM_V_CCLD)$(wssedemo_LINK) $(wssedemo_OBJECTS) $(wssedemo_LDADD) $(LIBS) wsselite$(EXEEXT): $(wsselite_OBJECTS) $(wsselite_DEPENDENCIES) $(EXTRA_wsselite_DEPENDENCIES) @rm -f wsselite$(EXEEXT) $(AM_V_CCLD)$(LINK) $(wsselite_OBJECTS) $(wsselite_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapC.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapClient.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapServer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stdsoap2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsseapi-lite.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wssedemo-dom.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wssedemo-mecevp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wssedemo-smdevp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wssedemo-soapC.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wssedemo-soapClient.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wssedemo-soapServer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wssedemo-stdsoap2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wssedemo-wsseapi.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wssedemo-wssedemo.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsselite.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` wssedemo-wssedemo.o: wssedemo.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -MT wssedemo-wssedemo.o -MD -MP -MF $(DEPDIR)/wssedemo-wssedemo.Tpo -c -o wssedemo-wssedemo.o `test -f 'wssedemo.c' || echo '$(srcdir)/'`wssedemo.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wssedemo-wssedemo.Tpo $(DEPDIR)/wssedemo-wssedemo.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='wssedemo.c' object='wssedemo-wssedemo.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -c -o wssedemo-wssedemo.o `test -f 'wssedemo.c' || echo '$(srcdir)/'`wssedemo.c wssedemo-wssedemo.obj: wssedemo.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -MT wssedemo-wssedemo.obj -MD -MP -MF $(DEPDIR)/wssedemo-wssedemo.Tpo -c -o wssedemo-wssedemo.obj `if test -f 'wssedemo.c'; then $(CYGPATH_W) 'wssedemo.c'; else $(CYGPATH_W) '$(srcdir)/wssedemo.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wssedemo-wssedemo.Tpo $(DEPDIR)/wssedemo-wssedemo.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='wssedemo.c' object='wssedemo-wssedemo.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -c -o wssedemo-wssedemo.obj `if test -f 'wssedemo.c'; then $(CYGPATH_W) 'wssedemo.c'; else $(CYGPATH_W) '$(srcdir)/wssedemo.c'; fi` wssedemo-soapClient.o: soapClient.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -MT wssedemo-soapClient.o -MD -MP -MF $(DEPDIR)/wssedemo-soapClient.Tpo -c -o wssedemo-soapClient.o `test -f 'soapClient.c' || echo '$(srcdir)/'`soapClient.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wssedemo-soapClient.Tpo $(DEPDIR)/wssedemo-soapClient.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapClient.c' object='wssedemo-soapClient.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -c -o wssedemo-soapClient.o `test -f 'soapClient.c' || echo '$(srcdir)/'`soapClient.c wssedemo-soapClient.obj: soapClient.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -MT wssedemo-soapClient.obj -MD -MP -MF $(DEPDIR)/wssedemo-soapClient.Tpo -c -o wssedemo-soapClient.obj `if test -f 'soapClient.c'; then $(CYGPATH_W) 'soapClient.c'; else $(CYGPATH_W) '$(srcdir)/soapClient.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wssedemo-soapClient.Tpo $(DEPDIR)/wssedemo-soapClient.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapClient.c' object='wssedemo-soapClient.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -c -o wssedemo-soapClient.obj `if test -f 'soapClient.c'; then $(CYGPATH_W) 'soapClient.c'; else $(CYGPATH_W) '$(srcdir)/soapClient.c'; fi` wssedemo-soapC.o: soapC.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -MT wssedemo-soapC.o -MD -MP -MF $(DEPDIR)/wssedemo-soapC.Tpo -c -o wssedemo-soapC.o `test -f 'soapC.c' || echo '$(srcdir)/'`soapC.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wssedemo-soapC.Tpo $(DEPDIR)/wssedemo-soapC.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapC.c' object='wssedemo-soapC.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -c -o wssedemo-soapC.o `test -f 'soapC.c' || echo '$(srcdir)/'`soapC.c wssedemo-soapC.obj: soapC.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -MT wssedemo-soapC.obj -MD -MP -MF $(DEPDIR)/wssedemo-soapC.Tpo -c -o wssedemo-soapC.obj `if test -f 'soapC.c'; then $(CYGPATH_W) 'soapC.c'; else $(CYGPATH_W) '$(srcdir)/soapC.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wssedemo-soapC.Tpo $(DEPDIR)/wssedemo-soapC.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapC.c' object='wssedemo-soapC.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -c -o wssedemo-soapC.obj `if test -f 'soapC.c'; then $(CYGPATH_W) 'soapC.c'; else $(CYGPATH_W) '$(srcdir)/soapC.c'; fi` wssedemo-soapServer.o: soapServer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -MT wssedemo-soapServer.o -MD -MP -MF $(DEPDIR)/wssedemo-soapServer.Tpo -c -o wssedemo-soapServer.o `test -f 'soapServer.c' || echo '$(srcdir)/'`soapServer.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wssedemo-soapServer.Tpo $(DEPDIR)/wssedemo-soapServer.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapServer.c' object='wssedemo-soapServer.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -c -o wssedemo-soapServer.o `test -f 'soapServer.c' || echo '$(srcdir)/'`soapServer.c wssedemo-soapServer.obj: soapServer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -MT wssedemo-soapServer.obj -MD -MP -MF $(DEPDIR)/wssedemo-soapServer.Tpo -c -o wssedemo-soapServer.obj `if test -f 'soapServer.c'; then $(CYGPATH_W) 'soapServer.c'; else $(CYGPATH_W) '$(srcdir)/soapServer.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wssedemo-soapServer.Tpo $(DEPDIR)/wssedemo-soapServer.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapServer.c' object='wssedemo-soapServer.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -c -o wssedemo-soapServer.obj `if test -f 'soapServer.c'; then $(CYGPATH_W) 'soapServer.c'; else $(CYGPATH_W) '$(srcdir)/soapServer.c'; fi` wssedemo-stdsoap2.o: ../../stdsoap2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -MT wssedemo-stdsoap2.o -MD -MP -MF $(DEPDIR)/wssedemo-stdsoap2.Tpo -c -o wssedemo-stdsoap2.o `test -f '../../stdsoap2.c' || echo '$(srcdir)/'`../../stdsoap2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wssedemo-stdsoap2.Tpo $(DEPDIR)/wssedemo-stdsoap2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../stdsoap2.c' object='wssedemo-stdsoap2.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -c -o wssedemo-stdsoap2.o `test -f '../../stdsoap2.c' || echo '$(srcdir)/'`../../stdsoap2.c wssedemo-stdsoap2.obj: ../../stdsoap2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -MT wssedemo-stdsoap2.obj -MD -MP -MF $(DEPDIR)/wssedemo-stdsoap2.Tpo -c -o wssedemo-stdsoap2.obj `if test -f '../../stdsoap2.c'; then $(CYGPATH_W) '../../stdsoap2.c'; else $(CYGPATH_W) '$(srcdir)/../../stdsoap2.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wssedemo-stdsoap2.Tpo $(DEPDIR)/wssedemo-stdsoap2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../stdsoap2.c' object='wssedemo-stdsoap2.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -c -o wssedemo-stdsoap2.obj `if test -f '../../stdsoap2.c'; then $(CYGPATH_W) '../../stdsoap2.c'; else $(CYGPATH_W) '$(srcdir)/../../stdsoap2.c'; fi` wssedemo-dom.o: ../../dom.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -MT wssedemo-dom.o -MD -MP -MF $(DEPDIR)/wssedemo-dom.Tpo -c -o wssedemo-dom.o `test -f '../../dom.c' || echo '$(srcdir)/'`../../dom.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wssedemo-dom.Tpo $(DEPDIR)/wssedemo-dom.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../dom.c' object='wssedemo-dom.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -c -o wssedemo-dom.o `test -f '../../dom.c' || echo '$(srcdir)/'`../../dom.c wssedemo-dom.obj: ../../dom.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -MT wssedemo-dom.obj -MD -MP -MF $(DEPDIR)/wssedemo-dom.Tpo -c -o wssedemo-dom.obj `if test -f '../../dom.c'; then $(CYGPATH_W) '../../dom.c'; else $(CYGPATH_W) '$(srcdir)/../../dom.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wssedemo-dom.Tpo $(DEPDIR)/wssedemo-dom.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../dom.c' object='wssedemo-dom.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -c -o wssedemo-dom.obj `if test -f '../../dom.c'; then $(CYGPATH_W) '../../dom.c'; else $(CYGPATH_W) '$(srcdir)/../../dom.c'; fi` wssedemo-wsseapi.o: ../../plugin/wsseapi.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -MT wssedemo-wsseapi.o -MD -MP -MF $(DEPDIR)/wssedemo-wsseapi.Tpo -c -o wssedemo-wsseapi.o `test -f '../../plugin/wsseapi.c' || echo '$(srcdir)/'`../../plugin/wsseapi.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wssedemo-wsseapi.Tpo $(DEPDIR)/wssedemo-wsseapi.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/wsseapi.c' object='wssedemo-wsseapi.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -c -o wssedemo-wsseapi.o `test -f '../../plugin/wsseapi.c' || echo '$(srcdir)/'`../../plugin/wsseapi.c wssedemo-wsseapi.obj: ../../plugin/wsseapi.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -MT wssedemo-wsseapi.obj -MD -MP -MF $(DEPDIR)/wssedemo-wsseapi.Tpo -c -o wssedemo-wsseapi.obj `if test -f '../../plugin/wsseapi.c'; then $(CYGPATH_W) '../../plugin/wsseapi.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/wsseapi.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wssedemo-wsseapi.Tpo $(DEPDIR)/wssedemo-wsseapi.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/wsseapi.c' object='wssedemo-wsseapi.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -c -o wssedemo-wsseapi.obj `if test -f '../../plugin/wsseapi.c'; then $(CYGPATH_W) '../../plugin/wsseapi.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/wsseapi.c'; fi` wssedemo-smdevp.o: ../../plugin/smdevp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -MT wssedemo-smdevp.o -MD -MP -MF $(DEPDIR)/wssedemo-smdevp.Tpo -c -o wssedemo-smdevp.o `test -f '../../plugin/smdevp.c' || echo '$(srcdir)/'`../../plugin/smdevp.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wssedemo-smdevp.Tpo $(DEPDIR)/wssedemo-smdevp.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/smdevp.c' object='wssedemo-smdevp.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -c -o wssedemo-smdevp.o `test -f '../../plugin/smdevp.c' || echo '$(srcdir)/'`../../plugin/smdevp.c wssedemo-smdevp.obj: ../../plugin/smdevp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -MT wssedemo-smdevp.obj -MD -MP -MF $(DEPDIR)/wssedemo-smdevp.Tpo -c -o wssedemo-smdevp.obj `if test -f '../../plugin/smdevp.c'; then $(CYGPATH_W) '../../plugin/smdevp.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/smdevp.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wssedemo-smdevp.Tpo $(DEPDIR)/wssedemo-smdevp.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/smdevp.c' object='wssedemo-smdevp.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -c -o wssedemo-smdevp.obj `if test -f '../../plugin/smdevp.c'; then $(CYGPATH_W) '../../plugin/smdevp.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/smdevp.c'; fi` wssedemo-mecevp.o: ../../plugin/mecevp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -MT wssedemo-mecevp.o -MD -MP -MF $(DEPDIR)/wssedemo-mecevp.Tpo -c -o wssedemo-mecevp.o `test -f '../../plugin/mecevp.c' || echo '$(srcdir)/'`../../plugin/mecevp.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wssedemo-mecevp.Tpo $(DEPDIR)/wssedemo-mecevp.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/mecevp.c' object='wssedemo-mecevp.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -c -o wssedemo-mecevp.o `test -f '../../plugin/mecevp.c' || echo '$(srcdir)/'`../../plugin/mecevp.c wssedemo-mecevp.obj: ../../plugin/mecevp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -MT wssedemo-mecevp.obj -MD -MP -MF $(DEPDIR)/wssedemo-mecevp.Tpo -c -o wssedemo-mecevp.obj `if test -f '../../plugin/mecevp.c'; then $(CYGPATH_W) '../../plugin/mecevp.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/mecevp.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wssedemo-mecevp.Tpo $(DEPDIR)/wssedemo-mecevp.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/mecevp.c' object='wssedemo-mecevp.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -c -o wssedemo-mecevp.obj `if test -f '../../plugin/mecevp.c'; then $(CYGPATH_W) '../../plugin/mecevp.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/mecevp.c'; fi` stdsoap2.o: ../../stdsoap2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT stdsoap2.o -MD -MP -MF $(DEPDIR)/stdsoap2.Tpo -c -o stdsoap2.o `test -f '../../stdsoap2.c' || echo '$(srcdir)/'`../../stdsoap2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/stdsoap2.Tpo $(DEPDIR)/stdsoap2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../stdsoap2.c' object='stdsoap2.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o stdsoap2.o `test -f '../../stdsoap2.c' || echo '$(srcdir)/'`../../stdsoap2.c stdsoap2.obj: ../../stdsoap2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT stdsoap2.obj -MD -MP -MF $(DEPDIR)/stdsoap2.Tpo -c -o stdsoap2.obj `if test -f '../../stdsoap2.c'; then $(CYGPATH_W) '../../stdsoap2.c'; else $(CYGPATH_W) '$(srcdir)/../../stdsoap2.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/stdsoap2.Tpo $(DEPDIR)/stdsoap2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../stdsoap2.c' object='stdsoap2.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o stdsoap2.obj `if test -f '../../stdsoap2.c'; then $(CYGPATH_W) '../../stdsoap2.c'; else $(CYGPATH_W) '$(srcdir)/../../stdsoap2.c'; fi` wsseapi-lite.o: ../../plugin/wsseapi-lite.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT wsseapi-lite.o -MD -MP -MF $(DEPDIR)/wsseapi-lite.Tpo -c -o wsseapi-lite.o `test -f '../../plugin/wsseapi-lite.c' || echo '$(srcdir)/'`../../plugin/wsseapi-lite.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsseapi-lite.Tpo $(DEPDIR)/wsseapi-lite.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/wsseapi-lite.c' object='wsseapi-lite.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o wsseapi-lite.o `test -f '../../plugin/wsseapi-lite.c' || echo '$(srcdir)/'`../../plugin/wsseapi-lite.c wsseapi-lite.obj: ../../plugin/wsseapi-lite.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT wsseapi-lite.obj -MD -MP -MF $(DEPDIR)/wsseapi-lite.Tpo -c -o wsseapi-lite.obj `if test -f '../../plugin/wsseapi-lite.c'; then $(CYGPATH_W) '../../plugin/wsseapi-lite.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/wsseapi-lite.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsseapi-lite.Tpo $(DEPDIR)/wsseapi-lite.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/wsseapi-lite.c' object='wsseapi-lite.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o wsseapi-lite.obj `if test -f '../../plugin/wsseapi-lite.c'; then $(CYGPATH_W) '../../plugin/wsseapi-lite.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/wsseapi-lite.c'; fi` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am $(SOAP_C_SRC) : $(SOAPHEADER) $(SOAP) -cL -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $(SOAPHEADER) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.28/gsoap/samples/wsse/wssedemo.h0000644000175000017500000002715612653650156020045 0ustar ellertellert// Reminder: Modify typemap.dat to customize the header file generated by wsdl2h /* wssedemo.h Generated by wsdl2h 1.2.6 from wssedemo.wsdl and typemap.dat 2005-08-26 12:54:17 GMT Copyright (C) 2001-2005 Robert van Engelen, Genivia Inc. All Rights Reserved. This part of the software is released under one of the following licenses: GPL or Genivia's license for commercial use. */ /* NOTE: - Compile this file with soapcpp2 to complete the code generation process. - Use soapcpp2 option -I to specify paths for #import To build with STL, 'stlvector.h' is imported from 'import' dir in package. - Use wsdl2h options -c and -s to generate pure C code or C++ code without STL. - Use 'typemap.dat' to control schema namespace bindings and type mappings. It is strongly recommended to customize the names of the namespace prefixes generated by wsdl2h. To do so, modify the prefix bindings in the Namespaces section below and add the modified lines to 'typemap.dat' to rerun wsdl2h. - Use Doxygen (www.doxygen.org) to browse this file. - Use wsdl2h option -l to view the software license terms. */ /******************************************************************************\ * * * http://www.genivia.com/wsdl/wssetest.wsdl * * * \******************************************************************************/ //gsoapopt cw /******************************************************************************\ * * * Import * * * \******************************************************************************/ #import "wsse.h" // wsse = /******************************************************************************\ * * * Schema Namespaces * * * \******************************************************************************/ /******************************************************************************\ * * * Schema Types * * * \******************************************************************************/ // Imported element "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":Security declared as _wsse__Security /******************************************************************************\ * * * Services * * * \******************************************************************************/ //gsoap ns1 service name: wssetest //gsoap ns1 service type: wssetestPortType //gsoap ns1 service port: http://localhost:80 //gsoap ns1 service namespace: http://www.genivia.com/schemas/wssetest.xsd //gsoap ns1 service transport: http://schemas.xmlsoap.org/soap/http /** @mainpage wssetest Definitions @section wssetest_bindings Bindings - @ref wssetest */ /** @page wssetest Binding "wssetest" @section wssetest_operations Operations of Binding "wssetest" - @ref ns1__add - @ref ns1__sub - @ref ns1__mul - @ref ns1__div @section wssetest_ports Endpoints of Binding "wssetest" - http://localhost:80 */ /******************************************************************************\ * * * SOAP Header * * * \******************************************************************************/ /** The SOAP Header is part of the gSOAP context and its content is accessed through the soap.header variable. You may have to set the soap.actor variable to serialize SOAP Headers with SOAP-ENV:actor or SOAP-ENV:role attributes. */ struct SOAP_ENV__Header { mustUnderstand // must be understood by receiver _wsse__Security *wsse__Security ; ///< TODO: Check element type (imported type) }; /******************************************************************************\ * * * wssetest * * * \******************************************************************************/ /******************************************************************************\ * * * ns1__add * * * \******************************************************************************/ /// Operation "ns1__add" of service binding "wssetest" /** Operation details: - SOAP RPC encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" - Request message has mandatory header part(s): - wsse__Security - Response message has mandatory header part(s): - wsse__Security C stub function (defined in soapClient.c[pp]): @code int soap_call_ns1__add(struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: double a, double b, // response parameters: double *result ); @endcode */ //gsoap ns1 service method-style: add rpc //gsoap ns1 service method-encoding: add http://schemas.xmlsoap.org/soap/encoding/ //gsoap ns1 service method-action: add "" //gsoap ns1 service method-input-header-part: add wsse__Security //gsoap ns1 service method-output-header-part: add wsse__Security int ns1__add( double a, double b, double *result ///< response parameter ); /******************************************************************************\ * * * ns1__sub * * * \******************************************************************************/ /// Operation "ns1__sub" of service binding "wssetest" /** Operation details: - SOAP RPC encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" - Request message has mandatory header part(s): - wsse__Security - Response message has mandatory header part(s): - wsse__Security C stub function (defined in soapClient.c[pp]): @code int soap_call_ns1__sub(struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: double a, double b, // response parameters: double *result ); @endcode */ //gsoap ns1 service method-style: sub rpc //gsoap ns1 service method-encoding: sub http://schemas.xmlsoap.org/soap/encoding/ //gsoap ns1 service method-action: sub "" //gsoap ns1 service method-input-header-part: sub wsse__Security //gsoap ns1 service method-output-header-part: sub wsse__Security int ns1__sub( double a, double b, double *result ///< response parameter ); /******************************************************************************\ * * * ns1__mul * * * \******************************************************************************/ /// Operation "ns1__mul" of service binding "wssetest" /** Operation details: - SOAP RPC encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" - Request message has mandatory header part(s): - wsse__Security - Response message has mandatory header part(s): - wsse__Security C stub function (defined in soapClient.c[pp]): @code int soap_call_ns1__mul(struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: double a, double b, // response parameters: double *result ); @endcode */ //gsoap ns1 service method-style: mul rpc //gsoap ns1 service method-encoding: mul http://schemas.xmlsoap.org/soap/encoding/ //gsoap ns1 service method-action: mul "" //gsoap ns1 service method-input-header-part: mul wsse__Security //gsoap ns1 service method-output-header-part: mul wsse__Security int ns1__mul( double a, double b, double *result ///< response parameter ); /******************************************************************************\ * * * ns1__div * * * \******************************************************************************/ /// Operation "ns1__div" of service binding "wssetest" /** Operation details: - SOAP RPC encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" - Request message has mandatory header part(s): - wsse__Security - Response message has mandatory header part(s): - wsse__Security C stub function (defined in soapClient.c[pp]): @code int soap_call_ns1__div(struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: double a, double b, // response parameters: double *result ); @endcode */ //gsoap ns1 service method-style: div rpc //gsoap ns1 service method-encoding: div http://schemas.xmlsoap.org/soap/encoding/ //gsoap ns1 service method-action: div "" //gsoap ns1 service method-input-header-part: div wsse__Security //gsoap ns1 service method-output-header-part: div wsse__Security int ns1__div( double a, double b, double *result ///< response parameter ); /* End of wssedemo.h */ gsoap-2.8.28/gsoap/samples/wsse/wssedemo.c0000644000175000017500000006524612653650156020042 0ustar ellertellert/* wssedemo.c WS-Security plugin demo application. See comments below. gSOAP XML Web services tools Copyright (C) 2000-2008, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- This application demonstrates the use of the wsse plugin. Compile: wsdl2h -c -t typemap.dat wssedemo.wsdl soapcpp2 -I import wssedemo.h cc -DWITH_OPENSSL -DWITH_DOM -o wssedemo wssedemo.c wsseapi.c smdevp.c mecevp.c dom.c stdsoap2.c soapC.c soapClient.c soapServer.c -lcrypto -lssl Other required files: server.pem server private key and certificate (do not distrubute) servercert.pem server public certificate for public distribution cacert.pem root CA certificate for public distribution Note: The wsse.h, wsu.h, ds.h, xenc.h c14n.h files are located in 'import'. The smdevp.*, mecevp.* and wsseapi.* files are located in 'plugin'. Usage: wssedemo abcdehiknstxyz [port] with options: a sign the ns1:add operation in the SOAP Body (use option b to remove Body sig) b don't sign the entire SOAP Body (signed by default) c enable chunked HTTP d use triple DES secret key for encryption instead of RSA e encrypt the SOAP Body f encrypt the operation in the Body, rather than entire SOAP Body g sign parts instead of entire SOAP Body h use hmac shared secret key for digital signatures instead of RSA keys i indent XML k don't put signature keys in the WS-Security header m use GCM with AES n canonicalize XML (recommended!) p prefixlist for c14n:InclusiveNamespaces/PrefixList for canonical XML interop s server (stand-alone) t use plain-text passwords (password digest by default) x use plain XML (no HTTP header), client only y buffered sends (experimental, not critical) z enable compression For example, to generate a request message and store it in file 'wssedemo.xml': ./wssedemo in > wssedemo.xml < /dev/null To parse and verify this request message: ./wssedemo ins < wssedemo.xml Alternatively, using HMAC (fast but uses shared symmetric keys): ./wssedemo ihn > wssedemo.xml < /dev/null ./wssedemo ihns < wssedemo.xml To run a stand-alone server: ./wssedemo ins 8080 And invoking it with a client: ./wssedemo in 8080 To test multiple calls, add a single digit number of runs at the end of the options: ./wssedemo in4 8080 */ #include "wsseapi.h" #include "wssetest.nsmap" /* The client and server side use the same certificates and keys for demonstration purposes */ X509 *cert = NULL; EVP_PKEY *rsa_privk = NULL, *rsa_pubk = NULL; /* The secret HMAC key is shared between client and server */ static char hmac_key[16] = /* Dummy HMAC key for signature test */ { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }; /* The WS-SecureConversation Context Token ID we pick for the HMAC key, here we use a fake one to demo */ const char *contextId = "uuid:secure-conversation-context-token"; /* The secret triple DES key shared between client and server for message encryption */ static char des_key[20] = /* Dummy 160-bit triple DES key for encryption test */ { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 }; /* The secret AES key shared between client and server for message encryption */ static char aes_key[32] = /* Dummy 256-bit AES256 key for encryption test */ { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }; int addsig = 0; int addenc = 0; int nobody = 0; /* do not sign the SOAP Body */ int hmac = 0; /* symmetric signature */ int nokey = 0; /* do not include signer's public key in message */ int nohttp = 0; int sym = 0; /* symmetric encryption */ int enc = 0; /* encryption */ int oaep = 0; /* use Rsa-oaep-mgf1p with AES256 CBC */ int aes = 0; /* use AES256 instead of DES */ int gcm = 0; /* use AES with GCM instead of CBC mode (requires OpenSSL 1.0.2) */ /** Optional user-defined key lookup function, see WSSE docs */ static const void *token_handler(struct soap *soap, int *alg, const char *keyname, int *keylen) { const char *ctxId; /* we're not using keyname or other info, which is from the ds:KeyInfo/KeyName content */ (void)keyname; /* we can also access the issuer information to determine which key we have */ struct ds__X509IssuerSerialType *issuer = soap_wsse_get_KeyInfo_SecurityTokenReferenceX509Data(soap); switch (*alg) { case SOAP_SMD_VRFY_DSA_SHA1: case SOAP_SMD_VRFY_DSA_SHA256: case SOAP_SMD_VRFY_RSA_SHA1: case SOAP_SMD_VRFY_RSA_SHA224: case SOAP_SMD_VRFY_RSA_SHA256: case SOAP_SMD_VRFY_RSA_SHA384: case SOAP_SMD_VRFY_RSA_SHA512: case SOAP_SMD_VRFY_ECDSA_SHA1: case SOAP_SMD_VRFY_ECDSA_SHA224: case SOAP_SMD_VRFY_ECDSA_SHA256: case SOAP_SMD_VRFY_ECDSA_SHA384: case SOAP_SMD_VRFY_ECDSA_SHA512: return (const void*)cert; /* signature verification with public cert */ case SOAP_SMD_HMAC_SHA1: /* Optional: WS-SecureConversation: get & check context token ID of HMAC key */ ctxId = soap_wsse_get_SecurityContextToken(soap); if (!ctxId || strcmp(ctxId, contextId)) return NULL; *keylen = sizeof(hmac_key); return (const void*)hmac_key; /* signature verification with secret key */ case SOAP_MEC_ENV_DEC_DES_CBC: /* should inquire keyname (contains key name or subject name/key id) */ if (issuer && issuer->X509IssuerName) { /* use this to get private key */ } if (issuer && issuer->X509SerialNumber) { /* use this to get private key */ } return (const void*)rsa_privk; /* envelope decryption with private key */ case SOAP_MEC_DEC_DES_CBC: /* should inquire keyname (contains key name or subject name/key id) */ *keylen = sizeof(des_key); return (const void*)des_key; /* decryption with secret key */ case SOAP_MEC_DEC_AES256_CBC: case SOAP_MEC_DEC_AES256_GCM: /* should inquire keyname (contains key name or subject name/key id) */ *keylen = sizeof(aes_key); return (const void*)aes_key; /* decryption with secret key */ } fprintf(stderr, "Could not return a key from token handler for '%s'\n", keyname ? keyname : ""); return NULL; /* fail */ } int main(int argc, char **argv) { struct soap *soap; int server = 0; int text = 0; int port = 0; FILE *fd; double result; char *user; int runs = 1; /* create context */ soap = soap_new(); /* register wsse plugin */ soap_register_plugin_arg(soap, soap_wsse, (void*)token_handler); /* options */ if (argc >= 2) { if (strchr(argv[1], 'c')) soap_set_omode(soap, SOAP_IO_CHUNK); else if (strchr(argv[1], 'y')) soap_set_omode(soap, SOAP_IO_STORE); if (strchr(argv[1], 'i')) soap_set_omode(soap, SOAP_XML_INDENT); if (strchr(argv[1], 'n')) soap_set_omode(soap, SOAP_XML_CANONICAL); if (strchr(argv[1], 'p')) soap_wsse_set_InclusiveNamespaces(soap, "SOAP-ENV SOAP-ENC xsi xsd"); if (strchr(argv[1], 'a')) aes = 1; if (strchr(argv[1], 'm')) gcm = 1; if (strchr(argv[1], 'o')) oaep = 1; if (strchr(argv[1], 'd')) sym = 1; if (strchr(argv[1], 'e')) enc = 1; if (strchr(argv[1], 'f')) addenc = 1; if (strchr(argv[1], 'h')) hmac = 1; if (strchr(argv[1], 'k')) nokey = 1; if (strchr(argv[1], 's')) server = 1; if (strchr(argv[1], 't')) text = 1; if (strchr(argv[1], 'g')) addsig = 1; if (strchr(argv[1], 'b')) nobody = 1; if (strchr(argv[1], 'x')) nohttp = 1; if (strchr(argv[1], 'z')) soap_set_mode(soap, SOAP_ENC_ZLIB); if (isdigit(argv[1][strlen(argv[1])-1])) { runs = argv[1][strlen(argv[1])-1] - '0'; soap_set_mode(soap, SOAP_IO_KEEPALIVE); } } /* soap->actor = "..."; */ /* set only when required by peer */ user = getenv("USER"); if (!user) user = (char*)"anyone"; /* read RSA private key for signing */ if ((fd = fopen("server.pem", "r"))) { rsa_privk = PEM_read_PrivateKey(fd, NULL, NULL, (void*)"password"); fclose(fd); if (!rsa_privk) { fprintf(stderr, "Could not read private RSA key from server.pem\n"); exit(1); } } else fprintf(stderr, "Could not read server.pem\n"); /* read certificate (more efficient is to keep certificate in memory) to obtain public key for encryption and signature verification */ if ((fd = fopen("servercert.pem", "r"))) { cert = PEM_read_X509(fd, NULL, NULL, NULL); fclose(fd); if (!cert) { fprintf(stderr, "Could not read certificate from servercert.pem\n"); exit(1); } } else fprintf(stderr, "Could not read server.pem\n"); rsa_pubk = X509_get_pubkey(cert); if (!rsa_pubk) { fprintf(stderr, "Could not get public key from certificate\n"); exit(1); } /* port argument */ if (argc >= 3) port = atoi(argv[2]); /* need cacert to verify certificates with CA (cacert.pem for testing and cacerts.pem for production, which contains the trusted CA certificates) */ soap->cafile = "cacert.pem"; /* server / */ if (server) { if (port) { /* stand-alone server serving messages over port */ if (!soap_valid_socket(soap_bind(soap, NULL, port, 100))) { soap_print_fault(soap, stderr); exit(1); } printf("Server started at port %d\n", port); while (soap_valid_socket(soap_accept(soap))) { /* auto-verify signature options */ if (hmac) soap_wsse_verify_auto(soap, SOAP_SMD_HMAC_SHA1, hmac_key, sizeof(hmac_key)); else if (nokey) soap_wsse_verify_auto(soap, SOAP_SMD_VRFY_RSA_SHA1, rsa_pubk, 0); else soap_wsse_verify_auto(soap, SOAP_SMD_NONE, NULL, 0); /* auto-decrypt options */ if (sym) { if (aes) { if (gcm) soap_wsse_decrypt_auto(soap, SOAP_MEC_DEC_AES256_GCM, aes_key, sizeof(aes_key)); else soap_wsse_decrypt_auto(soap, SOAP_MEC_DEC_AES256_CBC, aes_key, sizeof(aes_key)); } else soap_wsse_decrypt_auto(soap, SOAP_MEC_DEC_DES_CBC, des_key, sizeof(des_key)); } else if (enc) soap_wsse_decrypt_auto(soap, SOAP_MEC_ENV_DEC_DES_CBC, rsa_privk, 0); if (soap_serve(soap)) { soap_wsse_delete_Security(soap); soap_print_fault(soap, stderr); soap_print_fault_location(soap, stderr); } soap_destroy(soap); soap_end(soap); } soap_print_fault(soap, stderr); exit(1); } else /* CGI-style server serving messages over stdin/out */ { /* auto-verify signature options */ if (hmac) soap_wsse_verify_auto(soap, SOAP_SMD_HMAC_SHA1, hmac_key, sizeof(hmac_key)); else if (nokey) soap_wsse_verify_auto(soap, SOAP_SMD_VRFY_RSA_SHA1, rsa_pubk, 0); else soap_wsse_verify_auto(soap, SOAP_SMD_NONE, NULL, 0); /* auto-decrypt options */ if (sym) { if (aes) { if (gcm) soap_wsse_decrypt_auto(soap, SOAP_MEC_DEC_AES256_GCM, aes_key, sizeof(aes_key)); else soap_wsse_decrypt_auto(soap, SOAP_MEC_DEC_AES256_CBC, aes_key, sizeof(aes_key)); } else soap_wsse_decrypt_auto(soap, SOAP_MEC_DEC_DES_CBC, des_key, sizeof(des_key)); } else if (enc) soap_wsse_decrypt_auto(soap, SOAP_MEC_ENV_DEC_DES_CBC, rsa_privk, 0); if (soap_serve(soap)) { soap_wsse_delete_Security(soap); soap_print_fault(soap, stderr); soap_print_fault_location(soap, stderr); exit(1); } soap_destroy(soap); soap_end(soap); } } else /* client */ { int run; char endpoint[80]; /* ns1:test data */ struct ns1__add a; struct ns1__sub b; a.a = 123; a.b = 456; b.a = 789; b.b = -99999; /* client sending messages to stdout or over port */ if (port) (SOAP_SNPRINTF(endpoint, sizeof(endpoint), 37), "http://localhost:%d", port); else if (nohttp) soap_strcpy(endpoint, sizeof(endpoint), ""); else soap_strcpy(endpoint, sizeof(endpoint), "http://"); /* run */ for (run = 0; run < runs; run++) { /* message lifetime of 60 seconds */ soap_wsse_add_Timestamp(soap, "Time", 60); /* add user name with text password (unsafe unless over HTTPS) or digest password */ if (text) soap_wsse_add_UsernameTokenText(soap, "User", user, "userPass"); else soap_wsse_add_UsernameTokenDigest(soap, "User", user, "userPass"); /* symmetric encryption option */ if (sym) { if (aes) { /* symmetric encryption with AES CBC/GCM */ soap_wsse_add_EncryptedData_KeyInfo_KeyName(soap, "My AES Key"); if (gcm) { if (soap_wsse_encrypt_body(soap, SOAP_MEC_ENC_AES256_GCM, aes_key, sizeof(aes_key))) soap_print_fault(soap, stderr); soap_wsse_decrypt_auto(soap, SOAP_MEC_DEC_AES256_GCM, aes_key, sizeof(aes_key)); } else { if (soap_wsse_encrypt_body(soap, SOAP_MEC_ENC_AES256_CBC, aes_key, sizeof(aes_key))) soap_print_fault(soap, stderr); soap_wsse_decrypt_auto(soap, SOAP_MEC_DEC_AES256_CBC, aes_key, sizeof(aes_key)); } } else { /* symmetric encryption with DES */ soap_wsse_add_EncryptedData_KeyInfo_KeyName(soap, "My DES Key"); if (soap_wsse_encrypt_body(soap, SOAP_MEC_ENC_DES_CBC, des_key, sizeof(des_key))) soap_print_fault(soap, stderr); soap_wsse_decrypt_auto(soap, SOAP_MEC_DEC_DES_CBC, des_key, sizeof(des_key)); } } else if (addenc) /* RSA encryption option of specific XML element */ { /* RSA encryption of the element option */ const char *SubjectKeyId = NULL; /* set to non-NULL to use SubjectKeyIdentifier in Header rather than a full cert key */ /* MUST set wsu:Id of the elements to encrypt */ if (addenc) /* encrypt element */ { soap_wsse_set_wsu_id(soap, "ns1:add"); if (soap_wsse_add_EncryptedKey_encrypt_only(soap, SOAP_MEC_ENV_ENC_DES_CBC, "Cert", cert, SubjectKeyId, NULL, NULL, "ns1:add")) soap_print_fault(soap, stderr); } else /* encrypt element */ { soap_wsse_set_wsu_id(soap, "a"); if (soap_wsse_add_EncryptedKey_encrypt_only(soap, SOAP_MEC_ENV_ENC_DES_CBC, "Cert", cert, SubjectKeyId, NULL, NULL, "a")) soap_print_fault(soap, stderr); } soap_wsse_decrypt_auto(soap, SOAP_MEC_ENV_DEC_DES_CBC, rsa_privk, 0); } else if (enc) /* RSA encryption of the SOAP Body option */ { const char *SubjectKeyId = NULL; /* set to non-NULL to use SubjectKeyIdentifier in Header rather than a full cert key */ if (oaep) { if (soap_wsse_add_EncryptedKey(soap, SOAP_MEC_ENV_ENC_AES256_CBC | SOAP_MEC_OAEP, "Cert", cert, SubjectKeyId, NULL, NULL)) soap_print_fault(soap, stderr); } else if (aes) { if (gcm) { if (soap_wsse_add_EncryptedKey(soap, SOAP_MEC_ENV_ENC_AES256_GCM, "Cert", cert, SubjectKeyId, NULL, NULL)) soap_print_fault(soap, stderr); } else { if (soap_wsse_add_EncryptedKey(soap, SOAP_MEC_ENV_ENC_AES256_CBC, "Cert", cert, SubjectKeyId, NULL, NULL)) soap_print_fault(soap, stderr); } } else { if (soap_wsse_add_EncryptedKey(soap, SOAP_MEC_ENV_ENC_DES_CBC, "Cert", cert, SubjectKeyId, NULL, NULL)) soap_print_fault(soap, stderr); } soap_wsse_decrypt_auto(soap, SOAP_MEC_ENV_DEC_DES_CBC, rsa_privk, 0); } /* HMAC signature */ if (hmac) { if (nobody) soap_wsse_sign(soap, SOAP_SMD_HMAC_SHA1, hmac_key, sizeof(hmac_key)); else soap_wsse_sign_body(soap, SOAP_SMD_HMAC_SHA1, hmac_key, sizeof(hmac_key)); /* WS-SecureConversation contect token */ soap_wsse_add_SecurityContextToken(soap, "SCT", contextId); } else /* RSA signature verification */ { if (nokey) soap_wsse_add_KeyInfo_KeyName(soap, "MyKey"); else { soap_wsse_add_BinarySecurityTokenX509(soap, "X509Token", cert); soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(soap, "#X509Token"); } if (nobody || addsig) /* do not sign body */ soap_wsse_sign(soap, SOAP_SMD_SIGN_RSA_SHA1, rsa_privk, 0); else soap_wsse_sign_body(soap, SOAP_SMD_SIGN_RSA_SHA256, rsa_privk, 0); } /* auto-verification of signatures in server responses */ if (hmac) soap_wsse_verify_auto(soap, SOAP_SMD_HMAC_SHA1, hmac_key, sizeof(hmac_key)); else if (nokey) soap_wsse_verify_auto(soap, SOAP_SMD_VRFY_RSA_SHA1, rsa_pubk, 0); else soap_wsse_verify_auto(soap, SOAP_SMD_NONE, NULL, 0); /* sign message parts inside unsigned body? If so, set wsu:Id of those */ if (addsig) { soap_wsse_set_wsu_id(soap, "ns1:add"); soap_wsse_sign_only(soap, "User ns1:add"); } /* invoke the server. You can choose add, sub, mul, or div operations * that show different security aspects (intentional message rejections) * for demonstration purposes (see server operations below) */ if (!soap_call_ns1__add(soap, endpoint, NULL, 1.0, 2.0, &result)) { if (!soap_wsse_verify_Timestamp(soap)) { const char *servername = soap_wsse_get_Username(soap); if (servername && !strcmp(servername, "server") && !soap_wsse_verify_Password(soap, "serverPass")) printf("Result = %g\n", result); else { fprintf(stderr, "Server authentication failed\n"); soap_print_fault(soap, stderr); } } else { fprintf(stderr, "Server response expired\n"); soap_print_fault(soap, stderr); } } else { soap_print_fault(soap, stderr); soap_print_fault_location(soap, stderr); if (soap->error != SOAP_EOF) exit(1); } /* clean up security header */ soap_wsse_delete_Security(soap); /* disable soap_wsse_verify_auto */ soap_wsse_verify_done(soap); } /* run */ } /* clean up keys */ if (rsa_privk) EVP_PKEY_free(rsa_privk); if (rsa_pubk) EVP_PKEY_free(rsa_pubk); if (cert) X509_free(cert); /* clean up gSOAP engine */ soap_destroy(soap); soap_end(soap); soap_done(soap); free(soap); /* done */ return 0; } int ns1__add(struct soap *soap, double a, double b, double *result) { const char *username = soap_wsse_get_Username(soap); if (username) fprintf(stderr, "Hello %s, want to add %g + %g = ?\n", username, a, b); if (soap_wsse_verify_Timestamp(soap) || soap_wsse_verify_Password(soap, "userPass")) { int err = soap->error; /* preserve error code */ soap_wsse_delete_Security(soap); /* remove WS-Security information */ /* the above suffices to return an unsigned fault, but here we show how to return a signed fault: */ soap_wsse_add_BinarySecurityTokenX509(soap, "X509Token", cert); soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(soap, "#X509Token"); soap_wsse_sign_body(soap, SOAP_SMD_SIGN_RSA_SHA256, rsa_privk, 0); return err; } if (soap_wsse_verify_element(soap, "http://www.genivia.com/schemas/wssetest.xsd", "add") == 0) { soap_wsse_delete_Security(soap); return soap_sender_fault(soap, "Service operation not signed", NULL); } soap_wsse_delete_Security(soap); /* remove WS-Security before setting new security information */ soap_wsse_add_Timestamp(soap, "Time", 10); /* lifetime of 10 seconds */ soap_wsse_add_UsernameTokenDigest(soap, "User", "server", "serverPass"); if (hmac) { if (nobody || addsig) soap_wsse_sign(soap, SOAP_SMD_HMAC_SHA1, hmac_key, sizeof(hmac_key)); else soap_wsse_sign_body(soap, SOAP_SMD_HMAC_SHA1, hmac_key, sizeof(hmac_key)); /* WS-SecureConversation context token */ soap_wsse_add_SecurityContextToken(soap, "SCT", contextId); } else { if (nokey) soap_wsse_add_KeyInfo_KeyName(soap, "MyKey"); else { soap_wsse_add_BinarySecurityTokenX509(soap, "X509Token", cert); soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(soap, "#X509Token"); } if (nobody || addsig) soap_wsse_sign(soap, SOAP_SMD_SIGN_RSA_SHA1, rsa_privk, 0); else soap_wsse_sign_body(soap, SOAP_SMD_SIGN_RSA_SHA256, rsa_privk, 0); } /* sign the response message inside the unsigned enveloping body? If so, set wsu:Id of the response */ if (addsig) soap_wsse_set_wsu_id(soap, "ns1:addResponse"); if (sym) { if (aes) { soap_wsse_add_EncryptedData_KeyInfo_KeyName(soap, "My AES Key"); if (gcm) { if (soap_wsse_encrypt_body(soap, SOAP_MEC_ENC_AES256_GCM, aes_key, sizeof(aes_key))) soap_print_fault(soap, stderr); } else { if (soap_wsse_encrypt_body(soap, SOAP_MEC_ENC_AES256_CBC, aes_key, sizeof(aes_key))) soap_print_fault(soap, stderr); } } else { soap_wsse_add_EncryptedData_KeyInfo_KeyName(soap, "My DES Key"); if (soap_wsse_encrypt_body(soap, SOAP_MEC_ENC_DES_CBC, des_key, sizeof(des_key))) soap_print_fault(soap, stderr); } } else if (addenc) { /* MUST set wsu:Id of the elements to encrypt */ soap_wsse_set_wsu_id(soap, "ns1:addResponse"); if (soap_wsse_add_EncryptedKey_encrypt_only(soap, SOAP_MEC_ENV_ENC_DES_CBC, "Cert", cert, NULL, NULL, NULL, "ns:addResponse")) soap_print_fault(soap, stderr); } else if (enc) { if (oaep) { if (soap_wsse_add_EncryptedKey(soap, SOAP_MEC_ENV_ENC_AES256_CBC | SOAP_MEC_OAEP, "Cert", cert, NULL, NULL, NULL)) soap_print_fault(soap, stderr); } else if (aes) { if (gcm) { if (soap_wsse_add_EncryptedKey(soap, SOAP_MEC_ENV_ENC_AES256_GCM, "Cert", cert, NULL, NULL, NULL)) soap_print_fault(soap, stderr); } else { if (soap_wsse_add_EncryptedKey(soap, SOAP_MEC_ENV_ENC_AES256_CBC, "Cert", cert, NULL, NULL, NULL)) soap_print_fault(soap, stderr); } } else { if (soap_wsse_add_EncryptedKey(soap, SOAP_MEC_ENV_ENC_DES_CBC, "Cert", cert, NULL, NULL, NULL)) soap_print_fault(soap, stderr); } } *result = a + b; return SOAP_OK; } int ns1__sub(struct soap *soap, double a, double b, double *result) { const char *username = soap_wsse_get_Username(soap); if (username) fprintf(stderr, "Hello %s, want to subtract %g - %g = ?\n", username, a, b); if (soap_wsse_verify_Timestamp(soap) || soap_wsse_verify_Password(soap, "userPass")) { soap_wsse_delete_Security(soap); return soap->error; } if (soap_wsse_verify_element(soap, "http://www.genivia.com/schemas/wssetest.xsd", "sub") == 0) { soap_wsse_delete_Security(soap); return soap_sender_fault(soap, "Service operation not signed", NULL); } soap_wsse_delete_Security(soap); /* In this case we leave out the timestamp, which is the sender's * responsibility to add. The receiver only complains if the timestamp is out * of date, not that it is absent. */ if (hmac) { soap_wsse_sign_body(soap, SOAP_SMD_HMAC_SHA1, hmac_key, sizeof(hmac_key)); /* WS-SecureConversation contect token */ soap_wsse_add_SecurityContextToken(soap, "SCT", contextId); } else { if (nokey) soap_wsse_add_KeyInfo_KeyName(soap, "MyKey"); else { soap_wsse_add_BinarySecurityTokenX509(soap, "X509Token", cert); soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(soap, "#X509Token"); } soap_wsse_sign_body(soap, SOAP_SMD_SIGN_RSA_SHA256, rsa_privk, 0); } *result = a - b; return SOAP_OK; } int ns1__mul(struct soap *soap, double a, double b, double *result) { const char *username = soap_wsse_get_Username(soap); if (username) fprintf(stderr, "Hello %s, want to multiply %g * %g = ?\n", username, a, b); if (soap_wsse_verify_Timestamp(soap) || soap_wsse_verify_Password(soap, "userPass")) { soap_wsse_delete_Security(soap); return soap->error; } if (soap_wsse_verify_element(soap, "http://www.genivia.com/schemas/wssetest.xsd", "mul") == 0) { soap_wsse_delete_Security(soap); return soap_sender_fault(soap, "Service operation not signed", NULL); } soap_wsse_delete_Security(soap); soap_wsse_add_Timestamp(soap, "Time", 10); /* lifetime of 10 seconds */ /* In this case we leave out the server name and password. Because the * client receiver requires the presence of authentication information, the * client will reject the response. */ if (hmac) { soap_wsse_sign_body(soap, SOAP_SMD_HMAC_SHA1, hmac_key, sizeof(hmac_key)); /* WS-SecureConversation contect token */ soap_wsse_add_SecurityContextToken(soap, "SCT", contextId); } else { if (nokey) soap_wsse_add_KeyInfo_KeyName(soap, "MyKey"); else { soap_wsse_add_BinarySecurityTokenX509(soap, "X509Token", cert); soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(soap, "#X509Token"); } soap_wsse_sign_body(soap, SOAP_SMD_SIGN_RSA_SHA256, rsa_privk, 0); } *result = a * b; return SOAP_OK; } int ns1__div(struct soap *soap, double a, double b, double *result) { const char *username = soap_wsse_get_Username(soap); if (username) fprintf(stderr, "Hello %s, want to divide %g / %g = ?\n", username, a, b); if (soap_wsse_verify_Timestamp(soap) || soap_wsse_verify_Password(soap, "userPass")) { soap_wsse_delete_Security(soap); return soap->error; } if (soap_wsse_verify_element(soap, "http://www.genivia.com/schemas/wssetest.xsd", "div") == 0) { soap_wsse_delete_Security(soap); return soap_sender_fault(soap, "Service operation not signed", NULL); } soap_wsse_delete_Security(soap); soap_wsse_add_Timestamp(soap, "Time", 10); /* lifetime of 10 seconds */ soap_wsse_add_UsernameTokenDigest(soap, "User", "server", "serverPass"); /* In this case we leave out the signature and the receiver will reject this unsigned message. */ if (b == 0.0) return soap_sender_fault(soap, "Division by zero", NULL); *result = a / b; return SOAP_OK; } gsoap-2.8.28/gsoap/samples/wsse/server.pem0000644000175000017500000000724212653650156020051 0ustar ellertellert-----BEGIN ENCRYPTED PRIVATE KEY----- MIICxjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQI74Clf0036IICAggA MBQGCCqGSIb3DQMHBAiOmGBFtHOX0wSCAoAPb8WN47mTunpkPpzBSNd4i+qX1f4V XyFMWxdibGTclHfNesksWkg38E0nt9ORMImgvpKIHgQ2l+dt725uAoRhtuva7N2R kQKkJOtbzlxbgmi0QylcaEZYCw/OLsL0sH0xaoJDJsjwF74RAu4CJ7XVPR+ldPb9 hWSPb9KIkAe779KChZUaEkDa61ce0Bh7hSztjXYKqwI4W+xB0hv32dkwiap74mxr qw8fqu64+jj2UipUG0FVkruuYy0bW8Nh1P4aGIIKpFjjNBaHQoHWuluh0jDI7cpT A0Sfyg1teEtbBJgF2ebej6f7AHMHq2PuPo/nWzb2d6Akkc3q1Ab44yUeRgPhNTxA glhjoCSOOIFm2YfBh22A1h3JHDyr4INptSnlPl4lMMFYLS/JmJ+zg0cUTK53uY91 ncBtu6odT69Vxb/z5X3LIhjqJS6oSXDoFMlHxLkFyLamjPBgtvNSnlLQPWsrwpUd Fsl94W7OxIu4U711xMBbkYbYhLOAQ3KlF1GbYIyfOcQbvJ8UsXu959WJK6bQ0+ud XcnmQFZnEoxtDMcSCqcZfbcTasHGvrp4pBpxUyPNC5AUnLXsIg5QaplO7i5atrT/ e/I/jPA7AefUol5s8fyDKbKNBfuPk6VTvtIXKEGP8vKf5ZRai6HhhoE0pbEsNdSD CVfESYrTfgXf2h1gvSunWwDMbC/AaaNjjoHBTLQJfCbvacqK9zz/8o/BFEUWi/30 KeqA5pnlKIRL2nblWcKZE9xSKomsZqch7xTK5m9FUxAwwlAAVM5kwgiaFGEgrAO2 pFP9pJxZzxThlxQi2EgyHUoGqPjdPNFVuhBEcyIhVZp86qoikNoxtdBE -----END ENCRYPTED PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIID4TCCA0qgAwIBAgIBHzANBgkqhkiG9w0BAQUFADCBjTELMAkGA1UEBhMCVVMx CzAJBgNVBAgTAkZMMRQwEgYDVQQHEwtUYWxsYWhhc3NlZTEWMBQGA1UEChMNR2Vu aXZpYSwgSW5jLjELMAkGA1UECxMCSVQxEjAQBgNVBAMTCWxvY2FsaG9zdDEiMCAG CSqGSIb3DQEJARYTY29udGFjdEBnZW5pdmlhLmNvbTAeFw0xNTA4MDQxOTAzNDda Fw0xODA4MDMxOTAzNDdaMIGNMQswCQYDVQQGEwJVUzELMAkGA1UECBMCRkwxFDAS BgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYDVQQKEw1HZW5pdmlhLCBJbmMuMQswCQYD VQQLEwJJVDESMBAGA1UEAxMJbG9jYWxob3N0MSIwIAYJKoZIhvcNAQkBFhNjb250 YWN0QGdlbml2aWEuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC4J9vn Sde1q+Pyvgs4QUPiNKnqezL0Cqp1vA7gfUJ31Q/0071gkgMSX/DL+SZPjRSfEjA1 c9JyPjSdeZ5zydAz9f5R680Nvs8VKR9MsB3/XAnI3Rhd9G11QHXuW7DsaF6TXHNk EoipcN7ebie9eeqadv8xzhvTBHBE8rkf8iMI2QIDAQABo4IBTTCCAUkwCQYDVR0T BAIwADALBgNVHQ8EBAMCBPAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMC MCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAd BgNVHQ4EFgQUYJXHvmkvx1zc7GjmBJ9G0YQpKSgwgcIGA1UdIwSBujCBt4AU+MeC gLt+4soPx4i3OiBZYwMqlNChgZOkgZAwgY0xCzAJBgNVBAYTAlVTMQswCQYDVQQI EwJGTDEUMBIGA1UEBxMLVGFsbGFoYXNzZWUxFjAUBgNVBAoTDUdlbml2aWEsIElu Yy4xCzAJBgNVBAsTAklUMRIwEAYDVQQDEwlsb2NhbGhvc3QxIjAgBgkqhkiG9w0B CQEWE2NvbnRhY3RAZ2VuaXZpYS5jb22CCQDWdgbFTLQbVTANBgkqhkiG9w0BAQUF AAOBgQCNUuW182UC2YqBE3oEtwaguyYWOR5aZIUE4znV9thu7xBZhCoFhukmQX0L TwoSiW7Yt7vx0cUL4RQltT4D225ANhogdmBh0JmIXc60DtpnCs43IjTT1moUwx6T M51IxVIgksklJuo7UIILrYWlIR3GjDWGOEpQQmQhoLS10lVAyQ== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDkDCCAvmgAwIBAgIJANZ2BsVMtBtVMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYD VQQGEwJVUzELMAkGA1UECBMCRkwxFDASBgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYD VQQKEw1HZW5pdmlhLCBJbmMuMQswCQYDVQQLEwJJVDESMBAGA1UEAxMJbG9jYWxo b3N0MSIwIAYJKoZIhvcNAQkBFhNjb250YWN0QGdlbml2aWEuY29tMB4XDTE1MDgw NDE5MDEyMFoXDTE4MDgwMzE5MDEyMFowgY0xCzAJBgNVBAYTAlVTMQswCQYDVQQI EwJGTDEUMBIGA1UEBxMLVGFsbGFoYXNzZWUxFjAUBgNVBAoTDUdlbml2aWEsIElu Yy4xCzAJBgNVBAsTAklUMRIwEAYDVQQDEwlsb2NhbGhvc3QxIjAgBgkqhkiG9w0B CQEWE2NvbnRhY3RAZ2VuaXZpYS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJ AoGBALx/LiwGRi4wH8y0MEL64VJs5H2O1F4uuYO+aNVZHl5ULRDmSh/4eF8aOYXT B05PfVoctBogcK0ohPEhiUcR/029LQTkEs/5D7XsuRuQsUnMfkEihmC2VtEuJMqT OeXmuIcemEw0QL3ulny7H8W6Aq2rByC2r5iqytnM4Uuw7LMnAgMBAAGjgfUwgfIw HQYDVR0OBBYEFPjHgoC7fuLKD8eItzogWWMDKpTQMIHCBgNVHSMEgbowgbeAFPjH goC7fuLKD8eItzogWWMDKpTQoYGTpIGQMIGNMQswCQYDVQQGEwJVUzELMAkGA1UE CBMCRkwxFDASBgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYDVQQKEw1HZW5pdmlhLCBJ bmMuMQswCQYDVQQLEwJJVDESMBAGA1UEAxMJbG9jYWxob3N0MSIwIAYJKoZIhvcN AQkBFhNjb250YWN0QGdlbml2aWEuY29tggkA1nYGxUy0G1UwDAYDVR0TBAUwAwEB /zANBgkqhkiG9w0BAQUFAAOBgQB+fmbScGp3R4D0Sf4gbBJ/3CGEn4/HvupSikDq vyaviwJ2KQKGlAr/lDh1qSYItkazJpJDIxyG2Dzm2w0F0u1+CSwpym6eq1pxc8dh GRdrCVyuM0gUoBvxUym7o0Bq1V6onUjwrAti+onsZjDpfAIKBI8TRfjuTNzFeSAV G2zULg== -----END CERTIFICATE----- gsoap-2.8.28/gsoap/samples/wsse/servercert.pem0000644000175000017500000000522112653650156020722 0ustar ellertellert-----BEGIN CERTIFICATE----- MIID4TCCA0qgAwIBAgIBHzANBgkqhkiG9w0BAQUFADCBjTELMAkGA1UEBhMCVVMx CzAJBgNVBAgTAkZMMRQwEgYDVQQHEwtUYWxsYWhhc3NlZTEWMBQGA1UEChMNR2Vu aXZpYSwgSW5jLjELMAkGA1UECxMCSVQxEjAQBgNVBAMTCWxvY2FsaG9zdDEiMCAG CSqGSIb3DQEJARYTY29udGFjdEBnZW5pdmlhLmNvbTAeFw0xNTA4MDQxOTAzNDda Fw0xODA4MDMxOTAzNDdaMIGNMQswCQYDVQQGEwJVUzELMAkGA1UECBMCRkwxFDAS BgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYDVQQKEw1HZW5pdmlhLCBJbmMuMQswCQYD VQQLEwJJVDESMBAGA1UEAxMJbG9jYWxob3N0MSIwIAYJKoZIhvcNAQkBFhNjb250 YWN0QGdlbml2aWEuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC4J9vn Sde1q+Pyvgs4QUPiNKnqezL0Cqp1vA7gfUJ31Q/0071gkgMSX/DL+SZPjRSfEjA1 c9JyPjSdeZ5zydAz9f5R680Nvs8VKR9MsB3/XAnI3Rhd9G11QHXuW7DsaF6TXHNk EoipcN7ebie9eeqadv8xzhvTBHBE8rkf8iMI2QIDAQABo4IBTTCCAUkwCQYDVR0T BAIwADALBgNVHQ8EBAMCBPAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMC MCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAd BgNVHQ4EFgQUYJXHvmkvx1zc7GjmBJ9G0YQpKSgwgcIGA1UdIwSBujCBt4AU+MeC gLt+4soPx4i3OiBZYwMqlNChgZOkgZAwgY0xCzAJBgNVBAYTAlVTMQswCQYDVQQI EwJGTDEUMBIGA1UEBxMLVGFsbGFoYXNzZWUxFjAUBgNVBAoTDUdlbml2aWEsIElu Yy4xCzAJBgNVBAsTAklUMRIwEAYDVQQDEwlsb2NhbGhvc3QxIjAgBgkqhkiG9w0B CQEWE2NvbnRhY3RAZ2VuaXZpYS5jb22CCQDWdgbFTLQbVTANBgkqhkiG9w0BAQUF AAOBgQCNUuW182UC2YqBE3oEtwaguyYWOR5aZIUE4znV9thu7xBZhCoFhukmQX0L TwoSiW7Yt7vx0cUL4RQltT4D225ANhogdmBh0JmIXc60DtpnCs43IjTT1moUwx6T M51IxVIgksklJuo7UIILrYWlIR3GjDWGOEpQQmQhoLS10lVAyQ== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDkDCCAvmgAwIBAgIJANZ2BsVMtBtVMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYD VQQGEwJVUzELMAkGA1UECBMCRkwxFDASBgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYD VQQKEw1HZW5pdmlhLCBJbmMuMQswCQYDVQQLEwJJVDESMBAGA1UEAxMJbG9jYWxo b3N0MSIwIAYJKoZIhvcNAQkBFhNjb250YWN0QGdlbml2aWEuY29tMB4XDTE1MDgw NDE5MDEyMFoXDTE4MDgwMzE5MDEyMFowgY0xCzAJBgNVBAYTAlVTMQswCQYDVQQI EwJGTDEUMBIGA1UEBxMLVGFsbGFoYXNzZWUxFjAUBgNVBAoTDUdlbml2aWEsIElu Yy4xCzAJBgNVBAsTAklUMRIwEAYDVQQDEwlsb2NhbGhvc3QxIjAgBgkqhkiG9w0B CQEWE2NvbnRhY3RAZ2VuaXZpYS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJ AoGBALx/LiwGRi4wH8y0MEL64VJs5H2O1F4uuYO+aNVZHl5ULRDmSh/4eF8aOYXT B05PfVoctBogcK0ohPEhiUcR/029LQTkEs/5D7XsuRuQsUnMfkEihmC2VtEuJMqT OeXmuIcemEw0QL3ulny7H8W6Aq2rByC2r5iqytnM4Uuw7LMnAgMBAAGjgfUwgfIw HQYDVR0OBBYEFPjHgoC7fuLKD8eItzogWWMDKpTQMIHCBgNVHSMEgbowgbeAFPjH goC7fuLKD8eItzogWWMDKpTQoYGTpIGQMIGNMQswCQYDVQQGEwJVUzELMAkGA1UE CBMCRkwxFDASBgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYDVQQKEw1HZW5pdmlhLCBJ bmMuMQswCQYDVQQLEwJJVDESMBAGA1UEAxMJbG9jYWxob3N0MSIwIAYJKoZIhvcN AQkBFhNjb250YWN0QGdlbml2aWEuY29tggkA1nYGxUy0G1UwDAYDVR0TBAUwAwEB /zANBgkqhkiG9w0BAQUFAAOBgQB+fmbScGp3R4D0Sf4gbBJ/3CGEn4/HvupSikDq vyaviwJ2KQKGlAr/lDh1qSYItkazJpJDIxyG2Dzm2w0F0u1+CSwpym6eq1pxc8dh GRdrCVyuM0gUoBvxUym7o0Bq1V6onUjwrAti+onsZjDpfAIKBI8TRfjuTNzFeSAV G2zULg== -----END CERTIFICATE----- gsoap-2.8.28/gsoap/samples/wsse/cacerts.pem0000644000175000017500000075424412653650156020202 0ustar ellertellert# Part of the source for this file is provided by Mozilla: # http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1 # This file was converted to PEM format with tools provided by OpenSSL. # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. GlobalSign Root CA ================== -----BEGIN CERTIFICATE----- MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== -----END CERTIFICATE----- GlobalSign Root CA - R2 ======================= -----BEGIN CERTIFICATE----- MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6 ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp 9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu 01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7 9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== -----END CERTIFICATE----- Verisign Class 3 Public Primary Certification Authority - G3 ============================================================ -----BEGIN CERTIFICATE----- MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1 EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj 055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC /Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0 xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== -----END CERTIFICATE----- Entrust.net Premium 2048 Secure Server CA ========================================= -----BEGIN CERTIFICATE----- MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx NzUwNTFaFw0yOTA3MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3 d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo0IwQDAOBgNVHQ8BAf8E BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJ KoZIhvcNAQEFBQADggEBADubj1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPy T/4xmf3IDExoU8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5bu/8j72gZyxKT J1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+bYQLCIt+jerXmCHG8+c8eS9e nNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/ErfF6adulZkMV8gzURZVE= -----END CERTIFICATE----- Baltimore CyberTrust Root ========================= -----BEGIN CERTIFICATE----- MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9 XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5 hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp -----END CERTIFICATE----- AddTrust Low-Value Services Root ================================ -----BEGIN CERTIFICATE----- MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRU cnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQsw CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBO ZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEB AQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY6 54eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWr oulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1 Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJui GMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8w HQYDVR0OBBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTAD AQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQswCQYDVQQGEwJT RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEw HwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxt ZBsfzQ3duQH6lmM0MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJlpz/+0WatC7xr mYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vj ccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk= -----END CERTIFICATE----- AddTrust External Root ====================== -----BEGIN CERTIFICATE----- MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821 +iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy 2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7 7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355 e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= -----END CERTIFICATE----- AddTrust Public Services Root ============================= -----BEGIN CERTIFICATE----- MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEUMBIGA1UEChML QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSAwHgYDVQQDExdBZGRU cnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJ BgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5l dHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEF AAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbu nyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1i d9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSG Aa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAw HM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0G A1UdDgQWBBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB /zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkGA1UEBhMCU0Ux FDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29yazEgMB4G A1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4 JNojVhaTdt02KLmuG7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL +YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh4SINhwBk/ox9 Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9H EufOX1362KqxMy3ZdvJOOjMMK7MtkAY= -----END CERTIFICATE----- AddTrust Qualified Certificates Root ==================================== -----BEGIN CERTIFICATE----- MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEUMBIGA1UEChML QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSMwIQYDVQQDExpBZGRU cnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcx CzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ IE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG 9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx 64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3 KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1tUvznoD1o L/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GR wVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HU MIHRMB0GA1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/ BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkwZzELMAkGA1UE BhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29y azEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQAD ggEBABmrder4i2VhlRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3P6CxB9bpT9ze RXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDB iFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5noxqE= -----END CERTIFICATE----- Entrust Root Certification Authority ==================================== -----BEGIN CERTIFICATE----- MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0 MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68 j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1 MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0 tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8 -----END CERTIFICATE----- RSA Security 2048 v3 ==================== -----BEGIN CERTIFICATE----- MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6MRkwFwYDVQQK ExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAy MjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAb BgNVBAsTFFJTQSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC AQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7 Jylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgb WhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iH KrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP +Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/ MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4E FgQUB8NRMKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmY v/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5gEydxiKRz44Rj 0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+f00/FGj1EVDVwfSQpQgdMWD/YIwj VAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395 nzIlQnQFgCi/vcEkllgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA pKnXwiJPZ9d37CAFYd4= -----END CERTIFICATE----- GeoTrust Global CA ================== -----BEGIN CERTIFICATE----- MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet 8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4 d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2 mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm Mw== -----END CERTIFICATE----- GeoTrust Global CA 2 ==================== -----BEGIN CERTIFICATE----- MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN R2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwHhcNMDQwMzA0MDUw MDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j LjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw ggEKAoIBAQDvPE1APRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/ NTL8Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hLTytCOb1k LUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL5mkWRxHCJ1kDs6ZgwiFA Vvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7S4wMcoKK+xfNAGw6EzywhIdLFnopsk/b HdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQF MAMBAf8wHQYDVR0OBBYEFHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNH K266ZUapEBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6tdEPx7 srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv/NgdRN3ggX+d6Yvh ZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywNA0ZF66D0f0hExghAzN4bcLUprbqL OzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkC x1YAzUm5s2x7UwQa4qjJqhIFI8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqF H4z1Ir+rzoPz4iIprn2DQKi6bA== -----END CERTIFICATE----- GeoTrust Universal CA ===================== -----BEGIN CERTIFICATE----- MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1 MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs 7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d 8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08 ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0 XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2 qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2 DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI P/rmMuGNG2+k5o7Y+SlIis5z/iw= -----END CERTIFICATE----- GeoTrust Universal CA 2 ======================= -----BEGIN CERTIFICATE----- MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0 MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0 DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17 j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2 WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP 20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG 8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2 +/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ 4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+ mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS -----END CERTIFICATE----- Visa eCommerce Root =================== -----BEGIN CERTIFICATE----- MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2 WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0 TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI /k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt 398znM/jra6O1I7mT1GvFpLgXPYHDw== -----END CERTIFICATE----- Certum Root CA ============== -----BEGIN CERTIFICATE----- MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQK ExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQTAeFw0wMjA2MTExMDQ2Mzla Fw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8u by4xEjAQBgNVBAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6x wS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdL kKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ 89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/K Uz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu/qpGWX7P NSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq hkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+ GXYkHAQaTOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvg GrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqTE5s7FCMTY5w/ 0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5xO/fIR/RpbxXyEV6DHpx8Uq79AtoS qFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs6GAqm4VKQPNriiTsBhYscw== -----END CERTIFICATE----- Comodo AAA Services root ======================== -----BEGIN CERTIFICATE----- MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm 7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z 8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C 12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== -----END CERTIFICATE----- Comodo Secure Services root =========================== -----BEGIN CERTIFICATE----- MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg TGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAw MDAwMFoXDTI4MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu Y2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAi BgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP ADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP 9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8j6ysNstc rbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rC oznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3V p6ea5EQz6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4E FgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w gYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL1NlY3VyZUNlcnRpZmlj YXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlm aWNhdGVTZXJ2aWNlcy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm 4J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtIgKvcnDe4IRRL DXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6Pw pCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1H RR3B7Hzs/Sk= -----END CERTIFICATE----- Comodo Trusted Services root ============================ -----BEGIN CERTIFICATE----- MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg TGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEw MDAwMDBaFw0yODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1h bmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUw IwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOC AQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh7 3TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9C1t2ul/y /9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6 juljatEPmsbS9Is6FARW1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsS ivnkBbA7kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1Ud DgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB /zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21vZG9jYS5jb20vVHJ1c3RlZENlcnRp ZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENl cnRpZmljYXRlU2VydmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw uleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32 pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxISjBc/lDb+XbDA BHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0l R+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O 9y5Xt5hwXsjEeLBi -----END CERTIFICATE----- QuoVadis Root CA ================ -----BEGIN CERTIFICATE----- MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7 MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0 aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6 tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi 5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi 5nrQNiOKSnQ2+Q== -----END CERTIFICATE----- QuoVadis Root CA 2 ================== -----BEGIN CERTIFICATE----- MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQx ODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4IC DwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6 XJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yk lvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbB lDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRcAitMOeGy lZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt 66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1Jdxn wQ5hYIizPtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOh D7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR7hYQe7xFSkyy BNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuIyV77zGHcizN300QyNQliBJIWENie J0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1Ud DgQWBBQahGK8SEwzJQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGU a6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2fBluornFdLwUv Z+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3 UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodm VjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK +JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrW IozchLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1 WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1B+TJYm5X f6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II 4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8 VCLAAVBpQ570su9t+Oza8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u -----END CERTIFICATE----- QuoVadis Root CA 3 ================== -----BEGIN CERTIFICATE----- MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8 nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4 ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2 Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp 8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto= -----END CERTIFICATE----- Security Communication Root CA ============================== -----BEGIN CERTIFICATE----- MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw 8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX 5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2 JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g 0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ 6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi FL39vmwLAw== -----END CERTIFICATE----- Sonera Class 2 Root CA ====================== -----BEGIN CERTIFICATE----- MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3 /Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt 0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH llpwrN9M -----END CERTIFICATE----- Staat der Nederlanden Root CA ============================= -----BEGIN CERTIFICATE----- MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJOTDEeMBwGA1UE ChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFhdCBkZXIgTmVkZXJsYW5kZW4g Um9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEyMTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4w HAYDVQQKExVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxh bmRlbiBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFt vsznExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw719tV2U02P jLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MOhXeiD+EwR+4A5zN9RGca C1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+UtFE5A3+y3qcym7RHjm+0Sq7lr7HcsBth vJly3uSJt3omXdozSVtSnA71iq3DuD3oBmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn6 22r+I/q85Ej0ZytqERAhSQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRV HSAAMDwwOgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMvcm9v dC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA7Jbg0zTBLL9s+DAN BgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k/rvuFbQvBgwp8qiSpGEN/KtcCFtR EytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzmeafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbw MVcoEoJz6TMvplW0C5GUR5z6u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3y nGQI0DvDKcWy7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw== -----END CERTIFICATE----- UTN USERFirst Hardware Root CA ============================== -----BEGIN CERTIFICATE----- MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UE BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAd BgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgx OTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0 eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVz ZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3 DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlI wrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFd tqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8 i4fDidNdoI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjf Pe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhbAgMBAAGjgbkw gbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFKFyXyYbKJhDlV0HN9WF lp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNF UkZpcnN0LUhhcmR3YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF BwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM //bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28GpgoiskliCE7/yMgUsogW XecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2 lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kn iCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67 nfhmqA== -----END CERTIFICATE----- Camerfirma Chambers of Commerce Root ==================================== -----BEGIN CERTIFICATE----- MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i ZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAx NjEzNDNaFw0zNzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZp cm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3Jn MSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOC AQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlU xFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41XQEMIwRH NaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jW DA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFV d9oKDMyXroDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1Ud EwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFtYmVyc2lnbi5v cmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p26EpW1eLTXYGduHRooowDgYDVR0P AQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hh bWJlcnNpZ24ub3JnMCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD VR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEBAAxBl8IahsAi fJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvD L8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wN UPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/n ADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1 erfutGWaIZDgqtCYvDi1czyL+Nw= -----END CERTIFICATE----- Camerfirma Global Chambersign Root ================================== -----BEGIN CERTIFICATE----- MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i ZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYx NDE4WhcNMzcwOTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJt YSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEg MB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAw ggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J 1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8O by4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl 6DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c 8lCrEqWhz0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/ BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJzaWduLm9yZy9j aGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4wTcbOX60Qq+UDpfqpFDAOBgNVHQ8B Af8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBj aGFtYmVyc2lnbi5vcmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y ZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0BAQUFAAOCAQEA PDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9Y gOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJ PJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4 IBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes t2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A== -----END CERTIFICATE----- NetLock Notary (Class A) Root ============================= -----BEGIN CERTIFICATE----- MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQI EwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6 dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9j ayBLb3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oX DTE5MDIxOTIzMTQ0N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQH EwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYD VQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFz cyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSM D7tM9DceqQWC2ObhbHDqeLVu0ThEDaiDzl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZ z+qMkjvN9wfcZnSX9EUi3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC /tmwqcm8WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LYOph7 tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2EsiNCubMvJIH5+hCoR6 4sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCCApswDgYDVR0PAQH/BAQDAgAGMBIG A1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaC Ak1GSUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pv bGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2Vn LWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0 ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFz IGxlaXJhc2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBh IGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVu b3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBh bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sg Q1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFp bCBhdCBjcHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5 ayZrU3/b39/zcT0mwBQOxmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjP ytoUMaFP0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQQeJB CWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxkf1qbFFgBJ34TUMdr KuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK8CtmdWOMovsEPoMOmzbwGOQmIMOM 8CgHrTwXZoi1/baI -----END CERTIFICATE----- XRamp Global CA Root ==================== -----BEGIN CERTIFICATE----- MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc /Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz 8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw= -----END CERTIFICATE----- Go Daddy Class 2 CA =================== -----BEGIN CERTIFICATE----- MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv 2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32 qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b vZ8= -----END CERTIFICATE----- Starfield Class 2 CA ==================== -----BEGIN CERTIFICATE----- MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3 QBFGmh95DmK/D5fs4C8fF5Q= -----END CERTIFICATE----- StartCom Certification Authority ================================ -----BEGIN CERTIFICATE----- MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0 NjM2WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/ Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt 2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z 6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/ untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT 37uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0 Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNj YS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUH AgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRw Oi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYg U3RhcnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5 LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0Q29tIENl cnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUgYXQgaHR0cDovL2NlcnQuc3Rh cnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilT dGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOC AgEAFmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8jhvh 3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUWFjgKXlf2Ysd6AgXm vB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHk fY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3 fsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZ EoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl 1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/7HW/ lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/FlUQqmMGqz9IgcgA38coro g14= -----END CERTIFICATE----- Taiwan GRCA =========== -----BEGIN CERTIFICATE----- MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG EwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X DTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv dmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD ggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN w8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5 BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O 1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO htX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov J5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7 Q3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t B6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB O9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8 lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV HRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2 09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj Zwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2 Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU D7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz DxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk Z6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk 7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy +fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS -----END CERTIFICATE----- Swisscom Root CA 1 ================== -----BEGIN CERTIFICATE----- MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQG EwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2VydGlmaWNhdGUgU2Vy dmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3QgQ0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4 MTgyMjA2MjBaMGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGln aXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIIC IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9m2BtRsiM MW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdihFvkcxC7mlSpnzNApbjyF NDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/TilftKaNXXsLmREDA/7n29uj/x2lzZAe AR81sH8A25Bvxn570e56eqeqDFdvpG3FEzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkC b6dJtDZd0KTeByy2dbcokdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn 7uHbHaBuHYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNFvJbN cA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo19AOeCMgkckkKmUp WyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjCL3UcPX7ape8eYIVpQtPM+GP+HkM5 haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJWbjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNY MUJDLXT5xp6mig/p/r+D5kNXJLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYw HQYDVR0hBBYwFDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzcK6FptWfUjNP9 MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzfky9NfEBWMXrrpA9gzXrzvsMn jgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7IkVh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQ MbFamIp1TpBcahQq4FJHgmDmHtqBsfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4H VtA4oJVwIHaM190e3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtl vrsRls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ipmXeascCl OS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HHb6D0jqTsNFFbjCYDcKF3 1QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksfrK/7DZBaZmBwXarNeNQk7shBoJMBkpxq nvy5JMWzFYJ+vq6VK+uxwNrjAWALXmmshFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCy x/yP2FS1k2Kdzs9Z+z0YzirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMW NY6E0F/6MBr1mmz0DlP5OlvRHA== -----END CERTIFICATE----- DigiCert Assured ID Root CA =========================== -----BEGIN CERTIFICATE----- MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO 9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW /lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF 66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i 8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe +o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== -----END CERTIFICATE----- DigiCert Global Root CA ======================= -----BEGIN CERTIFICATE----- MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5 BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H 4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y 7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm 8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886 UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= -----END CERTIFICATE----- DigiCert High Assurance EV Root CA ================================== -----BEGIN CERTIFICATE----- MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3 MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K -----END CERTIFICATE----- Certplus Class 2 Primary CA =========================== -----BEGIN CERTIFICATE----- MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR 5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+ 7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW //1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 l7+ijrRU -----END CERTIFICATE----- DST Root CA X3 ============== -----BEGIN CERTIFICATE----- MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1 cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9 UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ -----END CERTIFICATE----- DST ACES CA X6 ============== -----BEGIN CERTIFICATE----- MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQG EwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VT MRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NTha MFsxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UE CxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOC AQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzI DZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCa pCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKBXy314pow GCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPy MjwmR/onJALJfh1biEITajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1Ud EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3Qu Y29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnRy dXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMtaW5kZXguaHRtbDAdBgNVHQ4EFgQU CXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V2 5FYrnJmQ6AgwbN99Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t Fr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpRrscL9yuwNwXs vFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3 oKfN5XozNmr6mis= -----END CERTIFICATE----- SwissSign Gold CA - G2 ====================== -----BEGIN CERTIFICATE----- MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkNIMRUw EwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcN MDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dp c3NTaWduIEFHMR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0B AQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUq t2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5C jCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpg vd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbLtK/tREDF ylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvR AiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuend jIj3o02yMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkO peUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59je883WX0XaxR 7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxMgI93e2CaHt+28kgeDrpOVG2Y4OGi GqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw AwEB/zAdBgNVHQ4EFgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64 OfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe645R88a7A3hfm 5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr 44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOf Mke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6m Gu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxp mo/a77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJk vC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7XdVAyksLf KzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG2mqeSz53OiATIgHQv2ieY2Br NU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6Lqj viOvrv1vA+ACOzB2+httQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ -----END CERTIFICATE----- SwissSign Silver CA - G2 ======================== -----BEGIN CERTIFICATE----- MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCQ0gxFTAT BgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMB4X DTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0NlowRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3 aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG 9w0BAQEFAAOCAg8AMIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644 N0MvFz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7brYT7QbNHm +/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieFnbAVlDLaYQ1HTWBCrpJH 6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH6ATK72oxh9TAtvmUcXtnZLi2kUpCe2Uu MGoM9ZDulebyzYLs2aFK7PayS+VFheZteJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5h qAaEuSh6XzjZG6k4sIN/c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5 FZGkECwJMoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRHHTBs ROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTfjNFusB3hB48IHpmc celM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb65i/4z3GcRm25xBWNOHkDRUjvxF3X CO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ BAUwAwEB/zAdBgNVHQ4EFgQUF6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRB tjpbO8tFnb0cwpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0 cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBAHPGgeAn0i0P 4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShpWJHckRE1qTodvBqlYJ7YH39F kWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L 3XWgwF15kIwb4FDm3jH+mHtwX6WQ2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx /uNncqCxv1yL5PqZIseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFa DGi8aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2Xem1ZqSqP e97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQRdAtq/gsD/KNVV4n+Ssuu WxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJ DIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ub DgEj8Z+7fNzcbBGXJbLytGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u -----END CERTIFICATE----- GeoTrust Primary Certification Authority ======================================== -----BEGIN CERTIFICATE----- MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9 nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG 1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= -----END CERTIFICATE----- thawte Primary Root CA ====================== -----BEGIN CERTIFICATE----- MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3 MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ 1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89 jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA== -----END CERTIFICATE----- VeriSign Class 3 Public Primary Certification Authority - G5 ============================================================ -----BEGIN CERTIFICATE----- MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/ Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/ BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+ X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq -----END CERTIFICATE----- SecureTrust CA ============== -----BEGIN CERTIFICATE----- MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b 01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/ BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR 3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= -----END CERTIFICATE----- Secure Global CA ================ -----BEGIN CERTIFICATE----- MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g 8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi 0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+ OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5 3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW -----END CERTIFICATE----- COMODO Certification Authority ============================== -----BEGIN CERTIFICATE----- MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1 dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH +7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV 4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA 1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN +8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ== -----END CERTIFICATE----- Network Solutions Certificate Authority ======================================= -----BEGIN CERTIFICATE----- MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc /Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q 4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/ GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey -----END CERTIFICATE----- WellsSecure Public Root Certificate Authority ============================================= -----BEGIN CERTIFICATE----- MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoM F1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYw NAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN MDcxMjEzMTcwNzU0WhcNMjIxMjE0MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dl bGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYD VQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+rWxxTkqxtnt3CxC5FlAM1 iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjUDk/41itMpBb570OYj7OeUt9tkTmPOL13 i0Nj67eT/DBMHAGTthP796EfvyXhdDcsHqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8 bJVhHlfXBIEyg1J55oNjz7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiB K0HmOFafSZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/SlwxlAgMB AAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly9jcmwu cGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0PAQH/BAQDAgHGMB0GA1UdDgQWBBQm lRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0jBIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGB i6SBiDCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRww GgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEBALkVsUSRzCPI K0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd/ZDJPHV3V3p9+N701NX3leZ0 bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pBA4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSlj qHyita04pO2t/caaH/+Xc/77szWnk4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+es E2fDbbFwRnzVlhE9iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJ tylv2G0xffX8oRAHh84vWdw+WNs= -----END CERTIFICATE----- COMODO ECC Certification Authority ================================== -----BEGIN CERTIFICATE----- MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X 4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= -----END CERTIFICATE----- IGC/A ===== -----BEGIN CERTIFICATE----- MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYTAkZSMQ8wDQYD VQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVE Q1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZy MB4XDTAyMTIxMzE0MjkyM1oXDTIwMTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQI EwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NT STEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMIIB IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaIs9z4iPf930Pfeo2aSVz2 TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCW So7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYy HF2fYPepraX/z9E0+X1bF8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNd frGoRpAxVs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGdPDPQ tQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNVHSAEDjAMMAoGCCqB egF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAxNjAfBgNVHSMEGDAWgBSjBS8YYFDC iQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUFAAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RK q89toB9RlPhJy3Q2FLwV3duJL92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3Q MZsyK10XZZOYYLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2aNjSaTFR+FwNI lQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R0982gaEbeC9xs/FZTEYYKKuF 0mBWWg== -----END CERTIFICATE----- Security Communication EV RootCA1 ================================= -----BEGIN CERTIFICATE----- MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDElMCMGA1UEChMc U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMhU2VjdXJpdHkgQ29tbXVuaWNh dGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIzMloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UE BhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNl Y3VyaXR5IENvbW11bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC AQoCggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSERMqm4miO /VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gOzXppFodEtZDkBp2uoQSX WHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4z ZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDFMxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4 bepJz11sS6/vmsJWXMY1VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK 9U2vP9eCOKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG SIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HWtWS3irO4G8za+6xm iEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZq51ihPZRwSzJIxXYKLerJRO1RuGG Av8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDbEJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnW mHyojf6GPgcWkuF75x3sM3Z+Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEW T1MKZPlO9L9OVL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490 -----END CERTIFICATE----- OISTE WISeKey Global Root GA CA =============================== -----BEGIN CERTIFICATE----- MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5 IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9 Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ /yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4 +vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0= -----END CERTIFICATE----- Microsec e-Szigno Root CA ========================= -----BEGIN CERTIFICATE----- MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAwcjELMAkGA1UE BhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNyb3NlYyBMdGQuMRQwEgYDVQQL EwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0 MDYxMjI4NDRaFw0xNzA0MDYxMjI4NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVz dDEWMBQGA1UEChMNTWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMT GU1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB AQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2uuO/TEdyB5s87lozWbxXG d36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/N oqdNAoI/gqyFxuEPkEeZlApxcpMqyabAvjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjc QR/Ji3HWVBTji1R4P770Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJ PqW+jqpx62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcBAQRb MFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3AwLQYIKwYBBQUHMAKG IWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAPBgNVHRMBAf8EBTADAQH/MIIBcwYD VR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIBAQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3 LmUtc3ppZ25vLmh1L1NaU1ovMIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0A dAB2AOEAbgB5ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABTAHoAbwBsAGcA 4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABhACAAcwB6AGUAcgBpAG4AdAAg AGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABoAHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMA egBpAGcAbgBvAC4AaAB1AC8AUwBaAFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6 Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NO PU1pY3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxPPU1pY3Jv c2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdDtiaW5h cnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuBEGluZm9AZS1zemlnbm8uaHWkdzB1MSMw IQYDVQQDDBpNaWNyb3NlYyBlLVN6aWduw7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhT WjEWMBQGA1UEChMNTWljcm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhV MIGsBgNVHSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJIVTER MA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDASBgNVBAsTC2UtU3pp Z25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBSb290IENBghEAzLjnv04pGv2i3Gal HCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMT nGZjWS7KXHAM/IO8VbH0jgdsZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FE aGAHQzAxQmHl7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a 86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfRhUZLphK3dehK yVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/MPMMNz7UwiiAc7EBt51alhQB S6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU= -----END CERTIFICATE----- Certigna ======== -----BEGIN CERTIFICATE----- MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3 MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+ ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY 1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== -----END CERTIFICATE----- Deutsche Telekom Root CA 2 ========================== -----BEGIN CERTIFICATE----- MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5 MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5 bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8 rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU Cm26OWMohpLzGITY+9HPBVZkVw== -----END CERTIFICATE----- Cybertrust Global Root ====================== -----BEGIN CERTIFICATE----- MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4 MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA +Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW 0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin 89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT 8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2 MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi 5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2 hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW WL1WMRJOEcgh4LMRkWXbtKaIOM5V -----END CERTIFICATE----- ePKI Root Certification Authority ================================= -----BEGIN CERTIFICATE----- MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX 12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+ ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/ vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0 1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw= -----END CERTIFICATE----- T\xc3\x9c\x42\xC4\xB0TAK UEKAE K\xC3\xB6k Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 - S\xC3\xBCr\xC3\xBCm 3 ============================================================================================================================= -----BEGIN CERTIFICATE----- MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRSMRgwFgYDVQQH DA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJpbGltc2VsIHZlIFRla25vbG9q aWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSwVEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ry b25payB2ZSBLcmlwdG9sb2ppIEFyYcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNV BAsMGkthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUg S8O2ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAeFw0wNzA4 MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIxGDAWBgNVBAcMD0dlYnpl IC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmHF n3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBUQUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZl IEtyaXB0b2xvamkgQXJhxZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2Ft dSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7ZrIFNl cnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIBIjANBgkqhkiG9w0B AQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4hgb46ezzb8R1Sf1n68yJMlaCQvEhO Eav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yKO7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1 xnnRFDDtG1hba+818qEhTsXOfJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR 6Oqeyjh1jmKwlZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQIDAQABo0IwQDAd BgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF MAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmPNOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4 N5EY3ATIZJkrGG2AA1nJrvhY0D7twyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLT y9LQQfMmNkqblWwM7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYh LBOhgLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5noN+J1q2M dqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUsyZyQ2uypQjyttgI= -----END CERTIFICATE----- Buypass Class 2 CA 1 ==================== -----BEGIN CERTIFICATE----- MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMiBDQSAxMB4XDTA2 MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7M cXA0ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLXl18xoS83 0r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVBHfCuuCkslFJgNJQ72uA4 0Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/R uFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNC MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0P AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLPgcIV 1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+DKhQ7SLHrQVMdvvt 7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKuBctN518fV4bVIJwo+28TOPX2EZL2 fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHsh7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5w wDX3OaJdZtB7WZ+oRxKaJyOkLY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho -----END CERTIFICATE----- EBG Elektronik Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 ========================================================================== -----BEGIN CERTIFICATE----- MIIF5zCCA8+gAwIBAgIITK9zQhyOdAIwDQYJKoZIhvcNAQEFBQAwgYAxODA2BgNVBAMML0VCRyBF bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMTcwNQYDVQQKDC5FQkcg QmlsacWfaW0gVGVrbm9sb2ppbGVyaSB2ZSBIaXptZXRsZXJpIEEuxZ4uMQswCQYDVQQGEwJUUjAe Fw0wNjA4MTcwMDIxMDlaFw0xNjA4MTQwMDMxMDlaMIGAMTgwNgYDVQQDDC9FQkcgRWxla3Ryb25p ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTE3MDUGA1UECgwuRUJHIEJpbGnFn2lt IFRla25vbG9qaWxlcmkgdmUgSGl6bWV0bGVyaSBBLsWeLjELMAkGA1UEBhMCVFIwggIiMA0GCSqG SIb3DQEBAQUAA4ICDwAwggIKAoICAQDuoIRh0DpqZhAy2DE4f6en5f2h4fuXd7hxlugTlkaDT7by X3JWbhNgpQGR4lvFzVcfd2NR/y8927k/qqk153nQ9dAktiHq6yOU/im/+4mRDGSaBUorzAzu8T2b gmmkTPiab+ci2hC6X5L8GCcKqKpE+i4stPtGmggDg3KriORqcsnlZR9uKg+ds+g75AxuetpX/dfr eYteIAbTdgtsApWjluTLdlHRKJ2hGvxEok3MenaoDT2/F08iiFD9rrbskFBKW5+VQarKD7JK/oCZ TqNGFav4c0JqwmZ2sQomFd2TkuzbqV9UIlKRcF0T6kjsbgNs2d1s/OsNA/+mgxKb8amTD8UmTDGy Y5lhcucqZJnSuOl14nypqZoaqsNW2xCaPINStnuWt6yHd6i58mcLlEOzrz5z+kI2sSXFCjEmN1Zn uqMLfdb3ic1nobc6HmZP9qBVFCVMLDMNpkGMvQQxahByCp0OLna9XvNRiYuoP1Vzv9s6xiQFlpJI qkuNKgPlV5EQ9GooFW5Hd4RcUXSfGenmHmMWOeMRFeNYGkS9y8RsZteEBt8w9DeiQyJ50hBs37vm ExH8nYQKE3vwO9D8owrXieqWfo1IhR5kX9tUoqzVegJ5a9KK8GfaZXINFHDk6Y54jzJ0fFfy1tb0 Nokb+Clsi7n2l9GkLqq+CxnCRelwXQIDAJ3Zo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB /wQEAwIBBjAdBgNVHQ4EFgQU587GT/wWZ5b6SqMHwQSny2re2kcwHwYDVR0jBBgwFoAU587GT/wW Z5b6SqMHwQSny2re2kcwDQYJKoZIhvcNAQEFBQADggIBAJuYml2+8ygjdsZs93/mQJ7ANtyVDR2t FcU22NU57/IeIl6zgrRdu0waypIN30ckHrMk2pGI6YNw3ZPX6bqz3xZaPt7gyPvT/Wwp+BVGoGgm zJNSroIBk5DKd8pNSe/iWtkqvTDOTLKBtjDOWU/aWR1qeqRFsIImgYZ29fUQALjuswnoT4cCB64k XPBfrAowzIpAoHMEwfuJJPaaHFy3PApnNgUIMbOv2AFoKuB4j3TeuFGkjGwgPaL7s9QJ/XvCgKqT bCmYIai7FvOpEl90tYeY8pUm3zTvilORiF0alKM/fCL414i6poyWqD1SNGKfAB5UVUJnxk1Gj7sU RT0KlhaOEKGXmdXTMIXM3rRyt7yKPBgpaP3ccQfuJDlq+u2lrDgv+R4QDgZxGhBM/nV+/x5XOULK 1+EVoVZVWRvRo68R2E7DpSvvkL/A7IITW43WciyTTo9qKd+FPNMN4KIYEsxVL0e3p5sC/kH2iExt 2qkBR4NkJ2IQgtYSe14DHzSpyZH+r11thie3I6p1GMog57AP14kOpmciY/SDQSsGS7tY1dHXt7kQ Y9iJSrSq3RZj9W6+YKH47ejWkE8axsWgKdOnIaj1Wjz3x0miIZpKlVIglnKaZsv30oZDfCK+lvm9 AahH3eU7QPl1K5srRmSGjR70j/sHd9DqSaIcjVIUpgqT -----END CERTIFICATE----- certSIGN ROOT CA ================ -----BEGIN CERTIFICATE----- MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2 ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD 0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943 AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8 SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0 x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD -----END CERTIFICATE----- CNNIC ROOT ========== -----BEGIN CERTIFICATE----- MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJDTjEOMAwGA1UE ChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2MDcwOTE0WhcNMjcwNDE2MDcw OTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1Qw ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzD o+/hn7E7SIX1mlwhIhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tiz VHa6dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZOV/kbZKKT VrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrCGHn2emU1z5DrvTOTn1Or czvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gNv7Sg2Ca+I19zN38m5pIEo3/PIKe38zrK y5nLAgMBAAGjczBxMBEGCWCGSAGG+EIBAQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscC wQ7vptU7ETAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991S lgrHAsEO76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnKOOK5 Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvHugDnuL8BV8F3RTIM O/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7HgviyJA/qIYM/PmLXoXLT1tLYhFHxUV8 BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fLbuXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2 G8kS1sHNzYDzAgE8yGnLRUhj2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5m mxE= -----END CERTIFICATE----- ApplicationCA - Japanese Government =================================== -----BEGIN CERTIFICATE----- MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEcMBoGA1UEChMT SmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRpb25DQTAeFw0wNzEyMTIxNTAw MDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYTAkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zl cm5tZW50MRYwFAYDVQQLEw1BcHBsaWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB CgKCAQEAp23gdE6Hj6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4 fl+Kf5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55IrmTwcrN wVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cwFO5cjFW6WY2H/CPek9AE jP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDihtQWEjdnjDuGWk81quzMKq2edY3rZ+nYVu nyoKb58DKTCXKB28t89UKU5RMfkntigm/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRU WssmP3HMlEYNllPqa0jQk/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNV BAYTAkpQMRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOCseOD vOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADlqRHZ3ODrs o2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJhyzjVOGjprIIC8CFqMjSnHH2HZ9g /DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYD io+nEhEMy/0/ecGc/WLuo89UDNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmW dupwX3kSa+SjB1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL rosot4LKGAfmt1t06SAZf7IbiVQ= -----END CERTIFICATE----- GeoTrust Primary Certification Authority - G3 ============================================= -----BEGIN CERTIFICATE----- MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0 IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr 2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9 cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt -----END CERTIFICATE----- thawte Primary Root CA - G2 =========================== -----BEGIN CERTIFICATE----- MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5 8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== -----END CERTIFICATE----- thawte Primary Root CA - G3 =========================== -----BEGIN CERTIFICATE----- MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC +BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY 7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC 8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A= -----END CERTIFICATE----- GeoTrust Primary Certification Authority - G2 ============================================= -----BEGIN CERTIFICATE----- MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1 OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+ EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2 npaqBA+K -----END CERTIFICATE----- VeriSign Universal Root Certification Authority =============================================== -----BEGIN CERTIFICATE----- MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0 aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj 1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72 9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3 Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4 mJO37M2CYfE45k+XmCpajQ== -----END CERTIFICATE----- VeriSign Class 3 Public Primary Certification Authority - G4 ============================================================ -----BEGIN CERTIFICATE----- MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3 b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5 IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8 Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB /zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== -----END CERTIFICATE----- NetLock Arany (Class Gold) Főtanúsítvány ============================================ -----BEGIN CERTIFICATE----- MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610 dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6 c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu 0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw /HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1 neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= -----END CERTIFICATE----- Staat der Nederlanden Root CA - G2 ================================== -----BEGIN CERTIFICATE----- MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g Um9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oXDTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMC TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ 5291qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8SpuOUfiUtn vWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPUZ5uW6M7XxgpT0GtJlvOj CwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvEpMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiil e7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCR OME4HYYEhLoaJXhena/MUGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpI CT0ugpTNGmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy5V65 48r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv6q012iDTiIJh8BIi trzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEKeN5KzlW/HdXZt1bv8Hb/C3m1r737 qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMB AAGjgZcwgZQwDwYDVR0TAQH/BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcC ARYxaHR0cDovL3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqGSIb3DQEBCwUA A4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLySCZa59sCrI2AGeYwRTlHSeYAz +51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwj f/ST7ZwaUb7dRUG/kSS0H4zpX897IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaN kqbG9AclVMwWVxJKgnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfk CpYL+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxLvJxxcypF URmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkmbEgeqmiSBeGCc1qb3Adb CG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvkN1trSt8sV4pAWja63XVECDdCcAz+3F4h oKOKwJCcaNpQ5kUQR3i2TtJlycM33+FCY7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoV IPVVYpbtbZNQvOSqeK3Zywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm 66+KAQ== -----END CERTIFICATE----- CA Disig ======== -----BEGIN CERTIFICATE----- MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMK QnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwHhcNMDYw MzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlz bGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3 DQEBAQUAA4IBDwAwggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgm GErENx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnXmjxUizkD Pw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYDXcDtab86wYqg6I7ZuUUo hwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhWS8+2rT+MitcE5eN4TPWGqvWP+j1scaMt ymfraHtuM6kMgiioTGohQBUgDCZbg8KpFhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8w gfwwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0P AQH/BAQDAgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cuZGlz aWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5zay9jYS9jcmwvY2Ff ZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2svY2EvY3JsL2NhX2Rpc2lnLmNybDAa BgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEwDQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59t WDYcPQuBDRIrRhCA/ec8J9B6yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3 mkkp7M5+cTxqEEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/ CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeBEicTXxChds6K ezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFNPGO+I++MzVpQuGhU+QqZMxEA 4Z7CRneC9VkGjCFMhwnN5ag= -----END CERTIFICATE----- Juur-SK ======= -----BEGIN CERTIFICATE----- MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcNAQkBFglwa2lA c2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMRAw DgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMwMVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqG SIb3DQEJARYJcGtpQHNrLmVlMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVy aW1pc2tlc2t1czEQMA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC ggEBAIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOBSvZiF3tf TQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkzABpTpyHhOEvWgxutr2TC +Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvHLCu3GFH+4Hv2qEivbDtPL+/40UceJlfw UR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMPPbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDa Tpxt4brNj3pssAki14sL2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQF MAMBAf8wggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwICMIHD HoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDkAGwAagBhAHMAdABh AHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0AHMAZQBlAHIAaQBtAGkAcwBrAGUA cwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABzAGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABr AGkAbgBuAGkAdABhAG0AaQBzAGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nw cy8wKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcYP2/v6X2+MA4G A1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOiCfP+JmeaUOTDBS8rNXiRTHyo ERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+gkcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyL abVAyJRld/JXIWY7zoVAtjNjGr95HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678 IIbsSt4beDI3poHSna9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkh Mp6qqIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0ZTbvGRNs2 yyqcjg== -----END CERTIFICATE----- Hongkong Post Root CA 1 ======================= -----BEGIN CERTIFICATE----- MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1 ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT c4afU9hDDl3WY4JxHYB0yvbiAmvZWg== -----END CERTIFICATE----- SecureSign RootCA11 =================== -----BEGIN CERTIFICATE----- MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1 cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01 y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061 lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I= -----END CERTIFICATE----- ACEDICOM Root ============= -----BEGIN CERTIFICATE----- MIIFtTCCA52gAwIBAgIIYY3HhjsBggUwDQYJKoZIhvcNAQEFBQAwRDEWMBQGA1UEAwwNQUNFRElD T00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMB4XDTA4 MDQxODE2MjQyMloXDTI4MDQxMzE2MjQyMlowRDEWMBQGA1UEAwwNQUNFRElDT00gUm9vdDEMMAoG A1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMIICIjANBgkqhkiG9w0BAQEF AAOCAg8AMIICCgKCAgEA/5KV4WgGdrQsyFhIyv2AVClVYyT/kGWbEHV7w2rbYgIB8hiGtXxaOLHk WLn709gtn70yN78sFW2+tfQh0hOR2QetAQXW8713zl9CgQr5auODAKgrLlUTY4HKRxx7XBZXehuD YAQ6PmXDzQHe3qTWDLqO3tkE7hdWIpuPY/1NFgu3e3eM+SW10W2ZEi5PGrjm6gSSrj0RuVFCPYew MYWveVqc/udOXpJPQ/yrOq2lEiZmueIM15jO1FillUAKt0SdE3QrwqXrIhWYENiLxQSfHY9g5QYb m8+5eaA9oiM/Qj9r+hwDezCNzmzAv+YbX79nuIQZ1RXve8uQNjFiybwCq0Zfm/4aaJQ0PZCOrfbk HQl/Sog4P75n/TSW9R28MHTLOO7VbKvU/PQAtwBbhTIWdjPp2KOZnQUAqhbm84F9b32qhm2tFXTT xKJxqvQUfecyuB+81fFOvW8XAjnXDpVCOscAPukmYxHqC9FK/xidstd7LzrZlvvoHpKuE1XI2Sf2 3EgbsCTBheN3nZqk8wwRHQ3ItBTutYJXCb8gWH8vIiPYcMt5bMlL8qkqyPyHK9caUPgn6C9D4zq9 2Fdx/c6mUlv53U3t5fZvie27k5x2IXXwkkwp9y+cAS7+UEaeZAwUswdbxcJzbPEHXEUkFDWug/Fq TYl6+rPYLWbwNof1K1MCAwEAAaOBqjCBpzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKaz 4SsrSbbXc6GqlPUB53NlTKxQMA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUprPhKytJttdzoaqU 9QHnc2VMrFAwRAYDVR0gBD0wOzA5BgRVHSAAMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly9hY2VkaWNv bS5lZGljb21ncm91cC5jb20vZG9jMA0GCSqGSIb3DQEBBQUAA4ICAQDOLAtSUWImfQwng4/F9tqg aHtPkl7qpHMyEVNEskTLnewPeUKzEKbHDZ3Ltvo/Onzqv4hTGzz3gvoFNTPhNahXwOf9jU8/kzJP eGYDdwdY6ZXIfj7QeQCM8htRM5u8lOk6e25SLTKeI6RF+7YuE7CLGLHdztUdp0J/Vb77W7tH1Pwk zQSulgUV1qzOMPPKC8W64iLgpq0i5ALudBF/TP94HTXa5gI06xgSYXcGCRZj6hitoocf8seACQl1 ThCojz2GuHURwCRiipZ7SkXp7FnFvmuD5uHorLUwHv4FB4D54SMNUI8FmP8sX+g7tq3PgbUhh8oI KiMnMCArz+2UW6yyetLHKKGKC5tNSixthT8Jcjxn4tncB7rrZXtaAWPWkFtPF2Y9fwsZo5NjEFIq nxQWWOLcpfShFosOkYuByptZ+thrkQdlVV9SH686+5DdaaVbnG0OLLb6zqylfDJKZ0DcMDQj3dcE I2bw/FWAp/tmGYI1Z2JwOV5vx+qQQEQIHriy1tvuWacNGHk0vFQYXlPKNFHtRQrmjseCNj6nOGOp MCwXEGCSn1WHElkQwg9naRHMTh5+Spqtr0CodaxWkHS4oJyleW/c6RrIaQXpuvoDs3zk4E7Czp3o tkYNbn5XOmeUwssfnHdKZ05phkOTOPu220+DkdRgfks+KzgHVZhepA== -----END CERTIFICATE----- Microsec e-Szigno Root CA 2009 ============================== -----BEGIN CERTIFICATE----- MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG 0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm 1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02 yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi LXpUq3DDfSJlgnCW -----END CERTIFICATE----- GlobalSign Root CA - R3 ======================= -----BEGIN CERTIFICATE----- MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ 0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3 rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2 xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7 lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8 EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18 YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r kpeDMdmztcpHWD9f -----END CERTIFICATE----- Autoridad de Certificacion Firmaprofesional CIF A62634068 ========================================================= -----BEGIN CERTIFICATE----- MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY 7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx 51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi 6Et8Vcad+qMUu2WFbm5PEn4KPJ2V -----END CERTIFICATE----- Izenpe.com ========== -----BEGIN CERTIFICATE----- MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4MQswCQYDVQQG EwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wHhcNMDcxMjEz MTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMu QS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ 03rKDx6sp4boFmVqscIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAK ClaOxdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6HLmYRY2xU +zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFXuaOKmMPsOzTFlUFpfnXC PCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQDyCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxT OTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbK F7jJeodWLBoBHmy+E60QrLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK 0GqfvEyNBjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8Lhij+ 0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIBQFqNeb+Lz0vPqhbB leStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+HMh3/1uaD7euBUbl8agW7EekFwID AQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2luZm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+ SVpFTlBFIFMuQS4gLSBDSUYgQTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBG NjIgUzgxQzBBBgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O BBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUAA4ICAQB4pgwWSp9MiDrAyw6l Fn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWblaQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbga kEyrkgPH7UIBzg/YsfqikuFgba56awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8q hT/AQKM6WfxZSzwoJNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Cs g1lwLDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCTVyvehQP5 aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGkLhObNA5me0mrZJfQRsN5 nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJbUjWumDqtujWTI6cfSN01RpiyEGjkpTHC ClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZo Q0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z WrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== -----END CERTIFICATE----- Chambers of Commerce Root - 2008 ================================ -----BEGIN CERTIFICATE----- MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/ ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331 lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ 0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2 EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1 wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH 3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6 M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1 YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF 9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ -----END CERTIFICATE----- Global Chambersign Root - 2008 ============================== -----BEGIN CERTIFICATE----- MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0 ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB /gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp 1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0 dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG /5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6 ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg 9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z 09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B -----END CERTIFICATE----- Go Daddy Root Certificate Authority - G2 ======================================== -----BEGIN CERTIFICATE----- MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq 9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD +qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9 BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r 5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1 -----END CERTIFICATE----- Starfield Root Certificate Authority - G2 ========================================= -----BEGIN CERTIFICATE----- MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0 eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx 4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 -----END CERTIFICATE----- Starfield Services Root Certificate Authority - G2 ================================================== -----BEGIN CERTIFICATE----- MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2 h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6 -----END CERTIFICATE----- AffirmTrust Commercial ====================== -----BEGIN CERTIFICATE----- MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6 BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv 0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= -----END CERTIFICATE----- AffirmTrust Networking ====================== -----BEGIN CERTIFICATE----- MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24 /PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6 12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23 WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9 /ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= -----END CERTIFICATE----- AffirmTrust Premium =================== -----BEGIN CERTIFICATE----- MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV 5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs +7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04 6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5 /bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo +Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB /wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC 6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK +4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60 g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw== -----END CERTIFICATE----- AffirmTrust Premium ECC ======================= -----BEGIN CERTIFICATE----- MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X 57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM eQ== -----END CERTIFICATE----- Certum Trusted Network CA ========================= -----BEGIN CERTIFICATE----- MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4 fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0 cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1 mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI 03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= -----END CERTIFICATE----- Certinomis - Autorité Racine ============================= -----BEGIN CERTIFICATE----- MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjETMBEGA1UEChMK Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAkBgNVBAMMHUNlcnRpbm9taXMg LSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkG A1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYw JAYDVQQDDB1DZXJ0aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQAD ggIPADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jYF1AMnmHa wE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N8y4oH3DfVS9O7cdxbwly Lu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWerP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw 2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92N jMD2AR5vpTESOH2VwnHu7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9q c1pkIuVC28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6lSTC lrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1Enn1So2+WLhl+HPNb xxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB0iSVL1N6aaLwD4ZFjliCK0wi1F6g 530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql095gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna 4NH4+ej9Uji29YnfAgMBAAGjWzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G A1UdDgQWBBQNjLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9sov3/4gbIOZ/x WqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZMOH8oMDX/nyNTt7buFHAAQCva R6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40 nJ+U8/aGH88bc62UeYdocMMzpXDn2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1B CxMjidPJC+iKunqjo3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjv JL1vnxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG5ERQL1TE qkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWqpdEdnV1j6CTmNhTih60b WfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZbdsLLO7XSAPCjDuGtbkD326C00EauFddE wk01+dIL8hf2rGbVJLJP0RyZwG71fet0BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/ vgt2Fl43N+bYdJeimUV5 -----END CERTIFICATE----- Root CA Generalitat Valenciana ============================== -----BEGIN CERTIFICATE----- MIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJFUzEfMB0GA1UE ChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290 IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcNMDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3 WjBoMQswCQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UE CxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0G CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+WmmmO3I2 F0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKjSgbwJ/BXufjpTjJ3Cj9B ZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGlu6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQ D0EbtFpKd71ng+CT516nDOeB0/RSrFOyA8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXte JajCq+TA81yc477OMUxkHl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMB AAGjggM7MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBraS5n dmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIICIwYKKwYBBAG/VQIB ADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBl AHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIAYQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIA YQBsAGkAdABhAHQAIABWAGEAbABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQBy AGEAYwBpAPMAbgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA aQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMAaQBvAG4AYQBt AGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQAZQAgAEEAdQB0AG8AcgBpAGQA YQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBu AHQAcgBhACAAZQBuACAAbABhACAAZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAA OgAvAC8AdwB3AHcALgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0 dHA6Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+yeAT8MIGV BgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQswCQYDVQQGEwJFUzEfMB0G A1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5S b290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRh TvW1yEICKrNcda3FbcrnlD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdz Ckj+IHLtb8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg9J63 NI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XFducTZnV+ZfsBn5OH iJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmCIoaZM3Fa6hlXPZHNqcCjbgcTpsnt +GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM= -----END CERTIFICATE----- TWCA Root Certification Authority ================================= -----BEGIN CERTIFICATE----- MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP 4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG 9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== -----END CERTIFICATE----- Security Communication RootCA2 ============================== -----BEGIN CERTIFICATE----- MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++ +T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R 3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8 QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk 3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29 mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 -----END CERTIFICATE----- EC-ACC ====== -----BEGIN CERTIFICATE----- MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7 MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4 HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw 0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0 Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2 E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D 5EI= -----END CERTIFICATE----- Hellenic Academic and Research Institutions RootCA 2011 ======================================================= -----BEGIN CERTIFICATE----- MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI 1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa 71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u 8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH 3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/ MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8 MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD /md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N 7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4 -----END CERTIFICATE----- Actalis Authentication Root CA ============================== -----BEGIN CERTIFICATE----- MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQxDjAM BgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UE AwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDky MjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlz IFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTufClrJ wkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlNAJZa by/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45RnijMCO6 zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1f YVEiVRvjRuPjPdA1YprbrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2 oxgkg4YQ51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2Fbe8l EfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxeKF+w6D9Fz8+vm2/7 hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4Fv6MGn8i1zeQf1xcGDXqVdFUNaBr8 EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbnfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5 jF66CyCU3nuDuP/jVo23Eek7jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLY iDrIn3hm7YnzezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQALe3KHwGCmSUyI WOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70jsNjLiNmsGe+b7bAEzlgqqI0 JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDzWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKx K3JCaKygvU5a2hi/a5iB0P2avl4VSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+ Xlff1ANATIGk0k9jpwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC 4yyXX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+OkfcvHlXHo 2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7RK4X9p2jIugErsWx0Hbhz lefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btUZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXem OR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9 vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== -----END CERTIFICATE----- Trustis FPS Root CA =================== -----BEGIN CERTIFICATE----- MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQG EwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQLExNUcnVzdGlzIEZQUyBSb290 IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTExMzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNV BAoTD1RydXN0aXMgTGltaXRlZDEcMBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJ KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQ RUN+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihHiTHcDnlk H5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjjvSkCqPoc4Vu5g6hBSLwa cY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zt o3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlBOrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEA AaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAd BgNVHQ4EFgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01GX2c GE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmWzaD+vkAMXBJV+JOC yinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP41BIy+Q7DsdwyhEQsb8tGD+pmQQ9P 8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZEf1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHV l/9D7S3B2l0pKoU/rGXuhg8FjZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYl iB6XzCGcKQENZetX2fNXlrtIzYE= -----END CERTIFICATE----- StartCom Certification Authority ================================ -----BEGIN CERTIFICATE----- MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0 NjM3WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/ Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt 2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z 6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/ untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT 37uMdBNSSwIDAQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFulF2mHMMo0aEPQ Qa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCCATgwLgYIKwYBBQUHAgEWImh0 dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cu c3RhcnRzc2wuY29tL2ludGVybWVkaWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENv bW1lcmNpYWwgKFN0YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0 aGUgc2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0aWZpY2F0 aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3RhcnRzc2wuY29t L3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBG cmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5 fPGFf59Jb2vKXfuM/gTFwWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWm N3PH/UvSTa0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst0OcN Org+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNcpRJvkrKTlMeIFw6T tn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKlCcWw0bdT82AUuoVpaiF8H3VhFyAX e2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVFP0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA 2MFrLH9ZXF2RsXAiV+uKa0hK1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBs HvUwyKMQ5bLmKhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ8dCAWZvLMdib D4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnmfyWl8kgAwKQB2j8= -----END CERTIFICATE----- StartCom Certification Authority G2 =================================== -----BEGIN CERTIFICATE----- MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMN U3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg RzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UE ChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3Jp dHkgRzIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8O o1XJJZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsDvfOpL9HG 4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnooD/Uefyf3lLE3PbfHkffi Aez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/Q0kGi4xDuFby2X8hQxfqp0iVAXV16iul Q5XqFYSdCI0mblWbq9zSOdIxHWDirMxWRST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbs O+wmETRIjfaAKxojAuuKHDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8H vKTlXcxNnw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM0D4L nMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/iUUjXuG+v+E5+M5iS FGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9Ha90OrInwMEePnWjFqmveiJdnxMa z6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHgTuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8E BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJ KoZIhvcNAQELBQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K 2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfXUfEpY9Z1zRbk J4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl6/2o1PXWT6RbdejF0mCy2wl+ JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG /+gyRr61M3Z3qAFdlsHB1b6uJcDJHgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTc nIhT76IxW1hPkWLIwpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/Xld blhYXzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5lIxKVCCIc l85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoohdVddLHRDiBYmxOlsGOm 7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulrso8uBtjRkcfGEvRM/TAXw8HaOFvjqerm obp573PYtlNXLfbQ4ddI -----END CERTIFICATE----- Buypass Class 2 Root CA ======================= -----BEGIN CERTIFICATE----- MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1 g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn 9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b /+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU CqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff awrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI zRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn Bkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX Uq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs M+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF AAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI osHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S aq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd DnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD LfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0 oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC wWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS CTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN rJgWVqA= -----END CERTIFICATE----- Buypass Class 3 Root CA ======================= -----BEGIN CERTIFICATE----- MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR 5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh 7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH 2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV /afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8 ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2 KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz 6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi Cp/HuZc= -----END CERTIFICATE----- T-TeleSec GlobalRoot Class 3 ============================ -----BEGIN CERTIFICATE----- MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3 DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK 9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W 0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw== -----END CERTIFICATE----- EE Certification Centre Root CA =============================== -----BEGIN CERTIFICATE----- MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG EwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2Vy dGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIw MTAxMDMwMTAxMDMwWhgPMjAzMDEyMTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlB UyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRy ZSBSb290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IB DwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUyeuuOF0+W2Ap7kaJjbMeM TC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvObntl8jixwKIy72KyaOBhU8E2lf/slLo2 rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIwWFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw 93X2PaRka9ZP585ArQ/dMtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtN P2MbRMNE1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYDVR0T AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/zQas8fElyalL1BSZ MEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEF BQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEFBQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+Rj xY6hUFaTlrg4wCQiZrxTFGGVv9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqM lIpPnTX/dqQGE5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU 3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfM dcGWxZ0= -----END CERTIFICATE----- TURKTRUST Certificate Services Provider Root 2007 ================================================= -----BEGIN CERTIFICATE----- MIIEPTCCAyWgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvzE/MD0GA1UEAww2VMOcUktUUlVTVCBF bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP MA0GA1UEBwwGQW5rYXJhMV4wXAYDVQQKDFVUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgQXJhbMSxayAyMDA3MB4X DTA3MTIyNTE4MzcxOVoXDTE3MTIyMjE4MzcxOVowgb8xPzA9BgNVBAMMNlTDnFJLVFJVU1QgRWxl a3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTELMAkGA1UEBhMCVFIxDzAN BgNVBAcMBkFua2FyYTFeMFwGA1UECgxVVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp bGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7Fni4gKGMpIEFyYWzEsWsgMjAwNzCCASIw DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKu3PgqMyKVYFeaK7yc9SrToJdPNM8Ig3BnuiD9N YvDdE3ePYakqtdTyuTFYKTsvP2qcb3N2Je40IIDu6rfwxArNK4aUyeNgsURSsloptJGXg9i3phQv KUmi8wUG+7RP2qFsmmaf8EMJyupyj+sA1zU511YXRxcw9L6/P8JorzZAwan0qafoEGsIiveGHtya KhUG9qPw9ODHFNRRf8+0222vR5YXm3dx2KdxnSQM9pQ/hTEST7ruToK4uT6PIzdezKKqdfcYbwnT rqdUKDT74eA7YH2gvnmJhsifLfkKS8RQouf9eRbHegsYz85M733WB2+Y8a+xwXrXgTW4qhe04MsC AwEAAaNCMEAwHQYDVR0OBBYEFCnFkKslrxHkYb+j/4hhkeYO/pyBMA4GA1UdDwEB/wQEAwIBBjAP BgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAQDdr4Ouwo0RSVgrESLFF6QSU2TJ/s Px+EnWVUXKgWAkD6bho3hO9ynYYKVZ1WKKxmLNA6VpM0ByWtCLCPyA8JWcqdmBzlVPi5RX9ql2+I aE1KBiY3iAIOtsbWcpnOa3faYjGkVh+uX4132l32iPwa2Z61gfAyuOOI0JzzaqC5mxRZNTZPz/OO Xl0XrRWV2N2y1RVuAE6zS89mlOTgzbUF2mNXi+WzqtvALhyQRNsaXRik7r4EW5nVcV9VZWRi1aKb BFmGyGJ353yCRWo9F7/snXUMrqNvWtMvmDb08PUZqxFdyKbjKlhqQgnDvZImZjINXQhVdP+MmNAK poRq0Tl9 -----END CERTIFICATE----- D-TRUST Root Class 3 CA 2 2009 ============================== -----BEGIN CERTIFICATE----- MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQK DAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTAe Fw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NThaME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxE LVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIw DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOAD ER03UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42tSHKXzlA BF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9RySPocq60vFYJfxLLHLGv KZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsMlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7z p+hnUquVH+BGPtikw8paxTGA6Eian5Rp/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUC AwEAAaOCARowggEWMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ 4PGEMA4GA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVjdG9y eS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUyMENBJTIwMiUyMDIw MDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRlcmV2b2NhdGlvbmxpc3QwQ6BBoD+G PWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAw OS5jcmwwDQYJKoZIhvcNAQELBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm 2H6NMLVwMeniacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4KzCUqNQT4YJEV dT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8PIWmawomDeCTmGCufsYkl4ph X5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3YJohw1+qRzT65ysCQblrGXnRl11z+o+I= -----END CERTIFICATE----- D-TRUST Root Class 3 CA 2 EV 2009 ================================= -----BEGIN CERTIFICATE----- MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw OTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUwNDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw OTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfS egpnljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM03TP1YtHh zRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6ZqQTMFexgaDbtCHu39b+T 7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lRp75mpoo6Kr3HGrHhFPC+Oh25z1uxav60 sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure35 11H3a6UCAwEAAaOCASQwggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyv cop9NteaHNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFwOi8v ZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xhc3MlMjAzJTIwQ0El MjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1ERT9jZXJ0aWZpY2F0ZXJldm9jYXRp b25saXN0MEagRKBChkBodHRwOi8vd3d3LmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xh c3NfM19jYV8yX2V2XzIwMDkuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+ PPoeUSbrh/Yp3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNFCSuGdXzfX2lX ANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7naxpeG0ILD5EJt/rDiZE4OJudA NCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqXKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVv w9y4AyHqnxbxLFS1 -----END CERTIFICATE----- PSCProcert ========== -----BEGIN CERTIFICATE----- MIIJhjCCB26gAwIBAgIBCzANBgkqhkiG9w0BAQsFADCCAR4xPjA8BgNVBAMTNUF1dG9yaWRhZCBk ZSBDZXJ0aWZpY2FjaW9uIFJhaXogZGVsIEVzdGFkbyBWZW5lem9sYW5vMQswCQYDVQQGEwJWRTEQ MA4GA1UEBxMHQ2FyYWNhczEZMBcGA1UECBMQRGlzdHJpdG8gQ2FwaXRhbDE2MDQGA1UEChMtU2lz dGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMUMwQQYDVQQLEzpTdXBl cmludGVuZGVuY2lhIGRlIFNlcnZpY2lvcyBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMSUw IwYJKoZIhvcNAQkBFhZhY3JhaXpAc3VzY2VydGUuZ29iLnZlMB4XDTEwMTIyODE2NTEwMFoXDTIw MTIyNTIzNTk1OVowgdExJjAkBgkqhkiG9w0BCQEWF2NvbnRhY3RvQHByb2NlcnQubmV0LnZlMQ8w DQYDVQQHEwZDaGFjYW8xEDAOBgNVBAgTB01pcmFuZGExKjAoBgNVBAsTIVByb3ZlZWRvciBkZSBD ZXJ0aWZpY2Fkb3MgUFJPQ0VSVDE2MDQGA1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZp Y2FjaW9uIEVsZWN0cm9uaWNhMQswCQYDVQQGEwJWRTETMBEGA1UEAxMKUFNDUHJvY2VydDCCAiIw DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANW39KOUM6FGqVVhSQ2oh3NekS1wwQYalNo97BVC wfWMrmoX8Yqt/ICV6oNEolt6Vc5Pp6XVurgfoCfAUFM+jbnADrgV3NZs+J74BCXfgI8Qhd19L3uA 3VcAZCP4bsm+lU/hdezgfl6VzbHvvnpC2Mks0+saGiKLt38GieU89RLAu9MLmV+QfI4tL3czkkoh RqipCKzx9hEC2ZUWno0vluYC3XXCFCpa1sl9JcLB/KpnheLsvtF8PPqv1W7/U0HU9TI4seJfxPmO EO8GqQKJ/+MMbpfg353bIdD0PghpbNjU5Db4g7ayNo+c7zo3Fn2/omnXO1ty0K+qP1xmk6wKImG2 0qCZyFSTXai20b1dCl53lKItwIKOvMoDKjSuc/HUtQy9vmebVOvh+qBa7Dh+PsHMosdEMXXqP+UH 0quhJZb25uSgXTcYOWEAM11G1ADEtMo88aKjPvM6/2kwLkDd9p+cJsmWN63nOaK/6mnbVSKVUyqU td+tFjiBdWbjxywbk5yqjKPK2Ww8F22c3HxT4CAnQzb5EuE8XL1mv6JpIzi4mWCZDlZTOpx+FIyw Bm/xhnaQr/2v/pDGj59/i5IjnOcVdo/Vi5QTcmn7K2FjiO/mpF7moxdqWEfLcU8UC17IAggmosvp r2uKGcfLFFb14dq12fy/czja+eevbqQ34gcnAgMBAAGjggMXMIIDEzASBgNVHRMBAf8ECDAGAQH/ AgEBMDcGA1UdEgQwMC6CD3N1c2NlcnRlLmdvYi52ZaAbBgVghl4CAqASDBBSSUYtRy0yMDAwNDAz Ni0wMB0GA1UdDgQWBBRBDxk4qpl/Qguk1yeYVKIXTC1RVDCCAVAGA1UdIwSCAUcwggFDgBStuyId xuDSAaj9dlBSk+2YwU2u06GCASakggEiMIIBHjE+MDwGA1UEAxM1QXV0b3JpZGFkIGRlIENlcnRp ZmljYWNpb24gUmFpeiBkZWwgRXN0YWRvIFZlbmV6b2xhbm8xCzAJBgNVBAYTAlZFMRAwDgYDVQQH EwdDYXJhY2FzMRkwFwYDVQQIExBEaXN0cml0byBDYXBpdGFsMTYwNAYDVQQKEy1TaXN0ZW1hIE5h Y2lvbmFsIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExQzBBBgNVBAsTOlN1cGVyaW50ZW5k ZW5jaWEgZGUgU2VydmljaW9zIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExJTAjBgkqhkiG 9w0BCQEWFmFjcmFpekBzdXNjZXJ0ZS5nb2IudmWCAQowDgYDVR0PAQH/BAQDAgEGME0GA1UdEQRG MESCDnByb2NlcnQubmV0LnZloBUGBWCGXgIBoAwMClBTQy0wMDAwMDKgGwYFYIZeAgKgEgwQUklG LUotMzE2MzUzNzMtNzB2BgNVHR8EbzBtMEagRKBChkBodHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52 ZS9sY3IvQ0VSVElGSUNBRE8tUkFJWi1TSEEzODRDUkxERVIuY3JsMCOgIaAfhh1sZGFwOi8vYWNy YWl6LnN1c2NlcnRlLmdvYi52ZTA3BggrBgEFBQcBAQQrMCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9v Y3NwLnN1c2NlcnRlLmdvYi52ZTBBBgNVHSAEOjA4MDYGBmCGXgMBAjAsMCoGCCsGAQUFBwIBFh5o dHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9kcGMwDQYJKoZIhvcNAQELBQADggIBACtZ6yKZu4Sq T96QxtGGcSOeSwORR3C7wJJg7ODU523G0+1ng3dS1fLld6c2suNUvtm7CpsR72H0xpkzmfWvADmN g7+mvTV+LFwxNG9s2/NkAZiqlCxB3RWGymspThbASfzXg0gTB1GEMVKIu4YXx2sviiCtxQuPcD4q uxtxj7mkoP3YldmvWb8lK5jpY5MvYB7Eqvh39YtsL+1+LrVPQA3uvFd359m21D+VJzog1eWuq2w1 n8GhHVnchIHuTQfiSLaeS5UtQbHh6N5+LwUeaO6/u5BlOsju6rEYNxxik6SgMexxbJHmpHmJWhSn FFAFTKQAVzAswbVhltw+HoSvOULP5dAssSS830DD7X9jSr3hTxJkhpXzsOfIt+FTvZLm8wyWuevo 5pLtp4EJFAv8lXrPj9Y0TzYS3F7RNHXGRoAvlQSMx4bEqCaJqD8Zm4G7UaRKhqsLEQ+xrmNTbSjq 3TNWOByyrYDT13K9mmyZY+gAu0F2BbdbmRiKw7gSXFbPVgx96OLP7bx0R/vu0xdOIk9W/1DzLuY5 poLWccret9W6aAjtmcz9opLLabid+Qqkpj5PkygqYWwHJgD/ll9ohri4zspV4KuxPX+Y1zMOWj3Y eMLEYC/HYvBhkdI4sPaeVdtAgAUSM84dkpvRabP/v/GSCmE1P93+hvS84Bpxs2Km -----END CERTIFICATE----- China Internet Network Information Center EV Certificates Root ============================================================== -----BEGIN CERTIFICATE----- MIID9zCCAt+gAwIBAgIESJ8AATANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCQ04xMjAwBgNV BAoMKUNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyMUcwRQYDVQQDDD5D aGluYSBJbnRlcm5ldCBOZXR3b3JrIEluZm9ybWF0aW9uIENlbnRlciBFViBDZXJ0aWZpY2F0ZXMg Um9vdDAeFw0xMDA4MzEwNzExMjVaFw0zMDA4MzEwNzExMjVaMIGKMQswCQYDVQQGEwJDTjEyMDAG A1UECgwpQ2hpbmEgSW50ZXJuZXQgTmV0d29yayBJbmZvcm1hdGlvbiBDZW50ZXIxRzBFBgNVBAMM PkNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyIEVWIENlcnRpZmljYXRl cyBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm35z7r07eKpkQ0H1UN+U8i6y jUqORlTSIRLIOTJCBumD1Z9S7eVnAztUwYyZmczpwA//DdmEEbK40ctb3B75aDFk4Zv6dOtouSCV 98YPjUesWgbdYavi7NifFy2cyjw1l1VxzUOFsUcW9SxTgHbP0wBkvUCZ3czY28Sf1hNfQYOL+Q2H klY0bBoQCxfVWhyXWIQ8hBouXJE0bhlffxdpxWXvayHG1VA6v2G5BY3vbzQ6sm8UY78WO5upKv23 KzhmBsUs4qpnHkWnjQRmQvaPK++IIGmPMowUc9orhpFjIpryp9vOiYurXccUwVswah+xt54ugQEC 7c+WXmPbqOY4twIDAQABo2MwYTAfBgNVHSMEGDAWgBR8cks5x8DbYqVPm6oYNJKiyoOCWTAPBgNV HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUfHJLOcfA22KlT5uqGDSSosqD glkwDQYJKoZIhvcNAQEFBQADggEBACrDx0M3j92tpLIM7twUbY8opJhJywyA6vPtI2Z1fcXTIWd5 0XPFtQO3WKwMVC/GVhMPMdoG52U7HW8228gd+f2ABsqjPWYWqJ1MFn3AlUa1UeTiH9fqBk1jjZaM 7+czV0I664zBechNdn3e9rG3geCg+aF4RhcaVpjwTj2rHO3sOdwHSPdj/gauwqRcalsyiMXHM4Ws ZkJHwlgkmeHlPuV1LI5D1l08eB6olYIpUNHRFrrvwb562bTYzB5MRuF3sTGrvSrIzo9uoV1/A3U0 5K2JRVRevq4opbs/eHnrc7MKDf2+yfdWrPa37S+bISnHOLaVxATywy39FCqQmbkHzJ8= -----END CERTIFICATE----- Swisscom Root CA 2 ================== -----BEGIN CERTIFICATE----- MIIF2TCCA8GgAwIBAgIQHp4o6Ejy5e/DfEoeWhhntjANBgkqhkiG9w0BAQsFADBkMQswCQYDVQQG EwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2VydGlmaWNhdGUgU2Vy dmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3QgQ0EgMjAeFw0xMTA2MjQwODM4MTRaFw0zMTA2 MjUwNzM4MTRaMGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGln aXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAyMIIC IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAlUJOhJ1R5tMJ6HJaI2nbeHCOFvErjw0DzpPM LgAIe6szjPTpQOYXTKueuEcUMncy3SgM3hhLX3af+Dk7/E6J2HzFZ++r0rk0X2s682Q2zsKwzxNo ysjL67XiPS4h3+os1OD5cJZM/2pYmLcX5BtS5X4HAB1f2uY+lQS3aYg5oUFgJWFLlTloYhyxCwWJ wDaCFCE/rtuh/bxvHGCGtlOUSbkrRsVPACu/obvLP+DHVxxX6NZp+MEkUp2IVd3Chy50I9AU/SpH Wrumnf2U5NGKpV+GY3aFy6//SSj8gO1MedK75MDvAe5QQQg1I3ArqRa0jG6F6bYRzzHdUyYb3y1a SgJA/MTAtukxGggo5WDDH8SQjhBiYEQN7Aq+VRhxLKX0srwVYv8c474d2h5Xszx+zYIdkeNL6yxS NLCK/RJOlrDrcH+eOfdmQrGrrFLadkBXeyq96G4DsguAhYidDMfCd7Camlf0uPoTXGiTOmekl9Ab mbeGMktg2M7v0Ax/lZ9vh0+Hio5fCHyqW/xavqGRn1V9TrALacywlKinh/LTSlDcX3KwFnUey7QY Ypqwpzmqm59m2I2mbJYV4+by+PGDYmy7Velhk6M99bFXi08jsJvllGov34zflVEpYKELKeRcVVi3 qPyZ7iVNTA6z00yPhOgpD/0QVAKFyPnlw4vP5w8CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYw HQYDVR0hBBYwFDASBgdghXQBUwIBBgdghXQBUwIBMBIGA1UdEwEB/wQIMAYBAf8CAQcwHQYDVR0O BBYEFE0mICKJS9PVpAqhb97iEoHF8TwuMB8GA1UdIwQYMBaAFE0mICKJS9PVpAqhb97iEoHF8Twu MA0GCSqGSIb3DQEBCwUAA4ICAQAyCrKkG8t9voJXiblqf/P0wS4RfbgZPnm3qKhyN2abGu2sEzsO v2LwnN+ee6FTSA5BesogpxcbtnjsQJHzQq0Qw1zv/2BZf82Fo4s9SBwlAjxnffUy6S8w5X2lejjQ 82YqZh6NM4OKb3xuqFp1mrjX2lhIREeoTPpMSQpKwhI3qEAMw8jh0FcNlzKVxzqfl9NX+Ave5XLz o9v/tdhZsnPdTSpxsrpJ9csc1fV5yJmz/MFMdOO0vSk3FQQoHt5FRnDsr7p4DooqzgB53MBfGWcs a0vvaGgLQ+OswWIJ76bdZWGgr4RVSJFSHMYlkSrQwSIjYVmvRRGFHQEkNI/Ps/8XciATwoCqISxx OQ7Qj1zB09GOInJGTB2Wrk9xseEFKZZZ9LuedT3PDTcNYtsmjGOpI99nBjx8Oto0QuFmtEYE3saW mA9LSHokMnWRn6z3aOkquVVlzl1h0ydw2Df+n7mvoC5Wt6NlUe07qxS/TFED6F+KBZvuim6c779o +sjaC+NCydAXFJy3SuCvkychVSa1ZC+N8f+mQAWFBVzKBxlcCxMoTFh/wqXvRdpg065lYZ1Tg3TC rvJcwhbtkj6EPnNgiLx29CzP0H1907he0ZESEOnN3col49XtmS++dYFLJPlFRpTJKSFTnCZFqhMX 5OfNeOI5wSsSnqaeG8XmDtkx2Q== -----END CERTIFICATE----- Swisscom Root EV CA 2 ===================== -----BEGIN CERTIFICATE----- MIIF4DCCA8igAwIBAgIRAPL6ZOJ0Y9ON/RAdBB92ylgwDQYJKoZIhvcNAQELBQAwZzELMAkGA1UE BhMCY2gxETAPBgNVBAoTCFN3aXNzY29tMSUwIwYDVQQLExxEaWdpdGFsIENlcnRpZmljYXRlIFNl cnZpY2VzMR4wHAYDVQQDExVTd2lzc2NvbSBSb290IEVWIENBIDIwHhcNMTEwNjI0MDk0NTA4WhcN MzEwNjI1MDg0NTA4WjBnMQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsT HERpZ2l0YWwgQ2VydGlmaWNhdGUgU2VydmljZXMxHjAcBgNVBAMTFVN3aXNzY29tIFJvb3QgRVYg Q0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMT3HS9X6lds93BdY7BxUglgRCgz o3pOCvrY6myLURYaVa5UJsTMRQdBTxB5f3HSek4/OE6zAMaVylvNwSqD1ycfMQ4jFrclyxy0uYAy Xhqdk/HoPGAsp15XGVhRXrwsVgu42O+LgrQ8uMIkqBPHoCE2G3pXKSinLr9xJZDzRINpUKTk4Rti GZQJo/PDvO/0vezbE53PnUgJUmfANykRHvvSEaeFGHR55E+FFOtSN+KxRdjMDUN/rhPSays/p8Li qG12W0OfvrSdsyaGOx9/5fLoZigWJdBLlzin5M8J0TbDC77aO0RYjb7xnglrPvMyxyuHxuxenPaH Za0zKcQvidm5y8kDnftslFGXEBuGCxobP/YCfnvUxVFkKJ3106yDgYjTdLRZncHrYTNaRdHLOdAG alNgHa/2+2m8atwBz735j9m9W8E6X47aD0upm50qKGsaCnw8qyIL5XctcfaCNYGu+HuB5ur+rPQa m3Rc6I8k9l2dRsQs0h4rIWqDJ2dVSqTjyDKXZpBy2uPUZC5f46Fq9mDU5zXNysRojddxyNMkM3Ox bPlq4SjbX8Y96L5V5jcb7STZDxmPX2MYWFCBUWVv8p9+agTnNCRxunZLWB4ZvRVgRaoMEkABnRDi xzgHcgplwLa7JSnaFp6LNYth7eVxV4O1PHGf40+/fh6Bn0GXAgMBAAGjgYYwgYMwDgYDVR0PAQH/ BAQDAgGGMB0GA1UdIQQWMBQwEgYHYIV0AVMCAgYHYIV0AVMCAjASBgNVHRMBAf8ECDAGAQH/AgED MB0GA1UdDgQWBBRF2aWBbj2ITY1x0kbBbkUe88SAnTAfBgNVHSMEGDAWgBRF2aWBbj2ITY1x0kbB bkUe88SAnTANBgkqhkiG9w0BAQsFAAOCAgEAlDpzBp9SSzBc1P6xXCX5145v9Ydkn+0UjrgEjihL j6p7jjm02Vj2e6E1CqGdivdj5eu9OYLU43otb98TPLr+flaYC/NUn81ETm484T4VvwYmneTwkLbU wp4wLh/vx3rEUMfqe9pQy3omywC0Wqu1kx+AiYQElY2NfwmTv9SoqORjbdlk5LgpWgi/UOGED1V7 XwgiG/W9mR4U9s70WBCCswo9GcG/W6uqmdjyMb3lOGbcWAXH7WMaLgqXfIeTK7KK4/HsGOV1timH 59yLGn602MnTihdsfSlEvoqq9X46Lmgxk7lq2prg2+kupYTNHAq4Sgj5nPFhJpiTt3tm7JFe3VE/ 23MPrQRYCd0EApUKPtN236YQHoA96M2kZNEzx5LH4k5E4wnJTsJdhw4Snr8PyQUQ3nqjsTzyP6Wq J3mtMX0f/fwZacXduT98zca0wjAefm6S139hdlqP65VNvBFuIXxZN5nQBrz5Bm0yFqXZaajh3DyA HmBR3NdUIR7KYndP+tiPsys6DXhyyWhBWkdKwqPrGtcKqzwyVcgKEZzfdNbwQBUdyLmPtTbFr/gi uMod89a2GQ+fYWVq6nTIfI/DT11lgh/ZDYnadXL77/FHZxOzyNEZiCcmmpl5fx7kLD977vHeTYuW l8PVP3wbI+2ksx0WckNLIOFZfsLorSa/ovc= -----END CERTIFICATE----- CA Disig Root R1 ================ -----BEGIN CERTIFICATE----- MIIFaTCCA1GgAwIBAgIJAMMDmu5QkG4oMA0GCSqGSIb3DQEBBQUAMFIxCzAJBgNVBAYTAlNLMRMw EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp ZyBSb290IFIxMB4XDTEyMDcxOTA5MDY1NloXDTQyMDcxOTA5MDY1NlowUjELMAkGA1UEBhMCU0sx EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp c2lnIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCqw3j33Jijp1pedxiy 3QRkD2P9m5YJgNXoqqXinCaUOuiZc4yd39ffg/N4T0Dhf9Kn0uXKE5Pn7cZ3Xza1lK/oOI7bm+V8 u8yN63Vz4STN5qctGS7Y1oprFOsIYgrY3LMATcMjfF9DCCMyEtztDK3AfQ+lekLZWnDZv6fXARz2 m6uOt0qGeKAeVjGu74IKgEH3G8muqzIm1Cxr7X1r5OJeIgpFy4QxTaz+29FHuvlglzmxZcfe+5nk CiKxLU3lSCZpq+Kq8/v8kiky6bM+TR8noc2OuRf7JT7JbvN32g0S9l3HuzYQ1VTW8+DiR0jm3hTa YVKvJrT1cU/J19IG32PK/yHoWQbgCNWEFVP3Q+V8xaCJmGtzxmjOZd69fwX3se72V6FglcXM6pM6 vpmumwKjrckWtc7dXpl4fho5frLABaTAgqWjR56M6ly2vGfb5ipN0gTco65F97yLnByn1tUD3AjL LhbKXEAz6GfDLuemROoRRRw1ZS0eRWEkG4IupZ0zXWX4Qfkuy5Q/H6MMMSRE7cderVC6xkGbrPAX ZcD4XW9boAo0PO7X6oifmPmvTiT6l7Jkdtqr9O3jw2Dv1fkCyC2fg69naQanMVXVz0tv/wQFx1is XxYb5dKj6zHbHzMVTdDypVP1y+E9Tmgt2BLdqvLmTZtJ5cUoobqwWsagtQIDAQABo0IwQDAPBgNV HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUiQq0OJMa5qvum5EY+fU8PjXQ 04IwDQYJKoZIhvcNAQEFBQADggIBADKL9p1Kyb4U5YysOMo6CdQbzoaz3evUuii+Eq5FLAR0rBNR xVgYZk2C2tXck8An4b58n1KeElb21Zyp9HWc+jcSjxyT7Ff+Bw+r1RL3D65hXlaASfX8MPWbTx9B LxyE04nH4toCdu0Jz2zBuByDHBb6lM19oMgY0sidbvW9adRtPTXoHqJPYNcHKfyyo6SdbhWSVhlM CrDpfNIZTUJG7L399ldb3Zh+pE3McgODWF3vkzpBemOqfDqo9ayk0d2iLbYq/J8BjuIQscTK5Gfb VSUZP/3oNn6z4eGBrxEWi1CXYBmCAMBrTXO40RMHPuq2MU/wQppt4hF05ZSsjYSVPCGvxdpHyN85 YmLLW1AL14FABZyb7bq2ix4Eb5YgOe2kfSnbSM6C3NQCjR0EMVrHS/BsYVLXtFHCgWzN4funodKS ds+xDzdYpPJScWc/DIh4gInByLUfkmO+p3qKViwaqKactV2zY9ATIKHrkWzQjX2v3wvkF7mGnjix lAxYjOBVqjtjbZqJYLhkKpLGN/R+Q0O3c+gB53+XD9fyexn9GtePyfqFa3qdnom2piiZk4hA9z7N UaPK6u95RyG1/jLix8NRb76AdPCkwzryT+lf3xkK8jsTQ6wxpLPn6/wY1gGp8yqPNg7rtLG8t0zJ a7+h89n07eLw4+1knj0vllJPgFOL -----END CERTIFICATE----- CA Disig Root R2 ================ -----BEGIN CERTIFICATE----- MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNVBAYTAlNLMRMw EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp ZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQyMDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sx EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp c2lnIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbC w3OeNcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNHPWSb6Wia xswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3Ix2ymrdMxp7zo5eFm1tL7 A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbeQTg06ov80egEFGEtQX6sx3dOy1FU+16S GBsEWmjGycT6txOgmLcRK7fWV8x8nhfRyyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqV g8NTEQxzHQuyRpDRQjrOQG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa 5Beny912H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJQfYE koopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUDi/ZnWejBBhG93c+A Ak9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORsnLMOPReisjQS1n6yqEm70XooQL6i Fh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNV HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5u Qu0wDQYJKoZIhvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqfGopTpti72TVV sRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkblvdhuDvEK7Z4bLQjb/D907Je dR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W8 1k/BfDxujRNt+3vrMNDcTa/F1balTFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjx mHHEt38OFdAlab0inSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01 utI3gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18DrG5gPcFw0 sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3OszMOl6W8KjptlwlCFtaOg UxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8xL4ysEr3vQCj8KWefshNPZiTEUxnpHikV 7+ZtsH8tZ/3zbBt1RqPlShfppNcL -----END CERTIFICATE----- ACCVRAIZ1 ========= -----BEGIN CERTIFICATE----- MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UEAwwJQUNDVlJB SVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQswCQYDVQQGEwJFUzAeFw0xMTA1 MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQBgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwH UEtJQUNDVjENMAsGA1UECgwEQUNDVjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4IC DwAwggIKAoICAQCbqau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gM jmoYHtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWoG2ioPej0 RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpAlHPrzg5XPAOBOp0KoVdD aaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhrIA8wKFSVf+DuzgpmndFALW4ir50awQUZ 0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDG WuzndN9wrqODJerWx5eHk6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs7 8yM2x/474KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMOm3WR 5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpacXpkatcnYGMN285J 9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPluUsXQA+xtrn13k/c4LOsOxFwYIRK Q26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYIKwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRw Oi8vd3d3LmFjY3YuZXMvZmlsZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEu Y3J0MB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeTVfZW6oHlNsyM Hj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIGCCsGAQUFBwICMIIBFB6CARAA QQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUAcgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBh AO0AegAgAGQAZQAgAGwAYQAgAEEAQwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUA YwBuAG8AbABvAGcA7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBj AHQAcgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAAQwBQAFMA IABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUAczAwBggrBgEFBQcCARYk aHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2MuaHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0 dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRtaW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2 MV9kZXIuY3JsMA4GA1UdDwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZI hvcNAQEFBQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdpD70E R9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gUJyCpZET/LtZ1qmxN YEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+mAM/EKXMRNt6GGT6d7hmKG9Ww7Y49 nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepDvV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJ TS+xJlsndQAJxGJ3KQhfnlmstn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3 sCPdK6jT2iWH7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szAh1xA2syVP1Xg Nce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xFd3+YJ5oyXSrjhO7FmGYvliAd 3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2HpPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3p EfbRD0tVNEYqi4Y7 -----END CERTIFICATE----- TWCA Global Root CA =================== -----BEGIN CERTIFICATE----- MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcxEjAQBgNVBAoT CVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMTVFdDQSBHbG9iYWwgUm9vdCBD QTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQK EwlUQUlXQU4tQ0ExEDAOBgNVBAsTB1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3Qg Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2C nJfF10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz0ALfUPZV r2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfChMBwqoJimFb3u/Rk28OKR Q4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbHzIh1HrtsBv+baz4X7GGqcXzGHaL3SekV tTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1W KKD+u4ZqyPpcC1jcxkt2yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99 sy2sbZCilaLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYPoA/p yJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQABDzfuBSO6N+pjWxn kjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcEqYSjMq+u7msXi7Kx/mzhkIyIqJdI zshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMC AQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6g cFGn90xHNcgL1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WFH6vPNOw/KP4M 8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNoRI2T9GRwoD2dKAXDOXC4Ynsg /eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlg lPx4mI88k1HtQJAH32RjJMtOcQWh15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryP A9gK8kxkRr05YuWW6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3m i4TWnsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5jwa19hAM8 EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWzaGHQRiapIVJpLesux+t3 zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmyKwbQBM0= -----END CERTIFICATE----- TeliaSonera Root CA v1 ====================== -----BEGIN CERTIFICATE----- MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAwNzEUMBIGA1UE CgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJvb3QgQ0EgdjEwHhcNMDcxMDE4 MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYDVQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwW VGVsaWFTb25lcmEgUm9vdCBDQSB2MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+ 6yfwIaPzaSZVfp3FVRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA 3GV17CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+XZ75Ljo1k B1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+/jXh7VB7qTCNGdMJjmhn Xb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxH oLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkmdtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3 F0fUTPHSiXk+TT2YqGHeOh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJ oWjiUIMusDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4pgd7 gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fsslESl1MpWtTwEhDc TwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQarMCpgKIv7NHfirZ1fpoeDVNAgMB AAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qW DNXr+nuqF+gTEjANBgkqhkiG9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNm zqjMDfz1mgbldxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx 0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1TjTQpgcmLNkQfW pb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBedY2gea+zDTYa4EzAvXUYNR0PV G6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpc c41teyWRyu5FrgZLAMzTsVlQ2jqIOylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOT JsjrDNYmiLbAJM+7vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2 qReWt88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcnHL/EVlP6 Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVxSK236thZiNSQvxaz2ems WWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= -----END CERTIFICATE----- E-Tugra Certification Authority =============================== -----BEGIN CERTIFICATE----- MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNVBAYTAlRSMQ8w DQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamls ZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMw NTEyMDk0OFoXDTIzMDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmEx QDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxl cmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQD DB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A MIICCgKCAgEA4vU/kwVRHoViVF56C/UYB4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vd hQd2h8y/L5VMzH2nPbxHD5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5K CKpbknSFQ9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEoq1+g ElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3Dk14opz8n8Y4e0ypQ BaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcHfC425lAcP9tDJMW/hkd5s3kc91r0 E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsutdEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gz rt48Ue7LE3wBf4QOXVGUnhMMti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAq jqFGOjGY5RH8zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUXU8u3Zg5mTPj5 dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6Jyr+zE7S6E5UMA8GA1UdEwEB /wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEG MA0GCSqGSIb3DQEBCwUAA4ICAQAFNzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAK kEh47U6YA5n+KGCRHTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jO XKqYGwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c77NCR807 VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3+GbHeJAAFS6LrVE1Uweo a2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WKvJUawSg5TB9D0pH0clmKuVb8P7Sd2nCc dlqMQ1DujjByTd//SffGqWfZbawCEeI6FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEV KV0jq9BgoRJP3vQXzTLlyb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gT Dx4JnW2PAJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpDy4Q0 8ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8dNL/+I5c30jn6PQ0G C7TbO6Orb1wdtn7os4I07QZcJA== -----END CERTIFICATE----- T-TeleSec GlobalRoot Class 2 ============================ -----BEGIN CERTIFICATE----- MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgx MDAxMTA0MDE0WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0GCSqGSIb3 DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUdAqSzm1nzHoqvNK38DcLZ SBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiCFoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/F vudocP05l03Sx5iRUKrERLMjfTlH6VJi1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx970 2cu+fjOlbpSD8DT6IavqjnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGV WOHAD3bZwI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGjQjBA MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/WSA2AHmgoCJrjNXy YdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhyNsZt+U2e+iKo4YFWz827n+qrkRk4 r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPACuvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNf vNoBYimipidx5joifsFvHZVwIEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR 3p1m0IvVVGb6g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN 9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlPBSeOE6Fuwg== -----END CERTIFICATE----- Atos TrustedRoot 2011 ===================== -----BEGIN CERTIFICATE----- MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UEAwwVQXRvcyBU cnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0xMTA3MDcxNDU4 MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMMFUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsG A1UECgwEQXRvczELMAkGA1UEBhMCREUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCV hTuXbyo7LjvPpvMpNb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr 54rMVD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+SZFhyBH+ DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ4J7sVaE3IqKHBAUsR320 HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0Lcp2AMBYHlT8oDv3FdU9T1nSatCQujgKR z3bFmx5VdJx4IbHwLfELn8LVlhgf8FQieowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7R l+lwrrw7GWzbITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZ bNshMBgGA1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB CwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8jvZfza1zv7v1Apt+h k6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kPDpFrdRbhIfzYJsdHt6bPWHJxfrrh TZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pcmaHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a9 61qn8FYiqTxlVMYVqL2Gns2Dlmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G 3mB/ufNPRJLvKrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed -----END CERTIFICATE----- QuoVadis Root CA 1 G3 ===================== -----BEGIN CERTIFICATE----- MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQELBQAwSDELMAkG A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv b3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJN MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEg RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakE PBtVwedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWerNrwU8lm PNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF34168Xfuw6cwI2H44g4hWf6 Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh4Pw5qlPafX7PGglTvF0FBM+hSo+LdoIN ofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXpUhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/l g6AnhF4EwfWQvTA9xO+oabw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV 7qJZjqlc3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/GKubX 9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSthfbZxbGL0eUQMk1f iyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KOTk0k+17kBL5yG6YnLUlamXrXXAkg t3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOtzCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZI hvcNAQELBQADggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2cDMT/uFPpiN3 GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUNqXsCHKnQO18LwIE6PWThv6ct Tr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP +V04ikkwj+3x6xn0dxoxGE1nVGwvb2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh 3jRJjehZrJ3ydlo28hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fa wx/kNSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNjZgKAvQU6 O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhpq1467HxpvMc7hU6eFbm0 FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFtnh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOV hMJKzRwuJIczYOXD -----END CERTIFICATE----- QuoVadis Root CA 2 G3 ===================== -----BEGIN CERTIFICATE----- MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQELBQAwSDELMAkG A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv b3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJN MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIg RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFh ZiFfqq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMWn4rjyduY NM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ymc5GQYaYDFCDy54ejiK2t oIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+O7q414AB+6XrW7PFXmAqMaCvN+ggOp+o MiwMzAkd056OXbxMmO7FGmh77FOm6RQ1o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+l V0POKa2Mq1W/xPtbAd0jIaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZo L1NesNKqIcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz8eQQ sSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43ehvNURG3YBZwjgQQvD 6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l7ZizlWNof/k19N+IxWA1ksB8aRxh lRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALGcC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZI hvcNAQELBQADggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RCroijQ1h5fq7K pVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0GaW/ZZGYjeVYg3UQt4XAoeo0L9 x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4nlv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgz dWqTHBLmYF5vHX/JHyPLhGGfHoJE+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6X U/IyAgkwo1jwDQHVcsaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+Nw mNtddbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNgKCLjsZWD zYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeMHVOyToV7BjjHLPj4sHKN JeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4WSr2Rz0ZiC3oheGe7IUIarFsNMkd7Egr O3jtZsSOeWmD3n+M -----END CERTIFICATE----- QuoVadis Root CA 3 G3 ===================== -----BEGIN CERTIFICATE----- MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQELBQAwSDELMAkG A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv b3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJN MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMg RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286 IxSR/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNuFoM7pmRL Mon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXRU7Ox7sWTaYI+FrUoRqHe 6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+cra1AdHkrAj80//ogaX3T7mH1urPnMNA3 I4ZyYUUpSFlob3emLoG+B01vr87ERRORFHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3U VDmrJqMz6nWB2i3ND0/kA9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f7 5li59wzweyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634RylsSqi Md5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBpVzgeAVuNVejH38DM dyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0QA4XN8f+MFrXBsj6IbGB/kE+V9/Yt rQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZI hvcNAQELBQADggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnIFUBhynLWcKzS t/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5WvvoxXqA/4Ti2Tk08HS6IT7SdEQ TXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFgu/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9Du DcpmvJRPpq3t/O5jrFc/ZSXPsoaP0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGib Ih6BJpsQBJFxwAYf3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmD hPbl8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+DhcI00iX 0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HNPlopNLk9hM6xZdRZkZFW dSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ywaZWWDYWGWVjUTR939+J399roD1B0y2 PpxxVJkES/1Y+Zj0 -----END CERTIFICATE----- DigiCert Assured ID Root G2 =========================== -----BEGIN CERTIFICATE----- MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgw MTE1MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIw ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSAn61UQbVH 35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4HteccbiJVMWWXvdMX0h5i89vq bFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9HpEgjAALAcKxHad3A2m67OeYfcgnDmCXRw VWmvo2ifv922ebPynXApVfSr/5Vh88lAbx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OP YLfykqGxvYmJHzDNw6YuYjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+Rn lTGNAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTO w0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPIQW5pJ6d1Ee88hjZv 0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I0jJmwYrA8y8678Dj1JGG0VDjA9tz d29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4GnilmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAW hsI6yLETcDbYz+70CjTVW0z9B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0M jomZmWzwPDCvON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo IhNzbM8m9Yop5w== -----END CERTIFICATE----- DigiCert Assured ID Root G3 =========================== -----BEGIN CERTIFICATE----- MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYD VQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQ BgcqhkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJfZn4f5dwb RXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17QRSAPWXYQ1qAk8C3eNvJs KTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgF UaFNN6KDec6NHSrkhDAKBggqhkjOPQQDAwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5Fy YZ5eEJJZVrmDxxDnOOlYJjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy 1vUhZscv6pZjamVFkpUBtA== -----END CERTIFICATE----- DigiCert Global Root G2 ======================= -----BEGIN CERTIFICATE----- MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUx MjAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI2/Ou8jqJ kTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx1x7e/dfgy5SDN67sH0NO 3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQq2EGnI/yuum06ZIya7XzV+hdG82MHauV BJVJ8zUtluNJbd134/tJS7SsVQepj5WztCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyM UNGPHgm+F6HmIcr9g+UQvIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQAB o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV5uNu 5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY1Yl9PMWLSn/pvtsr F9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4NeF22d+mQrvHRAiGfzZ0JFrabA0U WTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NGFdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBH QRFXGU7Aj64GxJUTFy8bJZ918rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/ iyK5S9kJRaTepLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl MrY= -----END CERTIFICATE----- DigiCert Global Root G3 ======================= -----BEGIN CERTIFICATE----- MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQswCQYDVQQGEwJV UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYD VQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAw MDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5k aWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0C AQYFK4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FGfp4tn+6O YwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPOZ9wj/wMco+I+o0IwQDAP BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNp Yim8S8YwCgYIKoZIzj0EAwMDaAAwZQIxAK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y 3maTD/HMsQmP3Wyr+mt/oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34 VOKa5Vt8sycX -----END CERTIFICATE----- DigiCert Trusted Root G4 ======================== -----BEGIN CERTIFICATE----- MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBiMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEw HwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 MTIwMDAwWjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0G CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3yithZwuEp pz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9o k3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7Fsa vOvJz82sNEBfsXpm7nfISKhmV1efVFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGY QJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6 MUSaM0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCiEhtm mnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADMfRyVw4/3IbKyEbe7 f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFH dL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8 oR7FwI+isX4KJpn15GkvmB0t9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud DwEB/wQEAwIBhjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2SV1EY+CtnJYY ZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd+SeuMIW59mdNOj6PWTkiU0Tr yF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWcfFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy 7zBZLq7gcfJW5GqXb5JQbZaNaHqasjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iah ixTXTBmyUEFxPT9NcCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN 5r5N0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie4u1Ki7wb /UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mIr/OSmbaz5mEP0oUA51Aa 5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tK G48BtieVU+i2iW1bvGjUI+iLUaJW+fCmgKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP 82Z+ -----END CERTIFICATE----- WoSign ====== -----BEGIN CERTIFICATE----- MIIFdjCCA16gAwIBAgIQXmjWEXGUY1BWAGjzPsnFkTANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQG EwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxKjAoBgNVBAMTIUNlcnRpZmljYXRpb24g QXV0aG9yaXR5IG9mIFdvU2lnbjAeFw0wOTA4MDgwMTAwMDFaFw0zOTA4MDgwMTAwMDFaMFUxCzAJ BgNVBAYTAkNOMRowGAYDVQQKExFXb1NpZ24gQ0EgTGltaXRlZDEqMCgGA1UEAxMhQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkgb2YgV29TaWduMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA vcqNrLiRFVaXe2tcesLea9mhsMMQI/qnobLMMfo+2aYpbxY94Gv4uEBf2zmoAHqLoE1UfcIiePyO CbiohdfMlZdLdNiefvAA5A6JrkkoRBoQmTIPJYhTpA2zDxIIFgsDcSccf+Hb0v1naMQFXQoOXXDX 2JegvFNBmpGN9J42Znp+VsGQX+axaCA2pIwkLCxHC1l2ZjC1vt7tj/id07sBMOby8w7gLJKA84X5 KIq0VC6a7fd2/BVoFutKbOsuEo/Uz/4Mx1wdC34FMr5esAkqQtXJTpCzWQ27en7N1QhatH/YHGkR +ScPewavVIMYe+HdVHpRaG53/Ma/UkpmRqGyZxq7o093oL5d//xWC0Nyd5DKnvnyOfUNqfTq1+ez EC8wQjchzDBwyYaYD8xYTYO7feUapTeNtqwylwA6Y3EkHp43xP901DfA4v6IRmAR3Qg/UDaruHqk lWJqbrDKaiFaafPz+x1wOZXzp26mgYmhiMU7ccqjUu6Du/2gd/Tkb+dC221KmYo0SLwX3OSACCK2 8jHAPwQ+658geda4BmRkAjHXqc1S+4RFaQkAKtxVi8QGRkvASh0JWzko/amrzgD5LkhLJuYwTKVY yrREgk/nkR4zw7CT/xH8gdLKH3Ep3XZPkiWvHYG3Dy+MwwbMLyejSuQOmbp8HkUff6oZRZb9/D0C AwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFOFmzw7R 8bNLtwYgFP6HEtX2/vs+MA0GCSqGSIb3DQEBBQUAA4ICAQCoy3JAsnbBfnv8rWTjMnvMPLZdRtP1 LOJwXcgu2AZ9mNELIaCJWSQBnfmvCX0KI4I01fx8cpm5o9dU9OpScA7F9dY74ToJMuYhOZO9sxXq T2r09Ys/L3yNWC7F4TmgPsc9SnOeQHrAK2GpZ8nzJLmzbVUsWh2eJXLOC62qx1ViC777Y7NhRCOj y+EaDveaBk3e1CNOIZZbOVtXHS9dCF4Jef98l7VNg64N1uajeeAz0JmWAjCnPv/So0M/BVoG6kQC 2nz4SNAzqfkHx5Xh9T71XXG68pWpdIhhWeO/yloTunK0jF02h+mmxTwTv97QRCbut+wucPrXnbes 5cVAWubXbHssw1abR80LzvobtCHXt2a49CUwi1wNuepnsvRtrtWhnk/Yn+knArAdBtaP4/tIEp9/ EaEQPkxROpaw0RPxx9gmrjrKkcRpnd8BKWRRb2jaFOwIQZeQjdCygPLPwj2/kWjFgGcexGATVdVh mVd8upUPYUk6ynW8yQqTP2cOEvIo4jEbwFcW3wh8GcF+Dx+FHgo2fFt+J7x6v+Db9NpSvd4MVHAx kUOVyLzwPt0JfjBkUO1/AaQzZ01oT74V77D2AhGiGxMlOtzCWfHjXEa7ZywCRuoeSKbmW9m1vFGi kpbbqsY3Iqb+zCB0oy2pLmvLwIIRIbWTee5Ehr7XHuQe+w== -----END CERTIFICATE----- WoSign China ============ -----BEGIN CERTIFICATE----- MIIFWDCCA0CgAwIBAgIQUHBrzdgT/BtOOzNy0hFIjTANBgkqhkiG9w0BAQsFADBGMQswCQYDVQQG EwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxGzAZBgNVBAMMEkNBIOayg+mAmuagueiv geS5pjAeFw0wOTA4MDgwMTAwMDFaFw0zOTA4MDgwMTAwMDFaMEYxCzAJBgNVBAYTAkNOMRowGAYD VQQKExFXb1NpZ24gQ0EgTGltaXRlZDEbMBkGA1UEAwwSQ0Eg5rKD6YCa5qC56K+B5LmmMIICIjAN BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0EkhHiX8h8EqwqzbdoYGTufQdDTc7WU1/FDWiD+k 8H/rD195L4mx/bxjWDeTmzj4t1up+thxx7S8gJeNbEvxUNUqKaqoGXqW5pWOdO2XCld19AXbbQs5 uQF/qvbW2mzmBeCkTVL829B0txGMe41P/4eDrv8FAxNXUDf+jJZSEExfv5RxadmWPgxDT74wwJ85 dE8GRV2j1lY5aAfMh09Qd5Nx2UQIsYo06Yms25tO4dnkUkWMLhQfkWsZHWgpLFbE4h4TV2TwYeO5 Ed+w4VegG63XX9Gv2ystP9Bojg/qnw+LNVgbExz03jWhCl3W6t8Sb8D7aQdGctyB9gQjF+BNdeFy b7Ao65vh4YOhn0pdr8yb+gIgthhid5E7o9Vlrdx8kHccREGkSovrlXLp9glk3Kgtn3R46MGiCWOc 76DbT52VqyBPt7D3h1ymoOQ3OMdc4zUPLK2jgKLsLl3Az+2LBcLmc272idX10kaO6m1jGx6KyX2m +Jzr5dVjhU1zZmkR/sgO9MHHZklTfuQZa/HpelmjbX7FF+Ynxu8b22/8DU0GAbQOXDBGVWCvOGU6 yke6rCzMRh+yRpY/8+0mBe53oWprfi1tWFxK1I5nuPHa1UaKJ/kR8slC/k7e3x9cxKSGhxYzoacX GKUN5AXlK8IrC6KVkLn9YDxOiT7nnO4fuwECAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1Ud EwEB/wQFMAMBAf8wHQYDVR0OBBYEFOBNv9ybQV0T6GTwp+kVpOGBwboxMA0GCSqGSIb3DQEBCwUA A4ICAQBqinA4WbbaixjIvirTthnVZil6Xc1bL3McJk6jfW+rtylNpumlEYOnOXOvEESS5iVdT2H6 yAa+Tkvv/vMx/sZ8cApBWNromUuWyXi8mHwCKe0JgOYKOoICKuLJL8hWGSbueBwj/feTZU7n85iY r83d2Z5AiDEoOqsuC7CsDCT6eiaY8xJhEPRdF/d+4niXVOKM6Cm6jBAyvd0zaziGfjk9DgNyp115 j0WKWa5bIW4xRtVZjc8VX90xJc/bYNaBRHIpAlf2ltTW/+op2znFuCyKGo3Oy+dCMYYFaA6eFN0A kLppRQjbbpCBhqcqBT/mhDn4t/lXX0ykeVoQDF7Va/81XwVRHmyjdanPUIPTfPRm94KNPQx96N97 qA4bLJyuQHCH2u2nFoJavjVsIE4iYdm8UXrNemHcSxH5/mc0zy4EZmFcV5cjjPOGG0jfKq+nwf/Y jj4Du9gqsPoUJbJRa4ZDhS4HIxaAjUz7tGM7zMN07RujHv41D198HRaG9Q7DlfEvr10lO1Hm13ZB ONFLAzkopR6RctR9q5czxNM+4Gm2KHmgCY0c0f9BckgG/Jou5yD5m6Leie2uPAmvylezkolwQOQv T8Jwg0DXJCxr5wkf09XHwQj02w47HAcLQxGEIYbpgNR12KvxAmLBsX5VYc8T1yaw15zLKYs4SgsO kI26oQ== -----END CERTIFICATE----- COMODO RSA Certification Authority ================================== -----BEGIN CERTIFICATE----- MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCBhTELMAkGA1UE BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlv biBBdXRob3JpdHkwHhcNMTAwMTE5MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMC R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBB dXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR6FSS0gpWsawNJN3Fz0Rn dJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8Xpz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZ FGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+ 5eNu/Nio5JIk2kNrYrhV/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pG x8cgoLEfZd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z+pUX 2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7wqP/0uK3pN/u6uPQL OvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZahSL0896+1DSJMwBGB7FY79tOi4lu3 sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVICu9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+C GCe01a60y1Dma/RMhnEw6abfFobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5 WdYgGq/yapiqcrxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w DQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvlwFTPoCWOAvn9sKIN9SCYPBMt rFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+ nq6PK7o9mfjYcwlYRm6mnPTXJ9OV2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSg tZx8jb8uk2IntznaFxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwW sRqZCuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiKboHGhfKp pC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmckejkk9u+UJueBPSZI9FoJA zMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yLS0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHq ZJx64SIDqZxubw5lT2yHh17zbqD5daWbQOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk52 7RH89elWsn2/x20Kk4yl0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7I LaZRfyHBNVOFBkpdn627G190 -----END CERTIFICATE----- USERTrust RSA Certification Authority ===================================== -----BEGIN CERTIFICATE----- MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCBiDELMAkGA1UE BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UE BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCAEmUXNg7D2wiz 0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2j Y0K2dvKpOyuR+OJv0OwWIJAJPuLodMkYtJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFn RghRy4YUVD+8M/5+bJz/Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O +T23LLb2VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT79uq /nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6c0Plfg6lZrEpfDKE Y1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmTYo61Zs8liM2EuLE/pDkP2QKe6xJM lXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97lc6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8 yexDJtC/QV9AqURE9JnnV4eeUB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+ eLf8ZxXhyVeEHg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF MAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPFUp/L+M+ZBn8b2kMVn54CVVeW FPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KOVWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ 7l8wXEskEVX/JJpuXior7gtNn3/3ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQ Eg9zKC7F4iRO/Fjs8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM 8WcRiQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYzeSf7dNXGi FSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZXHlKYC6SQK5MNyosycdi yA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9c J2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRBVXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGw sAvgnEzDHNb842m1R0aBL6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gx Q+6IHdfGjjxDah2nGN59PRbxYvnKkKj9 -----END CERTIFICATE----- USERTrust ECC Certification Authority ===================================== -----BEGIN CERTIFICATE----- MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDELMAkGA1UEBhMC VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv biBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMC VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqfloI+d61SRvU8Za2EurxtW2 0eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinngo4N+LZfQYcTxmdwlkWOrfzCjtHDix6Ez nPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0GA1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNV HQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBB HU6+4WMBzzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbWRNZu 9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= -----END CERTIFICATE----- GlobalSign ECC Root CA - R4 =========================== -----BEGIN CERTIFICATE----- MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEkMCIGA1UECxMb R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD EwpHbG9iYWxTaWduMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprl OQcJFspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAwDgYDVR0P AQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61FuOJAf/sKbvu+M8k8o4TV MAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGXkPoUVy0D7O48027KqGx2vKLeuwIgJ6iF JzWbVsaj8kfSt24bAgAXqmemFZHe+pTsewv4n4Q= -----END CERTIFICATE----- GlobalSign ECC Root CA - R5 =========================== -----BEGIN CERTIFICATE----- MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEkMCIGA1UECxMb R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD EwpHbG9iYWxTaWduMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6 SFkc8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8kehOvRnkmS h5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd BgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYIKoZIzj0EAwMDaAAwZQIxAOVpEslu28Yx uglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7 yFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3 -----END CERTIFICATE----- Staat der Nederlanden Root CA - G3 ================================== -----BEGIN CERTIFICATE----- MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g Um9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloXDTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMC TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4y olQPcPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WWIkYFsO2t x1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqXxz8ecAgwoNzFs21v0IJy EavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFyKJLZWyNtZrVtB0LrpjPOktvA9mxjeM3K Tj215VKb8b475lRgsGYeCasH/lSJEULR9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUur mkVLoR9BvUhTFXFkC4az5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU5 1nus6+N86U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7Ngzp 07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHPbMk7ccHViLVlvMDo FxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXtBznaqB16nzaeErAMZRKQFWDZJkBE 41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTtXUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMB AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleu yjWcLhL75LpdINyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwpLiniyMMB8jPq KqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8Ipf3YF3qKS9Ysr1YvY2WTxB1 v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixpgZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA 8KCWAg8zxXHzniN9lLf9OtMJgwYh/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b 8KKaa8MFSu1BYBQw0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0r mj1AfsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq4BZ+Extq 1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR1VmiiXTTn74eS9fGbbeI JG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/QFH1T/U67cjF68IeHRaVesd+QnGTbksV tzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM94B7IWcnMFk= -----END CERTIFICATE----- Staat der Nederlanden EV Root CA ================================ -----BEGIN CERTIFICATE----- MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJOTDEeMBwGA1UE CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFhdCBkZXIgTmVkZXJsYW5kZW4g RVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0yMjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5M MR4wHAYDVQQKDBVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRl cmxhbmRlbiBFViBSb290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkk SzrSM4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nCUiY4iKTW O0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3dZ//BYY1jTw+bbRcwJu+r 0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46prfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8 Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13lpJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gV XJrm0w912fxBmJc+qiXbj5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr 08C+eKxCKFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS/ZbV 0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0XcgOPvZuM5l5Tnrmd 74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH1vI4gnPah1vlPNOePqc7nvQDs/nx fRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrPpx9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNC MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwa ivsnuL8wbqg7MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u2dfOWBfoqSmu c0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHSv4ilf0X8rLiltTMMgsT7B/Zq 5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTCwPTxGfARKbalGAKb12NMcIxHowNDXLldRqAN b/9Zjr7dn3LDWyvfjFvO5QxGbJKyCqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tN f1zuacpzEPuKqf2evTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi 5Dp6Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIaGl6I6lD4 WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeLeG9QgkRQP2YGiqtDhFZK DyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGy eUN51q1veieQA6TqJIc/2b3Z6fJfUEkc7uzXLg== -----END CERTIFICATE----- IdenTrust Commercial Root CA 1 ============================== -----BEGIN CERTIFICATE----- MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBKMQswCQYDVQQG EwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBS b290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQwMTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzES MBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENB IDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ld hNlT3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU+ehcCuz/ mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gpS0l4PJNgiCL8mdo2yMKi 1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1bVoE/c40yiTcdCMbXTMTEl3EASX2MN0C XZ/g1Ue9tOsbobtJSdifWwLziuQkkORiT0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl 3ZBWzvurpWCdxJ35UrCLvYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzy NeVJSQjKVsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZKdHzV WYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHTc+XvvqDtMwt0viAg xGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hvl7yTmvmcEpB4eoCHFddydJxVdHix uuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5NiGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZI hvcNAQELBQADggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH 6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwtLRvM7Kqas6pg ghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93nAbowacYXVKV7cndJZ5t+qnt ozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmV YjzlVYA211QC//G5Xc7UI2/YRYRKW2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUX feu+h1sXIFRRk0pTAwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/ro kTLql1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG4iZZRHUe 2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZmUlO+KWA2yUPHGNiiskz Z2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7R cGzM7vRX+Bi6hG6H -----END CERTIFICATE----- IdenTrust Public Sector Root CA 1 ================================= -----BEGIN CERTIFICATE----- MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBNMQswCQYDVQQG EwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3Rv ciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcNMzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJV UzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBS b290IENBIDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTy P4o7ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGyRBb06tD6 Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlSbdsHyo+1W/CD80/HLaXI rcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF/YTLNiCBWS2ab21ISGHKTN9T0a9SvESf qy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoS mJxZZoY+rfGwyj4GD3vwEUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFn ol57plzy9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9VGxyh LrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ2fjXctscvG29ZV/v iDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsVWaFHVCkugyhfHMKiq3IXAAaOReyL 4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gDW/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8B Af8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMw DQYJKoZIhvcNAQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHVDRDtfULAj+7A mgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9TaDKQGXSc3z1i9kKlT/YPyNt GtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8GlwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFt m6/n6J91eEyrRjuazr8FGF1NFTwWmhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMx NRF4eKLg6TCMf4DfWN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4 Mhn5+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJtshquDDI ajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhAGaQdp/lLQzfcaFpPz+vC ZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ 3Wl9af0AVqW3rLatt8o+Ae+c -----END CERTIFICATE----- Entrust Root Certification Authority - G2 ========================================= -----BEGIN CERTIFICATE----- MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMCVVMxFjAUBgNV BAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVy bXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ug b25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIw HhcNMDkwNzA3MTcyNTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoT DUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMx OTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25s eTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwggEi MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP /vaCeb9zYQYKpSfYs1/TRU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXz HHfV1IWNcCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hWwcKU s/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1U1+cPvQXLOZprE4y TGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0jaWvYkxN4FisZDQSA/i2jZRjJKRx AgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ6 0B7vfec7aVHUbI2fkBJmqzANBgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5Z iXMRrEPR9RP/jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v1fN2D807iDgi nWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4RnAuknZoh8/CbCzB428Hch0P+ vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmHVHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xO e4pIb4tF9g== -----END CERTIFICATE----- Entrust Root Certification Authority - EC1 ========================================== -----BEGIN CERTIFICATE----- MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkGA1UEBhMCVVMx FjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVn YWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXpl ZCB1c2Ugb25seTEzMDEGA1UEAxMqRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 IC0gRUMxMB4XDTEyMTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYw FAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2Fs LXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQg dXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt IEVDMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHy AsWfoPZb1YsGGYZPUxBtByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef 9eNi1KlHBz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE FLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVCR98crlOZF7ZvHH3h vxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nXhTcGtXsI/esni0qU+eH6p44mCOh8 kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G -----END CERTIFICATE----- CFCA EV ROOT ============ -----BEGIN CERTIFICATE----- MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJDTjEwMC4GA1UE CgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNB IEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkxMjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEw MC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQD DAxDRkNBIEVWIFJPT1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnV BU03sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpLTIpTUnrD 7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5/ZOkVIBMUtRSqy5J35DN uF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp7hZZLDRJGqgG16iI0gNyejLi6mhNbiyW ZXvKWfry4t3uMCz7zEasxGPrb382KzRzEpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7 xzbh72fROdOXW3NiGUgthxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9f py25IGvPa931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqotaK8K gWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNgTnYGmE69g60dWIol hdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfVPKPtl8MeNPo4+QgO48BdK4PRVmrJ tqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hvcWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAf BgNVHSMEGDAWgBTj/i39KNALtbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB /wQEAwIBBjAdBgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObTej/tUxPQ4i9q ecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdLjOztUmCypAbqTuv0axn96/Ua 4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBSESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sG E5uPhnEFtC+NiWYzKXZUmhH4J/qyP5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfX BDrDMlI1Dlb4pd19xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjn aH9dCi77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN5mydLIhy PDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe/v5WOaHIz16eGWRGENoX kbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+ZAAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3C ekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su -----END CERTIFICATE----- TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H5 ========================================================= -----BEGIN CERTIFICATE----- MIIEJzCCAw+gAwIBAgIHAI4X/iQggTANBgkqhkiG9w0BAQsFADCBsTELMAkGA1UEBhMCVFIxDzAN BgNVBAcMBkFua2FyYTFNMEsGA1UECgxEVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp bGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7Fni4xQjBABgNVBAMMOVTDnFJLVFJVU1Qg RWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSBINTAeFw0xMzA0MzAw ODA3MDFaFw0yMzA0MjgwODA3MDFaMIGxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMU0w SwYDVQQKDERUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnE n2kgSGl6bWV0bGVyaSBBLsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBFbGVrdHJvbmlrIFNlcnRp ZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIEg1MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB CgKCAQEApCUZ4WWe60ghUEoI5RHwWrom/4NZzkQqL/7hzmAD/I0Dpe3/a6i6zDQGn1k19uwsu537 jVJp45wnEFPzpALFp/kRGml1bsMdi9GYjZOHp3GXDSHHmflS0yxjXVW86B8BSLlg/kJK9siArs1m ep5Fimh34khon6La8eHBEJ/rPCmBp+EyCNSgBbGM+42WAA4+Jd9ThiI7/PS98wl+d+yG6w8z5UNP 9FR1bSmZLmZaQ9/LXMrI5Tjxfjs1nQ/0xVqhzPMggCTTV+wVunUlm+hkS7M0hO8EuPbJbKoCPrZV 4jI3X/xml1/N1p7HIL9Nxqw/dV8c7TKcfGkAaZHjIxhT6QIDAQABo0IwQDAdBgNVHQ4EFgQUVpkH HtOsDGlktAxQR95DLL4gwPswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZI hvcNAQELBQADggEBAJ5FdnsXSDLyOIspve6WSk6BGLFRRyDN0GSxDsnZAdkJzsiZ3GglE9Rc8qPo BP5yCccLqh0lVX6Wmle3usURehnmp349hQ71+S4pL+f5bFgWV1Al9j4uPqrtd3GqqpmWRgqujuwq URawXs3qZwQcWDD1YIq9pr1N5Za0/EKJAWv2cMhQOQwt1WbZyNKzMrcbGW3LM/nfpeYVhDfwwvJl lpKQd/Ct9JDpEXjXk4nAPQu6KfTomZ1yju2dL+6SfaHx/126M2CFYv4HAqGEVka+lgqaE9chTLd8 B59OTj+RdPsnnRHM3eaxynFNExc5JsUpISuTKWqW+qtB4Uu2NQvAmxU= -----END CERTIFICATE----- TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H6 ========================================================= -----BEGIN CERTIFICATE----- MIIEJjCCAw6gAwIBAgIGfaHyZeyKMA0GCSqGSIb3DQEBCwUAMIGxMQswCQYDVQQGEwJUUjEPMA0G A1UEBwwGQW5rYXJhMU0wSwYDVQQKDERUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls acWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBF bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIEg2MB4XDTEzMTIxODA5 MDQxMFoXDTIzMTIxNjA5MDQxMFowgbExCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExTTBL BgNVBAoMRFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBCaWxpxZ9pbSBHw7x2ZW5sacSf aSBIaXptZXRsZXJpIEEuxZ4uMUIwQAYDVQQDDDlUw5xSS1RSVVNUIEVsZWt0cm9uaWsgU2VydGlm aWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLEgSDYwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK AoIBAQCdsGjW6L0UlqMACprx9MfMkU1xeHe59yEmFXNRFpQJRwXiM/VomjX/3EsvMsew7eKC5W/a 2uqsxgbPJQ1BgfbBOCK9+bGlprMBvD9QFyv26WZV1DOzXPhDIHiTVRZwGTLmiddk671IUP320EED wnS3/faAz1vFq6TWlRKb55cTMgPp1KtDWxbtMyJkKbbSk60vbNg9tvYdDjTu0n2pVQ8g9P0pu5Fb HH3GQjhtQiht1AH7zYiXSX6484P4tZgvsycLSF5W506jM7NE1qXyGJTtHB6plVxiSvgNZ1GpryHV +DKdeboaX+UEVU0TRv/yz3THGmNtwx8XEsMeED5gCLMxAgMBAAGjQjBAMB0GA1UdDgQWBBTdVRcT 9qzoSCHK77Wv0QAy7Z6MtTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG 9w0BAQsFAAOCAQEAb1gNl0OqFlQ+v6nfkkU/hQu7VtMMUszIv3ZnXuaqs6fvuay0EBQNdH49ba3R fdCaqaXKGDsCQC4qnFAUi/5XfldcEQlLNkVS9z2sFP1E34uXI9TDwe7UU5X+LEr+DXCqu4svLcsy o4LyVN/Y8t3XSHLuSqMplsNEzm61kod2pLv0kmzOLBQJZo6NrRa1xxsJYTvjIKIDgI6tflEATseW hvtDmHd9KMeP2Cpu54Rvl0EpABZeTeIT6lnAY2c6RPuY/ATTMHKm9ocJV612ph1jmv3XZch4gyt1 O6VbuA1df74jrlZVlFjvH4GMKrLN5ptjnhi85WsGtAuYSyher4hYyw== -----END CERTIFICATE----- Certinomis - Root CA ==================== -----BEGIN CERTIFICATE----- MIIFkjCCA3qgAwIBAgIBATANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJGUjETMBEGA1UEChMK Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxHTAbBgNVBAMTFENlcnRpbm9taXMg LSBSb290IENBMB4XDTEzMTAyMTA5MTcxOFoXDTMzMTAyMTA5MTcxOFowWjELMAkGA1UEBhMCRlIx EzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMR0wGwYDVQQDExRD ZXJ0aW5vbWlzIC0gUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANTMCQos P5L2fxSeC5yaah1AMGT9qt8OHgZbn1CF6s2Nq0Nn3rD6foCWnoR4kkjW4znuzuRZWJflLieY6pOo d5tK8O90gC3rMB+12ceAnGInkYjwSond3IjmFPnVAy//ldu9n+ws+hQVWZUKxkd8aRi5pwP5ynap z8dvtF4F/u7BUrJ1Mofs7SlmO/NKFoL21prbcpjp3vDFTKWrteoB4owuZH9kb/2jJZOLyKIOSY00 8B/sWEUuNKqEUL3nskoTuLAPrjhdsKkb5nPJWqHZZkCqqU2mNAKthH6yI8H7KsZn9DS2sJVqM09x RLWtwHkziOC/7aOgFLScCbAK42C++PhmiM1b8XcF4LVzbsF9Ri6OSyemzTUK/eVNfaoqoynHWmgE 6OXWk6RiwsXm9E/G+Z8ajYJJGYrKWUM66A0ywfRMEwNvbqY/kXPLynNvEiCL7sCCeN5LLsJJwx3t FvYk9CcbXFcx3FXuqB5vbKziRcxXV4p1VxngtViZSTYxPDMBbRZKzbgqg4SGm/lg0h9tkQPTYKbV PZrdd5A9NaSfD171UkRpucC63M9933zZxKyGIjK8e2uR73r4F2iw4lNVYC2vPsKD2NkJK/DAZNuH i5HMkesE/Xa0lZrmFAYb1TQdvtj/dBxThZngWVJKYe2InmtJiUZ+IFrZ50rlau7SZRFDAgMBAAGj YzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTvkUz1pcMw6C8I 6tNxIqSSaHh02TAfBgNVHSMEGDAWgBTvkUz1pcMw6C8I6tNxIqSSaHh02TANBgkqhkiG9w0BAQsF AAOCAgEAfj1U2iJdGlg+O1QnurrMyOMaauo++RLrVl89UM7g6kgmJs95Vn6RHJk/0KGRHCwPT5iV WVO90CLYiF2cN/z7ZMF4jIuaYAnq1fohX9B0ZedQxb8uuQsLrbWwF6YSjNRieOpWauwK0kDDPAUw Pk2Ut59KA9N9J0u2/kTO+hkzGm2kQtHdzMjI1xZSg081lLMSVX3l4kLr5JyTCcBMWwerx20RoFAX lCOotQqSD7J6wWAsOMwaplv/8gzjqh8c3LigkyfeY+N/IZ865Z764BNqdeuWXGKRlI5nU7aJ+BIJ y29SWwNyhlCVCNSNh4YVH5Uk2KRvms6knZtt0rJ2BobGVgjF6wnaNsIbW0G+YSrjcOa4pvi2WsS9 Iff/ql+hbHY5ZtbqTFXhADObE5hjyW/QASAJN1LnDE8+zbz1X5YnpyACleAu6AdBBR8Vbtaw5Bng DwKTACdyxYvRVB9dSsNAl35VpnzBMwQUAR1JIGkLGZOdblgi90AMRgwjY/M50n92Uaf0yKHxDHYi I0ZSKS3io0EHVmmY0gUJvGnHWmHNj4FgFU2A3ZDifcRQ8ow7bkrHxuaAKzyBvBGAFhAn1/DNP3nM cyrDflOR1m749fPH0FFNjkulW+YZFzvWgQncItzujrnEj1PhZ7szuIgVRs/taTX/dQ1G885x4cVr hkIGuUE= -----END CERTIFICATE----- OISTE WISeKey Global Root GB CA =============================== -----BEGIN CERTIFICATE----- MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBtMQswCQYDVQQG EwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAw MzJaFw0zOTEyMDExNTEwMzFaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYD VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEds b2JhbCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3HEokKtaX scriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGxWuR51jIjK+FTzJlFXHtP rby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk 9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNku7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4o Qnc/nSMbsrY9gBQHTC5P99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvg GUpuuy9rM2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB /zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZI hvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrghcViXfa43FK8+5/ea4n32cZiZBKpD dHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0 VQreUGdNZtGn//3ZwLWoo4rOZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEui HZeeevJuQHHfaPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= -----END CERTIFICATE----- Certification Authority of WoSign G2 ==================================== -----BEGIN CERTIFICATE----- MIIDfDCCAmSgAwIBAgIQayXaioidfLwPBbOxemFFRDANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQG EwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxLTArBgNVBAMTJENlcnRpZmljYXRpb24g QXV0aG9yaXR5IG9mIFdvU2lnbiBHMjAeFw0xNDExMDgwMDU4NThaFw00NDExMDgwMDU4NThaMFgx CzAJBgNVBAYTAkNOMRowGAYDVQQKExFXb1NpZ24gQ0EgTGltaXRlZDEtMCsGA1UEAxMkQ2VydGlm aWNhdGlvbiBBdXRob3JpdHkgb2YgV29TaWduIEcyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB CgKCAQEAvsXEoCKASU+/2YcRxlPhuw+9YH+v9oIOH9ywjj2X4FA8jzrvZjtFB5sg+OPXJYY1kBai XW8wGQiHC38Gsp1ij96vkqVg1CuAmlI/9ZqD6TRay9nVYlzmDuDfBpgOgHzKtB0TiGsOqCR3A9Du W/PKaZE1OVbFbeP3PU9ekzgkyhjpJMuSA93MHD0JcOQg5PGurLtzaaNjOg9FD6FKmsLRY6zLEPg9 5k4ot+vElbGs/V6r+kHLXZ1L3PR8du9nfwB6jdKgGlxNIuG12t12s9R23164i5jIFFTMaxeSt+BK v0mUYQs4kI9dJGwlezt52eJ+na2fmKEG/HgUYFf47oB3sQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU+mCp62XF3RYUCE4MD42b4Pdkr2cwDQYJKoZI hvcNAQELBQADggEBAFfDejaCnI2Y4qtAqkePx6db7XznPWZaOzG73/MWM5H8fHulwqZm46qwtyeY P0nXYGdnPzZPSsvxFPpahygc7Y9BMsaV+X3avXtbwrAh449G3CE4Q3RM+zD4F3LBMvzIkRfEzFg3 TgvMWvchNSiDbGAtROtSjFA9tWwS1/oJu2yySrHFieT801LYYRf+epSEj3m2M1m6D8QL4nCgS3gu +sif/a+RZQp4OBXllxcU3fngLDT4ONCEIgDAFFEYKwLcMFrw6AF8NTojrwjkr6qOKEJJLvD1mTS+ 7Q9LGOHSJDy7XUe3IfKN0QqZjuNuPq1w4I+5ysxugTH2e5x6eeRncRg= -----END CERTIFICATE----- CA WoSign ECC Root ================== -----BEGIN CERTIFICATE----- MIICCTCCAY+gAwIBAgIQaEpYcIBr8I8C+vbe6LCQkDAKBggqhkjOPQQDAzBGMQswCQYDVQQGEwJD TjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxGzAZBgNVBAMTEkNBIFdvU2lnbiBFQ0MgUm9v dDAeFw0xNDExMDgwMDU4NThaFw00NDExMDgwMDU4NThaMEYxCzAJBgNVBAYTAkNOMRowGAYDVQQK ExFXb1NpZ24gQ0EgTGltaXRlZDEbMBkGA1UEAxMSQ0EgV29TaWduIEVDQyBSb290MHYwEAYHKoZI zj0CAQYFK4EEACIDYgAE4f2OuEMkq5Z7hcK6C62N4DrjJLnSsb6IOsq/Srj57ywvr1FQPEd1bPiU t5v8KB7FVMxjnRZLU8HnIKvNrCXSf4/CwVqCXjCLelTOA7WRf6qU0NGKSMyCBSah1VES1ns2o0Iw QDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUqv3VWqP2h4syhf3R MluARZPzA7gwCgYIKoZIzj0EAwMDaAAwZQIxAOSkhLCB1T2wdKyUpOgOPQB0TKGXa/kNUTyh2Tv0 Daupn75OcsqF1NnstTJFGG+rrQIwfcf3aWMvoeGY7xMQ0Xk/0f7qO3/eVvSQsRUR2LIiFdAvwyYu a/GRspBl9JrmkO5K -----END CERTIFICATE----- gsoap-2.8.28/gsoap/samples/wsse/wssedemo.wsdl0000644000175000017500000001116212653650156020555 0ustar ellertellert gsoap-2.8.28/gsoap/samples/wsse/Makefile.am0000644000175000017500000000141312653650156020066 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = foreign 1.4 noinst_PROGRAMS = wssedemo wsselite SOAPHEADER = wssedemo.h include ../Makefile.defines include ../Makefile.c_rules SOAP_NS = wssedemo.nsmap wssedemo_CFLAGS = -DWITH_DOM -DWITH_OPENSSL -DWITH_GZIP wssedemo_SOURCES = wssedemo.c $(SOAPHEADER) $(SOAP_C_SRC) ../../stdsoap2.c ../../dom.c ../../plugin/wsseapi.c ../../plugin/smdevp.c ../../plugin/mecevp.c wssedemo_LDADD = $(SAMPLE_EXTRA_LIBS) -lssl -lcrypto -lz wsselite_SOURCES = wsselite.c $(SOAPHEADER) $(SOAP_C_SRC) ../../stdsoap2.c ../../plugin/wsseapi-lite.c wsselite_LDADD = $(SAMPLE_EXTRA_LIBS) gsoap-2.8.28/gsoap/samples/wsse/cacert.pem0000644000175000017500000000242212653650156017777 0ustar ellertellert-----BEGIN CERTIFICATE----- MIIDkDCCAvmgAwIBAgIJANZ2BsVMtBtVMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYD VQQGEwJVUzELMAkGA1UECBMCRkwxFDASBgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYD VQQKEw1HZW5pdmlhLCBJbmMuMQswCQYDVQQLEwJJVDESMBAGA1UEAxMJbG9jYWxo b3N0MSIwIAYJKoZIhvcNAQkBFhNjb250YWN0QGdlbml2aWEuY29tMB4XDTE1MDgw NDE5MDEyMFoXDTE4MDgwMzE5MDEyMFowgY0xCzAJBgNVBAYTAlVTMQswCQYDVQQI EwJGTDEUMBIGA1UEBxMLVGFsbGFoYXNzZWUxFjAUBgNVBAoTDUdlbml2aWEsIElu Yy4xCzAJBgNVBAsTAklUMRIwEAYDVQQDEwlsb2NhbGhvc3QxIjAgBgkqhkiG9w0B CQEWE2NvbnRhY3RAZ2VuaXZpYS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJ AoGBALx/LiwGRi4wH8y0MEL64VJs5H2O1F4uuYO+aNVZHl5ULRDmSh/4eF8aOYXT B05PfVoctBogcK0ohPEhiUcR/029LQTkEs/5D7XsuRuQsUnMfkEihmC2VtEuJMqT OeXmuIcemEw0QL3ulny7H8W6Aq2rByC2r5iqytnM4Uuw7LMnAgMBAAGjgfUwgfIw HQYDVR0OBBYEFPjHgoC7fuLKD8eItzogWWMDKpTQMIHCBgNVHSMEgbowgbeAFPjH goC7fuLKD8eItzogWWMDKpTQoYGTpIGQMIGNMQswCQYDVQQGEwJVUzELMAkGA1UE CBMCRkwxFDASBgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYDVQQKEw1HZW5pdmlhLCBJ bmMuMQswCQYDVQQLEwJJVDESMBAGA1UEAxMJbG9jYWxob3N0MSIwIAYJKoZIhvcN AQkBFhNjb250YWN0QGdlbml2aWEuY29tggkA1nYGxUy0G1UwDAYDVR0TBAUwAwEB /zANBgkqhkiG9w0BAQUFAAOBgQB+fmbScGp3R4D0Sf4gbBJ/3CGEn4/HvupSikDq vyaviwJ2KQKGlAr/lDh1qSYItkazJpJDIxyG2Dzm2w0F0u1+CSwpym6eq1pxc8dh GRdrCVyuM0gUoBvxUym7o0Bq1V6onUjwrAti+onsZjDpfAIKBI8TRfjuTNzFeSAV G2zULg== -----END CERTIFICATE----- gsoap-2.8.28/gsoap/samples/wsse/wsselite.c0000644000175000017500000001732112653650156020042 0ustar ellertellert/* wsselite.c WS-Security lite demo application. See comments below. gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- This application demonstrates the use of the wsse plugin. Compile: soapcpp2 -I import wssedemo.h cc -o wsselite wsselite.c wsseapi.c stdsoap2.c soapC.c soapClient.c soapServer.c Note: The wsse.h, wsu.h, ds.h, xenc.h c14n.h files are located in 'import'. The wsseapi-lite.* files are located in 'plugin'. Usage: wsselite s [port] with options: s server (stand-alone) To run a stand-alone server: ./wssedemo s 8080 And invoking it with a client: ./wssedemo c 8080 */ #include "wsseapi-lite.h" #include "wssetest.nsmap" int main(int argc, char **argv) { struct soap *soap; int server = 0; int port = 0; double result; char *user; /* create context */ soap = soap_new(); /* options */ if (argc >= 2) { if (strchr(argv[1], 'c')) soap_set_omode(soap, SOAP_IO_CHUNK); soap_set_omode(soap, SOAP_XML_INDENT); if (strchr(argv[1], 's')) server = 1; } /* soap->actor = "..."; */ /* set only when required */ user = getenv("USER"); if (!user) user = "anyone"; /* port argument */ if (argc >= 3) port = atoi(argv[2]); /* server or client/ */ if (server) { if (port) { /* stand-alone server serving messages over port */ if (!soap_valid_socket(soap_bind(soap, NULL, port, 100))) { soap_print_fault(soap, stderr); exit(1); } printf("Server started at port %d\n", port); while (soap_valid_socket(soap_accept(soap))) { if (soap_serve(soap)) { soap_wsse_delete_Security(soap); soap_print_fault(soap, stderr); soap_print_fault_location(soap, stderr); } soap_destroy(soap); soap_end(soap); } soap_print_fault(soap, stderr); exit(1); } else { /* CGI-style server serving messages over stdin/out */ if (soap_serve(soap)) { soap_wsse_delete_Security(soap); soap_print_fault(soap, stderr); soap_print_fault_location(soap, stderr); } soap_destroy(soap); soap_end(soap); } } else /* client */ { char endpoint[80]; /* ns1:test data */ struct ns1__add a; struct ns1__sub b; a.a = 123; a.b = 456; b.a = 789; b.b = -99999; /* client sending messages to stdout or over port */ if (port) sprintf(endpoint, "http://localhost:%d", port); else strcpy(endpoint, "http://"); /* message lifetime of 60 seconds */ soap_wsse_add_Timestamp(soap, NULL, 60); /* add user name with text or digest password */ soap_wsse_add_UsernameTokenText(soap, NULL, user, "userPass"); /* invoke the server. You can choose add, sub, mul, or div operations * that show different security aspects (intentional message rejections) * for demonstration purposes (see server operations below) */ if (!soap_call_ns1__add(soap, endpoint, NULL, 1.0, 2.0, &result)) { if (!soap_wsse_verify_Timestamp(soap)) { const char *servername = soap_wsse_get_Username(soap); if (servername && !strcmp(servername, "server") && !soap_wsse_verify_Password(soap, "serverPass")) printf("Result = %g\n", result); else { fprintf(stderr, "Server authentication failed\n"); soap_print_fault(soap, stderr); } } else { fprintf(stderr, "Server response expired\n"); soap_print_fault(soap, stderr); } } else { soap_print_fault(soap, stderr); soap_print_fault_location(soap, stderr); } /* clean up security header */ soap_wsse_delete_Security(soap); } /* clean up gSOAP engine */ soap_destroy(soap); soap_end(soap); soap_done(soap); free(soap); /* done */ return 0; } int ns1__add(struct soap *soap, double a, double b, double *result) { const char *username = soap_wsse_get_Username(soap); if (username) fprintf(stderr, "Hello %s, want to add %g + %g = ?\n", username, a, b); if (soap_wsse_verify_Timestamp(soap) || soap_wsse_verify_Password(soap, "userPass")) { int err = soap->error; /* preserve error code */ soap_wsse_delete_Security(soap); /* remove WS-Security information */ return err; } soap_wsse_delete_Security(soap); /* remove WS-Security before setting new security information */ soap_wsse_add_Timestamp(soap, NULL, 10); /* lifetime of 10 seconds */ soap_wsse_add_UsernameTokenText(soap, NULL, "server", "serverPass"); *result = a + b; return SOAP_OK; } int ns1__sub(struct soap *soap, double a, double b, double *result) { const char *username = soap_wsse_get_Username(soap); if (username) fprintf(stderr, "Hello %s, want to subtract %g - %g = ?\n", username, a, b); if (soap_wsse_verify_Timestamp(soap) || soap_wsse_verify_Password(soap, "userPass")) { soap_wsse_delete_Security(soap); return soap->error; } soap_wsse_delete_Security(soap); /* In this case we leave out the timestamp, which is the sender's * responsibility to add. The receiver only complains if the timestamp is out * of date, not that it is absent. */ *result = a - b; return SOAP_OK; } int ns1__mul(struct soap *soap, double a, double b, double *result) { const char *username = soap_wsse_get_Username(soap); if (username) fprintf(stderr, "Hello %s, want to multiply %g * %g = ?\n", username, a, b); if (soap_wsse_verify_Timestamp(soap) || soap_wsse_verify_Password(soap, "userPass")) { soap_wsse_delete_Security(soap); return soap->error; } soap_wsse_delete_Security(soap); soap_wsse_add_Timestamp(soap, NULL, 10); /* lifetime of 10 seconds */ /* In this case we leave out the server name and password. Because the * client receiver requires the presence of authentication information, the * client will reject the response. */ *result = a * b; return SOAP_OK; } int ns1__div(struct soap *soap, double a, double b, double *result) { const char *username = soap_wsse_get_Username(soap); if (username) fprintf(stderr, "Hello %s, want to divide %g / %g = ?\n", username, a, b); if (soap_wsse_verify_Timestamp(soap) || soap_wsse_verify_Password(soap, "userPass")) { soap_wsse_delete_Security(soap); return soap->error; } soap_wsse_delete_Security(soap); soap_wsse_add_Timestamp(soap, NULL, 10); /* lifetime of 10 seconds */ soap_wsse_add_UsernameTokenText(soap, NULL, "server", "serverPass"); /* In this case we leave out the signature and the receiver will reject this unsigned message. */ if (b == 0.0) return soap_sender_fault(soap, "Division by zero", NULL); *result = a / b; return SOAP_OK; } gsoap-2.8.28/gsoap/samples/mashup/0000755000175000017500000000000012653650170016343 5ustar ellertellertgsoap-2.8.28/gsoap/samples/mashup/Makefile.in0000644000175000017500000004613312653650156020423 0ustar ellertellert# Makefile.in generated by automake 1.14 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = mashupclient$(EXEEXT) mashupserver$(EXEEXT) DIST_COMMON = $(srcdir)/../Makefile.defines \ $(srcdir)/../Makefile.c_rules $(srcdir)/Makefile.in \ $(srcdir)/Makefile.am $(top_srcdir)/mkinstalldirs \ $(top_srcdir)/depcomp subdir = gsoap/samples/mashup ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = am__objects_2 = soapC.$(OBJEXT) am__objects_3 = soapClient.$(OBJEXT) $(am__objects_2) am_mashupclient_OBJECTS = mashupclient.$(OBJEXT) $(am__objects_1) \ $(am__objects_3) mashupclient_OBJECTS = $(am_mashupclient_OBJECTS) am__DEPENDENCIES_1 = mashupclient_DEPENDENCIES = $(SOAP_C_LIB) $(am__DEPENDENCIES_1) am_mashupserver_OBJECTS = mashupserver.$(OBJEXT) $(am__objects_1) \ $(am__objects_3) soapServer.$(OBJEXT) mashupserver_OBJECTS = $(am_mashupserver_OBJECTS) mashupserver_DEPENDENCIES = $(SOAP_C_LIB) $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(mashupclient_SOURCES) $(mashupserver_SOURCES) DIST_SOURCES = $(mashupclient_SOURCES) $(mashupserver_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ STRIP = @STRIP@ VERSION = @VERSION@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 SOAPHEADER = mashup.h AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a SOAP_C_SRC = $(SOAP_C_CLIENT) soapServer.c $(SOAP_H_FILES) $(SOAP_NS) LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_C_SRC) CLEANFILES = $(SOAP_C_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.c soapClient.c soapClientLib.c soapServer.c soapServerLib.c *~ SOAP_NS = mashup.nsmap mashupclient_SOURCES = mashupclient.c $(SOAPHEADER) $(SOAP_C_CLIENT) mashupclient_LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) mashupserver_SOURCES = mashupserver.c $(SOAPHEADER) $(SOAP_C_CLIENT) soapServer.c mashupserver_LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.c_rules $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/mashup/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/mashup/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.c_rules: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) mashupclient$(EXEEXT): $(mashupclient_OBJECTS) $(mashupclient_DEPENDENCIES) $(EXTRA_mashupclient_DEPENDENCIES) @rm -f mashupclient$(EXEEXT) $(AM_V_CCLD)$(LINK) $(mashupclient_OBJECTS) $(mashupclient_LDADD) $(LIBS) mashupserver$(EXEEXT): $(mashupserver_OBJECTS) $(mashupserver_DEPENDENCIES) $(EXTRA_mashupserver_DEPENDENCIES) @rm -f mashupserver$(EXEEXT) $(AM_V_CCLD)$(LINK) $(mashupserver_OBJECTS) $(mashupserver_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mashupclient.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mashupserver.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapC.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapClient.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapServer.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am $(SOAP_C_SRC) : $(SOAPHEADER) $(SOAP) -cL -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $(SOAPHEADER) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.28/gsoap/samples/mashup/t.wsdl0000644000175000017500000000514112653650156017506 0ustar ellertellert Service definition of function t__gmt gSOAP 2.7.12 generated service definition gsoap-2.8.28/gsoap/samples/mashup/calc.wsdl0000644000175000017500000001256412653650156020154 0ustar ellertellert Sums two values Subtracts two values Multiplies two values Divides two values Raises a to b Simple calculator service gsoap-2.8.28/gsoap/samples/mashup/mashupclient.c0000644000175000017500000000355612653650156021220 0ustar ellertellert/* mashupclient.c Example mashup service client in C soapcpp2 -c mashup.h cc -o mashupclient mashupclient.c stdsoap2.c soapC.c soapClient.c -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" #include "mashup.nsmap" int main() { struct soap *soap = soap_new(); struct _ns3__commingtotown response; if (soap_call___ns5__dtx(soap, NULL, NULL, "", &response)) soap_print_fault(soap, stderr); else if (response.days == 0) printf("Today is the day!\n"); else printf("Wait %d more days to xmas\n", response.days); return 0; } gsoap-2.8.28/gsoap/samples/mashup/mashup.h0000644000175000017500000011070212653650156020016 0ustar ellertellert// Reminder: Modify typemap.dat to customize the header file generated by wsdl2h /* mashup.h Generated by wsdl2h 2.8.26 from t.wsdl calc.wsdl mashup.wsdl and typemap.dat 2015-11-29 16:32:22 GMT DO NOT INCLUDE THIS FILE DIRECTLY INTO YOUR PROJECT BUILDS USE THE soapcpp2-GENERATED SOURCE CODE FILES FOR YOUR PROJECT BUILDS gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc. All Rights Reserved. This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia Inc., contact@genivia.com -------------------------------------------------------------------------------- */ /** @page page_notes Notes @note HINTS: - Run soapcpp2 on mashup.h to generate the SOAP/XML processing logic. Use soapcpp2 -I to specify paths for #import To build with STL, 'stlvector.h' is imported from 'import' dir in package. Use soapcpp2 -j to generate improved proxy and server classes. - Use wsdl2h -c and -s to generate pure C code or C++ code without STL. - Use 'typemap.dat' to control namespace bindings and type mappings. It is strongly recommended to customize the names of the namespace prefixes generated by wsdl2h. To do so, modify the prefix bindings in the Namespaces section below and add the modified lines to 'typemap.dat' to rerun wsdl2h. - Use Doxygen (www.doxygen.org) on this file to generate documentation. - Use wsdl2h -R to generate REST operations. - Use wsdl2h -nname to use name as the base namespace prefix instead of 'ns'. - Use wsdl2h -Nname for service prefix and produce multiple service bindings - Use wsdl2h -d to enable DOM support for xsd:anyType. - Use wsdl2h -g to auto-generate readers and writers for root elements. - Use wsdl2h -b to auto-generate bi-directional operations (duplex ops). - Use wsdl2h -U to map XML names to C++ Unicode identifiers instead of _xNNNN. - Use wsdl2h -u to disable the generation of unions. - Struct/class members serialized as XML attributes are annotated with a '@'. - Struct/class members that have a special role are annotated with a '$'. @warning DO NOT INCLUDE THIS ANNOTATED FILE DIRECTLY IN YOUR PROJECT SOURCE CODE. USE THE FILES GENERATED BY soapcpp2 FOR YOUR PROJECT'S SOURCE CODE: THE soapStub.h FILE CONTAINS THIS CONTENT WITHOUT ANNOTATIONS. @copyright LICENSE: @verbatim -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc. All Rights Reserved. The wsdl2h tool and its generated software are released under the GPL. This software is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial-use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- @endverbatim */ //gsoapopt c,w /******************************************************************************\ * * * Definitions * * * * * \******************************************************************************/ /******************************************************************************\ * * * Import * * * \******************************************************************************/ /******************************************************************************\ * * * Schema Namespaces * * * \******************************************************************************/ /* NOTE: It is strongly recommended to customize the names of the namespace prefixes generated by wsdl2h. To do so, modify the prefix bindings below and add the modified lines to typemap.dat to rerun wsdl2h: ns1 = "http://tempuri.org/t.xsd" ns2 = "urn:calc" ns3 = "urn:daystoxmas" */ #define SOAP_NAMESPACE_OF_ns1 "http://tempuri.org/t.xsd" //gsoap ns1 schema namespace: http://tempuri.org/t.xsd //gsoap ns1 schema form: unqualified #define SOAP_NAMESPACE_OF_ns2 "urn:calc" //gsoap ns2 schema namespace: urn:calc //gsoap ns2 schema form: unqualified #define SOAP_NAMESPACE_OF_ns3 "urn:daystoxmas" //gsoap ns3 schema namespace: urn:daystoxmas //gsoap ns3 schema form: qualified /******************************************************************************\ * * * Built-in Schema Types and Top-Level Elements and Attributes * * * \******************************************************************************/ /// @brief Top-level root element "urn:daystoxmas":daystoxmas. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /******************************************************************************\ * * * Schema Types and Top-Level Elements and Attributes * * http://tempuri.org/t.xsd * * * \******************************************************************************/ /******************************************************************************\ * * * Schema Types and Top-Level Elements and Attributes * * urn:calc * * * \******************************************************************************/ /******************************************************************************\ * * * Schema Types and Top-Level Elements and Attributes * * urn:daystoxmas * * * \******************************************************************************/ /******************************************************************************\ * * * Schema Complex Types and Top-Level Elements * * http://tempuri.org/t.xsd * * * \******************************************************************************/ /// @brief Top-level root element "http://tempuri.org/t.xsd":gmt /// @brief "http://tempuri.org/t.xsd":gmt is a complexType. /// /// struct _ns1__gmt operations: /// - soap_default__ns1__gmt(soap*, _ns1__gmt*) reset members to default /// - int soap_read__ns1__gmt(soap*, _ns1__gmt*) deserialize from a source /// - int soap_write__ns1__gmt(soap*, _ns1__gmt*) serialize to a sink /// - _ns1__gmt* soap_dup__ns1__gmt(soap*, _ns1__gmt* dst, _ns1__gmt *src) returns deep copy of _ns1__gmt src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del__ns1__gmt(_ns1__gmt*) deep deletes _ns1__gmt data members, use only on dst after soap_dup__ns1__gmt(NULL, _ns1__gmt *dst, _ns1__gmt *src) (use soapcpp2 -Ed) struct _ns1__gmt { }; /// @brief Top-level root element "http://tempuri.org/t.xsd":gmtResponse /// @brief "http://tempuri.org/t.xsd":gmtResponse is a complexType. /// /// struct _ns1__gmtResponse operations: /// - soap_default__ns1__gmtResponse(soap*, _ns1__gmtResponse*) reset members to default /// - int soap_read__ns1__gmtResponse(soap*, _ns1__gmtResponse*) deserialize from a source /// - int soap_write__ns1__gmtResponse(soap*, _ns1__gmtResponse*) serialize to a sink /// - _ns1__gmtResponse* soap_dup__ns1__gmtResponse(soap*, _ns1__gmtResponse* dst, _ns1__gmtResponse *src) returns deep copy of _ns1__gmtResponse src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del__ns1__gmtResponse(_ns1__gmtResponse*) deep deletes _ns1__gmtResponse data members, use only on dst after soap_dup__ns1__gmtResponse(NULL, _ns1__gmtResponse *dst, _ns1__gmtResponse *src) (use soapcpp2 -Ed) struct _ns1__gmtResponse { /// Element "param-1" of XSD type xs:dateTime. time_t* param_1 0; ///< Optional element. }; /******************************************************************************\ * * * Schema Complex Types and Top-Level Elements * * urn:calc * * * \******************************************************************************/ /******************************************************************************\ * * * Schema Complex Types and Top-Level Elements * * urn:daystoxmas * * * \******************************************************************************/ /// @brief Top-level root element "urn:daystoxmas":commingtotown /// @brief "urn:daystoxmas":commingtotown is a complexType. /// /// struct _ns3__commingtotown operations: /// - soap_default__ns3__commingtotown(soap*, _ns3__commingtotown*) reset members to default /// - int soap_read__ns3__commingtotown(soap*, _ns3__commingtotown*) deserialize from a source /// - int soap_write__ns3__commingtotown(soap*, _ns3__commingtotown*) serialize to a sink /// - _ns3__commingtotown* soap_dup__ns3__commingtotown(soap*, _ns3__commingtotown* dst, _ns3__commingtotown *src) returns deep copy of _ns3__commingtotown src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del__ns3__commingtotown(_ns3__commingtotown*) deep deletes _ns3__commingtotown data members, use only on dst after soap_dup__ns3__commingtotown(NULL, _ns3__commingtotown *dst, _ns3__commingtotown *src) (use soapcpp2 -Ed) struct _ns3__commingtotown { /// Element "days" of XSD type xs:int. int days 1; ///< Required element. }; /******************************************************************************\ * * * Additional Top-Level Elements * * http://tempuri.org/t.xsd * * * \******************************************************************************/ /******************************************************************************\ * * * Additional Top-Level Attributes * * http://tempuri.org/t.xsd * * * \******************************************************************************/ /******************************************************************************\ * * * Additional Top-Level Elements * * urn:calc * * * \******************************************************************************/ /******************************************************************************\ * * * Additional Top-Level Attributes * * urn:calc * * * \******************************************************************************/ /******************************************************************************\ * * * Additional Top-Level Elements * * urn:daystoxmas * * * \******************************************************************************/ /******************************************************************************\ * * * Additional Top-Level Attributes * * urn:daystoxmas * * * \******************************************************************************/ /******************************************************************************\ * * * Services * * * \******************************************************************************/ //gsoap ns2 service name: calc //gsoap ns2 service type: calcPortType //gsoap ns2 service port: http://websrv.cs.fsu.edu/~engelen/calcserver.cgi //gsoap ns2 service namespace: urn:calc //gsoap ns2 service transport: http://schemas.xmlsoap.org/soap/http //gsoap ns4 service name: Service //gsoap ns4 service type: ServicePortType //gsoap ns4 service port: http://localhost:80 //gsoap ns4 service namespace: http://tempuri.org/t.xsd/Service.wsdl //gsoap ns4 service transport: http://schemas.xmlsoap.org/soap/http //gsoap ns5 service name: mashup //gsoap ns5 service type: PortType //gsoap ns5 service port: http://www.cs.fsu.edu/~engelen/mashup.cgi //gsoap ns5 service namespace: http://www.genivia.com/mashup.wsdl //gsoap ns5 service transport: http://schemas.xmlsoap.org/soap/http /** @mainpage WSDL Definitions @section WSDL_bindings Service Bindings - @ref calc - @ref Service - @ref mashup @section WSDL_more More Information - @ref page_notes "Notes" - @ref page_XMLDataBinding "XML Data Binding" - @ref SOAP_ENV__Header "SOAP Header Content" (when applicable) - @ref SOAP_ENV__Detail "SOAP Fault Detail Content" (when applicable) */ /** @page calc Binding "calc" @section calc_service Service Documentation "calc" Simple calculator service @section calc_operations Operations of Binding "calc" - @ref ns2__add - @ref ns2__sub - @ref ns2__mul - @ref ns2__div - @ref ns2__pow @section calc_ports Endpoints of Binding "calc" - http://websrv.cs.fsu.edu/~engelen/calcserver.cgi @note Use wsdl2h option -Nname to change the service binding prefix name */ /** @page Service Binding "Service" @section Service_service Service Documentation "Service" gSOAP 2.8.26 generated service definition @section Service_operations Operations of Binding "Service" - @ref __ns4__gmt @section Service_ports Endpoints of Binding "Service" - http://localhost:80 @note Use wsdl2h option -Nname to change the service binding prefix name */ /** @page mashup Binding "mashup" @section mashup_operations Operations of Binding "mashup" - @ref __ns5__dtx @section mashup_ports Endpoints of Binding "mashup" - http://www.cs.fsu.edu/~engelen/mashup.cgi @note Use wsdl2h option -Nname to change the service binding prefix name */ /******************************************************************************\ * * * Service Binding * * calc * * * \******************************************************************************/ /******************************************************************************\ * * * Service Operation * * ns2__add * * * \******************************************************************************/ /** Operation "ns2__add" of service binding "calc". Sums two values - http://schemas.xmlsoap.org/soap/encoding/ RPC encodingStyle="SOAP" - Addressing input action: "" - Addressing output action: "Response" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call_ns2__add( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: double a, double b, // output parameters: double *result ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int ns2__add( struct soap *soap, // input parameters: double a, double b, // output parameters: double *result ); @endcode */ //gsoap ns2 service method-protocol: add SOAP //gsoap ns2 service method-style: add rpc //gsoap ns2 service method-encoding: add http://schemas.xmlsoap.org/soap/encoding/ //gsoap ns2 service method-action: add "" //gsoap ns2 service method-output-action: add Response int ns2__add( double a, ///< Input parameter double b, ///< Input parameter double *result ///< Output parameter ); /******************************************************************************\ * * * Service Operation * * ns2__sub * * * \******************************************************************************/ /** Operation "ns2__sub" of service binding "calc". Subtracts two values - http://schemas.xmlsoap.org/soap/encoding/ RPC encodingStyle="SOAP" - Addressing input action: "" - Addressing output action: "Response" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call_ns2__sub( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: double a, double b, // output parameters: double *result ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int ns2__sub( struct soap *soap, // input parameters: double a, double b, // output parameters: double *result ); @endcode */ //gsoap ns2 service method-protocol: sub SOAP //gsoap ns2 service method-style: sub rpc //gsoap ns2 service method-encoding: sub http://schemas.xmlsoap.org/soap/encoding/ //gsoap ns2 service method-action: sub "" //gsoap ns2 service method-output-action: sub Response int ns2__sub( double a, ///< Input parameter double b, ///< Input parameter double *result ///< Output parameter ); /******************************************************************************\ * * * Service Operation * * ns2__mul * * * \******************************************************************************/ /** Operation "ns2__mul" of service binding "calc". Multiplies two values - http://schemas.xmlsoap.org/soap/encoding/ RPC encodingStyle="SOAP" - Addressing input action: "" - Addressing output action: "Response" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call_ns2__mul( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: double a, double b, // output parameters: double *result ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int ns2__mul( struct soap *soap, // input parameters: double a, double b, // output parameters: double *result ); @endcode */ //gsoap ns2 service method-protocol: mul SOAP //gsoap ns2 service method-style: mul rpc //gsoap ns2 service method-encoding: mul http://schemas.xmlsoap.org/soap/encoding/ //gsoap ns2 service method-action: mul "" //gsoap ns2 service method-output-action: mul Response int ns2__mul( double a, ///< Input parameter double b, ///< Input parameter double *result ///< Output parameter ); /******************************************************************************\ * * * Service Operation * * ns2__div * * * \******************************************************************************/ /** Operation "ns2__div" of service binding "calc". Divides two values - http://schemas.xmlsoap.org/soap/encoding/ RPC encodingStyle="SOAP" - Addressing input action: "" - Addressing output action: "Response" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call_ns2__div( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: double a, double b, // output parameters: double *result ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int ns2__div( struct soap *soap, // input parameters: double a, double b, // output parameters: double *result ); @endcode */ //gsoap ns2 service method-protocol: div SOAP //gsoap ns2 service method-style: div rpc //gsoap ns2 service method-encoding: div http://schemas.xmlsoap.org/soap/encoding/ //gsoap ns2 service method-action: div "" //gsoap ns2 service method-output-action: div Response int ns2__div( double a, ///< Input parameter double b, ///< Input parameter double *result ///< Output parameter ); /******************************************************************************\ * * * Service Operation * * ns2__pow * * * \******************************************************************************/ /** Operation "ns2__pow" of service binding "calc". Raises a to b - http://schemas.xmlsoap.org/soap/encoding/ RPC encodingStyle="SOAP" - Addressing input action: "" - Addressing output action: "Response" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call_ns2__pow( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: double a, double b, // output parameters: double *result ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int ns2__pow( struct soap *soap, // input parameters: double a, double b, // output parameters: double *result ); @endcode */ //gsoap ns2 service method-protocol: pow SOAP //gsoap ns2 service method-style: pow rpc //gsoap ns2 service method-encoding: pow http://schemas.xmlsoap.org/soap/encoding/ //gsoap ns2 service method-action: pow "" //gsoap ns2 service method-output-action: pow Response int ns2__pow( double a, ///< Input parameter double b, ///< Input parameter double *result ///< Output parameter ); /** @page calc Binding "calc" @section calc_policy_enablers Policy Enablers of Binding "calc" None specified. */ /******************************************************************************\ * * * Service Binding * * Service * * * \******************************************************************************/ /******************************************************************************\ * * * Service Operation * * __ns4__gmt * * * \******************************************************************************/ /** Operation "__ns4__gmt" of service binding "Service". Service definition of function t__gmt - SOAP document/literal style messaging - Addressing input action: "" - Addressing output action: "Response" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___ns4__gmt( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: struct _ns1__gmt* ns1__gmt, // output parameters: struct _ns1__gmtResponse *ns1__gmtResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __ns4__gmt( struct soap *soap, // input parameters: struct _ns1__gmt* ns1__gmt, // output parameters: struct _ns1__gmtResponse *ns1__gmtResponse ); @endcode */ //gsoap ns4 service method-protocol: gmt SOAP //gsoap ns4 service method-style: gmt document //gsoap ns4 service method-encoding: gmt literal //gsoap ns4 service method-action: gmt "" //gsoap ns4 service method-output-action: gmt Response int __ns4__gmt( struct _ns1__gmt* ns1__gmt, ///< Input parameter struct _ns1__gmtResponse *ns1__gmtResponse ///< Output parameter ); /** @page Service Binding "Service" @section Service_policy_enablers Policy Enablers of Binding "Service" None specified. */ /******************************************************************************\ * * * Service Binding * * mashup * * * \******************************************************************************/ /******************************************************************************\ * * * Service Operation * * __ns5__dtx * * * \******************************************************************************/ /** Operation "__ns5__dtx" of service binding "mashup". - SOAP document/literal style messaging - Addressing input action: "" - Addressing output action: "Response" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___ns5__dtx( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: _XML ns3__daystoxmas, // output parameters: struct _ns3__commingtotown *ns3__commingtotown ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __ns5__dtx( struct soap *soap, // input parameters: _XML ns3__daystoxmas, // output parameters: struct _ns3__commingtotown *ns3__commingtotown ); @endcode */ //gsoap ns5 service method-protocol: dtx SOAP //gsoap ns5 service method-style: dtx document //gsoap ns5 service method-encoding: dtx literal //gsoap ns5 service method-action: dtx "" //gsoap ns5 service method-output-action: dtx Response int __ns5__dtx( _XML ns3__daystoxmas, ///< Input parameter struct _ns3__commingtotown *ns3__commingtotown ///< Output parameter ); /** @page mashup Binding "mashup" @section mashup_policy_enablers Policy Enablers of Binding "mashup" None specified. */ /******************************************************************************\ * * * XML Data Binding * * * \******************************************************************************/ /** @page page_XMLDataBinding XML Data Binding SOAP/XML services use data bindings contractually bound by WSDL and auto- generated by wsdl2h and soapcpp2 (see Service Bindings). Plain data bindings are adopted from XML schemas as part of the WSDL types section or when running wsdl2h on a set of schemas to produce non-SOAP-based XML data bindings. The following readers and writers are C/C++ data type (de)serializers auto- generated by wsdl2h and soapcpp2. Run soapcpp2 on this file to generate the (de)serialization code, which is stored in soapC.c[pp]. Include "soapH.h" in your code to import these data type and function declarations. Only use the soapcpp2-generated files in your project build. Do not include the wsdl2h- generated .h file in your code. Data can be read in XML and deserialized from: - a file descriptor, using soap->recvfd = fd - a socket, using soap->socket = ... - a C++ stream, using soap->is = ... - a buffer, using the soap->frecv() callback Data can be serialized in XML and written to: - a file descriptor, using soap->sendfd = fd - a socket, using soap->socket = ... - a C++ stream, using soap->os = ... - a buffer, using the soap->fsend() callback The following options are available for (de)serialization control: - soap->encodingStyle = NULL; to remove SOAP 1.1/1.2 encodingStyle - soap_mode(soap, SOAP_XML_TREE); XML without id-ref (no cycles!) - soap_mode(soap, SOAP_XML_GRAPH); XML with id-ref (including cycles) - soap_set_namespaces(soap, struct Namespace *nsmap); to set xmlns bindings @section ns1 Top-level root elements of schema "http://tempuri.org/t.xsd" - @ref _ns1__gmt @code // Reader (returns SOAP_OK on success): soap_read__ns1__gmt(struct soap*, struct _ns1__gmt*); // Writer (returns SOAP_OK on success): soap_write__ns1__gmt(struct soap*, struct _ns1__gmt*); @endcode - @ref _ns1__gmtResponse @code // Reader (returns SOAP_OK on success): soap_read__ns1__gmtResponse(struct soap*, struct _ns1__gmtResponse*); // Writer (returns SOAP_OK on success): soap_write__ns1__gmtResponse(struct soap*, struct _ns1__gmtResponse*); @endcode @section ns2 Top-level root elements of schema "urn:calc" @section ns3 Top-level root elements of schema "urn:daystoxmas" - @ref _ns3__daystoxmas @code // Reader (returns SOAP_OK on success): soap_read__ns3__daystoxmas(struct soap*, _XML); // Writer (returns SOAP_OK on success): soap_write__ns3__daystoxmas(struct soap*, _XML); @endcode - @ref _ns3__commingtotown @code // Reader (returns SOAP_OK on success): soap_read__ns3__commingtotown(struct soap*, struct _ns3__commingtotown*); // Writer (returns SOAP_OK on success): soap_write__ns3__commingtotown(struct soap*, struct _ns3__commingtotown*); @endcode */ /* End of mashup.h */ gsoap-2.8.28/gsoap/samples/mashup/README.txt0000644000175000017500000000157712653650156020057 0ustar ellertellert A simple example "mashup" service. The service computes the number of days to christmas using the GMT time service and calculator service. The wsdl2h importer accepts multiple WSDLs and generates one gSOAP definitions file to implement clients and/or services. In this case we create a new service to compute the days to christmas by invoking the GMT and calc services. A client for the mashup service is also included. The mashup.h gSOAP definitions file is generated from the GMT and calculator WSDLs using: wsdl2h -c -o mashup.h t.wsdl calc.wsdl mashup.wsdl where t.wsdl is generated in samples/gmt, calc.wsdl is generated in samples/calc, and mashup.wsdl is a new WSDL to expose the new "daystoxmas" service operation. The mashupserver is a CGI application. The mashupclient is a stand-alone client for the service. Invoking mashupclient will return the number of days to christmas. gsoap-2.8.28/gsoap/samples/mashup/mashupserver.c0000644000175000017500000000750612653650156021247 0ustar ellertellert/* mashupserver.c Example mashup CGI service in C soapcpp2 -c mashup.h cc -o mashupserver mashupserver.c stdsoap2.c soapC.c soapClient.c soapServer.c -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" #include "mashup.nsmap" int main(int argc, char **argv) { return soap_serve(soap_new()); } /******************************************************************************\ * * Server operation * \******************************************************************************/ int __ns5__dtx(struct soap *soap, _XML x, struct _ns3__commingtotown *response) { struct soap *csoap = soap_copy(soap); struct _ns1__gmt gmt; struct _ns1__gmtResponse gmtResponse; struct tm tm; time_t *now, xmas; double sec, days; if (soap_call___ns4__gmt(csoap, "http://www.cs.fsu.edu/~engelen/gmtlitserver.cgi", NULL, &gmt, &gmtResponse)) { soap_end(csoap); soap_free(csoap); return soap_receiver_fault(soap, "Cannot connect to GMT server", NULL); } now = gmtResponse.param_1; if (!now) return soap_receiver_fault(soap, "Could not retrieve current time", NULL); memset(&tm, 0, sizeof(struct tm)); tm.tm_mday = 25; tm.tm_mon = 11; tm.tm_year = gmtime(now)->tm_year; /* this year */ xmas = soap_timegm(&tm); if (xmas < *now) { tm.tm_year++; /* xmas just passed, go to next year */ xmas = soap_timegm(&tm); } sec = difftime(xmas, *now); if (soap_call_ns2__div(csoap, NULL, NULL, sec, 86400, &days)) { soap_end(csoap); soap_free(csoap); return soap_receiver_fault(soap, "Cannot connect to calc server", NULL); } soap_delegate_deletion(csoap, soap); /* server should delete data */ soap_end(csoap); soap_free(csoap); response->days = (int)days; return SOAP_OK; } /******************************************************************************\ * * Dummy operations (these are implemented in the calc and gmt servers * \******************************************************************************/ int ns2__add(struct soap *soap, double a, double b, double *r) { return SOAP_NO_METHOD; } int ns2__sub(struct soap *soap, double a, double b, double *r) { return SOAP_NO_METHOD; } int ns2__mul(struct soap *soap, double a, double b, double *r) { return SOAP_NO_METHOD; } int ns2__div(struct soap *soap, double a, double b, double *r) { return SOAP_NO_METHOD; } int ns2__pow(struct soap *soap, double a, double b, double *r) { return SOAP_NO_METHOD; } int __ns4__gmt(struct soap *soap, struct _ns1__gmt *a, struct _ns1__gmtResponse *r) { return SOAP_NO_METHOD; } gsoap-2.8.28/gsoap/samples/mashup/Makefile.am0000644000175000017500000000121412653650156020401 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 noinst_PROGRAMS = mashupclient mashupserver SOAPHEADER = mashup.h include ../Makefile.defines include ../Makefile.c_rules SOAP_NS = mashup.nsmap mashupclient_SOURCES = mashupclient.c $(SOAPHEADER) $(SOAP_C_CLIENT) mashupclient_LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) mashupserver_SOURCES = mashupserver.c $(SOAPHEADER) $(SOAP_C_CLIENT) soapServer.c mashupserver_LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) gsoap-2.8.28/gsoap/samples/mashup/mashup.wsdl0000444000175000017500000000426612653650156020545 0ustar ellertellert gsoap-2.8.28/gsoap/samples/roll/0000755000175000017500000000000012653650172016020 5ustar ellertellertgsoap-2.8.28/gsoap/samples/roll/Makefile.in0000644000175000017500000004723112653650156020076 0ustar ellertellert# Makefile.in generated by automake 1.14 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = rollclient$(EXEEXT) rollserver$(EXEEXT) DIST_COMMON = $(srcdir)/../Makefile.defines \ $(srcdir)/../Makefile.cpp_rules $(srcdir)/Makefile.in \ $(srcdir)/Makefile.am $(top_srcdir)/mkinstalldirs \ $(top_srcdir)/depcomp subdir = gsoap/samples/roll ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = am__objects_2 = soapC.$(OBJEXT) am__objects_3 = soapClient.$(OBJEXT) $(am__objects_2) am_rollclient_OBJECTS = rollclient.$(OBJEXT) $(am__objects_1) \ $(am__objects_3) rollclient_OBJECTS = $(am_rollclient_OBJECTS) am__DEPENDENCIES_1 = rollclient_DEPENDENCIES = $(SOAP_CPP_LIB) $(am__DEPENDENCIES_1) am__objects_4 = soapServer.$(OBJEXT) $(am__objects_2) am_rollserver_OBJECTS = rollserver.$(OBJEXT) $(am__objects_1) \ $(am__objects_4) rollserver_OBJECTS = $(am_rollserver_OBJECTS) rollserver_DEPENDENCIES = $(SOAP_CPP_LIB) $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(rollclient_SOURCES) $(rollserver_SOURCES) DIST_SOURCES = $(rollclient_SOURCES) $(rollserver_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ STRIP = @STRIP@ VERSION = @VERSION@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 SOAPHEADER = roll.h AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a SOAP_CPP_SRC = $(SOAP_CPP_CLIENT) soapServer.cpp $(SOAP_H_FILES) $(SOAP_NS) LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_CPP_SRC) CLEANFILES = $(SOAP_CPP_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.cpp soap*Proxy.h soap*Proxy.cpp soap*Object.h soap*Service.h soap*Service.cpp soapClient.cpp soapServer.cpp soapClientLib.cpp soapServerLib.cpp *~ SOAP_NS = r.nsmap r.wsdl rollclient_SOURCES = rollclient.cpp $(SOAPHEADER) $(SOAP_CPP_CLIENT) rollclient_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) rollserver_SOURCES = rollserver.cpp $(SOAPHEADER) $(SOAP_CPP_SERVER) rollserver_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_rules $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/roll/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/roll/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_rules: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) rollclient$(EXEEXT): $(rollclient_OBJECTS) $(rollclient_DEPENDENCIES) $(EXTRA_rollclient_DEPENDENCIES) @rm -f rollclient$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(rollclient_OBJECTS) $(rollclient_LDADD) $(LIBS) rollserver$(EXEEXT): $(rollserver_OBJECTS) $(rollserver_DEPENDENCIES) $(EXTRA_rollserver_DEPENDENCIES) @rm -f rollserver$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(rollserver_OBJECTS) $(rollserver_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rollclient.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rollserver.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapC.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapClient.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapServer.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am $(SOAP_CPP_SRC) : $(SOAPHEADER) $(SOAP) -L -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $(SOAPHEADER) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.28/gsoap/samples/roll/rollclient.cpp0000644000175000017500000000026212653650156020675 0ustar ellertellert#include "soapH.h" #include "r.nsmap" int main() { int d; soap_call_r__roll(soap_new(), "http://www.cs.fsu.edu/~engelen/rolllitserver.cgi", "", d); return !printf("%d\n", d); } gsoap-2.8.28/gsoap/samples/roll/README.txt0000644000175000017500000000103112653650156017513 0ustar ellertellertThis directory contains a "one-liner" service: gSOAP Web service and client applications that are only one line long (not counting the usual #includes). The oneliners are small, but they can do a number of useful things. The complete list of oneliners is: samples/gmt return current time in GMT samples/hello "Hello World!" samples/roll rolling a die You can use the client programs right away after compilation since they connect to our server. To run the server examples you have to install them as CGI applications. gsoap-2.8.28/gsoap/samples/roll/Makefile.am0000644000175000017500000000117512653650156020062 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 noinst_PROGRAMS = rollclient rollserver SOAPHEADER = roll.h include ../Makefile.defines include ../Makefile.cpp_rules SOAP_NS = r.nsmap r.wsdl rollclient_SOURCES = rollclient.cpp $(SOAPHEADER) $(SOAP_CPP_CLIENT) rollclient_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) rollserver_SOURCES = rollserver.cpp $(SOAPHEADER) $(SOAP_CPP_SERVER) rollserver_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) gsoap-2.8.28/gsoap/samples/roll/roll.h0000644000175000017500000000001712653650156017141 0ustar ellertellertr__roll(int&); gsoap-2.8.28/gsoap/samples/roll/rollserver.cpp0000644000175000017500000000026012653650156020723 0ustar ellertellert#include "soapH.h" #include "r.nsmap" int main() { return soap_serve(soap_new()); } int r__roll(struct soap *soap, int &r) { srand(time(0)); r = rand()%6+1; return SOAP_OK; } gsoap-2.8.28/gsoap/samples/calc_vs2005/0000755000175000017500000000000012653650154016771 5ustar ellertellertgsoap-2.8.28/gsoap/samples/calc_vs2005/calc_vs2005.sln0000644000175000017500000000160712653650154021434 0ustar ellertellert Microsoft Visual Studio Solution File, Format Version 9.00 # Visual C++ Express 2005 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "calc_vs2005", "calc_vs2005\calc_vs2005.vcproj", "{61B4085F-9AF4-44D0-9489-3CD86101AB83}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Release|Win32 = Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {61B4085F-9AF4-44D0-9489-3CD86101AB83}.Debug|Win32.ActiveCfg = Debug|Win32 {61B4085F-9AF4-44D0-9489-3CD86101AB83}.Debug|Win32.Build.0 = Debug|Win32 {61B4085F-9AF4-44D0-9489-3CD86101AB83}.Release|Win32.ActiveCfg = Release|Win32 {61B4085F-9AF4-44D0-9489-3CD86101AB83}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal gsoap-2.8.28/gsoap/samples/calc_vs2005/calc_vs2005/0000755000175000017500000000000012654077574020724 5ustar ellertellertgsoap-2.8.28/gsoap/samples/calc_vs2005/calc_vs2005/calc_vs2005.vcproj0000644000175000017500000001163012653650154024061 0ustar ellertellert gsoap-2.8.28/gsoap/samples/calc_vs2005/calc_vs2005/soapC.cpp0000644000175000017500000027420212653650154022472 0ustar ellertellert/* soapC.cpp Generated by gSOAP 2.8.28 from calc.h gSOAP XML Web services tools Copyright (C) 2000-2016, Robert van Engelen, Genivia Inc. All Rights Reserved. The soapcpp2 tool and its generated software are released under the GPL. This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #if defined(__BORLANDC__) #pragma option push -w-8060 #pragma option push -w-8004 #endif #include "soapH.h" SOAP_SOURCE_STAMP("@(#) soapC.cpp ver 2.8.28 2016-01-31 15:56:10 GMT") #ifndef WITH_NOGLOBAL SOAP_FMAC3 int SOAP_FMAC4 soap_getheader(struct soap *soap) { soap->part = SOAP_IN_HEADER; soap->header = soap_in_SOAP_ENV__Header(soap, "SOAP-ENV:Header", soap->header, NULL); soap->part = SOAP_END_HEADER; return soap->header == NULL; } SOAP_FMAC3 int SOAP_FMAC4 soap_putheader(struct soap *soap) { if (soap->version && soap->header) { soap->part = SOAP_IN_HEADER; if (soap_out_SOAP_ENV__Header(soap, "SOAP-ENV:Header", 0, soap->header, NULL)) return soap->error; soap->part = SOAP_END_HEADER; } return SOAP_OK; } SOAP_FMAC3 void SOAP_FMAC4 soap_serializeheader(struct soap *soap) { if (soap->version && soap->header) soap_serialize_SOAP_ENV__Header(soap, soap->header); } SOAP_FMAC3 void SOAP_FMAC4 soap_header(struct soap *soap) { if (soap->header == NULL) { if ((soap->header = soap_new_SOAP_ENV__Header(soap))) soap_default_SOAP_ENV__Header(soap, soap->header); } } SOAP_FMAC3 void SOAP_FMAC4 soap_fault(struct soap *soap) { if (soap->fault == NULL) { soap->fault = soap_new_SOAP_ENV__Fault(soap); if (soap->fault == NULL) return; soap_default_SOAP_ENV__Fault(soap, soap->fault); } if (soap->version == 2 && !soap->fault->SOAP_ENV__Code) { soap->fault->SOAP_ENV__Code = soap_new_SOAP_ENV__Code(soap); soap_default_SOAP_ENV__Code(soap, soap->fault->SOAP_ENV__Code); } if (soap->version == 2 && !soap->fault->SOAP_ENV__Reason) { soap->fault->SOAP_ENV__Reason = soap_new_SOAP_ENV__Reason(soap); soap_default_SOAP_ENV__Reason(soap, soap->fault->SOAP_ENV__Reason); } } SOAP_FMAC3 void SOAP_FMAC4 soap_serializefault(struct soap *soap) { soap_fault(soap); if (soap->fault) soap_serialize_SOAP_ENV__Fault(soap, soap->fault); } SOAP_FMAC3 int SOAP_FMAC4 soap_putfault(struct soap *soap) { if (soap->fault) return soap_put_SOAP_ENV__Fault(soap, soap->fault, "SOAP-ENV:Fault", NULL); return SOAP_OK; } SOAP_FMAC3 int SOAP_FMAC4 soap_getfault(struct soap *soap) { return (soap->fault = soap_get_SOAP_ENV__Fault(soap, NULL, "SOAP-ENV:Fault", NULL)) == NULL; } SOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultcode(struct soap *soap) { soap_fault(soap); if (soap->version == 2 && soap->fault->SOAP_ENV__Code) return (const char**)(void*)&soap->fault->SOAP_ENV__Code->SOAP_ENV__Value; return (const char**)(void*)&soap->fault->faultcode; } SOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultsubcode(struct soap *soap) { soap_fault(soap); if (soap->version == 2) { if (soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode == NULL) { soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode = soap_new_SOAP_ENV__Code(soap); soap_default_SOAP_ENV__Code(soap, soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode); } return (const char**)(void*)&soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode->SOAP_ENV__Value; } return (const char**)(void*)&soap->fault->faultcode; } SOAP_FMAC3 const char * SOAP_FMAC4 soap_check_faultsubcode(struct soap *soap) { soap_fault(soap); if (soap->version == 2) { if (soap->fault->SOAP_ENV__Code && soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode) return soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode->SOAP_ENV__Value; return NULL; } return soap->fault->faultcode; } SOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultstring(struct soap *soap) { soap_fault(soap); if (soap->version == 2) return (const char**)(void*)&soap->fault->SOAP_ENV__Reason->SOAP_ENV__Text; return (const char**)(void*)&soap->fault->faultstring; } SOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultdetail(struct soap *soap) { soap_fault(soap); if (soap->version == 2) { if (soap->fault->SOAP_ENV__Detail == NULL) { soap->fault->SOAP_ENV__Detail = soap_new_SOAP_ENV__Detail(soap); soap_default_SOAP_ENV__Detail(soap, soap->fault->SOAP_ENV__Detail); } return (const char**)(void*)&soap->fault->SOAP_ENV__Detail->__any; } if (soap->fault->detail == NULL) { soap->fault->detail = soap_new_SOAP_ENV__Detail(soap); soap_default_SOAP_ENV__Detail(soap, soap->fault->detail); } return (const char**)(void*)&soap->fault->detail->__any; } SOAP_FMAC3 const char * SOAP_FMAC4 soap_check_faultdetail(struct soap *soap) { soap_fault(soap); if (soap->version == 2 && soap->fault->SOAP_ENV__Detail) return soap->fault->SOAP_ENV__Detail->__any; if (soap->fault->detail) return soap->fault->detail->__any; return NULL; } #endif #ifndef WITH_NOIDREF SOAP_FMAC3 int SOAP_FMAC4 soap_getindependent(struct soap *soap) { int t; if (soap->version == 1) { for (;;) { if (!soap_getelement(soap, &t)) if ((soap->error && soap->error != SOAP_TAG_MISMATCH) || soap_ignore_element(soap)) break; } } if (soap->error == SOAP_NO_TAG || soap->error == SOAP_EOF) soap->error = SOAP_OK; return soap->error; } #endif #ifdef __cplusplus extern "C" { #endif SOAP_FMAC3 void * SOAP_FMAC4 soap_getelement(struct soap *soap, int *type) { (void)type; if (soap_peek_element(soap)) return NULL; #ifndef WITH_NOIDREF if (!*soap->id || !(*type = soap_lookup_type(soap, soap->id))) *type = soap_lookup_type(soap, soap->href); switch (*type) { case SOAP_TYPE_byte: return soap_in_byte(soap, NULL, NULL, "xsd:byte"); case SOAP_TYPE_int: return soap_in_int(soap, NULL, NULL, "xsd:int"); case SOAP_TYPE_double: return soap_in_double(soap, NULL, NULL, "xsd:double"); case SOAP_TYPE_ns__pow: return soap_in_ns__pow(soap, NULL, NULL, "ns:pow"); case SOAP_TYPE_ns__powResponse: return soap_in_ns__powResponse(soap, NULL, NULL, "ns:powResponse"); case SOAP_TYPE_ns__div: return soap_in_ns__div(soap, NULL, NULL, "ns:div"); case SOAP_TYPE_ns__divResponse: return soap_in_ns__divResponse(soap, NULL, NULL, "ns:divResponse"); case SOAP_TYPE_ns__mul: return soap_in_ns__mul(soap, NULL, NULL, "ns:mul"); case SOAP_TYPE_ns__mulResponse: return soap_in_ns__mulResponse(soap, NULL, NULL, "ns:mulResponse"); case SOAP_TYPE_ns__sub: return soap_in_ns__sub(soap, NULL, NULL, "ns:sub"); case SOAP_TYPE_ns__subResponse: return soap_in_ns__subResponse(soap, NULL, NULL, "ns:subResponse"); case SOAP_TYPE_ns__add: return soap_in_ns__add(soap, NULL, NULL, "ns:add"); case SOAP_TYPE_ns__addResponse: return soap_in_ns__addResponse(soap, NULL, NULL, "ns:addResponse"); case SOAP_TYPE_PointerTodouble: return soap_in_PointerTodouble(soap, NULL, NULL, "xsd:double"); case SOAP_TYPE__QName: { char **s; s = soap_in__QName(soap, NULL, NULL, "xsd:QName"); return s ? *s : NULL; } case SOAP_TYPE_string: { char **s; s = soap_in_string(soap, NULL, NULL, "xsd:string"); return s ? *s : NULL; } default: #else *type = 0; #endif { const char *t = soap->type; if (!*t) t = soap->tag; if (!soap_match_tag(soap, t, "xsd:byte")) { *type = SOAP_TYPE_byte; return soap_in_byte(soap, NULL, NULL, NULL); } if (!soap_match_tag(soap, t, "xsd:int")) { *type = SOAP_TYPE_int; return soap_in_int(soap, NULL, NULL, NULL); } if (!soap_match_tag(soap, t, "xsd:double")) { *type = SOAP_TYPE_double; return soap_in_double(soap, NULL, NULL, NULL); } if (!soap_match_tag(soap, t, "ns:pow")) { *type = SOAP_TYPE_ns__pow; return soap_in_ns__pow(soap, NULL, NULL, NULL); } if (!soap_match_tag(soap, t, "ns:powResponse")) { *type = SOAP_TYPE_ns__powResponse; return soap_in_ns__powResponse(soap, NULL, NULL, NULL); } if (!soap_match_tag(soap, t, "ns:div")) { *type = SOAP_TYPE_ns__div; return soap_in_ns__div(soap, NULL, NULL, NULL); } if (!soap_match_tag(soap, t, "ns:divResponse")) { *type = SOAP_TYPE_ns__divResponse; return soap_in_ns__divResponse(soap, NULL, NULL, NULL); } if (!soap_match_tag(soap, t, "ns:mul")) { *type = SOAP_TYPE_ns__mul; return soap_in_ns__mul(soap, NULL, NULL, NULL); } if (!soap_match_tag(soap, t, "ns:mulResponse")) { *type = SOAP_TYPE_ns__mulResponse; return soap_in_ns__mulResponse(soap, NULL, NULL, NULL); } if (!soap_match_tag(soap, t, "ns:sub")) { *type = SOAP_TYPE_ns__sub; return soap_in_ns__sub(soap, NULL, NULL, NULL); } if (!soap_match_tag(soap, t, "ns:subResponse")) { *type = SOAP_TYPE_ns__subResponse; return soap_in_ns__subResponse(soap, NULL, NULL, NULL); } if (!soap_match_tag(soap, t, "ns:add")) { *type = SOAP_TYPE_ns__add; return soap_in_ns__add(soap, NULL, NULL, NULL); } if (!soap_match_tag(soap, t, "ns:addResponse")) { *type = SOAP_TYPE_ns__addResponse; return soap_in_ns__addResponse(soap, NULL, NULL, NULL); } if (!soap_match_tag(soap, t, "xsd:QName")) { char **s; *type = SOAP_TYPE__QName; s = soap_in__QName(soap, NULL, NULL, NULL); return s ? *s : NULL; } if (!soap_match_tag(soap, t, "xsd:string")) { char **s; *type = SOAP_TYPE_string; s = soap_in_string(soap, NULL, NULL, NULL); return s ? *s : NULL; } t = soap->tag; #ifndef WITH_NOIDREF } #endif } soap->error = SOAP_TAG_MISMATCH; return NULL; } #ifdef __cplusplus } #endif SOAP_FMAC3 int SOAP_FMAC4 soap_ignore_element(struct soap *soap) { if (!soap_peek_element(soap)) { int t; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unexpected element '%s' in input (level = %u, %d)\n", soap->tag, soap->level, soap->body)); if (soap->mustUnderstand && !soap->other) return soap->error = SOAP_MUSTUNDERSTAND; if (((soap->mode & SOAP_XML_STRICT) && soap->part != SOAP_IN_HEADER) || !soap_match_tag(soap, soap->tag, "SOAP-ENV:")) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "REJECTING element '%s'\n", soap->tag)); return soap->error = SOAP_TAG_MISMATCH; } if (!*soap->id || !soap_getelement(soap, &t)) { soap->peeked = 0; if (soap->fignore) soap->error = soap->fignore(soap, soap->tag); else soap->error = SOAP_OK; DBGLOG(TEST, if (!soap->error) SOAP_MESSAGE(fdebug, "IGNORING element '%s'\n", soap->tag)); if (!soap->error && soap->body) { soap->level++; while (!soap_ignore_element(soap)) ; if (soap->error == SOAP_NO_TAG) soap->error = soap_element_end_in(soap, NULL); } } } return soap->error; } #ifndef WITH_NOIDREF SOAP_FMAC3 int SOAP_FMAC4 soap_putindependent(struct soap *soap) { int i; struct soap_plist *pp; if (soap->version == 1 && soap->encodingStyle && !(soap->mode & (SOAP_XML_TREE | SOAP_XML_GRAPH))) for (i = 0; i < SOAP_PTRHASH; i++) for (pp = soap->pht[i]; pp; pp = pp->next) if (pp->mark1 == 2 || pp->mark2 == 2) if (soap_putelement(soap, pp->ptr, SOAP_MULTIREFTAG, pp->id, pp->type)) return soap->error; return SOAP_OK; } #endif #ifdef __cplusplus extern "C" { #endif SOAP_FMAC3 int SOAP_FMAC4 soap_putelement(struct soap *soap, const void *ptr, const char *tag, int id, int type) { (void)tag; switch (type) { case SOAP_TYPE_byte: return soap_out_byte(soap, tag, id, (const char *)ptr, "xsd:byte"); case SOAP_TYPE_int: return soap_out_int(soap, tag, id, (const int *)ptr, "xsd:int"); case SOAP_TYPE_double: return soap_out_double(soap, tag, id, (const double *)ptr, "xsd:double"); case SOAP_TYPE_ns__pow: return soap_out_ns__pow(soap, tag, id, (const struct ns__pow *)ptr, "ns:pow"); case SOAP_TYPE_ns__powResponse: return soap_out_ns__powResponse(soap, tag, id, (const struct ns__powResponse *)ptr, "ns:powResponse"); case SOAP_TYPE_ns__div: return soap_out_ns__div(soap, tag, id, (const struct ns__div *)ptr, "ns:div"); case SOAP_TYPE_ns__divResponse: return soap_out_ns__divResponse(soap, tag, id, (const struct ns__divResponse *)ptr, "ns:divResponse"); case SOAP_TYPE_ns__mul: return soap_out_ns__mul(soap, tag, id, (const struct ns__mul *)ptr, "ns:mul"); case SOAP_TYPE_ns__mulResponse: return soap_out_ns__mulResponse(soap, tag, id, (const struct ns__mulResponse *)ptr, "ns:mulResponse"); case SOAP_TYPE_ns__sub: return soap_out_ns__sub(soap, tag, id, (const struct ns__sub *)ptr, "ns:sub"); case SOAP_TYPE_ns__subResponse: return soap_out_ns__subResponse(soap, tag, id, (const struct ns__subResponse *)ptr, "ns:subResponse"); case SOAP_TYPE_ns__add: return soap_out_ns__add(soap, tag, id, (const struct ns__add *)ptr, "ns:add"); case SOAP_TYPE_ns__addResponse: return soap_out_ns__addResponse(soap, tag, id, (const struct ns__addResponse *)ptr, "ns:addResponse"); case SOAP_TYPE_PointerTodouble: return soap_out_PointerTodouble(soap, tag, id, (double *const*)ptr, "xsd:double"); case SOAP_TYPE__QName: return soap_out_string(soap, tag, id, (char*const*)(void*)&ptr, "xsd:QName"); case SOAP_TYPE_string: return soap_out_string(soap, tag, id, (char*const*)(void*)&ptr, "xsd:string"); } return SOAP_OK; } #ifdef __cplusplus } #endif #ifndef WITH_NOIDREF #ifdef __cplusplus extern "C" { #endif SOAP_FMAC3 void SOAP_FMAC4 soap_markelement(struct soap *soap, const void *ptr, int type) { (void)soap; (void)ptr; (void)type; /* appease -Wall -Werror */ switch (type) { case SOAP_TYPE_ns__pow: soap_serialize_ns__pow(soap, (const struct ns__pow *)ptr); break; case SOAP_TYPE_ns__powResponse: soap_serialize_ns__powResponse(soap, (const struct ns__powResponse *)ptr); break; case SOAP_TYPE_ns__div: soap_serialize_ns__div(soap, (const struct ns__div *)ptr); break; case SOAP_TYPE_ns__divResponse: soap_serialize_ns__divResponse(soap, (const struct ns__divResponse *)ptr); break; case SOAP_TYPE_ns__mul: soap_serialize_ns__mul(soap, (const struct ns__mul *)ptr); break; case SOAP_TYPE_ns__mulResponse: soap_serialize_ns__mulResponse(soap, (const struct ns__mulResponse *)ptr); break; case SOAP_TYPE_ns__sub: soap_serialize_ns__sub(soap, (const struct ns__sub *)ptr); break; case SOAP_TYPE_ns__subResponse: soap_serialize_ns__subResponse(soap, (const struct ns__subResponse *)ptr); break; case SOAP_TYPE_ns__add: soap_serialize_ns__add(soap, (const struct ns__add *)ptr); break; case SOAP_TYPE_ns__addResponse: soap_serialize_ns__addResponse(soap, (const struct ns__addResponse *)ptr); break; case SOAP_TYPE_PointerTodouble: soap_serialize_PointerTodouble(soap, (double *const*)ptr); break; case SOAP_TYPE__QName: soap_serialize_string(soap, (char*const*)(void*)&ptr); break; case SOAP_TYPE_string: soap_serialize_string(soap, (char*const*)(void*)&ptr); break; } } #ifdef __cplusplus } #endif #endif SOAP_FMAC3 void * SOAP_FMAC4 soap_instantiate(struct soap *soap, int t, const char *type, const char *arrayType, size_t *n) { (void)type; switch (t) { case SOAP_TYPE_ns__addResponse: return (void*)soap_instantiate_ns__addResponse(soap, -1, type, arrayType, n); case SOAP_TYPE_ns__add: return (void*)soap_instantiate_ns__add(soap, -1, type, arrayType, n); case SOAP_TYPE_ns__subResponse: return (void*)soap_instantiate_ns__subResponse(soap, -1, type, arrayType, n); case SOAP_TYPE_ns__sub: return (void*)soap_instantiate_ns__sub(soap, -1, type, arrayType, n); case SOAP_TYPE_ns__mulResponse: return (void*)soap_instantiate_ns__mulResponse(soap, -1, type, arrayType, n); case SOAP_TYPE_ns__mul: return (void*)soap_instantiate_ns__mul(soap, -1, type, arrayType, n); case SOAP_TYPE_ns__divResponse: return (void*)soap_instantiate_ns__divResponse(soap, -1, type, arrayType, n); case SOAP_TYPE_ns__div: return (void*)soap_instantiate_ns__div(soap, -1, type, arrayType, n); case SOAP_TYPE_ns__powResponse: return (void*)soap_instantiate_ns__powResponse(soap, -1, type, arrayType, n); case SOAP_TYPE_ns__pow: return (void*)soap_instantiate_ns__pow(soap, -1, type, arrayType, n); #ifndef WITH_NOGLOBAL case SOAP_TYPE_SOAP_ENV__Header: return (void*)soap_instantiate_SOAP_ENV__Header(soap, -1, type, arrayType, n); #endif #ifndef WITH_NOGLOBAL case SOAP_TYPE_SOAP_ENV__Code: return (void*)soap_instantiate_SOAP_ENV__Code(soap, -1, type, arrayType, n); #endif #ifndef WITH_NOGLOBAL case SOAP_TYPE_SOAP_ENV__Detail: return (void*)soap_instantiate_SOAP_ENV__Detail(soap, -1, type, arrayType, n); #endif #ifndef WITH_NOGLOBAL case SOAP_TYPE_SOAP_ENV__Reason: return (void*)soap_instantiate_SOAP_ENV__Reason(soap, -1, type, arrayType, n); #endif #ifndef WITH_NOGLOBAL case SOAP_TYPE_SOAP_ENV__Fault: return (void*)soap_instantiate_SOAP_ENV__Fault(soap, -1, type, arrayType, n); #endif } return NULL; } SOAP_FMAC3 int SOAP_FMAC4 soap_fdelete(struct soap_clist *p) { switch (p->type) { case SOAP_TYPE_ns__addResponse: if (p->size < 0) SOAP_DELETE(static_cast(p->ptr)); else SOAP_DELETE_ARRAY(static_cast(p->ptr)); break; case SOAP_TYPE_ns__add: if (p->size < 0) SOAP_DELETE(static_cast(p->ptr)); else SOAP_DELETE_ARRAY(static_cast(p->ptr)); break; case SOAP_TYPE_ns__subResponse: if (p->size < 0) SOAP_DELETE(static_cast(p->ptr)); else SOAP_DELETE_ARRAY(static_cast(p->ptr)); break; case SOAP_TYPE_ns__sub: if (p->size < 0) SOAP_DELETE(static_cast(p->ptr)); else SOAP_DELETE_ARRAY(static_cast(p->ptr)); break; case SOAP_TYPE_ns__mulResponse: if (p->size < 0) SOAP_DELETE(static_cast(p->ptr)); else SOAP_DELETE_ARRAY(static_cast(p->ptr)); break; case SOAP_TYPE_ns__mul: if (p->size < 0) SOAP_DELETE(static_cast(p->ptr)); else SOAP_DELETE_ARRAY(static_cast(p->ptr)); break; case SOAP_TYPE_ns__divResponse: if (p->size < 0) SOAP_DELETE(static_cast(p->ptr)); else SOAP_DELETE_ARRAY(static_cast(p->ptr)); break; case SOAP_TYPE_ns__div: if (p->size < 0) SOAP_DELETE(static_cast(p->ptr)); else SOAP_DELETE_ARRAY(static_cast(p->ptr)); break; case SOAP_TYPE_ns__powResponse: if (p->size < 0) SOAP_DELETE(static_cast(p->ptr)); else SOAP_DELETE_ARRAY(static_cast(p->ptr)); break; case SOAP_TYPE_ns__pow: if (p->size < 0) SOAP_DELETE(static_cast(p->ptr)); else SOAP_DELETE_ARRAY(static_cast(p->ptr)); break; #ifndef WITH_NOGLOBAL case SOAP_TYPE_SOAP_ENV__Header: if (p->size < 0) SOAP_DELETE(static_cast(p->ptr)); else SOAP_DELETE_ARRAY(static_cast(p->ptr)); break; #endif #ifndef WITH_NOGLOBAL case SOAP_TYPE_SOAP_ENV__Code: if (p->size < 0) SOAP_DELETE(static_cast(p->ptr)); else SOAP_DELETE_ARRAY(static_cast(p->ptr)); break; #endif #ifndef WITH_NOGLOBAL case SOAP_TYPE_SOAP_ENV__Detail: if (p->size < 0) SOAP_DELETE(static_cast(p->ptr)); else SOAP_DELETE_ARRAY(static_cast(p->ptr)); break; #endif #ifndef WITH_NOGLOBAL case SOAP_TYPE_SOAP_ENV__Reason: if (p->size < 0) SOAP_DELETE(static_cast(p->ptr)); else SOAP_DELETE_ARRAY(static_cast(p->ptr)); break; #endif #ifndef WITH_NOGLOBAL case SOAP_TYPE_SOAP_ENV__Fault: if (p->size < 0) SOAP_DELETE(static_cast(p->ptr)); else SOAP_DELETE_ARRAY(static_cast(p->ptr)); break; #endif default: return SOAP_ERR; } return SOAP_OK; } #ifdef WIN32 #pragma warning(push) // do not warn on switch w/o cases #pragma warning(disable:4065) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_fbase(int t, int b) { do { switch (t) { default: return 0; } } while (t != b); return 1; } #ifdef WIN32 #pragma warning(pop) #endif #ifndef WITH_NOIDREF #ifdef WIN32 #pragma warning(push) // do not warn on switch w/o cases #pragma warning(disable:4065) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_finsert(struct soap *soap, int t, int tt, void *p, size_t index, const void *q, void **x) { (void)soap; (void)t; (void)p; (void)index; (void)q; (void)x; /* appease -Wall -Werror */ switch (tt) { case SOAP_TYPE_ns__addResponse: DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy struct ns__addResponse type=%d location=%p object=%p\n", t, p, q)); *(struct ns__addResponse*)p = *(struct ns__addResponse*)q; break; case SOAP_TYPE_ns__add: DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy struct ns__add type=%d location=%p object=%p\n", t, p, q)); *(struct ns__add*)p = *(struct ns__add*)q; break; case SOAP_TYPE_ns__subResponse: DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy struct ns__subResponse type=%d location=%p object=%p\n", t, p, q)); *(struct ns__subResponse*)p = *(struct ns__subResponse*)q; break; case SOAP_TYPE_ns__sub: DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy struct ns__sub type=%d location=%p object=%p\n", t, p, q)); *(struct ns__sub*)p = *(struct ns__sub*)q; break; case SOAP_TYPE_ns__mulResponse: DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy struct ns__mulResponse type=%d location=%p object=%p\n", t, p, q)); *(struct ns__mulResponse*)p = *(struct ns__mulResponse*)q; break; case SOAP_TYPE_ns__mul: DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy struct ns__mul type=%d location=%p object=%p\n", t, p, q)); *(struct ns__mul*)p = *(struct ns__mul*)q; break; case SOAP_TYPE_ns__divResponse: DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy struct ns__divResponse type=%d location=%p object=%p\n", t, p, q)); *(struct ns__divResponse*)p = *(struct ns__divResponse*)q; break; case SOAP_TYPE_ns__div: DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy struct ns__div type=%d location=%p object=%p\n", t, p, q)); *(struct ns__div*)p = *(struct ns__div*)q; break; case SOAP_TYPE_ns__powResponse: DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy struct ns__powResponse type=%d location=%p object=%p\n", t, p, q)); *(struct ns__powResponse*)p = *(struct ns__powResponse*)q; break; case SOAP_TYPE_ns__pow: DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy struct ns__pow type=%d location=%p object=%p\n", t, p, q)); *(struct ns__pow*)p = *(struct ns__pow*)q; break; #ifndef WITH_NOGLOBAL case SOAP_TYPE_SOAP_ENV__Header: DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy struct SOAP_ENV__Header type=%d location=%p object=%p\n", t, p, q)); *(struct SOAP_ENV__Header*)p = *(struct SOAP_ENV__Header*)q; break; #endif #ifndef WITH_NOGLOBAL case SOAP_TYPE_SOAP_ENV__Code: DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy struct SOAP_ENV__Code type=%d location=%p object=%p\n", t, p, q)); *(struct SOAP_ENV__Code*)p = *(struct SOAP_ENV__Code*)q; break; #endif #ifndef WITH_NOGLOBAL case SOAP_TYPE_SOAP_ENV__Detail: DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy struct SOAP_ENV__Detail type=%d location=%p object=%p\n", t, p, q)); *(struct SOAP_ENV__Detail*)p = *(struct SOAP_ENV__Detail*)q; break; #endif #ifndef WITH_NOGLOBAL case SOAP_TYPE_SOAP_ENV__Reason: DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy struct SOAP_ENV__Reason type=%d location=%p object=%p\n", t, p, q)); *(struct SOAP_ENV__Reason*)p = *(struct SOAP_ENV__Reason*)q; break; #endif #ifndef WITH_NOGLOBAL case SOAP_TYPE_SOAP_ENV__Fault: DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy struct SOAP_ENV__Fault type=%d location=%p object=%p\n", t, p, q)); *(struct SOAP_ENV__Fault*)p = *(struct SOAP_ENV__Fault*)q; break; #endif default: DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not insert type = %d in %d\n", t, tt)); } } #ifdef WIN32 #pragma warning(pop) #endif #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_byte(struct soap *soap, char *a) { (void)soap; /* appease -Wall -Werror */ #ifdef SOAP_DEFAULT_byte *a = SOAP_DEFAULT_byte; #else *a = (char)0; #endif } SOAP_FMAC3 int SOAP_FMAC4 soap_out_byte(struct soap *soap, const char *tag, int id, const char *a, const char *type) { return soap_outbyte(soap, tag, id, a, type, SOAP_TYPE_byte); } SOAP_FMAC3 char * SOAP_FMAC4 soap_in_byte(struct soap *soap, const char *tag, char *a, const char *type) { a = soap_inbyte(soap, tag, a, type, SOAP_TYPE_byte); return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_byte(struct soap *soap, const char *a, const char *tag, const char *type) { if (soap_out_byte(soap, tag?tag:"byte", -2, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 char * SOAP_FMAC4 soap_get_byte(struct soap *soap, char *p, const char *tag, const char *type) { if ((p = soap_in_byte(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC3 void SOAP_FMAC4 soap_default_int(struct soap *soap, int *a) { (void)soap; /* appease -Wall -Werror */ #ifdef SOAP_DEFAULT_int *a = SOAP_DEFAULT_int; #else *a = (int)0; #endif } SOAP_FMAC3 int SOAP_FMAC4 soap_out_int(struct soap *soap, const char *tag, int id, const int *a, const char *type) { return soap_outint(soap, tag, id, a, type, SOAP_TYPE_int); } SOAP_FMAC3 int * SOAP_FMAC4 soap_in_int(struct soap *soap, const char *tag, int *a, const char *type) { a = soap_inint(soap, tag, a, type, SOAP_TYPE_int); return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_int(struct soap *soap, const int *a, const char *tag, const char *type) { if (soap_out_int(soap, tag?tag:"int", -2, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 int * SOAP_FMAC4 soap_get_int(struct soap *soap, int *p, const char *tag, const char *type) { if ((p = soap_in_int(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC3 void SOAP_FMAC4 soap_default_double(struct soap *soap, double *a) { (void)soap; /* appease -Wall -Werror */ #ifdef SOAP_DEFAULT_double *a = SOAP_DEFAULT_double; #else *a = (double)0; #endif } SOAP_FMAC3 int SOAP_FMAC4 soap_out_double(struct soap *soap, const char *tag, int id, const double *a, const char *type) { return soap_outdouble(soap, tag, id, a, type, SOAP_TYPE_double); } SOAP_FMAC3 double * SOAP_FMAC4 soap_in_double(struct soap *soap, const char *tag, double *a, const char *type) { a = soap_indouble(soap, tag, a, type, SOAP_TYPE_double); return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_double(struct soap *soap, const double *a, const char *tag, const char *type) { if (soap_out_double(soap, tag?tag:"double", -2, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 double * SOAP_FMAC4 soap_get_double(struct soap *soap, double *p, const char *tag, const char *type) { if ((p = soap_in_double(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } #ifndef WITH_NOGLOBAL SOAP_ENV__Fault::SOAP_ENV__Fault() { soap_default_SOAP_ENV__Fault(NULL, this); } SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Fault(struct soap *soap, struct SOAP_ENV__Fault *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_default__QName(soap, &a->faultcode); soap_default_string(soap, &a->faultstring); soap_default_string(soap, &a->faultactor); a->detail = NULL; a->SOAP_ENV__Code = NULL; a->SOAP_ENV__Reason = NULL; soap_default_string(soap, &a->SOAP_ENV__Node); soap_default_string(soap, &a->SOAP_ENV__Role); a->SOAP_ENV__Detail = NULL; } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Fault(struct soap *soap, const struct SOAP_ENV__Fault *a) { (void)soap; (void)a; /* appease -Wall -Werror */ #ifndef WITH_NOIDREF soap_serialize__QName(soap, (char*const*)&a->faultcode); soap_serialize_string(soap, (char*const*)&a->faultstring); soap_serialize_string(soap, (char*const*)&a->faultactor); soap_serialize_PointerToSOAP_ENV__Detail(soap, &a->detail); soap_serialize_PointerToSOAP_ENV__Code(soap, &a->SOAP_ENV__Code); soap_serialize_PointerToSOAP_ENV__Reason(soap, &a->SOAP_ENV__Reason); soap_serialize_string(soap, (char*const*)&a->SOAP_ENV__Node); soap_serialize_string(soap, (char*const*)&a->SOAP_ENV__Role); soap_serialize_PointerToSOAP_ENV__Detail(soap, &a->SOAP_ENV__Detail); #endif } SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Fault(struct soap *soap, const char *tag, int id, const struct SOAP_ENV__Fault *a, const char *type) { const char *soap_tmp_faultcode = soap_QName2s(soap, a->faultcode); (void)soap; (void)tag; (void)id; (void)a; (void)type; /* appease -Wall -Werror */ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_SOAP_ENV__Fault), type)) return soap->error; if (soap_out__QName(soap, "faultcode", -1, (char*const*)(void*)&soap_tmp_faultcode, "")) return soap->error; if (soap_out_string(soap, "faultstring", -1, (char*const*)&a->faultstring, "")) return soap->error; if (soap_out_string(soap, "faultactor", -1, (char*const*)&a->faultactor, "")) return soap->error; if (soap_out_PointerToSOAP_ENV__Detail(soap, "detail", -1, &a->detail, "")) return soap->error; if (soap_out_PointerToSOAP_ENV__Code(soap, "SOAP-ENV:Code", -1, &a->SOAP_ENV__Code, "")) return soap->error; if (soap_out_PointerToSOAP_ENV__Reason(soap, "SOAP-ENV:Reason", -1, &a->SOAP_ENV__Reason, "")) return soap->error; if (soap_out_string(soap, "SOAP-ENV:Node", -1, (char*const*)&a->SOAP_ENV__Node, "")) return soap->error; if (soap_out_string(soap, "SOAP-ENV:Role", -1, (char*const*)&a->SOAP_ENV__Role, "")) return soap->error; if (soap_out_PointerToSOAP_ENV__Detail(soap, "SOAP-ENV:Detail", -1, &a->SOAP_ENV__Detail, "")) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct SOAP_ENV__Fault * SOAP_FMAC4 soap_in_SOAP_ENV__Fault(struct soap *soap, const char *tag, struct SOAP_ENV__Fault *a, const char *type) { size_t soap_flag_faultcode = 1; size_t soap_flag_faultstring = 1; size_t soap_flag_faultactor = 1; size_t soap_flag_detail = 1; size_t soap_flag_SOAP_ENV__Code = 1; size_t soap_flag_SOAP_ENV__Reason = 1; size_t soap_flag_SOAP_ENV__Node = 1; size_t soap_flag_SOAP_ENV__Role = 1; size_t soap_flag_SOAP_ENV__Detail = 1; if (soap_element_begin_in(soap, tag, 0, type)) return NULL; a = (struct SOAP_ENV__Fault *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_SOAP_ENV__Fault, sizeof(struct SOAP_ENV__Fault), NULL, NULL, NULL, NULL); if (!a) return NULL; soap_default_SOAP_ENV__Fault(soap, a); if (soap->body && !*soap->href) { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_faultcode && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) if (soap_in__QName(soap, "faultcode", (char**)&a->faultcode, "")) { soap_flag_faultcode--; continue; } if (soap_flag_faultstring && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) if (soap_in_string(soap, "faultstring", (char**)&a->faultstring, "xsd:string")) { soap_flag_faultstring--; continue; } if (soap_flag_faultactor && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) if (soap_in_string(soap, "faultactor", (char**)&a->faultactor, "xsd:string")) { soap_flag_faultactor--; continue; } if (soap_flag_detail && soap->error == SOAP_TAG_MISMATCH) if (soap_in_PointerToSOAP_ENV__Detail(soap, "detail", &a->detail, "")) { soap_flag_detail--; continue; } if (soap_flag_SOAP_ENV__Code && soap->error == SOAP_TAG_MISMATCH) if (soap_in_PointerToSOAP_ENV__Code(soap, "SOAP-ENV:Code", &a->SOAP_ENV__Code, "")) { soap_flag_SOAP_ENV__Code--; continue; } if (soap_flag_SOAP_ENV__Reason && soap->error == SOAP_TAG_MISMATCH) if (soap_in_PointerToSOAP_ENV__Reason(soap, "SOAP-ENV:Reason", &a->SOAP_ENV__Reason, "")) { soap_flag_SOAP_ENV__Reason--; continue; } if (soap_flag_SOAP_ENV__Node && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) if (soap_in_string(soap, "SOAP-ENV:Node", (char**)&a->SOAP_ENV__Node, "xsd:string")) { soap_flag_SOAP_ENV__Node--; continue; } if (soap_flag_SOAP_ENV__Role && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) if (soap_in_string(soap, "SOAP-ENV:Role", (char**)&a->SOAP_ENV__Role, "xsd:string")) { soap_flag_SOAP_ENV__Role--; continue; } if (soap_flag_SOAP_ENV__Detail && soap->error == SOAP_TAG_MISMATCH) if (soap_in_PointerToSOAP_ENV__Detail(soap, "SOAP-ENV:Detail", &a->SOAP_ENV__Detail, "")) { soap_flag_SOAP_ENV__Detail--; continue; } if (soap->error == SOAP_TAG_MISMATCH) soap->error = soap_ignore_element(soap); if (soap->error == SOAP_NO_TAG) break; if (soap->error) return NULL; } if (soap_element_end_in(soap, tag)) return NULL; } else { a = (struct SOAP_ENV__Fault *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_SOAP_ENV__Fault, SOAP_TYPE_SOAP_ENV__Fault, sizeof(struct SOAP_ENV__Fault), 0, soap_finsert, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC1 struct SOAP_ENV__Fault * SOAP_FMAC2 soap_instantiate_SOAP_ENV__Fault(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_instantiate_SOAP_ENV__Fault(%p, %d, %s, %s)\n", soap, n, type?type:"", arrayType?arrayType:"")); (void)type; (void)arrayType; /* appease -Wall -Werror */ struct SOAP_ENV__Fault *p; size_t k = sizeof(struct SOAP_ENV__Fault); if (n < 0) { p = SOAP_NEW(struct SOAP_ENV__Fault); } else { p = SOAP_NEW_ARRAY(struct SOAP_ENV__Fault, n); k *= n; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Instantiated struct SOAP_ENV__Fault location=%p n=%d\n", p, n)); soap_link(soap, p, SOAP_TYPE_SOAP_ENV__Fault, n, soap_fdelete); if (size) *size = k; return p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Fault(struct soap *soap, const struct SOAP_ENV__Fault *a, const char *tag, const char *type) { if (soap_out_SOAP_ENV__Fault(soap, tag?tag:"SOAP-ENV:Fault", -2, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct SOAP_ENV__Fault * SOAP_FMAC4 soap_get_SOAP_ENV__Fault(struct soap *soap, struct SOAP_ENV__Fault *p, const char *tag, const char *type) { if ((p = soap_in_SOAP_ENV__Fault(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } #endif #ifndef WITH_NOGLOBAL SOAP_ENV__Reason::SOAP_ENV__Reason() { soap_default_SOAP_ENV__Reason(NULL, this); } SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Reason(struct soap *soap, struct SOAP_ENV__Reason *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_default_string(soap, &a->SOAP_ENV__Text); } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Reason(struct soap *soap, const struct SOAP_ENV__Reason *a) { (void)soap; (void)a; /* appease -Wall -Werror */ #ifndef WITH_NOIDREF soap_serialize_string(soap, (char*const*)&a->SOAP_ENV__Text); #endif } SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Reason(struct soap *soap, const char *tag, int id, const struct SOAP_ENV__Reason *a, const char *type) { (void)soap; (void)tag; (void)id; (void)a; (void)type; /* appease -Wall -Werror */ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_SOAP_ENV__Reason), type)) return soap->error; if (soap->lang) soap_set_attr(soap, "xml:lang", soap->lang, 1); if (soap_out_string(soap, "SOAP-ENV:Text", -1, (char*const*)&a->SOAP_ENV__Text, "")) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct SOAP_ENV__Reason * SOAP_FMAC4 soap_in_SOAP_ENV__Reason(struct soap *soap, const char *tag, struct SOAP_ENV__Reason *a, const char *type) { size_t soap_flag_SOAP_ENV__Text = 1; if (soap_element_begin_in(soap, tag, 0, type)) return NULL; a = (struct SOAP_ENV__Reason *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_SOAP_ENV__Reason, sizeof(struct SOAP_ENV__Reason), NULL, NULL, NULL, NULL); if (!a) return NULL; soap_default_SOAP_ENV__Reason(soap, a); if (soap->body && !*soap->href) { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_SOAP_ENV__Text && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) if (soap_in_string(soap, "SOAP-ENV:Text", (char**)&a->SOAP_ENV__Text, "xsd:string")) { soap_flag_SOAP_ENV__Text--; continue; } if (soap->error == SOAP_TAG_MISMATCH) soap->error = soap_ignore_element(soap); if (soap->error == SOAP_NO_TAG) break; if (soap->error) return NULL; } if (soap_element_end_in(soap, tag)) return NULL; } else { a = (struct SOAP_ENV__Reason *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_SOAP_ENV__Reason, SOAP_TYPE_SOAP_ENV__Reason, sizeof(struct SOAP_ENV__Reason), 0, soap_finsert, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC1 struct SOAP_ENV__Reason * SOAP_FMAC2 soap_instantiate_SOAP_ENV__Reason(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_instantiate_SOAP_ENV__Reason(%p, %d, %s, %s)\n", soap, n, type?type:"", arrayType?arrayType:"")); (void)type; (void)arrayType; /* appease -Wall -Werror */ struct SOAP_ENV__Reason *p; size_t k = sizeof(struct SOAP_ENV__Reason); if (n < 0) { p = SOAP_NEW(struct SOAP_ENV__Reason); } else { p = SOAP_NEW_ARRAY(struct SOAP_ENV__Reason, n); k *= n; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Instantiated struct SOAP_ENV__Reason location=%p n=%d\n", p, n)); soap_link(soap, p, SOAP_TYPE_SOAP_ENV__Reason, n, soap_fdelete); if (size) *size = k; return p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Reason(struct soap *soap, const struct SOAP_ENV__Reason *a, const char *tag, const char *type) { if (soap_out_SOAP_ENV__Reason(soap, tag?tag:"SOAP-ENV:Reason", -2, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct SOAP_ENV__Reason * SOAP_FMAC4 soap_get_SOAP_ENV__Reason(struct soap *soap, struct SOAP_ENV__Reason *p, const char *tag, const char *type) { if ((p = soap_in_SOAP_ENV__Reason(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } #endif #ifndef WITH_NOGLOBAL SOAP_ENV__Detail::SOAP_ENV__Detail() { soap_default_SOAP_ENV__Detail(NULL, this); } SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Detail(struct soap *soap, struct SOAP_ENV__Detail *a) { (void)soap; (void)a; /* appease -Wall -Werror */ a->__any = NULL; a->__type = 0; a->fault = NULL; } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Detail(struct soap *soap, const struct SOAP_ENV__Detail *a) { (void)soap; (void)a; /* appease -Wall -Werror */ #ifndef WITH_NOIDREF soap_markelement(soap, a->fault, a->__type); #endif } SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Detail(struct soap *soap, const char *tag, int id, const struct SOAP_ENV__Detail *a, const char *type) { (void)soap; (void)tag; (void)id; (void)a; (void)type; /* appease -Wall -Werror */ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_SOAP_ENV__Detail), type)) return soap->error; soap_outliteral(soap, "-any", (char*const*)&a->__any, NULL); if (soap_putelement(soap, a->fault, "fault", -1, a->__type)) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct SOAP_ENV__Detail * SOAP_FMAC4 soap_in_SOAP_ENV__Detail(struct soap *soap, const char *tag, struct SOAP_ENV__Detail *a, const char *type) { size_t soap_flag___any = 1; size_t soap_flag_fault = 1; if (soap_element_begin_in(soap, tag, 0, type)) return NULL; a = (struct SOAP_ENV__Detail *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_SOAP_ENV__Detail, sizeof(struct SOAP_ENV__Detail), NULL, NULL, NULL, NULL); if (!a) return NULL; soap_default_SOAP_ENV__Detail(soap, a); if (soap->body && !*soap->href) { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_fault && soap->error == SOAP_TAG_MISMATCH) if ((a->fault = soap_getelement(soap, &a->__type))) { soap_flag_fault = 0; continue; } if (soap_flag___any && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) if (soap_inliteral(soap, "-any", (char**)&a->__any)) { soap_flag___any--; continue; } if (soap->error == SOAP_TAG_MISMATCH) soap->error = soap_ignore_element(soap); if (soap->error == SOAP_NO_TAG) break; if (soap->error) return NULL; } if (soap_element_end_in(soap, tag)) return NULL; } else { a = (struct SOAP_ENV__Detail *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_SOAP_ENV__Detail, SOAP_TYPE_SOAP_ENV__Detail, sizeof(struct SOAP_ENV__Detail), 0, soap_finsert, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC1 struct SOAP_ENV__Detail * SOAP_FMAC2 soap_instantiate_SOAP_ENV__Detail(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_instantiate_SOAP_ENV__Detail(%p, %d, %s, %s)\n", soap, n, type?type:"", arrayType?arrayType:"")); (void)type; (void)arrayType; /* appease -Wall -Werror */ struct SOAP_ENV__Detail *p; size_t k = sizeof(struct SOAP_ENV__Detail); if (n < 0) { p = SOAP_NEW(struct SOAP_ENV__Detail); } else { p = SOAP_NEW_ARRAY(struct SOAP_ENV__Detail, n); k *= n; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Instantiated struct SOAP_ENV__Detail location=%p n=%d\n", p, n)); soap_link(soap, p, SOAP_TYPE_SOAP_ENV__Detail, n, soap_fdelete); if (size) *size = k; return p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Detail(struct soap *soap, const struct SOAP_ENV__Detail *a, const char *tag, const char *type) { if (soap_out_SOAP_ENV__Detail(soap, tag?tag:"SOAP-ENV:Detail", -2, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct SOAP_ENV__Detail * SOAP_FMAC4 soap_get_SOAP_ENV__Detail(struct soap *soap, struct SOAP_ENV__Detail *p, const char *tag, const char *type) { if ((p = soap_in_SOAP_ENV__Detail(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } #endif #ifndef WITH_NOGLOBAL SOAP_ENV__Code::SOAP_ENV__Code() { soap_default_SOAP_ENV__Code(NULL, this); } SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Code(struct soap *soap, struct SOAP_ENV__Code *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_default__QName(soap, &a->SOAP_ENV__Value); a->SOAP_ENV__Subcode = NULL; } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Code(struct soap *soap, const struct SOAP_ENV__Code *a) { (void)soap; (void)a; /* appease -Wall -Werror */ #ifndef WITH_NOIDREF soap_serialize__QName(soap, (char*const*)&a->SOAP_ENV__Value); soap_serialize_PointerToSOAP_ENV__Code(soap, &a->SOAP_ENV__Subcode); #endif } SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Code(struct soap *soap, const char *tag, int id, const struct SOAP_ENV__Code *a, const char *type) { const char *soap_tmp_SOAP_ENV__Value = soap_QName2s(soap, a->SOAP_ENV__Value); (void)soap; (void)tag; (void)id; (void)a; (void)type; /* appease -Wall -Werror */ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_SOAP_ENV__Code), type)) return soap->error; if (soap_out__QName(soap, "SOAP-ENV:Value", -1, (char*const*)(void*)&soap_tmp_SOAP_ENV__Value, "")) return soap->error; if (soap_out_PointerToSOAP_ENV__Code(soap, "SOAP-ENV:Subcode", -1, &a->SOAP_ENV__Subcode, "")) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct SOAP_ENV__Code * SOAP_FMAC4 soap_in_SOAP_ENV__Code(struct soap *soap, const char *tag, struct SOAP_ENV__Code *a, const char *type) { size_t soap_flag_SOAP_ENV__Value = 1; size_t soap_flag_SOAP_ENV__Subcode = 1; if (soap_element_begin_in(soap, tag, 0, type)) return NULL; a = (struct SOAP_ENV__Code *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_SOAP_ENV__Code, sizeof(struct SOAP_ENV__Code), NULL, NULL, NULL, NULL); if (!a) return NULL; soap_default_SOAP_ENV__Code(soap, a); if (soap->body && !*soap->href) { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_SOAP_ENV__Value && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) if (soap_in__QName(soap, "SOAP-ENV:Value", (char**)&a->SOAP_ENV__Value, "")) { soap_flag_SOAP_ENV__Value--; continue; } if (soap_flag_SOAP_ENV__Subcode && soap->error == SOAP_TAG_MISMATCH) if (soap_in_PointerToSOAP_ENV__Code(soap, "SOAP-ENV:Subcode", &a->SOAP_ENV__Subcode, "")) { soap_flag_SOAP_ENV__Subcode--; continue; } if (soap->error == SOAP_TAG_MISMATCH) soap->error = soap_ignore_element(soap); if (soap->error == SOAP_NO_TAG) break; if (soap->error) return NULL; } if (soap_element_end_in(soap, tag)) return NULL; } else { a = (struct SOAP_ENV__Code *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_SOAP_ENV__Code, SOAP_TYPE_SOAP_ENV__Code, sizeof(struct SOAP_ENV__Code), 0, soap_finsert, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC1 struct SOAP_ENV__Code * SOAP_FMAC2 soap_instantiate_SOAP_ENV__Code(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_instantiate_SOAP_ENV__Code(%p, %d, %s, %s)\n", soap, n, type?type:"", arrayType?arrayType:"")); (void)type; (void)arrayType; /* appease -Wall -Werror */ struct SOAP_ENV__Code *p; size_t k = sizeof(struct SOAP_ENV__Code); if (n < 0) { p = SOAP_NEW(struct SOAP_ENV__Code); } else { p = SOAP_NEW_ARRAY(struct SOAP_ENV__Code, n); k *= n; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Instantiated struct SOAP_ENV__Code location=%p n=%d\n", p, n)); soap_link(soap, p, SOAP_TYPE_SOAP_ENV__Code, n, soap_fdelete); if (size) *size = k; return p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Code(struct soap *soap, const struct SOAP_ENV__Code *a, const char *tag, const char *type) { if (soap_out_SOAP_ENV__Code(soap, tag?tag:"SOAP-ENV:Code", -2, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct SOAP_ENV__Code * SOAP_FMAC4 soap_get_SOAP_ENV__Code(struct soap *soap, struct SOAP_ENV__Code *p, const char *tag, const char *type) { if ((p = soap_in_SOAP_ENV__Code(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } #endif #ifndef WITH_NOGLOBAL SOAP_ENV__Header::SOAP_ENV__Header() { soap_default_SOAP_ENV__Header(NULL, this); } SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Header(struct soap *soap, struct SOAP_ENV__Header *a) { (void)soap; (void)a; /* appease -Wall -Werror */ } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Header(struct soap *soap, const struct SOAP_ENV__Header *a) { (void)soap; (void)a; /* appease -Wall -Werror */ #ifndef WITH_NOIDREF #endif } SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Header(struct soap *soap, const char *tag, int id, const struct SOAP_ENV__Header *a, const char *type) { (void)soap; (void)tag; (void)id; (void)a; (void)type; /* appease -Wall -Werror */ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_SOAP_ENV__Header), type)) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct SOAP_ENV__Header * SOAP_FMAC4 soap_in_SOAP_ENV__Header(struct soap *soap, const char *tag, struct SOAP_ENV__Header *a, const char *type) { if (soap_element_begin_in(soap, tag, 0, type)) return NULL; a = (struct SOAP_ENV__Header *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_SOAP_ENV__Header, sizeof(struct SOAP_ENV__Header), NULL, NULL, NULL, NULL); if (!a) return NULL; soap_default_SOAP_ENV__Header(soap, a); if (soap->body && !*soap->href) { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap->error == SOAP_TAG_MISMATCH) soap->error = soap_ignore_element(soap); if (soap->error == SOAP_NO_TAG) break; if (soap->error) return NULL; } if (soap_element_end_in(soap, tag)) return NULL; } else { a = (struct SOAP_ENV__Header *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_SOAP_ENV__Header, SOAP_TYPE_SOAP_ENV__Header, sizeof(struct SOAP_ENV__Header), 0, soap_finsert, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC1 struct SOAP_ENV__Header * SOAP_FMAC2 soap_instantiate_SOAP_ENV__Header(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_instantiate_SOAP_ENV__Header(%p, %d, %s, %s)\n", soap, n, type?type:"", arrayType?arrayType:"")); (void)type; (void)arrayType; /* appease -Wall -Werror */ struct SOAP_ENV__Header *p; size_t k = sizeof(struct SOAP_ENV__Header); if (n < 0) { p = SOAP_NEW(struct SOAP_ENV__Header); } else { p = SOAP_NEW_ARRAY(struct SOAP_ENV__Header, n); k *= n; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Instantiated struct SOAP_ENV__Header location=%p n=%d\n", p, n)); soap_link(soap, p, SOAP_TYPE_SOAP_ENV__Header, n, soap_fdelete); if (size) *size = k; return p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Header(struct soap *soap, const struct SOAP_ENV__Header *a, const char *tag, const char *type) { if (soap_out_SOAP_ENV__Header(soap, tag?tag:"SOAP-ENV:Header", -2, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct SOAP_ENV__Header * SOAP_FMAC4 soap_get_SOAP_ENV__Header(struct soap *soap, struct SOAP_ENV__Header *p, const char *tag, const char *type) { if ((p = soap_in_SOAP_ENV__Header(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } #endif ns__pow::ns__pow() { soap_default_ns__pow(NULL, this); } SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__pow(struct soap *soap, struct ns__pow *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_default_double(soap, &a->a); soap_default_double(soap, &a->b); } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__pow(struct soap *soap, const struct ns__pow *a) { (void)soap; (void)a; /* appease -Wall -Werror */ #ifndef WITH_NOIDREF soap_embedded(soap, &a->a, SOAP_TYPE_double); soap_embedded(soap, &a->b, SOAP_TYPE_double); #endif } SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__pow(struct soap *soap, const char *tag, int id, const struct ns__pow *a, const char *type) { (void)soap; (void)tag; (void)id; (void)a; (void)type; /* appease -Wall -Werror */ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns__pow), type)) return soap->error; if (soap_out_double(soap, "a", -1, &a->a, "")) return soap->error; if (soap_out_double(soap, "b", -1, &a->b, "")) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct ns__pow * SOAP_FMAC4 soap_in_ns__pow(struct soap *soap, const char *tag, struct ns__pow *a, const char *type) { size_t soap_flag_a = 1; size_t soap_flag_b = 1; if (soap_element_begin_in(soap, tag, 0, type)) return NULL; a = (struct ns__pow *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns__pow, sizeof(struct ns__pow), NULL, NULL, NULL, NULL); if (!a) return NULL; soap_default_ns__pow(soap, a); if (soap->body && !*soap->href) { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_a && soap->error == SOAP_TAG_MISMATCH) if (soap_in_double(soap, "a", &a->a, "xsd:double")) { soap_flag_a--; continue; } if (soap_flag_b && soap->error == SOAP_TAG_MISMATCH) if (soap_in_double(soap, "b", &a->b, "xsd:double")) { soap_flag_b--; continue; } if (soap->error == SOAP_TAG_MISMATCH) soap->error = soap_ignore_element(soap); if (soap->error == SOAP_NO_TAG) break; if (soap->error) return NULL; } if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_a > 0 || soap_flag_b > 0)) { soap->error = SOAP_OCCURS; return NULL; } if (soap_element_end_in(soap, tag)) return NULL; } else if ((soap->mode & SOAP_XML_STRICT) && !*soap->href) { soap->error = SOAP_OCCURS; return NULL; } else { a = (struct ns__pow *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns__pow, SOAP_TYPE_ns__pow, sizeof(struct ns__pow), 0, soap_finsert, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC1 struct ns__pow * SOAP_FMAC2 soap_instantiate_ns__pow(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_instantiate_ns__pow(%p, %d, %s, %s)\n", soap, n, type?type:"", arrayType?arrayType:"")); (void)type; (void)arrayType; /* appease -Wall -Werror */ struct ns__pow *p; size_t k = sizeof(struct ns__pow); if (n < 0) { p = SOAP_NEW(struct ns__pow); } else { p = SOAP_NEW_ARRAY(struct ns__pow, n); k *= n; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Instantiated struct ns__pow location=%p n=%d\n", p, n)); soap_link(soap, p, SOAP_TYPE_ns__pow, n, soap_fdelete); if (size) *size = k; return p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__pow(struct soap *soap, const struct ns__pow *a, const char *tag, const char *type) { if (soap_out_ns__pow(soap, tag?tag:"ns:pow", -2, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct ns__pow * SOAP_FMAC4 soap_get_ns__pow(struct soap *soap, struct ns__pow *p, const char *tag, const char *type) { if ((p = soap_in_ns__pow(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } ns__powResponse::ns__powResponse() { soap_default_ns__powResponse(NULL, this); } SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__powResponse(struct soap *soap, struct ns__powResponse *a) { (void)soap; (void)a; /* appease -Wall -Werror */ a->result = NULL; } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__powResponse(struct soap *soap, const struct ns__powResponse *a) { (void)soap; (void)a; /* appease -Wall -Werror */ #ifndef WITH_NOIDREF soap_serialize_PointerTodouble(soap, &a->result); #endif } SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__powResponse(struct soap *soap, const char *tag, int id, const struct ns__powResponse *a, const char *type) { (void)soap; (void)tag; (void)id; (void)a; (void)type; /* appease -Wall -Werror */ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns__powResponse), type)) return soap->error; if (soap_out_PointerTodouble(soap, "result", -1, &a->result, "")) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct ns__powResponse * SOAP_FMAC4 soap_in_ns__powResponse(struct soap *soap, const char *tag, struct ns__powResponse *a, const char *type) { size_t soap_flag_result = 1; if (soap_element_begin_in(soap, tag, 0, type)) return NULL; a = (struct ns__powResponse *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns__powResponse, sizeof(struct ns__powResponse), NULL, NULL, NULL, NULL); if (!a) return NULL; soap_default_ns__powResponse(soap, a); if (soap->body && !*soap->href) { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_result && soap->error == SOAP_TAG_MISMATCH) if (soap_in_PointerTodouble(soap, "result", &a->result, "xsd:double")) { soap_flag_result--; continue; } if (soap->error == SOAP_TAG_MISMATCH) soap->error = soap_ignore_element(soap); if (soap->error == SOAP_NO_TAG) break; if (soap->error) return NULL; } if (soap_element_end_in(soap, tag)) return NULL; } else { a = (struct ns__powResponse *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns__powResponse, SOAP_TYPE_ns__powResponse, sizeof(struct ns__powResponse), 0, soap_finsert, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC1 struct ns__powResponse * SOAP_FMAC2 soap_instantiate_ns__powResponse(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_instantiate_ns__powResponse(%p, %d, %s, %s)\n", soap, n, type?type:"", arrayType?arrayType:"")); (void)type; (void)arrayType; /* appease -Wall -Werror */ struct ns__powResponse *p; size_t k = sizeof(struct ns__powResponse); if (n < 0) { p = SOAP_NEW(struct ns__powResponse); } else { p = SOAP_NEW_ARRAY(struct ns__powResponse, n); k *= n; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Instantiated struct ns__powResponse location=%p n=%d\n", p, n)); soap_link(soap, p, SOAP_TYPE_ns__powResponse, n, soap_fdelete); if (size) *size = k; return p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__powResponse(struct soap *soap, const struct ns__powResponse *a, const char *tag, const char *type) { if (soap_out_ns__powResponse(soap, tag?tag:"ns:powResponse", -2, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct ns__powResponse * SOAP_FMAC4 soap_get_ns__powResponse(struct soap *soap, struct ns__powResponse *p, const char *tag, const char *type) { if ((p = soap_in_ns__powResponse(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } ns__div::ns__div() { soap_default_ns__div(NULL, this); } SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__div(struct soap *soap, struct ns__div *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_default_double(soap, &a->a); soap_default_double(soap, &a->b); } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__div(struct soap *soap, const struct ns__div *a) { (void)soap; (void)a; /* appease -Wall -Werror */ #ifndef WITH_NOIDREF soap_embedded(soap, &a->a, SOAP_TYPE_double); soap_embedded(soap, &a->b, SOAP_TYPE_double); #endif } SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__div(struct soap *soap, const char *tag, int id, const struct ns__div *a, const char *type) { (void)soap; (void)tag; (void)id; (void)a; (void)type; /* appease -Wall -Werror */ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns__div), type)) return soap->error; if (soap_out_double(soap, "a", -1, &a->a, "")) return soap->error; if (soap_out_double(soap, "b", -1, &a->b, "")) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct ns__div * SOAP_FMAC4 soap_in_ns__div(struct soap *soap, const char *tag, struct ns__div *a, const char *type) { size_t soap_flag_a = 1; size_t soap_flag_b = 1; if (soap_element_begin_in(soap, tag, 0, type)) return NULL; a = (struct ns__div *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns__div, sizeof(struct ns__div), NULL, NULL, NULL, NULL); if (!a) return NULL; soap_default_ns__div(soap, a); if (soap->body && !*soap->href) { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_a && soap->error == SOAP_TAG_MISMATCH) if (soap_in_double(soap, "a", &a->a, "xsd:double")) { soap_flag_a--; continue; } if (soap_flag_b && soap->error == SOAP_TAG_MISMATCH) if (soap_in_double(soap, "b", &a->b, "xsd:double")) { soap_flag_b--; continue; } if (soap->error == SOAP_TAG_MISMATCH) soap->error = soap_ignore_element(soap); if (soap->error == SOAP_NO_TAG) break; if (soap->error) return NULL; } if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_a > 0 || soap_flag_b > 0)) { soap->error = SOAP_OCCURS; return NULL; } if (soap_element_end_in(soap, tag)) return NULL; } else if ((soap->mode & SOAP_XML_STRICT) && !*soap->href) { soap->error = SOAP_OCCURS; return NULL; } else { a = (struct ns__div *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns__div, SOAP_TYPE_ns__div, sizeof(struct ns__div), 0, soap_finsert, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC1 struct ns__div * SOAP_FMAC2 soap_instantiate_ns__div(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_instantiate_ns__div(%p, %d, %s, %s)\n", soap, n, type?type:"", arrayType?arrayType:"")); (void)type; (void)arrayType; /* appease -Wall -Werror */ struct ns__div *p; size_t k = sizeof(struct ns__div); if (n < 0) { p = SOAP_NEW(struct ns__div); } else { p = SOAP_NEW_ARRAY(struct ns__div, n); k *= n; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Instantiated struct ns__div location=%p n=%d\n", p, n)); soap_link(soap, p, SOAP_TYPE_ns__div, n, soap_fdelete); if (size) *size = k; return p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__div(struct soap *soap, const struct ns__div *a, const char *tag, const char *type) { if (soap_out_ns__div(soap, tag?tag:"ns:div", -2, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct ns__div * SOAP_FMAC4 soap_get_ns__div(struct soap *soap, struct ns__div *p, const char *tag, const char *type) { if ((p = soap_in_ns__div(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } ns__divResponse::ns__divResponse() { soap_default_ns__divResponse(NULL, this); } SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__divResponse(struct soap *soap, struct ns__divResponse *a) { (void)soap; (void)a; /* appease -Wall -Werror */ a->result = NULL; } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__divResponse(struct soap *soap, const struct ns__divResponse *a) { (void)soap; (void)a; /* appease -Wall -Werror */ #ifndef WITH_NOIDREF soap_serialize_PointerTodouble(soap, &a->result); #endif } SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__divResponse(struct soap *soap, const char *tag, int id, const struct ns__divResponse *a, const char *type) { (void)soap; (void)tag; (void)id; (void)a; (void)type; /* appease -Wall -Werror */ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns__divResponse), type)) return soap->error; if (soap_out_PointerTodouble(soap, "result", -1, &a->result, "")) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct ns__divResponse * SOAP_FMAC4 soap_in_ns__divResponse(struct soap *soap, const char *tag, struct ns__divResponse *a, const char *type) { size_t soap_flag_result = 1; if (soap_element_begin_in(soap, tag, 0, type)) return NULL; a = (struct ns__divResponse *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns__divResponse, sizeof(struct ns__divResponse), NULL, NULL, NULL, NULL); if (!a) return NULL; soap_default_ns__divResponse(soap, a); if (soap->body && !*soap->href) { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_result && soap->error == SOAP_TAG_MISMATCH) if (soap_in_PointerTodouble(soap, "result", &a->result, "xsd:double")) { soap_flag_result--; continue; } if (soap->error == SOAP_TAG_MISMATCH) soap->error = soap_ignore_element(soap); if (soap->error == SOAP_NO_TAG) break; if (soap->error) return NULL; } if (soap_element_end_in(soap, tag)) return NULL; } else { a = (struct ns__divResponse *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns__divResponse, SOAP_TYPE_ns__divResponse, sizeof(struct ns__divResponse), 0, soap_finsert, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC1 struct ns__divResponse * SOAP_FMAC2 soap_instantiate_ns__divResponse(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_instantiate_ns__divResponse(%p, %d, %s, %s)\n", soap, n, type?type:"", arrayType?arrayType:"")); (void)type; (void)arrayType; /* appease -Wall -Werror */ struct ns__divResponse *p; size_t k = sizeof(struct ns__divResponse); if (n < 0) { p = SOAP_NEW(struct ns__divResponse); } else { p = SOAP_NEW_ARRAY(struct ns__divResponse, n); k *= n; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Instantiated struct ns__divResponse location=%p n=%d\n", p, n)); soap_link(soap, p, SOAP_TYPE_ns__divResponse, n, soap_fdelete); if (size) *size = k; return p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__divResponse(struct soap *soap, const struct ns__divResponse *a, const char *tag, const char *type) { if (soap_out_ns__divResponse(soap, tag?tag:"ns:divResponse", -2, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct ns__divResponse * SOAP_FMAC4 soap_get_ns__divResponse(struct soap *soap, struct ns__divResponse *p, const char *tag, const char *type) { if ((p = soap_in_ns__divResponse(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } ns__mul::ns__mul() { soap_default_ns__mul(NULL, this); } SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__mul(struct soap *soap, struct ns__mul *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_default_double(soap, &a->a); soap_default_double(soap, &a->b); } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__mul(struct soap *soap, const struct ns__mul *a) { (void)soap; (void)a; /* appease -Wall -Werror */ #ifndef WITH_NOIDREF soap_embedded(soap, &a->a, SOAP_TYPE_double); soap_embedded(soap, &a->b, SOAP_TYPE_double); #endif } SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__mul(struct soap *soap, const char *tag, int id, const struct ns__mul *a, const char *type) { (void)soap; (void)tag; (void)id; (void)a; (void)type; /* appease -Wall -Werror */ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns__mul), type)) return soap->error; if (soap_out_double(soap, "a", -1, &a->a, "")) return soap->error; if (soap_out_double(soap, "b", -1, &a->b, "")) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct ns__mul * SOAP_FMAC4 soap_in_ns__mul(struct soap *soap, const char *tag, struct ns__mul *a, const char *type) { size_t soap_flag_a = 1; size_t soap_flag_b = 1; if (soap_element_begin_in(soap, tag, 0, type)) return NULL; a = (struct ns__mul *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns__mul, sizeof(struct ns__mul), NULL, NULL, NULL, NULL); if (!a) return NULL; soap_default_ns__mul(soap, a); if (soap->body && !*soap->href) { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_a && soap->error == SOAP_TAG_MISMATCH) if (soap_in_double(soap, "a", &a->a, "xsd:double")) { soap_flag_a--; continue; } if (soap_flag_b && soap->error == SOAP_TAG_MISMATCH) if (soap_in_double(soap, "b", &a->b, "xsd:double")) { soap_flag_b--; continue; } if (soap->error == SOAP_TAG_MISMATCH) soap->error = soap_ignore_element(soap); if (soap->error == SOAP_NO_TAG) break; if (soap->error) return NULL; } if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_a > 0 || soap_flag_b > 0)) { soap->error = SOAP_OCCURS; return NULL; } if (soap_element_end_in(soap, tag)) return NULL; } else if ((soap->mode & SOAP_XML_STRICT) && !*soap->href) { soap->error = SOAP_OCCURS; return NULL; } else { a = (struct ns__mul *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns__mul, SOAP_TYPE_ns__mul, sizeof(struct ns__mul), 0, soap_finsert, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC1 struct ns__mul * SOAP_FMAC2 soap_instantiate_ns__mul(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_instantiate_ns__mul(%p, %d, %s, %s)\n", soap, n, type?type:"", arrayType?arrayType:"")); (void)type; (void)arrayType; /* appease -Wall -Werror */ struct ns__mul *p; size_t k = sizeof(struct ns__mul); if (n < 0) { p = SOAP_NEW(struct ns__mul); } else { p = SOAP_NEW_ARRAY(struct ns__mul, n); k *= n; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Instantiated struct ns__mul location=%p n=%d\n", p, n)); soap_link(soap, p, SOAP_TYPE_ns__mul, n, soap_fdelete); if (size) *size = k; return p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__mul(struct soap *soap, const struct ns__mul *a, const char *tag, const char *type) { if (soap_out_ns__mul(soap, tag?tag:"ns:mul", -2, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct ns__mul * SOAP_FMAC4 soap_get_ns__mul(struct soap *soap, struct ns__mul *p, const char *tag, const char *type) { if ((p = soap_in_ns__mul(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } ns__mulResponse::ns__mulResponse() { soap_default_ns__mulResponse(NULL, this); } SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__mulResponse(struct soap *soap, struct ns__mulResponse *a) { (void)soap; (void)a; /* appease -Wall -Werror */ a->result = NULL; } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__mulResponse(struct soap *soap, const struct ns__mulResponse *a) { (void)soap; (void)a; /* appease -Wall -Werror */ #ifndef WITH_NOIDREF soap_serialize_PointerTodouble(soap, &a->result); #endif } SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__mulResponse(struct soap *soap, const char *tag, int id, const struct ns__mulResponse *a, const char *type) { (void)soap; (void)tag; (void)id; (void)a; (void)type; /* appease -Wall -Werror */ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns__mulResponse), type)) return soap->error; if (soap_out_PointerTodouble(soap, "result", -1, &a->result, "")) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct ns__mulResponse * SOAP_FMAC4 soap_in_ns__mulResponse(struct soap *soap, const char *tag, struct ns__mulResponse *a, const char *type) { size_t soap_flag_result = 1; if (soap_element_begin_in(soap, tag, 0, type)) return NULL; a = (struct ns__mulResponse *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns__mulResponse, sizeof(struct ns__mulResponse), NULL, NULL, NULL, NULL); if (!a) return NULL; soap_default_ns__mulResponse(soap, a); if (soap->body && !*soap->href) { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_result && soap->error == SOAP_TAG_MISMATCH) if (soap_in_PointerTodouble(soap, "result", &a->result, "xsd:double")) { soap_flag_result--; continue; } if (soap->error == SOAP_TAG_MISMATCH) soap->error = soap_ignore_element(soap); if (soap->error == SOAP_NO_TAG) break; if (soap->error) return NULL; } if (soap_element_end_in(soap, tag)) return NULL; } else { a = (struct ns__mulResponse *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns__mulResponse, SOAP_TYPE_ns__mulResponse, sizeof(struct ns__mulResponse), 0, soap_finsert, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC1 struct ns__mulResponse * SOAP_FMAC2 soap_instantiate_ns__mulResponse(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_instantiate_ns__mulResponse(%p, %d, %s, %s)\n", soap, n, type?type:"", arrayType?arrayType:"")); (void)type; (void)arrayType; /* appease -Wall -Werror */ struct ns__mulResponse *p; size_t k = sizeof(struct ns__mulResponse); if (n < 0) { p = SOAP_NEW(struct ns__mulResponse); } else { p = SOAP_NEW_ARRAY(struct ns__mulResponse, n); k *= n; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Instantiated struct ns__mulResponse location=%p n=%d\n", p, n)); soap_link(soap, p, SOAP_TYPE_ns__mulResponse, n, soap_fdelete); if (size) *size = k; return p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__mulResponse(struct soap *soap, const struct ns__mulResponse *a, const char *tag, const char *type) { if (soap_out_ns__mulResponse(soap, tag?tag:"ns:mulResponse", -2, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct ns__mulResponse * SOAP_FMAC4 soap_get_ns__mulResponse(struct soap *soap, struct ns__mulResponse *p, const char *tag, const char *type) { if ((p = soap_in_ns__mulResponse(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } ns__sub::ns__sub() { soap_default_ns__sub(NULL, this); } SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__sub(struct soap *soap, struct ns__sub *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_default_double(soap, &a->a); soap_default_double(soap, &a->b); } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__sub(struct soap *soap, const struct ns__sub *a) { (void)soap; (void)a; /* appease -Wall -Werror */ #ifndef WITH_NOIDREF soap_embedded(soap, &a->a, SOAP_TYPE_double); soap_embedded(soap, &a->b, SOAP_TYPE_double); #endif } SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__sub(struct soap *soap, const char *tag, int id, const struct ns__sub *a, const char *type) { (void)soap; (void)tag; (void)id; (void)a; (void)type; /* appease -Wall -Werror */ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns__sub), type)) return soap->error; if (soap_out_double(soap, "a", -1, &a->a, "")) return soap->error; if (soap_out_double(soap, "b", -1, &a->b, "")) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct ns__sub * SOAP_FMAC4 soap_in_ns__sub(struct soap *soap, const char *tag, struct ns__sub *a, const char *type) { size_t soap_flag_a = 1; size_t soap_flag_b = 1; if (soap_element_begin_in(soap, tag, 0, type)) return NULL; a = (struct ns__sub *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns__sub, sizeof(struct ns__sub), NULL, NULL, NULL, NULL); if (!a) return NULL; soap_default_ns__sub(soap, a); if (soap->body && !*soap->href) { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_a && soap->error == SOAP_TAG_MISMATCH) if (soap_in_double(soap, "a", &a->a, "xsd:double")) { soap_flag_a--; continue; } if (soap_flag_b && soap->error == SOAP_TAG_MISMATCH) if (soap_in_double(soap, "b", &a->b, "xsd:double")) { soap_flag_b--; continue; } if (soap->error == SOAP_TAG_MISMATCH) soap->error = soap_ignore_element(soap); if (soap->error == SOAP_NO_TAG) break; if (soap->error) return NULL; } if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_a > 0 || soap_flag_b > 0)) { soap->error = SOAP_OCCURS; return NULL; } if (soap_element_end_in(soap, tag)) return NULL; } else if ((soap->mode & SOAP_XML_STRICT) && !*soap->href) { soap->error = SOAP_OCCURS; return NULL; } else { a = (struct ns__sub *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns__sub, SOAP_TYPE_ns__sub, sizeof(struct ns__sub), 0, soap_finsert, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC1 struct ns__sub * SOAP_FMAC2 soap_instantiate_ns__sub(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_instantiate_ns__sub(%p, %d, %s, %s)\n", soap, n, type?type:"", arrayType?arrayType:"")); (void)type; (void)arrayType; /* appease -Wall -Werror */ struct ns__sub *p; size_t k = sizeof(struct ns__sub); if (n < 0) { p = SOAP_NEW(struct ns__sub); } else { p = SOAP_NEW_ARRAY(struct ns__sub, n); k *= n; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Instantiated struct ns__sub location=%p n=%d\n", p, n)); soap_link(soap, p, SOAP_TYPE_ns__sub, n, soap_fdelete); if (size) *size = k; return p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__sub(struct soap *soap, const struct ns__sub *a, const char *tag, const char *type) { if (soap_out_ns__sub(soap, tag?tag:"ns:sub", -2, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct ns__sub * SOAP_FMAC4 soap_get_ns__sub(struct soap *soap, struct ns__sub *p, const char *tag, const char *type) { if ((p = soap_in_ns__sub(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } ns__subResponse::ns__subResponse() { soap_default_ns__subResponse(NULL, this); } SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__subResponse(struct soap *soap, struct ns__subResponse *a) { (void)soap; (void)a; /* appease -Wall -Werror */ a->result = NULL; } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__subResponse(struct soap *soap, const struct ns__subResponse *a) { (void)soap; (void)a; /* appease -Wall -Werror */ #ifndef WITH_NOIDREF soap_serialize_PointerTodouble(soap, &a->result); #endif } SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__subResponse(struct soap *soap, const char *tag, int id, const struct ns__subResponse *a, const char *type) { (void)soap; (void)tag; (void)id; (void)a; (void)type; /* appease -Wall -Werror */ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns__subResponse), type)) return soap->error; if (soap_out_PointerTodouble(soap, "result", -1, &a->result, "")) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct ns__subResponse * SOAP_FMAC4 soap_in_ns__subResponse(struct soap *soap, const char *tag, struct ns__subResponse *a, const char *type) { size_t soap_flag_result = 1; if (soap_element_begin_in(soap, tag, 0, type)) return NULL; a = (struct ns__subResponse *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns__subResponse, sizeof(struct ns__subResponse), NULL, NULL, NULL, NULL); if (!a) return NULL; soap_default_ns__subResponse(soap, a); if (soap->body && !*soap->href) { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_result && soap->error == SOAP_TAG_MISMATCH) if (soap_in_PointerTodouble(soap, "result", &a->result, "xsd:double")) { soap_flag_result--; continue; } if (soap->error == SOAP_TAG_MISMATCH) soap->error = soap_ignore_element(soap); if (soap->error == SOAP_NO_TAG) break; if (soap->error) return NULL; } if (soap_element_end_in(soap, tag)) return NULL; } else { a = (struct ns__subResponse *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns__subResponse, SOAP_TYPE_ns__subResponse, sizeof(struct ns__subResponse), 0, soap_finsert, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC1 struct ns__subResponse * SOAP_FMAC2 soap_instantiate_ns__subResponse(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_instantiate_ns__subResponse(%p, %d, %s, %s)\n", soap, n, type?type:"", arrayType?arrayType:"")); (void)type; (void)arrayType; /* appease -Wall -Werror */ struct ns__subResponse *p; size_t k = sizeof(struct ns__subResponse); if (n < 0) { p = SOAP_NEW(struct ns__subResponse); } else { p = SOAP_NEW_ARRAY(struct ns__subResponse, n); k *= n; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Instantiated struct ns__subResponse location=%p n=%d\n", p, n)); soap_link(soap, p, SOAP_TYPE_ns__subResponse, n, soap_fdelete); if (size) *size = k; return p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__subResponse(struct soap *soap, const struct ns__subResponse *a, const char *tag, const char *type) { if (soap_out_ns__subResponse(soap, tag?tag:"ns:subResponse", -2, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct ns__subResponse * SOAP_FMAC4 soap_get_ns__subResponse(struct soap *soap, struct ns__subResponse *p, const char *tag, const char *type) { if ((p = soap_in_ns__subResponse(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } ns__add::ns__add() { soap_default_ns__add(NULL, this); } SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__add(struct soap *soap, struct ns__add *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_default_double(soap, &a->a); soap_default_double(soap, &a->b); } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__add(struct soap *soap, const struct ns__add *a) { (void)soap; (void)a; /* appease -Wall -Werror */ #ifndef WITH_NOIDREF soap_embedded(soap, &a->a, SOAP_TYPE_double); soap_embedded(soap, &a->b, SOAP_TYPE_double); #endif } SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__add(struct soap *soap, const char *tag, int id, const struct ns__add *a, const char *type) { (void)soap; (void)tag; (void)id; (void)a; (void)type; /* appease -Wall -Werror */ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns__add), type)) return soap->error; if (soap_out_double(soap, "a", -1, &a->a, "")) return soap->error; if (soap_out_double(soap, "b", -1, &a->b, "")) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct ns__add * SOAP_FMAC4 soap_in_ns__add(struct soap *soap, const char *tag, struct ns__add *a, const char *type) { size_t soap_flag_a = 1; size_t soap_flag_b = 1; if (soap_element_begin_in(soap, tag, 0, type)) return NULL; a = (struct ns__add *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns__add, sizeof(struct ns__add), NULL, NULL, NULL, NULL); if (!a) return NULL; soap_default_ns__add(soap, a); if (soap->body && !*soap->href) { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_a && soap->error == SOAP_TAG_MISMATCH) if (soap_in_double(soap, "a", &a->a, "xsd:double")) { soap_flag_a--; continue; } if (soap_flag_b && soap->error == SOAP_TAG_MISMATCH) if (soap_in_double(soap, "b", &a->b, "xsd:double")) { soap_flag_b--; continue; } if (soap->error == SOAP_TAG_MISMATCH) soap->error = soap_ignore_element(soap); if (soap->error == SOAP_NO_TAG) break; if (soap->error) return NULL; } if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_a > 0 || soap_flag_b > 0)) { soap->error = SOAP_OCCURS; return NULL; } if (soap_element_end_in(soap, tag)) return NULL; } else if ((soap->mode & SOAP_XML_STRICT) && !*soap->href) { soap->error = SOAP_OCCURS; return NULL; } else { a = (struct ns__add *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns__add, SOAP_TYPE_ns__add, sizeof(struct ns__add), 0, soap_finsert, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC1 struct ns__add * SOAP_FMAC2 soap_instantiate_ns__add(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_instantiate_ns__add(%p, %d, %s, %s)\n", soap, n, type?type:"", arrayType?arrayType:"")); (void)type; (void)arrayType; /* appease -Wall -Werror */ struct ns__add *p; size_t k = sizeof(struct ns__add); if (n < 0) { p = SOAP_NEW(struct ns__add); } else { p = SOAP_NEW_ARRAY(struct ns__add, n); k *= n; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Instantiated struct ns__add location=%p n=%d\n", p, n)); soap_link(soap, p, SOAP_TYPE_ns__add, n, soap_fdelete); if (size) *size = k; return p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__add(struct soap *soap, const struct ns__add *a, const char *tag, const char *type) { if (soap_out_ns__add(soap, tag?tag:"ns:add", -2, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct ns__add * SOAP_FMAC4 soap_get_ns__add(struct soap *soap, struct ns__add *p, const char *tag, const char *type) { if ((p = soap_in_ns__add(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } ns__addResponse::ns__addResponse() { soap_default_ns__addResponse(NULL, this); } SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__addResponse(struct soap *soap, struct ns__addResponse *a) { (void)soap; (void)a; /* appease -Wall -Werror */ a->result = NULL; } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__addResponse(struct soap *soap, const struct ns__addResponse *a) { (void)soap; (void)a; /* appease -Wall -Werror */ #ifndef WITH_NOIDREF soap_serialize_PointerTodouble(soap, &a->result); #endif } SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__addResponse(struct soap *soap, const char *tag, int id, const struct ns__addResponse *a, const char *type) { (void)soap; (void)tag; (void)id; (void)a; (void)type; /* appease -Wall -Werror */ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns__addResponse), type)) return soap->error; if (soap_out_PointerTodouble(soap, "result", -1, &a->result, "")) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct ns__addResponse * SOAP_FMAC4 soap_in_ns__addResponse(struct soap *soap, const char *tag, struct ns__addResponse *a, const char *type) { size_t soap_flag_result = 1; if (soap_element_begin_in(soap, tag, 0, type)) return NULL; a = (struct ns__addResponse *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns__addResponse, sizeof(struct ns__addResponse), NULL, NULL, NULL, NULL); if (!a) return NULL; soap_default_ns__addResponse(soap, a); if (soap->body && !*soap->href) { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_result && soap->error == SOAP_TAG_MISMATCH) if (soap_in_PointerTodouble(soap, "result", &a->result, "xsd:double")) { soap_flag_result--; continue; } if (soap->error == SOAP_TAG_MISMATCH) soap->error = soap_ignore_element(soap); if (soap->error == SOAP_NO_TAG) break; if (soap->error) return NULL; } if (soap_element_end_in(soap, tag)) return NULL; } else { a = (struct ns__addResponse *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns__addResponse, SOAP_TYPE_ns__addResponse, sizeof(struct ns__addResponse), 0, soap_finsert, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC1 struct ns__addResponse * SOAP_FMAC2 soap_instantiate_ns__addResponse(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_instantiate_ns__addResponse(%p, %d, %s, %s)\n", soap, n, type?type:"", arrayType?arrayType:"")); (void)type; (void)arrayType; /* appease -Wall -Werror */ struct ns__addResponse *p; size_t k = sizeof(struct ns__addResponse); if (n < 0) { p = SOAP_NEW(struct ns__addResponse); } else { p = SOAP_NEW_ARRAY(struct ns__addResponse, n); k *= n; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Instantiated struct ns__addResponse location=%p n=%d\n", p, n)); soap_link(soap, p, SOAP_TYPE_ns__addResponse, n, soap_fdelete); if (size) *size = k; return p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__addResponse(struct soap *soap, const struct ns__addResponse *a, const char *tag, const char *type) { if (soap_out_ns__addResponse(soap, tag?tag:"ns:addResponse", -2, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct ns__addResponse * SOAP_FMAC4 soap_get_ns__addResponse(struct soap *soap, struct ns__addResponse *p, const char *tag, const char *type) { if ((p = soap_in_ns__addResponse(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } #ifndef WITH_NOGLOBAL SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToSOAP_ENV__Reason(struct soap *soap, struct SOAP_ENV__Reason *const*a) { (void)soap; (void)a; /* appease -Wall -Werror */ #ifndef WITH_NOIDREF if (!soap_reference(soap, *a, SOAP_TYPE_SOAP_ENV__Reason)) soap_serialize_SOAP_ENV__Reason(soap, *a); #endif } SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerToSOAP_ENV__Reason(struct soap *soap, const char *tag, int id, struct SOAP_ENV__Reason *const*a, const char *type) { id = soap_element_id(soap, tag, id, *a, NULL, 0, type, SOAP_TYPE_SOAP_ENV__Reason, NULL); if (id < 0) return soap->error; return soap_out_SOAP_ENV__Reason(soap, tag, id, *a, type); } SOAP_FMAC3 struct SOAP_ENV__Reason ** SOAP_FMAC4 soap_in_PointerToSOAP_ENV__Reason(struct soap *soap, const char *tag, struct SOAP_ENV__Reason **a, const char *type) { (void)type; /* appease -Wall -Werror */ if (soap_element_begin_in(soap, tag, 1, NULL)) return NULL; if (!a) if (!(a = (struct SOAP_ENV__Reason **)soap_malloc(soap, sizeof(struct SOAP_ENV__Reason *)))) return NULL; *a = NULL; if (!soap->null && *soap->href != '#') { soap_revert(soap); if (!(*a = soap_in_SOAP_ENV__Reason(soap, tag, *a, type))) return NULL; } else { a = (struct SOAP_ENV__Reason **)soap_id_lookup(soap, soap->href, (void**)a, SOAP_TYPE_SOAP_ENV__Reason, sizeof(struct SOAP_ENV__Reason), 0, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerToSOAP_ENV__Reason(struct soap *soap, struct SOAP_ENV__Reason *const*a, const char *tag, const char *type) { if (soap_out_PointerToSOAP_ENV__Reason(soap, tag?tag:"SOAP-ENV:Reason", -2, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct SOAP_ENV__Reason ** SOAP_FMAC4 soap_get_PointerToSOAP_ENV__Reason(struct soap *soap, struct SOAP_ENV__Reason **p, const char *tag, const char *type) { if ((p = soap_in_PointerToSOAP_ENV__Reason(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } #endif #ifndef WITH_NOGLOBAL SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToSOAP_ENV__Detail(struct soap *soap, struct SOAP_ENV__Detail *const*a) { (void)soap; (void)a; /* appease -Wall -Werror */ #ifndef WITH_NOIDREF if (!soap_reference(soap, *a, SOAP_TYPE_SOAP_ENV__Detail)) soap_serialize_SOAP_ENV__Detail(soap, *a); #endif } SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerToSOAP_ENV__Detail(struct soap *soap, const char *tag, int id, struct SOAP_ENV__Detail *const*a, const char *type) { id = soap_element_id(soap, tag, id, *a, NULL, 0, type, SOAP_TYPE_SOAP_ENV__Detail, NULL); if (id < 0) return soap->error; return soap_out_SOAP_ENV__Detail(soap, tag, id, *a, type); } SOAP_FMAC3 struct SOAP_ENV__Detail ** SOAP_FMAC4 soap_in_PointerToSOAP_ENV__Detail(struct soap *soap, const char *tag, struct SOAP_ENV__Detail **a, const char *type) { (void)type; /* appease -Wall -Werror */ if (soap_element_begin_in(soap, tag, 1, NULL)) return NULL; if (!a) if (!(a = (struct SOAP_ENV__Detail **)soap_malloc(soap, sizeof(struct SOAP_ENV__Detail *)))) return NULL; *a = NULL; if (!soap->null && *soap->href != '#') { soap_revert(soap); if (!(*a = soap_in_SOAP_ENV__Detail(soap, tag, *a, type))) return NULL; } else { a = (struct SOAP_ENV__Detail **)soap_id_lookup(soap, soap->href, (void**)a, SOAP_TYPE_SOAP_ENV__Detail, sizeof(struct SOAP_ENV__Detail), 0, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerToSOAP_ENV__Detail(struct soap *soap, struct SOAP_ENV__Detail *const*a, const char *tag, const char *type) { if (soap_out_PointerToSOAP_ENV__Detail(soap, tag?tag:"SOAP-ENV:Detail", -2, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct SOAP_ENV__Detail ** SOAP_FMAC4 soap_get_PointerToSOAP_ENV__Detail(struct soap *soap, struct SOAP_ENV__Detail **p, const char *tag, const char *type) { if ((p = soap_in_PointerToSOAP_ENV__Detail(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } #endif #ifndef WITH_NOGLOBAL SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToSOAP_ENV__Code(struct soap *soap, struct SOAP_ENV__Code *const*a) { (void)soap; (void)a; /* appease -Wall -Werror */ #ifndef WITH_NOIDREF if (!soap_reference(soap, *a, SOAP_TYPE_SOAP_ENV__Code)) soap_serialize_SOAP_ENV__Code(soap, *a); #endif } SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerToSOAP_ENV__Code(struct soap *soap, const char *tag, int id, struct SOAP_ENV__Code *const*a, const char *type) { char *mark; id = soap_element_id(soap, tag, id, *a, NULL, 0, type, SOAP_TYPE_SOAP_ENV__Code, &mark); if (id < 0) return soap->error; soap_out_SOAP_ENV__Code(soap, tag, id, *a, type); soap_unmark(soap, mark); return soap->error; } SOAP_FMAC3 struct SOAP_ENV__Code ** SOAP_FMAC4 soap_in_PointerToSOAP_ENV__Code(struct soap *soap, const char *tag, struct SOAP_ENV__Code **a, const char *type) { (void)type; /* appease -Wall -Werror */ if (soap_element_begin_in(soap, tag, 1, NULL)) return NULL; if (!a) if (!(a = (struct SOAP_ENV__Code **)soap_malloc(soap, sizeof(struct SOAP_ENV__Code *)))) return NULL; *a = NULL; if (!soap->null && *soap->href != '#') { soap_revert(soap); if (!(*a = soap_in_SOAP_ENV__Code(soap, tag, *a, type))) return NULL; } else { a = (struct SOAP_ENV__Code **)soap_id_lookup(soap, soap->href, (void**)a, SOAP_TYPE_SOAP_ENV__Code, sizeof(struct SOAP_ENV__Code), 0, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerToSOAP_ENV__Code(struct soap *soap, struct SOAP_ENV__Code *const*a, const char *tag, const char *type) { if (soap_out_PointerToSOAP_ENV__Code(soap, tag?tag:"SOAP-ENV:Code", -2, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct SOAP_ENV__Code ** SOAP_FMAC4 soap_get_PointerToSOAP_ENV__Code(struct soap *soap, struct SOAP_ENV__Code **p, const char *tag, const char *type) { if ((p = soap_in_PointerToSOAP_ENV__Code(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } #endif SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTodouble(struct soap *soap, double *const*a) { (void)soap; (void)a; /* appease -Wall -Werror */ #ifndef WITH_NOIDREF soap_reference(soap, *a, SOAP_TYPE_double); #endif } SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTodouble(struct soap *soap, const char *tag, int id, double *const*a, const char *type) { id = soap_element_id(soap, tag, id, *a, NULL, 0, type, SOAP_TYPE_double, NULL); if (id < 0) return soap->error; return soap_out_double(soap, tag, id, *a, type); } SOAP_FMAC3 double ** SOAP_FMAC4 soap_in_PointerTodouble(struct soap *soap, const char *tag, double **a, const char *type) { (void)type; /* appease -Wall -Werror */ if (soap_element_begin_in(soap, tag, 1, NULL)) return NULL; if (!a) if (!(a = (double **)soap_malloc(soap, sizeof(double *)))) return NULL; *a = NULL; if (!soap->null && *soap->href != '#') { soap_revert(soap); if (!(*a = soap_in_double(soap, tag, *a, type))) return NULL; } else { a = (double **)soap_id_lookup(soap, soap->href, (void**)a, SOAP_TYPE_double, sizeof(double), 0, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTodouble(struct soap *soap, double *const*a, const char *tag, const char *type) { if (soap_out_PointerTodouble(soap, tag?tag:"double", -2, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 double ** SOAP_FMAC4 soap_get_PointerTodouble(struct soap *soap, double **p, const char *tag, const char *type) { if ((p = soap_in_PointerTodouble(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__QName(struct soap *soap, char *const*a) { (void)soap; (void)a; /* appease -Wall -Werror */ #ifndef WITH_NOIDREF soap_reference(soap, *a, SOAP_TYPE__QName); #endif } SOAP_FMAC3 int SOAP_FMAC4 soap_out__QName(struct soap *soap, const char *tag, int id, char *const*a, const char *type) { return soap_outstring(soap, tag, id, a, type, SOAP_TYPE__QName); } SOAP_FMAC3 char * * SOAP_FMAC4 soap_in__QName(struct soap *soap, const char *tag, char **a, const char *type) { a = soap_instring(soap, tag, a, type, SOAP_TYPE__QName, 2, 0, -1, NULL); return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put__QName(struct soap *soap, char *const*a, const char *tag, const char *type) { if (soap_out__QName(soap, tag?tag:"QName", -2, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 char ** SOAP_FMAC4 soap_get__QName(struct soap *soap, char **p, const char *tag, const char *type) { if ((p = soap_in__QName(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC3 void SOAP_FMAC4 soap_default_string(struct soap *soap, char **a) { (void)soap; /* appease -Wall -Werror */ #ifdef SOAP_DEFAULT_string *a = SOAP_DEFAULT_string; #else *a = (char *)0; #endif } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_string(struct soap *soap, char *const*a) { (void)soap; (void)a; /* appease -Wall -Werror */ #ifndef WITH_NOIDREF soap_reference(soap, *a, SOAP_TYPE_string); #endif } SOAP_FMAC3 int SOAP_FMAC4 soap_out_string(struct soap *soap, const char *tag, int id, char *const*a, const char *type) { return soap_outstring(soap, tag, id, a, type, SOAP_TYPE_string); } SOAP_FMAC3 char * * SOAP_FMAC4 soap_in_string(struct soap *soap, const char *tag, char **a, const char *type) { a = soap_instring(soap, tag, a, type, SOAP_TYPE_string, 1, 0, -1, NULL); return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_string(struct soap *soap, char *const*a, const char *tag, const char *type) { if (soap_out_string(soap, tag?tag:"string", -2, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 char ** SOAP_FMAC4 soap_get_string(struct soap *soap, char **p, const char *tag, const char *type) { if ((p = soap_in_string(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } #if defined(__BORLANDC__) #pragma option pop #pragma option pop #endif /* End of soapC.cpp */ gsoap-2.8.28/gsoap/samples/calc_vs2005/calc_vs2005/soapStub.h0000644000175000017500000002756612653650154022703 0ustar ellertellert/* soapStub.h Generated by gSOAP 2.8.28 from calc.h gSOAP XML Web services tools Copyright (C) 2000-2016, Robert van Engelen, Genivia Inc. All Rights Reserved. The soapcpp2 tool and its generated software are released under the GPL. This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #ifndef soapStub_H #define soapStub_H #include "stdsoap2.h" #if GSOAP_VERSION != 20828 # error "GSOAP VERSION 20828 MISMATCH IN GENERATED CODE VERSUS LIBRARY CODE: PLEASE REINSTALL PACKAGE" #endif /******************************************************************************\ * * * Enumerations * * * \******************************************************************************/ /******************************************************************************\ * * * Types with Custom Serializers * * * \******************************************************************************/ /******************************************************************************\ * * * Classes, Structs, and Unions * * * \******************************************************************************/ struct ns__addResponse; /* calc.h:97 */ struct ns__add; /* calc.h:97 */ struct ns__subResponse; /* calc.h:100 */ struct ns__sub; /* calc.h:100 */ struct ns__mulResponse; /* calc.h:103 */ struct ns__mul; /* calc.h:103 */ struct ns__divResponse; /* calc.h:106 */ struct ns__div; /* calc.h:106 */ struct ns__powResponse; /* calc.h:109 */ struct ns__pow; /* calc.h:109 */ /* calc.h:97 */ #ifndef SOAP_TYPE_ns__addResponse #define SOAP_TYPE_ns__addResponse (10) /* ns:addResponse complex type: */ struct ns__addResponse { public: double *result; /* SOAP 1.2 RPC return element (when namespace qualified) */ /* optional element of XSD type xsd:double */ public: int soap_type() const { return 10; } /* = unique type id SOAP_TYPE_ns__addResponse */ ns__addResponse(); friend SOAP_FMAC1 ns__addResponse * SOAP_FMAC2 soap_instantiate_ns__addResponse(struct soap*, int, const char*, const char*, size_t*); }; #endif /* calc.h:97 */ #ifndef SOAP_TYPE_ns__add #define SOAP_TYPE_ns__add (11) /* ns:add complex type: */ struct ns__add { public: double a; /* required element of XSD type xsd:double */ double b; /* required element of XSD type xsd:double */ public: int soap_type() const { return 11; } /* = unique type id SOAP_TYPE_ns__add */ ns__add(); friend SOAP_FMAC1 ns__add * SOAP_FMAC2 soap_instantiate_ns__add(struct soap*, int, const char*, const char*, size_t*); }; #endif /* calc.h:100 */ #ifndef SOAP_TYPE_ns__subResponse #define SOAP_TYPE_ns__subResponse (13) /* ns:subResponse complex type: */ struct ns__subResponse { public: double *result; /* SOAP 1.2 RPC return element (when namespace qualified) */ /* optional element of XSD type xsd:double */ public: int soap_type() const { return 13; } /* = unique type id SOAP_TYPE_ns__subResponse */ ns__subResponse(); friend SOAP_FMAC1 ns__subResponse * SOAP_FMAC2 soap_instantiate_ns__subResponse(struct soap*, int, const char*, const char*, size_t*); }; #endif /* calc.h:100 */ #ifndef SOAP_TYPE_ns__sub #define SOAP_TYPE_ns__sub (14) /* ns:sub complex type: */ struct ns__sub { public: double a; /* required element of XSD type xsd:double */ double b; /* required element of XSD type xsd:double */ public: int soap_type() const { return 14; } /* = unique type id SOAP_TYPE_ns__sub */ ns__sub(); friend SOAP_FMAC1 ns__sub * SOAP_FMAC2 soap_instantiate_ns__sub(struct soap*, int, const char*, const char*, size_t*); }; #endif /* calc.h:103 */ #ifndef SOAP_TYPE_ns__mulResponse #define SOAP_TYPE_ns__mulResponse (16) /* ns:mulResponse complex type: */ struct ns__mulResponse { public: double *result; /* SOAP 1.2 RPC return element (when namespace qualified) */ /* optional element of XSD type xsd:double */ public: int soap_type() const { return 16; } /* = unique type id SOAP_TYPE_ns__mulResponse */ ns__mulResponse(); friend SOAP_FMAC1 ns__mulResponse * SOAP_FMAC2 soap_instantiate_ns__mulResponse(struct soap*, int, const char*, const char*, size_t*); }; #endif /* calc.h:103 */ #ifndef SOAP_TYPE_ns__mul #define SOAP_TYPE_ns__mul (17) /* ns:mul complex type: */ struct ns__mul { public: double a; /* required element of XSD type xsd:double */ double b; /* required element of XSD type xsd:double */ public: int soap_type() const { return 17; } /* = unique type id SOAP_TYPE_ns__mul */ ns__mul(); friend SOAP_FMAC1 ns__mul * SOAP_FMAC2 soap_instantiate_ns__mul(struct soap*, int, const char*, const char*, size_t*); }; #endif /* calc.h:106 */ #ifndef SOAP_TYPE_ns__divResponse #define SOAP_TYPE_ns__divResponse (19) /* ns:divResponse complex type: */ struct ns__divResponse { public: double *result; /* SOAP 1.2 RPC return element (when namespace qualified) */ /* optional element of XSD type xsd:double */ public: int soap_type() const { return 19; } /* = unique type id SOAP_TYPE_ns__divResponse */ ns__divResponse(); friend SOAP_FMAC1 ns__divResponse * SOAP_FMAC2 soap_instantiate_ns__divResponse(struct soap*, int, const char*, const char*, size_t*); }; #endif /* calc.h:106 */ #ifndef SOAP_TYPE_ns__div #define SOAP_TYPE_ns__div (20) /* ns:div complex type: */ struct ns__div { public: double a; /* required element of XSD type xsd:double */ double b; /* required element of XSD type xsd:double */ public: int soap_type() const { return 20; } /* = unique type id SOAP_TYPE_ns__div */ ns__div(); friend SOAP_FMAC1 ns__div * SOAP_FMAC2 soap_instantiate_ns__div(struct soap*, int, const char*, const char*, size_t*); }; #endif /* calc.h:109 */ #ifndef SOAP_TYPE_ns__powResponse #define SOAP_TYPE_ns__powResponse (22) /* ns:powResponse complex type: */ struct ns__powResponse { public: double *result; /* SOAP 1.2 RPC return element (when namespace qualified) */ /* optional element of XSD type xsd:double */ public: int soap_type() const { return 22; } /* = unique type id SOAP_TYPE_ns__powResponse */ ns__powResponse(); friend SOAP_FMAC1 ns__powResponse * SOAP_FMAC2 soap_instantiate_ns__powResponse(struct soap*, int, const char*, const char*, size_t*); }; #endif /* calc.h:109 */ #ifndef SOAP_TYPE_ns__pow #define SOAP_TYPE_ns__pow (23) /* ns:pow complex type: */ struct ns__pow { public: double a; /* required element of XSD type xsd:double */ double b; /* required element of XSD type xsd:double */ public: int soap_type() const { return 23; } /* = unique type id SOAP_TYPE_ns__pow */ ns__pow(); friend SOAP_FMAC1 ns__pow * SOAP_FMAC2 soap_instantiate_ns__pow(struct soap*, int, const char*, const char*, size_t*); }; #endif /* calc.h:110 */ #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_SOAP_ENV__Header #define SOAP_TYPE_SOAP_ENV__Header (24) /* SOAP Header: */ struct SOAP_ENV__Header { public: int soap_type() const { return 24; } /* = unique type id SOAP_TYPE_SOAP_ENV__Header */ SOAP_ENV__Header(); friend SOAP_FMAC1 SOAP_ENV__Header * SOAP_FMAC2 soap_instantiate_SOAP_ENV__Header(struct soap*, int, const char*, const char*, size_t*); }; #endif #endif /* calc.h:110 */ #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_SOAP_ENV__Code #define SOAP_TYPE_SOAP_ENV__Code (25) /* Type SOAP_ENV__Code is a recursive data type (in)directly referencing itself through its (base) class members */ /* SOAP Fault Code: */ struct SOAP_ENV__Code { public: char *SOAP_ENV__Value; /* optional element of XSD type xsd:QName */ struct SOAP_ENV__Code *SOAP_ENV__Subcode; /* optional element of XSD type SOAP-ENV:Code */ public: int soap_type() const { return 25; } /* = unique type id SOAP_TYPE_SOAP_ENV__Code */ SOAP_ENV__Code(); friend SOAP_FMAC1 SOAP_ENV__Code * SOAP_FMAC2 soap_instantiate_SOAP_ENV__Code(struct soap*, int, const char*, const char*, size_t*); }; #endif #endif /* calc.h:110 */ #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_SOAP_ENV__Detail #define SOAP_TYPE_SOAP_ENV__Detail (27) /* SOAP-ENV:Detail complex type: */ struct SOAP_ENV__Detail { public: char *__any; int __type; /* any type of element (defined below) WARNING: do not create a cyclic data structure graph throught this element unless SOAP encoding or SOAP_XML_GRAPH are used for id-ref serialization */ void *fault; /* transient (not serialized) */ public: int soap_type() const { return 27; } /* = unique type id SOAP_TYPE_SOAP_ENV__Detail */ SOAP_ENV__Detail(); friend SOAP_FMAC1 SOAP_ENV__Detail * SOAP_FMAC2 soap_instantiate_SOAP_ENV__Detail(struct soap*, int, const char*, const char*, size_t*); }; #endif #endif /* calc.h:110 */ #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_SOAP_ENV__Reason #define SOAP_TYPE_SOAP_ENV__Reason (30) /* SOAP-ENV:Reason complex type: */ struct SOAP_ENV__Reason { public: char *SOAP_ENV__Text; /* optional element of XSD type xsd:string */ public: int soap_type() const { return 30; } /* = unique type id SOAP_TYPE_SOAP_ENV__Reason */ SOAP_ENV__Reason(); friend SOAP_FMAC1 SOAP_ENV__Reason * SOAP_FMAC2 soap_instantiate_SOAP_ENV__Reason(struct soap*, int, const char*, const char*, size_t*); }; #endif #endif /* calc.h:110 */ #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_SOAP_ENV__Fault #define SOAP_TYPE_SOAP_ENV__Fault (31) /* SOAP Fault: */ struct SOAP_ENV__Fault { public: char *faultcode; /* optional element of XSD type xsd:QName */ char *faultstring; /* optional element of XSD type xsd:string */ char *faultactor; /* optional element of XSD type xsd:string */ struct SOAP_ENV__Detail *detail; /* optional element of XSD type SOAP-ENV:Detail */ struct SOAP_ENV__Code *SOAP_ENV__Code; /* optional element of XSD type SOAP-ENV:Code */ struct SOAP_ENV__Reason *SOAP_ENV__Reason; /* optional element of XSD type SOAP-ENV:Reason */ char *SOAP_ENV__Node; /* optional element of XSD type xsd:string */ char *SOAP_ENV__Role; /* optional element of XSD type xsd:string */ struct SOAP_ENV__Detail *SOAP_ENV__Detail; /* optional element of XSD type SOAP-ENV:Detail */ public: int soap_type() const { return 31; } /* = unique type id SOAP_TYPE_SOAP_ENV__Fault */ SOAP_ENV__Fault(); friend SOAP_FMAC1 SOAP_ENV__Fault * SOAP_FMAC2 soap_instantiate_SOAP_ENV__Fault(struct soap*, int, const char*, const char*, size_t*); }; #endif #endif /******************************************************************************\ * * * Typedefs * * * \******************************************************************************/ /* calc.h:97 */ #ifndef SOAP_TYPE__QName #define SOAP_TYPE__QName (5) typedef char *_QName; #endif /* calc.h:97 */ #ifndef SOAP_TYPE__XML #define SOAP_TYPE__XML (6) typedef char *_XML; #endif /******************************************************************************\ * * * Externals * * * \******************************************************************************/ #endif /* End of soapStub.h */ gsoap-2.8.28/gsoap/samples/calc_vs2005/calc_vs2005/soapcalcProxy.cpp0000644000175000017500000003173412653650154024255 0ustar ellertellert/* soapcalcProxy.cpp Generated by gSOAP 2.8.28 from calc.h gSOAP XML Web services tools Copyright (C) 2000-2016, Robert van Engelen, Genivia Inc. All Rights Reserved. The soapcpp2 tool and its generated software are released under the GPL. This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapcalcProxy.h" calcProxy::calcProxy() : soap(SOAP_IO_DEFAULT) { calcProxy_init(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT); } calcProxy::calcProxy(const calcProxy& rhs) { soap_copy_context(this, &rhs); this->soap_endpoint = rhs.soap_endpoint; } calcProxy::calcProxy(const struct soap &_soap) : soap(_soap) { } calcProxy::calcProxy(const char *url) : soap(SOAP_IO_DEFAULT) { calcProxy_init(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT); soap_endpoint = url; } calcProxy::calcProxy(soap_mode iomode) : soap(iomode) { calcProxy_init(iomode, iomode); } calcProxy::calcProxy(const char *url, soap_mode iomode) : soap(iomode) { calcProxy_init(iomode, iomode); soap_endpoint = url; } calcProxy::calcProxy(soap_mode imode, soap_mode omode) : soap(imode, omode) { calcProxy_init(imode, omode); } calcProxy::~calcProxy() { this->destroy(); } void calcProxy::calcProxy_init(soap_mode imode, soap_mode omode) { soap_imode(this, imode); soap_omode(this, omode); soap_endpoint = NULL; static const struct Namespace namespaces[] = { {"SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/", "http://www.w3.org/*/soap-envelope", NULL}, {"SOAP-ENC", "http://schemas.xmlsoap.org/soap/encoding/", "http://www.w3.org/*/soap-encoding", NULL}, {"xsi", "http://www.w3.org/2001/XMLSchema-instance", "http://www.w3.org/*/XMLSchema-instance", NULL}, {"xsd", "http://www.w3.org/2001/XMLSchema", "http://www.w3.org/*/XMLSchema", NULL}, {"ns", "urn:calc", NULL, NULL}, {NULL, NULL, NULL, NULL} }; soap_set_namespaces(this, namespaces); } #ifndef WITH_PURE_VIRTUAL calcProxy *calcProxy::copy() { calcProxy *dup = SOAP_NEW_COPY(calcProxy(*(struct soap*)this)); return dup; } #endif calcProxy& calcProxy::operator=(const calcProxy& rhs) { soap_copy_context(this, &rhs); this->soap_endpoint = rhs.soap_endpoint; return *this; } void calcProxy::destroy() { soap_destroy(this); soap_end(this); } void calcProxy::reset() { this->destroy(); soap_done(this); soap_initialize(this); calcProxy_init(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT); } void calcProxy::soap_noheader() { this->header = NULL; } const SOAP_ENV__Header *calcProxy::soap_header() { return this->header; } const SOAP_ENV__Fault *calcProxy::soap_fault() { return this->fault; } const char *calcProxy::soap_fault_string() { return *soap_faultstring(this); } const char *calcProxy::soap_fault_detail() { return *soap_faultdetail(this); } int calcProxy::soap_close_socket() { return soap_closesock(this); } int calcProxy::soap_force_close_socket() { return soap_force_closesock(this); } void calcProxy::soap_print_fault(FILE *fd) { ::soap_print_fault(this, fd); } #ifndef WITH_LEAN #ifndef WITH_COMPAT void calcProxy::soap_stream_fault(std::ostream& os) { ::soap_stream_fault(this, os); } #endif char *calcProxy::soap_sprint_fault(char *buf, size_t len) { return ::soap_sprint_fault(this, buf, len); } #endif int calcProxy::add(const char *endpoint, const char *soap_action, double a, double b, double *result) { struct soap *soap = this; struct ns__add soap_tmp_ns__add; struct ns__addResponse *soap_tmp_ns__addResponse; if (endpoint) soap_endpoint = endpoint; if (soap_endpoint == NULL) soap_endpoint = "http://websrv.cs.fsu.edu/~engelen/calcserver.cgi"; soap_tmp_ns__add.a = a; soap_tmp_ns__add.b = b; soap_begin(soap); soap->encodingStyle = ""; soap_serializeheader(soap); soap_serialize_ns__add(soap, &soap_tmp_ns__add); if (soap_begin_count(soap)) return soap->error; if (soap->mode & SOAP_IO_LENGTH) { if (soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_put_ns__add(soap, &soap_tmp_ns__add, "ns:add", NULL) || soap_body_end_out(soap) || soap_envelope_end_out(soap)) return soap->error; } if (soap_end_count(soap)) return soap->error; if (soap_connect(soap, soap_url(soap, soap_endpoint, NULL), soap_action) || soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_put_ns__add(soap, &soap_tmp_ns__add, "ns:add", NULL) || soap_body_end_out(soap) || soap_envelope_end_out(soap) || soap_end_send(soap)) return soap_closesock(soap); if (!result) return soap_closesock(soap); soap_default_double(soap, result); if (soap_begin_recv(soap) || soap_envelope_begin_in(soap) || soap_recv_header(soap) || soap_body_begin_in(soap)) return soap_closesock(soap); if (soap_recv_fault(soap, 1)) return soap->error; soap_tmp_ns__addResponse = soap_get_ns__addResponse(soap, NULL, "", NULL); if (!soap_tmp_ns__addResponse || soap->error) return soap_recv_fault(soap, 0); if (soap_body_end_in(soap) || soap_envelope_end_in(soap) || soap_end_recv(soap)) return soap_closesock(soap); if (result && soap_tmp_ns__addResponse->result) *result = *soap_tmp_ns__addResponse->result; return soap_closesock(soap); } int calcProxy::sub(const char *endpoint, const char *soap_action, double a, double b, double *result) { struct soap *soap = this; struct ns__sub soap_tmp_ns__sub; struct ns__subResponse *soap_tmp_ns__subResponse; if (endpoint) soap_endpoint = endpoint; if (soap_endpoint == NULL) soap_endpoint = "http://websrv.cs.fsu.edu/~engelen/calcserver.cgi"; soap_tmp_ns__sub.a = a; soap_tmp_ns__sub.b = b; soap_begin(soap); soap->encodingStyle = ""; soap_serializeheader(soap); soap_serialize_ns__sub(soap, &soap_tmp_ns__sub); if (soap_begin_count(soap)) return soap->error; if (soap->mode & SOAP_IO_LENGTH) { if (soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_put_ns__sub(soap, &soap_tmp_ns__sub, "ns:sub", NULL) || soap_body_end_out(soap) || soap_envelope_end_out(soap)) return soap->error; } if (soap_end_count(soap)) return soap->error; if (soap_connect(soap, soap_url(soap, soap_endpoint, NULL), soap_action) || soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_put_ns__sub(soap, &soap_tmp_ns__sub, "ns:sub", NULL) || soap_body_end_out(soap) || soap_envelope_end_out(soap) || soap_end_send(soap)) return soap_closesock(soap); if (!result) return soap_closesock(soap); soap_default_double(soap, result); if (soap_begin_recv(soap) || soap_envelope_begin_in(soap) || soap_recv_header(soap) || soap_body_begin_in(soap)) return soap_closesock(soap); if (soap_recv_fault(soap, 1)) return soap->error; soap_tmp_ns__subResponse = soap_get_ns__subResponse(soap, NULL, "", NULL); if (!soap_tmp_ns__subResponse || soap->error) return soap_recv_fault(soap, 0); if (soap_body_end_in(soap) || soap_envelope_end_in(soap) || soap_end_recv(soap)) return soap_closesock(soap); if (result && soap_tmp_ns__subResponse->result) *result = *soap_tmp_ns__subResponse->result; return soap_closesock(soap); } int calcProxy::mul(const char *endpoint, const char *soap_action, double a, double b, double *result) { struct soap *soap = this; struct ns__mul soap_tmp_ns__mul; struct ns__mulResponse *soap_tmp_ns__mulResponse; if (endpoint) soap_endpoint = endpoint; if (soap_endpoint == NULL) soap_endpoint = "http://websrv.cs.fsu.edu/~engelen/calcserver.cgi"; soap_tmp_ns__mul.a = a; soap_tmp_ns__mul.b = b; soap_begin(soap); soap->encodingStyle = ""; soap_serializeheader(soap); soap_serialize_ns__mul(soap, &soap_tmp_ns__mul); if (soap_begin_count(soap)) return soap->error; if (soap->mode & SOAP_IO_LENGTH) { if (soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_put_ns__mul(soap, &soap_tmp_ns__mul, "ns:mul", NULL) || soap_body_end_out(soap) || soap_envelope_end_out(soap)) return soap->error; } if (soap_end_count(soap)) return soap->error; if (soap_connect(soap, soap_url(soap, soap_endpoint, NULL), soap_action) || soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_put_ns__mul(soap, &soap_tmp_ns__mul, "ns:mul", NULL) || soap_body_end_out(soap) || soap_envelope_end_out(soap) || soap_end_send(soap)) return soap_closesock(soap); if (!result) return soap_closesock(soap); soap_default_double(soap, result); if (soap_begin_recv(soap) || soap_envelope_begin_in(soap) || soap_recv_header(soap) || soap_body_begin_in(soap)) return soap_closesock(soap); if (soap_recv_fault(soap, 1)) return soap->error; soap_tmp_ns__mulResponse = soap_get_ns__mulResponse(soap, NULL, "", NULL); if (!soap_tmp_ns__mulResponse || soap->error) return soap_recv_fault(soap, 0); if (soap_body_end_in(soap) || soap_envelope_end_in(soap) || soap_end_recv(soap)) return soap_closesock(soap); if (result && soap_tmp_ns__mulResponse->result) *result = *soap_tmp_ns__mulResponse->result; return soap_closesock(soap); } int calcProxy::div(const char *endpoint, const char *soap_action, double a, double b, double *result) { struct soap *soap = this; struct ns__div soap_tmp_ns__div; struct ns__divResponse *soap_tmp_ns__divResponse; if (endpoint) soap_endpoint = endpoint; if (soap_endpoint == NULL) soap_endpoint = "http://websrv.cs.fsu.edu/~engelen/calcserver.cgi"; soap_tmp_ns__div.a = a; soap_tmp_ns__div.b = b; soap_begin(soap); soap->encodingStyle = ""; soap_serializeheader(soap); soap_serialize_ns__div(soap, &soap_tmp_ns__div); if (soap_begin_count(soap)) return soap->error; if (soap->mode & SOAP_IO_LENGTH) { if (soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_put_ns__div(soap, &soap_tmp_ns__div, "ns:div", NULL) || soap_body_end_out(soap) || soap_envelope_end_out(soap)) return soap->error; } if (soap_end_count(soap)) return soap->error; if (soap_connect(soap, soap_url(soap, soap_endpoint, NULL), soap_action) || soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_put_ns__div(soap, &soap_tmp_ns__div, "ns:div", NULL) || soap_body_end_out(soap) || soap_envelope_end_out(soap) || soap_end_send(soap)) return soap_closesock(soap); if (!result) return soap_closesock(soap); soap_default_double(soap, result); if (soap_begin_recv(soap) || soap_envelope_begin_in(soap) || soap_recv_header(soap) || soap_body_begin_in(soap)) return soap_closesock(soap); if (soap_recv_fault(soap, 1)) return soap->error; soap_tmp_ns__divResponse = soap_get_ns__divResponse(soap, NULL, "", NULL); if (!soap_tmp_ns__divResponse || soap->error) return soap_recv_fault(soap, 0); if (soap_body_end_in(soap) || soap_envelope_end_in(soap) || soap_end_recv(soap)) return soap_closesock(soap); if (result && soap_tmp_ns__divResponse->result) *result = *soap_tmp_ns__divResponse->result; return soap_closesock(soap); } int calcProxy::pow(const char *endpoint, const char *soap_action, double a, double b, double *result) { struct soap *soap = this; struct ns__pow soap_tmp_ns__pow; struct ns__powResponse *soap_tmp_ns__powResponse; if (endpoint) soap_endpoint = endpoint; if (soap_endpoint == NULL) soap_endpoint = "http://websrv.cs.fsu.edu/~engelen/calcserver.cgi"; soap_tmp_ns__pow.a = a; soap_tmp_ns__pow.b = b; soap_begin(soap); soap->encodingStyle = ""; soap_serializeheader(soap); soap_serialize_ns__pow(soap, &soap_tmp_ns__pow); if (soap_begin_count(soap)) return soap->error; if (soap->mode & SOAP_IO_LENGTH) { if (soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_put_ns__pow(soap, &soap_tmp_ns__pow, "ns:pow", NULL) || soap_body_end_out(soap) || soap_envelope_end_out(soap)) return soap->error; } if (soap_end_count(soap)) return soap->error; if (soap_connect(soap, soap_url(soap, soap_endpoint, NULL), soap_action) || soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_put_ns__pow(soap, &soap_tmp_ns__pow, "ns:pow", NULL) || soap_body_end_out(soap) || soap_envelope_end_out(soap) || soap_end_send(soap)) return soap_closesock(soap); if (!result) return soap_closesock(soap); soap_default_double(soap, result); if (soap_begin_recv(soap) || soap_envelope_begin_in(soap) || soap_recv_header(soap) || soap_body_begin_in(soap)) return soap_closesock(soap); if (soap_recv_fault(soap, 1)) return soap->error; soap_tmp_ns__powResponse = soap_get_ns__powResponse(soap, NULL, "", NULL); if (!soap_tmp_ns__powResponse || soap->error) return soap_recv_fault(soap, 0); if (soap_body_end_in(soap) || soap_envelope_end_in(soap) || soap_end_recv(soap)) return soap_closesock(soap); if (result && soap_tmp_ns__powResponse->result) *result = *soap_tmp_ns__powResponse->result; return soap_closesock(soap); } /* End of client proxy code */ gsoap-2.8.28/gsoap/samples/calc_vs2005/calc_vs2005/soapcalcProxy.h0000644000175000017500000001007712653650154023717 0ustar ellertellert/* soapcalcProxy.h Generated by gSOAP 2.8.28 from calc.h gSOAP XML Web services tools Copyright (C) 2000-2016, Robert van Engelen, Genivia Inc. All Rights Reserved. The soapcpp2 tool and its generated software are released under the GPL. This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #ifndef soapcalcProxy_H #define soapcalcProxy_H #include "soapH.h" class SOAP_CMAC calcProxy : public soap { public: /// Endpoint URL of service 'calcProxy' (change as needed) const char *soap_endpoint; /// Variables globally declared in calc.h (non-static) /// Constructor calcProxy(); /// Copy constructor calcProxy(const calcProxy& rhs); /// Construct from another engine state calcProxy(const struct soap&); /// Constructor with endpoint URL calcProxy(const char *url); /// Constructor with engine input+output mode control calcProxy(soap_mode iomode); /// Constructor with URL and input+output mode control calcProxy(const char *url, soap_mode iomode); /// Constructor with engine input and output mode control calcProxy(soap_mode imode, soap_mode omode); /// Destructor deletes deserialized data and engine context virtual ~calcProxy(); /// Initializer used by constructors virtual void calcProxy_init(soap_mode imode, soap_mode omode); /// Create a new copy virtual calcProxy *copy() SOAP_PURE_VIRTUAL; /// Copy assignment calcProxy& operator=(const calcProxy&); /// Delete all deserialized data (with soap_destroy and soap_end) virtual void destroy(); /// Delete all deserialized data and reset to default virtual void reset(); /// Disables and removes SOAP Header from message virtual void soap_noheader(); /// Get SOAP Header structure (NULL when absent) virtual const SOAP_ENV__Header *soap_header(); /// Get SOAP Fault structure (NULL when absent) virtual const SOAP_ENV__Fault *soap_fault(); /// Get SOAP Fault string (NULL when absent) virtual const char *soap_fault_string(); /// Get SOAP Fault detail as string (NULL when absent) virtual const char *soap_fault_detail(); /// Close connection (normally automatic, except for send_X ops) virtual int soap_close_socket(); /// Force close connection (can kill a thread blocked on IO) virtual int soap_force_close_socket(); /// Print fault virtual void soap_print_fault(FILE*); #ifndef WITH_LEAN /// Print fault to stream #ifndef WITH_COMPAT virtual void soap_stream_fault(std::ostream&); #endif /// Put fault into buffer virtual char *soap_sprint_fault(char *buf, size_t len); #endif /// Web service operation 'add' (returns error code or SOAP_OK) virtual int add(double a, double b, double *result) { return this->add(NULL, NULL, a, b, result); } virtual int add(const char *endpoint, const char *soap_action, double a, double b, double *result); /// Web service operation 'sub' (returns error code or SOAP_OK) virtual int sub(double a, double b, double *result) { return this->sub(NULL, NULL, a, b, result); } virtual int sub(const char *endpoint, const char *soap_action, double a, double b, double *result); /// Web service operation 'mul' (returns error code or SOAP_OK) virtual int mul(double a, double b, double *result) { return this->mul(NULL, NULL, a, b, result); } virtual int mul(const char *endpoint, const char *soap_action, double a, double b, double *result); /// Web service operation 'div' (returns error code or SOAP_OK) virtual int div(double a, double b, double *result) { return this->div(NULL, NULL, a, b, result); } virtual int div(const char *endpoint, const char *soap_action, double a, double b, double *result); /// Web service operation 'pow' (returns error code or SOAP_OK) virtual int pow(double a, double b, double *result) { return this->pow(NULL, NULL, a, b, result); } virtual int pow(const char *endpoint, const char *soap_action, double a, double b, double *result); }; #endif gsoap-2.8.28/gsoap/samples/calc_vs2005/calc_vs2005/Debug/0000755000175000017500000000000012653650154021740 5ustar ellertellertgsoap-2.8.28/gsoap/samples/calc_vs2005/calc_vs2005/calc.nsmap0000644000175000017500000000101012653650154022644 0ustar ellertellert #include "soapH.h" SOAP_NMAC struct Namespace namespaces[] = { {"SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/", "http://www.w3.org/*/soap-envelope", NULL}, {"SOAP-ENC", "http://schemas.xmlsoap.org/soap/encoding/", "http://www.w3.org/*/soap-encoding", NULL}, {"xsi", "http://www.w3.org/2001/XMLSchema-instance", "http://www.w3.org/*/XMLSchema-instance", NULL}, {"xsd", "http://www.w3.org/2001/XMLSchema", "http://www.w3.org/*/XMLSchema", NULL}, {"ns", "urn:calc", NULL, NULL}, {NULL, NULL, NULL, NULL} }; gsoap-2.8.28/gsoap/samples/calc_vs2005/calc_vs2005/calc.h0000644000175000017500000001041012653650154021761 0ustar ellertellert/* calc.h This is a gSOAP header file with web service definitions. The service operations and type definitions use familiar C/C++ syntax. The following methods are defined by this gSOAP service definition: add(a,b) sub(a,b) mul(a,b) div(a,b) pow(a,b) Compilation in C (see samples/calc): $ soapcpp2 -c calc.h $ cc -o calcclient calcclient.c stdsoap2.c soapC.c soapClient.c $ cc -o calcserver calcserver.c stdsoap2.c soapC.c soapServer.c Compilation in C++ (see samples/calc++): $ soapcpp2 -i calc.h $ cc -o calcclient++ calcclient.cpp stdsoap2.cpp soapC.cpp soapcalcProxy.cpp $ cc -o calcserver++ calcserver.cpp stdsoap2.cpp soapC.cpp soapcalcService.cpp Note that soapcpp2 option -i generates proxy and service classes, which encapsulate the method operations in the class instead of defining them as global functions as in C. The //gsoap directives are used to bind XML namespaces and to define Web service properties: //gsoap service name: //gsoap service style: [rpc|document] //gsoap service encoding: [literal|encoded] //gsoap service namespace: //gsoap service location: Web service operation properties: //gsoap service method-style: [rpc|document] //gsoap service method-encoding: [literal|encoded] //gsoap service method-action: //gsoap service method-documentation: and type schema properties: //gsoap schema namespace: //gsoap schema elementForm: [qualified|unqualified] //gsoap schema attributeForm: [qualified|unqualified] //gsoap schema documentation: //gsoap schema type-documentation: where is an XML namespace prefix, which is used in C/C++ operation names, e.g. ns__add(), and type names, e.g. xsd__int. See the documentation for the full list of //gsoap directives. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap ns service name: calc Simple calculator service //gsoap ns service protocol: SOAP //gsoap ns service style: rpc //gsoap ns service encoding: encoded //gsoap ns service namespace: http://websrv.cs.fsu.edu/~engelen/calc.wsdl //gsoap ns service location: http://websrv.cs.fsu.edu/~engelen/calcserver.cgi //gsoap ns schema namespace: urn:calc //gsoap ns service method-documentation: add Sums two values int ns__add(double a, double b, double *result); //gsoap ns service method-documentation: sub Subtracts two values int ns__sub(double a, double b, double *result); //gsoap ns service method-documentation: mul Multiplies two values int ns__mul(double a, double b, double *result); //gsoap ns service method-documentation: div Divides two values int ns__div(double a, double b, double *result); //gsoap ns service method-documentation: pow Raises a to b int ns__pow(double a, double b, double *result); gsoap-2.8.28/gsoap/samples/calc_vs2005/calc_vs2005/calcclient.cpp0000644000175000017500000000512012653650154023515 0ustar ellertellert/* calcclient.cpp Example calculator service client in C++ Service definitions in calc.h (not generated by wsdl2h, but similar) $ soapcpp2 -i calc.h $ cc -o calcclient calcclient.cpp stdsoap2.cpp soapC.cpp soapcalcProxy.cpp where stdsoap2.cpp is in the 'gsoap' directory, or use libgsoap++: $ cc -o calcclient calcclient.cpp soapC.cpp soapcalcProxy.cpp -lgsoap++ -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapcalcProxy.h" #include "calc.nsmap" const char server[] = "http://websrv.cs.fsu.edu/~engelen/calcserver.cgi"; int main(int argc, char **argv) { if (argc < 4) { fprintf(stderr, "Usage: [add|sub|mul|div|pow] num num\n"); exit(0); } double a, b, result; a = strtod(argv[2], NULL); b = strtod(argv[3], NULL); calcProxy calc; calc.soap_endpoint = server; switch (*argv[1]) { case 'a': calc.add(a, b, &result); break; case 's': calc.sub(a, b, &result); break; case 'm': calc.mul(a, b, &result); break; case 'd': calc.div(a, b, &result); break; case 'p': calc.pow(a, b, &result); break; default: fprintf(stderr, "Unknown command\n"); exit(0); } if (calc.error) calc.soap_stream_fault(std::cerr); else printf("result = %g\n", result); return 0; } gsoap-2.8.28/gsoap/samples/calc_vs2005/calc_vs2005/stdsoap2.cpp0000644000175000017500000203723112653650154023165 0ustar ellertellert/* stdsoap2.c[pp] 2.8.28 gSOAP runtime engine gSOAP XML Web services tools Copyright (C) 2000-2016, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under ONE of the following licenses: GPL, or the gSOAP public license, or Genivia's license for commercial use. -------------------------------------------------------------------------------- Contributors: Wind River Systems Inc., for the following additions under gSOAP public license: - vxWorks compatible options -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2014, Robert van Engelen, Genivia Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #define GSOAP_LIB_VERSION 20828 #ifdef AS400 # pragma convert(819) /* EBCDIC to ASCII */ #endif #include "stdsoap2.h" #if GSOAP_VERSION != GSOAP_LIB_VERSION # error "GSOAP VERSION MISMATCH IN LIBRARY: PLEASE REINSTALL PACKAGE" #endif #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE) # include #endif #ifdef __BORLANDC__ # pragma warn -8060 #else # ifdef WIN32 # ifdef UNDER_CE # pragma comment(lib, "ws2.lib") /* WinCE */ # else # pragma comment(lib, "Ws2_32.lib") # endif # pragma warning(disable : 4996) /* disable deprecation warnings */ # endif #endif #ifdef __cplusplus SOAP_SOURCE_STAMP("@(#) stdsoap2.cpp ver 2.8.28 2016-02-01 00:00:00 GMT") extern "C" { #else SOAP_SOURCE_STAMP("@(#) stdsoap2.c ver 2.8.28 2016-02-01 00:00:00 GMT") #endif /* 8bit character representing unknown character entity or multibyte data */ #ifndef SOAP_UNKNOWN_CHAR # define SOAP_UNKNOWN_CHAR (0x7F) #endif /* unicode character representing unknown characters outside the XML 1.0 UTF8 unicode space */ #ifdef WITH_REPLACE_ILLEGAL_UTF8 # ifndef SOAP_UNKNOWN_UNICODE_CHAR # define SOAP_UNKNOWN_UNICODE_CHAR (0xFFFD) # endif #endif /* EOF=-1 */ #define SOAP_LT (soap_wchar)(-2) /* XML-specific '<' */ #define SOAP_TT (soap_wchar)(-3) /* XML-specific '' */ #define SOAP_QT (soap_wchar)(-5) /* XML-specific '"' */ #define SOAP_AP (soap_wchar)(-6) /* XML-specific ''' */ #define soap_blank(c) ((c)+1 > 0 && (c) <= 32) #define soap_notblank(c) ((c) > 32) #if defined(WIN32) && !defined(UNDER_CE) #define soap_hash_ptr(p) ((PtrToUlong(p) >> 3) & (SOAP_PTRHASH - 1)) #else #define soap_hash_ptr(p) ((size_t)(((unsigned long)(p) >> 3) & (SOAP_PTRHASH-1))) #endif #if !defined(WITH_LEAN) || defined(SOAP_DEBUG) static void soap_init_logs(struct soap*); #endif #ifdef SOAP_DEBUG static void soap_close_logfile(struct soap*, int); static void soap_set_logfile(struct soap*, int, const char*); #endif #ifdef SOAP_MEM_DEBUG static void soap_init_mht(struct soap*); static void soap_free_mht(struct soap*); static void soap_track_unlink(struct soap*, const void*); #endif #ifndef PALM_2 static int soap_set_error(struct soap*, const char*, const char*, const char*, const char*, int); static int soap_copy_fault(struct soap*, const char*, const char*, const char*, const char*); static int soap_getattrval(struct soap*, char*, size_t*, soap_wchar); #endif #ifndef PALM_1 static void soap_free_ns(struct soap *soap); static soap_wchar soap_char(struct soap*); static soap_wchar soap_get_pi(struct soap*); static int soap_isxdigit(int); static void *fplugin(struct soap*, const char*); static size_t soap_count_attachments(struct soap *soap); static int soap_try_connect_command(struct soap*, int http_command, const char *endpoint, const char *action); #ifdef WITH_NTLM static int soap_ntlm_handshake(struct soap *soap, int command, const char *endpoint, const char *host, int port); #endif #ifndef WITH_NOIDREF static int soap_has_copies(struct soap*, const char*, const char*); static int soap_type_punned(struct soap*, const struct soap_ilist*); static int soap_is_shaky(struct soap*, void*); static void soap_init_iht(struct soap*); static void soap_free_iht(struct soap*); #endif static void soap_init_pht(struct soap*); static void soap_free_pht(struct soap*); #endif #ifndef WITH_LEAN static const char *soap_set_validation_fault(struct soap*, const char*, const char*); static int soap_isnumeric(struct soap*, const char*); static struct soap_nlist *soap_push_ns(struct soap *soap, const char *id, const char *ns, short utilized); static void soap_utilize_ns(struct soap *soap, const char *tag); static const wchar_t* soap_wstring(struct soap *soap, const char *s, long minlen, long maxlen); #endif #ifndef PALM_2 static const char* soap_string(struct soap *soap, const char *s, long minlen, long maxlen); static const char* soap_QName(struct soap *soap, const char *s, long minlen, long maxlen); #endif #ifndef WITH_LEANER #ifndef PALM_1 static struct soap_multipart *soap_new_multipart(struct soap*, struct soap_multipart**, struct soap_multipart**, char*, size_t); static int soap_putdimefield(struct soap*, const char*, size_t); static char *soap_getdimefield(struct soap*, size_t); static void soap_select_mime_boundary(struct soap*); static int soap_valid_mime_boundary(struct soap*); static void soap_resolve_attachment(struct soap*, struct soap_multipart*); #endif #endif #ifdef WITH_GZIP static int soap_getgziphdr(struct soap*); #endif #ifdef WITH_OPENSSL # ifndef SOAP_SSL_RSA_BITS # define SOAP_SSL_RSA_BITS 2048 # endif static int soap_ssl_init_done = 0; static int ssl_auth_init(struct soap*); static int ssl_verify_callback(int, X509_STORE_CTX*); static int ssl_verify_callback_allow_expired_certificate(int, X509_STORE_CTX*); static int ssl_password(char*, int, int, void *); #endif #ifdef WITH_GNUTLS # ifndef SOAP_SSL_RSA_BITS # define SOAP_SSL_RSA_BITS 2048 # endif static int soap_ssl_init_done = 0; static int ssl_auth_init(struct soap*); static const char *ssl_verify(struct soap *soap, const char *host); # if defined(HAVE_PTHREAD_H) # include /* make GNUTLS thread safe with pthreads */ GCRY_THREAD_OPTION_PTHREAD_IMPL; # elif defined(HAVE_PTH_H) #include /* make GNUTLS thread safe with PTH */ GCRY_THREAD_OPTION_PTH_IMPL; # endif #endif #ifdef WITH_SYSTEMSSL static int ssl_auth_init(struct soap*); static int ssl_recv(int sk, void *s, int n, char *user); static int ssl_send(int sk, void *s, int n, char *user); #endif #if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) #ifndef PALM_1 static const char *soap_decode(char*, size_t, const char*, const char*); #endif #endif #ifndef WITH_NOHTTP #ifndef PALM_1 static soap_wchar soap_getchunkchar(struct soap*); static const char *http_error(struct soap*, int); static int http_get(struct soap*); static int http_405(struct soap*); static int http_200(struct soap*); static int http_post(struct soap*, const char*, const char*, int, const char*, const char*, size_t); static int http_send_header(struct soap*, const char*); static int http_post_header(struct soap*, const char*, const char*); static int http_response(struct soap*, int, size_t); static int http_parse(struct soap*); static int http_parse_header(struct soap*, const char*, const char*); #endif #endif #ifndef WITH_NOIO #ifndef PALM_1 static int fsend(struct soap*, const char*, size_t); static size_t frecv(struct soap*, char*, size_t); static int tcp_init(struct soap*); static const char *tcp_error(struct soap*); #ifndef WITH_IPV6 static int tcp_gethost(struct soap*, const char *addr, struct in_addr *inaddr); #endif static SOAP_SOCKET tcp_connect(struct soap*, const char *endpoint, const char *host, int port); static SOAP_SOCKET tcp_accept(struct soap*, SOAP_SOCKET, struct sockaddr*, int*); static int tcp_select(struct soap*, SOAP_SOCKET, int, int); static int tcp_disconnect(struct soap*); static int tcp_closesocket(struct soap*, SOAP_SOCKET); static int tcp_shutdownsocket(struct soap*, SOAP_SOCKET, int); static const char *soap_strerror(struct soap*); #endif #define SOAP_TCP_SELECT_RCV 0x1 #define SOAP_TCP_SELECT_SND 0x2 #define SOAP_TCP_SELECT_ERR 0x4 #define SOAP_TCP_SELECT_ALL 0x7 #if defined(WIN32) #define SOAP_SOCKBLOCK(fd) \ { u_long blocking = 0; \ ioctlsocket(fd, FIONBIO, &blocking); \ } #define SOAP_SOCKNONBLOCK(fd) \ { u_long nonblocking = 1; \ ioctlsocket(fd, FIONBIO, &nonblocking); \ } #elif defined(VXWORKS) #define SOAP_SOCKBLOCK(fd) \ { u_long blocking = 0; \ ioctl(fd, FIONBIO, (int)(&blocking)); \ } #define SOAP_SOCKNONBLOCK(fd) \ { u_long nonblocking = 1; \ ioctl(fd, FIONBIO, (int)(&nonblocking)); \ } #elif defined(__VMS) #define SOAP_SOCKBLOCK(fd) \ { int blocking = 0; \ ioctl(fd, FIONBIO, &blocking); \ } #define SOAP_SOCKNONBLOCK(fd) \ { int nonblocking = 1; \ ioctl(fd, FIONBIO, &nonblocking); \ } #elif defined(PALM) #define SOAP_SOCKBLOCK(fd) fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0)&~O_NONBLOCK); #define SOAP_SOCKNONBLOCK(fd) fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0)|O_NONBLOCK); #elif defined(SYMBIAN) #define SOAP_SOCKBLOCK(fd) \ { long blocking = 0; \ ioctl(fd, 0/*FIONBIO*/, &blocking); \ } #define SOAP_SOCKNONBLOCK(fd) \ { long nonblocking = 1; \ ioctl(fd, 0/*FIONBIO*/, &nonblocking); \ } #else #define SOAP_SOCKBLOCK(fd) fcntl(fd, F_SETFL, fcntl(fd, F_GETFL)&~O_NONBLOCK); #define SOAP_SOCKNONBLOCK(fd) fcntl(fd, F_SETFL, fcntl(fd, F_GETFL)|O_NONBLOCK); #endif #endif #if defined(PALM) && !defined(PALM_2) unsigned short errno; #endif #ifndef PALM_1 static const char soap_env1[42] = "http://schemas.xmlsoap.org/soap/envelope/"; static const char soap_enc1[42] = "http://schemas.xmlsoap.org/soap/encoding/"; static const char soap_env2[40] = "http://www.w3.org/2003/05/soap-envelope"; static const char soap_enc2[40] = "http://www.w3.org/2003/05/soap-encoding"; static const char soap_rpc[35] = "http://www.w3.org/2003/05/soap-rpc"; #endif #ifndef PALM_1 const union soap_double_nan soap_double_nan = {{0xFFFFFFFF, 0xFFFFFFFF}}; const char soap_base64o[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; const char soap_base64i[81] = "\76XXX\77\64\65\66\67\70\71\72\73\74\75XXXXXXX\00\01\02\03\04\05\06\07\10\11\12\13\14\15\16\17\20\21\22\23\24\25\26\27\30\31XXXXXX\32\33\34\35\36\37\40\41\42\43\44\45\46\47\50\51\52\53\54\55\56\57\60\61\62\63"; #endif #ifndef WITH_LEAN static const char soap_indent[21] = "\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"; /* Alternative indentation form for SOAP_XML_INDENT: static const char soap_indent[41] = "\n "; */ #endif #ifndef SOAP_CANARY # define SOAP_CANARY (0xC0DE) #endif static const char soap_padding[4] = "\0\0\0"; #define SOAP_STR_PADDING (soap_padding) #define SOAP_STR_EOS (soap_padding) #define SOAP_NON_NULL (soap_padding) #ifndef WITH_LEAN static const struct soap_code_map html_entity_codes[] = /* entities for XHTML parsing */ { { 160, "nbsp" }, { 161, "iexcl" }, { 162, "cent" }, { 163, "pound" }, { 164, "curren" }, { 165, "yen" }, { 166, "brvbar" }, { 167, "sect" }, { 168, "uml" }, { 169, "copy" }, { 170, "ordf" }, { 171, "laquo" }, { 172, "not" }, { 173, "shy" }, { 174, "reg" }, { 175, "macr" }, { 176, "deg" }, { 177, "plusmn" }, { 178, "sup2" }, { 179, "sup3" }, { 180, "acute" }, { 181, "micro" }, { 182, "para" }, { 183, "middot" }, { 184, "cedil" }, { 185, "sup1" }, { 186, "ordm" }, { 187, "raquo" }, { 188, "frac14" }, { 189, "frac12" }, { 190, "frac34" }, { 191, "iquest" }, { 192, "Agrave" }, { 193, "Aacute" }, { 194, "Acirc" }, { 195, "Atilde" }, { 196, "Auml" }, { 197, "Aring" }, { 198, "AElig" }, { 199, "Ccedil" }, { 200, "Egrave" }, { 201, "Eacute" }, { 202, "Ecirc" }, { 203, "Euml" }, { 204, "Igrave" }, { 205, "Iacute" }, { 206, "Icirc" }, { 207, "Iuml" }, { 208, "ETH" }, { 209, "Ntilde" }, { 210, "Ograve" }, { 211, "Oacute" }, { 212, "Ocirc" }, { 213, "Otilde" }, { 214, "Ouml" }, { 215, "times" }, { 216, "Oslash" }, { 217, "Ugrave" }, { 218, "Uacute" }, { 219, "Ucirc" }, { 220, "Uuml" }, { 221, "Yacute" }, { 222, "THORN" }, { 223, "szlig" }, { 224, "agrave" }, { 225, "aacute" }, { 226, "acirc" }, { 227, "atilde" }, { 228, "auml" }, { 229, "aring" }, { 230, "aelig" }, { 231, "ccedil" }, { 232, "egrave" }, { 233, "eacute" }, { 234, "ecirc" }, { 235, "euml" }, { 236, "igrave" }, { 237, "iacute" }, { 238, "icirc" }, { 239, "iuml" }, { 240, "eth" }, { 241, "ntilde" }, { 242, "ograve" }, { 243, "oacute" }, { 244, "ocirc" }, { 245, "otilde" }, { 246, "ouml" }, { 247, "divide" }, { 248, "oslash" }, { 249, "ugrave" }, { 250, "uacute" }, { 251, "ucirc" }, { 252, "uuml" }, { 253, "yacute" }, { 254, "thorn" }, { 255, "yuml" }, { 0, NULL } }; #endif #ifndef WITH_NOIO #ifndef WITH_LEAN static const struct soap_code_map h_error_codes[] = { #ifdef HOST_NOT_FOUND { HOST_NOT_FOUND, "Host not found" }, #endif #ifdef TRY_AGAIN { TRY_AGAIN, "Try Again" }, #endif #ifdef NO_RECOVERY { NO_RECOVERY, "No Recovery" }, #endif #ifdef NO_DATA { NO_DATA, "No Data" }, #endif #ifdef NO_ADDRESS { NO_ADDRESS, "No Address" }, #endif { 0, NULL } }; #endif #endif #ifndef WITH_NOHTTP #ifndef WITH_LEAN static const struct soap_code_map h_http_error_codes[] = { { 200, "OK" }, { 201, "Created" }, { 202, "Accepted" }, { 203, "Non-Authoritative Information" }, { 204, "No Content" }, { 205, "Reset Content" }, { 206, "Partial Content" }, { 300, "Multiple Choices" }, { 301, "Moved Permanently" }, { 302, "Found" }, { 303, "See Other" }, { 304, "Not Modified" }, { 305, "Use Proxy" }, { 307, "Temporary Redirect" }, { 400, "Bad Request" }, { 401, "Unauthorized" }, { 402, "Payment Required" }, { 403, "Forbidden" }, { 404, "Not Found" }, { 405, "Method Not Allowed" }, { 406, "Not Acceptable" }, { 407, "Proxy Authentication Required" }, { 408, "Request Time-out" }, { 409, "Conflict" }, { 410, "Gone" }, { 411, "Length Required" }, { 412, "Precondition Failed" }, { 413, "Request Entity Too Large" }, { 414, "Request-URI Too Large" }, { 415, "Unsupported Media Type" }, { 416, "Requested range not satisfiable" }, { 417, "Expectation Failed" }, { 500, "Internal Server Error" }, { 501, "Not Implemented" }, { 502, "Bad Gateway" }, { 503, "Service Unavailable" }, { 504, "Gateway Time-out" }, { 505, "HTTP Version not supported" }, { 0, NULL } }; #endif #endif #ifdef WITH_OPENSSL static const struct soap_code_map h_ssl_error_codes[] = { #define _SSL_ERROR(e) { e, #e } _SSL_ERROR(SSL_ERROR_SSL), _SSL_ERROR(SSL_ERROR_ZERO_RETURN), _SSL_ERROR(SSL_ERROR_WANT_READ), _SSL_ERROR(SSL_ERROR_WANT_WRITE), _SSL_ERROR(SSL_ERROR_WANT_CONNECT), _SSL_ERROR(SSL_ERROR_WANT_X509_LOOKUP), _SSL_ERROR(SSL_ERROR_SYSCALL), { 0, NULL } }; #endif #ifndef WITH_LEANER static const struct soap_code_map mime_codes[] = { { SOAP_MIME_7BIT, "7bit" }, { SOAP_MIME_8BIT, "8bit" }, { SOAP_MIME_BINARY, "binary" }, { SOAP_MIME_QUOTED_PRINTABLE, "quoted-printable" }, { SOAP_MIME_BASE64, "base64" }, { SOAP_MIME_IETF_TOKEN, "ietf-token" }, { SOAP_MIME_X_TOKEN, "x-token" }, { 0, NULL } }; #endif #ifdef WIN32 static int tcp_done = 0; #endif #if defined(HP_UX) && defined(HAVE_GETHOSTBYNAME_R) extern int h_errno; #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 static int fsend(struct soap *soap, const char *s, size_t n) { int nwritten, err; SOAP_SOCKET sk; #if defined(__cplusplus) && !defined(WITH_COMPAT) if (soap->os) { soap->os->write(s, (std::streamsize)n); if (soap->os->good()) return SOAP_OK; soap->errnum = 0; return SOAP_EOF; } #endif sk = soap->sendsk; if (!soap_valid_socket(sk)) sk = soap->socket; while (n) { if (soap_valid_socket(sk)) { if (soap->send_timeout) { for (;;) { int r; #ifdef WITH_OPENSSL if (soap->ssl) r = tcp_select(soap, sk, SOAP_TCP_SELECT_ALL, soap->send_timeout); else #endif #ifdef WITH_GNUTLS if (soap->session) r = tcp_select(soap, sk, SOAP_TCP_SELECT_ALL, soap->send_timeout); else #endif #ifdef WITH_SYSTEMSSL if (soap->ssl) r = tcp_select(soap, sk, SOAP_TCP_SELECT_ALL, soap->send_timeout); else #endif r = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, soap->send_timeout); if (r > 0) break; if (!r) return SOAP_EOF; err = soap->errnum; if (!err) return soap->error; if (err != SOAP_EAGAIN && err != SOAP_EWOULDBLOCK) return SOAP_EOF; } } #ifdef WITH_OPENSSL if (soap->ssl) nwritten = SSL_write(soap->ssl, s, (int)n); else if (soap->bio) nwritten = BIO_write(soap->bio, s, (int)n); else #endif #ifdef WITH_GNUTLS if (soap->session) nwritten = gnutls_record_send(soap->session, s, n); else #endif #ifdef WITH_SYSTEMSSL if (soap->ssl) { err = gsk_secure_socket_write(soap->ssl, (char*)s, n, &nwritten); if (err != GSK_OK) nwritten = 0; } else #endif #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) { if (soap->peerlen) nwritten = sendto(sk, (char*)s, (SOAP_WINSOCKINT)n, soap->socket_flags, &soap->peer.addr, (SOAP_WINSOCKINT)soap->peerlen); else nwritten = send(sk, s, (SOAP_WINSOCKINT)n, soap->socket_flags); /* retry and back-off algorithm */ /* TODO: this is not very clear from specs so verify and limit conditions under which we should loop (e.g. ENOBUFS) */ if (nwritten < 0) { int udp_repeat; int udp_delay; if ((soap->connect_flags & SO_BROADCAST)) udp_repeat = 2; /* SOAP-over-UDP MULTICAST_UDP_REPEAT - 1 */ else udp_repeat = 1; /* SOAP-over-UDP UNICAST_UDP_REPEAT - 1 */ udp_delay = ((unsigned int)soap_random % 201) + 50; /* UDP_MIN_DELAY .. UDP_MAX_DELAY */ do { tcp_select(soap, sk, SOAP_TCP_SELECT_ERR, -1000 * udp_delay); if (soap->peerlen) nwritten = sendto(sk, (char*)s, (SOAP_WINSOCKINT)n, soap->socket_flags, &soap->peer.addr, (SOAP_WINSOCKINT)soap->peerlen); else nwritten = send(sk, s, (SOAP_WINSOCKINT)n, soap->socket_flags); udp_delay <<= 1; if (udp_delay > 500) /* UDP_UPPER_DELAY */ udp_delay = 500; } while (nwritten < 0 && --udp_repeat > 0); } if (nwritten < 0) { err = soap_socket_errno(sk); if (err && err != SOAP_EINTR) { soap->errnum = err; return SOAP_EOF; } nwritten = 0; /* and call write() again */ } } else #endif #if !defined(PALM) && !defined(AS400) nwritten = send(sk, s, (int)n, soap->socket_flags); #else nwritten = send(sk, (void*)s, n, soap->socket_flags); #endif if (nwritten <= 0) { int r = 0; err = soap_socket_errno(sk); #ifdef WITH_OPENSSL if (soap->ssl && (r = SSL_get_error(soap->ssl, nwritten)) != SSL_ERROR_NONE && r != SSL_ERROR_WANT_READ && r != SSL_ERROR_WANT_WRITE) { soap->errnum = err; return SOAP_EOF; } #endif #ifdef WITH_GNUTLS if (soap->session) { if (nwritten == GNUTLS_E_INTERRUPTED) err = SOAP_EINTR; else if (nwritten == GNUTLS_E_AGAIN) err = SOAP_EAGAIN; } #endif if (err == SOAP_EWOULDBLOCK || err == SOAP_EAGAIN) { #if defined(WITH_OPENSSL) if (soap->ssl && r == SSL_ERROR_WANT_READ) r = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, soap->send_timeout ? soap->send_timeout : -10000); else #elif defined(WITH_GNUTLS) if (soap->session && !gnutls_record_get_direction(soap->session)) r = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, soap->send_timeout ? soap->send_timeout : -10000); else #endif r = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, soap->send_timeout ? soap->send_timeout : -10000); if (!r && soap->send_timeout) return SOAP_EOF; if (r < 0) return SOAP_EOF; } else if (err && err != SOAP_EINTR) { soap->errnum = err; return SOAP_EOF; } nwritten = 0; /* and call write() again */ } } else { #ifdef WITH_FASTCGI nwritten = fwrite((void*)s, 1, n, stdout); fflush(stdout); #else #ifdef UNDER_CE nwritten = fwrite(s, 1, n, soap->sendfd); #else #ifdef VXWORKS #ifdef WMW_RPM_IO if (soap->rpmreqid) nwritten = (httpBlockPut(soap->rpmreqid, (char*)s, n) == 0) ? n : -1; else #endif nwritten = fwrite(s, sizeof(char), n, fdopen(soap->sendfd, "w")); #else #ifdef WIN32 nwritten = _write(soap->sendfd, s, (unsigned int)n); #else nwritten = write(soap->sendfd, s, (unsigned int)n); #endif #endif #endif #endif if (nwritten <= 0) { #ifndef WITH_FASTCGI err = soap_errno; #else err = EOF; #endif if (err && err != SOAP_EINTR && err != SOAP_EWOULDBLOCK && err != SOAP_EAGAIN) { soap->errnum = err; return SOAP_EOF; } nwritten = 0; /* and call write() again */ } } n -= nwritten; s += nwritten; } return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_send_raw(struct soap *soap, const char *s, size_t n) { if (!n) return SOAP_OK; #ifndef WITH_LEANER if (soap->fpreparesend && (soap->mode & SOAP_IO) != SOAP_IO_STORE && (soap->mode & SOAP_IO_LENGTH) && (soap->error = soap->fpreparesend(soap, s, n))) return soap->error; if (soap->ffiltersend && (soap->error = soap->ffiltersend(soap, &s, &n))) return soap->error; #endif if ((soap->mode & SOAP_IO_LENGTH)) soap->count += n; else if (soap->mode & SOAP_IO) { size_t i = sizeof(soap->buf) - soap->bufidx; while (n >= i) { soap_memcpy((void*)(soap->buf + soap->bufidx), i, (const void*)s, i); soap->bufidx = sizeof(soap->buf); if (soap_flush(soap)) return soap->error; s += i; n -= i; i = sizeof(soap->buf); } soap_memcpy((void*)(soap->buf + soap->bufidx), sizeof(soap->buf) - soap->bufidx, (const void*)s, n); soap->bufidx += n; } else return soap_flush_raw(soap, s, n); return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_flush(struct soap *soap) { size_t n = soap->bufidx; if (n) { #ifndef WITH_LEANER if ((soap->mode & SOAP_IO) == SOAP_IO_STORE) { int r; if (soap->fpreparesend && (r = soap->fpreparesend(soap, soap->buf, n))) return soap->error = r; } #endif soap->bufidx = 0; #ifdef WITH_ZLIB if (soap->mode & SOAP_ENC_ZLIB) { soap->d_stream->next_in = (Byte*)soap->buf; soap->d_stream->avail_in = (unsigned int)n; #ifdef WITH_GZIP soap->z_crc = crc32(soap->z_crc, (Byte*)soap->buf, (unsigned int)n); #endif do { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Deflating %u bytes\n", soap->d_stream->avail_in)); if (deflate(soap->d_stream, Z_NO_FLUSH) != Z_OK) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unable to deflate: %s\n", soap->d_stream->msg ? soap->d_stream->msg : SOAP_STR_EOS)); return soap->error = SOAP_ZLIB_ERROR; } if (!soap->d_stream->avail_out) { if (soap_flush_raw(soap, soap->z_buf, sizeof(soap->buf))) return soap->error; soap->d_stream->next_out = (Byte*)soap->z_buf; soap->d_stream->avail_out = sizeof(soap->buf); } } while (soap->d_stream->avail_in); } else #endif return soap_flush_raw(soap, soap->buf, n); } return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_flush_raw(struct soap *soap, const char *s, size_t n) { if ((soap->mode & SOAP_IO) == SOAP_IO_STORE) { void *t; if (!(t = soap_push_block(soap, NULL, n))) return soap->error = SOAP_EOM; soap_memcpy(t, n, (const void*)s, n); return SOAP_OK; } #ifndef WITH_LEANER if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK) { char t[24]; (SOAP_SNPRINTF(t, sizeof(t), 20), &"\r\n%lX\r\n"[soap->chunksize ? 0 : 2], (unsigned long)n); DBGMSG(SENT, t, strlen(t)); if ((soap->error = soap->fsend(soap, t, strlen(t)))) return soap->error; soap->chunksize += n; } DBGMSG(SENT, s, n); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Send %u bytes to socket=%d/fd=%d\n", (unsigned int)n, soap->socket, soap->sendfd)); #endif return soap->error = soap->fsend(soap, s, n); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_send(struct soap *soap, const char *s) { if (s) return soap_send_raw(soap, s, strlen(s)); return SOAP_OK; } #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_send2(struct soap *soap, const char *s1, const char *s2) { if (soap_send(soap, s1)) return soap->error; return soap_send(soap, s2); } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_send3(struct soap *soap, const char *s1, const char *s2, const char *s3) { if (soap_send(soap, s1) || soap_send(soap, s2)) return soap->error; return soap_send(soap, s3); } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 static size_t frecv(struct soap *soap, char *s, size_t n) { int r; int retries = 100; /* max 100 retries with non-blocking sockets */ SOAP_SOCKET sk; soap->errnum = 0; #if defined(__cplusplus) && !defined(WITH_COMPAT) if (soap->is) /* recv from C++ stream */ { if (soap->is->good()) return (size_t)soap->is->read(s, (std::streamsize)n).gcount(); return 0; } #else if (soap->is) /* recv from C buffer until NUL */ { size_t l = strlen(soap->is); if (l > n) l = n; soap_memcpy(s, n, soap->is, l); soap->is += l; return l; } #endif sk = soap->recvsk; if (!soap_valid_socket(sk)) sk = soap->socket; if (soap_valid_socket(sk)) { for (;;) { #if defined(WITH_OPENSSL) || defined(WITH_SYSTEMSSL) int err = 0; #endif #ifdef WITH_OPENSSL if (soap->recv_timeout && !soap->ssl) /* OpenSSL: sockets are nonblocking */ #else if (soap->recv_timeout) #endif { for (;;) { r = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, soap->recv_timeout); if (r > 0) break; if (!r) return 0; r = soap->errnum; if (r != SOAP_EAGAIN && r != SOAP_EWOULDBLOCK) return 0; } } #ifdef WITH_OPENSSL if (soap->ssl) { r = SSL_read(soap->ssl, s, (int)n); if (r > 0) return (size_t)r; err = SSL_get_error(soap->ssl, r); if (err != SSL_ERROR_NONE && err != SSL_ERROR_WANT_READ && err != SSL_ERROR_WANT_WRITE) return 0; } else if (soap->bio) { r = BIO_read(soap->bio, s, (int)n); if (r > 0) return (size_t)r; return 0; } else #endif #ifdef WITH_GNUTLS if (soap->session) { r = (int)gnutls_record_recv(soap->session, s, n); if (r >= 0) return (size_t)r; } else #endif #ifdef WITH_SYSTEMSSL if (soap->ssl) { err = gsk_secure_socket_read(soap->ssl, s, n, &r); if (err == GSK_OK && r > 0) return (size_t)r; if (err != GSK_OK && err != GSK_WOULD_BLOCK && err != GSK_WOULD_BLOCK_WRITE) return 0; } else #endif { #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) { SOAP_SOCKLEN_T k = (SOAP_SOCKLEN_T)sizeof(soap->peer); memset((void*)&soap->peer, 0, sizeof(soap->peer)); r = recvfrom(sk, s, (SOAP_WINSOCKINT)n, soap->socket_flags, &soap->peer.addr, &k); /* portability note: see SOAP_SOCKLEN_T definition in stdsoap2.h */ soap->peerlen = (size_t)k; #ifndef WITH_IPV6 soap->ip = ntohl(soap->peer.in.sin_addr.s_addr); #endif } else #endif r = recv(sk, s, (SOAP_WINSOCKINT)n, soap->socket_flags); #ifdef PALM /* CycleSyncDisplay(curStatusMsg); */ #endif if (r >= 0) return (size_t)r; r = soap_socket_errno(sk); if (r != SOAP_EINTR && r != SOAP_EAGAIN && r != SOAP_EWOULDBLOCK) { soap->errnum = r; return 0; } } #if defined(WITH_OPENSSL) if (soap->ssl && err == SSL_ERROR_WANT_WRITE) r = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, soap->recv_timeout ? soap->recv_timeout : 5); else #elif defined(WITH_GNUTLS) if (soap->session && gnutls_record_get_direction(soap->session)) r = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, soap->recv_timeout ? soap->recv_timeout : 5); else #elif defined(WITH_SYSTEMSSL) if (soap->ssl && err == GSK_WOULD_BLOCK_WRITE) r = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, soap->recv_timeout ? soap->recv_timeout : 5); else #endif r = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, soap->recv_timeout ? soap->recv_timeout : 5); if (!r && soap->recv_timeout) return 0; if (r < 0) { r = soap->errnum; if (r != SOAP_EAGAIN && r != SOAP_EWOULDBLOCK) return 0; } if (retries-- <= 0) return 0; #ifdef PALM r = soap_socket_errno(sk); if (r != SOAP_EINTR && retries-- <= 0) { soap->errnum = r; return 0; } #endif } } #ifdef WITH_FASTCGI return fread(s, 1, n, stdin); #else #ifdef UNDER_CE return fread(s, 1, n, soap->recvfd); #else #ifdef WMW_RPM_IO if (soap->rpmreqid) r = httpBlockRead(soap->rpmreqid, s, n); else #endif #ifdef WIN32 r = _read(soap->recvfd, s, (unsigned int)n); #else r = read(soap->recvfd, s, n); #endif if (r >= 0) return (size_t)r; soap->errnum = soap_errno; return 0; #endif #endif } #endif #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 static soap_wchar soap_getchunkchar(struct soap *soap) { if (soap->bufidx < soap->buflen) return soap->buf[soap->bufidx++]; soap->bufidx = 0; soap->buflen = soap->chunkbuflen = soap->frecv(soap, soap->buf, sizeof(soap->buf)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Read %u bytes from socket=%d/fd=%d\n", (unsigned int)soap->buflen, soap->socket, soap->recvfd)); DBGMSG(RECV, soap->buf, soap->buflen); if (soap->buflen) return soap->buf[soap->bufidx++]; return EOF; } #endif #endif /******************************************************************************/ #ifndef PALM_1 static int soap_isxdigit(int c) { return (c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f'); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_recv_raw(struct soap *soap) { size_t ret; #if !defined(WITH_LEANER) || defined(WITH_ZLIB) int r; #endif #ifdef WITH_ZLIB if ((soap->mode & SOAP_ENC_ZLIB) && soap->d_stream) { if (soap->d_stream->next_out == Z_NULL) { soap->bufidx = soap->buflen = 0; return EOF; } if (soap->d_stream->avail_in || !soap->d_stream->avail_out) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflating\n")); soap->d_stream->next_out = (Byte*)soap->buf; soap->d_stream->avail_out = sizeof(soap->buf); r = inflate(soap->d_stream, Z_NO_FLUSH); if (r == Z_NEED_DICT && soap->z_dict) r = inflateSetDictionary(soap->d_stream, (const Bytef*)soap->z_dict, soap->z_dict_len); if (r == Z_OK || r == Z_STREAM_END) { soap->bufidx = 0; ret = soap->buflen = sizeof(soap->buf) - soap->d_stream->avail_out; if (soap->zlib_in == SOAP_ZLIB_GZIP) soap->z_crc = crc32(soap->z_crc, (Byte*)soap->buf, (unsigned int)ret); if (r == Z_STREAM_END) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflated %lu->%lu bytes\n", soap->d_stream->total_in, soap->d_stream->total_out)); soap->z_ratio_in = (float)soap->d_stream->total_in / (float)soap->d_stream->total_out; soap->d_stream->next_out = Z_NULL; } if (ret) { soap->count += ret; if (soap->count > SOAP_MAXINFLATESIZE && soap->z_ratio_in < SOAP_MINDEFLATERATIO) { soap->d_stream->msg = (char*)"caught SOAP_MINDEFLATERATIO explosive decompression guard (remedy: increase SOAP_MAXINFLATESIZE and/or decrease SOAP_MINDEFLATERATIO)"; return soap->error = SOAP_ZLIB_ERROR; } DBGLOG(RECV, SOAP_MESSAGE(fdebug, "\n---- decompressed ----\n")); DBGMSG(RECV, soap->buf, ret); DBGLOG(RECV, SOAP_MESSAGE(fdebug, "\n----\n")); #ifndef WITH_LEANER if (soap->fpreparerecv && (r = soap->fpreparerecv(soap, soap->buf, ret))) return soap->error = r; #endif return SOAP_OK; } } else if (r != Z_BUF_ERROR) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflate error: %s\n", soap->d_stream->msg ? soap->d_stream->msg : SOAP_STR_EOS)); soap->d_stream->next_out = Z_NULL; return soap->error = SOAP_ZLIB_ERROR; } } zlib_again: if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK && !soap->chunksize) { soap_memcpy((void*)soap->buf, sizeof(soap->buf), (const void*)soap->z_buf, sizeof(soap->buf)); soap->buflen = soap->z_buflen; } DBGLOG(RECV, SOAP_MESSAGE(fdebug, "\n---- compressed ----\n")); } #endif #ifndef WITH_NOHTTP if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK) /* read HTTP chunked transfer */ { for (;;) { soap_wchar c; char *t, tmp[17]; if (soap->chunksize) { soap->buflen = ret = soap->frecv(soap, soap->buf, soap->chunksize > sizeof(soap->buf) ? sizeof(soap->buf) : soap->chunksize); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Getting chunk: read %u bytes\n", (unsigned int)ret)); DBGMSG(RECV, soap->buf, ret); soap->bufidx = 0; soap->chunksize -= ret; break; } t = tmp; if (!soap->chunkbuflen) { soap->chunkbuflen = ret = soap->frecv(soap, soap->buf, sizeof(soap->buf)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Read %u bytes (chunked) from socket=%d\n", (unsigned int)ret, soap->socket)); DBGMSG(RECV, soap->buf, ret); soap->bufidx = 0; if (!ret) { soap->ahead = EOF; return EOF; } } else soap->bufidx = soap->buflen; soap->buflen = soap->chunkbuflen; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Getting chunk size (idx=%u len=%u)\n", (unsigned int)soap->bufidx, (unsigned int)soap->buflen)); while (!soap_isxdigit((int)(c = soap_getchunkchar(soap)))) { if ((int)c == EOF) { soap->ahead = EOF; return EOF; } } do *t++ = (char)c; while (soap_isxdigit((int)(c = soap_getchunkchar(soap))) && (size_t)(t - tmp) < sizeof(tmp)-1); while ((int)c != EOF && c != '\n') c = soap_getchunkchar(soap); if ((int)c == EOF) { soap->ahead = EOF; return EOF; } *t = '\0'; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Chunk size = %s (hex)\n", tmp)); soap->chunksize = (size_t)soap_strtoul(tmp, &t, 16); if (!soap->chunksize) { soap->bufidx = soap->buflen = soap->chunkbuflen = 0; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of chunked message\n")); while ((int)c != EOF && c != '\n') c = soap_getchunkchar(soap); ret = 0; soap->ahead = EOF; break; } soap->buflen = soap->bufidx + soap->chunksize; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Moving buf len to idx=%u len=%u (%s)\n", (unsigned int)soap->bufidx, (unsigned int)soap->buflen, tmp)); if (soap->buflen > soap->chunkbuflen) { soap->buflen = soap->chunkbuflen; soap->chunksize -= soap->buflen - soap->bufidx; soap->chunkbuflen = 0; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Passed end of buffer for chunked HTTP (%u bytes left)\n", (unsigned int)(soap->buflen - soap->bufidx))); } else if (soap->chunkbuflen) soap->chunksize = 0; ret = soap->buflen - soap->bufidx; if (ret) break; } } else #endif { soap->bufidx = 0; soap->buflen = ret = soap->frecv(soap, soap->buf, sizeof(soap->buf)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Read %u bytes from socket=%d/fd=%d\n", (unsigned int)ret, soap->socket, soap->recvfd)); DBGMSG(RECV, soap->buf, ret); } #ifdef WITH_ZLIB if (soap->mode & SOAP_ENC_ZLIB) { soap_memcpy((void*)soap->z_buf, sizeof(soap->buf), (const void*)soap->buf, sizeof(soap->buf)); soap->d_stream->next_in = (Byte*)(soap->z_buf + soap->bufidx); soap->d_stream->avail_in = (unsigned int)ret; soap->d_stream->next_out = (Byte*)soap->buf; soap->d_stream->avail_out = sizeof(soap->buf); r = inflate(soap->d_stream, Z_NO_FLUSH); if (r == Z_NEED_DICT && soap->z_dict) r = inflateSetDictionary(soap->d_stream, (const Bytef*)soap->z_dict, soap->z_dict_len); if (r == Z_OK || r == Z_STREAM_END) { soap->bufidx = 0; soap->z_buflen = soap->buflen; soap->buflen = sizeof(soap->buf) - soap->d_stream->avail_out; if (soap->zlib_in == SOAP_ZLIB_GZIP) soap->z_crc = crc32(soap->z_crc, (Byte*)soap->buf, (unsigned int)soap->buflen); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflated %u bytes\n", (unsigned int)soap->buflen)); if (ret && !soap->buflen && r != Z_STREAM_END) goto zlib_again; ret = soap->buflen; if (r == Z_STREAM_END) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflated total %lu->%lu bytes\n", soap->d_stream->total_in, soap->d_stream->total_out)); soap->z_ratio_in = (float)soap->d_stream->total_in / (float)soap->d_stream->total_out; soap->d_stream->next_out = Z_NULL; } if (soap->count + ret > SOAP_MAXINFLATESIZE && soap->z_ratio_in < SOAP_MINDEFLATERATIO) { soap->d_stream->msg = (char*)"caught SOAP_MINDEFLATERATIO explosive decompression guard (remedy: increase SOAP_MAXINFLATESIZE and/or decrease SOAP_MINDEFLATERATIO)"; return soap->error = SOAP_ZLIB_ERROR; } DBGLOG(RECV, SOAP_MESSAGE(fdebug, "\n---- decompressed ----\n")); DBGMSG(RECV, soap->buf, ret); #ifndef WITH_LEANER if (soap->fpreparerecv && (r = soap->fpreparerecv(soap, soap->buf, ret))) return soap->error = r; #endif } else { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unable to inflate: (%d) %s\n", r, soap->d_stream->msg ? soap->d_stream->msg : SOAP_STR_EOS)); soap->d_stream->next_out = Z_NULL; return soap->error = SOAP_ZLIB_ERROR; } } #endif #ifndef WITH_LEANER if (soap->fpreparerecv #ifdef WITH_ZLIB && soap->zlib_in == SOAP_ZLIB_NONE #endif && (r = soap->fpreparerecv(soap, soap->buf + soap->bufidx, ret))) return soap->error = r; #endif if (ret) { soap->count += ret; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Read count=%lu (+%lu)\n", (unsigned long)soap->count, (unsigned long)ret)); return SOAP_OK; } return EOF; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_recv(struct soap *soap) { #ifndef WITH_LEANER if (soap->mode & SOAP_ENC_DIME) { if (soap->dime.buflen) { char *s; int i; unsigned char tmp[12]; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DIME hdr for chunked DIME is in buffer\n")); soap->count += soap->dime.buflen - soap->buflen; soap->buflen = soap->dime.buflen; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Skip padding (%ld bytes)\n", -(long)soap->dime.size&3)); for (i = -(long)soap->dime.size&3; i > 0; i--) { soap->bufidx++; if (soap->bufidx >= soap->buflen) if (soap_recv_raw(soap)) return EOF; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get DIME hdr for next chunk\n")); s = (char*)tmp; for (i = 12; i > 0; i--) { *s++ = soap->buf[soap->bufidx++]; if (soap->bufidx >= soap->buflen) if (soap_recv_raw(soap)) return EOF; } soap->dime.flags = tmp[0] & 0x7; soap->dime.size = ((size_t)tmp[8] << 24) | ((size_t)tmp[9] << 16) | ((size_t)tmp[10] << 8) | ((size_t)tmp[11]); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get DIME chunk (%u bytes)\n", (unsigned int)soap->dime.size)); if (soap->dime.flags & SOAP_DIME_CF) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "More chunking\n")); soap->dime.chunksize = soap->dime.size; if (soap->buflen - soap->bufidx >= soap->dime.size) { soap->dime.buflen = soap->buflen; soap->buflen = soap->bufidx + soap->dime.chunksize; } else soap->dime.chunksize -= soap->buflen - soap->bufidx; } else { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Last chunk\n")); soap->dime.buflen = 0; soap->dime.chunksize = 0; } soap->count = soap->buflen - soap->bufidx; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%u bytes remaining\n", (unsigned int)soap->count)); return SOAP_OK; } if (soap->dime.chunksize) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get next DIME hdr for chunked DIME (%u bytes chunk)\n", (unsigned int)soap->dime.chunksize)); if (soap_recv_raw(soap)) return EOF; if (soap->buflen - soap->bufidx >= soap->dime.chunksize) { soap->dime.buflen = soap->buflen; soap->count -= soap->buflen - soap->bufidx - soap->dime.chunksize; soap->buflen = soap->bufidx + soap->dime.chunksize; } else soap->dime.chunksize -= soap->buflen - soap->bufidx; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%lu bytes remaining, count=%lu\n", (unsigned long)(soap->buflen-soap->bufidx), (unsigned long)soap->count)); return SOAP_OK; } } while (soap->ffilterrecv) { int err; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Filter recverror = %d\n", soap->recverror)); if (soap->recverror) soap->bufidx = soap->buflen = 0; else { soap->recverror = soap_recv_raw(soap); /* do not call again after EOF */ soap->buflen -= soap->bufidx; /* chunked may set bufidx > 0 to skip hex chunk length */ } if ((err = soap->ffilterrecv(soap, soap->buf + soap->bufidx, &soap->buflen, sizeof(soap->buf) - soap->bufidx))) return soap->error = err; if (soap->buflen) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Filtered %lu\n", (unsigned long)soap->buflen)); soap->buflen += soap->bufidx; return SOAP_OK; } if (soap->recverror) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Returning postponed EOF%d\n", soap->recverror)); return soap->recverror; } } return soap->recverror = soap_recv_raw(soap); #else return soap_recv_raw(soap); #endif } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 soap_wchar SOAP_FMAC2 soap_getchar(struct soap *soap) { soap_wchar c; c = soap->ahead; if (c) { if (c != EOF) soap->ahead = 0; return c; } return soap_get1(soap); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 const struct soap_code_map* SOAP_FMAC2 soap_code(const struct soap_code_map *code_map, const char *str) { if (code_map && str) { while (code_map->string) { if (!strcmp(str, code_map->string)) /* case sensitive */ return code_map; code_map++; } } return NULL; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 LONG64 SOAP_FMAC2 soap_code_int(const struct soap_code_map *code_map, const char *str, LONG64 other) { if (code_map) { while (code_map->string) { if (!soap_tag_cmp(str, code_map->string)) /* case insensitive */ return code_map->code; code_map++; } } return other; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 const char* SOAP_FMAC2 soap_code_str(const struct soap_code_map *code_map, long code) { if (!code_map) return NULL; while (code_map->code != code && code_map->string) code_map++; return code_map->string; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 LONG64 SOAP_FMAC2 soap_code_bits(const struct soap_code_map *code_map, const char *str) { LONG64 bits = 0; if (code_map) { while (str && *str) { const struct soap_code_map *p; for (p = code_map; p->string; p++) { size_t n = strlen(p->string); if (!strncmp(p->string, str, n) && soap_blank((soap_wchar)str[n])) { bits |= p->code; str += n; while (*str > 0 && *str <= 32) str++; break; } } if (!p->string) return 0; } } return bits; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 const char* SOAP_FMAC2 soap_code_list(struct soap *soap, const struct soap_code_map *code_map, long code) { char *t = soap->tmpbuf; if (code_map) { while (code_map->string) { if (code_map->code & code) { const char *s = code_map->string; if (t != soap->tmpbuf) *t++ = ' '; while (*s && t < soap->tmpbuf + sizeof(soap->tmpbuf) - 1) *t++ = *s++; if (t == soap->tmpbuf + sizeof(soap->tmpbuf) - 1) break; } code_map++; } } *t = '\0'; return soap->tmpbuf; } #endif /******************************************************************************/ #ifndef PALM_1 static soap_wchar soap_char(struct soap *soap) { char tmp[8]; int i; soap_wchar c; char *s = tmp; for (i = 0; i < 7; i++) { c = soap_get1(soap); if (c == ';' || (int)c == EOF) break; *s++ = (char)c; } *s = '\0'; if (*tmp == '#') { if (tmp[1] == 'x' || tmp[1] == 'X') return (soap_wchar)soap_strtol(tmp + 2, NULL, 16); return (soap_wchar)soap_strtol(tmp + 1, NULL, 10); } if (!strcmp(tmp, "lt")) return '<'; if (!strcmp(tmp, "gt")) return '>'; if (!strcmp(tmp, "amp")) return '&'; if (!strcmp(tmp, "quot")) return '"'; if (!strcmp(tmp, "apos")) return '\''; #ifndef WITH_LEAN return (soap_wchar)soap_code_int(html_entity_codes, tmp, (LONG64)SOAP_UNKNOWN_CHAR); #else return SOAP_UNKNOWN_CHAR; /* use this to represent unknown code */ #endif } #endif /******************************************************************************/ #ifdef WITH_LEAN #ifndef PALM_1 soap_wchar soap_get0(struct soap *soap) { if (soap->bufidx >= soap->buflen && soap_recv(soap)) return EOF; return (unsigned char)soap->buf[soap->bufidx]; } #endif #endif /******************************************************************************/ #ifdef WITH_LEAN #ifndef PALM_1 soap_wchar soap_get1(struct soap *soap) { if (soap->bufidx >= soap->buflen && soap_recv(soap)) return EOF; return (unsigned char)soap->buf[soap->bufidx++]; } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 soap_wchar SOAP_FMAC2 soap_get(struct soap *soap) { soap_wchar c; c = soap->ahead; if (c) { if ((int)c != EOF) soap->ahead = 0; } else c = soap_get1(soap); while ((int)c != EOF) { if (soap->cdata) { if (c == ']') { c = soap_get1(soap); if (c == ']') { c = soap_get0(soap); if (c == '>') { soap->cdata = 0; c = soap_get1(soap); c = soap_get1(soap); } else { soap_unget(soap, ']'); return ']'; } } else { soap_revget1(soap); return ']'; } } else return c; } switch (c) { case '<': do c = soap_get1(soap); while (soap_blank(c)); if (c == '!' || c == '?' || c == '%') { int k = 1; if (c == '!') { c = soap_get1(soap); if (c == '[') { do c = soap_get1(soap); while ((int)c != EOF && c != '['); if ((int)c == EOF) break; soap->cdata = 1; c = soap_get1(soap); continue; } if (c == '-' && (c = soap_get1(soap)) == '-') { do { c = soap_get1(soap); if (c == '-' && (c = soap_get1(soap)) == '-') break; } while ((int)c != EOF); } } else if (c == '?') c = soap_get_pi(soap); while ((int)c != EOF) { if (c == '<') k++; else if (c == '>') { if (--k <= 0) break; } c = soap_get1(soap); } if ((int)c == EOF) break; c = soap_get1(soap); continue; } if (c == '/') return SOAP_TT; soap_revget1(soap); return SOAP_LT; case '>': return SOAP_GT; case '"': return SOAP_QT; case '\'': return SOAP_AP; case '&': return soap_char(soap) | 0x80000000; } break; } return c; } #endif /******************************************************************************/ #ifndef PALM_1 static soap_wchar soap_get_pi(struct soap *soap) { char buf[64]; char *s = buf; int i = sizeof(buf); soap_wchar c = soap_getchar(soap); /* This is a quick way to parse XML PI and we could use a callback instead to * enable applications to intercept processing instructions */ while ((int)c != EOF && c != '?') { if (--i > 0) { if (soap_blank(c)) c = ' '; *s++ = (char)c; } c = soap_getchar(soap); } *s = '\0'; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "XML PI \n", buf)); if (!strncmp(buf, "xml ", 4)) { s = strstr(buf, " encoding="); if (s && s[10]) { if (!soap_tag_cmp(s + 11, "iso-8859-1*") || !soap_tag_cmp(s + 11, "latin1*")) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Switching to latin1 encoding\n")); soap->mode |= SOAP_ENC_LATIN; } else if (!soap_tag_cmp(s + 11, "utf-8*")) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Switching to utf-8 encoding\n")); soap->mode &= ~SOAP_ENC_LATIN; } } } if ((int)c != EOF) c = soap_getchar(soap); return c; } #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_move(struct soap *soap, size_t n) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Moving %lu bytes forward\n", (unsigned long)n)); for (; n; n--) if ((int)soap_getchar(soap) == EOF) return SOAP_EOF; return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 size_t SOAP_FMAC2 soap_tell(struct soap *soap) { return soap->count - soap->buflen + soap->bufidx - (soap->ahead != 0); } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_pututf8(struct soap *soap, unsigned long c) { char tmp[24]; if ((c < 0x7F && c > 0x1F)) { *tmp = (char)c; return soap_send_raw(soap, tmp, 1); } #ifdef WITH_REPLACE_ILLEGAL_UTF8 if (!(c == 0x09 || c == 0x0A || c == 0x0D || (c >= 0x80 && c <= 0xD7FF) || (c >= 0xE000 && c <= 0xFFFD) || (c >= 0x10000 && c <= 0x10FFFF))) c = SOAP_UNKNOWN_UNICODE_CHAR; #endif #ifndef WITH_LEAN if (c > 0x9F) { char *t = tmp; if (c < 0x0800) *t++ = (char)(0xC0 | ((c >> 6) & 0x1F)); else { if (c < 0x010000) *t++ = (char)(0xE0 | ((c >> 12) & 0x0F)); else { if (c < 0x200000) *t++ = (char)(0xF0 | ((c >> 18) & 0x07)); else { if (c < 0x04000000) *t++ = (char)(0xF8 | ((c >> 24) & 0x03)); else { *t++ = (char)(0xFC | ((c >> 30) & 0x01)); *t++ = (char)(0x80 | ((c >> 24) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 18) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 12) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 6) & 0x3F)); } *t++ = (char)(0x80 | (c & 0x3F)); *t = '\0'; } else #endif (SOAP_SNPRINTF(tmp, sizeof(tmp), 20), "&#x%lX;", c); return soap_send(soap, tmp); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 soap_wchar SOAP_FMAC2 soap_getutf8(struct soap *soap) { soap_wchar c, c1, c2, c3, c4; c = soap->ahead; if (c >= 0x80) soap->ahead = 0; else c = soap_get(soap); if (c < 0x80 || c > 0xFF || (soap->mode & SOAP_ENC_LATIN)) return c; c1 = soap_get1(soap); if (c1 < 0x80) { soap_revget1(soap); /* doesn't look like this is UTF8 */ return c; } c1 &= 0x3F; if (c < 0xE0) return ((soap_wchar)(c & 0x1F) << 6) | c1; c2 = (soap_wchar)soap_get1(soap) & 0x3F; if (c < 0xF0) return ((soap_wchar)(c & 0x0F) << 12) | (c1 << 6) | c2; c3 = (soap_wchar)soap_get1(soap) & 0x3F; if (c < 0xF8) return ((soap_wchar)(c & 0x07) << 18) | (c1 << 12) | (c2 << 6) | c3; c4 = (soap_wchar)soap_get1(soap) & 0x3F; if (c < 0xFC) return ((soap_wchar)(c & 0x03) << 24) | (c1 << 18) | (c2 << 12) | (c3 << 6) | c4; return ((soap_wchar)(c & 0x01) << 30) | (c1 << 24) | (c2 << 18) | (c3 << 12) | (c4 << 6) | (soap_wchar)(soap_get1(soap) & 0x3F); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 size_t SOAP_FMAC2 soap_utf8len(const char *s) { size_t l = 0; while (*s) if ((*s++ & 0xC0) != 0x80) l++; return l; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_puthex(struct soap *soap, const unsigned char *s, int n) { char d[2]; int i; #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { if (!(soap->dom->text = soap_s2hex(soap, s, NULL, n))) return soap->error; return SOAP_OK; } #endif for (i = 0; i < n; i++) { int m = *s++; d[0] = (char)((m >> 4) + (m > 159 ? '7' : '0')); m &= 0x0F; d[1] = (char)(m + (m > 9 ? '7' : '0')); if (soap_send_raw(soap, d, 2)) return soap->error; } return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 unsigned char* SOAP_FMAC2 soap_gethex(struct soap *soap, int *n) { #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { soap->dom->text = soap_string_in(soap, 0, -1, -1, NULL); return (unsigned char*)soap_hex2s(soap, soap->dom->text, NULL, 0, n); } #endif #ifdef WITH_FAST soap->labidx = 0; for (;;) { char *s; size_t i, k; if (soap_append_lab(soap, NULL, 0)) return NULL; s = soap->labbuf + soap->labidx; k = soap->lablen - soap->labidx; soap->labidx = soap->lablen; for (i = 0; i < k; i++) { char d1, d2; soap_wchar c; c = soap_get(soap); if (soap_isxdigit(c)) { d1 = (char)c; c = soap_get(soap); if (soap_isxdigit(c)) d2 = (char)c; else { soap->error = SOAP_TYPE; return NULL; } } else { unsigned char *p; size_t l = soap->lablen + i - k; soap_unget(soap, c); if (n) *n = (int)l; p = (unsigned char*)soap_malloc(soap, l); if (p) soap_memcpy((void*)p, l, (const void*)soap->labbuf, l); return p; } *s++ = (char)(((d1 >= 'A' ? (d1 & 0x7) + 9 : d1 - '0') << 4) + (d2 >= 'A' ? (d2 & 0x7) + 9 : d2 - '0')); } } #else if (soap_new_block(soap) == NULL) return NULL; for (;;) { int i; char *s = (char*)soap_push_block(soap, NULL, SOAP_BLKLEN); if (!s) { soap_end_block(soap, NULL); return NULL; } for (i = 0; i < SOAP_BLKLEN; i++) { char d1, d2; soap_wchar c = soap_get(soap); if (soap_isxdigit(c)) { d1 = (char)c; c = soap_get(soap); if (soap_isxdigit(c)) d2 = (char)c; else { soap_end_block(soap, NULL); soap->error = SOAP_TYPE; return NULL; } } else { unsigned char *p; soap_unget(soap, c); if (n) *n = (int)soap_size_block(soap, NULL, i); p = (unsigned char*)soap_save_block(soap, NULL, NULL, 0); return p; } *s++ = ((d1 >= 'A' ? (d1 & 0x7) + 9 : d1 - '0') << 4) + (d2 >= 'A' ? (d2 & 0x7) + 9 : d2 - '0'); } } #endif } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_putbase64(struct soap *soap, const unsigned char *s, int n) { int i; unsigned long m; char d[4]; if (!s) return SOAP_OK; #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { if (!(soap->dom->text = soap_s2base64(soap, s, NULL, n))) return soap->error; return SOAP_OK; } #endif for (; n > 2; n -= 3, s += 3) { m = s[0]; m = (m << 8) | s[1]; m = (m << 8) | s[2]; for (i = 4; i > 0; m >>= 6) d[--i] = soap_base64o[m & 0x3F]; if (soap_send_raw(soap, d, 4)) return soap->error; } if (n > 0) { m = 0; for (i = 0; i < n; i++) m = (m << 8) | *s++; for (; i < 3; i++) m <<= 8; for (i++; i > 0; m >>= 6) d[--i] = soap_base64o[m & 0x3F]; for (i = 3; i > n; i--) d[i] = '='; if (soap_send_raw(soap, d, 4)) return soap->error; } return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 unsigned char* SOAP_FMAC2 soap_getbase64(struct soap *soap, int *n, int malloc_flag) { (void)malloc_flag; #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { soap->dom->text = soap_string_in(soap, 0, -1, -1, NULL); return (unsigned char*)soap_base642s(soap, soap->dom->text, NULL, 0, n); } #endif #ifdef WITH_FAST soap->labidx = 0; for (;;) { size_t i, k; char *s; if (soap_append_lab(soap, NULL, 2)) return NULL; s = soap->labbuf + soap->labidx; k = soap->lablen - soap->labidx; soap->labidx = 3 * (soap->lablen / 3); if (k > 2) { for (i = 0; i < k - 2; i += 3) { unsigned long m = 0; int j = 0; do { soap_wchar c = soap_get(soap); if (c < SOAP_AP) c &= 0x7FFFFFFF; if (c == '=' || c < 0) { unsigned char *p; size_t l; switch (j) { case 2: *s++ = (char)((m >> 4) & 0xFF); i++; break; case 3: *s++ = (char)((m >> 10) & 0xFF); *s++ = (char)((m >> 2) & 0xFF); i += 2; } l = soap->lablen + i - k; if (n) *n = (int)l; p = (unsigned char*)soap_malloc(soap, l); if (p) soap_memcpy((void*)p, l, (const void*)soap->labbuf, l); if (c >= 0) { while ((int)((c = soap_get(soap)) != EOF) && c != SOAP_LT && c != SOAP_TT) continue; } soap_unget(soap, c); return p; } c -= '+'; if (c >= 0 && c <= 79) { int b = soap_base64i[c]; if (b >= 64) { soap->error = SOAP_TYPE; return NULL; } m = (m << 6) + b; j++; } else if (!soap_blank(c + '+')) { soap->error = SOAP_TYPE; return NULL; } } while (j < 4); *s++ = (char)((m >> 16) & 0xFF); *s++ = (char)((m >> 8) & 0xFF); *s++ = (char)(m & 0xFF); } } } #else if (soap_new_block(soap) == NULL) return NULL; for (;;) { int i; char *s = (char*)soap_push_block(soap, NULL, 3 * SOAP_BLKLEN); /* must be multiple of 3 */ if (!s) { soap_end_block(soap, NULL); return NULL; } for (i = 0; i < SOAP_BLKLEN; i++) { unsigned long m = 0; int j = 0; do { soap_wchar c = soap_get(soap); if (c == '=' || c < 0) { unsigned char *p; i *= 3; switch (j) { case 2: *s++ = (char)((m >> 4) & 0xFF); i++; break; case 3: *s++ = (char)((m >> 10) & 0xFF); *s++ = (char)((m >> 2) & 0xFF); i += 2; } if (n) *n = (int)soap_size_block(soap, NULL, i); p = (unsigned char*)soap_save_block(soap, NULL, NULL, 0); if (c >= 0) { while ((int)((c = soap_get(soap)) != EOF) && c != SOAP_LT && c != SOAP_TT) continue; } soap_unget(soap, c); return p; } c -= '+'; if (c >= 0 && c <= 79) { int b = soap_base64i[c]; if (b >= 64) { soap->error = SOAP_TYPE; return NULL; } m = (m << 6) + b; j++; } else if (!soap_blank(c)) { soap->error = SOAP_TYPE; return NULL; } } while (j < 4); *s++ = (char)((m >> 16) & 0xFF); *s++ = (char)((m >> 8) & 0xFF); *s++ = (char)(m & 0xFF); } } #endif } #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_xop_forward(struct soap *soap, unsigned char **ptr, int *size, char **id, char **type, char **options) { /* Check MTOM xop:Include element (within hex/base64Binary) */ /* TODO: this code to be obsoleted with new import/xop.h conventions */ short body = soap->body; /* should save type too? */ if (!soap_peek_element(soap)) { if (!soap_element_begin_in(soap, "xop:Include", 0, NULL)) { if (soap_attachment_forward(soap, ptr, size, id, type, options) || (soap->body && soap_element_end_in(soap, "xop:Include"))) return soap->error; } } soap->body = body; return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_attachment_forward(struct soap *soap, unsigned char **ptr, int *size, char **id, char **type, char **options) { struct soap_xlist *xp; *ptr = NULL; *size = 0; *id = NULL; *type = NULL; *options = NULL; if (!*soap->href) return SOAP_OK; *id = soap_strdup(soap, soap->href); xp = (struct soap_xlist*)SOAP_MALLOC(soap, sizeof(struct soap_xlist)); if (!xp) return soap->error = SOAP_EOM; xp->next = soap->xlist; xp->ptr = ptr; xp->size = size; xp->id = *id; xp->type = type; xp->options = options; soap->xlist = xp; return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void * SOAP_FMAC2 soap_memdup(struct soap *soap, const void *s, size_t n) { void *t = NULL; if (s && (t = soap_malloc(soap, n))) soap_memcpy(t, n, s, n); return t; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 char * SOAP_FMAC2 soap_strdup(struct soap *soap, const char *s) { char *t = NULL; if (s) { size_t l = strlen(s) + 1; if ((t = (char*)soap_malloc(soap, l))) soap_memcpy((void*)t, l, (const void*)s, l); } return t; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 wchar_t * SOAP_FMAC2 soap_wstrdup(struct soap *soap, const wchar_t *s) { wchar_t *t = NULL; if (s) { size_t n = 0; while (s[n]) n++; n = sizeof(wchar_t)*(n+1); if ((t = (wchar_t*)soap_malloc(soap, n))) soap_memcpy((void*)t, n, (const void*)s, n); } return t; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 char * SOAP_FMAC2 soap_strtrim(struct soap *soap, char *s) { (void)soap; if (s) { char *t; while ((*s >= 9 && *s <= 13) || *s == 32) s++; t = s; while (*t) t++; while (--t > s && ((*t >= 9 && *t <= 13) || *t == 32)) continue; t[1] = '\0'; } return s; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 wchar_t * SOAP_FMAC2 soap_wstrtrim(struct soap *soap, wchar_t *s) { (void)soap; if (s) { wchar_t *t; while ((*s >= 9 && *s <= 13) || *s == 32) s++; t = s; while (*t) t++; while (--t > s && ((*t >= 9 && *t <= 13) || *t == 32)) continue; t[1] = L'\0'; } return s; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 struct soap_blist* SOAP_FMAC2 soap_new_block(struct soap *soap) { struct soap_blist *p; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "New block sequence (prev=%p)\n", soap->blist)); if (!(p = (struct soap_blist*)SOAP_MALLOC(soap, sizeof(struct soap_blist)))) { soap->error = SOAP_EOM; return NULL; } p->next = soap->blist; p->head = NULL; p->size = 0; soap->blist = p; return p; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void* SOAP_FMAC2 soap_push_block(struct soap *soap, struct soap_blist *b, size_t n) { struct soap_bhead *p; if (!b) b = soap->blist; if (!(p = (struct soap_bhead*)SOAP_MALLOC(soap, sizeof(struct soap_bhead) + n))) { soap->error = SOAP_EOM; return NULL; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Push block %p of %u bytes (%u bytes total)\n", p, (unsigned int)n, (unsigned int)b->size + (unsigned int)n)); p->next = b->head; b->head = p; p->size = n; b->size += n; return (void*)(p + 1); /* skip block header and point to n allocated bytes */ } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_pop_block(struct soap *soap, struct soap_blist *b) { struct soap_bhead *p; if (!b) b = soap->blist; if (!b->head) return; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Pop block\n")); p = b->head; b->size -= p->size; b->head = p->next; SOAP_FREE(soap, p); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_update_pointers(struct soap *soap, const char *dst, const char *src, size_t len) { const void *start = src, *end = src + len; #ifndef WITH_LEANER struct soap_xlist *xp; #endif #ifndef WITH_NOIDREF if ((soap->version && !(soap->imode & SOAP_XML_TREE)) || (soap->mode & SOAP_XML_GRAPH)) { int i; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Update pointers %p (%lu bytes) -> %p\n", src, (unsigned long)len, dst)); for (i = 0; i < SOAP_IDHASH; i++) { struct soap_ilist *ip; for (ip = soap->iht[i]; ip; ip = ip->next) { struct soap_flist *fp; void *p, **q; if (ip->shaky) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Update shaky id='%s'\n", ip->id)); if (ip->ptr && ip->ptr >= start && ip->ptr < end) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Update ptr %p -> %p\n", ip->ptr, (const char*)ip->ptr + (dst-src))); ip->ptr = (void*)((const char*)ip->ptr + (dst-src)); } for (q = &ip->link; q; q = (void**)p) { p = *q; if (p && p >= start && p < end) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Link update id='%s' %p -> %p\n", ip->id, p, (const char*)p + (dst-src))); *q = (void*)((const char*)p + (dst-src)); } } for (q = &ip->copy; q; q = (void**)p) { p = *q; if (p && p >= start && p < end) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy chain update id='%s' %p -> %p\n", ip->id, p, (const char*)p + (dst-src))); *q = (void*)((const char*)p + (dst-src)); } } for (fp = ip->flist; fp; fp = fp->next) { if (fp->ptr >= start && fp->ptr < end) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy list update id='%s' target type=%d %p -> %p\n", ip->id, fp->type, fp->ptr, (char*)fp->ptr + (dst-src))); fp->ptr = (void*)((const char*)fp->ptr + (dst-src)); } } if (ip->smart && ip->smart >= start && ip->smart < end) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Smart shared pointer update %p -> %p\n", ip->smart, (const char*)ip->smart + (dst-src))); ip->smart = (void*)((const char*)ip->smart + (dst-src)); } } } } } #else (void)soap; (void)start; (void)end; (void)dst; (void)src; #endif #ifndef WITH_LEANER for (xp = soap->xlist; xp; xp = xp->next) { if (xp->ptr && (void*)xp->ptr >= start && (void*)xp->ptr < end) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Update attachment id='%s' %p -> %p\n", xp->id ? xp->id : SOAP_STR_EOS, xp->ptr, (char*)xp->ptr + (dst-src))); xp->ptr = (unsigned char**)((char*)xp->ptr + (dst-src)); xp->size = (int*)((char*)xp->size + (dst-src)); xp->type = (char**)((char*)xp->type + (dst-src)); xp->options = (char**)((char*)xp->options + (dst-src)); } } #endif } #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_1 static int soap_has_copies(struct soap *soap, const char *start, const char *end) { int i; struct soap_ilist *ip = NULL; struct soap_flist *fp = NULL; const char *p; for (i = 0; i < SOAP_IDHASH; i++) { for (ip = soap->iht[i]; ip; ip = ip->next) { for (p = (const char*)ip->copy; p; p = *(const char**)p) if (p >= start && p < end) return SOAP_ERR; for (fp = ip->flist; fp; fp = fp->next) if (fp->type == ip->type && (const char*)fp->ptr >= start && (const char*)fp->ptr < end) return SOAP_ERR; } } return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_resolve(struct soap *soap) { int i; short flag; const char *id; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolving forwarded refs\n")); for (i = 0; i < SOAP_IDHASH; i++) { struct soap_ilist *ip; for (ip = soap->iht[i]; ip; ip = ip->next) { if (ip->ptr) { void **q; struct soap_flist *fp, **fpp = &ip->flist; if (ip->spine) ip->spine[0] = ip->ptr; q = (void**)ip->link; ip->link = NULL; DBGLOG(TEST, if (q) SOAP_MESSAGE(fdebug, "Traversing link chain to resolve id='%s' type=%d\n", ip->id, ip->type)); while (q) { void *p = *q; *q = ip->ptr; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "... link %p -> %p\n", q, ip->ptr)); q = (void**)p; } while ((fp = *fpp)) { if (fp->level > 0 && fp->finsert) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "... insert type=%d link %p -> %p\n", fp->type, fp->ptr, ip->ptr)); if (ip->spine && fp->level <= SOAP_MAXPTRS) fp->finsert(soap, ip->type, fp->type, fp->ptr, fp->index, &ip->spine[fp->level - 1], &ip->smart); else if (fp->level == 1) fp->finsert(soap, ip->type, fp->type, fp->ptr, fp->index, &ip->ptr, &ip->smart); else if (fp->level <= SOAP_MAXPTRS) { int i; if (!(ip->spine = (void**)soap_malloc(soap, SOAP_MAXPTRS * sizeof(void*)))) return soap->error = SOAP_EOM; ip->spine[0] = ip->ptr; for (i = 1; i < SOAP_MAXPTRS; i++) ip->spine[i] = &ip->spine[i - 1]; fp->finsert(soap, ip->type, fp->type, fp->ptr, fp->index, &ip->spine[fp->level - 1], &ip->smart); } *fpp = fp->next; SOAP_FREE(soap, fp); } else fpp = &fp->next; } } else if (*ip->id == '#') { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Missing id='%s'\n", ip->id)); soap_strcpy(soap->id, sizeof(soap->id), ip->id + 1); return soap->error = SOAP_MISSING_ID; } } } do { flag = 0; id = NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolution phase\n")); for (i = 0; i < SOAP_IDHASH; i++) { struct soap_ilist *ip; for (ip = soap->iht[i]; ip; ip = ip->next) { if (ip->copy || ip->flist) { if (ip->ptr && !soap_has_copies(soap, (const char*)ip->ptr, (const char*)ip->ptr + ip->size)) { struct soap_flist *fp; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolving id='%s' type=%d ptr=%p size=%lu ...\n", ip->id, ip->type, ip->ptr, (unsigned long)ip->size)); if (ip->copy) { void *p, **q = (void**)ip->copy; DBGLOG(TEST, if (q) SOAP_MESSAGE(fdebug, "Traversing copy chain to resolve id='%s'\n", ip->id)); ip->copy = NULL; do { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "... copy %p -> %p (%u bytes)\n", ip->ptr, q, (unsigned int)ip->size)); p = *q; soap_memcpy((void*)q, ip->size, (const void*)ip->ptr, ip->size); q = (void**)p; } while (q); flag = 1; } while ((fp = ip->flist)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolving forwarded data type=%d target type=%d location=%p level=%u id='%s'\n", ip->type, fp->type, ip->ptr, fp->level, ip->id)); if (fp->level == 0) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "... copy %p -> %p (%lu bytes)\n", ip->ptr, fp->ptr, (unsigned long)ip->size)); if (fp->finsert) fp->finsert(soap, ip->type, fp->type, fp->ptr, fp->index, ip->ptr, &ip->smart); else soap_memcpy((void*)fp->ptr, ip->size, (const void*)ip->ptr, ip->size); } ip->flist = fp->next; SOAP_FREE(soap, fp); flag = 1; } } else id = ip->id; } } } } while (flag); if (id) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolution error: forwarded data for id='%s' could not be propagated, please report this problem to the gSOAP developers\n", id)); return soap_id_nullify(soap, id); } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolution done\n")); return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 size_t SOAP_FMAC2 soap_size_block(struct soap *soap, struct soap_blist *b, size_t n) { if (!b) b = soap->blist; if (b->head) { b->size -= b->head->size - n; b->head->size = n; } return b->size; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 char* SOAP_FMAC2 soap_first_block(struct soap *soap, struct soap_blist *b) { struct soap_bhead *p, *q, *r; if (!b) b = soap->blist; p = b->head; if (!p) return NULL; r = NULL; do { q = p->next; p->next = r; r = p; p = q; } while (p); b->head = r; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "First block %p\n", r + 1)); return (char*)(r + 1); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 char* SOAP_FMAC2 soap_next_block(struct soap *soap, struct soap_blist *b) { struct soap_bhead *p; if (!b) b = soap->blist; p = b->head; if (p) { b->head = p->next; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Next block %p, deleting current block\n", b->head + 1)); SOAP_FREE(soap, p); if (b->head) return (char*)(b->head + 1); } return NULL; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 size_t SOAP_FMAC2 soap_block_size(struct soap *soap, struct soap_blist *b) { if (!b) b = soap->blist; return b->head->size; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_end_block(struct soap *soap, struct soap_blist *b) { struct soap_bhead *p, *q; if (!b) b = soap->blist; if (b) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of block sequence, free all remaining blocks\n")); for (p = b->head; p; p = q) { q = p->next; SOAP_FREE(soap, p); } if (soap->blist == b) soap->blist = b->next; else { struct soap_blist *bp; for (bp = soap->blist; bp; bp = bp->next) { if (bp->next == b) { bp->next = b->next; break; } } } SOAP_FREE(soap, b); } DBGLOG(TEST, if (soap->blist) SOAP_MESSAGE(fdebug, "Restored previous block sequence\n")); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 char* SOAP_FMAC2 soap_save_block(struct soap *soap, struct soap_blist *b, char *p, int flag) { size_t n; char *q, *s; if (!b) b = soap->blist; if (b->size) { if (!p) p = (char*)soap_malloc(soap, b->size); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Save all blocks in contiguous memory space of %u bytes (%p->%p)\n", (unsigned int)b->size, b->head, p)); if (p) { s = p; for (q = soap_first_block(soap, b); q; q = soap_next_block(soap, b)) { n = soap_block_size(soap, b); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy %u bytes from %p to %p\n", (unsigned int)n, q, s)); if (flag) soap_update_pointers(soap, s, q, n); soap_memcpy((void*)s, n, (const void*)q, n); s += n; } } else soap->error = SOAP_EOM; } soap_end_block(soap, b); #ifndef WITH_NOIDREF if (!soap->blist && ((soap->version && !(soap->imode & SOAP_XML_TREE)) || (soap->mode & SOAP_XML_GRAPH))) { int i; struct soap_ilist *ip = NULL; for (i = 0; i < SOAP_IDHASH; i++) for (ip = soap->iht[i]; ip; ip = ip->next) ip->shaky = 0; } #endif return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 char * SOAP_FMAC2 soap_putsizesoffsets(struct soap *soap, const char *type, const int *size, const int *offset, int dim) { int i; const char *t = ",%d"; if (!type) return NULL; if (soap->version == 2) t = " %d"; if (soap->version != 2 && offset) { (SOAP_SNPRINTF(soap->type, sizeof(soap->type) - 1, strlen(type) + 20), "%s[%d", type, size[0] + offset[0]); for (i = 1; i < dim; i++) { size_t l = strlen(soap->type); (SOAP_SNPRINTF(soap->type + l, sizeof(soap->type) - l - 1, 20), t, size[i] + offset[i]); } } else { (SOAP_SNPRINTF(soap->type, sizeof(soap->type) - 1, strlen(type) + 20), "%s[%d", type, size[0]); for (i = 1; i < dim; i++) { size_t l = strlen(soap->type); (SOAP_SNPRINTF(soap->type + l, sizeof(soap->type) - l - 1, 20), t, size[i]); } } soap_strncat(soap->type, sizeof(soap->type), "]", 1); return soap->type; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 char * SOAP_FMAC2 soap_putoffsets(struct soap *soap, const int *offset, int dim) { int i; soap->arrayOffset[0] = '\0'; if (soap->version == 1) { (SOAP_SNPRINTF(soap->arrayOffset, sizeof(soap->arrayOffset) - 1, 20), "[%d", offset[0]); for (i = 1; i < dim; i++) { size_t l = strlen(soap->arrayOffset); (SOAP_SNPRINTF(soap->arrayOffset + l, sizeof(soap->arrayOffset) - l - 1, 20), ",%d", offset[i]); } soap_strncat(soap->arrayOffset, sizeof(soap->arrayOffset), "]", 1); } return soap->arrayOffset; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 size_t SOAP_FMAC2 soap_size(const int *size, int dim) { int i; size_t n = 0; if (size[0] <= 0) return 0; n = (size_t)size[0]; for (i = 1; i < dim; i++) { if (size[i] <= 0) return 0; n *= (size_t)size[i]; } return (size_t)n; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 size_t SOAP_FMAC2 soap_getsizes(const char *attr, int *size, int dim) { size_t i, k, n; if (!*attr) return 0; i = strlen(attr); n = 1; do { for (; i > 0; i--) if (attr[i - 1] == '[' || attr[i - 1] == ',' || attr[i - 1] == ' ') break; n *= k = (size_t)soap_strtoul(attr + i, NULL, 10); size[--dim] = (int)k; if (n > SOAP_MAXARRAYSIZE) return 0; } while (dim > 0 && --i > 0 && attr[i] != '['); return n; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_getoffsets(const char *attr, const int *size, int *offset, int dim) { int i, j = 0; if (offset) { for (i = 0; i < dim && attr && *attr; i++) { attr++; j *= size[i]; j += offset[i] = (int)soap_strtol(attr, NULL, 10); attr = strchr(attr, ','); } } else { for (i = 0; i < dim && attr && *attr; i++) { attr++; j *= size[i]; j += (int)soap_strtol(attr, NULL, 10); attr = strchr(attr, ','); } } return j; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_getposition(const char *attr, int *pos) { int i, n; if (!*attr) return -1; n = 0; i = 1; do { pos[n++] = (int)soap_strtol(attr + i, NULL, 10); while (attr[i] && attr[i] != ',' && attr[i] != ']') i++; if (attr[i] == ',') i++; } while (n < SOAP_MAXDIMS && attr[i] && attr[i] != ']'); return n; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 struct soap_nlist * SOAP_FMAC2 soap_push_namespace(struct soap *soap, const char *id, const char *ns) { struct soap_nlist *np; struct Namespace *p; short i = -1; size_t n, k; n = strlen(id); k = strlen(ns) + 1; p = soap->local_namespaces; if (p) { for (i = 0; p->id; p++, i++) { if (p->ns && !strcmp(ns, p->ns)) break; if (p->out) { if (!strcmp(ns, p->out)) break; } else if (p->in) { if (!soap_tag_cmp(ns, p->in)) { if ((p->out = (char*)SOAP_MALLOC(soap, k))) soap_strcpy(p->out, k, ns); break; } } } if (!p->id) i = -1; } if (i >= 0) k = 0; np = (struct soap_nlist*)SOAP_MALLOC(soap, sizeof(struct soap_nlist) + n + k); if (!np) { soap->error = SOAP_EOM; return NULL; } np->next = soap->nlist; soap->nlist = np; np->level = soap->level; np->index = i; soap_strcpy((char*)np->id, n + 1, id); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Push namespace binding (level=%u) '%s'='%s'\n", soap->level, id, ns)); if (i < 0) { np->ns = np->id + n + 1; soap_strcpy((char*)np->ns, k, ns); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Push NOT OK: no match found for '%s' in namespace mapping table (added to stack anyway)\n", ns)); } else { np->ns = NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Push OK ('%s' matches '%s' in namespace table)\n", id, p->id)); } return np; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_pop_namespace(struct soap *soap) { struct soap_nlist *np, *nq; for (np = soap->nlist; np && np->level >= soap->level; np = nq) { nq = np->next; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Pop namespace binding (level=%u) '%s' level=%u\n", soap->level, np->id, np->level)); SOAP_FREE(soap, np); } soap->nlist = np; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_match_namespace(struct soap *soap, const char *id1, const char *id2, size_t n1, size_t n2) { struct soap_nlist *np = soap->nlist; const char *s; while (np && (strncmp(np->id, id1, n1) || np->id[n1])) np = np->next; if (np) { if (!(soap->mode & SOAP_XML_IGNORENS) && (n2 > 0 || !np->ns || *np->ns)) { if (np->index < 0 || ((s = soap->local_namespaces[np->index].id) && (strncmp(s, id2, n2) || (s[n2] && s[n2] != '_')))) return SOAP_NAMESPACE; } return SOAP_OK; } if (n1 == 0) return n2 == 0 || (soap->mode & SOAP_XML_IGNORENS) ? SOAP_OK : SOAP_NAMESPACE; if ((n1 == 3 && n1 == n2 && !strncmp(id1, "xml", 3) && !strncmp(id1, id2, 3)) || (soap->mode & SOAP_XML_IGNORENS)) return SOAP_OK; return soap->error = SOAP_SYNTAX_ERROR; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_current_namespace(struct soap *soap, const char *tag) { struct soap_nlist *np; const char *s; if (!tag || !strncmp(tag, "xml", 3)) return NULL; np = soap->nlist; if (!(s = strchr(tag, ':'))) { while (np && *np->id) /* find default namespace, if present */ np = np->next; } else { while (np && (strncmp(np->id, tag, s - tag) || np->id[s - tag])) np = np->next; if (!np) soap->error = SOAP_NAMESPACE; } if (np) { if (np->index >= 0) return soap->namespaces[np->index].ns; if (np->ns && *np->ns) return soap_strdup(soap, np->ns); } return NULL; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_tag_cmp(const char *s, const char *t) { for (;;) { int c1 = *s; int c2 = *t; if (!c1 || c1 == '"') break; if (c2 != '-') { if (c1 != c2) { if (c1 >= 'A' && c1 <= 'Z') c1 += 'a' - 'A'; if (c2 >= 'A' && c2 <= 'Z') c2 += 'a' - 'A'; } if (c1 != c2) { if (c2 != '*') return 1; c2 = *++t; if (!c2) return 0; if (c2 >= 'A' && c2 <= 'Z') c2 += 'a' - 'A'; for (;;) { c1 = *s; if (!c1 || c1 == '"') break; if (c1 >= 'A' && c1 <= 'Z') c1 += 'a' - 'A'; if (c1 == c2 && !soap_tag_cmp(s + 1, t + 1)) return 0; s++; } break; } } s++; t++; } if (*t == '*' && !t[1]) return 0; return *t; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_match_tag(struct soap *soap, const char *tag1, const char *tag2) { const char *s, *t; int err; if (!tag1 || !tag2 || !*tag2) return SOAP_OK; s = strchr(tag1, ':'); t = strchr(tag2, ':'); if (t) { if (s) { if (t[1] && SOAP_STRCMP(s + 1, t + 1)) return SOAP_TAG_MISMATCH; if (t != tag2 && (err = soap_match_namespace(soap, tag1, tag2, s - tag1, t - tag2))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Tags '%s' and '%s' match but namespaces differ\n", tag1, tag2)); if (err == SOAP_NAMESPACE) return SOAP_TAG_MISMATCH; return err; } } else if (!t[1]) { if ((soap->mode & SOAP_XML_IGNORENS) || soap_match_namespace(soap, tag1, tag2, 0, t - tag2)) return SOAP_TAG_MISMATCH; } else if (SOAP_STRCMP(tag1, t + 1)) { return SOAP_TAG_MISMATCH; } else if (t != tag2 && (err = soap_match_namespace(soap, tag1, tag2, 0, t - tag2))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Tags '%s' and '%s' match but namespaces differ\n", tag1, tag2)); if (err == SOAP_NAMESPACE) return SOAP_TAG_MISMATCH; return err; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Tags and (default) namespaces match: '%s' '%s'\n", tag1, tag2)); return SOAP_OK; } if (s) { if (!(soap->mode & SOAP_XML_IGNORENS) || SOAP_STRCMP(s + 1, tag2)) /* always fails (except when ignoring ns) */ return SOAP_TAG_MISMATCH; } else if (SOAP_STRCMP(tag1, tag2) || ((soap->mode & SOAP_XML_STRICT) && !(soap->mode & SOAP_XML_IGNORENS) && soap_match_namespace(soap, tag1, tag2, 0, 0))) /* strict checking: default namespace must be null namespace */ return SOAP_TAG_MISMATCH; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Tags match: '%s' '%s'\n", tag1, tag2)); return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_match_array(struct soap *soap, const char *type) { if (*soap->arrayType) if (soap_match_tag(soap, soap->arrayType, type) && soap_match_tag(soap, soap->arrayType, "xsd:anyType") && soap_match_tag(soap, soap->arrayType, "xsd:ur-type") ) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Array type mismatch: '%s' '%s'\n", soap->arrayType, type)); return SOAP_TAG_MISMATCH; } return SOAP_OK; } #endif /******************************************************************************\ * * SSL/TLS * \******************************************************************************/ #ifdef WITH_OPENSSL #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_rand() { unsigned char buf[4]; if (!soap_ssl_init_done) soap_ssl_init(); RAND_pseudo_bytes(buf, 4); return *(int*)buf; } #endif #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) || defined(WITH_SYSTEMSSL) #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE) soap_ssl_server_context(struct soap *soap, unsigned short flags, const char *keyfile, const char *keyid, const char *password, const char *cafile, const char *capath, const char *dhfile, const char *randfile, const char *sid) #else soap_ssl_server_context(struct soap *soap, unsigned short flags, const char *keyfile, const char *password, const char *cafile, const char *capath, const char *dhfile, const char *randfile, const char *sid) #endif { int err; soap->keyfile = keyfile; #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE) soap->keyid = keyid; #endif soap->password = password; soap->cafile = cafile; soap->capath = capath; #ifdef WITH_OPENSSL soap->dhfile = dhfile; soap->randfile = randfile; if (!soap->fsslverify) soap->fsslverify = ssl_verify_callback; #endif soap->ssl_flags = flags | (dhfile == NULL ? SOAP_SSL_RSA : 0); #ifdef WITH_GNUTLS (void)randfile; (void)sid; if (dhfile) { char *s; int n = (int)soap_strtoul(dhfile, &s, 10); if (!soap->dh_params) gnutls_dh_params_init(&soap->dh_params); /* if dhfile is numeric, treat it as a key length to generate DH params which can take a while */ if (n >= 512 && s && *s == '\0') gnutls_dh_params_generate2(soap->dh_params, (unsigned int)n); else { unsigned int dparams_len; unsigned char dparams_buf[1024]; FILE *fd = fopen(dhfile, "r"); if (!fd) return soap_set_receiver_error(soap, "SSL/TLS error", "Invalid DH file", SOAP_SSL_ERROR); dparams_len = (unsigned int)fread(dparams_buf, 1, sizeof(dparams_buf), fd); fclose(fd); gnutls_datum_t dparams = { dparams_buf, dparams_len }; if (gnutls_dh_params_import_pkcs3(soap->dh_params, &dparams, GNUTLS_X509_FMT_PEM)) return soap_set_receiver_error(soap, "SSL/TLS error", "Invalid DH file", SOAP_SSL_ERROR); } } else { if (!soap->rsa_params) gnutls_rsa_params_init(&soap->rsa_params); gnutls_rsa_params_generate2(soap->rsa_params, SOAP_SSL_RSA_BITS); } if (soap->session) { gnutls_deinit(soap->session); soap->session = NULL; } if (soap->xcred) { gnutls_certificate_free_credentials(soap->xcred); soap->xcred = NULL; } #endif #ifdef WITH_SYSTEMSSL (void)randfile; (void)sid; if (soap->ctx) gsk_environment_close(&soap->ctx); #endif err = soap->fsslauth(soap); #ifdef WITH_OPENSSL if (!err) { if (sid) SSL_CTX_set_session_id_context(soap->ctx, (unsigned char*)sid, (unsigned int)strlen(sid)); else SSL_CTX_set_session_cache_mode(soap->ctx, SSL_SESS_CACHE_OFF); } #endif return err; } #endif #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) || defined(WITH_SYSTEMSSL) #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE) soap_ssl_client_context(struct soap *soap, unsigned short flags, const char *keyfile, const char *keyid, const char *password, const char *cafile, const char *capath, const char *randfile) #else soap_ssl_client_context(struct soap *soap, unsigned short flags, const char *keyfile, const char *password, const char *cafile, const char *capath, const char *randfile) #endif { soap->keyfile = keyfile; #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE) soap->keyid = keyid; #endif soap->password = password; soap->cafile = cafile; soap->capath = capath; soap->ssl_flags = SOAP_SSL_CLIENT | flags; #ifdef WITH_OPENSSL soap->dhfile = NULL; soap->randfile = randfile; if (!soap->fsslverify) soap->fsslverify = (flags & SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE) == 0 ? ssl_verify_callback : ssl_verify_callback_allow_expired_certificate; #endif #ifdef WITH_GNUTLS (void)randfile; if (soap->session) { gnutls_deinit(soap->session); soap->session = NULL; } if (soap->xcred) { gnutls_certificate_free_credentials(soap->xcred); soap->xcred = NULL; } #endif #ifdef WITH_SYSTEMSSL (void)randfile; if (soap->ctx) gsk_environment_close(&soap->ctx); #endif return soap->fsslauth(soap); } #endif #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_ssl_crl(struct soap *soap, const char *crlfile) { #ifdef WITH_OPENSSL if (crlfile && soap->ctx) { #if (OPENSSL_VERSION_NUMBER >= 0x0090800fL) X509_STORE *store = SSL_CTX_get_cert_store(soap->ctx); if (*crlfile) { int ret; X509_LOOKUP *lookup = X509_STORE_add_lookup(store, X509_LOOKUP_file()); if ((ret = X509_load_crl_file(lookup, crlfile, X509_FILETYPE_PEM)) <= 0) return soap_set_receiver_error(soap, soap_ssl_error(soap, ret), "Can't read CRL file", SOAP_SSL_ERROR); } X509_VERIFY_PARAM *param = X509_VERIFY_PARAM_new(); X509_VERIFY_PARAM_set_flags(param, X509_V_FLAG_CRL_CHECK); X509_STORE_set1_param(store, param); X509_VERIFY_PARAM_free(param); #endif } else soap->crlfile = crlfile; /* activate later when store is available */ #endif #ifdef WITH_GNUTLS if (crlfile && soap->xcred) { if (*crlfile) if (gnutls_certificate_set_x509_crl_file(soap->xcred, crlfile, GNUTLS_X509_FMT_PEM) < 0) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read CRL file", SOAP_SSL_ERROR); } else soap->crlfile = crlfile; /* activate later when xcred is available */ #endif return SOAP_OK; } #endif #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_ssl_init() { /* Note: for MT systems, the main program MUST call soap_ssl_init() before any threads are started */ if (!soap_ssl_init_done) { soap_ssl_init_done = 1; #ifdef WITH_OPENSSL SSL_library_init(); OpenSSL_add_all_algorithms(); /* we keep ciphers and digests for the program's lifetime */ #ifndef WITH_LEAN SSL_load_error_strings(); #endif if (!RAND_load_file("/dev/urandom", 1024)) { char buf[1024]; RAND_seed(buf, sizeof(buf)); while (!RAND_status()) { int r = rand(); RAND_seed(&r, sizeof(int)); } } #endif #ifdef WITH_GNUTLS # if defined(HAVE_PTHREAD_H) gcry_control(GCRYCTL_SET_THREAD_CBS, &gcry_threads_pthread); # elif defined(HAVE_PTH_H) gcry_control(GCRYCTL_SET_THREAD_CBS, &gcry_threads_pth); # endif gcry_control(GCRYCTL_ENABLE_QUICK_RANDOM, 0); gcry_control(GCRYCTL_DISABLE_SECMEM, 0); gcry_control(GCRYCTL_INITIALIZATION_FINISHED, 0); /* libgcrypt init done */ gnutls_global_init(); #endif } } #endif #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) #ifndef PALM_1 SOAP_FMAC1 const char * SOAP_FMAC2 soap_ssl_error(struct soap *soap, int ret) { #ifdef WITH_OPENSSL int err = SSL_get_error(soap->ssl, ret); const char *msg = soap_code_str(h_ssl_error_codes, err); if (msg) (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), strlen(msg) + 1), "%s\n", msg); else return ERR_error_string(err, soap->msgbuf); if (ERR_peek_error()) { unsigned long r; while ((r = ERR_get_error())) { size_t l = strlen(soap->msgbuf); ERR_error_string_n(r, soap->msgbuf + l, sizeof(soap->msgbuf) - l); } } else { size_t l = strlen(soap->msgbuf); switch (ret) { case 0: soap_strcpy(soap->msgbuf + l, sizeof(soap->msgbuf) - l, "EOF was observed that violates the SSL/TLS protocol. The client probably provided invalid authentication information."); break; case -1: { const char *s = strerror(soap_errno); (SOAP_SNPRINTF(soap->msgbuf + l, sizeof(soap->msgbuf) - l, strlen(s) + 42), "Error observed by underlying SSL/TLS BIO: %s", s); } break; } } return soap->msgbuf; #endif #ifdef WITH_GNUTLS (void)soap; return gnutls_strerror(ret); #endif } #endif #endif /******************************************************************************/ #ifdef WITH_SYSTEMSSL static int ssl_recv(int sk, void *s, int n, char *user) { (void)user; return recv(sk, s, n, 0); } #endif /******************************************************************************/ #ifdef WITH_SYSTEMSSL static int ssl_send(int sk, void *s, int n, char *user) { (void)user; return send(sk, s, n, 0); } #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) || defined(WITH_SYSTEMSSL) #ifndef PALM_1 static int ssl_auth_init(struct soap *soap) { #ifdef WITH_OPENSSL long flags; int mode; #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE) EVP_PKEY* pkey; #endif if (!soap_ssl_init_done) soap_ssl_init(); ERR_clear_error(); if (!soap->ctx) { #if (OPENSSL_VERSION_NUMBER >= 0x10100000L) /* TLS_method: a TLS/SSL connection established may understand the SSLv3, TLSv1, TLSv1.1 and TLSv1.2 protocols. */ soap->ctx = SSL_CTX_new(TLS_method()); #else /* SSLv23_method: a TLS/SSL connection established may understand the SSLv3, TLSv1, TLSv1.1 and TLSv1.2 protocols. */ soap->ctx = SSL_CTX_new(SSLv23_method()); #endif if (!soap->ctx) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't setup context", SOAP_SSL_ERROR); /* The following alters the behavior of SSL read/write: */ #if 0 SSL_CTX_set_mode(soap->ctx, SSL_MODE_ENABLE_PARTIAL_WRITE | SSL_MODE_AUTO_RETRY); #endif } if (soap->randfile) { if (!RAND_load_file(soap->randfile, -1)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't load randomness", SOAP_SSL_ERROR); } if (soap->cafile || soap->capath) { if (!SSL_CTX_load_verify_locations(soap->ctx, soap->cafile, soap->capath)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read CA file", SOAP_SSL_ERROR); if (soap->cafile && (soap->ssl_flags & SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION)) SSL_CTX_set_client_CA_list(soap->ctx, SSL_load_client_CA_file(soap->cafile)); } if (!(soap->ssl_flags & SOAP_SSL_NO_DEFAULT_CA_PATH)) { if (!SSL_CTX_set_default_verify_paths(soap->ctx)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read default CA file and/or directory", SOAP_SSL_ERROR); } if (soap->crlfile) { if (soap_ssl_crl(soap, soap->crlfile)) return soap->error; } /* This code assumes a typical scenario with key and cert in one PEM file, see alternative code below */ #if 1 if (soap->keyfile) { if (!SSL_CTX_use_certificate_chain_file(soap->ctx, soap->keyfile)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't find or read certificate in key file", SOAP_SSL_ERROR); if (soap->password) { SSL_CTX_set_default_passwd_cb_userdata(soap->ctx, (void*)soap->password); SSL_CTX_set_default_passwd_cb(soap->ctx, ssl_password); } #ifndef WM_SECURE_KEY_STORAGE if (!SSL_CTX_use_PrivateKey_file(soap->ctx, soap->keyfile, SSL_FILETYPE_PEM)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read key file", SOAP_SSL_ERROR); #endif } #else /* Suggested alternative approach to check the key file for cert only when cafile==NULL */ if (soap->password) { SSL_CTX_set_default_passwd_cb_userdata(soap->ctx, (void*)soap->password); SSL_CTX_set_default_passwd_cb(soap->ctx, ssl_password); } if (!soap->cafile) { if (soap->keyfile) { if (!SSL_CTX_use_certificate_chain_file(soap->ctx, soap->keyfile)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't find or read certificate in key file", SOAP_SSL_ERROR); if (!SSL_CTX_use_PrivateKey_file(soap->ctx, soap->keyfile, SSL_FILETYPE_PEM)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read key file", SOAP_SSL_ERROR); } } else /* use cafile for (server) cert and keyfile for (server) key */ { if (!SSL_CTX_use_certificate_chain_file(soap->ctx, soap->cafile)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read CA file", SOAP_SSL_ERROR); if (soap->keyfile) if (!SSL_CTX_use_PrivateKey_file(soap->ctx, soap->keyfile, SSL_FILETYPE_PEM)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read key file", SOAP_SSL_ERROR); } #endif #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE) if (NULL == (pkey = ipcom_key_db_pkey_get(soap->keyid))) return soap_set_receiver_error(soap, "SSL error", "Can't find key", SOAP_SSL_ERROR); if (0 == SSL_CTX_use_PrivateKey(soap->ctx, pkey)) return soap_set_receiver_error(soap, "SSL error", "Can't read key", SOAP_SSL_ERROR); #endif if ((soap->ssl_flags & SOAP_SSL_RSA)) { RSA *rsa = RSA_generate_key(SOAP_SSL_RSA_BITS, RSA_F4, NULL, NULL); if (!SSL_CTX_set_tmp_rsa(soap->ctx, rsa)) { if (rsa) RSA_free(rsa); return soap_set_receiver_error(soap, "SSL/TLS error", "Can't set RSA key", SOAP_SSL_ERROR); } RSA_free(rsa); } else if (soap->dhfile) { DH *dh = 0; char *s; int n = (int)soap_strtoul(soap->dhfile, &s, 10); /* if dhfile is numeric, treat it as a key length to generate DH params which can take a while */ if (n >= 512 && s && *s == '\0') #if defined(VXWORKS) DH_generate_parameters_ex(dh, n, 2/*or 5*/, NULL); #else dh = DH_generate_parameters(n, 2/*or 5*/, NULL, NULL); #endif else { BIO *bio; bio = BIO_new_file(soap->dhfile, "r"); if (!bio) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read DH file", SOAP_SSL_ERROR); dh = PEM_read_bio_DHparams(bio, NULL, NULL, NULL); BIO_free(bio); } if (!dh || DH_check(dh, &n) != 1 || SSL_CTX_set_tmp_dh(soap->ctx, dh) < 0) { if (dh) DH_free(dh); return soap_set_receiver_error(soap, "SSL/TLS error", "Can't set DH parameters", SOAP_SSL_ERROR); } DH_free(dh); } flags = (SSL_OP_ALL | SSL_OP_NO_SSLv2); /* disable SSL v2 by default */ if ((soap->ssl_flags & SOAP_SSLv3)) { #if (OPENSSL_VERSION_NUMBER >= 0x10001000L) flags |= SSL_OP_NO_TLSv1 | SSL_OP_NO_TLSv1_1 | SSL_OP_NO_TLSv1_2; #else flags |= SSL_OP_NO_TLSv1; #endif } else { if (!(soap->ssl_flags & SOAP_SSLv3_TLSv1)) flags |= SSL_OP_NO_SSLv3; /* disable SSL v3 by default, unless SOAP_SSLv3 or SOAP_SSLv3_TLSv1 is set */ #if (OPENSSL_VERSION_NUMBER >= 0x10001000L) if ((soap->ssl_flags & SOAP_TLSv1_0)) flags |= SSL_OP_NO_TLSv1_1 | SSL_OP_NO_TLSv1_2; else if ((soap->ssl_flags & SOAP_TLSv1_1)) flags |= SSL_OP_NO_TLSv1 | SSL_OP_NO_TLSv1_2; else if ((soap->ssl_flags & SOAP_TLSv1_2)) flags |= SSL_OP_NO_TLSv1 | SSL_OP_NO_TLSv1_1; #endif } #ifdef SSL_OP_NO_TICKET /* TLS extension is enabled by default in OPENSSL v0.9.8k Disable it by adding SSL_OP_NO_TICKET */ flags |= SSL_OP_NO_TICKET; #endif SSL_CTX_set_options(soap->ctx, flags); if ((soap->ssl_flags & SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION)) mode = (SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT); else if ((soap->ssl_flags & SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION)) mode = SSL_VERIFY_PEER; else mode = SSL_VERIFY_NONE; SSL_CTX_set_verify(soap->ctx, mode, soap->fsslverify); #if (OPENSSL_VERSION_NUMBER < 0x00905100L) SSL_CTX_set_verify_depth(soap->ctx, 1); #else SSL_CTX_set_verify_depth(soap->ctx, 9); #endif #endif #ifdef WITH_GNUTLS int ret; if (!soap_ssl_init_done) soap_ssl_init(); if (!soap->xcred) { gnutls_certificate_allocate_credentials(&soap->xcred); if (soap->cafile) { if (gnutls_certificate_set_x509_trust_file(soap->xcred, soap->cafile, GNUTLS_X509_FMT_PEM) < 0) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read CA file", SOAP_SSL_ERROR); } if (soap->crlfile) { if (soap_ssl_crl(soap, soap->crlfile)) return soap->error; } if (soap->keyfile) { if (gnutls_certificate_set_x509_key_file(soap->xcred, soap->keyfile, soap->keyfile, GNUTLS_X509_FMT_PEM) < 0) /* Assumes that key and cert(s) are concatenated in the keyfile */ return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read key file", SOAP_SSL_ERROR); } } if ((soap->ssl_flags & SOAP_SSL_CLIENT)) { gnutls_init(&soap->session, GNUTLS_CLIENT); if (soap->cafile || soap->crlfile || soap->keyfile) { ret = gnutls_priority_set_direct(soap->session, "PERFORMANCE", NULL); if (ret < 0) return soap_set_receiver_error(soap, soap_ssl_error(soap, ret), "SSL/TLS set priority error", SOAP_SSL_ERROR); gnutls_credentials_set(soap->session, GNUTLS_CRD_CERTIFICATE, soap->xcred); } else { if (!soap->acred) gnutls_anon_allocate_client_credentials(&soap->acred); gnutls_init(&soap->session, GNUTLS_CLIENT); gnutls_priority_set_direct(soap->session, "PERFORMANCE:+ANON-DH:!ARCFOUR-128", NULL); gnutls_credentials_set(soap->session, GNUTLS_CRD_ANON, soap->acred); } } else { if (!soap->keyfile) return soap_set_receiver_error(soap, "SSL/TLS error", "No key file: anonymous server authentication not supported in this release", SOAP_SSL_ERROR); if ((soap->ssl_flags & SOAP_SSL_RSA) && soap->rsa_params) gnutls_certificate_set_rsa_export_params(soap->xcred, soap->rsa_params); else if (soap->dh_params) gnutls_certificate_set_dh_params(soap->xcred, soap->dh_params); if (!soap->cache) gnutls_priority_init(&soap->cache, "NORMAL", NULL); gnutls_init(&soap->session, GNUTLS_SERVER); gnutls_priority_set(soap->session, soap->cache); gnutls_credentials_set(soap->session, GNUTLS_CRD_CERTIFICATE, soap->xcred); if ((soap->ssl_flags & SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION)) gnutls_certificate_server_set_request(soap->session, GNUTLS_CERT_REQUEST); gnutls_session_enable_compatibility_mode(soap->session); if ((soap->ssl_flags & SOAP_SSLv3)) { int protocol_priority[] = { GNUTLS_SSL3, 0 }; if (gnutls_protocol_set_priority(soap->session, protocol_priority) != GNUTLS_E_SUCCESS) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't set SSLv3 protocol", SOAP_SSL_ERROR); } else if ((soap->ssl_flags & SOAP_TLSv1_0)) { int protocol_priority[] = { GNUTLS_TLS1_0, 0 }; if (gnutls_protocol_set_priority(soap->session, protocol_priority) != GNUTLS_E_SUCCESS) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't set TLSv1.0 protocol", SOAP_SSL_ERROR); } else if ((soap->ssl_flags & SOAP_TLSv1_1)) { int protocol_priority[] = { GNUTLS_TLS1_1, 0 }; if (gnutls_protocol_set_priority(soap->session, protocol_priority) != GNUTLS_E_SUCCESS) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't set TLSv1.1 protocol", SOAP_SSL_ERROR); } else if ((soap->ssl_flags & SOAP_TLSv1_2)) { int protocol_priority[] = { GNUTLS_TLS1_2, 0 }; if (gnutls_protocol_set_priority(soap->session, protocol_priority) != GNUTLS_E_SUCCESS) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't set TLSv1.2 protocol", SOAP_SSL_ERROR); } else if ((soap->ssl_flags & SOAP_SSLv3_TLSv1)) { int protocol_priority[] = { GNUTLS_SSL3, GNUTLS_TLS1_0, GNUTLS_TLS1_1, GNUTLS_TLS1_2, 0 }; if (gnutls_protocol_set_priority(soap->session, protocol_priority) != GNUTLS_E_SUCCESS) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't set SSLv3 & TLSv1 protocols", SOAP_SSL_ERROR); } else { int protocol_priority[] = { GNUTLS_TLS1_0, GNUTLS_TLS1_1, GNUTLS_TLS1_2, 0 }; if (gnutls_protocol_set_priority(soap->session, protocol_priority) != GNUTLS_E_SUCCESS) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't set TLSv1 protocols", SOAP_SSL_ERROR); } } #endif #ifdef WITH_SYSTEMSSL if (!soap->ctx) { int err; err = gsk_environment_open(&soap->ctx); if (err == GSK_OK) err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_SSLV2, GSK_PROTOCOL_SSLV2_OFF); if (err == GSK_OK) { if ((soap->ssl_flags & SOAP_SSLv3) || (soap->ssl_flags & SOAP_SSLv3_TLSv1)) err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_SSLV3, GSK_PROTOCOL_SSLV3_ON); else err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_SSLV3, GSK_PROTOCOL_SSLV3_OFF); } if (!(soap->ssl_flags & SOAP_SSLv3)) { if (err == GSK_OK) err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_TLSV1, GSK_PROTOCOL_TLSV1_ON); if (err == GSK_OK) err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_TLSV1_1, GSK_PROTOCOL_TLSV1_1_ON); if (err == GSK_OK) err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_TLSV1_2, GSK_PROTOCOL_TLSV1_2_ON); } else { if (err == GSK_OK) err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_TLSV1, GSK_PROTOCOL_TLSV1_OFF); if (err == GSK_OK) err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_TLSV1_1, GSK_PROTOCOL_TLSV1_1_OFF); if (err == GSK_OK) err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_TLSV1_2, GSK_PROTOCOL_TLSV1_2_OFF); } if (err == GSK_OK) err = gsk_attribute_set_buffer(soap->ctx, GSK_KEYRING_FILE, soap->keyfile, 0); /* keyfile is a keyring .kdb file */ if (err == GSK_OK) err = gsk_attribute_set_buffer(soap->ctx, GSK_KEYRING_PW, soap->password, 0); /* locked by password */ if (err == GSK_OK) err = gsk_environment_init(soap->ctx); if (err != GSK_OK) return soap_set_receiver_error(soap, gsk_strerror(err), "SYSTEM SSL error in ssl_auth_init()", SOAP_SSL_ERROR); } #endif return SOAP_OK; } #endif #endif /******************************************************************************/ #ifdef WITH_OPENSSL #ifndef PALM_1 static int ssl_password(char *buf, int num, int rwflag, void *userdata) { (void)rwflag; if (!buf || !userdata) return 0; soap_strcpy(buf, (size_t)num, (char*)userdata); return (int)strlen(buf); } #endif #endif /******************************************************************************/ #ifdef WITH_OPENSSL #ifndef PALM_1 static int ssl_verify_callback(int ok, X509_STORE_CTX *store) { (void)store; #ifdef SOAP_DEBUG if (!ok) { char buf[1024]; int err = X509_STORE_CTX_get_error(store); X509 *cert = X509_STORE_CTX_get_current_cert(store); fprintf(stderr, "\nDEBUG mode TLS/SSL warnings:\nSSL verify error %d or warning with certificate at depth %d: %s\n", err, X509_STORE_CTX_get_error_depth(store), X509_verify_cert_error_string(err)); X509_NAME_oneline(X509_get_issuer_name(cert), buf, sizeof(buf)); fprintf(stderr, " certificate issuer: %s\n", buf); X509_NAME_oneline(X509_get_subject_name(cert), buf, sizeof(buf)); fprintf(stderr, " certificate subject: %s\n", buf); /* accept self-signed certificates and certificates out of date */ switch (err) { case X509_V_ERR_CERT_NOT_YET_VALID: case X509_V_ERR_CERT_HAS_EXPIRED: case X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT: case X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN: case X509_V_ERR_UNABLE_TO_GET_CRL: case X509_V_ERR_CRL_NOT_YET_VALID: case X509_V_ERR_CRL_HAS_EXPIRED: X509_STORE_CTX_set_error(store, X509_V_OK); ok = 1; fprintf(stderr, "Initialize soap_ssl_client_context with SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE to allow this verification error to pass without DEBUG mode enabled\n"); } } #endif /* Note: return 1 to try to continue, but unsafe progress will be terminated by OpenSSL */ return ok; } #endif #endif /******************************************************************************/ #ifdef WITH_OPENSSL #ifndef PALM_1 static int ssl_verify_callback_allow_expired_certificate(int ok, X509_STORE_CTX *store) { ok = ssl_verify_callback(ok, store); if (!ok) { /* accept self signed certificates, expired certificates, and certficiates w/o CRL */ switch (X509_STORE_CTX_get_error(store)) { case X509_V_ERR_CERT_NOT_YET_VALID: case X509_V_ERR_CERT_HAS_EXPIRED: case X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT: case X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN: case X509_V_ERR_UNABLE_TO_GET_CRL: case X509_V_ERR_CRL_NOT_YET_VALID: case X509_V_ERR_CRL_HAS_EXPIRED: X509_STORE_CTX_set_error(store, X509_V_OK); ok = 1; } } /* Note: return 1 to continue, but unsafe progress will be terminated by SSL */ return ok; } #endif #endif /******************************************************************************/ #ifdef WITH_GNUTLS static const char * ssl_verify(struct soap *soap, const char *host) { unsigned int status; const char *err = NULL; int r = gnutls_certificate_verify_peers2(soap->session, &status); if (r < 0) err = "Certificate verify error"; else if ((status & GNUTLS_CERT_INVALID)) err = "The certificate is not trusted"; else if ((status & GNUTLS_CERT_SIGNER_NOT_FOUND)) err = "The certificate hasn't got a known issuer"; else if ((status & GNUTLS_CERT_REVOKED)) err = "The certificate has been revoked"; else if (gnutls_certificate_type_get(soap->session) == GNUTLS_CRT_X509) { gnutls_x509_crt_t cert; const gnutls_datum_t *cert_list; unsigned int cert_list_size; if (gnutls_x509_crt_init(&cert) < 0) err = "Could not get X509 certificates"; else if ((cert_list = gnutls_certificate_get_peers(soap->session, &cert_list_size)) == NULL) err = "Could not get X509 certificates"; else if (gnutls_x509_crt_import(cert, &cert_list[0], GNUTLS_X509_FMT_DER) < 0) err = "Error parsing X509 certificate"; else if (!(soap->ssl_flags & SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE) && gnutls_x509_crt_get_expiration_time(cert) < time(NULL)) err = "The certificate has expired"; else if (!(soap->ssl_flags & SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE) && gnutls_x509_crt_get_activation_time(cert) > time(NULL)) err = "The certificate is not yet activated"; else if (host && !(soap->ssl_flags & SOAP_SSL_SKIP_HOST_CHECK)) { if (!gnutls_x509_crt_check_hostname(cert, host)) err = "Certificate host name mismatch"; } gnutls_x509_crt_deinit(cert); } return err; } #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) #ifndef WITH_NOIO #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_ssl_accept(struct soap *soap) { SOAP_SOCKET sk = soap->socket; #ifdef WITH_OPENSSL BIO *bio; int retries, r, s; if (!soap_valid_socket(sk)) return soap_set_receiver_error(soap, "SSL/TLS error", "No socket in soap_ssl_accept()", SOAP_SSL_ERROR); soap->ssl_flags &= ~SOAP_SSL_CLIENT; if (!soap->ctx && (soap->error = soap->fsslauth(soap))) return soap->error; if (!soap->ssl) { soap->ssl = SSL_new(soap->ctx); if (!soap->ssl) return soap_set_receiver_error(soap, "SSL/TLS error", "SSL_new() failed in soap_ssl_accept()", SOAP_SSL_ERROR); } else SSL_clear(soap->ssl); bio = BIO_new_socket((int)sk, BIO_NOCLOSE); SSL_set_bio(soap->ssl, bio, bio); /* Set SSL sockets to non-blocking */ retries = 0; if (soap->accept_timeout) { SOAP_SOCKNONBLOCK(sk) retries = 10*soap->accept_timeout; } if (retries <= 0) retries = 100; /* timeout: 10 sec retries, 100 times 0.1 sec */ while ((r = SSL_accept(soap->ssl)) <= 0) { int err; if (retries-- <= 0) break; err = SSL_get_error(soap->ssl, r); if (err == SSL_ERROR_WANT_ACCEPT || err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE) { if (err == SSL_ERROR_WANT_READ) s = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, -100000); else s = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, -100000); if (s < 0) break; } else { soap->errnum = soap_socket_errno(sk); break; } } if (r <= 0) { soap_set_receiver_error(soap, soap_ssl_error(soap, r), "SSL_accept() failed in soap_ssl_accept()", SOAP_SSL_ERROR); soap_closesock(soap); return SOAP_SSL_ERROR; } if ((soap->ssl_flags & SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION)) { X509 *peer; int err; if ((err = SSL_get_verify_result(soap->ssl)) != X509_V_OK) { soap_closesock(soap); return soap_set_sender_error(soap, X509_verify_cert_error_string(err), "SSL certificate presented by peer cannot be verified in soap_ssl_accept()", SOAP_SSL_ERROR); } peer = SSL_get_peer_certificate(soap->ssl); if (!peer) { soap_closesock(soap); return soap_set_sender_error(soap, "SSL/TLS error", "No SSL certificate was presented by the peer in soap_ssl_accept()", SOAP_SSL_ERROR); } X509_free(peer); } #endif #ifdef WITH_GNUTLS int retries = 0, r; if (!soap_valid_socket(sk)) return soap_set_receiver_error(soap, "SSL/TLS error", "No socket in soap_ssl_accept()", SOAP_SSL_ERROR); soap->ssl_flags &= ~SOAP_SSL_CLIENT; if (!soap->session && (soap->error = soap->fsslauth(soap))) { soap_closesock(soap); return soap->error; } gnutls_transport_set_ptr(soap->session, (gnutls_transport_ptr_t)(long)sk); /* Set SSL sockets to non-blocking */ if (soap->accept_timeout) { SOAP_SOCKNONBLOCK(sk) retries = 10*soap->accept_timeout; } if (retries <= 0) retries = 100; /* timeout: 10 sec retries, 100 times 0.1 sec */ while ((r = gnutls_handshake(soap->session))) { int s; /* GNUTLS repeat handhake when GNUTLS_E_AGAIN */ if (retries-- <= 0) break; if (r == GNUTLS_E_AGAIN || r == GNUTLS_E_INTERRUPTED) { if (!gnutls_record_get_direction(soap->session)) s = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, -100000); else s = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, -100000); if (s < 0) break; } else { soap->errnum = soap_socket_errno(sk); break; } } if (r) { soap_closesock(soap); return soap_set_receiver_error(soap, soap_ssl_error(soap, r), "SSL/TLS handshake failed", SOAP_SSL_ERROR); } if ((soap->ssl_flags & SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION)) { const char *err = ssl_verify(soap, NULL); if (err) { soap_closesock(soap); return soap_set_receiver_error(soap, "SSL/TLS error", err, SOAP_SSL_ERROR); } } #endif #ifdef WITH_SYSTEMSSL gsk_iocallback local_io = { ssl_recv, ssl_send, NULL, NULL, NULL, NULL }; int err, s; int retries = 0; if (soap->accept_timeout) { SOAP_SOCKNONBLOCK(sk) retries = 10*soap->accept_timeout; } if (retries <= 0) retries = 100; /* timeout: 10 sec retries, 100 times 0.1 sec */ err = gsk_secure_socket_open(soap->ctx, &soap->ssl); if (err == GSK_OK) err = gsk_attribute_set_numeric_value(soap->ssl, GSK_FD, sk); if (err == GSK_OK) err = gsk_attribute_set_buffer(soap->ssl, GSK_KEYRING_LABEL, soap->cafile, 0); if (err == GSK_OK) err = gsk_attribute_set_enum(soap->ssl, GSK_SESSION_TYPE, GSK_SERVER_SESSION); if (err == GSK_OK) err = gsk_attribute_set_buffer(soap->ssl, GSK_V3_CIPHER_SPECS_EXPANDED, "0035002F000A", 0); if (err == GSK_OK) err = gsk_attribute_set_enum(soap->ssl, GSK_V3_CIPHERS, GSK_V3_CIPHERS_CHAR4); if (err == GSK_OK) err = gsk_attribute_set_callback(soap->ssl, GSK_IO_CALLBACK, &local_io); if (err != GSK_OK) return soap_set_receiver_error(soap, gsk_strerror(err), "SYSTEM SSL error in soap_ssl_accept()", SOAP_SSL_ERROR); while ((err = gsk_secure_socket_init(soap->ssl)) != GSK_OK) { if (retries-- <= 0) break; if (err == GSK_WOULD_BLOCK_READ || err == GSK_WOULD_BLOCK_WRITE) { if (err == GSK_WOULD_BLOCK_READ) s = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, -100000); else s = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, -100000); if (s < 0) break; } else { soap->errnum = soap_socket_errno(sk); break; } } if (err != GSK_OK) return soap_set_receiver_error(soap, gsk_strerror(err), "gsk_secure_socket_init() failed in soap_ssl_accept()", SOAP_SSL_ERROR); #endif if (soap->recv_timeout || soap->send_timeout) SOAP_SOCKNONBLOCK(sk) else SOAP_SOCKBLOCK(sk) soap->imode |= SOAP_ENC_SSL; soap->omode |= SOAP_ENC_SSL; return SOAP_OK; } #endif #endif #endif /******************************************************************************\ * * TCP/UDP [SSL/TLS] IPv4 and IPv6 * \******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 static int tcp_init(struct soap *soap) { soap->errmode = 1; #ifdef WIN32 if (tcp_done) return 0; else { WSADATA w; if (WSAStartup(MAKEWORD(1, 1), &w)) return -1; tcp_done = 1; } #endif return 0; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 static const char* tcp_error(struct soap *soap) { const char *msg = NULL; switch (soap->errmode) { case 0: msg = soap_strerror(soap); break; case 1: msg = "WSAStartup failed"; break; case 2: { #ifndef WITH_LEAN msg = soap_code_str(h_error_codes, soap->errnum); if (!msg) #endif { (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), 37), "TCP/UDP IP error %d", soap->errnum); msg = soap->msgbuf; } } } return msg; } #endif #endif /******************************************************************************/ #ifndef WITH_IPV6 #ifndef WITH_NOIO #ifndef PALM_1 static int tcp_gethost(struct soap *soap, const char *addr, struct in_addr *inaddr) { soap_int32 iadd = -1; struct hostent hostent, *host = &hostent; #ifdef VXWORKS int hostint; /* inet_addr(), and hostGetByName() expect "char *"; addr is a "const char *". */ iadd = inet_addr((char*)addr); #else #if defined(_AIX43) || ((defined(TRU64) || defined(HP_UX)) && defined(HAVE_GETHOSTBYNAME_R)) struct hostent_data ht_data; #endif #ifdef AS400 iadd = inet_addr((void*)addr); #else iadd = inet_addr((char*)addr); #endif #endif if (iadd != -1) { if (soap_memcpy((void*)inaddr, sizeof(struct in_addr), (const void*)&iadd, sizeof(iadd))) return soap->error = SOAP_EOM; return SOAP_OK; } #if defined(__GLIBC__) || (defined(HAVE_GETHOSTBYNAME_R) && (defined(FREEBSD) || defined(__FreeBSD__))) || defined(__ANDROID__) if (gethostbyname_r(addr, &hostent, soap->buf, sizeof(soap->buf), &host, &soap->errnum) < 0) host = NULL; #elif defined(_AIX43) || ((defined(TRU64) || defined(HP_UX)) && defined(HAVE_GETHOSTBYNAME_R)) memset((void*)&ht_data, 0, sizeof(ht_data)); if (gethostbyname_r(addr, &hostent, &ht_data) < 0) { host = NULL; soap->errnum = h_errno; } #elif defined(HAVE_GETHOSTBYNAME_R) host = gethostbyname_r(addr, &hostent, soap->buf, sizeof(soap->buf), &soap->errnum); #elif defined(VXWORKS) /* If the DNS resolver library resolvLib has been configured in the vxWorks * image, a query for the host IP address is sent to the DNS server, if the * name was not found in the local host table. */ hostint = hostGetByName((char*)addr); if (hostint == ERROR) { host = NULL; soap->errnum = soap_errno; } #else #ifdef AS400 if (!(host = gethostbyname((void*)addr))) soap->errnum = h_errno; #else if (!(host = gethostbyname((char*)addr))) soap->errnum = h_errno; #endif #endif if (!host) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Host name not found\n")); return SOAP_ERR; } #ifdef VXWORKS inaddr->s_addr = hostint; #else if (soap_memcpy((void*)inaddr, sizeof(struct in_addr), (const void*)host->h_addr, (size_t)host->h_length)) return soap->error = SOAP_EOM; #endif return SOAP_OK; } #endif #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 static SOAP_SOCKET tcp_connect(struct soap *soap, const char *endpoint, const char *host, int port) { #ifdef WITH_IPV6 struct addrinfo hints, *res, *ressave; #endif SOAP_SOCKET sk; int err = 0; #ifndef WITH_LEAN #ifndef WIN32 int len = sizeof(soap->buf); #else int len = sizeof(soap->buf) + 1; /* speeds up windows xfer */ #endif int set = 1; #endif #if !defined(WITH_LEAN) || defined(WITH_OPENSSL) || defined(WITH_GNUTLS) || defined(WITH_SYSTEMSSL) int retries; #endif if (soap_valid_socket(soap->socket)) soap->fclosesocket(soap, soap->socket); soap->socket = SOAP_INVALID_SOCKET; if (tcp_init(soap)) { soap->errnum = 0; soap_set_receiver_error(soap, tcp_error(soap), "TCP init failed in tcp_connect()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } soap->errmode = 0; #ifdef WITH_IPV6 memset((void*)&hints, 0, sizeof(hints)); #ifdef WITH_IPV6_V6ONLY hints.ai_family = PF_INET6; #else hints.ai_family = PF_UNSPEC; #endif #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) hints.ai_socktype = SOCK_DGRAM; else #endif hints.ai_socktype = SOCK_STREAM; soap->errmode = 2; if (soap->proxy_host) err = getaddrinfo(soap->proxy_host, soap_int2s(soap, soap->proxy_port), &hints, &res); else err = getaddrinfo(host, soap_int2s(soap, port), &hints, &res); if (err || !res) { soap_set_receiver_error(soap, SOAP_GAI_STRERROR(err), "getaddrinfo failed in tcp_connect()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } ressave = res; again: sk = socket(res->ai_family, res->ai_socktype, res->ai_protocol); soap->error = SOAP_OK; soap->errmode = 0; #else #ifndef WITH_LEAN again: #endif #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) sk = socket(AF_INET, SOCK_DGRAM, 0); else #endif sk = socket(AF_INET, SOCK_STREAM, 0); #endif if (!soap_valid_socket(sk)) { #ifdef WITH_IPV6 if (res->ai_next) { res = res->ai_next; goto again; } #endif soap->errnum = soap_socket_errno(sk); soap_set_receiver_error(soap, tcp_error(soap), "socket failed in tcp_connect()", SOAP_TCP_ERROR); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } #ifdef SOCKET_CLOSE_ON_EXIT #ifdef WIN32 #ifndef UNDER_CE SetHandleInformation((HANDLE)sk, HANDLE_FLAG_INHERIT, 0); #endif #else fcntl(sk, F_SETFD, 1); #endif #endif #ifndef WITH_LEAN if ((soap->connect_flags & SO_LINGER)) { struct linger linger; memset((void*)&linger, 0, sizeof(linger)); linger.l_onoff = 1; linger.l_linger = soap->linger_time; if (setsockopt(sk, SOL_SOCKET, SO_LINGER, (char*)&linger, sizeof(struct linger))) { soap->errnum = soap_socket_errno(sk); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_LINGER failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } } if ((soap->connect_flags & ~SO_LINGER) && setsockopt(sk, SOL_SOCKET, soap->connect_flags & ~SO_LINGER, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(sk); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } #ifndef UNDER_CE if ((soap->keep_alive || soap->tcp_keep_alive) && setsockopt(sk, SOL_SOCKET, SO_KEEPALIVE, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(sk); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_KEEPALIVE failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } if (setsockopt(sk, SOL_SOCKET, SO_SNDBUF, (char*)&len, sizeof(int))) { soap->errnum = soap_socket_errno(sk); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_SNDBUF failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } if (setsockopt(sk, SOL_SOCKET, SO_RCVBUF, (char*)&len, sizeof(int))) { soap->errnum = soap_socket_errno(sk); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_RCVBUF failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } #ifdef TCP_KEEPIDLE if (soap->tcp_keep_idle && setsockopt((SOAP_SOCKET)sk, IPPROTO_TCP, TCP_KEEPIDLE, (char*)&(soap->tcp_keep_idle), sizeof(int))) { soap->errnum = soap_socket_errno(sk); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt TCP_KEEPIDLE failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, (SOAP_SOCKET)sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } #endif #ifdef TCP_KEEPINTVL if (soap->tcp_keep_intvl && setsockopt((SOAP_SOCKET)sk, IPPROTO_TCP, TCP_KEEPINTVL, (char*)&(soap->tcp_keep_intvl), sizeof(int))) { soap->errnum = soap_socket_errno(sk); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt TCP_KEEPINTVL failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, (SOAP_SOCKET)sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } #endif #ifdef TCP_KEEPCNT if (soap->tcp_keep_cnt && setsockopt((SOAP_SOCKET)sk, IPPROTO_TCP, TCP_KEEPCNT, (char*)&(soap->tcp_keep_cnt), sizeof(int))) { soap->errnum = soap_socket_errno(sk); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt TCP_KEEPCNT failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, (SOAP_SOCKET)sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } #endif #ifdef TCP_NODELAY if (!(soap->omode & SOAP_IO_UDP) && setsockopt(sk, IPPROTO_TCP, TCP_NODELAY, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(sk); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt TCP_NODELAY failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } #endif #ifdef WITH_IPV6 if ((soap->omode & SOAP_IO_UDP) && soap->ipv6_multicast_if) { struct sockaddr_in6 *in6addr = (struct sockaddr_in6*)res->ai_addr; in6addr->sin6_scope_id = soap->ipv6_multicast_if; } #endif #ifdef IP_MULTICAST_TTL if ((soap->omode & SOAP_IO_UDP)) { if (soap->ipv4_multicast_ttl) { unsigned char ttl = soap->ipv4_multicast_ttl; if (setsockopt(sk, IPPROTO_IP, IP_MULTICAST_TTL, (char*)&ttl, sizeof(ttl))) { soap->errnum = soap_socket_errno(sk); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt IP_MULTICAST_TTL failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } } if ((soap->omode & SOAP_IO_UDP) && soap->ipv4_multicast_if && !soap->ipv6_multicast_if) { if (setsockopt(sk, IPPROTO_IP, IP_MULTICAST_IF, (char*)soap->ipv4_multicast_if, sizeof(struct in_addr))) #ifndef WINDOWS { soap->errnum = soap_socket_errno(sk); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt IP_MULTICAST_IF failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } #else #ifndef IP_MULTICAST_IF #define IP_MULTICAST_IF 2 #endif if (setsockopt(sk, IPPROTO_IP, IP_MULTICAST_IF, (char*)soap->ipv4_multicast_if, sizeof(struct in_addr))) { soap->errnum = soap_socket_errno(sk); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt IP_MULTICAST_IF failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } #endif } } #endif #endif #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Opening socket=%d to host='%s' port=%d\n", sk, host, port)); #ifndef WITH_IPV6 soap->peerlen = sizeof(soap->peer.in); memset((void*)&soap->peer.in, 0, sizeof(soap->peer.in)); soap->peer.in.sin_family = AF_INET; soap->errmode = 2; if (soap->proxy_host) { if (soap->fresolve(soap, soap->proxy_host, &soap->peer.in.sin_addr)) { soap_set_receiver_error(soap, tcp_error(soap), "get proxy host by name failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } soap->peer.in.sin_port = htons((short)soap->proxy_port); } else { if (soap->fresolve(soap, host, &soap->peer.in.sin_addr)) { soap_set_receiver_error(soap, tcp_error(soap), "get host by name failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } soap->peer.in.sin_port = htons((short)port); } soap->errmode = 0; #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) return sk; #endif #else if ((soap->omode & SOAP_IO_UDP)) { if (soap_memcpy((void*)&soap->peer.storage, sizeof(soap->peer.storage), (const void*)res->ai_addr, res->ai_addrlen)) { soap->error = SOAP_EOM; soap->fclosesocket(soap, sk); sk = SOAP_INVALID_SOCKET; } soap->peerlen = res->ai_addrlen; freeaddrinfo(ressave); return sk; } #endif #ifndef WITH_LEAN if (soap->connect_timeout) SOAP_SOCKNONBLOCK(sk) else SOAP_SOCKBLOCK(sk) retries = 10; #endif for (;;) { #ifdef WITH_IPV6 if (connect(sk, res->ai_addr, (int)res->ai_addrlen)) #else if (connect(sk, &soap->peer.addr, sizeof(soap->peer.in))) #endif { err = soap_socket_errno(sk); #ifdef WITH_IPV6 if (err == SOAP_ECONNREFUSED && res->ai_next) { soap->fclosesocket(soap, sk); res = res->ai_next; goto again; } #endif #ifndef WITH_LEAN if (err == SOAP_EADDRINUSE) { soap->fclosesocket(soap, sk); if (retries-- > 0) goto again; } else if (soap->connect_timeout && (err == SOAP_EINPROGRESS || err == SOAP_EAGAIN || err == SOAP_EWOULDBLOCK)) { SOAP_SOCKLEN_T k; for (;;) { int r; r = tcp_select(soap, sk, SOAP_TCP_SELECT_SND, soap->connect_timeout); if (r > 0) break; if (!r) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connect timeout\n")); soap_set_receiver_error(soap, "Timeout", "connect failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); #ifdef WITH_IPV6 if (res->ai_next) { res = res->ai_next; goto again; } freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } r = soap->errnum = soap_socket_errno(sk); if (r != SOAP_EINTR) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not connect to host\n")); soap_set_receiver_error(soap, tcp_error(soap), "connect failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); #ifdef WITH_IPV6 if (res->ai_next) { res = res->ai_next; goto again; } freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } } k = (SOAP_SOCKLEN_T)sizeof(soap->errnum); if (!getsockopt(sk, SOL_SOCKET, SO_ERROR, (char*)&soap->errnum, &k) && !soap->errnum) /* portability note: see SOAP_SOCKLEN_T definition in stdsoap2.h */ break; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not connect to host\n")); if (!soap->errnum) soap->errnum = soap_socket_errno(sk); soap_set_receiver_error(soap, tcp_error(soap), "connect failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); #ifdef WITH_IPV6 if (res->ai_next) { res = res->ai_next; goto again; } freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } #endif #ifdef WITH_IPV6 if (res->ai_next) { res = res->ai_next; soap->fclosesocket(soap, sk); goto again; } #endif if (err && err != SOAP_EINTR) { soap->errnum = err; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not connect to host\n")); soap_set_receiver_error(soap, tcp_error(soap), "connect failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } } else break; } #ifdef WITH_IPV6 soap->peerlen = 0; /* IPv6: already connected so use send() */ freeaddrinfo(ressave); #endif soap->socket = sk; soap->imode &= ~SOAP_ENC_SSL; soap->omode &= ~SOAP_ENC_SSL; if (endpoint && !soap_tag_cmp(endpoint, "https:*")) { #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) || defined(WITH_SYSTEMSSL) #ifdef WITH_OPENSSL BIO *bio; #endif #ifdef WITH_SYSTEMSSL gsk_iocallback local_io = { ssl_recv, ssl_send, NULL, NULL, NULL, NULL }; #endif int r; if (soap->proxy_host) { soap_mode m = soap->mode; /* preserve settings */ soap_mode om = soap->omode; /* make sure we only parse HTTP */ size_t n = soap->count; /* save the content length */ const char *userid, *passwd; int status = soap->status; /* save the current status/command */ short keep_alive = soap->keep_alive; /* save the KA status */ soap->omode &= ~SOAP_ENC; /* mask IO and ENC */ soap->omode |= SOAP_IO_BUFFER; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connecting to %s proxy server %s for destination endpoint %s\n", soap->proxy_http_version, soap->proxy_host, endpoint)); #ifdef WITH_NTLM if (soap->ntlm_challenge) { if (soap_ntlm_handshake(soap, SOAP_CONNECT, endpoint, host, port)) return soap->error; } #endif if (soap_begin_send(soap)) { soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } soap->status = SOAP_CONNECT; soap->keep_alive = 1; if ((soap->error = soap->fpost(soap, endpoint, host, port, NULL, NULL, 0)) || soap_end_send_flush(soap)) { soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } soap->keep_alive = keep_alive; soap->omode = om; om = soap->imode; soap->imode &= ~SOAP_ENC; /* mask IO and ENC */ userid = soap->userid; /* preserve */ passwd = soap->passwd; /* preserve */ if ((soap->error = soap->fparse(soap))) { soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } soap->status = status; /* restore */ soap->userid = userid; /* restore */ soap->passwd = passwd; /* restore */ soap->imode = om; /* restore */ soap->count = n; /* restore */ if (soap_begin_send(soap)) { soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } if (endpoint) soap_strcpy(soap->endpoint, sizeof(soap->endpoint), endpoint); /* restore */ soap->mode = m; } #ifdef WITH_OPENSSL soap->ssl_flags |= SOAP_SSL_CLIENT; if (!soap->ctx && (soap->error = soap->fsslauth(soap))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL required, but no ctx set\n")); soap->fclosesocket(soap, sk); soap->error = SOAP_SSL_ERROR; return SOAP_INVALID_SOCKET; } if (!soap->ssl) { soap->ssl = SSL_new(soap->ctx); if (!soap->ssl) { soap->fclosesocket(soap, sk); soap->error = SOAP_SSL_ERROR; return SOAP_INVALID_SOCKET; } } else SSL_clear(soap->ssl); if (soap->session) { if (!strcmp(soap->session_host, host) && soap->session_port == port) SSL_set_session(soap->ssl, soap->session); SSL_SESSION_free(soap->session); soap->session = NULL; } #if (OPENSSL_VERSION_NUMBER >= 0x1000000aL) if (!(soap->ssl_flags & SOAP_SSLv3) && !SSL_set_tlsext_host_name(soap->ssl, host)) { soap_set_receiver_error(soap, "SSL/TLS error", "SNI failed", SOAP_SSL_ERROR); soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } #elif (OPENSSL_VERSION_NUMBER >= 0x0090800fL) && defined(SSL_CTRL_SET_TLSEXT_HOSTNAME) if (SSL_ctrl(soap->ssl, SSL_CTRL_SET_TLSEXT_HOSTNAME, TLSEXT_NAMETYPE_host_name, (void*)host)) { soap_set_receiver_error(soap, "SSL/TLS error", "SNI failed", SOAP_SSL_ERROR); soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } #endif bio = BIO_new_socket((int)sk, BIO_NOCLOSE); SSL_set_bio(soap->ssl, bio, bio); /* Connect timeout: set SSL sockets to non-blocking */ retries = 0; if (soap->connect_timeout) { SOAP_SOCKNONBLOCK(sk) retries = 10*soap->connect_timeout; } else SOAP_SOCKBLOCK(sk) if (retries <= 0) retries = 100; /* timeout: 10 sec retries, 100 times 0.1 sec */ /* Try connecting until success or timeout (when nonblocking) */ do { if ((r = SSL_connect(soap->ssl)) <= 0) { int err = SSL_get_error(soap->ssl, r); if (err == SSL_ERROR_WANT_CONNECT || err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE) { int s; if (err == SSL_ERROR_WANT_READ) s = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, -100000); else s = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, -100000); if (s < 0) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL_connect/select error in tcp_connect\n")); soap_set_receiver_error(soap, soap_ssl_error(soap, r), "SSL_connect failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } if (s == 0 && retries-- <= 0) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL/TLS connect timeout\n")); soap_set_receiver_error(soap, "Timeout", "SSL_connect failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } } else { soap_set_receiver_error(soap, soap_ssl_error(soap, r), "SSL_connect error in tcp_connect()", SOAP_SSL_ERROR); soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } } } while (!SSL_is_init_finished(soap->ssl)); /* Set SSL sockets to nonblocking */ SOAP_SOCKNONBLOCK(sk) /* Check server credentials when required */ if ((soap->ssl_flags & SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION)) { int err; if ((err = SSL_get_verify_result(soap->ssl)) != X509_V_OK) { soap_set_sender_error(soap, X509_verify_cert_error_string(err), "SSL/TLS certificate presented by peer cannot be verified in tcp_connect()", SOAP_SSL_ERROR); soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } if (!(soap->ssl_flags & SOAP_SSL_SKIP_HOST_CHECK)) { X509_NAME *subj; STACK_OF(CONF_VALUE) *val = NULL; #if (OPENSSL_VERSION_NUMBER >= 0x0090800fL) GENERAL_NAMES *names = NULL; #else int ext_count; #endif int ok = 0; X509 *peer = SSL_get_peer_certificate(soap->ssl); if (!peer) { soap_set_sender_error(soap, "SSL/TLS error", "No SSL/TLS certificate was presented by the peer in tcp_connect()", SOAP_SSL_ERROR); soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } #if (OPENSSL_VERSION_NUMBER < 0x0090800fL) ext_count = X509_get_ext_count(peer); if (ext_count > 0) { int i; for (i = 0; i < ext_count; i++) { X509_EXTENSION *ext = X509_get_ext(peer, i); const char *ext_str = OBJ_nid2sn(OBJ_obj2nid(X509_EXTENSION_get_object(ext))); if (ext_str && !strcmp(ext_str, "subjectAltName")) { X509V3_EXT_METHOD *meth = (X509V3_EXT_METHOD*)X509V3_EXT_get(ext); unsigned char *data; if (!meth) break; data = ext->value->data; if (data) { #if (OPENSSL_VERSION_NUMBER > 0x00907000L) void *ext_data; if (meth->it) ext_data = ASN1_item_d2i(NULL, &data, ext->value->length, ASN1_ITEM_ptr(meth->it)); else { #if (OPENSSL_VERSION_NUMBER > 0x0090800fL) ext_data = meth->d2i(NULL, (const unsigned char **)&data, ext->value->length); #else ext_data = meth->d2i(NULL, &data, ext->value->length); #endif } if (ext_data) val = meth->i2v(meth, ext_data, NULL); else val = NULL; if (meth->it) ASN1_item_free((ASN1_VALUE*)ext_data, ASN1_ITEM_ptr(meth->it)); else meth->ext_free(ext_data); #else void *ext_data = meth->d2i(NULL, &data, ext->value->length); if (ext_data) val = meth->i2v(meth, ext_data, NULL); meth->ext_free(ext_data); #endif if (val) { int j; for (j = 0; j < sk_CONF_VALUE_num(val); j++) { CONF_VALUE *nval = sk_CONF_VALUE_value(val, j); if (nval && !strcmp(nval->name, "DNS") && !strcmp(nval->value, host)) { ok = 1; break; } } sk_CONF_VALUE_pop_free(val, X509V3_conf_free); } } } if (ok) break; } } #else names = (GENERAL_NAMES*)X509_get_ext_d2i(peer, NID_subject_alt_name, NULL, NULL); if (names) { val = i2v_GENERAL_NAMES(NULL, names, val); sk_GENERAL_NAME_pop_free(names, GENERAL_NAME_free); } if (val) { int j; for (j = 0; j < sk_CONF_VALUE_num(val); j++) { CONF_VALUE *nval = sk_CONF_VALUE_value(val, j); if (nval && !strcmp(nval->name, "DNS") && !strcmp(nval->value, host)) { ok = 1; break; } } sk_CONF_VALUE_pop_free(val, X509V3_conf_free); } #endif if (!ok && (subj = X509_get_subject_name(peer))) { int i = -1; do { ASN1_STRING *name; i = X509_NAME_get_index_by_NID(subj, NID_commonName, i); if (i == -1) break; name = X509_NAME_ENTRY_get_data(X509_NAME_get_entry(subj, i)); if (name) { if (!soap_tag_cmp(host, (const char*)M_ASN1_STRING_data(name))) ok = 1; else { unsigned char *tmp = NULL; ASN1_STRING_to_UTF8(&tmp, name); if (tmp) { if (!soap_tag_cmp(host, (const char*)tmp)) ok = 1; else if (tmp[0] == '*') /* wildcard domain */ { const char *t = strchr(host, '.'); if (t && !soap_tag_cmp(t, (const char*)tmp+1)) ok = 1; } OPENSSL_free(tmp); } } } } while (!ok); } X509_free(peer); if (!ok) { soap_set_sender_error(soap, "SSL/TLS error", "SSL/TLS certificate host name mismatch in tcp_connect()", SOAP_SSL_ERROR); soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } } } #endif #ifdef WITH_GNUTLS soap->ssl_flags |= SOAP_SSL_CLIENT; if (!soap->session && (soap->error = soap->fsslauth(soap))) { soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } gnutls_transport_set_ptr(soap->session, (gnutls_transport_ptr_t)(long)sk); /* Set SSL sockets to non-blocking */ if (soap->connect_timeout) { SOAP_SOCKNONBLOCK(sk) retries = 10*soap->connect_timeout; } else SOAP_SOCKBLOCK(sk) if (retries <= 0) retries = 100; /* timeout: 10 sec retries, 100 times 0.1 sec */ while ((r = gnutls_handshake(soap->session))) { int s; /* GNUTLS repeat handhake when GNUTLS_E_AGAIN */ if (retries-- <= 0) break; if (r == GNUTLS_E_AGAIN || r == GNUTLS_E_INTERRUPTED) { if (!gnutls_record_get_direction(soap->session)) s = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, -100000); else s = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, -100000); if (s < 0) break; } else { soap->errnum = soap_socket_errno(sk); break; } } if (r) { soap_set_sender_error(soap, soap_ssl_error(soap, r), "SSL/TLS handshake failed", SOAP_SSL_ERROR); soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } if ((soap->ssl_flags & SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION)) { const char *err = ssl_verify(soap, host); if (err) { soap->fclosesocket(soap, sk); soap->error = soap_set_sender_error(soap, "SSL/TLS verify error", err, SOAP_SSL_ERROR); return SOAP_INVALID_SOCKET; } } #endif #ifdef WITH_SYSTEMSSL soap->ssl_flags |= SOAP_SSL_CLIENT; if (!soap->ctx && (soap->error = soap->fsslauth(soap))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL required, but no ctx set\n")); soap->fclosesocket(soap, sk); soap->error = SOAP_SSL_ERROR; return SOAP_INVALID_SOCKET; } /* Connect timeout: set SSL sockets to non-blocking */ retries = 0; if (soap->connect_timeout) { SOAP_SOCKNONBLOCK(sk) retries = 10*soap->connect_timeout; } else SOAP_SOCKBLOCK(sk) if (retries <= 0) retries = 100; /* timeout: 10 sec retries, 100 times 0.1 sec */ err = gsk_secure_socket_open(soap->ctx, &soap->ssl); if (err == GSK_OK) err = gsk_attribute_set_numeric_value(soap->ssl, GSK_FD, sk); if (err == GSK_OK) err = gsk_attribute_set_buffer(soap->ssl, GSK_KEYRING_LABEL, soap->cafile, 0); /* Certificate label */ if (err == GSK_OK) err = gsk_attribute_set_enum(soap->ssl, GSK_SESSION_TYPE, GSK_CLIENT_SESSION); if (err == GSK_OK) err = gsk_attribute_set_buffer(soap->ssl, GSK_V3_CIPHER_SPECS_EXPANDED, "0035002F000A", 0); if (err == GSK_OK) err = gsk_attribute_set_enum(soap->ssl, GSK_V3_CIPHERS, GSK_V3_CIPHERS_CHAR4); if (err == GSK_OK) err = gsk_attribute_set_callback(soap->ssl, GSK_IO_CALLBACK, &local_io); if (err != GSK_OK) { soap_set_receiver_error(soap, gsk_strerror(err), "SYSTEM SSL error in tcp_connect()", SOAP_SSL_ERROR); return SOAP_INVALID_SOCKET; } /* Try connecting until success or timeout (when nonblocking) */ while ((err = gsk_secure_socket_init(soap->ssl)) != GSK_OK) { if (err == GSK_WOULD_BLOCK_READ || err == GSK_WOULD_BLOCK_WRITE) { if (err == GSK_WOULD_BLOCK_READ) r = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, -100000); else r = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, -100000); if (r < 0) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL_connect/select error in tcp_connect\n")); soap_set_receiver_error(soap, gsk_strerror(err), "gsk_secure_socket_init failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } if (r == 0 && retries-- <= 0) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL/TLS connect timeout\n")); soap_set_receiver_error(soap, "Timeout", "in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } } else { soap_set_receiver_error(soap, gsk_strerror(err), "gsk_secure_socket_init() failed in tcp_connect()", SOAP_SSL_ERROR); soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } } #endif soap->imode |= SOAP_ENC_SSL; soap->omode |= SOAP_ENC_SSL; #else soap->fclosesocket(soap, sk); soap->error = SOAP_SSL_ERROR; return SOAP_INVALID_SOCKET; #endif } if (soap->recv_timeout || soap->send_timeout) SOAP_SOCKNONBLOCK(sk) else SOAP_SOCKBLOCK(sk) return sk; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 static int tcp_select(struct soap *soap, SOAP_SOCKET sk, int flags, int timeout) { int r; struct timeval tv; fd_set fd[3], *rfd, *sfd, *efd; int retries = 0; int eintr = SOAP_MAXEINTR; soap->errnum = 0; #ifndef WIN32 #if !defined(FD_SETSIZE) || defined(__QNX__) || defined(QNX) /* no FD_SETSIZE or select() is not MT safe on some QNX: always poll */ if (1) #else /* if fd max set size exceeded, use poll() */ if ((int)sk >= (int)FD_SETSIZE) #endif #ifdef HAVE_POLL { struct pollfd pollfd; pollfd.fd = (int)sk; pollfd.events = 0; if (flags & SOAP_TCP_SELECT_RCV) pollfd.events |= POLLIN; if (flags & SOAP_TCP_SELECT_SND) pollfd.events |= POLLOUT; if (flags & SOAP_TCP_SELECT_ERR) pollfd.events |= POLLERR; if (timeout <= 0) timeout /= -1000; /* -usec -> ms */ else { retries = timeout - 1; timeout = 1000; } do { r = poll(&pollfd, 1, timeout); if (r < 0 && (soap->errnum = soap_socket_errno(sk)) == SOAP_EINTR && eintr-- > 0) r = 0; else if (retries-- <= 0) break; } while (r == 0); if (r > 0) { r = 0; if ((flags & SOAP_TCP_SELECT_RCV) && (pollfd.revents & POLLIN)) r |= SOAP_TCP_SELECT_RCV; if ((flags & SOAP_TCP_SELECT_SND) && (pollfd.revents & POLLOUT)) r |= SOAP_TCP_SELECT_SND; if ((flags & SOAP_TCP_SELECT_ERR) && (pollfd.revents & POLLERR)) r |= SOAP_TCP_SELECT_ERR; } else if (r == 0) soap->errnum = 0; return r; } #else { soap->error = SOAP_FD_EXCEEDED; return -1; } #endif #endif if (timeout > 0) retries = timeout - 1; do { rfd = sfd = efd = NULL; if (flags & SOAP_TCP_SELECT_RCV) { rfd = &fd[0]; FD_ZERO(rfd); FD_SET(sk, rfd); } if (flags & SOAP_TCP_SELECT_SND) { sfd = &fd[1]; FD_ZERO(sfd); FD_SET(sk, sfd); } if (flags & SOAP_TCP_SELECT_ERR) { efd = &fd[2]; FD_ZERO(efd); FD_SET(sk, efd); } if (timeout <= 0) { tv.tv_sec = -timeout / 1000000; tv.tv_usec = -timeout % 1000000; } else { tv.tv_sec = 1; tv.tv_usec = 0; } r = select((int)sk + 1, rfd, sfd, efd, &tv); if (r < 0 && (soap->errnum = soap_socket_errno(sk)) == SOAP_EINTR && eintr-- > 0) r = 0; else if (retries-- <= 0) break; } while (r == 0); if (r > 0) { r = 0; if ((flags & SOAP_TCP_SELECT_RCV) && FD_ISSET(sk, rfd)) r |= SOAP_TCP_SELECT_RCV; if ((flags & SOAP_TCP_SELECT_SND) && FD_ISSET(sk, sfd)) r |= SOAP_TCP_SELECT_SND; if ((flags & SOAP_TCP_SELECT_ERR) && FD_ISSET(sk, efd)) r |= SOAP_TCP_SELECT_ERR; } else if (r == 0) soap->errnum = 0; return r; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 static SOAP_SOCKET tcp_accept(struct soap *soap, SOAP_SOCKET s, struct sockaddr *a, int *n) { SOAP_SOCKET sk; (void)soap; sk = accept(s, a, (SOAP_SOCKLEN_T*)n); /* portability note: see SOAP_SOCKLEN_T definition in stdsoap2.h */ #ifdef SOCKET_CLOSE_ON_EXIT #ifdef WIN32 #ifndef UNDER_CE SetHandleInformation((HANDLE)sk, HANDLE_FLAG_INHERIT, 0); #endif #else fcntl(sk, F_SETFD, FD_CLOEXEC); #endif #endif return sk; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 static int tcp_disconnect(struct soap *soap) { #ifdef WITH_OPENSSL if (soap->ssl) { int r, s = 0; if (soap->session) { SSL_SESSION_free(soap->session); soap->session = NULL; } if (*soap->host) { soap->session = SSL_get1_session(soap->ssl); if (soap->session) { soap_strcpy(soap->session_host, sizeof(soap->session_host), soap->host); soap->session_port = soap->port; } } r = SSL_shutdown(soap->ssl); /* SSL shutdown does not work when reads are pending, non-blocking */ if (r == 0) { while (SSL_want_read(soap->ssl)) { if (SSL_read(soap->ssl, NULL, 0) || soap_socket_errno(soap->socket) != SOAP_EAGAIN) { r = SSL_shutdown(soap->ssl); break; } } } if (r == 0) { if (soap_valid_socket(soap->socket)) { if (!soap->fshutdownsocket(soap, soap->socket, SOAP_SHUT_WR)) { #if !defined(WITH_LEAN) && !defined(WIN32) /* wait up to 5 seconds for close_notify to be sent by peer (if peer not present, this avoids calling SSL_shutdown() which has a lengthy return timeout) */ r = tcp_select(soap, soap->socket, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, 5); if (r <= 0) { soap->errnum = 0; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connection lost...\n")); soap->fclosesocket(soap, soap->socket); soap->socket = SOAP_INVALID_SOCKET; ERR_remove_state(0); SSL_free(soap->ssl); soap->ssl = NULL; return SOAP_OK; } #else r = SSL_shutdown(soap->ssl); #endif } } } if (r != 1) { s = ERR_get_error(); if (s) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Shutdown failed: %d\n", SSL_get_error(soap->ssl, r))); if (soap_valid_socket(soap->socket) && !(soap->omode & SOAP_IO_UDP)) { soap->fclosesocket(soap, soap->socket); soap->socket = SOAP_INVALID_SOCKET; } } } SSL_free(soap->ssl); soap->ssl = NULL; if (s) return SOAP_SSL_ERROR; ERR_remove_state(0); } #endif #ifdef WITH_GNUTLS if (soap->session) { gnutls_bye(soap->session, GNUTLS_SHUT_RDWR); gnutls_deinit(soap->session); soap->session = NULL; } #endif #ifdef WITH_SYSTEMSSL if (soap->ssl) { gsk_secure_socket_shutdown(soap->ssl); gsk_secure_socket_close(&soap->ssl); } #endif if (soap_valid_socket(soap->socket) && !(soap->omode & SOAP_IO_UDP)) { soap->fshutdownsocket(soap, soap->socket, SOAP_SHUT_RDWR); soap->fclosesocket(soap, soap->socket); soap->socket = SOAP_INVALID_SOCKET; } return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 static int tcp_closesocket(struct soap *soap, SOAP_SOCKET sk) { (void)soap; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Close socket=%d\n", (int)sk)); return soap_closesocket(sk); } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 static int tcp_shutdownsocket(struct soap *soap, SOAP_SOCKET sk, int how) { (void)soap; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Shutdown socket=%d how=%d\n", (int)sk, how)); return shutdown(sk, how); } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 SOAP_FMAC1 SOAP_SOCKET SOAP_FMAC2 soap_bind(struct soap *soap, const char *host, int port, int backlog) { #ifdef WITH_IPV6 struct addrinfo *addrinfo = NULL; struct addrinfo hints; struct addrinfo res; int err; #ifdef WITH_NO_IPV6_V6ONLY int unset = 0; #endif #endif #ifndef WITH_LEAN #ifndef WIN32 int len = sizeof(soap->buf); #else int len = sizeof(soap->buf) + 1; /* speeds up windows xfer */ #endif int set = 1; #endif if (soap_valid_socket(soap->master)) { soap->fclosesocket(soap, soap->master); soap->master = SOAP_INVALID_SOCKET; } soap->socket = SOAP_INVALID_SOCKET; soap->errmode = 1; if (tcp_init(soap)) { soap_set_receiver_error(soap, tcp_error(soap), "TCP init failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } #ifdef WITH_IPV6 memset((void*)&hints, 0, sizeof(hints)); #ifdef WITH_IPV6_V6ONLY hints.ai_family = PF_INET6; #else hints.ai_family = PF_UNSPEC; #endif #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) hints.ai_socktype = SOCK_DGRAM; else #endif hints.ai_socktype = SOCK_STREAM; hints.ai_flags = AI_PASSIVE; soap->errmode = 2; err = getaddrinfo(host, soap_int2s(soap, port), &hints, &addrinfo); if (err || !addrinfo) { soap_set_receiver_error(soap, SOAP_GAI_STRERROR(err), "getaddrinfo failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } res = *addrinfo; if (soap_memcpy((void*)&soap->peer.storage, sizeof(soap->peer.storage), (const void*)addrinfo->ai_addr, addrinfo->ai_addrlen)) { soap->error = SOAP_EOM; return SOAP_INVALID_SOCKET; } soap->peerlen = addrinfo->ai_addrlen; res.ai_addr = &soap->peer.addr; res.ai_addrlen = soap->peerlen; freeaddrinfo(addrinfo); soap->master = (int)socket(res.ai_family, res.ai_socktype, res.ai_protocol); #else #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) soap->master = (int)socket(AF_INET, SOCK_DGRAM, 0); else #endif soap->master = (int)socket(AF_INET, SOCK_STREAM, 0); #endif soap->errmode = 0; if (!soap_valid_socket(soap->master)) { soap->errnum = soap_socket_errno(soap->master); soap_set_receiver_error(soap, tcp_error(soap), "socket failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } soap->port = port; #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) soap->socket = soap->master; #endif #ifdef SOCKET_CLOSE_ON_EXIT #ifdef WIN32 #ifndef UNDER_CE SetHandleInformation((HANDLE)soap->master, HANDLE_FLAG_INHERIT, 0); #endif #else fcntl(soap->master, F_SETFD, 1); #endif #endif #ifndef WITH_LEAN if (soap->bind_flags && setsockopt(soap->master, SOL_SOCKET, soap->bind_flags, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(soap->master); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } #ifndef UNDER_CE if (((soap->imode | soap->omode) & SOAP_IO_KEEPALIVE) && (!((soap->imode | soap->omode) & SOAP_IO_UDP)) && setsockopt(soap->master, SOL_SOCKET, SO_KEEPALIVE, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(soap->master); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_KEEPALIVE failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } if (setsockopt(soap->master, SOL_SOCKET, SO_SNDBUF, (char*)&len, sizeof(int))) { soap->errnum = soap_socket_errno(soap->master); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_SNDBUF failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } if (setsockopt(soap->master, SOL_SOCKET, SO_RCVBUF, (char*)&len, sizeof(int))) { soap->errnum = soap_socket_errno(soap->master); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_RCVBUF failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } #ifdef TCP_NODELAY if (!(soap->omode & SOAP_IO_UDP) && setsockopt(soap->master, IPPROTO_TCP, TCP_NODELAY, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(soap->master); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt TCP_NODELAY failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } #endif #ifdef TCP_FASTOPEN if (!(soap->omode & SOAP_IO_UDP) && setsockopt(soap->master, SOL_TCP, TCP_FASTOPEN, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(soap->master); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt TCP_FASTOPEN failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } #endif #endif #endif #ifdef WITH_IPV6 #ifdef WITH_IPV6_V6ONLY if (res.ai_family == AF_INET6 && setsockopt(soap->master, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(soap->master); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt set IPV6_V6ONLY failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } #endif #ifdef WITH_NO_IPV6_V6ONLY if (res.ai_family == AF_INET6 && setsockopt(soap->master, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&unset, sizeof(int))) { soap->errnum = soap_socket_errno(soap->master); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt unset IPV6_V6ONLY failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } #endif soap->errmode = 0; if (bind(soap->master, res.ai_addr, (int)res.ai_addrlen)) { soap->errnum = soap_socket_errno(soap->master); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not bind to host\n")); soap_closesock(soap); soap_set_receiver_error(soap, tcp_error(soap), "bind failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } #else soap->peerlen = sizeof(soap->peer.in); memset((void*)&soap->peer.in, 0, sizeof(soap->peer.in)); soap->peer.in.sin_family = AF_INET; soap->errmode = 2; if (host) { if (soap->fresolve(soap, host, &soap->peer.in.sin_addr)) { soap_set_receiver_error(soap, tcp_error(soap), "get host by name failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } } else soap->peer.in.sin_addr.s_addr = htonl(INADDR_ANY); soap->peer.in.sin_port = htons((short)port); soap->errmode = 0; if (bind(soap->master, &soap->peer.addr, (int)soap->peerlen)) { soap->errnum = soap_socket_errno(soap->master); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not bind to host\n")); soap_closesock(soap); soap_set_receiver_error(soap, tcp_error(soap), "bind failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } #endif if (!(soap->omode & SOAP_IO_UDP) && listen(soap->master, backlog)) { soap->errnum = soap_socket_errno(soap->master); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not bind to host\n")); soap_closesock(soap); soap_set_receiver_error(soap, tcp_error(soap), "listen failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } return soap->master; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_poll(struct soap *soap) { #ifndef WITH_LEAN int r; if (soap_valid_socket(soap->socket)) { r = tcp_select(soap, soap->socket, SOAP_TCP_SELECT_ALL, 0); if (r > 0 && (r & SOAP_TCP_SELECT_ERR)) r = -1; } else if (soap_valid_socket(soap->master)) r = tcp_select(soap, soap->master, SOAP_TCP_SELECT_SND, 0); else return SOAP_OK; /* OK when no socket! */ if (r > 0) { #ifdef WITH_OPENSSL if (soap->imode & SOAP_ENC_SSL) { if (soap_valid_socket(soap->socket) && (r & SOAP_TCP_SELECT_SND) && (!(r & SOAP_TCP_SELECT_RCV) || SSL_peek(soap->ssl, soap->tmpbuf, 1) > 0)) return SOAP_OK; } else #endif { int t; if (soap_valid_socket(soap->socket) && (r & SOAP_TCP_SELECT_SND) && (!(r & SOAP_TCP_SELECT_RCV) || recv(soap->socket, (char*)&t, 1, MSG_PEEK) > 0)) return SOAP_OK; } } else if (r < 0) { if ((soap_valid_socket(soap->master) || soap_valid_socket(soap->socket)) && soap_socket_errno(soap->master) != SOAP_EINTR) { soap_set_receiver_error(soap, tcp_error(soap), "select failed in soap_poll()", SOAP_TCP_ERROR); return soap->error = SOAP_TCP_ERROR; } } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Polling: other end down on socket=%d select=%d\n", soap->socket, r)); return SOAP_EOF; #else (void)soap; return SOAP_OK; #endif } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 SOAP_FMAC1 SOAP_SOCKET SOAP_FMAC2 soap_accept(struct soap *soap) { int n = (int)sizeof(soap->peer); int err; #ifndef WITH_LEAN #ifndef WIN32 int len = sizeof(soap->buf); #else int len = sizeof(soap->buf) + 1; /* speeds up windows xfer */ #endif int set = 1; #endif soap->error = SOAP_OK; memset((void*)&soap->peer, 0, sizeof(soap->peer)); soap->socket = SOAP_INVALID_SOCKET; soap->errmode = 0; soap->keep_alive = 0; if (!soap_valid_socket(soap->master)) { soap->errnum = 0; soap_set_receiver_error(soap, tcp_error(soap), "no master socket in soap_accept()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) return soap->socket = soap->master; #endif for (;;) { if (soap->accept_timeout || soap->send_timeout || soap->recv_timeout) { for (;;) { int r; r = tcp_select(soap, soap->master, SOAP_TCP_SELECT_ALL, soap->accept_timeout ? soap->accept_timeout : 60); if (r > 0) break; if (!r && soap->accept_timeout) { soap_set_receiver_error(soap, "Timeout", "accept failed in soap_accept()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } if (r < 0) { r = soap->errnum; if (r != SOAP_EINTR) { soap_closesock(soap); soap_set_receiver_error(soap, tcp_error(soap), "accept failed in soap_accept()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } } } } if (soap->accept_timeout) SOAP_SOCKNONBLOCK(soap->master) else SOAP_SOCKBLOCK(soap->master) n = (int)sizeof(soap->peer); soap->socket = soap->faccept(soap, soap->master, &soap->peer.addr, &n); soap->peerlen = (size_t)n; if (soap_valid_socket(soap->socket)) { #ifdef WITH_IPV6 char *s = soap->host; char port[16]; int i; getnameinfo(&soap->peer.addr, n, soap->host, sizeof(soap->host), port, sizeof(port), NI_NUMERICHOST | NI_NUMERICSERV); soap->ip = 0; for (i = 0; i < 4 && *s; i++) { soap->ip = (soap->ip << 8) + (unsigned int)soap_strtoul(s, &s, 10); if (*s) s++; } soap->port = soap_strtol(port, NULL, 10); #else soap->ip = ntohl(soap->peer.in.sin_addr.s_addr); (SOAP_SNPRINTF(soap->host, sizeof(soap->host), 80), "%u.%u.%u.%u", (int)(soap->ip>>24)&0xFF, (int)(soap->ip>>16)&0xFF, (int)(soap->ip>>8)&0xFF, (int)soap->ip&0xFF); soap->port = (int)ntohs(soap->peer.in.sin_port); /* does not return port number on some systems */ #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Accept socket=%d at port=%d from IP='%s'\n", soap->socket, soap->port, soap->host)); #ifndef WITH_LEAN if ((soap->accept_flags & SO_LINGER)) { struct linger linger; memset((void*)&linger, 0, sizeof(linger)); linger.l_onoff = 1; linger.l_linger = soap->linger_time; if (setsockopt(soap->socket, SOL_SOCKET, SO_LINGER, (char*)&linger, sizeof(struct linger))) { soap->errnum = soap_socket_errno(soap->socket); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_LINGER failed in soap_accept()", SOAP_TCP_ERROR); soap_closesock(soap); return SOAP_INVALID_SOCKET; } } if ((soap->accept_flags & ~SO_LINGER) && setsockopt(soap->socket, SOL_SOCKET, soap->accept_flags & ~SO_LINGER, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(soap->socket); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt failed in soap_accept()", SOAP_TCP_ERROR); soap_closesock(soap); return SOAP_INVALID_SOCKET; } #ifndef UNDER_CE if (((soap->imode | soap->omode) & SOAP_IO_KEEPALIVE) && setsockopt(soap->socket, SOL_SOCKET, SO_KEEPALIVE, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(soap->socket); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_KEEPALIVE failed in soap_accept()", SOAP_TCP_ERROR); soap_closesock(soap); return SOAP_INVALID_SOCKET; } if (setsockopt(soap->socket, SOL_SOCKET, SO_SNDBUF, (char*)&len, sizeof(int))) { soap->errnum = soap_socket_errno(soap->socket); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_SNDBUF failed in soap_accept()", SOAP_TCP_ERROR); soap_closesock(soap); return SOAP_INVALID_SOCKET; } if (setsockopt(soap->socket, SOL_SOCKET, SO_RCVBUF, (char*)&len, sizeof(int))) { soap->errnum = soap_socket_errno(soap->socket); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_RCVBUF failed in soap_accept()", SOAP_TCP_ERROR); soap_closesock(soap); return SOAP_INVALID_SOCKET; } #ifdef TCP_NODELAY if (setsockopt(soap->socket, IPPROTO_TCP, TCP_NODELAY, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(soap->socket); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt TCP_NODELAY failed in soap_accept()", SOAP_TCP_ERROR); soap_closesock(soap); return SOAP_INVALID_SOCKET; } #endif #endif #endif soap->keep_alive = (((soap->imode | soap->omode) & SOAP_IO_KEEPALIVE) != 0); if (soap->send_timeout || soap->recv_timeout) SOAP_SOCKNONBLOCK(soap->socket) else SOAP_SOCKBLOCK(soap->socket) return soap->socket; } err = soap_socket_errno(soap->socket); if (err != 0 && err != SOAP_EINTR && err != SOAP_EAGAIN && err != SOAP_EWOULDBLOCK) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Accept failed from %s\n", soap->host)); soap->errnum = err; soap_set_receiver_error(soap, tcp_error(soap), "accept failed in soap_accept()", SOAP_TCP_ERROR); soap_closesock(soap); return SOAP_INVALID_SOCKET; } } } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_closesock(struct soap *soap) { int status = soap->error; #ifndef WITH_LEANER if (status) /* close on error: attachment state is not to be trusted */ { soap->mime.first = NULL; soap->mime.last = NULL; soap->dime.first = NULL; soap->dime.last = NULL; } #endif if (soap->fdisconnect && (soap->error = soap->fdisconnect(soap))) return soap->error; if (status == SOAP_EOF || status == SOAP_TCP_ERROR || status == SOAP_SSL_ERROR || !soap->keep_alive) { if (soap->fclose && (soap->error = soap->fclose(soap))) return soap->error; soap->keep_alive = 0; } #ifdef WITH_ZLIB if (!(soap->mode & SOAP_MIME_POSTCHECK)) { if (soap->zlib_state == SOAP_ZLIB_DEFLATE) deflateEnd(soap->d_stream); else if (soap->zlib_state == SOAP_ZLIB_INFLATE) inflateEnd(soap->d_stream); soap->zlib_state = SOAP_ZLIB_NONE; } #endif return soap->error = status; } #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_force_closesock(struct soap *soap) { soap->keep_alive = 0; if (soap_valid_socket(soap->socket)) return soap_closesocket(soap->socket); return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_cleanup(struct soap *soap) { soap_done(soap); #ifdef WIN32 if (!tcp_done) return; tcp_done = 0; WSACleanup(); #endif } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_done(struct soap *soap) { #ifdef SOAP_DEBUG int i; #endif if (soap_check_state(soap)) return; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Done with context%s\n", soap->state == SOAP_COPY ? " copy" : "")); soap_free_temp(soap); while (soap->clist) { struct soap_clist *p = soap->clist->next; SOAP_FREE(soap, soap->clist); soap->clist = p; } if (soap->state == SOAP_INIT) soap->omode &= ~SOAP_IO_UDP; /* to force close the socket */ soap->keep_alive = 0; /* to force close the socket */ if (soap->master == soap->socket) /* do not close twice */ soap->master = SOAP_INVALID_SOCKET; soap_closesock(soap); #ifdef WITH_COOKIES soap_free_cookies(soap); #endif while (soap->plugins) { struct soap_plugin *p = soap->plugins->next; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Removing plugin '%s'\n", soap->plugins->id)); if (soap->plugins->fcopy || soap->state == SOAP_INIT) soap->plugins->fdelete(soap, soap->plugins); SOAP_FREE(soap, soap->plugins); soap->plugins = p; } soap->fplugin = fplugin; soap->fmalloc = NULL; #ifndef WITH_NOHTTP soap->fpost = http_post; soap->fget = http_get; soap->fput = http_405; soap->fdel = http_405; soap->fopt = http_200; soap->fhead = http_200; soap->fform = NULL; soap->fposthdr = http_post_header; soap->fresponse = http_response; soap->fparse = http_parse; soap->fparsehdr = http_parse_header; #endif soap->fheader = NULL; #ifndef WITH_NOIO #ifndef WITH_IPV6 soap->fresolve = tcp_gethost; #else soap->fresolve = NULL; #endif soap->faccept = tcp_accept; soap->fopen = tcp_connect; soap->fclose = tcp_disconnect; soap->fclosesocket = tcp_closesocket; soap->fshutdownsocket = tcp_shutdownsocket; soap->fsend = fsend; soap->frecv = frecv; soap->fpoll = soap_poll; #else soap->fopen = NULL; soap->fclose = NULL; soap->fpoll = NULL; #endif #ifndef WITH_LEANER soap->fsvalidate = NULL; soap->fwvalidate = NULL; soap->feltbegin = NULL; soap->feltendin = NULL; soap->feltbegout = NULL; soap->feltendout = NULL; soap->fprepareinitsend = NULL; soap->fprepareinitrecv = NULL; soap->fpreparesend = NULL; soap->fpreparerecv = NULL; soap->fpreparefinalsend = NULL; soap->fpreparefinalrecv = NULL; soap->ffiltersend = NULL; soap->ffilterrecv = NULL; #endif soap->fseterror = NULL; soap->fignore = NULL; soap->fserveloop = NULL; #ifdef WITH_OPENSSL if (soap->session) { SSL_SESSION_free(soap->session); soap->session = NULL; } #endif if (soap->state == SOAP_INIT) { if (soap_valid_socket(soap->master)) { soap->fclosesocket(soap, soap->master); soap->master = SOAP_INVALID_SOCKET; } } #ifdef WITH_OPENSSL if (soap->ssl) { SSL_free(soap->ssl); soap->ssl = NULL; } if (soap->state == SOAP_INIT) { if (soap->ctx) { SSL_CTX_free(soap->ctx); soap->ctx = NULL; } } ERR_remove_state(0); #endif #ifdef WITH_GNUTLS if (soap->state == SOAP_INIT) { if (soap->xcred) { gnutls_certificate_free_credentials(soap->xcred); soap->xcred = NULL; } if (soap->acred) { gnutls_anon_free_client_credentials(soap->acred); soap->acred = NULL; } if (soap->cache) { gnutls_priority_deinit(soap->cache); soap->cache = NULL; } if (soap->dh_params) { gnutls_dh_params_deinit(soap->dh_params); soap->dh_params = NULL; } if (soap->rsa_params) { gnutls_rsa_params_deinit(soap->rsa_params); soap->rsa_params = NULL; } } if (soap->session) { gnutls_deinit(soap->session); soap->session = NULL; } #endif #ifdef WITH_SYSTEMSSL if (soap->ssl) gsk_secure_socket_close(&soap->ssl); if (soap->state == SOAP_INIT) if (soap->ctx) gsk_environment_close(&soap->ctx); #endif #ifdef WITH_C_LOCALE if (soap->c_locale) { # ifdef WIN32 _free_locale(soap->c_locale); # else freelocale(soap->c_locale); # endif soap->c_locale = NULL; } #endif #ifdef WITH_ZLIB if (soap->d_stream) { SOAP_FREE(soap, soap->d_stream); soap->d_stream = NULL; } if (soap->z_buf) { SOAP_FREE(soap, soap->z_buf); soap->z_buf = NULL; } #endif #ifdef SOAP_DEBUG DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free logfiles\n")); for (i = 0; i < SOAP_MAXLOGS; i++) { if (soap->logfile[i]) { SOAP_FREE(soap, soap->logfile[i]); soap->logfile[i] = NULL; } soap_close_logfile(soap, i); } soap->state = SOAP_NONE; #endif #ifdef SOAP_MEM_DEBUG soap_free_mht(soap); #endif } #endif /******************************************************************************\ * * HTTP * \******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 static int http_parse(struct soap *soap) { char header[SOAP_HDRLEN], *s; unsigned short httpcmd = 0; int status = 0; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Waiting for HTTP request/response...\n")); *soap->endpoint = '\0'; #ifdef WITH_NTLM if (!soap->ntlm_challenge) #endif { soap->userid = NULL; soap->passwd = NULL; soap->authrealm = NULL; } #ifdef WITH_NTLM soap->ntlm_challenge = NULL; #endif soap->proxy_from = NULL; do { soap->length = 0; soap->http_content = NULL; soap->action = NULL; soap->status = 0; soap->body = 1; if (soap_getline(soap, soap->msgbuf, sizeof(soap->msgbuf))) { if (soap->error == SOAP_EOF) return SOAP_EOF; return soap->error = 414; } if ((s = strchr(soap->msgbuf, ' '))) { soap->status = (unsigned short)soap_strtoul(s, &s, 10); if (!soap_blank((soap_wchar)*s)) soap->status = 0; } else soap->status = 0; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "HTTP status: %s\n", soap->msgbuf)); for (;;) { if (soap_getline(soap, header, SOAP_HDRLEN)) { if (soap->error == SOAP_EOF) { soap->error = SOAP_OK; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "EOF in HTTP header, continue anyway\n")); break; } return soap->error; } if (!*header) break; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "HTTP header: %s\n", header)); s = strchr(header, ':'); if (s) { char *t; *s = '\0'; do s++; while (*s && *s <= 32); if (*s == '"') s++; t = s + strlen(s) - 1; while (t > s && *t <= 32) t--; if (t >= s && *t == '"') t--; t[1] = '\0'; if ((soap->error = soap->fparsehdr(soap, header, s))) { if (soap->error < SOAP_STOP) return soap->error; status = soap->error; soap->error = SOAP_OK; } } } } while (soap->status == 100); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Finished HTTP header parsing, status = %d\n", soap->status)); s = strstr(soap->msgbuf, "HTTP/"); if (s && s[7] != '1') { if (soap->keep_alive == 1) soap->keep_alive = 0; if (soap->status == 0 && (soap->omode & SOAP_IO) == SOAP_IO_CHUNK) /* soap->status == 0 for HTTP request */ soap->omode = (soap->omode & ~SOAP_IO) | SOAP_IO_STORE; /* HTTP 1.0 does not support chunked transfers */ } if (soap->keep_alive < 0) soap->keep_alive = 1; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Keep alive connection = %d\n", soap->keep_alive)); if (soap->status == 0) { size_t l = 0; if (s) { if (!strncmp(soap->msgbuf, "POST ", l = 5)) httpcmd = 1; else if (!strncmp(soap->msgbuf, "PUT ", l = 4)) httpcmd = 2; else if (!strncmp(soap->msgbuf, "GET ", l = 4)) httpcmd = 3; else if (!strncmp(soap->msgbuf, "DELETE ", l = 7)) httpcmd = 4; else if (!strncmp(soap->msgbuf, "OPTIONS ", l = 8)) httpcmd = 5; else if (!strncmp(soap->msgbuf, "HEAD ", l = 5)) httpcmd = 6; } if (s && httpcmd) { size_t m, n, k; while (soap_blank(soap->msgbuf[l])) l++; m = strlen(soap->endpoint); n = m + (s - soap->msgbuf) - l - 1; if (n >= sizeof(soap->endpoint)) n = sizeof(soap->endpoint) - 1; if (m > n) m = n; k = n - m + 1; if (k >= sizeof(soap->path)) k = sizeof(soap->path) - 1; while (k > 0 && soap_blank(soap->msgbuf[l + k - 1])) k--; soap_strncpy(soap->path, sizeof(soap->path), soap->msgbuf + l, k); if (*soap->path && *soap->path != '/') soap_strncpy(soap->endpoint, sizeof(soap->endpoint), soap->path, k); else soap_strncat(soap->endpoint, sizeof(soap->endpoint), soap->path, k); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Target endpoint='%s' path='%s'\n", soap->endpoint, soap->path)); if (httpcmd > 1) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "HTTP %s handler\n", soap->msgbuf)); switch (httpcmd) { case 2: soap->error = soap->fput(soap); break; case 3: soap->error = soap->fget(soap); break; case 4: soap->error = soap->fdel(soap); break; case 5: soap->error = soap->fopt(soap); break; case 6: soap->error = soap->fhead(soap); break; default: soap->error = 405; break; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "HTTP handler return = %d\n", soap->error)); if (soap->error == SOAP_OK) soap->error = SOAP_STOP; /* prevents further processing */ return soap->error; } if (status) return soap->error = status; } else if (status) return soap->error = status; else if (s) return soap->error = 405; return SOAP_OK; } #if 0 if (soap->length > 0 || (soap->http_content && (!soap->keep_alive || soap->recv_timeout)) || (soap->imode & SOAP_IO) == SOAP_IO_CHUNK) #endif if (soap->body) { if ((soap->status >= 200 && soap->status <= 299) /* OK, Accepted, etc */ || soap->status == 400 /* Bad Request */ || soap->status == 500) /* Internal Server Error */ return soap->error = SOAP_OK; /* force close afterwards in soap_closesock() */ soap->keep_alive = 0; #ifndef WITH_LEAN /* read HTTP body for error details */ s = soap_get_http_body(soap, NULL); if (s) return soap_set_receiver_error(soap, soap->msgbuf, s, soap->status); #endif } else if (soap->status >= 200 && soap->status <= 299) return soap->error = soap->status; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "HTTP error %d: %s\n", soap->status, soap->msgbuf)); return soap_set_receiver_error(soap, "HTTP Error", soap->msgbuf, soap->status); } #endif #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 static int http_parse_header(struct soap *soap, const char *key, const char *val) { if (!soap_tag_cmp(key, "Host")) { #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) if (soap->imode & SOAP_ENC_SSL) soap_strcpy(soap->endpoint, sizeof(soap->endpoint), "https://"); else #endif soap_strcpy(soap->endpoint, sizeof(soap->endpoint), "http://"); soap_strncat(soap->endpoint, sizeof(soap->endpoint), val, sizeof(soap->endpoint) - 9); } #ifndef WITH_LEANER else if (!soap_tag_cmp(key, "Content-Type")) { const char *action; soap->http_content = soap_strdup(soap, val); if (soap_get_header_attribute(soap, val, "application/dime")) soap->imode |= SOAP_ENC_DIME; else if (soap_get_header_attribute(soap, val, "multipart/related") || soap_get_header_attribute(soap, val, "multipart/form-data")) { soap->mime.boundary = soap_strdup(soap, soap_get_header_attribute(soap, val, "boundary")); soap->mime.start = soap_strdup(soap, soap_get_header_attribute(soap, val, "start")); soap->imode |= SOAP_ENC_MIME; } action = soap_get_header_attribute(soap, val, "action"); if (action) { if (*action == '"') { soap->action = soap_strdup(soap, action + 1); if (*soap->action) soap->action[strlen(soap->action) - 1] = '\0'; } else soap->action = soap_strdup(soap, action); } } #endif else if (!soap_tag_cmp(key, "Content-Length")) { soap->length = soap_strtoul(val, NULL, 10); if (!soap->length) soap->body = 0; } else if (!soap_tag_cmp(key, "Content-Encoding")) { if (!soap_tag_cmp(val, "deflate")) #ifdef WITH_ZLIB soap->zlib_in = SOAP_ZLIB_DEFLATE; #else return SOAP_ZLIB_ERROR; #endif else if (!soap_tag_cmp(val, "gzip")) #ifdef WITH_GZIP soap->zlib_in = SOAP_ZLIB_GZIP; #else return SOAP_ZLIB_ERROR; #endif } #ifdef WITH_ZLIB else if (!soap_tag_cmp(key, "Accept-Encoding")) { #ifdef WITH_GZIP if (strchr(val, '*') || soap_get_header_attribute(soap, val, "gzip")) soap->zlib_out = SOAP_ZLIB_GZIP; else #endif if (strchr(val, '*') || soap_get_header_attribute(soap, val, "deflate")) soap->zlib_out = SOAP_ZLIB_DEFLATE; else soap->zlib_out = SOAP_ZLIB_NONE; } #endif else if (!soap_tag_cmp(key, "Transfer-Encoding")) { soap->imode &= ~SOAP_IO; if (!soap_tag_cmp(val, "chunked")) soap->imode |= SOAP_IO_CHUNK; } else if (!soap_tag_cmp(key, "Connection")) { if (!soap_tag_cmp(val, "keep-alive")) soap->keep_alive = -soap->keep_alive; else if (!soap_tag_cmp(val, "close")) soap->keep_alive = 0; } #if !defined(WITH_LEAN) || defined(WITH_NTLM) else if (!soap_tag_cmp(key, "Authorization") || !soap_tag_cmp(key, "Proxy-Authorization")) { #ifdef WITH_NTLM if (!soap_tag_cmp(val, "NTLM*")) soap->ntlm_challenge = soap_strdup(soap, val + 4); else #endif if (!soap_tag_cmp(val, "Basic *")) { int n; char *s; soap_base642s(soap, val + 6, soap->tmpbuf, sizeof(soap->tmpbuf) - 1, &n); soap->tmpbuf[n] = '\0'; if ((s = strchr(soap->tmpbuf, ':'))) { *s = '\0'; soap->userid = soap_strdup(soap, soap->tmpbuf); soap->passwd = soap_strdup(soap, s + 1); } } } else if (!soap_tag_cmp(key, "WWW-Authenticate") || !soap_tag_cmp(key, "Proxy-Authenticate")) { #ifdef WITH_NTLM if (!soap_tag_cmp(val, "NTLM*")) soap->ntlm_challenge = soap_strdup(soap, val + 4); else #endif soap->authrealm = soap_strdup(soap, soap_get_header_attribute(soap, val + 6, "realm")); } else if (!soap_tag_cmp(key, "Expect")) { if (!soap_tag_cmp(val, "100-continue")) { if ((soap->error = soap->fposthdr(soap, "HTTP/1.1 100 Continue", NULL)) || (soap->error = soap->fposthdr(soap, NULL, NULL))) return soap->error; } } #endif else if (!soap_tag_cmp(key, "SOAPAction")) { if (*val == '"') { soap->action = soap_strdup(soap, val + 1); if (*soap->action) soap->action[strlen(soap->action) - 1] = '\0'; } else soap->action = soap_strdup(soap, val); } else if (!soap_tag_cmp(key, "Location")) { soap_strcpy(soap->endpoint, sizeof(soap->endpoint), val); } else if (!soap_tag_cmp(key, "X-Forwarded-For")) { soap->proxy_from = soap_strdup(soap, val); } #ifdef WITH_COOKIES else if (!soap_tag_cmp(key, "Cookie") || !soap_tag_cmp(key, "Cookie2") || !soap_tag_cmp(key, "Set-Cookie") || !soap_tag_cmp(key, "Set-Cookie2")) { soap_getcookies(soap, val); } #endif return SOAP_OK; } #endif #endif /******************************************************************************/ #if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) #ifndef PALM_1 SOAP_FMAC1 const char* SOAP_FMAC2 soap_get_header_attribute(struct soap *soap, const char *line, const char *key) { const char *s = line; if (s) { while (*s) { short flag; s = soap_decode_key(soap->tmpbuf, sizeof(soap->tmpbuf), s); flag = soap_tag_cmp(soap->tmpbuf, key); s = soap_decode_val(soap->tmpbuf, sizeof(soap->tmpbuf), s); if (!flag) return soap->tmpbuf; } } return NULL; } #endif #endif /******************************************************************************/ #if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) #ifndef PALM_1 SOAP_FMAC1 const char* SOAP_FMAC2 soap_decode_key(char *buf, size_t len, const char *val) { return soap_decode(buf, len, val, "=,;"); } #endif #endif /******************************************************************************/ #if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) #ifndef PALM_1 SOAP_FMAC1 const char* SOAP_FMAC2 soap_decode_val(char *buf, size_t len, const char *val) { if (*val != '=') { *buf = '\0'; return val; } return soap_decode(buf, len, val + 1, ",;"); } #endif #endif /******************************************************************************/ #if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) #ifndef PALM_1 static const char* soap_decode(char *buf, size_t len, const char *val, const char *sep) { const char *s; char *t = buf; size_t i = len; for (s = val; *s; s++) if (*s != ' ' && *s != '\t' && !strchr(sep, *s)) break; if (len > 0) { if (*s == '"') { s++; while (*s && *s != '"' && --i) *t++ = *s++; } else { while (*s && !soap_blank((soap_wchar)*s) && !strchr(sep, *s) && --i) { if (*s == '%' && s[1] && s[2]) { *t++ = ((s[1] >= 'A' ? (s[1] & 0x7) + 9 : s[1] - '0') << 4) + (s[2] >= 'A' ? (s[2] & 0x7) + 9 : s[2] - '0'); s += 3; } else *t++ = *s++; } } buf[len - 1] = '\0'; /* appease */ } *t = '\0'; while (*s && !strchr(sep, *s)) s++; return s; } #endif #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 static const char* http_error(struct soap *soap, int status) { const char *msg = SOAP_STR_EOS; (void)soap; (void)status; #ifndef WITH_LEAN msg = soap_code_str(h_http_error_codes, status); if (!msg) msg = SOAP_STR_EOS; #endif return msg; } #endif #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 static int http_get(struct soap *soap) { (void)soap; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "HTTP GET request\n")); return SOAP_GET_METHOD; } #endif #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 static int http_405(struct soap *soap) { (void)soap; return 405; } #endif #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 static int http_200(struct soap *soap) { return soap_send_empty_response(soap, 200); } #endif #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 static int http_post(struct soap *soap, const char *endpoint, const char *host, int port, const char *path, const char *action, size_t count) { const char *s; int err; size_t l; switch (soap->status) { case SOAP_GET: s = "GET"; break; case SOAP_PUT: s = "PUT"; break; case SOAP_DEL: s = "DELETE"; break; case SOAP_CONNECT: s = "CONNECT"; break; default: s = "POST"; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "HTTP %s to %s\n", s, endpoint ? endpoint : "(null)")); #ifdef PALM if (!endpoint || (soap_tag_cmp(endpoint, "http:*") && soap_tag_cmp(endpoint, "https:*") && strncmp(endpoint, "_beam:", 6) && strncmp(endpoint, "_local:", 7) && strncmp(endpoint, "_btobex:", 8)) #else if (!endpoint || (soap_tag_cmp(endpoint, "http:*") && soap_tag_cmp(endpoint, "https:*") && soap_tag_cmp(endpoint, "httpg:*"))) #endif return SOAP_OK; /* set l to prevent overruns ('host' and 'soap->host' are substrings of 'endpoint') */ l = strlen(endpoint) + strlen(soap->http_version) + 80; if (l > sizeof(soap->tmpbuf)) return soap->error = SOAP_EOM; if (soap->status == SOAP_CONNECT) (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), l), "%s %s:%d HTTP/%s", s, soap->host, soap->port, soap->http_version); else if (soap->proxy_host && endpoint) (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), l), "%s %s HTTP/%s", s, endpoint, soap->http_version); else (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), l), "%s /%s HTTP/%s", s, (*path == '/' ? path + 1 : path), soap->http_version); if ((err = soap->fposthdr(soap, soap->tmpbuf, NULL))) return err; #ifdef WITH_OPENSSL if ((soap->ssl && port != 443) || (!soap->ssl && port != 80)) #else if (port != 80) #endif { #ifdef WITH_IPV6 if (*host != '[' && strchr(host, ':')) (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), l), "[%s]:%d", host, port); /* RFC 2732 */ else #endif (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), l), "%s:%d", host, port); } else { #ifdef WITH_IPV6 if (*host != '[' && strchr(host, ':')) (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), l), "[%s]", host); /* RFC 2732 */ else #endif soap_strcpy(soap->tmpbuf, sizeof(soap->tmpbuf), host); } if ((err = soap->fposthdr(soap, "Host", soap->tmpbuf))) return err; if ((err = soap->fposthdr(soap, "User-Agent", "gSOAP/2.8"))) return err; if ((err = soap_puthttphdr(soap, SOAP_OK, count))) return err; #ifdef WITH_ZLIB #ifdef WITH_GZIP if ((err = soap->fposthdr(soap, "Accept-Encoding", "gzip, deflate"))) #else if ((err = soap->fposthdr(soap, "Accept-Encoding", "deflate"))) #endif return err; #endif #if !defined(WITH_LEAN) || defined(WITH_NTLM) #ifdef WITH_NTLM if (soap->ntlm_challenge) { l = strlen(soap->ntlm_challenge); if (l) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), l + 5), "NTLM %s", soap->ntlm_challenge); if (soap->proxy_host) { if ((err = soap->fposthdr(soap, "Proxy-Authorization", soap->tmpbuf))) return err; } else if ((err = soap->fposthdr(soap, "Authorization", soap->tmpbuf))) return err; } } else { #endif if (soap->userid && soap->passwd) { l = strlen(soap->userid) + strlen(soap->passwd); soap_strcpy(soap->tmpbuf, sizeof(soap->tmpbuf), "Basic "); (SOAP_SNPRINTF(soap->tmpbuf + 262, sizeof(soap->tmpbuf) - 262, l + 1), "%s:%s", soap->userid, soap->passwd); soap_s2base64(soap, (const unsigned char*)(soap->tmpbuf + 262), soap->tmpbuf + 6, (int)strlen(soap->tmpbuf + 262)); if ((err = soap->fposthdr(soap, "Authorization", soap->tmpbuf))) return err; } if (soap->proxy_userid && soap->proxy_passwd) { l = strlen(soap->proxy_userid) + strlen(soap->proxy_passwd); soap_strcpy(soap->tmpbuf, sizeof(soap->tmpbuf), "Basic "); (SOAP_SNPRINTF(soap->tmpbuf + 262, sizeof(soap->tmpbuf) - 262, l + 1), "%s:%s", soap->proxy_userid, soap->proxy_passwd); soap_s2base64(soap, (const unsigned char*)(soap->tmpbuf + 262), soap->tmpbuf + 6, (int)strlen(soap->tmpbuf + 262)); if ((err = soap->fposthdr(soap, "Proxy-Authorization", soap->tmpbuf))) return err; } #ifdef WITH_NTLM } #endif #endif #ifdef WITH_COOKIES #ifdef WITH_OPENSSL if (soap_putcookies(soap, host, path, soap->ssl != NULL)) return soap->error; #else if (soap_putcookies(soap, host, path, 0)) return soap->error; #endif #endif if (action && soap->status != SOAP_GET && soap->status != SOAP_DEL) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), strlen(action) + 2), "\"%s\"", action); if ((err = soap->fposthdr(soap, "SOAPAction", soap->tmpbuf))) return err; } return soap->fposthdr(soap, NULL, NULL); } #endif #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 static int http_send_header(struct soap *soap, const char *s) { const char *t; do { t = strchr(s, '\n'); /* disallow \n in HTTP headers */ if (!t) t = s + strlen(s); if (soap_send_raw(soap, s, t - s)) return soap->error; s = t + 1; } while (*t); return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 static int http_post_header(struct soap *soap, const char *key, const char *val) { if (key) { if (http_send_header(soap, key)) return soap->error; if (val && (soap_send_raw(soap, ": ", 2) || http_send_header(soap, val))) return soap->error; } return soap_send_raw(soap, "\r\n", 2); } #endif #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 static int http_response(struct soap *soap, int status, size_t count) { int err; char http[16]; int code = status; const char *line; #ifdef WMW_RPM_IO if (soap->rpmreqid) httpOutputEnable(soap->rpmreqid); #endif #ifdef WMW_RPM_IO if (soap->rpmreqid || soap_valid_socket(soap->master) || soap_valid_socket(soap->socket)) /* RPM behaves as if standalone */ #else if (soap_valid_socket(soap->master) || soap_valid_socket(soap->socket)) /* standalone application (socket) or CGI (stdin/out)? */ #endif (SOAP_SNPRINTF(http, sizeof(http), strlen(soap->http_version) + 5), "HTTP/%s", soap->http_version); else soap_strcpy(http, sizeof(http), "Status:"); if (!status || status == SOAP_HTML || status == SOAP_FILE) { if (count || ((soap->omode & SOAP_IO) == SOAP_IO_CHUNK)) code = 200; else code = 202; } else if (status < 200 || status >= 600) { const char *s = *soap_faultcode(soap); if (status >= SOAP_GET_METHOD && status <= SOAP_HTTP_METHOD) code = 405; else if (soap->version == 2 && (!s || !strcmp(s, "SOAP-ENV:Sender"))) code = 400; else code = 500; } line = http_error(soap, code); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "HTTP Status = %d %s\n", code, line)); (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), sizeof(http) + 22 + strlen(line)), "%s %d %s", http, code, line); if ((err = soap->fposthdr(soap, soap->tmpbuf, NULL))) return err; #ifndef WITH_LEAN if (status == 401) { (SOAP_SNPRINTF_SAFE(soap->tmpbuf, sizeof(soap->tmpbuf)), "Basic realm=\"%s\"", (soap->authrealm && strlen(soap->authrealm) + 14 < sizeof(soap->tmpbuf)) ? soap->authrealm : "gSOAP Web Service"); if ((err = soap->fposthdr(soap, "WWW-Authenticate", soap->tmpbuf))) return err; } else if ((status >= 301 && status <= 303) || status == 307) { if ((err = soap->fposthdr(soap, "Location", soap->endpoint))) return err; } #endif if ((err = soap->fposthdr(soap, "Server", "gSOAP/2.8")) || (err = soap_puthttphdr(soap, status, count))) return err; #ifdef WITH_COOKIES if (soap_putsetcookies(soap)) return soap->error; #endif return soap->fposthdr(soap, NULL, NULL); } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_response(struct soap *soap, int status) { size_t count; if (!(soap->omode & (SOAP_ENC_XML | SOAP_IO_STORE /* this tests for chunking too */)) && (status == SOAP_HTML || status == SOAP_FILE)) soap->omode = (soap->omode & ~SOAP_IO) | SOAP_IO_STORE; soap->status = status; count = soap_count_attachments(soap); if (soap_begin_send(soap)) return soap->error; #ifndef WITH_NOHTTP if ((soap->mode & SOAP_IO) != SOAP_IO_STORE && !(soap->mode & SOAP_ENC_XML)) { int n = soap->mode; soap->mode &= ~(SOAP_IO | SOAP_ENC_ZLIB); if ((n & SOAP_IO) != SOAP_IO_FLUSH) soap->mode |= SOAP_IO_BUFFER; if ((soap->error = soap->fresponse(soap, status, count))) return soap->error; #ifndef WITH_LEANER if ((n & SOAP_IO) == SOAP_IO_CHUNK) { if (soap_flush(soap)) return soap->error; } #endif soap->mode = n; } #endif return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 const char* SOAP_FMAC2 soap_url(struct soap *soap, const char *s, const char *t) { if (!t || (*t != '/' && *t != '?')) return s; (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), strlen(s) + strlen(t)), "%s%s", s, t); return soap->msgbuf; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 size_t SOAP_FMAC2 soap_encode_url(const char *s, char *t, size_t len) { int c; size_t n = len; while ((c = *s++) && --n > 0) { if (c > ' ' && c < 128 && !strchr("()<>@,;:\\\"/[]?={}#!$&'*+", c)) *t++ = c; else if (n > 2) { *t++ = '%'; *t++ = (c >> 4) + (c > 159 ? '7' : '0'); c &= 0xF; *t++ = c + (c > 9 ? '7' : '0'); n -= 2; } else break; } *t = '\0'; return len - n; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 const char* SOAP_FMAC2 soap_encode_url_string(struct soap *soap, const char *s) { if (s) { size_t n = 3*strlen(s)+1; char *t = (char*)soap_malloc(soap, n); if (t) { soap_encode_url(s, t, n); return t; } } return SOAP_STR_EOS; } #endif /******************************************************************************\ * * HTTP Cookies * \******************************************************************************/ #ifdef WITH_COOKIES SOAP_FMAC1 struct soap_cookie* SOAP_FMAC2 soap_cookie(struct soap *soap, const char *name, const char *domain, const char *path) { struct soap_cookie *p; if (!domain) domain = soap->cookie_domain; if (!path) path = soap->cookie_path; if (!path) path = SOAP_STR_EOS; else if (*path == '/') path++; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Search cookie='%s' domain='%s' path='%s'\n", name, domain ? domain : "(null)", path ? path : "(null)")); for (p = soap->cookies; p; p = p->next) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Cookie in database: %s='%s' domain='%s' path='%s' env=%hd\n", p->name, p->value ? p->value : "(null)", p->domain ? p->domain : "(null)", p->path ? p->path : "(null)", p->env)); if (!strcmp(p->name, name) && ((!p->domain && !domain) || (p->domain && !strcmp(p->domain, domain))) && ((!p->path && !path) || (p->path && !strncmp(p->path, path, strlen(p->path))))) break; } return p; } /******************************************************************************/ SOAP_FMAC1 struct soap_cookie* SOAP_FMAC2 soap_set_cookie(struct soap *soap, const char *name, const char *value, const char *domain, const char *path) { struct soap_cookie **p, *q; int n; if (!domain) domain = soap->cookie_domain; if (!path) path = soap->cookie_path; if (!path) path = SOAP_STR_EOS; else if (*path == '/') path++; q = soap_cookie(soap, name, domain, path); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Set %scookie: %s='%s' domain='%s' path='%s'\n", q ? SOAP_STR_EOS : "new ", name, value ? value : "(null)", domain ? domain : "(null)", path ? path : "(null)")); if (!q) { if ((q = (struct soap_cookie*)SOAP_MALLOC(soap, sizeof(struct soap_cookie)))) { size_t l = strlen(name); if ((q->name = (char*)SOAP_MALLOC(soap, l + 1))) soap_strcpy(q->name, l + 1, name); q->value = NULL; q->domain = NULL; q->path = NULL; q->expire = 0; q->maxage = -1; q->version = 1; q->secure = 0; q->modified = 0; for (p = &soap->cookies, n = soap->cookie_max; *p && n; p = &(*p)->next, n--) if (!strcmp((*p)->name, name) && (*p)->path && path && strcmp((*p)->path, path) < 0) break; if (n) { q->next = *p; *p = q; } else { SOAP_FREE(soap, q->name); SOAP_FREE(soap, q); q = NULL; } } } else q->modified = 1; if (q) { if (q->value) { if (!value || strcmp(value, q->value)) { SOAP_FREE(soap, q->value); q->value = NULL; } } if (value && *value && !q->value) { size_t l = strlen(value); q->value = (char*)SOAP_MALLOC(soap, l + 1); if (q->value) soap_strcpy(q->value, l + 1, value); } if (q->domain) { if (!domain || strcmp(domain, q->domain)) { SOAP_FREE(soap, q->domain); q->domain = NULL; } } if (domain && !q->domain) { size_t l = strlen(domain); q->domain = (char*)SOAP_MALLOC(soap, l + 1); if (q->domain) soap_strcpy(q->domain, l + 1, domain); } if (q->path) { if (!path || strncmp(path, q->path, strlen(q->path))) { SOAP_FREE(soap, q->path); q->path = NULL; } } if (path && !q->path) { size_t l = strlen(path); q->path = (char*)SOAP_MALLOC(soap, l + 1); if (q->path) soap_strcpy(q->path, l + 1, path); } q->session = 1; q->env = 0; } return q; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_clr_cookie(struct soap *soap, const char *name, const char *domain, const char *path) { struct soap_cookie **p, *q; if (!domain) domain = soap->cookie_domain; if (!domain) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Error in clear cookie='%s': cookie domain not set\n", name ? name : "(null)")); return; } if (!path) path = soap->cookie_path; if (!path) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Error in clear cookie='%s': cookie path not set\n", name ? name : "(null)")); return; } if (*path == '/') path++; for (p = &soap->cookies, q = *p; q; q = *p) { if (!strcmp(q->name, name) && (!q->domain || !strcmp(q->domain, domain)) && (!q->path || !strncmp(q->path, path, strlen(q->path)))) { if (q->value) SOAP_FREE(soap, q->value); if (q->domain) SOAP_FREE(soap, q->domain); if (q->path) SOAP_FREE(soap, q->path); *p = q->next; SOAP_FREE(soap, q); } else p = &q->next; } } /******************************************************************************/ SOAP_FMAC1 char * SOAP_FMAC2 soap_cookie_value(struct soap *soap, const char *name, const char *domain, const char *path) { struct soap_cookie *p; if ((p = soap_cookie(soap, name, domain, path))) return p->value; return NULL; } /******************************************************************************/ SOAP_FMAC1 char * SOAP_FMAC2 soap_env_cookie_value(struct soap *soap, const char *name, const char *domain, const char *path) { struct soap_cookie *p; if ((p = soap_cookie(soap, name, domain, path)) && p->env) return p->value; return NULL; } /******************************************************************************/ SOAP_FMAC1 time_t SOAP_FMAC2 soap_cookie_expire(struct soap *soap, const char *name, const char *domain, const char *path) { struct soap_cookie *p; if ((p = soap_cookie(soap, name, domain, path))) return p->expire; return -1; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_set_cookie_expire(struct soap *soap, const char *name, long expire, const char *domain, const char *path) { struct soap_cookie *p; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Set cookie expiration max-age=%ld: cookie='%s' domain='%s' path='%s'\n", expire, name, domain ? domain : "(null)", path ? path : "(null)")); if ((p = soap_cookie(soap, name, domain, path))) { p->maxage = expire; p->modified = 1; return SOAP_OK; } return SOAP_ERR; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_set_cookie_session(struct soap *soap, const char *name, const char *domain, const char *path) { struct soap_cookie *p; if ((p = soap_cookie(soap, name, domain, path))) { p->session = 1; p->modified = 1; return SOAP_OK; } return SOAP_ERR; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_clr_cookie_session(struct soap *soap, const char *name, const char *domain, const char *path) { struct soap_cookie *p; if ((p = soap_cookie(soap, name, domain, path))) { p->session = 0; p->modified = 1; return SOAP_OK; } return SOAP_ERR; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_putsetcookies(struct soap *soap) { struct soap_cookie *p; char *s, tmp[4096]; const char *t; for (p = soap->cookies; p; p = p->next) { if (p->modified #ifdef WITH_OPENSSL || (!p->env && !soap->ssl == !p->secure) #endif ) { s = tmp; if (p->name) s += soap_encode_url(p->name, s, 4064 - (s-tmp)); if (p->value && *p->value) { *s++ = '='; s += soap_encode_url(p->value, s, 4064 - (s-tmp)); } if (p->domain && (int)strlen(p->domain) < 4064 - (s-tmp)) { soap_strcpy(s, 4096 - (s-tmp), ";Domain="); soap_strcpy(s + 8, 4088 - (s-tmp), p->domain); } else if (soap->cookie_domain && (int)strlen(soap->cookie_domain) < 4064 - (s-tmp)) { soap_strcpy(s, 4096 - (s-tmp), ";Domain="); soap_strcpy(s + 8, 4088 - (s-tmp), soap->cookie_domain); } s += strlen(s); soap_strcpy(s, 4096 - (s-tmp), ";Path=/"); if (p->path) t = p->path; else t = soap->cookie_path; if (t) { if (*t == '/') t++; if ((int)strlen(t) < 4064 - (s-tmp)) { if (strchr(t, '%')) /* already URL encoded? */ { soap_strcpy(s, 4096 - (s-tmp), t); s += strlen(s); } else s += soap_encode_url(t, s, 4064 - (s-tmp)); } } if (p->version > 0 && s-tmp < 4064) { (SOAP_SNPRINTF(s, 4096 - (s-tmp), 29), ";Version=%u", p->version); s += strlen(s); } if (p->maxage >= 0 && s-tmp < 4064) { (SOAP_SNPRINTF(s, 4096 - (s-tmp), 29), ";Max-Age=%ld", p->maxage); s += strlen(s); } if (s-tmp < 4073 && (p->secure #ifdef WITH_OPENSSL || soap->ssl #endif )) soap_strcpy(s, 4096 - (s-tmp), ";Secure"); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Set-Cookie: %s\n", tmp)); if ((soap->error = soap->fposthdr(soap, "Set-Cookie", tmp))) return soap->error; } } return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_putcookies(struct soap *soap, const char *domain, const char *path, int secure) { struct soap_cookie **p, *q; unsigned int version = 0; time_t now = time(NULL); char *s, tmp[4096]; if (!domain || !path) return SOAP_OK; s = tmp; p = &soap->cookies; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Sending cookies for domain='%s' path='%s'\n", domain, path)); if (*path == '/') path++; while ((q = *p)) { if (q->expire && now > q->expire) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Cookie %s expired\n", q->name)); SOAP_FREE(soap, q->name); if (q->value) SOAP_FREE(soap, q->value); if (q->domain) SOAP_FREE(soap, q->domain); if (q->path) SOAP_FREE(soap, q->path); *p = q->next; SOAP_FREE(soap, q); } else { int flag; char *t = q->domain; size_t n = 0; if (!t) flag = 1; else { const char *r = strchr(t, ':'); if (r) n = r - t; else n = strlen(t); flag = !strncmp(t, domain, n); } /* domain-level cookies, cannot compile when WITH_NOIO set */ #ifndef WITH_NOIO if (!flag) { struct hostent *hostent = gethostbyname((char*)domain); if (hostent) { const char *r = hostent->h_name; if (*t == '.') { size_t k = strlen(hostent->h_name); if (k >= n) r = hostent->h_name + k - n; } flag = !strncmp(t, r, n); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Domain cookie %s host %s (match=%d)\n", t, r, flag)); } } #endif if (flag && (!q->path || !strncmp(q->path, path, strlen(q->path))) && (!q->secure || secure)) { size_t n = 12; if (q->name) n += 3*strlen(q->name); if (q->value && *q->value) n += 3*strlen(q->value) + 1; if (q->path && *q->path) n += strlen(q->path) + 9; if (q->domain) n += strlen(q->domain) + 11; if (tmp - s + n > sizeof(tmp)) { if (s == tmp) return SOAP_OK; /* HTTP header size overflow */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Cookie: %s\n", tmp)); if ((soap->error = soap->fposthdr(soap, "Cookie", tmp))) return soap->error; s = tmp; } else if (s != tmp) { *s++ = ' '; } if (q->version != version && s-tmp < 4060) { (SOAP_SNPRINTF(s, 4096 - (s-tmp), 29), "$Version=%u;", q->version); version = q->version; s += strlen(s); } if (q->name) s += soap_encode_url(q->name, s, tmp+sizeof(tmp)-s-16); if (q->value && *q->value) { *s++ = '='; s += soap_encode_url(q->value, s, tmp+sizeof(tmp)-s-16); } if (q->path && (s-tmp) + strlen(q->path) < 4060) { (SOAP_SNPRINTF_SAFE(s, 4096 - (s-tmp)), ";$Path=\"/%s\"", (*q->path == '/' ? q->path + 1 : q->path)); s += strlen(s); } if (q->domain && (s-tmp) + strlen(q->domain) < 4060) { (SOAP_SNPRINTF_SAFE(s, 4096 - (s-tmp)), ";$Domain=\"%s\"", q->domain); s += strlen(s); } } p = &q->next; } } if (s != tmp) if ((soap->error = soap->fposthdr(soap, "Cookie", tmp))) return soap->error; return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_getcookies(struct soap *soap, const char *val) { struct soap_cookie *p = NULL, *q; const char *s; char *t, tmp[4096]; /* cookie size is up to 4096 bytes [RFC2109] */ char *domain = NULL; char *path = NULL; unsigned int version = 0; time_t now = time(NULL); if (!val) return; s = val; while (*s) { s = soap_decode_key(tmp, sizeof(tmp), s); if (!soap_tag_cmp(tmp, "$Version")) { if ((s = soap_decode_val(tmp, sizeof(tmp), s))) { if (p) p->version = (int)soap_strtol(tmp, NULL, 10); else version = (int)soap_strtol(tmp, NULL, 10); } } else if (!soap_tag_cmp(tmp, "$Path")) { s = soap_decode_val(tmp, sizeof(tmp), s); if (*tmp) { size_t l = strlen(tmp) + 1; if ((t = (char*)SOAP_MALLOC(soap, l))) soap_memcpy((void*)t, l, (const void*)tmp, l); } else t = NULL; if (p) { if (p->path) SOAP_FREE(soap, p->path); p->path = t; } else { if (path) SOAP_FREE(soap, path); path = t; } } else if (!soap_tag_cmp(tmp, "$Domain")) { s = soap_decode_val(tmp, sizeof(tmp), s); if (*tmp) { size_t l = strlen(tmp) + 1; if ((t = (char*)SOAP_MALLOC(soap, l))) soap_memcpy((void*)t, l, (const void*)tmp, l); } else t = NULL; if (p) { if (p->domain) SOAP_FREE(soap, p->domain); p->domain = t; } else { if (domain) SOAP_FREE(soap, domain); domain = t; } } else if (p && !soap_tag_cmp(tmp, "Path")) { if (p->path) SOAP_FREE(soap, p->path); s = soap_decode_val(tmp, sizeof(tmp), s); if (*tmp) { size_t l = strlen(tmp) + 1; if ((p->path = (char*)SOAP_MALLOC(soap, l))) soap_memcpy((void*)p->path, l, (const void*)tmp, l); } else p->path = NULL; } else if (p && !soap_tag_cmp(tmp, "Domain")) { if (p->domain) SOAP_FREE(soap, p->domain); s = soap_decode_val(tmp, sizeof(tmp), s); if (*tmp) { size_t l = strlen(tmp) + 1; if ((p->domain = (char*)SOAP_MALLOC(soap, l))) soap_memcpy((void*)p->domain, l, (const void*)tmp, l); } else p->domain = NULL; } else if (p && !soap_tag_cmp(tmp, "Version")) { s = soap_decode_val(tmp, sizeof(tmp), s); p->version = (unsigned int)soap_strtoul(tmp, NULL, 10); } else if (p && !soap_tag_cmp(tmp, "Max-Age")) { s = soap_decode_val(tmp, sizeof(tmp), s); p->expire = now + soap_strtol(tmp, NULL, 10); } else if (p && !soap_tag_cmp(tmp, "Expires")) { struct tm T; char a[3]; static const char mns[] = "anebarprayunulugepctovec"; s = soap_decode_val(tmp, sizeof(tmp), s); if (strlen(tmp) > 20) { memset((void*)&T, 0, sizeof(T)); a[0] = tmp[4]; a[1] = tmp[5]; a[2] = '\0'; T.tm_mday = (int)soap_strtol(a, NULL, 10); a[0] = tmp[8]; a[1] = tmp[9]; T.tm_mon = (int)(strstr(mns, a) - mns) / 2; a[0] = tmp[11]; a[1] = tmp[12]; T.tm_year = 100 + (int)soap_strtol(a, NULL, 10); a[0] = tmp[13]; a[1] = tmp[14]; T.tm_hour = (int)soap_strtol(a, NULL, 10); a[0] = tmp[16]; a[1] = tmp[17]; T.tm_min = (int)soap_strtol(a, NULL, 10); a[0] = tmp[19]; a[1] = tmp[20]; T.tm_sec = (int)soap_strtol(a, NULL, 10); p->expire = soap_timegm(&T); } } else if (p && !soap_tag_cmp(tmp, "Secure")) p->secure = 1; else { if (p) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Got environment cookie='%s' value='%s' domain='%s' path='%s' expire=%ld secure=%d\n", p->name, p->value ? p->value : "(null)", p->domain ? p->domain : "(null)", p->path ? p->path : "(null)", p->expire, p->secure)); if ((q = soap_set_cookie(soap, p->name, p->value, p->domain, p->path))) { q->version = p->version; q->expire = p->expire; q->secure = p->secure; q->env = 1; } if (p->name) SOAP_FREE(soap, p->name); if (p->value) SOAP_FREE(soap, p->value); if (p->domain) SOAP_FREE(soap, p->domain); if (p->path) SOAP_FREE(soap, p->path); SOAP_FREE(soap, p); } if ((p = (struct soap_cookie*)SOAP_MALLOC(soap, sizeof(struct soap_cookie)))) { size_t l = strlen(tmp) + 1; if ((p->name = (char*)SOAP_MALLOC(soap, l))) soap_memcpy((void*)p->name, l, (const void*)tmp, l); s = soap_decode_val(tmp, sizeof(tmp), s); if (*tmp) { l = strlen(tmp) + 1; if ((p->value = (char*)SOAP_MALLOC(soap, l))) soap_memcpy((void*)p->value, l, (const void*)tmp, l); } else p->value = NULL; if (domain) p->domain = domain; else if (*soap->host) { l = strlen(soap->host) + 1; if ((p->domain = (char*)SOAP_MALLOC(soap, l))) soap_memcpy((void*)p->domain, l, (const void*)soap->host, l); } else p->domain = NULL; if (path) p->path = path; else if (*soap->path) { l = strlen(soap->path) + 1; if ((p->path = (char*)SOAP_MALLOC(soap, l))) soap_memcpy((void*)p->path, l, (const void*)soap->path, l); } else { if ((p->path = (char*)SOAP_MALLOC(soap, 2))) soap_memcpy((void*)p->path, 2, (const void*)"/", 2); } p->expire = 0; p->secure = 0; p->version = version; } } } if (p) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Got environment cookie='%s' value='%s' domain='%s' path='%s' expire=%ld secure=%d\n", p->name, p->value ? p->value : "(null)", p->domain ? p->domain : "(null)", p->path ? p->path : "(null)", p->expire, p->secure)); if ((q = soap_set_cookie(soap, p->name, p->value, p->domain, p->path))) { q->version = p->version; q->expire = p->expire; q->secure = p->secure; q->env = 1; } if (p->name) SOAP_FREE(soap, p->name); if (p->value) SOAP_FREE(soap, p->value); if (p->domain) SOAP_FREE(soap, p->domain); if (p->path) SOAP_FREE(soap, p->path); SOAP_FREE(soap, p); } if (domain) SOAP_FREE(soap, domain); if (path) SOAP_FREE(soap, path); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_getenv_cookies(struct soap *soap) { struct soap_cookie *p; const char *s; char key[4096], val[4096]; /* cookie size is up to 4096 bytes [RFC2109] */ if (!(s = getenv("HTTP_COOKIE"))) return SOAP_ERR; do { s = soap_decode_key(key, sizeof(key), s); s = soap_decode_val(val, sizeof(val), s); p = soap_set_cookie(soap, key, val, NULL, NULL); if (p) p->env = 1; } while (*s); return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 struct soap_cookie* SOAP_FMAC2 soap_copy_cookies(struct soap *copy, const struct soap *soap) { struct soap_cookie *p, **q, *r; q = &r; for (p = soap->cookies; p; p = p->next) { if (!(*q = (struct soap_cookie*)SOAP_MALLOC(copy, sizeof(struct soap_cookie)))) return r; **q = *p; if (p->name) { size_t l = strlen(p->name) + 1; if (((*q)->name = (char*)SOAP_MALLOC(copy, l))) soap_memcpy((*q)->name, l, p->name, l); } if (p->value) { size_t l = strlen(p->value) + 1; if (((*q)->value = (char*)SOAP_MALLOC(copy, l))) soap_memcpy((*q)->value, l, p->value, l); } if (p->domain) { size_t l = strlen(p->domain) + 1; if (((*q)->domain = (char*)SOAP_MALLOC(copy, l))) soap_memcpy((*q)->domain, l, p->domain, l); } if (p->path) { size_t l = strlen(p->path) + 1; if (((*q)->path = (char*)SOAP_MALLOC(copy, l))) soap_memcpy((*q)->path, l, p->path, l); } q = &(*q)->next; } *q = NULL; return r; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_free_cookies(struct soap *soap) { struct soap_cookie *p; for (p = soap->cookies; p; p = soap->cookies) { soap->cookies = p->next; SOAP_FREE(soap, p->name); if (p->value) SOAP_FREE(soap, p->value); if (p->domain) SOAP_FREE(soap, p->domain); if (p->path) SOAP_FREE(soap, p->path); SOAP_FREE(soap, p); } } /******************************************************************************/ #endif /* WITH_COOKIES */ /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 size_t SOAP_FMAC2 soap_hash(const char *s) { size_t h = 0; while (*s) h = 65599*h + *s++; return h % SOAP_IDHASH; } #endif /******************************************************************************/ #ifndef PALM_1 static void soap_init_pht(struct soap *soap) { int i; soap->pblk = NULL; soap->pidx = 0; for (i = 0; i < (int)SOAP_PTRHASH; i++) soap->pht[i] = NULL; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 struct soap* SOAP_FMAC2 soap_versioning(soap_new)(soap_mode imode, soap_mode omode) { struct soap *soap; #ifdef __cplusplus soap = SOAP_NEW(struct soap); #else soap = (struct soap*)malloc(sizeof(struct soap)); #endif if (soap) soap_versioning(soap_init)(soap, imode, omode); return soap; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_free(struct soap *soap) { soap_done(soap); #ifdef __cplusplus SOAP_DELETE(soap); #else free(soap); #endif } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_del(struct soap *soap) { free(soap); } #endif /******************************************************************************/ #ifndef PALM_1 static void soap_free_pht(struct soap *soap) { struct soap_pblk *pb, *next; int i; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free pointer hashtable\n")); for (pb = soap->pblk; pb; pb = next) { next = pb->next; SOAP_FREE(soap, pb); } soap->pblk = NULL; soap->pidx = 0; for (i = 0; i < (int)SOAP_PTRHASH; i++) soap->pht[i] = NULL; } #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_embed(struct soap *soap, const void *p, const void *a, int n, int t) { int id; struct soap_plist *pp; if (soap->version == 2) soap->encoding = 1; if (!p || (!soap->encodingStyle && !(soap->omode & SOAP_XML_GRAPH)) || (soap->omode & SOAP_XML_TREE)) return 0; if (a) id = soap_array_pointer_lookup(soap, p, a, n, t, &pp); else id = soap_pointer_lookup(soap, p, t, &pp); if (id) { if (soap_is_embedded(soap, pp) || soap_is_single(soap, pp)) return 0; soap_set_embedded(soap, pp); } return id; } #endif #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_pointer_lookup(struct soap *soap, const void *p, int type, struct soap_plist **ppp) { struct soap_plist *pp; *ppp = NULL; if (p) { for (pp = soap->pht[soap_hash_ptr(p)]; pp; pp = pp->next) { if (pp->ptr == p && pp->type == type) { *ppp = pp; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Lookup location=%p type=%d id=%d\n", p, type, pp->id)); return pp->id; } } } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Lookup location=%p type=%d: not found\n", p, type)); return 0; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_pointer_enter(struct soap *soap, const void *p, const void *a, int n, int type, struct soap_plist **ppp) { size_t h; struct soap_plist *pp; (void)n; if (!soap->pblk || soap->pidx >= SOAP_PTRBLK) { struct soap_pblk *pb = (struct soap_pblk*)SOAP_MALLOC(soap, sizeof(struct soap_pblk)); if (!pb) { soap->error = SOAP_EOM; return 0; } pb->next = soap->pblk; soap->pblk = pb; soap->pidx = 0; } *ppp = pp = &soap->pblk->plist[soap->pidx++]; if (a) h = soap_hash_ptr(a); else h = soap_hash_ptr(p); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Pointer enter location=%p array=%p size=%lu type=%d id=%d\n", p, a, (unsigned long)n, type, soap->idnum+1)); pp->next = soap->pht[h]; pp->type = type; pp->mark1 = 0; pp->mark2 = 0; pp->ptr = p; pp->dup = NULL; pp->array = a; pp->size = n; soap->pht[h] = pp; pp->id = ++soap->idnum; return pp->id; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_array_pointer_lookup(struct soap *soap, const void *p, const void *a, int n, int type, struct soap_plist **ppp) { struct soap_plist *pp; *ppp = NULL; if (!p || !a) return 0; for (pp = soap->pht[soap_hash_ptr(a)]; pp; pp = pp->next) { if (pp->type == type && pp->array == a && pp->size == n) { *ppp = pp; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Array lookup location=%p type=%d id=%d\n", a, type, pp->id)); return pp->id; } } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Array lookup location=%p type=%d: not found\n", a, type)); return 0; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_begin_count(struct soap *soap) { soap_free_ns(soap); #ifndef WITH_LEANER if ((soap->mode & SOAP_ENC_DIME) || (soap->omode & SOAP_ENC_DIME)) soap->mode = soap->omode | SOAP_IO_LENGTH | SOAP_ENC_DIME; else #endif { soap->mode = soap->omode; if ((soap->mode & SOAP_IO_UDP)) { soap->mode |= SOAP_ENC_XML; soap->mode &= ~SOAP_IO_CHUNK; } if ((soap->mode & SOAP_IO) == SOAP_IO_STORE || (((soap->mode & SOAP_IO) == SOAP_IO_CHUNK || (soap->mode & SOAP_ENC_XML)) #ifndef WITH_LEANER && !soap->fpreparesend #endif )) soap->mode &= ~SOAP_IO_LENGTH; else soap->mode |= SOAP_IO_LENGTH; } #ifdef WITH_ZLIB if ((soap->mode & SOAP_ENC_ZLIB) && (soap->mode & SOAP_IO) == SOAP_IO_FLUSH) { if (!(soap->mode & SOAP_ENC_DIME)) soap->mode &= ~SOAP_IO_LENGTH; if (soap->mode & SOAP_ENC_XML) soap->mode |= SOAP_IO_BUFFER; else soap->mode |= SOAP_IO_STORE; } #endif #ifndef WITH_LEANER if ((soap->mode & SOAP_ENC_MTOM) && (soap->mode & SOAP_ENC_DIME)) soap->mode |= SOAP_ENC_MIME; else if (!(soap->mode & SOAP_ENC_MIME)) soap->mode &= ~SOAP_ENC_MTOM; if (soap->mode & SOAP_ENC_MIME) soap_select_mime_boundary(soap); soap->dime.list = soap->dime.last; /* keep track of last DIME attachment */ #endif soap->count = 0; soap->ns = 0; soap->null = 0; soap->position = 0; soap->mustUnderstand = 0; soap->encoding = 0; soap->part = SOAP_BEGIN; soap->event = 0; soap->evlev = 0; soap->idnum = 0; soap->body = 1; soap->level = 0; soap_clr_attr(soap); soap_set_local_namespaces(soap); #ifndef WITH_LEANER soap->dime.count = 0; /* count # of attachments */ soap->dime.size = 0; /* accumulate total size of attachments */ if (soap->fprepareinitsend && (soap->mode & SOAP_IO) != SOAP_IO_STORE && (soap->error = soap->fprepareinitsend(soap))) return soap->error; #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Begin count phase (socket=%d mode=0x%x count=%lu)\n", soap->socket, (unsigned int)soap->mode, (unsigned long)soap->count)); return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_end_count(struct soap *soap) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of count phase\n")); #ifndef WITH_LEANER if ((soap->mode & SOAP_IO_LENGTH)) { if (soap->fpreparefinalsend && (soap->error = soap->fpreparefinalsend(soap))) return soap->error; } #else (void)soap; #endif return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_begin_send(struct soap *soap) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Initializing for output to socket=%d/fd=%d\n", soap->socket, soap->sendfd)); soap_free_ns(soap); soap->error = SOAP_OK; soap->mode = soap->omode | (soap->mode & (SOAP_IO_LENGTH | SOAP_ENC_DIME)); #ifndef WITH_LEAN if ((soap->mode & SOAP_IO_UDP)) { soap->mode |= SOAP_ENC_XML; soap->mode &= ~SOAP_IO_CHUNK; if (soap->count > sizeof(soap->buf)) return soap->error = SOAP_UDP_ERROR; } #endif #ifdef WITH_ZLIB if ((soap->mode & SOAP_ENC_ZLIB) && (soap->mode & SOAP_IO) == SOAP_IO_FLUSH) { if (soap->mode & SOAP_ENC_XML) soap->mode |= SOAP_IO_BUFFER; else soap->mode |= SOAP_IO_STORE; } #endif if ((soap->mode & SOAP_IO) == SOAP_IO_FLUSH) { if (soap_valid_socket(soap->socket)) { if (soap->count || (soap->mode & SOAP_IO_LENGTH) || (soap->mode & SOAP_ENC_XML)) soap->mode |= SOAP_IO_BUFFER; else soap->mode |= SOAP_IO_STORE; } #if !defined(__cplusplus) || defined(WITH_COMPAT) else if (soap->os != NULL) { *soap->os = NULL; soap->mode |= SOAP_IO_STORE; } #endif } soap->mode &= ~SOAP_IO_LENGTH; if ((soap->mode & SOAP_IO) == SOAP_IO_STORE) if (soap_new_block(soap) == NULL) return soap->error; if (!(soap->mode & SOAP_IO_KEEPALIVE)) soap->keep_alive = 0; #ifndef WITH_LEANER if ((soap->mode & SOAP_ENC_MTOM) && (soap->mode & SOAP_ENC_DIME)) { soap->mode |= SOAP_ENC_MIME; soap->mode &= ~SOAP_ENC_DIME; } else if (!(soap->mode & SOAP_ENC_MIME)) soap->mode &= ~SOAP_ENC_MTOM; if (soap->mode & SOAP_ENC_MIME) soap_select_mime_boundary(soap); #ifdef WIN32 #ifndef UNDER_CE #ifndef WITH_FASTCGI if (!soap_valid_socket(soap->socket) && !soap->os && soap->sendfd >= 0) /* Set win32 stdout or soap->sendfd to BINARY, e.g. to support DIME */ #ifdef __BORLANDC__ setmode(soap->sendfd, _O_BINARY); #else _setmode(soap->sendfd, _O_BINARY); #endif #endif #endif #endif #endif if (soap->mode & SOAP_IO) { soap->bufidx = 0; soap->buflen = 0; } soap->chunksize = 0; soap->ns = 0; soap->null = 0; soap->position = 0; soap->mustUnderstand = 0; soap->encoding = 0; soap->idnum = 0; soap->body = 1; soap->level = 0; soap_clr_attr(soap); soap_set_local_namespaces(soap); #ifdef WITH_ZLIB soap->z_ratio_out = 1.0; if ((soap->mode & SOAP_ENC_ZLIB) && soap->zlib_state != SOAP_ZLIB_DEFLATE) { if (!soap->d_stream) { soap->d_stream = (z_stream*)SOAP_MALLOC(soap, sizeof(z_stream)); soap->d_stream->zalloc = Z_NULL; soap->d_stream->zfree = Z_NULL; soap->d_stream->opaque = Z_NULL; soap->d_stream->next_in = Z_NULL; } if (!soap->z_buf) soap->z_buf = (char*)SOAP_MALLOC(soap, sizeof(soap->buf)); soap->d_stream->next_out = (Byte*)soap->z_buf; soap->d_stream->avail_out = sizeof(soap->buf); #ifdef WITH_GZIP if (soap->zlib_out != SOAP_ZLIB_DEFLATE) { if (soap_memcpy((void*)soap->z_buf, sizeof(soap->buf), (const void*)"\37\213\10\0\0\0\0\0\0\377", 10)) return soap->error = SOAP_EOM; soap->d_stream->next_out = (Byte*)soap->z_buf + 10; soap->d_stream->avail_out = sizeof(soap->buf) - 10; soap->z_crc = crc32(0L, NULL, 0); soap->zlib_out = SOAP_ZLIB_GZIP; if (soap->z_dict) *((Byte*)soap->z_buf + 2) = 0xff; if (deflateInit2(soap->d_stream, soap->z_level, Z_DEFLATED, -MAX_WBITS, 8, Z_DEFAULT_STRATEGY) != Z_OK) return soap->error = SOAP_ZLIB_ERROR; } else #endif if (deflateInit(soap->d_stream, soap->z_level) != Z_OK) return soap->error = SOAP_ZLIB_ERROR; if (soap->z_dict) { if (deflateSetDictionary(soap->d_stream, (const Bytef*)soap->z_dict, soap->z_dict_len) != Z_OK) return soap->error = SOAP_ZLIB_ERROR; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Deflate initialized\n")); soap->zlib_state = SOAP_ZLIB_DEFLATE; } #endif #ifdef WITH_OPENSSL if (soap->ssl) ERR_clear_error(); #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Begin send phase (socket=%d mode=0x%x count=%lu)\n", soap->socket, soap->mode, (unsigned long)soap->count)); soap->part = SOAP_BEGIN; #ifndef WITH_LEANER if (soap->fprepareinitsend && (soap->mode & SOAP_IO) == SOAP_IO_STORE && (soap->error = soap->fprepareinitsend(soap))) return soap->error; #endif return SOAP_OK; } #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_embedded(struct soap *soap, const void *p, int t) { struct soap_plist *pp; if (soap_pointer_lookup(soap, p, t, &pp)) { pp->mark1 = 1; pp->mark2 = 1; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Embedded %p type=%d mark set to 1\n", p, t)); } } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_reference(struct soap *soap, const void *p, int t) { struct soap_plist *pp; if (!p || (!soap->encodingStyle && !(soap->omode & (SOAP_ENC_DIME|SOAP_ENC_MIME|SOAP_ENC_MTOM|SOAP_XML_GRAPH))) || (soap->omode & SOAP_XML_TREE)) return 1; if (soap_pointer_lookup(soap, p, t, &pp)) { if (pp->mark1 == 0) { pp->mark1 = 2; pp->mark2 = 2; } } else if (!soap_pointer_enter(soap, p, NULL, 0, t, &pp)) return 1; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Reference %p type=%d (%d %d)\n", p, t, (int)pp->mark1, (int)pp->mark2)); return pp->mark1; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_array_reference(struct soap *soap, const void *p, const void *a, int n, int t) { struct soap_plist *pp; if (!p || !a || (!soap->encodingStyle && !(soap->omode & (SOAP_ENC_DIME|SOAP_ENC_MIME|SOAP_ENC_MTOM|SOAP_XML_GRAPH))) || (soap->omode & SOAP_XML_TREE)) return 1; if (soap_array_pointer_lookup(soap, p, a, n, t, &pp)) { if (pp->mark1 == 0) { pp->mark1 = 2; pp->mark2 = 2; } } else if (!soap_pointer_enter(soap, p, a, n, t, &pp)) return 1; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Array reference %p ptr=%p n=%lu type=%d (%d %d)\n", p, a, (unsigned long)n, t, (int)pp->mark1, (int)pp->mark2)); return pp->mark1; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_embedded_id(struct soap *soap, int id, const void *p, int t) { struct soap_plist *pp = NULL; if (id >= 0 || (!soap->encodingStyle && !(soap->omode & SOAP_XML_GRAPH)) || (soap->omode & SOAP_XML_TREE)) return id; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Embedded_id %p type=%d id=%d\n", p, t, id)); if (id < -1) return soap_embed(soap, p, NULL, 0, t); if (id < 0) { id = soap_pointer_lookup(soap, p, t, &pp); if (soap->version == 1 && soap->part != SOAP_IN_HEADER) { if (id) { if (soap->mode & SOAP_IO_LENGTH) pp->mark1 = 2; else pp->mark2 = 2; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Embedded_id multiref id=%d %p type=%d = (%d %d)\n", id, p, t, (int)pp->mark1, (int)pp->mark2)); } return -1; } else if (id) { if (soap->mode & SOAP_IO_LENGTH) pp->mark1 = 1; else pp->mark2 = 1; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Embedded_id embedded ref id=%d %p type=%d = (%d %d)\n", id, p, t, (int)pp->mark1, (int)pp->mark2)); } } return id; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_is_embedded(struct soap *soap, struct soap_plist *pp) { if (!pp) return 0; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Is embedded? %d %d\n", (int)pp->mark1, (int)pp->mark2)); if (soap->version == 1 && soap->encodingStyle && !(soap->mode & SOAP_XML_GRAPH) && soap->part != SOAP_IN_HEADER) { if (soap->mode & SOAP_IO_LENGTH) return pp->mark1 != 0; return pp->mark2 != 0; } if (soap->mode & SOAP_IO_LENGTH) return pp->mark1 == 1; return pp->mark2 == 1; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_is_single(struct soap *soap, struct soap_plist *pp) { if (soap->part == SOAP_IN_HEADER) return 1; if (!pp) return 0; if (soap->mode & SOAP_IO_LENGTH) return pp->mark1 == 0; return pp->mark2 == 0; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_set_embedded(struct soap *soap, struct soap_plist *pp) { if (!pp) return; if (soap->mode & SOAP_IO_LENGTH) pp->mark1 = 1; else pp->mark2 = 1; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_attachment(struct soap *soap, const char *tag, int id, const void *p, const void *a, int n, const char *aid, const char *atype, const char *aoptions, const char *type, int t) { struct soap_plist *pp; int i; if (!p || !a || (!aid && !atype)) return soap_element_id(soap, tag, id, p, a, n, type, t, NULL); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Attachment tag='%s' id='%s' (%d) type='%s'\n", tag, aid ? aid : SOAP_STR_EOS, id, atype ? atype : SOAP_STR_EOS)); i = soap_array_pointer_lookup(soap, p, a, n, t, &pp); if (!i) { i = soap_pointer_enter(soap, p, a, n, t, &pp); if (!i) { soap->error = SOAP_EOM; return -1; } } if (id <= 0) id = i; if (!aid) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), strlen(soap->dime_id_format) + 20), soap->dime_id_format, id); aid = soap_strdup(soap, soap->tmpbuf); } /* Add MTOM xop:Include element when necessary */ /* TODO: this code to be obsoleted with new import/xop.h conventions */ if ((soap->mode & SOAP_ENC_MTOM) && strcmp(tag, "xop:Include")) { if (soap_element_begin_out(soap, tag, 0, type) || soap_element_href(soap, "xop:Include", 0, "xmlns:xop=\"http://www.w3.org/2004/08/xop/include\" href", aid) || soap_element_end_out(soap, tag)) return soap->error; } else if (soap_element_href(soap, tag, 0, "href", aid)) return soap->error; if (soap->mode & SOAP_IO_LENGTH) { if (pp->mark1 != 3) { struct soap_multipart *content; if (soap->mode & SOAP_ENC_MTOM) content = soap_new_multipart(soap, &soap->mime.first, &soap->mime.last, (char*)a, n); else content = soap_new_multipart(soap, &soap->dime.first, &soap->dime.last, (char*)a, n); if (!content) { soap->error = SOAP_EOM; return -1; } if (!strncmp(aid, "cid:", 4)) /* RFC 2111 */ { if (soap->mode & SOAP_ENC_MTOM) { size_t l = strlen(aid) - 1; char *s = (char*)soap_malloc(soap, l); if (s) { s[0] = '<'; soap_strncpy(s + 1, l - 1, aid + 4, l - 3); s[l - 2] = '>'; s[l - 1] = '\0'; content->id = s; } } else content->id = aid + 4; } else content->id = aid; content->type = atype; content->options = aoptions; content->encoding = SOAP_MIME_BINARY; pp->mark1 = 3; } } else pp->mark2 = 3; return -1; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_1 static void soap_init_iht(struct soap *soap) { int i; for (i = 0; i < SOAP_IDHASH; i++) soap->iht[i] = NULL; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_1 static void soap_free_iht(struct soap *soap) { int i; struct soap_ilist *ip = NULL, *p = NULL; struct soap_flist *fp = NULL, *fq = NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free ID hashtable\n")); for (i = 0; i < SOAP_IDHASH; i++) { for (ip = soap->iht[i]; ip; ip = p) { for (fp = ip->flist; fp; fp = fq) { fq = fp->next; SOAP_FREE(soap, fp); } p = ip->next; SOAP_FREE(soap, ip); } soap->iht[i] = NULL; } } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 struct soap_ilist * SOAP_FMAC2 soap_lookup(struct soap *soap, const char *id) { struct soap_ilist *ip = NULL; for (ip = soap->iht[soap_hash(id)]; ip; ip = ip->next) if (!strcmp(ip->id, id)) return ip; return NULL; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 struct soap_ilist * SOAP_FMAC2 soap_enter(struct soap *soap, const char *id, int t, size_t n) { size_t h; struct soap_ilist *ip; size_t l = strlen(id); ip = (struct soap_ilist*)SOAP_MALLOC(soap, sizeof(struct soap_ilist) + l); if (ip) { ip->type = t; ip->size = n; ip->ptr = NULL; ip->spine = NULL; ip->link = NULL; ip->copy = NULL; ip->flist = NULL; ip->smart = NULL; ip->shaky = 0; soap_strcpy((char*)ip->id, l + 1, id); h = soap_hash(id); /* h = (HASH(id) % SOAP_IDHASH) so soap->iht[h] is safe */ ip->next = soap->iht[h]; soap->iht[h] = ip; } return ip; } #endif #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void* SOAP_FMAC2 soap_malloc(struct soap *soap, size_t n) { char *p; if (!soap) return SOAP_MALLOC(soap, n); if (soap->fmalloc) p = (char*)soap->fmalloc(soap, n); else { n += sizeof(short); n += (-(long)n) & (sizeof(void*)-1); /* align at 4-, 8- or 16-byte boundary */ if ((p = (char*)SOAP_MALLOC(soap, n + sizeof(void*) + sizeof(size_t))) == NULL) { soap->error = SOAP_EOM; return NULL; } /* set a canary word to detect memory overruns and data corruption */ *(unsigned short*)(p + n - sizeof(unsigned short)) = (unsigned short)SOAP_CANARY; /* keep chain of alloced cells for destruction */ *(void**)(p + n) = soap->alist; *(size_t*)(p + n + sizeof(void*)) = n; soap->alist = p + n; } return p; } #endif /******************************************************************************/ #ifdef SOAP_MEM_DEBUG static void soap_init_mht(struct soap *soap) { int i; for (i = 0; i < (int)SOAP_PTRHASH; i++) soap->mht[i] = NULL; } #endif /******************************************************************************/ #ifdef SOAP_MEM_DEBUG static void soap_free_mht(struct soap *soap) { int i; struct soap_mlist *mp, *mq; for (i = 0; i < (int)SOAP_PTRHASH; i++) { for (mp = soap->mht[i]; mp; mp = mq) { mq = mp->next; if (mp->live) fprintf(stderr, "%s(%d): malloc() = %p not freed (memory leak or forgot to call soap_end()?)\n", mp->file, mp->line, mp->ptr); free(mp); } soap->mht[i] = NULL; } } #endif /******************************************************************************/ #ifdef SOAP_MEM_DEBUG SOAP_FMAC1 void* SOAP_FMAC2 soap_track_malloc(struct soap *soap, const char *file, int line, size_t size) { void *p = malloc(size); if (soap) { size_t h = soap_hash_ptr(p); struct soap_mlist *mp = (struct soap_mlist*)malloc(sizeof(struct soap_mlist)); if (soap->fdebug[SOAP_INDEX_TEST]) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%s(%d): malloc(%lu) = %p\n", file, line, (unsigned long)size, p)); } mp->next = soap->mht[h]; mp->ptr = p; mp->file = file; mp->line = line; mp->live = 1; soap->mht[h] = mp; } return p; } #endif /******************************************************************************/ #ifdef SOAP_MEM_DEBUG SOAP_FMAC1 void SOAP_FMAC2 soap_track_free(struct soap *soap, const char *file, int line, void *p) { if (!soap) free(p); else { size_t h = soap_hash_ptr(p); struct soap_mlist *mp; for (mp = soap->mht[h]; mp; mp = mp->next) if (mp->ptr == p) break; if (mp) { if (mp->live) { if (soap->fdebug[SOAP_INDEX_TEST]) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%s(%d): free(%p)\n", file, line, p)); } free(p); mp->live = 0; } else fprintf(stderr, "%s(%d): free(%p) double free of pointer malloced at %s(%d)\n", file, line, p, mp->file, mp->line); } else fprintf(stderr, "%s(%d): free(%p) pointer not malloced\n", file, line, p); } } #endif /******************************************************************************/ #ifdef SOAP_MEM_DEBUG static void soap_track_unlink(struct soap *soap, const void *p) { size_t h = soap_hash_ptr(p); struct soap_mlist *mp; for (mp = soap->mht[h]; mp; mp = mp->next) if (mp->ptr == p) break; if (mp) mp->live = 0; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_dealloc(struct soap *soap, void *p) { if (soap_check_state(soap)) return; if (p) { char **q; for (q = (char**)(void*)&soap->alist; *q; q = *(char***)q) { if (*(unsigned short*)(char*)(*q - sizeof(unsigned short)) != (unsigned short)SOAP_CANARY) { #ifdef SOAP_MEM_DEBUG fprintf(stderr, "Data corruption in dynamic allocation (see logs)\n"); #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Data corruption:\n")); DBGHEX(TEST, *q - 200, 200); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n")); soap->error = SOAP_MOE; return; } if (p == (void*)(*q - *(size_t*)(*q + sizeof(void*)))) { *q = **(char***)q; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Freed data at %p\n", p)); SOAP_FREE(soap, p); return; } } soap_delete(soap, p); } else { char *q; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free all soap_malloc() data\n")); while (soap->alist) { q = (char*)soap->alist; if (*(unsigned short*)(char*)(q - sizeof(unsigned short)) != (unsigned short)SOAP_CANARY) { #ifdef SOAP_MEM_DEBUG fprintf(stderr, "Data corruption in dynamic allocation (see logs)\n"); #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Data corruption:\n")); DBGHEX(TEST, q - 200, 200); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n")); soap->error = SOAP_MOE; return; } soap->alist = *(void**)q; q -= *(size_t*)(q + sizeof(void*)); SOAP_FREE(soap, q); } /* assume these were deallocated: */ soap->http_content = NULL; soap->action = NULL; soap->fault = NULL; soap->header = NULL; soap->userid = NULL; soap->passwd = NULL; soap->authrealm = NULL; #ifdef WITH_NTLM soap->ntlm_challenge = NULL; #endif #ifndef WITH_LEANER soap_clr_mime(soap); #endif } } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_delete(struct soap *soap, void *p) { struct soap_clist **cp; if (soap_check_state(soap)) return; cp = &soap->clist; if (p) { while (*cp) { if (p == (*cp)->ptr) { struct soap_clist *q = *cp; *cp = q->next; if (q->fdelete(q)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not dealloc data %p: deletion callback failed for object type %d\n", q->ptr, q->type)); #ifdef SOAP_MEM_DEBUG fprintf(stderr, "new(object type = %d) = %p not freed: deletion callback failed\n", q->type, q->ptr); #endif } SOAP_FREE(soap, q); return; } cp = &(*cp)->next; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not dealloc data %p: address not in list\n", p)); } else { while (*cp) { struct soap_clist *q = *cp; *cp = q->next; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Delete %p type=%d (cp=%p)\n", q->ptr, q->type, q)); if (q->fdelete(q)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not dealloc data %p: deletion callback failed for object type %d\n", q->ptr, q->type)); #ifdef SOAP_MEM_DEBUG fprintf(stderr, "new(object type = %d) = %p not freed: deletion callback failed\n", q->type, q->ptr); #endif } SOAP_FREE(soap, q); } } soap->fault = NULL; /* assume this was deallocated */ soap->header = NULL; /* assume this was deallocated */ } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_delegate_deletion(struct soap *soap, struct soap *soap_to) { struct soap_clist *cp; char **q; #ifdef SOAP_MEM_DEBUG void *p; struct soap_mlist **mp, *mq; size_t h; #endif for (q = (char**)(void*)&soap->alist; *q; q = *(char***)q) { if (*(unsigned short*)(char*)(*q - sizeof(unsigned short)) != (unsigned short)SOAP_CANARY) { #ifdef SOAP_MEM_DEBUG fprintf(stderr, "Data corruption in dynamic allocation (see logs)\n"); #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Data corruption:\n")); DBGHEX(TEST, *q - 200, 200); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n")); soap->error = SOAP_MOE; return; } #ifdef SOAP_MEM_DEBUG p = (void*)(*q - *(size_t*)(*q + sizeof(void*))); h = soap_hash_ptr(p); for (mp = &soap->mht[h]; *mp; mp = &(*mp)->next) { if ((*mp)->ptr == p) { mq = *mp; *mp = mq->next; mq->next = soap_to->mht[h]; soap_to->mht[h] = mq; break; } } #endif } *q = (char*)soap_to->alist; soap_to->alist = soap->alist; soap->alist = NULL; #ifdef SOAP_MEM_DEBUG cp = soap->clist; while (cp) { h = soap_hash_ptr(cp); for (mp = &soap->mht[h]; *mp; mp = &(*mp)->next) { if ((*mp)->ptr == cp) { mq = *mp; *mp = mq->next; mq->next = soap_to->mht[h]; soap_to->mht[h] = mq; break; } } cp = cp->next; } #endif cp = soap_to->clist; if (cp) { while (cp->next) cp = cp->next; cp->next = soap->clist; } else soap_to->clist = soap->clist; soap->clist = NULL; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 struct soap_clist * SOAP_FMAC2 soap_link(struct soap *soap, void *p, int t, int n, int (*fdelete)(struct soap_clist*)) { struct soap_clist *cp = NULL; if (soap && p && n != SOAP_NO_LINK_TO_DELETE) { if (!(cp = (struct soap_clist*)SOAP_MALLOC(soap, sizeof(struct soap_clist)))) soap->error = SOAP_EOM; else { cp->next = soap->clist; cp->type = soap->alloced = t; cp->size = n; cp->ptr = p; cp->fdelete = fdelete; soap->clist = cp; } } return cp; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_unlink(struct soap *soap, const void *p) { char **q; struct soap_clist **cp; if (soap && p) { for (q = (char**)(void*)&soap->alist; *q; q = *(char***)q) { if (p == (void*)(*q - *(size_t*)(*q + sizeof(void*)))) { *q = **(char***)q; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unlinked data %p\n", p)); #ifdef SOAP_MEM_DEBUG soap_track_unlink(soap, p); #endif return SOAP_OK; /* found and removed from dealloc chain */ } } for (cp = &soap->clist; *cp; cp = &(*cp)->next) { if (p == (*cp)->ptr) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unlinked class instance %p\n", p)); q = (char**)*cp; *cp = (*cp)->next; SOAP_FREE(soap, q); return SOAP_OK; /* found and removed from dealloc chain */ } } } return SOAP_ERR; } #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_lookup_type(struct soap *soap, const char *id) { struct soap_ilist *ip; if (id && *id) { ip = soap_lookup(soap, id); if (ip) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Lookup id='%s' type=%d\n", id, ip->type)); return ip->type; } } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "lookup type id='%s' NOT FOUND! Need to get it from xsi:type\n", id)); return 0; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_1 SOAP_FMAC1 short SOAP_FMAC2 soap_begin_shaky(struct soap *soap) { short f = soap->shaky; soap->shaky = 1; return f; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_end_shaky(struct soap *soap, short f) { soap->shaky = f; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF static int soap_is_shaky(struct soap *soap, void *p) { (void)p; if (!soap->blist && !soap->shaky) return 0; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Shaky %p\n", p)); return 1; } #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 void* SOAP_FMAC2 soap_id_lookup(struct soap *soap, const char *id, void **p, int t, size_t n, unsigned int k, int (*fbase)(int, int)) { struct soap_ilist *ip; if (!p || !id || !*id) return p; ip = soap_lookup(soap, id); /* lookup pointer to hash table entry for string id */ if (!ip) { if (!(ip = soap_enter(soap, id, t, n))) /* new hash table entry for string id */ return NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forwarding first href='%s' type=%d location=%p (%u bytes) level=%u\n", id, t, p, (unsigned int)n, k)); *p = NULL; if (k) { int i; if (k > SOAP_MAXPTRS) return NULL; if (!(ip->spine = (void**)soap_malloc(soap, SOAP_MAXPTRS * sizeof(void*)))) return NULL; ip->spine[0] = NULL; for (i = 1; i < SOAP_MAXPTRS; i++) ip->spine[i] = &ip->spine[i - 1]; *p = &ip->spine[k - 1]; } else { ip->link = p; ip->shaky = soap_is_shaky(soap, (void*)p); } } else if ((ip->type != t || ip->size != n) && (!fbase || !fbase(ip->type, t)) && (!fbase || !fbase(t, ip->type) || soap_type_punned(soap, ip))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Lookup type incompatibility: ref='%s' id-type=%d ref-type=%d\n", id, ip->type, t)); soap_id_nullify(soap, id); return NULL; } else if (k == 0 && ip->ptr && !ip->shaky) /* when block lists are in use, ip->ptr will change */ { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolved href='%s' type=%d location=%p (%u bytes) level=%u\n", id, t, ip->ptr, (unsigned int)n, k)); *p = ip->ptr; } else { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forwarded href='%s' type=%d location=%p (%u bytes) level=%u\n", id, t, p, (unsigned int)n, k)); if (fbase && fbase(t, ip->type) && !soap_type_punned(soap, ip)) { ip->type = t; ip->size = n; } *p = NULL; if (k) { if (!ip->spine) { int i; if (k > SOAP_MAXPTRS) return NULL; if (!(ip->spine = (void**)soap_malloc(soap, SOAP_MAXPTRS * sizeof(void*)))) return NULL; ip->spine[0] = NULL; for (i = 1; i < SOAP_MAXPTRS; i++) ip->spine[i] = &ip->spine[i - 1]; } *p = &ip->spine[k - 1]; if (ip->ptr && !ip->shaky) ip->spine[0] = ip->ptr; } else { void *q = ip->link; ip->link = p; ip->shaky = soap_is_shaky(soap, (void*)p); *p = q; } } return p; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 void* SOAP_FMAC2 soap_id_forward(struct soap *soap, const char *href, void *p, size_t i, int t, int tt, size_t n, unsigned int k, void (*finsert)(struct soap*, int, int, void*, size_t, const void*, void**), int (*fbase)(int, int)) { struct soap_ilist *ip; if (!p || !href || !*href) return p; ip = soap_lookup(soap, href); /* lookup pointer to hash table entry for string id */ if (!ip) { if (!(ip = soap_enter(soap, href, t, n))) /* new hash table entry for string id */ return NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "New entry href='%s' type=%d size=%lu level=%d location=%p\n", href, t, (unsigned long)n, k, p)); } else if ((ip->type != t || ip->size != n) && k == 0) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forward type incompatibility id='%s' expect type=%d size=%lu level=%u got type=%d size=%lu\n", href, ip->type, (unsigned long)ip->size, k, t, (unsigned long)n)); soap_id_nullify(soap, href); return NULL; } if (finsert || n < sizeof(void*)) { struct soap_flist *fp = (struct soap_flist*)SOAP_MALLOC(soap, sizeof(struct soap_flist)); if (!fp) { soap->error = SOAP_EOM; return NULL; } if (fbase && fbase(t, ip->type) && !soap_type_punned(soap, ip)) { ip->type = t; ip->size = n; } if ((ip->type != t || ip->size != n) && (!fbase || !fbase(ip->type, t))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forward type incompatibility id='%s' expect type=%d size=%lu level=%u got type=%d size=%lu\n", href, ip->type, (unsigned long)ip->size, k, t, (unsigned long)n)); soap_id_nullify(soap, href); return NULL; } fp->next = ip->flist; fp->type = tt; fp->ptr = p; fp->level = k; fp->index = i; fp->finsert = finsert; ip->flist = fp; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forwarding type=%d (target type=%d) size=%lu location=%p level=%u index=%lu href='%s'\n", t, tt, (unsigned long)n, p, k, (unsigned long)i, href)); } else { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forwarding copying address %p for type=%d href='%s'\n", p, t, href)); *(void**)p = ip->copy; ip->copy = p; } ip->shaky = soap_is_shaky(soap, p); return p; } #endif #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void* SOAP_FMAC2 soap_id_enter(struct soap *soap, const char *id, void *p, int t, size_t n, const char *type, const char *arrayType, void *(*finstantiate)(struct soap*, int, const char*, const char*, size_t*), int (*fbase)(int, int)) { #ifndef WITH_NOIDREF struct soap_ilist *ip; #endif (void)id; (void)fbase; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Enter id='%s' type=%d location=%p size=%lu\n", id, t, p, (unsigned long)n)); soap->alloced = 0; if (!p) { if (finstantiate) p = finstantiate(soap, t, type, arrayType, &n); /* alloced set in soap_link() */ else { p = soap_malloc(soap, n); soap->alloced = t; } } #ifndef WITH_NOIDREF if (!id || !*id) #endif return p; #ifndef WITH_NOIDREF ip = soap_lookup(soap, id); /* lookup pointer to hash table entry for string id */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Lookup entry id='%s' for location=%p\n", id, p)); if (!ip) { if (!(ip = soap_enter(soap, id, t, n))) /* new hash table entry for string id */ return NULL; ip->ptr = p; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "New entry id='%s' type=%d size=%lu location=%p\n", id, t, (unsigned long)n, p)); if (!soap->alloced) ip->shaky = soap_is_shaky(soap, p); } else if (ip->ptr) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Multiply defined id='%s'\n", id)); soap_strcpy(soap->id, sizeof(soap->id), id); soap->error = SOAP_DUPLICATE_ID; return NULL; } else if ((ip->type != t || ip->size != n) && (!fbase || !fbase(t, ip->type) || soap_type_punned(soap, ip))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Enter type incompatibility id='%s' expect type=%d size=%lu got type=%d size=%lu\n", id, ip->type, (unsigned long)ip->size, t, (unsigned long)n)); soap_id_nullify(soap, id); return NULL; } else { ip->type = t; ip->size = n; ip->ptr = p; if (!soap->alloced) ip->shaky = soap_is_shaky(soap, p); if (soap->alloced || !ip->shaky) { void **q; /* ptr will not change later, so resolve links now */ if (ip->spine) ip->spine[0] = p; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Traversing link chain to resolve id='%s' type=%d\n", ip->id, ip->type)); q = (void**)ip->link; while (q) { void *r = *q; *q = p; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "... link %p -> %p\n", q, p)); q = (void**)r; } ip->link = NULL; } } return ip->ptr; #endif } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void** SOAP_FMAC2 soap_id_smart(struct soap *soap, const char *id, int t, size_t n) { (void)soap; (void)id; (void)t; (void)n; #ifndef WITH_NOIDREF if (id && *id) { struct soap_ilist *ip = soap_lookup(soap, id); /* lookup pointer to hash table entry for string id */ if (!ip) { if (!(ip = soap_enter(soap, id, t, n))) /* new hash table entry for string id */ return NULL; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "New smart shared pointer entry id='%s' type=%d size=%lu smart=%p\n", id, t, (unsigned long)n, ip->smart)); return &ip->smart; } #endif return NULL; } #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 static int soap_type_punned(struct soap *soap, const struct soap_ilist *ip) { const struct soap_flist *fp; (void)soap; if (ip->ptr || ip->copy) return 1; for (fp = ip->flist; fp; fp = fp->next) if (fp->level == 0) return 1; return 0; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_id_nullify(struct soap *soap, const char *id) { int i; for (i = 0; i < SOAP_IDHASH; i++) { struct soap_ilist *ip; for (ip = soap->iht[i]; ip; ip = ip->next) { void *p, *q; for (p = ip->link; p; p = q) { q = *(void**)p; *(void**)p = NULL; } ip->link = NULL; } } soap_strcpy(soap->id, sizeof(soap->id), id); return soap->error = SOAP_HREF; } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_end_send(struct soap *soap) { #ifndef WITH_LEANER int err; if (soap->dime.list) { /* SOAP body referenced attachments must appear first */ soap->dime.last->next = soap->dime.first; soap->dime.first = soap->dime.list->next; soap->dime.list->next = NULL; soap->dime.last = soap->dime.list; } if (!(err = soap_putdime(soap))) err = soap_putmime(soap); soap->mime.list = NULL; soap->mime.first = NULL; soap->mime.last = NULL; soap->dime.list = NULL; soap->dime.first = NULL; soap->dime.last = NULL; if (err) return err; #endif return soap_end_send_flush(soap); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_end_send_flush(struct soap *soap) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End send mode=0x%x\n", soap->mode)); if (soap->mode & SOAP_IO) /* need to flush the remaining data in buffer */ { if (soap_flush(soap)) #ifdef WITH_ZLIB { if (soap->mode & SOAP_ENC_ZLIB && soap->zlib_state == SOAP_ZLIB_DEFLATE) { soap->zlib_state = SOAP_ZLIB_NONE; deflateEnd(soap->d_stream); } return soap->error; } #else return soap->error; #endif #ifdef WITH_ZLIB if ((soap->mode & SOAP_ENC_ZLIB) && soap->d_stream) { int r; soap->d_stream->avail_in = 0; do { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Deflating remainder\n")); r = deflate(soap->d_stream, Z_FINISH); if (soap->d_stream->avail_out != sizeof(soap->buf)) { if (soap_flush_raw(soap, soap->z_buf, sizeof(soap->buf) - soap->d_stream->avail_out)) { soap->zlib_state = SOAP_ZLIB_NONE; deflateEnd(soap->d_stream); return soap->error; } soap->d_stream->next_out = (Byte*)soap->z_buf; soap->d_stream->avail_out = sizeof(soap->buf); } } while (r == Z_OK); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Deflated total %lu->%lu bytes\n", soap->d_stream->total_in, soap->d_stream->total_out)); soap->z_ratio_out = (float)soap->d_stream->total_out / (float)soap->d_stream->total_in; soap->mode &= ~SOAP_ENC_ZLIB; soap->zlib_state = SOAP_ZLIB_NONE; if (deflateEnd(soap->d_stream) != Z_OK || r != Z_STREAM_END) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unable to end deflate: %s\n", soap->d_stream->msg ? soap->d_stream->msg : SOAP_STR_EOS)); return soap->error = SOAP_ZLIB_ERROR; } #ifdef WITH_GZIP if (soap->zlib_out != SOAP_ZLIB_DEFLATE) { soap->z_buf[0] = soap->z_crc & 0xFF; soap->z_buf[1] = (soap->z_crc >> 8) & 0xFF; soap->z_buf[2] = (soap->z_crc >> 16) & 0xFF; soap->z_buf[3] = (soap->z_crc >> 24) & 0xFF; soap->z_buf[4] = soap->d_stream->total_in & 0xFF; soap->z_buf[5] = (soap->d_stream->total_in >> 8) & 0xFF; soap->z_buf[6] = (soap->d_stream->total_in >> 16) & 0xFF; soap->z_buf[7] = (soap->d_stream->total_in >> 24) & 0xFF; if (soap_flush_raw(soap, soap->z_buf, 8)) return soap->error; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "gzip crc32=%lu\n", (unsigned long)soap->z_crc)); } #endif } #endif if ((soap->mode & SOAP_IO) == SOAP_IO_STORE) { #if !defined(__cplusplus) || defined(WITH_COMPAT) if (soap->os) { char *b = (char*)soap_push_block(soap, NULL, 1); if (b) *soap->os = soap_save_block(soap, NULL, NULL, 0); } else #endif { char *p; #ifndef WITH_NOHTTP if (!(soap->mode & SOAP_ENC_XML)) { soap->mode--; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Sending buffered message of length %u\n", (unsigned int)soap->blist->size)); if (soap->status >= SOAP_POST) soap->error = soap->fpost(soap, soap->endpoint, soap->host, soap->port, soap->path, soap->action, soap->blist->size); else if (soap->status != SOAP_STOP) soap->error = soap->fresponse(soap, soap->status, soap->blist->size); if (soap->error || soap_flush(soap)) return soap->error; soap->mode++; } #endif for (p = soap_first_block(soap, NULL); p; p = soap_next_block(soap, NULL)) { DBGMSG(SENT, p, soap_block_size(soap, NULL)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Send %u bytes to socket=%d/fd=%d\n", (unsigned int)soap_block_size(soap, NULL), soap->socket, soap->sendfd)); if ((soap->error = soap->fsend(soap, p, soap_block_size(soap, NULL)))) { soap_end_block(soap, NULL); return soap->error; } } soap_end_block(soap, NULL); } #ifndef WITH_LEANER if (soap->fpreparefinalsend && (soap->error = soap->fpreparefinalsend(soap))) return soap->error; #endif } #ifndef WITH_LEANER else if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK) { DBGMSG(SENT, "\r\n0\r\n\r\n", 7); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Send 7 bytes to socket=%d/fd=%d\n", soap->socket, soap->sendfd)); if ((soap->error = soap->fsend(soap, "\r\n0\r\n\r\n", 7))) return soap->error; } #endif } #ifdef WITH_TCPFIN #if defined(WITH_OPENSSL) || defined(WITH_SYSTEMSSL) if (!soap->ssl) #endif if (soap_valid_socket(soap->socket) && !soap->keep_alive && !(soap->omode & SOAP_IO_UDP)) soap->fshutdownsocket(soap, soap->socket, SOAP_SHUT_WR); /* Send TCP FIN */ #endif #if defined(__cplusplus) && !defined(WITH_COMPAT) if (soap->os) soap->os->flush(); #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of send phase\n")); soap->omode &= ~SOAP_SEC_WSUID; soap->count = 0; soap->part = SOAP_END; return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_end_recv(struct soap *soap) { soap->part = SOAP_END; #ifndef WITH_LEAN soap->wsuid = NULL; /* reset before next send */ soap->c14nexclude = NULL; /* reset before next send */ soap->c14ninclude = NULL; /* reset before next send */ #endif #ifndef WITH_LEANER soap->ffilterrecv = NULL; if ((soap->mode & SOAP_ENC_DIME) && soap_getdime(soap)) { soap->dime.first = NULL; soap->dime.last = NULL; return soap->error; } soap->dime.list = soap->dime.first; soap->dime.first = NULL; soap->dime.last = NULL; /* Check if MIME attachments and mime-post-check flag is set, if so call soap_resolve() and return */ if (soap->mode & SOAP_ENC_MIME) { if (soap->mode & SOAP_MIME_POSTCHECK) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Post checking MIME attachments\n")); if (!soap->keep_alive) soap->keep_alive = -1; #ifndef WITH_NOIDREF soap_resolve(soap); #endif return SOAP_OK; } if (soap_getmime(soap)) return soap->error; } soap->mime.list = soap->mime.first; soap->mime.first = NULL; soap->mime.last = NULL; soap->mime.boundary = NULL; if (soap->xlist) { struct soap_multipart *content; for (content = soap->mime.list; content; content = content->next) soap_resolve_attachment(soap, content); } #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of receive message ok\n")); #ifdef WITH_ZLIB if ((soap->mode & SOAP_ENC_ZLIB) && soap->d_stream) { /* Make sure end of compressed content is reached */ while (soap->d_stream->next_out != Z_NULL) if ((int)soap_get1(soap) == EOF) break; soap->mode &= ~SOAP_ENC_ZLIB; soap_memcpy((void*)soap->buf, sizeof(soap->buf), (const void*)soap->z_buf, sizeof(soap->buf)); soap->bufidx = (char*)soap->d_stream->next_in - soap->z_buf; soap->buflen = soap->z_buflen; soap->zlib_state = SOAP_ZLIB_NONE; if (inflateEnd(soap->d_stream) != Z_OK) return soap->error = SOAP_ZLIB_ERROR; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflate end ok\n")); #ifdef WITH_GZIP if (soap->zlib_in == SOAP_ZLIB_GZIP) { soap_wchar c; short i; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflate gzip crc check\n")); for (i = 0; i < 8; i++) { if ((int)(c = soap_get1(soap)) == EOF) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Gzip error: unable to read crc value\n")); return soap->error = SOAP_ZLIB_ERROR; } soap->z_buf[i] = (char)c; } if (soap->z_crc != ((uLong)(unsigned char)soap->z_buf[0] | ((uLong)(unsigned char)soap->z_buf[1] << 8) | ((uLong)(unsigned char)soap->z_buf[2] << 16) | ((uLong)(unsigned char)soap->z_buf[3] << 24))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Gzip inflate error: crc check failed, message corrupted? (crc32=%lu)\n", (unsigned long)soap->z_crc)); return soap->error = SOAP_ZLIB_ERROR; } if (soap->d_stream->total_out != ((uLong)(unsigned char)soap->z_buf[4] | ((uLong)(unsigned char)soap->z_buf[5] << 8) | ((uLong)(unsigned char)soap->z_buf[6] << 16) | ((uLong)(unsigned char)soap->z_buf[7] << 24))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Gzip inflate error: incorrect message length\n")); return soap->error = SOAP_ZLIB_ERROR; } } soap->zlib_in = SOAP_ZLIB_NONE; #endif } #endif if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK) while (soap->ahead != EOF && !soap_recv_raw(soap)) continue; #ifndef WITH_NOIDREF if (soap_resolve(soap)) return soap->error; #endif #ifndef WITH_LEANER if (soap->xlist) { if (soap->mode & SOAP_ENC_MTOM) return soap->error = SOAP_MIME_HREF; return soap->error = SOAP_DIME_HREF; } #endif soap_free_ns(soap); #ifndef WITH_LEANER if (soap->fpreparefinalrecv) return soap->error = soap->fpreparefinalrecv(soap); #endif return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_free_temp(struct soap *soap) { struct soap_attribute *tp, *tq; struct Namespace *ns; soap_free_ns(soap); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free any remaining temp blocks\n")); while (soap->blist) soap_end_block(soap, NULL); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free attribute storage\n")); for (tp = soap->attributes; tp; tp = tq) { tq = tp->next; if (tp->value) SOAP_FREE(soap, tp->value); SOAP_FREE(soap, tp); } soap->attributes = NULL; #ifdef WITH_FAST if (soap->labbuf) SOAP_FREE(soap, soap->labbuf); soap->labbuf = NULL; soap->lablen = 0; soap->labidx = 0; #endif ns = soap->local_namespaces; if (ns) { for (; ns->id; ns++) { if (ns->out) { SOAP_FREE(soap, ns->out); ns->out = NULL; } } SOAP_FREE(soap, soap->local_namespaces); soap->local_namespaces = NULL; } #ifndef WITH_LEANER while (soap->xlist) { struct soap_xlist *xp = soap->xlist->next; SOAP_FREE(soap, soap->xlist); soap->xlist = xp; } #endif #ifndef WITH_NOIDREF soap_free_iht(soap); #endif soap_free_pht(soap); } #endif /******************************************************************************/ #ifndef PALM_1 static void soap_free_ns(struct soap *soap) { struct soap_nlist *np, *nq; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free namespace stack\n")); for (np = soap->nlist; np; np = nq) { nq = np->next; SOAP_FREE(soap, np); } soap->nlist = NULL; } #endif /******************************************************************************/ #ifndef PALM_1 #if !defined(WITH_LEAN) || defined(SOAP_DEBUG) static void soap_init_logs(struct soap *soap) { int i; for (i = 0; i < SOAP_MAXLOGS; i++) { soap->logfile[i] = NULL; soap->fdebug[i] = NULL; } } #endif #endif /******************************************************************************/ #if !defined(WITH_LEAN) || defined(SOAP_DEBUG) SOAP_FMAC1 void SOAP_FMAC2 soap_open_logfile(struct soap *soap, int i) { if (soap->logfile[i]) soap->fdebug[i] = fopen(soap->logfile[i], i < 2 ? "ab" : "a"); } #endif /******************************************************************************/ #ifdef SOAP_DEBUG static void soap_close_logfile(struct soap *soap, int i) { if (soap->fdebug[i]) { fclose(soap->fdebug[i]); soap->fdebug[i] = NULL; } } #endif /******************************************************************************/ #ifdef SOAP_DEBUG SOAP_FMAC1 void SOAP_FMAC2 soap_close_logfiles(struct soap *soap) { int i; for (i = 0; i < SOAP_MAXLOGS; i++) soap_close_logfile(soap, i); } #endif /******************************************************************************/ #ifdef SOAP_DEBUG static void soap_set_logfile(struct soap *soap, int i, const char *logfile) { const char *s; char *t = NULL; soap_close_logfile(soap, i); s = soap->logfile[i]; soap->logfile[i] = logfile; if (s) SOAP_FREE(soap, s); if (logfile) { size_t l = strlen(logfile) + 1; if ((t = (char*)SOAP_MALLOC(soap, l))) soap_memcpy((void*)t, l, (const void*)logfile, l); } soap->logfile[i] = t; } #endif /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_set_recv_logfile(struct soap *soap, const char *logfile) { (void)soap; (void)logfile; #ifdef SOAP_DEBUG soap_set_logfile(soap, SOAP_INDEX_RECV, logfile); #endif } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_set_sent_logfile(struct soap *soap, const char *logfile) { (void)soap; (void)logfile; #ifdef SOAP_DEBUG soap_set_logfile(soap, SOAP_INDEX_SENT, logfile); #endif } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_set_test_logfile(struct soap *soap, const char *logfile) { (void)soap; (void)logfile; #ifdef SOAP_DEBUG soap_set_logfile(soap, SOAP_INDEX_TEST, logfile); #endif } /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 struct soap* SOAP_FMAC2 soap_copy(const struct soap *soap) { struct soap *copy = soap_versioning(soap_new)(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT); if (soap_copy_context(copy, soap) != NULL) return copy; soap_free(copy); return NULL; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 struct soap* SOAP_FMAC2 soap_copy_context(struct soap *copy, const struct soap *soap) { if (copy == soap) return copy; if (soap_check_state(soap)) return NULL; if (copy) { struct soap_plugin *p = NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copying context\n")); soap_memcpy((void*)copy, sizeof(struct soap), (const void*)soap, sizeof(struct soap)); copy->state = SOAP_COPY; copy->error = SOAP_OK; copy->userid = NULL; copy->passwd = NULL; #ifdef WITH_NTLM copy->ntlm_challenge = NULL; #endif copy->nlist = NULL; copy->blist = NULL; copy->clist = NULL; copy->alist = NULL; copy->attributes = NULL; copy->labbuf = NULL; copy->lablen = 0; copy->labidx = 0; #ifdef SOAP_MEM_DEBUG soap_init_mht(copy); #endif #if !defined(WITH_LEAN) || defined(SOAP_DEBUG) soap_init_logs(copy); #endif #ifdef SOAP_DEBUG soap_set_test_logfile(copy, soap->logfile[SOAP_INDEX_TEST]); soap_set_sent_logfile(copy, soap->logfile[SOAP_INDEX_SENT]); soap_set_recv_logfile(copy, soap->logfile[SOAP_INDEX_RECV]); #endif copy->namespaces = soap->local_namespaces; copy->local_namespaces = NULL; soap_set_local_namespaces(copy); /* copy content of soap->local_namespaces */ copy->namespaces = soap->namespaces; /* point to shared read-only namespaces table */ copy->c_locale = NULL; #ifdef WITH_OPENSSL copy->bio = NULL; copy->ssl = NULL; copy->session = NULL; #endif #ifdef WITH_GNUTLS copy->session = NULL; #endif #ifdef WITH_ZLIB copy->d_stream = NULL; copy->z_buf = NULL; #endif #ifndef WITH_NOIDREF soap_init_iht(copy); #endif soap_init_pht(copy); copy->header = NULL; copy->fault = NULL; copy->action = NULL; #ifndef WITH_LEAN #ifdef WITH_COOKIES copy->cookies = soap_copy_cookies(copy, soap); #else copy->cookies = NULL; #endif #endif copy->plugins = NULL; for (p = soap->plugins; p; p = p->next) { struct soap_plugin *q = (struct soap_plugin*)SOAP_MALLOC(copy, sizeof(struct soap_plugin)); if (!q) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not allocate plugin '%s'\n", p->id)); soap_end(copy); soap_done(copy); return NULL; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copying plugin '%s'\n", p->id)); *q = *p; if (p->fcopy && (copy->error = p->fcopy(copy, q, p))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not copy plugin '%s' error = %d\n", p->id, copy->error)); SOAP_FREE(copy, q); soap_end(copy); soap_done(copy); return NULL; } q->next = copy->plugins; copy->plugins = q; } } return copy; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_copy_stream(struct soap *copy, struct soap *soap) { struct soap_attribute *tp = NULL, *tq; if (copy == soap) return; copy->header = soap->header; copy->mode = soap->mode; copy->imode = soap->imode; copy->omode = soap->omode; copy->master = soap->master; copy->socket = soap->socket; copy->sendsk = soap->sendsk; copy->recvsk = soap->recvsk; copy->recv_timeout = soap->recv_timeout; copy->send_timeout = soap->send_timeout; copy->os = soap->os; copy->is = soap->is; copy->sendfd = soap->sendfd; copy->recvfd = soap->recvfd; copy->bufidx = soap->bufidx; copy->buflen = soap->buflen; copy->ahead = soap->ahead; copy->cdata = soap->cdata; copy->chunksize = soap->chunksize; copy->chunkbuflen = soap->chunkbuflen; copy->keep_alive = soap->keep_alive; copy->tcp_keep_alive = soap->tcp_keep_alive; copy->tcp_keep_idle = soap->tcp_keep_idle; copy->tcp_keep_intvl = soap->tcp_keep_intvl; copy->tcp_keep_cnt = soap->tcp_keep_cnt; copy->max_keep_alive = soap->max_keep_alive; #ifndef WITH_NOIO copy->peer = soap->peer; copy->peerlen = soap->peerlen; copy->ip = soap->ip; copy->port = soap->port; soap_memcpy((void*)copy->host, sizeof(copy->host), (const void*)soap->host, sizeof(soap->host)); soap_memcpy((void*)copy->endpoint, sizeof(copy->endpoint), (const void*)soap->endpoint, sizeof(soap->endpoint)); #endif #ifdef WITH_OPENSSL copy->bio = soap->bio; copy->ctx = soap->ctx; copy->ssl = soap->ssl; #endif #ifdef WITH_GNUTLS copy->session = soap->session; #endif #ifdef WITH_SYSTEMSSL copy->ctx = soap->ctx; copy->ssl = soap->ssl; #endif #ifdef WITH_ZLIB copy->zlib_state = soap->zlib_state; copy->zlib_in = soap->zlib_in; copy->zlib_out = soap->zlib_out; if (soap->d_stream && soap->zlib_state != SOAP_ZLIB_NONE) { if (!copy->d_stream) copy->d_stream = (z_stream*)SOAP_MALLOC(copy, sizeof(z_stream)); if (copy->d_stream) soap_memcpy((void*)copy->d_stream, sizeof(z_stream), (const void*)soap->d_stream, sizeof(z_stream)); } copy->z_crc = soap->z_crc; copy->z_ratio_in = soap->z_ratio_in; copy->z_ratio_out = soap->z_ratio_out; copy->z_buf = NULL; copy->z_buflen = soap->z_buflen; copy->z_level = soap->z_level; if (soap->z_buf && soap->zlib_state != SOAP_ZLIB_NONE) { copy->z_buf = (char*)SOAP_MALLOC(copy, sizeof(soap->buf)); if (copy->z_buf) soap_memcpy((void*)copy->z_buf, sizeof(soap->buf), (const void*)soap->z_buf, sizeof(soap->buf)); } copy->z_dict = soap->z_dict; copy->z_dict_len = soap->z_dict_len; #endif soap_memcpy((void*)copy->buf, sizeof(copy->buf), (const void*)soap->buf, sizeof(soap->buf)); /* copy XML parser state */ soap_free_ns(copy); soap_set_local_namespaces(copy); copy->version = soap->version; if (soap->nlist && soap->local_namespaces) { struct soap_nlist *np = NULL, *nq; /* copy reversed nlist */ for (nq = soap->nlist; nq; nq = nq->next) { struct soap_nlist *nr = np; size_t n = sizeof(struct soap_nlist) + strlen(nq->id); np = (struct soap_nlist*)SOAP_MALLOC(copy, n); if (!np) break; soap_memcpy((void*)np, n, (const void*)nq, n); np->next = nr; } while (np) { const char *s = np->ns; copy->level = np->level; /* preserve element nesting level */ if (!s && np->index >= 0) { s = soap->local_namespaces[np->index].out; if (!s) s = soap->local_namespaces[np->index].ns; } if (s && soap_push_namespace(copy, np->id, s) == NULL) break; nq = np; np = np->next; SOAP_FREE(copy, nq); } } soap_memcpy((void*)copy->tag, sizeof(copy->tag), (const void*)soap->tag, sizeof(soap->tag)); soap_memcpy((void*)copy->id, sizeof(copy->id), (const void*)soap->id, sizeof(soap->id)); soap_memcpy((void*)copy->href, sizeof(copy->href), (const void*)soap->href, sizeof(soap->href)); soap_memcpy((void*)copy->type, sizeof(copy->type), (const void*)soap->type, sizeof(soap->type)); copy->other = soap->other; copy->root = soap->root; copy->null = soap->null; copy->body = soap->body; copy->part = soap->part; copy->mustUnderstand = soap->mustUnderstand; copy->level = soap->level; copy->peeked = soap->peeked; /* copy attributes */ for (tq = soap->attributes; tq; tq = tq->next) { struct soap_attribute *tr = tp; size_t n = sizeof(struct soap_attribute) + strlen(tq->name); tp = (struct soap_attribute*)SOAP_MALLOC(copy, n); soap_memcpy((void*)tp, n, (const void*)tq, n); if (tp->size) { tp->value = (char*)SOAP_MALLOC(copy, tp->size); if (tp->value) soap_memcpy((void*)tp->value, tp->size, (const void*)tq->value, tp->size); } tp->ns = NULL; tp->next = tr; } copy->attributes = tp; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_free_stream(struct soap *soap) { soap->socket = SOAP_INVALID_SOCKET; soap->sendsk = SOAP_INVALID_SOCKET; soap->recvsk = SOAP_INVALID_SOCKET; #ifdef WITH_OPENSSL soap->bio = NULL; soap->ctx = NULL; soap->ssl = NULL; #endif #ifdef WITH_GNUTLS soap->xcred = NULL; soap->acred = NULL; soap->cache = NULL; soap->session = NULL; soap->dh_params = NULL; soap->rsa_params = NULL; #endif #ifdef WITH_SYSTEMSSL soap->ctx = (gsk_handle)NULL; soap->ssl = (gsk_handle)NULL; #endif #ifdef WITH_ZLIB if (soap->z_buf) SOAP_FREE(soap, soap->z_buf); soap->z_buf = NULL; #endif } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_initialize(struct soap *soap) { soap_versioning(soap_init)(soap, SOAP_IO_DEFAULT, SOAP_IO_DEFAULT); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_versioning(soap_init)(struct soap *soap, soap_mode imode, soap_mode omode) { size_t i; soap->state = SOAP_INIT; #ifdef SOAP_MEM_DEBUG soap_init_mht(soap); #endif #if !defined(WITH_LEAN) || defined(SOAP_DEBUG) soap_init_logs(soap); #endif #ifdef SOAP_DEBUG #ifdef TANDEM_NONSTOP soap_set_test_logfile(soap, "TESTLOG"); soap_set_sent_logfile(soap, "SENTLOG"); soap_set_recv_logfile(soap, "RECVLOG"); #else soap_set_test_logfile(soap, "TEST.log"); soap_set_sent_logfile(soap, "SENT.log"); soap_set_recv_logfile(soap, "RECV.log"); #endif #endif soap->version = 0; soap_mode(soap, imode); soap_imode(soap, imode); soap_omode(soap, omode); soap->plugins = NULL; soap->user = NULL; for (i = 0; i < sizeof(soap->data)/sizeof(*soap->data); i++) soap->data[i] = NULL; soap->userid = NULL; soap->passwd = NULL; soap->authrealm = NULL; #ifdef WITH_NTLM soap->ntlm_challenge = NULL; #endif #ifndef WITH_NOHTTP soap->fpost = http_post; soap->fget = http_get; soap->fput = http_405; soap->fdel = http_405; soap->fopt = http_200; soap->fhead = http_200; soap->fform = NULL; soap->fposthdr = http_post_header; soap->fresponse = http_response; soap->fparse = http_parse; soap->fparsehdr = http_parse_header; #endif soap->fheader = NULL; soap->fconnect = NULL; soap->fdisconnect = NULL; #ifndef WITH_NOIO soap->ipv6_multicast_if = 0; /* in_addr_t value */ soap->ipv4_multicast_if = NULL; /* points to struct in_addr or in_addr_t */ soap->ipv4_multicast_ttl = 0; /* 0: use default */ #ifndef WITH_IPV6 soap->fresolve = tcp_gethost; #else soap->fresolve = NULL; #endif soap->faccept = tcp_accept; soap->fopen = tcp_connect; soap->fclose = tcp_disconnect; soap->fclosesocket = tcp_closesocket; soap->fshutdownsocket = tcp_shutdownsocket; soap->fsend = fsend; soap->frecv = frecv; soap->fpoll = soap_poll; #else soap->fopen = NULL; soap->fclose = NULL; soap->fpoll = NULL; #endif soap->fseterror = NULL; soap->fignore = NULL; soap->fserveloop = NULL; soap->fplugin = fplugin; soap->fmalloc = NULL; #ifndef WITH_LEANER soap->fsvalidate = NULL; soap->fwvalidate = NULL; soap->feltbegin = NULL; soap->feltendin = NULL; soap->feltbegout = NULL; soap->feltendout = NULL; soap->fprepareinitsend = NULL; soap->fprepareinitrecv = NULL; soap->fpreparesend = NULL; soap->fpreparerecv = NULL; soap->fpreparefinalsend = NULL; soap->fpreparefinalrecv = NULL; soap->ffiltersend = NULL; soap->ffilterrecv = NULL; soap->fdimereadopen = NULL; soap->fdimewriteopen = NULL; soap->fdimereadclose = NULL; soap->fdimewriteclose = NULL; soap->fdimeread = NULL; soap->fdimewrite = NULL; soap->fmimereadopen = NULL; soap->fmimewriteopen = NULL; soap->fmimereadclose = NULL; soap->fmimewriteclose = NULL; soap->fmimeread = NULL; soap->fmimewrite = NULL; #endif soap->float_format = "%.9G"; /* Alternative: use "%G" */ soap->double_format = "%.17lG"; /* Alternative: use "%lG" */ soap->long_double_format = NULL; /* Defined in custom serializer custom/long_double.c */ soap->dime_id_format = "cid:id%d"; /* default DIME id format for int id index */ soap->http_version = "1.1"; soap->proxy_http_version = "1.0"; soap->http_content = NULL; soap->actor = NULL; soap->lang = "en"; soap->keep_alive = 0; soap->tcp_keep_alive = 0; soap->tcp_keep_idle = 0; soap->tcp_keep_intvl = 0; soap->tcp_keep_cnt = 0; soap->max_keep_alive = SOAP_MAXKEEPALIVE; soap->recv_timeout = 0; soap->send_timeout = 0; soap->connect_timeout = 0; soap->accept_timeout = 0; soap->socket_flags = 0; soap->connect_flags = 0; soap->bind_flags = 0; soap->accept_flags = 0; soap->linger_time = 0; soap->ip = 0; soap->labbuf = NULL; soap->lablen = 0; soap->labidx = 0; soap->encodingStyle = NULL; #ifndef WITH_NONAMESPACES soap->namespaces = namespaces; #else soap->namespaces = NULL; #endif soap->local_namespaces = NULL; soap->nlist = NULL; soap->blist = NULL; soap->clist = NULL; soap->alist = NULL; soap->shaky = 0; soap->attributes = NULL; soap->header = NULL; soap->fault = NULL; soap->master = SOAP_INVALID_SOCKET; soap->socket = SOAP_INVALID_SOCKET; soap->sendsk = SOAP_INVALID_SOCKET; soap->recvsk = SOAP_INVALID_SOCKET; soap->os = NULL; soap->is = NULL; #ifndef WITH_LEANER soap->dom = NULL; soap->dime.list = NULL; soap->dime.first = NULL; soap->dime.last = NULL; soap->mime.list = NULL; soap->mime.first = NULL; soap->mime.last = NULL; soap->mime.boundary = NULL; soap->mime.start = NULL; soap->xlist = NULL; #endif #ifndef UNDER_CE soap->recvfd = 0; soap->sendfd = 1; #else soap->recvfd = stdin; soap->sendfd = stdout; #endif soap->host[0] = '\0'; soap->path[0] = '\0'; soap->port = 0; soap->action = NULL; soap->proxy_host = NULL; soap->proxy_port = 8080; soap->proxy_userid = NULL; soap->proxy_passwd = NULL; soap->prolog = "\n"; #ifdef WITH_ZLIB soap->zlib_state = SOAP_ZLIB_NONE; soap->zlib_in = SOAP_ZLIB_NONE; soap->zlib_out = SOAP_ZLIB_NONE; soap->d_stream = NULL; soap->z_buf = NULL; soap->z_level = 6; soap->z_dict = NULL; soap->z_dict_len = 0; #endif #ifndef WITH_LEAN soap->wsuid = NULL; soap->c14nexclude = NULL; soap->c14ninclude = NULL; soap->cookies = NULL; soap->cookie_domain = NULL; soap->cookie_path = NULL; soap->cookie_max = 32; #endif #ifdef WMW_RPM_IO soap->rpmreqid = NULL; #endif #ifdef PALM palmNetLibOpen(); #endif #ifndef WITH_NOIDREF soap_init_iht(soap); #endif soap_init_pht(soap); #ifdef WITH_OPENSSL if (!soap_ssl_init_done) soap_ssl_init(); soap->fsslauth = ssl_auth_init; soap->fsslverify = NULL; soap->bio = NULL; soap->ssl = NULL; soap->ctx = NULL; soap->session = NULL; soap->ssl_flags = SOAP_SSL_DEFAULT; soap->keyfile = NULL; soap->keyid = NULL; soap->password = NULL; soap->cafile = NULL; soap->capath = NULL; soap->crlfile = NULL; soap->dhfile = NULL; soap->randfile = NULL; #endif #ifdef WITH_GNUTLS if (!soap_ssl_init_done) soap_ssl_init(); soap->fsslauth = ssl_auth_init; soap->fsslverify = NULL; soap->xcred = NULL; soap->acred = NULL; soap->cache = NULL; soap->session = NULL; soap->ssl_flags = SOAP_SSL_DEFAULT; soap->keyfile = NULL; soap->keyid = NULL; soap->password = NULL; soap->cafile = NULL; soap->capath = NULL; soap->crlfile = NULL; soap->dh_params = NULL; soap->rsa_params = NULL; #endif #ifdef WITH_SYSTEMSSL soap->fsslauth = ssl_auth_init; soap->fsslverify = NULL; soap->bio = NULL; soap->ssl = (gsk_handle)NULL; soap->ctx = (gsk_handle)NULL; soap->session = NULL; soap->ssl_flags = SOAP_SSL_DEFAULT; soap->keyfile = NULL; soap->keyid = NULL; soap->password = NULL; soap->cafile = NULL; soap->capath = NULL; soap->crlfile = NULL; soap->dhfile = NULL; soap->randfile = NULL; #endif soap->c_locale = NULL; soap->buflen = 0; soap->bufidx = 0; #ifndef WITH_LEANER soap->dime.chunksize = 0; soap->dime.buflen = 0; #endif soap->null = 0; soap->position = 0; soap->encoding = 0; soap->mustUnderstand = 0; soap->ns = 0; soap->part = SOAP_END; soap->event = 0; soap->evlev = 0; soap->alloced = 0; soap->count = 0; soap->length = 0; soap->cdata = 0; soap->peeked = 0; soap->ahead = 0; soap->idnum = 0; soap->level = 0; soap->endpoint[0] = '\0'; soap->error = SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_begin(struct soap *soap) { if (soap_check_state(soap)) return; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Reinitializing context\n")); if (!soap->keep_alive) { soap->buflen = 0; soap->bufidx = 0; } soap->null = 0; soap->position = 0; soap->encoding = 0; soap->mustUnderstand = 0; soap->mode = 0; soap->ns = 0; soap->part = SOAP_END; soap->event = 0; soap->evlev = 0; soap->count = 0; soap->length = 0; soap->cdata = 0; soap->error = SOAP_OK; soap->peeked = 0; soap->ahead = 0; soap->idnum = 0; soap->level = 0; soap->endpoint[0] = '\0'; soap->encodingStyle = SOAP_STR_EOS; #ifndef WITH_LEANER soap->dime.chunksize = 0; soap->dime.buflen = 0; #endif soap_free_temp(soap); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_end(struct soap *soap) { if (soap_check_state(soap)) return; soap_free_temp(soap); soap_dealloc(soap, NULL); while (soap->clist) { struct soap_clist *cp = soap->clist->next; SOAP_FREE(soap, soap->clist); soap->clist = cp; } soap_closesock(soap); #ifdef SOAP_DEBUG soap_close_logfiles(soap); #endif #ifdef PALM palmNetLibClose(); #endif } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_set_version(struct soap *soap, short version) { soap_set_local_namespaces(soap); if (soap->version != version && soap->local_namespaces && soap->local_namespaces[0].id && soap->local_namespaces[1].id) { if (version == 1) { soap->local_namespaces[0].ns = soap_env1; soap->local_namespaces[1].ns = soap_enc1; } else if (version == 2) { soap->local_namespaces[0].ns = soap_env2; soap->local_namespaces[1].ns = soap_enc2; } soap->version = version; } if (version == 0) soap->encodingStyle = SOAP_STR_EOS; else soap->encodingStyle = NULL; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_get_version(struct soap *soap) { struct Namespace *p = soap->local_namespaces; if (p) { const char *ns = p[0].out; if (!ns) ns = p[0].ns; if (!strcmp(ns, soap_env1)) { soap->version = 1; /* make sure we use SOAP 1.1 */ if (p[1].out) SOAP_FREE(soap, p[1].out); if ((p[1].out = (char*)SOAP_MALLOC(soap, sizeof(soap_enc1)))) soap_strncpy(p[1].out, sizeof(soap_enc1), soap_enc1, sizeof(soap_enc1) - 1); } else if (!strcmp(ns, soap_env2)) { soap->version = 2; /* make sure we use SOAP 1.2 */ if (p[1].out) SOAP_FREE(soap, p[1].out); if ((p[1].out = (char*)SOAP_MALLOC(soap, sizeof(soap_enc2)))) soap_strncpy(p[1].out, sizeof(soap_enc2), soap_enc2, sizeof(soap_enc2) - 1); } } } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_set_namespaces(struct soap *soap, const struct Namespace *p) { struct Namespace *ns = soap->local_namespaces; struct soap_nlist *np, *nq, *nr; unsigned int level = soap->level; soap->namespaces = p; soap->local_namespaces = NULL; soap_set_local_namespaces(soap); /* reverse the namespace list */ np = soap->nlist; soap->nlist = NULL; if (np) { nq = np->next; np->next = NULL; while (nq) { nr = nq->next; nq->next = np; np = nq; nq = nr; } } /* then push on new stack */ while (np) { const char *s; soap->level = np->level; /* preserve element nesting level */ s = np->ns; if (!s && np->index >= 0 && ns) { s = ns[np->index].out; if (!s) s = ns[np->index].ns; } if (s && soap_push_namespace(soap, np->id, s) == NULL) return soap->error; nq = np; np = np->next; SOAP_FREE(soap, nq); } if (ns) { int i; for (i = 0; ns[i].id; i++) { if (ns[i].out) { SOAP_FREE(soap, ns[i].out); ns[i].out = NULL; } } SOAP_FREE(soap, ns); } soap->level = level; /* restore level */ return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_set_local_namespaces(struct soap *soap) { if (soap->namespaces && !soap->local_namespaces) { const struct Namespace *ns1; struct Namespace *ns2; size_t n = 1; for (ns1 = soap->namespaces; ns1->id; ns1++) n++; n *= sizeof(struct Namespace); ns2 = (struct Namespace*)SOAP_MALLOC(soap, n); if (ns2) { soap_memcpy((void*)ns2, n, (const void*)soap->namespaces, n); if (ns2[0].ns) { if (!strcmp(ns2[0].ns, soap_env1)) soap->version = 1; else if (!strcmp(ns2[0].ns, soap_env2)) soap->version = 2; } soap->local_namespaces = ns2; for (; ns2->id; ns2++) ns2->out = NULL; } } } #endif /******************************************************************************/ #ifndef WITH_LEAN #ifndef PALM_1 SOAP_FMAC1 const char * SOAP_FMAC2 soap_tagsearch(const char *big, const char *little) { if (big && little) { size_t n = strlen(little); const char *s = big; while (s) { const char *t = s; size_t i; for (i = 0; i < n; i++, t++) { if (*t != little[i]) break; } if (*t == '\0' || *t == ' ') { if (i == n || (i && little[i-1] == ':')) return s; } s = strchr(t, ' '); if (s) s++; } } return NULL; } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 struct soap_nlist * SOAP_FMAC2 soap_lookup_ns(struct soap *soap, const char *tag, size_t n) { struct soap_nlist *np; for (np = soap->nlist; np; np = np->next) if (!strncmp(np->id, tag, n) && !np->id[n]) return np; return NULL; } #endif /******************************************************************************/ #ifndef WITH_LEAN static struct soap_nlist * soap_push_ns(struct soap *soap, const char *id, const char *ns, short utilized) { struct soap_nlist *np; size_t n, k; if (soap_tagsearch(soap->c14nexclude, id)) return NULL; if (!utilized) { for (np = soap->nlist; np; np = np->next) { if (!strcmp(np->id, id) && (!np->ns || !strcmp(np->ns, ns))) break; } if (np) { if ((np->level < soap->level || !np->ns) && np->index == 1) utilized = 1; else return NULL; } } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Adding namespace binding (level=%u) '%s' '%s' utilized=%d\n", soap->level, id, ns ? ns : "(null)", utilized)); n = strlen(id); if (ns) k = strlen(ns); else k = 0; np = (struct soap_nlist*)SOAP_MALLOC(soap, sizeof(struct soap_nlist) + n + k + 1); if (!np) { soap->error = SOAP_EOM; return NULL; } np->next = soap->nlist; soap->nlist = np; soap_strcpy((char*)np->id, n + 1, id); if (ns) { np->ns = np->id + n + 1; soap_strcpy((char*)np->ns, k + 1, ns); } else np->ns = NULL; np->level = soap->level; np->index = utilized; return np; } #endif /******************************************************************************/ #ifndef WITH_LEAN static void soap_utilize_ns(struct soap *soap, const char *tag) { struct soap_nlist *np; size_t n = 0; const char *t = strchr(tag, ':'); if (t) n = t - tag; np = soap_lookup_ns(soap, tag, n); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Utilizing namespace of '%s'\n", tag)); if (np) { if (np->index <= 0) { if (np->level == soap->level) np->index = 1; else soap_push_ns(soap, np->id, np->ns, 1); } } else if (n && strncmp(tag, "xml", 3)) { soap_strncpy(soap->tmpbuf, sizeof(soap->tmpbuf), tag, n); soap_push_ns(soap, soap->tmpbuf, NULL, 1); } } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_element(struct soap *soap, const char *tag, int id, const char *type) { #ifndef WITH_LEAN const char *s; #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element begin tag='%s' level='%u' id='%d' type='%s'\n", tag, soap->level, id, type ? type : SOAP_STR_EOS)); soap->level++; #ifdef WITH_DOM #ifndef WITH_LEAN if (soap_tagsearch(soap->wsuid, tag)) { size_t i; for (s = tag, i = 0; *s && i < sizeof(soap->tag) - 1; s++, i++) soap->tag[i] = *s == ':' ? '-' : *s; soap->tag[i] = '\0'; if (soap_set_attr(soap, "wsu:Id", soap->tag, 1)) return soap->error; } if ((soap->mode & SOAP_XML_CANONICAL) && !(soap->mode & SOAP_DOM_ASIS)) { if (soap->evlev >= soap->level) soap->evlev = 0; if (soap->event == SOAP_SEC_BEGIN && !soap->evlev) { struct soap_nlist *np; /* non-nested wsu:Id found: clear xmlns, re-emit them for exc-c14n */ for (np = soap->nlist; np; np = np->next) { int p = soap_tagsearch(soap->c14ninclude, np->id) != NULL; if (np->index == 2 || p) { struct soap_nlist *np1 = soap_push_ns(soap, np->id, np->ns, 1); if (np1 && !p) np1->index = 0; } } soap->evlev = soap->level; } } #endif if (soap->mode & SOAP_XML_DOM) { struct soap_dom_element *elt = (struct soap_dom_element*)soap_malloc(soap, sizeof(struct soap_dom_element)); if (!elt) return soap->error; elt->soap = soap; elt->next = NULL; elt->prnt = soap->dom; elt->elts = NULL; elt->atts = NULL; elt->nstr = NULL; elt->name = soap_strdup(soap, tag); elt->lead = NULL; elt->text = NULL; elt->code = NULL; elt->tail = NULL; elt->node = NULL; elt->type = 0; if (soap->dom) { struct soap_dom_element *p = soap->dom->elts; if (p) { while (p->next) p = p->next; p->next = elt; } else soap->dom->elts = elt; } soap->dom = elt; } else { #endif #ifndef WITH_LEAN if (!soap->ns) { if (!(soap->mode & SOAP_XML_CANONICAL) && soap_send(soap, soap->prolog)) return soap->error; } else if (soap->mode & SOAP_XML_INDENT) { if (soap->ns == 1 && soap_send_raw(soap, soap_indent, soap->level < sizeof(soap_indent) ? soap->level : sizeof(soap_indent) - 1)) return soap->error; soap->body = 1; } if ((soap->mode & SOAP_XML_DEFAULTNS)) { struct Namespace *ns = soap->local_namespaces; size_t n = 0; s = strchr(tag, ':'); if (s) n = s++ - tag; else s = tag; if (soap_send_raw(soap, "<", 1) || soap_send(soap, s)) return soap->error; if (n) { if (soap->nlist && !strncmp(soap->nlist->id, tag, n) && !soap->nlist->id[n]) ns = NULL; for (; ns && ns->id; ns++) { if (*ns->id && ns->ns && !strncmp(ns->id, tag, n) && !ns->id[n]) { soap_push_ns(soap, ns->id, ns->out ? ns->out : ns->ns, 0); if (soap_attribute(soap, "xmlns", ns->out ? ns->out : ns->ns)) return soap->error; break; } } } else if (!soap->nlist || *soap->nlist->id) { soap_push_ns(soap, "", "", 0); if (soap_attribute(soap, "xmlns", "")) return soap->error; } } else #endif if (soap_send_raw(soap, "<", 1) || soap_send(soap, tag)) return soap->error; #ifdef WITH_DOM } #endif if (!soap->ns) { struct Namespace *ns = soap->local_namespaces; int k = -1; if (ns) { #ifndef WITH_LEAN if ((soap->mode & SOAP_XML_DEFAULTNS)) { if (soap->version) k = 4; /* first four required entries */ else if (!(soap->mode & SOAP_XML_NOTYPE) || (soap->mode & SOAP_XML_NIL)) { ns += 2; k = 2; /* next two entries */ } else k = 0; /* no entries */ } #endif while (k-- && ns->id) { const char *t = ns->out; if (!t) t = ns->ns; if (*ns->id && t && *t) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), strlen(ns->id) + 6), "xmlns:%s", ns->id); if (soap_attribute(soap, soap->tmpbuf, t)) return soap->error; } ns++; } } } soap->ns = 1; /* namespace table control: ns = 0 or 2 to start, then 1 to stop dumping the table */ #ifndef WITH_LEAN if ((soap->mode & SOAP_XML_CANONICAL)) soap_utilize_ns(soap, tag); #endif if (id > 0) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), sizeof(SOAP_BASEREFNAME) + 20), SOAP_BASEREFNAME "%d", id); if (soap->version == 2) { if (soap_attribute(soap, "SOAP-ENC:id", soap->tmpbuf)) return soap->error; } else if (soap_attribute(soap, "id", soap->tmpbuf)) return soap->error; } if (type && *type && !(soap->mode & SOAP_XML_NOTYPE) && soap->part != SOAP_IN_HEADER) { const char *t = type; #ifndef WITH_LEAN if (soap->mode & SOAP_XML_DEFAULTNS) { t = strchr(type, ':'); if (t) t++; else t = type; } else if ((soap->mode & SOAP_XML_CANONICAL)) soap_utilize_ns(soap, type); #endif if (soap->attributes ? soap_set_attr(soap, "xsi:type", t, 1) : soap_attribute(soap, "xsi:type", t)) return soap->error; } if (soap->null && soap->position > 0 && soap->version == 1) { int i; (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf) - 1, 20), "[%d", soap->positions[0]); for (i = 1; i < soap->position; i++) { size_t l = strlen(soap->tmpbuf); (SOAP_SNPRINTF(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l - 1, 20), ",%d", soap->positions[i]); } soap_strncat(soap->tmpbuf, sizeof(soap->tmpbuf), "]", 1); if (soap_attribute(soap, "SOAP-ENC:position", soap->tmpbuf)) return soap->error; } if (soap->mustUnderstand) { if (soap->actor && *soap->actor) { if (soap_attribute(soap, soap->version == 2 ? "SOAP-ENV:role" : "SOAP-ENV:actor", soap->actor)) return soap->error; } if (soap_attribute(soap, "SOAP-ENV:mustUnderstand", soap->version == 2 ? "true" : "1")) return soap->error; soap->mustUnderstand = 0; } if (soap->encoding) { if (soap->encodingStyle && soap->local_namespaces && soap->local_namespaces[0].id && soap->local_namespaces[1].id) { if (!*soap->encodingStyle) { if (soap->local_namespaces[1].out) soap->encodingStyle = soap->local_namespaces[1].out; else soap->encodingStyle = soap->local_namespaces[1].ns; } if (soap->encodingStyle && soap_attribute(soap, "SOAP-ENV:encodingStyle", soap->encodingStyle)) return soap->error; } else soap->encodingStyle = NULL; soap->encoding = 0; } soap->null = 0; soap->position = 0; if (soap->event == SOAP_SEC_BEGIN) soap->event = 0; return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_element_begin_out(struct soap *soap, const char *tag, int id, const char *type) { if (*tag == '-') return SOAP_OK; if (soap_element(soap, tag, id, type)) return soap->error; #ifdef WITH_DOM if (soap_element_start_end_out(soap, NULL)) return soap->error; if (soap->feltbegout) return soap->error = soap->feltbegout(soap, tag); return SOAP_OK; #else return soap_element_start_end_out(soap, NULL); #endif } #endif /******************************************************************************/ #ifndef PALM_2 #ifndef HAVE_STRRCHR SOAP_FMAC1 char* SOAP_FMAC2 soap_strrchr(const char *s, int t) { char *r = NULL; while (*s) if (*s++ == t) r = (char*)s - 1; return r; } #endif #endif /******************************************************************************/ #ifndef PALM_2 #ifndef HAVE_STRTOL SOAP_FMAC1 long SOAP_FMAC2 soap_strtol(const char *s, char **t, int b) { long n = 0; int c; while (*s > 0 && *s <= 32) s++; if (b == 10) { short neg = 0; if (*s == '-') { s++; neg = 1; } else if (*s == '+') s++; while ((c = *s) && c >= '0' && c <= '9') { if (n >= 214748364 && (n > 214748364 || c >= '8')) { if (neg && n == 214748364 && c == '8') { if (t) *t = (char*)(s + 1); return -2147483648; } break; } n *= 10; n += c - '0'; s++; } if (neg) n = -n; } else /* assume b == 16 and value is always positive */ { while ((c = *s)) { if (c >= '0' && c <= '9') c -= '0'; else if (c >= 'A' && c <= 'F') c -= 'A' - 10; else if (c >= 'a' && c <= 'f') c -= 'a' - 10; if (n > 0x07FFFFFF) break; n <<= 4; n += c; s++; } } if (t) *t = (char*)s; return n; } #endif #endif /******************************************************************************/ #ifndef PALM_2 #ifndef HAVE_STRTOUL SOAP_FMAC1 unsigned long SOAP_FMAC2 soap_strtoul(const char *s, char **t, int b) { unsigned long n = 0; int c; while (*s > 0 && *s <= 32) s++; if (b == 10) { if (*s == '+') s++; while ((c = *s) && c >= '0' && c <= '9') { if (n >= 429496729 && (n > 429496729 || c >= '6')) break; n *= 10; n += c - '0'; s++; } } else /* b == 16 */ { while ((c = *s)) { if (c >= '0' && c <= '9') c -= '0'; else if (c >= 'A' && c <= 'F') c -= 'A' - 10; else if (c >= 'a' && c <= 'f') c -= 'a' - 10; if (n > 0x0FFFFFFF) break; n <<= 4; n += c; s++; } } if (t) *t = (char*)s; return n; } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_array_begin_out(struct soap *soap, const char *tag, int id, const char *type, const char *offset) { if (!type || !*type || soap->version == 0) return soap_element_begin_out(soap, tag, id, NULL); if (soap_element(soap, tag, id, NULL)) return soap->error; if (soap->version == 1) { if (offset && soap_attribute(soap, "SOAP-ENC:offset", offset)) return soap->error; if (soap_attribute(soap, "SOAP-ENC:arrayType", type)) return soap->error; } else { const char *s; s = soap_strrchr(type, '['); if (s && (size_t)(s - type) < sizeof(soap->tmpbuf)) { soap_strncpy(soap->tmpbuf, sizeof(soap->tmpbuf), type, s - type); if (soap_attribute(soap, "SOAP-ENC:itemType", soap->tmpbuf)) return soap->error; s++; if (*s) { soap_strcpy(soap->tmpbuf, sizeof(soap->tmpbuf), s); soap->tmpbuf[strlen(soap->tmpbuf) - 1] = '\0'; if (soap_attribute(soap, "SOAP-ENC:arraySize", soap->tmpbuf)) return soap->error; } } } #ifndef WITH_LEAN if ((soap->mode & SOAP_XML_CANONICAL)) soap_utilize_ns(soap, type); #endif return soap_element_start_end_out(soap, NULL); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_element_start_end_out(struct soap *soap, const char *tag) { struct soap_attribute *tp; #ifndef WITH_LEAN if ((soap->mode & SOAP_XML_CANONICAL)) { struct soap_nlist *np; for (tp = soap->attributes; tp; tp = tp->next) { if (tp->visible && *tp->name) soap_utilize_ns(soap, tp->name); } for (np = soap->nlist; np; np = np->next) { if (np->ns && (np->index == 1 || (np->index == 0 && soap->event == SOAP_SEC_BEGIN && soap_tagsearch(soap->c14ninclude, np->id)))) { if (*(np->id)) (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), strlen(np->id) + 6), "xmlns:%s", np->id); else soap_strcpy(soap->tmpbuf, sizeof(soap->tmpbuf), "xmlns"); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Enabling utilized binding (level=%u) %s='%s' c14ninclude='%s'\n", np->level, soap->tmpbuf, np->ns, soap->c14ninclude ? soap->c14ninclude : "(null)")); soap_set_attr(soap, soap->tmpbuf, np->ns, 1); np->index = 2; } else { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Binding (level=%u) %s='%s' utilized=%d\n", np->level, np->id, np->ns, np->index)); } } } #endif #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { struct soap_dom_attribute **att; att = &soap->dom->atts; for (tp = soap->attributes; tp; tp = tp->next) { if (tp->visible) { *att = (struct soap_dom_attribute*)soap_malloc(soap, sizeof(struct soap_dom_attribute)); if (!*att) return soap->error; (*att)->next = NULL; (*att)->nstr = NULL; (*att)->name = soap_strdup(soap, tp->name); (*att)->text = soap_strdup(soap, tp->value); (*att)->soap = soap; att = &(*att)->next; tp->visible = 0; } } return SOAP_OK; } #endif for (tp = soap->attributes; tp; tp = tp->next) { if (tp->visible) { #ifndef WITH_LEAN const char *s; if ((soap->mode & SOAP_XML_DEFAULTNS) && (s = strchr(tp->name, ':'))) { size_t n = s - tp->name; if (soap->nlist && !strncmp(soap->nlist->id, tp->name, n) && !soap->nlist->id[n]) s++; else s = tp->name; if (soap_send_raw(soap, " ", 1) || soap_send(soap, s)) return soap->error; } else #endif if (soap_send_raw(soap, " ", 1) || soap_send(soap, tp->name)) return soap->error; if (tp->visible == 2 && tp->value) { if (soap_send_raw(soap, "=\"", 2) || soap_string_out(soap, tp->value, tp->flag) || soap_send_raw(soap, "\"", 1)) return soap->error; } else if (soap->mode & SOAP_XML_STRICT) { if (soap_send_raw(soap, "=\"\"", 3)) return soap->error; } tp->visible = 0; } } if (tag) { #ifndef WITH_LEAN if ((soap->mode & SOAP_XML_CANONICAL)) { if (soap_send_raw(soap, ">", 1) || soap_element_end_out(soap, tag)) return soap->error; return SOAP_OK; } #endif if (soap->nlist) soap_pop_namespace(soap); soap->level--; /* decrement level just before /> */ soap->body = 0; return soap_send_raw(soap, "/>", 2); } return soap_send_raw(soap, ">", 1); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_element_end_out(struct soap *soap, const char *tag) { #ifndef WITH_LEAN const char *s; #endif if (*tag == '-') return SOAP_OK; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element ending tag='%s'\n", tag)); #ifdef WITH_DOM if (soap->feltendout && (soap->error = soap->feltendout(soap, tag))) return soap->error; if ((soap->mode & SOAP_XML_DOM) && soap->dom) { if (soap->dom->prnt) soap->dom = soap->dom->prnt; return SOAP_OK; } #endif #ifndef WITH_LEAN if (soap->nlist) soap_pop_namespace(soap); if (soap->mode & SOAP_XML_INDENT) { if (!soap->body) { if (soap_send_raw(soap, soap_indent, soap->level < sizeof(soap_indent) ? soap->level : sizeof(soap_indent) - 1)) return soap->error; } soap->body = 0; } if ((soap->mode & SOAP_XML_DEFAULTNS) && (s = strchr(tag, ':'))) tag = s + 1; #endif if (soap_send_raw(soap, "error; soap->level--; /* decrement level just before > */ return soap_send_raw(soap, ">", 1); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_element_ref(struct soap *soap, const char *tag, int id, int href) { const char *s = "ref"; int n = 1; if (soap->version == 1) { s = "href"; n = 0; } else if (soap->version == 2) s = "SOAP-ENC:ref"; (SOAP_SNPRINTF(soap->href, sizeof(soap->href), sizeof(SOAP_BASEREFNAME) + 21), "#" SOAP_BASEREFNAME "%d", href); return soap_element_href(soap, tag, id, s, soap->href + n); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_element_href(struct soap *soap, const char *tag, int id, const char *ref, const char *val) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element '%s' reference %s='%s'\n", tag, ref, val)); if (soap_element(soap, tag, id, NULL) || soap_attribute(soap, ref, val) || soap_element_start_end_out(soap, tag)) return soap->error; soap->body = 0; return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_element_null(struct soap *soap, const char *tag, int id, const char *type) { struct soap_attribute *tp = NULL; for (tp = soap->attributes; tp; tp = tp->next) if (tp->visible) break; if (tp || (soap->version == 2 && soap->position > 0) || id > 0 || (soap->mode & SOAP_XML_NIL)) { if (soap_element(soap, tag, id, type) || (!tp && soap_attribute(soap, "xsi:nil", "true")) || soap_element_start_end_out(soap, tag)) return soap->error; soap->body = 0; } else { soap->null = 1; soap->position = 0; soap->mustUnderstand = 0; } return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_element_nil(struct soap *soap, const char *tag) { if (soap_element(soap, tag, -1, NULL) || (soap_attribute(soap, "xsi:nil", "true"))) return soap->error; return soap_element_start_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_element_id(struct soap *soap, const char *tag, int id, const void *p, const void *a, int n, const char *type, int t, char **mark) { (void)a; (void)n; if (!p) { soap->error = soap_element_null(soap, tag, id, type); return -1; } #ifndef WITH_NOIDREF DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element_id %p type=%d id=%d\n", p, t, id)); if ((!soap->encodingStyle && !(soap->omode & SOAP_XML_GRAPH)) || (soap->omode & SOAP_XML_TREE)) return soap_check_and_mark(soap, p, t, mark); if (mark) *mark = NULL; if (id < -1) return soap_embed(soap, p, a, n, t); else if (id <= 0) { struct soap_plist *pp; if (a) id = soap_array_pointer_lookup(soap, p, a, n, t, &pp); else id = soap_pointer_lookup(soap, p, t, &pp); if (id) { if (soap_is_embedded(soap, pp)) { soap_element_ref(soap, tag, 0, id); return -1; } if (soap_is_single(soap, pp)) return 0; soap_set_embedded(soap, pp); } } return id; #else return soap_check_and_mark(soap, p, t, mark); #endif } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_check_and_mark(struct soap *soap, const void *p, int t, char **mark) { if (mark) { struct soap_plist *pp; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Check %p and mark %p\n", p, mark)); if (!soap_pointer_lookup(soap, p, t, &pp)) if (!soap_pointer_enter(soap, p, NULL, 0, t, &pp)) return -1; if (soap->mode & SOAP_IO_LENGTH) { if (pp->mark1 > 0) return -1; pp->mark1 = 1; *mark = &pp->mark1; } else { if (pp->mark2 > 0) return -1; pp->mark2 = 1; *mark = &pp->mark2; } } return 0; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void * SOAP_FMAC2 soap_mark_lookup(struct soap *soap, const void *p, int t, struct soap_plist **ppp, char **mark) { if (!soap) return NULL; if (mark || !(soap->mode & SOAP_XML_TREE)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Mark lookup %p type %d\n", p, t)); if (!soap_pointer_lookup(soap, p, t, ppp)) { if (!soap_pointer_enter(soap, p, NULL, 0, t, ppp)) return NULL; } else if (!(soap->mode & SOAP_XML_TREE)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Mark found %p\n", (*ppp)->dup)); return (*ppp)->dup; } if (mark) { if ((*ppp)->mark1 > 0) (*ppp)->mark1 = 2; /* cycle */ else (*ppp)->mark1 = 1; /* cycle detection */ *mark = &(*ppp)->mark1; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Mark cycle %d\n", (*ppp)->mark1)); } } return NULL; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_mark_cycle(struct soap *soap, struct soap_plist *pp) { (void)soap; return pp && pp->mark1 == 2 && (soap->mode & SOAP_XML_TREE); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_mark_dup(struct soap *soap, void *a, struct soap_plist *pp) { (void)soap; if (pp) pp->dup = a; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_unmark(struct soap *soap, char *mark) { (void)soap; if (mark) *mark = 0; /* release detection */ } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_element_result(struct soap *soap, const char *tag) { if (soap->version == 2 && soap->encodingStyle) { if (soap_element(soap, "SOAP-RPC:result", 0, NULL) || soap_attribute(soap, "xmlns:SOAP-RPC", soap_rpc) || soap_element_start_end_out(soap, NULL) || soap_string_out(soap, tag, 0) || soap_element_end_out(soap, "SOAP-RPC:result")) return soap->error; } return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_check_result(struct soap *soap, const char *tag) { (void)tag; if (soap->version == 2 && soap->encodingStyle) { soap_instring(soap, ":result", NULL, NULL, 0, 2, -1, -1, NULL); /* just ignore content for compliance reasons, but should compare tag to element's QName value? */ } } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_attribute(struct soap *soap, const char *name, const char *value) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Attribute '%s'='%s'\n", name, value)); #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && !(soap->mode & SOAP_XML_CANONICAL) && soap->dom) { struct soap_dom_attribute *a = (struct soap_dom_attribute*)soap_malloc(soap, sizeof(struct soap_dom_attribute)); if (!a) return soap->error; a->next = soap->dom->atts; a->nstr = NULL; a->name = soap_strdup(soap, name); a->text = soap_strdup(soap, value); a->soap = soap; soap->dom->atts = a; return SOAP_OK; } #endif #ifndef WITH_LEAN if ((soap->mode & SOAP_XML_CANONICAL)) { /* push namespace */ if (!strncmp(name, "xmlns", 5) && (name[5] == ':' || name[5] == '\0')) soap_push_ns(soap, name + 5 + (name[5] == ':'), value, 0); else if (soap_set_attr(soap, name, value, 1)) return soap->error; } else #endif { if (soap_send_raw(soap, " ", 1) || soap_send(soap, name)) return soap->error; if (value) if (soap_send_raw(soap, "=\"", 2) || soap_string_out(soap, value, 1) || soap_send_raw(soap, "\"", 1)) return soap->error; } return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_element_begin_in(struct soap *soap, const char *tag, int nillable, const char *type) { if (!soap_peek_element(soap)) { if (soap->other) return soap->error = SOAP_TAG_MISMATCH; if (tag && *tag == '-') return SOAP_OK; if (!(soap->error = soap_match_tag(soap, soap->tag, tag))) { soap->peeked = 0; if (type && *soap->type && soap_match_tag(soap, soap->type, type)) return soap->error = SOAP_TYPE; if (!nillable && soap->null && (soap->mode & SOAP_XML_STRICT)) return soap->error = SOAP_NULL; if (soap->body) soap->level++; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Begin tag found (level=%u) '%s'='%s'\n", soap->level, soap->tag, tag ? tag : SOAP_STR_EOS )); soap->error = SOAP_OK; } } else if (soap->error == SOAP_NO_TAG && tag && *tag == '-') soap->error = SOAP_OK; return soap->error; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_element_end_in(struct soap *soap, const char *tag) { soap_wchar c; char *s; int n = 0; if (tag && *tag == '-') return SOAP_OK; if (soap->error == SOAP_NO_TAG) soap->error = SOAP_OK; #ifdef WITH_DOM /* this whitespace or mixed content is significant for DOM as-is */ if ((soap->mode & SOAP_XML_DOM) && soap->dom) { if (!soap->peeked && !soap_string_in(soap, -1, -1, -1, NULL)) return soap->error; if (soap->dom->prnt) soap->dom = soap->dom->prnt; } #endif if (soap->peeked) { if (*soap->tag) n++; soap->peeked = 0; } do { while (((c = soap_get(soap)) != SOAP_TT)) { if ((int)c == EOF) return soap->error = SOAP_CHK_EOF; if (c == SOAP_LT) n++; else if (c == '/') { c = soap_get(soap); if (c == SOAP_GT) n--; else soap_unget(soap, c); } } } while (n--); s = soap->tag; n = sizeof(soap->tag); while (soap_notblank(c = soap_get(soap))) { if (--n > 0) *s++ = (char)c; } *s = '\0'; if ((int)c == EOF) return soap->error = SOAP_CHK_EOF; while (soap_blank(c)) c = soap_get(soap); if (c != SOAP_GT) return soap->error = SOAP_SYNTAX_ERROR; #ifndef WITH_LEAN #ifdef WITH_DOM if (soap->feltendin) { soap->level--; return soap->error = soap->feltendin(soap, soap->tag, tag); } #endif if (tag && (soap->mode & SOAP_XML_STRICT)) { soap_pop_namespace(soap); if (soap_match_tag(soap, soap->tag, tag)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End tag '%s' does not match '%s'\n", soap->tag, tag ? tag : SOAP_STR_EOS)); return soap->error = SOAP_SYNTAX_ERROR; } } #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End tag found (level=%u) '%s'='%s'\n", soap->level, soap->tag, tag ? tag : SOAP_STR_EOS)); soap->level--; return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char * SOAP_FMAC2 soap_attr_value(struct soap *soap, const char *name, int flag) { struct soap_attribute *tp; if (*name == '-') return SOAP_STR_EOS; for (tp = soap->attributes; tp; tp = tp->next) { if (!soap_match_tag(soap, tp->name, name)) break; } if (tp && tp->visible == 2) { if (flag == 4 || (flag == 2 && (soap->mode & SOAP_XML_STRICT))) soap->error = SOAP_PROHIBITED; else return tp->value; } else if (flag == 3 || (flag == 1 && (soap->mode & SOAP_XML_STRICT))) soap->error = SOAP_REQUIRED; else soap->error = SOAP_OK; return NULL; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_set_attr(struct soap *soap, const char *name, const char *value, int flag) { struct soap_attribute *tp, *tq; if (*name == '-') return SOAP_OK; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Set attribute %s='%s'\n", name, value ? value : SOAP_STR_EOS)); tq = NULL; for (tp = soap->attributes; tp; tq = tp, tp = tp->next) { if (!strcmp(tp->name, name)) break; } if (!tp) { size_t l = strlen(name); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Allocate attribute %s\n", name)); if (!(tp = (struct soap_attribute*)SOAP_MALLOC(soap, sizeof(struct soap_attribute) + l))) return soap->error = SOAP_EOM; tp->ns = NULL; #ifndef WITH_LEAN if ((soap->mode & SOAP_XML_CANONICAL)) { struct soap_attribute **tpp = &soap->attributes; const char *s = strchr(name, ':'); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inserting attribute %s for c14n\n", name)); if (!strncmp(name, "xmlns", 5)) { for (; *tpp; tpp = &(*tpp)->next) if (strncmp((*tpp)->name, "xmlns", 5) || strcmp((*tpp)->name + 5, name + 5) > 0) break; } else if (!s) { for (; *tpp; tpp = &(*tpp)->next) if (strncmp((*tpp)->name, "xmlns", 5) && ((*tpp)->ns || strcmp((*tpp)->name, name) > 0)) break; } else { struct soap_nlist *np = soap_lookup_ns(soap, name, s - name); if (np) tp->ns = np->ns; else { struct soap_attribute *tq; for (tq = soap->attributes; tq; tq = tq->next) { if (!strncmp(tq->name, "xmlns:", 6) && !strncmp(tq->name + 6, name, s - name) && !tq->name[6 + s - name]) { tp->ns = tq->ns; break; } } } for (; *tpp; tpp = &(*tpp)->next) { int k; if (strncmp((*tpp)->name, "xmlns", 5) && (*tpp)->ns && tp->ns && ((k = strcmp((*tpp)->ns, tp->ns)) > 0 || (!k && strcmp((*tpp)->name, name) > 0))) break; } } tp->next = *tpp; *tpp = tp; } else #endif if (tq) { tq->next = tp; tp->next = NULL; } else { tp->next = soap->attributes; soap->attributes = tp; } soap_strcpy((char*)tp->name, l + 1, name); tp->value = NULL; } else if (tp->visible) { return SOAP_OK; } else if (value && tp->value && tp->size <= strlen(value)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free attribute value of %s (free %p)\n", name, tp->value)); SOAP_FREE(soap, tp->value); tp->value = NULL; tp->ns = NULL; } if (value) { if (!tp->value) { tp->size = strlen(value) + 1; if (!(tp->value = (char*)SOAP_MALLOC(soap, tp->size))) return soap->error = SOAP_EOM; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Allocate attribute value for %s (%p)\n", tp->name, tp->value)); } soap_strcpy(tp->value, tp->size, value); if (!strncmp(tp->name, "xmlns:", 6)) tp->ns = tp->value; tp->visible = 2; tp->flag = (short)flag; #ifndef WITH_LEAN if (!strcmp(name, "wsu:Id")) { soap->event = SOAP_SEC_BEGIN; soap_strcpy(soap->id, sizeof(soap->id), value); } if ((soap->mode & SOAP_XML_CANONICAL)) { const char *s = strchr(name, ':'); if (s) /* should also check default namespace when 'type' is not qualified? */ { struct soap_nlist *np = soap_lookup_ns(soap, name, s - name); if (np && np->ns && soap->local_namespaces) { if ((!strcmp(s + 1, "type") && !strcmp(np->ns, soap->local_namespaces[2].ns)) /* xsi:type QName */ || ((!strcmp(s + 1, "arrayType") || !strcmp(s + 1, "itemType")) && !strcmp(np->ns, soap->local_namespaces[1].ns))) /* SOAP-ENC:arrayType and SOAP-ENC:itemType QName */ soap_utilize_ns(soap, value); } } } #endif } else tp->visible = 1; return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_clr_attr(struct soap *soap) { struct soap_attribute *tp; #ifndef WITH_LEAN if ((soap->mode & SOAP_XML_CANONICAL)) { while (soap->attributes) { tp = soap->attributes->next; if (soap->attributes->value) SOAP_FREE(soap, soap->attributes->value); SOAP_FREE(soap, soap->attributes); soap->attributes = tp; } } else #endif { for (tp = soap->attributes; tp; tp = tp->next) tp->visible = 0; } } #endif /******************************************************************************/ #ifndef PALM_2 static int soap_getattrval(struct soap *soap, char *s, size_t *n, soap_wchar d) { char buf[8]; size_t i; size_t k = *n; size_t m = 0; char *t = buf; for (i = 0; i < k; i++) { soap_wchar c; if (m) { *s++ = *t++; m--; continue; } if ((soap->mode & SOAP_C_UTFSTRING)) { if (((c = soap_get(soap)) & 0x80000000) && c >= -0x7FFFFF80 && c < SOAP_AP) { t = buf; c &= 0x7FFFFFFF; if (c < 0x0800) *t++ = (char)(0xC0 | ((c >> 6) & 0x1F)); else { if (c < 0x010000) *t++ = (char)(0xE0 | ((c >> 12) & 0x0F)); else { if (c < 0x200000) *t++ = (char)(0xF0 | ((c >> 18) & 0x07)); else { if (c < 0x04000000) *t++ = (char)(0xF8 | ((c >> 24) & 0x03)); else { *t++ = (char)(0xFC | ((c >> 30) & 0x01)); *t++ = (char)(0x80 | ((c >> 24) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 18) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 12) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 6) & 0x3F)); } *t++ = (char)(0x80 | (c & 0x3F)); m = t - buf - 1; if (i + m >= k) { soap_unget(soap, c | 0x80000000); *n = i; return soap->error = SOAP_EOM; } t = buf; *s++ = *t++; continue; } } else c = soap_getutf8(soap); switch (c) { case SOAP_TT: *s++ = '<'; soap_unget(soap, '/'); break; case SOAP_LT: *s++ = '<'; break; case SOAP_GT: if (d == ' ') { soap_unget(soap, c); *s = '\0'; *n = i + 1; return SOAP_OK; } *s++ = '>'; break; case SOAP_QT: if (c == d) { *s = '\0'; *n = i + 1; return SOAP_OK; } *s++ = '"'; break; case SOAP_AP: if (c == d) { *s = '\0'; *n = i + 1; return SOAP_OK; } *s++ = '\''; break; case '\t': case '\n': case '\r': case ' ': case '/': if (d == ' ') { soap_unget(soap, c); *s = '\0'; *n = i + 1; return SOAP_OK; } *s++ = (char)c; break; default: if ((int)c == EOF) { *s = '\0'; *n = i + 1; return soap->error = SOAP_CHK_EOF; } *s++ = (char)c; } } return soap->error = SOAP_EOM; } #endif /******************************************************************************/ #ifdef WITH_FAST #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_store_lab(struct soap *soap, const char *s, size_t n) { soap->labidx = 0; return soap_append_lab(soap, s, n); } #endif #endif /******************************************************************************/ #ifdef WITH_FAST #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_append_lab(struct soap *soap, const char *s, size_t n) { if (soap->labidx + n >= soap->lablen) { char *t = soap->labbuf; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Enlarging look-aside buffer to append data, size=%lu\n", (unsigned long)soap->lablen)); if (soap->lablen == 0) soap->lablen = SOAP_LABLEN; while (soap->labidx + n >= soap->lablen) soap->lablen <<= 1; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "New look-aside buffer size=%lu\n", (unsigned long)soap->lablen)); soap->labbuf = (char*)SOAP_MALLOC(soap, soap->lablen); if (!soap->labbuf) { if (t) SOAP_FREE(soap, t); return soap->error = SOAP_EOM; } if (t) { soap_memcpy((void*)soap->labbuf, soap->lablen, (const void*)t, soap->labidx); SOAP_FREE(soap, t); } } if (s) { soap_memcpy((void*)(soap->labbuf + soap->labidx), soap->lablen - soap->labidx, (const void*)s, n); soap->labidx += n; } return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_peek_element(struct soap *soap) { #ifdef WITH_DOM struct soap_dom_attribute **att = NULL; char *lead = NULL; #endif struct soap_attribute *tp, *tq = NULL; const char *t; char *s; soap_wchar c; int i; if (soap->peeked) { if (!*soap->tag) return soap->error = SOAP_NO_TAG; return SOAP_OK; } soap->peeked = 1; soap->id[0] = '\0'; soap->href[0] = '\0'; soap->type[0] = '\0'; soap->arrayType[0] = '\0'; soap->arraySize[0] = '\0'; soap->arrayOffset[0] = '\0'; soap->other = 0; soap->root = -1; soap->position = 0; soap->null = 0; soap->mustUnderstand = 0; /* UTF-8 BOM? */ c = soap_getchar(soap); if (c == 0xEF && soap_get0(soap) == 0xBB) { c = soap_get1(soap); if ((c = soap_get1(soap)) == 0xBF) soap->mode &= ~SOAP_ENC_LATIN; else soap_unget(soap, (0x0F << 12) | (0xBB << 6) | (c & 0x3F)); /* UTF-8 */ } else if ((c == 0xFE && soap_get0(soap) == 0xFF) /* UTF-16 BE */ || (c == 0xFF && soap_get0(soap) == 0xFE)) /* UTF-16 LE */ return soap->error = SOAP_UTF_ERROR; else soap_unget(soap, c); c = soap_get(soap); #ifdef WITH_DOM /* whitespace leading up to the start tag is significant for DOM as-is (but comments and PIs are removed from this lead) */ if (soap_blank(c)) { soap->labidx = 0; do { if (soap_append_lab(soap, NULL, 0)) return soap->error; s = soap->labbuf + soap->labidx; i = soap->lablen - soap->labidx; soap->labidx = soap->lablen; while (soap_blank(c) && i--) { *s++ = c; c = soap_get(soap); } } while (soap_blank(c)); *s = '\0'; lead = soap->labbuf; } #else /* skip space */ while (soap_blank(c)) c = soap_get(soap); #endif if (c != SOAP_LT) { *soap->tag = '\0'; if ((int)c == EOF) return soap->error = SOAP_CHK_EOF; soap_unget(soap, c); #ifdef WITH_DOM /* whitespace leading up to the end tag is significant for DOM as-is */ if ((soap->mode & SOAP_XML_DOM) && soap->dom) { if (lead && *lead) soap->dom->tail = soap_strdup(soap, lead); else soap->dom->tail = SOAP_STR_EOS; /* body with closing tag instead of */ } #endif return soap->error = SOAP_NO_TAG; } do c = soap_get1(soap); while (soap_blank(c)); s = soap->tag; i = sizeof(soap->tag); while (c != '>' && c != '/' && soap_notblank(c) && (int)c != EOF) { if (--i > 0) *s++ = (char)c; c = soap_get1(soap); } *s = '\0'; while (soap_blank(c)) c = soap_get1(soap); #ifdef WITH_DOM if (soap->mode & SOAP_XML_DOM) { struct soap_dom_element *elt; elt = (struct soap_dom_element*)soap_malloc(soap, sizeof(struct soap_dom_element)); if (!elt) return soap->error; elt->next = NULL; elt->prnt = soap->dom; elt->elts = NULL; elt->atts = NULL; elt->nstr = NULL; elt->name = soap_strdup(soap, soap->tag); elt->text = NULL; elt->code = NULL; elt->tail = NULL; elt->node = NULL; elt->type = 0; if (lead && *lead) elt->lead = soap_strdup(soap, lead); else elt->lead = NULL; elt->soap = soap; if (soap->dom) { struct soap_dom_element *p = soap->dom->elts; if (p) { while (p->next) p = p->next; p->next = elt; } else soap->dom->elts = elt; } soap->dom = elt; att = &elt->atts; } #endif soap_pop_namespace(soap); for (tp = soap->attributes; tp; tp = tp->next) tp->visible = 0; while ((int)c != EOF && c != '>' && c != '/') { s = soap->tmpbuf; i = sizeof(soap->tmpbuf); while (c != '=' && c != '>' && c != '/' && soap_notblank(c) && (int)c != EOF) { if (--i > 0) *s++ = (char)c; c = soap_get1(soap); } *s = '\0'; if (i == sizeof(soap->tmpbuf)) return soap->error = SOAP_SYNTAX_ERROR; #ifdef WITH_DOM /* add attribute name to dom */ if (att) { *att = (struct soap_dom_attribute*)soap_malloc(soap, sizeof(struct soap_dom_attribute)); if (!*att) return soap->error; (*att)->next = NULL; (*att)->nstr = NULL; (*att)->name = soap_strdup(soap, soap->tmpbuf); (*att)->text = NULL; (*att)->soap = soap; } #endif if (!strncmp(soap->tmpbuf, "xmlns", 5)) { if (soap->tmpbuf[5] == ':') t = soap->tmpbuf + 6; else if (soap->tmpbuf[5]) t = NULL; else t = SOAP_STR_EOS; } else t = NULL; tq = NULL; for (tp = soap->attributes; tp; tq = tp, tp = tp->next) { if (!SOAP_STRCMP(tp->name, soap->tmpbuf)) break; } if (!tp) { size_t l = strlen(soap->tmpbuf); tp = (struct soap_attribute*)SOAP_MALLOC(soap, sizeof(struct soap_attribute) + l); if (!tp) return soap->error = SOAP_EOM; soap_strcpy((char*)tp->name, l + 1, soap->tmpbuf); tp->value = NULL; tp->size = 0; tp->ns = NULL; /* append attribute to the end of the list */ if (tq) { tq->next = tp; tp->next = NULL; } else { tp->next = soap->attributes; soap->attributes = tp; } } while (soap_blank(c)) c = soap_get1(soap); if (c == '=') { size_t k; do c = soap_getutf8(soap); while (soap_blank(c)); if (c != SOAP_QT && c != SOAP_AP) { soap_unget(soap, c); c = ' '; /* blank delimiter */ } k = tp->size; if (soap_getattrval(soap, tp->value, &k, c)) { #ifdef WITH_FAST if (soap->error != SOAP_EOM) return soap->error; soap->error = SOAP_OK; if (soap_store_lab(soap, tp->value, k)) return soap->error; if (tp->value) SOAP_FREE(soap, tp->value); tp->value = NULL; for (;;) { k = soap->lablen - soap->labidx; if (soap_getattrval(soap, soap->labbuf + soap->labidx, &k, c)) { if (soap->error != SOAP_EOM) return soap->error; soap->error = SOAP_OK; soap->labidx = soap->lablen; if (soap_append_lab(soap, NULL, 0)) return soap->error; } else break; } if (soap->labidx) tp->size = soap->lablen; else { tp->size = strlen(soap->labbuf) + 1; if (tp->size < SOAP_LABLEN) tp->size = SOAP_LABLEN; } if (!(tp->value = (char*)SOAP_MALLOC(soap, tp->size))) return soap->error = SOAP_EOM; soap_strcpy(tp->value, tp->size, soap->labbuf); #else tp->size = k; if (soap->error != SOAP_EOM) return soap->error; soap->error = SOAP_OK; if (soap_new_block(soap) == NULL) return soap->error; for (;;) { if (!(s = (char*)soap_push_block(soap, NULL, SOAP_BLKLEN))) return soap->error; k = SOAP_BLKLEN; if (soap_getattrval(soap, s, &k, c)) { if (soap->error != SOAP_EOM) return soap->error; soap->error = SOAP_OK; soap_size_block(soap, NULL, k); } else break; } k = tp->size + soap->blist->size; if (!(s = (char*)SOAP_MALLOC(soap, k))) return soap->error = SOAP_EOM; if (tp->value) { soap_memcpy((void*)s, k, (const void*)tp->value, tp->size); SOAP_FREE(soap, tp->value); } soap_save_block(soap, NULL, s + tp->size, 0); tp->value = s; tp->size = k; #endif } do c = soap_get1(soap); while (soap_blank(c)); tp->visible = 2; /* seen this attribute w/ value */ #ifdef WITH_DOM if (att) (*att)->text = soap_strdup(soap, tp->value); #endif } else tp->visible = 1; /* seen this attribute w/o value */ #ifdef WITH_DOM if (att) att = &(*att)->next; #endif if (t && tp->value) { if (soap_push_namespace(soap, t, tp->value) == NULL) return soap->error; } } #ifdef WITH_DOM if (att) { soap->dom->nstr = soap_current_namespace(soap, soap->tag); for (att = &soap->dom->atts; *att; att = &(*att)->next) (*att)->nstr = soap_current_namespace(soap, (*att)->name); } #endif if ((int)c == EOF) return soap->error = SOAP_CHK_EOF; if (!(soap->body = (c != '/'))) do c = soap_get1(soap); while (soap_blank(c)); #ifdef WITH_DOM if (soap->mode & SOAP_XML_DOM) { if (!soap->body && soap->dom->prnt) soap->dom = soap->dom->prnt; } #endif for (tp = soap->attributes; tp; tp = tp->next) { if (tp->visible && tp->value) { #ifndef WITH_NOIDREF if (!strcmp(tp->name, "id")) { if ((soap->version > 0 && !(soap->imode & SOAP_XML_TREE)) || (soap->mode & SOAP_XML_GRAPH)) { *soap->id = '#'; soap_strcpy(soap->id + 1, sizeof(soap->id) - 1, tp->value); } } else if (!strcmp(tp->name, "href")) { if ((soap->version == 1 && !(soap->imode & SOAP_XML_TREE)) || (soap->mode & SOAP_XML_GRAPH) || ((soap->mode & (SOAP_ENC_MTOM | SOAP_ENC_DIME)) && *tp->value != '#')) soap_strcpy(soap->href, sizeof(soap->href), tp->value); } else if (!strcmp(tp->name, "ref")) { if ((soap->version == 2 && !(soap->imode & SOAP_XML_TREE)) || (soap->mode & SOAP_XML_GRAPH)) { *soap->href = '#'; soap_strcpy(soap->href + (*tp->value != '#'), sizeof(soap->href) - 1, tp->value); } } #else if (!strcmp(tp->name, "href")) { if ((soap->mode & (SOAP_ENC_MTOM | SOAP_ENC_DIME)) && *tp->value != '#') soap_strcpy(soap->href, sizeof(soap->href), tp->value); } #endif else if (!soap_match_tag(soap, tp->name, "xsi:type")) { soap_strcpy(soap->type, sizeof(soap->type), tp->value); } else if ((!soap_match_tag(soap, tp->name, "xsi:null") || !soap_match_tag(soap, tp->name, "xsi:nil")) && (!strcmp(tp->value, "1") || !strcmp(tp->value, "true"))) { soap->null = 1; } else if (!soap_match_tag(soap, tp->name, "SOAP-ENV:encodingStyle")) { if (!soap->encodingStyle) soap->encodingStyle = SOAP_STR_EOS; soap_get_version(soap); } else if (soap->version == 1) { if (!soap_match_tag(soap, tp->name, "SOAP-ENC:arrayType")) { s = soap_strrchr(tp->value, '['); if (s && (size_t)(s - tp->value) < sizeof(soap->arrayType)) { soap_strncpy(soap->arrayType, sizeof(soap->arrayType), tp->value, s - tp->value); soap_strcpy(soap->arraySize, sizeof(soap->arraySize), s); } else soap_strcpy(soap->arrayType, sizeof(soap->arrayType), tp->value); } else if (!soap_match_tag(soap, tp->name, "SOAP-ENC:offset")) soap_strcpy(soap->arrayOffset, sizeof(soap->arrayOffset), tp->value); else if (!soap_match_tag(soap, tp->name, "SOAP-ENC:position")) soap->position = soap_getposition(tp->value, soap->positions); else if (!soap_match_tag(soap, tp->name, "SOAP-ENC:root")) soap->root = ((!strcmp(tp->value, "1") || !strcmp(tp->value, "true"))); else if (!soap_match_tag(soap, tp->name, "SOAP-ENV:mustUnderstand") && (!strcmp(tp->value, "1") || !strcmp(tp->value, "true"))) soap->mustUnderstand = 1; else if (!soap_match_tag(soap, tp->name, "SOAP-ENV:actor")) { if ((!soap->actor || strcmp(soap->actor, tp->value)) && strcmp(tp->value, "http://schemas.xmlsoap.org/soap/actor/next")) soap->other = 1; } } else if (soap->version == 2) { #ifndef WITH_NOIDREF if (!soap_match_tag(soap, tp->name, "SOAP-ENC:id")) { *soap->id = '#'; soap_strcpy(soap->id + 1, sizeof(soap->id) - 1, tp->value); } else if (!soap_match_tag(soap, tp->name, "SOAP-ENC:ref")) { *soap->href = '#'; soap_strcpy(soap->href + (*tp->value != '#'), sizeof(soap->href) - 1, tp->value); } else #endif if (!soap_match_tag(soap, tp->name, "SOAP-ENC:itemType")) soap_strcpy(soap->arrayType, sizeof(soap->arrayType), tp->value); else if (!soap_match_tag(soap, tp->name, "SOAP-ENC:arraySize")) soap_strcpy(soap->arraySize, sizeof(soap->arraySize), tp->value); else if (!soap_match_tag(soap, tp->name, "SOAP-ENV:mustUnderstand") && (!strcmp(tp->value, "1") || !strcmp(tp->value, "true"))) soap->mustUnderstand = 1; else if (!soap_match_tag(soap, tp->name, "SOAP-ENV:role")) { if ((!soap->actor || strcmp(soap->actor, tp->value)) && strcmp(tp->value, "http://www.w3.org/2003/05/soap-envelope/role/next")) soap->other = 1; } } else { if (!soap_match_tag(soap, tp->name, "wsdl:required") && !strcmp(tp->value, "true")) soap->mustUnderstand = 1; } } } #ifdef WITH_DOM if (soap->feltbegin) return soap->error = soap->feltbegin(soap, soap->tag); #endif return soap->error = SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_retry(struct soap *soap) { soap->error = SOAP_OK; soap_revert(soap); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_revert(struct soap *soap) { if (!soap->peeked) { soap->peeked = 1; if (soap->body) soap->level--; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Reverting to last element '%s' (level=%u)\n", soap->tag, soap->level)); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_string_out(struct soap *soap, const char *s, int flag) { const char *t; soap_wchar c; soap_wchar mask = (soap_wchar)0xFFFFFF80UL; #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { soap->dom->text = soap_strdup(soap, s); return SOAP_OK; } #endif if (flag == 2 || (soap->mode & SOAP_C_UTFSTRING)) mask = 0; t = s; while ((c = *t++)) { switch (c) { case 0x09: if (flag) { if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, " ", 5)) return soap->error; s = t; } break; case 0x0A: if (flag || !(soap->mode & SOAP_XML_CANONICAL)) { if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, " ", 5)) return soap->error; s = t; } break; case '&': if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, "&", 5)) return soap->error; s = t; break; case '<': if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, "<", 4)) return soap->error; s = t; break; case '>': if (!flag) { if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, ">", 4)) return soap->error; s = t; } break; case '"': if (flag) { if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, """, 6)) return soap->error; s = t; } break; case 0x7F: if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, "", 6)) return soap->error; s = t; break; default: #ifndef WITH_LEANER #ifdef HAVE_MBTOWC if (soap->mode & SOAP_C_MBSTRING) { wchar_t wc; int m = mbtowc(&wc, t - 1, MB_CUR_MAX); if (m > 0 && !((soap_wchar)wc == c && m == 1 && c < 0x80)) { if (soap_send_raw(soap, s, t - s - 1) || soap_pututf8(soap, (unsigned long)wc)) return soap->error; s = t += m - 1; continue; } } #endif #endif #ifndef WITH_NOSTRINGTOUTF8 if ((c & mask) || !(c & 0xFFFFFFE0UL)) { if (soap_send_raw(soap, s, t - s - 1) || soap_pututf8(soap, (unsigned char)c)) return soap->error; s = t; } #endif } } return soap_send_raw(soap, s, t - s - 1); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 char * SOAP_FMAC2 soap_string_in(struct soap *soap, int flag, long minlen, long maxlen, const char *pattern) { char *s; char *t = NULL; size_t i; long l = 0; int n = 0, f = 0, m = 0; soap_wchar c; #if !defined(WITH_LEANER) && defined(HAVE_WCTOMB) char buf[MB_LEN_MAX > 8 ? MB_LEN_MAX : 8]; #else char buf[8]; #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Reading string content, flag=%d\n", flag)); if (flag <= 0 && soap->peeked && *soap->tag) { #ifndef WITH_LEAN struct soap_attribute *tp; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "String content includes tag '%s' and attributes\n", soap->tag)); t = soap->tmpbuf; *t = '<'; soap_strcpy(t + 1, sizeof(soap->tmpbuf) - 1, soap->tag); t += strlen(t); for (tp = soap->attributes; tp; tp = tp->next) { if (tp->visible) { size_t l = strlen(tp->name); if (t + l + 1 >= soap->tmpbuf + sizeof(soap->tmpbuf)) break; /* too many or attribute values to large */ *t++ = ' '; soap_strncpy(t, sizeof(soap->tmpbuf) - (t - soap->tmpbuf), tp->name, l); t += l; if (tp->value) { l = strlen(tp->value); if (t + l + 3 >= soap->tmpbuf + sizeof(soap->tmpbuf)) break; /* too many or attribute values to large */ *t++ = '='; *t++ = '"'; soap_strncpy(t, sizeof(soap->tmpbuf) - (t - soap->tmpbuf), tp->value, l); t += l; *t++ = '"'; } } } if (!soap->body) *t++ = '/'; *t++ = '>'; *t = '\0'; t = soap->tmpbuf; m = (int)strlen(soap->tmpbuf); #endif if (soap->body) n = 1; f = 1; soap->peeked = 0; } #ifdef WITH_CDATA if (flag <= 0) { int state = 0; #ifdef WITH_FAST soap->labidx = 0; /* use look-aside buffer */ #else if (soap_new_block(soap) == NULL) return NULL; #endif for (;;) { #ifdef WITH_FAST size_t k; if (soap_append_lab(soap, NULL, 0)) /* allocate more space in look-aside buffer if necessary */ return NULL; s = soap->labbuf + soap->labidx; /* space to populate */ k = soap->lablen - soap->labidx; /* number of bytes available */ soap->labidx = soap->lablen; /* claim this space */ #else size_t k = SOAP_BLKLEN; if (!(s = (char*)soap_push_block(soap, NULL, k))) return NULL; #endif for (i = 0; i < k; i++) { if (m > 0) { *s++ = *t++; /* copy multibyte characters */ m--; continue; } c = soap_getchar(soap); if ((int)c == EOF) goto end; if ((c >= 0x80 || c < SOAP_AP) && state != 1 && !(soap->mode & SOAP_ENC_LATIN)) { if ((c & 0x7FFFFFFF) >= 0x80) { soap_unget(soap, c); c = soap_getutf8(soap); } if ((c & 0x7FFFFFFF) >= 0x80 && (flag <= 0 || (soap->mode & SOAP_C_UTFSTRING))) { c &= 0x7FFFFFFF; t = buf; if (c < 0x0800) *t++ = (char)(0xC0 | ((c >> 6) & 0x1F)); else { if (c < 0x010000) *t++ = (char)(0xE0 | ((c >> 12) & 0x0F)); else { if (c < 0x200000) *t++ = (char)(0xF0 | ((c >> 18) & 0x07)); else { if (c < 0x04000000) *t++ = (char)(0xF8 | ((c >> 24) & 0x03)); else { *t++ = (char)(0xFC | ((c >> 30) & 0x01)); *t++ = (char)(0x80 | ((c >> 24) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 18) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 12) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 6) & 0x3F)); } *t++ = (char)(0x80 | (c & 0x3F)); m = (int)(t - buf) - 1; t = buf; *s++ = *t++; continue; } } switch (state) { case 1: if (c == ']') state = 4; *s++ = (char)c; continue; case 2: if (c == '-') state = 6; *s++ = (char)c; continue; case 3: if (c == '?') state = 8; *s++ = (char)c; continue; /* CDATA */ case 4: if (c == ']') state = 5; else state = 1; *s++ = (char)c; continue; case 5: if (c == '>') state = 0; else if (c != ']') state = 1; *s++ = (char)c; continue; /* comment */ case 6: if (c == '-') state = 7; else state = 2; *s++ = (char)c; continue; case 7: if (c == '>') state = 0; else if (c != '-') state = 2; *s++ = (char)c; continue; /* PI */ case 8: if (c == '>') state = 0; else if (c != '?') state = 3; *s++ = (char)c; continue; } switch (c) { case SOAP_TT: if (n == 0) goto end; n--; *s++ = '<'; t = (char*)"/"; m = 1; break; case SOAP_LT: if ((!f && flag >= 0) || (f && n == 0)) goto end; n++; *s++ = '<'; break; case SOAP_GT: *s++ = '>'; break; case SOAP_QT: *s++ = '"'; break; case SOAP_AP: *s++ = '\''; break; case '/': if (n > 0) { c = soap_getchar(soap); if (c == '>') n--; soap_unget(soap, c); } *s++ = '/'; break; case '<': c = soap_getchar(soap); if (c == '/') { if (n == 0) { c = SOAP_TT; goto end; } n--; } else if (c == '!') { c = soap_getchar(soap); if (c == '[') { do c = soap_getchar(soap); while ((int)c != EOF && c != '['); if ((int)c == EOF) goto end; t = (char*)"![CDATA["; m = 8; state = 1; } else if (c == '-') { if ((c = soap_getchar(soap)) == '-') state = 2; t = (char*)"!-"; m = 2; soap_unget(soap, c); } else { t = (char*)"!"; m = 1; soap_unget(soap, c); } *s++ = '<'; break; } else if (c == '?') state = 3; else if (f && n == 0) { soap_revget1(soap); c = '<'; goto end; } else n++; soap_unget(soap, c); *s++ = '<'; break; case '>': *s++ = '>'; break; case '"': *s++ = '"'; break; default: #ifndef WITH_LEANER #ifdef HAVE_WCTOMB if (soap->mode & SOAP_C_MBSTRING) { #ifdef WIN32 m = 0; wctomb_s(&m, buf, sizeof(buf), (wchar_t)(c & 0x7FFFFFFF)); #else m = wctomb(buf, (wchar_t)(c & 0x7FFFFFFF)); #endif if (m >= 1 && m <= (int)MB_CUR_MAX) { t = buf; *s++ = *t++; m--; } else { *s++ = SOAP_UNKNOWN_CHAR; m = 0; } } else #endif #endif *s++ = (char)(c & 0xFF); } l++; if (maxlen >= 0 && l > maxlen) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "String too long: maxlen=%ld\n", maxlen)); soap->error = SOAP_LENGTH; return NULL; } } } } #endif #ifdef WITH_FAST soap->labidx = 0; /* use look-aside buffer */ #else if (soap_new_block(soap) == NULL) return NULL; #endif for (;;) { #ifdef WITH_FAST size_t k; if (soap_append_lab(soap, NULL, 0)) /* allocate more space in look-aside buffer if necessary */ return NULL; s = soap->labbuf + soap->labidx; /* space to populate */ k = soap->lablen - soap->labidx; /* number of bytes available */ soap->labidx = soap->lablen; /* claim this space */ #else size_t k = SOAP_BLKLEN; if (!(s = (char*)soap_push_block(soap, NULL, k))) return NULL; #endif for (i = 0; i < k; i++) { if (m > 0) { *s++ = *t++; /* copy multibyte characters */ m--; continue; } #ifndef WITH_CDATA if (flag <= 0) c = soap_getchar(soap); else #endif { c = soap_getutf8(soap); if ((soap->mode & SOAP_C_UTFSTRING)) { if (c >= 0x80 || (c < SOAP_AP && c >= -0x7FFFFF80)) { c &= 0x7FFFFFFF; t = buf; if (c < 0x0800) *t++ = (char)(0xC0 | ((c >> 6) & 0x1F)); else { if (c < 0x010000) *t++ = (char)(0xE0 | ((c >> 12) & 0x0F)); else { if (c < 0x200000) *t++ = (char)(0xF0 | ((c >> 18) & 0x07)); else { if (c < 0x04000000) *t++ = (char)(0xF8 | ((c >> 24) & 0x03)); else { *t++ = (char)(0xFC | ((c >> 30) & 0x01)); *t++ = (char)(0x80 | ((c >> 24) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 18) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 12) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 6) & 0x3F)); } *t++ = (char)(0x80 | (c & 0x3F)); m = (int)(t - buf) - 1; t = buf; *s++ = *t++; l++; if (maxlen >= 0 && l > maxlen) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "String too long: maxlen=%ld\n", maxlen)); soap->error = SOAP_LENGTH; return NULL; } continue; } } } switch (c) { case SOAP_TT: if (n == 0) goto end; n--; *s++ = '<'; t = (char*)"/"; m = 1; break; case SOAP_LT: if ((!f && flag >= 0) || (f && n == 0)) goto end; n++; *s++ = '<'; break; case SOAP_GT: *s++ = '>'; break; case SOAP_QT: *s++ = '"'; break; case SOAP_AP: *s++ = '\''; break; case '/': if (n > 0) { if (flag > 0) { c = soap_get(soap); if (c == SOAP_GT) n--; } else { c = soap_getchar(soap); if (c == '>') n--; } soap_unget(soap, c); } *s++ = '/'; break; case (soap_wchar)('<' | 0x80000000): if (flag > 0) *s++ = '<'; else { *s++ = '&'; t = (char*)"lt;"; m = 3; } break; case (soap_wchar)('>' | 0x80000000): if (flag > 0) *s++ = '>'; else { *s++ = '&'; t = (char*)"gt;"; m = 3; } break; case (soap_wchar)('&' | 0x80000000): if (flag > 0) *s++ = '&'; else { *s++ = '&'; t = (char*)"amp;"; m = 4; } break; case (soap_wchar)('"' | 0x80000000): if (flag > 0) *s++ = '"'; else { *s++ = '&'; t = (char*)"quot;"; m = 5; } break; case (soap_wchar)('\'' | 0x80000000): if (flag > 0) *s++ = '\''; else { *s++ = '&'; t = (char*)"apos;"; m = 5; } break; default: if ((int)c == EOF) goto end; #ifndef WITH_CDATA if (c == '<') { c = soap_getchar(soap); soap_unget(soap, c); if (c == '/') { c = SOAP_TT; if (n == 0) goto end; n--; } else n++; *s++ = '<'; break; } else #endif #ifndef WITH_LEANER #ifdef HAVE_WCTOMB if (soap->mode & SOAP_C_MBSTRING) { #ifdef WIN32 m = 0; wctomb_s(&m, buf, sizeof(buf), (wchar_t)(c & 0x7FFFFFFF)); #else m = wctomb(buf, (wchar_t)(c & 0x7FFFFFFF)); #endif if (m >= 1 && m <= (int)MB_CUR_MAX) { t = buf; *s++ = *t++; m--; } else { *s++ = SOAP_UNKNOWN_CHAR; m = 0; } } else #endif #endif *s++ = (char)(c & 0xFF); } l++; if (maxlen >= 0 && l > maxlen) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "String too long: maxlen=%ld\n", maxlen)); soap->error = SOAP_LENGTH; return NULL; } } } end: soap_unget(soap, c); *s = '\0'; #ifdef WITH_FAST t = soap_strdup(soap, soap->labbuf); #else soap_size_block(soap, NULL, i + 1); t = soap_save_block(soap, NULL, NULL, 0); #endif if (l < minlen) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "String too short: %ld chars, minlen=%ld\n", l, minlen)); soap->error = SOAP_LENGTH; return NULL; } #ifndef WITH_LEANER if (pattern && soap->fsvalidate && (soap->error = soap->fsvalidate(soap, pattern, s))) return NULL; #else (void)pattern; #endif #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { if (flag > 0) soap->dom->text = t; else soap->dom->code = t; } #endif if (flag == 2) if (soap_s2QName(soap, t, &t, minlen, maxlen)) return NULL; return t; } #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_wstring_out(struct soap *soap, const wchar_t *s, int flag) { const char *t; char tmp; soap_wchar c; #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { soap->dom->text = soap_wchar2s(soap, s); return SOAP_OK; } #endif while ((c = *s++)) { switch (c) { case 0x09: if (flag) t = " "; else t = "\t"; break; case 0x0A: if (flag || !(soap->mode & SOAP_XML_CANONICAL)) t = " "; else t = "\n"; break; case 0x0D: t = " "; break; case '&': t = "&"; break; case '<': t = "<"; break; case '>': if (flag) t = ">"; else t = ">"; break; case '"': if (flag) t = """; else t = "\""; break; default: if (c >= 0x20 && c < 0x80) { tmp = (char)c; if (soap_send_raw(soap, &tmp, 1)) return soap->error; } else { /* check for UTF16 encoding when wchar_t is too small to hold UCS */ if (sizeof(wchar_t) < 4 && (c & 0xFC00) == 0xD800) { soap_wchar d = *s++; if ((d & 0xFC00) == 0xDC00) c = ((c - 0xD800) << 10) + (d - 0xDC00) + 0x10000; else c = 0xFFFD; /* Malformed */ } if (soap_pututf8(soap, (unsigned long)c)) return soap->error; } continue; } if (soap_send(soap, t)) return soap->error; } return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_2 SOAP_FMAC1 wchar_t * SOAP_FMAC2 soap_wstring_in(struct soap *soap, int flag, long minlen, long maxlen, const char *pattern) { wchar_t *s; int i, n = 0, f = 0; long l = 0; soap_wchar c; char *t = NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Reading wide string content\n")); if (flag <= 0 && soap->peeked && *soap->tag) { #ifndef WITH_LEAN struct soap_attribute *tp; t = soap->tmpbuf; *t = '<'; soap_strcpy(t + 1, sizeof(soap->tmpbuf) - 1, soap->tag); t += strlen(t); for (tp = soap->attributes; tp; tp = tp->next) { if (tp->visible) { size_t l = strlen(tp->name); if (t + l + 1 >= soap->tmpbuf + sizeof(soap->tmpbuf)) break; *t++ = ' '; soap_strncpy(t, sizeof(soap->tmpbuf) - (t - soap->tmpbuf), tp->name, l); t += l; if (tp->value) { l = strlen(tp->value); if (t + l + 3 >= soap->tmpbuf + sizeof(soap->tmpbuf)) break; *t++ = '='; *t++ = '"'; soap_strncpy(t, sizeof(soap->tmpbuf) - (t - soap->tmpbuf), tp->value, l); t += l; *t++ = '"'; } } } if (!soap->body) *t++ = '/'; *t++ = '>'; *t = '\0'; t = soap->tmpbuf; #endif if (soap->body) n = 1; f = 1; soap->peeked = 0; } if (soap_new_block(soap) == NULL) return NULL; for (;;) { if (!(s = (wchar_t*)soap_push_block(soap, NULL, sizeof(wchar_t)*SOAP_BLKLEN))) return NULL; for (i = 0; i < SOAP_BLKLEN; i++) { if (t) { *s++ = (wchar_t)*t++; if (!*t) t = NULL; continue; } c = soap_getutf8(soap); switch (c) { case SOAP_TT: if (n == 0) goto end; n--; *s++ = '<'; soap_unget(soap, '/'); break; case SOAP_LT: if ((!f && flag >= 0) || (f && n == 0)) goto end; n++; *s++ = '<'; break; case SOAP_GT: *s++ = '>'; break; case SOAP_QT: *s++ = '"'; break; case SOAP_AP: *s++ = '\''; break; case '/': if (n > 0) { c = soap_getutf8(soap); if (c == SOAP_GT) n--; soap_unget(soap, c); } *s++ = '/'; break; case '<': if (flag > 0) *s++ = (soap_wchar)'<'; else { *s++ = (soap_wchar)'&'; t = (char*)"lt;"; } break; case '>': if (flag > 0) *s++ = (soap_wchar)'>'; else { *s++ = (soap_wchar)'&'; t = (char*)"gt;"; } break; case '"': if (flag > 0) *s++ = (soap_wchar)'"'; else { *s++ = (soap_wchar)'&'; t = (char*)"quot;"; } break; default: if ((int)c == EOF) goto end; /* use UTF16 encoding when wchar_t is too small to hold UCS */ if (sizeof(wchar_t) < 4 && c > 0xFFFF) { soap_wchar c1, c2; c1 = 0xD800 - (0x10000 >> 10) + (c >> 10); c2 = 0xDC00 + (c & 0x3FF); c = c1; soap_unget(soap, c2); } *s++ = (wchar_t)c & 0x7FFFFFFF; } l++; if (maxlen >= 0 && l > maxlen) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "String too long: maxlen=%ld\n", maxlen)); soap->error = SOAP_LENGTH; return NULL; } } } end: soap_unget(soap, c); *s = '\0'; soap_size_block(soap, NULL, sizeof(wchar_t) * (i + 1)); if (l < minlen) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "String too short: %ld chars, minlen=%ld\n", l, minlen)); soap->error = SOAP_LENGTH; return NULL; } s = (wchar_t*)soap_save_block(soap, NULL, NULL, 0); #ifndef WITH_LEANER if (pattern && soap->fwvalidate && (soap->error = soap->fwvalidate(soap, pattern, s))) return NULL; #endif #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) soap->dom->text = soap_wchar2s(soap, s); #endif return s; } #endif #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_int2s(struct soap *soap, int n) { return soap_long2s(soap, (long)n); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outint(struct soap *soap, const char *tag, int id, const int *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_long2s(soap, (long)*p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2int(struct soap *soap, const char *s, int *p) { if (s) { long n; char *r; #ifndef WITH_NOIO #ifndef WITH_LEAN soap_reset_errno; #endif #endif n = soap_strtol(s, &r, 10); if (s == r || *r #ifndef WITH_LEAN || n != (int)n #endif #ifndef WITH_NOIO #ifndef WITH_LEAN || soap_errno == SOAP_ERANGE #endif #endif ) soap->error = SOAP_TYPE; *p = (int)n; } return soap->error; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int * SOAP_FMAC2 soap_inint(struct soap *soap, const char *tag, int *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; #ifndef WITH_LEAN if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":int") && soap_match_tag(soap, soap->type, ":short") && soap_match_tag(soap, soap->type, ":byte")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } #else (void)type; #endif p = (int*)soap_id_enter(soap, soap->id, p, t, sizeof(int), NULL, NULL, NULL, NULL); if (*soap->href) p = (int*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(int), 0, NULL, NULL); else if (p) { if (soap_s2int(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_long2s(struct soap *soap, long n) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 20), "%ld", n); return soap->tmpbuf; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outlong(struct soap *soap, const char *tag, int id, const long *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_long2s(soap, *p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2long(struct soap *soap, const char *s, long *p) { if (s) { char *r; #ifndef WITH_NOIO #ifndef WITH_LEAN soap_reset_errno; #endif #endif *p = soap_strtol(s, &r, 10); if (s == r || *r #ifndef WITH_NOIO #ifndef WITH_LEAN || soap_errno == SOAP_ERANGE #endif #endif ) soap->error = SOAP_TYPE; } return soap->error; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 long * SOAP_FMAC2 soap_inlong(struct soap *soap, const char *tag, long *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; #ifndef WITH_LEAN if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":int") && soap_match_tag(soap, soap->type, ":short") && soap_match_tag(soap, soap->type, ":byte")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } #else (void)type; #endif p = (long*)soap_id_enter(soap, soap->id, p, t, sizeof(long), NULL, NULL, NULL, NULL); if (*soap->href) p = (long*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(long), 0, NULL, NULL); else if (p) { if (soap_s2long(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 const char* SOAP_FMAC2 soap_LONG642s(struct soap *soap, LONG64 n) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 20), SOAP_LONG_FORMAT, n); return soap->tmpbuf; } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 int SOAP_FMAC2 soap_outLONG64(struct soap *soap, const char *tag, int id, const LONG64 *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_LONG642s(soap, *p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 int SOAP_FMAC2 soap_s2LONG64(struct soap *soap, const char *s, LONG64 *p) { if (s) { char *r; #ifndef WITH_NOIO #ifndef WITH_LEAN soap_reset_errno; #endif #endif #ifdef HAVE_STRTOLL *p = soap_strtoll(s, &r, 10); #else *p = (LONG64)soap_strtol(s, &r, 10); #endif if (s == r || *r #ifndef WITH_NOIO #ifndef WITH_LEAN || soap_errno == SOAP_ERANGE #endif #endif ) soap->error = SOAP_TYPE; } return soap->error; } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 LONG64 * SOAP_FMAC2 soap_inLONG64(struct soap *soap, const char *tag, LONG64 *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; #ifndef WITH_LEAN if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":integer") && soap_match_tag(soap, soap->type, ":positiveInteger") && soap_match_tag(soap, soap->type, ":negativeInteger") && soap_match_tag(soap, soap->type, ":nonPositiveInteger") && soap_match_tag(soap, soap->type, ":nonNegativeInteger") && soap_match_tag(soap, soap->type, ":long") && soap_match_tag(soap, soap->type, ":int") && soap_match_tag(soap, soap->type, ":short") && soap_match_tag(soap, soap->type, ":byte")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } #endif p = (LONG64*)soap_id_enter(soap, soap->id, p, t, sizeof(LONG64), NULL, NULL, NULL, NULL); if (*soap->href) p = (LONG64*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(LONG64), 0, NULL, NULL); else if (p) { if (soap_s2LONG64(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_byte2s(struct soap *soap, char n) { return soap_long2s(soap, (long)n); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outbyte(struct soap *soap, const char *tag, int id, const char *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_long2s(soap, (long)*p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2byte(struct soap *soap, const char *s, char *p) { if (s) { long n; char *r; n = soap_strtol(s, &r, 10); if (s == r || *r || n < -128 || n > 127) soap->error = SOAP_TYPE; *p = (char)n; } return soap->error; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 char * SOAP_FMAC2 soap_inbyte(struct soap *soap, const char *tag, char *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; #ifndef WITH_LEAN if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":byte")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } #else (void)type; #endif p = (char*)soap_id_enter(soap, soap->id, p, t, sizeof(char), NULL, NULL, NULL, NULL); if (*soap->href) p = (char*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(char), 0, NULL, NULL); else if (p) { if (soap_s2byte(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_short2s(struct soap *soap, short n) { return soap_long2s(soap, (long)n); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outshort(struct soap *soap, const char *tag, int id, const short *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_long2s(soap, (long)*p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2short(struct soap *soap, const char *s, short *p) { if (s) { long n; char *r; n = soap_strtol(s, &r, 10); if (s == r || *r || n < -32768 || n > 32767) soap->error = SOAP_TYPE; *p = (short)n; } return soap->error; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 short * SOAP_FMAC2 soap_inshort(struct soap *soap, const char *tag, short *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; #ifndef WITH_LEAN if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":short") && soap_match_tag(soap, soap->type, ":byte")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } #else (void)type; #endif p = (short*)soap_id_enter(soap, soap->id, p, t, sizeof(short), NULL, NULL, NULL, NULL); if (*soap->href) p = (short*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(short), 0, NULL, NULL); else if (p) { if (soap_s2short(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_float2s(struct soap *soap, float n) { #if !defined(WITH_C_LOCALE) || !defined(HAVE_SPRINTF_L) char *s; #endif if (soap_isnan((double)n)) return "NaN"; if (soap_ispinff(n)) return "INF"; if (soap_isninff(n)) return "-INF"; #if defined(WITH_C_LOCALE) && defined(HAVE_SPRINTF_L) # ifdef WIN32 _sprintf_s_l(soap->tmpbuf, _countof(soap->tmpbuf), soap->float_format, SOAP_LOCALE(soap), n); # else sprintf_l(soap->tmpbuf, SOAP_LOCALE(soap), soap->float_format, n); # endif #else (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 20), soap->float_format, n); s = strchr(soap->tmpbuf, ','); /* convert decimal comma to DP */ if (s) *s = '.'; #endif return soap->tmpbuf; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outfloat(struct soap *soap, const char *tag, int id, const float *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_float2s(soap, *p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2float(struct soap *soap, const char *s, float *p) { if (s) { if (!*s) return soap->error = SOAP_TYPE; if (!soap_tag_cmp(s, "INF")) *p = FLT_PINFTY; else if (!soap_tag_cmp(s, "+INF")) *p = FLT_PINFTY; else if (!soap_tag_cmp(s, "-INF")) *p = FLT_NINFTY; else if (!soap_tag_cmp(s, "NaN")) *p = FLT_NAN; else { /* On some systems strtof requires -std=c99 or does not even link: so we try to use strtod first */ #if defined(WITH_C_LOCALE) && defined(HAVE_STRTOD_L) char *r; # ifdef WIN32 *p = (float)_strtod_l(s, &r, SOAP_LOCALE(soap)); # else *p = (float)strtod_l(s, &r, SOAP_LOCALE(soap)); # endif if (*r) soap->error = SOAP_TYPE; #elif defined(HAVE_STRTOD) char *r; *p = (float)strtod(s, &r); if (*r) soap->error = SOAP_TYPE; #elif defined(WITH_C_LOCALE) && defined(HAVE_STRTOF_L) char *r; *p = strtof_l((char*)s, &r, SOAP_LOCALE(soap)); if (*r) soap->error = SOAP_TYPE; #elif defined(HAVE_STRTOF) char *r; *p = strtof((char*)s, &r); if (*r) soap->error = SOAP_TYPE; #elif defined(WITH_C_LOCALE) && defined(HAVE_SSCANF_L) && !defined(HAVE_STRTOF_L) && !defined(HAVE_STRTOD_L) double n; if (sscanf_l(s, SOAP_LOCALE(soap), "%lf", &n) != 1) soap->error = SOAP_TYPE; *p = (float)n; #elif defined(HAVE_SSCANF) double n; if (sscanf(s, "%lf", &n) != 1) soap->error = SOAP_TYPE; *p = (float)n; #else soap->error = SOAP_TYPE; #endif } } return soap->error; } #endif /******************************************************************************/ #ifndef WITH_LEAN static int soap_isnumeric(struct soap *soap, const char *type) { if (soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":float") && soap_match_tag(soap, soap->type, ":double") && soap_match_tag(soap, soap->type, ":decimal") && soap_match_tag(soap, soap->type, ":integer") && soap_match_tag(soap, soap->type, ":positiveInteger") && soap_match_tag(soap, soap->type, ":negativeInteger") && soap_match_tag(soap, soap->type, ":nonPositiveInteger") && soap_match_tag(soap, soap->type, ":nonNegativeInteger") && soap_match_tag(soap, soap->type, ":long") && soap_match_tag(soap, soap->type, ":int") && soap_match_tag(soap, soap->type, ":short") && soap_match_tag(soap, soap->type, ":byte") && soap_match_tag(soap, soap->type, ":unsignedLong") && soap_match_tag(soap, soap->type, ":unsignedInt") && soap_match_tag(soap, soap->type, ":unsignedShort") && soap_match_tag(soap, soap->type, ":unsignedByte")) { soap->error = SOAP_TYPE; soap_revert(soap); return SOAP_ERR; } return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 float * SOAP_FMAC2 soap_infloat(struct soap *soap, const char *tag, float *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; #ifndef WITH_LEAN if (*soap->type != '\0' && soap_isnumeric(soap, type)) return NULL; #else (void)type; #endif p = (float*)soap_id_enter(soap, soap->id, p, t, sizeof(float), NULL, NULL, NULL, NULL); if (*soap->href) p = (float*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(float), 0, NULL, NULL); else if (p) { if (soap_s2float(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_double2s(struct soap *soap, double n) { #if !defined(WITH_C_LOCALE) || !defined(HAVE_SPRINTF_L) char *s; #endif if (soap_isnan(n)) return "NaN"; if (soap_ispinfd(n)) return "INF"; if (soap_isninfd(n)) return "-INF"; #if defined(WITH_C_LOCALE) && defined(HAVE_SPRINTF_L) # ifdef WIN32 _sprintf_s_l(soap->tmpbuf, _countof(soap->tmpbuf), soap->double_format, SOAP_LOCALE(soap), n); # else sprintf_l(soap->tmpbuf, SOAP_LOCALE(soap), soap->double_format, n); # endif #else (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 40), soap->double_format, n); s = strchr(soap->tmpbuf, ','); /* convert decimal comma to DP */ if (s) *s = '.'; #endif return soap->tmpbuf; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outdouble(struct soap *soap, const char *tag, int id, const double *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_double2s(soap, *p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2double(struct soap *soap, const char *s, double *p) { if (s) { if (!*s) return soap->error = SOAP_TYPE; if (!soap_tag_cmp(s, "INF")) *p = DBL_PINFTY; else if (!soap_tag_cmp(s, "+INF")) *p = DBL_PINFTY; else if (!soap_tag_cmp(s, "-INF")) *p = DBL_NINFTY; else if (!soap_tag_cmp(s, "NaN")) *p = DBL_NAN; else { #if defined(WITH_C_LOCALE) && defined(HAVE_STRTOD_L) char *r; # ifdef WIN32 *p = _strtod_l(s, &r, SOAP_LOCALE(soap)); # else *p = strtod_l(s, &r, SOAP_LOCALE(soap)); # endif if (*r) soap->error = SOAP_TYPE; #elif defined(HAVE_STRTOD) char *r; *p = strtod(s, &r); if (*r) soap->error = SOAP_TYPE; #elif defined(WITH_C_LOCALE) && defined(HAVE_SSCANF_L) && !defined(HAVE_STRTOF_L) && !defined(HAVE_STRTOD_L) if (sscanf_l(s, SOAP_LOCALE(soap), "%lf", p) != 1) soap->error = SOAP_TYPE; #elif defined(HAVE_SSCANF) if (sscanf(s, "%lf", p) != 1) soap->error = SOAP_TYPE; #else soap->error = SOAP_TYPE; #endif } } return soap->error; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 double * SOAP_FMAC2 soap_indouble(struct soap *soap, const char *tag, double *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; #ifndef WITH_LEAN if (*soap->type != '\0' && soap_isnumeric(soap, type)) return NULL; #else (void)type; #endif p = (double*)soap_id_enter(soap, soap->id, p, t, sizeof(double), NULL, NULL, NULL, NULL); if (*soap->href) p = (double*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(double), 0, NULL, NULL); else if (p) { if (soap_s2double(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedByte2s(struct soap *soap, unsigned char n) { return soap_unsignedLong2s(soap, (unsigned long)n); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outunsignedByte(struct soap *soap, const char *tag, int id, const unsigned char *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_unsignedLong2s(soap, (unsigned long)*p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedByte(struct soap *soap, const char *s, unsigned char *p) { if (s) { unsigned long n; char *r; n = soap_strtoul(s, &r, 10); if (s == r || *r || n > 255) soap->error = SOAP_TYPE; *p = (unsigned char)n; } return soap->error; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 unsigned char * SOAP_FMAC2 soap_inunsignedByte(struct soap *soap, const char *tag, unsigned char *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; #ifndef WITH_LEAN if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":unsignedByte")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } #else (void)type; #endif p = (unsigned char*)soap_id_enter(soap, soap->id, p, t, sizeof(unsigned char), NULL, NULL, NULL, NULL); if (*soap->href) p = (unsigned char*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(unsigned char), 0, NULL, NULL); else if (p) { if (soap_s2unsignedByte(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedShort2s(struct soap *soap, unsigned short n) { return soap_unsignedLong2s(soap, (unsigned long)n); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outunsignedShort(struct soap *soap, const char *tag, int id, const unsigned short *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_unsignedLong2s(soap, (unsigned long)*p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedShort(struct soap *soap, const char *s, unsigned short *p) { if (s) { unsigned long n; char *r; n = soap_strtoul(s, &r, 10); if (s == r || *r || n > 65535) soap->error = SOAP_TYPE; *p = (unsigned short)n; } return soap->error; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 unsigned short * SOAP_FMAC2 soap_inunsignedShort(struct soap *soap, const char *tag, unsigned short *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; #ifndef WITH_LEAN if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":unsignedShort") && soap_match_tag(soap, soap->type, ":unsignedByte")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } #else (void)type; #endif p = (unsigned short*)soap_id_enter(soap, soap->id, p, t, sizeof(unsigned short), NULL, NULL, NULL, NULL); if (*soap->href) p = (unsigned short*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(unsigned short), 0, NULL, NULL); else if (p) { if (soap_s2unsignedShort(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedInt2s(struct soap *soap, unsigned int n) { return soap_unsignedLong2s(soap, (unsigned long)n); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outunsignedInt(struct soap *soap, const char *tag, int id, const unsigned int *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_unsignedLong2s(soap, (unsigned long)*p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedInt(struct soap *soap, const char *s, unsigned int *p) { if (s) { char *r; #ifndef WITH_NOIO #ifndef WITH_LEAN soap_reset_errno; #endif #endif *p = (unsigned int)soap_strtoul(s, &r, 10); if (s == r || *r #ifndef WITH_NOIO #ifndef WITH_LEAN || soap_errno == SOAP_ERANGE #endif #endif ) soap->error = SOAP_TYPE; } return soap->error; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 unsigned int * SOAP_FMAC2 soap_inunsignedInt(struct soap *soap, const char *tag, unsigned int *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; #ifndef WITH_LEAN if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":unsignedInt") && soap_match_tag(soap, soap->type, ":unsignedShort") && soap_match_tag(soap, soap->type, ":unsignedByte")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } #else (void)type; #endif p = (unsigned int*)soap_id_enter(soap, soap->id, p, t, sizeof(unsigned int), NULL, NULL, NULL, NULL); if (*soap->href) p = (unsigned int*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(unsigned int), 0, NULL, NULL); else if (p) { if (soap_s2unsignedInt(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedLong2s(struct soap *soap, unsigned long n) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 20), "%lu", n); return soap->tmpbuf; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outunsignedLong(struct soap *soap, const char *tag, int id, const unsigned long *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_unsignedLong2s(soap, *p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedLong(struct soap *soap, const char *s, unsigned long *p) { if (s) { char *r; #ifndef WITH_NOIO #ifndef WITH_LEAN soap_reset_errno; #endif #endif *p = soap_strtoul(s, &r, 10); if (s == r || *r #ifndef WITH_NOIO #ifndef WITH_LEAN || soap_errno == SOAP_ERANGE #endif #endif ) soap->error = SOAP_TYPE; } return soap->error; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 unsigned long * SOAP_FMAC2 soap_inunsignedLong(struct soap *soap, const char *tag, unsigned long *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; #ifndef WITH_LEAN if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":unsignedInt") && soap_match_tag(soap, soap->type, ":unsignedShort") && soap_match_tag(soap, soap->type, ":unsignedByte")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } #else (void)type; #endif p = (unsigned long*)soap_id_enter(soap, soap->id, p, t, sizeof(unsigned long), NULL, NULL, NULL, NULL); if (*soap->href) p = (unsigned long*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(unsigned long), 0, NULL, NULL); else if (p) { if (soap_s2unsignedLong(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_ULONG642s(struct soap *soap, ULONG64 n) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 20), SOAP_ULONG_FORMAT, n); return soap->tmpbuf; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outULONG64(struct soap *soap, const char *tag, int id, const ULONG64 *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_ULONG642s(soap, *p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2ULONG64(struct soap *soap, const char *s, ULONG64 *p) { if (s) { char *r; #ifndef WITH_NOIO #ifndef WITH_LEAN soap_reset_errno; #endif #endif #ifdef HAVE_STRTOULL *p = soap_strtoull(s, &r, 10); #else *p = (ULONG64)soap_strtoul(s, &r, 10); #endif if (s == r || *r #ifndef WITH_NOIO #ifndef WITH_LEAN || soap_errno == SOAP_ERANGE #endif #endif ) soap->error = SOAP_TYPE; } return soap->error; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 ULONG64 * SOAP_FMAC2 soap_inULONG64(struct soap *soap, const char *tag, ULONG64 *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":positiveInteger") && soap_match_tag(soap, soap->type, ":nonNegativeInteger") && soap_match_tag(soap, soap->type, ":unsignedLong") && soap_match_tag(soap, soap->type, ":unsignedInt") && soap_match_tag(soap, soap->type, ":unsignedShort") && soap_match_tag(soap, soap->type, ":unsignedByte")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } p = (ULONG64*)soap_id_enter(soap, soap->id, p, t, sizeof(ULONG64), NULL, NULL, NULL, NULL); if (*soap->href) p = (ULONG64*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(ULONG64), 0, NULL, NULL); else if (p) { if (soap_s2ULONG64(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2string(struct soap *soap, const char *s, char **t, long minlen, long maxlen) { if (s) { const char *r = soap_string(soap, s, minlen, maxlen); if (r && !(*t = soap_strdup(soap, r))) return soap->error = SOAP_EOM; } return soap->error; } #endif /******************************************************************************/ #ifndef WITH_COMPAT #ifdef __cplusplus #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2std__string(struct soap *soap, const char *s, std::string *t, long minlen, long maxlen) { if (s) { const char *r = soap_string(soap, s, minlen, maxlen); if (r) t->assign(r); } return soap->error; } #endif #endif #endif /******************************************************************************/ #ifndef PALM_2 static const char* soap_string(struct soap *soap, const char *s, long minlen, long maxlen) { if (s) { if (minlen > 0 || maxlen >= 0) { long l; if ((soap->mode & SOAP_C_UTFSTRING)) l = (long)soap_utf8len(s); else l = (long)strlen(s); if (l > maxlen || l < minlen) { soap->error = SOAP_LENGTH; return NULL; } } } return s; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2QName(struct soap *soap, const char *s, char **t, long minlen, long maxlen) { if (s) { const char *r = soap_QName(soap, s, minlen, maxlen); if (r && !(*t = soap_strdup(soap, r))) return soap->error = SOAP_EOM; } return soap->error; } #endif /******************************************************************************/ #ifndef WITH_COMPAT #ifdef __cplusplus #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2std__QName(struct soap *soap, const char *s, std::string *t, long minlen, long maxlen) { if (s) { const char *r = soap_QName(soap, s, minlen, maxlen); if (r) t->assign(r); } return soap->error; } #endif #endif #endif /******************************************************************************/ #ifndef PALM_2 static const char* soap_QName(struct soap *soap, const char *s, long minlen, long maxlen) { if (s) { #ifndef WITH_FAST char *b; #endif if (minlen > 0 || maxlen >= 0) { long l; if ((soap->mode & SOAP_C_UTFSTRING)) l = (long)soap_utf8len(s); else l = (long)strlen(s); if (l > maxlen || l < minlen) { soap->error = SOAP_LENGTH; return NULL; } } #ifdef WITH_FAST soap->labidx = 0; #else if (soap_new_block(soap) == NULL) return NULL; #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Normalized namespace(s) of QNames '%s'", s)); /* convert (by prefix normalize prefix) all QNames in s */ for (;;) { size_t n; struct soap_nlist *np; const char *p = NULL; short flag = 0; const char *r = NULL; size_t m = 0; #ifndef WITH_FAST size_t k = 0; #endif /* skip blanks */ while (*s && soap_blank((soap_wchar)*s)) s++; if (!*s) break; /* find next QName */ n = 1; while (s[n] && !soap_blank((soap_wchar)s[n])) n++; np = soap->nlist; /* if there is no namespace stack, or prefix is "#" or "xml" then copy string */ if (!np || *s == '#' || !strncmp(s, "xml:", 4)) { r = s; m = n; } else /* we normalize the QName by replacing its prefix */ { const char *q; for (p = s; *p && p < s + n; p++) if (*p == ':') break; if (*p == ':') { size_t k = p - s; while (np && (strncmp(np->id, s, k) || np->id[k])) np = np->next; p++; } else { while (np && *np->id) np = np->next; p = s; } /* replace prefix */ if (np) { if (np->index >= 0 && soap->local_namespaces && (q = soap->local_namespaces[np->index].id)) { size_t k = strlen(q); if (q[k-1] != '_') { r = q; m = k; } else { flag = 1; r = soap->local_namespaces[np->index].ns; m = strlen(r); } } else if (np->ns) { flag = 1; r = np->ns; m = strlen(r); } else { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\nNamespace prefix of '%s' not defined (index=%d, URI='%s')\n", s, np->index, np->ns ? np->ns : SOAP_STR_EOS)); soap->error = SOAP_NAMESPACE; return NULL; } } else if (s[n]) /* no namespace, part of string */ { r = s; m = n; } else /* no namespace: assume "" namespace */ { flag = 1; } } #ifdef WITH_FAST if ((flag && soap_append_lab(soap, "\"", 1)) || (m && soap_append_lab(soap, r, m)) || (flag && soap_append_lab(soap, "\"", 1)) || (p && (soap_append_lab(soap, ":", 1) || soap_append_lab(soap, p, n - (p-s))))) return NULL; #else k = 2*flag + m + (p ? n - (p-s) + 1 : 0) + (s[n] != '\0'); b = (char*)soap_push_block(soap, NULL, k); if (!b) return NULL; if (flag) *b++ = '"'; if (m) { if (soap_memcpy((void*)b, k, (const void*)r, m)) { soap->error = SOAP_EOM; return NULL; } b += m; } if (flag) *b++ = '"'; if (p) { *b++ = ':'; if (soap_memcpy((void*)b, k - m - flag - 1, (const void*)p, n - (p-s))) { soap->error = SOAP_EOM; return NULL; } b += n - (p-s); } #endif /* advance to next and add spacing */ s += n; if (*s) { #ifdef WITH_FAST if (soap_append_lab(soap, " ", 1)) return NULL; #else *b = ' '; #endif } } #ifdef WITH_FAST if (soap_append_lab(soap, SOAP_STR_EOS, 1)) return NULL; return soap->labbuf; #else b = (char*)soap_push_block(soap, NULL, 1); if (!b) return NULL; *b = '\0'; return (char*)soap_save_block(soap, NULL, NULL, 0); #endif } return NULL; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_QName2s(struct soap *soap, const char *s) { const char *t = NULL; if (s) { #ifdef WITH_FAST soap->labidx = 0; #else char *b; if (soap_new_block(soap) == NULL) return NULL; #endif for (;;) { size_t n; const char *q = NULL; const char *r = NULL; size_t m = 0; #ifndef WITH_FAST size_t k = 0; #endif /* skip blanks */ while (*s && soap_blank((soap_wchar)*s)) s++; if (!*s) break; /* find next QName */ n = 0; while (s[n] && !soap_blank((soap_wchar)s[n])) n++; /* normal prefix: pass string as is */ if (*s != '"') { #ifndef WITH_LEAN if ((soap->mode & SOAP_XML_CANONICAL)) soap_utilize_ns(soap, s); if ((soap->mode & SOAP_XML_DEFAULTNS)) { r = strchr(s, ':'); if (r && soap->nlist && !strncmp(soap->nlist->id, s, r - s) && !soap->nlist->id[r - s]) { n -= r - s + 1; s = r + 1; } } #endif r = s; m = n + 1; } else /* URL-based string prefix */ { s++; q = strchr(s, '"'); if (q) { struct Namespace *p = soap->local_namespaces; if (p) { for (; p->id; p++) { if (p->ns) if (!soap_tag_cmp(s, p->ns)) break; if (p->in) if (!soap_tag_cmp(s, p->in)) break; } } q++; /* URL is in the namespace table? */ if (p && p->id) { r = p->id; #ifndef WITH_LEAN if ((soap->mode & SOAP_XML_DEFAULTNS) && soap->nlist && !strcmp(soap->nlist->id, r)) q++; else #endif m = strlen(r); } else /* not in namespace table: create xmlns binding */ { char *x = soap_strdup(soap, s); x[q - s - 1] = '\0'; (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 27), "xmlns:_%d", soap->idnum++); soap_set_attr(soap, soap->tmpbuf, x, 1); r = soap->tmpbuf + 6; m = strlen(r); } } } /* copy normalized QName into buffer, including the ending blank or NUL */ #ifdef WITH_FAST if ((m && soap_append_lab(soap, r, m)) || (q && soap_append_lab(soap, q, n - (q - s)))) return NULL; #else k = m + (q ? n - (q - s) : 0); b = (char*)soap_push_block(soap, NULL, k); if (soap_memcpy((void*)b, k, (const void*)r, m)) { soap->error = SOAP_EOM; return NULL; } b += m; if (q) { if (soap_memcpy((void*)b, k - m, (const void*)q, n - (q - s))) { soap->error = SOAP_EOM; return NULL; } b += n - (q - s); } #endif /* advance to next */ s += n; } #ifdef WITH_FAST t = soap_strdup(soap, soap->labbuf); #else t = (char*)soap_save_block(soap, NULL, NULL, 0); #endif } return t; } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 int SOAP_FMAC2 soap_s2wchar(struct soap *soap, const char *s, wchar_t **t, long minlen, long maxlen) { if (s) { const wchar_t *r = soap_wstring(soap, s, minlen, maxlen); if (r && !(*t = soap_wstrdup(soap, r))) return soap->error = SOAP_EOM; } return soap->error; } #endif /******************************************************************************/ #ifndef WITH_COMPAT #ifdef __cplusplus #ifndef WITH_LEAN SOAP_FMAC1 int SOAP_FMAC2 soap_s2std__wstring(struct soap *soap, const char *s, std::wstring *t, long minlen, long maxlen) { if (s) { const wchar_t *r = soap_wstring(soap, s, minlen, maxlen); if (r) t->assign(r); } return soap->error; } #endif #endif #endif /******************************************************************************/ #ifndef WITH_LEAN static const wchar_t* soap_wstring(struct soap *soap, const char *s, long minlen, long maxlen) { if (s) { long l; wchar_t wc; soap->labidx = 0; if (soap->mode & SOAP_ENC_LATIN) { wchar_t *r; if (soap_append_lab(soap, NULL, sizeof(wchar_t) * (strlen(s) + 1))) return NULL; r = (wchar_t*)soap->labbuf; while (*s) *r++ = (wchar_t)*s++; } else { /* Convert UTF8 to wchar */ while (*s) { soap_wchar c, c1, c2, c3, c4; c = (unsigned char)*s++; if (c < 0x80) wc = (wchar_t)c; else { c1 = (soap_wchar)*s++ & 0x3F; if (c < 0xE0) wc = (wchar_t)(((soap_wchar)(c & 0x1F) << 6) | c1); else { c2 = (soap_wchar)*s++ & 0x3F; if (c < 0xF0) wc = (wchar_t)(((soap_wchar)(c & 0x0F) << 12) | (c1 << 6) | c2); else { c3 = (soap_wchar)*s++ & 0x3F; if (c < 0xF8) wc = (wchar_t)(((soap_wchar)(c & 0x07) << 18) | (c1 << 12) | (c2 << 6) | c3); else { c4 = (soap_wchar)*s++ & 0x3F; if (c < 0xFC) wc = (wchar_t)(((soap_wchar)(c & 0x03) << 24) | (c1 << 18) | (c2 << 12) | (c3 << 6) | c4); else wc = (wchar_t)(((soap_wchar)(c & 0x01) << 30) | (c1 << 24) | (c2 << 18) | (c3 << 12) | (c4 << 6) | (soap_wchar)(*s++ & 0x3F)); } } } } if (soap_append_lab(soap, (const char*)&wc, sizeof(wc))) return NULL; } } l = (long)(soap->labidx / sizeof(wchar_t)); wc = L'\0'; if (soap_append_lab(soap, (const char*)&wc, sizeof(wc))) return NULL; if ((maxlen >= 0 && l > maxlen) || l < minlen) { soap->error = SOAP_LENGTH; return NULL; } return (wchar_t*)soap->labbuf; } return NULL; } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 const char* SOAP_FMAC2 soap_wchar2s(struct soap *soap, const wchar_t *s) { soap_wchar c; char *r, *t; const wchar_t *q = s; size_t n = 0; if (!s) return NULL; while ((c = *q++)) { if (c > 0 && c < 0x80) n++; else n += 6; } r = t = (char*)soap_malloc(soap, n + 1); if (r) { /* Convert wchar to UTF8 */ while ((c = *s++)) { if (c > 0 && c < 0x80) *t++ = (char)c; else { if (c < 0x0800) *t++ = (char)(0xC0 | ((c >> 6) & 0x1F)); else { if (c < 0x010000) *t++ = (char)(0xE0 | ((c >> 12) & 0x0F)); else { if (c < 0x200000) *t++ = (char)(0xF0 | ((c >> 18) & 0x07)); else { if (c < 0x04000000) *t++ = (char)(0xF8 | ((c >> 24) & 0x03)); else { *t++ = (char)(0xFC | ((c >> 30) & 0x01)); *t++ = (char)(0x80 | ((c >> 24) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 18) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 12) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 6) & 0x3F)); } *t++ = (char)(0x80 | (c & 0x3F)); } } *t = '\0'; } return r; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outstring(struct soap *soap, const char *tag, int id, char *const*p, const char *type, int n) { id = soap_element_id(soap, tag, id, *p, NULL, 0, type, n, NULL); if (id < 0) return soap->error; if (!**p && (soap->mode & SOAP_C_NILSTRING)) return soap_element_null(soap, tag, id, type); if (soap_element_begin_out(soap, tag, id, type) || soap_string_out(soap, *p, 0) || soap_element_end_out(soap, tag)) return soap->error; return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 char ** SOAP_FMAC2 soap_instring(struct soap *soap, const char *tag, char **p, const char *type, int t, int flag, long minlen, long maxlen, const char *pattern) { (void)type; if (soap_element_begin_in(soap, tag, 1, NULL)) { if (!tag || *tag != '-' || soap->error != SOAP_NO_TAG) return NULL; soap->error = SOAP_OK; } if (!p) { if (!(p = (char**)soap_malloc(soap, sizeof(char*)))) return NULL; } if (soap->null) *p = NULL; else if (soap->body) { *p = soap_string_in(soap, flag, minlen, maxlen, pattern); if (!*p || !(char*)soap_id_enter(soap, soap->id, *p, t, sizeof(char*), NULL, NULL, NULL, NULL)) return NULL; if (!**p && tag && *tag == '-') { soap->error = SOAP_NO_TAG; return NULL; } } else if (tag && *tag == '-') { soap->error = SOAP_NO_TAG; return NULL; } else if (!*soap->href) { if (minlen > 0) { soap->error = SOAP_LENGTH; return NULL; } *p = soap_strdup(soap, SOAP_STR_EOS); } if (*soap->href) p = (char**)soap_id_lookup(soap, soap->href, (void**)p, t, sizeof(char**), 0, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outwstring(struct soap *soap, const char *tag, int id, wchar_t *const*p, const char *type, int n) { id = soap_element_id(soap, tag, id, *p, NULL, 0, type, n, NULL); if (id < 0) return soap->error; if (!**p && (soap->mode & SOAP_C_NILSTRING)) return soap_element_null(soap, tag, id, type); if (soap_element_begin_out(soap, tag, id, type) || soap_wstring_out(soap, *p, 0) || soap_element_end_out(soap, tag)) return soap->error; return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_2 SOAP_FMAC1 wchar_t ** SOAP_FMAC2 soap_inwstring(struct soap *soap, const char *tag, wchar_t **p, const char *type, int t, long minlen, long maxlen, const char *pattern) { (void)type; if (soap_element_begin_in(soap, tag, 1, NULL)) { if (!tag || *tag != '-' || soap->error != SOAP_NO_TAG) return NULL; soap->error = SOAP_OK; } if (!p) { if (!(p = (wchar_t**)soap_malloc(soap, sizeof(wchar_t*)))) return NULL; } if (soap->null) *p = NULL; else if (soap->body) { *p = soap_wstring_in(soap, 1, minlen, maxlen, pattern); if (!*p || !(wchar_t*)soap_id_enter(soap, soap->id, *p, t, sizeof(wchar_t*), NULL, NULL, NULL, NULL)) return NULL; if (!**p && tag && *tag == '-') { soap->error = SOAP_NO_TAG; return NULL; } } else if (tag && *tag == '-') { soap->error = SOAP_NO_TAG; return NULL; } else if (!*soap->href) { if (minlen > 0) { soap->error = SOAP_LENGTH; return NULL; } *p = soap_wstrdup(soap, (wchar_t*)SOAP_STR_EOS); } if (*soap->href) p = (wchar_t**)soap_id_lookup(soap, soap->href, (void**)p, t, sizeof(wchar_t**), 0, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif #endif /******************************************************************************/ #ifndef WITH_LEAN #ifdef UNDER_CE /* WinCE mktime (based on the mingw-runtime, public domain) */ #define __FILETIME_to_ll(f) ((long long)(f).dwHighDateTime << 32 | (long long)(f).dwLowDateTime) static time_t mktime(struct tm *pt) { SYSTEMTIME s, s1, s2; FILETIME f, f1, f2; long long diff; GetSystemTime(&s1); GetLocalTime(&s2); SystemTimeToFileTime(&s1, &f1); SystemTimeToFileTime(&s2, &f2); diff = (__FILETIME_to_ll(f2) - __FILETIME_to_ll(f1)) / 10000000LL; s.wYear = pt->tm_year + 1900; s.wMonth = pt->tm_mon + 1; s.wDayOfWeek = pt->tm_wday; s.wDay = pt->tm_mday; s.wHour = pt->tm_hour; s.wMinute = pt->tm_min; s.wSecond = pt->tm_sec; s.wMilliseconds = 0; SystemTimeToFileTime(&s, &f); return (time_t)((__FILETIME_to_ll(f) - 116444736000000000LL) / 10000000LL) - (time_t)diff; } #endif #endif /******************************************************************************/ #ifndef WITH_LEAN #ifdef UNDER_CE /* WinCE gmtime_r (based on the mingw-runtime, public domain) */ #define HAVE_GMTIME_R static struct tm* gmtime_r(const time_t *t, struct tm *pt) { FILETIME f, f1, f2; SYSTEMTIME s, s1 = {0}; long long time = (long long)(*t) * 10000000LL + 116444736000000000LL; f.dwHighDateTime = (DWORD)((time >> 32) & 0x00000000FFFFFFFF); f.dwLowDateTime = (DWORD)(time & 0x00000000FFFFFFFF); FileTimeToSystemTime(&f, &s); pt->tm_year = s.wYear - 1900; pt->tm_mon = s.wMonth - 1; pt->tm_wday = s.wDayOfWeek; pt->tm_mday = s.wDay; s1.wYear = s.wYear; s1.wMonth = 1; s1.wDayOfWeek = 1; s1.wDay = 1; SystemTimeToFileTime(&s1, &f1); SystemTimeToFileTime(&s, &f2); pt->tm_yday = (((__FILETIME_to_ll(f2) - __FILETIME_to_ll(f1)) / 10000000LL) / (60 * 60 * 24)); pt->tm_hour = s.wHour; pt->tm_min = s.wMinute; pt->tm_sec = s.wSecond; pt->tm_isdst = 0; return pt; } #endif #endif /******************************************************************************/ #ifndef WITH_LEAN #ifdef UNDER_CE /* WinCE very simple strftime for format "%Y-%m-%dT%H:%M:%SZ", note: %F and %T not supported by MS */ static size_t strftime(char *buf, size_t len, const char *format, const struct tm *pT) { (void)len; (void)format; #ifndef WITH_NOZONE (SOAP_SNPRINTF(buf, len, 20), "%04d-%02d-%02dT%02d:%02d:%02dZ", pT->tm_year + 1900, pT->tm_mon + 1, pT->tm_mday, pT->tm_hour, pT->tm_min, pT->tm_sec); #else (SOAP_SNPRINTF(buf, len, 20), "%04d-%02d-%02dT%02d:%02d:%02d", pT->tm_year + 1900, pT->tm_mon + 1, pT->tm_mday, pT->tm_hour, pT->tm_min, pT->tm_sec); #endif return len; } #endif #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 time_t SOAP_FMAC2 soap_timegm(struct tm *T) { #if defined(HAVE_TIMEGM) return timegm(T); #else time_t t, g, z; struct tm tm; #ifndef HAVE_GMTIME_R struct tm *tp; #endif t = mktime(T); if (t == (time_t)-1) return (time_t)-1; #ifdef HAVE_GMTIME_R if (gmtime_r(&t, &tm) == SOAP_FUNC_R_ERR) return (time_t)-1; #else tp = gmtime(&t); if (!tp) return (time_t)-1; tm = *tp; #endif tm.tm_isdst = 0; g = mktime(&tm); if (g == (time_t)-1) return (time_t)-1; z = g - t; return t - z; #endif } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 const char* SOAP_FMAC2 soap_dateTime2s(struct soap *soap, time_t n) { struct tm T, *pT = &T; #if defined(HAVE_GMTIME_R) && !defined(WITH_NOZONE) if (gmtime_r(&n, pT) != SOAP_FUNC_R_ERR) strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%SZ", pT); #elif defined(HAVE_GMTIME) && !defined(WITH_NOZONE) if ((pT = gmtime(&n))) strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%SZ", pT); #elif (defined(HAVE_TM_GMTOFF) || defined(HAVE_STRUCT_TM_TM_GMTOFF) || defined(HAVE_STRUCT_TM___TM_GMTOFF)) && !defined(WITH_NOZONE) #if defined(HAVE_LOCALTIME_R) if (localtime_r(&n, pT) != SOAP_FUNC_R_ERR) { strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S%z", pT); soap_memmove(soap->tmpbuf + 23, sizeof(soap->tmpbuf) - 23, soap->tmpbuf + 22, 3); /* 2000-03-01T02:00:00+0300 */ soap->tmpbuf[22] = ':'; /* 2000-03-01T02:00:00+03:00 */ } #else if ((pT = localtime(&n))) { strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S%z", pT); soap_memmove(soap->tmpbuf + 23, sizeof(soap->tmpbuf) - 23, soap->tmpbuf + 22, 3); /* 2000-03-01T02:00:00+0300 */ soap->tmpbuf[22] = ':'; /* 2000-03-01T02:00:00+03:00 */ } #endif #elif defined(HAVE_GETTIMEOFDAY) && !defined(WITH_NOZONE) struct timezone tz; memset((void*)&tz, 0, sizeof(tz)); #if defined(HAVE_LOCALTIME_R) if (localtime_r(&n, pT) != SOAP_FUNC_R_ERR) { struct timeval tv; size_t l; gettimeofday(&tv, &tz); strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT); l = strlen(soap->tmpbuf); (SOAP_SNPRINTF(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, 7), "%+03d:%02d", -tz.tz_minuteswest/60+(pT->tm_isdst!=0), abs(tz.tz_minuteswest)%60); } #else if ((pT = localtime(&n))) { struct timeval tv; size_t l; gettimeofday(&tv, &tz); strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT); l = strlen(soap->tmpbuf); (SOAP_SNPRINTF(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, 7), "%+03d:%02d", -tz.tz_minuteswest/60+(pT->tm_isdst!=0), abs(tz.tz_minuteswest)%60); } #endif #elif defined(HAVE_FTIME) && !defined(WITH_NOZONE) struct timeb t; memset((void*)&t, 0, sizeof(t)); #if defined(HAVE_LOCALTIME_R) if (localtime_r(&n, pT) != SOAP_FUNC_R_ERR) { size_t l; #ifdef __BORLANDC__ ::ftime(&t); #else ftime(&t); #endif strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT); l = strlen(soap->tmpbuf); (SOAP_SNPRINTF(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, 7), "%+03d:%02d", -t.timezone/60+(pT->tm_isdst!=0), abs(t.timezone)%60); } #else if ((pT = localtime(&n))) { size_t l; #ifdef __BORLANDC__ ::ftime(&t); #else ftime(&t); #endif strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT); l = strlen(soap->tmpbuf); (SOAP_SNPRINTF(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, 7), "%+03d:%02d", -t.timezone/60+(pT->tm_isdst!=0), abs(t.timezone)%60); } #endif #elif defined(HAVE_LOCALTIME_R) if (localtime_r(&n, pT) != SOAP_FUNC_R_ERR) strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT); #else if ((pT = localtime(&n))) strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT); #endif else soap_strcpy(soap->tmpbuf, sizeof(soap->tmpbuf), "1969-12-31T23:59:59Z"); return soap->tmpbuf; } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 int SOAP_FMAC2 soap_outdateTime(struct soap *soap, const char *tag, int id, const time_t *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_dateTime2s(soap, *p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 int SOAP_FMAC2 soap_s2dateTime(struct soap *soap, const char *s, time_t *p) { *p = 0; if (s) { char *t; unsigned long d; struct tm T; memset((void*)&T, 0, sizeof(T)); d = soap_strtoul(s, &t, 10); if (*t == '-') { /* YYYY-MM-DD */ T.tm_year = (int)d; T.tm_mon = (int)soap_strtoul(t + 1, &t, 10); T.tm_mday = (int)soap_strtoul(t + 1, &t, 10); } else if (!(soap->mode & SOAP_XML_STRICT)) { /* YYYYMMDD */ T.tm_year = (int)(d / 10000); T.tm_mon = (int)(d / 100 % 100); T.tm_mday = (int)(d % 100); } else return soap->error = SOAP_TYPE; if (*t == 'T' || ((*t == 't' || *t == ' ') && !(soap->mode & SOAP_XML_STRICT))) { d = soap_strtoul(t + 1, &t, 10); if (*t == ':') { /* Thh:mm:ss */ T.tm_hour = (int)d; T.tm_min = (int)soap_strtoul(t + 1, &t, 10); T.tm_sec = (int)soap_strtoul(t + 1, &t, 10); } else if (!(soap->mode & SOAP_XML_STRICT)) { /* Thhmmss */ T.tm_hour = (int)(d / 10000); T.tm_min = (int)(d / 100 % 100); T.tm_sec = (int)(d % 100); } else return soap->error = SOAP_TYPE; } if (T.tm_year == 1) T.tm_year = 70; else T.tm_year -= 1900; T.tm_mon--; if (*t == '.') { for (t++; *t; t++) if (*t < '0' || *t > '9') break; } if (*t == ' ' && !(soap->mode & SOAP_XML_STRICT)) t++; if (*t) { #ifndef WITH_NOZONE if (*t == '+' || *t == '-') { int h, m; m = (int)soap_strtol(t, &t, 10); if (*t == ':') { /* +hh:mm */ h = m; m = (int)soap_strtol(t + 1, &t, 10); if (h < 0) m = -m; } else if (!(soap->mode & SOAP_XML_STRICT)) { /* +hhmm */ h = m / 100; m = m % 100; } else { /* +hh */ h = m; m = 0; } if (*t) return soap->error = SOAP_TYPE; T.tm_min -= m; T.tm_hour -= h; /* put hour and min in range */ T.tm_hour += T.tm_min / 60; T.tm_min %= 60; if (T.tm_min < 0) { T.tm_min += 60; T.tm_hour--; } T.tm_mday += T.tm_hour / 24; T.tm_hour %= 24; if (T.tm_hour < 0) { T.tm_hour += 24; T.tm_mday--; } /* note: day of the month may be out of range, timegm() handles it */ } else if (*t != 'Z') return soap->error = SOAP_TYPE; #endif *p = soap_timegm(&T); } else /* no UTC or timezone, so assume we got a localtime */ { T.tm_isdst = -1; *p = mktime(&T); } } return soap->error; } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 time_t * SOAP_FMAC2 soap_indateTime(struct soap *soap, const char *tag, time_t *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":dateTime")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } p = (time_t*)soap_id_enter(soap, soap->id, p, t, sizeof(time_t), NULL, NULL, NULL, NULL); if (*soap->href) p = (time_t*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(time_t), 0, NULL, NULL); else if (p) { if (soap_s2dateTime(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outliteral(struct soap *soap, const char *tag, char *const*p, const char *type) { int i; const char *t = NULL; if (tag && *tag != '-') { if (soap->local_namespaces && (t = strchr(tag, ':'))) { size_t n = t - tag; if (n >= sizeof(soap->tmpbuf)) n = sizeof(soap->tmpbuf) - 1; soap_strncpy(soap->tmpbuf, sizeof(soap->tmpbuf), tag, n); for (i = 0; soap->local_namespaces[i].id; i++) if (!strcmp(soap->tmpbuf, soap->local_namespaces[i].id)) break; t++; if (soap_element(soap, t, 0, type) || soap_attribute(soap, "xmlns", soap->local_namespaces[i].ns ? soap->local_namespaces[i].ns : SOAP_STR_EOS) || soap_element_start_end_out(soap, NULL)) return soap->error; } else { t = tag; if (soap_element_begin_out(soap, t, 0, type)) return soap->error; } } if (p && *p) { if (soap_send(soap, *p)) /* send as-is */ return soap->error; } if (t) return soap_element_end_out(soap, t); return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 char ** SOAP_FMAC2 soap_inliteral(struct soap *soap, const char *tag, char **p) { if (soap_element_begin_in(soap, tag, 1, NULL)) { if (soap->error != SOAP_NO_TAG || soap_unget(soap, soap_get(soap)) == SOAP_TT) return NULL; soap->error = SOAP_OK; } if (!p) { if (!(p = (char**)soap_malloc(soap, sizeof(char*)))) return NULL; } if (soap->body || (tag && *tag == '-')) { if (tag && *tag != '-') *p = soap_string_in(soap, -1, -1, -1, NULL); else *p = soap_string_in(soap, 0, -1, -1, NULL); if (!*p) return NULL; if (!**p && tag && *tag == '-') { soap->error = SOAP_NO_TAG; return NULL; } } else if (soap->null) *p = NULL; else *p = soap_strdup(soap, SOAP_STR_EOS); if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outwliteral(struct soap *soap, const char *tag, wchar_t *const*p, const char *type) { int i; const char *t = NULL; if (tag && *tag != '-') { if (soap->local_namespaces && (t = strchr(tag, ':'))) { size_t n = t - tag; if (n >= sizeof(soap->tmpbuf)) n = sizeof(soap->tmpbuf) - 1; soap_strncpy(soap->tmpbuf, sizeof(soap->tmpbuf), tag, n); for (i = 0; soap->local_namespaces[i].id; i++) if (!strcmp(soap->tmpbuf, soap->local_namespaces[i].id)) break; t++; if (soap_element(soap, t, 0, type) || soap_attribute(soap, "xmlns", soap->local_namespaces[i].ns ? soap->local_namespaces[i].ns : SOAP_STR_EOS) || soap_element_start_end_out(soap, NULL)) return soap->error; } else { t = tag; if (soap_element_begin_out(soap, t, 0, type)) return soap->error; } } if (p) { wchar_t c; const wchar_t *s = *p; while ((c = *s++)) { if (soap_pututf8(soap, (unsigned long)c)) /* send as-is in UTF8 */ return soap->error; } } if (t) return soap_element_end_out(soap, t); return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_2 SOAP_FMAC1 wchar_t ** SOAP_FMAC2 soap_inwliteral(struct soap *soap, const char *tag, wchar_t **p) { if (soap_element_begin_in(soap, tag, 1, NULL)) { if (soap->error != SOAP_NO_TAG || soap_unget(soap, soap_get(soap)) == SOAP_TT) return NULL; soap->error = SOAP_OK; } if (!p) { if (!(p = (wchar_t**)soap_malloc(soap, sizeof(wchar_t*)))) return NULL; } if (soap->body) { if (tag && *tag != '-') *p = soap_wstring_in(soap, -1, -1, -1, NULL); else *p = soap_wstring_in(soap, 0, -1, -1, NULL); if (!*p) return NULL; if (!**p && tag && *tag == '-') { soap->error = SOAP_NO_TAG; return NULL; } } else if (tag && *tag == '-') { soap->error = SOAP_NO_TAG; return NULL; } else if (soap->null) *p = NULL; else *p = soap_wstrdup(soap, (wchar_t*)SOAP_STR_EOS); if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char * SOAP_FMAC2 soap_value(struct soap *soap) { size_t i; soap_wchar c = 0; char *s = soap->tmpbuf; if (!soap->body) return SOAP_STR_EOS; do c = soap_get(soap); while (soap_blank(c)); for (i = 0; i < sizeof(soap->tmpbuf) - 1; i++) { if (c == SOAP_TT || c == SOAP_LT || (int)c == EOF) break; *s++ = (char)c; c = soap_get(soap); } for (s--; i > 0; i--, s--) { if (!soap_blank((soap_wchar)*s)) break; } s[1] = '\0'; soap->tmpbuf[sizeof(soap->tmpbuf) - 1] = '\0'; /* appease */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element content value='%s'\n", soap->tmpbuf)); if (c == SOAP_TT || c == SOAP_LT || (int)c == EOF) soap_unget(soap, c); else { soap->error = SOAP_LENGTH; return NULL; } #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) soap->dom->text = soap_strdup(soap, soap->tmpbuf); #endif return soap->tmpbuf; /* return non-null pointer */ } #endif /******************************************************************************/ #if !defined(WITH_LEANER) || !defined(WITH_NOHTTP) #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_getline(struct soap *soap, char *buf, int len) { char *s = buf; int i = len; soap_wchar c = 0; for (;;) { while (--i > 0) { c = soap_getchar(soap); if (c == '\r' || c == '\n') break; if ((int)c == EOF) return soap->error = SOAP_CHK_EOF; *s++ = (char)c; } *s = '\0'; if (c != '\n') c = soap_getchar(soap); /* got \r or something else, now get \n */ if (c == '\n') { if (i + 1 == len) /* empty line: end of HTTP/MIME header */ break; c = soap_get0(soap); if (c != ' ' && c != '\t') /* HTTP line continuation? */ break; } else if ((int)c == EOF) return soap->error = SOAP_CHK_EOF; if (i <= 0) return soap->error = SOAP_HDR; } return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef PALM_1 static size_t soap_count_attachments(struct soap *soap) { #ifndef WITH_LEANER struct soap_multipart *content; size_t count = soap->count; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Calculating the message size with attachments, current count=%lu\n", (unsigned long)count)); if ((soap->mode & SOAP_ENC_DIME) && !(soap->mode & SOAP_ENC_MTOM)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Calculating the size of DIME attachments\n")); for (content = soap->dime.first; content; content = content->next) { count += 12 + ((content->size+3)&(~3)); if (content->id) count += ((strlen(content->id)+3)&(~3)); if (content->type) count += ((strlen(content->type)+3)&(~3)); if (content->options) count += ((((unsigned char)content->options[2] << 8) | ((unsigned char)content->options[3]))+7)&(~3); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Size of DIME attachment content is %lu bytes\n", (unsigned long)content->size)); } } if ((soap->mode & SOAP_ENC_MIME) && soap->mime.boundary) { size_t n = strlen(soap->mime.boundary); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Calculating the size of MIME attachments\n")); for (content = soap->mime.first; content; content = content->next) { const char *s; /* count \r\n--boundary\r\n */ count += 6 + n; /* count Content-Type: ...\r\n */ if (content->type) count += 16 + strlen(content->type); /* count Content-Transfer-Encoding: ...\r\n */ s = soap_code_str(mime_codes, content->encoding); if (s) count += 29 + strlen(s); /* count Content-ID: ...\r\n */ if (content->id) count += 14 + strlen(content->id); /* count Content-Location: ...\r\n */ if (content->location) count += 20 + strlen(content->location); /* count Content-Description: ...\r\n */ if (content->description) count += 23 + strlen(content->description); /* count \r\n...content */ count += 2 + content->size; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Size of MIME attachment content is %lu bytes\n", (unsigned long)content->size)); } /* count \r\n--boundary-- */ count += 6 + n; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "New count=%lu\n", (unsigned long)count)); return count; #else return soap->count; #endif } #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 static int soap_putdimefield(struct soap *soap, const char *s, size_t n) { if (soap_send_raw(soap, s, n)) return soap->error; return soap_send_raw(soap, SOAP_STR_PADDING, -(long)n&3); } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 char * SOAP_FMAC2 soap_dime_option(struct soap *soap, unsigned short optype, const char *option) { size_t n; char *s = NULL; if (option) { n = strlen(option); s = (char*)soap_malloc(soap, n + 5); if (s) { s[0] = (char)(optype >> 8); s[1] = (char)(optype & 0xFF); s[2] = (char)(n >> 8); s[3] = (char)(n & 0xFF); soap_strcpy(s + 4, n + 1, option); } } return s; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_putdimehdr(struct soap *soap) { unsigned char tmp[12]; size_t optlen = 0, idlen = 0, typelen = 0; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Put DIME header id='%s'\n", soap->dime.id ? soap->dime.id : SOAP_STR_EOS)); if (soap->dime.options) optlen = (((unsigned char)soap->dime.options[2] << 8) | ((unsigned char)soap->dime.options[3])) + 4; if (soap->dime.id) { idlen = strlen(soap->dime.id); if (idlen > 0x0000FFFF) idlen = 0x0000FFFF; } if (soap->dime.type) { typelen = strlen(soap->dime.type); if (typelen > 0x0000FFFF) typelen = 0x0000FFFF; } tmp[0] = SOAP_DIME_VERSION | (soap->dime.flags & 0x7); tmp[1] = soap->dime.flags & 0xF0; tmp[2] = (char)(optlen >> 8); tmp[3] = (char)(optlen & 0xFF); tmp[4] = (char)(idlen >> 8); tmp[5] = (char)(idlen & 0xFF); tmp[6] = (char)(typelen >> 8); tmp[7] = (char)(typelen & 0xFF); tmp[8] = (char)(soap->dime.size >> 24); tmp[9] = (char)((soap->dime.size >> 16) & 0xFF); tmp[10] = (char)((soap->dime.size >> 8) & 0xFF); tmp[11] = (char)(soap->dime.size & 0xFF); if (soap_send_raw(soap, (char*)tmp, 12) || soap_putdimefield(soap, soap->dime.options, optlen) || soap_putdimefield(soap, soap->dime.id, idlen) || soap_putdimefield(soap, soap->dime.type, typelen)) return soap->error; return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_putdime(struct soap *soap) { struct soap_multipart *content; if (!(soap->mode & SOAP_ENC_DIME)) return SOAP_OK; for (content = soap->dime.first; content; content = content->next) { void *handle; soap->dime.size = content->size; soap->dime.id = content->id; soap->dime.type = content->type; soap->dime.options = content->options; soap->dime.flags = SOAP_DIME_VERSION | SOAP_DIME_MEDIA; if (soap->fdimereadopen && ((handle = soap->fdimereadopen(soap, (void*)content->ptr, content->id, content->type, content->options)) || soap->error)) { size_t size = content->size; if (!handle) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fdimereadopen failed\n")); return soap->error; } if (!size && ((soap->mode & SOAP_ENC_XML) || (soap->mode & SOAP_IO) == SOAP_IO_CHUNK || (soap->mode & SOAP_IO) == SOAP_IO_STORE)) { size_t chunksize = sizeof(soap->tmpbuf); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Chunked streaming DIME\n")); do { size = soap->fdimeread(soap, handle, soap->tmpbuf, chunksize); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fdimeread returned %lu bytes\n", (unsigned long)size)); if (size < chunksize) { soap->dime.flags &= ~SOAP_DIME_CF; if (!content->next) soap->dime.flags |= SOAP_DIME_ME; } else soap->dime.flags |= SOAP_DIME_CF; soap->dime.size = size; if (soap_putdimehdr(soap) || soap_putdimefield(soap, soap->tmpbuf, size)) break; if (soap->dime.id) { soap->dime.flags &= ~(SOAP_DIME_MB | SOAP_DIME_MEDIA); soap->dime.id = NULL; soap->dime.type = NULL; soap->dime.options = NULL; } } while (size >= chunksize); } else { if (!content->next) soap->dime.flags |= SOAP_DIME_ME; if (soap_putdimehdr(soap)) return soap->error; do { size_t bufsize; if (size < sizeof(soap->tmpbuf)) bufsize = size; else bufsize = sizeof(soap->tmpbuf); if (!(bufsize = soap->fdimeread(soap, handle, soap->tmpbuf, bufsize))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fdimeread failed: insufficient data (%lu bytes remaining from %lu bytes)\n", (unsigned long)size, (unsigned long)content->size)); soap->error = SOAP_CHK_EOF; break; } if (soap_send_raw(soap, soap->tmpbuf, bufsize)) break; size -= bufsize; } while (size); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fdimereadclose\n")); soap_send_raw(soap, SOAP_STR_PADDING, -(long)soap->dime.size&3); } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fdimereadclose\n")); if (soap->fdimereadclose) soap->fdimereadclose(soap, handle); } else { if (!content->next) soap->dime.flags |= SOAP_DIME_ME; if (soap_putdimehdr(soap) || soap_putdimefield(soap, (char*)content->ptr, content->size)) return soap->error; } } return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 static char * soap_getdimefield(struct soap *soap, size_t n) { soap_wchar c; size_t i; char *s; char *p = NULL; if (n) { p = (char*)soap_malloc(soap, n + 1); if (p) { s = p; for (i = n; i > 0; i--) { if ((int)(c = soap_get1(soap)) == EOF) { soap->error = SOAP_CHK_EOF; return NULL; } *s++ = (char)c; } *s = '\0'; /* force NUL terminated */ if ((soap->error = soap_move(soap, (size_t)(-(long)n&3)))) return NULL; } else soap->error = SOAP_EOM; } return p; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_getdimehdr(struct soap *soap) { soap_wchar c; char *s; int i; unsigned char tmp[12]; size_t optlen, idlen, typelen; if (!(soap->mode & SOAP_ENC_DIME)) return soap->error = SOAP_DIME_END; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get DIME header\n")); if (soap->dime.buflen || soap->dime.chunksize) { if (soap_move(soap, soap->dime.size - soap_tell(soap))) return soap->error = SOAP_CHK_EOF; soap_unget(soap, soap_getchar(soap)); /* skip padding and get hdr */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "... From chunked\n")); return SOAP_OK; } s = (char*)tmp; for (i = 12; i > 0; i--) { if ((int)(c = soap_getchar(soap)) == EOF) return soap->error = SOAP_CHK_EOF; *s++ = (char)c; } if ((tmp[0] & 0xF8) != SOAP_DIME_VERSION) return soap->error = SOAP_DIME_MISMATCH; soap->dime.flags = (tmp[0] & 0x7) | (tmp[1] & 0xF0); optlen = (tmp[2] << 8) | tmp[3]; idlen = (tmp[4] << 8) | tmp[5]; typelen = (tmp[6] << 8) | tmp[7]; soap->dime.size = ((size_t)tmp[8] << 24) | ((size_t)tmp[9] << 16) | ((size_t)tmp[10] << 8) | ((size_t)tmp[11]); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DIME size=%lu flags=0x%X\n", (unsigned long)soap->dime.size, soap->dime.flags)); if (!(soap->dime.options = soap_getdimefield(soap, optlen)) && soap->error) return soap->error; if (!(soap->dime.id = soap_getdimefield(soap, idlen)) && soap->error) return soap->error; if (!(soap->dime.type = soap_getdimefield(soap, typelen)) && soap->error) return soap->error; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DIME id='%s', type='%s', options='%s'\n", soap->dime.id ? soap->dime.id : SOAP_STR_EOS, soap->dime.type ? soap->dime.type : "", soap->dime.options ? soap->dime.options+4 : SOAP_STR_EOS)); if (soap->dime.flags & SOAP_DIME_ME) soap->mode &= ~SOAP_ENC_DIME; return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_getdime(struct soap *soap) { while (soap->dime.flags & SOAP_DIME_CF) { if (soap_getdimehdr(soap)) return soap->error; if (soap_move(soap, soap->dime.size)) return soap->error = SOAP_EOF; } if (soap_move(soap, (size_t)(((soap->dime.size+3)&(~3)) - soap_tell(soap)))) return soap->error = SOAP_EOF; for (;;) { struct soap_multipart *content; if (soap_getdimehdr(soap)) break; if (soap->fdimewriteopen && ((soap->dime.ptr = (char*)soap->fdimewriteopen(soap, soap->dime.id, soap->dime.type, soap->dime.options)) || soap->error)) { const char *id, *type, *options; size_t size, n; if (!soap->dime.ptr) return soap->error; id = soap->dime.id; type = soap->dime.type; options = soap->dime.options; for (;;) { size = soap->dime.size; for (;;) { n = soap->buflen - soap->bufidx; if (size < n) n = size; if ((soap->error = soap->fdimewrite(soap, (void*)soap->dime.ptr, soap->buf + soap->bufidx, n))) break; size -= n; if (!size) { soap->bufidx += n; break; } if (soap_recv(soap)) { soap->error = SOAP_EOF; goto end; } } if (soap_move(soap, (size_t)(-(long)soap->dime.size&3))) { soap->error = SOAP_EOF; break; } if (!(soap->dime.flags & SOAP_DIME_CF)) break; if (soap_getdimehdr(soap)) break; } end: if (soap->fdimewriteclose) soap->fdimewriteclose(soap, (void*)soap->dime.ptr); soap->dime.size = 0; soap->dime.id = id; soap->dime.type = type; soap->dime.options = options; } else if (soap->dime.flags & SOAP_DIME_CF) { const char *id, *type, *options; id = soap->dime.id; type = soap->dime.type; options = soap->dime.options; if (soap_new_block(soap) == NULL) return SOAP_EOM; for (;;) { soap_wchar c; size_t i; char *s; if (soap->dime.size > SOAP_MAXDIMESIZE) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DIME size=%lu exceeds SOAP_MAXDIMESIZE=%lu\n", (unsigned long)soap->dime.size, (unsigned long)SOAP_MAXDIMESIZE)); return soap->error = SOAP_DIME_ERROR; } s = (char*)soap_push_block(soap, NULL, soap->dime.size); if (!s) return soap->error = SOAP_EOM; for (i = soap->dime.size; i > 0; i--) { if ((int)(c = soap_get1(soap)) == EOF) return soap->error = SOAP_EOF; *s++ = (char)c; } if (soap_move(soap, (size_t)(-(long)soap->dime.size&3))) return soap->error = SOAP_EOF; if (!(soap->dime.flags & SOAP_DIME_CF)) break; if (soap_getdimehdr(soap)) return soap->error; } soap->dime.size = soap->blist->size++; /* allocate one more byte in blist for the terminating '\0' */ if (!(soap->dime.ptr = soap_save_block(soap, NULL, NULL, 0))) return soap->error; soap->dime.ptr[soap->dime.size] = '\0'; /* make 0-terminated */ soap->dime.id = id; soap->dime.type = type; soap->dime.options = options; } else soap->dime.ptr = soap_getdimefield(soap, soap->dime.size); content = soap_new_multipart(soap, &soap->dime.first, &soap->dime.last, soap->dime.ptr, soap->dime.size); if (!content) return soap->error = SOAP_EOM; content->id = soap->dime.id; content->type = soap->dime.type; content->options = soap->dime.options; if (soap->error) return soap->error; soap_resolve_attachment(soap, content); } if (soap->error != SOAP_DIME_END) return soap->error; return soap->error = SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_getmimehdr(struct soap *soap) { struct soap_multipart *content; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get MIME header\n")); do { if (soap_getline(soap, soap->msgbuf, sizeof(soap->msgbuf))) return soap->error; } while (!*soap->msgbuf); if (soap->msgbuf[0] == '-' && soap->msgbuf[1] == '-') { char *s = soap->msgbuf + strlen(soap->msgbuf) - 1; /* remove white space */ while (soap_blank((soap_wchar)*s)) s--; s[1] = '\0'; if (soap->mime.boundary) { if (strcmp(soap->msgbuf + 2, soap->mime.boundary)) return soap->error = SOAP_MIME_ERROR; } else soap->mime.boundary = soap_strdup(soap, soap->msgbuf + 2); if (soap_getline(soap, soap->msgbuf, sizeof(soap->msgbuf))) return soap->error; } if (soap_set_mime_attachment(soap, NULL, 0, SOAP_MIME_NONE, NULL, NULL, NULL, NULL)) return soap->error = SOAP_EOM; content = soap->mime.last; for (;;) { char *key = soap->msgbuf; char *val; if (!*key) break; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "MIME header: %s\n", key)); val = strchr(soap->msgbuf, ':'); if (val) { *val = '\0'; do val++; while (*val && *val <= 32); if (!soap_tag_cmp(key, "Content-ID")) content->id = soap_strdup(soap, val); else if (!soap_tag_cmp(key, "Content-Location")) content->location = soap_strdup(soap, val); else if (!content->id && !soap_tag_cmp(key, "Content-Disposition")) content->id = soap_strdup(soap, soap_get_header_attribute(soap, val, "name")); else if (!soap_tag_cmp(key, "Content-Type")) content->type = soap_strdup(soap, val); else if (!soap_tag_cmp(key, "Content-Description")) content->description = soap_strdup(soap, val); else if (!soap_tag_cmp(key, "Content-Transfer-Encoding")) content->encoding = (enum soap_mime_encoding)soap_code_int(mime_codes, val, (LONG64)SOAP_MIME_NONE); } if (soap_getline(soap, key, sizeof(soap->msgbuf))) return soap->error; } return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_getmime(struct soap *soap) { while (soap_get_mime_attachment(soap, NULL)) continue; return soap->error; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_post_check_mime_attachments(struct soap *soap) { soap->imode |= SOAP_MIME_POSTCHECK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_check_mime_attachments(struct soap *soap) { if (soap->mode & SOAP_MIME_POSTCHECK) return soap_get_mime_attachment(soap, NULL) != NULL; return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 struct soap_multipart * SOAP_FMAC2 soap_get_mime_attachment(struct soap *soap, void *handle) { soap_wchar c = 0; size_t i, m = 0; char *s, *t = NULL; struct soap_multipart *content; short flag = 0; if (!(soap->mode & SOAP_ENC_MIME)) return NULL; content = soap->mime.last; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get MIME (%p)\n", content)); if (!content) { if (soap_getmimehdr(soap)) return NULL; content = soap->mime.last; } else if (content != soap->mime.first) { if (soap->fmimewriteopen && ((content->ptr = (char*)soap->fmimewriteopen(soap, (void*)handle, content->id, content->type, content->description, content->encoding)) || soap->error)) { if (!content->ptr) return NULL; } } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Parsing MIME content id='%s' type='%s'\n", content->id ? content->id : SOAP_STR_EOS, content->type ? content->type : SOAP_STR_EOS)); if (!content->ptr && soap_new_block(soap) == NULL) { soap->error = SOAP_EOM; return NULL; } for (;;) { if (content->ptr) s = soap->tmpbuf; else if (!(s = (char*)soap_push_block(soap, NULL, sizeof(soap->tmpbuf)))) { soap->error = SOAP_EOM; return NULL; } for (i = 0; i < sizeof(soap->tmpbuf); i++) { if (m > 0) { *s++ = *t++; m--; } else { if (!flag) { c = soap_getchar(soap); if ((int)c == EOF) { if (content->ptr && soap->fmimewriteclose) soap->fmimewriteclose(soap, (void*)content->ptr); soap->error = SOAP_CHK_EOF; return NULL; } } if (flag || c == '\r') { memset((void*)soap->msgbuf, 0, sizeof(soap->msgbuf)); soap_strcpy(soap->msgbuf, sizeof(soap->msgbuf), "\n--"); if (soap->mime.boundary) soap_strncat(soap->msgbuf, sizeof(soap->msgbuf), soap->mime.boundary, sizeof(soap->msgbuf) - 4); t = soap->msgbuf; do c = soap_getchar(soap); while (c == *t++); if ((int)c == EOF) { if (content->ptr && soap->fmimewriteclose) soap->fmimewriteclose(soap, (void*)content->ptr); soap->error = SOAP_CHK_EOF; return NULL; } if (!*--t) goto end; *t = (char)c; flag = (c == '\r'); m = t - soap->msgbuf + 1 - flag; t = soap->msgbuf; c = '\r'; } *s++ = (char)c; } } if (content->ptr && soap->fmimewrite) { if ((soap->error = soap->fmimewrite(soap, (void*)content->ptr, soap->tmpbuf, i))) break; } } end: *s = '\0'; /* make 0-terminated */ if (content->ptr) { if (!soap->error && soap->fmimewrite) soap->error = soap->fmimewrite(soap, (void*)content->ptr, soap->tmpbuf, i); if (soap->fmimewriteclose) soap->fmimewriteclose(soap, (void*)content->ptr); if (soap->error) return NULL; } else { content->size = soap_size_block(soap, NULL, i+1) - 1; /* last block with '\0' */ content->ptr = soap_save_block(soap, NULL, NULL, 0); } soap_resolve_attachment(soap, content); if (c == '-' && soap_getchar(soap) == '-') { soap->mode &= ~SOAP_ENC_MIME; if ((soap->mode & SOAP_MIME_POSTCHECK) && soap_end_recv(soap)) { if (soap->keep_alive < 0) soap->keep_alive = 0; soap_closesock(soap); return NULL; } } else { while (c != '\r' && (int)c != EOF && soap_blank(c)) c = soap_getchar(soap); if (c != '\r' || soap_getchar(soap) != '\n') { soap->error = SOAP_MIME_ERROR; return NULL; } if (soap_getmimehdr(soap)) return NULL; } return content; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_match_cid(struct soap *soap, const char *s, const char *t) { size_t n; if (!s) return 1; if (!strcmp(s, t)) return 0; if (!strncmp(s, "cid:", 4)) s += 4; n = strlen(t); if (*t == '<') { t++; n -= 2; } if (!strncmp(s, t, n) && !s[n]) return 0; soap_decode(soap->tmpbuf, sizeof(soap->tmpbuf), s, SOAP_STR_EOS); if (!strncmp(soap->tmpbuf, t, n) && !soap->tmpbuf[n]) return 0; return 1; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 static void soap_resolve_attachment(struct soap *soap, struct soap_multipart *content) { if (content->id) { struct soap_xlist **xp = &soap->xlist; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolving attachment data for id='%s'\n", content->id)); while (*xp) { struct soap_xlist *xq = *xp; if (!soap_match_cid(soap, xq->id, content->id)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Found matching attachment id='%s' for content id='%s'\n", xq->id, content->id)); *xp = xq->next; *xq->ptr = (unsigned char*)content->ptr; *xq->size = (int)content->size; *xq->type = (char*)content->type; if (content->options) *xq->options = (char*)content->options; else *xq->options = (char*)content->description; SOAP_FREE(soap, xq); } else xp = &(*xp)->next; } } } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_putmimehdr(struct soap *soap, struct soap_multipart *content) { const char *s; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "MIME attachment type='%s'\n", content->type ? content->type : SOAP_STR_EOS)); if (soap_send3(soap, "\r\n--", soap->mime.boundary, "\r\n")) return soap->error; if (content->type && soap_send3(soap, "Content-Type: ", content->type, "\r\n")) return soap->error; s = soap_code_str(mime_codes, content->encoding); if (s && soap_send3(soap, "Content-Transfer-Encoding: ", s, "\r\n")) return soap->error; if (content->id && soap_send3(soap, "Content-ID: ", content->id, "\r\n")) return soap->error; if (content->location && soap_send3(soap, "Content-Location: ", content->location, "\r\n")) return soap->error; if (content->description && soap_send3(soap, "Content-Description: ", content->description, "\r\n")) return soap->error; return soap_send_raw(soap, "\r\n", 2); } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_putmime(struct soap *soap) { struct soap_multipart *content; if (!(soap->mode & SOAP_ENC_MIME) || !soap->mime.boundary) return SOAP_OK; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Sending MIME attachments\n")); for (content = soap->mime.first; content; content = content->next) { void *handle; if (soap->fmimereadopen && ((handle = soap->fmimereadopen(soap, (void*)content->ptr, content->id, content->type, content->description)) || soap->error)) { size_t size = content->size; if (!handle) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fmimereadopen failed\n")); return soap->error; } if (soap_putmimehdr(soap, content)) return soap->error; if (!size) { if ((soap->mode & SOAP_ENC_XML) || (soap->mode & SOAP_IO) == SOAP_IO_CHUNK || (soap->mode & SOAP_IO) == SOAP_IO_STORE) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Chunked streaming MIME\n")); do { size = soap->fmimeread(soap, handle, soap->tmpbuf, sizeof(soap->tmpbuf)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fmimeread returned %lu bytes\n", (unsigned long)size)); if (soap_send_raw(soap, soap->tmpbuf, size)) break; } while (size); } else { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Error: cannot chunk streaming MIME (no HTTP chunking)\n")); } } else { do { size_t bufsize; if (size < sizeof(soap->tmpbuf)) bufsize = size; else bufsize = sizeof(soap->tmpbuf); if (!(bufsize = soap->fmimeread(soap, handle, soap->tmpbuf, bufsize))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fmimeread failed: insufficient data (%lu bytes remaining from %lu bytes)\n", (unsigned long)size, (unsigned long)content->size)); soap->error = SOAP_EOF; break; } if (soap_send_raw(soap, soap->tmpbuf, bufsize)) break; size -= bufsize; } while (size); } if (soap->fmimereadclose) soap->fmimereadclose(soap, handle); } else { if (soap_putmimehdr(soap, content) || soap_send_raw(soap, content->ptr, content->size)) return soap->error; } } return soap_send3(soap, "\r\n--", soap->mime.boundary, "--"); } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_set_dime(struct soap *soap) { soap->omode |= SOAP_ENC_DIME; soap->dime.first = NULL; soap->dime.last = NULL; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_set_mime(struct soap *soap, const char *boundary, const char *start) { soap->omode |= SOAP_ENC_MIME; soap->mime.first = NULL; soap->mime.last = NULL; soap->mime.boundary = soap_strdup(soap, boundary); soap->mime.start = soap_strdup(soap, start); } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_clr_dime(struct soap *soap) { soap->omode &= ~SOAP_ENC_DIME; soap->dime.first = NULL; soap->dime.last = NULL; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_clr_mime(struct soap *soap) { soap->omode &= ~SOAP_ENC_MIME; soap->mime.first = NULL; soap->mime.last = NULL; soap->mime.boundary = NULL; soap->mime.start = NULL; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 static struct soap_multipart* soap_new_multipart(struct soap *soap, struct soap_multipart **first, struct soap_multipart **last, char *ptr, size_t size) { struct soap_multipart *content; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "New MIME attachment %p (%lu)\n", ptr, (unsigned long)size)); content = (struct soap_multipart*)soap_malloc(soap, sizeof(struct soap_multipart)); if (content) { content->next = NULL; content->ptr = ptr; content->size = size; content->id = NULL; content->type = NULL; content->options = NULL; content->encoding = SOAP_MIME_NONE; content->location = NULL; content->description = NULL; if (!*first) *first = content; if (*last) (*last)->next = content; *last = content; } return content; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_set_dime_attachment(struct soap *soap, char *ptr, size_t size, const char *type, const char *id, unsigned short optype, const char *option) { struct soap_multipart *content = soap_new_multipart(soap, &soap->dime.first, &soap->dime.last, ptr, size); if (!content) return SOAP_EOM; content->id = soap_strdup(soap, id); content->type = soap_strdup(soap, type); content->options = soap_dime_option(soap, optype, option); return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_set_mime_attachment(struct soap *soap, char *ptr, size_t size, enum soap_mime_encoding encoding, const char *type, const char *id, const char *location, const char *description) { struct soap_multipart *content = soap_new_multipart(soap, &soap->mime.first, &soap->mime.last, ptr, size); if (!content) return SOAP_EOM; content->id = soap_strdup(soap, id); content->type = soap_strdup(soap, type); content->encoding = encoding; content->location = soap_strdup(soap, location); content->description = soap_strdup(soap, description); return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 struct soap_multipart* SOAP_FMAC2 soap_next_multipart(struct soap_multipart *content) { if (content) return content->next; return NULL; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 static void soap_select_mime_boundary(struct soap *soap) { while (!soap->mime.boundary || soap_valid_mime_boundary(soap)) { char *s = soap->mime.boundary; size_t n = 0; if (s) n = strlen(s); if (n < 16) { n = 64; s = soap->mime.boundary = (char*)soap_malloc(soap, n + 1); if (!s) return; } *s++ = '='; *s++ = '='; n -= 4; while (n) { *s++ = soap_base64o[soap_random & 0x3F]; n--; } *s++ = '='; *s++ = '='; *s = '\0'; } if (!soap->mime.start) soap->mime.start = ""; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 static int soap_valid_mime_boundary(struct soap *soap) { struct soap_multipart *content; size_t k; if (soap->fmimeread) return SOAP_OK; k = strlen(soap->mime.boundary); for (content = soap->mime.first; content; content = content->next) { if (content->ptr && content->size >= k) { const char *p = (const char*)content->ptr; size_t i; for (i = 0; i < content->size - k; i++, p++) { if (!strncmp(p, soap->mime.boundary, k)) return SOAP_ERR; } } } return SOAP_OK; } #endif #endif /******************************************************************************/ #ifdef WITH_GZIP #ifndef PALM_1 static int soap_getgziphdr(struct soap *soap) { int i; soap_wchar c = 0, f = 0; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get gzip header\n")); for (i = 0; i < 9; i++) { if ((int)(c = soap_get1(soap) == EOF)) return soap->error = SOAP_ZLIB_ERROR; if (i == 1 && c == 8) soap->z_dict = 0; if (i == 2) f = c; } if (f & 0x04) /* FEXTRA */ { for (i = soap_get1(soap) | (soap_get1(soap) << 8); i; i--) { if ((int)soap_get1(soap) == EOF) return soap->error = SOAP_ZLIB_ERROR; } } if (f & 0x08) /* skip FNAME */ { do c = soap_get1(soap); while (c && (int)c != EOF); } if ((int)c != EOF && (f & 0x10)) /* skip FCOMMENT */ { do c = soap_get1(soap); while (c && (int)c != EOF); } if ((int)c != EOF && (f & 0x02)) /* skip FHCRC (CRC32 is used) */ { if ((int)(c = soap_get1(soap)) != EOF) c = soap_get1(soap); } if ((int)c == EOF) return soap->error = SOAP_ZLIB_ERROR; return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_begin_serve(struct soap *soap) { #ifdef WITH_FASTCGI if (FCGI_Accept() < 0) { soap->error = SOAP_EOF; return soap_send_fault(soap); } #endif soap_begin(soap); if (soap_begin_recv(soap) || soap_envelope_begin_in(soap) || soap_recv_header(soap) || soap_body_begin_in(soap)) { if (soap->error < SOAP_STOP) { #ifdef WITH_FASTCGI soap_send_fault(soap); #else return soap_send_fault(soap); #endif } return soap_closesock(soap); } return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_begin_recv(struct soap *soap) { soap_wchar c; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Initializing for input from socket=%d/fd=%d\n", soap->socket, soap->recvfd)); soap->error = SOAP_OK; #ifndef WITH_LEANER soap->recverror = SOAP_OK; #endif soap_free_temp(soap); soap_set_local_namespaces(soap); soap->version = 0; /* don't assume we're parsing SOAP content by default */ #ifndef WITH_NOIDREF soap_free_iht(soap); #endif if ((soap->imode & SOAP_IO) == SOAP_IO_CHUNK) soap->omode |= SOAP_IO_CHUNK; soap->imode &= ~(SOAP_IO | SOAP_ENC_MIME); soap->mode = soap->imode; if (!soap->keep_alive) { soap->buflen = 0; soap->bufidx = 0; } if (!(soap->mode & SOAP_IO_KEEPALIVE)) soap->keep_alive = 0; soap->shaky = 0; soap->ahead = 0; soap->peeked = 0; soap->level = 0; soap->part = SOAP_BEGIN; soap->body = 1; soap->count = 0; soap->length = 0; soap->cdata = 0; *soap->endpoint = '\0'; soap->action = NULL; soap->header = NULL; soap->fault = NULL; soap->status = 0; soap->fform = NULL; #ifndef WITH_LEANER soap->dom = NULL; soap->dime.chunksize = 0; soap->dime.buflen = 0; soap->dime.list = NULL; soap->dime.first = NULL; soap->dime.last = NULL; soap->mime.list = NULL; soap->mime.first = NULL; soap->mime.last = NULL; soap->mime.boundary = NULL; soap->mime.start = NULL; #endif #ifdef WIN32 #ifndef UNDER_CE #ifndef WITH_FASTCGI if (!soap_valid_socket(soap->socket) && !soap->is && soap->recvfd >= 0) /* Set win32 stdin or soap->recvfd to BINARY, e.g. to support DIME */ #ifdef __BORLANDC__ setmode(soap->recvfd, _O_BINARY); #else _setmode(soap->recvfd, _O_BINARY); #endif #endif #endif #endif #ifdef WITH_ZLIB soap->mode &= ~SOAP_ENC_ZLIB; soap->zlib_in = SOAP_ZLIB_NONE; soap->zlib_out = SOAP_ZLIB_NONE; if (!soap->d_stream) { soap->d_stream = (z_stream*)SOAP_MALLOC(soap, sizeof(z_stream)); soap->d_stream->zalloc = Z_NULL; soap->d_stream->zfree = Z_NULL; soap->d_stream->opaque = Z_NULL; soap->d_stream->next_in = Z_NULL; } soap->d_stream->avail_in = 0; soap->d_stream->next_out = (Byte*)soap->buf; soap->d_stream->avail_out = sizeof(soap->buf); soap->z_ratio_in = 1.0; #endif #ifdef WITH_OPENSSL if (soap->ssl) ERR_clear_error(); #endif #ifndef WITH_LEANER if (soap->fprepareinitrecv && (soap->error = soap->fprepareinitrecv(soap))) return soap->error; #endif c = soap_getchar(soap); #ifdef WITH_GZIP if (c == 0x1F) { if (soap_getgziphdr(soap)) return soap->error; if (inflateInit2(soap->d_stream, -MAX_WBITS) != Z_OK) return soap->error = SOAP_ZLIB_ERROR; if (soap->z_dict) { if (inflateSetDictionary(soap->d_stream, (const Bytef*)soap->z_dict, soap->z_dict_len) != Z_OK) return soap->error = SOAP_ZLIB_ERROR; } soap->zlib_state = SOAP_ZLIB_INFLATE; soap->mode |= SOAP_ENC_ZLIB; soap->zlib_in = SOAP_ZLIB_GZIP; soap->z_crc = crc32(0L, NULL, 0); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "gzip initialized\n")); if (!soap->z_buf) soap->z_buf = (char*)SOAP_MALLOC(soap, sizeof(soap->buf)); soap_memcpy((void*)soap->z_buf, sizeof(soap->buf), (const void*)soap->buf, sizeof(soap->buf)); /* should not chunk over plain transport, so why bother to check? */ /* if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK) */ /* soap->z_buflen = soap->bufidx; */ /* else */ soap->d_stream->next_in = (Byte*)(soap->z_buf + soap->bufidx); soap->d_stream->avail_in = (unsigned int)(soap->buflen - soap->bufidx); soap->z_buflen = soap->buflen; soap->buflen = soap->bufidx; c = ' '; } #endif while (soap_blank(c)) c = soap_getchar(soap); #ifndef WITH_LEANER if (c == '-' && soap_get0(soap) == '-') soap->mode |= SOAP_ENC_MIME; else if ((c & 0xFFFC) == (SOAP_DIME_VERSION | SOAP_DIME_MB) && (soap_get0(soap) & 0xFFF0) == 0x20) soap->mode |= SOAP_ENC_DIME; else #endif { /* skip BOM */ if (c == 0xEF && soap_get0(soap) == 0xBB) { c = soap_get1(soap); if ((c = soap_get1(soap)) == 0xBF) { soap->mode &= ~SOAP_ENC_LATIN; c = soap_getchar(soap); } else c = (0x0F << 12) | (0xBB << 6) | (c & 0x3F); /* UTF-8 */ } else if ((c == 0xFE && soap_get0(soap) == 0xFF) /* UTF-16 BE */ || (c == 0xFF && soap_get0(soap) == 0xFE)) /* UTF-16 LE */ return soap->error = SOAP_UTF_ERROR; /* skip space */ while (soap_blank(c)) c = soap_getchar(soap); } if ((int)c == EOF) return soap->error = SOAP_CHK_EOF; soap_unget(soap, c); #ifndef WITH_NOHTTP /* if not XML/MIME/DIME/ZLIB, assume HTTP method or status line */ if (((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')) && !(soap->mode & (SOAP_ENC_MIME | SOAP_ENC_DIME | SOAP_ENC_ZLIB | SOAP_ENC_XML))) { soap_mode m = soap->imode; soap->mode &= ~SOAP_IO; soap->error = soap->fparse(soap); if (soap->error && soap->error < SOAP_STOP) { soap->keep_alive = 0; /* force close later */ return soap->error; } if (soap->error == SOAP_STOP) { if (soap->fform) { soap->error = soap->fform(soap); if (soap->error == SOAP_OK) soap->error = SOAP_STOP; /* prevents further processing */ } return soap->error; } soap->mode = soap->imode; /* if imode is changed, effectuate */ soap->imode = m; /* restore imode */ #ifdef WITH_ZLIB soap->mode &= ~SOAP_ENC_ZLIB; #endif if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK) { soap->chunkbuflen = soap->buflen; soap->buflen = soap->bufidx; soap->chunksize = 0; } /* Note: fparse should not use soap_unget to push back last char */ #if 0 if (soap->status > 200 && soap->length == 0 && !(soap->http_content && (!soap->keep_alive || soap->recv_timeout)) && (soap->imode & SOAP_IO) != SOAP_IO_CHUNK) #endif if (soap->status && !soap->body) return soap->error = soap->status; #ifdef WITH_ZLIB if (soap->zlib_in != SOAP_ZLIB_NONE) { #ifdef WITH_GZIP if (soap->zlib_in != SOAP_ZLIB_DEFLATE) { c = soap_get1(soap); if (c == (int)EOF) return soap->error = SOAP_EOF; if (c == 0x1F) { if (soap_getgziphdr(soap)) return soap->error; if (inflateInit2(soap->d_stream, -MAX_WBITS) != Z_OK) return soap->error = SOAP_ZLIB_ERROR; soap->z_crc = crc32(0L, NULL, 0); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "gzip initialized\n")); } else { soap_revget1(soap); if (inflateInit(soap->d_stream) != Z_OK) return soap->error = SOAP_ZLIB_ERROR; soap->zlib_in = SOAP_ZLIB_DEFLATE; } } else #endif if (inflateInit(soap->d_stream) != Z_OK) return soap->error = SOAP_ZLIB_ERROR; if (soap->z_dict) { if (inflateSetDictionary(soap->d_stream, (const Bytef*)soap->z_dict, soap->z_dict_len) != Z_OK) return soap->error = SOAP_ZLIB_ERROR; } soap->zlib_state = SOAP_ZLIB_INFLATE; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflate initialized\n")); soap->mode |= SOAP_ENC_ZLIB; if (!soap->z_buf) soap->z_buf = (char*)SOAP_MALLOC(soap, sizeof(soap->buf)); soap_memcpy((void*)soap->z_buf, sizeof(soap->buf), (const void*)soap->buf, sizeof(soap->buf)); soap->d_stream->next_in = (Byte*)(soap->z_buf + soap->bufidx); soap->d_stream->avail_in = (unsigned int)(soap->buflen - soap->bufidx); soap->z_buflen = soap->buflen; soap->buflen = soap->bufidx; } #endif #ifndef WITH_LEANER if (soap->fpreparerecv && (soap->mode & SOAP_IO) != SOAP_IO_CHUNK && soap->buflen > soap->bufidx) { int r; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Invoking fpreparerecv\n")); if ((r = soap->fpreparerecv(soap, soap->buf + soap->bufidx, soap->buflen - soap->bufidx))) return soap->error = r; } #endif if (soap_get0(soap) == (int)EOF) { if (soap->status == 0) return soap->error = SOAP_NO_DATA; /* server side expects data */ return soap->error = soap->status; /* client side received HTTP status code */ } if (soap->error) { if (soap->error == SOAP_FORM && soap->fform) { soap->error = soap->fform(soap); if (soap->error == SOAP_OK) soap->error = SOAP_STOP; /* prevents further processing */ } return soap->error; } } #endif #ifndef WITH_LEANER if (soap->mode & SOAP_ENC_MIME) { do /* skip preamble */ { if ((int)(c = soap_getchar(soap)) == EOF) return soap->error = SOAP_CHK_EOF; } while (c != '-' || soap_get0(soap) != '-'); soap_unget(soap, c); if (soap_getmimehdr(soap)) return soap->error; if (soap->mime.start) { do { if (!soap->mime.last->id) break; if (!soap_match_cid(soap, soap->mime.start, soap->mime.last->id)) break; } while (soap_get_mime_attachment(soap, NULL)); } if (soap_get_header_attribute(soap, soap->mime.first->type, "application/dime")) soap->mode |= SOAP_ENC_DIME; } if (soap->mode & SOAP_ENC_DIME) { if (soap_getdimehdr(soap)) return soap->error; if (soap->dime.flags & SOAP_DIME_CF) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Chunked DIME SOAP message\n")); soap->dime.chunksize = soap->dime.size; if (soap->buflen - soap->bufidx >= soap->dime.chunksize) { soap->dime.buflen = soap->buflen; soap->buflen = soap->bufidx + soap->dime.chunksize; } else soap->dime.chunksize -= soap->buflen - soap->bufidx; } soap->count = soap->buflen - soap->bufidx; } #endif return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_begin_out(struct soap *soap) { #ifndef WITH_LEANER size_t n = 0; if ((soap->mode & SOAP_ENC_MIME) && soap->mime.boundary && soap->mime.start) { const char *s; if (strlen(soap->mime.boundary) + strlen(soap->mime.start) + 140 > sizeof(soap->tmpbuf)) return soap->error = SOAP_EOM; if ((soap->mode & SOAP_ENC_DIME) && !(soap->mode & SOAP_ENC_MTOM)) s = "application/dime"; else if (soap->version == 2) { if (soap->mode & SOAP_ENC_MTOM) s = "application/xop+xml; charset=utf-8; type=\"application/soap+xml\""; else s = "application/soap+xml; charset=utf-8"; } else if (soap->mode & SOAP_ENC_MTOM) s = "application/xop+xml; charset=utf-8; type=\"text/xml\""; else s = "text/xml; charset=utf-8"; (SOAP_SNPRINTF_SAFE(soap->tmpbuf, sizeof(soap->tmpbuf)), "--%s\r\nContent-Type: %s\r\nContent-Transfer-Encoding: binary\r\nContent-ID: %s\r\n\r\n", soap->mime.boundary, s, soap->mime.start); n = strlen(soap->tmpbuf); if (soap_send_raw(soap, soap->tmpbuf, n)) return soap->error; } if (soap->mode & SOAP_IO_LENGTH) soap->dime.size = soap->count; /* DIME in MIME correction */ if (!(soap->mode & SOAP_IO_LENGTH) && (soap->mode & SOAP_ENC_DIME)) { if (soap_putdimehdr(soap)) return soap->error; } #endif if (soap->version == 0) return SOAP_OK; soap->part = SOAP_IN_ENVELOPE; return soap_element_begin_out(soap, "SOAP-ENV:Envelope", 0, NULL); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_end_out(struct soap *soap) { if (soap->version == 0) return SOAP_OK; if (soap_element_end_out(soap, "SOAP-ENV:Envelope") || soap_send_raw(soap, "\r\n", 2)) /* 2.8: always emit \r\n */ return soap->error; #ifndef WITH_LEANER if ((soap->mode & SOAP_IO_LENGTH) && (soap->mode & SOAP_ENC_DIME) && !(soap->mode & SOAP_ENC_MTOM)) { soap->dime.size = soap->count - soap->dime.size; /* DIME in MIME correction */ (SOAP_SNPRINTF(soap->id, sizeof(soap->id), strlen(soap->dime_id_format) + 20), soap->dime_id_format, 0); soap->dime.id = soap->id; if (soap->local_namespaces) { if (soap->local_namespaces[0].out) soap->dime.type = (char*)soap->local_namespaces[0].out; else soap->dime.type = (char*)soap->local_namespaces[0].ns; } soap->dime.options = NULL; soap->dime.flags = SOAP_DIME_MB | SOAP_DIME_ABSURI; if (!soap->dime.first) soap->dime.flags |= SOAP_DIME_ME; soap->count += 12 + ((strlen(soap->dime.id)+3)&(~3)) + (soap->dime.type ? ((strlen(soap->dime.type)+3)&(~3)) : 0); } if ((soap->mode & SOAP_ENC_DIME) && !(soap->mode & SOAP_ENC_MTOM)) return soap_send_raw(soap, SOAP_STR_PADDING, -(long)soap->dime.size&3); #endif soap->part = SOAP_END_ENVELOPE; return SOAP_OK; } #endif /******************************************************************************/ #ifndef WITH_LEAN #ifndef PALM_1 SOAP_FMAC1 char* SOAP_FMAC2 soap_get_http_body(struct soap *soap, size_t *len) { #ifndef WITH_LEAN size_t l = 0, n = 0; char *s; if (len) *len = 0; /* get HTTP body length */ if (!(soap->mode & SOAP_ENC_ZLIB) && (soap->mode & SOAP_IO) != SOAP_IO_CHUNK) { n = soap->length; if (!n) return NULL; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Parsing HTTP body (mode=0x%x,len=%lu)\n", soap->mode, (unsigned long)n)); #ifdef WITH_FAST soap->labidx = 0; /* use look-aside buffer */ #else if (soap_new_block(soap) == NULL) return NULL; #endif for (;;) { #ifdef WITH_FAST size_t i, k; if (soap_append_lab(soap, NULL, 0)) /* allocate more space in look-aside buffer if necessary */ return NULL; s = soap->labbuf + soap->labidx; /* space to populate */ k = soap->lablen - soap->labidx; /* number of bytes available */ soap->labidx = soap->lablen; /* claim this space */ #else size_t i, k = SOAP_BLKLEN; if (!(s = (char*)soap_push_block(soap, NULL, k))) return NULL; #endif for (i = 0; i < k; i++) { soap_wchar c; l++; if (n > 0 && l > n) goto end; c = soap_get1(soap); if ((int)c == EOF) goto end; *s++ = (char)(c & 0xFF); } } end: *s = '\0'; if (len) *len = l - 1; /* len excludes terminating \0 */ #ifdef WITH_FAST if ((s = (char*)soap_malloc(soap, l))) soap_memcpy((void*)s, l, (const void*)soap->labbuf, l); #else soap_size_block(soap, NULL, i+1); s = soap_save_block(soap, NULL, NULL, 0); #endif return s; #else if (len) *len = 0; return NULL; #endif } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_begin_in(struct soap *soap) { soap->part = SOAP_IN_ENVELOPE; if (soap_element_begin_in(soap, "SOAP-ENV:Envelope", 0, NULL)) { if (soap->error == SOAP_TAG_MISMATCH) { if (!soap_element_begin_in(soap, "Envelope", 0, NULL)) soap->error = SOAP_VERSIONMISMATCH; else if (soap->status == 0 || (soap->status >= 200 && soap->status <= 299)) return SOAP_OK; /* allow non-SOAP (REST) XML content to be captured */ soap->error = soap->status; } else if (soap->status) soap->error = soap->status; return soap->error; } soap_get_version(soap); return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_end_in(struct soap *soap) { if (soap->version == 0) return SOAP_OK; soap->part = SOAP_END_ENVELOPE; return soap_element_end_in(soap, "SOAP-ENV:Envelope"); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_body_begin_out(struct soap *soap) { if (soap->version == 1) soap->encoding = 1; #ifndef WITH_LEAN if ((soap->mode & SOAP_SEC_WSUID) && soap_set_attr(soap, "wsu:Id", "Body", 1)) return soap->error; #endif if (soap->version == 0) return SOAP_OK; soap->part = SOAP_IN_BODY; return soap_element_begin_out(soap, "SOAP-ENV:Body", 0, NULL); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_body_end_out(struct soap *soap) { if (soap->version == 0) return SOAP_OK; if (soap_element_end_out(soap, "SOAP-ENV:Body")) return soap->error; soap->part = SOAP_END_BODY; return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_body_begin_in(struct soap *soap) { if (soap->version == 0) return SOAP_OK; soap->part = SOAP_IN_BODY; if (soap_element_begin_in(soap, "SOAP-ENV:Body", 0, NULL)) return soap->error; if (!soap->body) soap->part = SOAP_NO_BODY; return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_body_end_in(struct soap *soap) { if (soap->version == 0) return SOAP_OK; if (soap->part == SOAP_NO_BODY) return soap->error = SOAP_OK; soap->part = SOAP_END_BODY; return soap_element_end_in(soap, "SOAP-ENV:Body"); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_recv_header(struct soap *soap) { if (soap_getheader(soap) && soap->error == SOAP_TAG_MISMATCH) soap->error = SOAP_OK; if (soap->error == SOAP_OK && soap->fheader) soap->error = soap->fheader(soap); return soap->error; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_set_endpoint(struct soap *soap, const char *endpoint) { const char *s; size_t i, n; soap->endpoint[0] = '\0'; soap->host[0] = '\0'; soap->path[0] = '/'; soap->path[1] = '\0'; soap->port = 80; if (!endpoint || !*endpoint) return; #ifdef WITH_OPENSSL if (!soap_tag_cmp(endpoint, "https:*")) soap->port = 443; #endif soap_strcpy(soap->endpoint, sizeof(soap->endpoint), endpoint); s = strchr(endpoint, ':'); if (s && s[1] == '/' && s[2] == '/') s += 3; else s = endpoint; n = strlen(s); if (n >= sizeof(soap->host)) n = sizeof(soap->host) - 1; #ifdef WITH_IPV6 if (s[0] == '[') { s++; for (i = 0; i < n; i++) { if (s[i] == ']') { s++; --n; break; } soap->host[i] = s[i]; } } else { for (i = 0; i < n; i++) { soap->host[i] = s[i]; if (s[i] == '/' || s[i] == ':') break; } } #else for (i = 0; i < n; i++) { soap->host[i] = s[i]; if (s[i] == '/' || s[i] == ':') break; } #endif soap->host[i] = '\0'; if (s[i] == ':') { soap->port = (int)soap_strtol(s + i + 1, NULL, 10); for (i++; i < n; i++) if (s[i] == '/') break; } if (i < n && s[i]) soap_strcpy(soap->path, sizeof(soap->path), s + i); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_connect(struct soap *soap, const char *endpoint, const char *action) { return soap_connect_command(soap, SOAP_POST, endpoint, action); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_connect_command(struct soap *soap, int http_command, const char *endpoints, const char *action) { if (endpoints) { const char *s; s = strchr(endpoints, ' '); if (s) { size_t l = strlen(endpoints); char *endpoint = (char*)SOAP_MALLOC(soap, l + 1); for (;;) { soap_strncpy(endpoint, l + 1, endpoints, s - endpoints); endpoint[s - endpoints] = '\0'; if (soap_try_connect_command(soap, http_command, endpoint, action) != SOAP_TCP_ERROR) break; if (!*s) break; soap->error = SOAP_OK; while (*s == ' ') s++; endpoints = s; s = strchr(endpoints, ' '); if (!s) s = endpoints + strlen(endpoints); } SOAP_FREE(soap, endpoint); } else soap_try_connect_command(soap, http_command, endpoints, action); } return soap->error; } #endif /******************************************************************************/ #ifndef PALM_1 static int soap_try_connect_command(struct soap *soap, int http_command, const char *endpoint, const char *action) { char host[sizeof(soap->host)]; int port; size_t count; soap->error = SOAP_OK; soap_strcpy(host, sizeof(soap->host), soap->host); /* save previous host name: if != then reconnect */ port = soap->port; /* save previous port to compare */ soap->status = http_command; soap_set_endpoint(soap, endpoint); soap->action = soap_strdup(soap, action); #ifndef WITH_LEANER if (soap->fconnect) { if ((soap->error = soap->fconnect(soap, endpoint, soap->host, soap->port))) return soap->error; } else #endif if (soap->fopen && *soap->host) { if (!soap->keep_alive || !soap_valid_socket(soap->socket) || strcmp(soap->host, host) || soap->port != port || !soap->fpoll || soap->fpoll(soap)) { soap->error = SOAP_OK; #ifndef WITH_LEAN if (!strncmp(endpoint, "soap.udp:", 9)) soap->omode |= SOAP_IO_UDP; else #endif { soap->keep_alive = 0; /* to force close */ soap->omode &= ~SOAP_IO_UDP; /* to force close */ } soap_closesock(soap); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connect/reconnect to '%s' host='%s' path='%s' port=%d\n", endpoint?endpoint:"(null)", soap->host, soap->path, soap->port)); if (!soap->keep_alive || !soap_valid_socket(soap->socket)) { soap->socket = soap->fopen(soap, endpoint, soap->host, soap->port); if (soap->error) return soap->error; soap->keep_alive = ((soap->omode & SOAP_IO_KEEPALIVE) != 0); } } } #ifdef WITH_NTLM if (soap_ntlm_handshake(soap, SOAP_GET, endpoint, soap->host, soap->port)) return soap->error; #endif count = soap_count_attachments(soap); if (soap_begin_send(soap)) return soap->error; if (http_command == SOAP_GET) { soap->mode &= ~SOAP_IO; soap->mode |= SOAP_IO_BUFFER; } #ifndef WITH_NOHTTP if ((soap->mode & SOAP_IO) != SOAP_IO_STORE && !(soap->mode & SOAP_ENC_XML) && endpoint) { unsigned int k = soap->mode; soap->mode &= ~(SOAP_IO | SOAP_ENC_ZLIB); if ((k & SOAP_IO) != SOAP_IO_FLUSH) soap->mode |= SOAP_IO_BUFFER; if ((soap->error = soap->fpost(soap, endpoint, soap->host, soap->port, soap->path, action, count))) return soap->error; #ifndef WITH_LEANER if ((k & SOAP_IO) == SOAP_IO_CHUNK) { if (soap_flush(soap)) return soap->error; } #endif soap->mode = k; } if (http_command == SOAP_GET || http_command == SOAP_DEL) return soap_end_send_flush(soap); #endif return SOAP_OK; } #endif /******************************************************************************/ #ifdef WITH_NTLM #ifndef PALM_1 static int soap_ntlm_handshake(struct soap *soap, int command, const char *endpoint, const char *host, int port) { /* requires libntlm from http://www.nongnu.org/libntlm/ */ const char *userid = (soap->proxy_userid ? soap->proxy_userid : soap->userid); const char *passwd = (soap->proxy_passwd ? soap->proxy_passwd : soap->passwd); struct SOAP_ENV__Header *oldheader; if (soap->ntlm_challenge && userid && passwd && soap->authrealm) { tSmbNtlmAuthRequest req; tSmbNtlmAuthResponse res; tSmbNtlmAuthChallenge ch; short k = soap->keep_alive; size_t l = soap->length; size_t c = soap->count; soap_mode m = soap->mode, o = soap->omode; int s = soap->status; char *a = soap->action; short v = soap->version; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "NTLM '%s'\n", soap->ntlm_challenge)); if (!*soap->ntlm_challenge) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "NTLM S->C Type 1: received NTLM authentication challenge from server\n")); /* S -> C 401 Unauthorized WWW-Authenticate: NTLM */ buildSmbNtlmAuthRequest(&req, userid, soap->authrealm); soap->ntlm_challenge = soap_s2base64(soap, (unsigned char*)(void*)&req, NULL, SmbLength(&req)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "NTLM C->S Type 2: sending NTLM authorization to server\nAuthorization: NTLM %s\n", soap->ntlm_challenge)); /* C -> S GET ... Authorization: NTLM TlRMTVNTUAABAAAAA7IAAAoACgApAAAACQAJACAAAABMSUdIVENJVFlVUlNBLU1JTk9S */ soap->omode = SOAP_IO_BUFFER; if (soap_begin_send(soap)) return soap->error; soap->keep_alive = 1; soap->status = command; if (soap->fpost(soap, endpoint, host, port, soap->path, soap->action, 0) || soap_end_send_flush(soap)) return soap->error; soap->mode = m; soap->keep_alive = k; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "NTLM S->C Type 2: waiting on server NTLM response\n")); oldheader = soap->header; if (soap_begin_recv(soap)) if (soap->error == SOAP_EOF) return soap->error; soap_end_recv(soap); soap->header = oldheader; soap->length = l; if (soap->status != 401 && soap->status != 407) return soap->error = SOAP_NTLM_ERROR; soap->error = SOAP_OK; } /* S -> C 401 Unauthorized WWW-Authenticate: NTLM TlRMTVNTUAACAAAAAAAAACgAAAABggAAU3J2Tm9uY2UAAAAAAAAAAA== */ soap_base642s(soap, soap->ntlm_challenge, (char*)&ch, sizeof(tSmbNtlmAuthChallenge), NULL); buildSmbNtlmAuthResponse(&ch, &res, userid, passwd); soap->ntlm_challenge = soap_s2base64(soap, (unsigned char*)(void*)&res, NULL, SmbLength(&res)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "NTLM C->S Type 3: sending NTLM authorization to server\nAuthorization: NTLM %s\n", soap->ntlm_challenge)); /* C -> S GET ... Authorization: NTLM TlRMTVNTUAADAAAAGAAYAHIAAAAYABgAigAAABQAFABAAAAADAAMAFQAAAASABIAYAAAAAAAAACiAAAAAYIAAFUAUgBTAEEALQBNAEkATgBPAFIAWgBhAHAAaABvAGQATABJAEcASABUAEMASQBUAFkArYfKbe/jRoW5xDxHeoxC1gBmfWiS5+iX4OAN4xBKG/IFPwfH3agtPEia6YnhsADT */ soap->userid = NULL; soap->passwd = NULL; soap->proxy_userid = NULL; soap->proxy_passwd = NULL; soap->keep_alive = k; soap->length = l; soap->count = c; soap->mode = m; soap->omode = o; soap->status = s; soap->action = a; soap->version = v; } return SOAP_OK; } #endif #endif /******************************************************************************/ #if !defined(WITH_LEAN) || defined(WITH_NTLM) SOAP_FMAC1 char* SOAP_FMAC2 soap_s2base64(struct soap *soap, const unsigned char *s, char *t, int n) { int i; unsigned long m; char *p; if (!t) t = (char*)soap_malloc(soap, (n + 2) / 3 * 4 + 1); if (!t) return NULL; p = t; t[0] = '\0'; if (!s) return p; for (; n > 2; n -= 3, s += 3) { m = s[0]; m = (m << 8) | s[1]; m = (m << 8) | s[2]; for (i = 4; i > 0; m >>= 6) t[--i] = soap_base64o[m & 0x3F]; t += 4; } t[0] = '\0'; if (n > 0) /* 0 < n <= 2 implies that t[0..4] is allocated (base64 scaling formula) */ { m = 0; for (i = 0; i < n; i++) m = (m << 8) | *s++; for (; i < 3; i++) m <<= 8; for (i = 4; i > 0; m >>= 6) t[--i] = soap_base64o[m & 0x3F]; for (i = 3; i > n; i--) t[i] = '='; t[4] = '\0'; } return p; } #endif /******************************************************************************/ #if !defined(WITH_LEAN) || defined(WITH_NTLM) SOAP_FMAC1 const char* SOAP_FMAC2 soap_base642s(struct soap *soap, const char *s, char *t, size_t l, int *n) { size_t i, j; soap_wchar c; unsigned long m; const char *p; if (!s || !*s) { if (n) *n = 0; if (soap->error) return NULL; return SOAP_NON_NULL; } if (!t) { l = (strlen(s) + 3) / 4 * 3 + 1; /* space for raw binary and \0 */ t = (char*)soap_malloc(soap, l); } if (!t) return NULL; p = t; if (n) *n = 0; for (i = 0; ; i += 3, l -= 3) { m = 0; j = 0; while (j < 4) { c = *s++; if (c == '=' || !c) { if (l >= j - 1) { switch (j) { case 2: *t++ = (char)((m >> 4) & 0xFF); i++; l--; break; case 3: *t++ = (char)((m >> 10) & 0xFF); *t++ = (char)((m >> 2) & 0xFF); i += 2; l -= 2; } } if (n) *n = (int)i; if (l) *t = '\0'; return p; } c -= '+'; if (c >= 0 && c <= 79) { int b = soap_base64i[c]; if (b >= 64) { soap->error = SOAP_TYPE; return NULL; } m = (m << 6) + b; j++; } else if (!soap_blank(c + '+')) { soap->error = SOAP_TYPE; return NULL; } } if (l < 3) { if (n) *n = (int)i; if (l) *t = '\0'; return p; } *t++ = (char)((m >> 16) & 0xFF); *t++ = (char)((m >> 8) & 0xFF); *t++ = (char)(m & 0xFF); } } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 char* SOAP_FMAC2 soap_s2hex(struct soap *soap, const unsigned char *s, char *t, int n) { char *p; if (!t) t = (char*)soap_malloc(soap, 2 * n + 1); if (!t) return NULL; p = t; t[0] = '\0'; if (s) { for (; n > 0; n--) { int m = *s++; *t++ = (char)((m >> 4) + (m > 159 ? 'a' - 10 : '0')); m &= 0x0F; *t++ = (char)(m + (m > 9 ? 'a' - 10 : '0')); } } *t++ = '\0'; return p; } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 const char* SOAP_FMAC2 soap_hex2s(struct soap *soap, const char *s, char *t, size_t l, int *n) { const char *p; if (!s || !*s) { if (n) *n = 0; if (soap->error) return NULL; return SOAP_NON_NULL; } if (!t) { l = strlen(s) / 2 + 1; /* make sure enough space for \0 */ t = (char*)soap_malloc(soap, l); } if (!t) return NULL; p = t; while (l) { int d1, d2; d1 = *s++; if (!d1) break; d2 = *s++; if (!d2) break; *t++ = (char)(((d1 >= 'A' ? (d1 & 0x7) + 9 : d1 - '0') << 4) + (d2 >= 'A' ? (d2 & 0x7) + 9 : d2 - '0')); l--; } if (n) *n = (int)(t - p); if (l) *t = '\0'; return p; } #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_puthttphdr(struct soap *soap, int status, size_t count) { if (soap->status != SOAP_GET && soap->status != SOAP_DEL && soap->status != SOAP_CONNECT) { const char *s = "text/xml; charset=utf-8"; int err = SOAP_OK; #ifndef WITH_LEANER const char *r = NULL; size_t n; #endif if ((status == SOAP_FILE || soap->status == SOAP_PUT || soap->status == SOAP_POST_FILE) && soap->http_content && !strchr(s, 10) && !strchr(s, 13)) s = soap->http_content; else if (status == SOAP_HTML) s = "text/html; charset=utf-8"; else if (count || ((soap->omode & SOAP_IO) == SOAP_IO_CHUNK)) { if (soap->version == 2) s = "application/soap+xml; charset=utf-8"; } #ifndef WITH_LEANER if (soap->mode & (SOAP_ENC_DIME | SOAP_ENC_MTOM)) { if (soap->mode & SOAP_ENC_MTOM) { if (soap->version == 2) r = "application/soap+xml"; else r = "text/xml"; s = "application/xop+xml"; } else s = "application/dime"; } if ((soap->mode & SOAP_ENC_MIME) && soap->mime.boundary) { const char *t; size_t l; n = strlen(soap->mime.boundary); (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), n + 53), "multipart/related; charset=utf-8; boundary=\"%s\"; type=\"", soap->mime.boundary); t = strchr(s, ';'); if (t) n = t - s; else n = strlen(s); l = strlen(soap->tmpbuf); if (sizeof(soap->tmpbuf) - l > n) soap_strncpy(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, s, n); if (soap->mime.start) { l = strlen(soap->tmpbuf); n = strlen(soap->mime.start); (SOAP_SNPRINTF(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, n + 10), "\"; start=\"%s", soap->mime.start); } if (r) { l = strlen(soap->tmpbuf); n = strlen(r); (SOAP_SNPRINTF(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, n + 15), "\"; start-info=\"%s", r); } l = strlen(soap->tmpbuf); if (sizeof(soap->tmpbuf) - l > 1) soap_strncpy(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, "\"", 1); } else soap_strcpy(soap->tmpbuf, sizeof(soap->tmpbuf), s); if (status == SOAP_OK && soap->version == 2 && soap->action) { size_t l = strlen(soap->tmpbuf); (SOAP_SNPRINTF(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, n + 11), "; action=\"%s\"", soap->action); } #endif if ((err = soap->fposthdr(soap, "Content-Type", soap->tmpbuf))) return err; #ifdef WITH_ZLIB if ((soap->omode & SOAP_ENC_ZLIB)) { #ifdef WITH_GZIP err = soap->fposthdr(soap, "Content-Encoding", soap->zlib_out == SOAP_ZLIB_DEFLATE ? "deflate" : "gzip"); #else err = soap->fposthdr(soap, "Content-Encoding", "deflate"); #endif if (err) return err; } #endif #ifndef WITH_LEANER if ((soap->omode & SOAP_IO) == SOAP_IO_CHUNK) err = soap->fposthdr(soap, "Transfer-Encoding", "chunked"); else #endif { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 20), SOAP_ULONG_FORMAT, (ULONG64)count); err = soap->fposthdr(soap, "Content-Length", soap->tmpbuf); } if (err) return err; } return soap->fposthdr(soap, "Connection", soap->keep_alive ? "keep-alive" : "close"); } #endif #endif /******************************************************************************/ #ifndef WITH_LEAN static const char* soap_set_validation_fault(struct soap *soap, const char *s, const char *t) { if (!t) t = SOAP_STR_EOS; if (*soap->tag) (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), strlen(s) + strlen(t) + strlen(soap->tag) + 47), "Validation constraint violation: %s%s in element '%s'", s, t, soap->tag); else (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), strlen(s) + strlen(t) + 33), "Validation constraint violation: %s%s", s, t); return soap->msgbuf; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_set_fault(struct soap *soap) { const char **c = soap_faultcode(soap); const char **s = soap_faultstring(soap); if (soap->fseterror) soap->fseterror(soap, c, s); if (!*c) { if (soap->version == 2) *c = "SOAP-ENV:Sender"; else if (soap->version == 1) *c = "SOAP-ENV:Client"; else *c = "at source"; } if (*s) return; switch (soap->error) { #ifndef WITH_LEAN case SOAP_CLI_FAULT: *s = "Client fault"; break; case SOAP_SVR_FAULT: *s = "Server fault"; break; case SOAP_TAG_MISMATCH: *s = soap_set_validation_fault(soap, "tag name or namespace mismatch", NULL); break; case SOAP_TYPE: if (*soap->type) *s = soap_set_validation_fault(soap, "type mismatch ", soap->type); else *s = soap_set_validation_fault(soap, "invalid value", NULL); break; case SOAP_SYNTAX_ERROR: *s = soap_set_validation_fault(soap, "syntax error", NULL); break; case SOAP_NO_TAG: if (soap->version == 0 && soap->level == 0) *s = soap_set_validation_fault(soap, "missing root element", NULL); else if (soap->version != 0 && soap->level < 3) *s = soap_set_validation_fault(soap, "missing SOAP message", NULL); else *s = soap_set_validation_fault(soap, "missing element", NULL); break; case SOAP_MUSTUNDERSTAND: *c = "SOAP-ENV:MustUnderstand"; (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), strlen(soap->tag) + 65), "The data in element '%s' must be understood but cannot be processed", soap->tag); *s = soap->msgbuf; break; case SOAP_VERSIONMISMATCH: *c = "SOAP-ENV:VersionMismatch"; *s = "Invalid SOAP message or SOAP version mismatch"; break; case SOAP_DATAENCODINGUNKNOWN: *c = "SOAP-ENV:DataEncodingUnknown"; *s = "Unsupported SOAP data encoding"; break; case SOAP_NAMESPACE: *s = soap_set_validation_fault(soap, "namespace error", NULL); break; case SOAP_USER_ERROR: *s = "User data access error"; break; case SOAP_FATAL_ERROR: *s = "A fatal error has occurred"; break; case SOAP_NO_METHOD: (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), strlen(soap->tag) + 66), "Method '%s' not implemented: method name or namespace not recognized", soap->tag); *s = soap->msgbuf; break; case SOAP_NO_DATA: *s = "Data required for operation"; break; case SOAP_GET_METHOD: *s = "HTTP GET method not implemented"; break; case SOAP_PUT_METHOD: *s = "HTTP PUT method not implemented"; break; case SOAP_HTTP_METHOD: *s = "HTTP method not implemented"; break; case SOAP_EOM: *s = "Out of memory"; break; case SOAP_MOE: *s = "Memory overflow or memory corruption error"; break; case SOAP_HDR: *s = "Header line too long"; break; case SOAP_IOB: *s = "Array index out of bounds"; break; case SOAP_NULL: *s = soap_set_validation_fault(soap, "nil not allowed", NULL); break; case SOAP_DUPLICATE_ID: *s = soap_set_validation_fault(soap, "multiple elements (use the SOAP_XML_TREE flag) with duplicate id ", soap->id); if (soap->version == 2) *soap_faultsubcode(soap) = "SOAP-ENC:DuplicateID"; break; case SOAP_MISSING_ID: *s = soap_set_validation_fault(soap, "missing id for ref ", soap->id); if (soap->version == 2) *soap_faultsubcode(soap) = "SOAP-ENC:MissingID"; break; case SOAP_HREF: *s = soap_set_validation_fault(soap, "incompatible object type id-ref ", soap->id); break; case SOAP_FAULT: break; #ifndef WITH_NOIO case SOAP_UDP_ERROR: *s = "Message too large for UDP packet"; break; case SOAP_TCP_ERROR: *s = tcp_error(soap); break; #endif case SOAP_HTTP_ERROR: *s = "An HTTP processing error occurred"; break; case SOAP_NTLM_ERROR: *s = "An HTTP NTLM authentication error occurred"; break; case SOAP_SSL_ERROR: #ifdef WITH_OPENSSL *s = "SSL/TLS error"; #else *s = "OpenSSL not installed: recompile with -DWITH_OPENSSL"; #endif break; case SOAP_PLUGIN_ERROR: *s = "Plugin registry error"; break; case SOAP_DIME_ERROR: *s = "DIME format error or max DIME size exceeds SOAP_MAXDIMESIZE"; break; case SOAP_DIME_HREF: *s = "DIME href to missing attachment"; break; case SOAP_DIME_MISMATCH: *s = "DIME version/transmission error"; break; case SOAP_DIME_END: *s = "End of DIME error"; break; case SOAP_MIME_ERROR: *s = "MIME format error"; break; case SOAP_MIME_HREF: *s = "MIME href to missing attachment"; break; case SOAP_MIME_END: *s = "End of MIME error"; break; case SOAP_ZLIB_ERROR: #ifdef WITH_ZLIB (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), (soap->d_stream && soap->d_stream->msg ? strlen(soap->d_stream->msg) : 0) + 19), "Zlib/gzip error: '%s'", soap->d_stream && soap->d_stream->msg ? soap->d_stream->msg : SOAP_STR_EOS); *s = soap->msgbuf; #else *s = "Zlib/gzip not installed for (de)compression: recompile with -DWITH_GZIP"; #endif break; case SOAP_REQUIRED: *s = soap_set_validation_fault(soap, "missing required attribute", NULL); break; case SOAP_PROHIBITED: *s = soap_set_validation_fault(soap, "prohibited attribute present", NULL); break; case SOAP_OCCURS: *s = soap_set_validation_fault(soap, "occurrence violation", NULL); break; case SOAP_LENGTH: *s = soap_set_validation_fault(soap, "value range or content length violation", NULL); break; case SOAP_FD_EXCEEDED: *s = "Maximum number of open connections was reached (no define HAVE_POLL): increase FD_SETSIZE"; break; case SOAP_UTF_ERROR: *s = "UTF content encoding error"; break; case SOAP_STOP: *s = "Stopped: no response sent or received (informative)"; break; #endif case SOAP_EOF: #ifndef WITH_NOIO *s = soap_strerror(soap); /* *s = soap->msgbuf */ #ifndef WITH_LEAN if (strlen(soap->msgbuf) + 25 < sizeof(soap->msgbuf)) { soap_memmove((void*)(soap->msgbuf + 25), sizeof(soap->tmpbuf) - 25, (const void*)soap->msgbuf, strlen(soap->msgbuf) + 1); if (soap->is) #if defined(__cplusplus) && !defined(WITH_COMPAT) soap_memcpy((void*)soap->msgbuf, sizeof(soap->msgbuf), (const void*)"End or bad std::istream: ", 25); #else soap_memcpy((void*)soap->msgbuf, sizeof(soap->msgbuf), (const void*)"End at NUL buffer input: ", 25); #endif else soap_memcpy((void*)soap->msgbuf, sizeof(soap->msgbuf), (const void*)"End of file or no input: ", 25); } #endif break; #else *s = "End of file or no input"; break; #endif default: #ifndef WITH_NOHTTP #ifndef WITH_LEAN if (soap->error >= 200 && soap->error < 600) { const char *t = http_error(soap, soap->error); (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), strlen(t) + 54), "Error %d: HTTP %d %s", soap->error, soap->error, t); *s = soap->msgbuf; } else #endif #endif { (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), 26), "Error %d", soap->error); *s = soap->msgbuf; } } } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_send_fault(struct soap *soap) { int status = soap->error; if (status == SOAP_OK || status == SOAP_STOP) return soap_closesock(soap); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Sending back fault struct for error code %d\n", soap->error)); soap->keep_alive = 0; /* to terminate connection */ soap_set_fault(soap); if (soap->error < 200 && soap->error != SOAP_FAULT) soap->header = NULL; if (status != SOAP_EOF || (!soap->recv_timeout && !soap->send_timeout)) { int r = 1; #ifndef WITH_NOIO if (soap->fpoll && soap->fpoll(soap)) r = 0; #ifndef WITH_LEAN else if (soap_valid_socket(soap->socket)) { r = tcp_select(soap, soap->socket, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_SND, 0); if (r > 0) { int t; if (!(r & SOAP_TCP_SELECT_SND) || ((r & SOAP_TCP_SELECT_RCV) && recv(soap->socket, (char*)&t, 1, MSG_PEEK) < 0)) r = 0; } } #endif #endif if (r > 0) { soap->error = SOAP_OK; soap->encodingStyle = NULL; /* no encodingStyle in Faults */ soap_serializeheader(soap); soap_serializefault(soap); (void)soap_begin_count(soap); if (soap->mode & SOAP_IO_LENGTH) { if (soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_putfault(soap) || soap_body_end_out(soap) || soap_envelope_end_out(soap)) return soap_closesock(soap); } (void)soap_end_count(soap); if (soap_response(soap, status) || soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_putfault(soap) || soap_body_end_out(soap) || soap_envelope_end_out(soap) || soap_end_send(soap)) return soap_closesock(soap); } } soap->error = status; return soap_closesock(soap); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_recv_fault(struct soap *soap, int check) { int status = soap->status; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Check (%d) if receiving SOAP Fault (status = %d)\n", check, status)); if (!check) { /* try getfault when no tag or tag mismatched at level 2, otherwise ret */ if (soap->error != SOAP_NO_TAG && (soap->error != SOAP_TAG_MISMATCH || soap->level != 2)) return soap->error; } else if (soap->version == 0) /* check == 1 but no SOAP: do not parse SOAP Fault */ { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Not a SOAP protocol\n")); return SOAP_OK; } soap->error = SOAP_OK; if (soap_getfault(soap)) { /* check flag set: check if SOAP Fault is present, if not just return */ if (check && soap->error == SOAP_TAG_MISMATCH && soap->level == 2) return soap->error = SOAP_OK; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Error: soap_get_soapfault() failed at level %u tag '%s'\n", soap->level, soap->tag)); *soap_faultcode(soap) = (soap->version == 2 ? "SOAP-ENV:Sender" : "SOAP-ENV:Client"); if (status) soap->error = status; else soap->error = status = SOAP_NO_DATA; soap_set_fault(soap); } else { const char *s = *soap_faultcode(soap); if (!soap_match_tag(soap, s, "SOAP-ENV:Server") || !soap_match_tag(soap, s, "SOAP-ENV:Receiver")) status = SOAP_SVR_FAULT; else if (!soap_match_tag(soap, s, "SOAP-ENV:Client") || !soap_match_tag(soap, s, "SOAP-ENV:Sender")) status = SOAP_CLI_FAULT; else if (!soap_match_tag(soap, s, "SOAP-ENV:MustUnderstand")) status = SOAP_MUSTUNDERSTAND; else if (!soap_match_tag(soap, s, "SOAP-ENV:VersionMismatch")) status = SOAP_VERSIONMISMATCH; else { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Received SOAP Fault code %s\n", s)); status = SOAP_FAULT; } if (!soap_body_end_in(soap)) soap_envelope_end_in(soap); } soap_end_recv(soap); soap->error = status; return soap_closesock(soap); } #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_send_empty_response(struct soap *soap, int httpstatuscode) { soap_mode m = soap->omode; if (!(m & SOAP_IO_UDP)) { soap->count = 0; if ((m & SOAP_IO) == SOAP_IO_CHUNK) soap->omode = (m & ~SOAP_IO) | SOAP_IO_BUFFER; soap_response(soap, httpstatuscode); soap_end_send(soap); /* force end of sends */ soap->error = SOAP_STOP; /* stops the server (from returning another response */ soap->omode = m; } return soap_closesock(soap); } #endif #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_recv_empty_response(struct soap *soap) { if (!(soap->omode & SOAP_IO_UDP)) { if (!soap_begin_recv(soap)) { if (soap->body) { if ((soap->status != 400 && soap->status != 500) || soap_envelope_begin_in(soap) || soap_recv_header(soap) || soap_body_begin_in(soap)) { #ifndef WITH_LEAN const char *s = soap_get_http_body(soap, NULL); #endif soap_end_recv(soap); #ifndef WITH_LEAN if (s) soap_set_receiver_error(soap, "HTTP Error", s, soap->status); #endif } else return soap_recv_fault(soap, 1); } else soap_end_recv(soap); } else if (soap->error == SOAP_NO_DATA || soap->error == 200 || soap->error == 202) soap->error = SOAP_OK; } return soap_closesock(soap); } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 static const char* soap_strerror(struct soap *soap) { int err = soap->errnum; *soap->msgbuf = '\0'; if (err) { #ifndef WIN32 # ifdef HAVE_STRERROR_R # ifdef _GNU_SOURCE return strerror_r(err, soap->msgbuf, sizeof(soap->msgbuf)); /* GNU-specific */ # else strerror_r(err, soap->msgbuf, sizeof(soap->msgbuf)); /* XSI-compliant */ # endif # else return strerror(err); # endif #else #ifndef UNDER_CE DWORD len; *soap->msgbuf = '\0'; len = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)soap->msgbuf, (DWORD)sizeof(soap->msgbuf), NULL); #else DWORD i, len; *soap->msgbuf = '\0'; len = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, err, 0, (LPTSTR)soap->msgbuf, (DWORD)(sizeof(soap->msgbuf)/sizeof(TCHAR)), NULL); for (i = 0; i <= len; i++) { if (((TCHAR*)soap->msgbuf)[i] < 0x80) soap->msgbuf[i] = (char)((TCHAR*)soap->msgbuf)[i]; else soap->msgbuf[i] = '?'; } #endif #endif } else { int rt = soap->recv_timeout, st = soap->send_timeout; #ifndef WITH_LEAN int ru = ' ', su = ' '; #endif soap_strcpy(soap->msgbuf, sizeof(soap->msgbuf), "message transfer interrupted"); if (rt || st) soap_strcpy(soap->msgbuf + 28, sizeof(soap->msgbuf) - 28, " or timed out"); #ifndef WITH_LEAN if (rt < 0) { rt = -rt; ru = 'u'; } if (st < 0) { st = -st; su = 'u'; } if (rt) { size_t l = strlen(soap->msgbuf); (SOAP_SNPRINTF(soap->msgbuf + l, sizeof(soap->msgbuf) - l, 36), " (%d%cs recv delay)", rt, ru); } if (st) { size_t l = strlen(soap->msgbuf); (SOAP_SNPRINTF(soap->msgbuf + l, sizeof(soap->msgbuf) - l, 36), " (%d%cs send delay)", st, su); } #endif } return soap->msgbuf; } #endif #endif /******************************************************************************/ #ifndef PALM_2 static int soap_set_error(struct soap *soap, const char *faultcode, const char *faultsubcodeQName, const char *faultstring, const char *faultdetailXML, int soaperror) { *soap_faultcode(soap) = faultcode; if (faultsubcodeQName) *soap_faultsubcode(soap) = faultsubcodeQName; *soap_faultstring(soap) = faultstring; if (faultdetailXML && *faultdetailXML) { const char **s = soap_faultdetail(soap); if (s) *s = faultdetailXML; } return soap->error = soaperror; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_set_sender_error(struct soap *soap, const char *faultstring, const char *faultdetailXML, int soaperror) { return soap_set_error(soap, soap->version == 2 ? "SOAP-ENV:Sender" : soap->version == 1 ? "SOAP-ENV:Client" : "at source", NULL, faultstring, faultdetailXML, soaperror); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_set_receiver_error(struct soap *soap, const char *faultstring, const char *faultdetailXML, int soaperror) { return soap_set_error(soap, soap->version == 2 ? "SOAP-ENV:Receiver" : soap->version == 1 ? "SOAP-ENV:Server" : "is internal", NULL, faultstring, faultdetailXML, soaperror); } #endif /******************************************************************************/ #ifndef PALM_2 static int soap_copy_fault(struct soap *soap, const char *faultcode, const char *faultsubcodeQName, const char *faultstring, const char *faultdetailXML) { char *r = NULL, *s = NULL, *t = NULL; if (faultsubcodeQName) r = soap_strdup(soap, faultsubcodeQName); if (faultstring) s = soap_strdup(soap, faultstring); if (faultdetailXML) t = soap_strdup(soap, faultdetailXML); return soap_set_error(soap, faultcode, r, s, t, SOAP_FAULT); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_sender_fault(struct soap *soap, const char *faultstring, const char *faultdetailXML) { return soap_sender_fault_subcode(soap, NULL, faultstring, faultdetailXML); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_sender_fault_subcode(struct soap *soap, const char *faultsubcodeQName, const char *faultstring, const char *faultdetailXML) { return soap_copy_fault(soap, soap->version == 2 ? "SOAP-ENV:Sender" : soap->version == 1 ? "SOAP-ENV:Client" : "at source", faultsubcodeQName, faultstring, faultdetailXML); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_receiver_fault(struct soap *soap, const char *faultstring, const char *faultdetailXML) { return soap_receiver_fault_subcode(soap, NULL, faultstring, faultdetailXML); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_receiver_fault_subcode(struct soap *soap, const char *faultsubcodeQName, const char *faultstring, const char *faultdetailXML) { return soap_copy_fault(soap, soap->version == 2 ? "SOAP-ENV:Receiver" : soap->version == 1 ? "SOAP-ENV:Server" : "is internal", faultsubcodeQName, faultstring, faultdetailXML); } #endif /******************************************************************************/ #ifndef PALM_2 #ifndef WITH_NOSTDLIB SOAP_FMAC1 void SOAP_FMAC2 soap_print_fault(struct soap *soap, FILE *fd) { if (soap_check_state(soap)) fprintf(fd, "Error: soap struct state not initialized with soap_init\n"); else if (soap->error) { const char **c, *v = NULL, *s, *d; c = soap_faultcode(soap); if (!*c) soap_set_fault(soap); if (soap->version == 2) v = soap_check_faultsubcode(soap); s = *soap_faultstring(soap); d = soap_check_faultdetail(soap); fprintf(fd, "%s%d fault %s [%s]\n\"%s\"\nDetail: %s\n", soap->version ? "SOAP 1." : "Error ", soap->version ? (int)soap->version : soap->error, *c, v ? v : "no subcode", s ? s : "[no reason]", d ? d : "[no detail]"); } } #endif #endif /******************************************************************************/ #ifdef __cplusplus #ifndef WITH_LEAN #ifndef WITH_NOSTDLIB #ifndef WITH_COMPAT SOAP_FMAC1 void SOAP_FMAC2 soap_stream_fault(struct soap *soap, std::ostream& os) { if (soap_check_state(soap)) os << "Error: soap struct state not initialized with soap_init\n"; else if (soap->error) { const char **c, *v = NULL, *s, *d; c = soap_faultcode(soap); if (!*c) soap_set_fault(soap); if (soap->version == 2) v = soap_check_faultsubcode(soap); s = *soap_faultstring(soap); d = soap_check_faultdetail(soap); os << (soap->version ? "SOAP 1." : "Error ") << (soap->version ? (int)soap->version : soap->error) << " fault " << *c << "[" << (v ? v : "no subcode") << "]" << std::endl << "\"" << (s ? s : "[no reason]") << "\"" << std::endl << "Detail: " << (d ? d : "[no detail]") << std::endl; } } #endif #endif #endif #endif /******************************************************************************/ #ifndef WITH_LEAN #ifndef WITH_NOSTDLIB SOAP_FMAC1 char* SOAP_FMAC2 soap_sprint_fault(struct soap *soap, char *buf, size_t len) { if (soap_check_state(soap)) { soap_strcpy(buf, len, "Error: soap struct not initialized with soap_init"); } else if (soap->error) { const char **c, *v = NULL, *s, *d; c = soap_faultcode(soap); if (!*c) soap_set_fault(soap); if (soap->version == 2) v = soap_check_faultsubcode(soap); s = *soap_faultstring(soap); d = soap_check_faultdetail(soap); (SOAP_SNPRINTF(buf, len, strlen(*c) + strlen(v) + strlen(s) + strlen(d) + 72), "%s%d fault %s [%s]\n\"%s\"\nDetail: %s\n", soap->version ? "SOAP 1." : "Error ", soap->version ? (int)soap->version : soap->error, *c, v ? v : "no subcode", s ? s : "[no reason]", d ? d : "[no detail]"); } return buf; } #endif #endif /******************************************************************************/ #ifndef PALM_1 #ifndef WITH_NOSTDLIB SOAP_FMAC1 void SOAP_FMAC2 soap_print_fault_location(struct soap *soap, FILE *fd) { #ifndef WITH_LEAN int i, j, c1, c2; if (soap->error && soap->error != SOAP_STOP && soap->bufidx <= soap->buflen && soap->buflen > 0 && soap->buflen <= sizeof(soap->buf)) { i = (int)soap->bufidx - 1; if (i <= 0) i = 0; c1 = soap->buf[i]; soap->buf[i] = '\0'; if ((int)soap->buflen >= i + 1024) j = i + 1023; else j = (int)soap->buflen - 1; c2 = soap->buf[j]; soap->buf[j] = '\0'; fprintf(fd, "%s%c\n\n", soap->buf, c1); if (soap->bufidx < soap->buflen) fprintf(fd, "%s\n", soap->buf + soap->bufidx); soap->buf[i] = (char)c1; soap->buf[j] = (char)c2; } #else (void)soap; (void)fd; #endif } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_register_plugin_arg(struct soap *soap, int (*fcreate)(struct soap*, struct soap_plugin*, void*), void *arg) { struct soap_plugin *p; int r; if (!(p = (struct soap_plugin*)SOAP_MALLOC(soap, sizeof(struct soap_plugin)))) return soap->error = SOAP_EOM; p->id = NULL; p->data = NULL; p->fcopy = NULL; p->fdelete = NULL; r = fcreate(soap, p, arg); if (!r && p->fdelete) { p->next = soap->plugins; soap->plugins = p; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Registered '%s' plugin\n", p->id)); return SOAP_OK; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not register plugin '%s': plugin returned error %d (or fdelete callback not set)\n", p->id ? p->id : "?", r)); SOAP_FREE(soap, p); return r; } #endif /******************************************************************************/ #ifndef PALM_1 static void * fplugin(struct soap *soap, const char *id) { struct soap_plugin *p; for (p = soap->plugins; p; p = p->next) if (p->id == id || !strcmp(p->id, id)) return p->data; return NULL; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void * SOAP_FMAC2 soap_lookup_plugin(struct soap *soap, const char *id) { return soap->fplugin(soap, id); } #endif /******************************************************************************/ #ifdef __cplusplus } #endif /******************************************************************************\ * * C++ soap struct methods * \******************************************************************************/ #ifdef __cplusplus soap::soap() { soap_init(this); /* no logs to prevent leaks when user calls soap_init() on this context */ soap_set_test_logfile(this, NULL); soap_set_sent_logfile(this, NULL); soap_set_recv_logfile(this, NULL); } #endif /******************************************************************************/ #ifdef __cplusplus soap::soap(soap_mode m) { soap_init1(this, m); } #endif /******************************************************************************/ #ifdef __cplusplus soap::soap(soap_mode im, soap_mode om) { soap_init2(this, im, om); } #endif /******************************************************************************/ #ifdef __cplusplus soap::soap(const struct soap& soap) { soap_copy_context(this, &soap); } #endif /******************************************************************************/ #ifdef __cplusplus struct soap& soap::operator=(const struct soap& soap) { soap_copy_context(this, &soap); return *this; } #endif /******************************************************************************/ #ifdef __cplusplus soap::~soap() { soap_done(this); } #endif /******************************************************************************/ gsoap-2.8.28/gsoap/samples/calc_vs2005/calc_vs2005/soapH.h0000644000175000017500000012603412653650154022143 0ustar ellertellert/* soapH.h Generated by gSOAP 2.8.28 from calc.h gSOAP XML Web services tools Copyright (C) 2000-2016, Robert van Engelen, Genivia Inc. All Rights Reserved. The soapcpp2 tool and its generated software are released under the GPL. This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #ifndef soapH_H #define soapH_H #include "soapStub.h" #ifndef WITH_NOIDREF #ifdef __cplusplus extern "C" { #endif SOAP_FMAC3 void SOAP_FMAC4 soap_markelement(struct soap*, const void*, int); #ifdef __cplusplus } #endif SOAP_FMAC3 int SOAP_FMAC4 soap_putindependent(struct soap*); SOAP_FMAC3 int SOAP_FMAC4 soap_getindependent(struct soap*); #endif #ifdef __cplusplus extern "C" { #endif SOAP_FMAC3 void *SOAP_FMAC4 soap_getelement(struct soap*, int*); SOAP_FMAC3 int SOAP_FMAC4 soap_putelement(struct soap*, const void*, const char*, int, int); #ifdef __cplusplus } #endif SOAP_FMAC3 int SOAP_FMAC4 soap_ignore_element(struct soap*); SOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultcode(struct soap *soap); SOAP_FMAC3 void * SOAP_FMAC4 soap_instantiate(struct soap*, int, const char*, const char*, size_t*); SOAP_FMAC3 int SOAP_FMAC4 soap_fdelete(struct soap_clist*); SOAP_FMAC3 int SOAP_FMAC4 soap_fbase(int, int); SOAP_FMAC3 void SOAP_FMAC4 soap_finsert(struct soap*, int, int, void*, size_t, const void*, void**); #ifndef SOAP_TYPE_byte #define SOAP_TYPE_byte (3) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_byte(struct soap*, char *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_byte(struct soap*, const char*, int, const char *, const char*); SOAP_FMAC3 char * SOAP_FMAC4 soap_in_byte(struct soap*, const char*, char *, const char*); SOAP_FMAC3 int SOAP_FMAC4 soap_put_byte(struct soap*, const char *, const char*, const char*); #ifndef soap_write_byte #define soap_write_byte(soap, data) ( soap_free_temp(soap), soap_begin_send(soap) || soap_put_byte(soap, data, "byte", NULL) || soap_end_send(soap), (soap)->error ) #endif SOAP_FMAC3 char * SOAP_FMAC4 soap_get_byte(struct soap*, char *, const char*, const char*); #ifndef soap_read_byte #define soap_read_byte(soap, data) ( ((data) ? (soap_default_byte(soap, (data)), 0) : 0) || soap_begin_recv(soap) || !soap_get_byte(soap, (data), NULL, NULL) || soap_end_recv(soap), (soap)->error ) #endif #ifndef SOAP_TYPE_int #define SOAP_TYPE_int (1) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_int(struct soap*, int *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_int(struct soap*, const char*, int, const int *, const char*); SOAP_FMAC3 int * SOAP_FMAC4 soap_in_int(struct soap*, const char*, int *, const char*); SOAP_FMAC3 int SOAP_FMAC4 soap_put_int(struct soap*, const int *, const char*, const char*); #ifndef soap_write_int #define soap_write_int(soap, data) ( soap_free_temp(soap), soap_begin_send(soap) || soap_put_int(soap, data, "int", NULL) || soap_end_send(soap), (soap)->error ) #endif SOAP_FMAC3 int * SOAP_FMAC4 soap_get_int(struct soap*, int *, const char*, const char*); #ifndef soap_read_int #define soap_read_int(soap, data) ( ((data) ? (soap_default_int(soap, (data)), 0) : 0) || soap_begin_recv(soap) || !soap_get_int(soap, (data), NULL, NULL) || soap_end_recv(soap), (soap)->error ) #endif #ifndef SOAP_TYPE_double #define SOAP_TYPE_double (7) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_double(struct soap*, double *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_double(struct soap*, const char*, int, const double *, const char*); SOAP_FMAC3 double * SOAP_FMAC4 soap_in_double(struct soap*, const char*, double *, const char*); SOAP_FMAC3 int SOAP_FMAC4 soap_put_double(struct soap*, const double *, const char*, const char*); #ifndef soap_write_double #define soap_write_double(soap, data) ( soap_free_temp(soap), soap_begin_send(soap) || soap_put_double(soap, data, "double", NULL) || soap_end_send(soap), (soap)->error ) #endif SOAP_FMAC3 double * SOAP_FMAC4 soap_get_double(struct soap*, double *, const char*, const char*); #ifndef soap_read_double #define soap_read_double(soap, data) ( ((data) ? (soap_default_double(soap, (data)), 0) : 0) || soap_begin_recv(soap) || !soap_get_double(soap, (data), NULL, NULL) || soap_end_recv(soap), (soap)->error ) #endif #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_SOAP_ENV__Fault #define SOAP_TYPE_SOAP_ENV__Fault (31) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Fault(struct soap*, struct SOAP_ENV__Fault *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Fault(struct soap*, const struct SOAP_ENV__Fault *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Fault(struct soap*, const char*, int, const struct SOAP_ENV__Fault *, const char*); SOAP_FMAC3 struct SOAP_ENV__Fault * SOAP_FMAC4 soap_in_SOAP_ENV__Fault(struct soap*, const char*, struct SOAP_ENV__Fault *, const char*); SOAP_FMAC1 struct SOAP_ENV__Fault * SOAP_FMAC2 soap_instantiate_SOAP_ENV__Fault(struct soap*, int, const char*, const char*, size_t*); inline struct SOAP_ENV__Fault * soap_new_SOAP_ENV__Fault(struct soap *soap, int n = -1) { return soap_instantiate_SOAP_ENV__Fault(soap, n, NULL, NULL, NULL); } inline struct SOAP_ENV__Fault * soap_new_req_SOAP_ENV__Fault( struct soap *soap) { struct SOAP_ENV__Fault *_p = soap_new_SOAP_ENV__Fault(soap); if (_p) { soap_default_SOAP_ENV__Fault(soap, _p); } return _p; } inline struct SOAP_ENV__Fault * soap_new_set_SOAP_ENV__Fault( struct soap *soap, char *faultcode, char *faultstring, char *faultactor, struct SOAP_ENV__Detail *detail, struct SOAP_ENV__Code *SOAP_ENV__Code, struct SOAP_ENV__Reason *SOAP_ENV__Reason, char *SOAP_ENV__Node, char *SOAP_ENV__Role, struct SOAP_ENV__Detail *SOAP_ENV__Detail) { struct SOAP_ENV__Fault *_p = soap_new_SOAP_ENV__Fault(soap); if (_p) { soap_default_SOAP_ENV__Fault(soap, _p); _p->faultcode = faultcode; _p->faultstring = faultstring; _p->faultactor = faultactor; _p->detail = detail; _p->SOAP_ENV__Code = SOAP_ENV__Code; _p->SOAP_ENV__Reason = SOAP_ENV__Reason; _p->SOAP_ENV__Node = SOAP_ENV__Node; _p->SOAP_ENV__Role = SOAP_ENV__Role; _p->SOAP_ENV__Detail = SOAP_ENV__Detail; } return _p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Fault(struct soap*, const struct SOAP_ENV__Fault *, const char*, const char*); #ifndef soap_write_SOAP_ENV__Fault #define soap_write_SOAP_ENV__Fault(soap, data) ( soap_free_temp(soap), soap_begin_send(soap) || (soap_serialize_SOAP_ENV__Fault(soap, data), 0) || soap_put_SOAP_ENV__Fault(soap, data, "SOAP-ENV:Fault", NULL) || soap_end_send(soap), (soap)->error ) #endif SOAP_FMAC3 struct SOAP_ENV__Fault * SOAP_FMAC4 soap_get_SOAP_ENV__Fault(struct soap*, struct SOAP_ENV__Fault *, const char*, const char*); #ifndef soap_read_SOAP_ENV__Fault #define soap_read_SOAP_ENV__Fault(soap, data) ( ((data) ? (soap_default_SOAP_ENV__Fault(soap, (data)), 0) : 0) || soap_begin_recv(soap) || !soap_get_SOAP_ENV__Fault(soap, (data), NULL, NULL) || soap_end_recv(soap), (soap)->error ) #endif #endif #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_SOAP_ENV__Reason #define SOAP_TYPE_SOAP_ENV__Reason (30) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Reason(struct soap*, struct SOAP_ENV__Reason *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Reason(struct soap*, const struct SOAP_ENV__Reason *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Reason(struct soap*, const char*, int, const struct SOAP_ENV__Reason *, const char*); SOAP_FMAC3 struct SOAP_ENV__Reason * SOAP_FMAC4 soap_in_SOAP_ENV__Reason(struct soap*, const char*, struct SOAP_ENV__Reason *, const char*); SOAP_FMAC1 struct SOAP_ENV__Reason * SOAP_FMAC2 soap_instantiate_SOAP_ENV__Reason(struct soap*, int, const char*, const char*, size_t*); inline struct SOAP_ENV__Reason * soap_new_SOAP_ENV__Reason(struct soap *soap, int n = -1) { return soap_instantiate_SOAP_ENV__Reason(soap, n, NULL, NULL, NULL); } inline struct SOAP_ENV__Reason * soap_new_req_SOAP_ENV__Reason( struct soap *soap) { struct SOAP_ENV__Reason *_p = soap_new_SOAP_ENV__Reason(soap); if (_p) { soap_default_SOAP_ENV__Reason(soap, _p); } return _p; } inline struct SOAP_ENV__Reason * soap_new_set_SOAP_ENV__Reason( struct soap *soap, char *SOAP_ENV__Text) { struct SOAP_ENV__Reason *_p = soap_new_SOAP_ENV__Reason(soap); if (_p) { soap_default_SOAP_ENV__Reason(soap, _p); _p->SOAP_ENV__Text = SOAP_ENV__Text; } return _p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Reason(struct soap*, const struct SOAP_ENV__Reason *, const char*, const char*); #ifndef soap_write_SOAP_ENV__Reason #define soap_write_SOAP_ENV__Reason(soap, data) ( soap_free_temp(soap), soap_begin_send(soap) || (soap_serialize_SOAP_ENV__Reason(soap, data), 0) || soap_put_SOAP_ENV__Reason(soap, data, "SOAP-ENV:Reason", NULL) || soap_end_send(soap), (soap)->error ) #endif SOAP_FMAC3 struct SOAP_ENV__Reason * SOAP_FMAC4 soap_get_SOAP_ENV__Reason(struct soap*, struct SOAP_ENV__Reason *, const char*, const char*); #ifndef soap_read_SOAP_ENV__Reason #define soap_read_SOAP_ENV__Reason(soap, data) ( ((data) ? (soap_default_SOAP_ENV__Reason(soap, (data)), 0) : 0) || soap_begin_recv(soap) || !soap_get_SOAP_ENV__Reason(soap, (data), NULL, NULL) || soap_end_recv(soap), (soap)->error ) #endif #endif #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_SOAP_ENV__Detail #define SOAP_TYPE_SOAP_ENV__Detail (27) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Detail(struct soap*, struct SOAP_ENV__Detail *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Detail(struct soap*, const struct SOAP_ENV__Detail *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Detail(struct soap*, const char*, int, const struct SOAP_ENV__Detail *, const char*); SOAP_FMAC3 struct SOAP_ENV__Detail * SOAP_FMAC4 soap_in_SOAP_ENV__Detail(struct soap*, const char*, struct SOAP_ENV__Detail *, const char*); SOAP_FMAC1 struct SOAP_ENV__Detail * SOAP_FMAC2 soap_instantiate_SOAP_ENV__Detail(struct soap*, int, const char*, const char*, size_t*); inline struct SOAP_ENV__Detail * soap_new_SOAP_ENV__Detail(struct soap *soap, int n = -1) { return soap_instantiate_SOAP_ENV__Detail(soap, n, NULL, NULL, NULL); } inline struct SOAP_ENV__Detail * soap_new_req_SOAP_ENV__Detail( struct soap *soap, int __type, void *fault) { struct SOAP_ENV__Detail *_p = soap_new_SOAP_ENV__Detail(soap); if (_p) { soap_default_SOAP_ENV__Detail(soap, _p); _p->__type = __type; _p->fault = fault; } return _p; } inline struct SOAP_ENV__Detail * soap_new_set_SOAP_ENV__Detail( struct soap *soap, char *__any, int __type, void *fault) { struct SOAP_ENV__Detail *_p = soap_new_SOAP_ENV__Detail(soap); if (_p) { soap_default_SOAP_ENV__Detail(soap, _p); _p->__any = __any; _p->__type = __type; _p->fault = fault; } return _p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Detail(struct soap*, const struct SOAP_ENV__Detail *, const char*, const char*); #ifndef soap_write_SOAP_ENV__Detail #define soap_write_SOAP_ENV__Detail(soap, data) ( soap_free_temp(soap), soap_begin_send(soap) || (soap_serialize_SOAP_ENV__Detail(soap, data), 0) || soap_put_SOAP_ENV__Detail(soap, data, "SOAP-ENV:Detail", NULL) || soap_end_send(soap), (soap)->error ) #endif SOAP_FMAC3 struct SOAP_ENV__Detail * SOAP_FMAC4 soap_get_SOAP_ENV__Detail(struct soap*, struct SOAP_ENV__Detail *, const char*, const char*); #ifndef soap_read_SOAP_ENV__Detail #define soap_read_SOAP_ENV__Detail(soap, data) ( ((data) ? (soap_default_SOAP_ENV__Detail(soap, (data)), 0) : 0) || soap_begin_recv(soap) || !soap_get_SOAP_ENV__Detail(soap, (data), NULL, NULL) || soap_end_recv(soap), (soap)->error ) #endif #endif #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_SOAP_ENV__Code #define SOAP_TYPE_SOAP_ENV__Code (25) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Code(struct soap*, struct SOAP_ENV__Code *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Code(struct soap*, const struct SOAP_ENV__Code *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Code(struct soap*, const char*, int, const struct SOAP_ENV__Code *, const char*); SOAP_FMAC3 struct SOAP_ENV__Code * SOAP_FMAC4 soap_in_SOAP_ENV__Code(struct soap*, const char*, struct SOAP_ENV__Code *, const char*); SOAP_FMAC1 struct SOAP_ENV__Code * SOAP_FMAC2 soap_instantiate_SOAP_ENV__Code(struct soap*, int, const char*, const char*, size_t*); inline struct SOAP_ENV__Code * soap_new_SOAP_ENV__Code(struct soap *soap, int n = -1) { return soap_instantiate_SOAP_ENV__Code(soap, n, NULL, NULL, NULL); } inline struct SOAP_ENV__Code * soap_new_req_SOAP_ENV__Code( struct soap *soap) { struct SOAP_ENV__Code *_p = soap_new_SOAP_ENV__Code(soap); if (_p) { soap_default_SOAP_ENV__Code(soap, _p); } return _p; } inline struct SOAP_ENV__Code * soap_new_set_SOAP_ENV__Code( struct soap *soap, char *SOAP_ENV__Value, struct SOAP_ENV__Code *SOAP_ENV__Subcode) { struct SOAP_ENV__Code *_p = soap_new_SOAP_ENV__Code(soap); if (_p) { soap_default_SOAP_ENV__Code(soap, _p); _p->SOAP_ENV__Value = SOAP_ENV__Value; _p->SOAP_ENV__Subcode = SOAP_ENV__Subcode; } return _p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Code(struct soap*, const struct SOAP_ENV__Code *, const char*, const char*); #ifndef soap_write_SOAP_ENV__Code #define soap_write_SOAP_ENV__Code(soap, data) ( soap_free_temp(soap), soap_begin_send(soap) || (soap_serialize_SOAP_ENV__Code(soap, data), 0) || soap_put_SOAP_ENV__Code(soap, data, "SOAP-ENV:Code", NULL) || soap_end_send(soap), (soap)->error ) #endif SOAP_FMAC3 struct SOAP_ENV__Code * SOAP_FMAC4 soap_get_SOAP_ENV__Code(struct soap*, struct SOAP_ENV__Code *, const char*, const char*); #ifndef soap_read_SOAP_ENV__Code #define soap_read_SOAP_ENV__Code(soap, data) ( ((data) ? (soap_default_SOAP_ENV__Code(soap, (data)), 0) : 0) || soap_begin_recv(soap) || !soap_get_SOAP_ENV__Code(soap, (data), NULL, NULL) || soap_end_recv(soap), (soap)->error ) #endif #endif #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_SOAP_ENV__Header #define SOAP_TYPE_SOAP_ENV__Header (24) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Header(struct soap*, struct SOAP_ENV__Header *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Header(struct soap*, const struct SOAP_ENV__Header *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Header(struct soap*, const char*, int, const struct SOAP_ENV__Header *, const char*); SOAP_FMAC3 struct SOAP_ENV__Header * SOAP_FMAC4 soap_in_SOAP_ENV__Header(struct soap*, const char*, struct SOAP_ENV__Header *, const char*); SOAP_FMAC1 struct SOAP_ENV__Header * SOAP_FMAC2 soap_instantiate_SOAP_ENV__Header(struct soap*, int, const char*, const char*, size_t*); inline struct SOAP_ENV__Header * soap_new_SOAP_ENV__Header(struct soap *soap, int n = -1) { return soap_instantiate_SOAP_ENV__Header(soap, n, NULL, NULL, NULL); } inline struct SOAP_ENV__Header * soap_new_req_SOAP_ENV__Header( struct soap *soap) { struct SOAP_ENV__Header *_p = soap_new_SOAP_ENV__Header(soap); if (_p) { soap_default_SOAP_ENV__Header(soap, _p); } return _p; } inline struct SOAP_ENV__Header * soap_new_set_SOAP_ENV__Header( struct soap *soap) { struct SOAP_ENV__Header *_p = soap_new_SOAP_ENV__Header(soap); if (_p) { soap_default_SOAP_ENV__Header(soap, _p); } return _p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Header(struct soap*, const struct SOAP_ENV__Header *, const char*, const char*); #ifndef soap_write_SOAP_ENV__Header #define soap_write_SOAP_ENV__Header(soap, data) ( soap_free_temp(soap), soap_begin_send(soap) || (soap_serialize_SOAP_ENV__Header(soap, data), 0) || soap_put_SOAP_ENV__Header(soap, data, "SOAP-ENV:Header", NULL) || soap_end_send(soap), (soap)->error ) #endif SOAP_FMAC3 struct SOAP_ENV__Header * SOAP_FMAC4 soap_get_SOAP_ENV__Header(struct soap*, struct SOAP_ENV__Header *, const char*, const char*); #ifndef soap_read_SOAP_ENV__Header #define soap_read_SOAP_ENV__Header(soap, data) ( ((data) ? (soap_default_SOAP_ENV__Header(soap, (data)), 0) : 0) || soap_begin_recv(soap) || !soap_get_SOAP_ENV__Header(soap, (data), NULL, NULL) || soap_end_recv(soap), (soap)->error ) #endif #endif #ifndef SOAP_TYPE_ns__pow #define SOAP_TYPE_ns__pow (23) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__pow(struct soap*, struct ns__pow *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__pow(struct soap*, const struct ns__pow *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__pow(struct soap*, const char*, int, const struct ns__pow *, const char*); SOAP_FMAC3 struct ns__pow * SOAP_FMAC4 soap_in_ns__pow(struct soap*, const char*, struct ns__pow *, const char*); SOAP_FMAC1 struct ns__pow * SOAP_FMAC2 soap_instantiate_ns__pow(struct soap*, int, const char*, const char*, size_t*); inline struct ns__pow * soap_new_ns__pow(struct soap *soap, int n = -1) { return soap_instantiate_ns__pow(soap, n, NULL, NULL, NULL); } inline struct ns__pow * soap_new_req_ns__pow( struct soap *soap, double a, double b) { struct ns__pow *_p = soap_new_ns__pow(soap); if (_p) { soap_default_ns__pow(soap, _p); _p->a = a; _p->b = b; } return _p; } inline struct ns__pow * soap_new_set_ns__pow( struct soap *soap, double a, double b) { struct ns__pow *_p = soap_new_ns__pow(soap); if (_p) { soap_default_ns__pow(soap, _p); _p->a = a; _p->b = b; } return _p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__pow(struct soap*, const struct ns__pow *, const char*, const char*); #ifndef soap_write_ns__pow #define soap_write_ns__pow(soap, data) ( soap_free_temp(soap), soap_begin_send(soap) || (soap_serialize_ns__pow(soap, data), 0) || soap_put_ns__pow(soap, data, "ns:pow", NULL) || soap_end_send(soap), (soap)->error ) #endif SOAP_FMAC3 struct ns__pow * SOAP_FMAC4 soap_get_ns__pow(struct soap*, struct ns__pow *, const char*, const char*); #ifndef soap_read_ns__pow #define soap_read_ns__pow(soap, data) ( ((data) ? (soap_default_ns__pow(soap, (data)), 0) : 0) || soap_begin_recv(soap) || !soap_get_ns__pow(soap, (data), NULL, NULL) || soap_end_recv(soap), (soap)->error ) #endif #ifndef SOAP_TYPE_ns__powResponse #define SOAP_TYPE_ns__powResponse (22) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__powResponse(struct soap*, struct ns__powResponse *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__powResponse(struct soap*, const struct ns__powResponse *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__powResponse(struct soap*, const char*, int, const struct ns__powResponse *, const char*); SOAP_FMAC3 struct ns__powResponse * SOAP_FMAC4 soap_in_ns__powResponse(struct soap*, const char*, struct ns__powResponse *, const char*); SOAP_FMAC1 struct ns__powResponse * SOAP_FMAC2 soap_instantiate_ns__powResponse(struct soap*, int, const char*, const char*, size_t*); inline struct ns__powResponse * soap_new_ns__powResponse(struct soap *soap, int n = -1) { return soap_instantiate_ns__powResponse(soap, n, NULL, NULL, NULL); } inline struct ns__powResponse * soap_new_req_ns__powResponse( struct soap *soap) { struct ns__powResponse *_p = soap_new_ns__powResponse(soap); if (_p) { soap_default_ns__powResponse(soap, _p); } return _p; } inline struct ns__powResponse * soap_new_set_ns__powResponse( struct soap *soap, double *result) { struct ns__powResponse *_p = soap_new_ns__powResponse(soap); if (_p) { soap_default_ns__powResponse(soap, _p); _p->result = result; } return _p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__powResponse(struct soap*, const struct ns__powResponse *, const char*, const char*); #ifndef soap_write_ns__powResponse #define soap_write_ns__powResponse(soap, data) ( soap_free_temp(soap), soap_begin_send(soap) || (soap_serialize_ns__powResponse(soap, data), 0) || soap_put_ns__powResponse(soap, data, "ns:powResponse", NULL) || soap_end_send(soap), (soap)->error ) #endif SOAP_FMAC3 struct ns__powResponse * SOAP_FMAC4 soap_get_ns__powResponse(struct soap*, struct ns__powResponse *, const char*, const char*); #ifndef soap_read_ns__powResponse #define soap_read_ns__powResponse(soap, data) ( ((data) ? (soap_default_ns__powResponse(soap, (data)), 0) : 0) || soap_begin_recv(soap) || !soap_get_ns__powResponse(soap, (data), NULL, NULL) || soap_end_recv(soap), (soap)->error ) #endif #ifndef SOAP_TYPE_ns__div #define SOAP_TYPE_ns__div (20) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__div(struct soap*, struct ns__div *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__div(struct soap*, const struct ns__div *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__div(struct soap*, const char*, int, const struct ns__div *, const char*); SOAP_FMAC3 struct ns__div * SOAP_FMAC4 soap_in_ns__div(struct soap*, const char*, struct ns__div *, const char*); SOAP_FMAC1 struct ns__div * SOAP_FMAC2 soap_instantiate_ns__div(struct soap*, int, const char*, const char*, size_t*); inline struct ns__div * soap_new_ns__div(struct soap *soap, int n = -1) { return soap_instantiate_ns__div(soap, n, NULL, NULL, NULL); } inline struct ns__div * soap_new_req_ns__div( struct soap *soap, double a, double b) { struct ns__div *_p = soap_new_ns__div(soap); if (_p) { soap_default_ns__div(soap, _p); _p->a = a; _p->b = b; } return _p; } inline struct ns__div * soap_new_set_ns__div( struct soap *soap, double a, double b) { struct ns__div *_p = soap_new_ns__div(soap); if (_p) { soap_default_ns__div(soap, _p); _p->a = a; _p->b = b; } return _p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__div(struct soap*, const struct ns__div *, const char*, const char*); #ifndef soap_write_ns__div #define soap_write_ns__div(soap, data) ( soap_free_temp(soap), soap_begin_send(soap) || (soap_serialize_ns__div(soap, data), 0) || soap_put_ns__div(soap, data, "ns:div", NULL) || soap_end_send(soap), (soap)->error ) #endif SOAP_FMAC3 struct ns__div * SOAP_FMAC4 soap_get_ns__div(struct soap*, struct ns__div *, const char*, const char*); #ifndef soap_read_ns__div #define soap_read_ns__div(soap, data) ( ((data) ? (soap_default_ns__div(soap, (data)), 0) : 0) || soap_begin_recv(soap) || !soap_get_ns__div(soap, (data), NULL, NULL) || soap_end_recv(soap), (soap)->error ) #endif #ifndef SOAP_TYPE_ns__divResponse #define SOAP_TYPE_ns__divResponse (19) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__divResponse(struct soap*, struct ns__divResponse *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__divResponse(struct soap*, const struct ns__divResponse *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__divResponse(struct soap*, const char*, int, const struct ns__divResponse *, const char*); SOAP_FMAC3 struct ns__divResponse * SOAP_FMAC4 soap_in_ns__divResponse(struct soap*, const char*, struct ns__divResponse *, const char*); SOAP_FMAC1 struct ns__divResponse * SOAP_FMAC2 soap_instantiate_ns__divResponse(struct soap*, int, const char*, const char*, size_t*); inline struct ns__divResponse * soap_new_ns__divResponse(struct soap *soap, int n = -1) { return soap_instantiate_ns__divResponse(soap, n, NULL, NULL, NULL); } inline struct ns__divResponse * soap_new_req_ns__divResponse( struct soap *soap) { struct ns__divResponse *_p = soap_new_ns__divResponse(soap); if (_p) { soap_default_ns__divResponse(soap, _p); } return _p; } inline struct ns__divResponse * soap_new_set_ns__divResponse( struct soap *soap, double *result) { struct ns__divResponse *_p = soap_new_ns__divResponse(soap); if (_p) { soap_default_ns__divResponse(soap, _p); _p->result = result; } return _p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__divResponse(struct soap*, const struct ns__divResponse *, const char*, const char*); #ifndef soap_write_ns__divResponse #define soap_write_ns__divResponse(soap, data) ( soap_free_temp(soap), soap_begin_send(soap) || (soap_serialize_ns__divResponse(soap, data), 0) || soap_put_ns__divResponse(soap, data, "ns:divResponse", NULL) || soap_end_send(soap), (soap)->error ) #endif SOAP_FMAC3 struct ns__divResponse * SOAP_FMAC4 soap_get_ns__divResponse(struct soap*, struct ns__divResponse *, const char*, const char*); #ifndef soap_read_ns__divResponse #define soap_read_ns__divResponse(soap, data) ( ((data) ? (soap_default_ns__divResponse(soap, (data)), 0) : 0) || soap_begin_recv(soap) || !soap_get_ns__divResponse(soap, (data), NULL, NULL) || soap_end_recv(soap), (soap)->error ) #endif #ifndef SOAP_TYPE_ns__mul #define SOAP_TYPE_ns__mul (17) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__mul(struct soap*, struct ns__mul *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__mul(struct soap*, const struct ns__mul *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__mul(struct soap*, const char*, int, const struct ns__mul *, const char*); SOAP_FMAC3 struct ns__mul * SOAP_FMAC4 soap_in_ns__mul(struct soap*, const char*, struct ns__mul *, const char*); SOAP_FMAC1 struct ns__mul * SOAP_FMAC2 soap_instantiate_ns__mul(struct soap*, int, const char*, const char*, size_t*); inline struct ns__mul * soap_new_ns__mul(struct soap *soap, int n = -1) { return soap_instantiate_ns__mul(soap, n, NULL, NULL, NULL); } inline struct ns__mul * soap_new_req_ns__mul( struct soap *soap, double a, double b) { struct ns__mul *_p = soap_new_ns__mul(soap); if (_p) { soap_default_ns__mul(soap, _p); _p->a = a; _p->b = b; } return _p; } inline struct ns__mul * soap_new_set_ns__mul( struct soap *soap, double a, double b) { struct ns__mul *_p = soap_new_ns__mul(soap); if (_p) { soap_default_ns__mul(soap, _p); _p->a = a; _p->b = b; } return _p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__mul(struct soap*, const struct ns__mul *, const char*, const char*); #ifndef soap_write_ns__mul #define soap_write_ns__mul(soap, data) ( soap_free_temp(soap), soap_begin_send(soap) || (soap_serialize_ns__mul(soap, data), 0) || soap_put_ns__mul(soap, data, "ns:mul", NULL) || soap_end_send(soap), (soap)->error ) #endif SOAP_FMAC3 struct ns__mul * SOAP_FMAC4 soap_get_ns__mul(struct soap*, struct ns__mul *, const char*, const char*); #ifndef soap_read_ns__mul #define soap_read_ns__mul(soap, data) ( ((data) ? (soap_default_ns__mul(soap, (data)), 0) : 0) || soap_begin_recv(soap) || !soap_get_ns__mul(soap, (data), NULL, NULL) || soap_end_recv(soap), (soap)->error ) #endif #ifndef SOAP_TYPE_ns__mulResponse #define SOAP_TYPE_ns__mulResponse (16) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__mulResponse(struct soap*, struct ns__mulResponse *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__mulResponse(struct soap*, const struct ns__mulResponse *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__mulResponse(struct soap*, const char*, int, const struct ns__mulResponse *, const char*); SOAP_FMAC3 struct ns__mulResponse * SOAP_FMAC4 soap_in_ns__mulResponse(struct soap*, const char*, struct ns__mulResponse *, const char*); SOAP_FMAC1 struct ns__mulResponse * SOAP_FMAC2 soap_instantiate_ns__mulResponse(struct soap*, int, const char*, const char*, size_t*); inline struct ns__mulResponse * soap_new_ns__mulResponse(struct soap *soap, int n = -1) { return soap_instantiate_ns__mulResponse(soap, n, NULL, NULL, NULL); } inline struct ns__mulResponse * soap_new_req_ns__mulResponse( struct soap *soap) { struct ns__mulResponse *_p = soap_new_ns__mulResponse(soap); if (_p) { soap_default_ns__mulResponse(soap, _p); } return _p; } inline struct ns__mulResponse * soap_new_set_ns__mulResponse( struct soap *soap, double *result) { struct ns__mulResponse *_p = soap_new_ns__mulResponse(soap); if (_p) { soap_default_ns__mulResponse(soap, _p); _p->result = result; } return _p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__mulResponse(struct soap*, const struct ns__mulResponse *, const char*, const char*); #ifndef soap_write_ns__mulResponse #define soap_write_ns__mulResponse(soap, data) ( soap_free_temp(soap), soap_begin_send(soap) || (soap_serialize_ns__mulResponse(soap, data), 0) || soap_put_ns__mulResponse(soap, data, "ns:mulResponse", NULL) || soap_end_send(soap), (soap)->error ) #endif SOAP_FMAC3 struct ns__mulResponse * SOAP_FMAC4 soap_get_ns__mulResponse(struct soap*, struct ns__mulResponse *, const char*, const char*); #ifndef soap_read_ns__mulResponse #define soap_read_ns__mulResponse(soap, data) ( ((data) ? (soap_default_ns__mulResponse(soap, (data)), 0) : 0) || soap_begin_recv(soap) || !soap_get_ns__mulResponse(soap, (data), NULL, NULL) || soap_end_recv(soap), (soap)->error ) #endif #ifndef SOAP_TYPE_ns__sub #define SOAP_TYPE_ns__sub (14) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__sub(struct soap*, struct ns__sub *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__sub(struct soap*, const struct ns__sub *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__sub(struct soap*, const char*, int, const struct ns__sub *, const char*); SOAP_FMAC3 struct ns__sub * SOAP_FMAC4 soap_in_ns__sub(struct soap*, const char*, struct ns__sub *, const char*); SOAP_FMAC1 struct ns__sub * SOAP_FMAC2 soap_instantiate_ns__sub(struct soap*, int, const char*, const char*, size_t*); inline struct ns__sub * soap_new_ns__sub(struct soap *soap, int n = -1) { return soap_instantiate_ns__sub(soap, n, NULL, NULL, NULL); } inline struct ns__sub * soap_new_req_ns__sub( struct soap *soap, double a, double b) { struct ns__sub *_p = soap_new_ns__sub(soap); if (_p) { soap_default_ns__sub(soap, _p); _p->a = a; _p->b = b; } return _p; } inline struct ns__sub * soap_new_set_ns__sub( struct soap *soap, double a, double b) { struct ns__sub *_p = soap_new_ns__sub(soap); if (_p) { soap_default_ns__sub(soap, _p); _p->a = a; _p->b = b; } return _p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__sub(struct soap*, const struct ns__sub *, const char*, const char*); #ifndef soap_write_ns__sub #define soap_write_ns__sub(soap, data) ( soap_free_temp(soap), soap_begin_send(soap) || (soap_serialize_ns__sub(soap, data), 0) || soap_put_ns__sub(soap, data, "ns:sub", NULL) || soap_end_send(soap), (soap)->error ) #endif SOAP_FMAC3 struct ns__sub * SOAP_FMAC4 soap_get_ns__sub(struct soap*, struct ns__sub *, const char*, const char*); #ifndef soap_read_ns__sub #define soap_read_ns__sub(soap, data) ( ((data) ? (soap_default_ns__sub(soap, (data)), 0) : 0) || soap_begin_recv(soap) || !soap_get_ns__sub(soap, (data), NULL, NULL) || soap_end_recv(soap), (soap)->error ) #endif #ifndef SOAP_TYPE_ns__subResponse #define SOAP_TYPE_ns__subResponse (13) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__subResponse(struct soap*, struct ns__subResponse *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__subResponse(struct soap*, const struct ns__subResponse *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__subResponse(struct soap*, const char*, int, const struct ns__subResponse *, const char*); SOAP_FMAC3 struct ns__subResponse * SOAP_FMAC4 soap_in_ns__subResponse(struct soap*, const char*, struct ns__subResponse *, const char*); SOAP_FMAC1 struct ns__subResponse * SOAP_FMAC2 soap_instantiate_ns__subResponse(struct soap*, int, const char*, const char*, size_t*); inline struct ns__subResponse * soap_new_ns__subResponse(struct soap *soap, int n = -1) { return soap_instantiate_ns__subResponse(soap, n, NULL, NULL, NULL); } inline struct ns__subResponse * soap_new_req_ns__subResponse( struct soap *soap) { struct ns__subResponse *_p = soap_new_ns__subResponse(soap); if (_p) { soap_default_ns__subResponse(soap, _p); } return _p; } inline struct ns__subResponse * soap_new_set_ns__subResponse( struct soap *soap, double *result) { struct ns__subResponse *_p = soap_new_ns__subResponse(soap); if (_p) { soap_default_ns__subResponse(soap, _p); _p->result = result; } return _p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__subResponse(struct soap*, const struct ns__subResponse *, const char*, const char*); #ifndef soap_write_ns__subResponse #define soap_write_ns__subResponse(soap, data) ( soap_free_temp(soap), soap_begin_send(soap) || (soap_serialize_ns__subResponse(soap, data), 0) || soap_put_ns__subResponse(soap, data, "ns:subResponse", NULL) || soap_end_send(soap), (soap)->error ) #endif SOAP_FMAC3 struct ns__subResponse * SOAP_FMAC4 soap_get_ns__subResponse(struct soap*, struct ns__subResponse *, const char*, const char*); #ifndef soap_read_ns__subResponse #define soap_read_ns__subResponse(soap, data) ( ((data) ? (soap_default_ns__subResponse(soap, (data)), 0) : 0) || soap_begin_recv(soap) || !soap_get_ns__subResponse(soap, (data), NULL, NULL) || soap_end_recv(soap), (soap)->error ) #endif #ifndef SOAP_TYPE_ns__add #define SOAP_TYPE_ns__add (11) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__add(struct soap*, struct ns__add *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__add(struct soap*, const struct ns__add *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__add(struct soap*, const char*, int, const struct ns__add *, const char*); SOAP_FMAC3 struct ns__add * SOAP_FMAC4 soap_in_ns__add(struct soap*, const char*, struct ns__add *, const char*); SOAP_FMAC1 struct ns__add * SOAP_FMAC2 soap_instantiate_ns__add(struct soap*, int, const char*, const char*, size_t*); inline struct ns__add * soap_new_ns__add(struct soap *soap, int n = -1) { return soap_instantiate_ns__add(soap, n, NULL, NULL, NULL); } inline struct ns__add * soap_new_req_ns__add( struct soap *soap, double a, double b) { struct ns__add *_p = soap_new_ns__add(soap); if (_p) { soap_default_ns__add(soap, _p); _p->a = a; _p->b = b; } return _p; } inline struct ns__add * soap_new_set_ns__add( struct soap *soap, double a, double b) { struct ns__add *_p = soap_new_ns__add(soap); if (_p) { soap_default_ns__add(soap, _p); _p->a = a; _p->b = b; } return _p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__add(struct soap*, const struct ns__add *, const char*, const char*); #ifndef soap_write_ns__add #define soap_write_ns__add(soap, data) ( soap_free_temp(soap), soap_begin_send(soap) || (soap_serialize_ns__add(soap, data), 0) || soap_put_ns__add(soap, data, "ns:add", NULL) || soap_end_send(soap), (soap)->error ) #endif SOAP_FMAC3 struct ns__add * SOAP_FMAC4 soap_get_ns__add(struct soap*, struct ns__add *, const char*, const char*); #ifndef soap_read_ns__add #define soap_read_ns__add(soap, data) ( ((data) ? (soap_default_ns__add(soap, (data)), 0) : 0) || soap_begin_recv(soap) || !soap_get_ns__add(soap, (data), NULL, NULL) || soap_end_recv(soap), (soap)->error ) #endif #ifndef SOAP_TYPE_ns__addResponse #define SOAP_TYPE_ns__addResponse (10) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__addResponse(struct soap*, struct ns__addResponse *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__addResponse(struct soap*, const struct ns__addResponse *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__addResponse(struct soap*, const char*, int, const struct ns__addResponse *, const char*); SOAP_FMAC3 struct ns__addResponse * SOAP_FMAC4 soap_in_ns__addResponse(struct soap*, const char*, struct ns__addResponse *, const char*); SOAP_FMAC1 struct ns__addResponse * SOAP_FMAC2 soap_instantiate_ns__addResponse(struct soap*, int, const char*, const char*, size_t*); inline struct ns__addResponse * soap_new_ns__addResponse(struct soap *soap, int n = -1) { return soap_instantiate_ns__addResponse(soap, n, NULL, NULL, NULL); } inline struct ns__addResponse * soap_new_req_ns__addResponse( struct soap *soap) { struct ns__addResponse *_p = soap_new_ns__addResponse(soap); if (_p) { soap_default_ns__addResponse(soap, _p); } return _p; } inline struct ns__addResponse * soap_new_set_ns__addResponse( struct soap *soap, double *result) { struct ns__addResponse *_p = soap_new_ns__addResponse(soap); if (_p) { soap_default_ns__addResponse(soap, _p); _p->result = result; } return _p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__addResponse(struct soap*, const struct ns__addResponse *, const char*, const char*); #ifndef soap_write_ns__addResponse #define soap_write_ns__addResponse(soap, data) ( soap_free_temp(soap), soap_begin_send(soap) || (soap_serialize_ns__addResponse(soap, data), 0) || soap_put_ns__addResponse(soap, data, "ns:addResponse", NULL) || soap_end_send(soap), (soap)->error ) #endif SOAP_FMAC3 struct ns__addResponse * SOAP_FMAC4 soap_get_ns__addResponse(struct soap*, struct ns__addResponse *, const char*, const char*); #ifndef soap_read_ns__addResponse #define soap_read_ns__addResponse(soap, data) ( ((data) ? (soap_default_ns__addResponse(soap, (data)), 0) : 0) || soap_begin_recv(soap) || !soap_get_ns__addResponse(soap, (data), NULL, NULL) || soap_end_recv(soap), (soap)->error ) #endif #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_PointerToSOAP_ENV__Reason #define SOAP_TYPE_PointerToSOAP_ENV__Reason (33) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToSOAP_ENV__Reason(struct soap*, struct SOAP_ENV__Reason *const*); SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerToSOAP_ENV__Reason(struct soap*, const char *, int, struct SOAP_ENV__Reason *const*, const char *); SOAP_FMAC3 struct SOAP_ENV__Reason ** SOAP_FMAC4 soap_in_PointerToSOAP_ENV__Reason(struct soap*, const char*, struct SOAP_ENV__Reason **, const char*); SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerToSOAP_ENV__Reason(struct soap*, struct SOAP_ENV__Reason *const*, const char*, const char*); #ifndef soap_write_PointerToSOAP_ENV__Reason #define soap_write_PointerToSOAP_ENV__Reason(soap, data) ( soap_free_temp(soap), soap_begin_send(soap) || (soap_serialize_PointerToSOAP_ENV__Reason(soap, data), 0) || soap_put_PointerToSOAP_ENV__Reason(soap, data, "SOAP-ENV:Reason", NULL) || soap_end_send(soap), (soap)->error ) #endif SOAP_FMAC3 struct SOAP_ENV__Reason ** SOAP_FMAC4 soap_get_PointerToSOAP_ENV__Reason(struct soap*, struct SOAP_ENV__Reason **, const char*, const char*); #ifndef soap_read_PointerToSOAP_ENV__Reason #define soap_read_PointerToSOAP_ENV__Reason(soap, data) ( ((data) ? (soap_default_PointerToSOAP_ENV__Reason(soap, (data)), 0) : 0) || soap_begin_recv(soap) || !soap_get_PointerToSOAP_ENV__Reason(soap, (data), NULL, NULL) || soap_end_recv(soap), (soap)->error ) #endif #endif #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_PointerToSOAP_ENV__Detail #define SOAP_TYPE_PointerToSOAP_ENV__Detail (32) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToSOAP_ENV__Detail(struct soap*, struct SOAP_ENV__Detail *const*); SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerToSOAP_ENV__Detail(struct soap*, const char *, int, struct SOAP_ENV__Detail *const*, const char *); SOAP_FMAC3 struct SOAP_ENV__Detail ** SOAP_FMAC4 soap_in_PointerToSOAP_ENV__Detail(struct soap*, const char*, struct SOAP_ENV__Detail **, const char*); SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerToSOAP_ENV__Detail(struct soap*, struct SOAP_ENV__Detail *const*, const char*, const char*); #ifndef soap_write_PointerToSOAP_ENV__Detail #define soap_write_PointerToSOAP_ENV__Detail(soap, data) ( soap_free_temp(soap), soap_begin_send(soap) || (soap_serialize_PointerToSOAP_ENV__Detail(soap, data), 0) || soap_put_PointerToSOAP_ENV__Detail(soap, data, "SOAP-ENV:Detail", NULL) || soap_end_send(soap), (soap)->error ) #endif SOAP_FMAC3 struct SOAP_ENV__Detail ** SOAP_FMAC4 soap_get_PointerToSOAP_ENV__Detail(struct soap*, struct SOAP_ENV__Detail **, const char*, const char*); #ifndef soap_read_PointerToSOAP_ENV__Detail #define soap_read_PointerToSOAP_ENV__Detail(soap, data) ( ((data) ? (soap_default_PointerToSOAP_ENV__Detail(soap, (data)), 0) : 0) || soap_begin_recv(soap) || !soap_get_PointerToSOAP_ENV__Detail(soap, (data), NULL, NULL) || soap_end_recv(soap), (soap)->error ) #endif #endif #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_PointerToSOAP_ENV__Code #define SOAP_TYPE_PointerToSOAP_ENV__Code (26) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToSOAP_ENV__Code(struct soap*, struct SOAP_ENV__Code *const*); SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerToSOAP_ENV__Code(struct soap*, const char *, int, struct SOAP_ENV__Code *const*, const char *); SOAP_FMAC3 struct SOAP_ENV__Code ** SOAP_FMAC4 soap_in_PointerToSOAP_ENV__Code(struct soap*, const char*, struct SOAP_ENV__Code **, const char*); SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerToSOAP_ENV__Code(struct soap*, struct SOAP_ENV__Code *const*, const char*, const char*); #ifndef soap_write_PointerToSOAP_ENV__Code #define soap_write_PointerToSOAP_ENV__Code(soap, data) ( soap_free_temp(soap), soap_begin_send(soap) || (soap_serialize_PointerToSOAP_ENV__Code(soap, data), 0) || soap_put_PointerToSOAP_ENV__Code(soap, data, "SOAP-ENV:Code", NULL) || soap_end_send(soap), (soap)->error ) #endif SOAP_FMAC3 struct SOAP_ENV__Code ** SOAP_FMAC4 soap_get_PointerToSOAP_ENV__Code(struct soap*, struct SOAP_ENV__Code **, const char*, const char*); #ifndef soap_read_PointerToSOAP_ENV__Code #define soap_read_PointerToSOAP_ENV__Code(soap, data) ( ((data) ? (soap_default_PointerToSOAP_ENV__Code(soap, (data)), 0) : 0) || soap_begin_recv(soap) || !soap_get_PointerToSOAP_ENV__Code(soap, (data), NULL, NULL) || soap_end_recv(soap), (soap)->error ) #endif #endif #ifndef SOAP_TYPE_PointerTodouble #define SOAP_TYPE_PointerTodouble (8) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTodouble(struct soap*, double *const*); SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTodouble(struct soap*, const char *, int, double *const*, const char *); SOAP_FMAC3 double ** SOAP_FMAC4 soap_in_PointerTodouble(struct soap*, const char*, double **, const char*); SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTodouble(struct soap*, double *const*, const char*, const char*); #ifndef soap_write_PointerTodouble #define soap_write_PointerTodouble(soap, data) ( soap_free_temp(soap), soap_begin_send(soap) || (soap_serialize_PointerTodouble(soap, data), 0) || soap_put_PointerTodouble(soap, data, "double", NULL) || soap_end_send(soap), (soap)->error ) #endif SOAP_FMAC3 double ** SOAP_FMAC4 soap_get_PointerTodouble(struct soap*, double **, const char*, const char*); #ifndef soap_read_PointerTodouble #define soap_read_PointerTodouble(soap, data) ( ((data) ? (soap_default_PointerTodouble(soap, (data)), 0) : 0) || soap_begin_recv(soap) || !soap_get_PointerTodouble(soap, (data), NULL, NULL) || soap_end_recv(soap), (soap)->error ) #endif #ifndef SOAP_TYPE__QName #define SOAP_TYPE__QName (5) #endif #define soap_default__QName(soap, a) soap_default_string(soap, a) SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__QName(struct soap*, char *const*); SOAP_FMAC3 int SOAP_FMAC4 soap_out__QName(struct soap*, const char*, int, char*const*, const char*); SOAP_FMAC3 char * * SOAP_FMAC4 soap_in__QName(struct soap*, const char*, char **, const char*); SOAP_FMAC3 int SOAP_FMAC4 soap_put__QName(struct soap*, char *const*, const char*, const char*); #ifndef soap_write__QName #define soap_write__QName(soap, data) ( soap_free_temp(soap), soap_begin_send(soap) || (soap_serialize__QName(soap, data), 0) || soap_put__QName(soap, data, "QName", NULL) || soap_end_send(soap), (soap)->error ) #endif SOAP_FMAC3 char ** SOAP_FMAC4 soap_get__QName(struct soap*, char **, const char*, const char*); #ifndef soap_read__QName #define soap_read__QName(soap, data) ( ((data) ? (soap_default__QName(soap, (data)), 0) : 0) || soap_begin_recv(soap) || !soap_get__QName(soap, (data), NULL, NULL) || soap_end_recv(soap), (soap)->error ) #endif #ifndef SOAP_TYPE_string #define SOAP_TYPE_string (4) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_string(struct soap*, char **); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_string(struct soap*, char *const*); SOAP_FMAC3 int SOAP_FMAC4 soap_out_string(struct soap*, const char*, int, char*const*, const char*); SOAP_FMAC3 char * * SOAP_FMAC4 soap_in_string(struct soap*, const char*, char **, const char*); SOAP_FMAC3 int SOAP_FMAC4 soap_put_string(struct soap*, char *const*, const char*, const char*); #ifndef soap_write_string #define soap_write_string(soap, data) ( soap_free_temp(soap), soap_begin_send(soap) || (soap_serialize_string(soap, data), 0) || soap_put_string(soap, data, "string", NULL) || soap_end_send(soap), (soap)->error ) #endif SOAP_FMAC3 char ** SOAP_FMAC4 soap_get_string(struct soap*, char **, const char*, const char*); #ifndef soap_read_string #define soap_read_string(soap, data) ( ((data) ? (soap_default_string(soap, (data)), 0) : 0) || soap_begin_recv(soap) || !soap_get_string(soap, (data), NULL, NULL) || soap_end_recv(soap), (soap)->error ) #endif #endif /* End of soapH.h */ gsoap-2.8.28/gsoap/samples/calc_vs2005/calc_vs2005/stdsoap2.h0000644000175000017500000042137712653650154022640 0ustar ellertellert/* stdsoap2.h 2.8.28 gSOAP runtime engine gSOAP XML Web services tools Copyright (C) 2000-2016, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under ONE of the following licenses: GPL, or the gSOAP public license, or Genivia's license for commercial use. -------------------------------------------------------------------------------- Contributors: Wind River Systems, Inc., for the following additions - vxWorks compatible -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2014, Robert van Engelen, Genivia Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #define GSOAP_VERSION 20828 #ifdef WITH_SOAPDEFS_H # include "soapdefs.h" /* include user-defined stuff in soapdefs.h */ #endif #ifndef _THREAD_SAFE # define _THREAD_SAFE #endif #ifndef OPENSERVER # ifndef _REENTRANT # define _REENTRANT # endif #endif #ifndef SOAP_FMAC1 /* stdsoap2.h declaration macro */ # define SOAP_FMAC1 #endif #ifndef SOAP_FMAC2 /* stdsoap2.h declaration macro */ # define SOAP_FMAC2 #endif #ifndef SOAP_FMAC3 /* (de)serializer declaration macro */ # define SOAP_FMAC3 #endif #ifndef SOAP_FMAC3S /* string converter for (de)serializer declaration macro */ # define SOAP_FMAC3S SOAP_FMAC3 #endif #ifndef SOAP_FMAC4 /* (de)serializer declaration macro */ # define SOAP_FMAC4 #endif #ifndef SOAP_FMAC4S /* string converter for (de)serializer declaration macro */ # define SOAP_FMAC4S SOAP_FMAC4 #endif #ifndef SOAP_FMAC5 /* stub/skeleton declaration macro */ # define SOAP_FMAC5 #endif #ifndef SOAP_FMAC6 /* stub/skeleton declaration macro */ # define SOAP_FMAC6 #endif #ifndef SOAP_CMAC /* class declaration macro */ # define SOAP_CMAC #endif #ifndef SOAP_NMAC /* namespace table declaration macro */ # define SOAP_NMAC #endif #ifndef SOAP_SOURCE_STAMP # define SOAP_SOURCE_STAMP(str) #endif #ifndef STDSOAP_H #define STDSOAP_H #define SOAP_XSTRINGIFY(s) SOAP_STRINGIFY(s) #define SOAP_STRINGIFY(s) #s #ifdef SOAPDEFS_H # include SOAP_XSTRINGIFY(SOAPDEFS_H) /* include user-defined "SOAPDEFS_H" */ #endif #if defined(__vxworks) || defined(__VXWORKS__) # ifndef VXWORKS # define VXWORKS # endif #endif #ifdef _WIN32 # ifndef WIN32 # define WIN32 # endif #endif /* for legacy purposes we use WIN32 macro, even when WIN64 is supported */ #ifdef _WIN64 # ifndef WIN32 # define WIN32 # endif #endif #ifdef _WIN32_WCE # ifndef UNDER_CE # define UNDER_CE _WIN32_WCE # endif #endif #ifdef UNDER_CE # ifndef WIN32 # define WIN32 # endif #endif #ifdef __BORLANDC__ # ifdef __WIN32__ # ifndef WIN32 # define WIN32 # endif # endif #endif #ifdef __CYGWIN__ # ifndef CYGWIN # define CYGWIN # endif #endif #ifdef __SYMBIAN32__ # define SYMBIAN # undef WIN32 #endif #if defined(__palmos__) || defined(PALM_GCC) || defined(__PALMOS_TRAPS__) # ifndef PALM # define PALM # endif #endif #if defined(__hpux) # ifndef HP_UX # define HP_UX # endif #endif #if defined(__digital__) && defined(__unix__) # ifndef TRU64 # define TRU64 # endif #endif #ifdef __MVS__ # ifndef OS390 # define OS390 # endif #endif #if defined(__sun) && defined(__SVR4) # ifndef SUN_OS # define SUN_OS # endif #endif #ifdef HAVE_CONFIG_H # include "config.h" # if defined(WITH_OPENSSL) # ifndef HAVE_OPENSSL_SSL_H # undef WITH_OPENSSL # endif # endif # if defined(WITH_GNUTLS) # ifndef HAVE_GNUTLS_GNUTLS_H # undef WITH_GNUTLS # endif # endif # if defined(WITH_ZLIB) || defined(WITH_GZIP) # ifndef HAVE_ZLIB_H # undef WITH_ZLIB # undef WITH_GZIP # endif # endif #else # if defined(UNDER_CE) # define SOAP_BUFLEN (2048) # define SOAP_PTRHASH (32) # define SOAP_IDHASH (19) # define SOAP_BLKLEN (32) # define SOAP_TAGLEN (128) # define SOAP_HDRLEN (1024) # define SOAP_MAXDIMS (4) # define HAVE_SSCANF # elif defined(WIN32) # if _MSC_VER >= 1400 # define HAVE_SNPRINTF # endif # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOD_L # define HAVE_SPRINTF_L # define HAVE_STRTOL # define HAVE_STRTOUL # if _MSC_VER >= 1300 # define HAVE_STRTOLL /* use _strtoi64 */ # define HAVE_STRTOULL /* use _strtoui64 */ # endif # define HAVE_SYS_TIMEB_H # define HAVE_FTIME # define HAVE_GMTIME # define HAVE_WCTOMB # define HAVE_MBTOWC # define SOAP_LONG_FORMAT "%I64d" # define SOAP_ULONG_FORMAT "%I64u" # elif defined(CYGWIN) # define HAVE_POLL # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_SYS_TIMEB_H # define HAVE_FTIME # define HAVE_RAND_R # define HAVE_GMTIME_R # define HAVE_LOCALTIME_R # define HAVE_STRERROR_R # define HAVE_WCTOMB # define HAVE_MBTOWC # elif defined(__APPLE__) # define HAVE_POLL # define HAVE_SNPRINTF # define HAVE_STRLCPY # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOD_L # define HAVE_SSCANF_L # define HAVE_SPRINTF_L # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_STRTOLL # define HAVE_STRTOULL # define HAVE_RAND_R # define HAVE_GMTIME_R # define HAVE_TM_GMTOFF # define HAVE_GETTIMEOFDAY # define HAVE_LOCALTIME_R # define HAVE_STRERROR_R # define HAVE_TIMEGM # define HAVE_WCTOMB # define HAVE_MBTOWC # define HAVE_INTTYPES_H # elif defined(_AIX43) # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_SYS_TIMEB_H # define HAVE_FTIME # define HAVE_RAND_R # define HAVE_GMTIME_R # define HAVE_LOCALTIME_R # define HAVE_WCTOMB # define HAVE_MBTOWC # elif defined(_AIX41) # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_SYS_TIMEB_H # define HAVE_WCTOMB # define HAVE_MBTOWC # elif defined(HP_UX) # include extern intmax_t __strtoll(const char*, char**, int); extern intmax_t __strtoull(const char*, char**, int); # define strtoll __strtoll # define strtoull __strtoull # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_STRTOLL # define HAVE_STRTOULL # define HAVE_SYS_TIMEB_H # define HAVE_FTIME # define HAVE_RAND_R # define HAVE_GMTIME_R # define HAVE_LOCALTIME_R # define HAVE_WCTOMB # define HAVE_MBTOWC # define HAVE_ISNAN # elif defined(FREEBSD) || defined(__FreeBSD__) || defined(OPENBSD) # define HAVE_POLL # define HAVE_SNPRINTF # define HAVE_STRLCPY # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOD_L # define HAVE_SSCANF_L # define HAVE_SPRINTF_L # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_STRTOLL # define HAVE_STRTOULL # define HAVE_GETTIMEOFDAY # define HAVE_RAND_R # define HAVE_GMTIME_R # define HAVE_LOCALTIME_R # define HAVE_STRERROR_R # define HAVE_WCTOMB # define HAVE_MBTOWC # define SOAP_LONG_FORMAT "%qd" # define SOAP_ULONG_FORMAT "%qu" # define HAVE_ISNAN # define HAVE_ISINF # elif defined(__VMS) # include # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_SYS_TIMEB_H # define HAVE_FTIME # define HAVE_RAND_R # define HAVE_GMTIME_R # define HAVE_LOCALTIME_R # define HAVE_WCTOMB # define HAVE_MBTOWC # elif defined(__GLIBC__) || defined(__GNU__) # define HAVE_POLL # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOD_L # define HAVE_SSCANF_L # define HAVE_SPRINTF_L # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_STRTOLL # define HAVE_STRTOULL # define HAVE_SYS_TIMEB_H # define HAVE_FTIME # define HAVE_RAND_R # define HAVE_GMTIME_R # define HAVE_LOCALTIME_R # define HAVE_STRERROR_R # define HAVE_TIMEGM # define HAVE_WCTOMB # define HAVE_MBTOWC # define HAVE_ISNAN # define HAVE_ISINF # elif defined(TRU64) # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_GETTIMEOFDAY # define HAVE_SYS_TIMEB_H # define HAVE_RAND_R # define HAVE_GMTIME_R # define HAVE_LOCALTIME_R # define __USE_STD_IOSTREAM # define HAVE_WCTOMB # define HAVE_MBTOWC # define SOAP_LONG_FORMAT "%ld" # define SOAP_ULONG_FORMAT "%lu" # elif defined(MAC_CARBON) # define WITH_NOIO # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOD_L # define HAVE_SSCANF_L # define HAVE_SPRINTF_L # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_FTIME # define HAVE_RAND_R # define HAVE_GETHOSTBYNAME_R # define HAVE_GMTIME_R # define HAVE_LOCALTIME_R # define HAVE_STRERROR_R # define HAVE_WCTOMB # define HAVE_MBTOWC # elif defined(PALM) # define WITH_LEAN # define HAVE_STRTOD /* strtod() is defined in palmFunctions.h */ # include /* Needs to be included before unix headers */ # include # define IGNORE_STDIO_STUBS # include # define O_NONBLOCK FNONBIO # include # include "palmFunctions.h" # elif defined(SYMBIAN) # define WITH_LEAN # define WITH_NONAMESPACES # define HAVE_STRTOD /* use STRTOD since sscanf doesn't seem to work */ # include # include # elif defined(VXWORKS) # ifdef _WRS_KERNEL # define _POSIX_THREADS 1 # endif # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_GMTIME # define HAVE_LOCALTIME # define HAVE_MKTIME # elif defined(OS390) # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_SYS_TIMEB_H # define HAVE_FTIME # define HAVE_RAND_R # define HAVE_GMTIME_R # define HAVE_LOCALTIME_R # define HAVE_WCTOMB # define HAVE_MBTOWC # elif defined(AS400) # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_SYS_TIMEB_H # define HAVE_FTIME # define HAVE_RAND_R # define HAVE_GMTIME_R # define HAVE_LOCALTIME_R # define HAVE_WCTOMB # define HAVE_MBTOWC # elif defined(__QNX__) || defined(QNX) /* QNX does not have a working version of strtof */ # undef HAVE_STRTOF # define HAVE_POLL # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_STRTOLL # define HAVE_STRTOULL # define HAVE_SYS_TIMEB_H # define HAVE_FTIME # define HAVE_RAND_R # define HAVE_GETHOSTBYNAME_R # define HAVE_GMTIME_R # define HAVE_LOCALTIME_R # define HAVE_STRERROR_R # define HAVE_WCTOMB # define HAVE_MBTOWC # elif defined(SUN_OS) # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_SYS_TIMEB_H # define HAVE_FTIME # define HAVE_RAND_R # define HAVE_GETHOSTBYNAME_R # define HAVE_GMTIME_R # define HAVE_LOCALTIME_R # else /* Default assumptions for supported library functions when not including config.h */ # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_STRTOLL # define HAVE_STRTOULL # define HAVE_SYS_TIMEB_H # define HAVE_FTIME # define HAVE_RAND_R # define HAVE_GETHOSTBYNAME_R # define HAVE_GMTIME_R # define HAVE_LOCALTIME_R # define HAVE_STRERROR_R # ifdef MB_LEN_MAX # define HAVE_WCTOMB # define HAVE_MBTOWC # endif # endif #endif #ifdef WITH_LEANER # ifndef WITH_LEAN # define WITH_LEAN # endif #endif /* gSOAP 2.7.15 and higher: always use FAST and retain CDATA in literal XML, unless WITH_LEAN or WITH_NOCDATA */ #ifndef WITH_LEAN # ifndef WITH_FAST # define WITH_FAST # endif # ifndef WITH_NOCDATA # ifndef WITH_CDATA # define WITH_CDATA # endif # endif #endif #ifdef WITH_LEAN # ifdef WITH_COOKIES # error "Cannot build WITH_LEAN code WITH_COOKIES enabled" # endif #endif /* allowing empty struct/union in C is a GNU extension */ #if !defined(__GNU__) # define WITH_NOEMPTYSTRUCT #endif /* silence clang's C99 variadic macro warnings */ #ifdef __clang__ # pragma clang diagnostic ignored "-Wvariadic-macros" #endif #ifdef WITH_PURE_VIRTUAL # define SOAP_PURE_VIRTUAL = 0 #else # define SOAP_PURE_VIRTUAL #endif /* older OpenVMS TCP/IP stacks cannot handle 65536 bytes */ #ifdef __VMS # ifndef SOAP_BUFLEN # define SOAP_BUFLEN (65535) # endif #endif /* if we have xlocale.h then we can use it WITH_C_LOCALE enabled to avoid decimal point conversion issues */ #ifdef WITH_C_LOCALE # ifdef WIN32 # include # define SOAP_LOCALE(soap) ((soap)->c_locale ? (soap)->c_locale : ((soap)->c_locale = _create_locale(LC_ALL, "C"))) # else # include # define SOAP_LOCALE(soap) ((soap)->c_locale ? (soap)->c_locale : ((soap)->c_locale = newlocale(LC_ALL_MASK, "C", NULL))) # endif #else # undef HAVE_STRTOF_L # undef HAVE_STRTOD_L # undef HAVE_SSCANF_L # undef HAVE_SPRINTF_L #endif #ifdef TANDEM_NONSTOP /* Support for Guardian */ # define SOAP_BUFLEN (32767) /*# define WITH_NOSTDLIB */ /* uncommment to remove stdlib dependences */ # define WITH_NOIO /* no IO dependences, e.g. remove TCP/IP */ # define int32_t int # define int64_t long long # define LONG64 long long # define ULONG64 long long # define DBL_PINFTY (1.1579208923716189e77) # undef HAVE_WCTOMB # undef HAVE_MBTOWC # undef HAVE_GMTIME_R # undef HAVE_LOCALTIME_R # undef HAVE_SNPRINTF # define SOAP_BUFLEN (32767) # define SOAP_SOCKET short #pragma nolist # include # include # include # include # include # include # include # include # include # include # include # define INET_ERROR 4294967295 #pragma list #elif defined(__TANDEM) /* Support for OSS */ # define int32_t int # define SOAP_BUFLEN (32767) #endif #ifndef WITH_NOSTDLIB # include # ifndef PALM # include # include # endif # if !defined(HAVE_CONFIG_H) || defined(HAVE_CTYPE_H) # include # endif # if !defined(HAVE_CONFIG_H) || defined(HAVE_LIMITS_H) # include /* for MB_LEN_MAX */ # endif # if !defined(HAVE_CONFIG_H) || defined(HAVE_FLOAT_H) # include /* for INFINITY */ # endif # if !defined(HAVE_CONFIG_H) || defined(HAVE_MATH_H) # ifndef PALM # include /* for isnan() and isinf() */ # endif # endif #endif #ifdef WITH_NTLM # include #endif #ifdef HAVE_POLL # include #endif #if defined(__cplusplus) # include # include # if !defined(WITH_LEAN) && !defined(WITH_COMPAT) # include # include # endif #endif #ifdef WITH_NOHTTP # ifndef WITH_NOIO # define WITH_NOIO # undef WITH_COOKIES # endif #endif /* Suggestion when SOAP_FD_EXCEEDED error occurs: Some systems allow increasing FD_SETSIZE before including sys/types.h: #define FD_SETSIZE (2048) */ #ifndef UNDER_CE # ifndef PALM # ifndef WITH_NOIO # include # include # endif # ifndef WITH_LEAN # ifdef HAVE_SYS_TIMEB_H # include /* for ftime() */ # endif # include # endif # endif #endif #ifdef OPENSERVER # include # include # include extern int h_errno; #endif #ifndef WITH_NOIO # ifndef WIN32 # ifndef PALM # include # ifdef VXWORKS # include # include # ifndef _WRS_KERNEL # include # endif # else # ifndef SYMBIAN # include # endif # endif # ifdef SUN_OS # include /* SUN */ # include /* only needed with SUN < 2.8 ? */ # endif # ifdef VXWORKS # ifdef _WRS_KERNEL # include # endif # else # include # endif # include # ifdef OS390 # include # else # include /* TCP_NODELAY, TCP_FASTOPEN */ # endif # include # endif # endif #endif #ifdef WIN32 # define SOAP_WINSOCKINT int #else # define SOAP_WINSOCKINT size_t #endif #if defined(WITH_IPV6_V6ONLY) || defined(WITH_NO_IPV6_V6ONLY) # ifndef WITH_IPV6 # define WITH_IPV6 # endif #endif #ifdef WIN32 # ifndef UNDER_CE # include # include # endif // When you get macro redefinition errors when compiling the code below, then: // a) try arrange your includes so is included after "stdsoap2.h" // b) or define _WINSOCKAPI_ first: // #define _WINSOCKAPI_ // stops windows.h including winsock.h // #include // #include "stdsoap2.h" // c) or compile with the -DWIN32_LEAN_AND_MEAN switch # include // Visual Studio 2005 users: install Platform SDK (R2) # include // # define _WSPIAPI_COUNTOF // DEV NOTE: enble to fix problems with VC6 // # include # include // DEV NOTE: replaces older wspiapi.h above # ifdef WITH_IPV6 # define SOAP_GAI_STRERROR gai_strerrorA # endif #else # ifdef VXWORKS # include # include # include # endif # ifndef WITH_NOIO # ifndef PALM # include # include # include # include # ifdef _AIX41 # include # endif # endif # endif #endif #ifdef WITH_FASTCGI # include #endif #ifdef WITH_OPENSSL # ifdef __VMS # pragma names save # pragma names uppercase # endif # undef WITH_GNUTLS # define OPENSSL_NO_KRB5 # include # include # include # include # include # ifndef ALLOW_OLD_VERSIONS # if (OPENSSL_VERSION_NUMBER < 0x00905100L) # error "Must use OpenSSL 0.9.6 or later" # endif # endif # ifdef __VMS # pragma names restore # endif #endif #ifdef WITH_GNUTLS # include # include # include # ifndef HAVE_PTHREAD_H # ifdef _POSIX_THREADS # define HAVE_PTHREAD_H /* make GNUTLS thread safe */ # endif # endif #endif #ifdef WITH_SYSTEMSSL # include #endif #ifdef WITH_GZIP # ifndef WITH_ZLIB # define WITH_ZLIB # endif #endif #ifdef WITH_CASEINSENSITIVETAGS # define SOAP_STRCMP soap_tag_cmp /* case insensitve XML element/attribute names */ #else # define SOAP_STRCMP strcmp /* case sensitive XML element/attribute names */ #endif #ifdef WITH_ZLIB # include #endif /* #define DEBUG */ /* Uncomment to debug sending (in file SENT.log) receiving (in file RECV.log) and internal operations (in file TEST.log) */ /* #define DEBUG_STAMP */ /* Uncomment to debug sending (in file SENT.log) receiving (in file RECV.log) and time-stamped operations (in file TEST.log) */ #ifdef __cplusplus extern "C" { #endif /* Portability (X/Open, BSD sockets etc): define SOAP_SOCKLEN_T as socklen_t or int or ... */ #if defined(_AIX) || defined(AIX) # if defined(_AIX43) # define SOAP_SOCKLEN_T socklen_t # else # define SOAP_SOCKLEN_T int # endif #elif defined(SOCKLEN_T) # define SOAP_SOCKLEN_T SOCKLEN_T #elif defined(__socklen_t_defined) || defined(_SOCKLEN_T) || defined(CYGWIN) || defined(FREEBSD) || defined(__FreeBSD__) || defined(OPENBSD) || defined(__QNX__) || defined(QNX) || defined(OS390) || defined(__ANDROID__) || defined(_XOPEN_SOURCE) # define SOAP_SOCKLEN_T socklen_t #elif defined(IRIX) || defined(WIN32) || defined(__APPLE__) || defined(SUN_OS) || defined(OPENSERVER) || defined(TRU64) || defined(VXWORKS) || defined(HP_UX) # define SOAP_SOCKLEN_T int #elif !defined(SOAP_SOCKLEN_T) # define SOAP_SOCKLEN_T size_t #endif /* AIX DCE threads portability: define SOAP_FUNC_R_ERR gmtime_r and localtime_r err ret val as -1 */ #ifdef _AIX32_THREADS # define SOAP_FUNC_R_ERR (-1) #elif !defined(SOAP_FUNC_R_ERR) # define SOAP_FUNC_R_ERR (NULL) #endif #ifndef SOAP_SOCKET # ifdef WIN32 # define SOAP_SOCKET SOCKET # define soap_closesocket(n) closesocket(n) # else # define SOAP_SOCKET int # define soap_closesocket(n) close(n) # endif #endif #define SOAP_INVALID_SOCKET ((SOAP_SOCKET)-1) #define soap_valid_socket(n) ((n) != SOAP_INVALID_SOCKET) #define SOAP_SHUT_WR (1) #define SOAP_SHUT_RDWR (2) #ifndef SOAP_GAI_STRERROR # define SOAP_GAI_STRERROR gai_strerror #endif #ifndef FD_SETSIZE # define FD_SETSIZE (1024) #endif #ifdef WITH_LEAN # define SOAP_CHK_EOF SOAP_EOF #else # define SOAP_CHK_EOF (soap->error ? soap->error : SOAP_EOF) #endif #ifdef __cplusplus # ifndef __STDC_FORMAT_MACROS # define __STDC_FORMAT_MACROS # endif #endif #if defined(SYMBIAN) # define LONG64 long # define ULONG64 unsigned LONG64 #elif !defined(__cplusplus) && defined(__STDC__) && !defined(__STDC_VERSION__) /* C90? */ # define LONG64 long # define ULONG64 unsigned LONG64 # ifndef SOAP_LONG_FORMAT # define SOAP_LONG_FORMAT "%ld" # endif # ifndef SOAP_ULONG_FORMAT # define SOAP_ULONG_FORMAT "%lu" # endif # undef HAVE_STRTOLL # undef HAVE_STRTOULL #elif !defined(WIN32) || defined(CYGWIN) || defined(__GLIBC__) || defined(__GNU__) # ifndef LONG64 # if defined(HAVE_INTTYPES_H) # ifdef HAVE_STDINT_H # include # endif # include # define LONG64 int64_t # define ULONG64 uint64_t # elif defined(HAVE_SYS_INTTYPES_H) # include # define LONG64 int64_t # define ULONG64 uint64_t # elif defined(HAVE_STDINT_H) # include # define LONG64 int64_t # define ULONG64 uint64_t # elif defined(__GLIBC__) # include # if (__WORDSIZE == 64) # define LONG64 int64_t # define ULONG64 uint64_t # ifndef SOAP_LONG_FORMAT # define SOAP_LONG_FORMAT "%ld" # endif # ifndef SOAP_ULONG_FORMAT # define SOAP_ULONG_FORMAT "%lu" # endif # else # define LONG64 long long # define ULONG64 unsigned LONG64 # endif # else # define LONG64 long long # define ULONG64 unsigned LONG64 # endif # endif #elif defined(UNDER_CE) # define LONG64 __int64 # define ULONG64 unsigned LONG64 #elif defined(__BORLANDC__) # define LONG64 __int64 # define ULONG64 unsigned LONG64 #endif #ifdef PRId64 # ifndef SOAP_LONG_FORMAT # define SOAP_LONG_FORMAT "%" PRId64 # endif #endif #ifdef PRIu64 # ifndef SOAP_ULONG_FORMAT # define SOAP_ULONG_FORMAT "%" PRIu64 # endif #endif #ifndef SOAP_LONG_FORMAT # define SOAP_LONG_FORMAT "%lld" /* printf format for 64 bit ints */ #endif #ifndef SOAP_ULONG_FORMAT # define SOAP_ULONG_FORMAT "%llu" /* printf format for unsigned 64 bit ints */ #endif #if defined(WIN32) && !defined(CYGWIN) # define soap_int32 __int32 #elif defined(SYMBIAN) # define soap_int32 long #elif defined(PALM) # define soap_int32 Int32 #elif defined(_AIX) || defined(AIX) # if defined(_AIX43) # define soap_int32 int32_t # else # define soap_int32 signed int # endif #else # define soap_int32 int32_t #endif #ifdef WIN32 # define SOAP_ERANGE ERANGE # define SOAP_EINTR WSAEINTR # define SOAP_EAGAIN WSAEWOULDBLOCK # define SOAP_EWOULDBLOCK WSAEWOULDBLOCK # define SOAP_EINPROGRESS WSAEINPROGRESS # define SOAP_EADDRINUSE WSAEADDRINUSE # define SOAP_ECONNREFUSED WSAECONNREFUSED #else # ifdef ERANGE # define SOAP_ERANGE ERANGE # else # define SOAP_ERANGE (34) # endif # define SOAP_EINTR EINTR # define SOAP_EAGAIN EAGAIN # define SOAP_EADDRINUSE EADDRINUSE # define SOAP_ECONNREFUSED ECONNREFUSED # ifdef SYMBIAN # define SOAP_EWOULDBLOCK 9898 # define SOAP_EINPROGRESS 9899 # else # define SOAP_EWOULDBLOCK EWOULDBLOCK # define SOAP_EINPROGRESS EINPROGRESS # endif #endif #ifdef WIN32 # ifdef UNDER_CE # define soap_errno GetLastError() # define soap_socket_errno(s) GetLastError() # define soap_reset_errno SetLastError(0) # else # define soap_errno GetLastError() # define soap_socket_errno(s) WSAGetLastError() # define soap_reset_errno SetLastError(0) # endif #else # ifndef WITH_NOIO # define soap_errno errno # define soap_socket_errno(s) errno # define soap_reset_errno (errno = 0) # else # define soap_errno 0 # define soap_socket_errno(s) 0 # define soap_reset_errno # endif #endif #ifndef SOAP_BUFLEN # if !defined(WITH_LEAN) # define SOAP_BUFLEN (65536) /* buffer length for socket packets, also used by gethostbyname_r and UDP messages, so don't make this too small */ # else # define SOAP_BUFLEN (2048) /* lean size */ # endif #endif #ifndef SOAP_LABLEN # define SOAP_LABLEN (256) /* initial look-aside buffer length */ #endif #ifndef SOAP_PTRBLK # define SOAP_PTRBLK (32) /* block allocation for pointer hash table chains */ #endif #ifndef SOAP_PTRHASH # ifndef WITH_LEAN # define SOAP_PTRHASH (4096) /* size of pointer analysis hash table (must be power of 2) */ # else # define SOAP_PTRHASH (32) # endif #endif #ifndef SOAP_IDHASH # ifndef WITH_LEAN # define SOAP_IDHASH (1999) /* prime size of hash table for parsed id/ref */ # else # define SOAP_IDHASH (19) /* 19, 199 */ # endif #endif #ifndef SOAP_BLKLEN # ifndef WITH_LEAN # define SOAP_BLKLEN (256) /* to collect long strings and XML attributes */ # else # define SOAP_BLKLEN (32) # endif #endif #ifndef SOAP_TAGLEN # ifndef WITH_LEAN # define SOAP_TAGLEN (1024) /* maximum length of XML element tag/attribute name or host/path name + 1 */ # else # define SOAP_TAGLEN (128) # endif #endif #ifndef SOAP_HDRLEN # ifndef WITH_LEAN # define SOAP_HDRLEN (8192) /* maximum length of HTTP header line (must be >4096 to read cookies) */ # else # define SOAP_HDRLEN (1024) # endif #endif #ifndef SOAP_TMPLEN # ifndef WITH_LEAN # define SOAP_TMPLEN (1024) /* maximum length of msgbuf and tmpbuf short message buffers, must be >=1024 */ # else # define SOAP_TMPLEN (1024) # endif #endif #ifndef SOAP_MAXDIMS # ifndef WITH_LEAN # define SOAP_MAXDIMS (16) /* maximum array dimensions (array nestings) must be less than 64 to protect soap->tmpbuf */ # else # define SOAP_MAXDIMS (4) # endif #endif #ifndef SOAP_MAXPTRS # ifndef WITH_LEAN # define SOAP_MAXPTRS (4) /* maximum depth + 1 of id-ref deserialized pointer types (int* has depth 0, int*** has depth 2) */ # else # define SOAP_MAXPTRS (2) # endif #endif #ifndef SOAP_MAXLOGS # define SOAP_MAXLOGS (3) /* max number of debug logs per struct soap environment */ # define SOAP_INDEX_RECV (0) # define SOAP_INDEX_SENT (1) # define SOAP_INDEX_TEST (2) #endif /* Tag name of multiref elements in SOAP 1.1 encoding */ #ifndef SOAP_MULTIREFTAG # define SOAP_MULTIREFTAG "id" #endif /* href-id value base name in multiref SOAP encoding */ #ifndef SOAP_BASEREFNAME # define SOAP_BASEREFNAME "_" #endif /* Max number of EINTR while poll/select on a socket */ /* Each EINTR can lengthen the I/O blocking time by at most one second */ #ifndef SOAP_MAXEINTR # define SOAP_MAXEINTR (10) #endif /* SOAP_MAXKEEPALIVE: Max iterations in soap_serve() to keep server connection alive */ #ifndef SOAP_MAXKEEPALIVE # define SOAP_MAXKEEPALIVE (100) #endif /* SOAP_MAXARRAYSIZE: Trusted total max size of an inbound SOAP Array. Arrays of larger size are not pre-allocated, but deserialized on an element-by-element basis. */ #ifndef SOAP_MAXARRAYSIZE # define SOAP_MAXARRAYSIZE (100000) #endif /* SOAP_MAXDIMESIZE: Trusted max size of inbound DIME data. Increase if necessary to allow larger attachments, or decrease when server resources are limited. */ #ifndef SOAP_MAXDIMESIZE # define SOAP_MAXDIMESIZE (8*1048576) /* 8 MB */ #endif /* SOAP_MAXINFLATESIZE: Trusted inflated content size. Larger content is subject to the SOAP_MINDEFLATERATIO constraint. If SOAP_MINDEFLATERATIO is 1.0, SOAP_MAXINFLATESIZE is always the max size of uncompressed content. */ #ifndef SOAP_MAXINFLATESIZE # define SOAP_MAXINFLATESIZE (1*1048576) /* 1 MB */ #endif /* SOAP_MINDEFLATERATIO: Trusted deflation ratio after SOAP_MAXINFLATESIZE is reached. Trust when compressed / deflated > SOAP_MINDEFLATERATIO Sets a ratio > 0.00096899224806 (1032:1) According to the zlib site: the limit (1032:1) comes from the fact that one length/distance pair can represent at most 258 output bytes. A length requires at least one bit and a distance requires at least one bit, so two bits in can give 258 bytes out, or eight bits in give 1032 bytes out. A dynamic block has no length restriction, so you could get arbitrarily close to the limit of 1032:1. */ #ifndef SOAP_MINDEFLATERATIO # define SOAP_MINDEFLATERATIO (0.001) /* ratio of deflated/inflated > 0.1% */ #endif #ifdef VXWORKS # ifdef WMW_RPM_IO # include "httpLib.h" # endif # ifdef __INCmathh # include # ifndef HAVE_ISNAN # define HAVE_ISNAN # endif # ifndef soap_isnan # define soap_isnan(num) isNan(num) # endif # endif # ifdef WM_SECURE_KEY_STORAGE # include # endif #endif #ifdef WIN32 # ifndef HAVE_ISNAN # define HAVE_ISNAN # endif # define soap_isnan(n) _isnan(n) # ifndef HAVE_ISINF # define HAVE_ISINF # endif # define soap_isinf(n) (!_finite(n)) #endif #ifdef SUN_OS # define HAVE_ISNAN #endif #ifdef __APPLE__ # ifdef __cplusplus # ifndef isnan extern "C" int isnan(double); extern "C" int isinf(double); # endif # endif # ifndef HAVE_ISNAN # define HAVE_ISNAN # endif # ifndef HAVE_ISINF # define HAVE_ISINF # endif #endif #if !defined(HAVE_ISNAN) && (defined(_MATH_H) || defined(_MATH_INCLUDED)) # define HAVE_ISNAN #endif union soap_double_nan {struct {unsigned int n1, n2;} iv; double dv; float fv;}; extern const union soap_double_nan soap_double_nan; extern const char soap_base64o[], soap_base64i[]; #ifdef VXWORKS # ifndef FLT_MAX # define FLT_MAX _ARCH_FLT_MAX # endif # ifndef DBL_MAX # define DBL_MAX _ARCH_DBL_MAX # endif #endif #ifndef FLT_NAN # define FLT_NAN (soap_double_nan.fv) #endif #ifndef FLT_PINFTY # if defined(INFINITY) # define FLT_PINFTY INFINITY # elif defined(FLT_MAX) # define FLT_PINFTY FLT_MAX # elif defined(HUGE_VALF) # define FLT_PINFTY (float)HUGE_VALF # elif defined(HUGE_VAL) # define FLT_PINFTY (float)HUGE_VAL # elif defined(FLOAT_MAX) # define FLT_PINFTY FLOAT_MAX # else # define FLT_PINFTY (3.40282347e+38F) # endif #endif #ifndef FLT_NINFTY # define FLT_NINFTY (-FLT_PINFTY) #endif #ifndef DBL_NAN # define DBL_NAN (soap_double_nan.dv) #endif #ifndef DBL_PINFTY # if defined(INFINITY) # define DBL_PINFTY INFINITY # elif defined(DBL_MAX) # define DBL_PINFTY DBL_MAX # elif defined(HUGE_VALF) # define DBL_PINFTY (double)HUGE_VALF # elif defined(HUGE_VAL) # define DBL_PINFTY (double)HUGE_VAL # elif defined(DOUBLE_MAX) # define DBL_PINFTY DOUBLE_MAX # else # define DBL_PINFTY (1.7976931348623157e+308) # endif #endif #ifndef DBL_NINFTY # define DBL_NINFTY (-DBL_PINFTY) #endif #ifndef soap_isnan # ifdef HAVE_ISNAN # define soap_isnan(n) isnan(n) # else # define soap_isnan(n) ((n) != (n)) # endif #endif #ifndef soap_isinf # ifdef HAVE_ISINF # define soap_isinf(n) isinf(n) # else # define soap_isinf(n) (!soap_isnan(n) && soap_isnan((n) - (n))) # endif #endif #define soap_ispinfd(n) ((n) > 0 && soap_isinf(n)) #define soap_ispinff(n) ((n) > 0 && soap_isinf(n)) #define soap_isninfd(n) ((n) < 0 && soap_isinf(n)) #define soap_isninff(n) ((n) < 0 && soap_isinf(n)) /* Safer str & mem functions */ /* The gSOAP code uses guards to ensure that these functions are well behaved and do not raise errors. Therefore, the WIN _s functions should never execute the "invalid parameter handler". */ /* use safer snprintf if possible or guard sprintf against overrun (assumes no variadic macros) */ # ifdef HAVE_SNPRINTF # if _MSC_VER >= 1400 # define SOAP_SNPRINTF(buf, len, num) void)_snprintf_s((buf), (len), _TRUNCATE # define SOAP_SNPRINTF_SAFE(buf, len) void)_snprintf_s((buf), (len), _TRUNCATE # else # define SOAP_SNPRINTF(buf, len, num) void)snprintf((buf), (len) # define SOAP_SNPRINTF_SAFE(buf, len) void)snprintf((buf), (len) # endif # else # define SOAP_SNPRINTF(buf, len, num) (len) <= (num)) ? (void)((buf)[0] = '\0') : (void)sprintf((buf) # define SOAP_SNPRINTF_SAFE(buf, len) void)sprintf((buf) # endif /* copy string (truncating the result) */ #if _MSC_VER >= 1400 # define soap_strcpy(buf, len, src) (void)strncpy_s((buf), (len), (src), _TRUNCATE) #elif defined(HAVE_STRLCPY) # define soap_strcpy(buf, len, src) (void)strlcpy((buf), (src), (len)) #else # define soap_strcpy(buf, len, src) (void)((buf) && (size_t)(len) > 0 && (strncpy((buf), (src), (len) - 1), (buf)[(len) - 1] = '\0')) #endif /* copy string up to n chars (nul on overrun) */ #if _MSC_VER >= 1400 # define soap_strncpy(buf, len, src, num) (void)strncpy_s((buf), (len), (src), (num)) #else # define soap_strncpy(buf, len, src, num) (void)((buf) && ((size_t)(len) > (size_t)(num) ? (strncpy((buf), (src), (num)), (buf)[(size_t)(num)] = '\0') : ((buf)[0] = '\0'))) #endif /* concat string up to n chars (nul on overrun) */ #if _MSC_VER >= 1400 # define soap_strncat(buf, len, src, num) (void)strncat_s((buf), (len), (src), (num)) #else # define soap_strncat(buf, len, src, num) (void)((buf) && ((size_t)(len) > strlen((buf)) + (size_t)(num) ? (strncat((buf), (src), (num)), (buf)[(size_t)(len) - 1] = '\0') : ((buf)[0] = '\0'))) #endif /* copy memory (error on overrun) */ #if _MSC_VER >= 1400 # define soap_memcpy(buf, len, src, num) ((buf) && (size_t)(len) >= (size_t)(num) ? memcpy_s((buf), (len), (src), (num)) : SOAP_ERANGE) #else # define soap_memcpy(buf, len, src, num) ((buf) && (size_t)(len) >= (size_t)(num) ? !memcpy((buf), (src), (num)) : SOAP_ERANGE) #endif /* move memory (error on overrun) */ #if _MSC_VER >= 1400 # define soap_memmove(buf, len, src, num) ((buf) && (size_t)(len) >= (size_t)(num) ? memmove_s((buf), (len), (src), (num)) : SOAP_ERANGE) #else # define soap_memmove(buf, len, src, num) ((buf) && (size_t)(len) >= (size_t)(num) ? !memmove((buf), (src), (num)) : SOAP_ERANGE) #endif /* gSOAP status/error codes */ typedef soap_int32 soap_status; #define SOAP_EOF EOF #define SOAP_ERR EOF #define SOAP_OK 0 #define SOAP_CLI_FAULT 1 #define SOAP_SVR_FAULT 2 #define SOAP_TAG_MISMATCH 3 #define SOAP_TYPE 4 #define SOAP_SYNTAX_ERROR 5 #define SOAP_NO_TAG 6 #define SOAP_IOB 7 #define SOAP_MUSTUNDERSTAND 8 #define SOAP_NAMESPACE 9 #define SOAP_USER_ERROR 10 #define SOAP_FATAL_ERROR 11 #define SOAP_FAULT 12 #define SOAP_NO_METHOD 13 #define SOAP_NO_DATA 14 #define SOAP_GET_METHOD 15 #define SOAP_PUT_METHOD 16 #define SOAP_DEL_METHOD 17 /* deprecated */ #define SOAP_HEAD_METHOD 18 /* deprecated */ #define SOAP_HTTP_METHOD 19 #define SOAP_EOM 20 #define SOAP_MOE 21 #define SOAP_HDR 22 #define SOAP_NULL 23 #define SOAP_DUPLICATE_ID 24 #define SOAP_MISSING_ID 25 #define SOAP_HREF 26 #define SOAP_UDP_ERROR 27 #define SOAP_TCP_ERROR 28 #define SOAP_HTTP_ERROR 29 #define SOAP_SSL_ERROR 30 #define SOAP_ZLIB_ERROR 31 #define SOAP_DIME_ERROR 32 #define SOAP_DIME_HREF 33 #define SOAP_DIME_MISMATCH 34 #define SOAP_DIME_END 35 #define SOAP_MIME_ERROR 36 #define SOAP_MIME_HREF 37 #define SOAP_MIME_END 38 #define SOAP_VERSIONMISMATCH 39 #define SOAP_PLUGIN_ERROR 40 #define SOAP_DATAENCODINGUNKNOWN 41 #define SOAP_REQUIRED 42 #define SOAP_PROHIBITED 43 #define SOAP_OCCURS 44 #define SOAP_LENGTH 45 #define SOAP_PATTERN 46 #define SOAP_FD_EXCEEDED 47 #define SOAP_UTF_ERROR 48 #define SOAP_NTLM_ERROR 49 #define soap_xml_error_check(e) ((e) == SOAP_TAG_MISMATCH || (e) == SOAP_NO_TAG || (e) == SOAP_SYNTAX_ERROR || (e) == SOAP_NAMESPACE || (e) == SOAP_DUPLICATE_ID || (e) == SOAP_MISSING_ID || (e) == SOAP_REQUIRED || (e) == SOAP_PROHIBITED || (e) == SOAP_OCCURS || (e) == SOAP_LENGTH || (e) == SOAP_PATTERN || (e) == SOAP_NULL || (e) == SOAP_HREF) #define soap_soap_error_check(e) ((e) == SOAP_CLI_FAULT || (e) == SOAP_SVR_FAULT || (e) == SOAP_VERSIONMISMATCH || (e) == SOAP_MUSTUNDERSTAND || (e) == SOAP_FAULT || (e) == SOAP_NO_METHOD) #define soap_tcp_error_check(e) ((e) == SOAP_EOF || (e) == SOAP_TCP_ERROR) #define soap_ssl_error_check(e) ((e) == SOAP_SSL_ERROR) #define soap_zlib_error_check(e) ((e) == SOAP_ZLIB_ERROR) #define soap_http_error_check(e) ((e) == SOAP_HTTP_ERROR || (e) == SOAP_NO_DATA || ((e) >= SOAP_GET_METHOD && (e) <= SOAP_HTTP_METHOD) || ((e) >= 100 && (e) < 600)) /* gSOAP HTTP response status codes 100 to 599 are reserved */ /* Codes 600 to 999 are user definable */ /* Exceptional gSOAP HTTP server response status codes >= 1000 */ #define SOAP_STOP 1000 /* No HTTP response */ #define SOAP_FORM 1001 /* Request (form) data is present, no HTTP response */ #define SOAP_HTML 1002 /* Custom HTML response */ #define SOAP_FILE 1003 /* Custom file-based response */ /* gSOAP HTTP method codes (client) */ #define SOAP_POST 2000 /* POST request */ #define SOAP_POST_FILE 2001 /* Custom file-based POST request */ #define SOAP_GET 2002 /* GET request */ #define SOAP_PUT 2003 /* PUT request */ #define SOAP_DEL 2004 /* DELETE request */ #define SOAP_CONNECT 2005 /* CONNECT request */ /* gSOAP DIME */ #define SOAP_DIME_CF 0x01 #define SOAP_DIME_ME 0x02 #define SOAP_DIME_MB 0x04 #define SOAP_DIME_VERSION 0x08 /* DIME version 1 */ #define SOAP_DIME_MEDIA 0x10 #define SOAP_DIME_ABSURI 0x20 /* gSOAP ZLIB */ #define SOAP_ZLIB_NONE 0x00 #define SOAP_ZLIB_DEFLATE 0x01 #define SOAP_ZLIB_INFLATE 0x02 #define SOAP_ZLIB_GZIP 0x02 /* gSOAP transport, connection, and content encoding modes */ typedef soap_int32 soap_mode; #define SOAP_IO 0x00000003 /* IO mask */ #define SOAP_IO_FLUSH 0x00000000 /* flush output immediately, no buffering */ #define SOAP_IO_BUFFER 0x00000001 /* buffer output in packets of size SOAP_BUFLEN */ #define SOAP_IO_STORE 0x00000002 /* store entire output to determine length for transport */ #define SOAP_IO_CHUNK 0x00000003 /* use HTTP chunked transfer AND buffer packets */ #define SOAP_IO_UDP 0x00000004 /* TCP or UDP */ #define SOAP_IO_LENGTH 0x00000008 /* calc message length (internal) */ #define SOAP_IO_KEEPALIVE 0x00000010 /* keep connection alive */ #define SOAP_ENC 0x00000FFF /* IO and ENC mask */ #define SOAP_ENC_LATIN 0x00000020 /* in: accept iso-8859-1 */ #define SOAP_ENC_XML 0x00000040 /* out: plain (XML or other) body, no HTTP header */ #define SOAP_ENC_DIME 0x00000080 #define SOAP_ENC_MIME 0x00000100 #define SOAP_ENC_MTOM 0x00000200 #define SOAP_ENC_ZLIB 0x00000400 #define SOAP_ENC_SSL 0x00000800 #define SOAP_XML_STRICT 0x00001000 /* in: strict validation */ #define SOAP_XML_INDENT 0x00002000 /* out: emit indented XML */ #define SOAP_XML_IGNORENS 0x00004000 /* in: ignore namespaces */ #define SOAP_XML_DEFAULTNS 0x00008000 /* out: emit xmlns="..." */ #define SOAP_XML_CANONICAL 0x00010000 /* out: excC14N canonical XML */ #define SOAP_XML_TREE 0x00020000 /* in/out: XML tree (no id/ref) */ #define SOAP_XML_NIL 0x00040000 /* out: all NULLs as xsi:nil */ #define SOAP_XML_NOTYPE 0x00080000 /* out: do not add xsi:type */ #define SOAP_DOM_TREE 0x00100000 /* see DOM manual */ #define SOAP_DOM_NODE 0x00200000 #define SOAP_DOM_ASIS 0x00400000 #define SOAP_RESERVED 0x00800000 /* reserved for future use */ #define SOAP_C_NOIOB 0x01000000 /* don't fault on array index out of bounds (just ignore) */ #define SOAP_C_UTFSTRING 0x02000000 /* (de)serialize strings with UTF8 content */ #define SOAP_C_MBSTRING 0x04000000 /* (de)serialize strings with multi-byte content */ #define SOAP_C_NILSTRING 0x08000000 /* serialize empty strings as nil (omitted) */ #define SOAP_XML_DOM 0x10000000 /* enable internal DOM */ #define SOAP_XML_GRAPH 0x20000000 /* force id-ref XML graph */ #define SOAP_MIME_POSTCHECK 0x40000000 /* MIME flag (internal) */ #define SOAP_SEC_WSUID 0x80000000 /* Add Body wsu:Id flag (internal) */ /* WITH_XMLNS backward compatibility: always use XML default namespaces */ #ifdef WITH_XMLNS # define SOAP_IO_DEFAULT (SOAP_IO_FLUSH | SOAP_XML_DEFAULTNS) #else # define SOAP_IO_DEFAULT SOAP_IO_FLUSH #endif /* SSL client/server authentication settings */ #define SOAP_SSL_NO_AUTHENTICATION 0x0000 /* for testing purposes */ #define SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION 0x0001 /* client requires server to authenticate (default) */ #define SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION 0x0002 /* server requires client to authenticate */ #define SOAP_SSL_SKIP_HOST_CHECK 0x0004 /* client skips common name check against host name */ #define SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE 0x0008 /* allow self-signed and expired certificates and those w/o CRL */ #define SOAP_SSL_NO_DEFAULT_CA_PATH 0x0010 /* don't use default_verify_paths */ #define SOAP_SSL_RSA 0x0020 /* use RSA */ #define SOAP_TLSv1 0x0000 /* enable TLS v1.0/1.1/1.2 only (default) */ #define SOAP_SSLv3_TLSv1 0x0040 /* enable SSL v3 and TLS v1.0/1.1/1.2 */ #define SOAP_SSLv3 0x0080 /* only SSL v3 */ #define SOAP_TLSv1_0 0x0100 /* only TLS v1.0 */ #define SOAP_TLSv1_1 0x0200 /* only TLS v1.1 */ #define SOAP_TLSv1_2 0x0400 /* only TLS v1.2 */ #define SOAP_SSL_CLIENT 0x1000 /* client context */ #define SOAP_SSL_DEFAULT (SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION | SOAP_TLSv1) /* state */ #define SOAP_NONE 0 #define SOAP_INIT 1 #define SOAP_COPY 2 #define soap_check_state(soap) (!(soap) || ((soap)->state != SOAP_INIT && (soap)->state != SOAP_COPY)) /* parts */ #define SOAP_BEGIN 0 #define SOAP_IN_ENVELOPE 2 #define SOAP_IN_HEADER 3 #define SOAP_END_HEADER 4 #define SOAP_NO_BODY 5 #define SOAP_IN_BODY 6 #define SOAP_END_BODY 7 #define SOAP_END_ENVELOPE 8 #define SOAP_END 9 /* events */ #define SOAP_SEC_BEGIN 1 #define SOAP_SEC_SIGN 2 #define SOAP_SEC_DECRYPT 3 /* DEBUG macros */ #ifndef WITH_LEAN # ifdef DEBUG_STAMP # ifndef DEBUG # define DEBUG # endif # endif # ifdef DEBUG # ifndef SOAP_DEBUG # define SOAP_DEBUG # endif # ifndef SOAP_MEM_DEBUG # define SOAP_MEM_DEBUG # endif # endif #endif #ifdef SOAP_MEM_DEBUG # ifndef SOAP_MALLOC # define SOAP_MALLOC(soap, size) soap_track_malloc((soap), __FILE__, __LINE__, (size)) # endif # ifndef SOAP_FREE # define SOAP_FREE(soap, ptr) soap_track_free((soap), __FILE__, __LINE__, (void*)(ptr)) # endif #endif #ifndef SOAP_MALLOC /* use libc malloc */ # define SOAP_MALLOC(soap, size) malloc(size) #endif #ifndef SOAP_FREE /* use libc free */ # define SOAP_FREE(soap, ptr) free((void*)(ptr)) #endif #ifndef SOAP_NOTHROW # if defined(__GNUC__) && (__GNUC__ <= 2) # define SOAP_NOTHROW # elif defined(WITH_LEAN) || defined(WITH_COMPAT) # define SOAP_NOTHROW # else # define SOAP_NOTHROW (std::nothrow) # endif #endif #if (defined(__GNUC__) && (__GNUC__ <= 2) && !defined(__BORLANDC__)) || defined(__clang__) || defined(_AIX) || defined(AIX) /* old form w/o parenthesis */ # ifndef SOAP_NEW # define SOAP_NEW(type) new SOAP_NOTHROW type # endif # ifndef SOAP_NEW_ARRAY # define SOAP_NEW_ARRAY(type, n) new SOAP_NOTHROW type[n] # endif # ifndef SOAP_PLACEMENT_NEW # define SOAP_PLACEMENT_NEW(buf, type) new (buf) type # endif #else /* new form with parenthesis */ # ifndef SOAP_NEW # define SOAP_NEW(type) new SOAP_NOTHROW (type) # endif # ifndef SOAP_NEW_ARRAY # define SOAP_NEW_ARRAY(type, n) new SOAP_NOTHROW type[n] # endif # ifndef SOAP_PLACEMENT_NEW # define SOAP_PLACEMENT_NEW(buf, type) new (buf) (type) # endif #endif #ifndef SOAP_NEW_COPY /* use C++ new operator for ::copy() */ # define SOAP_NEW_COPY(clas) new SOAP_NOTHROW clas #endif #ifndef SOAP_DELETE /* use C++ delete operator */ # define SOAP_DELETE(obj) delete obj #endif #ifndef SOAP_DELETE_ARRAY /* use C++ delete[] operator */ # define SOAP_DELETE_ARRAY(obj) delete[] obj #endif #ifdef SOAP_DEBUG # ifndef SOAP_MESSAGE # define SOAP_MESSAGE fprintf # endif # ifndef DBGLOG # ifdef DEBUG_STAMP # ifdef WIN32 # define DBGLOG(DBGFILE, CMD) \ { if (soap)\ { if (!soap->fdebug[SOAP_INDEX_##DBGFILE])\ soap_open_logfile((struct soap*)soap, SOAP_INDEX_##DBGFILE);\ if (soap->fdebug[SOAP_INDEX_##DBGFILE])\ { FILE *fdebug = soap->fdebug[SOAP_INDEX_##DBGFILE];\ SYSTEMTIME _localTime;\ ::GetLocalTime(&_localTime); \ fprintf(fdebug, "%02d%02d%02d %02d:%02d:%02d.%03d|", _localTime.wYear%100, _localTime.wMonth, _localTime.wDay, _localTime.wHour, _localTime.wMinute, _localTime.wSecond, _localTime.wMilliseconds);\ CMD;\ fflush(fdebug);\ }\ }\ } # else # define DBGLOG(DBGFILE, CMD) \ { if (soap)\ { if (!soap->fdebug[SOAP_INDEX_##DBGFILE])\ soap_open_logfile((struct soap*)soap, SOAP_INDEX_##DBGFILE);\ if (soap->fdebug[SOAP_INDEX_##DBGFILE])\ { FILE *fdebug = soap->fdebug[SOAP_INDEX_##DBGFILE];\ struct timeval _tv;\ struct tm _tm;\ gettimeofday(&_tv, NULL);\ localtime_r(&_tv.tv_sec, &_tm);\ fprintf(fdebug, "%02d%02d%02d %02d:%02d:%02d.%06d|", _tm.tm_year%100, _tm.tm_mon+1, _tm.tm_mday, _tm.tm_hour, _tm.tm_min, _tm.tm_sec, _tv.tv_usec);\ CMD;\ fflush(fdebug);\ }\ }\ } # endif # else # define DBGLOG(DBGFILE, CMD) \ { if (soap)\ { if (!soap->fdebug[SOAP_INDEX_##DBGFILE])\ soap_open_logfile((struct soap*)soap, SOAP_INDEX_##DBGFILE);\ if (soap->fdebug[SOAP_INDEX_##DBGFILE])\ { FILE *fdebug = soap->fdebug[SOAP_INDEX_##DBGFILE];\ CMD;\ fflush(fdebug);\ }\ }\ } # endif # endif # ifndef DBGMSG # define DBGMSG(DBGFILE, MSG, LEN) \ { if (soap)\ { if (!soap->fdebug[SOAP_INDEX_##DBGFILE])\ soap_open_logfile((struct soap*)soap, SOAP_INDEX_##DBGFILE);\ if (soap->fdebug[SOAP_INDEX_##DBGFILE])\ { fwrite((void*)(MSG), 1, (size_t)(LEN), soap->fdebug[SOAP_INDEX_##DBGFILE]);\ fflush(soap->fdebug[SOAP_INDEX_##DBGFILE]);\ }\ }\ } # endif # ifndef DBGFUN # define DBGFUN(FNAME) DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%s(%d): %s()\n", __FILE__, __LINE__, FNAME)) # define DBGFUN1(FNAME, FMT, ARG) DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%s(%d): %s(" FMT ")\n", __FILE__, __LINE__, FNAME, (ARG))) # define DBGFUN2(FNAME, FMT1, ARG1, FMT2, ARG2) DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%s(%d): %s(" FMT1 ", " FMT2 ")\n", __FILE__, __LINE__, FNAME, (ARG1), (ARG2))) # define DBGFUN3(FNAME, FMT1, ARG1, FMT2, ARG2, FMT3, ARG3) DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%s(%d): %s(" FMT1 ", " FMT2 ", " FMT3 ")\n", __FILE__, __LINE__, FNAME, (ARG1), (ARG2), (ARG3))) # endif # ifndef DBGHEX # define DBGHEX(DBGFILE, MSG, LEN) \ { if (soap)\ { if (!soap->fdebug[SOAP_INDEX_##DBGFILE])\ soap_open_logfile(soap, SOAP_INDEX_##DBGFILE);\ if (soap->fdebug[SOAP_INDEX_##DBGFILE])\ { int i; char *s;\ for (s = (char*)(MSG), i = (LEN); i; i--)\ fprintf(soap->fdebug[SOAP_INDEX_##DBGFILE], "%2.2X ", (int)*s++&0xFF);\ fflush(soap->fdebug[SOAP_INDEX_##DBGFILE]);\ }\ }\ } # endif #else # define DBGLOG(DBGFILE, CMD) # define DBGMSG(DBGFILE, MSG, LEN) # define DBGFUN(FNAME) # define DBGFUN1(FNAME, FMT, ARG) # define DBGFUN2(FNAME, FMT1, ARG1, FMT2, ARG2) # define DBGFUN3(FNAME, FMT1, ARG1, FMT2, ARG2, FMT3, ARG3) # define DBGHEX(DBGFILE, MSG, LEN) #endif /* UCS-4 requires 32 bits (0-7FFFFFFF, the sign bit is used by gSOAP to distinguish XML entities) */ typedef soap_int32 soap_wchar; /* namespace table row */ struct Namespace { const char *id; const char *ns; const char *in; char *out; }; /* namespace stack */ struct soap_nlist { struct soap_nlist *next; unsigned int level; /* nesting depth level */ short index; /* corresponding entry in ns mapping table */ const char *ns; /* only set when parsed ns URI is not in the ns mapping table */ char id[1]; /* the actual string value flows into the allocated region id[0...] below this struct */ }; /* block header, the data flows into the allocated region below this struct */ struct soap_bhead { struct soap_bhead *next; size_t size; }; /* block stack for nested block allocations */ struct soap_blist { struct soap_blist *next; struct soap_bhead *head; size_t size; }; /* pointer serialization management */ struct soap_plist { struct soap_plist *next; const void *ptr; void *dup; const void *array; /* array pointer */ int size; /* array size */ int type; int id; char mark1; /* 0=single-ref, 1=embedded-multi-ref (SOAP1.1), 2=multi-ref, 3=attachment */ char mark2; }; /* block allocation for pointer serialization management */ struct soap_pblk { struct soap_pblk *next; struct soap_plist plist[SOAP_PTRBLK]; }; #ifdef SOAP_MEM_DEBUG /* malloc/free tracking for debugging */ struct soap_mlist { struct soap_mlist *next; const void *ptr; const char *file; int line; short live; }; #endif /* class allocation list */ struct soap_clist { struct soap_clist *next; void *ptr; int type; int size; /* array size */ int (*fdelete)(struct soap_clist*); }; /* attributes */ struct soap_attribute { struct soap_attribute *next; short flag; /* soap_set_attr: 1 = normal, 2 = utf content */ char *value; size_t size; const char *ns; short visible; char name[1]; /* the actual name string flows into the allocated region below this struct */ }; #ifndef WITH_LEAN struct soap_cookie { struct soap_cookie *next; char *name; char *value; char *domain; char *path; time_t expire; /* client-side: local time to expire */ long maxage; /* server-side: seconds to expire */ unsigned int version; short secure; short session; /* server-side */ short env; /* server-side: got cookie from client and should not be (re)send */ short modified; /* server-side: client cookie was modified and should be send */ }; #endif SOAP_FMAC1 struct soap_multipart* SOAP_FMAC2 soap_next_multipart(struct soap_multipart*); #ifdef __cplusplus class soap_multipart_iterator { public: struct soap_multipart *content; bool operator==(const soap_multipart_iterator& iter) const { return (bool)(content == iter.content); } bool operator!=(const soap_multipart_iterator& iter) const { return (bool)(content != iter.content); } struct soap_multipart &operator*() const { return *content; } soap_multipart_iterator &operator++() { content = soap_next_multipart(content); return *this; } soap_multipart_iterator() : content(NULL) { } soap_multipart_iterator(struct soap_multipart *p) : content(p) { } }; #endif #ifndef WITH_LEANER struct soap_dime { size_t count; size_t size; size_t chunksize; size_t buflen; char flags; char *ptr; const char *id; const char *type; const char *options; struct soap_multipart *list; /* list of DIME attachments received */ struct soap_multipart *first, *last; /* temporary in/out queue */ #ifdef __cplusplus soap_multipart_iterator begin() { soap_multipart_iterator iter(list); return iter; }; soap_multipart_iterator end() { soap_multipart_iterator iter(NULL); return iter; }; #endif }; #endif #ifndef WITH_LEANER struct soap_mime { char *boundary; /* MIME boundary */ const char *start; /* MIME start ID */ struct soap_multipart *list; /* list of MIME attachments received */ struct soap_multipart *first, *last; /* temporary in/out queue */ #ifdef __cplusplus soap_multipart_iterator begin() { soap_multipart_iterator iter(list); return iter; }; soap_multipart_iterator end() { soap_multipart_iterator iter(NULL); return iter; }; #endif }; #endif #ifndef WITH_LEANER /* RFC2045 MIME content transfer encodings */ enum soap_mime_encoding { SOAP_MIME_NONE, SOAP_MIME_7BIT, SOAP_MIME_8BIT, SOAP_MIME_BINARY, SOAP_MIME_QUOTED_PRINTABLE, SOAP_MIME_BASE64, SOAP_MIME_IETF_TOKEN, SOAP_MIME_X_TOKEN }; #endif #ifndef WITH_LEANER /* DIME/MIME multipart list */ struct soap_multipart { struct soap_multipart *next; char *ptr; /* points to raw data content */ size_t size; /* size of data content */ const char *id; /* DIME/MIME content ID or form data name */ const char *type; /* DIME/MIME type (MIME type format) */ const char *options; /* DIME options */ enum soap_mime_encoding encoding; /* MIME Content-Transfer-Encoding */ const char *location; /* MIME Content-Location (optional) */ const char *description; /* MIME Content-Description (optional) */ #ifdef __cplusplus typedef soap_multipart_iterator iterator; #endif }; #endif #ifndef WITH_LEANER /* attachment DIME and MTOM XOP forwarding */ struct soap_xlist { struct soap_xlist *next; unsigned char **ptr; int *size; char *id; char **type; char **options; }; #endif /******************************************************************************/ #ifndef WITH_LEANER /* dom.c[pp] functions (optional, compile and link dom.c[pp] */ struct soap; struct soap_dom_element; struct soap_dom_attribute; /* soap_dom_element construction */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_new(struct soap *soap, const char *ns, const char *tag); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_new_w(struct soap *soap, const char *ns, const wchar_t *tag); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_set(struct soap_dom_element *elt, const char *ns, const char *tag); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_set_w(struct soap_dom_element *elt, const char *ns, const wchar_t *tag); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att(struct soap_dom_element *elt, const char *ns, const char *tag); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_w(struct soap_dom_element *elt, const char *ns, const wchar_t *tag); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt(struct soap_dom_element *elt, const char *ns, const char *tag); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_w(struct soap_dom_element *elt, const char *ns, const wchar_t *tag); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_nth_elt(struct soap_dom_element *elt, const char *ns, const char *tag, size_t n); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_nth_elt_w(struct soap_dom_element *elt, const char *ns, const wchar_t *tag, size_t n); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_nth(struct soap_dom_element *elt, size_t n); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_add_att(struct soap_dom_element *elt, const struct soap_dom_attribute *node); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_add_elt(struct soap_dom_element *elt, const struct soap_dom_element *node); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_add_atts(struct soap_dom_element *elt, const struct soap_dom_attribute *atts); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_add_elts(struct soap_dom_element *elt, const struct soap_dom_element *elts); /* soap_dom_element assignment */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_bool(struct soap_dom_element *elt, LONG64 b); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_int(struct soap_dom_element *elt, LONG64 n); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_double(struct soap_dom_element *elt, double x); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_text(struct soap_dom_element *elt, const char *text); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_text_w(struct soap_dom_element *elt, const wchar_t *text); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_node(struct soap_dom_element *elt, const void *node, int type); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_copy(struct soap_dom_element *elt, const struct soap_dom_element *node); /* soap_dom_element properties */ SOAP_FMAC1 int SOAP_FMAC2 soap_elt_match(const struct soap_dom_element *elt, const char *ns, const char *patt); SOAP_FMAC1 int SOAP_FMAC2 soap_elt_match_w(const struct soap_dom_element *elt, const char *ns, const wchar_t *patt); SOAP_FMAC1 const char * SOAP_FMAC2 soap_elt_get_ns(const struct soap_dom_element *elt); SOAP_FMAC1 const char * SOAP_FMAC2 soap_elt_get_tag(const struct soap_dom_element *elt); SOAP_FMAC1 int SOAP_FMAC2 soap_elt_is_true(const struct soap_dom_element *elt); SOAP_FMAC1 int SOAP_FMAC2 soap_elt_is_false(const struct soap_dom_element *elt); SOAP_FMAC1 int SOAP_FMAC2 soap_elt_get_int(const struct soap_dom_element *elt); SOAP_FMAC1 long SOAP_FMAC2 soap_elt_get_long(const struct soap_dom_element *elt); SOAP_FMAC1 LONG64 SOAP_FMAC2 soap_elt_get_LONG64(const struct soap_dom_element *elt); SOAP_FMAC1 double SOAP_FMAC2 soap_elt_get_double(const struct soap_dom_element *elt); SOAP_FMAC1 const char * SOAP_FMAC2 soap_elt_get_text(const struct soap_dom_element *elt); SOAP_FMAC1 const void * SOAP_FMAC2 soap_elt_get_node(const struct soap_dom_element *elt, int type); SOAP_FMAC1 int SOAP_FMAC2 soap_elt_get_type(const struct soap_dom_element *elt, const void **node); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_parent(const struct soap_dom_element *elt); SOAP_FMAC1 size_t SOAP_FMAC2 soap_elt_depth(const struct soap_dom_element *elt); SOAP_FMAC1 size_t SOAP_FMAC2 soap_elt_index(const struct soap_dom_element *elt); SOAP_FMAC1 size_t SOAP_FMAC2 soap_elt_len(const struct soap_dom_element *elt); SOAP_FMAC1 size_t SOAP_FMAC2 soap_elt_nth(const struct soap_dom_element *elt); /* soap_dom_attribute construction */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_new(struct soap *soap, const char *ns, const char *tag); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_new_w(struct soap *soap, const char *ns, const wchar_t *tag); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_set(struct soap_dom_attribute *att, const char *ns, const char *tag); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_set_w(struct soap_dom_attribute *att, const char *ns, const wchar_t *tag); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_add(struct soap_dom_attribute *att, const char *ns, const char *tag); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_add_w(struct soap_dom_attribute *att, const char *ns, const wchar_t *tag); /* soap_dom_attribute assignment */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_bool(struct soap_dom_attribute *att, LONG64 b); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_int(struct soap_dom_attribute *att, LONG64 n); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_double(struct soap_dom_attribute *att, double x); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_text(struct soap_dom_attribute *att, const char *text); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_text_w(struct soap_dom_attribute *att, const wchar_t *text); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_copy(struct soap_dom_attribute *att, const struct soap_dom_attribute *node); /* soap_dom_attribute properties */ SOAP_FMAC1 int SOAP_FMAC2 soap_att_match(const struct soap_dom_attribute *att, const char *ns, const char *patt); SOAP_FMAC1 int SOAP_FMAC2 soap_att_match_w(const struct soap_dom_attribute *att, const char *ns, const wchar_t *patt); SOAP_FMAC1 const char * SOAP_FMAC2 soap_att_get_ns(const struct soap_dom_attribute *att); SOAP_FMAC1 const char * SOAP_FMAC2 soap_att_get_tag(const struct soap_dom_attribute *att); SOAP_FMAC1 int SOAP_FMAC2 soap_att_is_true(const struct soap_dom_attribute *att); SOAP_FMAC1 int SOAP_FMAC2 soap_att_is_false(const struct soap_dom_attribute *att); SOAP_FMAC1 int SOAP_FMAC2 soap_att_get_int(const struct soap_dom_attribute *att); SOAP_FMAC1 long SOAP_FMAC2 soap_att_get_long(const struct soap_dom_attribute *att); SOAP_FMAC1 LONG64 SOAP_FMAC2 soap_att_get_LONG64(const struct soap_dom_attribute *att); SOAP_FMAC1 double SOAP_FMAC2 soap_att_get_double(const struct soap_dom_attribute *att); SOAP_FMAC1 const char * SOAP_FMAC2 soap_att_get_text(const struct soap_dom_attribute *att); /* DOM local traversal */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_first(struct soap_dom_element *elt); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_next(const struct soap_dom_attribute *att); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_first(struct soap_dom_element *elt); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_next(const struct soap_dom_element *elt); /* DOM local retrieval */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_get(const struct soap_dom_element *elt, const char *ns, const char *tag); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_get_w(const struct soap_dom_element *elt, const char *ns, const wchar_t *tag); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_get(const struct soap_dom_element *elt, const char *ns, const char *tag); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_get_w(const struct soap_dom_element *elt, const char *ns, const wchar_t *tag); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_get_next(const struct soap_dom_element *elt); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_get_nth(struct soap_dom_element *elt, size_t n); /* DOM local search */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_find(struct soap_dom_element *elt, const char *ns, const char *patt); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_find_next(const struct soap_dom_attribute *att, const char *ns, const char *patt); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_find(struct soap_dom_element *elt, const char *ns, const char *patt); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_find_next(const struct soap_dom_element *elt, const char *ns, const char *patt); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_find_type(struct soap_dom_element *elt, const char *ns, const char *patt, int type); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_find_next_type(const struct soap_dom_element *elt, const char *ns, const char *patt, int type); /* DOM size of local search results */ SOAP_FMAC1 size_t SOAP_FMAC2 soap_att_size(struct soap_dom_element *elt, const char *ns, const char *patt); SOAP_FMAC1 size_t SOAP_FMAC2 soap_elt_size(struct soap_dom_element *elt, const char *ns, const char *patt); SOAP_FMAC1 size_t SOAP_FMAC2 soap_elt_size_type(struct soap_dom_element *elt, const char *ns, const char *patt, int type); /* DOM deep traversal */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_dom_next_attribute(const struct soap_dom_attribute *att); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_dom_next_element(const struct soap_dom_element *elt, const struct soap_dom_element *end); /* DOM deep search */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_dom_find(struct soap_dom_element *begin, const struct soap_dom_element *end, const char *ns, const char *patt, int type); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_dom_find_next(const struct soap_dom_element *elt, const struct soap_dom_element *end, const char *ns, const char *patt, int type); #endif #if defined(__cplusplus) } #endif #ifndef WITH_LEANER #ifdef __cplusplus class soap_dom_attribute_iterator { public: struct soap_dom_attribute *iter; const char *nstr; const char *name; bool operator==(const soap_dom_attribute_iterator&) const; bool operator!=(const soap_dom_attribute_iterator&) const; struct soap_dom_attribute& operator*() const; struct soap_dom_attribute *operator->() const; soap_dom_attribute_iterator& operator++(); soap_dom_attribute_iterator operator++(int); soap_dom_attribute_iterator(); soap_dom_attribute_iterator(struct soap_dom_attribute*); ~soap_dom_attribute_iterator(); }; #endif #endif #ifndef WITH_LEANER struct soap_dom_attribute { struct soap_dom_attribute *next; const char *nstr; const char *name; const char *text; struct soap *soap; #ifdef __cplusplus typedef soap_dom_attribute_iterator iterator; soap_dom_attribute(struct soap *soap = NULL); soap_dom_attribute(const soap_dom_attribute& att); soap_dom_attribute(struct soap *soap, const char *tag); soap_dom_attribute(struct soap *soap, const wchar_t *tag); soap_dom_attribute(struct soap *soap, const char *ns, const char *tag, const char *text); soap_dom_attribute(struct soap *soap, const char *ns, const char *tag, const wchar_t *text); soap_dom_attribute(struct soap *soap, const char *ns, const wchar_t *tag, const char *text); soap_dom_attribute(struct soap *soap, const char *ns, const wchar_t *tag, const wchar_t *text); soap_dom_attribute(struct soap *soap, const char *ns, const char *tag, const std::string& text); soap_dom_attribute(struct soap *soap, const char *ns, const char *tag, const std::wstring& text); soap_dom_attribute(struct soap *soap, const char *ns, const wchar_t *tag, const std::string& text); soap_dom_attribute(struct soap *soap, const char *ns, const wchar_t *tag, const std::wstring& text); ~soap_dom_attribute(); soap_dom_attribute& set(const char *ns, const char *tag) { return *soap_att_set(this, ns, tag); } soap_dom_attribute& set(const char *ns, const wchar_t *tag) { return *soap_att_set_w(this, ns, tag); } soap_dom_attribute& set(bool b) { return *soap_att_bool(this, b); } soap_dom_attribute& set(int n) { return *soap_att_int(this, n); } soap_dom_attribute& set(LONG64 n) { return *soap_att_int(this, n); } soap_dom_attribute& set(float x) { return *soap_att_double(this, x); } soap_dom_attribute& set(double x) { return *soap_att_double(this, x); } soap_dom_attribute& set(const char *text) { return *soap_att_text(this, text); } soap_dom_attribute& set(const wchar_t *text) { return *soap_att_text_w(this, text); } #ifndef WITH_COMPAT soap_dom_attribute& set(const std::string& text) { return *soap_att_text(this, text.c_str()); } soap_dom_attribute& set(const std::wstring& text) { return *soap_att_text_w(this, text.c_str()); } #endif soap_dom_attribute& operator=(bool b) { return *soap_att_bool(this, b); } soap_dom_attribute& operator=(int n) { return *soap_att_int(this, n); } soap_dom_attribute& operator=(LONG64 n) { return *soap_att_int(this, n); } soap_dom_attribute& operator=(float x) { return *soap_att_double(this, x); } soap_dom_attribute& operator=(double x) { return *soap_att_double(this, x); } soap_dom_attribute& operator=(const char *text) { return *soap_att_text(this, text); } soap_dom_attribute& operator=(const wchar_t *text) { return *soap_att_text_w(this, text); } #ifndef WITH_COMPAT soap_dom_attribute& operator=(const std::string& text) { return *soap_att_text(this, text.c_str()); } soap_dom_attribute& operator=(const std::wstring& text) { return *soap_att_text_w(this, text.c_str()); } #endif soap_dom_attribute& operator=(const soap_dom_attribute& att) { return *soap_att_copy(this, &att); } soap_dom_attribute& att(const char *tag) { return *soap_att_add(this, NULL, tag); } soap_dom_attribute& att(const wchar_t *tag) { return *soap_att_add_w(this, NULL, tag); } soap_dom_attribute& att(const char *ns, const char *tag) { return *soap_att_add(this, ns, tag); } soap_dom_attribute& att(const char *ns, const wchar_t *tag) { return *soap_att_add_w(this, ns, tag); } bool match(const char *patt) const { return soap_att_match(this, NULL, patt) != 0; } bool match(const wchar_t *patt) const { return soap_att_match_w(this, NULL, patt) != 0; } bool match(const char *ns, const char *patt) const { return soap_att_match(this, ns, patt) != 0; } bool match(const char *ns, const wchar_t *patt) const { return soap_att_match_w(this, ns, patt) != 0; } const char *ns() const { return this->nstr; } const char *tag() const { return this->name; } bool is_true() const { return soap_att_is_true(this) != 0; } bool is_false() const { return soap_att_is_false(this) != 0; } LONG64 get_int() const { return soap_att_get_LONG64(this); } double get_double() const { return soap_att_get_double(this); } const char *get_text() const { return this->text; } operator bool() const { return soap_att_is_true(this) != 0; } operator int() const { return soap_att_get_int(this); } operator LONG64() const { return soap_att_get_LONG64(this); } operator double() const { return soap_att_get_double(this); } operator const char*() const { return this->text; } soap_dom_attribute_iterator att_begin() { return soap_dom_attribute_iterator(this); } soap_dom_attribute_iterator att_end() { return soap_dom_attribute_iterator(NULL); } soap_dom_attribute_iterator att_find(const char *patt) { return att_find(NULL, patt); } soap_dom_attribute_iterator att_find(const wchar_t *patt) { return att_find(NULL, patt); } soap_dom_attribute_iterator att_find(const char *ns, const char *patt); soap_dom_attribute_iterator att_find(const char *ns, const wchar_t *patt); void unlink(); #endif }; #endif #ifndef WITH_LEANER #ifdef __cplusplus class soap_dom_element_iterator { public: struct soap_dom_element *iter; struct soap_dom_element *stop; const char *nstr; const char *name; int type; bool deep; bool operator==(const soap_dom_element_iterator&) const; bool operator!=(const soap_dom_element_iterator&) const; struct soap_dom_element& operator*() const; struct soap_dom_element *operator->() const; soap_dom_element_iterator& operator++(); soap_dom_element_iterator operator++(int); soap_dom_element_iterator(); soap_dom_element_iterator(struct soap_dom_element*); ~soap_dom_element_iterator(); }; #endif #endif #ifndef WITH_LEANER struct soap_dom_element { struct soap_dom_element *next; struct soap_dom_element *prnt; struct soap_dom_element *elts; struct soap_dom_attribute *atts; const char *nstr; const char *name; const char *lead; const char *text; const char *code; const char *tail; const void *node; int type; struct soap *soap; #ifdef __cplusplus typedef soap_dom_element_iterator iterator; soap_dom_element(struct soap *soap = NULL); soap_dom_element(const soap_dom_element& elt); soap_dom_element(struct soap *soap, const char *tag); soap_dom_element(struct soap *soap, const wchar_t *tag); soap_dom_element(struct soap *soap, const char *ns, const char *tag); soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag); soap_dom_element(struct soap *soap, const char *ns, const char *tag, const char *text); soap_dom_element(struct soap *soap, const char *ns, const char *tag, const wchar_t *text); soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag, const char *text); soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag, const wchar_t *text); #ifndef WITH_COMPAT soap_dom_element(struct soap *soap, const char *ns, const char *tag, const std::string& text); soap_dom_element(struct soap *soap, const char *ns, const char *tag, const std::wstring& text); soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag, const std::string& text); soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag, const std::wstring& text); #endif soap_dom_element(struct soap *soap, const char *ns, const char *tag, const void *node, int type); soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag, const void *node, int type); ~soap_dom_element(); soap_dom_element& set(const char *ns, const char *tag) { return *soap_elt_set(this, ns, tag); } soap_dom_element& set(const char *ns, const wchar_t *tag) { return *soap_elt_set_w(this, ns, tag); } soap_dom_element& set(bool b) { return *soap_elt_bool(this, b); } soap_dom_element& set(int n) { return *soap_elt_int(this, n); } soap_dom_element& set(LONG64 n) { return *soap_elt_int(this, n); } soap_dom_element& set(float x) { return *soap_elt_double(this, x); } soap_dom_element& set(double x) { return *soap_elt_double(this, x); } soap_dom_element& set(const char *text) { return *soap_elt_text(this, text); } soap_dom_element& set(const wchar_t *text) { return *soap_elt_text_w(this, text); } #ifndef WITH_COMPAT soap_dom_element& set(const std::string& text) { return *soap_elt_text(this, text.c_str()); } soap_dom_element& set(const std::wstring& text) { return *soap_elt_text_w(this, text.c_str()); } #endif soap_dom_element& set(const void *node, int type) { return *soap_elt_node(this, node, type); } soap_dom_element& add(soap_dom_element& elt) { return *soap_add_elt(this, &elt); } soap_dom_element& add(soap_dom_element *elt) { return *soap_add_elt(this, elt); } soap_dom_element& add(soap_dom_attribute& att) { return *soap_add_att(this, &att); } soap_dom_element& add(soap_dom_attribute *att) { return *soap_add_att(this, att); } soap_dom_element& adds(soap_dom_element& elts) { return *soap_add_elts(this, &elts); } soap_dom_element& adds(soap_dom_element *elts) { return *soap_add_elts(this, elts); } soap_dom_element& adds(soap_dom_attribute& atts) { return *soap_add_atts(this, &atts); } soap_dom_element& adds(soap_dom_attribute *atts) { return *soap_add_atts(this, atts); } soap_dom_element& operator=(bool b) { return *soap_elt_bool(this, b); } soap_dom_element& operator=(int n) { return *soap_elt_int(this, n); } soap_dom_element& operator=(LONG64 n) { return *soap_elt_int(this, n); } soap_dom_element& operator=(float x) { return *soap_elt_double(this, x); } soap_dom_element& operator=(double x) { return *soap_elt_double(this, x); } soap_dom_element& operator=(const char *text) { return *soap_elt_text(this, text); } soap_dom_element& operator=(const wchar_t *text) { return *soap_elt_text_w(this, text); } #ifndef WITH_COMPAT soap_dom_element& operator=(const std::string& text) { return *soap_elt_text(this, text.c_str()); } soap_dom_element& operator=(const std::wstring& text) { return *soap_elt_text_w(this, text.c_str()); } #endif soap_dom_element& operator=(const soap_dom_element& elt) { return *soap_elt_copy(this, &elt); } template soap_dom_element& operator=(const T& node) { return this->set(&node, node.soap_type()); } template soap_dom_element& operator=(const T *node) { return this->set(node, node->soap_type()); } template soap_dom_element& operator=(T *node) { return this->set(node, node->soap_type()); } soap_dom_attribute& att(const char *tag) { return *soap_att(this, NULL, tag); } soap_dom_attribute& att(const wchar_t *tag) { return *soap_att_w(this, NULL, tag); } soap_dom_attribute& att(const char *ns, const char *tag) { return *soap_att(this, ns, tag); } soap_dom_attribute& att(const char *ns, const wchar_t *tag) { return *soap_att_w(this, ns, tag); } soap_dom_element& elt() { return *soap_elt(this, NULL, NULL); } soap_dom_element& elt(const char *tag) { return *soap_elt(this, NULL, tag); } soap_dom_element& elt(const wchar_t *tag) { return *soap_elt_w(this, NULL, tag); } soap_dom_element& elt(const char *ns, const char *tag) { return *soap_elt(this, ns, tag); } soap_dom_element& elt(const char *ns, const wchar_t *tag) { return *soap_elt_w(this, ns, tag); } soap_dom_element& operator[](const char *tag) { return *soap_elt(this, NULL, tag); } soap_dom_element& operator[](const wchar_t *tag) { return *soap_elt_w(this, NULL, tag); } soap_dom_element& operator[](size_t n) { return *soap_nth(this, n); } soap_dom_attribute *att_get(const char *tag) const { return soap_att_get(this, NULL, tag); } soap_dom_attribute *att_get(const wchar_t *tag) const { return soap_att_get_w(this, NULL, tag); } soap_dom_attribute *att_get(const char *ns, const char *tag) const { return soap_att_get(this, ns, tag); } soap_dom_attribute *att_get(const char *ns, const wchar_t *tag) const { return soap_att_get_w(this, ns, tag); } soap_dom_element *elt_get() const { return soap_elt_get(this, NULL, NULL); } soap_dom_element *elt_get(const char *tag) const { return soap_elt_get(this, NULL, tag); } soap_dom_element *elt_get(const wchar_t *tag) const { return soap_elt_get_w(this, NULL, tag); } soap_dom_element *elt_get(const char *ns, const char *tag) const { return soap_elt_get(this, ns, tag); } soap_dom_element *elt_get(const char *ns, const wchar_t *tag) const { return soap_elt_get_w(this, ns, tag); } soap_dom_element *get_next() const { return soap_elt_get_next(this); } soap_dom_element *get_nth(size_t n) { return soap_elt_get_nth(this, n); } bool match(const char *patt) const { return soap_elt_match(this, NULL, patt) != 0; } bool match(const wchar_t *patt) const { return soap_elt_match_w(this, NULL, patt) != 0; } bool match(const char *ns, const char *patt) const { return soap_elt_match(this, ns, patt) != 0; } bool match(const char *ns, const wchar_t *patt) const { return soap_elt_match_w(this, ns, patt) != 0; } const char *ns() const { return this->nstr; } const char *tag() const { return this->name; } soap_dom_element *parent() { return this->prnt; } size_t depth() const { return soap_elt_depth(this); } size_t index() const { return soap_elt_index(this); } size_t len() const { return soap_elt_len(this); } size_t nth() const { return soap_elt_nth(this); } size_t elt_size() { return soap_elt_size(this, NULL, NULL); } size_t elt_size(const char *patt, int type = 0) { return elt_size(NULL, patt, type); } size_t elt_size(const char *ns, const char *patt, int type = 0) { return soap_elt_size_type(this, ns, patt, type); } size_t att_size() { return soap_att_size(this, NULL, NULL); } size_t att_size(const char *patt) { return att_size(NULL, patt); } #ifndef WITH_COMPAT size_t att_size(const std::string& patt) { return att_size(NULL, patt); } #endif size_t att_size(const char *ns, const char *patt) { return soap_att_size(this, ns, patt); } #ifndef WITH_COMPAT size_t att_size(const char *ns, const std::string& patt) { return soap_att_size(this, ns, patt.c_str()); } #endif bool is_true() const { return soap_elt_is_true(this) != 0; } bool is_false() const { return soap_elt_is_false(this) != 0; } LONG64 get_int() const { return soap_elt_get_LONG64(this); } double get_double() const { return soap_elt_get_double(this); } const char *get_text() const { return this->text; } const void *get_node(int type) const { return soap_elt_get_node(this, type); } int get_type(const void **node) const { return soap_elt_get_type(this, node); } operator bool() const { return soap_elt_is_true(this) != 0; } operator int() const { return soap_elt_get_int(this); } operator LONG64() const { return soap_elt_get_LONG64(this); } operator double() const { return soap_elt_get_double(this); } operator const char*() const { return this->text; } soap_dom_element_iterator begin(); soap_dom_element_iterator end() { return soap_dom_element_iterator(NULL); } soap_dom_element_iterator elt_begin() { return soap_dom_element_iterator(this->elts); } soap_dom_element_iterator elt_end() { return soap_dom_element_iterator(NULL); } soap_dom_attribute_iterator att_begin() { return soap_dom_attribute_iterator(this->atts); } soap_dom_attribute_iterator att_end() { return soap_dom_attribute_iterator(NULL); } soap_dom_element_iterator find(const char *patt, int type = 0) { return find(NULL, patt, type); } soap_dom_element_iterator find(const wchar_t *patt, int type = 0) { return find(NULL, patt, type); } soap_dom_element_iterator find(const char *ns, const char *patt, int type = 0); soap_dom_element_iterator find(const char *ns, const wchar_t *patt, int type = 0); soap_dom_element_iterator find(int type); soap_dom_element_iterator elt_find(const char *patt, int type = 0) { return elt_find(NULL, patt, type); } soap_dom_element_iterator elt_find(const wchar_t *patt, int type = 0) { return elt_find(NULL, patt, type); } soap_dom_element_iterator elt_find(const char *ns, const char *patt, int type = 0); soap_dom_element_iterator elt_find(const char *ns, const wchar_t *patt, int type = 0); soap_dom_element_iterator elt_find(int type); soap_dom_attribute_iterator att_find(const char *patt) { return att_find(NULL, patt); } soap_dom_attribute_iterator att_find(const wchar_t *patt) { return att_find(NULL, patt); } soap_dom_attribute_iterator att_find(const char *ns, const char *patt); soap_dom_attribute_iterator att_find(const char *ns, const wchar_t *patt); void unlink(); #endif }; #endif SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_dup_xsd__anyType(struct soap *soap, struct soap_dom_element *d, const struct soap_dom_element *a); SOAP_FMAC1 void SOAP_FMAC2 soap_del_xsd__anyType(const struct soap_dom_element *a); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_dup_xsd__anyAttribute(struct soap *soap, struct soap_dom_attribute *d, const struct soap_dom_attribute *a); SOAP_FMAC1 void SOAP_FMAC2 soap_del_xsd__anyAttribute(const struct soap_dom_attribute *a); SOAP_FMAC1 int SOAP_FMAC2 soap_dom_call(struct soap *soap, const char *endpoint, const char *action, const struct soap_dom_element *in, struct soap_dom_element *out); #if defined(__cplusplus) && !defined(WITH_COMPAT) extern std::ostream &operator<<(std::ostream&, const struct soap_dom_element&); extern std::istream &operator>>(std::istream&, struct soap_dom_element&); SOAP_FMAC1 int SOAP_FMAC2 soap_dom_call(struct soap *soap, const char *endpoint, const char *action, const struct soap_dom_element& in, struct soap_dom_element& out); SOAP_FMAC1 int SOAP_FMAC2 soap_dom_call(struct soap *soap, const char *endpoint, const char *action, const struct soap_dom_element *in, struct soap_dom_element& out); SOAP_FMAC1 int SOAP_FMAC2 soap_dom_call(struct soap *soap, const char *endpoint, const char *action, const struct soap_dom_element& in, struct soap_dom_element *out); #endif #if defined(__cplusplus) extern "C" { #endif /******************************************************************************/ #ifdef WIN32 # ifdef SOAP_STD_EXPORTS # define SOAP_STD_API __declspec(dllexport) # else # define SOAP_STD_API # endif #else # define SOAP_STD_API #endif struct SOAP_STD_API soap { short state; /* 0 = uninitialized, 1 = initialized, 2 = copy of another soap struct */ short version; /* 1 = SOAP1.1 and 2 = SOAP1.2 (set automatically from namespace URI in nsmap table), 0 indicates non-SOAP content */ soap_mode mode; soap_mode imode; soap_mode omode; const char *float_format; /* user-definable format string for floats (<1024 chars) */ const char *double_format; /* user-definable format string for doubles (<1024 chars) */ const char *long_double_format; /* user-definable format string for long doubles (<1024 chars) */ const char *dime_id_format; /* user-definable format string for integer DIME id ( 0, gives socket recv timeout in seconds, < 0 in usec */ int send_timeout; /* when > 0, gives socket send timeout in seconds, < 0 in usec */ int connect_timeout; /* when > 0, gives socket connect() timeout in seconds, < 0 in usec */ int accept_timeout; /* when > 0, gives socket accept() timeout in seconds, < 0 in usec */ int socket_flags; /* socket recv() and send() flags, e.g. set to MSG_NOSIGNAL to disable sigpipe */ int connect_flags; /* connect() SOL_SOCKET sockopt flags, e.g. set to SO_DEBUG to debug socket */ int bind_flags; /* bind() SOL_SOCKET sockopt flags, e.g. set to SO_REUSEADDR to enable reuse */ int accept_flags; /* accept() SOL_SOCKET sockopt flags */ unsigned short linger_time; /* linger time for SO_LINGER option */ const struct Namespace *namespaces; /* Pointer to global namespace mapping table */ struct Namespace *local_namespaces; /* Local namespace mapping table */ struct soap_nlist *nlist; /* namespace stack */ struct soap_blist *blist; /* block allocation stack */ struct soap_clist *clist; /* class instance allocation list */ void *alist; /* memory allocation (malloc) list */ short shaky; /* objects in reallocatable containers are on shaky grounds */ #if !defined(WITH_LEANER) || !defined(WITH_NOIDREF) struct soap_ilist *iht[SOAP_IDHASH]; #endif struct soap_plist *pht[SOAP_PTRHASH]; struct soap_pblk *pblk; /* plist block allocation */ short pidx; /* plist block allocation */ struct SOAP_ENV__Header *header; struct SOAP_ENV__Fault *fault; int idnum; void *user; /* for user to pass user-defined data to callbacks */ void *data[4]; /* extension data = {smdevp, mecevp, ...} */ struct soap_plugin *plugins; /* linked list of plug-in data */ const char *userid; /* HTTP Basic authorization userid */ const char *passwd; /* HTTP Basic authorization passwd */ const char *authrealm; /* HTTP authentication realm (NTLM domain) */ #if !defined(WITH_LEAN) || defined(WITH_NTLM) const char *ntlm_challenge; /* HTTP NTLM challenge key string */ short ntlm_auth; /* HTTP NTLM authentication type */ short ntlm_stage; /* HTTP NTLM stage 0..3 */ #endif int (*fpost)(struct soap*, const char*, const char*, int, const char*, const char*, size_t); int (*fget)(struct soap*); /* HTTP GET hook (not set by default) */ int (*fput)(struct soap*); /* HTTP PUT hook (handled as POST by default) */ int (*fdel)(struct soap*); /* HTTP DELETE hook (not set by default) */ int (*fopt)(struct soap*); /* HTTP OPTIONS hook (not set by default) */ int (*fhead)(struct soap*); /* HTTP HEAD hook (not set by default) */ int (*fform)(struct soap*); /* HTTP/HTML form handler for plugins */ int (*fposthdr)(struct soap*, const char*, const char*); int (*fresponse)(struct soap*, int, size_t); int (*fparse)(struct soap*); int (*fparsehdr)(struct soap*, const char*, const char*); int (*fheader)(struct soap*); int (*fresolve)(struct soap*, const char*, struct in_addr* inaddr); int (*fconnect)(struct soap*, const char*, const char*, int); int (*fdisconnect)(struct soap*); int (*fclosesocket)(struct soap*, SOAP_SOCKET); int (*fshutdownsocket)(struct soap*, SOAP_SOCKET, int); SOAP_SOCKET (*fopen)(struct soap*, const char*, const char*, int); SOAP_SOCKET (*faccept)(struct soap*, SOAP_SOCKET, struct sockaddr*, int *n); int (*fclose)(struct soap*); int (*fsend)(struct soap*, const char*, size_t); size_t (*frecv)(struct soap*, char*, size_t); int (*fpoll)(struct soap*); void (*fseterror)(struct soap*, const char **c, const char **s); int (*fignore)(struct soap*, const char*); int (*fserveloop)(struct soap*); void *(*fplugin)(struct soap*, const char*); void *(*fmalloc)(struct soap*, size_t); #ifndef WITH_LEANER int (*fsvalidate)(struct soap*, const char*, const char*); int (*fwvalidate)(struct soap*, const char*, const wchar_t*); int (*feltbegin)(struct soap*, const char*); int (*feltendin)(struct soap*, const char*, const char*); int (*feltbegout)(struct soap*, const char*); int (*feltendout)(struct soap*, const char*); int (*fprepareinitsend)(struct soap*); int (*fprepareinitrecv)(struct soap*); int (*fpreparesend)(struct soap*, const char*, size_t); int (*fpreparerecv)(struct soap*, const char*, size_t); int (*fpreparefinalsend)(struct soap*); int (*fpreparefinalrecv)(struct soap*); int recverror; /* last soap_recv_raw error code for filterrecv */ int (*ffiltersend)(struct soap*, const char**, size_t*); int (*ffilterrecv)(struct soap*, char*, size_t*, size_t); void *(*fdimereadopen)(struct soap*, void*, const char*, const char*, const char*); void *(*fdimewriteopen)(struct soap*, const char*, const char*, const char*); void (*fdimereadclose)(struct soap*, void*); void (*fdimewriteclose)(struct soap*, void*); size_t (*fdimeread)(struct soap*, void*, char*, size_t); int (*fdimewrite)(struct soap*, void*, const char*, size_t); void *(*fmimereadopen)(struct soap*, void*, const char*, const char*, const char*); void *(*fmimewriteopen)(struct soap*, void*, const char*, const char*, const char*, enum soap_mime_encoding); void (*fmimereadclose)(struct soap*, void*); void (*fmimewriteclose)(struct soap*, void*); size_t (*fmimeread)(struct soap*, void*, char*, size_t); int (*fmimewrite)(struct soap*, void*, const char*, size_t); #endif SOAP_SOCKET master; /* socket bound to TCP/IP port */ SOAP_SOCKET socket; /* socket to send and receive */ SOAP_SOCKET sendsk; /* socket to send (overrides ::socket) */ SOAP_SOCKET recvsk; /* socket to receive (overrides ::socket) */ #if defined(__cplusplus) && !defined(WITH_COMPAT) std::ostream *os; /* C++ only: ostream to send */ std::istream *is; /* C++ only: istream to receive */ #else const char **os; /* C only: pointer to a const char*, will be set to point to the string output */ const char *is; /* C only: a const char* to read from (soap->is will advance) */ #endif #ifndef UNDER_CE int sendfd; /* int file descriptor for sending */ int recvfd; /* int file descriptor for receiving */ #else FILE *sendfd; /* WinCE FILE* to send */ FILE *recvfd; /* WinCE FILE* to receive */ #endif size_t bufidx; /* index in soap.buf[] */ size_t buflen; /* length of soap.buf[] content */ soap_wchar ahead; /* parser lookahead */ short cdata; /* CDATA parser state */ short body; /* HTTP or XML element has a body (1) or not (0) */ unsigned int level; /* XML nesting level */ size_t count; /* message length counter */ size_t length; /* message length as set by HTTP header */ char *labbuf; /* look-aside buffer */ size_t lablen; /* look-aside buffer allocated length */ size_t labidx; /* look-aside buffer index to available part */ char buf[SOAP_BUFLEN];/* send and receive buffer */ char msgbuf[SOAP_TMPLEN]; /* in/out buffer for HTTP/MIME headers and short messages, must be >=1024 bytes */ char tmpbuf[SOAP_TMPLEN]; /* in/out buffer for HTTP/MIME headers, simpleType values, element and attribute tag names, and DIME must be >=1024 bytes */ char tag[SOAP_TAGLEN]; char id[SOAP_TAGLEN]; char href[SOAP_TAGLEN]; char type[SOAP_TAGLEN]; char arrayType[SOAP_TAGLEN]; char arraySize[SOAP_TAGLEN]; char arrayOffset[SOAP_TAGLEN]; short other; short root; int position; int positions[SOAP_MAXDIMS]; struct soap_attribute *attributes; /* attribute list */ short encoding; /* when set, output encodingStyle */ short mustUnderstand; /* a mustUnderstand element was parsed or is output */ short null; /* parsed XML is xsi:nil */ short ns; /* zero to output all xmlns */ short part; /* SOAP part state (header or body) */ short event; /* engine events and states for use by plugins */ short peeked; unsigned int evlev; /* event level */ int alloced; size_t chunksize; size_t chunkbuflen; char endpoint[SOAP_TAGLEN]; char path[SOAP_TAGLEN]; char host[SOAP_TAGLEN]; char *action; const char *prolog; /* XML declaration prolog */ unsigned long ip; /* IP number */ int port; /* port number */ short keep_alive; /* connection should be kept open */ short tcp_keep_alive; /* enable SO_KEEPALIVE */ unsigned int tcp_keep_idle; /* set TCP_KEEPIDLE */ unsigned int tcp_keep_intvl; /* set TCP_KEEPINTVL */ unsigned int tcp_keep_cnt; /* set TCP_KEEPCNT */ unsigned int max_keep_alive; /* maximum keep-alive session (default=100) */ const char *proxy_http_version;/* HTTP version of proxy "1.0" or "1.1" */ const char *proxy_host; /* Proxy Server host name */ int proxy_port; /* Proxy Server port (default = 8080) */ const char *proxy_userid; /* Proxy Authorization user name */ const char *proxy_passwd; /* Proxy Authorization password */ const char *proxy_from; /* X-Forwarding-For header returned by proxy */ int status; /* -1 when request, else error code to be returned by server */ int error; int errmode; int errnum; #ifndef WITH_LEANER struct soap_dom_element *dom; struct soap_dime dime; struct soap_mime mime; struct soap_xlist *xlist; #endif #if !defined(WITH_LEAN) || defined(SOAP_DEBUG) const char *logfile[SOAP_MAXLOGS]; FILE *fdebug[SOAP_MAXLOGS]; struct soap_mlist *mht[SOAP_PTRHASH]; #endif #ifndef WITH_LEAN const char *wsuid; /* space-separated string of element tags */ const char *c14nexclude; /* space-separated string of prefixes for c14n exclusion */ const char *c14ninclude; /* space-separated string of prefixes for c14n inclusion */ struct soap_cookie *cookies; const char *cookie_domain; const char *cookie_path; int cookie_max; #endif #ifndef WITH_NOIO unsigned int ipv6_multicast_if; /* in_addr_t in6addr->sin6_scope_id IPv6 value */ char* ipv4_multicast_if; /* IP_MULTICAST_IF IPv4 setsockopt interface_addr */ unsigned char ipv4_multicast_ttl; /* IP_MULTICAST_TTL value 0..255 */ union { struct sockaddr addr; struct sockaddr_in in; struct sockaddr_storage storage; } peer; /* set by soap_connect/soap_accept and by UDP recv */ #endif size_t peerlen; #if defined(WITH_OPENSSL) /* OpenSSL */ int (*fsslauth)(struct soap*); int (*fsslverify)(int, X509_STORE_CTX*); BIO *bio; SSL *ssl; SSL_CTX *ctx; SSL_SESSION *session; const char *dhfile; const char *randfile; #elif defined(WITH_GNUTLS) /* GNUTLS */ int (*fsslauth)(struct soap*); void *fsslverify; gnutls_certificate_credentials_t xcred; /* cert pointer */ gnutls_anon_client_credentials_t acred; /* anon pointer */ gnutls_priority_t cache; /* priority cache pointer */ gnutls_session_t session; /* session pointer */ gnutls_dh_params_t dh_params; gnutls_rsa_params_t rsa_params; #elif defined(WITH_SYSTEMSSL) /* SYSTEM SSL */ int (*fsslauth)(struct soap*); void *fsslverify; /* N/A */ void *bio; /* N/A */ gsk_handle ctx; /* environment */ gsk_handle ssl; /* ssl socket */ void *session; /* N/A */ const char *dhfile; /* N/A */ const char *randfile; /* N/A */ #else /* No SSL/TLS */ void *fsslauth; /* dummy members, to preserve struct size */ void *fsslverify; void *bio; void *ssl; void *ctx; void *session; void *dh_params; void *rsa_params; #endif unsigned short ssl_flags; const char *keyfile; const char *keyid; const char *password; const char *cafile; const char *capath; const char *crlfile; char session_host[SOAP_TAGLEN]; int session_port; #ifdef WITH_C_LOCALE # ifdef WIN32 _locale_t c_locale; /* set to C locale by default */ # else locale_t c_locale; /* set to C locale by default */ # endif #else void *c_locale; #endif #ifdef WITH_ZLIB z_stream *d_stream; /* decompression stream */ uLong z_crc; /* internal gzip crc */ #else void *d_stream; /* dummy members, to preserve struct size */ soap_int32 z_crc; #endif const char *z_dict; /* support for zlib static dictionaries */ unsigned int z_dict_len; short zlib_state; /* SOAP_ZLIB_NONE, SOAP_ZLIB_DEFLATE, or SOAP_ZLIB_INFLATE */ short zlib_in; /* SOAP_ZLIB_NONE, SOAP_ZLIB_DEFLATE, or SOAP_ZLIB_GZIP */ short zlib_out; /* SOAP_ZLIB_NONE, SOAP_ZLIB_DEFLATE, or SOAP_ZLIB_GZIP */ char *z_buf; /* buffer */ size_t z_buflen; unsigned short z_level; /* compression level to be used (0=none, 1=fast to 9=best) */ float z_ratio_in; /* detected compression ratio compressed_length/length of inbound message */ float z_ratio_out; /* detected compression ratio compressed_length/length of outbound message */ #ifdef WMW_RPM_IO /* VxWorks */ void *rpmreqid; #endif #ifdef __cplusplus soap(); soap(soap_mode); soap(soap_mode, soap_mode); soap(const struct soap&); struct soap& operator=(const struct soap&); ~soap(); /* no virtual methods, so sizeof(soap) is same in C and C++ */ #endif }; struct soap_code_map { LONG64 code; const char *string; }; /* forwarding list */ struct soap_flist { struct soap_flist *next; int type; void *ptr; unsigned int level; size_t index; void (*finsert)(struct soap*, int, int, void*, size_t, const void*, void**); }; /* id-ref forwarding list */ struct soap_ilist { struct soap_ilist *next; int type; size_t size; void *ptr; void **spine; void *link; void *copy; struct soap_flist *flist; void *smart; short shaky; char id[1]; /* the actual id string value flows into the allocated region below this struct */ }; struct soap_plugin { struct soap_plugin *next; const char *id; void *data; int (*fcopy)(struct soap *soap, struct soap_plugin *dst, struct soap_plugin *src); void (*fdelete)(struct soap *soap, struct soap_plugin *p); /* should delete fields of plugin only and not free(p) */ }; extern SOAP_NMAC struct Namespace namespaces[]; #ifndef WITH_LEAN # define soap_get0(soap) (((soap)->bufidx>=(soap)->buflen && soap_recv(soap)) ? EOF : (unsigned char)(soap)->buf[(soap)->bufidx]) # define soap_get1(soap) (((soap)->bufidx>=(soap)->buflen && soap_recv(soap)) ? EOF : (unsigned char)(soap)->buf[(soap)->bufidx++]) #else soap_wchar soap_get0(struct soap*); soap_wchar soap_get1(struct soap*); #endif #define soap_versioning_paste(name, ext) name##_REQUIRE_lib_v##ext #define soap_versioning_ext(name, ext) soap_versioning_paste(name, ext) #define soap_versioning(name) soap_versioning_ext(name, GSOAP_VERSION) #define soap_init(soap) soap_init1(soap, SOAP_IO_DEFAULT) #define soap_init1(soap, mode) soap_init2(soap, mode, mode) #define soap_init2(soap, imode, omode) soap_versioning(soap_init)(soap, imode, omode) #define soap_new() soap_new1(SOAP_IO_DEFAULT) #define soap_new1(mode) soap_new2(mode, mode) #define soap_new2(imode, omode) soap_versioning(soap_new)(imode, omode) #define soap_revget1(soap) ((soap)->bufidx--) #define soap_unget(soap, c) ((soap)->ahead = c) #define soap_register_plugin(soap, plugin) soap_register_plugin_arg(soap, plugin, NULL) #define soap_mode(soap, n) ((soap)->mode = (soap)->imode = (soap)->omode = (n)) #define soap_imode(soap, n) ((soap)->imode = (n)) #define soap_omode(soap, n) ((soap)->omode = (n)) #define soap_set_imode(soap, n) ((soap)->imode |= (n)) #define soap_clr_imode(soap, n) ((soap)->imode &= ~(n)) #define soap_set_omode(soap, n) ((soap)->omode |= (n)) #define soap_clr_omode(soap, n) ((soap)->omode &= ~(n)) #define soap_set_mode(soap, n) ((soap)->mode |= (n), (soap)->imode |= (n), (soap)->omode |= (n)) #define soap_clr_mode(soap, n) ((soap)->mode &= ~(n), (soap)->imode &= ~(n), (soap)->omode &= ~(n)) #define soap_destroy(soap) soap_delete((soap), NULL) #define SOAP_NO_LINK_TO_DELETE (-2) /* pass to soap_link() as size n: do not manage, smart pointers are self-managing */ #ifdef HAVE_STRRCHR # define soap_strrchr(s, t) strrchr(s, t) #else SOAP_FMAC1 char* SOAP_FMAC2 soap_strrchr(const char *s, int t); #endif #ifdef HAVE_STRTOL # define soap_strtol(s, t, b) strtol(s, t, b) #else SOAP_FMAC1 long SOAP_FMAC2 soap_strtol(const char*, char**, int); #endif #ifdef HAVE_STRTOUL # define soap_strtoul(s, t, b) strtoul(s, t, b) #else SOAP_FMAC1 unsigned long SOAP_FMAC2 soap_strtoul(const char*, char**, int); #endif #if defined(WIN32) && !defined(__MINGW32__) && !defined(__MINGW64__) # define soap_strtoll _strtoi64 #else # define soap_strtoll strtoll #endif #if defined(WIN32) && !defined(__MINGW32__) && !defined(__MINGW64__) # define soap_strtoull _strtoui64 #else # define soap_strtoull strtoull #endif #if defined(WITH_OPENSSL) # define soap_random soap_rand() SOAP_FMAC1 int SOAP_FMAC2 soap_rand(void); #elif defined(HAVE_RANDOM) # define soap_random (int)random() #else # define soap_random rand() #endif #ifdef WITH_NOIDREF # define soap_embedded(s, p, t) ((void)(s), 0) # define soap_id_lookup(s, i, p, t, n, k, fb) ((void)(s), (p)) # define soap_id_forward(s, h, p, i, t, tt, n, k, fi, fb) ((void)(s), (p)) # define soap_id_nullify(s, i) ((void)(s), (i)) # define soap_reference(s, a, t) ((void)(s), 1) # define soap_array_reference(s, p, a, n, t) ((void)(s), 1) # define soap_embed(s, p, a, n, t) ((void)(s), 0) # define soap_embedded_id(s, i, p, t) ((void)(s), (void)(t), i) # define soap_is_embedded(s, p) ((void)(s), 0) # define soap_is_single(s, p) ((void)(s), 1) # define soap_lookup_type(s, i) ((void)(s), 0) # define soap_getindependent(s) ((void)(s), 0) # define soap_putindependent(s) ((void)(s), 0) # define soap_markelement(s, p, t) ((void)(s), 0) # define soap_begin_shaky(s) ((void)(s), 0) # define soap_end_shaky(s, f) ((void)(s), (void)(f), 0) #endif /* soap_traverse() traversal/walker routines take walker function arguments */ typedef void soap_walker(struct soap*, void*, int, const char*, const char*); SOAP_FMAC5 int SOAP_FMAC6 soap_serve(struct soap *soap); SOAP_FMAC5 int SOAP_FMAC6 soap_serve_request(struct soap *soap); SOAP_FMAC3 void SOAP_FMAC4 soap_header(struct soap*); SOAP_FMAC3 void SOAP_FMAC4 soap_fault(struct soap*); SOAP_FMAC3 const char** SOAP_FMAC4 soap_faultcode(struct soap*); SOAP_FMAC3 const char** SOAP_FMAC4 soap_faultsubcode(struct soap*); SOAP_FMAC3 const char** SOAP_FMAC4 soap_faultstring(struct soap*); SOAP_FMAC3 const char** SOAP_FMAC4 soap_faultdetail(struct soap*); SOAP_FMAC3 const char* SOAP_FMAC4 soap_check_faultsubcode(struct soap*); SOAP_FMAC3 const char* SOAP_FMAC4 soap_check_faultdetail(struct soap*); SOAP_FMAC3 void SOAP_FMAC4 soap_serializefault(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_serializeheader(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_getheader(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_putheader(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_getfault(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_putfault(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_ssl_init(void); SOAP_FMAC1 int SOAP_FMAC2 soap_poll(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_connect_command(struct soap*, int, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_connect(struct soap*, const char*, const char*); SOAP_FMAC1 SOAP_SOCKET SOAP_FMAC2 soap_bind(struct soap*, const char*, int, int); SOAP_FMAC1 SOAP_SOCKET SOAP_FMAC2 soap_accept(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_ssl_accept(struct soap*); SOAP_FMAC1 const char * SOAP_FMAC2 soap_ssl_error(struct soap*, int); SOAP_FMAC1 int SOAP_FMAC2 soap_ssl_crl(struct soap*, const char*); #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE) SOAP_FMAC1 int SOAP_FMAC2 soap_ssl_server_context(struct soap *soap, unsigned short flags, const char *keyfile, const char *keyid, const char *password, const char *cafile, const char *capath, const char *dhfile, const char *randfile, const char *sid); #else SOAP_FMAC1 int SOAP_FMAC2 soap_ssl_server_context(struct soap *soap, unsigned short flags, const char *keyfile, const char *password, const char *cafile, const char *capath, const char *dhfile, const char *randfile, const char *sid); #endif #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE) SOAP_FMAC1 int SOAP_FMAC2 soap_ssl_client_context(struct soap *soap, unsigned short flags, const char *keyfile, const char *keyid, const char *password, const char *cafile, const char *capath, const char *randfile); #else SOAP_FMAC1 int SOAP_FMAC2 soap_ssl_client_context(struct soap *soap, unsigned short flags, const char *keyfile, const char *password, const char *cafile, const char *capath, const char *randfile); #endif SOAP_FMAC1 int SOAP_FMAC2 soap_puthttphdr(struct soap*, int status, size_t count); SOAP_FMAC1 const char* SOAP_FMAC2 soap_get_header_attribute(struct soap*, const char*, const char*); SOAP_FMAC1 const char* SOAP_FMAC2 soap_decode_key(char*, size_t, const char*); SOAP_FMAC1 const char* SOAP_FMAC2 soap_decode_val(char*, size_t, const char*); SOAP_FMAC1 size_t SOAP_FMAC2 soap_hash(const char*); SOAP_FMAC1 void SOAP_FMAC2 soap_set_endpoint(struct soap*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_flush_raw(struct soap*, const char*, size_t); SOAP_FMAC1 int SOAP_FMAC2 soap_flush(struct soap*); SOAP_FMAC1 soap_wchar SOAP_FMAC2 soap_get(struct soap*); SOAP_FMAC1 soap_wchar SOAP_FMAC2 soap_getchar(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_tag_cmp(const char*, const char*); SOAP_FMAC1 void SOAP_FMAC2 soap_set_fault(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_sender_fault(struct soap*, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_sender_fault_subcode(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_receiver_fault(struct soap*, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_receiver_fault_subcode(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_set_sender_error(struct soap*, const char*, const char*, int); SOAP_FMAC1 int SOAP_FMAC2 soap_set_receiver_error(struct soap*, const char*, const char*, int); SOAP_FMAC1 int SOAP_FMAC2 soap_send_raw(struct soap*, const char*, size_t); SOAP_FMAC1 int SOAP_FMAC2 soap_recv_raw(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_recv(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_send(struct soap*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_send2(struct soap*, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_send3(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_pututf8(struct soap*, unsigned long); SOAP_FMAC1 soap_wchar SOAP_FMAC2 soap_getutf8(struct soap*); SOAP_FMAC1 size_t SOAP_FMAC2 soap_utf8len(const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_putbase64(struct soap*, const unsigned char*, int); SOAP_FMAC1 unsigned char* SOAP_FMAC2 soap_getbase64(struct soap*, int*, int); SOAP_FMAC1 int SOAP_FMAC2 soap_puthex(struct soap*, const unsigned char*, int); SOAP_FMAC1 unsigned char* SOAP_FMAC2 soap_gethex(struct soap*, int*); #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_xop_forward(struct soap*, unsigned char**, int*, char**, char**, char**); SOAP_FMAC1 int SOAP_FMAC2 soap_attachment_forward(struct soap*, unsigned char**, int*, char**, char**, char**); #endif SOAP_FMAC1 int SOAP_FMAC2 soap_pointer_lookup(struct soap*, const void *p, int t, struct soap_plist**); SOAP_FMAC1 int SOAP_FMAC2 soap_pointer_enter(struct soap*, const void *p, const void *a, int n, int t, struct soap_plist**); SOAP_FMAC1 int SOAP_FMAC2 soap_array_pointer_lookup(struct soap*, const void *p, const void *a, int n, int t, struct soap_plist**); #ifndef WITH_NOIDREF SOAP_FMAC1 int SOAP_FMAC2 soap_pointer_lookup_id(struct soap*, void *p, int t, struct soap_plist**); SOAP_FMAC1 int SOAP_FMAC2 soap_embed(struct soap *soap, const void *p, const void *a, int n, int type); SOAP_FMAC1 struct soap_ilist* SOAP_FMAC2 soap_lookup(struct soap*, const char*); SOAP_FMAC1 struct soap_ilist* SOAP_FMAC2 soap_enter(struct soap*, const char*, int, size_t); SOAP_FMAC1 int SOAP_FMAC2 soap_resolve(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_embedded(struct soap*, const void *p, int t); SOAP_FMAC1 int SOAP_FMAC2 soap_reference(struct soap*, const void *p, int t); SOAP_FMAC1 int SOAP_FMAC2 soap_array_reference(struct soap*, const void *p, const void *a, int n, int t); SOAP_FMAC1 int SOAP_FMAC2 soap_embedded_id(struct soap*, int id, const void *p, int t); SOAP_FMAC1 int SOAP_FMAC2 soap_is_embedded(struct soap*, struct soap_plist*); SOAP_FMAC1 int SOAP_FMAC2 soap_is_single(struct soap*, struct soap_plist*); SOAP_FMAC1 void SOAP_FMAC2 soap_set_embedded(struct soap*, struct soap_plist*); #endif SOAP_FMAC1 int SOAP_FMAC2 soap_check_and_mark(struct soap *soap, const void *p, int t, char **mark); SOAP_FMAC1 void * SOAP_FMAC2 soap_mark_lookup(struct soap *soap, const void *p, int t, struct soap_plist **pp, char **mark); SOAP_FMAC1 int SOAP_FMAC2 soap_mark_cycle(struct soap *soap, struct soap_plist *pp); SOAP_FMAC1 void SOAP_FMAC2 soap_mark_dup(struct soap *soap, void *a, struct soap_plist *pp); SOAP_FMAC1 void SOAP_FMAC2 soap_unmark(struct soap *soap, char *mark); SOAP_FMAC1 int SOAP_FMAC2 soap_begin_count(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_end_count(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_begin_send(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_end_send(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_end_send_flush(struct soap*); SOAP_FMAC1 const struct soap_code_map* SOAP_FMAC2 soap_code(const struct soap_code_map*, const char*); SOAP_FMAC1 LONG64 SOAP_FMAC2 soap_code_int(const struct soap_code_map*, const char*, LONG64); SOAP_FMAC1 const char* SOAP_FMAC2 soap_code_str(const struct soap_code_map*, long); SOAP_FMAC1 LONG64 SOAP_FMAC2 soap_code_bits(const struct soap_code_map*, const char*); SOAP_FMAC1 const char* SOAP_FMAC2 soap_code_list(struct soap*, const struct soap_code_map*, long); SOAP_FMAC1 int SOAP_FMAC2 soap_getline(struct soap*, char*, int); SOAP_FMAC1 int SOAP_FMAC2 soap_begin_serve(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_begin_recv(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_end_recv(struct soap*); SOAP_FMAC1 void* SOAP_FMAC2 soap_malloc(struct soap*, size_t); SOAP_FMAC1 void SOAP_FMAC2 soap_dealloc(struct soap*, void*); SOAP_FMAC1 struct soap_clist * SOAP_FMAC2 soap_link(struct soap*, void*, int, int, int (*fdelete)(struct soap_clist*)); SOAP_FMAC1 int SOAP_FMAC2 soap_unlink(struct soap*, const void*); SOAP_FMAC1 void SOAP_FMAC2 soap_free_temp(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_del(struct soap*); SOAP_FMAC1 void* SOAP_FMAC2 soap_track_malloc(struct soap*, const char*, int, size_t); SOAP_FMAC1 void SOAP_FMAC2 soap_track_free(struct soap*, const char*, int, void*); #ifndef WITH_NOIDREF SOAP_FMAC1 int SOAP_FMAC2 soap_lookup_type(struct soap*, const char *id); SOAP_FMAC1 short SOAP_FMAC2 soap_begin_shaky(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_end_shaky(struct soap*, short); SOAP_FMAC1 void* SOAP_FMAC2 soap_id_lookup(struct soap*, const char *id, void **p, int t, size_t n, unsigned int k, int (*fbase)(int, int)); SOAP_FMAC1 void* SOAP_FMAC2 soap_id_forward(struct soap*, const char *id, void *p, size_t i, int t, int tt, size_t n, unsigned int k, void(*finsert)(struct soap*, int, int, void*, size_t, const void*, void**), int (*fbase)(int, int)); SOAP_FMAC1 int SOAP_FMAC2 soap_id_nullify(struct soap*, const char*); #endif SOAP_FMAC1 void* SOAP_FMAC2 soap_id_enter(struct soap*, const char *id, void *p, int t, size_t n, const char *type, const char *arrayType, void *(*finstantiate)(struct soap*, int, const char*, const char*, size_t*), int (*fbase)(int, int)); SOAP_FMAC1 void** SOAP_FMAC2 soap_id_smart(struct soap *soap, const char*, int, size_t); SOAP_FMAC1 size_t SOAP_FMAC2 soap_size(const int *, int); SOAP_FMAC1 size_t SOAP_FMAC2 soap_getsizes(const char *, int *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_getoffsets(const char *, const int *, int *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_getposition(const char *, int *); SOAP_FMAC1 char* SOAP_FMAC2 soap_putsizesoffsets(struct soap*, const char *, const int *, const int *, int); SOAP_FMAC1 char* SOAP_FMAC2 soap_putoffsets(struct soap*, const int *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_closesock(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_force_closesock(struct soap*); SOAP_FMAC1 struct soap *SOAP_FMAC2 soap_versioning(soap_new)(soap_mode, soap_mode); SOAP_FMAC1 void SOAP_FMAC2 soap_free(struct soap*); SOAP_FMAC1 struct soap *SOAP_FMAC2 soap_copy(const struct soap*); SOAP_FMAC1 struct soap *SOAP_FMAC2 soap_copy_context(struct soap*, const struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_copy_stream(struct soap*, struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_free_stream(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_versioning(soap_init)(struct soap*, soap_mode, soap_mode); SOAP_FMAC1 void SOAP_FMAC2 soap_initialize(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_done(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_cleanup(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_begin(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_end(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_delete(struct soap*, void*); SOAP_FMAC1 void SOAP_FMAC2 soap_delegate_deletion(struct soap*, struct soap*); /* API functions available with DEBUG or SOAP_DEBUG defined: */ SOAP_FMAC1 void SOAP_FMAC2 soap_set_recv_logfile(struct soap*, const char*); SOAP_FMAC1 void SOAP_FMAC2 soap_set_sent_logfile(struct soap*, const char*); SOAP_FMAC1 void SOAP_FMAC2 soap_set_test_logfile(struct soap*, const char*); SOAP_FMAC1 void SOAP_FMAC2 soap_close_logfiles(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_open_logfile(struct soap*, int); /* */ SOAP_FMAC1 const char* SOAP_FMAC2 soap_value(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_match_tag(struct soap*, const char*, const char *); SOAP_FMAC1 int SOAP_FMAC2 soap_match_array(struct soap*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_element(struct soap*, const char*, int, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_element_begin_out(struct soap*, const char *tag, int id, const char *type); SOAP_FMAC1 int SOAP_FMAC2 soap_array_begin_out(struct soap*, const char *tag, int id, const char *type, const char *offset); SOAP_FMAC1 int SOAP_FMAC2 soap_element_ref(struct soap*, const char *tag, int id, int href); SOAP_FMAC1 int SOAP_FMAC2 soap_element_href(struct soap*, const char *tag, int id, const char *ref, const char *val); SOAP_FMAC1 int SOAP_FMAC2 soap_element_null(struct soap*, const char *tag, int id, const char *type); SOAP_FMAC1 int SOAP_FMAC2 soap_element_nil(struct soap*, const char *tag); SOAP_FMAC1 int SOAP_FMAC2 soap_element_id(struct soap*, const char *tag, int id, const void *p, const void *a, int n, const char *type, int t, char **mark); SOAP_FMAC1 int SOAP_FMAC2 soap_element_result(struct soap*, const char *tag); SOAP_FMAC1 void SOAP_FMAC2 soap_check_result(struct soap*, const char *tag); SOAP_FMAC1 int SOAP_FMAC2 soap_element_end_out(struct soap*, const char *tag); SOAP_FMAC1 int SOAP_FMAC2 soap_element_start_end_out(struct soap*, const char *tag); SOAP_FMAC1 int SOAP_FMAC2 soap_attribute(struct soap*, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_element_begin_in(struct soap*, const char *tag, int nillable, const char *type); SOAP_FMAC1 int SOAP_FMAC2 soap_element_end_in(struct soap*, const char *tag); SOAP_FMAC1 int SOAP_FMAC2 soap_peek_element(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_retry(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_revert(struct soap*); SOAP_FMAC1 void* SOAP_FMAC2 soap_memdup(struct soap*, const void*, size_t); SOAP_FMAC1 char* SOAP_FMAC2 soap_strdup(struct soap*, const char*); SOAP_FMAC1 wchar_t* SOAP_FMAC2 soap_wstrdup(struct soap*, const wchar_t*); SOAP_FMAC1 char* SOAP_FMAC2 soap_strtrim(struct soap*, char*); SOAP_FMAC1 wchar_t* SOAP_FMAC2 soap_wstrtrim(struct soap*, wchar_t*); SOAP_FMAC1 const char * SOAP_FMAC2 soap_tagsearch(const char *big, const char *little); SOAP_FMAC1 int SOAP_FMAC2 soap_string_out(struct soap*, const char *s, int flag); SOAP_FMAC1 char* SOAP_FMAC2 soap_string_in(struct soap*, int, long, long, const char*); #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_wstring_out(struct soap*, const wchar_t *s, int flag); SOAP_FMAC1 wchar_t* SOAP_FMAC2 soap_wstring_in(struct soap*, int, long, long, const char*); #endif SOAP_FMAC1 int SOAP_FMAC2 soap_match_namespace(struct soap*, const char *, const char*, size_t n1, size_t n2); SOAP_FMAC1 void SOAP_FMAC2 soap_set_version(struct soap*, short); SOAP_FMAC1 void SOAP_FMAC2 soap_get_version(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_set_namespaces(struct soap*, const struct Namespace*); SOAP_FMAC1 void SOAP_FMAC2 soap_set_local_namespaces(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_pop_namespace(struct soap*); SOAP_FMAC1 struct soap_nlist* SOAP_FMAC2 soap_push_namespace(struct soap*, const char *,const char *); SOAP_FMAC1 const char* SOAP_FMAC2 soap_current_namespace(struct soap *soap, const char *tag); SOAP_FMAC1 struct soap_nlist* SOAP_FMAC2 soap_lookup_ns(struct soap *soap, const char *tag, size_t n); SOAP_FMAC1 int SOAP_FMAC2 soap_store_lab(struct soap*, const char*, size_t); SOAP_FMAC1 int SOAP_FMAC2 soap_append_lab(struct soap*, const char*, size_t); SOAP_FMAC1 struct soap_blist* SOAP_FMAC2 soap_new_block(struct soap*); SOAP_FMAC1 void* SOAP_FMAC2 soap_push_block(struct soap*, struct soap_blist*, size_t); SOAP_FMAC1 void SOAP_FMAC2 soap_pop_block(struct soap*, struct soap_blist*); SOAP_FMAC1 size_t SOAP_FMAC2 soap_size_block(struct soap*, struct soap_blist*, size_t); SOAP_FMAC1 char* SOAP_FMAC2 soap_first_block(struct soap*, struct soap_blist*); SOAP_FMAC1 char* SOAP_FMAC2 soap_next_block(struct soap*, struct soap_blist*); SOAP_FMAC1 size_t SOAP_FMAC2 soap_block_size(struct soap*, struct soap_blist*); SOAP_FMAC1 char* SOAP_FMAC2 soap_save_block(struct soap*, struct soap_blist*, char*, int); SOAP_FMAC1 void SOAP_FMAC2 soap_end_block(struct soap*, struct soap_blist*); SOAP_FMAC1 void SOAP_FMAC2 soap_update_pointers(struct soap *soap, const char *dst, const char *src, size_t len); SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_begin_out(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_end_out(struct soap*); SOAP_FMAC1 char * SOAP_FMAC2 soap_get_http_body(struct soap*, size_t *len); SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_begin_in(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_end_in(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_body_begin_out(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_body_end_out(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_body_begin_in(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_body_end_in(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_recv_header(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_response(struct soap*, int); SOAP_FMAC1 int SOAP_FMAC2 soap_send_empty_response(struct soap*, int status); SOAP_FMAC1 int SOAP_FMAC2 soap_recv_empty_response(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_send_fault(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_recv_fault(struct soap*, int check); #ifndef WITH_NOSTDLIB SOAP_FMAC1 void SOAP_FMAC2 soap_print_fault(struct soap*, FILE*); SOAP_FMAC1 void SOAP_FMAC2 soap_print_fault_location(struct soap*, FILE*); # ifndef WITH_LEAN # ifndef WITH_COMPAT # ifdef __cplusplus SOAP_FMAC1 void SOAP_FMAC2 soap_stream_fault(struct soap*, std::ostream&); # endif # endif SOAP_FMAC1 char* SOAP_FMAC2 soap_sprint_fault(struct soap*, char*, size_t); # endif #endif SOAP_FMAC1 int SOAP_FMAC2 soap_s2byte(struct soap*, const char*, char*); SOAP_FMAC1 int SOAP_FMAC2 soap_s2short(struct soap*, const char*, short*); SOAP_FMAC1 int SOAP_FMAC2 soap_s2int(struct soap*, const char*, int*); SOAP_FMAC1 int SOAP_FMAC2 soap_s2long(struct soap*, const char*, long*); SOAP_FMAC1 int SOAP_FMAC2 soap_s2LONG64(struct soap*, const char*, LONG64*); SOAP_FMAC1 int SOAP_FMAC2 soap_s2float(struct soap*, const char*, float*); SOAP_FMAC1 int SOAP_FMAC2 soap_s2double(struct soap*, const char*, double*); SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedByte(struct soap*, const char*, unsigned char*); SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedShort(struct soap*, const char*, unsigned short*); SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedInt(struct soap*, const char*, unsigned int*); SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedLong(struct soap*, const char*, unsigned long*); SOAP_FMAC1 int SOAP_FMAC2 soap_s2ULONG64(struct soap*, const char*, ULONG64*); SOAP_FMAC1 int SOAP_FMAC2 soap_s2string(struct soap*, const char*, char**, long minlen, long maxlen); SOAP_FMAC1 int SOAP_FMAC2 soap_s2QName(struct soap*, const char*, char**, long minlen, long maxlen); #ifndef WITH_COMPAT #ifdef __cplusplus SOAP_FMAC1 int SOAP_FMAC2 soap_s2std__QName(struct soap*, const char*, std::string*, long minlen, long maxlen); SOAP_FMAC1 int SOAP_FMAC2 soap_s2std__string(struct soap*, const char*, std::string*, long minlen, long maxlen); SOAP_FMAC1 int SOAP_FMAC2 soap_s2std__wstring(struct soap*, const char*, std::wstring*, long minlen, long maxlen); #endif #endif #if !defined(WITH_LEAN) || defined(WITH_NTLM) SOAP_FMAC1 int SOAP_FMAC2 soap_s2wchar(struct soap*, const char*, wchar_t**, long minlen, long maxlen); SOAP_FMAC1 int SOAP_FMAC2 soap_s2dateTime(struct soap*, const char*, time_t*); SOAP_FMAC1 char* SOAP_FMAC2 soap_s2base64(struct soap*, const unsigned char*, char*, int); SOAP_FMAC1 char* SOAP_FMAC2 soap_s2hex(struct soap*, const unsigned char*, char*, int); #endif SOAP_FMAC1 const char* SOAP_FMAC2 soap_byte2s(struct soap*, char); SOAP_FMAC1 const char* SOAP_FMAC2 soap_short2s(struct soap*, short); SOAP_FMAC1 const char* SOAP_FMAC2 soap_int2s(struct soap*, int); SOAP_FMAC1 const char* SOAP_FMAC2 soap_long2s(struct soap*, long); SOAP_FMAC1 const char* SOAP_FMAC2 soap_LONG642s(struct soap*, LONG64); SOAP_FMAC1 const char* SOAP_FMAC2 soap_float2s(struct soap*, float); SOAP_FMAC1 const char* SOAP_FMAC2 soap_double2s(struct soap*, double); SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedByte2s(struct soap*, unsigned char); SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedShort2s(struct soap*, unsigned short); SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedInt2s(struct soap*, unsigned int); SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedLong2s(struct soap*, unsigned long); SOAP_FMAC1 const char* SOAP_FMAC2 soap_ULONG642s(struct soap*, ULONG64); SOAP_FMAC1 const char* SOAP_FMAC2 soap_QName2s(struct soap*, const char*); #if !defined(WITH_LEAN) || defined(WITH_NTLM) SOAP_FMAC1 const char* SOAP_FMAC2 soap_wchar2s(struct soap*, const wchar_t*); SOAP_FMAC1 const char* SOAP_FMAC2 soap_dateTime2s(struct soap*, time_t); SOAP_FMAC1 const char* SOAP_FMAC2 soap_base642s(struct soap*, const char*, char*, size_t, int*); SOAP_FMAC1 const char* SOAP_FMAC2 soap_hex2s(struct soap*, const char*, char*, size_t, int*); #endif SOAP_FMAC1 int* SOAP_FMAC2 soap_inint(struct soap*, const char *tag, int *p, const char *, int); SOAP_FMAC1 char* SOAP_FMAC2 soap_inbyte(struct soap*, const char *tag, char *p, const char *, int); SOAP_FMAC1 long* SOAP_FMAC2 soap_inlong(struct soap*, const char *tag, long *p, const char *, int); SOAP_FMAC1 LONG64* SOAP_FMAC2 soap_inLONG64(struct soap*, const char *tag, LONG64 *p, const char *, int); SOAP_FMAC1 short* SOAP_FMAC2 soap_inshort(struct soap*, const char *tag, short *p, const char *, int); SOAP_FMAC1 float* SOAP_FMAC2 soap_infloat(struct soap*, const char *tag, float *p, const char *, int); SOAP_FMAC1 double* SOAP_FMAC2 soap_indouble(struct soap*, const char *tag, double *p, const char *, int); SOAP_FMAC1 unsigned char* SOAP_FMAC2 soap_inunsignedByte(struct soap*, const char *tag, unsigned char *p, const char *, int); SOAP_FMAC1 unsigned short* SOAP_FMAC2 soap_inunsignedShort(struct soap*, const char *tag, unsigned short *p, const char *, int); SOAP_FMAC1 unsigned int* SOAP_FMAC2 soap_inunsignedInt(struct soap*, const char *tag, unsigned int *p, const char *, int); SOAP_FMAC1 unsigned long* SOAP_FMAC2 soap_inunsignedLong(struct soap*, const char *tag, unsigned long *p, const char *, int); SOAP_FMAC1 ULONG64* SOAP_FMAC2 soap_inULONG64(struct soap*, const char *tag, ULONG64 *p, const char *, int); SOAP_FMAC1 char** SOAP_FMAC2 soap_instring(struct soap*, const char *tag, char **p, const char *, int, int, long, long, const char*); SOAP_FMAC1 char** SOAP_FMAC2 soap_inliteral(struct soap*, const char *tag, char **p); #ifndef WITH_LEAN SOAP_FMAC1 time_t* SOAP_FMAC2 soap_indateTime(struct soap*, const char *tag, time_t *p, const char *, int); SOAP_FMAC1 time_t SOAP_FMAC2 soap_timegm(struct tm*); #endif #ifndef WITH_LEANER SOAP_FMAC1 wchar_t** SOAP_FMAC2 soap_inwstring(struct soap*, const char *tag, wchar_t **p, const char *, int, long, long, const char*); SOAP_FMAC1 wchar_t** SOAP_FMAC2 soap_inwliteral(struct soap*, const char *tag, wchar_t **p); #endif SOAP_FMAC1 int SOAP_FMAC2 soap_outbyte(struct soap*, const char *tag, int id, const char *p, const char *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_outshort(struct soap*, const char *tag, int id, const short *p, const char *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_outint(struct soap*, const char *tag, int id, const int *p, const char *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_outlong(struct soap*, const char *tag, int id, const long *p, const char *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_outLONG64(struct soap*, const char *tag, int id, const LONG64 *p, const char *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_outfloat(struct soap*, const char *tag, int id, const float *p, const char *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_outdouble(struct soap*, const char *tag, int id, const double *p, const char *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_outunsignedByte(struct soap*, const char *tag, int id, const unsigned char *p, const char *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_outunsignedShort(struct soap*, const char *tag, int id, const unsigned short *p, const char *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_outunsignedInt(struct soap*, const char *tag, int id, const unsigned int *p, const char *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_outunsignedLong(struct soap*, const char *tag, int id, const unsigned long *p, const char *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_outULONG64(struct soap*, const char *tag, int id, const ULONG64 *p, const char *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_outstring(struct soap*, const char *tag, int id, char *const*p, const char *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_outliteral(struct soap*, const char *tag, char *const*p, const char *type); #ifndef WITH_LEAN SOAP_FMAC1 int SOAP_FMAC2 soap_outdateTime(struct soap*, const char *tag, int id, const time_t *p, const char *, int); #endif #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_outwstring(struct soap*, const char *tag, int id, wchar_t *const*p, const char *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_outwliteral(struct soap*, const char *tag, wchar_t *const*p, const char *type); #endif #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_attachment(struct soap *, const char*, int, const void*, const void*, int, const char*, const char*, const char*, const char*, int); SOAP_FMAC1 int SOAP_FMAC2 soap_move(struct soap*, size_t); SOAP_FMAC1 size_t SOAP_FMAC2 soap_tell(struct soap*); SOAP_FMAC1 char* SOAP_FMAC2 soap_dime_option(struct soap*, unsigned short, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_getdimehdr(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_getdime(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_putdimehdr(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_putdime(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_getmimehdr(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_getmime(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_putmimehdr(struct soap*, struct soap_multipart*); SOAP_FMAC1 int SOAP_FMAC2 soap_putmime(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_set_dime(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_set_mime(struct soap*, const char *boundary, const char *start); SOAP_FMAC1 void SOAP_FMAC2 soap_clr_dime(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_clr_mime(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_set_dime_attachment(struct soap*, char *ptr, size_t size, const char *type, const char *id, unsigned short optype, const char *option); SOAP_FMAC1 int SOAP_FMAC2 soap_set_mime_attachment(struct soap*, char *ptr, size_t size, enum soap_mime_encoding encoding, const char *type, const char *id, const char *location, const char *description); SOAP_FMAC1 void SOAP_FMAC2 soap_post_check_mime_attachments(struct soap *soap); SOAP_FMAC1 int SOAP_FMAC2 soap_check_mime_attachments(struct soap *soap); SOAP_FMAC1 struct soap_multipart* SOAP_FMAC2 soap_get_mime_attachment(struct soap *soap, void *handle); SOAP_FMAC1 int SOAP_FMAC2 soap_match_cid(struct soap*, const char*, const char*); #endif SOAP_FMAC1 int SOAP_FMAC2 soap_register_plugin_arg(struct soap*, int (*fcreate)(struct soap*, struct soap_plugin*, void*), void*); SOAP_FMAC1 void* SOAP_FMAC2 soap_lookup_plugin(struct soap*, const char*); SOAP_FMAC1 const char* SOAP_FMAC2 soap_attr_value(struct soap *soap, const char *name, int flag); SOAP_FMAC1 int SOAP_FMAC2 soap_set_attr(struct soap *soap, const char *name, const char *value, int flag); SOAP_FMAC1 void SOAP_FMAC2 soap_clr_attr(struct soap *soap); SOAP_FMAC1 const char* SOAP_FMAC2 soap_url(struct soap *soap, const char*, const char*); SOAP_FMAC1 size_t SOAP_FMAC2 soap_encode_url(const char*, char*, size_t); SOAP_FMAC1 const char* SOAP_FMAC2 soap_encode_url_string(struct soap*, const char*); #ifdef WITH_COOKIES SOAP_FMAC1 void SOAP_FMAC2 soap_getcookies(struct soap *soap, const char *val); SOAP_FMAC1 extern struct soap_cookie* SOAP_FMAC2 soap_set_cookie(struct soap*, const char*, const char*, const char*, const char*); SOAP_FMAC1 extern struct soap_cookie* SOAP_FMAC2 soap_cookie(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 extern char* SOAP_FMAC2 soap_cookie_value(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 extern char* SOAP_FMAC2 soap_env_cookie_value(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 extern time_t SOAP_FMAC2 soap_cookie_expire(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 extern int SOAP_FMAC2 soap_set_cookie_expire(struct soap*, const char*, long, const char*, const char*); SOAP_FMAC1 extern int SOAP_FMAC2 soap_set_cookie_session(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 extern int SOAP_FMAC2 soap_clr_cookie_session(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 extern void SOAP_FMAC2 soap_clr_cookie(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 extern int SOAP_FMAC2 soap_getenv_cookies(struct soap*); SOAP_FMAC1 extern struct soap_cookie* SOAP_FMAC2 soap_copy_cookies(struct soap*, const struct soap*); SOAP_FMAC1 extern void SOAP_FMAC2 soap_free_cookies(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_putsetcookies(struct soap *soap); SOAP_FMAC1 int SOAP_FMAC2 soap_putcookies(struct soap *soap, const char *domain, const char *path, int secure); #endif #ifdef __cplusplus } /* extern "C" */ #endif #ifdef __cplusplus /* C++ templates (for generated C++ only, not needed nor used in generated C code) */ template struct soap_block { static T *push(struct soap *soap, struct soap_blist *b) { if (!b) b = soap->blist; if (!b) return NULL; T *p = (T*)soap_push_block(soap, b, sizeof(T)); if (p) SOAP_PLACEMENT_NEW(p, T); return p; } static void pop(struct soap *soap, struct soap_blist *b) { if (!b) b = soap->blist; if (!b || !b->head) return; ((T*)(b->head + 1))->T::~T(); soap_pop_block(soap, b); } static void save(struct soap *soap, struct soap_blist *b, T *p) { if (!b) b = soap->blist; for (T *q = (T*)soap_first_block(soap, b); q; q = (T*)soap_next_block(soap, b)) { soap_update_pointers(soap, (const char*)p, (const char*)q, sizeof(T)); *p++ = *q; q->T::~T(); } } static void end(struct soap *soap, struct soap_blist *b) { if (!b) b = soap->blist; for (T *p = (T*)soap_first_block(soap, b); p; p = (T*)soap_next_block(soap, b)) p->T::~T(); soap_end_block(soap, b); } }; #endif #endif /* STDSOAP_H */ gsoap-2.8.28/gsoap/samples/calc_vs2005/README.txt0000644000175000017500000000201512653650154020465 0ustar ellertellertMicrosoft Visual Studio 2005 project example for the simple calculator service. To create a new gSOAP-based VS2005 project, follow these additional steps: Add a custom-build step to invoke soapcpp2 on the gSOAP header file (xyz.h): Right-button select xyz.h and select Properties In Configuration Propertes select Custom Build Step Command Line: soapcpp2.exe -i -wx -C $(InputFileName) Outputs: soapH.h soapStub.h soapC.cpp IMPORTANT: make sure to compile all sources in C++ compilation mode. If you migrate to a project file .vcproj, please set CompileAs="2" in your .vcproj file. Notes: 1. soapcpp2.exe must be installed as an executable, or you need to copy it to your project directory to enable custom-build step execution. 2. do not #include "xyz.h" in our source code directly, but #include the soapxyzProxy.h (for proxies) or soapH.h file and the .nsmap file The calc_vs2005 executable is a simple console application to invoke the calculator service from the DOS command line: $ calc_vs2005 add 3 4 result = 7 gsoap-2.8.28/gsoap/samples/calc_vs2005/debug/0000755000175000017500000000000012653650154020057 5ustar ellertellertgsoap-2.8.28/gsoap/samples/chaining++/0000755000175000017500000000000012653650172016756 5ustar ellertellertgsoap-2.8.28/gsoap/samples/chaining++/quote.h0000644000175000017500000000046712653650154020273 0ustar ellertellert//gsoap ns service name: quote //gsoap ns service style: rpc //gsoap ns service encoding: encoded //gsoap ns service namespace: urn:xmethods-delayed-quotes //gsoap ns service location: http://64.124.140.30:9090/soap //gsoap ns service method-action: getQuote "" int ns__getQuote(char *symbol, float *Result); gsoap-2.8.28/gsoap/samples/chaining++/Makefile.in0000644000175000017500000004647012653650172021036 0ustar ellertellert# Makefile.in generated by automake 1.14 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = chaining$(EXEEXT) DIST_COMMON = $(srcdir)/../Makefile.defines $(srcdir)/Makefile.in \ $(srcdir)/Makefile.am $(top_srcdir)/mkinstalldirs \ $(top_srcdir)/depcomp subdir = gsoap/samples/chaining++ ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am_chaining_OBJECTS = chaining.$(OBJEXT) QuotequoteService.$(OBJEXT) \ CalccalcService.$(OBJEXT) QuoteC.$(OBJEXT) CalcC.$(OBJEXT) \ envC.$(OBJEXT) chaining_OBJECTS = $(am_chaining_OBJECTS) am__DEPENDENCIES_1 = chaining_DEPENDENCIES = $(SOAP_CPP_LIB) $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(chaining_SOURCES) DIST_SOURCES = $(chaining_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ STRIP = @STRIP@ VERSION = @VERSION@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a BUILT_SOURCES = QuotequoteService.cpp CalccalcService.cpp envC.cpp CLEANFILES = *.req.xml *.res.xml *.nsmap *.xsd *.wsdl envStub.h envH.h envC.cpp CalcStub.h CalcH.h CalcC.cpp Calc*Proxy.h Calc*Proxy.cpp Calc*Object.h Calc*Service.h Calc*Service.cpp CalcClient.cpp CalcServer.cpp CalcClientLib.cpp CalcServerLib.cpp QuoteStub.h QuoteH.h QuoteC.cpp Quote*Proxy.h Quote*Proxy.cpp Quote*Object.h Quote*Service.h Quote*Service.cpp QuoteClient.cpp QuoteServer.cpp QuoteClientLib.cpp QuoteServerLib.cpp *~ SOAP_NS = Calc.nsmap chaining_SOURCES = chaining.cpp quote.h calc.h env.h QuotequoteService.cpp CalccalcService.cpp QuoteC.cpp CalcC.cpp envC.cpp chaining_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) -lm all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/chaining++/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/chaining++/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(srcdir)/../Makefile.defines: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) chaining$(EXEEXT): $(chaining_OBJECTS) $(chaining_DEPENDENCIES) $(EXTRA_chaining_DEPENDENCIES) @rm -f chaining$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(chaining_OBJECTS) $(chaining_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CalcC.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CalccalcService.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QuoteC.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QuotequoteService.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chaining.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/envC.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am envC.cpp: env.h $(SOAP) -CS -penv -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $< QuotequoteService.cpp: quote.h $(SOAP) -iS -qQuote -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $< CalccalcService.cpp: calc.h $(SOAP) -iS -qCalc -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $< # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.28/gsoap/samples/chaining++/env.h0000644000175000017500000000156012653650154017721 0ustar ellertellert/* env.h Defines SOAP-ENV Header and Fault global structures shared by client and service modules to process SOAP headers and faults when combining multiple client and/or services into one executable. Defines SOAP Fault and SOAP Header structures, which will be shared by client and service modules. The Header structure should contain all fields required by the clients and services. To obtain these, look into the wsdl2h-generated .h files for struct SOAP_ENV__Header and struct SOAP_ENV__Detail. Copy these below to make them globally visible to the gSOAP engine and plugins. Copyright (C) 2000-2003 Robert A. van Engelen, Genivia inc. All Rights Reserved. Compile: soapcpp2 -penv env.h c++ -c envC.cpp c++ -DWITH_NONAMESPACES -c stdsoap2.cpp */ #import "header.h" // optional user-defined headers #import "fault.h" // optional user-defined fault details gsoap-2.8.28/gsoap/samples/chaining++/README.txt0000644000175000017500000000431312653650154020455 0ustar ellertellert How to combine multiple C++ services into one server executable? The following method works well for all simple services, but not for plugin-based behaviors as plugin states are not propagated when chaining. In that case, please read suggestions further below to use a different option. Run wsdl2h on each WSDL, with "wsdl2h name.wsdl" to produce name.h Run "soapcpp2 -i -S -qName name.h" to produce a service class in a C++ namespace. The files generated by this command that you need are NamexxxService.h, NamexxxService.cpp, and NameC.cpp Run "soapcpp2 -CS -penv env.h" on an empty env.h (or an env.h with shared SOAP Header and SOAP Fault definitions) to produce envC.cpp for Header and Fault processing. Compile and link all these files together with libgsoap++ (or stdsoap2.cpp). Implement service chaining as follows: Name1::xxxService s1; Name2::yyyService s2; Name3::zzzService s3; s1.bind(NULL, 8080, 100); s1.accept(); if (soap_begin_serve(&s1)) ... error else if (s1.dispatch() == SOAP_NO_METHOD) { soap_copy_stream(&s2, &s1); if (s2.dispatch() == SOAP_NO_METHOD) { soap_copy_stream(&s3, &s2); if (s3.dispatch() == SOAP_NO_METHOD) ... error soap_free_stream(&s3); } soap_free_stream(&s2); } s1.destroy(); s2.desotry(); s3.destroy(); The above assumes soapcpp2 option -i is used, which means that each service object has its own engine state. This does not work well with plugins as it is tricky to ensure the plugin states are kept in sync. You can use soapcpp2 with option -j instead of -i: run "soapcpp2 -j -S -qName name.h" to produce a service class in a C++ namespace such that the instance has a soap context that can be shared. This allows plugins to be registered just once and shared across the services. The code is changed to: struct soap *soap = soap_new(); Name1::xxxService s1(soap); Name2::yyyService s2(soap); Name3::zzzService s3(soap); soap_bind(soap, NULL, 8080, 100); soap_accept(soap); if (soap_begin_serve(soap)) ... error else if (s1.dispatch() == SOAP_NO_METHOD) { if (s2.dispatch() == SOAP_NO_METHOD) { if (s3.dispatch() == SOAP_NO_METHOD) ... error } } soap_destroy(soap); soap_end(soap); soap_free(soap); // only safe when s1, s2, s3 are also deleted gsoap-2.8.28/gsoap/samples/chaining++/header.h0000644000175000017500000000120412653650154020354 0ustar ellertellert/* header.h Example SOAP Header definitions, to demonstrate the use of env.h. This file defines the SOAP Header data structure shared by client and service modules Copyright (C) 2000-2002 Robert A. van Engelen. All Rights Reserved. */ //gsoap h schema namespace: http://websrv.cs.fsu.edu/~engelen/h.xsd // h:authentication type of SOAP Header element struct h__authentication { @char *userid; // userid XML attribute @char *passwd; // passwd XML attribute }; // add the above to the SOAP Header elements: struct SOAP_ENV__Header { struct h__authentication *h__credentials; // rendered as XML }; gsoap-2.8.28/gsoap/samples/chaining++/chaining.cpp0000644000175000017500000000600512653650154021243 0ustar ellertellert/* chaining.cpp Example chaining of C++ service classes into one service application, assuming they are built with soapcpp2 option -i NOTE: option -j is preferred, see chaining2.cpp To generate non-client-server header and fault handlers: $ soapcpp2 -CS -penv env.h The quote service: $ soapcpp2 -i -S -qQuote quote.h The calc service: $ soapcpp2 -i -S -qCalc calc.h c++ -o chaining.cgi chaining.cpp stdsoap2.cpp envC.c QuotequoteService.cpp CalccalcService.cpp QuoteC.cpp CalcC.cpp -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2011, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "QuotequoteService.h" #include "CalccalcService.h" /* A dummy global table, to keep the linker happy */ struct Namespace namespaces[] = { {NULL} }; int main() { Quote::quoteService quote; Calc::calcService calc; /* serve over stdin/out, CGI style */ if (soap_begin_serve("e)) quote.soap_stream_fault(std::cerr); else if (quote.dispatch() == SOAP_NO_METHOD) { soap_copy_stream(&calc, "e); if (calc.dispatch()) soap_send_fault(&calc); soap_free_stream(&calc); } else if (quote.error) soap_send_fault("e); quote.destroy(); calc.destroy(); return 0; } int Quote::quoteService::getQuote(char *s, float *r) { *r = 123; /* a dummy service, stocks don't move */ return SOAP_OK; } int Calc::calcService::add(double a, double b, double *r) { *r = a + b; return SOAP_OK; } int Calc::calcService::sub(double a, double b, double *r) { *r = a - b; return SOAP_OK; } int Calc::calcService::mul(double a, double b, double *r) { *r = a * b; return SOAP_OK; } int Calc::calcService::div(double a, double b, double *r) { *r = a / b; return SOAP_OK; } int Calc::calcService::pow(double a, double b, double *r) { *r = ::pow(a, b); return SOAP_OK; } gsoap-2.8.28/gsoap/samples/chaining++/calc.h0000644000175000017500000001041012653650154020025 0ustar ellertellert/* calc.h This is a gSOAP header file with web service definitions. The service operations and type definitions use familiar C/C++ syntax. The following methods are defined by this gSOAP service definition: add(a,b) sub(a,b) mul(a,b) div(a,b) pow(a,b) Compilation in C (see samples/calc): $ soapcpp2 -c calc.h $ cc -o calcclient calcclient.c stdsoap2.c soapC.c soapClient.c $ cc -o calcserver calcserver.c stdsoap2.c soapC.c soapServer.c Compilation in C++ (see samples/calc++): $ soapcpp2 -i calc.h $ cc -o calcclient++ calcclient.cpp stdsoap2.cpp soapC.cpp soapcalcProxy.cpp $ cc -o calcserver++ calcserver.cpp stdsoap2.cpp soapC.cpp soapcalcService.cpp Note that soapcpp2 option -i generates proxy and service classes, which encapsulate the method operations in the class instead of defining them as global functions as in C. The //gsoap directives are used to bind XML namespaces and to define Web service properties: //gsoap service name: //gsoap service style: [rpc|document] //gsoap service encoding: [literal|encoded] //gsoap service namespace: //gsoap service location: Web service operation properties: //gsoap service method-style: [rpc|document] //gsoap service method-encoding: [literal|encoded] //gsoap service method-action: //gsoap service method-documentation: and type schema properties: //gsoap schema namespace: //gsoap schema elementForm: [qualified|unqualified] //gsoap schema attributeForm: [qualified|unqualified] //gsoap schema documentation: //gsoap schema type-documentation: where is an XML namespace prefix, which is used in C/C++ operation names, e.g. ns__add(), and type names, e.g. xsd__int. See the documentation for the full list of //gsoap directives. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap ns service name: calc Simple calculator service //gsoap ns service protocol: SOAP //gsoap ns service style: rpc //gsoap ns service encoding: encoded //gsoap ns service namespace: http://websrv.cs.fsu.edu/~engelen/calc.wsdl //gsoap ns service location: http://websrv.cs.fsu.edu/~engelen/calcserver.cgi //gsoap ns schema namespace: urn:calc //gsoap ns service method-documentation: add Sums two values int ns__add(double a, double b, double *result); //gsoap ns service method-documentation: sub Subtracts two values int ns__sub(double a, double b, double *result); //gsoap ns service method-documentation: mul Multiplies two values int ns__mul(double a, double b, double *result); //gsoap ns service method-documentation: div Divides two values int ns__div(double a, double b, double *result); //gsoap ns service method-documentation: pow Raises a to b int ns__pow(double a, double b, double *result); gsoap-2.8.28/gsoap/samples/chaining++/Makefile.am0000644000175000017500000000247412653650154021021 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 noinst_PROGRAMS = chaining include ../Makefile.defines envC.cpp: env.h $(SOAP) -CS -penv -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $< QuotequoteService.cpp: quote.h $(SOAP) -iS -qQuote -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $< CalccalcService.cpp: calc.h $(SOAP) -iS -qCalc -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $< BUILT_SOURCES = QuotequoteService.cpp CalccalcService.cpp envC.cpp CLEANFILES = *.req.xml *.res.xml *.nsmap *.xsd *.wsdl envStub.h envH.h envC.cpp CalcStub.h CalcH.h CalcC.cpp Calc*Proxy.h Calc*Proxy.cpp Calc*Object.h Calc*Service.h Calc*Service.cpp CalcClient.cpp CalcServer.cpp CalcClientLib.cpp CalcServerLib.cpp QuoteStub.h QuoteH.h QuoteC.cpp Quote*Proxy.h Quote*Proxy.cpp Quote*Object.h Quote*Service.h Quote*Service.cpp QuoteClient.cpp QuoteServer.cpp QuoteClientLib.cpp QuoteServerLib.cpp *~ SOAP_NS = Calc.nsmap chaining_SOURCES = chaining.cpp quote.h calc.h env.h QuotequoteService.cpp CalccalcService.cpp QuoteC.cpp CalcC.cpp envC.cpp chaining_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) -lm gsoap-2.8.28/gsoap/samples/chaining++/fault.h0000644000175000017500000000234612653650154020247 0ustar ellertellert/* fault.h Example SOAP Fault detail definitions, to demonstrate the use of env.h. Defines optional SOAP Fault derail data structures Copyright (C) 2000-2004 Robert A. van Engelen. All Rights Reserved. */ /* Add any data structure you want to serialize as part of the SOAP Fault detail element. The detail element '__type' and 'value' fields should be set to transmit data. The fields are set when data of corresponding types are received. For example, we define an of name with a string vector (note the leading _ in the following declaration): class _f__myData { public: std::vector *data; }; To return a fault from your service application: soap_sender_fault(soap, "An error occurred", NULL)); // set soap fault soap->fault->detail = (struct SOAP_ENV__Detail*)soap_malloc(soap, sizeof(struct SOAP_ENV__Detail)); soap->fault->detail->__type = SOAP_TYPE__f__myData; soap->fault->detail->value = soap_new__f__myData(soap, -1); return SOAP_FAULT; In addition, you can modify the SOAP_ENV__Detail struct and add your own set of fields, as in: struct SOAP_ENV__Detail { struct f__myDataType f__myData; int __type; void *value; char *__any; // or use '_XML __any' to store literal XML content }; */ gsoap-2.8.28/gsoap/samples/webserver/0000755000175000017500000000000012653650156017056 5ustar ellertellertgsoap-2.8.28/gsoap/samples/webserver/opt.h0000644000175000017500000000270712653650156020037 0ustar ellertellert/* opt.h To generate serializers for options.c. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2004, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ struct t__Option { char *key; char *val; }; gsoap-2.8.28/gsoap/samples/webserver/dh512.pem0000644000175000017500000000023412653650156020403 0ustar ellertellert-----BEGIN DH PARAMETERS----- MEYCQQDYbhGNVV6GoxOPsX+rBNGmgfJqh7+e1PFj8IketLqWtA2gkXAB9PKxrkDQ jvuEoXE4A6PVPfstmP/Ef4uNfCqLAgEC -----END DH PARAMETERS----- gsoap-2.8.28/gsoap/samples/webserver/bt.gif0000444000175000017500000000056312653650156020154 0ustar ellertellertGIF89a ---PPPfff! AdobeGoLivexmQMO0 -@Sib*abguHi<%NΜqKW"%_?E~FLb$GSpe:KByWH6_oU!MX SwV43f/߄4옽v=6 L=ȋU+pR^XW(/g|&K^mmGp_5uO{,U;*Т`GBc7%}t=YK2խ,j+!."'VX іB8Ui2N_; ⵑ!, (@41$;gsoap-2.8.28/gsoap/samples/webserver/test.html0000444000175000017500000000125512653650156020724 0ustar ellertellert

Test Page

Text test.

Image test.

HTTP GET form test (HTML response).

HTTP POST form test (HTML response).

HTTP POST multipart/form-data test (HTML response).

HTTP POST multipart/form-data test (XML response).


Web server administration (logon to this demo with "admin" and "guest").


Powered by gSOAP.



Copyright (c) 2000-2012 Robert van Engelen, Florida State University and Genivia Inc. gsoap-2.8.28/gsoap/samples/webserver/btl.gif0000444000175000017500000000066612653650156020334 0ustar ellertellertGIF89a (((UUU???eeebbb,,,ggg---PPPfff! AdobeGoLivexmQ]N0 ;EdYATI n)\p;j)g+V_G)5/'[Q0p+$׹ODfTlc|;@7cIle^P䃭9ڐ6b8s8-E:U+ LKzg ܖ: > $O#֛W{V6GBeH5|?$S]ҡ2"$s9G-.HC}q//˵}!, /G+E)ƻSI'%3A6 ,K<6ƢanH;gsoap-2.8.28/gsoap/samples/webserver/checked.gif0000444000175000017500000000261312653650156021133 0ustar ellertellertGIF89ajfff@'''))),,,dk_q fȡm***ߐqm(3*>q6%EgXP|oDZq%}&222C-V{6^omW49W|u]wޥAң@J{D@BBs瀱f 999~MrQ ^YX:::rm`6]#6F"""׻".;Եtttpq]T~LL p+++q}N\rjjDDpR\{wӦ~[!,6i\ e=yډ摺C/AAEK[! AdobeGoLivexmQ]J1>'㻻 "Jm )lkWn^imH7ZoԕkZ2)u[>;W`6QyYf-\,]hSY-קtl 8e/ɿ eq5GF @c}B8ǎ|KQ@pE?⒞v#yO2ՙM,Z/cD}(^Z={[amc/,O)mEN/e}!,@ Hp`?ju+͕>f#,i x`|IJeRT( )HxZTbaX*Sla8 Z6=UFYFzC5K$ 4|aQ`Ce1B=$ `M_y)Ÿ1C8,(jA`J> 3jYE0(Akq"SQIEDY 6ƞ7m!GGCrVf\ᆲE\hcYja qĽ eqSa2`>"\ 'o  7)o-j/ / @ |D|QjDm3c5rj({ҡmmz^"꩚"4 kƒname; p++ ) { if (p->value) free(p->value); } free(options); } } int parse_options(int argc, char **argv, struct option *options) { int i; for (i = 1; i < argc; i++) { const char *key, *val; key = argv[i]; if (*key == OPTION_CHAR) { int flag = 1; while (flag && *++key) { if (*key == '?' || !strcmp(key, "help")) { print_usage(argc, argv, options); return 1; } if (i < argc) val = argv[i + 1]; else val = NULL; switch (set_option(key, val, options)) { case 2: i++; case 1: flag = 0; case 0: break; case -1: fprintf(stderr, "%s: missing argument value for option %c%s\n", argv[0], OPTION_CHAR, key); print_usage(argc, argv, options); return 1; case -2: fprintf(stderr, "%s: unknown option %c%s\n", argv[0], OPTION_CHAR, key); print_usage(argc, argv, options); return 1; } } } else if (set_option(NULL, key, options) < 0) fprintf(stderr, "%s: invalid argument %s\n", argv[0], key); } return 0; } void query_options(struct soap *soap, struct option *options) { char *s = query(soap); /* get arguments from query string */ while (s) { char *key = query_key(soap, &s); /* decode next query string key */ char *val = query_val(soap, &s); /* decode next query string value */ if (key) set_option(key, val, options); } } int load_options(const char *file, const char *name, struct option *options) { struct soap soap; soap_init(&soap); if (file) { soap.recvfd = open(file, O_RDONLY); if (soap.recvfd < 0) { soap_done(&soap); return EOF; } } if (!soap_begin_recv(&soap) && !soap_element_begin_in(&soap, name, 1, NULL)) { struct t__Option t; while (soap_in_t__Option(&soap, "option", &t, NULL)) if (set_option(t.key, t.val, options) < 0) ; /* error, just ignore for now */ if (!soap_element_end_in(&soap, name)) soap_end_recv(&soap); } if (file) close(soap.recvfd); soap_end(&soap); soap_done(&soap); return soap.error; } int save_options(const char *file, const char *name, struct option *options) { struct soap soap; soap_init1(&soap, SOAP_XML_TREE); soap.namespaces = NULL; soap.encodingStyle = NULL; if (file) { soap.sendfd = open(file, O_CREAT | O_RDWR, 0644); if (soap.sendfd < 0) { soap_done(&soap); return EOF; } } if (!soap_begin_send(&soap) && !soap_element_begin_out(&soap, name, 0, NULL)) { struct option *p; struct t__Option t; for (p = options; p->name; p++) { t.val = NULL; if (!p->name[0]) { if (!p->value) continue; t.key = NULL; t.val = p->value; } else if (p->name[1] == '.') t.key = (char*)p->name + 2; else t.key = (char*)p->name; if (p->selections && strchr(p->selections, ' ')) { const char *s = p->selections - 1; char *r; int i; for (i = p->selected; i > 0; i--) { s = strchr(s + 1, ' '); if (!s) break; } if (s) { t.val = soap_strdup(&soap, s + 1); r = strchr(t.val, ' '); if (r) *r = '\0'; } } else if (p->value) t.val = p->value; else if (!p->selected) continue; if (soap_out_t__Option(&soap, "option", 0, &t, NULL)) break; } if (!soap_element_end_out(&soap, name)) soap_end_send(&soap); } if (file) close(soap.sendfd); soap_end(&soap); soap_done(&soap); return soap.error; } int html_options(struct soap *soap, struct option *options) { struct option *p; soap_send(soap, "\n"); soap_send(soap, ""); for (p = options; p->name; p++) { const char *s, *t, *n; int i; n = p->name; if (n[0] && n[1] == '.') n += 2; s = p->selections; soap_send(soap, ""); } else if (!s) { soap_send(soap, n); soap_send(soap, ""); else soap_send(soap, "'>"); } else if (strchr(s, ' ')) { soap_send(soap, n); soap_send(soap, ""); for (i = 0; ; i++) { t = strchr(s, ' '); if (i == 0) soap_send(soap, ""); if (!t) break; soap_send(soap, "\n"); s = t + 1; } } else { char buf[24]; soap_send(soap, n); soap_send(soap, ""); } soap_send(soap, "\n"); // \n"); } soap_send(soap, "\n\n
"); if (!n[0]) { if (s) soap_send(soap, s); soap_send(soap, ""); if (p->value) soap_send(soap, p->value); soap_send(soap, "onoff"); else soap_send(soap, "
"); if (i == p->selected) soap_send(soap, ""); else { soap_send(soap, ""); soap_send(soap, ""); } if (t) soap_send_raw(soap, s, t - s); else soap_send(soap, s); soap_send(soap, "
 
\n"); return SOAP_OK; } int html_form_options(struct soap *soap, struct option *options) { soap_send(soap, "

"); html_options(soap, options); return soap_send(soap, "
"); } static int set_option(const char *key, const char *val, struct option *options) { struct option *p; if (!key) { for (p = options; p->name; p++) { if (!p->name[0]) { if (p->value) { size_t l = strlen(p->value) + strlen(val); char *s = (char*)malloc(l + 2); if (s) { (SOAP_SNPRINTF(s, l + 2, l + 1), "%s %s", p->value, val); free((void*)p->value); p->value = s; } } else { size_t l = strlen(val); p->value = (char*)malloc(l + 1); if (p->value) soap_strcpy(p->value, l + 1, val); } return 2; } } return -2; } for (p = options; p->name; p++) { if (p->name[0] && ((p->name[1] == '.' && !strcmp(key, p->name + 2)) || (p->name[1] != '.' && !strcmp(key, p->name)))) { if (p->selections) { if (!val) return -1; if (set_selection(val, p) < 0) return -1; return 2; } if (val && !*val) { p->selected = 0; return 2; } p->selected = 1; return 1; } } for (p = options; p->name; p++) { if (p->name[0] == key[0] && p->name[1] == '.') { if (p->selections) { const char *s = key + 1; if (!s[0]) { s = val; if (!s) return -1; } if (set_selection(s, p) < 0) return -1; if (s == val) return 2; return 1; } p->selected = 1; return 0; } } return -2; } static int set_selection(const char *val, struct option *p) { size_t l; if (strchr(p->selections, ' ')) return p->selected = find_selection(val, p->selections); if (p->value) free(p->value); l = strlen(val); p->value = (char*)malloc(l + 1); if (p->value) soap_strcpy(p->value, l + 1, val); return 0; } static int find_selection(const char *val, const char *selections) { int i = 0; const char *s = selections; size_t n = strlen(val); for (;;) { if (!strncmp(s, val, n) && (s[n] == ' ' || s[n] == '\0')) return i; s = strchr(s, ' '); if (!s) break; s++; i++; } return -1; } static void print_usage(int argc, char **argv, struct option *options) { struct option *p; fprintf(stderr, "Usage: %s", argv[0]); for (p = options; p->name; p++) { if (p->name[0]) { int flag = (p->name[1] == '.'); if (p->selections) { if (strchr(p->selections, ' ')) { if (flag) fprintf(stderr, " %c%c[%s]", OPTION_CHAR, p->name[0], p->selections); else fprintf(stderr, " %c%s [%s]", OPTION_CHAR, p->name, p->selections); } else if (flag) fprintf(stderr, " %c%c<%s>", OPTION_CHAR, p->name[0], p->selections); else fprintf(stderr, " %c%s <%s>", OPTION_CHAR, p->name, p->selections); } else if (flag) fprintf(stderr, " %c%c", OPTION_CHAR, p->name[0]); else fprintf(stderr, " %c%s", OPTION_CHAR, p->name); } else if (p->selections) fprintf(stderr, " %s", p->selections); else fprintf(stderr, " ..."); } fprintf(stderr, "\n"); } gsoap-2.8.28/gsoap/samples/webserver/favicon.gif0000444000175000017500000000056612653650156021177 0ustar ellertellertGIF89a1rfzz發l#((uFUTɁf͒/9:ٜ٦_tvp ,@@p10$á! 0@*C%#D(pP1&, RTw  !TqgwXxqIudC!kceI !Sc !ã!b X !oI XTB ߛA;gsoap-2.8.28/gsoap/samples/webserver/otrs.gif0000444000175000017500000000116212653650156020532 0ustar ellertellertGIF89a 恁Ξyyy! AdobeGoLivexmQj0 }{)N+=^*Ү{=c)YZF瓔R߯[ԤgR;]|.9`$Q^!~-2[_,e*䳟 R:\Q kxYMҋp0>M@4E* bRҖItݸd!Zng0&i 6ǰ:f)P#].4 ÜBcX27!K;`|ܚ8hgó)h/R1(Ϥg|%GAM~ Simple Calculator Web Service Using HTTP POST multipart/form-data
=
gsoap-2.8.28/gsoap/samples/webserver/calcform2.html0000444000175000017500000000265512653650156021622 0ustar ellertellert Simple Calculator Web Service Using HTTP POST multipart/form-data
=
gsoap-2.8.28/gsoap/samples/webserver/itrs.gif0000444000175000017500000000116412653650156020526 0ustar ellertellertGIF89a {{{zzzkkkiii䲲mmmѓpppȤ؆vvvgggfff܂uuulllhhhjjjwwwooosssnnn! AdobeGoLivexmQj0 }vo;;)cXKXVuҞk׽,- `#}IJRj^3)u.>j0DK^tl(lm? b OzaIi(Ԇ5W&dN8&OJ"\Zaxrj (CM\Kzgr4ܭMQ$&o^UPMv\r}%mt9G2ԍ, 'KD1&VK^ɱOmYΆ`|cv"!, @[@0&N'i0D*Úl0HbHRN&  "8,! sXR$f !)( $,# (*A;gsoap-2.8.28/gsoap/samples/webserver/calcpost.html0000444000175000017500000000134312653650156021553 0ustar ellertellert Simple Calculator Web Service Using HTTP POST
=
gsoap-2.8.28/gsoap/samples/webserver/Makefile0000644000175000017500000000325312653650156020521 0ustar ellertellertGSOAP=../../src/soapcpp2 SOAPH=../../stdsoap2.h SOAPC=../../stdsoap2.c SOAPCPP=../../stdsoap2.cpp SOAPDOMC=../../dom.c SOAPDOMCPP=../../dom.cpp CC=gcc CPP=g++ LIBS=-lpthread -lz -lssl -lcrypto COFLAGS=-O2 CWFLAGS=-Wall -Wno-deprecated-declarations CIFLAGS=-I../.. -I../../plugin CMFLAGS=-DWITH_COOKIES -DWITH_GZIP -DWITH_OPENSSL CFLAGS= $(CWFLAGS) $(COFLAGS) $(CIFLAGS) $(CMFLAGS) all: webserver webserver: webserver.h webserver.c logging.o httpget.o httpform.o httpda.o md5evp.o threads.o options.o $(SOAPH) $(SOAPC) $(GSOAP) -c -L webserver.h $(CC) $(CFLAGS) -o webserver webserver.c logging.o httpget.o httpform.o httpda.o md5evp.o threads.o options.o soapC.c soapClient.c soapServer.c $(SOAPC) $(LIBS) options.o: opt.h options.h options.c $(GSOAP) -cnpopt opt.h $(CC) $(CFLAGS) -c options.c logging.o: ../../plugin/logging.h ../../plugin/logging.c $(CC) $(CFLAGS) -c ../../plugin/logging.c httpget.o: ../../plugin/httpget.h ../../plugin/httpget.c $(CC) $(CFLAGS) -c ../../plugin/httpget.c httpform.o: ../../plugin/httpform.h ../../plugin/httpform.c $(CC) $(CFLAGS) -c ../../plugin/httpform.c httpda.o: ../../plugin/httpda.h ../../plugin/httpda.c $(CC) $(CFLAGS) -c ../../plugin/httpda.c md5evp.o: ../../plugin/md5evp.h ../../plugin/md5evp.c $(CC) $(CFLAGS) -c ../../plugin/md5evp.c threads.o: ../../plugin/threads.h ../../plugin/threads.c $(CC) $(CFLAGS) -c ../../plugin/threads.c .PHONY: clean distclean clean: rm -f *.o soapH.h soapStub.h soapC.c soapClient.c soapServer.c soapClientLib.c soapServerLib.c distclean: rm -f *.o soapH.h soapStub.h soapC.c soapClient.c soapServer.c soapClientLib.c soapServerLib.c rm -f *.wsdl *.xsd *.xml *.nsmap *.log rm -f webserver gsoap-2.8.28/gsoap/samples/webserver/calcget.html0000444000175000017500000000134112653650156021343 0ustar ellertellert Simple Calculator Web Service Using HTTP GET
=
gsoap-2.8.28/gsoap/samples/webserver/server.pem0000644000175000017500000000724212653650156021074 0ustar ellertellert-----BEGIN ENCRYPTED PRIVATE KEY----- MIICxjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQI74Clf0036IICAggA MBQGCCqGSIb3DQMHBAiOmGBFtHOX0wSCAoAPb8WN47mTunpkPpzBSNd4i+qX1f4V XyFMWxdibGTclHfNesksWkg38E0nt9ORMImgvpKIHgQ2l+dt725uAoRhtuva7N2R kQKkJOtbzlxbgmi0QylcaEZYCw/OLsL0sH0xaoJDJsjwF74RAu4CJ7XVPR+ldPb9 hWSPb9KIkAe779KChZUaEkDa61ce0Bh7hSztjXYKqwI4W+xB0hv32dkwiap74mxr qw8fqu64+jj2UipUG0FVkruuYy0bW8Nh1P4aGIIKpFjjNBaHQoHWuluh0jDI7cpT A0Sfyg1teEtbBJgF2ebej6f7AHMHq2PuPo/nWzb2d6Akkc3q1Ab44yUeRgPhNTxA glhjoCSOOIFm2YfBh22A1h3JHDyr4INptSnlPl4lMMFYLS/JmJ+zg0cUTK53uY91 ncBtu6odT69Vxb/z5X3LIhjqJS6oSXDoFMlHxLkFyLamjPBgtvNSnlLQPWsrwpUd Fsl94W7OxIu4U711xMBbkYbYhLOAQ3KlF1GbYIyfOcQbvJ8UsXu959WJK6bQ0+ud XcnmQFZnEoxtDMcSCqcZfbcTasHGvrp4pBpxUyPNC5AUnLXsIg5QaplO7i5atrT/ e/I/jPA7AefUol5s8fyDKbKNBfuPk6VTvtIXKEGP8vKf5ZRai6HhhoE0pbEsNdSD CVfESYrTfgXf2h1gvSunWwDMbC/AaaNjjoHBTLQJfCbvacqK9zz/8o/BFEUWi/30 KeqA5pnlKIRL2nblWcKZE9xSKomsZqch7xTK5m9FUxAwwlAAVM5kwgiaFGEgrAO2 pFP9pJxZzxThlxQi2EgyHUoGqPjdPNFVuhBEcyIhVZp86qoikNoxtdBE -----END ENCRYPTED PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIID4TCCA0qgAwIBAgIBHzANBgkqhkiG9w0BAQUFADCBjTELMAkGA1UEBhMCVVMx CzAJBgNVBAgTAkZMMRQwEgYDVQQHEwtUYWxsYWhhc3NlZTEWMBQGA1UEChMNR2Vu aXZpYSwgSW5jLjELMAkGA1UECxMCSVQxEjAQBgNVBAMTCWxvY2FsaG9zdDEiMCAG CSqGSIb3DQEJARYTY29udGFjdEBnZW5pdmlhLmNvbTAeFw0xNTA4MDQxOTAzNDda Fw0xODA4MDMxOTAzNDdaMIGNMQswCQYDVQQGEwJVUzELMAkGA1UECBMCRkwxFDAS BgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYDVQQKEw1HZW5pdmlhLCBJbmMuMQswCQYD VQQLEwJJVDESMBAGA1UEAxMJbG9jYWxob3N0MSIwIAYJKoZIhvcNAQkBFhNjb250 YWN0QGdlbml2aWEuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC4J9vn Sde1q+Pyvgs4QUPiNKnqezL0Cqp1vA7gfUJ31Q/0071gkgMSX/DL+SZPjRSfEjA1 c9JyPjSdeZ5zydAz9f5R680Nvs8VKR9MsB3/XAnI3Rhd9G11QHXuW7DsaF6TXHNk EoipcN7ebie9eeqadv8xzhvTBHBE8rkf8iMI2QIDAQABo4IBTTCCAUkwCQYDVR0T BAIwADALBgNVHQ8EBAMCBPAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMC MCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAd BgNVHQ4EFgQUYJXHvmkvx1zc7GjmBJ9G0YQpKSgwgcIGA1UdIwSBujCBt4AU+MeC gLt+4soPx4i3OiBZYwMqlNChgZOkgZAwgY0xCzAJBgNVBAYTAlVTMQswCQYDVQQI EwJGTDEUMBIGA1UEBxMLVGFsbGFoYXNzZWUxFjAUBgNVBAoTDUdlbml2aWEsIElu Yy4xCzAJBgNVBAsTAklUMRIwEAYDVQQDEwlsb2NhbGhvc3QxIjAgBgkqhkiG9w0B CQEWE2NvbnRhY3RAZ2VuaXZpYS5jb22CCQDWdgbFTLQbVTANBgkqhkiG9w0BAQUF AAOBgQCNUuW182UC2YqBE3oEtwaguyYWOR5aZIUE4znV9thu7xBZhCoFhukmQX0L TwoSiW7Yt7vx0cUL4RQltT4D225ANhogdmBh0JmIXc60DtpnCs43IjTT1moUwx6T M51IxVIgksklJuo7UIILrYWlIR3GjDWGOEpQQmQhoLS10lVAyQ== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDkDCCAvmgAwIBAgIJANZ2BsVMtBtVMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYD VQQGEwJVUzELMAkGA1UECBMCRkwxFDASBgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYD VQQKEw1HZW5pdmlhLCBJbmMuMQswCQYDVQQLEwJJVDESMBAGA1UEAxMJbG9jYWxo b3N0MSIwIAYJKoZIhvcNAQkBFhNjb250YWN0QGdlbml2aWEuY29tMB4XDTE1MDgw NDE5MDEyMFoXDTE4MDgwMzE5MDEyMFowgY0xCzAJBgNVBAYTAlVTMQswCQYDVQQI EwJGTDEUMBIGA1UEBxMLVGFsbGFoYXNzZWUxFjAUBgNVBAoTDUdlbml2aWEsIElu Yy4xCzAJBgNVBAsTAklUMRIwEAYDVQQDEwlsb2NhbGhvc3QxIjAgBgkqhkiG9w0B CQEWE2NvbnRhY3RAZ2VuaXZpYS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJ AoGBALx/LiwGRi4wH8y0MEL64VJs5H2O1F4uuYO+aNVZHl5ULRDmSh/4eF8aOYXT B05PfVoctBogcK0ohPEhiUcR/029LQTkEs/5D7XsuRuQsUnMfkEihmC2VtEuJMqT OeXmuIcemEw0QL3ulny7H8W6Aq2rByC2r5iqytnM4Uuw7LMnAgMBAAGjgfUwgfIw HQYDVR0OBBYEFPjHgoC7fuLKD8eItzogWWMDKpTQMIHCBgNVHSMEgbowgbeAFPjH goC7fuLKD8eItzogWWMDKpTQoYGTpIGQMIGNMQswCQYDVQQGEwJVUzELMAkGA1UE CBMCRkwxFDASBgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYDVQQKEw1HZW5pdmlhLCBJ bmMuMQswCQYDVQQLEwJJVDESMBAGA1UEAxMJbG9jYWxob3N0MSIwIAYJKoZIhvcN AQkBFhNjb250YWN0QGdlbml2aWEuY29tggkA1nYGxUy0G1UwDAYDVR0TBAUwAwEB /zANBgkqhkiG9w0BAQUFAAOBgQB+fmbScGp3R4D0Sf4gbBJ/3CGEn4/HvupSikDq vyaviwJ2KQKGlAr/lDh1qSYItkazJpJDIxyG2Dzm2w0F0u1+CSwpym6eq1pxc8dh GRdrCVyuM0gUoBvxUym7o0Bq1V6onUjwrAti+onsZjDpfAIKBI8TRfjuTNzFeSAV G2zULg== -----END CERTIFICATE----- gsoap-2.8.28/gsoap/samples/webserver/client.pem0000644000175000017500000000724212653650156021044 0ustar ellertellert-----BEGIN ENCRYPTED PRIVATE KEY----- MIICxjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQICWRtmv3QhOwCAggA MBQGCCqGSIb3DQMHBAhGNsH9x+5NFASCAoCpz7lm6a8z2MtoP9CfXzAbcmPHVamE jJ+tmrL0sw1pTgwYUOibMF7owTTXTzKqndg/rp8PbG57FmkC6/Ka48Dr2pDmobR+ imfjX8Mx2Zc6o6c31ZA/gcQiNHY2rKOxmsfog85zejw0NFZx4o7bb9wqwNPKnc0w OoU/xgrhbSamPAZDXO9QWd6pceXPyLQ4To2hKq6TxsOCsqsSCawlAA/RogaA9eN6 NSi9I85UuxzQgClZRzKy0v3BC2Lx71YN/p6MIhr4i4inbnlEkRqFDkg+b9u6Hydm dIDvAcoHOildgaSG2Thc+2n5qf22SWbOTi/z/pb0PIcp1t2aDYWlR6AxLyX5+RfU GSXFdw/9Br8adr4NZeXGdvUSWcQAGP+Bbk520oGSvNkAyZVd/SmLS+EGdYsOQoMW GJGtKWPXuOYIzffoTrdLYQ8sm3TPjyf9eufvBy2EVq8Az8cRlfjB4XLaoRJo0PZ1 If5HbCft0H8isPLBpMPbi93/TAWi8xM/p4ktSbP/qpKsg85TPiMSprZJu8srVEQm v79HYr2tW4D2ymEArzVASBn3AopMcQ51FwWg4RXDZi2y8Sw+TBDx2jY0J5kK8gob 51STpQ7+sM5Il63DpYo6JSOIeDLWzM5a7/vMI/H9EGuEbXxEShWdlwyl8jzTIj30 b+M6ShiAHPf1Ns1bCPYb52GotL8dwvoCgGMIjey5er0Pz4n+MAtqVY3qwQZSRwBF skZszTBbWDb/GsFiiP8KASRA5twkZo52Q5MIBnnqcRi391SeBRxEVmnKJoulIUfF ved40dj8pyVK/Bj54lvv1zUAFZcx03b3d7Fl4l3EohHvSyykIuEbg4EH -----END ENCRYPTED PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIID4TCCA0qgAwIBAgIBHjANBgkqhkiG9w0BAQUFADCBjTELMAkGA1UEBhMCVVMx CzAJBgNVBAgTAkZMMRQwEgYDVQQHEwtUYWxsYWhhc3NlZTEWMBQGA1UEChMNR2Vu aXZpYSwgSW5jLjELMAkGA1UECxMCSVQxEjAQBgNVBAMTCWxvY2FsaG9zdDEiMCAG CSqGSIb3DQEJARYTY29udGFjdEBnZW5pdmlhLmNvbTAeFw0xNTA4MDQxOTAzMTZa Fw0xODA4MDMxOTAzMTZaMIGNMQswCQYDVQQGEwJVUzELMAkGA1UECBMCRkwxFDAS BgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYDVQQKEw1HZW5pdmlhLCBJbmMuMQswCQYD VQQLEwJJVDESMBAGA1UEAxMJbG9jYWxob3N0MSIwIAYJKoZIhvcNAQkBFhNjb250 YWN0QGdlbml2aWEuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC1KFPq 9x2mB6pLpHOTTr1MjAb/NL1For9p78INDFgdr0qfvv1ADTRDGtIgzpPBzJlJ2Cdi fWbn4+0I3LzY3n2n5GVSjhH6bJcXwRtPJRL9JHIjqKnWTWH9lTpT9DtOd1NfqLN4 /YEbUpOBWRyF7StZXdvc/RjehYslZFWN0QjnaQIDAQABo4IBTTCCAUkwCQYDVR0T BAIwADALBgNVHQ8EBAMCBPAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMC MCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAd BgNVHQ4EFgQUNIRI7RyXyWIAH1L4KFDCRvgAozAwgcIGA1UdIwSBujCBt4AU+MeC gLt+4soPx4i3OiBZYwMqlNChgZOkgZAwgY0xCzAJBgNVBAYTAlVTMQswCQYDVQQI EwJGTDEUMBIGA1UEBxMLVGFsbGFoYXNzZWUxFjAUBgNVBAoTDUdlbml2aWEsIElu Yy4xCzAJBgNVBAsTAklUMRIwEAYDVQQDEwlsb2NhbGhvc3QxIjAgBgkqhkiG9w0B CQEWE2NvbnRhY3RAZ2VuaXZpYS5jb22CCQDWdgbFTLQbVTANBgkqhkiG9w0BAQUF AAOBgQCi4vLlE4pq+tHdL54NmHqcl+Ls2mb1MghjwwDz6McDCEV+uIzREXGq8ocw KxjBrI5iNiT0dPnSOEIyyGdQxJCUzwqHibHg3DjmOwPKXmo+Dq05nsAeTr4J/66r eMCzvxxtZwIgbidIkDsOzU54b5nle04E77YGKUc98Q3qkRGkwQ== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDkDCCAvmgAwIBAgIJANZ2BsVMtBtVMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYD VQQGEwJVUzELMAkGA1UECBMCRkwxFDASBgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYD VQQKEw1HZW5pdmlhLCBJbmMuMQswCQYDVQQLEwJJVDESMBAGA1UEAxMJbG9jYWxo b3N0MSIwIAYJKoZIhvcNAQkBFhNjb250YWN0QGdlbml2aWEuY29tMB4XDTE1MDgw NDE5MDEyMFoXDTE4MDgwMzE5MDEyMFowgY0xCzAJBgNVBAYTAlVTMQswCQYDVQQI EwJGTDEUMBIGA1UEBxMLVGFsbGFoYXNzZWUxFjAUBgNVBAoTDUdlbml2aWEsIElu Yy4xCzAJBgNVBAsTAklUMRIwEAYDVQQDEwlsb2NhbGhvc3QxIjAgBgkqhkiG9w0B CQEWE2NvbnRhY3RAZ2VuaXZpYS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJ AoGBALx/LiwGRi4wH8y0MEL64VJs5H2O1F4uuYO+aNVZHl5ULRDmSh/4eF8aOYXT B05PfVoctBogcK0ohPEhiUcR/029LQTkEs/5D7XsuRuQsUnMfkEihmC2VtEuJMqT OeXmuIcemEw0QL3ulny7H8W6Aq2rByC2r5iqytnM4Uuw7LMnAgMBAAGjgfUwgfIw HQYDVR0OBBYEFPjHgoC7fuLKD8eItzogWWMDKpTQMIHCBgNVHSMEgbowgbeAFPjH goC7fuLKD8eItzogWWMDKpTQoYGTpIGQMIGNMQswCQYDVQQGEwJVUzELMAkGA1UE CBMCRkwxFDASBgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYDVQQKEw1HZW5pdmlhLCBJ bmMuMQswCQYDVQQLEwJJVDESMBAGA1UEAxMJbG9jYWxob3N0MSIwIAYJKoZIhvcN AQkBFhNjb250YWN0QGdlbml2aWEuY29tggkA1nYGxUy0G1UwDAYDVR0TBAUwAwEB /zANBgkqhkiG9w0BAQUFAAOBgQB+fmbScGp3R4D0Sf4gbBJ/3CGEn4/HvupSikDq vyaviwJ2KQKGlAr/lDh1qSYItkazJpJDIxyG2Dzm2w0F0u1+CSwpym6eq1pxc8dh GRdrCVyuM0gUoBvxUym7o0Bq1V6onUjwrAti+onsZjDpfAIKBI8TRfjuTNzFeSAV G2zULg== -----END CERTIFICATE----- gsoap-2.8.28/gsoap/samples/webserver/unchecked.gif0000444000175000017500000000170612653650156021500 0ustar ellertellertGIF89aۻ𯯯rrrfff)))޴sss'''׾ooo󱱱,,,̢:::999+++***Аwww񍍍Θԁ븸҉~~~eee܆! AdobeGoLivexmQ]N0 [)~VJ]ɽ RvC5ߍa]+$[/Df뫘lB|;jCRZ3 a ٿ Y ^Ci\DSk Ϯ VcѳPKqIBY{ 8|S@IjFt(Va8Q$;\-׶c@ΑLua"Kx)(rZxgr,4ph((KG 0a!,@TTS8.?HH 7!TK  SQDJJAS*NGGG, CB2SH KKSSKKM+K@PQOQI S E%U<1QOPU;0Hp 3XĉÇ5i!I ac $l<I&RR8‹M| Bf5KD f@@ʑ LxHD r LgI(Or Sٸ* k_!_xn bF֬e&.G 6GyjU+ d+ͺ빦 bEjGeZ(t0](C侏N'kIՁCme<8Dץc"9$!R=0: current selection in selections list */ char *value; /* parsed value (when 'selections' is one name) */ }; extern struct option *copy_options(const struct option *options); extern void free_options(struct option *options); extern int parse_options(int argc, char **argv, struct option *options); extern void query_options(struct soap *soap, struct option *options); extern int save_options(const char *file, const char *name, struct option *options); extern int load_options(const char *file, const char *name, struct option *options); extern int html_options(struct soap *soap, struct option *options); extern int html_form_options(struct soap *soap, struct option *options); gsoap-2.8.28/gsoap/samples/webserver/deselected.gif0000444000175000017500000000172012653650156021644 0ustar ellertellertGIF89aůꚚDDD򏏏ⅅ󩩩zzzVVV說Ή쨨kkk:::lllYYYۃ|||pppд]]]IJ! AdobeGoLivexmQMk0 ;vv cn$*ҮS$$TCԍ[2)uξ0DK^fu˽B1,kdY&Tg?˹)$u\;`|ܚ>?h(pn* b5RD035P.WXM 'RQH X*X 4YR! @G !XXWWT/1'nA%T]IR$G\ "p2(@T`CdtB劉+@J("Á)T\˔$*$ b1CHXHP(`>,;gsoap-2.8.28/gsoap/samples/webserver/otls.gif0000444000175000017500000000116112653650156020523 0ustar ellertellertGIF89a ލ恁񺺺Ξyyy! AdobeGoLivexmQj0 }vi;=JG>(ilϟ~>I)U/~RҞItո!ZsXf4GydmXvl}M~rnV搔BcXfoB^섃qo4."܀+5WQɏR1T(ϥg|%GA?x^C=6=5, Xy'jDmZ3㈟ږ<P&4hL/ŸZ$ zw&BVXb webserver 8080 & Start a web browser and open a (localhost) location: http://127.0.0.1:8080 and type userid 'admin' and passwd 'guest' to gain access Open the location: http://127.0.0.1:8080/calc.html and enter an expression Open the locations: http://127.0.0.1:8080/test.html http://127.0.0.1:8081/webserver.wsdl Use (HTTPS GET): Create the SSL certificate (see samples/ssl README and scripts) Compile the web server with OpenSSL as explained above Start the web server on an odd numbered port (e.g. 8081) > webserver 8081 & Actually, you can start two servers, one on 8080 and a secure one on 8081 Start a web browser and open a (localhost) location: https://127.0.0.1:8081 and type userid 'admin' and passwd 'guest' to gain access Open the location: https://127.0.0.1:8081/calc.html and enter an expression Open the locations: https://127.0.0.1:8081/test.html https://127.0.0.1:8081/webserver.wsdl Use (HTTP POST): Serves SOAP/XML calculation requests Command-line options: -z enables compression -c enables chunking -k enables keep-alive -i enables non-threaded iterative server -v enables verbose mode -t sets I/O timeout value (seconds) -s sets server timeout value (seconds) -d sets cookie domain -p sets cookie path -l[none inbound outbound both] enables logging gsoap-2.8.28/gsoap/samples/webserver/ruler.gif0000444000175000017500000000063012653650156020673 0ustar ellertellertGIF89a PPPgggfff! AdobeGoLivexmQ=O05kg6iA)N:TBtc3%*R~3+;גFTK};f񫔺; RW?z19 &0GYv 5۲م:X#|=t3Е8X6g9ڐ66b(*9^c|5EE/)@3$O#mqP{V6GB-'j*8=T6th"\NPegaNŵ5!, +X୆`)@iibnpltmA^?6>~+bC!, @0;gsoap-2.8.28/gsoap/samples/webserver/bs.gif0000444000175000017500000000062012653650156020145 0ustar ellertellertGIF89a pppxxxн! AdobeGoLivexmQN0 .םyrtBLE;LB Bvxr܍vWi)g'IMF6BjΧ[(x|`VLUܗ[ m,rܢ] d6cIY1(M( 71T{;Y#?X@p\aۢiqM/B]9H-^)cWgU#zTll );X]#c|&IQAu:x+%ՌR\xo+ PdZ+p}c:!, @0dA;gsoap-2.8.28/gsoap/samples/webserver/webserver.h0000644000175000017500000000410512653650156021233 0ustar ellertellert/* webserver.h -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2004, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap ns service name: webserver //gsoap ns service namespace: http://websrv.cs.fsu.edu/~engelen/calc.wsdl //gsoap ns service location: http://localhost:8080 //gsoap ns service style: rpc //gsoap ns service encoding: encoded //gsoap ns schema namespace: urn:calc int ns__add(double a, double b, double *result); // HTTP POST request-response int ns__sub(double a, double b, double *result); // HTTP POST request-response int ns__mul(double a, double b, double *result); // HTTP POST request-response int ns__div(double a, double b, double *result); // HTTP POST request-response //gsoap f schema namespace: urn:form int f__form1(void); // one-way MEP int f__form2(struct f__formResponse { double result; } *); gsoap-2.8.28/gsoap/samples/webserver/obrs.gif0000444000175000017500000000115612653650156020513 0ustar ellertellertGIF89a э恁񺺺Ξyyy! AdobeGoLivexmQj0 ^A{o:{SJG c7Qc[eOӔ- `#]j~ORj_3)OK%e:y>buWH߆o1؄'Cw0WZ>֫n'{g qa.-7 V|b(гQIqIN@i_Q+$ˮ>TPMusqml6.9G2ԍ, '{D9|Ts!b;S`C',G1"i 0_5!, @Z@Y *rPqHhRu4"Σ 5Qu @P6),)  *$ ) ('  !A;gsoap-2.8.28/gsoap/samples/webserver/bbr.gif0000444000175000017500000000075112653650156020313 0ustar ellertellertGIF89a OOOeeekkk>>>~~~gggPPPfff! AdobeGoLivexmQN0 ]8q;Hpj:!&!uHi<%x-^]I糕R[UJMK;&n~W=hkx":+$oAf똥lB|Kw0s a o߄,섃qg⨡2."\K[ / VJyPgS?⒞ t }=6' jx|z$`Qو ݴLgʐ䀟?s$S]ҡq2""^L(cWe p}gnﴄ!, 4`1N$& 1pFpPf[ \d2Lt(6 0;gsoap-2.8.28/gsoap/samples/webserver/cacert.pem0000644000175000017500000000242212653650156021022 0ustar ellertellert-----BEGIN CERTIFICATE----- MIIDkDCCAvmgAwIBAgIJANZ2BsVMtBtVMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYD VQQGEwJVUzELMAkGA1UECBMCRkwxFDASBgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYD VQQKEw1HZW5pdmlhLCBJbmMuMQswCQYDVQQLEwJJVDESMBAGA1UEAxMJbG9jYWxo b3N0MSIwIAYJKoZIhvcNAQkBFhNjb250YWN0QGdlbml2aWEuY29tMB4XDTE1MDgw NDE5MDEyMFoXDTE4MDgwMzE5MDEyMFowgY0xCzAJBgNVBAYTAlVTMQswCQYDVQQI EwJGTDEUMBIGA1UEBxMLVGFsbGFoYXNzZWUxFjAUBgNVBAoTDUdlbml2aWEsIElu Yy4xCzAJBgNVBAsTAklUMRIwEAYDVQQDEwlsb2NhbGhvc3QxIjAgBgkqhkiG9w0B CQEWE2NvbnRhY3RAZ2VuaXZpYS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJ AoGBALx/LiwGRi4wH8y0MEL64VJs5H2O1F4uuYO+aNVZHl5ULRDmSh/4eF8aOYXT B05PfVoctBogcK0ohPEhiUcR/029LQTkEs/5D7XsuRuQsUnMfkEihmC2VtEuJMqT OeXmuIcemEw0QL3ulny7H8W6Aq2rByC2r5iqytnM4Uuw7LMnAgMBAAGjgfUwgfIw HQYDVR0OBBYEFPjHgoC7fuLKD8eItzogWWMDKpTQMIHCBgNVHSMEgbowgbeAFPjH goC7fuLKD8eItzogWWMDKpTQoYGTpIGQMIGNMQswCQYDVQQGEwJVUzELMAkGA1UE CBMCRkwxFDASBgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYDVQQKEw1HZW5pdmlhLCBJ bmMuMQswCQYDVQQLEwJJVDESMBAGA1UEAxMJbG9jYWxob3N0MSIwIAYJKoZIhvcN AQkBFhNjb250YWN0QGdlbml2aWEuY29tggkA1nYGxUy0G1UwDAYDVR0TBAUwAwEB /zANBgkqhkiG9w0BAQUFAAOBgQB+fmbScGp3R4D0Sf4gbBJ/3CGEn4/HvupSikDq vyaviwJ2KQKGlAr/lDh1qSYItkazJpJDIxyG2Dzm2w0F0u1+CSwpym6eq1pxc8dh GRdrCVyuM0gUoBvxUym7o0Bq1V6onUjwrAti+onsZjDpfAIKBI8TRfjuTNzFeSAV G2zULg== -----END CERTIFICATE----- gsoap-2.8.28/gsoap/samples/webserver/ibrs.gif0000444000175000017500000000116512653650156020505 0ustar ellertellertGIF89a {{{zzzkkkiii䲲mmmѓpppȤ؆vvvgggfff܂uuulllhhhjjjwwwooosssnnn! AdobeGoLivexmQ]N0 ;EeِOMih;Ah6RO1#SFJdJK)5.혔MK%nl lc? b OR :\Qh kx^MN8w&ϏJ"\cXXO~!GϦB&%=9 nW>msHmމTPMz9m6N9G2ԍ, '>'WV ՜X/Xh QǮ4K׳`|cn~p!, @[Q"L  ! ɤ(#* DHbI H!i0D*Ò08"+  +,')(+qS*,, 'TA;gsoap-2.8.28/gsoap/samples/webserver/top.gif0000444000175000017500000000011512653650156020342 0ustar ellertellertGIF89a1dFdV,q:@@@,pD;gsoap-2.8.28/gsoap/samples/webserver/btr.gif0000444000175000017500000000075412653650156020340 0ustar ellertellertGIF89a SSSaaa~~~mmm!!!VVVkkk@@@RRR}}}www^^^```---ggg݇PPPfff! AdobeGoLivexmQj0 }l┱CaO%Jjpb:{}vCLҐB 6O?|~RҖIlѺd!ZR,yd[iXl}Mh~r.RHj밠(MȳN8&/j"8 b<7 %z6 J/(h-NOD OvevT6CB7;ՙ2$9zck8T&th꺴#j,b;Sb5D;Ur\ٴ[I!, 6 &btdhFlfd\Z/!1ͥB 0a/ H0Fd;gsoap-2.8.28/gsoap/samples/webserver/bb.gif0000444000175000017500000000056212653650156020131 0ustar ellertellertGIF89a PPPgggfff! AdobeGoLivexmQN0 .=Ee 鄘vm#p<n٪MjD?EQmE7rc7[~v6ޣ" A^!|i-2ׄN+qBlu:7!NhCZوOpxj  75JC)._S4p;Ёfg^h= <<>XNYل[ ݶLG)^$I:CeM@4Epi* b5|CLJ f$^_%}Yѿ5"-O@i<ĝ߄"T؆:hWy[b:MrAl5 yb@huꅾ;Q#!ej{Q5Gvʶ2z9q=PW66hNLjRI! m^Yb< EE>764'I!, @QɄ;gsoap-2.8.28/gsoap/samples/webserver/webserver.c0000644000175000017500000013446212653650156021240 0ustar ellertellert/* webserver.c Example stand-alone gSOAP Web server based on the gSOAP HTTP GET plugin. This is a small but fully functional (embedded) Web server for serving static and dynamic pages and SOAP/XML responses over HTTP/HTTPS. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2010, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL OR Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- The Web server handles HTTP GET requests to serve pages and HTTP POST reguests to handle SOAP/XML messages. This example only implements a simple calculator XML Web service for demonstration purposes (the service responds with SOAP/XML). HTTPS (SSL/TLS) connectivity is supported. However, some browsers do not allow self-signed certificates. The example certificate server.pem included here is self signed. You can import the cacert.pem certificate into the browser to validate the web server. This application requires Zlib and Pthreads (you can replace Pthreads with another thread library, but you need to study the OpenSSL thread changes in the OpenSSL documentation). On Unix/Linux, please enable SIGPIPE handling, see main function below. SIGPIPE handling will avoid your server from termination when sockets are disconnected by clients before the transaction was completed (aka broken pipe). Compile without OpenSSL: soapcpp2 -c -n -popt opt.h soapcpp2 -c webserver.h Customize your COOKIE_DOMAIN in this file gcc -DWITH_COOKIES -DWITH_ZLIB -o webserver webserver.c options.c plugin/httpget.c plugin/httpform.c plugin/logging.c stdsoap2.c soapC.c soapClient.c soapServer.c -lpthread -lz Compile with OpenSSL (also enables HTTP Digest Authentication): soapcpp2 -c -n -popt opt.h soapcpp2 -c webserver.h Customize your COOKIE_DOMAIN in this file gcc -DWITH_OPENSSL -DWITH_COOKIES -DWITH_ZLIB -o webserver webserver.c options.c plugin/httpget.c plugin/httpform.c plugin/logging.c plugin/threads.c plugin/httpda.c plugin/md5evp.c stdsoap2.c soapC.c soapClient.c soapServer.c -lpthread -lz -lssl -lcrypto Compile with GNUTLS: soapcpp2 -c -n -popt opt.h soapcpp2 -c webserver.h Customize your COOKIE_DOMAIN in this file gcc -DWITH_GNUTLS -DWITH_COOKIES -DWITH_ZLIB -o webserver webserver.c options.c plugin/httpget.c plugin/httpform.c plugin/logging.c stdsoap2.c soapC.c soapClient.c soapServer.c -lpthread -lz -lgnutls -lgcrypt Use (HTTP GET): Compile the web server as explained above Start the web server on an even numbered port (e.g. 8080): > webserver 8080 & Start a web browser and open a (localhost) location: http://127.0.0.1:8080 and type userid 'admin' and passwd 'guest' to gain access Open the location: http://127.0.0.1:8080/calc.html then enter an expression Open the locations: http://127.0.0.1:8080/test.html http://127.0.0.1:8081/webserver.wsdl Use (HTTPS GET): Create the SSL certificate (see samples/ssl README and scripts) Compile the web server with OpenSSL as explained above Start the web server on an odd numbered port (e.g. 8081) > webserver 8081 & Actually, you can start two servers, one on 8080 and a secure one on 8081 Start a web browser and open a (localhost) location: https://127.0.0.1:8081 and type userid 'admin' and passwd 'guest' to gain access Open the location: https://127.0.0.1:8081/calcform1.html and enter an expression to calculate Open the locations: https://127.0.0.1:8081/test.html https://127.0.0.1:8081/webserver.wsdl Use (HTTP POST): Serves SOAP/XML calculation requests Command-line options: -z enables compression -c enables chunking -k enables keep-alive -i enables non-threaded iterative server -v enables verbose mode -o pool of threads (cannot be used with option -i) Note: interactive chunking/keep-alive settings cannot be changed, unless the number of threads is interactively changed to restart the pool Note: =0 specifies unlimited threads -t sets I/O timeout value (seconds) -s sets server timeout value (seconds) -d sets cookie domain -p sets cookie path -l[none inbound outbound both] enables logging Requires options.h and options.c for command line option parsing and for parsing interactive Web page options settings. The default_options[] array defines application options, short-hands, selection lists, and default values. See options.h for more details. */ #include "soapH.h" #include "webserver.nsmap" /* namespaces updated 4/4/13 */ #include "options.h" #include "httpget.h" #include "httpform.h" #include "logging.h" #include "threads.h" #ifdef WITH_OPENSSL #include "httpda.h" /* optionally enable HTTP Digest Authentication */ #endif #include /* need SIGPIPE */ #define BACKLOG (100) #define AUTH_REALM "gSOAP Web Server Admin" #define AUTH_USERID "admin" /* user ID to access admin pages */ #define AUTH_PASSWD "guest" /* user pw to access admin pages */ /******************************************************************************\ * * Thread pool and request queue * \******************************************************************************/ #define MAX_THR (100) #define MAX_QUEUE (1000) static int poolsize = 0; static int queue[MAX_QUEUE]; static int head = 0, tail = 0; static MUTEX_TYPE queue_cs; static COND_TYPE queue_cv; /******************************************************************************\ * * Program options * \******************************************************************************/ /* The options.c module parses command line options, HTTP form options, and options stored in a config file. Options are defined as follows: */ static const struct option default_options[] = { /* "key.fullname", "unit or selection list", text field width, "default value" */ { "z.compress", NULL, }, { "c.chunking", NULL, }, { "k.keepalive", NULL, }, { "i.iterative", NULL, }, { "v.verbose", NULL, }, { "o.pool", "threads", 6, (char*)"none"}, { "t.ioTimeout", "seconds", 6, (char*)"5"}, { "s.serverTimeout", "seconds", 6, (char*)"3600"}, { "d.cookieDomain", "host", 20, (char*)"127.0.0.1"}, { "p.cookiePath", "path", 20, (char*)"/"}, { "l.logging", "none inbound outbound both", }, { "", "port", }, /* takes the rest of command line args */ { NULL }, /* must be NULL terminated */ }; /* The numbering of these defines must correspond to the option order above */ #define OPTION_z 0 #define OPTION_c 1 #define OPTION_k 2 #define OPTION_i 3 #define OPTION_v 4 #define OPTION_o 5 #define OPTION_t 6 #define OPTION_s 7 #define OPTION_d 8 #define OPTION_p 9 #define OPTION_l 10 #define OPTION_port 11 /******************************************************************************\ * * Static * \******************************************************************************/ static struct option *options = NULL; static time_t start; static int secure = 0; /* =0: no SSL, =1: support SSL */ static const char *minutes[60] = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" }; static const char *hours[24] = {"00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23"}; /******************************************************************************\ * * Forward decls * \******************************************************************************/ void server_loop(struct soap*); void *process_request(void*); /* multi-threaded request handler */ void *process_queue(void*); /* multi-threaded request handler for pool */ int enqueue(SOAP_SOCKET); SOAP_SOCKET dequeue(); int http_get_handler(struct soap*); /* HTTP get handler */ int http_form_handler(struct soap*); /* HTTP form handler */ int check_authentication(struct soap*); /* HTTP authentication check */ int copy_file(struct soap*, const char*, const char*); /* copy file as HTTP response */ int calcget(struct soap*); int calcpost(struct soap*); int info(struct soap*); int html_hbar(struct soap*, const char*, size_t, size_t, unsigned long); int html_hist(struct soap*, const char*, size_t, size_t, size_t, const char**, size_t*, size_t); void sigpipe_handle(int); /* SIGPIPE handler: Unix/Linux only */ int CRYPTO_thread_setup(); void CRYPTO_thread_cleanup(); /******************************************************************************\ * * Main * \******************************************************************************/ int main(int argc, char **argv) { struct soap soap; SOAP_SOCKET master; int port = 0; start = time(NULL); options = copy_options(default_options); /* must copy, so option values can be modified */ if (parse_options(argc, argv, options)) exit(0); if (options[OPTION_port].value) port = atol(options[OPTION_port].value); if (!port) port = 8080; fprintf(stderr, "Starting Web server on port %d\n", port); /* if the port is an odd number, the Web server uses HTTPS only */ if (port % 2) secure = 1; if (secure) fprintf(stderr, "[Note: https://127.0.0.1:%d/test.html to test the server from browser]\n", port); else fprintf(stderr, "[Note: http://127.0.0.1:%d/test.html to test the server from browser]\n", port); fprintf(stderr, "[Note: http://127.0.0.1:%d for settings, login: '"AUTH_USERID"' and '"AUTH_PASSWD"']\n", port); fprintf(stderr, "[Note: you should enable Linux/Unix SIGPIPE handlers to avoid broken pipe]\n"); soap_init2(&soap, SOAP_IO_KEEPALIVE, SOAP_IO_DEFAULT); if (CRYPTO_thread_setup()) { fprintf(stderr, "Cannot setup thread mutex\n"); exit(1); } #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) /* The supplied server certificate "server.pem" assumes that the server is running on 'localhost', so clients can only connect from the same host when verifying the server's certificate. To verify the certificates of third-party services, they must provide a certificate issued by Verisign or another trusted CA. At the client-side, the capath parameter should point to a directory that contains these trusted (root) certificates or the cafile parameter should refer to one file will all certificates. To help you out, the supplied "cacerts.pem" file contains the certificates issued by various CAs. You should use this file for the cafile parameter instead of "cacert.pem" to connect to trusted servers. Note that the client may fail to connect if the server's credentials have problems (e.g. expired). Note 1: the password and capath are not used with GNUTLS Note 2: setting capath may not work on Windows. */ if (secure && soap_ssl_server_context(&soap, SOAP_SSL_DEFAULT, "server.pem", /* keyfile: see SSL docs on how to obtain this file */ "password", /* password to read the key file */ NULL, /* cacert CA certificate, or ... */ NULL, /* capath CA certificate path */ NULL, /* DH file (e.g. "dh2048.pem") or numeric DH param key len bits in string (e.g. "2048"), if NULL then use RSA */ NULL, /* if randfile!=NULL: use a file with random data to seed randomness */ "webserver" /* server identification for SSL session cache (must be a unique name) */ )) { soap_print_fault(&soap, stderr); exit(1); } #endif /* Register HTTP GET plugin */ if (soap_register_plugin_arg(&soap, http_get, (void*)http_get_handler)) soap_print_fault(&soap, stderr); /* Register HTTP POST plugin */ if (soap_register_plugin_arg(&soap, http_form, (void*)http_form_handler)) soap_print_fault(&soap, stderr); /* Register logging plugin */ if (soap_register_plugin(&soap, logging)) soap_print_fault(&soap, stderr); #ifdef HTTPDA_H /* Register HTTP Digest Authentication plugin */ if (soap_register_plugin(&soap, http_da)) soap_print_fault(&soap, stderr); #endif /* Unix SIGPIPE, this is OS dependent (win does not need this) */ /* soap.accept_flags = SO_NOSIGPIPE; */ /* some systems like this */ /* soap.socket_flags = MSG_NOSIGNAL; */ /* others need this */ /* signal(SIGPIPE, sigpipe_handle); */ /* and some older Unix systems may require a sigpipe handler */ master = soap_bind(&soap, NULL, port, BACKLOG); if (!soap_valid_socket(master)) { soap_print_fault(&soap, stderr); exit(1); } fprintf(stderr, "Port bind successful: master socket = %d\n", master); MUTEX_SETUP(queue_cs); COND_SETUP(queue_cv); server_loop(&soap); COND_CLEANUP(queue_cv); MUTEX_CLEANUP(queue_cs); free_options(options); soap_end(&soap); soap_done(&soap); CRYPTO_thread_cleanup(); THREAD_EXIT; return 0; } void server_loop(struct soap *soap) { struct soap *soap_thr[MAX_THR]; THREAD_TYPE tid, tids[MAX_THR]; int req; for (req = 1; ; req++) { SOAP_SOCKET sock; int newpoolsize; soap->cookie_domain = options[OPTION_d].value; soap->cookie_path = options[OPTION_p].value; soap_set_cookie(soap, "visit", "true", NULL, NULL); soap_set_cookie_expire(soap, "visit", 600, NULL, NULL); if (options[OPTION_c].selected) soap_set_omode(soap, SOAP_IO_CHUNK); /* use chunked HTTP content (fast) */ if (options[OPTION_k].selected) soap_set_omode(soap, SOAP_IO_KEEPALIVE); if (options[OPTION_t].value) soap->send_timeout = soap->recv_timeout = atol(options[OPTION_t].value); if (options[OPTION_s].value) soap->accept_timeout = atol(options[OPTION_s].value); if (options[OPTION_l].selected == 1 || options[OPTION_l].selected == 3) soap_set_logging_inbound(soap, stdout); else soap_set_logging_inbound(soap, NULL); if (options[OPTION_l].selected == 2 || options[OPTION_l].selected == 3) soap_set_logging_outbound(soap, stdout); else soap_set_logging_outbound(soap, NULL); newpoolsize = atol(options[OPTION_o].value); if (newpoolsize < 0) newpoolsize = 0; else if (newpoolsize > MAX_THR) newpoolsize = MAX_THR; if (poolsize > newpoolsize) { int job; for (job = 0; job < poolsize; job++) { while (enqueue(SOAP_INVALID_SOCKET) == SOAP_EOM) sleep(1); } for (job = 0; job < poolsize; job++) { fprintf(stderr, "Waiting for thread %d to terminate...\n", job); THREAD_JOIN(tids[job]); fprintf(stderr, "Thread %d has stopped\n", job); soap_done(soap_thr[job]); free(soap_thr[job]); } poolsize = 0; } if (poolsize < newpoolsize) { int job; for (job = poolsize; job < newpoolsize; job++) { soap_thr[job] = soap_copy(soap); if (!soap_thr[job]) break; soap_thr[job]->user = (void*)(long)job; /* int to ptr */ fprintf(stderr, "Starting thread %d\n", job); THREAD_CREATE(&tids[job], (void*(*)(void*))process_queue, (void*)soap_thr[job]); } poolsize = job; } /* to control the close behavior and wait states, use the following: soap->accept_flags |= SO_LINGER; soap->linger_time = 60; */ /* the time resolution of linger_time is system dependent, though according * to some experts only zero and nonzero values matter. */ sock = soap_accept(soap); if (!soap_valid_socket(sock)) { if (soap->errnum) { soap_print_fault(soap, stderr); fprintf(stderr, "Retry...\n"); continue; } fprintf(stderr, "gSOAP Web server timed out\n"); break; } if (options[OPTION_v].selected) fprintf(stderr, "Request #%d accepted on socket %d connected from IP %d.%d.%d.%d\n", req, sock, (int)(soap->ip>>24)&0xFF, (int)(soap->ip>>16)&0xFF, (int)(soap->ip>>8)&0xFF, (int)soap->ip&0xFF); if (poolsize > 0) { while (enqueue(sock) == SOAP_EOM) sleep(1); } else { struct soap *tsoap = NULL; if (!options[OPTION_i].selected) tsoap = soap_copy(soap); if (tsoap) { tsoap->user = (void*)(long)req; THREAD_CREATE(&tid, (void*(*)(void*))process_request, (void*)tsoap); } else { #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) if (secure && soap_ssl_accept(soap)) { soap_print_fault(soap, stderr); fprintf(stderr, "SSL request failed, continue with next call...\n"); soap_end(soap); continue; } #endif /* Keep-alive: frequent EOF faults occur related to KA-timeouts: timeout: soap->error == SOAP_EOF && soap->errnum == 0 error: soap->error != SOAP_OK */ if (soap_serve(soap) && (soap->error != SOAP_EOF || (soap->errnum != 0 && !(soap->omode & SOAP_IO_KEEPALIVE)))) { fprintf(stderr, "Request #%d completed with failure %d\n", req, soap->error); soap_print_fault(soap, stderr); } else if (options[OPTION_v].selected) fprintf(stderr, "Request #%d completed\n", req); soap_destroy(soap); soap_end(soap); } } } if (poolsize > 0) { int job; for (job = 0; job < poolsize; job++) { while (enqueue(SOAP_INVALID_SOCKET) == SOAP_EOM) sleep(1); } for (job = 0; job < poolsize; job++) { fprintf(stderr, "Waiting for thread %d to terminate... ", job); THREAD_JOIN(tids[job]); fprintf(stderr, "terminated\n"); soap_free(soap_thr[job]); } } } /******************************************************************************\ * * Process dispatcher * \******************************************************************************/ void *process_request(void *soap) { struct soap *tsoap = (struct soap*)soap; THREAD_DETACH(THREAD_ID); #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) if (secure && soap_ssl_accept(tsoap)) { soap_print_fault(tsoap, stderr); fprintf(stderr, "SSL request failed, continue with next call...\n"); soap_destroy(tsoap); soap_end(tsoap); soap_done(tsoap); free(tsoap); return NULL; } #endif if (soap_serve(tsoap) && (tsoap->error != SOAP_EOF || (tsoap->errnum != 0 && !(tsoap->omode & SOAP_IO_KEEPALIVE)))) { fprintf(stderr, "Thread %d completed with failure %d\n", (int)(long)tsoap->user, tsoap->error); soap_print_fault(tsoap, stderr); } else if (options[OPTION_v].selected) fprintf(stderr, "Thread %d completed\n", (int)(long)tsoap->user); soap_destroy(tsoap); soap_end(tsoap); soap_done(tsoap); free(soap); return NULL; } /******************************************************************************\ * * Thread pool (enabled with option -o) * \******************************************************************************/ void *process_queue(void *soap) { struct soap *tsoap = (struct soap*)soap; for (;;) { tsoap->socket = dequeue(); if (!soap_valid_socket(tsoap->socket)) { if (options[OPTION_v].selected) fprintf(stderr, "Thread %d terminating\n", (int)(long)tsoap->user); break; } #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) if (secure && soap_ssl_accept(tsoap)) { soap_print_fault(tsoap, stderr); fprintf(stderr, "SSL request failed, continue with next call...\n"); soap_destroy(tsoap); soap_end(tsoap); continue; } #endif if (options[OPTION_v].selected) fprintf(stderr, "Thread %d accepted a request\n", (int)(long)tsoap->user); if (soap_serve(tsoap) && (tsoap->error != SOAP_EOF || (tsoap->errnum != 0 && !(tsoap->omode & SOAP_IO_KEEPALIVE)))) { fprintf(stderr, "Thread %d finished serving request with failure %d\n", (int)(long)tsoap->user, tsoap->error); soap_print_fault(tsoap, stderr); } else if (options[OPTION_v].selected) fprintf(stderr, "Thread %d finished serving request\n", (int)(long)tsoap->user); soap_destroy(tsoap); soap_end(tsoap); } soap_destroy(tsoap); soap_end(tsoap); soap_done(tsoap); return NULL; } int enqueue(SOAP_SOCKET sock) { int status = SOAP_OK; int next; int ret; if ((ret = MUTEX_LOCK(queue_cs))) fprintf(stderr, "MUTEX_LOCK error %d\n", ret); next = (tail + 1) % MAX_QUEUE; if (head == next) { /* don't block on full queue, return SOAP_EOM */ status = SOAP_EOM; } else { queue[tail] = sock; tail = next; if (options[OPTION_v].selected) fprintf(stderr, "enqueue(%d)\n", sock); if ((ret = COND_SIGNAL(queue_cv))) fprintf(stderr, "COND_SIGNAL error %d\n", ret); } if ((ret = MUTEX_UNLOCK(queue_cs))) fprintf(stderr, "MUTEX_UNLOCK error %d\n", ret); return status; } SOAP_SOCKET dequeue() { SOAP_SOCKET sock; int ret; if ((ret = MUTEX_LOCK(queue_cs))) fprintf(stderr, "MUTEX_LOCK error %d\n", ret); while (head == tail) if ((ret = COND_WAIT(queue_cv, queue_cs))) fprintf(stderr, "COND_WAIT error %d\n", ret); sock = queue[head]; head = (head + 1) % MAX_QUEUE; if (options[OPTION_v].selected) fprintf(stderr, "dequeue(%d)\n", sock); if ((ret = MUTEX_UNLOCK(queue_cs))) fprintf(stderr, "MUTEX_UNLOCK error %d\n", ret); return sock; } /******************************************************************************\ * * SOAP/XML handling: calculator example * \******************************************************************************/ int ns__add(struct soap *soap, double a, double b, double *c) { *c = a + b; return SOAP_OK; } int ns__sub(struct soap *soap, double a, double b, double *c) { *c = a - b; return SOAP_OK; } int ns__mul(struct soap *soap, double a, double b, double *c) { *c = a * b; return SOAP_OK; } int ns__div(struct soap *soap, double a, double b, double *c) { *c = a / b; return SOAP_OK; } /******************************************************************************\ * * Server dummy methods to avoid link errors * \******************************************************************************/ int ns__addResponse_(struct soap *soap, double a) { return SOAP_NO_METHOD; /* we don't use this: we use soap_send_ns__addResponse instead */ } int ns__subResponse_(struct soap *soap, double a) { return SOAP_NO_METHOD; /* we don't use this: we use soap_send_ns__subResponse instead */ } int ns__mulResponse_(struct soap *soap, double a) { return SOAP_NO_METHOD; /* we don't use this: we use soap_send_ns__mulResponse instead */ } int ns__divResponse_(struct soap *soap, double a) { return SOAP_NO_METHOD; /* we don't use this: we use soap_send_ns__divResponse instead */ } /******************************************************************************\ * * HTTP GET handler for plugin * \******************************************************************************/ int http_get_handler(struct soap *soap) { /* gSOAP >=2.5 soap_response() will do this automatically for us, when sending SOAP_HTML or SOAP_FILE: if ((soap->omode & SOAP_IO) != SOAP_IO_CHUNK) soap_set_omode(soap, SOAP_IO_STORE); */ /* if not chunking we MUST buffer entire content when returning HTML pages to determine content length */ #ifdef WITH_ZLIB if (options[OPTION_z].selected && soap->zlib_out == SOAP_ZLIB_GZIP) /* client accepts gzip */ { soap_set_omode(soap, SOAP_ENC_ZLIB); /* so we can compress content (gzip) */ soap->z_level = 9; /* best compression */ } else soap_clr_omode(soap, SOAP_ENC_ZLIB); /* so we can compress content (gzip) */ #endif /* Use soap->path (from request URL) to determine request: */ if (options[OPTION_v].selected) fprintf(stderr, "HTTP GET Request '%s' to host '%s' path '%s'\n", soap->endpoint, soap->host, soap->path); /* Note: soap->path always starts with '/' */ if (strchr(soap->path + 1, '/') || strchr(soap->path + 1, '\\')) /* we don't like snooping in dirs */ return 403; /* HTTP forbidden */ if (!soap_tag_cmp(soap->path, "*.html")) return copy_file(soap, soap->path + 1, "text/html"); if (!soap_tag_cmp(soap->path, "*.xml")) return copy_file(soap, soap->path + 1, "text/xml"); if (!soap_tag_cmp(soap->path, "*.jpg")) return copy_file(soap, soap->path + 1, "image/jpeg"); if (!soap_tag_cmp(soap->path, "*.gif")) return copy_file(soap, soap->path + 1, "image/gif"); if (!soap_tag_cmp(soap->path, "*.png")) return copy_file(soap, soap->path + 1, "image/png"); if (!soap_tag_cmp(soap->path, "*.ico")) return copy_file(soap, soap->path + 1, "image/ico"); if (!strncmp(soap->path, "/calc?", 6)) return calcget(soap); if (!strncmp(soap->path, "/genivia", 8)) { (SOAP_SNPRINTF(soap->endpoint, sizeof(soap->endpoint), strlen(soap->path) + 10), "http://genivia.com%s", soap->path + 8); /* redirect */ return 307; /* Temporary Redirect */ } /* Check requestor's authentication: */ if (check_authentication(soap)) return 401; /* HTTP not authorized */ /* For example, we can put WSDL and XSD files behind authentication wall */ if (!soap_tag_cmp(soap->path, "*.xsd") || !soap_tag_cmp(soap->path, "*.wsdl")) return copy_file(soap, soap->path + 1, "text/xml"); /* Return Web server status */ if (soap->path[1] == '\0' || soap->path[1] == '?') return info(soap); return 404; /* HTTP not found */ } int check_authentication(struct soap *soap) { if (soap->userid && soap->passwd) { if (!strcmp(soap->userid, AUTH_USERID) && !strcmp(soap->passwd, AUTH_PASSWD)) return SOAP_OK; } #ifdef HTTPDA_H else if (soap->authrealm && soap->userid) { if (!strcmp(soap->authrealm, AUTH_REALM) && !strcmp(soap->userid, AUTH_USERID)) if (!http_da_verify_get(soap, (char*)AUTH_PASSWD)) return SOAP_OK; } #endif soap->authrealm = AUTH_REALM; return 401; } /******************************************************************************\ * * HTTP POST application/x-www-form-urlencoded handler for plugin * \******************************************************************************/ int http_form_handler(struct soap *soap) { #ifdef WITH_ZLIB if (options[OPTION_z].selected && soap->zlib_out == SOAP_ZLIB_GZIP) /* client accepts gzip */ soap_set_omode(soap, SOAP_ENC_ZLIB); /* so we can compress content (gzip) */ soap->z_level = 9; /* best compression */ #endif /* Use soap->path (from request URL) to determine request: */ if (options[OPTION_v].selected) fprintf(stderr, "HTTP POST Request: %s\n", soap->endpoint); /* Note: soap->path always starts with '/' */ if (!strcmp(soap->path, "/calc")) return calcpost(soap); return 404; /* HTTP not found */ } /******************************************************************************\ * * Copy static page * \******************************************************************************/ int copy_file(struct soap *soap, const char *name, const char *type) { FILE *fd; size_t r; fd = fopen(name, "rb"); /* open file to copy */ if (!fd) return 404; /* return HTTP not found */ soap->http_content = type; if (soap_response(soap, SOAP_FILE)) /* OK HTTP response header */ { soap_end_send(soap); fclose(fd); return soap->error; } for (;;) { r = fread(soap->tmpbuf, 1, sizeof(soap->tmpbuf), fd); if (!r) break; if (soap_send_raw(soap, soap->tmpbuf, r)) { soap_end_send(soap); fclose(fd); return soap->error; } } fclose(fd); return soap_end_send(soap); } /******************************************************************************\ * * Example dynamic HTTP GET application/x-www-form-urlencoded calculator * \******************************************************************************/ int calcget(struct soap *soap) { int o = 0, a = 0, b = 0, val; char buf[256]; char *s = query(soap); /* get argument string from URL ?query string */ while (s) { char *key = query_key(soap, &s); /* decode next query string key */ char *val = query_val(soap, &s); /* decode next query string value (if any) */ if (key && val) { if (!strcmp(key, "o")) o = val[0]; else if (!strcmp(key, "a")) a = strtol(val, NULL, 10); else if (!strcmp(key, "b")) b = strtol(val, NULL, 10); } } switch (o) { case 'a': val = a + b; break; case 's': val = a - b; break; case 'm': val = a * b; break; case 'd': val = a / b; break; default: return soap_sender_fault(soap, "Unknown operation", NULL); } soap_response(soap, SOAP_HTML); (SOAP_SNPRINTF(buf, sizeof(buf), 40), "value=%d", val); soap_send(soap, buf); soap_end_send(soap); return SOAP_OK; } /******************************************************************************\ * * Example dynamic HTTP POST application/x-www-form-urlencoded calculator * \******************************************************************************/ int calcpost(struct soap *soap) { int o = 0, a = 0, b = 0, val; char buf[256]; char *s = form(soap); /* get form data from body */ while (s) { char *key = query_key(soap, &s); /* decode next key */ char *val = query_val(soap, &s); /* decode next value (if any) */ if (key && val) { if (!strcmp(key, "o")) o = val[0]; else if (!strcmp(key, "a")) a = strtol(val, NULL, 10); else if (!strcmp(key, "b")) b = strtol(val, NULL, 10); } } switch (o) { case 'a': val = a + b; break; case 's': val = a - b; break; case 'm': val = a * b; break; case 'd': val = a / b; break; default: return soap_sender_fault(soap, "Unknown operation", NULL); } soap_response(soap, SOAP_HTML); (SOAP_SNPRINTF(buf, sizeof(buf), 40), "value=%d", val); soap_send(soap, buf); soap_end_send(soap); return SOAP_OK; } /******************************************************************************\ * * Example dynamic HTTP POST multipart/form-data form-based calculator * \******************************************************************************/ int f__form1(struct soap *soap) { int o = 0, a = 0, b = 0, val; char buf[256]; struct soap_multipart *content; for (content = soap->mime.list; content; content = content->next) { if (content->id && content->ptr) { /* may have to check content->encoding to convert data when necessary! */ if (!strcmp(content->id, "o")) o = content->ptr[0]; else if (!strcmp(content->id, "a")) a = strtol(content->ptr, NULL, 10); else if (!strcmp(content->id, "b")) b = strtol(content->ptr, NULL, 10); } } switch (o) { case 'a': val = a + b; break; case 's': val = a - b; break; case 'm': val = a * b; break; case 'd': val = a / b; break; default: return soap_sender_fault(soap, "Unknown operation", NULL); } soap_response(soap, SOAP_HTML); (SOAP_SNPRINTF(buf, sizeof(buf), 40), "value=%d", val); soap_send(soap, buf); soap_end_send(soap); return SOAP_OK; } int f__form2(struct soap *soap, struct f__formResponse *response) { int o = 0, a = 0, b = 0; struct soap_multipart *content; for (content = soap->mime.list; content; content = content->next) { if (content->id && content->ptr) { /* may have to check content->encoding to convert data when necessary! */ if (!strcmp(content->id, "o")) o = content->ptr[0]; else if (!strcmp(content->id, "a")) a = strtol(content->ptr, NULL, 10); else if (!strcmp(content->id, "b")) b = strtol(content->ptr, NULL, 10); } } switch (o) { case 'a': response->result = a + b; break; case 's': response->result = a - b; break; case 'm': response->result = a * b; break; case 'd': response->result = a / b; break; default: return soap_sender_fault(soap, "Unknown operation", NULL); } return SOAP_OK; } /******************************************************************************\ * * Dynamic Web server info page * \******************************************************************************/ int info(struct soap *soap) { struct http_get_data *getdata; size_t stat_sent, stat_recv; const char *t0, *t1, *t2, *t3, *t4, *t5, *t6, *t7; char buf[4096]; /* buffer large enough to hold parts of HTML content */ struct soap_plugin *p; time_t now = time(NULL), elapsed = now - start; query_options(soap, options); if (soap->omode & SOAP_IO_KEEPALIVE) t0 = "YES"; else t0 = "NO"; #ifdef WITH_COOKIES t1 = "YES"; /* soap_env_cookie_value() returns value of a cookie received (from client) */ if (soap_env_cookie_value(soap, "visit", NULL, NULL)) t2 = "PASS"; else t2 = "WAIT"; #else t1 = "NO"; t2 = "N/A"; #endif if (secure) { t3 = "YES"; if (soap->imode & SOAP_ENC_SSL) t4 = "PASS"; else t4 = "FAIL"; } else { t3 = "NO"; t4 = "N/A"; } #ifdef WITH_ZLIB if (options[OPTION_z].selected) { t5 = "YES"; if (soap->omode & SOAP_ENC_ZLIB) t6 = "PASS"; else t6 = "WAIT"; } else { t5 = "NO"; t6 = "N/A"; } #else t5 = "NO"; t6 = "N/A"; #endif if (options[OPTION_c].selected || (soap->omode & SOAP_IO) == SOAP_IO_CHUNK) t7 = "YES"; else t7 = "NO"; if (soap_response(soap, SOAP_HTML)) return soap->error; (SOAP_SNPRINTF(buf, sizeof(buf), 4095), "\ \ \ \ \ \ \ gSOAP Web Server Administration\ \ \

gSOAP Web Server Administration

\

Server endpoint=%s client agent IP=%d.%d.%d.%d\

Registered Plugins

\ ", soap->endpoint, (int)(soap->ip>>24)&0xFF, (int)(soap->ip>>16)&0xFF, (int)(soap->ip>>8)&0xFF, (int)soap->ip&0xFF); if (soap_send(soap, buf)) return soap->error; for (p = soap->plugins; p; p = p->next) { if (soap_send(soap, p->id) || soap_send(soap, "
")) return soap->error; } if (soap_send(soap, "

Elapsed Time

")) return soap->error; if (elapsed >= 86400) html_hbar(soap, "Days:", 100, elapsed/86400, 0x000000); if (elapsed >= 3600) html_hbar(soap, "Hours:", 100, elapsed/3600%24, 0x000000); html_hbar(soap, "Minutes:", 100, elapsed/60%60, 0x000000); soap_send(soap, "

Control Panel

"); if (html_form_options(soap, options)) return soap->error; (SOAP_SNPRINTF(buf, sizeof(buf), 4095), "\

Function Tests

\ \ \ \ %s\ %s\ %s\ %s\ %s\ %s\ %s\ %s\ \
FunctionResult
HTTP operationalYES
HTTP keep alive enabled
HTTP cookies enabled
HTTP cookies test
HTTPS (OpenSSL) enabled
HTTPS (OpenSSL) test
HTTP compression enabled
HTTP compression test
HTTP chunking enabled
", t0, t1, t2, t3, t4, t5, t6, t7); if (soap_send(soap, buf)) return soap->error; getdata = (struct http_get_data*)soap_lookup_plugin(soap, http_get_id); soap_get_logging_stats(soap, &stat_sent, &stat_recv); soap_send(soap, "

Usage Statistics

"); if (getdata) { html_hbar(soap, "HTTP GET", 120, getdata->stat_get, 0x0000FF); html_hbar(soap, "HTTP POST", 120, getdata->stat_post, 0x00FF00); html_hbar(soap, "HTTP FAIL", 120, getdata->stat_fail, 0xFF0000); } html_hbar(soap, "SENT(kB)", 120, stat_sent/1024, 0x00FFFF); html_hbar(soap, "RECV(kB)", 120, stat_recv/1024, 0x00FFFF); if (elapsed > 0) { html_hbar(soap, "SENT(kB/s)", 120, stat_sent/elapsed/1024, 0x00FFFF); html_hbar(soap, "RECV(kB/s)", 120, stat_recv/elapsed/1024, 0x00FFFF); } if (getdata) { struct tm T; T.tm_min = 99; T.tm_hour = 99; T.tm_yday = 999; #ifdef HAVE_LOCALTIME_R localtime_r(&now, &T); #else T = *localtime(&now); #endif soap_send(soap, "

Requests by the Minute

"); html_hist(soap, "Minute", 12, 0, 60, minutes, getdata->min, T.tm_min); soap_send(soap, "

Requests by the Hour

"); html_hist(soap, "Hour", 30, 0, 24, hours, getdata->hour, T.tm_hour); soap_send(soap, "

Requests by Day of the Year

"); html_hist(soap, "Day", 2, 0, 365, NULL, getdata->day, T.tm_yday); } soap_send(soap, "\

This page will automatically reload every minute to refresh the statistics.\


Powered by gSOAP\ \ "); return soap_end_send(soap); } static size_t html_scaled(char *buf, size_t max, size_t len) { if (len > 1000000) { (SOAP_SNPRINTF(buf, max, 39), "%.2f·106", (float)len/1000000.0); return len / 1000000; } if (len > 1000) { (SOAP_SNPRINTF(buf, max, 39), "%.2f·103", (float)len/1000.0); return len / 1000; } (SOAP_SNPRINTF(buf, max, 20), "%lu", (unsigned long)len); return len; } int html_hbar(struct soap *soap, const char *title, size_t pix, size_t len, unsigned long color) { char buf[4096]; /* buffer large enough to hold parts of HTML content */ char lab[40]; len = html_scaled(lab, sizeof(lab), len); (SOAP_SNPRINTF(buf, sizeof(buf), 4095), "\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \
%s %s
", (unsigned long)pix, title && strlen(title) < 80 ? title : "", lab, color, (unsigned long)len * 2); return soap_send(soap, buf); } int html_hist(struct soap *soap, const char *title, size_t barwidth, size_t height, size_t num, const char **key, size_t *val, size_t highlight) { char buf[4096]; /* buffer large enough to hold HTML content */ char lab[40]; size_t i, max; float scale; max = 0; for (i = 0; i < num; i++) { if (val[i] > max) max = val[i]; } if (height < 20) { height = max; if (height < 20) height = 20; else if (height > 256) height = 256; } scale = (float)height / (float)max; html_scaled(lab, sizeof(lab), max); (SOAP_SNPRINTF(buf, sizeof(buf), 4095), "\ \ \ \ \ \ \ \ ", title && strlen(title) < 80 ? title : "", (unsigned long)height + 50, (unsigned long)num + 1, (unsigned long)height, (unsigned long)height, lab); if (soap_send(soap, buf)) return soap->error; for (i = 0; i < num; i++) { unsigned long bar = (scale * val[i] + 0.5); if (bar >= 1) (SOAP_SNPRINTF(buf, sizeof(buf), 4095), "\ ", (unsigned long)i, title && strlen(title) < 80 ? title : "", (unsigned long)barwidth, (unsigned long)barwidth, bar - 1); else (SOAP_SNPRINTF(buf, sizeof(buf), 4095), "\ ", (unsigned long)barwidth); if (soap_send(soap, buf)) return soap->error; } (SOAP_SNPRINTF(buf, sizeof(buf), 4095), "\ \ \ \ \ \ ", (unsigned long)height, (unsigned long)height, title && strlen(title) < 80 ? title : ""); if (soap_send(soap, buf)) return soap->error; for (i = 0; i < num; i++) { (SOAP_SNPRINTF(buf, sizeof(buf), 4095), "%s", (i == highlight) ? " bgcolor='#777777'" : "", key ? key[i] : ""); if (soap_send(soap, buf)) return soap->error; } if (soap_send(soap, "\ \ ")) return soap->error; (SOAP_SNPRINTF(buf, sizeof(buf), 4095), "\ \ \ \ \ \ \ \ \ \
%s
%s
", (unsigned long)num + 1, (unsigned long)num + 2); return soap_send(soap, buf); } /******************************************************************************\ * * OpenSSL * \******************************************************************************/ #ifdef WITH_OPENSSL struct CRYPTO_dynlock_value { MUTEX_TYPE mutex; }; static MUTEX_TYPE *mutex_buf; static struct CRYPTO_dynlock_value *dyn_create_function(const char *file, int line) { struct CRYPTO_dynlock_value *value; value = (struct CRYPTO_dynlock_value*)malloc(sizeof(struct CRYPTO_dynlock_value)); if (value) MUTEX_SETUP(value->mutex); return value; } static void dyn_lock_function(int mode, struct CRYPTO_dynlock_value *l, const char *file, int line) { if (mode & CRYPTO_LOCK) MUTEX_LOCK(l->mutex); else MUTEX_UNLOCK(l->mutex); } static void dyn_destroy_function(struct CRYPTO_dynlock_value *l, const char *file, int line) { MUTEX_CLEANUP(l->mutex); free(l); } void locking_function(int mode, int n, const char *file, int line) { if (mode & CRYPTO_LOCK) MUTEX_LOCK(mutex_buf[n]); else MUTEX_UNLOCK(mutex_buf[n]); } unsigned long id_function() { return (unsigned long)THREAD_ID; } int CRYPTO_thread_setup() { int i; mutex_buf = (MUTEX_TYPE*)malloc(CRYPTO_num_locks() * sizeof(MUTEX_TYPE)); if (!mutex_buf) return SOAP_EOM; for (i = 0; i < CRYPTO_num_locks(); i++) MUTEX_SETUP(mutex_buf[i]); CRYPTO_set_id_callback(id_function); CRYPTO_set_locking_callback(locking_function); CRYPTO_set_dynlock_create_callback(dyn_create_function); CRYPTO_set_dynlock_lock_callback(dyn_lock_function); CRYPTO_set_dynlock_destroy_callback(dyn_destroy_function); return SOAP_OK; } void CRYPTO_thread_cleanup() { int i; if (!mutex_buf) return; CRYPTO_set_id_callback(NULL); CRYPTO_set_locking_callback(NULL); CRYPTO_set_dynlock_create_callback(NULL); CRYPTO_set_dynlock_lock_callback(NULL); CRYPTO_set_dynlock_destroy_callback(NULL); for (i = 0; i < CRYPTO_num_locks(); i++) MUTEX_CLEANUP(mutex_buf[i]); free(mutex_buf); mutex_buf = NULL; } #else /* OpenSSL not used */ int CRYPTO_thread_setup() { return SOAP_OK; } void CRYPTO_thread_cleanup() { } #endif /******************************************************************************\ * * SIGPIPE * \******************************************************************************/ void sigpipe_handle(int x) { } gsoap-2.8.28/gsoap/samples/calc_xcode/0000755000175000017500000000000012653650154017134 5ustar ellertellertgsoap-2.8.28/gsoap/samples/calc_xcode/soapStub.h0000644000175000017500000002756612653650154021125 0ustar ellertellert/* soapStub.h Generated by gSOAP 2.8.28 from calc.h gSOAP XML Web services tools Copyright (C) 2000-2016, Robert van Engelen, Genivia Inc. All Rights Reserved. The soapcpp2 tool and its generated software are released under the GPL. This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #ifndef soapStub_H #define soapStub_H #include "stdsoap2.h" #if GSOAP_VERSION != 20828 # error "GSOAP VERSION 20828 MISMATCH IN GENERATED CODE VERSUS LIBRARY CODE: PLEASE REINSTALL PACKAGE" #endif /******************************************************************************\ * * * Enumerations * * * \******************************************************************************/ /******************************************************************************\ * * * Types with Custom Serializers * * * \******************************************************************************/ /******************************************************************************\ * * * Classes, Structs, and Unions * * * \******************************************************************************/ struct ns__addResponse; /* calc.h:97 */ struct ns__add; /* calc.h:97 */ struct ns__subResponse; /* calc.h:100 */ struct ns__sub; /* calc.h:100 */ struct ns__mulResponse; /* calc.h:103 */ struct ns__mul; /* calc.h:103 */ struct ns__divResponse; /* calc.h:106 */ struct ns__div; /* calc.h:106 */ struct ns__powResponse; /* calc.h:109 */ struct ns__pow; /* calc.h:109 */ /* calc.h:97 */ #ifndef SOAP_TYPE_ns__addResponse #define SOAP_TYPE_ns__addResponse (10) /* ns:addResponse complex type: */ struct ns__addResponse { public: double *result; /* SOAP 1.2 RPC return element (when namespace qualified) */ /* optional element of XSD type xsd:double */ public: int soap_type() const { return 10; } /* = unique type id SOAP_TYPE_ns__addResponse */ ns__addResponse(); friend SOAP_FMAC1 ns__addResponse * SOAP_FMAC2 soap_instantiate_ns__addResponse(struct soap*, int, const char*, const char*, size_t*); }; #endif /* calc.h:97 */ #ifndef SOAP_TYPE_ns__add #define SOAP_TYPE_ns__add (11) /* ns:add complex type: */ struct ns__add { public: double a; /* required element of XSD type xsd:double */ double b; /* required element of XSD type xsd:double */ public: int soap_type() const { return 11; } /* = unique type id SOAP_TYPE_ns__add */ ns__add(); friend SOAP_FMAC1 ns__add * SOAP_FMAC2 soap_instantiate_ns__add(struct soap*, int, const char*, const char*, size_t*); }; #endif /* calc.h:100 */ #ifndef SOAP_TYPE_ns__subResponse #define SOAP_TYPE_ns__subResponse (13) /* ns:subResponse complex type: */ struct ns__subResponse { public: double *result; /* SOAP 1.2 RPC return element (when namespace qualified) */ /* optional element of XSD type xsd:double */ public: int soap_type() const { return 13; } /* = unique type id SOAP_TYPE_ns__subResponse */ ns__subResponse(); friend SOAP_FMAC1 ns__subResponse * SOAP_FMAC2 soap_instantiate_ns__subResponse(struct soap*, int, const char*, const char*, size_t*); }; #endif /* calc.h:100 */ #ifndef SOAP_TYPE_ns__sub #define SOAP_TYPE_ns__sub (14) /* ns:sub complex type: */ struct ns__sub { public: double a; /* required element of XSD type xsd:double */ double b; /* required element of XSD type xsd:double */ public: int soap_type() const { return 14; } /* = unique type id SOAP_TYPE_ns__sub */ ns__sub(); friend SOAP_FMAC1 ns__sub * SOAP_FMAC2 soap_instantiate_ns__sub(struct soap*, int, const char*, const char*, size_t*); }; #endif /* calc.h:103 */ #ifndef SOAP_TYPE_ns__mulResponse #define SOAP_TYPE_ns__mulResponse (16) /* ns:mulResponse complex type: */ struct ns__mulResponse { public: double *result; /* SOAP 1.2 RPC return element (when namespace qualified) */ /* optional element of XSD type xsd:double */ public: int soap_type() const { return 16; } /* = unique type id SOAP_TYPE_ns__mulResponse */ ns__mulResponse(); friend SOAP_FMAC1 ns__mulResponse * SOAP_FMAC2 soap_instantiate_ns__mulResponse(struct soap*, int, const char*, const char*, size_t*); }; #endif /* calc.h:103 */ #ifndef SOAP_TYPE_ns__mul #define SOAP_TYPE_ns__mul (17) /* ns:mul complex type: */ struct ns__mul { public: double a; /* required element of XSD type xsd:double */ double b; /* required element of XSD type xsd:double */ public: int soap_type() const { return 17; } /* = unique type id SOAP_TYPE_ns__mul */ ns__mul(); friend SOAP_FMAC1 ns__mul * SOAP_FMAC2 soap_instantiate_ns__mul(struct soap*, int, const char*, const char*, size_t*); }; #endif /* calc.h:106 */ #ifndef SOAP_TYPE_ns__divResponse #define SOAP_TYPE_ns__divResponse (19) /* ns:divResponse complex type: */ struct ns__divResponse { public: double *result; /* SOAP 1.2 RPC return element (when namespace qualified) */ /* optional element of XSD type xsd:double */ public: int soap_type() const { return 19; } /* = unique type id SOAP_TYPE_ns__divResponse */ ns__divResponse(); friend SOAP_FMAC1 ns__divResponse * SOAP_FMAC2 soap_instantiate_ns__divResponse(struct soap*, int, const char*, const char*, size_t*); }; #endif /* calc.h:106 */ #ifndef SOAP_TYPE_ns__div #define SOAP_TYPE_ns__div (20) /* ns:div complex type: */ struct ns__div { public: double a; /* required element of XSD type xsd:double */ double b; /* required element of XSD type xsd:double */ public: int soap_type() const { return 20; } /* = unique type id SOAP_TYPE_ns__div */ ns__div(); friend SOAP_FMAC1 ns__div * SOAP_FMAC2 soap_instantiate_ns__div(struct soap*, int, const char*, const char*, size_t*); }; #endif /* calc.h:109 */ #ifndef SOAP_TYPE_ns__powResponse #define SOAP_TYPE_ns__powResponse (22) /* ns:powResponse complex type: */ struct ns__powResponse { public: double *result; /* SOAP 1.2 RPC return element (when namespace qualified) */ /* optional element of XSD type xsd:double */ public: int soap_type() const { return 22; } /* = unique type id SOAP_TYPE_ns__powResponse */ ns__powResponse(); friend SOAP_FMAC1 ns__powResponse * SOAP_FMAC2 soap_instantiate_ns__powResponse(struct soap*, int, const char*, const char*, size_t*); }; #endif /* calc.h:109 */ #ifndef SOAP_TYPE_ns__pow #define SOAP_TYPE_ns__pow (23) /* ns:pow complex type: */ struct ns__pow { public: double a; /* required element of XSD type xsd:double */ double b; /* required element of XSD type xsd:double */ public: int soap_type() const { return 23; } /* = unique type id SOAP_TYPE_ns__pow */ ns__pow(); friend SOAP_FMAC1 ns__pow * SOAP_FMAC2 soap_instantiate_ns__pow(struct soap*, int, const char*, const char*, size_t*); }; #endif /* calc.h:110 */ #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_SOAP_ENV__Header #define SOAP_TYPE_SOAP_ENV__Header (24) /* SOAP Header: */ struct SOAP_ENV__Header { public: int soap_type() const { return 24; } /* = unique type id SOAP_TYPE_SOAP_ENV__Header */ SOAP_ENV__Header(); friend SOAP_FMAC1 SOAP_ENV__Header * SOAP_FMAC2 soap_instantiate_SOAP_ENV__Header(struct soap*, int, const char*, const char*, size_t*); }; #endif #endif /* calc.h:110 */ #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_SOAP_ENV__Code #define SOAP_TYPE_SOAP_ENV__Code (25) /* Type SOAP_ENV__Code is a recursive data type (in)directly referencing itself through its (base) class members */ /* SOAP Fault Code: */ struct SOAP_ENV__Code { public: char *SOAP_ENV__Value; /* optional element of XSD type xsd:QName */ struct SOAP_ENV__Code *SOAP_ENV__Subcode; /* optional element of XSD type SOAP-ENV:Code */ public: int soap_type() const { return 25; } /* = unique type id SOAP_TYPE_SOAP_ENV__Code */ SOAP_ENV__Code(); friend SOAP_FMAC1 SOAP_ENV__Code * SOAP_FMAC2 soap_instantiate_SOAP_ENV__Code(struct soap*, int, const char*, const char*, size_t*); }; #endif #endif /* calc.h:110 */ #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_SOAP_ENV__Detail #define SOAP_TYPE_SOAP_ENV__Detail (27) /* SOAP-ENV:Detail complex type: */ struct SOAP_ENV__Detail { public: char *__any; int __type; /* any type of element (defined below) WARNING: do not create a cyclic data structure graph throught this element unless SOAP encoding or SOAP_XML_GRAPH are used for id-ref serialization */ void *fault; /* transient (not serialized) */ public: int soap_type() const { return 27; } /* = unique type id SOAP_TYPE_SOAP_ENV__Detail */ SOAP_ENV__Detail(); friend SOAP_FMAC1 SOAP_ENV__Detail * SOAP_FMAC2 soap_instantiate_SOAP_ENV__Detail(struct soap*, int, const char*, const char*, size_t*); }; #endif #endif /* calc.h:110 */ #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_SOAP_ENV__Reason #define SOAP_TYPE_SOAP_ENV__Reason (30) /* SOAP-ENV:Reason complex type: */ struct SOAP_ENV__Reason { public: char *SOAP_ENV__Text; /* optional element of XSD type xsd:string */ public: int soap_type() const { return 30; } /* = unique type id SOAP_TYPE_SOAP_ENV__Reason */ SOAP_ENV__Reason(); friend SOAP_FMAC1 SOAP_ENV__Reason * SOAP_FMAC2 soap_instantiate_SOAP_ENV__Reason(struct soap*, int, const char*, const char*, size_t*); }; #endif #endif /* calc.h:110 */ #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_SOAP_ENV__Fault #define SOAP_TYPE_SOAP_ENV__Fault (31) /* SOAP Fault: */ struct SOAP_ENV__Fault { public: char *faultcode; /* optional element of XSD type xsd:QName */ char *faultstring; /* optional element of XSD type xsd:string */ char *faultactor; /* optional element of XSD type xsd:string */ struct SOAP_ENV__Detail *detail; /* optional element of XSD type SOAP-ENV:Detail */ struct SOAP_ENV__Code *SOAP_ENV__Code; /* optional element of XSD type SOAP-ENV:Code */ struct SOAP_ENV__Reason *SOAP_ENV__Reason; /* optional element of XSD type SOAP-ENV:Reason */ char *SOAP_ENV__Node; /* optional element of XSD type xsd:string */ char *SOAP_ENV__Role; /* optional element of XSD type xsd:string */ struct SOAP_ENV__Detail *SOAP_ENV__Detail; /* optional element of XSD type SOAP-ENV:Detail */ public: int soap_type() const { return 31; } /* = unique type id SOAP_TYPE_SOAP_ENV__Fault */ SOAP_ENV__Fault(); friend SOAP_FMAC1 SOAP_ENV__Fault * SOAP_FMAC2 soap_instantiate_SOAP_ENV__Fault(struct soap*, int, const char*, const char*, size_t*); }; #endif #endif /******************************************************************************\ * * * Typedefs * * * \******************************************************************************/ /* calc.h:97 */ #ifndef SOAP_TYPE__QName #define SOAP_TYPE__QName (5) typedef char *_QName; #endif /* calc.h:97 */ #ifndef SOAP_TYPE__XML #define SOAP_TYPE__XML (6) typedef char *_XML; #endif /******************************************************************************\ * * * Externals * * * \******************************************************************************/ #endif /* End of soapStub.h */ gsoap-2.8.28/gsoap/samples/calc_xcode/calc_xcode.10000644000175000017500000000607012653650154021305 0ustar ellertellert.\"Modified from man(1) of FreeBSD, the NetBSD mdoc.template, and mdoc.samples. .\"See Also: .\"man mdoc.samples for a complete listing of options .\"man mdoc for the short list of editing options .\"/usr/share/misc/mdoc.template .Dd 12/31/07 \" DATE .Dt calc_xcode 1 \" Program name and manual section number .Os Darwin .Sh NAME \" Section Header - required - don't modify .Nm calc_xcode, .\" The following lines are read in generating the apropos(man -k) database. Use only key .\" words here as the database is built based on the words here and in the .ND line. .Nm Other_name_for_same_program(), .Nm Yet another name for the same program. .\" Use .Nm macro to designate other names for the documented program. .Nd This line parsed for whatis database. .Sh SYNOPSIS \" Section Header - required - don't modify .Nm .Op Fl abcd \" [-abcd] .Op Fl a Ar path \" [-a path] .Op Ar file \" [file] .Op Ar \" [file ...] .Ar arg0 \" Underlined argument - use .Ar anywhere to underline arg2 ... \" Arguments .Sh DESCRIPTION \" Section Header - required - don't modify Use the .Nm macro to refer to your program throughout the man page like such: .Nm Underlining is accomplished with the .Ar macro like this: .Ar underlined text . .Pp \" Inserts a space A list of items with descriptions: .Bl -tag -width -indent \" Begins a tagged list .It item a \" Each item preceded by .It macro Description of item a .It item b Description of item b .El \" Ends the list .Pp A list of flags and their descriptions: .Bl -tag -width -indent \" Differs from above in tag removed .It Fl a \"-a flag as a list item Description of -a flag .It Fl b Description of -b flag .El \" Ends the list .Pp .\" .Sh ENVIRONMENT \" May not be needed .\" .Bl -tag -width "ENV_VAR_1" -indent \" ENV_VAR_1 is width of the string ENV_VAR_1 .\" .It Ev ENV_VAR_1 .\" Description of ENV_VAR_1 .\" .It Ev ENV_VAR_2 .\" Description of ENV_VAR_2 .\" .El .Sh FILES \" File used or created by the topic of the man page .Bl -tag -width "/Users/joeuser/Library/really_long_file_name" -compact .It Pa /usr/share/file_name FILE_1 description .It Pa /Users/joeuser/Library/really_long_file_name FILE_2 description .El \" Ends the list .\" .Sh DIAGNOSTICS \" May not be needed .\" .Bl -diag .\" .It Diagnostic Tag .\" Diagnostic informtion here. .\" .It Diagnostic Tag .\" Diagnostic informtion here. .\" .El .Sh SEE ALSO .\" List links in ascending order by section, alphabetically within a section. .\" Please do not reference files that do not exist without filing a bug report .Xr a 1 , .Xr b 1 , .Xr c 1 , .Xr a 2 , .Xr b 2 , .Xr a 3 , .Xr b 3 .\" .Sh BUGS \" Document known, unremedied bugs .\" .Sh HISTORY \" Document history if command behaves in a unique manner gsoap-2.8.28/gsoap/samples/calc_xcode/calc_xcode.xcodeproj/0000755000175000017500000000000012653650154023214 5ustar ellertellertgsoap-2.8.28/gsoap/samples/calc_xcode/calc_xcode.xcodeproj/project.pbxproj0000644000175000017500000002453512653650154026301 0ustar ellertellert// !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 46; objects = { /* Begin PBXBuildFile section */ 44A340260D29680E003D1AA9 /* calc.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 44A340250D29680E003D1AA9 /* calc.h */; }; 44A340280D296817003D1AA9 /* calcclient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 44A340270D296817003D1AA9 /* calcclient.cpp */; }; 44A3402A0D296857003D1AA9 /* stdsoap2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 44A340290D296857003D1AA9 /* stdsoap2.cpp */; }; 44A3402C0D296861003D1AA9 /* stdsoap2.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 44A3402B0D296861003D1AA9 /* stdsoap2.h */; }; 44A340400D296B17003D1AA9 /* soapcalcProxy.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 44A3403F0D296B17003D1AA9 /* soapcalcProxy.h */; }; 44A340420D296B1B003D1AA9 /* soapcalcProxy.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 44A340410D296B1B003D1AA9 /* soapcalcProxy.cpp */; }; 44A340440D296B27003D1AA9 /* soapH.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 44A340430D296B26003D1AA9 /* soapH.h */; }; 44A340460D296B2B003D1AA9 /* soapStub.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 44A340450D296B2B003D1AA9 /* soapStub.h */; }; 44A340480D296B2F003D1AA9 /* soapC.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 44A340470D296B2F003D1AA9 /* soapC.cpp */; }; 8DD76F6A0486A84900D96B5E /* calc_xcode.1 in CopyFiles */ = {isa = PBXBuildFile; fileRef = C6859E8B029090EE04C91782 /* calc_xcode.1 */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ 8DD76F690486A84900D96B5E /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 8; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( 8DD76F6A0486A84900D96B5E /* calc_xcode.1 in CopyFiles */, 44A340260D29680E003D1AA9 /* calc.h in CopyFiles */, 44A3402C0D296861003D1AA9 /* stdsoap2.h in CopyFiles */, 44A340400D296B17003D1AA9 /* soapcalcProxy.h in CopyFiles */, 44A340440D296B27003D1AA9 /* soapH.h in CopyFiles */, 44A340460D296B2B003D1AA9 /* soapStub.h in CopyFiles */, ); runOnlyForDeploymentPostprocessing = 1; }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ 44A340250D29680E003D1AA9 /* calc.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = calc.h; sourceTree = ""; }; 44A340270D296817003D1AA9 /* calcclient.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = calcclient.cpp; sourceTree = ""; }; 44A340290D296857003D1AA9 /* stdsoap2.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = stdsoap2.cpp; path = ../../stdsoap2.cpp; sourceTree = SOURCE_ROOT; }; 44A3402B0D296861003D1AA9 /* stdsoap2.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = stdsoap2.h; path = ../../stdsoap2.h; sourceTree = SOURCE_ROOT; }; 44A3403F0D296B17003D1AA9 /* soapcalcProxy.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = soapcalcProxy.h; sourceTree = ""; }; 44A340410D296B1B003D1AA9 /* soapcalcProxy.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = soapcalcProxy.cpp; sourceTree = ""; }; 44A340430D296B26003D1AA9 /* soapH.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = soapH.h; sourceTree = ""; }; 44A340450D296B2B003D1AA9 /* soapStub.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = soapStub.h; sourceTree = ""; }; 44A340470D296B2F003D1AA9 /* soapC.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = soapC.cpp; sourceTree = ""; }; 8DD76F6C0486A84900D96B5E /* calc_xcode */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = calc_xcode; sourceTree = BUILT_PRODUCTS_DIR; }; C6859E8B029090EE04C91782 /* calc_xcode.1 */ = {isa = PBXFileReference; lastKnownFileType = text.man; path = calc_xcode.1; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 8DD76F660486A84900D96B5E /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 08FB7794FE84155DC02AAC07 /* calc_xcode */ = { isa = PBXGroup; children = ( 08FB7795FE84155DC02AAC07 /* Source */, C6859E8C029090F304C91782 /* Documentation */, 1AB674ADFE9D54B511CA2CBB /* Products */, ); name = calc_xcode; sourceTree = ""; }; 08FB7795FE84155DC02AAC07 /* Source */ = { isa = PBXGroup; children = ( 44A340250D29680E003D1AA9 /* calc.h */, 44A340270D296817003D1AA9 /* calcclient.cpp */, 44A3402B0D296861003D1AA9 /* stdsoap2.h */, 44A340290D296857003D1AA9 /* stdsoap2.cpp */, 44A3403F0D296B17003D1AA9 /* soapcalcProxy.h */, 44A340410D296B1B003D1AA9 /* soapcalcProxy.cpp */, 44A340450D296B2B003D1AA9 /* soapStub.h */, 44A340430D296B26003D1AA9 /* soapH.h */, 44A340470D296B2F003D1AA9 /* soapC.cpp */, ); name = Source; sourceTree = ""; }; 1AB674ADFE9D54B511CA2CBB /* Products */ = { isa = PBXGroup; children = ( 8DD76F6C0486A84900D96B5E /* calc_xcode */, ); name = Products; sourceTree = ""; }; C6859E8C029090F304C91782 /* Documentation */ = { isa = PBXGroup; children = ( C6859E8B029090EE04C91782 /* calc_xcode.1 */, ); name = Documentation; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ 8DD76F620486A84900D96B5E /* calc_xcode */ = { isa = PBXNativeTarget; buildConfigurationList = 1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "calc_xcode" */; buildPhases = ( 44A3405D0D296D65003D1AA9 /* ShellScript */, 8DD76F640486A84900D96B5E /* Sources */, 8DD76F660486A84900D96B5E /* Frameworks */, 8DD76F690486A84900D96B5E /* CopyFiles */, 44A340330D29697B003D1AA9 /* ShellScript */, ); buildRules = ( ); dependencies = ( ); name = calc_xcode; productInstallPath = "$(HOME)/bin"; productName = calc_xcode; productReference = 8DD76F6C0486A84900D96B5E /* calc_xcode */; productType = "com.apple.product-type.tool"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 08FB7793FE84155DC02AAC07 /* Project object */ = { isa = PBXProject; attributes = { LastUpgradeCheck = 0460; }; buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "calc_xcode" */; compatibilityVersion = "Xcode 3.2"; developmentRegion = English; hasScannedForEncodings = 1; knownRegions = ( en, ); mainGroup = 08FB7794FE84155DC02AAC07 /* calc_xcode */; projectDirPath = ""; projectRoot = ""; targets = ( 8DD76F620486A84900D96B5E /* calc_xcode */, ); }; /* End PBXProject section */ /* Begin PBXShellScriptBuildPhase section */ 44A340330D29697B003D1AA9 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = ""; }; 44A3405D0D296D65003D1AA9 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( "$(SRCROOT)/calc.h", ); outputPaths = ( "$(DERIVED_FILE_DIR)/soapcalcProxy.h", "$(DERIVED_FILE_DIR)/soapcalcProxy.cpp", "$(DERIVED_FILE_DIR)/soapStub.h", "$(DERIVED_FILE_DIR)/soapH.h", "$(DERIVED_FILE_DIR)/soapC.cpp", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "../../src/soapcpp2 -i -wx -C calc.h"; }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ 8DD76F640486A84900D96B5E /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 44A340280D296817003D1AA9 /* calcclient.cpp in Sources */, 44A3402A0D296857003D1AA9 /* stdsoap2.cpp in Sources */, 44A340420D296B1B003D1AA9 /* soapcalcProxy.cpp in Sources */, 44A340480D296B2F003D1AA9 /* soapC.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin XCBuildConfiguration section */ 1DEB923208733DC60010E9CD /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { COPY_PHASE_STRIP = NO; GCC_DYNAMIC_NO_PIC = NO; GCC_MODEL_TUNING = G5; GCC_OPTIMIZATION_LEVEL = 0; INSTALL_PATH = "$(HOME)/bin"; PRODUCT_NAME = calc_xcode; SDKROOT = ""; ZERO_LINK = YES; }; name = Debug; }; 1DEB923308733DC60010E9CD /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; GCC_GENERATE_DEBUGGING_SYMBOLS = NO; GCC_MODEL_TUNING = G5; INSTALL_PATH = "$(HOME)/bin"; PRODUCT_NAME = calc_xcode; SDKROOT = ""; }; name = Release; }; 1DEB923608733DC60010E9CD /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; SDKROOT = ""; }; name = Debug; }; 1DEB923708733DC60010E9CD /* Release */ = { isa = XCBuildConfiguration; buildSettings = { GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; SDKROOT = ""; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "calc_xcode" */ = { isa = XCConfigurationList; buildConfigurations = ( 1DEB923208733DC60010E9CD /* Debug */, 1DEB923308733DC60010E9CD /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "calc_xcode" */ = { isa = XCConfigurationList; buildConfigurations = ( 1DEB923608733DC60010E9CD /* Debug */, 1DEB923708733DC60010E9CD /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; rootObject = 08FB7793FE84155DC02AAC07 /* Project object */; } gsoap-2.8.28/gsoap/samples/calc_xcode/soapcalcProxy.cpp0000644000175000017500000003173412653650154022477 0ustar ellertellert/* soapcalcProxy.cpp Generated by gSOAP 2.8.28 from calc.h gSOAP XML Web services tools Copyright (C) 2000-2016, Robert van Engelen, Genivia Inc. All Rights Reserved. The soapcpp2 tool and its generated software are released under the GPL. This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapcalcProxy.h" calcProxy::calcProxy() : soap(SOAP_IO_DEFAULT) { calcProxy_init(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT); } calcProxy::calcProxy(const calcProxy& rhs) { soap_copy_context(this, &rhs); this->soap_endpoint = rhs.soap_endpoint; } calcProxy::calcProxy(const struct soap &_soap) : soap(_soap) { } calcProxy::calcProxy(const char *url) : soap(SOAP_IO_DEFAULT) { calcProxy_init(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT); soap_endpoint = url; } calcProxy::calcProxy(soap_mode iomode) : soap(iomode) { calcProxy_init(iomode, iomode); } calcProxy::calcProxy(const char *url, soap_mode iomode) : soap(iomode) { calcProxy_init(iomode, iomode); soap_endpoint = url; } calcProxy::calcProxy(soap_mode imode, soap_mode omode) : soap(imode, omode) { calcProxy_init(imode, omode); } calcProxy::~calcProxy() { this->destroy(); } void calcProxy::calcProxy_init(soap_mode imode, soap_mode omode) { soap_imode(this, imode); soap_omode(this, omode); soap_endpoint = NULL; static const struct Namespace namespaces[] = { {"SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/", "http://www.w3.org/*/soap-envelope", NULL}, {"SOAP-ENC", "http://schemas.xmlsoap.org/soap/encoding/", "http://www.w3.org/*/soap-encoding", NULL}, {"xsi", "http://www.w3.org/2001/XMLSchema-instance", "http://www.w3.org/*/XMLSchema-instance", NULL}, {"xsd", "http://www.w3.org/2001/XMLSchema", "http://www.w3.org/*/XMLSchema", NULL}, {"ns", "urn:calc", NULL, NULL}, {NULL, NULL, NULL, NULL} }; soap_set_namespaces(this, namespaces); } #ifndef WITH_PURE_VIRTUAL calcProxy *calcProxy::copy() { calcProxy *dup = SOAP_NEW_COPY(calcProxy(*(struct soap*)this)); return dup; } #endif calcProxy& calcProxy::operator=(const calcProxy& rhs) { soap_copy_context(this, &rhs); this->soap_endpoint = rhs.soap_endpoint; return *this; } void calcProxy::destroy() { soap_destroy(this); soap_end(this); } void calcProxy::reset() { this->destroy(); soap_done(this); soap_initialize(this); calcProxy_init(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT); } void calcProxy::soap_noheader() { this->header = NULL; } const SOAP_ENV__Header *calcProxy::soap_header() { return this->header; } const SOAP_ENV__Fault *calcProxy::soap_fault() { return this->fault; } const char *calcProxy::soap_fault_string() { return *soap_faultstring(this); } const char *calcProxy::soap_fault_detail() { return *soap_faultdetail(this); } int calcProxy::soap_close_socket() { return soap_closesock(this); } int calcProxy::soap_force_close_socket() { return soap_force_closesock(this); } void calcProxy::soap_print_fault(FILE *fd) { ::soap_print_fault(this, fd); } #ifndef WITH_LEAN #ifndef WITH_COMPAT void calcProxy::soap_stream_fault(std::ostream& os) { ::soap_stream_fault(this, os); } #endif char *calcProxy::soap_sprint_fault(char *buf, size_t len) { return ::soap_sprint_fault(this, buf, len); } #endif int calcProxy::add(const char *endpoint, const char *soap_action, double a, double b, double *result) { struct soap *soap = this; struct ns__add soap_tmp_ns__add; struct ns__addResponse *soap_tmp_ns__addResponse; if (endpoint) soap_endpoint = endpoint; if (soap_endpoint == NULL) soap_endpoint = "http://websrv.cs.fsu.edu/~engelen/calcserver.cgi"; soap_tmp_ns__add.a = a; soap_tmp_ns__add.b = b; soap_begin(soap); soap->encodingStyle = ""; soap_serializeheader(soap); soap_serialize_ns__add(soap, &soap_tmp_ns__add); if (soap_begin_count(soap)) return soap->error; if (soap->mode & SOAP_IO_LENGTH) { if (soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_put_ns__add(soap, &soap_tmp_ns__add, "ns:add", NULL) || soap_body_end_out(soap) || soap_envelope_end_out(soap)) return soap->error; } if (soap_end_count(soap)) return soap->error; if (soap_connect(soap, soap_url(soap, soap_endpoint, NULL), soap_action) || soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_put_ns__add(soap, &soap_tmp_ns__add, "ns:add", NULL) || soap_body_end_out(soap) || soap_envelope_end_out(soap) || soap_end_send(soap)) return soap_closesock(soap); if (!result) return soap_closesock(soap); soap_default_double(soap, result); if (soap_begin_recv(soap) || soap_envelope_begin_in(soap) || soap_recv_header(soap) || soap_body_begin_in(soap)) return soap_closesock(soap); if (soap_recv_fault(soap, 1)) return soap->error; soap_tmp_ns__addResponse = soap_get_ns__addResponse(soap, NULL, "", NULL); if (!soap_tmp_ns__addResponse || soap->error) return soap_recv_fault(soap, 0); if (soap_body_end_in(soap) || soap_envelope_end_in(soap) || soap_end_recv(soap)) return soap_closesock(soap); if (result && soap_tmp_ns__addResponse->result) *result = *soap_tmp_ns__addResponse->result; return soap_closesock(soap); } int calcProxy::sub(const char *endpoint, const char *soap_action, double a, double b, double *result) { struct soap *soap = this; struct ns__sub soap_tmp_ns__sub; struct ns__subResponse *soap_tmp_ns__subResponse; if (endpoint) soap_endpoint = endpoint; if (soap_endpoint == NULL) soap_endpoint = "http://websrv.cs.fsu.edu/~engelen/calcserver.cgi"; soap_tmp_ns__sub.a = a; soap_tmp_ns__sub.b = b; soap_begin(soap); soap->encodingStyle = ""; soap_serializeheader(soap); soap_serialize_ns__sub(soap, &soap_tmp_ns__sub); if (soap_begin_count(soap)) return soap->error; if (soap->mode & SOAP_IO_LENGTH) { if (soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_put_ns__sub(soap, &soap_tmp_ns__sub, "ns:sub", NULL) || soap_body_end_out(soap) || soap_envelope_end_out(soap)) return soap->error; } if (soap_end_count(soap)) return soap->error; if (soap_connect(soap, soap_url(soap, soap_endpoint, NULL), soap_action) || soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_put_ns__sub(soap, &soap_tmp_ns__sub, "ns:sub", NULL) || soap_body_end_out(soap) || soap_envelope_end_out(soap) || soap_end_send(soap)) return soap_closesock(soap); if (!result) return soap_closesock(soap); soap_default_double(soap, result); if (soap_begin_recv(soap) || soap_envelope_begin_in(soap) || soap_recv_header(soap) || soap_body_begin_in(soap)) return soap_closesock(soap); if (soap_recv_fault(soap, 1)) return soap->error; soap_tmp_ns__subResponse = soap_get_ns__subResponse(soap, NULL, "", NULL); if (!soap_tmp_ns__subResponse || soap->error) return soap_recv_fault(soap, 0); if (soap_body_end_in(soap) || soap_envelope_end_in(soap) || soap_end_recv(soap)) return soap_closesock(soap); if (result && soap_tmp_ns__subResponse->result) *result = *soap_tmp_ns__subResponse->result; return soap_closesock(soap); } int calcProxy::mul(const char *endpoint, const char *soap_action, double a, double b, double *result) { struct soap *soap = this; struct ns__mul soap_tmp_ns__mul; struct ns__mulResponse *soap_tmp_ns__mulResponse; if (endpoint) soap_endpoint = endpoint; if (soap_endpoint == NULL) soap_endpoint = "http://websrv.cs.fsu.edu/~engelen/calcserver.cgi"; soap_tmp_ns__mul.a = a; soap_tmp_ns__mul.b = b; soap_begin(soap); soap->encodingStyle = ""; soap_serializeheader(soap); soap_serialize_ns__mul(soap, &soap_tmp_ns__mul); if (soap_begin_count(soap)) return soap->error; if (soap->mode & SOAP_IO_LENGTH) { if (soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_put_ns__mul(soap, &soap_tmp_ns__mul, "ns:mul", NULL) || soap_body_end_out(soap) || soap_envelope_end_out(soap)) return soap->error; } if (soap_end_count(soap)) return soap->error; if (soap_connect(soap, soap_url(soap, soap_endpoint, NULL), soap_action) || soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_put_ns__mul(soap, &soap_tmp_ns__mul, "ns:mul", NULL) || soap_body_end_out(soap) || soap_envelope_end_out(soap) || soap_end_send(soap)) return soap_closesock(soap); if (!result) return soap_closesock(soap); soap_default_double(soap, result); if (soap_begin_recv(soap) || soap_envelope_begin_in(soap) || soap_recv_header(soap) || soap_body_begin_in(soap)) return soap_closesock(soap); if (soap_recv_fault(soap, 1)) return soap->error; soap_tmp_ns__mulResponse = soap_get_ns__mulResponse(soap, NULL, "", NULL); if (!soap_tmp_ns__mulResponse || soap->error) return soap_recv_fault(soap, 0); if (soap_body_end_in(soap) || soap_envelope_end_in(soap) || soap_end_recv(soap)) return soap_closesock(soap); if (result && soap_tmp_ns__mulResponse->result) *result = *soap_tmp_ns__mulResponse->result; return soap_closesock(soap); } int calcProxy::div(const char *endpoint, const char *soap_action, double a, double b, double *result) { struct soap *soap = this; struct ns__div soap_tmp_ns__div; struct ns__divResponse *soap_tmp_ns__divResponse; if (endpoint) soap_endpoint = endpoint; if (soap_endpoint == NULL) soap_endpoint = "http://websrv.cs.fsu.edu/~engelen/calcserver.cgi"; soap_tmp_ns__div.a = a; soap_tmp_ns__div.b = b; soap_begin(soap); soap->encodingStyle = ""; soap_serializeheader(soap); soap_serialize_ns__div(soap, &soap_tmp_ns__div); if (soap_begin_count(soap)) return soap->error; if (soap->mode & SOAP_IO_LENGTH) { if (soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_put_ns__div(soap, &soap_tmp_ns__div, "ns:div", NULL) || soap_body_end_out(soap) || soap_envelope_end_out(soap)) return soap->error; } if (soap_end_count(soap)) return soap->error; if (soap_connect(soap, soap_url(soap, soap_endpoint, NULL), soap_action) || soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_put_ns__div(soap, &soap_tmp_ns__div, "ns:div", NULL) || soap_body_end_out(soap) || soap_envelope_end_out(soap) || soap_end_send(soap)) return soap_closesock(soap); if (!result) return soap_closesock(soap); soap_default_double(soap, result); if (soap_begin_recv(soap) || soap_envelope_begin_in(soap) || soap_recv_header(soap) || soap_body_begin_in(soap)) return soap_closesock(soap); if (soap_recv_fault(soap, 1)) return soap->error; soap_tmp_ns__divResponse = soap_get_ns__divResponse(soap, NULL, "", NULL); if (!soap_tmp_ns__divResponse || soap->error) return soap_recv_fault(soap, 0); if (soap_body_end_in(soap) || soap_envelope_end_in(soap) || soap_end_recv(soap)) return soap_closesock(soap); if (result && soap_tmp_ns__divResponse->result) *result = *soap_tmp_ns__divResponse->result; return soap_closesock(soap); } int calcProxy::pow(const char *endpoint, const char *soap_action, double a, double b, double *result) { struct soap *soap = this; struct ns__pow soap_tmp_ns__pow; struct ns__powResponse *soap_tmp_ns__powResponse; if (endpoint) soap_endpoint = endpoint; if (soap_endpoint == NULL) soap_endpoint = "http://websrv.cs.fsu.edu/~engelen/calcserver.cgi"; soap_tmp_ns__pow.a = a; soap_tmp_ns__pow.b = b; soap_begin(soap); soap->encodingStyle = ""; soap_serializeheader(soap); soap_serialize_ns__pow(soap, &soap_tmp_ns__pow); if (soap_begin_count(soap)) return soap->error; if (soap->mode & SOAP_IO_LENGTH) { if (soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_put_ns__pow(soap, &soap_tmp_ns__pow, "ns:pow", NULL) || soap_body_end_out(soap) || soap_envelope_end_out(soap)) return soap->error; } if (soap_end_count(soap)) return soap->error; if (soap_connect(soap, soap_url(soap, soap_endpoint, NULL), soap_action) || soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_put_ns__pow(soap, &soap_tmp_ns__pow, "ns:pow", NULL) || soap_body_end_out(soap) || soap_envelope_end_out(soap) || soap_end_send(soap)) return soap_closesock(soap); if (!result) return soap_closesock(soap); soap_default_double(soap, result); if (soap_begin_recv(soap) || soap_envelope_begin_in(soap) || soap_recv_header(soap) || soap_body_begin_in(soap)) return soap_closesock(soap); if (soap_recv_fault(soap, 1)) return soap->error; soap_tmp_ns__powResponse = soap_get_ns__powResponse(soap, NULL, "", NULL); if (!soap_tmp_ns__powResponse || soap->error) return soap_recv_fault(soap, 0); if (soap_body_end_in(soap) || soap_envelope_end_in(soap) || soap_end_recv(soap)) return soap_closesock(soap); if (result && soap_tmp_ns__powResponse->result) *result = *soap_tmp_ns__powResponse->result; return soap_closesock(soap); } /* End of client proxy code */ gsoap-2.8.28/gsoap/samples/calc_xcode/soapcalcProxy.h0000644000175000017500000001007712653650154022141 0ustar ellertellert/* soapcalcProxy.h Generated by gSOAP 2.8.28 from calc.h gSOAP XML Web services tools Copyright (C) 2000-2016, Robert van Engelen, Genivia Inc. All Rights Reserved. The soapcpp2 tool and its generated software are released under the GPL. This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #ifndef soapcalcProxy_H #define soapcalcProxy_H #include "soapH.h" class SOAP_CMAC calcProxy : public soap { public: /// Endpoint URL of service 'calcProxy' (change as needed) const char *soap_endpoint; /// Variables globally declared in calc.h (non-static) /// Constructor calcProxy(); /// Copy constructor calcProxy(const calcProxy& rhs); /// Construct from another engine state calcProxy(const struct soap&); /// Constructor with endpoint URL calcProxy(const char *url); /// Constructor with engine input+output mode control calcProxy(soap_mode iomode); /// Constructor with URL and input+output mode control calcProxy(const char *url, soap_mode iomode); /// Constructor with engine input and output mode control calcProxy(soap_mode imode, soap_mode omode); /// Destructor deletes deserialized data and engine context virtual ~calcProxy(); /// Initializer used by constructors virtual void calcProxy_init(soap_mode imode, soap_mode omode); /// Create a new copy virtual calcProxy *copy() SOAP_PURE_VIRTUAL; /// Copy assignment calcProxy& operator=(const calcProxy&); /// Delete all deserialized data (with soap_destroy and soap_end) virtual void destroy(); /// Delete all deserialized data and reset to default virtual void reset(); /// Disables and removes SOAP Header from message virtual void soap_noheader(); /// Get SOAP Header structure (NULL when absent) virtual const SOAP_ENV__Header *soap_header(); /// Get SOAP Fault structure (NULL when absent) virtual const SOAP_ENV__Fault *soap_fault(); /// Get SOAP Fault string (NULL when absent) virtual const char *soap_fault_string(); /// Get SOAP Fault detail as string (NULL when absent) virtual const char *soap_fault_detail(); /// Close connection (normally automatic, except for send_X ops) virtual int soap_close_socket(); /// Force close connection (can kill a thread blocked on IO) virtual int soap_force_close_socket(); /// Print fault virtual void soap_print_fault(FILE*); #ifndef WITH_LEAN /// Print fault to stream #ifndef WITH_COMPAT virtual void soap_stream_fault(std::ostream&); #endif /// Put fault into buffer virtual char *soap_sprint_fault(char *buf, size_t len); #endif /// Web service operation 'add' (returns error code or SOAP_OK) virtual int add(double a, double b, double *result) { return this->add(NULL, NULL, a, b, result); } virtual int add(const char *endpoint, const char *soap_action, double a, double b, double *result); /// Web service operation 'sub' (returns error code or SOAP_OK) virtual int sub(double a, double b, double *result) { return this->sub(NULL, NULL, a, b, result); } virtual int sub(const char *endpoint, const char *soap_action, double a, double b, double *result); /// Web service operation 'mul' (returns error code or SOAP_OK) virtual int mul(double a, double b, double *result) { return this->mul(NULL, NULL, a, b, result); } virtual int mul(const char *endpoint, const char *soap_action, double a, double b, double *result); /// Web service operation 'div' (returns error code or SOAP_OK) virtual int div(double a, double b, double *result) { return this->div(NULL, NULL, a, b, result); } virtual int div(const char *endpoint, const char *soap_action, double a, double b, double *result); /// Web service operation 'pow' (returns error code or SOAP_OK) virtual int pow(double a, double b, double *result) { return this->pow(NULL, NULL, a, b, result); } virtual int pow(const char *endpoint, const char *soap_action, double a, double b, double *result); }; #endif gsoap-2.8.28/gsoap/samples/calc_xcode/README.txt0000644000175000017500000000165012653650154020634 0ustar ellertellertA MAC OS X Xcode example client for the simple calculator service. To create a new gSOAP-based Xcode project, follow these additional steps: Add a new run script to invoke soapcpp2: Project -> New Build Phase -> New Run Script Build Phase In the New script edit box: Script content: ./../src/soapcpp2 -i -wx -C calc.h Input files: $(SRCROOT)/calc.h Output files: $(DERIVED_FILE_DIR)/soapcalcProxy.h $(DERIVED_FILE_DIR)/soapcalcProxy.cpp $(DERIVED_FILE_DIR)/soapStub.h $(DERIVED_FILE_DIR)/soapH.h $(DERIVED_FILE_DIR)/soapC.cpp In the project overview move the new Run script to the start of the build: Groups & Files window pane: Targets -> calc_xcode -> Run script -> Compile Sources ... The calcclient application invokes the service and is used from the command line as follows: $ calcclient add 3 4 result = 7 The calcserver application is a CGI application that can be installed under the cgibin of your Web server. gsoap-2.8.28/gsoap/samples/calc_xcode/calc.nsmap0000644000175000017500000000101012653650154021066 0ustar ellertellert #include "soapH.h" SOAP_NMAC struct Namespace namespaces[] = { {"SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/", "http://www.w3.org/*/soap-envelope", NULL}, {"SOAP-ENC", "http://schemas.xmlsoap.org/soap/encoding/", "http://www.w3.org/*/soap-encoding", NULL}, {"xsi", "http://www.w3.org/2001/XMLSchema-instance", "http://www.w3.org/*/XMLSchema-instance", NULL}, {"xsd", "http://www.w3.org/2001/XMLSchema", "http://www.w3.org/*/XMLSchema", NULL}, {"ns", "urn:calc", NULL, NULL}, {NULL, NULL, NULL, NULL} }; gsoap-2.8.28/gsoap/samples/calc_xcode/calc.h0000644000175000017500000001041012653650154020203 0ustar ellertellert/* calc.h This is a gSOAP header file with web service definitions. The service operations and type definitions use familiar C/C++ syntax. The following methods are defined by this gSOAP service definition: add(a,b) sub(a,b) mul(a,b) div(a,b) pow(a,b) Compilation in C (see samples/calc): $ soapcpp2 -c calc.h $ cc -o calcclient calcclient.c stdsoap2.c soapC.c soapClient.c $ cc -o calcserver calcserver.c stdsoap2.c soapC.c soapServer.c Compilation in C++ (see samples/calc++): $ soapcpp2 -i calc.h $ cc -o calcclient++ calcclient.cpp stdsoap2.cpp soapC.cpp soapcalcProxy.cpp $ cc -o calcserver++ calcserver.cpp stdsoap2.cpp soapC.cpp soapcalcService.cpp Note that soapcpp2 option -i generates proxy and service classes, which encapsulate the method operations in the class instead of defining them as global functions as in C. The //gsoap directives are used to bind XML namespaces and to define Web service properties: //gsoap service name: //gsoap service style: [rpc|document] //gsoap service encoding: [literal|encoded] //gsoap service namespace: //gsoap service location: Web service operation properties: //gsoap service method-style: [rpc|document] //gsoap service method-encoding: [literal|encoded] //gsoap service method-action: //gsoap service method-documentation: and type schema properties: //gsoap schema namespace: //gsoap schema elementForm: [qualified|unqualified] //gsoap schema attributeForm: [qualified|unqualified] //gsoap schema documentation: //gsoap schema type-documentation: where is an XML namespace prefix, which is used in C/C++ operation names, e.g. ns__add(), and type names, e.g. xsd__int. See the documentation for the full list of //gsoap directives. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap ns service name: calc Simple calculator service //gsoap ns service protocol: SOAP //gsoap ns service style: rpc //gsoap ns service encoding: encoded //gsoap ns service namespace: http://websrv.cs.fsu.edu/~engelen/calc.wsdl //gsoap ns service location: http://websrv.cs.fsu.edu/~engelen/calcserver.cgi //gsoap ns schema namespace: urn:calc //gsoap ns service method-documentation: add Sums two values int ns__add(double a, double b, double *result); //gsoap ns service method-documentation: sub Subtracts two values int ns__sub(double a, double b, double *result); //gsoap ns service method-documentation: mul Multiplies two values int ns__mul(double a, double b, double *result); //gsoap ns service method-documentation: div Divides two values int ns__div(double a, double b, double *result); //gsoap ns service method-documentation: pow Raises a to b int ns__pow(double a, double b, double *result); gsoap-2.8.28/gsoap/samples/calc_xcode/calcclient.cpp0000644000175000017500000000512012653650154021737 0ustar ellertellert/* calcclient.cpp Example calculator service client in C++ Service definitions in calc.h (not generated by wsdl2h, but similar) $ soapcpp2 -i calc.h $ cc -o calcclient calcclient.cpp stdsoap2.cpp soapC.cpp soapcalcProxy.cpp where stdsoap2.cpp is in the 'gsoap' directory, or use libgsoap++: $ cc -o calcclient calcclient.cpp soapC.cpp soapcalcProxy.cpp -lgsoap++ -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapcalcProxy.h" #include "calc.nsmap" const char server[] = "http://websrv.cs.fsu.edu/~engelen/calcserver.cgi"; int main(int argc, char **argv) { if (argc < 4) { fprintf(stderr, "Usage: [add|sub|mul|div|pow] num num\n"); exit(0); } double a, b, result; a = strtod(argv[2], NULL); b = strtod(argv[3], NULL); calcProxy calc; calc.soap_endpoint = server; switch (*argv[1]) { case 'a': calc.add(a, b, &result); break; case 's': calc.sub(a, b, &result); break; case 'm': calc.mul(a, b, &result); break; case 'd': calc.div(a, b, &result); break; case 'p': calc.pow(a, b, &result); break; default: fprintf(stderr, "Unknown command\n"); exit(0); } if (calc.error) calc.soap_stream_fault(std::cerr); else printf("result = %g\n", result); return 0; } gsoap-2.8.28/gsoap/samples/chaining/0000755000175000017500000000000012653650172016630 5ustar ellertellertgsoap-2.8.28/gsoap/samples/chaining/quote.h0000644000175000017500000000046712653650154020145 0ustar ellertellert//gsoap ns service name: quote //gsoap ns service style: rpc //gsoap ns service encoding: encoded //gsoap ns service namespace: urn:xmethods-delayed-quotes //gsoap ns service location: http://64.124.140.30:9090/soap //gsoap ns service method-action: getQuote "" int ns__getQuote(char *symbol, float *Result); gsoap-2.8.28/gsoap/samples/chaining/Makefile.in0000644000175000017500000004453012653650170020701 0ustar ellertellert# Makefile.in generated by automake 1.14 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = chaining$(EXEEXT) DIST_COMMON = $(srcdir)/../Makefile.defines $(srcdir)/Makefile.in \ $(srcdir)/Makefile.am $(top_srcdir)/mkinstalldirs \ $(top_srcdir)/depcomp subdir = gsoap/samples/chaining ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am_chaining_OBJECTS = chaining.$(OBJEXT) qServerLib.$(OBJEXT) \ cServerLib.$(OBJEXT) envC.$(OBJEXT) chaining_OBJECTS = $(am_chaining_OBJECTS) am__DEPENDENCIES_1 = chaining_DEPENDENCIES = $(SOAP_C_LIB) $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(chaining_SOURCES) DIST_SOURCES = $(chaining_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ STRIP = @STRIP@ VERSION = @VERSION@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a BUILT_SOURCES = qServerLib.c cServerLib.c envC.c CLEANFILES = *.req.xml *.res.xml *.nsmap *.xsd *.wsdl envStub.h envH.h envC.c cStub.h cH.h cC.c cClient.c cServer.c cClientLib.c cServerLib.c qStub.h qH.h qC.c qClient.c qServer.c qClientLib.c qServerLib.c *~ SOAP_NS = c.nsmap chaining_SOURCES = chaining.c quote.h calc.h env.h qServerLib.c cServerLib.c envC.c chaining_LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) -lm all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/chaining/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/chaining/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(srcdir)/../Makefile.defines: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) chaining$(EXEEXT): $(chaining_OBJECTS) $(chaining_DEPENDENCIES) $(EXTRA_chaining_DEPENDENCIES) @rm -f chaining$(EXEEXT) $(AM_V_CCLD)$(LINK) $(chaining_OBJECTS) $(chaining_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cServerLib.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chaining.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/envC.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qServerLib.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am # include ../Makefile.c_rules envC.c: env.h $(SOAP) -c -CS -penv -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $< qServerLib.c: quote.h $(SOAP) -c -S -np q -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $< cServerLib.c: calc.h $(SOAP) -c -S -np c -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $< # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.28/gsoap/samples/chaining/chaining.c0000644000175000017500000000574412653650154020566 0ustar ellertellert/* chaining.c Example chaining of C services into one service application, To generate non-client-server header and fault handlers: $ soapcpp2 -c -CS -penv env.h The quote service: $ soapcpp2 -c -S -np q quote.h The calc service: $ soapcpp2 -c -S -np c calc.h cc -o chaining.cgi chaining.c stdsoap2.c envC.c qServiceLib.c cServiceLib.c -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2011, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ /* prevent duplicate declarations for global SOAP Header and Fault */ #define WITH_NOGLOBAL #include "q.nsmap" #include "c.nsmap" /* A dummy global table, to keep the linker happy */ struct Namespace namespaces[] = { {NULL} }; int main() { struct soap *soap = soap_new(); soap_set_namespaces(soap, q_namespaces); /* serve over stdin/out, CGI style */ if (soap_begin_serve(soap)) soap_print_fault(soap, stderr); else if (q_serve_request(soap) == SOAP_NO_METHOD) { soap_set_namespaces(soap, c_namespaces); if (c_serve_request(soap)) soap_send_fault(soap); } else if (soap->error) soap_send_fault(soap); soap_destroy(soap); soap_end(soap); soap_free(soap); return 0; } int ns__getQuote(struct soap *soap, char *s, float *r) { *r = 123; /* a dummy service, stocks don't move */ return SOAP_OK; } int ns__add(struct soap *soap, double a, double b, double *r) { *r = a + b; return SOAP_OK; } int ns__sub(struct soap *soap, double a, double b, double *r) { *r = a - b; return SOAP_OK; } int ns__mul(struct soap *soap, double a, double b, double *r) { *r = a * b; return SOAP_OK; } int ns__div(struct soap *soap, double a, double b, double *r) { *r = a / b; return SOAP_OK; } int ns__pow(struct soap *soap, double a, double b, double *r) { *r = pow(a, b); return SOAP_OK; } gsoap-2.8.28/gsoap/samples/chaining/calcH.h0000644000175000017500000006766512653650154020037 0ustar ellertellert/* calcH.h Generated by gSOAP 2.8.8 from calc.h Copyright(C) 2000-2012, Robert van Engelen, Genivia Inc. All Rights Reserved. The generated code is released under one of the following licenses: 1) GPL or 2) Genivia's license for commercial use. This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. */ #ifndef calcH_H #define calcH_H #include "calcStub.h" #ifdef __cplusplus extern "C" { #endif #ifndef WITH_NOIDREF SOAP_FMAC3 void SOAP_FMAC4 soap_markelement(struct soap*, const void*, int); SOAP_FMAC3 int SOAP_FMAC4 soap_putelement(struct soap*, const void*, const char*, int, int); SOAP_FMAC3 void *SOAP_FMAC4 soap_getelement(struct soap*, int*); SOAP_FMAC3 int SOAP_FMAC4 soap_putindependent(struct soap*); SOAP_FMAC3 int SOAP_FMAC4 soap_getindependent(struct soap*); #endif SOAP_FMAC3 int SOAP_FMAC4 soap_ignore_element(struct soap*); #ifndef SOAP_TYPE_byte #define SOAP_TYPE_byte (3) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_byte(struct soap*, char *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_byte(struct soap*, const char*, int, const char *, const char*); SOAP_FMAC3 char * SOAP_FMAC4 soap_in_byte(struct soap*, const char*, char *, const char*); #ifndef soap_write_byte #define soap_write_byte(soap, data) ( soap_begin_send(soap) || soap_put_byte(soap, data, "byte", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_byte(struct soap*, const char *, const char*, const char*); #ifndef soap_read_byte #define soap_read_byte(soap, data) ( soap_begin_recv(soap) || !soap_get_byte(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 char * SOAP_FMAC4 soap_get_byte(struct soap*, char *, const char*, const char*); #ifndef SOAP_TYPE_int #define SOAP_TYPE_int (1) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_int(struct soap*, int *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_int(struct soap*, const char*, int, const int *, const char*); SOAP_FMAC3 int * SOAP_FMAC4 soap_in_int(struct soap*, const char*, int *, const char*); #ifndef soap_write_int #define soap_write_int(soap, data) ( soap_begin_send(soap) || soap_put_int(soap, data, "int", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_int(struct soap*, const int *, const char*, const char*); #ifndef soap_read_int #define soap_read_int(soap, data) ( soap_begin_recv(soap) || !soap_get_int(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 int * SOAP_FMAC4 soap_get_int(struct soap*, int *, const char*, const char*); #ifndef SOAP_TYPE_double #define SOAP_TYPE_double (7) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_double(struct soap*, double *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_double(struct soap*, const char*, int, const double *, const char*); SOAP_FMAC3 double * SOAP_FMAC4 soap_in_double(struct soap*, const char*, double *, const char*); #ifndef soap_write_double #define soap_write_double(soap, data) ( soap_begin_send(soap) || soap_put_double(soap, data, "double", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_double(struct soap*, const double *, const char*, const char*); #ifndef soap_read_double #define soap_read_double(soap, data) ( soap_begin_recv(soap) || !soap_get_double(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 double * SOAP_FMAC4 soap_get_double(struct soap*, double *, const char*, const char*); #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_SOAP_ENV__Fault #define SOAP_TYPE_SOAP_ENV__Fault (31) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Fault(struct soap*, struct SOAP_ENV__Fault *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Fault(struct soap*, const struct SOAP_ENV__Fault *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Fault(struct soap*, const char*, int, const struct SOAP_ENV__Fault *, const char*); SOAP_FMAC3 struct SOAP_ENV__Fault * SOAP_FMAC4 soap_in_SOAP_ENV__Fault(struct soap*, const char*, struct SOAP_ENV__Fault *, const char*); #ifndef soap_write_SOAP_ENV__Fault #define soap_write_SOAP_ENV__Fault(soap, data) ( soap_begin_send(soap) || (soap_serialize_SOAP_ENV__Fault(soap, data), 0) || soap_put_SOAP_ENV__Fault(soap, data, "SOAP-ENV:Fault", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Fault(struct soap*, const struct SOAP_ENV__Fault *, const char*, const char*); #ifndef soap_read_SOAP_ENV__Fault #define soap_read_SOAP_ENV__Fault(soap, data) ( soap_begin_recv(soap) || !soap_get_SOAP_ENV__Fault(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 struct SOAP_ENV__Fault * SOAP_FMAC4 soap_get_SOAP_ENV__Fault(struct soap*, struct SOAP_ENV__Fault *, const char*, const char*); #endif #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_SOAP_ENV__Reason #define SOAP_TYPE_SOAP_ENV__Reason (30) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Reason(struct soap*, struct SOAP_ENV__Reason *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Reason(struct soap*, const struct SOAP_ENV__Reason *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Reason(struct soap*, const char*, int, const struct SOAP_ENV__Reason *, const char*); SOAP_FMAC3 struct SOAP_ENV__Reason * SOAP_FMAC4 soap_in_SOAP_ENV__Reason(struct soap*, const char*, struct SOAP_ENV__Reason *, const char*); #ifndef soap_write_SOAP_ENV__Reason #define soap_write_SOAP_ENV__Reason(soap, data) ( soap_begin_send(soap) || (soap_serialize_SOAP_ENV__Reason(soap, data), 0) || soap_put_SOAP_ENV__Reason(soap, data, "SOAP-ENV:Reason", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Reason(struct soap*, const struct SOAP_ENV__Reason *, const char*, const char*); #ifndef soap_read_SOAP_ENV__Reason #define soap_read_SOAP_ENV__Reason(soap, data) ( soap_begin_recv(soap) || !soap_get_SOAP_ENV__Reason(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 struct SOAP_ENV__Reason * SOAP_FMAC4 soap_get_SOAP_ENV__Reason(struct soap*, struct SOAP_ENV__Reason *, const char*, const char*); #endif #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_SOAP_ENV__Detail #define SOAP_TYPE_SOAP_ENV__Detail (27) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Detail(struct soap*, struct SOAP_ENV__Detail *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Detail(struct soap*, const struct SOAP_ENV__Detail *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Detail(struct soap*, const char*, int, const struct SOAP_ENV__Detail *, const char*); SOAP_FMAC3 struct SOAP_ENV__Detail * SOAP_FMAC4 soap_in_SOAP_ENV__Detail(struct soap*, const char*, struct SOAP_ENV__Detail *, const char*); #ifndef soap_write_SOAP_ENV__Detail #define soap_write_SOAP_ENV__Detail(soap, data) ( soap_begin_send(soap) || (soap_serialize_SOAP_ENV__Detail(soap, data), 0) || soap_put_SOAP_ENV__Detail(soap, data, "SOAP-ENV:Detail", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Detail(struct soap*, const struct SOAP_ENV__Detail *, const char*, const char*); #ifndef soap_read_SOAP_ENV__Detail #define soap_read_SOAP_ENV__Detail(soap, data) ( soap_begin_recv(soap) || !soap_get_SOAP_ENV__Detail(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 struct SOAP_ENV__Detail * SOAP_FMAC4 soap_get_SOAP_ENV__Detail(struct soap*, struct SOAP_ENV__Detail *, const char*, const char*); #endif #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_SOAP_ENV__Code #define SOAP_TYPE_SOAP_ENV__Code (25) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Code(struct soap*, struct SOAP_ENV__Code *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Code(struct soap*, const struct SOAP_ENV__Code *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Code(struct soap*, const char*, int, const struct SOAP_ENV__Code *, const char*); SOAP_FMAC3 struct SOAP_ENV__Code * SOAP_FMAC4 soap_in_SOAP_ENV__Code(struct soap*, const char*, struct SOAP_ENV__Code *, const char*); #ifndef soap_write_SOAP_ENV__Code #define soap_write_SOAP_ENV__Code(soap, data) ( soap_begin_send(soap) || (soap_serialize_SOAP_ENV__Code(soap, data), 0) || soap_put_SOAP_ENV__Code(soap, data, "SOAP-ENV:Code", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Code(struct soap*, const struct SOAP_ENV__Code *, const char*, const char*); #ifndef soap_read_SOAP_ENV__Code #define soap_read_SOAP_ENV__Code(soap, data) ( soap_begin_recv(soap) || !soap_get_SOAP_ENV__Code(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 struct SOAP_ENV__Code * SOAP_FMAC4 soap_get_SOAP_ENV__Code(struct soap*, struct SOAP_ENV__Code *, const char*, const char*); #endif #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_SOAP_ENV__Header #define SOAP_TYPE_SOAP_ENV__Header (24) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Header(struct soap*, struct SOAP_ENV__Header *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Header(struct soap*, const struct SOAP_ENV__Header *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Header(struct soap*, const char*, int, const struct SOAP_ENV__Header *, const char*); SOAP_FMAC3 struct SOAP_ENV__Header * SOAP_FMAC4 soap_in_SOAP_ENV__Header(struct soap*, const char*, struct SOAP_ENV__Header *, const char*); #ifndef soap_write_SOAP_ENV__Header #define soap_write_SOAP_ENV__Header(soap, data) ( soap_begin_send(soap) || (soap_serialize_SOAP_ENV__Header(soap, data), 0) || soap_put_SOAP_ENV__Header(soap, data, "SOAP-ENV:Header", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Header(struct soap*, const struct SOAP_ENV__Header *, const char*, const char*); #ifndef soap_read_SOAP_ENV__Header #define soap_read_SOAP_ENV__Header(soap, data) ( soap_begin_recv(soap) || !soap_get_SOAP_ENV__Header(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 struct SOAP_ENV__Header * SOAP_FMAC4 soap_get_SOAP_ENV__Header(struct soap*, struct SOAP_ENV__Header *, const char*, const char*); #endif #ifndef SOAP_TYPE_ns__pow #define SOAP_TYPE_ns__pow (23) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__pow(struct soap*, struct ns__pow *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__pow(struct soap*, const struct ns__pow *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__pow(struct soap*, const char*, int, const struct ns__pow *, const char*); SOAP_FMAC3 struct ns__pow * SOAP_FMAC4 soap_in_ns__pow(struct soap*, const char*, struct ns__pow *, const char*); #ifndef soap_write_ns__pow #define soap_write_ns__pow(soap, data) ( soap_begin_send(soap) || (soap_serialize_ns__pow(soap, data), 0) || soap_put_ns__pow(soap, data, "ns:pow", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__pow(struct soap*, const struct ns__pow *, const char*, const char*); #ifndef soap_read_ns__pow #define soap_read_ns__pow(soap, data) ( soap_begin_recv(soap) || !soap_get_ns__pow(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 struct ns__pow * SOAP_FMAC4 soap_get_ns__pow(struct soap*, struct ns__pow *, const char*, const char*); #ifndef SOAP_TYPE_ns__powResponse #define SOAP_TYPE_ns__powResponse (22) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__powResponse(struct soap*, struct ns__powResponse *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__powResponse(struct soap*, const struct ns__powResponse *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__powResponse(struct soap*, const char*, int, const struct ns__powResponse *, const char*); SOAP_FMAC3 struct ns__powResponse * SOAP_FMAC4 soap_in_ns__powResponse(struct soap*, const char*, struct ns__powResponse *, const char*); #ifndef soap_write_ns__powResponse #define soap_write_ns__powResponse(soap, data) ( soap_begin_send(soap) || (soap_serialize_ns__powResponse(soap, data), 0) || soap_put_ns__powResponse(soap, data, "ns:powResponse", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__powResponse(struct soap*, const struct ns__powResponse *, const char*, const char*); #ifndef soap_read_ns__powResponse #define soap_read_ns__powResponse(soap, data) ( soap_begin_recv(soap) || !soap_get_ns__powResponse(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 struct ns__powResponse * SOAP_FMAC4 soap_get_ns__powResponse(struct soap*, struct ns__powResponse *, const char*, const char*); #ifndef SOAP_TYPE_ns__div #define SOAP_TYPE_ns__div (20) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__div(struct soap*, struct ns__div *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__div(struct soap*, const struct ns__div *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__div(struct soap*, const char*, int, const struct ns__div *, const char*); SOAP_FMAC3 struct ns__div * SOAP_FMAC4 soap_in_ns__div(struct soap*, const char*, struct ns__div *, const char*); #ifndef soap_write_ns__div #define soap_write_ns__div(soap, data) ( soap_begin_send(soap) || (soap_serialize_ns__div(soap, data), 0) || soap_put_ns__div(soap, data, "ns:div", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__div(struct soap*, const struct ns__div *, const char*, const char*); #ifndef soap_read_ns__div #define soap_read_ns__div(soap, data) ( soap_begin_recv(soap) || !soap_get_ns__div(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 struct ns__div * SOAP_FMAC4 soap_get_ns__div(struct soap*, struct ns__div *, const char*, const char*); #ifndef SOAP_TYPE_ns__divResponse #define SOAP_TYPE_ns__divResponse (19) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__divResponse(struct soap*, struct ns__divResponse *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__divResponse(struct soap*, const struct ns__divResponse *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__divResponse(struct soap*, const char*, int, const struct ns__divResponse *, const char*); SOAP_FMAC3 struct ns__divResponse * SOAP_FMAC4 soap_in_ns__divResponse(struct soap*, const char*, struct ns__divResponse *, const char*); #ifndef soap_write_ns__divResponse #define soap_write_ns__divResponse(soap, data) ( soap_begin_send(soap) || (soap_serialize_ns__divResponse(soap, data), 0) || soap_put_ns__divResponse(soap, data, "ns:divResponse", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__divResponse(struct soap*, const struct ns__divResponse *, const char*, const char*); #ifndef soap_read_ns__divResponse #define soap_read_ns__divResponse(soap, data) ( soap_begin_recv(soap) || !soap_get_ns__divResponse(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 struct ns__divResponse * SOAP_FMAC4 soap_get_ns__divResponse(struct soap*, struct ns__divResponse *, const char*, const char*); #ifndef SOAP_TYPE_ns__mul #define SOAP_TYPE_ns__mul (17) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__mul(struct soap*, struct ns__mul *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__mul(struct soap*, const struct ns__mul *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__mul(struct soap*, const char*, int, const struct ns__mul *, const char*); SOAP_FMAC3 struct ns__mul * SOAP_FMAC4 soap_in_ns__mul(struct soap*, const char*, struct ns__mul *, const char*); #ifndef soap_write_ns__mul #define soap_write_ns__mul(soap, data) ( soap_begin_send(soap) || (soap_serialize_ns__mul(soap, data), 0) || soap_put_ns__mul(soap, data, "ns:mul", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__mul(struct soap*, const struct ns__mul *, const char*, const char*); #ifndef soap_read_ns__mul #define soap_read_ns__mul(soap, data) ( soap_begin_recv(soap) || !soap_get_ns__mul(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 struct ns__mul * SOAP_FMAC4 soap_get_ns__mul(struct soap*, struct ns__mul *, const char*, const char*); #ifndef SOAP_TYPE_ns__mulResponse #define SOAP_TYPE_ns__mulResponse (16) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__mulResponse(struct soap*, struct ns__mulResponse *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__mulResponse(struct soap*, const struct ns__mulResponse *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__mulResponse(struct soap*, const char*, int, const struct ns__mulResponse *, const char*); SOAP_FMAC3 struct ns__mulResponse * SOAP_FMAC4 soap_in_ns__mulResponse(struct soap*, const char*, struct ns__mulResponse *, const char*); #ifndef soap_write_ns__mulResponse #define soap_write_ns__mulResponse(soap, data) ( soap_begin_send(soap) || (soap_serialize_ns__mulResponse(soap, data), 0) || soap_put_ns__mulResponse(soap, data, "ns:mulResponse", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__mulResponse(struct soap*, const struct ns__mulResponse *, const char*, const char*); #ifndef soap_read_ns__mulResponse #define soap_read_ns__mulResponse(soap, data) ( soap_begin_recv(soap) || !soap_get_ns__mulResponse(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 struct ns__mulResponse * SOAP_FMAC4 soap_get_ns__mulResponse(struct soap*, struct ns__mulResponse *, const char*, const char*); #ifndef SOAP_TYPE_ns__sub #define SOAP_TYPE_ns__sub (14) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__sub(struct soap*, struct ns__sub *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__sub(struct soap*, const struct ns__sub *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__sub(struct soap*, const char*, int, const struct ns__sub *, const char*); SOAP_FMAC3 struct ns__sub * SOAP_FMAC4 soap_in_ns__sub(struct soap*, const char*, struct ns__sub *, const char*); #ifndef soap_write_ns__sub #define soap_write_ns__sub(soap, data) ( soap_begin_send(soap) || (soap_serialize_ns__sub(soap, data), 0) || soap_put_ns__sub(soap, data, "ns:sub", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__sub(struct soap*, const struct ns__sub *, const char*, const char*); #ifndef soap_read_ns__sub #define soap_read_ns__sub(soap, data) ( soap_begin_recv(soap) || !soap_get_ns__sub(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 struct ns__sub * SOAP_FMAC4 soap_get_ns__sub(struct soap*, struct ns__sub *, const char*, const char*); #ifndef SOAP_TYPE_ns__subResponse #define SOAP_TYPE_ns__subResponse (13) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__subResponse(struct soap*, struct ns__subResponse *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__subResponse(struct soap*, const struct ns__subResponse *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__subResponse(struct soap*, const char*, int, const struct ns__subResponse *, const char*); SOAP_FMAC3 struct ns__subResponse * SOAP_FMAC4 soap_in_ns__subResponse(struct soap*, const char*, struct ns__subResponse *, const char*); #ifndef soap_write_ns__subResponse #define soap_write_ns__subResponse(soap, data) ( soap_begin_send(soap) || (soap_serialize_ns__subResponse(soap, data), 0) || soap_put_ns__subResponse(soap, data, "ns:subResponse", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__subResponse(struct soap*, const struct ns__subResponse *, const char*, const char*); #ifndef soap_read_ns__subResponse #define soap_read_ns__subResponse(soap, data) ( soap_begin_recv(soap) || !soap_get_ns__subResponse(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 struct ns__subResponse * SOAP_FMAC4 soap_get_ns__subResponse(struct soap*, struct ns__subResponse *, const char*, const char*); #ifndef SOAP_TYPE_ns__add #define SOAP_TYPE_ns__add (11) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__add(struct soap*, struct ns__add *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__add(struct soap*, const struct ns__add *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__add(struct soap*, const char*, int, const struct ns__add *, const char*); SOAP_FMAC3 struct ns__add * SOAP_FMAC4 soap_in_ns__add(struct soap*, const char*, struct ns__add *, const char*); #ifndef soap_write_ns__add #define soap_write_ns__add(soap, data) ( soap_begin_send(soap) || (soap_serialize_ns__add(soap, data), 0) || soap_put_ns__add(soap, data, "ns:add", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__add(struct soap*, const struct ns__add *, const char*, const char*); #ifndef soap_read_ns__add #define soap_read_ns__add(soap, data) ( soap_begin_recv(soap) || !soap_get_ns__add(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 struct ns__add * SOAP_FMAC4 soap_get_ns__add(struct soap*, struct ns__add *, const char*, const char*); #ifndef SOAP_TYPE_ns__addResponse #define SOAP_TYPE_ns__addResponse (10) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__addResponse(struct soap*, struct ns__addResponse *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__addResponse(struct soap*, const struct ns__addResponse *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__addResponse(struct soap*, const char*, int, const struct ns__addResponse *, const char*); SOAP_FMAC3 struct ns__addResponse * SOAP_FMAC4 soap_in_ns__addResponse(struct soap*, const char*, struct ns__addResponse *, const char*); #ifndef soap_write_ns__addResponse #define soap_write_ns__addResponse(soap, data) ( soap_begin_send(soap) || (soap_serialize_ns__addResponse(soap, data), 0) || soap_put_ns__addResponse(soap, data, "ns:addResponse", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__addResponse(struct soap*, const struct ns__addResponse *, const char*, const char*); #ifndef soap_read_ns__addResponse #define soap_read_ns__addResponse(soap, data) ( soap_begin_recv(soap) || !soap_get_ns__addResponse(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 struct ns__addResponse * SOAP_FMAC4 soap_get_ns__addResponse(struct soap*, struct ns__addResponse *, const char*, const char*); #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_PointerToSOAP_ENV__Reason #define SOAP_TYPE_PointerToSOAP_ENV__Reason (33) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToSOAP_ENV__Reason(struct soap*, struct SOAP_ENV__Reason *const*); SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerToSOAP_ENV__Reason(struct soap*, const char *, int, struct SOAP_ENV__Reason *const*, const char *); SOAP_FMAC3 struct SOAP_ENV__Reason ** SOAP_FMAC4 soap_in_PointerToSOAP_ENV__Reason(struct soap*, const char*, struct SOAP_ENV__Reason **, const char*); #ifndef soap_write_PointerToSOAP_ENV__Reason #define soap_write_PointerToSOAP_ENV__Reason(soap, data) ( soap_begin_send(soap) || (soap_serialize_PointerToSOAP_ENV__Reason(soap, data), 0) || soap_put_PointerToSOAP_ENV__Reason(soap, data, "SOAP-ENV:Reason", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerToSOAP_ENV__Reason(struct soap*, struct SOAP_ENV__Reason *const*, const char*, const char*); #ifndef soap_read_PointerToSOAP_ENV__Reason #define soap_read_PointerToSOAP_ENV__Reason(soap, data) ( soap_begin_recv(soap) || !soap_get_PointerToSOAP_ENV__Reason(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 struct SOAP_ENV__Reason ** SOAP_FMAC4 soap_get_PointerToSOAP_ENV__Reason(struct soap*, struct SOAP_ENV__Reason **, const char*, const char*); #endif #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_PointerToSOAP_ENV__Detail #define SOAP_TYPE_PointerToSOAP_ENV__Detail (32) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToSOAP_ENV__Detail(struct soap*, struct SOAP_ENV__Detail *const*); SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerToSOAP_ENV__Detail(struct soap*, const char *, int, struct SOAP_ENV__Detail *const*, const char *); SOAP_FMAC3 struct SOAP_ENV__Detail ** SOAP_FMAC4 soap_in_PointerToSOAP_ENV__Detail(struct soap*, const char*, struct SOAP_ENV__Detail **, const char*); #ifndef soap_write_PointerToSOAP_ENV__Detail #define soap_write_PointerToSOAP_ENV__Detail(soap, data) ( soap_begin_send(soap) || (soap_serialize_PointerToSOAP_ENV__Detail(soap, data), 0) || soap_put_PointerToSOAP_ENV__Detail(soap, data, "SOAP-ENV:Detail", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerToSOAP_ENV__Detail(struct soap*, struct SOAP_ENV__Detail *const*, const char*, const char*); #ifndef soap_read_PointerToSOAP_ENV__Detail #define soap_read_PointerToSOAP_ENV__Detail(soap, data) ( soap_begin_recv(soap) || !soap_get_PointerToSOAP_ENV__Detail(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 struct SOAP_ENV__Detail ** SOAP_FMAC4 soap_get_PointerToSOAP_ENV__Detail(struct soap*, struct SOAP_ENV__Detail **, const char*, const char*); #endif #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_PointerToSOAP_ENV__Code #define SOAP_TYPE_PointerToSOAP_ENV__Code (26) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToSOAP_ENV__Code(struct soap*, struct SOAP_ENV__Code *const*); SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerToSOAP_ENV__Code(struct soap*, const char *, int, struct SOAP_ENV__Code *const*, const char *); SOAP_FMAC3 struct SOAP_ENV__Code ** SOAP_FMAC4 soap_in_PointerToSOAP_ENV__Code(struct soap*, const char*, struct SOAP_ENV__Code **, const char*); #ifndef soap_write_PointerToSOAP_ENV__Code #define soap_write_PointerToSOAP_ENV__Code(soap, data) ( soap_begin_send(soap) || (soap_serialize_PointerToSOAP_ENV__Code(soap, data), 0) || soap_put_PointerToSOAP_ENV__Code(soap, data, "SOAP-ENV:Code", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerToSOAP_ENV__Code(struct soap*, struct SOAP_ENV__Code *const*, const char*, const char*); #ifndef soap_read_PointerToSOAP_ENV__Code #define soap_read_PointerToSOAP_ENV__Code(soap, data) ( soap_begin_recv(soap) || !soap_get_PointerToSOAP_ENV__Code(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 struct SOAP_ENV__Code ** SOAP_FMAC4 soap_get_PointerToSOAP_ENV__Code(struct soap*, struct SOAP_ENV__Code **, const char*, const char*); #endif #ifndef SOAP_TYPE_PointerTodouble #define SOAP_TYPE_PointerTodouble (8) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTodouble(struct soap*, double *const*); SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTodouble(struct soap*, const char *, int, double *const*, const char *); SOAP_FMAC3 double ** SOAP_FMAC4 soap_in_PointerTodouble(struct soap*, const char*, double **, const char*); #ifndef soap_write_PointerTodouble #define soap_write_PointerTodouble(soap, data) ( soap_begin_send(soap) || (soap_serialize_PointerTodouble(soap, data), 0) || soap_put_PointerTodouble(soap, data, "double", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTodouble(struct soap*, double *const*, const char*, const char*); #ifndef soap_read_PointerTodouble #define soap_read_PointerTodouble(soap, data) ( soap_begin_recv(soap) || !soap_get_PointerTodouble(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 double ** SOAP_FMAC4 soap_get_PointerTodouble(struct soap*, double **, const char*, const char*); #ifndef SOAP_TYPE__QName #define SOAP_TYPE__QName (5) #endif #define soap_default__QName(soap, a) soap_default_string(soap, a) #define soap_serialize__QName(soap, a) soap_serialize_string(soap, a) SOAP_FMAC3 int SOAP_FMAC4 soap_out__QName(struct soap*, const char*, int, char*const*, const char*); SOAP_FMAC3 char * * SOAP_FMAC4 soap_in__QName(struct soap*, const char*, char **, const char*); #ifndef soap_write__QName #define soap_write__QName(soap, data) ( soap_begin_send(soap) || (soap_serialize__QName(soap, data), 0) || soap_put__QName(soap, data, "byte", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put__QName(struct soap*, char *const*, const char*, const char*); #ifndef soap_read__QName #define soap_read__QName(soap, data) ( soap_begin_recv(soap) || !soap_get__QName(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 char ** SOAP_FMAC4 soap_get__QName(struct soap*, char **, const char*, const char*); #ifndef SOAP_TYPE_string #define SOAP_TYPE_string (4) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_string(struct soap*, char **); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_string(struct soap*, char *const*); SOAP_FMAC3 int SOAP_FMAC4 soap_out_string(struct soap*, const char*, int, char*const*, const char*); SOAP_FMAC3 char * * SOAP_FMAC4 soap_in_string(struct soap*, const char*, char **, const char*); #ifndef soap_write_string #define soap_write_string(soap, data) ( soap_begin_send(soap) || (soap_serialize_string(soap, data), 0) || soap_put_string(soap, data, "byte", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_string(struct soap*, char *const*, const char*, const char*); #ifndef soap_read_string #define soap_read_string(soap, data) ( soap_begin_recv(soap) || !soap_get_string(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 char ** SOAP_FMAC4 soap_get_string(struct soap*, char **, const char*, const char*); #ifdef __cplusplus } #endif #endif /* End of calcH.h */ gsoap-2.8.28/gsoap/samples/chaining/env.h0000644000175000017500000000156012653650154017573 0ustar ellertellert/* env.h Defines SOAP-ENV Header and Fault global structures shared by client and service modules to process SOAP headers and faults when combining multiple client and/or services into one executable. Defines SOAP Fault and SOAP Header structures, which will be shared by client and service modules. The Header structure should contain all fields required by the clients and services. To obtain these, look into the wsdl2h-generated .h files for struct SOAP_ENV__Header and struct SOAP_ENV__Detail. Copy these below to make them globally visible to the gSOAP engine and plugins. Copyright (C) 2000-2003 Robert A. van Engelen, Genivia inc. All Rights Reserved. Compile: soapcpp2 -penv env.h c++ -c envC.cpp c++ -DWITH_NONAMESPACES -c stdsoap2.cpp */ #import "header.h" // optional user-defined headers #import "fault.h" // optional user-defined fault details gsoap-2.8.28/gsoap/samples/chaining/quoteC.c0000644000175000017500000013541412653650154020244 0ustar ellertellert/* quoteC.c Generated by gSOAP 2.8.8 from quote.h Copyright(C) 2000-2012, Robert van Engelen, Genivia Inc. All Rights Reserved. The generated code is released under one of the following licenses: 1) GPL or 2) Genivia's license for commercial use. This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. */ #if defined(__BORLANDC__) #pragma option push -w-8060 #pragma option push -w-8004 #endif #include "quoteH.h" #ifdef __cplusplus extern "C" { #endif SOAP_SOURCE_STAMP("@(#) quoteC.c ver 2.8.8 2012-04-18 14:36:19 GMT") #ifndef WITH_NOGLOBAL SOAP_FMAC3 void SOAP_FMAC4 soap_serializeheader(struct soap *soap) { if (soap->header) soap_serialize_SOAP_ENV__Header(soap, soap->header); } SOAP_FMAC3 int SOAP_FMAC4 soap_putheader(struct soap *soap) { if (soap->header) { soap->part = SOAP_IN_HEADER; if (soap_out_SOAP_ENV__Header(soap, "SOAP-ENV:Header", 0, soap->header, NULL)) return soap->error; soap->part = SOAP_END_HEADER; } return SOAP_OK; } SOAP_FMAC3 int SOAP_FMAC4 soap_getheader(struct soap *soap) { soap->part = SOAP_IN_HEADER; soap->header = soap_in_SOAP_ENV__Header(soap, "SOAP-ENV:Header", NULL, NULL); soap->part = SOAP_END_HEADER; return soap->header == NULL; } SOAP_FMAC3 void SOAP_FMAC4 soap_header(struct soap *soap) { if (!soap->header) { if ((soap->header = (struct SOAP_ENV__Header*)soap_malloc(soap, sizeof(struct SOAP_ENV__Header)))) soap_default_SOAP_ENV__Header(soap, soap->header); } } SOAP_FMAC3 void SOAP_FMAC4 soap_fault(struct soap *soap) { if (!soap->fault) { soap->fault = (struct SOAP_ENV__Fault*)soap_malloc(soap, sizeof(struct SOAP_ENV__Fault)); if (!soap->fault) return; soap_default_SOAP_ENV__Fault(soap, soap->fault); } if (soap->version == 2 && !soap->fault->SOAP_ENV__Code) { soap->fault->SOAP_ENV__Code = (struct SOAP_ENV__Code*)soap_malloc(soap, sizeof(struct SOAP_ENV__Code)); soap_default_SOAP_ENV__Code(soap, soap->fault->SOAP_ENV__Code); } if (soap->version == 2 && !soap->fault->SOAP_ENV__Reason) { soap->fault->SOAP_ENV__Reason = (struct SOAP_ENV__Reason*)soap_malloc(soap, sizeof(struct SOAP_ENV__Reason)); soap_default_SOAP_ENV__Reason(soap, soap->fault->SOAP_ENV__Reason); } } SOAP_FMAC3 void SOAP_FMAC4 soap_serializefault(struct soap *soap) { if (soap->fault) soap_serialize_SOAP_ENV__Fault(soap, soap->fault); } SOAP_FMAC3 int SOAP_FMAC4 soap_putfault(struct soap *soap) { if (soap->fault) return soap_put_SOAP_ENV__Fault(soap, soap->fault, "SOAP-ENV:Fault", NULL); return SOAP_OK; } SOAP_FMAC3 int SOAP_FMAC4 soap_getfault(struct soap *soap) { return (soap->fault = soap_get_SOAP_ENV__Fault(soap, NULL, "SOAP-ENV:Fault", NULL)) == NULL; } SOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultcode(struct soap *soap) { soap_fault(soap); if (soap->version == 2 && soap->fault->SOAP_ENV__Code) return (const char**)&soap->fault->SOAP_ENV__Code->SOAP_ENV__Value; return (const char**)&soap->fault->faultcode; } SOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultsubcode(struct soap *soap) { soap_fault(soap); if (soap->version == 2) { if (!soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode) { soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode = (struct SOAP_ENV__Code*)soap_malloc(soap, sizeof(struct SOAP_ENV__Code)); soap_default_SOAP_ENV__Code(soap, soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode); } return (const char**)&soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode->SOAP_ENV__Value; } return (const char**)&soap->fault->faultcode; } SOAP_FMAC3 const char * SOAP_FMAC4 soap_check_faultsubcode(struct soap *soap) { soap_fault(soap); if (soap->version == 2) { if (soap->fault->SOAP_ENV__Code && soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode && soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode) return soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode->SOAP_ENV__Value; return NULL; } return soap->fault->faultcode; } SOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultstring(struct soap *soap) { soap_fault(soap); if (soap->version == 2) return (const char**)&soap->fault->SOAP_ENV__Reason->SOAP_ENV__Text; return (const char**)&soap->fault->faultstring; } SOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultdetail(struct soap *soap) { soap_fault(soap); if (soap->version == 1) { if (!soap->fault->detail) { soap->fault->detail = (struct SOAP_ENV__Detail*)soap_malloc(soap, sizeof(struct SOAP_ENV__Detail)); soap_default_SOAP_ENV__Detail(soap, soap->fault->detail); } return (const char**)&soap->fault->detail->__any; } if (!soap->fault->SOAP_ENV__Detail) { soap->fault->SOAP_ENV__Detail = (struct SOAP_ENV__Detail*)soap_malloc(soap, sizeof(struct SOAP_ENV__Detail)); soap_default_SOAP_ENV__Detail(soap, soap->fault->SOAP_ENV__Detail); } return (const char**)&soap->fault->SOAP_ENV__Detail->__any; } SOAP_FMAC3 const char * SOAP_FMAC4 soap_check_faultdetail(struct soap *soap) { soap_fault(soap); if (soap->version == 2 && soap->fault->SOAP_ENV__Detail) return soap->fault->SOAP_ENV__Detail->__any; if (soap->fault->detail) return soap->fault->detail->__any; return NULL; } #endif #ifndef WITH_NOIDREF SOAP_FMAC3 int SOAP_FMAC4 soap_getindependent(struct soap *soap) { int t; if (soap->version == 1) { for (;;) { if (!soap_getelement(soap, &t)) if (soap->error || soap_ignore_element(soap)) break; } } if (soap->error == SOAP_NO_TAG || soap->error == SOAP_EOF) soap->error = SOAP_OK; return soap->error; } #endif #ifndef WITH_NOIDREF SOAP_FMAC3 void * SOAP_FMAC4 soap_getelement(struct soap *soap, int *type) { (void)type; if (soap_peek_element(soap)) return NULL; if (!*soap->id || !(*type = soap_lookup_type(soap, soap->id))) *type = soap_lookup_type(soap, soap->href); switch (*type) { case SOAP_TYPE_byte: return soap_in_byte(soap, NULL, NULL, "xsd:byte"); case SOAP_TYPE_int: return soap_in_int(soap, NULL, NULL, "xsd:int"); case SOAP_TYPE_float: return soap_in_float(soap, NULL, NULL, "xsd:float"); case SOAP_TYPE_ns__getQuote: return soap_in_ns__getQuote(soap, NULL, NULL, "ns:getQuote"); case SOAP_TYPE_ns__getQuoteResponse: return soap_in_ns__getQuoteResponse(soap, NULL, NULL, "ns:getQuoteResponse"); case SOAP_TYPE_PointerTofloat: return soap_in_PointerTofloat(soap, NULL, NULL, "xsd:float"); case SOAP_TYPE__QName: { char **s; s = soap_in__QName(soap, NULL, NULL, "xsd:QName"); return s ? *s : NULL; } case SOAP_TYPE_string: { char **s; s = soap_in_string(soap, NULL, NULL, "xsd:string"); return s ? *s : NULL; } default: { const char *t = soap->type; if (!*t) t = soap->tag; if (!soap_match_tag(soap, t, "xsd:byte")) { *type = SOAP_TYPE_byte; return soap_in_byte(soap, NULL, NULL, NULL); } if (!soap_match_tag(soap, t, "xsd:int")) { *type = SOAP_TYPE_int; return soap_in_int(soap, NULL, NULL, NULL); } if (!soap_match_tag(soap, t, "xsd:float")) { *type = SOAP_TYPE_float; return soap_in_float(soap, NULL, NULL, NULL); } if (!soap_match_tag(soap, t, "ns:getQuote")) { *type = SOAP_TYPE_ns__getQuote; return soap_in_ns__getQuote(soap, NULL, NULL, NULL); } if (!soap_match_tag(soap, t, "ns:getQuoteResponse")) { *type = SOAP_TYPE_ns__getQuoteResponse; return soap_in_ns__getQuoteResponse(soap, NULL, NULL, NULL); } if (!soap_match_tag(soap, t, "xsd:QName")) { char **s; *type = SOAP_TYPE__QName; s = soap_in__QName(soap, NULL, NULL, NULL); return s ? *s : NULL; } if (!soap_match_tag(soap, t, "xsd:string")) { char **s; *type = SOAP_TYPE_string; s = soap_in_string(soap, NULL, NULL, NULL); return s ? *s : NULL; } t = soap->tag; } } soap->error = SOAP_TAG_MISMATCH; return NULL; } #endif SOAP_FMAC3 int SOAP_FMAC4 soap_ignore_element(struct soap *soap) { if (!soap_peek_element(soap)) { int t; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unexpected element '%s' in input (level=%u, %d)\n", soap->tag, soap->level, soap->body)); if (soap->mustUnderstand && !soap->other) return soap->error = SOAP_MUSTUNDERSTAND; if (((soap->mode & SOAP_XML_STRICT) && soap->part != SOAP_IN_HEADER) || !soap_match_tag(soap, soap->tag, "SOAP-ENV:")) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "REJECTING element '%s'\n", soap->tag)); return soap->error = SOAP_TAG_MISMATCH; } if (!*soap->id || !soap_getelement(soap, &t)) { soap->peeked = 0; if (soap->fignore) soap->error = soap->fignore(soap, soap->tag); else soap->error = SOAP_OK; DBGLOG(TEST, if (!soap->error) SOAP_MESSAGE(fdebug, "IGNORING element '%s'\n", soap->tag)); if (!soap->error && soap->body) { soap->level++; while (!soap_ignore_element(soap)) ; if (soap->error == SOAP_NO_TAG) soap->error = soap_element_end_in(soap, NULL); } } } return soap->error; } #ifndef WITH_NOIDREF SOAP_FMAC3 int SOAP_FMAC4 soap_putindependent(struct soap *soap) { int i; struct soap_plist *pp; if (soap->version == 1 && soap->encodingStyle && !(soap->mode & (SOAP_XML_TREE | SOAP_XML_GRAPH))) for (i = 0; i < SOAP_PTRHASH; i++) for (pp = soap->pht[i]; pp; pp = pp->next) if (pp->mark1 == 2 || pp->mark2 == 2) if (soap_putelement(soap, pp->ptr, "id", pp->id, pp->type)) return soap->error; return SOAP_OK; } #endif #ifndef WITH_NOIDREF SOAP_FMAC3 int SOAP_FMAC4 soap_putelement(struct soap *soap, const void *ptr, const char *tag, int id, int type) { (void)tag; switch (type) { case SOAP_TYPE_byte: return soap_out_byte(soap, tag, id, (const char *)ptr, "xsd:byte"); case SOAP_TYPE_int: return soap_out_int(soap, tag, id, (const int *)ptr, "xsd:int"); case SOAP_TYPE_float: return soap_out_float(soap, tag, id, (const float *)ptr, "xsd:float"); case SOAP_TYPE_ns__getQuote: return soap_out_ns__getQuote(soap, tag, id, (const struct ns__getQuote *)ptr, "ns:getQuote"); case SOAP_TYPE_ns__getQuoteResponse: return soap_out_ns__getQuoteResponse(soap, tag, id, (const struct ns__getQuoteResponse *)ptr, "ns:getQuoteResponse"); case SOAP_TYPE_PointerTofloat: return soap_out_PointerTofloat(soap, tag, id, (float *const*)ptr, "xsd:float"); case SOAP_TYPE__QName: return soap_out_string(soap, tag, id, (char*const*)&ptr, "xsd:QName"); case SOAP_TYPE_string: return soap_out_string(soap, tag, id, (char*const*)&ptr, "xsd:string"); } return SOAP_OK; } #endif #ifndef WITH_NOIDREF SOAP_FMAC3 void SOAP_FMAC4 soap_markelement(struct soap *soap, const void *ptr, int type) { (void)soap; (void)ptr; (void)type; /* appease -Wall -Werror */ switch (type) { case SOAP_TYPE_ns__getQuote: soap_serialize_ns__getQuote(soap, (const struct ns__getQuote *)ptr); break; case SOAP_TYPE_ns__getQuoteResponse: soap_serialize_ns__getQuoteResponse(soap, (const struct ns__getQuoteResponse *)ptr); break; case SOAP_TYPE_PointerTofloat: soap_serialize_PointerTofloat(soap, (float *const*)ptr); break; case SOAP_TYPE__QName: soap_serialize_string(soap, (char*const*)&ptr); break; case SOAP_TYPE_string: soap_serialize_string(soap, (char*const*)&ptr); break; } } #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_byte(struct soap *soap, char *a) { (void)soap; /* appease -Wall -Werror */ #ifdef SOAP_DEFAULT_byte *a = SOAP_DEFAULT_byte; #else *a = (char)0; #endif } SOAP_FMAC3 int SOAP_FMAC4 soap_out_byte(struct soap *soap, const char *tag, int id, const char *a, const char *type) { (void)soap; (void)type; (void)tag; (void)id; return soap_outbyte(soap, tag, id, a, type, SOAP_TYPE_byte); } SOAP_FMAC3 char * SOAP_FMAC4 soap_in_byte(struct soap *soap, const char *tag, char *a, const char *type) { char *p; p = soap_inbyte(soap, tag, a, type, SOAP_TYPE_byte); return p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_byte(struct soap *soap, const char *a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_byte); if (soap_out_byte(soap, tag?tag:"byte", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 char * SOAP_FMAC4 soap_get_byte(struct soap *soap, char *p, const char *tag, const char *type) { if ((p = soap_in_byte(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC3 void SOAP_FMAC4 soap_default_int(struct soap *soap, int *a) { (void)soap; /* appease -Wall -Werror */ #ifdef SOAP_DEFAULT_int *a = SOAP_DEFAULT_int; #else *a = (int)0; #endif } SOAP_FMAC3 int SOAP_FMAC4 soap_out_int(struct soap *soap, const char *tag, int id, const int *a, const char *type) { (void)soap; (void)type; (void)tag; (void)id; return soap_outint(soap, tag, id, a, type, SOAP_TYPE_int); } SOAP_FMAC3 int * SOAP_FMAC4 soap_in_int(struct soap *soap, const char *tag, int *a, const char *type) { int *p; p = soap_inint(soap, tag, a, type, SOAP_TYPE_int); return p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_int(struct soap *soap, const int *a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_int); if (soap_out_int(soap, tag?tag:"int", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 int * SOAP_FMAC4 soap_get_int(struct soap *soap, int *p, const char *tag, const char *type) { if ((p = soap_in_int(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC3 void SOAP_FMAC4 soap_default_float(struct soap *soap, float *a) { (void)soap; /* appease -Wall -Werror */ #ifdef SOAP_DEFAULT_float *a = SOAP_DEFAULT_float; #else *a = (float)0; #endif } SOAP_FMAC3 int SOAP_FMAC4 soap_out_float(struct soap *soap, const char *tag, int id, const float *a, const char *type) { (void)soap; (void)type; (void)tag; (void)id; return soap_outfloat(soap, tag, id, a, type, SOAP_TYPE_float); } SOAP_FMAC3 float * SOAP_FMAC4 soap_in_float(struct soap *soap, const char *tag, float *a, const char *type) { float *p; p = soap_infloat(soap, tag, a, type, SOAP_TYPE_float); return p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_float(struct soap *soap, const float *a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_float); if (soap_out_float(soap, tag?tag:"float", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 float * SOAP_FMAC4 soap_get_float(struct soap *soap, float *p, const char *tag, const char *type) { if ((p = soap_in_float(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } #ifndef WITH_NOGLOBAL SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Fault(struct soap *soap, struct SOAP_ENV__Fault *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_default__QName(soap, &a->faultcode); soap_default_string(soap, &a->faultstring); soap_default_string(soap, &a->faultactor); a->detail = NULL; a->SOAP_ENV__Code = NULL; a->SOAP_ENV__Reason = NULL; soap_default_string(soap, &a->SOAP_ENV__Node); soap_default_string(soap, &a->SOAP_ENV__Role); a->SOAP_ENV__Detail = NULL; } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Fault(struct soap *soap, const struct SOAP_ENV__Fault *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_serialize__QName(soap, &a->faultcode); soap_serialize_string(soap, &a->faultstring); soap_serialize_string(soap, &a->faultactor); soap_serialize_PointerToSOAP_ENV__Detail(soap, &a->detail); soap_serialize_PointerToSOAP_ENV__Code(soap, &a->SOAP_ENV__Code); soap_serialize_PointerToSOAP_ENV__Reason(soap, &a->SOAP_ENV__Reason); soap_serialize_string(soap, &a->SOAP_ENV__Node); soap_serialize_string(soap, &a->SOAP_ENV__Role); soap_serialize_PointerToSOAP_ENV__Detail(soap, &a->SOAP_ENV__Detail); } SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Fault(struct soap *soap, const char *tag, int id, const struct SOAP_ENV__Fault *a, const char *type) { const char *soap_tmp_faultcode = soap_QName2s(soap, a->faultcode); (void)soap; (void)tag; (void)id; (void)type; if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_SOAP_ENV__Fault), type)) return soap->error; if (soap_out__QName(soap, "faultcode", -1, (char*const*)&soap_tmp_faultcode, "")) return soap->error; if (soap_out_string(soap, "faultstring", -1, &a->faultstring, "")) return soap->error; if (soap_out_string(soap, "faultactor", -1, &a->faultactor, "")) return soap->error; if (soap_out_PointerToSOAP_ENV__Detail(soap, "detail", -1, &a->detail, "")) return soap->error; if (soap_out_PointerToSOAP_ENV__Code(soap, "SOAP-ENV:Code", -1, &a->SOAP_ENV__Code, "")) return soap->error; if (soap_out_PointerToSOAP_ENV__Reason(soap, "SOAP-ENV:Reason", -1, &a->SOAP_ENV__Reason, "")) return soap->error; if (soap_out_string(soap, "SOAP-ENV:Node", -1, &a->SOAP_ENV__Node, "")) return soap->error; if (soap_out_string(soap, "SOAP-ENV:Role", -1, &a->SOAP_ENV__Role, "")) return soap->error; if (soap_out_PointerToSOAP_ENV__Detail(soap, "SOAP-ENV:Detail", -1, &a->SOAP_ENV__Detail, "")) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct SOAP_ENV__Fault * SOAP_FMAC4 soap_in_SOAP_ENV__Fault(struct soap *soap, const char *tag, struct SOAP_ENV__Fault *a, const char *type) { size_t soap_flag_faultcode = 1; size_t soap_flag_faultstring = 1; size_t soap_flag_faultactor = 1; size_t soap_flag_detail = 1; size_t soap_flag_SOAP_ENV__Code = 1; size_t soap_flag_SOAP_ENV__Reason = 1; size_t soap_flag_SOAP_ENV__Node = 1; size_t soap_flag_SOAP_ENV__Role = 1; size_t soap_flag_SOAP_ENV__Detail = 1; if (soap_element_begin_in(soap, tag, 0, type)) return NULL; a = (struct SOAP_ENV__Fault *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_SOAP_ENV__Fault, sizeof(struct SOAP_ENV__Fault), 0, NULL, NULL, NULL); if (!a) return NULL; soap_default_SOAP_ENV__Fault(soap, a); if (soap->body && !*soap->href) { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_faultcode && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) if (soap_in__QName(soap, "faultcode", &a->faultcode, "")) { soap_flag_faultcode--; continue; } if (soap_flag_faultstring && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) if (soap_in_string(soap, "faultstring", &a->faultstring, "xsd:string")) { soap_flag_faultstring--; continue; } if (soap_flag_faultactor && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) if (soap_in_string(soap, "faultactor", &a->faultactor, "xsd:string")) { soap_flag_faultactor--; continue; } if (soap_flag_detail && soap->error == SOAP_TAG_MISMATCH) if (soap_in_PointerToSOAP_ENV__Detail(soap, "detail", &a->detail, "")) { soap_flag_detail--; continue; } if (soap_flag_SOAP_ENV__Code && soap->error == SOAP_TAG_MISMATCH) if (soap_in_PointerToSOAP_ENV__Code(soap, "SOAP-ENV:Code", &a->SOAP_ENV__Code, "")) { soap_flag_SOAP_ENV__Code--; continue; } if (soap_flag_SOAP_ENV__Reason && soap->error == SOAP_TAG_MISMATCH) if (soap_in_PointerToSOAP_ENV__Reason(soap, "SOAP-ENV:Reason", &a->SOAP_ENV__Reason, "")) { soap_flag_SOAP_ENV__Reason--; continue; } if (soap_flag_SOAP_ENV__Node && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) if (soap_in_string(soap, "SOAP-ENV:Node", &a->SOAP_ENV__Node, "xsd:string")) { soap_flag_SOAP_ENV__Node--; continue; } if (soap_flag_SOAP_ENV__Role && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) if (soap_in_string(soap, "SOAP-ENV:Role", &a->SOAP_ENV__Role, "xsd:string")) { soap_flag_SOAP_ENV__Role--; continue; } if (soap_flag_SOAP_ENV__Detail && soap->error == SOAP_TAG_MISMATCH) if (soap_in_PointerToSOAP_ENV__Detail(soap, "SOAP-ENV:Detail", &a->SOAP_ENV__Detail, "")) { soap_flag_SOAP_ENV__Detail--; continue; } if (soap->error == SOAP_TAG_MISMATCH) soap->error = soap_ignore_element(soap); if (soap->error == SOAP_NO_TAG) break; if (soap->error) return NULL; } if (soap_element_end_in(soap, tag)) return NULL; } else { a = (struct SOAP_ENV__Fault *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_SOAP_ENV__Fault, 0, sizeof(struct SOAP_ENV__Fault), 0, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Fault(struct soap *soap, const struct SOAP_ENV__Fault *a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_SOAP_ENV__Fault); if (soap_out_SOAP_ENV__Fault(soap, tag?tag:"SOAP-ENV:Fault", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct SOAP_ENV__Fault * SOAP_FMAC4 soap_get_SOAP_ENV__Fault(struct soap *soap, struct SOAP_ENV__Fault *p, const char *tag, const char *type) { if ((p = soap_in_SOAP_ENV__Fault(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } #endif #ifndef WITH_NOGLOBAL SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Reason(struct soap *soap, struct SOAP_ENV__Reason *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_default_string(soap, &a->SOAP_ENV__Text); } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Reason(struct soap *soap, const struct SOAP_ENV__Reason *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_serialize_string(soap, &a->SOAP_ENV__Text); } SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Reason(struct soap *soap, const char *tag, int id, const struct SOAP_ENV__Reason *a, const char *type) { (void)soap; (void)tag; (void)id; (void)type; if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_SOAP_ENV__Reason), type)) return soap->error; if (soap->lang) soap_set_attr(soap, "xml:lang", soap->lang, 1); if (soap_out_string(soap, "SOAP-ENV:Text", -1, &a->SOAP_ENV__Text, "")) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct SOAP_ENV__Reason * SOAP_FMAC4 soap_in_SOAP_ENV__Reason(struct soap *soap, const char *tag, struct SOAP_ENV__Reason *a, const char *type) { size_t soap_flag_SOAP_ENV__Text = 1; if (soap_element_begin_in(soap, tag, 0, type)) return NULL; a = (struct SOAP_ENV__Reason *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_SOAP_ENV__Reason, sizeof(struct SOAP_ENV__Reason), 0, NULL, NULL, NULL); if (!a) return NULL; soap_default_SOAP_ENV__Reason(soap, a); if (soap->body && !*soap->href) { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_SOAP_ENV__Text && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) if (soap_in_string(soap, "SOAP-ENV:Text", &a->SOAP_ENV__Text, "xsd:string")) { soap_flag_SOAP_ENV__Text--; continue; } if (soap->error == SOAP_TAG_MISMATCH) soap->error = soap_ignore_element(soap); if (soap->error == SOAP_NO_TAG) break; if (soap->error) return NULL; } if (soap_element_end_in(soap, tag)) return NULL; } else { a = (struct SOAP_ENV__Reason *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_SOAP_ENV__Reason, 0, sizeof(struct SOAP_ENV__Reason), 0, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Reason(struct soap *soap, const struct SOAP_ENV__Reason *a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_SOAP_ENV__Reason); if (soap_out_SOAP_ENV__Reason(soap, tag?tag:"SOAP-ENV:Reason", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct SOAP_ENV__Reason * SOAP_FMAC4 soap_get_SOAP_ENV__Reason(struct soap *soap, struct SOAP_ENV__Reason *p, const char *tag, const char *type) { if ((p = soap_in_SOAP_ENV__Reason(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } #endif #ifndef WITH_NOGLOBAL SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Detail(struct soap *soap, struct SOAP_ENV__Detail *a) { (void)soap; (void)a; /* appease -Wall -Werror */ a->__any = NULL; a->__type = 0; a->fault = NULL; } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Detail(struct soap *soap, const struct SOAP_ENV__Detail *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_markelement(soap, a->fault, a->__type); } SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Detail(struct soap *soap, const char *tag, int id, const struct SOAP_ENV__Detail *a, const char *type) { (void)soap; (void)tag; (void)id; (void)type; if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_SOAP_ENV__Detail), type)) return soap->error; soap_outliteral(soap, "-any", &a->__any, NULL); if (soap_putelement(soap, a->fault, "fault", -1, a->__type)) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct SOAP_ENV__Detail * SOAP_FMAC4 soap_in_SOAP_ENV__Detail(struct soap *soap, const char *tag, struct SOAP_ENV__Detail *a, const char *type) { size_t soap_flag___any = 1; size_t soap_flag_fault = 1; if (soap_element_begin_in(soap, tag, 0, type)) return NULL; a = (struct SOAP_ENV__Detail *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_SOAP_ENV__Detail, sizeof(struct SOAP_ENV__Detail), 0, NULL, NULL, NULL); if (!a) return NULL; soap_default_SOAP_ENV__Detail(soap, a); if (soap->body && !*soap->href) { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_fault && soap->error == SOAP_TAG_MISMATCH) if ((a->fault = soap_getelement(soap, &a->__type))) { soap_flag_fault = 0; continue; } if (soap_flag___any && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) if (soap_inliteral(soap, "-any", &a->__any)) { soap_flag___any--; continue; } if (soap->error == SOAP_TAG_MISMATCH) soap->error = soap_ignore_element(soap); if (soap->error == SOAP_NO_TAG) break; if (soap->error) return NULL; } if (soap_element_end_in(soap, tag)) return NULL; } else { a = (struct SOAP_ENV__Detail *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_SOAP_ENV__Detail, 0, sizeof(struct SOAP_ENV__Detail), 0, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Detail(struct soap *soap, const struct SOAP_ENV__Detail *a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_SOAP_ENV__Detail); if (soap_out_SOAP_ENV__Detail(soap, tag?tag:"SOAP-ENV:Detail", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct SOAP_ENV__Detail * SOAP_FMAC4 soap_get_SOAP_ENV__Detail(struct soap *soap, struct SOAP_ENV__Detail *p, const char *tag, const char *type) { if ((p = soap_in_SOAP_ENV__Detail(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } #endif #ifndef WITH_NOGLOBAL SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Code(struct soap *soap, struct SOAP_ENV__Code *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_default__QName(soap, &a->SOAP_ENV__Value); a->SOAP_ENV__Subcode = NULL; } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Code(struct soap *soap, const struct SOAP_ENV__Code *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_serialize__QName(soap, &a->SOAP_ENV__Value); soap_serialize_PointerToSOAP_ENV__Code(soap, &a->SOAP_ENV__Subcode); } SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Code(struct soap *soap, const char *tag, int id, const struct SOAP_ENV__Code *a, const char *type) { const char *soap_tmp_SOAP_ENV__Value = soap_QName2s(soap, a->SOAP_ENV__Value); (void)soap; (void)tag; (void)id; (void)type; if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_SOAP_ENV__Code), type)) return soap->error; if (soap_out__QName(soap, "SOAP-ENV:Value", -1, (char*const*)&soap_tmp_SOAP_ENV__Value, "")) return soap->error; if (soap_out_PointerToSOAP_ENV__Code(soap, "SOAP-ENV:Subcode", -1, &a->SOAP_ENV__Subcode, "")) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct SOAP_ENV__Code * SOAP_FMAC4 soap_in_SOAP_ENV__Code(struct soap *soap, const char *tag, struct SOAP_ENV__Code *a, const char *type) { size_t soap_flag_SOAP_ENV__Value = 1; size_t soap_flag_SOAP_ENV__Subcode = 1; if (soap_element_begin_in(soap, tag, 0, type)) return NULL; a = (struct SOAP_ENV__Code *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_SOAP_ENV__Code, sizeof(struct SOAP_ENV__Code), 0, NULL, NULL, NULL); if (!a) return NULL; soap_default_SOAP_ENV__Code(soap, a); if (soap->body && !*soap->href) { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_SOAP_ENV__Value && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) if (soap_in__QName(soap, "SOAP-ENV:Value", &a->SOAP_ENV__Value, "")) { soap_flag_SOAP_ENV__Value--; continue; } if (soap_flag_SOAP_ENV__Subcode && soap->error == SOAP_TAG_MISMATCH) if (soap_in_PointerToSOAP_ENV__Code(soap, "SOAP-ENV:Subcode", &a->SOAP_ENV__Subcode, "")) { soap_flag_SOAP_ENV__Subcode--; continue; } if (soap->error == SOAP_TAG_MISMATCH) soap->error = soap_ignore_element(soap); if (soap->error == SOAP_NO_TAG) break; if (soap->error) return NULL; } if (soap_element_end_in(soap, tag)) return NULL; } else { a = (struct SOAP_ENV__Code *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_SOAP_ENV__Code, 0, sizeof(struct SOAP_ENV__Code), 0, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Code(struct soap *soap, const struct SOAP_ENV__Code *a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_SOAP_ENV__Code); if (soap_out_SOAP_ENV__Code(soap, tag?tag:"SOAP-ENV:Code", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct SOAP_ENV__Code * SOAP_FMAC4 soap_get_SOAP_ENV__Code(struct soap *soap, struct SOAP_ENV__Code *p, const char *tag, const char *type) { if ((p = soap_in_SOAP_ENV__Code(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } #endif #ifndef WITH_NOGLOBAL SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Header(struct soap *soap, struct SOAP_ENV__Header *a) { (void)soap; (void)a; /* appease -Wall -Werror */ } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Header(struct soap *soap, const struct SOAP_ENV__Header *a) { (void)soap; (void)a; /* appease -Wall -Werror */ } SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Header(struct soap *soap, const char *tag, int id, const struct SOAP_ENV__Header *a, const char *type) { (void)soap; (void)tag; (void)id; (void)type; if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_SOAP_ENV__Header), type)) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct SOAP_ENV__Header * SOAP_FMAC4 soap_in_SOAP_ENV__Header(struct soap *soap, const char *tag, struct SOAP_ENV__Header *a, const char *type) { if (soap_element_begin_in(soap, tag, 0, type)) return NULL; a = (struct SOAP_ENV__Header *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_SOAP_ENV__Header, sizeof(struct SOAP_ENV__Header), 0, NULL, NULL, NULL); if (!a) return NULL; soap_default_SOAP_ENV__Header(soap, a); if (soap->body && !*soap->href) { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap->error == SOAP_TAG_MISMATCH) soap->error = soap_ignore_element(soap); if (soap->error == SOAP_NO_TAG) break; if (soap->error) return NULL; } if (soap_element_end_in(soap, tag)) return NULL; } else { a = (struct SOAP_ENV__Header *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_SOAP_ENV__Header, 0, sizeof(struct SOAP_ENV__Header), 0, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Header(struct soap *soap, const struct SOAP_ENV__Header *a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_SOAP_ENV__Header); if (soap_out_SOAP_ENV__Header(soap, tag?tag:"SOAP-ENV:Header", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct SOAP_ENV__Header * SOAP_FMAC4 soap_get_SOAP_ENV__Header(struct soap *soap, struct SOAP_ENV__Header *p, const char *tag, const char *type) { if ((p = soap_in_SOAP_ENV__Header(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__getQuote(struct soap *soap, struct ns__getQuote *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_default_string(soap, &a->symbol); } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__getQuote(struct soap *soap, const struct ns__getQuote *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_serialize_string(soap, &a->symbol); } SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__getQuote(struct soap *soap, const char *tag, int id, const struct ns__getQuote *a, const char *type) { (void)soap; (void)tag; (void)id; (void)type; if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns__getQuote), type)) return soap->error; if (soap_out_string(soap, "symbol", -1, &a->symbol, "")) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct ns__getQuote * SOAP_FMAC4 soap_in_ns__getQuote(struct soap *soap, const char *tag, struct ns__getQuote *a, const char *type) { size_t soap_flag_symbol = 1; if (soap_element_begin_in(soap, tag, 0, type)) return NULL; a = (struct ns__getQuote *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns__getQuote, sizeof(struct ns__getQuote), 0, NULL, NULL, NULL); if (!a) return NULL; soap_default_ns__getQuote(soap, a); if (soap->body && !*soap->href) { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_symbol && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) if (soap_in_string(soap, "symbol", &a->symbol, "xsd:string")) { soap_flag_symbol--; continue; } if (soap->error == SOAP_TAG_MISMATCH) soap->error = soap_ignore_element(soap); if (soap->error == SOAP_NO_TAG) break; if (soap->error) return NULL; } if (soap_element_end_in(soap, tag)) return NULL; } else { a = (struct ns__getQuote *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns__getQuote, 0, sizeof(struct ns__getQuote), 0, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__getQuote(struct soap *soap, const struct ns__getQuote *a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_ns__getQuote); if (soap_out_ns__getQuote(soap, tag?tag:"ns:getQuote", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct ns__getQuote * SOAP_FMAC4 soap_get_ns__getQuote(struct soap *soap, struct ns__getQuote *p, const char *tag, const char *type) { if ((p = soap_in_ns__getQuote(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__getQuoteResponse(struct soap *soap, struct ns__getQuoteResponse *a) { (void)soap; (void)a; /* appease -Wall -Werror */ a->Result = NULL; } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__getQuoteResponse(struct soap *soap, const struct ns__getQuoteResponse *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_serialize_PointerTofloat(soap, &a->Result); } SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__getQuoteResponse(struct soap *soap, const char *tag, int id, const struct ns__getQuoteResponse *a, const char *type) { (void)soap; (void)tag; (void)id; (void)type; if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns__getQuoteResponse), type)) return soap->error; if (soap_out_PointerTofloat(soap, "Result", -1, &a->Result, "")) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct ns__getQuoteResponse * SOAP_FMAC4 soap_in_ns__getQuoteResponse(struct soap *soap, const char *tag, struct ns__getQuoteResponse *a, const char *type) { size_t soap_flag_Result = 1; if (soap_element_begin_in(soap, tag, 0, type)) return NULL; a = (struct ns__getQuoteResponse *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns__getQuoteResponse, sizeof(struct ns__getQuoteResponse), 0, NULL, NULL, NULL); if (!a) return NULL; soap_default_ns__getQuoteResponse(soap, a); if (soap->body && !*soap->href) { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_Result && soap->error == SOAP_TAG_MISMATCH) if (soap_in_PointerTofloat(soap, "Result", &a->Result, "xsd:float")) { soap_flag_Result--; continue; } if (soap->error == SOAP_TAG_MISMATCH) soap->error = soap_ignore_element(soap); if (soap->error == SOAP_NO_TAG) break; if (soap->error) return NULL; } if (soap_element_end_in(soap, tag)) return NULL; } else { a = (struct ns__getQuoteResponse *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns__getQuoteResponse, 0, sizeof(struct ns__getQuoteResponse), 0, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__getQuoteResponse(struct soap *soap, const struct ns__getQuoteResponse *a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_ns__getQuoteResponse); if (soap_out_ns__getQuoteResponse(soap, tag?tag:"ns:getQuoteResponse", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct ns__getQuoteResponse * SOAP_FMAC4 soap_get_ns__getQuoteResponse(struct soap *soap, struct ns__getQuoteResponse *p, const char *tag, const char *type) { if ((p = soap_in_ns__getQuoteResponse(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } #ifndef WITH_NOGLOBAL SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToSOAP_ENV__Reason(struct soap *soap, struct SOAP_ENV__Reason *const*a) { if (!soap_reference(soap, *a, SOAP_TYPE_SOAP_ENV__Reason)) soap_serialize_SOAP_ENV__Reason(soap, *a); } SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerToSOAP_ENV__Reason(struct soap *soap, const char *tag, int id, struct SOAP_ENV__Reason *const*a, const char *type) { id = soap_element_id(soap, tag, id, *a, NULL, 0, type, SOAP_TYPE_SOAP_ENV__Reason); if (id < 0) return soap->error; return soap_out_SOAP_ENV__Reason(soap, tag, id, *a, type); } SOAP_FMAC3 struct SOAP_ENV__Reason ** SOAP_FMAC4 soap_in_PointerToSOAP_ENV__Reason(struct soap *soap, const char *tag, struct SOAP_ENV__Reason **a, const char *type) { if (soap_element_begin_in(soap, tag, 1, NULL)) return NULL; if (!a) if (!(a = (struct SOAP_ENV__Reason **)soap_malloc(soap, sizeof(struct SOAP_ENV__Reason *)))) return NULL; *a = NULL; if (!soap->null && *soap->href != '#') { soap_revert(soap); if (!(*a = soap_in_SOAP_ENV__Reason(soap, tag, *a, type))) return NULL; } else { a = (struct SOAP_ENV__Reason **)soap_id_lookup(soap, soap->href, (void**)a, SOAP_TYPE_SOAP_ENV__Reason, sizeof(struct SOAP_ENV__Reason), 0); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerToSOAP_ENV__Reason(struct soap *soap, struct SOAP_ENV__Reason *const*a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_PointerToSOAP_ENV__Reason); if (soap_out_PointerToSOAP_ENV__Reason(soap, tag?tag:"SOAP-ENV:Reason", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct SOAP_ENV__Reason ** SOAP_FMAC4 soap_get_PointerToSOAP_ENV__Reason(struct soap *soap, struct SOAP_ENV__Reason **p, const char *tag, const char *type) { if ((p = soap_in_PointerToSOAP_ENV__Reason(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } #endif #ifndef WITH_NOGLOBAL SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToSOAP_ENV__Detail(struct soap *soap, struct SOAP_ENV__Detail *const*a) { if (!soap_reference(soap, *a, SOAP_TYPE_SOAP_ENV__Detail)) soap_serialize_SOAP_ENV__Detail(soap, *a); } SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerToSOAP_ENV__Detail(struct soap *soap, const char *tag, int id, struct SOAP_ENV__Detail *const*a, const char *type) { id = soap_element_id(soap, tag, id, *a, NULL, 0, type, SOAP_TYPE_SOAP_ENV__Detail); if (id < 0) return soap->error; return soap_out_SOAP_ENV__Detail(soap, tag, id, *a, type); } SOAP_FMAC3 struct SOAP_ENV__Detail ** SOAP_FMAC4 soap_in_PointerToSOAP_ENV__Detail(struct soap *soap, const char *tag, struct SOAP_ENV__Detail **a, const char *type) { if (soap_element_begin_in(soap, tag, 1, NULL)) return NULL; if (!a) if (!(a = (struct SOAP_ENV__Detail **)soap_malloc(soap, sizeof(struct SOAP_ENV__Detail *)))) return NULL; *a = NULL; if (!soap->null && *soap->href != '#') { soap_revert(soap); if (!(*a = soap_in_SOAP_ENV__Detail(soap, tag, *a, type))) return NULL; } else { a = (struct SOAP_ENV__Detail **)soap_id_lookup(soap, soap->href, (void**)a, SOAP_TYPE_SOAP_ENV__Detail, sizeof(struct SOAP_ENV__Detail), 0); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerToSOAP_ENV__Detail(struct soap *soap, struct SOAP_ENV__Detail *const*a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_PointerToSOAP_ENV__Detail); if (soap_out_PointerToSOAP_ENV__Detail(soap, tag?tag:"SOAP-ENV:Detail", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct SOAP_ENV__Detail ** SOAP_FMAC4 soap_get_PointerToSOAP_ENV__Detail(struct soap *soap, struct SOAP_ENV__Detail **p, const char *tag, const char *type) { if ((p = soap_in_PointerToSOAP_ENV__Detail(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } #endif #ifndef WITH_NOGLOBAL SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToSOAP_ENV__Code(struct soap *soap, struct SOAP_ENV__Code *const*a) { if (!soap_reference(soap, *a, SOAP_TYPE_SOAP_ENV__Code)) soap_serialize_SOAP_ENV__Code(soap, *a); } SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerToSOAP_ENV__Code(struct soap *soap, const char *tag, int id, struct SOAP_ENV__Code *const*a, const char *type) { id = soap_element_id(soap, tag, id, *a, NULL, 0, type, SOAP_TYPE_SOAP_ENV__Code); if (id < 0) return soap->error; return soap_out_SOAP_ENV__Code(soap, tag, id, *a, type); } SOAP_FMAC3 struct SOAP_ENV__Code ** SOAP_FMAC4 soap_in_PointerToSOAP_ENV__Code(struct soap *soap, const char *tag, struct SOAP_ENV__Code **a, const char *type) { if (soap_element_begin_in(soap, tag, 1, NULL)) return NULL; if (!a) if (!(a = (struct SOAP_ENV__Code **)soap_malloc(soap, sizeof(struct SOAP_ENV__Code *)))) return NULL; *a = NULL; if (!soap->null && *soap->href != '#') { soap_revert(soap); if (!(*a = soap_in_SOAP_ENV__Code(soap, tag, *a, type))) return NULL; } else { a = (struct SOAP_ENV__Code **)soap_id_lookup(soap, soap->href, (void**)a, SOAP_TYPE_SOAP_ENV__Code, sizeof(struct SOAP_ENV__Code), 0); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerToSOAP_ENV__Code(struct soap *soap, struct SOAP_ENV__Code *const*a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_PointerToSOAP_ENV__Code); if (soap_out_PointerToSOAP_ENV__Code(soap, tag?tag:"SOAP-ENV:Code", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct SOAP_ENV__Code ** SOAP_FMAC4 soap_get_PointerToSOAP_ENV__Code(struct soap *soap, struct SOAP_ENV__Code **p, const char *tag, const char *type) { if ((p = soap_in_PointerToSOAP_ENV__Code(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } #endif SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTofloat(struct soap *soap, float *const*a) { soap_reference(soap, *a, SOAP_TYPE_float); } SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTofloat(struct soap *soap, const char *tag, int id, float *const*a, const char *type) { id = soap_element_id(soap, tag, id, *a, NULL, 0, type, SOAP_TYPE_float); if (id < 0) return soap->error; return soap_out_float(soap, tag, id, *a, type); } SOAP_FMAC3 float ** SOAP_FMAC4 soap_in_PointerTofloat(struct soap *soap, const char *tag, float **a, const char *type) { if (soap_element_begin_in(soap, tag, 1, NULL)) return NULL; if (!a) if (!(a = (float **)soap_malloc(soap, sizeof(float *)))) return NULL; *a = NULL; if (!soap->null && *soap->href != '#') { soap_revert(soap); if (!(*a = soap_in_float(soap, tag, *a, type))) return NULL; } else { a = (float **)soap_id_lookup(soap, soap->href, (void**)a, SOAP_TYPE_float, sizeof(float), 0); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTofloat(struct soap *soap, float *const*a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_PointerTofloat); if (soap_out_PointerTofloat(soap, tag?tag:"float", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 float ** SOAP_FMAC4 soap_get_PointerTofloat(struct soap *soap, float **p, const char *tag, const char *type) { if ((p = soap_in_PointerTofloat(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC3 int SOAP_FMAC4 soap_out__QName(struct soap *soap, const char *tag, int id, char *const*a, const char *type) { return soap_outstring(soap, tag, id, a, type, SOAP_TYPE__QName); } SOAP_FMAC3 char * * SOAP_FMAC4 soap_in__QName(struct soap *soap, const char *tag, char **a, const char *type) { char **p; p = soap_instring(soap, tag, a, type, SOAP_TYPE__QName, 2, 0, -1); return p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put__QName(struct soap *soap, char *const*a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE__QName); if (soap_out__QName(soap, tag?tag:"byte", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 char ** SOAP_FMAC4 soap_get__QName(struct soap *soap, char **p, const char *tag, const char *type) { if ((p = soap_in__QName(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC3 void SOAP_FMAC4 soap_default_string(struct soap *soap, char **a) { (void)soap; /* appease -Wall -Werror */ #ifdef SOAP_DEFAULT_string *a = SOAP_DEFAULT_string; #else *a = (char *)0; #endif } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_string(struct soap *soap, char *const*a) { soap_reference(soap, *a, SOAP_TYPE_string); } SOAP_FMAC3 int SOAP_FMAC4 soap_out_string(struct soap *soap, const char *tag, int id, char *const*a, const char *type) { return soap_outstring(soap, tag, id, a, type, SOAP_TYPE_string); } SOAP_FMAC3 char * * SOAP_FMAC4 soap_in_string(struct soap *soap, const char *tag, char **a, const char *type) { char **p; p = soap_instring(soap, tag, a, type, SOAP_TYPE_string, 1, 0, -1); return p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_string(struct soap *soap, char *const*a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_string); if (soap_out_string(soap, tag?tag:"byte", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 char ** SOAP_FMAC4 soap_get_string(struct soap *soap, char **p, const char *tag, const char *type) { if ((p = soap_in_string(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } #ifdef __cplusplus } #endif #if defined(__BORLANDC__) #pragma option pop #pragma option pop #endif /* End of quoteC.c */ gsoap-2.8.28/gsoap/samples/chaining/calcServerLib.c0000644000175000017500000000134412653650154021516 0ustar ellertellert/* calcServerLib.c Generated by gSOAP 2.8.8 from calc.h Copyright(C) 2000-2012, Robert van Engelen, Genivia Inc. All Rights Reserved. The generated code is released under one of the following licenses: 1) GPL or 2) Genivia's license for commercial use. This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. */ /** Use this file in your project build instead of the two files calcC.c and calcServer.c. This hides the serializer functions and avoids linking problems when linking multiple clients and servers. */ #ifndef WITH_NOGLOBAL #define WITH_NOGLOBAL #endif #define SOAP_FMAC3 static #include "calcC.c" #include "calcServer.c" /* End of calcServerLib.c */ gsoap-2.8.28/gsoap/samples/chaining/quoteH.h0000644000175000017500000004604012653650154020252 0ustar ellertellert/* quoteH.h Generated by gSOAP 2.8.8 from quote.h Copyright(C) 2000-2012, Robert van Engelen, Genivia Inc. All Rights Reserved. The generated code is released under one of the following licenses: 1) GPL or 2) Genivia's license for commercial use. This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. */ #ifndef quoteH_H #define quoteH_H #include "quoteStub.h" #ifdef __cplusplus extern "C" { #endif #ifndef WITH_NOIDREF SOAP_FMAC3 void SOAP_FMAC4 soap_markelement(struct soap*, const void*, int); SOAP_FMAC3 int SOAP_FMAC4 soap_putelement(struct soap*, const void*, const char*, int, int); SOAP_FMAC3 void *SOAP_FMAC4 soap_getelement(struct soap*, int*); SOAP_FMAC3 int SOAP_FMAC4 soap_putindependent(struct soap*); SOAP_FMAC3 int SOAP_FMAC4 soap_getindependent(struct soap*); #endif SOAP_FMAC3 int SOAP_FMAC4 soap_ignore_element(struct soap*); #ifndef SOAP_TYPE_byte #define SOAP_TYPE_byte (3) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_byte(struct soap*, char *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_byte(struct soap*, const char*, int, const char *, const char*); SOAP_FMAC3 char * SOAP_FMAC4 soap_in_byte(struct soap*, const char*, char *, const char*); #ifndef soap_write_byte #define soap_write_byte(soap, data) ( soap_begin_send(soap) || soap_put_byte(soap, data, "byte", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_byte(struct soap*, const char *, const char*, const char*); #ifndef soap_read_byte #define soap_read_byte(soap, data) ( soap_begin_recv(soap) || !soap_get_byte(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 char * SOAP_FMAC4 soap_get_byte(struct soap*, char *, const char*, const char*); #ifndef SOAP_TYPE_int #define SOAP_TYPE_int (1) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_int(struct soap*, int *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_int(struct soap*, const char*, int, const int *, const char*); SOAP_FMAC3 int * SOAP_FMAC4 soap_in_int(struct soap*, const char*, int *, const char*); #ifndef soap_write_int #define soap_write_int(soap, data) ( soap_begin_send(soap) || soap_put_int(soap, data, "int", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_int(struct soap*, const int *, const char*, const char*); #ifndef soap_read_int #define soap_read_int(soap, data) ( soap_begin_recv(soap) || !soap_get_int(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 int * SOAP_FMAC4 soap_get_int(struct soap*, int *, const char*, const char*); #ifndef SOAP_TYPE_float #define SOAP_TYPE_float (7) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_float(struct soap*, float *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_float(struct soap*, const char*, int, const float *, const char*); SOAP_FMAC3 float * SOAP_FMAC4 soap_in_float(struct soap*, const char*, float *, const char*); #ifndef soap_write_float #define soap_write_float(soap, data) ( soap_begin_send(soap) || soap_put_float(soap, data, "float", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_float(struct soap*, const float *, const char*, const char*); #ifndef soap_read_float #define soap_read_float(soap, data) ( soap_begin_recv(soap) || !soap_get_float(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 float * SOAP_FMAC4 soap_get_float(struct soap*, float *, const char*, const char*); #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_SOAP_ENV__Fault #define SOAP_TYPE_SOAP_ENV__Fault (19) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Fault(struct soap*, struct SOAP_ENV__Fault *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Fault(struct soap*, const struct SOAP_ENV__Fault *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Fault(struct soap*, const char*, int, const struct SOAP_ENV__Fault *, const char*); SOAP_FMAC3 struct SOAP_ENV__Fault * SOAP_FMAC4 soap_in_SOAP_ENV__Fault(struct soap*, const char*, struct SOAP_ENV__Fault *, const char*); #ifndef soap_write_SOAP_ENV__Fault #define soap_write_SOAP_ENV__Fault(soap, data) ( soap_begin_send(soap) || (soap_serialize_SOAP_ENV__Fault(soap, data), 0) || soap_put_SOAP_ENV__Fault(soap, data, "SOAP-ENV:Fault", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Fault(struct soap*, const struct SOAP_ENV__Fault *, const char*, const char*); #ifndef soap_read_SOAP_ENV__Fault #define soap_read_SOAP_ENV__Fault(soap, data) ( soap_begin_recv(soap) || !soap_get_SOAP_ENV__Fault(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 struct SOAP_ENV__Fault * SOAP_FMAC4 soap_get_SOAP_ENV__Fault(struct soap*, struct SOAP_ENV__Fault *, const char*, const char*); #endif #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_SOAP_ENV__Reason #define SOAP_TYPE_SOAP_ENV__Reason (18) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Reason(struct soap*, struct SOAP_ENV__Reason *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Reason(struct soap*, const struct SOAP_ENV__Reason *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Reason(struct soap*, const char*, int, const struct SOAP_ENV__Reason *, const char*); SOAP_FMAC3 struct SOAP_ENV__Reason * SOAP_FMAC4 soap_in_SOAP_ENV__Reason(struct soap*, const char*, struct SOAP_ENV__Reason *, const char*); #ifndef soap_write_SOAP_ENV__Reason #define soap_write_SOAP_ENV__Reason(soap, data) ( soap_begin_send(soap) || (soap_serialize_SOAP_ENV__Reason(soap, data), 0) || soap_put_SOAP_ENV__Reason(soap, data, "SOAP-ENV:Reason", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Reason(struct soap*, const struct SOAP_ENV__Reason *, const char*, const char*); #ifndef soap_read_SOAP_ENV__Reason #define soap_read_SOAP_ENV__Reason(soap, data) ( soap_begin_recv(soap) || !soap_get_SOAP_ENV__Reason(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 struct SOAP_ENV__Reason * SOAP_FMAC4 soap_get_SOAP_ENV__Reason(struct soap*, struct SOAP_ENV__Reason *, const char*, const char*); #endif #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_SOAP_ENV__Detail #define SOAP_TYPE_SOAP_ENV__Detail (15) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Detail(struct soap*, struct SOAP_ENV__Detail *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Detail(struct soap*, const struct SOAP_ENV__Detail *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Detail(struct soap*, const char*, int, const struct SOAP_ENV__Detail *, const char*); SOAP_FMAC3 struct SOAP_ENV__Detail * SOAP_FMAC4 soap_in_SOAP_ENV__Detail(struct soap*, const char*, struct SOAP_ENV__Detail *, const char*); #ifndef soap_write_SOAP_ENV__Detail #define soap_write_SOAP_ENV__Detail(soap, data) ( soap_begin_send(soap) || (soap_serialize_SOAP_ENV__Detail(soap, data), 0) || soap_put_SOAP_ENV__Detail(soap, data, "SOAP-ENV:Detail", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Detail(struct soap*, const struct SOAP_ENV__Detail *, const char*, const char*); #ifndef soap_read_SOAP_ENV__Detail #define soap_read_SOAP_ENV__Detail(soap, data) ( soap_begin_recv(soap) || !soap_get_SOAP_ENV__Detail(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 struct SOAP_ENV__Detail * SOAP_FMAC4 soap_get_SOAP_ENV__Detail(struct soap*, struct SOAP_ENV__Detail *, const char*, const char*); #endif #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_SOAP_ENV__Code #define SOAP_TYPE_SOAP_ENV__Code (13) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Code(struct soap*, struct SOAP_ENV__Code *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Code(struct soap*, const struct SOAP_ENV__Code *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Code(struct soap*, const char*, int, const struct SOAP_ENV__Code *, const char*); SOAP_FMAC3 struct SOAP_ENV__Code * SOAP_FMAC4 soap_in_SOAP_ENV__Code(struct soap*, const char*, struct SOAP_ENV__Code *, const char*); #ifndef soap_write_SOAP_ENV__Code #define soap_write_SOAP_ENV__Code(soap, data) ( soap_begin_send(soap) || (soap_serialize_SOAP_ENV__Code(soap, data), 0) || soap_put_SOAP_ENV__Code(soap, data, "SOAP-ENV:Code", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Code(struct soap*, const struct SOAP_ENV__Code *, const char*, const char*); #ifndef soap_read_SOAP_ENV__Code #define soap_read_SOAP_ENV__Code(soap, data) ( soap_begin_recv(soap) || !soap_get_SOAP_ENV__Code(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 struct SOAP_ENV__Code * SOAP_FMAC4 soap_get_SOAP_ENV__Code(struct soap*, struct SOAP_ENV__Code *, const char*, const char*); #endif #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_SOAP_ENV__Header #define SOAP_TYPE_SOAP_ENV__Header (12) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Header(struct soap*, struct SOAP_ENV__Header *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Header(struct soap*, const struct SOAP_ENV__Header *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Header(struct soap*, const char*, int, const struct SOAP_ENV__Header *, const char*); SOAP_FMAC3 struct SOAP_ENV__Header * SOAP_FMAC4 soap_in_SOAP_ENV__Header(struct soap*, const char*, struct SOAP_ENV__Header *, const char*); #ifndef soap_write_SOAP_ENV__Header #define soap_write_SOAP_ENV__Header(soap, data) ( soap_begin_send(soap) || (soap_serialize_SOAP_ENV__Header(soap, data), 0) || soap_put_SOAP_ENV__Header(soap, data, "SOAP-ENV:Header", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Header(struct soap*, const struct SOAP_ENV__Header *, const char*, const char*); #ifndef soap_read_SOAP_ENV__Header #define soap_read_SOAP_ENV__Header(soap, data) ( soap_begin_recv(soap) || !soap_get_SOAP_ENV__Header(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 struct SOAP_ENV__Header * SOAP_FMAC4 soap_get_SOAP_ENV__Header(struct soap*, struct SOAP_ENV__Header *, const char*, const char*); #endif #ifndef SOAP_TYPE_ns__getQuote #define SOAP_TYPE_ns__getQuote (11) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__getQuote(struct soap*, struct ns__getQuote *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__getQuote(struct soap*, const struct ns__getQuote *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__getQuote(struct soap*, const char*, int, const struct ns__getQuote *, const char*); SOAP_FMAC3 struct ns__getQuote * SOAP_FMAC4 soap_in_ns__getQuote(struct soap*, const char*, struct ns__getQuote *, const char*); #ifndef soap_write_ns__getQuote #define soap_write_ns__getQuote(soap, data) ( soap_begin_send(soap) || (soap_serialize_ns__getQuote(soap, data), 0) || soap_put_ns__getQuote(soap, data, "ns:getQuote", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__getQuote(struct soap*, const struct ns__getQuote *, const char*, const char*); #ifndef soap_read_ns__getQuote #define soap_read_ns__getQuote(soap, data) ( soap_begin_recv(soap) || !soap_get_ns__getQuote(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 struct ns__getQuote * SOAP_FMAC4 soap_get_ns__getQuote(struct soap*, struct ns__getQuote *, const char*, const char*); #ifndef SOAP_TYPE_ns__getQuoteResponse #define SOAP_TYPE_ns__getQuoteResponse (10) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__getQuoteResponse(struct soap*, struct ns__getQuoteResponse *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__getQuoteResponse(struct soap*, const struct ns__getQuoteResponse *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__getQuoteResponse(struct soap*, const char*, int, const struct ns__getQuoteResponse *, const char*); SOAP_FMAC3 struct ns__getQuoteResponse * SOAP_FMAC4 soap_in_ns__getQuoteResponse(struct soap*, const char*, struct ns__getQuoteResponse *, const char*); #ifndef soap_write_ns__getQuoteResponse #define soap_write_ns__getQuoteResponse(soap, data) ( soap_begin_send(soap) || (soap_serialize_ns__getQuoteResponse(soap, data), 0) || soap_put_ns__getQuoteResponse(soap, data, "ns:getQuoteResponse", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__getQuoteResponse(struct soap*, const struct ns__getQuoteResponse *, const char*, const char*); #ifndef soap_read_ns__getQuoteResponse #define soap_read_ns__getQuoteResponse(soap, data) ( soap_begin_recv(soap) || !soap_get_ns__getQuoteResponse(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 struct ns__getQuoteResponse * SOAP_FMAC4 soap_get_ns__getQuoteResponse(struct soap*, struct ns__getQuoteResponse *, const char*, const char*); #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_PointerToSOAP_ENV__Reason #define SOAP_TYPE_PointerToSOAP_ENV__Reason (21) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToSOAP_ENV__Reason(struct soap*, struct SOAP_ENV__Reason *const*); SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerToSOAP_ENV__Reason(struct soap*, const char *, int, struct SOAP_ENV__Reason *const*, const char *); SOAP_FMAC3 struct SOAP_ENV__Reason ** SOAP_FMAC4 soap_in_PointerToSOAP_ENV__Reason(struct soap*, const char*, struct SOAP_ENV__Reason **, const char*); #ifndef soap_write_PointerToSOAP_ENV__Reason #define soap_write_PointerToSOAP_ENV__Reason(soap, data) ( soap_begin_send(soap) || (soap_serialize_PointerToSOAP_ENV__Reason(soap, data), 0) || soap_put_PointerToSOAP_ENV__Reason(soap, data, "SOAP-ENV:Reason", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerToSOAP_ENV__Reason(struct soap*, struct SOAP_ENV__Reason *const*, const char*, const char*); #ifndef soap_read_PointerToSOAP_ENV__Reason #define soap_read_PointerToSOAP_ENV__Reason(soap, data) ( soap_begin_recv(soap) || !soap_get_PointerToSOAP_ENV__Reason(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 struct SOAP_ENV__Reason ** SOAP_FMAC4 soap_get_PointerToSOAP_ENV__Reason(struct soap*, struct SOAP_ENV__Reason **, const char*, const char*); #endif #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_PointerToSOAP_ENV__Detail #define SOAP_TYPE_PointerToSOAP_ENV__Detail (20) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToSOAP_ENV__Detail(struct soap*, struct SOAP_ENV__Detail *const*); SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerToSOAP_ENV__Detail(struct soap*, const char *, int, struct SOAP_ENV__Detail *const*, const char *); SOAP_FMAC3 struct SOAP_ENV__Detail ** SOAP_FMAC4 soap_in_PointerToSOAP_ENV__Detail(struct soap*, const char*, struct SOAP_ENV__Detail **, const char*); #ifndef soap_write_PointerToSOAP_ENV__Detail #define soap_write_PointerToSOAP_ENV__Detail(soap, data) ( soap_begin_send(soap) || (soap_serialize_PointerToSOAP_ENV__Detail(soap, data), 0) || soap_put_PointerToSOAP_ENV__Detail(soap, data, "SOAP-ENV:Detail", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerToSOAP_ENV__Detail(struct soap*, struct SOAP_ENV__Detail *const*, const char*, const char*); #ifndef soap_read_PointerToSOAP_ENV__Detail #define soap_read_PointerToSOAP_ENV__Detail(soap, data) ( soap_begin_recv(soap) || !soap_get_PointerToSOAP_ENV__Detail(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 struct SOAP_ENV__Detail ** SOAP_FMAC4 soap_get_PointerToSOAP_ENV__Detail(struct soap*, struct SOAP_ENV__Detail **, const char*, const char*); #endif #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_PointerToSOAP_ENV__Code #define SOAP_TYPE_PointerToSOAP_ENV__Code (14) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToSOAP_ENV__Code(struct soap*, struct SOAP_ENV__Code *const*); SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerToSOAP_ENV__Code(struct soap*, const char *, int, struct SOAP_ENV__Code *const*, const char *); SOAP_FMAC3 struct SOAP_ENV__Code ** SOAP_FMAC4 soap_in_PointerToSOAP_ENV__Code(struct soap*, const char*, struct SOAP_ENV__Code **, const char*); #ifndef soap_write_PointerToSOAP_ENV__Code #define soap_write_PointerToSOAP_ENV__Code(soap, data) ( soap_begin_send(soap) || (soap_serialize_PointerToSOAP_ENV__Code(soap, data), 0) || soap_put_PointerToSOAP_ENV__Code(soap, data, "SOAP-ENV:Code", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerToSOAP_ENV__Code(struct soap*, struct SOAP_ENV__Code *const*, const char*, const char*); #ifndef soap_read_PointerToSOAP_ENV__Code #define soap_read_PointerToSOAP_ENV__Code(soap, data) ( soap_begin_recv(soap) || !soap_get_PointerToSOAP_ENV__Code(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 struct SOAP_ENV__Code ** SOAP_FMAC4 soap_get_PointerToSOAP_ENV__Code(struct soap*, struct SOAP_ENV__Code **, const char*, const char*); #endif #ifndef SOAP_TYPE_PointerTofloat #define SOAP_TYPE_PointerTofloat (8) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTofloat(struct soap*, float *const*); SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTofloat(struct soap*, const char *, int, float *const*, const char *); SOAP_FMAC3 float ** SOAP_FMAC4 soap_in_PointerTofloat(struct soap*, const char*, float **, const char*); #ifndef soap_write_PointerTofloat #define soap_write_PointerTofloat(soap, data) ( soap_begin_send(soap) || (soap_serialize_PointerTofloat(soap, data), 0) || soap_put_PointerTofloat(soap, data, "float", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTofloat(struct soap*, float *const*, const char*, const char*); #ifndef soap_read_PointerTofloat #define soap_read_PointerTofloat(soap, data) ( soap_begin_recv(soap) || !soap_get_PointerTofloat(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 float ** SOAP_FMAC4 soap_get_PointerTofloat(struct soap*, float **, const char*, const char*); #ifndef SOAP_TYPE__QName #define SOAP_TYPE__QName (5) #endif #define soap_default__QName(soap, a) soap_default_string(soap, a) #define soap_serialize__QName(soap, a) soap_serialize_string(soap, a) SOAP_FMAC3 int SOAP_FMAC4 soap_out__QName(struct soap*, const char*, int, char*const*, const char*); SOAP_FMAC3 char * * SOAP_FMAC4 soap_in__QName(struct soap*, const char*, char **, const char*); #ifndef soap_write__QName #define soap_write__QName(soap, data) ( soap_begin_send(soap) || (soap_serialize__QName(soap, data), 0) || soap_put__QName(soap, data, "byte", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put__QName(struct soap*, char *const*, const char*, const char*); #ifndef soap_read__QName #define soap_read__QName(soap, data) ( soap_begin_recv(soap) || !soap_get__QName(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 char ** SOAP_FMAC4 soap_get__QName(struct soap*, char **, const char*, const char*); #ifndef SOAP_TYPE_string #define SOAP_TYPE_string (4) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_string(struct soap*, char **); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_string(struct soap*, char *const*); SOAP_FMAC3 int SOAP_FMAC4 soap_out_string(struct soap*, const char*, int, char*const*, const char*); SOAP_FMAC3 char * * SOAP_FMAC4 soap_in_string(struct soap*, const char*, char **, const char*); #ifndef soap_write_string #define soap_write_string(soap, data) ( soap_begin_send(soap) || (soap_serialize_string(soap, data), 0) || soap_put_string(soap, data, "byte", NULL) || soap_end_send(soap) ) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_put_string(struct soap*, char *const*, const char*, const char*); #ifndef soap_read_string #define soap_read_string(soap, data) ( soap_begin_recv(soap) || !soap_get_string(soap, data, NULL, NULL) || soap_end_recv(soap) ) #endif SOAP_FMAC3 char ** SOAP_FMAC4 soap_get_string(struct soap*, char **, const char*, const char*); #ifdef __cplusplus } #endif #endif /* End of quoteH.h */ gsoap-2.8.28/gsoap/samples/chaining/quoteServer.c0000644000175000017500000000641612653650154021327 0ustar ellertellert/* quoteServer.c Generated by gSOAP 2.8.8 from quote.h Copyright(C) 2000-2012, Robert van Engelen, Genivia Inc. All Rights Reserved. The generated code is released under one of the following licenses: 1) GPL or 2) Genivia's license for commercial use. This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. */ #if defined(__BORLANDC__) #pragma option push -w-8060 #pragma option push -w-8004 #endif #include "quoteH.h" #ifdef __cplusplus extern "C" { #endif SOAP_SOURCE_STAMP("@(#) quoteServer.c ver 2.8.8 2012-04-18 14:36:19 GMT") SOAP_FMAC5 int SOAP_FMAC6 quote_serve(struct soap *soap) { #ifndef WITH_FASTCGI unsigned int k = soap->max_keep_alive; #endif do { #ifndef WITH_FASTCGI if (soap->max_keep_alive > 0 && !--k) soap->keep_alive = 0; #endif if (soap_begin_serve(soap)) { if (soap->error >= SOAP_STOP) continue; return soap->error; } if (quote_serve_request(soap) || (soap->fserveloop && soap->fserveloop(soap))) { #ifdef WITH_FASTCGI soap_send_fault(soap); #else return soap_send_fault(soap); #endif } #ifdef WITH_FASTCGI soap_destroy(soap); soap_end(soap); } while (1); #else } while (soap->keep_alive); #endif return SOAP_OK; } #ifndef WITH_NOSERVEREQUEST SOAP_FMAC5 int SOAP_FMAC6 quote_serve_request(struct soap *soap) { soap_peek_element(soap); if (!soap_match_tag(soap, soap->tag, "ns:getQuote")) return soap_serve_ns__getQuote(soap); return soap->error = SOAP_NO_METHOD; } #endif SOAP_FMAC5 int SOAP_FMAC6 soap_serve_ns__getQuote(struct soap *soap) { struct ns__getQuote soap_tmp_ns__getQuote; struct ns__getQuoteResponse soap_tmp_ns__getQuoteResponse; float soap_tmp_float; soap_default_ns__getQuoteResponse(soap, &soap_tmp_ns__getQuoteResponse); soap_default_float(soap, &soap_tmp_float); soap_tmp_ns__getQuoteResponse.Result = &soap_tmp_float; soap_default_ns__getQuote(soap, &soap_tmp_ns__getQuote); soap->encodingStyle = ""; if (!soap_get_ns__getQuote(soap, &soap_tmp_ns__getQuote, "ns:getQuote", NULL)) return soap->error; if (soap_body_end_in(soap) || soap_envelope_end_in(soap) || soap_end_recv(soap)) return soap->error; soap->error = ns__getQuote(soap, soap_tmp_ns__getQuote.symbol, soap_tmp_ns__getQuoteResponse.Result); if (soap->error) return soap->error; soap_serializeheader(soap); soap_serialize_ns__getQuoteResponse(soap, &soap_tmp_ns__getQuoteResponse); if (soap_begin_count(soap)) return soap->error; if (soap->mode & SOAP_IO_LENGTH) { if (soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_put_ns__getQuoteResponse(soap, &soap_tmp_ns__getQuoteResponse, "ns:getQuoteResponse", NULL) || soap_body_end_out(soap) || soap_envelope_end_out(soap)) return soap->error; }; if (soap_end_count(soap) || soap_response(soap, SOAP_OK) || soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_put_ns__getQuoteResponse(soap, &soap_tmp_ns__getQuoteResponse, "ns:getQuoteResponse", NULL) || soap_body_end_out(soap) || soap_envelope_end_out(soap) || soap_end_send(soap)) return soap->error; return soap_closesock(soap); } #ifdef __cplusplus } #endif #if defined(__BORLANDC__) #pragma option pop #pragma option pop #endif /* End of quoteServer.c */ gsoap-2.8.28/gsoap/samples/chaining/calcC.c0000644000175000017500000022024312653650154020004 0ustar ellertellert/* calcC.c Generated by gSOAP 2.8.8 from calc.h Copyright(C) 2000-2012, Robert van Engelen, Genivia Inc. All Rights Reserved. The generated code is released under one of the following licenses: 1) GPL or 2) Genivia's license for commercial use. This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. */ #if defined(__BORLANDC__) #pragma option push -w-8060 #pragma option push -w-8004 #endif #include "calcH.h" #ifdef __cplusplus extern "C" { #endif SOAP_SOURCE_STAMP("@(#) calcC.c ver 2.8.8 2012-04-18 14:36:19 GMT") #ifndef WITH_NOGLOBAL SOAP_FMAC3 void SOAP_FMAC4 soap_serializeheader(struct soap *soap) { if (soap->header) soap_serialize_SOAP_ENV__Header(soap, soap->header); } SOAP_FMAC3 int SOAP_FMAC4 soap_putheader(struct soap *soap) { if (soap->header) { soap->part = SOAP_IN_HEADER; if (soap_out_SOAP_ENV__Header(soap, "SOAP-ENV:Header", 0, soap->header, NULL)) return soap->error; soap->part = SOAP_END_HEADER; } return SOAP_OK; } SOAP_FMAC3 int SOAP_FMAC4 soap_getheader(struct soap *soap) { soap->part = SOAP_IN_HEADER; soap->header = soap_in_SOAP_ENV__Header(soap, "SOAP-ENV:Header", NULL, NULL); soap->part = SOAP_END_HEADER; return soap->header == NULL; } SOAP_FMAC3 void SOAP_FMAC4 soap_header(struct soap *soap) { if (!soap->header) { if ((soap->header = (struct SOAP_ENV__Header*)soap_malloc(soap, sizeof(struct SOAP_ENV__Header)))) soap_default_SOAP_ENV__Header(soap, soap->header); } } SOAP_FMAC3 void SOAP_FMAC4 soap_fault(struct soap *soap) { if (!soap->fault) { soap->fault = (struct SOAP_ENV__Fault*)soap_malloc(soap, sizeof(struct SOAP_ENV__Fault)); if (!soap->fault) return; soap_default_SOAP_ENV__Fault(soap, soap->fault); } if (soap->version == 2 && !soap->fault->SOAP_ENV__Code) { soap->fault->SOAP_ENV__Code = (struct SOAP_ENV__Code*)soap_malloc(soap, sizeof(struct SOAP_ENV__Code)); soap_default_SOAP_ENV__Code(soap, soap->fault->SOAP_ENV__Code); } if (soap->version == 2 && !soap->fault->SOAP_ENV__Reason) { soap->fault->SOAP_ENV__Reason = (struct SOAP_ENV__Reason*)soap_malloc(soap, sizeof(struct SOAP_ENV__Reason)); soap_default_SOAP_ENV__Reason(soap, soap->fault->SOAP_ENV__Reason); } } SOAP_FMAC3 void SOAP_FMAC4 soap_serializefault(struct soap *soap) { if (soap->fault) soap_serialize_SOAP_ENV__Fault(soap, soap->fault); } SOAP_FMAC3 int SOAP_FMAC4 soap_putfault(struct soap *soap) { if (soap->fault) return soap_put_SOAP_ENV__Fault(soap, soap->fault, "SOAP-ENV:Fault", NULL); return SOAP_OK; } SOAP_FMAC3 int SOAP_FMAC4 soap_getfault(struct soap *soap) { return (soap->fault = soap_get_SOAP_ENV__Fault(soap, NULL, "SOAP-ENV:Fault", NULL)) == NULL; } SOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultcode(struct soap *soap) { soap_fault(soap); if (soap->version == 2 && soap->fault->SOAP_ENV__Code) return (const char**)&soap->fault->SOAP_ENV__Code->SOAP_ENV__Value; return (const char**)&soap->fault->faultcode; } SOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultsubcode(struct soap *soap) { soap_fault(soap); if (soap->version == 2) { if (!soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode) { soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode = (struct SOAP_ENV__Code*)soap_malloc(soap, sizeof(struct SOAP_ENV__Code)); soap_default_SOAP_ENV__Code(soap, soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode); } return (const char**)&soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode->SOAP_ENV__Value; } return (const char**)&soap->fault->faultcode; } SOAP_FMAC3 const char * SOAP_FMAC4 soap_check_faultsubcode(struct soap *soap) { soap_fault(soap); if (soap->version == 2) { if (soap->fault->SOAP_ENV__Code && soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode && soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode) return soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode->SOAP_ENV__Value; return NULL; } return soap->fault->faultcode; } SOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultstring(struct soap *soap) { soap_fault(soap); if (soap->version == 2) return (const char**)&soap->fault->SOAP_ENV__Reason->SOAP_ENV__Text; return (const char**)&soap->fault->faultstring; } SOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultdetail(struct soap *soap) { soap_fault(soap); if (soap->version == 1) { if (!soap->fault->detail) { soap->fault->detail = (struct SOAP_ENV__Detail*)soap_malloc(soap, sizeof(struct SOAP_ENV__Detail)); soap_default_SOAP_ENV__Detail(soap, soap->fault->detail); } return (const char**)&soap->fault->detail->__any; } if (!soap->fault->SOAP_ENV__Detail) { soap->fault->SOAP_ENV__Detail = (struct SOAP_ENV__Detail*)soap_malloc(soap, sizeof(struct SOAP_ENV__Detail)); soap_default_SOAP_ENV__Detail(soap, soap->fault->SOAP_ENV__Detail); } return (const char**)&soap->fault->SOAP_ENV__Detail->__any; } SOAP_FMAC3 const char * SOAP_FMAC4 soap_check_faultdetail(struct soap *soap) { soap_fault(soap); if (soap->version == 2 && soap->fault->SOAP_ENV__Detail) return soap->fault->SOAP_ENV__Detail->__any; if (soap->fault->detail) return soap->fault->detail->__any; return NULL; } #endif #ifndef WITH_NOIDREF SOAP_FMAC3 int SOAP_FMAC4 soap_getindependent(struct soap *soap) { int t; if (soap->version == 1) { for (;;) { if (!soap_getelement(soap, &t)) if (soap->error || soap_ignore_element(soap)) break; } } if (soap->error == SOAP_NO_TAG || soap->error == SOAP_EOF) soap->error = SOAP_OK; return soap->error; } #endif #ifndef WITH_NOIDREF SOAP_FMAC3 void * SOAP_FMAC4 soap_getelement(struct soap *soap, int *type) { (void)type; if (soap_peek_element(soap)) return NULL; if (!*soap->id || !(*type = soap_lookup_type(soap, soap->id))) *type = soap_lookup_type(soap, soap->href); switch (*type) { case SOAP_TYPE_byte: return soap_in_byte(soap, NULL, NULL, "xsd:byte"); case SOAP_TYPE_int: return soap_in_int(soap, NULL, NULL, "xsd:int"); case SOAP_TYPE_double: return soap_in_double(soap, NULL, NULL, "xsd:double"); case SOAP_TYPE_ns__pow: return soap_in_ns__pow(soap, NULL, NULL, "ns:pow"); case SOAP_TYPE_ns__powResponse: return soap_in_ns__powResponse(soap, NULL, NULL, "ns:powResponse"); case SOAP_TYPE_ns__div: return soap_in_ns__div(soap, NULL, NULL, "ns:div"); case SOAP_TYPE_ns__divResponse: return soap_in_ns__divResponse(soap, NULL, NULL, "ns:divResponse"); case SOAP_TYPE_ns__mul: return soap_in_ns__mul(soap, NULL, NULL, "ns:mul"); case SOAP_TYPE_ns__mulResponse: return soap_in_ns__mulResponse(soap, NULL, NULL, "ns:mulResponse"); case SOAP_TYPE_ns__sub: return soap_in_ns__sub(soap, NULL, NULL, "ns:sub"); case SOAP_TYPE_ns__subResponse: return soap_in_ns__subResponse(soap, NULL, NULL, "ns:subResponse"); case SOAP_TYPE_ns__add: return soap_in_ns__add(soap, NULL, NULL, "ns:add"); case SOAP_TYPE_ns__addResponse: return soap_in_ns__addResponse(soap, NULL, NULL, "ns:addResponse"); case SOAP_TYPE_PointerTodouble: return soap_in_PointerTodouble(soap, NULL, NULL, "xsd:double"); case SOAP_TYPE__QName: { char **s; s = soap_in__QName(soap, NULL, NULL, "xsd:QName"); return s ? *s : NULL; } case SOAP_TYPE_string: { char **s; s = soap_in_string(soap, NULL, NULL, "xsd:string"); return s ? *s : NULL; } default: { const char *t = soap->type; if (!*t) t = soap->tag; if (!soap_match_tag(soap, t, "xsd:byte")) { *type = SOAP_TYPE_byte; return soap_in_byte(soap, NULL, NULL, NULL); } if (!soap_match_tag(soap, t, "xsd:int")) { *type = SOAP_TYPE_int; return soap_in_int(soap, NULL, NULL, NULL); } if (!soap_match_tag(soap, t, "xsd:double")) { *type = SOAP_TYPE_double; return soap_in_double(soap, NULL, NULL, NULL); } if (!soap_match_tag(soap, t, "ns:pow")) { *type = SOAP_TYPE_ns__pow; return soap_in_ns__pow(soap, NULL, NULL, NULL); } if (!soap_match_tag(soap, t, "ns:powResponse")) { *type = SOAP_TYPE_ns__powResponse; return soap_in_ns__powResponse(soap, NULL, NULL, NULL); } if (!soap_match_tag(soap, t, "ns:div")) { *type = SOAP_TYPE_ns__div; return soap_in_ns__div(soap, NULL, NULL, NULL); } if (!soap_match_tag(soap, t, "ns:divResponse")) { *type = SOAP_TYPE_ns__divResponse; return soap_in_ns__divResponse(soap, NULL, NULL, NULL); } if (!soap_match_tag(soap, t, "ns:mul")) { *type = SOAP_TYPE_ns__mul; return soap_in_ns__mul(soap, NULL, NULL, NULL); } if (!soap_match_tag(soap, t, "ns:mulResponse")) { *type = SOAP_TYPE_ns__mulResponse; return soap_in_ns__mulResponse(soap, NULL, NULL, NULL); } if (!soap_match_tag(soap, t, "ns:sub")) { *type = SOAP_TYPE_ns__sub; return soap_in_ns__sub(soap, NULL, NULL, NULL); } if (!soap_match_tag(soap, t, "ns:subResponse")) { *type = SOAP_TYPE_ns__subResponse; return soap_in_ns__subResponse(soap, NULL, NULL, NULL); } if (!soap_match_tag(soap, t, "ns:add")) { *type = SOAP_TYPE_ns__add; return soap_in_ns__add(soap, NULL, NULL, NULL); } if (!soap_match_tag(soap, t, "ns:addResponse")) { *type = SOAP_TYPE_ns__addResponse; return soap_in_ns__addResponse(soap, NULL, NULL, NULL); } if (!soap_match_tag(soap, t, "xsd:QName")) { char **s; *type = SOAP_TYPE__QName; s = soap_in__QName(soap, NULL, NULL, NULL); return s ? *s : NULL; } if (!soap_match_tag(soap, t, "xsd:string")) { char **s; *type = SOAP_TYPE_string; s = soap_in_string(soap, NULL, NULL, NULL); return s ? *s : NULL; } t = soap->tag; } } soap->error = SOAP_TAG_MISMATCH; return NULL; } #endif SOAP_FMAC3 int SOAP_FMAC4 soap_ignore_element(struct soap *soap) { if (!soap_peek_element(soap)) { int t; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unexpected element '%s' in input (level=%u, %d)\n", soap->tag, soap->level, soap->body)); if (soap->mustUnderstand && !soap->other) return soap->error = SOAP_MUSTUNDERSTAND; if (((soap->mode & SOAP_XML_STRICT) && soap->part != SOAP_IN_HEADER) || !soap_match_tag(soap, soap->tag, "SOAP-ENV:")) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "REJECTING element '%s'\n", soap->tag)); return soap->error = SOAP_TAG_MISMATCH; } if (!*soap->id || !soap_getelement(soap, &t)) { soap->peeked = 0; if (soap->fignore) soap->error = soap->fignore(soap, soap->tag); else soap->error = SOAP_OK; DBGLOG(TEST, if (!soap->error) SOAP_MESSAGE(fdebug, "IGNORING element '%s'\n", soap->tag)); if (!soap->error && soap->body) { soap->level++; while (!soap_ignore_element(soap)) ; if (soap->error == SOAP_NO_TAG) soap->error = soap_element_end_in(soap, NULL); } } } return soap->error; } #ifndef WITH_NOIDREF SOAP_FMAC3 int SOAP_FMAC4 soap_putindependent(struct soap *soap) { int i; struct soap_plist *pp; if (soap->version == 1 && soap->encodingStyle && !(soap->mode & (SOAP_XML_TREE | SOAP_XML_GRAPH))) for (i = 0; i < SOAP_PTRHASH; i++) for (pp = soap->pht[i]; pp; pp = pp->next) if (pp->mark1 == 2 || pp->mark2 == 2) if (soap_putelement(soap, pp->ptr, "id", pp->id, pp->type)) return soap->error; return SOAP_OK; } #endif #ifndef WITH_NOIDREF SOAP_FMAC3 int SOAP_FMAC4 soap_putelement(struct soap *soap, const void *ptr, const char *tag, int id, int type) { (void)tag; switch (type) { case SOAP_TYPE_byte: return soap_out_byte(soap, tag, id, (const char *)ptr, "xsd:byte"); case SOAP_TYPE_int: return soap_out_int(soap, tag, id, (const int *)ptr, "xsd:int"); case SOAP_TYPE_double: return soap_out_double(soap, tag, id, (const double *)ptr, "xsd:double"); case SOAP_TYPE_ns__pow: return soap_out_ns__pow(soap, tag, id, (const struct ns__pow *)ptr, "ns:pow"); case SOAP_TYPE_ns__powResponse: return soap_out_ns__powResponse(soap, tag, id, (const struct ns__powResponse *)ptr, "ns:powResponse"); case SOAP_TYPE_ns__div: return soap_out_ns__div(soap, tag, id, (const struct ns__div *)ptr, "ns:div"); case SOAP_TYPE_ns__divResponse: return soap_out_ns__divResponse(soap, tag, id, (const struct ns__divResponse *)ptr, "ns:divResponse"); case SOAP_TYPE_ns__mul: return soap_out_ns__mul(soap, tag, id, (const struct ns__mul *)ptr, "ns:mul"); case SOAP_TYPE_ns__mulResponse: return soap_out_ns__mulResponse(soap, tag, id, (const struct ns__mulResponse *)ptr, "ns:mulResponse"); case SOAP_TYPE_ns__sub: return soap_out_ns__sub(soap, tag, id, (const struct ns__sub *)ptr, "ns:sub"); case SOAP_TYPE_ns__subResponse: return soap_out_ns__subResponse(soap, tag, id, (const struct ns__subResponse *)ptr, "ns:subResponse"); case SOAP_TYPE_ns__add: return soap_out_ns__add(soap, tag, id, (const struct ns__add *)ptr, "ns:add"); case SOAP_TYPE_ns__addResponse: return soap_out_ns__addResponse(soap, tag, id, (const struct ns__addResponse *)ptr, "ns:addResponse"); case SOAP_TYPE_PointerTodouble: return soap_out_PointerTodouble(soap, tag, id, (double *const*)ptr, "xsd:double"); case SOAP_TYPE__QName: return soap_out_string(soap, tag, id, (char*const*)&ptr, "xsd:QName"); case SOAP_TYPE_string: return soap_out_string(soap, tag, id, (char*const*)&ptr, "xsd:string"); } return SOAP_OK; } #endif #ifndef WITH_NOIDREF SOAP_FMAC3 void SOAP_FMAC4 soap_markelement(struct soap *soap, const void *ptr, int type) { (void)soap; (void)ptr; (void)type; /* appease -Wall -Werror */ switch (type) { case SOAP_TYPE_ns__pow: soap_serialize_ns__pow(soap, (const struct ns__pow *)ptr); break; case SOAP_TYPE_ns__powResponse: soap_serialize_ns__powResponse(soap, (const struct ns__powResponse *)ptr); break; case SOAP_TYPE_ns__div: soap_serialize_ns__div(soap, (const struct ns__div *)ptr); break; case SOAP_TYPE_ns__divResponse: soap_serialize_ns__divResponse(soap, (const struct ns__divResponse *)ptr); break; case SOAP_TYPE_ns__mul: soap_serialize_ns__mul(soap, (const struct ns__mul *)ptr); break; case SOAP_TYPE_ns__mulResponse: soap_serialize_ns__mulResponse(soap, (const struct ns__mulResponse *)ptr); break; case SOAP_TYPE_ns__sub: soap_serialize_ns__sub(soap, (const struct ns__sub *)ptr); break; case SOAP_TYPE_ns__subResponse: soap_serialize_ns__subResponse(soap, (const struct ns__subResponse *)ptr); break; case SOAP_TYPE_ns__add: soap_serialize_ns__add(soap, (const struct ns__add *)ptr); break; case SOAP_TYPE_ns__addResponse: soap_serialize_ns__addResponse(soap, (const struct ns__addResponse *)ptr); break; case SOAP_TYPE_PointerTodouble: soap_serialize_PointerTodouble(soap, (double *const*)ptr); break; case SOAP_TYPE__QName: soap_serialize_string(soap, (char*const*)&ptr); break; case SOAP_TYPE_string: soap_serialize_string(soap, (char*const*)&ptr); break; } } #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_byte(struct soap *soap, char *a) { (void)soap; /* appease -Wall -Werror */ #ifdef SOAP_DEFAULT_byte *a = SOAP_DEFAULT_byte; #else *a = (char)0; #endif } SOAP_FMAC3 int SOAP_FMAC4 soap_out_byte(struct soap *soap, const char *tag, int id, const char *a, const char *type) { (void)soap; (void)type; (void)tag; (void)id; return soap_outbyte(soap, tag, id, a, type, SOAP_TYPE_byte); } SOAP_FMAC3 char * SOAP_FMAC4 soap_in_byte(struct soap *soap, const char *tag, char *a, const char *type) { char *p; p = soap_inbyte(soap, tag, a, type, SOAP_TYPE_byte); return p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_byte(struct soap *soap, const char *a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_byte); if (soap_out_byte(soap, tag?tag:"byte", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 char * SOAP_FMAC4 soap_get_byte(struct soap *soap, char *p, const char *tag, const char *type) { if ((p = soap_in_byte(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC3 void SOAP_FMAC4 soap_default_int(struct soap *soap, int *a) { (void)soap; /* appease -Wall -Werror */ #ifdef SOAP_DEFAULT_int *a = SOAP_DEFAULT_int; #else *a = (int)0; #endif } SOAP_FMAC3 int SOAP_FMAC4 soap_out_int(struct soap *soap, const char *tag, int id, const int *a, const char *type) { (void)soap; (void)type; (void)tag; (void)id; return soap_outint(soap, tag, id, a, type, SOAP_TYPE_int); } SOAP_FMAC3 int * SOAP_FMAC4 soap_in_int(struct soap *soap, const char *tag, int *a, const char *type) { int *p; p = soap_inint(soap, tag, a, type, SOAP_TYPE_int); return p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_int(struct soap *soap, const int *a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_int); if (soap_out_int(soap, tag?tag:"int", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 int * SOAP_FMAC4 soap_get_int(struct soap *soap, int *p, const char *tag, const char *type) { if ((p = soap_in_int(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC3 void SOAP_FMAC4 soap_default_double(struct soap *soap, double *a) { (void)soap; /* appease -Wall -Werror */ #ifdef SOAP_DEFAULT_double *a = SOAP_DEFAULT_double; #else *a = (double)0; #endif } SOAP_FMAC3 int SOAP_FMAC4 soap_out_double(struct soap *soap, const char *tag, int id, const double *a, const char *type) { (void)soap; (void)type; (void)tag; (void)id; return soap_outdouble(soap, tag, id, a, type, SOAP_TYPE_double); } SOAP_FMAC3 double * SOAP_FMAC4 soap_in_double(struct soap *soap, const char *tag, double *a, const char *type) { double *p; p = soap_indouble(soap, tag, a, type, SOAP_TYPE_double); return p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_double(struct soap *soap, const double *a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_double); if (soap_out_double(soap, tag?tag:"double", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 double * SOAP_FMAC4 soap_get_double(struct soap *soap, double *p, const char *tag, const char *type) { if ((p = soap_in_double(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } #ifndef WITH_NOGLOBAL SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Fault(struct soap *soap, struct SOAP_ENV__Fault *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_default__QName(soap, &a->faultcode); soap_default_string(soap, &a->faultstring); soap_default_string(soap, &a->faultactor); a->detail = NULL; a->SOAP_ENV__Code = NULL; a->SOAP_ENV__Reason = NULL; soap_default_string(soap, &a->SOAP_ENV__Node); soap_default_string(soap, &a->SOAP_ENV__Role); a->SOAP_ENV__Detail = NULL; } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Fault(struct soap *soap, const struct SOAP_ENV__Fault *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_serialize__QName(soap, &a->faultcode); soap_serialize_string(soap, &a->faultstring); soap_serialize_string(soap, &a->faultactor); soap_serialize_PointerToSOAP_ENV__Detail(soap, &a->detail); soap_serialize_PointerToSOAP_ENV__Code(soap, &a->SOAP_ENV__Code); soap_serialize_PointerToSOAP_ENV__Reason(soap, &a->SOAP_ENV__Reason); soap_serialize_string(soap, &a->SOAP_ENV__Node); soap_serialize_string(soap, &a->SOAP_ENV__Role); soap_serialize_PointerToSOAP_ENV__Detail(soap, &a->SOAP_ENV__Detail); } SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Fault(struct soap *soap, const char *tag, int id, const struct SOAP_ENV__Fault *a, const char *type) { const char *soap_tmp_faultcode = soap_QName2s(soap, a->faultcode); (void)soap; (void)tag; (void)id; (void)type; if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_SOAP_ENV__Fault), type)) return soap->error; if (soap_out__QName(soap, "faultcode", -1, (char*const*)&soap_tmp_faultcode, "")) return soap->error; if (soap_out_string(soap, "faultstring", -1, &a->faultstring, "")) return soap->error; if (soap_out_string(soap, "faultactor", -1, &a->faultactor, "")) return soap->error; if (soap_out_PointerToSOAP_ENV__Detail(soap, "detail", -1, &a->detail, "")) return soap->error; if (soap_out_PointerToSOAP_ENV__Code(soap, "SOAP-ENV:Code", -1, &a->SOAP_ENV__Code, "")) return soap->error; if (soap_out_PointerToSOAP_ENV__Reason(soap, "SOAP-ENV:Reason", -1, &a->SOAP_ENV__Reason, "")) return soap->error; if (soap_out_string(soap, "SOAP-ENV:Node", -1, &a->SOAP_ENV__Node, "")) return soap->error; if (soap_out_string(soap, "SOAP-ENV:Role", -1, &a->SOAP_ENV__Role, "")) return soap->error; if (soap_out_PointerToSOAP_ENV__Detail(soap, "SOAP-ENV:Detail", -1, &a->SOAP_ENV__Detail, "")) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct SOAP_ENV__Fault * SOAP_FMAC4 soap_in_SOAP_ENV__Fault(struct soap *soap, const char *tag, struct SOAP_ENV__Fault *a, const char *type) { size_t soap_flag_faultcode = 1; size_t soap_flag_faultstring = 1; size_t soap_flag_faultactor = 1; size_t soap_flag_detail = 1; size_t soap_flag_SOAP_ENV__Code = 1; size_t soap_flag_SOAP_ENV__Reason = 1; size_t soap_flag_SOAP_ENV__Node = 1; size_t soap_flag_SOAP_ENV__Role = 1; size_t soap_flag_SOAP_ENV__Detail = 1; if (soap_element_begin_in(soap, tag, 0, type)) return NULL; a = (struct SOAP_ENV__Fault *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_SOAP_ENV__Fault, sizeof(struct SOAP_ENV__Fault), 0, NULL, NULL, NULL); if (!a) return NULL; soap_default_SOAP_ENV__Fault(soap, a); if (soap->body && !*soap->href) { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_faultcode && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) if (soap_in__QName(soap, "faultcode", &a->faultcode, "")) { soap_flag_faultcode--; continue; } if (soap_flag_faultstring && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) if (soap_in_string(soap, "faultstring", &a->faultstring, "xsd:string")) { soap_flag_faultstring--; continue; } if (soap_flag_faultactor && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) if (soap_in_string(soap, "faultactor", &a->faultactor, "xsd:string")) { soap_flag_faultactor--; continue; } if (soap_flag_detail && soap->error == SOAP_TAG_MISMATCH) if (soap_in_PointerToSOAP_ENV__Detail(soap, "detail", &a->detail, "")) { soap_flag_detail--; continue; } if (soap_flag_SOAP_ENV__Code && soap->error == SOAP_TAG_MISMATCH) if (soap_in_PointerToSOAP_ENV__Code(soap, "SOAP-ENV:Code", &a->SOAP_ENV__Code, "")) { soap_flag_SOAP_ENV__Code--; continue; } if (soap_flag_SOAP_ENV__Reason && soap->error == SOAP_TAG_MISMATCH) if (soap_in_PointerToSOAP_ENV__Reason(soap, "SOAP-ENV:Reason", &a->SOAP_ENV__Reason, "")) { soap_flag_SOAP_ENV__Reason--; continue; } if (soap_flag_SOAP_ENV__Node && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) if (soap_in_string(soap, "SOAP-ENV:Node", &a->SOAP_ENV__Node, "xsd:string")) { soap_flag_SOAP_ENV__Node--; continue; } if (soap_flag_SOAP_ENV__Role && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) if (soap_in_string(soap, "SOAP-ENV:Role", &a->SOAP_ENV__Role, "xsd:string")) { soap_flag_SOAP_ENV__Role--; continue; } if (soap_flag_SOAP_ENV__Detail && soap->error == SOAP_TAG_MISMATCH) if (soap_in_PointerToSOAP_ENV__Detail(soap, "SOAP-ENV:Detail", &a->SOAP_ENV__Detail, "")) { soap_flag_SOAP_ENV__Detail--; continue; } if (soap->error == SOAP_TAG_MISMATCH) soap->error = soap_ignore_element(soap); if (soap->error == SOAP_NO_TAG) break; if (soap->error) return NULL; } if (soap_element_end_in(soap, tag)) return NULL; } else { a = (struct SOAP_ENV__Fault *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_SOAP_ENV__Fault, 0, sizeof(struct SOAP_ENV__Fault), 0, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Fault(struct soap *soap, const struct SOAP_ENV__Fault *a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_SOAP_ENV__Fault); if (soap_out_SOAP_ENV__Fault(soap, tag?tag:"SOAP-ENV:Fault", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct SOAP_ENV__Fault * SOAP_FMAC4 soap_get_SOAP_ENV__Fault(struct soap *soap, struct SOAP_ENV__Fault *p, const char *tag, const char *type) { if ((p = soap_in_SOAP_ENV__Fault(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } #endif #ifndef WITH_NOGLOBAL SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Reason(struct soap *soap, struct SOAP_ENV__Reason *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_default_string(soap, &a->SOAP_ENV__Text); } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Reason(struct soap *soap, const struct SOAP_ENV__Reason *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_serialize_string(soap, &a->SOAP_ENV__Text); } SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Reason(struct soap *soap, const char *tag, int id, const struct SOAP_ENV__Reason *a, const char *type) { (void)soap; (void)tag; (void)id; (void)type; if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_SOAP_ENV__Reason), type)) return soap->error; if (soap->lang) soap_set_attr(soap, "xml:lang", soap->lang, 1); if (soap_out_string(soap, "SOAP-ENV:Text", -1, &a->SOAP_ENV__Text, "")) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct SOAP_ENV__Reason * SOAP_FMAC4 soap_in_SOAP_ENV__Reason(struct soap *soap, const char *tag, struct SOAP_ENV__Reason *a, const char *type) { size_t soap_flag_SOAP_ENV__Text = 1; if (soap_element_begin_in(soap, tag, 0, type)) return NULL; a = (struct SOAP_ENV__Reason *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_SOAP_ENV__Reason, sizeof(struct SOAP_ENV__Reason), 0, NULL, NULL, NULL); if (!a) return NULL; soap_default_SOAP_ENV__Reason(soap, a); if (soap->body && !*soap->href) { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_SOAP_ENV__Text && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) if (soap_in_string(soap, "SOAP-ENV:Text", &a->SOAP_ENV__Text, "xsd:string")) { soap_flag_SOAP_ENV__Text--; continue; } if (soap->error == SOAP_TAG_MISMATCH) soap->error = soap_ignore_element(soap); if (soap->error == SOAP_NO_TAG) break; if (soap->error) return NULL; } if (soap_element_end_in(soap, tag)) return NULL; } else { a = (struct SOAP_ENV__Reason *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_SOAP_ENV__Reason, 0, sizeof(struct SOAP_ENV__Reason), 0, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Reason(struct soap *soap, const struct SOAP_ENV__Reason *a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_SOAP_ENV__Reason); if (soap_out_SOAP_ENV__Reason(soap, tag?tag:"SOAP-ENV:Reason", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct SOAP_ENV__Reason * SOAP_FMAC4 soap_get_SOAP_ENV__Reason(struct soap *soap, struct SOAP_ENV__Reason *p, const char *tag, const char *type) { if ((p = soap_in_SOAP_ENV__Reason(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } #endif #ifndef WITH_NOGLOBAL SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Detail(struct soap *soap, struct SOAP_ENV__Detail *a) { (void)soap; (void)a; /* appease -Wall -Werror */ a->__any = NULL; a->__type = 0; a->fault = NULL; } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Detail(struct soap *soap, const struct SOAP_ENV__Detail *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_markelement(soap, a->fault, a->__type); } SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Detail(struct soap *soap, const char *tag, int id, const struct SOAP_ENV__Detail *a, const char *type) { (void)soap; (void)tag; (void)id; (void)type; if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_SOAP_ENV__Detail), type)) return soap->error; soap_outliteral(soap, "-any", &a->__any, NULL); if (soap_putelement(soap, a->fault, "fault", -1, a->__type)) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct SOAP_ENV__Detail * SOAP_FMAC4 soap_in_SOAP_ENV__Detail(struct soap *soap, const char *tag, struct SOAP_ENV__Detail *a, const char *type) { size_t soap_flag___any = 1; size_t soap_flag_fault = 1; if (soap_element_begin_in(soap, tag, 0, type)) return NULL; a = (struct SOAP_ENV__Detail *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_SOAP_ENV__Detail, sizeof(struct SOAP_ENV__Detail), 0, NULL, NULL, NULL); if (!a) return NULL; soap_default_SOAP_ENV__Detail(soap, a); if (soap->body && !*soap->href) { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_fault && soap->error == SOAP_TAG_MISMATCH) if ((a->fault = soap_getelement(soap, &a->__type))) { soap_flag_fault = 0; continue; } if (soap_flag___any && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) if (soap_inliteral(soap, "-any", &a->__any)) { soap_flag___any--; continue; } if (soap->error == SOAP_TAG_MISMATCH) soap->error = soap_ignore_element(soap); if (soap->error == SOAP_NO_TAG) break; if (soap->error) return NULL; } if (soap_element_end_in(soap, tag)) return NULL; } else { a = (struct SOAP_ENV__Detail *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_SOAP_ENV__Detail, 0, sizeof(struct SOAP_ENV__Detail), 0, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Detail(struct soap *soap, const struct SOAP_ENV__Detail *a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_SOAP_ENV__Detail); if (soap_out_SOAP_ENV__Detail(soap, tag?tag:"SOAP-ENV:Detail", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct SOAP_ENV__Detail * SOAP_FMAC4 soap_get_SOAP_ENV__Detail(struct soap *soap, struct SOAP_ENV__Detail *p, const char *tag, const char *type) { if ((p = soap_in_SOAP_ENV__Detail(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } #endif #ifndef WITH_NOGLOBAL SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Code(struct soap *soap, struct SOAP_ENV__Code *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_default__QName(soap, &a->SOAP_ENV__Value); a->SOAP_ENV__Subcode = NULL; } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Code(struct soap *soap, const struct SOAP_ENV__Code *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_serialize__QName(soap, &a->SOAP_ENV__Value); soap_serialize_PointerToSOAP_ENV__Code(soap, &a->SOAP_ENV__Subcode); } SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Code(struct soap *soap, const char *tag, int id, const struct SOAP_ENV__Code *a, const char *type) { const char *soap_tmp_SOAP_ENV__Value = soap_QName2s(soap, a->SOAP_ENV__Value); (void)soap; (void)tag; (void)id; (void)type; if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_SOAP_ENV__Code), type)) return soap->error; if (soap_out__QName(soap, "SOAP-ENV:Value", -1, (char*const*)&soap_tmp_SOAP_ENV__Value, "")) return soap->error; if (soap_out_PointerToSOAP_ENV__Code(soap, "SOAP-ENV:Subcode", -1, &a->SOAP_ENV__Subcode, "")) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct SOAP_ENV__Code * SOAP_FMAC4 soap_in_SOAP_ENV__Code(struct soap *soap, const char *tag, struct SOAP_ENV__Code *a, const char *type) { size_t soap_flag_SOAP_ENV__Value = 1; size_t soap_flag_SOAP_ENV__Subcode = 1; if (soap_element_begin_in(soap, tag, 0, type)) return NULL; a = (struct SOAP_ENV__Code *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_SOAP_ENV__Code, sizeof(struct SOAP_ENV__Code), 0, NULL, NULL, NULL); if (!a) return NULL; soap_default_SOAP_ENV__Code(soap, a); if (soap->body && !*soap->href) { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_SOAP_ENV__Value && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) if (soap_in__QName(soap, "SOAP-ENV:Value", &a->SOAP_ENV__Value, "")) { soap_flag_SOAP_ENV__Value--; continue; } if (soap_flag_SOAP_ENV__Subcode && soap->error == SOAP_TAG_MISMATCH) if (soap_in_PointerToSOAP_ENV__Code(soap, "SOAP-ENV:Subcode", &a->SOAP_ENV__Subcode, "")) { soap_flag_SOAP_ENV__Subcode--; continue; } if (soap->error == SOAP_TAG_MISMATCH) soap->error = soap_ignore_element(soap); if (soap->error == SOAP_NO_TAG) break; if (soap->error) return NULL; } if (soap_element_end_in(soap, tag)) return NULL; } else { a = (struct SOAP_ENV__Code *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_SOAP_ENV__Code, 0, sizeof(struct SOAP_ENV__Code), 0, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Code(struct soap *soap, const struct SOAP_ENV__Code *a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_SOAP_ENV__Code); if (soap_out_SOAP_ENV__Code(soap, tag?tag:"SOAP-ENV:Code", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct SOAP_ENV__Code * SOAP_FMAC4 soap_get_SOAP_ENV__Code(struct soap *soap, struct SOAP_ENV__Code *p, const char *tag, const char *type) { if ((p = soap_in_SOAP_ENV__Code(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } #endif #ifndef WITH_NOGLOBAL SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Header(struct soap *soap, struct SOAP_ENV__Header *a) { (void)soap; (void)a; /* appease -Wall -Werror */ } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Header(struct soap *soap, const struct SOAP_ENV__Header *a) { (void)soap; (void)a; /* appease -Wall -Werror */ } SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Header(struct soap *soap, const char *tag, int id, const struct SOAP_ENV__Header *a, const char *type) { (void)soap; (void)tag; (void)id; (void)type; if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_SOAP_ENV__Header), type)) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct SOAP_ENV__Header * SOAP_FMAC4 soap_in_SOAP_ENV__Header(struct soap *soap, const char *tag, struct SOAP_ENV__Header *a, const char *type) { if (soap_element_begin_in(soap, tag, 0, type)) return NULL; a = (struct SOAP_ENV__Header *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_SOAP_ENV__Header, sizeof(struct SOAP_ENV__Header), 0, NULL, NULL, NULL); if (!a) return NULL; soap_default_SOAP_ENV__Header(soap, a); if (soap->body && !*soap->href) { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap->error == SOAP_TAG_MISMATCH) soap->error = soap_ignore_element(soap); if (soap->error == SOAP_NO_TAG) break; if (soap->error) return NULL; } if (soap_element_end_in(soap, tag)) return NULL; } else { a = (struct SOAP_ENV__Header *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_SOAP_ENV__Header, 0, sizeof(struct SOAP_ENV__Header), 0, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Header(struct soap *soap, const struct SOAP_ENV__Header *a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_SOAP_ENV__Header); if (soap_out_SOAP_ENV__Header(soap, tag?tag:"SOAP-ENV:Header", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct SOAP_ENV__Header * SOAP_FMAC4 soap_get_SOAP_ENV__Header(struct soap *soap, struct SOAP_ENV__Header *p, const char *tag, const char *type) { if ((p = soap_in_SOAP_ENV__Header(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__pow(struct soap *soap, struct ns__pow *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_default_double(soap, &a->a); soap_default_double(soap, &a->b); } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__pow(struct soap *soap, const struct ns__pow *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_embedded(soap, &a->a, SOAP_TYPE_double); soap_embedded(soap, &a->b, SOAP_TYPE_double); } SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__pow(struct soap *soap, const char *tag, int id, const struct ns__pow *a, const char *type) { (void)soap; (void)tag; (void)id; (void)type; if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns__pow), type)) return soap->error; if (soap_out_double(soap, "a", -1, &a->a, "")) return soap->error; if (soap_out_double(soap, "b", -1, &a->b, "")) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct ns__pow * SOAP_FMAC4 soap_in_ns__pow(struct soap *soap, const char *tag, struct ns__pow *a, const char *type) { size_t soap_flag_a = 1; size_t soap_flag_b = 1; if (soap_element_begin_in(soap, tag, 0, type)) return NULL; a = (struct ns__pow *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns__pow, sizeof(struct ns__pow), 0, NULL, NULL, NULL); if (!a) return NULL; soap_default_ns__pow(soap, a); if (soap->body && !*soap->href) { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_a && soap->error == SOAP_TAG_MISMATCH) if (soap_in_double(soap, "a", &a->a, "xsd:double")) { soap_flag_a--; continue; } if (soap_flag_b && soap->error == SOAP_TAG_MISMATCH) if (soap_in_double(soap, "b", &a->b, "xsd:double")) { soap_flag_b--; continue; } if (soap->error == SOAP_TAG_MISMATCH) soap->error = soap_ignore_element(soap); if (soap->error == SOAP_NO_TAG) break; if (soap->error) return NULL; } if (soap_element_end_in(soap, tag)) return NULL; } else { a = (struct ns__pow *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns__pow, 0, sizeof(struct ns__pow), 0, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_a > 0 || soap_flag_b > 0)) { soap->error = SOAP_OCCURS; return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__pow(struct soap *soap, const struct ns__pow *a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_ns__pow); if (soap_out_ns__pow(soap, tag?tag:"ns:pow", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct ns__pow * SOAP_FMAC4 soap_get_ns__pow(struct soap *soap, struct ns__pow *p, const char *tag, const char *type) { if ((p = soap_in_ns__pow(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__powResponse(struct soap *soap, struct ns__powResponse *a) { (void)soap; (void)a; /* appease -Wall -Werror */ a->result = NULL; } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__powResponse(struct soap *soap, const struct ns__powResponse *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_serialize_PointerTodouble(soap, &a->result); } SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__powResponse(struct soap *soap, const char *tag, int id, const struct ns__powResponse *a, const char *type) { (void)soap; (void)tag; (void)id; (void)type; if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns__powResponse), type)) return soap->error; if (soap_out_PointerTodouble(soap, "result", -1, &a->result, "")) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct ns__powResponse * SOAP_FMAC4 soap_in_ns__powResponse(struct soap *soap, const char *tag, struct ns__powResponse *a, const char *type) { size_t soap_flag_result = 1; if (soap_element_begin_in(soap, tag, 0, type)) return NULL; a = (struct ns__powResponse *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns__powResponse, sizeof(struct ns__powResponse), 0, NULL, NULL, NULL); if (!a) return NULL; soap_default_ns__powResponse(soap, a); if (soap->body && !*soap->href) { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_result && soap->error == SOAP_TAG_MISMATCH) if (soap_in_PointerTodouble(soap, "result", &a->result, "xsd:double")) { soap_flag_result--; continue; } if (soap->error == SOAP_TAG_MISMATCH) soap->error = soap_ignore_element(soap); if (soap->error == SOAP_NO_TAG) break; if (soap->error) return NULL; } if (soap_element_end_in(soap, tag)) return NULL; } else { a = (struct ns__powResponse *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns__powResponse, 0, sizeof(struct ns__powResponse), 0, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__powResponse(struct soap *soap, const struct ns__powResponse *a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_ns__powResponse); if (soap_out_ns__powResponse(soap, tag?tag:"ns:powResponse", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct ns__powResponse * SOAP_FMAC4 soap_get_ns__powResponse(struct soap *soap, struct ns__powResponse *p, const char *tag, const char *type) { if ((p = soap_in_ns__powResponse(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__div(struct soap *soap, struct ns__div *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_default_double(soap, &a->a); soap_default_double(soap, &a->b); } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__div(struct soap *soap, const struct ns__div *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_embedded(soap, &a->a, SOAP_TYPE_double); soap_embedded(soap, &a->b, SOAP_TYPE_double); } SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__div(struct soap *soap, const char *tag, int id, const struct ns__div *a, const char *type) { (void)soap; (void)tag; (void)id; (void)type; if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns__div), type)) return soap->error; if (soap_out_double(soap, "a", -1, &a->a, "")) return soap->error; if (soap_out_double(soap, "b", -1, &a->b, "")) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct ns__div * SOAP_FMAC4 soap_in_ns__div(struct soap *soap, const char *tag, struct ns__div *a, const char *type) { size_t soap_flag_a = 1; size_t soap_flag_b = 1; if (soap_element_begin_in(soap, tag, 0, type)) return NULL; a = (struct ns__div *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns__div, sizeof(struct ns__div), 0, NULL, NULL, NULL); if (!a) return NULL; soap_default_ns__div(soap, a); if (soap->body && !*soap->href) { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_a && soap->error == SOAP_TAG_MISMATCH) if (soap_in_double(soap, "a", &a->a, "xsd:double")) { soap_flag_a--; continue; } if (soap_flag_b && soap->error == SOAP_TAG_MISMATCH) if (soap_in_double(soap, "b", &a->b, "xsd:double")) { soap_flag_b--; continue; } if (soap->error == SOAP_TAG_MISMATCH) soap->error = soap_ignore_element(soap); if (soap->error == SOAP_NO_TAG) break; if (soap->error) return NULL; } if (soap_element_end_in(soap, tag)) return NULL; } else { a = (struct ns__div *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns__div, 0, sizeof(struct ns__div), 0, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_a > 0 || soap_flag_b > 0)) { soap->error = SOAP_OCCURS; return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__div(struct soap *soap, const struct ns__div *a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_ns__div); if (soap_out_ns__div(soap, tag?tag:"ns:div", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct ns__div * SOAP_FMAC4 soap_get_ns__div(struct soap *soap, struct ns__div *p, const char *tag, const char *type) { if ((p = soap_in_ns__div(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__divResponse(struct soap *soap, struct ns__divResponse *a) { (void)soap; (void)a; /* appease -Wall -Werror */ a->result = NULL; } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__divResponse(struct soap *soap, const struct ns__divResponse *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_serialize_PointerTodouble(soap, &a->result); } SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__divResponse(struct soap *soap, const char *tag, int id, const struct ns__divResponse *a, const char *type) { (void)soap; (void)tag; (void)id; (void)type; if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns__divResponse), type)) return soap->error; if (soap_out_PointerTodouble(soap, "result", -1, &a->result, "")) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct ns__divResponse * SOAP_FMAC4 soap_in_ns__divResponse(struct soap *soap, const char *tag, struct ns__divResponse *a, const char *type) { size_t soap_flag_result = 1; if (soap_element_begin_in(soap, tag, 0, type)) return NULL; a = (struct ns__divResponse *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns__divResponse, sizeof(struct ns__divResponse), 0, NULL, NULL, NULL); if (!a) return NULL; soap_default_ns__divResponse(soap, a); if (soap->body && !*soap->href) { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_result && soap->error == SOAP_TAG_MISMATCH) if (soap_in_PointerTodouble(soap, "result", &a->result, "xsd:double")) { soap_flag_result--; continue; } if (soap->error == SOAP_TAG_MISMATCH) soap->error = soap_ignore_element(soap); if (soap->error == SOAP_NO_TAG) break; if (soap->error) return NULL; } if (soap_element_end_in(soap, tag)) return NULL; } else { a = (struct ns__divResponse *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns__divResponse, 0, sizeof(struct ns__divResponse), 0, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__divResponse(struct soap *soap, const struct ns__divResponse *a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_ns__divResponse); if (soap_out_ns__divResponse(soap, tag?tag:"ns:divResponse", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct ns__divResponse * SOAP_FMAC4 soap_get_ns__divResponse(struct soap *soap, struct ns__divResponse *p, const char *tag, const char *type) { if ((p = soap_in_ns__divResponse(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__mul(struct soap *soap, struct ns__mul *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_default_double(soap, &a->a); soap_default_double(soap, &a->b); } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__mul(struct soap *soap, const struct ns__mul *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_embedded(soap, &a->a, SOAP_TYPE_double); soap_embedded(soap, &a->b, SOAP_TYPE_double); } SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__mul(struct soap *soap, const char *tag, int id, const struct ns__mul *a, const char *type) { (void)soap; (void)tag; (void)id; (void)type; if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns__mul), type)) return soap->error; if (soap_out_double(soap, "a", -1, &a->a, "")) return soap->error; if (soap_out_double(soap, "b", -1, &a->b, "")) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct ns__mul * SOAP_FMAC4 soap_in_ns__mul(struct soap *soap, const char *tag, struct ns__mul *a, const char *type) { size_t soap_flag_a = 1; size_t soap_flag_b = 1; if (soap_element_begin_in(soap, tag, 0, type)) return NULL; a = (struct ns__mul *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns__mul, sizeof(struct ns__mul), 0, NULL, NULL, NULL); if (!a) return NULL; soap_default_ns__mul(soap, a); if (soap->body && !*soap->href) { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_a && soap->error == SOAP_TAG_MISMATCH) if (soap_in_double(soap, "a", &a->a, "xsd:double")) { soap_flag_a--; continue; } if (soap_flag_b && soap->error == SOAP_TAG_MISMATCH) if (soap_in_double(soap, "b", &a->b, "xsd:double")) { soap_flag_b--; continue; } if (soap->error == SOAP_TAG_MISMATCH) soap->error = soap_ignore_element(soap); if (soap->error == SOAP_NO_TAG) break; if (soap->error) return NULL; } if (soap_element_end_in(soap, tag)) return NULL; } else { a = (struct ns__mul *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns__mul, 0, sizeof(struct ns__mul), 0, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_a > 0 || soap_flag_b > 0)) { soap->error = SOAP_OCCURS; return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__mul(struct soap *soap, const struct ns__mul *a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_ns__mul); if (soap_out_ns__mul(soap, tag?tag:"ns:mul", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct ns__mul * SOAP_FMAC4 soap_get_ns__mul(struct soap *soap, struct ns__mul *p, const char *tag, const char *type) { if ((p = soap_in_ns__mul(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__mulResponse(struct soap *soap, struct ns__mulResponse *a) { (void)soap; (void)a; /* appease -Wall -Werror */ a->result = NULL; } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__mulResponse(struct soap *soap, const struct ns__mulResponse *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_serialize_PointerTodouble(soap, &a->result); } SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__mulResponse(struct soap *soap, const char *tag, int id, const struct ns__mulResponse *a, const char *type) { (void)soap; (void)tag; (void)id; (void)type; if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns__mulResponse), type)) return soap->error; if (soap_out_PointerTodouble(soap, "result", -1, &a->result, "")) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct ns__mulResponse * SOAP_FMAC4 soap_in_ns__mulResponse(struct soap *soap, const char *tag, struct ns__mulResponse *a, const char *type) { size_t soap_flag_result = 1; if (soap_element_begin_in(soap, tag, 0, type)) return NULL; a = (struct ns__mulResponse *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns__mulResponse, sizeof(struct ns__mulResponse), 0, NULL, NULL, NULL); if (!a) return NULL; soap_default_ns__mulResponse(soap, a); if (soap->body && !*soap->href) { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_result && soap->error == SOAP_TAG_MISMATCH) if (soap_in_PointerTodouble(soap, "result", &a->result, "xsd:double")) { soap_flag_result--; continue; } if (soap->error == SOAP_TAG_MISMATCH) soap->error = soap_ignore_element(soap); if (soap->error == SOAP_NO_TAG) break; if (soap->error) return NULL; } if (soap_element_end_in(soap, tag)) return NULL; } else { a = (struct ns__mulResponse *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns__mulResponse, 0, sizeof(struct ns__mulResponse), 0, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__mulResponse(struct soap *soap, const struct ns__mulResponse *a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_ns__mulResponse); if (soap_out_ns__mulResponse(soap, tag?tag:"ns:mulResponse", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct ns__mulResponse * SOAP_FMAC4 soap_get_ns__mulResponse(struct soap *soap, struct ns__mulResponse *p, const char *tag, const char *type) { if ((p = soap_in_ns__mulResponse(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__sub(struct soap *soap, struct ns__sub *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_default_double(soap, &a->a); soap_default_double(soap, &a->b); } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__sub(struct soap *soap, const struct ns__sub *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_embedded(soap, &a->a, SOAP_TYPE_double); soap_embedded(soap, &a->b, SOAP_TYPE_double); } SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__sub(struct soap *soap, const char *tag, int id, const struct ns__sub *a, const char *type) { (void)soap; (void)tag; (void)id; (void)type; if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns__sub), type)) return soap->error; if (soap_out_double(soap, "a", -1, &a->a, "")) return soap->error; if (soap_out_double(soap, "b", -1, &a->b, "")) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct ns__sub * SOAP_FMAC4 soap_in_ns__sub(struct soap *soap, const char *tag, struct ns__sub *a, const char *type) { size_t soap_flag_a = 1; size_t soap_flag_b = 1; if (soap_element_begin_in(soap, tag, 0, type)) return NULL; a = (struct ns__sub *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns__sub, sizeof(struct ns__sub), 0, NULL, NULL, NULL); if (!a) return NULL; soap_default_ns__sub(soap, a); if (soap->body && !*soap->href) { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_a && soap->error == SOAP_TAG_MISMATCH) if (soap_in_double(soap, "a", &a->a, "xsd:double")) { soap_flag_a--; continue; } if (soap_flag_b && soap->error == SOAP_TAG_MISMATCH) if (soap_in_double(soap, "b", &a->b, "xsd:double")) { soap_flag_b--; continue; } if (soap->error == SOAP_TAG_MISMATCH) soap->error = soap_ignore_element(soap); if (soap->error == SOAP_NO_TAG) break; if (soap->error) return NULL; } if (soap_element_end_in(soap, tag)) return NULL; } else { a = (struct ns__sub *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns__sub, 0, sizeof(struct ns__sub), 0, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_a > 0 || soap_flag_b > 0)) { soap->error = SOAP_OCCURS; return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__sub(struct soap *soap, const struct ns__sub *a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_ns__sub); if (soap_out_ns__sub(soap, tag?tag:"ns:sub", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct ns__sub * SOAP_FMAC4 soap_get_ns__sub(struct soap *soap, struct ns__sub *p, const char *tag, const char *type) { if ((p = soap_in_ns__sub(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__subResponse(struct soap *soap, struct ns__subResponse *a) { (void)soap; (void)a; /* appease -Wall -Werror */ a->result = NULL; } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__subResponse(struct soap *soap, const struct ns__subResponse *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_serialize_PointerTodouble(soap, &a->result); } SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__subResponse(struct soap *soap, const char *tag, int id, const struct ns__subResponse *a, const char *type) { (void)soap; (void)tag; (void)id; (void)type; if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns__subResponse), type)) return soap->error; if (soap_out_PointerTodouble(soap, "result", -1, &a->result, "")) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct ns__subResponse * SOAP_FMAC4 soap_in_ns__subResponse(struct soap *soap, const char *tag, struct ns__subResponse *a, const char *type) { size_t soap_flag_result = 1; if (soap_element_begin_in(soap, tag, 0, type)) return NULL; a = (struct ns__subResponse *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns__subResponse, sizeof(struct ns__subResponse), 0, NULL, NULL, NULL); if (!a) return NULL; soap_default_ns__subResponse(soap, a); if (soap->body && !*soap->href) { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_result && soap->error == SOAP_TAG_MISMATCH) if (soap_in_PointerTodouble(soap, "result", &a->result, "xsd:double")) { soap_flag_result--; continue; } if (soap->error == SOAP_TAG_MISMATCH) soap->error = soap_ignore_element(soap); if (soap->error == SOAP_NO_TAG) break; if (soap->error) return NULL; } if (soap_element_end_in(soap, tag)) return NULL; } else { a = (struct ns__subResponse *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns__subResponse, 0, sizeof(struct ns__subResponse), 0, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__subResponse(struct soap *soap, const struct ns__subResponse *a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_ns__subResponse); if (soap_out_ns__subResponse(soap, tag?tag:"ns:subResponse", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct ns__subResponse * SOAP_FMAC4 soap_get_ns__subResponse(struct soap *soap, struct ns__subResponse *p, const char *tag, const char *type) { if ((p = soap_in_ns__subResponse(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__add(struct soap *soap, struct ns__add *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_default_double(soap, &a->a); soap_default_double(soap, &a->b); } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__add(struct soap *soap, const struct ns__add *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_embedded(soap, &a->a, SOAP_TYPE_double); soap_embedded(soap, &a->b, SOAP_TYPE_double); } SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__add(struct soap *soap, const char *tag, int id, const struct ns__add *a, const char *type) { (void)soap; (void)tag; (void)id; (void)type; if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns__add), type)) return soap->error; if (soap_out_double(soap, "a", -1, &a->a, "")) return soap->error; if (soap_out_double(soap, "b", -1, &a->b, "")) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct ns__add * SOAP_FMAC4 soap_in_ns__add(struct soap *soap, const char *tag, struct ns__add *a, const char *type) { size_t soap_flag_a = 1; size_t soap_flag_b = 1; if (soap_element_begin_in(soap, tag, 0, type)) return NULL; a = (struct ns__add *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns__add, sizeof(struct ns__add), 0, NULL, NULL, NULL); if (!a) return NULL; soap_default_ns__add(soap, a); if (soap->body && !*soap->href) { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_a && soap->error == SOAP_TAG_MISMATCH) if (soap_in_double(soap, "a", &a->a, "xsd:double")) { soap_flag_a--; continue; } if (soap_flag_b && soap->error == SOAP_TAG_MISMATCH) if (soap_in_double(soap, "b", &a->b, "xsd:double")) { soap_flag_b--; continue; } if (soap->error == SOAP_TAG_MISMATCH) soap->error = soap_ignore_element(soap); if (soap->error == SOAP_NO_TAG) break; if (soap->error) return NULL; } if (soap_element_end_in(soap, tag)) return NULL; } else { a = (struct ns__add *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns__add, 0, sizeof(struct ns__add), 0, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_a > 0 || soap_flag_b > 0)) { soap->error = SOAP_OCCURS; return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__add(struct soap *soap, const struct ns__add *a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_ns__add); if (soap_out_ns__add(soap, tag?tag:"ns:add", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct ns__add * SOAP_FMAC4 soap_get_ns__add(struct soap *soap, struct ns__add *p, const char *tag, const char *type) { if ((p = soap_in_ns__add(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__addResponse(struct soap *soap, struct ns__addResponse *a) { (void)soap; (void)a; /* appease -Wall -Werror */ a->result = NULL; } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__addResponse(struct soap *soap, const struct ns__addResponse *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_serialize_PointerTodouble(soap, &a->result); } SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__addResponse(struct soap *soap, const char *tag, int id, const struct ns__addResponse *a, const char *type) { (void)soap; (void)tag; (void)id; (void)type; if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns__addResponse), type)) return soap->error; if (soap_out_PointerTodouble(soap, "result", -1, &a->result, "")) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct ns__addResponse * SOAP_FMAC4 soap_in_ns__addResponse(struct soap *soap, const char *tag, struct ns__addResponse *a, const char *type) { size_t soap_flag_result = 1; if (soap_element_begin_in(soap, tag, 0, type)) return NULL; a = (struct ns__addResponse *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns__addResponse, sizeof(struct ns__addResponse), 0, NULL, NULL, NULL); if (!a) return NULL; soap_default_ns__addResponse(soap, a); if (soap->body && !*soap->href) { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_result && soap->error == SOAP_TAG_MISMATCH) if (soap_in_PointerTodouble(soap, "result", &a->result, "xsd:double")) { soap_flag_result--; continue; } if (soap->error == SOAP_TAG_MISMATCH) soap->error = soap_ignore_element(soap); if (soap->error == SOAP_NO_TAG) break; if (soap->error) return NULL; } if (soap_element_end_in(soap, tag)) return NULL; } else { a = (struct ns__addResponse *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns__addResponse, 0, sizeof(struct ns__addResponse), 0, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__addResponse(struct soap *soap, const struct ns__addResponse *a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_ns__addResponse); if (soap_out_ns__addResponse(soap, tag?tag:"ns:addResponse", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct ns__addResponse * SOAP_FMAC4 soap_get_ns__addResponse(struct soap *soap, struct ns__addResponse *p, const char *tag, const char *type) { if ((p = soap_in_ns__addResponse(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } #ifndef WITH_NOGLOBAL SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToSOAP_ENV__Reason(struct soap *soap, struct SOAP_ENV__Reason *const*a) { if (!soap_reference(soap, *a, SOAP_TYPE_SOAP_ENV__Reason)) soap_serialize_SOAP_ENV__Reason(soap, *a); } SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerToSOAP_ENV__Reason(struct soap *soap, const char *tag, int id, struct SOAP_ENV__Reason *const*a, const char *type) { id = soap_element_id(soap, tag, id, *a, NULL, 0, type, SOAP_TYPE_SOAP_ENV__Reason); if (id < 0) return soap->error; return soap_out_SOAP_ENV__Reason(soap, tag, id, *a, type); } SOAP_FMAC3 struct SOAP_ENV__Reason ** SOAP_FMAC4 soap_in_PointerToSOAP_ENV__Reason(struct soap *soap, const char *tag, struct SOAP_ENV__Reason **a, const char *type) { if (soap_element_begin_in(soap, tag, 1, NULL)) return NULL; if (!a) if (!(a = (struct SOAP_ENV__Reason **)soap_malloc(soap, sizeof(struct SOAP_ENV__Reason *)))) return NULL; *a = NULL; if (!soap->null && *soap->href != '#') { soap_revert(soap); if (!(*a = soap_in_SOAP_ENV__Reason(soap, tag, *a, type))) return NULL; } else { a = (struct SOAP_ENV__Reason **)soap_id_lookup(soap, soap->href, (void**)a, SOAP_TYPE_SOAP_ENV__Reason, sizeof(struct SOAP_ENV__Reason), 0); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerToSOAP_ENV__Reason(struct soap *soap, struct SOAP_ENV__Reason *const*a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_PointerToSOAP_ENV__Reason); if (soap_out_PointerToSOAP_ENV__Reason(soap, tag?tag:"SOAP-ENV:Reason", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct SOAP_ENV__Reason ** SOAP_FMAC4 soap_get_PointerToSOAP_ENV__Reason(struct soap *soap, struct SOAP_ENV__Reason **p, const char *tag, const char *type) { if ((p = soap_in_PointerToSOAP_ENV__Reason(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } #endif #ifndef WITH_NOGLOBAL SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToSOAP_ENV__Detail(struct soap *soap, struct SOAP_ENV__Detail *const*a) { if (!soap_reference(soap, *a, SOAP_TYPE_SOAP_ENV__Detail)) soap_serialize_SOAP_ENV__Detail(soap, *a); } SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerToSOAP_ENV__Detail(struct soap *soap, const char *tag, int id, struct SOAP_ENV__Detail *const*a, const char *type) { id = soap_element_id(soap, tag, id, *a, NULL, 0, type, SOAP_TYPE_SOAP_ENV__Detail); if (id < 0) return soap->error; return soap_out_SOAP_ENV__Detail(soap, tag, id, *a, type); } SOAP_FMAC3 struct SOAP_ENV__Detail ** SOAP_FMAC4 soap_in_PointerToSOAP_ENV__Detail(struct soap *soap, const char *tag, struct SOAP_ENV__Detail **a, const char *type) { if (soap_element_begin_in(soap, tag, 1, NULL)) return NULL; if (!a) if (!(a = (struct SOAP_ENV__Detail **)soap_malloc(soap, sizeof(struct SOAP_ENV__Detail *)))) return NULL; *a = NULL; if (!soap->null && *soap->href != '#') { soap_revert(soap); if (!(*a = soap_in_SOAP_ENV__Detail(soap, tag, *a, type))) return NULL; } else { a = (struct SOAP_ENV__Detail **)soap_id_lookup(soap, soap->href, (void**)a, SOAP_TYPE_SOAP_ENV__Detail, sizeof(struct SOAP_ENV__Detail), 0); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerToSOAP_ENV__Detail(struct soap *soap, struct SOAP_ENV__Detail *const*a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_PointerToSOAP_ENV__Detail); if (soap_out_PointerToSOAP_ENV__Detail(soap, tag?tag:"SOAP-ENV:Detail", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct SOAP_ENV__Detail ** SOAP_FMAC4 soap_get_PointerToSOAP_ENV__Detail(struct soap *soap, struct SOAP_ENV__Detail **p, const char *tag, const char *type) { if ((p = soap_in_PointerToSOAP_ENV__Detail(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } #endif #ifndef WITH_NOGLOBAL SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToSOAP_ENV__Code(struct soap *soap, struct SOAP_ENV__Code *const*a) { if (!soap_reference(soap, *a, SOAP_TYPE_SOAP_ENV__Code)) soap_serialize_SOAP_ENV__Code(soap, *a); } SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerToSOAP_ENV__Code(struct soap *soap, const char *tag, int id, struct SOAP_ENV__Code *const*a, const char *type) { id = soap_element_id(soap, tag, id, *a, NULL, 0, type, SOAP_TYPE_SOAP_ENV__Code); if (id < 0) return soap->error; return soap_out_SOAP_ENV__Code(soap, tag, id, *a, type); } SOAP_FMAC3 struct SOAP_ENV__Code ** SOAP_FMAC4 soap_in_PointerToSOAP_ENV__Code(struct soap *soap, const char *tag, struct SOAP_ENV__Code **a, const char *type) { if (soap_element_begin_in(soap, tag, 1, NULL)) return NULL; if (!a) if (!(a = (struct SOAP_ENV__Code **)soap_malloc(soap, sizeof(struct SOAP_ENV__Code *)))) return NULL; *a = NULL; if (!soap->null && *soap->href != '#') { soap_revert(soap); if (!(*a = soap_in_SOAP_ENV__Code(soap, tag, *a, type))) return NULL; } else { a = (struct SOAP_ENV__Code **)soap_id_lookup(soap, soap->href, (void**)a, SOAP_TYPE_SOAP_ENV__Code, sizeof(struct SOAP_ENV__Code), 0); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerToSOAP_ENV__Code(struct soap *soap, struct SOAP_ENV__Code *const*a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_PointerToSOAP_ENV__Code); if (soap_out_PointerToSOAP_ENV__Code(soap, tag?tag:"SOAP-ENV:Code", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct SOAP_ENV__Code ** SOAP_FMAC4 soap_get_PointerToSOAP_ENV__Code(struct soap *soap, struct SOAP_ENV__Code **p, const char *tag, const char *type) { if ((p = soap_in_PointerToSOAP_ENV__Code(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } #endif SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTodouble(struct soap *soap, double *const*a) { soap_reference(soap, *a, SOAP_TYPE_double); } SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTodouble(struct soap *soap, const char *tag, int id, double *const*a, const char *type) { id = soap_element_id(soap, tag, id, *a, NULL, 0, type, SOAP_TYPE_double); if (id < 0) return soap->error; return soap_out_double(soap, tag, id, *a, type); } SOAP_FMAC3 double ** SOAP_FMAC4 soap_in_PointerTodouble(struct soap *soap, const char *tag, double **a, const char *type) { if (soap_element_begin_in(soap, tag, 1, NULL)) return NULL; if (!a) if (!(a = (double **)soap_malloc(soap, sizeof(double *)))) return NULL; *a = NULL; if (!soap->null && *soap->href != '#') { soap_revert(soap); if (!(*a = soap_in_double(soap, tag, *a, type))) return NULL; } else { a = (double **)soap_id_lookup(soap, soap->href, (void**)a, SOAP_TYPE_double, sizeof(double), 0); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTodouble(struct soap *soap, double *const*a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_PointerTodouble); if (soap_out_PointerTodouble(soap, tag?tag:"double", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 double ** SOAP_FMAC4 soap_get_PointerTodouble(struct soap *soap, double **p, const char *tag, const char *type) { if ((p = soap_in_PointerTodouble(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC3 int SOAP_FMAC4 soap_out__QName(struct soap *soap, const char *tag, int id, char *const*a, const char *type) { return soap_outstring(soap, tag, id, a, type, SOAP_TYPE__QName); } SOAP_FMAC3 char * * SOAP_FMAC4 soap_in__QName(struct soap *soap, const char *tag, char **a, const char *type) { char **p; p = soap_instring(soap, tag, a, type, SOAP_TYPE__QName, 2, 0, -1); return p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put__QName(struct soap *soap, char *const*a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE__QName); if (soap_out__QName(soap, tag?tag:"byte", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 char ** SOAP_FMAC4 soap_get__QName(struct soap *soap, char **p, const char *tag, const char *type) { if ((p = soap_in__QName(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC3 void SOAP_FMAC4 soap_default_string(struct soap *soap, char **a) { (void)soap; /* appease -Wall -Werror */ #ifdef SOAP_DEFAULT_string *a = SOAP_DEFAULT_string; #else *a = (char *)0; #endif } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_string(struct soap *soap, char *const*a) { soap_reference(soap, *a, SOAP_TYPE_string); } SOAP_FMAC3 int SOAP_FMAC4 soap_out_string(struct soap *soap, const char *tag, int id, char *const*a, const char *type) { return soap_outstring(soap, tag, id, a, type, SOAP_TYPE_string); } SOAP_FMAC3 char * * SOAP_FMAC4 soap_in_string(struct soap *soap, const char *tag, char **a, const char *type) { char **p; p = soap_instring(soap, tag, a, type, SOAP_TYPE_string, 1, 0, -1); return p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_string(struct soap *soap, char *const*a, const char *tag, const char *type) { register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_string); if (soap_out_string(soap, tag?tag:"byte", id, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 char ** SOAP_FMAC4 soap_get_string(struct soap *soap, char **p, const char *tag, const char *type) { if ((p = soap_in_string(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } #ifdef __cplusplus } #endif #if defined(__BORLANDC__) #pragma option pop #pragma option pop #endif /* End of calcC.c */ gsoap-2.8.28/gsoap/samples/chaining/README.txt0000644000175000017500000000246712653650154020337 0ustar ellertellert How to combine multiple C services into one server executable and let the services listen to the same port (or serve over CGI)? Run wsdl2h on each WSDL, with "wsdl2h -c name.wsdl" to produce name.h Run "soapcpp2 -c -S -np name name.h" to produce nameServerLib.c Run "soapcpp2 -c -CS -penv env.h" on an empty env.h (or an env.h with shared SOAP Header and SOAP Fault definitions) to produce envC.c for Header and Fault processing. Say we have name1 and name2 services, each with different methods ns1__method1 and ns2__method2. Implement service chaining as follows: #include "name1.nsmap" #include "name2.nsmap" int main() { struct soap *soap = soap_new(); soap_set_namespaces(soap, name1_namespaces); /* serve over stdin/out, CGI style */ if (soap_begin_serve(soap)) soap_print_fault(soap, stderr); else if (name1_serve_request(soap) == SOAP_NO_METHOD) { soap_set_namespaces(soap, name2_namespaces); if (name2_serve_request(soap)) soap_print_fault(soap, stderr); } soap_destroy(soap); soap_end(soap); soap_free(soap); return 0; } int ns1__method1(struct soap *soap, ...) { ... return SOAP_OK; } int ns2__method2(struct soap *soap, ...) { ... return SOAP_OK; } gsoap-2.8.28/gsoap/samples/chaining/header.h0000644000175000017500000000120412653650154020226 0ustar ellertellert/* header.h Example SOAP Header definitions, to demonstrate the use of env.h. This file defines the SOAP Header data structure shared by client and service modules Copyright (C) 2000-2002 Robert A. van Engelen. All Rights Reserved. */ //gsoap h schema namespace: http://websrv.cs.fsu.edu/~engelen/h.xsd // h:authentication type of SOAP Header element struct h__authentication { @char *userid; // userid XML attribute @char *passwd; // passwd XML attribute }; // add the above to the SOAP Header elements: struct SOAP_ENV__Header { struct h__authentication *h__credentials; // rendered as XML }; gsoap-2.8.28/gsoap/samples/chaining/calc.h0000644000175000017500000001041012653650154017677 0ustar ellertellert/* calc.h This is a gSOAP header file with web service definitions. The service operations and type definitions use familiar C/C++ syntax. The following methods are defined by this gSOAP service definition: add(a,b) sub(a,b) mul(a,b) div(a,b) pow(a,b) Compilation in C (see samples/calc): $ soapcpp2 -c calc.h $ cc -o calcclient calcclient.c stdsoap2.c soapC.c soapClient.c $ cc -o calcserver calcserver.c stdsoap2.c soapC.c soapServer.c Compilation in C++ (see samples/calc++): $ soapcpp2 -i calc.h $ cc -o calcclient++ calcclient.cpp stdsoap2.cpp soapC.cpp soapcalcProxy.cpp $ cc -o calcserver++ calcserver.cpp stdsoap2.cpp soapC.cpp soapcalcService.cpp Note that soapcpp2 option -i generates proxy and service classes, which encapsulate the method operations in the class instead of defining them as global functions as in C. The //gsoap directives are used to bind XML namespaces and to define Web service properties: //gsoap service name: //gsoap service style: [rpc|document] //gsoap service encoding: [literal|encoded] //gsoap service namespace: //gsoap service location: Web service operation properties: //gsoap service method-style: [rpc|document] //gsoap service method-encoding: [literal|encoded] //gsoap service method-action: //gsoap service method-documentation: and type schema properties: //gsoap schema namespace: //gsoap schema elementForm: [qualified|unqualified] //gsoap schema attributeForm: [qualified|unqualified] //gsoap schema documentation: //gsoap schema type-documentation: where is an XML namespace prefix, which is used in C/C++ operation names, e.g. ns__add(), and type names, e.g. xsd__int. See the documentation for the full list of //gsoap directives. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap ns service name: calc Simple calculator service //gsoap ns service protocol: SOAP //gsoap ns service style: rpc //gsoap ns service encoding: encoded //gsoap ns service namespace: http://websrv.cs.fsu.edu/~engelen/calc.wsdl //gsoap ns service location: http://websrv.cs.fsu.edu/~engelen/calcserver.cgi //gsoap ns schema namespace: urn:calc //gsoap ns service method-documentation: add Sums two values int ns__add(double a, double b, double *result); //gsoap ns service method-documentation: sub Subtracts two values int ns__sub(double a, double b, double *result); //gsoap ns service method-documentation: mul Multiplies two values int ns__mul(double a, double b, double *result); //gsoap ns service method-documentation: div Divides two values int ns__div(double a, double b, double *result); //gsoap ns service method-documentation: pow Raises a to b int ns__pow(double a, double b, double *result); gsoap-2.8.28/gsoap/samples/chaining/Makefile.am0000644000175000017500000000205412653650154020665 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 noinst_PROGRAMS = chaining include ../Makefile.defines # include ../Makefile.c_rules envC.c: env.h $(SOAP) -c -CS -penv -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $< qServerLib.c: quote.h $(SOAP) -c -S -np q -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $< cServerLib.c: calc.h $(SOAP) -c -S -np c -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $< BUILT_SOURCES = qServerLib.c cServerLib.c envC.c CLEANFILES = *.req.xml *.res.xml *.nsmap *.xsd *.wsdl envStub.h envH.h envC.c cStub.h cH.h cC.c cClient.c cServer.c cClientLib.c cServerLib.c qStub.h qH.h qC.c qClient.c qServer.c qClientLib.c qServerLib.c *~ SOAP_NS = c.nsmap chaining_SOURCES = chaining.c quote.h calc.h env.h qServerLib.c cServerLib.c envC.c chaining_LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) -lm gsoap-2.8.28/gsoap/samples/chaining/fault.h0000644000175000017500000000234612653650154020121 0ustar ellertellert/* fault.h Example SOAP Fault detail definitions, to demonstrate the use of env.h. Defines optional SOAP Fault derail data structures Copyright (C) 2000-2004 Robert A. van Engelen. All Rights Reserved. */ /* Add any data structure you want to serialize as part of the SOAP Fault detail element. The detail element '__type' and 'value' fields should be set to transmit data. The fields are set when data of corresponding types are received. For example, we define an of name with a string vector (note the leading _ in the following declaration): class _f__myData { public: std::vector *data; }; To return a fault from your service application: soap_sender_fault(soap, "An error occurred", NULL)); // set soap fault soap->fault->detail = (struct SOAP_ENV__Detail*)soap_malloc(soap, sizeof(struct SOAP_ENV__Detail)); soap->fault->detail->__type = SOAP_TYPE__f__myData; soap->fault->detail->value = soap_new__f__myData(soap, -1); return SOAP_FAULT; In addition, you can modify the SOAP_ENV__Detail struct and add your own set of fields, as in: struct SOAP_ENV__Detail { struct f__myDataType f__myData; int __type; void *value; char *__any; // or use '_XML __any' to store literal XML content }; */ gsoap-2.8.28/gsoap/samples/chaining/quoteServerLib.c0000644000175000017500000000135312653650154021751 0ustar ellertellert/* quoteServerLib.c Generated by gSOAP 2.8.8 from quote.h Copyright(C) 2000-2012, Robert van Engelen, Genivia Inc. All Rights Reserved. The generated code is released under one of the following licenses: 1) GPL or 2) Genivia's license for commercial use. This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. */ /** Use this file in your project build instead of the two files quoteC.c and quoteServer.c. This hides the serializer functions and avoids linking problems when linking multiple clients and servers. */ #ifndef WITH_NOGLOBAL #define WITH_NOGLOBAL #endif #define SOAP_FMAC3 static #include "quoteC.c" #include "quoteServer.c" /* End of quoteServerLib.c */ gsoap-2.8.28/gsoap/samples/chaining/calcServer.c0000644000175000017500000002327412653650154021075 0ustar ellertellert/* calcServer.c Generated by gSOAP 2.8.8 from calc.h Copyright(C) 2000-2012, Robert van Engelen, Genivia Inc. All Rights Reserved. The generated code is released under one of the following licenses: 1) GPL or 2) Genivia's license for commercial use. This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. */ #if defined(__BORLANDC__) #pragma option push -w-8060 #pragma option push -w-8004 #endif #include "calcH.h" #ifdef __cplusplus extern "C" { #endif SOAP_SOURCE_STAMP("@(#) calcServer.c ver 2.8.8 2012-04-18 14:36:19 GMT") SOAP_FMAC5 int SOAP_FMAC6 calc_serve(struct soap *soap) { #ifndef WITH_FASTCGI unsigned int k = soap->max_keep_alive; #endif do { #ifndef WITH_FASTCGI if (soap->max_keep_alive > 0 && !--k) soap->keep_alive = 0; #endif if (soap_begin_serve(soap)) { if (soap->error >= SOAP_STOP) continue; return soap->error; } if (calc_serve_request(soap) || (soap->fserveloop && soap->fserveloop(soap))) { #ifdef WITH_FASTCGI soap_send_fault(soap); #else return soap_send_fault(soap); #endif } #ifdef WITH_FASTCGI soap_destroy(soap); soap_end(soap); } while (1); #else } while (soap->keep_alive); #endif return SOAP_OK; } #ifndef WITH_NOSERVEREQUEST SOAP_FMAC5 int SOAP_FMAC6 calc_serve_request(struct soap *soap) { soap_peek_element(soap); if (!soap_match_tag(soap, soap->tag, "ns:add")) return soap_serve_ns__add(soap); if (!soap_match_tag(soap, soap->tag, "ns:sub")) return soap_serve_ns__sub(soap); if (!soap_match_tag(soap, soap->tag, "ns:mul")) return soap_serve_ns__mul(soap); if (!soap_match_tag(soap, soap->tag, "ns:div")) return soap_serve_ns__div(soap); if (!soap_match_tag(soap, soap->tag, "ns:pow")) return soap_serve_ns__pow(soap); return soap->error = SOAP_NO_METHOD; } #endif SOAP_FMAC5 int SOAP_FMAC6 soap_serve_ns__add(struct soap *soap) { struct ns__add soap_tmp_ns__add; struct ns__addResponse soap_tmp_ns__addResponse; double soap_tmp_double; soap_default_ns__addResponse(soap, &soap_tmp_ns__addResponse); soap_default_double(soap, &soap_tmp_double); soap_tmp_ns__addResponse.result = &soap_tmp_double; soap_default_ns__add(soap, &soap_tmp_ns__add); soap->encodingStyle = ""; if (!soap_get_ns__add(soap, &soap_tmp_ns__add, "ns:add", NULL)) return soap->error; if (soap_body_end_in(soap) || soap_envelope_end_in(soap) || soap_end_recv(soap)) return soap->error; soap->error = ns__add(soap, soap_tmp_ns__add.a, soap_tmp_ns__add.b, soap_tmp_ns__addResponse.result); if (soap->error) return soap->error; soap_serializeheader(soap); soap_serialize_ns__addResponse(soap, &soap_tmp_ns__addResponse); if (soap_begin_count(soap)) return soap->error; if (soap->mode & SOAP_IO_LENGTH) { if (soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_put_ns__addResponse(soap, &soap_tmp_ns__addResponse, "ns:addResponse", NULL) || soap_body_end_out(soap) || soap_envelope_end_out(soap)) return soap->error; }; if (soap_end_count(soap) || soap_response(soap, SOAP_OK) || soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_put_ns__addResponse(soap, &soap_tmp_ns__addResponse, "ns:addResponse", NULL) || soap_body_end_out(soap) || soap_envelope_end_out(soap) || soap_end_send(soap)) return soap->error; return soap_closesock(soap); } SOAP_FMAC5 int SOAP_FMAC6 soap_serve_ns__sub(struct soap *soap) { struct ns__sub soap_tmp_ns__sub; struct ns__subResponse soap_tmp_ns__subResponse; double soap_tmp_double; soap_default_ns__subResponse(soap, &soap_tmp_ns__subResponse); soap_default_double(soap, &soap_tmp_double); soap_tmp_ns__subResponse.result = &soap_tmp_double; soap_default_ns__sub(soap, &soap_tmp_ns__sub); soap->encodingStyle = ""; if (!soap_get_ns__sub(soap, &soap_tmp_ns__sub, "ns:sub", NULL)) return soap->error; if (soap_body_end_in(soap) || soap_envelope_end_in(soap) || soap_end_recv(soap)) return soap->error; soap->error = ns__sub(soap, soap_tmp_ns__sub.a, soap_tmp_ns__sub.b, soap_tmp_ns__subResponse.result); if (soap->error) return soap->error; soap_serializeheader(soap); soap_serialize_ns__subResponse(soap, &soap_tmp_ns__subResponse); if (soap_begin_count(soap)) return soap->error; if (soap->mode & SOAP_IO_LENGTH) { if (soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_put_ns__subResponse(soap, &soap_tmp_ns__subResponse, "ns:subResponse", NULL) || soap_body_end_out(soap) || soap_envelope_end_out(soap)) return soap->error; }; if (soap_end_count(soap) || soap_response(soap, SOAP_OK) || soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_put_ns__subResponse(soap, &soap_tmp_ns__subResponse, "ns:subResponse", NULL) || soap_body_end_out(soap) || soap_envelope_end_out(soap) || soap_end_send(soap)) return soap->error; return soap_closesock(soap); } SOAP_FMAC5 int SOAP_FMAC6 soap_serve_ns__mul(struct soap *soap) { struct ns__mul soap_tmp_ns__mul; struct ns__mulResponse soap_tmp_ns__mulResponse; double soap_tmp_double; soap_default_ns__mulResponse(soap, &soap_tmp_ns__mulResponse); soap_default_double(soap, &soap_tmp_double); soap_tmp_ns__mulResponse.result = &soap_tmp_double; soap_default_ns__mul(soap, &soap_tmp_ns__mul); soap->encodingStyle = ""; if (!soap_get_ns__mul(soap, &soap_tmp_ns__mul, "ns:mul", NULL)) return soap->error; if (soap_body_end_in(soap) || soap_envelope_end_in(soap) || soap_end_recv(soap)) return soap->error; soap->error = ns__mul(soap, soap_tmp_ns__mul.a, soap_tmp_ns__mul.b, soap_tmp_ns__mulResponse.result); if (soap->error) return soap->error; soap_serializeheader(soap); soap_serialize_ns__mulResponse(soap, &soap_tmp_ns__mulResponse); if (soap_begin_count(soap)) return soap->error; if (soap->mode & SOAP_IO_LENGTH) { if (soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_put_ns__mulResponse(soap, &soap_tmp_ns__mulResponse, "ns:mulResponse", NULL) || soap_body_end_out(soap) || soap_envelope_end_out(soap)) return soap->error; }; if (soap_end_count(soap) || soap_response(soap, SOAP_OK) || soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_put_ns__mulResponse(soap, &soap_tmp_ns__mulResponse, "ns:mulResponse", NULL) || soap_body_end_out(soap) || soap_envelope_end_out(soap) || soap_end_send(soap)) return soap->error; return soap_closesock(soap); } SOAP_FMAC5 int SOAP_FMAC6 soap_serve_ns__div(struct soap *soap) { struct ns__div soap_tmp_ns__div; struct ns__divResponse soap_tmp_ns__divResponse; double soap_tmp_double; soap_default_ns__divResponse(soap, &soap_tmp_ns__divResponse); soap_default_double(soap, &soap_tmp_double); soap_tmp_ns__divResponse.result = &soap_tmp_double; soap_default_ns__div(soap, &soap_tmp_ns__div); soap->encodingStyle = ""; if (!soap_get_ns__div(soap, &soap_tmp_ns__div, "ns:div", NULL)) return soap->error; if (soap_body_end_in(soap) || soap_envelope_end_in(soap) || soap_end_recv(soap)) return soap->error; soap->error = ns__div(soap, soap_tmp_ns__div.a, soap_tmp_ns__div.b, soap_tmp_ns__divResponse.result); if (soap->error) return soap->error; soap_serializeheader(soap); soap_serialize_ns__divResponse(soap, &soap_tmp_ns__divResponse); if (soap_begin_count(soap)) return soap->error; if (soap->mode & SOAP_IO_LENGTH) { if (soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_put_ns__divResponse(soap, &soap_tmp_ns__divResponse, "ns:divResponse", NULL) || soap_body_end_out(soap) || soap_envelope_end_out(soap)) return soap->error; }; if (soap_end_count(soap) || soap_response(soap, SOAP_OK) || soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_put_ns__divResponse(soap, &soap_tmp_ns__divResponse, "ns:divResponse", NULL) || soap_body_end_out(soap) || soap_envelope_end_out(soap) || soap_end_send(soap)) return soap->error; return soap_closesock(soap); } SOAP_FMAC5 int SOAP_FMAC6 soap_serve_ns__pow(struct soap *soap) { struct ns__pow soap_tmp_ns__pow; struct ns__powResponse soap_tmp_ns__powResponse; double soap_tmp_double; soap_default_ns__powResponse(soap, &soap_tmp_ns__powResponse); soap_default_double(soap, &soap_tmp_double); soap_tmp_ns__powResponse.result = &soap_tmp_double; soap_default_ns__pow(soap, &soap_tmp_ns__pow); soap->encodingStyle = ""; if (!soap_get_ns__pow(soap, &soap_tmp_ns__pow, "ns:pow", NULL)) return soap->error; if (soap_body_end_in(soap) || soap_envelope_end_in(soap) || soap_end_recv(soap)) return soap->error; soap->error = ns__pow(soap, soap_tmp_ns__pow.a, soap_tmp_ns__pow.b, soap_tmp_ns__powResponse.result); if (soap->error) return soap->error; soap_serializeheader(soap); soap_serialize_ns__powResponse(soap, &soap_tmp_ns__powResponse); if (soap_begin_count(soap)) return soap->error; if (soap->mode & SOAP_IO_LENGTH) { if (soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_put_ns__powResponse(soap, &soap_tmp_ns__powResponse, "ns:powResponse", NULL) || soap_body_end_out(soap) || soap_envelope_end_out(soap)) return soap->error; }; if (soap_end_count(soap) || soap_response(soap, SOAP_OK) || soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_put_ns__powResponse(soap, &soap_tmp_ns__powResponse, "ns:powResponse", NULL) || soap_body_end_out(soap) || soap_envelope_end_out(soap) || soap_end_send(soap)) return soap->error; return soap_closesock(soap); } #ifdef __cplusplus } #endif #if defined(__BORLANDC__) #pragma option pop #pragma option pop #endif /* End of calcServer.c */ gsoap-2.8.28/gsoap/samples/Makefile.cpp_rules0000644000175000017500000000110212653650156020477 0ustar ellertellert## common Makefile rules for building the C++ - soap samples ## SOAP_CPP_SRC = $(SOAP_CPP_CLIENT) soapServer.cpp $(SOAP_H_FILES) $(SOAP_NS) $(SOAP_CPP_SRC) : $(SOAPHEADER) $(SOAP) -L -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $(SOAPHEADER) LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_CPP_SRC) CLEANFILES = $(SOAP_CPP_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.cpp soap*Proxy.h soap*Proxy.cpp soap*Object.h soap*Service.h soap*Service.cpp soapClient.cpp soapServer.cpp soapClientLib.cpp soapServerLib.cpp *~ gsoap-2.8.28/gsoap/samples/calc/0000755000175000017500000000000012653650162015751 5ustar ellertellertgsoap-2.8.28/gsoap/samples/calc/Makefile.in0000644000175000017500000004604712653650162020031 0ustar ellertellert# Makefile.in generated by automake 1.14 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = calcclient$(EXEEXT) calcserver$(EXEEXT) DIST_COMMON = $(srcdir)/../Makefile.defines \ $(srcdir)/../Makefile.c_rules $(srcdir)/Makefile.in \ $(srcdir)/Makefile.am $(top_srcdir)/mkinstalldirs \ $(top_srcdir)/depcomp subdir = gsoap/samples/calc ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = am__objects_2 = soapC.$(OBJEXT) am__objects_3 = soapClient.$(OBJEXT) $(am__objects_2) am_calcclient_OBJECTS = calcclient.$(OBJEXT) $(am__objects_1) \ $(am__objects_3) calcclient_OBJECTS = $(am_calcclient_OBJECTS) am__DEPENDENCIES_1 = calcclient_DEPENDENCIES = $(SOAP_C_LIB) $(am__DEPENDENCIES_1) am__objects_4 = soapServer.$(OBJEXT) $(am__objects_2) am_calcserver_OBJECTS = calcserver.$(OBJEXT) $(am__objects_1) \ $(am__objects_4) calcserver_OBJECTS = $(am_calcserver_OBJECTS) calcserver_DEPENDENCIES = $(SOAP_C_LIB) $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(calcclient_SOURCES) $(calcserver_SOURCES) DIST_SOURCES = $(calcclient_SOURCES) $(calcserver_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ STRIP = @STRIP@ VERSION = @VERSION@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 SOAPHEADER = calc.h AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a SOAP_C_SRC = $(SOAP_C_CLIENT) soapServer.c $(SOAP_H_FILES) $(SOAP_NS) LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_C_SRC) CLEANFILES = $(SOAP_C_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.c soapClient.c soapClientLib.c soapServer.c soapServerLib.c *~ SOAP_NS = calc.nsmap calc.wsdl calcclient_SOURCES = calcclient.c $(SOAPHEADER) $(SOAP_C_CLIENT) calcclient_LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) calcserver_SOURCES = calcserver.c $(SOAPHEADER) $(SOAP_C_SERVER) calcserver_LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) -lm all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.c_rules $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/calc/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/calc/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.c_rules: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) calcclient$(EXEEXT): $(calcclient_OBJECTS) $(calcclient_DEPENDENCIES) $(EXTRA_calcclient_DEPENDENCIES) @rm -f calcclient$(EXEEXT) $(AM_V_CCLD)$(LINK) $(calcclient_OBJECTS) $(calcclient_LDADD) $(LIBS) calcserver$(EXEEXT): $(calcserver_OBJECTS) $(calcserver_DEPENDENCIES) $(EXTRA_calcserver_DEPENDENCIES) @rm -f calcserver$(EXEEXT) $(AM_V_CCLD)$(LINK) $(calcserver_OBJECTS) $(calcserver_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/calcclient.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/calcserver.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapC.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapClient.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapServer.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am $(SOAP_C_SRC) : $(SOAPHEADER) $(SOAP) -cL -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $(SOAPHEADER) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.28/gsoap/samples/calc/calcserver.c0000644000175000017500000000701112653650154020246 0ustar ellertellert/* calcserver.c Example calculator service in C Compilation in C (see samples/calc/calc.h): $ soapcpp2 -c calc.h $ cc -o calcserver calcserver.c stdsoap2.c soapC.c soapServer.c where stdsoap2.c is in the 'gsoap' directory, or use libgsoap: $ cc -o calcserver calcserver.c soapC.c soapServer.c -lgsoap -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" #include "calc.nsmap" int main(int argc, char **argv) { SOAP_SOCKET m, s; /* master and slave sockets */ struct soap soap; soap_init(&soap); if (argc < 2) soap_serve(&soap); /* serve as CGI application */ else { m = soap_bind(&soap, NULL, atoi(argv[1]), 100); if (!soap_valid_socket(m)) { soap_print_fault(&soap, stderr); exit(-1); } fprintf(stderr, "Socket connection successful: master socket = %d\n", m); for ( ; ; ) { s = soap_accept(&soap); fprintf(stderr, "Socket connection successful: slave socket = %d\n", s); if (!soap_valid_socket(s)) { soap_print_fault(&soap, stderr); exit(-1); } soap_serve(&soap); soap_end(&soap); } } return 0; } int ns__add(struct soap *soap, double a, double b, double *result) { (void)soap; *result = a + b; return SOAP_OK; } int ns__sub(struct soap *soap, double a, double b, double *result) { (void)soap; *result = a - b; return SOAP_OK; } int ns__mul(struct soap *soap, double a, double b, double *result) { (void)soap; *result = a * b; return SOAP_OK; } int ns__div(struct soap *soap, double a, double b, double *result) { if (b) *result = a / b; else { char *s = (char*)soap_malloc(soap, 1024); (SOAP_SNPRINTF(s, 1024, 100), "Can't divide %f by %f", a, b); return soap_sender_fault(soap, "Division by zero", s); } return SOAP_OK; } int ns__pow(struct soap *soap, double a, double b, double *result) { *result = pow(a, b); if (soap_errno == EDOM) /* soap_errno is like errno, but compatible with Win32 */ { char *s = (char*)soap_malloc(soap, 1024); (SOAP_SNPRINTF(s, 1024, 100), "Can't raise %f to %f", a, b); return soap_sender_fault(soap, "Power function domain error", s); } return SOAP_OK; } gsoap-2.8.28/gsoap/samples/calc/README.txt0000644000175000017500000001333712653650154017457 0ustar ellertellertSimple calculator service implements: add(a,b) sub(a,b) mul(a,b) div(a,b) pow(a,b) Compilation in C (see samples/calc): soapcpp2 -c calc.h cc -o calcclient calcclient.c stdsoap2.c soapC.c soapClient.c cc -o calcserver calcserver.c stdsoap2.c soapC.c soapServer.c Compilation in C++ (see samples/calc++): soapcpp2 -i calc.h cc -o calcclient++ calcclient.cpp stdsoap2.cpp soapC.cpp soapcalcProxy.cpp cc -o calcserver++ calcserver.cpp stdsoap2.cpp soapC.cpp soapcalcService.cpp For C++ development soapcpp2 option -i generates proxy and service classes, which encapsulate the method operations in the class instead of defining them as global functions as in C. The calcclient application invokes the service and is used from the command line as follows: $ calcclient add 3 4 result = 7 The calcserver application is a CGI application that can be installed under the cgibin of your Web server. The C client-side uses: Initialization of the runtime engine: soap_init(struct soap*) Invoking a call of xyz, this function is generated by soapcpp2: soap_call_ns__xyz(struct soap*, const char *endpoint, const char *action, double a, double b, double *result) Note: endpoint=NULL and action=NULL for defaults Print communication errors: soap_print_fault(struct soap*, FILE*) Allocate data, which stays alive until deallocated by soap_end() soap_malloc(struct soap*, size_t len) Delete deserialized data: soap_end(struct soap*) Finalize and detach the runtime engine: soap_done(struct soap*) The C server-side uses: Initialization of the runtime engine: soap_init(struct soap*) Binding the port: soap_bind(struct soap*, const char *host, int port, int backlog) Accepting a request: soap_accept(struct soap*); Invoking the service dispatcher, this function is generated by soapcpp2: soap_serve(struct soap*) Print communication errors: soap_print_fault(struct soap*, FILE*) Allocate data, which stays alive until deallocated by soap_end() soap_malloc(struct soap*, size_t len) Delete deserialized data: soap_end(struct soap*) Send back sender-related fault: soap_sender_fault(struct soap*, const char *string, const char *detailXML) Send back receiver-related fault: soap_receiver_fault(struct soap*, const char *string, const char *detailXML) Finalize and detach the runtime engine: soap_done(struct soap*) Service operations are not auto-generated (user-defined): ns__add(struct soap*, double a, double b, double *result) ns__sub(struct soap*, double a, double b, double *result) ns__mul(struct soap*, double a, double b, double *result) ns__div(struct soap*, double a, double b, double *result) ns__pow(struct soap*, double a, double b, double *result) The C++ client-side uses a proxy generated with soapcpp2 -i: class calcProxy The default endpoint can be changed: const char *calcProxxy::endpoint Invoke a call of xyz: calcProxy::xyz(double a, double b, double *result) Print communication errors: calcProxy::soap_stream_fault(std::ostream&) Error code (see list of error codes in documentation and stdsoap2.h): calcProxy::error Allocate data, deallocated by soap_end() or calcProxy destructor soap_malloc(calcProxy*, size_t len) Get new instance of class X, deallocated by soap_destroy() or calcProxy destructor soap_new_X(calcProxy*, -1) Get array of new instances of class X, deallocated by soap_destroy() or calcProxy destructor soap_new_X(calcProxy*, arraylen) Delete deserialized C++ class instances (also part of calcProxy destructor): soap_destroy(calcProxy*) Delete deserialized data (also part of calcProxy destructor): soap_end(calcProxy*) The C++ server-side uses a class generated with soapcpp2 -i: class calcService Serve requests over stdin/out (for CGI) calcService::serve() Serve multiple requests over port (iterative HTTP server): calcService::run() Print communication errors: calcService::soap_stream_fault(std::ostream&) Error code (see list of error codes in documentation and stdsoap2.h): calcService::error Send back sender-related fault: calcService::soap_senderfault(const char *string, const char *detailXML) Send back sender-related fault with subcode (SOAP 1.2): calcService::soap_senderfault(const char *subcodeQName, const char *string, const char *detailXML) Send back receiver-related fault: calcService::soap_receiver_fault(const char *string, const char *detailXML) Send back receiver-related fault with subcode (SOAP 1.2): calcService::soap_receiver_fault(const char *subcodeQName, const char *string, const char *detailXML) Service operations are user-defined (not auto-generated): calcService::add(double a, double b, double *result) calcService::sub(double a, double b, double *result) calcService::mul(double a, double b, double *result) calcService::div(double a, double b, double *result) calcService::pow(double a, double b, double *result) Allocate data, deallocated by soap_end() or calcService destructor soap_malloc(calcService*, size_t len) Get new instance of class X, deallocated by soap_destroy() or calcService destructor soap_new_X(calcService*, -1) Get array of new instances of class X, deallocated by soap_destroy() or calcService destructor soap_new_X(calcService*, arraylen) Delete deserialized C++ class instances (also part of calcService destructor): soap_destroy(calcService*) Delete deserialized data (also part of calcService destructor): soap_end(calcService*) Note: all soap_xyz(struct soap*, ...) gSOAP API functions are also available to the calcProxy and calcService classes by inheritance of the struct soap runtime engine state object. gsoap-2.8.28/gsoap/samples/calc/calcclient.c0000644000175000017500000000546412653650154020230 0ustar ellertellert/* calcclient.c Example calculator service client in C Compilation in C (see samples/calc/calc.h): $ soapcpp2 -c calc.h $ cc -o calcclient calcclient.c stdsoap2.c soapC.c soapClient.c where stdsoap2.c is in the 'gsoap' directory, or use libgsoap: $ cc -o calcclient calcclient.c soapC.c soapClient.c -lgsoap -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" #include "calc.nsmap" const char server[] = "http://websrv.cs.fsu.edu/~engelen/calcserver.cgi"; /* = "http://localhost:8080"; to test against samples/webserver */ int main(int argc, char **argv) { struct soap soap; double a, b, result; if (argc < 4) { fprintf(stderr, "Usage: [add|sub|mul|div|pow] num num\n"); exit(0); } soap_init1(&soap, SOAP_XML_INDENT); a = strtod(argv[2], NULL); b = strtod(argv[3], NULL); switch (*argv[1]) { case 'a': soap_call_ns__add(&soap, server, "", a, b, &result); break; case 's': soap_call_ns__sub(&soap, server, "", a, b, &result); break; case 'm': soap_call_ns__mul(&soap, server, "", a, b, &result); break; case 'd': soap_call_ns__div(&soap, server, "", a, b, &result); break; case 'p': soap_call_ns__pow(&soap, server, "", a, b, &result); break; default: fprintf(stderr, "Unknown command\n"); exit(0); } if (soap.error) { soap_print_fault(&soap, stderr); exit(1); } else printf("result = %g\n", result); soap_destroy(&soap); soap_end(&soap); soap_done(&soap); return 0; } gsoap-2.8.28/gsoap/samples/calc/calc.h0000644000175000017500000001041012653650154017021 0ustar ellertellert/* calc.h This is a gSOAP header file with web service definitions. The service operations and type definitions use familiar C/C++ syntax. The following methods are defined by this gSOAP service definition: add(a,b) sub(a,b) mul(a,b) div(a,b) pow(a,b) Compilation in C (see samples/calc): $ soapcpp2 -c calc.h $ cc -o calcclient calcclient.c stdsoap2.c soapC.c soapClient.c $ cc -o calcserver calcserver.c stdsoap2.c soapC.c soapServer.c Compilation in C++ (see samples/calc++): $ soapcpp2 -i calc.h $ cc -o calcclient++ calcclient.cpp stdsoap2.cpp soapC.cpp soapcalcProxy.cpp $ cc -o calcserver++ calcserver.cpp stdsoap2.cpp soapC.cpp soapcalcService.cpp Note that soapcpp2 option -i generates proxy and service classes, which encapsulate the method operations in the class instead of defining them as global functions as in C. The //gsoap directives are used to bind XML namespaces and to define Web service properties: //gsoap service name: //gsoap service style: [rpc|document] //gsoap service encoding: [literal|encoded] //gsoap service namespace: //gsoap service location: Web service operation properties: //gsoap service method-style: [rpc|document] //gsoap service method-encoding: [literal|encoded] //gsoap service method-action: //gsoap service method-documentation: and type schema properties: //gsoap schema namespace: //gsoap schema elementForm: [qualified|unqualified] //gsoap schema attributeForm: [qualified|unqualified] //gsoap schema documentation: //gsoap schema type-documentation: where is an XML namespace prefix, which is used in C/C++ operation names, e.g. ns__add(), and type names, e.g. xsd__int. See the documentation for the full list of //gsoap directives. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap ns service name: calc Simple calculator service //gsoap ns service protocol: SOAP //gsoap ns service style: rpc //gsoap ns service encoding: encoded //gsoap ns service namespace: http://websrv.cs.fsu.edu/~engelen/calc.wsdl //gsoap ns service location: http://websrv.cs.fsu.edu/~engelen/calcserver.cgi //gsoap ns schema namespace: urn:calc //gsoap ns service method-documentation: add Sums two values int ns__add(double a, double b, double *result); //gsoap ns service method-documentation: sub Subtracts two values int ns__sub(double a, double b, double *result); //gsoap ns service method-documentation: mul Multiplies two values int ns__mul(double a, double b, double *result); //gsoap ns service method-documentation: div Divides two values int ns__div(double a, double b, double *result); //gsoap ns service method-documentation: pow Raises a to b int ns__pow(double a, double b, double *result); gsoap-2.8.28/gsoap/samples/calc/Makefile.am0000644000175000017500000000117112653650154020006 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 noinst_PROGRAMS = calcclient calcserver SOAPHEADER = calc.h include ../Makefile.defines include ../Makefile.c_rules SOAP_NS = calc.nsmap calc.wsdl calcclient_SOURCES = calcclient.c $(SOAPHEADER) $(SOAP_C_CLIENT) calcclient_LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) calcserver_SOURCES = calcserver.c $(SOAPHEADER) $(SOAP_C_SERVER) calcserver_LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) -lm gsoap-2.8.28/gsoap/samples/lu/0000755000175000017500000000000012653650170015466 5ustar ellertellertgsoap-2.8.28/gsoap/samples/lu/Makefile.in0000644000175000017500000004740012653650156017544 0ustar ellertellert# Makefile.in generated by automake 1.14 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = luclient$(EXEEXT) luserver.cgi$(EXEEXT) DIST_COMMON = $(srcdir)/../Makefile.defines \ $(srcdir)/../Makefile.cpp_rules $(srcdir)/Makefile.in \ $(srcdir)/Makefile.am $(top_srcdir)/mkinstalldirs \ $(top_srcdir)/depcomp subdir = gsoap/samples/lu ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = am__objects_2 = soapC.$(OBJEXT) am__objects_3 = soapClient.$(OBJEXT) $(am__objects_2) am_luclient_OBJECTS = luclient.$(OBJEXT) lumat.$(OBJEXT) \ $(am__objects_1) $(am__objects_3) luclient_OBJECTS = $(am_luclient_OBJECTS) am__DEPENDENCIES_1 = luclient_DEPENDENCIES = $(SOAP_CPP_LIB) $(am__DEPENDENCIES_1) am__objects_4 = soapServer.$(OBJEXT) $(am__objects_2) am_luserver_cgi_OBJECTS = luserver.$(OBJEXT) lumat.$(OBJEXT) \ $(am__objects_1) $(am__objects_4) luserver_cgi_OBJECTS = $(am_luserver_cgi_OBJECTS) luserver_cgi_DEPENDENCIES = $(SOAP_CPP_LIB) $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(luclient_SOURCES) $(luserver_cgi_SOURCES) DIST_SOURCES = $(luclient_SOURCES) $(luserver_cgi_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ STRIP = @STRIP@ VERSION = @VERSION@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 SOAPHEADER = lu.h AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a SOAP_CPP_SRC = $(SOAP_CPP_CLIENT) soapServer.cpp $(SOAP_H_FILES) $(SOAP_NS) LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_CPP_SRC) CLEANFILES = $(SOAP_CPP_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.cpp soap*Proxy.h soap*Proxy.cpp soap*Object.h soap*Service.h soap*Service.cpp soapClient.cpp soapServer.cpp soapClientLib.cpp soapServerLib.cpp *~ SOAP_NS = lu.nsmap lu.wsdl luclient_SOURCES = luclient.cpp lumat.cpp $(SOAPHEADER) $(SOAP_CPP_CLIENT) luclient_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) luserver_cgi_SOURCES = luserver.cpp lumat.cpp $(SOAPHEADER) $(SOAP_CPP_SERVER) luserver_cgi_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_rules $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/lu/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/lu/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_rules: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) luclient$(EXEEXT): $(luclient_OBJECTS) $(luclient_DEPENDENCIES) $(EXTRA_luclient_DEPENDENCIES) @rm -f luclient$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(luclient_OBJECTS) $(luclient_LDADD) $(LIBS) luserver.cgi$(EXEEXT): $(luserver_cgi_OBJECTS) $(luserver_cgi_DEPENDENCIES) $(EXTRA_luserver_cgi_DEPENDENCIES) @rm -f luserver.cgi$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(luserver_cgi_OBJECTS) $(luserver_cgi_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/luclient.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lumat.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/luserver.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapC.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapClient.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapServer.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am $(SOAP_CPP_SRC) : $(SOAPHEADER) $(SOAP) -L -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $(SOAPHEADER) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.28/gsoap/samples/lu/lu.h0000644000175000017500000001106112653650156016262 0ustar ellertellert/* lu.h LU factorization Web service -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap ns1 service name: lu //gsoap ns1 service style: rpc //gsoap ns1 service encoding: encoded //gsoap ns1 service namespace: http://websrv.cs.fsu.edu/~engelen/lu.wsdl //gsoap ns1 service location: http://websrv.cs.fsu.edu/~engelen/luserver.cgi //gsoap ns1 schema namespace: urn:lu typedef double xsd__double; typedef int xsd__int; class vector // dynamic array of type SOAP-ENC:Array with arrayType="double[]" { public: xsd__double *__ptr; // pointer to array of double int __size; // number of elements pointed to int __offset; struct soap *soap; // gSOAP env. instance was created vector(); vector(struct soap *env); vector(struct soap *env, int size); vector(struct soap *env, int start, int end); virtual ~vector(); virtual int start(); // index of first element (=__offset) virtual int end(); // index of last element virtual int size(); // vector size virtual void resize(int size); virtual void resize(int start, int end); virtual double& operator[](int i); virtual double operator()(int i); virtual void print(); }; class ivector // dynamic array of type SOAP-ENC:Array with arrayType="int[]" { public: xsd__int *__ptr; // pointer to array of int int __size; // number of elements pointed to int __offset; struct soap *soap; // gSOAP env. instance was created ivector(); ivector(struct soap *env); ivector(struct soap *env, int size); ivector(struct soap *env, int start, int end); virtual ~ivector(); virtual int start(); // index of first element (=__offset) virtual int end(); // index of last element virtual int size(); // vector size virtual void resize(int size); virtual void resize(int start, int end); virtual int& operator[](int i); virtual int operator()(int i); virtual void print(); }; class matrix // dynamic array of type SOAP-ENC:Array with arrayType="double[][]" { public: vector *__ptr; // pointer to array of vectors int __size; // number of vectors pointed to int __offset; struct soap *soap; // gSOAP env. instance was created matrix(); matrix(struct soap *env); matrix(struct soap *env, int rows); matrix(struct soap *env, int rows, int cols); matrix(struct soap *env, int rowstart, int rowend, int colstart, int colend); virtual ~matrix(); virtual int start(); virtual int end(); virtual int size(); virtual void resize(int rows, int cols); virtual void resize(int rowstart, int rowend, int colstart, int colend); virtual vector& operator[](int i); virtual double operator()(int i, int j); virtual void print(); }; // LU decomposition, see Numerical Recipies for C ns1__ludcmp(matrix *a, struct ns1__ludcmpResponse {matrix *a; ivector *i; xsd__double d;} &result); // backsubstitution, see Numerical Recipies for C ns1__lubksb(matrix *a, ivector *i, vector *b, vector *x); // Linear system solver using LU decomposition: solves ax=b ns1__lusol(matrix *a, vector *b, vector *x); // Linear systems solver using LU decomposition: solves ax=b for all rows in x and b ns1__lusols(matrix *a, matrix *b, matrix *x); // Matrix inversion using LU decomposition ns1__luinv(matrix *a, matrix *b); // Determinant of matrix ns1__ludet(matrix *a, xsd__double &d); gsoap-2.8.28/gsoap/samples/lu/lumat.cpp0000644000175000017500000002057612653650156017332 0ustar ellertellert/* lumat.cpp LU factorization vector and matrix operations. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" //////////////////////////////////////////////////////////////////////////////// // // vector // //////////////////////////////////////////////////////////////////////////////// vector::vector() { vector(NULL); } vector::vector(struct soap *env) { soap = env; __ptr = 0; __size = 0; __offset = 0; } vector::vector(struct soap *env, int size) { soap = env; __size = size; __offset = 1; __ptr = (double*)soap_malloc(soap, size*sizeof(double)); for (int i = 0; i < size; i++) __ptr[i] = 0.0; } vector::vector(struct soap *env, int start, int end) { soap = env; __size = end-start+1; __offset = start; __ptr = (double*)soap_malloc(soap, __size*sizeof(double)); for (int i = 0; i < __size; i++) __ptr[i] = 0.0; } vector::~vector() { // no deallocation: let gSOAP handle all dynamic allocation and deallocation } int vector::start() { return __offset; } int vector::end() { return __size+__offset-1; } int vector::size() { return __size; } void vector::resize(int size) { resize(1, size); } void vector::resize(int start, int end) { double *p; int n, size = end-start+1; if (__offset == start && __size == size) return; // nothing to do p = (double*)soap_malloc(soap, size*sizeof(double)); for (int i = 0; i < size; i++) p[i] = 0.0; if (__ptr) { if (start < __offset) { n = (size-__offset+start <= __size ? size-__offset+start : __size); for (int i = 0; i < n; i++) p[__offset-start+i] = __ptr[i]; } else { n = (__size-start+__offset <= size ? __size-start+__offset : size); for (int i = 0; i < n; i++) p[i] = __ptr[start-__offset+i]; } soap_dealloc(soap, __ptr); } __ptr = p; __size = size; __offset = start; } double& vector::operator[](int i) { return __ptr[i-__offset]; } double vector::operator()(int i) { if (i >= __offset && i < __size+__offset) return __ptr[i-__offset]; return 0.0; } void vector::print() { int i; for (i = 1; i <= end(); i++) printf("% f ", (*this)(i)); printf("\n"); } //////////////////////////////////////////////////////////////////////////////// // // ivector // //////////////////////////////////////////////////////////////////////////////// ivector::ivector() { ivector(NULL); } ivector::ivector(struct soap *env) { soap = env; __ptr = 0; __size = 0; } ivector::ivector(struct soap *env, int size) { soap = env; __size = size; __offset = 1; __ptr = (int*)soap_malloc(soap, size*sizeof(int)); for (int i = 0; i < size; i++) __ptr[i] = 0; } ivector::ivector(struct soap *env, int start, int end) { soap = env; __size = end-start+1; __offset = start; __ptr = (int*)soap_malloc(soap, __size*sizeof(int)); for (int i = 0; i < __size; i++) __ptr[i] = 0; } ivector::~ivector() { // no deallocation: let gSOAP handle all dynamic allocation and deallocation } int ivector::start() { return __offset; } int ivector::end() { return __size+__offset-1; } int ivector::size() { return __size; } void ivector::resize(int size) { resize(1, size); } void ivector::resize(int start, int end) { int *p; int n, size = end-start+1; if (__offset == start && __size == size) return; // nothing to do p = (int*)soap_malloc(soap, size*sizeof(int)); for (int i = 0; i < size; i++) p[i] = 0; if (__ptr) { if (start < __offset) { n = (size-__offset+start <= __size ? size-__offset+start : __size); for (int i = 0; i < n; i++) p[__offset-start+i] = __ptr[i]; } else { n = (__size-start+__offset <= size ? __size-start+__offset : size); for (int i = 0; i < n; i++) p[i] = __ptr[start-__offset+i]; } soap_dealloc(soap, __ptr); } __ptr = p; __size = size; __offset = start; } int& ivector::operator[](int i) { return __ptr[i-__offset]; } int ivector::operator()(int i) { if (i >= __offset && i < __size+__offset) return __ptr[i-__offset]; return 0; } void ivector::print() { int i; for (i = 1; i <= end(); i++) printf("%4d ", (*this)(i)); printf("\n"); } //////////////////////////////////////////////////////////////////////////////// // // matrix // //////////////////////////////////////////////////////////////////////////////// matrix::matrix() { matrix(NULL); } matrix::matrix(struct soap *env) { soap = env; __ptr = 0; __size = 0; __offset = 0; } matrix::matrix(struct soap *env, int rows) { soap = env; __ptr = soap_new_vector(soap, rows); __size = rows; __offset = 1; } matrix::matrix(struct soap *env, int rows, int cols) { soap = env; __size = rows; __offset = 1; __ptr = soap_new_vector(soap, __size); for (int i = 0; i < __size; i++) __ptr[i].resize(cols); } matrix::matrix(struct soap *env, int rowstart, int rowend, int colstart, int colend) { soap = env; __size = rowend-rowstart+1; __offset = rowstart; __ptr = soap_new_vector(soap, __size); for (int i = 0; i <= __size-__offset; i++) __ptr[i].resize(colstart, colend); } matrix::~matrix() { // no deallocation: let gSOAP handle all dynamic allocation and deallocation } int matrix::start() { return __offset; } int matrix::end() { return __size+__offset-1; } int matrix::size() { return __size; } void matrix::resize(int rows, int cols) { resize(1, rows, 1, cols); } void matrix::resize(int rowstart, int rowend, int colstart, int colend) { int i; vector *p; int n, size = rowend-rowstart+1; if (__offset != rowstart || __size != rowend-rowstart+1) { if (__ptr) { p = soap_new_vector(soap, size); if (rowstart < __offset) { for (i = 0; i < __offset-rowstart; i++) p[i].resize(colstart, colend); n = (size-__offset+rowstart <= __size ? size-__offset+rowstart : __size); for (i = 0; i < n; i++) { __ptr[i].resize(colstart, colend); p[__offset-rowstart+i] = __ptr[i]; } for (; i < size-__offset+rowstart; i++) p[i].resize(colstart, colend); } else { n = (__size-rowstart+__offset <= size ? __size-rowstart+__offset : size); for (i = 0; i < n; i++) { __ptr[i].resize(colstart, colend); p[i] = __ptr[rowstart-__offset+i]; } for (; i < size; i++) p[i].resize(colstart, colend); } __ptr = p; __size = size; __offset = rowstart; } else { __size = size; __offset = rowstart; __ptr = soap_new_vector(soap, size); for (i = 0; i < size; i++) __ptr[i].resize(colstart, colend); } } else for (i = 0; i < size; i++) __ptr[i].resize(colstart, colend); } vector& matrix::operator[](int i) { return __ptr[i-__offset]; } double matrix::operator()(int i, int j) { int s; if (i >= __offset && i < __size+__offset) { s = __ptr[i-__offset].__offset; if (j >= s && j < __ptr[i-__offset].__size+s) return __ptr[i-__offset].__ptr[j-s]; } return 0.0; } void matrix::print() { int i, j; for (i = start(); i <= end(); i++) { for (j = 1; j < (*this)[i].start(); j++) printf(" "); for (; j <= (*this)[i].end(); j++) printf("% f ", (*this)(i, j)); printf("\n"); } } gsoap-2.8.28/gsoap/samples/lu/Makefile.am0000644000175000017500000000121612653650156017526 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 noinst_PROGRAMS = luclient luserver.cgi SOAPHEADER = lu.h include ../Makefile.defines include ../Makefile.cpp_rules SOAP_NS = lu.nsmap lu.wsdl luclient_SOURCES = luclient.cpp lumat.cpp $(SOAPHEADER) $(SOAP_CPP_CLIENT) luclient_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) luserver_cgi_SOURCES = luserver.cpp lumat.cpp $(SOAPHEADER) $(SOAP_CPP_SERVER) luserver_cgi_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) gsoap-2.8.28/gsoap/samples/lu/luserver.cpp0000644000175000017500000002145212653650156020051 0ustar ellertellert/* luserver.h LU factorization Web service. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" #include //////////////////////////////////////////////////////////////////////////////// // // main // //////////////////////////////////////////////////////////////////////////////// int main(int argc, char **argv) { struct soap *soap; int m, s; soap = soap_new(); if (argc < 3) soap_serve(soap); // run as CGI application over the Web else // run as stand-alone server on machine given by argv[1] listening to port argv[2] { m = soap_bind(soap, argv[1], atoi(argv[2]), 100); if (m < 0) { soap_print_fault(soap, stderr); exit(-1); } fprintf(stderr, "Socket connection successful: master socket = %d\n", m); for (int i = 1; ; i++) { s = soap_accept(soap); if (s < 0) { soap_print_fault(soap, stderr); exit(-1); } fprintf(stderr, "%d: accepted connection from IP = %d.%d.%d.%d socket = %d ... ", i, (int)(soap->ip>>24)&0xFF, (int)(soap->ip>>16)&0xFF, (int)(soap->ip>>8)&0xFF, (int)soap->ip&0xFF, s); soap_serve(soap); // process request fprintf(stderr, "request served\n"); soap_destroy(soap); // delete class instances soap_end(soap); // clean up everything and close socket } } soap_done(soap); return 0; } //////////////////////////////////////////////////////////////////////////////// // // LU decomposition: remote method interface // //////////////////////////////////////////////////////////////////////////////// int ludcmp(struct soap*, matrix&, ivector&, double&); int ns1__ludcmp(struct soap *soap, matrix *a, struct ns1__ludcmpResponse &result) { result.a = a; result.i = soap_new_ivector(soap, -1); if (ludcmp(soap, *result.a, *result.i, result.d)) return soap_sender_fault(soap, "Singular matrix in routine ludcmp", NULL); return SOAP_OK; } //////////////////////////////////////////////////////////////////////////////// // // LU decomposition: algorithm // //////////////////////////////////////////////////////////////////////////////// int ludcmp(struct soap *soap, matrix &a, ivector &indx, double &d) { int i, imax = 0, j, k, n; double big, dum, sum, temp; n = a.size(); vector vv(soap); vv.resize(n); indx.resize(n); d = 1.0; for (i = 1; i <= n; i++) { big = 0.0; a[i].resize(n); for (j = 1; j <= n; j++) if ((temp = fabs(a[i][j])) > big) big = temp; if (big == 0.0) return -1; vv[i] = 1.0/big; } for (j = 1; j <= n; j++) { for (i = 1; i < j; i++) { sum = a[i][j]; for (k = 1; k < i; k++) sum -= a[i][k]*a[k][j]; a[i][j] = sum; } big = 0.0; for (i = j; i <= n; i++) { sum = a[i][j]; for (k = 1; k < j; k++) sum -= a[i][k]*a[k][j]; a[i][j] = sum; if ((dum = vv[i]*fabs(sum)) >= big) { big = dum; imax = i; } } if (j != imax) { for (k = 1; k <= n; k++) { dum = a[imax][k]; a[imax][k] = a[j][k]; a[j][k] = dum; } d = -d; vv[imax] = vv[j]; } indx[j] = imax; if (a[j][j] == 0.0) a[j][j] = 1.0e-20; if (j != n) { dum = 1.0/a[j][j]; for (i = j+1; i <= n; i++) a[i][j] *= dum; } } for (i = 1; i <= n; i++) { for (j = 1; j <= n; j++) if (fabs(a[i][j]) > 1.0e-15) break; for (k = n; k > j; k--) if (fabs(a[i][k]) > 1.0e-15) break; a[i].resize(j, k); } return 0; } //////////////////////////////////////////////////////////////////////////////// // // Forward- and backsubstitution: remote method interface // //////////////////////////////////////////////////////////////////////////////// int lubksb(matrix&, ivector&, vector &b); int ns1__lubksb(struct soap *soap, matrix *a, ivector *i, vector *b, vector *x) { lubksb(*a, *i, *b); *x = *b; return SOAP_OK; } //////////////////////////////////////////////////////////////////////////////// // // Forward- and backsubstitution: algorithm // //////////////////////////////////////////////////////////////////////////////// int lubksb(matrix &a, ivector &indx, vector &b) { int i, j, k, ip, n, m, ii = 0; double sum; n = a.size(); b.resize(n); for (i = 1; i <= n; i++) { ip = indx[i]; sum = b[ip]; b[ip] = b[i]; if (ii) { k = a[i].start(); if (ii > k) k = ii; m = a[i].end(); if (i-1 < m) m = i-1; for (j = k; j <= m; j++) sum -= a[i][j]*b[j]; } else if (sum) ii = i; b[i] = sum; } for (i = n; i >= 1; i--) { sum = b[i]; k = a[i].start(); if (i+1 > k) k = i+1; m = a[i].end(); if (n < m) m = n; for (j = k; j <= m; j++) sum -= a[i][j]*b[j]; b[i] = sum/a[i][i]; } return SOAP_OK; } //////////////////////////////////////////////////////////////////////////////// // // LU solve: remote method interface // //////////////////////////////////////////////////////////////////////////////// int ns1__lusol(struct soap *soap, matrix *a, vector *b, vector *x) { ivector indx(soap); double d; if (ludcmp(soap, *a, indx, d)) return soap_sender_fault(soap, "Singular matrix in routine ludcmp", NULL); lubksb(*a, indx, *b); *x = *b; return SOAP_OK; } //////////////////////////////////////////////////////////////////////////////// // // LU solve multiple: remote method interface // //////////////////////////////////////////////////////////////////////////////// int ns1__lusols(struct soap *soap, matrix *a, matrix *b, matrix *x) { ivector indx(soap); double d; if (ludcmp(soap, *a, indx, d)) return soap_sender_fault(soap, "Singular matrix in routine ludcmp", NULL); for (int i = 1; i <= b->size(); i++) lubksb(*a, indx, (*b)[i]); *x = *b; return SOAP_OK; } //////////////////////////////////////////////////////////////////////////////// // // LU inverse: remote method interface // //////////////////////////////////////////////////////////////////////////////// int ns1__luinv(struct soap *soap, matrix *a, matrix *b) { vector col(soap); ivector indx(soap); double d; int i, j, k, n; if (ludcmp(soap, *a, indx, d)) return soap_sender_fault(soap, "Singular matrix in routine ludcmp", NULL); n = a->size(); col.resize(n); b->resize(n, n); for (j = 1; j <= n; j++) { for (i = 1; i <= n; i++) col[i] = 0.0; col[j] = 1.0; lubksb(*a, indx, col); for (i = 1; i <= n; i++) (*b)[i][j] = col[i]; } for (i = 1; i <= n; i++) { for (j = 1; j <= n; j++) if (fabs((*b)[i][j]) > 1.0e-15) break; for (k = n; k > j; k--) if (fabs((*b)[i][k]) > 1.0e-15) break; (*b)[i].resize(j, k); } return SOAP_OK; } //////////////////////////////////////////////////////////////////////////////// // // LU determinant: remote method interface // //////////////////////////////////////////////////////////////////////////////// int ns1__ludet(struct soap *soap, matrix *a, double &d) { ivector indx(soap); if (ludcmp(soap, *a, indx, d)) return soap_sender_fault(soap, "Singular matrix in routine ludcmp", NULL); for (int i = 1; i <= a->__size; i++) d *= (*a)[i][i]; return SOAP_OK; } struct Namespace namespaces[] = {// "ns-prefix", "ns-name", "ns-pattern" {"SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/"}, {"SOAP-ENC", "http://schemas.xmlsoap.org/soap/encoding/"}, {"xsi", "http://www.w3.org/2001/XMLSchema-instance", "http://wwww.w3.org/*/XMLSchema-instance"}, {"xsd", "http://www.w3.org/2001/XMLSchema", "http://www.w3.org/*/XMLSchema"}, {"ns1", "urn:lu"}, {NULL, NULL} }; gsoap-2.8.28/gsoap/samples/lu/luclient.cpp0000644000175000017500000000643512653650156020025 0ustar ellertellert/* luclient.h LU factorization Web service client. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" #include const char luserver[] = "http://websrv.cs.fsu.edu/~engelen/luserver.cgi"; int main(int argc, char **argv) { struct soap *soap = soap_new(); const char *endpoint; matrix a(soap, 3); // matrix with 3 rows created in current soap env. // set up matrix by specifying non-zero elements only (this is optional) a[1].resize(1,2); // 2-element vector indexed from 1 to 2 a[1][1] = 2; a[1][2] = 1; a[2].resize(1,3); // 3-element vector a[2][1] = 1; a[2][2] = 2; a[2][3] = 1; a[3].resize(2,3); // 2-element vector indexed from 2 to 3 a[3][2] = 1; a[3][3] = 2; std::cout << "* Demonstration example *" << std::endl; std::cout << "Matrix:" << std::endl; a.print(); vector b(soap, 3); b[1] = 1; b[2] = 2; b[3] = 3; std::cout << "Vector:" << std::endl; b.print(); vector x(soap); if (argc < 2) endpoint = luserver; else endpoint = argv[1]; /* solve ax=b */ if (soap_call_ns1__lusol(soap, endpoint, "", &a, &b, &x)) { soap_print_fault(soap, stderr); soap_print_fault_location(soap, stderr); } else { std::cout << "Solution vector from service:" << std::endl; x.print(); } matrix a1(soap); if (soap_call_ns1__luinv(soap, endpoint, "", &a, &a1)) { soap_print_fault(soap, stderr); soap_print_fault_location(soap, stderr); } else { std::cout << "Inverse matrix matrix from service:" << std::endl; a1.print(); } soap_destroy(soap); soap_end(soap); soap_free(soap); return 0; } struct Namespace namespaces[] = {// "ns-prefix", "ns-name", "ns-pattern" {"SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/"}, {"SOAP-ENC", "http://schemas.xmlsoap.org/soap/encoding/"}, {"xsi", "http://www.w3.org/2001/XMLSchema-instance", "http://www.w3.org/*/XMLSchema-instance"}, {"xsd", "http://www.w3.org/2001/XMLSchema", "http://www.w3.org/*/XMLSchema"}, {"ns1", "urn:lu"}, {NULL, NULL} }; gsoap-2.8.28/gsoap/samples/gmt/0000755000175000017500000000000012653650170015635 5ustar ellertellertgsoap-2.8.28/gsoap/samples/gmt/Makefile.in0000644000175000017500000004715712653650156017724 0ustar ellertellert# Makefile.in generated by automake 1.14 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = gmtclient$(EXEEXT) gmtserver$(EXEEXT) DIST_COMMON = $(srcdir)/../Makefile.defines \ $(srcdir)/../Makefile.cpp_rules $(srcdir)/Makefile.in \ $(srcdir)/Makefile.am $(top_srcdir)/mkinstalldirs \ $(top_srcdir)/depcomp subdir = gsoap/samples/gmt ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = am__objects_2 = soapC.$(OBJEXT) am__objects_3 = soapClient.$(OBJEXT) $(am__objects_2) am_gmtclient_OBJECTS = gmtclient.$(OBJEXT) $(am__objects_1) \ $(am__objects_3) gmtclient_OBJECTS = $(am_gmtclient_OBJECTS) am__DEPENDENCIES_1 = gmtclient_DEPENDENCIES = $(SOAP_CPP_LIB) $(am__DEPENDENCIES_1) am__objects_4 = soapServer.$(OBJEXT) $(am__objects_2) am_gmtserver_OBJECTS = gmtserver.$(OBJEXT) $(am__objects_1) \ $(am__objects_4) gmtserver_OBJECTS = $(am_gmtserver_OBJECTS) gmtserver_DEPENDENCIES = $(SOAP_CPP_LIB) $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(gmtclient_SOURCES) $(gmtserver_SOURCES) DIST_SOURCES = $(gmtclient_SOURCES) $(gmtserver_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ STRIP = @STRIP@ VERSION = @VERSION@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 SOAPHEADER = gmt.h AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a SOAP_CPP_SRC = $(SOAP_CPP_CLIENT) soapServer.cpp $(SOAP_H_FILES) $(SOAP_NS) LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_CPP_SRC) CLEANFILES = $(SOAP_CPP_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.cpp soap*Proxy.h soap*Proxy.cpp soap*Object.h soap*Service.h soap*Service.cpp soapClient.cpp soapServer.cpp soapClientLib.cpp soapServerLib.cpp *~ SOAP_NS = t.nsmap t.wsdl gmtclient_SOURCES = gmtclient.cpp $(SOAPHEADER) $(SOAP_CPP_CLIENT) gmtclient_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) gmtserver_SOURCES = gmtserver.cpp $(SOAPHEADER) $(SOAP_CPP_SERVER) gmtserver_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_rules $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/gmt/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/gmt/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_rules: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) gmtclient$(EXEEXT): $(gmtclient_OBJECTS) $(gmtclient_DEPENDENCIES) $(EXTRA_gmtclient_DEPENDENCIES) @rm -f gmtclient$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(gmtclient_OBJECTS) $(gmtclient_LDADD) $(LIBS) gmtserver$(EXEEXT): $(gmtserver_OBJECTS) $(gmtserver_DEPENDENCIES) $(EXTRA_gmtserver_DEPENDENCIES) @rm -f gmtserver$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(gmtserver_OBJECTS) $(gmtserver_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmtclient.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmtserver.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapC.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapClient.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapServer.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am $(SOAP_CPP_SRC) : $(SOAPHEADER) $(SOAP) -L -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $(SOAPHEADER) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.28/gsoap/samples/gmt/gmt.h0000644000175000017500000000002112653650156016572 0ustar ellertellertt__gmt(time_t*); gsoap-2.8.28/gsoap/samples/gmt/README.txt0000644000175000017500000000103112653650156017332 0ustar ellertellertThis directory contains a "one-liner" service: gSOAP Web service and client applications that are only one line long (not counting the usual #includes). The oneliners are small, but they can do a number of useful things. The complete list of oneliners is: samples/gmt return current time in GMT samples/hello "Hello World!" samples/roll rolling a die You can use the client programs right away after compilation since they connect to our server. To run the server examples you have to install them as CGI applications. gsoap-2.8.28/gsoap/samples/gmt/Makefile.am0000644000175000017500000000116412653650156017677 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 noinst_PROGRAMS = gmtclient gmtserver SOAPHEADER = gmt.h include ../Makefile.defines include ../Makefile.cpp_rules SOAP_NS = t.nsmap t.wsdl gmtclient_SOURCES = gmtclient.cpp $(SOAPHEADER) $(SOAP_CPP_CLIENT) gmtclient_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) gmtserver_SOURCES = gmtserver.cpp $(SOAPHEADER) $(SOAP_CPP_SERVER) gmtserver_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) gsoap-2.8.28/gsoap/samples/gmt/gmtclient.cpp0000644000175000017500000000031612653650156020333 0ustar ellertellert#include "soapH.h" #include "t.nsmap" int main() { time_t t; soap_call_t__gmt(soap_new(), "http://www.cs.fsu.edu/~engelen/gmtlitserver.cgi", "", &t); return printf("The current time is %s\n", ctime(&t)); } gsoap-2.8.28/gsoap/samples/gmt/gmtserver.cpp0000644000175000017500000000023712653650156020365 0ustar ellertellert#include "soapH.h" #include "t.nsmap" int main() { return soap_serve(soap_new()); } int t__gmt(struct soap *soap, time_t *t) { *t = time(0); return SOAP_OK; } gsoap-2.8.28/gsoap/samples/autotest/0000755000175000017500000000000012654077575016733 5ustar ellertellertgsoap-2.8.28/gsoap/samples/autotest/test-self.sh0000755000175000017500000000054312653650154021167 0ustar ellertellert#!/bin/sh echo "test-self.log generated " `date` > test-self.log for req in *.req.xml; do echo "** $req" echo "" >> test-self.log echo "*** REQUEST $req ***" >> test-self.log cat $req >> test-self.log echo "" >> test-self.log echo "*** RESPONSE ***" >> test-self.log ./autotest 12288 < $req >> test-self.log || echo "\n>> ERROR $req\n" done gsoap-2.8.28/gsoap/samples/autotest/$(top_srcdir)/0000755000175000017500000000000012653650150021251 5ustar ellertellertgsoap-2.8.28/gsoap/samples/autotest/$(top_srcdir)/gsoap/0000755000175000017500000000000012653650150022362 5ustar ellertellertgsoap-2.8.28/gsoap/samples/autotest/$(top_srcdir)/gsoap/.deps/0000755000175000017500000000000012653650150023373 5ustar ellertellertgsoap-2.8.28/gsoap/samples/autotest/$(top_srcdir)/gsoap/.deps/autotest-dom.Po0000644000175000017500000000001012653650150026307 0ustar ellertellert# dummy gsoap-2.8.28/gsoap/samples/autotest/$(top_srcdir)/gsoap/custom/0000755000175000017500000000000012653650150023674 5ustar ellertellertgsoap-2.8.28/gsoap/samples/autotest/$(top_srcdir)/gsoap/custom/.deps/0000755000175000017500000000000012653650150024705 5ustar ellertellertgsoap-2.8.28/gsoap/samples/autotest/$(top_srcdir)/gsoap/custom/.deps/autotest-struct_tm.Po0000644000175000017500000000001012653650150031066 0ustar ellertellert# dummy gsoap-2.8.28/gsoap/samples/autotest/$(top_srcdir)/gsoap/custom/.deps/autotest-duration.Po0000644000175000017500000000001012653650150030667 0ustar ellertellert# dummy gsoap-2.8.28/gsoap/samples/autotest/$(top_srcdir)/gsoap/custom/.deps/autotest-struct_tm_date.Po0000644000175000017500000000001012653650150032063 0ustar ellertellert# dummy gsoap-2.8.28/gsoap/samples/autotest/$(top_srcdir)/gsoap/custom/.deps/autotest-long_time.Po0000644000175000017500000000001012653650150031017 0ustar ellertellert# dummy gsoap-2.8.28/gsoap/samples/autotest/Makefile.in0000644000175000017500000007756412653650154021010 0ustar ellertellert# Makefile.in generated by automake 1.14 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ ####### This is the input file for automake, which will generate Makefile.in ########## VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = autotest$(EXEEXT) subdir = gsoap/samples/autotest DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = autotest-soapC.$(OBJEXT) autotest-soapServer.$(OBJEXT) am_autotest_OBJECTS = $(am__objects_1) autotest-soapTester.$(OBJEXT) \ autotest-duration.$(OBJEXT) autotest-long_time.$(OBJEXT) \ autotest-struct_tm.$(OBJEXT) autotest-struct_tm_date.$(OBJEXT) autotest_OBJECTS = $(am_autotest_OBJECTS) am__DEPENDENCIES_1 = autotest_DEPENDENCIES = $(SOAP_CPP_LIB) $(am__DEPENDENCIES_1) autotest_LINK = $(CXXLD) $(autotest_CXXFLAGS) $(CXXFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = SOURCES = $(autotest_SOURCES) DIST_SOURCES = $(autotest_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ STRIP = @STRIP@ VERSION = @VERSION@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 AM_LDFLAGS = $(CPPFLAGS) -I$(srcdir) -L$(srcdir) SOAP = $(top_srcdir)/gsoap/src/soapcpp2$(EXEEXT) WSDL = $(top_srcdir)/gsoap/wsdl/wsdl2h$(EXEEXT) WSDL_FLAGS = -d -P -t $(srcdir)/typemap.dat SOAP_FLAGS = -SL -T -I$(top_srcdir)/gsoap/import -I$(top_srcdir)/gsoap/custom WSDLINPUT = $(srcdir)/examples.wsdl SOAPHEADER = $(srcdir)/examples.h SOAP_CPP_SRC = soapC.cpp soapServer.cpp SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a autotest_CFLAGS = $(C_DEBUG_FLAGS) -D$(platform) autotest_CPPFLAGS = $(C_DEBUG_FLAGS) -D$(platform) autotest_CXXFLAGS = $(WSDL2H_EXTRA_FLAGS) autotest_SOURCES = $(SOAP_CPP_SRC) soapTester.cpp duration.cpp long_time.cpp struct_tm.cpp struct_tm_date.cpp autotest_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) CLEANFILES = *~ *.h *.cpp *.xml *.log *.nsmap all: all-am .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/autotest/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/autotest/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) autotest$(EXEEXT): $(autotest_OBJECTS) $(autotest_DEPENDENCIES) $(EXTRA_autotest_DEPENDENCIES) @rm -f autotest$(EXEEXT) $(AM_V_CXXLD)$(autotest_LINK) $(autotest_OBJECTS) $(autotest_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/autotest-duration.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/autotest-long_time.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/autotest-soapC.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/autotest-soapServer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/autotest-soapTester.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/autotest-struct_tm.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/autotest-struct_tm_date.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` autotest-soapC.o: soapC.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(autotest_CPPFLAGS) $(CPPFLAGS) $(autotest_CXXFLAGS) $(CXXFLAGS) -MT autotest-soapC.o -MD -MP -MF $(DEPDIR)/autotest-soapC.Tpo -c -o autotest-soapC.o `test -f 'soapC.cpp' || echo '$(srcdir)/'`soapC.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/autotest-soapC.Tpo $(DEPDIR)/autotest-soapC.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soapC.cpp' object='autotest-soapC.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(autotest_CPPFLAGS) $(CPPFLAGS) $(autotest_CXXFLAGS) $(CXXFLAGS) -c -o autotest-soapC.o `test -f 'soapC.cpp' || echo '$(srcdir)/'`soapC.cpp autotest-soapC.obj: soapC.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(autotest_CPPFLAGS) $(CPPFLAGS) $(autotest_CXXFLAGS) $(CXXFLAGS) -MT autotest-soapC.obj -MD -MP -MF $(DEPDIR)/autotest-soapC.Tpo -c -o autotest-soapC.obj `if test -f 'soapC.cpp'; then $(CYGPATH_W) 'soapC.cpp'; else $(CYGPATH_W) '$(srcdir)/soapC.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/autotest-soapC.Tpo $(DEPDIR)/autotest-soapC.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soapC.cpp' object='autotest-soapC.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(autotest_CPPFLAGS) $(CPPFLAGS) $(autotest_CXXFLAGS) $(CXXFLAGS) -c -o autotest-soapC.obj `if test -f 'soapC.cpp'; then $(CYGPATH_W) 'soapC.cpp'; else $(CYGPATH_W) '$(srcdir)/soapC.cpp'; fi` autotest-soapServer.o: soapServer.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(autotest_CPPFLAGS) $(CPPFLAGS) $(autotest_CXXFLAGS) $(CXXFLAGS) -MT autotest-soapServer.o -MD -MP -MF $(DEPDIR)/autotest-soapServer.Tpo -c -o autotest-soapServer.o `test -f 'soapServer.cpp' || echo '$(srcdir)/'`soapServer.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/autotest-soapServer.Tpo $(DEPDIR)/autotest-soapServer.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soapServer.cpp' object='autotest-soapServer.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(autotest_CPPFLAGS) $(CPPFLAGS) $(autotest_CXXFLAGS) $(CXXFLAGS) -c -o autotest-soapServer.o `test -f 'soapServer.cpp' || echo '$(srcdir)/'`soapServer.cpp autotest-soapServer.obj: soapServer.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(autotest_CPPFLAGS) $(CPPFLAGS) $(autotest_CXXFLAGS) $(CXXFLAGS) -MT autotest-soapServer.obj -MD -MP -MF $(DEPDIR)/autotest-soapServer.Tpo -c -o autotest-soapServer.obj `if test -f 'soapServer.cpp'; then $(CYGPATH_W) 'soapServer.cpp'; else $(CYGPATH_W) '$(srcdir)/soapServer.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/autotest-soapServer.Tpo $(DEPDIR)/autotest-soapServer.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soapServer.cpp' object='autotest-soapServer.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(autotest_CPPFLAGS) $(CPPFLAGS) $(autotest_CXXFLAGS) $(CXXFLAGS) -c -o autotest-soapServer.obj `if test -f 'soapServer.cpp'; then $(CYGPATH_W) 'soapServer.cpp'; else $(CYGPATH_W) '$(srcdir)/soapServer.cpp'; fi` autotest-soapTester.o: soapTester.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(autotest_CPPFLAGS) $(CPPFLAGS) $(autotest_CXXFLAGS) $(CXXFLAGS) -MT autotest-soapTester.o -MD -MP -MF $(DEPDIR)/autotest-soapTester.Tpo -c -o autotest-soapTester.o `test -f 'soapTester.cpp' || echo '$(srcdir)/'`soapTester.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/autotest-soapTester.Tpo $(DEPDIR)/autotest-soapTester.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soapTester.cpp' object='autotest-soapTester.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(autotest_CPPFLAGS) $(CPPFLAGS) $(autotest_CXXFLAGS) $(CXXFLAGS) -c -o autotest-soapTester.o `test -f 'soapTester.cpp' || echo '$(srcdir)/'`soapTester.cpp autotest-soapTester.obj: soapTester.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(autotest_CPPFLAGS) $(CPPFLAGS) $(autotest_CXXFLAGS) $(CXXFLAGS) -MT autotest-soapTester.obj -MD -MP -MF $(DEPDIR)/autotest-soapTester.Tpo -c -o autotest-soapTester.obj `if test -f 'soapTester.cpp'; then $(CYGPATH_W) 'soapTester.cpp'; else $(CYGPATH_W) '$(srcdir)/soapTester.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/autotest-soapTester.Tpo $(DEPDIR)/autotest-soapTester.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soapTester.cpp' object='autotest-soapTester.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(autotest_CPPFLAGS) $(CPPFLAGS) $(autotest_CXXFLAGS) $(CXXFLAGS) -c -o autotest-soapTester.obj `if test -f 'soapTester.cpp'; then $(CYGPATH_W) 'soapTester.cpp'; else $(CYGPATH_W) '$(srcdir)/soapTester.cpp'; fi` autotest-duration.o: duration.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(autotest_CPPFLAGS) $(CPPFLAGS) $(autotest_CXXFLAGS) $(CXXFLAGS) -MT autotest-duration.o -MD -MP -MF $(DEPDIR)/autotest-duration.Tpo -c -o autotest-duration.o `test -f 'duration.cpp' || echo '$(srcdir)/'`duration.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/autotest-duration.Tpo $(DEPDIR)/autotest-duration.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='duration.cpp' object='autotest-duration.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(autotest_CPPFLAGS) $(CPPFLAGS) $(autotest_CXXFLAGS) $(CXXFLAGS) -c -o autotest-duration.o `test -f 'duration.cpp' || echo '$(srcdir)/'`duration.cpp autotest-duration.obj: duration.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(autotest_CPPFLAGS) $(CPPFLAGS) $(autotest_CXXFLAGS) $(CXXFLAGS) -MT autotest-duration.obj -MD -MP -MF $(DEPDIR)/autotest-duration.Tpo -c -o autotest-duration.obj `if test -f 'duration.cpp'; then $(CYGPATH_W) 'duration.cpp'; else $(CYGPATH_W) '$(srcdir)/duration.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/autotest-duration.Tpo $(DEPDIR)/autotest-duration.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='duration.cpp' object='autotest-duration.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(autotest_CPPFLAGS) $(CPPFLAGS) $(autotest_CXXFLAGS) $(CXXFLAGS) -c -o autotest-duration.obj `if test -f 'duration.cpp'; then $(CYGPATH_W) 'duration.cpp'; else $(CYGPATH_W) '$(srcdir)/duration.cpp'; fi` autotest-long_time.o: long_time.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(autotest_CPPFLAGS) $(CPPFLAGS) $(autotest_CXXFLAGS) $(CXXFLAGS) -MT autotest-long_time.o -MD -MP -MF $(DEPDIR)/autotest-long_time.Tpo -c -o autotest-long_time.o `test -f 'long_time.cpp' || echo '$(srcdir)/'`long_time.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/autotest-long_time.Tpo $(DEPDIR)/autotest-long_time.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='long_time.cpp' object='autotest-long_time.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(autotest_CPPFLAGS) $(CPPFLAGS) $(autotest_CXXFLAGS) $(CXXFLAGS) -c -o autotest-long_time.o `test -f 'long_time.cpp' || echo '$(srcdir)/'`long_time.cpp autotest-long_time.obj: long_time.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(autotest_CPPFLAGS) $(CPPFLAGS) $(autotest_CXXFLAGS) $(CXXFLAGS) -MT autotest-long_time.obj -MD -MP -MF $(DEPDIR)/autotest-long_time.Tpo -c -o autotest-long_time.obj `if test -f 'long_time.cpp'; then $(CYGPATH_W) 'long_time.cpp'; else $(CYGPATH_W) '$(srcdir)/long_time.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/autotest-long_time.Tpo $(DEPDIR)/autotest-long_time.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='long_time.cpp' object='autotest-long_time.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(autotest_CPPFLAGS) $(CPPFLAGS) $(autotest_CXXFLAGS) $(CXXFLAGS) -c -o autotest-long_time.obj `if test -f 'long_time.cpp'; then $(CYGPATH_W) 'long_time.cpp'; else $(CYGPATH_W) '$(srcdir)/long_time.cpp'; fi` autotest-struct_tm.o: struct_tm.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(autotest_CPPFLAGS) $(CPPFLAGS) $(autotest_CXXFLAGS) $(CXXFLAGS) -MT autotest-struct_tm.o -MD -MP -MF $(DEPDIR)/autotest-struct_tm.Tpo -c -o autotest-struct_tm.o `test -f 'struct_tm.cpp' || echo '$(srcdir)/'`struct_tm.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/autotest-struct_tm.Tpo $(DEPDIR)/autotest-struct_tm.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='struct_tm.cpp' object='autotest-struct_tm.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(autotest_CPPFLAGS) $(CPPFLAGS) $(autotest_CXXFLAGS) $(CXXFLAGS) -c -o autotest-struct_tm.o `test -f 'struct_tm.cpp' || echo '$(srcdir)/'`struct_tm.cpp autotest-struct_tm.obj: struct_tm.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(autotest_CPPFLAGS) $(CPPFLAGS) $(autotest_CXXFLAGS) $(CXXFLAGS) -MT autotest-struct_tm.obj -MD -MP -MF $(DEPDIR)/autotest-struct_tm.Tpo -c -o autotest-struct_tm.obj `if test -f 'struct_tm.cpp'; then $(CYGPATH_W) 'struct_tm.cpp'; else $(CYGPATH_W) '$(srcdir)/struct_tm.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/autotest-struct_tm.Tpo $(DEPDIR)/autotest-struct_tm.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='struct_tm.cpp' object='autotest-struct_tm.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(autotest_CPPFLAGS) $(CPPFLAGS) $(autotest_CXXFLAGS) $(CXXFLAGS) -c -o autotest-struct_tm.obj `if test -f 'struct_tm.cpp'; then $(CYGPATH_W) 'struct_tm.cpp'; else $(CYGPATH_W) '$(srcdir)/struct_tm.cpp'; fi` autotest-struct_tm_date.o: struct_tm_date.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(autotest_CPPFLAGS) $(CPPFLAGS) $(autotest_CXXFLAGS) $(CXXFLAGS) -MT autotest-struct_tm_date.o -MD -MP -MF $(DEPDIR)/autotest-struct_tm_date.Tpo -c -o autotest-struct_tm_date.o `test -f 'struct_tm_date.cpp' || echo '$(srcdir)/'`struct_tm_date.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/autotest-struct_tm_date.Tpo $(DEPDIR)/autotest-struct_tm_date.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='struct_tm_date.cpp' object='autotest-struct_tm_date.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(autotest_CPPFLAGS) $(CPPFLAGS) $(autotest_CXXFLAGS) $(CXXFLAGS) -c -o autotest-struct_tm_date.o `test -f 'struct_tm_date.cpp' || echo '$(srcdir)/'`struct_tm_date.cpp autotest-struct_tm_date.obj: struct_tm_date.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(autotest_CPPFLAGS) $(CPPFLAGS) $(autotest_CXXFLAGS) $(CXXFLAGS) -MT autotest-struct_tm_date.obj -MD -MP -MF $(DEPDIR)/autotest-struct_tm_date.Tpo -c -o autotest-struct_tm_date.obj `if test -f 'struct_tm_date.cpp'; then $(CYGPATH_W) 'struct_tm_date.cpp'; else $(CYGPATH_W) '$(srcdir)/struct_tm_date.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/autotest-struct_tm_date.Tpo $(DEPDIR)/autotest-struct_tm_date.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='struct_tm_date.cpp' object='autotest-struct_tm_date.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(autotest_CPPFLAGS) $(CPPFLAGS) $(autotest_CXXFLAGS) $(CXXFLAGS) -c -o autotest-struct_tm_date.obj `if test -f 'struct_tm_date.cpp'; then $(CYGPATH_W) 'struct_tm_date.cpp'; else $(CYGPATH_W) '$(srcdir)/struct_tm_date.cpp'; fi` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am $(SOAP_CPP_SRC) : $(WSDLINPUT) $(WSDL) $(WSDL_FLAGS) $(WSDLINPUT) $(SOAP) $(SOAP_FLAGS) $(SOAPHEADER) duration.cpp : ../../custom/duration.c ln -s ../../custom/duration.c duration.cpp long_time.cpp : ../../custom/long_time.c ln -s ../../custom/long_time.c long_time.cpp struct_tm.cpp : ../../custom/struct_tm.c ln -s ../../custom/struct_tm.c struct_tm.cpp struct_tm_date.cpp : ../../custom/struct_tm_date.c ln -s ../../custom/struct_tm_date.c struct_tm_date.cpp # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.28/gsoap/samples/autotest/typemap.dat0000644000175000017500000000075112653650154021074 0ustar ellertellert# typemap.dat for W3C basic and advanced XML schema pattern databindings xsd__duration = #import "duration.h" xsd__dateTime = #import "struct_tm.h" xsd__date = #import "struct_tm_date.h" xsd__time = #import "long_time.h" # test/wsdl/typemap.dat ex = "http://www.w3.org/2002/ws/databinding/examples/6/09/" st = "http://www.w3.org/2002/ws/databinding/examples/6/09/strict/" # prevents importing from an non-existing site by making it "built-in": x = gsoap-2.8.28/gsoap/samples/autotest/test-patterns12.sh0000755000175000017500000000071612653650154022243 0ustar ellertellert#!/bin/sh echo "test-patterns12.log generated " `date` > test-patterns12.log for req in databinding/examples/6/09/*/*-soap12.xml; do name=`basename $req` echo "** $name" echo "" >> test-patterns12.log echo "*** REQUEST $name ***" >> test-patterns12.log cat $req >> test-patterns12.log echo "" >> test-patterns12.log echo "*** RESPONSE ***" >> test-patterns12.log ./autotest 12288 < $req >> test-patterns12.log || echo "\n>> SKIPPED $name\n" done gsoap-2.8.28/gsoap/samples/autotest/databinding/0000755000175000017500000000000012653650150021160 5ustar ellertellertgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/0000755000175000017500000000000012653650150022776 5ustar ellertellertgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/0000755000175000017500000000000012653650150023143 5ustar ellertellertgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/0000755000175000017500000000000012653650154023377 5ustar ellertellertgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeReference/0000755000175000017500000000000012653650150027155 5ustar ellertellert././@LongLink0000644000000000000000000000020100000000000011574 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeReference/echoAttributeReference-AttributeReference01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeReference/echoAttributeRefere0000755000175000017500000000200412653650150033032 0ustar ellertellert Bobby Sox ././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeReference/echoAttributeReference-AttributeReference01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeReference/echoAttributeRefere0000755000175000017500000000242312653650150033037 0ustar ellertellert Bobby Sox ././@LongLink0000644000000000000000000000017500000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeReference/AttributeReference-AttributeReference01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeReference/AttributeReference-0000755000175000017500000000173312653650150032746 0ustar ellertellert Bobby Sox ././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeReference/echoAttributeReference-AttributeReference01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeReference/echoAttributeRefere0000755000175000017500000000242112653650150033035 0ustar ellertellert Bobby Sox gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeFormUnqualified/0000755000175000017500000000000012653650150030351 5ustar ellertellert././@LongLink0000644000000000000000000000022600000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeFormUnqualified/AttributeFormUnqualified-AttributeFormUnqualifiedExample01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeFormUnqualified/AttributeForm0000755000175000017500000000177712653650150033102 0ustar ellertellert 1175 ././@LongLink0000644000000000000000000000024100000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeFormUnqualified/echoAttributeFormUnqualified-AttributeFormUnqualifiedExample01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeFormUnqualified/echoAttribute0000755000175000017500000000242312653650150033102 0ustar ellertellert 1175 ././@LongLink0000644000000000000000000000023200000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeFormUnqualified/echoAttributeFormUnqualified-AttributeFormUnqualifiedExample01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeFormUnqualified/echoAttribute0000755000175000017500000000204612653650150033103 0ustar ellertellert 1175 ././@LongLink0000644000000000000000000000024100000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeFormUnqualified/echoAttributeFormUnqualified-AttributeFormUnqualifiedExample01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeFormUnqualified/echoAttribute0000755000175000017500000000242512653650150033104 0ustar ellertellert 1175 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SchemaVersion/0000755000175000017500000000000012653650152026143 5ustar ellertellert././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SchemaVersion/echoSchemaVersion-SchemaVersion01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SchemaVersion/echoSchemaVersion-Schema0000755000175000017500000000217512653650152032701 0ustar ellertellert foo ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SchemaVersion/SchemaVersion-SchemaVersion01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SchemaVersion/SchemaVersion-SchemaVers0000755000175000017500000000155412653650152032702 0ustar ellertellert foo././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SchemaVersion/echoSchemaVersion-SchemaVersion01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SchemaVersion/echoSchemaVersion-Schema0000755000175000017500000000160512653650152032676 0ustar ellertellert foo ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SchemaVersion/echoSchemaVersion-SchemaVersion01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SchemaVersion/echoSchemaVersion-Schema0000755000175000017500000000217312653650152032677 0ustar ellertellert foo gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/Id/0000755000175000017500000000000012653650152023731 5ustar ellertellertgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/Id/echoId-IdExample01-soap12.xml0000755000175000017500000000215612653650152030767 0ustar ellertellert gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/Id/Id-IdExample01.xml0000755000175000017500000000154012653650152027021 0ustar ellertellert gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/Id/echoId-IdExample01-soap11.xml0000755000175000017500000000216012653650152030761 0ustar ellertellert gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/Id/echoId-IdExample01.xml0000755000175000017500000000155212653650152027663 0ustar ellertellert gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TokenSimpleTypePattern/0000755000175000017500000000000012653650152030027 5ustar ellertellert././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TokenSimpleTypePattern/echoTokenSimpleTypePattern-TokenSimpleTypePattern01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TokenSimpleTypePattern/echoTokenSimple0000755000175000017500000000224612653650152033052 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TokenSimpleTypePattern/echoTokenSimpleTypePattern-TokenSimpleTypePattern01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TokenSimpleTypePattern/echoTokenSimple0000755000175000017500000000170212653650152033046 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TokenSimpleTypePattern/echoTokenSimpleTypePattern-TokenSimpleTypePattern01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TokenSimpleTypePattern/echoTokenSimple0000755000175000017500000000225012653650152033045 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TokenSimpleTypePattern/TokenSimpleTypePattern-TokenSimpleTypePattern01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TokenSimpleTypePattern/TokenSimpleType0000755000175000017500000000164012653650152033052 0ustar ellertellert 1gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/List/0000755000175000017500000000000012653650152024310 5ustar ellertellertgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/List/echoList-List01.xml0000755000175000017500000000153412653650152027664 0ustar ellertellert This is a list of strings gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/List/List-List01.xml0000755000175000017500000000151412653650152027023 0ustar ellertellert This is a list of stringsgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/List/echoList-List01-soap11.xml0000755000175000017500000000214612653650152030766 0ustar ellertellert This is a list of strings gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/List/echoList-List01-soap12.xml0000755000175000017500000000214412653650152030765 0ustar ellertellert This is a list of strings gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnionMemberTypes/0000755000175000017500000000000012653650154026644 5ustar ellertellert././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnionMemberTypes/echoUnionMemberTypes-UnionMemberTypes02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnionMemberTypes/echoUnionMemberTypes-0000755000175000017500000000164012653650154032754 0ustar ellertellert a string? ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnionMemberTypes/echoUnionMemberTypes-UnionMemberTypes01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnionMemberTypes/echoUnionMemberTypes-0000755000175000017500000000221112653650154032747 0ustar ellertellert 22 ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnionMemberTypes/UnionMemberTypes-UnionMemberTypes02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnionMemberTypes/UnionMemberTypes-Unio0000755000175000017500000000160412653650154032750 0ustar ellertellert a string?././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnionMemberTypes/echoUnionMemberTypes-UnionMemberTypes02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnionMemberTypes/echoUnionMemberTypes-0000755000175000017500000000222212653650154032751 0ustar ellertellert a string? ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnionMemberTypes/echoUnionMemberTypes-UnionMemberTypes02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnionMemberTypes/echoUnionMemberTypes-0000755000175000017500000000222012653650154032747 0ustar ellertellert a string? ././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnionMemberTypes/echoUnionMemberTypes-UnionMemberTypes01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnionMemberTypes/echoUnionMemberTypes-0000755000175000017500000000163112653650154032754 0ustar ellertellert 22 ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnionMemberTypes/UnionMemberTypes-UnionMemberTypes01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnionMemberTypes/UnionMemberTypes-Unio0000755000175000017500000000157512653650154032757 0ustar ellertellert 22././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnionMemberTypes/echoUnionMemberTypes-UnionMemberTypes01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnionMemberTypes/echoUnionMemberTypes-0000755000175000017500000000221312653650154032751 0ustar ellertellert 22 ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementComplexTypeEmptyExtension/gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementComplexTypeEmptyExtension0000755000175000017500000000000012653650152033136 5ustar ellertellert././@LongLink0000644000000000000000000000030400000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementComplexTypeEmptyExtension/echoGlobalElementComplexTypeEmptyExtension-GlobalElementComplexTypeEmptyExtension01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementComplexTypeEmptyExtension0000755000175000017500000000231212653650152033141 0ustar ellertellert ././@LongLink0000644000000000000000000000030400000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementComplexTypeEmptyExtension/echoGlobalElementComplexTypeEmptyExtension-GlobalElementComplexTypeEmptyExtension01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementComplexTypeEmptyExtension0000755000175000017500000000231412653650152033143 0ustar ellertellert ././@LongLink0000644000000000000000000000027500000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementComplexTypeEmptyExtension/echoGlobalElementComplexTypeEmptyExtension-GlobalElementComplexTypeEmptyExtension01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementComplexTypeEmptyExtension0000755000175000017500000000200612653650152033141 0ustar ellertellert ././@LongLink0000644000000000000000000000027100000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementComplexTypeEmptyExtension/GlobalElementComplexTypeEmptyExtension-GlobalElementComplexTypeEmptyExtension01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementComplexTypeEmptyExtension0000755000175000017500000000172412653650152033147 0ustar ellertellert gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypeTotalDigits/0000755000175000017500000000000012653650150031115 5ustar ellertellert././@LongLink0000644000000000000000000000023300000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypeTotalDigits/DecimalSimpleTypeTotalDigits-DecimalSimpleTypeTotalDigits02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypeTotalDigits/DecimalSi0000755000175000017500000000171012653650150032674 0ustar ellertellert 12345././@LongLink0000644000000000000000000000024600000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypeTotalDigits/echoDecimalSimpleTypeTotalDigits-DecimalSimpleTypeTotalDigits02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypeTotalDigits/echoDecim0000755000175000017500000000231012653650150032717 0ustar ellertellert 12345 ././@LongLink0000644000000000000000000000023300000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypeTotalDigits/DecimalSimpleTypeTotalDigits-DecimalSimpleTypeTotalDigits01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypeTotalDigits/DecimalSi0000755000175000017500000000170712653650150032702 0ustar ellertellert 1234././@LongLink0000644000000000000000000000024600000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypeTotalDigits/echoDecimalSimpleTypeTotalDigits-DecimalSimpleTypeTotalDigits02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypeTotalDigits/echoDecim0000755000175000017500000000231212653650150032721 0ustar ellertellert 12345 ././@LongLink0000644000000000000000000000023700000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypeTotalDigits/echoDecimalSimpleTypeTotalDigits-DecimalSimpleTypeTotalDigits01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypeTotalDigits/echoDecim0000755000175000017500000000175712653650150032735 0ustar ellertellert 1234 ././@LongLink0000644000000000000000000000024600000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypeTotalDigits/echoDecimalSimpleTypeTotalDigits-DecimalSimpleTypeTotalDigits01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypeTotalDigits/echoDecim0000755000175000017500000000230712653650150032725 0ustar ellertellert 1234 ././@LongLink0000644000000000000000000000024600000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypeTotalDigits/echoDecimalSimpleTypeTotalDigits-DecimalSimpleTypeTotalDigits01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypeTotalDigits/echoDecim0000755000175000017500000000231112653650150032720 0ustar ellertellert 1234 ././@LongLink0000644000000000000000000000023700000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypeTotalDigits/echoDecimalSimpleTypeTotalDigits-DecimalSimpleTypeTotalDigits02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypeTotalDigits/echoDecim0000755000175000017500000000176012653650150032727 0ustar ellertellert 12345 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ImportSchemaNamespace/0000755000175000017500000000000012653650152027605 5ustar ellertellertgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/0000755000175000017500000000000012653650150026134 5ustar ellertellert././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/echoDateAttribute-DateAttribute04-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/echoDateAttribute-DateAt0000755000175000017500000000223112653650150032620 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/echoDateAttribute-DateAttribute01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/echoDateAttribute-DateAt0000755000175000017500000000222512653650150032623 0ustar ellertellert ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/echoDateAttribute-DateAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/echoDateAttribute-DateAt0000755000175000017500000000162712653650150032630 0ustar ellertellert ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/DateAttribute-DateAttribute03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/DateAttribute-DateAttrib0000755000175000017500000000157412653650150032653 0ustar ellertellert ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/DateAttribute-DateAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/DateAttribute-DateAttrib0000755000175000017500000000157312653650150032652 0ustar ellertellert ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/echoDateAttribute-DateAttribute03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/echoDateAttribute-DateAt0000755000175000017500000000163012653650150032622 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/echoDateAttribute-DateAttribute01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/echoDateAttribute-DateAt0000755000175000017500000000222312653650150032621 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/echoDateAttribute-DateAttribute05-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/echoDateAttribute-DateAt0000755000175000017500000000222412653650150032622 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/echoDateAttribute-DateAttribute03-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/echoDateAttribute-DateAt0000755000175000017500000000222412653650150032622 0ustar ellertellert ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/echoDateAttribute-DateAttribute02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/echoDateAttribute-DateAt0000755000175000017500000000162712653650150032630 0ustar ellertellert ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/DateAttribute-DateAttribute04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/DateAttribute-DateAttrib0000755000175000017500000000160112653650150032642 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/echoDateAttribute-DateAttribute04-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/echoDateAttribute-DateAt0000755000175000017500000000223312653650150032622 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/echoDateAttribute-DateAttribute05-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/echoDateAttribute-DateAt0000755000175000017500000000222612653650150032624 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/echoDateAttribute-DateAttribute02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/echoDateAttribute-DateAt0000755000175000017500000000222512653650150032623 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/echoDateAttribute-DateAttribute03-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/echoDateAttribute-DateAt0000755000175000017500000000222612653650150032624 0ustar ellertellert ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/DateAttribute-DateAttribute05.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/DateAttribute-DateAttrib0000755000175000017500000000157412653650150032653 0ustar ellertellert ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/echoDateAttribute-DateAttribute05.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/echoDateAttribute-DateAt0000755000175000017500000000163012653650150032622 0ustar ellertellert ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/echoDateAttribute-DateAttribute04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/echoDateAttribute-DateAt0000755000175000017500000000163512653650150032627 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/echoDateAttribute-DateAttribute02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/echoDateAttribute-DateAt0000755000175000017500000000222312653650150032621 0ustar ellertellert ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/DateAttribute-DateAttribute02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/DateAttribute-DateAttrib0000755000175000017500000000157312653650150032652 0ustar ellertellert gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthAttribute/0000755000175000017500000000000012653650152026455 5ustar ellertellert././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthAttribute/GMonthAttribute-GMonthAttribute03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthAttribute/GMonthAttribute-GMonth0000755000175000017500000000161112653650152032654 0ustar ellertellert ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthAttribute/echoGMonthAttribute-GMonthAttribute03-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthAttribute/echoGMonthAttribute-GM0000755000175000017500000000223712653650152032627 0ustar ellertellert ././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthAttribute/echoGMonthAttribute-GMonthAttribute03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthAttribute/echoGMonthAttribute-GM0000755000175000017500000000164712653650152032633 0ustar ellertellert ././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthAttribute/echoGMonthAttribute-GMonthAttribute02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthAttribute/echoGMonthAttribute-GM0000755000175000017500000000164212653650152032626 0ustar ellertellert ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthAttribute/echoGMonthAttribute-GMonthAttribute02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthAttribute/echoGMonthAttribute-GM0000755000175000017500000000223212653650152032622 0ustar ellertellert ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthAttribute/echoGMonthAttribute-GMonthAttribute04-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthAttribute/echoGMonthAttribute-GM0000755000175000017500000000223712653650152032627 0ustar ellertellert ././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthAttribute/echoGMonthAttribute-GMonthAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthAttribute/echoGMonthAttribute-GM0000755000175000017500000000164312653650152032627 0ustar ellertellert ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthAttribute/echoGMonthAttribute-GMonthAttribute01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthAttribute/echoGMonthAttribute-GM0000755000175000017500000000223512653650152032625 0ustar ellertellert ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthAttribute/echoGMonthAttribute-GMonthAttribute03-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthAttribute/echoGMonthAttribute-GM0000755000175000017500000000224112653650152032622 0ustar ellertellert ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthAttribute/echoGMonthAttribute-GMonthAttribute01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthAttribute/echoGMonthAttribute-GM0000755000175000017500000000223312653650152032623 0ustar ellertellert ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthAttribute/echoGMonthAttribute-GMonthAttribute02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthAttribute/echoGMonthAttribute-GM0000755000175000017500000000223412653650152032624 0ustar ellertellert ././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthAttribute/GMonthAttribute-GMonthAttribute04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthAttribute/GMonthAttribute-GMonth0000755000175000017500000000161112653650152032654 0ustar ellertellert ././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthAttribute/GMonthAttribute-GMonthAttribute02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthAttribute/GMonthAttribute-GMonth0000755000175000017500000000160412653650152032656 0ustar ellertellert ././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthAttribute/echoGMonthAttribute-GMonthAttribute04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthAttribute/echoGMonthAttribute-GM0000755000175000017500000000164712653650152032633 0ustar ellertellert ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthAttribute/echoGMonthAttribute-GMonthAttribute04-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthAttribute/echoGMonthAttribute-GM0000755000175000017500000000224112653650152032622 0ustar ellertellert ././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthAttribute/GMonthAttribute-GMonthAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthAttribute/GMonthAttribute-GMonth0000755000175000017500000000160512653650152032657 0ustar ellertellert gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementFinal/0000755000175000017500000000000012653650152027061 5ustar ellertellert././@LongLink0000644000000000000000000000020400000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementFinal/GlobalElementFinal-GlobalElementFinalExample01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementFinal/GlobalElementFinal-0000755000175000017500000000161412653650152032552 0ustar ellertellert Stuff././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementFinal/echoGlobalElementFinal-GlobalElementFinalExample01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementFinal/echoGlobalElementFi0000755000175000017500000000165212653650152032643 0ustar ellertellert Stuff ././@LongLink0000644000000000000000000000021700000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementFinal/echoGlobalElementFinal-GlobalElementFinalExample01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementFinal/echoGlobalElementFi0000755000175000017500000000222612653650152032641 0ustar ellertellert Stuff ././@LongLink0000644000000000000000000000021700000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementFinal/echoGlobalElementFinal-GlobalElementFinalExample01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementFinal/echoGlobalElementFi0000755000175000017500000000223012653650152032634 0ustar ellertellert Stuff gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalEnumerationType/0000755000175000017500000000000012653650150030002 5ustar ellertellert././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalEnumerationType/DecimalEnumerationType-DecimalEnumerationType01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalEnumerationType/DecimalEnumerat0000755000175000017500000000165012653650150032771 0ustar ellertellert 1000.0002././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalEnumerationType/echoDecimalEnumerationType-DecimalEnumerationType01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalEnumerationType/echoDecimalEnum0000755000175000017500000000226012653650150032752 0ustar ellertellert 1000.0002 ././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalEnumerationType/echoDecimalEnumerationType-DecimalEnumerationType01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalEnumerationType/echoDecimalEnum0000755000175000017500000000171212653650150032753 0ustar ellertellert 1000.0002 ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalEnumerationType/echoDecimalEnumerationType-DecimalEnumerationType01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalEnumerationType/echoDecimalEnum0000755000175000017500000000225612653650150032757 0ustar ellertellert 1000.0002 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IDREFAttribute/0000755000175000017500000000000012653650152026112 5ustar ellertellert././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IDREFAttribute/echoIDREFAttribute-IDREFAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IDREFAttribute/echoIDREFAttribute-IDRE0000755000175000017500000000163012653650152032135 0ustar ellertellert ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IDREFAttribute/IDREFAttribute-IDREFAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IDREFAttribute/IDREFAttribute-IDREFAtt0000755000175000017500000000157312653650152032063 0ustar ellertellert ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IDREFAttribute/echoIDREFAttribute-IDREFAttribute01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IDREFAttribute/echoIDREFAttribute-IDRE0000755000175000017500000000222212653650152032133 0ustar ellertellert ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IDREFAttribute/echoIDREFAttribute-IDREFAttribute01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IDREFAttribute/echoIDREFAttribute-IDRE0000755000175000017500000000222412653650152032135 0ustar ellertellert gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/HexBinaryElement/0000755000175000017500000000000012653650152026600 5ustar ellertellert././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/HexBinaryElement/HexBinaryElement-HexBinaryElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/HexBinaryElement/HexBinaryElement-HexB0000755000175000017500000000201512653650152032553 0ustar ellertellert 77696f646d6f6e7974637174716a7169696e6b65616f76786f746e66716b707875757261736e686469796b65706c656d7465626661637661646e6b65636662647669726d6f6e757361././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/HexBinaryElement/echoHexBinaryElement-HexBinaryElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/HexBinaryElement/echoHexBinaryElement-0000755000175000017500000000205112653650152032643 0ustar ellertellert 77696f646d6f6e7974637174716a7169696e6b65616f76786f746e66716b707875757261736e686469796b65706c656d7465626661637661646e6b65636662647669726d6f6e757361 ././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/HexBinaryElement/echoHexBinaryElement-HexBinaryElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/HexBinaryElement/echoHexBinaryElement-0000755000175000017500000000163112653650152032646 0ustar ellertellert 76 ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/HexBinaryElement/echoHexBinaryElement-HexBinaryElement02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/HexBinaryElement/echoHexBinaryElement-0000755000175000017500000000243312653650152032647 0ustar ellertellert 77696f646d6f6e7974637174716a7169696e6b65616f76786f746e66716b707875757261736e686469796b65706c656d7465626661637661646e6b65636662647669726d6f6e757361 ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/HexBinaryElement/echoHexBinaryElement-HexBinaryElement02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/HexBinaryElement/echoHexBinaryElement-0000755000175000017500000000243112653650152032645 0ustar ellertellert 77696f646d6f6e7974637174716a7169696e6b65616f76786f746e66716b707875757261736e686469796b65706c656d7465626661637661646e6b65636662647669726d6f6e757361 ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/HexBinaryElement/HexBinaryElement-HexBinaryElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/HexBinaryElement/HexBinaryElement-HexB0000755000175000017500000000157512653650152032565 0ustar ellertellert 76././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/HexBinaryElement/echoHexBinaryElement-HexBinaryElement01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/HexBinaryElement/echoHexBinaryElement-0000755000175000017500000000221312653650152032643 0ustar ellertellert 76 ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/HexBinaryElement/echoHexBinaryElement-HexBinaryElement01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/HexBinaryElement/echoHexBinaryElement-0000755000175000017500000000221112653650152032641 0ustar ellertellert 76 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs2orMore/0000755000175000017500000000000012653650152030057 5ustar ellertellert././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs2orMore/echoElementMinOccurs2orMore-ElementMinOccurs2orMore01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs2orMore/echoElementMin0000755000175000017500000000251212653650152032701 0ustar ellertellert Red Black White Yellow ././@LongLink0000644000000000000000000000021400000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs2orMore/ElementMinOccurs2orMore-ElementMinOccurs2orMore02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs2orMore/ElementMinOccu0000755000175000017500000000166412653650152032663 0ustar ellertellert Black White ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs2orMore/echoElementMinOccurs2orMore-ElementMinOccurs2orMore01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs2orMore/echoElementMin0000755000175000017500000000251012653650152032677 0ustar ellertellert Red Black White Yellow ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs2orMore/echoElementMinOccurs2orMore-ElementMinOccurs2orMore02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs2orMore/echoElementMin0000755000175000017500000000235312653650152032704 0ustar ellertellert Black White ././@LongLink0000644000000000000000000000022000000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs2orMore/echoElementMinOccurs2orMore-ElementMinOccurs2orMore01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs2orMore/echoElementMin0000755000175000017500000000207112653650152032701 0ustar ellertellert Red Black White Yellow ././@LongLink0000644000000000000000000000021400000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs2orMore/ElementMinOccurs2orMore-ElementMinOccurs2orMore01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs2orMore/ElementMinOccu0000755000175000017500000000201112653650152032646 0ustar ellertellert Red Black White Yellow ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs2orMore/echoElementMinOccurs2orMore-ElementMinOccurs2orMore02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs2orMore/echoElementMin0000755000175000017500000000235512653650152032706 0ustar ellertellert Black White ././@LongLink0000644000000000000000000000022000000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs2orMore/echoElementMinOccurs2orMore-ElementMinOccurs2orMore02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs2orMore/echoElementMin0000755000175000017500000000174412653650152032707 0ustar ellertellert Black White gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceElement/0000755000175000017500000000000012653650150026077 5ustar ellertellert././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceElement/echoChoiceElement-ChoiceElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceElement/echoChoiceElement-Choice0000755000175000017500000000167212653650150032566 0ustar ellertellert A ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceElement/echoChoiceElement-ChoiceElement02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceElement/echoChoiceElement-Choice0000755000175000017500000000227112653650150032562 0ustar ellertellert B ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceElement/echoChoiceElement-ChoiceElement01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceElement/echoChoiceElement-Choice0000755000175000017500000000227112653650150032562 0ustar ellertellert A ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceElement/echoChoiceElement-ChoiceElement02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceElement/echoChoiceElement-Choice0000755000175000017500000000226712653650150032567 0ustar ellertellert B ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceElement/ChoiceElement-ChoiceElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceElement/ChoiceElement-ChoiceElem0000755000175000017500000000164112653650150032526 0ustar ellertellert B ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceElement/echoChoiceElement-ChoiceElement01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceElement/echoChoiceElement-Choice0000755000175000017500000000226712653650150032567 0ustar ellertellert A ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceElement/echoChoiceElement-ChoiceElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceElement/echoChoiceElement-Choice0000755000175000017500000000167212653650150032566 0ustar ellertellert B ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceElement/ChoiceElement-ChoiceElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceElement/ChoiceElement-ChoiceElem0000755000175000017500000000164112653650150032526 0ustar ellertellert A gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeTypeReferenceUnqualified/0000755000175000017500000000000012653650150032206 5ustar ellertellert././@LongLink0000644000000000000000000000025200000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeTypeReferenceUnqualified/AttributeTypeReferenceUnqualified-AttributeTypeReferenceUnqualified01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeTypeReferenceUnqualified/Attr0000755000175000017500000000212512653650150033046 0ustar ellertellert String ././@LongLink0000644000000000000000000000026500000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeTypeReferenceUnqualified/echoAttributeTypeReferenceUnqualified-AttributeTypeReferenceUnqualified01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeTypeReferenceUnqualified/echo0000755000175000017500000000254212653650150033055 0ustar ellertellert String ././@LongLink0000644000000000000000000000026500000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeTypeReferenceUnqualified/echoAttributeTypeReferenceUnqualified-AttributeTypeReferenceUnqualified01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeTypeReferenceUnqualified/echo0000755000175000017500000000254012653650150033053 0ustar ellertellert String ././@LongLink0000644000000000000000000000025600000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeTypeReferenceUnqualified/echoAttributeTypeReferenceUnqualified-AttributeTypeReferenceUnqualified01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeTypeReferenceUnqualified/echo0000755000175000017500000000220512653650150033051 0ustar ellertellert String gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceSkip/0000755000175000017500000000000012653650152027455 5ustar ellertellert././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceSkip/echoExtendedSequenceSkip-ExtendedSequenceSkip02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceSkip/echoExtendedSeque0000755000175000017500000000262512653650152033012 0ustar ellertellert Bobby Sox William Mr ././@LongLink0000644000000000000000000000020300000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceSkip/ExtendedSequenceSkip-ExtendedSequenceSkip01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceSkip/ExtendedSequenceS0000755000175000017500000000175412653650152032766 0ustar ellertellert Bobby Sox ././@LongLink0000644000000000000000000000020700000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceSkip/echoExtendedSequenceSkip-ExtendedSequenceSkip01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceSkip/echoExtendedSeque0000755000175000017500000000201412653650152033002 0ustar ellertellert Bobby Sox ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceSkip/echoExtendedSequenceSkip-ExtendedSequenceSkip02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceSkip/echoExtendedSeque0000755000175000017500000000262312653650152033010 0ustar ellertellert Bobby Sox William Mr ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceSkip/echoExtendedSequenceSkip-ExtendedSequenceSkip01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceSkip/echoExtendedSeque0000755000175000017500000000237712653650152033016 0ustar ellertellert Bobby Sox ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceSkip/echoExtendedSequenceSkip-ExtendedSequenceSkip01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceSkip/echoExtendedSeque0000755000175000017500000000240112653650152033002 0ustar ellertellert Bobby Sox ././@LongLink0000644000000000000000000000020300000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceSkip/ExtendedSequenceSkip-ExtendedSequenceSkip02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceSkip/ExtendedSequenceS0000755000175000017500000000215612653650152032763 0ustar ellertellert Bobby Sox William Mr ././@LongLink0000644000000000000000000000020700000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceSkip/echoExtendedSequenceSkip-ExtendedSequenceSkip02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceSkip/echoExtendedSeque0000755000175000017500000000221612653650152033006 0ustar ellertellert Bobby Sox William Mr gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDayAttribute/0000755000175000017500000000000012653650152026105 5ustar ellertellert././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDayAttribute/echoGDayAttribute-GDayAttribute02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDayAttribute/echoGDayAttribute-GDayAt0000755000175000017500000000221712653650152032513 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDayAttribute/echoGDayAttribute-GDayAttribute01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDayAttribute/echoGDayAttribute-GDayAt0000755000175000017500000000222012653650152032505 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDayAttribute/echoGDayAttribute-GDayAttribute04-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDayAttribute/echoGDayAttribute-GDayAt0000755000175000017500000000222412653650152032511 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDayAttribute/echoGDayAttribute-GDayAttribute02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDayAttribute/echoGDayAttribute-GDayAt0000755000175000017500000000222112653650152032506 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDayAttribute/echoGDayAttribute-GDayAttribute04-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDayAttribute/echoGDayAttribute-GDayAt0000755000175000017500000000222612653650152032513 0ustar ellertellert ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDayAttribute/echoGDayAttribute-GDayAttribute04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDayAttribute/echoGDayAttribute-GDayAt0000755000175000017500000000163012653650152032511 0ustar ellertellert ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDayAttribute/echoGDayAttribute-GDayAttribute03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDayAttribute/echoGDayAttribute-GDayAt0000755000175000017500000000163012653650152032511 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDayAttribute/echoGDayAttribute-GDayAttribute01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDayAttribute/echoGDayAttribute-GDayAt0000755000175000017500000000221612653650152032512 0ustar ellertellert ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDayAttribute/GDayAttribute-GDayAttribute02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDayAttribute/GDayAttribute-GDayAttrib0000755000175000017500000000156712653650152032544 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDayAttribute/echoGDayAttribute-GDayAttribute03-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDayAttribute/echoGDayAttribute-GDayAt0000755000175000017500000000222612653650152032513 0ustar ellertellert ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDayAttribute/GDayAttribute-GDayAttribute03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDayAttribute/GDayAttribute-GDayAttrib0000755000175000017500000000157412653650152032542 0ustar ellertellert ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDayAttribute/echoGDayAttribute-GDayAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDayAttribute/echoGDayAttribute-GDayAt0000755000175000017500000000162212653650152032512 0ustar ellertellert ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDayAttribute/GDayAttribute-GDayAttribute04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDayAttribute/GDayAttribute-GDayAttrib0000755000175000017500000000157412653650152032542 0ustar ellertellert ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDayAttribute/echoGDayAttribute-GDayAttribute02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDayAttribute/echoGDayAttribute-GDayAt0000755000175000017500000000162312653650152032513 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDayAttribute/echoGDayAttribute-GDayAttribute03-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDayAttribute/echoGDayAttribute-GDayAt0000755000175000017500000000222412653650152032511 0ustar ellertellert ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDayAttribute/GDayAttribute-GDayAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDayAttribute/GDayAttribute-GDayAttrib0000755000175000017500000000156612653650152032543 0ustar ellertellert gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/0000755000175000017500000000000012653650150026401 5ustar ellertellert././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/DateTimeElement-DateTimeElement04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/DateTimeElement-DateTi0000755000175000017500000000161012653650150032503 0ustar ellertellert 2038-12-12T23:00:00././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/DateTimeElement-DateTimeElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/DateTimeElement-DateTi0000755000175000017500000000161612653650150032511 0ustar ellertellert 2000-03-04T23:00:00+03:00././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-DateTimeElement05.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-Da0000755000175000017500000000164312653650150032522 0ustar ellertellert 0739-03-04T23:00:00 ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-DateTimeElement02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-Da0000755000175000017500000000223312653650150032516 0ustar ellertellert 2000-03-04T23:00:00+03:00 ././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-DateTimeElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-Da0000755000175000017500000000165112653650150032521 0ustar ellertellert 1999-05-31T13:20:00-05:42 ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-DateTimeElement06-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-Da0000755000175000017500000000223012653650150032513 0ustar ellertellert 10739-03-04T23:00:00 ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-DateTimeElement04-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-Da0000755000175000017500000000222712653650150032521 0ustar ellertellert 2038-12-12T23:00:00 ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-DateTimeElement05-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-Da0000755000175000017500000000222512653650150032517 0ustar ellertellert 0739-03-04T23:00:00 ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-DateTimeElement01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-Da0000755000175000017500000000223512653650150032520 0ustar ellertellert 1999-05-31T13:20:00-05:42 ././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-DateTimeElement03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-Da0000755000175000017500000000164412653650150032523 0ustar ellertellert 2000-03-04T23:00:00Z ././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-DateTimeElement04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-Da0000755000175000017500000000164312653650150032522 0ustar ellertellert 2038-12-12T23:00:00 ././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/DateTimeElement-DateTimeElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/DateTimeElement-DateTi0000755000175000017500000000161612653650150032511 0ustar ellertellert 1999-05-31T13:20:00-05:42././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-DateTimeElement06.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-Da0000755000175000017500000000164412653650150032523 0ustar ellertellert 10739-03-04T23:00:00 ././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/DateTimeElement-DateTimeElement03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/DateTimeElement-DateTi0000755000175000017500000000161112653650150032504 0ustar ellertellert 2000-03-04T23:00:00Z././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/DateTimeElement-DateTimeElement05.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/DateTimeElement-DateTi0000755000175000017500000000161012653650150032503 0ustar ellertellert 0739-03-04T23:00:00././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-DateTimeElement04-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-Da0000755000175000017500000000222512653650150032517 0ustar ellertellert 2038-12-12T23:00:00 ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-DateTimeElement02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-Da0000755000175000017500000000223512653650150032520 0ustar ellertellert 2000-03-04T23:00:00+03:00 ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-DateTimeElement03-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-Da0000755000175000017500000000223012653650150032513 0ustar ellertellert 2000-03-04T23:00:00Z ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-DateTimeElement06-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-Da0000755000175000017500000000222612653650150032520 0ustar ellertellert 10739-03-04T23:00:00 ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-DateTimeElement03-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-Da0000755000175000017500000000222612653650150032520 0ustar ellertellert 2000-03-04T23:00:00Z ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-DateTimeElement01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-Da0000755000175000017500000000223312653650150032516 0ustar ellertellert 1999-05-31T13:20:00-05:42 ././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/DateTimeElement-DateTimeElement06.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/DateTimeElement-DateTi0000755000175000017500000000161112653650150032504 0ustar ellertellert 10739-03-04T23:00:00././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-DateTimeElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-Da0000755000175000017500000000165112653650150032521 0ustar ellertellert 2000-03-04T23:00:00+03:00 ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-DateTimeElement05-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-Da0000755000175000017500000000222712653650150032521 0ustar ellertellert 0739-03-04T23:00:00 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IdentifierName/0000755000175000017500000000000012653650152026260 5ustar ellertellert././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IdentifierName/echoIdentifierName-IdentifierName02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IdentifierName/echoIdentifierName-Iden0000755000175000017500000000220212653650152032601 0ustar ellertellert Hello ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IdentifierName/IdentifierName-IdentifierName02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IdentifierName/IdentifierName-Identifi0000755000175000017500000000156412653650152032630 0ustar ellertellert Hello././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IdentifierName/echoIdentifierName-IdentifierName02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IdentifierName/echoIdentifierName-Iden0000755000175000017500000000220412653650152032603 0ustar ellertellert Hello ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IdentifierName/echoIdentifierName-IdentifierName02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IdentifierName/echoIdentifierName-Iden0000755000175000017500000000161612653650152032611 0ustar ellertellert Hello gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementDefault/0000755000175000017500000000000012653650152027414 5ustar ellertellert././@LongLink0000644000000000000000000000020300000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementDefault/GlobalElementDefault-GlobalElementDefault02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementDefault/GlobalElementDefa0000755000175000017500000000164212653650152032637 0ustar ellertellert theDefaultValue././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementDefault/echoGlobalElementDefault-GlobalElementDefault02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementDefault/echoGlobalElement0000755000175000017500000000225412653650152032716 0ustar ellertellert theDefaultValue ././@LongLink0000644000000000000000000000020700000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementDefault/echoGlobalElementDefault-GlobalElementDefault01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementDefault/echoGlobalElement0000755000175000017500000000163212653650152032715 0ustar ellertellert ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementDefault/echoGlobalElementDefault-GlobalElementDefault03-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementDefault/echoGlobalElement0000755000175000017500000000224712653650152032720 0ustar ellertellert anotherValue ././@LongLink0000644000000000000000000000020300000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementDefault/GlobalElementDefault-GlobalElementDefault03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementDefault/GlobalElementDefa0000755000175000017500000000163712653650152032643 0ustar ellertellert anotherValue././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementDefault/echoGlobalElementDefault-GlobalElementDefault01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementDefault/echoGlobalElement0000755000175000017500000000220412653650152032711 0ustar ellertellert ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementDefault/echoGlobalElementDefault-GlobalElementDefault02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementDefault/echoGlobalElement0000755000175000017500000000225212653650152032714 0ustar ellertellert theDefaultValue ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementDefault/echoGlobalElementDefault-GlobalElementDefault03-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementDefault/echoGlobalElement0000755000175000017500000000225112653650152032713 0ustar ellertellert anotherValue ././@LongLink0000644000000000000000000000020300000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementDefault/GlobalElementDefault-GlobalElementDefault01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementDefault/GlobalElementDefa0000755000175000017500000000157212653650152032641 0ustar ellertellert ././@LongLink0000644000000000000000000000020700000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementDefault/echoGlobalElementDefault-GlobalElementDefault02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementDefault/echoGlobalElement0000755000175000017500000000170212653650152032713 0ustar ellertellert theDefaultValue ././@LongLink0000644000000000000000000000020700000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementDefault/echoGlobalElementDefault-GlobalElementDefault03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementDefault/echoGlobalElement0000755000175000017500000000167712653650152032726 0ustar ellertellert anotherValue ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementDefault/echoGlobalElementDefault-GlobalElementDefault01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementDefault/echoGlobalElement0000755000175000017500000000220212653650152032707 0ustar ellertellert gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinLength/0000755000175000017500000000000012653650152027313 5ustar ellertellert././@LongLink0000644000000000000000000000020400000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinLength/echoRestrictedMinLength-RestrictedMinLength02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinLength/echoRestrictedMinL0000755000175000017500000000165612653650152033000 0ustar ellertellert GB ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinLength/echoRestrictedMinLength-RestrictedMinLength02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinLength/echoRestrictedMinL0000755000175000017500000000223012653650152032765 0ustar ellertellert GB ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinLength/echoRestrictedMinLength-RestrictedMinLength01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinLength/echoRestrictedMinL0000755000175000017500000000223312653650152032770 0ustar ellertellert AUS ././@LongLink0000644000000000000000000000020400000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinLength/echoRestrictedMinLength-RestrictedMinLength01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinLength/echoRestrictedMinL0000755000175000017500000000165712653650152033001 0ustar ellertellert AUS ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinLength/echoRestrictedMinLength-RestrictedMinLength01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinLength/echoRestrictedMinL0000755000175000017500000000223112653650152032766 0ustar ellertellert AUS ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinLength/echoRestrictedMinLength-RestrictedMinLength02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinLength/echoRestrictedMinL0000755000175000017500000000223212653650152032767 0ustar ellertellert GB ././@LongLink0000644000000000000000000000020000000000000011573 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinLength/RestrictedMinLength-RestrictedMinLength01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinLength/RestrictedMinLengt0000755000175000017500000000162012653650152033006 0ustar ellertellert AUS././@LongLink0000644000000000000000000000020000000000000011573 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinLength/RestrictedMinLength-RestrictedMinLength02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinLength/RestrictedMinLengt0000755000175000017500000000161712653650152033014 0ustar ellertellert GBgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementTypeReference/0000755000175000017500000000000012653650152027447 5ustar ellertellert././@LongLink0000644000000000000000000000020300000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementTypeReference/ElementTypeReference-ElementTypeReference01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementTypeReference/ElementTypeRefere0000755000175000017500000000175412653650152032770 0ustar ellertellert foo ././@LongLink0000644000000000000000000000020700000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementTypeReference/echoElementTypeReference-ElementTypeReference01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementTypeReference/echoElementTypeRe0000755000175000017500000000201412653650152032753 0ustar ellertellert foo ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementTypeReference/echoElementTypeReference-ElementTypeReference01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementTypeReference/echoElementTypeRe0000755000175000017500000000240612653650152032760 0ustar ellertellert foo ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementTypeReference/echoElementTypeReference-ElementTypeReference01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementTypeReference/echoElementTypeRe0000755000175000017500000000240412653650152032756 0ustar ellertellert foo gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeConcrete/0000755000175000017500000000000012653650150027327 5ustar ellertellert././@LongLink0000644000000000000000000000020700000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeConcrete/ComplexTypeConcrete-ComplexTypeConcreteExample01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeConcrete/ComplexTypeConcret0000755000175000017500000000167212653650150033052 0ustar ellertellert 1175 ././@LongLink0000644000000000000000000000022200000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeConcrete/echoComplexTypeConcrete-ComplexTypeConcreteExample01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeConcrete/echoComplexTypeCon0000755000175000017500000000231212653650150033023 0ustar ellertellert 1175 ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeConcrete/echoComplexTypeConcrete-ComplexTypeConcreteExample01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeConcrete/echoComplexTypeCon0000755000175000017500000000173112653650150033027 0ustar ellertellert 1175 ././@LongLink0000644000000000000000000000022200000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeConcrete/echoComplexTypeConcrete-ComplexTypeConcreteExample01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeConcrete/echoComplexTypeCon0000755000175000017500000000231412653650150033025 0ustar ellertellert 1175 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LocalAttributeSimpleType/0000755000175000017500000000000012653650152030327 5ustar ellertellert././@LongLink0000644000000000000000000000023200000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LocalAttributeSimpleType/echoLocalAttributeSimpleType-LocalAttributeSimpleType01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LocalAttributeSimpleType/echoLocalAttr0000755000175000017500000000254612653650152033010 0ustar ellertellert String String ././@LongLink0000644000000000000000000000023200000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LocalAttributeSimpleType/echoLocalAttributeSimpleType-LocalAttributeSimpleType01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LocalAttributeSimpleType/echoLocalAttr0000755000175000017500000000255012653650152033003 0ustar ellertellert String String ././@LongLink0000644000000000000000000000022300000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LocalAttributeSimpleType/echoLocalAttributeSimpleType-LocalAttributeSimpleType01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LocalAttributeSimpleType/echoLocalAttr0000755000175000017500000000216512653650152033005 0ustar ellertellert String String ././@LongLink0000644000000000000000000000021700000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LocalAttributeSimpleType/LocalAttributeSimpleType-LocalAttributeSimpleType01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LocalAttributeSimpleType/LocalAttribut0000755000175000017500000000211612653650152033026 0ustar ellertellert String String gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SubstitutionGroup/0000755000175000017500000000000012653650152027126 5ustar ellertellert././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SubstitutionGroup/echoSubstitutionGroup-SubstitutionGroup02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SubstitutionGroup/echoSubstitutionGrou0000755000175000017500000000222412653650152033264 0ustar ellertellert String ././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SubstitutionGroup/SubstitutionGroup-SubstitutionGroup01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SubstitutionGroup/SubstitutionGroup-Su0000755000175000017500000000162312653650152033174 0ustar ellertellert String././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SubstitutionGroup/echoSubstitutionGroup-SubstitutionGroup02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SubstitutionGroup/echoSubstitutionGrou0000755000175000017500000000164412653650152033271 0ustar ellertellert String ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SubstitutionGroup/echoSubstitutionGroup-SubstitutionGroup02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SubstitutionGroup/echoSubstitutionGrou0000755000175000017500000000222212653650152033262 0ustar ellertellert String ././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SubstitutionGroup/echoSubstitutionGroup-SubstitutionGroup01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SubstitutionGroup/echoSubstitutionGrou0000755000175000017500000000165612653650152033274 0ustar ellertellert String ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SubstitutionGroup/echoSubstitutionGroup-SubstitutionGroup01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SubstitutionGroup/echoSubstitutionGrou0000755000175000017500000000223212653650152033263 0ustar ellertellert String ././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SubstitutionGroup/SubstitutionGroup-SubstitutionGroup02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SubstitutionGroup/SubstitutionGroup-Su0000755000175000017500000000160712653650152033176 0ustar ellertellert String././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SubstitutionGroup/echoSubstitutionGroup-SubstitutionGroup01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SubstitutionGroup/echoSubstitutionGrou0000755000175000017500000000223012653650152033261 0ustar ellertellert String gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerSimpleTypePattern/0000755000175000017500000000000012653650152030344 5ustar ellertellert././@LongLink0000644000000000000000000000021700000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerSimpleTypePattern/IntegerSimpleTypePattern-IntegerSimpleTypePattern01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerSimpleTypePattern/IntegerSimple0000755000175000017500000000165612653650152033051 0ustar ellertellert 123././@LongLink0000644000000000000000000000021700000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerSimpleTypePattern/IntegerSimpleTypePattern-IntegerSimpleTypePattern02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerSimpleTypePattern/IntegerSimple0000755000175000017500000000165412653650152033047 0ustar ellertellert 9././@LongLink0000644000000000000000000000023200000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerSimpleTypePattern/echoIntegerSimpleTypePattern-IntegerSimpleTypePattern02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerSimpleTypePattern/echoIntegerSi0000755000175000017500000000226012653650152033022 0ustar ellertellert 9 ././@LongLink0000644000000000000000000000022300000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerSimpleTypePattern/echoIntegerSimpleTypePattern-IntegerSimpleTypePattern02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerSimpleTypePattern/echoIntegerSi0000755000175000017500000000172012653650152033022 0ustar ellertellert 9 ././@LongLink0000644000000000000000000000023200000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerSimpleTypePattern/echoIntegerSimpleTypePattern-IntegerSimpleTypePattern01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerSimpleTypePattern/echoIntegerSi0000755000175000017500000000226212653650152033024 0ustar ellertellert 123 ././@LongLink0000644000000000000000000000023200000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerSimpleTypePattern/echoIntegerSimpleTypePattern-IntegerSimpleTypePattern02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerSimpleTypePattern/echoIntegerSi0000755000175000017500000000226212653650152033024 0ustar ellertellert 9 ././@LongLink0000644000000000000000000000022300000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerSimpleTypePattern/echoIntegerSimpleTypePattern-IntegerSimpleTypePattern01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerSimpleTypePattern/echoIntegerSi0000755000175000017500000000172212653650152033024 0ustar ellertellert 123 ././@LongLink0000644000000000000000000000023200000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerSimpleTypePattern/echoIntegerSimpleTypePattern-IntegerSimpleTypePattern01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerSimpleTypePattern/echoIntegerSi0000755000175000017500000000226412653650152033026 0ustar ellertellert 123 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnySimpleTypeAttribute/0000755000175000017500000000000012653650150030022 5ustar ellertellert././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnySimpleTypeAttribute/AnySimpleTypeAttribute-AnySimpleTypeAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnySimpleTypeAttribute/AnySimpleTypeAt0000755000175000017500000000166512653650150033010 0ustar ellertellert ././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnySimpleTypeAttribute/AnySimpleTypeAttribute-AnySimpleTypeAttribute02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnySimpleTypeAttribute/AnySimpleTypeAt0000755000175000017500000000166112653650150033004 0ustar ellertellert ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnySimpleTypeAttribute/echoAnySimpleTypeAttribute-AnySimpleTypeAttribute02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnySimpleTypeAttribute/echoAnySimpleTy0000755000175000017500000000230212653650150033022 0ustar ellertellert ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnySimpleTypeAttribute/echoAnySimpleTypeAttribute-AnySimpleTypeAttribute01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnySimpleTypeAttribute/echoAnySimpleTy0000755000175000017500000000230412653650150033024 0ustar ellertellert ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnySimpleTypeAttribute/echoAnySimpleTypeAttribute-AnySimpleTypeAttribute02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnySimpleTypeAttribute/echoAnySimpleTy0000755000175000017500000000230012653650150033020 0ustar ellertellert ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnySimpleTypeAttribute/echoAnySimpleTypeAttribute-AnySimpleTypeAttribute01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnySimpleTypeAttribute/echoAnySimpleTy0000755000175000017500000000230612653650150033026 0ustar ellertellert ././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnySimpleTypeAttribute/echoAnySimpleTypeAttribute-AnySimpleTypeAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnySimpleTypeAttribute/echoAnySimpleTy0000755000175000017500000000173212653650150033030 0ustar ellertellert ././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnySimpleTypeAttribute/echoAnySimpleTypeAttribute-AnySimpleTypeAttribute02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnySimpleTypeAttribute/echoAnySimpleTy0000755000175000017500000000172612653650150033033 0ustar ellertellert gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/0000755000175000017500000000000012653650152025605 5ustar ellertellert././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/echoTimeElement-TimeElement03-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/echoTimeElement-TimeElemen0000755000175000017500000000216612653650152032631 0ustar ellertellert 23:59:59 ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/echoTimeElement-TimeElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/echoTimeElement-TimeElemen0000755000175000017500000000157412653650152032633 0ustar ellertellert 12:00:01 ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/echoTimeElement-TimeElement05-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/echoTimeElement-TimeElemen0000755000175000017500000000217612653650152032632 0ustar ellertellert 13:21:03-04:32 ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/echoTimeElement-TimeElement03-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/echoTimeElement-TimeElemen0000755000175000017500000000217012653650152032624 0ustar ellertellert 23:59:59 ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/echoTimeElement-TimeElement05.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/echoTimeElement-TimeElemen0000755000175000017500000000160212653650152032623 0ustar ellertellert 13:21:03-04:32 ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/TimeElement-TimeElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/TimeElement-TimeElement02.0000755000175000017500000000154512653650152032376 0ustar ellertellert 12:00:01././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/TimeElement-TimeElement04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/TimeElement-TimeElement04.0000755000175000017500000000154612653650152032401 0ustar ellertellert 13:21:03Z././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/echoTimeElement-TimeElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/echoTimeElement-TimeElemen0000755000175000017500000000157412653650152032633 0ustar ellertellert 00:00:00 ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/echoTimeElement-TimeElement01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/echoTimeElement-TimeElemen0000755000175000017500000000217012653650152032624 0ustar ellertellert 00:00:00 ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/echoTimeElement-TimeElement04-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/echoTimeElement-TimeElemen0000755000175000017500000000217112653650152032625 0ustar ellertellert 13:21:03Z ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/TimeElement-TimeElement03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/TimeElement-TimeElement03.0000755000175000017500000000154512653650152032377 0ustar ellertellert 23:59:59././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/TimeElement-TimeElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/TimeElement-TimeElement01.0000755000175000017500000000154512653650152032375 0ustar ellertellert 00:00:00././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/echoTimeElement-TimeElement03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/echoTimeElement-TimeElemen0000755000175000017500000000157412653650152032633 0ustar ellertellert 23:59:59 ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/echoTimeElement-TimeElement02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/echoTimeElement-TimeElemen0000755000175000017500000000216612653650152032631 0ustar ellertellert 12:00:01 ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/echoTimeElement-TimeElement02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/echoTimeElement-TimeElemen0000755000175000017500000000217012653650152032624 0ustar ellertellert 12:00:01 ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/echoTimeElement-TimeElement04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/echoTimeElement-TimeElemen0000755000175000017500000000157512653650152032634 0ustar ellertellert 13:21:03Z ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/TimeElement-TimeElement05.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/TimeElement-TimeElement05.0000755000175000017500000000155312653650152032400 0ustar ellertellert 13:21:03-04:32././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/echoTimeElement-TimeElement01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/echoTimeElement-TimeElemen0000755000175000017500000000216612653650152032631 0ustar ellertellert 00:00:00 ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/echoTimeElement-TimeElement04-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/echoTimeElement-TimeElemen0000755000175000017500000000216712653650152032632 0ustar ellertellert 13:21:03Z ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/echoTimeElement-TimeElement05-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/echoTimeElement-TimeElemen0000755000175000017500000000217412653650152032630 0ustar ellertellert 13:21:03-04:32 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequence/0000755000175000017500000000000012653650150027335 5ustar ellertellert././@LongLink0000644000000000000000000000020000000000000011573 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequence/ComplexTypeSequence-ComplexTypeSequence02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequence/ComplexTypeSequenc0000755000175000017500000000210412653650150033055 0ustar ellertellert Widget Green 1233 ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequence/echoComplexTypeSequence-ComplexTypeSequence02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequence/echoComplexTypeSeq0000755000175000017500000000256012653650150033047 0ustar ellertellert Widget Green 1233 ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequence/echoComplexTypeSequence-ComplexTypeSequence01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequence/echoComplexTypeSeq0000755000175000017500000000256212653650150033051 0ustar ellertellert Widget Light Blue 33 ././@LongLink0000644000000000000000000000020000000000000011573 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequence/ComplexTypeSequence-ComplexTypeSequence01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequence/ComplexTypeSequenc0000755000175000017500000000211012653650150033052 0ustar ellertellert Widget Light Blue 33 ././@LongLink0000644000000000000000000000020400000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequence/echoComplexTypeSequence-ComplexTypeSequence02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequence/echoComplexTypeSeq0000755000175000017500000000215112653650150033043 0ustar ellertellert Widget Green 1233 ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequence/echoComplexTypeSequence-ComplexTypeSequence01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequence/echoComplexTypeSeq0000755000175000017500000000256412653650150033053 0ustar ellertellert Widget Light Blue 33 ././@LongLink0000644000000000000000000000020400000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequence/echoComplexTypeSequence-ComplexTypeSequence01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequence/echoComplexTypeSeq0000755000175000017500000000215512653650150033047 0ustar ellertellert Widget Light Blue 33 ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequence/echoComplexTypeSequence-ComplexTypeSequence02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequence/echoComplexTypeSeq0000755000175000017500000000255612653650150033054 0ustar ellertellert Widget Green 1233 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0MaxOccursFinite/0000755000175000017500000000000012653650150031653 5ustar ellertellert././@LongLink0000644000000000000000000000026300000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0MaxOccursFinite/echoElementMinOccurs0MaxOccursFinite-ElementMinOccurs0MaxOccursFinite102-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0MaxOccursFinite/echoE0000755000175000017500000000237612653650150032634 0ustar ellertellert red green ././@LongLink0000644000000000000000000000025400000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0MaxOccursFinite/echoElementMinOccurs0MaxOccursFinite-ElementMinOccurs0MaxOccursFinite102.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0MaxOccursFinite/echoE0000755000175000017500000000176312653650150032633 0ustar ellertellert red green ././@LongLink0000644000000000000000000000025400000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0MaxOccursFinite/echoElementMinOccurs0MaxOccursFinite-ElementMinOccurs0MaxOccursFinite101.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0MaxOccursFinite/echoE0000755000175000017500000000160612653650150032627 0ustar ellertellert ././@LongLink0000644000000000000000000000025000000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0MaxOccursFinite/ElementMinOccurs0MaxOccursFinite-ElementMinOccurs0MaxOccursFinite102.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0MaxOccursFinite/Eleme0000755000175000017500000000166012653650150032633 0ustar ellertellert red green ././@LongLink0000644000000000000000000000025000000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0MaxOccursFinite/ElementMinOccurs0MaxOccursFinite-ElementMinOccurs0MaxOccursFinite101.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0MaxOccursFinite/Eleme0000755000175000017500000000150312653650150032627 0ustar ellertellert ././@LongLink0000644000000000000000000000026300000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0MaxOccursFinite/echoElementMinOccurs0MaxOccursFinite-ElementMinOccurs0MaxOccursFinite102-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0MaxOccursFinite/echoE0000755000175000017500000000237412653650150032632 0ustar ellertellert red green ././@LongLink0000644000000000000000000000026300000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0MaxOccursFinite/echoElementMinOccurs0MaxOccursFinite-ElementMinOccurs0MaxOccursFinite101-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0MaxOccursFinite/echoE0000755000175000017500000000220612653650150032624 0ustar ellertellert ././@LongLink0000644000000000000000000000026300000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0MaxOccursFinite/echoElementMinOccurs0MaxOccursFinite-ElementMinOccurs0MaxOccursFinite101-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0MaxOccursFinite/echoE0000755000175000017500000000220412653650150032622 0ustar ellertellert gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ByteSimpleTypePattern/0000755000175000017500000000000012653650150027650 5ustar ellertellert././@LongLink0000644000000000000000000000020600000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ByteSimpleTypePattern/ByteSimpleTypePattern-ByteSimpleTypePattern01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ByteSimpleTypePattern/ByteSimpleTypePa0000755000175000017500000000163212653650150033000 0ustar ellertellert 1././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ByteSimpleTypePattern/echoByteSimpleTypePattern-ByteSimpleTypePattern01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ByteSimpleTypePattern/echoByteSimpleTy0000755000175000017500000000224312653650150033030 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ByteSimpleTypePattern/echoByteSimpleTypePattern-ByteSimpleTypePattern01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ByteSimpleTypePattern/echoByteSimpleTy0000755000175000017500000000224112653650150033026 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000021200000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ByteSimpleTypePattern/echoByteSimpleTypePattern-ByteSimpleTypePattern01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ByteSimpleTypePattern/echoByteSimpleTy0000755000175000017500000000167312653650150033036 0ustar ellertellert 1 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDaySimpleTypePattern/0000755000175000017500000000000012653650152027573 5ustar ellertellert././@LongLink0000644000000000000000000000020600000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDaySimpleTypePattern/GDaySimpleTypePattern-GDaySimpleTypePattern01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDaySimpleTypePattern/GDaySimpleTypePa0000755000175000017500000000163612653650152032650 0ustar ellertellert ---01././@LongLink0000644000000000000000000000021200000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDaySimpleTypePattern/echoGDaySimpleTypePattern-GDaySimpleTypePattern01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDaySimpleTypePattern/echoGDaySimpleTy0000755000175000017500000000167712653650152032706 0ustar ellertellert ---01 ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDaySimpleTypePattern/echoGDaySimpleTypePattern-GDaySimpleTypePattern01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDaySimpleTypePattern/echoGDaySimpleTy0000755000175000017500000000224512653650152032676 0ustar ellertellert ---01 ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDaySimpleTypePattern/echoGDaySimpleTypePattern-GDaySimpleTypePattern01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDaySimpleTypePattern/echoGDaySimpleTy0000755000175000017500000000224712653650152032700 0ustar ellertellert ---01 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerSimpleTypePattern/0000755000175000017500000000000012653650152032502 5ustar ellertellert././@LongLink0000644000000000000000000000027300000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerSimpleTypePattern/echoNonNegativeIntegerSimpleTypePattern-NonNegativeIntegerSimpleTypePattern02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerSimpleTypePattern/ec0000755000175000017500000000235112653650152033020 0ustar ellertellert 009 ././@LongLink0000644000000000000000000000026400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerSimpleTypePattern/echoNonNegativeIntegerSimpleTypePattern-NonNegativeIntegerSimpleTypePattern01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerSimpleTypePattern/ec0000755000175000017500000000203712653650152033021 0ustar ellertellert 123 ././@LongLink0000644000000000000000000000027300000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerSimpleTypePattern/echoNonNegativeIntegerSimpleTypePattern-NonNegativeIntegerSimpleTypePattern01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerSimpleTypePattern/ec0000755000175000017500000000235312653650152033022 0ustar ellertellert 123 ././@LongLink0000644000000000000000000000026400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerSimpleTypePattern/echoNonNegativeIntegerSimpleTypePattern-NonNegativeIntegerSimpleTypePattern02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerSimpleTypePattern/ec0000755000175000017500000000203712653650152033021 0ustar ellertellert 009 ././@LongLink0000644000000000000000000000026000000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerSimpleTypePattern/NonNegativeIntegerSimpleTypePattern-NonNegativeIntegerSimpleTypePattern01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerSimpleTypePattern/No0000755000175000017500000000176012653650152033010 0ustar ellertellert 123././@LongLink0000644000000000000000000000027300000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerSimpleTypePattern/echoNonNegativeIntegerSimpleTypePattern-NonNegativeIntegerSimpleTypePattern01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerSimpleTypePattern/ec0000755000175000017500000000235112653650152033020 0ustar ellertellert 123 ././@LongLink0000644000000000000000000000027300000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerSimpleTypePattern/echoNonNegativeIntegerSimpleTypePattern-NonNegativeIntegerSimpleTypePattern02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerSimpleTypePattern/ec0000755000175000017500000000235312653650152033022 0ustar ellertellert 009 ././@LongLink0000644000000000000000000000026000000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerSimpleTypePattern/NonNegativeIntegerSimpleTypePattern-NonNegativeIntegerSimpleTypePattern02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerSimpleTypePattern/No0000755000175000017500000000176012653650152033010 0ustar ellertellert 009gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LocalElementComplexType/0000755000175000017500000000000012653650152030133 5ustar ellertellert././@LongLink0000644000000000000000000000021400000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LocalElementComplexType/LocalElementComplexType-LocalElementComplexType01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LocalElementComplexType/LocalElementCo0000755000175000017500000000204712653650152032712 0ustar ellertellert Paul Paul ././@LongLink0000644000000000000000000000022000000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LocalElementComplexType/echoLocalElementComplexType-LocalElementComplexType01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LocalElementComplexType/echoLocalEleme0000755000175000017500000000211212653650152032716 0ustar ellertellert Paul Paul ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LocalElementComplexType/echoLocalElementComplexType-LocalElementComplexType01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LocalElementComplexType/echoLocalEleme0000755000175000017500000000250312653650152032722 0ustar ellertellert Paul Paul ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LocalElementComplexType/echoLocalElementComplexType-LocalElementComplexType01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LocalElementComplexType/echoLocalEleme0000755000175000017500000000250112653650152032720 0ustar ellertellert Paul Paul gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/Base64BinaryAttribute/0000755000175000017500000000000012653650150027450 5ustar ellertellert././@LongLink0000644000000000000000000000021200000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/Base64BinaryAttribute/echoBase64BinaryAttribute-Base64BinaryAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/Base64BinaryAttribute/echoBase64Binary0000755000175000017500000000173512653650150032434 0ustar ellertellert ././@LongLink0000644000000000000000000000020600000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/Base64BinaryAttribute/Base64BinaryAttribute-Base64BinaryAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/Base64BinaryAttribute/Base64BinaryAttr0000755000175000017500000000167112653650150032427 0ustar ellertellert ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/Base64BinaryAttribute/echoBase64BinaryAttribute-Base64BinaryAttribute01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/Base64BinaryAttribute/echoBase64Binary0000755000175000017500000000231312653650150032425 0ustar ellertellert ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/Base64BinaryAttribute/echoBase64BinaryAttribute-Base64BinaryAttribute01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/Base64BinaryAttribute/echoBase64Binary0000755000175000017500000000231112653650150032423 0ustar ellertellert gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDaySimpleTypePattern/0000755000175000017500000000000012653650152030601 5ustar ellertellert././@LongLink0000644000000000000000000000024000000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDaySimpleTypePattern/echoGMonthDaySimpleTypePattern-GMonthDaySimpleTypePattern01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDaySimpleTypePattern/echoGMonthD0000755000175000017500000000230212653650152032663 0ustar ellertellert --12-01 ././@LongLink0000644000000000000000000000022500000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDaySimpleTypePattern/GMonthDaySimpleTypePattern-GMonthDaySimpleTypePattern01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDaySimpleTypePattern/GMonthDaySi0000755000175000017500000000167612653650152032667 0ustar ellertellert --12-01././@LongLink0000644000000000000000000000024000000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDaySimpleTypePattern/echoGMonthDaySimpleTypePattern-GMonthDaySimpleTypePattern01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDaySimpleTypePattern/echoGMonthD0000755000175000017500000000230012653650152032661 0ustar ellertellert --12-01 ././@LongLink0000644000000000000000000000023100000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDaySimpleTypePattern/echoGMonthDaySimpleTypePattern-GMonthDaySimpleTypePattern01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDaySimpleTypePattern/echoGMonthD0000755000175000017500000000174412653650152032674 0ustar ellertellert --12-01 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs0MaxOccursUnbounded/0000755000175000017500000000000012653650152032541 5ustar ellertellert././@LongLink0000644000000000000000000000027700000000000011611 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs0MaxOccursUnbounded/echoSequenceMinOccurs0MaxOccursUnbounded-SequenceMinOccurs0MaxOccursUnbounded101-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs0MaxOccursUnbounded/e0000755000175000017500000000301712653650152032714 0ustar ellertellert 44 33 24 45 64 22 ././@LongLink0000644000000000000000000000027700000000000011611 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs0MaxOccursUnbounded/echoSequenceMinOccurs0MaxOccursUnbounded-SequenceMinOccurs0MaxOccursUnbounded102-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs0MaxOccursUnbounded/e0000755000175000017500000000224412653650152032715 0ustar ellertellert ././@LongLink0000644000000000000000000000026400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs0MaxOccursUnbounded/SequenceMinOccurs0MaxOccursUnbounded-SequenceMinOccurs0MaxOccursUnbounded102.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs0MaxOccursUnbounded/S0000755000175000017500000000157212653650152032676 0ustar ellertellert ././@LongLink0000644000000000000000000000027000000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs0MaxOccursUnbounded/echoSequenceMinOccurs0MaxOccursUnbounded-SequenceMinOccurs0MaxOccursUnbounded102.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs0MaxOccursUnbounded/e0000755000175000017500000000167212653650152032721 0ustar ellertellert ././@LongLink0000644000000000000000000000027000000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs0MaxOccursUnbounded/echoSequenceMinOccurs0MaxOccursUnbounded-SequenceMinOccurs0MaxOccursUnbounded101.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs0MaxOccursUnbounded/e0000755000175000017500000000241412653650152032714 0ustar ellertellert 44 33 24 45 64 22 ././@LongLink0000644000000000000000000000027700000000000011611 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs0MaxOccursUnbounded/echoSequenceMinOccurs0MaxOccursUnbounded-SequenceMinOccurs0MaxOccursUnbounded102-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs0MaxOccursUnbounded/e0000755000175000017500000000224212653650152032713 0ustar ellertellert ././@LongLink0000644000000000000000000000026400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs0MaxOccursUnbounded/SequenceMinOccurs0MaxOccursUnbounded-SequenceMinOccurs0MaxOccursUnbounded101.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs0MaxOccursUnbounded/S0000755000175000017500000000231412653650152032671 0ustar ellertellert 44 33 24 45 64 22 ././@LongLink0000644000000000000000000000027700000000000011611 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs0MaxOccursUnbounded/echoSequenceMinOccurs0MaxOccursUnbounded-SequenceMinOccurs0MaxOccursUnbounded101-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs0MaxOccursUnbounded/e0000755000175000017500000000302112653650152032707 0ustar ellertellert 44 33 24 45 64 22 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypeFractionDigits/0000755000175000017500000000000012653650150031577 5ustar ellertellert././@LongLink0000644000000000000000000000025700000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypeFractionDigits/echoDecimalSimpleTypeFractionDigits-DecimalSimpleTypeFractionDigits01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypeFractionDigits/echoDe0000755000175000017500000000233112653650150032713 0ustar ellertellert 1234.00 ././@LongLink0000644000000000000000000000025000000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypeFractionDigits/echoDecimalSimpleTypeFractionDigits-DecimalSimpleTypeFractionDigits01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypeFractionDigits/echoDe0000755000175000017500000000200712653650150032713 0ustar ellertellert 1234.00 ././@LongLink0000644000000000000000000000025700000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypeFractionDigits/echoDecimalSimpleTypeFractionDigits-DecimalSimpleTypeFractionDigits02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypeFractionDigits/echoDe0000755000175000017500000000232612653650150032717 0ustar ellertellert 1234 ././@LongLink0000644000000000000000000000024400000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypeFractionDigits/DecimalSimpleTypeFractionDigits-DecimalSimpleTypeFractionDigits02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypeFractionDigits/Decima0000755000175000017500000000173112653650150032711 0ustar ellertellert 1234././@LongLink0000644000000000000000000000025700000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypeFractionDigits/echoDecimalSimpleTypeFractionDigits-DecimalSimpleTypeFractionDigits01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypeFractionDigits/echoDe0000755000175000017500000000233312653650150032715 0ustar ellertellert 1234.00 ././@LongLink0000644000000000000000000000024400000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypeFractionDigits/DecimalSimpleTypeFractionDigits-DecimalSimpleTypeFractionDigits01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypeFractionDigits/Decima0000755000175000017500000000173412653650150032714 0ustar ellertellert 1234.00././@LongLink0000644000000000000000000000025000000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypeFractionDigits/echoDecimalSimpleTypeFractionDigits-DecimalSimpleTypeFractionDigits02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypeFractionDigits/echoDe0000755000175000017500000000200412653650150032710 0ustar ellertellert 1234 ././@LongLink0000644000000000000000000000025700000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypeFractionDigits/echoDecimalSimpleTypeFractionDigits-DecimalSimpleTypeFractionDigits02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypeFractionDigits/echoDe0000755000175000017500000000233012653650150032712 0ustar ellertellert 1234 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/Base64BinaryElement/0000755000175000017500000000000012653650150027076 5ustar ellertellert././@LongLink0000644000000000000000000000020000000000000011573 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/Base64BinaryElement/Base64BinaryElement-Base64BinaryElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/Base64BinaryElement/Base64BinaryElemen0000755000175000017500000000162512653650150032347 0ustar ellertellert eHdmb3Rh././@LongLink0000644000000000000000000000020000000000000011573 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/Base64BinaryElement/Base64BinaryElement-Base64BinaryElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/Base64BinaryElement/Base64BinaryElemen0000755000175000017500000000162112653650150032343 0ustar ellertellert bQ==././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/Base64BinaryElement/echoBase64BinaryElement-Base64BinaryElement03-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/Base64BinaryElement/echoBase64BinaryEl0000755000175000017500000000225012653650150032334 0ustar ellertellert cnRjbGNyZW9scg== ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/Base64BinaryElement/echoBase64BinaryElement-Base64BinaryElement02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/Base64BinaryElement/echoBase64BinaryEl0000755000175000017500000000224012653650150032333 0ustar ellertellert eHdmb3Rh ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/Base64BinaryElement/echoBase64BinaryElement-Base64BinaryElement01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/Base64BinaryElement/echoBase64BinaryEl0000755000175000017500000000223212653650150032334 0ustar ellertellert bQ== ././@LongLink0000644000000000000000000000020400000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/Base64BinaryElement/echoBase64BinaryElement-Base64BinaryElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/Base64BinaryElement/echoBase64BinaryEl0000755000175000017500000000166012653650150032340 0ustar ellertellert bQ== ././@LongLink0000644000000000000000000000020400000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/Base64BinaryElement/echoBase64BinaryElement-Base64BinaryElement03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/Base64BinaryElement/echoBase64BinaryEl0000755000175000017500000000167412653650150032345 0ustar ellertellert cnRjbGNyZW9scg== ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/Base64BinaryElement/echoBase64BinaryElement-Base64BinaryElement03-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/Base64BinaryElement/echoBase64BinaryEl0000755000175000017500000000224612653650150032341 0ustar ellertellert cnRjbGNyZW9scg== ././@LongLink0000644000000000000000000000020000000000000011573 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/Base64BinaryElement/Base64BinaryElement-Base64BinaryElement03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/Base64BinaryElement/Base64BinaryElemen0000755000175000017500000000163512653650150032350 0ustar ellertellert cnRjbGNyZW9scg==././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/Base64BinaryElement/echoBase64BinaryElement-Base64BinaryElement01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/Base64BinaryElement/echoBase64BinaryEl0000755000175000017500000000223412653650150032336 0ustar ellertellert bQ== ././@LongLink0000644000000000000000000000020400000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/Base64BinaryElement/echoBase64BinaryElement-Base64BinaryElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/Base64BinaryElement/echoBase64BinaryEl0000755000175000017500000000166412653650150032344 0ustar ellertellert eHdmb3Rh ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/Base64BinaryElement/echoBase64BinaryElement-Base64BinaryElement02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/Base64BinaryElement/echoBase64BinaryEl0000755000175000017500000000223612653650150032340 0ustar ellertellert eHdmb3Rh gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementSequence/0000755000175000017500000000000012653650152027600 5ustar ellertellert././@LongLink0000644000000000000000000000020600000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementSequence/GlobalElementSequence-GlobalElementSequence01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementSequence/GlobalElementSeq0000755000175000017500000000173212653650152032714 0ustar ellertellert one two ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementSequence/echoGlobalElementSequence-GlobalElementSequence01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementSequence/echoGlobalElemen0000755000175000017500000000235612653650152032721 0ustar ellertellert one two ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementSequence/echoGlobalElementSequence-GlobalElementSequence01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementSequence/echoGlobalElemen0000755000175000017500000000235412653650152032717 0ustar ellertellert one two ././@LongLink0000644000000000000000000000021200000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementSequence/echoGlobalElementSequence-GlobalElementSequence01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementSequence/echoGlobalElemen0000755000175000017500000000177312653650152032723 0ustar ellertellert one two gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedLength/0000755000175000017500000000000012653650152026647 5ustar ellertellert././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedLength/RestrictedLength-RestrictedLength01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedLength/RestrictedLength-Rest0000755000175000017500000000157512653650152032772 0ustar ellertellert en././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedLength/RestrictedLength-RestrictedLength02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedLength/RestrictedLength-Rest0000755000175000017500000000157512653650152032772 0ustar ellertellert FR././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedLength/echoRestrictedLength-RestrictedLength01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedLength/echoRestrictedLength-0000755000175000017500000000163112653650152032764 0ustar ellertellert en ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedLength/echoRestrictedLength-RestrictedLength02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedLength/echoRestrictedLength-0000755000175000017500000000221112653650152032757 0ustar ellertellert FR ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedLength/echoRestrictedLength-RestrictedLength01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedLength/echoRestrictedLength-0000755000175000017500000000221112653650152032757 0ustar ellertellert en ././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedLength/echoRestrictedLength-RestrictedLength02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedLength/echoRestrictedLength-0000755000175000017500000000163112653650152032764 0ustar ellertellert FR ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedLength/echoRestrictedLength-RestrictedLength02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedLength/echoRestrictedLength-0000755000175000017500000000221312653650152032761 0ustar ellertellert FR ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedLength/echoRestrictedLength-RestrictedLength01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedLength/echoRestrictedLength-0000755000175000017500000000221312653650152032761 0ustar ellertellert en gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthSimpleTypePattern/0000755000175000017500000000000012653650152030143 5ustar ellertellert././@LongLink0000644000000000000000000000022000000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthSimpleTypePattern/echoGMonthSimpleTypePattern-GMonthSimpleTypePattern01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthSimpleTypePattern/echoGMonthSimp0000755000175000017500000000171412653650152032760 0ustar ellertellert --11 ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthSimpleTypePattern/echoGMonthSimpleTypePattern-GMonthSimpleTypePattern01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthSimpleTypePattern/echoGMonthSimp0000755000175000017500000000225612653650152032762 0ustar ellertellert --11 ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthSimpleTypePattern/echoGMonthSimpleTypePattern-GMonthSimpleTypePattern01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthSimpleTypePattern/echoGMonthSimp0000755000175000017500000000226012653650152032755 0ustar ellertellert --11 ././@LongLink0000644000000000000000000000021400000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthSimpleTypePattern/GMonthSimpleTypePattern-GMonthSimpleTypePattern01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthSimpleTypePattern/GMonthSimpleTy0000755000175000017500000000165112653650152032757 0ustar ellertellert --11gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SimpleContentAnyAttribute/0000755000175000017500000000000012653650152030515 5ustar ellertellert././@LongLink0000644000000000000000000000022200000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SimpleContentAnyAttribute/SimpleContentAnyAttribute-SimpleContentAnyAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SimpleContentAnyAttribute/SimpleConten0000755000175000017500000000174612653650152033053 0ustar ellertellert string././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SimpleContentAnyAttribute/echoSimpleContentAnyAttribute-SimpleContentAnyAttribute01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SimpleContentAnyAttribute/echoSimpleCo0000755000175000017500000000236412653650152033022 0ustar ellertellert string ././@LongLink0000644000000000000000000000022600000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SimpleContentAnyAttribute/echoSimpleContentAnyAttribute-SimpleContentAnyAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SimpleContentAnyAttribute/echoSimpleCo0000755000175000017500000000201612653650152033014 0ustar ellertellert string ././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SimpleContentAnyAttribute/echoSimpleContentAnyAttribute-SimpleContentAnyAttribute01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SimpleContentAnyAttribute/echoSimpleCo0000755000175000017500000000236212653650152033020 0ustar ellertellert string gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ENTITYAttribute/0000755000175000017500000000000012653650152026275 5ustar ellertellert././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ENTITYAttribute/echoENTITYAttribute-ENTITYAttribute01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ENTITYAttribute/echoENTITYAttribute-EN0000755000175000017500000000222712653650152032265 0ustar ellertellert ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ENTITYAttribute/echoENTITYAttribute-ENTITYAttribute01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ENTITYAttribute/echoENTITYAttribute-EN0000755000175000017500000000223112653650152032260 0ustar ellertellert ././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ENTITYAttribute/echoENTITYAttribute-ENTITYAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ENTITYAttribute/echoENTITYAttribute-EN0000755000175000017500000000163712653650152032271 0ustar ellertellert ././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ENTITYAttribute/ENTITYAttribute-ENTITYAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ENTITYAttribute/ENTITYAttribute-ENTITY0000755000175000017500000000160112653650152032133 0ustar ellertellert gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyURIElement/0000755000175000017500000000000012653650150026014 5ustar ellertellert././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyURIElement/echoAnyURIElement-AnyURIElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyURIElement/echoAnyURIElement-AnyURI0000755000175000017500000000165012653650150032331 0ustar ellertellert http://www.w3.org/2002/ws/databinding/ ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyURIElement/AnyURIElement-AnyURIElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyURIElement/AnyURIElement-AnyURIElem0000755000175000017500000000161712653650150032300 0ustar ellertellert http://www.w3.org/2002/ws/databinding/././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyURIElement/echoAnyURIElement-AnyURIElement01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyURIElement/echoAnyURIElement-AnyURI0000755000175000017500000000223612653650150032332 0ustar ellertellert http://www.w3.org/2002/ws/databinding/ ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyURIElement/echoAnyURIElement-AnyURIElement01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyURIElement/echoAnyURIElement-AnyURI0000755000175000017500000000224012653650150032325 0ustar ellertellert http://www.w3.org/2002/ws/databinding/ gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NormalizedStringAttribute/0000755000175000017500000000000012653650152030554 5ustar ellertellert././@LongLink0000644000000000000000000000022600000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NormalizedStringAttribute/echoNormalizedStringAttribute-NormalizedStringAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NormalizedStringAttribute/echoNormaliz0000755000175000017500000000177012653650152033141 0ustar ellertellert ././@LongLink0000644000000000000000000000022200000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NormalizedStringAttribute/NormalizedStringAttribute-NormalizedStringAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NormalizedStringAttribute/NormalizedSt0000755000175000017500000000172012653650152033115 0ustar ellertellert ././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NormalizedStringAttribute/echoNormalizedStringAttribute-NormalizedStringAttribute01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NormalizedStringAttribute/echoNormaliz0000755000175000017500000000233612653650152033140 0ustar ellertellert ././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NormalizedStringAttribute/echoNormalizedStringAttribute-NormalizedStringAttribute01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NormalizedStringAttribute/echoNormaliz0000755000175000017500000000233412653650152033136 0ustar ellertellert gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TokenAttribute/0000755000175000017500000000000012653650152026341 5ustar ellertellert././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TokenAttribute/echoTokenAttribute-TokenAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TokenAttribute/echoTokenAttribute-Toke0000755000175000017500000000163212653650152032774 0ustar ellertellert ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TokenAttribute/echoTokenAttribute-TokenAttribute01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TokenAttribute/echoTokenAttribute-Toke0000755000175000017500000000222612653650152032774 0ustar ellertellert ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TokenAttribute/echoTokenAttribute-TokenAttribute01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TokenAttribute/echoTokenAttribute-Toke0000755000175000017500000000222412653650152032772 0ustar ellertellert ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TokenAttribute/TokenAttribute-TokenAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TokenAttribute/TokenAttribute-TokenAtt0000755000175000017500000000157512653650152032772 0ustar ellertellert gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalAttributeUnqualifiedType/0000755000175000017500000000000012653650152031512 5ustar ellertellert././@LongLink0000644000000000000000000000024500000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalAttributeUnqualifiedType/echoGlobalAttributeUnqualifiedType-GlobalAttributeUnqualifiedType01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalAttributeUnqualifiedType/echoGlo0000755000175000017500000000230612653650152033021 0ustar ellertellert another string ././@LongLink0000644000000000000000000000025400000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalAttributeUnqualifiedType/echoGlobalAttributeUnqualifiedType-GlobalAttributeUnqualifiedType01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalAttributeUnqualifiedType/echoGlo0000755000175000017500000000265112653650152033024 0ustar ellertellert another string ././@LongLink0000644000000000000000000000025400000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalAttributeUnqualifiedType/echoGlobalAttributeUnqualifiedType-GlobalAttributeUnqualifiedType01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalAttributeUnqualifiedType/echoGlo0000755000175000017500000000264712653650152033031 0ustar ellertellert another string ././@LongLink0000644000000000000000000000024100000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalAttributeUnqualifiedType/GlobalAttributeUnqualifiedType-GlobalAttributeUnqualifiedType01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalAttributeUnqualifiedType/GlobalA0000755000175000017500000000223112653650152032737 0ustar ellertellert another string gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ByteAttribute/0000755000175000017500000000000012653650150026162 5ustar ellertellert././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ByteAttribute/echoByteAttribute-ByteAttribute03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ByteAttribute/echoByteAttribute-ByteAt0000755000175000017500000000162112653650150032724 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ByteAttribute/echoByteAttribute-ByteAttribute02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ByteAttribute/echoByteAttribute-ByteAt0000755000175000017500000000221412653650150032723 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ByteAttribute/echoByteAttribute-ByteAttribute01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ByteAttribute/echoByteAttribute-ByteAt0000755000175000017500000000221512653650150032724 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ByteAttribute/echoByteAttribute-ByteAttribute03-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ByteAttribute/echoByteAttribute-ByteAt0000755000175000017500000000221512653650150032724 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ByteAttribute/echoByteAttribute-ByteAttribute03-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ByteAttribute/echoByteAttribute-ByteAt0000755000175000017500000000221712653650150032726 0ustar ellertellert ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ByteAttribute/ByteAttribute-ByteAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ByteAttribute/ByteAttribute-ByteAttrib0000755000175000017500000000156312653650150032753 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ByteAttribute/echoByteAttribute-ByteAttribute02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ByteAttribute/echoByteAttribute-ByteAt0000755000175000017500000000221612653650150032725 0ustar ellertellert ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ByteAttribute/ByteAttribute-ByteAttribute03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ByteAttribute/ByteAttribute-ByteAttrib0000755000175000017500000000156512653650150032755 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ByteAttribute/echoByteAttribute-ByteAttribute01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ByteAttribute/echoByteAttribute-ByteAt0000755000175000017500000000221312653650150032722 0ustar ellertellert ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ByteAttribute/echoByteAttribute-ByteAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ByteAttribute/echoByteAttribute-ByteAt0000755000175000017500000000161712653650150032731 0ustar ellertellert ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ByteAttribute/ByteAttribute-ByteAttribute02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ByteAttribute/ByteAttribute-ByteAttrib0000755000175000017500000000156412653650150032754 0ustar ellertellert ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ByteAttribute/echoByteAttribute-ByteAttribute02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ByteAttribute/echoByteAttribute-ByteAt0000755000175000017500000000162012653650150032723 0ustar ellertellert ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementComplexTypeSequenceExtension/gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementComplexTypeSequenceExtens0000755000175000017500000000000012653650152033102 5ustar ellertellert././@LongLink0000644000000000000000000000030600000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementComplexTypeSequenceExtension/echoGlobalElementComplexTypeSequenceExtension-GlobalElementComplexTypeSequenceExtension01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementComplexTypeSequenceExtens0000755000175000017500000000216412653650152033112 0ustar ellertellert some data ././@LongLink0000644000000000000000000000030200000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementComplexTypeSequenceExtension/GlobalElementComplexTypeSequenceExtension-GlobalElementComplexTypeSequenceExtension01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementComplexTypeSequenceExtens0000755000175000017500000000207712653650152033115 0ustar ellertellert some data ././@LongLink0000644000000000000000000000031500000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementComplexTypeSequenceExtension/echoGlobalElementComplexTypeSequenceExtension-GlobalElementComplexTypeSequenceExtension01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementComplexTypeSequenceExtens0000755000175000017500000000247312653650152033115 0ustar ellertellert some data ././@LongLink0000644000000000000000000000031500000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementComplexTypeSequenceExtension/echoGlobalElementComplexTypeSequenceExtension-GlobalElementComplexTypeSequenceExtension01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementComplexTypeSequenceExtens0000755000175000017500000000247112653650152033113 0ustar ellertellert some data gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntElement/0000755000175000017500000000000012653650154027140 5ustar ellertellert././@LongLink0000644000000000000000000000020100000000000011574 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntElement/echoUnsignedIntElement-UnsignedIntElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntElement/echoUnsignedIntElem0000755000175000017500000000164712653650154032767 0ustar ellertellert -0 ././@LongLink0000644000000000000000000000017500000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntElement/UnsignedIntElement-UnsignedIntElement03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntElement/UnsignedIntElement-0000755000175000017500000000161212653650154032704 0ustar ellertellert +42././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntElement/echoUnsignedIntElement-UnsignedIntElement01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntElement/echoUnsignedIntElem0000755000175000017500000000222212653650154032755 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntElement/echoUnsignedIntElement-UnsignedIntElement01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntElement/echoUnsignedIntElem0000755000175000017500000000222412653650154032757 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000020100000000000011574 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntElement/echoUnsignedIntElement-UnsignedIntElement03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntElement/echoUnsignedIntElem0000755000175000017500000000165012653650154032761 0ustar ellertellert +42 ././@LongLink0000644000000000000000000000020100000000000011574 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntElement/echoUnsignedIntElement-UnsignedIntElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntElement/echoUnsignedIntElem0000755000175000017500000000164612653650154032766 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000020100000000000011574 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntElement/echoUnsignedIntElement-UnsignedIntElement04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntElement/echoUnsignedIntElem0000755000175000017500000000165712653650154032770 0ustar ellertellert 4294967295 ././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntElement/echoUnsignedIntElement-UnsignedIntElement02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntElement/echoUnsignedIntElem0000755000175000017500000000222512653650154032760 0ustar ellertellert -0 ././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntElement/echoUnsignedIntElement-UnsignedIntElement04-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntElement/echoUnsignedIntElem0000755000175000017500000000223512653650154032761 0ustar ellertellert 4294967295 ././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntElement/echoUnsignedIntElement-UnsignedIntElement02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntElement/echoUnsignedIntElem0000755000175000017500000000222312653650154032756 0ustar ellertellert -0 ././@LongLink0000644000000000000000000000017500000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntElement/UnsignedIntElement-UnsignedIntElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntElement/UnsignedIntElement-0000755000175000017500000000161112653650154032703 0ustar ellertellert -0././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntElement/echoUnsignedIntElement-UnsignedIntElement03-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntElement/echoUnsignedIntElem0000755000175000017500000000222412653650154032757 0ustar ellertellert +42 ././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntElement/echoUnsignedIntElement-UnsignedIntElement03-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntElement/echoUnsignedIntElem0000755000175000017500000000222612653650154032761 0ustar ellertellert +42 ././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntElement/echoUnsignedIntElement-UnsignedIntElement04-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntElement/echoUnsignedIntElem0000755000175000017500000000223312653650154032757 0ustar ellertellert 4294967295 ././@LongLink0000644000000000000000000000017500000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntElement/UnsignedIntElement-UnsignedIntElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntElement/UnsignedIntElement-0000755000175000017500000000161012653650154032702 0ustar ellertellert 1././@LongLink0000644000000000000000000000017500000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntElement/UnsignedIntElement-UnsignedIntElement04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntElement/UnsignedIntElement-0000755000175000017500000000162112653650154032704 0ustar ellertellert 4294967295gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatEnumerationType/0000755000175000017500000000000012653650152027513 5ustar ellertellert././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatEnumerationType/echoFloatEnumerationType-FloatEnumerationType01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatEnumerationType/echoFloatEnumerat0000755000175000017500000000225012653650152033045 0ustar ellertellert 1267.43233E12 ././@LongLink0000644000000000000000000000020300000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatEnumerationType/FloatEnumerationType-FloatEnumerationType01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatEnumerationType/FloatEnumerationT0000755000175000017500000000164012653650152033042 0ustar ellertellert 1267.43233E12././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatEnumerationType/echoFloatEnumerationType-FloatEnumerationType01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatEnumerationType/echoFloatEnumerat0000755000175000017500000000225212653650152033047 0ustar ellertellert 1267.43233E12 ././@LongLink0000644000000000000000000000020700000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatEnumerationType/echoFloatEnumerationType-FloatEnumerationType01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatEnumerationType/echoFloatEnumerat0000755000175000017500000000170012653650152033044 0ustar ellertellert 1267.43233E12 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedStringMaxLength/0000755000175000017500000000000012653650152030504 5ustar ellertellert././@LongLink0000644000000000000000000000022200000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedStringMaxLength/RestrictedStringMaxLength-RestrictedStringMaxLength01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedStringMaxLength/RestrictedSt0000755000175000017500000000167512653650152033062 0ustar ellertellert String Value././@LongLink0000644000000000000000000000022600000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedStringMaxLength/echoRestrictedStringMaxLength-RestrictedStringMaxLength01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedStringMaxLength/echoRestrict0000755000175000017500000000174212653650152033074 0ustar ellertellert String Value ././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedStringMaxLength/echoRestrictedStringMaxLength-RestrictedStringMaxLength01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedStringMaxLength/echoRestrict0000755000175000017500000000230212653650152033065 0ustar ellertellert String Value ././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedStringMaxLength/echoRestrictedStringMaxLength-RestrictedStringMaxLength01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedStringMaxLength/echoRestrict0000755000175000017500000000230012653650152033063 0ustar ellertellert String Value gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/0000755000175000017500000000000012653650152026270 5ustar ellertellert././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYearAttribute04-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYea0000755000175000017500000000223312653650152032573 0ustar ellertellert ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYearAttribute02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYea0000755000175000017500000000163112653650152032574 0ustar ellertellert ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYearAttribute03-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYea0000755000175000017500000000222312653650152032572 0ustar ellertellert ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYearAttribute05-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYea0000755000175000017500000000223312653650152032573 0ustar ellertellert ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYearAttribute01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYea0000755000175000017500000000222512653650152032574 0ustar ellertellert ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYearAttribute04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYea0000755000175000017500000000163712653650152032602 0ustar ellertellert ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYearAttribute03-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYea0000755000175000017500000000222512653650152032574 0ustar ellertellert ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYearAttribute05-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYea0000755000175000017500000000223112653650152032571 0ustar ellertellert ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/GYearAttribute-GYearAttribute06.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/GYearAttribute-GYearAtt0000755000175000017500000000157512653650152032577 0ustar ellertellert ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYearAttribute03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYea0000755000175000017500000000163112653650152032574 0ustar ellertellert ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYearAttribute06-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYea0000755000175000017500000000222612653650152032575 0ustar ellertellert ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYearAttribute04-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYea0000755000175000017500000000223112653650152032571 0ustar ellertellert ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYearAttribute07-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYea0000755000175000017500000000222612653650152032575 0ustar ellertellert ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYearAttribute06.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYea0000755000175000017500000000163212653650152032575 0ustar ellertellert ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYearAttribute07-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYea0000755000175000017500000000222412653650152032573 0ustar ellertellert ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYearAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYea0000755000175000017500000000163112653650152032574 0ustar ellertellert ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/GYearAttribute-GYearAttribute05.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/GYearAttribute-GYearAtt0000755000175000017500000000160212653650152032566 0ustar ellertellert ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYearAttribute02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYea0000755000175000017500000000222512653650152032574 0ustar ellertellert ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYearAttribute06-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYea0000755000175000017500000000222412653650152032573 0ustar ellertellert ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYearAttribute02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYea0000755000175000017500000000222312653650152032572 0ustar ellertellert ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYearAttribute05.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYea0000755000175000017500000000163712653650152032602 0ustar ellertellert ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/GYearAttribute-GYearAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/GYearAttribute-GYearAtt0000755000175000017500000000157412653650152032576 0ustar ellertellert ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYearAttribute07.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYea0000755000175000017500000000163212653650152032575 0ustar ellertellert ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/GYearAttribute-GYearAttribute02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/GYearAttribute-GYearAtt0000755000175000017500000000157412653650152032576 0ustar ellertellert ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/GYearAttribute-GYearAttribute04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/GYearAttribute-GYearAtt0000755000175000017500000000160212653650152032566 0ustar ellertellert ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYearAttribute01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYea0000755000175000017500000000222312653650152032572 0ustar ellertellert ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/GYearAttribute-GYearAttribute03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/GYearAttribute-GYearAtt0000755000175000017500000000157412653650152032576 0ustar ellertellert ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/GYearAttribute-GYearAttribute07.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/GYearAttribute-GYearAtt0000755000175000017500000000157512653650152032577 0ustar ellertellert gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypePattern/0000755000175000017500000000000012653650150030303 5ustar ellertellert././@LongLink0000644000000000000000000000022300000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypePattern/echoDecimalSimpleTypePattern-DecimalSimpleTypePattern02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypePattern/echoDecimalSi0000755000175000017500000000172612653650150032730 0ustar ellertellert 9898.00 ././@LongLink0000644000000000000000000000023200000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypePattern/echoDecimalSimpleTypePattern-DecimalSimpleTypePattern01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypePattern/echoDecimalSi0000755000175000017500000000227012653650150032723 0ustar ellertellert 1234.12 ././@LongLink0000644000000000000000000000023200000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypePattern/echoDecimalSimpleTypePattern-DecimalSimpleTypePattern01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypePattern/echoDecimalSi0000755000175000017500000000226612653650150032730 0ustar ellertellert 1234.12 ././@LongLink0000644000000000000000000000023200000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypePattern/echoDecimalSimpleTypePattern-DecimalSimpleTypePattern02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypePattern/echoDecimalSi0000755000175000017500000000226612653650150032730 0ustar ellertellert 9898.00 ././@LongLink0000644000000000000000000000021700000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypePattern/DecimalSimpleTypePattern-DecimalSimpleTypePattern02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypePattern/DecimalSimple0000755000175000017500000000166212653650150032746 0ustar ellertellert 9898.00././@LongLink0000644000000000000000000000022300000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypePattern/echoDecimalSimpleTypePattern-DecimalSimpleTypePattern01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypePattern/echoDecimalSi0000755000175000017500000000172612653650150032730 0ustar ellertellert 1234.12 ././@LongLink0000644000000000000000000000021700000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypePattern/DecimalSimpleTypePattern-DecimalSimpleTypePattern01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypePattern/DecimalSimple0000755000175000017500000000166212653650150032746 0ustar ellertellert 1234.12././@LongLink0000644000000000000000000000023200000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypePattern/echoDecimalSimpleTypePattern-DecimalSimpleTypePattern02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypePattern/echoDecimalSi0000755000175000017500000000227012653650150032723 0ustar ellertellert 9898.00 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeDefault/0000755000175000017500000000000012653650150026643 5ustar ellertellert././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeDefault/AttributeDefault-AttributeDefault01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeDefault/AttributeDefault-Attr0000755000175000017500000000154612653650150032757 0ustar ellertellert ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeDefault/echoAttributeDefault-AttributeDefault03-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeDefault/echoAttributeDefault-0000755000175000017500000000224212653650150032755 0ustar ellertellert ././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeDefault/echoAttributeDefault-AttributeDefault03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeDefault/echoAttributeDefault-0000755000175000017500000000165412653650150032763 0ustar ellertellert ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeDefault/echoAttributeDefault-AttributeDefault01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeDefault/echoAttributeDefault-0000755000175000017500000000216412653650150032760 0ustar ellertellert ././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeDefault/echoAttributeDefault-AttributeDefault04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeDefault/echoAttributeDefault-0000755000175000017500000000167012653650150032761 0ustar ellertellert ././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeDefault/echoAttributeDefault-AttributeDefault01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeDefault/echoAttributeDefault-0000755000175000017500000000160212653650150032754 0ustar ellertellert ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeDefault/echoAttributeDefault-AttributeDefault01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeDefault/echoAttributeDefault-0000755000175000017500000000216212653650150032756 0ustar ellertellert ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeDefault/echoAttributeDefault-AttributeDefault04-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeDefault/echoAttributeDefault-0000755000175000017500000000226012653650150032755 0ustar ellertellert ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeDefault/echoAttributeDefault-AttributeDefault04-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeDefault/echoAttributeDefault-0000755000175000017500000000225612653650150032762 0ustar ellertellert ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeDefault/AttributeDefault-AttributeDefault03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeDefault/AttributeDefault-Attr0000755000175000017500000000161512653650150032754 0ustar ellertellert ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeDefault/AttributeDefault-AttributeDefault02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeDefault/AttributeDefault-Attr0000755000175000017500000000163412653650150032755 0ustar ellertellert ././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeDefault/echoAttributeDefault-AttributeDefault02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeDefault/echoAttributeDefault-0000755000175000017500000000167312653650150032764 0ustar ellertellert ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeDefault/echoAttributeDefault-AttributeDefault03-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeDefault/echoAttributeDefault-0000755000175000017500000000224412653650150032757 0ustar ellertellert ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeDefault/AttributeDefault-AttributeDefault04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeDefault/AttributeDefault-Attr0000755000175000017500000000163112653650150032752 0ustar ellertellert ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeDefault/echoAttributeDefault-AttributeDefault02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeDefault/echoAttributeDefault-0000755000175000017500000000226112653650150032756 0ustar ellertellert ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeDefault/echoAttributeDefault-AttributeDefault02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeDefault/echoAttributeDefault-0000755000175000017500000000226312653650150032760 0ustar ellertellert gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexTypeEmptyExtension/0000755000175000017500000000000012653650152031703 5ustar ellertellert././@LongLink0000644000000000000000000000024400000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexTypeEmptyExtension/GlobalComplexTypeEmptyExtension-GlobalComplexTypeEmptyExtension01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexTypeEmptyExtension/Global0000755000175000017500000000166112653650152033035 0ustar ellertellert ././@LongLink0000644000000000000000000000025700000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexTypeEmptyExtension/echoGlobalComplexTypeEmptyExtension-GlobalComplexTypeEmptyExtension01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexTypeEmptyExtension/echoGl0000755000175000017500000000226012653650152033032 0ustar ellertellert ././@LongLink0000644000000000000000000000025700000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexTypeEmptyExtension/echoGlobalComplexTypeEmptyExtension-GlobalComplexTypeEmptyExtension01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexTypeEmptyExtension/echoGl0000755000175000017500000000225612653650152033037 0ustar ellertellert ././@LongLink0000644000000000000000000000025000000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexTypeEmptyExtension/echoGlobalComplexTypeEmptyExtension-GlobalComplexTypeEmptyExtension01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexTypeEmptyExtension/echoGl0000755000175000017500000000173412653650152033037 0ustar ellertellert gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccursUnbounded/0000755000175000017500000000000012653650152030636 5ustar ellertellert././@LongLink0000644000000000000000000000024000000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccursUnbounded/echoSequenceMaxOccursUnbounded-SequenceMaxOccursUnbounded02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccursUnbounded/echoSequenc0000755000175000017500000000241012653650152033023 0ustar ellertellert 2006-01-26 1-44795-912-6 ././@LongLink0000644000000000000000000000024000000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccursUnbounded/echoSequenceMaxOccursUnbounded-SequenceMaxOccursUnbounded02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccursUnbounded/echoSequenc0000755000175000017500000000241212653650152033025 0ustar ellertellert 2006-01-26 1-44795-912-6 ././@LongLink0000644000000000000000000000024000000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccursUnbounded/echoSequenceMaxOccursUnbounded-SequenceMaxOccursUnbounded01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccursUnbounded/echoSequenc0000755000175000017500000000322412653650152033027 0ustar ellertellert 2002-09-24 1-55960-907-6 2003-04-14 1-25466-908-6 2004-03-31 1-35460-909-6 2005-06-04 1-54560-910-6 2006-07-03 1-74869-911-6 ././@LongLink0000644000000000000000000000023100000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccursUnbounded/echoSequenceMaxOccursUnbounded-SequenceMaxOccursUnbounded02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccursUnbounded/echoSequenc0000755000175000017500000000201512653650152033024 0ustar ellertellert 2006-01-26 1-44795-912-6 ././@LongLink0000644000000000000000000000024000000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccursUnbounded/echoSequenceMaxOccursUnbounded-SequenceMaxOccursUnbounded01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccursUnbounded/echoSequenc0000755000175000017500000000322612653650152033031 0ustar ellertellert 2002-09-24 1-55960-907-6 2003-04-14 1-25466-908-6 2004-03-31 1-35460-909-6 2005-06-04 1-54560-910-6 2006-07-03 1-74869-911-6 ././@LongLink0000644000000000000000000000022500000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccursUnbounded/SequenceMaxOccursUnbounded-SequenceMaxOccursUnbounded01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccursUnbounded/SequenceMax0000755000175000017500000000251112653650152033001 0ustar ellertellert 2002-09-24 1-55960-907-6 2003-04-14 1-25466-908-6 2004-03-31 1-35460-909-6 2005-06-04 1-54560-910-6 2006-07-03 1-74869-911-6 ././@LongLink0000644000000000000000000000022500000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccursUnbounded/SequenceMaxOccursUnbounded-SequenceMaxOccursUnbounded02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccursUnbounded/SequenceMax0000755000175000017500000000173512653650152033010 0ustar ellertellert 2006-01-26 1-44795-912-6 ././@LongLink0000644000000000000000000000023100000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccursUnbounded/echoSequenceMaxOccursUnbounded-SequenceMaxOccursUnbounded01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccursUnbounded/echoSequenc0000755000175000017500000000257112653650152033033 0ustar ellertellert 2002-09-24 1-55960-907-6 2003-04-14 1-25466-908-6 2004-03-31 1-35460-909-6 2005-06-04 1-54560-910-6 2006-07-03 1-74869-911-6 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSimpleContent/0000755000175000017500000000000012653650152027642 5ustar ellertellert././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSimpleContent/echoExtendedSimpleContent-ExtendedSimpleContent01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSimpleContent/echoExtendedSimp0000755000175000017500000000233612653650152033024 0ustar ellertellert string ././@LongLink0000644000000000000000000000021200000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSimpleContent/echoExtendedSimpleContent-ExtendedSimpleContent01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSimpleContent/echoExtendedSimp0000755000175000017500000000176012653650152033024 0ustar ellertellert string ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSimpleContent/echoExtendedSimpleContent-ExtendedSimpleContent01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSimpleContent/echoExtendedSimp0000755000175000017500000000233412653650152033022 0ustar ellertellert string ././@LongLink0000644000000000000000000000020600000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSimpleContent/ExtendedSimpleContent-ExtendedSimpleContent01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSimpleContent/ExtendedSimpleCo0000755000175000017500000000171412653650152032767 0ustar ellertellert stringgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinInclusive/0000755000175000017500000000000012653650152030033 5ustar ellertellert././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinInclusive/echoRestrictedMinInclusive-RestrictedMinInclusive02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinInclusive/echoRestrictedM0000755000175000017500000000225012653650152033044 0ustar ellertellert 2 ././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinInclusive/RestrictedMinInclusive-RestrictedMinInclusive02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinInclusive/RestrictedMinIn0000755000175000017500000000164012653650152033025 0ustar ellertellert 2././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinInclusive/echoRestrictedMinInclusive-RestrictedMinInclusive02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinInclusive/echoRestrictedM0000755000175000017500000000170212653650152033045 0ustar ellertellert 2 ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinInclusive/echoRestrictedMinInclusive-RestrictedMinInclusive01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinInclusive/echoRestrictedM0000755000175000017500000000225012653650152033044 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinInclusive/echoRestrictedMinInclusive-RestrictedMinInclusive01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinInclusive/echoRestrictedM0000755000175000017500000000170212653650152033045 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinInclusive/echoRestrictedMinInclusive-RestrictedMinInclusive02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinInclusive/echoRestrictedM0000755000175000017500000000224612653650152033051 0ustar ellertellert 2 ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinInclusive/echoRestrictedMinInclusive-RestrictedMinInclusive01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinInclusive/echoRestrictedM0000755000175000017500000000224612653650152033051 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinInclusive/RestrictedMinInclusive-RestrictedMinInclusive01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinInclusive/RestrictedMinIn0000755000175000017500000000164012653650152033025 0ustar ellertellert 1gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccurs1/0000755000175000017500000000000012653650150026672 5ustar ellertellert././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccurs1/echoElementMaxOccurs1-ElementMaxOccurs102-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccurs1/echoElementMaxOccurs0000755000175000017500000000227112653650150032677 0ustar ellertellert 4 ././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccurs1/ElementMaxOccurs1-ElementMaxOccurs101.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccurs1/ElementMaxOccurs1-El0000755000175000017500000000165012653650150032457 0ustar ellertellert 44 ././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccurs1/echoElementMaxOccurs1-ElementMaxOccurs101.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccurs1/echoElementMaxOccurs0000755000175000017500000000170512653650150032700 0ustar ellertellert 44 ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccurs1/echoElementMaxOccurs1-ElementMaxOccurs101-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccurs1/echoElementMaxOccurs0000755000175000017500000000227212653650150032700 0ustar ellertellert 44 ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccurs1/echoElementMaxOccurs1-ElementMaxOccurs102-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccurs1/echoElementMaxOccurs0000755000175000017500000000227312653650150032701 0ustar ellertellert 4 ././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccurs1/ElementMaxOccurs1-ElementMaxOccurs102.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccurs1/ElementMaxOccurs1-El0000755000175000017500000000164712653650150032465 0ustar ellertellert 4 ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccurs1/echoElementMaxOccurs1-ElementMaxOccurs101-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccurs1/echoElementMaxOccurs0000755000175000017500000000227412653650150032702 0ustar ellertellert 44 ././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccurs1/echoElementMaxOccurs1-ElementMaxOccurs102.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccurs1/echoElementMaxOccurs0000755000175000017500000000170412653650150032677 0ustar ellertellert 4 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyURIAttribute/0000755000175000017500000000000012653650150026366 5ustar ellertellert././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyURIAttribute/echoAnyURIAttribute-AnyURIAttribute01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyURIAttribute/echoAnyURIAttribute-An0000755000175000017500000000226012653650150032502 0ustar ellertellert ././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyURIAttribute/AnyURIAttribute-AnyURIAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyURIAttribute/AnyURIAttribute-AnyURI0000755000175000017500000000163212653650150032416 0ustar ellertellert ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyURIAttribute/echoAnyURIAttribute-AnyURIAttribute01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyURIAttribute/echoAnyURIAttribute-An0000755000175000017500000000226212653650150032504 0ustar ellertellert ././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyURIAttribute/echoAnyURIAttribute-AnyURIAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyURIAttribute/echoAnyURIAttribute-An0000755000175000017500000000167012653650150032506 0ustar ellertellert gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SimpleTypeRenamed/0000755000175000017500000000000012653650152026764 5ustar ellertellert././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SimpleTypeRenamed/echoSimpleTypeRenamed-SimpleTypeRenamed01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SimpleTypeRenamed/echoSimpleTypeRename0000755000175000017500000000222212653650152032772 0ustar ellertellert String ././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SimpleTypeRenamed/SimpleTypeRenamed-SimpleTypeRenamed01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SimpleTypeRenamed/SimpleTypeRenamed-Si0000755000175000017500000000160712653650152032656 0ustar ellertellert String././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SimpleTypeRenamed/echoSimpleTypeRenamed-SimpleTypeRenamed01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SimpleTypeRenamed/echoSimpleTypeRename0000755000175000017500000000222412653650152032774 0ustar ellertellert String ././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SimpleTypeRenamed/echoSimpleTypeRenamed-SimpleTypeRenamed01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SimpleTypeRenamed/echoSimpleTypeRename0000755000175000017500000000164412653650152033001 0ustar ellertellert String gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DurationAttribute/0000755000175000017500000000000012653650150027044 5ustar ellertellert././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DurationAttribute/DurationAttribute-DurationAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DurationAttribute/DurationAttribute-Du0000755000175000017500000000162012653650150033010 0ustar ellertellert ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DurationAttribute/echoDurationAttribute-DurationAttribute01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DurationAttribute/echoDurationAttribut0000755000175000017500000000224412653650150033137 0ustar ellertellert ././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DurationAttribute/echoDurationAttribute-DurationAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DurationAttribute/echoDurationAttribut0000755000175000017500000000166012653650150033140 0ustar ellertellert ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DurationAttribute/echoDurationAttribute-DurationAttribute01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DurationAttribute/echoDurationAttribut0000755000175000017500000000224612653650150033141 0ustar ellertellert gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequenceExtension/0000755000175000017500000000000012653650150031232 5ustar ellertellert././@LongLink0000644000000000000000000000023700000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequenceExtension/echoComplexTypeSequenceExtension-ComplexTypeSequenceExtension01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequenceExtension/echoCompl0000755000175000017500000000210012653650150033062 0ustar ellertellert Mary tall ././@LongLink0000644000000000000000000000024600000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequenceExtension/echoComplexTypeSequenceExtension-ComplexTypeSequenceExtension01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequenceExtension/echoCompl0000755000175000017500000000244512653650150033076 0ustar ellertellert Mary tall ././@LongLink0000644000000000000000000000023300000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequenceExtension/ComplexTypeSequenceExtension-ComplexTypeSequenceExtension01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequenceExtension/ComplexTy0000755000175000017500000000203012653650150033077 0ustar ellertellert Mary tall ././@LongLink0000644000000000000000000000024600000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequenceExtension/echoComplexTypeSequenceExtension-ComplexTypeSequenceExtension01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequenceExtension/echoCompl0000755000175000017500000000244312653650150033074 0ustar ellertellert Mary tall gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TargetNamespace/0000755000175000017500000000000012653650152026440 5ustar ellertellert././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TargetNamespace/echoTargetNamespace-TargetNamespace01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TargetNamespace/echoTargetNamespace-Ta0000755000175000017500000000162312653650152032634 0ustar ellertellert foo ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TargetNamespace/echoTargetNamespace-TargetNamespace01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TargetNamespace/echoTargetNamespace-Ta0000755000175000017500000000220512653650152032631 0ustar ellertellert foo ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TargetNamespace/echoTargetNamespace-TargetNamespace01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TargetNamespace/echoTargetNamespace-Ta0000755000175000017500000000220712653650152032633 0ustar ellertellert foo ././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TargetNamespace/TargetNamespace-TargetNamespace01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TargetNamespace/TargetNamespace-Target0000755000175000017500000000157012653650152032660 0ustar ellertellert foogsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/0000755000175000017500000000000012653650150026753 5ustar ellertellert././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/DateTimeAttribute-DateTimeAttribute02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/DateTimeAttribute-Da0000755000175000017500000000164612653650150032612 0ustar ellertellert ././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/DateTimeAttribute-DateTimeAttribute06.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/DateTimeAttribute-Da0000755000175000017500000000164112653650150032605 0ustar ellertellert ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribute-DateTimeAttribute05-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribut0000755000175000017500000000226612653650150032761 0ustar ellertellert ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribute-DateTimeAttribute04-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribut0000755000175000017500000000226612653650150032761 0ustar ellertellert ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribute-DateTimeAttribute04-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribut0000755000175000017500000000226412653650150032757 0ustar ellertellert ././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribute-DateTimeAttribute05.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribut0000755000175000017500000000170012653650150032751 0ustar ellertellert ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribute-DateTimeAttribute05-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribut0000755000175000017500000000226412653650150032757 0ustar ellertellert ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribute-DateTimeAttribute01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribut0000755000175000017500000000227212653650150032756 0ustar ellertellert ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribute-DateTimeAttribute06-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribut0000755000175000017500000000226712653650150032762 0ustar ellertellert ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribute-DateTimeAttribute03-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribut0000755000175000017500000000226712653650150032762 0ustar ellertellert ././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/DateTimeAttribute-DateTimeAttribute05.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/DateTimeAttribute-Da0000755000175000017500000000164012653650150032604 0ustar ellertellert ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribute-DateTimeAttribute02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribut0000755000175000017500000000227212653650150032756 0ustar ellertellert ././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/DateTimeAttribute-DateTimeAttribute03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/DateTimeAttribute-Da0000755000175000017500000000164112653650150032605 0ustar ellertellert ././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/DateTimeAttribute-DateTimeAttribute04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/DateTimeAttribute-Da0000755000175000017500000000164012653650150032604 0ustar ellertellert ././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribute-DateTimeAttribute04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribut0000755000175000017500000000170012653650150032751 0ustar ellertellert ././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribute-DateTimeAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribut0000755000175000017500000000170612653650150032757 0ustar ellertellert ././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribute-DateTimeAttribute02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribut0000755000175000017500000000170612653650150032757 0ustar ellertellert ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribute-DateTimeAttribute06-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribut0000755000175000017500000000226512653650150032760 0ustar ellertellert ././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribute-DateTimeAttribute03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribut0000755000175000017500000000170112653650150032752 0ustar ellertellert ././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribute-DateTimeAttribute06.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribut0000755000175000017500000000170112653650150032752 0ustar ellertellert ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribute-DateTimeAttribute03-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribut0000755000175000017500000000226512653650150032760 0ustar ellertellert ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribute-DateTimeAttribute01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribut0000755000175000017500000000227412653650150032760 0ustar ellertellert ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribute-DateTimeAttribute02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribut0000755000175000017500000000227412653650150032760 0ustar ellertellert ././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/DateTimeAttribute-DateTimeAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/DateTimeAttribute-Da0000755000175000017500000000164612653650150032612 0ustar ellertellert gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IDREFElement/0000755000175000017500000000000012653650152025540 5ustar ellertellert././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IDREFElement/echoIDREFElement-IDREFElement01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IDREFElement/echoIDREFElement-IDREFEle0000755000175000017500000000217012653650152031745 0ustar ellertellert foo ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IDREFElement/IDREFElement-IDREFElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IDREFElement/IDREFElement-IDREFElement0000755000175000017500000000154612653650152032000 0ustar ellertellert foo././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IDREFElement/echoIDREFElement-IDREFElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IDREFElement/echoIDREFElement-IDREFEle0000755000175000017500000000157612653650152031756 0ustar ellertellert foo ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IDREFElement/echoIDREFElement-IDREFElement01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IDREFElement/echoIDREFElement-IDREFEle0000755000175000017500000000216612653650152031752 0ustar ellertellert foo gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BooleanAttribute/0000755000175000017500000000000012653650150026636 5ustar ellertellert././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BooleanAttribute/echoBooleanAttribute-BooleanAttribute02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BooleanAttribute/echoBooleanAttribute-0000755000175000017500000000164612653650150032752 0ustar ellertellert ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BooleanAttribute/BooleanAttribute-BooleanAttribute02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BooleanAttribute/BooleanAttribute-Bool0000755000175000017500000000160712653650150032724 0ustar ellertellert ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BooleanAttribute/BooleanAttribute-BooleanAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BooleanAttribute/BooleanAttribute-Bool0000755000175000017500000000161212653650150032720 0ustar ellertellert ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BooleanAttribute/echoBooleanAttribute-BooleanAttribute01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BooleanAttribute/echoBooleanAttribute-0000755000175000017500000000223712653650150032747 0ustar ellertellert ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BooleanAttribute/echoBooleanAttribute-BooleanAttribute01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BooleanAttribute/echoBooleanAttribute-0000755000175000017500000000224112653650150032742 0ustar ellertellert ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BooleanAttribute/echoBooleanAttribute-BooleanAttribute02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BooleanAttribute/echoBooleanAttribute-0000755000175000017500000000223612653650150032746 0ustar ellertellert ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BooleanAttribute/echoBooleanAttribute-BooleanAttribute02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BooleanAttribute/echoBooleanAttribute-0000755000175000017500000000223412653650150032744 0ustar ellertellert ././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BooleanAttribute/echoBooleanAttribute-BooleanAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BooleanAttribute/echoBooleanAttribute-0000755000175000017500000000165112653650150032746 0ustar ellertellert gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerElement/0000755000175000017500000000000012653650152030027 5ustar ellertellert././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerElement/echoPositiveIntegerElement-PositiveIntegerElement01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerElement/echoPositiveInt0000755000175000017500000000224612653650152033075 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerElement/PositiveIntegerElement-PositiveIntegerElement03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerElement/PositiveInteger0000755000175000017500000000173012653650152033076 0ustar ellertellert 153452759384758934752984759387692835739846739486754598674././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerElement/echoPositiveIntegerElement-PositiveIntegerElement02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerElement/echoPositiveInt0000755000175000017500000000225212653650152033072 0ustar ellertellert +42 ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerElement/echoPositiveIntegerElement-PositiveIntegerElement03-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerElement/echoPositiveInt0000755000175000017500000000233612653650152033075 0ustar ellertellert 153452759384758934752984759387692835739846739486754598674 ././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerElement/PositiveIntegerElement-PositiveIntegerElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerElement/PositiveInteger0000755000175000017500000000164212653650152033100 0ustar ellertellert +42././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerElement/echoPositiveIntegerElement-PositiveIntegerElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerElement/echoPositiveInt0000755000175000017500000000170412653650152033073 0ustar ellertellert +42 ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerElement/echoPositiveIntegerElement-PositiveIntegerElement03-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerElement/echoPositiveInt0000755000175000017500000000234012653650152033070 0ustar ellertellert 153452759384758934752984759387692835739846739486754598674 ././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerElement/echoPositiveIntegerElement-PositiveIntegerElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerElement/echoPositiveInt0000755000175000017500000000170212653650152033071 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerElement/echoPositiveIntegerElement-PositiveIntegerElement03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerElement/echoPositiveInt0000755000175000017500000000177212653650152033100 0ustar ellertellert 153452759384758934752984759387692835739846739486754598674 ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerElement/echoPositiveIntegerElement-PositiveIntegerElement02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerElement/echoPositiveInt0000755000175000017500000000225012653650152033070 0ustar ellertellert +42 ././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerElement/PositiveIntegerElement-PositiveIntegerElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerElement/PositiveInteger0000755000175000017500000000164012653650152033076 0ustar ellertellert 1././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerElement/echoPositiveIntegerElement-PositiveIntegerElement01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerElement/echoPositiveInt0000755000175000017500000000225012653650152033070 0ustar ellertellert 1 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TokenElement/0000755000175000017500000000000012653650152025767 5ustar ellertellert././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TokenElement/echoTokenElement-TokenElement01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TokenElement/echoTokenElement-TokenEle0000755000175000017500000000217712653650152032661 0ustar ellertellert tokenElement ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TokenElement/echoTokenElement-TokenElement01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TokenElement/echoTokenElement-TokenEle0000755000175000017500000000220112653650152032645 0ustar ellertellert tokenElement ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TokenElement/TokenElement-TokenElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TokenElement/TokenElement-TokenElement0000755000175000017500000000155712653650152032707 0ustar ellertellert tokenElement././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TokenElement/echoTokenElement-TokenElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TokenElement/echoTokenElement-TokenEle0000755000175000017500000000160712653650152032656 0ustar ellertellert tokenElement gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnionSimpleAndMemberTypes/0000755000175000017500000000000012653650154030441 5ustar ellertellert././@LongLink0000644000000000000000000000022200000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnionSimpleAndMemberTypes/UnionSimpleAndMemberTypes-UnionSimpleAndMemberTypes01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnionSimpleAndMemberTypes/UnionSimpleA0000755000175000017500000000166712653650154032744 0ustar ellertellert string././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnionSimpleAndMemberTypes/echoUnionSimpleAndMemberTypes-UnionSimpleAndMemberTypes01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnionSimpleAndMemberTypes/echoUnionSim0000755000175000017500000000227412653650154032774 0ustar ellertellert string ././@LongLink0000644000000000000000000000022600000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnionSimpleAndMemberTypes/echoUnionSimpleAndMemberTypes-UnionSimpleAndMemberTypes01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnionSimpleAndMemberTypes/echoUnionSim0000755000175000017500000000173412653650154032774 0ustar ellertellert string ././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnionSimpleAndMemberTypes/echoUnionSimpleAndMemberTypes-UnionSimpleAndMemberTypes01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnionSimpleAndMemberTypes/echoUnionSim0000755000175000017500000000227212653650154032772 0ustar ellertellert string gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs1/0000755000175000017500000000000012653650152026672 5ustar ellertellert././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs1/ElementMinOccurs1-ElementMinOccurs101.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs1/ElementMinOccurs1-El0000755000175000017500000000171312653650152032455 0ustar ellertellert item1 ././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs1/echoElementMinOccurs1-ElementMinOccurs101.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs1/echoElementMinOccurs0000755000175000017500000000175012653650152032676 0ustar ellertellert item1 ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs1/echoElementMinOccurs1-ElementMinOccurs101-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs1/echoElementMinOccurs0000755000175000017500000000233712653650152032700 0ustar ellertellert item1 ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs1/echoElementMinOccurs1-ElementMinOccurs101-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs1/echoElementMinOccurs0000755000175000017500000000233512653650152032676 0ustar ellertellert item1 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteElement/0000755000175000017500000000000012653650154027311 5ustar ellertellert././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteElement/echoUnsignedByteElement-UnsignedByteElement01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteElement/echoUnsignedByteEl0000755000175000017500000000223112653650154032755 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteElement/echoUnsignedByteElement-UnsignedByteElement02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteElement/echoUnsignedByteEl0000755000175000017500000000223012653650154032754 0ustar ellertellert -0 ././@LongLink0000644000000000000000000000020000000000000011573 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteElement/UnsignedByteElement-UnsignedByteElement03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteElement/UnsignedByteElemen0000755000175000017500000000162012653650154032764 0ustar ellertellert +42././@LongLink0000644000000000000000000000020000000000000011573 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteElement/UnsignedByteElement-UnsignedByteElement04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteElement/UnsignedByteElemen0000755000175000017500000000162012653650154032764 0ustar ellertellert 255././@LongLink0000644000000000000000000000020400000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteElement/echoUnsignedByteElement-UnsignedByteElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteElement/echoUnsignedByteEl0000755000175000017500000000165612653650154032767 0ustar ellertellert -0 ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteElement/echoUnsignedByteElement-UnsignedByteElement04-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteElement/echoUnsignedByteEl0000755000175000017500000000223112653650154032755 0ustar ellertellert 255 ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteElement/echoUnsignedByteElement-UnsignedByteElement04-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteElement/echoUnsignedByteEl0000755000175000017500000000223312653650154032757 0ustar ellertellert 255 ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteElement/echoUnsignedByteElement-UnsignedByteElement03-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteElement/echoUnsignedByteEl0000755000175000017500000000223312653650154032757 0ustar ellertellert +42 ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteElement/echoUnsignedByteElement-UnsignedByteElement02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteElement/echoUnsignedByteEl0000755000175000017500000000223212653650154032756 0ustar ellertellert -0 ././@LongLink0000644000000000000000000000020400000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteElement/echoUnsignedByteElement-UnsignedByteElement03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteElement/echoUnsignedByteEl0000755000175000017500000000165712653650154032770 0ustar ellertellert +42 ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteElement/echoUnsignedByteElement-UnsignedByteElement01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteElement/echoUnsignedByteEl0000755000175000017500000000222712653650154032762 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000020400000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteElement/echoUnsignedByteElement-UnsignedByteElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteElement/echoUnsignedByteEl0000755000175000017500000000165512653650154032766 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteElement/echoUnsignedByteElement-UnsignedByteElement03-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteElement/echoUnsignedByteEl0000755000175000017500000000223112653650154032755 0ustar ellertellert +42 ././@LongLink0000644000000000000000000000020000000000000011573 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteElement/UnsignedByteElement-UnsignedByteElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteElement/UnsignedByteElemen0000755000175000017500000000161612653650154032771 0ustar ellertellert 1././@LongLink0000644000000000000000000000020400000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteElement/echoUnsignedByteElement-UnsignedByteElement04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteElement/echoUnsignedByteEl0000755000175000017500000000165712653650154032770 0ustar ellertellert 255 ././@LongLink0000644000000000000000000000020000000000000011573 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteElement/UnsignedByteElement-UnsignedByteElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteElement/UnsignedByteElemen0000755000175000017500000000161712653650154032772 0ustar ellertellert -0gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TokenEnumerationType/0000755000175000017500000000000012653650152027526 5ustar ellertellert././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TokenEnumerationType/echoTokenEnumerationType-TokenEnumerationType01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TokenEnumerationType/echoTokenEnumerat0000755000175000017500000000223612653650152033077 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TokenEnumerationType/echoTokenEnumerationType-TokenEnumerationType02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TokenEnumerationType/echoTokenEnumerat0000755000175000017500000000223412653650152033075 0ustar ellertellert 2 ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TokenEnumerationType/echoTokenEnumerationType-TokenEnumerationType01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TokenEnumerationType/echoTokenEnumerat0000755000175000017500000000223412653650152033075 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000020700000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TokenEnumerationType/echoTokenEnumerationType-TokenEnumerationType02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TokenEnumerationType/echoTokenEnumerat0000755000175000017500000000166412653650152033103 0ustar ellertellert 2 ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TokenEnumerationType/echoTokenEnumerationType-TokenEnumerationType02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TokenEnumerationType/echoTokenEnumerat0000755000175000017500000000223612653650152033077 0ustar ellertellert 2 ././@LongLink0000644000000000000000000000020700000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TokenEnumerationType/echoTokenEnumerationType-TokenEnumerationType01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TokenEnumerationType/echoTokenEnumerat0000755000175000017500000000166412653650152033103 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000020300000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TokenEnumerationType/TokenEnumerationType-TokenEnumerationType01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TokenEnumerationType/TokenEnumerationT0000755000175000017500000000162412653650152033072 0ustar ellertellert 1././@LongLink0000644000000000000000000000020300000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TokenEnumerationType/TokenEnumerationType-TokenEnumerationType02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TokenEnumerationType/TokenEnumerationT0000755000175000017500000000162412653650152033072 0ustar ellertellert 2gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeChoice/0000755000175000017500000000000012653650150026757 5ustar ellertellert././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeChoice/echoComplexTypeChoice-ComplexTypeChoice01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeChoice/echoComplexTypeChoic0000755000175000017500000000161112653650150032762 0ustar ellertellert 21 ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeChoice/echoComplexTypeChoice-ComplexTypeChoice01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeChoice/echoComplexTypeChoic0000755000175000017500000000223012653650150032760 0ustar ellertellert 21 ././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeChoice/ComplexTypeChoice-ComplexTypeChoice01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeChoice/ComplexTypeChoice-Co0000755000175000017500000000154012653650150032630 0ustar ellertellert 21 ././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeChoice/echoComplexTypeChoice-ComplexTypeChoice02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeChoice/echoComplexTypeChoic0000755000175000017500000000162412653650150032766 0ustar ellertellert Two Hundred ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeChoice/echoComplexTypeChoice-ComplexTypeChoice03-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeChoice/echoComplexTypeChoic0000755000175000017500000000223112653650150032761 0ustar ellertellert 329 ././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeChoice/ComplexTypeChoice-ComplexTypeChoice02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeChoice/ComplexTypeChoice-Co0000755000175000017500000000155312653650150032634 0ustar ellertellert Two Hundred ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeChoice/echoComplexTypeChoice-ComplexTypeChoice01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeChoice/echoComplexTypeChoic0000755000175000017500000000222612653650150032765 0ustar ellertellert 21 ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeChoice/echoComplexTypeChoice-ComplexTypeChoice02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeChoice/echoComplexTypeChoic0000755000175000017500000000224112653650150032762 0ustar ellertellert Two Hundred ././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeChoice/echoComplexTypeChoice-ComplexTypeChoice03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeChoice/echoComplexTypeChoic0000755000175000017500000000161412653650150032765 0ustar ellertellert 329 ././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeChoice/ComplexTypeChoice-ComplexTypeChoice03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeChoice/ComplexTypeChoice-Co0000755000175000017500000000154312653650150032633 0ustar ellertellert 329 ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeChoice/echoComplexTypeChoice-ComplexTypeChoice02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeChoice/echoComplexTypeChoic0000755000175000017500000000224312653650150032764 0ustar ellertellert Two Hundred ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeChoice/echoComplexTypeChoice-ComplexTypeChoice03-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeChoice/echoComplexTypeChoic0000755000175000017500000000223312653650150032763 0ustar ellertellert 329 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/0000755000175000017500000000000012653650152027276 5ustar ellertellert././@LongLink0000644000000000000000000000020000000000000011573 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/GYearMonthAttribute-GYearMonthAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/GYearMonthAttribut0000755000175000017500000000164212653650152032763 0ustar ellertellert ././@LongLink0000644000000000000000000000020000000000000011573 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/GYearMonthAttribute-GYearMonthAttribute05.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/GYearMonthAttribut0000755000175000017500000000165012653650152032762 0ustar ellertellert ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttribute-GYearMonthAttribute05-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttr0000755000175000017500000000227412653650152032740 0ustar ellertellert ././@LongLink0000644000000000000000000000020000000000000011573 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/GYearMonthAttribute-GYearMonthAttribute02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/GYearMonthAttribut0000755000175000017500000000164212653650152032763 0ustar ellertellert ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttribute-GYearMonthAttribute06-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttr0000755000175000017500000000226512653650152032740 0ustar ellertellert ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttribute-GYearMonthAttribute04-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttr0000755000175000017500000000227412653650152032740 0ustar ellertellert ././@LongLink0000644000000000000000000000020400000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttribute-GYearMonthAttribute02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttr0000755000175000017500000000170412653650152032735 0ustar ellertellert ././@LongLink0000644000000000000000000000020400000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttribute-GYearMonthAttribute05.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttr0000755000175000017500000000171212653650152032734 0ustar ellertellert ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttribute-GYearMonthAttribute04-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttr0000755000175000017500000000227212653650152032736 0ustar ellertellert ././@LongLink0000644000000000000000000000020400000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttribute-GYearMonthAttribute06.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttr0000755000175000017500000000170512653650152032736 0ustar ellertellert ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttribute-GYearMonthAttribute03-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttr0000755000175000017500000000226412653650152032737 0ustar ellertellert ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttribute-GYearMonthAttribute05-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttr0000755000175000017500000000227212653650152032736 0ustar ellertellert ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttribute-GYearMonthAttribute02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttr0000755000175000017500000000226612653650152032741 0ustar ellertellert ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttribute-GYearMonthAttribute06-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttr0000755000175000017500000000226712653650152032742 0ustar ellertellert ././@LongLink0000644000000000000000000000020400000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttribute-GYearMonthAttribute03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttr0000755000175000017500000000170412653650152032735 0ustar ellertellert ././@LongLink0000644000000000000000000000020000000000000011573 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/GYearMonthAttribute-GYearMonthAttribute07.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/GYearMonthAttribut0000755000175000017500000000164312653650152032764 0ustar ellertellert ././@LongLink0000644000000000000000000000020400000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttribute-GYearMonthAttribute04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttr0000755000175000017500000000171212653650152032734 0ustar ellertellert ././@LongLink0000644000000000000000000000020000000000000011573 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/GYearMonthAttribute-GYearMonthAttribute03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/GYearMonthAttribut0000755000175000017500000000164212653650152032763 0ustar ellertellert ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttribute-GYearMonthAttribute03-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttr0000755000175000017500000000226612653650152032741 0ustar ellertellert ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttribute-GYearMonthAttribute07-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttr0000755000175000017500000000226512653650152032740 0ustar ellertellert ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttribute-GYearMonthAttribute02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttr0000755000175000017500000000226412653650152032737 0ustar ellertellert ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttribute-GYearMonthAttribute07-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttr0000755000175000017500000000226712653650152032742 0ustar ellertellert ././@LongLink0000644000000000000000000000020000000000000011573 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/GYearMonthAttribute-GYearMonthAttribute04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/GYearMonthAttribut0000755000175000017500000000165012653650152032762 0ustar ellertellert ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttribute-GYearMonthAttribute01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttr0000755000175000017500000000226412653650152032737 0ustar ellertellert ././@LongLink0000644000000000000000000000020400000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttribute-GYearMonthAttribute07.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttr0000755000175000017500000000170512653650152032736 0ustar ellertellert ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttribute-GYearMonthAttribute01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttr0000755000175000017500000000226612653650152032741 0ustar ellertellert ././@LongLink0000644000000000000000000000020000000000000011573 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/GYearMonthAttribute-GYearMonthAttribute06.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/GYearMonthAttribut0000755000175000017500000000164312653650152032764 0ustar ellertellert ././@LongLink0000644000000000000000000000020400000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttribute-GYearMonthAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttr0000755000175000017500000000170412653650152032735 0ustar ellertellert gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursFinite/0000755000175000017500000000000012653650150027551 5ustar ellertellert././@LongLink0000644000000000000000000000020600000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursFinite/ChoiceMaxOccursFinite-ChoiceMaxOccursFinite01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursFinite/ChoiceMaxOccursF0000755000175000017500000000175712653650150032636 0ustar ellertellert first second ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursFinite/echoChoiceMaxOccursFinite-ChoiceMaxOccursFinite03-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursFinite/echoChoiceMaxOcc0000755000175000017500000000232612653650150032626 0ustar ellertellert only ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursFinite/echoChoiceMaxOccursFinite-ChoiceMaxOccursFinite02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursFinite/echoChoiceMaxOcc0000755000175000017500000000240312653650150032622 0ustar ellertellert first second ././@LongLink0000644000000000000000000000020600000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursFinite/ChoiceMaxOccursFinite-ChoiceMaxOccursFinite02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursFinite/ChoiceMaxOccursF0000755000175000017500000000175712653650150032636 0ustar ellertellert first second ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursFinite/echoChoiceMaxOccursFinite-ChoiceMaxOccursFinite01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursFinite/echoChoiceMaxOcc0000755000175000017500000000240312653650150032622 0ustar ellertellert first second ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursFinite/echoChoiceMaxOccursFinite-ChoiceMaxOccursFinite02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursFinite/echoChoiceMaxOcc0000755000175000017500000000240112653650150032620 0ustar ellertellert first second ././@LongLink0000644000000000000000000000021200000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursFinite/echoChoiceMaxOccursFinite-ChoiceMaxOccursFinite03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursFinite/echoChoiceMaxOcc0000755000175000017500000000174712653650150032634 0ustar ellertellert only ././@LongLink0000644000000000000000000000021200000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursFinite/echoChoiceMaxOccursFinite-ChoiceMaxOccursFinite02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursFinite/echoChoiceMaxOcc0000755000175000017500000000202012653650150032615 0ustar ellertellert first second ././@LongLink0000644000000000000000000000021200000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursFinite/echoChoiceMaxOccursFinite-ChoiceMaxOccursFinite01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursFinite/echoChoiceMaxOcc0000755000175000017500000000202012653650150032615 0ustar ellertellert first second ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursFinite/echoChoiceMaxOccursFinite-ChoiceMaxOccursFinite03-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursFinite/echoChoiceMaxOcc0000755000175000017500000000232412653650150032624 0ustar ellertellert only ././@LongLink0000644000000000000000000000020600000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursFinite/ChoiceMaxOccursFinite-ChoiceMaxOccursFinite03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursFinite/ChoiceMaxOccursF0000755000175000017500000000170612653650150032630 0ustar ellertellert only ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursFinite/echoChoiceMaxOccursFinite-ChoiceMaxOccursFinite01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursFinite/echoChoiceMaxOcc0000755000175000017500000000240112653650150032620 0ustar ellertellert first second gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PrecisionDecimal/0000755000175000017500000000000012653650152026607 5ustar ellertellert././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PrecisionDecimal/echoPrecisionDecimal-PrecisionDecimal02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PrecisionDecimal/echoPrecisionDecimal-0000755000175000017500000000221212653650152032660 0ustar ellertellert NaN ././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PrecisionDecimal/echoPrecisionDecimal-PrecisionDecimal02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PrecisionDecimal/echoPrecisionDecimal-0000755000175000017500000000163212653650152032665 0ustar ellertellert NaN ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PrecisionDecimal/PrecisionDecimal-PrecisionDecimal03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PrecisionDecimal/PrecisionDecimal-Prec0000755000175000017500000000157712653650152032650 0ustar ellertellert -INF././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PrecisionDecimal/PrecisionDecimal-PrecisionDecimal02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PrecisionDecimal/PrecisionDecimal-Prec0000755000175000017500000000157612653650152032647 0ustar ellertellert NaN././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PrecisionDecimal/echoPrecisionDecimal-PrecisionDecimal03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PrecisionDecimal/echoPrecisionDecimal-0000755000175000017500000000163312653650152032666 0ustar ellertellert -INF ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PrecisionDecimal/echoPrecisionDecimal-PrecisionDecimal02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PrecisionDecimal/echoPrecisionDecimal-0000755000175000017500000000221412653650152032662 0ustar ellertellert NaN ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PrecisionDecimal/echoPrecisionDecimal-PrecisionDecimal03-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PrecisionDecimal/echoPrecisionDecimal-0000755000175000017500000000221512653650152032663 0ustar ellertellert -INF ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PrecisionDecimal/echoPrecisionDecimal-PrecisionDecimal03-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PrecisionDecimal/echoPrecisionDecimal-0000755000175000017500000000221312653650152032661 0ustar ellertellert -INF ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PrecisionDecimal/PrecisionDecimal-PrecisionDecimal01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PrecisionDecimal/PrecisionDecimal-Prec0000755000175000017500000000160212653650152032635 0ustar ellertellert 1000.20././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PrecisionDecimal/echoPrecisionDecimal-PrecisionDecimal01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PrecisionDecimal/echoPrecisionDecimal-0000755000175000017500000000163612653650152032671 0ustar ellertellert 1000.20 ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PrecisionDecimal/echoPrecisionDecimal-PrecisionDecimal01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PrecisionDecimal/echoPrecisionDecimal-0000755000175000017500000000222012653650152032657 0ustar ellertellert 1000.20 ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PrecisionDecimal/echoPrecisionDecimal-PrecisionDecimal01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PrecisionDecimal/echoPrecisionDecimal-0000755000175000017500000000221612653650152032664 0ustar ellertellert 1000.20 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IDREFSElement/0000755000175000017500000000000012653650152025663 5ustar ellertellert././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IDREFSElement/echoIDREFSElement-IDREFSElement01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IDREFSElement/echoIDREFSElement-IDREFS0000755000175000017500000000217512653650152031715 0ustar ellertellert foo ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IDREFSElement/echoIDREFSElement-IDREFSElement01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IDREFSElement/echoIDREFSElement-IDREFS0000755000175000017500000000217312653650152031713 0ustar ellertellert foo ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IDREFSElement/echoIDREFSElement-IDREFSElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IDREFSElement/echoIDREFSElement-IDREFS0000755000175000017500000000160512653650152031712 0ustar ellertellert foo ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IDREFSElement/IDREFSElement-IDREFSElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IDREFSElement/IDREFSElement-IDREFSElem0000755000175000017500000000155412653650152031661 0ustar ellertellert foogsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MinOccurs1/0000755000175000017500000000000012653650152025360 5ustar ellertellert././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MinOccurs1/echoMinOccurs1-MinOccurs02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MinOccurs1/echoMinOccurs1-MinOccurs02.0000755000175000017500000000166212653650152032255 0ustar ellertellert 4 8 ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MinOccurs1/echoMinOccurs1-MinOccurs02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MinOccurs1/echoMinOccurs1-MinOccurs02-0000755000175000017500000000227112653650152032251 0ustar ellertellert 4 8 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MinOccurs1/MinOccurs1-MinOccurs02.xml0000755000175000017500000000163412653650152032136 0ustar ellertellert 4 8 ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MinOccurs1/echoMinOccurs1-MinOccurs01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MinOccurs1/echoMinOccurs1-MinOccurs01.0000755000175000017500000000162412653650152032252 0ustar ellertellert 44 ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MinOccurs1/echoMinOccurs1-MinOccurs02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MinOccurs1/echoMinOccurs1-MinOccurs02-0000755000175000017500000000227312653650152032253 0ustar ellertellert 4 8 ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MinOccurs1/echoMinOccurs1-MinOccurs01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MinOccurs1/echoMinOccurs1-MinOccurs01-0000755000175000017500000000223112653650152032244 0ustar ellertellert 44 ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MinOccurs1/echoMinOccurs1-MinOccurs01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MinOccurs1/echoMinOccurs1-MinOccurs01-0000755000175000017500000000222712653650152032251 0ustar ellertellert 44 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MinOccurs1/MinOccurs1-MinOccurs01.xml0000755000175000017500000000157612653650152032142 0ustar ellertellert 44 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntEnumerationType/0000755000175000017500000000000012653650152027200 5ustar ellertellert././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntEnumerationType/echoIntEnumerationType-IntEnumerationType01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntEnumerationType/echoIntEnumerationT0000755000175000017500000000222412653650152033052 0ustar ellertellert 2 ././@LongLink0000644000000000000000000000017500000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntEnumerationType/IntEnumerationType-IntEnumerationType01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntEnumerationType/IntEnumerationType-0000755000175000017500000000161012653650152033004 0ustar ellertellert 2././@LongLink0000644000000000000000000000020100000000000011574 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntEnumerationType/echoIntEnumerationType-IntEnumerationType01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntEnumerationType/echoIntEnumerationT0000755000175000017500000000164612653650152033061 0ustar ellertellert 2 ././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntEnumerationType/echoIntEnumerationType-IntEnumerationType01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntEnumerationType/echoIntEnumerationT0000755000175000017500000000222212653650152033050 0ustar ellertellert 2 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NotNillableElement/0000755000175000017500000000000012653650152027112 5ustar ellertellert././@LongLink0000644000000000000000000000020100000000000011574 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NotNillableElement/echoNotNillableElement-NotNillableElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NotNillableElement/echoNotNillableElem0000755000175000017500000000175112653650152032711 0ustar ellertellert Stuff ././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NotNillableElement/echoNotNillableElement-NotNillableElement01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NotNillableElement/echoNotNillableElem0000755000175000017500000000233412653650152032707 0ustar ellertellert Stuff ././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NotNillableElement/echoNotNillableElement-NotNillableElement01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NotNillableElement/echoNotNillableElem0000755000175000017500000000233612653650152032711 0ustar ellertellert Stuff ././@LongLink0000644000000000000000000000017500000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NotNillableElement/NotNillableElement-NotNillableElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NotNillableElement/NotNillableElement-0000755000175000017500000000171312653650152032634 0ustar ellertellert Stuff gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LanguageEnumerationType/0000755000175000017500000000000012653650152030171 5ustar ellertellert././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LanguageEnumerationType/echoLanguageEnumerationType-LanguageEnumerationType01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LanguageEnumerationType/echoLanguageEn0000755000175000017500000000225612653650152032771 0ustar ellertellert en ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LanguageEnumerationType/echoLanguageEnumerationType-LanguageEnumerationType02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LanguageEnumerationType/echoLanguageEn0000755000175000017500000000225612653650152032771 0ustar ellertellert it ././@LongLink0000644000000000000000000000021400000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LanguageEnumerationType/LanguageEnumerationType-LanguageEnumerationType02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LanguageEnumerationType/LanguageEnumer0000755000175000017500000000164712653650152033026 0ustar ellertellert it././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LanguageEnumerationType/echoLanguageEnumerationType-LanguageEnumerationType01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LanguageEnumerationType/echoLanguageEn0000755000175000017500000000225412653650152032767 0ustar ellertellert en ././@LongLink0000644000000000000000000000022000000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LanguageEnumerationType/echoLanguageEnumerationType-LanguageEnumerationType02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LanguageEnumerationType/echoLanguageEn0000755000175000017500000000171212653650152032765 0ustar ellertellert it ././@LongLink0000644000000000000000000000022000000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LanguageEnumerationType/echoLanguageEnumerationType-LanguageEnumerationType01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LanguageEnumerationType/echoLanguageEn0000755000175000017500000000171212653650152032765 0ustar ellertellert en ././@LongLink0000644000000000000000000000021400000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LanguageEnumerationType/LanguageEnumerationType-LanguageEnumerationType01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LanguageEnumerationType/LanguageEnumer0000755000175000017500000000164712653650152033026 0ustar ellertellert en././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LanguageEnumerationType/echoLanguageEnumerationType-LanguageEnumerationType02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LanguageEnumerationType/echoLanguageEn0000755000175000017500000000225412653650152032767 0ustar ellertellert it gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENAttribute/0000755000175000017500000000000012653650152026374 5ustar ellertellert././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENAttribute/echoNMTOKENAttribute-NMTOKENAttribute01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENAttribute/echoNMTOKENAttribute-0000755000175000017500000000223512653650152032237 0ustar ellertellert ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENAttribute/echoNMTOKENAttribute-NMTOKENAttribute01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENAttribute/echoNMTOKENAttribute-0000755000175000017500000000223712653650152032241 0ustar ellertellert ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENAttribute/NMTOKENAttribute-NMTOKENAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENAttribute/NMTOKENAttribute-NMTO0000755000175000017500000000161012653650152032072 0ustar ellertellert ././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENAttribute/echoNMTOKENAttribute-NMTOKENAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENAttribute/echoNMTOKENAttribute-0000755000175000017500000000164712653650152032245 0ustar ellertellert gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthElement/0000755000175000017500000000000012653650152026103 5ustar ellertellert././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthElement/echoGMonthElement-GMonthElement04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthElement/echoGMonthElement-GMonth0000755000175000017500000000160712653650152032574 0ustar ellertellert --12Z ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthElement/echoGMonthElement-GMonthElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthElement/echoGMonthElement-GMonth0000755000175000017500000000161412653650152032572 0ustar ellertellert --12-01:33 ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthElement/echoGMonthElement-GMonthElement01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthElement/echoGMonthElement-GMonth0000755000175000017500000000217412653650152032574 0ustar ellertellert --02 ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthElement/GMonthElement-GMonthElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthElement/GMonthElement-GMonthElem0000755000175000017500000000155512653650152032542 0ustar ellertellert --02././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthElement/echoGMonthElement-GMonthElement02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthElement/echoGMonthElement-GMonth0000755000175000017500000000220212653650152032564 0ustar ellertellert --12-01:33 ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthElement/GMonthElement-GMonthElement04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthElement/GMonthElement-GMonthElem0000755000175000017500000000155612653650152032543 0ustar ellertellert --12Z././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthElement/echoGMonthElement-GMonthElement04-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthElement/echoGMonthElement-GMonth0000755000175000017500000000217512653650152032575 0ustar ellertellert --12Z ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthElement/echoGMonthElement-GMonthElement01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthElement/echoGMonthElement-GMonth0000755000175000017500000000217612653650152032576 0ustar ellertellert --02 ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthElement/echoGMonthElement-GMonthElement03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthElement/echoGMonthElement-GMonth0000755000175000017500000000161412653650152032572 0ustar ellertellert --12+01:02 ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthElement/GMonthElement-GMonthElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthElement/GMonthElement-GMonthElem0000755000175000017500000000156312653650152032541 0ustar ellertellert --12-01:33././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthElement/echoGMonthElement-GMonthElement03-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthElement/echoGMonthElement-GMonth0000755000175000017500000000220212653650152032564 0ustar ellertellert --12+01:02 ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthElement/echoGMonthElement-GMonthElement04-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthElement/echoGMonthElement-GMonth0000755000175000017500000000217712653650152032577 0ustar ellertellert --12Z ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthElement/GMonthElement-GMonthElement03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthElement/GMonthElement-GMonthElem0000755000175000017500000000156312653650152032541 0ustar ellertellert --12+01:02././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthElement/echoGMonthElement-GMonthElement02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthElement/echoGMonthElement-GMonth0000755000175000017500000000220412653650152032566 0ustar ellertellert --12-01:33 ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthElement/echoGMonthElement-GMonthElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthElement/echoGMonthElement-GMonth0000755000175000017500000000160612653650152032573 0ustar ellertellert --02 ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthElement/echoGMonthElement-GMonthElement03-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthElement/echoGMonthElement-GMonth0000755000175000017500000000220412653650152032566 0ustar ellertellert --12+01:02 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/Unique/0000755000175000017500000000000012653650154024645 5ustar ellertellertgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/Unique/echoUnique-Unique01-soap12.xml0000755000175000017500000000234612653650154032214 0ustar ellertellert String String gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/Unique/echoUnique-Unique01.xml0000755000175000017500000000171512653650154031110 0ustar ellertellert String String gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/Unique/echoUnique-Unique01-soap11.xml0000755000175000017500000000235012653650154032206 0ustar ellertellert String String gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/Unique/Unique-Unique01.xml0000755000175000017500000000167312653650154030254 0ustar ellertellert String String gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDayElement/0000755000175000017500000000000012653650152025533 5ustar ellertellert././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDayElement/echoGDayElement-GDayElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDayElement/echoGDayElement-GDayElemen0000755000175000017500000000157112653650152032432 0ustar ellertellert ---05 ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDayElement/echoGDayElement-GDayElement01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDayElement/echoGDayElement-GDayElemen0000755000175000017500000000216512653650152032432 0ustar ellertellert ---05 ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDayElement/GDayElement-GDayElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDayElement/GDayElement-GDayElement01.0000755000175000017500000000154212653650152032174 0ustar ellertellert ---05././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDayElement/echoGDayElement-GDayElement03-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDayElement/echoGDayElement-GDayElemen0000755000175000017500000000217312653650152032431 0ustar ellertellert ---31-12:00 ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDayElement/echoGDayElement-GDayElement03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDayElement/echoGDayElement-GDayElemen0000755000175000017500000000157712653650152032440 0ustar ellertellert ---31-12:00 ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDayElement/GDayElement-GDayElement03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDayElement/GDayElement-GDayElement03.0000755000175000017500000000155012653650152032175 0ustar ellertellert ---31-12:00././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDayElement/echoGDayElement-GDayElement04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDayElement/echoGDayElement-GDayElemen0000755000175000017500000000157712653650152032440 0ustar ellertellert ---05+01:00 ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDayElement/echoGDayElement-GDayElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDayElement/echoGDayElement-GDayElemen0000755000175000017500000000157212653650152032433 0ustar ellertellert ---12Z ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDayElement/echoGDayElement-GDayElement02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDayElement/echoGDayElement-GDayElemen0000755000175000017500000000216412653650152032431 0ustar ellertellert ---12Z ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDayElement/GDayElement-GDayElement04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDayElement/GDayElement-GDayElement04.0000755000175000017500000000155012653650152032176 0ustar ellertellert ---05+01:00././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDayElement/echoGDayElement-GDayElement04-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDayElement/echoGDayElement-GDayElemen0000755000175000017500000000217312653650152032431 0ustar ellertellert ---05+01:00 ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDayElement/echoGDayElement-GDayElement03-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDayElement/echoGDayElement-GDayElemen0000755000175000017500000000217112653650152032427 0ustar ellertellert ---31-12:00 ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDayElement/echoGDayElement-GDayElement04-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDayElement/echoGDayElement-GDayElemen0000755000175000017500000000217112653650152032427 0ustar ellertellert ---05+01:00 ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDayElement/echoGDayElement-GDayElement01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDayElement/echoGDayElement-GDayElemen0000755000175000017500000000216312653650152032430 0ustar ellertellert ---05 ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDayElement/GDayElement-GDayElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDayElement/GDayElement-GDayElement02.0000755000175000017500000000154312653650152032176 0ustar ellertellert ---12Z././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDayElement/echoGDayElement-GDayElement02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GDayElement/echoGDayElement-GDayElemen0000755000175000017500000000216612653650152032433 0ustar ellertellert ---12Z gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NestedSequenceElementList/0000755000175000017500000000000012653650152030456 5ustar ellertellert././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NestedSequenceElementList/echoNestedSequenceElementList-NestedSequenceElementList01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NestedSequenceElementList/echoNestedSe0000755000175000017500000000325612653650152032763 0ustar ellertellert item onexone item onextwo item onexthree item onexfour item twoxone item twoxtwo item twoxthree item twoxfour ././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NestedSequenceElementList/echoNestedSequenceElementList-NestedSequenceElementList01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NestedSequenceElementList/echoNestedSe0000755000175000017500000000326012653650152032756 0ustar ellertellert item onexone item onextwo item onexthree item onexfour item twoxone item twoxtwo item twoxthree item twoxfour ././@LongLink0000644000000000000000000000022600000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NestedSequenceElementList/echoNestedSequenceElementList-NestedSequenceElementList01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NestedSequenceElementList/echoNestedSe0000755000175000017500000000262512653650152032762 0ustar ellertellert item onexone item onextwo item onexthree item onexfour item twoxone item twoxtwo item twoxthree item twoxfour ././@LongLink0000644000000000000000000000022200000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NestedSequenceElementList/NestedSequenceElementList-NestedSequenceElementList01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NestedSequenceElementList/NestedSequen0000755000175000017500000000256012653650152033012 0ustar ellertellert item onexone item onextwo item onexthree item onexfour item twoxone item twoxtwo item twoxthree item twoxfour gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs2MaxOccurs2/0000755000175000017500000000000012653650152030602 5ustar ellertellert././@LongLink0000644000000000000000000000024300000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs2MaxOccurs2/echoElementMinOccurs2MaxOccurs2-ElementMinOccurs2MaxOccurs201-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs2MaxOccurs2/echoElemen0000755000175000017500000000236512653650152032602 0ustar ellertellert Red Yellow ././@LongLink0000644000000000000000000000023400000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs2MaxOccurs2/echoElementMinOccurs2MaxOccurs2-ElementMinOccurs2MaxOccurs201.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs2MaxOccurs2/echoElemen0000755000175000017500000000176012653650152032600 0ustar ellertellert Red Yellow ././@LongLink0000644000000000000000000000024300000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs2MaxOccurs2/echoElementMinOccurs2MaxOccurs2-ElementMinOccurs2MaxOccurs201-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs2MaxOccurs2/echoElemen0000755000175000017500000000236712653650152032604 0ustar ellertellert Red Yellow ././@LongLink0000644000000000000000000000023000000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs2MaxOccurs2/ElementMinOccurs2MaxOccurs2-ElementMinOccurs2MaxOccurs201.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs2MaxOccurs2/ElementMin0000755000175000017500000000167112653650152032572 0ustar ellertellert Red Yellow gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerEnumerationType/0000755000175000017500000000000012653650152030043 5ustar ellertellert././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerEnumerationType/echoIntegerEnumerationType-IntegerEnumerationType01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerEnumerationType/echoIntegerEnum0000755000175000017500000000225612653650152033057 0ustar ellertellert 4000000 ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerEnumerationType/echoIntegerEnumerationType-IntegerEnumerationType01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerEnumerationType/echoIntegerEnum0000755000175000017500000000225412653650152033055 0ustar ellertellert 4000000 ././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerEnumerationType/IntegerEnumerationType-IntegerEnumerationType01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerEnumerationType/IntegerEnumerat0000755000175000017500000000164612653650152033076 0ustar ellertellert 4000000././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerEnumerationType/echoIntegerEnumerationType-IntegerEnumerationType01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerEnumerationType/echoIntegerEnum0000755000175000017500000000171012653650152033051 0ustar ellertellert 4000000 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalAttribute/0000755000175000017500000000000012653650152026461 5ustar ellertellert././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalAttribute/GlobalAttribute-GlobalAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalAttribute/GlobalAttribute-Global0000755000175000017500000000177312653650152032701 0ustar ellertellert another string ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalAttribute/echoGlobalAttribute-GlobalAttribute01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalAttribute/echoGlobalAttribute-Gl0000755000175000017500000000243012653650152032671 0ustar ellertellert another string ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalAttribute/echoGlobalAttribute-GlobalAttribute01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalAttribute/echoGlobalAttribute-Gl0000755000175000017500000000243212653650152032673 0ustar ellertellert another string ././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalAttribute/echoGlobalAttribute-GlobalAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalAttribute/echoGlobalAttribute-Gl0000755000175000017500000000203112653650152032666 0ustar ellertellert another string gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/0000755000175000017500000000000012653650152026724 5ustar ellertellert././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/GYearMonthElement-GYearMonthElement06.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/GYearMonthElement-GY0000755000175000017500000000161112653650152032515 0ustar ellertellert 2007-05Z././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/GYearMonthElement-GYearMonthElement05.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/GYearMonthElement-GY0000755000175000017500000000161612653650152032522 0ustar ellertellert 2007-05-01:00././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/GYearMonthElement-GYearMonthElement04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/GYearMonthElement-GY0000755000175000017500000000161612653650152032522 0ustar ellertellert 2007-05+01:00././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/GYearMonthElement-GYearMonthElement03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/GYearMonthElement-GY0000755000175000017500000000161012653650152032514 0ustar ellertellert 2038-02././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/GYearMonthElement-GYearMonthElement07.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/GYearMonthElement-GY0000755000175000017500000000161112653650152032515 0ustar ellertellert 10739-05././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElement-GYearMonthElement04-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElemen0000755000175000017500000000223312653650152032654 0ustar ellertellert 2007-05+01:00 ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElement-GYearMonthElement04-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElemen0000755000175000017500000000223112653650152032652 0ustar ellertellert 2007-05+01:00 ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElement-GYearMonthElement01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElemen0000755000175000017500000000222512653650152032655 0ustar ellertellert 1999-05 ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElement-GYearMonthElement02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElemen0000755000175000017500000000222312653650152032653 0ustar ellertellert 0739-05 ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElement-GYearMonthElement07-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElemen0000755000175000017500000000222612653650152032656 0ustar ellertellert 10739-05 ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElement-GYearMonthElement07-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElemen0000755000175000017500000000222412653650152032654 0ustar ellertellert 10739-05 ././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElement-GYearMonthElement03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElemen0000755000175000017500000000164512653650152032662 0ustar ellertellert 2038-02 ././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/GYearMonthElement-GYearMonthElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/GYearMonthElement-GY0000755000175000017500000000161012653650152032514 0ustar ellertellert 0739-05././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/GYearMonthElement-GYearMonthElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/GYearMonthElement-GY0000755000175000017500000000161012653650152032514 0ustar ellertellert 1999-05././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElement-GYearMonthElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElemen0000755000175000017500000000164512653650152032662 0ustar ellertellert 1999-05 ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElement-GYearMonthElement02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElemen0000755000175000017500000000222512653650152032655 0ustar ellertellert 0739-05 ././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElement-GYearMonthElement04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElemen0000755000175000017500000000165312653650152032661 0ustar ellertellert 2007-05+01:00 ././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElement-GYearMonthElement05.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElemen0000755000175000017500000000165312653650152032661 0ustar ellertellert 2007-05-01:00 ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElement-GYearMonthElement05-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElemen0000755000175000017500000000223312653650152032654 0ustar ellertellert 2007-05-01:00 ././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElement-GYearMonthElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElemen0000755000175000017500000000164512653650152032662 0ustar ellertellert 0739-05 ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElement-GYearMonthElement01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElemen0000755000175000017500000000222312653650152032653 0ustar ellertellert 1999-05 ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElement-GYearMonthElement06-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElemen0000755000175000017500000000222612653650152032656 0ustar ellertellert 2007-05Z ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElement-GYearMonthElement03-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElemen0000755000175000017500000000222512653650152032655 0ustar ellertellert 2038-02 ././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElement-GYearMonthElement06.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElemen0000755000175000017500000000164612653650152032663 0ustar ellertellert 2007-05Z ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElement-GYearMonthElement03-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElemen0000755000175000017500000000222312653650152032653 0ustar ellertellert 2038-02 ././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElement-GYearMonthElement07.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElemen0000755000175000017500000000164612653650152032663 0ustar ellertellert 10739-05 ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElement-GYearMonthElement05-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElemen0000755000175000017500000000223112653650152032652 0ustar ellertellert 2007-05-01:00 ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElement-GYearMonthElement06-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElemen0000755000175000017500000000222412653650152032654 0ustar ellertellert 2007-05Z gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NCNameElement/0000755000175000017500000000000012653650152026010 5ustar ellertellert././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NCNameElement/echoNCNameElement-NCNameElement01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NCNameElement/echoNCNameElement-NCName0000755000175000017500000000217312653650152032312 0ustar ellertellert foo ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NCNameElement/NCNameElement-NCNameElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NCNameElement/NCNameElement-NCNameElem0000755000175000017500000000155412653650152032260 0ustar ellertellert foo././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NCNameElement/echoNCNameElement-NCNameElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NCNameElement/echoNCNameElement-NCName0000755000175000017500000000160512653650152032311 0ustar ellertellert foo ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NCNameElement/echoNCNameElement-NCNameElement01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NCNameElement/echoNCNameElement-NCName0000755000175000017500000000217512653650152032314 0ustar ellertellert foo gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSimpleType/0000755000175000017500000000000012653650152027151 5ustar ellertellert././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSimpleType/echoExtendedSimpleType-ExtendedSimpleType01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSimpleType/echoExtendedSimpleT0000755000175000017500000000222612653650152032776 0ustar ellertellert hello ././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSimpleType/echoExtendedSimpleType-ExtendedSimpleType01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSimpleType/echoExtendedSimpleT0000755000175000017500000000223012653650152032771 0ustar ellertellert hello ././@LongLink0000644000000000000000000000017500000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSimpleType/ExtendedSimpleType-ExtendedSimpleType01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSimpleType/ExtendedSimpleType-0000755000175000017500000000161412653650152032732 0ustar ellertellert hello././@LongLink0000644000000000000000000000020100000000000011574 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSimpleType/echoExtendedSimpleType-ExtendedSimpleType01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSimpleType/echoExtendedSimpleT0000755000175000017500000000165212653650152033000 0ustar ellertellert hello gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnionDateString/0000755000175000017500000000000012653650154026454 5ustar ellertellert././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnionDateString/UnionDateString-UnionDateString02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnionDateString/UnionDateString-UnionD0000755000175000017500000000157712653650154032663 0ustar ellertellert 2006-06-06././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnionDateString/echoUnionDateString-UnionDateString01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnionDateString/echoUnionDateString-Un0000755000175000017500000000221312653650154032674 0ustar ellertellert Tonight ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnionDateString/echoUnionDateString-UnionDateString01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnionDateString/echoUnionDateString-Un0000755000175000017500000000221112653650154032672 0ustar ellertellert Tonight ././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnionDateString/UnionDateString-UnionDateString01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnionDateString/UnionDateString-UnionD0000755000175000017500000000157412653650154032660 0ustar ellertellert Tonight././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnionDateString/echoUnionDateString-UnionDateString02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnionDateString/echoUnionDateString-Un0000755000175000017500000000221612653650154032677 0ustar ellertellert 2006-06-06 ././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnionDateString/echoUnionDateString-UnionDateString02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnionDateString/echoUnionDateString-Un0000755000175000017500000000163212653650154032700 0ustar ellertellert 2006-06-06 ././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnionDateString/echoUnionDateString-UnionDateString01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnionDateString/echoUnionDateString-Un0000755000175000017500000000162712653650154032704 0ustar ellertellert Tonight ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnionDateString/echoUnionDateString-UnionDateString02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnionDateString/echoUnionDateString-Un0000755000175000017500000000221412653650154032675 0ustar ellertellert 2006-06-06 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerEnumerationType/0000755000175000017500000000000012653650152032201 5ustar ellertellert././@LongLink0000644000000000000000000000026500000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerEnumerationType/echoNonNegativeIntegerEnumerationType-NonNegativeIntegerEnumerationType01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerEnumerationType/echo0000755000175000017500000000233612653650152033051 0ustar ellertellert 12 ././@LongLink0000644000000000000000000000025200000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerEnumerationType/NonNegativeIntegerEnumerationType-NonNegativeIntegerEnumerationType01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerEnumerationType/NonN0000755000175000017500000000174312653650152033004 0ustar ellertellert 12././@LongLink0000644000000000000000000000026500000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerEnumerationType/echoNonNegativeIntegerEnumerationType-NonNegativeIntegerEnumerationType01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerEnumerationType/echo0000755000175000017500000000234012653650152033044 0ustar ellertellert 12 ././@LongLink0000644000000000000000000000025600000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerEnumerationType/echoNonNegativeIntegerEnumerationType-NonNegativeIntegerEnumerationType01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerEnumerationType/echo0000755000175000017500000000202012653650152033037 0ustar ellertellert 12 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MaxOccurs1/0000755000175000017500000000000012653650152025362 5ustar ellertellert././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MaxOccurs1/echoMaxOccurs1-MaxOccurs01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MaxOccurs1/echoMaxOccurs1-MaxOccurs01.0000755000175000017500000000162412653650152032260 0ustar ellertellert 44 ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MaxOccurs1/echoMaxOccurs1-MaxOccurs01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MaxOccurs1/echoMaxOccurs1-MaxOccurs01-0000755000175000017500000000223112653650152032252 0ustar ellertellert 44 ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MaxOccurs1/echoMaxOccurs1-MaxOccurs02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MaxOccurs1/echoMaxOccurs1-MaxOccurs02.0000755000175000017500000000162312653650152032260 0ustar ellertellert 4 ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MaxOccurs1/echoMaxOccurs1-MaxOccurs02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MaxOccurs1/echoMaxOccurs1-MaxOccurs02-0000755000175000017500000000223012653650152032252 0ustar ellertellert 4 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MaxOccurs1/MaxOccurs1-MaxOccurs02.xml0000755000175000017500000000157512653650152032150 0ustar ellertellert 4 ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MaxOccurs1/echoMaxOccurs1-MaxOccurs02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MaxOccurs1/echoMaxOccurs1-MaxOccurs02-0000755000175000017500000000222612653650152032257 0ustar ellertellert 4 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MaxOccurs1/MaxOccurs1-MaxOccurs01.xml0000755000175000017500000000157612653650152032150 0ustar ellertellert 44 ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MaxOccurs1/echoMaxOccurs1-MaxOccurs01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MaxOccurs1/echoMaxOccurs1-MaxOccurs01-0000755000175000017500000000222712653650152032257 0ustar ellertellert 44 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortAttribute/0000755000175000017500000000000012653650152026360 5ustar ellertellert././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortAttribute/echoShortAttribute-ShortAttribute04-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortAttribute/echoShortAttribute-Shor0000755000175000017500000000222712653650152033044 0ustar ellertellert ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortAttribute/echoShortAttribute-ShortAttribute03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortAttribute/echoShortAttribute-Shor0000755000175000017500000000163212653650152033043 0ustar ellertellert ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortAttribute/echoShortAttribute-ShortAttribute02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortAttribute/echoShortAttribute-Shor0000755000175000017500000000163012653650152033041 0ustar ellertellert ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortAttribute/echoShortAttribute-ShortAttribute04-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortAttribute/echoShortAttribute-Shor0000755000175000017500000000222512653650152033042 0ustar ellertellert ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortAttribute/ShortAttribute-ShortAttribute04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortAttribute/ShortAttribute-ShortAtt0000755000175000017500000000157612653650152033050 0ustar ellertellert ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortAttribute/echoShortAttribute-ShortAttribute02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortAttribute/echoShortAttribute-Shor0000755000175000017500000000222412653650152033041 0ustar ellertellert ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortAttribute/echoShortAttribute-ShortAttribute04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortAttribute/echoShortAttribute-Shor0000755000175000017500000000163312653650152033044 0ustar ellertellert ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortAttribute/echoShortAttribute-ShortAttribute02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortAttribute/echoShortAttribute-Shor0000755000175000017500000000222212653650152033037 0ustar ellertellert ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortAttribute/echoShortAttribute-ShortAttribute03-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortAttribute/echoShortAttribute-Shor0000755000175000017500000000222612653650152033043 0ustar ellertellert ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortAttribute/echoShortAttribute-ShortAttribute01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortAttribute/echoShortAttribute-Shor0000755000175000017500000000222312653650152033040 0ustar ellertellert ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortAttribute/echoShortAttribute-ShortAttribute01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortAttribute/echoShortAttribute-Shor0000755000175000017500000000222112653650152033036 0ustar ellertellert ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortAttribute/echoShortAttribute-ShortAttribute03-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortAttribute/echoShortAttribute-Shor0000755000175000017500000000222412653650152033041 0ustar ellertellert ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortAttribute/ShortAttribute-ShortAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortAttribute/ShortAttribute-ShortAtt0000755000175000017500000000157212653650152033044 0ustar ellertellert ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortAttribute/echoShortAttribute-ShortAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortAttribute/echoShortAttribute-Shor0000755000175000017500000000162712653650152033047 0ustar ellertellert ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortAttribute/ShortAttribute-ShortAttribute03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortAttribute/ShortAttribute-ShortAtt0000755000175000017500000000157512653650152033047 0ustar ellertellert ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortAttribute/ShortAttribute-ShortAttribute02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortAttribute/ShortAttribute-ShortAtt0000755000175000017500000000157312653650152033045 0ustar ellertellert gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccursFinite/0000755000175000017500000000000012653650152030127 5ustar ellertellert././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccursFinite/echoSequenceMinOccursFinite-SequenceMinOccursFinite01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccursFinite/echoSequenceMi0000755000175000017500000000313012653650152032747 0ustar ellertellert Red Bright Black Bright White Low Yellow Normal ././@LongLink0000644000000000000000000000022000000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccursFinite/echoSequenceMinOccursFinite-SequenceMinOccursFinite02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccursFinite/echoSequenceMi0000755000175000017500000000215712653650152032757 0ustar ellertellert Black Normal White Bright ././@LongLink0000644000000000000000000000022000000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccursFinite/echoSequenceMinOccursFinite-SequenceMinOccursFinite01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccursFinite/echoSequenceMi0000755000175000017500000000247512653650152032762 0ustar ellertellert Red Bright Black Bright White Low Yellow Normal ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccursFinite/echoSequenceMinOccursFinite-SequenceMinOccursFinite01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccursFinite/echoSequenceMi0000755000175000017500000000312612653650152032754 0ustar ellertellert Red Bright Black Bright White Low Yellow Normal ././@LongLink0000644000000000000000000000021400000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccursFinite/SequenceMinOccursFinite-SequenceMinOccursFinite01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccursFinite/SequenceMinOcc0000755000175000017500000000242012653650152032714 0ustar ellertellert Red Bright Black Bright White Low Yellow Normal ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccursFinite/echoSequenceMinOccursFinite-SequenceMinOccursFinite02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccursFinite/echoSequenceMi0000755000175000017500000000257012653650152032756 0ustar ellertellert Black Normal White Bright ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccursFinite/echoSequenceMinOccursFinite-SequenceMinOccursFinite02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccursFinite/echoSequenceMi0000755000175000017500000000257212653650152032760 0ustar ellertellert Black Normal White Bright ././@LongLink0000644000000000000000000000021400000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccursFinite/SequenceMinOccursFinite-SequenceMinOccursFinite02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccursFinite/SequenceMinOcc0000755000175000017500000000210212653650152032711 0ustar ellertellert Black Normal White Bright gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MixedContentType/0000755000175000017500000000000012653650152026640 5ustar ellertellert././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MixedContentType/echoMixedContentType-MixedContentType03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MixedContentType/echoMixedContentType-0000755000175000017500000000201612653650152032744 0ustar ellertellert Tagged Value mixed text value Tagged Value mixed text value ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MixedContentType/echoMixedContentType-MixedContentType01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MixedContentType/echoMixedContentType-0000755000175000017500000000235512653650152032752 0ustar ellertellert Tagged Value mixed value Tagged Value ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MixedContentType/echoMixedContentType-MixedContentType02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MixedContentType/echoMixedContentType-0000755000175000017500000000236312653650152032751 0ustar ellertellert some text Tagged Value more text Tagged Value ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MixedContentType/MixedContentType-MixedContentType02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MixedContentType/MixedContentType-Mixe0000755000175000017500000000174412653650152032737 0ustar ellertellert some text Tagged Value more text Tagged Value ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MixedContentType/echoMixedContentType-MixedContentType01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MixedContentType/echoMixedContentType-0000755000175000017500000000235712653650152032754 0ustar ellertellert Tagged Value mixed value Tagged Value ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MixedContentType/echoMixedContentType-MixedContentType04-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MixedContentType/echoMixedContentType-0000755000175000017500000000241312653650152032745 0ustar ellertellert text mixed value Tagged Value Tagged Value some more text in a mixed value ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MixedContentType/echoMixedContentType-MixedContentType04-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MixedContentType/echoMixedContentType-0000755000175000017500000000241112653650152032743 0ustar ellertellert text mixed value Tagged Value Tagged Value some more text in a mixed value ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MixedContentType/MixedContentType-MixedContentType03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MixedContentType/MixedContentType-Mixe0000755000175000017500000000176212653650152032737 0ustar ellertellert Tagged Value mixed text value Tagged Value mixed text value ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MixedContentType/MixedContentType-MixedContentType04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MixedContentType/MixedContentType-Mixe0000755000175000017500000000177112653650152032737 0ustar ellertellert text mixed value Tagged Value Tagged Value some more text in a mixed value ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MixedContentType/echoMixedContentType-MixedContentType02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MixedContentType/echoMixedContentType-0000755000175000017500000000236512653650152032753 0ustar ellertellert some text Tagged Value more text Tagged Value ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MixedContentType/echoMixedContentType-MixedContentType03-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MixedContentType/echoMixedContentType-0000755000175000017500000000240412653650152032745 0ustar ellertellert Tagged Value mixed text value Tagged Value mixed text value ././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MixedContentType/echoMixedContentType-MixedContentType01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MixedContentType/echoMixedContentType-0000755000175000017500000000176612653650152032757 0ustar ellertellert Tagged Value mixed value Tagged Value ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MixedContentType/MixedContentType-MixedContentType01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MixedContentType/MixedContentType-Mixe0000755000175000017500000000173212653650152032734 0ustar ellertellert Tagged Value mixed value Tagged Value ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MixedContentType/echoMixedContentType-MixedContentType03-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MixedContentType/echoMixedContentType-0000755000175000017500000000240212653650152032743 0ustar ellertellert Tagged Value mixed text value Tagged Value mixed text value ././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MixedContentType/echoMixedContentType-MixedContentType02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MixedContentType/echoMixedContentType-0000755000175000017500000000200012653650152032735 0ustar ellertellert some text Tagged Value more text Tagged Value ././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MixedContentType/echoMixedContentType-MixedContentType04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MixedContentType/echoMixedContentType-0000755000175000017500000000202512653650152032744 0ustar ellertellert text mixed value Tagged Value Tagged Value some more text in a mixed value gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexType/0000755000175000017500000000000012653650152026767 5ustar ellertellert././@LongLink0000644000000000000000000000020100000000000011574 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexType/GlobalComplexType-GlobalComplexTypeExample01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexType/GlobalComplexType-Gl0000755000175000017500000000165612653650152032657 0ustar ellertellert 1175 ././@LongLink0000644000000000000000000000021400000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexType/echoGlobalComplexType-GlobalComplexTypeExample01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexType/echoGlobalComplexTyp0000755000175000017500000000230012653650152032774 0ustar ellertellert 1175 ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexType/echoGlobalComplexType-GlobalComplexTypeExample01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexType/echoGlobalComplexTyp0000755000175000017500000000171312653650152033003 0ustar ellertellert 1175 ././@LongLink0000644000000000000000000000021400000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexType/echoGlobalComplexType-GlobalComplexTypeExample01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexType/echoGlobalComplexTyp0000755000175000017500000000230212653650152032776 0ustar ellertellert 1175 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElement/0000755000175000017500000000000012653650152026107 5ustar ellertellert././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElement/echoGlobalElement-GlobalElement02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElement/echoGlobalElement-Global0000755000175000017500000000220112653650152032577 0ustar ellertellert a value ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElement/echoGlobalElement-GlobalElement02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElement/echoGlobalElement-Global0000755000175000017500000000217712653650152032613 0ustar ellertellert a value ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElement/echoGlobalElement-GlobalElement03-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElement/echoGlobalElement-Global0000755000175000017500000000220512653650152032603 0ustar ellertellert another Value ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElement/GlobalElement-GlobalElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElement/GlobalElement-GlobalElem0000755000175000017500000000156012653650152032552 0ustar ellertellert a value././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElement/GlobalElement-GlobalElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElement/GlobalElement-GlobalElem0000755000175000017500000000152712653650152032555 0ustar ellertellert ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElement/echoGlobalElement-GlobalElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElement/echoGlobalElement-Global0000755000175000017500000000156012653650152032606 0ustar ellertellert ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElement/echoGlobalElement-GlobalElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElement/echoGlobalElement-Global0000755000175000017500000000161112653650152032603 0ustar ellertellert a value ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElement/echoGlobalElement-GlobalElement03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElement/echoGlobalElement-Global0000755000175000017500000000161712653650152032611 0ustar ellertellert another Value ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElement/echoGlobalElement-GlobalElement03-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElement/echoGlobalElement-Global0000755000175000017500000000220712653650152032605 0ustar ellertellert another Value ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElement/echoGlobalElement-GlobalElement01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElement/echoGlobalElement-Global0000755000175000017500000000214612653650152032607 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElement/echoGlobalElement-GlobalElement01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElement/echoGlobalElement-Global0000755000175000017500000000215012653650152032602 0ustar ellertellert ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElement/GlobalElement-GlobalElement03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElement/GlobalElement-GlobalElem0000755000175000017500000000156612653650152032560 0ustar ellertellert another Valuegsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENEnumerationType/0000755000175000017500000000000012653650152027561 5ustar ellertellert././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENEnumerationType/NMTOKENEnumerationType-NMTOKENEnumerationType01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENEnumerationType/NMTOKENEnumerat0000755000175000017500000000164512653650152032331 0ustar ellertellert token1././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENEnumerationType/echoNMTOKENEnumerationType-NMTOKENEnumerationType01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENEnumerationType/echoNMTOKENEnum0000755000175000017500000000225512653650152032312 0ustar ellertellert token1 ././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENEnumerationType/echoNMTOKENEnumerationType-NMTOKENEnumerationType01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENEnumerationType/echoNMTOKENEnum0000755000175000017500000000170712653650152032313 0ustar ellertellert token1 ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENEnumerationType/echoNMTOKENEnumerationType-NMTOKENEnumerationType01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENEnumerationType/echoNMTOKENEnum0000755000175000017500000000225312653650152032310 0ustar ellertellert token1 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxInclusive/0000755000175000017500000000000012653650152030035 5ustar ellertellert././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxInclusive/echoRestrictedMaxInclusive-RestrictedMaxInclusive01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxInclusive/echoRestrictedM0000755000175000017500000000170212653650152033047 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxInclusive/RestrictedMaxInclusive-RestrictedMaxInclusive02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxInclusive/RestrictedMaxIn0000755000175000017500000000164012653650152033031 0ustar ellertellert 3././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxInclusive/echoRestrictedMaxInclusive-RestrictedMaxInclusive01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxInclusive/echoRestrictedM0000755000175000017500000000225012653650152033046 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxInclusive/RestrictedMaxInclusive-RestrictedMaxInclusive01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxInclusive/RestrictedMaxIn0000755000175000017500000000164012653650152033031 0ustar ellertellert 1././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxInclusive/echoRestrictedMaxInclusive-RestrictedMaxInclusive02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxInclusive/echoRestrictedM0000755000175000017500000000225012653650152033046 0ustar ellertellert 3 ././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxInclusive/echoRestrictedMaxInclusive-RestrictedMaxInclusive02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxInclusive/echoRestrictedM0000755000175000017500000000170212653650152033047 0ustar ellertellert 3 ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxInclusive/echoRestrictedMaxInclusive-RestrictedMaxInclusive01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxInclusive/echoRestrictedM0000755000175000017500000000224612653650152033053 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxInclusive/echoRestrictedMaxInclusive-RestrictedMaxInclusive02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxInclusive/echoRestrictedM0000755000175000017500000000224612653650152033053 0ustar ellertellert 3 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccursUnbounded/0000755000175000017500000000000012653650150030455 5ustar ellertellert././@LongLink0000644000000000000000000000022200000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccursUnbounded/ElementMaxOccursUnbounded-ElementMaxOccursUnbounded01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccursUnbounded/ElementMaxOc0000755000175000017500000000203612653650150032725 0ustar ellertellert 2002-09-24 2003-04-14 2004-03-31 2005-06-04 2006-07-03 ././@LongLink0000644000000000000000000000022200000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccursUnbounded/ElementMaxOccursUnbounded-ElementMaxOccursUnbounded02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccursUnbounded/ElementMaxOc0000755000175000017500000000161612653650150032730 0ustar ellertellert 2006-01-26 ././@LongLink0000644000000000000000000000022600000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccursUnbounded/echoElementMaxOccursUnbounded-ElementMaxOccursUnbounded01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccursUnbounded/echoElementM0000755000175000017500000000212012653650150032743 0ustar ellertellert 2002-09-24 2003-04-14 2004-03-31 2005-06-04 2006-07-03 ././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccursUnbounded/echoElementMaxOccursUnbounded-ElementMaxOccursUnbounded01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccursUnbounded/echoElementM0000755000175000017500000000253712653650150032757 0ustar ellertellert 2002-09-24 2003-04-14 2004-03-31 2005-06-04 2006-07-03 ././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccursUnbounded/echoElementMaxOccursUnbounded-ElementMaxOccursUnbounded02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccursUnbounded/echoElementM0000755000175000017500000000230112653650150032744 0ustar ellertellert 2006-01-26 ././@LongLink0000644000000000000000000000022600000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccursUnbounded/echoElementMaxOccursUnbounded-ElementMaxOccursUnbounded02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccursUnbounded/echoElementM0000755000175000017500000000170012653650150032746 0ustar ellertellert 2006-01-26 ././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccursUnbounded/echoElementMaxOccursUnbounded-ElementMaxOccursUnbounded01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccursUnbounded/echoElementM0000755000175000017500000000254112653650150032752 0ustar ellertellert 2002-09-24 2003-04-14 2004-03-31 2005-06-04 2006-07-03 ././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccursUnbounded/echoElementMaxOccursUnbounded-ElementMaxOccursUnbounded02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccursUnbounded/echoElementM0000755000175000017500000000227712653650150032760 0ustar ellertellert 2006-01-26 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntAttribute/0000755000175000017500000000000012653650154027512 5ustar ellertellert././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntAttribute/echoUnsignedIntAttribute-UnsignedIntAttribute01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntAttribute/echoUnsignedIntAt0000755000175000017500000000227012653650154033014 0ustar ellertellert ././@LongLink0000644000000000000000000000020300000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntAttribute/UnsignedIntAttribute-UnsignedIntAttribute02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntAttribute/UnsignedIntAttrib0000755000175000017500000000164412653650154033042 0ustar ellertellert ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntAttribute/echoUnsignedIntAttribute-UnsignedIntAttribute04-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntAttribute/echoUnsignedIntAt0000755000175000017500000000227512653650154033021 0ustar ellertellert ././@LongLink0000644000000000000000000000020300000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntAttribute/UnsignedIntAttribute-UnsignedIntAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntAttribute/UnsignedIntAttrib0000755000175000017500000000164712653650154033045 0ustar ellertellert ././@LongLink0000644000000000000000000000020700000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntAttribute/echoUnsignedIntAttribute-UnsignedIntAttribute04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntAttribute/echoUnsignedIntAt0000755000175000017500000000171712653650154033021 0ustar ellertellert ././@LongLink0000644000000000000000000000020700000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntAttribute/echoUnsignedIntAttribute-UnsignedIntAttribute03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntAttribute/echoUnsignedIntAt0000755000175000017500000000171012653650154033012 0ustar ellertellert ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntAttribute/echoUnsignedIntAttribute-UnsignedIntAttribute03-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntAttribute/echoUnsignedIntAt0000755000175000017500000000226612653650154033021 0ustar ellertellert ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntAttribute/echoUnsignedIntAttribute-UnsignedIntAttribute02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntAttribute/echoUnsignedIntAt0000755000175000017500000000226712653650154033022 0ustar ellertellert ././@LongLink0000644000000000000000000000020300000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntAttribute/UnsignedIntAttribute-UnsignedIntAttribute04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntAttribute/UnsignedIntAttrib0000755000175000017500000000165412653650154033043 0ustar ellertellert ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntAttribute/echoUnsignedIntAttribute-UnsignedIntAttribute04-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntAttribute/echoUnsignedIntAt0000755000175000017500000000227712653650154033023 0ustar ellertellert ././@LongLink0000644000000000000000000000020300000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntAttribute/UnsignedIntAttribute-UnsignedIntAttribute03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntAttribute/UnsignedIntAttrib0000755000175000017500000000164512653650154033043 0ustar ellertellert ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntAttribute/echoUnsignedIntAttribute-UnsignedIntAttribute02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntAttribute/echoUnsignedIntAt0000755000175000017500000000226512653650154033020 0ustar ellertellert ././@LongLink0000644000000000000000000000020700000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntAttribute/echoUnsignedIntAttribute-UnsignedIntAttribute02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntAttribute/echoUnsignedIntAt0000755000175000017500000000170712653650154033020 0ustar ellertellert ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntAttribute/echoUnsignedIntAttribute-UnsignedIntAttribute03-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntAttribute/echoUnsignedIntAt0000755000175000017500000000227012653650154033014 0ustar ellertellert ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntAttribute/echoUnsignedIntAttribute-UnsignedIntAttribute01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntAttribute/echoUnsignedIntAt0000755000175000017500000000227212653650154033016 0ustar ellertellert ././@LongLink0000644000000000000000000000020700000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntAttribute/echoUnsignedIntAttribute-UnsignedIntAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntAttribute/echoUnsignedIntAt0000755000175000017500000000171212653650154033014 0ustar ellertellert gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortSimpleTypePattern/0000755000175000017500000000000012653650152030046 5ustar ellertellert././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortSimpleTypePattern/echoShortSimpleTypePattern-ShortSimpleTypePattern01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortSimpleTypePattern/echoShortSimple0000755000175000017500000000170412653650152033106 0ustar ellertellert 123 ././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortSimpleTypePattern/ShortSimpleTypePattern-ShortSimpleTypePattern02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortSimpleTypePattern/ShortSimpleType0000755000175000017500000000164212653650152033112 0ustar ellertellert 009././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortSimpleTypePattern/echoShortSimpleTypePattern-ShortSimpleTypePattern01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortSimpleTypePattern/echoShortSimple0000755000175000017500000000225012653650152033103 0ustar ellertellert 123 ././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortSimpleTypePattern/ShortSimpleTypePattern-ShortSimpleTypePattern01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortSimpleTypePattern/ShortSimpleType0000755000175000017500000000164212653650152033112 0ustar ellertellert 123././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortSimpleTypePattern/echoShortSimpleTypePattern-ShortSimpleTypePattern02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortSimpleTypePattern/echoShortSimple0000755000175000017500000000225012653650152033103 0ustar ellertellert 009 ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortSimpleTypePattern/echoShortSimpleTypePattern-ShortSimpleTypePattern02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortSimpleTypePattern/echoShortSimple0000755000175000017500000000225212653650152033105 0ustar ellertellert 009 ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortSimpleTypePattern/echoShortSimpleTypePattern-ShortSimpleTypePattern01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortSimpleTypePattern/echoShortSimple0000755000175000017500000000225212653650152033105 0ustar ellertellert 123 ././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortSimpleTypePattern/echoShortSimpleTypePattern-ShortSimpleTypePattern02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortSimpleTypePattern/echoShortSimple0000755000175000017500000000170412653650152033106 0ustar ellertellert 009 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeTypeReference/0000755000175000017500000000000012653650150030017 5ustar ellertellert././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeTypeReference/echoAttributeTypeReference-AttributeTypeReference01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeTypeReference/echoAttributeTy0000755000175000017500000000227312653650150033070 0ustar ellertellert ././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeTypeReference/echoAttributeTypeReference-AttributeTypeReference01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeTypeReference/echoAttributeTy0000755000175000017500000000172112653650150033065 0ustar ellertellert ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeTypeReference/echoAttributeTypeReference-AttributeTypeReference01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeTypeReference/echoAttributeTy0000755000175000017500000000227512653650150033072 0ustar ellertellert ././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeTypeReference/AttributeTypeReference-AttributeTypeReference01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeTypeReference/AttributeTypeRe0000755000175000017500000000165412653650150033047 0ustar ellertellert gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeOtherLax/0000755000175000017500000000000012653650150027455 5ustar ellertellert././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeOtherLax/echoAnyAttributeOtherLax-AnyAttributeOtherLax01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeOtherLax/echoAnyAttributeO0000755000175000017500000000256012653650150032777 0ustar ellertellert String String ././@LongLink0000644000000000000000000000020300000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeOtherLax/AnyAttributeOtherLax-AnyAttributeOtherLax01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeOtherLax/AnyAttributeOther0000755000175000017500000000215312653650150033021 0ustar ellertellert String String ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeOtherLax/echoAnyAttributeOtherLax-AnyAttributeOtherLax01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeOtherLax/echoAnyAttributeO0000755000175000017500000000255612653650150033004 0ustar ellertellert String String ././@LongLink0000644000000000000000000000020700000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeOtherLax/echoAnyAttributeOtherLax-AnyAttributeOtherLax01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeOtherLax/echoAnyAttributeO0000755000175000017500000000222112653650150032771 0ustar ellertellert String String gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/0000755000175000017500000000000012653650152025716 5ustar ellertellert././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearElement04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearEle0000755000175000017500000000160512653650152032461 0ustar ellertellert 2007-13:00 ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/GYearElement-GYearElement07.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/GYearElement-GYearElement0000755000175000017500000000155012653650152032505 0ustar ellertellert 10739././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearElement07-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearEle0000755000175000017500000000217212653650152032461 0ustar ellertellert 10739 ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearElement04-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearEle0000755000175000017500000000217512653650152032464 0ustar ellertellert 2007-13:00 ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/GYearElement-GYearElement03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/GYearElement-GYearElement0000755000175000017500000000154712653650152032513 0ustar ellertellert 2039././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearEle0000755000175000017500000000157712653650152032471 0ustar ellertellert 1999 ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearEle0000755000175000017500000000157712653650152032471 0ustar ellertellert 0739 ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearElement02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearEle0000755000175000017500000000217112653650152032460 0ustar ellertellert 0739 ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearElement06-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearEle0000755000175000017500000000217012653650152032457 0ustar ellertellert 2008Z ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearElement05.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearEle0000755000175000017500000000160512653650152032461 0ustar ellertellert 1999+02:00 ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearElement06-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearEle0000755000175000017500000000217212653650152032461 0ustar ellertellert 2008Z ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/GYearElement-GYearElement04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/GYearElement-GYearElement0000755000175000017500000000155512653650152032512 0ustar ellertellert 2007-13:00././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearElement03-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearEle0000755000175000017500000000217112653650152032460 0ustar ellertellert 2039 ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearElement03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearEle0000755000175000017500000000157712653650152032471 0ustar ellertellert 2039 ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearElement03-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearEle0000755000175000017500000000216712653650152032465 0ustar ellertellert 2039 ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/GYearElement-GYearElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/GYearElement-GYearElement0000755000175000017500000000154712653650152032513 0ustar ellertellert 0739././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearElement01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearEle0000755000175000017500000000216712653650152032465 0ustar ellertellert 1999 ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/GYearElement-GYearElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/GYearElement-GYearElement0000755000175000017500000000154712653650152032513 0ustar ellertellert 1999././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearElement02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearEle0000755000175000017500000000216712653650152032465 0ustar ellertellert 0739 ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearElement07.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearEle0000755000175000017500000000160012653650152032454 0ustar ellertellert 10739 ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/GYearElement-GYearElement05.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/GYearElement-GYearElement0000755000175000017500000000155512653650152032512 0ustar ellertellert 1999+02:00././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearElement05-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearEle0000755000175000017500000000217512653650152032464 0ustar ellertellert 1999+02:00 ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearElement06.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearEle0000755000175000017500000000160012653650152032454 0ustar ellertellert 2008Z ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearElement07-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearEle0000755000175000017500000000217012653650152032457 0ustar ellertellert 10739 ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearElement01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearEle0000755000175000017500000000217112653650152032460 0ustar ellertellert 1999 ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/GYearElement-GYearElement06.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/GYearElement-GYearElement0000755000175000017500000000155012653650152032505 0ustar ellertellert 2008Z././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearElement05-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearEle0000755000175000017500000000217712653650152032466 0ustar ellertellert 1999+02:00 ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearElement04-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearEle0000755000175000017500000000217712653650152032466 0ustar ellertellert 2007-13:00 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringAttribute/0000755000175000017500000000000012653650152026527 5ustar ellertellert././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringAttribute/echoStringAttribute-StringAttribute02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringAttribute/echoStringAttribute-St0000755000175000017500000000164712653650152033042 0ustar ellertellert ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringAttribute/echoStringAttribute-StringAttribute02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringAttribute/echoStringAttribute-St0000755000175000017500000000224112653650152033031 0ustar ellertellert ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringAttribute/echoStringAttribute-StringAttribute01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringAttribute/echoStringAttribute-St0000755000175000017500000000223212653650152033031 0ustar ellertellert ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringAttribute/echoStringAttribute-StringAttribute02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringAttribute/echoStringAttribute-St0000755000175000017500000000223712653650152033036 0ustar ellertellert ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringAttribute/echoStringAttribute-StringAttribute01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringAttribute/echoStringAttribute-St0000755000175000017500000000223412653650152033033 0ustar ellertellert ././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringAttribute/StringAttribute-StringAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringAttribute/StringAttribute-String0000755000175000017500000000160412653650152033054 0ustar ellertellert ././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringAttribute/StringAttribute-StringAttribute02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringAttribute/StringAttribute-String0000755000175000017500000000161112653650152033052 0ustar ellertellert ././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringAttribute/echoStringAttribute-StringAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringAttribute/echoStringAttribute-St0000755000175000017500000000164212653650152033035 0ustar ellertellert gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxLength/0000755000175000017500000000000012653650152027315 5ustar ellertellert././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxLength/echoRestrictedMaxLength-RestrictedMaxLength01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxLength/echoRestrictedMaxL0000755000175000017500000000223712653650152033000 0ustar ellertellert AUSTRALIA ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxLength/echoRestrictedMaxLength-RestrictedMaxLength02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxLength/echoRestrictedMaxL0000755000175000017500000000223712653650152033000 0ustar ellertellert N AMERICA ././@LongLink0000644000000000000000000000020000000000000011573 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxLength/RestrictedMaxLength-RestrictedMaxLength01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxLength/RestrictedMaxLengt0000755000175000017500000000162612653650152033020 0ustar ellertellert AUSTRALIA././@LongLink0000644000000000000000000000020000000000000011573 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxLength/RestrictedMaxLength-RestrictedMaxLength02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxLength/RestrictedMaxLengt0000755000175000017500000000162612653650152033020 0ustar ellertellert N AMERICA././@LongLink0000644000000000000000000000020400000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxLength/echoRestrictedMaxLength-RestrictedMaxLength02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxLength/echoRestrictedMaxL0000755000175000017500000000166512653650152033004 0ustar ellertellert N AMERICA ././@LongLink0000644000000000000000000000020400000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxLength/echoRestrictedMaxLength-RestrictedMaxLength01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxLength/echoRestrictedMaxL0000755000175000017500000000166512653650152033004 0ustar ellertellert AUSTRALIA ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxLength/echoRestrictedMaxLength-RestrictedMaxLength01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxLength/echoRestrictedMaxL0000755000175000017500000000224112653650152032773 0ustar ellertellert AUSTRALIA ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxLength/echoRestrictedMaxLength-RestrictedMaxLength02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxLength/echoRestrictedMaxL0000755000175000017500000000224112653650152032773 0ustar ellertellert N AMERICA gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LocalElementSimpleType/0000755000175000017500000000000012653650152027755 5ustar ellertellert././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LocalElementSimpleType/LocalElementSimpleType-LocalElementSimpleType01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LocalElementSimpleType/LocalElementSim0000755000175000017500000000164412653650152032725 0ustar ellertellert First././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LocalElementSimpleType/echoLocalElementSimpleType-LocalElementSimpleType01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LocalElementSimpleType/echoLocalElemen0000755000175000017500000000175212653650152032727 0ustar ellertellert First ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LocalElementSimpleType/echoLocalElementSimpleType-LocalElementSimpleType01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LocalElementSimpleType/echoLocalElemen0000755000175000017500000000231612653650152032724 0ustar ellertellert First ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LocalElementSimpleType/echoLocalElementSimpleType-LocalElementSimpleType01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LocalElementSimpleType/echoLocalElemen0000755000175000017500000000232012653650152032717 0ustar ellertellert First gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/0000755000175000017500000000000012653650152026656 5ustar ellertellert././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-IntegerAttribute02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-0000755000175000017500000000164712653650152033011 0ustar ellertellert ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/IntegerAttribute-IntegerAttribute03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/IntegerAttribute-Inte0000755000175000017500000000161112653650152032761 0ustar ellertellert ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-IntegerAttribute06-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-0000755000175000017500000000232712653650152033005 0ustar ellertellert ././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-IntegerAttribute06.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-0000755000175000017500000000174112653650152033004 0ustar ellertellert ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-IntegerAttribute04-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-0000755000175000017500000000224012653650152032777 0ustar ellertellert ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-IntegerAttribute01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-0000755000175000017500000000224012653650152032777 0ustar ellertellert ././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-IntegerAttribute04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-0000755000175000017500000000165012653650152033003 0ustar ellertellert ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-IntegerAttribute05-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-0000755000175000017500000000232312653650152033001 0ustar ellertellert ././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-IntegerAttribute03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-0000755000175000017500000000165012653650152033003 0ustar ellertellert ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-IntegerAttribute06-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-0000755000175000017500000000233112653650152033000 0ustar ellertellert ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-IntegerAttribute04-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-0000755000175000017500000000223612653650152033004 0ustar ellertellert ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-IntegerAttribute03-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-0000755000175000017500000000224012653650152032777 0ustar ellertellert ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/IntegerAttribute-IntegerAttribute02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/IntegerAttribute-Inte0000755000175000017500000000161012653650152032760 0ustar ellertellert ././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-IntegerAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-0000755000175000017500000000165212653650152033005 0ustar ellertellert ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-IntegerAttribute01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-0000755000175000017500000000224212653650152033001 0ustar ellertellert ././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-IntegerAttribute05.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-0000755000175000017500000000173312653650152033005 0ustar ellertellert ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/IntegerAttribute-IntegerAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/IntegerAttribute-Inte0000755000175000017500000000161312653650152032763 0ustar ellertellert ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-IntegerAttribute05-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-0000755000175000017500000000232112653650152032777 0ustar ellertellert ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-IntegerAttribute02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-0000755000175000017500000000223512653650152033003 0ustar ellertellert ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/IntegerAttribute-IntegerAttribute05.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/IntegerAttribute-Inte0000755000175000017500000000167412653650152032772 0ustar ellertellert ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/IntegerAttribute-IntegerAttribute06.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/IntegerAttribute-Inte0000755000175000017500000000170212653650152032762 0ustar ellertellert ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-IntegerAttribute02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-0000755000175000017500000000223712653650152033005 0ustar ellertellert ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-IntegerAttribute03-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-0000755000175000017500000000223612653650152033004 0ustar ellertellert ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/IntegerAttribute-IntegerAttribute04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/IntegerAttribute-Inte0000755000175000017500000000161112653650152032761 0ustar ellertellert gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeStrict/0000755000175000017500000000000012653650150027177 5ustar ellertellert././@LongLink0000644000000000000000000000020100000000000011574 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeStrict/echoAnyAttributeStrict-AnyAttributeStrict03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeStrict/echoAnyAttributeStr0000755000175000017500000000213212653650150033066 0ustar ellertellert Bobby Sox ././@LongLink0000644000000000000000000000017500000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeStrict/AnyAttributeStrict-AnyAttributeStrict03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeStrict/AnyAttributeStrict-0000755000175000017500000000206612653650150033012 0ustar ellertellert Bobby Sox ././@LongLink0000644000000000000000000000020100000000000011574 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeStrict/echoAnyAttributeStrict-AnyAttributeStrict02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeStrict/echoAnyAttributeStr0000755000175000017500000000205312653650150033070 0ustar ellertellert Bobby Sox ././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeStrict/echoAnyAttributeStrict-AnyAttributeStrict03-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeStrict/echoAnyAttributeStr0000755000175000017500000000253712653650150033077 0ustar ellertellert Bobby Sox ././@LongLink0000644000000000000000000000017500000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeStrict/AnyAttributeStrict-AnyAttributeStrict01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeStrict/AnyAttributeStrict-0000755000175000017500000000201212653650150033001 0ustar ellertellert Bobby Sox ././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeStrict/echoAnyAttributeStrict-AnyAttributeStrict01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeStrict/echoAnyAttributeStr0000755000175000017500000000245212653650150033073 0ustar ellertellert Bobby Sox ././@LongLink0000644000000000000000000000017500000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeStrict/AnyAttributeStrict-AnyAttributeStrict02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeStrict/AnyAttributeStrict-0000755000175000017500000000201212653650150033001 0ustar ellertellert Bobby Sox ././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeStrict/echoAnyAttributeStrict-AnyAttributeStrict02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeStrict/echoAnyAttributeStr0000755000175000017500000000245212653650150033073 0ustar ellertellert Bobby Sox ././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeStrict/echoAnyAttributeStrict-AnyAttributeStrict03-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeStrict/echoAnyAttributeStr0000755000175000017500000000253512653650150033075 0ustar ellertellert Bobby Sox ././@LongLink0000644000000000000000000000020100000000000011574 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeStrict/echoAnyAttributeStrict-AnyAttributeStrict01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeStrict/echoAnyAttributeStr0000755000175000017500000000205312653650150033070 0ustar ellertellert Bobby Sox ././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeStrict/echoAnyAttributeStrict-AnyAttributeStrict01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeStrict/echoAnyAttributeStr0000755000175000017500000000245012653650150033071 0ustar ellertellert Bobby Sox ././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeStrict/echoAnyAttributeStrict-AnyAttributeStrict02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeStrict/echoAnyAttributeStr0000755000175000017500000000245012653650150033071 0ustar ellertellert Bobby Sox gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeGroup/0000755000175000017500000000000012653650150026353 5ustar ellertellert././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeGroup/echoAttributeGroup-AttributeGroup01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeGroup/echoAttributeGroup-Attr0000755000175000017500000000237112653650150033033 0ustar ellertellert 12345678910 ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeGroup/echoAttributeGroup-AttributeGroup02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeGroup/echoAttributeGroup-Attr0000755000175000017500000000167612653650150033042 0ustar ellertellert 9876543210 ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeGroup/echoAttributeGroup-AttributeGroup01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeGroup/echoAttributeGroup-Attr0000755000175000017500000000176612653650150033042 0ustar ellertellert 12345678910 ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeGroup/echoAttributeGroup-AttributeGroup02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeGroup/echoAttributeGroup-Attr0000755000175000017500000000227312653650150033034 0ustar ellertellert 9876543210 ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeGroup/echoAttributeGroup-AttributeGroup02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeGroup/echoAttributeGroup-Attr0000755000175000017500000000227112653650150033032 0ustar ellertellert 9876543210 ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeGroup/AttributeGroup-AttributeGroup01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeGroup/AttributeGroup-Attribut0000755000175000017500000000173112653650150033057 0ustar ellertellert 12345678910 ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeGroup/AttributeGroup-AttributeGroup02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeGroup/AttributeGroup-Attribut0000755000175000017500000000164412653650150033062 0ustar ellertellert 9876543210 ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeGroup/echoAttributeGroup-AttributeGroup01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeGroup/echoAttributeGroup-Attr0000755000175000017500000000236712653650150033040 0ustar ellertellert 12345678910 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementEmptyComplexType/0000755000175000017500000000000012653650150030175 5ustar ellertellert././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementEmptyComplexType/echoElementEmptyComplexType-ElementEmptyComplexType01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementEmptyComplexType/echoElementEmp0000755000175000017500000000222012653650150033011 0ustar ellertellert ././@LongLink0000644000000000000000000000022000000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementEmptyComplexType/echoElementEmptyComplexType-ElementEmptyComplexType01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementEmptyComplexType/echoElementEmp0000755000175000017500000000165412653650150033023 0ustar ellertellert ././@LongLink0000644000000000000000000000021400000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementEmptyComplexType/ElementEmptyComplexType-ElementEmptyComplexType01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementEmptyComplexType/ElementEmptyCo0000755000175000017500000000161112653650150033014 0ustar ellertellert ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementEmptyComplexType/echoElementEmptyComplexType-ElementEmptyComplexType01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementEmptyComplexType/echoElementEmp0000755000175000017500000000221612653650150033016 0ustar ellertellert gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SimpleTypeEnumerationType/0000755000175000017500000000000012653650152030541 5ustar ellertellert././@LongLink0000644000000000000000000000022600000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SimpleTypeEnumerationType/echoSimpleTypeEnumerationType-SimpleTypeEnumerationType02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SimpleTypeEnumerationType/echoSimpleTy0000755000175000017500000000173112653650152033076 0ustar ellertellert Two ././@LongLink0000644000000000000000000000022600000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SimpleTypeEnumerationType/echoSimpleTypeEnumerationType-SimpleTypeEnumerationType01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SimpleTypeEnumerationType/echoSimpleTy0000755000175000017500000000173112653650152033076 0ustar ellertellert One ././@LongLink0000644000000000000000000000022200000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SimpleTypeEnumerationType/SimpleTypeEnumerationType-SimpleTypeEnumerationType02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SimpleTypeEnumerationType/SimpleTypeEn0000755000175000017500000000166412653650152033054 0ustar ellertellert Two././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SimpleTypeEnumerationType/echoSimpleTypeEnumerationType-SimpleTypeEnumerationType02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SimpleTypeEnumerationType/echoSimpleTy0000755000175000017500000000227112653650152033076 0ustar ellertellert Two ././@LongLink0000644000000000000000000000022200000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SimpleTypeEnumerationType/SimpleTypeEnumerationType-SimpleTypeEnumerationType01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SimpleTypeEnumerationType/SimpleTypeEn0000755000175000017500000000166412653650152033054 0ustar ellertellert One././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SimpleTypeEnumerationType/echoSimpleTypeEnumerationType-SimpleTypeEnumerationType01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SimpleTypeEnumerationType/echoSimpleTy0000755000175000017500000000227112653650152033076 0ustar ellertellert One ././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SimpleTypeEnumerationType/echoSimpleTypeEnumerationType-SimpleTypeEnumerationType02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SimpleTypeEnumerationType/echoSimpleTy0000755000175000017500000000226712653650152033103 0ustar ellertellert Two ././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SimpleTypeEnumerationType/echoSimpleTypeEnumerationType-SimpleTypeEnumerationType01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SimpleTypeEnumerationType/echoSimpleTy0000755000175000017500000000226712653650152033103 0ustar ellertellert One gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortElement/0000755000175000017500000000000012653650154027505 5ustar ellertellert././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortElement/echoUnsignedShortElement-UnsignedShortElement02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortElement/echoUnsignedShort0000755000175000017500000000223512653650154033070 0ustar ellertellert -0 ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortElement/echoUnsignedShortElement-UnsignedShortElement01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortElement/echoUnsignedShort0000755000175000017500000000223412653650154033067 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000020700000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortElement/echoUnsignedShortElement-UnsignedShortElement04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortElement/echoUnsignedShort0000755000175000017500000000167012653650154033072 0ustar ellertellert 65535 ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortElement/echoUnsignedShortElement-UnsignedShortElement03-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortElement/echoUnsignedShort0000755000175000017500000000224012653650154033064 0ustar ellertellert +42 ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortElement/echoUnsignedShortElement-UnsignedShortElement04-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortElement/echoUnsignedShort0000755000175000017500000000224212653650154033066 0ustar ellertellert 65535 ././@LongLink0000644000000000000000000000020300000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortElement/UnsignedShortElement-UnsignedShortElement03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortElement/UnsignedShortElem0000755000175000017500000000162612653650154033037 0ustar ellertellert +42././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortElement/echoUnsignedShortElement-UnsignedShortElement04-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortElement/echoUnsignedShort0000755000175000017500000000224012653650154033064 0ustar ellertellert 65535 ././@LongLink0000644000000000000000000000020300000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortElement/UnsignedShortElement-UnsignedShortElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortElement/UnsignedShortElem0000755000175000017500000000162512653650154033036 0ustar ellertellert -0././@LongLink0000644000000000000000000000020700000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortElement/echoUnsignedShortElement-UnsignedShortElement03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortElement/echoUnsignedShort0000755000175000017500000000166612653650154033077 0ustar ellertellert +42 ././@LongLink0000644000000000000000000000020700000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortElement/echoUnsignedShortElement-UnsignedShortElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortElement/echoUnsignedShort0000755000175000017500000000166412653650154033075 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortElement/echoUnsignedShortElement-UnsignedShortElement01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortElement/echoUnsignedShort0000755000175000017500000000223612653650154033071 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortElement/echoUnsignedShortElement-UnsignedShortElement02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortElement/echoUnsignedShort0000755000175000017500000000223712653650154033072 0ustar ellertellert -0 ././@LongLink0000644000000000000000000000020700000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortElement/echoUnsignedShortElement-UnsignedShortElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortElement/echoUnsignedShort0000755000175000017500000000166512653650154033076 0ustar ellertellert -0 ././@LongLink0000644000000000000000000000020300000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortElement/UnsignedShortElement-UnsignedShortElement04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortElement/UnsignedShortElem0000755000175000017500000000163012653650154033032 0ustar ellertellert 65535././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortElement/echoUnsignedShortElement-UnsignedShortElement03-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortElement/echoUnsignedShort0000755000175000017500000000223612653650154033071 0ustar ellertellert +42 ././@LongLink0000644000000000000000000000020300000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortElement/UnsignedShortElement-UnsignedShortElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortElement/UnsignedShortElem0000755000175000017500000000162412653650154033035 0ustar ellertellert 1gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedStringMinLength/0000755000175000017500000000000012653650152030502 5ustar ellertellert././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedStringMinLength/echoRestrictedStringMinLength-RestrictedStringMinLength01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedStringMinLength/echoRestrict0000755000175000017500000000230012653650152033061 0ustar ellertellert String Value ././@LongLink0000644000000000000000000000022200000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedStringMinLength/RestrictedStringMinLength-RestrictedStringMinLength01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedStringMinLength/RestrictedSt0000755000175000017500000000167512653650152033060 0ustar ellertellert String Value././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedStringMinLength/echoRestrictedStringMinLength-RestrictedStringMinLength01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedStringMinLength/echoRestrict0000755000175000017500000000230212653650152033063 0ustar ellertellert String Value ././@LongLink0000644000000000000000000000022600000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedStringMinLength/echoRestrictedStringMinLength-RestrictedStringMinLength01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedStringMinLength/echoRestrict0000755000175000017500000000174212653650152033072 0ustar ellertellert String Value gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementSimpleType/0000755000175000017500000000000012653650152030123 5ustar ellertellert././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementSimpleType/echoGlobalElementSimpleType-GlobalElementSimpleType02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementSimpleType/echoGlobalElem0000755000175000017500000000226012653650152032713 0ustar ellertellert value2 ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementSimpleType/echoGlobalElementSimpleType-GlobalElementSimpleType01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementSimpleType/echoGlobalElem0000755000175000017500000000226012653650152032713 0ustar ellertellert value1 ././@LongLink0000644000000000000000000000022000000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementSimpleType/echoGlobalElementSimpleType-GlobalElementSimpleType01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementSimpleType/echoGlobalElem0000755000175000017500000000171612653650152032720 0ustar ellertellert value1 ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementSimpleType/echoGlobalElementSimpleType-GlobalElementSimpleType02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementSimpleType/echoGlobalElem0000755000175000017500000000226212653650152032715 0ustar ellertellert value2 ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementSimpleType/echoGlobalElementSimpleType-GlobalElementSimpleType01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementSimpleType/echoGlobalElem0000755000175000017500000000226212653650152032715 0ustar ellertellert value1 ././@LongLink0000644000000000000000000000022000000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementSimpleType/echoGlobalElementSimpleType-GlobalElementSimpleType02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementSimpleType/echoGlobalElem0000755000175000017500000000171612653650152032720 0ustar ellertellert value2 ././@LongLink0000644000000000000000000000021400000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementSimpleType/GlobalElementSimpleType-GlobalElementSimpleType02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementSimpleType/GlobalElementS0000755000175000017500000000165312653650152032713 0ustar ellertellert value2././@LongLink0000644000000000000000000000021400000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementSimpleType/GlobalElementSimpleType-GlobalElementSimpleType01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementSimpleType/GlobalElementS0000755000175000017500000000165312653650152032713 0ustar ellertellert value1gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceLax/0000755000175000017500000000000012653650152027273 5ustar ellertellert././@LongLink0000644000000000000000000000020400000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceLax/echoExtendedSequenceLax-ExtendedSequenceLax02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceLax/echoExtendedSequen0000755000175000017500000000220712653650152033002 0ustar ellertellert Bobby Sox William Mr ././@LongLink0000644000000000000000000000020000000000000011573 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceLax/ExtendedSequenceLax-ExtendedSequenceLax01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceLax/ExtendedSequenceLa0000755000175000017500000000174612653650152032737 0ustar ellertellert Bobby Sox ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceLax/echoExtendedSequenceLax-ExtendedSequenceLax02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceLax/echoExtendedSequen0000755000175000017500000000261612653650152033006 0ustar ellertellert Bobby Sox William Mr ././@LongLink0000644000000000000000000000020400000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceLax/echoExtendedSequenceLax-ExtendedSequenceLax01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceLax/echoExtendedSequen0000755000175000017500000000200512653650152032776 0ustar ellertellert Bobby Sox ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceLax/echoExtendedSequenceLax-ExtendedSequenceLax01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceLax/echoExtendedSequen0000755000175000017500000000237212653650152033005 0ustar ellertellert Bobby Sox ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceLax/echoExtendedSequenceLax-ExtendedSequenceLax02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceLax/echoExtendedSequen0000755000175000017500000000262012653650152033001 0ustar ellertellert Bobby Sox William Mr ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceLax/echoExtendedSequenceLax-ExtendedSequenceLax01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceLax/echoExtendedSequen0000755000175000017500000000237412653650152033007 0ustar ellertellert Bobby Sox ././@LongLink0000644000000000000000000000020000000000000011573 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceLax/ExtendedSequenceLax-ExtendedSequenceLax02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceLax/ExtendedSequenceLa0000755000175000017500000000215012653650152032725 0ustar ellertellert Bobby Sox William Mr gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceSequenceElement/0000755000175000017500000000000012653650152030150 5ustar ellertellert././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceSequenceElement/echoSequenceSequenceElement-SequenceSequenceElement03-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceSequenceElement/echoSequenceSe0000755000175000017500000000250212653650152032774 0ustar ellertellert Paul Sumner Downey ././@LongLink0000644000000000000000000000021400000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceSequenceElement/SequenceSequenceElement-SequenceSequenceElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceSequenceElement/SequenceSequen0000755000175000017500000000172612653650152033035 0ustar ellertellert Paul ././@LongLink0000644000000000000000000000021400000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceSequenceElement/SequenceSequenceElement-SequenceSequenceElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceSequenceElement/SequenceSequen0000755000175000017500000000200412653650152033023 0ustar ellertellert Paul Sumner ././@LongLink0000644000000000000000000000021400000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceSequenceElement/SequenceSequenceElement-SequenceSequenceElement03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceSequenceElement/SequenceSequen0000755000175000017500000000205612653650152033032 0ustar ellertellert Paul Sumner Downey ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceSequenceElement/echoSequenceSequenceElement-SequenceSequenceElement03-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceSequenceElement/echoSequenceSe0000755000175000017500000000250412653650152032776 0ustar ellertellert Paul Sumner Downey ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceSequenceElement/echoSequenceSequenceElement-SequenceSequenceElement02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceSequenceElement/echoSequenceSe0000755000175000017500000000242612653650152033001 0ustar ellertellert Paul Sumner ././@LongLink0000644000000000000000000000022000000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceSequenceElement/echoSequenceSequenceElement-SequenceSequenceElement03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceSequenceElement/echoSequenceSe0000755000175000017500000000212112653650152032771 0ustar ellertellert Paul Sumner Downey ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceSequenceElement/echoSequenceSequenceElement-SequenceSequenceElement01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceSequenceElement/echoSequenceSe0000755000175000017500000000234212653650152032776 0ustar ellertellert Paul ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceSequenceElement/echoSequenceSequenceElement-SequenceSequenceElement02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceSequenceElement/echoSequenceSe0000755000175000017500000000242412653650152032777 0ustar ellertellert Paul Sumner ././@LongLink0000644000000000000000000000022000000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceSequenceElement/echoSequenceSequenceElement-SequenceSequenceElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceSequenceElement/echoSequenceSe0000755000175000017500000000177112653650152033003 0ustar ellertellert Paul ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceSequenceElement/echoSequenceSequenceElement-SequenceSequenceElement01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceSequenceElement/echoSequenceSe0000755000175000017500000000234412653650152033000 0ustar ellertellert Paul ././@LongLink0000644000000000000000000000022000000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceSequenceElement/echoSequenceSequenceElement-SequenceSequenceElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceSequenceElement/echoSequenceSe0000755000175000017500000000204712653650152033000 0ustar ellertellert Paul Sumner gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementUnqualifiedType/0000755000175000017500000000000012653650152031140 5ustar ellertellert././@LongLink0000644000000000000000000000024600000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementUnqualifiedType/echoGlobalElementUnqualifiedType-GlobalElementUnqualifiedType01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementUnqualifiedType/echoGloba0000755000175000017500000000245312653650152032755 0ustar ellertellert string1 string2 ././@LongLink0000644000000000000000000000023300000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementUnqualifiedType/GlobalElementUnqualifiedType-GlobalElementUnqualifiedType01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementUnqualifiedType/GlobalEle0000755000175000017500000000204012653650152032710 0ustar ellertellert string1 string2 ././@LongLink0000644000000000000000000000024600000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementUnqualifiedType/echoGlobalElementUnqualifiedType-GlobalElementUnqualifiedType01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementUnqualifiedType/echoGloba0000755000175000017500000000245512653650152032757 0ustar ellertellert string1 string2 ././@LongLink0000644000000000000000000000023700000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementUnqualifiedType/echoGlobalElementUnqualifiedType-GlobalElementUnqualifiedType01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementUnqualifiedType/echoGloba0000755000175000017500000000211012653650152032743 0ustar ellertellert string1 string2 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DurationElement/0000755000175000017500000000000012653650150026472 5ustar ellertellert././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DurationElement/echoDurationElement-DurationElement02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DurationElement/echoDurationElement-Du0000755000175000017500000000221112653650150032720 0ustar ellertellert -P1347M ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DurationElement/echoDurationElement-DurationElement03-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DurationElement/echoDurationElement-Du0000755000175000017500000000221012653650150032717 0ustar ellertellert P1347Y ././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DurationElement/echoDurationElement-DurationElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DurationElement/echoDurationElement-Du0000755000175000017500000000163612653650150032732 0ustar ellertellert P1Y2M3DT10H30M ././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DurationElement/DurationElement-DurationElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DurationElement/DurationElement-Durati0000755000175000017500000000160312653650150032745 0ustar ellertellert P1Y2M3DT10H30M././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DurationElement/echoDurationElement-DurationElement04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DurationElement/echoDurationElement-Du0000755000175000017500000000162312653650150032726 0ustar ellertellert P1M ././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DurationElement/DurationElement-DurationElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DurationElement/DurationElement-Durati0000755000175000017500000000157412653650150032754 0ustar ellertellert -P1347M././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DurationElement/echoDurationElement-DurationElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DurationElement/echoDurationElement-Du0000755000175000017500000000162712653650150032732 0ustar ellertellert -P1347M ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DurationElement/echoDurationElement-DurationElement04-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DurationElement/echoDurationElement-Du0000755000175000017500000000220712653650150032725 0ustar ellertellert P1M ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DurationElement/echoDurationElement-DurationElement04-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DurationElement/echoDurationElement-Du0000755000175000017500000000220512653650150032723 0ustar ellertellert P1M ././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DurationElement/DurationElement-DurationElement04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DurationElement/DurationElement-Durati0000755000175000017500000000157012653650150032750 0ustar ellertellert P1M././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DurationElement/echoDurationElement-DurationElement01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DurationElement/echoDurationElement-Du0000755000175000017500000000222012653650150032720 0ustar ellertellert P1Y2M3DT10H30M ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DurationElement/echoDurationElement-DurationElement03-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DurationElement/echoDurationElement-Du0000755000175000017500000000221212653650150032721 0ustar ellertellert P1347Y ././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DurationElement/DurationElement-DurationElement03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DurationElement/DurationElement-Durati0000755000175000017500000000157312653650150032753 0ustar ellertellert P1347Y././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DurationElement/echoDurationElement-DurationElement01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DurationElement/echoDurationElement-Du0000755000175000017500000000222212653650150032722 0ustar ellertellert P1Y2M3DT10H30M ././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DurationElement/echoDurationElement-DurationElement03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DurationElement/echoDurationElement-Du0000755000175000017500000000162612653650150032731 0ustar ellertellert P1347Y ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DurationElement/echoDurationElement-DurationElement02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DurationElement/echoDurationElement-Du0000755000175000017500000000221312653650150032722 0ustar ellertellert -P1347M gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceStrictOther/0000755000175000017500000000000012653650152031021 5ustar ellertellert././@LongLink0000644000000000000000000000023000000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceStrictOther/ExtendedSequenceStrictOther-ExtendedSequenceStrictOther01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceStrictOther/ExtendedSe0000755000175000017500000000231112653650152032774 0ustar ellertellert String String Stuff ././@LongLink0000644000000000000000000000023400000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceStrictOther/echoExtendedSequenceStrictOther-ExtendedSequenceStrictOther01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceStrictOther/echoExtend0000755000175000017500000000236312653650152033041 0ustar ellertellert String String Stuff ././@LongLink0000644000000000000000000000024300000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceStrictOther/echoExtendedSequenceStrictOther-ExtendedSequenceStrictOther01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceStrictOther/echoExtend0000755000175000017500000000270412653650152033040 0ustar ellertellert String String Stuff ././@LongLink0000644000000000000000000000024300000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceStrictOther/echoExtendedSequenceStrictOther-ExtendedSequenceStrictOther01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceStrictOther/echoExtend0000755000175000017500000000270212653650152033036 0ustar ellertellert String String Stuff gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerEnumerationType/0000755000175000017500000000000012653650152031566 5ustar ellertellert././@LongLink0000644000000000000000000000024500000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerEnumerationType/echoPositiveIntegerEnumerationType-PositiveIntegerEnumerationType01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerEnumerationType/echoPos0000755000175000017500000000177312653650152033124 0ustar ellertellert 12 ././@LongLink0000644000000000000000000000025400000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerEnumerationType/echoPositiveIntegerEnumerationType-PositiveIntegerEnumerationType01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerEnumerationType/echoPos0000755000175000017500000000231712653650152033117 0ustar ellertellert 12 ././@LongLink0000644000000000000000000000024100000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerEnumerationType/PositiveIntegerEnumerationType-PositiveIntegerEnumerationType01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerEnumerationType/Positiv0000755000175000017500000000172112653650152033152 0ustar ellertellert 12././@LongLink0000644000000000000000000000025400000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerEnumerationType/echoPositiveIntegerEnumerationType-PositiveIntegerEnumerationType01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerEnumerationType/echoPos0000755000175000017500000000232112653650152033112 0ustar ellertellert 12 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteAttribute/0000755000175000017500000000000012653650154027663 5ustar ellertellert././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteAttribute/echoUnsignedByteAttribute-UnsignedByteAttribute04-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteAttribute/echoUnsignedByte0000755000175000017500000000227412653650154033055 0ustar ellertellert ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteAttribute/echoUnsignedByteAttribute-UnsignedByteAttribute02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteAttribute/echoUnsignedByte0000755000175000017500000000227312653650154033054 0ustar ellertellert ././@LongLink0000644000000000000000000000021200000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteAttribute/echoUnsignedByteAttribute-UnsignedByteAttribute03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteAttribute/echoUnsignedByte0000755000175000017500000000172012653650154033050 0ustar ellertellert ././@LongLink0000644000000000000000000000021200000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteAttribute/echoUnsignedByteAttribute-UnsignedByteAttribute02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteAttribute/echoUnsignedByte0000755000175000017500000000171712653650154033056 0ustar ellertellert ././@LongLink0000644000000000000000000000020600000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteAttribute/UnsignedByteAttribute-UnsignedByteAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteAttribute/UnsignedByteAttr0000755000175000017500000000165312653650154033051 0ustar ellertellert ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteAttribute/echoUnsignedByteAttribute-UnsignedByteAttribute01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteAttribute/echoUnsignedByte0000755000175000017500000000227512653650154033056 0ustar ellertellert ././@LongLink0000644000000000000000000000020600000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteAttribute/UnsignedByteAttribute-UnsignedByteAttribute03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteAttribute/UnsignedByteAttr0000755000175000017500000000165412653650154033052 0ustar ellertellert ././@LongLink0000644000000000000000000000021200000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteAttribute/echoUnsignedByteAttribute-UnsignedByteAttribute04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteAttribute/echoUnsignedByte0000755000175000017500000000172012653650154033050 0ustar ellertellert ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteAttribute/echoUnsignedByteAttribute-UnsignedByteAttribute01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteAttribute/echoUnsignedByte0000755000175000017500000000227312653650154033054 0ustar ellertellert ././@LongLink0000644000000000000000000000021200000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteAttribute/echoUnsignedByteAttribute-UnsignedByteAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteAttribute/echoUnsignedByte0000755000175000017500000000171712653650154033056 0ustar ellertellert ././@LongLink0000644000000000000000000000020600000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteAttribute/UnsignedByteAttribute-UnsignedByteAttribute02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteAttribute/UnsignedByteAttr0000755000175000017500000000165312653650154033051 0ustar ellertellert ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteAttribute/echoUnsignedByteAttribute-UnsignedByteAttribute03-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteAttribute/echoUnsignedByte0000755000175000017500000000227612653650154033057 0ustar ellertellert ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteAttribute/echoUnsignedByteAttribute-UnsignedByteAttribute02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteAttribute/echoUnsignedByte0000755000175000017500000000227512653650154033056 0ustar ellertellert ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteAttribute/echoUnsignedByteAttribute-UnsignedByteAttribute04-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteAttribute/echoUnsignedByte0000755000175000017500000000227612653650154033057 0ustar ellertellert ././@LongLink0000644000000000000000000000020600000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteAttribute/UnsignedByteAttribute-UnsignedByteAttribute04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteAttribute/UnsignedByteAttr0000755000175000017500000000165412653650154033052 0ustar ellertellert ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteAttribute/echoUnsignedByteAttribute-UnsignedByteAttribute03-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteAttribute/echoUnsignedByte0000755000175000017500000000227412653650154033055 0ustar ellertellert gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleEnumerationType/0000755000175000017500000000000012653650150027656 5ustar ellertellert././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleEnumerationType/echoDoubleEnumerationType-DoubleEnumerationType01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleEnumerationType/echoDoubleEnumer0000755000175000017500000000225712653650150033037 0ustar ellertellert 1267.43233E12 ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleEnumerationType/echoDoubleEnumerationType-DoubleEnumerationType01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleEnumerationType/echoDoubleEnumer0000755000175000017500000000225512653650150033035 0ustar ellertellert 1267.43233E12 ././@LongLink0000644000000000000000000000021200000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleEnumerationType/echoDoubleEnumerationType-DoubleEnumerationType01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleEnumerationType/echoDoubleEnumer0000755000175000017500000000170712653650150033036 0ustar ellertellert 1267.43233E12 ././@LongLink0000644000000000000000000000020600000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleEnumerationType/DoubleEnumerationType-DoubleEnumerationType01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleEnumerationType/DoubleEnumeratio0000755000175000017500000000164612653650150033056 0ustar ellertellert 1267.43233E12gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceChoice/0000755000175000017500000000000012653650152026260 5ustar ellertellert././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceChoice/echoSequenceChoice-SequenceChoice02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceChoice/echoSequenceChoice-Sequ0000755000175000017500000000232712653650152032647 0ustar ellertellert home home ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceChoice/echoSequenceChoice-SequenceChoice02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceChoice/echoSequenceChoice-Sequ0000755000175000017500000000173012653650152032644 0ustar ellertellert home home ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceChoice/echoSequenceChoice-SequenceChoice01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceChoice/echoSequenceChoice-Sequ0000755000175000017500000000232712653650152032647 0ustar ellertellert home home ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceChoice/echoSequenceChoice-SequenceChoice02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceChoice/echoSequenceChoice-Sequ0000755000175000017500000000233112653650152032642 0ustar ellertellert home home ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceChoice/echoSequenceChoice-SequenceChoice01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceChoice/echoSequenceChoice-Sequ0000755000175000017500000000233112653650152032642 0ustar ellertellert home home ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceChoice/echoSequenceChoice-SequenceChoice01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceChoice/echoSequenceChoice-Sequ0000755000175000017500000000173012653650152032644 0ustar ellertellert home home ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceChoice/SequenceChoice-SequenceChoice01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceChoice/SequenceChoice-Sequence0000755000175000017500000000167612653650152032651 0ustar ellertellert home home ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceChoice/SequenceChoice-SequenceChoice02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceChoice/SequenceChoice-Sequence0000755000175000017500000000167612653650152032651 0ustar ellertellert home home gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAll/0000755000175000017500000000000012653650150026275 5ustar ellertellert././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAll/echoComplexTypeAll-ComplexTypeAll01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAll/echoComplexTypeAll-Comp0000755000175000017500000000251712653650150032665 0ustar ellertellert Widget 33 Light Blue ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAll/echoComplexTypeAll-ComplexTypeAll01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAll/echoComplexTypeAll-Comp0000755000175000017500000000210012653650150032651 0ustar ellertellert Widget 33 Light Blue ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAll/echoComplexTypeAll-ComplexTypeAll02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAll/echoComplexTypeAll-Comp0000755000175000017500000000251412653650150032662 0ustar ellertellert Green 21 Widget ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAll/echoComplexTypeAll-ComplexTypeAll02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAll/echoComplexTypeAll-Comp0000755000175000017500000000207312653650150032662 0ustar ellertellert Green 21 Widget ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAll/ComplexTypeAll-ComplexTypeAll01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAll/ComplexTypeAll-ComplexT0000755000175000017500000000204012653650150032652 0ustar ellertellert Widget 33 Light Blue ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAll/ComplexTypeAll-ComplexTypeAll02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAll/ComplexTypeAll-ComplexT0000755000175000017500000000203312653650150032654 0ustar ellertellert Green 21 Widget ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAll/echoComplexTypeAll-ComplexTypeAll02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAll/echoComplexTypeAll-Comp0000755000175000017500000000251212653650150032660 0ustar ellertellert Green 21 Widget ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAll/echoComplexTypeAll-ComplexTypeAll01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAll/echoComplexTypeAll-Comp0000755000175000017500000000252112653650150032660 0ustar ellertellert Widget 33 Light Blue gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ImportTypesNamespace/0000755000175000017500000000000012653650152027511 5ustar ellertellertgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/HexBinaryAttribute/0000755000175000017500000000000012653650152027152 5ustar ellertellert././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/HexBinaryAttribute/echoHexBinaryAttribute-HexBinaryAttribute01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/HexBinaryAttribute/echoHexBinaryAttrib0000755000175000017500000000225712653650152033004 0ustar ellertellert ././@LongLink0000644000000000000000000000017500000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/HexBinaryAttribute/HexBinaryAttribute-HexBinaryAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/HexBinaryAttribute/HexBinaryAttribute-0000755000175000017500000000163212653650152032734 0ustar ellertellert ././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/HexBinaryAttribute/echoHexBinaryAttribute-HexBinaryAttribute01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/HexBinaryAttribute/echoHexBinaryAttrib0000755000175000017500000000225512653650152033002 0ustar ellertellert ././@LongLink0000644000000000000000000000020100000000000011574 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/HexBinaryAttribute/echoHexBinaryAttribute-HexBinaryAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/HexBinaryAttribute/echoHexBinaryAttrib0000755000175000017500000000167312653650152033005 0ustar ellertellert gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementFormQualified/0000755000175000017500000000000012653650150027434 5ustar ellertellert././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementFormQualified/echoElementFormQualified-ElementFormQualified01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementFormQualified/echoElementFormQu0000755000175000017500000000232112653650150032742 0ustar ellertellert 1175 ././@LongLink0000644000000000000000000000020700000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementFormQualified/echoElementFormQualified-ElementFormQualified01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementFormQualified/echoElementFormQu0000755000175000017500000000174012653650150032746 0ustar ellertellert 1175 ././@LongLink0000644000000000000000000000020300000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementFormQualified/ElementFormQualified-ElementFormQualified01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementFormQualified/ElementFormQualif0000755000175000017500000000170012653650150032737 0ustar ellertellert 1175 ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementFormQualified/echoElementFormQualified-ElementFormQualified01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementFormQualified/echoElementFormQu0000755000175000017500000000231712653650150032747 0ustar ellertellert 1175 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexTypeAbstract/0000755000175000017500000000000012653650152030453 5ustar ellertellert././@LongLink0000644000000000000000000000023100000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexTypeAbstract/GlobalComplexTypeAbstract-GlobalComplexTypeAbstractExample01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexTypeAbstract/GlobalComple0000755000175000017500000000173612653650152032750 0ustar ellertellert 1175 ././@LongLink0000644000000000000000000000024400000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexTypeAbstract/echoGlobalComplexTypeAbstract-GlobalComplexTypeAbstractExample01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexTypeAbstract/echoGlobalCo0000755000175000017500000000235012653650152032722 0ustar ellertellert 1175 ././@LongLink0000644000000000000000000000024400000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexTypeAbstract/echoGlobalComplexTypeAbstract-GlobalComplexTypeAbstractExample01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexTypeAbstract/echoGlobalCo0000755000175000017500000000235212653650152032724 0ustar ellertellert 1175 ././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexTypeAbstract/echoGlobalComplexTypeAbstract-GlobalComplexTypeAbstractExample01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexTypeAbstract/echoGlobalCo0000755000175000017500000000200312653650152032715 0ustar ellertellert 1175 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeOtherStrict/0000755000175000017500000000000012653650150030201 5ustar ellertellert././@LongLink0000644000000000000000000000021400000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeOtherStrict/AnyAttributeOtherStrict-AnyAttributeOtherStrict01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeOtherStrict/AnyAttributeOt0000755000175000017500000000220312653650150033042 0ustar ellertellert String String ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeOtherStrict/echoAnyAttributeOtherStrict-AnyAttributeOtherStrict01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeOtherStrict/echoAnyAttribu0000755000175000017500000000260012653650150033046 0ustar ellertellert String String ././@LongLink0000644000000000000000000000022000000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeOtherStrict/echoAnyAttributeOtherStrict-AnyAttributeOtherStrict01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeOtherStrict/echoAnyAttribu0000755000175000017500000000225412653650150033053 0ustar ellertellert String String ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeOtherStrict/echoAnyAttributeOtherStrict-AnyAttributeOtherStrict01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeOtherStrict/echoAnyAttribu0000755000175000017500000000260212653650150033050 0ustar ellertellert String String gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongAttribute/0000755000175000017500000000000012653650154027657 5ustar ellertellert././@LongLink0000644000000000000000000000020600000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongAttribute/UnsignedLongAttribute-UnsignedLongAttribute02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongAttribute/UnsignedLongAttr0000755000175000017500000000165312653650154033041 0ustar ellertellert ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongAttribute/echoUnsignedLongAttribute-UnsignedLongAttribute04-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongAttribute/echoUnsignedLong0000755000175000017500000000231712653650154033043 0ustar ellertellert ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongAttribute/echoUnsignedLongAttribute-UnsignedLongAttribute01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongAttribute/echoUnsignedLong0000755000175000017500000000227512653650154033046 0ustar ellertellert ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongAttribute/echoUnsignedLongAttribute-UnsignedLongAttribute03-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongAttribute/echoUnsignedLong0000755000175000017500000000227612653650154033047 0ustar ellertellert ././@LongLink0000644000000000000000000000021200000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongAttribute/echoUnsignedLongAttribute-UnsignedLongAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongAttribute/echoUnsignedLong0000755000175000017500000000172112653650154033041 0ustar ellertellert ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongAttribute/echoUnsignedLongAttribute-UnsignedLongAttribute03-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongAttribute/echoUnsignedLong0000755000175000017500000000227412653650154033045 0ustar ellertellert ././@LongLink0000644000000000000000000000020600000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongAttribute/UnsignedLongAttribute-UnsignedLongAttribute04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongAttribute/UnsignedLongAttr0000755000175000017500000000167512653650154033045 0ustar ellertellert ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongAttribute/echoUnsignedLongAttribute-UnsignedLongAttribute02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongAttribute/echoUnsignedLong0000755000175000017500000000227312653650154033044 0ustar ellertellert ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongAttribute/echoUnsignedLongAttribute-UnsignedLongAttribute01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongAttribute/echoUnsignedLong0000755000175000017500000000227712653650154033050 0ustar ellertellert ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongAttribute/echoUnsignedLongAttribute-UnsignedLongAttribute04-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongAttribute/echoUnsignedLong0000755000175000017500000000231512653650154033041 0ustar ellertellert ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongAttribute/echoUnsignedLongAttribute-UnsignedLongAttribute02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongAttribute/echoUnsignedLong0000755000175000017500000000227512653650154033046 0ustar ellertellert ././@LongLink0000644000000000000000000000020600000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongAttribute/UnsignedLongAttribute-UnsignedLongAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongAttribute/UnsignedLongAttr0000755000175000017500000000165512653650154033043 0ustar ellertellert ././@LongLink0000644000000000000000000000020600000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongAttribute/UnsignedLongAttribute-UnsignedLongAttribute03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongAttribute/UnsignedLongAttr0000755000175000017500000000165412653650154033042 0ustar ellertellert ././@LongLink0000644000000000000000000000021200000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongAttribute/echoUnsignedLongAttribute-UnsignedLongAttribute02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongAttribute/echoUnsignedLong0000755000175000017500000000171712653650154033046 0ustar ellertellert ././@LongLink0000644000000000000000000000021200000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongAttribute/echoUnsignedLongAttribute-UnsignedLongAttribute03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongAttribute/echoUnsignedLong0000755000175000017500000000172012653650154033040 0ustar ellertellert ././@LongLink0000644000000000000000000000021200000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongAttribute/echoUnsignedLongAttribute-UnsignedLongAttribute04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongAttribute/echoUnsignedLong0000755000175000017500000000174112653650154033043 0ustar ellertellert gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatSimpleTypePattern/0000755000175000017500000000000012653650152030014 5ustar ellertellert././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatSimpleTypePattern/echoFloatSimpleTypePattern-FloatSimpleTypePattern02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatSimpleTypePattern/echoFloatSimple0000755000175000017500000000170412653650152033022 0ustar ellertellert 009 ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatSimpleTypePattern/echoFloatSimpleTypePattern-FloatSimpleTypePattern02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatSimpleTypePattern/echoFloatSimple0000755000175000017500000000225212653650152033021 0ustar ellertellert 009 ././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatSimpleTypePattern/FloatSimpleTypePattern-FloatSimpleTypePattern02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatSimpleTypePattern/FloatSimpleType0000755000175000017500000000164212653650152033026 0ustar ellertellert 009././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatSimpleTypePattern/echoFloatSimpleTypePattern-FloatSimpleTypePattern01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatSimpleTypePattern/echoFloatSimple0000755000175000017500000000225212653650152033021 0ustar ellertellert 123 ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatSimpleTypePattern/echoFloatSimpleTypePattern-FloatSimpleTypePattern02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatSimpleTypePattern/echoFloatSimple0000755000175000017500000000225012653650152033017 0ustar ellertellert 009 ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatSimpleTypePattern/echoFloatSimpleTypePattern-FloatSimpleTypePattern01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatSimpleTypePattern/echoFloatSimple0000755000175000017500000000225012653650152033017 0ustar ellertellert 123 ././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatSimpleTypePattern/echoFloatSimpleTypePattern-FloatSimpleTypePattern01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatSimpleTypePattern/echoFloatSimple0000755000175000017500000000170412653650152033022 0ustar ellertellert 123 ././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatSimpleTypePattern/FloatSimpleTypePattern-FloatSimpleTypePattern01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatSimpleTypePattern/FloatSimpleType0000755000175000017500000000164212653650152033026 0ustar ellertellert 123gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongEnumerationType/0000755000175000017500000000000012653650152027345 5ustar ellertellert././@LongLink0000644000000000000000000000020400000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongEnumerationType/echoLongEnumerationType-LongEnumerationType01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongEnumerationType/echoLongEnumeratio0000755000175000017500000000166312653650152033070 0ustar ellertellert 9152052 ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongEnumerationType/echoLongEnumerationType-LongEnumerationType01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongEnumerationType/echoLongEnumeratio0000755000175000017500000000223712653650152033066 0ustar ellertellert 9152052 ././@LongLink0000644000000000000000000000020000000000000011573 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongEnumerationType/LongEnumerationType-LongEnumerationType01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongEnumerationType/LongEnumerationTyp0000755000175000017500000000162412653650152033101 0ustar ellertellert 9152052././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongEnumerationType/echoLongEnumerationType-LongEnumerationType01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongEnumerationType/echoLongEnumeratio0000755000175000017500000000223512653650152033064 0ustar ellertellert 9152052 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LanguageElement/0000755000175000017500000000000012653650152026432 5ustar ellertellert././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LanguageElement/echoLanguageElement-LanguageElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LanguageElement/echoLanguageElement-La0000755000175000017500000000162212653650152032607 0ustar ellertellert fr ././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LanguageElement/LanguageElement-LanguageElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LanguageElement/LanguageElement-Langua0000755000175000017500000000156712653650152032633 0ustar ellertellert en././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LanguageElement/echoLanguageElement-LanguageElement01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LanguageElement/echoLanguageElement-La0000755000175000017500000000220612653650152032606 0ustar ellertellert en ././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LanguageElement/LanguageElement-LanguageElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LanguageElement/LanguageElement-Langua0000755000175000017500000000156712653650152032633 0ustar ellertellert fr././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LanguageElement/echoLanguageElement-LanguageElement02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LanguageElement/echoLanguageElement-La0000755000175000017500000000220412653650152032604 0ustar ellertellert fr ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LanguageElement/echoLanguageElement-LanguageElement01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LanguageElement/echoLanguageElement-La0000755000175000017500000000220412653650152032604 0ustar ellertellert en ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LanguageElement/echoLanguageElement-LanguageElement02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LanguageElement/echoLanguageElement-La0000755000175000017500000000220612653650152032606 0ustar ellertellert fr ././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LanguageElement/echoLanguageElement-LanguageElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LanguageElement/echoLanguageElement-La0000755000175000017500000000162212653650152032607 0ustar ellertellert en gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ByteElement/0000755000175000017500000000000012653650150025610 5ustar ellertellert././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ByteElement/echoByteElement-ByteElement02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ByteElement/echoByteElement-ByteElemen0000755000175000017500000000216112653650150032641 0ustar ellertellert 127 ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ByteElement/echoByteElement-ByteElement03-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ByteElement/echoByteElement-ByteElemen0000755000175000017500000000216212653650150032642 0ustar ellertellert -128 ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ByteElement/ByteElement-ByteElement03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ByteElement/ByteElement-ByteElement03.0000755000175000017500000000154112653650150032410 0ustar ellertellert -128././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ByteElement/echoByteElement-ByteElement02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ByteElement/echoByteElement-ByteElemen0000755000175000017500000000216312653650150032643 0ustar ellertellert 127 ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ByteElement/echoByteElement-ByteElement03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ByteElement/echoByteElement-ByteElemen0000755000175000017500000000157012653650150032644 0ustar ellertellert -128 ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ByteElement/ByteElement-ByteElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ByteElement/ByteElement-ByteElement02.0000755000175000017500000000154012653650150032406 0ustar ellertellert 127././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ByteElement/echoByteElement-ByteElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ByteElement/echoByteElement-ByteElemen0000755000175000017500000000156712653650150032652 0ustar ellertellert 127 ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ByteElement/ByteElement-ByteElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ByteElement/ByteElement-ByteElement01.0000755000175000017500000000153612653650150032412 0ustar ellertellert 1././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ByteElement/echoByteElement-ByteElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ByteElement/echoByteElement-ByteElemen0000755000175000017500000000156512653650150032650 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ByteElement/echoByteElement-ByteElement01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ByteElement/echoByteElement-ByteElemen0000755000175000017500000000215712653650150032646 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ByteElement/echoByteElement-ByteElement03-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ByteElement/echoByteElement-ByteElemen0000755000175000017500000000216412653650150032644 0ustar ellertellert -128 ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ByteElement/echoByteElement-ByteElement01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ByteElement/echoByteElement-ByteElemen0000755000175000017500000000216112653650150032641 0ustar ellertellert 1 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementSequenceAny/0000755000175000017500000000000012653650152030250 5ustar ellertellert././@LongLink0000644000000000000000000000023200000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementSequenceAny/echoGlobalElementSequenceAny-GlobalElementSequenceAny01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementSequenceAny/echoGlobalEle0000755000175000017500000000234412653650152032666 0ustar ellertellert some data ././@LongLink0000644000000000000000000000023200000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementSequenceAny/echoGlobalElementSequenceAny-GlobalElementSequenceAny01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementSequenceAny/echoGlobalEle0000755000175000017500000000234612653650152032670 0ustar ellertellert some data ././@LongLink0000644000000000000000000000022300000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementSequenceAny/echoGlobalElementSequenceAny-GlobalElementSequenceAny01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementSequenceAny/echoGlobalEle0000755000175000017500000000177512653650152032675 0ustar ellertellert some data ././@LongLink0000644000000000000000000000021700000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementSequenceAny/GlobalElementSequenceAny-GlobalElementSequenceAny01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementSequenceAny/GlobalElement0000755000175000017500000000173112653650152032712 0ustar ellertellert some data gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalSimpleType/0000755000175000017500000000000012653650152026611 5ustar ellertellert././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalSimpleType/echoGlobalSimpleType-GlobalSimpleType01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalSimpleType/echoGlobalSimpleType-0000755000175000017500000000221212653650152032664 0ustar ellertellert foo ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalSimpleType/echoGlobalSimpleType-GlobalSimpleType01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalSimpleType/echoGlobalSimpleType-0000755000175000017500000000221412653650152032666 0ustar ellertellert foo ././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalSimpleType/echoGlobalSimpleType-GlobalSimpleType01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalSimpleType/echoGlobalSimpleType-0000755000175000017500000000163212653650152032671 0ustar ellertellert foo ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalSimpleType/GlobalSimpleType-GlobalSimpleType01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalSimpleType/GlobalSimpleType-Glob0000755000175000017500000000157612653650152032645 0ustar ellertellert foogsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementReference/0000755000175000017500000000000012653650152026605 5ustar ellertellert././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementReference/echoElementReference-ElementReference01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementReference/echoElementReference-0000755000175000017500000000233712653650152032664 0ustar ellertellert Bobby Sox ././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementReference/echoElementReference-ElementReference01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementReference/echoElementReference-0000755000175000017500000000173412653650152032664 0ustar ellertellert Bobby Sox ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementReference/echoElementReference-ElementReference01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementReference/echoElementReference-0000755000175000017500000000234112653650152032657 0ustar ellertellert Bobby Sox ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementReference/ElementReference-ElementReference01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementReference/ElementReference-Elem0000755000175000017500000000167412653650152032633 0ustar ellertellert Bobby Sox gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ENTITYElement/0000755000175000017500000000000012653650152025723 5ustar ellertellert././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ENTITYElement/ENTITYElement-ENTITYElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ENTITYElement/ENTITYElement-ENTITYElem0000755000175000017500000000155312653650152032020 0ustar ellertellert lt././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ENTITYElement/echoENTITYElement-ENTITYElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ENTITYElement/echoENTITYElement-ENTITY0000755000175000017500000000160412653650152032051 0ustar ellertellert lt ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ENTITYElement/echoENTITYElement-ENTITYElement01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ENTITYElement/echoENTITYElement-ENTITY0000755000175000017500000000217412653650152032054 0ustar ellertellert lt ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ENTITYElement/echoENTITYElement-ENTITYElement01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ENTITYElement/echoENTITYElement-ENTITY0000755000175000017500000000217212653650152032052 0ustar ellertellert lt gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccurs0/0000755000175000017500000000000012653650150026470 5ustar ellertellert././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccurs0/echoChoiceMinOccurs0-ChoiceMinOccurs003-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccurs0/echoChoiceMinOccurs0-0000755000175000017500000000216412653650150032432 0ustar ellertellert ././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccurs0/echoChoiceMinOccurs0-ChoiceMinOccurs003.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccurs0/echoChoiceMinOccurs0-0000755000175000017500000000160212653650150032426 0ustar ellertellert ././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccurs0/echoChoiceMinOccurs0-ChoiceMinOccurs001.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccurs0/echoChoiceMinOccurs0-0000755000175000017500000000172512653650150032434 0ustar ellertellert A ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccurs0/ChoiceMinOccurs0-ChoiceMinOccurs003.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccurs0/ChoiceMinOccurs0-Choi0000755000175000017500000000154612653650150032401 0ustar ellertellert ././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccurs0/echoChoiceMinOccurs0-ChoiceMinOccurs002.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccurs0/echoChoiceMinOccurs0-0000755000175000017500000000172512653650150032434 0ustar ellertellert B ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccurs0/ChoiceMinOccurs0-ChoiceMinOccurs001.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccurs0/ChoiceMinOccurs0-Choi0000755000175000017500000000167112653650150032400 0ustar ellertellert A ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccurs0/ChoiceMinOccurs0-ChoiceMinOccurs002.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccurs0/ChoiceMinOccurs0-Choi0000755000175000017500000000167112653650150032400 0ustar ellertellert B ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccurs0/echoChoiceMinOccurs0-ChoiceMinOccurs001-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccurs0/echoChoiceMinOccurs0-0000755000175000017500000000231412653650150032427 0ustar ellertellert A ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccurs0/echoChoiceMinOccurs0-ChoiceMinOccurs002-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccurs0/echoChoiceMinOccurs0-0000755000175000017500000000231412653650150032427 0ustar ellertellert B ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccurs0/echoChoiceMinOccurs0-ChoiceMinOccurs003-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccurs0/echoChoiceMinOccurs0-0000755000175000017500000000216212653650150032430 0ustar ellertellert ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccurs0/echoChoiceMinOccurs0-ChoiceMinOccurs001-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccurs0/echoChoiceMinOccurs0-0000755000175000017500000000231612653650150032431 0ustar ellertellert A ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccurs0/echoChoiceMinOccurs0-ChoiceMinOccurs002-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccurs0/echoChoiceMinOccurs0-0000755000175000017500000000231612653650150032431 0ustar ellertellert B gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortSimpleTypePattern/0000755000175000017500000000000012653650154031545 5ustar ellertellert././@LongLink0000644000000000000000000000025400000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortSimpleTypePattern/echoUnsignedShortSimpleTypePattern-UnsignedShortSimpleTypePattern02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortSimpleTypePattern/echoUns0000755000175000017500000000232212653650154033076 0ustar ellertellert 009 ././@LongLink0000644000000000000000000000024500000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortSimpleTypePattern/echoUnsignedShortSimpleTypePattern-UnsignedShortSimpleTypePattern02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortSimpleTypePattern/echoUns0000755000175000017500000000177412653650154033110 0ustar ellertellert 009 ././@LongLink0000644000000000000000000000024100000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortSimpleTypePattern/UnsignedShortSimpleTypePattern-UnsignedShortSimpleTypePattern01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortSimpleTypePattern/Unsigne0000755000175000017500000000172212653650154033105 0ustar ellertellert 123././@LongLink0000644000000000000000000000025400000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortSimpleTypePattern/echoUnsignedShortSimpleTypePattern-UnsignedShortSimpleTypePattern01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortSimpleTypePattern/echoUns0000755000175000017500000000232212653650154033076 0ustar ellertellert 123 ././@LongLink0000644000000000000000000000024100000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortSimpleTypePattern/UnsignedShortSimpleTypePattern-UnsignedShortSimpleTypePattern02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortSimpleTypePattern/Unsigne0000755000175000017500000000172212653650154033105 0ustar ellertellert 009././@LongLink0000644000000000000000000000024500000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortSimpleTypePattern/echoUnsignedShortSimpleTypePattern-UnsignedShortSimpleTypePattern01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortSimpleTypePattern/echoUns0000755000175000017500000000177412653650154033110 0ustar ellertellert 123 ././@LongLink0000644000000000000000000000025400000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortSimpleTypePattern/echoUnsignedShortSimpleTypePattern-UnsignedShortSimpleTypePattern01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortSimpleTypePattern/echoUns0000755000175000017500000000232012653650154033074 0ustar ellertellert 123 ././@LongLink0000644000000000000000000000025400000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortSimpleTypePattern/echoUnsignedShortSimpleTypePattern-UnsignedShortSimpleTypePattern02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortSimpleTypePattern/echoUns0000755000175000017500000000232012653650154033074 0ustar ellertellert 009 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NegativeIntegerAttribute/0000755000175000017500000000000012653650152030341 5ustar ellertellert././@LongLink0000644000000000000000000000021700000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NegativeIntegerAttribute/NegativeIntegerAttribute-NegativeIntegerAttribute02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NegativeIntegerAttribute/NegativeInteg0000755000175000017500000000175312653650152033026 0ustar ellertellert ././@LongLink0000644000000000000000000000023200000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NegativeIntegerAttribute/echoNegativeIntegerAttribute-NegativeIntegerAttribute01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NegativeIntegerAttribute/echoNegativeI0000755000175000017500000000231712653650152033004 0ustar ellertellert ././@LongLink0000644000000000000000000000022300000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NegativeIntegerAttribute/echoNegativeIntegerAttribute-NegativeIntegerAttribute02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NegativeIntegerAttribute/echoNegativeI0000755000175000017500000000202212653650152032775 0ustar ellertellert ././@LongLink0000644000000000000000000000023200000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NegativeIntegerAttribute/echoNegativeIntegerAttribute-NegativeIntegerAttribute02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NegativeIntegerAttribute/echoNegativeI0000755000175000017500000000237012653650152033003 0ustar ellertellert ././@LongLink0000644000000000000000000000022300000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NegativeIntegerAttribute/echoNegativeIntegerAttribute-NegativeIntegerAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NegativeIntegerAttribute/echoNegativeI0000755000175000017500000000175112653650152033005 0ustar ellertellert ././@LongLink0000644000000000000000000000023200000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NegativeIntegerAttribute/echoNegativeIntegerAttribute-NegativeIntegerAttribute01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NegativeIntegerAttribute/echoNegativeI0000755000175000017500000000232112653650152032777 0ustar ellertellert ././@LongLink0000644000000000000000000000021700000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NegativeIntegerAttribute/NegativeIntegerAttribute-NegativeIntegerAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NegativeIntegerAttribute/NegativeInteg0000755000175000017500000000170212653650152033020 0ustar ellertellert ././@LongLink0000644000000000000000000000023200000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NegativeIntegerAttribute/echoNegativeIntegerAttribute-NegativeIntegerAttribute02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NegativeIntegerAttribute/echoNegativeI0000755000175000017500000000237212653650152033005 0ustar ellertellert gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementAbstract/0000755000175000017500000000000012653650152027573 5ustar ellertellert././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementAbstract/echoGlobalElementAbstract-GlobalElementAbstract01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementAbstract/echoGlobalElemen0000755000175000017500000000237212653650152032712 0ustar ellertellert String ././@LongLink0000644000000000000000000000020600000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementAbstract/GlobalElementAbstract-GlobalElementAbstract01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementAbstract/GlobalElementAbs0000755000175000017500000000175212653650152032666 0ustar ellertellert String ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementAbstract/echoGlobalElementAbstract-GlobalElementAbstract01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementAbstract/echoGlobalElemen0000755000175000017500000000237012653650152032710 0ustar ellertellert String ././@LongLink0000644000000000000000000000021200000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementAbstract/echoGlobalElementAbstract-GlobalElementAbstract01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementAbstract/echoGlobalElemen0000755000175000017500000000201312653650152032702 0ustar ellertellert String gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceAnyStrict/0000755000175000017500000000000012653650152027006 5ustar ellertellert././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceAnyStrict/echoSequenceAnyStrict-SequenceAnyStrict01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceAnyStrict/echoSequenceAnyStric0000755000175000017500000000230412653650152033017 0ustar ellertellert string ././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceAnyStrict/echoSequenceAnyStrict-SequenceAnyStrict01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceAnyStrict/echoSequenceAnyStric0000755000175000017500000000171712653650152033026 0ustar ellertellert string ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceAnyStrict/echoSequenceAnyStrict-SequenceAnyStrict01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceAnyStrict/echoSequenceAnyStric0000755000175000017500000000230612653650152033021 0ustar ellertellert string ././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceAnyStrict/SequenceAnyStrict-SequenceAnyStrict01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceAnyStrict/SequenceAnyStrict-Se0000755000175000017500000000166212653650152032717 0ustar ellertellert string gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceStrict/0000755000175000017500000000000012653650152030017 5ustar ellertellert././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceStrict/echoExtendedSequenceStrict-ExtendedSequenceStrict02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceStrict/echoExtendedSeq0000755000175000017500000000263712653650152033025 0ustar ellertellert Bobby Sox William Mr ././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceStrict/echoExtendedSequenceStrict-ExtendedSequenceStrict02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceStrict/echoExtendedSeq0000755000175000017500000000223412653650152033016 0ustar ellertellert Bobby Sox William Mr ././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceStrict/echoExtendedSequenceStrict-ExtendedSequenceStrict01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceStrict/echoExtendedSeq0000755000175000017500000000203212653650152033012 0ustar ellertellert Bobby Sox ././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceStrict/ExtendedSequenceStrict-ExtendedSequenceStrict02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceStrict/ExtendedSequenc0000755000175000017500000000217212653650152033033 0ustar ellertellert Bobby Sox William Mr ././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceStrict/ExtendedSequenceStrict-ExtendedSequenceStrict01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceStrict/ExtendedSequenc0000755000175000017500000000177012653650152033036 0ustar ellertellert Bobby Sox ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceStrict/echoExtendedSequenceStrict-ExtendedSequenceStrict02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceStrict/echoExtendedSeq0000755000175000017500000000263512653650152033023 0ustar ellertellert Bobby Sox William Mr ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceStrict/echoExtendedSequenceStrict-ExtendedSequenceStrict01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceStrict/echoExtendedSeq0000755000175000017500000000241312653650152033015 0ustar ellertellert Bobby Sox ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceStrict/echoExtendedSequenceStrict-ExtendedSequenceStrict01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceStrict/echoExtendedSeq0000755000175000017500000000241112653650152033013 0ustar ellertellert Bobby Sox gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENSElement/0000755000175000017500000000000012653650152026145 5ustar ellertellert././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENSElement/echoNMTOKENSElement-NMTOKENSElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENSElement/echoNMTOKENSElement-NM0000755000175000017500000000164312653650152032016 0ustar ellertellert a b c d e.b:s-w_x:q ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENSElement/echoNMTOKENSElement-NMTOKENSElement01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENSElement/echoNMTOKENSElement-NM0000755000175000017500000000222512653650152032013 0ustar ellertellert a b c d e.b:s-w_x:q ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENSElement/echoNMTOKENSElement-NMTOKENSElement01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENSElement/echoNMTOKENSElement-NM0000755000175000017500000000222712653650152032015 0ustar ellertellert a b c d e.b:s-w_x:q ././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENSElement/NMTOKENSElement-NMTOKENSElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENSElement/NMTOKENSElement-NMTOKE0000755000175000017500000000161012653650152031634 0ustar ellertellert a b c d e.b:s-w_x:qgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceElement/0000755000175000017500000000000012653650152026457 5ustar ellertellert././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceElement/echoSequenceElement-SequenceElement01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceElement/echoSequenceElement-Se0000755000175000017500000000243612653650152032700 0ustar ellertellert element1 element2 element3 ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceElement/echoSequenceElement-SequenceElement01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceElement/echoSequenceElement-Se0000755000175000017500000000243412653650152032676 0ustar ellertellert element1 element2 element3 ././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceElement/echoSequenceElement-SequenceElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceElement/echoSequenceElement-Se0000755000175000017500000000203312653650152032671 0ustar ellertellert element1 element2 element3 ././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceElement/SequenceElement-SequenceElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceElement/SequenceElement-Sequen0000755000175000017500000000200012653650152032715 0ustar ellertellert element1 element2 element3 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayElement/0000755000175000017500000000000012653650152026541 5ustar ellertellert././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayElement/echoGMonthDayElement-GMonthDayElement04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayElement/echoGMonthDayElement-0000755000175000017500000000164412653650152032554 0ustar ellertellert --12-31+01:00 ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayElement/echoGMonthDayElement-GMonthDayElement04-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayElement/echoGMonthDayElement-0000755000175000017500000000222412653650152032547 0ustar ellertellert --12-31+01:00 ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayElement/echoGMonthDayElement-GMonthDayElement04-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayElement/echoGMonthDayElement-0000755000175000017500000000222612653650152032551 0ustar ellertellert --12-31+01:00 ././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayElement/echoGMonthDayElement-GMonthDayElement03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayElement/echoGMonthDayElement-0000755000175000017500000000164412653650152032554 0ustar ellertellert --12-31-05:00 ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayElement/GMonthDayElement-GMonthDayElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayElement/GMonthDayElement-GMon0000755000175000017500000000160312653650152032471 0ustar ellertellert --12-31Z././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayElement/echoGMonthDayElement-GMonthDayElement02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayElement/echoGMonthDayElement-0000755000175000017500000000222112653650152032544 0ustar ellertellert --12-31Z ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayElement/echoGMonthDayElement-GMonthDayElement01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayElement/echoGMonthDayElement-0000755000175000017500000000222012653650152032543 0ustar ellertellert --12-31 ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayElement/GMonthDayElement-GMonthDayElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayElement/GMonthDayElement-GMon0000755000175000017500000000160212653650152032470 0ustar ellertellert --12-31././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayElement/echoGMonthDayElement-GMonthDayElement03-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayElement/echoGMonthDayElement-0000755000175000017500000000222612653650152032551 0ustar ellertellert --12-31-05:00 ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayElement/GMonthDayElement-GMonthDayElement04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayElement/GMonthDayElement-GMon0000755000175000017500000000161012653650152032467 0ustar ellertellert --12-31+01:00././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayElement/echoGMonthDayElement-GMonthDayElement01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayElement/echoGMonthDayElement-0000755000175000017500000000221612653650152032550 0ustar ellertellert --12-31 ././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayElement/echoGMonthDayElement-GMonthDayElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayElement/echoGMonthDayElement-0000755000175000017500000000163612653650152032555 0ustar ellertellert --12-31 ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayElement/GMonthDayElement-GMonthDayElement03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayElement/GMonthDayElement-GMon0000755000175000017500000000161012653650152032467 0ustar ellertellert --12-31-05:00././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayElement/echoGMonthDayElement-GMonthDayElement03-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayElement/echoGMonthDayElement-0000755000175000017500000000222412653650152032547 0ustar ellertellert --12-31-05:00 ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayElement/echoGMonthDayElement-GMonthDayElement02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayElement/echoGMonthDayElement-0000755000175000017500000000221712653650152032551 0ustar ellertellert --12-31Z ././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayElement/echoGMonthDayElement-GMonthDayElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayElement/echoGMonthDayElement-0000755000175000017500000000163712653650152032556 0ustar ellertellert --12-31Z gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementBlock/0000755000175000017500000000000012653650152027062 5ustar ellertellert././@LongLink0000644000000000000000000000020400000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementBlock/GlobalElementBlock-GlobalElementBlockExample01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementBlock/GlobalElementBlock-0000755000175000017500000000161412653650152032554 0ustar ellertellert Stuff././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementBlock/echoGlobalElementBlock-GlobalElementBlockExample01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementBlock/echoGlobalElementBl0000755000175000017500000000165212653650152032643 0ustar ellertellert Stuff ././@LongLink0000644000000000000000000000021700000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementBlock/echoGlobalElementBlock-GlobalElementBlockExample01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementBlock/echoGlobalElementBl0000755000175000017500000000223012653650152032634 0ustar ellertellert Stuff ././@LongLink0000644000000000000000000000021700000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementBlock/echoGlobalElementBlock-GlobalElementBlockExample01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementBlock/echoGlobalElementBl0000755000175000017500000000222612653650152032641 0ustar ellertellert Stuff gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeOnlyAttributes/0000755000175000017500000000000012653650150030555 5ustar ellertellert././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeOnlyAttributes/echoComplexTypeOnlyAttributes-ComplexTypeOnlyAttributes01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeOnlyAttributes/echoComplexT0000755000175000017500000000240012653650150033071 0ustar ellertellert ././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeOnlyAttributes/echoComplexTypeOnlyAttributes-ComplexTypeOnlyAttributes01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeOnlyAttributes/echoComplexT0000755000175000017500000000237612653650150033105 0ustar ellertellert ././@LongLink0000644000000000000000000000022200000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeOnlyAttributes/ComplexTypeOnlyAttributes-ComplexTypeOnlyAttributes01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeOnlyAttributes/ComplexTypeO0000755000175000017500000000175112653650150033077 0ustar ellertellert ././@LongLink0000644000000000000000000000022600000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeOnlyAttributes/echoComplexTypeOnlyAttributes-ComplexTypeOnlyAttributes01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeOnlyAttributes/echoComplexT0000755000175000017500000000202412653650150033073 0ustar ellertellert gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementDefault/0000755000175000017500000000000012653650150026271 5ustar ellertellert././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementDefault/echoElementDefault-ElementDefault01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementDefault/echoElementDefault-Elem0000755000175000017500000000226612653650150032642 0ustar ellertellert default ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementDefault/ElementDefault-ElementDefault01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementDefault/ElementDefault-ElementD0000755000175000017500000000163712653650150032617 0ustar ellertellert default ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementDefault/echoElementDefault-ElementDefault02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementDefault/echoElementDefault-Elem0000755000175000017500000000167512653650150032645 0ustar ellertellert wrong value ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementDefault/echoElementDefault-ElementDefault01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementDefault/echoElementDefault-Elem0000755000175000017500000000167112653650150032641 0ustar ellertellert default ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementDefault/echoElementDefault-ElementDefault02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementDefault/echoElementDefault-Elem0000755000175000017500000000227212653650150032637 0ustar ellertellert wrong value ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementDefault/ElementDefault-ElementDefault02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementDefault/ElementDefault-ElementD0000755000175000017500000000164312653650150032614 0ustar ellertellert wrong value ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementDefault/echoElementDefault-ElementDefault02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementDefault/echoElementDefault-Elem0000755000175000017500000000227012653650150032635 0ustar ellertellert wrong value ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementDefault/echoElementDefault-ElementDefault01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementDefault/echoElementDefault-Elem0000755000175000017500000000226412653650150032640 0ustar ellertellert default gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeOptional/0000755000175000017500000000000012653650150027044 5ustar ellertellert././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeOptional/echoAttributeOptional-AttributeOptional02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeOptional/echoAttributeOptiona0000755000175000017500000000175412653650150033135 0ustar ellertellert 1250 ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeOptional/echoAttributeOptional-AttributeOptional01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeOptional/echoAttributeOptiona0000755000175000017500000000242512653650150033131 0ustar ellertellert 1250 ././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeOptional/AttributeOptional-AttributeOptional02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeOptional/AttributeOptional-At0000755000175000017500000000171412653650150033010 0ustar ellertellert 1250 ././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeOptional/echoAttributeOptional-AttributeOptional01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeOptional/echoAttributeOptiona0000755000175000017500000000202412653650150033124 0ustar ellertellert 1250 ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeOptional/echoAttributeOptional-AttributeOptional02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeOptional/echoAttributeOptiona0000755000175000017500000000235112653650150033127 0ustar ellertellert 1250 ././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeOptional/AttributeOptional-AttributeOptional01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeOptional/AttributeOptional-At0000755000175000017500000000176112653650150033012 0ustar ellertellert 1250 ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeOptional/echoAttributeOptional-AttributeOptional01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeOptional/echoAttributeOptiona0000755000175000017500000000242712653650150033133 0ustar ellertellert 1250 ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeOptional/echoAttributeOptional-AttributeOptional02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeOptional/echoAttributeOptiona0000755000175000017500000000234712653650150033134 0ustar ellertellert 1250 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntEnumerationType/0000755000175000017500000000000012653650154030677 5ustar ellertellert././@LongLink0000644000000000000000000000022500000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntEnumerationType/UnsignedIntEnumerationType-UnsignedIntEnumerationType01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntEnumerationType/UnsignedInt0000755000175000017500000000170112653650154033053 0ustar ellertellert 3333333333././@LongLink0000644000000000000000000000024000000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntEnumerationType/echoUnsignedIntEnumerationType-UnsignedIntEnumerationType01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntEnumerationType/echoUnsigne0000755000175000017500000000230312653650154033072 0ustar ellertellert 3333333333 ././@LongLink0000644000000000000000000000024000000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntEnumerationType/echoUnsignedIntEnumerationType-UnsignedIntEnumerationType01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntEnumerationType/echoUnsigne0000755000175000017500000000230512653650154033074 0ustar ellertellert 3333333333 ././@LongLink0000644000000000000000000000023100000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntEnumerationType/echoUnsignedIntEnumerationType-UnsignedIntEnumerationType01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntEnumerationType/echoUnsigne0000755000175000017500000000174712653650154033105 0ustar ellertellert 3333333333 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BlockDefault/0000755000175000017500000000000012653650150025732 5ustar ellertellert././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BlockDefault/echoBlockDefault-BlockDefault01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BlockDefault/echoBlockDefault-BlockDef0000755000175000017500000000217012653650150032525 0ustar ellertellert foo ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BlockDefault/echoBlockDefault-BlockDefault01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BlockDefault/echoBlockDefault-BlockDef0000755000175000017500000000216612653650150032532 0ustar ellertellert foo ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BlockDefault/echoBlockDefault-BlockDefault01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BlockDefault/echoBlockDefault-BlockDef0000755000175000017500000000157612653650150032536 0ustar ellertellert foo ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BlockDefault/BlockDefault-BlockDefault01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BlockDefault/BlockDefault-BlockDefault0000755000175000017500000000154612653650150032562 0ustar ellertellert foogsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearSimpleTypePattern/0000755000175000017500000000000012653650152027756 5ustar ellertellert././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearSimpleTypePattern/GYearSimpleTypePattern-GYearSimpleTypePattern01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearSimpleTypePattern/GYearSimpleType0000755000175000017500000000164312653650152032733 0ustar ellertellert 2009././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearSimpleTypePattern/echoGYearSimpleTypePattern-GYearSimpleTypePattern01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearSimpleTypePattern/echoGYearSimple0000755000175000017500000000225312653650152032726 0ustar ellertellert 2009 ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearSimpleTypePattern/echoGYearSimpleTypePattern-GYearSimpleTypePattern01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearSimpleTypePattern/echoGYearSimple0000755000175000017500000000225112653650152032724 0ustar ellertellert 2009 ././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearSimpleTypePattern/echoGYearSimpleTypePattern-GYearSimpleTypePattern01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearSimpleTypePattern/echoGYearSimple0000755000175000017500000000170512653650152032727 0ustar ellertellert 2009 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateElement/0000755000175000017500000000000012653650150025562 5ustar ellertellert././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateElement/echoDateElement-DateElement03-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateElement/echoDateElement-DateElemen0000755000175000017500000000217312653650150032542 0ustar ellertellert 2038-05-31Z ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateElement/echoDateElement-DateElement02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateElement/echoDateElement-DateElemen0000755000175000017500000000217012653650150032537 0ustar ellertellert 0739-05-31 ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateElement/DateElement-DateElement03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateElement/DateElement-DateElement03.0000755000175000017500000000155012653650150032306 0ustar ellertellert 2038-05-31Z././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateElement/echoDateElement-DateElement04-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateElement/echoDateElement-DateElemen0000755000175000017500000000217612653650150032545 0ustar ellertellert 1999-05-31+05:43 ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateElement/echoDateElement-DateElement04-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateElement/echoDateElement-DateElemen0000755000175000017500000000220012653650150032531 0ustar ellertellert 1999-05-31+05:43 ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateElement/DateElement-DateElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateElement/DateElement-DateElement02.0000755000175000017500000000154712653650150032313 0ustar ellertellert 0739-05-31././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateElement/echoDateElement-DateElement01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateElement/echoDateElement-DateElemen0000755000175000017500000000217212653650150032541 0ustar ellertellert 1999-05-31 ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateElement/echoDateElement-DateElement03-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateElement/echoDateElement-DateElemen0000755000175000017500000000217112653650150032540 0ustar ellertellert 2038-05-31Z ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateElement/DateElement-DateElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateElement/DateElement-DateElement01.0000755000175000017500000000154712653650150032312 0ustar ellertellert 1999-05-31././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateElement/echoDateElement-DateElement01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateElement/echoDateElement-DateElemen0000755000175000017500000000217012653650150032537 0ustar ellertellert 1999-05-31 ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateElement/echoDateElement-DateElement04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateElement/echoDateElement-DateElemen0000755000175000017500000000160412653650150032540 0ustar ellertellert 1999-05-31+05:43 ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateElement/echoDateElement-DateElement03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateElement/echoDateElement-DateElemen0000755000175000017500000000157712653650150032551 0ustar ellertellert 2038-05-31Z ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateElement/echoDateElement-DateElement05-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateElement/echoDateElement-DateElemen0000755000175000017500000000217112653650150032540 0ustar ellertellert 10739-05-31 ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateElement/echoDateElement-DateElement05-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateElement/echoDateElement-DateElemen0000755000175000017500000000217312653650150032542 0ustar ellertellert 10739-05-31 ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateElement/echoDateElement-DateElement05.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateElement/echoDateElement-DateElemen0000755000175000017500000000157712653650150032551 0ustar ellertellert 10739-05-31 ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateElement/echoDateElement-DateElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateElement/echoDateElement-DateElemen0000755000175000017500000000157612653650150032550 0ustar ellertellert 0739-05-31 ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateElement/echoDateElement-DateElement02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateElement/echoDateElement-DateElemen0000755000175000017500000000217212653650150032541 0ustar ellertellert 0739-05-31 ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateElement/DateElement-DateElement05.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateElement/DateElement-DateElement05.0000755000175000017500000000155012653650150032310 0ustar ellertellert 10739-05-31././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateElement/echoDateElement-DateElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateElement/echoDateElement-DateElemen0000755000175000017500000000157612653650150032550 0ustar ellertellert 1999-05-31 ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateElement/DateElement-DateElement04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateElement/DateElement-DateElement04.0000755000175000017500000000155512653650150032314 0ustar ellertellert 1999-05-31+05:43gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NegativeIntegerElement/0000755000175000017500000000000012653650152027767 5ustar ellertellert././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NegativeIntegerElement/echoNegativeIntegerElement-NegativeIntegerElement02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NegativeIntegerElement/echoNegativeInt0000755000175000017500000000232212653650152032770 0ustar ellertellert -12343242342345345346453643564536543645363456 ././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NegativeIntegerElement/echoNegativeIntegerElement-NegativeIntegerElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NegativeIntegerElement/echoNegativeInt0000755000175000017500000000170312653650152032772 0ustar ellertellert -1 ././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NegativeIntegerElement/NegativeIntegerElement-NegativeIntegerElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NegativeIntegerElement/NegativeInteger0000755000175000017500000000171412653650152033000 0ustar ellertellert -12343242342345345346453643564536543645363456././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NegativeIntegerElement/echoNegativeIntegerElement-NegativeIntegerElement02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NegativeIntegerElement/echoNegativeInt0000755000175000017500000000232412653650152032772 0ustar ellertellert -12343242342345345346453643564536543645363456 ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NegativeIntegerElement/echoNegativeIntegerElement-NegativeIntegerElement01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NegativeIntegerElement/echoNegativeInt0000755000175000017500000000225112653650152032771 0ustar ellertellert -1 ././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NegativeIntegerElement/NegativeIntegerElement-NegativeIntegerElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NegativeIntegerElement/NegativeInteger0000755000175000017500000000164112653650152032777 0ustar ellertellert -1././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NegativeIntegerElement/echoNegativeIntegerElement-NegativeIntegerElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NegativeIntegerElement/echoNegativeInt0000755000175000017500000000175612653650152033002 0ustar ellertellert -12343242342345345346453643564536543645363456 ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NegativeIntegerElement/echoNegativeIntegerElement-NegativeIntegerElement01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NegativeIntegerElement/echoNegativeInt0000755000175000017500000000224712653650152032776 0ustar ellertellert -1 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeElementNameClash/0000755000175000017500000000000012653650150030424 5ustar ellertellert././@LongLink0000644000000000000000000000022600000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeElementNameClash/echoAttributeElementNameClash-AttributeElementNameClash01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeElementNameClash/echoAttribut0000755000175000017500000000213012653650150033003 0ustar ellertellert Bobby Sox Mr ././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeElementNameClash/echoAttributeElementNameClash-AttributeElementNameClash01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeElementNameClash/echoAttribut0000755000175000017500000000255112653650150033012 0ustar ellertellert Bobby Sox Mr ././@LongLink0000644000000000000000000000022200000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeElementNameClash/AttributeElementNameClash-AttributeElementNameClash01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeElementNameClash/AttributeEle0000755000175000017500000000204112653650150032740 0ustar ellertellert Bobby Sox Mr ././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeElementNameClash/echoAttributeElementNameClash-AttributeElementNameClash01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeElementNameClash/echoAttribut0000755000175000017500000000255312653650150033014 0ustar ellertellert Bobby Sox Mr gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeFixed/0000755000175000017500000000000012653650150026316 5ustar ellertellert././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeFixed/echoAttributeFixed-AttributeFixed01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeFixed/echoAttributeFixed-Attr0000755000175000017500000000237112653650150032741 0ustar ellertellert 500 ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeFixed/AttributeFixed-AttributeFixed01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeFixed/AttributeFixed-Attribut0000755000175000017500000000172212653650150032765 0ustar ellertellert 500 ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeFixed/echoAttributeFixed-AttributeFixed01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeFixed/echoAttributeFixed-Attr0000755000175000017500000000176212653650150032744 0ustar ellertellert 500 ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeFixed/echoAttributeFixed-AttributeFixed01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeFixed/echoAttributeFixed-Attr0000755000175000017500000000237312653650150032743 0ustar ellertellert 500 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementTypeDefaultNamespace/0000755000175000017500000000000012653650152030752 5ustar ellertellert././@LongLink0000644000000000000000000000024300000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementTypeDefaultNamespace/echoElementTypeDefaultNamespace-ElementTypeDefaultNamespace02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementTypeDefaultNamespace/echoElemen0000755000175000017500000000232712653650152032750 0ustar ellertellert This is a string! ././@LongLink0000644000000000000000000000023400000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementTypeDefaultNamespace/echoElementTypeDefaultNamespace-ElementTypeDefaultNamespace02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementTypeDefaultNamespace/echoElemen0000755000175000017500000000177712653650152032760 0ustar ellertellert This is a string! ././@LongLink0000644000000000000000000000024300000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementTypeDefaultNamespace/echoElementTypeDefaultNamespace-ElementTypeDefaultNamespace02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementTypeDefaultNamespace/echoElemen0000755000175000017500000000232512653650152032746 0ustar ellertellert This is a string! ././@LongLink0000644000000000000000000000024300000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementTypeDefaultNamespace/echoElementTypeDefaultNamespace-ElementTypeDefaultNamespace01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementTypeDefaultNamespace/echoElemen0000755000175000017500000000224212653650152032744 0ustar ellertellert ././@LongLink0000644000000000000000000000023400000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementTypeDefaultNamespace/echoElementTypeDefaultNamespace-ElementTypeDefaultNamespace01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementTypeDefaultNamespace/echoElemen0000755000175000017500000000171412653650152032747 0ustar ellertellert ././@LongLink0000644000000000000000000000024300000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementTypeDefaultNamespace/echoElementTypeDefaultNamespace-ElementTypeDefaultNamespace01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementTypeDefaultNamespace/echoElemen0000755000175000017500000000224412653650152032746 0ustar ellertellert ././@LongLink0000644000000000000000000000023000000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementTypeDefaultNamespace/ElementTypeDefaultNamespace-ElementTypeDefaultNamespace01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementTypeDefaultNamespace/ElementTyp0000755000175000017500000000164712653650152032776 0ustar ellertellert ././@LongLink0000644000000000000000000000023000000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementTypeDefaultNamespace/ElementTypeDefaultNamespace-ElementTypeDefaultNamespace02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementTypeDefaultNamespace/ElementTyp0000755000175000017500000000173212653650152032771 0ustar ellertellert This is a string!gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnySimpleTypeElement/0000755000175000017500000000000012653650150027450 5ustar ellertellert././@LongLink0000644000000000000000000000020700000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnySimpleTypeElement/echoAnySimpleTypeElement-AnySimpleTypeElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnySimpleTypeElement/echoAnySimpleType0000755000175000017500000000170512653650150033003 0ustar ellertellert anySimpleTypeValue ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnySimpleTypeElement/echoAnySimpleTypeElement-AnySimpleTypeElement02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnySimpleTypeElement/echoAnySimpleType0000755000175000017500000000225712653650150033006 0ustar ellertellert anySimpleTypeValue ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnySimpleTypeElement/echoAnySimpleTypeElement-AnySimpleTypeElement02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnySimpleTypeElement/echoAnySimpleType0000755000175000017500000000225512653650150033004 0ustar ellertellert anySimpleTypeValue ././@LongLink0000644000000000000000000000020300000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnySimpleTypeElement/AnySimpleTypeElement-AnySimpleTypeElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnySimpleTypeElement/AnySimpleTypeElem0000755000175000017500000000157212653650150032751 0ustar ellertellert ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnySimpleTypeElement/echoAnySimpleTypeElement-AnySimpleTypeElement01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnySimpleTypeElement/echoAnySimpleType0000755000175000017500000000220412653650150032776 0ustar ellertellert ././@LongLink0000644000000000000000000000020700000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnySimpleTypeElement/echoAnySimpleTypeElement-AnySimpleTypeElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnySimpleTypeElement/echoAnySimpleType0000755000175000017500000000163212653650150033002 0ustar ellertellert ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnySimpleTypeElement/echoAnySimpleTypeElement-AnySimpleTypeElement01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnySimpleTypeElement/echoAnySimpleType0000755000175000017500000000220212653650150032774 0ustar ellertellert ././@LongLink0000644000000000000000000000020300000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnySimpleTypeElement/AnySimpleTypeElement-AnySimpleTypeElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnySimpleTypeElement/AnySimpleTypeElem0000755000175000017500000000164512653650150032752 0ustar ellertellert anySimpleTypeValuegsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/0000755000175000017500000000000012653650152026304 5ustar ellertellert././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-IntegerElement04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-Inte0000755000175000017500000000162712653650152032703 0ustar ellertellert 12678967543233 ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-IntegerElement05-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-Inte0000755000175000017500000000220312653650152032672 0ustar ellertellert +10000 ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-IntegerElement04-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-Inte0000755000175000017500000000221512653650152032675 0ustar ellertellert 12678967543233 ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-IntegerElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-Inte0000755000175000017500000000161212653650152032675 0ustar ellertellert 0 ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-IntegerElement03-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-Inte0000755000175000017500000000220212653650152032671 0ustar ellertellert -42 ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-IntegerElement02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-Inte0000755000175000017500000000220012653650152032667 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-IntegerElement03-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-Inte0000755000175000017500000000220012653650152032667 0ustar ellertellert -42 ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-IntegerElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-Inte0000755000175000017500000000161212653650152032675 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/IntegerElement-IntegerElement04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/IntegerElement-IntegerE0000755000175000017500000000157512653650152032651 0ustar ellertellert 12678967543233././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/IntegerElement-IntegerElement03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/IntegerElement-IntegerE0000755000175000017500000000156212653650152032645 0ustar ellertellert -42././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-IntegerElement03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-Inte0000755000175000017500000000161412653650152032677 0ustar ellertellert -42 ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/IntegerElement-IntegerElement07.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/IntegerElement-IntegerE0000755000175000017500000000165512653650152032650 0ustar ellertellert -1234567891234567838475834753838887348573489123456789123456789././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-IntegerElement07.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-Inte0000755000175000017500000000170712653650152032702 0ustar ellertellert -1234567891234567838475834753838887348573489123456789123456789 ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-IntegerElement01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-Inte0000755000175000017500000000220012653650152032667 0ustar ellertellert 0 ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/IntegerElement-IntegerElement06.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/IntegerElement-IntegerE0000755000175000017500000000165412653650152032647 0ustar ellertellert 1234567891234567838475834753838887348573489123456789123456789././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-IntegerElement04-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-Inte0000755000175000017500000000221312653650152032673 0ustar ellertellert 12678967543233 ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-IntegerElement06.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-Inte0000755000175000017500000000170612653650152032701 0ustar ellertellert 1234567891234567838475834753838887348573489123456789123456789 ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-IntegerElement07-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-Inte0000755000175000017500000000227312653650152032701 0ustar ellertellert -1234567891234567838475834753838887348573489123456789123456789 ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-IntegerElement06-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-Inte0000755000175000017500000000227412653650152032702 0ustar ellertellert 1234567891234567838475834753838887348573489123456789123456789 ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-IntegerElement06-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-Inte0000755000175000017500000000227212653650152032700 0ustar ellertellert 1234567891234567838475834753838887348573489123456789123456789 ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/IntegerElement-IntegerElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/IntegerElement-IntegerE0000755000175000017500000000156012653650152032643 0ustar ellertellert 0././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-IntegerElement02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-Inte0000755000175000017500000000217612653650152032703 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-IntegerElement05.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-Inte0000755000175000017500000000161712653650152032702 0ustar ellertellert +10000 ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-IntegerElement07-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-Inte0000755000175000017500000000227512653650152032703 0ustar ellertellert -1234567891234567838475834753838887348573489123456789123456789 ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/IntegerElement-IntegerElement05.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/IntegerElement-IntegerE0000755000175000017500000000156512653650152032650 0ustar ellertellert +10000././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-IntegerElement05-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-Inte0000755000175000017500000000220512653650152032674 0ustar ellertellert +10000 ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-IntegerElement01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-Inte0000755000175000017500000000217612653650152032703 0ustar ellertellert 0 ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/IntegerElement-IntegerElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/IntegerElement-IntegerE0000755000175000017500000000156012653650152032643 0ustar ellertellert 1gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntSimpleTypePattern/0000755000175000017500000000000012653650152027501 5ustar ellertellert././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntSimpleTypePattern/echoIntSimpleTypePattern-IntSimpleTypePattern01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntSimpleTypePattern/echoIntSimpleType0000755000175000017500000000224012653650152033032 0ustar ellertellert 123 ././@LongLink0000644000000000000000000000020700000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntSimpleTypePattern/echoIntSimpleTypePattern-IntSimpleTypePattern02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntSimpleTypePattern/echoIntSimpleType0000755000175000017500000000166612653650152033045 0ustar ellertellert 009 ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntSimpleTypePattern/echoIntSimpleTypePattern-IntSimpleTypePattern02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntSimpleTypePattern/echoIntSimpleType0000755000175000017500000000224012653650152033032 0ustar ellertellert 009 ././@LongLink0000644000000000000000000000020300000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntSimpleTypePattern/IntSimpleTypePattern-IntSimpleTypePattern02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntSimpleTypePattern/IntSimpleTypePatt0000755000175000017500000000162612653650152033033 0ustar ellertellert 009././@LongLink0000644000000000000000000000020300000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntSimpleTypePattern/IntSimpleTypePattern-IntSimpleTypePattern01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntSimpleTypePattern/IntSimpleTypePatt0000755000175000017500000000162612653650152033033 0ustar ellertellert 123././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntSimpleTypePattern/echoIntSimpleTypePattern-IntSimpleTypePattern01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntSimpleTypePattern/echoIntSimpleType0000755000175000017500000000223612653650152033037 0ustar ellertellert 123 ././@LongLink0000644000000000000000000000020700000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntSimpleTypePattern/echoIntSimpleTypePattern-IntSimpleTypePattern01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntSimpleTypePattern/echoIntSimpleType0000755000175000017500000000166612653650152033045 0ustar ellertellert 123 ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntSimpleTypePattern/echoIntSimpleTypePattern-IntSimpleTypePattern02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntSimpleTypePattern/echoIntSimpleType0000755000175000017500000000223612653650152033037 0ustar ellertellert 009 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeRequired/0000755000175000017500000000000012653650150027037 5ustar ellertellert././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeRequired/echoAttributeRequired-AttributeRequired01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeRequired/echoAttributeRequire0000755000175000017500000000243212653650150033125 0ustar ellertellert 5 ././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeRequired/echoAttributeRequired-AttributeRequired02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeRequired/echoAttributeRequire0000755000175000017500000000203012653650150033117 0ustar ellertellert 2 ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeRequired/echoAttributeRequired-AttributeRequired02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeRequired/echoAttributeRequire0000755000175000017500000000243312653650150033126 0ustar ellertellert 2 ././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeRequired/echoAttributeRequired-AttributeRequired01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeRequired/echoAttributeRequire0000755000175000017500000000203112653650150033120 0ustar ellertellert 5 ././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeRequired/AttributeRequired-AttributeRequired02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeRequired/AttributeRequired-At0000755000175000017500000000176512653650150033004 0ustar ellertellert 2 ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeRequired/echoAttributeRequired-AttributeRequired02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeRequired/echoAttributeRequire0000755000175000017500000000243112653650150033124 0ustar ellertellert 2 ././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeRequired/AttributeRequired-AttributeRequired01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeRequired/AttributeRequired-At0000755000175000017500000000176612653650150033005 0ustar ellertellert 5 ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeRequired/echoAttributeRequired-AttributeRequired01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeRequired/echoAttributeRequire0000755000175000017500000000243412653650150033127 0ustar ellertellert 5 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs1MaxOccursUnbounded/0000755000175000017500000000000012653650152032363 5ustar ellertellert././@LongLink0000644000000000000000000000027400000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs1MaxOccursUnbounded/echoElementMinOccurs1MaxOccursUnbounded-ElementMinOccurs1MaxOccursUnbounded101-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs1MaxOccursUnbounded/ec0000755000175000017500000000231012653650152032674 0ustar ellertellert 44 ././@LongLink0000644000000000000000000000026100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs1MaxOccursUnbounded/ElementMinOccurs1MaxOccursUnbounded-ElementMinOccurs1MaxOccursUnbounded101.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs1MaxOccursUnbounded/El0000755000175000017500000000156212653650152032655 0ustar ellertellert 44 ././@LongLink0000644000000000000000000000026500000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs1MaxOccursUnbounded/echoElementMinOccurs1MaxOccursUnbounded-ElementMinOccurs1MaxOccursUnbounded101.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs1MaxOccursUnbounded/ec0000755000175000017500000000167512653650152032711 0ustar ellertellert 44 ././@LongLink0000644000000000000000000000027400000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs1MaxOccursUnbounded/echoElementMinOccurs1MaxOccursUnbounded-ElementMinOccurs1MaxOccursUnbounded101-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs1MaxOccursUnbounded/ec0000755000175000017500000000230612653650152032701 0ustar ellertellert 44 ././@LongLink0000644000000000000000000000026500000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs1MaxOccursUnbounded/echoElementMinOccurs1MaxOccursUnbounded-ElementMinOccurs1MaxOccursUnbounded102.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs1MaxOccursUnbounded/ec0000755000175000017500000000201112653650152032672 0ustar ellertellert 24 34 44 ././@LongLink0000644000000000000000000000026100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs1MaxOccursUnbounded/ElementMinOccurs1MaxOccursUnbounded-ElementMinOccurs1MaxOccursUnbounded102.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs1MaxOccursUnbounded/El0000755000175000017500000000167612653650152032663 0ustar ellertellert 24 34 44 ././@LongLink0000644000000000000000000000027400000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs1MaxOccursUnbounded/echoElementMinOccurs1MaxOccursUnbounded-ElementMinOccurs1MaxOccursUnbounded102-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs1MaxOccursUnbounded/ec0000755000175000017500000000243412653650152032703 0ustar ellertellert 24 34 44 ././@LongLink0000644000000000000000000000027400000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs1MaxOccursUnbounded/echoElementMinOccurs1MaxOccursUnbounded-ElementMinOccurs1MaxOccursUnbounded102-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs1MaxOccursUnbounded/ec0000755000175000017500000000243212653650152032701 0ustar ellertellert 24 34 44 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerSimpleTypePattern/0000755000175000017500000000000012653650152032067 5ustar ellertellert././@LongLink0000644000000000000000000000026200000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerSimpleTypePattern/echoPositiveIntegerSimpleTypePattern-PositiveIntegerSimpleTypePattern02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerSimpleTypePattern/echoP0000755000175000017500000000233412653650152033055 0ustar ellertellert 009 ././@LongLink0000644000000000000000000000025300000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerSimpleTypePattern/echoPositiveIntegerSimpleTypePattern-PositiveIntegerSimpleTypePattern01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerSimpleTypePattern/echoP0000755000175000017500000000201212653650152033046 0ustar ellertellert 123 ././@LongLink0000644000000000000000000000026200000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerSimpleTypePattern/echoPositiveIntegerSimpleTypePattern-PositiveIntegerSimpleTypePattern02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerSimpleTypePattern/echoP0000755000175000017500000000233212653650152033053 0ustar ellertellert 009 ././@LongLink0000644000000000000000000000025300000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerSimpleTypePattern/echoPositiveIntegerSimpleTypePattern-PositiveIntegerSimpleTypePattern02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerSimpleTypePattern/echoP0000755000175000017500000000201212653650152033046 0ustar ellertellert 009 ././@LongLink0000644000000000000000000000024700000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerSimpleTypePattern/PositiveIntegerSimpleTypePattern-PositiveIntegerSimpleTypePattern01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerSimpleTypePattern/Posit0000755000175000017500000000173612653650152033122 0ustar ellertellert 123././@LongLink0000644000000000000000000000024700000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerSimpleTypePattern/PositiveIntegerSimpleTypePattern-PositiveIntegerSimpleTypePattern02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerSimpleTypePattern/Posit0000755000175000017500000000173612653650152033122 0ustar ellertellert 009././@LongLink0000644000000000000000000000026200000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerSimpleTypePattern/echoPositiveIntegerSimpleTypePattern-PositiveIntegerSimpleTypePattern01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerSimpleTypePattern/echoP0000755000175000017500000000233412653650152033055 0ustar ellertellert 123 ././@LongLink0000644000000000000000000000026200000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerSimpleTypePattern/echoPositiveIntegerSimpleTypePattern-PositiveIntegerSimpleTypePattern01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerSimpleTypePattern/echoP0000755000175000017500000000233212653650152033053 0ustar ellertellert 123 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/QualifiedLocalAttributes/0000755000175000017500000000000012653650152030322 5ustar ellertellert././@LongLink0000644000000000000000000000022300000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/QualifiedLocalAttributes/echoQualifiedLocalAttributes-QualifiedLocalAttributes01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/QualifiedLocalAttributes/echoQualified0000755000175000017500000000172512653650152033017 0ustar ellertellert string ././@LongLink0000644000000000000000000000023200000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/QualifiedLocalAttributes/echoQualifiedLocalAttributes-QualifiedLocalAttributes01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/QualifiedLocalAttributes/echoQualified0000755000175000017500000000226712653650152033021 0ustar ellertellert string ././@LongLink0000644000000000000000000000021700000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/QualifiedLocalAttributes/QualifiedLocalAttributes-QualifiedLocalAttributes01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/QualifiedLocalAttributes/QualifiedLoca0000755000175000017500000000166112653650152032756 0ustar ellertellert string././@LongLink0000644000000000000000000000023200000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/QualifiedLocalAttributes/echoQualifiedLocalAttributes-QualifiedLocalAttributes01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/QualifiedLocalAttributes/echoQualified0000755000175000017500000000226512653650152033017 0ustar ellertellert string gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/QualifiedLocalElements/0000755000175000017500000000000012653650152027750 5ustar ellertellert././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/QualifiedLocalElements/echoQualifiedLocalElements-QualifiedLocalElements01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/QualifiedLocalElements/echoQualifiedLo0000755000175000017500000000166512653650152032743 0ustar ellertellert bar ././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/QualifiedLocalElements/QualifiedLocalElements-QualifiedLocalElements01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/QualifiedLocalElements/QualifiedLocalE0000755000175000017500000000162012653650152032660 0ustar ellertellert bar././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/QualifiedLocalElements/echoQualifiedLocalElements-QualifiedLocalElements01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/QualifiedLocalElements/echoQualifiedLo0000755000175000017500000000224112653650152032732 0ustar ellertellert bar ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/QualifiedLocalElements/echoQualifiedLocalElements-QualifiedLocalElements01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/QualifiedLocalElements/echoQualifiedLo0000755000175000017500000000223712653650152032737 0ustar ellertellert bar gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeLax/0000755000175000017500000000000012653650150026453 5ustar ellertellert././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeLax/echoAnyAttributeLax-AnyAttributeLax01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeLax/echoAnyAttributeLax-An0000755000175000017500000000242512653650150032657 0ustar ellertellert Bobby Sox ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeLax/echoAnyAttributeLax-AnyAttributeLax01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeLax/echoAnyAttributeLax-An0000755000175000017500000000242312653650150032655 0ustar ellertellert Bobby Sox ././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeLax/AnyAttributeLax-AnyAttributeLax01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeLax/AnyAttributeLax-AnyAtt0000755000175000017500000000176212653650150032665 0ustar ellertellert Bobby Sox ././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeLax/echoAnyAttributeLax-AnyAttributeLax01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeLax/echoAnyAttributeLax-An0000755000175000017500000000202012653650150032646 0ustar ellertellert Bobby Sox gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeOtherSkip/0000755000175000017500000000000012653650150027637 5ustar ellertellert././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeOtherSkip/echoAnyAttributeOtherSkip-AnyAttributeOtherSkip01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeOtherSkip/echoAnyAttribute0000755000175000017500000000256412653650150033046 0ustar ellertellert String String ././@LongLink0000644000000000000000000000020600000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeOtherSkip/AnyAttributeOtherSkip-AnyAttributeOtherSkip01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeOtherSkip/AnyAttributeOthe0000755000175000017500000000216312653650150033022 0ustar ellertellert String String ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeOtherSkip/echoAnyAttributeOtherSkip-AnyAttributeOtherSkip01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeOtherSkip/echoAnyAttribute0000755000175000017500000000256612653650150033050 0ustar ellertellert String String ././@LongLink0000644000000000000000000000021200000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeOtherSkip/echoAnyAttributeOtherSkip-AnyAttributeOtherSkip01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeOtherSkip/echoAnyAttribute0000755000175000017500000000223212653650150033036 0ustar ellertellert String String gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SOAPEncodedArray/0000755000175000017500000000000012653650152026420 5ustar ellertellert././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SOAPEncodedArray/echoSOAPEncodedArray-SOAPEncodedArray01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SOAPEncodedArray/echoSOAPEncodedArray-0000755000175000017500000000160212653650152032304 0ustar ellertellert ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SOAPEncodedArray/echoSOAPEncodedArray-SOAPEncodedArray01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SOAPEncodedArray/echoSOAPEncodedArray-0000755000175000017500000000216212653650152032306 0ustar ellertellert ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SOAPEncodedArray/SOAPEncodedArray-SOAPEncodedArray01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SOAPEncodedArray/SOAPEncodedArray-SOAP0000755000175000017500000000154612653650152032137 0ustar ellertellert ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SOAPEncodedArray/echoSOAPEncodedArray-SOAPEncodedArray01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SOAPEncodedArray/echoSOAPEncodedArray-0000755000175000017500000000216412653650152032310 0ustar ellertellert gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/0000755000175000017500000000000012653650152026157 5ustar ellertellert././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/echoTimeAttribute-TimeAttribute03-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/echoTimeAttribute-TimeAt0000755000175000017500000000222312653650152032706 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/echoTimeAttribute-TimeAttribute03-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/echoTimeAttribute-TimeAt0000755000175000017500000000222112653650152032704 0ustar ellertellert ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/TimeAttribute-TimeAttribute04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/TimeAttribute-TimeAttrib0000755000175000017500000000157212653650152032736 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/echoTimeAttribute-TimeAttribute04-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/echoTimeAttribute-TimeAt0000755000175000017500000000222212653650152032705 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/echoTimeAttribute-TimeAttribute02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/echoTimeAttribute-TimeAt0000755000175000017500000000222312653650152032706 0ustar ellertellert ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/TimeAttribute-TimeAttribute02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/TimeAttribute-TimeAttrib0000755000175000017500000000157112653650152032735 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/echoTimeAttribute-TimeAttribute05-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/echoTimeAttribute-TimeAt0000755000175000017500000000223112653650152032705 0ustar ellertellert ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/TimeAttribute-TimeAttribute05.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/TimeAttribute-TimeAttrib0000755000175000017500000000157712653650152032743 0ustar ellertellert ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/echoTimeAttribute-TimeAttribute04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/echoTimeAttribute-TimeAt0000755000175000017500000000162612653650152032714 0ustar ellertellert ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/TimeAttribute-TimeAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/TimeAttribute-TimeAttrib0000755000175000017500000000157112653650152032735 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/echoTimeAttribute-TimeAttribute01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/echoTimeAttribute-TimeAt0000755000175000017500000000222112653650152032704 0ustar ellertellert ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/echoTimeAttribute-TimeAttribute03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/echoTimeAttribute-TimeAt0000755000175000017500000000162512653650152032713 0ustar ellertellert ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/echoTimeAttribute-TimeAttribute05.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/echoTimeAttribute-TimeAt0000755000175000017500000000163312653650152032712 0ustar ellertellert ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/TimeAttribute-TimeAttribute03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/TimeAttribute-TimeAttrib0000755000175000017500000000157112653650152032735 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/echoTimeAttribute-TimeAttribute04-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/echoTimeAttribute-TimeAt0000755000175000017500000000222412653650152032707 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/echoTimeAttribute-TimeAttribute05-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/echoTimeAttribute-TimeAt0000755000175000017500000000222712653650152032712 0ustar ellertellert ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/echoTimeAttribute-TimeAttribute02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/echoTimeAttribute-TimeAt0000755000175000017500000000162512653650152032713 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/echoTimeAttribute-TimeAttribute02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/echoTimeAttribute-TimeAt0000755000175000017500000000222112653650152032704 0ustar ellertellert ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/echoTimeAttribute-TimeAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/echoTimeAttribute-TimeAt0000755000175000017500000000162512653650152032713 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/echoTimeAttribute-TimeAttribute01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/echoTimeAttribute-TimeAt0000755000175000017500000000222312653650152032706 0ustar ellertellert gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursUnbounded/0000755000175000017500000000000012653650150030256 5ustar ellertellert././@LongLink0000644000000000000000000000021700000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursUnbounded/ChoiceMaxOccursUnbounded-ChoiceMaxOccursUnbounded01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursUnbounded/ChoiceMaxOccu0000755000175000017500000000204112653650150032653 0ustar ellertellert 1st 2nd 3rd ././@LongLink0000644000000000000000000000023200000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursUnbounded/echoChoiceMaxOccursUnbounded-ChoiceMaxOccursUnbounded03-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursUnbounded/echoChoiceMax0000755000175000017500000000246712653650150032714 0ustar ellertellert 1st second 3rd ././@LongLink0000644000000000000000000000023200000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursUnbounded/echoChoiceMaxOccursUnbounded-ChoiceMaxOccursUnbounded01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursUnbounded/echoChoiceMax0000755000175000017500000000246612653650150032713 0ustar ellertellert 1st 2nd 3rd ././@LongLink0000644000000000000000000000022300000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursUnbounded/echoChoiceMaxOccursUnbounded-ChoiceMaxOccursUnbounded01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursUnbounded/echoChoiceMax0000755000175000017500000000210512653650150032701 0ustar ellertellert 1st 2nd 3rd ././@LongLink0000644000000000000000000000022300000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursUnbounded/echoChoiceMaxOccursUnbounded-ChoiceMaxOccursUnbounded02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursUnbounded/echoChoiceMax0000755000175000017500000000204512653650150032704 0ustar ellertellert first second ././@LongLink0000644000000000000000000000023200000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursUnbounded/echoChoiceMaxOccursUnbounded-ChoiceMaxOccursUnbounded01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursUnbounded/echoChoiceMax0000755000175000017500000000246412653650150032711 0ustar ellertellert 1st 2nd 3rd ././@LongLink0000644000000000000000000000023200000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursUnbounded/echoChoiceMaxOccursUnbounded-ChoiceMaxOccursUnbounded02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursUnbounded/echoChoiceMax0000755000175000017500000000242212653650150032703 0ustar ellertellert first second ././@LongLink0000644000000000000000000000023200000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursUnbounded/echoChoiceMaxOccursUnbounded-ChoiceMaxOccursUnbounded03-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursUnbounded/echoChoiceMax0000755000175000017500000000247112653650150032707 0ustar ellertellert 1st second 3rd ././@LongLink0000644000000000000000000000021700000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursUnbounded/ChoiceMaxOccursUnbounded-ChoiceMaxOccursUnbounded03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursUnbounded/ChoiceMaxOccu0000755000175000017500000000204412653650150032656 0ustar ellertellert 1st second 3rd ././@LongLink0000644000000000000000000000022300000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursUnbounded/echoChoiceMaxOccursUnbounded-ChoiceMaxOccursUnbounded03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursUnbounded/echoChoiceMax0000755000175000017500000000211012653650150032675 0ustar ellertellert 1st second 3rd ././@LongLink0000644000000000000000000000021700000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursUnbounded/ChoiceMaxOccursUnbounded-ChoiceMaxOccursUnbounded02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursUnbounded/ChoiceMaxOccu0000755000175000017500000000200112653650150032647 0ustar ellertellert first second ././@LongLink0000644000000000000000000000023200000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursUnbounded/echoChoiceMaxOccursUnbounded-ChoiceMaxOccursUnbounded02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursUnbounded/echoChoiceMax0000755000175000017500000000242012653650150032701 0ustar ellertellert first second gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccursFinite/0000755000175000017500000000000012653650150027750 5ustar ellertellert././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccursFinite/ElementMaxOccursFinite-ElementMaxOccursFinite01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccursFinite/ElementMaxOccur0000755000175000017500000000170712653650150032736 0ustar ellertellert May June July August ././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccursFinite/echoElementMaxOccursFinite-ElementMaxOccursFinite02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccursFinite/echoElementMaxO0000755000175000017500000000167712653650150032726 0ustar ellertellert August September ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccursFinite/echoElementMaxOccursFinite-ElementMaxOccursFinite02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccursFinite/echoElementMaxO0000755000175000017500000000232012653650150032710 0ustar ellertellert August September ././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccursFinite/ElementMaxOccursFinite-ElementMaxOccursFinite02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccursFinite/ElementMaxOccur0000755000175000017500000000161512653650150032734 0ustar ellertellert August September ././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccursFinite/echoElementMaxOccursFinite-ElementMaxOccursFinite01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccursFinite/echoElementMaxO0000755000175000017500000000177112653650150032721 0ustar ellertellert May June July August ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccursFinite/echoElementMaxOccursFinite-ElementMaxOccursFinite01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccursFinite/echoElementMaxO0000755000175000017500000000242212653650150032713 0ustar ellertellert May June July August ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccursFinite/echoElementMaxOccursFinite-ElementMaxOccursFinite02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccursFinite/echoElementMaxO0000755000175000017500000000231612653650150032715 0ustar ellertellert August September ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccursFinite/echoElementMaxOccursFinite-ElementMaxOccursFinite01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccursFinite/echoElementMaxO0000755000175000017500000000242012653650150032711 0ustar ellertellert May June July August gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateSimpleTypePattern/0000755000175000017500000000000012653650150027622 5ustar ellertellert././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateSimpleTypePattern/echoDateSimpleTypePattern-DateSimpleTypePattern01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateSimpleTypePattern/echoDateSimpleTy0000755000175000017500000000225212653650150032754 0ustar ellertellert 2006-12-18 ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateSimpleTypePattern/echoDateSimpleTypePattern-DateSimpleTypePattern01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateSimpleTypePattern/echoDateSimpleTy0000755000175000017500000000225412653650150032756 0ustar ellertellert 2006-12-18 ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateSimpleTypePattern/echoDateSimpleTypePattern-DateSimpleTypePattern02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateSimpleTypePattern/echoDateSimpleTy0000755000175000017500000000225212653650150032754 0ustar ellertellert 2007-01-01 ././@LongLink0000644000000000000000000000021200000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateSimpleTypePattern/echoDateSimpleTypePattern-DateSimpleTypePattern01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateSimpleTypePattern/echoDateSimpleTy0000755000175000017500000000170412653650150032755 0ustar ellertellert 2006-12-18 ././@LongLink0000644000000000000000000000020600000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateSimpleTypePattern/DateSimpleTypePattern-DateSimpleTypePattern02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateSimpleTypePattern/DateSimpleTypePa0000755000175000017500000000164312653650150032726 0ustar ellertellert 2007-01-01././@LongLink0000644000000000000000000000020600000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateSimpleTypePattern/DateSimpleTypePattern-DateSimpleTypePattern01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateSimpleTypePattern/DateSimpleTypePa0000755000175000017500000000164312653650150032726 0ustar ellertellert 2006-12-18././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateSimpleTypePattern/echoDateSimpleTypePattern-DateSimpleTypePattern02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateSimpleTypePattern/echoDateSimpleTy0000755000175000017500000000225412653650150032756 0ustar ellertellert 2007-01-01 ././@LongLink0000644000000000000000000000021200000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateSimpleTypePattern/echoDateSimpleTypePattern-DateSimpleTypePattern02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DateSimpleTypePattern/echoDateSimpleTy0000755000175000017500000000170412653650150032755 0ustar ellertellert 2007-01-01 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceSingleRepeatedElement/0000755000175000017500000000000012653650152031273 5ustar ellertellert././@LongLink0000644000000000000000000000024200000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceSingleRepeatedElement/echoSequenceSingleRepeatedElement-SequenceSingleRepeatedElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceSingleRepeatedElement/echoSequ0000755000175000017500000000230612653650152032776 0ustar ellertellert element element element element element ././@LongLink0000644000000000000000000000023600000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceSingleRepeatedElement/SequenceSingleRepeatedElement-SequenceSingleRepeatedElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceSingleRepeatedElement/Sequence0000755000175000017500000000223512653650152032773 0ustar ellertellert element element element element element ././@LongLink0000644000000000000000000000023600000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceSingleRepeatedElement/SequenceSingleRepeatedElement-SequenceSingleRepeatedElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceSingleRepeatedElement/Sequence0000755000175000017500000000177112653650152032777 0ustar ellertellert element ././@LongLink0000644000000000000000000000025100000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceSingleRepeatedElement/echoSequenceSingleRepeatedElement-SequenceSingleRepeatedElement01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceSingleRepeatedElement/echoSequ0000755000175000017500000000266512653650152033006 0ustar ellertellert element element element element element ././@LongLink0000644000000000000000000000025100000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceSingleRepeatedElement/echoSequenceSingleRepeatedElement-SequenceSingleRepeatedElement02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceSingleRepeatedElement/echoSequ0000755000175000017500000000237712653650152033006 0ustar ellertellert element ././@LongLink0000644000000000000000000000024200000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceSingleRepeatedElement/echoSequenceSingleRepeatedElement-SequenceSingleRepeatedElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceSingleRepeatedElement/echoSequ0000755000175000017500000000204212653650152032773 0ustar ellertellert element ././@LongLink0000644000000000000000000000025100000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceSingleRepeatedElement/echoSequenceSingleRepeatedElement-SequenceSingleRepeatedElement02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceSingleRepeatedElement/echoSequ0000755000175000017500000000240112653650152032772 0ustar ellertellert element ././@LongLink0000644000000000000000000000025100000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceSingleRepeatedElement/echoSequenceSingleRepeatedElement-SequenceSingleRepeatedElement01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceSingleRepeatedElement/echoSequ0000755000175000017500000000266312653650152033004 0ustar ellertellert element element element element element gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementEmptySequence/0000755000175000017500000000000012653650150027474 5ustar ellertellert././@LongLink0000644000000000000000000000020700000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementEmptySequence/echoElementEmptySequence-ElementEmptySequence01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementEmptySequence/echoElementEmptyS0000755000175000017500000000163212653650150033016 0ustar ellertellert ././@LongLink0000644000000000000000000000020300000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementEmptySequence/ElementEmptySequence-ElementEmptySequence01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementEmptySequence/ElementEmptySeque0000755000175000017500000000157212653650150033042 0ustar ellertellert ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementEmptySequence/echoElementEmptySequence-ElementEmptySequence01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementEmptySequence/echoElementEmptyS0000755000175000017500000000220412653650150033012 0ustar ellertellert ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementEmptySequence/echoElementEmptySequence-ElementEmptySequence01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementEmptySequence/echoElementEmptyS0000755000175000017500000000220212653650150033010 0ustar ellertellert gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexTypeBlock/0000755000175000017500000000000012653650152027742 5ustar ellertellert././@LongLink0000644000000000000000000000023300000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexTypeBlock/echoGlobalComplexTypeBlock-GlobalComplexTypeBlockExample01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexTypeBlock/echoGlobalCompl0000755000175000017500000000233112653650152032721 0ustar ellertellert 1175 ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexTypeBlock/echoGlobalComplexTypeBlock-GlobalComplexTypeBlockExample01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexTypeBlock/echoGlobalCompl0000755000175000017500000000175412653650152032731 0ustar ellertellert 1175 ././@LongLink0000644000000000000000000000022000000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexTypeBlock/GlobalComplexTypeBlock-GlobalComplexTypeBlockExample01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexTypeBlock/GlobalComplexTy0000755000175000017500000000171212653650152032736 0ustar ellertellert 1175 ././@LongLink0000644000000000000000000000023300000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexTypeBlock/echoGlobalComplexTypeBlock-GlobalComplexTypeBlockExample01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexTypeBlock/echoGlobalCompl0000755000175000017500000000232712653650152032726 0ustar ellertellert 1175 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequenceChoice/0000755000175000017500000000000012653650150030450 5ustar ellertellert././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequenceChoice/echoComplexTypeSequenceChoice-ComplexTypeSequenceChoice01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequenceChoice/echoComplexT0000755000175000017500000000254412653650150032775 0ustar ellertellert 225000 20 6 5.25 ././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequenceChoice/echoComplexTypeSequenceChoice-ComplexTypeSequenceChoice02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequenceChoice/echoComplexT0000755000175000017500000000250012653650150032765 0ustar ellertellert 225000 25 5.50 ././@LongLink0000644000000000000000000000022600000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequenceChoice/echoComplexTypeSequenceChoice-ComplexTypeSequenceChoice01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequenceChoice/echoComplexT0000755000175000017500000000210412653650150032765 0ustar ellertellert 225000 20 6 5.25 ././@LongLink0000644000000000000000000000022600000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequenceChoice/echoComplexTypeSequenceChoice-ComplexTypeSequenceChoice02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequenceChoice/echoComplexT0000755000175000017500000000204712653650150032773 0ustar ellertellert 225000 25 5.50 ././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequenceChoice/echoComplexTypeSequenceChoice-ComplexTypeSequenceChoice01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequenceChoice/echoComplexT0000755000175000017500000000254212653650150032773 0ustar ellertellert 225000 20 6 5.25 ././@LongLink0000644000000000000000000000022200000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequenceChoice/ComplexTypeSequenceChoice-ComplexTypeSequenceChoice01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequenceChoice/ComplexTypeS0000755000175000017500000000201612653650150032771 0ustar ellertellert 225000 20 6 5.25 ././@LongLink0000644000000000000000000000022200000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequenceChoice/ComplexTypeSequenceChoice-ComplexTypeSequenceChoice02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequenceChoice/ComplexTypeS0000755000175000017500000000176112653650150032777 0ustar ellertellert 225000 25 5.50 ././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequenceChoice/echoComplexTypeSequenceChoice-ComplexTypeSequenceChoice02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequenceChoice/echoComplexT0000755000175000017500000000250212653650150032767 0ustar ellertellert 225000 25 5.50 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceStrictAny/0000755000175000017500000000000012653650152030467 5ustar ellertellert././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceStrictAny/echoExtendedSequenceStrictAny-ExtendedSequenceStrictAny01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceStrictAny/echoExtended0000755000175000017500000000267712653650152033030 0ustar ellertellert String String Stuff ././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceStrictAny/echoExtendedSequenceStrictAny-ExtendedSequenceStrictAny01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceStrictAny/echoExtended0000755000175000017500000000270112653650152033014 0ustar ellertellert String String Stuff ././@LongLink0000644000000000000000000000022200000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceStrictAny/ExtendedSequenceStrictAny-ExtendedSequenceStrictAny01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceStrictAny/ExtendedSequ0000755000175000017500000000224412653650152033015 0ustar ellertellert String String Stuff ././@LongLink0000644000000000000000000000022600000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceStrictAny/echoExtendedSequenceStrictAny-ExtendedSequenceStrictAny01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceStrictAny/echoExtended0000755000175000017500000000231112653650152033011 0ustar ellertellert String String Stuff gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementConcrete/0000755000175000017500000000000012653650152027572 5ustar ellertellert././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementConcrete/GlobalElementConcrete-GlobalElementConcreteExample01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementConcrete/GlobalElementCon0000755000175000017500000000163612653650152032700 0ustar ellertellert Stuff././@LongLink0000644000000000000000000000023000000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementConcrete/echoGlobalElementConcrete-GlobalElementConcreteExample01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementConcrete/echoGlobalElemen0000755000175000017500000000224712653650152032712 0ustar ellertellert Stuff ././@LongLink0000644000000000000000000000023000000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementConcrete/echoGlobalElementConcrete-GlobalElementConcreteExample01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementConcrete/echoGlobalElemen0000755000175000017500000000224512653650152032710 0ustar ellertellert Stuff ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementConcrete/echoGlobalElementConcrete-GlobalElementConcreteExample01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementConcrete/echoGlobalElemen0000755000175000017500000000167712653650152032720 0ustar ellertellert Stuff gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleAttribute/0000755000175000017500000000000012653650150026471 5ustar ellertellert././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleAttribute/echoDoubleAttribute-DoubleAttribute01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleAttribute/echoDoubleAttribute-Do0000755000175000017500000000223512653650150032716 0ustar ellertellert ././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleAttribute/echoDoubleAttribute-DoubleAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleAttribute/echoDoubleAttribute-Do0000755000175000017500000000164312653650150032720 0ustar ellertellert ././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleAttribute/DoubleAttribute-DoubleAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleAttribute/DoubleAttribute-Double0000755000175000017500000000160512653650150032727 0ustar ellertellert ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleAttribute/echoDoubleAttribute-DoubleAttribute01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleAttribute/echoDoubleAttribute-Do0000755000175000017500000000223312653650150032714 0ustar ellertellert gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccursFinite/0000755000175000017500000000000012653650150027547 5ustar ellertellert././@LongLink0000644000000000000000000000021200000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccursFinite/echoChoiceMinOccursFinite-ChoiceMinOccursFinite02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccursFinite/echoChoiceMinOcc0000755000175000017500000000210412653650150032614 0ustar ellertellert B BA ././@LongLink0000644000000000000000000000021200000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccursFinite/echoChoiceMinOccursFinite-ChoiceMinOccursFinite01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccursFinite/echoChoiceMinOcc0000755000175000017500000000210412653650150032614 0ustar ellertellert A AA ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccursFinite/echoChoiceMinOccursFinite-ChoiceMinOccursFinite01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccursFinite/echoChoiceMinOcc0000755000175000017500000000246712653650150032630 0ustar ellertellert A AA ././@LongLink0000644000000000000000000000020600000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccursFinite/ChoiceMinOccursFinite-ChoiceMinOccursFinite01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccursFinite/ChoiceMinOccursF0000755000175000017500000000204312653650150032617 0ustar ellertellert A AA ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccursFinite/echoChoiceMinOccursFinite-ChoiceMinOccursFinite02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccursFinite/echoChoiceMinOcc0000755000175000017500000000246512653650150032626 0ustar ellertellert B BA ././@LongLink0000644000000000000000000000020600000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccursFinite/ChoiceMinOccursFinite-ChoiceMinOccursFinite02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccursFinite/ChoiceMinOccursF0000755000175000017500000000204312653650150032617 0ustar ellertellert B BA ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccursFinite/echoChoiceMinOccursFinite-ChoiceMinOccursFinite02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccursFinite/echoChoiceMinOcc0000755000175000017500000000246712653650150032630 0ustar ellertellert B BA ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccursFinite/echoChoiceMinOccursFinite-ChoiceMinOccursFinite01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccursFinite/echoChoiceMinOcc0000755000175000017500000000246512653650150032626 0ustar ellertellert A AA gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccursFinite/0000755000175000017500000000000012653650152030131 5ustar ellertellert././@LongLink0000644000000000000000000000021400000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccursFinite/SequenceMaxOccursFinite-SequenceMaxOccursFinite01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccursFinite/SequenceMaxOcc0000755000175000017500000000215512653650152032725 0ustar ellertellert November Rain December Snow January Snow February Rain ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccursFinite/echoSequenceMaxOccursFinite-SequenceMaxOccursFinite01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccursFinite/echoSequenceMa0000755000175000017500000000271012653650152032744 0ustar ellertellert November Rain December Snow January Snow February Rain ././@LongLink0000644000000000000000000000021400000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccursFinite/SequenceMaxOccursFinite-SequenceMaxOccursFinite02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccursFinite/SequenceMaxOcc0000755000175000017500000000162012653650152032721 0ustar ellertellert December Snow ././@LongLink0000644000000000000000000000022000000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccursFinite/echoSequenceMaxOccursFinite-SequenceMaxOccursFinite02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccursFinite/echoSequenceMa0000755000175000017500000000170412653650152032746 0ustar ellertellert December Snow ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccursFinite/echoSequenceMaxOccursFinite-SequenceMaxOccursFinite01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccursFinite/echoSequenceMa0000755000175000017500000000271212653650152032746 0ustar ellertellert November Rain December Snow January Snow February Rain ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccursFinite/echoSequenceMaxOccursFinite-SequenceMaxOccursFinite02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccursFinite/echoSequenceMa0000755000175000017500000000232512653650152032746 0ustar ellertellert December Snow ././@LongLink0000644000000000000000000000022000000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccursFinite/echoSequenceMaxOccursFinite-SequenceMaxOccursFinite01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccursFinite/echoSequenceMa0000755000175000017500000000224112653650152032743 0ustar ellertellert November Rain December Snow January Snow February Rain ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccursFinite/echoSequenceMaxOccursFinite-SequenceMaxOccursFinite02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccursFinite/echoSequenceMa0000755000175000017500000000232312653650152032744 0ustar ellertellert December Snow gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TypeSubstitutionUsingXsiType/0000755000175000017500000000000012653650154031311 5ustar ellertellert././@LongLink0000644000000000000000000000024600000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TypeSubstitutionUsingXsiType/echoTypeSubstitutionUsingXsiType-TypeSubstitutionUsingXsiType01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TypeSubstitutionUsingXsiType/echoTypeS0000755000175000017500000000262112653650152033141 0ustar ellertellert p1 p2 extended part ././@LongLink0000644000000000000000000000023700000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TypeSubstitutionUsingXsiType/echoTypeSubstitutionUsingXsiType-TypeSubstitutionUsingXsiType01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TypeSubstitutionUsingXsiType/echoTypeS0000755000175000017500000000215512653650154033145 0ustar ellertellert p1 p2 extended part ././@LongLink0000644000000000000000000000024600000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TypeSubstitutionUsingXsiType/echoTypeSubstitutionUsingXsiType-TypeSubstitutionUsingXsiType01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TypeSubstitutionUsingXsiType/echoTypeS0000755000175000017500000000261712653650154033150 0ustar ellertellert p1 p2 extended part ././@LongLink0000644000000000000000000000023300000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TypeSubstitutionUsingXsiType/TypeSubstitutionUsingXsiType-TypeSubstitutionUsingXsiType01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/TypeSubstitutionUsingXsiType/TypeSubst0000755000175000017500000000206112653650154033200 0ustar ellertellert p1 p2 extended part gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IncludeRelative/0000755000175000017500000000000012653650152026454 5ustar ellertellertgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerAttribute/0000755000175000017500000000000012653650152030401 5ustar ellertellert././@LongLink0000644000000000000000000000023200000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerAttribute/echoPositiveIntegerAttribute-PositiveIntegerAttribute02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerAttribute/echoPositiveI0000755000175000017500000000232012653650152033076 0ustar ellertellert ././@LongLink0000644000000000000000000000021700000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerAttribute/PositiveIntegerAttribute-PositiveIntegerAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerAttribute/PositiveInteg0000755000175000017500000000170112653650152033117 0ustar ellertellert ././@LongLink0000644000000000000000000000023200000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerAttribute/echoPositiveIntegerAttribute-PositiveIntegerAttribute03-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerAttribute/echoPositiveI0000755000175000017500000000240612653650152033103 0ustar ellertellert ././@LongLink0000644000000000000000000000022300000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerAttribute/echoPositiveIntegerAttribute-PositiveIntegerAttribute02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerAttribute/echoPositiveI0000755000175000017500000000175012653650152033104 0ustar ellertellert ././@LongLink0000644000000000000000000000021700000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerAttribute/PositiveIntegerAttribute-PositiveIntegerAttribute03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerAttribute/PositiveInteg0000755000175000017500000000176712653650152033133 0ustar ellertellert ././@LongLink0000644000000000000000000000021700000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerAttribute/PositiveIntegerAttribute-PositiveIntegerAttribute02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerAttribute/PositiveInteg0000755000175000017500000000170112653650152033117 0ustar ellertellert ././@LongLink0000644000000000000000000000023200000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerAttribute/echoPositiveIntegerAttribute-PositiveIntegerAttribute03-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerAttribute/echoPositiveI0000755000175000017500000000240412653650152033101 0ustar ellertellert ././@LongLink0000644000000000000000000000023200000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerAttribute/echoPositiveIntegerAttribute-PositiveIntegerAttribute02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerAttribute/echoPositiveI0000755000175000017500000000231612653650152033103 0ustar ellertellert ././@LongLink0000644000000000000000000000023200000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerAttribute/echoPositiveIntegerAttribute-PositiveIntegerAttribute01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerAttribute/echoPositiveI0000755000175000017500000000231612653650152033103 0ustar ellertellert ././@LongLink0000644000000000000000000000022300000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerAttribute/echoPositiveIntegerAttribute-PositiveIntegerAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerAttribute/echoPositiveI0000755000175000017500000000175012653650152033104 0ustar ellertellert ././@LongLink0000644000000000000000000000022300000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerAttribute/echoPositiveIntegerAttribute-PositiveIntegerAttribute03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerAttribute/echoPositiveI0000755000175000017500000000203612653650152033102 0ustar ellertellert ././@LongLink0000644000000000000000000000023200000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerAttribute/echoPositiveIntegerAttribute-PositiveIntegerAttribute01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerAttribute/echoPositiveI0000755000175000017500000000232012653650152033076 0ustar ellertellert gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/0000755000175000017500000000000012653650150026117 5ustar ellertellert././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/DoubleElement-DoubleElement03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/DoubleElement-DoubleElem0000755000175000017500000000156112653650150032607 0ustar ellertellert 12.78e-2././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/echoDoubleElement-DoubleElement04-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/echoDoubleElement-Double0000755000175000017500000000217412653650150032644 0ustar ellertellert 12 ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/echoDoubleElement-DoubleElement01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/echoDoubleElement-Double0000755000175000017500000000217612653650150032646 0ustar ellertellert -1E4 ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/DoubleElement-DoubleElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/DoubleElement-DoubleElem0000755000175000017500000000155512653650150032612 0ustar ellertellert -1E4././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/echoDoubleElement-DoubleElement03-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/echoDoubleElement-Double0000755000175000017500000000220212653650150032634 0ustar ellertellert 12.78e-2 ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/echoDoubleElement-DoubleElement05-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/echoDoubleElement-Double0000755000175000017500000000217512653650150032645 0ustar ellertellert INF ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/echoDoubleElement-DoubleElement03-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/echoDoubleElement-Double0000755000175000017500000000220012653650150032632 0ustar ellertellert 12.78e-2 ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/echoDoubleElement-DoubleElement01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/echoDoubleElement-Double0000755000175000017500000000217412653650150032644 0ustar ellertellert -1E4 ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/echoDoubleElement-DoubleElement02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/echoDoubleElement-Double0000755000175000017500000000221012653650150032633 0ustar ellertellert 1267.432233E12 ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/echoDoubleElement-DoubleElement05-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/echoDoubleElement-Double0000755000175000017500000000217312653650150032643 0ustar ellertellert INF ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/DoubleElement-DoubleElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/DoubleElement-DoubleElem0000755000175000017500000000156712653650150032615 0ustar ellertellert 1267.432233E12././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/DoubleElement-DoubleElement05.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/DoubleElement-DoubleElem0000755000175000017500000000155412653650150032611 0ustar ellertellert INF././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/echoDoubleElement-DoubleElement03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/echoDoubleElement-Double0000755000175000017500000000161212653650150032640 0ustar ellertellert 12.78e-2 ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/echoDoubleElement-DoubleElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/echoDoubleElement-Double0000755000175000017500000000162012653650150032637 0ustar ellertellert 1267.432233E12 ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/echoDoubleElement-DoubleElement02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/echoDoubleElement-Double0000755000175000017500000000220612653650150032640 0ustar ellertellert 1267.432233E12 ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/echoDoubleElement-DoubleElement04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/echoDoubleElement-Double0000755000175000017500000000160412653650150032641 0ustar ellertellert 12 ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/echoDoubleElement-DoubleElement04-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/echoDoubleElement-Double0000755000175000017500000000217212653650150032642 0ustar ellertellert 12 ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/DoubleElement-DoubleElement04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/DoubleElement-DoubleElem0000755000175000017500000000155312653650150032610 0ustar ellertellert 12././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/echoDoubleElement-DoubleElement05.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/echoDoubleElement-Double0000755000175000017500000000160512653650150032642 0ustar ellertellert INF ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/echoDoubleElement-DoubleElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/echoDoubleElement-Double0000755000175000017500000000160612653650150032643 0ustar ellertellert -1E4 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntSimpleTypePattern/0000755000175000017500000000000012653650154031200 5ustar ellertellert././@LongLink0000644000000000000000000000024600000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntSimpleTypePattern/echoUnsignedIntSimpleTypePattern-UnsignedIntSimpleTypePattern02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntSimpleTypePattern/echoUnsig0000755000175000017500000000231012653650154033046 0ustar ellertellert 009 ././@LongLink0000644000000000000000000000024600000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntSimpleTypePattern/echoUnsignedIntSimpleTypePattern-UnsignedIntSimpleTypePattern01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntSimpleTypePattern/echoUnsig0000755000175000017500000000230612653650154033053 0ustar ellertellert 123 ././@LongLink0000644000000000000000000000023300000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntSimpleTypePattern/UnsignedIntSimpleTypePattern-UnsignedIntSimpleTypePattern02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntSimpleTypePattern/UnsignedI0000755000175000017500000000170612653650154033017 0ustar ellertellert 009././@LongLink0000644000000000000000000000023300000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntSimpleTypePattern/UnsignedIntSimpleTypePattern-UnsignedIntSimpleTypePattern01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntSimpleTypePattern/UnsignedI0000755000175000017500000000170612653650154033017 0ustar ellertellert 123././@LongLink0000644000000000000000000000023700000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntSimpleTypePattern/echoUnsignedIntSimpleTypePattern-UnsignedIntSimpleTypePattern02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntSimpleTypePattern/echoUnsig0000755000175000017500000000175612653650154033063 0ustar ellertellert 009 ././@LongLink0000644000000000000000000000023700000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntSimpleTypePattern/echoUnsignedIntSimpleTypePattern-UnsignedIntSimpleTypePattern01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntSimpleTypePattern/echoUnsig0000755000175000017500000000175612653650154033063 0ustar ellertellert 123 ././@LongLink0000644000000000000000000000024600000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntSimpleTypePattern/echoUnsignedIntSimpleTypePattern-UnsignedIntSimpleTypePattern01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntSimpleTypePattern/echoUnsig0000755000175000017500000000231012653650154033046 0ustar ellertellert 123 ././@LongLink0000644000000000000000000000024600000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntSimpleTypePattern/echoUnsignedIntSimpleTypePattern-UnsignedIntSimpleTypePattern02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntSimpleTypePattern/echoUnsig0000755000175000017500000000230612653650154033053 0ustar ellertellert 009 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongSimpleTypePattern/0000755000175000017500000000000012653650152027646 5ustar ellertellert././@LongLink0000644000000000000000000000021200000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongSimpleTypePattern/echoLongSimpleTypePattern-LongSimpleTypePattern01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongSimpleTypePattern/echoLongSimpleTy0000755000175000017500000000167512653650152033032 0ustar ellertellert 123 ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongSimpleTypePattern/echoLongSimpleTypePattern-LongSimpleTypePattern01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongSimpleTypePattern/echoLongSimpleTy0000755000175000017500000000224512653650152033024 0ustar ellertellert 123 ././@LongLink0000644000000000000000000000020600000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongSimpleTypePattern/LongSimpleTypePattern-LongSimpleTypePattern01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongSimpleTypePattern/LongSimpleTypePa0000755000175000017500000000163412653650152032774 0ustar ellertellert 123././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongSimpleTypePattern/echoLongSimpleTypePattern-LongSimpleTypePattern02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongSimpleTypePattern/echoLongSimpleTy0000755000175000017500000000224512653650152033024 0ustar ellertellert 009 ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongSimpleTypePattern/echoLongSimpleTypePattern-LongSimpleTypePattern02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongSimpleTypePattern/echoLongSimpleTy0000755000175000017500000000224312653650152033022 0ustar ellertellert 009 ././@LongLink0000644000000000000000000000020600000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongSimpleTypePattern/LongSimpleTypePattern-LongSimpleTypePattern02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongSimpleTypePattern/LongSimpleTypePa0000755000175000017500000000163412653650152032774 0ustar ellertellert 009././@LongLink0000644000000000000000000000021200000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongSimpleTypePattern/echoLongSimpleTypePattern-LongSimpleTypePattern02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongSimpleTypePattern/echoLongSimpleTy0000755000175000017500000000167512653650152033032 0ustar ellertellert 009 ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongSimpleTypePattern/echoLongSimpleTypePattern-LongSimpleTypePattern01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongSimpleTypePattern/echoLongSimpleTy0000755000175000017500000000224312653650152033022 0ustar ellertellert 123 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENElement/0000755000175000017500000000000012653650152026022 5ustar ellertellert././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENElement/NMTOKENElement-NMTOKENElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENElement/NMTOKENElement-NMTOKENE0000755000175000017500000000164612653650152031622 0ustar ellertellert vocabularies:that.as:clean:assuring-s_to:The_we:contain././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENElement/echoNMTOKENElement-NMTOKENElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENElement/echoNMTOKENElement-NMTO0000755000175000017500000000170012653650152032005 0ustar ellertellert vocabularies:that.as:clean:assuring-s_to:The_we:contain ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENElement/echoNMTOKENElement-NMTOKENElement02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENElement/echoNMTOKENElement-NMTO0000755000175000017500000000226612653650152032015 0ustar ellertellert vocabularies:that.as:clean:assuring-s_to:The_we:contain ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENElement/echoNMTOKENElement-NMTOKENElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENElement/echoNMTOKENElement-NMTO0000755000175000017500000000161312653650152032010 0ustar ellertellert id ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENElement/echoNMTOKENElement-NMTOKENElement01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENElement/echoNMTOKENElement-NMTO0000755000175000017500000000217712653650152032016 0ustar ellertellert id ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENElement/NMTOKENElement-NMTOKENElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENElement/NMTOKENElement-NMTOKENE0000755000175000017500000000156112653650152031616 0ustar ellertellert id././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENElement/echoNMTOKENElement-NMTOKENElement02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENElement/echoNMTOKENElement-NMTO0000755000175000017500000000226412653650152032013 0ustar ellertellert vocabularies:that.as:clean:assuring-s_to:The_we:contain ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENElement/echoNMTOKENElement-NMTOKENElement01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENElement/echoNMTOKENElement-NMTO0000755000175000017500000000220112653650152032002 0ustar ellertellert id gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IDAttribute/0000755000175000017500000000000012653650152025555 5ustar ellertellert././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IDAttribute/IDAttribute-IDAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IDAttribute/IDAttribute-IDAttribute01.0000755000175000017500000000154612653650152032266 0ustar ellertellert ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IDAttribute/echoIDAttribute-IDAttribute01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IDAttribute/echoIDAttribute-IDAttribut0000755000175000017500000000220212653650152032527 0ustar ellertellert ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IDAttribute/echoIDAttribute-IDAttribute01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IDAttribute/echoIDAttribute-IDAttribut0000755000175000017500000000220012653650152032525 0ustar ellertellert ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IDAttribute/echoIDAttribute-IDAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IDAttribute/echoIDAttribute-IDAttribut0000755000175000017500000000160012653650152032530 0ustar ellertellert gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NotMixed/0000755000175000017500000000000012653650152025124 5ustar ellertellert././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NotMixed/echoNotMixed-NotMixedExample01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NotMixed/echoNotMixed-NotMixedExample00000755000175000017500000000224412653650152032563 0ustar ellertellert Stuff ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NotMixed/NotMixed-NotMixedExample01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NotMixed/NotMixed-NotMixedExample01.xm0000755000175000017500000000161112653650152032425 0ustar ellertellert Stuff ././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NotMixed/echoNotMixed-NotMixedExample01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NotMixed/echoNotMixed-NotMixedExample00000755000175000017500000000163512653650152032566 0ustar ellertellert Stuff ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NotMixed/echoNotMixed-NotMixedExample01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NotMixed/echoNotMixed-NotMixedExample00000755000175000017500000000224612653650152032565 0ustar ellertellert Stuff gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/0000755000175000017500000000000012653650152025754 5ustar ellertellert././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/echoFloatElement-FloatElement04-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/echoFloatElement-FloatEle0000755000175000017500000000216712653650152032617 0ustar ellertellert 12 ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/echoFloatElement-FloatElement01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/echoFloatElement-FloatEle0000755000175000017500000000217112653650152032612 0ustar ellertellert -1E4 ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/echoFloatElement-FloatElement04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/echoFloatElement-FloatEle0000755000175000017500000000157512653650152032621 0ustar ellertellert 12 ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/FloatElement-FloatElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/FloatElement-FloatElement0000755000175000017500000000154712653650152032645 0ustar ellertellert -1E4././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/echoFloatElement-FloatElement05-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/echoFloatElement-FloatEle0000755000175000017500000000217012653650152032611 0ustar ellertellert INF ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/FloatElement-FloatElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/FloatElement-FloatElement0000755000175000017500000000156012653650152032640 0ustar ellertellert 1267.43233E12././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/FloatElement-FloatElement05.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/FloatElement-FloatElement0000755000175000017500000000154612653650152032644 0ustar ellertellert INF././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/echoFloatElement-FloatElement02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/echoFloatElement-FloatEle0000755000175000017500000000220212653650152032605 0ustar ellertellert 1267.43233E12 ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/echoFloatElement-FloatElement05.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/echoFloatElement-FloatEle0000755000175000017500000000157612653650152032622 0ustar ellertellert INF ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/FloatElement-FloatElement04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/FloatElement-FloatElement0000755000175000017500000000154512653650152032643 0ustar ellertellert 12././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/echoFloatElement-FloatElement04-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/echoFloatElement-FloatEle0000755000175000017500000000216512653650152032615 0ustar ellertellert 12 ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/echoFloatElement-FloatElement05-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/echoFloatElement-FloatEle0000755000175000017500000000216612653650152032616 0ustar ellertellert INF ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/echoFloatElement-FloatElement02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/echoFloatElement-FloatEle0000755000175000017500000000220012653650152032603 0ustar ellertellert 1267.43233E12 ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/echoFloatElement-FloatElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/echoFloatElement-FloatEle0000755000175000017500000000161012653650152032607 0ustar ellertellert 1267.43233E12 ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/echoFloatElement-FloatElement03-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/echoFloatElement-FloatEle0000755000175000017500000000217512653650152032616 0ustar ellertellert 12.78e-2 ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/FloatElement-FloatElement03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/FloatElement-FloatElement0000755000175000017500000000155312653650152032642 0ustar ellertellert 12.78e-2././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/echoFloatElement-FloatElement03-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/echoFloatElement-FloatEle0000755000175000017500000000217312653650152032614 0ustar ellertellert 12.78e-2 ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/echoFloatElement-FloatElement01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/echoFloatElement-FloatEle0000755000175000017500000000216712653650152032617 0ustar ellertellert -1E4 ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/echoFloatElement-FloatElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/echoFloatElement-FloatEle0000755000175000017500000000157712653650152032623 0ustar ellertellert -1E4 ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/echoFloatElement-FloatElement03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/echoFloatElement-FloatEle0000755000175000017500000000160312653650152032611 0ustar ellertellert 12.78e-2 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatAttribute/0000755000175000017500000000000012653650152026326 5ustar ellertellert././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatAttribute/echoFloatAttribute-FloatAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatAttribute/echoFloatAttribute-Floa0000755000175000017500000000164012653650152032724 0ustar ellertellert ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatAttribute/echoFloatAttribute-FloatAttribute01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatAttribute/echoFloatAttribute-Floa0000755000175000017500000000223412653650152032724 0ustar ellertellert ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatAttribute/echoFloatAttribute-FloatAttribute01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatAttribute/echoFloatAttribute-Floa0000755000175000017500000000223212653650152032722 0ustar ellertellert ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatAttribute/FloatAttribute-FloatAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FloatAttribute/FloatAttribute-FloatAtt0000755000175000017500000000160312653650152032721 0ustar ellertellert gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccursFinite/0000755000175000017500000000000012653650152027750 5ustar ellertellert././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccursFinite/echoElementMinOccursFinite-ElementMinOccursFinite01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccursFinite/echoElementMinO0000755000175000017500000000264412653650152032717 0ustar ellertellert item1 item3 item2 ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccursFinite/echoElementMinOccursFinite-ElementMinOccursFinite01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccursFinite/echoElementMinO0000755000175000017500000000264212653650152032715 0ustar ellertellert item1 item3 item2 ././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccursFinite/echoElementMinOccursFinite-ElementMinOccursFinite01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccursFinite/echoElementMinO0000755000175000017500000000225712653650152032717 0ustar ellertellert item1 item3 item2 ././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccursFinite/ElementMinOccursFinite-ElementMinOccursFinite01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccursFinite/ElementMinOccur0000755000175000017500000000221512653650152032727 0ustar ellertellert item1 item3 item2 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAttribute/0000755000175000017500000000000012653650150027530 5ustar ellertellert././@LongLink0000644000000000000000000000022500000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAttribute/echoComplexTypeAttribute-ComplexTypeAttributeExample01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAttribute/echoComplexTypeAt0000755000175000017500000000245712653650150033063 0ustar ellertellert a1250 ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAttribute/echoComplexTypeAttribute-ComplexTypeAttributeExample01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAttribute/echoComplexTypeAt0000755000175000017500000000206212653650150033053 0ustar ellertellert a1250 ././@LongLink0000644000000000000000000000021200000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAttribute/ComplexTypeAttribute-ComplexTypeAttributeExample01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAttribute/ComplexTypeAttrib0000755000175000017500000000201412653650150033072 0ustar ellertellert a1250 ././@LongLink0000644000000000000000000000022500000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAttribute/echoComplexTypeAttribute-ComplexTypeAttributeExample01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAttribute/echoComplexTypeAt0000755000175000017500000000245512653650150033061 0ustar ellertellert a1250 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccurs1/0000755000175000017500000000000012653650152027053 5ustar ellertellert././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccurs1/echoSequenceMaxOccurs1-SequenceMaxOccurs101-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccurs1/echoSequenceMaxOccu0000755000175000017500000000225512653650152032674 0ustar ellertellert 44 ././@LongLink0000644000000000000000000000017500000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccurs1/SequenceMaxOccurs1-SequenceMaxOccurs101.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccurs1/SequenceMaxOccurs1-0000755000175000017500000000161212653650152032534 0ustar ellertellert 44 ././@LongLink0000644000000000000000000000020100000000000011574 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccurs1/echoSequenceMaxOccurs1-SequenceMaxOccurs101.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccurs1/echoSequenceMaxOccu0000755000175000017500000000165612653650152032700 0ustar ellertellert 44 ././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccurs1/echoSequenceMaxOccurs1-SequenceMaxOccurs102-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccurs1/echoSequenceMaxOccu0000755000175000017500000000225412653650152032673 0ustar ellertellert 4 ././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccurs1/echoSequenceMaxOccurs1-SequenceMaxOccurs102-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccurs1/echoSequenceMaxOccu0000755000175000017500000000225612653650152032675 0ustar ellertellert 4 ././@LongLink0000644000000000000000000000020100000000000011574 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccurs1/echoSequenceMaxOccurs1-SequenceMaxOccurs102.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccurs1/echoSequenceMaxOccu0000755000175000017500000000165512653650152032677 0ustar ellertellert 4 ././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccurs1/echoSequenceMaxOccurs1-SequenceMaxOccurs101-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccurs1/echoSequenceMaxOccu0000755000175000017500000000225712653650152032676 0ustar ellertellert 44 ././@LongLink0000644000000000000000000000017500000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccurs1/SequenceMaxOccurs1-SequenceMaxOccurs102.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccurs1/SequenceMaxOccurs1-0000755000175000017500000000161112653650152032533 0ustar ellertellert 4 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DocumentationElement/0000755000175000017500000000000012653650150027516 5ustar ellertellert././@LongLink0000644000000000000000000000020300000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DocumentationElement/DocumentationElement-DocumentationElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DocumentationElement/DocumentationElem0000755000175000017500000000163612653650150033066 0ustar ellertellert hello world././@LongLink0000644000000000000000000000020700000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DocumentationElement/echoDocumentationElement-DocumentationElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DocumentationElement/echoDocumentation0000755000175000017500000000167612653650150033126 0ustar ellertellert hello world ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DocumentationElement/echoDocumentationElement-DocumentationElement01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DocumentationElement/echoDocumentation0000755000175000017500000000225012653650150033113 0ustar ellertellert hello world ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DocumentationElement/echoDocumentationElement-DocumentationElement01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DocumentationElement/echoDocumentation0000755000175000017500000000224612653650150033120 0ustar ellertellert hello world gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/0000755000175000017500000000000012653650152026013 5ustar ellertellert././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/echoIntAttribute-IntAttribute04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/echoIntAttribute-IntAttri0000755000175000017500000000161712653650152032757 0ustar ellertellert ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/echoIntAttribute-IntAttribute03-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/echoIntAttribute-IntAttri0000755000175000017500000000221012653650152032745 0ustar ellertellert ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/IntAttribute-IntAttribute03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/IntAttribute-IntAttribute0000755000175000017500000000155512653650152033001 0ustar ellertellert ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/echoIntAttribute-IntAttribute02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/echoIntAttribute-IntAttri0000755000175000017500000000221012653650152032745 0ustar ellertellert ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/echoIntAttribute-IntAttribute03-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/echoIntAttribute-IntAttri0000755000175000017500000000220612653650152032752 0ustar ellertellert ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/echoIntAttribute-IntAttribute04-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/echoIntAttribute-IntAttri0000755000175000017500000000221712653650152032754 0ustar ellertellert ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/echoIntAttribute-IntAttribute03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/echoIntAttribute-IntAttri0000755000175000017500000000161012653650152032750 0ustar ellertellert ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/echoIntAttribute-IntAttribute02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/echoIntAttribute-IntAttri0000755000175000017500000000220612653650152032752 0ustar ellertellert ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/echoIntAttribute-IntAttribute02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/echoIntAttribute-IntAttri0000755000175000017500000000161012653650152032750 0ustar ellertellert ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/IntAttribute-IntAttribute05.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/IntAttribute-IntAttribute0000755000175000017500000000156512653650152033002 0ustar ellertellert ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/echoIntAttribute-IntAttribute05.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/echoIntAttribute-IntAttri0000755000175000017500000000162012653650152032751 0ustar ellertellert ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/echoIntAttribute-IntAttribute01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/echoIntAttribute-IntAttri0000755000175000017500000000220712653650152032753 0ustar ellertellert ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/IntAttribute-IntAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/IntAttribute-IntAttribute0000755000175000017500000000155412653650152033000 0ustar ellertellert ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/IntAttribute-IntAttribute04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/IntAttribute-IntAttribute0000755000175000017500000000156412653650152033001 0ustar ellertellert ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/echoIntAttribute-IntAttribute05-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/echoIntAttribute-IntAttri0000755000175000017500000000222012653650152032746 0ustar ellertellert ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/echoIntAttribute-IntAttribute04-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/echoIntAttribute-IntAttri0000755000175000017500000000221512653650152032752 0ustar ellertellert ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/echoIntAttribute-IntAttribute05-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/echoIntAttribute-IntAttri0000755000175000017500000000221612653650152032753 0ustar ellertellert ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/echoIntAttribute-IntAttribute01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/echoIntAttribute-IntAttri0000755000175000017500000000220512653650152032751 0ustar ellertellert ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/echoIntAttribute-IntAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/echoIntAttribute-IntAttri0000755000175000017500000000160712653650152032756 0ustar ellertellert ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/IntAttribute-IntAttribute02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/IntAttribute-IntAttribute0000755000175000017500000000155512653650152033001 0ustar ellertellert gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongElement/0000755000175000017500000000000012653650152025606 5ustar ellertellert././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongElement/LongElement-LongElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongElement/LongElement-LongElement02.0000755000175000017500000000153712653650152032402 0ustar ellertellert -1././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongElement/echoLongElement-LongElement02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongElement/echoLongElement-LongElemen0000755000175000017500000000216012653650152032626 0ustar ellertellert -1 ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongElement/LongElement-LongElement03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongElement/LongElement-LongElement03.0000755000175000017500000000154012653650152032375 0ustar ellertellert +42././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongElement/echoLongElement-LongElement04-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongElement/echoLongElement-LongElemen0000755000175000017500000000220212653650152032623 0ustar ellertellert -9223372036854775808 ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongElement/echoLongElement-LongElement05.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongElement/echoLongElement-LongElemen0000755000175000017500000000160712653650152032633 0ustar ellertellert 9223372036854775807 ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongElement/echoLongElement-LongElement05-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongElement/echoLongElement-LongElemen0000755000175000017500000000220112653650152032622 0ustar ellertellert 9223372036854775807 ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongElement/echoLongElement-LongElement03-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongElement/echoLongElement-LongElemen0000755000175000017500000000216112653650152032627 0ustar ellertellert +42 ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongElement/echoLongElement-LongElement01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongElement/echoLongElement-LongElemen0000755000175000017500000000216112653650152032627 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongElement/LongElement-LongElement05.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongElement/LongElement-LongElement05.0000755000175000017500000000156012653650152032401 0ustar ellertellert 9223372036854775807././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongElement/echoLongElement-LongElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongElement/echoLongElement-LongElemen0000755000175000017500000000156612653650152032637 0ustar ellertellert -1 ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongElement/LongElement-LongElement04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongElement/LongElement-LongElement04.0000755000175000017500000000156112653650152032401 0ustar ellertellert -9223372036854775808././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongElement/echoLongElement-LongElement01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongElement/echoLongElement-LongElemen0000755000175000017500000000215712653650152032634 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongElement/echoLongElement-LongElement04-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongElement/echoLongElement-LongElemen0000755000175000017500000000220412653650152032625 0ustar ellertellert -9223372036854775808 ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongElement/echoLongElement-LongElement02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongElement/echoLongElement-LongElemen0000755000175000017500000000216212653650152032630 0ustar ellertellert -1 ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongElement/echoLongElement-LongElement05-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongElement/echoLongElement-LongElemen0000755000175000017500000000220312653650152032624 0ustar ellertellert 9223372036854775807 ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongElement/LongElement-LongElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongElement/LongElement-LongElement01.0000755000175000017500000000153612653650152032400 0ustar ellertellert 1././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongElement/echoLongElement-LongElement03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongElement/echoLongElement-LongElemen0000755000175000017500000000156712653650152032640 0ustar ellertellert +42 ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongElement/echoLongElement-LongElement03-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongElement/echoLongElement-LongElemen0000755000175000017500000000216312653650152032631 0ustar ellertellert +42 ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongElement/echoLongElement-LongElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongElement/echoLongElement-LongElemen0000755000175000017500000000156512653650152032636 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongElement/echoLongElement-LongElement04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongElement/echoLongElement-LongElemen0000755000175000017500000000161012653650152032625 0ustar ellertellert -9223372036854775808 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAnyAttribute/0000755000175000017500000000000012653650150030200 5ustar ellertellert././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAnyAttribute/echoComplexTypeAnyAttribute-ComplexTypeAnyAttribute01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAnyAttribute/echoComplexTyp0000755000175000017500000000250612653650150033074 0ustar ellertellert string string ././@LongLink0000644000000000000000000000021400000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAnyAttribute/ComplexTypeAnyAttribute-ComplexTypeAnyAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAnyAttribute/ComplexTypeAny0000755000175000017500000000205512653650150033051 0ustar ellertellert string string ././@LongLink0000644000000000000000000000022000000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAnyAttribute/echoComplexTypeAnyAttribute-ComplexTypeAnyAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAnyAttribute/echoComplexTyp0000755000175000017500000000212312653650150033067 0ustar ellertellert string string ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAnyAttribute/echoComplexTypeAnyAttribute-ComplexTypeAnyAttribute01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAnyAttribute/echoComplexTyp0000755000175000017500000000251012653650150033067 0ustar ellertellert string string gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleSimpleTypePattern/0000755000175000017500000000000012653650150030157 5ustar ellertellert././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleSimpleTypePattern/echoDoubleSimpleTypePattern-DoubleSimpleTypePattern01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleSimpleTypePattern/echoDoubleSimp0000755000175000017500000000225512653650150033013 0ustar ellertellert 123 ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleSimpleTypePattern/echoDoubleSimpleTypePattern-DoubleSimpleTypePattern01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleSimpleTypePattern/echoDoubleSimp0000755000175000017500000000225712653650150033015 0ustar ellertellert 123 ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleSimpleTypePattern/echoDoubleSimpleTypePattern-DoubleSimpleTypePattern02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleSimpleTypePattern/echoDoubleSimp0000755000175000017500000000225512653650150033013 0ustar ellertellert 009 ././@LongLink0000644000000000000000000000021400000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleSimpleTypePattern/DoubleSimpleTypePattern-DoubleSimpleTypePattern01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleSimpleTypePattern/DoubleSimpleTy0000755000175000017500000000165012653650150033010 0ustar ellertellert 123././@LongLink0000644000000000000000000000022000000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleSimpleTypePattern/echoDoubleSimpleTypePattern-DoubleSimpleTypePattern02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleSimpleTypePattern/echoDoubleSimp0000755000175000017500000000171312653650150033011 0ustar ellertellert 009 ././@LongLink0000644000000000000000000000022000000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleSimpleTypePattern/echoDoubleSimpleTypePattern-DoubleSimpleTypePattern01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleSimpleTypePattern/echoDoubleSimp0000755000175000017500000000171312653650150033011 0ustar ellertellert 123 ././@LongLink0000644000000000000000000000021400000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleSimpleTypePattern/DoubleSimpleTypePattern-DoubleSimpleTypePattern02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleSimpleTypePattern/DoubleSimpleTy0000755000175000017500000000165012653650150033010 0ustar ellertellert 009././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleSimpleTypePattern/echoDoubleSimpleTypePattern-DoubleSimpleTypePattern02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DoubleSimpleTypePattern/echoDoubleSimp0000755000175000017500000000225712653650150033015 0ustar ellertellert 009 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAttributeExtension/0000755000175000017500000000000012653650150031425 5ustar ellertellert././@LongLink0000644000000000000000000000024200000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAttributeExtension/echoComplexTypeAttributeExtension-ComplexTypeAttributeExtension01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAttributeExtension/echoComp0000755000175000017500000000206312653650150033111 0ustar ellertellert Mary ././@LongLink0000644000000000000000000000023600000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAttributeExtension/ComplexTypeAttributeExtension-ComplexTypeAttributeExtension01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAttributeExtension/ComplexT0000755000175000017500000000200712653650150033105 0ustar ellertellert Mary ././@LongLink0000644000000000000000000000025100000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAttributeExtension/echoComplexTypeAttributeExtension-ComplexTypeAttributeExtension01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAttributeExtension/echoComp0000755000175000017500000000242112653650150033107 0ustar ellertellert Mary ././@LongLink0000644000000000000000000000025100000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAttributeExtension/echoComplexTypeAttributeExtension-ComplexTypeAttributeExtension01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAttributeExtension/echoComp0000755000175000017500000000241712653650150033114 0ustar ellertellert Mary gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnqualifiedLocalAttributes/0000755000175000017500000000000012653650154030667 5ustar ellertellert././@LongLink0000644000000000000000000000022500000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnqualifiedLocalAttributes/UnqualifiedLocalAttributes-UnqualifiedLocalAttributes01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnqualifiedLocalAttributes/Unqualified0000755000175000017500000000167212653650154033071 0ustar ellertellert foo././@LongLink0000644000000000000000000000024000000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnqualifiedLocalAttributes/echoUnqualifiedLocalAttributes-UnqualifiedLocalAttributes01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnqualifiedLocalAttributes/echoUnquali0000755000175000017500000000227612653650154033101 0ustar ellertellert foo ././@LongLink0000644000000000000000000000024000000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnqualifiedLocalAttributes/echoUnqualifiedLocalAttributes-UnqualifiedLocalAttributes01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnqualifiedLocalAttributes/echoUnquali0000755000175000017500000000227412653650154033077 0ustar ellertellert foo ././@LongLink0000644000000000000000000000023100000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnqualifiedLocalAttributes/echoUnqualifiedLocalAttributes-UnqualifiedLocalAttributes01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnqualifiedLocalAttributes/echoUnquali0000755000175000017500000000174012653650154033074 0ustar ellertellert foo gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NormalizedStringElement/0000755000175000017500000000000012653650152030202 5ustar ellertellert././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NormalizedStringElement/echoNormalizedStringElement-NormalizedStringElement01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NormalizedStringElement/echoNormalized0000755000175000017500000000222012653650152033067 0ustar ellertellert ././@LongLink0000644000000000000000000000022000000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NormalizedStringElement/echoNormalizedStringElement-NormalizedStringElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NormalizedStringElement/echoNormalized0000755000175000017500000000165412653650152033101 0ustar ellertellert ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NormalizedStringElement/echoNormalizedStringElement-NormalizedStringElement01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NormalizedStringElement/echoNormalized0000755000175000017500000000221612653650152033074 0ustar ellertellert ././@LongLink0000644000000000000000000000021400000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NormalizedStringElement/NormalizedStringElement-NormalizedStringElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NormalizedStringElement/NormalizedStri0000755000175000017500000000166712653650152033110 0ustar ellertellert How now brown cow.././@LongLink0000644000000000000000000000022000000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NormalizedStringElement/echoNormalizedStringElement-NormalizedStringElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NormalizedStringElement/echoNormalized0000755000175000017500000000173212653650152033076 0ustar ellertellert How now brown cow. ././@LongLink0000644000000000000000000000021400000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NormalizedStringElement/NormalizedStringElement-NormalizedStringElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NormalizedStringElement/NormalizedStri0000755000175000017500000000161112653650152033075 0ustar ellertellert ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NormalizedStringElement/echoNormalizedStringElement-NormalizedStringElement02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NormalizedStringElement/echoNormalized0000755000175000017500000000227412653650152033100 0ustar ellertellert How now brown cow. ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NormalizedStringElement/echoNormalizedStringElement-NormalizedStringElement02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NormalizedStringElement/echoNormalized0000755000175000017500000000227612653650152033102 0ustar ellertellert How now brown cow. gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnionSimpleDateString/0000755000175000017500000000000012653650154027626 5ustar ellertellert././@LongLink0000644000000000000000000000020600000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnionSimpleDateString/UnionSimpleDateString-UnionSimpleDateString01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnionSimpleDateString/UnionSimpleDateS0000755000175000017500000000164512653650154032745 0ustar ellertellert Monday Night././@LongLink0000644000000000000000000000020600000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnionSimpleDateString/UnionSimpleDateString-UnionSimpleDateString02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnionSimpleDateString/UnionSimpleDateS0000755000175000017500000000164312653650154032743 0ustar ellertellert 2006-06-06././@LongLink0000644000000000000000000000021200000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnionSimpleDateString/echoUnionSimpleDateString-UnionSimpleDateString01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnionSimpleDateString/echoUnionSimpleD0000755000175000017500000000170612653650154032765 0ustar ellertellert Monday Night ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnionSimpleDateString/echoUnionSimpleDateString-UnionSimpleDateString02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnionSimpleDateString/echoUnionSimpleD0000755000175000017500000000225412653650154032764 0ustar ellertellert 2006-06-06 ././@LongLink0000644000000000000000000000021200000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnionSimpleDateString/echoUnionSimpleDateString-UnionSimpleDateString02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnionSimpleDateString/echoUnionSimpleD0000755000175000017500000000170412653650154032763 0ustar ellertellert 2006-06-06 ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnionSimpleDateString/echoUnionSimpleDateString-UnionSimpleDateString02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnionSimpleDateString/echoUnionSimpleD0000755000175000017500000000225212653650154032762 0ustar ellertellert 2006-06-06 ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnionSimpleDateString/echoUnionSimpleDateString-UnionSimpleDateString01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnionSimpleDateString/echoUnionSimpleD0000755000175000017500000000225412653650154032764 0ustar ellertellert Monday Night ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnionSimpleDateString/echoUnionSimpleDateString-UnionSimpleDateString01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnionSimpleDateString/echoUnionSimpleD0000755000175000017500000000225612653650154032766 0ustar ellertellert Monday Night gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/0000755000175000017500000000000012653650152026160 5ustar ellertellert././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/echoLongAttribute-LongAttribute03-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/echoLongAttribute-LongAt0000755000175000017500000000221412653650152032711 0ustar ellertellert ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/echoLongAttribute-LongAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/echoLongAttribute-LongAt0000755000175000017500000000162112653650152032712 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/echoLongAttribute-LongAttribute03-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/echoLongAttribute-LongAt0000755000175000017500000000221612653650152032713 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/echoLongAttribute-LongAttribute01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/echoLongAttribute-LongAt0000755000175000017500000000221512653650152032712 0ustar ellertellert ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/LongAttribute-LongAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/LongAttribute-LongAttrib0000755000175000017500000000156512653650152032743 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/echoLongAttribute-LongAttribute05-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/echoLongAttribute-LongAt0000755000175000017500000000223612653650152032715 0ustar ellertellert ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/echoLongAttribute-LongAttribute02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/echoLongAttribute-LongAt0000755000175000017500000000162212653650152032713 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/echoLongAttribute-LongAttribute04-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/echoLongAttribute-LongAt0000755000175000017500000000223712653650152032716 0ustar ellertellert ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/echoLongAttribute-LongAttribute03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/echoLongAttribute-LongAt0000755000175000017500000000162012653650152032711 0ustar ellertellert ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/LongAttribute-LongAttribute03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/LongAttribute-LongAttrib0000755000175000017500000000156412653650152032742 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/echoLongAttribute-LongAttribute02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/echoLongAttribute-LongAt0000755000175000017500000000221612653650152032713 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/echoLongAttribute-LongAttribute04-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/echoLongAttribute-LongAt0000755000175000017500000000223512653650152032714 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/echoLongAttribute-LongAttribute01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/echoLongAttribute-LongAt0000755000175000017500000000221712653650152032714 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/echoLongAttribute-LongAttribute02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/echoLongAttribute-LongAt0000755000175000017500000000222012653650152032706 0ustar ellertellert ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/echoLongAttribute-LongAttribute05.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/echoLongAttribute-LongAt0000755000175000017500000000164012653650152032713 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/echoLongAttribute-LongAttribute05-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/echoLongAttribute-LongAt0000755000175000017500000000223412653650152032713 0ustar ellertellert ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/LongAttribute-LongAttribute04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/LongAttribute-LongAttrib0000755000175000017500000000160512653650152032736 0ustar ellertellert ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/LongAttribute-LongAttribute02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/LongAttribute-LongAttrib0000755000175000017500000000156612653650152032744 0ustar ellertellert ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/echoLongAttribute-LongAttribute04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/echoLongAttribute-LongAt0000755000175000017500000000164112653650152032714 0ustar ellertellert ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/LongAttribute-LongAttribute05.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/LongAttribute-LongAttrib0000755000175000017500000000160412653650152032735 0ustar ellertellert gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerElement/0000755000175000017500000000000012653650152030502 5ustar ellertellert././@LongLink0000644000000000000000000000022600000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerElement/echoNonPositiveIntegerElement-NonPositiveIntegerElement04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerElement/echoNonPosit0000755000175000017500000000202112653650152033033 0ustar ellertellert -1234324234532534254325234534252345342534253425324534253244 ././@LongLink0000644000000000000000000000022600000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerElement/echoNonPositiveIntegerElement-NonPositiveIntegerElement03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerElement/echoNonPosit0000755000175000017500000000173012653650152033041 0ustar ellertellert +0 ././@LongLink0000644000000000000000000000022200000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerElement/NonPositiveIntegerElement-NonPositiveIntegerElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerElement/NonPositiveI0000755000175000017500000000166312653650152033024 0ustar ellertellert -1././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerElement/echoNonPositiveIntegerElement-NonPositiveIntegerElement04-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerElement/echoNonPosit0000755000175000017500000000236112653650152033042 0ustar ellertellert -1234324234532534254325234534252345342534253425324534253244 ././@LongLink0000644000000000000000000000022200000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerElement/NonPositiveIntegerElement-NonPositiveIntegerElement04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerElement/NonPositiveI0000755000175000017500000000175412653650152033025 0ustar ellertellert -1234324234532534254325234534252345342534253425324534253244././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerElement/echoNonPositiveIntegerElement-NonPositiveIntegerElement03-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerElement/echoNonPosit0000755000175000017500000000227012653650152033041 0ustar ellertellert +0 ././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerElement/echoNonPositiveIntegerElement-NonPositiveIntegerElement04-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerElement/echoNonPosit0000755000175000017500000000235712653650152033047 0ustar ellertellert -1234324234532534254325234534252345342534253425324534253244 ././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerElement/echoNonPositiveIntegerElement-NonPositiveIntegerElement03-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerElement/echoNonPosit0000755000175000017500000000226612653650152033046 0ustar ellertellert +0 ././@LongLink0000644000000000000000000000022600000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerElement/echoNonPositiveIntegerElement-NonPositiveIntegerElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerElement/echoNonPosit0000755000175000017500000000173012653650152033041 0ustar ellertellert -1 ././@LongLink0000644000000000000000000000022200000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerElement/NonPositiveIntegerElement-NonPositiveIntegerElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerElement/NonPositiveI0000755000175000017500000000166212653650152033023 0ustar ellertellert 0././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerElement/echoNonPositiveIntegerElement-NonPositiveIntegerElement01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerElement/echoNonPosit0000755000175000017500000000227012653650152033041 0ustar ellertellert -1 ././@LongLink0000644000000000000000000000022600000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerElement/echoNonPositiveIntegerElement-NonPositiveIntegerElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerElement/echoNonPosit0000755000175000017500000000172712653650152033047 0ustar ellertellert 0 ././@LongLink0000644000000000000000000000022200000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerElement/NonPositiveIntegerElement-NonPositiveIntegerElement03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerElement/NonPositiveI0000755000175000017500000000166312653650152033024 0ustar ellertellert +0././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerElement/echoNonPositiveIntegerElement-NonPositiveIntegerElement02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerElement/echoNonPosit0000755000175000017500000000226712653650152033047 0ustar ellertellert 0 ././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerElement/echoNonPositiveIntegerElement-NonPositiveIntegerElement01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerElement/echoNonPosit0000755000175000017500000000226612653650152033046 0ustar ellertellert -1 ././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerElement/echoNonPositiveIntegerElement-NonPositiveIntegerElement02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerElement/echoNonPosit0000755000175000017500000000226512653650152033045 0ustar ellertellert 0 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedStringMinMaxLength/0000755000175000017500000000000012653650152031150 5ustar ellertellert././@LongLink0000644000000000000000000000023300000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedStringMinMaxLength/RestrictedStringMinMaxLength-RestrictedStringMinMaxLength01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedStringMinMaxLength/Restricte0000755000175000017500000000172112653650152033043 0ustar ellertellert String Value 2././@LongLink0000644000000000000000000000024600000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedStringMinMaxLength/echoRestrictedStringMinMaxLength-RestrictedStringMinMaxLength01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedStringMinMaxLength/echoRestr0000755000175000017500000000232112653650152033032 0ustar ellertellert String Value 2 ././@LongLink0000644000000000000000000000023700000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedStringMinMaxLength/echoRestrictedStringMinMaxLength-RestrictedStringMinMaxLength01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedStringMinMaxLength/echoRestr0000755000175000017500000000177112653650152033042 0ustar ellertellert String Value 2 ././@LongLink0000644000000000000000000000024600000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedStringMinMaxLength/echoRestrictedStringMinMaxLength-RestrictedStringMinMaxLength01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedStringMinMaxLength/echoRestr0000755000175000017500000000232312653650152033034 0ustar ellertellert String Value 2 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NameElement/0000755000175000017500000000000012653650152025567 5ustar ellertellert././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NameElement/echoNameElement-NameElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NameElement/echoNameElement-NameElemen0000755000175000017500000000156712653650152032563 0ustar ellertellert foo ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NameElement/echoNameElement-NameElement01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NameElement/echoNameElement-NameElemen0000755000175000017500000000216112653650152032552 0ustar ellertellert foo ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NameElement/NameElement-NameElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NameElement/NameElement-NameElement01.0000755000175000017500000000154012653650152032316 0ustar ellertellert foo././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NameElement/echoNameElement-NameElement01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NameElement/echoNameElement-NameElemen0000755000175000017500000000216312653650152032554 0ustar ellertellert foo gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs1MaxOccursUnbounded/0000755000175000017500000000000012653650152032542 5ustar ellertellert././@LongLink0000644000000000000000000000027700000000000011611 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs1MaxOccursUnbounded/echoSequenceMinOccurs1MaxOccursUnbounded-SequenceMinOccurs1MaxOccursUnbounded101-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs1MaxOccursUnbounded/e0000755000175000017500000000270612653650152032721 0ustar ellertellert 44 33 24 45 64 22 ././@LongLink0000644000000000000000000000027000000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs1MaxOccursUnbounded/echoSequenceMinOccurs1MaxOccursUnbounded-SequenceMinOccurs1MaxOccursUnbounded101.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs1MaxOccursUnbounded/e0000755000175000017500000000226712653650152032723 0ustar ellertellert 44 33 24 45 64 22 ././@LongLink0000644000000000000000000000027700000000000011611 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs1MaxOccursUnbounded/echoSequenceMinOccurs1MaxOccursUnbounded-SequenceMinOccurs1MaxOccursUnbounded102-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs1MaxOccursUnbounded/e0000755000175000017500000000242212653650152032714 0ustar ellertellert 44 33 ././@LongLink0000644000000000000000000000027700000000000011611 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs1MaxOccursUnbounded/echoSequenceMinOccurs1MaxOccursUnbounded-SequenceMinOccurs1MaxOccursUnbounded101-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs1MaxOccursUnbounded/e0000755000175000017500000000270412653650152032717 0ustar ellertellert 44 33 24 45 64 22 ././@LongLink0000644000000000000000000000026400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs1MaxOccursUnbounded/SequenceMinOccurs1MaxOccursUnbounded-SequenceMinOccurs1MaxOccursUnbounded101.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs1MaxOccursUnbounded/S0000755000175000017500000000216212653650152032673 0ustar ellertellert 44 33 24 45 64 22 ././@LongLink0000644000000000000000000000027700000000000011611 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs1MaxOccursUnbounded/echoSequenceMinOccurs1MaxOccursUnbounded-SequenceMinOccurs1MaxOccursUnbounded102-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs1MaxOccursUnbounded/e0000755000175000017500000000242012653650152032712 0ustar ellertellert 44 33 ././@LongLink0000644000000000000000000000027000000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs1MaxOccursUnbounded/echoSequenceMinOccurs1MaxOccursUnbounded-SequenceMinOccurs1MaxOccursUnbounded102.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs1MaxOccursUnbounded/e0000755000175000017500000000202312653650152032711 0ustar ellertellert 44 33 ././@LongLink0000644000000000000000000000026400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs1MaxOccursUnbounded/SequenceMinOccurs1MaxOccursUnbounded-SequenceMinOccurs1MaxOccursUnbounded102.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs1MaxOccursUnbounded/S0000755000175000017500000000171612653650152032677 0ustar ellertellert 44 33 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceSkipOther/0000755000175000017500000000000012653650152030457 5ustar ellertellert././@LongLink0000644000000000000000000000022600000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceSkipOther/echoExtendedSequenceSkipOther-ExtendedSequenceSkipOther01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceSkipOther/echoExtended0000755000175000017500000000234312653650152033006 0ustar ellertellert String String Stuff ././@LongLink0000644000000000000000000000022200000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceSkipOther/ExtendedSequenceSkipOther-ExtendedSequenceSkipOther01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceSkipOther/ExtendedSequ0000755000175000017500000000227312653650152033007 0ustar ellertellert String String Stuff ././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceSkipOther/echoExtendedSequenceSkipOther-ExtendedSequenceSkipOther01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceSkipOther/echoExtended0000755000175000017500000000267012653650152033011 0ustar ellertellert String String Stuff ././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceSkipOther/echoExtendedSequenceSkipOther-ExtendedSequenceSkipOther01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceSkipOther/echoExtended0000755000175000017500000000267212653650152033013 0ustar ellertellert String String Stuff gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/0000755000175000017500000000000012653650152031014 5ustar ellertellert././@LongLink0000644000000000000000000000023000000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/NonNegativeIntegerAttribute-NonNegativeIntegerAttribute02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/NonNegativ0000755000175000017500000000172512653650152033017 0ustar ellertellert ././@LongLink0000644000000000000000000000024300000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/echoNonNegativeIntegerAttribute-NonNegativeIntegerAttribute02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/echoNonNeg0000755000175000017500000000233712653650152032772 0ustar ellertellert ././@LongLink0000644000000000000000000000023000000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/NonNegativeIntegerAttribute-NonNegativeIntegerAttribute04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/NonNegativ0000755000175000017500000000172612653650152033020 0ustar ellertellert ././@LongLink0000644000000000000000000000023400000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/echoNonNegativeIntegerAttribute-NonNegativeIntegerAttribute03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/echoNonNeg0000755000175000017500000000177612653650152033000 0ustar ellertellert ././@LongLink0000644000000000000000000000023000000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/NonNegativeIntegerAttribute-NonNegativeIntegerAttribute05.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/NonNegativ0000755000175000017500000000201212653650152033005 0ustar ellertellert ././@LongLink0000644000000000000000000000024300000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/echoNonNegativeIntegerAttribute-NonNegativeIntegerAttribute01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/echoNonNeg0000755000175000017500000000233712653650152032772 0ustar ellertellert ././@LongLink0000644000000000000000000000023000000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/NonNegativeIntegerAttribute-NonNegativeIntegerAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/NonNegativ0000755000175000017500000000172512653650152033017 0ustar ellertellert ././@LongLink0000644000000000000000000000023400000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/echoNonNegativeIntegerAttribute-NonNegativeIntegerAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/echoNonNeg0000755000175000017500000000177712653650152033001 0ustar ellertellert ././@LongLink0000644000000000000000000000023400000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/echoNonNegativeIntegerAttribute-NonNegativeIntegerAttribute02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/echoNonNeg0000755000175000017500000000177712653650152033001 0ustar ellertellert ././@LongLink0000644000000000000000000000024300000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/echoNonNegativeIntegerAttribute-NonNegativeIntegerAttribute05-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/echoNonNeg0000755000175000017500000000242412653650152032767 0ustar ellertellert ././@LongLink0000644000000000000000000000024300000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/echoNonNegativeIntegerAttribute-NonNegativeIntegerAttribute02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/echoNonNeg0000755000175000017500000000234112653650152032765 0ustar ellertellert ././@LongLink0000644000000000000000000000024300000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/echoNonNegativeIntegerAttribute-NonNegativeIntegerAttribute05-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/echoNonNeg0000755000175000017500000000242612653650152032771 0ustar ellertellert ././@LongLink0000644000000000000000000000024300000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/echoNonNegativeIntegerAttribute-NonNegativeIntegerAttribute03-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/echoNonNeg0000755000175000017500000000234012653650152032764 0ustar ellertellert ././@LongLink0000644000000000000000000000024300000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/echoNonNegativeIntegerAttribute-NonNegativeIntegerAttribute03-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/echoNonNeg0000755000175000017500000000233612653650152032771 0ustar ellertellert ././@LongLink0000644000000000000000000000023000000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/NonNegativeIntegerAttribute-NonNegativeIntegerAttribute03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/NonNegativ0000755000175000017500000000172412653650152033016 0ustar ellertellert ././@LongLink0000644000000000000000000000024300000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/echoNonNegativeIntegerAttribute-NonNegativeIntegerAttribute04-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/echoNonNeg0000755000175000017500000000234212653650152032766 0ustar ellertellert ././@LongLink0000644000000000000000000000024300000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/echoNonNegativeIntegerAttribute-NonNegativeIntegerAttribute04-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/echoNonNeg0000755000175000017500000000234012653650152032764 0ustar ellertellert ././@LongLink0000644000000000000000000000024300000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/echoNonNegativeIntegerAttribute-NonNegativeIntegerAttribute01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/echoNonNeg0000755000175000017500000000234112653650152032765 0ustar ellertellert ././@LongLink0000644000000000000000000000023400000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/echoNonNegativeIntegerAttribute-NonNegativeIntegerAttribute04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/echoNonNeg0000755000175000017500000000200012653650152032755 0ustar ellertellert ././@LongLink0000644000000000000000000000023400000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/echoNonNegativeIntegerAttribute-NonNegativeIntegerAttribute05.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/echoNonNeg0000755000175000017500000000206412653650152032767 0ustar ellertellert gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs1/0000755000175000017500000000000012653650152027051 5ustar ellertellert././@LongLink0000644000000000000000000000017500000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs1/SequenceMinOccurs1-SequenceMinOccurs101.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs1/SequenceMinOccurs1-0000755000175000017500000000172312653650152032533 0ustar ellertellert item1 ././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs1/echoSequenceMinOccurs1-SequenceMinOccurs101-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs1/echoSequenceMinOccu0000755000175000017500000000234612653650152032671 0ustar ellertellert item1 ././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs1/echoSequenceMinOccurs1-SequenceMinOccurs101-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs1/echoSequenceMinOccu0000755000175000017500000000234412653650152032667 0ustar ellertellert item1 ././@LongLink0000644000000000000000000000020100000000000011574 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs1/echoSequenceMinOccurs1-SequenceMinOccurs101.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs1/echoSequenceMinOccu0000755000175000017500000000176112653650152032671 0ustar ellertellert item1 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IDREFSAttribute/0000755000175000017500000000000012653650152026235 5ustar ellertellert././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IDREFSAttribute/echoIDREFSAttribute-IDREFSAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IDREFSAttribute/echoIDREFSAttribute-ID0000755000175000017500000000164212653650152032157 0ustar ellertellert ././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IDREFSAttribute/IDREFSAttribute-IDREFSAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IDREFSAttribute/IDREFSAttribute-IDREFS0000755000175000017500000000160412653650152031776 0ustar ellertellert ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IDREFSAttribute/echoIDREFSAttribute-IDREFSAttribute01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IDREFSAttribute/echoIDREFSAttribute-ID0000755000175000017500000000223412653650152032155 0ustar ellertellert ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IDREFSAttribute/echoIDREFSAttribute-IDREFSAttribute01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IDREFSAttribute/echoIDREFSAttribute-ID0000755000175000017500000000223212653650152032153 0ustar ellertellert gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NillableElement/0000755000175000017500000000000012653650152026431 5ustar ellertellert././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NillableElement/echoNillableElement-NillableElement02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NillableElement/echoNillableElement-Ni0000755000175000017500000000244312653650152032621 0ustar ellertellert Paul Sumner Downey ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NillableElement/echoNillableElement-NillableElement01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NillableElement/echoNillableElement-Ni0000755000175000017500000000243712653650152032624 0ustar ellertellert Paul Downey ././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NillableElement/NillableElement-NillableElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NillableElement/NillableElement-Nillab0000755000175000017500000000202012653650152032604 0ustar ellertellert Paul Sumner Downey ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NillableElement/echoNillableElement-NillableElement01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NillableElement/echoNillableElement-Ni0000755000175000017500000000243512653650152032622 0ustar ellertellert Paul Downey ././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NillableElement/echoNillableElement-NillableElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NillableElement/echoNillableElement-Ni0000755000175000017500000000205012653650152032613 0ustar ellertellert Paul Sumner Downey ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NillableElement/echoNillableElement-NillableElement02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NillableElement/echoNillableElement-Ni0000755000175000017500000000244512653650152032623 0ustar ellertellert Paul Sumner Downey ././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NillableElement/NillableElement-NillableElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NillableElement/NillableElement-Nillab0000755000175000017500000000201212653650152032605 0ustar ellertellert Paul Downey ././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NillableElement/echoNillableElement-NillableElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NillableElement/echoNillableElement-Ni0000755000175000017500000000204212653650152032614 0ustar ellertellert Paul Downey gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyTypeElement/0000755000175000017500000000000012653650150026276 5ustar ellertellert././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyTypeElement/echoAnyTypeElement-AnyTypeElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyTypeElement/echoAnyTypeElement-AnyT0000755000175000017500000000171112653650150032637 0ustar ellertellert cheese ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyTypeElement/AnyTypeElement-AnyTypeElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyTypeElement/AnyTypeElement-AnyTypeE0000755000175000017500000000153412653650150032626 0ustar ellertellert ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyTypeElement/AnyTypeElement-AnyTypeElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyTypeElement/AnyTypeElement-AnyTypeE0000755000175000017500000000165712653650150032634 0ustar ellertellert cheese ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyTypeElement/echoAnyTypeElement-AnyTypeElement02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyTypeElement/echoAnyTypeElement-AnyT0000755000175000017500000000231512653650150032640 0ustar ellertellert cheese ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyTypeElement/echoAnyTypeElement-AnyTypeElement01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyTypeElement/echoAnyTypeElement-AnyT0000755000175000017500000000215412653650150032641 0ustar ellertellert ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyTypeElement/echoAnyTypeElement-AnyTypeElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyTypeElement/echoAnyTypeElement-AnyT0000755000175000017500000000156612653650150032647 0ustar ellertellert ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyTypeElement/echoAnyTypeElement-AnyTypeElement02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyTypeElement/echoAnyTypeElement-AnyT0000755000175000017500000000231712653650150032642 0ustar ellertellert cheese ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyTypeElement/echoAnyTypeElement-AnyTypeElement01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyTypeElement/echoAnyTypeElement-AnyT0000755000175000017500000000215212653650150032637 0ustar ellertellert gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxExclusive/0000755000175000017500000000000012653650152030043 5ustar ellertellert././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxExclusive/echoRestrictedMaxExclusive-RestrictedMaxExclusive02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxExclusive/echoRestrictedM0000755000175000017500000000170212653650152033055 0ustar ellertellert 2 ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxExclusive/echoRestrictedMaxExclusive-RestrictedMaxExclusive01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxExclusive/echoRestrictedM0000755000175000017500000000225012653650152033054 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxExclusive/RestrictedMaxExclusive-RestrictedMaxExclusive01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxExclusive/RestrictedMaxEx0000755000175000017500000000164012653650152033045 0ustar ellertellert 1././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxExclusive/echoRestrictedMaxExclusive-RestrictedMaxExclusive02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxExclusive/echoRestrictedM0000755000175000017500000000224612653650152033061 0ustar ellertellert 2 ././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxExclusive/echoRestrictedMaxExclusive-RestrictedMaxExclusive01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxExclusive/echoRestrictedM0000755000175000017500000000170212653650152033055 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxExclusive/echoRestrictedMaxExclusive-RestrictedMaxExclusive02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxExclusive/echoRestrictedM0000755000175000017500000000225012653650152033054 0ustar ellertellert 2 ././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxExclusive/RestrictedMaxExclusive-RestrictedMaxExclusive02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxExclusive/RestrictedMaxEx0000755000175000017500000000164012653650152033045 0ustar ellertellert 2././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxExclusive/echoRestrictedMaxExclusive-RestrictedMaxExclusive01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxExclusive/echoRestrictedM0000755000175000017500000000224612653650152033061 0ustar ellertellert 1 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AllElement/0000755000175000017500000000000012653650150025415 5ustar ellertellert././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AllElement/echoAllElement-AllElement01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AllElement/echoAllElement-AllElement010000755000175000017500000000254312653650150032411 0ustar ellertellert element1 element2 element3 element4 element5 ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AllElement/echoAllElement-AllElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AllElement/echoAllElement-AllElement010000755000175000017500000000212012653650150032400 0ustar ellertellert element1 element2 element3 element4 element5 ././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AllElement/echoAllElement-AllElement01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AllElement/echoAllElement-AllElement010000755000175000017500000000254512653650150032413 0ustar ellertellert element1 element2 element3 element4 element5 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AllElement/AllElement-AllElement01.xml0000755000175000017500000000207212653650150032346 0ustar ellertellert element1 element2 element3 element4 element5 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/0000755000175000017500000000000012653650150026243 5ustar ellertellert././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-DecimalElement03-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-Deci0000755000175000017500000000221412653650150032541 0ustar ellertellert 12678967.543233 ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-DecimalElement05.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-Deci0000755000175000017500000000167212653650150032550 0ustar ellertellert +100000000000000000000000000000000000000000000.00 ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-DecimalElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-Deci0000755000175000017500000000161212653650150032542 0ustar ellertellert 0 ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/DecimalElement-DecimalElement07.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/DecimalElement-DecimalE0000755000175000017500000000156512653650150032511 0ustar ellertellert 210.00././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-DecimalElement02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-Deci0000755000175000017500000000220212653650150032536 0ustar ellertellert -1.23 ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/DecimalElement-DecimalElement04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/DecimalElement-DecimalE0000755000175000017500000000157212653650150032507 0ustar ellertellert +1000000.00././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-DecimalElement05-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-Deci0000755000175000017500000000225612653650150032547 0ustar ellertellert +100000000000000000000000000000000000000000000.00 ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-DecimalElement06.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-Deci0000755000175000017500000000161412653650150032544 0ustar ellertellert 210 ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-DecimalElement02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-Deci0000755000175000017500000000220412653650150032540 0ustar ellertellert -1.23 ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-DecimalElement06-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-Deci0000755000175000017500000000220012653650150032534 0ustar ellertellert 210 ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/DecimalElement-DecimalElement03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/DecimalElement-DecimalE0000755000175000017500000000157612653650150032513 0ustar ellertellert 12678967.543233././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-DecimalElement03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-Deci0000755000175000017500000000163012653650150032542 0ustar ellertellert 12678967.543233 ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/DecimalElement-DecimalElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/DecimalElement-DecimalE0000755000175000017500000000156012653650150032504 0ustar ellertellert 0././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/DecimalElement-DecimalElement05.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/DecimalElement-DecimalE0000755000175000017500000000164012653650150032503 0ustar ellertellert +100000000000000000000000000000000000000000000.00././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-DecimalElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-Deci0000755000175000017500000000161612653650150032546 0ustar ellertellert -1.23 ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-DecimalElement03-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-Deci0000755000175000017500000000221612653650150032543 0ustar ellertellert 12678967.543233 ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/DecimalElement-DecimalElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/DecimalElement-DecimalE0000755000175000017500000000156412653650150032510 0ustar ellertellert -1.23././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-DecimalElement04-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-Deci0000755000175000017500000000221212653650150032537 0ustar ellertellert +1000000.00 ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-DecimalElement07-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-Deci0000755000175000017500000000220312653650150032537 0ustar ellertellert 210.00 ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-DecimalElement06-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-Deci0000755000175000017500000000220212653650150032536 0ustar ellertellert 210 ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-DecimalElement05-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-Deci0000755000175000017500000000226012653650150032542 0ustar ellertellert +100000000000000000000000000000000000000000000.00 ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-DecimalElement07-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-Deci0000755000175000017500000000220512653650150032541 0ustar ellertellert 210.00 ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-DecimalElement04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-Deci0000755000175000017500000000162412653650150032545 0ustar ellertellert +1000000.00 ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/DecimalElement-DecimalElement06.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/DecimalElement-DecimalE0000755000175000017500000000156212653650150032506 0ustar ellertellert 210././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-DecimalElement01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-Deci0000755000175000017500000000217612653650150032550 0ustar ellertellert 0 ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-DecimalElement01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-Deci0000755000175000017500000000220012653650150032534 0ustar ellertellert 0 ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-DecimalElement04-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-Deci0000755000175000017500000000221012653650150032535 0ustar ellertellert +1000000.00 ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-DecimalElement07.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-Deci0000755000175000017500000000161712653650150032547 0ustar ellertellert 210.00 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeOnlyAttributeGroup/0000755000175000017500000000000012653650150031407 5ustar ellertellert././@LongLink0000644000000000000000000000024200000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeOnlyAttributeGroup/echoComplexTypeOnlyAttributeGroup-ComplexTypeOnlyAttributeGroup01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeOnlyAttributeGroup/echoComp0000755000175000017500000000202612653650150033072 0ustar ellertellert ././@LongLink0000644000000000000000000000023600000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeOnlyAttributeGroup/ComplexTypeOnlyAttributeGroup-ComplexTypeOnlyAttributeGroup01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeOnlyAttributeGroup/ComplexT0000755000175000017500000000175212653650150033075 0ustar ellertellert ././@LongLink0000644000000000000000000000025100000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeOnlyAttributeGroup/echoComplexTypeOnlyAttributeGroup-ComplexTypeOnlyAttributeGroup01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeOnlyAttributeGroup/echoComp0000755000175000017500000000236212653650150033075 0ustar ellertellert ././@LongLink0000644000000000000000000000025100000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeOnlyAttributeGroup/echoComplexTypeOnlyAttributeGroup-ComplexTypeOnlyAttributeGroup01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeOnlyAttributeGroup/echoComp0000755000175000017500000000236412653650150033077 0ustar ellertellert gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringEnumerationType/0000755000175000017500000000000012653650152027714 5ustar ellertellert././@LongLink0000644000000000000000000000021200000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringEnumerationType/echoStringEnumerationType-StringEnumerationType03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringEnumerationType/echoStringEnumer0000755000175000017500000000156412653650152033131 0ustar ellertellert Ringo ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringEnumerationType/echoStringEnumerationType-StringEnumerationType01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringEnumerationType/echoStringEnumer0000755000175000017500000000216712653650152033131 0ustar ellertellert John ././@LongLink0000644000000000000000000000020600000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringEnumerationType/StringEnumerationType-StringEnumerationType01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringEnumerationType/StringEnumeratio0000755000175000017500000000150312653650152033140 0ustar ellertellert John././@LongLink0000644000000000000000000000020600000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringEnumerationType/StringEnumerationType-StringEnumerationType03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringEnumerationType/StringEnumeratio0000755000175000017500000000150412653650152033141 0ustar ellertellert Ringo././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringEnumerationType/echoStringEnumerationType-StringEnumerationType03-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringEnumerationType/echoStringEnumer0000755000175000017500000000217212653650152033125 0ustar ellertellert Ringo ././@LongLink0000644000000000000000000000021200000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringEnumerationType/echoStringEnumerationType-StringEnumerationType02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringEnumerationType/echoStringEnumer0000755000175000017500000000156312653650152033130 0ustar ellertellert Paul ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringEnumerationType/echoStringEnumerationType-StringEnumerationType02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringEnumerationType/echoStringEnumer0000755000175000017500000000217112653650152033124 0ustar ellertellert Paul ././@LongLink0000644000000000000000000000021200000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringEnumerationType/echoStringEnumerationType-StringEnumerationType01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringEnumerationType/echoStringEnumer0000755000175000017500000000156312653650152033130 0ustar ellertellert John ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringEnumerationType/echoStringEnumerationType-StringEnumerationType03-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringEnumerationType/echoStringEnumer0000755000175000017500000000217012653650152033123 0ustar ellertellert Ringo ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringEnumerationType/echoStringEnumerationType-StringEnumerationType01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringEnumerationType/echoStringEnumer0000755000175000017500000000217112653650152033124 0ustar ellertellert John ././@LongLink0000644000000000000000000000020600000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringEnumerationType/StringEnumerationType-StringEnumerationType02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringEnumerationType/StringEnumeratio0000755000175000017500000000150312653650152033140 0ustar ellertellert Paul././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringEnumerationType/echoStringEnumerationType-StringEnumerationType02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringEnumerationType/echoStringEnumer0000755000175000017500000000216712653650152033131 0ustar ellertellert Paul gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/QNameAttribute/0000755000175000017500000000000012653650152026262 5ustar ellertellert././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/QNameAttribute/echoQNameAttribute-QNameAttribute01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/QNameAttribute/echoQNameAttribute-QNam0000755000175000017500000000224212653650152032566 0ustar ellertellert ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/QNameAttribute/echoQNameAttribute-QNameAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/QNameAttribute/echoQNameAttribute-QNam0000755000175000017500000000164612653650152032575 0ustar ellertellert ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/QNameAttribute/echoQNameAttribute-QNameAttribute01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/QNameAttribute/echoQNameAttribute-QNam0000755000175000017500000000224012653650152032564 0ustar ellertellert ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/QNameAttribute/QNameAttribute-QNameAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/QNameAttribute/QNameAttribute-QNameAtt0000755000175000017500000000161112653650152032544 0ustar ellertellert gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementTypeReferenceUnqualified/0000755000175000017500000000000012653650152031636 5ustar ellertellert././@LongLink0000644000000000000000000000025700000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementTypeReferenceUnqualified/echoElementTypeReferenceUnqualified-ElementTypeReferenceUnqualified01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementTypeReferenceUnqualified/echoEl0000755000175000017500000000247612653650152032774 0ustar ellertellert String ././@LongLink0000644000000000000000000000025700000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementTypeReferenceUnqualified/echoElementTypeReferenceUnqualified-ElementTypeReferenceUnqualified01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementTypeReferenceUnqualified/echoEl0000755000175000017500000000250012653650152032760 0ustar ellertellert String ././@LongLink0000644000000000000000000000024400000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementTypeReferenceUnqualified/ElementTypeReferenceUnqualified-ElementTypeReferenceUnqualified01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementTypeReferenceUnqualified/Elemen0000755000175000017500000000206112653650152032770 0ustar ellertellert String ././@LongLink0000644000000000000000000000025000000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementTypeReferenceUnqualified/echoElementTypeReferenceUnqualified-ElementTypeReferenceUnqualified01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementTypeReferenceUnqualified/echoEl0000755000175000017500000000213412653650152032763 0ustar ellertellert String gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BooleanElement/0000755000175000017500000000000012653650150026264 5ustar ellertellert././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BooleanElement/echoBooleanElement-BooleanElement04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BooleanElement/echoBooleanElement-Bool0000755000175000017500000000161212653650150032633 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BooleanElement/BooleanElement-BooleanElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BooleanElement/BooleanElement-BooleanE0000755000175000017500000000156312653650150032572 0ustar ellertellert true././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BooleanElement/BooleanElement-BooleanElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BooleanElement/BooleanElement-BooleanE0000755000175000017500000000156412653650150032573 0ustar ellertellert false././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BooleanElement/echoBooleanElement-BooleanElement02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BooleanElement/echoBooleanElement-Bool0000755000175000017500000000220112653650150032626 0ustar ellertellert true ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BooleanElement/BooleanElement-BooleanElement03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BooleanElement/BooleanElement-BooleanE0000755000175000017500000000156012653650150032567 0ustar ellertellert 0././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BooleanElement/echoBooleanElement-BooleanElement03-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BooleanElement/echoBooleanElement-Bool0000755000175000017500000000220012653650150032625 0ustar ellertellert 0 ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BooleanElement/echoBooleanElement-BooleanElement01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BooleanElement/echoBooleanElement-Bool0000755000175000017500000000220412653650150032631 0ustar ellertellert false ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BooleanElement/echoBooleanElement-BooleanElement04-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BooleanElement/echoBooleanElement-Bool0000755000175000017500000000217612653650150032641 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BooleanElement/echoBooleanElement-BooleanElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BooleanElement/echoBooleanElement-Bool0000755000175000017500000000161512653650150032636 0ustar ellertellert true ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BooleanElement/echoBooleanElement-BooleanElement04-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BooleanElement/echoBooleanElement-Bool0000755000175000017500000000220012653650150032625 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BooleanElement/echoBooleanElement-BooleanElement01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BooleanElement/echoBooleanElement-Bool0000755000175000017500000000220212653650150032627 0ustar ellertellert false ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BooleanElement/BooleanElement-BooleanElement04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BooleanElement/BooleanElement-BooleanE0000755000175000017500000000156012653650150032567 0ustar ellertellert 1././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BooleanElement/echoBooleanElement-BooleanElement03-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BooleanElement/echoBooleanElement-Bool0000755000175000017500000000217612653650150032641 0ustar ellertellert 0 ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BooleanElement/echoBooleanElement-BooleanElement02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BooleanElement/echoBooleanElement-Bool0000755000175000017500000000220312653650150032630 0ustar ellertellert true ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BooleanElement/echoBooleanElement-BooleanElement03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BooleanElement/echoBooleanElement-Bool0000755000175000017500000000161212653650150032633 0ustar ellertellert 0 ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BooleanElement/echoBooleanElement-BooleanElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BooleanElement/echoBooleanElement-Bool0000755000175000017500000000161612653650150032637 0ustar ellertellert false gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalAttribute/0000755000175000017500000000000012653650150026615 5ustar ellertellert././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalAttribute/echoDecimalAttribute-DecimalAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalAttribute/echoDecimalAttribute-0000755000175000017500000000171412653650150032704 0ustar ellertellert ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalAttribute/echoDecimalAttribute-DecimalAttribute01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalAttribute/echoDecimalAttribute-0000755000175000017500000000230412653650150032700 0ustar ellertellert ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalAttribute/DecimalAttribute-DecimalAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalAttribute/DecimalAttribute-Deci0000755000175000017500000000165512653650150032636 0ustar ellertellert ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalAttribute/echoDecimalAttribute-DecimalAttribute01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/DecimalAttribute/echoDecimalAttribute-0000755000175000017500000000230212653650150032676 0ustar ellertellert gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonIdentifierName/0000755000175000017500000000000012653650152026733 5ustar ellertellert././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonIdentifierName/echoNonIdentifierName-NonIdentifierName02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonIdentifierName/echoNonIdentifierNam0000755000175000017500000000223112653650152032707 0ustar ellertellert Hello ././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonIdentifierName/NonIdentifierName-NonIdentifierName02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonIdentifierName/NonIdentifierName-No0000755000175000017500000000162212653650152032572 0ustar ellertellert Hello././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonIdentifierName/echoNonIdentifierName-NonIdentifierName02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonIdentifierName/echoNonIdentifierNam0000755000175000017500000000222712653650152032714 0ustar ellertellert Hello ././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonIdentifierName/echoNonIdentifierName-NonIdentifierName02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonIdentifierName/echoNonIdentifierNam0000755000175000017500000000165512653650152032720 0ustar ellertellert Hello gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NullEnumerationType/0000755000175000017500000000000012653650152027360 5ustar ellertellert././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NullEnumerationType/echoNullEnumerationType-NullEnumerationType01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NullEnumerationType/echoNullEnumeratio0000755000175000017500000000220012653650152033102 0ustar ellertellert ././@LongLink0000644000000000000000000000020400000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NullEnumerationType/echoNullEnumerationType-NullEnumerationType01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NullEnumerationType/echoNullEnumeratio0000755000175000017500000000162412653650152033113 0ustar ellertellert ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NullEnumerationType/echoNullEnumerationType-NullEnumerationType01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NullEnumerationType/echoNullEnumeratio0000755000175000017500000000217612653650152033116 0ustar ellertellert ././@LongLink0000644000000000000000000000020000000000000011573 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NullEnumerationType/NullEnumerationType-NullEnumerationType01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NullEnumerationType/NullEnumerationTyp0000755000175000017500000000156512653650152033133 0ustar ellertellert gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnqualifiedLocalElements/0000755000175000017500000000000012653650154030315 5ustar ellertellert././@LongLink0000644000000000000000000000023200000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnqualifiedLocalElements/echoUnqualifiedLocalElements-UnqualifiedLocalElements01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnqualifiedLocalElements/echoUnqualifi0000755000175000017500000000225412653650154033042 0ustar ellertellert string ././@LongLink0000644000000000000000000000021700000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnqualifiedLocalElements/UnqualifiedLocalElements-UnqualifiedLocalElements01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnqualifiedLocalElements/UnqualifiedLo0000755000175000017500000000163712653650154033013 0ustar ellertellert string././@LongLink0000644000000000000000000000023200000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnqualifiedLocalElements/echoUnqualifiedLocalElements-UnqualifiedLocalElements01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnqualifiedLocalElements/echoUnqualifi0000755000175000017500000000225612653650154033044 0ustar ellertellert string ././@LongLink0000644000000000000000000000022300000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnqualifiedLocalElements/echoUnqualifiedLocalElements-UnqualifiedLocalElements01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnqualifiedLocalElements/echoUnqualifi0000755000175000017500000000170612653650154033043 0ustar ellertellert string gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinExclusive/0000755000175000017500000000000012653650152030041 5ustar ellertellert././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinExclusive/echoRestrictedMinExclusive-RestrictedMinExclusive01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinExclusive/echoRestrictedM0000755000175000017500000000170212653650152033053 0ustar ellertellert 2 ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinExclusive/echoRestrictedMinExclusive-RestrictedMinExclusive01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinExclusive/echoRestrictedM0000755000175000017500000000225012653650152033052 0ustar ellertellert 2 ././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinExclusive/RestrictedMinExclusive-RestrictedMinExclusive01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinExclusive/RestrictedMinEx0000755000175000017500000000164012653650152033041 0ustar ellertellert 2././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinExclusive/echoRestrictedMinExclusive-RestrictedMinExclusive02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinExclusive/echoRestrictedM0000755000175000017500000000224612653650152033057 0ustar ellertellert 3 ././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinExclusive/RestrictedMinExclusive-RestrictedMinExclusive02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinExclusive/RestrictedMinEx0000755000175000017500000000164012653650152033041 0ustar ellertellert 3././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinExclusive/echoRestrictedMinExclusive-RestrictedMinExclusive02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinExclusive/echoRestrictedM0000755000175000017500000000170212653650152033053 0ustar ellertellert 3 ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinExclusive/echoRestrictedMinExclusive-RestrictedMinExclusive01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinExclusive/echoRestrictedM0000755000175000017500000000224612653650152033057 0ustar ellertellert 2 ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinExclusive/echoRestrictedMinExclusive-RestrictedMinExclusive02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinExclusive/echoRestrictedM0000755000175000017500000000225012653650152033052 0ustar ellertellert 3 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChameleonInclude/0000755000175000017500000000000012653650150026572 5ustar ellertellert././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChameleonInclude/echoChameleonInclude-ChameleonInclude01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChameleonInclude/echoChameleonInclude-0000755000175000017500000000223212653650150032632 0ustar ellertellert a different color ././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChameleonInclude/echoChameleonInclude-ChameleonInclude01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChameleonInclude/echoChameleonInclude-0000755000175000017500000000165012653650150032635 0ustar ellertellert a different color ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChameleonInclude/echoChameleonInclude-ChameleonInclude01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChameleonInclude/echoChameleonInclude-0000755000175000017500000000223012653650150032630 0ustar ellertellert a different color ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChameleonInclude/ChameleonInclude-ChameleonInclude01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChameleonInclude/ChameleonInclude-Cham0000755000175000017500000000161412653650150032567 0ustar ellertellert a different colorgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs0/0000755000175000017500000000000012653650152027050 5ustar ellertellert././@LongLink0000644000000000000000000000017500000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs0/SequenceMinOccurs0-SequenceMinOccurs001.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs0/SequenceMinOccurs0-0000755000175000017500000000202012653650152032520 0ustar ellertellert Paul Sumner Downey ././@LongLink0000644000000000000000000000020100000000000011574 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs0/echoSequenceMinOccurs0-SequenceMinOccurs001.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs0/echoSequenceMinOccu0000755000175000017500000000205612653650152032666 0ustar ellertellert Paul Sumner Downey ././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs0/echoSequenceMinOccurs0-SequenceMinOccurs002-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs0/echoSequenceMinOccu0000755000175000017500000000217412653650152032667 0ustar ellertellert ././@LongLink0000644000000000000000000000017500000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs0/SequenceMinOccurs0-SequenceMinOccurs002.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs0/SequenceMinOccurs0-0000755000175000017500000000156012653650152032530 0ustar ellertellert ././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs0/echoSequenceMinOccurs0-SequenceMinOccurs001-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs0/echoSequenceMinOccu0000755000175000017500000000245112653650152032665 0ustar ellertellert Paul Sumner Downey ././@LongLink0000644000000000000000000000020100000000000011574 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs0/echoSequenceMinOccurs0-SequenceMinOccurs002.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs0/echoSequenceMinOccu0000755000175000017500000000161612653650152032667 0ustar ellertellert ././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs0/echoSequenceMinOccurs0-SequenceMinOccurs002-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs0/echoSequenceMinOccu0000755000175000017500000000217212653650152032665 0ustar ellertellert ././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs0/echoSequenceMinOccurs0-SequenceMinOccurs001-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs0/echoSequenceMinOccu0000755000175000017500000000245312653650152032667 0ustar ellertellert Paul Sumner Downey gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortEnumerationType/0000755000175000017500000000000012653650152027545 5ustar ellertellert././@LongLink0000644000000000000000000000020700000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortEnumerationType/echoShortEnumerationType-ShortEnumerationType01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortEnumerationType/echoShortEnumerat0000755000175000017500000000166512653650152033142 0ustar ellertellert 11 ././@LongLink0000644000000000000000000000020300000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortEnumerationType/ShortEnumerationType-ShortEnumerationType01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortEnumerationType/ShortEnumerationT0000755000175000017500000000162512653650152033131 0ustar ellertellert 11././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortEnumerationType/echoShortEnumerationType-ShortEnumerationType01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortEnumerationType/echoShortEnumerat0000755000175000017500000000223512653650152033134 0ustar ellertellert 11 ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortEnumerationType/echoShortEnumerationType-ShortEnumerationType01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortEnumerationType/echoShortEnumerat0000755000175000017500000000223712653650152033136 0ustar ellertellert 11 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayAttribute/0000755000175000017500000000000012653650152027113 5ustar ellertellert././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayAttribute/echoGMonthDayAttribute-GMonthDayAttribute04-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayAttribute/echoGMonthDayAttrib0000755000175000017500000000226412653650152032704 0ustar ellertellert ././@LongLink0000644000000000000000000000017500000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayAttribute/GMonthDayAttribute-GMonthDayAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayAttribute/GMonthDayAttribute-0000755000175000017500000000163312653650152032637 0ustar ellertellert ././@LongLink0000644000000000000000000000017500000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayAttribute/GMonthDayAttribute-GMonthDayAttribute02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayAttribute/GMonthDayAttribute-0000755000175000017500000000163412653650152032640 0ustar ellertellert ././@LongLink0000644000000000000000000000017500000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayAttribute/GMonthDayAttribute-GMonthDayAttribute03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayAttribute/GMonthDayAttribute-0000755000175000017500000000164112653650152032636 0ustar ellertellert ././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayAttribute/echoGMonthDayAttribute-GMonthDayAttribute04-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayAttribute/echoGMonthDayAttrib0000755000175000017500000000226612653650152032706 0ustar ellertellert ././@LongLink0000644000000000000000000000020100000000000011574 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayAttribute/echoGMonthDayAttribute-GMonthDayAttribute04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayAttribute/echoGMonthDayAttrib0000755000175000017500000000170212653650152032700 0ustar ellertellert ././@LongLink0000644000000000000000000000020100000000000011574 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayAttribute/echoGMonthDayAttribute-GMonthDayAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayAttribute/echoGMonthDayAttrib0000755000175000017500000000167412653650152032710 0ustar ellertellert ././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayAttribute/echoGMonthDayAttribute-GMonthDayAttribute01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayAttribute/echoGMonthDayAttrib0000755000175000017500000000225612653650152032705 0ustar ellertellert ././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayAttribute/echoGMonthDayAttribute-GMonthDayAttribute02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayAttribute/echoGMonthDayAttrib0000755000175000017500000000225712653650152032706 0ustar ellertellert ././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayAttribute/echoGMonthDayAttribute-GMonthDayAttribute03-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayAttribute/echoGMonthDayAttrib0000755000175000017500000000226612653650152032706 0ustar ellertellert ././@LongLink0000644000000000000000000000020100000000000011574 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayAttribute/echoGMonthDayAttribute-GMonthDayAttribute03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayAttribute/echoGMonthDayAttrib0000755000175000017500000000170212653650152032700 0ustar ellertellert ././@LongLink0000644000000000000000000000020100000000000011574 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayAttribute/echoGMonthDayAttribute-GMonthDayAttribute02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayAttribute/echoGMonthDayAttrib0000755000175000017500000000167512653650152032711 0ustar ellertellert ././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayAttribute/echoGMonthDayAttribute-GMonthDayAttribute02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayAttribute/echoGMonthDayAttrib0000755000175000017500000000226112653650152032701 0ustar ellertellert ././@LongLink0000644000000000000000000000017500000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayAttribute/GMonthDayAttribute-GMonthDayAttribute04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayAttribute/GMonthDayAttribute-0000755000175000017500000000164112653650152032636 0ustar ellertellert ././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayAttribute/echoGMonthDayAttribute-GMonthDayAttribute03-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayAttribute/echoGMonthDayAttrib0000755000175000017500000000226412653650152032704 0ustar ellertellert ././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayAttribute/echoGMonthDayAttribute-GMonthDayAttribute01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayAttribute/echoGMonthDayAttrib0000755000175000017500000000226012653650152032700 0ustar ellertellert gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NoTargetNamespace/0000755000175000017500000000000012653650152026735 5ustar ellertellert././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NoTargetNamespace/NoTargetNamespace-NoTargetNamespace01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NoTargetNamespace/NoTargetNamespace-No0000755000175000017500000000156212653650152032601 0ustar ellertellert foo././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NoTargetNamespace/echoNoTargetNamespace-NoTargetNamespace01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NoTargetNamespace/echoNoTargetNamespac0000755000175000017500000000162212653650152032716 0ustar ellertellert foo ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NoTargetNamespace/echoNoTargetNamespace-NoTargetNamespace01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NoTargetNamespace/echoNoTargetNamespac0000755000175000017500000000221012653650152032710 0ustar ellertellert foo ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NoTargetNamespace/echoNoTargetNamespace-NoTargetNamespace01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NoTargetNamespace/echoNoTargetNamespac0000755000175000017500000000220612653650152032715 0ustar ellertellert foo gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/Include/0000755000175000017500000000000012653650152024760 5ustar ellertellertgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/QNameElement/0000755000175000017500000000000012653650152025710 5ustar ellertellert././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/QNameElement/QNameElement-QNameElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/QNameElement/QNameElement-QNameElement0000755000175000017500000000156212653650152032466 0ustar ellertellert ex:QNameElement././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/QNameElement/echoQNameElement-QNameElement01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/QNameElement/echoQNameElement-QNameEle0000755000175000017500000000220212653650152032431 0ustar ellertellert ex:QNameElement ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/QNameElement/echoQNameElement-QNameElement01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/QNameElement/echoQNameElement-QNameEle0000755000175000017500000000220412653650152032433 0ustar ellertellert ex:QNameElement ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/QNameElement/echoQNameElement-QNameElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/QNameElement/echoQNameElement-QNameEle0000755000175000017500000000161212653650152032435 0ustar ellertellert ex:QNameElement gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementChoice/0000755000175000017500000000000012653650152027222 5ustar ellertellert././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementChoice/echoGlobalElementChoice-GlobalElementChoice01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementChoice/echoGlobalElementC0000755000175000017500000000234512653650152032630 0ustar ellertellert one ././@LongLink0000644000000000000000000000020000000000000011573 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementChoice/GlobalElementChoice-GlobalElementChoice01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementChoice/GlobalElementChoic0000755000175000017500000000172312653650152032633 0ustar ellertellert one ././@LongLink0000644000000000000000000000020000000000000011573 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementChoice/GlobalElementChoice-GlobalElementChoice02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementChoice/GlobalElementChoic0000755000175000017500000000172312653650152032633 0ustar ellertellert two ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementChoice/echoGlobalElementChoice-GlobalElementChoice02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementChoice/echoGlobalElementC0000755000175000017500000000234312653650152032626 0ustar ellertellert two ././@LongLink0000644000000000000000000000020400000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementChoice/echoGlobalElementChoice-GlobalElementChoice01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementChoice/echoGlobalElementC0000755000175000017500000000176212653650152032632 0ustar ellertellert one ././@LongLink0000644000000000000000000000020400000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementChoice/echoGlobalElementChoice-GlobalElementChoice02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementChoice/echoGlobalElementC0000755000175000017500000000176212653650152032632 0ustar ellertellert two ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementChoice/echoGlobalElementChoice-GlobalElementChoice01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementChoice/echoGlobalElementC0000755000175000017500000000234312653650152032626 0ustar ellertellert one ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementChoice/echoGlobalElementChoice-GlobalElementChoice02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementChoice/echoGlobalElementC0000755000175000017500000000234512653650152032630 0ustar ellertellert two gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringElement/0000755000175000017500000000000012653650152026155 5ustar ellertellert././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringElement/echoStringElement-StringElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringElement/echoStringElement-String0000755000175000017500000000162412653650152032771 0ustar ellertellert Hello cruel world. ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringElement/StringElement-StringElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringElement/StringElement-StringElem0000755000175000017500000000152712653650152032737 0ustar ellertellert ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringElement/echoStringElement-StringElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringElement/echoStringElement-String0000755000175000017500000000156012653650152032770 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringElement/echoStringElement-StringElement01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringElement/echoStringElement-String0000755000175000017500000000214612653650152032771 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringElement/echoStringElement-StringElement02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringElement/echoStringElement-String0000755000175000017500000000221412653650152032765 0ustar ellertellert Hello cruel world. ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringElement/StringElement-StringElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringElement/StringElement-StringElem0000755000175000017500000000157312653650152032740 0ustar ellertellert Hello cruel world.././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringElement/echoStringElement-StringElement02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringElement/echoStringElement-String0000755000175000017500000000221212653650152032763 0ustar ellertellert Hello cruel world. ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringElement/echoStringElement-StringElement01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringElement/echoStringElement-String0000755000175000017500000000215012653650152032764 0ustar ellertellert gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceSequence/0000755000175000017500000000000012653650150026256 5ustar ellertellert././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceSequence/ChoiceSequence-ChoiceSequence02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceSequence/ChoiceSequence-ChoiceSe0000755000175000017500000000167612653650150032561 0ustar ellertellert home home ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceSequence/echoChoiceSequence-ChoiceSequence01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceSequence/echoChoiceSequence-Choi0000755000175000017500000000225712653650150032614 0ustar ellertellert home ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceSequence/echoChoiceSequence-ChoiceSequence01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceSequence/echoChoiceSequence-Choi0000755000175000017500000000166412653650150032615 0ustar ellertellert home ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceSequence/echoChoiceSequence-ChoiceSequence02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceSequence/echoChoiceSequence-Choi0000755000175000017500000000233112653650150032605 0ustar ellertellert home home ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceSequence/echoChoiceSequence-ChoiceSequence02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceSequence/echoChoiceSequence-Choi0000755000175000017500000000232712653650150032612 0ustar ellertellert home home ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceSequence/echoChoiceSequence-ChoiceSequence01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceSequence/echoChoiceSequence-Choi0000755000175000017500000000226112653650150032607 0ustar ellertellert home ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceSequence/ChoiceSequence-ChoiceSequence01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceSequence/ChoiceSequence-ChoiceSe0000755000175000017500000000163212653650150032551 0ustar ellertellert home ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceSequence/echoChoiceSequence-ChoiceSequence02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceSequence/echoChoiceSequence-Choi0000755000175000017500000000173012653650150032607 0ustar ellertellert home home gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeFormQualified/0000755000175000017500000000000012653650150030006 5ustar ellertellert././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeFormQualified/echoAttributeFormQualified-AttributeFormQualified01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeFormQualified/echoAttributeFo0000755000175000017500000000212012653650150033016 0ustar ellertellert string string ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeFormQualified/echoAttributeFormQualified-AttributeFormQualified01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeFormQualified/echoAttributeFo0000755000175000017500000000250712653650150033027 0ustar ellertellert string string ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeFormQualified/echoAttributeFormQualified-AttributeFormQualified01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeFormQualified/echoAttributeFo0000755000175000017500000000250512653650150033025 0ustar ellertellert string string ././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeFormQualified/AttributeFormQualified-AttributeFormQualified01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeFormQualified/AttributeFormQu0000755000175000017500000000205312653650150033031 0ustar ellertellert string string gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ImportSchema/0000755000175000017500000000000012653650152025770 5ustar ellertellertgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ENTITIESAttribute/0000755000175000017500000000000012653650152026505 5ustar ellertellert././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ENTITIESAttribute/ENTITIESAttribute-ENTITIESAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ENTITIESAttribute/ENTITIESAttribute-EN0000755000175000017500000000162212653650152032044 0ustar ellertellert ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ENTITIESAttribute/echoENTITIESAttribute-ENTITIESAttribute01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ENTITIESAttribute/echoENTITIESAttribut0000755000175000017500000000225012653650152032234 0ustar ellertellert ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ENTITIESAttribute/echoENTITIESAttribute-ENTITIESAttribute01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ENTITIESAttribute/echoENTITIESAttribut0000755000175000017500000000224612653650152032241 0ustar ellertellert ././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ENTITIESAttribute/echoENTITIESAttribute-ENTITIESAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ENTITIESAttribute/echoENTITIESAttribut0000755000175000017500000000166212653650152032242 0ustar ellertellert gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NameAttribute/0000755000175000017500000000000012653650152026141 5ustar ellertellert././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NameAttribute/echoNameAttribute-NameAttribute01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NameAttribute/echoNameAttribute-NameAt0000755000175000017500000000221612653650152032636 0ustar ellertellert ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NameAttribute/echoNameAttribute-NameAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NameAttribute/echoNameAttribute-NameAt0000755000175000017500000000162012653650152032634 0ustar ellertellert ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NameAttribute/NameAttribute-NameAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NameAttribute/NameAttribute-NameAttrib0000755000175000017500000000156412653650152032665 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NameAttribute/echoNameAttribute-NameAttribute01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NameAttribute/echoNameAttribute-NameAt0000755000175000017500000000221412653650152032634 0ustar ellertellert gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntElement/0000755000175000017500000000000012653650152025441 5ustar ellertellert././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntElement/echoIntElement-IntElement05-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntElement/echoIntElement-IntElement050000755000175000017500000000216612653650152032506 0ustar ellertellert -2147483648 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntElement/IntElement-IntElement02.xml0000755000175000017500000000153212653650152032437 0ustar ellertellert -42././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntElement/echoIntElement-IntElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntElement/echoIntElement-IntElement010000755000175000017500000000155612653650152032504 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntElement/echoIntElement-IntElement02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntElement/echoIntElement-IntElement020000755000175000017500000000215412653650152032500 0ustar ellertellert -42 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntElement/IntElement-IntElement04.xml0000755000175000017500000000154112653650152032441 0ustar ellertellert 2147483647././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntElement/echoIntElement-IntElement05-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntElement/echoIntElement-IntElement050000755000175000017500000000216412653650152032504 0ustar ellertellert -2147483648 ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntElement/echoIntElement-IntElement04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntElement/echoIntElement-IntElement040000755000175000017500000000156712653650152032511 0ustar ellertellert 2147483647 ././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntElement/echoIntElement-IntElement01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntElement/echoIntElement-IntElement010000755000175000017500000000215412653650152032477 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntElement/echoIntElement-IntElement03-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntElement/echoIntElement-IntElement030000755000175000017500000000215612653650152032503 0ustar ellertellert +42 ././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntElement/echoIntElement-IntElement03-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntElement/echoIntElement-IntElement030000755000175000017500000000215412653650152032501 0ustar ellertellert +42 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntElement/IntElement-IntElement03.xml0000755000175000017500000000153212653650152032440 0ustar ellertellert +42gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntElement/IntElement-IntElement05.xml0000755000175000017500000000154212653650152032443 0ustar ellertellert -2147483648././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntElement/echoIntElement-IntElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntElement/echoIntElement-IntElement020000755000175000017500000000156012653650152032500 0ustar ellertellert -42 ././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntElement/echoIntElement-IntElement02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntElement/echoIntElement-IntElement020000755000175000017500000000215612653650152032502 0ustar ellertellert -42 ././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntElement/echoIntElement-IntElement01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntElement/echoIntElement-IntElement010000755000175000017500000000215212653650152032475 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntElement/echoIntElement-IntElement03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntElement/echoIntElement-IntElement030000755000175000017500000000156012653650152032501 0ustar ellertellert +42 ././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntElement/echoIntElement-IntElement04-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntElement/echoIntElement-IntElement040000755000175000017500000000216312653650152032502 0ustar ellertellert 2147483647 ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntElement/echoIntElement-IntElement05.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntElement/echoIntElement-IntElement050000755000175000017500000000157012653650152032504 0ustar ellertellert -2147483648 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntElement/IntElement-IntElement01.xml0000755000175000017500000000153012653650152032434 0ustar ellertellert 1././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntElement/echoIntElement-IntElement04-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IntElement/echoIntElement-IntElement040000755000175000017500000000216512653650152032504 0ustar ellertellert 2147483647 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementFormUnqualified/0000755000175000017500000000000012653650150027777 5ustar ellertellert././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementFormUnqualified/echoElementFormUnqualified-ElementFormUnqualified01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementFormUnqualified/echoElementForm0000755000175000017500000000175212653650150033006 0ustar ellertellert string ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementFormUnqualified/echoElementFormUnqualified-ElementFormUnqualified01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementFormUnqualified/echoElementForm0000755000175000017500000000232712653650150033005 0ustar ellertellert string ././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementFormUnqualified/ElementFormUnqualified-ElementFormUnqualified01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementFormUnqualified/ElementFormUnqu0000755000175000017500000000171012653650150033012 0ustar ellertellert string ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementFormUnqualified/echoElementFormUnqualified-ElementFormUnqualified01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementFormUnqualified/echoElementForm0000755000175000017500000000232512653650150033003 0ustar ellertellert string gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongSimpleTypePattern/0000755000175000017500000000000012653650154031345 5ustar ellertellert././@LongLink0000644000000000000000000000024200000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongSimpleTypePattern/echoUnsignedLongSimpleTypePattern-UnsignedLongSimpleTypePattern01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongSimpleTypePattern/echoUnsi0000755000175000017500000000176512653650154033061 0ustar ellertellert 123 ././@LongLink0000644000000000000000000000025100000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongSimpleTypePattern/echoUnsignedLongSimpleTypePattern-UnsignedLongSimpleTypePattern02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongSimpleTypePattern/echoUnsi0000755000175000017500000000231312653650154033047 0ustar ellertellert 009 ././@LongLink0000644000000000000000000000025100000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongSimpleTypePattern/echoUnsignedLongSimpleTypePattern-UnsignedLongSimpleTypePattern01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongSimpleTypePattern/echoUnsi0000755000175000017500000000231312653650154033047 0ustar ellertellert 123 ././@LongLink0000644000000000000000000000025100000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongSimpleTypePattern/echoUnsignedLongSimpleTypePattern-UnsignedLongSimpleTypePattern02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongSimpleTypePattern/echoUnsi0000755000175000017500000000231512653650154033051 0ustar ellertellert 009 ././@LongLink0000644000000000000000000000023600000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongSimpleTypePattern/UnsignedLongSimpleTypePattern-UnsignedLongSimpleTypePattern01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongSimpleTypePattern/Unsigned0000755000175000017500000000171412653650154033052 0ustar ellertellert 123././@LongLink0000644000000000000000000000023600000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongSimpleTypePattern/UnsignedLongSimpleTypePattern-UnsignedLongSimpleTypePattern02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongSimpleTypePattern/Unsigned0000755000175000017500000000171412653650154033052 0ustar ellertellert 009././@LongLink0000644000000000000000000000025100000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongSimpleTypePattern/echoUnsignedLongSimpleTypePattern-UnsignedLongSimpleTypePattern01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongSimpleTypePattern/echoUnsi0000755000175000017500000000231512653650154033051 0ustar ellertellert 123 ././@LongLink0000644000000000000000000000024200000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongSimpleTypePattern/echoUnsignedLongSimpleTypePattern-UnsignedLongSimpleTypePattern02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongSimpleTypePattern/echoUnsi0000755000175000017500000000176512653650154033061 0ustar ellertellert 009 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerAttribute/0000755000175000017500000000000012653650152031054 5ustar ellertellert././@LongLink0000644000000000000000000000023000000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerAttribute/NonPositiveIntegerAttribute-NonPositiveIntegerAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerAttribute/NonPositiv0000755000175000017500000000172612653650152033120 0ustar ellertellert ././@LongLink0000644000000000000000000000024300000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerAttribute/echoNonPositiveIntegerAttribute-NonPositiveIntegerAttribute03-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerAttribute/echoNonPos0000755000175000017500000000233712653650152033062 0ustar ellertellert ././@LongLink0000644000000000000000000000023000000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerAttribute/NonPositiveIntegerAttribute-NonPositiveIntegerAttribute02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerAttribute/NonPositiv0000755000175000017500000000172412653650152033116 0ustar ellertellert ././@LongLink0000644000000000000000000000024300000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerAttribute/echoNonPositiveIntegerAttribute-NonPositiveIntegerAttribute02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerAttribute/echoNonPos0000755000175000017500000000233612653650152033061 0ustar ellertellert ././@LongLink0000644000000000000000000000023000000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerAttribute/NonPositiveIntegerAttribute-NonPositiveIntegerAttribute03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerAttribute/NonPositiv0000755000175000017500000000172512653650152033117 0ustar ellertellert ././@LongLink0000644000000000000000000000024300000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerAttribute/echoNonPositiveIntegerAttribute-NonPositiveIntegerAttribute04-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerAttribute/echoNonPos0000755000175000017500000000241012653650152033052 0ustar ellertellert ././@LongLink0000644000000000000000000000023400000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerAttribute/echoNonPositiveIntegerAttribute-NonPositiveIntegerAttribute04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerAttribute/echoNonPos0000755000175000017500000000205012653650152033052 0ustar ellertellert ././@LongLink0000644000000000000000000000023400000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerAttribute/echoNonPositiveIntegerAttribute-NonPositiveIntegerAttribute03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerAttribute/echoNonPos0000755000175000017500000000177712653650152033071 0ustar ellertellert ././@LongLink0000644000000000000000000000023400000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerAttribute/echoNonPositiveIntegerAttribute-NonPositiveIntegerAttribute02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerAttribute/echoNonPos0000755000175000017500000000177612653650152033070 0ustar ellertellert ././@LongLink0000644000000000000000000000023400000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerAttribute/echoNonPositiveIntegerAttribute-NonPositiveIntegerAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerAttribute/echoNonPos0000755000175000017500000000200012653650152033045 0ustar ellertellert ././@LongLink0000644000000000000000000000024300000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerAttribute/echoNonPositiveIntegerAttribute-NonPositiveIntegerAttribute02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerAttribute/echoNonPos0000755000175000017500000000234012653650152033054 0ustar ellertellert ././@LongLink0000644000000000000000000000024300000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerAttribute/echoNonPositiveIntegerAttribute-NonPositiveIntegerAttribute03-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerAttribute/echoNonPos0000755000175000017500000000234112653650152033055 0ustar ellertellert ././@LongLink0000644000000000000000000000024300000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerAttribute/echoNonPositiveIntegerAttribute-NonPositiveIntegerAttribute01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerAttribute/echoNonPos0000755000175000017500000000234012653650152033054 0ustar ellertellert ././@LongLink0000644000000000000000000000024300000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerAttribute/echoNonPositiveIntegerAttribute-NonPositiveIntegerAttribute01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerAttribute/echoNonPos0000755000175000017500000000234212653650152033056 0ustar ellertellert ././@LongLink0000644000000000000000000000024300000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerAttribute/echoNonPositiveIntegerAttribute-NonPositiveIntegerAttribute04-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerAttribute/echoNonPos0000755000175000017500000000241212653650152033054 0ustar ellertellert ././@LongLink0000644000000000000000000000023000000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerAttribute/NonPositiveIntegerAttribute-NonPositiveIntegerAttribute04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerAttribute/NonPositiv0000755000175000017500000000177612653650152033125 0ustar ellertellert gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortAttribute/0000755000175000017500000000000012653650154030057 5ustar ellertellert././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortAttribute/echoUnsignedShortAttribute-UnsignedShortAttribute01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortAttribute/echoUnsignedSho0000755000175000017500000000230312653650154033070 0ustar ellertellert ././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortAttribute/UnsignedShortAttribute-UnsignedShortAttribute04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortAttribute/UnsignedShortAt0000755000175000017500000000166512653650154033076 0ustar ellertellert ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortAttribute/echoUnsignedShortAttribute-UnsignedShortAttribute04-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortAttribute/echoUnsignedSho0000755000175000017500000000230612653650154033073 0ustar ellertellert ././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortAttribute/echoUnsignedShortAttribute-UnsignedShortAttribute03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortAttribute/echoUnsignedSho0000755000175000017500000000173012653650154033073 0ustar ellertellert ././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortAttribute/echoUnsignedShortAttribute-UnsignedShortAttribute02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortAttribute/echoUnsignedSho0000755000175000017500000000172712653650154033101 0ustar ellertellert ././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortAttribute/UnsignedShortAttribute-UnsignedShortAttribute03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortAttribute/UnsignedShortAt0000755000175000017500000000166312653650154033074 0ustar ellertellert ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortAttribute/echoUnsignedShortAttribute-UnsignedShortAttribute02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortAttribute/echoUnsignedSho0000755000175000017500000000230312653650154033070 0ustar ellertellert ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortAttribute/echoUnsignedShortAttribute-UnsignedShortAttribute03-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortAttribute/echoUnsignedSho0000755000175000017500000000230212653650154033067 0ustar ellertellert ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortAttribute/echoUnsignedShortAttribute-UnsignedShortAttribute02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortAttribute/echoUnsignedSho0000755000175000017500000000230112653650154033066 0ustar ellertellert ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortAttribute/echoUnsignedShortAttribute-UnsignedShortAttribute04-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortAttribute/echoUnsignedSho0000755000175000017500000000230412653650154033071 0ustar ellertellert ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortAttribute/echoUnsignedShortAttribute-UnsignedShortAttribute03-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortAttribute/echoUnsignedSho0000755000175000017500000000230412653650154033071 0ustar ellertellert ././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortAttribute/echoUnsignedShortAttribute-UnsignedShortAttribute04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortAttribute/echoUnsignedSho0000755000175000017500000000173212653650154033075 0ustar ellertellert ././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortAttribute/UnsignedShortAttribute-UnsignedShortAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortAttribute/UnsignedShortAt0000755000175000017500000000166212653650154033073 0ustar ellertellert ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortAttribute/echoUnsignedShortAttribute-UnsignedShortAttribute01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortAttribute/echoUnsignedSho0000755000175000017500000000230112653650154033066 0ustar ellertellert ././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortAttribute/UnsignedShortAttribute-UnsignedShortAttribute02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortAttribute/UnsignedShortAt0000755000175000017500000000166212653650154033073 0ustar ellertellert ././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortAttribute/echoUnsignedShortAttribute-UnsignedShortAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortAttribute/echoUnsignedSho0000755000175000017500000000172712653650154033101 0ustar ellertellert gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AppinfoElement/0000755000175000017500000000000012653650150026301 5ustar ellertellert././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AppinfoElement/echoAppinfoElement-AppinfoElement01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AppinfoElement/echoAppinfoElement-Appi0000755000175000017500000000220612653650150032663 0ustar ellertellert some info ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AppinfoElement/AppinfoElement-AppinfoElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AppinfoElement/AppinfoElement-AppinfoE0000755000175000017500000000157012653650150032637 0ustar ellertellert some info././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AppinfoElement/echoAppinfoElement-AppinfoElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AppinfoElement/echoAppinfoElement-Appi0000755000175000017500000000162212653650150032664 0ustar ellertellert some info ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AppinfoElement/echoAppinfoElement-AppinfoElement01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AppinfoElement/echoAppinfoElement-Appi0000755000175000017500000000221012653650150032656 0ustar ellertellert some info gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0/0000755000175000017500000000000012653650150026667 5ustar ellertellert././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0/echoElementMinOccurs0-ElementMinOccurs002-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0/echoElementMinOccurs0000755000175000017500000000244412653650150032674 0ustar ellertellert Paul Sumner Downey ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0/echoElementMinOccurs0-ElementMinOccurs002-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0/echoElementMinOccurs0000755000175000017500000000244612653650150032676 0ustar ellertellert Paul Sumner Downey ././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0/echoElementMinOccurs0-ElementMinOccurs002.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0/echoElementMinOccurs0000755000175000017500000000204712653650150032673 0ustar ellertellert Paul Sumner Downey ././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0/ElementMinOccurs0-ElementMinOccurs001.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0/ElementMinOccurs0-El0000755000175000017500000000173412653650150032454 0ustar ellertellert Paul Downey ././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0/ElementMinOccurs0-ElementMinOccurs002.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0/ElementMinOccurs0-El0000755000175000017500000000201212653650150032442 0ustar ellertellert Paul Sumner Downey ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0/echoElementMinOccurs0-ElementMinOccurs001-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0/echoElementMinOccurs0000755000175000017500000000236212653650150032673 0ustar ellertellert Paul Downey ././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0/echoElementMinOccurs0-ElementMinOccurs001.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0/echoElementMinOccurs0000755000175000017500000000177112653650150032676 0ustar ellertellert Paul Downey ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0/echoElementMinOccurs0-ElementMinOccurs001-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0/echoElementMinOccurs0000755000175000017500000000236412653650150032675 0ustar ellertellert Paul Downey gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SimpleTypeAttributes/0000755000175000017500000000000012653650152027537 5ustar ellertellert././@LongLink0000644000000000000000000000020300000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SimpleTypeAttributes/SimpleTypeAttributes-SimpleTypeAttributes01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SimpleTypeAttributes/SimpleTypeAttribu0000755000175000017500000000173412653650152033120 0ustar ellertellert hello././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SimpleTypeAttributes/echoSimpleTypeAttributes-SimpleTypeAttributes01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SimpleTypeAttributes/echoSimpleTypeAtt0000755000175000017500000000237012653650152033072 0ustar ellertellert hello ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SimpleTypeAttributes/echoSimpleTypeAttributes-SimpleTypeAttributes01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SimpleTypeAttributes/echoSimpleTypeAtt0000755000175000017500000000236612653650152033077 0ustar ellertellert hello ././@LongLink0000644000000000000000000000020700000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SimpleTypeAttributes/echoSimpleTypeAttributes-SimpleTypeAttributes01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/SimpleTypeAttributes/echoSimpleTypeAtt0000755000175000017500000000200212653650152033062 0ustar ellertellert hello gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthSimpleTypePattern/0000755000175000017500000000000012653650152030764 5ustar ellertellert././@LongLink0000644000000000000000000000024300000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthSimpleTypePattern/echoGYearMonthSimpleTypePattern-GYearMonthSimpleTypePattern01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthSimpleTypePattern/echoGYearM0000755000175000017500000000230712653650152032677 0ustar ellertellert 2001-12 ././@LongLink0000644000000000000000000000023400000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthSimpleTypePattern/echoGYearMonthSimpleTypePattern-GYearMonthSimpleTypePattern01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthSimpleTypePattern/echoGYearM0000755000175000017500000000175312653650152032703 0ustar ellertellert 2001-12 ././@LongLink0000644000000000000000000000024300000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthSimpleTypePattern/echoGYearMonthSimpleTypePattern-GYearMonthSimpleTypePattern01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthSimpleTypePattern/echoGYearM0000755000175000017500000000230512653650152032675 0ustar ellertellert 2001-12 ././@LongLink0000644000000000000000000000023000000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthSimpleTypePattern/GYearMonthSimpleTypePattern-GYearMonthSimpleTypePattern01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthSimpleTypePattern/GYearMonth0000755000175000017500000000170412653650152032731 0ustar ellertellert 2001-12gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0MaxOccursUnbounded/0000755000175000017500000000000012653650152032362 5ustar ellertellert././@LongLink0000644000000000000000000000027400000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0MaxOccursUnbounded/echoElementMinOccurs0MaxOccursUnbounded-ElementMinOccurs0MaxOccursUnbounded101-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0MaxOccursUnbounded/ec0000755000175000017500000000222212653650150032673 0ustar ellertellert ././@LongLink0000644000000000000000000000027400000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0MaxOccursUnbounded/echoElementMinOccurs0MaxOccursUnbounded-ElementMinOccurs0MaxOccursUnbounded102-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0MaxOccursUnbounded/ec0000755000175000017500000000251112653650150032674 0ustar ellertellert 24 34 44 ././@LongLink0000644000000000000000000000026100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0MaxOccursUnbounded/ElementMinOccurs0MaxOccursUnbounded-ElementMinOccurs0MaxOccursUnbounded102.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0MaxOccursUnbounded/El0000755000175000017500000000177212653650152032657 0ustar ellertellert 24 34 44 ././@LongLink0000644000000000000000000000026500000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0MaxOccursUnbounded/echoElementMinOccurs0MaxOccursUnbounded-ElementMinOccurs0MaxOccursUnbounded102.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0MaxOccursUnbounded/ec0000755000175000017500000000210012653650150032666 0ustar ellertellert 24 34 44 ././@LongLink0000644000000000000000000000027400000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0MaxOccursUnbounded/echoElementMinOccurs0MaxOccursUnbounded-ElementMinOccurs0MaxOccursUnbounded101-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0MaxOccursUnbounded/ec0000755000175000017500000000222012653650150032671 0ustar ellertellert ././@LongLink0000644000000000000000000000027400000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0MaxOccursUnbounded/echoElementMinOccurs0MaxOccursUnbounded-ElementMinOccurs0MaxOccursUnbounded102-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0MaxOccursUnbounded/ec0000755000175000017500000000250712653650150032701 0ustar ellertellert 24 34 44 ././@LongLink0000644000000000000000000000026100000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0MaxOccursUnbounded/ElementMinOccurs0MaxOccursUnbounded-ElementMinOccurs0MaxOccursUnbounded101.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0MaxOccursUnbounded/El0000755000175000017500000000152212653650150032646 0ustar ellertellert ././@LongLink0000644000000000000000000000026500000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0MaxOccursUnbounded/echoElementMinOccurs0MaxOccursUnbounded-ElementMinOccurs0MaxOccursUnbounded101.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0MaxOccursUnbounded/ec0000755000175000017500000000163012653650150032675 0ustar ellertellert gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LanguageAttribute/0000755000175000017500000000000012653650152027004 5ustar ellertellert././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LanguageAttribute/echoLanguageAttribute-LanguageAttribute01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LanguageAttribute/echoLanguageAttribut0000755000175000017500000000224312653650152033034 0ustar ellertellert ././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LanguageAttribute/LanguageAttribute-LanguageAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LanguageAttribute/LanguageAttribute-La0000755000175000017500000000161712653650152032700 0ustar ellertellert ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LanguageAttribute/echoLanguageAttribute-LanguageAttribute01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LanguageAttribute/echoLanguageAttribut0000755000175000017500000000224512653650152033036 0ustar ellertellert ././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LanguageAttribute/echoLanguageAttribute-LanguageAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/LanguageAttribute/echoLanguageAttribut0000755000175000017500000000165712653650152033044 0ustar ellertellert gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FinalDefault/0000755000175000017500000000000012653650152025733 5ustar ellertellert././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FinalDefault/echoFinalDefault-FinalDefault01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FinalDefault/echoFinalDefault-FinalDef0000755000175000017500000000216612653650152032531 0ustar ellertellert foo ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FinalDefault/FinalDefault-FinalDefault01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FinalDefault/FinalDefault-FinalDefault0000755000175000017500000000154612653650152032561 0ustar ellertellert foo././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FinalDefault/echoFinalDefault-FinalDefault01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FinalDefault/echoFinalDefault-FinalDef0000755000175000017500000000157612653650152032535 0ustar ellertellert foo ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FinalDefault/echoFinalDefault-FinalDefault01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/FinalDefault/echoFinalDefault-FinalDef0000755000175000017500000000217012653650152032524 0ustar ellertellert foo gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NillableOptionalElement/0000755000175000017500000000000012653650152030137 5ustar ellertellert././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NillableOptionalElement/echoNillableOptionalElement-NillableOptionalElement03-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NillableOptionalElement/echoNillableOp0000755000175000017500000000250512653650152032747 0ustar ellertellert Paul Downey ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NillableOptionalElement/echoNillableOptionalElement-NillableOptionalElement02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NillableOptionalElement/echoNillableOp0000755000175000017500000000251312653650152032746 0ustar ellertellert Paul Sumner Downey ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NillableOptionalElement/echoNillableOptionalElement-NillableOptionalElement01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NillableOptionalElement/echoNillableOp0000755000175000017500000000243112653650152032745 0ustar ellertellert Paul Downey ././@LongLink0000644000000000000000000000022000000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NillableOptionalElement/echoNillableOptionalElement-NillableOptionalElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NillableOptionalElement/echoNillableOp0000755000175000017500000000206212653650152032745 0ustar ellertellert Paul Downey ././@LongLink0000644000000000000000000000022000000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NillableOptionalElement/echoNillableOptionalElement-NillableOptionalElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NillableOptionalElement/echoNillableOp0000755000175000017500000000214012653650152032742 0ustar ellertellert Paul Sumner Downey ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NillableOptionalElement/echoNillableOptionalElement-NillableOptionalElement01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NillableOptionalElement/echoNillableOp0000755000175000017500000000243312653650152032747 0ustar ellertellert Paul Downey ././@LongLink0000644000000000000000000000021400000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NillableOptionalElement/NillableOptionalElement-NillableOptionalElement03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NillableOptionalElement/NillableOption0000755000175000017500000000207212653650152033001 0ustar ellertellert Paul Downey ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NillableOptionalElement/echoNillableOptionalElement-NillableOptionalElement02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NillableOptionalElement/echoNillableOp0000755000175000017500000000251512653650152032750 0ustar ellertellert Paul Sumner Downey ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NillableOptionalElement/echoNillableOptionalElement-NillableOptionalElement03-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NillableOptionalElement/echoNillableOp0000755000175000017500000000250712653650152032751 0ustar ellertellert Paul Downey ././@LongLink0000644000000000000000000000021400000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NillableOptionalElement/NillableOptionalElement-NillableOptionalElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NillableOptionalElement/NillableOption0000755000175000017500000000210012653650152032771 0ustar ellertellert Paul Sumner Downey ././@LongLink0000644000000000000000000000021400000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NillableOptionalElement/NillableOptionalElement-NillableOptionalElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NillableOptionalElement/NillableOption0000755000175000017500000000202212653650152032774 0ustar ellertellert Paul Downey ././@LongLink0000644000000000000000000000022000000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NillableOptionalElement/echoNillableOptionalElement-NillableOptionalElement03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NillableOptionalElement/echoNillableOp0000755000175000017500000000213212653650152032743 0ustar ellertellert Paul Downey gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceLaxOther/0000755000175000017500000000000012653650152030275 5ustar ellertellert././@LongLink0000644000000000000000000000021700000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceLaxOther/ExtendedSequenceLaxOther-ExtendedSequenceLaxOther01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceLaxOther/ExtendedSeque0000755000175000017500000000226412653650152032772 0ustar ellertellert String String Stuff ././@LongLink0000644000000000000000000000022300000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceLaxOther/echoExtendedSequenceLaxOther-ExtendedSequenceLaxOther01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceLaxOther/echoExtendedS0000755000175000017500000000233312653650152032746 0ustar ellertellert String String Stuff ././@LongLink0000644000000000000000000000023200000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceLaxOther/echoExtendedSequenceLaxOther-ExtendedSequenceLaxOther01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceLaxOther/echoExtendedS0000755000175000017500000000266312653650152032754 0ustar ellertellert String String Stuff ././@LongLink0000644000000000000000000000023200000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceLaxOther/echoExtendedSequenceLaxOther-ExtendedSequenceLaxOther01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceLaxOther/echoExtendedS0000755000175000017500000000266512653650152032756 0ustar ellertellert String String Stuff gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortElement/0000755000175000017500000000000012653650152026006 5ustar ellertellert././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortElement/ShortElement-ShortElement04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortElement/ShortElement-ShortElement0000755000175000017500000000155112653650152032756 0ustar ellertellert -32768././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortElement/echoShortElement-ShortElement02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortElement/echoShortElement-ShortEle0000755000175000017500000000217012653650152032727 0ustar ellertellert +42 ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortElement/echoShortElement-ShortElement04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortElement/echoShortElement-ShortEle0000755000175000017500000000160112653650152032725 0ustar ellertellert -32768 ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortElement/echoShortElement-ShortElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortElement/echoShortElement-ShortEle0000755000175000017500000000157612653650152032740 0ustar ellertellert +42 ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortElement/echoShortElement-ShortElement02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortElement/echoShortElement-ShortEle0000755000175000017500000000216612653650152032734 0ustar ellertellert +42 ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortElement/echoShortElement-ShortElement01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortElement/echoShortElement-ShortEle0000755000175000017500000000216612653650152032734 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortElement/echoShortElement-ShortElement03-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortElement/echoShortElement-ShortEle0000755000175000017500000000217212653650152032731 0ustar ellertellert 32767 ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortElement/echoShortElement-ShortElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortElement/echoShortElement-ShortEle0000755000175000017500000000157412653650152032736 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortElement/echoShortElement-ShortElement03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortElement/echoShortElement-ShortEle0000755000175000017500000000160012653650152032724 0ustar ellertellert 32767 ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortElement/ShortElement-ShortElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortElement/ShortElement-ShortElement0000755000175000017500000000154412653650152032760 0ustar ellertellert 1././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortElement/ShortElement-ShortElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortElement/ShortElement-ShortElement0000755000175000017500000000154612653650152032762 0ustar ellertellert +42././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortElement/ShortElement-ShortElement03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortElement/ShortElement-ShortElement0000755000175000017500000000155012653650152032755 0ustar ellertellert 32767././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortElement/echoShortElement-ShortElement04-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortElement/echoShortElement-ShortEle0000755000175000017500000000217112653650152032730 0ustar ellertellert -32768 ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortElement/echoShortElement-ShortElement01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortElement/echoShortElement-ShortEle0000755000175000017500000000216412653650152032732 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortElement/echoShortElement-ShortElement03-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortElement/echoShortElement-ShortEle0000755000175000017500000000217012653650152032727 0ustar ellertellert 32767 ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortElement/echoShortElement-ShortElement04-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ShortElement/echoShortElement-ShortEle0000755000175000017500000000217312653650152032732 0ustar ellertellert -32768 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BareVector/0000755000175000017500000000000012653650150025427 5ustar ellertellert././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BareVector/echoBareVector-BareVector04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BareVector/echoBareVector-BareVector040000755000175000017500000000201712653650150032446 0ustar ellertellert item one item two item three item four gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BareVector/BareVector-BareVector01.xml0000755000175000017500000000210612653650150032402 0ustar ellertellert item one item two item three item four item five item six ././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BareVector/echoBareVector-BareVector02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BareVector/echoBareVector-BareVector020000755000175000017500000000244012653650150032444 0ustar ellertellert item one item two item three item four ././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BareVector/echoBareVector-BareVector04-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BareVector/echoBareVector-BareVector040000755000175000017500000000243612653650150032453 0ustar ellertellert item one item two item three item four ././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BareVector/echoBareVector-BareVector03-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BareVector/echoBareVector-BareVector030000755000175000017500000000256512653650150032455 0ustar ellertellert item one item two item three item four item five item six ././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BareVector/echoBareVector-BareVector04-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BareVector/echoBareVector-BareVector040000755000175000017500000000244012653650150032446 0ustar ellertellert item one item two item three item four ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BareVector/echoBareVector-BareVector03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BareVector/echoBareVector-BareVector030000755000175000017500000000213412653650150032445 0ustar ellertellert item one item two item three item four item five item six gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BareVector/BareVector-BareVector04.xml0000755000175000017500000000177112653650150032414 0ustar ellertellert item one item two item three item four ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BareVector/echoBareVector-BareVector02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BareVector/echoBareVector-BareVector020000755000175000017500000000201712653650150032444 0ustar ellertellert item one item two item three item four ././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BareVector/echoBareVector-BareVector02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BareVector/echoBareVector-BareVector020000755000175000017500000000243612653650150032451 0ustar ellertellert item one item two item three item four ././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BareVector/echoBareVector-BareVector01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BareVector/echoBareVector-BareVector010000755000175000017500000000256512653650150032453 0ustar ellertellert item one item two item three item four item five item six gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BareVector/BareVector-BareVector03.xml0000755000175000017500000000210612653650150032404 0ustar ellertellert item one item two item three item four item five item six ././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BareVector/echoBareVector-BareVector01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BareVector/echoBareVector-BareVector010000755000175000017500000000256312653650150032451 0ustar ellertellert item one item two item three item four item five item six gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BareVector/BareVector-BareVector02.xml0000755000175000017500000000177112653650150032412 0ustar ellertellert item one item two item three item four ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BareVector/echoBareVector-BareVector01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BareVector/echoBareVector-BareVector010000755000175000017500000000213412653650150032443 0ustar ellertellert item one item two item three item four item five item six ././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BareVector/echoBareVector-BareVector03-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/BareVector/echoBareVector-BareVector030000755000175000017500000000256312653650150032453 0ustar ellertellert item one item two item three item four item five item six gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ENTITIESElement/0000755000175000017500000000000012653650152026133 5ustar ellertellert././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ENTITIESElement/ENTITIESElement-ENTITIESElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ENTITIESElement/ENTITIESElement-ENTITI0000755000175000017500000000160412653650152031612 0ustar ellertellert lt gt apos quot././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ENTITIESElement/echoENTITIESElement-ENTITIESElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ENTITIESElement/echoENTITIESElement-EN0000755000175000017500000000163712653650152031765 0ustar ellertellert lt gt apos quot ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ENTITIESElement/echoENTITIESElement-ENTITIESElement01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ENTITIESElement/echoENTITIESElement-EN0000755000175000017500000000222112653650152031753 0ustar ellertellert lt gt apos quot ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ENTITIESElement/echoENTITIESElement-ENTITIESElement01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ENTITIESElement/echoENTITIESElement-EN0000755000175000017500000000222312653650152031755 0ustar ellertellert lt gt apos quot gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/0000755000175000017500000000000012653650152030442 5ustar ellertellert././@LongLink0000644000000000000000000000022600000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/echoNonNegativeIntegerElement-NonNegativeIntegerElement05.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/echoNonNegat0000755000175000017500000000201512653650152032736 0ustar ellertellert 3141592653531415926536106615151970884848347234273984723 ././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/echoNonNegativeIntegerElement-NonNegativeIntegerElement03-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/echoNonNegat0000755000175000017500000000226512653650152032745 0ustar ellertellert 0 ././@LongLink0000644000000000000000000000022200000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/NonNegativeIntegerElement-NonNegativeIntegerElement03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/NonNegativeI0000755000175000017500000000166212653650152032723 0ustar ellertellert 0././@LongLink0000644000000000000000000000022200000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/NonNegativeIntegerElement-NonNegativeIntegerElement05.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/NonNegativeI0000755000175000017500000000175012653650152032721 0ustar ellertellert 3141592653531415926536106615151970884848347234273984723././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/echoNonNegativeIntegerElement-NonNegativeIntegerElement02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/echoNonNegat0000755000175000017500000000226612653650152032746 0ustar ellertellert -0 ././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/echoNonNegativeIntegerElement-NonNegativeIntegerElement05-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/echoNonNegat0000755000175000017500000000235312653650152032743 0ustar ellertellert 3141592653531415926536106615151970884848347234273984723 ././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/echoNonNegativeIntegerElement-NonNegativeIntegerElement04-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/echoNonNegat0000755000175000017500000000226712653650152032747 0ustar ellertellert +42 ././@LongLink0000644000000000000000000000022600000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/echoNonNegativeIntegerElement-NonNegativeIntegerElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/echoNonNegat0000755000175000017500000000172712653650152032747 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000022200000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/NonNegativeIntegerElement-NonNegativeIntegerElement04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/NonNegativeI0000755000175000017500000000166412653650152032725 0ustar ellertellert +42././@LongLink0000644000000000000000000000022600000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/echoNonNegativeIntegerElement-NonNegativeIntegerElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/echoNonNegat0000755000175000017500000000173012653650152032741 0ustar ellertellert -0 ././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/echoNonNegativeIntegerElement-NonNegativeIntegerElement02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/echoNonNegat0000755000175000017500000000227012653650152032741 0ustar ellertellert -0 ././@LongLink0000644000000000000000000000022200000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/NonNegativeIntegerElement-NonNegativeIntegerElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/NonNegativeI0000755000175000017500000000166312653650152032724 0ustar ellertellert -0././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/echoNonNegativeIntegerElement-NonNegativeIntegerElement01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/echoNonNegat0000755000175000017500000000226512653650152032745 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/echoNonNegativeIntegerElement-NonNegativeIntegerElement01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/echoNonNegat0000755000175000017500000000226712653650152032747 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/echoNonNegativeIntegerElement-NonNegativeIntegerElement04-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/echoNonNegat0000755000175000017500000000227112653650152032742 0ustar ellertellert +42 ././@LongLink0000644000000000000000000000022600000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/echoNonNegativeIntegerElement-NonNegativeIntegerElement03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/echoNonNegat0000755000175000017500000000172712653650152032747 0ustar ellertellert 0 ././@LongLink0000644000000000000000000000022600000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/echoNonNegativeIntegerElement-NonNegativeIntegerElement04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/echoNonNegat0000755000175000017500000000173112653650152032742 0ustar ellertellert +42 ././@LongLink0000644000000000000000000000022200000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/NonNegativeIntegerElement-NonNegativeIntegerElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/NonNegativeI0000755000175000017500000000166212653650152032723 0ustar ellertellert 1././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/echoNonNegativeIntegerElement-NonNegativeIntegerElement05-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/echoNonNegat0000755000175000017500000000235512653650152032745 0ustar ellertellert 3141592653531415926536106615151970884848347234273984723 ././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/echoNonNegativeIntegerElement-NonNegativeIntegerElement03-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/echoNonNegat0000755000175000017500000000226712653650152032747 0ustar ellertellert 0 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceSkipAny/0000755000175000017500000000000012653650152030125 5ustar ellertellert././@LongLink0000644000000000000000000000022000000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceSkipAny/echoExtendedSequenceSkipAny-ExtendedSequenceSkipAny01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceSkipAny/echoExtendedSe0000755000175000017500000000232312653650152032742 0ustar ellertellert String String Stuff ././@LongLink0000644000000000000000000000021400000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceSkipAny/ExtendedSequenceSkipAny-ExtendedSequenceSkipAny01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceSkipAny/ExtendedSequen0000755000175000017500000000225512653650152033000 0ustar ellertellert String String Stuff ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceSkipAny/echoExtendedSequenceSkipAny-ExtendedSequenceSkipAny01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceSkipAny/echoExtendedSe0000755000175000017500000000266012653650152032746 0ustar ellertellert String String Stuff ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceSkipAny/echoExtendedSequenceSkipAny-ExtendedSequenceSkipAny01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceSkipAny/echoExtendedSe0000755000175000017500000000265612653650152032753 0ustar ellertellert String String Stuff gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENSAttribute/0000755000175000017500000000000012653650152026517 5ustar ellertellert././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENSAttribute/NMTOKENSAttribute-NMTOKENSAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENSAttribute/NMTOKENSAttribute-NM0000755000175000017500000000163612653650152032105 0ustar ellertellert ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENSAttribute/echoNMTOKENSAttribute-NMTOKENSAttribute01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENSAttribute/echoNMTOKENSAttribut0000755000175000017500000000226212653650152032263 0ustar ellertellert ././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENSAttribute/echoNMTOKENSAttribute-NMTOKENSAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENSAttribute/echoNMTOKENSAttribut0000755000175000017500000000167612653650152032273 0ustar ellertellert ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENSAttribute/echoNMTOKENSAttribute-NMTOKENSAttribute01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENSAttribute/echoNMTOKENSAttribut0000755000175000017500000000226412653650152032265 0ustar ellertellert gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NCNameAttribute/0000755000175000017500000000000012653650152026362 5ustar ellertellert././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NCNameAttribute/echoNCNameAttribute-NCNameAttribute01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NCNameAttribute/echoNCNameAttribute-NC0000755000175000017500000000223012653650152032427 0ustar ellertellert ././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NCNameAttribute/echoNCNameAttribute-NCNameAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NCNameAttribute/echoNCNameAttribute-NC0000755000175000017500000000164012653650152032433 0ustar ellertellert ././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NCNameAttribute/NCNameAttribute-NCNameAttribute01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NCNameAttribute/NCNameAttribute-NCName0000755000175000017500000000160212653650152032373 0ustar ellertellert ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NCNameAttribute/echoNCNameAttribute-NCNameAttribute01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/NCNameAttribute/echoNCNameAttribute-NC0000755000175000017500000000223212653650152032431 0ustar ellertellert gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IDElement/0000755000175000017500000000000012653650152025203 5ustar ellertellert././@LongLink0000644000000000000000000000015500000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IDElement/echoIDElement-IDElement01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IDElement/echoIDElement-IDElement01-so0000755000175000017500000000214712653650152032166 0ustar ellertellert foo ././@LongLink0000644000000000000000000000015500000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IDElement/echoIDElement-IDElement01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IDElement/echoIDElement-IDElement01-so0000755000175000017500000000215112653650152032161 0ustar ellertellert foo ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IDElement/echoIDElement-IDElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IDElement/echoIDElement-IDElement01.xm0000755000175000017500000000155112653650152032170 0ustar ellertellert foo gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/IDElement/IDElement-IDElement01.xml0000755000175000017500000000152412653650152031505 0ustar ellertellert foogsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongEnumerationType/0000755000175000017500000000000012653650154031044 5ustar ellertellert././@LongLink0000644000000000000000000000023000000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongEnumerationType/UnsignedLongEnumerationType-UnsignedLongEnumerationType01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongEnumerationType/UnsignedLo0000755000175000017500000000171312653650154033043 0ustar ellertellert 33333333333333././@LongLink0000644000000000000000000000024300000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongEnumerationType/echoUnsignedLongEnumerationType-UnsignedLongEnumerationType01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongEnumerationType/echoUnsign0000755000175000017500000000231612653650154033076 0ustar ellertellert 33333333333333 ././@LongLink0000644000000000000000000000023400000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongEnumerationType/echoUnsignedLongEnumerationType-UnsignedLongEnumerationType01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongEnumerationType/echoUnsign0000755000175000017500000000176212653650154033102 0ustar ellertellert 33333333333333 ././@LongLink0000644000000000000000000000024300000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongEnumerationType/echoUnsignedLongEnumerationType-UnsignedLongEnumerationType01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongEnumerationType/echoUnsign0000755000175000017500000000231412653650154033074 0ustar ellertellert 33333333333333 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ImportNamespace/0000755000175000017500000000000012653650152026464 5ustar ellertellertgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementReferenceUnqualified/0000755000175000017500000000000012653650152030774 5ustar ellertellert././@LongLink0000644000000000000000000000024300000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementReferenceUnqualified/echoElementReferenceUnqualified-ElementReferenceUnqualified01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementReferenceUnqualified/echoElemen0000755000175000017500000000262012653650152032766 0ustar ellertellert String String ././@LongLink0000644000000000000000000000023000000000000011576 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementReferenceUnqualified/ElementReferenceUnqualified-ElementReferenceUnqualified01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementReferenceUnqualified/ElementRef0000755000175000017500000000220412653650152032746 0ustar ellertellert String String ././@LongLink0000644000000000000000000000024300000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementReferenceUnqualified/echoElementReferenceUnqualified-ElementReferenceUnqualified01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementReferenceUnqualified/echoElemen0000755000175000017500000000262212653650152032770 0ustar ellertellert String String ././@LongLink0000644000000000000000000000023400000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementReferenceUnqualified/echoElementReferenceUnqualified-ElementReferenceUnqualified01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementReferenceUnqualified/echoElemen0000755000175000017500000000225312653650152032770 0ustar ellertellert String String gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementFixed/0000755000175000017500000000000012653650150025744 5ustar ellertellert././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementFixed/echoElementFixed-ElementFixed01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementFixed/echoElementFixed-ElementF0000755000175000017500000000217012653650150032577 0ustar ellertellert yes ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementFixed/ElementFixed-ElementFixed01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementFixed/ElementFixed-ElementFixed0000755000175000017500000000154612653650150032620 0ustar ellertellert yes././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementFixed/echoElementFixed-ElementFixed01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementFixed/echoElementFixed-ElementF0000755000175000017500000000216612653650150032604 0ustar ellertellert yes ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementFixed/echoElementFixed-ElementFixed01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementFixed/echoElementFixed-ElementF0000755000175000017500000000157612653650150032610 0ustar ellertellert yes gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementAll/0000755000175000017500000000000012653650152026540 5ustar ellertellert././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementAll/echoGlobalElementAll-GlobalElementAll02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementAll/echoGlobalElementAll-0000755000175000017500000000241412653650152032546 0ustar ellertellert 42 douze ././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementAll/echoGlobalElementAll-GlobalElementAll02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementAll/echoGlobalElementAll-0000755000175000017500000000202112653650152032540 0ustar ellertellert 42 douze ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementAll/echoGlobalElementAll-GlobalElementAll01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementAll/echoGlobalElementAll-0000755000175000017500000000241212653650152032544 0ustar ellertellert one 42 ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementAll/echoGlobalElementAll-GlobalElementAll02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementAll/echoGlobalElementAll-0000755000175000017500000000241612653650152032550 0ustar ellertellert 42 douze ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementAll/echoGlobalElementAll-GlobalElementAll01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementAll/echoGlobalElementAll-0000755000175000017500000000241412653650152032546 0ustar ellertellert one 42 ././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementAll/echoGlobalElementAll-GlobalElementAll01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementAll/echoGlobalElementAll-0000755000175000017500000000201712653650152032545 0ustar ellertellert one 42 ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementAll/GlobalElementAll-GlobalElementAll02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementAll/GlobalElementAll-Glob0000755000175000017500000000176512653650152032523 0ustar ellertellert 42 douze ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementAll/GlobalElementAll-GlobalElementAll01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementAll/GlobalElementAll-Glob0000755000175000017500000000176312653650152032521 0ustar ellertellert one 42 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceChoice/0000755000175000017500000000000012653650150025700 5ustar ellertellert././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceChoice/echoChoiceChoice-ChoiceChoice03-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceChoice/echoChoiceChoice-ChoiceCh0000755000175000017500000000224712653650150032442 0ustar ellertellert home ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceChoice/ChoiceChoice-ChoiceChoice03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceChoice/ChoiceChoice-ChoiceChoice0000755000175000017500000000161612653650150032442 0ustar ellertellert home ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceChoice/echoChoiceChoice-ChoiceChoice02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceChoice/echoChoiceChoice-ChoiceCh0000755000175000017500000000164612653650150032444 0ustar ellertellert home ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceChoice/echoChoiceChoice-ChoiceChoice01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceChoice/echoChoiceChoice-ChoiceCh0000755000175000017500000000224512653650150032440 0ustar ellertellert home ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceChoice/echoChoiceChoice-ChoiceChoice03-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceChoice/echoChoiceChoice-ChoiceCh0000755000175000017500000000224512653650150032440 0ustar ellertellert home ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceChoice/ChoiceChoice-ChoiceChoice02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceChoice/ChoiceChoice-ChoiceChoice0000755000175000017500000000161612653650150032442 0ustar ellertellert home ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceChoice/echoChoiceChoice-ChoiceChoice02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceChoice/echoChoiceChoice-ChoiceCh0000755000175000017500000000224512653650150032440 0ustar ellertellert home ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceChoice/echoChoiceChoice-ChoiceChoice01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceChoice/echoChoiceChoice-ChoiceCh0000755000175000017500000000164612653650150032444 0ustar ellertellert home ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceChoice/echoChoiceChoice-ChoiceChoice02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceChoice/echoChoiceChoice-ChoiceCh0000755000175000017500000000224712653650150032442 0ustar ellertellert home ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceChoice/ChoiceChoice-ChoiceChoice01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceChoice/ChoiceChoice-ChoiceChoice0000755000175000017500000000161612653650150032442 0ustar ellertellert home ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceChoice/echoChoiceChoice-ChoiceChoice01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceChoice/echoChoiceChoice-ChoiceCh0000755000175000017500000000224712653650150032442 0ustar ellertellert home ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceChoice/echoChoiceChoice-ChoiceChoice03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ChoiceChoice/echoChoiceChoice-ChoiceCh0000755000175000017500000000164612653650150032444 0ustar ellertellert home gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementGroup/0000755000175000017500000000000012653650150026001 5ustar ellertellert././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementGroup/echoElementGroup-ElementGroup01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementGroup/echoElementGroup-ElementG0000755000175000017500000000231312653650150032671 0ustar ellertellert foo bar ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementGroup/ElementGroup-ElementGroup01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementGroup/ElementGroup-ElementGroup0000755000175000017500000000166012653650150032744 0ustar ellertellert foo bar ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementGroup/echoElementGroup-ElementGroup01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementGroup/echoElementGroup-ElementG0000755000175000017500000000231512653650150032673 0ustar ellertellert foo bar ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementGroup/echoElementGroup-ElementGroup01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ElementGroup/echoElementGroup-ElementG0000755000175000017500000000171012653650150032671 0ustar ellertellert foo bar gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeSkip/0000755000175000017500000000000012653650150026635 5ustar ellertellert././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeSkip/echoAnyAttributeSkip-AnyAttributeSkip01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeSkip/echoAnyAttributeSkip-0000755000175000017500000000243312653650150032743 0ustar ellertellert Bobby Sox ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeSkip/AnyAttributeSkip-AnyAttributeSkip01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeSkip/AnyAttributeSkip-AnyA0000755000175000017500000000177112653650150032661 0ustar ellertellert Bobby Sox ././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeSkip/echoAnyAttributeSkip-AnyAttributeSkip01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeSkip/echoAnyAttributeSkip-0000755000175000017500000000203012653650150032734 0ustar ellertellert Bobby Sox ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeSkip/echoAnyAttributeSkip-AnyAttributeSkip01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeSkip/echoAnyAttributeSkip-0000755000175000017500000000243112653650150032741 0ustar ellertellert Bobby Sox gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongElement/0000755000175000017500000000000012653650154027305 5ustar ellertellert././@LongLink0000644000000000000000000000020400000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongElement/echoUnsignedLongElement-UnsignedLongElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongElement/echoUnsignedLongEl0000755000175000017500000000165612653650154032757 0ustar ellertellert -0 ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongElement/echoUnsignedLongElement-UnsignedLongElement04-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongElement/echoUnsignedLongEl0000755000175000017500000000225412653650154032752 0ustar ellertellert 18446744073709551615 ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongElement/echoUnsignedLongElement-UnsignedLongElement01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongElement/echoUnsignedLongEl0000755000175000017500000000222712653650154032752 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000020400000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongElement/echoUnsignedLongElement-UnsignedLongElement03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongElement/echoUnsignedLongEl0000755000175000017500000000165712653650154032760 0ustar ellertellert +42 ././@LongLink0000644000000000000000000000020400000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongElement/echoUnsignedLongElement-UnsignedLongElement04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongElement/echoUnsignedLongEl0000755000175000017500000000170012653650154032745 0ustar ellertellert 18446744073709551615 ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongElement/echoUnsignedLongElement-UnsignedLongElement02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongElement/echoUnsignedLongEl0000755000175000017500000000223012653650154032744 0ustar ellertellert -0 ././@LongLink0000644000000000000000000000020000000000000011573 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongElement/UnsignedLongElement-UnsignedLongElement04.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongElement/UnsignedLongElemen0000755000175000017500000000164112653650154032757 0ustar ellertellert 18446744073709551615././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongElement/echoUnsignedLongElement-UnsignedLongElement01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongElement/echoUnsignedLongEl0000755000175000017500000000223112653650154032745 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000020000000000000011573 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongElement/UnsignedLongElement-UnsignedLongElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongElement/UnsignedLongElemen0000755000175000017500000000161612653650154032761 0ustar ellertellert 1././@LongLink0000644000000000000000000000020000000000000011573 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongElement/UnsignedLongElement-UnsignedLongElement03.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongElement/UnsignedLongElemen0000755000175000017500000000162012653650154032754 0ustar ellertellert +42././@LongLink0000644000000000000000000000020000000000000011573 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongElement/UnsignedLongElement-UnsignedLongElement02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongElement/UnsignedLongElemen0000755000175000017500000000161712653650154032762 0ustar ellertellert -0././@LongLink0000644000000000000000000000020400000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongElement/echoUnsignedLongElement-UnsignedLongElement01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongElement/echoUnsignedLongEl0000755000175000017500000000165512653650154032756 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongElement/echoUnsignedLongElement-UnsignedLongElement04-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongElement/echoUnsignedLongEl0000755000175000017500000000225212653650154032750 0ustar ellertellert 18446744073709551615 ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongElement/echoUnsignedLongElement-UnsignedLongElement03-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongElement/echoUnsignedLongEl0000755000175000017500000000223112653650154032745 0ustar ellertellert +42 ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongElement/echoUnsignedLongElement-UnsignedLongElement03-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongElement/echoUnsignedLongEl0000755000175000017500000000223312653650154032747 0ustar ellertellert +42 ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongElement/echoUnsignedLongElement-UnsignedLongElement02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongElement/echoUnsignedLongEl0000755000175000017500000000223212653650154032746 0ustar ellertellert -0 gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringSimpleTypePattern/0000755000175000017500000000000012653650152030215 5ustar ellertellert././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringSimpleTypePattern/echoStringSimpleTypePattern-StringSimpleTypePattern02-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringSimpleTypePattern/echoStringSimp0000755000175000017500000000225512653650152033105 0ustar ellertellert 009 ././@LongLink0000644000000000000000000000021400000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringSimpleTypePattern/StringSimpleTypePattern-StringSimpleTypePattern01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringSimpleTypePattern/StringSimpleTy0000755000175000017500000000165012653650152033102 0ustar ellertellert 123././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringSimpleTypePattern/echoStringSimpleTypePattern-StringSimpleTypePattern02-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringSimpleTypePattern/echoStringSimp0000755000175000017500000000225712653650152033107 0ustar ellertellert 009 ././@LongLink0000644000000000000000000000022000000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringSimpleTypePattern/echoStringSimpleTypePattern-StringSimpleTypePattern02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringSimpleTypePattern/echoStringSimp0000755000175000017500000000171312653650152033103 0ustar ellertellert 009 ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringSimpleTypePattern/echoStringSimpleTypePattern-StringSimpleTypePattern01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringSimpleTypePattern/echoStringSimp0000755000175000017500000000225712653650152033107 0ustar ellertellert 123 ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringSimpleTypePattern/echoStringSimpleTypePattern-StringSimpleTypePattern01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringSimpleTypePattern/echoStringSimp0000755000175000017500000000225512653650152033105 0ustar ellertellert 123 ././@LongLink0000644000000000000000000000022000000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringSimpleTypePattern/echoStringSimpleTypePattern-StringSimpleTypePattern01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringSimpleTypePattern/echoStringSimp0000755000175000017500000000171312653650152033103 0ustar ellertellert 123 ././@LongLink0000644000000000000000000000021400000000000011600 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringSimpleTypePattern/StringSimpleTypePattern-StringSimpleTypePattern02.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/StringSimpleTypePattern/StringSimpleTy0000755000175000017500000000165012653650152033102 0ustar ellertellert 009gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceLaxAny/0000755000175000017500000000000012653650152027743 5ustar ellertellert././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceLaxAny/ExtendedSequenceLaxAny-ExtendedSequenceLaxAny01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceLaxAny/ExtendedSequenc0000755000175000017500000000224612653650152032761 0ustar ellertellert String String Stuff ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceLaxAny/echoExtendedSequenceLaxAny-ExtendedSequenceLaxAny01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceLaxAny/echoExtendedSeq0000755000175000017500000000265312653650152032747 0ustar ellertellert String String Stuff ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceLaxAny/echoExtendedSequenceLaxAny-ExtendedSequenceLaxAny01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceLaxAny/echoExtendedSeq0000755000175000017500000000265112653650152032745 0ustar ellertellert String String Stuff ././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceLaxAny/echoExtendedSequenceLaxAny-ExtendedSequenceLaxAny01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceLaxAny/echoExtendedSeq0000755000175000017500000000231312653650152032740 0ustar ellertellert String String Stuff gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortEnumerationType/0000755000175000017500000000000012653650154031244 5ustar ellertellert././@LongLink0000644000000000000000000000024600000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortEnumerationType/echoUnsignedShortEnumerationType-UnsignedShortEnumerationType01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortEnumerationType/echoUnsig0000755000175000017500000000230712653650154033120 0ustar ellertellert 3333 ././@LongLink0000644000000000000000000000024600000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortEnumerationType/echoUnsignedShortEnumerationType-UnsignedShortEnumerationType01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortEnumerationType/echoUnsig0000755000175000017500000000231112653650154033113 0ustar ellertellert 3333 ././@LongLink0000644000000000000000000000023700000000000011605 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortEnumerationType/echoUnsignedShortEnumerationType-UnsignedShortEnumerationType01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortEnumerationType/echoUnsig0000755000175000017500000000175712653650154033130 0ustar ellertellert 3333 ././@LongLink0000644000000000000000000000023300000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortEnumerationType/UnsignedShortEnumerationType-UnsignedShortEnumerationType01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortEnumerationType/UnsignedS0000755000175000017500000000170712653650154033076 0ustar ellertellert 3333gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeReferenceUnqualified/0000755000175000017500000000000012653650150031344 5ustar ellertellert././@LongLink0000644000000000000000000000024200000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeReferenceUnqualified/echoAttributeReferenceUnqualified-AttributeReferenceUnqualified01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeReferenceUnqualified/echoAttr0000755000175000017500000000225512653650150033047 0ustar ellertellert String String ././@LongLink0000644000000000000000000000025100000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeReferenceUnqualified/echoAttributeReferenceUnqualified-AttributeReferenceUnqualified01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeReferenceUnqualified/echoAttr0000755000175000017500000000262612653650150033051 0ustar ellertellert String String ././@LongLink0000644000000000000000000000025100000000000011601 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeReferenceUnqualified/echoAttributeReferenceUnqualified-AttributeReferenceUnqualified01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeReferenceUnqualified/echoAttr0000755000175000017500000000262412653650150033047 0ustar ellertellert String String ././@LongLink0000644000000000000000000000023600000000000011604 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeReferenceUnqualified/AttributeReferenceUnqualified-AttributeReferenceUnqualified01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/AttributeReferenceUnqualified/Attribut0000755000175000017500000000220112653650150033063 0ustar ellertellert String String gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalAttributeSimpleType/0000755000175000017500000000000012653650152030475 5ustar ellertellert././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalAttributeSimpleType/echoGlobalAttributeSimpleType-GlobalAttributeSimpleType01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalAttributeSimpleType/echoGlobalAt0000755000175000017500000000255212653650152032753 0ustar ellertellert string ././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalAttributeSimpleType/echoGlobalAttributeSimpleType-GlobalAttributeSimpleType01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalAttributeSimpleType/echoGlobalAt0000755000175000017500000000255412653650152032755 0ustar ellertellert string ././@LongLink0000644000000000000000000000022200000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalAttributeSimpleType/GlobalAttributeSimpleType-GlobalAttributeSimpleType01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalAttributeSimpleType/GlobalAttrib0000755000175000017500000000212712653650152032773 0ustar ellertellert string ././@LongLink0000644000000000000000000000022600000000000011603 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalAttributeSimpleType/echoGlobalAttributeSimpleType-GlobalAttributeSimpleType01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/GlobalAttributeSimpleType/echoGlobalAt0000755000175000017500000000217712653650152032756 0ustar ellertellert string gsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MixedComplexContent/0000755000175000017500000000000012653650152027326 5ustar ellertellert././@LongLink0000644000000000000000000000020400000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MixedComplexContent/echoMixedComplexContent-MixedComplexContent01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MixedComplexContent/echoMixedComplexCo0000755000175000017500000000216312653650152032775 0ustar ellertellert string mixed content string mixed content string mixed content ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MixedComplexContent/echoMixedComplexContent-MixedComplexContent01-soap11.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MixedComplexContent/echoMixedComplexCo0000755000175000017500000000254312653650152032777 0ustar ellertellert string mixed content string mixed content string mixed content ././@LongLink0000644000000000000000000000020000000000000011573 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MixedComplexContent/MixedComplexContent-MixedComplexContent01.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MixedComplexContent/MixedComplexConten0000755000175000017500000000212412653650152033020 0ustar ellertellert string mixed content string mixed content string mixed content ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MixedComplexContent/echoMixedComplexContent-MixedComplexContent01-soap12.xmlgsoap-2.8.28/gsoap/samples/autotest/databinding/examples/6/09/MixedComplexContent/echoMixedComplexCo0000755000175000017500000000254112653650152032775 0ustar ellertellert string mixed content string mixed content string mixed content gsoap-2.8.28/gsoap/samples/autotest/README.txt0000644000175000017500000002265312653650154020426 0ustar ellertellert Autotest Server Feature Demonstration ===================================== The soapcpp2 option -T generates an autotest server soapTester.c[pp], which can be used to test a client application against, or to test messaging and XML databindings. Option -T can be used in combination with option -i to generate test server object classes, instead of C code. In this example an autotest server is generated and used to verify the schema mapping capability against 294 schema patterns published by the W3C Schema Patterns for Databinding Working Group. XML Schema Patterns for Databinding Interoperability Testing ------------------------------------------------------------ Both basic and advanced XML schema patterns test suite are passed by gSOAP. For more information about the W3C working group databinding test patterns, see http://www.w3.org/2002/ws/databinding/ Code is autogenerated from WSDL and XSD documents for interoperability testing. This example shows the auto test functionality for a large WSDL with 294 echo operations for basic and advanced XML schema patterns. The generated auto test server implements the echo operations where the echo operations are generated by soapcpp2 option -T based on the fact that the input and output operation types are identical. From the 294 test patterns, gSOAP passes all except for 10 that are deemed impossible to test because these 10 patterns in examples.xsd/examples.wsdl (provided by the working group) have errors due to skipped test patterns in the schemas. For details on errors and skipped tests, see further below. Acknowledgments and Licenses ---------------------------- W3C XML Schema Patterns for Databinding Working Group: http://www.w3.org/2002/ws/databinding/ Schemas and XML documents duplicated here with permission: examples.wsdl WSDL from the W3C (with some edits) examples.xsd the schema only, provided by the W3C ChameleonIncluded.xsd referenced in examples.wsdl Included.xsd referenced in examples.wsdl RelativeIncluded.xsd referenced in examples.wsdl redefineschema.xsd referenced in examples.wsdl strict.xsd referenced in examples.wsdl databinding/examples/6/09/.../ (copy of XML message files only) W3C copyright and document licensing: http://www.w3.org/Consortium/Legal/copyright-documents Introduction and Usage ---------------------- This example demonstrates the auto-test code generation features of gSOAP. An echo server is auto-generated and tested with auto-generated XML request messages and the W3C working group's databinding patterns. 1. Invoke the 'wsdl2h' tool to generate the C++ databindings: > wsdl2h -d examples.wsdl -d ensures we capture mixed content, anyType, anyAttribute. Other suggested options for databinding interoperability: -P to suppress anyType inheritance (to simplify code). -f to flatten type inheritance hierarchy, includes base members in classes. -c to generate ANSI C (but limits type inheritance). -s to remove STL dependence. typemap.dat addition to increase xsd:dateTime range (from time_t's limits): xsd__dateTime = #import "custom/struct_tm.h" | xsd__dateTime typemap.dat addition to map xsd:duration to a 64 bit long: xsd__duration = #import "custom/duration.h" | xsd__duration 2. Invoke the 'soapcpp2' tool to generate the C++ server logic and autotest: > soapcpp2 -SL -T -I../../import examples.wsdl -T to generate a test echo server. -S to generate server-side code only. -L to omit *Lib.cpp generation. This generates: soapStub.h copy of examples.h without annotations soapH.h serializers soapC.cpp serializers soapServer.cpp server operation dispatcher (RPC skeleton) soapTester.cpp echo server operation implementations (-T option) Other suggested options for databinding interoperability: -s to enforce strict validation. 3. Compile: > c++ -o autotest soapTester.cpp soapServer.cpp soapC.cpp -libgsoap++.a or compile with stdsoap2.cpp and dom.cpp: > c++ -o autotest soapTester.cpp soapServer.cpp soapC.cpp stdsoap2.cpp dom.cpp 4. Run the tests: > ./autotest < SoapBinding.echoXYZ.req.xml Note: XYZ is one of the patterns used in the databinding test suite. The autotest server can also run as a standalone application on port 8080: > ./autotest 0 8080 It will accept the test message over HTTP, e.g. using a router app. A shell script is included to test all gSOAP auto-generated XML request messages: > sh test-self.sh which generates a test-self.log with request-response messages. A shell script is included to test all W3C basic and advanced XML schema patterns with SOAP 1.1 and SOAP 1.2, respectively: > sh test-patterns11.sh > sh test-patterns12.sh which generate test-patterns11.log and test-patterns12.log with request-response messages. The faults are not filtered, so SKIPPED tests show up as faults in these log files (more details below). Corrected errors and skipped tests in databinding test suite ------------------------------------------------------------ Note: we changed in examples.wsdl to make all imported XSD files local (rather than http addresses to download). Some test patterns are "SKIPPED". These patterns are skipped due to the incomplete examples.xsd schema: 1. echoBlockDefault: SKIPPED 2. echoElementReferenceUnqualified: fixed in examples.wsdl: xmlns="http://www.w3.org/2002/ws/databinding/examples/6/09/" added 3. echoFinalDefault: SKIPPED 4. echoMinOccurs1: fixed in examples.wsdl: two value elements but maxOccurs=1, changed to 2 5. echoMixedComplexContent: requires DOM support to pass (wsdl2h option -d) and by treating all content with a DOM (thus, removing other class members). 6. echoMixedContentType: requires DOM support to pass (wsdl2h option -d) and by treating all content with a DOM (thus, removing other class members). 7. echoNoTargetNamespace: SKIPPED 8. echoQualifiedLocalAttributes: SKIPPED incomplete: 9. echoQualifiedLocalElements: SKIPPED 10. echoSOAPEncodedArray: SKIPPED 11. echoSchemaVersion: SKIPPED, because examples.xsd appears incomplete: 12. echoTargetNamespace: SKIPPED 13. echoUnqualifiedLocalAttributes: SKIPPED 14. echoUnqualifiedLocalElements: SKIPPED Fixed test patterns that did not conform to the pattern schemas: 1. echoComplexTypeAttributeExtension: fixed placement of gender attribute in test pattern databinding/examples/6/09/ComplexTypeAttributeExtension: Mary Correct: Mary 2. echoLocalElementSimpleType: fixed in test pattern examples/6/09/echoLocalElementSimpleType: gsoap-2.8.28/gsoap/samples/autotest/test-patterns11.sh0000755000175000017500000000071612653650154022242 0ustar ellertellert#!/bin/sh echo "test-patterns11.log generated " `date` > test-patterns11.log for req in databinding/examples/6/09/*/*-soap11.xml; do name=`basename $req` echo "** $name" echo "" >> test-patterns11.log echo "*** REQUEST $name ***" >> test-patterns11.log cat $req >> test-patterns11.log echo "" >> test-patterns11.log echo "*** RESPONSE ***" >> test-patterns11.log ./autotest 12288 < $req >> test-patterns11.log || echo "\n>> SKIPPED $name\n" done gsoap-2.8.28/gsoap/samples/autotest/LICENSE.txt0000644000175000017500000000051712653650154020546 0ustar ellertellert W3C copyright and document licensing: http://www.w3.org/Consortium/Legal/copyright-documents gSOAP software licensing: Copyright (C) 2001-2010 Robert van Engelen, Genivia Inc. All Rights Reserved. Part of this software is released under one of the following licenses: 1) GPL or 2) Genivia's license for commercial use. gsoap-2.8.28/gsoap/samples/autotest/Makefile.am0000644000175000017500000000303312653650154020753 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 CPPFLAGS=-I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin AM_LDFLAGS=$(CPPFLAGS) -I$(srcdir) -L$(srcdir) SOAP=$(top_srcdir)/gsoap/src/soapcpp2$(EXEEXT) WSDL=$(top_srcdir)/gsoap/wsdl/wsdl2h$(EXEEXT) WSDL_FLAGS=-d -P -t $(srcdir)/typemap.dat SOAP_FLAGS=-SL -T -I$(top_srcdir)/gsoap/import -I$(top_srcdir)/gsoap/custom WSDLINPUT=$(srcdir)/examples.wsdl SOAPHEADER=$(srcdir)/examples.h SOAP_CPP_SRC=soapC.cpp soapServer.cpp SOAP_CPP_LIB=$(top_builddir)/gsoap/libgsoap++.a $(SOAP_CPP_SRC) : $(WSDLINPUT) $(WSDL) $(WSDL_FLAGS) $(WSDLINPUT) $(SOAP) $(SOAP_FLAGS) $(SOAPHEADER) duration.cpp : ../../custom/duration.c ln -s ../../custom/duration.c duration.cpp long_time.cpp : ../../custom/long_time.c ln -s ../../custom/long_time.c long_time.cpp struct_tm.cpp : ../../custom/struct_tm.c ln -s ../../custom/struct_tm.c struct_tm.cpp struct_tm_date.cpp : ../../custom/struct_tm_date.c ln -s ../../custom/struct_tm_date.c struct_tm_date.cpp #LIBS= noinst_PROGRAMS=autotest autotest_CFLAGS=$(C_DEBUG_FLAGS) -D$(platform) autotest_CPPFLAGS=$(C_DEBUG_FLAGS) -D$(platform) autotest_CXXFLAGS=$(WSDL2H_EXTRA_FLAGS) autotest_SOURCES=$(SOAP_CPP_SRC) soapTester.cpp duration.cpp long_time.cpp struct_tm.cpp struct_tm_date.cpp autotest_LDADD=$(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) CLEANFILES= *~ *.h *.cpp *.xml *.log *.nsmap gsoap-2.8.28/gsoap/samples/rest/0000755000175000017500000000000012653650174016027 5ustar ellertellertgsoap-2.8.28/gsoap/samples/rest/calcrest.wsdl0000644000175000017500000001022712653650156020524 0ustar ellertellert gsoap-2.8.28/gsoap/samples/rest/Makefile.in0000644000175000017500000005664712653650156020116 0ustar ellertellert# Makefile.in generated by automake 1.14 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = calcrest$(EXEEXT) httpgettest$(EXEEXT) \ httpposttest$(EXEEXT) DIST_COMMON = $(srcdir)/../Makefile.defines \ $(srcdir)/../Makefile.c_rules $(srcdir)/Makefile.in \ $(srcdir)/Makefile.am $(top_srcdir)/mkinstalldirs \ $(top_srcdir)/depcomp subdir = gsoap/samples/rest ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = soapC.$(OBJEXT) am__objects_2 = soapClient.$(OBJEXT) $(am__objects_1) am__objects_3 = am__objects_4 = $(am__objects_3) am__objects_5 = $(am__objects_2) soapServer.$(OBJEXT) $(am__objects_3) \ $(am__objects_4) am_calcrest_OBJECTS = calcrest.$(OBJEXT) $(am__objects_5) calcrest_OBJECTS = $(am_calcrest_OBJECTS) calcrest_LDADD = $(LDADD) am__DEPENDENCIES_1 = calcrest_DEPENDENCIES = $(SOAP_C_LIB) $(am__DEPENDENCIES_1) am_httpgettest_OBJECTS = httpgettest.$(OBJEXT) $(am__objects_1) \ httpget.$(OBJEXT) httpgettest_OBJECTS = $(am_httpgettest_OBJECTS) httpgettest_LDADD = $(LDADD) httpgettest_DEPENDENCIES = $(SOAP_C_LIB) $(am__DEPENDENCIES_1) am__objects_6 = soapServer.$(OBJEXT) $(am__objects_1) am_httpposttest_OBJECTS = httpposttest.$(OBJEXT) $(am__objects_6) \ httppost.$(OBJEXT) httpposttest_OBJECTS = $(am_httpposttest_OBJECTS) httpposttest_LDADD = $(LDADD) httpposttest_DEPENDENCIES = $(SOAP_C_LIB) $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(calcrest_SOURCES) $(httpgettest_SOURCES) \ $(httpposttest_SOURCES) DIST_SOURCES = $(calcrest_SOURCES) $(httpgettest_SOURCES) \ $(httpposttest_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ STRIP = @STRIP@ VERSION = @VERSION@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = foreign 1.4 SOAPHEADER = calcrest.h AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a SOAP_C_SRC = $(SOAP_C_CLIENT) soapServer.c $(SOAP_H_FILES) $(SOAP_NS) LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_C_SRC) CLEANFILES = $(SOAP_C_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.c soapClient.c soapClientLib.c soapServer.c soapServerLib.c *~ SOAP_NS = $(SOAP_NS_DEF) calcrest_SOURCES = calcrest.c calcrest.h $(SOAP_C_SRC) httpgettest_SOURCES = httpgettest.c httpgettest.h $(SOAP_C_CORE) ../../plugin/httpget.c httpposttest_SOURCES = httpposttest.c httpposttest.h $(SOAP_C_SERVER) ../../plugin/httppost.c all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.c_rules $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/rest/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/rest/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.c_rules: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) calcrest$(EXEEXT): $(calcrest_OBJECTS) $(calcrest_DEPENDENCIES) $(EXTRA_calcrest_DEPENDENCIES) @rm -f calcrest$(EXEEXT) $(AM_V_CCLD)$(LINK) $(calcrest_OBJECTS) $(calcrest_LDADD) $(LIBS) httpgettest$(EXEEXT): $(httpgettest_OBJECTS) $(httpgettest_DEPENDENCIES) $(EXTRA_httpgettest_DEPENDENCIES) @rm -f httpgettest$(EXEEXT) $(AM_V_CCLD)$(LINK) $(httpgettest_OBJECTS) $(httpgettest_LDADD) $(LIBS) httpposttest$(EXEEXT): $(httpposttest_OBJECTS) $(httpposttest_DEPENDENCIES) $(EXTRA_httpposttest_DEPENDENCIES) @rm -f httpposttest$(EXEEXT) $(AM_V_CCLD)$(LINK) $(httpposttest_OBJECTS) $(httpposttest_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/calcrest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/httpget.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/httpgettest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/httppost.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/httpposttest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapC.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapClient.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapServer.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` httpget.o: ../../plugin/httpget.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT httpget.o -MD -MP -MF $(DEPDIR)/httpget.Tpo -c -o httpget.o `test -f '../../plugin/httpget.c' || echo '$(srcdir)/'`../../plugin/httpget.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/httpget.Tpo $(DEPDIR)/httpget.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/httpget.c' object='httpget.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o httpget.o `test -f '../../plugin/httpget.c' || echo '$(srcdir)/'`../../plugin/httpget.c httpget.obj: ../../plugin/httpget.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT httpget.obj -MD -MP -MF $(DEPDIR)/httpget.Tpo -c -o httpget.obj `if test -f '../../plugin/httpget.c'; then $(CYGPATH_W) '../../plugin/httpget.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/httpget.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/httpget.Tpo $(DEPDIR)/httpget.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/httpget.c' object='httpget.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o httpget.obj `if test -f '../../plugin/httpget.c'; then $(CYGPATH_W) '../../plugin/httpget.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/httpget.c'; fi` httppost.o: ../../plugin/httppost.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT httppost.o -MD -MP -MF $(DEPDIR)/httppost.Tpo -c -o httppost.o `test -f '../../plugin/httppost.c' || echo '$(srcdir)/'`../../plugin/httppost.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/httppost.Tpo $(DEPDIR)/httppost.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/httppost.c' object='httppost.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o httppost.o `test -f '../../plugin/httppost.c' || echo '$(srcdir)/'`../../plugin/httppost.c httppost.obj: ../../plugin/httppost.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT httppost.obj -MD -MP -MF $(DEPDIR)/httppost.Tpo -c -o httppost.obj `if test -f '../../plugin/httppost.c'; then $(CYGPATH_W) '../../plugin/httppost.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/httppost.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/httppost.Tpo $(DEPDIR)/httppost.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/httppost.c' object='httppost.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o httppost.obj `if test -f '../../plugin/httppost.c'; then $(CYGPATH_W) '../../plugin/httppost.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/httppost.c'; fi` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am $(SOAP_C_SRC) : $(SOAPHEADER) $(SOAP) -cL -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $(SOAPHEADER) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.28/gsoap/samples/rest/calcrest.h0000644000175000017500000006172112653650156020007 0ustar ellertellert/* calcrest.h Generated by wsdl2h 2.8.14 from calcrest.wsdl and typemap.dat 2013-05-08 02:22:07 GMT DO NOT INCLUDE THIS FILE DIRECTLY INTO YOUR PROJECT BUILDS USE THE soapcpp2-GENERATED SOURCE CODE FILES FOR YOUR PROJECT BUILDS gSOAP XML Web services tools. Copyright (C) 2000-2013 Robert van Engelen, Genivia Inc. All Rights Reserved. Part of this software is released under one of the following licenses: GPL or Genivia's license for commercial use. */ /** @page page_notes Usage Notes NOTE: - Run soapcpp2 on calcrest.h to generate the SOAP/XML processing logic. Use soapcpp2 -I to specify paths for #import To build with STL, 'stlvector.h' is imported from 'import' dir in package. Use soapcpp2 -j to generate improved proxy and server classes. - Use wsdl2h -c and -s to generate pure C code or C++ code without STL. - Use 'typemap.dat' to control namespace bindings and type mappings. It is strongly recommended to customize the names of the namespace prefixes generated by wsdl2h. To do so, modify the prefix bindings in the Namespaces section below and add the modified lines to 'typemap.dat' to rerun wsdl2h. - Use Doxygen (www.doxygen.org) on this file to generate documentation. - Use wsdl2h -R to generate REST operations. - Use wsdl2h -nname to use name as the base namespace prefix instead of 'ns'. - Use wsdl2h -Nname for service prefix and produce multiple service bindings - Use wsdl2h -d to enable DOM support for xsd:anyType. - Use wsdl2h -g to auto-generate readers and writers for root elements. - Use wsdl2h -b to auto-generate bi-directional operations (duplex ops). - Struct/class members serialized as XML attributes are annotated with a '@'. - Struct/class members that have a special role are annotated with a '$'. WARNING: DO NOT INCLUDE THIS ANNOTATED FILE DIRECTLY IN YOUR PROJECT SOURCE CODE. USE THE FILES GENERATED BY soapcpp2 FOR YOUR PROJECT'S SOURCE CODE: THE soapStub.h FILE CONTAINS THIS CONTENT WITHOUT ANNOTATIONS. LICENSE: @verbatim -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2013, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial-use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- @endverbatim */ //gsoapopt cw /******************************************************************************\ * * * Definitions * * http://websrv.cs.fsu.edu/~engelen/calc.wsdl * * * \******************************************************************************/ /******************************************************************************\ * * * Import * * * \******************************************************************************/ /******************************************************************************\ * * * Schema Namespaces * * * \******************************************************************************/ /* NOTE: It is strongly recommended to customize the names of the namespace prefixes generated by wsdl2h. To do so, modify the prefix bindings below and add the modified lines to typemap.dat to rerun wsdl2h: ns1 = "http://websrv.cs.fsu.edu/~engelen/calc.wsdl" ns2 = "urn:calc" */ #define SOAP_NAMESPACE_OF_ns2 "urn:calc" //gsoap ns2 schema namespace: urn:calc //gsoap ns2 schema form: unqualified /******************************************************************************\ * * * Built-in Schema Types and Top-Level Elements and Attributes * * * \******************************************************************************/ /******************************************************************************\ * * * Schema Types and Top-Level Elements and Attributes * * urn:calc * * * \******************************************************************************/ /******************************************************************************\ * * * Schema Complex Types and Top-Level Elements * * urn:calc * * * \******************************************************************************/ /// "urn:calc":pair is a complexType. struct ns2__pair { /// Element a of type xs:double. double a 1; ///< Required element. /// Element b of type xs:double. double b 1; ///< Required element. }; /******************************************************************************\ * * * Additional Top-Level Elements * * urn:calc * * * \******************************************************************************/ /// Top-level root element "urn:calc":add of type "urn:calc":pair. /// Note: use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// Top-level root element "urn:calc":sub of type "urn:calc":pair. /// Note: use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// Top-level root element "urn:calc":mul of type "urn:calc":pair. /// Note: use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// Top-level root element "urn:calc":div of type "urn:calc":pair. /// Note: use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// Top-level root element "urn:calc":pow of type "urn:calc":pair. /// Note: use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// Top-level root element "urn:calc":addResponse of type xs:double. /// Note: use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// Top-level root element "urn:calc":subResponse of type xs:double. /// Note: use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// Top-level root element "urn:calc":mulResponse of type xs:double. /// Note: use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// Top-level root element "urn:calc":divResponse of type xs:double. /// Note: use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// Top-level root element "urn:calc":powResponse of type xs:double. /// Note: use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /******************************************************************************\ * * * Additional Top-Level Attributes * * urn:calc * * * \******************************************************************************/ /******************************************************************************\ * * * Services * * * \******************************************************************************/ //gsoap ns1 service name: calcPOST //gsoap ns1 service type: calcPortType //gsoap ns1 service port: http://websrv.cs.fsu.edu/~engelen/calcserver.cgi //gsoap ns1 service namespace: http://websrv.cs.fsu.edu/~engelen/calc.wsdl /** @mainpage calcPOST Definitions @section calcPOST_bindings Service Bindings - @ref calcPOST @section calcPOST_more More Information - @ref page_notes "Usage Notes" - @ref page_XMLDataBinding "XML Data Binding" - @ref SOAP_ENV__Header "SOAP Header Content" (when applicable) - @ref SOAP_ENV__Detail "SOAP Fault Detail Content" (when applicable) */ /** @page calcPOST Binding "calcPOST" @section calcPOST_operations Operations of Binding "calcPOST" - @ref __ns1__add - @ref __ns1__sub - @ref __ns1__mul - @ref __ns1__div - @ref __ns1__pow @section calcPOST_ports Endpoints of Binding "calcPOST" - http://websrv.cs.fsu.edu/~engelen/calcserver.cgi Note: use wsdl2h option -Nname to change the service binding prefix name */ /******************************************************************************\ * * * Service Binding * * calcPOST * * * \******************************************************************************/ /******************************************************************************\ * * * Service Operation * * __ns1__add * * * \******************************************************************************/ /// Operation "__ns1__add" of service binding "calcPOST" /** Operation details: - POST document/literal style messaging - Addressing input action: "" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___ns1__add( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: struct ns2__pair* ns2__add, // output parameters: double *ns2__addResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __ns1__add( struct soap *soap, // input parameters: struct ns2__pair* ns2__add, // output parameters: double *ns2__addResponse ); @endcode */ //gsoap ns1 service method-protocol: add POST //gsoap ns1 service method-style: add document //gsoap ns1 service method-encoding: add literal //gsoap ns1 service method-action: add "" int __ns1__add( struct ns2__pair* ns2__add, ///< Input parameter double *ns2__addResponse ///< Output parameter ); /******************************************************************************\ * * * Service Operation * * __ns1__sub * * * \******************************************************************************/ /// Operation "__ns1__sub" of service binding "calcPOST" /** Operation details: - POST document/literal style messaging - Addressing input action: "" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___ns1__sub( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: struct ns2__pair* ns2__sub, // output parameters: double *ns2__subResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __ns1__sub( struct soap *soap, // input parameters: struct ns2__pair* ns2__sub, // output parameters: double *ns2__subResponse ); @endcode */ //gsoap ns1 service method-protocol: sub POST //gsoap ns1 service method-style: sub document //gsoap ns1 service method-encoding: sub literal //gsoap ns1 service method-action: sub "" int __ns1__sub( struct ns2__pair* ns2__sub, ///< Input parameter double *ns2__subResponse ///< Output parameter ); /******************************************************************************\ * * * Service Operation * * __ns1__mul * * * \******************************************************************************/ /// Operation "__ns1__mul" of service binding "calcPOST" /** Operation details: - POST document/literal style messaging - Addressing input action: "" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___ns1__mul( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: struct ns2__pair* ns2__mul, // output parameters: double *ns2__mulResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __ns1__mul( struct soap *soap, // input parameters: struct ns2__pair* ns2__mul, // output parameters: double *ns2__mulResponse ); @endcode */ //gsoap ns1 service method-protocol: mul POST //gsoap ns1 service method-style: mul document //gsoap ns1 service method-encoding: mul literal //gsoap ns1 service method-action: mul "" int __ns1__mul( struct ns2__pair* ns2__mul, ///< Input parameter double *ns2__mulResponse ///< Output parameter ); /******************************************************************************\ * * * Service Operation * * __ns1__div * * * \******************************************************************************/ /// Operation "__ns1__div" of service binding "calcPOST" /** Operation details: - POST document/literal style messaging - Addressing input action: "" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___ns1__div( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: struct ns2__pair* ns2__div, // output parameters: double *ns2__divResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __ns1__div( struct soap *soap, // input parameters: struct ns2__pair* ns2__div, // output parameters: double *ns2__divResponse ); @endcode */ //gsoap ns1 service method-protocol: div POST //gsoap ns1 service method-style: div document //gsoap ns1 service method-encoding: div literal //gsoap ns1 service method-action: div "" int __ns1__div( struct ns2__pair* ns2__div, ///< Input parameter double *ns2__divResponse ///< Output parameter ); /******************************************************************************\ * * * Service Operation * * __ns1__pow * * * \******************************************************************************/ /// Operation "__ns1__pow" of service binding "calcPOST" /** Operation details: - POST document/literal style messaging - Addressing input action: "" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___ns1__pow( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: struct ns2__pair* ns2__pow, // output parameters: double *ns2__powResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __ns1__pow( struct soap *soap, // input parameters: struct ns2__pair* ns2__pow, // output parameters: double *ns2__powResponse ); @endcode */ //gsoap ns1 service method-protocol: pow POST //gsoap ns1 service method-style: pow document //gsoap ns1 service method-encoding: pow literal //gsoap ns1 service method-action: pow "" int __ns1__pow( struct ns2__pair* ns2__pow, ///< Input parameter double *ns2__powResponse ///< Output parameter ); /** @page calcPOST Binding "calcPOST" @section calcPOST_policy_enablers Policy Enablers of Binding "calcPOST" Based on policies, this service imports - WS-Policy reminders and enablers: - WS-Addressing 1.0 (2005/08, accepts 2004/08): @code #import "wsa5.h" // to be added to this header file for the soapcpp2 build step @endcode @code #include "plugin/wsaapi.h" soap_register_plugin(soap, soap_wsa); // register the wsa plugin in your code // See the user guide gsoap/doc/wsa/html/index.html @endcode - WS-Addressing (2004/08): @code #import "wsa.h" // to be added to this header file for the soapcpp2 build step @endcode @code #include "plugin/wsaapi.h" soap_register_plugin(soap, soap_wsa); // register the wsa plugin in your code // See the user guide gsoap/doc/wsa/html/index.html @endcode - WS-ReliableMessaging 1.0: @code #import "wsrm5.h" // to be added to this header file for the soapcpp2 build step @endcode @code #include "plugin/wsrmapi.h" soap_register_plugin(soap, soap_wsa); // register the wsa plugin in your code soap_register_plugin(soap, soap_wsrm); // register the wsrm plugin in your code // See the user guide gsoap/doc/wsrm/html/index.html @endcode - WS-ReliableMessaging 1.1: @code #import "wsrm.h" // to be added to this header file for the soapcpp2 build step @endcode @code #include "plugin/wsrmapi.h" soap_register_plugin(soap, soap_wsa); // register the wsa plugin in your code soap_register_plugin(soap, soap_wsrm); // register the wsrm plugin in your code // See the user guide gsoap/doc/wsrm/html/index.html @endcode - WS-Security (SOAP Message Security) 1.0 (accepts 1.1): @code #import "wsse.h" // to be added to this header file for the soapcpp2 build step @endcode @code #include "plugin/wsseapi.h" soap_register_plugin(soap, soap_wsse); // register the wsse plugin in your code // See the user guide gsoap/doc/wsse/html/index.html @endcode - WS-Security (SOAP Message Security) 1.1 (accepts 1.0): @code #import "wsse11.h" // to be added to this header file for the soapcpp2 build step @endcode @code #include "plugin/wsseapi.h" soap_register_plugin(soap, soap_wsse); // register the wsse plugin in your code // See the user guide gsoap/doc/wsse/html/index.html @endcode - HTTP Digest Authentication: @code #include "plugin/httpda.h" soap_register_plugin(soap, soap_http_da); // register the HTTP DA plugin in your code // See the user guide gsoap/doc/httpda/html/index.html @endcode */ /******************************************************************************\ * * * XML Data Binding * * * \******************************************************************************/ /** @page page_XMLDataBinding XML Data Binding SOAP/XML services use data bindings contractually bound by WSDL and auto- generated by wsdl2h and soapcpp2 (see Service Bindings). Plain data bindings are adopted from XML schemas as part of the WSDL types section or when running wsdl2h on a set of schemas to produce non-SOAP-based XML data bindings. The following readers and writers are C/C++ data type (de)serializers auto- generated by wsdl2h and soapcpp2. Run soapcpp2 on this file to generate the (de)serialization code, which is stored in soapC.c[pp]. Include "soapH.h" in your code to import these data type and function declarations. Only use the soapcpp2-generated files in your project build. Do not include the wsdl2h- generated .h file in your code. Data can be read in XML and deserialized from: - a file descriptor, using soap->recvfd = fd - a socket, using soap->socket = ... - a C++ stream, using soap->is = ... - a buffer, using the soap->frecv() callback Data can be serialized in XML and written to: - a file descriptor, using soap->sendfd = fd - a socket, using soap->socket = ... - a C++ stream, using soap->os = ... - a buffer, using the soap->fsend() callback The following options are available for (de)serialization control: - soap->encodingStyle = NULL; to remove SOAP 1.1/1.2 encodingStyle - soap_mode(soap, SOAP_XML_TREE); XML without id-ref (no cycles!) - soap_mode(soap, SOAP_XML_GRAPH); XML with id-ref (including cycles) - soap_set_namespaces(soap, struct Namespace *nsmap); to set xmlns bindings @section ns2 Top-level root elements of schema "urn:calc" - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) */ /* End of calcrest.h */ gsoap-2.8.28/gsoap/samples/rest/httpposttest.c0000644000175000017500000001550612653650156020767 0ustar ellertellert/* httpposttest.c gSOAP HTTP POST plugin client and server example application. gSOAP XML Web services tools Copyright (C) 2000-2009, Robert van Engelen, Genivia, Inc., All Rights Reserved. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2009, Robert van Engelen, Genivia, Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- Compile: soapcpp2 -S -c httpposttest.h cc -Iplugin -o httpposttest httpposttest.c soapC.c soapServer.c httppost.c stdsoap2.c To support https and compression, compile with: cc -DWITH_OPENSSL -DWITH_GZIP -Iplugin -o httpposttest httpposttest.c soapC.c soapServer.c httppost.c stdsoap2.c -lssl -lcrypto -lz */ #include "soapH.h" #include "httppost.h" int jpg_post_handler(struct soap *soap); int image_post_handler(struct soap *soap); int text_post_handler(struct soap *soap); int generic_POST_handler(struct soap *soap); int generic_PUT_handler(struct soap *soap); int generic_DELETE_handler(struct soap *soap); int main(int argc, char **argv) { char *buf; size_t len; struct soap soap; soap_init(&soap); /* chunking conserves memory and is generally faster: */ soap_set_omode(&soap, SOAP_IO_CHUNK); if (argc < 2) { /* CGI server */ struct http_post_handlers handlers[] = { { "image/jpg", jpg_post_handler }, { "image/*", image_post_handler }, { "image/*;*", image_post_handler }, { "text/*", text_post_handler }, { "text/*;*", text_post_handler }, { "POST", generic_POST_handler }, { "PUT", generic_PUT_handler }, { "DELETE", generic_DELETE_handler }, { NULL } }; soap_register_plugin_arg(&soap, http_post, handlers); /* register plugin (server only) */ soap_serve(&soap); exit(0); } /* HTTP POST client */ if (soap_post_connect(&soap, argv[1], NULL, "text/html") || soap_send(&soap, "") || soap_send(&soap, argc == 2 ? "Hello" : argv[2]) || soap_send(&soap, "") || soap_end_send(&soap)) { soap_print_fault(&soap, stderr); exit(1); } /* after sending POST content, receive body (note: POST handlers should not be set for client) */ if (soap_begin_recv(&soap) || soap_http_body(&soap, &buf, &len) || soap_end_recv(&soap)) { soap_print_fault(&soap, stderr); exit(1); } soap_closesock(&soap); /* close only when not keep-alive */ printf("Received %lu bytes of type %s:\n", (unsigned long)len, soap.http_content?soap.http_content:""); soap_end(&soap); soap_done(&soap); return 0; } /* Calculator service operations */ int __ns1__add(struct soap *soap, struct ns2__pair *in, double *out) { *out = in->a + in->b; return SOAP_OK; } int __ns1__sub(struct soap *soap, struct ns2__pair *in, double *out) { *out = in->a - in->b; return SOAP_OK; } int __ns1__mul(struct soap *soap, struct ns2__pair *in, double *out) { *out = in->a * in->b; return SOAP_OK; } int __ns1__div(struct soap *soap, struct ns2__pair *in, double *out) { *out = in->a / in->b; return SOAP_OK; } int __ns1__pow(struct soap *soap, struct ns2__pair *in, double *out) { *out = pow(in->a, in->b); return SOAP_OK; } /* the jpg handler just responds with HTTP OK */ int jpg_post_handler(struct soap *soap) { char *buf; size_t len; soap_http_body(soap, &buf, &len); soap_response(soap, SOAP_OK); soap_end_send(soap); return SOAP_OK; } /* the image handler responds with HTTP OK and a text/html body */ int image_post_handler(struct soap *soap) { char *buf; size_t len; soap_http_body(soap, &buf, &len); soap_response(soap, SOAP_HTML); soap_send(soap, "Image received"); soap_end_send(soap); return SOAP_OK; } /* the text handler copies the message back */ int text_post_handler(struct soap *soap) { char *buf; size_t len; soap_http_body(soap, &buf, &len); /* use current soap->http_content from HTTP header as return HTTP type */ soap_response(soap, SOAP_FILE); soap_send_raw(soap, buf, len); soap_end_send(soap); return SOAP_OK; } /* the generic POST handler */ int generic_POST_handler(struct soap *soap) { char *buf; size_t len; soap_http_body(soap, &buf, &len); fprintf(stderr, "Generic POST accepted URL=\"%s\" content=\"%s\"\n", soap->endpoint, soap->http_content); soap_response(soap, SOAP_HTML); soap_send(soap, "Data received"); soap_end_send(soap); return SOAP_OK; } /* the generic PUT handler */ int generic_PUT_handler(struct soap *soap) { char *buf; size_t len; soap_http_body(soap, &buf, &len); fprintf(stderr, "Generic PUT accepted URL=\"%s\" content=\"%s\"\n", soap->endpoint, soap->http_content); return soap_send_empty_response(soap, 202); /* HTTP Accepted */ } /* the generic DELETE handler */ int generic_DELETE_handler(struct soap *soap) { fprintf(stderr, "Generic DELETE accepted URL=\"%s\"\n", soap->endpoint); return soap_send_empty_response(soap, 202); /* HTTP Accepted */ } SOAP_NMAC struct Namespace namespaces[] = { {"SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/", "http://www.w3.org/*/soap-envelope", NULL}, {"SOAP-ENC", "http://schemas.xmlsoap.org/soap/encoding/", "http://www.w3.org/*/soap-encoding", NULL}, {"xsi", "http://www.w3.org/2001/XMLSchema-instance", "http://www.w3.org/*/XMLSchema-instance", NULL}, {"xsd", "http://www.w3.org/2001/XMLSchema", "http://www.w3.org/*/XMLSchema", NULL}, {NULL, NULL, NULL, NULL} }; gsoap-2.8.28/gsoap/samples/rest/calcrest.c0000644000175000017500000000657212653650156020005 0ustar ellertellert/* calcrest.c Example REST calculator service client in C Compilation in C (see samples/calc/calc.h): $ wsdl2h -R -c calcrest.wsdl $ soapcpp2 calcrest.h $ cc -o calcrest calcrest.c stdsoap2.c soapC.c soapClient.c where stdsoap2.c is in the 'gsoap' directory, or use libgsoap: $ cc -o calcrest calcrest.c soapC.c soapClient.c -lgsoap -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2013, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" #include "calcPOST.nsmap" const char server[] = "http://websrv.cs.fsu.edu/~engelen/calcrest.cgi"; /* "http://"; */ /* to test with stdin/out */ int main(int argc, char **argv) { struct soap soap; struct ns2__pair in; double out; soap_init1(&soap, SOAP_XML_INDENT); if (argc < 4) return soap_serve(&soap); /* simple CGI server over stdin/out */ in.a = strtod(argv[2], NULL); in.b = strtod(argv[3], NULL); switch (*argv[1]) { case 'a': soap_call___ns1__add(&soap, server, "", &in, &out); break; case 's': soap_call___ns1__sub(&soap, server, "", &in, &out); break; case 'm': soap_call___ns1__mul(&soap, server, "", &in, &out); break; case 'd': soap_call___ns1__div(&soap, server, "", &in, &out); break; case 'p': soap_call___ns1__pow(&soap, server, "", &in, &out); break; default: fprintf(stderr, "Unknown command\n"); exit(0); } if (soap.error) { soap_print_fault(&soap, stderr); exit(1); } else printf("result = %g\n", out); soap_destroy(&soap); soap_end(&soap); soap_done(&soap); return 0; } int __ns1__add(struct soap *soap, struct ns2__pair *in, double *out) { *out = in->a + in->b; return SOAP_OK; } int __ns1__sub(struct soap *soap, struct ns2__pair *in, double *out) { *out = in->a - in->b; return SOAP_OK; } int __ns1__mul(struct soap *soap, struct ns2__pair *in, double *out) { *out = in->a * in->b; return SOAP_OK; } int __ns1__div(struct soap *soap, struct ns2__pair *in, double *out) { *out = in->a / in->b; return SOAP_OK; } int __ns1__pow(struct soap *soap, struct ns2__pair *in, double *out) { *out = pow(in->a, in->b); return SOAP_OK; } gsoap-2.8.28/gsoap/samples/rest/httpgettest.c0000644000175000017500000000602212653650156020552 0ustar ellertellert/* httpgettest.c gSOAP HTTP GET plugin client example application. For server example usage of the HTTP GET plugin, see samples/webserver gSOAP XML Web services tools Copyright (C) 2000-2006, Robert van Engelen, Genivia, Inc., All Rights Reserved. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2004, Robert van Engelen, Genivia, Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- Compile: soapcpp2 -CS -c httpgettest.h cc -DWITH_NONAMESPACES -Iplugin -o httpgettest httpgettest.c soapC.c soapClient.c httpget.c stdsoap2.c To support https and compression, compile with: cc -DWITH_NONAMESPACES -DWITH_OPENSSL -DWITH_GZIP -Iplugin -o httpgettest httpgettest.c soapC.c httpget.c stdsoap2.c -lssl -lcrypto -lz */ #include "soapH.h" #include "httpget.h" int main(int argc, char **argv) { struct soap soap; char *body; if (argc < 2) { fprintf(stderr, "Usage: httpgettest URL\n"); exit(0); } soap_init(&soap); soap_register_plugin(&soap, http_get); /* register plugin */ if (soap_get_connect(&soap, argv[1], NULL) || soap_begin_recv(&soap)) { soap_print_fault(&soap, stderr); exit(1); } if (soap.http_content) printf("HTTP Content Type: %s\n", soap.http_content); body = soap_get_http_body(&soap, NULL); soap_end_recv(&soap); if (body) printf("HTTP Body:\n%s\n", body); soap_end(&soap); soap_done(&soap); return 0; } SOAP_NMAC struct Namespace namespaces[] = { {NULL, NULL, NULL, NULL} }; gsoap-2.8.28/gsoap/samples/rest/README.txt0000644000175000017500000002064312653650156017532 0ustar ellertellert HTTP REST Examples for gSOAP ============================ calcrest.wsdl WSDL with REST calc operations calcrest.c REST-based calculator client and CGI server in C httpgettest.h demonstrates HTTP GET hook httpgettest.c httpposttest.h demonstrates HTTP POST/PUT/DELETE hooks httpposttest.c REST-Based Calculator ===================== Build steps: $ wsdl2h -R -c calcrest.wsdl $ soapcpp2 -0 -L calcrest.h $ cc -o calcrest calcrest.c soapC.c soapClient.c soapServer.c stdsoap2.c Example run: $ ./calcrest add 1 2 HTTP REST Hooks =============== 1. HTTP REST via hooks: server-side hooks are provided with the gSOAP engine: soap::fget(struct soap*) HTTP GET soap::fput(struct soap*) HTTP PUT soap::fdel(struct soap*) HTTP DELETE soap::fopt(struct soap*) HTTP OPTIONS soap::fhead(struct soap*) HTTP HEAD The function being invoked uses the soap.endpoint string to parse the URL. The hook should return SOAP_OK or HTTP error code. 2. HTTP REST via plugins: plugins are available for enhanced support for HTTP REST GET and POST/PUT/DELETE. See below. 3. In addition, XML can be serialized and deserialized over sockets, file FD, and C++ streams. See also the wsdl2h tool output .h file section "XML Data Binding" with readers/writers API calls for the XML root elements of a schema. REST support is provided by the following plugins (plugin directory): httpget.h HTTP GET httpget.c httppost.h HTTP POST/PUT/DELETE httppost.c httpform.h HTTP POST application/x-www-form-urlencoded httpform.c httpda.h HTTP Digest authentication (default is basic authentication) httpda.c httpmd5.h HTTP MD5 checksum httpmd5.c threads.h portable threads threads.c See also the gSOAP documentation: Section "RESTful Interface: The HTTP GET Plug-in" Section "RESTful Interface: The HTTP POST Plug-in" The web server example implements GET, POST, and HTML form operations: samples/webserver XML-RPC and JSON examples with HTTP POST: samples/xml-rpc-json HTTP GET Hooks ============== The HTTP GET plug-in allows your server to handle RESTful HTTP GET requests and at the same time still serve SOAP-based POST requests. The plug-in provides support to client applications to issue HTTP GET operations to a server. Example Client with the GET Hook -------------------------------- To get the HTTP body as a string: #include "plugin/httpget.h" // also compile and link httpget.c ... char *body = NULL; struct soap *soap = soap_new(); soap_register_plugin(soap, http_get); ... if (soap_get_connect(soap, endpoint, NULL) || soap_begin_recv(soap) || !(body = soap_get_http_body(soap)) || soap_end_recv(soap)) ... // error soap_destroy(soap); soap_end(soap); soap_free(soap); To get an XML document and deserialize it using a "reader" generated by wsdl2h and soapcpp2 from an XML schema, say with as a root element represented by the struct ns__root (or class ns__root in C++): #include "plugin/httpget.h" // also compile and link httpget.c ... struct ns__root root; struct soap *soap = soap_new(); soap_register_plugin(soap, http_get); ... soap_default_ns__root(soap, &root); if (soap_get_connect(soap, endpoint, NULL) || soap_read_ns__root(soap, &root)) ... // error soap_destroy(soap); soap_end(soap); soap_free(soap); To get a JSON response and convert to C++ (see samples/xml-rpc-json): #include "plugin/httpget.h" // also compile and link httpget.c #include "json.h" // also compile and link json.cpp ... struct soap *soap = soap_new(); soap_register_plugin(soap, http_get); value val(soap); ... if (soap_get_connect(soap, endpoint, NULL) || soap_begin_recv(soap) || json_recv(soap, val) || soap_end_recv(soap)) ... // error soap_destroy(soap); soap_end(soap); soap_free(soap); Note: after the call to soap_begin_recv(soap) the soap->http_content string contains the HTTP ContentType header, which can be used to determine the HTTP body content information. Note: if binary data is to be received in a buffer, rather than a string, use: soap_http_body(soap, &buf, &len) which is available in httppost.h and httppost.c Example Server with the GET Hook -------------------------------- To extend a SOAP server with GET capability (see also samples/webserver): #include "plugin/httpget.h" // also compile and link httpget.c ... ... // run server ... int my_http_get_handler(struct soap *soap) { // use soap_tag_cmp() for pattern matching: if (!soap_tag_cmp(soap->path, "*.html")) { soap->http_content = "text/html"; soap_response(soap, SOAP_FILE); soap_send(soap, myhtml); soap_end_send(soap); return SOAP_OK; } if (!soap_tag_cmp(soap->path, "*.xml")) { struct ns__root root; ... // populate root XML element soap->http_content = "text/xml"; soap_response(soap, SOAP_FILE); soap_put_ns__root(soap, root, NULL, NULL); soap_end_send(soap); return SOAP_OK; } return 404; // HTTP Not Found } ... struct soap *soap = soap_new(); soap_register_plugin_arg(soap, http_get, my_http_get_handler); To return JSON content, use: #include "json.h" // also compile and link json.cpp ... int my_http_get_handler(struct soap *soap) { ... if (!soap_tag_cmp(soap->path, "*.json")) { value val(soap); ... // populate root XML element soap->http_content = "application/json"; soap_response(soap, SOAP_FILE); json_send(soap, val); soap_end_send(soap); return SOAP_OK; } HTTP POST Hooks =============== The HTTP POST plug-in allows your server to handle RESTful HTTP POST requests and at the same time still serve SOAP-based POST requests. The plug-in also provides support for client applications to issue HTTP POST operations to a server. Example Clients with the POST Hook ---------------------------------- To send and receive data over HTTP POST, say HTML content: #include "plugin/httppost.h" // also compile and link plugin/httppost.c ... struct soap *soap = soap_new(); char *buf; size_t len; if (soap_post_connect(soap, endpoint, NULL, "text/html") || soap_send(soap, myhtml) || soap_end_send(soap)) ... // error if (soap_begin_recv(soap) || soap_http_body(soap, &buf, &len) || soap_end_recv(soap)) ... // error ... // use data in buf[0..len-1] soap_destroy(soap); soap_end(soap); soap_free(soap); To send and receive JSON over HTTP (see samples/xml-rpc-json): #include "plugin/httppost.h" // also compile and link plugin/httppost.c #include "json.h" // also compile and link json.cpp ... soap *ctx = soap_new(); value request(ctx); // now populate the 'request' data to send ... if (soap_post_connect(ctx, endpoint, NULL, "application/json") || json_send(ctx, request) || soap_end_send(ctx)) ... // error value response(ctx); if (soap_begin_recv(ctx) || json_recv(ctx, response) || soap_end_recv(ctx)) ... // error // use the 'response' data response ... // dealloc objects and temp data soap_destroy(ctx); soap_end(ctx); // make other calls etc. ... // dealloc context soap_free(ctx); Example Server with the POST Hook --------------------------------- At the server side you need to register the plugin with handlers for MIME types: #include "plugin/httppost.h" // also compile and link plugin/httppost.c ... struct http_post_handlers handlers[] = { { "image/jpg", jpg_handler }, { "image/*", image_handler }, { "image/*;*", image_handler }, { "text/*", text_handler }, { "text/*;*", text_handler }, { NULL } }; struct soap *soap = soap_new(); soap_register_plugin_arg(&soap, http_post, handlers); ... int jpg_handler(struct soap *soap) { char *buf; size_t len; soap_http_body(soap, &buf, &len); soap_response(soap, SOAP_OK); soap_end_send(soap); return SOAP_OK; } int image_handler(struct soap *soap) { char *buf; size_t len; soap_http_body(soap, &buf, &len); soap_response(soap, SOAP_HTML); soap_send(soap, "Image received"); soap_end_send(soap); return SOAP_OK; } int text_handler(struct soap *soap) { char *buf; size_t len; soap_http_body(soap, &buf, &len); // use current soap->http_content from HTTP header as return HTTP type: soap_response(soap, SOAP_FILE); soap_send_raw(soap, buf, len); soap_end_send(soap); return SOAP_OK; } gsoap-2.8.28/gsoap/samples/rest/Makefile.am0000644000175000017500000000115712653650156020067 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = foreign 1.4 noinst_PROGRAMS = calcrest httpgettest httpposttest SOAPHEADER = calcrest.h include ../Makefile.defines include ../Makefile.c_rules SOAP_NS = $(SOAP_NS_DEF) calcrest_SOURCES = calcrest.c calcrest.h $(SOAP_C_SRC) httpgettest_SOURCES = httpgettest.c httpgettest.h $(SOAP_C_CORE) ../../plugin/httpget.c httpposttest_SOURCES = httpposttest.c httpposttest.h $(SOAP_C_SERVER) ../../plugin/httppost.c gsoap-2.8.28/gsoap/samples/rest/httpposttest.h0000644000175000017500000000440312653650156020766 0ustar ellertellert/* httpposttest.h gSOAP HTTP POST plugin example application. gSOAP XML Web services tools Copyright (C) 2000-2009, Robert van Engelen, Genivia, Inc., All Rights Reserved. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2004, Robert van Engelen, Genivia, Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- Compile: soapcpp2 -c httpposttest.h cc -o httpposttest httpposttest.c soapC.c soapServer.c httppost.c stdsoap2.c To support https and compression, compile with: cc -DWITH_OPENSSL -DWITH_GZIP -o httpposttest httpposttest.c soapC.c soapServer.c httppost.c stdsoap2.c -lssl -lcrypto -lz */ // Implements the REST calculator service #import "calcrest.h" gsoap-2.8.28/gsoap/samples/rest/httpgettest.h0000644000175000017500000000437212653650156020565 0ustar ellertellert/* httpgettest.h gSOAP HTTP GET plugin example application. gSOAP XML Web services tools Copyright (C) 2000-2006, Robert van Engelen, Genivia, Inc., All Rights Reserved. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2004, Robert van Engelen, Genivia, Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- Compile: soapcpp2 -c httpgettest.h cc -o httpgettest httpgettest.c soapC.c soapClient.c httpget.c stdsoap2.c To support https and compression, compile with: cc -DWITH_OPENSSL -DWITH_GZIP -o httpgettest httpgettest.c soapC.c soapClient.c httpget.c stdsoap2.c -lssl -lcrypto -lz */ // Intentionally left blank: there are no SOAP methods supported gsoap-2.8.28/gsoap/samples/databinding/0000755000175000017500000000000012653650162017313 5ustar ellertellertgsoap-2.8.28/gsoap/samples/databinding/README.md0000644000175000017500000054312212653650154020602 0ustar ellertellert XML Data Bindings {#mainpage} ================= [TOC] Introduction {#intro} ============ This is a detailed overview of the gSOAP XML data bindings concepts and implementation. At the end of this document two examples are given to illustrate the application of data bindings. The first simple example `address.cpp` shows how to use wsdl2h to bind an XML schema to C++. The C++ application reads and writes an XML file into and from a C++ "address book" data structure. The C++ data structure is an STL vector of address objects. The second example `graph.cpp` shows how XML is serialized as a tree, digraph, and cyclic graph. The digraph and cyclic graph serialization rules are similar to SOAP 1.1/1.2 encoded multi-ref elements with id-ref attributes to link elements through IDREF XML references, creating a an XML graph with pointers to XML nodes. These examples demonstrate XML data bindings only for relatively simple data structures and types. The gSOAP tools support more than just these type of structures, which we will explain in the next sections. Support for XML schema components is practically unlimited. The wsdl2h tool maps schemas to C and C++ using built-in intuitive mapping rules, while allowing the mappings to be customized using a `typemap.dat` file with mapping instructions for wsdl2h. The information in this document is applicable to gSOAP 2.8.26 and higher, which supports C++11 features. However, C++11 is not required to use this material and follow the example, unless we need smart pointers and scoped enumerations. While most of the examples in this document are given in C++, the concepts also apply to C with the exception of containers, smart pointers, classes and their methods. None of these exceptions limit the use of the gSOAP tools for C in any way. The data binding concepts described in this document were first envisioned in 1999 by Prof. van Engelen at the Florida State University. An implementation was created in 2000, named "stub/skeleton compiler". The first articles on its successor version "gSOAP" appeared in 2002. The principle of mapping XSD components to C/C++ types and vice versa is now widely adopted in systems and programming languages, including Java web services and by C# WCF. Mapping WSDL and XML schemas to C/C++ {#tocpp} ===================================== To convert WSDL and XML schemas (XSD files) to code, we first use the wsdl2h command to generate the data binding interface code that is saved to a special gSOAP header file: wsdl2h [options] -o file.h ... XSD and WSDL files ... This command converts WSDL and XSD files to C++ (or pure C with wsdl2h option `-c`) and saves a data binding interface file `file.h` that uses familar C/C++ syntax extended with `gsoap` directives and includes notational conventions to declare C/C++ types and functions that are associated with these bindings. The WSDL 1.1/2.0, SOAP 1.1/1.2, and XSD 1.0/1.1 standards are supported by the gSOAP tools. In addition, the most popular WS specifications are also supported, including WS-Addressing, WS-ReliableMessaging, WS-Discovery, WS-Security, WS-Policy, WS-SecurityPolicy, and WS-SecureConversation. This document focusses on XML data bindings and mapping C/C++ to XML 1.0/1.1 and XSD 1.0/1.1. This covers all of the following standard XSD components with their optional attributes and properties: | XSD Component | Attributes and Properties | | -------------- | ------------------------------------------------------------------------------------------------------------------- | | schema | targetNamespace, version, elementFormDefault, attributeFormDefault, defaultAttributes | | attribute | name, ref, type, use, default, fixed, form, targetNamespace, wsdl:arrayType | | element | name, ref, type, default, fixed, form, nillable, abstract, substitutionGroup, minOccurs, maxOccurs, targetNamespace | | simpleType | name | | complexType | name, abstract, mixed, defaultAttributesApply | | all | | | choice | minOccurs, maxOccurs | | sequence | minOccurs, maxOccurs | | group | name, ref, minOccurs, maxOccurs | | attributeGroup | name, ref | | any | minOccurs, maxOccurs | | anyAttribute | | And also the following standard XSD directives are covered: | Directive | Description | | ---------- | ---------------------------------------------------------- | | import | Imports a schema into the importing schema for referencing | | include | Include schema component definitions into a schema | | override | Override by replacing schema component definitions | | redefine | Extend or restrict schema component definitions | | annotation | Annotates a component | The XSD facets and their mappings to C/C++ are: | XSD Facet | Maps to | | -------------- | ------------------------------------------------------------------------------------------- | | enumeration | `enum` | | simpleContent | class/struct wrapper with `__item` member | | complexContent | class/struct | | list | `enum*` bitmask (`enum*` enumerates up to 64 bit masks) | | extension | class/struct inheritance/extension | | restriction | `typedef` and class/struct inheritance/redeclaration | | length | `typedef` with restricted content length annotation | | minLength | `typedef` with restricted content length annotation | | maxLength | `typedef` with restricted content length annotation | | minInclusive | `typedef` with restrict numerical value range annotation | | maxInclusive | `typedef` with restrict numerical value range annotation | | minExclusive | `typedef` with restrict numerical value range annotation | | maxExclusive | `typedef` with restrict numerical value range annotation | | precision | `typedef` with pattern annotation (pattern used for output, but input is not validated) | | scale | `typedef` with pattern annotation (pattern used for output, but input is not validated) | | totalDigits | `typedef` with pattern annotation (pattern used for output, but input is not validated) | | fractionDigits | `typedef` with pattern annotation (pattern used for output, but input is not validated) | | pattern | `typedef` with pattern annotation (define `soap::fsvalidate` callback to validate patterns) | | union | string with union of values All primitive XSD types are supported, including but not limited to the following XSD types: | XSD Type | Maps to | | ---------------- | --------------------------------------------------------------------------------- | | any/anyType | `_XML` string with literal XML content (or enable DOM with wsdl2h option `-d`) | | anyURI | string (i.e. `char*`, `wchar_t*`, `std::string`, `std::wstring`) | | string | string (i.e. `char*`, `wchar_t*`, `std::string`, `std::wstring`) | | boolean | `bool` (C++) or `enum xsd__boolean` (C) | | byte | `char` (i.e. `int8_t`) | | short | `short` (i.e. `int16_t`) | | int | `int` (i.e. `int32_t`) | | long | `LONG64` (i.e. `long long` and `int64_t`) | | unsignedByte | `unsigned char` (i.e. `uint8_t`) | | unsignedShort | `unsigned short` (i.e. `uint16_t`) | | unsignedInt | `unsigned int` (i.e. `uint32_t`) | | unsignedLong | `ULONG64` (i.e. `unsigned long long` and `uint64_t`) | | float | `float` | | double | `double` | | integer | string or `#import "custom/int128.h"` to use 128 bit `xsd__integer` | | decimal | string or `#import "custom/long_double.h"` to use `long double` | | precisionDecimal | string | | duration | string or `#import "custom/duration.h"` to use 64 bit `xsd__duration` | | dateTime | `time_t` or `#import "custom/struct_tm.h"` to use `struct tm` for `xsd__dateTime` | | time | string or `#import "custom/long_time.h"` to use 64 bit `xsd__time` | | date | string or `#import "custom/struct_tm_date.h"` to use `struct tm` for `xsd__date` | | hexBinary | special class/struct `xsd__hexBinary` | | base64Bianry | special class/struct `xsd__base64Binary` | | QName | `_QName` string (URI normalization rules are applied) | All other primitive XSD types not listed above are mapped to strings, by wsdl2h generating a typedef to string for these types. For example, xsd:token is bound to a C++ or C string: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} typedef std::string xsd__token; // C++ typedef char *xsd__token; // C (wsdl2h option -c) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This associates a compatible value space to the type with the appropriate XSD type name used by the soapcpp2-generated serializers. It is possible to remap types by adding the appropriate mapping rules to `typemap.dat` as we will explain in more detail in the next section. Imported custom serializers are intended to extend the C/C++ type bindings when the default binding to string is not satisfactory to your taste and if the target platform supports these C/C++ types. To add custom serializers to `typemap.dat` for wsdl2h, see [Adding custom serializers](#custom) below. Using typemap.dat to customize data bindings {#typemap} ============================================ We use a `typemap.dat` file to redefine namespace prefixes and to customize type bindings for the the generated header files produced by the wsdl2h tool. The `typemap.dat` is the default file processed by wsdl2h. Use wsdl2h option `-t` to specify a different file. Declarations in `typemap.dat` can be broken up over multiple lines by continuing on the next line by ending each line to be continued with a backslash `\`. The limit is 4095 characters per line, whether the line is broken up or not. XML namespace bindings {#typemap1} ---------------------- The wsdl2h tool generates C/C++ type declarations that use `ns1`, `ns2`, etc. as schema-binding URI prefixes. These default prefixes are generated somewhat arbitrarily for each schema targetNamespace URI, meaning that their ordering may change depending on the WSDL and XSD order of processing with wsdl2h. Therefore, it is **strongly recommended** to declare your own prefix for each schema URI in `typemap.dat` to reduce maintaince effort of your code. This is more robust when anticipating possible changes of the schema(s) and/or the binding URI(s) and/or the tooling algorithms. The first and foremost important thing to do is to define prefix-URI bindings for our C/C++ code by adding the following line(s) to our `typemap.dat` or make a copy of this file and add the line(s) that bind our choice of prefix name to each URI: prefix = "URI" For example: g = "urn:graph" This produces `g__name` C/C++ type names that are bound to the "urn:graph" schema by association of `g` to the generated C/C++ types. This means that `` is parsed as an instance of a `g__name` C/C++ type. Also `` parses as an instance of `g__name`, because the prefix `x` has the same URI value `urn:graph`. Prefixes in XML have local scopes (like variables in a block). The first run of wsdl2h will reveal the URIs, so you do not need to search WSDLs and XSD files for all of the target namespaces. Just copy them from the generated header file after the first run into `typemap.dat` for editing. XSD type bindings {#typemap2} ----------------- Custom C/C++ type bindings can be declared in `typemap.dat` to associate C/C++ types with specific schema types. These type bindings have four parts: prefix__type = declaration | use | ptruse where - `prefix__type` is the schema type to be customized (the `prefix__type` name uses the common double underscore naming convention); - `declaration` declares the C/C++ type in the wsdl2h-generated header file. This part can be empty if no explicit declaration is needed; - `use` is an optional part that specifies how the C/C++ type is used in the code. When omitted, it is the same as `prefix__type`; - `ptruse` is an optional part that specifies how the type is used as a pointer type. By default it is the `use` type name with a `*` or C++11 `std::shared_ptr<>` when enabled (see further below). For example, to map xsd:duration to a `long long` (`LONG64`) type that holds millisecond duration values, we can use the custom serializer declared in `custom/duration.h` by adding the following line to `typemap.dat`: xsd__duration = #import "custom/duration.h" Here, we omitted the second field, because `xsd__duration` is the name that wsdl2h uses to identify and use this type for our code. The third field is omitted to let wsdl2h use `xsd__duration *` for pointers or `std::shared_ptr` if smart pointers are enabled. To map xsd:string to `wchar_t*` wide strings: xsd__string = | wchar_t* | wchar_t* Note that the first field is empty, because `wchar_t` is a C type and does not need to be declared. A `ptruse` field is given so that we do not end up generating the wrong pointer types, such as `wchar_t**` and `std::shared_ptr`. When the auto-generated declaration should be preserved but the `use` or `ptruse` fields replaced, then we use an ellipsis for the declaration part: prefix__type = ... | use | ptruse This is useful to map schema polymorphic types to C types for example, where we need to be able to both handle a base type and its extensions as per schema extensibility. Say we have a base type called ns:base that is extended, then we can remap this to a C type that permits referening the extended types via a `void*` as follows: ns__base = ... | int __type_base; void* such that `__type_base` and `void*` will be used to (de)serialize any data type, including base and its derived types. The `__type_base` integer is set to a `SOAP_TYPE_T` value to indicate what type of data the `void*` pointer points to. Custom serializers for XSD types {#custom} -------------------------------- In the previous part we saw how a custom serializer is used to bind xsd:duration to a `long long` (`LONG64` or `int64_t`) type to store millisecond duration values: xsd__duration = #import "custom/duration.h" The `xsd__duration` type is an alias of `long long` (`LONG64` or `int64_t`). While wsdl2h will use this binding declared in `typemap.dat` automatically, you will also need to compile `custom/duration.c`. Each custom serializer has a header file and an implementation file written in C. You can compile these in C++ (rename files to `.cpp` if needed). We will discuss the custom serializers that are available to you. ### xsd:integer {#custom-1} The wsdl2h tool maps xsd:integer to a string by default. To map xsd:integer to the 128 bit big int type `__int128_t`: xsd__integer = #import "custom/int128.h" The `xsd__integer` type is an alias of `__int128_t`. @warning Beware that the xsd:integer value space of integers is in principle unbounded and values can be of arbitrary length. A value range fault `SOAP_TYPE` (value exceeds native representation) or `SOAP_LENGTH` (value exceeds range bounds) will be thrown by the deserializer if the value is out of range. Other XSD integer types that are restrictions of xsd:integer, are xsd:nonNegativeInteger and xsd:nonPositiveInteger, which are further restricted by xsd:positiveInteger and xsd:negativeInteger. To bind these types to `__int128_t` we should also add the following definitions to `typemap.dat`: xsd__nonNegativeInteger = typedef xsd__integer xsd__nonNegativeInteger 0 : ; xsd__nonPositiveInteger = typedef xsd__integer xsd__nonPositiveInteger : 0 ; xsd__positiveInteger = typedef xsd__integer xsd__positiveInteger 1 : ; xsd__negativeInteger = typedef xsd__integer xsd__negativeInteger : -1 ; @note If `__int128_t` 128 bit integers are not supported on your platform and if it is certain that xsd:integer values are within 64 bit value bounds for your application's use, then you can map this type to `LONG64`: xsd__integer = typedef LONG64 xsd__integer; @note Again, a value range fault `SOAP_TYPE` or `SOAP_LENGTH` will be thrown by the deserializer if the value is out of range. @see Section [Numerical types](#toxsd5). ### xsd:decimal {#custom-2} The wsdl2h tool maps xsd:decimal to a string by default. To map xsd:decimal to extended precision floating point: xsd__decimal = #import "custom/long_double.h" | long double By contrast to all other custom serializers, this serializer enables `long double` natively without requiring a new binding name (`xsd__decimal` is NOT defined). If your system supports `` quadruple precision floating point `__float128`, you can map xsd:decimal to `xsd__decimal` that is an alias of `__float128`: xsd__decimal = #import "custom/float128.h" @warning Beware that xsd:decimal is in principle a decimal value with arbitraty lengths. A value range fault `SOAP_TYPE` will be thrown by the deserializer if the value is out of range. In the XML payload the special values `INF`, `-INF`, `NaN` represent plus or minus infinity and not-a-number, respectively. @see Section [Numerical types](#toxsd5). ### xsd:dateTime {#custom-3} The wsdl2h tool maps xsd:dateTime to `time_t` by default. The trouble with `time_t` when represented as 32 bit `long` integers is that it is limited to dates between 1970 and 2038. A 64 bit `time_t` is safe to use if the target platform supports it, but lack of 64 bit `time_t` portability may still cause date range issues. For this reason `struct tm` should be used to represent wider date ranges. This custom serializer avoids using date and time information in `time_t`. You get the raw date and time information. You only lose the day of the week information. It is always Sunday (`tm_wday=0`). To map xsd:dateTime to `xsd__dateTime` which is an alias of `struct tm`: xsd__dateTime = #import "custom/struct_tm.h" If the limited date range of `time_t` is not a problem but you want to increase the time precision with fractional seconds, then we suggest to map xsd:dateTime to `struct timeval`: xsd__dateTime = #import "custom/struct_timeval.h" If the limited date range of `time_t` is not a problem but you want to use the C++11 time point type `std::chrono::system_clock::time_point` (which internally uses `time_t`): xsd__dateTime = #import "custom/chrono_time_point.h" Again, we should make sure that the dates will not exceed the date range when using the default `time_t` binding for xsd:dateTime or when binding xsd:dateTime to `struct timeval` or to `std::chrono::system_clock::time_point`. These are safe to use in applications that use xsd:dateTime to record date stamps within a given window. Otherwise, we recommend the `struct tm` custom serializer. You could even map xsd:dateTime to a plain string (use `char*` with C and `std::string` with C++). For example: xsd__dateTime = | char* @see Section [Date and time types](#toxsd7). ### xsd:date {#custom-4} The wsdl2h tool maps xsd:date to a string by default. We can map xsd:date to `struct tm`: xsd__date = #import "custom/struct_tm_date.h" The `xsd__date` type is an alias of `struct tm`. The serializer ignores the time part and the deserializer only populates the date part of the struct, setting the time to 00:00:00. There is no unreasonable limit on the date range because the year field is stored as an integer (`int`). @see Section [Date and time types](#toxsd7). ### xsd:time {#custom-5} The wsdl2h tool maps xsd:time to a string by default. We can map xsd:time to an `unsigned long long` (`ULONG64` or `uint64_t`) integer with microsecond time precision: xsd__time = #import "custom/long_time.h" This type represents 00:00:00.000000 to 23:59:59.999999, from `0` to an upper bound of `86399999999`. A microsecond resolution means that a 1 second increment requires an increment of 1000000 in the integer value. The serializer adds a UTC time zone. @see Section [Date and time types](#toxsd7). ### xsd:duration {#custom-6} The wsdl2h tool maps xsd:duration to a string by default, unless xsd:duration is mapped to a `long long` (`LONG64` or `int64_t`) type with with millisecond (ms) time duration precision: xsd__duration = #import "custom/duration.h" The `xsd__duration` type is a 64 bit signed integer that can represent 106,751,991,167 days forwards (positive) and backwards (negative) in time in increments of 1 ms (1/1000 of a second). Rescaling of the duration value by may be needed when adding the duration value to a `time_t` value, because `time_t` may or may not have a seconds resolution, depending on the platform and possible changes to `time_t`. Rescaling is done automatically when you add a C++11 `std::chrono::nanoseconds` value to a `std::chrono::system_clock::time_point` value. To use `std::chrono::nanoseconds` as xsd:duration: xsd__duration = #import "custom/chrono_duration.h" This type can represent 384,307,168 days (2^63 nanoseconds) forwards and backwards in time in increments of 1 ns (1/1,000,000,000 of a second). Certain observations with respect to receiving durations in years and months apply to both of these serializer decoders for xsd:duration. @see Section [Time duration types](#toxsd8). Class/struct member additions {#typemap3} ----------------------------- All generated classes and structs can be augmented with additional members such as methods, constructors and destructors, and private members: prefix__type = $ member-declaration For example, we can add method declarations and private members to a class, say `ns__record` as follows: ns__record = $ ns__record(const ns__record &); // copy constructor ns__record = $ void print(); // a print method ns__record = $ private: int status; // a private member Note that method declarations cannot include any code, because soapcpp2's input permits only type declarations, not code. Replacing XSD types by equivalent alternatives {#typemap4} ---------------------------------------------- Type replacements can be given to replace one type entirely with another given type: prefix__type1 == prefix__type2 This replaces all `prefix__type1` by `prefix__type2` in the wsdl2h output. @warning Do not agressively replace types, because this can cause XML validation to fail when a value-type mismatch is encountered in the XML input. Therefore, only replace similar types with other similar types that are wider (e.g. `short` by `int` and `float` by `double`). The built-in typemap.dat variables $CONTAINER and $POINTER {#typemap5} ---------------------------------------------------------- The `typemap.dat` `$CONTAINER` variable defines the container to emit in the generated declarations, which is `std::vector` by default. For example, to emit `std::list` as the container in the wsdl2h-generated declarations: $CONTAINER = std::list The `typemap.dat` `$POINTER` variable defines the smart pointer to emit in the generated declarations, which replaces the use of `*` pointers. For example: $POINTER = std::shared_ptr Not all pointers in the generated output can be replaced by smart pointers. Regular pointers are still used as union members and for pointers to arrays of objects. @note The standard smart pointer `std::shared_ptr` is generally safe to use. Other smart pointers such as `std::unique_ptr` and `std::auto_ptr` may cause compile-time errors when classes have smart pointer members but no copy constructor (a default copy constructor). A copy constructor is required for non-shared smart pointer copying or swapping. Alternatives to `std::shared_ptr` of the form `NAMESPACE::shared_ptr` can be assigned to `$POINTER` when the namespace `NAMESPACE` also implements `NAMESPACE::make_shared` and when the shared pointer class provides `reset()` and`get()` methods and the dereference operator. For example Boost `boost::shared_ptr`: [ #include ] $POINTER = boost::shared_ptr The user-defined content between `[` and `]` ensures that we include the Boost header files that are needed to support `boost::shared_ptr` and `boost::make_shared`. User-defined content {#typemap6} -------------------- Any other content to be generated by wsdl2h can be included in `typemap.dat` by enclosing it within brackets `[` and `]` anywhere in the `typemap.dat` file. Each of the two brackets MUST appear at the start of a new line. For example, we can add an `#import "wsa5.h"` directive to the wsdl2h-generated output as follows: [ #import "import/wsa5.h" ] which emits the `#import "import/wsa5.h"` literally at the start of the wsdl2h-generated header file. Mapping C/C++ to XML schema {#toxsd} =========================== The soapcpp2 command generates the data binding implementation code from a data binding interface `file.h`: soapcpp2 [options] file.h where `file.h` is a gSOAP header file that declares the XML data binding interface. The `file.h` is typically generated by wsdl2h, but we can also declare one ourself. If so, we add gSOAP directives and declare in this file all our C/C++ types we want to serialize in XML. We can also declare functions that will be converted to service operations by soapcpp2. Global function declarations define service operations, which are of the form: int ns__name(arg1, arg2, ..., argn, result); where `arg1`, `arg2`, ..., `argn` are formal argument declarations of the input and `result` is a formal argument for the output, which must be a pointer or reference to the result object to be populated. More information can be found in the gSOAP user guide. Overview of serializable C/C++ types {#toxsd1} ------------------------------------ The following C/C++ types are supported by soapcpp2 and mapped to XSD types and constructs. See the subsections below for more details or follow the links. ### List of Boolean types | Boolean Type | Notes | | ----------------------------- | ----------------------------------------------------------------------------------- | | `bool` | C++ bool | | `enum xsd__boolean` | C alternative to C++ `bool` with `false_` and `true_` | @see Section [C++ bool and C alternative](#toxsd3). ### List of enumeration and bitmask types | Enumeration Type | Notes | | ----------------------------- | ----------------------------------------------------------------------------------- | | `enum` | enumeration | | `enum class` | C++11 scoped enumeration (soapcpp2 `-c++11`) | | `enum*` | a bitmask that enumerates values 1, 2, 4, 8, ... | | `enum* class` | C++11 scoped enumeration bitmask (soapcpp2 `-c++11`) | @see Section [Enumerations and bitmasks](#toxsd4). ### List of numerical types | Numerical Type | Notes | | ----------------------------- | ----------------------------------------------------------------------------------- | | `char` | byte | | `short` | 16 bit integer | | `int` | 32 bit integer | | `long` | 32 bit integer | | `LONG64` | 64 bit integer | | `xsd__integer` | 128 bit integer, use `#import "custom/int128.h"` | | `long long` | same as `LONG64` | | `unsigned char` | unsigned byte | | `unsigned short` | unsigned 16 bit integer | | `unsigned int` | unsigned 32 bit integer | | `unsigned long` | unsigned 32 bit integer | | `ULONG64` | unsigned 64 bit integer | | `unsigned long long` | same as `ULONG64` | | `int8_t` | same as `char` | | `int16_t` | same as `short` | | `int32_t` | same as `int` | | `int64_t` | same as `LONG64` | | `uint8_t` | same as `unsigned char` | | `uint16_t` | same as `unsigned short` | | `uint32_t` | same as `unsigned int` | | `uint64_t` | same as `ULONG64` | | `size_t` | transient type (not serializable) | | `float` | 32 bit float | | `double` | 64 bit float | | `long double` | extended precision float, use `#import "custom/long_double.h"` | | `xsd__decimal` | `` 128 bit quadruple precision float, use `#import "custom/float128.h"` | | `typedef` | declares a type name, with optional value range and string length bounds | @see Section [Numerical types](#toxsd5). ### List of string types | String Type | Notes | | ----------------------------- | ----------------------------------------------------------------------------------- | | `char*` | string (may contain UTF-8 with flag `SOAP_C_UTFSTRING`) | | `wchar_t*` | wide string | | `std::string` | C++ string (may contain UTF-8 with flag `SOAP_C_UTFSTRING`) | | `std::wstring` | C++ wide string | | `char[N]` | fixed-size string, requires soapcpp2 option `-b` | | `_QName` | normalized QName content | | `_XML` | literal XML string content with wide characters in UTF-8 | | `typedef` | declares a new string type name, may restrict string length | @see Section [String types](#toxsd6). ### List of date and time types | Date and Time Type | Notes | | --------------------------------------- | ------------------------------------------------------------------------- | | `time_t` | date and time point since epoch | | `struct tm` | date and time point, use `#import "custom/struct_tm.h"` | | `struct tm` | date point, use `#import "custom/struct_tm_date.h"` | | `struct timeval` | date and time point, use `#import "custom/struct_timeval.h"` | | `unsigned long long` | time point in microseconds, use `#import "custom/long_time.h"` | | `std::chrono::system_clock::time_point` | date and time point, use `#import "custom/chrono_time_point.h"` | @see Section [Date and time types](#toxsd7). ### List of time duration types | Time Duration Type | Notes | | ----------------------------- | ----------------------------------------------------------------------------------- | | `long long` | duration in milliseconds, use `#import "custom/duration.h"` | | `std::chrono::nanoseconds` | duration in nanoseconds, use `#import "custom/chrono_duration.h"` | @see Section [Time duration types](#toxsd8). ### List of classes and structs | Classes, Structs, and Members | Notes | | ----------------------------- | ----------------------------------------------------------------------------------- | | `class` | C++ class with single inheritance only | | `struct` | C struct or C++ struct without inheritance | | `std::shared_ptr` | C++11 smart shared pointer | | `std::unique_ptr` | C++11 smart pointer | | `std::auto_ptr` | C++ smart pointer | | `std::deque` | use `#import "import/stldeque.h"` | | `std::list` | use `#import "import/stllist.h"` | | `std::vector` | use `#import "import/stlvector.h"` | | `std::set` | use `#import "import/stlset.h"` | | `template class` | a container with `begin()`, `end()`, `size()`, `clear()`, and `insert()` methods | | `T*` | data member: pointer to data of type `T` or points to array of `T` of size `__size` | | `T[N]` | data member: fixed-size array of type `T` | | `union` | data member: requires a variant selector member `__union` | | `void*` | data member: requires a `__type` member to indicate the type of object pointed to | @see Section [Classes and structs](#toxsd9). ### List of special classes and structs | Special Classes and Structs | Notes | | ----------------------------- | ----------------------------------------------------------------------------------- | | Special Array class/struct | single and multidimensional SOAP Arrays | | Special Wrapper class/struct | complexTypes with simpleContent, wraps `__item` member | | `xsd__hexBinary` | binary content | | `xsd__base64Binary` | binary content and optional MIME/MTOM attachments | | `xsd__anyType` | DOM elements, use `#import "dom.h"` | | `@xsd__anyAttribute` | DOM attributes, use `#import "dom.h"` | @see Section [Special classes and structs](#toxsd10). Colon notation versus name prefixing {#toxsd2} ------------------------------------ To bind C/C++ type names to XSD types, a simple form of name prefixing is used by the gSOAP tools by prepending the XML namespace prefix to the C/C++ type name with a pair of undescrores. This also ensures that name clashes cannot occur when multiple WSDL and XSD files are converted to C/C++. Also, C++ namespaces are not sufficiently rich to capture XML schema namespaces accurately, for example when class members are associated with schema elements defined in another XML namespace and thus the XML namespace scope of the member's name is relevant, not just its type. However, from a C/C++ centric point of view this can be cumbersome. Therefore, colon notation is an alternative to physically augmenting C/C++ names with prefixes. For example, the following class uses colon notation to bind the `record` class to the `urn:types` schema: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} //gsoap ns schema namespace: urn:types class ns:record // binding 'ns:' to a type name { public: std::string name; uint64_t SSN; ns:record *spouse; // using 'ns:' with the type name ns:record(); // using 'ns:' here too ~ns:record(); // and here }; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The colon notation is stripped away by soapcpp2 when generating the data binding implementation code for our project. So the final code just uses `record` to identify this class and its constructor/destructor. When using colon notation we have to be consistent and not use colon notation mixed with prefixed forms. The name `ns:record` differs from `ns__record`, because `ns:record` is compiled to an unqualified `record` name. Colon notation also facilitates overruling the elementFormDefault and attributeFormDefault declaration that is applied to local elements and attributes, when declared as members of classes, structs, and unions. For more details, see [Qualified and unqualified members](#toxsd9-6). C++ Bool and C alternatives {#toxsd3} --------------------------- The C++ `bool` type is bound to built-in XSD type xsd:boolean. The C alternative is to define an enumeration: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} enum xsd__boolean { false_, true_ }; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ or by defining an enumeration in C with pseudo-scoped enumeration constants: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} enum xsd__boolean { xsd__boolean__false, xsd__boolean__true }; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The XML value space of these types is `false` and `true`, but also accepted are `0` and `1` values for false and true, respectively. To prevent name clashes, `false_` and `true_` have an underscore. Trailing underscores are removed from the XML value space. Enumerations and bitmasks {#toxsd4} ------------------------- Enumerations are mapped to XSD simpleType enumeration restrictions of xsd:string, xsd:QName, and xsd:long. Consider for example: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} enum ns__Color { RED, WHITE, BLUE }; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ which maps to a simpleType restriction of xsd:string in the soapcpp2-generated schema: Enumeration name constants can be pseudo-scoped to prevent name clashes, because enumeration name constants have a global scope in C and C++: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} enum ns__Color { ns__Color__RED, ns__Color__WHITE, ns__Color__BLUE }; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ We can also use C++11 scoped enumerations to prevent name clashes: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} enum class ns__Color : int { RED, WHITE, BLUE }; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Here, the enumeration class base type `: int` is optional. In place of `int` in the example above, we can also use `int8_t`, `int16_t`, `int32_t`, or `int64_t`. The XML value space of the enumertions defined above is `RED`, `WHITE`, and `BLUE`. Prefix-qualified enumeration name constants are mapped to simpleType restrictions of xsd:QName, for example: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} enum ns__types { xsd__int, xsd__float }; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ which maps to a simpleType restriction of xsd:QName in the soapcpp2-generated schema: Enumeration name constants can be pseudo-numeric as follows: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} enum ns__Primes { _3 = 3, _5 = 5, _7 = 7, _11 = 11 }; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ which maps to a simpleType restriction of `xsd:long`: The XML value space of this type is `3`, `5`, `7`, and `11`. Besides (pseudo-) scoped enumerations, another way to prevent name clashes accross enumerations is to start an enumeration name constant with one underscore or followed it by any number of underscores, which makes it unique. The leading and trailing underscores are removed from the XML value space. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} enum ns__ABC { A, B, C }; enum ns__BA { B, A }; // BAD: B = 1 but B is already defined as 2 enum ns__BA_ { B_, A_ }; // OK ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The gSOAP soapcpp2 tool permits reusing enumeration name constants across (non-scoped) enumerations as long as these values are assigned the same constant. Therefore, the following is permitted: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} enum ns__Primes { _3 = 3, _5 = 5, _7 = 7, _11 = 11 }; enum ns__Throws { _1 = 1, _2 = 2, _3 = 3, _4 = 4, _5 = 5, _6 = 6 }; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ A bitmask type is an `enum*` "product" enumeration with a geometric, power-of-two sequence of values assigned to the enumeration constants: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} enum* ns__Options { SSL3, TLS10, TLS11, TLS12 }; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ where the product enum assigns 1 to `SSL3`, 2 to `TLS10`, 4 to `TLS11`, and 8 to `TLS12`, which allows these enumeration constants to be used in composing bitmasks with `|` (bitwise or) `&` (bitwise and), and `~` (bitwise not): ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} enum ns__Options options = (enum ns__Options)(SSL3 | TLS10 | TLS11 | TLS12); if (options & SSL3) // if SSL3 is an option, warn and remove from options { warning(); options &= ~SSL3; } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The bitmask type maps to a simpleType list restriction of xsd:string in the soapcpp2-generated schema: The XML value space of this type consists of all 16 possible subsets of the four values, represented by an XML string with space-separated values. For example, the bitmask `TLS10 | TLS11 | TLS12` equals 14 and is represented in by the XML string `TLS10 TLS11 TLS12`. We can also use C++11 scoped enumerations with bitmasks: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} enum* class ns__Options { SSL3, TLS10, TLS11, TLS12 }; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The base type of a scoped enumeration bitmask, when explicitly given, is ignored. The base type is either `int` or `int64_t`, depending on the number of constants enumerated in the bitmask. To convert `enum` name constants and bitmasks to a string, we use the auto-generated function for enum `T`: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} const char *soap_T2s(struct soap*, enum T val) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The string returned is stored in an internal buffer of the current `soap` context, so you MUST copy it to keep it from being overwritten. For example, use `char *soap_strdup(struct soap*, const char*)`. To convert a string to an `enum` constant or bitmask, we use the auto-generated function ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} int soap_s2T(struct soap*, const char *str, enum T *val) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This function takes the name (or names, space-separated for bitmasks) of the enumeration constant in a string `str`. Names should be given without the pseudo-scope prefix and without trailing underscores. The function sets `val` to the corresponding integer enum constant or to a bitmask. The function returns `SOAP_OK` (zero) on success or an error if the string is not a valid enumeration name. Numerical types {#toxsd5} --------------- Integer and floating point types are mapped to the equivalent built-in XSD types with the same sign and bit width. The `size_t` type is transient (not serializable) because its width is platform dependent. We recommend to use `uint64_t` instead. The XML value space of integer types are their decimal representations without loss of precision. The XML value space of floating point types are their decimal representations. The decimal representations are formatted with the printf format string "%.9G" for floats and the printf format string "%.17lG" for double. To change the format strings, we can assign new strings to the following `struct soap` context members: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} soap.float_format = "%g"; soap.double_format = "%lg"; soap.long_double_format = "%Lg"; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Note that decimal representations may result in a loss of precision of the least significant decimal. Therefore, the format strings that are used by default are sufficiently precise to avoid loss, but this may result in long decimal fractions in the XML value space. The `long double` extended floating point type requires a custom serializer: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #import "custom/long_double.h" ... use long double ... ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ You can now use `long double`, which has a serializer that serializes this type as `xsd:decimal`. Compile and link your code with `custom/long_double.c`. The value space of floating point values includes the special values `INF`, `-INF`, and `NaN`. You can check a value for plus or minus infinity and not-a-number as follows: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} soap_isinf(x) && x > 0 // is x INF? soap_isinf(x) && x < 0 // is x -INF? soap_isnan(x) // is x NaN? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ To assign these values, use: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} // x is float // x is double, long double, or __float128 x = FLT_PINFY; x = DBL_PINFTY; x = FLT_NINFY; x = DBL_NINFTY; x = FLT_NAN; x = DBL_NAN; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ If your system supports `__float128` then you can also use this 128 bit floating point type with a custom serializer: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #import "custom/float128.h" ... use xsd__decimal ... ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Then use the `xsd__decimal` alias of `__float128`, which has a serializer. Do not use `__float128` directly, which is transient (not serializable). To check for `INF`, `-INF`, and `NaN` of a `__float128` value use: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} isinfq(x) && x > 0 // is x INF? isinfq(x) && x < 0 // is x -INF? isnanq(x) // is x NaN? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The range of a typedef-defined numerical type can be restricted using the range `:` operator with inclusive lower and upper bounds. For example: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} typedef int ns__narrow -10 : 10; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This maps to a simpleType restriction of xsd:int in the soapcpp2-generated schema: The lower and upper bound of a range are optional. When omitted, values are not bound from below or from above, respectively. The range of a floating point typedef-defined type can be restricted within floating point constant bounds. Also with a floating point typedef a printf format pattern can be given of the form `"%[width][.precision]f"` to format decimal values using the given width and precision fields: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} typedef float ns__PH "%5.2f" 0.0 : 14.0; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This maps to a simpleType restriction of xsd:float in the soapcpp2-generated schema: For exclusive bounds, we use the `<` operator instead of the `:` range operator: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} typedef float ns__epsilon 0.0 < 1.0; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Values `eps` of `ns__epsilon` are restricted between `0.0 < eps < 1.0`. This maps to a simpleType restriction of xsd:float in the soapcpp2-generated schema: To make just one of the bounds exclusive, while keeping the other bound inclusive, we add a `<` on the left or on the right side of the range ':' operator. For example: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} typedef float ns__pos 0.0 < : ; // 0.0 < pos typedef float ns__neg : < 0.0 ; // neg < 0.0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ It is valid to make both left and right side exclusive with `< : <` which is in fact identical to the exlusive range `<` operator: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} typedef float ns__epsilon 0.0 < : < 1.0; // 0.0 < eps < 1.0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ It helps to think of the `:` as a placeholder of the value between the two bounds, which is easier to memorize than the shorthand forms of bounds from which the `:` is removed: | Bounds | Validation Check | Shorthand | | ---------- | ---------------- | --------- | | 1 : | 1 <= x | 1 | | 1 : 10 | 1 <= x <= 10 | | | : 10 | x <= 10 | | | 1 < : < 10 | 1 < x < 10 | 1 < 10 | | 1 : < 10 | 1 <= x < 10 | | | : < 10 | x < 10 | < 10 | | 1 < : | 1 < x | 1 < | | 1 < : 10 | 1 < x <= 10 | | Besides `float`, also `double` and `long double` values can be restricted. For example, consider a nonzero probability extended floating point precision type: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #import "custom/long_double.h" typedef long double ns__probability "%16Lg" 0.0 < : 1.0; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Value range restrictions are validated by the parser for all inbound XML data. A type fault `SOAP_TYPE` will be thrown by the deserializer if the value is out of range. Finally, if your system supports `__int128_t` then you can also use this 128 bit integer type with a custom serializer: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #import "custom/int128.h" ... use xsd__integer ... ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ We use the `xsd__integer` alias of `__int128_t`, which has a serializer. Do not use `__int128_t` directly, which is transient (not serializable). To convert numeric values to a string, we use the auto-generated function for numeric type `T`: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} const char *soap_T2s(struct soap*, T val) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ For numeric types `T`, the string returned is stored in an internal buffer of the current `soap` context, so you MUST copy it to keep it from being overwritten. For example, use `char *soap_strdup(struct soap*, const char*)`. To convert a string to a numeric value, we use the auto-generated function ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} int soap_s2T(struct soap*, const char *str, T *val) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ where `T` is for example `int`, `LONG64`, `float`, `decimal` (the custom serializer name of `long double`) or `xsd__integer` (the custom serializer name of `__int128_t`). The function `soap_s2T` returns `SOAP_OK` on success or an error when the value is not numeric. For floating point types, "INF", "-INF" and "NaN" are valid strings to convert to numbers. String types {#toxsd6} ------------ String types are mapped to the built-in xsd:string and xsd:QName XSD types. The wide strings `wchar_t*` and `std::wstring` may contain Unicode that is preserved in the XML value space. Strings `char*` and `std::string` can only contain extended Latin, but we can store UTF-8 content that is preserved in the XML value space when the `struct soap` context is initialized with the flag `XML_C_UTFSTRING`. @warning Beware that many XML 1.0 parsers reject all control characters (those between `#x1` and `#x1F`) except `#x9`, `#xA`, and `#xD`. With the newer XML 1.1 version parsers (including gSOAP) you should be fine. The length of a string of a typedef-defined string type can be restricted: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} typedef std::string ns__password 6 : 16; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ which maps to a simpleType restriction of xsd:string in the soapcpp2-generated schema: String length restrictions are validated by the parser for inbound XML data. A value length fault `SOAP_LENGTH` will be thrown by the deserializer if the string is too long or too short. In addition, an XSD regex pattern restriction can be associated with a string typedef: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} typedef std::string ns__password "([a-zA-Z]|[0-9]|-)+" 6 : 16; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ which maps to a simpleType restriction of xsd:string in the soapcpp2-generated schema: Pattern restrictions are validated by the parser for inbound XML data only if the `soap::fsvalidate` and `soap::fwvalidate` callbacks are defined, see the gSOAP user guide for more details. Exclusive length bounds can be used with strings: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} typedef std::string ns__string255 : < 256; // same as 0 : 255 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Fixed-size strings (`char[N]`) are rare occurrences in the wild, but apparently still used in some projects to store strings. To facilitate fixed-size string serialization, use soapcpp2 option `-b`. For example: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} typedef char ns__buffer[10]; // requires soapcpp2 option -b ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ which maps to a simpleType restriction of xsd:string in the soapcpp2-generated schema: Note that fixed-size strings MUST contain NUL-terminated text and SHOULD NOT contain raw binary data. Also, the length limitation is more restrictive for UTF-8 content (enabled with the `SOAP_C_UTFSTRING`) that requires multibyte character encodings. As a consequence, UTF-8 content may be truncated to fit. Note that raw binary data can be stored in a `xsd__base64Binary` or `xsd__hexBinary` structure, or transmitted as a MIME attachment. The built-in `_QName` type is a regular C string type (`char*`) that maps to xsd:QName but has the added advantage that it holds normalized qualified names. There are actually two forms of normalized QName content, to ensure any QName is represented accurately and uniquely: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} "prefix:name" "\"URI\":name" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The first form of string is used when the prefix (and the binding URI) is defined in the namespace table and is bound to a URI (see the .nsmap file). The second form is used when the URI is not defined in the namespace table and therefore no prefix is available to bind and normalize the URI to. A `_QName` string may contain a sequence of space-separated QName values, not just one, and all QName values are normalized to the format shown above. To define a `std::string` base type for xsd:QName, we use a typedef: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} typedef std::string xsd__QName; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The `xsd__QName` string content is normalized, just as with the `_QName` normalization. To serialize strings that contain literal XML content to be reproduced in the XML value space, use the built-in `_XML` string type, which is a regular C string type (`char*`) that maps to plain XML CDATA. To define a `std::string` base type for literal XML content, use a typedef: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} typedef std::string XML; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Strings can hold any of the values of the XSD built-in primitive types. We can use a string typedef to declare the use of the string type as a XSD built-in type: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} typedef std::string xsd__token; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ We MUST ensure that the string values we populate in this type conform to the XML standard, which in case of xsd:token is: the lexical and value spaces of xsd:token are the sets of all strings after whitespace replacement of any occurrence of `#x9`, `#xA` , and `#xD` by `#x20` and collapsing. To copy `char*` or `wchar_t*` strings with a context that manages the allocated memory, use functions ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} char *soap_strdup(struct soap*, const char*) wchar_t *soap_wstrdup(struct soap*, const wchar_t*) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ To convert a wide string to a UTF-8 encoded string, use function ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} const char* SOAP_FMAC2 soap_wchar2s(struct soap*, const wchar_t *s) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The function allocates and returns a string, with its memory being managed by the context. To convert a UTF-8 encoded string to a wide string, use function ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} int soap_s2wchar(struct soap*, const char *from, wchar_t **to, long minlen, long maxlen) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ where `to` is set to point to an allocated `wchar_t*` string. Pass `-1` for `minlen` and `maxlen` to ignore length constraints on the target string. The function returns `SOAP_OK` or an error when the length constraints are not met. Date and time types {#toxsd7} ------------------- The C/C++ `time_t` type is mapped to the built-in xsd:dateTime XSD type that represents a date and time within a time zone (typically UTC). The XML value space contains ISO 8601 Gregorian time instances of the form `[-]CCYY-MM-DDThh:mm:ss.sss[Z|(+|-)hh:mm]`, where `Z` is the UTC time zone or a time zone offset `(+|-)hh:mm]` from UTC is used. A `time_t` value is considered and represented in UTC by the serializer. Because the `time_t` value range is restricted to dates after 01/01/1970 and before 2038 assuming `time_t` is a `long` 32 bit, care must be taken to ensure the range of xsd:dateTime values in XML exchanges do not exceed the `time_t` range. This restriction does not hold for `struct tm` (``), which we can use to store and exchange a date and time in UTC without date range restrictions. The serializer uses the `struct tm` members directly for the XML value space of xsd:dateTime: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} struct tm { int tm_sec; // seconds (0 - 60) int tm_min; // minutes (0 - 59) int tm_hour; // hours (0 - 23) int tm_mday; // day of month (1 - 31) int tm_mon; // month of year (0 - 11) int tm_year; // year - 1900 int tm_wday; // day of week (Sunday = 0) (NOT USED) int tm_yday; // day of year (0 - 365) (NOT USED) int tm_isdst; // is summer time in effect? char* tm_zone; // abbreviation of timezone (NOT USED) }; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ You will lose the day of the week information. It is always Sunday (`tm_wday=0`) and the day of the year is not set either. The time zone is UTC. This `struct tm` type is mapped to the built-in xsd:dateTime XSD type and serialized with the custom serializer `custom/struct_tm.h` that declares a `xsd__dateTime` type: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #import "custom/struct_tm.h" // import typedef struct tm xsd__dateTime; ... use xsd__dateTime ... ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Compile and link your code with `custom/struct_tm.c`. The `struct timeval` (``) type is mapped to the built-in xsd:dateTime XSD type and serialized with the custom serializer `custom/struct_timeval.h` that declares a `xsd__dateTime` type: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #import "custom/struct_timeval.h" // import typedef struct timeval xsd__dateTime; ... use xsd__dateTime ... ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Compile and link your code with `custom/struct_timeval.c`. Note that the same value range restrictions apply to `struct timeval` as they apply to `time_t`. The added benefit of `struct timeval` is the addition of a microsecond-precise clock: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} struct timeval { time_t tv_sec; // seconds since Jan. 1, 1970 suseconds_t tv_usec; // and microseconds }; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ A C++11 `std::chrono::system_clock::time_point` type is mapped to the built-in xsd:dateTime XSD type and serialized with the custom serializer `custom/chrono_time_point.h` that declares a `xsd__dateTime` type: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #import "custom/chrono_time_point.h" // import typedef std::chrono::system_clock::time_point xsd__dateTime; ... use xsd__dateTime ... ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Compile and link your code with `custom/chrono_time_point.cpp`. The `struct tm` type is mapped to the built-in xsd:date XSD type and serialized with the custom serializer `custom/struct_tm_date.h` that declares a `xsd__date` type: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #import "custom/struct_tm_date.h" // import typedef struct tm xsd__date; ... use xsd__date ... ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Compile and link your code with `custom/struct_tm_date.c`. The XML value space of xsd:date are Gregorian calendar dates of the form `[-]CCYY-MM-DD[Z|(+|-)hh:mm]` with a time zone. The serializer ignores the time part and the deserializer only populates the date part of the struct, setting the time to 00:00:00. There is no unreasonable limit on the date range because the year field is stored as an integer (`int`). An `unsigned long long` (`ULONG64` or `uint64_t`) type that contains a 24 hour time in microseconds UTC is mapped to the built-in xsd:time XSD type and serialized with the custom serializer `custom/long_time.h` that declares a `xsd__time` type: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #import "custom/long_time.h" // import typedef unsigned long long xsd__time; ... use xsd__time ... ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Compile and link your code with `custom/long_time.c`. This type represents 00:00:00.000000 to 23:59:59.999999, from `0` to an upper bound of `86399999999`. A microsecond resolution means that a 1 second increment requires an increment of 1000000 in the integer value. The XML value space of xsd:time are points in time recurring each day of the form `hh:mm:ss.sss[Z|(+|-)hh:mm]`, where `Z` is the UTC time zone or a time zone offset from UTC is used. The `xsd__time` value is always considered and represented in UTC by the serializer. To convert date and/or time values to a string, we use the auto-generated function for type `T`: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} const char *soap_T2s(struct soap*, T val) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ For date and time types `T`, the string returned is stored in an internal buffer of the current `soap` context, so you MUST copy it to keep it from being overwritten. For example, use `char *soap_strdup(struct soap*, const char*)`. To convert a string to a date/time value, we use the auto-generated function ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} int soap_s2T(struct soap*, const char *str, T *val) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ where `T` is for example `dateTime` (for `time_t`), `xsd__dateTime` (for `struct tm`, `struct timeval`, or `std::chrono::system_clock::time_point`). The function `soap_s2T` returns `SOAP_OK` on success or an error when the value is not a date/time. Time duration types {#toxsd8} ------------------- The XML value space of xsd:duration are values of the form `PnYnMnDTnHnMnS` where the capital letters are delimiters. Delimiters may be omitted when the corresponding member is not used. A `long long` (`LONG64` or `int64_t`) type that contains a duration (time lapse) in milliseconds is mapped to the built-in xsd:duration XSD type and serialized with the custom serializer `custom/duration.h` that declares a `xsd__duration` type: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #import "custom/duration.h" // import typedef long long xsd__duration; ... use xsd__duration ... ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Compile and link your code with `custom/duration.c`. The duration type `xsd__duration` can represent 106,751,991,167 days forward and backward with millisecond precision. Durations that exceed a month are always output in days, rather than months to avoid days-per-month conversion inacurracies. Durations that are received in years and months instead of total number of days from a reference point are not well defined, since there is no accepted reference time point (it may or may not be the current time). The decoder simple assumes that there are 30 days per month. For example, conversion of "P4M" gives 120 days. Therefore, the durations "P4M" and "P120D" are assumed to be identical, which is not necessarily true depending on the reference point in time. Rescaling of the duration value by may be needed when adding the duration value to a `time_t` value, because `time_t` may or may not have a seconds resolution, depending on the platform and possible changes to `time_t`. Rescaling is done automatically when you add a C++11 `std::chrono::nanoseconds` value to a `std::chrono::system_clock::time_point` value. To use `std::chrono::nanoseconds` as xsd:duration: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #import "custom/chrono_duration.h" // import typedef std::chrono::duration xsd__duration; ... use xsd__duration ... ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Compile and link your code with `custom/chrono_duration.cpp`. This type can represent 384,307,168 days (2^63 nanoseconds) forwards and backwards in time in increments of 1 ns (1/1000000000 second). The same observations with respect to receiving durations in years and months apply to this serializer's decoder. To convert duration values to a string, we use the auto-generated function ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} const char *soap_xsd__duration2s(struct soap*, xsd__duration val) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The string returned is stored in an internal buffer, so you MUST copy it to keep it from being overwritten, Use `soap_strdup(struct soap*, const char*)` for example to copy this string. To convert a string to a duration value, we use the auto-generated function ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} int soap_s2xsd__dateTime(struct soap*, const char *str, xsd__dateTime *val) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The function returns `SOAP_OK` on success or an error when the value is not a duration. Classes and structs {#toxsd9} ------------------- Classes and structs are mapped to XSD complexTypes. The XML value space consists of XML elements with attributes and subelements, possibly constrained by validation rules that enforce element and attribute occurrence contraints, numerical value range constraints, and string length and pattern constraints. Classes that are declared with the gSOAP tools are limited to single inheritence only. Structs cannot be inherited. The class and struct name is bound to an XML namespace by means of the prefix naming convention or by using [Colon notation](#toxsd1): ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} //gsoap ns schema namespace: urn:types class ns__record { public: std::string name; uint64_t SSN; ns__record *spouse; ns__record(); ~ns__record(); protected: struct soap *soap; }; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In the example above, we also added a context pointer to the `struct soap` that manages this instance. It is set when the instance is created in the engine's context, for example when deserialized and populated by the engine. The class maps to a complexType in the soapcpp2-generated schema: ### Serializable versus transient types and members {#toxsd9-1} Public data members of a class or struct are serialized. Private and protected members are transient and not serializable. Also `const` and `static` members are not serializable, with the exception of `const char*` and `const wchar_t*`. Types and specific class/struct members can be made transient by using the `extern` qualifier: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} extern class std::ostream; // declare 'std::ostream' transient class ns__record { public: extern int num; // not serialized std::ostream out; // not serialized static const int MAX = 1024; // not serialized }; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ By declaring `std::ostream` transient we can use this type where we need it and without soapcpp2 complaining that this class is not defined. ### Volatile classes and structs {#toxsd9-2} Classes and structs can be declared `volatile` with the gSOAP tools. This means that they are already declared elsewhere in our project's source code. We do not want soapcpp2 to generate a second definition for these types. For example, `struct tm` is declared in ``. We want it serializable and serialize only a selection of its data members: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} volatile struct tm { int tm_sec; // seconds (0 - 60) int tm_min; // minutes (0 - 59) int tm_hour; // hours (0 - 23) int tm_mday; // day of month (1 - 31) int tm_mon; // month of year (0 - 11) int tm_year; // year - 1900 }; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ We can declare classes and structs `volatile` for any such types we want to serialize by only providing the public data members we want to serialize. Colon notation is a simple and effective way to bind an existing class or struct to a schema. For example, we can change the `tm` name as follows without affecting the code that uses `struct tm` generated by soapcpp2: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} volatile struct ns:tm { ... } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This struct maps to a complexType in the soapcpp2-generated schema: ### Mutable classes and structs {#toxsd9-3} Classes and structs can be declared `mutable` with the gSOAP tools. This means that their definition can be spread out over the source code. This promotes the concept of a class or struct as a *row of named values*, also known as a *named tuple*, that can be extended at compile time in our source code with additional members. Because these types differ from the traditional object-oriented principles and design concepts of classes and objects, constructors and destructors cannot be defined (also because we cannot guarantee merging these into one such that all members will be initialized). A default constructor, copy constructor, assignment operation, and destructor will be assigned automatically by soapcpp2. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} mutable struct ns__tuple { @std::string id; }; mutable struct ns__tuple { std::string name; std::string value; }; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The members are collected into one definition generated by soapcpp2. Members may be repeated from one definition to another, but only if their associated types are identical. So, for example, a third extension with a `value` member with a different type fails: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} mutable struct ns__tuple { float value; // BAD: value is already declared std::string }; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The `mutable` concept has proven to be very useful when declaring and collecting SOAP Headers for multiple services, which are collected into one `struct SOAP_ENV__Header` by the soapcpp2 tool. ### Default member values in C and C++ {#toxsd9-4} Class and struct data members in C and C++ may be declared with an optional default initialization value that is provided "inline" with the declaration of the member: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} class ns__record { public: std::string name = "Joe"; ... }; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ These initializations are made by the default constructor that is added by soapcpp2 to each class and struct. A constructor is only added when a default constructor is not already defined with the class declaration. You can explicitly (re)initialize an object with the auto-generated `soap_default(struct soap*)` method of a class and the auto-generated `soap_default_T(struct soap*, T*)` function for a struct `T` in C and C++. Initializations can only be provided for members that have primitive types (`bool`, `enum`, `time_t`, numeric and string types). ### Attribute members {#toxsd9-5} Class and struct data members can be declared as XML attributes by annotating their type with a `@` with the declaration of the member: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} class ns__record { public: @std::string name; @uint64_t SSN; ns__record *spouse; }; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This class maps to a complexType in the soapcpp2-generated schema: An example XML instance of `ns__record` is: Attribute data members are restricted to primitive types (`bool`, `enum`, `time_t`, numeric and string types), `xsd__hexBinary`, `xsd__base64Binary`, and custom serializers, such as `xsd__dateTime`. Custom serializers for types that may be used as attributes MUST define `soap_s2T` and `soap_T2s` functions that convert values of type `T` to strings and back. Attribute data members can be pointers and smart pointers to these types, which permits attributes to be optional. ### Qualified and unqualified members {#toxsd9-6} Class, struct, and union data members are mapped to namespace qualified or unqualified tag names of local elements and attributes. If a data member has no prefix then the default form of qualification is applied based on the element/attribute form that is declared with the schema of the class, struct, or union type. If the member name has a namespace prefix by colon notation, then the prefix overrules the default (un)qualified form. Colon notation is an effective mechanism to control qualification of tag names of individual members of classes, structs, and unions. The XML schema elementFormDefault and attributeFormDefault declarations control the tag name qualification of local elements and attributes, respectively. - "unqualified" indicates that local elements/attributes are not qualified with the namespace prefix. - "qualified" indicates that local elements/attributes must be qualified with the namespace prefix. Individual schema declarations of local elements and attributes may overrule this by using the form declaration in a schema and by using colon notation to add namespace prefixes to class, struct, and union members in the header file for soapcpp2. Consider for example an `ns__record` class in the `ns` namespace in which local elements are qualified and local attributes are unqualified by default: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} //gsoap ns schema namespace: urn:types //gsoap ns schema elementForm: qualified //gsoap ns schema attributeForm: unqualified class ns__record { public: @std::string name; @uint64_t SSN; ns__record *spouse; }; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This class maps to a complexType in the soapcpp2-generated schema with targetNamespace "urn:types", elementFormDefault qualified and attributeFormDefault unqualified: An example XML instance of `ns__record` is: name="Jane" SSN="1987654320"> Note that the root element ns:record is qualified because it is a root element of the schema with target namespace "urn:types". Its local element ns:spouse is namespace qualified because the elementFormDefault of local elements is qualified. Attributes are unqualified. The default namespace (un)qualification of local elements and attributes can be overruled by adding a prefix to the member name by using colon notation: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} //gsoap ns schema namespace: urn:types //gsoap ns schema elementForm: qualified //gsoap ns schema attributeForm: unqualified class ns__record { public: @std::string ns:name; // 'ns:' qualified @uint64_t SSN; ns__record *:spouse; // ':' unqualified }; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The colon notation for member `ns:name` forces qualification of its attribute tag in XML. The colon notation for member `:spouse` removes qualification from its local element tag: XML instances of `ns__record` have unqualified spouse elements and qualified ns:name attributes: ns:name="Jane" SSN="1987654320"> Note that data members can also be prefixed using the `prefix__name` convention. However, this has a different effect by referring to global (root) elements and attributes, see [Defining document root elements](#toxsd9-7). @note You must declare a target namespace with a `//gsoap ns schema namespace:` directive to enable the `elementForm` and `attributeForm` directives in order to generate valid schemas with soapcpp2. ### Defining document root elements {#toxsd9-7} To define and reference XML document root elements we use type names that start with an underscore: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} class _ns__record ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Alternatively, we can use a typedef to define a document root element with a given type: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} typedef ns__record _ns__record; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This typedef maps to a global root element that is added to the soapcpp2-generated schema: An example XML instance of `_ns__record` is: Joe 1234567890 Jane 1987654320 Global-level element/attribute definitions are also referenced and/or added to the generated schema when serializable data members reference these by their qualified name: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} typedef std::string _ns__name 1 : 100; class _ns__record { public: @_QName xsi__type; // built-in XSD attribute xsi:type _ns__name ns__name; // ref to global ns:name element uint64_t SSN; _ns__record *spouse; }; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ These types map to the following comonents in the soapcpp2-generated schema: Use only use qualified member names when their types match the global-level element types that they refer to. For example: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} typedef std::string _ns__name; // global element ns:name of type xsd:string class _ns__record { public: int ns__name; // BAD: global element ns:name is NOT type int _ns__record ns__record; // OK: ns:record is a global-level root element ... }; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Therefore, we recommend to use qualified member names only when necessary to refer to standard XSD elements and attributes, such as `xsi__type`, and `xsd__lang`. By contrast, colon notation has the desired effect to (un)qualify local tag names by overruling the default element/attribute namespace qualification, see [Qualified and unqualified members](#toxsd9-6). ### (Smart) pointer members and their occurrence constraints {#toxsd9-8} A public pointer-typed data member is serialized by following its (smart) pointer(s) to the value pointed to. To serialize pointers to dynamic arrays of data, please see the next section on [Container members and their occurrence constraints](#toxsd9-9). Pointers that are NULL and smart pointers that are empty are serialized to produce omitted element and attribute values, unless an element is required and is nillable. To control the occurrence requirements of pointer-based data members, occurrence constraints are associated with data members in the form of a range `minOccurs : maxOccurs`. For non-repeatable (meaning, not a container or array) data members, there are only three reasonable occurrence constraints: - `0:0` means that this element or attribute is prohibited. - `0:1` means that this element or attribute is optional. - `1:1` means that this element or attribute is required. Pointer-based data members have a default `0:1` occurrence constraint, making them optional, and their XML schema local element/attribute definition is marked as nillable. Non-pointer data members have a default `1:1` occurence constraint, making them required. A pointer data member that is explicitly marked as required with `1:1` will be serialized as an element with an xsi:nil attribute, thus effectively revealing the NULL property of its value. A non-pointer data member that is explicitly marked as optional with `0:1` will be set to its default value when no XML value is presented to the deserializer. A default value can be assigned to data members that have primitive types. Consider for example: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} class ns__record { public: std::shared_ptr name; // optional (0:1) uint64_t SSN 0:1 = 999; // forced this to be optional with default 999 ns__record *spouse 1:1; // forced this to be required (only married people) }; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This class maps to a complexType in the soapcpp2-generated schema: An example XML instance of `ns__record` with its `name` string value set to `Joe`, `SSN` set to its default, and `spouse` set to NULL: Joe 999 @note In general, a smart pointer is simply declared as a `volatile` template in a gSOAP header file for soapcpp2: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} volatile template class NAMESPACE::shared_ptr; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @note The soapcpp2 tool generates code that uses `NAMESPACE::shared_ptr` and `NAMESPACE::make_shared` to create shared pointers to objects, where `NAMESPACE` is any valid C++ namespace such as `std` and `boost` if you have Boost installed. ### Container members and their occurrence constraints {#toxsd9-9} Class and struct data member types that are containers `std::deque`, `std::list`, `std::vector` and `std::set` are serialized as a collection of the values they contain. You can also serialize dynamic arrays, which is the alternative for C to store collections of data. Let's start with STL containers. You can use `std::deque`, `std::list`, `std::vector`, and `std::set` containers by importing: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #import "import/stl.h" // import all containers #import "import/stldeque.h" // import deque #import "import/stllist.h" // import list #import "import/stlvector.h" // import vector #import "import/stlset.h" // import set ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ For example, to use a vector data mamber to store names in a record: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #import "import/stlvector.h" class ns__record { public: std::vector names; uint64_t SSN; }; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ To limit the number of names in the vector within reasonable bounds, occurrence constraints are associated with the container. Occurrence constraints are of the form `minOccurs : maxOccurs`: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #import "import/stlvector.h" class ns__record { public: std::vector names 1:10; uint64_t SSN; }; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This class maps to a complexType in the soapcpp2-generated schema: @note In general, a container is simply declared as a template in a gSOAP header file for soapcpp2. All class templates are considered containers (except when declared `volatile`, see smart pointers). For example, `std::vector` is declared in `gsoap/import/stlvector.h` as: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} template class std::vector; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @note You can define and use your own containers. The soapcpp2 tool generates code that uses the following members of the `template class C` container: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} void C::clear() C::iterator C::begin() C::const_iterator C::begin() const C::iterator C::end() C::const_iterator C::end() const size_t C::size() const C::iterator C::insert(C::iterator pos, const T& val) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @note For more details see the example `simple_vector` container with documentation in the package under `gsoap/samples/template`. Because C does not support a container template library, we can use a dynamically-sized array of values. This array is declared as a size-pointer pair of members within a struct or class. The array size information is stored in a special size tag member with the name `__size` or `__sizeX`, where `X` can be any name, or by an `$int` member to identify the member as a special size tag: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} struct ns__record { $int sizeofnames; // array size char* *names; // array of char* names uint64_t SSN; }; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This class maps to a complexType in the soapcpp2-generated schema: To limit the number of names in the array within reasonable bounds, occurrence constraints are associated with the array size member. Occurrence constraints are of the form `minOccurs : maxOccurs`: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} struct ns__record { $int sizeofnames 1:10; // array size 1..10 char* *names; // array of one to ten char* names uint64_t SSN; }; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This class maps to a complexType in the soapcpp2-generated schema: ### Tagged union members {#toxsd9-10} A union member in a class or in a struct cannot be serialized unless a discriminating *variant selector* member is provided that tells the serializer which union field to serialize. This effectively creates a *tagged union*. The variant selector is associated with the union as a selector-union pair of members. The variant selector is a member with the name `__union` or `__unionX`, where `X` can be any name, or by an `$int` member to identify the member as a variant selector tag: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} class ns__record { public: $int xORnORs; // variant selector with values SOAP_UNION_fieldname union choice { float x; int n; char *s; } u; std::string name; }; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The variant selector values are auto-generated based on the union name `choice` and the names of its members `x`, `n`, and `s`: - `xORnORs = SOAP_UNION_choice_x` when `u.x` is valid. - `xORnORs = SOAP_UNION_choice_n` when `u.n` is valid. - `xORnORs = SOAP_UNION_choice_s` when `u.s` is valid. - `xORnORs = 0` when none are valid (should only be used with great care, because XML content validation may fail when content is required but absent). This class maps to a complexType with a sequence and choice in the soapcpp2-generated schema: An STL container or dynamic array of a union requires wrapping the variant selector and union member in a struct: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} class ns__record { public: std::vector< struct ns__data // data with a choice of x, n, or s { $int xORnORs; // variant selector with values SOAP_UNION_fieldname union choice { float x; int n; char *s; } u; }> data; // vector with data }; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ and an equivalent definition with a dynamic array instead of a `std::vector` (you can use this in C with structs): ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} class ns__record { public: $int sizeOfdata; // size of dynamic array struct ns__data // data with a choice of x, n, or s { $int xORnORs; // variant selector with values SOAP_UNION_fieldname union choice { float x; int n; char *s; } u; } *data; // points to the data array of length sizeOfdata }; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This maps to two complexTypes in the soapcpp2-generated schema: The XML value space consists of a sequence of item elements each wrapped in an data element: 123 3.1 hello world To remove the wrapping data element, simply rename the wrapping struct and member to `__data` to make this member invisible to the serializer with the double underscore prefix naming convention. Also use a dynamic array instead of a STL container (you can use this in C with structs): ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} class ns__record { public: $int sizeOfdata; // size of dynamic array struct __data // contains choice of x, n, or s { $int xORnORs; // variant selector with values SOAP_UNION_fieldname union choice { float x; int n; char *s; } u; } *__data; // points to the data array of length sizeOfdata }; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This maps to a complexType in the soapcpp2-generated schema: The XML value space consists of a sequence of x, n, and/or s elements: 123 3.1 hello world Please note that structs, classes, and unions are unnested by soapcpp2 (as in the C standard of nested structs and unions). Therefore, the `choice` union in the `ns__record` class is redeclared at the top level despite its nesting within the `ns__record` class. This means that you will have to choose a unique name for each nested struct, class, and union. ### Tagged void pointer members {#toxsd9-11} To serialize data pointed to by `void*` requires run-time type information that tells the serializer what type of data to serialize by means of a *tagged void pointer*. This type information is stored in a special type tag member of a struct/class with the name `__type` or `__typeX`, where `X` can be any name, or alternatively by an `$int` special member of any name as a type tag: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} class ns__record { public: $int typeOfdata; // type tag with values SOAP_TYPE_T void *data; // points to some data of type T }; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ A type tag member has nonzero values `SOAP_TYPE_T` where `T` is the name of a struct/class or the name of a primitive type, such as `int`, `std__string` (for `std::string`), `string` (for `char*`). This class maps to a complexType with a sequence in the soapcpp2-generated schema: The XML value space consists of the XML value space of the type with the addition of an xsi:type attribute to the enveloping element: 123 This xsi:type attribute is important for the receiving end to distinguish the type of data to instantiate. The receiver cannot deserialize the data without an xsd:type attribute. You can find the `SOAP_TYPE_T` name of each serializable type in the auto-generated soapStub.h file. Also all serializable C++ classes have a virtual `int T::soap_type()` member that returns their `SOAP_TYPE_T` value that you can use. When the `void*` pointer is NULL or when `typeOfdata` is zero, the data is not serialized. An STL container or dynamic array of `void*` pointers to xsd:anyType data requires wrapping the type tag and `void*` members in a struct: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} class ns__record { public: std::vector< struct ns__data // data with an xsd:anyType item { $int typeOfitem; // type tag with values SOAP_TYPE_T void *item; // points to some item of type T }> data; // vector with data }; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ and an equivalent definition with a dynamic array instead of a `std::vector` (you can use this in C with structs): ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} class ns__record { public: $int sizeOfdata; // size of dynamic array struct ns__data // data with an xsd:anyType item { $int typeOfitem; // type tag with values SOAP_TYPE_T void *item; // points to some item of type T } *data; // points to the data array of length sizeOfdata }; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This maps to two complexTypes in the soapcpp2-generated schema: The XML value space consists of a sequence of item elements each wrapped in a data element: 123 3.1 abc To remove the wrapping data elements, simply rename the wrapping struct and member to `__data` to make this member invisible to the serializer with the double underscore prefix naming convention. Also use a dynamic array instead of a STL container (you can use this in C with structs): ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} class ns__record { public: $int sizeOfdata; // size of dynamic array struct __data // contains xsd:anyType item { $int typeOfitem; // type tag with values SOAP_TYPE_T void *item; // points to some item of type T } *__data; // points to the data array of length sizeOfdata }; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This maps to a complexType in the soapcpp2-generated schema: The XML value space consists of a sequence of data elements: 123 3.1 abc Again, please note that structs, classes, and unions are unnested by soapcpp2 (as in the C standard of nested structs and unions). Therefore, the `__data` struct in the `ns__record` class is redeclared at the top level despite its nesting within the `ns__record` class. This means that you will have to choose a unique name for each nested struct, class, and union. @see Section [XSD type bindings](#typemap2). ### Adding get and set methods {#toxsd9-12} A public `get` method may be added to a class or struct, which will be triggered by the deserializer. This method will be invoked right after the instance is populated by the deserializer. The `get` method can be used to update or verify deserialized content. It should return `SOAP_OK` or set `soap::error` to a nonzero error code and return it. A public `set` method may be added to a class or struct, which will be triggered by the serializer. The method will be invoked just before the instance is serialized. Likewise, the `set` method should return `SOAP_OK` or set set `soap::error` to a nonzero error code and return it. For example, adding a `set` and `get` method to a class declaration: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} class ns__record { public: int set(struct soap*); // triggered before serialization int get(struct soap*); // triggered after deserialization ... }; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ To add these and othe rmethods to classes and structs with wsdl2h and `typemap.dat`, please see [Class/struct member additions](#typemap3). ### Operations on classes and structs {#toxsd9-13} The following functions/macros are generated by soapcpp2 for each type `T`, which should make it easier to send, receive, and copy XML data in C and in C++: - `int soap_write_T(struct soap*, T*)` writes an instance of `T` to a file via file descriptor `int soap::sendfd)` or to a stream via `std::ostream *soap::os` (C++ only) or saves into a NUL-terminated string by setting `const char **soap::os` to a string pointer to be set (C only). Returns `SOAP_OK` on success or an error code, also stored in `soap->error`. - `int soap_read_T(struct soap*, T*)` reads an instance of `T` from a file via file descriptor `int soap::recvfd)` or from a stream via `std::istream *soap::is` (C++ only) or reads from a NUL-termianted string `const char *soap::is` (C only). Returns `SOAP_OK` on success or an error code, also stored in `soap->error`. - `void soap_default_T(struct soap*, T*)` sets an instance `T` to its default value, resetting members of a struct to their initial values (for classes we use method `T::soap_default`, see below). - `T * soap_dup_T(struct soap*, T *dst, const T *src)` (soapcpp2 option `-Ec`) deep copy `src` into `dst`, replicating all deep cycles and shared pointers when a managing soap context is provided as argument. When `dst` is NULL, allocates space for `dst`. Deep copy is a tree when argument is NULL, but the presence of deep cycles will lead to non-termination. Use flag `SOAP_XML_TREE` with managing context to copy into a tree without cycles and pointers to shared objects. Returns `dst` (or allocated space when `dst` is NULL). - `void soap_del_T(const T*)` (soapcpp2 option `-Ed`) deletes all heap-allocated members of this object by deep deletion ONLY IF this object and all of its (deep) members are not managed by a soap context AND the deep structure is a tree (no cycles and co-referenced objects by way of multiple (non-smart) pointers pointing to the same data). Can be safely used after `soap_dup(NULL)` to delete the deep copy. Does not delete the object itself. When in C++ mode, soapcpp2 tool adds several methods to classes and structs, in addition to adding a default constructor and destructor (when these were not explicitly declared). The public methods added to a class/struct `T`: - `virtual int T::soap_type(void)` returns a unique type ID (`SOAP_TYPE_T`). This numeric ID can be used to distinguish base from derived instances. - `virtual void T::soap_default(struct soap*)` sets all data members to default values. - `virtual void T::soap_serialize(struct soap*) const` serializes object to prepare for SOAP 1.1/1.2 encoded output (or with `SOAP_XML_GRAPH`) by analyzing its (cyclic) structures. - `virtual int T::soap_put(struct soap*, const char *tag, const char *type) const` emits object in XML, compliant with SOAP 1.1 encoding style, return error code or `SOAP_OK`. Requires `soap_begin_send(soap)` and `soap_end_send(soap)`. - `virtual int T::soap_out(struct soap*, const char *tag, int id, const char *type) const` emits object in XML, with tag and optional id attribute and xsi:type, return error code or `SOAP_OK`. Requires `soap_begin_send(soap)` and `soap_end_send(soap)`. - `virtual void * T::soap_get(struct soap*, const char *tag, const char *type)` Get object from XML, compliant with SOAP 1.1 encoding style, return pointer to object or NULL on error. Requires `soap_begin_recv(soap)` and `soap_end_recv(soap)`. - `virtual void *soap_in(struct soap*, const char *tag, const char *type)` Get object from XML, with matching tag and type (NULL matches any tag and type), return pointer to object or NULL on error. Requires `soap_begin_recv(soap)` and `soap_end_recv(soap)` - `virtual T * T::soap_alloc(void) const` returns a new object of type `T`, default initialized and not managed by a soap context. - `virtual T * T::soap_dup(struct soap*) const` (soapcpp2 option `-Ec`) returns a duplicate of this object by deep copying, replicating all deep cycles and shared pointers when a managing soap context is provided as argument. Deep copy is a tree when argument is NULL, but the presence of deep cycles will lead to non-termination. Use flag `SOAP_XML_TREE` with the managing context to copy into a tree without cycles and pointers to shared objects. - `virtual void T::soap_del() const` (soapcpp2 option `-Ed`) deletes all heap-allocated members of this object by deep deletion ONLY IF this object and all of its (deep) members are not managed by a soap context AND the deep structure is a tree (no cycles and co-referenced objects by way of multiple (non-smart) pointers pointing to the same data). Can be safely used after `soap_dup(NULL)` to delete the deep copy. Does not delete the object itself. Special classes and structs {#toxsd10} --------------------------- ### SOAP encoded arrays {#toxsd10-1} A class or struct with the following layout is a one-dimensional SOAP encoded Array type: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} class ArrayOfT { public: T *__ptr; // array pointer int __size; // array size }; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ where `T` is the array element type. A multidimensional SOAP Array is: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} class ArrayOfT { public: T *__ptr; // array pointer int __size[N]; // array size of each dimension }; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ where `N` is the constant number of dimensions. The pointer points to an array of `__size[0]*__size[1]* ... * __size[N-1]` elements. This maps to a complexType restriction of SOAP-ENC:Array in the soapcpp2-generated schema: The name of the class can be arbitrary. We often use `ArrayOfT` without a prefix to distinguish arrays from other classes and structs. With SOAP 1.1 encoding, an optional offset member can be added that controls the start of the index range for each dimension: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} class ArrayOfT { public: T *__ptr; // array pointer int __size[N]; // array size of each dimension int __offset[N]; // array offsets to start each dimension }; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ For example, we can define a matrix of floats as follows: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} class Matrix { public: double *__ptr; int __size[2]; }; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The following code populates the matrix and serializes it in XML: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} soap *soap = soap_new1(SOAP_XML_INDENT); Matrix A; double a[6] = { 1, 2, 3, 4, 5, 6 }; A.__ptr = a; A.__size[0] = 2; A.__size[1] = 3; soap_write_Matrix(soap, &A); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Matrix A is serialized as an array with 2x3 values: 1 2 3 4 5 6 ### XSD hexBinary and base64Binary types {#toxsd10-2} A special case of a one-dimensional array is used to define xsd:hexBinary and xsd:base64Binary types when the pointer type is `unsigned char`: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} class xsd__hexBinary { public: unsigned char *__ptr; // points to raw binary data int __size; // size of data }; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ and ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} class xsd__base64Binary { public: unsigned char *__ptr; // points to raw binary data int __size; // size of data }; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ### MIME/MTOM attachment binary types {#toxsd10-3} A class or struct with a binary content layout can be extended to support MIME/MTOM (and older DIME) attachments, such as in xop:Include elements: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} //gsoap xop schema import: http://www.w3.org/2004/08/xop/include class _xop__Include { public: unsigned char *__ptr; // points to raw binary data int __size; // size of data char *id; // NULL to generate an id, or set to a unique UUID char *type; // MIME type of the data char *options; // optional description of MIME attachment }; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Attachments are beyond the scope of this document and we refer to the gSOAP user guide for more details. ### Wrapper class/struct with simpleContent {#toxsd10-4} A class or struct with the following layout is a complexType that wraps simpleContent: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} class ns__simple { public: T __item; }; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The type `T` is a primitive type (`bool`, `enum`, `time_t`, numeric and string types), `xsd__hexBinary`, `xsd__base64Binary`, and custom serializers, such as `xsd__dateTime`. This maps to a complexType with simpleContent in the soapcpp2-generated schema: A wrapper class/struct may include any number of attributes declared with `@`. ### DOM anyType and anyAttribute {#toxsd10-5} Use of a DOM is optional and enabled by `#import "dom.h"` to use the DOM `xsd__anyType` element node and `xsd__anyAttribute` attribute node: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #import "dom.h" class ns__record { public: @xsd__anyAttribute attributes; // list of DOM attributes ... xsd__anyType *name; // optional DOM element }; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ where `name` contains XML stored in a DOM node set and `attributes` is a list of all visibly rendered attributes. The name `attributes` is arbitrary and any name will suffice. We should place the `xsd__anyType` members at the end of the struct or class. This ensures that the DOM members are populated last as a "catch all". A member name starting with double underscore is a wildcard member name and matches any XML tag. These members are placed at the end of a struct or class automatically by soapcpp2. An `#import "dom.h"` import is automatically added by wsdl2h with option `-d` to bind xsd:anyType to DOM nodes, and also to populate xsd:any, xsd:anyAttribute and xsd:mixed XML content: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #import "dom.h" class ns__record { public: ... @xsd__anyAttribute __anyAttribute; // optional DOM attributes std::vector __any 0; // optional DOM elements xsd__anyType __mixed 0; // optional mixed content }; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ where the members prefixed with `__` are "invisible" to the XML parser, meaning that these members are not bound to XML tag names. In C you can use a dynamic arrary instead of `std::vector`: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} #import "dom.h" struct ns__record { ... @xsd__anyAttribute __anyAttribute; // optional DOM attributes $int __sizeOfany; // size of the array xsd__anyType *__any; // optional DOM elements xsd__anyType __mixed 0; // optional mixed content }; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Classes can inherit DOM, which enables full use of polymorphism with one base DOM class: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #import "dom.h" class ns__record : public xsd__anyType { ... std::vector array; // array of objects of any class }; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This permits an `xsd__anyType` pointer to refer to a derived class such as `ns__record`, which will be serialized with an xsi:type attribute that is set to "ns:record". The xsi:type attributes add the necessary type information to distinguish the XML content from the DOM base type. This is important for the receiving end: without xsd:type attributes with type names, only base DOM objects are recognized and instantiated. Because C lacks OOP principles such as class inheritance and polymorphism, you will need to use the special [`void*` members](#toxsd9-11) to serialize data pointed to by a `void*` member. To ensure that wsdl2h generates pointer-based `xsd__anyType` DOM nodes with option `-d` for xsd:any, add the following line to `typemap.dat`: xsd__any = | xsd__anyType* This lets wsdl2h produce class/struct members and containers with `xsd__anyType*` for xsd:any instead of `xsd__anyType`. To just force all xsd:anyType uses to be pointer-based, declare in `typemap.dat`: xsd__anyType = | xsd__anyType* If you use wsdl2h with option `-p` with option `-d` then every class will inherit DOM as shown above. Without option `-d`, an `xsd__anyType` type is generated to serve as the root type in the type hierarchy: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} class xsd__anyType { _XML __item; struct soap *soap; }; class ns__record : public xsd__anyType { ... }; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ where the `_XML __item` member holds any XML content as a literal XML string. To use the DOM API, compile `dom.c` (or `dom.cpp` for C++), or link with `-lgsoapssl` (or `-lgsoapssl++` for C++). @see Documentation of the [gSOAP DOM parser](http://www.genivia.com/doc/dom/html) for more details. Serialization rules {#rules} =================== A presentation on XML data bindings is not complete without discussing the serialization rules and options that put your data in XML on the wire or store it a file or buffer. There are several options to choose from to serialize data in XML. The choice depends on the use of the SOAP protocol or if SOAP is not required. The wsdl2h tool automates this for you by taking the WSDL transport bindings into account when generating the service functions in C and C++ that use SOAP or REST. The gSOAP tools are not limited to SOAP. The tools implement generic XML data bindings for SOAP, REST, and other uses of XML. So you can read and write XML using the serializing [Operations on classes and structs](#toxsd9-13). The following sections briefly explain the serialization rules with respect to the SOAP protocol for XML Web services. A basic understanding of the SOAP protocol is useful when developing client and server applications that must interoperate with other SOAP applications. SOAP/REST Web service client and service operations are represented as functions in our gSOAP header file for soapcpp2. The soapcpp2 tool will translate these function to client-side service invocation calls and server-side service operation dispatchers. A discussion of SOAP clients and servers is beyond the scope of this document. However, the SOAP options discussed here also apply to SOAP client and server development. SOAP document versus rpc style {#doc-rpc} ------------------------------ The `wsdl:binding/soap:binding/@style` attribute in the wsdl:binding section of a WSDL is either "document" or "rpc". The "rpc" style refers to SOAP RPC (Remote Procedure Call), which is more restrictive than the "document" style by requiring one XML element in the SOAP Body to act as the procedure name with XML subelements as its parameters. For example, the following directives in the gSOAP header file for soapcpp2 declare that `DBupdate` is a SOAP RPC encoding service method: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} //gsoap ns service namespace: urn:DB //gsoap ns service method-protocol: DBupdate SOAP //gsoap ns service method-style: DBupdate rpc int ns__DBupdate(...); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The XML payload has a SOAP envelope, optional SOAP header, and a SOAP body with one element representing the operation with the parameters as subelements: ... The "document" style puts no restrictions on the SOAP Body content. However, we recommend that the first element's tag name in the SOAP Body should be unique to each type of operation, so that the receiver can dispatch the operation based on this element's tag name. Alternatively, the HTTP URL path can be used to specify the operation, or the HTTP action header can be used to dispatch operations automatically on the server side (soapcpp2 options -a and -A). SOAP literal versus encoding {#lit-enc} ---------------------------- The `wsdl:operation/soap:body/@use` attribute in the wsdl:binding section of a WSDL is either "literal" or "encoded". The "encoded" use refers to the SOAP encoding rules that support id-ref multi-referenced elements to serialize data as graphs. SOAP encoding is very useful if the data internally forms a graph (including cycles) and we want the graph to be serialized in XML in a format that ensures that its structure is preserved. In that case, SOAP 1.2 encoding is the best option. SOAP encoding also adds encoding rules for [SOAP arrays](toxsd10) to serialize multi-dimensional arrays. The use of XML attributes to exchange XML data in SOAP encoding is not permitted. The only attributes permitted are the standard XSD attributes, SOAP encoding attributes (such as for arrays), and id-ref. For example, the following directives in the gSOAP header file for soapcpp2 declare that `DBupdate` is a SOAP RPC encoding service method: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} //gsoap ns service namespace: urn:DB //gsoap ns service method-protocol: DBupdate SOAP //gsoap ns service method-style: DBupdate rpc //gsoap ns service method-encoding: DBupdate encoded int ns__DBupdate(...); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The XML payload has a SOAP envelope, optional SOAP header, and a SOAP body with an encodingStyle attribute for SOAP 1.1 encoding and an element representing the operation with parameters that are SOAP 1.1 encoded: 1234567890 Jane 1987654320 2345678901 Joe Note that the name "Joe" is shared by two records and the string is referenced by SOAP 1.1 href and id attributes. While gSOAP only introduces multi-referenced elements in the payload when they are actually multi-referenced in the data graph, other SOAP applications may render multi-referenced elements more aggressively. The example could also be rendered as: 1234567890 1987654320 2345678901 Joe Jane SOAP 1.2 encoding is cleaner and produces more accurate XML encodings of data graphs by setting the id attribute on the element that is referenced: Joe 1234567890 Jane 1987654320 2345678901 @note Some SOAP 1.2 applications consider the namespace `SOAP-ENC` of `SOAP-ENC:id` and `SOAP-ENC:ref` optional. The gSOAP SOAP 1.2 encoding serialization follows the 2007 standard, while accepting unqualified id and ref attributes. To remove all rendered id-ref multi-referenced elements in gSOAP, use the `SOAP_XML_TREE` flag to initialize the gSOAP engine context. Some XML validation rules are turned off with SOAP encoding, because of the presence of additional attributes, such as id and ref/href, SOAP arrays with arbitrary element tags for array elements, and the occurrence of additional multi-ref elements in the SOAP 1.1 Body. The use of "literal" puts no restrictions on the XML in the SOAP Body. Full XML validation is possible, which can be enabled with the `SOAP_XML_STRICT` flag to initialize the gSOAP engine context. However, data graphs will be serialized as trees and cycles in the data will be cut from the XML rendition. SOAP 1.1 versus SOAP 1.2 {#soap} ------------------------ There are two SOAP protocol versions: 1.1 and 1.2. The gSOAP tools can switch between the two versions seamlessly. You can declare the default SOAP version for a service operation as follows: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} //gsoap ns service method-protocol: DBupdate SOAP1.2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The gSOAP soapcpp2 auto-generates client and server code. At the client side, this operation sends data with SOAP 1.2 but accepts responses also in SOAP 1.1. At the server side, this operation accepts requests in SOAP 1.1 and 1.2 and will return responses in the same SOAP version. As we discussed in the previous section, the SOAP 1.2 protocol has a cleaner multi-referenced element serialization format that greatly enhances the accuracy of data graph serialization with SOAP RPC encoding and is therefore recommended. The SOAP 1.2 protocol default can also be set by importing and loading `gsoap/import/soap12.h`: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #import "soap12.h" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Non-SOAP XML serialization {#non-soap} -------------------------- You can serialize data that is stored on the heap, on the stack (locals), and static data as long as the serializable (i.e. non-transient) members are properly initialized and pointers in the structures are either NULL or point to valid structures. Deserialized data is put on the heap and managed by the gSOAP engine context `struct soap`, see also [Memory management](#memory). You can read and write XML directly to a file or stream with the serializing [Operations on classes and structs](#toxsd9-13). To define and use XML Web service client and service operations, we can declare these operations in our gSOAP header file for soapcpp2 as functions that soapcpp2 will translate in client-side service invocation calls and server-side service operation dispatchers. These functions are auto-generated by wsdl2h from WSDLs. Note that XSDs do not include service definitions. The REST operations POST, GET, and PUT are declared with gSOAP directives in the gSOAP header file for soapcpp2. For example, a REST POST operation is declared as follows: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} //gsoap ns service namespace: urn:DB //gsoap ns service method-protocol: DBupdate POST int ns__DBupdate(...); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ There is no SOAP Envelope and no SOAP Body in the payload for `DBupdate`. Also the XML serialization rules are identical to SOAP document/literal. The XML payload only has the operation name as an element with its parameters serialized as subelements: ... To force id-ref serialization with REST similar to SOAP 1.2 multi-reference encoding, use the `SOAP_XML_GRAPH` flag to initialize the gSOAP engine context. The XML serialization includes id and ref attributes for multi-referenced elements as follows: Joe 1234567890 Jane 1987654320 2345678901 Input and output {#io} ================ Reading and writing XML from/to files, streams and string buffers is done via the managing context by setting one of the following context members that control IO sources and sinks: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} soap->recvfd = fd; // an int file descriptor to read from (0 by default) soap->sendfd = fd; // an int file descriptor to write to (1 by default) soap->is = &is; // C++ only: a std::istream is object to read from soap->os = &os; // C++ only: a std::ostream os object to write to soap->is = cs; // C only: a const char* string to read from (soap->is will advance) soap->os = &cs; // C only: pointer to a const char*, will be set to point to the string output ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Normally, all of these context members are NULL, which is required to send and receive data over sockets by gSOAP clients and servers. Therefore, if you set any of these context members in a client or server application then you MUST reset them to NULL to ensure that socket communications are not blocked. Note: the use of `soap->is` and `soap->os` in C requires gSOAP 2.8.28 or later. In the following sections, we present more details on how to read and write to files and streams, and use string buffers as sources and sinks for XML data. In addition, you can set IO callback functions to handle IO at a lower level. For more details, see the gSOAP user guide. Reading and writing from/to files and streams {#io1} --------------------------------------------- The default IO is standard input and output. Other sources and sinks (those listed above) will be used until you (re)set them. For example with file-based input and output: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} FILE *fp = fopen("record.xml", "r"); if (fp != NULL) { soap->recvfd = fileno(fp); // get file descriptor of file to read from if (soap_read_ns__record(soap, &pers1)) ... // handle IO error fclose(fp); soap->recvfd = 0; // read from stdin, or -1 to block reading } FILE *fp = fopen("record.xml", "w"); if (fp != NULL) { soap->sendfd = fileno(fp); // get file descriptor of file to write to if (soap_write_ns__record(soap, &pers1)) ... // handle IO error fclose(fp); soap->sendfd = 1; // write to stdout, or -1 to block writing } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Similar code with streams in C++: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #include std::fstream fs; fs.open("record.xml", std::ios::in); if (fs) { soap->is = &fs; if (soap_read__ns__record(soap, &pers1)) ... // handle IO error fs.close(); soap->is = NULL; } fs.open("record.xml", std::ios::out); if (fs) { soap->os = &fs; if (soap_write__ns__record(soap, &pers1)) ... // handle IO error fs.close(); soap->os = NULL; } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Reading and writing from/to string buffers {#io2} ------------------------------------------ For C++ we recommend to use `std::stringstream` objects from `` as illustrated in the following example: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #include std::stringstream ss; ss.str("..."); // XML to parse soap->is = &ss; if (soap_read__ns__record(soap, &pers1)) ... // handle IO error soap->is = NULL; soap->os = &ss; if (soap_write__ns__record(soap, &pers1)) ... // handle IO error soap->os = NULL; std::string s = ss.str(); // string with XML ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ For C we can use `soap->is` and `soap->os` to point to strings of XML content as follows (this requires gSOAP 2.8.28 or later): ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} soap->is = "..."; // XML to parse if (soap_read__ns__record(soap, &pers1)) ... // handle IO error soap->is = NULL; const char *cs = NULL; soap->os = &cs; if (soap_write__ns__record(soap, &pers1)) ... // handle IO error soap->os = NULL; ... = cs; // string with XML (do not free(cs): managed by the context and freed with soap_end()) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Note that `soap->os` is a pointer to a `const char*` string. The pointer is set by the managing context to point to the XML data that is stored on the context-managed heap. For earlier gSOAP versions we recommend to use IO callbacks `soap->frecv` and `soap->fsend` as shown in the gSOAP user guide. Memory management {#memory} ================= Memory management with the `soap` context enables us to allocate data in context-managed heap space that can be collectively deleted. All deserialized data is placed on the context-managed heap by the gSOAP engine. Memory management in C {#memory1} ---------------------- In C (wsdl2h option `-c` and soapcpp2 option `-c`), the gSOAP engine allocates data on a context-managed heap with: - `void *soap_malloc(struct soap*, size_t len)`. You can also make shallow copies of data with `soap_memdup` that uses `soap_malloc` and a safe version of `memcpy` to copy a chunk of data `src` with length `len` to the context-managed heap: - `void *soap_memdup(struct soap*, const void *src, size_t len)` This function returns a pointer to the copy. This function requires gSOAP 2.8.27 or later. The `soap_malloc` function is a wrapper around `malloc`, but which also permits the `struct soap` context to track all heap allocations for collective deletion with `soap_end(soap)`: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #include "soapH.h" #include "ns.nsmap" ... struct soap *soap = soap_new(); // new context ... struct ns__record *record = soap_malloc(soap, sizeof(struct ns__record)); soap_default_ns__record(soap, record); ... soap_destroy(soap); // only for C++, see section on C++ below soap_end(soap); // delete record and all other heap allocations soap_free(soap); // delete context ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The soapcpp2 auto-generated deserializers in C use `soap_malloc` to allocate and populate deserialized structures, which are managed by the context for collective deletion. To make `char*` and `wchar_t*` string copies to the context-managed heap, we can use the functions: - `char *soap_strdup(struct soap*, const char *str)` and - `wchar_t *soap_wstrdup(struct soap*, const wchar_t *wstr)`. We use the soapcpp2 auto-generated `soap_dup_T` functions to duplicate data into another context (this requires soapcpp2 option `-Ec` to generate), here shown for C with the second argument `dst` NULL because we want to allocate a new managed structure: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} struct soap *other_soap = soap_new(); // another context struct ns__record *other_record = soap_dup_ns__record(other_soap, NULL, record); ... soap_destroy(other_soap); // only for C++, see section on C++ below soap_end(other_soap); // delete other_record and all of its deep data soap_free(other_soap); // delete context ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Note that the only reason to use another context and not to use the primary context is when the primary context must be destroyed together with all of the objects it manages while some of the objects must be kept alive. If the objects that are kept alive contain deep cycles then this is the only option we have, because deep copy with a managing context detects and preserves these cycles unless the `SOAP_XML_TREE` flag is used with the context: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} struct soap *other_soap = soap_new1(SOAP_XML_TREE); // another context struct ns__record *other_record = soap_dup_ns__record(other_soap, NULL, record); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The resulting deep copy will be a full copy of the source data structure as a tree without co-referenced data (i.e. no digraph) and without cycles. Cycles are pruned and (one of the) pointers that forms a cycle is repaced by NULL. We can also deep copy into unmanaged space and use the auto-generated `soap_del_T()` function (requires soapcpp2 option `-Ed` to generate) to delete it later, but we MUST NOT do this for any data that we suspect has deep cycles: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} struct ns__record *other_record = soap_dup_ns__record(NULL, NULL, record); ... soap_del_ns__record(other_record); // deep delete record data members free(other_record); // delete the record ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Cycles in the data structure will lead to non-termination when making unmanaged deep copies. Consider for example: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} struct ns__record { const char *name; uint64_t SSN; ns__record *spouse; }; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Our code to populate a structure with a mutual spouse relationship: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} struct soap *soap = soap_new(); ... struct ns__record pers1, pers2; soap_default_ns__record(soap, &pers1); soap_default_ns__record(soap, &pers2); pers1.name = "Joe"; // OK to serialize static data pers1.SSN = 1234567890; pers1.spouse = &pers2; pers2.name = soap_strdup(soap, "Jane"); // allocates and copies a string pers2.SSN = 1987654320; pers2.spouse = &pers1; ... struct ns__record *pers3 = soap_dup_ns__record(NULL, NULL, &pers1); // BAD struct ns__record *pers4 = soap_dup_ns__record(soap, NULL, &pers1); // OK soap_set_mode(soap, SOAP_XML_TREE); struct ns__record *pers5 = soap_dup_ns__record(soap, NULL, &pers1); // OK ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ As we can see, the gSOAP serializer can serialize any heap, stack, or static allocated data, such as in our code above. So we can serialize the stack-allocated `pers1` record as follows: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} FILE *fp = fopen("record.xml", "w"); if (fp != NULL) { soap->sendfd = fileno(fp); // file descriptor to write to soap_set_mode(soap, SOAP_XML_GRAPH); // support id-ref w/o requiring SOAP soap_clr_mode(soap, SOAP_XML_TREE); // if set, clear soap_write_ns__record(soap, &pers1); fclose(fp); soap->sendfd = -1; // block further writing } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ which produces an XML document record.xml that is similar to: Joe 1234567890 Jane 1987654320 Deserialization of an XML document with a SOAP 1.1/1.2 encoded id-ref graph leads to the same non-termination problem when we later try to copy the data into unmanaged space: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} struct soap *soap = soap_new1(SOAP_XML_GRAPH); // support id-ref w/o SOAP ... struct ns__record pers1; FILE *fp = fopen("record.xml", "r"); if (fp != NULL) { soap->recvfd = fileno(fp); if (soap_read_ns__record(soap, &pers1)) ... // handle IO error fclose(fp); soap->recvfd = -1; // blocks further reading } ... struct ns__record *pers3 = soap_dup_ns__record(NULL, NULL, &pers1); // BAD struct ns__record *pers4 = soap_dup_ns__record(soap, NULL, &pers1); // OK soap_set_mode(soap, SOAP_XML_TREE); struct ns__record *pers5 = soap_dup_ns__record(soap, NULL, &pers1); // OK ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Copying data with `soap_dup_T(soap)` into managed space is always safe. Copying into unmanaged space requires diligence. But deleting unmanaged data is easy with `soap_del_T()`. We can also use `soap_del_T()` to delete structures that we created in C, but only if these structures are created with `malloc` and do NOT contain pointers to stack and static data. Memory management in C++ {#memory2} ------------------------ In C++, the gSOAP engine allocates data on a managed heap using a combination of `void *soap_malloc(struct soap*, size_t len)` and `soap_new_T()`, where `T` is the name of a class, struct, or class template (container or smart pointer). Heap allocation is tracked by the `struct soap` context for collective deletion with `soap_destroy(soap)` and `soap_end(soap)`. Only structs, classes, and class templates are allocated with `new` via `soap_new_T(struct soap*)` and mass-deleted with `soap_destroy(soap)`. There are four variations of `soap_new_T` for class/struct/template type `T` that soapcpp2 auto-generates to create instances on a context-managed heap: - `T * soap_new_T(struct soap*)` returns a new instance of `T` with default data member initializations that are set with the soapcpp2 auto-generated `void T::soap_default(struct soap*)` method), but ONLY IF the soapcpp2 auto-generated default constructor is used that invokes `soap_default()` and was not replaced by a user-defined default constructor. - `T * soap_new_T(struct soap*, int n)` returns an array of `n` new instances of `T`. Similar to the above, instances are initialized. - `T * soap_new_req_T(struct soap*, ...)` returns a new instance of `T` and sets the required data members to the values specified in `...`. The required data members are those with nonzero minOccurs, see the subsections on [(Smart) pointer members and their occurrence constraints](#toxsd9-8) and [Container members and their occurrence constraints](#toxsd9-9). - `T * soap_new_set_T(struct soap*, ...)` returns a new instance of `T` and sets the public/serializable data members to the values specified in `...`. The above functions can be invoked with a NULL `soap` context, but we will be responsible to use `delete T` to remove this instance from the unmanaged heap. Primitive types and arrays of these are allocated with `soap_malloc` by the gSOAP engine. As we stated above, all types except for classes, structs, class templates (containers and smart pointers) are allocated with `soap_malloc` for reasons of efficiency. We can use a C++ template to simplify the managed allocation and initialization of primitive values as follows (this is for primitive types only, because we should allocate structs and classes with `soap_new_T`): ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} template T * soap_make(struct soap *soap, T val) { T *p = (T*)soap_malloc(soap, sizeof(T)); if (p) // out of memory? Can also guard with assert(p != NULL) or throw an error *p = val; return p; } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ For example, assuming we have the following class: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} class ns__record { public: std::string name; // required name uint64_t *SSN; // optional SSN ns__record *spouse; // optional spouse }; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ We can instantiate a record by using the auto-generated `soap_new_set_ns__record` and our `soap_make` to create a SSN value on the managed heap: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} soap *soap = soap_new(); // new context ... ns__record *record = soap_new_set_ns__record( soap, "Joe", soap_make(soap, 1234567890LL), NULL); ... soap_destroy(soap); // delete record and all other managed instances soap_end(soap); // delete managed soap_malloc'ed heap data soap_free(soap); // delete context ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Note however that the gSOAP serializer can serialize any heap, stack, or static allocated data. So we can also create a new record as follows: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} uint64_t SSN = 1234567890LL; ns__record *record = soap_new_set_ns__record(soap, "Joe", &SSN, NULL); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ which will be fine to serialize this record as long as the local `SSN` stack-allocated value remains in scope when invoking the serializer and/or using `record`. It does not matter if `soap_destroy` and `soap_end` are called beyond the scope of `SSN`. To facilitate our class methods to access the managing context, we can add a soap context pointer to a class/struct: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} class ns__record { ... void create_more(); // needs a context to create more internal data protected: struct soap *soap; // the context that manages this instance, or NULL }; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The context is set when invoking `soap_new_T` (and similar) with a non-NULL context argument. We use the soapcpp2 auto-generated `soap_dup_T` functions to duplicate data into another context (this requires soapcpp2 option `-Ec` to generate), here shown for C++ with the second argument `dst` NULL because we want to allocate a new managed object: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} soap *other_soap = soap_new(); // another context ns__record *other_record = soap_dup_ns__record(other_soap, NULL, record); ... soap_destroy(other_soap); // delete record and other managed instances soap_end(other_soap); // delete other data (the SSNs on the heap) soap_free(other_soap); // delete context ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ To duplicate base and derived instances when a base class pointer or reference is provided, use the auto-generated method `T * T::soap_dup(struct soap*)`: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} soap *other_soap = soap_new(); // another context ns__record *other_record = record->soap_dup(other_soap); ... soap_destroy(other_soap); // delete record and other managed instances soap_end(other_soap); // delete other data (the SSNs on the heap) soap_free(other_soap); // delete context ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Note that the only reason to use another context and not to use the primary context is when the primary context must be destroyed together with all of the objects it manages while some of the objects must be kept alive. If the objects that are kept alive contain deep cycles then this is the only option we have, because deep copy with a managing context detects and preserves these cycles unless the `SOAP_XML_TREE` flag is used with the context: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} soap *other_soap = soap_new1(SOAP_XML_TREE); // another context ns__record *other_record = record->soap_dup(other_soap); // deep tree copy ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The resulting deep copy will be a full copy of the source data structure as a tree without co-referenced data (i.e. no digraph) and without cycles. Cycles are pruned and (one of the) pointers that forms a cycle is repaced by NULL. We can also deep copy into unmanaged space and use the auto-generated `soap_del_T()` function or the `T::soap_del()` method (requires soapcpp2 option `-Ed` to generate) to delete it later, but we MUST NOT do this for any data that we suspect has deep cycles: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} ns__record *other_record = record->soap_dup(NULL); ... other_record->soap_del(); // deep delete record data members delete other_record; // delete the record ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Cycles in the data structure will lead to non-termination when making unmanaged deep copies. Consider for example: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} class ns__record { const char *name; uint64_t SSN; ns__record *spouse; }; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Our code to populate a structure with a mutual spouse relationship: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} soap *soap = soap_new(); ... ns__record pers1, pers2; pers1.name = "Joe"; pers1.SSN = 1234567890; pers1.spouse = &pers2; pers2.name = "Jane"; pers2.SSN = 1987654320; pers2.spouse = &pers1; ... ns__record *pers3 = soap_dup_ns__record(NULL, NULL, &pers1); // BAD ns__record *pers4 = soap_dup_ns__record(soap, NULL, &pers1); // OK soap_set_mode(soap, SOAP_XML_TREE); ns__record *pers5 = soap_dup_ns__record(soap, NULL, &pers1); // OK ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Note that the gSOAP serializer can serialize any heap, stack, or static allocated data, such as in our code above. So we can serialize the stack-allocated `pers1` record as follows: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} FILE *fp = fopen("record.xml", "w"); if (fp != NULL) { soap->sendfd = fileno(fp); // file descriptor to write to soap_set_mode(soap, SOAP_XML_GRAPH); // support id-ref w/o requiring SOAP soap_clr_mode(soap, SOAP_XML_TREE); // if set, clear if (soap_write_ns__record(soap, &pers1)) ... // handle IO error fclose(fp); soap->sendfd = -1; // block further writing } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ which produces an XML document record.xml that is similar to: Joe 1234567890 Jane 1987654320 Deserialization of an XML document with a SOAP 1.1/1.2 encoded id-ref graph leads to the same non-termination problem when we later try to copy the data into unmanaged space: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} soap *soap = soap_new1(SOAP_XML_GRAPH); // support id-ref w/o SOAP ... ns__record pers1; FILE *fp = fopen("record.xml", "r"); if (fp != NULL) { soap->recvfd = fileno(fp); // file descriptor to read from if (soap_read_ns__record(soap, &pers1)) ... // handle IO error fclose(fp); soap->recvfd = -1; // block further reading } ... ns__record *pers3 = soap_dup_ns__record(NULL, NULL, &pers1); // BAD ns__record *pers4 = soap_dup_ns__record(soap, NULL, &pers1); // OK soap_set_mode(soap, SOAP_XML_TREE); ns__record *pers5 = soap_dup_ns__record(soap, NULL, &pers1); // OK ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Copying data with `soap_dup_T(soap)` into managed space is always safe. Copying into unmanaged space requires diligence. But deleting unmanaged data is easy with `soap_del_T()`. We can also use `soap_del_T()` to delete structures in C++, but only if these structures are created with `new` (and `new []` for arrays when applicable) for classes, structs, and class templates and with `malloc` for anything else, and the structures do NOT contain pointers to stack and static data. Features and limitations {#features} ======================== In general, to use the generated code: - Make sure to `#include "soapH.h"` in your code and also define a namespace table or `#include "ns.nsmap"` with the generated table, where `ns` is the namespace prefix for services. - Use soapcpp2 option -j (C++ only) to generate C++ proxy and service objects. The auto-generated files include documented inferfaces. Compile with soapC.cpp and link with -lgsoap++, or alternatively compile stdsoap2.cpp. - Without soapcpp2 option -j: client-side uses the auto-generated soapClient.cpp and soapC.cpp (or C versions of those). Compile and link with -lgsoap++ (-lgsoap for C), or alternatively compile stdsoap2.cpp (stdsoap2.c for C). - Without soapcpp2 option -j: server-side uses the auto-generated soapServer.cpp and soapC.cpp (or C versions of those). Compile and link with -lgsoap++ (-lgsoap for C), or alternatively compile stdsoap2.cpp (stdsoap2.c for C). - Use `soap_new()` or `soap_new1(int flags)` to allocate and initialize a heap-allocated context with or without flags. Delete this context with `soap_free(struct soap*)`, but only after `soap_destroy(struct soap*)` and `soap_end(struct soap*)`. - Use `soap_init(struct *soap)` or `soap_init1(struct soap*, int flags)` to initialize a stack-allocated context with or without flags. End the use of this context with `soap_done(struct soap*)`, but only after `soap_destroy(struct soap*)` and `soap_end(struct soap*)`. There are several context initialization flags and context mode flags to control XML serialization at runtime: - `SOAP_C_UTFSTRING`: enables all `std::string` and `char*` strings to contain UTF-8 content. This option is recommended. - `SOAP_XML_STRICT`: strictly validates XML while deserializing. Should not be used together with SOAP 1.1/1.2 encoding style of messaging. Use soapcpp2 option `-s` to hard code `SOAP_XML_STRICT` in the generated serializers. Not recommended with SOAP 1.1/1.2 encoding style messaging. - `SOAP_XML_INDENT`: produces indented XML. - `SOAP_XML_CANONICAL`: c14n canonocalization, removes unused `xmlns` bindings and adds them to appropriate places by applying c14n normalization rules. Should not be used together with SOAP 1.1/1.2 encoding style messaging. - `SOAP_XML_TREE`: write tree XML without id-ref, while pruning data structure cycles to prevent nontermination of the serializer for cyclic structures. - `SOAP_XML_GRAPH`: write graph (digraph and cyclic graphs with shared pointers to objects) using id-ref attributes. That is, XML with SOAP multi-ref encoded id-ref elements. This is a structure-preserving serialization format, because co-referenced data and also cyclic relations are accurately represented. - `SOAP_XML_DEFAULTNS`: uses xmlns default namespace declarations, assuming that the schema attribute form is "qualified" by default (be warned if it is not, since attributes in the null namespace will get bound to namespaces!). - `SOAP_XML_NOTYPE`: removes all xsi:type attribuation. This option is usually not needed unless the receiver rejects all xs:type attributes. This option may affect the quality of the deserializer, which relies on xsi:type attributes to distinguish base class instances from derived class instances transported in the XML payloads. Additional notes with respect to the wsdl2h and soapcpp2 tools: - Nested classes, structs, and unions in a gSOAP header file are unnested by soapcpp2. - Use `#import "file.h"` instead of `#include` to import other header files in a gSOAP header file for soapcpp2. The `#include` and `#define` directives are accepted, but are moved to the very start of the generated code for the C/C++ compiler to include before all generated definitions. You should use `#include` in combinatio with "volatile" types and to ensure transient (incomplete) types are declared when these are used in the gSOAP header file. - To remove any SOAP-specific bindings, use soapcpp2 option `-0`. - A gSOAP header file for soapcpp2 should not include any code statements, only data type declarations. This includes constructor initialization lists that are not permitted. Use member initializations instead. - C++ namespaces are supported. Use wsdl2h option `-qname`. Or add a `namespace name { ... }` to the header file, but the `{ ... }` MUST cover the entire header file content from begin to end. - Optional DOM support can be used to store mixed content or literal XML content. Otherwise, mixed content may be lost. Use wsdl2h option `-d` for DOM support and compile and link with `dom.c` or `dom.cpp`. Removing SOAP namespaces from XML payloads {#nsmap} ========================================== The soapcpp2 tool generates a `.nsmap` file that includes two bindings for SOAP namespaces. We can remove all SOAP namespaces (and SOAP processing logic) with soapcpp2 option `-0` or by simply setting the two entries to NULL: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} struct Namespace namespaces[] = { {"SOAP-ENV", NULL, NULL, NULL}, {"SOAP-ENC", NULL, NULL, NULL}, ... }; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Note that once the `.nsmap` is generated, we can copy-paste the content into our project code. However, if we rerun wsdl2h on updated WSDL/XSD files or `typemap.dat` declarations then we need to use the updated table. In cases that no XML namespaces are used at all, for example with [XML-RPC](http://www.genivia.com/doc/xml-rpc-json/html), you may use an empty namespace table: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} struct Namespace namespaces[] = {{NULL,NULL,NULL,NULL}}; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ However, beware that any built-in xsi attributes that are rendered will lack the proper namespace binding. At least we suggest to use `SOAP_XML_NOTYPE` for this reason. Examples {#examples} ======== Select the project files below to peruse the source code examples. Source files ------------ - `address.xsd` Address book schema - `address.cpp` Address book app (reads/writes address.xml file) - `addresstypemap.dat` Schema namespace prefix name preference for wsdl2h - `graph.h` Graph data binding (tree, digraph, cyclic graph) - `graph.cpp` Test graph serialization as tree, digraph, and cyclic Generated files --------------- - `address.h` gSOAP-specific data binding definitions from address.xsd - `addressStub.h` C++ data binding definitions - `addressH.h` Serializers - `addressC.cpp` Serializers - `address.xml` Address book data generated by address app - `graphStub.h` C++ data binding definitions - `graphH.h` Serializers - `graphC.cpp` Serializers - `g.xsd` XSD schema with `g:Graph` complexType - `g.nsmap` xmlns bindings namespace mapping table Build steps ----------- Building the AddressBook example: wsdl2h -g -t addresstypemap.dat address.xsd soapcpp2 -0 -CS -I../../import -p address address.h c++ -I../.. address.cpp addressC.cpp -o address -lgsoap++ Option `-g` produces bindings for global (root) elements in addition to types. In this case the root element `a:address-book` is bound to `_a__address_book`. The complexType `a:address` is bound to class `a__address`, which is also the type of `_a__address_book`. This option is not required, but allows you to use global element tag names when referring to their serializers, instead of their type name. Option `-0` removes the SOAP protocol. Options `-C` and `-S` removes client and server code generation. Option `-p` renames the output `soap` files to `address` files. See the `address.cpp` implementation and [Related Pages](pages.html). The `addresstypemap.dat` file specifies the XML namespace prefix for the bindings: # Bind the address book schema namespace to prefix 'a' a = "urn:address-book-example" # By default the xsd:dateTime schema type is translated to time_t # To map xsd:dateTime to struct tm, enable the following line: # xsd__dateTime = #import "../../custom/struct_tm.h" # ... and compile/link with custom/struct_tm.c The DOB field is a xsd:dateTime, which is bound to `time_t` by default. To change this to `struct tm`, enable the import of the `xsd__dateTime` custom serializer by uncommenting the definition of `xsd__dateTime` in `addresstypemap.dat`. Then change `soap_dateTime2s` to `soap_xsd__dateTime2s` in the code. Building the graph serialization example: soapcpp2 -CS -I../../import -p graph graph.h c++ -I../.. graph.cpp graphC.cpp -o graph -lgsoap++ To compile without using the `libgsoap++` library: simply compile `stdsoap2.cpp` together with the above. Usage ----- To execute the AddressBook example: ./address To execute the Graph serialization example: ./graph gsoap-2.8.28/gsoap/samples/databinding/addresstypemap.dat0000644000175000017500000000057012653650154023035 0ustar ellertellert# Example typemap.dat file for the address book example # Bind the address book schema namespace to prefix 'a' a = "urn:address-book-example" # By default the xsd:dateTime schema type is translated to time_t # To map xsd:dateTime to struct tm, enable the following line: # xsd__dateTime = #import "../../custom/struct_tm.h" # ... and compile/link with custom/struct_tm.c gsoap-2.8.28/gsoap/samples/databinding/Makefile.in0000644000175000017500000005220612653650154021366 0ustar ellertellert# Makefile.in generated by automake 1.14 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ ####### This is the input file for automake, which will generate Makefile.in ########## VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = address$(EXEEXT) subdir = gsoap/samples/databinding DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = address-addressC.$(OBJEXT) am_address_OBJECTS = $(am__objects_1) address-address.$(OBJEXT) address_OBJECTS = $(am_address_OBJECTS) address_DEPENDENCIES = $(SOAP_CPP_LIB) address_LINK = $(CXXLD) $(address_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = SOURCES = $(address_SOURCES) DIST_SOURCES = $(address_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ STRIP = @STRIP@ VERSION = @VERSION@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 AM_LDFLAGS = $(AM_CPPFLAGS) -I$(srcdir) -L$(srcdir) SOAP = $(top_srcdir)/gsoap/src/soapcpp2$(EXEEXT) WSDL = $(top_srcdir)/gsoap/wsdl/wsdl2h$(EXEEXT) WSDL_FLAGS = -g -t $(srcdir)/addresstypemap.dat SOAP_FLAGS = -0 -CS -p address -I$(top_srcdir)/gsoap/import WSDLINPUT = $(srcdir)/address.xsd SOAPHEADER = $(srcdir)/address.h SOAP_CPP_SRC = addressC.cpp SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a address_CFLAGS = $(C_DEBUG_FLAGS) -D$(platform) address_CPPFLAGS = $(C_DEBUG_FLAGS) -D$(platform) address_CXXFLAGS = $(WSDL2H_EXTRA_FLAGS) address_SOURCES = $(SOAP_CPP_SRC) address.cpp address_LDADD = $(SOAP_CPP_LIB) CLEANFILES = *~ address.h *C.cpp *H.h *Stub.h *.nsmap all: all-am .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/databinding/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/databinding/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) address$(EXEEXT): $(address_OBJECTS) $(address_DEPENDENCIES) $(EXTRA_address_DEPENDENCIES) @rm -f address$(EXEEXT) $(AM_V_CXXLD)$(address_LINK) $(address_OBJECTS) $(address_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/address-address.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/address-addressC.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` address-addressC.o: addressC.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(address_CPPFLAGS) $(CPPFLAGS) $(address_CXXFLAGS) $(CXXFLAGS) -MT address-addressC.o -MD -MP -MF $(DEPDIR)/address-addressC.Tpo -c -o address-addressC.o `test -f 'addressC.cpp' || echo '$(srcdir)/'`addressC.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/address-addressC.Tpo $(DEPDIR)/address-addressC.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='addressC.cpp' object='address-addressC.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(address_CPPFLAGS) $(CPPFLAGS) $(address_CXXFLAGS) $(CXXFLAGS) -c -o address-addressC.o `test -f 'addressC.cpp' || echo '$(srcdir)/'`addressC.cpp address-addressC.obj: addressC.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(address_CPPFLAGS) $(CPPFLAGS) $(address_CXXFLAGS) $(CXXFLAGS) -MT address-addressC.obj -MD -MP -MF $(DEPDIR)/address-addressC.Tpo -c -o address-addressC.obj `if test -f 'addressC.cpp'; then $(CYGPATH_W) 'addressC.cpp'; else $(CYGPATH_W) '$(srcdir)/addressC.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/address-addressC.Tpo $(DEPDIR)/address-addressC.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='addressC.cpp' object='address-addressC.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(address_CPPFLAGS) $(CPPFLAGS) $(address_CXXFLAGS) $(CXXFLAGS) -c -o address-addressC.obj `if test -f 'addressC.cpp'; then $(CYGPATH_W) 'addressC.cpp'; else $(CYGPATH_W) '$(srcdir)/addressC.cpp'; fi` address-address.o: address.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(address_CPPFLAGS) $(CPPFLAGS) $(address_CXXFLAGS) $(CXXFLAGS) -MT address-address.o -MD -MP -MF $(DEPDIR)/address-address.Tpo -c -o address-address.o `test -f 'address.cpp' || echo '$(srcdir)/'`address.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/address-address.Tpo $(DEPDIR)/address-address.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='address.cpp' object='address-address.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(address_CPPFLAGS) $(CPPFLAGS) $(address_CXXFLAGS) $(CXXFLAGS) -c -o address-address.o `test -f 'address.cpp' || echo '$(srcdir)/'`address.cpp address-address.obj: address.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(address_CPPFLAGS) $(CPPFLAGS) $(address_CXXFLAGS) $(CXXFLAGS) -MT address-address.obj -MD -MP -MF $(DEPDIR)/address-address.Tpo -c -o address-address.obj `if test -f 'address.cpp'; then $(CYGPATH_W) 'address.cpp'; else $(CYGPATH_W) '$(srcdir)/address.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/address-address.Tpo $(DEPDIR)/address-address.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='address.cpp' object='address-address.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(address_CPPFLAGS) $(CPPFLAGS) $(address_CXXFLAGS) $(CXXFLAGS) -c -o address-address.obj `if test -f 'address.cpp'; then $(CYGPATH_W) 'address.cpp'; else $(CYGPATH_W) '$(srcdir)/address.cpp'; fi` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am $(SOAP_CPP_SRC) : $(WSDLINPUT) $(WSDL) $(WSDL_FLAGS) $(WSDLINPUT) $(SOAP) $(SOAP_FLAGS) $(SOAPHEADER) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.28/gsoap/samples/databinding/address.xsd0000644000175000017500000000424312653650154021464 0ustar ellertellert An example address book schema ISO country codes (limited to just a few for this example) An address information item The root element of the address book schema gsoap-2.8.28/gsoap/samples/databinding/Makefile.am0000644000175000017500000000212212653650154021345 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 CPPFLAGS=$(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin AM_LDFLAGS=$(AM_CPPFLAGS) -I$(srcdir) -L$(srcdir) SOAP=$(top_srcdir)/gsoap/src/soapcpp2$(EXEEXT) WSDL=$(top_srcdir)/gsoap/wsdl/wsdl2h$(EXEEXT) WSDL_FLAGS=-g -t $(srcdir)/addresstypemap.dat SOAP_FLAGS=-0 -CS -p address -I$(top_srcdir)/gsoap/import WSDLINPUT=$(srcdir)/address.xsd SOAPHEADER=$(srcdir)/address.h SOAP_CPP_SRC=addressC.cpp SOAP_CPP_LIB=$(top_builddir)/gsoap/libgsoap++.a $(SOAP_CPP_SRC) : $(WSDLINPUT) $(WSDL) $(WSDL_FLAGS) $(WSDLINPUT) $(SOAP) $(SOAP_FLAGS) $(SOAPHEADER) #LIBS= noinst_PROGRAMS=address address_CFLAGS=$(C_DEBUG_FLAGS) -D$(platform) address_CPPFLAGS=$(C_DEBUG_FLAGS) -D$(platform) address_CXXFLAGS=$(WSDL2H_EXTRA_FLAGS) address_SOURCES=$(SOAP_CPP_SRC) address.cpp address_LDADD=$(SOAP_CPP_LIB) CLEANFILES= *~ address.h *C.cpp *H.h *Stub.h *.nsmap gsoap-2.8.28/gsoap/samples/databinding/address.cpp0000644000175000017500000001526712653650154021460 0ustar ellertellert/** address.cpp Address book example XML data binding application. Illustrates the gSOAP XML data binding with wsdl2h and soappcp2. Copyright (C) 2000-2015 Robert A. van Engelen. All Rights Reserved. Project Source Files - address.xsd Address book - address.cpp Address book app (reads/writes address.xml file) - addresstypemap.dat Schema namespace prefix name preference Generated Files - address.h gSOAP data binding definitions from address.xsd - addressStub.h C++ data binding definitions - addressH.h Serializers - addressC.cpp Serializers - a.nsmap XML namespace mapping file (binds 'a' URI) - address.xml Address book data generated by address app Build: > wsdl2h -g -t addresstypemap.dat address.xsd > soapcpp2 -2 -CS -I../../import -p address address.h > c++ -I../.. address.cpp addressC.cpp -o address ../../stdsoap2.cpp Run: > ./address */ /* -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ int main(); #include #include #include "addressH.h" // generated, also includes stdsoap2.h #include "a.nsmap" // generated /** @fn char *user_input(const char *prompt) @brief A quick-and-dirty user input function: reads string from stdin (up to 80 chars), trims leading and trailing blanks, and returns it @param prompt displays prompt to user @return string input */ char *user_input(const char *prompt); /** @brief Address book application: reads address.xml, displays its content, prompts the user for new contact, adds it, and saves the updated address.xml. */ int main() { // New soap struct engine context // Use strict validation and indented canonicalized output struct soap *soap = soap_new1(SOAP_XML_STRICT | SOAP_XML_INDENT | SOAP_XML_NOTYPE); _a__address_book *ab = soap_new__a__address_book(soap, -1); std::fstream fs; // Read the address book from address.xml (defined by address.xsd) fs.open("address.xml", std::ios::in); if (fs) { soap->is = &fs; if (soap_read__a__address_book(soap, ab) != SOAP_OK) { std::cerr << "Error reading address.xml file" << std::endl; soap_stream_fault(soap, std::cerr); exit(1); } fs.close(); } // Display the address book content std::cout << std::endl << "ADDRESS BOOK - An Example XML Data Binding Application" << std::endl << std::endl; for (std::vector::const_iterator i = ab->address.begin(); i != ab->address.end(); ++i) { if (*i) { std::cout << "Address entry " << (*i)->ID << std::endl; std::cout << "Name: " << (*i)->name << std::endl; std::cout << "Street: " << (*i)->street << std::endl; std::cout << "City: " << (*i)->city << std::endl; std::cout << "Zip: " << (*i)->zip << std::endl; // Advanced level: we use the soapcpp2-generated soap_a__ISO_country2s() // function to convert enum a__ISO_country values to strings. The strings // are allocated in the gSOAP engine and deleted with soap_end() std::cout << "Country: " << soap_a__ISO_country2s(soap, (*i)->country) << std::endl; if ((*i)->phone) std::cout << "Phone: " << *(*i)->phone << std::endl; if ((*i)->mobile) std::cout << "Mobile: " << *(*i)->mobile << std::endl; // Advanced level: use the soap_dateTime2s() from the stdsoap2.cpp engine if ((*i)->dob) std::cout << "DOB: " << soap_dateTime2s(soap, *(*i)->dob) << std::endl; std::cout << "---------" << std::endl; } } // Allocate a new address in the gSOAP engine's data space a__address *a = soap_new_a__address(soap, -1); // Set object's default values (soap_default is generated) a->soap_default(soap); a->ID = ab->address.size() + 1; std::cout << "Enter a new contact:" << std::endl; a->name = user_input("Name"); a->street = user_input("Street"); a->city = user_input("City"); a->zip = user_input("Zip"); char *s = user_input("Country"); // Advanced level: use the generated s2a__ISO_country() to convert string to // enum constant if (soap_s2a__ISO_country(soap, s, &a->country) != SOAP_OK) std::cerr << "Not a valid country code" << std::endl; if (*(s = user_input("Phone"))) { // Allocate string in engine's data space: a->phone = soap_new_std__string(soap, -1); *a->phone = s; } if (*(s = user_input("Mobile"))) { // Allocate string in engine's data space: a->mobile = soap_new_std__string(soap, -1); *a->mobile = s; } // Add contact to address book ab->address.push_back(a); std::cout << std::endl << "Contact information added." << std::endl; // Save updated address book to address.xml fs.open("address.xml", std::ios::out); if (!fs) { std::cerr << "Cannot create address.xml file" << std::endl; exit(1); } soap->os = &fs; if (soap_write__a__address_book(soap, ab) != SOAP_OK) { std::cerr << "Error writing address.xml file" << std::endl; soap_stream_fault(soap, std::cerr); exit(1); } fs.close(); // Delete instances soap_destroy(soap); // Delete data soap_end(soap); // Free soap struct engine context soap_free(soap); return 0; } char *user_input(const char *prompt) { static char buf[80]; char *s; printf("%-9s> ", prompt); fgets(buf, 80, stdin); // Strip trailing space for (s = buf + strlen(buf) - 1; s > buf; s--) { if (*s > ' ') break; } s[1] = '\0'; // Strip leading space for (s = buf; *s; s++) { if (*s > ' ') break; } return s; } gsoap-2.8.28/gsoap/samples/databinding/graph.h0000644000175000017500000000334512653650154020573 0ustar ellertellert/* graph.h Tree, digraph, and cyclic graph serialization example. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #import "stlvector.h" // a gSOAP directive to produce a xmlns:g="urn:graph" namespace binding: //gsoap g schema namespace: urn:graph /** A recursive data type that is (invisibly) bound to the 'g' XML namespace */ class g:Graph { public: std::vector edges; ///< public members are serializable }; gsoap-2.8.28/gsoap/samples/databinding/graph.cpp0000644000175000017500000001306712653650154021130 0ustar ellertellert/** graph.cpp Demonstrated tree, digraph, and cyclic graph serialization. Copyright (C) 2000-2015 Robert A. van Engelen. All Rights Reserved. Project Source Files - graph.h Graph (tree, digraph, cyclic graph) data binding - graph.cpp Test graph serialization as tree, digraph, and cyclic Generated Files - graphH.h Serializers - graphC.cpp Serializers Build: > soapcpp2 -CS -Iimport -p graph graph.h > c++ -o graph graph.cpp graphC.cpp stdsoap2.cpp Usage: > ./graph */ /* -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ int main(); // include all gSOAP header files: #include "graphH.h" #include "g.nsmap" /// Namespace mapping table for non-SOAP use static struct Namespace nosoap_nsmap[] = { {"SOAP-ENV", NULL, NULL, NULL}, {"SOAP-ENC", NULL, NULL, NULL}, {"xsi", "http://www.w3.org/2001/XMLSchema-instance", "http://www.w3.org/*/XMLSchema-instance", NULL}, {"xsd", "http://www.w3.org/2001/XMLSchema", "http://www.w3.org/*/XMLSchema", NULL}, {"g", "urn:graph", NULL, NULL}, {NULL, NULL, NULL, NULL} }; /// Namespace mapping table for SOAP 1.1 static struct Namespace soap11_nsmap[] = { {"SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/", "http://www.w3.org/*/soap-envelope", NULL}, {"SOAP-ENC", "http://schemas.xmlsoap.org/soap/encoding/", "http://www.w3.org/*/soap-encoding", NULL}, {"xsi", "http://www.w3.org/2001/XMLSchema-instance", "http://www.w3.org/*/XMLSchema-instance", NULL}, {"xsd", "http://www.w3.org/2001/XMLSchema", "http://www.w3.org/*/XMLSchema", NULL}, {"g", "urn:graph", NULL, NULL}, {NULL, NULL, NULL, NULL} }; /// Namespace mapping table for SOAP 1.2 static struct Namespace soap12_nsmap[] = { {"SOAP-ENV", "http://www.w3.org/2003/05/soap-envelope", "http://schemas.xmlsoap.org/soap/envelope/", NULL}, {"SOAP-ENC", "http://www.w3.org/2003/05/soap-encoding", "http://schemas.xmlsoap.org/soap/encoding/", NULL}, {"xsi", "http://www.w3.org/2001/XMLSchema-instance", "http://www.w3.org/*/XMLSchema-instance", NULL}, {"xsd", "http://www.w3.org/2001/XMLSchema", "http://www.w3.org/*/XMLSchema", NULL}, {"g", "urn:graph", NULL, NULL}, {NULL, NULL, NULL, NULL} }; int main() { struct soap *ctx = soap_new1(SOAP_XML_INDENT); soap_set_namespaces(ctx, nosoap_nsmap); // a tree: Graph tree; // with 5 branches: for (int i = 0; i < 4; ++i) { Graph *branch = soap_new_Graph(ctx); tree.edges.push_back(branch); // each branch has a couple of leaves: for (int j = 0; j < i; ++j) branch->edges.push_back(soap_new_Graph(ctx)); } std::cout << "**** XML TREE FROM C++ TREE ****" << std::endl; soap_write_Graph(ctx, &tree); std::cout << std::endl << std::endl; std::cout << "**** XML TREE FROM C++ DIGRAPH ****" << std::endl; tree.edges[0] = tree.edges[1]; // first pair of edges point to shared node tree.edges[2] = tree.edges[3]; // second pair of edges point to shared node soap_write_Graph(ctx, &tree); std::cout << std::endl << std::endl; std::cout << "**** XML ID-REF DIGRAPH FROM C++ DIGRAPH ****" << std::endl; soap_set_omode(ctx, SOAP_XML_GRAPH); soap_write_Graph(ctx, &tree); std::cout << std::endl << std::endl; soap_clr_omode(ctx, SOAP_XML_GRAPH); std::cout << "**** XML ID-REF DIGRAPH FROM C++ CYCLIC GRAPH ****" << std::endl; tree.edges[0]->edges = tree.edges; // create cycle soap_set_omode(ctx, SOAP_XML_GRAPH); soap_write_Graph(ctx, &tree); std::cout << std::endl << std::endl; soap_clr_omode(ctx, SOAP_XML_GRAPH); std::cout << "**** XML TREE (PRUNED CYCLIC BRANCHES) FROM C++ CYCLIC GRAPH ****" << std::endl; soap_set_omode(ctx, SOAP_XML_TREE); soap_write_Graph(ctx, &tree); std::cout << std::endl << std::endl; soap_clr_omode(ctx, SOAP_XML_TREE); std::cout << "**** SOAP 1.1 ENCODED GRAPH FROM C++ CYCLIC GRAPH ****" << std::endl; soap_set_namespaces(ctx, soap11_nsmap); soap_set_version(ctx, 1); // enable SOAP 1.1 soap_write_Graph(ctx, &tree); std::cout << std::endl << std::endl; std::cout << "**** SOAP 1.2 ENCODED GRAPH FROM C++ CYCLIC GRAPH ****" << std::endl; soap_set_namespaces(ctx, soap12_nsmap); soap_set_version(ctx, 2); // enable SOAP 1.2 soap_write_Graph(ctx, &tree); std::cout << std::endl << std::endl; soap_destroy(ctx); // delete objects soap_end(ctx); // free temp data soap_free(ctx); // release context return 0; } gsoap-2.8.28/gsoap/samples/wsrm/0000755000175000017500000000000012653650172016040 5ustar ellertellertgsoap-2.8.28/gsoap/samples/wsrm/Makefile.in0000644000175000017500000021117212653650156020113 0ustar ellertellert# Makefile.in generated by automake 1.14 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = wsrmdemo$(EXEEXT) wsrmdemo_udp$(EXEEXT) \ wsrmdemo_ssl$(EXEEXT) DIST_COMMON = $(srcdir)/../Makefile.defines \ $(srcdir)/../Makefile.c_rules $(srcdir)/Makefile.in \ $(srcdir)/Makefile.am $(top_srcdir)/mkinstalldirs \ $(top_srcdir)/depcomp subdir = gsoap/samples/wsrm ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = am__objects_2 = wsrmdemo-soapC.$(OBJEXT) am__objects_3 = wsrmdemo-soapClient.$(OBJEXT) $(am__objects_2) am__objects_4 = $(am__objects_3) wsrmdemo-soapServer.$(OBJEXT) \ $(am__objects_1) $(am__objects_1) am_wsrmdemo_OBJECTS = wsrmdemo-wsrmdemo.$(OBJEXT) $(am__objects_1) \ $(am__objects_4) wsrmdemo-wsaapi.$(OBJEXT) \ wsrmdemo-wsrmapi.$(OBJEXT) wsrmdemo-threads.$(OBJEXT) \ wsrmdemo-duration.$(OBJEXT) wsrmdemo_OBJECTS = $(am_wsrmdemo_OBJECTS) am__DEPENDENCIES_1 = wsrmdemo_DEPENDENCIES = $(SOAP_C_LIB) $(am__DEPENDENCIES_1) wsrmdemo_LINK = $(CCLD) $(wsrmdemo_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ am__objects_5 = wsrmdemo_ssl-soapC.$(OBJEXT) am__objects_6 = wsrmdemo_ssl-soapClient.$(OBJEXT) $(am__objects_5) am__objects_7 = $(am__objects_6) wsrmdemo_ssl-soapServer.$(OBJEXT) \ $(am__objects_1) $(am__objects_1) am_wsrmdemo_ssl_OBJECTS = wsrmdemo_ssl-wsrmdemo.$(OBJEXT) \ $(am__objects_1) $(am__objects_7) \ wsrmdemo_ssl-wsaapi.$(OBJEXT) wsrmdemo_ssl-wsrmapi.$(OBJEXT) \ wsrmdemo_ssl-threads.$(OBJEXT) wsrmdemo_ssl-duration.$(OBJEXT) wsrmdemo_ssl_OBJECTS = $(am_wsrmdemo_ssl_OBJECTS) wsrmdemo_ssl_DEPENDENCIES = $(SOAP_C_LIB_SSL) $(am__DEPENDENCIES_1) wsrmdemo_ssl_LINK = $(CCLD) $(wsrmdemo_ssl_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ am__objects_8 = wsrmdemo_udp-soapC.$(OBJEXT) am__objects_9 = wsrmdemo_udp-soapClient.$(OBJEXT) $(am__objects_8) am__objects_10 = $(am__objects_9) wsrmdemo_udp-soapServer.$(OBJEXT) \ $(am__objects_1) $(am__objects_1) am_wsrmdemo_udp_OBJECTS = wsrmdemo_udp-wsrmdemo.$(OBJEXT) \ $(am__objects_1) $(am__objects_10) \ wsrmdemo_udp-wsaapi.$(OBJEXT) wsrmdemo_udp-wsrmapi.$(OBJEXT) \ wsrmdemo_udp-threads.$(OBJEXT) wsrmdemo_udp-duration.$(OBJEXT) wsrmdemo_udp_OBJECTS = $(am_wsrmdemo_udp_OBJECTS) wsrmdemo_udp_DEPENDENCIES = $(SOAP_C_LIB) $(am__DEPENDENCIES_1) wsrmdemo_udp_LINK = $(CCLD) $(wsrmdemo_udp_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(wsrmdemo_SOURCES) $(wsrmdemo_ssl_SOURCES) \ $(wsrmdemo_udp_SOURCES) DIST_SOURCES = $(wsrmdemo_SOURCES) $(wsrmdemo_ssl_SOURCES) \ $(wsrmdemo_udp_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ STRIP = @STRIP@ VERSION = @VERSION@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = foreign 1.4 SOAPHEADER = wsrmdemo.h SOAP_FLAGS = -a AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a SOAP_C_SRC = $(SOAP_C_CLIENT) soapServer.c $(SOAP_H_FILES) $(SOAP_NS) LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_C_SRC) CLEANFILES = $(SOAP_C_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.c soapClient.c soapClientLib.c soapServer.c soapServerLib.c *~ SOAP_NS = wsrmdemo.nsmap wsrmdemo.wsdl wsrmdemo_CFLAGS = wsrmdemo_SOURCES = wsrmdemo.c $(SOAPHEADER) $(SOAP_C_SRC) ../../plugin/wsaapi.c ../../plugin/wsrmapi.c ../../plugin/threads.c ../../custom/duration.c wsrmdemo_LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) -lpthread wsrmdemo_udp_CFLAGS = -DWITH_UDP wsrmdemo_udp_SOURCES = wsrmdemo.c $(SOAPHEADER) $(SOAP_C_SRC) ../../plugin/wsaapi.c ../../plugin/wsrmapi.c ../../plugin/threads.c ../../custom/duration.c wsrmdemo_udp_LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) -lpthread wsrmdemo_ssl_CFLAGS = -DWITH_OPENSSL wsrmdemo_ssl_SOURCES = wsrmdemo.c $(SOAPHEADER) $(SOAP_C_SRC) ../../plugin/wsaapi.c ../../plugin/wsrmapi.c ../../plugin/threads.c ../../custom/duration.c wsrmdemo_ssl_LDADD = $(SOAP_C_LIB_SSL) $(SAMPLE_EXTRA_LIBS) -lssl -lcrypto -lz -lpthread all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.c_rules $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/wsrm/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/wsrm/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.c_rules: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) wsrmdemo$(EXEEXT): $(wsrmdemo_OBJECTS) $(wsrmdemo_DEPENDENCIES) $(EXTRA_wsrmdemo_DEPENDENCIES) @rm -f wsrmdemo$(EXEEXT) $(AM_V_CCLD)$(wsrmdemo_LINK) $(wsrmdemo_OBJECTS) $(wsrmdemo_LDADD) $(LIBS) wsrmdemo_ssl$(EXEEXT): $(wsrmdemo_ssl_OBJECTS) $(wsrmdemo_ssl_DEPENDENCIES) $(EXTRA_wsrmdemo_ssl_DEPENDENCIES) @rm -f wsrmdemo_ssl$(EXEEXT) $(AM_V_CCLD)$(wsrmdemo_ssl_LINK) $(wsrmdemo_ssl_OBJECTS) $(wsrmdemo_ssl_LDADD) $(LIBS) wsrmdemo_udp$(EXEEXT): $(wsrmdemo_udp_OBJECTS) $(wsrmdemo_udp_DEPENDENCIES) $(EXTRA_wsrmdemo_udp_DEPENDENCIES) @rm -f wsrmdemo_udp$(EXEEXT) $(AM_V_CCLD)$(wsrmdemo_udp_LINK) $(wsrmdemo_udp_OBJECTS) $(wsrmdemo_udp_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsrmdemo-duration.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsrmdemo-soapC.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsrmdemo-soapClient.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsrmdemo-soapServer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsrmdemo-threads.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsrmdemo-wsaapi.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsrmdemo-wsrmapi.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsrmdemo-wsrmdemo.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsrmdemo_ssl-duration.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsrmdemo_ssl-soapC.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsrmdemo_ssl-soapClient.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsrmdemo_ssl-soapServer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsrmdemo_ssl-threads.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsrmdemo_ssl-wsaapi.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsrmdemo_ssl-wsrmapi.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsrmdemo_ssl-wsrmdemo.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsrmdemo_udp-duration.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsrmdemo_udp-soapC.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsrmdemo_udp-soapClient.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsrmdemo_udp-soapServer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsrmdemo_udp-threads.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsrmdemo_udp-wsaapi.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsrmdemo_udp-wsrmapi.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsrmdemo_udp-wsrmdemo.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` wsrmdemo-wsrmdemo.o: wsrmdemo.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_CFLAGS) $(CFLAGS) -MT wsrmdemo-wsrmdemo.o -MD -MP -MF $(DEPDIR)/wsrmdemo-wsrmdemo.Tpo -c -o wsrmdemo-wsrmdemo.o `test -f 'wsrmdemo.c' || echo '$(srcdir)/'`wsrmdemo.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo-wsrmdemo.Tpo $(DEPDIR)/wsrmdemo-wsrmdemo.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='wsrmdemo.c' object='wsrmdemo-wsrmdemo.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_CFLAGS) $(CFLAGS) -c -o wsrmdemo-wsrmdemo.o `test -f 'wsrmdemo.c' || echo '$(srcdir)/'`wsrmdemo.c wsrmdemo-wsrmdemo.obj: wsrmdemo.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_CFLAGS) $(CFLAGS) -MT wsrmdemo-wsrmdemo.obj -MD -MP -MF $(DEPDIR)/wsrmdemo-wsrmdemo.Tpo -c -o wsrmdemo-wsrmdemo.obj `if test -f 'wsrmdemo.c'; then $(CYGPATH_W) 'wsrmdemo.c'; else $(CYGPATH_W) '$(srcdir)/wsrmdemo.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo-wsrmdemo.Tpo $(DEPDIR)/wsrmdemo-wsrmdemo.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='wsrmdemo.c' object='wsrmdemo-wsrmdemo.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_CFLAGS) $(CFLAGS) -c -o wsrmdemo-wsrmdemo.obj `if test -f 'wsrmdemo.c'; then $(CYGPATH_W) 'wsrmdemo.c'; else $(CYGPATH_W) '$(srcdir)/wsrmdemo.c'; fi` wsrmdemo-soapClient.o: soapClient.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_CFLAGS) $(CFLAGS) -MT wsrmdemo-soapClient.o -MD -MP -MF $(DEPDIR)/wsrmdemo-soapClient.Tpo -c -o wsrmdemo-soapClient.o `test -f 'soapClient.c' || echo '$(srcdir)/'`soapClient.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo-soapClient.Tpo $(DEPDIR)/wsrmdemo-soapClient.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapClient.c' object='wsrmdemo-soapClient.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_CFLAGS) $(CFLAGS) -c -o wsrmdemo-soapClient.o `test -f 'soapClient.c' || echo '$(srcdir)/'`soapClient.c wsrmdemo-soapClient.obj: soapClient.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_CFLAGS) $(CFLAGS) -MT wsrmdemo-soapClient.obj -MD -MP -MF $(DEPDIR)/wsrmdemo-soapClient.Tpo -c -o wsrmdemo-soapClient.obj `if test -f 'soapClient.c'; then $(CYGPATH_W) 'soapClient.c'; else $(CYGPATH_W) '$(srcdir)/soapClient.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo-soapClient.Tpo $(DEPDIR)/wsrmdemo-soapClient.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapClient.c' object='wsrmdemo-soapClient.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_CFLAGS) $(CFLAGS) -c -o wsrmdemo-soapClient.obj `if test -f 'soapClient.c'; then $(CYGPATH_W) 'soapClient.c'; else $(CYGPATH_W) '$(srcdir)/soapClient.c'; fi` wsrmdemo-soapC.o: soapC.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_CFLAGS) $(CFLAGS) -MT wsrmdemo-soapC.o -MD -MP -MF $(DEPDIR)/wsrmdemo-soapC.Tpo -c -o wsrmdemo-soapC.o `test -f 'soapC.c' || echo '$(srcdir)/'`soapC.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo-soapC.Tpo $(DEPDIR)/wsrmdemo-soapC.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapC.c' object='wsrmdemo-soapC.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_CFLAGS) $(CFLAGS) -c -o wsrmdemo-soapC.o `test -f 'soapC.c' || echo '$(srcdir)/'`soapC.c wsrmdemo-soapC.obj: soapC.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_CFLAGS) $(CFLAGS) -MT wsrmdemo-soapC.obj -MD -MP -MF $(DEPDIR)/wsrmdemo-soapC.Tpo -c -o wsrmdemo-soapC.obj `if test -f 'soapC.c'; then $(CYGPATH_W) 'soapC.c'; else $(CYGPATH_W) '$(srcdir)/soapC.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo-soapC.Tpo $(DEPDIR)/wsrmdemo-soapC.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapC.c' object='wsrmdemo-soapC.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_CFLAGS) $(CFLAGS) -c -o wsrmdemo-soapC.obj `if test -f 'soapC.c'; then $(CYGPATH_W) 'soapC.c'; else $(CYGPATH_W) '$(srcdir)/soapC.c'; fi` wsrmdemo-soapServer.o: soapServer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_CFLAGS) $(CFLAGS) -MT wsrmdemo-soapServer.o -MD -MP -MF $(DEPDIR)/wsrmdemo-soapServer.Tpo -c -o wsrmdemo-soapServer.o `test -f 'soapServer.c' || echo '$(srcdir)/'`soapServer.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo-soapServer.Tpo $(DEPDIR)/wsrmdemo-soapServer.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapServer.c' object='wsrmdemo-soapServer.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_CFLAGS) $(CFLAGS) -c -o wsrmdemo-soapServer.o `test -f 'soapServer.c' || echo '$(srcdir)/'`soapServer.c wsrmdemo-soapServer.obj: soapServer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_CFLAGS) $(CFLAGS) -MT wsrmdemo-soapServer.obj -MD -MP -MF $(DEPDIR)/wsrmdemo-soapServer.Tpo -c -o wsrmdemo-soapServer.obj `if test -f 'soapServer.c'; then $(CYGPATH_W) 'soapServer.c'; else $(CYGPATH_W) '$(srcdir)/soapServer.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo-soapServer.Tpo $(DEPDIR)/wsrmdemo-soapServer.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapServer.c' object='wsrmdemo-soapServer.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_CFLAGS) $(CFLAGS) -c -o wsrmdemo-soapServer.obj `if test -f 'soapServer.c'; then $(CYGPATH_W) 'soapServer.c'; else $(CYGPATH_W) '$(srcdir)/soapServer.c'; fi` wsrmdemo-wsaapi.o: ../../plugin/wsaapi.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_CFLAGS) $(CFLAGS) -MT wsrmdemo-wsaapi.o -MD -MP -MF $(DEPDIR)/wsrmdemo-wsaapi.Tpo -c -o wsrmdemo-wsaapi.o `test -f '../../plugin/wsaapi.c' || echo '$(srcdir)/'`../../plugin/wsaapi.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo-wsaapi.Tpo $(DEPDIR)/wsrmdemo-wsaapi.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/wsaapi.c' object='wsrmdemo-wsaapi.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_CFLAGS) $(CFLAGS) -c -o wsrmdemo-wsaapi.o `test -f '../../plugin/wsaapi.c' || echo '$(srcdir)/'`../../plugin/wsaapi.c wsrmdemo-wsaapi.obj: ../../plugin/wsaapi.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_CFLAGS) $(CFLAGS) -MT wsrmdemo-wsaapi.obj -MD -MP -MF $(DEPDIR)/wsrmdemo-wsaapi.Tpo -c -o wsrmdemo-wsaapi.obj `if test -f '../../plugin/wsaapi.c'; then $(CYGPATH_W) '../../plugin/wsaapi.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/wsaapi.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo-wsaapi.Tpo $(DEPDIR)/wsrmdemo-wsaapi.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/wsaapi.c' object='wsrmdemo-wsaapi.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_CFLAGS) $(CFLAGS) -c -o wsrmdemo-wsaapi.obj `if test -f '../../plugin/wsaapi.c'; then $(CYGPATH_W) '../../plugin/wsaapi.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/wsaapi.c'; fi` wsrmdemo-wsrmapi.o: ../../plugin/wsrmapi.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_CFLAGS) $(CFLAGS) -MT wsrmdemo-wsrmapi.o -MD -MP -MF $(DEPDIR)/wsrmdemo-wsrmapi.Tpo -c -o wsrmdemo-wsrmapi.o `test -f '../../plugin/wsrmapi.c' || echo '$(srcdir)/'`../../plugin/wsrmapi.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo-wsrmapi.Tpo $(DEPDIR)/wsrmdemo-wsrmapi.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/wsrmapi.c' object='wsrmdemo-wsrmapi.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_CFLAGS) $(CFLAGS) -c -o wsrmdemo-wsrmapi.o `test -f '../../plugin/wsrmapi.c' || echo '$(srcdir)/'`../../plugin/wsrmapi.c wsrmdemo-wsrmapi.obj: ../../plugin/wsrmapi.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_CFLAGS) $(CFLAGS) -MT wsrmdemo-wsrmapi.obj -MD -MP -MF $(DEPDIR)/wsrmdemo-wsrmapi.Tpo -c -o wsrmdemo-wsrmapi.obj `if test -f '../../plugin/wsrmapi.c'; then $(CYGPATH_W) '../../plugin/wsrmapi.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/wsrmapi.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo-wsrmapi.Tpo $(DEPDIR)/wsrmdemo-wsrmapi.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/wsrmapi.c' object='wsrmdemo-wsrmapi.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_CFLAGS) $(CFLAGS) -c -o wsrmdemo-wsrmapi.obj `if test -f '../../plugin/wsrmapi.c'; then $(CYGPATH_W) '../../plugin/wsrmapi.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/wsrmapi.c'; fi` wsrmdemo-threads.o: ../../plugin/threads.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_CFLAGS) $(CFLAGS) -MT wsrmdemo-threads.o -MD -MP -MF $(DEPDIR)/wsrmdemo-threads.Tpo -c -o wsrmdemo-threads.o `test -f '../../plugin/threads.c' || echo '$(srcdir)/'`../../plugin/threads.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo-threads.Tpo $(DEPDIR)/wsrmdemo-threads.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/threads.c' object='wsrmdemo-threads.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_CFLAGS) $(CFLAGS) -c -o wsrmdemo-threads.o `test -f '../../plugin/threads.c' || echo '$(srcdir)/'`../../plugin/threads.c wsrmdemo-threads.obj: ../../plugin/threads.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_CFLAGS) $(CFLAGS) -MT wsrmdemo-threads.obj -MD -MP -MF $(DEPDIR)/wsrmdemo-threads.Tpo -c -o wsrmdemo-threads.obj `if test -f '../../plugin/threads.c'; then $(CYGPATH_W) '../../plugin/threads.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/threads.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo-threads.Tpo $(DEPDIR)/wsrmdemo-threads.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/threads.c' object='wsrmdemo-threads.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_CFLAGS) $(CFLAGS) -c -o wsrmdemo-threads.obj `if test -f '../../plugin/threads.c'; then $(CYGPATH_W) '../../plugin/threads.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/threads.c'; fi` wsrmdemo-duration.o: ../../custom/duration.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_CFLAGS) $(CFLAGS) -MT wsrmdemo-duration.o -MD -MP -MF $(DEPDIR)/wsrmdemo-duration.Tpo -c -o wsrmdemo-duration.o `test -f '../../custom/duration.c' || echo '$(srcdir)/'`../../custom/duration.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo-duration.Tpo $(DEPDIR)/wsrmdemo-duration.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../custom/duration.c' object='wsrmdemo-duration.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_CFLAGS) $(CFLAGS) -c -o wsrmdemo-duration.o `test -f '../../custom/duration.c' || echo '$(srcdir)/'`../../custom/duration.c wsrmdemo-duration.obj: ../../custom/duration.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_CFLAGS) $(CFLAGS) -MT wsrmdemo-duration.obj -MD -MP -MF $(DEPDIR)/wsrmdemo-duration.Tpo -c -o wsrmdemo-duration.obj `if test -f '../../custom/duration.c'; then $(CYGPATH_W) '../../custom/duration.c'; else $(CYGPATH_W) '$(srcdir)/../../custom/duration.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo-duration.Tpo $(DEPDIR)/wsrmdemo-duration.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../custom/duration.c' object='wsrmdemo-duration.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_CFLAGS) $(CFLAGS) -c -o wsrmdemo-duration.obj `if test -f '../../custom/duration.c'; then $(CYGPATH_W) '../../custom/duration.c'; else $(CYGPATH_W) '$(srcdir)/../../custom/duration.c'; fi` wsrmdemo_ssl-wsrmdemo.o: wsrmdemo.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_ssl_CFLAGS) $(CFLAGS) -MT wsrmdemo_ssl-wsrmdemo.o -MD -MP -MF $(DEPDIR)/wsrmdemo_ssl-wsrmdemo.Tpo -c -o wsrmdemo_ssl-wsrmdemo.o `test -f 'wsrmdemo.c' || echo '$(srcdir)/'`wsrmdemo.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo_ssl-wsrmdemo.Tpo $(DEPDIR)/wsrmdemo_ssl-wsrmdemo.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='wsrmdemo.c' object='wsrmdemo_ssl-wsrmdemo.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_ssl_CFLAGS) $(CFLAGS) -c -o wsrmdemo_ssl-wsrmdemo.o `test -f 'wsrmdemo.c' || echo '$(srcdir)/'`wsrmdemo.c wsrmdemo_ssl-wsrmdemo.obj: wsrmdemo.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_ssl_CFLAGS) $(CFLAGS) -MT wsrmdemo_ssl-wsrmdemo.obj -MD -MP -MF $(DEPDIR)/wsrmdemo_ssl-wsrmdemo.Tpo -c -o wsrmdemo_ssl-wsrmdemo.obj `if test -f 'wsrmdemo.c'; then $(CYGPATH_W) 'wsrmdemo.c'; else $(CYGPATH_W) '$(srcdir)/wsrmdemo.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo_ssl-wsrmdemo.Tpo $(DEPDIR)/wsrmdemo_ssl-wsrmdemo.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='wsrmdemo.c' object='wsrmdemo_ssl-wsrmdemo.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_ssl_CFLAGS) $(CFLAGS) -c -o wsrmdemo_ssl-wsrmdemo.obj `if test -f 'wsrmdemo.c'; then $(CYGPATH_W) 'wsrmdemo.c'; else $(CYGPATH_W) '$(srcdir)/wsrmdemo.c'; fi` wsrmdemo_ssl-soapClient.o: soapClient.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_ssl_CFLAGS) $(CFLAGS) -MT wsrmdemo_ssl-soapClient.o -MD -MP -MF $(DEPDIR)/wsrmdemo_ssl-soapClient.Tpo -c -o wsrmdemo_ssl-soapClient.o `test -f 'soapClient.c' || echo '$(srcdir)/'`soapClient.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo_ssl-soapClient.Tpo $(DEPDIR)/wsrmdemo_ssl-soapClient.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapClient.c' object='wsrmdemo_ssl-soapClient.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_ssl_CFLAGS) $(CFLAGS) -c -o wsrmdemo_ssl-soapClient.o `test -f 'soapClient.c' || echo '$(srcdir)/'`soapClient.c wsrmdemo_ssl-soapClient.obj: soapClient.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_ssl_CFLAGS) $(CFLAGS) -MT wsrmdemo_ssl-soapClient.obj -MD -MP -MF $(DEPDIR)/wsrmdemo_ssl-soapClient.Tpo -c -o wsrmdemo_ssl-soapClient.obj `if test -f 'soapClient.c'; then $(CYGPATH_W) 'soapClient.c'; else $(CYGPATH_W) '$(srcdir)/soapClient.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo_ssl-soapClient.Tpo $(DEPDIR)/wsrmdemo_ssl-soapClient.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapClient.c' object='wsrmdemo_ssl-soapClient.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_ssl_CFLAGS) $(CFLAGS) -c -o wsrmdemo_ssl-soapClient.obj `if test -f 'soapClient.c'; then $(CYGPATH_W) 'soapClient.c'; else $(CYGPATH_W) '$(srcdir)/soapClient.c'; fi` wsrmdemo_ssl-soapC.o: soapC.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_ssl_CFLAGS) $(CFLAGS) -MT wsrmdemo_ssl-soapC.o -MD -MP -MF $(DEPDIR)/wsrmdemo_ssl-soapC.Tpo -c -o wsrmdemo_ssl-soapC.o `test -f 'soapC.c' || echo '$(srcdir)/'`soapC.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo_ssl-soapC.Tpo $(DEPDIR)/wsrmdemo_ssl-soapC.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapC.c' object='wsrmdemo_ssl-soapC.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_ssl_CFLAGS) $(CFLAGS) -c -o wsrmdemo_ssl-soapC.o `test -f 'soapC.c' || echo '$(srcdir)/'`soapC.c wsrmdemo_ssl-soapC.obj: soapC.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_ssl_CFLAGS) $(CFLAGS) -MT wsrmdemo_ssl-soapC.obj -MD -MP -MF $(DEPDIR)/wsrmdemo_ssl-soapC.Tpo -c -o wsrmdemo_ssl-soapC.obj `if test -f 'soapC.c'; then $(CYGPATH_W) 'soapC.c'; else $(CYGPATH_W) '$(srcdir)/soapC.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo_ssl-soapC.Tpo $(DEPDIR)/wsrmdemo_ssl-soapC.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapC.c' object='wsrmdemo_ssl-soapC.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_ssl_CFLAGS) $(CFLAGS) -c -o wsrmdemo_ssl-soapC.obj `if test -f 'soapC.c'; then $(CYGPATH_W) 'soapC.c'; else $(CYGPATH_W) '$(srcdir)/soapC.c'; fi` wsrmdemo_ssl-soapServer.o: soapServer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_ssl_CFLAGS) $(CFLAGS) -MT wsrmdemo_ssl-soapServer.o -MD -MP -MF $(DEPDIR)/wsrmdemo_ssl-soapServer.Tpo -c -o wsrmdemo_ssl-soapServer.o `test -f 'soapServer.c' || echo '$(srcdir)/'`soapServer.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo_ssl-soapServer.Tpo $(DEPDIR)/wsrmdemo_ssl-soapServer.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapServer.c' object='wsrmdemo_ssl-soapServer.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_ssl_CFLAGS) $(CFLAGS) -c -o wsrmdemo_ssl-soapServer.o `test -f 'soapServer.c' || echo '$(srcdir)/'`soapServer.c wsrmdemo_ssl-soapServer.obj: soapServer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_ssl_CFLAGS) $(CFLAGS) -MT wsrmdemo_ssl-soapServer.obj -MD -MP -MF $(DEPDIR)/wsrmdemo_ssl-soapServer.Tpo -c -o wsrmdemo_ssl-soapServer.obj `if test -f 'soapServer.c'; then $(CYGPATH_W) 'soapServer.c'; else $(CYGPATH_W) '$(srcdir)/soapServer.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo_ssl-soapServer.Tpo $(DEPDIR)/wsrmdemo_ssl-soapServer.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapServer.c' object='wsrmdemo_ssl-soapServer.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_ssl_CFLAGS) $(CFLAGS) -c -o wsrmdemo_ssl-soapServer.obj `if test -f 'soapServer.c'; then $(CYGPATH_W) 'soapServer.c'; else $(CYGPATH_W) '$(srcdir)/soapServer.c'; fi` wsrmdemo_ssl-wsaapi.o: ../../plugin/wsaapi.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_ssl_CFLAGS) $(CFLAGS) -MT wsrmdemo_ssl-wsaapi.o -MD -MP -MF $(DEPDIR)/wsrmdemo_ssl-wsaapi.Tpo -c -o wsrmdemo_ssl-wsaapi.o `test -f '../../plugin/wsaapi.c' || echo '$(srcdir)/'`../../plugin/wsaapi.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo_ssl-wsaapi.Tpo $(DEPDIR)/wsrmdemo_ssl-wsaapi.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/wsaapi.c' object='wsrmdemo_ssl-wsaapi.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_ssl_CFLAGS) $(CFLAGS) -c -o wsrmdemo_ssl-wsaapi.o `test -f '../../plugin/wsaapi.c' || echo '$(srcdir)/'`../../plugin/wsaapi.c wsrmdemo_ssl-wsaapi.obj: ../../plugin/wsaapi.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_ssl_CFLAGS) $(CFLAGS) -MT wsrmdemo_ssl-wsaapi.obj -MD -MP -MF $(DEPDIR)/wsrmdemo_ssl-wsaapi.Tpo -c -o wsrmdemo_ssl-wsaapi.obj `if test -f '../../plugin/wsaapi.c'; then $(CYGPATH_W) '../../plugin/wsaapi.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/wsaapi.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo_ssl-wsaapi.Tpo $(DEPDIR)/wsrmdemo_ssl-wsaapi.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/wsaapi.c' object='wsrmdemo_ssl-wsaapi.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_ssl_CFLAGS) $(CFLAGS) -c -o wsrmdemo_ssl-wsaapi.obj `if test -f '../../plugin/wsaapi.c'; then $(CYGPATH_W) '../../plugin/wsaapi.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/wsaapi.c'; fi` wsrmdemo_ssl-wsrmapi.o: ../../plugin/wsrmapi.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_ssl_CFLAGS) $(CFLAGS) -MT wsrmdemo_ssl-wsrmapi.o -MD -MP -MF $(DEPDIR)/wsrmdemo_ssl-wsrmapi.Tpo -c -o wsrmdemo_ssl-wsrmapi.o `test -f '../../plugin/wsrmapi.c' || echo '$(srcdir)/'`../../plugin/wsrmapi.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo_ssl-wsrmapi.Tpo $(DEPDIR)/wsrmdemo_ssl-wsrmapi.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/wsrmapi.c' object='wsrmdemo_ssl-wsrmapi.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_ssl_CFLAGS) $(CFLAGS) -c -o wsrmdemo_ssl-wsrmapi.o `test -f '../../plugin/wsrmapi.c' || echo '$(srcdir)/'`../../plugin/wsrmapi.c wsrmdemo_ssl-wsrmapi.obj: ../../plugin/wsrmapi.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_ssl_CFLAGS) $(CFLAGS) -MT wsrmdemo_ssl-wsrmapi.obj -MD -MP -MF $(DEPDIR)/wsrmdemo_ssl-wsrmapi.Tpo -c -o wsrmdemo_ssl-wsrmapi.obj `if test -f '../../plugin/wsrmapi.c'; then $(CYGPATH_W) '../../plugin/wsrmapi.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/wsrmapi.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo_ssl-wsrmapi.Tpo $(DEPDIR)/wsrmdemo_ssl-wsrmapi.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/wsrmapi.c' object='wsrmdemo_ssl-wsrmapi.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_ssl_CFLAGS) $(CFLAGS) -c -o wsrmdemo_ssl-wsrmapi.obj `if test -f '../../plugin/wsrmapi.c'; then $(CYGPATH_W) '../../plugin/wsrmapi.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/wsrmapi.c'; fi` wsrmdemo_ssl-threads.o: ../../plugin/threads.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_ssl_CFLAGS) $(CFLAGS) -MT wsrmdemo_ssl-threads.o -MD -MP -MF $(DEPDIR)/wsrmdemo_ssl-threads.Tpo -c -o wsrmdemo_ssl-threads.o `test -f '../../plugin/threads.c' || echo '$(srcdir)/'`../../plugin/threads.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo_ssl-threads.Tpo $(DEPDIR)/wsrmdemo_ssl-threads.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/threads.c' object='wsrmdemo_ssl-threads.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_ssl_CFLAGS) $(CFLAGS) -c -o wsrmdemo_ssl-threads.o `test -f '../../plugin/threads.c' || echo '$(srcdir)/'`../../plugin/threads.c wsrmdemo_ssl-threads.obj: ../../plugin/threads.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_ssl_CFLAGS) $(CFLAGS) -MT wsrmdemo_ssl-threads.obj -MD -MP -MF $(DEPDIR)/wsrmdemo_ssl-threads.Tpo -c -o wsrmdemo_ssl-threads.obj `if test -f '../../plugin/threads.c'; then $(CYGPATH_W) '../../plugin/threads.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/threads.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo_ssl-threads.Tpo $(DEPDIR)/wsrmdemo_ssl-threads.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/threads.c' object='wsrmdemo_ssl-threads.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_ssl_CFLAGS) $(CFLAGS) -c -o wsrmdemo_ssl-threads.obj `if test -f '../../plugin/threads.c'; then $(CYGPATH_W) '../../plugin/threads.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/threads.c'; fi` wsrmdemo_ssl-duration.o: ../../custom/duration.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_ssl_CFLAGS) $(CFLAGS) -MT wsrmdemo_ssl-duration.o -MD -MP -MF $(DEPDIR)/wsrmdemo_ssl-duration.Tpo -c -o wsrmdemo_ssl-duration.o `test -f '../../custom/duration.c' || echo '$(srcdir)/'`../../custom/duration.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo_ssl-duration.Tpo $(DEPDIR)/wsrmdemo_ssl-duration.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../custom/duration.c' object='wsrmdemo_ssl-duration.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_ssl_CFLAGS) $(CFLAGS) -c -o wsrmdemo_ssl-duration.o `test -f '../../custom/duration.c' || echo '$(srcdir)/'`../../custom/duration.c wsrmdemo_ssl-duration.obj: ../../custom/duration.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_ssl_CFLAGS) $(CFLAGS) -MT wsrmdemo_ssl-duration.obj -MD -MP -MF $(DEPDIR)/wsrmdemo_ssl-duration.Tpo -c -o wsrmdemo_ssl-duration.obj `if test -f '../../custom/duration.c'; then $(CYGPATH_W) '../../custom/duration.c'; else $(CYGPATH_W) '$(srcdir)/../../custom/duration.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo_ssl-duration.Tpo $(DEPDIR)/wsrmdemo_ssl-duration.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../custom/duration.c' object='wsrmdemo_ssl-duration.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_ssl_CFLAGS) $(CFLAGS) -c -o wsrmdemo_ssl-duration.obj `if test -f '../../custom/duration.c'; then $(CYGPATH_W) '../../custom/duration.c'; else $(CYGPATH_W) '$(srcdir)/../../custom/duration.c'; fi` wsrmdemo_udp-wsrmdemo.o: wsrmdemo.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_udp_CFLAGS) $(CFLAGS) -MT wsrmdemo_udp-wsrmdemo.o -MD -MP -MF $(DEPDIR)/wsrmdemo_udp-wsrmdemo.Tpo -c -o wsrmdemo_udp-wsrmdemo.o `test -f 'wsrmdemo.c' || echo '$(srcdir)/'`wsrmdemo.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo_udp-wsrmdemo.Tpo $(DEPDIR)/wsrmdemo_udp-wsrmdemo.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='wsrmdemo.c' object='wsrmdemo_udp-wsrmdemo.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_udp_CFLAGS) $(CFLAGS) -c -o wsrmdemo_udp-wsrmdemo.o `test -f 'wsrmdemo.c' || echo '$(srcdir)/'`wsrmdemo.c wsrmdemo_udp-wsrmdemo.obj: wsrmdemo.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_udp_CFLAGS) $(CFLAGS) -MT wsrmdemo_udp-wsrmdemo.obj -MD -MP -MF $(DEPDIR)/wsrmdemo_udp-wsrmdemo.Tpo -c -o wsrmdemo_udp-wsrmdemo.obj `if test -f 'wsrmdemo.c'; then $(CYGPATH_W) 'wsrmdemo.c'; else $(CYGPATH_W) '$(srcdir)/wsrmdemo.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo_udp-wsrmdemo.Tpo $(DEPDIR)/wsrmdemo_udp-wsrmdemo.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='wsrmdemo.c' object='wsrmdemo_udp-wsrmdemo.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_udp_CFLAGS) $(CFLAGS) -c -o wsrmdemo_udp-wsrmdemo.obj `if test -f 'wsrmdemo.c'; then $(CYGPATH_W) 'wsrmdemo.c'; else $(CYGPATH_W) '$(srcdir)/wsrmdemo.c'; fi` wsrmdemo_udp-soapClient.o: soapClient.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_udp_CFLAGS) $(CFLAGS) -MT wsrmdemo_udp-soapClient.o -MD -MP -MF $(DEPDIR)/wsrmdemo_udp-soapClient.Tpo -c -o wsrmdemo_udp-soapClient.o `test -f 'soapClient.c' || echo '$(srcdir)/'`soapClient.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo_udp-soapClient.Tpo $(DEPDIR)/wsrmdemo_udp-soapClient.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapClient.c' object='wsrmdemo_udp-soapClient.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_udp_CFLAGS) $(CFLAGS) -c -o wsrmdemo_udp-soapClient.o `test -f 'soapClient.c' || echo '$(srcdir)/'`soapClient.c wsrmdemo_udp-soapClient.obj: soapClient.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_udp_CFLAGS) $(CFLAGS) -MT wsrmdemo_udp-soapClient.obj -MD -MP -MF $(DEPDIR)/wsrmdemo_udp-soapClient.Tpo -c -o wsrmdemo_udp-soapClient.obj `if test -f 'soapClient.c'; then $(CYGPATH_W) 'soapClient.c'; else $(CYGPATH_W) '$(srcdir)/soapClient.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo_udp-soapClient.Tpo $(DEPDIR)/wsrmdemo_udp-soapClient.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapClient.c' object='wsrmdemo_udp-soapClient.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_udp_CFLAGS) $(CFLAGS) -c -o wsrmdemo_udp-soapClient.obj `if test -f 'soapClient.c'; then $(CYGPATH_W) 'soapClient.c'; else $(CYGPATH_W) '$(srcdir)/soapClient.c'; fi` wsrmdemo_udp-soapC.o: soapC.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_udp_CFLAGS) $(CFLAGS) -MT wsrmdemo_udp-soapC.o -MD -MP -MF $(DEPDIR)/wsrmdemo_udp-soapC.Tpo -c -o wsrmdemo_udp-soapC.o `test -f 'soapC.c' || echo '$(srcdir)/'`soapC.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo_udp-soapC.Tpo $(DEPDIR)/wsrmdemo_udp-soapC.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapC.c' object='wsrmdemo_udp-soapC.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_udp_CFLAGS) $(CFLAGS) -c -o wsrmdemo_udp-soapC.o `test -f 'soapC.c' || echo '$(srcdir)/'`soapC.c wsrmdemo_udp-soapC.obj: soapC.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_udp_CFLAGS) $(CFLAGS) -MT wsrmdemo_udp-soapC.obj -MD -MP -MF $(DEPDIR)/wsrmdemo_udp-soapC.Tpo -c -o wsrmdemo_udp-soapC.obj `if test -f 'soapC.c'; then $(CYGPATH_W) 'soapC.c'; else $(CYGPATH_W) '$(srcdir)/soapC.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo_udp-soapC.Tpo $(DEPDIR)/wsrmdemo_udp-soapC.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapC.c' object='wsrmdemo_udp-soapC.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_udp_CFLAGS) $(CFLAGS) -c -o wsrmdemo_udp-soapC.obj `if test -f 'soapC.c'; then $(CYGPATH_W) 'soapC.c'; else $(CYGPATH_W) '$(srcdir)/soapC.c'; fi` wsrmdemo_udp-soapServer.o: soapServer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_udp_CFLAGS) $(CFLAGS) -MT wsrmdemo_udp-soapServer.o -MD -MP -MF $(DEPDIR)/wsrmdemo_udp-soapServer.Tpo -c -o wsrmdemo_udp-soapServer.o `test -f 'soapServer.c' || echo '$(srcdir)/'`soapServer.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo_udp-soapServer.Tpo $(DEPDIR)/wsrmdemo_udp-soapServer.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapServer.c' object='wsrmdemo_udp-soapServer.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_udp_CFLAGS) $(CFLAGS) -c -o wsrmdemo_udp-soapServer.o `test -f 'soapServer.c' || echo '$(srcdir)/'`soapServer.c wsrmdemo_udp-soapServer.obj: soapServer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_udp_CFLAGS) $(CFLAGS) -MT wsrmdemo_udp-soapServer.obj -MD -MP -MF $(DEPDIR)/wsrmdemo_udp-soapServer.Tpo -c -o wsrmdemo_udp-soapServer.obj `if test -f 'soapServer.c'; then $(CYGPATH_W) 'soapServer.c'; else $(CYGPATH_W) '$(srcdir)/soapServer.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo_udp-soapServer.Tpo $(DEPDIR)/wsrmdemo_udp-soapServer.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapServer.c' object='wsrmdemo_udp-soapServer.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_udp_CFLAGS) $(CFLAGS) -c -o wsrmdemo_udp-soapServer.obj `if test -f 'soapServer.c'; then $(CYGPATH_W) 'soapServer.c'; else $(CYGPATH_W) '$(srcdir)/soapServer.c'; fi` wsrmdemo_udp-wsaapi.o: ../../plugin/wsaapi.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_udp_CFLAGS) $(CFLAGS) -MT wsrmdemo_udp-wsaapi.o -MD -MP -MF $(DEPDIR)/wsrmdemo_udp-wsaapi.Tpo -c -o wsrmdemo_udp-wsaapi.o `test -f '../../plugin/wsaapi.c' || echo '$(srcdir)/'`../../plugin/wsaapi.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo_udp-wsaapi.Tpo $(DEPDIR)/wsrmdemo_udp-wsaapi.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/wsaapi.c' object='wsrmdemo_udp-wsaapi.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_udp_CFLAGS) $(CFLAGS) -c -o wsrmdemo_udp-wsaapi.o `test -f '../../plugin/wsaapi.c' || echo '$(srcdir)/'`../../plugin/wsaapi.c wsrmdemo_udp-wsaapi.obj: ../../plugin/wsaapi.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_udp_CFLAGS) $(CFLAGS) -MT wsrmdemo_udp-wsaapi.obj -MD -MP -MF $(DEPDIR)/wsrmdemo_udp-wsaapi.Tpo -c -o wsrmdemo_udp-wsaapi.obj `if test -f '../../plugin/wsaapi.c'; then $(CYGPATH_W) '../../plugin/wsaapi.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/wsaapi.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo_udp-wsaapi.Tpo $(DEPDIR)/wsrmdemo_udp-wsaapi.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/wsaapi.c' object='wsrmdemo_udp-wsaapi.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_udp_CFLAGS) $(CFLAGS) -c -o wsrmdemo_udp-wsaapi.obj `if test -f '../../plugin/wsaapi.c'; then $(CYGPATH_W) '../../plugin/wsaapi.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/wsaapi.c'; fi` wsrmdemo_udp-wsrmapi.o: ../../plugin/wsrmapi.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_udp_CFLAGS) $(CFLAGS) -MT wsrmdemo_udp-wsrmapi.o -MD -MP -MF $(DEPDIR)/wsrmdemo_udp-wsrmapi.Tpo -c -o wsrmdemo_udp-wsrmapi.o `test -f '../../plugin/wsrmapi.c' || echo '$(srcdir)/'`../../plugin/wsrmapi.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo_udp-wsrmapi.Tpo $(DEPDIR)/wsrmdemo_udp-wsrmapi.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/wsrmapi.c' object='wsrmdemo_udp-wsrmapi.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_udp_CFLAGS) $(CFLAGS) -c -o wsrmdemo_udp-wsrmapi.o `test -f '../../plugin/wsrmapi.c' || echo '$(srcdir)/'`../../plugin/wsrmapi.c wsrmdemo_udp-wsrmapi.obj: ../../plugin/wsrmapi.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_udp_CFLAGS) $(CFLAGS) -MT wsrmdemo_udp-wsrmapi.obj -MD -MP -MF $(DEPDIR)/wsrmdemo_udp-wsrmapi.Tpo -c -o wsrmdemo_udp-wsrmapi.obj `if test -f '../../plugin/wsrmapi.c'; then $(CYGPATH_W) '../../plugin/wsrmapi.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/wsrmapi.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo_udp-wsrmapi.Tpo $(DEPDIR)/wsrmdemo_udp-wsrmapi.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/wsrmapi.c' object='wsrmdemo_udp-wsrmapi.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_udp_CFLAGS) $(CFLAGS) -c -o wsrmdemo_udp-wsrmapi.obj `if test -f '../../plugin/wsrmapi.c'; then $(CYGPATH_W) '../../plugin/wsrmapi.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/wsrmapi.c'; fi` wsrmdemo_udp-threads.o: ../../plugin/threads.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_udp_CFLAGS) $(CFLAGS) -MT wsrmdemo_udp-threads.o -MD -MP -MF $(DEPDIR)/wsrmdemo_udp-threads.Tpo -c -o wsrmdemo_udp-threads.o `test -f '../../plugin/threads.c' || echo '$(srcdir)/'`../../plugin/threads.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo_udp-threads.Tpo $(DEPDIR)/wsrmdemo_udp-threads.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/threads.c' object='wsrmdemo_udp-threads.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_udp_CFLAGS) $(CFLAGS) -c -o wsrmdemo_udp-threads.o `test -f '../../plugin/threads.c' || echo '$(srcdir)/'`../../plugin/threads.c wsrmdemo_udp-threads.obj: ../../plugin/threads.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_udp_CFLAGS) $(CFLAGS) -MT wsrmdemo_udp-threads.obj -MD -MP -MF $(DEPDIR)/wsrmdemo_udp-threads.Tpo -c -o wsrmdemo_udp-threads.obj `if test -f '../../plugin/threads.c'; then $(CYGPATH_W) '../../plugin/threads.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/threads.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo_udp-threads.Tpo $(DEPDIR)/wsrmdemo_udp-threads.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/threads.c' object='wsrmdemo_udp-threads.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_udp_CFLAGS) $(CFLAGS) -c -o wsrmdemo_udp-threads.obj `if test -f '../../plugin/threads.c'; then $(CYGPATH_W) '../../plugin/threads.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/threads.c'; fi` wsrmdemo_udp-duration.o: ../../custom/duration.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_udp_CFLAGS) $(CFLAGS) -MT wsrmdemo_udp-duration.o -MD -MP -MF $(DEPDIR)/wsrmdemo_udp-duration.Tpo -c -o wsrmdemo_udp-duration.o `test -f '../../custom/duration.c' || echo '$(srcdir)/'`../../custom/duration.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo_udp-duration.Tpo $(DEPDIR)/wsrmdemo_udp-duration.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../custom/duration.c' object='wsrmdemo_udp-duration.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_udp_CFLAGS) $(CFLAGS) -c -o wsrmdemo_udp-duration.o `test -f '../../custom/duration.c' || echo '$(srcdir)/'`../../custom/duration.c wsrmdemo_udp-duration.obj: ../../custom/duration.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_udp_CFLAGS) $(CFLAGS) -MT wsrmdemo_udp-duration.obj -MD -MP -MF $(DEPDIR)/wsrmdemo_udp-duration.Tpo -c -o wsrmdemo_udp-duration.obj `if test -f '../../custom/duration.c'; then $(CYGPATH_W) '../../custom/duration.c'; else $(CYGPATH_W) '$(srcdir)/../../custom/duration.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo_udp-duration.Tpo $(DEPDIR)/wsrmdemo_udp-duration.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../custom/duration.c' object='wsrmdemo_udp-duration.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_udp_CFLAGS) $(CFLAGS) -c -o wsrmdemo_udp-duration.obj `if test -f '../../custom/duration.c'; then $(CYGPATH_W) '../../custom/duration.c'; else $(CYGPATH_W) '$(srcdir)/../../custom/duration.c'; fi` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am $(SOAP_C_SRC) : $(SOAPHEADER) $(SOAP) -cL -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $(SOAPHEADER) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.28/gsoap/samples/wsrm/server.pem0000644000175000017500000000724212653650156020060 0ustar ellertellert-----BEGIN ENCRYPTED PRIVATE KEY----- MIICxjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQI74Clf0036IICAggA MBQGCCqGSIb3DQMHBAiOmGBFtHOX0wSCAoAPb8WN47mTunpkPpzBSNd4i+qX1f4V XyFMWxdibGTclHfNesksWkg38E0nt9ORMImgvpKIHgQ2l+dt725uAoRhtuva7N2R kQKkJOtbzlxbgmi0QylcaEZYCw/OLsL0sH0xaoJDJsjwF74RAu4CJ7XVPR+ldPb9 hWSPb9KIkAe779KChZUaEkDa61ce0Bh7hSztjXYKqwI4W+xB0hv32dkwiap74mxr qw8fqu64+jj2UipUG0FVkruuYy0bW8Nh1P4aGIIKpFjjNBaHQoHWuluh0jDI7cpT A0Sfyg1teEtbBJgF2ebej6f7AHMHq2PuPo/nWzb2d6Akkc3q1Ab44yUeRgPhNTxA glhjoCSOOIFm2YfBh22A1h3JHDyr4INptSnlPl4lMMFYLS/JmJ+zg0cUTK53uY91 ncBtu6odT69Vxb/z5X3LIhjqJS6oSXDoFMlHxLkFyLamjPBgtvNSnlLQPWsrwpUd Fsl94W7OxIu4U711xMBbkYbYhLOAQ3KlF1GbYIyfOcQbvJ8UsXu959WJK6bQ0+ud XcnmQFZnEoxtDMcSCqcZfbcTasHGvrp4pBpxUyPNC5AUnLXsIg5QaplO7i5atrT/ e/I/jPA7AefUol5s8fyDKbKNBfuPk6VTvtIXKEGP8vKf5ZRai6HhhoE0pbEsNdSD CVfESYrTfgXf2h1gvSunWwDMbC/AaaNjjoHBTLQJfCbvacqK9zz/8o/BFEUWi/30 KeqA5pnlKIRL2nblWcKZE9xSKomsZqch7xTK5m9FUxAwwlAAVM5kwgiaFGEgrAO2 pFP9pJxZzxThlxQi2EgyHUoGqPjdPNFVuhBEcyIhVZp86qoikNoxtdBE -----END ENCRYPTED PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIID4TCCA0qgAwIBAgIBHzANBgkqhkiG9w0BAQUFADCBjTELMAkGA1UEBhMCVVMx CzAJBgNVBAgTAkZMMRQwEgYDVQQHEwtUYWxsYWhhc3NlZTEWMBQGA1UEChMNR2Vu aXZpYSwgSW5jLjELMAkGA1UECxMCSVQxEjAQBgNVBAMTCWxvY2FsaG9zdDEiMCAG CSqGSIb3DQEJARYTY29udGFjdEBnZW5pdmlhLmNvbTAeFw0xNTA4MDQxOTAzNDda Fw0xODA4MDMxOTAzNDdaMIGNMQswCQYDVQQGEwJVUzELMAkGA1UECBMCRkwxFDAS BgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYDVQQKEw1HZW5pdmlhLCBJbmMuMQswCQYD VQQLEwJJVDESMBAGA1UEAxMJbG9jYWxob3N0MSIwIAYJKoZIhvcNAQkBFhNjb250 YWN0QGdlbml2aWEuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC4J9vn Sde1q+Pyvgs4QUPiNKnqezL0Cqp1vA7gfUJ31Q/0071gkgMSX/DL+SZPjRSfEjA1 c9JyPjSdeZ5zydAz9f5R680Nvs8VKR9MsB3/XAnI3Rhd9G11QHXuW7DsaF6TXHNk EoipcN7ebie9eeqadv8xzhvTBHBE8rkf8iMI2QIDAQABo4IBTTCCAUkwCQYDVR0T BAIwADALBgNVHQ8EBAMCBPAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMC MCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAd BgNVHQ4EFgQUYJXHvmkvx1zc7GjmBJ9G0YQpKSgwgcIGA1UdIwSBujCBt4AU+MeC gLt+4soPx4i3OiBZYwMqlNChgZOkgZAwgY0xCzAJBgNVBAYTAlVTMQswCQYDVQQI EwJGTDEUMBIGA1UEBxMLVGFsbGFoYXNzZWUxFjAUBgNVBAoTDUdlbml2aWEsIElu Yy4xCzAJBgNVBAsTAklUMRIwEAYDVQQDEwlsb2NhbGhvc3QxIjAgBgkqhkiG9w0B CQEWE2NvbnRhY3RAZ2VuaXZpYS5jb22CCQDWdgbFTLQbVTANBgkqhkiG9w0BAQUF AAOBgQCNUuW182UC2YqBE3oEtwaguyYWOR5aZIUE4znV9thu7xBZhCoFhukmQX0L TwoSiW7Yt7vx0cUL4RQltT4D225ANhogdmBh0JmIXc60DtpnCs43IjTT1moUwx6T M51IxVIgksklJuo7UIILrYWlIR3GjDWGOEpQQmQhoLS10lVAyQ== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDkDCCAvmgAwIBAgIJANZ2BsVMtBtVMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYD VQQGEwJVUzELMAkGA1UECBMCRkwxFDASBgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYD VQQKEw1HZW5pdmlhLCBJbmMuMQswCQYDVQQLEwJJVDESMBAGA1UEAxMJbG9jYWxo b3N0MSIwIAYJKoZIhvcNAQkBFhNjb250YWN0QGdlbml2aWEuY29tMB4XDTE1MDgw NDE5MDEyMFoXDTE4MDgwMzE5MDEyMFowgY0xCzAJBgNVBAYTAlVTMQswCQYDVQQI EwJGTDEUMBIGA1UEBxMLVGFsbGFoYXNzZWUxFjAUBgNVBAoTDUdlbml2aWEsIElu Yy4xCzAJBgNVBAsTAklUMRIwEAYDVQQDEwlsb2NhbGhvc3QxIjAgBgkqhkiG9w0B CQEWE2NvbnRhY3RAZ2VuaXZpYS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJ AoGBALx/LiwGRi4wH8y0MEL64VJs5H2O1F4uuYO+aNVZHl5ULRDmSh/4eF8aOYXT B05PfVoctBogcK0ohPEhiUcR/029LQTkEs/5D7XsuRuQsUnMfkEihmC2VtEuJMqT OeXmuIcemEw0QL3ulny7H8W6Aq2rByC2r5iqytnM4Uuw7LMnAgMBAAGjgfUwgfIw HQYDVR0OBBYEFPjHgoC7fuLKD8eItzogWWMDKpTQMIHCBgNVHSMEgbowgbeAFPjH goC7fuLKD8eItzogWWMDKpTQoYGTpIGQMIGNMQswCQYDVQQGEwJVUzELMAkGA1UE CBMCRkwxFDASBgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYDVQQKEw1HZW5pdmlhLCBJ bmMuMQswCQYDVQQLEwJJVDESMBAGA1UEAxMJbG9jYWxob3N0MSIwIAYJKoZIhvcN AQkBFhNjb250YWN0QGdlbml2aWEuY29tggkA1nYGxUy0G1UwDAYDVR0TBAUwAwEB /zANBgkqhkiG9w0BAQUFAAOBgQB+fmbScGp3R4D0Sf4gbBJ/3CGEn4/HvupSikDq vyaviwJ2KQKGlAr/lDh1qSYItkazJpJDIxyG2Dzm2w0F0u1+CSwpym6eq1pxc8dh GRdrCVyuM0gUoBvxUym7o0Bq1V6onUjwrAti+onsZjDpfAIKBI8TRfjuTNzFeSAV G2zULg== -----END CERTIFICATE----- gsoap-2.8.28/gsoap/samples/wsrm/wsrmdemo.c0000644000175000017500000007224212653650156020052 0ustar ellertellert/* wsrmdemo.c WS-ReliableMessaging 1.1 and WS-Addressing demo service and client. See the wsrmdemo.h header file for build and usage details. See gsoap/doc/wsrm for the WS-RM plugin user guide. gSOAP XML Web services tools Copyright (C) 2000-2012, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under one of the following licenses: GPL, the gSOAP public license, or Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2010, Robert van Engelen, Genivia Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ /* This code auto-configures depending on the folling flags: -D WITH_UDP: enables UDP, disables multithreaded servicing -D WITH_OPENSSL: enables SSL transfers (transfer security) To use WS-ReliableMessaging 1.0, change wsrmdemo.h to import the 2005 protocol, then rerun soapcpp2 and compile: #import "wsrm5.h" */ #include "soapH.h" #include "wsrmdemo.nsmap" #include /* defines _POSIX_THREADS if pthreads are available */ #if defined(_POSIX_THREADS) || defined(_SC_THREADS) #include /* from plugin/threads.h */ #endif #include "wsaapi.h" /* from plugin/wsaapi.h */ #include "wsrmapi.h" /* from plugin/wsrmapi.h */ /* HTTP Basic Authentication is used by default, which is only secure over HTTPS. Use the HTTP Digest Authentication plugin for secure auth over HTTP by enabling this line: #include "httpda.h" Then compile and link with plugin/httpda.c and plugin/md5evp.c, Compile with -DWITH_OPENSSL to use SSL. */ /******************************************************************************\ * * Common Constants * \******************************************************************************/ #if defined(WITH_UDP) # define HTTP_TARGET "soap.udp:" /* Test WS-ReliableMessaging with SOAP-over-UDP */ #elif defined(WITH_OPENSSL) # define HTTP_TARGET "https:" /* Test HTTPS */ #else # define HTTP_TARGET "http:" #endif #if defined(WITH_OPENSSL) || defined(HTTPDA_H) # define HTTP_USERID "foo" # define HTTP_PASSWD "bar" # define HTTP_REALM "svc" #endif #if defined(HTTP_USERID) && defined(HTTP_PASSWD) const char *userid = HTTP_USERID; const char *passwd = HTTP_PASSWD; #else const char *userid = NULL; const char *passwd = NULL; #endif /* the matching SOAP/WSA actions, defined in wsdldemo.h service definitions */ const char *RequestAction = "urn:wsrmdemo/wsrmdemoPort/wsrmdemo"; const char *ResponseAction = "urn:wsrmdemo/wsrmdemoPort/wsrmdemoResponse"; const char *serverURI = HTTP_TARGET"//localhost:8000"; const char *clientURI = HTTP_TARGET"//localhost:8001"; int serverPort = 8000; int clientPort = 8001; /******************************************************************************\ * * Main Implements a Server and Client * \******************************************************************************/ int callback_poll(struct soap *soap, int timeout); void *callback_server(void *soap); void *process_request(void *soap); int CRYPTO_thread_setup(); void CRYPTO_thread_cleanup(); int main(int argc, char **argv) { struct soap *soap = soap_new1(SOAP_XML_INDENT | SOAP_XML_STRICT); #ifdef HTTPDA_H /* Use HTTP Digest Authentication, see gsoap/doc/httpda/html/index.html */ struct http_da_info info; soap_register_plugin(soap, http_da); http_da_save(soap, &info, HTTP_REALM, HTTP_USERID, HTTP_PASSWD); #endif soap_register_plugin(soap, soap_wsa); soap_register_plugin(soap, soap_wsrm); if (argc < 2) /* no args: server */ { soap_set_mode(soap, SOAP_IO_KEEPALIVE); #if !defined(WITH_UDP) && defined(THREADS_H) THREAD_TYPE tid; #endif /* TCP/IP and UDP timeouts + = seconds, - = microsecond*/ soap->send_timeout = soap->recv_timeout = 5; #if defined(WITH_UDP) /* UDP recv timeout is short to limit blocking time */ soap->recv_timeout = -200000; /* set UDP server, pure XML w/o HTTP headers */ soap_set_mode(soap, SOAP_IO_UDP); #elif defined(WITH_OPENSSL) if (CRYPTO_thread_setup()) { fprintf(stderr, "Cannot setup thread mutex for OpenSSL\n"); exit(1); } /* WS-Addressing server uses client-side sends, so init SSL for client+server: */ if (soap_ssl_server_context(soap, SOAP_SSL_DEFAULT, "server.pem", /* keyfile (server) */ "password", /* password to read the key file (server) */ "cacert.pem", /* cacert file to store trusted certificates (client) */ NULL, /* optional capath */ NULL, /* DH file name or DH param key len bits, NULL: RSA */ NULL, /* file with random data to seed randomness */ NULL /* unique server identification for SSL session cache */ )) { soap_print_fault(soap, stderr); exit(1); } #endif soap->bind_flags = SO_REUSEADDR; /* allow immediate port rebinding */ if (!soap_valid_socket(soap_bind(soap, NULL, serverPort, 100))) { soap_print_fault(soap, stderr); exit(1); } printf("**** Server Running\n"); soap->accept_timeout = -100000; /* 100ms timeout: do not block on accept */ for (;;) { /* TCP accept (for UDP simply returns current socket) */ if (!soap_valid_socket(soap_accept(soap))) { if (soap->errnum) soap_print_fault(soap, stderr); else /* timeout, send acknowledgements to all peers */ { soap_wsrm_pulse(soap, -10000); /* 10 ms */ #ifdef WITH_UDP sleep(1); /* optional, needed for UDP: accept() ruturns immediately */ #endif } continue; } /* do not spawn threads for UDP, since accept() is a no-op for UDP */ #if !defined(WITH_UDP) && defined(THREADS_H) THREAD_CREATE(&tid, (void*(*)(void*))process_request, (void*)soap_copy(soap)); #else #if !defined(WITH_UDP) && defined(WITH_OPENSSL) /* SSL accept */ if (soap_ssl_accept(soap)) { soap_print_fault(soap, stderr); fprintf(stderr, "SSL request failed, continue with next call...\n"); soap_destroy(soap); soap_end(soap); continue; } #endif if (soap_serve(soap) && soap->error != SOAP_STOP && soap->error != SOAP_EOF) soap_print_fault(soap, stderr); else if (soap->error != SOAP_EOF || soap->errnum) printf("\n**** Request served\n"); soap_wsrm_dump(soap, stdout); soap_destroy(soap); soap_end(soap); #endif } soap_destroy(soap); soap_end(soap); soap_done(soap); /* MUST call before CRYPTO_thread_cleanup */ CRYPTO_thread_cleanup(); } else /* client */ { xsd__duration expires = 30000; /* 30000 ms to expire */ soap_wsrm_sequence_handle seq; struct ns__wsrmdemoResponse res; int retry; const char *replyto = NULL; struct soap *callback = NULL; int duplex = 0; /* duplex mode */ int server = 0; /* use callback server with duplex mode */ int alive = 0; /* keep-alive callback port */ const char *to = NULL; /* service endpoint */ #ifdef THREADS_H THREAD_TYPE tid; #endif /* TCP/IP and UDP timeouts + = seconds, - = microsecond*/ soap->send_timeout = soap->recv_timeout = 5; #if defined(WITH_UDP) /* UDP recv timeout is short to limit blocking time */ soap->recv_timeout = -200000; /* "soap.udp:" endpoint specifies SOAP-over-UDP and should always be used for ReplyTo and FaultTo if these use UDP */ /* When the endpoint is an IP with a UDP destination, it is important to set UDP: */ soap_set_mode(soap, SOAP_IO_UDP); #elif defined(WITH_OPENSSL) CRYPTO_thread_setup(); if (soap_ssl_client_context(soap, SOAP_SSL_DEFAULT | SOAP_SSL_SKIP_HOST_CHECK, NULL, /* optional keyfile to authenticate to server */ NULL, /* password to read the keyfile */ "cacert.pem", /* cacert file to store trusted certificates */ NULL, /* capath to directory with trusted certificates */ NULL /* optional file with random data to seed randomness */ )) { soap_print_fault(soap, stderr); exit(1); } #endif /* Command-line options: d duplex mode with dual channels s callback server for duplex mode (default is callback polling) */ if (argc >= 3) { if (strchr(argv[2], 's')) { duplex = 1; server = 1; } else if (strchr(argv[2], 'd')) { duplex = 1; #ifdef WITH_OPENSSL fprintf(stderr, "Warning: SSL requires a callback server for duplex mode, because the client waits for the HTTP Accepted response while server is sending a message to the callback: deadlock will occur\n"); #endif } if (strchr(argv[2], 'a')) alive = 1; } if (alive) soap_set_mode(soap, SOAP_IO_KEEPALIVE); if (duplex) { /* set up the callback for duplex communication */ replyto = clientURI; callback = soap_new1(SOAP_XML_INDENT | SOAP_XML_STRICT); if (alive) soap_set_mode(callback, SOAP_IO_KEEPALIVE); soap_register_plugin(callback, soap_wsa); soap_register_plugin(callback, soap_wsrm); #if defined(WITH_UDP) /* "soap.udp:" endpoint specifies SOAP-over-UDP and should always be used for ReplyTo and FaultTo if these use UDP */ /* When the endpoint is an IP with a UDP destination, it is important to set UDP: */ soap_set_mode(callback, SOAP_IO_UDP); #elif defined(WITH_OPENSSL) if (soap_ssl_server_context(callback, SOAP_SSL_DEFAULT, "client.pem", /* keyfile (client) */ "password", /* password to read the key file (server) */ "cacert.pem", /* cacert file to store trusted certificates (client) */ NULL, /* optional capath */ NULL, /* DH file name or DH param key len bits, NULL: RSA */ NULL, /* file with random data to seed randomness */ NULL /* unique server identification for SSL session cache */ )) { soap_print_fault(soap, stderr); exit(1); } #endif callback->bind_flags = SO_REUSEADDR; /* allow immediate port rebinding */ if (!soap_valid_socket(soap_bind(callback, NULL, clientPort, 100))) { soap_print_fault(soap, stderr); exit(1); } } #ifdef THREADS_H if (server) THREAD_CREATE(&tid, (void*(*)(void*))callback_server, (void*)callback); #endif printf("\n**** Creating a Sequence\n"); #ifdef HTTPDA_H /* Digest Auth */ http_da_restore(soap, &info); #else /* Basic Auth */ soap->userid = userid; soap->passwd = passwd; #endif if (soap_wsrm_create_offer(soap, serverURI, replyto, NULL, expires, DiscardEntireSequence, NULL, &seq)) { if (soap->error == 202) printf("\n**** Create request was accepted\n"); else if (!duplex) /* if not duplex, error is fatal */ { soap_print_fault(soap, stderr); soap_wsrm_seq_free(soap, seq); return soap->error; } } if (duplex) { for (retry = 10; retry && !soap_wsrm_seq_created(soap, seq); retry--) { if (server) sleep(1); /* wait for callback server to receive response */ else if (callback_poll(callback, 1)) /* poll for 1 sec */ return callback->error; } if (!retry) { fprintf(stderr, "CANNOT CREATE SEQUENCE - SERVER NOT RESPONDING\n"); exit(1); } } soap_wsrm_dump(soap, stdout); printf("\n**** Sending first message\n"); #ifdef HTTPDA_H /* Digest Auth */ http_da_restore(soap, &info); #else /* Basic Auth */ soap->userid = userid; soap->passwd = passwd; #endif /* this shows how to use a retry loop to improve message delivery */ /* UDP may timeout when no UDP response message is sent by the server */ if (soap_wsrm_request(soap, seq, soap_wsa_rand_uuid(soap), RequestAction)) { soap_print_fault(soap, stderr); return soap->error; } while ((to = soap_wsrm_to(seq)) != NULL && soap_call_ns__wsrmdemo(soap, to, RequestAction, "First Message", &res)) { if (soap->error == 202) { printf("\n**** Request was accepted\n"); break; } else if (soap->error == SOAP_NO_TAG) /* empty */ { printf("\n**** Request was accepted, acks received\n"); break; } else if (duplex) /* duplex: we opt not to retry (could poll first) */ break; soap_print_fault(soap, stderr); /* only continue if retry is recommended */ if (soap_wsrm_check_retry(soap, seq)) break; /* wait a second to give network a chance to recover */ printf("\n**** Transmission failed: retrying after 1 second...\n"); sleep(1); } if (soap->error == SOAP_OK || soap->error == 202) printf("\n**** Response OK\n"); soap_wsrm_dump(soap, stdout); if (duplex) { if (server) sleep(1); else if (callback_poll(callback, -200000)) /* poll for 200 ms */ return callback->error; } printf("\n**** Sending second message, requesting acks\n"); #ifdef HTTPDA_H /* Digest Auth */ http_da_restore(soap, &info); #else /* Basic Auth */ soap->userid = userid; soap->passwd = passwd; #endif /* here we just send the message without retry loop */ /* UDP may timeout when no UDP response message is sent by the server */ to = soap_wsrm_to(seq); if (to) { if (soap_wsrm_request_acks(soap, seq, soap_wsa_rand_uuid(soap), RequestAction)) { soap_print_fault(soap, stderr); return soap->error; } if (soap_call_ns__wsrmdemo(soap, to, RequestAction, (char*)"Second Message", &res)) { if (soap->error == 202) printf("\n**** Request was accepted\n"); else if (soap->error == SOAP_NO_TAG) /* empty */ printf("\n**** Request was accepted, acks received\n"); else if (!duplex) soap_print_fault(soap, stderr); } else printf("\n**** Response OK\n"); if (duplex) { if (server) sleep(1); else if (callback_poll(callback, -200000)) /* poll for 200 ms */ return callback->error; } } /* check for any non-acked messages, and resend these */ if (soap_wsrm_nack(seq)) { printf("\n**** Resending "SOAP_ULONG_FORMAT" Non-Acked Messages\n", soap_wsrm_nack(seq)); soap_wsrm_resend(soap, seq, 0, 0); /* 0 0 means full range of msg nums of non-acked message to resend */ if (duplex) { if (server) sleep(1); else if (callback_poll(callback, 1)) /* poll for 1 sec */ return callback->error; } } soap_wsrm_dump(soap, stdout); printf("\n**** Sending third message\n"); #ifdef HTTPDA_H /* Digest Auth */ http_da_restore(soap, &info); #else /* Basic Auth */ soap->userid = userid; soap->passwd = passwd; #endif /* here we show how to just send the message without retry loop */ /* UDP may timeout when no UDP response message is sent by the server */ to = soap_wsrm_to(seq); if (to) { if (soap_wsrm_request(soap, seq, soap_wsa_rand_uuid(soap), RequestAction)) { soap_print_fault(soap, stderr); return soap->error; } if (soap_call_ns__wsrmdemo(soap, to, RequestAction, argv[1], &res)) { if (soap->error == 202) printf("\n**** Request was accepted\n"); else if (soap->error == SOAP_NO_TAG) /* empty */ printf("\n**** Request was accepted, acks received\n"); else if (!duplex) soap_print_fault(soap, stderr); } else printf("\n**** Response OK\n"); if (duplex) { if (server) sleep(1); /* allows to get messages before closing */ else if (callback_poll(callback, -200000)) /* poll for 200 ms */ return callback->error; } soap_wsrm_dump(soap, stdout); } printf("\n**** Closing the Sequence\n"); #ifdef HTTPDA_H /* Digest Auth */ http_da_restore(soap, &info); #else /* Basic Auth */ soap->userid = userid; soap->passwd = passwd; #endif /* close the sequence */ if (soap_wsrm_close(soap, seq, soap_wsa_rand_uuid(soap))) { if (soap->error == 202) printf("\n**** Close request was accepted\n"); else if (!duplex) { soap_print_fault(soap, stderr); soap_wsrm_seq_free(soap, seq); return soap->error; } } if (duplex) { if (server) sleep(1); /* still accept messages after close */ else if (callback_poll(callback, 1)) /* poll for 1 sec */ return callback->error; } soap_wsrm_dump(soap, stdout); /* Resend messages marked as non-acked (as an option) */ for (retry = 2; retry && soap_wsrm_nack(seq); retry--) { printf("\n**** Resending "SOAP_ULONG_FORMAT" Non-Acked Messages\n", soap_wsrm_nack(seq)); soap_wsrm_resend(soap, seq, 0, 0); /* 0 0 means full range of msg nums */ if (duplex) { if (server) sleep(1); else if (callback_poll(callback, 1)) /* poll for 1 sec */ return callback->error; } } printf("\n**** Terminating the Sequence\n"); #ifdef HTTPDA_H /* Digest Auth */ http_da_restore(soap, &info); #else /* Basic Auth */ soap->userid = userid; soap->passwd = passwd; #endif /* termination fails if the server did not get all messages */ if (soap_wsrm_terminate(soap, seq, soap_wsa_rand_uuid(soap))) { if (soap->error == 202) printf("\n**** Terminate request was accepted\n"); else if (!duplex || soap->error != SOAP_EOF) soap_print_fault(soap, stderr); } if (duplex) { if (server) sleep(1); else if (callback_poll(callback, 1)) /* poll for 1 sec */ return callback->error; } soap_wsrm_dump(soap, stdout); #ifdef THREADS_H if (server) THREAD_JOIN(tid); #endif /* delete the sequence */ soap_wsrm_seq_free(soap, seq); /* delete the callback */ if (callback) { soap_destroy(callback); soap_end(callback); soap_free(callback); } /* cleanup deserialized data, allowed at any time in/after sequence */ soap_destroy(soap); soap_end(soap); soap_free(soap); /* MUST call before CRYPTO_thread_cleanup */ CRYPTO_thread_cleanup(); } return 0; } /******************************************************************************\ * * Threaded Server * \******************************************************************************/ #ifdef THREADS_H void *process_request(void *ctx) { struct soap *soap = (struct soap*)ctx; pthread_detach(pthread_self()); #if !defined(WITH_UDP) && defined(WITH_OPENSSL) /* SSL accept */ if (soap_ssl_accept(soap)) { soap_print_fault(soap, stderr); fprintf(stderr, "SSL request failed\n"); soap_destroy(soap); soap_end(soap); soap_free(soap); return NULL; } #endif if (soap_serve(soap) && soap->error != SOAP_STOP && soap->error != SOAP_EOF) soap_print_fault(soap, stderr); else if (soap->error == SOAP_EOF && soap->errnum == 0) printf("\n**** Thread timed out\n"); else { printf("\n**** Request served by thread\n"); soap_wsrm_dump(soap, stdout); } soap_destroy(soap); soap_end(soap); soap_free(soap); return NULL; } #endif /******************************************************************************\ * * Optional Client-Side Threaded Callback Server * \******************************************************************************/ #ifdef THREADS_H void *callback_server(void *ctx) { struct soap *soap = (struct soap*)ctx; soap->accept_timeout = 10; /* server quits after 10 seconds of inactivity */ soap->recv_timeout = 10; soap->send_timeout = 1; /* 1 sec I/O timeout */ printf("\n**** Callback Server Running\n"); while (soap_valid_socket(soap_accept(soap))) { #if !defined(WITH_UDP) && defined(WITH_OPENSSL) if (soap_ssl_accept(soap)) { soap_print_fault(soap, stderr); fprintf(stderr, "SSL request failed, continue with next call...\n"); continue; } #endif if (soap_serve(soap) && soap->error != SOAP_STOP && soap->error != SOAP_EOF) soap_print_fault(soap, stderr); else if (soap->error == SOAP_EOF && !soap->errnum) continue; /* messaging IO timed out */ else soap_wsrm_dump(soap, stdout); } printf("\n**** Callback Server Terminated\n"); return NULL; } #endif /******************************************************************************\ * * Client-Side Callback Polling * \******************************************************************************/ int callback_poll(struct soap *soap, int timeout) { int poll = 5; /* 5 poll cycles max, ensures we make progress */ soap->accept_timeout = timeout; soap->recv_timeout = timeout; soap->send_timeout = 1; /* 1 sec I/O timeout */ printf("\n**** Callback Polling\n"); while (poll-- && soap_valid_socket(soap_accept(soap))) { #if !defined(WITH_UDP) && defined(WITH_OPENSSL) if (soap_ssl_accept(soap)) { soap_print_fault(soap, stderr); fprintf(stderr, "SSL request failed, continue with next call...\n"); continue; } #endif if (soap_serve(soap) && soap->error != SOAP_STOP) { if (soap->error == SOAP_EOF) /* timed out */ return SOAP_OK; soap_print_fault(soap, stderr); return soap->error; } soap_wsrm_dump(soap, stdout); } return SOAP_OK; } /******************************************************************************\ * * Service Operations * \******************************************************************************/ int ns__wsrmdemo(struct soap *soap, char *in, struct ns__wsrmdemoResponse *result) { /* check Basic/Digest Auth, when enabled */ if (userid && passwd) { if (!soap->userid || !soap->passwd || strcmp(userid, soap->userid) || strcmp(passwd, soap->passwd)) { #ifdef HTTPDA_H soap->authrealm = HTTP_REALM; #endif return 401; /* HTTP Unauthorized */ } } /* check for WS-RM/WSA and set WS-RM/WSA return headers */ if (soap_wsrm_check(soap)) return soap->error; printf("\n**** Received Request \"%s\"\n", in?in:"(null)"); /* simulate a fatal server error, which is possibly relayed */ /* for fatal errors that terminate the sequence, we must call soap_wsrm_sender_fault() before soap_wsrm_check() */ if (in && !strcmp(in, "error")) { /* this is fatal, we terminate the sequence */ soap_wsrm_sequence_handle seq = soap_wsrm_seq(soap); soap_wsrm_error(soap, seq, wsrm__SequenceTerminated); soap_wsrm_seq_release(soap, seq); printf("\n**** Simulating Server Operation Fatal Error\n"); return soap_wsrm_sender_fault(soap, "The demo service wsrmdemo() operation generated a fatal error", NULL); } /* simulate a non-fatal user-defined error, which is can be relayed */ if (in && !strcmp(in, "fault")) { printf("\n**** Simulating Server Operation Fault\n"); return soap_wsrm_sender_fault(soap, "The demo service wsrmdemo() operation returned a fault", NULL); } result->out = in; #if 0 /* to just respond without requesting acks for response messages: */ return soap_wsrm_reply(soap, soap_wsa_rand_uuid(soap), ResponseAction); #else /* to request acks for response messages (only when WS-RM "create offer" was made): */ return soap_wsrm_reply_request_acks(soap, soap_wsa_rand_uuid(soap), ResponseAction); #endif } /******************************************************************************\ * * Client-Side Callback Operation to Receive Service Responses * \******************************************************************************/ int ns__wsrmdemoResponse(struct soap *soap, char *out) { /* check Basic Auth, when enabled */ if (userid && passwd) { if (!soap->userid || !soap->passwd || strcmp(userid, soap->userid) || strcmp(passwd, soap->passwd)) return soap_send_empty_response(soap, 401); /* HTTP Unauthorized */ } /* check for WS-RM/WSA and set WS-RM/WSA return headers */ if (soap_wsrm_check(soap)) return soap->error; printf("\n**** Received Response \"%s\"\n", out?out:"(null)"); return soap_send_empty_response(soap, 202); /* HTTP 202 Accepted */ } /******************************************************************************\ * * Relayed SOAP-ENV:Fault Handler for FaultTo Server * \******************************************************************************/ int SOAP_ENV__Fault(struct soap *soap, _QName faultcode, // SOAP 1.1 char *faultstring, // SOAP 1.1 char *faultactor, // SOAP 1.1 struct SOAP_ENV__Detail *detail, // SOAP 1.1 struct SOAP_ENV__Code *Code, // SOAP 1.2 struct SOAP_ENV__Reason *Reason, // SOAP 1.2 char *Node, // SOAP 1.2 char *Role, // SOAP 1.2 struct SOAP_ENV__Detail *Detail // SOAP 1.2 ) { soap_send_empty_response(soap, 202); /* HTTP 202 Accepted */ /* populate the fault struct from the operation arguments to print it */ soap_fault(soap); /* SOAP 1.1 */ soap->fault->faultcode = faultcode; soap->fault->faultstring = faultstring; soap->fault->faultactor = faultactor; soap->fault->detail = detail; /* SOAP 1.2 */ soap->fault->SOAP_ENV__Code = Code; soap->fault->SOAP_ENV__Reason = Reason; soap->fault->SOAP_ENV__Node = Node; soap->fault->SOAP_ENV__Role = Role; soap->fault->SOAP_ENV__Detail = Detail; /* set error and display */ soap->error = SOAP_FAULT; printf("\n**** Received Fault:\n"); soap_print_fault(soap, stdout); if (!detail) detail = Detail; if (detail && detail->__type == SOAP_TYPE__wsrm__Identifier) { /* the sequence id is in the Fault Detail __type and fault members */ char *id = (char*)detail->fault; /* we opt to treat all faults fatal, so let's terminate the sequence */ soap_wsrm_sequence_handle seq = soap_wsrm_seq_lookup_id(soap, id); if (seq) { soap_wsrm_error(soap, seq, wsrm__SequenceTerminated); soap_wsrm_seq_release(soap, seq); return soap->error; } } return SOAP_OK; } /******************************************************************************\ * * OpenSSL * \******************************************************************************/ #ifdef WITH_OPENSSL struct CRYPTO_dynlock_value { MUTEX_TYPE mutex; }; static MUTEX_TYPE *mutex_buf; static struct CRYPTO_dynlock_value *dyn_create_function(const char *file, int line) { struct CRYPTO_dynlock_value *value; value = (struct CRYPTO_dynlock_value*)malloc(sizeof(struct CRYPTO_dynlock_value)); if (value) MUTEX_SETUP(value->mutex); return value; } static void dyn_lock_function(int mode, struct CRYPTO_dynlock_value *l, const char *file, int line) { if (mode & CRYPTO_LOCK) MUTEX_LOCK(l->mutex); else MUTEX_UNLOCK(l->mutex); } static void dyn_destroy_function(struct CRYPTO_dynlock_value *l, const char *file, int line) { MUTEX_CLEANUP(l->mutex); free(l); } void locking_function(int mode, int n, const char *file, int line) { if (mode & CRYPTO_LOCK) MUTEX_LOCK(mutex_buf[n]); else MUTEX_UNLOCK(mutex_buf[n]); } unsigned long id_function() { return (unsigned long)THREAD_ID; } int CRYPTO_thread_setup() { int i; mutex_buf = (MUTEX_TYPE*)malloc(CRYPTO_num_locks() * sizeof(pthread_mutex_t)); if (!mutex_buf) return SOAP_EOM; for (i = 0; i < CRYPTO_num_locks(); i++) MUTEX_SETUP(mutex_buf[i]); CRYPTO_set_id_callback(id_function); CRYPTO_set_locking_callback(locking_function); CRYPTO_set_dynlock_create_callback(dyn_create_function); CRYPTO_set_dynlock_lock_callback(dyn_lock_function); CRYPTO_set_dynlock_destroy_callback(dyn_destroy_function); return SOAP_OK; } void CRYPTO_thread_cleanup() { int i; if (!mutex_buf) return; CRYPTO_set_id_callback(NULL); CRYPTO_set_locking_callback(NULL); CRYPTO_set_dynlock_create_callback(NULL); CRYPTO_set_dynlock_lock_callback(NULL); CRYPTO_set_dynlock_destroy_callback(NULL); for (i = 0; i < CRYPTO_num_locks(); i++) MUTEX_CLEANUP(mutex_buf[i]); free(mutex_buf); mutex_buf = NULL; } #else /* OpenSSL not used */ int CRYPTO_thread_setup() { return SOAP_OK; } void CRYPTO_thread_cleanup() { } #endif gsoap-2.8.28/gsoap/samples/wsrm/README.txt0000644000175000017500000000033512653650156017541 0ustar ellertellert This application demonstrates server-side and client-side logic for services based on WS-ReliableMessaging (and WS-Addressing). For more details, please see wsrmdemo.h. Instructions about the demo are included therein. gsoap-2.8.28/gsoap/samples/wsrm/wsrmdemo.h0000644000175000017500000002413512653650156020055 0ustar ellertellert/* wsrmdemo.h WS-ReliableMessaging and WS-Addressing demo service and client. This file is to be passed to soapcpp2 only. See usage comments below. gSOAP XML Web services tools Copyright (C) 2000-2012 Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under one of the following licenses: GPL, the gSOAP public license, or Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2012, Robert van Engelen, Genivia Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- This example application demonstrates server-side and client-side logic for services based on WS-ReliableMessaging (which uses WS-Addressing). WS-ReliableMessaging provides a reliable message sequence mechanism. A message sequence is created by the WS-RM source (e.g. client), the messages follow with possible acknowledgements and resends of unacknowledged messages in between, then the sequence is closed and finally terminated. Sequences can expire, to allow local resources to be reclaimed. WS-ReliableMessaging may not be useful to improve the reliability of request-response message exchanges between two parties over HTTP, since receiving a response obviously indicates successful delivery of the request. WS-ReliableMessaging is useful to improve the reliability of one-way asynchronous messaging, for unreliable data gram messaging (SOAP-over-UDP), or when responses are relayed to other destinations, such as response messages that are relayed to destinations indicated by the WS-Addressing ReplyTo header. It is also useful when multiple sources are sending messages that arrive in different order or must be flagged as an incomplete message assemble when messages are missing as defined by the notion of a sequence of related messages. WS-ReliableMessaging ensures that all messages must have been received for the message sequence to terminate normally (indicated by the DiscardEntireSequence behavior). Messages in a sequence are enumerated and message acknowledgements are message ranges received. Acknowledgements are normally sent to the source to help identify which messages should be resend. Acknowledgements can also be send to a destination, the AcksTo destination server. This header file illustrates two gSOAP soapcpp2 tooling tricks to enable services to accept SOAP Fault messages (the SOAP_ENV__Fault message definition below) and to create a one-way service operation to handle WS-Addressing relayed responses (the ns__wsrmdemoResponse one-way message definition below) to accept a response as a service request. Compile with (note the use of soapcpp2 -a to handle http action header): soapcpp2 -a -c -Iimport wsrmdemo.h cc -Iplugin -o wsrmdemo wsrmdemo.c stdsoap2.c soapC.c soapClient.c soapServer.c plugin/wsaapi.c plugin/wsrmapi.c custom/duration.c Alternative compile step, to use SOAP-over-UDP testing (no HTTP!): cc -Iplugin -DWITH_UDP -o wsrmdemo_udp wsrmdemo.c stdsoap2.c soapC.c soapClient.c soapServer.c plugin/wsaapi.c plugin/wsrmapi.c custom/duration.c Alternative compile step, to use OpenSSL for HTTPS: cc -Iplugin -DWITH_OPENSSL -o wsrmdemo_ssl wsrmdemo.c stdsoap2.c soapC.c soapClient.c soapServer.c plugin/wsaapi.c plugin/wsrmapi.c custom/duration.c -lssl -l crypto With SSL enabled, please make sure that server.pem, cacert.pem, and client.pem are copied with your executable. Usage: After compilation, start the main server: > ./wsrmdemo In a new window, run the client: > ./wsrmdemo hello This example shows the main server returning "hello" to the client. WS-RM message acknowledgements are also returned to the client as piggy-backed headers, so the client keeps track of ack'ed messages that do not need to be resend. > ./wsrmdemo hello d This example shows the main server returning "hello" to the client in duplex mode. The client uses a callback polling service to accept response messages on a port. > ./wsrmdemo hello ds This example shows the main server returning "hello" to the client in duplex mode. The client uses a stand-alone (non-polling) callback server to accept response messages on a port. > ./wsrmdemo fault Simulates a fault generated by the server. The fault is non-fatal and processing resumes until the sequence is terminated. > ./wsrmdemo fault d Same, in duplex mode with callback polling. > ./wsrmdemo fault ds Same, in duplex mode with callback server. > ./wsrmdemo error Simulates an error generated by the server. The error is fatal and further processing is refused by the server. > ./wsrmdemo error d Same, in duplex mode with callback polling. > ./wsrmdemo error ds Same, in duplex mode with callback server. Note 1: when the ReplyTo service is down, the response cannot be relayed and the client (or the fault service when FaultTo is set) will be informed about the failure. Note 2: HTTP Basic authentication can be enabled by setting the following values in wsrmdemo.c: const char *userid = "..."; const char *passwd = "..."; The client operations set HTTP Basic Auth while server operation check it. The WS-RM CreateSequence, CloseSequence, and TerminateSequence do NOT check the credentials of the client (only the sequence messages). Of course, and incomplete sequence abnormally terminates when the behavior is set to DiscardEntireSequence. Note 3: HTTP compression can be enabled by compiling the sources with -DWITH_ZLIB. Then use SOAP_ENC_ZLIB flag to send compressed messages. Note 4: HTTPS can be enabled by compiling with -DWITH_OPENSSL. Note 5: The client is set-up for two-way messaging, so UDP one-way messaging is not demonstrated. This also leads to timeouts at the client side when no response is received (and no acks or faults). To implement one-way messaging, please refer to the documentation. */ #import "soap12.h" #import "wsrm.h" #import "wsa5.h" //gsoap ns service name: wsrmdemo demonstrates WS-ReliableMessaging capabilities //gsoap ns service port: http://localhost:11001 //gsoap ns service type: wsrmdemoPort //gsoap ns service namespace: urn:wsrmdemo /* We need to generate a response struct for each operation to implement * one-way service response operations that can be relayed. Because the service * operation has a corresponding struct, we can use that struct as a response * parameter for the second two-way service operation. This step is required to * implement a wsa-capable server. Future changes to wsdl2h will make manual * addition of these one-way operations unnecessary and automated. */ //gsoap ns service method-header-part: wsrmdemoResponse wsa5__MessageID //gsoap ns service method-header-part: wsrmdemoResponse wsa5__RelatesTo //gsoap ns service method-header-part: wsrmdemoResponse wsa5__From //gsoap ns service method-header-part: wsrmdemoResponse wsa5__ReplyTo //gsoap ns service method-header-part: wsrmdemoResponse wsa5__FaultTo //gsoap ns service method-header-part: wsrmdemoResponse wsa5__To //gsoap ns service method-header-part: wsrmdemoResponse wsa5__Action //gsoap ns service method-header-part: wsrmdemoResponse wsrm__Sequence //gsoap ns service method-header-part: wsrmdemoResponse wsrm__AckRequested //gsoap ns service method-header-part: wsrmdemoResponse wsrm__SequenceAcknowledgement //gsoap ns service method-action: wsademoResponse urn:wsrmdemo/wsrmdemoPort/wsrmdemoResponse //gsoap ns service method-documentation: wsrmdemoResponse accepts a string value from a relayed response int ns__wsrmdemoResponse(char *out, void); //gsoap ns service method-header-part: wsrmdemo wsa5__MessageID //gsoap ns service method-header-part: wsrmdemo wsa5__RelatesTo //gsoap ns service method-header-part: wsrmdemo wsa5__From //gsoap ns service method-header-part: wsrmdemo wsa5__ReplyTo //gsoap ns service method-header-part: wsrmdemo wsa5__FaultTo //gsoap ns service method-header-part: wsrmdemo wsa5__To //gsoap ns service method-header-part: wsrmdemo wsa5__Action //gsoap ns service method-header-part: wsrmdemo wsrm__Sequence //gsoap ns service method-header-part: wsrmdemo wsrm__AckRequested //gsoap ns service method-header-part: wsrmdemo wsrm__SequenceAcknowledgement //gsoap ns service method-action: wsrmdemo urn:wsrmdemo/wsrmdemoPort/wsrmdemo //gsoap ns service method-output-action: wsrmdemo urn:wsrmdemo/wsrmdemoPort/wsrmdemoResponse //gsoap ns service method-documentation: wsrmdemo echos a string value and relays the response to the wsa replyTo address (if present) int ns__wsrmdemo(char *in, struct ns__wsrmdemoResponse *result); gsoap-2.8.28/gsoap/samples/wsrm/Makefile.am0000644000175000017500000000223512653650156020100 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = foreign 1.4 noinst_PROGRAMS = wsrmdemo wsrmdemo_udp wsrmdemo_ssl SOAPHEADER = wsrmdemo.h SOAP_FLAGS = -a include ../Makefile.defines include ../Makefile.c_rules SOAP_NS = wsrmdemo.nsmap wsrmdemo.wsdl wsrmdemo_CFLAGS = wsrmdemo_SOURCES = wsrmdemo.c $(SOAPHEADER) $(SOAP_C_SRC) ../../plugin/wsaapi.c ../../plugin/wsrmapi.c ../../plugin/threads.c ../../custom/duration.c wsrmdemo_LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) -lpthread wsrmdemo_udp_CFLAGS = -DWITH_UDP wsrmdemo_udp_SOURCES = wsrmdemo.c $(SOAPHEADER) $(SOAP_C_SRC) ../../plugin/wsaapi.c ../../plugin/wsrmapi.c ../../plugin/threads.c ../../custom/duration.c wsrmdemo_udp_LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) -lpthread wsrmdemo_ssl_CFLAGS = -DWITH_OPENSSL wsrmdemo_ssl_SOURCES = wsrmdemo.c $(SOAPHEADER) $(SOAP_C_SRC) ../../plugin/wsaapi.c ../../plugin/wsrmapi.c ../../plugin/threads.c ../../custom/duration.c wsrmdemo_ssl_LDADD = $(SOAP_C_LIB_SSL) $(SAMPLE_EXTRA_LIBS) -lssl -lcrypto -lz -lpthread gsoap-2.8.28/gsoap/samples/wsrm/cacert.pem0000644000175000017500000000242212653650156020006 0ustar ellertellert-----BEGIN CERTIFICATE----- MIIDkDCCAvmgAwIBAgIJANZ2BsVMtBtVMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYD VQQGEwJVUzELMAkGA1UECBMCRkwxFDASBgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYD VQQKEw1HZW5pdmlhLCBJbmMuMQswCQYDVQQLEwJJVDESMBAGA1UEAxMJbG9jYWxo b3N0MSIwIAYJKoZIhvcNAQkBFhNjb250YWN0QGdlbml2aWEuY29tMB4XDTE1MDgw NDE5MDEyMFoXDTE4MDgwMzE5MDEyMFowgY0xCzAJBgNVBAYTAlVTMQswCQYDVQQI EwJGTDEUMBIGA1UEBxMLVGFsbGFoYXNzZWUxFjAUBgNVBAoTDUdlbml2aWEsIElu Yy4xCzAJBgNVBAsTAklUMRIwEAYDVQQDEwlsb2NhbGhvc3QxIjAgBgkqhkiG9w0B CQEWE2NvbnRhY3RAZ2VuaXZpYS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJ AoGBALx/LiwGRi4wH8y0MEL64VJs5H2O1F4uuYO+aNVZHl5ULRDmSh/4eF8aOYXT B05PfVoctBogcK0ohPEhiUcR/029LQTkEs/5D7XsuRuQsUnMfkEihmC2VtEuJMqT OeXmuIcemEw0QL3ulny7H8W6Aq2rByC2r5iqytnM4Uuw7LMnAgMBAAGjgfUwgfIw HQYDVR0OBBYEFPjHgoC7fuLKD8eItzogWWMDKpTQMIHCBgNVHSMEgbowgbeAFPjH goC7fuLKD8eItzogWWMDKpTQoYGTpIGQMIGNMQswCQYDVQQGEwJVUzELMAkGA1UE CBMCRkwxFDASBgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYDVQQKEw1HZW5pdmlhLCBJ bmMuMQswCQYDVQQLEwJJVDESMBAGA1UEAxMJbG9jYWxob3N0MSIwIAYJKoZIhvcN AQkBFhNjb250YWN0QGdlbml2aWEuY29tggkA1nYGxUy0G1UwDAYDVR0TBAUwAwEB /zANBgkqhkiG9w0BAQUFAAOBgQB+fmbScGp3R4D0Sf4gbBJ/3CGEn4/HvupSikDq vyaviwJ2KQKGlAr/lDh1qSYItkazJpJDIxyG2Dzm2w0F0u1+CSwpym6eq1pxc8dh GRdrCVyuM0gUoBvxUym7o0Bq1V6onUjwrAti+onsZjDpfAIKBI8TRfjuTNzFeSAV G2zULg== -----END CERTIFICATE----- gsoap-2.8.28/gsoap/samples/primes/0000755000175000017500000000000012653650172016347 5ustar ellertellertgsoap-2.8.28/gsoap/samples/primes/primes.cpp0000644000175000017500000000556612653650156020370 0ustar ellertellert/* primes.cpp Prime sieve example that demsontrates the use of a user-defined simple_vector container and auto-generated code to display the container contents in XML. Build: > soapcpp2 -CS primes.h > c++ -o primes primes.cpp soapC.cpp stdsoap2.cpp Usage: > ./primes -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2011, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ // include all generated header files: #include "soapH.h" #include int main() { primes p; // also instantiates the 'soap' context p.sieve(100); // sieve primes primes q; q = p; // to show that copy constructor and assignment are OK q.write(); // write primes in XML return 0; } // sieving primes in the simple_vector<> container: void primes::sieve(int n) { prime.clear(); prime.insert(prime.end(), 1); prime.insert(prime.end(), 2); for (int i = 3; i <= n; i += 2) { bool composite = false; for (simple_vector::const_iterator j = prime.begin(); j != prime.end(); ++j) { if (*j != 1 && i % *j == 0) { composite = true; break; } } if (!composite) prime.insert(prime.end(), i); } } // the writer uses the fact that the primes class inherits the context: void primes::write() { soap_set_omode(this, SOAP_XML_INDENT); // show with indentation please soap_write_primes(this, this); // soap_write_prime is generated } // the destructor cleans up the 'soap' context primes::~primes() { soap_destroy(this); soap_end(this); } // we need a dummy namespace table, even though we don't use XML namespaces: SOAP_NMAC struct Namespace namespaces[] = { {NULL, NULL, NULL, NULL} }; gsoap-2.8.28/gsoap/samples/primes/Makefile.in0000644000175000017500000004531712653650156020430 0ustar ellertellert# Makefile.in generated by automake 1.14 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = primes$(EXEEXT) DIST_COMMON = $(srcdir)/../Makefile.defines \ $(srcdir)/../Makefile.cpp_rules $(srcdir)/Makefile.in \ $(srcdir)/Makefile.am $(top_srcdir)/mkinstalldirs \ $(top_srcdir)/depcomp subdir = gsoap/samples/primes ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = am__objects_2 = soapC.$(OBJEXT) am_primes_OBJECTS = $(am__objects_1) primes.$(OBJEXT) $(am__objects_2) primes_OBJECTS = $(am_primes_OBJECTS) am__DEPENDENCIES_1 = primes_DEPENDENCIES = $(SOAP_CPP_LIB) $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(primes_SOURCES) DIST_SOURCES = $(primes_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ STRIP = @STRIP@ VERSION = @VERSION@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 SOAPHEADER = primes.h AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a SOAP_CPP_SRC = $(SOAP_CPP_CLIENT) soapServer.cpp $(SOAP_H_FILES) $(SOAP_NS) LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_CPP_SRC) CLEANFILES = $(SOAP_CPP_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.cpp soap*Proxy.h soap*Proxy.cpp soap*Object.h soap*Service.h soap*Service.cpp soapClient.cpp soapServer.cpp soapClientLib.cpp soapServerLib.cpp *~ SOAP_NS = SOAP_FLAGS = -0 -CS primes_SOURCES = $(SOAPHEADER) primes.cpp simple_vector.h $(SOAP_CPP_CORE) primes_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_rules $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/primes/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/primes/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_rules: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) primes$(EXEEXT): $(primes_OBJECTS) $(primes_DEPENDENCIES) $(EXTRA_primes_DEPENDENCIES) @rm -f primes$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(primes_OBJECTS) $(primes_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/primes.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapC.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am $(SOAP_CPP_SRC) : $(SOAPHEADER) $(SOAP) -L -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $(SOAPHEADER) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.28/gsoap/samples/primes/simple_vector.h0000644000175000017500000001042512653650156021377 0ustar ellertellert/* simple_vector.h Defines the simple_vector<> template as an example on how to define custom containers that can be auto-serialized in XML with gSOAP. In order for the auto-generated XML serializers to work for templates, we must define at least these methods: void clear() iterator begin() const_iterator begin() const iterator end() const_iterator end() const size_t size() const iterator insert(iterator pos, const_reference val) where begin() gives a forward iterator over the container. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2010, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ // declare the simple_vector<> template: #include template class simple_vector { public: typedef T value_type; typedef value_type * pointer; typedef const value_type * const_pointer; typedef value_type & reference; typedef const value_type & const_reference; typedef pointer iterator; typedef const_pointer const_iterator; protected: iterator head; iterator tail; size_t capacity; public: simple_vector() { head = tail = NULL; } simple_vector(const simple_vector& v) { operator=(v); } ~simple_vector() { if (head) delete[] head; } void clear() { tail = head; } /* the member functions below are required for (de)serialization of templates */ iterator begin() { return head; } const_iterator begin() const { return head; } iterator end() { return tail; } const_iterator end() const { return tail; } size_t size() const { return tail - head; } iterator insert(iterator pos, const_reference val) { if (!head) head = tail = new value_type[capacity = 1]; else if (tail >= head + capacity) { iterator i = head; iterator j = new value_type[capacity *= 2]; iterator k = j; while (i < tail) *k++ = *i++; if (pos) pos = j + (pos - head); tail = j + (tail - head); delete[] head; head = j; } if (pos && pos >= head && pos < tail) { iterator i = tail; iterator j = i - 1; while (j != pos) *i-- = *j--; *pos = val; } else { pos = tail; *tail++ = val; } return pos; } simple_vector& operator=(const simple_vector& v) { head = tail = NULL; capacity = v.capacity; if (v.head) { head = tail = new value_type[capacity]; iterator i = v.head; while (i != v.tail) *tail++ = *i++; } return *this; } }; gsoap-2.8.28/gsoap/samples/primes/primes.h0000644000175000017500000000370012653650156020021 0ustar ellertellert/* primes.h Declarations for the soapcpp2 compiler to define a primes class derived from the 'soap' context and to define a simple_vector template. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2010, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ // declare the simple_vector<> template: template class simple_vector; // declare a primes class that inherits a context for SOAP/XML serialization: class primes: struct soap { public: simple_vector prime; // container of ints void sieve(int n); void write(); virtual ~primes(); }; // #include is deferred to the generated code, which will then include the defs: #include "simple_vector.h" // defines simple_vector<> gsoap-2.8.28/gsoap/samples/primes/README.txt0000644000175000017500000000064612653650156020055 0ustar ellertellert Demonstates the use of a user-defined C++ container simple_vector<> defined in simple_vector.h suitable for XML serialization. Elements contained can be automatically serialized to and from XML. This requires a container that supports at least these methods: iterator begin() const_iterator begin() const iterator end() const iterator end() const size_t size() const iterator insert(iterator, const_reference) gsoap-2.8.28/gsoap/samples/primes/Makefile.am0000644000175000017500000000076712653650156020417 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 noinst_PROGRAMS = primes SOAPHEADER = primes.h include ../Makefile.defines include ../Makefile.cpp_rules SOAP_NS = SOAP_FLAGS=-0 -CS primes_SOURCES = $(SOAPHEADER) primes.cpp simple_vector.h $(SOAP_CPP_CORE) primes_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) gsoap-2.8.28/gsoap/samples/factory/0000755000175000017500000000000012653650166016522 5ustar ellertellertgsoap-2.8.28/gsoap/samples/factory/Makefile.in0000644000175000017500000004554112653650166020600 0ustar ellertellert# Makefile.in generated by automake 1.14 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = factory$(EXEEXT) DIST_COMMON = $(srcdir)/../Makefile.defines \ $(srcdir)/../Makefile.cpp_rules $(srcdir)/Makefile.in \ $(srcdir)/Makefile.am $(top_srcdir)/mkinstalldirs \ $(top_srcdir)/depcomp subdir = gsoap/samples/factory ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = am__objects_2 = soapC.$(OBJEXT) am__objects_3 = soapServer.$(OBJEXT) $(am__objects_2) am_factory_OBJECTS = factory.$(OBJEXT) $(am__objects_1) \ $(am__objects_3) factory_OBJECTS = $(am_factory_OBJECTS) am__DEPENDENCIES_1 = factory_DEPENDENCIES = $(SOAP_CPP_LIB) $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(factory_SOURCES) DIST_SOURCES = $(factory_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ STRIP = @STRIP@ VERSION = @VERSION@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 SOAPHEADER = factory.h AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a SOAP_CPP_SRC = $(SOAP_CPP_CLIENT) soapServer.cpp $(SOAP_H_FILES) $(SOAP_NS) LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_CPP_SRC) CLEANFILES = $(SOAP_CPP_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.cpp soap*Proxy.h soap*Proxy.cpp soap*Object.h soap*Service.h soap*Service.cpp soapClient.cpp soapServer.cpp soapClientLib.cpp soapServerLib.cpp *~ SOAP_NS = factory.nsmap factory.wsdl factory_SOURCES = factory.cpp $(SOAPHEADER) $(SOAP_CPP_SERVER) factory_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_rules $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/factory/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/factory/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_rules: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) factory$(EXEEXT): $(factory_OBJECTS) $(factory_DEPENDENCIES) $(EXTRA_factory_DEPENDENCIES) @rm -f factory$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(factory_OBJECTS) $(factory_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/factory.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapC.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapServer.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am $(SOAP_CPP_SRC) : $(SOAPHEADER) $(SOAP) -L -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $(SOAPHEADER) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.28/gsoap/samples/factory/factory.h0000644000175000017500000001332212653650154020340 0ustar ellertellert/* factory.h Server-side remote object factory definitions Server code: factory.cpp This header file contains all the class declarations of the remote objects to support serialization of these objects for server-side state management (simple save/load operations are implemented). The remote object factory uses a lease-based system. Remote objects are purged from the pool when the lease expires (see LEASETERM in factory.cpp). Supports inheritance. Compile: soapcpp2 factory.h c++ -o factory factory.cpp stdsoap2.cpp soapC.cpp soapServer.cpp Run (e.g. in the background) factory where is a available port number, e.g. 18085 -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap ns service name: factory //gsoap ns service style: rpc //gsoap ns service encoding: encoded //gsoap ns service namespace: http://websrv.cs.fsu.edu/~engelen/factory.wsdl //gsoap ns service location: http://localhost:18085 //gsoap ns schema namespace: urn:factoryService //gsoap t schema namespace: urn:factoryTypes //gsoap h schema namespace: urn:factoryHandles //////////////////////////////////////////////////////////////////////////////// // // SOAP Header: used to exchange stateful object handles // //////////////////////////////////////////////////////////////////////////////// struct SOAP_ENV__Header { mustUnderstand unsigned int h__handle; }; //////////////////////////////////////////////////////////////////////////////// // // Server-side root class // //////////////////////////////////////////////////////////////////////////////// enum t__object // object types: { ROOT, // t__root object ADDER, // t__adder object COUNTER // t__counter object }; enum t__status // remote object status: { FACTORY_OK, // ok FACTORY_INVALID, // invalid handle (wrong type of object or lease expired) FACTORY_NOTFOUND, // lookup operation not successful FACTORY_RETRY // cannot create new object: try later }; class t__root { public: enum t__object object; // object type char *name; // object name for lookup operation (optional) unsigned int handle; // internal handle time_t lease; // lease expiration time t__root(); virtual ~t__root(); virtual void renew(); // to renew lease }; //////////////////////////////////////////////////////////////////////////////// // // Server-side adder class derived from root // //////////////////////////////////////////////////////////////////////////////// class t__adder: public t__root { public: double val; // current value of the adder void set(double val); // to set the adder double get(); // to get value of the adder void add(double val); // to add a value to the adder }; //////////////////////////////////////////////////////////////////////////////// // // Server-side counter class derived from adder // //////////////////////////////////////////////////////////////////////////////// class t__counter: public t__adder { public: void inc(); // to increment the counter }; //////////////////////////////////////////////////////////////////////////////// // // Remote factory method interfaces // //////////////////////////////////////////////////////////////////////////////// //gsoap ns service method-header-part: create h__handle int ns__create(enum t__object object, char *name, enum t__status &status); //gsoap ns service method-header-part: lookup h__handle int ns__lookup(enum t__object object, char *name, enum t__status &status); //gsoap ns service method-header-part: rename h__handle int ns__rename(char *name, enum t__status &status); //gsoap ns service method-header-part: release h__handle int ns__release(enum t__status &status); //////////////////////////////////////////////////////////////////////////////// // // Rewote adder method interfaces // //////////////////////////////////////////////////////////////////////////////// //gsoap ns service method-header-part: set h__handle int ns__set(double val, enum t__status &status); //gsoap ns service method-header-part: get h__handle int ns__get(double &val); //gsoap ns service method-header-part: add h__handle int ns__add(double val, enum t__status &status); //////////////////////////////////////////////////////////////////////////////// // // Remote counter method interfaces // //////////////////////////////////////////////////////////////////////////////// //gsoap ns service method-header-part: inc h__handle int ns__inc(enum t__status &status); gsoap-2.8.28/gsoap/samples/factory/README.txt0000644000175000017500000000056112653650154020217 0ustar ellertellert A remote object factory. Server objects are instantiated, manipulated, and destroyed remotely using SOAP messages. The objects are persistent and can be named. Objects are purged when their lease expires. A lease is renewed when the object is used. This example defines a root object, an adder object, and a counter object. See samples/factorytest for client code. gsoap-2.8.28/gsoap/samples/factory/factory.cpp0000644000175000017500000003452212653650154020700 0ustar ellertellert/* factory.cpp Remote object factory The remote object factory uses a lease-based system. Remote objects are purged from the pool when the lease expires. Supports inheritance. Compile: soapcpp2 factory.h c++ -o factory factory.cpp stdsoap2.cpp soapC.cpp soapServer.cpp Run (e.g. in the background) factory where is a available port number, e.g. 18085 -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include // for open() #include "soapH.h" #include "factory.nsmap" #define POOLSIZE 1000 // max number of remote objects that can be alive at any instance #define LEASETERM 60 // lease term (in seconds). Also the rate at which objects are purged //////////////////////////////////////////////////////////////////////////////// // // Factory class maintains pool of objects and can act as a simple ORB // //////////////////////////////////////////////////////////////////////////////// class Factory { public: t__root *ref[POOLSIZE]; // pool of objects (t__root is base class) unsigned int handle; // handle generation counter (is allowed to wrap around 32 bits) Factory(); ~Factory(); unsigned int create(struct soap *soap, enum t__object object, char *name); unsigned int lookup(enum t__object object, char *name); unsigned int rename(unsigned int handle, char *name); void release(unsigned int handle); void purge(struct soap* soap); t__root *get(unsigned int handle); t__root *root(unsigned int handle); t__adder *adder(unsigned int handle); t__counter *counter(unsigned int handle); int save(const char *file); int load(const char *file); }; // Initialize empty pool and set handle generation counter to 0 Factory::Factory() { for (int i = 0; i < POOLSIZE; i++) ref[i] = NULL; handle = 0; } // Remove all objects from pool Factory::~Factory() { for (int i = 0; i < POOLSIZE; i++) if (ref[i]) delete ref[i]; } // Create a new object, place it in the pool, and return handle unsigned int Factory::create(struct soap *soap, enum t__object object, char *name) { (void)soap; for (int i = 0; i < POOLSIZE; i++) if (!ref[++handle % POOLSIZE]) // succeeds if this slot is available { t__root *r = NULL; if (!handle) handle += POOLSIZE; // make sure handle is never 0 (0 indicates invalid handle) switch (object) // type of object to instantiate { case ROOT: r = new t__root(); break; case ADDER: r = new t__adder(); break; case COUNTER: r = new t__counter(); break; } if (r) { ref[handle % POOLSIZE] = r; // add object to the pool r->object = object; // save type if (name) // save name (if assigned) { size_t l = strlen(name); r->name = (char*)malloc(l + 1); soap_strcpy(r->name, l + 1, name); } else r->name = NULL; r->handle = handle; // keep handle for verification r->renew(); // renew its lease return handle; } return 0; } return 0; } // Lookup the name of an object and return handle unsigned int Factory::lookup(enum t__object object, char *name) { for (int i = 0; i < POOLSIZE; i++) if (ref[i] && ref[i]->object == object && ref[i]->name && !strcmp(ref[i]->name, name)) { ref[i]->renew(); return ref[i]->handle; } return 0; } // Rename object and return handle if successful unsigned int Factory::rename(unsigned int handle, char *name) { t__root *r = get(handle); if (r) { size_t l = strlen(name); if (r->name) free(r->name); r->name = (char*)malloc(l + 1); soap_strcpy(r->name, l + 1, name); r->renew(); return handle; } return 0; } // get ref to object from handle t__root *Factory::get(unsigned int handle) { t__root *r = ref[handle % POOLSIZE]; if (r && r->handle == handle) return r; return NULL; } // get ref to root object from handle and renew lease t__root *Factory::root(unsigned int handle) { t__root *r = get(handle); if (r) r->renew(); return r; } // get ref to adder object from handle and renew lease t__adder *Factory::adder(unsigned int handle) { t__adder *a = (t__adder*)get(handle); if (a) { if (a->object == ADDER || a->object == COUNTER) a->renew(); else a = NULL; } return a; } // get ref to counter object from handle and renew lease t__counter *Factory::counter(unsigned int handle) { t__counter *c = (t__counter*)get(handle); if (c) { if (c->object == COUNTER) c->renew(); else c = NULL; } return c; } // remove all objects from pool whose lease has expired void Factory::purge(struct soap *soap) { time_t t = time(NULL); // current time int flag = 1; for (int i = 0; i < POOLSIZE; i++) { t__root *r = ref[i]; if (r && r->lease < t) // expired? { if (flag) fprintf(stderr, "\nPurging objects:"); if (r->name) fprintf(stderr, "%s(%u)\n", r->name, r->handle); else fprintf(stderr, "(%u)\n", r->handle); soap_delete(soap, r); ref[i] = NULL; flag = 0; } } } // remove object from pool and release slot void Factory::release(unsigned int handle) { t__root *r = get(handle); if (r) ref[handle % POOLSIZE] = NULL; } // save object pool to file (or stdout) int Factory::save(const char *file) { struct soap soap; // use a new local gSOAP environment soap_init(&soap); soap_begin(&soap); if (file) soap.sendfd = open(file, O_CREAT|O_TRUNC|O_WRONLY, S_IREAD|S_IWRITE); if (soap.sendfd < 0) return -1; soap_begin_send(&soap); for (int i = 0; i < POOLSIZE; i++) if (ref[i]) { ref[i]->soap_serialize(&soap); soap_begin_send(&soap); ref[i]->soap_put(&soap, "item", NULL); soap_end_send(&soap); } if (file) close(soap.sendfd); soap_end(&soap); soap_done(&soap); return 0; } // load object pool from file (or stdin) int Factory::load(const char *file) { struct soap soap; t__root *r; soap_init(&soap); if (file) soap.recvfd = open(file, O_RDONLY); if (soap.recvfd < 0) return -1; soap_begin_recv(&soap); for (int i = 0; i < POOLSIZE; i++) { if (ref[i]) { delete ref[i]; ref[i] = NULL; } } for (;;) { r = soap_in_t__root(&soap, "item", NULL, NULL); // use the 'in' routine ('get' will also attempt to parse the remaining XML) if (r) ref[r->handle % POOLSIZE] = r; else break; } if (file) close(soap.recvfd); if (soap.error != SOAP_OK && soap.error != SOAP_EOF) { soap_print_fault(&soap, stderr); soap_print_fault_location(&soap, stderr); } soap_free(&soap); // do not call soap_end: this would remove all deserialized data soap_done(&soap); return 0; } //////////////////////////////////////////////////////////////////////////////// // // Main server program // //////////////////////////////////////////////////////////////////////////////// int main(int argc, char **argv) { int m, s; struct soap soap; Factory factory; // create factory and simple ORB soap_init(&soap); soap.user = (void*)&factory; // associate factory with run-time soap.accept_timeout = 1; // check every second, if not too busy for purging objects if (argc < 2) { factory.load("factory.dat"); // if CGI is used, load the entire pool (not very efficient and there may be a competition for access to this file! This is just to demonstrate load/save of the entire pool) factory.purge(&soap); soap_serve(&soap); factory.save("factory.dat"); // ... and save afterwards } else { m = soap_bind(&soap, NULL, atoi(argv[1]), 100); // use command line argument as port number if (m < 0) { soap_print_fault(&soap, stderr); exit(1); } fprintf(stderr, "Socket connection successful %d\n", m); for (int i = 1; ; i++) { s = soap_accept(&soap); if (s < 0) { if (soap.errnum) soap_print_fault(&soap, stderr); else // errnum is 0, which means a timeout has occurred { factory.purge(&soap); // purge objects whose lease has ran out continue; } exit(1); } fprintf(stderr, "%d: accepted %d IP=%d.%d.%d.%d ... ", i, s, (int)(soap.ip>>24)&0xFF, (int)(soap.ip>>16)&0xFF, (int)(soap.ip>>8)&0xFF, (int)soap.ip&0xFF); soap_serve(&soap); fprintf(stderr, "served\n"); soap_end(&soap); // clean up: this will remove deserialized data } } return 0; } //////////////////////////////////////////////////////////////////////////////// // // Remote factory method implementations // //////////////////////////////////////////////////////////////////////////////// int ns__create(struct soap *soap, enum t__object object, char *name, enum t__status &status) { Factory *factory = (Factory*)soap->user; // get factory from gSOAP environment if (!soap->header) soap->header = (struct SOAP_ENV__Header*)soap_malloc(soap, sizeof(struct SOAP_ENV__Header)); if (soap->header) { soap->header->h__handle = factory->create(soap, object, name); if (soap->header->h__handle) status = FACTORY_OK; else status = FACTORY_INVALID; } else status = FACTORY_RETRY; return SOAP_OK; } int ns__lookup(struct soap *soap, enum t__object object, char *name, enum t__status &status) { Factory *factory = (Factory*)soap->user; // get factory from gSOAP environment if (!soap->header) soap->header = (struct SOAP_ENV__Header*)soap_malloc(soap, sizeof(struct SOAP_ENV__Header)); if (soap->header) { soap->header->h__handle = factory->lookup(object, name); if (soap->header->h__handle) status = FACTORY_OK; else status = FACTORY_NOTFOUND; } else status = FACTORY_RETRY; return SOAP_OK; } int ns__rename(struct soap *soap, char *name, enum t__status &status) { Factory *factory = (Factory*)soap->user; // get factory from gSOAP environment if (soap->header) { soap->header->h__handle = factory->rename(soap->header->h__handle, name); if (soap->header->h__handle) status = FACTORY_OK; else status = FACTORY_INVALID; } else status = FACTORY_INVALID; return SOAP_OK; } int ns__release(struct soap *soap, enum t__status &status) { Factory *factory = (Factory*)soap->user; // get factory from gSOAP environment if (soap->header && soap->header->h__handle) { factory->release(soap->header->h__handle); status = FACTORY_OK; } else status = FACTORY_INVALID; return SOAP_OK; } //////////////////////////////////////////////////////////////////////////////// // // Remote adder method implementations // //////////////////////////////////////////////////////////////////////////////// int ns__set(struct soap *soap, double val, enum t__status &status) { Factory *factory = (Factory*)soap->user; // get factory from gSOAP environment if (soap->header) { t__adder *adder = factory->adder(soap->header->h__handle); if (adder) { adder->set(val); status = FACTORY_OK; } else status = FACTORY_INVALID; } else status = FACTORY_INVALID; return SOAP_OK; } int ns__get(struct soap *soap, double &val) { Factory *factory = (Factory*)soap->user; // get factory from gSOAP environment val = DBL_NAN; if (soap->header) { t__adder *adder = factory->adder(soap->header->h__handle); if (adder) val = adder->get(); } return SOAP_OK; } int ns__add(struct soap *soap, double val, enum t__status &status) { Factory *factory = (Factory*)soap->user; // get factory from gSOAP environment if (soap->header) { t__adder *adder = factory->adder(soap->header->h__handle); if (adder) { adder->add(val); status = FACTORY_OK; } else status = FACTORY_INVALID; } else status = FACTORY_INVALID; return SOAP_OK; } //////////////////////////////////////////////////////////////////////////////// // // Remote counter method implementations // //////////////////////////////////////////////////////////////////////////////// int ns__inc(struct soap *soap, enum t__status &status) { Factory *factory = (Factory*)soap->user; // get factory from gSOAP environment if (soap->header) { t__counter *counter = factory->counter(soap->header->h__handle); if (counter) { counter->inc(); status = FACTORY_OK; } else status = FACTORY_INVALID; } else status = FACTORY_INVALID; return SOAP_OK; } //////////////////////////////////////////////////////////////////////////////// // // Server-side base factory class methods // //////////////////////////////////////////////////////////////////////////////// t__root::t__root() { } t__root::~t__root() { if (name) free(name); } void t__root::renew() { lease = time(NULL) + LEASETERM; // can adopt a leasing policy per class } //////////////////////////////////////////////////////////////////////////////// // // Server-side adder class methods // //////////////////////////////////////////////////////////////////////////////// void t__adder::set(double val) { this->val = val; // copy data to update state } double t__adder::get() { return val; } void t__adder::add(double val) { this->val += val; } //////////////////////////////////////////////////////////////////////////////// // // Server-side counter class methods // //////////////////////////////////////////////////////////////////////////////// void t__counter::inc() { add(1.0); } gsoap-2.8.28/gsoap/samples/factory/Makefile.am0000644000175000017500000000077012653650154020557 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 noinst_PROGRAMS = factory SOAPHEADER = factory.h include ../Makefile.defines include ../Makefile.cpp_rules SOAP_NS = factory.nsmap factory.wsdl factory_SOURCES = factory.cpp $(SOAPHEADER) $(SOAP_CPP_SERVER) factory_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) gsoap-2.8.28/gsoap/samples/dom/0000755000175000017500000000000012653650166015632 5ustar ellertellertgsoap-2.8.28/gsoap/samples/dom/README.md0000644000175000017500000035472612653650154017127 0ustar ellertellert XML DOM & XPath {#mainpage} =============== [TOC] Introduction {#intro} ============ XML data bindings provide a powerful mechanism to parse, validate, manipulate, and write XML data with ease as if we are working with native C and C++ data. Occasionally we will need to work with raw XML data. Raw XML can be parsed with a DOM parser and stored in a DOM node graph. The DOM (Document Object Model) node graph (actually a node tree) can be inspected to retrieve text and other values. We can iteratively and recursively traverse the XML tree via its DOM node graph at increasingly deeper levels to inspect and retrieve values of XML elements and attributes. We can also use XPath queries to locate data deep in the DOM node hierarchy to retrieve specific values. The gSOAP XML DOM API is compact in size but offers a wealth of operations to construct, inspect, traverse, and search data in DOM node graphs. The DOM API offers powerful constructors to construct a DOM node graph for XML with **smart XML namespace handling** to simplify coding. The DOM API also offers a hybrid **DOM + data binding approach** that allows you to embed serializable C/C++ data types including user-defined structs and classes. You can also search and retrieve values from XML and XML with namespaces using the DOM API's smart XML namespace handling. We also offer a new code generation tool, **domcpp**, that greatly simplifies writing DOM API code by generating DOM construction code, DOM inspection code, and XPath code to query a DOM. The generated code uses the DOM API transparently in C and C++ (C++ by default and pure C as an option). So it is easy to get familiar with the DOM API by using the domcpp tool. In the first part of this introduction we show how to effectively use the domcpp tool to get started. XML DOM and gSOAP {#intro-1} ----------------- To help you quickly develop C/C++ code to construct, inspect, and search DOM node graphs using the XML DOM API, we offer a new code generator **domcpp** with the gSOAP package (version 2.8.28 and up). You can find the domcpp tool with the DOM examples in `gsoap/samples/dom`. The domcpp command-line tool auto-generates C or C++ code from an XML fragment. The generated code creates a DOM node graph for this fragment, which can be further tweaked as necessary. Let's demonstrate this with an example `menu.xml` XML file: cat menu.xml ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp}

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ domcpp menu.xml ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #include "soapH.h" { struct soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT | SOAP_DOM_TREE); ctx->double_format = "%lG"; xsd__anyType dom(ctx, "menu"); dom.att("id") = "file"; dom.att("value") = "File"; dom["popup"]["menuitem"][1].att("value") = "New"; dom["popup"]["menuitem"][1].att("onclick") = "CreateNewDoc()"; dom["popup"]["menuitem"][2].att("value") = "Open"; dom["popup"]["menuitem"][2].att("onclick") = "OpenDoc()"; dom["popup"]["menuitem"][3].att("value") = "Close"; dom["popup"]["menuitem"][3].att("onclick") = "CloseDoc()"; std::cout << dom << std::endl; soap_destroy(ctx); // delete objects soap_end(ctx); // delete DOM data soap_free(ctx); // free context } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The C++ DOM API is designed around the concept of XPath's path location to construct a node graph by aligning the C++ `[]` overloaded operator to XPath's path steps and position predicates. You can use domcpp option `-e` to reveal the XPath for each assignment statement. For example: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} xsd__anyType dom(ctx, "menu"); // /menu/@id = file dom.att("id") = "file"; // /menu/@value = File dom.att("value") = "File"; // /menu/popup/menuitem[1]/@value = New dom["popup"]["menuitem"][1].att("value") = "New" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Domcpp option `-e` adds explanatory comments to the generated code, which explains what the code does to help you understand the DOM API by including XPath path locations and other details. You can use domcpp option `-M` to narrow the generated code down to the essentials, without the initialization and cleanup parts of the code. This makes the generated code suitable for direct inclusion in your codebase. Generating code to populate a DOM node graph is one option. Another option is to generate code to inspect a DOM node graph. Use domcpp option `-i` to generate code to inspect the DOM node graph of XML parsed from input, given that the XML file provided with option `-i` serves as a generic template: domcpp -i menu.xml ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #include "soapH.h" { struct soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT | SOAP_DOM_TREE); ctx->double_format = "%lG"; xsd__anyType dom(ctx); std::cin >> dom; if (dom.soap->error) exit(EXIT_FAILURE); // error parsing XML xsd__anyAttribute *att; xsd__anyType *elt; #define USE_ATT(path, text) std::cout << path << " = " << text << std::endl #define USE_ELT(path, text) std::cout << path << " = " << text << std::endl if ((att = dom.att_get("id"))) USE_ATT("/menu/@id", att->get_text()); if ((att = dom.att_get("value"))) USE_ATT("/menu/@value", att->get_text()); if ((elt = dom.elt_get("popup"))) { xsd__anyType& dom_popup = *elt; for (xsd__anyType *it = dom_popup.elt_get("menuitem"); it; it = it->get_next()) { xsd__anyType& dom_popup_menuitem = *it; if ((att = dom_popup_menuitem.att_get("value"))) USE_ATT("/menu/popup/menuitem/@value", att->get_text()); if ((att = dom_popup_menuitem.att_get("onclick"))) USE_ATT("/menu/popup/menuitem/@onclick", att->get_text()); } } std::cout << dom << std::endl; soap_destroy(ctx); // delete objects soap_end(ctx); // delete DOM data soap_free(ctx); // free context } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ You can also use domcpp option `-p` to generate efficient XPath query code to query and retrieve specific XML values. For example, let's write an XPath query to display the authors of books in a store. We will read the XML data from `std:cin` and filter the authors with the query `/store/book/@author` to collect them in a DOM node graph `y` containing the query results with domcpp option `-y`. We generate the code from the command line with domcpp as follows: domcpp -M -p'/store/book/@author' -y ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} xsd__anyType dom(ctx); std::cin >> dom; // XPath: /store/book/@author xsd__anyAttribute *att; xsd__anyType *elt; xsd__anyType y(ctx, "results"); #define QUERY_YIELD_ATT(v) y.add(xsd__anyType(ctx, "result").add(v)); #define QUERY_YIELD_ELT(v) y.add(xsd__anyType(ctx, "result").add(v)); if (dom.match("store")) { size_t pos = 1; for (xsd__anyType *it = dom.elt_get("book"); it; it = it->get_next(), ++pos) { xsd__anyType& v = *it; if ((att = v.att_get("author"))) { xsd__anyAttribute& v = *att; QUERY_YIELD_ATT(v); } } } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Let's apply this query to the `store.xml` file that you can find in section [XPath by example](#domcpp-4): ./query < store.xml You can compile this example yourself with: domcpp -o query.cpp -m -p'/store/book/@author' -y soapcpp2 -CSL import/dom.h c++ -o query query.cpp soapC.cpp dom.cpp stdsoap2.cpp You can also embed C/C++ code in XPath queries to filter and select values from XML at runtime. The domcpp code generator aims to produce clean, high-quality and readable C and C++ code. You can also embed C/C++ code in XPath queries to filter and select values from XML data at runtime. We will present domcpp in more detail in the next section. The remainder of this document explains how you can use the DOM C and C++ APIs to create XML data, access XML data, send/recv data via REST, and to read/write XML data to files, streams, and string buffers. XML DOM versus XML data bindings {#intro-2} -------------------------------- XML data bindings greatly simplify the development of XML applications. Compared to DOM manipulation and search by DOM tree traversal, all that is needed are declarations of the C/C++ data types that need to be serializable in XML by using the soapcpp2 tool the generate the data binding implementation. Furthermore, XML parsing is much faster with XML data bindings. XML is efficiently pulled and converted by the C/C++ deserializers. For more details, see [XML Data Bindings](http://www.genivia.com/doc/databinding/html). On the other hand, you can use the XML DOM API to develop REST operations for SOAP and XML messaging by composing and decomposing the XML manually. For example in C++: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #include "soapH.h" struct Namespace namespaces[] = { {"SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/"}, {"SOAP-ENC", "http://schemas.xmlsoap.org/soap/encoding/"}, {"xsi", "http://www.w3.org/2001/XMLSchema-instance"}, {"xsd", "http://www.w3.org/2001/XMLSchema"}, {"t", "http://tempuri.org/t.xsd"}, {NULL, NULL} }; int main() { soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT | SOAP_DOM_TREE); const char *endpoint = "http://www.cs.fsu.edu/~engelen/gmtlitserver.cgi"; xsd__anyType req(ctx, "SOAP-ENV:Envelope"); // DOM with SOAP envelope xsd__anyType res(ctx); // DOM for SOAP response req["SOAP-ENV:Body"]["t:gmt"] = ""; // SOAP Body with soap_dom_call(ctx, // make a call (POST) endpoint, // the service endpoint URL NULL, // no SOAPAction header req, // request t:gmt res); // response, if OK if (ctx->error) ... // handle IO error xsd__anyType::iterator i = res.find("param-1"); if (i != res.end()) // if found, display time cout << "Current time = " << i->get_text() << endl; } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The `SOAP_DOM_TREE` context flag used here disables the deserialization of embedded objects and data, which will be discussed in the next section. Other REST methods can be used to manage the state of resources via URL references, allowing for the storage of data (HTTP PUT), retrieval of data (HTTP GET), and removal of data (HTTP DELETE) from a resource. The `soap_dom_call` function takes NULL as the service input request and service output response parameters to facilitate PUT (NULL for response), GET (NULL for request), and DELETE (both request and response are NULL). However, XML data bindings greatly simplify the development of XML applications such as client and server runtimes for XML messaging and message validation. Compared to DOM manipulation and search by DOM tree traversal, all that is needed are declarations of server operations as C functions and the C/C++ data types passed to these functions. For example, with XML data bindings it only takes one line to declare the SOAP/XML service operation: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} t__gmt(time_t*); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The soapcpp2 tool generates the data binding implementation such that `t__gmt` can be invoked as a function in a client-side C or C++ runtime: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #include "soapH.h" #include "t.nsmap" int main () { soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT); time_t t; soap_call_t__gmt(ctx, endpoint, NULL, &t); if (ctx->error == SOAP_OK) cout << "Current time = " << ctime(t) << endl; } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The gSOAP DOM API offers a hybrid **DOM + data binding approach** that allows you to use DOM nodes a members of serializable structs and classes (these DOM parts are auto-generated by wsdl2h with option `-d`). This hybrid approach also allows you to embed serializable C/C++ data into a DOM node graph. This way, you get the best of both XML DOM and XML data bindings. Embedding serializable objects and data in DOM element nodes {#intro-3} ------------------------------------------------------------ To embed serializable data types we first declare these types in a header file for soapcpp2 to generate the data binding code. We also import `dom.h` from `gsoap/import` to use the DOM API: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #import "import/dom.h" //gsoap t schema namespace: urn:demotime typedef time_t _t__time; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This is a very small example to illustrate the concept. You can add declarations of data types to serialize. If namespaces are used in the XML document, then follow the naming conventions outlined in [XML Data Bindings: Colon notation versus name prefixing](http://www.genivia.com/doc/databinding/html/index.html#toxsd2). Importing `dom.h` is automated with wsdl2h option `-d` when running wsdl2h on WSDL and XSD files to produce a header file with the data binding interface for soapcpp2. Here, we assume you are starting with a header file for soapcpp2 with the declarations of C/C++ types to serialize. We use soapcpp2 to generate the data binding implementation code together with the DOM API in `soapStub.h`, `soapH.h`, `soapC.cpp` and a namespace table file `t.nsmap` and `t.xsd` schema that declares a `time` type (at line 11) and also an element (at line 15) because by convention the `_t__time` type name is prefixed with a `_`: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.xml} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ For details on declaring C/C++ types for XML data bindings and serialization, see [XML Data Bindings: Defining document root elements](http://www.genivia.com/doc/databinding/html/index.html#toxsd9-7). You can use these serializable types declared in the header file as embedded serializable objects and data in DOM element nodes. The `SOAP_DOM_NODE` context flag should be set to enable this feature. In the following example we use `_t__time` to construct a DOM for an XML root element `` that contains an embedded serializable `time_t` value: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #include "soapH.h" #include "t.nsmap" int main() { soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT | SOAP_DOM_NODE); time_t t = time(0); xsd__anyType dom(ctx, NULL, "t:time", &t, SOAP_TYPE__t__time); cout << dom << endl; // write XML ... if (dom.soap->error) ... // handle IO error } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ and to parse and deserialize a `` into a `time_t` value: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #include "soapH.h" #include "t.nsmap" int main() { soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT | SOAP_DOM_NODE); xsd__anyType dom(ctx); cin >> dom; // parse XML ... if (dom.soap->error) ... // handle IO error const time_t *t = static_cast(dom.get_node(SOAP_TYPE__t__time)); if (t) cout << "Time = " << ctime(t) << endl; } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ With the `SOAP_DOM_NODE` flag set, there are two ways the C/C++ types are deserialized into DOM elements: by element tag name matching or by xsi:type matching: 1. If an xsi:type attribute is present (which requires preparations on the sending side), then its value is matched against the names of the C/C++ types to select a deserializer to parse and deserialize the data into a DOM element node as embedded objects/data. If no xsi:type attribute is present or if no serializer is found, then: 2. The element tag is matched against the names of serializable C/C++ types to select a deserializer to deserialize the data into a DOM element node as embedded objects/data. If no deserializer is found then the XML element is parsed and stored as a DOM element node. While `SOAP_DOM_NODE` instructs the DOM parser to deserialize the values of C/C++ types that match element tags, the opposite, `SOAP_DOM_TREE` prevents deserialization, even when an `id` attribute is present in the XML payload. The default is to deserialze only when an `id` attribute is present in the XML payload. This is to ensure that the SOAP encoding protocol deos not break when id-ref attibutes are used for multireferenced objects. The domcpp command-line tool {#domcpp} ============================ The domcpp command produces high-quality, readable and reusable source code. The generated code can be readily used in your projects to populate XML data and retrieve XML data, thereby saving you substantial time and effort to write DOM API code in C or C++. The domcpp command-line tool generates C or C++ source code to populate a DOM node graph with the XML data given in an XML file. The command also has an option `-i` to generate source code to inspect parsed XML by using an XML file as a generic template for this code. And option `-p` generates efficient source code for XPath queries. Even stand-alone XPath query filter applications can be auto-generated with option `-m` (for main). Compiling the domcpp command {#domcpp-1} ---------------------------- You will find domcpp and the XML DOM examples in the gSOAP package in `gsoap/samples/dom`. To build domcpp, [install gSOAP](http://www.genivia.com/downloads.html) and build all sample codes as follows: ./configure --enable-samples make make install This builds the command-line tool domcpp in `gsoap/samples/dom` from where you can use it and/or copy it for use with your projects. If you do not have the samples built, you can use soapcpp2 (or soapcpp2.exe in `gsoap/bin/win32`) from the command line to generate the C++ code required for domcpp: cd gsoap/samples/dom soapcpp2 -CSL ../../import/dom.h c++ -I../.. -o domcpp domcpp.cpp soapC.cpp ../../dom.cpp ../../stdsoap2.cpp The above builds the domcpp command-line tool. Command-line options {#domcpp-2} -------------------- The domcpp command takes several options and an optional XML input file: domcpp [-c] [-e] [-f%fmt] [-h] [-i] [-l] [-m] [-M] [-n] [-O] [-ofile] [-ppath] [-rroot] [-xcode] [-y] [infile] where the domcpp command-line options are: | Option | Description | | -------- | ----------------------------------------------------------------- | | `-c` | generate C code instead of C++ | | `-e` | add explanatory comments to the generated code | | `-f%%fmt`| use `%%fmt` to format double floats, e.g. `-f%%lG` | | `-h` | display help message | | `-i` | generate code to inspect DOM node graph parsed from XML input | | `-l` | generate code for option `-i` to store values in local variables | | `-m` | generate stand-alone code by adding `main()` | | `-M` | generate minimal code unadorned with initialization and cleanup | | `-n` | generate XML namespace table | | `-O` | optimize code by factoring common indices when applicable | | `-ofile` | save source code to `file` | | `-ppath` | generate XPath query code for `path` | | `-rroot` | use `root` instead of root value `dom` in the generated code | | `-xcode` | generate code that executes `code` for each XPath query result | | `-y` | generate code that yields an array `y` of XPath query results | | `infile` | optional XML file to parse | | `-` | read XML from standard input | The domcpp command takes an XML input file `infile` to generate code to construct a DOM node graph in C/C++ for this XML, or, with option `-i`, to generate code that reads XML from input and traverses it to inspect its value by using the XML input file `infile` as a template to match against. For option `-i`, if you want additional code that uses local variables to store boolean, integer, and floating point values retrieved from the DOM node graph, then also use option `-l` with option `-i`. Use option `-c` to generate C code instead of C++ and use option `-e` to add explanatory comments to the generated code. The domcpp command emits source code to standard output or to the file specified with option `-o`. Minimalistic code is generated with option `-M`, which is useful to automate pasting of the unadorned source code into the source code of your project. Optimized code is generated with option `-O` by factoring common array indices and object field names. This produces more elaborate code that is more efficient but may be harder to read and modify. This option has no effect on the code generated with option `-i`. The default name of the root value in the generated source code is `dom`. To change this name use option `-r`. Do not use the name `v`, which represents the current value in XPath query C/C++ code. Other variable names to avoid are `it` `att`, `elt`, `pos`, since these are internally used by the generated code. To include a namespace table in the generated code, use option `-n`. This option simplifies the use of the DOM API by removing namespace URIs passed to API functions as qualified tag names suffice in most cases. Use option `-p` to generate code that filters XML data from a source of input with an XPath query `path`. Option `-x` specifies XPath query code to execute for each query result. The default action in the generated code is to print each query result value in XML separated by newlines. Option `-y` yields an XML DOM with root `results` and each query result stored in a `result` element. Option `-x` overrides option `-y`. To generate a stand-alone application use option `-m`. This option is useful for testing XPath query filters given with option `-p`. Option `-f%``fmt` sets the floating point double precision format to use in the generated code. By default, domcpp emits floating point numbers with up to 17 digit mantissas to preserve precision. Use `-f%``lG` for the shortest floating point representation. XPath syntax support for domcpp {#domcpp-3} ------------------------------- XPath (the XML Path Language), is a query language for selecting nodes from an XML document. A XPath query returns the XML elements and attributes of a DOM node structure of an XML document that match the selection criteria. An XPath expression specifies a data query to select elements and attributes (and their values) typically starting from the root node, and descending deeper into the node graph to match child nodes. For example, suppose we have a `` root element with a number of `` child elements. Each `` element has a `title` attribute with the title text and some other attributes which we will ignore for now. The following XPath query returns the titles of all books in the store: /store/book/@title This example illustrates the most important kind of expression in XPath, which is a **location path**. A location path consists of a sequence of **location steps**. Locations steps are separated by '/'. Each step consists of an **axis** followed by an optional **node test** and zero or more **predicates**. The axis, node tests, and predicates supported by domcpp XPath expressions are listed in the three tables below. | Axis | Nodes matched and returned | | ------------- | ------------------------------------------------------------ | | `/` | document root (when used at the start of the location path) | | `//` | descendant or self | | `.` | self | | `..` | parent node | | `@` | attribute node | | `tag` | tag name of attributes or elements in the null namespace | | `ns:tag` | tag name of attributes or elements in the `ns` namespace | | `*` or `*:*` | any tag name in any namespace | | `*:tag` | tag name in any namespace | | `ns:*` | all tags in the `ns` namespace | Note that domcpp XPath does not (yet) support the full XPath axis syntax. | Node test | Nodes matched and returned | | ------------- | ------------------------------------------------------------ | | `text()` | text-only child nodes | A `text()` node test is useful to select text-only child nodes when its siblings are a mix of text and elements. This mixed content of elements and text is more common in XHTML markup, but not in XML Web service messaging for example. Zero or more predicates may follow to filter nodes by position, by path, or by a C/C++ expression: | Predicate | Nodes filtered | | ------------- | ------------------------------------------------------------ | | `[n]` | select nodes that are at the n-th position | | `[path]` | select nodes if XPath `path` matches | | `[?expr]` | select nodes if C/C++ expression `expr` is true or nonzero | Note that domcpp XPath does not (yet) support functions and operators in predicates. Instead, you can use C/C++ expressions to filter nodes where variable `v` refers to the axis node (i.e. self, which is an `xsd__anyType` element node or an `xsd__anyAttribute` attribute node) and the integer variable `pos` that refers to the query position. Path subexpressions are grouped with `(` and `)`. Grouping is useful to apply predicates to a specific part of the location path. Without grouping, a predicate only applies to the axis that immediately preceeds it. For example, `x/y[1]` selects the first child element `y` of all `x` elements. By contrast, `(x/y)[1]` selects the first `y` child element of the first `x` element that has at least one `y` child element. XPath by example {#domcpp-4} ---------------- Consider the following XML document: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.xml} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ To match the `title` of the first book in a `store`, starting at the root indicated by `/`, we use the following XPath query expression: /store/book[1]/@title This query returns `"Sayings of the Century"` when applied to the XML document. To try the XPath examples yourself, we suggest to create a `store.xml` file with the above XML and run domcpp from the command line to compile an XPath query as follows: cd gsoap/samples/dom soapcpp2 -CSL ../../import/dom.h domcpp -o test-dom.cpp -m -p'/store/book[1]/@title' c++ -I../.. -o test-dom test-dom.cpp soapC.cpp ../../dom.cpp ../../stdsoap2.cpp ./test-dom < store.xml The `soapC.cpp` file, and the header files `soapStub.h` and `soapH.h`, are generated with the command `soapcpp2 -CSL dom.h`, which is done just once for all C++ DOM applications. Use soapcpp2 option `-c` to generate `soapC.c` for C (with the corresponding `soapStub.h` and `soapH.h` in C). The compiled XPath query is applied to the `store.xml` document and returns the matches found. Use domcpp option `-y` to collect and return all matches in an XML document with root `results`: To match any tag name of an element or attribute, we use a wildcard `*`: /store/*/@price This matches and returns the prices of all items in the store. If we want to obtain all `price` attributes at any level of the node graph, we can also use `//` called "recursive descent" or simply "recurse" to select descendents (and self when used at the root): //@price This query selects all `price` attributes in an XML document at any level, including the `price` attribute of the document root if any. For our example XML store this query returns the prices of all items in the store. To select all attributes of a node we use a wildcard `@*`, for example to obtain all attributes of the first book in the store: /store/book[1]/@* We can predicate node selections with criteria based on path location matches. For example, to select items from the store that have an `isbn` attribute, and then obtain their price, we use a path location predicate `[@isbn]`: /store/*[@isbn]/@price If we only want to find the first result, we specify a position predicate `[1]` and apply it to all location steps in the XPath expression: /(store/*[@isbn]/@price)[1] A predicate applies to the axis and its predicates located to the left of the predicate as part of one location step, so we used parenthesis to group the location steps to apply the `[1]` position predicate. There can be several ways an XPath query can be formulated. Here is a different one without parenthesis to obtain the same result: /store/*[@isbn][@price][1]/@price This query matches books with both an isbn and price attribute and returns the price of the first match found. Because all store items are priced in our XML store example, we can also use the following XPath query: /store/*[@isbn][1]/@price However, it is generally better to use more robust XPath queries that are not based on assumptions, such as the previous queries for our XML store that cope with price omissions. More complex queries can be formulated by embedding C/C++ expressions in the query as predicates with `[?expr]`. This is an extension of domcpp and not standard XPath expression syntax. For example, the following XPath query with C++ predicate selects store items with prices under 10.0: /store//@price[?(double)v < 10.0] and in C: /store//@price[?soap_att_get_double(v) < 10.0] We can combine the C/C++ predicate with a path predicate to get books priced under 10.0: /store/book[@price[?(double)v < 10.0]] and to obtain the book titles of these books only: /store/book[@price[?(double)v < 10.0]]/@title XPath queries do not modify the node graph searched. So you do not need to worry about predicates with position indices that are out of bounds or about tag names that refer to non-existent attributes or elements. @warning In this respect we should caution you about using C/C++ expressions that modify DOM nodes, since this may affect the query results in unpredictable ways. For example: //[?(double)v.att("price") < 10.0] @warning The `att("price")` method sets an attribute, not just reads it, so disaster strikes as we visit every node in the DOM node graph to set a price attribute! As you can see, C/C++ predicates can inspect the current XPath node by accessing variable `v`. This variable is either an `xsd__anyType` DOM element node or an `xsd__anyAttribute` DOM attribute node, depending on the path. Variable `v` is a reference in C++ and a pointer in C. Besides the current node `v` you can also access the XPath root node `dom`. Instead of the default root name `dom`, you can change `dom` to another name with domcpp option `-r`. You can also access `pos` which corresponds to the XPath `position()` value. You can access variables and functions in C/C++ predicates, but do not modify the variables `it` and `pos` which are internally used by the generated XPath query code. For example, you can access variable `pos` (but you should not change it): /(store/*[@isbn]/@price)[?pos > 1] This XPath query returns the price of books with an `isbn`, but after the first match was discarded by the predicate. Other temporary variables used internally are a pointer to an attribute `att` and a pointer to an element `elt`. You may set and use these as temporaries in the scope of a C/C++ predicate. The C/C++ predicates are quite powerful and can be used to filter values as shown earlier but also to select attributes and elements by matching their tag name using `v,match(tag)` in C++ and `soap_att_match(v, NULL, tag)` or `soap_elt_match(v, NULL, tag)` in C: //book/@*[?v.match(argv[1])] This assumes that the command-line argument (`argv[1]`) of the application is a book attribute name. Otherwise, no results are returned. After compiling the XPath query with domcpp -o test-dom.cpp -m -p'//book/@*[?v.match(argv[1])]' c++ -I../.. -o test-dom test-dom.cpp soapC.cpp ../../dom.cpp ../../stdsoap2.cpp we can obtain the book titles with: ./test-dom title < store.xml Finally, let's use the value of `argv` to filter products in the store by a given command-line argument price: domcpp -m -p'//@price[?(double)v < strtod(argv[1], NULL))]' and in C: domcpp -c -m -p'//@price[?soap_att_get_double(v) < strtod(argv[1], NULL))]' Note that the `strtod` function returns the double float value of `argv[1]` and is repeately called. A more efficient implementation would store the value in a temporary variable and use the temporary in the C/C++ predicate. Understanding XML namespaces {#ns} ============================ XML namespaces are commonly used with XML documents that are instances of XML schemas. A full introduction is beyond the scope of this document. We instroduce the basics here to help you understand why XML namespaces are important and how they are used in the C/C++ DOM API of gSOAP. XML namespace are important when XML documents contain instances of multiple XML schemas. XML elements and attributes that are declared in separate schemas should be distinguishable and their content should be verifyable. Tag name conflicts that may be caused by combining multiple XML schemas to define an XML document can be resolved by binding elements and attributes to specific XML namespaces. XML elements and attributes are bound to an XML namespace by using a namespace prefix in qualified tag names of elements and attributes. A qualified tag is of the form `prefix:name`, such that the prefix is bound in the scope of the tag to a namespace URI with an `xmlns:prefix="URI"` declaration. Unqualified tags can be bound to a namesapce with a `xmlns="URI"` default namespace declaration. An XML namespace is a Uniform Resource Identifier (URI). There are two general forms of URI: Uniform Resource Locators (URL) and Uniform Resource Names (URN). Consider for example the XML document with elements and attributes in three distinct XML namespaces `"urn:one"`, `"urn:two"`, and `"urn:three"`: Element `e1` is bound to `"urn:one"`, `e2` and `e3` are bound to `"urn:three"`. Attribute `a1` has no namespace (it is in the null namespace), `a2` is bound to `"urn:two"` and `a3` is bound to `"urn:three"`. A namespace declaration (`xmlns`) scope extends to all descendants or until redeclared. The `x` and `y` prefixes declared in element `e1` have a scope of visibility in all elements, since `e1` is the root. The default namespace declaration in element `e2` has a scope of visibility in element `e2` and extends to all of its attributes and all of its child elements. An XML namespace may refer to the defining XML schema by a URL, but often they do not. The URI string itself should be sufficiently unique, which is important to distinguish XML elements and attributes in different XML namespaces. This is similar to C++ namespaces. A unique c++ namespace name suffices (we do not need to know where the source files are located). The DOM API aims to simplify XML document construction and XML analysis by offering an API that does not require full namespace URIs to passed to the API functions when the URIs are defined in a namespace table. You can simply use qualified tag names to construct XML documents in a DOM and to analyze a DOM after XML parsing. This approach works on the basis of internal normalization so that two prefixes match when their associated URI matches (i.e. prefix names may differ but still match when their URIs match). Assume we have the following namespace table of `{"prefix", "URI"}` bindings that includes the three namespace URIs used in our example XML document, but we pick three different prefixes `a`, `b`, and `c`: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} struct Namespace namespaces[] = { {"SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/", "http://www.w3.org/*/soap-envelope", NULL}, {"SOAP-ENC", "http://schemas.xmlsoap.org/soap/encoding/", "http://www.w3.org/*/soap-encoding", NULL}, {"xsi", "http://www.w3.org/2001/XMLSchema-instance", "http://www.w3.org/*/XMLSchema-instance", NULL}, {"xsd", "http://www.w3.org/2001/XMLSchema", "http://www.w3.org/*/XMLSchema", NULL}, {"a", "urn:one"}, {"b", "urn:two"}, {"c", "urn:three"}, {NULL, NULL, NULL, NULL} }; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ With this table defined globally (or by using `soap_set_namespaces()` see next section), we can conveniently use qualified tag names with the prefixes `a`, `b`, and `c` to construct and/or match XML elements and attributes in these namespaces, because namespace matching is based on the URI of a prefix. Therefore, the following qualified tag names match the following elements and attributes in the example XML document: | Tag name | Matches | | -------- | ------------------------------------------------------- | | `"a:e1"` | element `` in namespace scope `xmlns:x="urn:one"` | | `"a1"` | attribute `a1` in the null namespace | | `"b:a2"` | attribute `y:a2` in namespace scope `xmlns:y="urn:two"` | | `"c:e2"` | element `` in namespace scope `xmlns="urn:three"` | | `"c:a3"` | attribute `a3` in namespace scope `xmlns="urn:three"` | | `"c:e3"` | element `e3` in namespace scope `xmlns="urn:three"` | The choice of prefixes `a`, `b`, and `c` is rather arbitrary. We can pick prefix names for the table as long as they are unique and are valid names (we refer to the XML syntax of "colonized names" and "non-colonized names"). The domcpp option `-n` includes XML namespaces in a namespace table in the auto-generated code by copying namespace bindings from the XML document analyzed by the tool to a namespace table. @note You can also use the wsdl2h tool to retrieve namespaces and declare your own prefix names in `typemap.dat`. The soapcpp2 tool generates the data binding implementation and a `.nsmap` file with the namespace bindings. You can still use the DOM API without a namespace table or with an incomplete table, but the namespace URIs that are left out from the table must be specified as additional `ns` parameters in the DOM API functions. C++ XML DOM API {#cpp} =============== XML is represented as a DOM node graph internally consisting of values (text strings of character data in UTF-8), attribute nodes with tag name and optional namespace URI, and element nodes with optional tag names and optional namespace URI. Tag names are stored in strings of UTF-8. Tag names can be qualified of the form `q:tag` or unqualified. An element tag name that is NULL represents a text-only node, which will only be present in mixed content of elements and text character data (as in XHTML markup). XML namespace handling is "smart" in the gSOAP DOM API: the DOM engine matches and stores XML with namespace URIs to ensure that a prefix qualifier is always locally bound to a namespace URI in the node graph. Furthermore, you can use qualified tags when constructing a DOM node instead of the full namespace URI, but only if the prefix and URI are defined in the namespace table (global `struct Namespace namesapces[]`. When working with wsdl2h and soapcpp2 you should include the soapcpp2-generated `.nsmap` file with namespace bindings that are applicable to your XML tags. List of C++ files {#cpp-files} ----------------- The following files located in the package under `gsoap` are required to use the C++ DOM API: - `stdsoap2.h`: gSOAP engine - `stdsoap2.cpp`: gSOAP engine - `dom.cpp`: DOM parser and DOM C/C++ API implementation - `import/dom.h`: DOM import for data bindings in a .h file for soapcpp2 (do not #include this file in your project builds). Use soapcpp2 `-Iimport` to specify import path when `dom.h` is imported in a header file for soapcpp2. The gSOAP header file `dom.h` declares the DOM for use in data bindings and should generally be imported with `#import` in gSOAP header files for the soapcpp2 tool. You can also run soapcpp2 directly on `import/dom.h` for DOM-only projects. This generates `soapStub.h`, `soapH.h` and `soapC.cpp`. To auto-generate these files, execute: soapcpp2 -CSL import/dom.h Then compile and link the `dom.cpp` files listed above with the auto-generated `soapC.cpp` and `stdsoap2.cpp`: c++ -I../.. -o myapp myapp.cpp soapC.cpp ../../dom.cpp ../../stdsoap2.cpp Instead of `stdsoap2.cpp` you can link `-lgsoap++.a` when installed by the gSOAP package. Or link `-lgsoapssl++.a` to get both `stdsoap2.cpp` and `dom.cpp` with OpenSSL enabled for HTTPS: c++ -DWITH_OPENSSL -I../.. -o myapp myapp.cpp soapC.cpp -lgsoapssl++ -lssl -lcrypto Note that we compile with `-DWITH_OPENSSL` and link `-lssl`, and `-lcrypto`. Because XML namespaces are required except for the most simple plain XML applications, you should include the generated `.nsmap` file: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #include "soapH.h" #include "soap.nsmap" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Or define your own namespace table. For example, at a minimum you want a table with SOAP and XSD bindings: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #include "soapH.h" struct Namespace namespaces[] = { {"SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/", "http://www.w3.org/*/soap-envelope", NULL}, {"SOAP-ENC", "http://schemas.xmlsoap.org/soap/encoding/", "http://www.w3.org/*/soap-encoding", NULL}, {"xsi", "http://www.w3.org/2001/XMLSchema-instance", "http://www.w3.org/*/XMLSchema-instance", NULL}, {"xsd", "http://www.w3.org/2001/XMLSchema", "http://www.w3.org/*/XMLSchema", NULL}, {NULL, NULL, NULL, NULL} }; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Then also add entries of the form `{"prefix", "URI"}` before the last NULL entry to complete the table with xmlns prefix and URI bindings for your XML project. C++ DOM API functions {#cpp-api} --------------------- This overview of the DOM API functions refers to the following types of parameters and values, which are used throughout this section: | Name | Type and value | | ------ | ----------------------------------------------------------------- | | `ctx` | `struct soap *ctx` context pointer (manages memory and IO) | | `ns` | `const char *ns` XML namespace URI string or NULL | | `tag` | `const char *tag` or `const wchar_t *tag` (un)qualified tag name | | `utag` | `const char *utag` or `const wchar_t *utag` unqualified tag name | | `qtag` | `const char *qtag` or `const wchar_t *qtag` qualified tag name | | `patt` | (wide) string (un)qualified tag name pattern with `*` wildcard(s) | | `text` | (wide) string | | `node` | `const void *node` pointer to serializable C/C++ data object | | `type` | `SOAP_TYPE_T` type identifier of serializable C/C++ data type T | | `att` | `xsd__anyAttribute att` DOM attribute node | | `elt` | `xsd__anyType elt` DOM element node | | `dom` | a DOM node (an element or an attribute node) | | `val` | bool, integer, float, or (wide) string | | `pos` | element position > 0 (XPath position numbering) | The API includes functions that take wide strings and normalizes these internally to UTF-8 encoded strings. However, when retrieving tags and text you will only be able to obtain UTF-8 strings. You can convert UTF-8 strings to wide strings that are managed by the context by using: - `int soap_s2wchar(soap *ctx, const char *s, wchar_t **t, long minlen, long maxlen)` Convert string `s` with UTF-8 content to a `wchar_t` string and set `t` to point to this string. If no length restrictions are enforced, pass -1 for `minlen` and `maxlen`. Returns `SOAP_OK` (zero) if heap allocation succeeded, or an error code. - `int soap_s2std__wstring(soap *ctx, const char *s, std::wstring *t, long minlen, long maxlen)` Convert string `s` with UTF-8 content to `std::wstring` pointed to by `t`. If no length restrictions are enforced, pass -1 for `minlen` and `maxlen`. Returns `SOAP_OK` (zero) if heap allocation succeeded, or an error code. ### Creating a DOM root element node {#cpp-api1} Creating a DOM node graph starts with creating the root element node using one of the `xsd__anyType` constructors: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} // 8 ways to create a root element node 'dom' xsd__anyType dom(ctx); // unnamed element node managed by context xsd__anyType dom(elt); // copy constructor (shares context and data) xsd__anyType dom(ctx, utag); // element node xsd__anyType dom(ctx, qtag); // element node xsd__anyType dom(ctx, ns, utag); // element node xsd__anyType dom(ctx, ns, qtag); // element node xsd__anyType dom(ctx, ns, tag, text); // element node as above with a text value xsd__anyType dom(ctx, ns, tag, node, type); // element node as above with serializable object ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The third and fourth constructors omit the `ns` parameter, which is the same as passing a NULL `ns` parameter. The fourth constructor is convenient to use to construct an element node that is bound to an XML namespace by using a qualified tag name `qtag` without specifying the namespace URI with the `ns` parameter. To use this approach, you should define the namespace prefix in `qtag` in a global namespace table, see [Understanding XML namespaces](#ns), and as shown below: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} // a global namespace table with {"prefix", "URI"} xmlns bindings struct Namespace namespaces[] = { ... {"q", "urn:example"}, {NULL, NULL, NULL, NULL} }; xsd__anyType dom(ctx, "q:tag"); // OK: "q" is in the namespace table xsd__anyType dom(ctx, "bad:tag"); // BAD: "bad" is not in the namespace table xsd__anyType dom(ctx, "urn:ok", "ok:tag"); // OK: "ok" is locally scoped in the DOM ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ You can also use multiple namespace tables and select the one you want to use with the `soap_set_namespaces()` function: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} // a local (static) namespace table with {"prefix", "URI"} xmlns bindings struct Namespace my_dom_namespaces[] = { ... {"q", "urn:example"}, {NULL, NULL, NULL, NULL} }; soap_set_namespaces(ctx, my_dom_namespaces); // use namespace table for qualified tags xsd__anyType dom(ctx, "q:tag"); // OK: "q" is in the namespace table ... soap_set_namespaces(ctx, namespaces); // restore to global table ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ### Assigning child nodes and values to a DOM node {#cpp-api2} After creating a root element node we can start populating the root with attributes, child elements, and values. To assign a value to a DOM attribute node or element node `dom`, we can use the the `xsd__anyType::set()` and `xsd__anyAttribute::set()` methods or use the assignment operator as follows: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} // 4 ways to assign a value to an element node or to an attribute node dom.set(val); // set text character data from bool, integer, float, string value dom = val; // same as above dom = att; // copy attribute node to attribute dom node (shallow, shares data) dom = elt; // copy element node to element dom node (shallow, shares data) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In addition, element nodes can be assigned serializable objects and data as values, meaning that the object and data will be serialized in place of the element content: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} // two ways to assign serializable data to an element node 'dom' dom.set(node, type); // assign serializable C/C++ object or data to element node dom = node; // assign serializable C/C++ object (object class must have soap_type() method) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ To learn more about embedding serializable objects and data in DOM node graphs, see [Embedding serializable objects and data in DOM element nodes](#intro-3). To add attributes to the element node `xsd__anyType dom` we use one of the `xsd__anyType::att()` methods as follows: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} // 4 ways to add an attribute to an element node 'dom' or extend an attribute list 'dom' dom.att(utag) = val; // add attribute utag="val" dom.att(qtag) = val; // add attribute q:tag="val" xmlns:q="ns" dom.att(ns, utag) = val; // add attribute _1:utag="val" xmlns:_1="ns" with temporary _1, _2, _3, ... dom.att(ns, qtag) = val; // add attribute q:tag="val" xmlns:q="ns" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ To add child elements to the element node `xsd__anyType dom` we use one of the `xsd__anyType::elt()` methods and the bracket operator as follows: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} // 7 ways to add a child element to an element node 'dom' xsd__anyType& elt = dom.elt(); // add text-only child, unnamed (no tags) xsd__anyType& elt = dom.elt(utag); // add child element xsd__anyType& elt = dom[utag]; // same as above xsd__anyType& elt = dom.elt(qtag); // add child element xsd__anyType& elt = dom[qtag]; // same as above xsd__anyType& elt = dom.elt(ns, utag); // add child xsd__anyType& elt = dom.elt(ns, qtag); // add child ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given the `elt` reference to a child element of the `dom` node above, you can use this reference to build more complex node graphs by assigning attributes, child elements, and values at increasingly deeper levels of the tree. Because element nodes can have multiple children with the same tag name, essentially representing an array, you can use the bracket operator to index the child elements at their relative position among its siblings that have the same tag name. Position indexing starts at one (i.e. `[1]` XPath style) and child elements are added up to the highest position index used: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} // add 'array' of three child elements to an element node 'dom' xsd__anyType& elt = dom[tag]; // add child (using one of the methods above) elt[1] = val; // assign val to first child element elt[3] = val; // add children at positions 2 and 3, assign val to the 3rd ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Note that `elt[1]` refers to `elt` itself, because indexing starts at 1 (as in XPath). Thus, position index `[1]` is optional to use. You can combine these operations and methods in various ways to create more complex DOM node graphs. Let's illustrate this with an example: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT | SOAP_DOM_TREE); xsd__anyType dom(ctx, "menu"); dom.att("id") = 7; dom.att("key") = L"⌘F"; dom["popup"]["menuitem"][1].att("value") = "New"; dom["popup"]["menuitem"][1].att("onclick") = "CreateNewDoc()"; dom["popup"]["menuitem"][2].att("value") = "Open"; dom["popup"]["menuitem"][2].att("onclick") = "OpenDoc()"; dom["popup"]["menuitem"][3].att("value") = "Close"; dom["popup"]["menuitem"][3].att("onclick") = "CloseDoc()"; std::cout << dom; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This code emits the following XML output: The `xsd__anyAttribute` DOM attribute node constructors are identical to the `xsd__anyType` DOM element node constructors and can be used to create an attribute node or to create a list of attributes. As an alternative to creating attributes and elements in place, you can also construct attribute and element nodes and add them to other element nodes by using the `xsd__anyType::add()` method. For example: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} // add an attribute 'att' and an element node 'elt' to another element node 'dom' xsd__anyAttribute att(ctx, NULL, "id", "7"); // id attribute xsd__anyType elt(ctx, "popup"); // popup element dom.add(att).add(elt); // add id attribute and popup as child element ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ To create a list of two attributes and add them to an element node `dom`: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} // add a list of attributes 'atts' to an element node 'dom' xsd__anyAttribute atts(ctx); atts.att("id") = 7; atts.att("key") = L"⌘F"; dom.adds(atts); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Finally, you can use domcpp to generate DOM construction code from a sample XML document. ### Matching and retrieving DOM node values and properties {#cpp-api3} Given a DOM node graph parsed from an XML document, we can match its tag names and use methods to retrieve values, attribuets, child elements, and properties. Given a DOM attribute node `xsd__anyAttribute dom` or element node `xsd__anyType dom`, you can use the following methods to match and retrieve the node's namespace and tag name: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} bool b = dom.match(patt); // true if tag matches pattern bool b = dom.match(ns, patt); // true if ns and tag match the patterns const char *s = dom.ns(); // namespace URI string or NULL if none const char *t = dom.tag(); // (un)qualified tag name string, NULL if unnamed ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given a DOM attribute node `xsd__anyAttribute dom` or element node `xsd__anyType dom`, the following methods can be used to retrieve the value of the node's character data content: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} bool b = dom.is_true(); // true if text is "true" or "1" bool b = dom.is_false(); // true if text is "false" or "0" LONG64 n = dom.get_int(); // 64 bit integer value of text, or 0 double x = dom.get_double(); // double float value of text, or NaN const char *t = dom.get_text(); // text string in UTF-8, or NULL if none ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ You can also cast an element or attribute node to a bool, an int, a double, or a string to obtain its value. For example: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} int n = dom; // integer value cast from text in DOM node, or 0 const char *t = dom; // text string in UTF-8 of the DOM node, or NULL if none ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Element nodes may contain deserialized objects and data as values, which can be retrieved with one of two methods: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} T *node = (T*)dom.get_node(SOAP_TYPE_T); // get deserialized C/C++ object or data of type T, NULL if none int type = dom.get_type(&node); // get deserialized C/C++ object or data of any type, 0 if none ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ To learn more about embedding serializable objects and data in DOM node graphs, see [Embedding serializable objects and data in DOM element nodes](#intro-3). Given a DOM element node `xsd__anyType dom`, one of the following methods can be used to retrieve an attribute by its unqualfied tag name (default namespace), by qualified tag name (assuming the prefix is defined in the namespace table), or by namespace and unqualified tag name: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} xsd__anyAttribute *att = dom.att_get(utag); // get attribute utag, NULL if none xsd__anyAttribute *att = dom.att_get(qtag); // get attribute q:tag xsd__anyAttribute *att = dom.att_get(ns, utag); // get attribute utag in namespace ns, NULL if none ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The second form is convenient to use to retrieve attributes in namespaces by using a qualified tag name `qtag` without having to specify the `ns` namespace URI parameter. This requires the namespace prefix used in `qtag` to be defined in the global namespace table. Given a DOM element node `xsd__anyType dom`, one of the following methods can be used to retrieve a child element by its unqualfied tag name (default namespace), by qualified tag name (assuming the prefix is defined in the namespace table), or by namespace and unqualified tag name: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} xsd__anyType *elt = dom.elt_get(); // get first text-only child element, NULL if none xsd__anyType *elt = dom.elt_get(utag); // get first child element , NULL if none xsd__anyType *elt = dom.elt_get(qtag); // get first child element , NULL if none xsd__anyType *elt = dom.elt_get(ns, utag); // get first child element , NULL if none elt = elt.get_next(); // get next matching child element, NULL if none elt = elt.get_nth(pos); // get matching child element at pos counting from 1, NULL if none ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The `get_next()` method can be used in loops to iterate over child elements with the same namespace and tag, as if traversing an array. For example: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} // iterate over child elements of element node 'dom' for (xsd__anyType *it = dom.elt_get("menuitem"); it; it = it->get_next()) ... ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ To obtain various properties of an `xsd__anyType dom` element node: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} xsd__anyType *elt = dom.parent(); // parent node, or NULL when root size_t n = dom.depth(); // depth from the root node (0 is root) size_t n = dom.len(); // number of siblings that have the same tag name size_t pos = dom.nth(); // node is at pos with the same tag name as some siblings, or 0 if alone ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The following invariants hold (assuming that pointer dereferences (`->`) are verified and valid): ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} dom[tag].match(tag) == dom.elt(tag).match(tag) == true dom[tag].parent() == dom.elt(tag).parent() == dom dom[tag].tag() == dom.elt(tag).tag() == tag dom.elt(ns, tag).match(ns, tag) == dom dom.elt(ns, tag).parent() == dom dom.elt(ns, tag).ns() == ns dom.elt(ns, tag).tag() == tag dom.att(tag).match(tag) == true dom.att(ns, tag).match(ns, tag) == true dom.att(ns, tag).ns() == ns dom.att(ns, tag).tag() == tag dom.set(val) == val // by casting to bool, int, float, string dom.elt_get(tag)->parent() == dom dom.elt_get(tag)->depth() == dom.depth() + 1 dom.elt_get(tag)->nth() <= dom.elt_get(tag)->len() dom.elt_get(tag)->nth() == 0 if dom.elt_get(tag)->len() == 1 dom.elt_get(tag)->nth() == 1 if dom.elt_get(tag)->len() > 1 dom.elt_get(tag)->get_next()->nth() == 2 dom.elt_get(tag)->get_nth(pos)->nth() == pos ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ### Traversing a DOM node graph {#cpp-api4} Given a DOM node graph, we can traverse its attribute list and its child elements by using the iterators `xsd__anyAttribute::iterator` and `xsd__anyType::iterator`, respectively: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} // print attribute tags for (xsd__anyAttribute::iterator it = dom.att_begin(); it != dom.att_end(); ++it) std::cout << "@" << it->tag() << std::endl; // print child element tags for (xsd__anyType::iterator it = dom.elt_begin(); it != dom.elt_end(); ++it) std::cout << "<" << it->tag() << ">" << std::endl; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ You can also traverse the entire node graph below a certain DOM element node `xsd__anyType dom` in depth-first order starting with the current `dom` node: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} // print all element tags in depth-first order for (xsd__anyType::iterator it = dom.begin(); it != dom.end(); ++it) std::cout << "<" << it->tag() << "> at depth " << it->depth() << std::endl; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ### Searching a DOM node graph {#cpp-api5} Given a DOM node graph, we can search its attribute list and its child elements by using a pattern with wildcards `*` to match namespace and/or tag names, similar to XPath `*` pattern matching: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} // print attribute tags that match *:id (* matches any namespace, including default) for (xsd__anyAttribute::iterator it = dom.att_find("*:id"); it != dom.att_end(); ++it) std::cout << "@" << it->tag() << std::endl; // print element tags in namespace "urn:one" (assuming "x" is "urn:one" in the namespace table) for (xsd__anyType::iterator it = dom.elt_find("x:*"); it != dom.elt_end(); ++it) std::cout << "<" << it->tag() << ">" << std::endl; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The above assumes that a namespace table is used that defines namespace `x`. Alternatively, you can specify namespace parameters that can be NULL or `"*"` to match any namespace URI (NULL can be used in place of a `"*"` pattern): ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} // print attribute tags that match *:id for (xsd__anyAttribute::iterator it = dom.att_find("*", "id"); it != dom.att_end(); ++it) std::cout << "@" << it->tag() << std::endl; // print element tags in namespace "urn:one" for (xsd__anyType::iterator it = dom.elt_find("urn:one", "*"); it != dom.elt_end(); ++it) std::cout << "<" << it->tag() << "<" << std::endl; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Patterns for namespaces and tags are not restricted to wildcards `*`. You can specify parts of a namespace URI or tag name and use one or more `*` to match the rest. You can also search the entire node graph below a certain DOM element node in depth-first order starting with the current node: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} // find all element nodes with attribute "id" deep in the node graph for (xsd__anyType::iterator it = dom.find("@*:id"); it != dom.end(); ++it) std::cout << "element " << it->tag() << " has an @id=" << it->att_get("*:id")->get_text() << std::endl; // print all element tags in namespace "urn:one" for (xsd__anyType::iterator it = dom.find("urn:one", "*"); it != dom.end(); ++it) std::cout << "<" << it->tag() << ">" << std::endl; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ### XML DOM parsing and writing from/to streams {#cpp-api6} To parse XML from a stream into a DOM node graph you can use the `>>` operator on an input stream and a DOM element node: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} // create new context and parse XML from 'cin' into 'dom' soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT | SOAP_DOM_TREE); xsd__anyType dom(ctx); std::cin >> dom; if (dom.soap->error) ... // check for IO end parse errors ... soap_destroy(ctx); soap_end(ctx); soap_free(ctx); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ To write a DOM node graph in XML to a stream, you can use the `<<` operator on an output stream and a DOM element node: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} // create new context and create a 'dom', write its XML to 'cout' soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT | SOAP_DOM_TREE); xsd__anyType dom(ctx, "store"); ... std::cout << dom << std::endl; if (dom.soap->error) ... // check for IO errors ... soap_destroy(ctx); soap_end(ctx); soap_free(ctx); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ You can also parse XML from a string into a DOM node graph by using a `std::istringstream` object: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} // create new context and parse XML from a string into 'dom' soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT | SOAP_DOM_TREE); std::istringstream in; in.str(""); xsd__anyType dom(ctx); in >> dom; // parse XML into DOM if (dom.soap->error) ... // check for IO and parse errors ... soap_destroy(ctx); soap_end(ctx); soap_free(ctx); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Likewise, you can write a DOM node graph in XML to a string by using a `std::ostringstream` object: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} // create new context and create a 'dom', write its XML to a string soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT | SOAP_DOM_TREE); std::ostringstream out; xsd__anyType dom(ctx, "store"); ... out << dom; // convert DOM to XML string in UTF-8 ... soap_destroy(ctx); soap_end(ctx); soap_free(ctx); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ It is also possible to send and receive XML over HTTP as REST operations as was illustrated in the introduction. To make REST HTTP POST, GET, OUT, and DELETE calls, use: - `int soap_dom_call(soap *ctx, const char *URL, const char *action, const xsd__anyType *in, xsd__anyType *out)` Make a POST, GET, PUT, DELETE call. Connect to endpoint `URL` with HTTP SOAPAction `action` (or NULL) and send request `in` to server and receive response `out`. Returns `SOAP_OK` (zero) or an error code. POST method: pass both `in` and `out`. GET method: pass a NULL to `in`. PUT method: pass a NULL to `out`. DELETE method: pass both NULL to `in` and `out`. This function is overloaded to accept references to the `in` and `out` parameters in C++. C XML DOM API {#c} ============= XML is represented as a DOM node graph internally consisting of values (text strings of character data in UTF-8), attribute nodes with tag name and optional namespace URI, and element nodes with optional tag names and optional namespace URI. Tag names are stored in strings of UTF-8. Tag names can be qualified of the form `q:tag` or unqualified. An element tag name that is NULL represents a text-only node, which will only be present in mixed content of elements and text character data (as in XHTML markup). XML namespace handling is "smart" in the gSOAP DOM API: the DOM engine matches and stores XML with namespace URIs to ensure that a prefix qualifier is always locally bound to a namespace URI in the node graph. Furthermore, you can use qualified tags when constructing a DOM node instead of the full namespace URI, but only if the prefix and URI are defined in the namespace table (global `struct Namespace namesapces[]`. When working with wsdl2h and soapcpp2 you should include the soapcpp2-generated `.nsmap` file with namespace bindings that are applicable to your XML tags. List of C files {#c-files} --------------- The following files located in the package under `gsoap` are required to use the C DOM API: - `stdsoap2.h`: gSOAP engine - `stdsoap2.c`: gSOAP engine - `dom.c`: DOM parser and DOM C/C++ API implementation - `import/dom.h`: DOM import for data bindings in a .h file for soapcpp2 (do not #include this file in your project builds) Use soapcpp2 `-Iimport` to specify import path when `dom.h` is imported in a header file for soapcpp2. The gSOAP header file `dom.h` declares the DOM for use in data bindings and should generally be imported with `#import` in gSOAP header files for the soapcpp2 tool. You can also run soapcpp2 directly on `import/dom.h` for DOM-only projects. This generates `soapStub.h`, `soapH.h` and `soapC.cpp`. To auto-generate these files, execute: soapcpp2 -c -CSL import/dom.h Then compile and link the `dom.c` files listed above with the auto-generated `soapC.c` and `stdsoap2.c`: cc -I../.. -o myapp myapp.c soapC.c ../../dom.c ../../stdsoap2.c Instead of `stdsoap2.c` you can link `-lgsoap.a` when installed by the gSOAP package. Or link `-lgsoapssl.a` to get both `stdsoap2.c` and `dom.c` with OpenSSL enabled for HTTPS: cc -DWITH_OPENSSL -I../.. -o myapp myapp.c soapC.c -lgsoapssl -lssl -lcrypto Note that we compile with `-DWITH_OPENSSL` and link `-lssl`, and `-lcrypto`. Because XML namespaces are required except for the most simple plain XML applications, you should include the generated `.nsmap` file: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #include "soapH.h" #include "soap.nsmap" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Or define your own namespace table. For example, at a minimum you want a table with SOAP and XSD bindings: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #include "soapH.h" struct Namespace namespaces[] = { {"SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/", "http://www.w3.org/*/soap-envelope", NULL}, {"SOAP-ENC", "http://schemas.xmlsoap.org/soap/encoding/", "http://www.w3.org/*/soap-encoding", NULL}, {"xsi", "http://www.w3.org/2001/XMLSchema-instance", "http://www.w3.org/*/XMLSchema-instance", NULL}, {"xsd", "http://www.w3.org/2001/XMLSchema", "http://www.w3.org/*/XMLSchema", NULL}, {NULL, NULL, NULL, NULL} }; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Then also add entries of the form `{"prefix", "URI"}` before the last NULL entry to complete the table with xmlns prefix and URI bindings for your XML project. C DOM API functions {#c-api} ------------------- This overview of the DOM API functions refers to the following types of parameters and values, which are used throughout this section: | Name | Type and value | | ------ | ----------------------------------------------------------------- | | `ctx` | `struct soap *ctx` context pointer (manages memory and IO) | | `ns` | `const char *ns` XML namespace URI string or NULL | | `tag` | `const char *tag` or `const wchar_t *tag` (un)qualified tag name | | `utag` | `const char *utag` or `const wchar_t *utag` unqualified tag name | | `qtag` | `const char *qtag` or `const wchar_t *qtag` qualified tag name | | `patt` | (wide) string (un)qualified tag name pattern with `*` wildcard(s) | | `text` | (wide) string | | `node` | `const void *node` pointer to serializable C/C++ data object | | `type` | `SOAP_TYPE_T` type identifier of serializable C/C++ data type T | | `att` | `xsd__anyAttribute *att` DOM attribute node pointer | | `elt` | `xsd__anyType *elt` DOM element node pointer | | `dom` | a DOM node (a pointer to an element or an attribute node) | | `val` | bool, integer, float, or (wide) string | | `pos` | element position > 0 (XPath position numbering) | The API includes functions that take wide strings and normalizes these internally to UTF-8 encoded strings. However, when retrieving tags and text you will only be able to obtain UTF-8 strings. You can convert UTF-8 strings to wide strings that are managed by the context by using: - `int soap_s2wchar(struct soap *ctx, const char *s, wchar_t **t, long minlen, long maxlen)` Convert string `s` with UTF-8 content to a `wchar_t` string and set `t` to point to this string. If no length restrictions are enforced, pass -1 for `minlen` and `maxlen`. Returns `SOAP_OK` (zero) if heap allocation succeeded, or an error code. ### Creating a DOM root element node {#c-api1} Creating a DOM node graph starts with creating the root element node using one of the `xsd__anyType` allocators: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} // 4 ways to create a root element node pointer 'dom' xsd__anyType *dom = soap_elt_new(ctx, NULL, utag); // element node xsd__anyType *dom = soap_elt_new(ctx, NULL, qtag); // element node xsd__anyType *dom = soap_elt_new(ctx, ns, utag); // element node xsd__anyType *dom = soap_elt_new(ctx, ns, qtag); // element node ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ For wide string tags, use `soap_elt_new_w(ctx, ns, tag)`. All C API functions that support wide strings end in `_w` by convention. The second function call in the list is convenient to use to construct an element node that is bound to an XML namespace by using a qualified tag name `qtag` while specifying the namespace URI as NULL. To use this approach, you should define the namespace prefix in `qtag` in a global namespace table, see [Understanding XML namespaces](#ns), and as shown below: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} // a global namespace table with {"prefix", "URI"} xmlns bindings struct Namespace namespaces[] = { ... {"q", "urn:example"}, {NULL, NULL, NULL, NULL} }; xsd__anyType *dom = soap_elt_new(ctx, NULL, "q:tag"); // OK: "q" is in the namespace table xsd__anyType *dom = soap_elt_new(ctx, NULL, "bad:tag"); // BAD: "bad" is not in the namespace table xsd__anyType *dom = soap_elt_new(ctx, "urn:ok", "ok:tag"); // OK: "ok" is locally scoped in the DOM ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ You can also use multiple namespace tables and select the one you want to use with the `soap_set_namespaces()` function: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} // a local (static) namespace table with {"prefix", "URI"} xmlns bindings struct Namespace my_dom_namespaces[] = { ... {"q", "urn:example"}, {NULL, NULL, NULL, NULL} }; soap_set_namespaces(ctx, my_dom_namespaces); // use namespace table for qualified tags xsd__anyType *dom = soap_elt_new(ctx, NULL, "q:tag"); // OK: "q" is in the namespace table ... soap_set_namespaces(ctx, namespaces); // restore to global table ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ### Assigning child nodes and values to a DOM node {#c-api2} After creating a root element node we can start populating the root with attributes, child elements, and values. To assign a value to a DOM element node `dom` you can use one the the following functions: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} // 6 ways to assign a value to an element node 'dom' soap_elt_bool(dom, val); // set text to boolean "false" or "true" soap_elt_int(dom, val); // set text to integer (64 bit) soap_elt_double(dom, val); // set text to (double) float soap_elt_text(dom, val); // set text with UTF-8 string content soap_elt_text_w(dom, val); // set text with wide string content soap_elt_copy(dom, elt); // copy element node to element dom node (shallow, shares data) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ You can use similar functions for DOM attribute nodes, altough you do not need these to populate DOM element nodes because it is easier to use the `soap_att()` function shown further below: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} // 6 ways to assign a value to an attribute node 'dom' soap_att_bool(dom, val); // set text to boolean "false" or "true" soap_att_int(dom, val); // set text to integer (64 bit) soap_att_double(dom, val); // set text to (double) float soap_att_text(dom, val); // set text with UTF-8 string content soap_att_text_w(dom, val); // set text with wide string content soap_att_copy(dom, elt); // copy attribute node to attribute dom node (shallow, shares data) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In addition, element nodes can be assigned serializable objects and data as values, meaning that the object and data will be serialized in place of the element content: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} // assign serializable data to an element node 'dom' soap_elt_node(dom, node, type); // assign serializable C data to element node ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ To learn more about embedding serializable objects and data in DOM node graphs, see [Embedding serializable objects and data in DOM element nodes](#intro-3). To add attributes to an element node `dom` you can use one of the following functions (use `soap_att_w` for wide string tags): ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} // 4 ways to add an attribute to an element node 'dom' or extend an attribute list 'dom' xsd__anyAttribute *att = soap_att(dom, NULL, utag); // add attribute utag="val" xsd__anyAttribute *att = soap_att(dom, NULL, qtag); // add attribute q:tag="val" xmlns:q="ns" xsd__anyAttribute *att = soap_att(dom, ns, utag); // add attribute _1:utag="val" xmlns:_1="ns" with temporary _1, _2, _3, ... xsd__anyAttribute *att = soap_att(dom, ns, qtag); // add attribute q:tag="val" xmlns:q="ns" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ You can then set the value of the attribute `att` as was shown earlier. To add child elements to the element node `dom` we use one of the following functions (use `soap_elt_w` for wide string tags): ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} // 5 ways to add a child element to an element node 'dom' xsd__anyType *elt = soap_elt(dom, NULL, NULL); // add text-only child, unnamed (no tags) xsd__anyType *elt = soap_elt(dom, NULL, utag); // add child element xsd__anyType *elt = soap_elt(dom, NULL, qtag); // add child element xsd__anyType *elt = soap_elt(dom, ns, utag); // add child xsd__anyType *elt = soap_elt(dom, ns, qtag); // add child ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given the `elt` pointer to a child element node of the `dom` node, you can use the pointer to build more complex node graphs by assigning attributes, child elements, and values at increasingly deeper levels of the tree. Because element nodes can have multiple children with the same tag name, essentially representing an array, you can index the child elements at their relative position among its siblings that have the same tag name. Position indexing starts at one (i.e. XPath style) and child elements are added up to the highest position index used: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} // add 'array' of three child elements to an element node 'dom' xsd__anyType *elt = soap_elt(dom, NULL, tag); // add child (using one of the functions above) soap_elt_int(soap_nth(elt, 1), val); // assign val to first child element soap_elt_int(soap_nth(elt, 3), val); // add children at positions 2 and 3, assign val to the 3rd ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The combination `soap_nth(soap_elt(dom, ns, tag), pos)` can be shortend to `soap_nth_elt(dom, ns, tag, pos)`. Note that `soap_nth(elt, 1)` refers to `elt` itself, because indexing starts at 1 (as in XPath). You can combine these operations in various ways to create more complex DOM node graphs. Let's illustrate this with an example: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} struct soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT | SOAP_DOM_TREE); xsd__anyType *dom = soap_elt_new(ctx, NULL, "menu"); soap_att_int(soap_att(dom, NULL, "id"), 7); soap_att_text_w(soap_att(dom, NULL, "value"), "⌘F"); { xsd__anyType *dom_popup = soap_elt(dom, NULL, "popup"); { xsd__anyType *dom_popup_menuitem = soap_nth_elt(dom_popup, NULL, "menuitem", 1); soap_att_text(soap_att(dom_popup_menuitem, NULL, "value"), "New"); soap_att_text(soap_att(dom_popup_menuitem, NULL, "onclick"), "CreateNewDoc()"); } { xsd__anyType *dom_popup_menuitem = soap_nth_elt(dom_popup, NULL, "menuitem", 2); soap_att_text(soap_att(dom_popup_menuitem, NULL, "value"), "Open"); soap_att_text(soap_att(dom_popup_menuitem, NULL, "onclick"), "OpenDoc()"); } { xsd__anyType *dom_popup_menuitem = soap_nth_elt(dom_popup, NULL, "menuitem", 3); soap_att_text(soap_att(dom_popup_menuitem, NULL, "value"), "Close"); soap_att_text(soap_att(dom_popup_menuitem, NULL, "onclick"), "CloseDoc()"); } } soap_write_xsd__anyType(ctx, dom); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This code emits the following XML output: The `xsd__anyAttribute` DOM attribute node allocation functions are identical to the `xsd__anyType` DOM element node allocation functions and can be used to create an attribute node or to create a list of attributes. As an alternative to creating attributes and elements in place, you can also construct attribute and element nodes and add them to other element nodes: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} // add an attribute 'att' and an element node 'elt' to another element node 'dom' xsd__anyAttribute *att = soap_att_new(ctx, NULL, "id"); xsd__anyType *elt = soap_elt_new(ctx, NULL, "popup"); soap_att_int(att, 7); soap_add_att(dom, att); soap_add_elt(dom, elt); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ To create a list of two attributes and add them to an element node `dom`: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} // add a list of attributes 'atts' to an element node 'dom' xsd__anyAttribute *atts = soap_att_new(ctx, NULL, NULL); soap_att_int(soap_att_add(atts, NULL, "id"), 7); soap_att_text_w(soap_att_add(atts, NULL, "key"), L"⌘F"); soap_add_atts(dom, atts); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Finally, you can use domcpp to generate DOM construction code from a sample XML document. ### Matching and retrieving DOM node values and properties {#c-api3} Given a DOM node graph parsed from an XML document, we can match its tag names and use functions to retrieve values, attribuets, child elements, and properties. Given a DOM element node `dom`, you can use the following functions to match and retrieve the node's namespace and tag name: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} int b = soap_elt_match(dom, NULL, patt); // true if tag matches pattern int b = soap_elt_match(dom, ns, patt); // true if ns and tag match the patterns const char *s = soap_elt_get_ns(dom)); // namespace URI string or NULL if none const char *t = soap_elt_get_tag(dom); // (un)qualified tag name string, NULL if unnamed ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Similar for attribute node `dom`: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} int b = soap_att_match(dom, NULL, patt); // true if tag matches pattern int b = soap_att_match(dom, ns, patt); // true if ns and tag match the patterns const char *s = soap_att_get_ns(dom)); // namespace URI string or NULL if none const char *t = soap_att_get_tag(dom); // (un)qualified tag name string, NULL if unnamed ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given a DOM element node `dom`, the following functions can be used to retrieve the value of the node's character data content: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} int b = soap_elt_is_true(dom); // true if text is "true" or "1" int b = soap_elt_is_false(dom); // true if text is "false" or "0" LONG64 n = soap_elt_get_int(dom)); // 64 bit integer value of text, or 0 double x = soap_elt_get_double(dom); // double float value of text, or NaN const char *t = soap_elt_get_text(dom)); // text string in UTF-8, or NULL if none ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Similar for attribute node `dom`: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} int b = soap_att_is_true(dom); // true if text is "true" or "1" int b = soap_att_is_false(dom); // true if text is "false" or "0" LONG64 n = soap_att_get_int(dom)); // 64 bit integer value of text, or 0 double x = soap_att_get_double(dom); // double float value of text, or NaN const char *t = soap_att_get_text(dom)); // text string in UTF-8, or NULL if none ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Element nodes may contain deserialized objects and data as values, which can be retrieved with one of two methods: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} T *node = (T*)soap_elt_get_node(dom, SOAP_TYPE_T); // get deserialized C data of type T, NULL if none int type = soap_elt_get_type(dom, &node); // get deserialized C data of any type, 0 if none ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ To learn more about embedding serializable objects and data in DOM node graphs, see [Embedding serializable objects and data in DOM element nodes](#intro-3). Given a DOM element node `dom`, one of the following methods can be used to retrieve an attribute by its unqualfied tag name (has no namespace), by qualified tag name (assuming the prefix is defined in the namespace table), or by namespace and unqualified tag name: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} xsd__anyAttribute *att = soap_att_get(dom, NULL, utag); // get attribute utag, NULL if none xsd__anyAttribute *att = soap_att_get(dom, NULL, qtag); // get attribute q:tag xsd__anyAttribute *att = soap_att_get(dom, ns, utag); // get attribute utag in namespace ns, NULL if none ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The second form is convenient to use to retrieve attributes in namespaces by using a qualified tag name `qtag` without having to specify the `ns` namespace URI parameter. This requires the namespace prefix used in `qtag` to be defined in the global namespace table. Given a DOM element node `dom`, one of the following functions can be used to retrieve a child element by its unqualfied tag name (has no namespace), by qualified tag name (assuming the prefix is defined in the namespace table), or by namespace and unqualified tag name: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} xsd__anyType *elt = soap_elt_get(dom, NULL, NULL); // get first text-only child element, NULL if none xsd__anyType *elt = soap_elt_get(dom, NULL, utag); // get first child element , NULL if none xsd__anyType *elt = soap_elt_get(dom, NULL, qtag); // get first child element , NULL if none xsd__anyType *elt = soap_elt_get(dom, ns, utag); // get first child element , NULL if none elt = soap_elt_get_next(elt); // get next matching child element, NULL if none elt = soap_elt_get_nth(elt, pos); // get matching child element at pos counting from 1, NULL if none ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The `soap_elt_get_next(elt)` function can be used in loops to iterate over child elements with the same namespace and tag, as if traversing an array. For example: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} // iterate over child elements of element node 'dom' xsd__anyType *it; for (it = soap_elt_get(dom, NULL, "menuitem"); it; it = soap_elt_get_next(it)) ... ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ To obtain various properties of a `dom` element node: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} xsd__anyType *elt = soap_elt_parent(dom); // parent node, or NULL when root size_t n = soap_elt_depth(dom); // depth from the root node (0 is root) size_t n = soap_elt_len(dom); // number of siblings that have the same tag name size_t pos = soap_elt_nth(dom); // node is at pos with the same tag name as some siblings, or 0 if alone ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The following invariants hold (assuming that `soap_elt_get(dom, ns, tag)` is not NULL and thus `dom` has a child element that matches namespace ns and tag): ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} soap_elt_match(soap_elt(dom, NULL, tag), NULL, tag) == true (nonzero) soap_elt_parent(soap_elt(dom, NULL, tag)) == dom soap_elt_get_tag(soap_elt(dom, NULL, tag)) == tag soap_elt_match(soap_elt(dom, ns, tag), ns, tag) == true (nonzero) soap_elt_parent(soap_elt(dom, ns, tag)) == dom soap_elt_get_ns(soap_elt(dom, ns, tag)) == ns soap_elt_get_tag(soap_elt(dom, ns, tag)) == tag soap_att_match(soap_att(dom, ns, tag), ns, tag) == true (nonzero) soap_att_get_ns(soap_att(dom, ns, tag)) == ns soap_att_get_tag(soap_att(dom, ns, tag)) == tag soap_elt_get_int(soap_elt_int(dom, val)) == val // also holds for bool, double, string soap_att_get_int(soap_att_int(dom, val)) == val // also holds for bool, double, string soap_elt_parent(soap_elt_get(dom, ns, tag)) == dom soap_elt_depth(soap_elt_get(dom, ns, tag)) == soap_elt_depth(dom) + 1 soap_elt_nth(soap_elt_get(dom, ns, tag)) <= soap_elt_len(soap_elt_get(dom, ns, tag)) soap_elt_nth(soap_elt_get(dom, ns, tag)) == 0 if soap_elt_len(soap_elt_get(dom, ns, tag)) == 1 soap_elt_nth(soap_elt_get(dom, ns, tag)) == 1 if soap_elt_len(soap_elt_get(dom, ns, tag)) > 1 soap_elt_nth(soap_elt_get_next(soap_elt_get(dom, ns, tag))) == 2 soap_elt_nth(soap_elt_get_nth(soap_elt_get(dom, ns, tag), pos)) == pos ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ### Traversing a DOM node graph {#c-api4} Given a DOM node graph `dom`, we can traverse its attribute list `xsd__anyType::atts` and its child elements `xsd__anyType::elts` as follows: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} // print attribute tags xsd__anyAttribute *it; for (it = dom->atts; it; it = it->next) printf("@%s\n", soap_att_get_tag(it)); // print child element tags xsd__anyType *it; for (it = dom->elts; it; it = it->next) printf("<%s>\n", soap_elt_get_tag(it)); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ You can also traverse the entire node graph below a certain DOM element node `dom` in depth-first order starting with the current `dom` and stepping through all element nodes with `soap_dom_next_element(elt, end)` where `end` is a pointer to the ending element node (exclusive), usually the starting node of the graph traversal: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} // print all element tags in depth-first order xsd__anyType *it; for (it = dom; it; it = soap_dom_next_element(it, dom)) printf("<%s> at depth %zd\n", soap_elt_get_tag(it), soap_elt_depth(it)); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ### Searching a DOM node graph {#c-api5} Given a DOM node graph, we can search its attribute list and its child elements by using a pattern with wildcards `*` to match namespace and/or tag names, similar to XPath `*` pattern matching: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} // print attribute tags that match *:id (* matches any namespace, including default) xsd__anyAttribute *it; for (it = soap_att_find(dom, NULL, "*:id"); it; it = soap_att_find_next(it, NULL, "*:id")) printf("@%s\n", soap_att_get_tag(it)); // print element tags in namespace "urn:one" (assuming "x" is "urn:one" in the namespace table) xsd__anyType *it; for (it = soap_elt_find(dom, NULL, "x:*"); it; it = soap_elt_find_next(it, NULL, "x:*")) printf("<%s>\n", soap_elt_get_tag(it)); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The above assumes that a namespace table is used that defines namespace `x`. Alternatively, you can specify namespace parameters that can be NULL or `"*"` to match any namespace URI (NULL can be used in place of a `"*"` pattern): ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} // print attribute tags that match *:id xsd__anyAttribute *it; for (it = soap_att_find(dom, "*", "id"); it; it = soap_att_find_next(it, "*", "id")) printf("@%s\n", soap_att_get_tag(it)); // print element tags in namespace "urn:one" xsd__anyType *it; for (it = soap_elt_find(dom, "urn:one", "*"); it; it = soap_elt_find_next(it, "urn:one", "*")) printf("<%s>\n", soap_elt_get_tag(it)); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Patterns for namespaces and tags are not restricted to wildcards `*`. You can specify parts of a namespace URI or tag name and use one or more `*` to match the rest. You can also search the entire node graph below a certain DOM element node in depth-first order starting with the current node: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} // find all element nodes with attribute "id" deep in the node graph xsd__anyType *it; for (it = soap_dom_find(dom, NULL, "@*:id"); it; it = soap_dom_find_next(it, dom, NULL, "@*:id") printf("element <%s> has an @id=%s\n", soap_elt_get_tag(it), soap_att_get_text(soap_att_find(it, NULL, "*:id"))); // print all element tags in namespace "urn:one" xsd__anyType *it; for (it = soap_dom_find(dom, "urn:one", "*"); it; it = soap_dom_find_next(it, dom, "urn:one", "*")) printf("<%s>\n", soap_elt_get_tag(it)); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ### XML DOM parsing and writing from/to streams {#c-api6} Reading and writing XML from/to files, streams and string buffers is done via the managing context by setting one of the following context members that control IO sources and sinks: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} ctx->recvfd = fd; // an int file descriptor to read from (0 by default) ctx->sendfd = fd; // an int file descriptor to write to (1 by default) ctx->is = cs; // C only: a const char* string to read from (soap->is will advance) ctx->os = &cs; // C only: pointer to a const char*, will be set to point to the string output ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ To parse XML from a file descriptor `ctx->recvfd` into a DOM node graph you can use to soapcpp2 auto-generated `soap_read_xsd__anyType(ctx, dom)` function: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} // create new context and parse XML from 'cin' into 'dom' struct soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT | SOAP_DOM_TREE); xsd__anyType *dom = soap_elt_new(ctx, NULL, NULL); ctx->recvfd = stdin; if (soap_read_xsd__anyType(ctx, dom)) ... // check for IO end parse errors ... soap_end(ctx); soap_free(ctx); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ To write a DOM node graph in XML to a file descriptor `ctx->sendfd` you can use the soapcpp2 auto-generated `soap_write_xsd__anyType(ctx, dom)` function: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} // create new context and create a 'dom', write its XML to 'cout' struct soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT | SOAP_DOM_TREE); xsd__anyType *dom = soap_elt_new(ctx, NULL, "store"); ... ctx->sendfd = stdout; if (soap_write_xsd__anyType(ctx, dom)) ... // check for IO errors ... soap_end(ctx); soap_free(ctx); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ You can also parse XML from a string into a DOM node graph by using the `ctx->is` input string and the soapcpp2 auto-generated `soap_read_xsd__anyType(ctx, dom)` function: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} // create new context and parse XML from a string into 'dom' struct soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT | SOAP_DOM_TREE); const char *in = ""; xsd__anyType *dom = soap_elt_new(ctx, NULL, NULL); ctx->is = in; if (soap_read_xsd__anyType(ctx, dom)) ... // check for IO end parse errors ctx->is = NULL; ... soap_end(ctx); soap_free(ctx); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Likewise, you can write a DOM node graph in XML to a string by using the `ctx->os` output string pointer and the soapcpp2 auto-generated `soap_write_xsd__anyType(ctx, dom)` function: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} // create new context and create a 'dom', write its XML to a string struct soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT | SOAP_DOM_TREE); const char *out = NULL; xsd__anyType *dom = soap_elt_new(ctx, NULL, "store"); ... ctx->os = &out; // string to set to point to the output soap_write_xsd__anyType(ctx, dom); // convert DOM to XML string in UTF-8 ctx->os = NULL; printf("%s\n", out); ... soap_end(ctx); soap_free(ctx); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The `soap_read_xsd__anyType(ctx, dom)` and `soap_write_xsd__anyType(ctx, dom)` functions return `SOAP_OK` (zero) or an error code in `ctx->error`. It is also possible to send and receive XML over HTTP as REST operations as was illustrated in the introduction. To make REST HTTP POST, GET, OUT, and DELETE calls, use: - `int soap_dom_call(struct soap *ctx, const char *URL, const char *action, const xsd__anyType *in, xsd__anyType *out)` Make a POST, GET, PUT, DELETE call. Connect to endpoint `URL` with HTTP SOAPAction `action` (or NULL) and send request `in` to server and receive response `out`. Returns `SOAP_OK` (zero) or an error code. POST method: pass both `in` and `out`. GET method: pass a NULL to `in`. PUT method: pass a NULL to `out`. DELETE method: pass both NULL to `in` and `out`. XML DOM parsing and display options {#opt} =================================== The soap context flags that control XML parsing and visual display are set when the context is created or with the `soap_set_mode` and `soap_clr_mode` functions: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} struct soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_DOM_TREE); soap_set_mode(ctx, SOAP_XML_INDENT); // use indent soap_clr_mode(ctx, SOAP_XML_INDENT); // no indent ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Options to control XML parsing, object serialization, and XML rendition are: - (no flag): only elements with an `id` attribute are deserialized as C/C++ data types when a deserializer is available. This is to ensure that the SOAP encoding protocol deos not break when id-ref attibutes are used for multireferenced objects. - `SOAP_DOM_TREE`: prevents deserialization of C/C++ data structures into the DOM even when an `id` attribute is present. - `SOAP_DOM_NODE`: deserialize C/C++ data structures into the DOM. A deserializer is selected based on matching the element tag name or the xsi:type attribute value with the C/C++ type name. - `SOAP_DOM_ASIS`: render XML "as is", i.e. do not insert xmlns bindings for URIs internally stored with nodes. Assumes that the DOM is self-contained with respect to namespaces. - `SOAP_XML_INDENT`: render XML with indent. - `SOAP_XML_CANONICAL`: render XML in canonical (exc-c14n) form. - `SOAP_C_UTFSTRING`: the XML DOM always uses UTF-8, but embedded serializable objects only use UTF-8 when this flag is also set. Using DOM together with serializeble types in a gSOAP header file {#dom} ================================================================= To use DOM nodes with types declared in a gSOAP header file, import `dom.h` into your header file for processing with soapcpp2: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #import "dom.h" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The import is automatically added by wsdl2h with option `-d`. The wsdl2h tool binds xsd:anyType, xsd:any, xsd:anyAttribute and xsd:mixed XML content to DOM nodes instead of using XML literal strings. The `#import "dom.h"` enables us use the DOM `xsd__anyType` element node and `xsd__anyAttribute` attribute node in a gSOAP header file type declarations, such as: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #import "dom.h" class ns__record { public: @xsd__anyAttribute atts; // list of DOM attributes ... xsd__anyType __any; // xsd:any, consumes all other XML }; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ where `__any` contains XML stored in a DOM node set and `atts` is a list of all visibly rendered attributes. The name `atts` is arbitrary and any name will suffice. We should place the `xsd__anyType` members at the end of the struct or class. This ensures that the DOM members are populated last as a "catch all". A member name starting with double underscore is a wildcard member name and matches any XML tag. These members are placed at the end of a struct or class automatically by soapcpp2. The soapcpp2 tool generates code that "serializes" the DOM nodes as part of the serialization of the C/C++ types in which they are used. @see Documentation of [XML Data Bindings: DOM anyType and anyAttribute](http://www.genivia.com/doc/databinding/html/index.html#toxsd10-5). Example {#example} ======= This example demonstrates the domcpp tool to generate code for a SOAP request message to send to a calculator service and to generate code to obtain the floating point value from the SOAP response returned. The generated code is copied and modified to create a DOM-based SOAP client application in C++ `dom2calc.cpp`. We use a very simple calculator service to demonstrate the C++ DOM API to populate a DOM node graph and to query a DOM node graph. The codes to accomplish both of these tasks can be generated with domcpp and modified as needed for our purposes. The SOAP calculator service and client on which this example is based are located in `gsoap/samples/calc` (for C) and `gsoap/samples/calc++` (for C++) in the gSOAP package. We use the SOAP calculator sample SOAP message `calc.add.req.xml` generated by soapcpp2 in `gsoap/samples/calc++`. This XML message contains a SOAP request to add two floating point values: 0.0 0.0 To generate code that populates this SOAP request message as a DOM node graph, we invoke: domcpp -M -n -rrequest calc.add.req.xml We copied the generated code into `dom2calc.cpp` as shown further below. A sample SOAP response message `calc.add.res.xml` from the calculator service is: 0.0 We want to generate code that inspects the SOAP response message to extract the value of ``. For this purpose we can use the XPath query `/SOAP-ENV:Envelope/SOAP-ENV:Body/ns:addResponse/result` and use this XPath with domcpp option `-p` and option `-x` to generate code that prints the `` value: domcpp -p'/SOAP-ENV:Envelope/SOAP-ENV:Body/ns:addResponse/result' \ -rresponse -x'std::cout << "Result = " << v << std::endl;' We copied the generated code into `dom2calc.cpp` as shown below: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #include "soapH.h" const char server[] = "http://websrv.cs.fsu.edu/~engelen/calcserver.cgi"; // copied from: // domcpp -M -n -rrequest calc.add.req.xml struct Namespace namespaces[] = { {"SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/", "http://www.w3.org/*/soap-envelope", NULL}, {"SOAP-ENC", "http://schemas.xmlsoap.org/soap/encoding/", "http://www.w3.org/*/soap-encoding", NULL}, {"xsi", "http://www.w3.org/2001/XMLSchema-instance", "http://www.w3.org/*/XMLSchema-instance", NULL}, {"xsd", "http://www.w3.org/2001/XMLSchema", "http://www.w3.org/*/XMLSchema", NULL}, {"ns", "urn:calc", NULL, NULL }, {NULL, NULL, NULL, NULL} }; int main(int argc, char **argv) { struct soap *ctx = soap_new1(SOAP_DOM_TREE | SOAP_XML_INDENT); if (argc <= 3) { std::cerr << "Usage: dom2calc [add|sub|mul|div|pow] " << std::endl; exit(1); } // create command tag ns:add, ns:sub, ns:mul, ns:div, or ns:pow std::string command = std::string("ns:").append(argv[1]); // copied and modified from: // domcpp -M -n -rrequest calc.add.req.xml xsd__anyType request(ctx, "SOAP-ENV:Envelope"); request["SOAP-ENV:Body"].att("SOAP-ENV:encodingStyle") = "http://schemas.xmlsoap.org/soap/encoding/"; request["SOAP-ENV:Body"][command.c_str()]["a"] = strtod(argv[2], NULL); request["SOAP-ENV:Body"][command.c_str()]["b"] = strtod(argv[3], NULL); std::cout << "** Request message: " << std::endl << request << std::endl << std::endl; // create response xsd__anyType response(ctx); // invoke server: make POST XML request and receive XML response if (soap_dom_call(ctx, server, "", request, response)) { soap_stream_fault(ctx, std::cerr); } else { std::cout << "** Response message:" << std::endl << response << std::endl << std::endl; // copied from: // domcpp -p'/SOAP-ENV:Envelope/SOAP-ENV:Body/ns:addResponse/result' -rresponse -x'std::cout << "Result = " << v << std::endl;' if (response.match("SOAP-ENV:Envelope")) { size_t pos = 1; for (xsd__anyType *it = response.elt_get("SOAP-ENV:Body"); it; it = it->get_next(), ++pos) { xsd__anyType& v = *it; size_t pos = 1; for (xsd__anyType *it = v.elt_get("ns:addResponse"); it; it = it->get_next(), ++pos) { xsd__anyType& v = *it; size_t pos = 1; for (xsd__anyType *it = v.elt_get("result"); it; it = it->get_next(), ++pos) { xsd__anyType& v = *it; std::cout << "Result = " << v.get_double() << std::endl; } } } } } soap_destroy(ctx); // delete objects soap_end(ctx); // delete temp data soap_free(ctx); // free context return 0; } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ To compile `dom2calc.cpp` we first generate `soapC.cpp`, `soapStub.h` and `soapH.h` from the gSOAP header file `dom.h`: soapcpp2 dom.h c++ -o dom2calc dom2calc.cpp soapC.cpp dom.cpp stdsoap2.cpp Running the DOM-based calculator client gives: ./dom2calc add 3 4 ** Request message: 3 4 ** Response message: 7 Result = 7 Another way to extract the floating point value from the SOAP response is to use the `xsd__anyType::find()` method to search (and iterate) over `` elements: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} for (xsd__anyType::iterator it = response.find("result"); it != response.end(); ++it) std::cout << std::endl << "Result = " << it->get_double() << std::endl; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ where the `xsd__anyType::get_double()` method is used to cast the XML value to a `double`. Miscellaneous {#misc} ============= Floating point format {#fp} --------------------- The floating point format used to output values in XML-RPC and JSON is by default ".17lG' to ensure accuracy up to the last digit. The format can be set as follows: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} struct soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT); ctx->double_format = "%lG"; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ gsoap-2.8.28/gsoap/samples/dom/Makefile.in0000644000175000017500000004644112653650164017706 0ustar ellertellert# Makefile.in generated by automake 1.14 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = domcpp$(EXEEXT) dom2calc$(EXEEXT) DIST_COMMON = $(srcdir)/../Makefile.defines \ $(srcdir)/../Makefile.cpp_rules $(srcdir)/Makefile.in \ $(srcdir)/Makefile.am $(top_srcdir)/mkinstalldirs \ $(top_srcdir)/depcomp subdir = gsoap/samples/dom ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = am__objects_2 = soapC.$(OBJEXT) am_dom2calc_OBJECTS = $(am__objects_1) dom2calc.$(OBJEXT) \ $(am__objects_2) dom2calc_OBJECTS = $(am_dom2calc_OBJECTS) am__DEPENDENCIES_1 = dom2calc_DEPENDENCIES = $(SOAP_CPP_LIB) $(am__DEPENDENCIES_1) am_domcpp_OBJECTS = domcpp.$(OBJEXT) $(am__objects_1) $(am__objects_2) domcpp_OBJECTS = $(am_domcpp_OBJECTS) domcpp_DEPENDENCIES = $(SOAP_CPP_LIB) $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(dom2calc_SOURCES) $(domcpp_SOURCES) DIST_SOURCES = $(dom2calc_SOURCES) $(domcpp_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ STRIP = @STRIP@ VERSION = @VERSION@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 SOAPHEADER = dom2calc.h AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a SOAP_CPP_SRC = $(SOAP_CPP_CLIENT) soapServer.cpp $(SOAP_H_FILES) $(SOAP_NS) LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_CPP_SRC) CLEANFILES = $(SOAP_CPP_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.cpp soap*Proxy.h soap*Proxy.cpp soap*Object.h soap*Service.h soap*Service.cpp soapClient.cpp soapServer.cpp soapClientLib.cpp soapServerLib.cpp *~ SOAP_NS = $(SOAP_NS_DEF) domcpp_SOURCES = domcpp.cpp $(SOAPHEADER) $(SOAP_CPP_CORE) domcpp_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) dom2calc_SOURCES = $(SOAPHEADER) dom2calc.cpp $(SOAP_CPP_CORE) dom2calc_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_rules $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/dom/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/dom/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_rules: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) dom2calc$(EXEEXT): $(dom2calc_OBJECTS) $(dom2calc_DEPENDENCIES) $(EXTRA_dom2calc_DEPENDENCIES) @rm -f dom2calc$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(dom2calc_OBJECTS) $(dom2calc_LDADD) $(LIBS) domcpp$(EXEEXT): $(domcpp_OBJECTS) $(domcpp_DEPENDENCIES) $(EXTRA_domcpp_DEPENDENCIES) @rm -f domcpp$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(domcpp_OBJECTS) $(domcpp_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dom2calc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/domcpp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapC.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am $(SOAP_CPP_SRC) : $(SOAPHEADER) $(SOAP) -L -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $(SOAPHEADER) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.28/gsoap/samples/dom/domcpp.cpp0000644000175000017500000024275312653650154017632 0ustar ellertellert/* domcpp.cpp An XML DOM C/C++ code generator for the gSOAP DOM API. 1. Take an XML sample document and render it in DOM API code to construct this XML as a DOM object: echo '\ \ \ \ \ \ \ ' | ./domcpp #include "soapH.h" { struct soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT | SOAP_DOM_TREE); ctx->double_format = "%lG"; xsd__anyType dom(ctx, "menu"); dom.att("id") = "file"; dom.att("value") = "File"; dom["popup"]["menuitem"][1].att("value") = "New"; dom["popup"]["menuitem"][1].att("onclick") = "CreateNewDoc()"; dom["popup"]["menuitem"][2].att("value") = "Open"; dom["popup"]["menuitem"][2].att("onclick") = "OpenDoc()"; dom["popup"]["menuitem"][3].att("value") = "Close"; dom["popup"]["menuitem"][3].att("onclick") = "CloseDoc()"; std::cout << dom << std::endl; soap_destroy(ctx); // delete objects soap_end(ctx); // delete DOM data soap_free(ctx); // free context } 2. Take a XML sample document and render it in DOM API code to inspect and extract values from XML input, by using the XML sample document as a template: echo '\ { "menu": {\ "id": "file",\ "value": "File",\ "popup": {\ "menuitem": [\ {"value": "New", "onclick": "CreateNewDoc()"},\ {"value": "Open", "onclick": "OpenDoc()"},\ {"value": "Close", "onclick": "CloseDoc()"}\ ]\ }\ }\ }' | ./domcpp -i #include "soapH.h" { struct soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT | SOAP_DOM_TREE); ctx->double_format = "%lG"; xsd__anyType dom(ctx); std::cin >> dom; if (dom.soap->error) exit(EXIT_FAILURE); // error parsing XML xsd__anyAttribute *att; xsd__anyType *elt; #define USE_ATT(path, text) std::cout << path << " = " << text << std::endl #define USE_ELT(path, text) std::cout << path << " = " << text << std::endl if ((att = dom.att_get("id"))) USE_ATT("/menu/@id", att->get_text()); if ((att = dom.att_get("value"))) USE_ATT("/menu/@value", att->get_text()); if ((elt = dom.elt_get("popup"))) { xsd__anyType& dom_popup = *elt; for (xsd__anyType *it = dom_popup.elt_get("menuitem"); it; it = it->get_next()) { xsd__anyType& dom_popup_menuitem = *it; if ((att = dom_popup_menuitem.att_get("value"))) USE_ATT("/menu/popup/menuitem/@value", att->get_text()); if ((att = dom_popup_menuitem.att_get("onclick"))) USE_ATT("/menu/popup/menuitem/@onclick", att->get_text()); } } std::cout << dom << std::endl; soap_destroy(ctx); // delete objects soap_end(ctx); // delete DOM data soap_free(ctx); // free context } 3. Take an XPath to generate a stand-alone application that filters XML documents with a store of books to return their titles: ./domcpp -m -p'/store/book/@title' #include "soapH.h" struct Namespace namespaces[] = {{NULL,NULL,NULL,NULL}}; int main(int argc, char **argv) { struct soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT | SOAP_DOM_TREE); ctx->double_format = "%lG"; xsd__anyType dom(ctx); std::cin >> dom; if (dom.soap->error) exit(EXIT_FAILURE); // error parsing XML // XPath: /store/book/@title xsd__anyAttribute *att; xsd__anyType *elt; #define QUERY_YIELD_ATT(v) std::cout << v.get_text() << std::endl #define QUERY_YIELD_ELT(v) std::cout << v << std::endl if (dom.match("store")) { size_t pos = 1; for (xsd__anyType *it = dom.elt_get("book"); it; it = it->get_next(), ++pos) { xsd__anyType& v = *it; if ((att = v.att_get("title"))) { xsd__anyAttribute& v = *att; QUERY_YIELD_ATT(v); } } } soap_destroy(ctx); // delete objects soap_end(ctx); // delete DOM data soap_free(ctx); // free context return 0; } 4. To build domcpp: cd gsoap/samples/dom soapcpp2 -CSL ../../import/dom.h c++ -I../.. -o domcpp domcpp.cpp soapC.cpp ../../dom.cpp ../../stdsoap2.cpp 5. To compile and link domcpp-generated C++ code: ./domcpp -o mydom.cpp ... soapcpp2 -CSL ../../import/dom.h c++ -I../.. -o mydom mydom.cpp soapC.cpp ../../dom.cpp ../../stdsoap2.cpp 6. To compile and link domcpp-generated C code: ./domcpp -c -o mydom.c ... soapcpp2 -c -CSL ../../import/dom.h cc -I../.. -o mydom mydom.c soapC.c ../../dom.c ../../stdsoap2.c -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2016, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" // generated by soapcpp2 -CSL dom.h #include #include #include #include struct Namespace namespaces[] = {{NULL,NULL,NULL,NULL}}; //////////////////////////////////////////////////////////////////////////////// // // Command line options // //////////////////////////////////////////////////////////////////////////////// static bool coutput = false; // -c generate C code instead of C++ static bool explain = false; // -e add explanatory comments to the generated code static bool genread = false; // -i generate code to inspect DOM node graph parsed from XML input static bool genvars = false; // -l generate code for option -i to store values in local variables static bool genmain = false; // -m generate stand-alone code by adding main() static bool minimal = false; // -M generate minimal code unadorned with initialization and cleanup static bool nstable = false; // -n generate XML namespace table static bool optimal = false; // -O optimize code by factoring common indices when applicable static bool collect = false; // -y generate code that yields an array 'y' of XPath query results static const char *dform = NULL; // -f%fmt use %fmt to format double floats, e.g. -f%lG static const char *ofile = NULL; // -ofile save source code to file static const char *xpath = NULL; // -ppath generate XPath query code for 'path' static const char *xroot = "dom"; // -rroot use 'root' instead of root 'dom' in the generated code static const char *xcode = NULL; // -xcode generate code that executes 'code' for each XPath query result static const char *ifile = NULL; // [infile] //////////////////////////////////////////////////////////////////////////////// // // Proto // //////////////////////////////////////////////////////////////////////////////// static void out_gen_c(soap*, xsd__anyType&, const char*, const std::map&, const std::string&, const std::string&, int); static void in_gen_c(soap*, xsd__anyType&, const std::map&, const std::string&, const std::string&, int); static void out_gen_cpp(soap*, xsd__anyType&, const char*, const std::map&, const std::string&, const std::string&, int); static void in_gen_cpp(soap*, xsd__anyType&, const std::map&, const std::string&, const std::string&, int); static void path_gen_c(soap*, const char*, std::string&, bool, bool, int, size_t, size_t); static void path_exec_c(soap*, std::string&, bool, int); static void path_gen_cpp(soap*, const char*, std::string&, bool, bool, int, size_t, bool); static void path_exec_cpp(soap*, std::string&, bool, int); static std::ostream& indent(soap*, int); static bool is_bool(const char*); static bool is_int(soap*, const char*, LONG64&); static bool is_double(soap*, const char*, double&); static bool need_ns(const char*, const char*, const std::map&, const char*); static bool is_qualified(const char*); static bool is_current(const char*, const char*); static std::string prefix(const char*); static const char *name(const char*); static std::string gen_ident(const std::string&, const char*); static std::string putstrname(const char*); static std::string getname(const char**); static size_t getnth(const char**); //////////////////////////////////////////////////////////////////////////////// // // Pretty printer // //////////////////////////////////////////////////////////////////////////////// struct putstr { const char *str; int quote; putstr(const char *str, int quote = '"') : str(str), quote(quote) { } putstr(const std::string& str, int quote = '"') : str(str.c_str()), quote(quote) { } }; std::ostream& operator<<(std::ostream& os, const putstr& p) { if (p.str) { if (p.quote) os << (char)p.quote; for (const char *s = p.str; *s; ++s) { switch (*s) { case '\t': os << "\\t"; break; case '\n': os << "\\n"; break; case '\r': os << "\\r"; break; default: if (*s > 0 && *s < 0x10) os << "\\x0" << std::hex << *s << std::dec; else if (*s < 0x20 || *s > 0x7f) os << "\\x" << std::hex << (*s & 0xff) << std::dec; else if (coutput && !p.quote && s[0] == '*' && s[1] == '/') os << "\\x2a"; else if (p.quote && s[0] == '?' && s[1] == '?') os << "?\\"; else { if (p.quote && (*s == '"' || *s == '\\')) os << "\\"; os << (char)*s; } } } if (p.quote) os << (char)p.quote; } else os << "NULL"; return os; } //////////////////////////////////////////////////////////////////////////////// // // domcpp main // //////////////////////////////////////////////////////////////////////////////// int main(int argc, char **argv) { if (argc >= 2) { for (int i = 1; i < argc; i++) { const char *a = argv[i]; if ((a[0] == '-' && a[1]) #ifdef WIN32 || a[0] == '/' #endif ) { bool f = true; while (f && *++a) { switch (*a) { case 'c': coutput = true; break; case 'e': explain = true; break; case 'f': a++; f = false; if (*a) dform = a; else if (i < argc) dform = argv[++i]; break; case 'i': genread = true; if (!ifile) ifile = "-"; break; case 'l': genvars = true; break; case 'm': genmain = true; break; case 'M': minimal = true; break; case 'n': nstable = true; break; case 'O': optimal = true; break; case 'o': a++; f = false; if (*a) ofile = a; else if (i < argc) ofile = argv[++i]; break; case 'p': a++; f = false; if (*a) xpath = a; else if (i < argc) xpath = argv[++i]; break; case 'r': a++; f = false; if (*a) xroot = a; else if (i < argc) xroot = argv[++i]; break; case 'x': a++; f = false; if (*a) xcode = a; else if (i < argc) xcode = argv[++i]; break; case 'y': collect = true; break; case '?': case 'h': fprintf(stderr, "Usage: domcpp [-c] [-e] [-f%%fmt] [-h] [-i] [-l] [-m] [-M] [-n] [-O] [-ofile] [-ppath] [-rroot] [-xcode] [-y] [infile]\n\n" "-c generate C code instead of C++\n" "-e add explanatory comments to the generated code\n" "-f%%fmt use %%fmt to format double floats, e.g. -f%%lG\n" "-h display help message\n" "-i generate code to inspect DOM node graph parsed from XML input\n" "-l generate code for option -i to store values in local variables\n" "-m generate stand-alone code by adding main()\n" "-M generate minimal code unadorned with initialization and cleanup\n" "-n generate XML namespace table\n" "-O optimize code by factoring common indices when applicable\n" "-ofile save source code to file\n" "-ppath generate XPath query code for 'path'\n" "-rroot use 'root' instead of root 'x' in the generated code\n" "-xcode generate code that executes 'code' for each XPath query result\n" "-y generate code that yields an array 'y' of XPath query results\n" "infile optional XML file to parse\n" "- read XML from standard input\n\n"); exit(EXIT_SUCCESS); default: fprintf(stderr, "domcpp: Unknown option %s\n\n", a); exit(EXIT_FAILURE); } } } else { if (ifile && strcmp(ifile, "-")) fprintf(stderr, "domcpp: Input already specified as %s, ignoring %s\n\n", ifile, a); else ifile = argv[i]; } } } else { ifile = "-"; } if (genmain) minimal = false; soap *ctx = soap_new1(SOAP_C_UTFSTRING); if (dform && *dform == '%' && *(dform+1)) ctx->double_format = dform; std::ifstream ifs; if (ifile) { if (!strcmp(ifile, "-")) { ctx->is = &std::cin; } else { ifs.open(ifile, std::ifstream::in); if (!ifs.is_open()) { fprintf(stderr, "Cannot open %s for reading\n", ifile); exit(EXIT_FAILURE); } ctx->is = &ifs; } } std::ofstream ofs; if (ofile) { ofs.open(ofile, std::ofstream::out); if (!ofs.is_open()) { fprintf(stderr, "Cannot open %s for writing\n", ofile); exit(EXIT_FAILURE); } ctx->os = &ofs; } else { ctx->os = &std::cout; } xsd__anyType dom(ctx); if (ifile) { if (soap_read_xsd__anyType(ctx, &dom)) { soap_print_fault(ctx, stderr); soap_print_fault_location(ctx, stderr); exit(EXIT_FAILURE); } if (!dom.tag()) { fprintf(stderr, "No root element in %s\n", ifile); exit(EXIT_FAILURE); } } else { nstable = false; } if (ifile && strcmp(ifile, "-")) ifs.close(); if (!minimal) { if (coutput) { *ctx->os << "/* Dependencies:\n" " dom.h stdsoap2.h\n" " dom.c stdsoap2.c\n" " Build:\n" " soapcpp2 -c -CSL dom.h (generates soapStub.h, soapH.h, soapC.c)\n" " cc ... soapC.c dom.c stdsoap2.c ...\n" "*/\n"; } else { *ctx->os << "// Dependencies:\n" "// dom.h stdsoap2.h\n" "// dom.cpp stdsoap2.cpp\n" "// Build:\n" "// soapcpp2 -CSL dom.h (generates soapStub.h, soapH.h, soapC.cpp)\n" "// c++ ... soapC.cpp dom.cpp stdsoap2.cpp ...\n"; } *ctx->os << "\n#include \"soapH.h\"\n"; if (!coutput && xpath && strstr(xpath, "..")) *ctx->os << "#include \n"; } std::map nsmap; if ((nstable || genmain) && explain) { *ctx->os << "/*\n" " Global namespace table with xmlns:prefix=\"URI\" bindings of the form:\n" " { \"prefix\", \"URI\", \"alt-URI\", NULL }\n" "\n" " When using qualified element and attribute tag names with the DOM API\n" " functions without setting the corresponding namespace URI as a function\n" " argument, you MUST include a global namespace table that defines the\n" " namespace prefixes and URIs that are used. This permits the DOM API engine\n" " to locate the URI that corresponds to each prefix in a qualified tag name.\n" "\n" " Use domcpp option -n with an XML file to collect the xmlns bindings from that\n" " file and generate the namespace table automatically.\n"; if (nstable) *ctx->os << "\n" " The first four entries are required in this order for gSOAP client/server\n" " applications. When combining this code with a gSOAP client/server\n" " application then use the soapcpp2-generated .nsmap file with namespace table\n" " for that application and add entries below that are missing from the table.\n"; *ctx->os << "*/\n"; } if (nstable) { for (xsd__anyType::iterator i = dom.begin(); i != dom.end(); ++i) { for (xsd__anyAttribute::iterator j = i->att_begin(); j != i->att_end(); ++j) { if (is_qualified(j->tag()) && strncmp(j->tag(), "SOAP-ENV:", 9) && strncmp(j->tag(), "SOAP-ENC:", 9) && strncmp(j->tag(), "xsi:", 4) && strncmp(j->tag(), "xsd:", 4) && strncmp(j->tag(), "xml", 3)) { std::string id = prefix(j->tag()); nsmap[id] = j->ns(); } } if (is_qualified(i->tag()) && strncmp(i->tag(), "SOAP-ENV:", 9) && strncmp(i->tag(), "SOAP-ENC:", 9) && strncmp(i->tag(), "xsi:", 4) && strncmp(i->tag(), "xsd:", 4) && strncmp(i->tag(), "xml", 3)) { std::string id = prefix(i->tag()); nsmap[id] = i->ns(); } } *ctx->os << "struct Namespace namespaces[] = {\n" " {\"SOAP-ENV\", \"http://schemas.xmlsoap.org/soap/envelope/\", \"http://www.w3.org/*/soap-envelope\", NULL},\n" " {\"SOAP-ENC\", \"http://schemas.xmlsoap.org/soap/encoding/\", \"http://www.w3.org/*/soap-encoding\", NULL},\n" " {\"xsi\", \"http://www.w3.org/2001/XMLSchema-instance\", \"http://www.w3.org/*/XMLSchema-instance\", NULL},\n" " {\"xsd\", \"http://www.w3.org/2001/XMLSchema\", \"http://www.w3.org/*/XMLSchema\", NULL},\n"; for (std::map::const_iterator i = nsmap.begin(); i != nsmap.end(); ++i) *ctx->os << " {\"" << i->first << "\", " << putstr(i->second) << ", NULL, NULL },\n"; *ctx->os << " {NULL, NULL, NULL, NULL}\n};\n\n"; nsmap["SOAP-ENV"] = "http://schemas.xmlsoap.org/soap/envelope/"; nsmap["SOAP-ENC"] = "http://schemas.xmlsoap.org/soap/encoding/"; nsmap["xsi"] = "http://www.w3.org/2001/XMLSchema-instance"; nsmap["xsd"] = "http://www.w3.org/2001/XMLSchema"; } if (genmain) { if (!nstable) *ctx->os << "struct Namespace namespaces[] = {{NULL,NULL,NULL,NULL}};\n\n"; *ctx->os << "int main(int argc, char **argv)\n"; } if (!minimal) { if (coutput) *ctx->os << "{ /* Generated by domcpp"; else *ctx->os << "{ // Generated by domcpp"; for (int i = 1; i < argc; ++i) *ctx->os << " " << putstr(argv[i], 0); if (coutput) *ctx->os << " */\n" " /* domcpp tool Copyright (C) 2000-2016, Robert van Engelen, Genivia Inc. */\n"; else *ctx->os << "\n" " // domcpp tool Copyright (C) 2000-2016, Robert van Engelen, Genivia Inc.\n"; *ctx->os << " struct soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT | SOAP_DOM_TREE);\n" " ctx->double_format = \"" << (dform ? dform : "%lG") << "\";\n\n"; } if (coutput) { if (!genread && explain) { *ctx->os << " /* <" << putstr(dom.tag(), 0); for (xsd__anyAttribute::iterator i = dom.att_begin(); i != dom.att_end(); ++i) *ctx->os << " " << putstr(i->tag(), 0) << "=" << putstr(*i); *ctx->os << "> */\n"; } if (genread || !ifile) *ctx->os << " xsd__anyType *" << xroot << " = soap_elt_new(ctx, NULL, NULL);\n"; else if (need_ns(dom.ns(), dom.tag(), nsmap, NULL)) *ctx->os << " xsd__anyType *" << xroot << " = soap_elt_new(ctx, " << putstr(dom.ns()) << ", " << putstr(dom.tag()) << ");\n"; else *ctx->os << " xsd__anyType *" << xroot << " = soap_elt_new(ctx, NULL, " << putstr(dom.tag()) << ");\n"; std::string path = "/"; path.append(dom.tag()); if (ifile && !genread) { out_gen_c(ctx, dom, NULL, nsmap, xroot, path, 2); if (explain) *ctx->os << " /* */\n"; } else { if (explain) *ctx->os << " /* parse XML into DOM object " << xroot << " */\n"; *ctx->os << " soap_read_xsd__anyType(ctx, " << xroot << ");\n"; if (!minimal) *ctx->os << " if (" << xroot << "->soap->error)\n" " exit(EXIT_FAILURE); /* error parsing XML */\n"; if (ifile) { if (explain) *ctx->os << " /* DOM attribute and element pointers to inspect DOM */\n"; *ctx->os << " xsd__anyAttribute *att;\n" " xsd__anyType *elt;\n"; if (genvars) *ctx->os << " #define USE_ATT(path, var, text) printf(\"%s = %s\\n\", path, text)\n" " #define USE_ELT(path, var, text) printf(\"%s = %s\\n\", path, text)\n"; else *ctx->os << " #define USE_ATT(path, text) printf(\"%s = %s\\n\", path, text)\n" " #define USE_ELT(path, text) printf(\"%s = %s\\n\", path, text)\n"; in_gen_c(ctx, dom, nsmap, xroot, path, 2); } } if (xpath) { *ctx->os << " /* XPath: " << putstr(xpath, 0) << " */\n"; if (!ifile || !genread) { if (explain) *ctx->os << " /* DOM attribute and element pointers to inspect DOM */\n"; *ctx->os << " xsd__anyAttribute *att;\n" " xsd__anyType *elt;\n"; } if (!xcode) { if (collect) { if (explain) *ctx->os << " /* XPath query yields an array 'y' of XPath query results: */\n"; *ctx->os << " xsd__anyType *y = soap_elt_new(ctx, NULL, \"results\");\n" " #define QUERY_YIELD_ATT(v) soap_add_elt(y, soap_add_att(soap_elt_new(ctx, NULL, \"result\"), v));\n" " #define QUERY_YIELD_ELT(v) soap_add_elt(y, soap_add_elt(soap_elt_new(ctx, NULL, \"result\"), v));\n"; } else { if (explain) *ctx->os << " /* XPath query yields are shown for each XPath result: */\n"; *ctx->os << " #define QUERY_YIELD_ATT(v) printf(\"%s\\n\", soap_att_get_text(v))\n" " #define QUERY_YIELD_ELT(v) soap_write_xsd__anyType(ctx, v), putchar('\\n')\n"; } } std::string root(xroot); if (explain) { *ctx->os << " /* Synopsis of variables used:\n" " " << root << "\troot element node pointer\n" << ( collect ? " y\tyield query results\n" : "" ) << " v\tcurrent element or attribute node pointer, to use in [?expr]\n" " att\tattribute node pointer\n" " elt\telement node pointer\n" " pos\tXPath position()\n" " */\n"; } path_gen_c(ctx, xpath, root, true, false, 2, 0, 0); if (!minimal && collect) *ctx->os << " soap_write_xsd__anyType(ctx, y), putchar('\\n');\n"; } else if (!minimal) { if (explain) *ctx->os << " /* output DOM " << xroot << " in XML */\n"; *ctx->os << " soap_write_xsd__anyType(ctx, " << xroot << "), putchar('\\n');\n"; } if (!minimal) { *ctx->os << "\n" " soap_end(ctx); /* delete DOM data */\n" " soap_free(ctx); /* free context */\n" << (genmain ? " return 0;\n" : "") << "}\n"; } } else { if (!genread && explain) { *ctx->os << " // <" << putstr(dom.tag(), 0); for (xsd__anyAttribute::iterator i = dom.att_begin(); i != dom.att_end(); ++i) *ctx->os << " " << putstr(i->tag(), 0) << "=" << putstr(*i); *ctx->os << "> \n"; } if (genread || !ifile) *ctx->os << " xsd__anyType " << xroot << "(ctx);\n"; else if (need_ns(dom.ns(), dom.tag(), nsmap, NULL)) *ctx->os << " xsd__anyType " << xroot << "(ctx, " << putstr(dom.ns()) << ", " << putstr(dom.tag()) << ");\n"; else *ctx->os << " xsd__anyType " << xroot << "(ctx, " << putstr(dom.tag()) << ");\n"; std::string path = "/"; path.append(dom.tag()); if (ifile && !genread) { out_gen_cpp(ctx, dom, NULL, nsmap, xroot, path, 2); if (explain) *ctx->os << " // \n"; } else { if (explain) *ctx->os << " // parse XML into DOM object " << xroot << " \n"; *ctx->os << " std::cin >> " << xroot << ";\n"; if (!minimal) *ctx->os << " if (" << xroot << ".soap->error)\n" " exit(EXIT_FAILURE); // error parsing XML\n"; if (ifile) { if (explain) *ctx->os << " // DOM attribute and element pointers to inspect DOM\n"; *ctx->os << " xsd__anyAttribute *att;\n" " xsd__anyType *elt;\n"; if (genvars) *ctx->os << " #define USE_ATT(path, var, text) std::cout << path << \" = \" << text << std::endl\n" " #define USE_ELT(path, var, text) std::cout << path << \" = \" << text << std::endl\n"; else *ctx->os << " #define USE_ATT(path, text) std::cout << path << \" = \" << text << std::endl\n" " #define USE_ELT(path, text) std::cout << path << \" = \" << text << std::endl\n"; in_gen_cpp(ctx, dom, nsmap, xroot, path, 2); } } if (xpath) { *ctx->os << " // XPath: " << xpath << "\n"; if (!ifile || !genread) { if (explain) *ctx->os << " // DOM attribute and element pointers to inspect DOM\n"; *ctx->os << " xsd__anyAttribute *att;\n" " xsd__anyType *elt;\n"; } if (!xcode) { if (collect) { if (explain) *ctx->os << " // XPath query yields an array 'y' of XPath query results:\n"; *ctx->os << " xsd__anyType y(ctx, \"results\");\n" " #define QUERY_YIELD_ATT(v) y.add(xsd__anyType(ctx, \"result\").add(v));\n" " #define QUERY_YIELD_ELT(v) y.add(xsd__anyType(ctx, \"result\").add(v));\n"; } else { if (explain) *ctx->os << " // XPath query yields are shown for each XPath result:\n"; *ctx->os << " #define QUERY_YIELD_ATT(v) std::cout << v.get_text() << std::endl\n" " #define QUERY_YIELD_ELT(v) std::cout << v << std::endl\n"; } } std::string root(xroot); if (explain) { *ctx->os << " // Synopsis of variables used:\n" " // " << root << "\troot element node\n" << ( collect ? " // y\tyields query results\n" : "" ) << " // v\tcurrent element or attribute node reference, to use in [?expr]\n" " // it\tloop iterator or pointer over elements and attributes\n" " // att\tattribute node pointer\n" " // elt\telement node pointer\n" " // pos\tXPath position()\n"; } path_gen_cpp(ctx, xpath, root, true, false, 2, 0, false); if (!minimal && collect) *ctx->os << " std::cout << y << std::endl;\n"; } else if (!minimal) { if (explain) *ctx->os << " // output DOM " << xroot << " in XML\n"; *ctx->os << " std::cout << " << xroot << " << std::endl;\n"; } if (!minimal) { *ctx->os << "\n" " soap_destroy(ctx); // delete objects\n" " soap_end(ctx); // delete DOM data\n" " soap_free(ctx); // free context\n" << (genmain ? " return 0;\n" : "") << "}\n"; } } if (ofile) ofs.close(); soap_destroy(ctx); soap_end(ctx); soap_free(ctx); return 0; } //////////////////////////////////////////////////////////////////////////////// // // C gen DOM writer/reader from infile // //////////////////////////////////////////////////////////////////////////////// static void out_gen_c(soap *ctx, xsd__anyType& v, const char *current, const std::map& nsmap, const std::string& lhs, const std::string& path, int k) { for (xsd__anyAttribute::iterator i = v.att_begin(); i != v.att_end(); ++i) { if (i->tag()) { if (strncmp(i->tag(), "xmlns", 5)) { if (explain) indent(ctx, k) << "/* " << path << "/@" << putstr(i->tag(), 0) << " = " << putstr(*i, 0) << " */\n"; bool is_b, is_n, is_x; LONG64 n = 0; double x = 0.0; const char *text = *i; if (text) { if ((is_b = is_bool(text))) indent(ctx, k) << "soap_att_bool("; else if ((is_n = is_int(ctx, text, n))) indent(ctx, k) << "soap_att_int("; else if ((is_x = is_double(ctx, text, x))) indent(ctx, k) << "soap_att_double("; else indent(ctx, k) << "soap_att_text("; } else indent(ctx, k); if (need_ns(i->ns(), i->tag(), nsmap, current)) *ctx->os << "soap_att(" << lhs << ", " << putstr(i->ns()) << ", " << putstr(i->tag()) << ")"; else *ctx->os << "soap_att(" << lhs << ", NULL, " << putstr(i->tag()) << ")"; if (text) { *ctx->os << ", "; if (is_b) *ctx->os << (*text == 't'); else if (is_n) *ctx->os << n << "LL"; else if (is_x) *ctx->os << x; else *ctx->os << putstr(text); *ctx->os << ")"; } *ctx->os << ";\n"; } } } for (xsd__anyType::iterator i = v.elt_begin(); i != v.elt_end(); ++i) { size_t attno = 0; for (xsd__anyAttribute::iterator j = i->att_begin(); j != i->att_end(); ++j) if (j->tag() && strncmp(j->tag(), "xmlns", 5)) attno++; if (attno > 0 || i->elt_size() > 0) { if (i->tag() != NULL) { std::string newpath = path; newpath.append("/").append(i->tag()); int nth = i->nth(); if (explain) { indent(ctx, k) << "/* " << newpath << " */\n"; indent(ctx, k) << "/*" << std::setw(2*i->depth()) << "" << std::setw(0) << "<" << putstr(i->tag(), 0); for (xsd__anyAttribute::iterator j = i->att_begin(); j != i->att_end(); ++j) *ctx->os << " " << putstr(j->tag(), 0) << "=" << putstr(*j); if (i->elt_size() > 0 || i->get_text()) *ctx->os << "> */\n"; else *ctx->os << "/> */\n"; } std::string newlhs; if (optimal) { indent(ctx, k) << "{\n"; k += 2; newlhs = gen_ident(lhs, i->tag()); if (nth > 0) { if (need_ns(i->ns(), i->tag(), nsmap, current)) indent(ctx, k) << "xsd__anyType *" << newlhs << " = soap_nth_elt(" << lhs << ", " << putstr(i->ns()) << ", " << putstr(i->tag()) << ", " << nth << ");\n"; else indent(ctx, k) << "xsd__anyType *" << newlhs << " = soap_nth_elt(" << lhs << ", NULL, " << putstr(i->tag()) << ", " << nth << ");\n"; } else { if (need_ns(i->ns(), i->tag(), nsmap, current)) indent(ctx, k) << "xsd__anyType *" << newlhs << " = soap_elt(" << lhs << ", " << putstr(i->ns()) << ", " << putstr(i->tag()) << ");\n"; else indent(ctx, k) << "xsd__anyType *" << newlhs << " = soap_elt(" << lhs << ", NULL, " << putstr(i->tag()) << ");\n"; } } else { if (nth > 0) { newlhs = "soap_nth_elt("; newlhs.append(lhs); if (need_ns(i->ns(), i->tag(), nsmap, current)) newlhs.append(", ").append(putstrname(i->ns())).append(", ").append(putstrname(i->tag())).append(", ").append(soap_int2s(ctx, nth)).append(")"); else newlhs.append(", NULL, ").append(putstrname(i->tag())).append(", ").append(soap_int2s(ctx, nth)).append(")"); } else { newlhs = "soap_elt("; newlhs.append(lhs); if (need_ns(i->ns(), i->tag(), nsmap, current)) newlhs.append(", ").append(putstrname(i->ns())).append(", ").append(putstrname(i->tag())).append(")"); else newlhs.append(", NULL, ").append(putstrname(i->tag())).append(")"); } } if (nth == 0 && i->ns() && !is_qualified(i->tag())) out_gen_c(ctx, *i, i->ns(), nsmap, newlhs, newpath, k); else out_gen_c(ctx, *i, current, nsmap, newlhs, newpath, k); if (optimal) { k -= 2; indent(ctx, k) << "}\n"; } if (explain && (i->elt_size() > 0 || i->get_text())) indent(ctx, k) << "/*" << std::setw(2*i->depth()) << "" << std::setw(0) << "tag(), 0) << "> */\n"; } } else { const char *text = *i; int nth = i->nth(); if (explain) { if (i->tag() == NULL) { if (text && *text) indent(ctx, k) << "/* " << path << " = " << putstr(text, 0) << " */\n"; } else { indent(ctx, k) << "/* " << path << "/" << putstr(i->tag(), 0); if (nth > 0) *ctx->os << "[" << nth << "]"; if (text && *text) *ctx->os << " = " << putstr(text, 0) << "*/\n"; else *ctx->os << "*/\n"; if (i->att_size() > 0) { indent(ctx, k) << "/*" << std::setw(2*i->depth()) << "" << std::setw(0) << "<" << putstr(i->tag(), 0); for (xsd__anyAttribute::iterator j = i->att_begin(); j != i->att_end(); ++j) *ctx->os << " " << putstr(j->tag(), 0) << "=" << putstr(*j); if (text) *ctx->os << ">" << putstr(text, 0) << "tag(), 0) << "> */\n"; else *ctx->os << "/> */\n"; } } } bool is_b, is_n, is_x; LONG64 n = 0; double x = 0.0; if (text) { if ((is_b = is_bool(text))) indent(ctx, k) << "soap_elt_bool("; else if ((is_n = is_int(ctx, text, n))) indent(ctx, k) << "soap_elt_int("; else if ((is_x = is_double(ctx, text, x))) indent(ctx, k) << "soap_elt_double("; else indent(ctx, k) << "soap_elt_text("; } else indent(ctx, k); if (i->tag() == NULL) *ctx->os << "soap_elt(" << lhs << ", NULL, NULL)"; else { if (nth > 0) { if (need_ns(i->ns(), i->tag(), nsmap, current)) *ctx->os << "soap_nth_elt(" << lhs << ", " << putstr(i->ns()) << ", " << putstr(i->tag()) << ", " << nth << ")"; else *ctx->os << "soap_nth_elt(" << lhs << ", NULL, " << putstr(i->tag()) << ", " << nth << ")"; } else { if (need_ns(i->ns(), i->tag(), nsmap, current)) *ctx->os << "soap_elt(" << lhs << ", " << putstr(i->ns()) << ", " << putstr(i->tag()) << ")"; else *ctx->os << "soap_elt(" << lhs << ", NULL, " << putstr(i->tag()) << ")"; } } if (text) { *ctx->os << ", "; if (is_b) *ctx->os << (*text == 't'); else if (is_n) *ctx->os << n << "LL"; else if (is_x) *ctx->os << x; else *ctx->os << putstr(text); *ctx->os << ")"; } *ctx->os << ";\n"; } } const char *text = v; if (text) { if (explain && *text) indent(ctx, k) << "/* " << path << " = " << putstr(text, 0) << " */\n"; LONG64 n; double x; if (is_bool(text)) indent(ctx, k) << "soap_elt_bool(" << lhs << ", " << (*text == 't'); else if (is_int(ctx, text, n)) indent(ctx, k) << "soap_elt_int(" << lhs << ", " << n << "LL"; else if (is_double(ctx, text, x)) indent(ctx, k) << "soap_elt_double(" << lhs << ", " << x; else indent(ctx, k) << "soap_elt_text(" << lhs << ", " << putstr(text); *ctx->os << ");\n"; } } static void in_gen_c(soap *ctx, xsd__anyType& v, const std::map& nsmap, const std::string& lhs, const std::string& path, int k) { for (xsd__anyAttribute::iterator i = v.att_begin(); i != v.att_end(); ++i) { if (i->tag()) { if (strncmp(i->tag(), "xmlns", 5)) { if (explain) indent(ctx, k) << "/* " << path << "/@" << putstr(i->tag(), 0) << " = " << putstr(*i, 0) << " */\n"; if (genvars) { bool is_b = false; bool is_n = false; bool is_x = false; std::string newlhs = gen_ident(lhs, i->tag()); indent(ctx, k) << "{\n"; const char *text = *i; if (text && *text) { LONG64 n; double x; if ((is_b = is_bool(text))) indent(ctx, k + 2) << "short " << newlhs << "_att = " << (*text == 't') << "; /* a default bool value */\n"; else if ((is_n = is_int(ctx, text, n))) indent(ctx, k + 2) << "LONG64 " << newlhs << "_att = " << n << "LL; /* a default int value */\n"; else if ((is_x = is_double(ctx, text, x))) indent(ctx, k + 2) << "double " << newlhs << "_att = " << x << "; /* a default float value */\n"; else indent(ctx, k + 2) << "const char *" << newlhs << "_att = " << putstr(text) << "; /* a default string value */\n"; } else { indent(ctx, k + 2) << "const char *" << newlhs << "_att = NULL;\n"; } if (need_ns(i->ns(), i->tag(), nsmap, NULL)) indent(ctx, k + 2) << "if ((att = soap_att_get(" << lhs << ", " << putstr(i->ns()) << ", " << putstr(name(i->tag())) << ")))\n"; else indent(ctx, k + 2) << "if ((att = soap_att_get(" << lhs << ", NULL, " << putstr(i->tag()) << ")))\n"; if (is_b) indent(ctx, k + 4) << "USE_ATT(\"" << path << "/@" << putstr(i->tag(), 0) << "\", " << newlhs << "_att = soap_att_is_true(att), soap_att_get_text(att));\n"; else if (is_n) indent(ctx, k + 4) << "USE_ATT(\"" << path << "/@" << putstr(i->tag(), 0) << "\", " << newlhs << "_att = soap_att_get_LONG64(att), soap_att_get_text(att));\n"; else if (is_x) indent(ctx, k + 4) << "USE_ATT(\"" << path << "/@" << putstr(i->tag(), 0) << "\", " << newlhs << "_att = soap_att_get_double(att), soap_att_get_text(att));\n"; else indent(ctx, k + 4) << "USE_ATT(\"" << path << "/@" << putstr(i->tag(), 0) << "\", " << newlhs << "_att = soap_att_get_text(att), soap_att_get_text(att));\n"; indent(ctx, k + 2) << "(void)" << newlhs << "_att;\n"; indent(ctx, k) << "}\n"; } else { if (need_ns(i->ns(), i->tag(), nsmap, NULL)) indent(ctx, k) << "if ((att = soap_att_get(" << lhs << ", " << putstr(i->ns()) << ", " << putstr(name(i->tag())) << ")))\n"; else indent(ctx, k) << "if ((att = soap_att_get(" << lhs << ", NULL, " << putstr(i->tag()) << ")))\n"; indent(ctx, k + 2) << "USE_ATT(\"" << path << "/@" << putstr(i->tag(), 0) << "\", soap_att_get_text(att));\n"; } } } } for (xsd__anyType::iterator i = v.elt_begin(); i != v.elt_end(); ++i) { if (i->tag()) { bool is_done = true; bool is_repeat = false; for (xsd__anyType::iterator j = v.elt_begin(); j != v.elt_end(); ++j) { if (j->tag() && !strcmp(i->tag(), j->tag())) { if (i == j) is_done = false; else { if (!is_done) is_repeat = true; break; } } } if (!is_done) { std::string newpath = path; newpath.append("/").append(i->tag()); if (explain) { if (is_repeat) indent(ctx, k) << "/* a repetition of elements " << newpath << " */\n"; else indent(ctx, k) << "/* " << newpath << " */\n"; } std::string newlhs = gen_ident(lhs, i->tag()); if (is_repeat) { indent(ctx, k) << "xsd__anyType *" << newlhs << ";\n"; if (need_ns(i->ns(), i->tag(), nsmap, NULL)) indent(ctx, k) << "for (" << newlhs << " = soap_elt_get(" << lhs << ", " << putstr(i->ns()) << ", " << putstr(name(i->tag())) << "); " << newlhs << "; " << newlhs << " = soap_elt_get_next(" << newlhs << "))\n"; else indent(ctx, k) << "for (" << newlhs << " = soap_elt_get(" << lhs << ", NULL, " << putstr(i->tag()) << "); " << newlhs << "; " << newlhs << " = soap_elt_get_next(" << newlhs << "))\n"; } else { if (need_ns(i->ns(), i->tag(), nsmap, NULL)) indent(ctx, k) << "if ((elt = soap_elt_get(" << lhs << ", " << putstr(i->ns()) << ", " << putstr(name(i->tag())) << ")))\n"; else indent(ctx, k) << "if ((elt = soap_elt_get(" << lhs << ", NULL, " << putstr(i->tag()) << ")))\n"; } indent(ctx, k) << "{\n"; if (!is_repeat) indent(ctx, k + 2) << "xsd__anyType *" << newlhs << " = elt;\n"; in_gen_c(ctx, *i, nsmap, newlhs, newpath, k + 2); indent(ctx, k) << "}\n"; } } } const char *text = v; if (text) { if (explain && *text) indent(ctx, k) << "/* " << path << " = " << putstr(text, 0) << " */\n"; if (genvars) { bool is_b = false; bool is_n = false; bool is_x = false; indent(ctx, k) << "{\n"; if (*text) { LONG64 n; double x; if ((is_b = is_bool(text))) indent(ctx, k + 2) << "short " << lhs << "_elt = " << (*text == 't') << "; /* a default bool value */\n"; else if ((is_n = is_int(ctx, text, n))) indent(ctx, k + 2) << "LONG64 " << lhs << "_elt = " << n << "LL; /* a default int value */\n"; else if ((is_x = is_double(ctx, text, x))) indent(ctx, k + 2) << "double " << lhs << "_elt = " << x << "; /* a default float value */\n"; else indent(ctx, k + 2) << "const char *" << lhs << "_elt = " << putstr(text) << "; /* a default string value */\n"; } else { indent(ctx, k + 2) << "const char *" << lhs << "_elt = NULL;\n"; } indent(ctx, k + 2) << "if (soap_elt_get_text(" << lhs << "))\n"; if (is_b) indent(ctx, k + 4) << "USE_ELT(\"" << path << "\", " << lhs << "_elt = soap_elt_is_true(" << lhs << "), soap_elt_get_text(" << lhs << "));\n"; else if (is_n) indent(ctx, k + 4) << "USE_ELT(\"" << path << "\", " << lhs << "_elt = soap_elt_get_LONG64(" << lhs << "), soap_elt_get_text(" << lhs << "));\n"; else if (is_x) indent(ctx, k + 4) << "USE_ELT(\"" << path << "\", " << lhs << "_elt = soap_elt_get_double(" << lhs << "), soap_elt_get_text(" << lhs << "));\n"; else indent(ctx, k + 4) << "USE_ELT(\"" << path << "\", " << lhs << "_elt = soap_elt_get_text(" << lhs << "), soap_elt_get_text(" << lhs << "));\n"; indent(ctx, k + 2) << "(void)" << lhs << "_elt;\n"; indent(ctx, k) << "}\n"; } else { indent(ctx, k) << "if (soap_elt_get_text(" << lhs << "))\n"; indent(ctx, k + 2) << "USE_ELT(\"" << path << "\", soap_elt_get_text(" << lhs << "));\n"; } } } //////////////////////////////////////////////////////////////////////////////// // // C++ gen DOM writer/reader from infile // //////////////////////////////////////////////////////////////////////////////// static void out_gen_cpp(soap *ctx, xsd__anyType& v, const char *current, const std::map& nsmap, const std::string& lhs, const std::string& path, int k) { for (xsd__anyAttribute::iterator i = v.att_begin(); i != v.att_end(); ++i) { if (i->tag()) { if (strncmp(i->tag(), "xmlns", 5)) { if (explain) indent(ctx, k) << "// " << path << "/@" << putstr(i->tag(), 0) << " = " << putstr(*i, 0) << "\n"; if (need_ns(i->ns(), i->tag(), nsmap, current)) indent(ctx, k) << lhs << ".att(" << putstr(i->ns()) << ", " << putstr(i->tag()) << ")"; else indent(ctx, k) << lhs << ".att(" << putstr(i->tag()) << ")"; const char *text = *i; if (text) { *ctx->os << " = "; LONG64 n; double x; if (is_bool(text)) *ctx->os << text; else if (is_int(ctx, text, n)) *ctx->os << n << "LL"; else if (is_double(ctx, text, x)) *ctx->os << x; else *ctx->os << putstr(text); } *ctx->os << ";\n"; } } } for (xsd__anyType::iterator i = v.elt_begin(); i != v.elt_end(); ++i) { size_t attno = 0; for (xsd__anyAttribute::iterator j = i->att_begin(); j != i->att_end(); ++j) if (j->tag() && strncmp(j->tag(), "xmlns", 5)) attno++; if (attno > 0 || i->elt_size() > 0) { if (i->tag()) { std::string newpath = path; newpath.append("/").append(i->tag()); int nth = i->nth(); if (nth > 0) newpath.append("[").append(soap_int2s(ctx, nth)).append("]"); if (explain) { indent(ctx, k) << "// " << newpath << "\n"; indent(ctx, k) << "//" << std::setw(2*i->depth()) << "" << std::setw(0) << "<" << putstr(i->tag(), 0); for (xsd__anyAttribute::iterator j = i->att_begin(); j != i->att_end(); ++j) *ctx->os << " " << putstr(j->tag(), 0) << "=" << putstr(*j); if (i->elt_size() > 0 || i->get_text()) *ctx->os << ">\n"; else *ctx->os << "/>\n"; } std::string newlhs; if (optimal) { indent(ctx, k) << "{\n"; k += 2; newlhs = gen_ident(lhs, i->tag()); if (need_ns(i->ns(), i->tag(), nsmap, current)) indent(ctx, k) << "xsd__anyType& " << newlhs << " = " << lhs << ".elt(" << putstr(i->ns()) << ", " << putstr(i->tag()) << ")"; else indent(ctx, k) << "xsd__anyType& " << newlhs << " = " << lhs << "[" << putstr(i->tag()) << "]"; if (nth > 0) *ctx->os << "[" << nth << "]"; *ctx->os << ";\n"; } else { newlhs = lhs; if (need_ns(i->ns(), i->tag(), nsmap, current)) newlhs.append(".elt(").append(putstrname(i->ns())).append(", ").append(putstrname(i->tag())).append(")"); else newlhs.append("[").append(putstrname(i->tag())).append("]"); if (nth > 0) newlhs.append("[").append(soap_int2s(ctx, nth)).append("]"); } if (nth == 0 && i->ns() && !is_qualified(i->tag())) out_gen_cpp(ctx, *i, i->ns(), nsmap, newlhs, newpath, k); else out_gen_cpp(ctx, *i, current, nsmap, newlhs, newpath, k); if (optimal) { k -= 2; indent(ctx, k) << "}\n"; } if (explain && (i->elt_size() > 0 || i->get_text())) indent(ctx, k) << "//" << std::setw(2*i->depth()) << "" << std::setw(0) << "tag(), 0) << ">\n"; } } else { const char *text = *i; int nth = i->nth(); if (explain) { if (i->tag() == NULL) { if (text && *text) indent(ctx, k) << "// " << path << " = " << putstr(text, 0) << "\n"; } else { indent(ctx, k) << "// " << path << "/" << putstr(i->tag(), 0); if (nth > 0) *ctx->os << "[" << nth << "]"; if (text && *text) *ctx->os << " = " << putstr(text, 0) << "\n"; else *ctx->os << "\n"; if (i->att_size() > 0) { indent(ctx, k) << "//" << std::setw(2*i->depth()) << "" << std::setw(0) << "<" << putstr(i->tag(), 0); for (xsd__anyAttribute::iterator j = i->att_begin(); j != i->att_end(); ++j) *ctx->os << " " << putstr(j->tag(), 0) << "=" << putstr(*j); if (text) *ctx->os << ">" << putstr(text, 0) << "tag(), 0) << ">\n"; else *ctx->os << "/>\n"; } } } if (i->tag() == NULL) indent(ctx, k) << lhs << ".elt()"; else { if (need_ns(i->ns(), i->tag(), nsmap, current)) indent(ctx, k) << lhs << ".elt(" << putstr(i->ns()) << ", " << putstr(i->tag()) << ")"; else indent(ctx, k) << lhs << "[" << putstr(i->tag()) << "]"; if (nth > 0) *ctx->os << "[" << nth << "]"; } if (text) { *ctx->os << " = "; LONG64 n; double x; if (is_bool(text)) *ctx->os << text; else if (is_int(ctx, text, n)) *ctx->os << n << "LL"; else if (is_double(ctx, text, x)) *ctx->os << x; else *ctx->os << putstr(text); } *ctx->os << ";\n"; } } const char *text = v; if (text) { if (explain && *text) indent(ctx, k) << "// " << path << " = " << putstr(text, 0) << "\n"; indent(ctx, k) << lhs << " = "; LONG64 n; double x; if (is_bool(text)) *ctx->os << text; else if (is_int(ctx, text, n)) *ctx->os << n << "LL"; else if (is_double(ctx, text, x)) *ctx->os << x; else *ctx->os << putstr(text); *ctx->os << ";\n"; } } static void in_gen_cpp(soap *ctx, xsd__anyType& v, const std::map& nsmap, const std::string& lhs, const std::string& path, int k) { for (xsd__anyAttribute::iterator i = v.att_begin(); i != v.att_end(); ++i) { if (i->tag()) { if (strncmp(i->tag(), "xmlns", 5)) { if (explain) indent(ctx, k) << "// " << path << "/@" << putstr(i->tag(), 0) << " = " << putstr(*i, 0) << "\n"; if (genvars) { std::string newlhs = gen_ident(lhs, i->tag()); const char *text = *i; if (text && *text) { LONG64 n; double x; if (is_bool(text)) indent(ctx, k) << "bool " << newlhs << "_att = " << text << "; // a default bool value\n"; else if (is_int(ctx, text, n)) indent(ctx, k) << "LONG64 " << newlhs << "_att = " << n << "LL; // a default int value\n"; else if (is_double(ctx, text, x)) indent(ctx, k) << "double " << newlhs << "_att = " << x << "; // a default float value\n"; else indent(ctx, k) << "const char *" << newlhs << "_att = " << putstr(text) << "; // a default string value\n"; } else { indent(ctx, k) << "const char *" << newlhs << "_att = NULL;\n"; } if (need_ns(i->ns(), i->tag(), nsmap, NULL)) indent(ctx, k) << "if ((att = " << lhs << ".att_get(" << putstr(i->ns()) << ", " << putstr(name(i->tag())) << ")))\n"; else indent(ctx, k) << "if ((att = " << lhs << ".att_get(" << putstr(i->tag()) << ")))\n"; indent(ctx, k + 2) << "USE_ATT(\"" << path << "/@" << putstr(i->tag(), 0) << "\", " << newlhs << "_att = *att, att->get_text());\n"; indent(ctx, k) << "(void)" << newlhs << "_att;\n"; } else { if (need_ns(i->ns(), i->tag(), nsmap, NULL)) indent(ctx, k) << "if ((att = " << lhs << ".att_get(" << putstr(i->ns()) << ", " << putstr(name(i->tag())) << ")))\n"; else indent(ctx, k) << "if ((att = " << lhs << ".att_get(" << putstr(i->tag()) << ")))\n"; indent(ctx, k + 2) << "USE_ATT(\"" << path << "/@" << putstr(i->tag(), 0) << "\", att->get_text());\n"; } } } } for (xsd__anyType::iterator i = v.elt_begin(); i != v.elt_end(); ++i) { if (i->tag()) { bool is_done = true; bool is_repeat = false; for (xsd__anyType::iterator j = v.elt_begin(); j != v.elt_end(); ++j) { if (j->tag() && !strcmp(i->tag(), j->tag())) { if (i == j) is_done = false; else { if (!is_done) is_repeat = true; break; } } } if (!is_done) { std::string newpath = path; newpath.append("/").append(i->tag()); if (explain) { if (is_repeat) indent(ctx, k) << "// a repetition of elements " << newpath << "\n"; else indent(ctx, k) << "// " << newpath << "\n"; } std::string newlhs = gen_ident(lhs, i->tag()); if (is_repeat) { if (need_ns(i->ns(), i->tag(), nsmap, NULL)) indent(ctx, k) << "for (xsd__anyType *it = " << lhs << ".elt_get(" << putstr(i->ns()) << ", " << putstr(name(i->tag())) << "); it; it = it->get_next())\n"; else indent(ctx, k) << "for (xsd__anyType *it = " << lhs << ".elt_get(" << putstr(i->tag()) << "); it; it = it->get_next())\n"; } else { if (need_ns(i->ns(), i->tag(), nsmap, NULL)) indent(ctx, k) << "if ((elt = " << lhs << ".elt_get(" << putstr(i->ns()) << ", " << putstr(name(i->tag())) << ")))\n"; else indent(ctx, k) << "if ((elt = " << lhs << ".elt_get(" << putstr(i->tag()) << ")))\n"; } indent(ctx, k) << "{\n"; if (is_repeat) indent(ctx, k + 2) << "xsd__anyType& " << newlhs << " = *it;\n"; else indent(ctx, k + 2) << "xsd__anyType& " << newlhs << " = *elt;\n"; in_gen_cpp(ctx, *i, nsmap, newlhs, newpath, k + 2); indent(ctx, k) << "}\n"; } } } const char *text = v; if (text) { if (explain && *text) indent(ctx, k) << "// " << path << " = " << putstr(text, 0) << "\n"; if (genvars) { if (*text) { LONG64 n; double x; if (is_bool(text)) indent(ctx, k) << "bool " << lhs << "_elt = " << text << "; // a default bool value\n"; else if (is_int(ctx, text, n)) indent(ctx, k) << "LONG64 " << lhs << "_elt = " << n << "LL; // a default int value\n"; else if (is_double(ctx, text, x)) indent(ctx, k) << "double " << lhs << "_elt = " << x << "; // a default float value\n"; else indent(ctx, k) << "const char *" << lhs << "_elt = " << putstr(text) << "; // a default string value\n"; } else { indent(ctx, k) << "const char *" << lhs << "_elt = NULL;\n"; } indent(ctx, k) << "if (" << lhs << ".get_text())\n"; indent(ctx, k + 2) << "USE_ELT(\"" << path << "\", " << lhs << "_elt = " << lhs << ", " << lhs << ".get_text());\n"; indent(ctx, k) << "(void)" << lhs << "_elt;\n"; } else { indent(ctx, k) << "if (" << lhs << ".get_text())\n"; indent(ctx, k + 2) << "USE_ELT(\"" << path << "\", " << lhs << ".get_text());\n"; } } } //////////////////////////////////////////////////////////////////////////////// // // C gen XPath from -ppath // //////////////////////////////////////////////////////////////////////////////// static void path_gen_c(struct soap *ctx, const char *xpath, std::string& v, bool atroot, bool attrib, int k, size_t parens, size_t label) { if (*xpath == ')') // path: ...)... { if (parens == 0) { fprintf(stderr, "domcpp: XPath ')' without '(' ...->%s\n\n", xpath); exit(EXIT_FAILURE); } ++xpath; --parens; indent(ctx, k) << "size_t pos = ++pos" << parens << ";\n"; } if (*xpath == '/' && *(xpath + 1) != '/') // skip single / { if (attrib) { fprintf(stderr, "domcpp: XPath / follows attribute at ...->%s\n\n", xpath); exit(EXIT_FAILURE); } ++xpath; } if (*xpath == '(') // path: (... { ++xpath; indent(ctx, k) << "size_t pos" << parens << " = 0;\n"; ++parens; } if (*xpath == '.') { ++xpath; if (*xpath == '.') { if (atroot) { fprintf(stderr, "domcpp: XPath .. at root ...->%s\n\n", xpath); exit(EXIT_FAILURE); } indent(ctx, k) << "if ((elt = soap_elt_parent(" << v << ")))\n"; indent(ctx, k) << "{\n"; indent(ctx, k + 2) << "xsd__anyType *v = elt\n"; v = "v"; path_gen_c(ctx, xpath, v, false, attrib, k + 2, parens, label); indent(ctx, k) << "}\n"; } else { path_gen_c(ctx, xpath, v, false, attrib, k, parens, label); } } else if (*xpath == '/') // path: //... { ++xpath; if (*xpath == '/') { if (attrib) { fprintf(stderr, "domcpp: XPath // follows attribute at ...->%s\n\n", xpath); exit(EXIT_FAILURE); } ++xpath; if (explain) { if (atroot) indent(ctx, k) << "/* iterate over descendants and current node " << v << " to match " << putstr(xpath, 0) << " */\n"; else indent(ctx, k) << "/* iterate over descendants of current node " << v << " to match " << putstr(xpath, 0) << " */\n"; } indent(ctx, k) << "xsd__anyType *it;\n"; indent(ctx, k) << "for (it = " << v << "; it; it = soap_dom_next_element(it, " << v << "))\n"; indent(ctx, k) << "{\n"; indent(ctx, k + 2) << "xsd__anyType *v = it;\n"; v = "v"; path_gen_c(ctx, xpath, v, atroot, false, k + 2, parens, label); indent(ctx, k) << "}\n"; } else { fprintf(stderr, "domcpp: XPath unexpected end at '/'\n\n"); exit(EXIT_FAILURE); } } else if (*xpath == '[') // path: [...]... { size_t nth = getnth(&xpath); if (nth) // path: [n]... where n is an integer > 0 position { if (explain) indent(ctx, k) << "/* if position of current node " << v << " is " << nth << " then match " << putstr(xpath, 0) << " */\n"; indent(ctx, k) << "if (pos == " << nth << ")\n"; indent(ctx, k) << "{\n"; path_gen_c(ctx, xpath, v, false, attrib, k + 2, parens, label); indent(ctx, k) << "}\n"; } else { ++xpath; int nest = 0; const char *s; for (s = xpath; *s; ++s) { if (*s == ']') { if (nest == 0) break; --nest; } else if (*s == '[') ++nest; } if (*s != ']') { fprintf(stderr, "domcpp: XPath ']' expected at ...->%s\n\n", xpath); exit(EXIT_FAILURE); } if (*xpath == '?') // path: [?e]... where e is a C boolean (nonzero is true) expression { std::string code(xpath + 1, s - xpath - 1); xpath = s + 1; if (explain) indent(ctx, k) << "/* filter current node " << v << " with 'if (" << code << ")' to match " << putstr(xpath, 0) << " */\n"; if (v != "v") { if (attrib) indent(ctx, k) << "xsd__anyAttribute *v = " << v << ";\n"; else indent(ctx, k) << "xsd__anyType *v = " << v << ";\n"; } indent(ctx, k) << "if (" << code << ")\n"; indent(ctx, k) << "{\n"; path_gen_c(ctx, xpath, v, atroot, attrib, k + 2, parens, label); indent(ctx, k) << "}\n"; } else // path: [p]... where p is an XPath to match to continue { if (explain) indent(ctx, k) << "/* check current node " << v << " matches " << putstr(xpath, 0) << " */\n"; std::string u = v; static size_t state = 0; size_t found = ++state; if (*xpath == '/' && *(xpath + 1) != '/') { v = "dom"; path_gen_c(ctx, xpath, v, true, attrib, k, 0, found); } else { path_gen_c(ctx, xpath, v, atroot, attrib, k, 0, found); } indent(ctx, k) << "if (0)\n"; indent(ctx, 2) << "found" << found << ":\n"; indent(ctx, k) << "{\n"; xpath = s + 1; path_gen_c(ctx, xpath, u, atroot, attrib, k + 2, parens, label); indent(ctx, k) << "}\n"; } } } else if (*xpath == ']') { if (!label) { fprintf(stderr, "domcpp: XPath ']' without '[' ...->%s\n\n", xpath); exit(EXIT_FAILURE); } indent(ctx, k) << "(void)" << v << ";\n"; indent(ctx, k) << "goto found" << label << ";\n"; } else if (!*xpath) { if (parens) { fprintf(stderr, "domcpp: XPath ')' expected ...->%s\n\n", xpath); exit(EXIT_FAILURE); } path_exec_c(ctx, v, attrib, k); } else if (!strncmp(xpath, "text()", 6)) // path: text() { xpath += 6; size_t nth = getnth(&xpath); if (nth == 1) { if (explain) indent(ctx, k) << "/* if current node " << v << " has a text-only element then match " << putstr(xpath, 0) << " */\n"; indent(ctx, k) << "if ((elt = soap_elt_get(" << v << ", NULL, \"\")))\n"; } else if (nth > 1) { if (explain) indent(ctx, k) << "/* if current node " << v << " has a " << nth << "-th text-only element then match " << putstr(xpath, 0) << " */\n"; indent(ctx, k) << "if ((elt = soap_elt_get(" << v << ", NULL, \"\")) && (elt = soap_elt_get_nth(elt, " << nth << ")))\n"; } else { if (explain) indent(ctx, k) << "/* for each text-only element of current node " << v << " match " << putstr(xpath, 0) << " */\n"; indent(ctx, k) << "size_t pos = 1;\n"; indent(ctx, k) << "xsd__anyType *it;\n"; indent(ctx, k) << "for (it = soap_elt_get(" << v << ", NULL, \"\"); it; it = soap_elt_get_next(it), ++pos)\n"; } indent(ctx, k) << "{\n"; if (nth) indent(ctx, k + 2) << "xsd__anyType *v = elt;\n"; else indent(ctx, k + 2) << "xsd__anyType *v = it;\n"; v = "v"; path_gen_c(ctx, xpath, v, false, false, k + 2, parens, label); indent(ctx, k) << "}\n"; } else if (atroot && *xpath != '@') // path: /name... { const char *tag = getname(&xpath).c_str(); if (explain) indent(ctx, k) << "/* if node " << v << " is '" << tag << "' then match " << putstr(xpath, 0) << " */\n"; indent(ctx, k) << "if (soap_elt_match(" << v << ", NULL, " << putstr(tag) << "))\n"; indent(ctx, k) << "{\n"; path_gen_c(ctx, xpath, v, false, false, k + 2, parens, label); indent(ctx, k) << "}\n"; } else // path: name..., name[n]..., @name, *..., *:*..., @*..., @*:*... { const char *tag = getname(&xpath).c_str(); size_t nth = 0; bool is_att = (*tag == '@'); bool is_patt = strchr(tag, '*') != NULL; bool is_wild = !strcmp(tag + is_att, "*") || !strcmp(tag + is_att, "*:*"); if (!is_patt) nth = getnth(&xpath); if (is_att && is_wild) { if (explain) indent(ctx, k) << "/* for each attribute of current node " << v << " match " << putstr(xpath, 0) << " */\n"; indent(ctx, k) << "xsd__anyAttribute *it;\n"; indent(ctx, k) << "for (it = soap_att_first(" << v << "); it; it = soap_att_next(it))\n"; } else if (is_att && is_patt) { if (explain) indent(ctx, k) << "/* for each attribute '" << tag + 1 << "' of current node " << v << " match " << putstr(xpath, 0) << " */\n"; indent(ctx, k) << "xsd__anyAttribute *it;\n"; indent(ctx, k) << "for (it = soap_att_find(" << v << ", NULL, " << putstr(tag) << "); it; it = soap_att_find_next(it, NULL, " << putstr(tag) << "))\n"; } else if (is_att) { if (explain) indent(ctx, k) << "/* if current node " << v << " has an attribute '" << tag + 1 << "' then match " << putstr(xpath, 0) << " */\n"; indent(ctx, k) << "if ((att = soap_att_get(" << v << ", NULL, " << putstr(tag + 1) << ")))\n"; } else if (is_wild) { if (explain) indent(ctx, k) << "/* for each element of current node " << v << " match " << putstr(xpath, 0) << " */\n"; indent(ctx, k) << "size_t pos = 1;\n"; indent(ctx, k) << "xsd__anyType *it;\n"; indent(ctx, k) << "for (it = soap_elt_first(" << v << "); it; it = soap_elt_next(it), ++pos)\n"; } else if (is_patt) { if (explain) indent(ctx, k) << "/* for each element '" << tag << "' of current node " << v << " match " << putstr(xpath, 0) << " */\n"; indent(ctx, k) << "size_t pos = 1;\n"; indent(ctx, k) << "xsd__anyType *it;\n"; indent(ctx, k) << "for (it = soap_elt_find(" << v << ", NULL, " << putstr(tag) << "); it; it = soap_elt_find_next(it, NULL, " << putstr(tag) << ", ++pos)\n"; } else if (nth == 1) { if (explain) indent(ctx, k) << "/* if current node " << v << " has an element '" << tag << "' then match " << putstr(xpath, 0) << " */\n"; indent(ctx, k) << "if ((elt = soap_elt_get(" << v << ", NULL, " << putstr(tag) << ")))\n"; } else if (nth > 1) { if (explain) indent(ctx, k) << "/* if current node " << v << " has a " << nth << "-th element '" << tag << "' then match " << putstr(xpath, 0) << " */\n"; indent(ctx, k) << "if ((elt = soap_elt_get(" << v << ", NULL, " << putstr(tag) << ")) && (elt = soap_elt_get_nth(elt, " << nth << ")))\n"; } else { if (explain) indent(ctx, k) << "/* for each element '" << tag << "' of current node " << v << " match " << putstr(xpath, 0) << " */\n"; indent(ctx, k) << "size_t pos = 1;\n"; indent(ctx, k) << "xsd__anyType *it;\n"; indent(ctx, k) << "for (it = soap_elt_get(" << v << ", NULL, " << putstr(tag) << "); it; it = soap_elt_get_next(it), ++pos)\n"; } indent(ctx, k) << "{\n"; if (is_att && is_patt) indent(ctx, k + 2) << "xsd__anyAttribute *v = it;\n"; else if (is_att) indent(ctx, k + 2) << "xsd__anyAttribute *v = att;\n"; else if (nth) indent(ctx, k + 2) << "xsd__anyType *v = elt;\n"; else indent(ctx, k + 2) << "xsd__anyType *v = it;\n"; v = "v"; path_gen_c(ctx, xpath, v, false, is_att, k + 2, parens, label); indent(ctx, k) << "}\n"; } } static void path_exec_c(struct soap *ctx, std::string& v, bool attrib, int k) { if (xcode) { if (attrib) indent(ctx, k) << "xsd__anyAttribute *v = " << v << ";\n"; else indent(ctx, k) << "xsd__anyType *v = " << v << ";\n"; indent(ctx, k) << xcode << "\n"; } else { if (attrib) indent(ctx, k) << "QUERY_YIELD_ATT(" << v << ");\n"; else indent(ctx, k) << "QUERY_YIELD_ELT(" << v << ");\n"; } } //////////////////////////////////////////////////////////////////////////////// // // C++ gen XPath from -ppath // //////////////////////////////////////////////////////////////////////////////// static void path_gen_cpp(struct soap *ctx, const char *xpath, std::string& v, bool atroot, bool attrib, int k, size_t parens, bool throwup) { if (*xpath == ')') // path: ...)... { if (parens == 0) { fprintf(stderr, "domcpp: XPath ')' without '(' ...->%s\n\n", xpath); exit(EXIT_FAILURE); } ++xpath; --parens; indent(ctx, k) << "size_t pos = ++pos" << parens << ";\n"; } if (*xpath == '/' && *(xpath + 1) != '/') // skip single / { if (attrib) { fprintf(stderr, "domcpp: XPath / follows attribute at ...->%s\n\n", xpath); exit(EXIT_FAILURE); } ++xpath; } if (*xpath == '(') // path: (... { ++xpath; indent(ctx, k) << "size_t pos" << parens << " = 0;\n"; ++parens; } if (*xpath == '.') { ++xpath; if (*xpath == '.') { if (atroot) { fprintf(stderr, "domcpp: XPath .. at root ...->%s\n\n", xpath); exit(EXIT_FAILURE); } indent(ctx, k) << "if ((elt = " << v << ".parent()))\n"; indent(ctx, k) << "{\n"; indent(ctx, k + 2) << "xsd__anyType& v = *elt\n"; v = "v"; path_gen_cpp(ctx, xpath, v, false, attrib, k + 2, parens, throwup); indent(ctx, k) << "}\n"; } else { path_gen_cpp(ctx, xpath, v, false, attrib, k, parens, throwup); } } else if (*xpath == '/') // path: //... { ++xpath; if (*xpath == '/') { if (attrib) { fprintf(stderr, "domcpp: XPath // follows attribute at ...->%s\n\n", xpath); exit(EXIT_FAILURE); } ++xpath; if (explain) { if (atroot) indent(ctx, k) << "// iterate over descendants and current node " << v << " to match " << putstr(xpath, 0) << "\n"; else indent(ctx, k) << "// iterate over descendants of current node " << v << " to match " << putstr(xpath, 0) << "\n"; } indent(ctx, k) << "for (xsd__anyType::iterator it = " << v << ".begin(); it != " << v << ".end(); ++it)\n"; indent(ctx, k) << "{\n"; indent(ctx, k + 2) << "xsd__anyType& v = *it;\n"; v = "v"; path_gen_cpp(ctx, xpath, v, atroot, false, k + 2, parens, throwup); indent(ctx, k) << "}\n"; } else { fprintf(stderr, "domcpp: XPath unexpected end at '/'\n\n"); exit(EXIT_FAILURE); } } else if (*xpath == '[') // path: [...]... { size_t nth = getnth(&xpath); if (nth) // path: [n]... where n is an integer > 0 position { if (explain) indent(ctx, k) << "// if position of current node " << v << " is " << nth << " then match " << putstr(xpath, 0) << "\n"; indent(ctx, k) << "if (pos == " << nth << ")\n"; indent(ctx, k) << "{\n"; path_gen_cpp(ctx, xpath, v, false, attrib, k + 2, parens, throwup); indent(ctx, k) << "}\n"; } else { ++xpath; int nest = 0; const char *s; for (s = xpath; *s; ++s) { if (*s == ']') { if (nest == 0) break; --nest; } else if (*s == '[') ++nest; } if (*s != ']') { fprintf(stderr, "domcpp: XPath ']' expected at ...->%s\n\n", xpath); exit(EXIT_FAILURE); } if (*xpath == '?') // path: [?e]... where e is a C++ bool expression { std::string code(xpath + 1, s - xpath - 1); xpath = s + 1; if (explain) indent(ctx, k) << "// filter current node " << v << " with 'if (" << code << ")' to match " << putstr(xpath, 0) << "\n"; if (v != "v") { if (attrib) indent(ctx, k) << "xsd__anyAttribute& v = " << v << ";\n"; else indent(ctx, k) << "xsd__anyType& v = " << v << ";\n"; } indent(ctx, k) << "if (" << code << ")\n"; indent(ctx, k) << "{\n"; path_gen_cpp(ctx, xpath, v, atroot, attrib, k + 2, parens, throwup); indent(ctx, k) << "}\n"; } else // path: [p]... where p is an XPath to match to continue { if (explain) indent(ctx, k) << "// check current node " << v << " matches " << putstr(xpath, 0) << "\n"; indent(ctx, k) << "try\n"; indent(ctx, k) << "{\n"; std::string u = v; if (*xpath == '/' && *(xpath + 1) != '/') { v = "dom"; path_gen_cpp(ctx, xpath, v, true, attrib, k + 2, 0, true); } else { path_gen_cpp(ctx, xpath, v, atroot, attrib, k + 2, 0, true); } indent(ctx, k) << "}\n"; indent(ctx, k) << "catch (const bool&)\n"; indent(ctx, k) << "{\n"; xpath = s + 1; path_gen_cpp(ctx, xpath, u, atroot, attrib, k + 2, parens, throwup); indent(ctx, k) << "}\n"; } } } else if (*xpath == ']') { if (!throwup) { fprintf(stderr, "domcpp: XPath ']' without '[' ...->%s\n\n", xpath); exit(EXIT_FAILURE); } indent(ctx, k) << "(void)" << v << ";\n"; indent(ctx, k) << "throw true;\n"; } else if (!*xpath) { if (parens) { fprintf(stderr, "domcpp: XPath ')' expected ...->%s\n\n", xpath); exit(EXIT_FAILURE); } path_exec_cpp(ctx, v, attrib, k); } else if (!strncmp(xpath, "text()", 6)) // path: text() { xpath += 6; size_t nth = getnth(&xpath); if (nth == 1) { if (explain) indent(ctx, k) << "// if current node " << v << " has a text-only element then match " << putstr(xpath, 0) << "\n"; indent(ctx, k) << "if ((elt = " << v << ".elt_get()))\n"; } else if (nth > 1) { if (explain) indent(ctx, k) << "// if current node " << v << " has a " << nth << "-th text-only element then match " << putstr(xpath, 0) << "\n"; indent(ctx, k) << "if ((elt = " << v << ".elt_get()) && (elt = elt->get_nth(" << nth << ")))\n"; } else { if (explain) indent(ctx, k) << "// for each text-only element of current node " << v << " match " << putstr(xpath, 0) << "\n"; indent(ctx, k) << "size_t pos = 1;\n"; indent(ctx, k) << "for (xsd__anyType *it = " << v << ".elt_get(); it; it = it->get_next(), ++pos)\n"; } indent(ctx, k) << "{\n"; if (nth) indent(ctx, k + 2) << "xsd__anyType& v = *elt;\n"; else indent(ctx, k + 2) << "xsd__anyType& v = *it;\n"; v = "v"; path_gen_cpp(ctx, xpath, v, false, false, k + 2, parens, throwup); indent(ctx, k) << "}\n"; } else if (atroot && *xpath != '@') // path: /name... { const char *tag = getname(&xpath).c_str(); if (explain) indent(ctx, k) << "// if node " << v << " is '" << tag << "' then match " << putstr(xpath, 0) << "\n"; indent(ctx, k) << "if (" << v << ".match(" << putstr(tag) << "))\n"; indent(ctx, k) << "{\n"; path_gen_cpp(ctx, xpath, v, false, false, k + 2, parens, throwup); indent(ctx, k) << "}\n"; } else // path: name..., name[n]..., @name, *..., *:*..., @*..., @*:*... { const char *tag = getname(&xpath).c_str(); size_t nth = 0; bool is_att = (*tag == '@'); bool is_patt = strchr(tag, '*') != NULL; bool is_wild = !strcmp(tag + is_att, "*") || !strcmp(tag + is_att, "*:*"); if (!is_patt) nth = getnth(&xpath); if (is_att && is_wild) { if (explain) indent(ctx, k) << "// for each attribute of current node " << v << " match " << putstr(xpath, 0) << "\n"; indent(ctx, k) << "for (xsd__anyAttribute::iterator it = " << v << ".att_begin(); it != " << v << ".att_end(); ++it)\n"; } else if (is_att && is_patt) { if (explain) indent(ctx, k) << "// for each attribute '" << tag + 1 << "' of current node " << v << " match " << putstr(xpath, 0) << "\n"; indent(ctx, k) << "for (xsd__anyAttribute::iterator it = " << v << ".att_find(" << putstr(tag) << "); it != " << v << ".att_end(); ++it)\n"; } else if (is_att) { if (explain) indent(ctx, k) << "// if current node " << v << " has an attribute '" << tag + 1 << "' then match " << putstr(xpath, 0) << "\n"; indent(ctx, k) << "if ((att = " << v << ".att_get(" << putstr(tag + 1) << ")))\n"; } else if (is_wild) { if (explain) indent(ctx, k) << "// for each element of current node " << v << " match " << putstr(xpath, 0) << "\n"; indent(ctx, k) << "size_t pos = 1;\n"; indent(ctx, k) << "for (xsd__anyType::iterator it = " << v << ".elt_begin(); it != " << v << ".elt_end(); ++it, ++pos)\n"; } else if (is_patt) { if (explain) indent(ctx, k) << "// for each element '" << tag << "' of current node " << v << " match " << putstr(xpath, 0) << "\n"; indent(ctx, k) << "size_t pos = 1;\n"; indent(ctx, k) << "for (xsd__anyType::iterator it = " << v << ".elt_find(" << putstr(tag) << "); it != " << v << ".elt_end(); ++it, ++pos)\n"; } else if (nth == 1) { if (explain) indent(ctx, k) << "// if current node " << v << " has an element '" << tag << "' then match " << putstr(xpath, 0) << "\n"; indent(ctx, k) << "if ((elt = " << v << ".elt_get(" << putstr(tag) << ")))\n"; } else if (nth > 1) { if (explain) indent(ctx, k) << "// if current node " << v << " has a " << nth << "-th element '" << tag << "' then match " << putstr(xpath, 0) << "\n"; indent(ctx, k) << "if ((elt = " << v << ".elt_get(" << putstr(tag) << ")) && (elt = elt->get_nth(" << nth << ")))\n"; } else { if (explain) indent(ctx, k) << "// for each element '" << tag << "' of current node " << v << " match " << putstr(xpath, 0) << "\n"; indent(ctx, k) << "size_t pos = 1;\n"; indent(ctx, k) << "for (xsd__anyType *it = " << v << ".elt_get(" << putstr(tag) << "); it; it = it->get_next(), ++pos)\n"; } indent(ctx, k) << "{\n"; if (is_att && is_patt) indent(ctx, k + 2) << "xsd__anyAttribute& v = *it;\n"; else if (is_att) indent(ctx, k + 2) << "xsd__anyAttribute& v = *att;\n"; else if (nth) indent(ctx, k + 2) << "xsd__anyType& v = *elt;\n"; else indent(ctx, k + 2) << "xsd__anyType& v = *it;\n"; v = "v"; path_gen_cpp(ctx, xpath, v, false, is_att, k + 2, parens, throwup); indent(ctx, k) << "}\n"; } } static void path_exec_cpp(struct soap *ctx, std::string& v, bool attrib, int k) { if (xcode) { if (v != "v") { if (attrib) indent(ctx, k) << "xsd__anyAttribute& v = " << v << ";\n"; else indent(ctx, k) << "xsd__anyType& v = " << v << ";\n"; } indent(ctx, k) << xcode << "\n"; } else { if (attrib) indent(ctx, k) << "QUERY_YIELD_ATT(" << v << ");\n"; else indent(ctx, k) << "QUERY_YIELD_ELT(" << v << ");\n"; } } //////////////////////////////////////////////////////////////////////////////// // // Misc // //////////////////////////////////////////////////////////////////////////////// static std::ostream& indent(soap *ctx, int k) { *ctx->os << std::setw(k) << "" << std::setw(0); return *ctx->os; } static std::string gen_ident(const std::string& lhs, const char *tag) { std::string id = lhs; id.append("_"); for (const char *s = tag; *s; tag = s) { while (isalnum(*s)) s++; id.append(tag, s - tag); if (*s) s++; } return id; } static bool is_bool(const char *text) { if (!text) return false; return !strcmp(text, "true") || !strcmp(text, "false"); } static bool is_int(soap *ctx, const char *text, LONG64& n) { if (!text) return false; if (soap_s2LONG64(ctx, text, &n)) { ctx->error = SOAP_OK; return false; } return true; } static bool is_double(soap *ctx, const char *text, double& x) { if (!text) return false; if (soap_s2double(ctx, text, &x)) { ctx->error = SOAP_OK; return false; } return !soap_isnan(x) && !soap_isinf(x); } static bool need_ns(const char *ns, const char *tag, const std::map& nsmap, const char *current) { if (ns == NULL) return false; if (!is_qualified(tag) && is_current(ns, current)) return false; if (nstable && is_qualified(tag)) { std::map::const_iterator i = nsmap.find(prefix(tag)); if (i != nsmap.end() && !strcmp(ns, i->second)) return false; } return true; } static bool is_qualified(const char *tag) { return tag && strchr(tag, ':'); } static bool is_current(const char *ns, const char *current) { return ns && current && !strcmp(ns, current); } static std::string prefix(const char *tag) { const char *s = strchr(tag, ':'); if (s) return std::string(tag, s - tag); return std::string(tag); } static const char *name(const char *tag) { const char *s = strchr(tag, ':'); if (s) return s + 1; return tag; } static std::string putstrname(const char *name) { std::stringstream ss; ss << putstr(name); return ss.str(); } static std::string getname(const char **xpath) { const char *s = *xpath; const char *t = s; if (*t == '@') ++t; while (*t && (isalnum(*t) || *t == '_' || *t == '*' || *t == ':' || *t == '-' || *t == '.' || *t > 0x7f || *t < 0)) ++t; if (t == s) { fprintf(stderr, "domcpp: XPath empty field name at ...->%s\n\n", s); exit(EXIT_FAILURE); } *xpath = t; return std::string(s, t - s); } static size_t getnth(const char **xpath) { size_t nth = 0; if (**xpath == '[') { char *r; nth = soap_strtoul(*xpath + 1, &r, 10); if (*r == ']') *xpath = r + 1; } return nth; } gsoap-2.8.28/gsoap/samples/dom/dom2calc.cpp0000644000175000017500000001131012653650154020013 0ustar ellertellert/* dom2calc.cpp Example DOM processing with a calculator service This is version 2 based on the improved DOM API v5 gSOAP 2.8.28 This example is based on the calculator service (samples/calc) and implements a DOM-message-based calculator client. See gsoap/doc/dom/html/index.html for the DOM API documentation, including the domcpp tool that was used to generate the XPath code in this exampple. soapcpp2 -Iimport dom2calc.h cc -o dom2calc dom2calc.cpp stdsoap2.cpp soapC.cpp dom.cpp -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2016, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" const char server[] = "http://websrv.cs.fsu.edu/~engelen/calcserver.cgi"; // copied and modified from: // domcpp -M -n -rrequest calc.add.req.xml struct Namespace namespaces[] = { {"SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/", "http://www.w3.org/*/soap-envelope", NULL}, {"SOAP-ENC", "http://schemas.xmlsoap.org/soap/encoding/", "http://www.w3.org/*/soap-encoding", NULL}, {"xsi", "http://www.w3.org/2001/XMLSchema-instance", "http://www.w3.org/*/XMLSchema-instance", NULL}, {"xsd", "http://www.w3.org/2001/XMLSchema", "http://www.w3.org/*/XMLSchema", NULL}, {"ns", "urn:calc", NULL, NULL }, {NULL, NULL, NULL, NULL} }; int main(int argc, char **argv) { struct soap *ctx = soap_new1(SOAP_DOM_TREE | SOAP_XML_INDENT); if (argc <= 3) { std::cerr << "Usage: dom2calc [add|sub|mul|div|pow] " << std::endl; exit(1); } // create command tag ns:add, ns:sub, ns:mul, ns:div, or ns:pow std::string command = std::string("ns:").append(argv[1]); // copied and modified from: // domcpp -M -n -rrequest calc.add.req.xml xsd__anyType request(ctx, "SOAP-ENV:Envelope"); request["SOAP-ENV:Body"].att("SOAP-ENV:encodingStyle") = "http://schemas.xmlsoap.org/soap/encoding/"; request["SOAP-ENV:Body"][command.c_str()]["a"] = strtod(argv[2], NULL); request["SOAP-ENV:Body"][command.c_str()]["b"] = strtod(argv[3], NULL); std::cout << "** Request message: " << std::endl << request << std::endl << std::endl; // create response xsd__anyType response(ctx); // invoke server: make POST XML request and receive XML response if (soap_dom_call(ctx, server, "", request, response)) { soap_stream_fault(ctx, std::cerr); } else { std::cout << "** Response message:" << std::endl << response << std::endl << std::endl; // copied from: // domcpp -p'/SOAP-ENV:Envelope/SOAP-ENV:Body/ns:addResponse/result' -rresponse -x'std::cout << "Result = " << v << std::endl;' if (response.match("SOAP-ENV:Envelope")) { size_t pos = 1; for (xsd__anyType *it = response.elt_get("SOAP-ENV:Body"); it; it = it->get_next(), ++pos) { xsd__anyType& v = *it; size_t pos = 1; for (xsd__anyType *it = v.elt_get("ns:addResponse"); it; it = it->get_next(), ++pos) { xsd__anyType& v = *it; size_t pos = 1; for (xsd__anyType *it = v.elt_get("result"); it; it = it->get_next(), ++pos) { xsd__anyType& v = *it; std::cout << "Result = " << v.get_double() << std::endl; } } } } // Here is another way to search DOM for element(s): // for (xsd__anyType::iterator it = response.find("result"); it != response.end(); ++it) // std::cout << std::endl << "Result = " << it->get_double() << std::endl; } soap_destroy(ctx); // delete objects soap_end(ctx); // delete temp data soap_free(ctx); // free context return 0; } gsoap-2.8.28/gsoap/samples/dom/Makefile.am0000644000175000017500000000114512653650154017664 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 noinst_PROGRAMS = domcpp dom2calc SOAPHEADER = dom2calc.h include ../Makefile.defines include ../Makefile.cpp_rules SOAP_NS = $(SOAP_NS_DEF) domcpp_SOURCES = domcpp.cpp $(SOAPHEADER) $(SOAP_CPP_CORE) domcpp_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) dom2calc_SOURCES = $(SOAPHEADER) dom2calc.cpp $(SOAP_CPP_CORE) dom2calc_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) gsoap-2.8.28/gsoap/samples/dom/dom2calc.h0000644000175000017500000000531112653650154017464 0ustar ellertellert/* dom2calc.h A gSOAP header file for the DOM example You can define C and C++ types to be serialized and deserialized automatically in a DOM object. To do this, enable the SOAP_DOM_NODE flag and make sure that either xsi:types attribute values or XML element/attribute tag names match the name of the type definition. The deserialization only works when xsi:type attributes are present in messages or when XML element or attribute tag names match the type name. A deserializer is chosen based on these tag names xsi:type attribute value. For example, when an element has an xsi:type="xsd:double" attribute and SOAP_DOM_NODE is set, then the xsd__double type is deserialized into the void *soap_dom_element::node (points to a double) and soap_dom_element::type==SOAP_TYPE_xsd__double. Likewise, when an element tag name is , then the 'result' deserializer is invoked to populate void *soap_dom_element::node (points to double) and soap_dom_element::type==SOAP_TYPE_result. When declaring types for elements and attributes, it is advised to use a leading '_' to prevent them from being (de)serialized as types. The leading '_' suppresses the rendering of xsi:type. See the '_result' example below. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #import "dom.h" typedef double xsd__double; /* matches xsi:type="xsd:double" */ typedef double _result; /* matches the unqualified tag */ gsoap-2.8.28/gsoap/samples/httpcookies/0000755000175000017500000000000012653650170017402 5ustar ellertellertgsoap-2.8.28/gsoap/samples/httpcookies/Makefile.in0000644000175000017500000007604512653650156021467 0ustar ellertellert# Makefile.in generated by automake 1.14 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = ck.cgi$(EXEEXT) ckclient$(EXEEXT) DIST_COMMON = $(srcdir)/../Makefile.defines \ $(srcdir)/../Makefile.cpp_rules $(srcdir)/Makefile.in \ $(srcdir)/Makefile.am $(top_srcdir)/mkinstalldirs \ $(top_srcdir)/depcomp subdir = gsoap/samples/httpcookies ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = am__objects_2 = ck_cgi-soapC.$(OBJEXT) am__objects_3 = ck_cgi-soapServer.$(OBJEXT) $(am__objects_2) am_ck_cgi_OBJECTS = ck_cgi-ckserver.$(OBJEXT) $(am__objects_1) \ $(am__objects_3) ck_cgi_OBJECTS = $(am_ck_cgi_OBJECTS) am__DEPENDENCIES_1 = ck_cgi_DEPENDENCIES = $(SOAP_CPP_LIB_CK) $(am__DEPENDENCIES_1) ck_cgi_LINK = $(CXXLD) $(ck_cgi_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ am__objects_4 = ckclient-soapC.$(OBJEXT) am__objects_5 = ckclient-soapClient.$(OBJEXT) $(am__objects_4) am_ckclient_OBJECTS = ckclient-ckclient.$(OBJEXT) $(am__objects_1) \ $(am__objects_5) ckclient_OBJECTS = $(am_ckclient_OBJECTS) ckclient_DEPENDENCIES = $(SOAP_CPP_LIB_CK) $(am__DEPENDENCIES_1) ckclient_LINK = $(CXXLD) $(ckclient_CXXFLAGS) $(CXXFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(ck_cgi_SOURCES) $(ckclient_SOURCES) DIST_SOURCES = $(ck_cgi_SOURCES) $(ckclient_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ STRIP = @STRIP@ VERSION = @VERSION@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 SOAPHEADER = ck.h AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a SOAP_CPP_SRC = $(SOAP_CPP_CLIENT) soapServer.cpp $(SOAP_H_FILES) $(SOAP_NS) LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_CPP_SRC) CLEANFILES = $(SOAP_CPP_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.cpp soap*Proxy.h soap*Proxy.cpp soap*Object.h soap*Service.h soap*Service.cpp soapClient.cpp soapServer.cpp soapClientLib.cpp soapServerLib.cpp *~ SOAP_NS = ck.nsmap ck.wsdl ck_cgi_CXXFLAGS = -DWITH_COOKIES -D$(platform) ck_cgi_SOURCES = ckserver.cpp $(SOAPHEADER) $(SOAP_CPP_SERVER) ck_cgi_LDADD = $(SOAP_CPP_LIB_CK) $(SAMPLE_EXTRA_LIBS) ckclient_CXXFLAGS = -DWITH_COOKIES -D$(platform) ckclient_SOURCES = ckclient.cpp $(SOAPHEADER) $(SOAP_CPP_CLIENT) ckclient_LDADD = $(SOAP_CPP_LIB_CK) $(SAMPLE_EXTRA_LIBS) all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_rules $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/httpcookies/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/httpcookies/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_rules: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) ck.cgi$(EXEEXT): $(ck_cgi_OBJECTS) $(ck_cgi_DEPENDENCIES) $(EXTRA_ck_cgi_DEPENDENCIES) @rm -f ck.cgi$(EXEEXT) $(AM_V_CXXLD)$(ck_cgi_LINK) $(ck_cgi_OBJECTS) $(ck_cgi_LDADD) $(LIBS) ckclient$(EXEEXT): $(ckclient_OBJECTS) $(ckclient_DEPENDENCIES) $(EXTRA_ckclient_DEPENDENCIES) @rm -f ckclient$(EXEEXT) $(AM_V_CXXLD)$(ckclient_LINK) $(ckclient_OBJECTS) $(ckclient_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ck_cgi-ckserver.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ck_cgi-soapC.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ck_cgi-soapServer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ckclient-ckclient.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ckclient-soapC.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ckclient-soapClient.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ck_cgi-ckserver.o: ckserver.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ck_cgi_CXXFLAGS) $(CXXFLAGS) -MT ck_cgi-ckserver.o -MD -MP -MF $(DEPDIR)/ck_cgi-ckserver.Tpo -c -o ck_cgi-ckserver.o `test -f 'ckserver.cpp' || echo '$(srcdir)/'`ckserver.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ck_cgi-ckserver.Tpo $(DEPDIR)/ck_cgi-ckserver.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ckserver.cpp' object='ck_cgi-ckserver.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ck_cgi_CXXFLAGS) $(CXXFLAGS) -c -o ck_cgi-ckserver.o `test -f 'ckserver.cpp' || echo '$(srcdir)/'`ckserver.cpp ck_cgi-ckserver.obj: ckserver.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ck_cgi_CXXFLAGS) $(CXXFLAGS) -MT ck_cgi-ckserver.obj -MD -MP -MF $(DEPDIR)/ck_cgi-ckserver.Tpo -c -o ck_cgi-ckserver.obj `if test -f 'ckserver.cpp'; then $(CYGPATH_W) 'ckserver.cpp'; else $(CYGPATH_W) '$(srcdir)/ckserver.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ck_cgi-ckserver.Tpo $(DEPDIR)/ck_cgi-ckserver.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ckserver.cpp' object='ck_cgi-ckserver.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ck_cgi_CXXFLAGS) $(CXXFLAGS) -c -o ck_cgi-ckserver.obj `if test -f 'ckserver.cpp'; then $(CYGPATH_W) 'ckserver.cpp'; else $(CYGPATH_W) '$(srcdir)/ckserver.cpp'; fi` ck_cgi-soapServer.o: soapServer.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ck_cgi_CXXFLAGS) $(CXXFLAGS) -MT ck_cgi-soapServer.o -MD -MP -MF $(DEPDIR)/ck_cgi-soapServer.Tpo -c -o ck_cgi-soapServer.o `test -f 'soapServer.cpp' || echo '$(srcdir)/'`soapServer.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ck_cgi-soapServer.Tpo $(DEPDIR)/ck_cgi-soapServer.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soapServer.cpp' object='ck_cgi-soapServer.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ck_cgi_CXXFLAGS) $(CXXFLAGS) -c -o ck_cgi-soapServer.o `test -f 'soapServer.cpp' || echo '$(srcdir)/'`soapServer.cpp ck_cgi-soapServer.obj: soapServer.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ck_cgi_CXXFLAGS) $(CXXFLAGS) -MT ck_cgi-soapServer.obj -MD -MP -MF $(DEPDIR)/ck_cgi-soapServer.Tpo -c -o ck_cgi-soapServer.obj `if test -f 'soapServer.cpp'; then $(CYGPATH_W) 'soapServer.cpp'; else $(CYGPATH_W) '$(srcdir)/soapServer.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ck_cgi-soapServer.Tpo $(DEPDIR)/ck_cgi-soapServer.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soapServer.cpp' object='ck_cgi-soapServer.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ck_cgi_CXXFLAGS) $(CXXFLAGS) -c -o ck_cgi-soapServer.obj `if test -f 'soapServer.cpp'; then $(CYGPATH_W) 'soapServer.cpp'; else $(CYGPATH_W) '$(srcdir)/soapServer.cpp'; fi` ck_cgi-soapC.o: soapC.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ck_cgi_CXXFLAGS) $(CXXFLAGS) -MT ck_cgi-soapC.o -MD -MP -MF $(DEPDIR)/ck_cgi-soapC.Tpo -c -o ck_cgi-soapC.o `test -f 'soapC.cpp' || echo '$(srcdir)/'`soapC.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ck_cgi-soapC.Tpo $(DEPDIR)/ck_cgi-soapC.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soapC.cpp' object='ck_cgi-soapC.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ck_cgi_CXXFLAGS) $(CXXFLAGS) -c -o ck_cgi-soapC.o `test -f 'soapC.cpp' || echo '$(srcdir)/'`soapC.cpp ck_cgi-soapC.obj: soapC.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ck_cgi_CXXFLAGS) $(CXXFLAGS) -MT ck_cgi-soapC.obj -MD -MP -MF $(DEPDIR)/ck_cgi-soapC.Tpo -c -o ck_cgi-soapC.obj `if test -f 'soapC.cpp'; then $(CYGPATH_W) 'soapC.cpp'; else $(CYGPATH_W) '$(srcdir)/soapC.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ck_cgi-soapC.Tpo $(DEPDIR)/ck_cgi-soapC.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soapC.cpp' object='ck_cgi-soapC.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ck_cgi_CXXFLAGS) $(CXXFLAGS) -c -o ck_cgi-soapC.obj `if test -f 'soapC.cpp'; then $(CYGPATH_W) 'soapC.cpp'; else $(CYGPATH_W) '$(srcdir)/soapC.cpp'; fi` ckclient-ckclient.o: ckclient.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ckclient_CXXFLAGS) $(CXXFLAGS) -MT ckclient-ckclient.o -MD -MP -MF $(DEPDIR)/ckclient-ckclient.Tpo -c -o ckclient-ckclient.o `test -f 'ckclient.cpp' || echo '$(srcdir)/'`ckclient.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ckclient-ckclient.Tpo $(DEPDIR)/ckclient-ckclient.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ckclient.cpp' object='ckclient-ckclient.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ckclient_CXXFLAGS) $(CXXFLAGS) -c -o ckclient-ckclient.o `test -f 'ckclient.cpp' || echo '$(srcdir)/'`ckclient.cpp ckclient-ckclient.obj: ckclient.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ckclient_CXXFLAGS) $(CXXFLAGS) -MT ckclient-ckclient.obj -MD -MP -MF $(DEPDIR)/ckclient-ckclient.Tpo -c -o ckclient-ckclient.obj `if test -f 'ckclient.cpp'; then $(CYGPATH_W) 'ckclient.cpp'; else $(CYGPATH_W) '$(srcdir)/ckclient.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ckclient-ckclient.Tpo $(DEPDIR)/ckclient-ckclient.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ckclient.cpp' object='ckclient-ckclient.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ckclient_CXXFLAGS) $(CXXFLAGS) -c -o ckclient-ckclient.obj `if test -f 'ckclient.cpp'; then $(CYGPATH_W) 'ckclient.cpp'; else $(CYGPATH_W) '$(srcdir)/ckclient.cpp'; fi` ckclient-soapClient.o: soapClient.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ckclient_CXXFLAGS) $(CXXFLAGS) -MT ckclient-soapClient.o -MD -MP -MF $(DEPDIR)/ckclient-soapClient.Tpo -c -o ckclient-soapClient.o `test -f 'soapClient.cpp' || echo '$(srcdir)/'`soapClient.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ckclient-soapClient.Tpo $(DEPDIR)/ckclient-soapClient.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soapClient.cpp' object='ckclient-soapClient.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ckclient_CXXFLAGS) $(CXXFLAGS) -c -o ckclient-soapClient.o `test -f 'soapClient.cpp' || echo '$(srcdir)/'`soapClient.cpp ckclient-soapClient.obj: soapClient.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ckclient_CXXFLAGS) $(CXXFLAGS) -MT ckclient-soapClient.obj -MD -MP -MF $(DEPDIR)/ckclient-soapClient.Tpo -c -o ckclient-soapClient.obj `if test -f 'soapClient.cpp'; then $(CYGPATH_W) 'soapClient.cpp'; else $(CYGPATH_W) '$(srcdir)/soapClient.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ckclient-soapClient.Tpo $(DEPDIR)/ckclient-soapClient.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soapClient.cpp' object='ckclient-soapClient.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ckclient_CXXFLAGS) $(CXXFLAGS) -c -o ckclient-soapClient.obj `if test -f 'soapClient.cpp'; then $(CYGPATH_W) 'soapClient.cpp'; else $(CYGPATH_W) '$(srcdir)/soapClient.cpp'; fi` ckclient-soapC.o: soapC.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ckclient_CXXFLAGS) $(CXXFLAGS) -MT ckclient-soapC.o -MD -MP -MF $(DEPDIR)/ckclient-soapC.Tpo -c -o ckclient-soapC.o `test -f 'soapC.cpp' || echo '$(srcdir)/'`soapC.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ckclient-soapC.Tpo $(DEPDIR)/ckclient-soapC.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soapC.cpp' object='ckclient-soapC.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ckclient_CXXFLAGS) $(CXXFLAGS) -c -o ckclient-soapC.o `test -f 'soapC.cpp' || echo '$(srcdir)/'`soapC.cpp ckclient-soapC.obj: soapC.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ckclient_CXXFLAGS) $(CXXFLAGS) -MT ckclient-soapC.obj -MD -MP -MF $(DEPDIR)/ckclient-soapC.Tpo -c -o ckclient-soapC.obj `if test -f 'soapC.cpp'; then $(CYGPATH_W) 'soapC.cpp'; else $(CYGPATH_W) '$(srcdir)/soapC.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ckclient-soapC.Tpo $(DEPDIR)/ckclient-soapC.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soapC.cpp' object='ckclient-soapC.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ckclient_CXXFLAGS) $(CXXFLAGS) -c -o ckclient-soapC.obj `if test -f 'soapC.cpp'; then $(CYGPATH_W) 'soapC.cpp'; else $(CYGPATH_W) '$(srcdir)/soapC.cpp'; fi` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am $(SOAP_CPP_SRC) : $(SOAPHEADER) $(SOAP) -L -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $(SOAPHEADER) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.28/gsoap/samples/httpcookies/ckserver.cpp0000644000175000017500000001026512653650156021742 0ustar ellertellert/* ckserver.cpp Example HTTP cookie-enabled server Run from command line to start a stand-alone server: $ ./ckserver 8080 where 8080 is a port number Then run the client in a new window: $ ./ckclient Please see the ckclient.cpp file for HTTP cookie-related details. Remember to change the soap.cookie_domain value to your host -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" #include "ck.nsmap" int main(int argc, char **argv) { int m, s; struct soap soap; soap_init(&soap); // cookie domain for CGI must be the current host name: // soap.cookie_domain = "www.cs.fsu.edu"; // Cookie domain for stand-alone server: soap.cookie_domain = "localhost:8080"; // the path which is used to filter/set cookies with this destination soap.cookie_path = "/"; if (argc < 2) { // CGI app: grab cookies from 'HTTP_COOKIE' env var soap_getenv_cookies(&soap); soap_serve(&soap); } else { int port; char buf[100]; port = atoi(argv[1]); m = soap_bind(&soap, NULL, port, 100); if (m < 0) { soap_print_fault(&soap, stderr); exit(1); } sprintf(buf, "localhost:%d", port); soap.cookie_domain = buf; fprintf(stderr, "Socket connection successful %d\n", m); for (int i = 1; ; i++) { s = soap_accept(&soap); if (s < 0) exit(-1); fprintf(stderr, "%d: accepted %d IP=%d.%d.%d.%d ... ", i, s, (int)(soap.ip>>24)&0xFF, (int)(soap.ip>>16)&0xFF, (int)(soap.ip>>8)&0xFF, (int)soap.ip&0xFF); if (!soap_serve(&soap)) fprintf(stderr, "served\n"); else soap_print_fault(&soap, stderr); // clean up soap_destroy(&soap); soap_end(&soap); // remove all old cookies from database so no interference when new // requests with new cookies arrive soap_free_cookies(&soap); // Note: threads can have their own cookie DB which they need to cleanup // before they terminate } } return 0; } //////////////////////////////////////////////////////////////////////////////// // // Demo cookie // //////////////////////////////////////////////////////////////////////////////// int ck__demo(struct soap *soap, char **r) { int n; char *s, buf[16]; // The host and path are set by soap_cookie_domain and soap_cookie_path // which MUST be the current domain and path of the CGI app or stand-alone // server in order to accept cookies intended for this service s = soap_cookie_value(soap, "demo", NULL, NULL); // cookie was returned by client? if (s) n = atoi(s)+1; // yes: increment int value as demo example session else n = 1; // no: return cookie with value 1 to client to start session sprintf(buf, "%d", n); soap_set_cookie(soap, "demo", buf, NULL, NULL); // cookie expires in 5 seconds: soap_set_cookie_expire(soap, "demo", 5, NULL, NULL); if ((*r = (char*)soap_malloc(soap, strlen(buf)+1))) strcpy(*r, buf); return SOAP_OK; } gsoap-2.8.28/gsoap/samples/httpcookies/ck.h0000644000175000017500000000540112653650156020154 0ustar ellertellert/* ck.h This is a gSOAP header file with web service definitions. This demo illustrates the use of HTTP cookies for stateful services. This code base can be used to implement your own cookie-based stateful services. gSOAP's cookie handling is fully automatic at the client-side. A database of cookies is kept and returned to the appropriate servers. In this demo, the value (int) of the (invisible) cookie is returned as an output parameter by the service to demonstrate that each call uses a unique and updated cookie. Cookies are not automatically saved to a file by the client. So the internal cookie database is discarded when the program terminates. The server runs as CGI or stand alone with: ./ckserver For example: ./ckserver 18000 The client runs from the command line with an optional endpoint: ./ckclient For example: ./ckclient http://localhost:18000 By default, the client connects to our CGI-based server. Compilation in C++: $ soapcpp2 ck.h $ cc -o ckclient ckclient.cpp stdsoap2.cpp soapC.cpp soapClient.cpp $ cc -o ckserver ckserver.cpp stdsoap2.cpp soapC.cpp soapServer.cpp -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap ck service name: ck //gsoap ck service style: rpc //gsoap ck service encoding: encoded //gsoap ck service location: http://www.cs.fsu.edu/~engelen/ck.cgi //gsoap ck service namespace: http://www.cs.fsu.edu/~engelen/ck.wsdl //gsoap ck schema namespace: urn:ck int ck__demo(char **r); gsoap-2.8.28/gsoap/samples/httpcookies/README.txt0000644000175000017500000000152212653650156021104 0ustar ellertellertThis demo illustrates the use of HTTP cookies to implement stateful services. This code base can be used to implement your own cookie-based stateful services, even with CGI which is inherently stateless. gSOAP's cookie handling is fully automatic at the client-side. A database of cookies is kept and returned to the appropriate servers. In this demo, the value (int) of the (invisible) cookie is returned as an output parameter by the service to demonstrate that each call uses a unique and updated cookie. Cookies are not automatically saved to a file by the client. So the internal cookie database is discarded when the program terminates. The code is written in C++ and compiled with: soapcpp2 ck.h cc -o ckclient ckclient.cpp stdsoap2.cpp soapC.cpp soapClient.cpp cc -o ckserver ckserver.cpp stdsoap2.cpp soapC.cpp soapServer.cpp gsoap-2.8.28/gsoap/samples/httpcookies/Makefile.am0000644000175000017500000000131712653650156021444 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 noinst_PROGRAMS = ck.cgi ckclient SOAPHEADER = ck.h include ../Makefile.defines include ../Makefile.cpp_rules SOAP_NS = ck.nsmap ck.wsdl ck_cgi_CXXFLAGS = -DWITH_COOKIES -D$(platform) ck_cgi_SOURCES = ckserver.cpp $(SOAPHEADER) $(SOAP_CPP_SERVER) ck_cgi_LDADD = $(SOAP_CPP_LIB_CK) $(SAMPLE_EXTRA_LIBS) ckclient_CXXFLAGS = -DWITH_COOKIES -D$(platform) ckclient_SOURCES = ckclient.cpp $(SOAPHEADER) $(SOAP_CPP_CLIENT) ckclient_LDADD = $(SOAP_CPP_LIB_CK) $(SAMPLE_EXTRA_LIBS) gsoap-2.8.28/gsoap/samples/httpcookies/ckclient.cpp0000644000175000017500000001077612653650156021721 0ustar ellertellert/* ckclient.cpp Example HTTP cookie-enabled client See cookie processing details in the code below. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" #include "ck.nsmap" //////////////////////////////////////////////////////////////////////////////// // // Example cookie client // //////////////////////////////////////////////////////////////////////////////// static const char *ckserver = "http://localhost:8080"; // To access a stand-alone server on a port, use: // const char ckserver[] = "IP:PORT"; // const char ckserver[] = "http://IP:PORT"; // include HTTP header in request // const char ckserver[] = "http://www.domain.com:8008"; // const char ckserver[] = ""; // use I/O redirect // const char ckserver[] = "http://"; // use I/O redirect (includes HTTP headers) int main(int argc, char **argv) { char *r; struct soap soap; if (argc >= 2) ckserver = argv[1]; soap_init(&soap); // gSOAP's cookie handling is fully automatic at the client-side. // A database of cookies is kept and returned to the appropriate servers. // In this demo, the value (int) of the (invisible) cookie is returned as // an output parameter by the service to demonstrate that each call uses // a unique and updated cookie. Cookies are not automatically saved to a // file by the client. So the internal cookie database is discarded when // the program terminates. // To avoid "cookie storms" caused by malicious servers that return an // unreasonable amount of cookies, gSOAP clients/servers are restricted to // a database size that the user can limit (32 cookies by default): soap.cookie_max = 10; // In case all three calls below return the same cookie value 1, the service // (ck.cgi) is unable to return cookies (e.g. because the Web server does // not allow CGI applications to handle cookies which the user need to fix // by reconfiguration and restart of the Web server). Or the // soap.cookie_domain value is not set in the ckserver code to the host on // which the service runs . // First call (no cookies returned to service, service will return a cookie): if (soap_call_ck__demo(&soap, ckserver, NULL, &r)) { soap_print_fault(&soap, stderr); soap_print_fault_location(&soap, stderr); exit(-1); } printf("The server responded with: %s\n", r); // Second call (return cookie to service indicating continuation of session): if (soap_call_ck__demo(&soap, ckserver, NULL, &r)) { soap_print_fault(&soap, stderr); soap_print_fault_location(&soap, stderr); exit(-1); } printf("The server responded with: %s\n", r); // Third call (return cookie to service indicating continuation of session): if (soap_call_ck__demo(&soap, ckserver, NULL, &r)) { soap_print_fault(&soap, stderr); soap_print_fault_location(&soap, stderr); exit(-1); } printf("The server responded with: %s\n", r); // Fourth call (let cookie expire) printf("Waiting 6 seconds to let cookie expire...\n"); sleep(6); // wait to let cookie expire if (soap_call_ck__demo(&soap, ckserver, NULL, &r)) { soap_print_fault(&soap, stderr); soap_print_fault_location(&soap, stderr); exit(-1); } printf("The server responded with: %s\n", r); soap_end(&soap); return 0; } gsoap-2.8.28/gsoap/samples/README.txt0000644000175000017500000001206112653650156016550 0ustar ellertellert GSOAP APPLICATION EXAMPLES To build the example services and clients, run 'make' in the 'samples' directory. The concurrent server examples require the Pthreads library. The SSL example requires OpenSSL. The webserver example also requires Zlib. autotest: Autotest code generation for XML databindings (C++) calc: Simple calculator client and server (C) calc++: Simple calculator client and server (C++) calc_vs2005: VS2005 project calc client example (C++) calc_xcode: Mac OS X Xcode project calc client example (C++) chaining: Chaining multiple separately-compiled services (C) chaining++: Chaining multiple separately-compiled services (C++) databinding: Data binding example for address.xsd addressbook (C++) dime: DIME attachment client and server (C++,pthreads) dom: DOM-based calculator client (C++) factory: Remote object factory and simple ORB (C++) factorytest: Test client for remote object factory (C++) gmt: One-liner service to tell the time in GMT (C++) googleapi: Google Web API client (deprecated by Google) (C) hello: One-liner greeting service (C++) httpcookies: HTTP cookie client and server (C++) link: Linking multiple clients/services (C) link++: Linking multiple clients/services (C++) lu: Linear solver client and server (C++) magic: Magic squares client and server (C++,pthreads) mashup: Combining two services into a new service (C) mashup++: Combining two services into a new service (C++) mtom: MTOM attachment client and server (C) mtom-stream: MTOM streaming attachment client and server (C) oneway: One-way SOAP messaging event handling (C,pthreads) oneway++: One-way SOAP messaging event handling (C++,pthreads) polytest: Polymorphic object exchange (C++) rest: REST clients and services examples (C/C++) roll: One-liner roll of a dice service (C++) router: Router of HTTP messages over TCP/IP (C,pthreads) rss: RSS 0.91, 0.92, and 2.0 server (C) ssl: HTTPS/SSL example (C,pthreads,OpenSSL) template: Shows how container templates can be serialized (C++) udp: SOAP-over-UDP example client and server (C) varparam: Variable polymorphic parameters (C++) wcf: Sample client/server interop with WCF (C++) webserver: Stand-alone Web server (C,pthreads,OpenSSL,Zlib) wsa: WS-Addressing demo (C) wsrm: WS-ReliableMessaging demo (C) wsse: WS-Security demo (C,OpenSSL) xml-rpc-json: XML-RPC and JSON support and examples (C/C++) LIBRARY AND GSOAP PLUGIN SUPPORT Some of the examples require the following support libraries and plugins: plugin/threads.h/.c MS Windows threads and Posix threads wrapper plugin/cacerts.h/.c Hard-coded SSL public certificates plugin/wsaapi.h/.c WS-Addressing plugin plugin/wsseapi.h/.c WS-Security plugin DISCLAIMER WE DO OUR BEST TO PROVIDE YOU WITH REAL-WORLD EXAMPLES BUT WE CANNOT GUARANTEE THAT ALL CLIENT EXAMPLES CAN CONNECT TO THIRD PARTY WEB SERVICES WHEN THESE SERVICES ARE DOWN OR HAVE BEEN REMOVED. MAC OS X XCODE PROJECTS A Mac OS X Xcode project example is included in samples/calc_xcode. MS VS2005 PROJECTS A Visual Studio 2005 project example is included in samples/calc_vs2005. A custom build step is defined for the gSOAP header file calc.h. The custom build step invokes soapcpp2 to generate the source code for the project. Note that the step to obtain the gSOAP header file calc.h is intentionally omitted, e.g. wsdl2h is not part of this process. It is advised to run wsdl2h manually and try various wsdl2h options and typemap.dat definitions to customize the wsdl2h output. SSL WITH OPENSSL To try the SSL-secure SOAP server, install OpenSSL and change the occurrences of "linprog2.cs.fsu.edu" in sslclient.c and sslserver.c to the machine name (or machine IP) you are using. Example .pem files are included but you need to create your own .pem files (see OpenSSL documentation). The sslclient and sslserver codes can then be build as follows: soapcpp2 -c ssl.h gcc -DWITH_OPENSSL -o sslclient sslclient.c stdsoap2.c soapC.c soapClient.c -lssl -lcrypto gcc -DWITH_OPENSSL -o sslserver sslserver.c stdsoap2.c soapC.c soapServer.c -lssl -lcrypto -lpthread COPYRIGHT AND LICENSE Several examples in the 'samples' directory are distributed under GPL or commercial license. Please refer to the specific licensing comments provided in the source code files. A commercial license is available from Genivia, Inc. Please contact: contact@genivia.com gsoap-2.8.28/gsoap/samples/googleapi/0000755000175000017500000000000012653650170017014 5ustar ellertellertgsoap-2.8.28/gsoap/samples/googleapi/Makefile.in0000644000175000017500000004444312653650156021076 0ustar ellertellert# Makefile.in generated by automake 1.14 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = googleapi$(EXEEXT) DIST_COMMON = $(srcdir)/../Makefile.defines \ $(srcdir)/../Makefile.c_rules $(srcdir)/Makefile.in \ $(srcdir)/Makefile.am $(top_srcdir)/mkinstalldirs \ $(top_srcdir)/depcomp subdir = gsoap/samples/googleapi ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = am__objects_2 = soapC.$(OBJEXT) am__objects_3 = soapClient.$(OBJEXT) $(am__objects_2) am_googleapi_OBJECTS = googleapi.$(OBJEXT) $(am__objects_1) \ $(am__objects_3) googleapi_OBJECTS = $(am_googleapi_OBJECTS) am__DEPENDENCIES_1 = googleapi_DEPENDENCIES = $(SOAP_C_LIB) $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(googleapi_SOURCES) DIST_SOURCES = $(googleapi_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ STRIP = @STRIP@ VERSION = @VERSION@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 SOAPHEADER = googleapi.h AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a SOAP_C_SRC = $(SOAP_C_CLIENT) soapServer.c $(SOAP_H_FILES) $(SOAP_NS) LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_C_SRC) CLEANFILES = $(SOAP_C_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.c soapClient.c soapClientLib.c soapServer.c soapServerLib.c *~ SOAP_NS = googleapi.nsmap googleapi.wsdl googleapi_SOURCES = googleapi.c $(SOAPHEADER) $(SOAP_C_CLIENT) googleapi_LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.c_rules $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/googleapi/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/googleapi/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.c_rules: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) googleapi$(EXEEXT): $(googleapi_OBJECTS) $(googleapi_DEPENDENCIES) $(EXTRA_googleapi_DEPENDENCIES) @rm -f googleapi$(EXEEXT) $(AM_V_CCLD)$(LINK) $(googleapi_OBJECTS) $(googleapi_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/googleapi.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapC.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapClient.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am $(SOAP_C_SRC) : $(SOAPHEADER) $(SOAP) -cL -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $(SOAPHEADER) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.28/gsoap/samples/googleapi/googleapi.c0000644000175000017500000001021312653650156021127 0ustar ellertellert/* googleapi.c Google Web API Compile and run from the command line: $ googleapi [search|cached|spell] where is the Google API license key (see http://www.google.com/apis) Example command-line invocation: $ googleapi XXXXXXXX search gSOAP Software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. Copyright (C) 2002, Robert A. van Engelen, Florida State University. */ #include "soapH.h" #include "googleapi.nsmap" int main(int argc, char **argv) { char *key, *dir, *arg; struct soap soap; soap_init2(&soap, SOAP_IO_DEFAULT, SOAP_XML_TREE); if (argc <= 3) { fprintf(stderr, "Usage: googleapi search|cached|spell \n"); return 0; } key = argv[1]; dir = argv[2]; arg = argv[3]; if (!strcmp(dir, "search")) { struct api__doGoogleSearchResponse r; if (soap_call_api__doGoogleSearch(&soap, "http://api.google.com/search/beta2", "urn:GoogleSearchAction", key, arg, 0, 10, true_, "", false_, "", "latin1", "latin1", &r)) { soap_print_fault(&soap, stderr); exit(1); } else { int i; printf("documentFiltering = %d\n", (int)r._return.documentFiltering); printf("searchQuery = %s\n", r._return.searchQuery?r._return.searchQuery:""); printf("searchComments = %s\n", r._return.searchComments?r._return.searchComments:""); printf("searchTips = %s\n", r._return.searchTips); printf("searchTime = %f\n", r._return.searchTime); printf("estimatedTotalResultsCount = %d\n", r._return.estimatedTotalResultsCount); printf("estimateIsExact = %d\n", (int)r._return.estimateIsExact); printf("startIndex = %d\n", r._return.startIndex); printf("endIndex = %d\n", r._return.endIndex); printf("resultElements = \n"); for (i = 0; i < r._return.resultElements.__size; i++) { const char *s1 = r._return.resultElements.__ptr[i].summary; const char *s2 = r._return.resultElements.__ptr[i].URL; const char *s3 = r._return.resultElements.__ptr[i].snippet; const char *s4 = r._return.resultElements.__ptr[i].title; const char *s5 = r._return.resultElements.__ptr[i].cachedSize; const char *s6 = r._return.resultElements.__ptr[i].directoryTitle; /* skipped printing of directoryCategory field */ printf("[%3d]\tSummary = %s\n", i+1, s1?s1:""); printf("\ttitle = %s\n", s4?s4:""); printf("\tURL = %s\n", s2?s2:""); printf("\tsnippet = %s\n", s3?s3:""); printf("\tcachedSize = %s\n", s5?s5:""); printf("\trelatedInfo = %d\n", (int)r._return.resultElements.__ptr[i].relatedInformationPresent); printf("\tdirectoryTitle = %s\n", s6?s6:""); } printf("directoryCategories = \n"); for (i = 0; i < r._return.directoryCategories.__size; i++) { const char *s1 = r._return.directoryCategories.__ptr[i].fullViewableName; const char *s2 = r._return.directoryCategories.__ptr[i].specialEncoding; printf("\t%s\t%s\n", s1?s1:"", s2?s2:""); } } } else if (!strcmp(dir, "cached")) { struct xsd__base64Binary r; if (soap_call_api__doGetCachedPage(&soap, "http://api.google.com/search/beta2", "urn:GoogleSearchAction", key, arg, &r)) { soap_print_fault(&soap, stderr); exit(1); } else { int i; for (i = 0; i < r.__size; i++) putchar(r.__ptr[i]); putchar('\n'); } } else if (!strcmp(dir, "spell")) { char *r; if (soap_call_api__doSpellingSuggestion(&soap, "http://api.google.com/search/beta2", "urn:GoogleSearchAction", key, arg, &r)) { soap_print_fault(&soap, stderr); exit(1); } else printf("Suggested spelling: %s\n", r?r:""); } else fprintf(stderr, "Unknown directive\n"); /* remove all temporary and deserialized data */ soap_end(&soap); /* detach run-time engine and context */ soap_done(&soap); return 0; } gsoap-2.8.28/gsoap/samples/googleapi/googleapi.h0000644000175000017500000000430512653650156021141 0ustar ellertellert/* googleapi.h Google Web APIs Note: the Google API server needs typed messages. Use soapcpp2 -t to generated serialization code for typed xsi:type messages. The '//gsoapopt t' directive is also sufficient. */ //gsoapopt t //gsoap api service name: googleapi //gsoap api service style: rpc //gsoap api service encoding: encoded //gsoap api service location: http://api.google.com/search/beta2 //gsoap api service namespace: urn:GoogleSearch typedef char * xsd__string; // C++ alternative for xsd:boolean: // typedef bool xsd__boolean; // pure C alternative is: typedef enum {false_, true_} xsd__boolean; typedef int xsd__int; typedef double xsd__double; struct xsd__base64Binary { unsigned char * __ptr; int __size; }; struct api__DirectoryCategory { xsd__string fullViewableName; xsd__string specialEncoding; }; struct DirectoryCategoryArray { struct api__DirectoryCategory * __ptr; int __size; }; struct api__ResultElement { xsd__string summary; xsd__string URL; xsd__string snippet; xsd__string title; xsd__string cachedSize; xsd__boolean relatedInformationPresent; xsd__string hostName; struct api__DirectoryCategory directoryCategory; xsd__string directoryTitle; }; struct ResultElementArray { struct api__ResultElement * __ptr; int __size; }; struct api__GoogleSearchResult { xsd__boolean documentFiltering; xsd__string searchComments; xsd__int estimatedTotalResultsCount; xsd__boolean estimateIsExact; struct ResultElementArray resultElements; xsd__string searchQuery; xsd__int startIndex; xsd__int endIndex; xsd__string searchTips; struct DirectoryCategoryArray directoryCategories; xsd__double searchTime; }; api__doGoogleSearch ( xsd__string key, xsd__string q, xsd__int start, xsd__int maxResults, xsd__boolean filter, xsd__string restrict_, xsd__boolean safeSearch, xsd__string lr, xsd__string ie, xsd__string oe, struct api__doGoogleSearchResponse { struct api__GoogleSearchResult _return; } *response ); api__doGetCachedPage ( xsd__string key, xsd__string url, struct xsd__base64Binary *_return ); api__doSpellingSuggestion ( xsd__string key, xsd__string phrase, xsd__string *_return ); gsoap-2.8.28/gsoap/samples/googleapi/README.txt0000644000175000017500000000053212653650156020516 0ustar ellertellertGoogle API Web service example client application. The Google API service provides a SOAP interface to the Google search engine. The Google API SOAP server requires typed messages (xsi:type). The soapcpp2 option -t is used to generate the necessary type-enabled serializers. Google discontinued the distribution of keys for their API service. gsoap-2.8.28/gsoap/samples/googleapi/Makefile.am0000644000175000017500000000077612653650156021066 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 noinst_PROGRAMS = googleapi SOAPHEADER = googleapi.h include ../Makefile.defines include ../Makefile.c_rules SOAP_NS = googleapi.nsmap googleapi.wsdl googleapi_SOURCES = googleapi.c $(SOAPHEADER) $(SOAP_C_CLIENT) googleapi_LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) gsoap-2.8.28/gsoap/samples/Makefile.defines0000644000175000017500000000145712653650156020135 0ustar ellertellert## common defines for Makefiles for the gsoap samples ## AM_CFLAGS=-D$(platform) AM_CXXFLAGS=-D$(platform) CPPFLAGS=$(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin SOAP=$(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF=ns.nsmap ns.wsdl SOAP_H_FILES=soapH.h soapStub.h SOAP_C_CORE=soapC.c SOAP_C_CLIENT=soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER=soapServer.c $(SOAP_C_CORE) SOAP_C_LIB=$(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK=$(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL=$(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE=soapC.cpp SOAP_CPP_CLIENT=soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER=soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB=$(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK=$(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL=$(top_builddir)/gsoap/libgsoapssl++.a gsoap-2.8.28/gsoap/samples/ssl/0000755000175000017500000000000012653650172015651 5ustar ellertellertgsoap-2.8.28/gsoap/samples/ssl/ssl.wsdl0000644000175000017500000000444612653650156017357 0ustar ellertellert Service definition of function ns__add gSOAP 2.8.28 generated service definition gsoap-2.8.28/gsoap/samples/ssl/Makefile.in0000644000175000017500000010067112653650156017725 0ustar ellertellert# Makefile.in generated by automake 1.14 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = sslclient$(EXEEXT) sslserver$(EXEEXT) DIST_COMMON = $(srcdir)/../Makefile.defines \ $(srcdir)/../Makefile.c_rules $(srcdir)/Makefile.in \ $(srcdir)/Makefile.am $(top_srcdir)/mkinstalldirs \ $(top_srcdir)/depcomp subdir = gsoap/samples/ssl ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = am__objects_2 = sslclient-soapC.$(OBJEXT) am__objects_3 = sslclient-soapClient.$(OBJEXT) $(am__objects_2) am_sslclient_OBJECTS = sslclient-sslclient.$(OBJEXT) $(am__objects_1) \ $(am__objects_3) sslclient_OBJECTS = $(am_sslclient_OBJECTS) am__DEPENDENCIES_1 = sslclient_DEPENDENCIES = $(SOAP_C_LIB_SSL) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) sslclient_LINK = $(CCLD) $(sslclient_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ am__objects_4 = sslserver-soapC.$(OBJEXT) am__objects_5 = sslserver-soapServer.$(OBJEXT) $(am__objects_4) am_sslserver_OBJECTS = sslserver-sslserver.$(OBJEXT) $(am__objects_1) \ $(am__objects_5) sslserver-threads.$(OBJEXT) sslserver_OBJECTS = $(am_sslserver_OBJECTS) sslserver_DEPENDENCIES = $(SOAP_C_LIB_SSL) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) sslserver_LINK = $(CCLD) $(sslserver_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(sslclient_SOURCES) $(sslserver_SOURCES) DIST_SOURCES = $(sslclient_SOURCES) $(sslserver_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ STRIP = @STRIP@ VERSION = @VERSION@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = foreign 1.4 SOAPHEADER = ssl.h AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a SOAP_C_SRC = $(SOAP_C_CLIENT) soapServer.c $(SOAP_H_FILES) $(SOAP_NS) LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_C_SRC) CLEANFILES = $(SOAP_C_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.c soapClient.c soapClientLib.c soapServer.c soapServerLib.c *~ SOAP_NS = $(SOAP_NS_DEF) sslclient_CFLAGS = -DWITH_OPENSSL -DWITH_GZIP sslclient_SOURCES = sslclient.c $(SOAPHEADER) $(SOAP_C_CLIENT) sslclient_LDADD = $(SOAP_C_LIB_SSL) $(SAMPLE_EXTRA_LIBS) $(SAMPLE_SSL_LIBS) -lpthread sslserver_CFLAGS = -DWITH_OPENSSL -DWITH_GZIP sslserver_SOURCES = sslserver.c $(SOAPHEADER) $(SOAP_C_SERVER) ../../plugin/threads.c sslserver_LDADD = $(SOAP_C_LIB_SSL) $(SAMPLE_EXTRA_LIBS) $(SAMPLE_SSL_LIBS) -lpthread all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.c_rules $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/ssl/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/ssl/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.c_rules: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) sslclient$(EXEEXT): $(sslclient_OBJECTS) $(sslclient_DEPENDENCIES) $(EXTRA_sslclient_DEPENDENCIES) @rm -f sslclient$(EXEEXT) $(AM_V_CCLD)$(sslclient_LINK) $(sslclient_OBJECTS) $(sslclient_LDADD) $(LIBS) sslserver$(EXEEXT): $(sslserver_OBJECTS) $(sslserver_DEPENDENCIES) $(EXTRA_sslserver_DEPENDENCIES) @rm -f sslserver$(EXEEXT) $(AM_V_CCLD)$(sslserver_LINK) $(sslserver_OBJECTS) $(sslserver_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sslclient-soapC.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sslclient-soapClient.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sslclient-sslclient.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sslserver-soapC.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sslserver-soapServer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sslserver-sslserver.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sslserver-threads.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` sslclient-sslclient.o: sslclient.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sslclient_CFLAGS) $(CFLAGS) -MT sslclient-sslclient.o -MD -MP -MF $(DEPDIR)/sslclient-sslclient.Tpo -c -o sslclient-sslclient.o `test -f 'sslclient.c' || echo '$(srcdir)/'`sslclient.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sslclient-sslclient.Tpo $(DEPDIR)/sslclient-sslclient.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sslclient.c' object='sslclient-sslclient.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sslclient_CFLAGS) $(CFLAGS) -c -o sslclient-sslclient.o `test -f 'sslclient.c' || echo '$(srcdir)/'`sslclient.c sslclient-sslclient.obj: sslclient.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sslclient_CFLAGS) $(CFLAGS) -MT sslclient-sslclient.obj -MD -MP -MF $(DEPDIR)/sslclient-sslclient.Tpo -c -o sslclient-sslclient.obj `if test -f 'sslclient.c'; then $(CYGPATH_W) 'sslclient.c'; else $(CYGPATH_W) '$(srcdir)/sslclient.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sslclient-sslclient.Tpo $(DEPDIR)/sslclient-sslclient.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sslclient.c' object='sslclient-sslclient.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sslclient_CFLAGS) $(CFLAGS) -c -o sslclient-sslclient.obj `if test -f 'sslclient.c'; then $(CYGPATH_W) 'sslclient.c'; else $(CYGPATH_W) '$(srcdir)/sslclient.c'; fi` sslclient-soapClient.o: soapClient.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sslclient_CFLAGS) $(CFLAGS) -MT sslclient-soapClient.o -MD -MP -MF $(DEPDIR)/sslclient-soapClient.Tpo -c -o sslclient-soapClient.o `test -f 'soapClient.c' || echo '$(srcdir)/'`soapClient.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sslclient-soapClient.Tpo $(DEPDIR)/sslclient-soapClient.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapClient.c' object='sslclient-soapClient.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sslclient_CFLAGS) $(CFLAGS) -c -o sslclient-soapClient.o `test -f 'soapClient.c' || echo '$(srcdir)/'`soapClient.c sslclient-soapClient.obj: soapClient.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sslclient_CFLAGS) $(CFLAGS) -MT sslclient-soapClient.obj -MD -MP -MF $(DEPDIR)/sslclient-soapClient.Tpo -c -o sslclient-soapClient.obj `if test -f 'soapClient.c'; then $(CYGPATH_W) 'soapClient.c'; else $(CYGPATH_W) '$(srcdir)/soapClient.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sslclient-soapClient.Tpo $(DEPDIR)/sslclient-soapClient.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapClient.c' object='sslclient-soapClient.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sslclient_CFLAGS) $(CFLAGS) -c -o sslclient-soapClient.obj `if test -f 'soapClient.c'; then $(CYGPATH_W) 'soapClient.c'; else $(CYGPATH_W) '$(srcdir)/soapClient.c'; fi` sslclient-soapC.o: soapC.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sslclient_CFLAGS) $(CFLAGS) -MT sslclient-soapC.o -MD -MP -MF $(DEPDIR)/sslclient-soapC.Tpo -c -o sslclient-soapC.o `test -f 'soapC.c' || echo '$(srcdir)/'`soapC.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sslclient-soapC.Tpo $(DEPDIR)/sslclient-soapC.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapC.c' object='sslclient-soapC.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sslclient_CFLAGS) $(CFLAGS) -c -o sslclient-soapC.o `test -f 'soapC.c' || echo '$(srcdir)/'`soapC.c sslclient-soapC.obj: soapC.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sslclient_CFLAGS) $(CFLAGS) -MT sslclient-soapC.obj -MD -MP -MF $(DEPDIR)/sslclient-soapC.Tpo -c -o sslclient-soapC.obj `if test -f 'soapC.c'; then $(CYGPATH_W) 'soapC.c'; else $(CYGPATH_W) '$(srcdir)/soapC.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sslclient-soapC.Tpo $(DEPDIR)/sslclient-soapC.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapC.c' object='sslclient-soapC.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sslclient_CFLAGS) $(CFLAGS) -c -o sslclient-soapC.obj `if test -f 'soapC.c'; then $(CYGPATH_W) 'soapC.c'; else $(CYGPATH_W) '$(srcdir)/soapC.c'; fi` sslserver-sslserver.o: sslserver.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sslserver_CFLAGS) $(CFLAGS) -MT sslserver-sslserver.o -MD -MP -MF $(DEPDIR)/sslserver-sslserver.Tpo -c -o sslserver-sslserver.o `test -f 'sslserver.c' || echo '$(srcdir)/'`sslserver.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sslserver-sslserver.Tpo $(DEPDIR)/sslserver-sslserver.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sslserver.c' object='sslserver-sslserver.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sslserver_CFLAGS) $(CFLAGS) -c -o sslserver-sslserver.o `test -f 'sslserver.c' || echo '$(srcdir)/'`sslserver.c sslserver-sslserver.obj: sslserver.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sslserver_CFLAGS) $(CFLAGS) -MT sslserver-sslserver.obj -MD -MP -MF $(DEPDIR)/sslserver-sslserver.Tpo -c -o sslserver-sslserver.obj `if test -f 'sslserver.c'; then $(CYGPATH_W) 'sslserver.c'; else $(CYGPATH_W) '$(srcdir)/sslserver.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sslserver-sslserver.Tpo $(DEPDIR)/sslserver-sslserver.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sslserver.c' object='sslserver-sslserver.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sslserver_CFLAGS) $(CFLAGS) -c -o sslserver-sslserver.obj `if test -f 'sslserver.c'; then $(CYGPATH_W) 'sslserver.c'; else $(CYGPATH_W) '$(srcdir)/sslserver.c'; fi` sslserver-soapServer.o: soapServer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sslserver_CFLAGS) $(CFLAGS) -MT sslserver-soapServer.o -MD -MP -MF $(DEPDIR)/sslserver-soapServer.Tpo -c -o sslserver-soapServer.o `test -f 'soapServer.c' || echo '$(srcdir)/'`soapServer.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sslserver-soapServer.Tpo $(DEPDIR)/sslserver-soapServer.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapServer.c' object='sslserver-soapServer.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sslserver_CFLAGS) $(CFLAGS) -c -o sslserver-soapServer.o `test -f 'soapServer.c' || echo '$(srcdir)/'`soapServer.c sslserver-soapServer.obj: soapServer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sslserver_CFLAGS) $(CFLAGS) -MT sslserver-soapServer.obj -MD -MP -MF $(DEPDIR)/sslserver-soapServer.Tpo -c -o sslserver-soapServer.obj `if test -f 'soapServer.c'; then $(CYGPATH_W) 'soapServer.c'; else $(CYGPATH_W) '$(srcdir)/soapServer.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sslserver-soapServer.Tpo $(DEPDIR)/sslserver-soapServer.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapServer.c' object='sslserver-soapServer.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sslserver_CFLAGS) $(CFLAGS) -c -o sslserver-soapServer.obj `if test -f 'soapServer.c'; then $(CYGPATH_W) 'soapServer.c'; else $(CYGPATH_W) '$(srcdir)/soapServer.c'; fi` sslserver-soapC.o: soapC.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sslserver_CFLAGS) $(CFLAGS) -MT sslserver-soapC.o -MD -MP -MF $(DEPDIR)/sslserver-soapC.Tpo -c -o sslserver-soapC.o `test -f 'soapC.c' || echo '$(srcdir)/'`soapC.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sslserver-soapC.Tpo $(DEPDIR)/sslserver-soapC.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapC.c' object='sslserver-soapC.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sslserver_CFLAGS) $(CFLAGS) -c -o sslserver-soapC.o `test -f 'soapC.c' || echo '$(srcdir)/'`soapC.c sslserver-soapC.obj: soapC.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sslserver_CFLAGS) $(CFLAGS) -MT sslserver-soapC.obj -MD -MP -MF $(DEPDIR)/sslserver-soapC.Tpo -c -o sslserver-soapC.obj `if test -f 'soapC.c'; then $(CYGPATH_W) 'soapC.c'; else $(CYGPATH_W) '$(srcdir)/soapC.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sslserver-soapC.Tpo $(DEPDIR)/sslserver-soapC.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapC.c' object='sslserver-soapC.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sslserver_CFLAGS) $(CFLAGS) -c -o sslserver-soapC.obj `if test -f 'soapC.c'; then $(CYGPATH_W) 'soapC.c'; else $(CYGPATH_W) '$(srcdir)/soapC.c'; fi` sslserver-threads.o: ../../plugin/threads.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sslserver_CFLAGS) $(CFLAGS) -MT sslserver-threads.o -MD -MP -MF $(DEPDIR)/sslserver-threads.Tpo -c -o sslserver-threads.o `test -f '../../plugin/threads.c' || echo '$(srcdir)/'`../../plugin/threads.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sslserver-threads.Tpo $(DEPDIR)/sslserver-threads.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/threads.c' object='sslserver-threads.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sslserver_CFLAGS) $(CFLAGS) -c -o sslserver-threads.o `test -f '../../plugin/threads.c' || echo '$(srcdir)/'`../../plugin/threads.c sslserver-threads.obj: ../../plugin/threads.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sslserver_CFLAGS) $(CFLAGS) -MT sslserver-threads.obj -MD -MP -MF $(DEPDIR)/sslserver-threads.Tpo -c -o sslserver-threads.obj `if test -f '../../plugin/threads.c'; then $(CYGPATH_W) '../../plugin/threads.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/threads.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sslserver-threads.Tpo $(DEPDIR)/sslserver-threads.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/threads.c' object='sslserver-threads.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sslserver_CFLAGS) $(CFLAGS) -c -o sslserver-threads.obj `if test -f '../../plugin/threads.c'; then $(CYGPATH_W) '../../plugin/threads.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/threads.c'; fi` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am $(SOAP_C_SRC) : $(SOAPHEADER) $(SOAP) -cL -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $(SOAPHEADER) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.28/gsoap/samples/ssl/cert.sh0000644000175000017500000000313612653650156017147 0ustar ellertellert#!/bin/sh if [ "$#" = 1 ] then echo "* This utility create certificate ${1}.pem signed by the root CA:" echo " ${1}cert.pem - public key (CA-signed certificate to be shared)" echo " ${1}key.pem - private key (keep this secret)" echo " ${1}.pem - private key bundled with certificates (keep secret)" echo "* Distribute the CA root cacert.pem (and/or ${1}cert.pem when needed)" echo "* Before using this utility, create a root CA root.pem using root.sh" echo "* Keep ${1}.pem key file secret: store locally with client/server app" echo "*" echo "* Enter a secret pass phrase when requested" echo "* The pass phrase is used to access ${1}.pem in your application" echo "* Enter the server's host name as the Common Name when requested" echo "* Enter the root CA pass phrase (Getting CA Private Key) to sign the key file" echo "* The key file will expire after three years or when the root CA expires" # Create a certificate and signing request openssl req -newkey rsa:1024 -sha1 -keyout ${1}key.pem -out ${1}req.pem # Sign the certificate with the root CA openssl x509 -req -in ${1}req.pem -sha1 -extfile openssl.cnf -extensions usr_cert -CA root.pem -CAkey root.pem -CAcreateserial -out ${1}cert.pem -days 1095 # Bundle the CA certificate cacert with the certificate file cat ${1}cert.pem cacert.pem > ${1}tmp.pem mv -f ${1}tmp.pem ${1}cert.pem # Bundle certificates with the private key file cat ${1}key.pem ${1}cert.pem > ${1}.pem # Show what we got openssl x509 -subject -issuer -dates -noout -in ${1}.pem else echo "Usage: cert.sh " exit 1 fi gsoap-2.8.28/gsoap/samples/ssl/server.pem0000644000175000017500000000724212653650156017671 0ustar ellertellert-----BEGIN ENCRYPTED PRIVATE KEY----- MIICxjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQI74Clf0036IICAggA MBQGCCqGSIb3DQMHBAiOmGBFtHOX0wSCAoAPb8WN47mTunpkPpzBSNd4i+qX1f4V XyFMWxdibGTclHfNesksWkg38E0nt9ORMImgvpKIHgQ2l+dt725uAoRhtuva7N2R kQKkJOtbzlxbgmi0QylcaEZYCw/OLsL0sH0xaoJDJsjwF74RAu4CJ7XVPR+ldPb9 hWSPb9KIkAe779KChZUaEkDa61ce0Bh7hSztjXYKqwI4W+xB0hv32dkwiap74mxr qw8fqu64+jj2UipUG0FVkruuYy0bW8Nh1P4aGIIKpFjjNBaHQoHWuluh0jDI7cpT A0Sfyg1teEtbBJgF2ebej6f7AHMHq2PuPo/nWzb2d6Akkc3q1Ab44yUeRgPhNTxA glhjoCSOOIFm2YfBh22A1h3JHDyr4INptSnlPl4lMMFYLS/JmJ+zg0cUTK53uY91 ncBtu6odT69Vxb/z5X3LIhjqJS6oSXDoFMlHxLkFyLamjPBgtvNSnlLQPWsrwpUd Fsl94W7OxIu4U711xMBbkYbYhLOAQ3KlF1GbYIyfOcQbvJ8UsXu959WJK6bQ0+ud XcnmQFZnEoxtDMcSCqcZfbcTasHGvrp4pBpxUyPNC5AUnLXsIg5QaplO7i5atrT/ e/I/jPA7AefUol5s8fyDKbKNBfuPk6VTvtIXKEGP8vKf5ZRai6HhhoE0pbEsNdSD CVfESYrTfgXf2h1gvSunWwDMbC/AaaNjjoHBTLQJfCbvacqK9zz/8o/BFEUWi/30 KeqA5pnlKIRL2nblWcKZE9xSKomsZqch7xTK5m9FUxAwwlAAVM5kwgiaFGEgrAO2 pFP9pJxZzxThlxQi2EgyHUoGqPjdPNFVuhBEcyIhVZp86qoikNoxtdBE -----END ENCRYPTED PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIID4TCCA0qgAwIBAgIBHzANBgkqhkiG9w0BAQUFADCBjTELMAkGA1UEBhMCVVMx CzAJBgNVBAgTAkZMMRQwEgYDVQQHEwtUYWxsYWhhc3NlZTEWMBQGA1UEChMNR2Vu aXZpYSwgSW5jLjELMAkGA1UECxMCSVQxEjAQBgNVBAMTCWxvY2FsaG9zdDEiMCAG CSqGSIb3DQEJARYTY29udGFjdEBnZW5pdmlhLmNvbTAeFw0xNTA4MDQxOTAzNDda Fw0xODA4MDMxOTAzNDdaMIGNMQswCQYDVQQGEwJVUzELMAkGA1UECBMCRkwxFDAS BgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYDVQQKEw1HZW5pdmlhLCBJbmMuMQswCQYD VQQLEwJJVDESMBAGA1UEAxMJbG9jYWxob3N0MSIwIAYJKoZIhvcNAQkBFhNjb250 YWN0QGdlbml2aWEuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC4J9vn Sde1q+Pyvgs4QUPiNKnqezL0Cqp1vA7gfUJ31Q/0071gkgMSX/DL+SZPjRSfEjA1 c9JyPjSdeZ5zydAz9f5R680Nvs8VKR9MsB3/XAnI3Rhd9G11QHXuW7DsaF6TXHNk EoipcN7ebie9eeqadv8xzhvTBHBE8rkf8iMI2QIDAQABo4IBTTCCAUkwCQYDVR0T BAIwADALBgNVHQ8EBAMCBPAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMC MCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAd BgNVHQ4EFgQUYJXHvmkvx1zc7GjmBJ9G0YQpKSgwgcIGA1UdIwSBujCBt4AU+MeC gLt+4soPx4i3OiBZYwMqlNChgZOkgZAwgY0xCzAJBgNVBAYTAlVTMQswCQYDVQQI EwJGTDEUMBIGA1UEBxMLVGFsbGFoYXNzZWUxFjAUBgNVBAoTDUdlbml2aWEsIElu Yy4xCzAJBgNVBAsTAklUMRIwEAYDVQQDEwlsb2NhbGhvc3QxIjAgBgkqhkiG9w0B CQEWE2NvbnRhY3RAZ2VuaXZpYS5jb22CCQDWdgbFTLQbVTANBgkqhkiG9w0BAQUF AAOBgQCNUuW182UC2YqBE3oEtwaguyYWOR5aZIUE4znV9thu7xBZhCoFhukmQX0L TwoSiW7Yt7vx0cUL4RQltT4D225ANhogdmBh0JmIXc60DtpnCs43IjTT1moUwx6T M51IxVIgksklJuo7UIILrYWlIR3GjDWGOEpQQmQhoLS10lVAyQ== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDkDCCAvmgAwIBAgIJANZ2BsVMtBtVMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYD VQQGEwJVUzELMAkGA1UECBMCRkwxFDASBgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYD VQQKEw1HZW5pdmlhLCBJbmMuMQswCQYDVQQLEwJJVDESMBAGA1UEAxMJbG9jYWxo b3N0MSIwIAYJKoZIhvcNAQkBFhNjb250YWN0QGdlbml2aWEuY29tMB4XDTE1MDgw NDE5MDEyMFoXDTE4MDgwMzE5MDEyMFowgY0xCzAJBgNVBAYTAlVTMQswCQYDVQQI EwJGTDEUMBIGA1UEBxMLVGFsbGFoYXNzZWUxFjAUBgNVBAoTDUdlbml2aWEsIElu Yy4xCzAJBgNVBAsTAklUMRIwEAYDVQQDEwlsb2NhbGhvc3QxIjAgBgkqhkiG9w0B CQEWE2NvbnRhY3RAZ2VuaXZpYS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJ AoGBALx/LiwGRi4wH8y0MEL64VJs5H2O1F4uuYO+aNVZHl5ULRDmSh/4eF8aOYXT B05PfVoctBogcK0ohPEhiUcR/029LQTkEs/5D7XsuRuQsUnMfkEihmC2VtEuJMqT OeXmuIcemEw0QL3ulny7H8W6Aq2rByC2r5iqytnM4Uuw7LMnAgMBAAGjgfUwgfIw HQYDVR0OBBYEFPjHgoC7fuLKD8eItzogWWMDKpTQMIHCBgNVHSMEgbowgbeAFPjH goC7fuLKD8eItzogWWMDKpTQoYGTpIGQMIGNMQswCQYDVQQGEwJVUzELMAkGA1UE CBMCRkwxFDASBgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYDVQQKEw1HZW5pdmlhLCBJ bmMuMQswCQYDVQQLEwJJVDESMBAGA1UEAxMJbG9jYWxob3N0MSIwIAYJKoZIhvcN AQkBFhNjb250YWN0QGdlbml2aWEuY29tggkA1nYGxUy0G1UwDAYDVR0TBAUwAwEB /zANBgkqhkiG9w0BAQUFAAOBgQB+fmbScGp3R4D0Sf4gbBJ/3CGEn4/HvupSikDq vyaviwJ2KQKGlAr/lDh1qSYItkazJpJDIxyG2Dzm2w0F0u1+CSwpym6eq1pxc8dh GRdrCVyuM0gUoBvxUym7o0Bq1V6onUjwrAti+onsZjDpfAIKBI8TRfjuTNzFeSAV G2zULg== -----END CERTIFICATE----- gsoap-2.8.28/gsoap/samples/ssl/client.pem0000644000175000017500000000724212653650156017641 0ustar ellertellert-----BEGIN ENCRYPTED PRIVATE KEY----- MIICxjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQICWRtmv3QhOwCAggA MBQGCCqGSIb3DQMHBAhGNsH9x+5NFASCAoCpz7lm6a8z2MtoP9CfXzAbcmPHVamE jJ+tmrL0sw1pTgwYUOibMF7owTTXTzKqndg/rp8PbG57FmkC6/Ka48Dr2pDmobR+ imfjX8Mx2Zc6o6c31ZA/gcQiNHY2rKOxmsfog85zejw0NFZx4o7bb9wqwNPKnc0w OoU/xgrhbSamPAZDXO9QWd6pceXPyLQ4To2hKq6TxsOCsqsSCawlAA/RogaA9eN6 NSi9I85UuxzQgClZRzKy0v3BC2Lx71YN/p6MIhr4i4inbnlEkRqFDkg+b9u6Hydm dIDvAcoHOildgaSG2Thc+2n5qf22SWbOTi/z/pb0PIcp1t2aDYWlR6AxLyX5+RfU GSXFdw/9Br8adr4NZeXGdvUSWcQAGP+Bbk520oGSvNkAyZVd/SmLS+EGdYsOQoMW GJGtKWPXuOYIzffoTrdLYQ8sm3TPjyf9eufvBy2EVq8Az8cRlfjB4XLaoRJo0PZ1 If5HbCft0H8isPLBpMPbi93/TAWi8xM/p4ktSbP/qpKsg85TPiMSprZJu8srVEQm v79HYr2tW4D2ymEArzVASBn3AopMcQ51FwWg4RXDZi2y8Sw+TBDx2jY0J5kK8gob 51STpQ7+sM5Il63DpYo6JSOIeDLWzM5a7/vMI/H9EGuEbXxEShWdlwyl8jzTIj30 b+M6ShiAHPf1Ns1bCPYb52GotL8dwvoCgGMIjey5er0Pz4n+MAtqVY3qwQZSRwBF skZszTBbWDb/GsFiiP8KASRA5twkZo52Q5MIBnnqcRi391SeBRxEVmnKJoulIUfF ved40dj8pyVK/Bj54lvv1zUAFZcx03b3d7Fl4l3EohHvSyykIuEbg4EH -----END ENCRYPTED PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIID4TCCA0qgAwIBAgIBHjANBgkqhkiG9w0BAQUFADCBjTELMAkGA1UEBhMCVVMx CzAJBgNVBAgTAkZMMRQwEgYDVQQHEwtUYWxsYWhhc3NlZTEWMBQGA1UEChMNR2Vu aXZpYSwgSW5jLjELMAkGA1UECxMCSVQxEjAQBgNVBAMTCWxvY2FsaG9zdDEiMCAG CSqGSIb3DQEJARYTY29udGFjdEBnZW5pdmlhLmNvbTAeFw0xNTA4MDQxOTAzMTZa Fw0xODA4MDMxOTAzMTZaMIGNMQswCQYDVQQGEwJVUzELMAkGA1UECBMCRkwxFDAS BgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYDVQQKEw1HZW5pdmlhLCBJbmMuMQswCQYD VQQLEwJJVDESMBAGA1UEAxMJbG9jYWxob3N0MSIwIAYJKoZIhvcNAQkBFhNjb250 YWN0QGdlbml2aWEuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC1KFPq 9x2mB6pLpHOTTr1MjAb/NL1For9p78INDFgdr0qfvv1ADTRDGtIgzpPBzJlJ2Cdi fWbn4+0I3LzY3n2n5GVSjhH6bJcXwRtPJRL9JHIjqKnWTWH9lTpT9DtOd1NfqLN4 /YEbUpOBWRyF7StZXdvc/RjehYslZFWN0QjnaQIDAQABo4IBTTCCAUkwCQYDVR0T BAIwADALBgNVHQ8EBAMCBPAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMC MCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAd BgNVHQ4EFgQUNIRI7RyXyWIAH1L4KFDCRvgAozAwgcIGA1UdIwSBujCBt4AU+MeC gLt+4soPx4i3OiBZYwMqlNChgZOkgZAwgY0xCzAJBgNVBAYTAlVTMQswCQYDVQQI EwJGTDEUMBIGA1UEBxMLVGFsbGFoYXNzZWUxFjAUBgNVBAoTDUdlbml2aWEsIElu Yy4xCzAJBgNVBAsTAklUMRIwEAYDVQQDEwlsb2NhbGhvc3QxIjAgBgkqhkiG9w0B CQEWE2NvbnRhY3RAZ2VuaXZpYS5jb22CCQDWdgbFTLQbVTANBgkqhkiG9w0BAQUF AAOBgQCi4vLlE4pq+tHdL54NmHqcl+Ls2mb1MghjwwDz6McDCEV+uIzREXGq8ocw KxjBrI5iNiT0dPnSOEIyyGdQxJCUzwqHibHg3DjmOwPKXmo+Dq05nsAeTr4J/66r eMCzvxxtZwIgbidIkDsOzU54b5nle04E77YGKUc98Q3qkRGkwQ== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDkDCCAvmgAwIBAgIJANZ2BsVMtBtVMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYD VQQGEwJVUzELMAkGA1UECBMCRkwxFDASBgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYD VQQKEw1HZW5pdmlhLCBJbmMuMQswCQYDVQQLEwJJVDESMBAGA1UEAxMJbG9jYWxo b3N0MSIwIAYJKoZIhvcNAQkBFhNjb250YWN0QGdlbml2aWEuY29tMB4XDTE1MDgw NDE5MDEyMFoXDTE4MDgwMzE5MDEyMFowgY0xCzAJBgNVBAYTAlVTMQswCQYDVQQI EwJGTDEUMBIGA1UEBxMLVGFsbGFoYXNzZWUxFjAUBgNVBAoTDUdlbml2aWEsIElu Yy4xCzAJBgNVBAsTAklUMRIwEAYDVQQDEwlsb2NhbGhvc3QxIjAgBgkqhkiG9w0B CQEWE2NvbnRhY3RAZ2VuaXZpYS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJ AoGBALx/LiwGRi4wH8y0MEL64VJs5H2O1F4uuYO+aNVZHl5ULRDmSh/4eF8aOYXT B05PfVoctBogcK0ohPEhiUcR/029LQTkEs/5D7XsuRuQsUnMfkEihmC2VtEuJMqT OeXmuIcemEw0QL3ulny7H8W6Aq2rByC2r5iqytnM4Uuw7LMnAgMBAAGjgfUwgfIw HQYDVR0OBBYEFPjHgoC7fuLKD8eItzogWWMDKpTQMIHCBgNVHSMEgbowgbeAFPjH goC7fuLKD8eItzogWWMDKpTQoYGTpIGQMIGNMQswCQYDVQQGEwJVUzELMAkGA1UE CBMCRkwxFDASBgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYDVQQKEw1HZW5pdmlhLCBJ bmMuMQswCQYDVQQLEwJJVDESMBAGA1UEAxMJbG9jYWxob3N0MSIwIAYJKoZIhvcN AQkBFhNjb250YWN0QGdlbml2aWEuY29tggkA1nYGxUy0G1UwDAYDVR0TBAUwAwEB /zANBgkqhkiG9w0BAQUFAAOBgQB+fmbScGp3R4D0Sf4gbBJ/3CGEn4/HvupSikDq vyaviwJ2KQKGlAr/lDh1qSYItkazJpJDIxyG2Dzm2w0F0u1+CSwpym6eq1pxc8dh GRdrCVyuM0gUoBvxUym7o0Bq1V6onUjwrAti+onsZjDpfAIKBI8TRfjuTNzFeSAV G2zULg== -----END CERTIFICATE----- gsoap-2.8.28/gsoap/samples/ssl/dh2048.pem0000644000175000017500000000065012653650156017270 0ustar ellertellert-----BEGIN DH PARAMETERS----- MIIBCAKCAQEA9R6X6I4D0/ZC7MgiaVKdzQLQyAexIr6UlBxiWIO8v1YiGHfuc8xN YnBMWkbGfJu7a0kC/qApeLYVsPu5FYFvoGHX9InmyYaS31R/5sgB+zBRwuPSyAjF u0rlIGPIlb4avmUVdMWGZej0BHiB52eBP4ySKAg3eh0lUQxZUpnnZ9AlvoD6VuXj hnwaeE2pSEMmhnNEW3EgrfikwxUSiSAzfeR1cIehhU09O+0IUl5X8dtZ5ngcQNr2 k44bHefFIubaOjLKgaiTuqd8MRW3BIX/WG/5D5lI1TZBfGSsuA6gbXLbgWfvlvaB cNKQ0gNc4OCKPu8GW0QTTDY7ZWKstPuDEwIBAg== -----END DH PARAMETERS----- gsoap-2.8.28/gsoap/samples/ssl/servercert.pem0000644000175000017500000000522112653650156020542 0ustar ellertellert-----BEGIN CERTIFICATE----- MIID4TCCA0qgAwIBAgIBHzANBgkqhkiG9w0BAQUFADCBjTELMAkGA1UEBhMCVVMx CzAJBgNVBAgTAkZMMRQwEgYDVQQHEwtUYWxsYWhhc3NlZTEWMBQGA1UEChMNR2Vu aXZpYSwgSW5jLjELMAkGA1UECxMCSVQxEjAQBgNVBAMTCWxvY2FsaG9zdDEiMCAG CSqGSIb3DQEJARYTY29udGFjdEBnZW5pdmlhLmNvbTAeFw0xNTA4MDQxOTAzNDda Fw0xODA4MDMxOTAzNDdaMIGNMQswCQYDVQQGEwJVUzELMAkGA1UECBMCRkwxFDAS BgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYDVQQKEw1HZW5pdmlhLCBJbmMuMQswCQYD VQQLEwJJVDESMBAGA1UEAxMJbG9jYWxob3N0MSIwIAYJKoZIhvcNAQkBFhNjb250 YWN0QGdlbml2aWEuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC4J9vn Sde1q+Pyvgs4QUPiNKnqezL0Cqp1vA7gfUJ31Q/0071gkgMSX/DL+SZPjRSfEjA1 c9JyPjSdeZ5zydAz9f5R680Nvs8VKR9MsB3/XAnI3Rhd9G11QHXuW7DsaF6TXHNk EoipcN7ebie9eeqadv8xzhvTBHBE8rkf8iMI2QIDAQABo4IBTTCCAUkwCQYDVR0T BAIwADALBgNVHQ8EBAMCBPAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMC MCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAd BgNVHQ4EFgQUYJXHvmkvx1zc7GjmBJ9G0YQpKSgwgcIGA1UdIwSBujCBt4AU+MeC gLt+4soPx4i3OiBZYwMqlNChgZOkgZAwgY0xCzAJBgNVBAYTAlVTMQswCQYDVQQI EwJGTDEUMBIGA1UEBxMLVGFsbGFoYXNzZWUxFjAUBgNVBAoTDUdlbml2aWEsIElu Yy4xCzAJBgNVBAsTAklUMRIwEAYDVQQDEwlsb2NhbGhvc3QxIjAgBgkqhkiG9w0B CQEWE2NvbnRhY3RAZ2VuaXZpYS5jb22CCQDWdgbFTLQbVTANBgkqhkiG9w0BAQUF AAOBgQCNUuW182UC2YqBE3oEtwaguyYWOR5aZIUE4znV9thu7xBZhCoFhukmQX0L TwoSiW7Yt7vx0cUL4RQltT4D225ANhogdmBh0JmIXc60DtpnCs43IjTT1moUwx6T M51IxVIgksklJuo7UIILrYWlIR3GjDWGOEpQQmQhoLS10lVAyQ== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDkDCCAvmgAwIBAgIJANZ2BsVMtBtVMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYD VQQGEwJVUzELMAkGA1UECBMCRkwxFDASBgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYD VQQKEw1HZW5pdmlhLCBJbmMuMQswCQYDVQQLEwJJVDESMBAGA1UEAxMJbG9jYWxo b3N0MSIwIAYJKoZIhvcNAQkBFhNjb250YWN0QGdlbml2aWEuY29tMB4XDTE1MDgw NDE5MDEyMFoXDTE4MDgwMzE5MDEyMFowgY0xCzAJBgNVBAYTAlVTMQswCQYDVQQI EwJGTDEUMBIGA1UEBxMLVGFsbGFoYXNzZWUxFjAUBgNVBAoTDUdlbml2aWEsIElu Yy4xCzAJBgNVBAsTAklUMRIwEAYDVQQDEwlsb2NhbGhvc3QxIjAgBgkqhkiG9w0B CQEWE2NvbnRhY3RAZ2VuaXZpYS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJ AoGBALx/LiwGRi4wH8y0MEL64VJs5H2O1F4uuYO+aNVZHl5ULRDmSh/4eF8aOYXT B05PfVoctBogcK0ohPEhiUcR/029LQTkEs/5D7XsuRuQsUnMfkEihmC2VtEuJMqT OeXmuIcemEw0QL3ulny7H8W6Aq2rByC2r5iqytnM4Uuw7LMnAgMBAAGjgfUwgfIw HQYDVR0OBBYEFPjHgoC7fuLKD8eItzogWWMDKpTQMIHCBgNVHSMEgbowgbeAFPjH goC7fuLKD8eItzogWWMDKpTQoYGTpIGQMIGNMQswCQYDVQQGEwJVUzELMAkGA1UE CBMCRkwxFDASBgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYDVQQKEw1HZW5pdmlhLCBJ bmMuMQswCQYDVQQLEwJJVDESMBAGA1UEAxMJbG9jYWxob3N0MSIwIAYJKoZIhvcN AQkBFhNjb250YWN0QGdlbml2aWEuY29tggkA1nYGxUy0G1UwDAYDVR0TBAUwAwEB /zANBgkqhkiG9w0BAQUFAAOBgQB+fmbScGp3R4D0Sf4gbBJ/3CGEn4/HvupSikDq vyaviwJ2KQKGlAr/lDh1qSYItkazJpJDIxyG2Dzm2w0F0u1+CSwpym6eq1pxc8dh GRdrCVyuM0gUoBvxUym7o0Bq1V6onUjwrAti+onsZjDpfAIKBI8TRfjuTNzFeSAV G2zULg== -----END CERTIFICATE----- gsoap-2.8.28/gsoap/samples/ssl/cacerts.pem0000644000175000017500000075424412653650156020022 0ustar ellertellert# Part of the source for this file is provided by Mozilla: # http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1 # This file was converted to PEM format with tools provided by OpenSSL. # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. GlobalSign Root CA ================== -----BEGIN CERTIFICATE----- MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== -----END CERTIFICATE----- GlobalSign Root CA - R2 ======================= -----BEGIN CERTIFICATE----- MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6 ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp 9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu 01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7 9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== -----END CERTIFICATE----- Verisign Class 3 Public Primary Certification Authority - G3 ============================================================ -----BEGIN CERTIFICATE----- MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1 EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj 055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC /Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0 xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== -----END CERTIFICATE----- Entrust.net Premium 2048 Secure Server CA ========================================= -----BEGIN CERTIFICATE----- MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx NzUwNTFaFw0yOTA3MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3 d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo0IwQDAOBgNVHQ8BAf8E BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJ KoZIhvcNAQEFBQADggEBADubj1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPy T/4xmf3IDExoU8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5bu/8j72gZyxKT J1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+bYQLCIt+jerXmCHG8+c8eS9e nNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/ErfF6adulZkMV8gzURZVE= -----END CERTIFICATE----- Baltimore CyberTrust Root ========================= -----BEGIN CERTIFICATE----- MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9 XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5 hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp -----END CERTIFICATE----- AddTrust Low-Value Services Root ================================ -----BEGIN CERTIFICATE----- MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRU cnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQsw CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBO ZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEB AQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY6 54eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWr oulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1 Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJui GMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8w HQYDVR0OBBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTAD AQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQswCQYDVQQGEwJT RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEw HwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxt ZBsfzQ3duQH6lmM0MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJlpz/+0WatC7xr mYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vj ccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk= -----END CERTIFICATE----- AddTrust External Root ====================== -----BEGIN CERTIFICATE----- MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821 +iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy 2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7 7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355 e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= -----END CERTIFICATE----- AddTrust Public Services Root ============================= -----BEGIN CERTIFICATE----- MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEUMBIGA1UEChML QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSAwHgYDVQQDExdBZGRU cnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJ BgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5l dHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEF AAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbu nyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1i d9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSG Aa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAw HM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0G A1UdDgQWBBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB /zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkGA1UEBhMCU0Ux FDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29yazEgMB4G A1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4 JNojVhaTdt02KLmuG7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL +YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh4SINhwBk/ox9 Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9H EufOX1362KqxMy3ZdvJOOjMMK7MtkAY= -----END CERTIFICATE----- AddTrust Qualified Certificates Root ==================================== -----BEGIN CERTIFICATE----- MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEUMBIGA1UEChML QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSMwIQYDVQQDExpBZGRU cnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcx CzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ IE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG 9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx 64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3 KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1tUvznoD1o L/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GR wVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HU MIHRMB0GA1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/ BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkwZzELMAkGA1UE BhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29y azEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQAD ggEBABmrder4i2VhlRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3P6CxB9bpT9ze RXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDB iFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5noxqE= -----END CERTIFICATE----- Entrust Root Certification Authority ==================================== -----BEGIN CERTIFICATE----- MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0 MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68 j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1 MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0 tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8 -----END CERTIFICATE----- RSA Security 2048 v3 ==================== -----BEGIN CERTIFICATE----- MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6MRkwFwYDVQQK ExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAy MjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAb BgNVBAsTFFJTQSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC AQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7 Jylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgb WhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iH KrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP +Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/ MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4E FgQUB8NRMKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmY v/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5gEydxiKRz44Rj 0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+f00/FGj1EVDVwfSQpQgdMWD/YIwj VAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395 nzIlQnQFgCi/vcEkllgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA pKnXwiJPZ9d37CAFYd4= -----END CERTIFICATE----- GeoTrust Global CA ================== -----BEGIN CERTIFICATE----- MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet 8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4 d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2 mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm Mw== -----END CERTIFICATE----- GeoTrust Global CA 2 ==================== -----BEGIN CERTIFICATE----- MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN R2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwHhcNMDQwMzA0MDUw MDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j LjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw ggEKAoIBAQDvPE1APRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/ NTL8Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hLTytCOb1k LUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL5mkWRxHCJ1kDs6ZgwiFA Vvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7S4wMcoKK+xfNAGw6EzywhIdLFnopsk/b HdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQF MAMBAf8wHQYDVR0OBBYEFHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNH K266ZUapEBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6tdEPx7 srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv/NgdRN3ggX+d6Yvh ZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywNA0ZF66D0f0hExghAzN4bcLUprbqL OzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkC x1YAzUm5s2x7UwQa4qjJqhIFI8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqF H4z1Ir+rzoPz4iIprn2DQKi6bA== -----END CERTIFICATE----- GeoTrust Universal CA ===================== -----BEGIN CERTIFICATE----- MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1 MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs 7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d 8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08 ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0 XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2 qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2 DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI P/rmMuGNG2+k5o7Y+SlIis5z/iw= -----END CERTIFICATE----- GeoTrust Universal CA 2 ======================= -----BEGIN CERTIFICATE----- MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0 MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0 DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17 j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2 WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP 20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG 8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2 +/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ 4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+ mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS -----END CERTIFICATE----- Visa eCommerce Root =================== -----BEGIN CERTIFICATE----- MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2 WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0 TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI /k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt 398znM/jra6O1I7mT1GvFpLgXPYHDw== -----END CERTIFICATE----- Certum Root CA ============== -----BEGIN CERTIFICATE----- MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQK ExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQTAeFw0wMjA2MTExMDQ2Mzla Fw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8u by4xEjAQBgNVBAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6x wS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdL kKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ 89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/K Uz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu/qpGWX7P NSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq hkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+ GXYkHAQaTOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvg GrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqTE5s7FCMTY5w/ 0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5xO/fIR/RpbxXyEV6DHpx8Uq79AtoS qFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs6GAqm4VKQPNriiTsBhYscw== -----END CERTIFICATE----- Comodo AAA Services root ======================== -----BEGIN CERTIFICATE----- MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm 7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z 8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C 12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== -----END CERTIFICATE----- Comodo Secure Services root =========================== -----BEGIN CERTIFICATE----- MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg TGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAw MDAwMFoXDTI4MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu Y2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAi BgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP ADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP 9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8j6ysNstc rbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rC oznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3V p6ea5EQz6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4E FgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w gYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL1NlY3VyZUNlcnRpZmlj YXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlm aWNhdGVTZXJ2aWNlcy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm 4J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtIgKvcnDe4IRRL DXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6Pw pCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1H RR3B7Hzs/Sk= -----END CERTIFICATE----- Comodo Trusted Services root ============================ -----BEGIN CERTIFICATE----- MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg TGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEw MDAwMDBaFw0yODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1h bmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUw IwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOC AQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh7 3TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9C1t2ul/y /9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6 juljatEPmsbS9Is6FARW1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsS ivnkBbA7kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1Ud DgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB /zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21vZG9jYS5jb20vVHJ1c3RlZENlcnRp ZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENl cnRpZmljYXRlU2VydmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw uleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32 pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxISjBc/lDb+XbDA BHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0l R+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O 9y5Xt5hwXsjEeLBi -----END CERTIFICATE----- QuoVadis Root CA ================ -----BEGIN CERTIFICATE----- MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7 MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0 aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6 tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi 5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi 5nrQNiOKSnQ2+Q== -----END CERTIFICATE----- QuoVadis Root CA 2 ================== -----BEGIN CERTIFICATE----- MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQx ODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4IC DwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6 XJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yk lvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbB lDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRcAitMOeGy lZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt 66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1Jdxn wQ5hYIizPtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOh D7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR7hYQe7xFSkyy BNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuIyV77zGHcizN300QyNQliBJIWENie J0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1Ud DgQWBBQahGK8SEwzJQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGU a6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2fBluornFdLwUv Z+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3 UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodm VjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK +JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrW IozchLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1 WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1B+TJYm5X f6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II 4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8 VCLAAVBpQ570su9t+Oza8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u -----END CERTIFICATE----- QuoVadis Root CA 3 ================== -----BEGIN CERTIFICATE----- MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8 nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4 ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2 Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp 8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto= -----END CERTIFICATE----- Security Communication Root CA ============================== -----BEGIN CERTIFICATE----- MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw 8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX 5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2 JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g 0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ 6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi FL39vmwLAw== -----END CERTIFICATE----- Sonera Class 2 Root CA ====================== -----BEGIN CERTIFICATE----- MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3 /Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt 0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH llpwrN9M -----END CERTIFICATE----- Staat der Nederlanden Root CA ============================= -----BEGIN CERTIFICATE----- MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJOTDEeMBwGA1UE ChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFhdCBkZXIgTmVkZXJsYW5kZW4g Um9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEyMTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4w HAYDVQQKExVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxh bmRlbiBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFt vsznExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw719tV2U02P jLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MOhXeiD+EwR+4A5zN9RGca C1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+UtFE5A3+y3qcym7RHjm+0Sq7lr7HcsBth vJly3uSJt3omXdozSVtSnA71iq3DuD3oBmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn6 22r+I/q85Ej0ZytqERAhSQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRV HSAAMDwwOgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMvcm9v dC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA7Jbg0zTBLL9s+DAN BgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k/rvuFbQvBgwp8qiSpGEN/KtcCFtR EytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzmeafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbw MVcoEoJz6TMvplW0C5GUR5z6u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3y nGQI0DvDKcWy7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw== -----END CERTIFICATE----- UTN USERFirst Hardware Root CA ============================== -----BEGIN CERTIFICATE----- MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UE BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAd BgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgx OTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0 eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVz ZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3 DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlI wrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFd tqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8 i4fDidNdoI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjf Pe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhbAgMBAAGjgbkw gbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFKFyXyYbKJhDlV0HN9WF lp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNF UkZpcnN0LUhhcmR3YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF BwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM //bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28GpgoiskliCE7/yMgUsogW XecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2 lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kn iCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67 nfhmqA== -----END CERTIFICATE----- Camerfirma Chambers of Commerce Root ==================================== -----BEGIN CERTIFICATE----- MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i ZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAx NjEzNDNaFw0zNzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZp cm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3Jn MSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOC AQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlU xFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41XQEMIwRH NaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jW DA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFV d9oKDMyXroDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1Ud EwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFtYmVyc2lnbi5v cmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p26EpW1eLTXYGduHRooowDgYDVR0P AQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hh bWJlcnNpZ24ub3JnMCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD VR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEBAAxBl8IahsAi fJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvD L8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wN UPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/n ADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1 erfutGWaIZDgqtCYvDi1czyL+Nw= -----END CERTIFICATE----- Camerfirma Global Chambersign Root ================================== -----BEGIN CERTIFICATE----- MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i ZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYx NDE4WhcNMzcwOTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJt YSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEg MB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAw ggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J 1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8O by4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl 6DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c 8lCrEqWhz0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/ BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJzaWduLm9yZy9j aGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4wTcbOX60Qq+UDpfqpFDAOBgNVHQ8B Af8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBj aGFtYmVyc2lnbi5vcmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y ZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0BAQUFAAOCAQEA PDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9Y gOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJ PJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4 IBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes t2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A== -----END CERTIFICATE----- NetLock Notary (Class A) Root ============================= -----BEGIN CERTIFICATE----- MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQI EwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6 dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9j ayBLb3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oX DTE5MDIxOTIzMTQ0N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQH EwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYD VQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFz cyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSM D7tM9DceqQWC2ObhbHDqeLVu0ThEDaiDzl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZ z+qMkjvN9wfcZnSX9EUi3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC /tmwqcm8WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LYOph7 tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2EsiNCubMvJIH5+hCoR6 4sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCCApswDgYDVR0PAQH/BAQDAgAGMBIG A1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaC Ak1GSUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pv bGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2Vn LWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0 ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFz IGxlaXJhc2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBh IGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVu b3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBh bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sg Q1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFp bCBhdCBjcHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5 ayZrU3/b39/zcT0mwBQOxmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjP ytoUMaFP0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQQeJB CWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxkf1qbFFgBJ34TUMdr KuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK8CtmdWOMovsEPoMOmzbwGOQmIMOM 8CgHrTwXZoi1/baI -----END CERTIFICATE----- XRamp Global CA Root ==================== -----BEGIN CERTIFICATE----- MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc /Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz 8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw= -----END CERTIFICATE----- Go Daddy Class 2 CA =================== -----BEGIN CERTIFICATE----- MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv 2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32 qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b vZ8= -----END CERTIFICATE----- Starfield Class 2 CA ==================== -----BEGIN CERTIFICATE----- MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3 QBFGmh95DmK/D5fs4C8fF5Q= -----END CERTIFICATE----- StartCom Certification Authority ================================ -----BEGIN CERTIFICATE----- MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0 NjM2WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/ Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt 2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z 6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/ untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT 37uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0 Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNj YS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUH AgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRw Oi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYg U3RhcnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5 LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0Q29tIENl cnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUgYXQgaHR0cDovL2NlcnQuc3Rh cnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilT dGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOC AgEAFmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8jhvh 3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUWFjgKXlf2Ysd6AgXm vB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHk fY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3 fsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZ EoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl 1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/7HW/ lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/FlUQqmMGqz9IgcgA38coro g14= -----END CERTIFICATE----- Taiwan GRCA =========== -----BEGIN CERTIFICATE----- MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG EwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X DTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv dmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD ggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN w8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5 BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O 1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO htX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov J5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7 Q3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t B6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB O9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8 lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV HRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2 09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj Zwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2 Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU D7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz DxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk Z6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk 7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy +fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS -----END CERTIFICATE----- Swisscom Root CA 1 ================== -----BEGIN CERTIFICATE----- MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQG EwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2VydGlmaWNhdGUgU2Vy dmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3QgQ0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4 MTgyMjA2MjBaMGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGln aXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIIC IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9m2BtRsiM MW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdihFvkcxC7mlSpnzNApbjyF NDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/TilftKaNXXsLmREDA/7n29uj/x2lzZAe AR81sH8A25Bvxn570e56eqeqDFdvpG3FEzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkC b6dJtDZd0KTeByy2dbcokdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn 7uHbHaBuHYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNFvJbN cA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo19AOeCMgkckkKmUp WyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjCL3UcPX7ape8eYIVpQtPM+GP+HkM5 haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJWbjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNY MUJDLXT5xp6mig/p/r+D5kNXJLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYw HQYDVR0hBBYwFDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzcK6FptWfUjNP9 MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzfky9NfEBWMXrrpA9gzXrzvsMn jgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7IkVh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQ MbFamIp1TpBcahQq4FJHgmDmHtqBsfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4H VtA4oJVwIHaM190e3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtl vrsRls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ipmXeascCl OS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HHb6D0jqTsNFFbjCYDcKF3 1QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksfrK/7DZBaZmBwXarNeNQk7shBoJMBkpxq nvy5JMWzFYJ+vq6VK+uxwNrjAWALXmmshFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCy x/yP2FS1k2Kdzs9Z+z0YzirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMW NY6E0F/6MBr1mmz0DlP5OlvRHA== -----END CERTIFICATE----- DigiCert Assured ID Root CA =========================== -----BEGIN CERTIFICATE----- MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO 9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW /lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF 66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i 8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe +o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== -----END CERTIFICATE----- DigiCert Global Root CA ======================= -----BEGIN CERTIFICATE----- MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5 BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H 4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y 7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm 8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886 UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= -----END CERTIFICATE----- DigiCert High Assurance EV Root CA ================================== -----BEGIN CERTIFICATE----- MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3 MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K -----END CERTIFICATE----- Certplus Class 2 Primary CA =========================== -----BEGIN CERTIFICATE----- MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR 5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+ 7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW //1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 l7+ijrRU -----END CERTIFICATE----- DST Root CA X3 ============== -----BEGIN CERTIFICATE----- MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1 cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9 UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ -----END CERTIFICATE----- DST ACES CA X6 ============== -----BEGIN CERTIFICATE----- MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQG EwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VT MRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NTha MFsxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UE CxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOC AQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzI DZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCa pCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKBXy314pow GCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPy MjwmR/onJALJfh1biEITajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1Ud EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3Qu Y29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnRy dXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMtaW5kZXguaHRtbDAdBgNVHQ4EFgQU CXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V2 5FYrnJmQ6AgwbN99Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t Fr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpRrscL9yuwNwXs vFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3 oKfN5XozNmr6mis= -----END CERTIFICATE----- SwissSign Gold CA - G2 ====================== -----BEGIN CERTIFICATE----- MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkNIMRUw EwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcN MDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dp c3NTaWduIEFHMR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0B AQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUq t2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5C jCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpg vd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbLtK/tREDF ylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvR AiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuend jIj3o02yMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkO peUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59je883WX0XaxR 7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxMgI93e2CaHt+28kgeDrpOVG2Y4OGi GqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw AwEB/zAdBgNVHQ4EFgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64 OfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe645R88a7A3hfm 5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr 44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOf Mke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6m Gu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxp mo/a77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJk vC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7XdVAyksLf KzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG2mqeSz53OiATIgHQv2ieY2Br NU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6Lqj viOvrv1vA+ACOzB2+httQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ -----END CERTIFICATE----- SwissSign Silver CA - G2 ======================== -----BEGIN CERTIFICATE----- MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCQ0gxFTAT BgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMB4X DTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0NlowRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3 aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG 9w0BAQEFAAOCAg8AMIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644 N0MvFz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7brYT7QbNHm +/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieFnbAVlDLaYQ1HTWBCrpJH 6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH6ATK72oxh9TAtvmUcXtnZLi2kUpCe2Uu MGoM9ZDulebyzYLs2aFK7PayS+VFheZteJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5h qAaEuSh6XzjZG6k4sIN/c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5 FZGkECwJMoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRHHTBs ROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTfjNFusB3hB48IHpmc celM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb65i/4z3GcRm25xBWNOHkDRUjvxF3X CO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ BAUwAwEB/zAdBgNVHQ4EFgQUF6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRB tjpbO8tFnb0cwpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0 cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBAHPGgeAn0i0P 4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShpWJHckRE1qTodvBqlYJ7YH39F kWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L 3XWgwF15kIwb4FDm3jH+mHtwX6WQ2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx /uNncqCxv1yL5PqZIseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFa DGi8aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2Xem1ZqSqP e97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQRdAtq/gsD/KNVV4n+Ssuu WxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJ DIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ub DgEj8Z+7fNzcbBGXJbLytGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u -----END CERTIFICATE----- GeoTrust Primary Certification Authority ======================================== -----BEGIN CERTIFICATE----- MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9 nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG 1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= -----END CERTIFICATE----- thawte Primary Root CA ====================== -----BEGIN CERTIFICATE----- MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3 MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ 1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89 jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA== -----END CERTIFICATE----- VeriSign Class 3 Public Primary Certification Authority - G5 ============================================================ -----BEGIN CERTIFICATE----- MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/ Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/ BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+ X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq -----END CERTIFICATE----- SecureTrust CA ============== -----BEGIN CERTIFICATE----- MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b 01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/ BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR 3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= -----END CERTIFICATE----- Secure Global CA ================ -----BEGIN CERTIFICATE----- MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g 8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi 0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+ OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5 3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW -----END CERTIFICATE----- COMODO Certification Authority ============================== -----BEGIN CERTIFICATE----- MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1 dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH +7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV 4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA 1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN +8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ== -----END CERTIFICATE----- Network Solutions Certificate Authority ======================================= -----BEGIN CERTIFICATE----- MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc /Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q 4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/ GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey -----END CERTIFICATE----- WellsSecure Public Root Certificate Authority ============================================= -----BEGIN CERTIFICATE----- MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoM F1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYw NAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN MDcxMjEzMTcwNzU0WhcNMjIxMjE0MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dl bGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYD VQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+rWxxTkqxtnt3CxC5FlAM1 iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjUDk/41itMpBb570OYj7OeUt9tkTmPOL13 i0Nj67eT/DBMHAGTthP796EfvyXhdDcsHqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8 bJVhHlfXBIEyg1J55oNjz7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiB K0HmOFafSZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/SlwxlAgMB AAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly9jcmwu cGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0PAQH/BAQDAgHGMB0GA1UdDgQWBBQm lRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0jBIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGB i6SBiDCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRww GgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEBALkVsUSRzCPI K0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd/ZDJPHV3V3p9+N701NX3leZ0 bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pBA4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSlj qHyita04pO2t/caaH/+Xc/77szWnk4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+es E2fDbbFwRnzVlhE9iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJ tylv2G0xffX8oRAHh84vWdw+WNs= -----END CERTIFICATE----- COMODO ECC Certification Authority ================================== -----BEGIN CERTIFICATE----- MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X 4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= -----END CERTIFICATE----- IGC/A ===== -----BEGIN CERTIFICATE----- MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYTAkZSMQ8wDQYD VQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVE Q1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZy MB4XDTAyMTIxMzE0MjkyM1oXDTIwMTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQI EwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NT STEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMIIB IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaIs9z4iPf930Pfeo2aSVz2 TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCW So7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYy HF2fYPepraX/z9E0+X1bF8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNd frGoRpAxVs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGdPDPQ tQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNVHSAEDjAMMAoGCCqB egF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAxNjAfBgNVHSMEGDAWgBSjBS8YYFDC iQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUFAAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RK q89toB9RlPhJy3Q2FLwV3duJL92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3Q MZsyK10XZZOYYLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2aNjSaTFR+FwNI lQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R0982gaEbeC9xs/FZTEYYKKuF 0mBWWg== -----END CERTIFICATE----- Security Communication EV RootCA1 ================================= -----BEGIN CERTIFICATE----- MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDElMCMGA1UEChMc U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMhU2VjdXJpdHkgQ29tbXVuaWNh dGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIzMloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UE BhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNl Y3VyaXR5IENvbW11bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC AQoCggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSERMqm4miO /VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gOzXppFodEtZDkBp2uoQSX WHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4z ZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDFMxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4 bepJz11sS6/vmsJWXMY1VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK 9U2vP9eCOKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG SIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HWtWS3irO4G8za+6xm iEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZq51ihPZRwSzJIxXYKLerJRO1RuGG Av8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDbEJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnW mHyojf6GPgcWkuF75x3sM3Z+Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEW T1MKZPlO9L9OVL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490 -----END CERTIFICATE----- OISTE WISeKey Global Root GA CA =============================== -----BEGIN CERTIFICATE----- MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5 IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9 Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ /yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4 +vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0= -----END CERTIFICATE----- Microsec e-Szigno Root CA ========================= -----BEGIN CERTIFICATE----- MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAwcjELMAkGA1UE BhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNyb3NlYyBMdGQuMRQwEgYDVQQL EwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0 MDYxMjI4NDRaFw0xNzA0MDYxMjI4NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVz dDEWMBQGA1UEChMNTWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMT GU1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB AQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2uuO/TEdyB5s87lozWbxXG d36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/N oqdNAoI/gqyFxuEPkEeZlApxcpMqyabAvjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjc QR/Ji3HWVBTji1R4P770Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJ PqW+jqpx62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcBAQRb MFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3AwLQYIKwYBBQUHMAKG IWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAPBgNVHRMBAf8EBTADAQH/MIIBcwYD VR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIBAQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3 LmUtc3ppZ25vLmh1L1NaU1ovMIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0A dAB2AOEAbgB5ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABTAHoAbwBsAGcA 4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABhACAAcwB6AGUAcgBpAG4AdAAg AGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABoAHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMA egBpAGcAbgBvAC4AaAB1AC8AUwBaAFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6 Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NO PU1pY3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxPPU1pY3Jv c2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdDtiaW5h cnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuBEGluZm9AZS1zemlnbm8uaHWkdzB1MSMw IQYDVQQDDBpNaWNyb3NlYyBlLVN6aWduw7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhT WjEWMBQGA1UEChMNTWljcm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhV MIGsBgNVHSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJIVTER MA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDASBgNVBAsTC2UtU3pp Z25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBSb290IENBghEAzLjnv04pGv2i3Gal HCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMT nGZjWS7KXHAM/IO8VbH0jgdsZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FE aGAHQzAxQmHl7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a 86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfRhUZLphK3dehK yVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/MPMMNz7UwiiAc7EBt51alhQB S6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU= -----END CERTIFICATE----- Certigna ======== -----BEGIN CERTIFICATE----- MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3 MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+ ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY 1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== -----END CERTIFICATE----- Deutsche Telekom Root CA 2 ========================== -----BEGIN CERTIFICATE----- MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5 MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5 bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8 rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU Cm26OWMohpLzGITY+9HPBVZkVw== -----END CERTIFICATE----- Cybertrust Global Root ====================== -----BEGIN CERTIFICATE----- MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4 MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA +Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW 0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin 89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT 8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2 MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi 5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2 hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW WL1WMRJOEcgh4LMRkWXbtKaIOM5V -----END CERTIFICATE----- ePKI Root Certification Authority ================================= -----BEGIN CERTIFICATE----- MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX 12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+ ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/ vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0 1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw= -----END CERTIFICATE----- T\xc3\x9c\x42\xC4\xB0TAK UEKAE K\xC3\xB6k Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 - S\xC3\xBCr\xC3\xBCm 3 ============================================================================================================================= -----BEGIN CERTIFICATE----- MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRSMRgwFgYDVQQH DA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJpbGltc2VsIHZlIFRla25vbG9q aWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSwVEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ry b25payB2ZSBLcmlwdG9sb2ppIEFyYcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNV BAsMGkthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUg S8O2ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAeFw0wNzA4 MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIxGDAWBgNVBAcMD0dlYnpl IC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmHF n3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBUQUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZl IEtyaXB0b2xvamkgQXJhxZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2Ft dSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7ZrIFNl cnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIBIjANBgkqhkiG9w0B AQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4hgb46ezzb8R1Sf1n68yJMlaCQvEhO Eav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yKO7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1 xnnRFDDtG1hba+818qEhTsXOfJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR 6Oqeyjh1jmKwlZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQIDAQABo0IwQDAd BgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF MAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmPNOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4 N5EY3ATIZJkrGG2AA1nJrvhY0D7twyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLT y9LQQfMmNkqblWwM7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYh LBOhgLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5noN+J1q2M dqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUsyZyQ2uypQjyttgI= -----END CERTIFICATE----- Buypass Class 2 CA 1 ==================== -----BEGIN CERTIFICATE----- MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMiBDQSAxMB4XDTA2 MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7M cXA0ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLXl18xoS83 0r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVBHfCuuCkslFJgNJQ72uA4 0Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/R uFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNC MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0P AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLPgcIV 1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+DKhQ7SLHrQVMdvvt 7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKuBctN518fV4bVIJwo+28TOPX2EZL2 fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHsh7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5w wDX3OaJdZtB7WZ+oRxKaJyOkLY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho -----END CERTIFICATE----- EBG Elektronik Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 ========================================================================== -----BEGIN CERTIFICATE----- MIIF5zCCA8+gAwIBAgIITK9zQhyOdAIwDQYJKoZIhvcNAQEFBQAwgYAxODA2BgNVBAMML0VCRyBF bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMTcwNQYDVQQKDC5FQkcg QmlsacWfaW0gVGVrbm9sb2ppbGVyaSB2ZSBIaXptZXRsZXJpIEEuxZ4uMQswCQYDVQQGEwJUUjAe Fw0wNjA4MTcwMDIxMDlaFw0xNjA4MTQwMDMxMDlaMIGAMTgwNgYDVQQDDC9FQkcgRWxla3Ryb25p ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTE3MDUGA1UECgwuRUJHIEJpbGnFn2lt IFRla25vbG9qaWxlcmkgdmUgSGl6bWV0bGVyaSBBLsWeLjELMAkGA1UEBhMCVFIwggIiMA0GCSqG SIb3DQEBAQUAA4ICDwAwggIKAoICAQDuoIRh0DpqZhAy2DE4f6en5f2h4fuXd7hxlugTlkaDT7by X3JWbhNgpQGR4lvFzVcfd2NR/y8927k/qqk153nQ9dAktiHq6yOU/im/+4mRDGSaBUorzAzu8T2b gmmkTPiab+ci2hC6X5L8GCcKqKpE+i4stPtGmggDg3KriORqcsnlZR9uKg+ds+g75AxuetpX/dfr eYteIAbTdgtsApWjluTLdlHRKJ2hGvxEok3MenaoDT2/F08iiFD9rrbskFBKW5+VQarKD7JK/oCZ TqNGFav4c0JqwmZ2sQomFd2TkuzbqV9UIlKRcF0T6kjsbgNs2d1s/OsNA/+mgxKb8amTD8UmTDGy Y5lhcucqZJnSuOl14nypqZoaqsNW2xCaPINStnuWt6yHd6i58mcLlEOzrz5z+kI2sSXFCjEmN1Zn uqMLfdb3ic1nobc6HmZP9qBVFCVMLDMNpkGMvQQxahByCp0OLna9XvNRiYuoP1Vzv9s6xiQFlpJI qkuNKgPlV5EQ9GooFW5Hd4RcUXSfGenmHmMWOeMRFeNYGkS9y8RsZteEBt8w9DeiQyJ50hBs37vm ExH8nYQKE3vwO9D8owrXieqWfo1IhR5kX9tUoqzVegJ5a9KK8GfaZXINFHDk6Y54jzJ0fFfy1tb0 Nokb+Clsi7n2l9GkLqq+CxnCRelwXQIDAJ3Zo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB /wQEAwIBBjAdBgNVHQ4EFgQU587GT/wWZ5b6SqMHwQSny2re2kcwHwYDVR0jBBgwFoAU587GT/wW Z5b6SqMHwQSny2re2kcwDQYJKoZIhvcNAQEFBQADggIBAJuYml2+8ygjdsZs93/mQJ7ANtyVDR2t FcU22NU57/IeIl6zgrRdu0waypIN30ckHrMk2pGI6YNw3ZPX6bqz3xZaPt7gyPvT/Wwp+BVGoGgm zJNSroIBk5DKd8pNSe/iWtkqvTDOTLKBtjDOWU/aWR1qeqRFsIImgYZ29fUQALjuswnoT4cCB64k XPBfrAowzIpAoHMEwfuJJPaaHFy3PApnNgUIMbOv2AFoKuB4j3TeuFGkjGwgPaL7s9QJ/XvCgKqT bCmYIai7FvOpEl90tYeY8pUm3zTvilORiF0alKM/fCL414i6poyWqD1SNGKfAB5UVUJnxk1Gj7sU RT0KlhaOEKGXmdXTMIXM3rRyt7yKPBgpaP3ccQfuJDlq+u2lrDgv+R4QDgZxGhBM/nV+/x5XOULK 1+EVoVZVWRvRo68R2E7DpSvvkL/A7IITW43WciyTTo9qKd+FPNMN4KIYEsxVL0e3p5sC/kH2iExt 2qkBR4NkJ2IQgtYSe14DHzSpyZH+r11thie3I6p1GMog57AP14kOpmciY/SDQSsGS7tY1dHXt7kQ Y9iJSrSq3RZj9W6+YKH47ejWkE8axsWgKdOnIaj1Wjz3x0miIZpKlVIglnKaZsv30oZDfCK+lvm9 AahH3eU7QPl1K5srRmSGjR70j/sHd9DqSaIcjVIUpgqT -----END CERTIFICATE----- certSIGN ROOT CA ================ -----BEGIN CERTIFICATE----- MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2 ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD 0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943 AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8 SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0 x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD -----END CERTIFICATE----- CNNIC ROOT ========== -----BEGIN CERTIFICATE----- MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJDTjEOMAwGA1UE ChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2MDcwOTE0WhcNMjcwNDE2MDcw OTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1Qw ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzD o+/hn7E7SIX1mlwhIhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tiz VHa6dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZOV/kbZKKT VrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrCGHn2emU1z5DrvTOTn1Or czvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gNv7Sg2Ca+I19zN38m5pIEo3/PIKe38zrK y5nLAgMBAAGjczBxMBEGCWCGSAGG+EIBAQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscC wQ7vptU7ETAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991S lgrHAsEO76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnKOOK5 Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvHugDnuL8BV8F3RTIM O/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7HgviyJA/qIYM/PmLXoXLT1tLYhFHxUV8 BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fLbuXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2 G8kS1sHNzYDzAgE8yGnLRUhj2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5m mxE= -----END CERTIFICATE----- ApplicationCA - Japanese Government =================================== -----BEGIN CERTIFICATE----- MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEcMBoGA1UEChMT SmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRpb25DQTAeFw0wNzEyMTIxNTAw MDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYTAkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zl cm5tZW50MRYwFAYDVQQLEw1BcHBsaWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB CgKCAQEAp23gdE6Hj6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4 fl+Kf5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55IrmTwcrN wVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cwFO5cjFW6WY2H/CPek9AE jP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDihtQWEjdnjDuGWk81quzMKq2edY3rZ+nYVu nyoKb58DKTCXKB28t89UKU5RMfkntigm/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRU WssmP3HMlEYNllPqa0jQk/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNV BAYTAkpQMRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOCseOD vOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADlqRHZ3ODrs o2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJhyzjVOGjprIIC8CFqMjSnHH2HZ9g /DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYD io+nEhEMy/0/ecGc/WLuo89UDNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmW dupwX3kSa+SjB1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL rosot4LKGAfmt1t06SAZf7IbiVQ= -----END CERTIFICATE----- GeoTrust Primary Certification Authority - G3 ============================================= -----BEGIN CERTIFICATE----- MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0 IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr 2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9 cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt -----END CERTIFICATE----- thawte Primary Root CA - G2 =========================== -----BEGIN CERTIFICATE----- MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5 8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== -----END CERTIFICATE----- thawte Primary Root CA - G3 =========================== -----BEGIN CERTIFICATE----- MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC +BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY 7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC 8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A= -----END CERTIFICATE----- GeoTrust Primary Certification Authority - G2 ============================================= -----BEGIN CERTIFICATE----- MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1 OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+ EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2 npaqBA+K -----END CERTIFICATE----- VeriSign Universal Root Certification Authority =============================================== -----BEGIN CERTIFICATE----- MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0 aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj 1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72 9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3 Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4 mJO37M2CYfE45k+XmCpajQ== -----END CERTIFICATE----- VeriSign Class 3 Public Primary Certification Authority - G4 ============================================================ -----BEGIN CERTIFICATE----- MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3 b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5 IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8 Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB /zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== -----END CERTIFICATE----- NetLock Arany (Class Gold) Főtanúsítvány ============================================ -----BEGIN CERTIFICATE----- MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610 dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6 c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu 0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw /HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1 neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= -----END CERTIFICATE----- Staat der Nederlanden Root CA - G2 ================================== -----BEGIN CERTIFICATE----- MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g Um9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oXDTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMC TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ 5291qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8SpuOUfiUtn vWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPUZ5uW6M7XxgpT0GtJlvOj CwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvEpMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiil e7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCR OME4HYYEhLoaJXhena/MUGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpI CT0ugpTNGmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy5V65 48r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv6q012iDTiIJh8BIi trzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEKeN5KzlW/HdXZt1bv8Hb/C3m1r737 qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMB AAGjgZcwgZQwDwYDVR0TAQH/BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcC ARYxaHR0cDovL3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqGSIb3DQEBCwUA A4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLySCZa59sCrI2AGeYwRTlHSeYAz +51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwj f/ST7ZwaUb7dRUG/kSS0H4zpX897IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaN kqbG9AclVMwWVxJKgnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfk CpYL+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxLvJxxcypF URmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkmbEgeqmiSBeGCc1qb3Adb CG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvkN1trSt8sV4pAWja63XVECDdCcAz+3F4h oKOKwJCcaNpQ5kUQR3i2TtJlycM33+FCY7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoV IPVVYpbtbZNQvOSqeK3Zywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm 66+KAQ== -----END CERTIFICATE----- CA Disig ======== -----BEGIN CERTIFICATE----- MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMK QnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwHhcNMDYw MzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlz bGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3 DQEBAQUAA4IBDwAwggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgm GErENx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnXmjxUizkD Pw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYDXcDtab86wYqg6I7ZuUUo hwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhWS8+2rT+MitcE5eN4TPWGqvWP+j1scaMt ymfraHtuM6kMgiioTGohQBUgDCZbg8KpFhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8w gfwwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0P AQH/BAQDAgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cuZGlz aWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5zay9jYS9jcmwvY2Ff ZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2svY2EvY3JsL2NhX2Rpc2lnLmNybDAa BgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEwDQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59t WDYcPQuBDRIrRhCA/ec8J9B6yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3 mkkp7M5+cTxqEEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/ CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeBEicTXxChds6K ezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFNPGO+I++MzVpQuGhU+QqZMxEA 4Z7CRneC9VkGjCFMhwnN5ag= -----END CERTIFICATE----- Juur-SK ======= -----BEGIN CERTIFICATE----- MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcNAQkBFglwa2lA c2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMRAw DgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMwMVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqG SIb3DQEJARYJcGtpQHNrLmVlMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVy aW1pc2tlc2t1czEQMA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC ggEBAIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOBSvZiF3tf TQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkzABpTpyHhOEvWgxutr2TC +Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvHLCu3GFH+4Hv2qEivbDtPL+/40UceJlfw UR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMPPbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDa Tpxt4brNj3pssAki14sL2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQF MAMBAf8wggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwICMIHD HoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDkAGwAagBhAHMAdABh AHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0AHMAZQBlAHIAaQBtAGkAcwBrAGUA cwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABzAGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABr AGkAbgBuAGkAdABhAG0AaQBzAGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nw cy8wKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcYP2/v6X2+MA4G A1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOiCfP+JmeaUOTDBS8rNXiRTHyo ERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+gkcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyL abVAyJRld/JXIWY7zoVAtjNjGr95HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678 IIbsSt4beDI3poHSna9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkh Mp6qqIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0ZTbvGRNs2 yyqcjg== -----END CERTIFICATE----- Hongkong Post Root CA 1 ======================= -----BEGIN CERTIFICATE----- MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1 ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT c4afU9hDDl3WY4JxHYB0yvbiAmvZWg== -----END CERTIFICATE----- SecureSign RootCA11 =================== -----BEGIN CERTIFICATE----- MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1 cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01 y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061 lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I= -----END CERTIFICATE----- ACEDICOM Root ============= -----BEGIN CERTIFICATE----- MIIFtTCCA52gAwIBAgIIYY3HhjsBggUwDQYJKoZIhvcNAQEFBQAwRDEWMBQGA1UEAwwNQUNFRElD T00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMB4XDTA4 MDQxODE2MjQyMloXDTI4MDQxMzE2MjQyMlowRDEWMBQGA1UEAwwNQUNFRElDT00gUm9vdDEMMAoG A1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMIICIjANBgkqhkiG9w0BAQEF AAOCAg8AMIICCgKCAgEA/5KV4WgGdrQsyFhIyv2AVClVYyT/kGWbEHV7w2rbYgIB8hiGtXxaOLHk WLn709gtn70yN78sFW2+tfQh0hOR2QetAQXW8713zl9CgQr5auODAKgrLlUTY4HKRxx7XBZXehuD YAQ6PmXDzQHe3qTWDLqO3tkE7hdWIpuPY/1NFgu3e3eM+SW10W2ZEi5PGrjm6gSSrj0RuVFCPYew MYWveVqc/udOXpJPQ/yrOq2lEiZmueIM15jO1FillUAKt0SdE3QrwqXrIhWYENiLxQSfHY9g5QYb m8+5eaA9oiM/Qj9r+hwDezCNzmzAv+YbX79nuIQZ1RXve8uQNjFiybwCq0Zfm/4aaJQ0PZCOrfbk HQl/Sog4P75n/TSW9R28MHTLOO7VbKvU/PQAtwBbhTIWdjPp2KOZnQUAqhbm84F9b32qhm2tFXTT xKJxqvQUfecyuB+81fFOvW8XAjnXDpVCOscAPukmYxHqC9FK/xidstd7LzrZlvvoHpKuE1XI2Sf2 3EgbsCTBheN3nZqk8wwRHQ3ItBTutYJXCb8gWH8vIiPYcMt5bMlL8qkqyPyHK9caUPgn6C9D4zq9 2Fdx/c6mUlv53U3t5fZvie27k5x2IXXwkkwp9y+cAS7+UEaeZAwUswdbxcJzbPEHXEUkFDWug/Fq TYl6+rPYLWbwNof1K1MCAwEAAaOBqjCBpzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKaz 4SsrSbbXc6GqlPUB53NlTKxQMA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUprPhKytJttdzoaqU 9QHnc2VMrFAwRAYDVR0gBD0wOzA5BgRVHSAAMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly9hY2VkaWNv bS5lZGljb21ncm91cC5jb20vZG9jMA0GCSqGSIb3DQEBBQUAA4ICAQDOLAtSUWImfQwng4/F9tqg aHtPkl7qpHMyEVNEskTLnewPeUKzEKbHDZ3Ltvo/Onzqv4hTGzz3gvoFNTPhNahXwOf9jU8/kzJP eGYDdwdY6ZXIfj7QeQCM8htRM5u8lOk6e25SLTKeI6RF+7YuE7CLGLHdztUdp0J/Vb77W7tH1Pwk zQSulgUV1qzOMPPKC8W64iLgpq0i5ALudBF/TP94HTXa5gI06xgSYXcGCRZj6hitoocf8seACQl1 ThCojz2GuHURwCRiipZ7SkXp7FnFvmuD5uHorLUwHv4FB4D54SMNUI8FmP8sX+g7tq3PgbUhh8oI KiMnMCArz+2UW6yyetLHKKGKC5tNSixthT8Jcjxn4tncB7rrZXtaAWPWkFtPF2Y9fwsZo5NjEFIq nxQWWOLcpfShFosOkYuByptZ+thrkQdlVV9SH686+5DdaaVbnG0OLLb6zqylfDJKZ0DcMDQj3dcE I2bw/FWAp/tmGYI1Z2JwOV5vx+qQQEQIHriy1tvuWacNGHk0vFQYXlPKNFHtRQrmjseCNj6nOGOp MCwXEGCSn1WHElkQwg9naRHMTh5+Spqtr0CodaxWkHS4oJyleW/c6RrIaQXpuvoDs3zk4E7Czp3o tkYNbn5XOmeUwssfnHdKZ05phkOTOPu220+DkdRgfks+KzgHVZhepA== -----END CERTIFICATE----- Microsec e-Szigno Root CA 2009 ============================== -----BEGIN CERTIFICATE----- MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG 0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm 1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02 yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi LXpUq3DDfSJlgnCW -----END CERTIFICATE----- GlobalSign Root CA - R3 ======================= -----BEGIN CERTIFICATE----- MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ 0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3 rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2 xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7 lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8 EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18 YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r kpeDMdmztcpHWD9f -----END CERTIFICATE----- Autoridad de Certificacion Firmaprofesional CIF A62634068 ========================================================= -----BEGIN CERTIFICATE----- MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY 7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx 51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi 6Et8Vcad+qMUu2WFbm5PEn4KPJ2V -----END CERTIFICATE----- Izenpe.com ========== -----BEGIN CERTIFICATE----- MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4MQswCQYDVQQG EwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wHhcNMDcxMjEz MTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMu QS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ 03rKDx6sp4boFmVqscIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAK ClaOxdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6HLmYRY2xU +zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFXuaOKmMPsOzTFlUFpfnXC PCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQDyCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxT OTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbK F7jJeodWLBoBHmy+E60QrLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK 0GqfvEyNBjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8Lhij+ 0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIBQFqNeb+Lz0vPqhbB leStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+HMh3/1uaD7euBUbl8agW7EekFwID AQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2luZm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+ SVpFTlBFIFMuQS4gLSBDSUYgQTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBG NjIgUzgxQzBBBgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O BBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUAA4ICAQB4pgwWSp9MiDrAyw6l Fn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWblaQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbga kEyrkgPH7UIBzg/YsfqikuFgba56awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8q hT/AQKM6WfxZSzwoJNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Cs g1lwLDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCTVyvehQP5 aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGkLhObNA5me0mrZJfQRsN5 nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJbUjWumDqtujWTI6cfSN01RpiyEGjkpTHC ClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZo Q0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z WrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== -----END CERTIFICATE----- Chambers of Commerce Root - 2008 ================================ -----BEGIN CERTIFICATE----- MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/ ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331 lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ 0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2 EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1 wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH 3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6 M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1 YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF 9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ -----END CERTIFICATE----- Global Chambersign Root - 2008 ============================== -----BEGIN CERTIFICATE----- MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0 ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB /gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp 1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0 dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG /5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6 ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg 9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z 09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B -----END CERTIFICATE----- Go Daddy Root Certificate Authority - G2 ======================================== -----BEGIN CERTIFICATE----- MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq 9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD +qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9 BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r 5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1 -----END CERTIFICATE----- Starfield Root Certificate Authority - G2 ========================================= -----BEGIN CERTIFICATE----- MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0 eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx 4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 -----END CERTIFICATE----- Starfield Services Root Certificate Authority - G2 ================================================== -----BEGIN CERTIFICATE----- MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2 h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6 -----END CERTIFICATE----- AffirmTrust Commercial ====================== -----BEGIN CERTIFICATE----- MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6 BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv 0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= -----END CERTIFICATE----- AffirmTrust Networking ====================== -----BEGIN CERTIFICATE----- MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24 /PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6 12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23 WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9 /ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= -----END CERTIFICATE----- AffirmTrust Premium =================== -----BEGIN CERTIFICATE----- MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV 5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs +7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04 6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5 /bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo +Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB /wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC 6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK +4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60 g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw== -----END CERTIFICATE----- AffirmTrust Premium ECC ======================= -----BEGIN CERTIFICATE----- MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X 57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM eQ== -----END CERTIFICATE----- Certum Trusted Network CA ========================= -----BEGIN CERTIFICATE----- MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4 fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0 cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1 mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI 03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= -----END CERTIFICATE----- Certinomis - Autorité Racine ============================= -----BEGIN CERTIFICATE----- MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjETMBEGA1UEChMK Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAkBgNVBAMMHUNlcnRpbm9taXMg LSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkG A1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYw JAYDVQQDDB1DZXJ0aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQAD ggIPADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jYF1AMnmHa wE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N8y4oH3DfVS9O7cdxbwly Lu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWerP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw 2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92N jMD2AR5vpTESOH2VwnHu7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9q c1pkIuVC28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6lSTC lrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1Enn1So2+WLhl+HPNb xxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB0iSVL1N6aaLwD4ZFjliCK0wi1F6g 530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql095gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna 4NH4+ej9Uji29YnfAgMBAAGjWzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G A1UdDgQWBBQNjLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9sov3/4gbIOZ/x WqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZMOH8oMDX/nyNTt7buFHAAQCva R6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40 nJ+U8/aGH88bc62UeYdocMMzpXDn2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1B CxMjidPJC+iKunqjo3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjv JL1vnxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG5ERQL1TE qkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWqpdEdnV1j6CTmNhTih60b WfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZbdsLLO7XSAPCjDuGtbkD326C00EauFddE wk01+dIL8hf2rGbVJLJP0RyZwG71fet0BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/ vgt2Fl43N+bYdJeimUV5 -----END CERTIFICATE----- Root CA Generalitat Valenciana ============================== -----BEGIN CERTIFICATE----- MIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJFUzEfMB0GA1UE ChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290 IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcNMDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3 WjBoMQswCQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UE CxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0G CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+WmmmO3I2 F0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKjSgbwJ/BXufjpTjJ3Cj9B ZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGlu6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQ D0EbtFpKd71ng+CT516nDOeB0/RSrFOyA8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXte JajCq+TA81yc477OMUxkHl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMB AAGjggM7MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBraS5n dmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIICIwYKKwYBBAG/VQIB ADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBl AHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIAYQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIA YQBsAGkAdABhAHQAIABWAGEAbABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQBy AGEAYwBpAPMAbgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA aQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMAaQBvAG4AYQBt AGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQAZQAgAEEAdQB0AG8AcgBpAGQA YQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBu AHQAcgBhACAAZQBuACAAbABhACAAZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAA OgAvAC8AdwB3AHcALgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0 dHA6Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+yeAT8MIGV BgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQswCQYDVQQGEwJFUzEfMB0G A1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5S b290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRh TvW1yEICKrNcda3FbcrnlD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdz Ckj+IHLtb8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg9J63 NI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XFducTZnV+ZfsBn5OH iJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmCIoaZM3Fa6hlXPZHNqcCjbgcTpsnt +GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM= -----END CERTIFICATE----- TWCA Root Certification Authority ================================= -----BEGIN CERTIFICATE----- MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP 4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG 9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== -----END CERTIFICATE----- Security Communication RootCA2 ============================== -----BEGIN CERTIFICATE----- MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++ +T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R 3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8 QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk 3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29 mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 -----END CERTIFICATE----- EC-ACC ====== -----BEGIN CERTIFICATE----- MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7 MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4 HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw 0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0 Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2 E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D 5EI= -----END CERTIFICATE----- Hellenic Academic and Research Institutions RootCA 2011 ======================================================= -----BEGIN CERTIFICATE----- MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI 1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa 71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u 8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH 3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/ MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8 MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD /md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N 7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4 -----END CERTIFICATE----- Actalis Authentication Root CA ============================== -----BEGIN CERTIFICATE----- MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQxDjAM BgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UE AwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDky MjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlz IFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTufClrJ wkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlNAJZa by/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45RnijMCO6 zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1f YVEiVRvjRuPjPdA1YprbrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2 oxgkg4YQ51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2Fbe8l EfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxeKF+w6D9Fz8+vm2/7 hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4Fv6MGn8i1zeQf1xcGDXqVdFUNaBr8 EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbnfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5 jF66CyCU3nuDuP/jVo23Eek7jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLY iDrIn3hm7YnzezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQALe3KHwGCmSUyI WOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70jsNjLiNmsGe+b7bAEzlgqqI0 JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDzWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKx K3JCaKygvU5a2hi/a5iB0P2avl4VSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+ Xlff1ANATIGk0k9jpwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC 4yyXX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+OkfcvHlXHo 2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7RK4X9p2jIugErsWx0Hbhz lefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btUZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXem OR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9 vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== -----END CERTIFICATE----- Trustis FPS Root CA =================== -----BEGIN CERTIFICATE----- MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQG EwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQLExNUcnVzdGlzIEZQUyBSb290 IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTExMzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNV BAoTD1RydXN0aXMgTGltaXRlZDEcMBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJ KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQ RUN+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihHiTHcDnlk H5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjjvSkCqPoc4Vu5g6hBSLwa cY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zt o3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlBOrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEA AaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAd BgNVHQ4EFgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01GX2c GE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmWzaD+vkAMXBJV+JOC yinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP41BIy+Q7DsdwyhEQsb8tGD+pmQQ9P 8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZEf1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHV l/9D7S3B2l0pKoU/rGXuhg8FjZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYl iB6XzCGcKQENZetX2fNXlrtIzYE= -----END CERTIFICATE----- StartCom Certification Authority ================================ -----BEGIN CERTIFICATE----- MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0 NjM3WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/ Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt 2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z 6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/ untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT 37uMdBNSSwIDAQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFulF2mHMMo0aEPQ Qa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCCATgwLgYIKwYBBQUHAgEWImh0 dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cu c3RhcnRzc2wuY29tL2ludGVybWVkaWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENv bW1lcmNpYWwgKFN0YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0 aGUgc2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0aWZpY2F0 aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3RhcnRzc2wuY29t L3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBG cmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5 fPGFf59Jb2vKXfuM/gTFwWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWm N3PH/UvSTa0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst0OcN Org+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNcpRJvkrKTlMeIFw6T tn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKlCcWw0bdT82AUuoVpaiF8H3VhFyAX e2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVFP0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA 2MFrLH9ZXF2RsXAiV+uKa0hK1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBs HvUwyKMQ5bLmKhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ8dCAWZvLMdib D4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnmfyWl8kgAwKQB2j8= -----END CERTIFICATE----- StartCom Certification Authority G2 =================================== -----BEGIN CERTIFICATE----- MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMN U3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg RzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UE ChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3Jp dHkgRzIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8O o1XJJZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsDvfOpL9HG 4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnooD/Uefyf3lLE3PbfHkffi Aez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/Q0kGi4xDuFby2X8hQxfqp0iVAXV16iul Q5XqFYSdCI0mblWbq9zSOdIxHWDirMxWRST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbs O+wmETRIjfaAKxojAuuKHDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8H vKTlXcxNnw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM0D4L nMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/iUUjXuG+v+E5+M5iS FGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9Ha90OrInwMEePnWjFqmveiJdnxMa z6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHgTuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8E BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJ KoZIhvcNAQELBQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K 2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfXUfEpY9Z1zRbk J4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl6/2o1PXWT6RbdejF0mCy2wl+ JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG /+gyRr61M3Z3qAFdlsHB1b6uJcDJHgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTc nIhT76IxW1hPkWLIwpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/Xld blhYXzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5lIxKVCCIc l85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoohdVddLHRDiBYmxOlsGOm 7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulrso8uBtjRkcfGEvRM/TAXw8HaOFvjqerm obp573PYtlNXLfbQ4ddI -----END CERTIFICATE----- Buypass Class 2 Root CA ======================= -----BEGIN CERTIFICATE----- MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1 g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn 9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b /+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU CqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff awrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI zRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn Bkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX Uq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs M+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF AAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI osHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S aq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd DnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD LfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0 oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC wWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS CTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN rJgWVqA= -----END CERTIFICATE----- Buypass Class 3 Root CA ======================= -----BEGIN CERTIFICATE----- MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR 5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh 7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH 2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV /afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8 ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2 KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz 6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi Cp/HuZc= -----END CERTIFICATE----- T-TeleSec GlobalRoot Class 3 ============================ -----BEGIN CERTIFICATE----- MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3 DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK 9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W 0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw== -----END CERTIFICATE----- EE Certification Centre Root CA =============================== -----BEGIN CERTIFICATE----- MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG EwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2Vy dGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIw MTAxMDMwMTAxMDMwWhgPMjAzMDEyMTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlB UyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRy ZSBSb290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IB DwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUyeuuOF0+W2Ap7kaJjbMeM TC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvObntl8jixwKIy72KyaOBhU8E2lf/slLo2 rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIwWFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw 93X2PaRka9ZP585ArQ/dMtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtN P2MbRMNE1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYDVR0T AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/zQas8fElyalL1BSZ MEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEF BQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEFBQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+Rj xY6hUFaTlrg4wCQiZrxTFGGVv9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqM lIpPnTX/dqQGE5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU 3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfM dcGWxZ0= -----END CERTIFICATE----- TURKTRUST Certificate Services Provider Root 2007 ================================================= -----BEGIN CERTIFICATE----- MIIEPTCCAyWgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvzE/MD0GA1UEAww2VMOcUktUUlVTVCBF bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP MA0GA1UEBwwGQW5rYXJhMV4wXAYDVQQKDFVUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgQXJhbMSxayAyMDA3MB4X DTA3MTIyNTE4MzcxOVoXDTE3MTIyMjE4MzcxOVowgb8xPzA9BgNVBAMMNlTDnFJLVFJVU1QgRWxl a3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTELMAkGA1UEBhMCVFIxDzAN BgNVBAcMBkFua2FyYTFeMFwGA1UECgxVVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp bGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7Fni4gKGMpIEFyYWzEsWsgMjAwNzCCASIw DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKu3PgqMyKVYFeaK7yc9SrToJdPNM8Ig3BnuiD9N YvDdE3ePYakqtdTyuTFYKTsvP2qcb3N2Je40IIDu6rfwxArNK4aUyeNgsURSsloptJGXg9i3phQv KUmi8wUG+7RP2qFsmmaf8EMJyupyj+sA1zU511YXRxcw9L6/P8JorzZAwan0qafoEGsIiveGHtya KhUG9qPw9ODHFNRRf8+0222vR5YXm3dx2KdxnSQM9pQ/hTEST7ruToK4uT6PIzdezKKqdfcYbwnT rqdUKDT74eA7YH2gvnmJhsifLfkKS8RQouf9eRbHegsYz85M733WB2+Y8a+xwXrXgTW4qhe04MsC AwEAAaNCMEAwHQYDVR0OBBYEFCnFkKslrxHkYb+j/4hhkeYO/pyBMA4GA1UdDwEB/wQEAwIBBjAP BgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAQDdr4Ouwo0RSVgrESLFF6QSU2TJ/s Px+EnWVUXKgWAkD6bho3hO9ynYYKVZ1WKKxmLNA6VpM0ByWtCLCPyA8JWcqdmBzlVPi5RX9ql2+I aE1KBiY3iAIOtsbWcpnOa3faYjGkVh+uX4132l32iPwa2Z61gfAyuOOI0JzzaqC5mxRZNTZPz/OO Xl0XrRWV2N2y1RVuAE6zS89mlOTgzbUF2mNXi+WzqtvALhyQRNsaXRik7r4EW5nVcV9VZWRi1aKb BFmGyGJ353yCRWo9F7/snXUMrqNvWtMvmDb08PUZqxFdyKbjKlhqQgnDvZImZjINXQhVdP+MmNAK poRq0Tl9 -----END CERTIFICATE----- D-TRUST Root Class 3 CA 2 2009 ============================== -----BEGIN CERTIFICATE----- MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQK DAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTAe Fw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NThaME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxE LVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIw DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOAD ER03UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42tSHKXzlA BF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9RySPocq60vFYJfxLLHLGv KZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsMlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7z p+hnUquVH+BGPtikw8paxTGA6Eian5Rp/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUC AwEAAaOCARowggEWMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ 4PGEMA4GA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVjdG9y eS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUyMENBJTIwMiUyMDIw MDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRlcmV2b2NhdGlvbmxpc3QwQ6BBoD+G PWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAw OS5jcmwwDQYJKoZIhvcNAQELBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm 2H6NMLVwMeniacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4KzCUqNQT4YJEV dT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8PIWmawomDeCTmGCufsYkl4ph X5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3YJohw1+qRzT65ysCQblrGXnRl11z+o+I= -----END CERTIFICATE----- D-TRUST Root Class 3 CA 2 EV 2009 ================================= -----BEGIN CERTIFICATE----- MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw OTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUwNDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw OTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfS egpnljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM03TP1YtHh zRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6ZqQTMFexgaDbtCHu39b+T 7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lRp75mpoo6Kr3HGrHhFPC+Oh25z1uxav60 sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure35 11H3a6UCAwEAAaOCASQwggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyv cop9NteaHNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFwOi8v ZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xhc3MlMjAzJTIwQ0El MjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1ERT9jZXJ0aWZpY2F0ZXJldm9jYXRp b25saXN0MEagRKBChkBodHRwOi8vd3d3LmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xh c3NfM19jYV8yX2V2XzIwMDkuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+ PPoeUSbrh/Yp3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNFCSuGdXzfX2lX ANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7naxpeG0ILD5EJt/rDiZE4OJudA NCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqXKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVv w9y4AyHqnxbxLFS1 -----END CERTIFICATE----- PSCProcert ========== -----BEGIN CERTIFICATE----- MIIJhjCCB26gAwIBAgIBCzANBgkqhkiG9w0BAQsFADCCAR4xPjA8BgNVBAMTNUF1dG9yaWRhZCBk ZSBDZXJ0aWZpY2FjaW9uIFJhaXogZGVsIEVzdGFkbyBWZW5lem9sYW5vMQswCQYDVQQGEwJWRTEQ MA4GA1UEBxMHQ2FyYWNhczEZMBcGA1UECBMQRGlzdHJpdG8gQ2FwaXRhbDE2MDQGA1UEChMtU2lz dGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMUMwQQYDVQQLEzpTdXBl cmludGVuZGVuY2lhIGRlIFNlcnZpY2lvcyBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMSUw IwYJKoZIhvcNAQkBFhZhY3JhaXpAc3VzY2VydGUuZ29iLnZlMB4XDTEwMTIyODE2NTEwMFoXDTIw MTIyNTIzNTk1OVowgdExJjAkBgkqhkiG9w0BCQEWF2NvbnRhY3RvQHByb2NlcnQubmV0LnZlMQ8w DQYDVQQHEwZDaGFjYW8xEDAOBgNVBAgTB01pcmFuZGExKjAoBgNVBAsTIVByb3ZlZWRvciBkZSBD ZXJ0aWZpY2Fkb3MgUFJPQ0VSVDE2MDQGA1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZp Y2FjaW9uIEVsZWN0cm9uaWNhMQswCQYDVQQGEwJWRTETMBEGA1UEAxMKUFNDUHJvY2VydDCCAiIw DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANW39KOUM6FGqVVhSQ2oh3NekS1wwQYalNo97BVC wfWMrmoX8Yqt/ICV6oNEolt6Vc5Pp6XVurgfoCfAUFM+jbnADrgV3NZs+J74BCXfgI8Qhd19L3uA 3VcAZCP4bsm+lU/hdezgfl6VzbHvvnpC2Mks0+saGiKLt38GieU89RLAu9MLmV+QfI4tL3czkkoh RqipCKzx9hEC2ZUWno0vluYC3XXCFCpa1sl9JcLB/KpnheLsvtF8PPqv1W7/U0HU9TI4seJfxPmO EO8GqQKJ/+MMbpfg353bIdD0PghpbNjU5Db4g7ayNo+c7zo3Fn2/omnXO1ty0K+qP1xmk6wKImG2 0qCZyFSTXai20b1dCl53lKItwIKOvMoDKjSuc/HUtQy9vmebVOvh+qBa7Dh+PsHMosdEMXXqP+UH 0quhJZb25uSgXTcYOWEAM11G1ADEtMo88aKjPvM6/2kwLkDd9p+cJsmWN63nOaK/6mnbVSKVUyqU td+tFjiBdWbjxywbk5yqjKPK2Ww8F22c3HxT4CAnQzb5EuE8XL1mv6JpIzi4mWCZDlZTOpx+FIyw Bm/xhnaQr/2v/pDGj59/i5IjnOcVdo/Vi5QTcmn7K2FjiO/mpF7moxdqWEfLcU8UC17IAggmosvp r2uKGcfLFFb14dq12fy/czja+eevbqQ34gcnAgMBAAGjggMXMIIDEzASBgNVHRMBAf8ECDAGAQH/ AgEBMDcGA1UdEgQwMC6CD3N1c2NlcnRlLmdvYi52ZaAbBgVghl4CAqASDBBSSUYtRy0yMDAwNDAz Ni0wMB0GA1UdDgQWBBRBDxk4qpl/Qguk1yeYVKIXTC1RVDCCAVAGA1UdIwSCAUcwggFDgBStuyId xuDSAaj9dlBSk+2YwU2u06GCASakggEiMIIBHjE+MDwGA1UEAxM1QXV0b3JpZGFkIGRlIENlcnRp ZmljYWNpb24gUmFpeiBkZWwgRXN0YWRvIFZlbmV6b2xhbm8xCzAJBgNVBAYTAlZFMRAwDgYDVQQH EwdDYXJhY2FzMRkwFwYDVQQIExBEaXN0cml0byBDYXBpdGFsMTYwNAYDVQQKEy1TaXN0ZW1hIE5h Y2lvbmFsIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExQzBBBgNVBAsTOlN1cGVyaW50ZW5k ZW5jaWEgZGUgU2VydmljaW9zIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExJTAjBgkqhkiG 9w0BCQEWFmFjcmFpekBzdXNjZXJ0ZS5nb2IudmWCAQowDgYDVR0PAQH/BAQDAgEGME0GA1UdEQRG MESCDnByb2NlcnQubmV0LnZloBUGBWCGXgIBoAwMClBTQy0wMDAwMDKgGwYFYIZeAgKgEgwQUklG LUotMzE2MzUzNzMtNzB2BgNVHR8EbzBtMEagRKBChkBodHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52 ZS9sY3IvQ0VSVElGSUNBRE8tUkFJWi1TSEEzODRDUkxERVIuY3JsMCOgIaAfhh1sZGFwOi8vYWNy YWl6LnN1c2NlcnRlLmdvYi52ZTA3BggrBgEFBQcBAQQrMCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9v Y3NwLnN1c2NlcnRlLmdvYi52ZTBBBgNVHSAEOjA4MDYGBmCGXgMBAjAsMCoGCCsGAQUFBwIBFh5o dHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9kcGMwDQYJKoZIhvcNAQELBQADggIBACtZ6yKZu4Sq T96QxtGGcSOeSwORR3C7wJJg7ODU523G0+1ng3dS1fLld6c2suNUvtm7CpsR72H0xpkzmfWvADmN g7+mvTV+LFwxNG9s2/NkAZiqlCxB3RWGymspThbASfzXg0gTB1GEMVKIu4YXx2sviiCtxQuPcD4q uxtxj7mkoP3YldmvWb8lK5jpY5MvYB7Eqvh39YtsL+1+LrVPQA3uvFd359m21D+VJzog1eWuq2w1 n8GhHVnchIHuTQfiSLaeS5UtQbHh6N5+LwUeaO6/u5BlOsju6rEYNxxik6SgMexxbJHmpHmJWhSn FFAFTKQAVzAswbVhltw+HoSvOULP5dAssSS830DD7X9jSr3hTxJkhpXzsOfIt+FTvZLm8wyWuevo 5pLtp4EJFAv8lXrPj9Y0TzYS3F7RNHXGRoAvlQSMx4bEqCaJqD8Zm4G7UaRKhqsLEQ+xrmNTbSjq 3TNWOByyrYDT13K9mmyZY+gAu0F2BbdbmRiKw7gSXFbPVgx96OLP7bx0R/vu0xdOIk9W/1DzLuY5 poLWccret9W6aAjtmcz9opLLabid+Qqkpj5PkygqYWwHJgD/ll9ohri4zspV4KuxPX+Y1zMOWj3Y eMLEYC/HYvBhkdI4sPaeVdtAgAUSM84dkpvRabP/v/GSCmE1P93+hvS84Bpxs2Km -----END CERTIFICATE----- China Internet Network Information Center EV Certificates Root ============================================================== -----BEGIN CERTIFICATE----- MIID9zCCAt+gAwIBAgIESJ8AATANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCQ04xMjAwBgNV BAoMKUNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyMUcwRQYDVQQDDD5D aGluYSBJbnRlcm5ldCBOZXR3b3JrIEluZm9ybWF0aW9uIENlbnRlciBFViBDZXJ0aWZpY2F0ZXMg Um9vdDAeFw0xMDA4MzEwNzExMjVaFw0zMDA4MzEwNzExMjVaMIGKMQswCQYDVQQGEwJDTjEyMDAG A1UECgwpQ2hpbmEgSW50ZXJuZXQgTmV0d29yayBJbmZvcm1hdGlvbiBDZW50ZXIxRzBFBgNVBAMM PkNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyIEVWIENlcnRpZmljYXRl cyBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm35z7r07eKpkQ0H1UN+U8i6y jUqORlTSIRLIOTJCBumD1Z9S7eVnAztUwYyZmczpwA//DdmEEbK40ctb3B75aDFk4Zv6dOtouSCV 98YPjUesWgbdYavi7NifFy2cyjw1l1VxzUOFsUcW9SxTgHbP0wBkvUCZ3czY28Sf1hNfQYOL+Q2H klY0bBoQCxfVWhyXWIQ8hBouXJE0bhlffxdpxWXvayHG1VA6v2G5BY3vbzQ6sm8UY78WO5upKv23 KzhmBsUs4qpnHkWnjQRmQvaPK++IIGmPMowUc9orhpFjIpryp9vOiYurXccUwVswah+xt54ugQEC 7c+WXmPbqOY4twIDAQABo2MwYTAfBgNVHSMEGDAWgBR8cks5x8DbYqVPm6oYNJKiyoOCWTAPBgNV HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUfHJLOcfA22KlT5uqGDSSosqD glkwDQYJKoZIhvcNAQEFBQADggEBACrDx0M3j92tpLIM7twUbY8opJhJywyA6vPtI2Z1fcXTIWd5 0XPFtQO3WKwMVC/GVhMPMdoG52U7HW8228gd+f2ABsqjPWYWqJ1MFn3AlUa1UeTiH9fqBk1jjZaM 7+czV0I664zBechNdn3e9rG3geCg+aF4RhcaVpjwTj2rHO3sOdwHSPdj/gauwqRcalsyiMXHM4Ws ZkJHwlgkmeHlPuV1LI5D1l08eB6olYIpUNHRFrrvwb562bTYzB5MRuF3sTGrvSrIzo9uoV1/A3U0 5K2JRVRevq4opbs/eHnrc7MKDf2+yfdWrPa37S+bISnHOLaVxATywy39FCqQmbkHzJ8= -----END CERTIFICATE----- Swisscom Root CA 2 ================== -----BEGIN CERTIFICATE----- MIIF2TCCA8GgAwIBAgIQHp4o6Ejy5e/DfEoeWhhntjANBgkqhkiG9w0BAQsFADBkMQswCQYDVQQG EwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2VydGlmaWNhdGUgU2Vy dmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3QgQ0EgMjAeFw0xMTA2MjQwODM4MTRaFw0zMTA2 MjUwNzM4MTRaMGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGln aXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAyMIIC IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAlUJOhJ1R5tMJ6HJaI2nbeHCOFvErjw0DzpPM LgAIe6szjPTpQOYXTKueuEcUMncy3SgM3hhLX3af+Dk7/E6J2HzFZ++r0rk0X2s682Q2zsKwzxNo ysjL67XiPS4h3+os1OD5cJZM/2pYmLcX5BtS5X4HAB1f2uY+lQS3aYg5oUFgJWFLlTloYhyxCwWJ wDaCFCE/rtuh/bxvHGCGtlOUSbkrRsVPACu/obvLP+DHVxxX6NZp+MEkUp2IVd3Chy50I9AU/SpH Wrumnf2U5NGKpV+GY3aFy6//SSj8gO1MedK75MDvAe5QQQg1I3ArqRa0jG6F6bYRzzHdUyYb3y1a SgJA/MTAtukxGggo5WDDH8SQjhBiYEQN7Aq+VRhxLKX0srwVYv8c474d2h5Xszx+zYIdkeNL6yxS NLCK/RJOlrDrcH+eOfdmQrGrrFLadkBXeyq96G4DsguAhYidDMfCd7Camlf0uPoTXGiTOmekl9Ab mbeGMktg2M7v0Ax/lZ9vh0+Hio5fCHyqW/xavqGRn1V9TrALacywlKinh/LTSlDcX3KwFnUey7QY Ypqwpzmqm59m2I2mbJYV4+by+PGDYmy7Velhk6M99bFXi08jsJvllGov34zflVEpYKELKeRcVVi3 qPyZ7iVNTA6z00yPhOgpD/0QVAKFyPnlw4vP5w8CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYw HQYDVR0hBBYwFDASBgdghXQBUwIBBgdghXQBUwIBMBIGA1UdEwEB/wQIMAYBAf8CAQcwHQYDVR0O BBYEFE0mICKJS9PVpAqhb97iEoHF8TwuMB8GA1UdIwQYMBaAFE0mICKJS9PVpAqhb97iEoHF8Twu MA0GCSqGSIb3DQEBCwUAA4ICAQAyCrKkG8t9voJXiblqf/P0wS4RfbgZPnm3qKhyN2abGu2sEzsO v2LwnN+ee6FTSA5BesogpxcbtnjsQJHzQq0Qw1zv/2BZf82Fo4s9SBwlAjxnffUy6S8w5X2lejjQ 82YqZh6NM4OKb3xuqFp1mrjX2lhIREeoTPpMSQpKwhI3qEAMw8jh0FcNlzKVxzqfl9NX+Ave5XLz o9v/tdhZsnPdTSpxsrpJ9csc1fV5yJmz/MFMdOO0vSk3FQQoHt5FRnDsr7p4DooqzgB53MBfGWcs a0vvaGgLQ+OswWIJ76bdZWGgr4RVSJFSHMYlkSrQwSIjYVmvRRGFHQEkNI/Ps/8XciATwoCqISxx OQ7Qj1zB09GOInJGTB2Wrk9xseEFKZZZ9LuedT3PDTcNYtsmjGOpI99nBjx8Oto0QuFmtEYE3saW mA9LSHokMnWRn6z3aOkquVVlzl1h0ydw2Df+n7mvoC5Wt6NlUe07qxS/TFED6F+KBZvuim6c779o +sjaC+NCydAXFJy3SuCvkychVSa1ZC+N8f+mQAWFBVzKBxlcCxMoTFh/wqXvRdpg065lYZ1Tg3TC rvJcwhbtkj6EPnNgiLx29CzP0H1907he0ZESEOnN3col49XtmS++dYFLJPlFRpTJKSFTnCZFqhMX 5OfNeOI5wSsSnqaeG8XmDtkx2Q== -----END CERTIFICATE----- Swisscom Root EV CA 2 ===================== -----BEGIN CERTIFICATE----- MIIF4DCCA8igAwIBAgIRAPL6ZOJ0Y9ON/RAdBB92ylgwDQYJKoZIhvcNAQELBQAwZzELMAkGA1UE BhMCY2gxETAPBgNVBAoTCFN3aXNzY29tMSUwIwYDVQQLExxEaWdpdGFsIENlcnRpZmljYXRlIFNl cnZpY2VzMR4wHAYDVQQDExVTd2lzc2NvbSBSb290IEVWIENBIDIwHhcNMTEwNjI0MDk0NTA4WhcN MzEwNjI1MDg0NTA4WjBnMQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsT HERpZ2l0YWwgQ2VydGlmaWNhdGUgU2VydmljZXMxHjAcBgNVBAMTFVN3aXNzY29tIFJvb3QgRVYg Q0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMT3HS9X6lds93BdY7BxUglgRCgz o3pOCvrY6myLURYaVa5UJsTMRQdBTxB5f3HSek4/OE6zAMaVylvNwSqD1ycfMQ4jFrclyxy0uYAy Xhqdk/HoPGAsp15XGVhRXrwsVgu42O+LgrQ8uMIkqBPHoCE2G3pXKSinLr9xJZDzRINpUKTk4Rti GZQJo/PDvO/0vezbE53PnUgJUmfANykRHvvSEaeFGHR55E+FFOtSN+KxRdjMDUN/rhPSays/p8Li qG12W0OfvrSdsyaGOx9/5fLoZigWJdBLlzin5M8J0TbDC77aO0RYjb7xnglrPvMyxyuHxuxenPaH Za0zKcQvidm5y8kDnftslFGXEBuGCxobP/YCfnvUxVFkKJ3106yDgYjTdLRZncHrYTNaRdHLOdAG alNgHa/2+2m8atwBz735j9m9W8E6X47aD0upm50qKGsaCnw8qyIL5XctcfaCNYGu+HuB5ur+rPQa m3Rc6I8k9l2dRsQs0h4rIWqDJ2dVSqTjyDKXZpBy2uPUZC5f46Fq9mDU5zXNysRojddxyNMkM3Ox bPlq4SjbX8Y96L5V5jcb7STZDxmPX2MYWFCBUWVv8p9+agTnNCRxunZLWB4ZvRVgRaoMEkABnRDi xzgHcgplwLa7JSnaFp6LNYth7eVxV4O1PHGf40+/fh6Bn0GXAgMBAAGjgYYwgYMwDgYDVR0PAQH/ BAQDAgGGMB0GA1UdIQQWMBQwEgYHYIV0AVMCAgYHYIV0AVMCAjASBgNVHRMBAf8ECDAGAQH/AgED MB0GA1UdDgQWBBRF2aWBbj2ITY1x0kbBbkUe88SAnTAfBgNVHSMEGDAWgBRF2aWBbj2ITY1x0kbB bkUe88SAnTANBgkqhkiG9w0BAQsFAAOCAgEAlDpzBp9SSzBc1P6xXCX5145v9Ydkn+0UjrgEjihL j6p7jjm02Vj2e6E1CqGdivdj5eu9OYLU43otb98TPLr+flaYC/NUn81ETm484T4VvwYmneTwkLbU wp4wLh/vx3rEUMfqe9pQy3omywC0Wqu1kx+AiYQElY2NfwmTv9SoqORjbdlk5LgpWgi/UOGED1V7 XwgiG/W9mR4U9s70WBCCswo9GcG/W6uqmdjyMb3lOGbcWAXH7WMaLgqXfIeTK7KK4/HsGOV1timH 59yLGn602MnTihdsfSlEvoqq9X46Lmgxk7lq2prg2+kupYTNHAq4Sgj5nPFhJpiTt3tm7JFe3VE/ 23MPrQRYCd0EApUKPtN236YQHoA96M2kZNEzx5LH4k5E4wnJTsJdhw4Snr8PyQUQ3nqjsTzyP6Wq J3mtMX0f/fwZacXduT98zca0wjAefm6S139hdlqP65VNvBFuIXxZN5nQBrz5Bm0yFqXZaajh3DyA HmBR3NdUIR7KYndP+tiPsys6DXhyyWhBWkdKwqPrGtcKqzwyVcgKEZzfdNbwQBUdyLmPtTbFr/gi uMod89a2GQ+fYWVq6nTIfI/DT11lgh/ZDYnadXL77/FHZxOzyNEZiCcmmpl5fx7kLD977vHeTYuW l8PVP3wbI+2ksx0WckNLIOFZfsLorSa/ovc= -----END CERTIFICATE----- CA Disig Root R1 ================ -----BEGIN CERTIFICATE----- MIIFaTCCA1GgAwIBAgIJAMMDmu5QkG4oMA0GCSqGSIb3DQEBBQUAMFIxCzAJBgNVBAYTAlNLMRMw EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp ZyBSb290IFIxMB4XDTEyMDcxOTA5MDY1NloXDTQyMDcxOTA5MDY1NlowUjELMAkGA1UEBhMCU0sx EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp c2lnIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCqw3j33Jijp1pedxiy 3QRkD2P9m5YJgNXoqqXinCaUOuiZc4yd39ffg/N4T0Dhf9Kn0uXKE5Pn7cZ3Xza1lK/oOI7bm+V8 u8yN63Vz4STN5qctGS7Y1oprFOsIYgrY3LMATcMjfF9DCCMyEtztDK3AfQ+lekLZWnDZv6fXARz2 m6uOt0qGeKAeVjGu74IKgEH3G8muqzIm1Cxr7X1r5OJeIgpFy4QxTaz+29FHuvlglzmxZcfe+5nk CiKxLU3lSCZpq+Kq8/v8kiky6bM+TR8noc2OuRf7JT7JbvN32g0S9l3HuzYQ1VTW8+DiR0jm3hTa YVKvJrT1cU/J19IG32PK/yHoWQbgCNWEFVP3Q+V8xaCJmGtzxmjOZd69fwX3se72V6FglcXM6pM6 vpmumwKjrckWtc7dXpl4fho5frLABaTAgqWjR56M6ly2vGfb5ipN0gTco65F97yLnByn1tUD3AjL LhbKXEAz6GfDLuemROoRRRw1ZS0eRWEkG4IupZ0zXWX4Qfkuy5Q/H6MMMSRE7cderVC6xkGbrPAX ZcD4XW9boAo0PO7X6oifmPmvTiT6l7Jkdtqr9O3jw2Dv1fkCyC2fg69naQanMVXVz0tv/wQFx1is XxYb5dKj6zHbHzMVTdDypVP1y+E9Tmgt2BLdqvLmTZtJ5cUoobqwWsagtQIDAQABo0IwQDAPBgNV HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUiQq0OJMa5qvum5EY+fU8PjXQ 04IwDQYJKoZIhvcNAQEFBQADggIBADKL9p1Kyb4U5YysOMo6CdQbzoaz3evUuii+Eq5FLAR0rBNR xVgYZk2C2tXck8An4b58n1KeElb21Zyp9HWc+jcSjxyT7Ff+Bw+r1RL3D65hXlaASfX8MPWbTx9B LxyE04nH4toCdu0Jz2zBuByDHBb6lM19oMgY0sidbvW9adRtPTXoHqJPYNcHKfyyo6SdbhWSVhlM CrDpfNIZTUJG7L399ldb3Zh+pE3McgODWF3vkzpBemOqfDqo9ayk0d2iLbYq/J8BjuIQscTK5Gfb VSUZP/3oNn6z4eGBrxEWi1CXYBmCAMBrTXO40RMHPuq2MU/wQppt4hF05ZSsjYSVPCGvxdpHyN85 YmLLW1AL14FABZyb7bq2ix4Eb5YgOe2kfSnbSM6C3NQCjR0EMVrHS/BsYVLXtFHCgWzN4funodKS ds+xDzdYpPJScWc/DIh4gInByLUfkmO+p3qKViwaqKactV2zY9ATIKHrkWzQjX2v3wvkF7mGnjix lAxYjOBVqjtjbZqJYLhkKpLGN/R+Q0O3c+gB53+XD9fyexn9GtePyfqFa3qdnom2piiZk4hA9z7N UaPK6u95RyG1/jLix8NRb76AdPCkwzryT+lf3xkK8jsTQ6wxpLPn6/wY1gGp8yqPNg7rtLG8t0zJ a7+h89n07eLw4+1knj0vllJPgFOL -----END CERTIFICATE----- CA Disig Root R2 ================ -----BEGIN CERTIFICATE----- MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNVBAYTAlNLMRMw EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp ZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQyMDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sx EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp c2lnIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbC w3OeNcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNHPWSb6Wia xswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3Ix2ymrdMxp7zo5eFm1tL7 A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbeQTg06ov80egEFGEtQX6sx3dOy1FU+16S GBsEWmjGycT6txOgmLcRK7fWV8x8nhfRyyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqV g8NTEQxzHQuyRpDRQjrOQG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa 5Beny912H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJQfYE koopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUDi/ZnWejBBhG93c+A Ak9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORsnLMOPReisjQS1n6yqEm70XooQL6i Fh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNV HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5u Qu0wDQYJKoZIhvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqfGopTpti72TVV sRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkblvdhuDvEK7Z4bLQjb/D907Je dR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W8 1k/BfDxujRNt+3vrMNDcTa/F1balTFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjx mHHEt38OFdAlab0inSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01 utI3gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18DrG5gPcFw0 sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3OszMOl6W8KjptlwlCFtaOg UxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8xL4ysEr3vQCj8KWefshNPZiTEUxnpHikV 7+ZtsH8tZ/3zbBt1RqPlShfppNcL -----END CERTIFICATE----- ACCVRAIZ1 ========= -----BEGIN CERTIFICATE----- MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UEAwwJQUNDVlJB SVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQswCQYDVQQGEwJFUzAeFw0xMTA1 MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQBgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwH UEtJQUNDVjENMAsGA1UECgwEQUNDVjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4IC DwAwggIKAoICAQCbqau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gM jmoYHtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWoG2ioPej0 RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpAlHPrzg5XPAOBOp0KoVdD aaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhrIA8wKFSVf+DuzgpmndFALW4ir50awQUZ 0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDG WuzndN9wrqODJerWx5eHk6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs7 8yM2x/474KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMOm3WR 5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpacXpkatcnYGMN285J 9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPluUsXQA+xtrn13k/c4LOsOxFwYIRK Q26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYIKwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRw Oi8vd3d3LmFjY3YuZXMvZmlsZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEu Y3J0MB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeTVfZW6oHlNsyM Hj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIGCCsGAQUFBwICMIIBFB6CARAA QQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUAcgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBh AO0AegAgAGQAZQAgAGwAYQAgAEEAQwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUA YwBuAG8AbABvAGcA7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBj AHQAcgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAAQwBQAFMA IABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUAczAwBggrBgEFBQcCARYk aHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2MuaHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0 dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRtaW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2 MV9kZXIuY3JsMA4GA1UdDwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZI hvcNAQEFBQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdpD70E R9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gUJyCpZET/LtZ1qmxN YEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+mAM/EKXMRNt6GGT6d7hmKG9Ww7Y49 nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepDvV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJ TS+xJlsndQAJxGJ3KQhfnlmstn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3 sCPdK6jT2iWH7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szAh1xA2syVP1Xg Nce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xFd3+YJ5oyXSrjhO7FmGYvliAd 3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2HpPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3p EfbRD0tVNEYqi4Y7 -----END CERTIFICATE----- TWCA Global Root CA =================== -----BEGIN CERTIFICATE----- MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcxEjAQBgNVBAoT CVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMTVFdDQSBHbG9iYWwgUm9vdCBD QTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQK EwlUQUlXQU4tQ0ExEDAOBgNVBAsTB1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3Qg Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2C nJfF10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz0ALfUPZV r2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfChMBwqoJimFb3u/Rk28OKR Q4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbHzIh1HrtsBv+baz4X7GGqcXzGHaL3SekV tTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1W KKD+u4ZqyPpcC1jcxkt2yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99 sy2sbZCilaLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYPoA/p yJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQABDzfuBSO6N+pjWxn kjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcEqYSjMq+u7msXi7Kx/mzhkIyIqJdI zshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMC AQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6g cFGn90xHNcgL1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WFH6vPNOw/KP4M 8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNoRI2T9GRwoD2dKAXDOXC4Ynsg /eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlg lPx4mI88k1HtQJAH32RjJMtOcQWh15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryP A9gK8kxkRr05YuWW6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3m i4TWnsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5jwa19hAM8 EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWzaGHQRiapIVJpLesux+t3 zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmyKwbQBM0= -----END CERTIFICATE----- TeliaSonera Root CA v1 ====================== -----BEGIN CERTIFICATE----- MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAwNzEUMBIGA1UE CgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJvb3QgQ0EgdjEwHhcNMDcxMDE4 MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYDVQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwW VGVsaWFTb25lcmEgUm9vdCBDQSB2MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+ 6yfwIaPzaSZVfp3FVRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA 3GV17CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+XZ75Ljo1k B1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+/jXh7VB7qTCNGdMJjmhn Xb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxH oLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkmdtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3 F0fUTPHSiXk+TT2YqGHeOh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJ oWjiUIMusDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4pgd7 gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fsslESl1MpWtTwEhDc TwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQarMCpgKIv7NHfirZ1fpoeDVNAgMB AAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qW DNXr+nuqF+gTEjANBgkqhkiG9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNm zqjMDfz1mgbldxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx 0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1TjTQpgcmLNkQfW pb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBedY2gea+zDTYa4EzAvXUYNR0PV G6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpc c41teyWRyu5FrgZLAMzTsVlQ2jqIOylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOT JsjrDNYmiLbAJM+7vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2 qReWt88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcnHL/EVlP6 Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVxSK236thZiNSQvxaz2ems WWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= -----END CERTIFICATE----- E-Tugra Certification Authority =============================== -----BEGIN CERTIFICATE----- MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNVBAYTAlRSMQ8w DQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamls ZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMw NTEyMDk0OFoXDTIzMDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmEx QDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxl cmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQD DB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A MIICCgKCAgEA4vU/kwVRHoViVF56C/UYB4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vd hQd2h8y/L5VMzH2nPbxHD5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5K CKpbknSFQ9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEoq1+g ElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3Dk14opz8n8Y4e0ypQ BaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcHfC425lAcP9tDJMW/hkd5s3kc91r0 E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsutdEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gz rt48Ue7LE3wBf4QOXVGUnhMMti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAq jqFGOjGY5RH8zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUXU8u3Zg5mTPj5 dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6Jyr+zE7S6E5UMA8GA1UdEwEB /wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEG MA0GCSqGSIb3DQEBCwUAA4ICAQAFNzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAK kEh47U6YA5n+KGCRHTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jO XKqYGwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c77NCR807 VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3+GbHeJAAFS6LrVE1Uweo a2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WKvJUawSg5TB9D0pH0clmKuVb8P7Sd2nCc dlqMQ1DujjByTd//SffGqWfZbawCEeI6FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEV KV0jq9BgoRJP3vQXzTLlyb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gT Dx4JnW2PAJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpDy4Q0 8ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8dNL/+I5c30jn6PQ0G C7TbO6Orb1wdtn7os4I07QZcJA== -----END CERTIFICATE----- T-TeleSec GlobalRoot Class 2 ============================ -----BEGIN CERTIFICATE----- MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgx MDAxMTA0MDE0WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0GCSqGSIb3 DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUdAqSzm1nzHoqvNK38DcLZ SBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiCFoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/F vudocP05l03Sx5iRUKrERLMjfTlH6VJi1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx970 2cu+fjOlbpSD8DT6IavqjnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGV WOHAD3bZwI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGjQjBA MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/WSA2AHmgoCJrjNXy YdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhyNsZt+U2e+iKo4YFWz827n+qrkRk4 r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPACuvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNf vNoBYimipidx5joifsFvHZVwIEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR 3p1m0IvVVGb6g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN 9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlPBSeOE6Fuwg== -----END CERTIFICATE----- Atos TrustedRoot 2011 ===================== -----BEGIN CERTIFICATE----- MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UEAwwVQXRvcyBU cnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0xMTA3MDcxNDU4 MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMMFUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsG A1UECgwEQXRvczELMAkGA1UEBhMCREUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCV hTuXbyo7LjvPpvMpNb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr 54rMVD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+SZFhyBH+ DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ4J7sVaE3IqKHBAUsR320 HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0Lcp2AMBYHlT8oDv3FdU9T1nSatCQujgKR z3bFmx5VdJx4IbHwLfELn8LVlhgf8FQieowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7R l+lwrrw7GWzbITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZ bNshMBgGA1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB CwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8jvZfza1zv7v1Apt+h k6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kPDpFrdRbhIfzYJsdHt6bPWHJxfrrh TZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pcmaHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a9 61qn8FYiqTxlVMYVqL2Gns2Dlmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G 3mB/ufNPRJLvKrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed -----END CERTIFICATE----- QuoVadis Root CA 1 G3 ===================== -----BEGIN CERTIFICATE----- MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQELBQAwSDELMAkG A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv b3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJN MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEg RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakE PBtVwedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWerNrwU8lm PNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF34168Xfuw6cwI2H44g4hWf6 Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh4Pw5qlPafX7PGglTvF0FBM+hSo+LdoIN ofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXpUhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/l g6AnhF4EwfWQvTA9xO+oabw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV 7qJZjqlc3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/GKubX 9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSthfbZxbGL0eUQMk1f iyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KOTk0k+17kBL5yG6YnLUlamXrXXAkg t3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOtzCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZI hvcNAQELBQADggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2cDMT/uFPpiN3 GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUNqXsCHKnQO18LwIE6PWThv6ct Tr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP +V04ikkwj+3x6xn0dxoxGE1nVGwvb2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh 3jRJjehZrJ3ydlo28hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fa wx/kNSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNjZgKAvQU6 O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhpq1467HxpvMc7hU6eFbm0 FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFtnh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOV hMJKzRwuJIczYOXD -----END CERTIFICATE----- QuoVadis Root CA 2 G3 ===================== -----BEGIN CERTIFICATE----- MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQELBQAwSDELMAkG A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv b3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJN MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIg RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFh ZiFfqq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMWn4rjyduY NM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ymc5GQYaYDFCDy54ejiK2t oIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+O7q414AB+6XrW7PFXmAqMaCvN+ggOp+o MiwMzAkd056OXbxMmO7FGmh77FOm6RQ1o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+l V0POKa2Mq1W/xPtbAd0jIaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZo L1NesNKqIcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz8eQQ sSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43ehvNURG3YBZwjgQQvD 6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l7ZizlWNof/k19N+IxWA1ksB8aRxh lRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALGcC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZI hvcNAQELBQADggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RCroijQ1h5fq7K pVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0GaW/ZZGYjeVYg3UQt4XAoeo0L9 x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4nlv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgz dWqTHBLmYF5vHX/JHyPLhGGfHoJE+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6X U/IyAgkwo1jwDQHVcsaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+Nw mNtddbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNgKCLjsZWD zYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeMHVOyToV7BjjHLPj4sHKN JeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4WSr2Rz0ZiC3oheGe7IUIarFsNMkd7Egr O3jtZsSOeWmD3n+M -----END CERTIFICATE----- QuoVadis Root CA 3 G3 ===================== -----BEGIN CERTIFICATE----- MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQELBQAwSDELMAkG A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv b3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJN MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMg RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286 IxSR/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNuFoM7pmRL Mon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXRU7Ox7sWTaYI+FrUoRqHe 6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+cra1AdHkrAj80//ogaX3T7mH1urPnMNA3 I4ZyYUUpSFlob3emLoG+B01vr87ERRORFHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3U VDmrJqMz6nWB2i3ND0/kA9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f7 5li59wzweyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634RylsSqi Md5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBpVzgeAVuNVejH38DM dyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0QA4XN8f+MFrXBsj6IbGB/kE+V9/Yt rQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZI hvcNAQELBQADggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnIFUBhynLWcKzS t/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5WvvoxXqA/4Ti2Tk08HS6IT7SdEQ TXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFgu/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9Du DcpmvJRPpq3t/O5jrFc/ZSXPsoaP0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGib Ih6BJpsQBJFxwAYf3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmD hPbl8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+DhcI00iX 0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HNPlopNLk9hM6xZdRZkZFW dSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ywaZWWDYWGWVjUTR939+J399roD1B0y2 PpxxVJkES/1Y+Zj0 -----END CERTIFICATE----- DigiCert Assured ID Root G2 =========================== -----BEGIN CERTIFICATE----- MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgw MTE1MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIw ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSAn61UQbVH 35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4HteccbiJVMWWXvdMX0h5i89vq bFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9HpEgjAALAcKxHad3A2m67OeYfcgnDmCXRw VWmvo2ifv922ebPynXApVfSr/5Vh88lAbx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OP YLfykqGxvYmJHzDNw6YuYjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+Rn lTGNAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTO w0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPIQW5pJ6d1Ee88hjZv 0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I0jJmwYrA8y8678Dj1JGG0VDjA9tz d29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4GnilmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAW hsI6yLETcDbYz+70CjTVW0z9B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0M jomZmWzwPDCvON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo IhNzbM8m9Yop5w== -----END CERTIFICATE----- DigiCert Assured ID Root G3 =========================== -----BEGIN CERTIFICATE----- MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYD VQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQ BgcqhkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJfZn4f5dwb RXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17QRSAPWXYQ1qAk8C3eNvJs KTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgF UaFNN6KDec6NHSrkhDAKBggqhkjOPQQDAwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5Fy YZ5eEJJZVrmDxxDnOOlYJjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy 1vUhZscv6pZjamVFkpUBtA== -----END CERTIFICATE----- DigiCert Global Root G2 ======================= -----BEGIN CERTIFICATE----- MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUx MjAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI2/Ou8jqJ kTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx1x7e/dfgy5SDN67sH0NO 3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQq2EGnI/yuum06ZIya7XzV+hdG82MHauV BJVJ8zUtluNJbd134/tJS7SsVQepj5WztCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyM UNGPHgm+F6HmIcr9g+UQvIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQAB o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV5uNu 5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY1Yl9PMWLSn/pvtsr F9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4NeF22d+mQrvHRAiGfzZ0JFrabA0U WTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NGFdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBH QRFXGU7Aj64GxJUTFy8bJZ918rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/ iyK5S9kJRaTepLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl MrY= -----END CERTIFICATE----- DigiCert Global Root G3 ======================= -----BEGIN CERTIFICATE----- MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQswCQYDVQQGEwJV UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYD VQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAw MDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5k aWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0C AQYFK4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FGfp4tn+6O YwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPOZ9wj/wMco+I+o0IwQDAP BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNp Yim8S8YwCgYIKoZIzj0EAwMDaAAwZQIxAK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y 3maTD/HMsQmP3Wyr+mt/oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34 VOKa5Vt8sycX -----END CERTIFICATE----- DigiCert Trusted Root G4 ======================== -----BEGIN CERTIFICATE----- MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBiMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEw HwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 MTIwMDAwWjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0G CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3yithZwuEp pz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9o k3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7Fsa vOvJz82sNEBfsXpm7nfISKhmV1efVFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGY QJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6 MUSaM0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCiEhtm mnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADMfRyVw4/3IbKyEbe7 f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFH dL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8 oR7FwI+isX4KJpn15GkvmB0t9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud DwEB/wQEAwIBhjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2SV1EY+CtnJYY ZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd+SeuMIW59mdNOj6PWTkiU0Tr yF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWcfFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy 7zBZLq7gcfJW5GqXb5JQbZaNaHqasjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iah ixTXTBmyUEFxPT9NcCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN 5r5N0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie4u1Ki7wb /UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mIr/OSmbaz5mEP0oUA51Aa 5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tK G48BtieVU+i2iW1bvGjUI+iLUaJW+fCmgKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP 82Z+ -----END CERTIFICATE----- WoSign ====== -----BEGIN CERTIFICATE----- MIIFdjCCA16gAwIBAgIQXmjWEXGUY1BWAGjzPsnFkTANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQG EwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxKjAoBgNVBAMTIUNlcnRpZmljYXRpb24g QXV0aG9yaXR5IG9mIFdvU2lnbjAeFw0wOTA4MDgwMTAwMDFaFw0zOTA4MDgwMTAwMDFaMFUxCzAJ BgNVBAYTAkNOMRowGAYDVQQKExFXb1NpZ24gQ0EgTGltaXRlZDEqMCgGA1UEAxMhQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkgb2YgV29TaWduMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA vcqNrLiRFVaXe2tcesLea9mhsMMQI/qnobLMMfo+2aYpbxY94Gv4uEBf2zmoAHqLoE1UfcIiePyO CbiohdfMlZdLdNiefvAA5A6JrkkoRBoQmTIPJYhTpA2zDxIIFgsDcSccf+Hb0v1naMQFXQoOXXDX 2JegvFNBmpGN9J42Znp+VsGQX+axaCA2pIwkLCxHC1l2ZjC1vt7tj/id07sBMOby8w7gLJKA84X5 KIq0VC6a7fd2/BVoFutKbOsuEo/Uz/4Mx1wdC34FMr5esAkqQtXJTpCzWQ27en7N1QhatH/YHGkR +ScPewavVIMYe+HdVHpRaG53/Ma/UkpmRqGyZxq7o093oL5d//xWC0Nyd5DKnvnyOfUNqfTq1+ez EC8wQjchzDBwyYaYD8xYTYO7feUapTeNtqwylwA6Y3EkHp43xP901DfA4v6IRmAR3Qg/UDaruHqk lWJqbrDKaiFaafPz+x1wOZXzp26mgYmhiMU7ccqjUu6Du/2gd/Tkb+dC221KmYo0SLwX3OSACCK2 8jHAPwQ+658geda4BmRkAjHXqc1S+4RFaQkAKtxVi8QGRkvASh0JWzko/amrzgD5LkhLJuYwTKVY yrREgk/nkR4zw7CT/xH8gdLKH3Ep3XZPkiWvHYG3Dy+MwwbMLyejSuQOmbp8HkUff6oZRZb9/D0C AwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFOFmzw7R 8bNLtwYgFP6HEtX2/vs+MA0GCSqGSIb3DQEBBQUAA4ICAQCoy3JAsnbBfnv8rWTjMnvMPLZdRtP1 LOJwXcgu2AZ9mNELIaCJWSQBnfmvCX0KI4I01fx8cpm5o9dU9OpScA7F9dY74ToJMuYhOZO9sxXq T2r09Ys/L3yNWC7F4TmgPsc9SnOeQHrAK2GpZ8nzJLmzbVUsWh2eJXLOC62qx1ViC777Y7NhRCOj y+EaDveaBk3e1CNOIZZbOVtXHS9dCF4Jef98l7VNg64N1uajeeAz0JmWAjCnPv/So0M/BVoG6kQC 2nz4SNAzqfkHx5Xh9T71XXG68pWpdIhhWeO/yloTunK0jF02h+mmxTwTv97QRCbut+wucPrXnbes 5cVAWubXbHssw1abR80LzvobtCHXt2a49CUwi1wNuepnsvRtrtWhnk/Yn+knArAdBtaP4/tIEp9/ EaEQPkxROpaw0RPxx9gmrjrKkcRpnd8BKWRRb2jaFOwIQZeQjdCygPLPwj2/kWjFgGcexGATVdVh mVd8upUPYUk6ynW8yQqTP2cOEvIo4jEbwFcW3wh8GcF+Dx+FHgo2fFt+J7x6v+Db9NpSvd4MVHAx kUOVyLzwPt0JfjBkUO1/AaQzZ01oT74V77D2AhGiGxMlOtzCWfHjXEa7ZywCRuoeSKbmW9m1vFGi kpbbqsY3Iqb+zCB0oy2pLmvLwIIRIbWTee5Ehr7XHuQe+w== -----END CERTIFICATE----- WoSign China ============ -----BEGIN CERTIFICATE----- MIIFWDCCA0CgAwIBAgIQUHBrzdgT/BtOOzNy0hFIjTANBgkqhkiG9w0BAQsFADBGMQswCQYDVQQG EwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxGzAZBgNVBAMMEkNBIOayg+mAmuagueiv geS5pjAeFw0wOTA4MDgwMTAwMDFaFw0zOTA4MDgwMTAwMDFaMEYxCzAJBgNVBAYTAkNOMRowGAYD VQQKExFXb1NpZ24gQ0EgTGltaXRlZDEbMBkGA1UEAwwSQ0Eg5rKD6YCa5qC56K+B5LmmMIICIjAN BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0EkhHiX8h8EqwqzbdoYGTufQdDTc7WU1/FDWiD+k 8H/rD195L4mx/bxjWDeTmzj4t1up+thxx7S8gJeNbEvxUNUqKaqoGXqW5pWOdO2XCld19AXbbQs5 uQF/qvbW2mzmBeCkTVL829B0txGMe41P/4eDrv8FAxNXUDf+jJZSEExfv5RxadmWPgxDT74wwJ85 dE8GRV2j1lY5aAfMh09Qd5Nx2UQIsYo06Yms25tO4dnkUkWMLhQfkWsZHWgpLFbE4h4TV2TwYeO5 Ed+w4VegG63XX9Gv2ystP9Bojg/qnw+LNVgbExz03jWhCl3W6t8Sb8D7aQdGctyB9gQjF+BNdeFy b7Ao65vh4YOhn0pdr8yb+gIgthhid5E7o9Vlrdx8kHccREGkSovrlXLp9glk3Kgtn3R46MGiCWOc 76DbT52VqyBPt7D3h1ymoOQ3OMdc4zUPLK2jgKLsLl3Az+2LBcLmc272idX10kaO6m1jGx6KyX2m +Jzr5dVjhU1zZmkR/sgO9MHHZklTfuQZa/HpelmjbX7FF+Ynxu8b22/8DU0GAbQOXDBGVWCvOGU6 yke6rCzMRh+yRpY/8+0mBe53oWprfi1tWFxK1I5nuPHa1UaKJ/kR8slC/k7e3x9cxKSGhxYzoacX GKUN5AXlK8IrC6KVkLn9YDxOiT7nnO4fuwECAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1Ud EwEB/wQFMAMBAf8wHQYDVR0OBBYEFOBNv9ybQV0T6GTwp+kVpOGBwboxMA0GCSqGSIb3DQEBCwUA A4ICAQBqinA4WbbaixjIvirTthnVZil6Xc1bL3McJk6jfW+rtylNpumlEYOnOXOvEESS5iVdT2H6 yAa+Tkvv/vMx/sZ8cApBWNromUuWyXi8mHwCKe0JgOYKOoICKuLJL8hWGSbueBwj/feTZU7n85iY r83d2Z5AiDEoOqsuC7CsDCT6eiaY8xJhEPRdF/d+4niXVOKM6Cm6jBAyvd0zaziGfjk9DgNyp115 j0WKWa5bIW4xRtVZjc8VX90xJc/bYNaBRHIpAlf2ltTW/+op2znFuCyKGo3Oy+dCMYYFaA6eFN0A kLppRQjbbpCBhqcqBT/mhDn4t/lXX0ykeVoQDF7Va/81XwVRHmyjdanPUIPTfPRm94KNPQx96N97 qA4bLJyuQHCH2u2nFoJavjVsIE4iYdm8UXrNemHcSxH5/mc0zy4EZmFcV5cjjPOGG0jfKq+nwf/Y jj4Du9gqsPoUJbJRa4ZDhS4HIxaAjUz7tGM7zMN07RujHv41D198HRaG9Q7DlfEvr10lO1Hm13ZB ONFLAzkopR6RctR9q5czxNM+4Gm2KHmgCY0c0f9BckgG/Jou5yD5m6Leie2uPAmvylezkolwQOQv T8Jwg0DXJCxr5wkf09XHwQj02w47HAcLQxGEIYbpgNR12KvxAmLBsX5VYc8T1yaw15zLKYs4SgsO kI26oQ== -----END CERTIFICATE----- COMODO RSA Certification Authority ================================== -----BEGIN CERTIFICATE----- MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCBhTELMAkGA1UE BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlv biBBdXRob3JpdHkwHhcNMTAwMTE5MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMC R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBB dXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR6FSS0gpWsawNJN3Fz0Rn dJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8Xpz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZ FGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+ 5eNu/Nio5JIk2kNrYrhV/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pG x8cgoLEfZd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z+pUX 2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7wqP/0uK3pN/u6uPQL OvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZahSL0896+1DSJMwBGB7FY79tOi4lu3 sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVICu9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+C GCe01a60y1Dma/RMhnEw6abfFobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5 WdYgGq/yapiqcrxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w DQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvlwFTPoCWOAvn9sKIN9SCYPBMt rFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+ nq6PK7o9mfjYcwlYRm6mnPTXJ9OV2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSg tZx8jb8uk2IntznaFxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwW sRqZCuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiKboHGhfKp pC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmckejkk9u+UJueBPSZI9FoJA zMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yLS0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHq ZJx64SIDqZxubw5lT2yHh17zbqD5daWbQOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk52 7RH89elWsn2/x20Kk4yl0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7I LaZRfyHBNVOFBkpdn627G190 -----END CERTIFICATE----- USERTrust RSA Certification Authority ===================================== -----BEGIN CERTIFICATE----- MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCBiDELMAkGA1UE BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UE BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCAEmUXNg7D2wiz 0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2j Y0K2dvKpOyuR+OJv0OwWIJAJPuLodMkYtJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFn RghRy4YUVD+8M/5+bJz/Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O +T23LLb2VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT79uq /nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6c0Plfg6lZrEpfDKE Y1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmTYo61Zs8liM2EuLE/pDkP2QKe6xJM lXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97lc6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8 yexDJtC/QV9AqURE9JnnV4eeUB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+ eLf8ZxXhyVeEHg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF MAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPFUp/L+M+ZBn8b2kMVn54CVVeW FPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KOVWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ 7l8wXEskEVX/JJpuXior7gtNn3/3ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQ Eg9zKC7F4iRO/Fjs8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM 8WcRiQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYzeSf7dNXGi FSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZXHlKYC6SQK5MNyosycdi yA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9c J2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRBVXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGw sAvgnEzDHNb842m1R0aBL6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gx Q+6IHdfGjjxDah2nGN59PRbxYvnKkKj9 -----END CERTIFICATE----- USERTrust ECC Certification Authority ===================================== -----BEGIN CERTIFICATE----- MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDELMAkGA1UEBhMC VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv biBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMC VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqfloI+d61SRvU8Za2EurxtW2 0eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinngo4N+LZfQYcTxmdwlkWOrfzCjtHDix6Ez nPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0GA1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNV HQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBB HU6+4WMBzzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbWRNZu 9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= -----END CERTIFICATE----- GlobalSign ECC Root CA - R4 =========================== -----BEGIN CERTIFICATE----- MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEkMCIGA1UECxMb R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD EwpHbG9iYWxTaWduMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprl OQcJFspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAwDgYDVR0P AQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61FuOJAf/sKbvu+M8k8o4TV MAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGXkPoUVy0D7O48027KqGx2vKLeuwIgJ6iF JzWbVsaj8kfSt24bAgAXqmemFZHe+pTsewv4n4Q= -----END CERTIFICATE----- GlobalSign ECC Root CA - R5 =========================== -----BEGIN CERTIFICATE----- MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEkMCIGA1UECxMb R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD EwpHbG9iYWxTaWduMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6 SFkc8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8kehOvRnkmS h5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd BgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYIKoZIzj0EAwMDaAAwZQIxAOVpEslu28Yx uglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7 yFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3 -----END CERTIFICATE----- Staat der Nederlanden Root CA - G3 ================================== -----BEGIN CERTIFICATE----- MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g Um9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloXDTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMC TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4y olQPcPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WWIkYFsO2t x1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqXxz8ecAgwoNzFs21v0IJy EavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFyKJLZWyNtZrVtB0LrpjPOktvA9mxjeM3K Tj215VKb8b475lRgsGYeCasH/lSJEULR9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUur mkVLoR9BvUhTFXFkC4az5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU5 1nus6+N86U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7Ngzp 07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHPbMk7ccHViLVlvMDo FxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXtBznaqB16nzaeErAMZRKQFWDZJkBE 41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTtXUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMB AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleu yjWcLhL75LpdINyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwpLiniyMMB8jPq KqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8Ipf3YF3qKS9Ysr1YvY2WTxB1 v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixpgZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA 8KCWAg8zxXHzniN9lLf9OtMJgwYh/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b 8KKaa8MFSu1BYBQw0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0r mj1AfsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq4BZ+Extq 1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR1VmiiXTTn74eS9fGbbeI JG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/QFH1T/U67cjF68IeHRaVesd+QnGTbksV tzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM94B7IWcnMFk= -----END CERTIFICATE----- Staat der Nederlanden EV Root CA ================================ -----BEGIN CERTIFICATE----- MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJOTDEeMBwGA1UE CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFhdCBkZXIgTmVkZXJsYW5kZW4g RVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0yMjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5M MR4wHAYDVQQKDBVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRl cmxhbmRlbiBFViBSb290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkk SzrSM4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nCUiY4iKTW O0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3dZ//BYY1jTw+bbRcwJu+r 0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46prfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8 Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13lpJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gV XJrm0w912fxBmJc+qiXbj5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr 08C+eKxCKFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS/ZbV 0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0XcgOPvZuM5l5Tnrmd 74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH1vI4gnPah1vlPNOePqc7nvQDs/nx fRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrPpx9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNC MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwa ivsnuL8wbqg7MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u2dfOWBfoqSmu c0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHSv4ilf0X8rLiltTMMgsT7B/Zq 5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTCwPTxGfARKbalGAKb12NMcIxHowNDXLldRqAN b/9Zjr7dn3LDWyvfjFvO5QxGbJKyCqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tN f1zuacpzEPuKqf2evTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi 5Dp6Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIaGl6I6lD4 WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeLeG9QgkRQP2YGiqtDhFZK DyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGy eUN51q1veieQA6TqJIc/2b3Z6fJfUEkc7uzXLg== -----END CERTIFICATE----- IdenTrust Commercial Root CA 1 ============================== -----BEGIN CERTIFICATE----- MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBKMQswCQYDVQQG EwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBS b290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQwMTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzES MBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENB IDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ld hNlT3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU+ehcCuz/ mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gpS0l4PJNgiCL8mdo2yMKi 1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1bVoE/c40yiTcdCMbXTMTEl3EASX2MN0C XZ/g1Ue9tOsbobtJSdifWwLziuQkkORiT0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl 3ZBWzvurpWCdxJ35UrCLvYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzy NeVJSQjKVsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZKdHzV WYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHTc+XvvqDtMwt0viAg xGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hvl7yTmvmcEpB4eoCHFddydJxVdHix uuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5NiGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZI hvcNAQELBQADggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH 6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwtLRvM7Kqas6pg ghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93nAbowacYXVKV7cndJZ5t+qnt ozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmV YjzlVYA211QC//G5Xc7UI2/YRYRKW2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUX feu+h1sXIFRRk0pTAwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/ro kTLql1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG4iZZRHUe 2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZmUlO+KWA2yUPHGNiiskz Z2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7R cGzM7vRX+Bi6hG6H -----END CERTIFICATE----- IdenTrust Public Sector Root CA 1 ================================= -----BEGIN CERTIFICATE----- MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBNMQswCQYDVQQG EwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3Rv ciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcNMzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJV UzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBS b290IENBIDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTy P4o7ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGyRBb06tD6 Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlSbdsHyo+1W/CD80/HLaXI rcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF/YTLNiCBWS2ab21ISGHKTN9T0a9SvESf qy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoS mJxZZoY+rfGwyj4GD3vwEUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFn ol57plzy9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9VGxyh LrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ2fjXctscvG29ZV/v iDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsVWaFHVCkugyhfHMKiq3IXAAaOReyL 4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gDW/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8B Af8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMw DQYJKoZIhvcNAQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHVDRDtfULAj+7A mgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9TaDKQGXSc3z1i9kKlT/YPyNt GtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8GlwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFt m6/n6J91eEyrRjuazr8FGF1NFTwWmhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMx NRF4eKLg6TCMf4DfWN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4 Mhn5+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJtshquDDI ajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhAGaQdp/lLQzfcaFpPz+vC ZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ 3Wl9af0AVqW3rLatt8o+Ae+c -----END CERTIFICATE----- Entrust Root Certification Authority - G2 ========================================= -----BEGIN CERTIFICATE----- MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMCVVMxFjAUBgNV BAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVy bXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ug b25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIw HhcNMDkwNzA3MTcyNTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoT DUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMx OTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25s eTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwggEi MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP /vaCeb9zYQYKpSfYs1/TRU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXz HHfV1IWNcCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hWwcKU s/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1U1+cPvQXLOZprE4y TGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0jaWvYkxN4FisZDQSA/i2jZRjJKRx AgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ6 0B7vfec7aVHUbI2fkBJmqzANBgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5Z iXMRrEPR9RP/jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v1fN2D807iDgi nWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4RnAuknZoh8/CbCzB428Hch0P+ vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmHVHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xO e4pIb4tF9g== -----END CERTIFICATE----- Entrust Root Certification Authority - EC1 ========================================== -----BEGIN CERTIFICATE----- MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkGA1UEBhMCVVMx FjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVn YWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXpl ZCB1c2Ugb25seTEzMDEGA1UEAxMqRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 IC0gRUMxMB4XDTEyMTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYw FAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2Fs LXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQg dXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt IEVDMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHy AsWfoPZb1YsGGYZPUxBtByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef 9eNi1KlHBz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE FLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVCR98crlOZF7ZvHH3h vxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nXhTcGtXsI/esni0qU+eH6p44mCOh8 kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G -----END CERTIFICATE----- CFCA EV ROOT ============ -----BEGIN CERTIFICATE----- MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJDTjEwMC4GA1UE CgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNB IEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkxMjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEw MC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQD DAxDRkNBIEVWIFJPT1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnV BU03sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpLTIpTUnrD 7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5/ZOkVIBMUtRSqy5J35DN uF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp7hZZLDRJGqgG16iI0gNyejLi6mhNbiyW ZXvKWfry4t3uMCz7zEasxGPrb382KzRzEpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7 xzbh72fROdOXW3NiGUgthxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9f py25IGvPa931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqotaK8K gWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNgTnYGmE69g60dWIol hdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfVPKPtl8MeNPo4+QgO48BdK4PRVmrJ tqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hvcWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAf BgNVHSMEGDAWgBTj/i39KNALtbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB /wQEAwIBBjAdBgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObTej/tUxPQ4i9q ecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdLjOztUmCypAbqTuv0axn96/Ua 4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBSESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sG E5uPhnEFtC+NiWYzKXZUmhH4J/qyP5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfX BDrDMlI1Dlb4pd19xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjn aH9dCi77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN5mydLIhy PDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe/v5WOaHIz16eGWRGENoX kbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+ZAAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3C ekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su -----END CERTIFICATE----- TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H5 ========================================================= -----BEGIN CERTIFICATE----- MIIEJzCCAw+gAwIBAgIHAI4X/iQggTANBgkqhkiG9w0BAQsFADCBsTELMAkGA1UEBhMCVFIxDzAN BgNVBAcMBkFua2FyYTFNMEsGA1UECgxEVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp bGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7Fni4xQjBABgNVBAMMOVTDnFJLVFJVU1Qg RWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSBINTAeFw0xMzA0MzAw ODA3MDFaFw0yMzA0MjgwODA3MDFaMIGxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMU0w SwYDVQQKDERUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnE n2kgSGl6bWV0bGVyaSBBLsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBFbGVrdHJvbmlrIFNlcnRp ZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIEg1MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB CgKCAQEApCUZ4WWe60ghUEoI5RHwWrom/4NZzkQqL/7hzmAD/I0Dpe3/a6i6zDQGn1k19uwsu537 jVJp45wnEFPzpALFp/kRGml1bsMdi9GYjZOHp3GXDSHHmflS0yxjXVW86B8BSLlg/kJK9siArs1m ep5Fimh34khon6La8eHBEJ/rPCmBp+EyCNSgBbGM+42WAA4+Jd9ThiI7/PS98wl+d+yG6w8z5UNP 9FR1bSmZLmZaQ9/LXMrI5Tjxfjs1nQ/0xVqhzPMggCTTV+wVunUlm+hkS7M0hO8EuPbJbKoCPrZV 4jI3X/xml1/N1p7HIL9Nxqw/dV8c7TKcfGkAaZHjIxhT6QIDAQABo0IwQDAdBgNVHQ4EFgQUVpkH HtOsDGlktAxQR95DLL4gwPswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZI hvcNAQELBQADggEBAJ5FdnsXSDLyOIspve6WSk6BGLFRRyDN0GSxDsnZAdkJzsiZ3GglE9Rc8qPo BP5yCccLqh0lVX6Wmle3usURehnmp349hQ71+S4pL+f5bFgWV1Al9j4uPqrtd3GqqpmWRgqujuwq URawXs3qZwQcWDD1YIq9pr1N5Za0/EKJAWv2cMhQOQwt1WbZyNKzMrcbGW3LM/nfpeYVhDfwwvJl lpKQd/Ct9JDpEXjXk4nAPQu6KfTomZ1yju2dL+6SfaHx/126M2CFYv4HAqGEVka+lgqaE9chTLd8 B59OTj+RdPsnnRHM3eaxynFNExc5JsUpISuTKWqW+qtB4Uu2NQvAmxU= -----END CERTIFICATE----- TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H6 ========================================================= -----BEGIN CERTIFICATE----- MIIEJjCCAw6gAwIBAgIGfaHyZeyKMA0GCSqGSIb3DQEBCwUAMIGxMQswCQYDVQQGEwJUUjEPMA0G A1UEBwwGQW5rYXJhMU0wSwYDVQQKDERUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls acWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBF bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIEg2MB4XDTEzMTIxODA5 MDQxMFoXDTIzMTIxNjA5MDQxMFowgbExCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExTTBL BgNVBAoMRFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBCaWxpxZ9pbSBHw7x2ZW5sacSf aSBIaXptZXRsZXJpIEEuxZ4uMUIwQAYDVQQDDDlUw5xSS1RSVVNUIEVsZWt0cm9uaWsgU2VydGlm aWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLEgSDYwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK AoIBAQCdsGjW6L0UlqMACprx9MfMkU1xeHe59yEmFXNRFpQJRwXiM/VomjX/3EsvMsew7eKC5W/a 2uqsxgbPJQ1BgfbBOCK9+bGlprMBvD9QFyv26WZV1DOzXPhDIHiTVRZwGTLmiddk671IUP320EED wnS3/faAz1vFq6TWlRKb55cTMgPp1KtDWxbtMyJkKbbSk60vbNg9tvYdDjTu0n2pVQ8g9P0pu5Fb HH3GQjhtQiht1AH7zYiXSX6484P4tZgvsycLSF5W506jM7NE1qXyGJTtHB6plVxiSvgNZ1GpryHV +DKdeboaX+UEVU0TRv/yz3THGmNtwx8XEsMeED5gCLMxAgMBAAGjQjBAMB0GA1UdDgQWBBTdVRcT 9qzoSCHK77Wv0QAy7Z6MtTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG 9w0BAQsFAAOCAQEAb1gNl0OqFlQ+v6nfkkU/hQu7VtMMUszIv3ZnXuaqs6fvuay0EBQNdH49ba3R fdCaqaXKGDsCQC4qnFAUi/5XfldcEQlLNkVS9z2sFP1E34uXI9TDwe7UU5X+LEr+DXCqu4svLcsy o4LyVN/Y8t3XSHLuSqMplsNEzm61kod2pLv0kmzOLBQJZo6NrRa1xxsJYTvjIKIDgI6tflEATseW hvtDmHd9KMeP2Cpu54Rvl0EpABZeTeIT6lnAY2c6RPuY/ATTMHKm9ocJV612ph1jmv3XZch4gyt1 O6VbuA1df74jrlZVlFjvH4GMKrLN5ptjnhi85WsGtAuYSyher4hYyw== -----END CERTIFICATE----- Certinomis - Root CA ==================== -----BEGIN CERTIFICATE----- MIIFkjCCA3qgAwIBAgIBATANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJGUjETMBEGA1UEChMK Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxHTAbBgNVBAMTFENlcnRpbm9taXMg LSBSb290IENBMB4XDTEzMTAyMTA5MTcxOFoXDTMzMTAyMTA5MTcxOFowWjELMAkGA1UEBhMCRlIx EzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMR0wGwYDVQQDExRD ZXJ0aW5vbWlzIC0gUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANTMCQos P5L2fxSeC5yaah1AMGT9qt8OHgZbn1CF6s2Nq0Nn3rD6foCWnoR4kkjW4znuzuRZWJflLieY6pOo d5tK8O90gC3rMB+12ceAnGInkYjwSond3IjmFPnVAy//ldu9n+ws+hQVWZUKxkd8aRi5pwP5ynap z8dvtF4F/u7BUrJ1Mofs7SlmO/NKFoL21prbcpjp3vDFTKWrteoB4owuZH9kb/2jJZOLyKIOSY00 8B/sWEUuNKqEUL3nskoTuLAPrjhdsKkb5nPJWqHZZkCqqU2mNAKthH6yI8H7KsZn9DS2sJVqM09x RLWtwHkziOC/7aOgFLScCbAK42C++PhmiM1b8XcF4LVzbsF9Ri6OSyemzTUK/eVNfaoqoynHWmgE 6OXWk6RiwsXm9E/G+Z8ajYJJGYrKWUM66A0ywfRMEwNvbqY/kXPLynNvEiCL7sCCeN5LLsJJwx3t FvYk9CcbXFcx3FXuqB5vbKziRcxXV4p1VxngtViZSTYxPDMBbRZKzbgqg4SGm/lg0h9tkQPTYKbV PZrdd5A9NaSfD171UkRpucC63M9933zZxKyGIjK8e2uR73r4F2iw4lNVYC2vPsKD2NkJK/DAZNuH i5HMkesE/Xa0lZrmFAYb1TQdvtj/dBxThZngWVJKYe2InmtJiUZ+IFrZ50rlau7SZRFDAgMBAAGj YzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTvkUz1pcMw6C8I 6tNxIqSSaHh02TAfBgNVHSMEGDAWgBTvkUz1pcMw6C8I6tNxIqSSaHh02TANBgkqhkiG9w0BAQsF AAOCAgEAfj1U2iJdGlg+O1QnurrMyOMaauo++RLrVl89UM7g6kgmJs95Vn6RHJk/0KGRHCwPT5iV WVO90CLYiF2cN/z7ZMF4jIuaYAnq1fohX9B0ZedQxb8uuQsLrbWwF6YSjNRieOpWauwK0kDDPAUw Pk2Ut59KA9N9J0u2/kTO+hkzGm2kQtHdzMjI1xZSg081lLMSVX3l4kLr5JyTCcBMWwerx20RoFAX lCOotQqSD7J6wWAsOMwaplv/8gzjqh8c3LigkyfeY+N/IZ865Z764BNqdeuWXGKRlI5nU7aJ+BIJ y29SWwNyhlCVCNSNh4YVH5Uk2KRvms6knZtt0rJ2BobGVgjF6wnaNsIbW0G+YSrjcOa4pvi2WsS9 Iff/ql+hbHY5ZtbqTFXhADObE5hjyW/QASAJN1LnDE8+zbz1X5YnpyACleAu6AdBBR8Vbtaw5Bng DwKTACdyxYvRVB9dSsNAl35VpnzBMwQUAR1JIGkLGZOdblgi90AMRgwjY/M50n92Uaf0yKHxDHYi I0ZSKS3io0EHVmmY0gUJvGnHWmHNj4FgFU2A3ZDifcRQ8ow7bkrHxuaAKzyBvBGAFhAn1/DNP3nM cyrDflOR1m749fPH0FFNjkulW+YZFzvWgQncItzujrnEj1PhZ7szuIgVRs/taTX/dQ1G885x4cVr hkIGuUE= -----END CERTIFICATE----- OISTE WISeKey Global Root GB CA =============================== -----BEGIN CERTIFICATE----- MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBtMQswCQYDVQQG EwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAw MzJaFw0zOTEyMDExNTEwMzFaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYD VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEds b2JhbCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3HEokKtaX scriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGxWuR51jIjK+FTzJlFXHtP rby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk 9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNku7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4o Qnc/nSMbsrY9gBQHTC5P99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvg GUpuuy9rM2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB /zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZI hvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrghcViXfa43FK8+5/ea4n32cZiZBKpD dHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0 VQreUGdNZtGn//3ZwLWoo4rOZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEui HZeeevJuQHHfaPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= -----END CERTIFICATE----- Certification Authority of WoSign G2 ==================================== -----BEGIN CERTIFICATE----- MIIDfDCCAmSgAwIBAgIQayXaioidfLwPBbOxemFFRDANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQG EwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxLTArBgNVBAMTJENlcnRpZmljYXRpb24g QXV0aG9yaXR5IG9mIFdvU2lnbiBHMjAeFw0xNDExMDgwMDU4NThaFw00NDExMDgwMDU4NThaMFgx CzAJBgNVBAYTAkNOMRowGAYDVQQKExFXb1NpZ24gQ0EgTGltaXRlZDEtMCsGA1UEAxMkQ2VydGlm aWNhdGlvbiBBdXRob3JpdHkgb2YgV29TaWduIEcyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB CgKCAQEAvsXEoCKASU+/2YcRxlPhuw+9YH+v9oIOH9ywjj2X4FA8jzrvZjtFB5sg+OPXJYY1kBai XW8wGQiHC38Gsp1ij96vkqVg1CuAmlI/9ZqD6TRay9nVYlzmDuDfBpgOgHzKtB0TiGsOqCR3A9Du W/PKaZE1OVbFbeP3PU9ekzgkyhjpJMuSA93MHD0JcOQg5PGurLtzaaNjOg9FD6FKmsLRY6zLEPg9 5k4ot+vElbGs/V6r+kHLXZ1L3PR8du9nfwB6jdKgGlxNIuG12t12s9R23164i5jIFFTMaxeSt+BK v0mUYQs4kI9dJGwlezt52eJ+na2fmKEG/HgUYFf47oB3sQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU+mCp62XF3RYUCE4MD42b4Pdkr2cwDQYJKoZI hvcNAQELBQADggEBAFfDejaCnI2Y4qtAqkePx6db7XznPWZaOzG73/MWM5H8fHulwqZm46qwtyeY P0nXYGdnPzZPSsvxFPpahygc7Y9BMsaV+X3avXtbwrAh449G3CE4Q3RM+zD4F3LBMvzIkRfEzFg3 TgvMWvchNSiDbGAtROtSjFA9tWwS1/oJu2yySrHFieT801LYYRf+epSEj3m2M1m6D8QL4nCgS3gu +sif/a+RZQp4OBXllxcU3fngLDT4ONCEIgDAFFEYKwLcMFrw6AF8NTojrwjkr6qOKEJJLvD1mTS+ 7Q9LGOHSJDy7XUe3IfKN0QqZjuNuPq1w4I+5ysxugTH2e5x6eeRncRg= -----END CERTIFICATE----- CA WoSign ECC Root ================== -----BEGIN CERTIFICATE----- MIICCTCCAY+gAwIBAgIQaEpYcIBr8I8C+vbe6LCQkDAKBggqhkjOPQQDAzBGMQswCQYDVQQGEwJD TjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxGzAZBgNVBAMTEkNBIFdvU2lnbiBFQ0MgUm9v dDAeFw0xNDExMDgwMDU4NThaFw00NDExMDgwMDU4NThaMEYxCzAJBgNVBAYTAkNOMRowGAYDVQQK ExFXb1NpZ24gQ0EgTGltaXRlZDEbMBkGA1UEAxMSQ0EgV29TaWduIEVDQyBSb290MHYwEAYHKoZI zj0CAQYFK4EEACIDYgAE4f2OuEMkq5Z7hcK6C62N4DrjJLnSsb6IOsq/Srj57ywvr1FQPEd1bPiU t5v8KB7FVMxjnRZLU8HnIKvNrCXSf4/CwVqCXjCLelTOA7WRf6qU0NGKSMyCBSah1VES1ns2o0Iw QDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUqv3VWqP2h4syhf3R MluARZPzA7gwCgYIKoZIzj0EAwMDaAAwZQIxAOSkhLCB1T2wdKyUpOgOPQB0TKGXa/kNUTyh2Tv0 Daupn75OcsqF1NnstTJFGG+rrQIwfcf3aWMvoeGY7xMQ0Xk/0f7qO3/eVvSQsRUR2LIiFdAvwyYu a/GRspBl9JrmkO5K -----END CERTIFICATE----- gsoap-2.8.28/gsoap/samples/ssl/sslserver.c0000644000175000017500000002173712653650156020061 0ustar ellertellert/* sslserver.c Example stand-alone SSL-secure gSOAP Web service. SSL-enabled services use the gSOAP SSL interface. See sslclient.c and sslserver.c for example code with instructions and the gSOAP documentation more details. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" #include "ssl.nsmap" #include /* defines _POSIX_THREADS if pthreads are available */ #if defined(_POSIX_THREADS) || defined(_SC_THREADS) #include /* gsoap/plugin/threads.h */ #include #endif #include /* defines SIGPIPE */ /******************************************************************************\ * * Forward decls * \******************************************************************************/ void *process_request(struct soap*); int CRYPTO_thread_setup(); void CRYPTO_thread_cleanup(); void sigpipe_handle(int); /******************************************************************************\ * * Main * \******************************************************************************/ int main() { SOAP_SOCKET m; #if defined(_POSIX_THREADS) || defined(_SC_THREADS) pthread_t tid; #endif struct soap soap, *tsoap; /* Need SIGPIPE handler on Unix/Linux systems to catch broken pipes: */ signal(SIGPIPE, sigpipe_handle); if (CRYPTO_thread_setup()) { fprintf(stderr, "Cannot setup thread mutex for OpenSSL\n"); exit(1); } /* init gsoap context and SSL */ soap_init(&soap); /* The supplied server certificate "server.pem" assumes that the server is running on 'localhost', so clients can only connect from the same host when verifying the server's certificate. To verify the certificates of third-party services, they must provide a certificate issued by Verisign or another trusted CA. At the client-side, the capath parameter should point to a directory that contains these trusted (root) certificates or the cafile parameter should refer to one file will all certificates. To help you out, the supplied "cacerts.pem" file contains the certificates issued by various CAs. You should use this file for the cafile parameter instead of "cacert.pem" to connect to trusted servers. Note that the client may fail to connect if the server's credentials have problems (e.g. expired). Note 1: the password and capath are not used with GNUTLS Note 2: setting capath may not work on Windows. */ if (soap_ssl_server_context(&soap, SOAP_SSL_DEFAULT, /* use SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION to verify clients: client must provide a key file e.g. "client.pem" and "password" */ "server.pem", /* keyfile (cert+key): see README.txt to create this file */ "password", /* password to read the private key in the key file */ "cacert.pem", /* cacert file to store trusted certificates (to authenticate clients), see README.txt */ NULL, /* capath */ "dh2048.pem", /* DH file name or DH param key len bits in string (e.g. "2048"), if NULL then RSA with 2048 bits is used instead (bits defined by SOAP_SSL_RSA_BITS) */ NULL, /* if randfile!=NULL: use a file with random data to seed randomness */ "sslserver" /* server identification for SSL session cache (unique server name, e.g. use argv[0]) */ ) ) { soap_print_fault(&soap, stderr); exit(1); } /* enable CRL, may need SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE when certs have no CRL if (soap_ssl_crl(&soap, "")) { soap_print_fault(&soap, stderr); exit(1); } */ soap.accept_timeout = 60; /* server times out after 1 minute inactivity */ soap.send_timeout = soap.recv_timeout = 30; /* if I/O stalls, then timeout after 30 seconds */ m = soap_bind(&soap, NULL, 18081, 100); if (!soap_valid_socket(m)) { soap_print_fault(&soap, stderr); exit(1); } fprintf(stderr, "Bind successful: socket = %d\n", m); for (;;) { SOAP_SOCKET s = soap_accept(&soap); if (!soap_valid_socket(s)) { if (soap.errnum) soap_print_fault(&soap, stderr); else fprintf(stderr, "Server timed out (timeout set to %d seconds)\n", soap.accept_timeout); break; } fprintf(stderr, "Socket %d connection from IP %d.%d.%d.%d\n", s, (int)(soap.ip>>24)&0xFF, (int)(soap.ip>>16)&0xFF, (int)(soap.ip>>8)&0xFF, (int)soap.ip&0xFF); tsoap = soap_copy(&soap); if (!tsoap) { soap_closesock(&soap); continue; } #if defined(_POSIX_THREADS) || defined(_SC_THREADS) pthread_create(&tid, NULL, (void*(*)(void*))&process_request, tsoap); #else process_request(tsoap); #endif } soap_destroy(&soap); soap_end(&soap); soap_done(&soap); /* MUST call before CRYPTO_thread_cleanup */ CRYPTO_thread_cleanup(); return 0; } void *process_request(struct soap *soap) { #if defined(_POSIX_THREADS) || defined(_SC_THREADS) pthread_detach(pthread_self()); #endif if (soap_ssl_accept(soap) != SOAP_OK) { /* when soap_ssl_accept() fails, socket is closed and SSL data reset */ soap_print_fault(soap, stderr); fprintf(stderr, "SSL request failed, continue with next call...\n"); } else soap_serve(soap); soap_destroy(soap); /* for C++ */ soap_end(soap); soap_free(soap); return NULL; } /******************************************************************************\ * * Service methods * \******************************************************************************/ int ns__add(struct soap *soap, double a, double b, double *result) { *result = a + b; return SOAP_OK; } /******************************************************************************\ * * OpenSSL * \******************************************************************************/ #ifdef WITH_OPENSSL struct CRYPTO_dynlock_value { MUTEX_TYPE mutex; }; static MUTEX_TYPE *mutex_buf; static struct CRYPTO_dynlock_value *dyn_create_function(const char *file, int line) { struct CRYPTO_dynlock_value *value; value = (struct CRYPTO_dynlock_value*)malloc(sizeof(struct CRYPTO_dynlock_value)); if (value) MUTEX_SETUP(value->mutex); return value; } static void dyn_lock_function(int mode, struct CRYPTO_dynlock_value *l, const char *file, int line) { if (mode & CRYPTO_LOCK) MUTEX_LOCK(l->mutex); else MUTEX_UNLOCK(l->mutex); } static void dyn_destroy_function(struct CRYPTO_dynlock_value *l, const char *file, int line) { MUTEX_CLEANUP(l->mutex); free(l); } void locking_function(int mode, int n, const char *file, int line) { if (mode & CRYPTO_LOCK) MUTEX_LOCK(mutex_buf[n]); else MUTEX_UNLOCK(mutex_buf[n]); } unsigned long id_function() { return (unsigned long)THREAD_ID; } int CRYPTO_thread_setup() { int i; mutex_buf = (MUTEX_TYPE*)malloc(CRYPTO_num_locks() * sizeof(pthread_mutex_t)); if (!mutex_buf) return SOAP_EOM; for (i = 0; i < CRYPTO_num_locks(); i++) MUTEX_SETUP(mutex_buf[i]); CRYPTO_set_id_callback(id_function); CRYPTO_set_locking_callback(locking_function); CRYPTO_set_dynlock_create_callback(dyn_create_function); CRYPTO_set_dynlock_lock_callback(dyn_lock_function); CRYPTO_set_dynlock_destroy_callback(dyn_destroy_function); return SOAP_OK; } void CRYPTO_thread_cleanup() { int i; if (!mutex_buf) return; CRYPTO_set_id_callback(NULL); CRYPTO_set_locking_callback(NULL); CRYPTO_set_dynlock_create_callback(NULL); CRYPTO_set_dynlock_lock_callback(NULL); CRYPTO_set_dynlock_destroy_callback(NULL); for (i = 0; i < CRYPTO_num_locks(); i++) MUTEX_CLEANUP(mutex_buf[i]); free(mutex_buf); mutex_buf = NULL; } #else /* OpenSSL not used, e.g. GNUTLS is used */ int CRYPTO_thread_setup() { return SOAP_OK; } void CRYPTO_thread_cleanup() { } #endif /******************************************************************************\ * * SIGPIPE * \******************************************************************************/ void sigpipe_handle(int x) { } gsoap-2.8.28/gsoap/samples/ssl/openssl.cnf0000644000175000017500000002257412653650156020040 0ustar ellertellert# # OpenSSL example configuration file. # This is mostly being used for generation of certificate requests. # # This definition stops the following lines choking if HOME isn't # defined. HOME = . RANDFILE = $ENV::HOME/.rnd # Extra OBJECT IDENTIFIER info: #oid_file = $ENV::HOME/.oid oid_section = new_oids # To use this configuration file with the "-extfile" option of the # "openssl x509" utility, name here the section containing the # X.509v3 extensions to use: # extensions = # (Alternatively, use a configuration file that has only # X.509v3 extensions in its main [= default] section.) [ new_oids ] # We can add new OIDs in here for use by 'ca' and 'req'. # Add a simple OID like this: # testoid1=1.2.3.4 # Or use config file substitution like this: # testoid2=${testoid1}.5.6 #################################################################### [ ca ] default_ca = CA_default # The default ca section #################################################################### [ CA_default ] dir = ./demoCA # Where everything is kept certs = $dir/certs # Where the issued certs are kept crl_dir = $dir/crl # Where the issued crl are kept database = $dir/index.txt # database index file. #unique_subject = no # Set to 'no' to allow creation of # several ctificates with same subject. new_certs_dir = $dir/newcerts # default place for new certs. certificate = $dir/cacert.pem # The CA certificate serial = $dir/serial # The current serial number #crlnumber = $dir/crlnumber # the current crl number must be # commented out to leave a V1 CRL crl = $dir/crl.pem # The current CRL private_key = $dir/private/cakey.pem# The private key RANDFILE = $dir/private/.rand # private random number file x509_extensions = usr_cert # The extentions to add to the cert # Comment out the following two lines for the "traditional" # (and highly broken) format. name_opt = ca_default # Subject Name options cert_opt = ca_default # Certificate field options # Extension copying option: use with caution. # copy_extensions = copy # Extensions to add to a CRL. Note: Netscape communicator chokes on V2 CRLs # so this is commented out by default to leave a V1 CRL. # crlnumber must also be commented out to leave a V1 CRL. # crl_extensions = crl_ext default_days = 365 # how long to certify for default_crl_days= 30 # how long before next CRL default_md = sha256 # which md to use. preserve = no # keep passed DN ordering # A few difference way of specifying how similar the request should look # For type CA, the listed attributes must be the same, and the optional # and supplied fields are just that :-) policy = policy_match # For the CA policy [ policy_match ] countryName = match stateOrProvinceName = match organizationName = match organizationalUnitName = optional commonName = supplied emailAddress = optional # For the 'anything' policy # At this point in time, you must list all acceptable 'object' # types. [ policy_anything ] countryName = optional stateOrProvinceName = optional localityName = optional organizationName = optional organizationalUnitName = optional commonName = supplied emailAddress = optional #################################################################### [ req ] default_bits = 1024 default_keyfile = privkey.pem distinguished_name = req_distinguished_name attributes = req_attributes x509_extensions = v3_ca # The extentions to add to the self signed cert # Passwords for private keys if not present they will be prompted for # input_password = secret # output_password = secret # This sets a mask for permitted string types. There are several options. # default: PrintableString, T61String, BMPString. # pkix : PrintableString, BMPString. # utf8only: only UTF8Strings. # nombstr : PrintableString, T61String (no BMPStrings or UTF8Strings). # MASK:XXXX a literal mask value. # WARNING: current versions of Netscape crash on BMPStrings or UTF8Strings # so use this option with caution! string_mask = nombstr # req_extensions = v3_req # The extensions to add to a certificate request [ req_distinguished_name ] countryName = Country Name (2 letter code) countryName_default = AU countryName_min = 2 countryName_max = 2 stateOrProvinceName = State or Province Name (full name) stateOrProvinceName_default = Some-State localityName = Locality Name (eg, city) 0.organizationName = Organization Name (eg, company) 0.organizationName_default = Internet Widgits Pty Ltd # we can do this but it is not needed normally :-) #1.organizationName = Second Organization Name (eg, company) #1.organizationName_default = World Wide Web Pty Ltd organizationalUnitName = Organizational Unit Name (eg, section) #organizationalUnitName_default = commonName = Common Name (eg, YOUR name) commonName_default = localhost commonName_max = 64 emailAddress = Email Address emailAddress_max = 64 # SET-ex3 = SET extension number 3 [ req_attributes ] challengePassword = A challenge password challengePassword_min = 4 challengePassword_max = 20 unstructuredName = An optional company name [ usr_cert ] # These extensions are added when 'ca' signs a request. # This goes against PKIX guidelines but some CAs do it and some software # requires this to avoid interpreting an end user certificate as a CA. basicConstraints = CA:FALSE keyUsage = nonRepudiation, digitalSignature, keyEncipherment, dataEncipherment extendedKeyUsage = serverAuth, clientAuth # Here are some examples of the usage of nsCertType. If it is omitted # the certificate can be used for anything *except* object signing. # This is OK for an SSL server. # nsCertType = server # For an object signing certificate this would be used. # nsCertType = objsign # For normal client use this is typical # nsCertType = client, email # and for everything including object signing: # nsCertType = client, email, objsign # This is typical in keyUsage for a client certificate. # keyUsage = nonRepudiation, digitalSignature, keyEncipherment # This will be displayed in Netscape's comment listbox. nsComment = "OpenSSL Generated Certificate" # PKIX recommendations harmless if included in all certificates. subjectKeyIdentifier=hash authorityKeyIdentifier=keyid,issuer:always # This stuff is for subjectAltName and issuerAltname. # Import the email address. # subjectAltName=email:copy # An alternative to produce certificates that aren't # deprecated according to PKIX. # subjectAltName=email:move # Copy subject details # issuerAltName=issuer:copy #nsCaRevocationUrl = http://www.domain.dom/ca-crl.pem #nsBaseUrl #nsRevocationUrl #nsRenewalUrl #nsCaPolicyUrl #nsSslServerName [ v3_req ] # Extensions to add to a certificate request basicConstraints = CA:FALSE keyUsage = nonRepudiation, digitalSignature, keyEncipherment, dataEncipherment extendedKeyUsage = serverAuth,clientAuth [ v3_ca ] # Extensions for a typical CA # PKIX recommendation. subjectKeyIdentifier=hash authorityKeyIdentifier=keyid:always,issuer:always # This is what PKIX recommends but some broken software chokes on critical # extensions. #basicConstraints = critical,CA:true # So we do this instead. basicConstraints = CA:true # Key usage: this is typical for a CA certificate. However since it will # prevent it being used as an test self-signed certificate it is best # left out by default. # keyUsage = cRLSign, keyCertSign # Some might want this also # nsCertType = sslCA, emailCA # Include email address in subject alt name: another PKIX recommendation # subjectAltName=email:copy # Copy issuer details # issuerAltName=issuer:copy # DER hex encoding of an extension: beware experts only! # obj=DER:02:03 # Where 'obj' is a standard or added object # You can even override a supported extension: # basicConstraints= critical, DER:30:03:01:01:FF [ crl_ext ] # CRL extensions. # Only issuerAltName and authorityKeyIdentifier make any sense in a CRL. # issuerAltName=issuer:copy authorityKeyIdentifier=keyid:always,issuer:always [ proxy_cert_ext ] # These extensions should be added when creating a proxy certificate # This goes against PKIX guidelines but some CAs do it and some software # requires this to avoid interpreting an end user certificate as a CA. basicConstraints=CA:FALSE # Here are some examples of the usage of nsCertType. If it is omitted # the certificate can be used for anything *except* object signing. # This is OK for an SSL server. # nsCertType = server # For an object signing certificate this would be used. # nsCertType = objsign # For normal client use this is typical # nsCertType = client, email # and for everything including object signing: # nsCertType = client, email, objsign # This is typical in keyUsage for a client certificate. # keyUsage = nonRepudiation, digitalSignature, keyEncipherment # This will be displayed in Netscape's comment listbox. nsComment = "OpenSSL Generated Certificate" # PKIX recommendations harmless if included in all certificates. subjectKeyIdentifier=hash authorityKeyIdentifier=keyid,issuer:always # This stuff is for subjectAltName and issuerAltname. # Import the email address. # subjectAltName=email:copy # An alternative to produce certificates that aren't # deprecated according to PKIX. # subjectAltName=email:move # Copy subject details # issuerAltName=issuer:copy #nsCaRevocationUrl = http://www.domain.dom/ca-crl.pem #nsBaseUrl #nsRevocationUrl #nsRenewalUrl #nsCaPolicyUrl #nsSslServerName # This really needs to be in place for it to be a proxy certificate. proxyCertInfo=critical,language:id-ppl-anyLanguage,pathlen:3,policy:foo gsoap-2.8.28/gsoap/samples/ssl/README.txt0000644000175000017500000002106712653650156017357 0ustar ellertellert SSL/TLS Client and Server Examples and Key Generation with gSOAP ================================================================ Using OpenSSL ------------- The SSL-enabled applications are compiled with -DWITH_OPENSSL -DWITH_GZIP and linked with -lgsoapssl++ (or -lgsoapssl) -lssl -lcrypto -lz OpenSSL multithreaded applications require mutex locks, see the CRYPTO_thread_setup() and CRYPTO_thread_cleanup() code in the examples. The certificates of trusted certificate authorities (CA) are stored in cacerts.pem and can be used to connect gSOAP clients to secure services. To do so, use cacerts.pem instead of the demo cacert.pem with soap_ssl_client_context. Using GNUTLS ------------ The SSL-enabled applications are compiled with -DWITH_GNUTLS -DWITH_GZIP and linked with stdsoap2.c[pp] -lgnutls -lgcrypt -lz Note that stdsoap2.c[pp] MUST be compiled with -DWITH_GNUTLS to use GNUTLS, because libgsoapssl is built with OpenSSL by default. Note: GNUTLS does not support encrypted PEM keyfiles, so you cannot use the key files generated with OpenSSL and use them in a GNUTLS-enabled application. GNUTLS mutex locks are automatically enabled by the gSOAP engine stdsoap2.c[pp] when pthreads are detected. How to create self-signed certificates with OpenSSL --------------------------------------------------- How to generate self-signed root certificate and client.pem/server.pem with certificates signed by the root CA for deployment in clients and servers. Create a 'CA' directory and copy openssl.cnf, root.sh, and cert.sh to this dir. Change dir to 'CA'. Modify the openssl.cnf file in the [req_distinguished_name] section for the following items: [ req_distinguished_name ] countryName_default = US stateOrProvinceName_default = Your-State localityName_default = Your-City 0.organizationName_default = Your-Company-Name emailAddress_default = your-email@address If you are going to use these settings often, add this line to your .cshrc: setenv OPENSSL_CONF $HOME/CA/openssl.cnf To generate the root CA: ./root.sh When prompted, choose a passphrase to protect the CA's private key that you are about to generate. You need the passphrase again when you sign certificates with the CA's private key. Save the root.pem key and the passphrase in a safe place (don't distribute!). Now you got the root.pem with the CA's keys and the cacert.pem certificate of the CA (for distribution). The root.pem and cacert.pem are valid for three years. Don't repeat this step until the certificate expires. Next, we will generate the server.pem key file: ./cert.sh server Enter a password when prompted and enter the host or simply "localhost" for the domain of the server application. The password is used to lock the private key of the server and will therefore be needed by your server application to unlock the private key in the server.pem when needed for secure communications. Use the root CA passphrase when prompted to sign the server certificate. When applicable, repeat the procedure for the client (use a fresh password and select a host for the client application): ./cert.sh client The client.pem and server.pem keys are valid for one year. Do not distribute them (they include the private key, which is encrypted with the passwords you selected which is not very secure). They are used ony locally by the SSL application. Only distribute the CA certificate. To print the contents of a PEM file: openssl x509 -text -in file.pem To generate parameters for DH (Diffie Hellman) key exchange with OpenSSL, use: openssl dhparam -out dh2048.pem -2 2048 To convert a CRL file in DER format to PEM format: openssl crl -inform DER -out crl.pem -in file.crl To summarize, the files you need are: openssl.cnf root.sh cert.sh Files generated: cacert.pem root's certificate for distribution, to verify authentication root.pem root CA (to sign client/server key files, do not distribute!) rootkey.pem private key (do not distribute!) rootreq.pem sign request root.srl serial number client.pem client key with private key and certificate (do not distribute!) clientcert.pem client certificate signed by root CA (public) clientkey.pem private key (do not distribute!) clientreq.pem sign request server.pem server key with private key and certificate (do not distribute!) servercert.pem server certificate, signed by root CA, for distribution serverkey.pem private key (do not distribute!) serverreq.pem sign request How to convert certificates to CER format for MS Windows -------------------------------------------------------- To convert certificate cacert.pem to CER format: openssl x509 -in cacert.pem -outform der -out cacert.cer Install the certificate on MS Windows by opening it and then select "Install Certificate". Client applications running on MS Windows can now connect to the server. The server authenticates to the client by means of the certificate. How to create self-signed certificates with GNUTLS -------------------------------------------------- We use the GNUTLS 'certtool' command (or the 'gnutls-certtool' command) to create keys and certificates as follows. First we generate a private key (for a client or server): certtool --generate-privkey --outfile privkey.pem Make sure to use GNUTLS 'certtool', sometimes renamed to 'gnutls-certtool' to avoid confusion with the system 'certtool' command. Then we self-sign the certificate: certtool --generate-self-signed --load-privkey privkey.pem --outfile cert.pem When prompted, the following options are recommended for the certificate: * The certificate MUST NOT be marked as a CA certificate. * The DNS name MUST match the FQDN that clients will use to access the server. Use the server domain name here. One name suffices. * The certificate MUST be marked as usable for encryption. * The certificate MUST be marked as usable for a TLS server (or client when appropriate). The client.pem and server.pem keyfiles used in the soap_ssl_client_context() and soap_ssl_server_context() API functions is a combination of the private key and the certificate: cat privkey.pem cert.pem > server.pem The client can use the cert.pem to authenticate the server. The private key file and server.pem are for the server only and SHOULD NEVER be shared. Note that the server.pem file generated above is NOT encrypted with a password, so the password parameter of soap_ssl_server_context() is not used. Neither is the capath parameter used for the fact that GNUTLS does not search for loadable certificates. The PEM files produced by GNUTLS can be used with OpenSSL. The PEM key files created with OpenSSL (such as server.pem and client.pem) CANNOT be used with GNUTLS, because they contain encrypted private keys that GNUTLS cannot read ("SSL/TLS error: Can't read key file"). We can also use GNUTLS 'certtool' to create a Certificate Authority (CA) to sign client and server certificates as follows. certtool --generate-privkey --outfile cakey.pem Then we self-sign the CA certificate: certtool --generate-self-signed --load-privkey cakey.pem --outfile cacert.pem When prompted, the following options are recommended for the CA certificate: * The CA certificate SHOULD be marked to belong to an authority. * The CA certificate MUST be marked as a CA certificate. * The CA certificate MUST be usable for signing other certificates. * The CA certificate MUST be usable for signing Certificate Revocation Lists (CRLs). Now we can create a server key and use the CA to sign the server's certificate: certtool --generate-privkey --outfile serverkey.pem certtool --generate-request --load-privkey serverkey.pem --outfile server.csr certtool --generate-certificate --load-request server.csr --load-ca-certificate cacert.pem --load-ca-privkey cakey.pem --outfile servercert.pem Use the recommended options shown earlier for creating the certificate. The client.pem and server.pem keyfiles used in the soap_ssl_client_context() and soap_ssl_server_context() API functions is a combination of the private key and the certificate: cat serverkey.pem servercert.pem > server.pem The procedure above can be repeated to create a key and signed certificate for clients and other servers. All clients and servers can be authenticated with the CA certificate. The cacert.pem is to be used by all peers that require the other party to authenticate (e.g. the client uses cacert.pem CA cert to authenticate the server, who uses the server.pem keyfile). To generate parameters for DH (Diffie Hellman) key exchange with GNUTLS, use: certtool --generate-dh-params --bits 2048 --outfile dh2048.pem gsoap-2.8.28/gsoap/samples/ssl/ssl.h0000644000175000017500000000352412653650156016631 0ustar ellertellert/* ssl.h Example SSL-secure client and server. SSL-enabled services use the gSOAP SSL interface. See sslclient.c and sslserver.c for example code with instructions and the gSOAP documentation more details. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap ns service name: ssl //gsoap ns service style: rpc //gsoap ns service encoding: encoded //gsoap ns service namespace: urn:ssl //gsoap ns service location: https://localhost:18081 typedef double xsd__double; int ns__add(xsd__double a, xsd__double b, xsd__double *result); gsoap-2.8.28/gsoap/samples/ssl/dh4096.pem0000644000175000017500000000140112653650156017270 0ustar ellertellert-----BEGIN DH PARAMETERS----- MIICCAKCAgEAoIvNMvr8VU9p1EWhurnPtxt6V/503dBKuN3SZWzOJVEEpdA+oBff 8NcxiIzFOtyXpNy09GDkheZUUt+vtxKV64yjzIvW1774/1B6/vpT8gTajsvakxlP SwCpcKKjGlIRs/23mOUZb0IVr0ZLtXO1rZiHDb/EnJfDvcOhjPCCC59hRIIGeDgY XY3QHryOM4XRvyPh79Q8fG8x2GxHhuZtwH8OgYs4L876kKqP0XnmdlawIxzcv2qb jL+Ysy2Mc9GPQHy3d/5x45fhRuXPhsHLNmHhmf66u57y1FJjoslr3CSpbyoBzZGy UjIKlvtB9CGAYO0mgvDFgKpb0JC+BVMwvWQK+GWohvCO/wwrnQ5YFsMmK3uqELMN A5uHQoTXj0htsV8LSUC3mbPcvc+IBryINJkM0utredKexs9jMtWcaNfqNz6J0t0M NU+Ajkqqf5qE8n5b0X/mj6pH2j2YasCqi7S/T2VRCtB4RvE3y8+Cu9TgeU2p2pQh JHbaOH2AQW6lDlP37ieGDHhIS+xLvUubARtVNk4qtVSqMKMbwCQbDvS77PSXcdqt NEA1kZ0KuYYdepMJ6XT1/Pb7ObDfs8VZEIofLbTwzZf/Vp5CsOqVXPzC1tCImdpJ iPwTbofsyrlDfpBGfh2jnWRlytsyZ11r9qi1QGFlAWpLoFRJt6gQ6usCAQI= -----END DH PARAMETERS----- gsoap-2.8.28/gsoap/samples/ssl/root.sh0000644000175000017500000000211312653650156017167 0ustar ellertellert#!/bin/sh # Create the self-signed root CA and root's certificate: root.pem cacert.pem echo "* This utility creates a self-signed private root CA and public certificate:" echo " root.pem - private root CA (keep this secret)" echo " cacert.pem - public CA certificate (shared)" echo "* Distribute the cacert.pem to clients to authenticate your server" echo "* Use root.pem to sign certificates using the cert.sh utility" echo "*" echo "* Enter a (new) secret pass phrase when requested" echo "* Enter it again when prompted to self-sign the CA root certificate" echo "* You also need the pass phrase later to sign the client and server key files" echo "* Enter your company name as the Common Name (e.g. genivia.com) when requested" echo "* The root CA will expire after three years (1095 days)" openssl req -newkey rsa:1024 -sha1 -keyout rootkey.pem -out rootreq.pem openssl x509 -req -in rootreq.pem -sha1 -extfile openssl.cnf -extensions v3_ca -signkey rootkey.pem -out cacert.pem -days 1095 cat cacert.pem rootkey.pem > root.pem openssl x509 -subject -issuer -dates -noout -in root.pem gsoap-2.8.28/gsoap/samples/ssl/dh1024.pem0000644000175000017500000000036512653650156017264 0ustar ellertellert-----BEGIN DH PARAMETERS----- MIGHAoGBAP60Z2NxZi679crmEYW6RnBtSVBtD/ismDZMf/0pgs3gVOZQoSA9yJTO zkwMvQW3ox0XM+54PFKtmNOmS8jXKBaL0iUO+BuEZl44Oh1CA096tbET5jWlGCR2 PlxtcipPA5fx+ZM8RoYZKoCxP1JLr8UU4VQkEJiliz8QD0mfpygzAgEC -----END DH PARAMETERS----- gsoap-2.8.28/gsoap/samples/ssl/sslclient.c0000644000175000017500000002006512653650156020022 0ustar ellertellert/* sslclient.c Example SSL-secure client. SSL-enabled services use the gSOAP SSL interface. See sslclient.c and sslserver.c for example code with instructions and the gSOAP documentation more details. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" #include "ssl.nsmap" #include /* defines _POSIX_THREADS if pthreads are available */ #if defined(_POSIX_THREADS) || defined(_SC_THREADS) #include #endif #include /* defines SIGPIPE */ const char server[] = "https://localhost:18081"; int CRYPTO_thread_setup(); void CRYPTO_thread_cleanup(); void sigpipe_handle(int); int main() { struct soap soap; double a, b, result; /* Init SSL */ soap_ssl_init(); if (CRYPTO_thread_setup()) { fprintf(stderr, "Cannot setup thread mutex for OpenSSL\n"); exit(1); } a = 10.0; b = 20.0; /* Init gSOAP context */ soap_init(&soap); /* The supplied server certificate "server.pem" assumes that the server is running on 'localhost', so clients can only connect from the same host when verifying the server's certificate. Use SOAP_SSL_NO_AUTHENTICATION to omit the authentication of the server and use encryption directly from any site. To verify the certificates of third-party services, they must provide a certificate issued by Verisign or another trusted CA. At the client-side, the capath parameter should point to a directory that contains these trusted (root) certificates or the cafile parameter should refer to one file will all certificates. To help you out, the supplied "cacerts.pem" file contains the certificates issued by various CAs. You should use this file for the cafile parameter instead of "cacert.pem" to connect to trusted servers. Note that the client may fail to connect if the server's credentials have problems (e.g. expired). Use SOAP_SSL_NO_AUTHENTICATION and set cacert to NULL to encrypt messages if you don't care about the trustworthyness of the server. Note 1: the password and capath are not used with GNUTLS Note 2: setting capath may not work on Windows. */ if (soap_ssl_client_context(&soap, /* SOAP_SSL_NO_AUTHENTICATION, */ /* for encryption w/o authentication */ /* SOAP_SSL_DEFAULT | SOAP_SSL_SKIP_HOST_CHECK, */ /* if we don't want the host name checks since these will change from machine to machine */ SOAP_SSL_DEFAULT | SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE, /* allow self-signed, expired, and certificates w/o CRL */ /* SOAP_SSL_DEFAULT, */ /* use SOAP_SSL_DEFAULT in production code */ NULL, /* keyfile (cert+key): required only when client must authenticate to server (see SSL docs to create this file) */ NULL, /* password to read the keyfile */ "cacert.pem", /* optional cacert file to store trusted certificates, use cacerts.pem for all public certificates issued by common CAs */ NULL, /* optional capath to directory with trusted certificates */ NULL /* if randfile!=NULL: use a file with random data to seed randomness */ )) { soap_print_fault(&soap, stderr); exit(1); } /* code below enables CRL, may need SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE when certs have no CRL */ if (soap_ssl_crl(&soap, "") ) { soap_print_fault(&soap, stderr); exit(1); } soap.connect_timeout = 60; /* try to connect for 1 minute */ soap.send_timeout = soap.recv_timeout = 30; /* if I/O stalls, then timeout after 30 seconds */ if (soap_call_ns__add(&soap, server, "", a, b, &result) == SOAP_OK) fprintf(stdout, "Result: %f + %f = %f\n", a, b, result); else soap_print_fault(&soap, stderr); soap_destroy(&soap); /* C++ */ soap_end(&soap); soap_done(&soap); CRYPTO_thread_cleanup(); return 0; } /******************************************************************************\ * * OpenSSL * \******************************************************************************/ #ifdef WITH_OPENSSL #if defined(WIN32) # define MUTEX_TYPE HANDLE # define MUTEX_SETUP(x) (x) = CreateMutex(NULL, FALSE, NULL) # define MUTEX_CLEANUP(x) CloseHandle(x) # define MUTEX_LOCK(x) WaitForSingleObject((x), INFINITE) # define MUTEX_UNLOCK(x) ReleaseMutex(x) # define THREAD_ID GetCurrentThreadId() #elif defined(_POSIX_THREADS) || defined(_SC_THREADS) # define MUTEX_TYPE pthread_mutex_t # define MUTEX_SETUP(x) pthread_mutex_init(&(x), NULL) # define MUTEX_CLEANUP(x) pthread_mutex_destroy(&(x)) # define MUTEX_LOCK(x) pthread_mutex_lock(&(x)) # define MUTEX_UNLOCK(x) pthread_mutex_unlock(&(x)) # define THREAD_ID pthread_self() #else # error "You must define mutex operations appropriate for your platform" # error "See OpenSSL /threads/th-lock.c on how to implement mutex on your platform" #endif struct CRYPTO_dynlock_value { MUTEX_TYPE mutex; }; static MUTEX_TYPE *mutex_buf; static struct CRYPTO_dynlock_value *dyn_create_function(const char *file, int line) { struct CRYPTO_dynlock_value *value; value = (struct CRYPTO_dynlock_value*)malloc(sizeof(struct CRYPTO_dynlock_value)); if (value) MUTEX_SETUP(value->mutex); return value; } static void dyn_lock_function(int mode, struct CRYPTO_dynlock_value *l, const char *file, int line) { if (mode & CRYPTO_LOCK) MUTEX_LOCK(l->mutex); else MUTEX_UNLOCK(l->mutex); } static void dyn_destroy_function(struct CRYPTO_dynlock_value *l, const char *file, int line) { MUTEX_CLEANUP(l->mutex); free(l); } void locking_function(int mode, int n, const char *file, int line) { if (mode & CRYPTO_LOCK) MUTEX_LOCK(mutex_buf[n]); else MUTEX_UNLOCK(mutex_buf[n]); } unsigned long id_function() { return (unsigned long)THREAD_ID; } int CRYPTO_thread_setup() { int i; mutex_buf = (MUTEX_TYPE*)malloc(CRYPTO_num_locks() * sizeof(pthread_mutex_t)); if (!mutex_buf) return SOAP_EOM; for (i = 0; i < CRYPTO_num_locks(); i++) MUTEX_SETUP(mutex_buf[i]); CRYPTO_set_id_callback(id_function); CRYPTO_set_locking_callback(locking_function); CRYPTO_set_dynlock_create_callback(dyn_create_function); CRYPTO_set_dynlock_lock_callback(dyn_lock_function); CRYPTO_set_dynlock_destroy_callback(dyn_destroy_function); return SOAP_OK; } void CRYPTO_thread_cleanup() { int i; if (!mutex_buf) return; CRYPTO_set_id_callback(NULL); CRYPTO_set_locking_callback(NULL); CRYPTO_set_dynlock_create_callback(NULL); CRYPTO_set_dynlock_lock_callback(NULL); CRYPTO_set_dynlock_destroy_callback(NULL); for (i = 0; i < CRYPTO_num_locks(); i++) MUTEX_CLEANUP(mutex_buf[i]); free(mutex_buf); mutex_buf = NULL; } #else /* OpenSSL not used, e.g. GNUTLS is used */ int CRYPTO_thread_setup() { return SOAP_OK; } void CRYPTO_thread_cleanup() { } #endif /******************************************************************************\ * * SIGPIPE * \******************************************************************************/ void sigpipe_handle(int x) { } gsoap-2.8.28/gsoap/samples/ssl/Makefile.am0000644000175000017500000000141412653650156017707 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = foreign 1.4 noinst_PROGRAMS = sslclient sslserver SOAPHEADER = ssl.h include ../Makefile.defines include ../Makefile.c_rules SOAP_NS = $(SOAP_NS_DEF) sslclient_CFLAGS = -DWITH_OPENSSL -DWITH_GZIP sslclient_SOURCES = sslclient.c $(SOAPHEADER) $(SOAP_C_CLIENT) sslclient_LDADD = $(SOAP_C_LIB_SSL) $(SAMPLE_EXTRA_LIBS) $(SAMPLE_SSL_LIBS) -lpthread sslserver_CFLAGS = -DWITH_OPENSSL -DWITH_GZIP sslserver_SOURCES = sslserver.c $(SOAPHEADER) $(SOAP_C_SERVER) ../../plugin/threads.c sslserver_LDADD = $(SOAP_C_LIB_SSL) $(SAMPLE_EXTRA_LIBS) $(SAMPLE_SSL_LIBS) -lpthread gsoap-2.8.28/gsoap/samples/ssl/cacert.pem0000644000175000017500000000242212653650156017617 0ustar ellertellert-----BEGIN CERTIFICATE----- MIIDkDCCAvmgAwIBAgIJANZ2BsVMtBtVMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYD VQQGEwJVUzELMAkGA1UECBMCRkwxFDASBgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYD VQQKEw1HZW5pdmlhLCBJbmMuMQswCQYDVQQLEwJJVDESMBAGA1UEAxMJbG9jYWxo b3N0MSIwIAYJKoZIhvcNAQkBFhNjb250YWN0QGdlbml2aWEuY29tMB4XDTE1MDgw NDE5MDEyMFoXDTE4MDgwMzE5MDEyMFowgY0xCzAJBgNVBAYTAlVTMQswCQYDVQQI EwJGTDEUMBIGA1UEBxMLVGFsbGFoYXNzZWUxFjAUBgNVBAoTDUdlbml2aWEsIElu Yy4xCzAJBgNVBAsTAklUMRIwEAYDVQQDEwlsb2NhbGhvc3QxIjAgBgkqhkiG9w0B CQEWE2NvbnRhY3RAZ2VuaXZpYS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJ AoGBALx/LiwGRi4wH8y0MEL64VJs5H2O1F4uuYO+aNVZHl5ULRDmSh/4eF8aOYXT B05PfVoctBogcK0ohPEhiUcR/029LQTkEs/5D7XsuRuQsUnMfkEihmC2VtEuJMqT OeXmuIcemEw0QL3ulny7H8W6Aq2rByC2r5iqytnM4Uuw7LMnAgMBAAGjgfUwgfIw HQYDVR0OBBYEFPjHgoC7fuLKD8eItzogWWMDKpTQMIHCBgNVHSMEgbowgbeAFPjH goC7fuLKD8eItzogWWMDKpTQoYGTpIGQMIGNMQswCQYDVQQGEwJVUzELMAkGA1UE CBMCRkwxFDASBgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYDVQQKEw1HZW5pdmlhLCBJ bmMuMQswCQYDVQQLEwJJVDESMBAGA1UEAxMJbG9jYWxob3N0MSIwIAYJKoZIhvcN AQkBFhNjb250YWN0QGdlbml2aWEuY29tggkA1nYGxUy0G1UwDAYDVR0TBAUwAwEB /zANBgkqhkiG9w0BAQUFAAOBgQB+fmbScGp3R4D0Sf4gbBJ/3CGEn4/HvupSikDq vyaviwJ2KQKGlAr/lDh1qSYItkazJpJDIxyG2Dzm2w0F0u1+CSwpym6eq1pxc8dh GRdrCVyuM0gUoBvxUym7o0Bq1V6onUjwrAti+onsZjDpfAIKBI8TRfjuTNzFeSAV G2zULg== -----END CERTIFICATE----- gsoap-2.8.28/gsoap/samples/router/0000755000175000017500000000000012653650172016370 5ustar ellertellertgsoap-2.8.28/gsoap/samples/router/Makefile.in0000644000175000017500000004412312653650156020443 0ustar ellertellert# Makefile.in generated by automake 1.14 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = router$(EXEEXT) DIST_COMMON = $(srcdir)/../Makefile.defines \ $(srcdir)/../Makefile.c_rules $(srcdir)/Makefile.in \ $(srcdir)/Makefile.am $(top_srcdir)/mkinstalldirs \ $(top_srcdir)/depcomp subdir = gsoap/samples/router ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = am__objects_2 = soapC.$(OBJEXT) am_router_OBJECTS = router.$(OBJEXT) $(am__objects_1) $(am__objects_2) router_OBJECTS = $(am_router_OBJECTS) am__DEPENDENCIES_1 = router_DEPENDENCIES = $(SOAP_C_LIB) $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(router_SOURCES) DIST_SOURCES = $(router_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ STRIP = @STRIP@ VERSION = @VERSION@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 SOAPHEADER = router.h AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a SOAP_C_SRC = $(SOAP_C_CLIENT) soapServer.c $(SOAP_H_FILES) $(SOAP_NS) LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_C_SRC) CLEANFILES = $(SOAP_C_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.c soapClient.c soapClientLib.c soapServer.c soapServerLib.c *~ SOAP_NS = $(SOAP_NS_DEF) router_SOURCES = router.c $(SOAPHEADER) $(SOAP_C_CORE) router_LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) -lpthread all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.c_rules $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/router/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/router/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.c_rules: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) router$(EXEEXT): $(router_OBJECTS) $(router_DEPENDENCIES) $(EXTRA_router_DEPENDENCIES) @rm -f router$(EXEEXT) $(AM_V_CCLD)$(LINK) $(router_OBJECTS) $(router_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/router.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapC.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am $(SOAP_C_SRC) : $(SOAPHEADER) $(SOAP) -cL -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $(SOAPHEADER) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.28/gsoap/samples/router/router.c0000644000175000017500000006532512653650156020071 0ustar ellertellert/* router.c SOAP/XML message router (relay server and message forwarding). Note: HTTP cookies are not supported Copyright (C) 2000-2002 Robert A. van Engelen. All Rights Reserved. Configure ========= The router uses two routing tables: an internal table (for speed) and an external routing file (for flexibility). The internal is always checked first. Change the contents of the tables to your needs. Internal table: struct t__Routing routing[] (see below) External table: provide the name of a default routing file (see below) or use router option -r Compile ======= soapcpp2 -c router.h gcc -o router router.c stdsoap2.c soapC.c Notes ===== Unix/Linux SIGPIPE handler must be added to avoid broken pipe. In DEBUG mode the engine reports memory leaks for the allocation of the external routing table. This is normal, because the routing table is permanent. Usage scenarios =============== Command-line options: -a action value override (SOAP Action) -c connect directly to endpoint if routing table redirect fails -e endpoint URL -g start stand-alone router on port -r use external routing table (XML file) -t connect/send/recv timeout Forwarding of messages to a service ----------------------------------- router [-c] [-e | -g] [-a] [-r] [-t] [] Examples: 1. router -c request.soap Sends the request message stored in file request.soap and returns response to stdout where file request.soap contains a SOAP request with HTTP header and SOAP/XML/DIME body. If the SOAPAction in the message is present and matches one or more keys in the routing table, the alternative service endpoints in the table will be tried first until one service endpoint is found to accept the connection. If no SOAPAction is given or the SOAPAction does not match any key, then the endpoint in the HTTP header in request.soap is searched in the routing table. If the endoint matches one or more keys in the routing table, the alternative endpoints will be tried first until one endpoint is found to accept the connection. Finally, the endpoint in the HTTP header of request.soap is used to establish a connection if all other service endpoints in the table failed and if option -c is enabled. 2. router -c -e http://domain/path request.soap Sends request message to http://domain/path and returns the service response to stdout. If http://domain/path matches one or more keys in the routing table, then the alternative service endpoints in the table will be tried first until one service endpoint is found to accept the connection. The http://domain/path endpoint is tried last when all other service endpoints in the table failed. File request.soap MAY contain an HTTP header but MUST of course contain a body. To try this, compile the 'calc' client (samples/calc). Edit the 'calc.add.req.xml' SOAP/XML request file and replace and values. Then run: router -c -e "http://www.cs.fsu.edu/~engelen/calcserver.cgi" -a "" calc.add.req.xml The SOAP/XML response is returned. 3. router -a SOAPAction request.soap When SOAPAction matches one or more keys in the routing table, then the alternative endpoints in the table will be tried first until one endpoint is found to accept the connection. When all endpoints fail, or when SOAPAction does not match a key, the router fails. File request.soap MAY contain an HTTP header but MUST of course contain a body. 4. router -c -r routingtable.xml request.soap Same as 1. but uses routingtable.xml as the routing table after checking keys in the internal routing table. The XSD schema of routingtable.xml is generated as t.xsd. The default routing table file is router.xml. 5. router -c -t5 request.soap Same as 1. but searches the routing table for an endpoint that takes less than 5 seconds to connect to. Use negative timeouts to specify a timeout value in microseconds. The timeout also specifies the message receive timeout AFTER the connection was established. 6. cat request.soap | router -c -e http://domain/path | more When request.soap does not contain an HTTP header, the router computes the HTTP content length by buffering the entire request message which allows you to use it as a filter as in this example. (fstat() is generally tried first to determine file length.) 7. router -c -g http://domain/path/file.html Sends an HTTP GET request to the host and copies the response to stdout. CGI-based relay server ---------------------- Install the router as CGI application. The CGI-based relay service uses SOAPActions in the messages and HTTP query strings to index the routing table. Examples: Messages addressed to "http://domain/cgi-bin/router?key" will be routed by the router to the service endpoint associated with the key in the routing table. When messages use SOAPActions, the SOAPActions will be used to find service endpoints instead of a query string. To tunnel SOAP through firewals to stateful stand-alone Web services: run a stand-alone gSOAP Web service on a port, e.g. 18000. Add the key-endpoint pair "myservice", "http://localhost:18000" to the router table. After installing the router, all requests for endpoint http://domain/cgi-bin/router?myservice will be tunneled to the stand-alone Web service. To add backup services: add multiple key-endpoint pairs to the routing table with the same key. Given a key (e.g. SOAPAction or Query string) the router will check the endpoints in sequence until it can connect. If one or more of the backup services are down, an active service endpoint will be selected. Multi-threaded stand-alone relay server --------------------------------------- router -p [-r] [-t] & Examples: router -p18000 -rtable.xml -t5 & Runs a stand-alone router on port 18000 using table.xml as the external routing table for lookup. Service endpoints are selected from alternative endpoints that take less than 5 seconds to connect to. Clients connect to the router with a service endpoint such as "http://machine:/path" where the endpoint "http://machine/path" (note the absence of the port) will be used as a key in the routing table to find an endpoint when no SOAPAction is present. For example, a stand-alone Web service called "quote" runs on a machine named "zulu" port 18080. To address this service through the router, add key "http://zulu/quote" and endpoint "http://zulu:18080" to the routing table. Run the router on port 18000. Router requests with endpoint "http://zulu:18000/quote" will be relayed to zulu:18080 Gateway keeper -------------- When the routing table contains userid and passwd information, the client requests are only tunnelled when the proper HTTP Authorization userid and passwd are provided in the client request message. It is possible to provide different service endpoint in the table depending on the client's HTTP Authorization information. Notes ----- * Table lookup algorithm: SOAPActions (if provided) are used first to match routing table keys. Next, HTTP query string in the endpoint URL (CGI only) is used to match routing table keys. Next, the service endpoint is checked to match routing table keys. Finally, if the -c option is set the service endpoint URL itself is used to connect. * Keys in routing table may contain * (multi-char) and - (single-char) wildcards to match multiple SOAPActions and endpoints. * When a match is found but the endpoint is NULL in the table, the search is terminated. This can be used to prevent searches in the routing file for specific patterns. * Optional HTTP Authorization userid and passwd are checked if present in the routing table. The userid and passwd may be patterns with '*' and '-' wildcards. An endpoint in the table is selected for which the userid and passwd match. * is TCP connect and I/O timeout for router-server connection in seconds (use negative value for timeout in microseconds). * When an external routing table is once read by a stand-alone router, it will be cached to optimize speed. But this also means that changing the contents of the routing table file does not affect the actual routing while the stand-alone router is running. * HTTP POST and HTTP GET styles of SOAP messaging is supported (but CGI-based router does not support HTTP GET) * Supports any type of messages (e.g. DIME) * HTTP cookies are not handled and will be deleted from the HTTP header * Keep-alive support has not been tested and might not work -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" #include /* need fstat */ #include "threads.h" /* plugin/threads.h for portable threads+mutex */ /* Maximum request backlog */ #define BACKLOG (100) /* Default file name of external routing table (or NULL if none used) */ #define DEFAULT_ROUTINGFILE "router.xml" /* Internal routine table (fast) */ static struct t__Routing routing[] = /* SOAPAction/endpoint -> target endpoint [userid, passwd] */ { {"dime", "http://websrv.cs.fsu.edu/~engelen/dimesrv.cgi"}, {"http://*/dime", "http://websrv.cs.fsu.edu/~engelen/dimesrv.cgi"}, {"magic", "http://www.cs.fsu.edu/~engelen/magicserver.cgi"}, {NULL, NULL} }; #ifdef WIN32 #define OPTION_CHAR '/' #else #define OPTION_CHAR '-' #endif struct header { struct header *next; char line[SOAP_HDRLEN]; }; static int port_number = 0; static const char *input_file = NULL; static const char *service_endpoint = NULL; static const char *service_action = NULL; static const char *routing_file = DEFAULT_ROUTINGFILE; static int server_timeout = 0; static int method = SOAP_POST; static int connect_flag = 0; void options(int, char**); void *process_request(void*); const char *lookup(struct t__RoutingTable*, const char*, const char*, const char*); int copy_header(struct soap*, struct soap*, const char*, const char*); int create_header(struct soap*, int, const char*, const char*, size_t); int buffer_body(struct soap*); int copy_body(struct soap*, struct soap*); int server_connect(struct soap*, const char*, const char*, const char*, const char*); int make_connect(struct soap*, const char*); int main(int argc, char **argv) { options(argc, argv); if (port_number) { /* run server on port */ THREAD_TYPE tid; struct soap soap, *tsoap; int m, s, i; soap_init(&soap); soap.bind_flags = SO_REUSEADDR; /* don't use this in a secure environment. We keep it here so you can quickly restart the router */ m = soap_bind(&soap, NULL, port_number, BACKLOG); if (!soap_valid_socket(m)) { soap_print_fault(&soap, stderr); exit(1); } fprintf(stderr, "Socket connection successful %d\n", m); for (i = 1; ; i++) { s = soap_accept(&soap); if (!soap_valid_socket(s)) { if (soap.errnum) soap_print_fault(&soap, stderr); else fprintf(stderr, "router timed out\n"); /* if accept_timeout is set */ break; } fprintf(stderr, "Thread %d accepts socket %d connection from IP %d.%d.%d.%d\n", i, s, (int)(soap.ip>>24)&0xFF, (int)(soap.ip>>16)&0xFF, (int)(soap.ip>>8)&0xFF, (int)soap.ip&0xFF); tsoap = soap_copy(&soap); THREAD_CREATE(&tid, (void*(*)(void*))process_request, (void*)tsoap); } } else /* run as stand-alone or CGI */ { struct soap client; struct soap server; int err; soap_init(&client); soap_init(&server); if (argc <= 1) /* try CGI env vars */ { char *s = getenv("REQUEST_METHOD"); if (s && !strcmp(s, "GET")) method = SOAP_GET; else { s = getenv("Content-Length"); if (s) client.length = strtoul(s, NULL, 10); } service_action = getenv("HTTP_SOAPAction"); if (!service_action) service_action = getenv("QUERY_STRING"); } if (method == SOAP_POST) { soap_wchar c; if (input_file) { client.recvfd = open(input_file, O_RDONLY); if (client.recvfd < 0) { fprintf(stderr, "router: cannot open file '%s' for reading\n", input_file); exit(1); } } c = soap_get0(&client); if (c == 'G' || c == 'P') /* simple check to see if HTTP GET/POST header is present */ { if (copy_header(&client, &server, service_endpoint, service_action)) { err = client.error = server.error; soap_send_fault(&client); return err; } } else { struct stat sb; if (!fstat(client.recvfd, &sb) && sb.st_size > 0) client.length = sb.st_size; else if ((err = buffer_body(&client)) != SOAP_OK) { soap_send_fault(&client); return err; } if (create_header(&server, SOAP_POST, service_endpoint, service_action, client.length)) { err = client.error = server.error; soap_send_fault(&client); return err; } } if ((err = copy_body(&client, &server)) != SOAP_OK) { soap_send_fault(&client); return err; } } else { if (create_header(&server, SOAP_GET, service_endpoint, service_action, 0)) { err = client.error = server.error; soap_send_fault(&client); return err; } soap_end_send(&server); } soap_begin(&server); copy_header(&server, &client, NULL, NULL); /* ignore TCP error for stdout */ if ((err = copy_body(&server, &client)) != SOAP_OK) return err; soap_closesock(&client); soap_closesock(&server); soap_end(&client); soap_end(&server); soap_done(&client); soap_done(&server); } return 0; } void options(int argc, char **argv) { int i, flag; char *arg; for (i = 1; i < argc; i++) { arg = argv[i]; if (*arg == OPTION_CHAR) { flag = 1; while (flag && *++arg) switch (*arg) { case 'h': fprintf(stderr, "Usage: router [-c] [-p] [-e | -g] [-a] [-r] [-t] []\n-a\taction value override (SOAP Action)\n-c\tconnect directly to endpoint\n-e\tendpoint URL\n-g\tget content (instead of HTTP POST)\n-p\tstart stand-alone router on port\n-r\trouting table\n-t\ttimeout in seconds"); exit(0); case 'p': flag = 0; if (*++arg) port_number = atol(arg); else if (i < argc && argv[++i]) port_number = atol(argv[i]); else { fprintf(stderr, "router: -p requires \n"); exit(1); } break; case 'g': method = SOAP_GET; case 'e': flag = 0; if (*++arg) service_endpoint = arg; else if (i < argc && argv[++i]) service_endpoint = argv[i]; else { fprintf(stderr, "router: -e and -g require \n"); exit(1); } break; case 'a': flag = 0; if (*++arg) service_action = arg; else if (i < argc && argv[++i]) service_action = argv[i]; else { fprintf(stderr, "router: -a requires \n"); exit(1); } break; case 'r': flag = 0; if (*++arg) routing_file = arg; else if (i < argc && argv[++i]) routing_file = argv[i]; else { fprintf(stderr, "router: -r requires \n"); exit(1); } break; case 't': flag = 0; if (*++arg) server_timeout = atol(arg); else if (i < argc && argv[++i]) server_timeout = atol(argv[i]); else { fprintf(stderr, "router: -t requires \n"); exit(1); } break; case 'c': connect_flag = 1; break; default: fprintf(stderr, "router: unknown option -%c\n", *arg); } } else input_file = arg; } } void* process_request(void *soap) { struct soap *client = (struct soap*)soap, server; soap_wchar c; THREAD_DETACH(THREAD_ID); soap_init(&server); soap_begin(client); c = soap_get0(client); if (c == 'G' || c == 'P') /* simple check to see if HTTP GET/POST header is present */ { if (copy_header(client, &server, NULL, NULL)) client->error = server.error; } else { buffer_body(client); if (create_header(&server, method, service_endpoint, service_action, client->length)) client->error = server.error; } if (!client->error) { copy_body(client, &server); soap_begin(&server); copy_header(&server, client, NULL, NULL); copy_body(&server, client); } else soap_send_fault(client); soap_closesock(client); soap_closesock(&server); soap_end(&server); soap_end(client); soap_done(&server); soap_free(client); return NULL; } const char* lookup(struct t__RoutingTable *route, const char *key, const char *userid, const char *passwd) { static struct t__RoutingTable routing_table = {0, NULL}; /* file-based routing table cache */ if (!key) return NULL; /* can't do lookup on nil key */ if (!route->__ptr) { route->__ptr = routing; /* first stage: use internal routing table */ route->__size = 999999999; } else if (route->__size) { route->__ptr++; route->__size--; } for (;;) { if (route->__ptr) { while (route->__size && route->__ptr->key) { if (!soap_tag_cmp(key, route->__ptr->key)) if (!route->__ptr->userid || !route->__ptr->passwd || !userid || !passwd || !soap_tag_cmp(userid, route->__ptr->userid) || !soap_tag_cmp(passwd, route->__ptr->passwd)) return route->__ptr->endpoint; route->__ptr++; route->__size--; } } if (route->__size) /* second stage: use file-based routing table */ { if (routing_table.__ptr) *route = routing_table; /* table is already cached in memory */ else if (routing_file) /* else read table from file */ { static struct soap soap = { SOAP_NONE }; MUTEX_TYPE lock; MUTEX_LOCK(lock); if (soap.state == SOAP_NONE) soap_init(&soap); soap.recvfd = open(routing_file, O_RDONLY); if (soap.recvfd < 0) /* no routing file: silently stop */ { MUTEX_UNLOCK(lock); break; } if (!soap_begin_recv(&soap)) if (!soap_get_t__RoutingTable(&soap, &routing_table, "router", NULL)) { close(soap.recvfd); MUTEX_UNLOCK(lock); break; } soap_end_recv(&soap); close(soap.recvfd); *route = routing_table; MUTEX_UNLOCK(lock); } } else break; } return NULL; } int make_connect(struct soap *server, const char *endpoint) { char host[SOAP_TAGLEN]; int port; soap_strcpy(host, sizeof(host), server->host); port = server->port; soap_set_endpoint(server, endpoint); /* get host, path, and port */ server->connect_timeout = server_timeout; server->recv_timeout = server_timeout; server->send_timeout = server_timeout; /* server->connect_flags = SO_NOSIGPIPE; */ /* prevents UNIX SIGPIPE */ /* server->socket_flags = MSG_NOSIGNAL; */ /* prevents UNIX SIGPIPE */ if (*server->host) { if (!soap_valid_socket(server->socket) || strcmp(server->host, host) || server->port != port) { soap_closesock(server); server->socket = server->fopen(server, endpoint, server->host, server->port); if (!soap_valid_socket(server->socket)) return server->error; } } return SOAP_OK; } int server_connect(struct soap *server, const char *endpoint, const char *action, const char *userid, const char *passwd) { if (action && *action) { struct t__RoutingTable route; route.__ptr = NULL; route.__size = 0; fprintf(stderr, "Searching services on action %s...\n", action); while (lookup(&route, action, userid, passwd)) { fprintf(stderr, "Attempting to connect to '%s'\n", route.__ptr->endpoint); if (!make_connect(server, route.__ptr->endpoint)) return SOAP_OK; } } if (endpoint && *endpoint) { struct t__RoutingTable route; route.__ptr = NULL; route.__size = 0; fprintf(stderr, "Searching services on endpoint %s...\n", endpoint); while (lookup(&route, endpoint, userid, passwd)) { fprintf(stderr, "Attempting to connect to '%s'\n", route.__ptr->endpoint); if (!make_connect(server, route.__ptr->endpoint)) return SOAP_OK; } } if (connect_flag && endpoint && *endpoint) { fprintf(stderr, "Connect to endpoint %s...\n", endpoint); if (!make_connect(server, endpoint)) return SOAP_OK; } return server->error = SOAP_TCP_ERROR; } int copy_header(struct soap *sender, struct soap *receiver, const char *endpoint, const char *action) { struct header *h, *p; char *s, *t; h = (struct header*)SOAP_MALLOC(sender, sizeof(struct header)); for (;;) { if (soap_getline(sender, h->line, SOAP_HDRLEN)) { SOAP_FREE(sender, h); return sender->error = SOAP_EOF; } t = strchr(h->line, ' '); if (!t || strncmp(t, " 100 ", 5)) break; do { if (soap_getline(sender, h->line, SOAP_HDRLEN)) { SOAP_FREE(sender, h); return sender->error = SOAP_EOF; } } while (*h->line); } p = h; for (;;) { p = p->next = (struct header*)SOAP_MALLOC(sender, sizeof(struct header)); p->next = NULL; if (soap_getline(sender, p->line, SOAP_HDRLEN)) { while (h) { p = h->next; SOAP_FREE(sender, h); h = p; } return sender->error = SOAP_EOF; } if (!*p->line) break; s = t = strchr(p->line, ':'); if (t) { *t = '\0'; do t++; while (*t && *t <= 32); } sender->fparsehdr(sender, p->line, t); if (s) *s = ':'; } s = strstr(h->line, "HTTP/"); if (s && (!strncmp(h->line, "GET ", 4) || !strncmp(h->line, "POST ", 5))) { size_t m = strlen(sender->endpoint); size_t n = m + (s - h->line) - 5 - (*h->line == 'P'); if (n >= sizeof(sender->endpoint)) n = sizeof(sender->endpoint) - 1; soap_strncpy(sender->path, sizeof(sender->path), h->line + 4 + (*h->line == 'P'), n - m); soap_strncpy(sender->endpoint + m, sizeof(sender->endpoint) - m, sender->path, n - m); } if (!endpoint || !*endpoint) endpoint = sender->endpoint; if (!action || !*action) action = sender->action; if (server_connect(receiver, endpoint, action, receiver->userid, receiver->passwd)) { while (h) { p = h->next; SOAP_FREE(sender, h); h = p; } return receiver->error; } receiver->count = sender->length; soap_begin_send(receiver); receiver->mode &= ~SOAP_IO; receiver->mode |= SOAP_IO_BUFFER; while (h) { receiver->fposthdr(receiver, h->line, NULL); p = h->next; SOAP_FREE(sender, h); h = p; } if ((sender->mode & SOAP_IO) == SOAP_IO_CHUNK) { if (soap_flush(receiver)) return receiver->error; receiver->mode &= ~SOAP_IO; receiver->mode |= SOAP_IO_CHUNK; } return SOAP_OK; } int create_header(struct soap *server, int method, const char *endpoint, const char *action, size_t count) { if (server_connect(server, endpoint, action, NULL, NULL)) return server->error; soap_begin_send(server); server->mode &= ~SOAP_IO; server->mode |= SOAP_IO_BUFFER; server->status = method; return server->error = server->fpost(server, server->endpoint, server->host, server->port, server->path, action, count); } int buffer_body(struct soap *sender) { char *s; if (!soap_new_block(sender)) return sender->error; for (;;) { if (!(s = (char*)soap_push_block(sender, NULL, sender->buflen - sender->bufidx))) return SOAP_EOM; soap_memcpy((void*)s, sender->buflen - sender->bufidx, (const void*)(sender->buf + sender->bufidx), sender->buflen - sender->bufidx); if (soap_recv_raw(sender)) break; } if (sender->error == SOAP_EOF) sender->error = SOAP_OK; if (sender->error || soap_end_recv(sender)) return sender->error; sender->length = sender->blist->size; return SOAP_OK; } int copy_body(struct soap *sender, struct soap *receiver) { if (sender->blist) { char *p; for (p = soap_first_block(sender, NULL); p; p = soap_next_block(sender, NULL)) soap_send_raw(receiver, p, soap_block_size(sender, NULL)); soap_end_block(sender, NULL); } else { if ((sender->mode & SOAP_IO) == SOAP_IO_CHUNK) { sender->chunkbuflen = sender->buflen; sender->buflen = sender->bufidx; sender->chunksize = 0; while (!soap_recv_raw(sender)) { if (soap_send_raw(receiver, sender->buf + sender->bufidx, sender->buflen - sender->bufidx)) return receiver->error; } } else { soap_send_raw(receiver, sender->buf + sender->bufidx, sender->buflen - sender->bufidx); /* send part after HTTP header */ if (sender->buflen - sender->bufidx < sender->length) { sender->length -= sender->buflen - sender->bufidx; while (!soap_recv_raw(sender)) { if (soap_send_raw(receiver, sender->buf, sender->buflen)) return receiver->error; if (sender->buflen >= sender->length) break; sender->length -= sender->buflen; } } } if (soap_end_recv(sender)) return sender->error; } if (soap_end_send(receiver)) return receiver->error; return SOAP_OK; } struct Namespace namespaces[] = { {"SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/"}, {"SOAP-ENC", "http://schemas.xmlsoap.org/soap/encoding/"}, {"xsi", "http://www.w3.org/2001/XMLSchema-instance", "http://www.w3.org/*/XMLSchema-instance"}, {"xsd", "http://www.w3.org/2001/XMLSchema", "http://www.w3.org/*/XMLSchema"}, {"t", "http://tempuri.org"}, {NULL, NULL} }; gsoap-2.8.28/gsoap/samples/router/router.h0000644000175000017500000000331012653650156020060 0ustar ellertellert/* router.h Simple Web Service message router (relay server) -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ struct t__Routing { char *key; // key matches SOAPAction or query string or endpoint URL char *endpoint; char *userid; // optional HTTP Authorization userid char *passwd; // optional HTTP Authorization passwd }; struct t__RoutingTable { int __size; struct t__Routing *__ptr; }; gsoap-2.8.28/gsoap/samples/router/README.txt0000644000175000017500000001706112653650156020075 0ustar ellertellert SOAP/XML over HTTP message router. Supports many HTTP message routing scenarios. Command-line options: -a action value override (SOAP Action) -c connect directly to endpoint if routing table redirect fails -e endpoint URL -g start stand-alone router on port -r routing table XML file -t timeout Forwarding of messages to a service ----------------------------------- router [-c] [-e | -g] [-a] [-r] [-t] [] Examples: 1. router -c request.soap Sends the request message stored in file request.soap and returns response to stdout where file request.soap contains a SOAP request with HTTP header and SOAP/XML/DIME body. If the SOAPAction in the message is present and matches one or more keys in the routing table, the alternative service endpoints in the table will be tried first until one service endpoint is found to accept the connection. If no SOAPAction is given or the SOAPAction does not match any key, then the endpoint in the HTTP header in request.soap is searched in the routing table. If the endoint matches one or more keys in the routing table, the alternative endpoints will be tried first until one endpoint is found to accept the connection. Finally, the endpoint in the HTTP header of request.soap is used to establish a connection if all other service endpoints in the table failed and if option -c is enabled. 2. router -c -ehttp://domain/path request.soap Sends request message to http://domain/path and returns the service response to stdout. If http://domain/path matches one or more keys in the routing table, then the alternative service endpoints in the table will be tried first until one service endpoint is found to accept the connection. The http://domain/path endpoint is tried last when all other service endpoints in the table failed. File request.soap MAY contain an HTTP header but MUST of course contain a body. To try this, compile the 'calc' client (samples/calc). Edit the 'calc.add.req.xml' SOAP/XML request file and replace and values. Then run: router -ehttp://www.cs.fsu.edu/~engelen/calcserver.cgi -a"" calc.add.req.xml The SOAP/XML response is returned. 3. router -aSOAPAction request.soap When SOAPAction matches one or more keys in the routing table, then the alternative endpoints in the table will be tried first until one endpoint is found to accept the connection. When all endpoints fail, or when SOAPAction does not match a key, the router fails. File request.soap MAY contain an HTTP header but MUST of course contain a body. 4. router -c -rroutingtable.xml request.soap Same as 1. but uses routingtable.xml as the routing table after checking keys in the internal routing table. The XSD schema of routingtable.xml is generated as t.xsd. The default routing table file is router.xml. 5. router -c -t5 request.soap Same as 1. but searches the routing table for an endpoint that takes less than 5 seconds to connect to. Use negative timeouts to specify a timeout value in microseconds. The timeout also specifies the message receive timeout AFTER the connection was established. 6. cat request.soap | router -ehttp://domain/path | more When request.soap does not contain an HTTP header, the router computes the HTTP content length by buffering the entire request message which allows you to use it as a filter as in this example. (fstat() is generally tried first to determine file length.) 7. router -ghttp://domain/path/file.html Sends an HTTP GET request to the host and copies the response to stdout. CGI-based relay server ---------------------- Install the router as CGI application. The CGI-based relay service uses SOAPActions in the messages and HTTP query strings to index the routing table. Examples: Messages addressed to "http://domain/cgi-bin/router?key" will be routed by the router to the service endpoint associated with the key in the routing table. When messages use SOAPActions, the SOAPActions will be used to find service endpoints instead of a query string. To tunnel SOAP through firewals to stateful stand-alone Web services: run a stand-alone gSOAP Web service on a port, e.g. 18000. Add the key-endpoint pair "myservice", "http://localhost:18000" to the router table. After installing the router, all requests for endpoint http://domain/cgi-bin/router?myservice will be tunneled to the stand-alone Web service. To add backup services: add multiple key-endpoint pairs to the routing table with the same key. Given a key (e.g. SOAPAction or Query string) the router will check the endpoints in sequence until it can connect. If one or more of the backup services are down, an active service endpoint will be selected. Multi-threaded stand-alone relay server --------------------------------------- router -p [-r] [-t] & Examples: router -p18000 -rtable.xml -t5 & Runs a stand-alone router on port 18000 using table.xml as the external routing table for lookup. Service endpoints are selected from alternative endpoints that take less than 5 seconds to connect to. Clients connect to the router with a service endpoint such as "http://machine:/path" where the endpoint "http://machine/path" (note the absence of the port) will be used as a key in the routing table to find an endpoint when no SOAPAction is present. For example, a stand-alone Web service called "quote" runs on a machine named "zulu" port 18080. To address this service through the router, add key "http://zulu/quote" and endpoint "http://zulu:18080" to the routing table. Run the router on port 18000. Router requests with endpoint "http://zulu:18000/quote" will be relayed to zulu:18080 Gateway keeper -------------- When the routing table contains userid and passwd information, the client requests are only tunnelled when the proper HTTP Authorization userid and passwd are provided in the client request message. It is possible to provide different service endpoint in the table depending on the client's HTTP Authorization information. Notes ----- * Table lookup algorithm: SOAPActions (if provided) are used first to match routing table keys. Next, HTTP query string in the endpoint URL (CGI only) is used to match routing table keys. Next, the service endpoint is checked to match routing table keys. Finally, if the -c option is set the service endpoint URL itself is used to connect. * Keys in routing table may contain * (multi-char) and - (single-char) wildcards to match multiple SOAPActions and endpoints. * When a match is found but the endpoint is NULL in the table, the search is terminated. This can be used to prevent searches in the routing file for specific patterns. * Optional HTTP Authorization userid and passwd are checked if present in the routing table. The userid and passwd may be patterns with '*' and '-' wildcards. An endpoint in the table is selected for which the userid and passwd match. * is TCP connect and I/O timeout for router-server connection in seconds (use negative value for timeout in microseconds). * When an external routing table is once read by a stand-alone router, it will be cached to optimize speed. But this also means that changing the contents of the routing table file does not affect the actual routing while the stand-alone router is running. * HTTP POST and HTTP GET styles of SOAP messaging is supported (but CGI-based router does not support HTTP GET) * Supports any type of messages (e.g. DIME) * HTTP cookies are not handled and will be deleted from the HTTP header * Keep-alive support has not been tested and might not work gsoap-2.8.28/gsoap/samples/router/Makefile.am0000644000175000017500000000074712653650156020436 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 noinst_PROGRAMS = router SOAPHEADER = router.h include ../Makefile.defines include ../Makefile.c_rules SOAP_NS = $(SOAP_NS_DEF) router_SOURCES = router.c $(SOAPHEADER) $(SOAP_C_CORE) router_LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) -lpthread gsoap-2.8.28/gsoap/samples/router/router.xml0000644000175000017500000000041112653650156020430 0ustar ellertellert magicserver http://www.cs.fsu.edu/~engelen/magicserver.cgi guest guest *?ldsrv http://localhost:18000 gsoap-2.8.28/gsoap/samples/mtom-stream/0000755000175000017500000000000012653650172017315 5ustar ellertellertgsoap-2.8.28/gsoap/samples/mtom-stream/Makefile.in0000644000175000017500000004503712653650156021375 0ustar ellertellert# Makefile.in generated by automake 1.14 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = mtom-stream$(EXEEXT) DIST_COMMON = $(srcdir)/../Makefile.defines \ $(srcdir)/../Makefile.c_rules $(srcdir)/Makefile.in \ $(srcdir)/Makefile.am $(top_srcdir)/mkinstalldirs \ $(top_srcdir)/depcomp subdir = gsoap/samples/mtom-stream ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = am__objects_2 = soapC.$(OBJEXT) am__objects_3 = soapClient.$(OBJEXT) $(am__objects_2) am__objects_4 = $(am__objects_3) soapServer.$(OBJEXT) $(am__objects_1) \ $(am__objects_1) am_mtom_stream_OBJECTS = mtom-stream-test.$(OBJEXT) $(am__objects_1) \ $(am__objects_4) mtom_stream_OBJECTS = $(am_mtom_stream_OBJECTS) am__DEPENDENCIES_1 = mtom_stream_DEPENDENCIES = $(SOAP_C_LIB) $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(mtom_stream_SOURCES) DIST_SOURCES = $(mtom_stream_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ STRIP = @STRIP@ VERSION = @VERSION@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 SOAPHEADER = mtom-stream-test.h AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a SOAP_C_SRC = $(SOAP_C_CLIENT) soapServer.c $(SOAP_H_FILES) $(SOAP_NS) LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_C_SRC) CLEANFILES = $(SOAP_C_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.c soapClient.c soapClientLib.c soapServer.c soapServerLib.c *~ SOAP_NS = mtom_stream_test.nsmap mtom_stream_test.wsdl mtom_stream_SOURCES = mtom-stream-test.c $(SOAPHEADER) $(SOAP_C_SRC) mtom_stream_LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) -lpthread all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.c_rules $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/mtom-stream/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/mtom-stream/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.c_rules: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) mtom-stream$(EXEEXT): $(mtom_stream_OBJECTS) $(mtom_stream_DEPENDENCIES) $(EXTRA_mtom_stream_DEPENDENCIES) @rm -f mtom-stream$(EXEEXT) $(AM_V_CCLD)$(LINK) $(mtom_stream_OBJECTS) $(mtom_stream_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mtom-stream-test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapC.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapClient.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapServer.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am $(SOAP_C_SRC) : $(SOAPHEADER) $(SOAP) -cL -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $(SOAPHEADER) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.28/gsoap/samples/mtom-stream/mtom-stream-test.h0000644000175000017500000000675512653650156022727 0ustar ellertellert/* mtom-stream-test.h Example streaming MTOM client and server. Copyright (C) 2000-2006 Robert A. van Engelen, Genivia, Inc. All Rights Reserved. Usage (CGI server): Install as CGI application, e.g. under cgi-bin Usage (server): mtom-stream-test 8085 & Starts a server on your host at port 8085. Usage (client): mtom-stream-test -p file1 file2 file3 ... Stores files file1, file2, etc. at the server side. The server saves them locally under a key. The storage keys are printed at the client side. The keys provide access to the data using option -g (get). mtom-stream-test -g name1 name2 name3 ... Retrieves files stored under keys name1, name2, etc. The keys must correspond to the keys returned when storing files. Files are stored by the server locally under the key name. Unix/Linux: add a sigpipe handler to avoid broken pipes. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #import "soap12.h" #import "xop.h" #import "xmime5.h" //gsoap m service name: mtom_stream_test //gsoap m service namespace: http://www.genivia.com/wsdl/mtom_stream_test.wsdl //gsoap x schema namespace: http://www.genivia.com/schemas/mtom_stream_test.xsd //gsoap x schema elementForm: qualified //gsoap x schema type-documentation: Data holds a MIME attachment struct x__Data { _xop__Include xop__Include; @char *xmime5__contentType; }; //gsoap x schema type-documentation: DataSet holds a set of MIME attachments struct x__DataSet { int __size; struct x__Data *item; }; //gsoap x schema type-documentation: Keys holds a set of strings to access the data collection at the server side struct x__Keys { int __size; char **key; }; //gsoap m service method-mime-type: PutData */* //gsoap m service method-documentation: PutData stores a data set at the server side and returns a set of unique keys to access that data int m__PutData( struct x__DataSet *x__data, struct m__PutDataResponse { struct x__Keys x__keys; }* ); //gsoap m service method-mime-type: GetData */* //gsoap m service method-documentation: GetData gets a set of data items from the server given a set of keys int m__GetData( struct x__Keys *x__keys, struct m__GetDataResponse { struct x__DataSet x__data; }* ); gsoap-2.8.28/gsoap/samples/mtom-stream/README.txt0000644000175000017500000000154312653650156021020 0ustar ellertellertMTOM attachment streaming processing example. This application is a server and client to demonstrate MTOM attachment handling. Usage (CGI server): Install as CGI application, e.g. under cgi-bin Usage (stand-alone server): $ mtom-stream-test 8085 & Starts a server on your host at port 8085. Usage (client): $ mtom-stream-test -p file1 file2 file3 ... Stores files file1, file2, etc. at the server side. The server saves them locally under a key. The storage keys are printed at the client side. The keys provide access to the data using option -g (get). $ mtom-stream-test -g name1 name2 name3 ... Retrieves files stored under keys name1, name2, etc. The keys must correspond to the keys returned when storing files. Files are stored by the server locally under the key name. gsoap-2.8.28/gsoap/samples/mtom-stream/Makefile.am0000644000175000017500000000104712653650156021355 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 noinst_PROGRAMS = mtom-stream SOAPHEADER = mtom-stream-test.h include ../Makefile.defines include ../Makefile.c_rules SOAP_NS = mtom_stream_test.nsmap mtom_stream_test.wsdl mtom_stream_SOURCES = mtom-stream-test.c $(SOAPHEADER) $(SOAP_C_SRC) mtom_stream_LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) -lpthread gsoap-2.8.28/gsoap/samples/mtom-stream/mtom-stream-test.c0000644000175000017500000005017512653650156022715 0ustar ellertellert/* mtom-stream-test.c Example streaming MTOM client and server. Copyright (C) 2000-2006 Robert A. van Engelen, Genivia, Inc. All Rights Reserved. Usage (server): mtom-stream-test 8085 & Starts a server on your local host at port 8085. Usage (client): mtom-stream-test -p file1 file2 file3 ... Stores files file1, file2, etc. at the server side. The server saves them locally under a key. The storage keys are printed at the client side. The keys provide access to the data using option -g (get). The server saves files in its current directory, or the directory specified by the TMPDIR environment variable. mtom-stream-test -g name1 name2 name3 ... Retrieves files stored under keys name1, name2, etc. The keys must correspond to the keys returned when storing files. Files are stored by the server locally under the key name. Unix/Linux: add a sigpipe handler to avoid broken pipes. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" #include "mtom_stream_test.nsmap" #if defined(_POSIX_THREADS) || defined(_SC_THREADS) #include #endif #include /******************************************************************************\ * * Default endpoint * \******************************************************************************/ const char *endpoint = "http://localhost:8085"; /******************************************************************************\ * * Server-Side Location to Store Files (Changed by TMPDIR env var) * \******************************************************************************/ const char *TMPDIR = "."; /******************************************************************************\ * * Server-Side Streaming MIME Handler for Saving File Data Under Keys * \******************************************************************************/ struct mime_server_handle { char *key; /* file name */ FILE *fd; /* file fd */ }; /******************************************************************************\ * * Forward Declarations * \******************************************************************************/ int cgi_server(); int run_server(int port); int run_client(int, char**); int open_data(struct soap *soap, const char *file, struct x__Data *data); int client_putData(struct soap *soap, int argc, char **argv); int client_getData(struct soap *soap, int argc, char **argv); void *mime_read_open(struct soap*, void*, const char*, const char*, const char*); void mime_read_close(struct soap*, void*); size_t mime_read(struct soap*, void*, char*, size_t); void *mime_server_write_open(struct soap *soap, void *handle, const char *id, const char *type, const char *description, enum soap_mime_encoding encoding); void mime_server_write_close(struct soap *soap, void *handle); int mime_server_write(struct soap *soap, void *handle, const char *buf, size_t len); void *mime_client_write_open(struct soap *soap, void *handle, const char *id, const char *type, const char *description, enum soap_mime_encoding encoding); void mime_client_write_close(struct soap *soap, void *handle); int mime_client_write(struct soap *soap, void *handle, const char *buf, size_t len); char *file_type(const char *file); /******************************************************************************\ * * Main * \******************************************************************************/ int main(int argc, char **argv) { const char *tmp = getenv("TMPDIR"); if (tmp) TMPDIR = tmp; if (argc < 2) return cgi_server(); if (argc < 3) return run_server(atoi(argv[1])); return run_client(argc, argv); } /******************************************************************************\ * * CGI Server * \******************************************************************************/ int cgi_server() { /* CGI-style: serve request from stdin to stdout */ return soap_serve(soap_new1(SOAP_ENC_MTOM)); /* Enable MTOM XOP attachments */ } #if !defined(_POSIX_THREADS) && !defined(_SC_THREADS) /******************************************************************************\ * * Stand-Alone Iterative Server * \******************************************************************************/ int run_server(int port) { struct soap soap; int ret; /* Enable MTOM */ #ifdef WITH_GZIP soap_init1(&soap, SOAP_ENC_MTOM | SOAP_ENC_ZLIB); /* Enable MTOM */ #else soap_init1(&soap, SOAP_ENC_MTOM); #endif /* Set the MIME callbacks */ soap.fmimereadopen = mime_read_open; soap.fmimereadclose = mime_read_close; soap.fmimeread = mime_read; soap.fmimewriteopen = mime_server_write_open; soap.fmimewriteclose = mime_server_write_close; soap.fmimewrite = mime_server_write; /* Bind socket */ if (!soap_valid_socket(soap_bind(&soap, NULL, port, 100))) soap_print_fault(&soap, stderr); else { fprintf(stderr, "Bind to port %d successful\n", port); /* Optional: let server time out after one hour */ soap.accept_timeout = 3600; /* Unix/Linux SIGPIPE, this is OS dependent: soap.accept_flags = SO_NOSIGPIPE; // some systems like this soap.socket_flags = MSG_NOSIGNAL; // others need this signal(SIGPIPE, sigpipe_handle); // or a sigpipe handler (more portable) */ /* Server loop */ for (;;) { int sock = soap_accept(&soap); if (!soap_valid_socket(sock)) { if (soap.errnum) soap_print_fault(&soap, stderr); else { fprintf(stderr, "Server timed out (see code how to change this)\n"); break; } } fprintf(stderr, "Accepting socket %d connection from IP %d.%d.%d.%d... ", sock, (int)(soap.ip>>24)&0xFF, (int)(soap.ip>>16)&0xFF, (int)(soap.ip>>8)&0xFF, (int)soap.ip&0xFF); if (soap_serve(&soap)) soap_print_fault(&soap, stderr); fprintf(stderr, "done\n"); soap_destroy(&soap); soap_end(&soap); } } ret = soap.error; soap_destroy(&soap); soap_end(&soap); soap_done(&soap); return ret; } #else /******************************************************************************\ * * Multi-Threaded Stand-Alone Server * \******************************************************************************/ void *process_request(void*); int run_server(int port) { struct soap soap; int i, ret; /* Enable MTOM */ #ifdef WITH_GZIP soap_init1(&soap, SOAP_ENC_MTOM | SOAP_ENC_ZLIB); /* Enable MTOM */ #else soap_init1(&soap, SOAP_ENC_MTOM); #endif /* Set the MIME callbacks */ soap.fmimereadopen = mime_read_open; soap.fmimereadclose = mime_read_close; soap.fmimeread = mime_read; soap.fmimewriteopen = mime_server_write_open; soap.fmimewriteclose = mime_server_write_close; soap.fmimewrite = mime_server_write; /* Bind socket */ if (!soap_valid_socket(soap_bind(&soap, NULL, port, 100))) soap_print_fault(&soap, stderr); else { fprintf(stderr, "Bind to port %d successful\n", port); /* Optional: let server time out after one hour */ soap.accept_timeout = 3600; /* Unix/Linux SIGPIPE, this is OS dependent: soap.accept_flags = SO_NOSIGPIPE; // some systems like this soap.socket_flags = MSG_NOSIGNAL; // others need this signal(SIGPIPE, sigpipe_handle); // or a sigpipe handler (more portable) */ /* Main thread spawns server threads */ for (i = 1; ; i++) { struct soap *tsoap; pthread_t tid; int sock = soap_accept(&soap); if (!soap_valid_socket(sock)) { if (soap.errnum) soap_print_fault(&soap, stderr); else { fprintf(stderr, "Server timed out (see code how to change this)\n"); break; } } fprintf(stderr, "Thread %d accepts socket %d connection from IP %d.%d.%d.%d\n", i, sock, (int)(soap.ip>>24)&0xFF, (int)(soap.ip>>16)&0xFF, (int)(soap.ip>>8)&0xFF, (int)soap.ip&0xFF); /* Copy soap environment and spawn thread */ tsoap = soap_copy(&soap); pthread_create(&tid, NULL, (void*(*)(void*))process_request, (void*)tsoap); } } ret = soap.error; soap_done(&soap); return ret; } void *process_request(void *soap) { pthread_detach(pthread_self()); /* Serve request (or multiple requests with keep-alive enabled) */ soap_serve((struct soap*)soap); /* Cleanup and delete deserialized data */ soap_destroy((struct soap*)soap); soap_end((struct soap*)soap); /* Detach thread's copy of soap environment */ soap_done((struct soap*)soap); /* Free soap environment */ free(soap); fprintf(stderr, "done\n"); return NULL; } #endif /******************************************************************************\ * * Client * \******************************************************************************/ int run_client(int argc, char **argv) { struct soap soap; int ret = 0; #ifdef WITH_GZIP soap_init1(&soap, SOAP_ENC_MTOM | SOAP_ENC_ZLIB); /* Enable MTOM */ #else soap_init1(&soap, SOAP_ENC_MTOM); /* Enable MTOM */ #endif /* Set the MIME callbacks */ soap.fmimereadopen = mime_read_open; soap.fmimereadclose = mime_read_close; soap.fmimeread = mime_read; soap.fmimewriteopen = mime_client_write_open; soap.fmimewriteclose = mime_client_write_close; soap.fmimewrite = mime_client_write; /* Connect timeout value (sec) (not supported by Linux) */ soap.connect_timeout = 10; /* IO timeouts (sec) */ soap.send_timeout = 30; soap.recv_timeout = 30; /* Unix/Linux SIGPIPE, this is OS dependent: soap.accept_flags = SO_NOSIGPIPE; // some systems like this soap.socket_flags = MSG_NOSIGNAL; // others need this signal(SIGPIPE, sigpipe_handle); // or a sigpipe handler (more portable) */ switch (argv[1][1]) { case 'p': ret = client_putData(&soap, argc, argv); break; case 'g': ret = client_getData(&soap, argc, argv); break; default: fprintf(stderr, "Usage: mtom-stream-test -p file1 file2 file3 ...\n"); fprintf(stderr, " mtom-stream-test -g key1 key2 key3 ...\n"); } soap_destroy(&soap); soap_end(&soap); soap_done(&soap); return ret; } int open_data(struct soap *soap, const char *file, struct x__Data *data) { struct stat sb; FILE *fd = NULL; int size; soap_default_x__Data(soap, data); fd = fopen(file, "rb"); if (!fd) { fprintf(stderr, "Cannot open file %s\n", file); return soap->error = SOAP_EOF; } /* The handle for the streaming MIME callback is the open file fd */ data->xop__Include.__ptr = (unsigned char*)fd; if (!fstat(fileno(fd), &sb) && sb.st_size > 0) size = sb.st_size; else { /* File size is unknown, so must use HTTP chunking and set size = 0 */ soap_set_omode(soap, SOAP_IO_CHUNK); size = 0; } data->xop__Include.__size = size; data->xmime5__contentType = file_type(file); data->xop__Include.id = NULL; data->xop__Include.type = data->xmime5__contentType; data->xop__Include.options = NULL; return SOAP_OK; } int client_putData(struct soap *soap, int argc, char **argv) { int i; struct x__DataSet data; struct m__PutDataResponse response; data.__size = argc - 2; data.item = soap_malloc(soap, (argc - 2)*sizeof(struct x__Data)); for (i = 2; i < argc; i++) open_data(soap, argv[i], &data.item[i - 2]); if (soap_call_m__PutData(soap, endpoint, NULL, &data, &response)) soap_print_fault(soap, stderr); else { printf("Data stored with keys:\n"); for (i = 0; i < response.x__keys.__size; i++) printf("\t%s\n", response.x__keys.key[i]); printf("Use these keys to retrieve the data with -g key1 key2 ...\n"); } return soap->error; } int client_getData(struct soap *soap, int argc, char **argv) { int i; struct x__Keys keys; struct m__GetDataResponse response; keys.__size = argc - 2; keys.key = soap_malloc(soap, (argc - 2)*sizeof(char*)); for (i = 2; i < argc; i++) keys.key[i - 2] = argv[i]; /* Pass this information to the callbacks using the soap->user variable */ soap->user = (void*)keys.key; if (soap_call_m__GetData(soap, endpoint, NULL, &keys, &response)) soap_print_fault(soap, stderr); else printf("Data retrieved\n"); return soap->error; } /******************************************************************************\ * * Server Operations * \******************************************************************************/ int m__PutData(struct soap *soap, struct x__DataSet *data, struct m__PutDataResponse *response) { int i; /* This operation is called AFTER the streaming MIME attachment callbacks handled the data. gSOAP switches to SOAP_IO_STORE when SOAP_IO_CHUNK (HTTP chunking) is not supported by the client. Since it is undesirable to use SOAP_IO_STORE to buffer the entire message, we reset it to the default SOAP_IO_BUFFER for socket connections. */ if ((soap->omode & SOAP_IO) == SOAP_IO_STORE) soap->omode = (soap->omode & ~SOAP_IO) | SOAP_IO_BUFFER; if (!data) return soap_sender_fault(soap, "No data", NULL); /* Set up array of keys to return a key for each data item saved */ response->x__keys.__size = data->__size; response->x__keys.key = soap_malloc(soap, data->__size*sizeof(char**)); /* Each key is stored in the mime_server_handle object, set by the callbacks and accessible through the data __ptr, where .type must be set as this indicates the presence of an attachment with a type */ for (i = 0; i < data->__size; i++) { if (data->item[i].xop__Include.__ptr && data->item[i].xop__Include.type) { const char *key = ((struct mime_server_handle*)(data->item[i].xop__Include.__ptr))->key; const char *s; if (!key) return soap_sender_fault(soap, "Missing name", NULL); s = strrchr(key, '/'); if (!s) s = strrchr(key, '\\'); if (!s) s = key; else s++; response->x__keys.key[i] = soap_strdup(soap, s); } else response->x__keys.key[i] = "-"; } return SOAP_OK; } int m__GetData(struct soap *soap, struct x__Keys *keys, struct m__GetDataResponse *response) { int i; char *file = soap_malloc(soap, strlen(TMPDIR) + 80); if ((soap->omode & SOAP_IO) == SOAP_IO_STORE) soap->omode = (soap->omode & ~SOAP_IO) | SOAP_IO_BUFFER; if (!keys) return soap_sender_fault(soap, "No keys", NULL); /* Set up array of attachments to return */ response->x__data.__size = keys->__size; response->x__data.item = soap_malloc(soap, keys->__size*sizeof(struct x__Data)); for (i = 0; i < keys->__size; ++i) { strcpy(file, TMPDIR); strcat(file, "/"); if (strncmp(keys->key[i], "data", 4)) strcat(file, "data"); strcat(file, keys->key[i]); open_data(soap, file, &response->x__data.item[i]); } return SOAP_OK; } /******************************************************************************\ * * Streaming MIME Callbacks * \******************************************************************************/ void *mime_read_open(struct soap *soap, void *handle, const char *id, const char *type, const char *description) { FILE *fd = (FILE*)handle; /* we should return NULL without setting soap->error if we don't want to use the streaming callback for this MIME attachment. The handle contains the non-NULL __ptr field value of xop__Include which should have been set in the application. The return value of this function will be passed on to the fmimeread and fmimereadclose callbacks. The return value will not affect the value of the __ptr field. */ fprintf(stderr, "Opening streaming outbound MIME channel for id=%s type=%s\n", id, type); return (void*)fd; } size_t mime_read(struct soap *soap, void *handle, char *buf, size_t len) { return fread(buf, 1, len, (FILE*)handle); } void mime_read_close(struct soap *soap, void *handle) { fprintf(stderr, "Closing streaming outbound MIME channel\n"); fclose((FILE*)handle); } /******************************************************************************\ * * Server-Side Streaming MIME Callbacks * \******************************************************************************/ void *mime_server_write_open(struct soap *soap, void *unused_handle, const char *id, const char *type, const char *description, enum soap_mime_encoding encoding) { /* Note: the 'unused_handle' is always NULL */ /* Return NULL without setting soap->error if we don't want to use the streaming callback for this DIME attachment */ const char *file; struct mime_server_handle *handle = soap_malloc(soap, sizeof(struct mime_server_handle)); if (!handle) { soap->error = SOAP_EOM; return NULL; } /* Create a new file */ file = tempnam(TMPDIR, "data"); /* The file name is also the key */ handle->key = soap_strdup(soap, file); handle->fd = fopen(file, "wb"); free((void*)file); if (!handle->fd) { soap->error = soap_sender_fault(soap, "Cannot save data to file", handle->key); soap->errnum = errno; /* get reason */ return NULL; } fprintf(stderr, "Saving file %s type %s\n", handle->key, type?type:""); return (void*)handle; } void mime_server_write_close(struct soap *soap, void *handle) { fclose(((struct mime_server_handle*)handle)->fd); } int mime_server_write(struct soap *soap, void *handle, const char *buf, size_t len) { FILE *fd = ((struct mime_server_handle*)handle)->fd; while (len) { size_t nwritten = fwrite(buf, 1, len, fd); if (!nwritten) { soap->errnum = errno; return SOAP_EOF; } len -= nwritten; buf += nwritten; } return SOAP_OK; } /******************************************************************************\ * * Client-Side Streaming MIME Callbacks * \******************************************************************************/ void *mime_client_write_open(struct soap *soap, void *unused_handle, const char *id, const char *type, const char *description, enum soap_mime_encoding encoding) { /* Note: the 'unused_handle' is always NULL */ FILE *fd; const char *file; fprintf(stderr, "Opening streaming inbound MIME channel for id=%s type=%s\n", id, type); /* soap->user points to array of keys (strings) that are file names */ file = *(char**)soap->user; soap->user = (void*)(((char**)soap->user)+1); fd = fopen(file, "wb"); if (!fd) soap->error = soap_receiver_fault(soap, "Cannot save data to file", file); return (void*)fd; } void mime_client_write_close(struct soap *soap, void *handle) { fprintf(stderr, "Closing streaming inbound MIME channel\n"); fclose((FILE*)handle); } int mime_client_write(struct soap *soap, void *handle, const char *buf, size_t len) { FILE *fd = (FILE*)handle; while (len) { size_t nwritten = fwrite(buf, 1, len, fd); if (!nwritten) { soap->errnum = errno; return SOAP_EOF; } len -= nwritten; buf += nwritten; } return SOAP_OK; } /******************************************************************************\ * * Misc * \******************************************************************************/ char *file_type(const char *file) { int n = strlen(file); if (n > 4 && (!strcmp(file + n - 4, ".xml") || !strcmp(file + n - 4, ".xsd") || !strcmp(file + n - 5, ".wsdl"))) return "text/xml"; if (n > 4 && !strcmp(file + n - 4, ".jpg")) return "image/jpg"; return "*/*"; } gsoap-2.8.28/gsoap/samples/link++/0000755000175000017500000000000012654077574016145 5ustar ellertellertgsoap-2.8.28/gsoap/samples/link++/gmt.h0000644000175000017500000000002112653650156017066 0ustar ellertellertt__gmt(time_t*); gsoap-2.8.28/gsoap/samples/link++/env.h0000644000175000017500000000156012653650156017100 0ustar ellertellert/* env.h Defines SOAP-ENV Header and Fault global structures shared by client and service modules to process SOAP headers and faults when combining multiple client and/or services into one executable. Defines SOAP Fault and SOAP Header structures, which will be shared by client and service modules. The Header structure should contain all fields required by the clients and services. To obtain these, look into the wsdl2h-generated .h files for struct SOAP_ENV__Header and struct SOAP_ENV__Detail. Copy these below to make them globally visible to the gSOAP engine and plugins. Copyright (C) 2000-2003 Robert A. van Engelen, Genivia inc. All Rights Reserved. Compile: soapcpp2 -penv env.h c++ -c envC.cpp c++ -DWITH_NONAMESPACES -c stdsoap2.cpp */ #import "header.h" // optional user-defined headers #import "fault.h" // optional user-defined fault details gsoap-2.8.28/gsoap/samples/link++/Makefile0000644000175000017500000000310712653650156017576 0ustar ellertellert# Simple Makefile for C++ example with muliple client proxy linkage WSDL2H=../../wsdl/wsdl2h GSOAP=../../src/soapcpp2 -I../.. SOAPH=../../stdsoap2.h SOAPC=../../stdsoap2.c SOAPCPP=../../stdsoap2.cpp SOAPDOMC=../../dom.c SOAPDOMCPP=../../dom.cpp CC=gcc CPP=g++ LIBS= COFLAGS=-O2 CWFLAGS=-Wall CIFLAGS=-I. -I.. -I../.. CMFLAGS= CFLAGS= $(CWFLAGS) $(COFLAGS) $(CIFLAGS) $(CMFLAGS) all: xmas xmas: xmas.cpp envC.o stdsoap2.o gmtProxy.o calccalcProxy.o xmasmashupService.o $(CPP) $(CFLAGS) -o xmas xmas.cpp envC.o stdsoap2.o gmtProxy.o calccalcProxy.o xmasmashupService.o gmtC.cpp calcC.cpp xmasC.cpp stdsoap2.o: $(SOAPH) $(SOAPC) $(CPP) $(CFLAGS) -DWITH_NONAMESPACES -c ../../stdsoap2.cpp envC.o: env.h header.h fault.h $(GSOAP) -CS -penv env.h $(CPP) $(CFLAGS) -c envC.cpp gmtProxy.cpp: gmt.h $(GSOAP) -i -w -C -qgmt gmt.h gmtProxy.o: gmtProxy.cpp $(CPP) $(CFLAGS) -c gmtProxy.cpp calccalcProxy.cpp: calc.h $(GSOAP) -i -w -C -qcalc calc.h cp calcH.h soapH.h calccalcProxy.o: calccalcProxy.cpp $(CPP) $(CFLAGS) -c calccalcProxy.cpp xmasmashupService.cpp: xmas.hpp $(GSOAP) -i -S -qxmas xmas.hpp xmasmashupService.o: xmasmashupService.cpp $(CPP) $(CFLAGS) -c xmasmashupService.cpp xmas.hpp: xmas.wsdl $(WSDL2H) -s -o xmas.hpp xmas.wsdl .PHONY: clean distclean clean: rm -f *.o *H.h *Stub.h *C.cpp *Client.cpp *Server.cpp *ClientLib.cpp *ServerLib.cpp *Proxy.h *Proxy.cpp *Service.h *Service.cpp distclean: rm -f *.o *H.h *Stub.h *C.cpp *Client.cpp *Server.cpp *ClientLib.cpp *ServerLib.cpp *Proxy.h *Proxy.cpp *Service.h *Service.cpp rm -f *.xsd *.xml *.nsmap *.log rm -f xmas gsoap-2.8.28/gsoap/samples/link++/xmas.wsdl0000444000175000017500000000426612653650156020006 0ustar ellertellert gsoap-2.8.28/gsoap/samples/link++/gmt_time_t.h0000644000175000017500000000002112653650156020427 0ustar ellertellertt__gmt(time_t*); gsoap-2.8.28/gsoap/samples/link++/README.txt0000644000175000017500000000443412653650156017640 0ustar ellertellert How to combine multiple clients and servers into one executable? 1. Run wsdl2h once on all WSDLs together. The wsdl2h tool can import multiple WSDL files at once to combine multiple clients and service into one executable. See the samples/mashup and samples/mashup++ examples. 2. Run wsdl2h on each WSDL and use soapcpp2 compiler options. If there is a need to build clients and services from multiple gSOAP header files, then an alternative approach is required demonstrated by the material included in this part of the gSOAP package. The advantages of #1 is that you end up with smaller code, because redundant definitions are eliminated. The advantage of #2 is a more modular setup, thus supporting dynamic linking of separately compiled service modules. However, the build process requires additional steps depending on C or C++. The C++ project build process is simpler, because C++ namespaces can be used to separate the definitions as is shown in the samples/link++ example. The C++ examples in this directory illustrate how multiple clients and services can be compiled and linked into one executable from multiple gSOAP header files. The C++ examples accomplish this by using C++ namespaces (soapcpp2 option -q) to separate the service definitions and type serializers. When linking multiple soapcpp2-generated files, a single file with shared SOAP Header definitions is required. This means that all SOAP Header members must be collected into a single SOAP Header definition. Similar requirements are needed for SOAP Faults (the SOAP_ENV__Detail struct with details to be more precise). So the first step is to generate header and fault handlers: $ soapcpp2 -CS -penv env.h Multiple SOAP_ENV__Header structs can be defined in env.h moved there from the client and service gSOAP header files. All SOAP_ENV__Header members will be combined into a single struct by soapcpp2. Also the struct SOAP_ENV__Detail can be defined this way. Its definition is shared among the clients and services. Then each file.h is compiled with: $ soapcp2 -i -q .h where is a name for a C++ namespace. The -i option generates proxies and server objects, which are declared in this namespace. Compile the xyzProxy.cpp or xyzServer.cpp code and the C.cpp serializers, and envC.cpp. gsoap-2.8.28/gsoap/samples/link++/header.h0000644000175000017500000000120412653650156017533 0ustar ellertellert/* header.h Example SOAP Header definitions, to demonstrate the use of env.h. This file defines the SOAP Header data structure shared by client and service modules Copyright (C) 2000-2002 Robert A. van Engelen. All Rights Reserved. */ //gsoap h schema namespace: http://websrv.cs.fsu.edu/~engelen/h.xsd // h:authentication type of SOAP Header element struct h__authentication { @char *userid; // userid XML attribute @char *passwd; // passwd XML attribute }; // add the above to the SOAP Header elements: struct SOAP_ENV__Header { struct h__authentication *h__credentials; // rendered as XML }; gsoap-2.8.28/gsoap/samples/link++/xmas.cpp0000644000175000017500000000604112653650156017612 0ustar ellertellert/* xmas.cpp Example CGI service with multiple C++ proxy linkage To generate non-client-server header and fault handlers: $ soapcpp2 -CS -penv env.h The gmt client proxy in 'gmt' C++ namespace: $ soapcpp2 -i -C -qgmt gmt.h The calc client proxy in 'calc' C++ namespace: $ soapcpp2 -i -C -qcalc calc.h The xmas service in 'xmas' C++ namespace: $ soapcpp2 -i -S -qxmas xmas.hpp cc -o xmas.cgi xmas.cpp stdsoap2.cpp envC.cpp gmtProxy.cpp calccalcProxy.cpp xmasmashupService.cpp gmtC.cpp calcC.cpp xmasC.cpp -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "envH.h" #include "gmtProxy.h" #include "calccalcProxy.h" #include "xmasmashupService.h" int main() { xmas::mashupService service; return service.serve(); } /******************************************************************************\ * * Server operation * \******************************************************************************/ int xmas::mashupService::dtx(_XML x, struct _ns2__commingtotown *response) { gmt::Proxy Time("http://www.cs.fsu.edu/~engelen/gmtlitserver.cgi"); time_t now; if (Time.gmt(&now)) return soap_receiverfault("Cannot connect to GMT server", NULL); struct tm tm; tm.tm_sec = 0; tm.tm_min = 0; tm.tm_hour = 0; tm.tm_mday = 25; tm.tm_mon = 11; tm.tm_year = gmtime(&now)->tm_year; /* this year */ tm.tm_isdst = 0; tm.tm_zone = NULL; time_t xmas = soap_timegm(&tm); if (xmas < now) { tm.tm_year++; /* xmas just passed, go to next year */ xmas = soap_timegm(&tm); } double sec = difftime(xmas, now); calc::calcProxy Calc; double days; if (Calc.div(sec, 86400.0, &days)) return soap_receiverfault("Cannot connect to calc server", NULL); response->days = (int)days; return SOAP_OK; } gsoap-2.8.28/gsoap/samples/link++/xmas.hpp0000644000175000017500000001575612653650156017634 0ustar ellertellert// Reminder: Modify typemap.dat to customize the header file generated by wsdl2h /* xmas.hpp Generated by wsdl2h 1.2.9l from xmas.wsdl and typemap.dat 2007-12-31 01:37:25 GMT Copyright (C) 2001-2007 Robert van Engelen, Genivia Inc. All Rights Reserved. This part of the software is released under one of the following licenses: GPL or Genivia's license for commercial use. */ /* NOTE: - Compile this file with soapcpp2 to complete the code generation process. - Use soapcpp2 option -I to specify paths for #import To build with STL, 'stlvector.h' is imported from 'import' dir in package. - Use wsdl2h options -c and -s to generate pure C code or C++ code without STL. - Use 'typemap.dat' to control schema namespace bindings and type mappings. It is strongly recommended to customize the names of the namespace prefixes generated by wsdl2h. To do so, modify the prefix bindings in the Namespaces section below and add the modified lines to 'typemap.dat' to rerun wsdl2h. - Use Doxygen (www.doxygen.org) to browse this file. - Use wsdl2h option -l to view the software license terms. DO NOT include this file directly into your project. Include only the soapcpp2-generated headers and source code files. */ //gsoapopt w /******************************************************************************\ * * * http://www.genivia.com/mashup.wsdl * * * \******************************************************************************/ /******************************************************************************\ * * * Import * * * \******************************************************************************/ /******************************************************************************\ * * * Schema Namespaces * * * \******************************************************************************/ /* NOTE: It is strongly recommended to customize the names of the namespace prefixes generated by wsdl2h. To do so, modify the prefix bindings below and add the modified lines to typemap.dat to rerun wsdl2h: ns1 = "http://www.genivia.com/mashup.wsdl" ns2 = "urn:daystoxmas" */ //gsoap ns2 schema namespace: urn:daystoxmas //gsoap ns2 schema form: qualified /******************************************************************************\ * * * Schema Types * * * \******************************************************************************/ /// Element "urn:daystoxmas":daystoxmas. /// Note: use wsdl2h option -g to generate this global element declaration. // Forward declaration of class _ns2__commingtotown. class _ns2__commingtotown; /// Element "urn:daystoxmas":commingtotown of complexType. /// "urn:daystoxmas":commingtotown is a complexType. class _ns2__commingtotown { public: /// Element days of type xs:int. int days 1; ///< Required element. /// A handle to the soap struct that manages this instance (automatically set) struct soap *soap ; }; /******************************************************************************\ * * * Services * * * \******************************************************************************/ //gsoap ns1 service name: mashup //gsoap ns1 service type: PortType //gsoap ns1 service port: http://www.cs.fsu.edu/~engelen/mashup.cgi //gsoap ns1 service namespace: http://www.genivia.com/mashup.wsdl //gsoap ns1 service transport: http://schemas.xmlsoap.org/soap/http /** @mainpage Service Definitions @section Service_bindings Bindings - @ref mashup */ /** @page mashup Binding "mashup" @section mashup_operations Operations of Binding "mashup" - @ref __ns1__dtx @section mashup_ports Endpoints of Binding "mashup" - http://www.cs.fsu.edu/~engelen/mashup.cgi Note: use wsdl2h option -N to change the service binding prefix name */ /******************************************************************************\ * * * mashup * * * \******************************************************************************/ /******************************************************************************\ * * * __ns1__dtx * * * \******************************************************************************/ /// Operation "__ns1__dtx" of service binding "mashup" /** Operation details: - SOAP document/literal style C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___ns1__dtx( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: _XML ns2__daystoxmas, // response parameters: _ns2__commingtotown* ns2__commingtotown ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __ns1__dtx( struct soap *soap, // request parameters: _XML ns2__daystoxmas, // response parameters: _ns2__commingtotown* ns2__commingtotown ); @endcode C++ proxy class (defined in soapmashupProxy.h): class mashup; Note: use soapcpp2 option '-i' to generate improved proxy and service classes; */ //gsoap ns1 service method-style: dtx document //gsoap ns1 service method-encoding: dtx literal //gsoap ns1 service method-action: dtx "" int __ns1__dtx( _XML ns2__daystoxmas, ///< Request parameter _ns2__commingtotown* ns2__commingtotown ///< Response parameter ); /* End of xmas.hpp */ gsoap-2.8.28/gsoap/samples/link++/calc.h0000644000175000017500000001041012653650156017204 0ustar ellertellert/* calc.h This is a gSOAP header file with web service definitions. The service operations and type definitions use familiar C/C++ syntax. The following methods are defined by this gSOAP service definition: add(a,b) sub(a,b) mul(a,b) div(a,b) pow(a,b) Compilation in C (see samples/calc): $ soapcpp2 -c calc.h $ cc -o calcclient calcclient.c stdsoap2.c soapC.c soapClient.c $ cc -o calcserver calcserver.c stdsoap2.c soapC.c soapServer.c Compilation in C++ (see samples/calc++): $ soapcpp2 -i calc.h $ cc -o calcclient++ calcclient.cpp stdsoap2.cpp soapC.cpp soapcalcProxy.cpp $ cc -o calcserver++ calcserver.cpp stdsoap2.cpp soapC.cpp soapcalcService.cpp Note that soapcpp2 option -i generates proxy and service classes, which encapsulate the method operations in the class instead of defining them as global functions as in C. The //gsoap directives are used to bind XML namespaces and to define Web service properties: //gsoap service name: //gsoap service style: [rpc|document] //gsoap service encoding: [literal|encoded] //gsoap service namespace: //gsoap service location: Web service operation properties: //gsoap service method-style: [rpc|document] //gsoap service method-encoding: [literal|encoded] //gsoap service method-action: //gsoap service method-documentation: and type schema properties: //gsoap schema namespace: //gsoap schema elementForm: [qualified|unqualified] //gsoap schema attributeForm: [qualified|unqualified] //gsoap schema documentation: //gsoap schema type-documentation: where is an XML namespace prefix, which is used in C/C++ operation names, e.g. ns__add(), and type names, e.g. xsd__int. See the documentation for the full list of //gsoap directives. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap ns service name: calc Simple calculator service //gsoap ns service protocol: SOAP //gsoap ns service style: rpc //gsoap ns service encoding: encoded //gsoap ns service namespace: http://websrv.cs.fsu.edu/~engelen/calc.wsdl //gsoap ns service location: http://websrv.cs.fsu.edu/~engelen/calcserver.cgi //gsoap ns schema namespace: urn:calc //gsoap ns service method-documentation: add Sums two values int ns__add(double a, double b, double *result); //gsoap ns service method-documentation: sub Subtracts two values int ns__sub(double a, double b, double *result); //gsoap ns service method-documentation: mul Multiplies two values int ns__mul(double a, double b, double *result); //gsoap ns service method-documentation: div Divides two values int ns__div(double a, double b, double *result); //gsoap ns service method-documentation: pow Raises a to b int ns__pow(double a, double b, double *result); gsoap-2.8.28/gsoap/samples/link++/fault.h0000644000175000017500000000234612653650156017426 0ustar ellertellert/* fault.h Example SOAP Fault detail definitions, to demonstrate the use of env.h. Defines optional SOAP Fault derail data structures Copyright (C) 2000-2004 Robert A. van Engelen. All Rights Reserved. */ /* Add any data structure you want to serialize as part of the SOAP Fault detail element. The detail element '__type' and 'value' fields should be set to transmit data. The fields are set when data of corresponding types are received. For example, we define an of name with a string vector (note the leading _ in the following declaration): class _f__myData { public: std::vector *data; }; To return a fault from your service application: soap_sender_fault(soap, "An error occurred", NULL)); // set soap fault soap->fault->detail = (struct SOAP_ENV__Detail*)soap_malloc(soap, sizeof(struct SOAP_ENV__Detail)); soap->fault->detail->__type = SOAP_TYPE__f__myData; soap->fault->detail->value = soap_new__f__myData(soap, -1); return SOAP_FAULT; In addition, you can modify the SOAP_ENV__Detail struct and add your own set of fields, as in: struct SOAP_ENV__Detail { struct f__myDataType f__myData; int __type; void *value; char *__any; // or use '_XML __any' to store literal XML content }; */ gsoap-2.8.28/gsoap/samples/wcf/0000755000175000017500000000000012653650156015631 5ustar ellertellertgsoap-2.8.28/gsoap/samples/wcf/WS/0000755000175000017500000000000012653650156016162 5ustar ellertellertgsoap-2.8.28/gsoap/samples/wcf/WS/DualHttp/0000755000175000017500000000000012653650156017707 5ustar ellertellertgsoap-2.8.28/gsoap/samples/wcf/WS/DualHttp/netrm.xsd0000644000175000017500000000223512653650156021556 0ustar ellertellert gsoap-2.8.28/gsoap/samples/wcf/WS/DualHttp/calculator.h0000644000175000017500000011726512653650156022225 0ustar ellertellert/* calculator.h Generated by wsdl2h 2.8.9 from calculator.wsdl and typemap.dat 2012-08-18 17:13:16 GMT DO NOT INCLUDE THIS FILE DIRECTLY INTO YOUR PROJECT BUILDS USE THE soapcpp2-GENERATED SOURCE CODE FILES FOR YOUR PROJECT BUILDS gSOAP XML Web services tools. Copyright (C) 2001-2012 Robert van Engelen, Genivia Inc. All Rights Reserved. Part of this software is released under one of the following licenses: GPL or Genivia's license for commercial use. */ /** @page page_notes Usage Notes NOTE: - Run soapcpp2 on calculator.h to generate the SOAP/XML processing logic. Use soapcpp2 option -I to specify paths for #import To build with STL, 'stlvector.h' is imported from 'import' dir in package. Use soapcpp2 option -i to generate improved proxy and server classes. - Use wsdl2h options -c and -s to generate pure C code or C++ code without STL. - Use 'typemap.dat' to control namespace bindings and type mappings. It is strongly recommended to customize the names of the namespace prefixes generated by wsdl2h. To do so, modify the prefix bindings in the Namespaces section below and add the modified lines to 'typemap.dat' to rerun wsdl2h. - Use Doxygen (www.doxygen.org) on this file to generate documentation. - Use wsdl2h options -nname and -Nname to globally rename the prefix 'ns'. - Use wsdl2h option -d to enable DOM support for xsd:anyType. - Use wsdl2h option -g to auto-generate readers and writers for root elements. - Struct/class members serialized as XML attributes are annotated with a '@'. - Struct/class members that have a special role are annotated with a '$'. WARNING: DO NOT INCLUDE THIS FILE DIRECTLY INTO YOUR PROJECT BUILDS. USE THE SOURCE CODE FILES GENERATED BY soapcpp2 FOR YOUR PROJECT BUILDS: THE soapStub.h FILE CONTAINS THIS CONTENT WITHOUT ANNOTATIONS. LICENSE: @verbatim -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2012, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following two licenses: 1) GPL or 2) Genivia's license for commercial use. -------------------------------------------------------------------------------- 1) GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- 2) A commercial-use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- @endverbatim */ //gsoapopt w /******************************************************************************\ * * * Definitions * * http://tempuri.org/ * * * \******************************************************************************/ /******************************************************************************\ * * * Import * * * \******************************************************************************/ // STL vector containers (use option -s to remove STL dependency) #import "stlvector.h" /******************************************************************************\ * * * Schema Namespaces * * * \******************************************************************************/ // This service supports SOAP 1.2 namespaces: #import "soap12.h" /* NOTE: It is strongly recommended to customize the names of the namespace prefixes generated by wsdl2h. To do so, modify the prefix bindings below and add the modified lines to typemap.dat to rerun wsdl2h: tempuri = "http://tempuri.org/" mssadhi = "http://Microsoft.Samples.DualHttp/Imports" mssadh = "http://Microsoft.Samples.DualHttp" */ #define SOAP_NAMESPACE_OF_mssadhi "http://Microsoft.Samples.DualHttp/Imports" //gsoap mssadhi schema namespace: http://Microsoft.Samples.DualHttp/Imports //gsoap mssadhi schema form: unqualified #define SOAP_NAMESPACE_OF_mssadh "http://Microsoft.Samples.DualHttp" //gsoap mssadh schema namespace: http://Microsoft.Samples.DualHttp //gsoap mssadh schema elementForm: qualified //gsoap mssadh schema attributeForm: unqualified /******************************************************************************\ * * * Built-in Schema Types and Top-Level Elements and Attributes * * * \******************************************************************************/ /******************************************************************************\ * * * Forward Declarations * * * \******************************************************************************/ // Forward declaration of class _mssadh__Clear. class _mssadh__Clear; // Forward declaration of class _mssadh__AddTo. class _mssadh__AddTo; // Forward declaration of class _mssadh__SubtractFrom. class _mssadh__SubtractFrom; // Forward declaration of class _mssadh__MultiplyBy. class _mssadh__MultiplyBy; // Forward declaration of class _mssadh__DivideBy. class _mssadh__DivideBy; // Forward declaration of class _mssadh__Result. class _mssadh__Result; // Forward declaration of class _mssadh__Equation. class _mssadh__Equation; /******************************************************************************\ * * * Schema Types and Top-Level Elements and Attributes * * http://Microsoft.Samples.DualHttp/Imports * * * \******************************************************************************/ /******************************************************************************\ * * * Schema Types and Top-Level Elements and Attributes * * http://Microsoft.Samples.DualHttp * * * \******************************************************************************/ /******************************************************************************\ * * * Schema Complex Types and Top-Level Elements * * http://Microsoft.Samples.DualHttp/Imports * * * \******************************************************************************/ /******************************************************************************\ * * * Schema Complex Types and Top-Level Elements * * http://Microsoft.Samples.DualHttp * * * \******************************************************************************/ /// Top-level root element "http://Microsoft.Samples.DualHttp":Clear /// "http://Microsoft.Samples.DualHttp":Clear is a complexType. class _mssadh__Clear { public: /// A handle to the soap struct that manages this instance (automatically set) struct soap *soap ; }; /// Top-level root element "http://Microsoft.Samples.DualHttp":AddTo /// "http://Microsoft.Samples.DualHttp":AddTo is a complexType. class _mssadh__AddTo { public: /// Element n of type xs:double. double* n 0; ///< Optional element. /// A handle to the soap struct that manages this instance (automatically set) struct soap *soap ; }; /// Top-level root element "http://Microsoft.Samples.DualHttp":SubtractFrom /// "http://Microsoft.Samples.DualHttp":SubtractFrom is a complexType. class _mssadh__SubtractFrom { public: /// Element n of type xs:double. double* n 0; ///< Optional element. /// A handle to the soap struct that manages this instance (automatically set) struct soap *soap ; }; /// Top-level root element "http://Microsoft.Samples.DualHttp":MultiplyBy /// "http://Microsoft.Samples.DualHttp":MultiplyBy is a complexType. class _mssadh__MultiplyBy { public: /// Element n of type xs:double. double* n 0; ///< Optional element. /// A handle to the soap struct that manages this instance (automatically set) struct soap *soap ; }; /// Top-level root element "http://Microsoft.Samples.DualHttp":DivideBy /// "http://Microsoft.Samples.DualHttp":DivideBy is a complexType. class _mssadh__DivideBy { public: /// Element n of type xs:double. double* n 0; ///< Optional element. /// A handle to the soap struct that manages this instance (automatically set) struct soap *soap ; }; /// Top-level root element "http://Microsoft.Samples.DualHttp":Result /// "http://Microsoft.Samples.DualHttp":Result is a complexType. class _mssadh__Result { public: /// Element result of type xs:double. double* result 0; ///< Optional element. /// A handle to the soap struct that manages this instance (automatically set) struct soap *soap ; }; /// Top-level root element "http://Microsoft.Samples.DualHttp":Equation /// "http://Microsoft.Samples.DualHttp":Equation is a complexType. class _mssadh__Equation { public: /// Element eqn of type xs:string. std::string* eqn 0; ///< Nullable pointer. /// A handle to the soap struct that manages this instance (automatically set) struct soap *soap ; }; /******************************************************************************\ * * * Additional Top-Level Elements * * http://Microsoft.Samples.DualHttp/Imports * * * \******************************************************************************/ /******************************************************************************\ * * * Additional Top-Level Attributes * * http://Microsoft.Samples.DualHttp/Imports * * * \******************************************************************************/ /******************************************************************************\ * * * Additional Top-Level Elements * * http://Microsoft.Samples.DualHttp * * * \******************************************************************************/ /******************************************************************************\ * * * Additional Top-Level Attributes * * http://Microsoft.Samples.DualHttp * * * \******************************************************************************/ /******************************************************************************\ * * * Services * * * \******************************************************************************/ //gsoap tempuri service name: WSDualHttpBinding_USCOREICalculatorDuplex //gsoap tempuri service type: ICalculatorDuplex //gsoap tempuri service port: http://192.168.2.2:8000/ServiceModelSamples/service //gsoap tempuri service namespace: http://tempuri.org/ //gsoap tempuri service transport: http://schemas.xmlsoap.org/soap/http /** @mainpage CalculatorService Definitions @section CalculatorService_bindings Service Bindings - @ref WSDualHttpBinding_USCOREICalculatorDuplex @section CalculatorService_more More Information - @ref page_notes "Usage Notes" - @ref page_XMLDataBinding "XML Data Binding" - @ref SOAP_ENV__Header "SOAP Header Content" (when applicable) - @ref SOAP_ENV__Detail "SOAP Fault Detail Content" (when applicable) */ /** @page WSDualHttpBinding_USCOREICalculatorDuplex Binding "WSDualHttpBinding_USCOREICalculatorDuplex" @section WSDualHttpBinding_USCOREICalculatorDuplex_operations Operations of Binding "WSDualHttpBinding_USCOREICalculatorDuplex" - @ref __tempuri__Clear - @ref __tempuri__AddTo - @ref __tempuri__SubtractFrom - @ref __tempuri__MultiplyBy - @ref __tempuri__DivideBy - @ref __tempuri__Result - @ref __tempuri__Equation @section WSDualHttpBinding_USCOREICalculatorDuplex_ports Endpoints of Binding "WSDualHttpBinding_USCOREICalculatorDuplex" - http://192.168.2.2:8000/ServiceModelSamples/service @section WSDualHttpBinding_USCOREICalculatorDuplex_policy Policy of Binding "WSDualHttpBinding_USCOREICalculatorDuplex" See Section @ref WSDualHttpBinding_USCOREICalculatorDuplex_policy_enablers - WS-Policy applicable to the service endpoint ports: - Exactly one of the following: - All of the following: - WS-Addressing is used - WS-ReliableMessaging is used - Inactivity Timeout = 600000 (ms) - Acknowledgement Interval = 200 (ms) - Other policy requirements: @verbatim @endverbatim - Other policy requirements: @verbatim @endverbatim Note: use wsdl2h option -N to change the service binding prefix name */ /******************************************************************************\ * * * Service Binding * * WSDualHttpBinding_USCOREICalculatorDuplex * * * \******************************************************************************/ /******************************************************************************\ * * * Service Operation * * __tempuri__Clear * * * \******************************************************************************/ /// Operation "__tempuri__Clear" of service binding "WSDualHttpBinding_USCOREICalculatorDuplex" /** Operation details: - One-way service input message request - SOAP document/literal style messaging - SOAP action: "http://Microsoft.Samples.DualHttp/ICalculatorDuplex/Clear" - Addressing method action: "http://tempuri.org//ICalculatorDuplex/Clear" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_send___tempuri__Clear( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: _mssadh__Clear* mssadh__Clear, ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __tempuri__Clear( struct soap *soap, // request parameters: _mssadh__Clear* mssadh__Clear, // response parameters: ); @endcode C++ proxy class (defined in soapWSDualHttpBinding_USCOREICalculatorDuplexProxy.h): @code class WSDualHttpBinding_USCOREICalculatorDuplexProxy; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate greatly improved and easy-to-use proxy classes; C++ service class (defined in soapWSDualHttpBinding_USCOREICalculatorDuplexService.h): @code class WSDualHttpBinding_USCOREICalculatorDuplexService; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate greatly improved and easy-to-use service classes; */ //gsoap tempuri service method-style: Clear document //gsoap tempuri service method-encoding: Clear literal //gsoap tempuri service method-action: Clear http://Microsoft.Samples.DualHttp/ICalculatorDuplex/Clear int __tempuri__Clear( _mssadh__Clear* mssadh__Clear, ///< Request parameter void ///< One-way message: no response parameter ); /******************************************************************************\ * * * Service Operation * * __tempuri__AddTo * * * \******************************************************************************/ /// Operation "__tempuri__AddTo" of service binding "WSDualHttpBinding_USCOREICalculatorDuplex" /** Operation details: - One-way service input message request - SOAP document/literal style messaging - SOAP action: "http://Microsoft.Samples.DualHttp/ICalculatorDuplex/AddTo" - Addressing method action: "http://tempuri.org//ICalculatorDuplex/AddTo" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_send___tempuri__AddTo( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: _mssadh__AddTo* mssadh__AddTo, ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __tempuri__AddTo( struct soap *soap, // request parameters: _mssadh__AddTo* mssadh__AddTo, // response parameters: ); @endcode C++ proxy class (defined in soapWSDualHttpBinding_USCOREICalculatorDuplexProxy.h): @code class WSDualHttpBinding_USCOREICalculatorDuplexProxy; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate greatly improved and easy-to-use proxy classes; C++ service class (defined in soapWSDualHttpBinding_USCOREICalculatorDuplexService.h): @code class WSDualHttpBinding_USCOREICalculatorDuplexService; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate greatly improved and easy-to-use service classes; */ //gsoap tempuri service method-style: AddTo document //gsoap tempuri service method-encoding: AddTo literal //gsoap tempuri service method-action: AddTo http://Microsoft.Samples.DualHttp/ICalculatorDuplex/AddTo int __tempuri__AddTo( _mssadh__AddTo* mssadh__AddTo, ///< Request parameter void ///< One-way message: no response parameter ); /******************************************************************************\ * * * Service Operation * * __tempuri__SubtractFrom * * * \******************************************************************************/ /// Operation "__tempuri__SubtractFrom" of service binding "WSDualHttpBinding_USCOREICalculatorDuplex" /** Operation details: - One-way service input message request - SOAP document/literal style messaging - SOAP action: "http://Microsoft.Samples.DualHttp/ICalculatorDuplex/SubtractFrom" - Addressing method action: "http://tempuri.org//ICalculatorDuplex/SubtractFrom" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_send___tempuri__SubtractFrom( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: _mssadh__SubtractFrom* mssadh__SubtractFrom, ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __tempuri__SubtractFrom( struct soap *soap, // request parameters: _mssadh__SubtractFrom* mssadh__SubtractFrom, // response parameters: ); @endcode C++ proxy class (defined in soapWSDualHttpBinding_USCOREICalculatorDuplexProxy.h): @code class WSDualHttpBinding_USCOREICalculatorDuplexProxy; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate greatly improved and easy-to-use proxy classes; C++ service class (defined in soapWSDualHttpBinding_USCOREICalculatorDuplexService.h): @code class WSDualHttpBinding_USCOREICalculatorDuplexService; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate greatly improved and easy-to-use service classes; */ //gsoap tempuri service method-style: SubtractFrom document //gsoap tempuri service method-encoding: SubtractFrom literal //gsoap tempuri service method-action: SubtractFrom http://Microsoft.Samples.DualHttp/ICalculatorDuplex/SubtractFrom int __tempuri__SubtractFrom( _mssadh__SubtractFrom* mssadh__SubtractFrom, ///< Request parameter void ///< One-way message: no response parameter ); /******************************************************************************\ * * * Service Operation * * __tempuri__MultiplyBy * * * \******************************************************************************/ /// Operation "__tempuri__MultiplyBy" of service binding "WSDualHttpBinding_USCOREICalculatorDuplex" /** Operation details: - One-way service input message request - SOAP document/literal style messaging - SOAP action: "http://Microsoft.Samples.DualHttp/ICalculatorDuplex/MultiplyBy" - Addressing method action: "http://tempuri.org//ICalculatorDuplex/MultiplyBy" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_send___tempuri__MultiplyBy( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: _mssadh__MultiplyBy* mssadh__MultiplyBy, ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __tempuri__MultiplyBy( struct soap *soap, // request parameters: _mssadh__MultiplyBy* mssadh__MultiplyBy, // response parameters: ); @endcode C++ proxy class (defined in soapWSDualHttpBinding_USCOREICalculatorDuplexProxy.h): @code class WSDualHttpBinding_USCOREICalculatorDuplexProxy; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate greatly improved and easy-to-use proxy classes; C++ service class (defined in soapWSDualHttpBinding_USCOREICalculatorDuplexService.h): @code class WSDualHttpBinding_USCOREICalculatorDuplexService; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate greatly improved and easy-to-use service classes; */ //gsoap tempuri service method-style: MultiplyBy document //gsoap tempuri service method-encoding: MultiplyBy literal //gsoap tempuri service method-action: MultiplyBy http://Microsoft.Samples.DualHttp/ICalculatorDuplex/MultiplyBy int __tempuri__MultiplyBy( _mssadh__MultiplyBy* mssadh__MultiplyBy, ///< Request parameter void ///< One-way message: no response parameter ); /******************************************************************************\ * * * Service Operation * * __tempuri__DivideBy * * * \******************************************************************************/ /// Operation "__tempuri__DivideBy" of service binding "WSDualHttpBinding_USCOREICalculatorDuplex" /** Operation details: - One-way service input message request - SOAP document/literal style messaging - SOAP action: "http://Microsoft.Samples.DualHttp/ICalculatorDuplex/DivideBy" - Addressing method action: "http://tempuri.org//ICalculatorDuplex/DivideBy" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_send___tempuri__DivideBy( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: _mssadh__DivideBy* mssadh__DivideBy, ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __tempuri__DivideBy( struct soap *soap, // request parameters: _mssadh__DivideBy* mssadh__DivideBy, // response parameters: ); @endcode C++ proxy class (defined in soapWSDualHttpBinding_USCOREICalculatorDuplexProxy.h): @code class WSDualHttpBinding_USCOREICalculatorDuplexProxy; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate greatly improved and easy-to-use proxy classes; C++ service class (defined in soapWSDualHttpBinding_USCOREICalculatorDuplexService.h): @code class WSDualHttpBinding_USCOREICalculatorDuplexService; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate greatly improved and easy-to-use service classes; */ //gsoap tempuri service method-style: DivideBy document //gsoap tempuri service method-encoding: DivideBy literal //gsoap tempuri service method-action: DivideBy http://Microsoft.Samples.DualHttp/ICalculatorDuplex/DivideBy int __tempuri__DivideBy( _mssadh__DivideBy* mssadh__DivideBy, ///< Request parameter void ///< One-way message: no response parameter ); /******************************************************************************\ * * * Service Operation * * __tempuri__Result * * * \******************************************************************************/ /// Operation "__tempuri__Result" of service binding "WSDualHttpBinding_USCOREICalculatorDuplex" /** Operation details: - One-way service output response message - SOAP document/literal style messaging - SOAP action: "http://Microsoft.Samples.DualHttp/ICalculatorDuplex/Result" - Addressing method action: "http://tempuri.org//ICalculatorDuplex/Result" - Addressing method output action: "http://tempuri.org//ICalculatorDuplex/Result" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_send___tempuri__Result( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // parameters: _mssadh__Result* mssadh__Result, ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __tempuri__Result( struct soap *soap, // parameters: _mssadh__Result* mssadh__Result, ); @endcode C++ proxy class (defined in soapWSDualHttpBinding_USCOREICalculatorDuplexProxy.h): @code class WSDualHttpBinding_USCOREICalculatorDuplexProxy; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate greatly improved and easy-to-use proxy classes; C++ service class (defined in soapWSDualHttpBinding_USCOREICalculatorDuplexService.h): @code class WSDualHttpBinding_USCOREICalculatorDuplexService; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate greatly improved and easy-to-use service classes; */ //gsoap tempuri service method-style: Result document //gsoap tempuri service method-encoding: Result literal //gsoap tempuri service method-action: Result http://Microsoft.Samples.DualHttp/ICalculatorDuplex/Result int __tempuri__Result( _mssadh__Result* mssadh__Result, ///< Request parameter void ///< One-way message ); /******************************************************************************\ * * * Service Operation * * __tempuri__Equation * * * \******************************************************************************/ /// Operation "__tempuri__Equation" of service binding "WSDualHttpBinding_USCOREICalculatorDuplex" /** Operation details: - One-way service output response message - SOAP document/literal style messaging - SOAP action: "http://Microsoft.Samples.DualHttp/ICalculatorDuplex/Equation" - Addressing method action: "http://tempuri.org//ICalculatorDuplex/Equation" - Addressing method output action: "http://tempuri.org//ICalculatorDuplex/Equation" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_send___tempuri__Equation( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // parameters: _mssadh__Equation* mssadh__Equation, ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __tempuri__Equation( struct soap *soap, // parameters: _mssadh__Equation* mssadh__Equation, ); @endcode C++ proxy class (defined in soapWSDualHttpBinding_USCOREICalculatorDuplexProxy.h): @code class WSDualHttpBinding_USCOREICalculatorDuplexProxy; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate greatly improved and easy-to-use proxy classes; C++ service class (defined in soapWSDualHttpBinding_USCOREICalculatorDuplexService.h): @code class WSDualHttpBinding_USCOREICalculatorDuplexService; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate greatly improved and easy-to-use service classes; */ //gsoap tempuri service method-style: Equation document //gsoap tempuri service method-encoding: Equation literal //gsoap tempuri service method-action: Equation http://Microsoft.Samples.DualHttp/ICalculatorDuplex/Equation int __tempuri__Equation( _mssadh__Equation* mssadh__Equation, ///< Request parameter void ///< One-way message ); /** @page WSDualHttpBinding_USCOREICalculatorDuplex Binding "WSDualHttpBinding_USCOREICalculatorDuplex" @section WSDualHttpBinding_USCOREICalculatorDuplex_policy_enablers Policy Enablers of Binding "WSDualHttpBinding_USCOREICalculatorDuplex" Based on policies, this service imports wsa5.h wsrm5.h - WS-Policy reminders and enablers: - WS-Addressing 1.0 (2005/08, accepts 2004/08): @code #import "wsa5.h" // to be added to this header file for the soapcpp2 build step @endcode @code #include "plugin/wsaapi.h" soap_register_plugin(soap, soap_wsa); // register the wsa plugin in your code // See the user guide gsoap/doc/wsa/html/index.html @endcode - WS-Addressing (2004/08): @code #import "wsa.h" // to be added to this header file for the soapcpp2 build step @endcode @code #include "plugin/wsaapi.h" soap_register_plugin(soap, soap_wsa); // register the wsa plugin in your code // See the user guide gsoap/doc/wsa/html/index.html @endcode - WS-ReliableMessaging 1.0: @code #import "wsrm5.h" // to be added to this header file for the soapcpp2 build step @endcode @code #include "plugin/wsrmapi.h" soap_register_plugin(soap, soap_wsa); // register the wsa plugin in your code soap_register_plugin(soap, soap_wsrm); // register the wsrm plugin in your code // See the user guide gsoap/doc/wsrm/html/index.html @endcode - WS-ReliableMessaging 1.1: @code #import "wsrm.h" // to be added to this header file for the soapcpp2 build step @endcode @code #include "plugin/wsrmapi.h" soap_register_plugin(soap, soap_wsa); // register the wsa plugin in your code soap_register_plugin(soap, soap_wsrm); // register the wsrm plugin in your code // See the user guide gsoap/doc/wsrm/html/index.html @endcode - WS-Security (SOAP Message Security) 1.0 (accepts 1.1): @code #import "wsse.h" // to be added to this header file for the soapcpp2 build step @endcode @code #include "plugin/wsseapi.h" soap_register_plugin(soap, soap_wsse); // register the wsse plugin in your code // See the user guide gsoap/doc/wsse/html/index.html @endcode - WS-Security (SOAP Message Security) 1.1 (accepts 1.0): @code #import "wsse11.h" // to be added to this header file for the soapcpp2 build step @endcode @code #include "plugin/wsseapi.h" soap_register_plugin(soap, soap_wsse); // register the wsse plugin in your code // See the user guide gsoap/doc/wsse/html/index.html @endcode - HTTP Digest Authentication: @code #include "plugin/httpda.h" soap_register_plugin(soap, soap_http_da); // register the HTTP DA plugin in your code // See the user guide gsoap/doc/httpda/html/index.html @endcode */ #import "wsa5.h" #import "wsrm5.h" /******************************************************************************\ * * * XML Data Binding * * * \******************************************************************************/ /** @page page_XMLDataBinding XML Data Binding SOAP/XML services use data bindings contractually bound by WSDL and auto- generated by wsdl2h and soapcpp2 (see Service Bindings). Plain data bindings are adopted from XML schemas as part of the WSDL types section or when running wsdl2h on a set of schemas to produce non-SOAP-based XML data bindings. The following readers and writers are C/C++ data type (de)serializers auto- generated by wsdl2h and soapcpp2. Run soapcpp2 on this file to generate the (de)serialization code, which is stored in soapC.c[pp]. Include "soapH.h" in your code to import these data type and function declarations. Only use the soapcpp2-generated files in your project build. Do not include the wsdl2h- generated .h file in your code. XML content can be retrieved from: - a file descriptor, using soap->recvfd = fd - a socket, using soap->socket = ... - a C++ stream, using soap->is = ... - a buffer, using the soap->frecv() callback XML content can be stored to: - a file descriptor, using soap->sendfd = fd - a socket, using soap->socket = ... - a C++ stream, using soap->os = ... - a buffer, using the soap->fsend() callback @section mssadhi Top-level root elements of schema "http://Microsoft.Samples.DualHttp/Imports" @section mssadh Top-level root elements of schema "http://Microsoft.Samples.DualHttp" - @ref _mssadh__Clear @code // Reader (returns SOAP_OK on success): soap_read__mssadh__Clear(struct soap*, _mssadh__Clear*); // Writer (returns SOAP_OK on success): soap_write__mssadh__Clear(struct soap*, _mssadh__Clear*); @endcode - @ref _mssadh__AddTo @code // Reader (returns SOAP_OK on success): soap_read__mssadh__AddTo(struct soap*, _mssadh__AddTo*); // Writer (returns SOAP_OK on success): soap_write__mssadh__AddTo(struct soap*, _mssadh__AddTo*); @endcode - @ref _mssadh__SubtractFrom @code // Reader (returns SOAP_OK on success): soap_read__mssadh__SubtractFrom(struct soap*, _mssadh__SubtractFrom*); // Writer (returns SOAP_OK on success): soap_write__mssadh__SubtractFrom(struct soap*, _mssadh__SubtractFrom*); @endcode - @ref _mssadh__MultiplyBy @code // Reader (returns SOAP_OK on success): soap_read__mssadh__MultiplyBy(struct soap*, _mssadh__MultiplyBy*); // Writer (returns SOAP_OK on success): soap_write__mssadh__MultiplyBy(struct soap*, _mssadh__MultiplyBy*); @endcode - @ref _mssadh__DivideBy @code // Reader (returns SOAP_OK on success): soap_read__mssadh__DivideBy(struct soap*, _mssadh__DivideBy*); // Writer (returns SOAP_OK on success): soap_write__mssadh__DivideBy(struct soap*, _mssadh__DivideBy*); @endcode - @ref _mssadh__Result @code // Reader (returns SOAP_OK on success): soap_read__mssadh__Result(struct soap*, _mssadh__Result*); // Writer (returns SOAP_OK on success): soap_write__mssadh__Result(struct soap*, _mssadh__Result*); @endcode - @ref _mssadh__Equation @code // Reader (returns SOAP_OK on success): soap_read__mssadh__Equation(struct soap*, _mssadh__Equation*); // Writer (returns SOAP_OK on success): soap_write__mssadh__Equation(struct soap*, _mssadh__Equation*); @endcode */ /* End of calculator.h */ gsoap-2.8.28/gsoap/samples/wcf/WS/DualHttp/Doxyfile0000644000175000017500000002271312653650156021422 0ustar ellertellert# Doxyfile 1.3.8 #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- PROJECT_NAME = "WCF WS Dual Http" PROJECT_NUMBER = "" OUTPUT_DIRECTORY = CREATE_SUBDIRS = NO OUTPUT_LANGUAGE = English USE_WINDOWS_ENCODING = NO BRIEF_MEMBER_DESC = YES REPEAT_BRIEF = YES ABBREVIATE_BRIEF = "The $name class" \ "The $name widget" \ "The $name file" \ is \ provides \ specifies \ contains \ represents \ a \ an \ the ALWAYS_DETAILED_SEC = NO INLINE_INHERITED_MEMB = NO FULL_PATH_NAMES = YES STRIP_FROM_PATH = /Applications/ STRIP_FROM_INC_PATH = SHORT_NAMES = NO JAVADOC_AUTOBRIEF = NO MULTILINE_CPP_IS_BRIEF = NO DETAILS_AT_TOP = NO INHERIT_DOCS = YES DISTRIBUTE_GROUP_DOC = NO TAB_SIZE = 8 ALIASES = OPTIMIZE_OUTPUT_FOR_C = NO OPTIMIZE_OUTPUT_JAVA = NO SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- EXTRACT_ALL = YES EXTRACT_PRIVATE = YES EXTRACT_STATIC = YES EXTRACT_LOCAL_CLASSES = YES EXTRACT_LOCAL_METHODS = NO HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_CLASSES = NO HIDE_FRIEND_COMPOUNDS = NO HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = NO CASE_SENSE_NAMES = NO HIDE_SCOPE_NAMES = NO SHOW_INCLUDE_FILES = YES INLINE_INFO = YES SORT_MEMBER_DOCS = YES SORT_BRIEF_DOCS = NO SORT_BY_SCOPE_NAME = NO GENERATE_TODOLIST = YES GENERATE_TESTLIST = YES GENERATE_BUGLIST = YES GENERATE_DEPRECATEDLIST= YES ENABLED_SECTIONS = MAX_INITIALIZER_LINES = 30 SHOW_USED_FILES = YES #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- QUIET = NO WARNINGS = YES WARN_IF_UNDOCUMENTED = YES WARN_IF_DOC_ERROR = YES WARN_FORMAT = "$file:$line: $text" WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- INPUT = calculator.h calculator.cpp FILE_PATTERNS = *.c \ *.cc \ *.cxx \ *.cpp \ *.c++ \ *.java \ *.ii \ *.ixx \ *.ipp \ *.i++ \ *.inl \ *.h \ *.hh \ *.hxx \ *.hpp \ *.h++ \ *.idl \ *.odl \ *.cs \ *.php \ *.php3 \ *.inc \ *.m \ *.mm \ *.C \ *.CC \ *.C++ \ *.II \ *.I++ \ *.H \ *.HH \ *.H++ \ *.CS \ *.PHP \ *.PHP3 \ *.M \ *.MM RECURSIVE = NO EXCLUDE = EXCLUDE_SYMLINKS = NO EXCLUDE_PATTERNS = EXAMPLE_PATH = EXAMPLE_PATTERNS = * EXAMPLE_RECURSIVE = NO IMAGE_PATH = INPUT_FILTER = FILTER_PATTERNS = FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- SOURCE_BROWSER = YES INLINE_SOURCES = NO STRIP_CODE_COMMENTS = YES REFERENCED_BY_RELATION = NO REFERENCES_RELATION = NO VERBATIM_HEADERS = NO #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- ALPHABETICAL_INDEX = NO COLS_IN_ALPHA_INDEX = 5 IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- GENERATE_HTML = YES HTML_OUTPUT = html HTML_FILE_EXTENSION = .html HTML_HEADER = HTML_FOOTER = HTML_STYLESHEET = HTML_ALIGN_MEMBERS = YES GENERATE_HTMLHELP = NO CHM_FILE = HHC_LOCATION = GENERATE_CHI = NO BINARY_TOC = NO TOC_EXPAND = NO DISABLE_INDEX = NO ENUM_VALUES_PER_LINE = 4 GENERATE_TREEVIEW = NO TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- GENERATE_LATEX = NO LATEX_OUTPUT = latex LATEX_CMD_NAME = latex MAKEINDEX_CMD_NAME = makeindex COMPACT_LATEX = NO PAPER_TYPE = a4wide EXTRA_PACKAGES = LATEX_HEADER = PDF_HYPERLINKS = NO USE_PDFLATEX = NO LATEX_BATCHMODE = NO LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- GENERATE_RTF = NO RTF_OUTPUT = rtf COMPACT_RTF = NO RTF_HYPERLINKS = NO RTF_STYLESHEET_FILE = RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- GENERATE_MAN = NO MAN_OUTPUT = man MAN_EXTENSION = .3 MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- GENERATE_XML = NO XML_OUTPUT = xml XML_SCHEMA = XML_DTD = XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- GENERATE_PERLMOD = NO PERLMOD_LATEX = NO PERLMOD_PRETTY = YES PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- ENABLE_PREPROCESSING = YES MACRO_EXPANSION = NO EXPAND_ONLY_PREDEF = NO SEARCH_INCLUDES = YES INCLUDE_PATH = INCLUDE_FILE_PATTERNS = PREDEFINED = EXPAND_AS_DEFINED = SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- TAGFILES = GENERATE_TAGFILE = ALLEXTERNALS = NO EXTERNAL_GROUPS = YES PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- CLASS_DIAGRAMS = NO HIDE_UNDOC_RELATIONS = YES HAVE_DOT = YES CLASS_GRAPH = YES COLLABORATION_GRAPH = YES UML_LOOK = NO TEMPLATE_RELATIONS = NO INCLUDE_GRAPH = YES INCLUDED_BY_GRAPH = YES CALL_GRAPH = NO GRAPHICAL_HIERARCHY = YES DOT_IMAGE_FORMAT = png DOT_PATH = /usr/local/bin DOTFILE_DIRS = MAX_DOT_GRAPH_WIDTH = 1024 MAX_DOT_GRAPH_HEIGHT = 1024 MAX_DOT_GRAPH_DEPTH = 1000 GENERATE_LEGEND = YES DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- SEARCHENGINE = NO gsoap-2.8.28/gsoap/samples/wcf/WS/DualHttp/Makefile0000644000175000017500000000334312653650156021352 0ustar ellertellertURL=http://192.168.2.2:8000/ServiceModelSamples/service WSDL=../../../../wsdl/wsdl2h GSOAP=../../../../src/soapcpp2 SOAPH=../../../../stdsoap2.h SOAPC=../../../../stdsoap2.c SOAPCPP=../../../../stdsoap2.cpp SOAPDOMC=../../../../dom.c SOAPDOMCPP=../../../../dom.cpp TYPEMAP=../../../../typemap.dat CC=gcc -x c CPP=g++ -x c++ LIBS=-lssl -lcrypto GSFLAGS=-L -I../../../../import -I../../../.. COFLAGS=-O2 CWFLAGS=-Wall -Wno-deprecated-declarations CIFLAGS=-I. -I../../../.. -I../../../../plugin CMFLAGS=-DCB_THREAD -DWITH_WCF -DWITH_DOM -DWITH_OPENSSL CFLAGS= $(CWFLAGS) $(COFLAGS) $(CIFLAGS) $(CMFLAGS) all: calculator calculator: calculator.h calculator.cpp $(SOAPH) $(SOAPC) wsrxClient.cpp $(GSOAP) $(GSFLAGS) -a -j calculator.h $(CPP) $(CFLAGS) -o calculator calculator.cpp soapC.cpp soapWSDualHttpBinding_USCOREICalculatorDuplexService.cpp soapWSDualHttpBinding_USCOREICalculatorDuplexProxy.cpp wsrxClient.cpp wsrxServer.cpp ../../../../plugin/wsrmapi.c ../../../../plugin/wsaapi.c ../../../../custom/duration.c $(SOAPDOMCPP) $(SOAPCPP) $(LIBS) wsrxClient.cpp wsrxServer.cpp: $(GSOAP) $(GSFLAGS) -A -pwsrx ../../../../import/wsrm5.h %.cer: %.pem openssl x509 -in $< -outform der -out $@ calculator.h: $(WSDL) -t $(TYPEMAP) -o calculator.h $(URL)?wsdl .PHONY: clean distclean clean: rm -f *.o soapH.h soapStub.h soapC.* soapClient.* soapServer.* soap*Proxy.* soap*Service.* soap*Object.* rm -f *.o wsrxH.h wsrxStub.h wsrxC.* wsrxClient.* wsrxServer.* wsrxwsrmObject.h wsrxwsrmProxy.h distclean: rm -f *.o soapH.h soapStub.h soapC.* soapClient.* soapServer.* soap*Proxy.* soap*Service.* soap*Object.* rm -f *.o wsrxH.h wsrxStub.h wsrxC.* wsrxClient.* wsrxServer.* wsrxwsrmObject.h wsrxwsrmProxy.h rm -f *.xml *.nsmap *.log rm -f calculator gsoap-2.8.28/gsoap/samples/wcf/WS/DualHttp/calculator.cpp0000644000175000017500000006051212653650156022550 0ustar ellertellert/* calculator.cpp WCF wsDualHttpBinding demo See the README.txt gSOAP XML Web services tools Copyright (C) 2000-2012, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under one of the following licenses: GPL, the gSOAP public license, or Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2012, Robert van Engelen, Genivia Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ /* To build with C++ service objects (proxies, services, and callback service objects), run soapcpp2 twice, first for the WS-RM logic and then for the app logic: $ soapcpp2 -L -I../../../../import -I../../../.. -A -pwsrx ../../../../import/wsrm5.h $ soapcpp2 -L -I../../../../import -I../../../.. -a -j calculator.h then compile: $ c++ -o calculator calculator.cpp soapC.cpp soapWSDualHttpBinding_USCOREICalculatorDuplexService.cpp soapWSDualHttpBinding_USCOREICalculatorDuplexProxy.cpp wsrxClient.cpp wsrxServer.cpp ../../../../plugin/wsrmapi.c ../../../../plugin/wsaapi.c ../../../../custom/duration.c ../../../../dom.cpp ../../../../stdsoap2.cpp Run service on port 8000: $ ./calculator 8000 Run client: $ ./calculator Note: Set serverURI to "http://localhost:8000" and clientURI to "http://localhost:8001" in the code below to run the client and server on the same host. See README.txt for custimizations and instructions for WCF. When comppiled with -DCB_THREAD, the client will start a callback server to accept incoming messages instead of using a polling method. */ #include "soapWSDualHttpBinding_USCOREICalculatorDuplexService.h" #include "soapWSDualHttpBinding_USCOREICalculatorDuplexProxy.h" #include "WSDualHttpBinding_USCOREICalculatorDuplex.nsmap" // Set to the service URI: const char *serverURI = "http://localhost:8000"; // const char *serverURI = "http://192.168.2.2:8000/ServiceModelSamples/service"; // Set to the client callback URI and port: const char *clientURI = "http://localhost:8001"; // const char *clientURI = "http://10.0.1.3:8001"; int clientPort = 8001; #include #include "wsrmapi.h" #ifdef CB_THREAD void *callback_server(void*); void *callback_thread(void *ctx); #define CB_WAIT (1) /* threaded callback service operation may block for up to 1s with NoDiscard */ #else #define CB_WAIT (0) /* callback polling service operations should not block with NoDiscard */ #endif class Service : public WSDualHttpBinding_USCOREICalculatorDuplexService { private: double result; std::stringstream equation; WSDualHttpBinding_USCOREICalculatorDuplexProxy callback; public: Service() { soap_set_mode(soap, SOAP_XML_INDENT); soap_register_plugin(soap, soap_wsa); soap_register_plugin(soap, soap_wsrm); soap->send_timeout = soap->recv_timeout = 10; // 10 sec soap_set_mode(callback.soap, SOAP_XML_INDENT); soap_register_plugin(callback.soap, soap_wsa); soap_register_plugin(callback.soap, soap_wsrm); callback.soap->send_timeout = callback.soap->recv_timeout = 10; // 10 sec result = 0.0; equation.str(""); equation << 0.0; } ~Service() { destroy(); callback.destroy(); } int start(int port); int Clear(_mssadh__Clear*); int AddTo(_mssadh__AddTo*); int SubtractFrom(_mssadh__SubtractFrom*); int MultiplyBy(_mssadh__MultiplyBy*); int DivideBy(_mssadh__DivideBy*); }; class Client : public WSDualHttpBinding_USCOREICalculatorDuplexProxy { private: WSDualHttpBinding_USCOREICalculatorDuplexService callback; public: #ifdef CB_THREAD THREAD_TYPE tid; // callback service thread #endif Client(const char *serverURI) { soap_set_mode(soap, SOAP_XML_INDENT); soap_register_plugin(soap, soap_wsa); soap_register_plugin(soap, soap_wsrm); soap_endpoint = serverURI; soap->send_timeout = soap->recv_timeout = 10; // 10 sec soap_set_mode(callback.soap, SOAP_XML_INDENT); soap_register_plugin(callback.soap, soap_wsa); soap_register_plugin(callback.soap, soap_wsrm); callback.soap->send_timeout = callback.soap->recv_timeout = 10; // 10 sec callback.soap->bind_flags = SO_REUSEADDR; // allow immediate bind if (!soap_valid_socket(callback.bind(NULL, clientPort, 100))) { callback.soap_stream_fault(std::cerr); exit(1); } #ifdef CB_THREAD THREAD_CREATE(&tid, (void*(*)(void*))callback_server, (void*)&callback); #endif } ~Client() { destroy(); #ifdef CB_THREAD THREAD_JOIN(tid); #endif callback.destroy(); } int run(); int poll(int timeout); }; int main(int argc, char **argv) { // Command line argument? If yes, then run the service on a port if (argc >= 2) { int port = atoi(argv[1]); Service service; service.start(port); } else { Client client(serverURI); client.run(); } } int Client::run() { // Create a reliable messaging sequence handle for client-initiated session soap_wsrm_sequence_handle seq; xsd__duration expires = 30000; /* 30000 ms = 30 seconds to expire */ const char *id = soap_wsa_rand_uuid(soap); double n; int retry; printf("\n**** Creating the Sequence\n"); // Create session for in-order messaging, init sequence handle if (soap_wsrm_create_offer(soap, serverURI, clientURI, id, expires, NoDiscard, soap_wsa_rand_uuid(soap), &seq)) { soap_stream_fault(std::cerr); soap_wsrm_seq_free(soap, seq); return soap->error; } // poll 100 times for .1 second until created for (retry = 100; retry && !soap_wsrm_seq_created(soap, seq); retry--) { if (poll(-100000)) return soap->error; } if (!retry) { fprintf(stderr, "CANNOT CREATE SEQUENCE - SERVER NOT RESPONDING\n"); exit(1); } // Reliable messaging request message if (soap_wsrm_request_acks(soap, seq, soap_wsa_rand_uuid(soap), "http://Microsoft.Samples.DualHttp/ICalculatorDuplex/AddTo")) { soap_stream_fault(std::cerr); return soap->error; } n = 3.14; _mssadh__AddTo addTo; addTo.n = &n; if (AddTo(&addTo) == SOAP_OK) std::cout << std::endl << "**** AddTo(" << *addTo.n << ")" << std::endl; else soap_stream_fault(std::cerr); destroy(); #ifndef CB_THREAD // callback polling: 500 ms polling cycle if (poll(-500000)) return soap->error; #endif // Reliable messaging request message if (soap_wsrm_request_acks(soap, seq, soap_wsa_rand_uuid(soap), "http://Microsoft.Samples.DualHttp/ICalculatorDuplex/SubtractFrom")) { soap_stream_fault(std::cerr); return soap->error; } n = 1.41; _mssadh__SubtractFrom subtractFrom; subtractFrom.n = &n; if (SubtractFrom(&subtractFrom) == SOAP_OK) std::cout << std::endl << "**** SubtractFrom(" << *subtractFrom.n << ")" << std::endl; else soap_stream_fault(std::cerr); destroy(); #ifndef CB_THREAD // callback polling: 500 ms polling cycle if (poll(-500000)) return soap->error; #endif // Reliable messaging request message if (soap_wsrm_request_acks(soap, seq, soap_wsa_rand_uuid(soap), "http://Microsoft.Samples.DualHttp/ICalculatorDuplex/Clear")) { soap_stream_fault(std::cerr); return soap->error; } _mssadh__Clear clear; if (Clear(&clear) == SOAP_OK) std::cout << std::endl << "**** Clear()" << std::endl; else soap_stream_fault(std::cerr); destroy(); #ifndef CB_THREAD // callback polling: 500 ms polling cycle if (poll(-500000)) return soap->error; #endif printf("\n**** Closing the Sequence\n"); if (soap_wsrm_close(soap, seq, soap_wsa_rand_uuid(soap))) { soap_stream_fault(std::cerr); soap_wsrm_seq_free(soap, seq); return soap->error; } for (retry = 30; retry; retry--) { // Receive more messages when last not yet received if (soap_wsrm_lastnum(seq) == 0) { #ifdef CB_THREAD // we want to pulse here to send acks for incoming messages to keep flow going soap_wsrm_pulse(soap, -500000); /* 500 ms */ #endif printf("\n**** Receiving Messages Until Last\n"); // callback polling or delay: 500 ms polling cycle if (poll(-500000)) return soap->error; } // Resend messages marked as non-acked (as an option) if (soap_wsrm_nack(seq)) { printf("\n**** Resending "SOAP_ULONG_FORMAT" Non-Acked Messages\n", soap_wsrm_nack(seq)); soap_wsrm_resend(soap, seq, 0, 0); /* 0 0 means full range of msg nums */ } } if (soap_wsrm_nack(seq) || soap_wsrm_lastnum(seq) == 0) { printf("\n**** Incomplete Sequence\n"); soap_wsrm_dump(soap, stdout); } printf("\n**** Terminating the Sequence\n"); // Termination fails if the server did not get all messages if (soap_wsrm_terminate(soap, seq, soap_wsa_rand_uuid(soap))) { soap_stream_fault(std::cerr); soap_wsrm_seq_free(soap, seq); return soap->error; } #ifdef CB_THREAD soap_wsrm_dump(soap, stdout); printf("\n**** Waiting for Callback Server to Terminate\n"); #endif // callback polling: 1 s polling cycle if (poll(1)) return soap->error; // Delete the reliable messaging session sequence (assuming no more inbound messages) soap_wsrm_seq_free(soap, seq); return 0; } /******************************************************************************\ * * Client-side callback polling * \******************************************************************************/ int Client::poll(int timeout) { #ifdef CB_THREAD // We leave the acceptance of messages to the callback server thread if (timeout < 0) timeout = 1; sleep(timeout); // but we want to wait some until these messages arrive #else callback.soap->accept_timeout = timeout; printf("\n**** Callback Polling\n"); while (soap_valid_socket(callback.accept())) { /* chain the WSRM operations after callback operations */ if (soap_begin_serve(callback.soap) == SOAP_OK) if (callback.dispatch() == SOAP_NO_METHOD) soap_serve_request(callback.soap); if (callback.soap->error) soap_send_fault(callback.soap); soap->error = callback.soap->error; callback.destroy(); if (soap->error && soap->error != SOAP_STOP) { soap_stream_fault(std::cerr); return soap->error; } soap_wsrm_dump(callback.soap, stdout); } #endif return SOAP_OK; } /******************************************************************************\ * * Optional Client-Side Threaded Callback Server * \******************************************************************************/ #ifdef CB_THREAD void *callback_server(void *ctx) { WSDualHttpBinding_USCOREICalculatorDuplexService *callback = (WSDualHttpBinding_USCOREICalculatorDuplexService*)ctx; THREAD_TYPE tid; callback->soap->accept_timeout = 30; /* server quits after 30 seconds of inactivity */ printf("\n**** Callback Server Running\n"); while (soap_valid_socket(callback->accept())) THREAD_CREATE(&tid, (void*(*)(void*))callback_thread, (void*)callback->copy()); printf("\n**** Callback Server Terminated\n"); return NULL; } void *callback_thread(void *ctx) { WSDualHttpBinding_USCOREICalculatorDuplexService *callback = (WSDualHttpBinding_USCOREICalculatorDuplexService*)ctx; THREAD_DETACH(THREAD_ID); /* chain the WSRM operations after callback operations */ if (soap_begin_serve(callback->soap) == SOAP_OK) if (callback->dispatch() == SOAP_NO_METHOD) soap_serve_request(callback->soap); if (callback->soap->error) soap_send_fault(callback->soap); if (callback->soap->error != SOAP_STOP && callback->soap->error != SOAP_EOF) callback->soap_stream_fault(std::cerr); else if (callback->soap->error != SOAP_EOF || callback->soap->errnum) soap_wsrm_dump(callback->soap, stdout); callback->destroy(); delete callback; return NULL; } #endif /******************************************************************************\ * * Client-side callback operations via callback polling service * \******************************************************************************/ int WSDualHttpBinding_USCOREICalculatorDuplexService::Result(_mssadh__Result *req) { /* check for WS-RM/WSA, send empty response (this is a one-way operation over HTTP) */ if (soap_wsrm_check_send_empty_response_and_wait(soap, CB_WAIT)) return soap->error; if (req->result) std::cout << std::endl << "**** Result(" << *req->result << ")" << std::endl; return SOAP_OK; } int WSDualHttpBinding_USCOREICalculatorDuplexService::Equation(_mssadh__Equation *req) { /* check for WS-RM/WSA, send empty response (this is a one-way operation over HTTP) */ if (soap_wsrm_check_send_empty_response_and_wait(soap, CB_WAIT)) return soap->error; if (req->eqn) std::cout << std::endl << "**** Equation(" << *req->eqn << ")" << std::endl; return SOAP_OK; } /******************************************************************************\ * * Service operations * \******************************************************************************/ int Service::start(int port) { if (!soap_valid_socket(bind(NULL, port, 100))) { soap_stream_fault(std::cerr); exit(1); } std::cerr << "Server Running" << std::endl; /* optional: set accept timeout to pulse acks every 500 ms, see below */ soap->accept_timeout = -500000; for (;;) { if (soap_valid_socket(accept())) { /* with iterative servers asynchronous messaging deadlock scenarios exist! */ /* chain the WSRM service operations after the main service operations */ if (soap_begin_serve(soap) == SOAP_OK) if (dispatch() == SOAP_NO_METHOD) soap_serve_request(soap); if (soap->error) soap_send_fault(soap); if (soap->error && soap->error != SOAP_STOP) soap_stream_fault(std::cerr); destroy(); callback.destroy(); soap_wsrm_dump(soap, stdout); } else { /* error or timeout? */ if (soap->errnum) { soap_stream_fault(std::cerr); exit(1); } /* timeout occurs after 1 sec */ /* send acks to peers (optional), 10 ms per message timeout */ soap_wsrm_pulse(soap, -10000); /* 10 ms */ } } return SOAP_OK; } int Service::Clear(_mssadh__Clear *req) { /* check for WS-RM/WSA, send empty response (this is a one-way operation over HTTP) */ if (soap_wsrm_check_send_empty_response(soap)) return soap->error; /* get the handle to the current sequence of the inbound message */ soap_wsrm_sequence_handle seq = soap_wsrm_seq(soap); /* TODO: send acknowledgement(s) immediately? */ /* soap_wsrm_acknowledgement(soap, seq, NULL); */ if (soap_wsrm_request_acks(callback.soap, seq, soap_wsa_rand_uuid(callback.soap), "http://Microsoft.Samples.DualHttp/ICalculatorDuplex/Equation")) { callback.soap_stream_fault(std::cerr); soap_wsrm_seq_release(soap, seq); return callback.soap->error; } callback.soap_endpoint = soap_wsrm_to(seq); soap_wsrm_seq_release(soap, seq); equation << " = " << result; if (callback.soap_endpoint) { _mssadh__Equation eqn; std::string s = equation.str(); eqn.eqn = &s; if (callback.Equation(&eqn) == SOAP_OK) std::cout << "Equation(" << s << ")" << std::endl; else callback.soap_stream_fault(std::cerr); } callback.destroy(); result = 0.0; equation.str(""); equation << 0.0; return SOAP_OK; } int Service::AddTo(_mssadh__AddTo *req) { /* check for WS-RM/WSA */ if (soap_wsrm_check(soap)) return soap->error; if (req && req->n) { result += *req->n; equation << " + " << *req->n; } else return soap_wsrm_sender_fault(soap, "Invalid data in AddTo", NULL); /* this is a one-way operation over HTTP, so we're done with client */ soap_send_empty_response(soap, 202); /* get the handle to the current sequence of the inbound message */ soap_wsrm_sequence_handle seq = soap_wsrm_seq(soap); /* TODO: send acknowledgement(s) immediately? */ /* soap_wsrm_acknowledgement(soap, seq, NULL); */ if (soap_wsrm_request_acks(callback.soap, seq, soap_wsa_rand_uuid(callback.soap), "http://Microsoft.Samples.DualHttp/ICalculatorDuplex/Result")) { callback.soap_stream_fault(std::cerr); soap_wsrm_seq_release(soap, seq); return callback.soap->error; } callback.soap_endpoint = soap_wsrm_to(seq); soap_wsrm_seq_release(soap, seq); if (callback.soap_endpoint) { _mssadh__Result res; res.result = &result; if (callback.Result(&res) == SOAP_OK) std::cout << "Result(" << result << ")" << std::endl; else callback.soap_stream_fault(std::cerr); } callback.destroy(); return SOAP_OK; } int Service::SubtractFrom(_mssadh__SubtractFrom *req) { /* check for WS-RM/WSA */ if (soap_wsrm_check(soap)) return soap->error; if (req && req->n) { result -= *req->n; equation << " - " << *req->n; } else return soap_wsrm_sender_fault(soap, "Invalid data in SubtractFrom", NULL); /* this is a one-way operation over HTTP, so we're done with client */ soap_send_empty_response(soap, 202); /* get the handle to the current sequence of the inbound message */ soap_wsrm_sequence_handle seq = soap_wsrm_seq(soap); /* TODO: send acknowledgement(s) immediately? */ /* soap_wsrm_acknowledgement(soap, seq, NULL); */ if (soap_wsrm_request_acks(callback.soap, seq, soap_wsa_rand_uuid(callback.soap), "http://Microsoft.Samples.DualHttp/ICalculatorDuplex/Result")) { callback.soap_stream_fault(std::cerr); soap_wsrm_seq_release(soap, seq); return callback.soap->error; } callback.soap_endpoint = soap_wsrm_to(seq); soap_wsrm_seq_release(soap, seq); if (callback.soap_endpoint) { _mssadh__Result res; res.result = &result; if (callback.Result(&res) == SOAP_OK) std::cout << "Result(" << result << ")" << std::endl; else callback.soap_stream_fault(std::cerr); } callback.destroy(); return SOAP_OK; } int Service::MultiplyBy(_mssadh__MultiplyBy *req) { /* check for WS-RM/WSA */ if (soap_wsrm_check(soap)) return soap->error; if (req && req->n) { result *= *req->n; equation << " * " << *req->n; } else return soap_wsrm_sender_fault(soap, "Invalid data in MultiplyBy", NULL); /* this is a one-way operation over HTTP, so we're done with client */ soap_send_empty_response(soap, 202); /* get the handle to the current sequence of the inbound message */ soap_wsrm_sequence_handle seq = soap_wsrm_seq(soap); /* TODO: send acknowledgement(s) immediately? */ /* soap_wsrm_acknowledgement(soap, seq, NULL); */ if (soap_wsrm_request_acks(callback.soap, seq, soap_wsa_rand_uuid(callback.soap), "http://Microsoft.Samples.DualHttp/ICalculatorDuplex/Result")) { callback.soap_stream_fault(std::cerr); soap_wsrm_seq_release(soap, seq); return callback.soap->error; } callback.soap_endpoint = soap_wsrm_to(seq); soap_wsrm_seq_release(soap, seq); if (callback.soap_endpoint) { _mssadh__Result res; res.result = &result; if (callback.Result(&res) == SOAP_OK) std::cout << "Result(" << result << ")" << std::endl; else callback.soap_stream_fault(std::cerr); } callback.destroy(); return SOAP_OK; } int Service::DivideBy(_mssadh__DivideBy *req) { /* check for WS-RM/WSA */ if (soap_wsrm_check(soap)) return soap->error; if (req && req->n) { result /= *req->n; equation << " / " << *req->n; } else return soap_wsrm_sender_fault(soap, "Invalid data in DivideBy", NULL); /* this is a one-way operation over HTTP, so we're done with client */ soap_send_empty_response(soap, 202); /* get the handle to the current sequence of the inbound message */ soap_wsrm_sequence_handle seq = soap_wsrm_seq(soap); /* TODO: send acknowledgement(s) immediately? */ /* soap_wsrm_acknowledgement(soap, seq, NULL); */ if (soap_wsrm_request_acks(callback.soap, seq, soap_wsa_rand_uuid(callback.soap), "http://Microsoft.Samples.DualHttp/ICalculatorDuplex/Result")) { callback.soap_stream_fault(std::cerr); soap_wsrm_seq_release(soap, seq); return callback.soap->error; } callback.soap_endpoint = soap_wsrm_to(seq); soap_wsrm_seq_release(soap, seq); if (callback.soap_endpoint) { _mssadh__Result res; res.result = &result; if (callback.send_Result(&res) == SOAP_OK) std::cout << "Result(" << result << ")" << std::endl; else callback.soap_stream_fault(std::cerr); } callback.destroy(); return SOAP_OK; } /******************************************************************************\ * * Catch and Report the SOAP Faults Sent by Peer * \******************************************************************************/ int SOAP_ENV__Fault(struct soap *soap, _QName faultcode, // SOAP 1.1 char *faultstring, // SOAP 1.1 char *faultactor, // SOAP 1.1 struct SOAP_ENV__Detail *detail, // SOAP 1.1 struct SOAP_ENV__Code *Code, // SOAP 1.2 struct SOAP_ENV__Reason *Reason, // SOAP 1.2 char *Node, // SOAP 1.2 char *Role, // SOAP 1.2 struct SOAP_ENV__Detail *Detail // SOAP 1.2 ) { soap_send_empty_response(soap, 202); printf("\n**** Fault Received ****\n"); if (faultstring) printf("reason: %s\n", faultstring); else if (Reason && Reason->SOAP_ENV__Text) printf("reason: %s\n", Reason->SOAP_ENV__Text); if (!detail) detail = Detail; if (detail && detail->__type == SOAP_TYPE__wsrm__Identifier) { /* the sequence id is in the Fault Detail __type and fault members */ char *id = (char*)detail->fault; printf("id: %s\n", id); /* we opt to treat all faults fatal, so let's terminate the sequence */ soap_wsrm_sequence_handle seq = soap_wsrm_seq_lookup_id(soap, id); if (seq) { soap_wsrm_error(soap, seq, wsrm__SequenceTerminated); soap_wsrm_seq_release(soap, seq); return soap->error; } } return SOAP_OK; } /******************************************************************************\ * * Base Service operations (inactive) * \******************************************************************************/ /* These service methods are defined to avoid vtable linking errors. A more elegant alternative is to compile all code with #define SOAP_PURE_VIRTUAL = NULL which makes all base service operations pure virtual (abstract) */ int WSDualHttpBinding_USCOREICalculatorDuplexService::Clear(_mssadh__Clear *req) { return SOAP_NO_METHOD; } int WSDualHttpBinding_USCOREICalculatorDuplexService::AddTo(_mssadh__AddTo *req) { return SOAP_NO_METHOD; } int WSDualHttpBinding_USCOREICalculatorDuplexService::SubtractFrom(_mssadh__SubtractFrom *req) { return SOAP_NO_METHOD; } int WSDualHttpBinding_USCOREICalculatorDuplexService::MultiplyBy(_mssadh__MultiplyBy *req) { return SOAP_NO_METHOD; } int WSDualHttpBinding_USCOREICalculatorDuplexService::DivideBy(_mssadh__DivideBy *req) { return SOAP_NO_METHOD; } gsoap-2.8.28/gsoap/samples/wcf/WS/DualHttp/README.txt0000644000175000017500000001234712653650156021414 0ustar ellertellertINSTRUCTIONS Install the WCF samples: Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4. You should have: C:\WF_WCF_Samples\WCF\Basic\Binding\WS\DualHttp\CS Open the WS DualHttp WCF C# example client and service project in Visual Studio. Modify the configuration and source code as described below. Notes: C:> denotes the Windows command line $ denotes the Unix/Linux command line A pre-generated calculator.h gSOAP example file is included, which was generated by wsdl2h -b from the WCF's calculator service WSDL file. Use wsdl2h option -b (option /b with wsdl2h.exe) to enable duplex WS-RM and generate additional bi-directional one-way operations that are required for asynchronous request-response operations by client-side callback services (duplex mode). To enable gSOAP to use WS-ReliableMessaging 1.0 (2005) for wsDualHttp interop, we added the following line to calculator.h, which is processed by soapcpp2: #import "wsrm5.h" Note that "wsrm.h" defines WS-ReliableMessaging 1.1, but WCF supports the older 2005 version 1.0. See doc/wsrm on WS-RM plugin usage. The Makefile builds the WS-RM logic and then the app logic with soapcpp2: $ soapcpp2 -L -I../../../../import -I../../../.. -A -pwsrx ../../../../import/wsrm5.h $ soapcpp2 -L -I../../../../import -I../../../.. -a -j calculator.h $ cc -o calculator -DCB_THREAD -DWITH_WCF -DWITH_OPENSSL calculator.cpp soapC.cpp soapWSDualHttpBinding_USCOREICalculatorDuplexService.cpp soapWSDualHttpBinding_USCOREICalculatorDuplexProxy.cpp wsrxClient.cpp wsrxServer.cpp ../../../../plugin/wsrmapi.c ../../../../plugin/wsaapi.c ../../../../custom/duration.c ../../../../dom.cpp ../../../../stdsoap2.cpp The -DWITH_WCF def ensures WS-RM plugin compatibility with WCF. To enable the gSOAP client-side threaded callback server, use -DCB_THREAD. Debugging is enabled with -DDEBUG or -DDEBUG_STAMP to timestamp the logs. To connect a WCF client to a gSOAP service ------------------------------------------ In App.config set the endpoint to the server endpoint, say "10.0.1.5" over wifi, with Message Security disabled, and clientBase (for callback calls) to the current machine, say 192.168.2.2: Edit calculator.cpp to change the URIs: Compile and run the gSOAP server on port 8000 on machine "10.0.1.5": $ ./calculator 8000 Compile and run the WCF client: C:\WF_WCF_Samples\WCF\Basic\Binding\WS\DualHttp\CS\client> bin\client.exe The gSOAP server in this example is an iterative server. Therefore, SOAP_IO_KEEPALIVE is not recommended since this leads to messages being blocked on the server port. To self-host a WCF service -------------------------- Obtain the machine name or IP C:> ipconfig /all say it is 192.168.2.2. Add a Main() to self-host by adding a Program class in the WCF sample C:\WF_WCF_Samples\WCF\Basic\Binding\WS\DualHttp\CS\service using System; using System.ServiceModel; using System.Configuration; using System.ServiceModel.Description; namespace ... { ... public class Program { public static void Main() { Uri httpUrl = new Uri("http://192.168.2.2:8000/ServiceModelSamples/service"); using (ServiceHost serviceHost = new ServiceHost(typeof(CalculatorService), httpUrl)) { WSDualHttpBinding dhb = new WSDualHttpBinding(); dhb.Security.Mode = WSDualHttpSecurityMode.None; serviceHost.AddServiceEndpoint(typeof(ICalculatorDuplex), dhb, ""); ServiceMetadataBehavior smb = new ServiceMetadataBehavior(); smb.HttpGetEnabled = true; serviceHost.Description.Behaviors.Add(smb); serviceHost.Open(); Console.WriteLine("Press to terminate service."); Console.ReadLine(); } } } Under Project Properties change the Output type to Console Application to generate a service.exe. Compile and run the WCF service: C:\WF_WCF_Samples\WCF\Basic\Binding\WS\DualHttp\CS\service> bin\service.exe Use a web browser to access the service at http://192.168.2.2:8000/ServiceModelSamples/service and access the WSDL at http://192.168.2.2:8000/ServiceModelSamples/service?wsdl To run wsdl2h to generate C++ code: $ wsdl2h -b -t ../../../../typemap.dat -o calculator.h 'http://192.168.2.2:8000/ServiceModelSamples/service?wsdl' This may take some time, since the self-hosted service is an iterative web server that allows only one open connection. A pre-generated calculator.h file is included in the build directory. Note that WCF supports WS-ReliableMessaging 1.0 (2005) so we changed calculator.h as follows: #import "wsrm.h" to #import "wsrm5.h" To connect a gSOAP client to a WCF self-hosted service ------------------------------------------------------ In the gSOAP calculator.cpp, change the hosts to the WCF server host URI and the client host URI and port number: const char *serverURI = "http://192.168.2.2:8000/ServiceModelSamples/service"; const char *clientURI = "http://10.0.1.5:8001"; int clientPort = 8001; Compile and run: C:\WF_WCF_Samples\WCF\Basic\Binding\WS\DualHttp\CS\service> bin\service.exe $ ./calculator gsoap-2.8.28/gsoap/samples/wcf/Basic/0000755000175000017500000000000012653650156016652 5ustar ellertellertgsoap-2.8.28/gsoap/samples/wcf/Basic/MessageSecurity/0000755000175000017500000000000012653650156021766 5ustar ellertellertgsoap-2.8.28/gsoap/samples/wcf/Basic/MessageSecurity/servercertWCF.pem0000755000175000017500000000134012653650156025216 0ustar ellertellertBag Attributes localKeyID: 01 00 00 00 subject=/CN=10.0.1.5 issuer=/CN=Root Agency -----BEGIN CERTIFICATE----- MIIBsDCCAV6gAwIBAgIQi65mfnzMd7FImSdgjiZmeTAJBgUrDgMCHQUAMBYxFDAS BgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTEyMDYwMzAxMDAwM1oXDTM5MTIzMTIzNTk1 OVowEzERMA8GA1UEAxMIMTAuMC4xLjUwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJ AoGBANEk3zsPY0C1U32aiUejqIwP2KFnXrIB2mLfbPHs4vRh768FiY3Olr05x1bo nAVTei0ZAIv813bZ+E9EdP2JFXOTbqwb+UAWefLRjpKNQJC+BP5gH2c+472vFgmO iSc+sCncSbn3WqMt9AFrPJinA0d3/4vQ8c46eTN0vF3T8s17AgMBAAGjSzBJMEcG A1UdAQRAMD6AEBLkCS0GHR1PAI1hIdwWZGOhGDAWMRQwEgYDVQQDEwtSb290IEFn ZW5jeYIQBjdsAKoAZIoRz7jUqlw19DAJBgUrDgMCHQUAA0EAAicd/NhTpJx0uXFJ iSM7xbDkaRlevdy2uBhjgHY0qgGJxFU+O/wpx2/xUowJXmyb1IDVpS5CD7loqGK9 bX7hGw== -----END CERTIFICATE----- gsoap-2.8.28/gsoap/samples/wcf/Basic/MessageSecurity/calculator.h0000644000175000017500000011723412653650156024300 0ustar ellertellert// Reminder: Modify typemap.dat to customize the header file generated by wsdl2h /* calculator.h Generated by wsdl2h 2.8.9 from http://192.168.2.2:8000/ServiceModelSamples/service?wsdl and ../../typemap.dat 2012-05-23 00:15:28 GMT DO NOT INCLUDE THIS FILE DIRECTLY INTO YOUR PROJECT BUILDS USE THE soapcpp2-GENERATED SOURCE CODE FILES FOR YOUR PROJECT BUILDS gSOAP XML Web services tools. Copyright (C) 2001-2012 Robert van Engelen, Genivia Inc. All Rights Reserved. Part of this software is released under one of the following licenses: GPL or Genivia's license for commercial use. */ /** @page page_notes Usage Notes NOTE: - Run soapcpp2 on calculator.h to generate the SOAP/XML processing logic. Use soapcpp2 option -I to specify paths for #import To build with STL, 'stlvector.h' is imported from 'import' dir in package. Use soapcpp2 option -i to generate improved proxy and server classes. - Use wsdl2h options -c and -s to generate pure C code or C++ code without STL. - Use 'typemap.dat' to control namespace bindings and type mappings. It is strongly recommended to customize the names of the namespace prefixes generated by wsdl2h. To do so, modify the prefix bindings in the Namespaces section below and add the modified lines to 'typemap.dat' to rerun wsdl2h. - Use Doxygen (www.doxygen.org) on this file to generate documentation. - Use wsdl2h options -nname and -Nname to globally rename the prefix 'ns'. - Use wsdl2h option -d to enable DOM support for xsd:anyType. - Use wsdl2h option -g to auto-generate readers and writers for root elements. - Struct/class members serialized as XML attributes are annotated with a '@'. - Struct/class members that have a special role are annotated with a '$'. WARNING: DO NOT INCLUDE THIS FILE DIRECTLY INTO YOUR PROJECT BUILDS. USE THE SOURCE CODE FILES GENERATED BY soapcpp2 FOR YOUR PROJECT BUILDS: THE soapStub.h FILE CONTAINS THIS CONTENT WITHOUT ANNOTATIONS. LICENSE: @verbatim -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2012, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following two licenses: 1) GPL or 2) Genivia's license for commercial use. -------------------------------------------------------------------------------- 1) GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- 2) A commercial-use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- @endverbatim */ //gsoapopt w /******************************************************************************\ * * * Definitions * * http://tempuri.org/ * * * \******************************************************************************/ /******************************************************************************\ * * * Import * * * \******************************************************************************/ // STL vector containers (use option -s to remove STL dependency) #import "stlvector.h" /******************************************************************************\ * * * Schema Namespaces * * * \******************************************************************************/ /* NOTE: It is strongly recommended to customize the names of the namespace prefixes generated by wsdl2h. To do so, modify the prefix bindings below and add the modified lines to typemap.dat to rerun wsdl2h: tempuri = "http://tempuri.org/" mssammi = "http://Microsoft.Samples.MessageSecurity/Imports" mssamm = "http://Microsoft.Samples.MessageSecurity" */ #define SOAP_NAMESPACE_OF_mssammi "http://Microsoft.Samples.MessageSecurity/Imports" //gsoap mssammi schema namespace: http://Microsoft.Samples.MessageSecurity/Imports //gsoap mssammi schema form: unqualified #define SOAP_NAMESPACE_OF_mssamm "http://Microsoft.Samples.MessageSecurity" //gsoap mssamm schema namespace: http://Microsoft.Samples.MessageSecurity //gsoap mssamm schema elementForm: qualified //gsoap mssamm schema attributeForm: unqualified /******************************************************************************\ * * * Built-in Schema Types and Top-Level Elements and Attributes * * * \******************************************************************************/ /******************************************************************************\ * * * Forward Declarations * * * \******************************************************************************/ // Forward declaration of class _mssamm__Add. class _mssamm__Add; // Forward declaration of class _mssamm__AddResponse. class _mssamm__AddResponse; // Forward declaration of class _mssamm__Subtract. class _mssamm__Subtract; // Forward declaration of class _mssamm__SubtractResponse. class _mssamm__SubtractResponse; // Forward declaration of class _mssamm__Multiply. class _mssamm__Multiply; // Forward declaration of class _mssamm__MultiplyResponse. class _mssamm__MultiplyResponse; // Forward declaration of class _mssamm__Divide. class _mssamm__Divide; // Forward declaration of class _mssamm__DivideResponse. class _mssamm__DivideResponse; /******************************************************************************\ * * * Schema Types and Top-Level Elements and Attributes * * http://Microsoft.Samples.MessageSecurity/Imports * * * \******************************************************************************/ /******************************************************************************\ * * * Schema Types and Top-Level Elements and Attributes * * http://Microsoft.Samples.MessageSecurity * * * \******************************************************************************/ /******************************************************************************\ * * * Schema Complex Types and Top-Level Elements * * http://Microsoft.Samples.MessageSecurity/Imports * * * \******************************************************************************/ /******************************************************************************\ * * * Schema Complex Types and Top-Level Elements * * http://Microsoft.Samples.MessageSecurity * * * \******************************************************************************/ /// Top-level root element "http://Microsoft.Samples.MessageSecurity":Add /// "http://Microsoft.Samples.MessageSecurity":Add is a complexType. class _mssamm__Add { public: /// Element n1 of type xs:double. double* n1 0; ///< Optional element. /// Element n2 of type xs:double. double* n2 0; ///< Optional element. /// A handle to the soap struct that manages this instance (automatically set) struct soap *soap ; }; /// Top-level root element "http://Microsoft.Samples.MessageSecurity":AddResponse /// "http://Microsoft.Samples.MessageSecurity":AddResponse is a complexType. class _mssamm__AddResponse { public: /// Element AddResult of type xs:double. double* AddResult 0; ///< Optional element. /// A handle to the soap struct that manages this instance (automatically set) struct soap *soap ; }; /// Top-level root element "http://Microsoft.Samples.MessageSecurity":Subtract /// "http://Microsoft.Samples.MessageSecurity":Subtract is a complexType. class _mssamm__Subtract { public: /// Element n1 of type xs:double. double* n1 0; ///< Optional element. /// Element n2 of type xs:double. double* n2 0; ///< Optional element. /// A handle to the soap struct that manages this instance (automatically set) struct soap *soap ; }; /// Top-level root element "http://Microsoft.Samples.MessageSecurity":SubtractResponse /// "http://Microsoft.Samples.MessageSecurity":SubtractResponse is a complexType. class _mssamm__SubtractResponse { public: /// Element SubtractResult of type xs:double. double* SubtractResult 0; ///< Optional element. /// A handle to the soap struct that manages this instance (automatically set) struct soap *soap ; }; /// Top-level root element "http://Microsoft.Samples.MessageSecurity":Multiply /// "http://Microsoft.Samples.MessageSecurity":Multiply is a complexType. class _mssamm__Multiply { public: /// Element n1 of type xs:double. double* n1 0; ///< Optional element. /// Element n2 of type xs:double. double* n2 0; ///< Optional element. /// A handle to the soap struct that manages this instance (automatically set) struct soap *soap ; }; /// Top-level root element "http://Microsoft.Samples.MessageSecurity":MultiplyResponse /// "http://Microsoft.Samples.MessageSecurity":MultiplyResponse is a complexType. class _mssamm__MultiplyResponse { public: /// Element MultiplyResult of type xs:double. double* MultiplyResult 0; ///< Optional element. /// A handle to the soap struct that manages this instance (automatically set) struct soap *soap ; }; /// Top-level root element "http://Microsoft.Samples.MessageSecurity":Divide /// "http://Microsoft.Samples.MessageSecurity":Divide is a complexType. class _mssamm__Divide { public: /// Element n1 of type xs:double. double* n1 0; ///< Optional element. /// Element n2 of type xs:double. double* n2 0; ///< Optional element. /// A handle to the soap struct that manages this instance (automatically set) struct soap *soap ; }; /// Top-level root element "http://Microsoft.Samples.MessageSecurity":DivideResponse /// "http://Microsoft.Samples.MessageSecurity":DivideResponse is a complexType. class _mssamm__DivideResponse { public: /// Element DivideResult of type xs:double. double* DivideResult 0; ///< Optional element. /// A handle to the soap struct that manages this instance (automatically set) struct soap *soap ; }; /******************************************************************************\ * * * Additional Top-Level Elements * * http://Microsoft.Samples.MessageSecurity/Imports * * * \******************************************************************************/ /******************************************************************************\ * * * Additional Top-Level Attributes * * http://Microsoft.Samples.MessageSecurity/Imports * * * \******************************************************************************/ /******************************************************************************\ * * * Additional Top-Level Elements * * http://Microsoft.Samples.MessageSecurity * * * \******************************************************************************/ /******************************************************************************\ * * * Additional Top-Level Attributes * * http://Microsoft.Samples.MessageSecurity * * * \******************************************************************************/ /******************************************************************************\ * * * Services * * * \******************************************************************************/ //gsoap tempuri service name: BasicHttpBinding_USCOREICalculator //gsoap tempuri service type: ICalculator //gsoap tempuri service port: http://192.168.2.2:8000/ServiceModelSamples/service //gsoap tempuri service namespace: http://tempuri.org/ //gsoap tempuri service transport: http://schemas.xmlsoap.org/soap/http /** @mainpage CalculatorService Definitions @section CalculatorService_bindings Service Bindings - @ref BasicHttpBinding_USCOREICalculator @section CalculatorService_more More Information - @ref page_notes "Usage Notes" - @ref page_XMLDataBinding "XML Data Binding" - @ref SOAP_ENV__Header "SOAP Header Content" (when applicable) - @ref SOAP_ENV__Detail "SOAP Fault Detail Content" (when applicable) */ /** @page BasicHttpBinding_USCOREICalculator Binding "BasicHttpBinding_USCOREICalculator" @section BasicHttpBinding_USCOREICalculator_operations Operations of Binding "BasicHttpBinding_USCOREICalculator" - @ref __tempuri__Add - @ref __tempuri__Subtract - @ref __tempuri__Multiply - @ref __tempuri__Divide @section BasicHttpBinding_USCOREICalculator_ports Endpoints of Binding "BasicHttpBinding_USCOREICalculator" - http://192.168.2.2:8000/ServiceModelSamples/service @section BasicHttpBinding_USCOREICalculator_policy Policy of Binding "BasicHttpBinding_USCOREICalculator" See Section @ref BasicHttpBinding_USCOREICalculator_policy_enablers - WS-Policy applicable to the service endpoint ports: - Exactly one of the following: - All of the following: - [7.5] WS-Security Asymmetric Binding (public key) requirements: - [7.1] Security Binding Algorithm Suite requirements: - Basic256 - [7.2] WS-Security Header Layout requirements: - WS-Security headers may occur in any order (gSOAP allows this) - Initiator requirements: - [5.4.3] WS-Security X509 required: -# IncludeToken = http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/AlwaysToRecipient - An X509 Version 3 token should be used as defined in X509TokenProfile1.0 - Recipient requirements: - [5.4.3] WS-Security X509 required: -# IncludeToken = http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/Never - An X509 Version 3 token should be used as defined in X509TokenProfile1.0 - WS-Security Timestamp should be set prior to send: @code #include "plugin/wsseapi.h" soap_wsse_add_Timestamp(soap, "Timestamp", ); @endcode - WS-Security Timestamp presence and expiration verified post-receive with: @code #include "plugin/wsseapi.h" if (soap_wsse_verify_Timestamp(soap)) ...... @endcode - WS-Security Encrypt Signature @code #include "plugin/wsseapi.h" soap_wsse_add_EncryptedKey_encrypt_only(soap, , NULL, , NULL, , , "ds:Signature SOAP-ENV:Body"); @endcode - WS-Security Sign Entire Headers and Body: @code #include "plugin/wsseapi.h" soap_wsse_set_wsu_id(soap, " ..."); // list each ns:tagname used in SOAP Header soap_wsse_sign_body(soap, , , ); @endcode - [9.1] WSS: SOAP Message Security 1.0 options: - Key Identifier References - Issuer Serial References Note: use wsdl2h option -N to change the service binding prefix name */ /******************************************************************************\ * * * Service Binding * * BasicHttpBinding_USCOREICalculator * * * \******************************************************************************/ /******************************************************************************\ * * * Service Operation * * __tempuri__Add * * * \******************************************************************************/ /// Operation "__tempuri__Add" of service binding "BasicHttpBinding_USCOREICalculator" /** Operation details: - WS-Policy applicable to the request message: - Exactly one of the following: - All of the following: - [4.1.1] WS-Security Signed Parts requirements: -# Body: @code #include "plugin/wsseapi.h" soap_wsse_sign_body(soap, , , ); @endcode - [4.2.1] Security Encrypted Parts requirements: -# Body: @code #include "plugin/wsseapi.h" soap_wsse_encrypt_body(soap, , , ); @endcode - WS-Policy applicable to the response message: - Exactly one of the following: - All of the following: - [4.1.1] WS-Security Signed Parts requirements: -# Body: @code #include "plugin/wsseapi.h" soap_wsse_sign_body(soap, , , ); @endcode - [4.2.1] Security Encrypted Parts requirements: -# Body: @code #include "plugin/wsseapi.h" soap_wsse_encrypt_body(soap, , , ); @endcode - SOAP document/literal style messaging - SOAP action: "http://Microsoft.Samples.MessageSecurity/ICalculator/Add" - Addressing method action: "http://tempuri.org//ICalculator/Add" - Addressing method output action: "http://tempuri.org//ICalculator/AddResponse" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___tempuri__Add( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: _mssamm__Add* mssamm__Add, // response parameters: _mssamm__AddResponse* mssamm__AddResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __tempuri__Add( struct soap *soap, // request parameters: _mssamm__Add* mssamm__Add, // response parameters: _mssamm__AddResponse* mssamm__AddResponse ); @endcode C++ proxy class (defined in soapBasicHttpBinding_USCOREICalculatorProxy.h): @code class BasicHttpBinding_USCOREICalculatorProxy; @endcode Important: use soapcpp2 option '-i' to generate greatly improved and easy-to-use proxy classes; C++ service class (defined in soapBasicHttpBinding_USCOREICalculatorService.h): @code class BasicHttpBinding_USCOREICalculatorService; @endcode Important: use soapcpp2 option '-i' to generate greatly improved and easy-to-use service classes; */ //gsoap tempuri service method-style: Add document //gsoap tempuri service method-encoding: Add literal //gsoap tempuri service method-action: Add http://Microsoft.Samples.MessageSecurity/ICalculator/Add //gsoap tempuri service method-output-action: Add http://tempuri.org//ICalculator/AddResponse int __tempuri__Add( _mssamm__Add* mssamm__Add, ///< Request parameter _mssamm__AddResponse* mssamm__AddResponse ///< Response parameter ); /******************************************************************************\ * * * Service Operation * * __tempuri__Subtract * * * \******************************************************************************/ /// Operation "__tempuri__Subtract" of service binding "BasicHttpBinding_USCOREICalculator" /** Operation details: - WS-Policy applicable to the request message: - Exactly one of the following: - All of the following: - [4.1.1] WS-Security Signed Parts requirements: -# Body: @code #include "plugin/wsseapi.h" soap_wsse_sign_body(soap, , , ); @endcode - [4.2.1] Security Encrypted Parts requirements: -# Body: @code #include "plugin/wsseapi.h" soap_wsse_encrypt_body(soap, , , ); @endcode - WS-Policy applicable to the response message: - Exactly one of the following: - All of the following: - [4.1.1] WS-Security Signed Parts requirements: -# Body: @code #include "plugin/wsseapi.h" soap_wsse_sign_body(soap, , , ); @endcode - [4.2.1] Security Encrypted Parts requirements: -# Body: @code #include "plugin/wsseapi.h" soap_wsse_encrypt_body(soap, , , ); @endcode - SOAP document/literal style messaging - SOAP action: "http://Microsoft.Samples.MessageSecurity/ICalculator/Subtract" - Addressing method action: "http://tempuri.org//ICalculator/Subtract" - Addressing method output action: "http://tempuri.org//ICalculator/SubtractResponse" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___tempuri__Subtract( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: _mssamm__Subtract* mssamm__Subtract, // response parameters: _mssamm__SubtractResponse* mssamm__SubtractResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __tempuri__Subtract( struct soap *soap, // request parameters: _mssamm__Subtract* mssamm__Subtract, // response parameters: _mssamm__SubtractResponse* mssamm__SubtractResponse ); @endcode C++ proxy class (defined in soapBasicHttpBinding_USCOREICalculatorProxy.h): @code class BasicHttpBinding_USCOREICalculatorProxy; @endcode Important: use soapcpp2 option '-i' to generate greatly improved and easy-to-use proxy classes; C++ service class (defined in soapBasicHttpBinding_USCOREICalculatorService.h): @code class BasicHttpBinding_USCOREICalculatorService; @endcode Important: use soapcpp2 option '-i' to generate greatly improved and easy-to-use service classes; */ //gsoap tempuri service method-style: Subtract document //gsoap tempuri service method-encoding: Subtract literal //gsoap tempuri service method-action: Subtract http://Microsoft.Samples.MessageSecurity/ICalculator/Subtract //gsoap tempuri service method-output-action: Subtract http://tempuri.org//ICalculator/SubtractResponse int __tempuri__Subtract( _mssamm__Subtract* mssamm__Subtract, ///< Request parameter _mssamm__SubtractResponse* mssamm__SubtractResponse ///< Response parameter ); /******************************************************************************\ * * * Service Operation * * __tempuri__Multiply * * * \******************************************************************************/ /// Operation "__tempuri__Multiply" of service binding "BasicHttpBinding_USCOREICalculator" /** Operation details: - WS-Policy applicable to the request message: - Exactly one of the following: - All of the following: - [4.1.1] WS-Security Signed Parts requirements: -# Body: @code #include "plugin/wsseapi.h" soap_wsse_sign_body(soap, , , ); @endcode - [4.2.1] Security Encrypted Parts requirements: -# Body: @code #include "plugin/wsseapi.h" soap_wsse_encrypt_body(soap, , , ); @endcode - WS-Policy applicable to the response message: - Exactly one of the following: - All of the following: - [4.1.1] WS-Security Signed Parts requirements: -# Body: @code #include "plugin/wsseapi.h" soap_wsse_sign_body(soap, , , ); @endcode - [4.2.1] Security Encrypted Parts requirements: -# Body: @code #include "plugin/wsseapi.h" soap_wsse_encrypt_body(soap, , , ); @endcode - SOAP document/literal style messaging - SOAP action: "http://Microsoft.Samples.MessageSecurity/ICalculator/Multiply" - Addressing method action: "http://tempuri.org//ICalculator/Multiply" - Addressing method output action: "http://tempuri.org//ICalculator/MultiplyResponse" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___tempuri__Multiply( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: _mssamm__Multiply* mssamm__Multiply, // response parameters: _mssamm__MultiplyResponse* mssamm__MultiplyResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __tempuri__Multiply( struct soap *soap, // request parameters: _mssamm__Multiply* mssamm__Multiply, // response parameters: _mssamm__MultiplyResponse* mssamm__MultiplyResponse ); @endcode C++ proxy class (defined in soapBasicHttpBinding_USCOREICalculatorProxy.h): @code class BasicHttpBinding_USCOREICalculatorProxy; @endcode Important: use soapcpp2 option '-i' to generate greatly improved and easy-to-use proxy classes; C++ service class (defined in soapBasicHttpBinding_USCOREICalculatorService.h): @code class BasicHttpBinding_USCOREICalculatorService; @endcode Important: use soapcpp2 option '-i' to generate greatly improved and easy-to-use service classes; */ //gsoap tempuri service method-style: Multiply document //gsoap tempuri service method-encoding: Multiply literal //gsoap tempuri service method-action: Multiply http://Microsoft.Samples.MessageSecurity/ICalculator/Multiply //gsoap tempuri service method-output-action: Multiply http://tempuri.org//ICalculator/MultiplyResponse int __tempuri__Multiply( _mssamm__Multiply* mssamm__Multiply, ///< Request parameter _mssamm__MultiplyResponse* mssamm__MultiplyResponse ///< Response parameter ); /******************************************************************************\ * * * Service Operation * * __tempuri__Divide * * * \******************************************************************************/ /// Operation "__tempuri__Divide" of service binding "BasicHttpBinding_USCOREICalculator" /** Operation details: - WS-Policy applicable to the request message: - Exactly one of the following: - All of the following: - [4.1.1] WS-Security Signed Parts requirements: -# Body: @code #include "plugin/wsseapi.h" soap_wsse_sign_body(soap, , , ); @endcode - [4.2.1] Security Encrypted Parts requirements: -# Body: @code #include "plugin/wsseapi.h" soap_wsse_encrypt_body(soap, , , ); @endcode - WS-Policy applicable to the response message: - Exactly one of the following: - All of the following: - [4.1.1] WS-Security Signed Parts requirements: -# Body: @code #include "plugin/wsseapi.h" soap_wsse_sign_body(soap, , , ); @endcode - [4.2.1] Security Encrypted Parts requirements: -# Body: @code #include "plugin/wsseapi.h" soap_wsse_encrypt_body(soap, , , ); @endcode - SOAP document/literal style messaging - SOAP action: "http://Microsoft.Samples.MessageSecurity/ICalculator/Divide" - Addressing method action: "http://tempuri.org//ICalculator/Divide" - Addressing method output action: "http://tempuri.org//ICalculator/DivideResponse" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___tempuri__Divide( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: _mssamm__Divide* mssamm__Divide, // response parameters: _mssamm__DivideResponse* mssamm__DivideResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __tempuri__Divide( struct soap *soap, // request parameters: _mssamm__Divide* mssamm__Divide, // response parameters: _mssamm__DivideResponse* mssamm__DivideResponse ); @endcode C++ proxy class (defined in soapBasicHttpBinding_USCOREICalculatorProxy.h): @code class BasicHttpBinding_USCOREICalculatorProxy; @endcode Important: use soapcpp2 option '-i' to generate greatly improved and easy-to-use proxy classes; C++ service class (defined in soapBasicHttpBinding_USCOREICalculatorService.h): @code class BasicHttpBinding_USCOREICalculatorService; @endcode Important: use soapcpp2 option '-i' to generate greatly improved and easy-to-use service classes; */ //gsoap tempuri service method-style: Divide document //gsoap tempuri service method-encoding: Divide literal //gsoap tempuri service method-action: Divide http://Microsoft.Samples.MessageSecurity/ICalculator/Divide //gsoap tempuri service method-output-action: Divide http://tempuri.org//ICalculator/DivideResponse int __tempuri__Divide( _mssamm__Divide* mssamm__Divide, ///< Request parameter _mssamm__DivideResponse* mssamm__DivideResponse ///< Response parameter ); /** @page BasicHttpBinding_USCOREICalculator Binding "BasicHttpBinding_USCOREICalculator" @section BasicHttpBinding_USCOREICalculator_policy_enablers Policy Enablers of Binding "BasicHttpBinding_USCOREICalculator" Based on policies, this service imports wsse.h - WS-Policy reminders and enablers: - WS-Addressing 1.0 (2005/08, accepts 2004/08): @code #import "wsa5.h" // to be added to this header file for the soapcpp2 build step @endcode @code #include "plugin/wsaapi.h" soap_register_plugin(soap, soap_wsa); // register the wsa plugin in your code // See the user guide gsoap/doc/wsa/html/index.html @endcode - WS-Addressing (2004/08): @code #import "wsa.h" // to be added to this header file for the soapcpp2 build step @endcode @code #include "plugin/wsaapi.h" soap_register_plugin(soap, soap_wsa); // register the wsa plugin in your code // See the user guide gsoap/doc/wsa/html/index.html @endcode - WS-ReliableMessaging 1.1: @code #import "wsrm.h" // to be added to this header file for the soapcpp2 build step @endcode @code #include "plugin/wsrmapi.h" soap_register_plugin(soap, soap_wsa); // register the wsa plugin in your code soap_register_plugin(soap, soap_wsrm); // register the wsrm plugin in your code // See the user guide gsoap/doc/wsrm/html/index.html @endcode - WS-Security (SOAP Message Security) 1.0 (accepts 1.1): @code #import "wsse.h" // to be added to this header file for the soapcpp2 build step @endcode @code #include "plugin/wsseapi.h" soap_register_plugin(soap, soap_wsse); // register the wsse plugin in your code // See the user guide gsoap/doc/wsse/html/index.html @endcode - WS-Security (SOAP Message Security) 1.1 (accepts 1.0): @code #import "wsse11.h" // to be added to this header file for the soapcpp2 build step @endcode @code #include "plugin/wsseapi.h" soap_register_plugin(soap, soap_wsse); // register the wsse plugin in your code // See the user guide gsoap/doc/wsse/html/index.html @endcode - HTTP Digest Authentication: @code #include "plugin/httpda.h" soap_register_plugin(soap, soap_http_da); // register the HTTP DA plugin in your code // See the user guide gsoap/doc/httpda/html/index.html @endcode */ #import "wsse.h" /******************************************************************************\ * * * XML Data Binding * * * \******************************************************************************/ /** @page page_XMLDataBinding XML Data Binding SOAP/XML services use data bindings contractually bound by WSDL and auto- generated by wsdl2h and soapcpp2 (see Service Bindings). Plain data bindings are adopted from XML schemas as part of the WSDL types section or when running wsdl2h on a set of schemas to produce non-SOAP-based XML data bindings. The following readers and writers are C/C++ data type (de)serializers auto- generated by wsdl2h and soapcpp2. Run soapcpp2 on this file to generate the (de)serialization code, which is stored in soapC.c[pp]. Include "soapH.h" in your code to import these data type and function declarations. Only use the soapcpp2-generated files in your project build. Do not include the wsdl2h- generated .h file in your code. XML content can be retrieved from: - a file descriptor, using soap->recvfd = fd - a socket, using soap->socket = ... - a C++ stream, using soap->is = ... - a buffer, using the soap->frecv() callback XML content can be stored to: - a file descriptor, using soap->sendfd = fd - a socket, using soap->socket = ... - a C++ stream, using soap->os = ... - a buffer, using the soap->fsend() callback @section mssammi Top-level root elements of schema "http://Microsoft.Samples.MessageSecurity/Imports" @section mssamm Top-level root elements of schema "http://Microsoft.Samples.MessageSecurity" - @ref _mssamm__Add @code // Reader (returns SOAP_OK on success): soap_read__mssamm__Add(struct soap*, _mssamm__Add*); // Writer (returns SOAP_OK on success): soap_write__mssamm__Add(struct soap*, _mssamm__Add*); @endcode - @ref _mssamm__AddResponse @code // Reader (returns SOAP_OK on success): soap_read__mssamm__AddResponse(struct soap*, _mssamm__AddResponse*); // Writer (returns SOAP_OK on success): soap_write__mssamm__AddResponse(struct soap*, _mssamm__AddResponse*); @endcode - @ref _mssamm__Subtract @code // Reader (returns SOAP_OK on success): soap_read__mssamm__Subtract(struct soap*, _mssamm__Subtract*); // Writer (returns SOAP_OK on success): soap_write__mssamm__Subtract(struct soap*, _mssamm__Subtract*); @endcode - @ref _mssamm__SubtractResponse @code // Reader (returns SOAP_OK on success): soap_read__mssamm__SubtractResponse(struct soap*, _mssamm__SubtractResponse*); // Writer (returns SOAP_OK on success): soap_write__mssamm__SubtractResponse(struct soap*, _mssamm__SubtractResponse*); @endcode - @ref _mssamm__Multiply @code // Reader (returns SOAP_OK on success): soap_read__mssamm__Multiply(struct soap*, _mssamm__Multiply*); // Writer (returns SOAP_OK on success): soap_write__mssamm__Multiply(struct soap*, _mssamm__Multiply*); @endcode - @ref _mssamm__MultiplyResponse @code // Reader (returns SOAP_OK on success): soap_read__mssamm__MultiplyResponse(struct soap*, _mssamm__MultiplyResponse*); // Writer (returns SOAP_OK on success): soap_write__mssamm__MultiplyResponse(struct soap*, _mssamm__MultiplyResponse*); @endcode - @ref _mssamm__Divide @code // Reader (returns SOAP_OK on success): soap_read__mssamm__Divide(struct soap*, _mssamm__Divide*); // Writer (returns SOAP_OK on success): soap_write__mssamm__Divide(struct soap*, _mssamm__Divide*); @endcode - @ref _mssamm__DivideResponse @code // Reader (returns SOAP_OK on success): soap_read__mssamm__DivideResponse(struct soap*, _mssamm__DivideResponse*); // Writer (returns SOAP_OK on success): soap_write__mssamm__DivideResponse(struct soap*, _mssamm__DivideResponse*); @endcode */ /* End of calculator.h */ gsoap-2.8.28/gsoap/samples/wcf/Basic/MessageSecurity/Doxyfile0000644000175000017500000002272512653650156023504 0ustar ellertellert# Doxyfile 1.3.8 #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- PROJECT_NAME = "WCF Basic Message Security" PROJECT_NUMBER = "" OUTPUT_DIRECTORY = CREATE_SUBDIRS = NO OUTPUT_LANGUAGE = English USE_WINDOWS_ENCODING = NO BRIEF_MEMBER_DESC = YES REPEAT_BRIEF = YES ABBREVIATE_BRIEF = "The $name class" \ "The $name widget" \ "The $name file" \ is \ provides \ specifies \ contains \ represents \ a \ an \ the ALWAYS_DETAILED_SEC = NO INLINE_INHERITED_MEMB = NO FULL_PATH_NAMES = YES STRIP_FROM_PATH = /Applications/ STRIP_FROM_INC_PATH = SHORT_NAMES = NO JAVADOC_AUTOBRIEF = NO MULTILINE_CPP_IS_BRIEF = NO DETAILS_AT_TOP = NO INHERIT_DOCS = YES DISTRIBUTE_GROUP_DOC = NO TAB_SIZE = 8 ALIASES = OPTIMIZE_OUTPUT_FOR_C = NO OPTIMIZE_OUTPUT_JAVA = NO SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- EXTRACT_ALL = YES EXTRACT_PRIVATE = YES EXTRACT_STATIC = YES EXTRACT_LOCAL_CLASSES = YES EXTRACT_LOCAL_METHODS = NO HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_CLASSES = NO HIDE_FRIEND_COMPOUNDS = NO HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = NO CASE_SENSE_NAMES = NO HIDE_SCOPE_NAMES = NO SHOW_INCLUDE_FILES = YES INLINE_INFO = YES SORT_MEMBER_DOCS = YES SORT_BRIEF_DOCS = NO SORT_BY_SCOPE_NAME = NO GENERATE_TODOLIST = YES GENERATE_TESTLIST = YES GENERATE_BUGLIST = YES GENERATE_DEPRECATEDLIST= YES ENABLED_SECTIONS = MAX_INITIALIZER_LINES = 30 SHOW_USED_FILES = YES #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- QUIET = NO WARNINGS = YES WARN_IF_UNDOCUMENTED = YES WARN_IF_DOC_ERROR = YES WARN_FORMAT = "$file:$line: $text" WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- INPUT = calculator.h calculator.cpp FILE_PATTERNS = *.c \ *.cc \ *.cxx \ *.cpp \ *.c++ \ *.java \ *.ii \ *.ixx \ *.ipp \ *.i++ \ *.inl \ *.h \ *.hh \ *.hxx \ *.hpp \ *.h++ \ *.idl \ *.odl \ *.cs \ *.php \ *.php3 \ *.inc \ *.m \ *.mm \ *.C \ *.CC \ *.C++ \ *.II \ *.I++ \ *.H \ *.HH \ *.H++ \ *.CS \ *.PHP \ *.PHP3 \ *.M \ *.MM RECURSIVE = NO EXCLUDE = EXCLUDE_SYMLINKS = NO EXCLUDE_PATTERNS = EXAMPLE_PATH = EXAMPLE_PATTERNS = * EXAMPLE_RECURSIVE = NO IMAGE_PATH = INPUT_FILTER = FILTER_PATTERNS = FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- SOURCE_BROWSER = YES INLINE_SOURCES = NO STRIP_CODE_COMMENTS = YES REFERENCED_BY_RELATION = NO REFERENCES_RELATION = NO VERBATIM_HEADERS = NO #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- ALPHABETICAL_INDEX = NO COLS_IN_ALPHA_INDEX = 5 IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- GENERATE_HTML = YES HTML_OUTPUT = html HTML_FILE_EXTENSION = .html HTML_HEADER = HTML_FOOTER = HTML_STYLESHEET = HTML_ALIGN_MEMBERS = YES GENERATE_HTMLHELP = NO CHM_FILE = HHC_LOCATION = GENERATE_CHI = NO BINARY_TOC = NO TOC_EXPAND = NO DISABLE_INDEX = NO ENUM_VALUES_PER_LINE = 4 GENERATE_TREEVIEW = NO TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- GENERATE_LATEX = NO LATEX_OUTPUT = latex LATEX_CMD_NAME = latex MAKEINDEX_CMD_NAME = makeindex COMPACT_LATEX = NO PAPER_TYPE = a4wide EXTRA_PACKAGES = LATEX_HEADER = PDF_HYPERLINKS = NO USE_PDFLATEX = NO LATEX_BATCHMODE = NO LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- GENERATE_RTF = NO RTF_OUTPUT = rtf COMPACT_RTF = NO RTF_HYPERLINKS = NO RTF_STYLESHEET_FILE = RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- GENERATE_MAN = NO MAN_OUTPUT = man MAN_EXTENSION = .3 MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- GENERATE_XML = NO XML_OUTPUT = xml XML_SCHEMA = XML_DTD = XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- GENERATE_PERLMOD = NO PERLMOD_LATEX = NO PERLMOD_PRETTY = YES PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- ENABLE_PREPROCESSING = YES MACRO_EXPANSION = NO EXPAND_ONLY_PREDEF = NO SEARCH_INCLUDES = YES INCLUDE_PATH = INCLUDE_FILE_PATTERNS = PREDEFINED = EXPAND_AS_DEFINED = SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- TAGFILES = GENERATE_TAGFILE = ALLEXTERNALS = NO EXTERNAL_GROUPS = YES PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- CLASS_DIAGRAMS = NO HIDE_UNDOC_RELATIONS = YES HAVE_DOT = YES CLASS_GRAPH = YES COLLABORATION_GRAPH = YES UML_LOOK = NO TEMPLATE_RELATIONS = NO INCLUDE_GRAPH = YES INCLUDED_BY_GRAPH = YES CALL_GRAPH = NO GRAPHICAL_HIERARCHY = YES DOT_IMAGE_FORMAT = png DOT_PATH = /usr/local/bin DOTFILE_DIRS = MAX_DOT_GRAPH_WIDTH = 1024 MAX_DOT_GRAPH_HEIGHT = 1024 MAX_DOT_GRAPH_DEPTH = 1000 GENERATE_LEGEND = YES DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- SEARCHENGINE = NO gsoap-2.8.28/gsoap/samples/wcf/Basic/MessageSecurity/Makefile0000644000175000017500000000260712653650156023433 0ustar ellertellertURL=http://192.168.2.2:8000/ServiceModelSamples/service WSDL=../../../../wsdl/wsdl2h GSOAP=../../../../src/soapcpp2 SOAPH=../../../../stdsoap2.h SOAPC=../../../../stdsoap2.c SOAPCPP=../../../../stdsoap2.cpp SOAPDOMC=../../../../dom.c SOAPDOMCPP=../../../../dom.cpp TYPEMAP=../../../../typemap.dat CC=gcc -x c CPP=g++ -x c++ LIBS=-lssl -lcrypto GSFLAGS=-L -I../../../../import COFLAGS=-O2 CWFLAGS=-Wall -Wno-deprecated-declarations CIFLAGS=-I. -I../../../.. -I../../../../plugin CMFLAGS=-DWITH_DOM -DWITH_OPENSSL #CMFLAGS=-DDEBUG -DWITH_DOM -DWITH_OPENSSL CFLAGS= $(CWFLAGS) $(COFLAGS) $(CIFLAGS) $(CMFLAGS) all: calculator calculator: calculator.h calculator.cpp $(SOAPH) $(SOAPC) $(GSOAP) $(GSFLAGS) -a -j calculator.h $(CPP) $(CFLAGS) -o calculator calculator.cpp soapC.cpp soapBasicHttpBinding_USCOREICalculatorService.cpp soapBasicHttpBinding_USCOREICalculatorProxy.cpp ../../../../plugin/wsseapi.c ../../../../plugin/smdevp.c ../../../../mecevp.c $(SOAPDOMCPP) $(SOAPCPP) $(LIBS) %.cer: %.pem openssl x509 -in $< -outform der -out $@ calculator.h: $(WSDL) -t $(TYPEMAP) -o calculator.h $(URL)?wsdl .PHONY: clean distclean clean: rm -f *.o soapH.h soapStub.h soapC.* soapClient.* soapServer.* soap*Proxy.* soap*Service.* soap*Object.* distclean: rm -f *.o soapH.h soapStub.h soapC.* soapClient.* soapServer.* soap*Proxy.* soap*Service.* soap*Object.* rm -f *.xml *.nsmap *.log rm -f calculator gsoap-2.8.28/gsoap/samples/wcf/Basic/MessageSecurity/calculator.cpp0000644000175000017500000004352212653650156024631 0ustar ellertellert/* calculator.cpp WCF BasicMessageSecurity demo See the README.txt gSOAP XML Web services tools Copyright (C) 2000-2012, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under one of the following licenses: GPL, the gSOAP public license, or Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2012, Robert van Engelen, Genivia Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapBasicHttpBinding_USCOREICalculatorService.h" #include "soapBasicHttpBinding_USCOREICalculatorProxy.h" #include "BasicHttpBinding_USCOREICalculator.nsmap" #include "wsseapi.h" /* gsoap/plugin/wsseapi.h */ #define ENCRYPTION /* to enable encryption with signatures */ const char *endpoint = "http://10.0.1.5:8000/ServiceModelSamples/service"; // Set to the service endpoint X509 *srv_cert = NULL, *clt_cert = NULL; EVP_PKEY *srv_privk = NULL, *clt_privk = NULL; EVP_PKEY *srv_pubk = NULL, *clt_pubk = NULL; char srv_subject[256], clt_subject[256]; char srv_issuer[256], clt_issuer[256]; char *srv_serial = NULL, *clt_serial = NULL; static int chk_security(struct soap *soap); static int set_srv_security(struct soap *soap); static int set_clt_security(struct soap *soap); static const void *token_handler(struct soap *soap, int alg, const char *keyname, int *keylen); static int ssl_verify(int, X509_STORE_CTX*); int main(int argc, char **argv) { FILE *fd; BIGNUM *bn = BN_new(); /* init OpenSSL before any OpenSSL and crypto operations */ soap_ssl_init(); /* server's RSA private key for signing */ if ((fd = fopen("serverWCF.pem", "r"))) { srv_privk = PEM_read_PrivateKey(fd, NULL, NULL, (void*)"password"); fclose(fd); if (!srv_privk) { fprintf(stderr, "Could not read private RSA key from server.pem\n"); exit(1); } } else fprintf(stderr, "Could not read server.pem\n"); /* server's certificate with public key for encryption and signature verification */ if ((fd = fopen("servercertWCF.pem", "r"))) { srv_cert = PEM_read_X509(fd, NULL, NULL, NULL); fclose(fd); if (!srv_cert) { fprintf(stderr, "Could not read certificate from clientcert.pem\n"); exit(1); } } else fprintf(stderr, "Could not read server.pem\n"); /* server's RSA public key from the certificate */ srv_pubk = X509_get_pubkey(srv_cert); if (!srv_pubk) { fprintf(stderr, "Could not get public key from certificate\n"); exit(1); } /* server's certificate subject, issuer and serial number */ X509_NAME_oneline(X509_get_subject_name(srv_cert), srv_subject, sizeof(srv_subject)); X509_NAME_oneline(X509_get_issuer_name(srv_cert), srv_issuer, sizeof(srv_issuer)); ASN1_INTEGER_to_BN(X509_get_serialNumber(srv_cert), bn); srv_serial = BN_bn2dec(bn); fprintf(stderr, "Server certificate issuer = \"%s\"\n", srv_issuer); fprintf(stderr, "Server certificate serial = %s (%s)\n", BN_bn2hex(bn), srv_serial); /* client's RSA private key for signing */ if ((fd = fopen("clientWCF.pem", "r"))) { clt_privk = PEM_read_PrivateKey(fd, NULL, NULL, (void*)"password"); fclose(fd); if (!clt_privk) { fprintf(stderr, "Could not read private RSA key from server.pem\n"); exit(1); } } else fprintf(stderr, "Could not read server.pem\n"); /* client's certificate with public key for encryption and signature verification */ if ((fd = fopen("clientcertWCF.pem", "r"))) { clt_cert = PEM_read_X509(fd, NULL, NULL, NULL); fclose(fd); if (!clt_cert) { fprintf(stderr, "Could not read certificate from clientcert.pem\n"); exit(1); } } else fprintf(stderr, "Could not read server.pem\n"); /* client's RSA public key from the certificate */ clt_pubk = X509_get_pubkey(clt_cert); if (!clt_pubk) { fprintf(stderr, "Could not get public key from certificate\n"); exit(1); } /* client's certificate subject, issuer and serial number */ X509_NAME_oneline(X509_get_subject_name(clt_cert), clt_subject, sizeof(clt_subject)); X509_NAME_oneline(X509_get_issuer_name(clt_cert), clt_issuer, sizeof(clt_issuer)); ASN1_INTEGER_to_BN(X509_get_serialNumber(clt_cert), bn); clt_serial = BN_bn2dec(bn); fprintf(stderr, "Client certificate issuer = \"%s\"\n", clt_issuer); fprintf(stderr, "Client certificate serial = %s (%s)\n", BN_bn2hex(bn), clt_serial); OPENSSL_free(bn); if (argc >= 2) { // Service sample application int port = atoi(argv[1]); BasicHttpBinding_USCOREICalculatorService service(SOAP_XML_INDENT | SOAP_XML_CANONICAL); soap_register_plugin_arg(service.soap, soap_wsse, (void*)token_handler); service.soap->send_timeout = service.soap->recv_timeout = 10; // 10 sec /* need cacert to verify certificates */ service.soap->cafile = "clientcertWCF.pem"; service.soap->fsslverify = ssl_verify; if (!soap_valid_socket(service.bind(NULL, port, 100))) { service.soap_stream_fault(std::cerr); exit(1); } std::cerr << "Server running" << std::endl; for (;;) { soap_wsse_verify_auto(service.soap, SOAP_WSSE_IGNORE_EXTRA_REFS, NULL, 0); soap_wsse_decrypt_auto(service.soap, SOAP_MEC_ENV_DEC_AES256_CBC, srv_privk, 0); if (!soap_valid_socket(service.accept()) || service.serve()) service.soap_stream_fault(std::cerr); service.destroy(); } } else { // Client sample application BasicHttpBinding_USCOREICalculatorProxy proxy(endpoint, SOAP_XML_INDENT | SOAP_XML_CANONICAL); soap_register_plugin_arg(proxy.soap, soap_wsse, (void*)token_handler); proxy.soap->send_timeout = proxy.soap->recv_timeout = 10; // 10 sec /* need cacert to verify certificates */ proxy.soap->cafile = "servercertWCF.pem"; proxy.soap->fsslverify = ssl_verify; double n1 = 3.14, n2 = 1.41; if (set_clt_security(proxy.soap)) proxy.soap_stream_fault(std::cerr); else { _mssamm__Add areq; _mssamm__AddResponse ares; areq.n1 = &n1; areq.n2 = &n2; if (proxy.Add(&areq, &ares) == SOAP_OK && ares.AddResult && chk_security(proxy.soap) == SOAP_OK) printf("Add(%g, %g) = %g\n", *areq.n1, *areq.n2, *ares.AddResult); else proxy.soap_stream_fault(std::cerr); proxy.destroy(); } if (set_clt_security(proxy.soap)) proxy.soap_stream_fault(std::cerr); else { _mssamm__Subtract sreq; _mssamm__SubtractResponse sres; sreq.n1 = &n1; sreq.n2 = &n2; if (proxy.Subtract(&sreq, &sres) == SOAP_OK && sres.SubtractResult && chk_security(proxy.soap) == SOAP_OK) printf("Subtract(%g, %g) = %g\n", *sreq.n1, *sreq.n2, *sres.SubtractResult); else proxy.soap_stream_fault(std::cerr); proxy.destroy(); } if (set_clt_security(proxy.soap)) proxy.soap_stream_fault(std::cerr); else { _mssamm__Multiply mreq; _mssamm__MultiplyResponse mres; mreq.n1 = &n1; mreq.n2 = &n2; if (proxy.Multiply(&mreq, &mres) == SOAP_OK && mres.MultiplyResult && chk_security(proxy.soap) == SOAP_OK) printf("Multiply(%g, %g) = %g\n", *mreq.n1, *mreq.n2, *mres.MultiplyResult); else proxy.soap_stream_fault(std::cerr); proxy.destroy(); } if (set_clt_security(proxy.soap)) proxy.soap_stream_fault(std::cerr); else { _mssamm__Divide dreq; _mssamm__DivideResponse dres; dreq.n1 = &n1; dreq.n2 = &n2; if (proxy.Divide(&dreq, &dres) == SOAP_OK && dres.DivideResult && chk_security(proxy.soap) == SOAP_OK) printf("Divide(%g, %g) = %g\n", *dreq.n1, *dreq.n2, *dres.DivideResult); else proxy.soap_stream_fault(std::cerr); proxy.destroy(); } } OPENSSL_free(clt_serial); OPENSSL_free(srv_serial); return 0; } /******************************************************************************\ * * Check and set security * \******************************************************************************/ /* Check WS-Security properties of a message */ static int chk_security(struct soap *soap) { X509 *cert = soap_wsse_get_KeyInfo_SecurityTokenReferenceX509(soap); char buf[1024]; if (!cert) return soap_wsse_fault(soap, wsse__SecurityTokenUnavailable, NULL); /* Certificate must be known to us */ X509_NAME_oneline(X509_get_subject_name(cert), buf, sizeof(buf)); if (!strstr(buf, srv_subject) && !strstr(buf, clt_subject)) { fprintf(stderr, "Warning: certificate from %s is unknown\n", buf); strncat(buf, ": unrecognized subject name", sizeof(buf)-strlen(buf)-1); buf[sizeof(buf)-1] = '\0'; return soap_wsse_fault(soap, wsse__InvalidSecurityToken, buf); } /* Valid timestamp required */ if (soap_wsse_verify_Timestamp(soap)) { soap_wsse_delete_Security(soap); return soap->error; } /* Body must be signed */ if (soap_wsse_verify_body(soap)) { soap_wsse_delete_Security(soap); return soap->error; } soap_wsse_delete_Security(soap); return SOAP_OK; } /* Set WS-Security server-side properties after an operation */ static int set_srv_security(struct soap *soap) { if (soap_wsse_add_Timestamp(soap, "Time", 60) // 1 min to expire || soap_wsse_add_BinarySecurityTokenX509(soap, "X509Token", srv_cert) || soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(soap, "#X509Token") || soap_wsse_sign_body(soap, SOAP_SMD_SIGN_RSA_SHA1, srv_privk, 0) #ifdef ENCRYPTION #ifdef UNENCRYPTED_SIGNATURE || soap_wsse_add_EncryptedKey(soap, SOAP_MEC_ENV_ENC_AES256_CBC, NULL, clt_cert, NULL, clt_issuer+1, clt_serial) #else || soap_wsse_add_EncryptedKey_encrypt_only(soap, SOAP_MEC_ENV_ENC_AES256_CBC, NULL, clt_cert, NULL, clt_issuer+1, clt_serial, "ds:Signature SOAP-ENV:Body") #endif #endif ) return soap->error; return SOAP_OK; } /* Set WS-Security client-side properties before an operation */ static int set_clt_security(struct soap *soap) { // soap_wsse_set_wsu_id(soap, "ds:Signature"); // to encrypt ds:Signature if (soap_wsse_add_Timestamp(soap, "Time", 60) // 1 min to expire || soap_wsse_add_BinarySecurityTokenX509(soap, "X509Token", clt_cert) || soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(soap, "#X509Token") || soap_wsse_sign_body(soap, SOAP_SMD_SIGN_RSA_SHA1, clt_privk, 0) || soap_wsse_verify_auto(soap, SOAP_WSSE_IGNORE_EXTRA_REFS, NULL, 0) #ifdef ENCRYPTION #ifdef UNENCRYPTED_SIGNATURE || soap_wsse_add_EncryptedKey(soap, SOAP_MEC_ENV_ENC_AES256_CBC, NULL, srv_cert, NULL, srv_issuer+1, srv_serial) #else || soap_wsse_add_EncryptedKey_encrypt_only(soap, SOAP_MEC_ENV_ENC_AES256_CBC, NULL, srv_cert, NULL, srv_issuer+1, srv_serial, "ds:Signature SOAP-ENV:Body") #endif || soap_wsse_decrypt_auto(soap, SOAP_MEC_ENV_DEC_AES256_CBC, clt_privk, 0) #endif ) return soap->error; return SOAP_OK; } /******************************************************************************\ * * Service operations * \******************************************************************************/ int BasicHttpBinding_USCOREICalculatorService::Add(_mssamm__Add *Add, _mssamm__AddResponse *AddResponse) { double *res = (double*)soap_malloc(soap, sizeof(double)); if (chk_security(soap)) return soap->error; if (Add && Add->n1 && Add->n2) *res = *Add->n1 + *Add->n2; else return soap_sender_fault(soap, "Invalid data", NULL); AddResponse->AddResult = res; return set_srv_security(soap); } int BasicHttpBinding_USCOREICalculatorService::Subtract(_mssamm__Subtract *Subtract, _mssamm__SubtractResponse *SubtractResponse) { double *res = (double*)soap_malloc(soap, sizeof(double)); if (chk_security(soap)) return soap->error; if (Subtract && Subtract->n1 && Subtract->n2) *res = *Subtract->n1 - *Subtract->n2; else return soap_sender_fault(soap, "Invalid data", NULL); SubtractResponse->SubtractResult = res; return set_srv_security(soap); } int BasicHttpBinding_USCOREICalculatorService::Multiply(_mssamm__Multiply *Multiply, _mssamm__MultiplyResponse *MultiplyResponse) { double *res = (double*)soap_malloc(soap, sizeof(double)); if (chk_security(soap)) return soap->error; if (Multiply && Multiply->n1 && Multiply->n2) *res = *Multiply->n1 * *Multiply->n2; else return soap_sender_fault(soap, "Invalid data", NULL); MultiplyResponse->MultiplyResult = res; return set_srv_security(soap); } int BasicHttpBinding_USCOREICalculatorService::Divide(_mssamm__Divide *Divide, _mssamm__DivideResponse *DivideResponse) { double *res = (double*)soap_malloc(soap, sizeof(double)); if (chk_security(soap)) return soap->error; if (Divide && Divide->n1 && Divide->n2 && *Divide->n2 != 0.0) *res = *Divide->n1 / *Divide->n2; else return soap_sender_fault(soap, "Invalid data", NULL); DivideResponse->DivideResult = res; return set_srv_security(soap); } /******************************************************************************\ * * WSSE Token Handler * \******************************************************************************/ static char hmac_key[16] = /* Dummy HMAC key for signature test */ { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }; static char des_key[20] = /* Dummy 160-bit triple DES key for encryption test */ { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 }; static const void *token_handler(struct soap *soap, int alg, const char *keyname, int *keylen) { const char *ctxId; struct ds__X509IssuerSerialType *issuer; switch (alg) { case SOAP_SMD_VRFY_DSA_SHA1: case SOAP_SMD_VRFY_RSA_SHA1: case SOAP_SMD_VRFY_RSA_SHA256: case SOAP_SMD_VRFY_RSA_SHA512: if (keyname && !strcmp(keyname, "Client")) return (const void*)clt_cert; if (keyname && !strcmp(keyname, "Server")) return (const void*)srv_cert; /* Use KeyInfo/SecurityTokenReference/X509Data */ issuer = soap_wsse_get_KeyInfo_SecurityTokenReferenceX509Data(soap); if (issuer) { if (!strcmp(issuer->X509IssuerName, "CN=Root Agency") && !strcmp(issuer->X509SerialNumber, "-79441640260855276448009124614332182350")) return (const void*)clt_cert; if (!strcmp(issuer->X509IssuerName, "CN=Root Agency") && !strcmp(issuer->X509SerialNumber, "-154614137026298720537726749139640359303")) return (const void*)srv_cert; } break; case SOAP_SMD_HMAC_SHA1: /* WS-SecureConversation: get & check context token ID */ if ((keyname && !strcmp(keyname, "Shared")) || ((ctxId = soap_wsse_get_SecurityContextToken(soap)) && !strcmp(ctxId, "Context"))) { *keylen = sizeof(hmac_key); return (const void*)hmac_key; /* signature verification with secret key */ } break; case SOAP_MEC_ENV_DEC_DES_CBC: case SOAP_MEC_ENV_DEC_AES256_CBC: /* Use KeyInfo/SecurityTokenReference/X509Data */ issuer = soap_wsse_get_KeyInfo_SecurityTokenReferenceX509Data(soap); if (issuer) { if (!strcmp(issuer->X509IssuerName, "CN=Root Agency") && !strcmp(issuer->X509SerialNumber, "-79441640260855276448009124614332182350")) return (const void*)clt_cert; if (!strcmp(issuer->X509IssuerName, "CN=Root Agency") && !strcmp(issuer->X509SerialNumber, "-154614137026298720537726749139640359303")) return (const void*)srv_cert; } break; if (keyname && !strcmp(keyname, "Client")) return (const void*)clt_privk; if (keyname && !strcmp(keyname, "Server")) return (const void*)srv_privk; break; case SOAP_MEC_DEC_DES_CBC: /* WS-SecureConversation: get & check context token ID */ if ((keyname && !strcmp(keyname, "Shared")) || ((ctxId = soap_wsse_get_SecurityContextToken(soap)) && !strcmp(ctxId, "Context"))) { *keylen = sizeof(des_key); return (const void*)des_key; /* decryption with secret key */ } } fprintf(stderr, "Warning: token handler returned NULL key\n"); return NULL; /* fail */ } /******************************************************************************\ * * Optional certificate verification * \******************************************************************************/ static int ssl_verify(int ok, X509_STORE_CTX *store) { /* put certificate verification here, return 0 when fails */ return 1; } gsoap-2.8.28/gsoap/samples/wcf/Basic/MessageSecurity/README.txt0000644000175000017500000000704712653650156023474 0ustar ellertellert INSTRUCTIONS Install the WCF samples: Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4. You should have: C:\WF_WCF_Samples\WCF\Basic\Binding\Basic\MessageSecurity\CS Open the Basic MessageSecurity WCF C# example client and service project in Visual Studio. Modify the configuration and source code as described below. Notes: C:> denotes the Windows command line $ denotes the Unix/Linux command line To enable gSOAP to use WS-Security for BasicMessageSecurity interop, add to the .h file to be processed by soapcpp2: #import "wsse.h" See doc/wsse for instructions. Generating keys and certificates -------------------------------- First create the client key and certificate: C:> makecert -sk myKey -n "CN=client.com" -ss My -pe Open the MMC console C:> mmc Add the certificates snap-in to MMC if not already added, by pressing CTRL-M. In Console Root/Certificates: select under Personal/Certificates "client.com" Export "client.com" by right-clicking, All Tasks/Export... Export "client.com" as "client.pfx", make sure you export the private key. Copy client.pfx to the other machine for conversion to PEM format. To create a PEM-formatted private key: $ openssl pkcs12 -in client.pfx -nocerts -out clientWCF.pem $ openssl rsa -in clientWCF.pem -text -noout To create a PEM-formatted certificate: $ openssl pkcs12 -in client.pfx -clcerts -nokeys -out clientcertWCF.pem $ openssl x509 -in clientcertWCF.pem -text -noout Obtain the host name of the machine on which the service runs, say we use a wifi address "10.0.1.5" for testing. Repeat for the server key: C:> makecert -sk myKey -n "CN=10.0.1.5" -ss TrustedPeople -pe Export certificate 10.0.1.5 under MMC Trusted People/Certificates to pfx format as described above, and convert the key and certificate to PEM format: $ openssl pkcs12 -in server.pfx -nocerts -out serverWCF.pem $ openssl rsa -in serverWCF.pem -text -noout $ openssl pkcs12 -in server.pfx -clcerts -nokeys -out servercertWCF.pem $ openssl x509 -in servercertWCF.pem -text -noout To connect a WCF client to a gSOAP service ------------------------------------------ In App.config of the WCF client, change the , , and elements: ... To connect a gSOAP client to a WCF service ------------------------------------------ Follow instructions to set up a WCF service using the keys and certificates, where the server certificate should use the machine's host name or IP. In Web.config (or App.config) of the service, change the element: Supported algorthm suites ------------------------- All Basic suites with Rsa15 for keywrap. The rsa-oaep-mgf1p keywrap algorithm is currently not supported, but possibly will be supported in future releases. gsoap-2.8.28/gsoap/samples/wcf/Basic/MessageSecurity/clientWCF.pem0000755000175000017500000000221712653650156024314 0ustar ellertellertBag Attributes localKeyID: 01 00 00 00 friendlyName: 00cc75b6-e684-45a1-88c8-6d76e553b011 Microsoft CSP Name: Microsoft Strong Cryptographic Provider Key Attributes X509v3 Key Usage: 10 -----BEGIN RSA PRIVATE KEY----- Proc-Type: 4,ENCRYPTED DEK-Info: DES-EDE3-CBC,58A6BDE020668E33 8KvjLV8TyangGo6sZFl3g29hLJJgHNxFVsmZfOo8Z23rwANdnYNrkwYlGXmVMrGa dtaZ198XQsmPS/yhY5KvM/i4rxtBSkAV+ri1KMk8RYPAM+NxXvz6a5Mm3DjyY0TS Q6NN+UyEBHGdyY9Bh6GJDpbjzFPk0f8+pEGN9OdLU+rQ2wsZ0aOl3RitOVhaj6XE agFsawHfGlg2lYpBu0uh8xzI864r9P9NqTpPj97wzCLj168tsrvOvh3jt77gdoUE 7kH3R80cYfFflldFFpbDtFlycauBntet2xy42KUkGKEPQ13l+fECBpYLSqVdonXN oR7+n00wBNlC3xJEogaVhgDpyF6e+BUfFiGX8B+paodh3C9RKLRHZMxXxAw19lzz 5ufqE9X+PQT2jmS0lR+xGosJaWRXA0iFK7RoZdvocLmLjuAggBa44SlK+AO0oiTR +SZTrzr1nxRnfjPrako25ZABbgXWb64u57k4M+HSVDcLh6PzkwnYKz48lm4g5Kvr M5BkBKzPg4804/uTQWnlXeFRTxnfrJ5ecqYA8x7yh2tTnNb9GMGGzE3ahl/6UIvf tQ4SLKm+USElryTyP4HX75GAQPNfn8mvvP51Z/GGRgMmYISLwnr1rYq/8cJJF4qc zp7Czv/7G7un0mBrSOxT9YyaUTgm+EXZkeJ7QO62SkjQclZ+OotKT+A1FwsLsaYB q/4aYlQeeTfUGgxY1d50Z6U3KkVM/YRG+g57gXBMdhwnEZoR2gN4hNHIFDFVV5L9 dlTPVqW9cORYYtN4O+yRxNDBcHxBoNmjxukiYaxeqx3Im9oMcutVeA== -----END RSA PRIVATE KEY----- gsoap-2.8.28/gsoap/samples/wcf/Basic/MessageSecurity/clientcertWCF.pem0000755000175000017500000000134212653650156025170 0ustar ellertellertBag Attributes localKeyID: 01 00 00 00 subject=/CN=client.com issuer=/CN=Root Agency -----BEGIN CERTIFICATE----- MIIBsjCCAWCgAwIBAgIQxDwYvAZ4d5lMASIy4YSQsjAJBgUrDgMCHQUAMBYxFDAS BgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTEyMDYwMzAxMDAwNFoXDTM5MTIzMTIzNTk1 OVowFTETMBEGA1UEAxMKY2xpZW50LmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAw gYkCgYEAhiVObPitp+2xlTe363+Ax0RR/VWDph852F/Mj9RwXTtc9S6CnToUu2lA UvubGnu6+lMfK+xlNBMU5kaAs7fyEIJqgvDsZNxb07obiI6sNqWXV3nwiasZPyGg KLeMhCZafpxqCf3UK51/d3PgXbAC0W9qsx1pgYNBlLUloGcjVtkCAwEAAaNLMEkw RwYDVR0BBEAwPoAQEuQJLQYdHU8AjWEh3BZkY6EYMBYxFDASBgNVBAMTC1Jvb3Qg QWdlbmN5ghAGN2wAqgBkihHPuNSqXDX0MAkGBSsOAwIdBQADQQAcmxkSVMPVGrxw HYBLx1hSx2mMYDG6yM3SvIhKRP365pQLSYuhFADrWqxKn+MhpQ/6EDgUzq5aX4/6 Y2AR2ZC4 -----END CERTIFICATE----- gsoap-2.8.28/gsoap/samples/wcf/Basic/MessageSecurity/serverWCF.pem0000755000175000017500000000227012653650156024343 0ustar ellertellertBag Attributes Microsoft Local Key set: localKeyID: 01 00 00 00 friendlyName: 9920b063-8731-4a54-992d-84314f18e447 Microsoft CSP Name: Microsoft Strong Cryptographic Provider Key Attributes X509v3 Key Usage: 10 -----BEGIN RSA PRIVATE KEY----- Proc-Type: 4,ENCRYPTED DEK-Info: DES-EDE3-CBC,ECC683394369A286 6hD+kz2CBIgNpHsynRtBhRXjydr5acyDpuRzA1GBRfifPw/UPu7clqRPSFDH5CWk evxTHHL2XZqVmyjhQiSw3o4QNXM7quMx5gdZx35P7UUcz3ofhcrzo7yCOKbNvamA p8O4GJ61p78yY5TWmpX/Z6guPNeofeS9oYeyJlkjBccs9tHVHdH/m6YNW1Diayyt 1PRiDsLxeCtZK4mBL2zL/VjKhRma//z3gzZq/6J+bMbzpo3Bi2bJlFTlRCFgeNyh 4aCrAb7FLg3AIN6hywBKQnwklDdkNaw8ZizTvCIGYMKGD1hW6FVMjBZuGyZnTH/b 5yCYXelbp8ZMWQMo1ojJbVU55S93K4uHPmjRYdKDah+jqiiLDNMqWop1/OTLFGu5 DMexxp+DF4274N7Lp6lKSOxQVvCQTghyXH+1dQ3jEXahxg6myYv70KsvAecStnpy G45QnaiFzRJKLhk1MhCnHjcH42J6rFiilpDzCiNzKBCEZxG6wHfj89ZauSA9iGuf KEOqloX3LcB6RX/EQ5oibWNjBkJzSY8l+X8ZQG3SG8MSgOkzIquFlEgcjzd+eFRP Tw+nHVDguyXekoLxO1ECthAsjdQ/gSHBjBNhannE/kvc+erT+IGtZDZl3ZATuRfq 08condry+9VnTPUg6gOAF75lIwLwacdCaY9Tj9kkuaE4GagTeKOlreACxQVGupDw 1/vgbwNaMeUu46jKfeEPqFCKZfW7b8XzfB08JQSYF7byu3Z8fOAaN7YcUj90RF2N W9+PtxnT2OnQZ4rtCR+7m/nz9IzO/+19nMlnY358FZlrJHAhEQkNAw== -----END RSA PRIVATE KEY----- gsoap-2.8.28/gsoap/samples/wcf/Basic/TransportSecurity/0000755000175000017500000000000012653650156022376 5ustar ellertellertgsoap-2.8.28/gsoap/samples/wcf/Basic/TransportSecurity/dh512.pem0000644000175000017500000000023412653650156023723 0ustar ellertellert-----BEGIN DH PARAMETERS----- MEYCQQDYbhGNVV6GoxOPsX+rBNGmgfJqh7+e1PFj8IketLqWtA2gkXAB9PKxrkDQ jvuEoXE4A6PVPfstmP/Ef4uNfCqLAgEC -----END DH PARAMETERS----- gsoap-2.8.28/gsoap/samples/wcf/Basic/TransportSecurity/calculator.h0000644000175000017500000010430612653650156024704 0ustar ellertellert// Reminder: Modify typemap.dat to customize the header file generated by wsdl2h /* calculator.h Generated by wsdl2h 2.8.9 from http://192.168.2.2:8000/ServiceModelSamples/service?wsdl and ../../typemap.dat 2012-05-22 19:10:09 GMT DO NOT INCLUDE THIS FILE DIRECTLY INTO YOUR PROJECT BUILDS USE THE soapcpp2-GENERATED SOURCE CODE FILES FOR YOUR PROJECT BUILDS gSOAP XML Web services tools. Copyright (C) 2001-2012 Robert van Engelen, Genivia Inc. All Rights Reserved. Part of this software is released under one of the following licenses: GPL or Genivia's license for commercial use. */ /** @page page_notes Usage Notes NOTE: - Run soapcpp2 on calculator.h to generate the SOAP/XML processing logic. Use soapcpp2 option -I to specify paths for #import To build with STL, 'stlvector.h' is imported from 'import' dir in package. Use soapcpp2 option -i to generate improved proxy and server classes. - Use wsdl2h options -c and -s to generate pure C code or C++ code without STL. - Use 'typemap.dat' to control namespace bindings and type mappings. It is strongly recommended to customize the names of the namespace prefixes generated by wsdl2h. To do so, modify the prefix bindings in the Namespaces section below and add the modified lines to 'typemap.dat' to rerun wsdl2h. - Use Doxygen (www.doxygen.org) on this file to generate documentation. - Use wsdl2h options -nname and -Nname to globally rename the prefix 'ns'. - Use wsdl2h option -d to enable DOM support for xsd:anyType. - Use wsdl2h option -g to auto-generate readers and writers for root elements. - Struct/class members serialized as XML attributes are annotated with a '@'. - Struct/class members that have a special role are annotated with a '$'. WARNING: DO NOT INCLUDE THIS FILE DIRECTLY INTO YOUR PROJECT BUILDS. USE THE SOURCE CODE FILES GENERATED BY soapcpp2 FOR YOUR PROJECT BUILDS: THE soapStub.h FILE CONTAINS THIS CONTENT WITHOUT ANNOTATIONS. LICENSE: @verbatim -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2012, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following two licenses: 1) GPL or 2) Genivia's license for commercial use. -------------------------------------------------------------------------------- 1) GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- 2) A commercial-use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- @endverbatim */ //gsoapopt w /******************************************************************************\ * * * Definitions * * http://tempuri.org/ * * * \******************************************************************************/ /******************************************************************************\ * * * Import * * * \******************************************************************************/ // STL vector containers (use option -s to remove STL dependency) #import "stlvector.h" /******************************************************************************\ * * * Schema Namespaces * * * \******************************************************************************/ /* NOTE: It is strongly recommended to customize the names of the namespace prefixes generated by wsdl2h. To do so, modify the prefix bindings below and add the modified lines to typemap.dat to rerun wsdl2h: tempuri = "http://tempuri.org/" mssamti = "http://Microsoft.Samples.TransportSecurity/Imports" mssamt = "http://Microsoft.Samples.TransportSecurity" */ #define SOAP_NAMESPACE_OF_mssamti "http://Microsoft.Samples.TransportSecurity/Imports" //gsoap mssamti schema namespace: http://Microsoft.Samples.TransportSecurity/Imports //gsoap mssamti schema form: unqualified #define SOAP_NAMESPACE_OF_mssamt "http://Microsoft.Samples.TransportSecurity" //gsoap mssamt schema namespace: http://Microsoft.Samples.TransportSecurity //gsoap mssamt schema elementForm: qualified //gsoap mssamt schema attributeForm: unqualified /******************************************************************************\ * * * Built-in Schema Types and Top-Level Elements and Attributes * * * \******************************************************************************/ /******************************************************************************\ * * * Forward Declarations * * * \******************************************************************************/ // Forward declaration of class _mssamt__Add. class _mssamt__Add; // Forward declaration of class _mssamt__AddResponse. class _mssamt__AddResponse; // Forward declaration of class _mssamt__Subtract. class _mssamt__Subtract; // Forward declaration of class _mssamt__SubtractResponse. class _mssamt__SubtractResponse; // Forward declaration of class _mssamt__Multiply. class _mssamt__Multiply; // Forward declaration of class _mssamt__MultiplyResponse. class _mssamt__MultiplyResponse; // Forward declaration of class _mssamt__Divide. class _mssamt__Divide; // Forward declaration of class _mssamt__DivideResponse. class _mssamt__DivideResponse; /******************************************************************************\ * * * Schema Types and Top-Level Elements and Attributes * * http://Microsoft.Samples.TransportSecurity/Imports * * * \******************************************************************************/ /******************************************************************************\ * * * Schema Types and Top-Level Elements and Attributes * * http://Microsoft.Samples.TransportSecurity * * * \******************************************************************************/ /******************************************************************************\ * * * Schema Complex Types and Top-Level Elements * * http://Microsoft.Samples.TransportSecurity/Imports * * * \******************************************************************************/ /******************************************************************************\ * * * Schema Complex Types and Top-Level Elements * * http://Microsoft.Samples.TransportSecurity * * * \******************************************************************************/ /// Top-level root element "http://Microsoft.Samples.TransportSecurity":Add /// "http://Microsoft.Samples.TransportSecurity":Add is a complexType. class _mssamt__Add { public: /// Element n1 of type xs:double. double* n1 0; ///< Optional element. /// Element n2 of type xs:double. double* n2 0; ///< Optional element. /// A handle to the soap struct that manages this instance (automatically set) struct soap *soap ; }; /// Top-level root element "http://Microsoft.Samples.TransportSecurity":AddResponse /// "http://Microsoft.Samples.TransportSecurity":AddResponse is a complexType. class _mssamt__AddResponse { public: /// Element AddResult of type xs:double. double* AddResult 0; ///< Optional element. /// A handle to the soap struct that manages this instance (automatically set) struct soap *soap ; }; /// Top-level root element "http://Microsoft.Samples.TransportSecurity":Subtract /// "http://Microsoft.Samples.TransportSecurity":Subtract is a complexType. class _mssamt__Subtract { public: /// Element n1 of type xs:double. double* n1 0; ///< Optional element. /// Element n2 of type xs:double. double* n2 0; ///< Optional element. /// A handle to the soap struct that manages this instance (automatically set) struct soap *soap ; }; /// Top-level root element "http://Microsoft.Samples.TransportSecurity":SubtractResponse /// "http://Microsoft.Samples.TransportSecurity":SubtractResponse is a complexType. class _mssamt__SubtractResponse { public: /// Element SubtractResult of type xs:double. double* SubtractResult 0; ///< Optional element. /// A handle to the soap struct that manages this instance (automatically set) struct soap *soap ; }; /// Top-level root element "http://Microsoft.Samples.TransportSecurity":Multiply /// "http://Microsoft.Samples.TransportSecurity":Multiply is a complexType. class _mssamt__Multiply { public: /// Element n1 of type xs:double. double* n1 0; ///< Optional element. /// Element n2 of type xs:double. double* n2 0; ///< Optional element. /// A handle to the soap struct that manages this instance (automatically set) struct soap *soap ; }; /// Top-level root element "http://Microsoft.Samples.TransportSecurity":MultiplyResponse /// "http://Microsoft.Samples.TransportSecurity":MultiplyResponse is a complexType. class _mssamt__MultiplyResponse { public: /// Element MultiplyResult of type xs:double. double* MultiplyResult 0; ///< Optional element. /// A handle to the soap struct that manages this instance (automatically set) struct soap *soap ; }; /// Top-level root element "http://Microsoft.Samples.TransportSecurity":Divide /// "http://Microsoft.Samples.TransportSecurity":Divide is a complexType. class _mssamt__Divide { public: /// Element n1 of type xs:double. double* n1 0; ///< Optional element. /// Element n2 of type xs:double. double* n2 0; ///< Optional element. /// A handle to the soap struct that manages this instance (automatically set) struct soap *soap ; }; /// Top-level root element "http://Microsoft.Samples.TransportSecurity":DivideResponse /// "http://Microsoft.Samples.TransportSecurity":DivideResponse is a complexType. class _mssamt__DivideResponse { public: /// Element DivideResult of type xs:double. double* DivideResult 0; ///< Optional element. /// A handle to the soap struct that manages this instance (automatically set) struct soap *soap ; }; /******************************************************************************\ * * * Additional Top-Level Elements * * http://Microsoft.Samples.TransportSecurity/Imports * * * \******************************************************************************/ /******************************************************************************\ * * * Additional Top-Level Attributes * * http://Microsoft.Samples.TransportSecurity/Imports * * * \******************************************************************************/ /******************************************************************************\ * * * Additional Top-Level Elements * * http://Microsoft.Samples.TransportSecurity * * * \******************************************************************************/ /******************************************************************************\ * * * Additional Top-Level Attributes * * http://Microsoft.Samples.TransportSecurity * * * \******************************************************************************/ /******************************************************************************\ * * * Services * * * \******************************************************************************/ //gsoap tempuri service name: BasicHttpBinding_USCOREICalculator //gsoap tempuri service type: ICalculator //gsoap tempuri service port: https://192.168.2.2:8000/ServiceModelSamples/service //gsoap tempuri service namespace: http://tempuri.org/ //gsoap tempuri service transport: http://schemas.xmlsoap.org/soap/http /** @mainpage CalculatorService Definitions @section CalculatorService_bindings Service Bindings - @ref BasicHttpBinding_USCOREICalculator @section CalculatorService_more More Information - @ref page_notes "Usage Notes" - @ref page_XMLDataBinding "XML Data Binding" - @ref SOAP_ENV__Header "SOAP Header Content" (when applicable) - @ref SOAP_ENV__Detail "SOAP Fault Detail Content" (when applicable) */ /** @page BasicHttpBinding_USCOREICalculator Binding "BasicHttpBinding_USCOREICalculator" @section BasicHttpBinding_USCOREICalculator_operations Operations of Binding "BasicHttpBinding_USCOREICalculator" - @ref __tempuri__Add - @ref __tempuri__Subtract - @ref __tempuri__Multiply - @ref __tempuri__Divide @section BasicHttpBinding_USCOREICalculator_ports Endpoints of Binding "BasicHttpBinding_USCOREICalculator" - http://192.168.2.2:8000/ServiceModelSamples/service Note: use wsdl2h option -N to change the service binding prefix name */ /******************************************************************************\ * * * Service Binding * * BasicHttpBinding_USCOREICalculator * * * \******************************************************************************/ /******************************************************************************\ * * * Service Operation * * __tempuri__Add * * * \******************************************************************************/ /// Operation "__tempuri__Add" of service binding "BasicHttpBinding_USCOREICalculator" /** Operation details: - SOAP document/literal style messaging - SOAP action: "http://Microsoft.Samples.TransportSecurity/ICalculator/Add" - Addressing method action: "http://tempuri.org//ICalculator/Add" - Addressing method output action: "http://tempuri.org//ICalculator/AddResponse" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___tempuri__Add( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: _mssamt__Add* mssamt__Add, // response parameters: _mssamt__AddResponse* mssamt__AddResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __tempuri__Add( struct soap *soap, // request parameters: _mssamt__Add* mssamt__Add, // response parameters: _mssamt__AddResponse* mssamt__AddResponse ); @endcode C++ proxy class (defined in soapBasicHttpBinding_USCOREICalculatorProxy.h): @code class BasicHttpBinding_USCOREICalculatorProxy; @endcode Important: use soapcpp2 option '-i' to generate greatly improved and easy-to-use proxy classes; C++ service class (defined in soapBasicHttpBinding_USCOREICalculatorService.h): @code class BasicHttpBinding_USCOREICalculatorService; @endcode Important: use soapcpp2 option '-i' to generate greatly improved and easy-to-use service classes; */ //gsoap tempuri service method-style: Add document //gsoap tempuri service method-encoding: Add literal //gsoap tempuri service method-action: Add http://Microsoft.Samples.TransportSecurity/ICalculator/Add //gsoap tempuri service method-output-action: Add http://tempuri.org//ICalculator/AddResponse int __tempuri__Add( _mssamt__Add* mssamt__Add, ///< Request parameter _mssamt__AddResponse* mssamt__AddResponse ///< Response parameter ); /******************************************************************************\ * * * Service Operation * * __tempuri__Subtract * * * \******************************************************************************/ /// Operation "__tempuri__Subtract" of service binding "BasicHttpBinding_USCOREICalculator" /** Operation details: - SOAP document/literal style messaging - SOAP action: "http://Microsoft.Samples.TransportSecurity/ICalculator/Subtract" - Addressing method action: "http://tempuri.org//ICalculator/Subtract" - Addressing method output action: "http://tempuri.org//ICalculator/SubtractResponse" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___tempuri__Subtract( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: _mssamt__Subtract* mssamt__Subtract, // response parameters: _mssamt__SubtractResponse* mssamt__SubtractResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __tempuri__Subtract( struct soap *soap, // request parameters: _mssamt__Subtract* mssamt__Subtract, // response parameters: _mssamt__SubtractResponse* mssamt__SubtractResponse ); @endcode C++ proxy class (defined in soapBasicHttpBinding_USCOREICalculatorProxy.h): @code class BasicHttpBinding_USCOREICalculatorProxy; @endcode Important: use soapcpp2 option '-i' to generate greatly improved and easy-to-use proxy classes; C++ service class (defined in soapBasicHttpBinding_USCOREICalculatorService.h): @code class BasicHttpBinding_USCOREICalculatorService; @endcode Important: use soapcpp2 option '-i' to generate greatly improved and easy-to-use service classes; */ //gsoap tempuri service method-style: Subtract document //gsoap tempuri service method-encoding: Subtract literal //gsoap tempuri service method-action: Subtract http://Microsoft.Samples.TransportSecurity/ICalculator/Subtract //gsoap tempuri service method-output-action: Subtract http://tempuri.org//ICalculator/SubtractResponse int __tempuri__Subtract( _mssamt__Subtract* mssamt__Subtract, ///< Request parameter _mssamt__SubtractResponse* mssamt__SubtractResponse ///< Response parameter ); /******************************************************************************\ * * * Service Operation * * __tempuri__Multiply * * * \******************************************************************************/ /// Operation "__tempuri__Multiply" of service binding "BasicHttpBinding_USCOREICalculator" /** Operation details: - SOAP document/literal style messaging - SOAP action: "http://Microsoft.Samples.TransportSecurity/ICalculator/Multiply" - Addressing method action: "http://tempuri.org//ICalculator/Multiply" - Addressing method output action: "http://tempuri.org//ICalculator/MultiplyResponse" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___tempuri__Multiply( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: _mssamt__Multiply* mssamt__Multiply, // response parameters: _mssamt__MultiplyResponse* mssamt__MultiplyResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __tempuri__Multiply( struct soap *soap, // request parameters: _mssamt__Multiply* mssamt__Multiply, // response parameters: _mssamt__MultiplyResponse* mssamt__MultiplyResponse ); @endcode C++ proxy class (defined in soapBasicHttpBinding_USCOREICalculatorProxy.h): @code class BasicHttpBinding_USCOREICalculatorProxy; @endcode Important: use soapcpp2 option '-i' to generate greatly improved and easy-to-use proxy classes; C++ service class (defined in soapBasicHttpBinding_USCOREICalculatorService.h): @code class BasicHttpBinding_USCOREICalculatorService; @endcode Important: use soapcpp2 option '-i' to generate greatly improved and easy-to-use service classes; */ //gsoap tempuri service method-style: Multiply document //gsoap tempuri service method-encoding: Multiply literal //gsoap tempuri service method-action: Multiply http://Microsoft.Samples.TransportSecurity/ICalculator/Multiply //gsoap tempuri service method-output-action: Multiply http://tempuri.org//ICalculator/MultiplyResponse int __tempuri__Multiply( _mssamt__Multiply* mssamt__Multiply, ///< Request parameter _mssamt__MultiplyResponse* mssamt__MultiplyResponse ///< Response parameter ); /******************************************************************************\ * * * Service Operation * * __tempuri__Divide * * * \******************************************************************************/ /// Operation "__tempuri__Divide" of service binding "BasicHttpBinding_USCOREICalculator" /** Operation details: - SOAP document/literal style messaging - SOAP action: "http://Microsoft.Samples.TransportSecurity/ICalculator/Divide" - Addressing method action: "http://tempuri.org//ICalculator/Divide" - Addressing method output action: "http://tempuri.org//ICalculator/DivideResponse" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___tempuri__Divide( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: _mssamt__Divide* mssamt__Divide, // response parameters: _mssamt__DivideResponse* mssamt__DivideResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __tempuri__Divide( struct soap *soap, // request parameters: _mssamt__Divide* mssamt__Divide, // response parameters: _mssamt__DivideResponse* mssamt__DivideResponse ); @endcode C++ proxy class (defined in soapBasicHttpBinding_USCOREICalculatorProxy.h): @code class BasicHttpBinding_USCOREICalculatorProxy; @endcode Important: use soapcpp2 option '-i' to generate greatly improved and easy-to-use proxy classes; C++ service class (defined in soapBasicHttpBinding_USCOREICalculatorService.h): @code class BasicHttpBinding_USCOREICalculatorService; @endcode Important: use soapcpp2 option '-i' to generate greatly improved and easy-to-use service classes; */ //gsoap tempuri service method-style: Divide document //gsoap tempuri service method-encoding: Divide literal //gsoap tempuri service method-action: Divide http://Microsoft.Samples.TransportSecurity/ICalculator/Divide //gsoap tempuri service method-output-action: Divide http://tempuri.org//ICalculator/DivideResponse int __tempuri__Divide( _mssamt__Divide* mssamt__Divide, ///< Request parameter _mssamt__DivideResponse* mssamt__DivideResponse ///< Response parameter ); /** @page BasicHttpBinding_USCOREICalculator Binding "BasicHttpBinding_USCOREICalculator" @section BasicHttpBinding_USCOREICalculator_policy_enablers Policy Enablers of Binding "BasicHttpBinding_USCOREICalculator" Based on policies, this service imports - WS-Policy reminders and enablers: - WS-Addressing 1.0 (2005/08, accepts 2004/08): @code #import "wsa5.h" // to be added to this header file for the soapcpp2 build step @endcode @code #include "plugin/wsaapi.h" soap_register_plugin(soap, soap_wsa); // register the wsa plugin in your code // See the user guide gsoap/doc/wsa/html/index.html @endcode - WS-Addressing (2004/08): @code #import "wsa.h" // to be added to this header file for the soapcpp2 build step @endcode @code #include "plugin/wsaapi.h" soap_register_plugin(soap, soap_wsa); // register the wsa plugin in your code // See the user guide gsoap/doc/wsa/html/index.html @endcode - WS-ReliableMessaging 1.1: @code #import "wsrm.h" // to be added to this header file for the soapcpp2 build step @endcode @code #include "plugin/wsrmapi.h" soap_register_plugin(soap, soap_wsa); // register the wsa plugin in your code soap_register_plugin(soap, soap_wsrm); // register the wsrm plugin in your code // See the user guide gsoap/doc/wsrm/html/index.html @endcode - WS-Security (SOAP Message Security) 1.0 (accepts 1.1): @code #import "wsse.h" // to be added to this header file for the soapcpp2 build step @endcode @code #include "plugin/wsseapi.h" soap_register_plugin(soap, soap_wsse); // register the wsse plugin in your code // See the user guide gsoap/doc/wsse/html/index.html @endcode - WS-Security (SOAP Message Security) 1.1 (accepts 1.0): @code #import "wsse11.h" // to be added to this header file for the soapcpp2 build step @endcode @code #include "plugin/wsseapi.h" soap_register_plugin(soap, soap_wsse); // register the wsse plugin in your code // See the user guide gsoap/doc/wsse/html/index.html @endcode - HTTP Digest Authentication: @code #include "plugin/httpda.h" soap_register_plugin(soap, soap_http_da); // register the HTTP DA plugin in your code // See the user guide gsoap/doc/httpda/html/index.html @endcode */ /******************************************************************************\ * * * XML Data Binding * * * \******************************************************************************/ /** @page page_XMLDataBinding XML Data Binding SOAP/XML services use data bindings contractually bound by WSDL and auto- generated by wsdl2h and soapcpp2 (see Service Bindings). Plain data bindings are adopted from XML schemas as part of the WSDL types section or when running wsdl2h on a set of schemas to produce non-SOAP-based XML data bindings. The following readers and writers are C/C++ data type (de)serializers auto- generated by wsdl2h and soapcpp2. Run soapcpp2 on this file to generate the (de)serialization code, which is stored in soapC.c[pp]. Include "soapH.h" in your code to import these data type and function declarations. Only use the soapcpp2-generated files in your project build. Do not include the wsdl2h- generated .h file in your code. XML content can be retrieved from: - a file descriptor, using soap->recvfd = fd - a socket, using soap->socket = ... - a C++ stream, using soap->is = ... - a buffer, using the soap->frecv() callback XML content can be stored to: - a file descriptor, using soap->sendfd = fd - a socket, using soap->socket = ... - a C++ stream, using soap->os = ... - a buffer, using the soap->fsend() callback @section mssamti Top-level root elements of schema "http://Microsoft.Samples.TransportSecurity/Imports" @section mssamt Top-level root elements of schema "http://Microsoft.Samples.TransportSecurity" - @ref _mssamt__Add @code // Reader (returns SOAP_OK on success): soap_read__mssamt__Add(struct soap*, _mssamt__Add*); // Writer (returns SOAP_OK on success): soap_write__mssamt__Add(struct soap*, _mssamt__Add*); @endcode - @ref _mssamt__AddResponse @code // Reader (returns SOAP_OK on success): soap_read__mssamt__AddResponse(struct soap*, _mssamt__AddResponse*); // Writer (returns SOAP_OK on success): soap_write__mssamt__AddResponse(struct soap*, _mssamt__AddResponse*); @endcode - @ref _mssamt__Subtract @code // Reader (returns SOAP_OK on success): soap_read__mssamt__Subtract(struct soap*, _mssamt__Subtract*); // Writer (returns SOAP_OK on success): soap_write__mssamt__Subtract(struct soap*, _mssamt__Subtract*); @endcode - @ref _mssamt__SubtractResponse @code // Reader (returns SOAP_OK on success): soap_read__mssamt__SubtractResponse(struct soap*, _mssamt__SubtractResponse*); // Writer (returns SOAP_OK on success): soap_write__mssamt__SubtractResponse(struct soap*, _mssamt__SubtractResponse*); @endcode - @ref _mssamt__Multiply @code // Reader (returns SOAP_OK on success): soap_read__mssamt__Multiply(struct soap*, _mssamt__Multiply*); // Writer (returns SOAP_OK on success): soap_write__mssamt__Multiply(struct soap*, _mssamt__Multiply*); @endcode - @ref _mssamt__MultiplyResponse @code // Reader (returns SOAP_OK on success): soap_read__mssamt__MultiplyResponse(struct soap*, _mssamt__MultiplyResponse*); // Writer (returns SOAP_OK on success): soap_write__mssamt__MultiplyResponse(struct soap*, _mssamt__MultiplyResponse*); @endcode - @ref _mssamt__Divide @code // Reader (returns SOAP_OK on success): soap_read__mssamt__Divide(struct soap*, _mssamt__Divide*); // Writer (returns SOAP_OK on success): soap_write__mssamt__Divide(struct soap*, _mssamt__Divide*); @endcode - @ref _mssamt__DivideResponse @code // Reader (returns SOAP_OK on success): soap_read__mssamt__DivideResponse(struct soap*, _mssamt__DivideResponse*); // Writer (returns SOAP_OK on success): soap_write__mssamt__DivideResponse(struct soap*, _mssamt__DivideResponse*); @endcode */ /* End of calculator.h */ gsoap-2.8.28/gsoap/samples/wcf/Basic/TransportSecurity/Doxyfile0000644000175000017500000002272712653650156024116 0ustar ellertellert# Doxyfile 1.3.8 #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- PROJECT_NAME = "WCF Basic Transport Security" PROJECT_NUMBER = "" OUTPUT_DIRECTORY = CREATE_SUBDIRS = NO OUTPUT_LANGUAGE = English USE_WINDOWS_ENCODING = NO BRIEF_MEMBER_DESC = YES REPEAT_BRIEF = YES ABBREVIATE_BRIEF = "The $name class" \ "The $name widget" \ "The $name file" \ is \ provides \ specifies \ contains \ represents \ a \ an \ the ALWAYS_DETAILED_SEC = NO INLINE_INHERITED_MEMB = NO FULL_PATH_NAMES = YES STRIP_FROM_PATH = /Applications/ STRIP_FROM_INC_PATH = SHORT_NAMES = NO JAVADOC_AUTOBRIEF = NO MULTILINE_CPP_IS_BRIEF = NO DETAILS_AT_TOP = NO INHERIT_DOCS = YES DISTRIBUTE_GROUP_DOC = NO TAB_SIZE = 8 ALIASES = OPTIMIZE_OUTPUT_FOR_C = NO OPTIMIZE_OUTPUT_JAVA = NO SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- EXTRACT_ALL = YES EXTRACT_PRIVATE = YES EXTRACT_STATIC = YES EXTRACT_LOCAL_CLASSES = YES EXTRACT_LOCAL_METHODS = NO HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_CLASSES = NO HIDE_FRIEND_COMPOUNDS = NO HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = NO CASE_SENSE_NAMES = NO HIDE_SCOPE_NAMES = NO SHOW_INCLUDE_FILES = YES INLINE_INFO = YES SORT_MEMBER_DOCS = YES SORT_BRIEF_DOCS = NO SORT_BY_SCOPE_NAME = NO GENERATE_TODOLIST = YES GENERATE_TESTLIST = YES GENERATE_BUGLIST = YES GENERATE_DEPRECATEDLIST= YES ENABLED_SECTIONS = MAX_INITIALIZER_LINES = 30 SHOW_USED_FILES = YES #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- QUIET = NO WARNINGS = YES WARN_IF_UNDOCUMENTED = YES WARN_IF_DOC_ERROR = YES WARN_FORMAT = "$file:$line: $text" WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- INPUT = calculator.h calculator.cpp FILE_PATTERNS = *.c \ *.cc \ *.cxx \ *.cpp \ *.c++ \ *.java \ *.ii \ *.ixx \ *.ipp \ *.i++ \ *.inl \ *.h \ *.hh \ *.hxx \ *.hpp \ *.h++ \ *.idl \ *.odl \ *.cs \ *.php \ *.php3 \ *.inc \ *.m \ *.mm \ *.C \ *.CC \ *.C++ \ *.II \ *.I++ \ *.H \ *.HH \ *.H++ \ *.CS \ *.PHP \ *.PHP3 \ *.M \ *.MM RECURSIVE = NO EXCLUDE = EXCLUDE_SYMLINKS = NO EXCLUDE_PATTERNS = EXAMPLE_PATH = EXAMPLE_PATTERNS = * EXAMPLE_RECURSIVE = NO IMAGE_PATH = INPUT_FILTER = FILTER_PATTERNS = FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- SOURCE_BROWSER = YES INLINE_SOURCES = NO STRIP_CODE_COMMENTS = YES REFERENCED_BY_RELATION = NO REFERENCES_RELATION = NO VERBATIM_HEADERS = NO #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- ALPHABETICAL_INDEX = NO COLS_IN_ALPHA_INDEX = 5 IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- GENERATE_HTML = YES HTML_OUTPUT = html HTML_FILE_EXTENSION = .html HTML_HEADER = HTML_FOOTER = HTML_STYLESHEET = HTML_ALIGN_MEMBERS = YES GENERATE_HTMLHELP = NO CHM_FILE = HHC_LOCATION = GENERATE_CHI = NO BINARY_TOC = NO TOC_EXPAND = NO DISABLE_INDEX = NO ENUM_VALUES_PER_LINE = 4 GENERATE_TREEVIEW = NO TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- GENERATE_LATEX = NO LATEX_OUTPUT = latex LATEX_CMD_NAME = latex MAKEINDEX_CMD_NAME = makeindex COMPACT_LATEX = NO PAPER_TYPE = a4wide EXTRA_PACKAGES = LATEX_HEADER = PDF_HYPERLINKS = NO USE_PDFLATEX = NO LATEX_BATCHMODE = NO LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- GENERATE_RTF = NO RTF_OUTPUT = rtf COMPACT_RTF = NO RTF_HYPERLINKS = NO RTF_STYLESHEET_FILE = RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- GENERATE_MAN = NO MAN_OUTPUT = man MAN_EXTENSION = .3 MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- GENERATE_XML = NO XML_OUTPUT = xml XML_SCHEMA = XML_DTD = XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- GENERATE_PERLMOD = NO PERLMOD_LATEX = NO PERLMOD_PRETTY = YES PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- ENABLE_PREPROCESSING = YES MACRO_EXPANSION = NO EXPAND_ONLY_PREDEF = NO SEARCH_INCLUDES = YES INCLUDE_PATH = INCLUDE_FILE_PATTERNS = PREDEFINED = EXPAND_AS_DEFINED = SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- TAGFILES = GENERATE_TAGFILE = ALLEXTERNALS = NO EXTERNAL_GROUPS = YES PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- CLASS_DIAGRAMS = NO HIDE_UNDOC_RELATIONS = YES HAVE_DOT = YES CLASS_GRAPH = YES COLLABORATION_GRAPH = YES UML_LOOK = NO TEMPLATE_RELATIONS = NO INCLUDE_GRAPH = YES INCLUDED_BY_GRAPH = YES CALL_GRAPH = NO GRAPHICAL_HIERARCHY = YES DOT_IMAGE_FORMAT = png DOT_PATH = /usr/local/bin DOTFILE_DIRS = MAX_DOT_GRAPH_WIDTH = 1024 MAX_DOT_GRAPH_HEIGHT = 1024 MAX_DOT_GRAPH_DEPTH = 1000 GENERATE_LEGEND = YES DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- SEARCHENGINE = NO gsoap-2.8.28/gsoap/samples/wcf/Basic/TransportSecurity/Makefile0000644000175000017500000000247012653650156024041 0ustar ellertellertURL=http://192.168.2.2:8000/ServiceModelSamples/service WSDL=../../../../wsdl/wsdl2h GSOAP=../../../../src/soapcpp2 SOAPH=../../../../stdsoap2.h SOAPC=../../../../stdsoap2.c SOAPCPP=../../../../stdsoap2.cpp SOAPDOMC=../../../../dom.c SOAPDOMCPP=../../../../dom.cpp TYPEMAP=../../../../typemap.dat CC=gcc CPP=g++ LIBS=-lssl -lcrypto GSFLAGS=-L -I../../../../import COFLAGS=-O2 CWFLAGS=-Wall -Wno-deprecated-declarations CIFLAGS=-I. -I../../../.. -I../../../../plugin CMFLAGS=-DWITH_DOM -DWITH_OPENSSL #CMFLAGS=-DDEBUG -DWITH_DOM -DWITH_OPENSSL CFLAGS= $(CWFLAGS) $(COFLAGS) $(CIFLAGS) $(CMFLAGS) all: cacert.cer calculator calculator: calculator.h calculator.cpp $(SOAPH) $(SOAPC) $(GSOAP) $(GSFLAGS) -a -j calculator.h $(CPP) $(CFLAGS) -o calculator calculator.cpp soapC.cpp soapBasicHttpBinding_USCOREICalculatorService.cpp soapBasicHttpBinding_USCOREICalculatorProxy.cpp $(SOAPDOMCPP) $(SOAPCPP) $(LIBS) %.cer: %.pem openssl x509 -in $< -outform der -out $@ calculator.h: $(WSDL) -t $(TYPEMAP) -o calculator.h $(URL)?wsdl .PHONY: clean distclean clean: rm -f *.o soapH.h soapStub.h soapC.* soapClient.* soapServer.* soap*Proxy.* soap*Service.* soap*Object.* distclean: rm -f *.o soapH.h soapStub.h soapC.* soapClient.* soapServer.* soap*Proxy.* soap*Service.* soap*Object.* rm -f *.xml *.nsmap *.log rm -f calculator gsoap-2.8.28/gsoap/samples/wcf/Basic/TransportSecurity/server.pem0000644000175000017500000000724212653650156024414 0ustar ellertellert-----BEGIN ENCRYPTED PRIVATE KEY----- MIICxjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQI74Clf0036IICAggA MBQGCCqGSIb3DQMHBAiOmGBFtHOX0wSCAoAPb8WN47mTunpkPpzBSNd4i+qX1f4V XyFMWxdibGTclHfNesksWkg38E0nt9ORMImgvpKIHgQ2l+dt725uAoRhtuva7N2R kQKkJOtbzlxbgmi0QylcaEZYCw/OLsL0sH0xaoJDJsjwF74RAu4CJ7XVPR+ldPb9 hWSPb9KIkAe779KChZUaEkDa61ce0Bh7hSztjXYKqwI4W+xB0hv32dkwiap74mxr qw8fqu64+jj2UipUG0FVkruuYy0bW8Nh1P4aGIIKpFjjNBaHQoHWuluh0jDI7cpT A0Sfyg1teEtbBJgF2ebej6f7AHMHq2PuPo/nWzb2d6Akkc3q1Ab44yUeRgPhNTxA glhjoCSOOIFm2YfBh22A1h3JHDyr4INptSnlPl4lMMFYLS/JmJ+zg0cUTK53uY91 ncBtu6odT69Vxb/z5X3LIhjqJS6oSXDoFMlHxLkFyLamjPBgtvNSnlLQPWsrwpUd Fsl94W7OxIu4U711xMBbkYbYhLOAQ3KlF1GbYIyfOcQbvJ8UsXu959WJK6bQ0+ud XcnmQFZnEoxtDMcSCqcZfbcTasHGvrp4pBpxUyPNC5AUnLXsIg5QaplO7i5atrT/ e/I/jPA7AefUol5s8fyDKbKNBfuPk6VTvtIXKEGP8vKf5ZRai6HhhoE0pbEsNdSD CVfESYrTfgXf2h1gvSunWwDMbC/AaaNjjoHBTLQJfCbvacqK9zz/8o/BFEUWi/30 KeqA5pnlKIRL2nblWcKZE9xSKomsZqch7xTK5m9FUxAwwlAAVM5kwgiaFGEgrAO2 pFP9pJxZzxThlxQi2EgyHUoGqPjdPNFVuhBEcyIhVZp86qoikNoxtdBE -----END ENCRYPTED PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIID4TCCA0qgAwIBAgIBHzANBgkqhkiG9w0BAQUFADCBjTELMAkGA1UEBhMCVVMx CzAJBgNVBAgTAkZMMRQwEgYDVQQHEwtUYWxsYWhhc3NlZTEWMBQGA1UEChMNR2Vu aXZpYSwgSW5jLjELMAkGA1UECxMCSVQxEjAQBgNVBAMTCWxvY2FsaG9zdDEiMCAG CSqGSIb3DQEJARYTY29udGFjdEBnZW5pdmlhLmNvbTAeFw0xNTA4MDQxOTAzNDda Fw0xODA4MDMxOTAzNDdaMIGNMQswCQYDVQQGEwJVUzELMAkGA1UECBMCRkwxFDAS BgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYDVQQKEw1HZW5pdmlhLCBJbmMuMQswCQYD VQQLEwJJVDESMBAGA1UEAxMJbG9jYWxob3N0MSIwIAYJKoZIhvcNAQkBFhNjb250 YWN0QGdlbml2aWEuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC4J9vn Sde1q+Pyvgs4QUPiNKnqezL0Cqp1vA7gfUJ31Q/0071gkgMSX/DL+SZPjRSfEjA1 c9JyPjSdeZ5zydAz9f5R680Nvs8VKR9MsB3/XAnI3Rhd9G11QHXuW7DsaF6TXHNk EoipcN7ebie9eeqadv8xzhvTBHBE8rkf8iMI2QIDAQABo4IBTTCCAUkwCQYDVR0T BAIwADALBgNVHQ8EBAMCBPAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMC MCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAd BgNVHQ4EFgQUYJXHvmkvx1zc7GjmBJ9G0YQpKSgwgcIGA1UdIwSBujCBt4AU+MeC gLt+4soPx4i3OiBZYwMqlNChgZOkgZAwgY0xCzAJBgNVBAYTAlVTMQswCQYDVQQI EwJGTDEUMBIGA1UEBxMLVGFsbGFoYXNzZWUxFjAUBgNVBAoTDUdlbml2aWEsIElu Yy4xCzAJBgNVBAsTAklUMRIwEAYDVQQDEwlsb2NhbGhvc3QxIjAgBgkqhkiG9w0B CQEWE2NvbnRhY3RAZ2VuaXZpYS5jb22CCQDWdgbFTLQbVTANBgkqhkiG9w0BAQUF AAOBgQCNUuW182UC2YqBE3oEtwaguyYWOR5aZIUE4znV9thu7xBZhCoFhukmQX0L TwoSiW7Yt7vx0cUL4RQltT4D225ANhogdmBh0JmIXc60DtpnCs43IjTT1moUwx6T M51IxVIgksklJuo7UIILrYWlIR3GjDWGOEpQQmQhoLS10lVAyQ== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDkDCCAvmgAwIBAgIJANZ2BsVMtBtVMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYD VQQGEwJVUzELMAkGA1UECBMCRkwxFDASBgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYD VQQKEw1HZW5pdmlhLCBJbmMuMQswCQYDVQQLEwJJVDESMBAGA1UEAxMJbG9jYWxo b3N0MSIwIAYJKoZIhvcNAQkBFhNjb250YWN0QGdlbml2aWEuY29tMB4XDTE1MDgw NDE5MDEyMFoXDTE4MDgwMzE5MDEyMFowgY0xCzAJBgNVBAYTAlVTMQswCQYDVQQI EwJGTDEUMBIGA1UEBxMLVGFsbGFoYXNzZWUxFjAUBgNVBAoTDUdlbml2aWEsIElu Yy4xCzAJBgNVBAsTAklUMRIwEAYDVQQDEwlsb2NhbGhvc3QxIjAgBgkqhkiG9w0B CQEWE2NvbnRhY3RAZ2VuaXZpYS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJ AoGBALx/LiwGRi4wH8y0MEL64VJs5H2O1F4uuYO+aNVZHl5ULRDmSh/4eF8aOYXT B05PfVoctBogcK0ohPEhiUcR/029LQTkEs/5D7XsuRuQsUnMfkEihmC2VtEuJMqT OeXmuIcemEw0QL3ulny7H8W6Aq2rByC2r5iqytnM4Uuw7LMnAgMBAAGjgfUwgfIw HQYDVR0OBBYEFPjHgoC7fuLKD8eItzogWWMDKpTQMIHCBgNVHSMEgbowgbeAFPjH goC7fuLKD8eItzogWWMDKpTQoYGTpIGQMIGNMQswCQYDVQQGEwJVUzELMAkGA1UE CBMCRkwxFDASBgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYDVQQKEw1HZW5pdmlhLCBJ bmMuMQswCQYDVQQLEwJJVDESMBAGA1UEAxMJbG9jYWxob3N0MSIwIAYJKoZIhvcN AQkBFhNjb250YWN0QGdlbml2aWEuY29tggkA1nYGxUy0G1UwDAYDVR0TBAUwAwEB /zANBgkqhkiG9w0BAQUFAAOBgQB+fmbScGp3R4D0Sf4gbBJ/3CGEn4/HvupSikDq vyaviwJ2KQKGlAr/lDh1qSYItkazJpJDIxyG2Dzm2w0F0u1+CSwpym6eq1pxc8dh GRdrCVyuM0gUoBvxUym7o0Bq1V6onUjwrAti+onsZjDpfAIKBI8TRfjuTNzFeSAV G2zULg== -----END CERTIFICATE----- gsoap-2.8.28/gsoap/samples/wcf/Basic/TransportSecurity/client.pem0000644000175000017500000000724212653650156024364 0ustar ellertellert-----BEGIN ENCRYPTED PRIVATE KEY----- MIICxjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQICWRtmv3QhOwCAggA MBQGCCqGSIb3DQMHBAhGNsH9x+5NFASCAoCpz7lm6a8z2MtoP9CfXzAbcmPHVamE jJ+tmrL0sw1pTgwYUOibMF7owTTXTzKqndg/rp8PbG57FmkC6/Ka48Dr2pDmobR+ imfjX8Mx2Zc6o6c31ZA/gcQiNHY2rKOxmsfog85zejw0NFZx4o7bb9wqwNPKnc0w OoU/xgrhbSamPAZDXO9QWd6pceXPyLQ4To2hKq6TxsOCsqsSCawlAA/RogaA9eN6 NSi9I85UuxzQgClZRzKy0v3BC2Lx71YN/p6MIhr4i4inbnlEkRqFDkg+b9u6Hydm dIDvAcoHOildgaSG2Thc+2n5qf22SWbOTi/z/pb0PIcp1t2aDYWlR6AxLyX5+RfU GSXFdw/9Br8adr4NZeXGdvUSWcQAGP+Bbk520oGSvNkAyZVd/SmLS+EGdYsOQoMW GJGtKWPXuOYIzffoTrdLYQ8sm3TPjyf9eufvBy2EVq8Az8cRlfjB4XLaoRJo0PZ1 If5HbCft0H8isPLBpMPbi93/TAWi8xM/p4ktSbP/qpKsg85TPiMSprZJu8srVEQm v79HYr2tW4D2ymEArzVASBn3AopMcQ51FwWg4RXDZi2y8Sw+TBDx2jY0J5kK8gob 51STpQ7+sM5Il63DpYo6JSOIeDLWzM5a7/vMI/H9EGuEbXxEShWdlwyl8jzTIj30 b+M6ShiAHPf1Ns1bCPYb52GotL8dwvoCgGMIjey5er0Pz4n+MAtqVY3qwQZSRwBF skZszTBbWDb/GsFiiP8KASRA5twkZo52Q5MIBnnqcRi391SeBRxEVmnKJoulIUfF ved40dj8pyVK/Bj54lvv1zUAFZcx03b3d7Fl4l3EohHvSyykIuEbg4EH -----END ENCRYPTED PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIID4TCCA0qgAwIBAgIBHjANBgkqhkiG9w0BAQUFADCBjTELMAkGA1UEBhMCVVMx CzAJBgNVBAgTAkZMMRQwEgYDVQQHEwtUYWxsYWhhc3NlZTEWMBQGA1UEChMNR2Vu aXZpYSwgSW5jLjELMAkGA1UECxMCSVQxEjAQBgNVBAMTCWxvY2FsaG9zdDEiMCAG CSqGSIb3DQEJARYTY29udGFjdEBnZW5pdmlhLmNvbTAeFw0xNTA4MDQxOTAzMTZa Fw0xODA4MDMxOTAzMTZaMIGNMQswCQYDVQQGEwJVUzELMAkGA1UECBMCRkwxFDAS BgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYDVQQKEw1HZW5pdmlhLCBJbmMuMQswCQYD VQQLEwJJVDESMBAGA1UEAxMJbG9jYWxob3N0MSIwIAYJKoZIhvcNAQkBFhNjb250 YWN0QGdlbml2aWEuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC1KFPq 9x2mB6pLpHOTTr1MjAb/NL1For9p78INDFgdr0qfvv1ADTRDGtIgzpPBzJlJ2Cdi fWbn4+0I3LzY3n2n5GVSjhH6bJcXwRtPJRL9JHIjqKnWTWH9lTpT9DtOd1NfqLN4 /YEbUpOBWRyF7StZXdvc/RjehYslZFWN0QjnaQIDAQABo4IBTTCCAUkwCQYDVR0T BAIwADALBgNVHQ8EBAMCBPAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMC MCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAd BgNVHQ4EFgQUNIRI7RyXyWIAH1L4KFDCRvgAozAwgcIGA1UdIwSBujCBt4AU+MeC gLt+4soPx4i3OiBZYwMqlNChgZOkgZAwgY0xCzAJBgNVBAYTAlVTMQswCQYDVQQI EwJGTDEUMBIGA1UEBxMLVGFsbGFoYXNzZWUxFjAUBgNVBAoTDUdlbml2aWEsIElu Yy4xCzAJBgNVBAsTAklUMRIwEAYDVQQDEwlsb2NhbGhvc3QxIjAgBgkqhkiG9w0B CQEWE2NvbnRhY3RAZ2VuaXZpYS5jb22CCQDWdgbFTLQbVTANBgkqhkiG9w0BAQUF AAOBgQCi4vLlE4pq+tHdL54NmHqcl+Ls2mb1MghjwwDz6McDCEV+uIzREXGq8ocw KxjBrI5iNiT0dPnSOEIyyGdQxJCUzwqHibHg3DjmOwPKXmo+Dq05nsAeTr4J/66r eMCzvxxtZwIgbidIkDsOzU54b5nle04E77YGKUc98Q3qkRGkwQ== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDkDCCAvmgAwIBAgIJANZ2BsVMtBtVMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYD VQQGEwJVUzELMAkGA1UECBMCRkwxFDASBgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYD VQQKEw1HZW5pdmlhLCBJbmMuMQswCQYDVQQLEwJJVDESMBAGA1UEAxMJbG9jYWxo b3N0MSIwIAYJKoZIhvcNAQkBFhNjb250YWN0QGdlbml2aWEuY29tMB4XDTE1MDgw NDE5MDEyMFoXDTE4MDgwMzE5MDEyMFowgY0xCzAJBgNVBAYTAlVTMQswCQYDVQQI EwJGTDEUMBIGA1UEBxMLVGFsbGFoYXNzZWUxFjAUBgNVBAoTDUdlbml2aWEsIElu Yy4xCzAJBgNVBAsTAklUMRIwEAYDVQQDEwlsb2NhbGhvc3QxIjAgBgkqhkiG9w0B CQEWE2NvbnRhY3RAZ2VuaXZpYS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJ AoGBALx/LiwGRi4wH8y0MEL64VJs5H2O1F4uuYO+aNVZHl5ULRDmSh/4eF8aOYXT B05PfVoctBogcK0ohPEhiUcR/029LQTkEs/5D7XsuRuQsUnMfkEihmC2VtEuJMqT OeXmuIcemEw0QL3ulny7H8W6Aq2rByC2r5iqytnM4Uuw7LMnAgMBAAGjgfUwgfIw HQYDVR0OBBYEFPjHgoC7fuLKD8eItzogWWMDKpTQMIHCBgNVHSMEgbowgbeAFPjH goC7fuLKD8eItzogWWMDKpTQoYGTpIGQMIGNMQswCQYDVQQGEwJVUzELMAkGA1UE CBMCRkwxFDASBgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYDVQQKEw1HZW5pdmlhLCBJ bmMuMQswCQYDVQQLEwJJVDESMBAGA1UEAxMJbG9jYWxob3N0MSIwIAYJKoZIhvcN AQkBFhNjb250YWN0QGdlbml2aWEuY29tggkA1nYGxUy0G1UwDAYDVR0TBAUwAwEB /zANBgkqhkiG9w0BAQUFAAOBgQB+fmbScGp3R4D0Sf4gbBJ/3CGEn4/HvupSikDq vyaviwJ2KQKGlAr/lDh1qSYItkazJpJDIxyG2Dzm2w0F0u1+CSwpym6eq1pxc8dh GRdrCVyuM0gUoBvxUym7o0Bq1V6onUjwrAti+onsZjDpfAIKBI8TRfjuTNzFeSAV G2zULg== -----END CERTIFICATE----- gsoap-2.8.28/gsoap/samples/wcf/Basic/TransportSecurity/calculator.cpp0000644000175000017500000002620712653650156025242 0ustar ellertellert/* calculator.cpp WCF BasicTransportSecurity Binding demo See the README.txt gSOAP XML Web services tools Copyright (C) 2000-2012, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under one of the following licenses: GPL, the gSOAP public license, or Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2012, Robert van Engelen, Genivia Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapBasicHttpBinding_USCOREICalculatorService.h" #include "soapBasicHttpBinding_USCOREICalculatorProxy.h" #include "BasicHttpBinding_USCOREICalculator.nsmap" #include "threads.h" /* gsoap/plugin/threads.h */ int CRYPTO_thread_setup(); void CRYPTO_thread_cleanup(); const char *URI = NULL; // Set to the service URI int main(int argc, char **argv) { if (CRYPTO_thread_setup()) { std::cerr << "Cannot setup thread mutex for OpenSSL" << std::endl; exit(1); } if (argc >= 2) { // Service sample application int port = atoi(argv[1]); BasicHttpBinding_USCOREICalculatorService service(SOAP_XML_INDENT); service.soap->send_timeout = service.soap->recv_timeout = 10; // 10 sec /* The supplied server certificate "server.pem" assumes that the server is running on 'localhost', so clients can only connect from the same host when verifying the server's certificate. To verify the certificates of third-party services, they must provide a certificate issued by Verisign or another trusted CA. At the client-side, the capath parameter should point to a directory that contains these trusted (root) certificates or the cafile parameter should refer to one file will all certificates. To help you out, the supplied "cacerts.pem" file contains the certificates issued by various CAs. You should use this file for the cafile parameter instead of "cacert.pem" to connect to trusted servers. Note that the client may fail to connect if the server's credentials have problems (e.g. expired). Note 1: the password and capath are not used with GNUTLS Note 2: setting capath may not work on Windows. */ if (soap_ssl_server_context(service.soap, SOAP_SSL_DEFAULT, /* use SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION to verify clients: client must provide a key file e.g. "client.pem" and "password" */ "server.pem", /* keyfile (cert+key): see SSL docs to create this file */ "password", /* password to read the private key in the key file */ "cacert.pem", /* optional cacert file to store trusted certificates (to authenticate clients) */ NULL, /* optional capath */ "dh512.pem", /* DH file name or DH param key len bits (e.g. "1024"), if NULL use RSA 2048 bits (SOAP_SSL_RSA_BITS) */ NULL, /* if randfile!=NULL: use a file with random data to seed randomness */ NULL /* optional server identification for SSL session cache (unique server name, e.g. use argv[0]) */ )) { service.soap_stream_fault(std::cerr); exit(1); } if (!soap_valid_socket(service.bind(NULL, port, 100))) { service.soap_stream_fault(std::cerr); exit(1); } std::cerr << "Server running" << std::endl; for (;;) { if (!soap_valid_socket(service.accept()) || service.ssl_accept() || service.serve()) service.soap_stream_fault(std::cerr); } } else { // Client sample application BasicHttpBinding_USCOREICalculatorProxy proxy(URI, SOAP_XML_INDENT); proxy.soap->send_timeout = proxy.soap->recv_timeout = 10; // 10 sec if (soap_ssl_client_context(proxy.soap, SOAP_SSL_DEFAULT | SOAP_SSL_SKIP_HOST_CHECK, NULL, /* keyfile (cert+key): required only when client must authenticate to server (see SSL docs to create this file) */ NULL, /* password to read the keyfile */ "cacert.pem", /* optional cacert file to store trusted certificates, use cacerts.pem for all public certificates issued by common CAs */ NULL, /* optional capath to directory with trusted certificates */ NULL /* optional: use a file with random data to seed randomness */ )) { proxy.soap_stream_fault(std::cerr); exit(1); } double n1 = 3.14, n2 = 1.41; _mssamt__Add areq; _mssamt__AddResponse ares; areq.n1 = &n1; areq.n2 = &n2; if (proxy.Add(&areq, &ares) == SOAP_OK && ares.AddResult) printf("Add(%g, %g) = %g\n", *areq.n1, *areq.n2, *ares.AddResult); else proxy.soap_stream_fault(std::cerr); proxy.destroy(); _mssamt__Subtract sreq; _mssamt__SubtractResponse sres; sreq.n1 = &n1; sreq.n2 = &n2; if (proxy.Subtract(&sreq, &sres) == SOAP_OK && sres.SubtractResult) printf("Subtract(%g, %g) = %g\n", *sreq.n1, *sreq.n2, *sres.SubtractResult); else proxy.soap_stream_fault(std::cerr); proxy.destroy(); _mssamt__Multiply mreq; _mssamt__MultiplyResponse mres; mreq.n1 = &n1; mreq.n2 = &n2; if (proxy.Multiply(&mreq, &mres) == SOAP_OK && mres.MultiplyResult) printf("Multiply(%g, %g) = %g\n", *mreq.n1, *mreq.n2, *mres.MultiplyResult); else proxy.soap_stream_fault(std::cerr); proxy.destroy(); _mssamt__Divide dreq; _mssamt__DivideResponse dres; dreq.n1 = &n1; dreq.n2 = &n2; if (proxy.Divide(&dreq, &dres) == SOAP_OK && dres.DivideResult) printf("Divide(%g, %g) = %g\n", *dreq.n1, *dreq.n2, *dres.DivideResult); else proxy.soap_stream_fault(std::cerr); proxy.destroy(); } CRYPTO_thread_cleanup(); return 0; } /******************************************************************************\ * * Service operations * \******************************************************************************/ int BasicHttpBinding_USCOREICalculatorService::Add(_mssamt__Add *Add, _mssamt__AddResponse *AddResponse) { double *res = (double*)soap_malloc(soap, sizeof(double)); if (Add && Add->n1 && Add->n2) *res = *Add->n1 + *Add->n2; else return soap_sender_fault(soap, "Invalid data", NULL); AddResponse->AddResult = res; return SOAP_OK; } int BasicHttpBinding_USCOREICalculatorService::Subtract(_mssamt__Subtract *Subtract, _mssamt__SubtractResponse *SubtractResponse) { double *res = (double*)soap_malloc(soap, sizeof(double)); if (Subtract && Subtract->n1 && Subtract->n2) *res = *Subtract->n1 - *Subtract->n2; else return soap_sender_fault(soap, "Invalid data", NULL); SubtractResponse->SubtractResult = res; return SOAP_OK; } int BasicHttpBinding_USCOREICalculatorService::Multiply(_mssamt__Multiply *Multiply, _mssamt__MultiplyResponse *MultiplyResponse) { double *res = (double*)soap_malloc(soap, sizeof(double)); if (Multiply && Multiply->n1 && Multiply->n2) *res = *Multiply->n1 * *Multiply->n2; else return soap_sender_fault(soap, "Invalid data", NULL); MultiplyResponse->MultiplyResult = res; return SOAP_OK; } int BasicHttpBinding_USCOREICalculatorService::Divide(_mssamt__Divide *Divide, _mssamt__DivideResponse *DivideResponse) { double *res = (double*)soap_malloc(soap, sizeof(double)); if (Divide && Divide->n1 && Divide->n2 && *Divide->n2 != 0.0) *res = *Divide->n1 / *Divide->n2; else return soap_sender_fault(soap, "Invalid data", NULL); DivideResponse->DivideResult = res; return SOAP_OK; } /******************************************************************************\ * * OpenSSL * \******************************************************************************/ #ifdef WITH_OPENSSL struct CRYPTO_dynlock_value { MUTEX_TYPE mutex; }; static MUTEX_TYPE *mutex_buf; static struct CRYPTO_dynlock_value *dyn_create_function(const char *file, int line) { struct CRYPTO_dynlock_value *value; value = (struct CRYPTO_dynlock_value*)malloc(sizeof(struct CRYPTO_dynlock_value)); if (value) MUTEX_SETUP(value->mutex); return value; } static void dyn_lock_function(int mode, struct CRYPTO_dynlock_value *l, const char *file, int line) { if (mode & CRYPTO_LOCK) MUTEX_LOCK(l->mutex); else MUTEX_UNLOCK(l->mutex); } static void dyn_destroy_function(struct CRYPTO_dynlock_value *l, const char *file, int line) { MUTEX_CLEANUP(l->mutex); free(l); } void locking_function(int mode, int n, const char *file, int line) { if (mode & CRYPTO_LOCK) MUTEX_LOCK(mutex_buf[n]); else MUTEX_UNLOCK(mutex_buf[n]); } unsigned long id_function() { return (unsigned long)THREAD_ID; } int CRYPTO_thread_setup() { int i; mutex_buf = (MUTEX_TYPE*)malloc(CRYPTO_num_locks() * sizeof(pthread_mutex_t)); if (!mutex_buf) return SOAP_EOM; for (i = 0; i < CRYPTO_num_locks(); i++) MUTEX_SETUP(mutex_buf[i]); CRYPTO_set_id_callback(id_function); CRYPTO_set_locking_callback(locking_function); CRYPTO_set_dynlock_create_callback(dyn_create_function); CRYPTO_set_dynlock_lock_callback(dyn_lock_function); CRYPTO_set_dynlock_destroy_callback(dyn_destroy_function); return SOAP_OK; } void CRYPTO_thread_cleanup() { int i; if (!mutex_buf) return; CRYPTO_set_id_callback(NULL); CRYPTO_set_locking_callback(NULL); CRYPTO_set_dynlock_create_callback(NULL); CRYPTO_set_dynlock_lock_callback(NULL); CRYPTO_set_dynlock_destroy_callback(NULL); for (i = 0; i < CRYPTO_num_locks(); i++) MUTEX_CLEANUP(mutex_buf[i]); free(mutex_buf); mutex_buf = NULL; } #else /* OpenSSL not used, e.g. GNUTLS is used */ int CRYPTO_thread_setup() { return SOAP_OK; } void CRYPTO_thread_cleanup() { } #endif gsoap-2.8.28/gsoap/samples/wcf/Basic/TransportSecurity/README.txt0000644000175000017500000000660612653650156024104 0ustar ellertellertINSTRUCTIONS Install the WCF samples: Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4. You should have: C:\WF_WCF_Samples\WCF\Basic\Binding\Basic\TransportSecurity\CS Open the Basic TransportSecurity WCF C# example client and service project in Visual Studio. Modify the configuration and source code as described below. Notes: C:> denotes the Windows command line $ denotes the Unix/Linux command line To generate keys and certificates --------------------------------- Convert PEM to cer format: $ make cacert.cer Import cacert.cer by opening it on the Windows machine and then select Install Certificate. Change client.cs by removing the RemoveValidate(...) check to always return true, or modify according to certificate properties to enforce. To connect a WCF client to a gSOAP service ------------------------------------------ Import cacert.cer on the windows machine, see above. In App.config set the endpoint to the gSOAP server endpoint, say "10.0.1.5" over wifi: Run the gSOAP server on port 8000 and then the client. $ ./calculator 8000 C:\WF_WCF_Samples\WCF\Basic\Binding\Basic\TransportSecurity\CS\client> bin\client.exe To self-host a WCF service -------------------------- Obtain the machine name or IP C:> ipconfig /all say it is 10.0.1.5 over wifi. Add a Main() to self-host, say the WCF samples CalculatorService class under C:\WF_WCF_Samples\WCF\Basic\Binding\Basic\TransportSecurity\CS\service with the following class put in the namespace: using System; using System.ServiceModel; using System.Configuration; using System.ServiceModel.Description; namespace ... { ... public class Program { public static void Main() { Uri httpUrl = new Uri("https://10.0.1.5:8000/ServiceModelSamples/service"); using (ServiceHost serviceHost = new ServiceHost(typeof(CalculatorService), httpUrl)) { BasicHttpBinding bhb = new BasicHttpBinding(); bhb.Security.Mode = BasicHttpSecurityMode.Transport; bhb.Security.Transport.ClientCredentialType = HttpClientCredentialType.None; serviceHost.AddServiceEndpoint(typeof(ICalculator), bhb, ""); ServiceMetadataBehavior smb = new ServiceMetadataBehavior(); smb.HttpGetEnabled = true; serviceHost.Description.Behaviors.Add(smb); serviceHost.Open(); Console.WriteLine("Press to terminate service."); Console.ReadLine(); } } } } Under Project Properties change the Output type to Console Application to generate a service.exe. Compile and run the WCF service: C:\WF_WCF_Samples\WCF\Basic\Binding\Basic\TransportSecurity\CS\service> bin\service.exe Use a web browser to access the service at https://10.0.1.5:8000/ServiceModelSamples/service and access the WSDL at https://10.0.1.5:8000/ServiceModelSamples/service?wsdl A gSOAP client connects to this https service, but only when the service certificate is registered with the https port of the Windows machine. To run wsdl2h to generate C++ code: $ wsdl2h -t ../../../../typemap.dat -o calculator.h 'http://10.0.1.5:8000/ServiceModelSamples/service?wsdl' This may take some time, since the self-hosted service is an iterative web server that allows only one open connection. A pre-generated calculator.h file is included in the build directory. gsoap-2.8.28/gsoap/samples/wcf/Basic/TransportSecurity/cacert.cer0000644000175000017500000000163212653650156024334 0ustar ellertellert00 lt@S0  *H 01 0 UUS1 0 UFL10U Tallahassee10U  Genivia, Inc.1 0 U IT10U genivia.com1"0  *H  contact@genivia.com0 120526201929Z 150526201929Z01 0 UUS1 0 UFL10U Tallahassee10U  Genivia, Inc.1 0 U IT10U genivia.com1"0  *H  contact@genivia.com00  *H 0gY1PTK%y[ve:logUqcL58ބu,4<ay#QЌSQ2BxQ&bM1[,ahpgwפ'4R6J;F*00Uu8cj%wTH0U#0u8cj%wTH01 0 UUS1 0 UFL10U Tallahassee10U  Genivia, Inc.1 0 U IT10U genivia.com1"0  *H  contact@genivia.com lt@S0 U00  *H >B$ ye/^K  αmAqEh#؂s54{ 7lbRpΆKHR9o |an,Z4-^T]滤#c|gsoap-2.8.28/gsoap/samples/wcf/Basic/TransportSecurity/cacert.pem0000644000175000017500000000242212653650156024342 0ustar ellertellert-----BEGIN CERTIFICATE----- MIIDkDCCAvmgAwIBAgIJANZ2BsVMtBtVMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYD VQQGEwJVUzELMAkGA1UECBMCRkwxFDASBgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYD VQQKEw1HZW5pdmlhLCBJbmMuMQswCQYDVQQLEwJJVDESMBAGA1UEAxMJbG9jYWxo b3N0MSIwIAYJKoZIhvcNAQkBFhNjb250YWN0QGdlbml2aWEuY29tMB4XDTE1MDgw NDE5MDEyMFoXDTE4MDgwMzE5MDEyMFowgY0xCzAJBgNVBAYTAlVTMQswCQYDVQQI EwJGTDEUMBIGA1UEBxMLVGFsbGFoYXNzZWUxFjAUBgNVBAoTDUdlbml2aWEsIElu Yy4xCzAJBgNVBAsTAklUMRIwEAYDVQQDEwlsb2NhbGhvc3QxIjAgBgkqhkiG9w0B CQEWE2NvbnRhY3RAZ2VuaXZpYS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJ AoGBALx/LiwGRi4wH8y0MEL64VJs5H2O1F4uuYO+aNVZHl5ULRDmSh/4eF8aOYXT B05PfVoctBogcK0ohPEhiUcR/029LQTkEs/5D7XsuRuQsUnMfkEihmC2VtEuJMqT OeXmuIcemEw0QL3ulny7H8W6Aq2rByC2r5iqytnM4Uuw7LMnAgMBAAGjgfUwgfIw HQYDVR0OBBYEFPjHgoC7fuLKD8eItzogWWMDKpTQMIHCBgNVHSMEgbowgbeAFPjH goC7fuLKD8eItzogWWMDKpTQoYGTpIGQMIGNMQswCQYDVQQGEwJVUzELMAkGA1UE CBMCRkwxFDASBgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYDVQQKEw1HZW5pdmlhLCBJ bmMuMQswCQYDVQQLEwJJVDESMBAGA1UEAxMJbG9jYWxob3N0MSIwIAYJKoZIhvcN AQkBFhNjb250YWN0QGdlbml2aWEuY29tggkA1nYGxUy0G1UwDAYDVR0TBAUwAwEB /zANBgkqhkiG9w0BAQUFAAOBgQB+fmbScGp3R4D0Sf4gbBJ/3CGEn4/HvupSikDq vyaviwJ2KQKGlAr/lDh1qSYItkazJpJDIxyG2Dzm2w0F0u1+CSwpym6eq1pxc8dh GRdrCVyuM0gUoBvxUym7o0Bq1V6onUjwrAti+onsZjDpfAIKBI8TRfjuTNzFeSAV G2zULg== -----END CERTIFICATE----- gsoap-2.8.28/gsoap/samples/wcf/Basic/Http/0000755000175000017500000000000012653650156017571 5ustar ellertellertgsoap-2.8.28/gsoap/samples/wcf/Basic/Http/calculator.h0000644000175000017500000010344512653650156022102 0ustar ellertellert// Reminder: Modify typemap.dat to customize the header file generated by wsdl2h /* calculator.h Generated by wsdl2h 2.8.9 from http://192.168.2.2:8000/ServiceModelSamples/service?wsdl and ../../typemap.dat 2012-05-22 19:24:39 GMT DO NOT INCLUDE THIS FILE DIRECTLY INTO YOUR PROJECT BUILDS USE THE soapcpp2-GENERATED SOURCE CODE FILES FOR YOUR PROJECT BUILDS gSOAP XML Web services tools. Copyright (C) 2001-2012 Robert van Engelen, Genivia Inc. All Rights Reserved. Part of this software is released under one of the following licenses: GPL or Genivia's license for commercial use. */ /** @page page_notes Usage Notes NOTE: - Run soapcpp2 on calculator.h to generate the SOAP/XML processing logic. Use soapcpp2 option -I to specify paths for #import To build with STL, 'stlvector.h' is imported from 'import' dir in package. Use soapcpp2 option -i to generate improved proxy and server classes. - Use wsdl2h options -c and -s to generate pure C code or C++ code without STL. - Use 'typemap.dat' to control namespace bindings and type mappings. It is strongly recommended to customize the names of the namespace prefixes generated by wsdl2h. To do so, modify the prefix bindings in the Namespaces section below and add the modified lines to 'typemap.dat' to rerun wsdl2h. - Use Doxygen (www.doxygen.org) on this file to generate documentation. - Use wsdl2h options -nname and -Nname to globally rename the prefix 'ns'. - Use wsdl2h option -d to enable DOM support for xsd:anyType. - Use wsdl2h option -g to auto-generate readers and writers for root elements. - Struct/class members serialized as XML attributes are annotated with a '@'. - Struct/class members that have a special role are annotated with a '$'. WARNING: DO NOT INCLUDE THIS FILE DIRECTLY INTO YOUR PROJECT BUILDS. USE THE SOURCE CODE FILES GENERATED BY soapcpp2 FOR YOUR PROJECT BUILDS: THE soapStub.h FILE CONTAINS THIS CONTENT WITHOUT ANNOTATIONS. LICENSE: @verbatim -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2012, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following two licenses: 1) GPL or 2) Genivia's license for commercial use. -------------------------------------------------------------------------------- 1) GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- 2) A commercial-use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- @endverbatim */ //gsoapopt w /******************************************************************************\ * * * Definitions * * http://tempuri.org/ * * * \******************************************************************************/ /******************************************************************************\ * * * Import * * * \******************************************************************************/ // STL vector containers (use option -s to remove STL dependency) #import "stlvector.h" /******************************************************************************\ * * * Schema Namespaces * * * \******************************************************************************/ /* NOTE: It is strongly recommended to customize the names of the namespace prefixes generated by wsdl2h. To do so, modify the prefix bindings below and add the modified lines to typemap.dat to rerun wsdl2h: tempuri = "http://tempuri.org/" mssamhi = "http://Microsoft.Samples.Http/Imports" mssamh = "http://Microsoft.Samples.Http" */ #define SOAP_NAMESPACE_OF_mssamhi "http://Microsoft.Samples.Http/Imports" //gsoap mssamhi schema namespace: http://Microsoft.Samples.Http/Imports //gsoap mssamhi schema form: unqualified #define SOAP_NAMESPACE_OF_mssamh "http://Microsoft.Samples.Http" //gsoap mssamh schema namespace: http://Microsoft.Samples.Http //gsoap mssamh schema elementForm: qualified //gsoap mssamh schema attributeForm: unqualified /******************************************************************************\ * * * Built-in Schema Types and Top-Level Elements and Attributes * * * \******************************************************************************/ /******************************************************************************\ * * * Forward Declarations * * * \******************************************************************************/ // Forward declaration of class _mssamh__Add. class _mssamh__Add; // Forward declaration of class _mssamh__AddResponse. class _mssamh__AddResponse; // Forward declaration of class _mssamh__Subtract. class _mssamh__Subtract; // Forward declaration of class _mssamh__SubtractResponse. class _mssamh__SubtractResponse; // Forward declaration of class _mssamh__Multiply. class _mssamh__Multiply; // Forward declaration of class _mssamh__MultiplyResponse. class _mssamh__MultiplyResponse; // Forward declaration of class _mssamh__Divide. class _mssamh__Divide; // Forward declaration of class _mssamh__DivideResponse. class _mssamh__DivideResponse; /******************************************************************************\ * * * Schema Types and Top-Level Elements and Attributes * * http://Microsoft.Samples.Http/Imports * * * \******************************************************************************/ /******************************************************************************\ * * * Schema Types and Top-Level Elements and Attributes * * http://Microsoft.Samples.Http * * * \******************************************************************************/ /******************************************************************************\ * * * Schema Complex Types and Top-Level Elements * * http://Microsoft.Samples.Http/Imports * * * \******************************************************************************/ /******************************************************************************\ * * * Schema Complex Types and Top-Level Elements * * http://Microsoft.Samples.Http * * * \******************************************************************************/ /// Top-level root element "http://Microsoft.Samples.Http":Add /// "http://Microsoft.Samples.Http":Add is a complexType. class _mssamh__Add { public: /// Element n1 of type xs:double. double* n1 0; ///< Optional element. /// Element n2 of type xs:double. double* n2 0; ///< Optional element. /// A handle to the soap struct that manages this instance (automatically set) struct soap *soap ; }; /// Top-level root element "http://Microsoft.Samples.Http":AddResponse /// "http://Microsoft.Samples.Http":AddResponse is a complexType. class _mssamh__AddResponse { public: /// Element AddResult of type xs:double. double* AddResult 0; ///< Optional element. /// A handle to the soap struct that manages this instance (automatically set) struct soap *soap ; }; /// Top-level root element "http://Microsoft.Samples.Http":Subtract /// "http://Microsoft.Samples.Http":Subtract is a complexType. class _mssamh__Subtract { public: /// Element n1 of type xs:double. double* n1 0; ///< Optional element. /// Element n2 of type xs:double. double* n2 0; ///< Optional element. /// A handle to the soap struct that manages this instance (automatically set) struct soap *soap ; }; /// Top-level root element "http://Microsoft.Samples.Http":SubtractResponse /// "http://Microsoft.Samples.Http":SubtractResponse is a complexType. class _mssamh__SubtractResponse { public: /// Element SubtractResult of type xs:double. double* SubtractResult 0; ///< Optional element. /// A handle to the soap struct that manages this instance (automatically set) struct soap *soap ; }; /// Top-level root element "http://Microsoft.Samples.Http":Multiply /// "http://Microsoft.Samples.Http":Multiply is a complexType. class _mssamh__Multiply { public: /// Element n1 of type xs:double. double* n1 0; ///< Optional element. /// Element n2 of type xs:double. double* n2 0; ///< Optional element. /// A handle to the soap struct that manages this instance (automatically set) struct soap *soap ; }; /// Top-level root element "http://Microsoft.Samples.Http":MultiplyResponse /// "http://Microsoft.Samples.Http":MultiplyResponse is a complexType. class _mssamh__MultiplyResponse { public: /// Element MultiplyResult of type xs:double. double* MultiplyResult 0; ///< Optional element. /// A handle to the soap struct that manages this instance (automatically set) struct soap *soap ; }; /// Top-level root element "http://Microsoft.Samples.Http":Divide /// "http://Microsoft.Samples.Http":Divide is a complexType. class _mssamh__Divide { public: /// Element n1 of type xs:double. double* n1 0; ///< Optional element. /// Element n2 of type xs:double. double* n2 0; ///< Optional element. /// A handle to the soap struct that manages this instance (automatically set) struct soap *soap ; }; /// Top-level root element "http://Microsoft.Samples.Http":DivideResponse /// "http://Microsoft.Samples.Http":DivideResponse is a complexType. class _mssamh__DivideResponse { public: /// Element DivideResult of type xs:double. double* DivideResult 0; ///< Optional element. /// A handle to the soap struct that manages this instance (automatically set) struct soap *soap ; }; /******************************************************************************\ * * * Additional Top-Level Elements * * http://Microsoft.Samples.Http/Imports * * * \******************************************************************************/ /******************************************************************************\ * * * Additional Top-Level Attributes * * http://Microsoft.Samples.Http/Imports * * * \******************************************************************************/ /******************************************************************************\ * * * Additional Top-Level Elements * * http://Microsoft.Samples.Http * * * \******************************************************************************/ /******************************************************************************\ * * * Additional Top-Level Attributes * * http://Microsoft.Samples.Http * * * \******************************************************************************/ /******************************************************************************\ * * * Services * * * \******************************************************************************/ //gsoap tempuri service name: BasicHttpBinding_USCOREICalculator //gsoap tempuri service type: ICalculator //gsoap tempuri service port: http://192.168.2.2:8000/ServiceModelSamples/service //gsoap tempuri service namespace: http://tempuri.org/ //gsoap tempuri service transport: http://schemas.xmlsoap.org/soap/http /** @mainpage CalculatorService Definitions @section CalculatorService_bindings Service Bindings - @ref BasicHttpBinding_USCOREICalculator @section CalculatorService_more More Information - @ref page_notes "Usage Notes" - @ref page_XMLDataBinding "XML Data Binding" - @ref SOAP_ENV__Header "SOAP Header Content" (when applicable) - @ref SOAP_ENV__Detail "SOAP Fault Detail Content" (when applicable) */ /** @page BasicHttpBinding_USCOREICalculator Binding "BasicHttpBinding_USCOREICalculator" @section BasicHttpBinding_USCOREICalculator_operations Operations of Binding "BasicHttpBinding_USCOREICalculator" - @ref __tempuri__Add - @ref __tempuri__Subtract - @ref __tempuri__Multiply - @ref __tempuri__Divide @section BasicHttpBinding_USCOREICalculator_ports Endpoints of Binding "BasicHttpBinding_USCOREICalculator" - http://192.168.2.2:8000/ServiceModelSamples/service Note: use wsdl2h option -N to change the service binding prefix name */ /******************************************************************************\ * * * Service Binding * * BasicHttpBinding_USCOREICalculator * * * \******************************************************************************/ /******************************************************************************\ * * * Service Operation * * __tempuri__Add * * * \******************************************************************************/ /// Operation "__tempuri__Add" of service binding "BasicHttpBinding_USCOREICalculator" /** Operation details: - SOAP document/literal style messaging - SOAP action: "http://Microsoft.Samples.Http/ICalculator/Add" - Addressing method action: "http://tempuri.org//ICalculator/Add" - Addressing method output action: "http://tempuri.org//ICalculator/AddResponse" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___tempuri__Add( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: _mssamh__Add* mssamh__Add, // response parameters: _mssamh__AddResponse* mssamh__AddResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __tempuri__Add( struct soap *soap, // request parameters: _mssamh__Add* mssamh__Add, // response parameters: _mssamh__AddResponse* mssamh__AddResponse ); @endcode C++ proxy class (defined in soapBasicHttpBinding_USCOREICalculatorProxy.h): @code class BasicHttpBinding_USCOREICalculatorProxy; @endcode Important: use soapcpp2 option '-i' to generate greatly improved and easy-to-use proxy classes; C++ service class (defined in soapBasicHttpBinding_USCOREICalculatorService.h): @code class BasicHttpBinding_USCOREICalculatorService; @endcode Important: use soapcpp2 option '-i' to generate greatly improved and easy-to-use service classes; */ //gsoap tempuri service method-style: Add document //gsoap tempuri service method-encoding: Add literal //gsoap tempuri service method-action: Add http://Microsoft.Samples.Http/ICalculator/Add //gsoap tempuri service method-output-action: Add http://tempuri.org//ICalculator/AddResponse int __tempuri__Add( _mssamh__Add* mssamh__Add, ///< Request parameter _mssamh__AddResponse* mssamh__AddResponse ///< Response parameter ); /******************************************************************************\ * * * Service Operation * * __tempuri__Subtract * * * \******************************************************************************/ /// Operation "__tempuri__Subtract" of service binding "BasicHttpBinding_USCOREICalculator" /** Operation details: - SOAP document/literal style messaging - SOAP action: "http://Microsoft.Samples.Http/ICalculator/Subtract" - Addressing method action: "http://tempuri.org//ICalculator/Subtract" - Addressing method output action: "http://tempuri.org//ICalculator/SubtractResponse" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___tempuri__Subtract( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: _mssamh__Subtract* mssamh__Subtract, // response parameters: _mssamh__SubtractResponse* mssamh__SubtractResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __tempuri__Subtract( struct soap *soap, // request parameters: _mssamh__Subtract* mssamh__Subtract, // response parameters: _mssamh__SubtractResponse* mssamh__SubtractResponse ); @endcode C++ proxy class (defined in soapBasicHttpBinding_USCOREICalculatorProxy.h): @code class BasicHttpBinding_USCOREICalculatorProxy; @endcode Important: use soapcpp2 option '-i' to generate greatly improved and easy-to-use proxy classes; C++ service class (defined in soapBasicHttpBinding_USCOREICalculatorService.h): @code class BasicHttpBinding_USCOREICalculatorService; @endcode Important: use soapcpp2 option '-i' to generate greatly improved and easy-to-use service classes; */ //gsoap tempuri service method-style: Subtract document //gsoap tempuri service method-encoding: Subtract literal //gsoap tempuri service method-action: Subtract http://Microsoft.Samples.Http/ICalculator/Subtract //gsoap tempuri service method-output-action: Subtract http://tempuri.org//ICalculator/SubtractResponse int __tempuri__Subtract( _mssamh__Subtract* mssamh__Subtract, ///< Request parameter _mssamh__SubtractResponse* mssamh__SubtractResponse ///< Response parameter ); /******************************************************************************\ * * * Service Operation * * __tempuri__Multiply * * * \******************************************************************************/ /// Operation "__tempuri__Multiply" of service binding "BasicHttpBinding_USCOREICalculator" /** Operation details: - SOAP document/literal style messaging - SOAP action: "http://Microsoft.Samples.Http/ICalculator/Multiply" - Addressing method action: "http://tempuri.org//ICalculator/Multiply" - Addressing method output action: "http://tempuri.org//ICalculator/MultiplyResponse" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___tempuri__Multiply( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: _mssamh__Multiply* mssamh__Multiply, // response parameters: _mssamh__MultiplyResponse* mssamh__MultiplyResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __tempuri__Multiply( struct soap *soap, // request parameters: _mssamh__Multiply* mssamh__Multiply, // response parameters: _mssamh__MultiplyResponse* mssamh__MultiplyResponse ); @endcode C++ proxy class (defined in soapBasicHttpBinding_USCOREICalculatorProxy.h): @code class BasicHttpBinding_USCOREICalculatorProxy; @endcode Important: use soapcpp2 option '-i' to generate greatly improved and easy-to-use proxy classes; C++ service class (defined in soapBasicHttpBinding_USCOREICalculatorService.h): @code class BasicHttpBinding_USCOREICalculatorService; @endcode Important: use soapcpp2 option '-i' to generate greatly improved and easy-to-use service classes; */ //gsoap tempuri service method-style: Multiply document //gsoap tempuri service method-encoding: Multiply literal //gsoap tempuri service method-action: Multiply http://Microsoft.Samples.Http/ICalculator/Multiply //gsoap tempuri service method-output-action: Multiply http://tempuri.org//ICalculator/MultiplyResponse int __tempuri__Multiply( _mssamh__Multiply* mssamh__Multiply, ///< Request parameter _mssamh__MultiplyResponse* mssamh__MultiplyResponse ///< Response parameter ); /******************************************************************************\ * * * Service Operation * * __tempuri__Divide * * * \******************************************************************************/ /// Operation "__tempuri__Divide" of service binding "BasicHttpBinding_USCOREICalculator" /** Operation details: - SOAP document/literal style messaging - SOAP action: "http://Microsoft.Samples.Http/ICalculator/Divide" - Addressing method action: "http://tempuri.org//ICalculator/Divide" - Addressing method output action: "http://tempuri.org//ICalculator/DivideResponse" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___tempuri__Divide( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // request parameters: _mssamh__Divide* mssamh__Divide, // response parameters: _mssamh__DivideResponse* mssamh__DivideResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __tempuri__Divide( struct soap *soap, // request parameters: _mssamh__Divide* mssamh__Divide, // response parameters: _mssamh__DivideResponse* mssamh__DivideResponse ); @endcode C++ proxy class (defined in soapBasicHttpBinding_USCOREICalculatorProxy.h): @code class BasicHttpBinding_USCOREICalculatorProxy; @endcode Important: use soapcpp2 option '-i' to generate greatly improved and easy-to-use proxy classes; C++ service class (defined in soapBasicHttpBinding_USCOREICalculatorService.h): @code class BasicHttpBinding_USCOREICalculatorService; @endcode Important: use soapcpp2 option '-i' to generate greatly improved and easy-to-use service classes; */ //gsoap tempuri service method-style: Divide document //gsoap tempuri service method-encoding: Divide literal //gsoap tempuri service method-action: Divide http://Microsoft.Samples.Http/ICalculator/Divide //gsoap tempuri service method-output-action: Divide http://tempuri.org//ICalculator/DivideResponse int __tempuri__Divide( _mssamh__Divide* mssamh__Divide, ///< Request parameter _mssamh__DivideResponse* mssamh__DivideResponse ///< Response parameter ); /** @page BasicHttpBinding_USCOREICalculator Binding "BasicHttpBinding_USCOREICalculator" @section BasicHttpBinding_USCOREICalculator_policy_enablers Policy Enablers of Binding "BasicHttpBinding_USCOREICalculator" Based on policies, this service imports - WS-Policy reminders and enablers: - WS-Addressing 1.0 (2005/08, accepts 2004/08): @code #import "wsa5.h" // to be added to this header file for the soapcpp2 build step @endcode @code #include "plugin/wsaapi.h" soap_register_plugin(soap, soap_wsa); // register the wsa plugin in your code // See the user guide gsoap/doc/wsa/html/index.html @endcode - WS-Addressing (2004/08): @code #import "wsa.h" // to be added to this header file for the soapcpp2 build step @endcode @code #include "plugin/wsaapi.h" soap_register_plugin(soap, soap_wsa); // register the wsa plugin in your code // See the user guide gsoap/doc/wsa/html/index.html @endcode - WS-ReliableMessaging 1.1: @code #import "wsrm.h" // to be added to this header file for the soapcpp2 build step @endcode @code #include "plugin/wsrmapi.h" soap_register_plugin(soap, soap_wsa); // register the wsa plugin in your code soap_register_plugin(soap, soap_wsrm); // register the wsrm plugin in your code // See the user guide gsoap/doc/wsrm/html/index.html @endcode - WS-Security (SOAP Message Security) 1.0 (accepts 1.1): @code #import "wsse.h" // to be added to this header file for the soapcpp2 build step @endcode @code #include "plugin/wsseapi.h" soap_register_plugin(soap, soap_wsse); // register the wsse plugin in your code // See the user guide gsoap/doc/wsse/html/index.html @endcode - WS-Security (SOAP Message Security) 1.1 (accepts 1.0): @code #import "wsse11.h" // to be added to this header file for the soapcpp2 build step @endcode @code #include "plugin/wsseapi.h" soap_register_plugin(soap, soap_wsse); // register the wsse plugin in your code // See the user guide gsoap/doc/wsse/html/index.html @endcode - HTTP Digest Authentication: @code #include "plugin/httpda.h" soap_register_plugin(soap, soap_http_da); // register the HTTP DA plugin in your code // See the user guide gsoap/doc/httpda/html/index.html @endcode */ /******************************************************************************\ * * * XML Data Binding * * * \******************************************************************************/ /** @page page_XMLDataBinding XML Data Binding SOAP/XML services use data bindings contractually bound by WSDL and auto- generated by wsdl2h and soapcpp2 (see Service Bindings). Plain data bindings are adopted from XML schemas as part of the WSDL types section or when running wsdl2h on a set of schemas to produce non-SOAP-based XML data bindings. The following readers and writers are C/C++ data type (de)serializers auto- generated by wsdl2h and soapcpp2. Run soapcpp2 on this file to generate the (de)serialization code, which is stored in soapC.c[pp]. Include "soapH.h" in your code to import these data type and function declarations. Only use the soapcpp2-generated files in your project build. Do not include the wsdl2h- generated .h file in your code. XML content can be retrieved from: - a file descriptor, using soap->recvfd = fd - a socket, using soap->socket = ... - a C++ stream, using soap->is = ... - a buffer, using the soap->frecv() callback XML content can be stored to: - a file descriptor, using soap->sendfd = fd - a socket, using soap->socket = ... - a C++ stream, using soap->os = ... - a buffer, using the soap->fsend() callback @section mssamhi Top-level root elements of schema "http://Microsoft.Samples.Http/Imports" @section mssamh Top-level root elements of schema "http://Microsoft.Samples.Http" - @ref _mssamh__Add @code // Reader (returns SOAP_OK on success): soap_read__mssamh__Add(struct soap*, _mssamh__Add*); // Writer (returns SOAP_OK on success): soap_write__mssamh__Add(struct soap*, _mssamh__Add*); @endcode - @ref _mssamh__AddResponse @code // Reader (returns SOAP_OK on success): soap_read__mssamh__AddResponse(struct soap*, _mssamh__AddResponse*); // Writer (returns SOAP_OK on success): soap_write__mssamh__AddResponse(struct soap*, _mssamh__AddResponse*); @endcode - @ref _mssamh__Subtract @code // Reader (returns SOAP_OK on success): soap_read__mssamh__Subtract(struct soap*, _mssamh__Subtract*); // Writer (returns SOAP_OK on success): soap_write__mssamh__Subtract(struct soap*, _mssamh__Subtract*); @endcode - @ref _mssamh__SubtractResponse @code // Reader (returns SOAP_OK on success): soap_read__mssamh__SubtractResponse(struct soap*, _mssamh__SubtractResponse*); // Writer (returns SOAP_OK on success): soap_write__mssamh__SubtractResponse(struct soap*, _mssamh__SubtractResponse*); @endcode - @ref _mssamh__Multiply @code // Reader (returns SOAP_OK on success): soap_read__mssamh__Multiply(struct soap*, _mssamh__Multiply*); // Writer (returns SOAP_OK on success): soap_write__mssamh__Multiply(struct soap*, _mssamh__Multiply*); @endcode - @ref _mssamh__MultiplyResponse @code // Reader (returns SOAP_OK on success): soap_read__mssamh__MultiplyResponse(struct soap*, _mssamh__MultiplyResponse*); // Writer (returns SOAP_OK on success): soap_write__mssamh__MultiplyResponse(struct soap*, _mssamh__MultiplyResponse*); @endcode - @ref _mssamh__Divide @code // Reader (returns SOAP_OK on success): soap_read__mssamh__Divide(struct soap*, _mssamh__Divide*); // Writer (returns SOAP_OK on success): soap_write__mssamh__Divide(struct soap*, _mssamh__Divide*); @endcode - @ref _mssamh__DivideResponse @code // Reader (returns SOAP_OK on success): soap_read__mssamh__DivideResponse(struct soap*, _mssamh__DivideResponse*); // Writer (returns SOAP_OK on success): soap_write__mssamh__DivideResponse(struct soap*, _mssamh__DivideResponse*); @endcode */ /* End of calculator.h */ gsoap-2.8.28/gsoap/samples/wcf/Basic/Http/Doxyfile0000644000175000017500000002271112653650156021302 0ustar ellertellert# Doxyfile 1.3.8 #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- PROJECT_NAME = "WCF Basic Http" PROJECT_NUMBER = "" OUTPUT_DIRECTORY = CREATE_SUBDIRS = NO OUTPUT_LANGUAGE = English USE_WINDOWS_ENCODING = NO BRIEF_MEMBER_DESC = YES REPEAT_BRIEF = YES ABBREVIATE_BRIEF = "The $name class" \ "The $name widget" \ "The $name file" \ is \ provides \ specifies \ contains \ represents \ a \ an \ the ALWAYS_DETAILED_SEC = NO INLINE_INHERITED_MEMB = NO FULL_PATH_NAMES = YES STRIP_FROM_PATH = /Applications/ STRIP_FROM_INC_PATH = SHORT_NAMES = NO JAVADOC_AUTOBRIEF = NO MULTILINE_CPP_IS_BRIEF = NO DETAILS_AT_TOP = NO INHERIT_DOCS = YES DISTRIBUTE_GROUP_DOC = NO TAB_SIZE = 8 ALIASES = OPTIMIZE_OUTPUT_FOR_C = NO OPTIMIZE_OUTPUT_JAVA = NO SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- EXTRACT_ALL = YES EXTRACT_PRIVATE = YES EXTRACT_STATIC = YES EXTRACT_LOCAL_CLASSES = YES EXTRACT_LOCAL_METHODS = NO HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_CLASSES = NO HIDE_FRIEND_COMPOUNDS = NO HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = NO CASE_SENSE_NAMES = NO HIDE_SCOPE_NAMES = NO SHOW_INCLUDE_FILES = YES INLINE_INFO = YES SORT_MEMBER_DOCS = YES SORT_BRIEF_DOCS = NO SORT_BY_SCOPE_NAME = NO GENERATE_TODOLIST = YES GENERATE_TESTLIST = YES GENERATE_BUGLIST = YES GENERATE_DEPRECATEDLIST= YES ENABLED_SECTIONS = MAX_INITIALIZER_LINES = 30 SHOW_USED_FILES = YES #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- QUIET = NO WARNINGS = YES WARN_IF_UNDOCUMENTED = YES WARN_IF_DOC_ERROR = YES WARN_FORMAT = "$file:$line: $text" WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- INPUT = calculator.h calculator.cpp FILE_PATTERNS = *.c \ *.cc \ *.cxx \ *.cpp \ *.c++ \ *.java \ *.ii \ *.ixx \ *.ipp \ *.i++ \ *.inl \ *.h \ *.hh \ *.hxx \ *.hpp \ *.h++ \ *.idl \ *.odl \ *.cs \ *.php \ *.php3 \ *.inc \ *.m \ *.mm \ *.C \ *.CC \ *.C++ \ *.II \ *.I++ \ *.H \ *.HH \ *.H++ \ *.CS \ *.PHP \ *.PHP3 \ *.M \ *.MM RECURSIVE = NO EXCLUDE = EXCLUDE_SYMLINKS = NO EXCLUDE_PATTERNS = EXAMPLE_PATH = EXAMPLE_PATTERNS = * EXAMPLE_RECURSIVE = NO IMAGE_PATH = INPUT_FILTER = FILTER_PATTERNS = FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- SOURCE_BROWSER = YES INLINE_SOURCES = NO STRIP_CODE_COMMENTS = YES REFERENCED_BY_RELATION = NO REFERENCES_RELATION = NO VERBATIM_HEADERS = NO #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- ALPHABETICAL_INDEX = NO COLS_IN_ALPHA_INDEX = 5 IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- GENERATE_HTML = YES HTML_OUTPUT = html HTML_FILE_EXTENSION = .html HTML_HEADER = HTML_FOOTER = HTML_STYLESHEET = HTML_ALIGN_MEMBERS = YES GENERATE_HTMLHELP = NO CHM_FILE = HHC_LOCATION = GENERATE_CHI = NO BINARY_TOC = NO TOC_EXPAND = NO DISABLE_INDEX = NO ENUM_VALUES_PER_LINE = 4 GENERATE_TREEVIEW = NO TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- GENERATE_LATEX = NO LATEX_OUTPUT = latex LATEX_CMD_NAME = latex MAKEINDEX_CMD_NAME = makeindex COMPACT_LATEX = NO PAPER_TYPE = a4wide EXTRA_PACKAGES = LATEX_HEADER = PDF_HYPERLINKS = NO USE_PDFLATEX = NO LATEX_BATCHMODE = NO LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- GENERATE_RTF = NO RTF_OUTPUT = rtf COMPACT_RTF = NO RTF_HYPERLINKS = NO RTF_STYLESHEET_FILE = RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- GENERATE_MAN = NO MAN_OUTPUT = man MAN_EXTENSION = .3 MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- GENERATE_XML = NO XML_OUTPUT = xml XML_SCHEMA = XML_DTD = XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- GENERATE_PERLMOD = NO PERLMOD_LATEX = NO PERLMOD_PRETTY = YES PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- ENABLE_PREPROCESSING = YES MACRO_EXPANSION = NO EXPAND_ONLY_PREDEF = NO SEARCH_INCLUDES = YES INCLUDE_PATH = INCLUDE_FILE_PATTERNS = PREDEFINED = EXPAND_AS_DEFINED = SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- TAGFILES = GENERATE_TAGFILE = ALLEXTERNALS = NO EXTERNAL_GROUPS = YES PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- CLASS_DIAGRAMS = NO HIDE_UNDOC_RELATIONS = YES HAVE_DOT = YES CLASS_GRAPH = YES COLLABORATION_GRAPH = YES UML_LOOK = NO TEMPLATE_RELATIONS = NO INCLUDE_GRAPH = YES INCLUDED_BY_GRAPH = YES CALL_GRAPH = NO GRAPHICAL_HIERARCHY = YES DOT_IMAGE_FORMAT = png DOT_PATH = /usr/local/bin DOTFILE_DIRS = MAX_DOT_GRAPH_WIDTH = 1024 MAX_DOT_GRAPH_HEIGHT = 1024 MAX_DOT_GRAPH_DEPTH = 1000 GENERATE_LEGEND = YES DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- SEARCHENGINE = NO gsoap-2.8.28/gsoap/samples/wcf/Basic/Http/Makefile0000644000175000017500000000224612653650156021235 0ustar ellertellertURL=http://192.168.2.2:8000/ServiceModelSamples/service WSDL=../../../../wsdl/wsdl2h GSOAP=../../../../src/soapcpp2 SOAPH=../../../../stdsoap2.h SOAPC=../../../../stdsoap2.c SOAPCPP=../../../../stdsoap2.cpp SOAPDOMC=../../../../dom.c SOAPDOMCPP=../../../../dom.cpp TYPEMAP=../../../../typemap.dat CC=gcc CPP=g++ LIBS= GSFLAGS=-L -I../../../../import COFLAGS=-O2 CWFLAGS=-Wall -Wno-deprecated-declarations CIFLAGS=-I. -I../../../.. -I../../../../plugin CMFLAGS= #CMFLAGS=-DDEBUG CFLAGS= $(CWFLAGS) $(COFLAGS) $(CIFLAGS) $(CMFLAGS) all: calculator calculator: calculator.h calculator.cpp $(SOAPH) $(SOAPC) $(GSOAP) $(GSFLAGS) -a -j calculator.h $(CPP) $(CFLAGS) -o calculator calculator.cpp soapC.cpp soapBasicHttpBinding_USCOREICalculatorService.cpp soapBasicHttpBinding_USCOREICalculatorProxy.cpp $(SOAPCPP) $(LIBS) calculator.h: $(WSDL) -t $(TYPEMAP) -o calculator.h $(URL)?wsdl .PHONY: clean distclean clean: rm -f *.o soapH.h soapStub.h soapC.* soapClient.* soapServer.* soap*Proxy.* soap*Service.* soap*Object.* distclean: rm -f *.o soapH.h soapStub.h soapC.* soapClient.* soapServer.* soap*Proxy.* soap*Service.* soap*Object.* rm -f *.xml *.nsmap *.log rm -f calculator gsoap-2.8.28/gsoap/samples/wcf/Basic/Http/calculator.cpp0000644000175000017500000001406412653650156022433 0ustar ellertellert/* calculator.cpp WCF BasicHttpBinding demo See the README.txt gSOAP XML Web services tools Copyright (C) 2000-2012, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under one of the following licenses: GPL, the gSOAP public license, or Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2012, Robert van Engelen, Genivia Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapBasicHttpBinding_USCOREICalculatorService.h" #include "soapBasicHttpBinding_USCOREICalculatorProxy.h" #include "BasicHttpBinding_USCOREICalculator.nsmap" const char *URI = NULL; // Set to the service URI int main(int argc, char **argv) { if (argc >= 2) { // Service sample application int port = atoi(argv[1]); BasicHttpBinding_USCOREICalculatorService service(SOAP_XML_INDENT); service.soap->send_timeout = service.soap->recv_timeout = 10; // 10 sec std::cerr << "Server running" << std::endl; for (;;) { service.run(port); service.soap_stream_fault(std::cerr); } } else { // Client sample application BasicHttpBinding_USCOREICalculatorProxy proxy(URI, SOAP_XML_INDENT); proxy.soap->send_timeout = proxy.soap->recv_timeout = 10; // 10 sec double n1 = 3.14, n2 = 1.41; _mssamh__Add areq; _mssamh__AddResponse ares; areq.n1 = &n1; areq.n2 = &n2; if (proxy.Add(&areq, &ares) == SOAP_OK && ares.AddResult) printf("Add(%g, %g) = %g\n", *areq.n1, *areq.n2, *ares.AddResult); else proxy.soap_stream_fault(std::cerr); proxy.destroy(); _mssamh__Subtract sreq; _mssamh__SubtractResponse sres; sreq.n1 = &n1; sreq.n2 = &n2; if (proxy.Subtract(&sreq, &sres) == SOAP_OK && sres.SubtractResult) printf("Subtract(%g, %g) = %g\n", *sreq.n1, *sreq.n2, *sres.SubtractResult); else proxy.soap_stream_fault(std::cerr); proxy.destroy(); _mssamh__Multiply mreq; _mssamh__MultiplyResponse mres; mreq.n1 = &n1; mreq.n2 = &n2; if (proxy.Multiply(&mreq, &mres) == SOAP_OK && mres.MultiplyResult) printf("Multiply(%g, %g) = %g\n", *mreq.n1, *mreq.n2, *mres.MultiplyResult); else proxy.soap_stream_fault(std::cerr); proxy.destroy(); _mssamh__Divide dreq; _mssamh__DivideResponse dres; dreq.n1 = &n1; dreq.n2 = &n2; if (proxy.Divide(&dreq, &dres) == SOAP_OK && dres.DivideResult) printf("Divide(%g, %g) = %g\n", *dreq.n1, *dreq.n2, *dres.DivideResult); else proxy.soap_stream_fault(std::cerr); proxy.destroy(); } return 0; } /******************************************************************************\ * * Service operations * \******************************************************************************/ int BasicHttpBinding_USCOREICalculatorService::Add(_mssamh__Add *Add, _mssamh__AddResponse *AddResponse) { double *res = (double*)soap_malloc(soap, sizeof(double)); if (Add && Add->n1 && Add->n2) *res = *Add->n1 + *Add->n2; else return soap_sender_fault(soap, "Invalid data", NULL); AddResponse->AddResult = res; return SOAP_OK; } int BasicHttpBinding_USCOREICalculatorService::Subtract(_mssamh__Subtract *Subtract, _mssamh__SubtractResponse *SubtractResponse) { double *res = (double*)soap_malloc(soap, sizeof(double)); if (Subtract && Subtract->n1 && Subtract->n2) *res = *Subtract->n1 - *Subtract->n2; else return soap_sender_fault(soap, "Invalid data", NULL); SubtractResponse->SubtractResult = res; return SOAP_OK; } int BasicHttpBinding_USCOREICalculatorService::Multiply(_mssamh__Multiply *Multiply, _mssamh__MultiplyResponse *MultiplyResponse) { double *res = (double*)soap_malloc(soap, sizeof(double)); if (Multiply && Multiply->n1 && Multiply->n2) *res = *Multiply->n1 * *Multiply->n2; else return soap_sender_fault(soap, "Invalid data", NULL); MultiplyResponse->MultiplyResult = res; return SOAP_OK; } int BasicHttpBinding_USCOREICalculatorService::Divide(_mssamh__Divide *Divide, _mssamh__DivideResponse *DivideResponse) { double *res = (double*)soap_malloc(soap, sizeof(double)); if (Divide && Divide->n1 && Divide->n2 && *Divide->n2 != 0.0) *res = *Divide->n1 / *Divide->n2; else return soap_sender_fault(soap, "Invalid data", NULL); DivideResponse->DivideResult = res; return SOAP_OK; } gsoap-2.8.28/gsoap/samples/wcf/Basic/Http/README.txt0000644000175000017500000000454112653650156021273 0ustar ellertellertINSTRUCTIONS Install the WCF samples: Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4. You should have: C:\WF_WCF_Samples\WCF\Basic\Binding\Basic\Http\CS Open the Basic Http WCF C# example client and service project in Visual Studio. Modify the configuration and source code as described below. Notes: C:> denotes the Windows command line $ denotes the Unix/Linux command line To connect a WCF client to a gSOAP service ------------------------------------------ In App.config set the endpoint to the server endpoint, say "10.0.1.5" over wifi: Run the gSOAP server on port 8000. To self-host a WCF service -------------------------- Obtain the machine name or IP C:> ipconfig /all say it is 10.0.1.5 over wifi. Add a Main() to self-host by adding a Program class in the WCF sample C:\WF_WCF_Samples\WCF\Basic\Binding\Basic\Http\CS\service using System; using System.ServiceModel; using System.Configuration; using System.ServiceModel.Description; namespace ... { ... public class Program { public static void Main() { Uri httpUrl = new Uri("http://10.0.1.5:8000/ServiceModelSamples/service"); using (ServiceHost serviceHost = new ServiceHost(typeof(CalculatorService), httpUrl)) { BasicHttpBinding bhb = new BasicHttpBinding(); serviceHost.AddServiceEndpoint(typeof(ICalculator), bhb, ""); ServiceMetadataBehavior smb = new ServiceMetadataBehavior(); smb.HttpGetEnabled = true; serviceHost.Description.Behaviors.Add(smb); serviceHost.Open(); Console.WriteLine("Press to terminate service."); Console.ReadLine(); } } } Under Project Properties change the Output type to Console Application to generate a service.exe. Use a web browser to access the service at http://10.0.1.5:8000/ServiceModelSamples/service and access the WSDL at http://10.0.1.5:8000/ServiceModelSamples/service?wsdl To run wsdl2h to generate C++ code: $ wsdl2h -t ../../../../typemap.dat -o calculator.h 'http://10.0.1.5:8000/ServiceModelSamples/service?wsdl' This may take some time, since the self-hosted service is an iterative web server that allows only one open connection. A pre-generated calculator.h file is included in the build directory. gsoap-2.8.28/gsoap/samples/wcf/README.txt0000644000175000017500000000123412653650156017327 0ustar ellertellert INSTRUCTIONS Install the WCF samples. For the basic bindings, you should have: C:\WF_WCF_Samples\WCF\Basic\Binding\Basic\Http C:\WF_WCF_Samples\WCF\Basic\Binding\Basic\TransportSecurity C:\WF_WCF_Samples\WCF\Basic\Binding\Basic\MessageSecurity The gSOAP examples to interact with the WCF client and service examples: Basic/Http Basic/TransportSecurity Basic/MessageSecurity For the WS bindings, you should have: C:\WF_WCF_Samples\WCF\Basic\Binding\WS\DualHttp The gSOAP examples to interact with the WCF client and service examples: WS/DualHttp Additional sample demo applications for WCF bindings will be added to upcoming gSOAP releases. gsoap-2.8.28/gsoap/samples/Makefile.am0000644000175000017500000000100412653650156017101 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = foreign 1.4 SUBDIRS = \ autotest calc calc++ databinding dime dom oneway oneway++ \ factory factorytest \ gmt googleapi hello httpcookies lu magic mashup mashup++ \ chaining chaining++ primes \ mtom mtom-stream polytest roll router rss ssl template udp varparam \ wsa wsrm wsse xml-rpc-json rest gsoap-2.8.28/gsoap/samples/Makefile.cpp_proxy_rules0000644000175000017500000000102612653650156021745 0ustar ellertellert## common Makefile rules for building the C++ - soap samples ## SOAP_CPP_SRC = $(SOAP_H_FILES) $(SOAP_NS) $(SOAP_CPP_SRC) : $(SOAPHEADER) $(SOAP) -i -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $< LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_CPP_SRC) CLEANFILES = $(SOAP_CPP_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.cpp soap*Proxy.h soap*Proxy.cpp soap*Object.h soap*Service.h soap*Service.cpp soapClient.cpp soapServer.cpp soapClientLib.cpp soapServerLib.cpp *~ gsoap-2.8.28/gsoap/samples/magic/0000755000175000017500000000000012653650170016126 5ustar ellertellertgsoap-2.8.28/gsoap/samples/magic/magic.h0000644000175000017500000000421612653650156017366 0ustar ellertellert/* -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap ns1 service name: magic //gsoap ns1 service style: rpc //gsoap ns1 service encoding: encoded //gsoap ns1 service namespace: http://websrv.cs.fsu.edu/~engelen/magic.wsdl //gsoap ns1 service location: http://websrv.cs.fsu.edu/~engelen/magicserver.cgi //gsoap ns1 service documentation: Demo Magic Squares service //gsoap ns1 schema namespace: urn:MagicSquare typedef int xsd__int; class vector { public: xsd__int *__ptr; int __size; struct soap *soap; vector(); vector(int); virtual ~vector(); void resize(int); int& operator[](int) const; }; class matrix { public: vector *__ptr; int __size; struct soap *soap; matrix(); matrix(int, int); virtual ~matrix(); void resize(int, int); vector& operator[](int) const; }; int ns1__magic(xsd__int rank, matrix *result); gsoap-2.8.28/gsoap/samples/magic/Makefile.in0000644000175000017500000004710412653650156020205 0ustar ellertellert# Makefile.in generated by automake 1.14 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = magic$(EXEEXT) magicserver$(EXEEXT) DIST_COMMON = $(srcdir)/../Makefile.defines \ $(srcdir)/../Makefile.cpp_rules $(srcdir)/Makefile.in \ $(srcdir)/Makefile.am $(top_srcdir)/mkinstalldirs \ $(top_srcdir)/depcomp subdir = gsoap/samples/magic ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = am__objects_2 = soapC.$(OBJEXT) am__objects_3 = soapClient.$(OBJEXT) $(am__objects_2) am_magic_OBJECTS = magic.$(OBJEXT) $(am__objects_1) $(am__objects_3) magic_OBJECTS = $(am_magic_OBJECTS) magic_LDADD = $(LDADD) am__DEPENDENCIES_1 = magic_DEPENDENCIES = $(SOAP_CPP_LIB) $(am__DEPENDENCIES_1) am__objects_4 = soapServer.$(OBJEXT) $(am__objects_2) am_magicserver_OBJECTS = magicserver.$(OBJEXT) $(am__objects_1) \ $(am__objects_4) magicserver_OBJECTS = $(am_magicserver_OBJECTS) magicserver_DEPENDENCIES = $(SOAP_CPP_LIB) $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(magic_SOURCES) $(magicserver_SOURCES) DIST_SOURCES = $(magic_SOURCES) $(magicserver_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ STRIP = @STRIP@ VERSION = @VERSION@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 SOAPHEADER = magic.h AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a SOAP_CPP_SRC = $(SOAP_CPP_CLIENT) soapServer.cpp $(SOAP_H_FILES) $(SOAP_NS) LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_CPP_SRC) CLEANFILES = $(SOAP_CPP_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.cpp soap*Proxy.h soap*Proxy.cpp soap*Object.h soap*Service.h soap*Service.cpp soapClient.cpp soapServer.cpp soapClientLib.cpp soapServerLib.cpp *~ SOAP_NS = magic.nsmap magic.wsdl magic_SOURCES = magic.cpp $(SOAPHEADER) $(SOAP_CPP_CLIENT) magicserver_SOURCES = magicserver.cpp $(SOAPHEADER) $(SOAP_CPP_SERVER) magicserver_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) -lpthread all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_rules $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/magic/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/magic/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_rules: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) magic$(EXEEXT): $(magic_OBJECTS) $(magic_DEPENDENCIES) $(EXTRA_magic_DEPENDENCIES) @rm -f magic$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(magic_OBJECTS) $(magic_LDADD) $(LIBS) magicserver$(EXEEXT): $(magicserver_OBJECTS) $(magicserver_DEPENDENCIES) $(EXTRA_magicserver_DEPENDENCIES) @rm -f magicserver$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(magicserver_OBJECTS) $(magicserver_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/magic.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/magicserver.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapC.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapClient.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapServer.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am $(SOAP_CPP_SRC) : $(SOAPHEADER) $(SOAP) -L -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $(SOAPHEADER) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.28/gsoap/samples/magic/magicserver.cpp0000644000175000017500000002063112653650156021147 0ustar ellertellert/* magicserver.cpp Example CGI or stand-alone multi-threaded magic squares Web service. Install as a CGI application. Alternatively, run from command line with arguments IP (which must be the IP of the current machine you are using) and PORT to run this as a stand-alone server on a port. For example: $ magicserver.cgi 18081 & To let the 'magic' client application talk to this service, change the URL in magic.cpp into "http://localhost:18081" To show wsdl as stand-alone, use: http://localhost:18081/?wsdl This example illustrates two alternative server implementations with threads. The first implementation recycles gSOAP resources but is bounded to a maximum number of threads. Each thread needs to be joined, so runaway processes will halt the server at some point. The second implementation has no thread limitation. Runaway threads are not controlled. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" #include "magic.nsmap" #include #ifdef _POSIX_THREADS #include // use Pthreads #endif #define BACKLOG (100) // Max. request backlog #define MAX_THR (8) // Max. threads to serve requests #define SLEEP (0) // >0 will make each thread sleep to mimic work load //////////////////////////////////////////////////////////////////////////////// // // Magic Squares Server // //////////////////////////////////////////////////////////////////////////////// int http_get(struct soap*); void *process_request(void*); int main(int argc, char **argv) { struct soap soap; soap_init(&soap); if (argc < 2) // no args: assume this is a CGI application { soap_serve(&soap); // serve request soap_destroy(&soap);// cleanup class instances soap_end(&soap); // cleanup } else { #ifdef _POSIX_THREADS pthread_t tid; #endif SOAP_SOCKET m, s; // soap.accept_timeout = 60; // die if no requests are made within 1 minute int port = atoi(argv[1]); // register a HTTP GET handler soap.fget = http_get; m = soap_bind(&soap, NULL, port, 100); if (!soap_valid_socket(m)) { soap_print_fault(&soap, stderr); exit(1); } fprintf(stderr, "Socket connection successful %d\n", m); for (int i = 1; ; i++) { s = soap_accept(&soap); if (!soap_valid_socket(s)) { if (soap.errnum) soap_print_fault(&soap, stderr); else fprintf(stderr, "Server timed out\n"); break; } fprintf(stderr, "%d: accepted %d IP=%d.%d.%d.%d ... ", i, s, (int)(soap.ip>>24)&0xFF, (int)(soap.ip>>16)&0xFF, (int)(soap.ip>>8)&0xFF, (int)soap.ip&0xFF); #ifdef _POSIX_THREADS pthread_create(&tid, NULL, (void*(*)(void*))process_request, (void*)soap_copy(&soap)); #else soap_serve(&soap); // process RPC skeletons fprintf(stderr, "served\n"); soap_destroy(&soap); soap_end(&soap); // clean up #endif } } soap_done(&soap); return 0; } #ifdef _POSIX_THREADS void *process_request(void *soap) { pthread_detach(pthread_self()); soap_serve((struct soap*)soap); soap_destroy((struct soap*)soap); soap_end((struct soap*)soap); soap_free((struct soap*)soap); return NULL; } #endif //////////////////////////////////////////////////////////////////////////////// // // Magic Square Algorithm // //////////////////////////////////////////////////////////////////////////////// int ns1__magic(struct soap *soap, int n, matrix *square) { int i, j, k, l, key = 2; if (n < 1) return soap_sender_fault(soap, "Negative or zero size", "The input parameter must be positive"); if (n > 100) return soap_sender_fault(soap, "size > 100", "The input parameter must not be too large"); square->resize(n, n); for (i = 0; i < n; i++) for (j = 0; j < n; j++) (*square)[i][j] = 0; i = 0; j = (n-1)/2; (*square)[i][j] = 1; while (key <= n*n) { if (i-1 < 0) k = n-1; else k = i-1; if (j-1 < 0) l = n-1; else l = j-1; if ((*square)[k][l]) i = (i+1) % n; else { i = k; j = l; } (*square)[i][j] = key; key++; } sleep(SLEEP); // mimic work load latency return SOAP_OK; } //////////////////////////////////////////////////////////////////////////////// // // Class vector Methods // //////////////////////////////////////////////////////////////////////////////// vector::vector() { __ptr = 0; __size = 0; } vector::vector(int n) { __ptr = (int*)soap_malloc(soap, n*sizeof(int)); __size = n; } vector::~vector() { soap_unlink(soap, this); // not required, but just to make sure if someone calls delete on this } void vector::resize(int n) { int *p; if (__size == n) return; p = (int*)soap_malloc(soap, n*sizeof(int)); if (__ptr) { for (int i = 0; i < (n <= __size ? n : __size); i++) p[i] = __ptr[i]; soap_unlink(soap, __ptr); free(__ptr); } __size = n; __ptr = p; } int& vector::operator[](int i) const { if (!__ptr || i < 0 || i >= __size) fprintf(stderr, "Array index out of bounds\n"); return (__ptr)[i]; } //////////////////////////////////////////////////////////////////////////////// // // Class matrix Methods // //////////////////////////////////////////////////////////////////////////////// matrix::matrix() { __ptr = 0; __size = 0; } matrix::matrix(int rows, int cols) { __ptr = soap_new_vector(soap, rows); for (int i = 0; i < cols; i++) __ptr[i].resize(cols); __size = rows; } matrix::~matrix() { soap_unlink(soap, this); // not required, but just to make sure if someone calls delete on this } void matrix::resize(int rows, int cols) { int i; vector *p; if (__size != rows) { if (__ptr) { p = soap_new_vector(soap, rows); for (i = 0; i < (rows <= __size ? rows : __size); i++) { if (this[i].__size != cols) (*this)[i].resize(cols); (p+i)->__ptr = __ptr[i].__ptr; (p+i)->__size = cols; } for (; i < rows; i++) __ptr[i].resize(cols); } else { __ptr = soap_new_vector(soap, rows); for (i = 0; i < rows; i++) __ptr[i].resize(cols); __size = rows; } } else for (i = 0; i < __size; i++) __ptr[i].resize(cols); } vector& matrix::operator[](int i) const { if (!__ptr || i < 0 || i >= __size) fprintf(stderr, "Array index out of bounds\n"); return __ptr[i]; } //////////////////////////////////////////////////////////////////////////////// // // A HTTP GET Handler to display WSDL (magic.wsdl) // //////////////////////////////////////////////////////////////////////////////// int http_get(struct soap * soap) { FILE *fd = NULL; char *s = strchr(soap->path, '?'); if (!s || strcmp(s, "?wsdl")) return SOAP_GET_METHOD; fd = fopen("magic.wsdl", "rb"); // open WSDL file to copy if (!fd) return 404; // return HTTP not found error soap->http_content = "text/xml"; // HTTP header with text/xml content soap_response(soap, SOAP_FILE); for (;;) { size_t r = fread(soap->tmpbuf, 1, sizeof(soap->tmpbuf), fd); if (!r) break; if (soap_send_raw(soap, soap->tmpbuf, r)) break; // can't send, but little we can do about that } fclose(fd); soap_end_send(soap); return SOAP_OK; } gsoap-2.8.28/gsoap/samples/magic/magic.cpp0000644000175000017500000001236412653650156017724 0ustar ellertellert/* magic.cpp Magic squares client. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" #include "magic.nsmap" //////////////////////////////////////////////////////////////////////////////// // // Magic Squares Client // //////////////////////////////////////////////////////////////////////////////// // To access a stand-alone server on a port: magicserver[] = "IP:PORT"; // use "http://" to include HTTP header, e.g: magicserver[] = "http://IP:PORT"; const char magicserver[] = "http://www.cs.fsu.edu/~engelen/magicserver.cgi"; // const char magicserver[] = "http://localhost:8080"; // To send request to stdout and read response from stdin, use: // const char magicserver[] = "http://"; int main(int argc, char **argv) { struct soap soap; int r; soap_init(&soap); matrix *A = soap_new_matrix(&soap, -1); if (argc <= 1) { char *s = getenv("QUERY_STRING"); if (!s || (r = atoi(s)) == 0) r = 7; } else r = atoi(argv[1]); printf("Content-type: text/html\r\n\r\n

Magic Square of Rank %d

\n", r);
  if (soap_call_ns1__magic(&soap, magicserver, NULL, r, A))
  { soap_print_fault(&soap, stderr);
    soap_print_fault_location(&soap, stderr);
  }
  else
  { for (int i = 0; i < (*A).__size; i++)
    { int sum = 0;
      for (int j = 0; j < (*A)[i].__size; j++)
      { sum += (*A)[i][j];
        printf("%4d", (*A)[i][j]);
      }
      printf(" =%4d\n", sum);
    }
    for (int j = 0; j < (*A)[0].__size; j++)
      printf("  ||");
    printf("\n");
    for (int j = 0; j < (*A)[0].__size; j++)
    { int sum = 0;
      for (int i = 0; i < (*A).__size; i++)
	sum += (*A)[i][j];
      printf("%4d", sum);
    }
    printf("\n");
    if (r % 2 == 0)
      printf("
Magic only for odd ranks!\n"); } printf("
\n"); soap_destroy(&soap); soap_end(&soap); soap_done(&soap); return 0; } //////////////////////////////////////////////////////////////////////////////// // // Class vector Methods // //////////////////////////////////////////////////////////////////////////////// vector::vector() { __ptr = 0; __size = 0; } vector::vector(int size) { __ptr = (int*)soap_malloc(soap, size*sizeof(int)); __size = size; } vector::~vector() { soap_unlink(soap, this); } void vector::resize(int size) { int *p; if (__size == size) return; p = (int*)soap_malloc(soap, size*sizeof(int)); if (__ptr) { for (int i = 0; i < (size <= __size ? size : __size); i++) p[i] = __ptr[i]; soap_unlink(soap, __ptr); free(__ptr); } __ptr = p; __size = size; } int& vector::operator[](int idx) const { if (!__ptr || idx < 0 || idx >= __size) fprintf(stderr, "Array index out of bounds\n"); return __ptr[idx]; } //////////////////////////////////////////////////////////////////////////////// // // Class matrix Methods // //////////////////////////////////////////////////////////////////////////////// matrix::matrix() { __ptr = 0; __size = 0; } matrix::~matrix() { soap_unlink(soap, this); // not required, but just to make sure if someone calls delete on this } matrix::matrix(int rows, int cols) { __ptr = soap_new_vector(soap, rows); for (int i = 0; i < cols; i++) __ptr[i].resize(cols); __size = rows; } void matrix::resize(int rows, int cols) { int i; vector *p; if (__size != rows) { if (__ptr) { p = soap_new_vector(soap, rows); for (i = 0; i < (rows <= __size ? rows : __size); i++) { if (this[i].__size != cols) (*this)[i].resize(cols); (p+i)->__ptr = __ptr[i].__ptr; (p+i)->__size = cols; } for (; i < rows; i++) __ptr[i].resize(cols); } else { __ptr = soap_new_vector(soap, rows); for (i = 0; i < rows; i++) __ptr[i].resize(cols); __size = rows; } } else for (i = 0; i < __size; i++) __ptr[i].resize(cols); } vector& matrix::operator[](int idx) const { if (!__ptr || idx < 0 || idx >= __size) fprintf(stderr, "Array index out of bounds\n"); return __ptr[idx]; } gsoap-2.8.28/gsoap/samples/magic/README.txt0000644000175000017500000000036112653650156017630 0ustar ellertellertExample magic square client and servers. The client 'magic' application invokes the magic square service on our web site. The 'magicserver' demonstrates a CGI-based server and stand-alone multi-threaded server (if pthreads is available). gsoap-2.8.28/gsoap/samples/magic/Makefile.am0000644000175000017500000000111512653650156020164 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 noinst_PROGRAMS = magic magicserver SOAPHEADER = magic.h include ../Makefile.defines include ../Makefile.cpp_rules SOAP_NS = magic.nsmap magic.wsdl magic_SOURCES = magic.cpp $(SOAPHEADER) $(SOAP_CPP_CLIENT) magicserver_SOURCES = magicserver.cpp $(SOAPHEADER) $(SOAP_CPP_SERVER) magicserver_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) -lpthread gsoap-2.8.28/gsoap/samples/xml-rpc-json/0000755000175000017500000000000012653650172017401 5ustar ellertellertgsoap-2.8.28/gsoap/samples/xml-rpc-json/README.md0000644000175000017500000031564012653650156020673 0ustar ellertellert XML-RPC & JSON/JSONPath {#mainpage} ======================= [TOC] Introduction {#intro} ============ XML-RPC predates JSON and shares the same goal to offer a simple data format for Web applications that interoperate via "remote procedure calls" (RPC) over "stateless" HTTP via HTTP POST. Applications are not limited to the exchange of RPC messages via HTTP POST. Other REST methods can be used to manage the state of resources via URL references, allowing for the storage of data (HTTP PUT), retrieval of data (HTTP GET), and removal of data (HTTP DELETE) from a resource. XML-RPC is a generic, self-describing (and very verbose) XML format to compose XML messages for platform-neutral data exchange. XML-RPC defines a collection of frequently used XML types with common programming language equivalents. XML-RPC does NOT provide a data binding to XML and does NOT support a validation mechanism to ensure that data content is validated against a schema. XML-RPC serialization proceeds by marshaling parameters in predefined XML elements for each data type. XML-RPC has primitive types (bool, int, double, string, dateTime, base64) and two compound types (structs and arrays). This document does not describe XML-RPC in detail. For more details, please visit . JSON (JavaScript Object Notation) is an even simpler data format to support platform-neutral data interchange that is highly compatible across programming languages by restricting data representation to a set of five common types: bool, number, string, array, and object. A JSON object is the same as an XML-RPC struct. Only the syntax differs. Both are composed of fieldname-value member pairs (i.e. both are hashmaps) and have no other special properties. (Which is in contrast to XML data as "objects" that are namespace scoped and may include xsi:type attributes to distinguish derived from base types, and may include id-ref attributes to cross-reference data, and other properties that make XML more suitable to achieve lossless C/C++ serialization.) This document does not describe JSON (and JSON RPC/REST) in detail. For more details, please visit . JSON/JSONPath and gSOAP {#intro-1} ----------------------- The gSOAP JSON API is compact and lightweight. It is straightforward to write JSON RPC and JSON REST code. For example in C++: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #include "json.h" int main() { soap *ctx = soap_new1(SOAP_C_UTFSTRING); // set up context to manage memory const char *endpoint = "http://www.cs.fsu.edu/~engelen/currentTimeJSON.cgi"; value req(ctx), res(ctx); // new JSON values req and res req = "getCurrentTime"; // request current time json_call(ctx, // make a call (POST) endpoint, // the service endpoint URL req, // value with the request string res) // response, if call is OK ); if (ctx->error) ... // handle IO error cout << "Current time = " << res << endl; // JSON response to cout } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ To compile this example see the [List of C++ files](#cpp-files). Furthermore, to help you quickly develop C/C++ JSON code, we offer a code generator **jsoncpp** with the gSOAP package (version 2.8.26 and up). You can find the jsoncpp tool with the JSON examples in `gsoap/samples/xml-rpc-json`. The jsoncpp command-line tool auto-generates C or C++ code from a JSON fragment. The generated code creates a JSON node graph for this fragment, which can be further tweaked as necessary. We demonstrate this on an example `menu.json` file: cat menu.json ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} { "menu": { "id": "file", "value": "File", "popup": { "menuitem": [ {"value": "New", "onclick": "CreateNewDoc()"}, {"value": "Open", "onclick": "OpenDoc()"}, {"value": "Close", "onclick": "CloseDoc()"} ] } } } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ jsoncpp menu.json ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #include "json.h" { /* Generated by jsoncpp menu.json */ struct soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT); ctx->double_format = "%lG"; value x(ctx); x["menu"]["id"] = "file"; x["menu"]["value"] = "File"; x["menu"]["popup"]["menuitem"][0]["value"] = "New"; x["menu"]["popup"]["menuitem"][0]["onclick"] = "CreateNewDoc()"; x["menu"]["popup"]["menuitem"][1]["value"] = "Open"; x["menu"]["popup"]["menuitem"][1]["onclick"] = "OpenDoc()"; x["menu"]["popup"]["menuitem"][2]["value"] = "Close"; x["menu"]["popup"]["menuitem"][2]["onclick"] = "CloseDoc()"; std::cout << x << std::endl; soap_destroy(ctx); soap_end(ctx); soap_free(ctx); } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ You can use jsoncpp option `-e` to add explanatory comments to the generated code, which explains what the code does to help you understand the JSON API. Use jsoncpp option `-M` to narrow the generated code down to the essentials, without the initialization and cleanup parts of the code. This makes the generated code suitable for direct inclusion in your codebase. Generating code to populate a node graph is one option. Another option is to generate code to inspect a node graph. Use jsoncpp option `-i` (gSOAP 2.8.28 and up) to generate code to inspect the node graph of a value parsed from JSON input, given that the JSON file provided with option `-i` serves as a generic template: jsoncpp -i menu.json ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #include "json.h" { /* Generated by jsoncpp -i menu.json */ struct soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT); ctx->double_format = "%lG"; value x(ctx); std::cin >> x; #define USE_VAL(path, val) std::cout << path << " = " << val << std::endl if (x.has("menu")) { if (x["menu"].has("id")) USE_VAL("$.menu.id", x["menu"]["id"]); if (x["menu"].has("value")) USE_VAL("$.menu.value", x["menu"]["value"]); if (x["menu"].has("popup")) { if (x["menu"]["popup"].has("menuitem")) { for (int i3 = 0; i3 < x["menu"]["popup"]["menuitem"].size(); i3++) { if (x["menu"]["popup"]["menuitem"][i3].has("value")) USE_VAL("$.menu.popup.menuitem[].value", x["menu"]["popup"]["menuitem"][i3]["value"]); if (x["menu"]["popup"]["menuitem"][i3].has("onclick")) USE_VAL("$.menu.popup.menuitem[].onclick", x["menu"]["popup"]["menuitem"][i3]["onclick"]); } } } } std::cout << x << std::endl; soap_destroy(ctx); soap_end(ctx); soap_free(ctx); } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ You can also use the new jsoncpp option `-p` (gSOAP 2.8.27 and up) to generate efficient JSONPath query code to query and retrieve specific values. For example, let's write a JSONPath query to display the authors of books in a store. We will read the JSON data from `std:cin` and filter the authors with the query `$.store.book[*].author` to collect them in a JSON array `y` of results with jsoncpp option `-y`. We generate the code from the command line with jsoncpp as follows: jsoncpp -M -p'$.store.book[*].author' -y ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} value x(ctx); std::cin >> x; // JSONPath: $.store.book[*].author value y(ctx); y.size(0); #define QUERY_YIELD(val) y[y.size()] = val if (x.has("store")) { if (x["store"].has("book")) { value::iterator j = x["store"]["book"].begin(); value::iterator k = x["store"]["book"].end(); for (value::iterator i = j; i != k; ++i) { if ((*i).has("author")) { QUERY_YIELD((*i)["author"]); } } } } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Let's apply this query to the `store.json` file that you can find in section [JSONPath by example](#jsoncpp-4): ./query < store.json [ "Nigel Rees", "Evelyn Waugh", "Herman Melville", "J. R. R. Tolkien" ] You can compile this example yourself with: jsoncpp -o query.cpp -m -p'$.store.book[*].author' -y soapcpp2 -CSL xml-rpc.h c++ -o query query.cpp json.cpp xml-rpc.cpp soapC.cpp stdsoap2.cpp You can also embed C/C++ code in JSONPath queries to filter and select values from JSON data at runtime. The jsoncpp code generator aims to produce clean, high-quality and readable C and C++ code. We will present jsoncpp in more detail in the next section. The remainder of this document explains how you can use the XML-RPC/JSON C and C++ APIs to create JSON data, access JSON data, send/recv data via REST, and to read/write JSON data to files, streams, and string buffers. It should be stated that JSON as a data format is not a true-and-tested alternative to XML and XML schema. XML data bindings provide a strongly typed interface to exchange validated data with RPC and REST. However, XML can be more complex to provide strong guarantees for object polymorphism (base and derived classes), to accurately represent tree and graph structures, to include binary content natively with base64 (and mechanisms for streaming MIME/MTOM attachments), to support extensibility (to extend data types and to add new data types), and schema namespaces referenced by XML elements and attributes to avoid ambiguity. The jsoncpp command-line tool {#jsoncpp} ============================= The jsoncpp command produces high-quality, readable and reusable source code. The generated code can be readily used in your projects to populate JSON data and retrieve data, thereby saving you substantial time and effort to write code. You may not have to write any C or C++ code to manipulate JSON data with your application's code base when taking full advantage of the jsoncpp autocoding tool. The jsoncpp command-line tool generates C or C++ source code to populate a JSON node graph with the data given in a JSON file. The command also has an option `-i` to generate source code to inspect parsed JSON values by using a JSON file as a generic template for this code. And option `-p` generates efficient source code for JSONPath queries. Even stand-alone JSONPath query filter applications can be auto-generated with option `-m` (for main). Compiling the jsoncpp command {#jsoncpp-1} ----------------------------- You will find jsoncpp and the XML-RPC/JSON examples in the gSOAP package in `gsoap/samples/xml-rpc-json`. To build jsoncpp, [install gSOAP](http://www.genivia.com/downloads.html) and build all sample codes as follows: ./configure --enable-samples make make install This builds the command-line tool jsoncpp in `gsoap/samples/xml-rpc-json` from where you can use it and/or copy it for use with your projects. If you do not have the samples built, you can use soapcpp2 (or soapcpp2.exe in `gsoap/bin/win32`) from the command line to generate the C++ code required to compile jsoncpp and that is also required by the C++ JSON API components: cd gsoap/samples/xml-rpc-json soapcpp2 -CSL xml-rpc.h c++ -I../.. -o jsoncpp jsoncpp.cpp json.cpp xml-rpc.cpp soapC.cpp ../../stdsoap2.cpp The above builds the jsoncpp command-line tool. Command-line options {#jsoncpp-2} -------------------- The jsoncpp command takes several options and an optional JSON input file: jsoncpp [-c] [-e] [-f%fmt] [-h] [-i] [-l] [-m] [-M] [-O] [-ofile] [-ppath] [-rroot] [-xcode] [-y] [infile] where the jsoncpp command-line options are: | Option | Description | | -------- | ----------------------------------------------------------------- | | `-c` | generate C code instead of C++ | | `-e` | add explanatory comments to the generated code | | `-f%%fmt`| use `%%fmt` to format double floats, e.g. `-f%%lG` | | `-h` | display help message | | `-i` | generate code to inspect node graph parsed from JSON input | | `-l` | generate code for option `-i` to store values in local variables | | `-m` | generate stand-alone code by adding `main()` | | `-M` | generate minimal code unadorned with initialization and cleanup | | `-O` | optimize code by factoring common indices | | `-ofile` | save source code to `file` | | `-ppath` | generate JSONPath query code for `path` | | `-rroot` | use `root` instead of root value `x` in the generated code | | `-xcode` | generate code that executes `code` for each JSONPath query result | | `-y` | generate code that yields an array `y` of JSONPath query results | | `infile` | optional JSON file to parse | | `-` | read JSON from standard input | The jsoncpp command takes a JSON input file `infile` to generate code to construct this JSON value in C/C++ or, with option `-i`, to generate code that reads JSON data from input and traverses it to inspect its value by using the JSON input file `infile` as a template to match against. For option `-i`, if you want additional code that uses local variables to store boolean, integer, and floating point values retrieved from the JSON node graph, then also use option `-l` with option `-i`. Use option `-c` to generate C code instead of C++ and use option `-e` to add explanatory comments to the generated code. The jsoncpp command emits source code to standard output or to the file specified with option `-o`. Minimalistic code is generated with option `-M`, which is useful to automate pasting of the unadorned source code into the source code of your project. Optimized code is generated with option `-O` by factoring common array indices and object field names. This produces more elaborate code that is more efficient but may be harder to read and modify. This option has no effect on the code generated with option `-i`. The default name of the root value in the generated source code is `x`. To change this name use option `-r`. Do not use the name `v`, which represents the current value. Other variable names to avoid are `i`, `j`, `k`, `p`, `q`, `r`, `s`, and `S`, since these are internally used by the generated JSONPath query code. Use option `-p` to generate code that filters JSON data from a source of input with a JSONPath query `path`. Option `-x` specifies a JSONPath query code to execute for each query result. The default action in the generated code is to print each query result value in JSON format separated by newlines. Option `-y` yields a JSON array of query result values that are incrementally collected. Option `-x` overrides option `-y`. To generate a stand-alone application use option `-m`. This option is useful for testing JSONPath query filters given with option `-p`. Option `-f%``fmt` sets the floating point double precision format to use in the generated code. By default, jsoncpp emits floating point numbers with up to 17 digit mantissas to preserve precision. Use `-f%``lG` for the shortest floating point representation. JSONPath syntax {#jsoncpp-3} --------------- The concept behind JSONPath is identical to XPath for XML: to select elements (value nodes) from a DOM node structure of a document by matching the path expression against descendent nodes in the node tree structure. A JSONPath query returns the JSON values selected. We adopt the JSONPath syntax suggested by [Goessner](http://goessner.net/articles/JsonPath), but extended with `?` ("where") and `!` ("where not") operators. Our JSONPath syntax also supports the `[?(expr)]` and `[(expr)]` constructs to insert your own C/C++ expressions for filtering and selection of nodes in JSONPath queries. Our syntax also supports multiple comma-separated alternatives in the `[ ]` selector. But the syntax does not support `|` (alternation). We recommend to write a JSONPath query for each alternation. JSON data structures are represented internally as a node graph consisting of atomic values (null, bool, int/double, string), arrays, and "objects". JSON objects are structs with fieldname-value pairs. A JSONPath expression specifies a JSON data query, typically starting from the root node, and descending deeper into the node graph to match child nodes. For example, suppose we have a `store` object with a `book` array. Each `book` object has a `title` string and some other properties which we will ignore for now. The following JSONPath query returns the titles of all books in the store: $.store.book[*].title We can also write the same query in bracket notation: $["store"]["book"][*]["title"] Note that the syntax of this query has a close similarity to the C++ JSON API for accessing object fields (a.k.a. object properties) and array elements. Basically, a JSONPath expression is a sequence of operations to match nodes: | Operator | Nodes matched and returned | | ------------- | ------------------------------------------------------------ | | `$` | the root node of the node graph | | `.f` or `[f]` | child node at field named `f` of the current object node | | `[n]` | nth node of the current array node, if indexed within bounds | | `[b:e:s]` | array slice of the current array node | | `[x,y]` | child nodes matching `x` or `y` (fields, indices and slices) | | `*` | "wildcard": any child node of the current object/array node | | `..` | "recurse": any matching descendant nodes of the current node | | `?` | "where": current node if the rest of the query path matches | | `!` | "where not": the complement of `?` | | `[(e)]` | use value of C/C++ expression `e` to match a field or index | | `[?(e)]` | evaluate C/C++ expression `e`, continue matching when true | Field names (`f` in the table) in JSON and in JSONPath queries may contain UTF-8 Unicode characters. Throughout this document we refer to the *field names* of objects and structs. Also commonly used are JSON object *property names* and *key names* (as in key-value pairs), Other JSONPath implementations require quotes for field names in brackets, as in `['store']` or `["store"]`. With jsoncpp you will only need to add quotes when field names contain control characters, spaces, or punctuation, such as a `unit-price` field name in the query `$..['unit-price']`. To promote orthogonality of the JSONPath syntax (no arbitrary rules and exceptions depending on a context), quoted field names are also valid with dot notation in our JSONPath syntax, such as the query `$..'unit-price'`. JSONPath by example {#jsoncpp-4} ------------------- A JSONPath query expression uses dot or bracket operators to match JSON data located at increasingly deeper levels of the data structure. Consider the following JSON data: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.js} { "store": { "book": [ { "category": "reference", "author": "Nigel Rees", "title": "Sayings of the Century", "price": 8.95 }, { "category": "fiction", "author": "Evelyn Waugh", "title": "Sword of Honour", "price": 12.99 }, { "category": "fiction", "author": "Herman Melville", "title": "Moby Dick", "isbn": "0-553-21311-3", "price": 8.99 }, { "category": "fiction", "author": "J. R. R. Tolkien", "title": "The Lord of the Rings", "isbn": "0-395-19395-8", "price": 22.99 } ], "bicycle": { "color": "red", "price": 19.95 } } } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ To match the `title` of the first book (`book[0]`) in a `store`, starting at the root node indicated by `$`, we use the following JSONPath query expression: $.store.book[0].title This query returns `"Sayings of the Century"` when applied to the JSON data. To try the JSONPath examples yourself, we suggest to create a `store.json` file with the above JSON data and run jsoncpp from the command line to compile a JSONPath query as follows: cd gsoap/samples/xml-rpc-json soapcpp2 -CSL xml-rpc.h jsoncpp -o test-json.cpp -m -p'$.store.book[0].title' c++ -I../.. -o test-json test-json.cpp json.cpp xml-rpc.cpp soapC.cpp ../../stdsoap2.cpp ./test-json < store.json The compiled JSONPath query is applied to the `store.json` data and returns the matching values found. Use jsoncpp option `-y` to return matches in a JSON array. The `soapC.cpp` file, and the header files `soapStub.h` and `soapH.h`, are generated with the command `soapcpp2 -CSL xml-rpc.h`, which is done just once for all C++ JSON applications. Use soapcpp2 option `-c` to generate `soapC.c` for C (with the corresponding `soapStub.h` and `soapH.h` in C). To match any field of an object or any array element, we use a wildcard `*`: $.store.*.price This matches and returns the bicycle price `19.95`, but not the book prices that are located one level deeper in the array of books, which can be matched with: $.store.*.*.price This returns the values `8.95`, `12.99`, `8.99`, and `22.99`. Note that in the latter case we only get the book prices, because the first `*` matches `book` and `bicycle` and the second `*` matches the book array and the `red` and `price` fields. Only the book prices are returned, because `red` and `price` are atomic and have no `price` child node. To match and return all prices in the store we use `..` called "recursive descent" or simply "recurse", as follows: $..price Array elements are matched with brackets `[n]` where `n` is an array index. Negative indices can be used to access array elements from the end of an array, where -1 refers to the last element. We can list the array elements to match with `[x,y]`, for example: $.store.book[0,1,-1].title This matches and returns the titles of the first two books and the last. JSONPath queries do not modify the node graph searched. So you do not need to worry about indices that are out of bounds or fields that are not part of an object. Arrays can also be sliced for matching from a starting index `b` until (excluding) an ending index `e` with `[b:e]`, where `b` and `e` values are optional. When omitted, the slice runs from the start and/or from the end of the array. For example: $.store.book[:].title matches and returns the titles of all books in the store, and $.store.book[:2].title matches and returns the first two books (at 0 and 1) in the store. We can use an optional step `s` to slice arrays with `[b:e:s]` and even reverse array element-by-element matching with a negative unit step: $.store.book[::-1].title This matches and returns the titles of all books in reverse order. The following JSONPath queries return the same results for the example JSON data, where we used slices and `[x,y]` to match multiple array entries: $.store.book[1:3].title $.store.book[1:-1].title $.store.book[-3:-1].title $.store.book[1,2].title $.store.book[-3,-2].title Basically, JSONPath array slices in our implementation follow the intuitive Python array slice syntax and meaning. Beware that many other JSONPath implementations do not implement the step parameter consistently or do not support stepping. Note that `[:]` is not the same as `[*]` because `[:]` only matches arrays. A conditional JSONPath expression contains a `?` ("where") operator. The operator returns the results that match the left side of the `?` but only when the right-side matches: $.store.book[:]?isbn This matches and returns only books that have an `isbn` field. The complement of the `?` operator is `!` ("where not"), which returns the results that match the left side of the `!` but only when the right-side does not match. More complex queries can be formulated by embedding C/C++ expressions in the query to filter `[?(e)]` and select `[(e)]` nodes. For example, in C++: $.store.book[:][?((double)v["price"] < 10.0)].title and in C: $.store.book[:][?(*double_of(value_at(v, "price")) < 10.0)].title This filters books with prices lower than 10.0 and returns the title of each book found. Embedded C/C++ expressions to filter nodes can inspect the current JSONPath node value by accessing variable `v`, as is shown above. Here we used `(double)v["price"]` to obtain the price of the current node for comparison. Besides the current node `v` you can also access the JSONPath root node value `x`. Instead of the default name `x`, you can change `x` to another name with jsoncpp option `-r`. You can access variables and functions in embedded C/C++ expressions, but do not access or modify `i`, `j`, `k`, `p`, `q`, `r`, `s` and `S`, which are internally used by the generated JSONPath query code. @warning In this respect we should caution you about using C/C++ expressions that modify node values, since this may affect the query results in unpredictable ways. In fact, `v["price"]` will add a price to any current node value `v` that has no `"price"` field! To make field accesses safe we should first check if the field exists in the current node before we access it: $.store.book[:][?((v.has("price") ? (double)v["price"] : 9999) < 10.0)].title @warning Guarding field accesses with `has()` is the only safe way to combine `..` with C/C++ filters, since we may visit all nodes in the graph, for example to find all prices < 10.0: $..[?((v.has("price") ? (double)v["price"] : 9999) < 10.0)].price Object fields and array elements can be accessed in a JSONPath query with C/C++ expressions that evaluate to string field names or to integers indices, respectively. For example, we can use the string `argv[1]` of `main()` as a field name in C++: $.store.book[:][(argv[1])] In C we have to explicitly use `value_at` to access the field of the current `v` node (and we use `nth_value` to access array elements of the current `v` node, not shown here): $.store.book[:][(value_at(v, argv[1]))] This assumes that the command-line argument (`argv[1]`) of the application is a book field name. Otherwise, no results are returned. After compiling the JSONPath query with jsoncpp -o test-json.cpp -m -p'$.store.book[:][(argv[1])]' c++ -I../.. -o test-json test-json.cpp json.cpp xml-rpc.cpp soapC.cpp ../../stdsoap2.cpp we can obtain the book titles with: ./test-json title < store.json You can use multiple C/C++ expressions in brackets and combine them with other field and array expressions separated by commas: $.store.book[:][title,(argv[1])] This prints the title and the value of the field name given by the command-line argument, if there is a field that matches the given name. Finally, let's use the value of `argv` to filter products in the store by a given command-line argument price: jsoncpp -m -p'$.store..[?((v.has("price") ? (double)v["price"] : 9999) < strtod(argv[1], NULL))]' And in C: jsoncpp -c -m -p'$.store..[?((nth_at(v, "price") >= 0 ? *double_of(value_at(v, "price")) : 9999) < strtod(argv[1], NULL))]' C/C++ expressions cannot be used as array slice bounds, which must be constant. C++ XML-RPC and JSON {#cpp} ==================== XML-RPC and JSON data is interchangeable in this implementation, with the only exception that the dateTime and base64 types are handled as strings in JSON. Also, JSON's only numeric type is floating point. However, integers are handled just fine by this JSON implementation as 64 bit (`long long`, `int64_t`, `LONG64`) without conversion to/from double floating point values. List of C++ files {#cpp-files} ----------------- The following files define XML-RPC operations and data types for C++: - `xml-rpc-io.h`: XML-RPC serialization over streams - `xml-rpc-io.cpp`: XML-RPC serialization over streams - `xml-rpc-iters.h`: iterators for structs, arrays, and XML-RPC parameters - `xml-rpc.cpp`: XML-RPC C++ data binding API - `xml-rpc.h`: XML-RPC data binding as a gSOAP .h file for soapcpp2 (do not #include this file in your project builds) For JSON we use the following files for C++: - `json.h`: JSON C++ API and JSON serialization over streams - `json.cpp`: JSON C++ API and JSON serialization over streams - `xml-rpc.cpp`: XML-RPC C++ data binding API - `xml-rpc-iters.h`: iterators for structs/objects and arrays - `xml-rpc.h`: XML-RPC data binding as a gSOAP .h file for soapcpp2 (do not #include this file in your project builds) The gSOAP header file `xml-rpc.h` defines all XML-RPC and JSON types as struct with C++ member functions to create XML-RPC and JSON data and REST messages. A note about the following auto-generated files: `soapH.h`, `soapStub.h` and `soapC.cpp`. These are required for XML-RPC and JSON. To auto-generate these files, execute: soapcpp2 -CSL xml-rpc.h Then compile and link the `.cpp` files listed above for XML-RPC and JSON with the auto-generated `soapC.cpp` and `stdsoap2.cpp`: c++ -I../.. -o myapp myapp.cpp json.cpp xml-rpc.cpp soapC.cpp ../../stdsoap2.cpp Instead of `stdsoap2.cpp` you can link `libgsoap++.a` with `-lgsoap++`, when installed by the gSOAP package. To enable OpenSSL for HTTPS compile with `-DWITH_OPENSSL` and link `-lssl`, and `-lcrypto`: c++ -DWITH_OPENSSL -I../.. -o myapp myapp.cpp json.cpp xml-rpc.cpp soapC.cpp ../../stdsoap2.cpp -lssl -lcrypto For OpenSSL support, instead of `stdsoap2.cpp` you can link `libgsoapssl++.a` with `-lgsoapssl++`, when installed by the gSOAP package. Because XML namespaces are not used, we can either use `-DWITH_NONAMESPACES` to compile `stdsoap2.cpp` without complaining about a missing global `Namespace`, or we can define an empty namespaces table somewhere in our code: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} struct Namespace namespaces[] = {{NULL,NULL,NULL,NULL}}; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++ XML-RPC and JSON with examples {#cpp-ex} ---------------------------------- An XML-RPC/JSON data value is created in C++ as follows, which requires a context `ctx` with the engine state (the soap struct). The context manages the memory that is internally allocated to hold values. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #include "soapH.h" soap *ctx = soap_new1(SOAP_C_UTFSTRING); // new context value v(ctx); soap_destroy(ctx); // delete all values soap_end(ctx); // delete temp data soap_free(ctx); // free context ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Note that `soapH.h` is an auto-generated file (see previous section). This file needs to be generated only once and for all. It also references `stdsoap2.h` and the auto-generated `soapStub.h`. Compile and link your code with `stdsoap2.cpp` and the auto-generated `soapC.cpp` XML-RPC serializers. Also compile and link `xml-rpc.cpp`. For JSON, compile and link `json.cpp`. We can stack-allocate local values as shown above. To allocate a value on the heap that is managed by the engine context, use `new_value(ctx)`: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} value *v = new_value(ctx); ... soap_destroy(ctx); // delete all values soap_end(ctx); // delete temp data ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ You can use wide strings with Unicode stored in UTF-8-formattted 8-bit `char` strings. For compatibility with XML-RPC serialization of UTF-8-encoded strings, we MUST use the `SOAP_C_UTFSTRING` flag to initialize the context with `soap_new1(SOAP_C_UTFSTRING)`. We can optionally use `SOAP_XML_INDENT` to indent XML and JSON. The code shown above creates an empty value `v`. Values can be assigned any one of the following data types: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} v = 12345LL; // 64 bit int v = 12.34; // double float v = "abc"; // string v = string("abc"); // std::string v = L"xyz"; // wide string (converted to UTF-8) v = wstring(L"xyz"); // std::wstring (converted to UTF-8) v = false; // Boolean v = (ULONG64)time(0); // time_t value serialized as ISO 8601 date time // create an array [24, 99.99, "abc"] v[0] = 24; v[1] = 99.99; v[2] = "abc"; // create a struct (JSON object) {"name": "gsoap", "major": 2.8, "©": 2015} v["name"] = "gsoap"; v["major"] = 2.8; v[L"©"] = 2015; // wide string tags are OK // create a base64-encoded image object _base64 img(ctx, 100, ptr_to_rawimage100bytes); // block of 100 raw bytes v = img; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ We can combine these operations in many possible ways to create arrays of arrays, arrays of structs, and so on. For example: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} v[0]["name"] = "bob"; v[0]["toys"][0] = "ball"; v[0]["toys"][1] = "furby"; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This creates a singleton array containing an object with two members: `name` set to `"bob"` and `toys` set to an array containing `"ball"` and `"furby"`. In JSON format this is represented as: [ { "name": "bob", "toys": ["ball", "furby"] } ] ^ ^ ^ ^ | | | | an array_/ | | | of 1 struct_/ | | with 2 members_/______________/ Let's see what happens when we assign a variable the value of another. The JSON C++ API uses the *value model* for variables with atomic values, meaning that atomic values are copied when assigning a target variable the atomic value of another variable. It uses the *reference model* for arrays and structs, meaning that array and struct contents are shared when assigning a target variable the array/struct value of another variable. We illustrate the effect below: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} value x(ctx), y(ctx); x = 1; y = x; x = 2; std::cout << "x = " << x << " and y = " << y << std::endl; value a(ctx), b(ctx); a["num"] = 1; b = a; a["num"] = 2; std::cout << "a.num = " << a["num"] << " and b.num = " << b["num"] << std::endl; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This prints `x = 2 and y = 1` and `a.num = 2 and b.num = 2`. You can make deep copies of values by using the auto-generated `soap_dup_value` function in `soapC.cpp`: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} value a(ctx), b(ctx); a["num"] = 1; soap_dup_value(ctx, &b, &a); a["num"] = 2; std::cout << "a.num = " << a["num"] << " and b.num = " << b["num"] << std::endl; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This prints `a.num = 2 and b.num = 1`. @warning Do not extend arrays and structs (JSON objects) returned by `soap_dup_value` with new entries. The new entries may use unallocated memory. You can always loop over arrays and structs to copy their contents to a new array or struct managed by another context, if you must add new entries later. To auto-generate `soap_dup_value`, use option `-Ec` with soapcpp2: soapcpp2 -Ec -CSL xml-rpc.h With gSOAP 2.8.28 and later you can use the following operators on values in C++: | Operator | Type of JSON Value Operands | Result after Operand Type Promotion | | -------------------- | ----------------------------------- | ----------------------------------------------- | | `+` | bool, number, string, struct, array | sum, string concat, struct concat, array concat | | `-`, `*`, `/`, `%` | bool, number | difference, product, division, modulo | | `==`, `!=` | bool, number, string, struct, array | C++ `bool` | | `<=`, `>=`, `<`, `>` | bool, number, string | C++ `bool` | The (un)equal operators compare the two values by deep value comparison of array elements and object fields and values. For the arithmetic operations, operands are converted by type promotion until the two operands conform to the type required for the operation: atomic int double string struct array false -> 0 true -> 1 int -> double null -------------------> "null" false ------------------> "false" true -------------------> "true" int -> double -> string null ---------------------------------------> [null] false --------------------------------------> [false] true ---------------------------------------> [true] int -------------------------------> [int] double ---------------------> [double] string -----------> [string] struct -> [struct] An example: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #include std::stringstream ss("[0,1,2]"); // parse JSON array into 'x' value x(ctx); ss >> x; // x = [0,1,2] x[3] = x[1] + x[2]; // x = [0,1,2,3] value y(ctx); y[0] = "abc"; // y = ["abc"] y[1] = y[0] + 123; // y = ["abc","abc123"] std::cout << x + y; // [0,1,2,3] + ["abc","abc123"] is [0,1,2,3,"abc","abc123"] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Arithmetic and concatenation operations may incur significant memory overhead due to temporaries, type conversions (when applicable), and managed heap storage. Use them only when CPU and memory usage are not critical. When receiving a value in XML-RPC/JSON, we generally want to check its type to obtain its value. To check the type of a value, we use `is_Type` methods: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} bool value::is_null() // true if value is not set (JSON null) bool value::is_bool() // true if value is a Boolean "true" or "false" value bool value::is_true() // true if value is Boolean "true" bool value::is_false() // true if value is Boolean "false" bool value::is_int() // true if value is a 32 or a 64 bit int bool value::is_double() // true if value is a 64 bit double floating point bool value::is_string() // true if value is a string or wide string bool value::is_dateTime() // true if ISO 8601, always false for received JSON bool value::is_array() // true if array of values bool value::is_struct() // true if structure, a.k.a. a JSON object bool value::is_base64() // true if base64, always false for received JSON ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The following methods can be used to inspect arrays and structs (JSON objects): ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} void value::size(int) // reset array size or pre-allocate space int value::size() // returns array or struct size or 0 bool value::empty() // true if array or struct is empty bool value::has(int) // true if index is within array bounds bool value::has(const char*) // true if struct has field bool value::has(const wchar_t*) // true if struct has field int value::nth(int) // returns index >= 0 if index is in array bounds, < 0 otherwise int value::nth(const char*) // returns index >= 0 of field in struct, < 0 otherwise int value::nth(const wchar_t*) // returns index >= 0 of field in struct, < 0 otherwise value& value::operator[int] // returns value at index in array or struct value& value::operator[const char*] // returns value at field in struct value& value::operator[const wchar_t*] // returns value at field in struct ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ For example, let's take the value `v` that was assigned the array shown above. We have the following properties of this value: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} v.is_null() == false // v is not null v.is_array() == true // v is an array v.size() == 1 // v has one element v.has(1) == false // v has no array element at index 1 v.nth(-1) == 0 // v last element is at index 0 v[0].is_struct() == true // v[0] is a struct v[0].has("name") == true // v[0] has field name "name" v[0].nth("name") == 0 // v[0] has field name "name" at index 0 v[0][0].is_string() == true // v[0][0] == v[0]["name"] is a string v[0].has("toys") == true // v[0] has field name "toys" v[0]["toys"].is_array() == true // v[0]["toys"] is an array v[0]["toys"].empty() == false // v[0]["toys"] is not empty ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ When accessing structs (JSON objects) by field name, make sure to use existing member field names only. A new member fieldname-value pair is dynamically added to the structure to accomodate the new entry for the field. Also arrays are extended to accommodate the indexed array element. A negative index accesses elements from the array's end, with index -1 accessing the last value. Also the `value::has(int)` and `value::nth(int)` methods take a negative index for bounds checking on arrays and will return `false` or negative, respectively. Use `value::size(int)` to change array size or set arrays to zero length. Use negative size with `value::size(int)` to remove elements from the end. You may want to use iterators to retrieve data from structs and arrays (see further below). To retrieve atomic data we can use casts on a value `v` as follows: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} (double)v // 64 bit double or 0.0 if not numeric (int)v // 32 bit int or 0 if not numeric (LONG64)v // 64 bit int or 0 if not numeric (char*)v // convert to string (string)v // convert to std::string (wchar_t*)v // convert to wide string (wstring)v // convert to std::wstring (bool)v // same as is_true() (ULONG64)v // nonzero time_t if v contains an ISO 8601 date time (_base64)v // base64 encoding of v ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ It is valid to cast a primitive type to any of the other primitive types shown above and no runtime error will occur, although you may loose some information when an atomic value has no representation in the target type's value space. Casting a number to a string is fine, but casting a string to a number only gives a nonzero numeric value if the string is numeric. Casting a value to base64 produces its base64 encoding. To access base64 binary raw data of a value `v`, we use the following methods: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} _base64& base64 = v; unsigned char *raw = base64.ptr(); // points to raw binary data int size = base64.size(); // that is of this size ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Arrays and structs are compound types that cannot be cast to or from other types (but if you do cast, an empty array or struct is created an no runtime error will occur). So we should check for array and struct types to obtain their content. For example: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} if (v.is_array()) { for (int i = 0; i < v.size(); ++i) { value& array_value = v[i]; ... // use and/or set array_value } } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ We use the iterators `value::iterator` and `value::const_iterator` to loop over the values in structs and arrays: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} if (v.is_struct() || v.is_array()) { for (value::iterator i = v.begin(); i != v.end(); ++i) { int index = i.index(); // index of element const char *name = i.name(); // name() is nonempty for structs value& element = *i; ... // use index, name, and/or use/set the element value } } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The iterator method `value::iterator::index()` returns the integer index of the struct or array element. The `value::iterator::name()` method returns the name of the struct member, or empty `""` if the type is not a struct. The `value::const_iterator` does not permit the value referenced by the iterator to be modified. There are two lower level iterators for structs and arrays, which are slightly more efficient to use compared to the `value::iterator`. These array and struct iterators have an `index()` method to obtain the index (an int). Struct iterators have a `name()` method to obtain a member's name (a string). For example, to traverse a value `v` that is an array or a struct: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} if (v.is_array()) { _array& vec = v; // cast to _array for (_array::iterator i = vec.begin(); i != vec.end(); ++i) { int array_index = i.index(); value& array_value = *i; ... // use array_index, use and/or set array_value } } else if (v.is_struct()) { _struct& rec = v; // cast to _struct for (_struct::iterator i = rec.begin(); i != rec.end(); ++i) { const char *member_name = i.name(); value& member_value = *i; ... // use member_name, use and/or set member_value } } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ As usual, the `_struct::const_iterator` and `_array::const_iterator` do not permit the values referenced by the iterator to be modified. XML-RPC parameter lists are similar to arrays and its values are indexed. We can also iterate over response parameters after an XML-RPC REST call: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} methodCall rpc(ctx, "endpoint URL", "methodName"); params request(ctx, 2); request[0] = ...; // first request parameter request[1] = ...; // second request parameter params response = rpc(request); // execute the call if (!rpc.error()) { for (params::iterator i = response.begin(); i != response.end(); ++i) { int index = i.index(); value& param_value = *i; ... // use param_value of response params } } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ We should note that JSON REST does not require parameter types, for example: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #include "json.h" value request(ctx); value response(ctx); request[0] = ...; // first request parameter request[1] = ...; // second request parameter if (!json_call(cts, "endpoint URL", request, response)) { ... // use response value } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ There are two additional methods to invoke on parameters: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} int params::size(); // returns number of parameters bool params::empty(); // true if no parameters ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ All dynamically allocated memory that is internally used to store data is deallocated with: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} soap_destroy(ctx); // delete all values soap_end(ctx); // delete temp data soap_free(ctx); // delete context allocated with soap_new() ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Additional examples are located in `gsoap/samples/xml-rpc-json`: - `xml-rpc-currentTime.cpp`: XML-RPC C++ client, also uses JSON - `xml-rpc-currentTimeServer.cpp`: XML-RPC C++ server - `xml-rpc-weblogs.cpp`: XML-RPC C++ client - `xml-rpc-json.cpp`: XML-RPC to/from JSON example - `json-currentTime.cpp`: JSON C++ client - `json-currentTimeServer.cpp`: JSON C++ server - `json-GitHub.cpp`: JSON C++ client for GitHub API v3 C++ XML-RPC client example {#cpp-cl} -------------------------- A typical XML-RPC calling sequence in C++ is: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #include "soapH.h" // generated by the command: soapcpp2 -CSL xml-rpc.h #include "xml-rpc-io.h" // to serialize XML-RPC data to streams struct Namespace namespaces[] = {{NULL,NULL,NULL,NULL}}; // no XML namespaces // create a context soap *ctx = soap_new1(SOAP_C_UTFSTRING); // store Unicode in UTF-8 format ctx->send_timeout = 10; // 10 sec, stop if server is not accepting msg ctx->recv_timeout = 10; // 10 sec, stop if server does not respond in time // create an XML-RPC method call object methodCall rpc(ctx, "endpoint URL", "methodName"); // populate the parameters rpc[0] = 123; // first parameter is an integer rpc[1] = "abc"; // second is a string rpc[2]["name"] = "joe"; // a record, first member "name" rpc[2]["age"] = 23; // a record, second member "age" rpc[3][0] = 456.789; // an array, first element (a float) rpc[3][1] = "widget"; // an array, second element (a string) rpc[3][2] = true; // an array, third element (a bool) // make the XML-RPC call and retrieve response params response = rpc(request); // check result if (rpc.error()) soap_stream_fault(ctx, std::err); else if (response.empty()) std::cout << rpc.fault() << std::endl; else if (response.size() > 1) std::cout << "More than one response data" << std::endl; else if (response[0].is_array() && !response[0].empty()) for (int i = 0; i < response[0].size(); i++) ... = response[0][i]; else if (response[0].is_struct()) { ... = response[0]["membername1"]; ... = response[0]["membername2"]; } else if (response[0].is_base64()) { _base64 base64& = response[0]; unsigned char *raw = base64.ptr(); int size = base64.size(); ... // use raw[0..size-1] data } else if (response[0].is_bool()) { bool flag = response[0]; ... // use boolean flag } else if (response[0].is_int()) { LONG64 num = response[0]; ... // use integer } else if (response[0].is_double()) { double num = response[0]; ... // use double float } else if (response[0].is_string()) { const char *str = response[0]; // use string, note that also legal is: const std::string& st = response[0]; // and conversion from UTF-8 to wide string unicode: const wchar_t *w = response[0]; const std::string& ws = response[0]; } else if (response[0].is_dateTime()) { time_t t = (ULONG64)response[0]; ... // use time } // deallocate all soap_destroy(ctx); soap_end(ctx); soap_free(ctx); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Alternatively, parameters of a methodCall can be passed with the methodCall itself as follows: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} methodCall rpc(ctx, "endpoint URL", "methodName"); // create 5 parameters params request(ctx, 5); // populate the parameters request[0] = 123; // first parameter is an integer request[1] = "abc"; // second is a string request[2]["name"] = "joe"; // a record, first member "name" request[2]["age"] = 23; // a record, second member "age" request[3][0] = 456.789; // an array, first element (a float) request[3][1] = "widget"; // an array, second element (a string) request[3][2] = true; // an array, third element (a bool) // make the XML-RPC call with request parameters, retrieve response params response = rpc(request); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Note that in the client code, after the response is retrieved, the implicit type casts done by assignments will retrieve the values that are type-cast converted if needed. These casts can be used anywhere to retrieve values: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} params response = rpc(); double sum = 0.0; for (int i = 0; i < response.size(); i++) if (response[i].is_double()) // is this parameter a double float? sum += (double)response[i]; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Type casts can also be used to convert data, which means they never produce an exception. Casting to string `(const char*)` converts atomic values to strings, but does not convert compound types such as arrays and structs. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} params response = rpc(); for (int i = 0; i < response.size(); i++) printf("response[%d] = %s\n", i, (const char*)response[i]); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ which prints a string representation of the int, double, boolean, time, or base64 values of parameters. An empty string is printed for arrays and structs. Use iterators to walk over arrays and structs to print values. Or use the JSON API `json.h` and `json.cpp` to print values in JSON format, see further on JSON below. C++ XML-RPC server example {#cpp-sr} -------------------------- A typical C++ XML-RPC server sequence is: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} // create an allocation context soap *ctx = soap_new1(SOAP_C_UTFSTRING); // create an XML-RPC methodCall object methodCall rpc(ctx); // Option 1: parse and write to/from stdin/out for CGI // (no code needed) // Option 2: parse and write to/from FILE or socket // ctx->recvfd = ...; // set input file descriptor // ctx->sendfd = ...; // set output file descriptor // Option 3: parse and write to/from IO streams // ctx->is = ...; // set input stream // ctx->os = ...; // set output stream if (rpc.recv() != SOAP_OK) soap_print_fault(ctx, stderr); else { // create response methodResponse response(ctx); // check method name if (!strcmp(rpc.name(), "methodName")) { // method name matches: populate response parameters with values: response[0] = ...; response[1] = ...; ... // add response data } else { // otherwise, set fault response.set_fault("Wrong method"); } // send response if (response.send() != SOAP_OK) soap_print_fault(ctx, stderr); } // close (but keep-alive setting keeps socket open) soap_closesock(ctx); // clean up soap_destroy(ctx); soap_end(ctx); soap_free(ctx); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ With option 1 the server code above uses standard in/out and thus runs over CGI. Other possibilities are given by options 2 and 3. To serve requests at a port, we use the `soap_bind()` and `soap_accept()` calls to bind the server to a port and accept requests via socket, see also the docs and examples for these calls (see for example `gsoap/samples/webserver.c`): ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} // create an allocation context soap *ctx = soap_new1(SOAP_IO_KEEPALIVE | SOAP_C_UTFSTRING); // bind to port 8080 if (!soap_valid_socket(soap_bind(ctx, NULL, 8080, 100))) ... // error, stop // accept messages in server loop for (;;) { if (!soap_valid_socket(soap_accept(ctx))) ... // error, stop // create a method object methodCall rpc(ctx); // parse it from socket if (rpc.recv() != SOAP_OK) soap_print_fault(ctx, stderr); ... // process request, produce result to send as shown above // close (but keep-alive setting keeps socket open) soap_closesock(ctx); // clean up soap_destroy(ctx); soap_end(ctx); } // free context soap_free(ctx); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++ XML-RPC serialization from/to streams {#cpp-io} ----------------------------------------- To send and receive XML over streams, use `xml-rpc-io.h` and `xml-rpc-io.cpp`. For example: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #include "xml-rpc-io.h" std::cout << response[0] << std::endl; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ which will display the data in XML-RPC format. To parse XML-RPC data from a stream, use: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #include "xml-rpc-io.h" value v(ctx); std::cin >> v; if (ctx->error) ... // check for parse errors (can also use v.soap->error) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Compile and link together with `soapC.cpp`, `xml-rpc.cpp`, `xml-rpc-io.cpp`, and `stdsoap2.cpp`. C++ JSON serialization from/to streams {#cpp-js} -------------------------------------- To display values in JSON format or to parse JSON data, use the `json.h` and `json.cpp` JSON serializers in combination with `xml-rpc.cpp` and the auto-generated `soapH.h` and `soapC.cpp`. It is also possible to send and receive JSON data over HTTP as JSON REST operations, but this requires some more coding (see [JSON over HTTP](#cpp-jr) below). Because the internal data is the same for XML-RPC and JSON, You can write data in XML-RPC or in JSON format. You can also parse XML-RPC data and write to JSON data and vice versa. To write JSON to a stream you can use the `<<` operator on an output stream and a JSON value. To parse JSON from a stream you can use the `>>` operator on an input stream and populate a JSON value. For example, you can parse a JSON-formatted string and use that data to make an XML-RPC call. The result of the call is displayed in JSON, nicely indented using the `SOAP_XML_INDENT` flag (this XML indent flag also works for JSON): ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #include "json.h" #include struct Namespace namespaces[] = {{NULL,NULL,NULL,NULL}}; // no XML namespaces // SOAP_C_UTFSTRING: UTF-8 content in char*, SOAP_XML_INDENT: indent JSON soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT); value request(ctx); std::istringstream in; in.str("[ [1, \"2\", 3.14, true], {\"name\": \"john\", \"age\": 24} ]"); in >> request; // parse JSON, store as XML-PRC data if (ctx->error) ... // check for parse errors params response = rpc(request); // make the XML-RPC call std::cout << response << std::endl; // display result in JSON (indented) if (ctx->error) ... // check for write errors ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Compile and link together with `soapC.cpp`, `xml-rpc.cpp`, `json.cpp`, and `stdsoap2.cpp`. The JSON protocol has fewer data types than XML-RPC, so type information can be lost when serializing to JSON: - XML-RPC uses a base64 type to exchange raw binary data. The base64 data is converted to a string with base64 content by the JSON serializer. See also [JSON and Base64](#base64). - XML-RPC has a dateTime type, JSON does not. The JSON serializer converts the dateTime type to a dateTime-formatted string. See also [JSON and ISO 8601 DateTime](#dateTime). See the section on C++ examples on how to populate and retrieve C++ data. Strings are stored and exchanged in UTF-8 format in 8-bit strings (`char*` and `std::string`) by using the `SOAP_C_UTFSTRING` flag. Wide strings (i.e. `wchar_t*` and `std::wstring` ) are converted to UTF-8. To force reading and writing JSON in ISO 8859-1 format, use the `SOAP_ENC_LATIN` flag to set the context. Optionally use `SOAP_XML_INDENT` to indent XML and JSON. C++ JSON over HTTP (REST method) {#cpp-jr} -------------------------------- To use JSON REST on the client side, we use `json_call`: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #include "json.h" // also compile and link json.cpp struct Namespace namespaces[] = {{NULL,NULL,NULL,NULL}}; // no XML namespaces // SOAP_C_UTFSTRING: UTF-8 content in char*, SOAP_XML_INDENT: indent JSON soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT); value request(ctx), response(ctx); ... // now populate the request data to send if (json_call(ctx, "URL", &request, &response) != SOAP_OK)) // POST ... // error else ... // use the response data ... // make other calls etc. soap_destroy(ctx); // delete all values soap_end(ctx); ... // make other calls etc. soap_free(ctx); // free context ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ A `json_call` takes a context, an endpoint URL (with URL query string parameters as needed), and optional `in` and `out` values to send and receive, respectively. This function returns `SOAP_OK` (zero) for success or `EOF`, `SOAP_SYNTAX_ERROR`, or an HTTP error code. To use the HTTP POST method, pass both `in` and `out` values to `json_call`. For the GET method, pass a NULL to `in`. For the PUT method, pass a NULL to `out`. For the DELETE method, pass both NULL to `in` and `out`. Besides `json_call`, there are other JSON API functions: - `int json_call(soap *ctx, const char *URL, value *in, value *out)` makes a POST, GET, PUT, DELETE call, returns `SOAP_OK` or error code. POST method: pass both `in` and `out`. GET method: pass a NULL to `in`. PUT method: pass a NULL to `out`. DELETE method: pass both NULL to `in` and `out`. - `int json_write(soap *ctx, const value *v)` Writes JSON value to current file, socket, or stream. Returns `SOAP_OK` or error. Set file/socket file descriptor to write to with `ctx->sendfd = fd` (1 by default). In C++, set output stream with `ctx->os = ostream` to write to. - `int json_read(soap *ctx, value *v)` Reads JSON value from current file, socket, or stream. Returns `SOAP_OK` or error. Set file/socket file descriptor with `ctx->recvfd = fd` to read from (0 by default). In C++, set input stream with `ctx->is = istream`. The are two other lower-level functions `json_send` and `json_recv` that are similar to `json_write` and `json_read` but do not initialize the sending and receiving operations and do not flush after the sending and receiving operations. To implement a JSON REST server for CGI (e.g. install in cgi-bin): ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #include "json.h" // also compile and link json.cpp struct Namespace namespaces[] = {{NULL,NULL,NULL,NULL}}; // no XML namespaces int main() { soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT); value request(ctx), response(ctx); if (soap_begin_recv(ctx) || json_recv(ctx, request) || soap_end_recv(ctx)) soap_send_fault(ctx); else { ... // use the 'request' value ... // set the 'response' value // set http content type ctx->http_content = "application/json; charset=utf-8"; // send http header and body if (soap_response(ctx, SOAP_FILE) || json_send(ctx, response) || soap_end_send(ctx)) soap_print_fault(ctx, stdout); } // dealloc all soap_destroy(ctx); soap_end(ctx); soap_free(ctx); } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Compile and link the code together with `soapC.cpp`, `xml-rpc.cpp`, `json.cpp`, and `stdsoap2.cpp`. For client and server examples, please see the gSOAP package content: - `gsoap/samples/xml-rpc-json/json-currentTime.cpp` - `gsoap/samples/xml-rpc-json/json-currentTimeServer.cpp` Moving JSON types and operations into a C++ namespace {#json-ns} ----------------------------------------------------- A C++ namespace is preferred to separate JSON types and operations from other project-related types and operations. This allows you to cleanly compile the JSON API files together with other gSOAP XML data binding files. To put all JSON (and the internal XML-RPC) types and operations in a `json` C++ namespace, execute the following commands: soapcpp2 -qjson -CSL xml-rpc.h soapcpp2 -penv -CSL env.h where `env.h` is an empty file. This generates `jsonStub.h` and `jsonH.h` and two more files `jsonC.cpp` and `envC.cpp` to compile with `xml-rpc.cpp`, `json.cpp`, and `stdsoap2.cpp`. When combining JSON with a wsdl2h-generated header file that declares an XML data binding interface, use this header file instead of an empty `env.h`. Use soapcpp2 to generate the data binding and client/server code as usual (without option `-penv`). Compile the source files together with `xml-rpc.cpp` and `json.cpp` and set the macro `-DJSON_NAMESPACE`, for example: c++ -DJSON_NAMESPACE xml-rpc.cpp json.cpp jsonC.cpp envC.cpp stdsoap2.cpp ... To enable OpenSSL for HTTPS also use `-DWITH_OPENSSL` to compile. Then link with `-lssl` and `-lcrypto`. Your project should now use the `json` namespace with the `value` type, for example: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #include "json.h" soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT); json::value v(ctx); std::cin >> v; // parse JSON if (ctx->error) ... // check for errors (can also check v.soap->error) std::cout << v; // output JSON if (ctx->error) ... // check for errors (can also check v.soap->error) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C XML-RPC and JSON {#c} ================== With the release of gSOAP 2.8.26, the XML-RPC and JSON C APIs have been greatly improved. The material in this section pertains to gSOAP 2.8.26 and later. The new C API for XML-RPC and JSON makes it much easier to populate and retrieve data, but not as simple and easy as the C++ API. List of C files {#c-files} --------------- The following files define XML-RPC operations and data types: - `xml-rpc.c`: XML-RPC C API - `xml-rpc.h`: XML-RPC data binding as a gSOAP .h file for soapcpp2 (do not #include this file in your project builds) In addition to the files above, for JSON we also need the following files: - `json.h`: JSON C API and JSON serialization - `json.c`: JSON C API and JSON serialization The gSOAP header file `xml-rpc.h` defines all XML-RPC and JSON types and the C API functions to create XML-RPC and JSON data for REST messages. A note about the following auto-generated files: `soapH.h`, `soapStub.h` and `soapC.c`: these are required for XML-RPC and JSON. To auto-generate these files, execute: soapcpp2 -c -CSL xml-rpc.h Then compile and link the `.c` files listed above for XML-RPC and JSON with the auto-generated `soapC.c` and `stdsoap2.c`: cc -I../.. -o myapp myapp.c json.c xml-rpc.c soapC.c ../../stdsoap2.c Instead of `stdsoap2.c` you can link `libgsoap.a` with `-lgsoap`, when installed by the gSOAP package. To enable OpenSSL for HTTPS compile with `-DWITH_OPENSSL` and link `-lssl`, and `-lcrypto`: cc -DWITH_OPENSSL -I../.. -o myapp myapp.c json.c xml-rpc.c soapC.c ../../stdsoap2.c -lssl -lcrypto For OpenSSL support, instead of `stdsoap2.c` you can link `libgsoapssl.a` with `-lgsoapssl`, when installed by the gSOAP package. Because XML namespaces are not used, we can either use `-DWITH_NONAMESPACES` to compile `stdsoap2.c` without complaining about a missing global `Namespace`, or we can define an empty namespaces table somewhere in our code: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} struct Namespace namespaces[] = {{NULL,NULL,NULL,NULL}}; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C XML-RPC and JSON with examples {#c-ex} -------------------------------- An XML-RPC/JSON data value is created in C as follows, which requires a context `ctx` with the engine state (the soap struct). The context manages the memory that is internally allocated to hold values. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} #include "soapH.h" struct soap *ctx = soap_new1(SOAP_C_UTFSTRING); /* new context */ struct value *v = new_value(ctx); soap_end(ctx); /* delete all values */ soap_free(ctx); /* free context */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Note that `soapH.h` is an auto-generated file (see previous section). This file needs to be generated only once and for all. It also references `stdsoap2.h` and the auto-generated `soapStub.h`. Compile and link your code with `stdsoap2.cpp` and the auto-generated `soapC.cpp` XML-RPC serializers. Also compile and link `xml-rpc.cpp`. For JSON, compile and link `json.cpp`. You can use wide strings with Unicode stored in UTF-8-formattted 8-bit `char` strings. For compatibility with XML-RPC serialization of UTF-8-encoded strings, we MUST use the `SOAP_C_UTFSTRING` flag to initialize the context with `soap_new1(SOAP_C_UTFSTRING)`. The code shown above creates an empty value `v`. Values can be assigned any one of the following data types: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} *int_of(v) = 12345LL; /* 64 bit int */ *double_of(v) = 12.34; /* double float */ *string_of(v) = "abc"; /* string */ *string_of(v) = soap_wchar2s(ctx, L"xyz"); /* wide string (converted to UTF-8) */ *bool_of(v) = 0; /* Boolean false (0) or true (1) */ *dateTime_of(v) = soap_dateTime2s(ctx, time(0)); /* time_t value serialized as ISO 8601 date time */ /* create an array [24, 99.99, "abc"] */ *int_of(nth_value(v, 0)) = 24; *double_of(nth_value(v, 1)) = 99.99; *string_of(nth_value(v, 2)) = "abc"; /* create a struct (JSON object) {"name": "gsoap", "major": 2.8, "©": 2015} */ *string_of(value_at(v, "name")) = "gsoap"; *double_of(value_at(v, "major")) = 2.8; *int_of(value_atw(v, L"©")) = 2015; /* wide string tags are OK */ /* create a base64-encoded image object */ struct _base64 *img = base64_of(v); img->__ptr = ptr_to_rawimage100bytes; /* block of 100 raw bytes */ img->__size = 100; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The functions above return a pointer to a specific type of value and this value can be assigned as shown above but also read. So we use these functions also to retrieve data, for example after receiving XML-RPC or JSON data. We can combine this syntax in many possible ways to create arrays of arrays, arrays of structs, and so on. For example: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} *string_of(value_at(nth_value(v, 0), "name")) = "bob"; *string_of(nth_value(value_at(nth_value(v, 0), "toys"), 0)) = "ball"; *string_of(nth_value(value_at(nth_value(v, 0), "toys"), 1)) = "furby"; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This creates a singleton array containing an object with two members: `name` set to `"bob"` and `toys` set to an array containing `"ball"` and `"furby"`. In JSON format this is represented as: [ { "name": "bob", "toys": ["ball", "furby"] } ] ^ ^ ^ ^ | | | | an array_/ | | | of 1 struct_/ | | with 2 members_/______________/ Let's see what happens when we assign a variable the value of another. The JSON C API uses the *reference model* for variables, meaning that values are shared when assigning a target variable the value of another variable. The variable values are shared until one or the other variables is assigned a different type of value. We illustrate the effect below: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} struct value *x = new_value(ctx), *y = new_value(ctx); *int_of(x) = 1; *y = *x; *int_of(x) = 2; printf("x = %lld and y = %lld\n", *int_of(x), *int_of(y)); *double_of(x) = 3.1; printf("x = %g and y = %lld\n", *double_of(x), *int_of(y)); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This prints `x = 2 and y = 2` and `x = 3.1 and y = 2`. You can make a copy of an atomic value with one of the `Type_of()` functions. The following code illustrates how: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} struct value *x = new_value(ctx), *y; *int_of(x) = 1; *inf_of(y) = *int_of(x); *int_of(x) = 2; printf("x = %lld and y = %lld\n", *int_of(x), *int_of(y)); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This prints `x = 2 and y = 1`. You can also make deep copies of values by using the auto-generated `soap_dup_value` function in `soapC.c`: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} struct value *a = new_value(ctx), *b; *int_of(nth_value(a, 0)) = 1; b = soap_dup_value(ctx, NULL, a); *int_of(nth_value(a, 0)) = 2; printf("a[0] = %lld and b[0] = %lld\n", *int_of(nth_value(a, 0)), *int_of(nth_value(b, 0))); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This prints `a[0] = 2 and b[0] = 1`. To auto-generate `soap_dup_value`, use option `-Ec` with soapcpp2: soapcpp2 -c -Ec -CSL xml-rpc.h When receiving a value in XML-RPC or JSON, we generally want to check its type to obtain its value. To check the type of a value, we use `is_Type` functions: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} is_null(v) /* true if value is not set (JSON null) */ is_bool(v) /* true if value is a Boolean "true" or "false" value */ is_true(v) /* true if value is Boolean "true" */ is_false(v) /* true if value is Boolean "false" */ is_int(v) /* true if value is a 32 or a 64 bit int */ is_double(v) /* true if value is a 64 bit double floating point */ is_string(v) /* true if value is a string */ is_dateTime(v) /* true if ISO 8601, always false for received JSON */ is_array(v) /* true if array of values */ is_struct(v) /* true if structure, a.k.a. a JSON object */ is_base64(v) /* true if base64, always false for received JSON */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The following functions can be used with arrays and structs (JSON objects): ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} void set_struct(v) /* reset/create an empty struct */ void set_size(v, int) /* reset/change array size or pre-allocate space */ int has_size(v) /* returns array or struct size or 0 */ struct value *nth_value(v, int) /* returns nth value in array or struct */ struct value *value_at(v, const char*) /* returns value at field in struct */ struct value *value_atw(v, const wchar_t*) /* returns value at field in struct */ int nth_at(v, const char*) /* returns nth index of field in struct or -1 int nth_atw(v, const wchar_t*) /* returns nth index of field in struct or -1 int nth_nth(v, int) /* returns nth index if nth index exists in array or -1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ When accessing structs (JSON objects) with `value_at`, make sure to use existing member field names only. A new member fieldname-value pair is dynamically added to the structure to accomodate the new entry for the field. Also arrays are extended with `nth_value` to accommodate the indexed array element. A negative array index indexes elements from the end of the array, with index -1 accessing the array's last value. Use `set_size` to change array size or set arrays to zero length. Use negative size with `set_size` to remove elements from the end. For example, let's take the value `v` that was assigned the array shown above. We have the following properties of this value: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} is_null(v) == false is_array(v) == true has_size(v) == 1 is_struct(nth_value(v, 0)) == true nth_at(nth_value(v, 0), "name") == 0 is_string(value_at(nth_value(v, 0), "name")) == true is_string(nth_value(value_at(nth_value(v, 0), "toys"), 0)) == true is_string(nth_value(value_at(nth_value(v, 0), "toys"), 1)) == true ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Considering that the code verbosity quickly increases when accessing deeper levels of your structures, you are probably inclined to define your own macros to create and access deep data more conveniently, such as: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} #define string_at(v, s) string_of(value_at((v), (s))) #define nth_string(v, n) string_of(nth_value((v), (n))) #define nth_string_at(v, s, n) string_of(nth_value(value_at((v), (s)), (n))) #define string_at_nth(v, n, s) string_of(value_at(nth_value((v), (n)), (s))) #define nth_string_at_nth(v, n, s, m) string_of(nth_value(value_at(nth_value((v), (n)), (s)), (m))) ... etc ... *string_at_nth(v, 0, "name") = "bob"; *nth_string_at_nth(v, 0, "toys", 0) = "ball"; *nth_string_at_nth(v, 0, "toys", 1) = "furby"; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ To iterate over array and struct values, we use a loop over `nth_value` and `nth_member` as follows: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} if (is_array(v)) { int i; for (i = 0; i < has_size(v); i++) { struct value *array_value = nth_value(v, i); ... /* use and/or set array_value */ } } else if (is_struct(v)) { int i; for (i = 0; i < has_size(v); i++) { struct member *member = nth_member(v, i); const char *member_name = member->name; struct value *member_value = &member->value; ... /* use member_name and member_value */ } } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ To access base64 binary raw data of a value `v`, we use the following code: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} struct _base64 *base64 = base64_of(v); unsigned char *raw = base64->__ptr; /* point to raw binary data */ int size = base64->__size; /* that is of this size */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ XML-RPC parameter lists are similar to arrays and its values are indexed. We can also loop over response parameters after an XML-RPC REST call: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} struct params *request = new_params(ctx); struct methodResponse response; *string_of(nth_param(request, 0)) = "hello"; *string_of(nth_param(request, 1)) = "world"; if (call_method(ctx, "endpoint URL", "methodName", request, &response) == SOAP_OK) { int i; for (i = 0; i < response.params->__size; i++) { struct value *param_value = nth_param(response.params, i); ... /* use param_value */ } } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ We should note that JSON REST does not require parameter types, for example: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} #include "json.h" struct value *request = new_value(ctx); struct value *response = new_value(ctx); *string_of(nth_value(request, 0)) = "hello"; *string_of(nth_value(request, 1)) = "world"; if (json_call(cts, "endpoint URL", request, response) == SOAP_OK) { ... /* use response value */ } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ All dynamically allocated memory that is internally used to store data is deallocated with: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} soap_end(ctx); /* delete all values */ soap_free(ctx); /* delete context allocated with soap_new() */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Additional examples are located in `gsoap/samples/xml-rpc-json`: - `xml-rpc-currentTime.c` XML-RPC C client - `xml-rpc-weblogs.c` XML-RPC C client - `json-GitHub.c`: JSON C client for GitHub API v3 C XML-RPC client example {#c-cl} ------------------------ An XML-RPC method call in C with the new XML-RPC C API: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} #include "soapH.h" /* generated by the command: soapcpp2 -CSL xml-rpc.h */ struct soap *ctx = soap_new1(SOAP_C_UTFSTRING); /* UTF-8 in char* strings */ struct params *request = new_params(ctx); struct methodResponse response; ctx->send_timeout = 10; /* 10 sec, stop if server is not accepting msg */ ctx->recv_timeout = 10; /* 10 sec, stop if server does not respond in time */ /* first parameter is an integer */ *int_of(nth_param(request, 0)) = 123; /* second parameter is a string */ *string_of(nth_param(request, 1)) = "abc"; /* third parameter is a struct {"name": "joe", "age": 23} */ *string_of(value_at(nth_param(request, 2), "name")) = "joe"; *int_of(value_at(nth_param(request, 2), "age")) = 23; /* fourth parameter is an array [456.789, "widget", true] */ *double_of(nth_value(nth_param(request, 3), 0)) = 456.789 *string_of(nth_value(nth_param(request, 3), 1)) = "widget"; *bool_of(nth_value(nth_param(request, 3), 2)) = 1; /* connect, send request, and receive response */ if (call_method(ctx, "endpoint UTL", "methodName" request, &response)) { soap_print_fault(ctx, stderr); } else if (response.fault) { /* write fault to stdout */ soap_write_fault(ctx, response.fault); } else { /* print response parameters */ int i; for (i = 0; i < response.params->__size; i++) { printf("Return parameter %d = ", i+1); display(nth_param(response.params, i)); /* see below */ printf("\n"); } } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The following example shows how to traverse the node graph to display a value: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} void display(struct value *v) { if (is_bool(v)) printf(is_true(v) ? "true" : "false"); else if (is_int(v)) printf("%lld", int_of(v)); else if (is_double(v)) printf("%lG", double_of(v)); else if (is_string(v)) printf("\"%s\"", string_of(v)); else if (is_array(v)) { int i; printf("["); for (i = 0; i < has_size(v); i++) { if (i) printf(","); display(nth_value(v, i)); } printf("]"); } else if (is_struct(v)) { int i; printf("{"); for (i = 0; i < has_size(v); i++) { if (i) printf(","); printf("\"%s\": ", nth_member(v, i)->name); display(&nth_member(v, i)->value); } printf("}"); } else if (is_dateTime(v)) printf("\"%s\"", dateTime_of(v)); else if (is_base64(v)) printf("(%d bytes of raw data at %p)", base64_of(v)->__size, base64_of(v)->__ptr); } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Compile and link together with `soapC.c`, `xml-rpc.c`, and `stdsoap2.c`. C JSON serialization {#c-js} -------------------- To write values in JSON format or parse JSON data, we use the `json.h` and `json.c` JSON C API. It is also possible to send and receive JSON data over HTTP (JSON REST). Reading and writing XML from/to files, streams and string buffers is done via the managing context by setting one of the following context members that control IO sources and sinks: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} ctx->recvfd = fd; // an int file descriptor to read from (0 by default) ctx->sendfd = fd; // an int file descriptor to write to (1 by default) ctx->is = cs; // C only: a const char* string to read from (soap->is will advance) ctx->os = &cs; // C only: pointer to a const char*, will be set to point to the string output ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ For example, to read and write JSON data from/to a file descriptor: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} #include "json.h" /* also compile and link json.c */ struct Namespace namespaces[] = {{NULL,NULL,NULL,NULL}}; /* no XML namespaces */ /* SOAP_C_UTFSTRING: UTF-8 content in char*, SOAP_XML_INDENT: indent JSON */ struct soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT); struct value *v = new_value(ctx); ctx->recvfd = ...; /* set int file descriptor for reading */ json_read(ctx, v); /* read JSON into value v */ if (ctx->error) ... /* handle IO error (error message is in 'v' */ ctx->sendfd = ...; /* set int file descriptor for writing */ json_write(ctx, v); /* write value v in JSON format (indented) */ if (ctx->error) ... /* handle IO error (error message is in 'v' */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ You can also read and write JSON data from/to NUL-terminated strings: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} #include "json.h" struct Namespace namespaces[] = {{NULL,NULL,NULL,NULL}}; struct soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT); struct value *v = new_value(ctx); const char *cs = "[1, 2, 3]"; ctx->is = cs; json_read(ctx, v); /* read JSON array from cs into value v */ if (ctx->error) ... /* handle IO error (error message is in 'v' */ cs = NULL; ctx->os = &cs; json_write(ctx, v); /* write value v in JSON format (indented) and set cs */ if (ctx->error) ... /* handle IO error (error message is in 'v' */ printf("JSON data:\n%s\n", cs); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Compile and link your files together with `soapC.c`, `xml-rpc.c`, `json.c`, and `stdsoap2.c`. You can also convert XML-RPC data to/from JSON and populate XML-RPC from JSON data. The XML-RPC parsing and sending functions are `soap_read_value` and `soap_write_value`, respectively. The JSON protocol has fewer data types than XML-RPC, so type information can be lost when serializing to JSON: - XML-RPC uses a base64 type to exchange raw binary data. The base64 data is converted to a string with base64 content by the JSON serializer. See also [JSON and Base64](#base64). - XML-RPC has a dateTime type, JSON does not. The JSON serializer converts the dateTime type to a dateTime-formatted string. See also [JSON and ISO 8601 DateTime](#dateTime). Strings are stored and exchanged in UTF-8 format in 8-bit strings (i.e. `char*` strings) with the `SOAP_C_UTFSTRING` flag. Wide strings (i.e. `wchar_t*` strings) are converted to UTF-8. To force reading and writing JSON in ISO 8859-1 format, use the `SOAP_ENC_LATIN` flag. Optionally use `SOAP_XML_INDENT` to indent XML and JSON. To read JSON from a string and write JSON to a string, we suggest to use gSOAP 2.8.28 or later. With these newer versions you can set the contex input string `ctx->is` to the string to parse (reset to NULL afterwards) as follows: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} value *v = new_value(ctx); ctx->is = "[ [1, \"2\", 3.14, true], {\"name\": \"john\", \"age\": 24} ]": json_read(ctx, v); if (ctx->error) ... /* handle IO error (error message is in 'v' */ ctx->is = NULL; /* stop reading from string */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ You can set the contex output string pointer `ctx->os` to point to the `const char*` string that you want to be set. This string will point to the JSON data created by the engine and managed by the context as follows: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} value *v = new_value(ctx); const char *json_out = NULL; ... /* populate value v */ ctx->os = &json_out; /* the string to point to JSON data */ json_write(ctx, v); if (ctx->error) ... ctx->os = NULL; /* stop writing to strings */ if (json_out) { ... /* use json_out string, do not free() (managed by the context) */ } ... soap_end(ctx); /* deletes json_out string */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ For older versions prior to 2.8.28, the gSOAP engine's IO `frecv` callback function can be used as follows to parse JSON from a string buffer: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} size_t buf_recv(struct soap *ctx, char *buf, size_t len) { const char *in = (char*)ctx->user; /* get handle to input string */ size_t n = strlen(in); if (n > len) /* if in[] is larger than buf[] len */ n = len; /* then cap length at len */ memcpy(buf, in, n); in += n; ctx->user = (void*)in; /* update the handle */ return n; } ... value *v = new_value(ctx); const char *json_in = "[ [1, \"2\", 3.14, true], {\"name\": \"john\", \"age\": 24} ]": ctx->frecv = buf_recv; ctx->user = (void*)json_in; /* a user handle that is passed to buf_recv */ json_read(ctx, v); if (ctx->error) ... ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ For older versions prior to 2.8.28, the gSOAP engine IO `fsend` callback function can be used to write JSON to strings as follows: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} #define BUFFER_INCREMENT (1024) int buf_send(struct soap *ctx, const char *buf, size_t len) { char *out = (char*)ctx->user; /* get handle to current buffer, if any */ size_t n = out ? strlen(out) : 0; size_t k = (n + len + 1)/BUFFER_INCREMENT; if (!out) /* first time around? */ { out = malloc((k + 1) * BUFFER_INCREMENT); } else if (n/BUFFER_INCREMENT < k) /* need to increase buffer? */ { char *more = malloc((k + 1) * BUFFER_INCREMENT); memcpy(more, out, n); free(out); out = more; } memcpy(out + n, buf, len); out[n + len] = '\0'; ctx->user = (void*)out; return SOAP_OK; } ... value *v = new_value(ctx); const char *json_out; ... /* populate value v */ ctx->fsend = buf_send; ctx->user = NULL; json_write(ctx, v); if (ctx->error) ... json_out = (char*)ctx->user; if (json_out) { ... /* use json_out string */ free(json_out); ctx->user = NULL; } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C JSON over HTTP (REST method) {#c-jr} ------------------------------ To use JSON REST on the client side, we use `json_call`: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} #include "json.h" /* also compile and link json.c */ struct Namespace namespaces[] = {{NULL,NULL,NULL,NULL}}; /* no XML namespaces */ /* SOAP_C_UTFSTRING: UTF-8 content in char*, SOAP_XML_INDENT: indent JSON */ struct soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT); struct value *request = new_value(ctx); struct value response; ... /* here we populate the request data to be send */ if (json_call(ctx, "endpoint URL", request, response)) ... /* error */ ... /* use the response data */ soap_end(ctx); /* delete all values */ ... /* here we can make other calls etc. */ soap_free(ctx); /* delete the context */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The `json_call` function takes a context, an endpoint URL (with query string parameters as needed), and optional `in` and `out` values to send and receive, respectively. The function returns `SOAP_OK` (zero) for success or `EOF`, `SOAP_SYNTAX_ERROR`, or an HTTP error code. To use the JSON REST POST method, pass both `in` and `out` values to `json_call`. For the GET method, pass a NULL to `in`. For the PUT method, pass a NULL to `out`. For the DELETE method, pass both NULL to `in` and `out`. Besides `json_call`, there are other JSON API functions: - `int json_call(struct soap *ctx, const char *URL, struct value *in, struct value *out)` makes a POST, GET, PUT, DELETE call, returns `SOAP_OK` or error code. POST method: pass both `in` and `out`. GET method: pass a NULL to `in`. PUT method: pass a NULL to `out`. DELETE method: pass both NULL to `in` and `out`. - `int json_write(struct soap *ctx, const struct value *v)` Writes JSON value to current file or socket. Returns `SOAP_OK` or error. Set current file/socket file descriptor with `ctx->sendfd = fd`. Or save JSON to a string by setting `ctx->os = &cs` with `const char *cs` a string pointer that will be set to a NUL-terminated string when the write completed. - `int json_read(struct soap *ctx, struct value *v)` Reads JSON value from current file or socket. Returns `SOAP_OK` or error. Set current file/socket file descriptor with `ctx->recvfd = fd`. Or read from string by setting `ctx->is = cs` to a `const char *cs` NUL-terminated string. The are two other lower-level functions `json_send` and `json_recv` that are similar to `json_write` and `json_read` but do not initialize the sending and receiving operations and do not flush after the sending and receiving operations. Compile and link together with `soapC.c`, `xml-rpc.c`, `json.c`, and `stdsoap2.c`. Miscellaneous {#misc} ============= Compiling XML-RPC/JSON together with gSOAP XML data binding code {#json-cc} ---------------------------------------------------------------- To use JSON (and XML-RPC) with other gSOAP XML data binding code requires a few simple steps to ensure that your project compiles cleanly. For C++, arguably the best option is to [move the JSON types and operations into a C++ namespace](#json-ns). We present two other options that you can follow, and the only options you can take to combine the JSON C API with other generated XML C data binding code. The following two options follow different strategies to compile a combined set of files with JSON (and XML-RPC) types and operations with other files with XML data binding types and operations: ### Option 1: #import "xml-rpc.h" Before processing a gSOAP XML data binding header file with soapcpp2, add `#import "xml-rpc.h"` to this header file to include XML-RPC and JSON data types. Then compile the generated files as usual together with `jcon.c` (or `json.cpp` for C++) and `xml-rpc.c` (or `xml-rpc.cpp` for C++). Also `#include "json.h"` in your code to use the JSON API. This is the simpler of the two options. When using wsdl2h, you can automate this option by adding the following three lines to `typemap.dat`: [ #import "xml-rpc.h" ] This automatically imports the JSON/XML-RPC types and operations into the XML data binding code. You will still need to compile your code together with `jcon.c` (or `json.cpp` for C++) and `xml-rpc.c` (or `xml-rpc.cpp` for C++). ### Option 2: soapcpp2 -pjson Use soapcpp2 option `-pjson` to generate and compile the JSON (and XML-RPC) API code to combine with your other XML data binding code generated with soapcpp2: soapcpp2 -c -pjson -CSL xml-rpc.h This generates `jsonStub.h`, `jsonH.h`, and `jsonC.c`. Now edit `xml-rpc.c` to replace the `#include` of `soapH.h` with `jsonH.h`. Then edit `json.h` to replace the `#include` of `soapH.h` with `jsonH.h`. Compile `jsonC.c`, `xml-rpc.c`, and `json.c` together with your project files and the files generated by soapcpp2 for your .h file with XML data bindings (the .h file generated by wsdl2h). Floating point format {#fp} --------------------- The floating point format used to output values in XML-RPC and JSON is by default ".17lG' to ensure accuracy up to the last digit. The format can be set as follows: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} struct soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT); ctx->double_format = "%lG"; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ JSON and base64 {#base64} --------------- JSON has no binary type to transmit binary data. Sending binary data in JSON strings as text is not recommended, due to NULs and problems with Unicode/UTF-8 sequences. Base64 is a common encoding format for binary data. A JSON string with base64 content is our recommended option. To populate JSON data with base64-encoded binary content, you can simply create and assign a `_base64` value as described earlier (e.g. by casting a `_base64` structure to a value in C++). Receiving base64-encoded content with JSON is not possible, because the necessary type information is lost in transit. The base64 content will arrive at the receiver simply as a string with base64 content. You can explicitly decode the base64 string back to binary as shown here for C++: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} if (v.is_string()) { /* assuming base64 content in string value v, decoded it */ int len; unsigned char *ptr = (unsigned char*)soap_base642s(ctx, (const char*)v, NULL, 0, &len); /* ptr points to binary of length len or is NULL when decoding failed */ if (ptr) ... // success ctx->error = SOAP_OK; // fail and reset error ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ And for C: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} if (is_string(v)) { /* assuming base64 content in string value v, decoded it */ int len; unsigned char *ptr = (unsigned char*)soap_base642s(ctx, *string_of(v), NULL, 0, &len); /* ptr points to binary of length len or is NULL when decoding failed */ if (ptr) ... // success ctx->error = SOAP_OK; // fail and reset error ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ JSON and ISO 8601 dateTime {#dateTime} -------------------------- To populate JSON data with ISO 8601 date time content, you can simply assign a `ULONG64` value cast from a `time_t` value as described earlier. Receiving ISO 8601 date time content with JSON is not possible, because the necessary type information is lost in transit. The content will arrive at the receiver simply as a string with a date and time. You can explicitly convert a string with an ISO 8601 date time to a `time_t` value as shown here for C++: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} if (v.is_string()) { time_t tm; if (soap_s2dateTime(ctx, (const char*)v, &tm) == SOAP_OK) ... // success ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ And for C: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} if (is_string(v)) { time_t tm; if (soap_s2dateTime(ctx, *string_of(v), &tm) == SOAP_OK) ... // success ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ gsoap-2.8.28/gsoap/samples/xml-rpc-json/json-GitHub.c0000644000175000017500000000530012653650156021676 0ustar ellertellert/* json-GitHub.c JSON GitHub API v3 (C version) https://developer.github.com/v3/ Compile: soapcpp2 -c -CSL xml-rpc.h cc -DWITH_OPENSSL -DWITH_GZIP -o json-GitHub json-GitHub.c xml-rpc.c json.c stdsoap2.c soapC.c -lcrypto -lssl -lz Usage: ./json-GutHub hostname [username password] Example: ./json-GitHub https://api.github.com/orgs/Genivia/repos -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "json.h" void display(struct value *v); int main(int argc, char **argv) { if (argc < 2) { fprintf(stderr, "Usage: json-GitHub hostname [username password]\nFor example: json-GitHub https://api.github.com/orgs/Genivia/repos\n\n"); exit(1); } else { struct soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT); struct value response; if (argc > 3) { /* Basic authentication with username password */ if (strncmp(argv[1], "https", 5)) { fprintf(stderr, "Basic authentication over http is not secure: use https\n"); exit(1); } ctx->userid = argv[2]; ctx->passwd = argv[3]; } if (json_call(ctx, argv[1], NULL, &response)) soap_print_fault(ctx, stderr); else json_write(ctx, &response); printf("\n\nOK\n"); soap_end(ctx); soap_free(ctx); } return 0; } /* Don't need a namespace table. We put an empty one here to avoid link errors */ struct Namespace namespaces[] = { {NULL, NULL} }; gsoap-2.8.28/gsoap/samples/xml-rpc-json/xml-rpc-io.h0000644000175000017500000000332512653650156021546 0ustar ellertellert/* xml-rpc-io.h XML-RPC io stream operations on XML-RPC values -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #ifdef JSON_NAMESPACE namespace json { #endif /// print a value in XML-RPC format extern std::ostream& operator<<(std::ostream&, const struct value&); /// parse a value from XML stream extern std::istream& operator>>(std::istream&, struct value&); #ifdef JSON_NAMESPACE } // namespace json #endif gsoap-2.8.28/gsoap/samples/xml-rpc-json/Makefile.in0000644000175000017500000007100112653650156021447 0ustar ellertellert# Makefile.in generated by automake 1.14 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = jsoncpp$(EXEEXT) json-GitHub$(EXEEXT) \ xml-rpc-currentTime$(EXEEXT) DIST_COMMON = $(srcdir)/../Makefile.defines \ $(srcdir)/../Makefile.cpp_rules $(srcdir)/Makefile.in \ $(srcdir)/Makefile.am $(top_srcdir)/mkinstalldirs \ $(top_srcdir)/depcomp subdir = gsoap/samples/xml-rpc-json ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = am__objects_2 = json_GitHub-soapC.$(OBJEXT) am_json_GitHub_OBJECTS = json_GitHub-json-GitHub.$(OBJEXT) \ json_GitHub-xml-rpc.$(OBJEXT) json_GitHub-json.$(OBJEXT) \ $(am__objects_1) $(am__objects_2) json_GitHub_OBJECTS = $(am_json_GitHub_OBJECTS) am__DEPENDENCIES_1 = json_GitHub_DEPENDENCIES = $(SOAP_CPP_LIB_SSL) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am__objects_3 = soapC.$(OBJEXT) am_jsoncpp_OBJECTS = jsoncpp.$(OBJEXT) xml-rpc.$(OBJEXT) \ json.$(OBJEXT) $(am__objects_1) $(am__objects_3) jsoncpp_OBJECTS = $(am_jsoncpp_OBJECTS) jsoncpp_DEPENDENCIES = $(SOAP_CPP_LIB) $(am__DEPENDENCIES_1) am_xml_rpc_currentTime_OBJECTS = xml-rpc-currentTime.$(OBJEXT) \ xml-rpc.$(OBJEXT) json.$(OBJEXT) $(am__objects_1) \ $(am__objects_3) xml_rpc_currentTime_OBJECTS = $(am_xml_rpc_currentTime_OBJECTS) xml_rpc_currentTime_DEPENDENCIES = $(SOAP_CPP_LIB) \ $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(json_GitHub_SOURCES) $(jsoncpp_SOURCES) \ $(xml_rpc_currentTime_SOURCES) DIST_SOURCES = $(json_GitHub_SOURCES) $(jsoncpp_SOURCES) \ $(xml_rpc_currentTime_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ STRIP = @STRIP@ VERSION = @VERSION@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 SOAPHEADER = xml-rpc.h AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a SOAP_CPP_SRC = $(SOAP_CPP_CLIENT) soapServer.cpp $(SOAP_H_FILES) $(SOAP_NS) LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_CPP_SRC) CLEANFILES = $(SOAP_CPP_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.cpp soap*Proxy.h soap*Proxy.cpp soap*Object.h soap*Service.h soap*Service.cpp soapClient.cpp soapServer.cpp soapClientLib.cpp soapServerLib.cpp *~ SOAP_NS = $(SOAP_NS_DEF) jsoncpp_SOURCES = jsoncpp.cpp xml-rpc.cpp json.cpp $(SOAPHEADER) $(SOAP_CPP_CORE) jsoncpp_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) json_GitHub_CPPFLAGS = -DWITH_OPENSSL -DWITH_GZIP json_GitHub_SOURCES = json-GitHub.cpp xml-rpc.cpp json.cpp $(SOAPHEADER) $(SOAP_CPP_CORE) json_GitHub_LDADD = $(SOAP_CPP_LIB_SSL) $(SAMPLE_EXTRA_LIBS) $(SAMPLE_SSL_LIBS) xml_rpc_currentTime_SOURCES = xml-rpc-currentTime.cpp xml-rpc.cpp json.cpp $(SOAPHEADER) $(SOAP_CPP_CORE) xml_rpc_currentTime_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_rules $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/xml-rpc-json/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/xml-rpc-json/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_rules: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) json-GitHub$(EXEEXT): $(json_GitHub_OBJECTS) $(json_GitHub_DEPENDENCIES) $(EXTRA_json_GitHub_DEPENDENCIES) @rm -f json-GitHub$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(json_GitHub_OBJECTS) $(json_GitHub_LDADD) $(LIBS) jsoncpp$(EXEEXT): $(jsoncpp_OBJECTS) $(jsoncpp_DEPENDENCIES) $(EXTRA_jsoncpp_DEPENDENCIES) @rm -f jsoncpp$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(jsoncpp_OBJECTS) $(jsoncpp_LDADD) $(LIBS) xml-rpc-currentTime$(EXEEXT): $(xml_rpc_currentTime_OBJECTS) $(xml_rpc_currentTime_DEPENDENCIES) $(EXTRA_xml_rpc_currentTime_DEPENDENCIES) @rm -f xml-rpc-currentTime$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(xml_rpc_currentTime_OBJECTS) $(xml_rpc_currentTime_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/json.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/json_GitHub-json-GitHub.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/json_GitHub-json.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/json_GitHub-soapC.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/json_GitHub-xml-rpc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jsoncpp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapC.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xml-rpc-currentTime.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xml-rpc.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` json_GitHub-json-GitHub.o: json-GitHub.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(json_GitHub_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT json_GitHub-json-GitHub.o -MD -MP -MF $(DEPDIR)/json_GitHub-json-GitHub.Tpo -c -o json_GitHub-json-GitHub.o `test -f 'json-GitHub.cpp' || echo '$(srcdir)/'`json-GitHub.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/json_GitHub-json-GitHub.Tpo $(DEPDIR)/json_GitHub-json-GitHub.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='json-GitHub.cpp' object='json_GitHub-json-GitHub.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(json_GitHub_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o json_GitHub-json-GitHub.o `test -f 'json-GitHub.cpp' || echo '$(srcdir)/'`json-GitHub.cpp json_GitHub-json-GitHub.obj: json-GitHub.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(json_GitHub_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT json_GitHub-json-GitHub.obj -MD -MP -MF $(DEPDIR)/json_GitHub-json-GitHub.Tpo -c -o json_GitHub-json-GitHub.obj `if test -f 'json-GitHub.cpp'; then $(CYGPATH_W) 'json-GitHub.cpp'; else $(CYGPATH_W) '$(srcdir)/json-GitHub.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/json_GitHub-json-GitHub.Tpo $(DEPDIR)/json_GitHub-json-GitHub.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='json-GitHub.cpp' object='json_GitHub-json-GitHub.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(json_GitHub_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o json_GitHub-json-GitHub.obj `if test -f 'json-GitHub.cpp'; then $(CYGPATH_W) 'json-GitHub.cpp'; else $(CYGPATH_W) '$(srcdir)/json-GitHub.cpp'; fi` json_GitHub-xml-rpc.o: xml-rpc.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(json_GitHub_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT json_GitHub-xml-rpc.o -MD -MP -MF $(DEPDIR)/json_GitHub-xml-rpc.Tpo -c -o json_GitHub-xml-rpc.o `test -f 'xml-rpc.cpp' || echo '$(srcdir)/'`xml-rpc.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/json_GitHub-xml-rpc.Tpo $(DEPDIR)/json_GitHub-xml-rpc.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xml-rpc.cpp' object='json_GitHub-xml-rpc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(json_GitHub_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o json_GitHub-xml-rpc.o `test -f 'xml-rpc.cpp' || echo '$(srcdir)/'`xml-rpc.cpp json_GitHub-xml-rpc.obj: xml-rpc.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(json_GitHub_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT json_GitHub-xml-rpc.obj -MD -MP -MF $(DEPDIR)/json_GitHub-xml-rpc.Tpo -c -o json_GitHub-xml-rpc.obj `if test -f 'xml-rpc.cpp'; then $(CYGPATH_W) 'xml-rpc.cpp'; else $(CYGPATH_W) '$(srcdir)/xml-rpc.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/json_GitHub-xml-rpc.Tpo $(DEPDIR)/json_GitHub-xml-rpc.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xml-rpc.cpp' object='json_GitHub-xml-rpc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(json_GitHub_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o json_GitHub-xml-rpc.obj `if test -f 'xml-rpc.cpp'; then $(CYGPATH_W) 'xml-rpc.cpp'; else $(CYGPATH_W) '$(srcdir)/xml-rpc.cpp'; fi` json_GitHub-json.o: json.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(json_GitHub_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT json_GitHub-json.o -MD -MP -MF $(DEPDIR)/json_GitHub-json.Tpo -c -o json_GitHub-json.o `test -f 'json.cpp' || echo '$(srcdir)/'`json.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/json_GitHub-json.Tpo $(DEPDIR)/json_GitHub-json.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='json.cpp' object='json_GitHub-json.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(json_GitHub_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o json_GitHub-json.o `test -f 'json.cpp' || echo '$(srcdir)/'`json.cpp json_GitHub-json.obj: json.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(json_GitHub_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT json_GitHub-json.obj -MD -MP -MF $(DEPDIR)/json_GitHub-json.Tpo -c -o json_GitHub-json.obj `if test -f 'json.cpp'; then $(CYGPATH_W) 'json.cpp'; else $(CYGPATH_W) '$(srcdir)/json.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/json_GitHub-json.Tpo $(DEPDIR)/json_GitHub-json.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='json.cpp' object='json_GitHub-json.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(json_GitHub_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o json_GitHub-json.obj `if test -f 'json.cpp'; then $(CYGPATH_W) 'json.cpp'; else $(CYGPATH_W) '$(srcdir)/json.cpp'; fi` json_GitHub-soapC.o: soapC.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(json_GitHub_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT json_GitHub-soapC.o -MD -MP -MF $(DEPDIR)/json_GitHub-soapC.Tpo -c -o json_GitHub-soapC.o `test -f 'soapC.cpp' || echo '$(srcdir)/'`soapC.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/json_GitHub-soapC.Tpo $(DEPDIR)/json_GitHub-soapC.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soapC.cpp' object='json_GitHub-soapC.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(json_GitHub_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o json_GitHub-soapC.o `test -f 'soapC.cpp' || echo '$(srcdir)/'`soapC.cpp json_GitHub-soapC.obj: soapC.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(json_GitHub_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT json_GitHub-soapC.obj -MD -MP -MF $(DEPDIR)/json_GitHub-soapC.Tpo -c -o json_GitHub-soapC.obj `if test -f 'soapC.cpp'; then $(CYGPATH_W) 'soapC.cpp'; else $(CYGPATH_W) '$(srcdir)/soapC.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/json_GitHub-soapC.Tpo $(DEPDIR)/json_GitHub-soapC.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soapC.cpp' object='json_GitHub-soapC.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(json_GitHub_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o json_GitHub-soapC.obj `if test -f 'soapC.cpp'; then $(CYGPATH_W) 'soapC.cpp'; else $(CYGPATH_W) '$(srcdir)/soapC.cpp'; fi` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am $(SOAP_CPP_SRC) : $(SOAPHEADER) $(SOAP) -L -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $(SOAPHEADER) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.28/gsoap/samples/xml-rpc-json/json.cpp0000644000175000017500000006034112653650156021064 0ustar ellertellert/* json.c[pp] JSON C/C++ API For more information please visit: http://www.genivia.com/doc/xml-rpc-json/html/ -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "json.h" #ifdef JSON_NAMESPACE # define SOAP_TYPE__boolean SOAP_TYPE_json__boolean # define SOAP_TYPE__i4 SOAP_TYPE_json__i4 # define SOAP_TYPE__int SOAP_TYPE_json__int # define SOAP_TYPE__double SOAP_TYPE_json__double # define SOAP_TYPE__dateTime_DOTiso8601 SOAP_TYPE_json__dateTime_DOTiso8601 # define SOAP_TYPE__string SOAP_TYPE_json__string # define SOAP_TYPE__array SOAP_TYPE_json__array # define SOAP_TYPE__struct SOAP_TYPE_json__struct # define SOAP_TYPE__base64 SOAP_TYPE_json__base64 #endif #ifdef JSON_NAMESPACE namespace json { #endif int json_error(struct soap *soap, struct value *v) { if (soap->error && v) { const char *s = *soap_faultstring(soap); const char *t = soap_check_faultdetail(soap); /* set JSON error property (Google JSON Style Guide) */ #ifdef __cplusplus (*v)["error"]["code"] = soap->error; if (s) { (*v)["error"]["message"] = s; if (t) (*v)["error"]["errors"][0]["message"] = t; } #else *int_of(value_at(value_at(v, "error"), "code")) = soap->error; if (s) { *string_of(value_at(value_at(v, "error"), "message")) = soap_strdup(soap, s); if (t) *string_of(value_at(nth_value(value_at(value_at(v, "error"), "errors"), 0), "message")) = soap_strdup(soap, t); } #endif } return soap->error; } int json_write(struct soap *soap, const struct value *v) { if (soap_begin_send(soap) || json_send(soap, v) || soap_end_send(soap)) return soap->error; return SOAP_OK; } int json_send(struct soap *soap, const struct value *v) { static const char *json_indent_string = ",\n "; int i, n = 1; if (!v) return SOAP_OK; switch (v->__type) { case SOAP_TYPE__array: if ((soap->mode & SOAP_XML_INDENT)) n = 2 * (++soap->level % 40) + 2; if (soap_send_raw(soap, "["/*"]"*/, 1)) return soap->error; if (v->ref) { for (i = 0; i < ((struct _array*)v->ref)->data.__size; i++) { if (soap_send_raw(soap, json_indent_string + (i == 0), n - (i == 0))) return soap->error; if (json_send(soap, &(((struct _array*)v->ref)->data.value)[i])) return soap->error; } } if ((soap->mode & SOAP_XML_INDENT)) { if (i && soap_send_raw(soap, json_indent_string + 1, n - 3)) return soap->error; soap->level--; } return soap_send_raw(soap, /*"["*/"]", 1); case SOAP_TYPE__boolean: if (*(_boolean*)v->ref == 1) return soap_send_raw(soap, "true", 4); return soap_send_raw(soap, "false", 5); case SOAP_TYPE__double: return soap_send(soap, soap_double2s(soap, (double)*(_double*)v->ref)); case SOAP_TYPE__i4: return soap_send(soap, soap_int2s(soap, (int)*(_i4*)v->ref)); case SOAP_TYPE__int: return soap_send(soap, soap_LONG642s(soap, (LONG64)*(_int*)v->ref)); case SOAP_TYPE__string: case SOAP_TYPE__dateTime_DOTiso8601: return json_send_string(soap, (const char*)v->ref); case SOAP_TYPE__base64: if (soap_send_raw(soap, "\"", 1)) return soap->error; if (v->ref && soap_putbase64(soap, ((struct _base64*)v->ref)->__ptr, ((struct _base64*)v->ref)->__size)) return soap->error; return soap_send_raw(soap, "\"", 1); case SOAP_TYPE__struct: if ((soap->mode & SOAP_XML_INDENT)) n = 2 * (++soap->level % 40) + 2; if (soap_send_raw(soap, "{"/*"}"*/, 1)) return soap->error; if (v->ref) { for (i = 0; i < ((struct _struct*)v->ref)->__size; i++) { if (soap_send_raw(soap, json_indent_string + (i == 0), n - (i == 0))) return soap->error; if (json_send_string(soap, (((struct _struct*)v->ref)->member)[i].name) || soap_send_raw(soap, ": ", 1 + (n > 1)) || json_send(soap, &(((struct _struct*)v->ref)->member)[i].value)) return soap->error; } } if ((soap->mode & SOAP_XML_INDENT)) { if (i && soap_send_raw(soap, json_indent_string + 1, n - 3)) return soap->error; soap->level--; } return soap_send_raw(soap, /*"{"*/"}", 1); default: if (v->__any) return json_send_string(soap, v->__any); return soap_send_raw(soap, "null", 4); } return SOAP_OK; } int json_read(struct soap *soap, struct value *v) { soap_default_value(soap, v); if (soap_begin_recv(soap) || json_recv(soap, v) || soap_end_recv(soap)) return json_error(soap, v); return SOAP_OK; } int json_recv(struct soap *soap, struct value *v) { soap_wchar c; if (!v) return SOAP_OK; v->__type = 0; v->ref = NULL; v->__any = NULL; v->soap = soap; while (((c = soap_getchar(soap)) > 0 && c <= 0x20) || c == 0xA0) continue; switch (c) { case EOF: return soap->error = SOAP_EOF; case '{'/*'}'*/: { struct value s; #ifdef __cplusplus if (!(v->ref = (void*)soap_new__struct(soap))) return soap->error = SOAP_EOM; #else if (!(v->ref = (void*)soap_malloc(soap, sizeof(struct _struct)))) return soap->error = SOAP_EOM; #endif soap_default__struct(soap, (struct _struct*)v->ref); v->__type = SOAP_TYPE__struct; while (((c = soap_getchar(soap)) > 0 && c <= 0x20) || c == 0xA0) continue; if (c == /*'{'*/'}') return SOAP_OK; soap_unget(soap, c); for (;;) { if (json_recv(soap, &s)) return soap->error; if (s.__type != SOAP_TYPE__string) return soap_set_sender_error(soap, "field name expected", (const char*)s.ref, SOAP_SYNTAX_ERROR); while (((c = soap_getchar(soap)) > 0 && c <= 0x20) || c == 0xA0) continue; if (c != ':') return soap_set_sender_error(soap, "':' expected", (const char*)s.ref, SOAP_SYNTAX_ERROR); #ifdef __cplusplus if (json_recv(soap, v->operator[]((const char*)s.ref))) return soap->error; #else if (json_recv(soap, value_at(v, (const char*)s.ref))) return soap->error; #endif while (((c = soap_getchar(soap)) > 0 && c <= 0x20) || c == 0xA0) continue; if (c == /*'{'*/'}') break; if ((int)c == EOF) return soap->error = SOAP_EOF; if (c != ',') return soap_set_sender_error(soap, "closing '}' or comma expected", NULL, SOAP_SYNTAX_ERROR); } return SOAP_OK; } case '['/*']'*/: { int i; #ifdef __cplusplus if (!(v->ref = (void*)soap_new__array(soap))) return soap->error = SOAP_EOM; #else if (!(v->ref = (void*)soap_malloc(soap, sizeof(struct _array)))) return soap->error = SOAP_EOM; #endif soap_default__array(soap, (struct _array*)v->ref); v->__type = SOAP_TYPE__array; while (((c = soap_getchar(soap)) > 0 && c <= 0x20) || c == 0xA0) continue; if (c == /*'['*/']') return SOAP_OK; soap_unget(soap, c); for (i = 0; ; i++) { #ifdef __cplusplus if (json_recv(soap, v->operator[](i))) return soap->error; #else if (json_recv(soap, nth_value(v, i))) return soap->error; #endif while (((c = soap_getchar(soap)) > 0 && c <= 0x20) || c == 0xA0) continue; if (c == /*'['*/']') break; if ((int)c == EOF) return soap->error = SOAP_EOF; if (c != ',') return soap_set_sender_error(soap, "closing ']' or comma expected", NULL, SOAP_SYNTAX_ERROR); } return SOAP_OK; } case '"': soap->labidx = 0; for (;;) { char *s; const char *t = NULL; register size_t k; if (soap_append_lab(soap, NULL, 0)) return soap->error = SOAP_EOM; s = soap->labbuf + soap->labidx; k = soap->lablen - soap->labidx; soap->labidx = soap->lablen; while (k--) { if (t) { *s++ = *t++; if (!*t) t = NULL; } else { c = soap_getchar(soap); switch (c) { case EOF: return soap->error = SOAP_EOF; case '"': *s = '\0'; v->__type = SOAP_TYPE__string; if (!(v->ref = soap_strdup(soap, soap->labbuf))) return soap->error = SOAP_EOM; return SOAP_OK; case '\\': c = soap_getchar(soap); switch (c) { case EOF: return soap->error = SOAP_EOF; case 'b': c = 8; break; case 'f': c = 12; break; case 'n': c = 10; break; case 'r': c = 13; break; case 't': c = 9; break; case 'u': { char *h; wchar_t wc[2]; int i; /* hex to utf8 conversion */ h = soap->tmpbuf; for (i = 0; i < 4; i++) { if ((c = soap_getchar(soap)) == EOF) return soap->error = SOAP_EOF; h[i] = c; } wc[0] = soap_strtol(h, NULL, 16); wc[1] = 0; t = soap_wchar2s(soap, wc); c = *t++; if (!*t) t = NULL; } } *s++ = c; break; default: if ((c & 0x80) && (soap->imode & SOAP_ENC_LATIN) && (soap->imode & SOAP_C_UTFSTRING)) /* ISO 8859-1 to utf8 */ { *s++ = (char)(0xC0 | ((c >> 6) & 0x1F)); soap->tmpbuf[0] = (0x80 | (c & 0x3F)); soap->tmpbuf[1] = '\0'; t = soap->tmpbuf; } else if ((c & 0x80) && !(soap->imode & SOAP_ENC_LATIN) && !(soap->imode & SOAP_C_UTFSTRING)) /* utf8 to ISO 8859-1 */ { soap_wchar c1 = soap_getchar(soap); if (c1 == SOAP_EOF) return soap->error = SOAP_EOF; if (c < 0xE0 && (c & 0x1F) <= 0x03) *s++ = ((c & 0x1F) << 6) | (c1 & 0x3F); else *s++ = '?'; } else *s++ = c; } } } } default: /* number, true, false, null */ { char *s = soap->tmpbuf; do { *s++ = c; c = soap_getchar(soap); } while ((isalnum((int)c) || (int)c == '.' || (int)c == '+' || (int)c == '-') && s - soap->tmpbuf < (int)sizeof(soap->tmpbuf) - 1); *s = '\0'; soap_unget(soap, c); if (soap->tmpbuf[0] == '-' || isdigit(soap->tmpbuf[0])) { LONG64 n = soap_strtoll(soap->tmpbuf, &s, 10); if (!*s) { v->__type = SOAP_TYPE__int; if (!(v->ref = soap_malloc(soap, sizeof(_int)))) return soap->error = SOAP_EOM; *(_int*)v->ref = n; } else { double x; if (soap_s2double(soap, soap->tmpbuf, &x)) return soap_set_sender_error(soap, "number expected", soap->tmpbuf, SOAP_SYNTAX_ERROR); v->__type = SOAP_TYPE__double; if (!(v->ref = soap_malloc(soap, sizeof(_double)))) return soap->error = SOAP_EOM; *(_double*)v->ref = x; } } else if (!strcmp(soap->tmpbuf, "true")) { v->__type = SOAP_TYPE__boolean; if (!(v->ref = soap_malloc(soap, sizeof(_boolean)))) return soap->error = SOAP_EOM; *(char*)v->ref = 1; } else if (!strcmp(soap->tmpbuf, "false")) { v->__type = SOAP_TYPE__boolean; if (!(v->ref = soap_malloc(soap, sizeof(_boolean)))) return soap->error = SOAP_EOM; *(char*)v->ref = 0; } else if (strcmp(soap->tmpbuf, "null")) { return soap_set_sender_error(soap, "value expected", soap->tmpbuf, SOAP_SYNTAX_ERROR); } return SOAP_OK; } } } int json_call(struct soap *soap, const char *endpoint, const struct value *in, struct value *out) { if (out) soap_default_value(soap, out); soap->http_content = "application/json; charset=utf-8"; if (soap_begin_count(soap) || ((soap->mode & SOAP_IO_LENGTH) && json_send(soap, in)) || soap_end_count(soap) || soap_connect_command(soap, in && out ? SOAP_POST_FILE : out ? SOAP_GET : in ? SOAP_PUT : SOAP_DEL, endpoint, NULL) || json_send(soap, in) || soap_end_send(soap) || soap_begin_recv(soap) || json_recv(soap, out) || soap_end_recv(soap)) json_error(soap, out); return soap_closesock(soap); } int json_send_string(struct soap *soap, const char *s) { const char *t = s; int c; char buf[8]; if (!s) return soap_send_raw(soap, "\"\"", 2); if (soap_send_raw(soap, "\"", 1)) return soap->error; while ((c = *s++)) { if (c < 0x20 && c > 0) { switch (c) { case '\b': c = 'b'; break; case '\f': c = 'f'; break; case '\n': c = 'n'; break; case '\r': c = 'r'; break; case '\t': c = 't'; break; } if (c > 0x20) { buf[0] = '\\'; buf[1] = c; if (soap_send_raw(soap, t, s - t - 1) || soap_send_raw(soap, buf, 2)) return soap->error; t = s; } else { (SOAP_SNPRINTF(buf, sizeof(buf), 7), "\\u%4x", c); if (soap_send_raw(soap, t, s - t - 1) || soap_send_raw(soap, buf, 6)) return soap->error; t = s; } } else if (c == '"' || c == '\\') { buf[0] = '\\'; buf[1] = c; if (soap_send_raw(soap, t, s - t - 1) || soap_send_raw(soap, buf, 2)) return soap->error; t = s; } else if ((c & 0x80)) { if ((soap->omode & SOAP_ENC_LATIN) && (soap->omode & SOAP_C_UTFSTRING)) /* UTF-8 to ISO 8859-1 */ { if (c < 0xE0 && (c & 0x1F) <= 0x03) buf[0] = ((c & 0x1F) << 6) | (*s++ & 0x3F); else buf[0] = '?'; if (soap_send_raw(soap, t, s - t - 1) || soap_send_raw(soap, buf, 1)) return soap->error; t = s; } else if (!(soap->omode & SOAP_ENC_LATIN) && !(soap->omode & SOAP_C_UTFSTRING)) /* ISO 8859-1 to UTF-8 */ { buf[0] = (char)(0xC0 | ((c >> 6) & 0x1F)); buf[1] = (char)(0x80 | (c & 0x3F)); if (soap_send_raw(soap, t, s - t - 1) || soap_send_raw(soap, buf, 2)) return soap->error; t = s; } } } if (soap_send_raw(soap, t, s - t - 1) || soap_send_raw(soap, "\"", 1)) return soap->error; return SOAP_OK; } #ifdef __cplusplus int json_write(struct soap *soap, const struct value& v) { return json_write(soap, &v); } int json_send(struct soap *soap, const struct value& v) { return json_send(soap, &v); } int json_read(struct soap *soap, struct value& v) { return json_read(soap, &v); } int json_recv(struct soap *soap, struct value& v) { return json_recv(soap, &v); } int json_call(struct soap *soap, const char *endpoint, const struct value& in, struct value& out) { return json_call(soap, endpoint, &in, &out); } int json_call(struct soap *soap, const char *endpoint, const struct value *in, struct value& out) { return json_call(soap, endpoint, in, &out); } int json_call(struct soap *soap, const char *endpoint, const struct value& in, struct value *out) { return json_call(soap, endpoint, &in, out); } std::ostream& operator<<(std::ostream& o, const struct value& v) { if (v.soap) { std::ostream *os = v.soap->os; v.soap->os = &o; json_write(v.soap, v); v.soap->os = os; } else { soap *ctx = soap_new(); ctx->os = &o; json_write(ctx, v); soap_destroy(ctx); soap_end(ctx); soap_free(ctx); } return o; } std::istream& operator>>(std::istream& i, struct value& v) { if (!v.soap) v.soap = soap_new(); std::istream *is = v.soap->is; v.soap->is = &i; json_read(v.soap, v); v.soap->is = is; return i; } static int json_promote_type(const value& x, const value& y) { switch (x.__type) { case SOAP_TYPE__array: return x.__type; case SOAP_TYPE__struct: switch (y.__type) { case SOAP_TYPE__array: return y.__type; case SOAP_TYPE__struct: return x.__type; default: return SOAP_TYPE__array; } case SOAP_TYPE__string: case SOAP_TYPE__dateTime_DOTiso8601: switch (y.__type) { case SOAP_TYPE__array: case SOAP_TYPE__struct: return y.__type; default: return x.__type; } case SOAP_TYPE__double: switch (y.__type) { case SOAP_TYPE__array: case SOAP_TYPE__struct: case SOAP_TYPE__string: case SOAP_TYPE__dateTime_DOTiso8601: return y.__type; default: return x.__type; } case SOAP_TYPE__i4: case SOAP_TYPE__int: switch (y.__type) { case SOAP_TYPE__array: case SOAP_TYPE__struct: case SOAP_TYPE__string: case SOAP_TYPE__dateTime_DOTiso8601: case SOAP_TYPE__double: return y.__type; default: return x.__type; } default: return y.__type; } } value json_add(const value& x, const value& y) { switch (json_promote_type(x, y)) { case SOAP_TYPE__boolean: case SOAP_TYPE__i4: case SOAP_TYPE__int: return value(x.soap, (_int)x + (_int)y); case SOAP_TYPE__double: return value(x.soap, (_double)x + (_double)y); case SOAP_TYPE__string: case SOAP_TYPE__dateTime_DOTiso8601: { std::string s = (const char*)x; return value(x.soap, s.append((const char*)y)); } case SOAP_TYPE__struct: { _struct s = x; _struct t = y; _struct st; for (_struct::iterator i = s.begin(); i != s.end(); ++i) st[i.name()] = *i; for (_struct::iterator i = t.begin(); i != t.end(); ++i) st[i.name()] = *i; return value(x.soap, st); } case SOAP_TYPE__array: { _array a = x; _array b = y; int n = a.size(); int m = b.size(); _array ab; ab.size(n + m); for (int i = 0; i < n; ++i) ab[i] = a[i]; for (int i = 0; i < m; ++i) ab[n + i] = b[i]; return value(x.soap, ab); } default: return value(x.soap); } } value json_sub(const value& x, const value& y) { switch (json_promote_type(x, y)) { case SOAP_TYPE__boolean: case SOAP_TYPE__i4: case SOAP_TYPE__int: return value(x.soap, (_int)x - (_int)y); case SOAP_TYPE__double: return value(x.soap, (_double)x - (_double)y); default: return value(x.soap); } } value json_mul(const value& x, const value& y) { switch (json_promote_type(x, y)) { case SOAP_TYPE__boolean: case SOAP_TYPE__i4: case SOAP_TYPE__int: return value(x.soap, (_int)x * (_int)y); case SOAP_TYPE__double: return value(x.soap, (_double)x * (_double)y); default: return value(x.soap); } } value json_div(const value& x, const value& y) { switch (json_promote_type(x, y)) { case SOAP_TYPE__boolean: case SOAP_TYPE__i4: case SOAP_TYPE__int: return value(x.soap, (_int)x / (_int)y); case SOAP_TYPE__double: return value(x.soap, (_double)x / (_double)y); default: return value(x.soap); } } value json_mod(const value& x, const value& y) { switch (json_promote_type(x, y)) { case SOAP_TYPE__boolean: case SOAP_TYPE__i4: case SOAP_TYPE__int: case SOAP_TYPE__double: return value(x.soap, (_int)x % (_int)y); default: return value(x.soap); } } bool json_eqv(const value& x, const value& y) { if (x.__type != y.__type && (x.__type != SOAP_TYPE__i4 || y.__type != SOAP_TYPE__int) && (x.__type != SOAP_TYPE__int || y.__type != SOAP_TYPE__i4)) return false; switch (x.__type) { case SOAP_TYPE__boolean: case SOAP_TYPE__i4: case SOAP_TYPE__int: return value(x.soap, (_int)x == (_int)y); case SOAP_TYPE__double: return value(x.soap, (_double)x == (_double)y); case SOAP_TYPE__string: case SOAP_TYPE__dateTime_DOTiso8601: return value(x.soap, !strcmp((const char*)x, (const char*)y)); case SOAP_TYPE__struct: if (x.size() != y.size()) return false; else { const _struct& s = x; const _struct& t = y; _struct::iterator i = s.begin(); _struct::iterator j = t.begin(); for ( ; i != s.end(); ++i, ++j) if (strcmp(i.name(), j.name()) || *i != *j) return false; return true; } case SOAP_TYPE__array: if (x.size() != y.size()) return false; else { const _array& a = x; const _array& b = y; _array::iterator i = a.begin(); _array::iterator j = b.begin(); for ( ; i != a.end(); ++i, ++j) if (*i != *j) return false; return true; } default: return false; } } bool json_leq(const value& x, const value& y) { if (x.__type != y.__type && (x.__type != SOAP_TYPE__i4 || y.__type != SOAP_TYPE__int) && (x.__type != SOAP_TYPE__int || y.__type != SOAP_TYPE__i4)) return false; switch (x.__type) { case SOAP_TYPE__boolean: case SOAP_TYPE__i4: case SOAP_TYPE__int: return (_int)x <= (_int)y; case SOAP_TYPE__double: return (_double)x <= (_double)y; case SOAP_TYPE__string: case SOAP_TYPE__dateTime_DOTiso8601: return strcmp((const char*)x, (const char*)y) <= 0; default: return false; } } bool json_lne(const value& x, const value& y) { if (x.__type != y.__type && (x.__type != SOAP_TYPE__i4 || y.__type != SOAP_TYPE__int) && (x.__type != SOAP_TYPE__int || y.__type != SOAP_TYPE__i4)) return false; switch (x.__type) { case SOAP_TYPE__boolean: case SOAP_TYPE__i4: case SOAP_TYPE__int: return (_int)x < (_int)y; case SOAP_TYPE__double: return (_double)x < (_double)y; case SOAP_TYPE__string: case SOAP_TYPE__dateTime_DOTiso8601: return strcmp((const char*)x, (const char*)y) < 0; default: return false; } } #endif #ifdef JSON_NAMESPACE } // namespace json #endif gsoap-2.8.28/gsoap/samples/xml-rpc-json/xml-rpc-currentTime.cpp0000644000175000017500000000475712653650156024005 0ustar ellertellert/* xml-rpc-currentTime.cpp XML-RPC currenTime (C++ version) Prints current time. Compile: soapcpp2 xml-rpc.h c++ xml-rpc-currentTime.cpp xml-rpc.cpp xml-rpc-io.cpp stdsoap2.cpp soapC.cpp -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "json.h" using namespace std; int main() { soap *ctx = soap_new1(SOAP_IO_KEEPALIVE | SOAP_XML_INDENT | SOAP_C_UTFSTRING); ctx->send_timeout = 10; // 10 sec, stop if server is not accepting msg ctx->recv_timeout = 10; // 10 sec, stop if server does not respond in time // set up the method call methodCall m(ctx, "http://www.cs.fsu.edu/~engelen/currentTime.cgi", "currentTime.getCurrentTime"); // make the call and get response params params r = m(); // error? if (m.error()) soap_print_fault(ctx, stderr); // empty response means fault in JSON format else if (r.empty()) cout << m.fault() << endl; // print time in JSON format (just a string as per json.h) else cout << "Time = " << r[0] << endl; // clean up soap_destroy(ctx); soap_end(ctx); soap_free(ctx); return 0; } /* Don't need a namespace table. We put an empty one here to avoid link errors */ struct Namespace namespaces[] = { {NULL, NULL} }; gsoap-2.8.28/gsoap/samples/xml-rpc-json/xml-rpc-iters.h0000644000175000017500000004440112653650156022265 0ustar ellertellert/* xml-rpc-iters.h XML-RPC/JSON C++ API iterators -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #ifndef XML_RPC_ITERS_H #define XML_RPC_ITERS_H #ifdef __cplusplus #ifdef JSON_NAMESPACE # define SOAP_TYPE__boolean SOAP_TYPE_json__boolean # define SOAP_TYPE__i4 SOAP_TYPE_json__i4 # define SOAP_TYPE__int SOAP_TYPE_json__int # define SOAP_TYPE__double SOAP_TYPE_json__double # define SOAP_TYPE__dateTime_DOTiso8601 SOAP_TYPE_json__dateTime_DOTiso8601 # define SOAP_TYPE__string SOAP_TYPE_json__string # define SOAP_TYPE__array SOAP_TYPE_json__array # define SOAP_TYPE__struct SOAP_TYPE_json__struct # define SOAP_TYPE__base64 SOAP_TYPE_json__base64 #endif #ifdef JSON_NAMESPACE namespace json { #endif class value_const_iterator; class value_iterator; class _struct_const_iterator; class _struct_iterator; class _array_const_iterator; class _array_iterator; class params_const_iterator; class params_iterator; #ifdef JSON_NAMESPACE } #endif #ifdef JSON_NAMESPACE #include "jsonStub.h" // "cyclic" inclusion to obtain jsonStub.h type declarations for definitions below #else #include "soapStub.h" // "cyclic" inclusion to obtain soapStub.h type declarations for definitions below #endif #ifdef JSON_NAMESPACE namespace json { #endif /// iterates over value (struct or array or atomic value) class value_const_iterator { friend class value_iterator; private: struct value* _value; struct member* _member; int _index; public: value_const_iterator() : _value(NULL), _member(NULL), _index(0) { } value_const_iterator(struct value* v) : _value(v), _member(NULL), _index(0) { } value_const_iterator(struct value* v, struct member* m) : _value(v), _member(m), _index(0) { } value_const_iterator(struct value* v, int i) : _value(v), _member(NULL), _index(i) { } bool operator==(const value_iterator& that) const; bool operator==(const value_const_iterator& that) const { if (_value == NULL) return that._value == NULL; if (that._value == NULL) return _value == NULL; if (_value->__type != that._value->__type) return false; if (_value->__type == SOAP_TYPE__struct) return _member == that._member; if (_value->__type == SOAP_TYPE__array) return (((_array*)_value->ref)->data.value + _index) == (((_array*)that._value->ref)->data.value + that._index); return _value == that._value; } bool operator!=(const value_iterator& that) const { return !operator==(that); } bool operator!=(const value_const_iterator& that) const { return !operator==(that); } const struct value& operator*() const { return *operator->(); } const struct value *operator->() const { if (_value->__type == SOAP_TYPE__struct) return &_member->value; if (_value->__type == SOAP_TYPE__array) return ((_array*)_value->ref)->data.value + _index; return _value; } int index() const { if (_value->__type == SOAP_TYPE__struct) return _member - ((_struct*)_value->ref)->member; if (_value->__type == SOAP_TYPE__array) return _index; return 0; } const char *name() const { if (_value->__type == SOAP_TYPE__struct) return _member->name; return ""; } value_const_iterator& operator++() { if (_value->__type == SOAP_TYPE__struct) _member++; else if (_value->__type == SOAP_TYPE__array) _index++; else _value = NULL; return *this; } value_const_iterator operator++(int) { value_const_iterator i = *this; if (_value->__type == SOAP_TYPE__struct) _member++; else if (_value->__type == SOAP_TYPE__array) _index++; else _value = NULL; return i; } value_const_iterator& operator+=(int k) { if (_value->__type == SOAP_TYPE__struct) _member += k; else if (_value->__type == SOAP_TYPE__array) _index += k; else if (k) _value = NULL; return *this; } value_const_iterator& operator-=(int k) { if (_value->__type == SOAP_TYPE__struct) _member -= k; else if (_value->__type == SOAP_TYPE__array) _index -= k; else if (k) _value = NULL; return *this; } }; /// iterates over value (struct or array or atomic value) class value_iterator { friend class value_const_iterator; private: struct value* _value; struct member* _member; int _index; public: value_iterator() : _value(NULL), _member(NULL), _index(0) { } value_iterator(struct value* v) : _value(v), _member(NULL), _index(0) { } value_iterator(struct value* v, struct member* m) : _value(v), _member(m), _index(0) { } value_iterator(struct value* v, int i) : _value(v), _member(NULL), _index(i) { } operator value_const_iterator() const { value_const_iterator i; i._value = _value; i._member = _member; i._index = _index; return i; } bool operator==(const value_iterator& that) const { if (_value == NULL) return that._value == NULL; if (that._value == NULL) return _value == NULL; if (_value->__type != that._value->__type) return false; if (_value->__type == SOAP_TYPE__struct) return _member == that._member; if (_value->__type == SOAP_TYPE__array) return (((_array*)_value->ref)->data.value + _index) == (((_array*)that._value->ref)->data.value + that._index); return _value == that._value; } bool operator==(const value_const_iterator& that) const { if (_value == NULL) return that._value == NULL; if (that._value == NULL) return _value == NULL; if (_value->__type != that._value->__type) return false; if (_value->__type == SOAP_TYPE__struct) return _member == that._member; if (_value->__type == SOAP_TYPE__array) return (((_array*)_value->ref)->data.value + _index) == (((_array*)that._value->ref)->data.value + that._index); return _value == that._value; } bool operator!=(const value_iterator& that) const { return !operator==(that); } bool operator!=(const value_const_iterator& that) const { return !operator==(that); } struct value& operator*() { return *operator->(); } struct value *operator->() { if (_value->__type == SOAP_TYPE__struct) return &_member->value; if (_value->__type == SOAP_TYPE__array) return ((_array*)_value->ref)->data.value + _index; return _value; } int index() const { if (_value->__type == SOAP_TYPE__struct) return _member - ((_struct*)_value->ref)->member; if (_value->__type == SOAP_TYPE__array) return _index; return 0; } const char *name() const { if (_value->__type == SOAP_TYPE__struct) return _member->name; return ""; } value_iterator& operator++() { if (_value->__type == SOAP_TYPE__struct) _member++; else if (_value->__type == SOAP_TYPE__array) _index++; else _value = NULL; return *this; } value_iterator operator++(int) { value_iterator i = *this; if (_value->__type == SOAP_TYPE__struct) _member++; else if (_value->__type == SOAP_TYPE__array) _index++; else _value = NULL; return i; } value_iterator& operator+=(int k) { if (_value->__type == SOAP_TYPE__struct) _member += k; else if (_value->__type == SOAP_TYPE__array) _index += k; else if (k) _value = NULL; return *this; } value_iterator& operator-=(int k) { if (_value->__type == SOAP_TYPE__struct) _member -= k; else if (_value->__type == SOAP_TYPE__array) _index -= k; else if (k) _value = NULL; return *this; } }; /// iterates over _struct class _struct_const_iterator { friend class _struct_iterator; private: const struct member* _member; public: _struct_const_iterator() : _member(NULL) { } _struct_const_iterator(const struct _struct* s) : _member(s->member) { } bool operator==(const _struct_iterator& that) const; bool operator==(const _struct_const_iterator& that) const { return _member == that._member; } bool operator!=(const _struct_iterator& that) const { return !operator==(that); } bool operator!=(const _struct_const_iterator& that) const { return !operator==(that); } const char* index() const { return _member->name; } ///< get member name const struct value& operator*() const { return _member->value; } ///< get member value const struct value* operator->() const { return &_member->value; } ///< get member value _struct_const_iterator& operator++() { _member++; return *this; } _struct_const_iterator operator++(int) { _struct_const_iterator i = *this; _member++; return i; } _struct_const_iterator& operator+=(int k) { _member += k; return *this; } _struct_const_iterator& operator-=(int k) { _member -= k; return *this; } }; /// iterates over _struct class _struct_iterator { friend class _struct_const_iterator; private: struct member* _member; public: _struct_iterator() : _member(NULL) { } _struct_iterator(const struct _struct* s) : _member(s->member) { } bool operator==(const _struct_iterator& that) const { return _member == that._member; } bool operator==(const _struct_const_iterator& that) const { return _member == that._member; } bool operator!=(const _struct_iterator& that) const { return !operator==(that); } bool operator!=(const _struct_const_iterator& that) const { return !operator==(that); } const char* name() const { return _member->name; } ///< get member name const char* index() const { return name(); } ///< get member name (deprecated) struct value& operator*() const { return _member->value; } ///< get member value struct value* operator->() const { return &_member->value; } ///< get member value _struct_iterator& operator++() { _member++; return *this; } _struct_iterator operator++(int) { _struct_iterator i = *this; _member++; return i; } _struct_iterator& operator+=(int k) { _member += k; return *this; } _struct_iterator& operator-=(int k) { _member -= k; return *this; } }; /// iterates over _array class _array_const_iterator { friend class _array_iterator; private: const struct value* _start; const struct value* _value; public: _array_const_iterator() : _start(NULL), _value(NULL) { } _array_const_iterator(const struct _array* a) : _start(a->data.value), _value(a->data.value) { } bool operator==(const _array_iterator& that) const; bool operator==(const _array_const_iterator& that) const { return _value == that._value; } bool operator!=(const _array_iterator& that) const { return !operator==(that); } bool operator!=(const _array_const_iterator& that) const { return !operator==(that); } int index() const { return _value - _start; } ///< get array index const struct value& operator*() const { return *_value; } ///< get array value const struct value* operator->() const { return _value; } ///< get array value _array_const_iterator& operator++() { _value++; return *this; } _array_const_iterator operator++(int) { _array_const_iterator i = *this; _value++; return i; } _array_const_iterator& operator+=(int k) { _value += k; return *this; } _array_const_iterator& operator-=(int k) { _value -= k; return *this; } }; /// iterates over _array class _array_iterator { friend class _array_const_iterator; private: struct value* _start; struct value* _value; public: _array_iterator() : _start(NULL), _value(NULL) { } _array_iterator(const struct _array* a) : _start(a->data.value), _value(a->data.value) { } bool operator==(const _array_iterator& that) const { return _value == that._value; } bool operator==(const _array_const_iterator& that) const { return _value == that._value; } bool operator!=(const _array_iterator& that) const { return !operator==(that); } bool operator!=(const _array_const_iterator& that) const { return !operator==(that); } int index() const { return _value - _start; } ///< get array index struct value& operator*() const { return *_value; } ///< get array value struct value* operator->() const { return _value; } ///< get array value _array_iterator& operator++() { _value++; return *this; } _array_iterator operator++(int) { _array_iterator i = *this; _value++; return i; } _array_iterator& operator+=(int k) { _value += k; return *this; } _array_iterator& operator-=(int k) { _value -= k; return *this; } }; /// iterates over params class params_const_iterator { friend class params_iterator; private: const struct param* _start; const struct param* _param; public: params_const_iterator() : _start(NULL), _param(NULL) { } params_const_iterator(const struct params* p) : _start(p->param), _param(p->param) { } bool operator==(const params_iterator& that) const; bool operator==(const params_const_iterator& that) const { return _param == that._param; } bool operator!=(const params_iterator& that) const { return !operator==(that); } bool operator!=(const params_const_iterator& that) const { return !operator==(that); } int index() const { return _param - _start; } ///< get parameter index const struct value& operator*() const { return _param->value; } ///< get parameter value const struct value* operator->() const { return &_param->value; } ///< get parameter value params_const_iterator& operator++() { _param++; return *this; } params_const_iterator operator++(int) { params_const_iterator i = *this; _param++; return i; } params_const_iterator& operator+=(int k) { _param += k; return *this; } params_const_iterator& operator-=(int k) { _param -= k; return *this; } }; /// iterates over params class params_iterator { friend class params_const_iterator; private: struct param* _start; struct param* _param; public: params_iterator() : _start(NULL), _param(NULL) { } params_iterator(const struct params* p) : _start(p->param), _param(p->param) { } bool operator==(const params_iterator& that) const { return _param == that._param; } bool operator==(const params_const_iterator& that) const { return _param == that._param; } bool operator!=(const params_iterator& that) const { return !operator==(that); } bool operator!=(const params_const_iterator& that) const { return !operator==(that); } int index() const { return _param - _start; } ///< get parameter index struct value& operator*() const { return _param->value; } ///< get parameter value struct value* operator->() const { return &_param->value; } ///< get parameter value params_iterator& operator++() { _param++; return *this; } params_iterator operator++(int) { params_iterator i = *this; _param++; return i; } params_iterator& operator+=(int k) { _param += k; return *this; } params_iterator& operator-=(int k) { _param -= k; return *this; } }; #ifdef JSON_NAMESPACE } // namespace json #endif #endif #endif gsoap-2.8.28/gsoap/samples/xml-rpc-json/json.h0000644000175000017500000001522712653650156020534 0ustar ellertellert/* json.h JSON C/C++ supporting functions -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #ifdef JSON_NAMESPACE # include "jsonH.h" #else # include "soapH.h" #endif #ifdef JSON_NAMESPACE namespace json { #endif /** If soap context has an error, set/add error message to 'v' and return error code */ extern int json_error(struct soap *soap, struct value *v); /** Write a value in JSON format to a file, socket, or stream */ extern int json_write(struct soap *soap, const struct value *v); /** Send a value in JSON format to a file, socket, or stream (lower level function, must use soap_begin_send/soap_end_send also) */ extern int json_send(struct soap *soap, const struct value *v); #ifdef __cplusplus extern int json_write(struct soap *soap, const value& v); extern int json_send(struct soap *soap, const value& v); extern std::ostream& operator<<(std::ostream&, const value&); #endif /** Read a value in JSON format from a file, socket, or stream */ extern int json_read(struct soap *soap, struct value *v); /** Receive a value in JSON format from a file, socket, or stream (lower level function, must use soap_begin_recv/soap_end_recv also) */ extern int json_recv(struct soap *soap, struct value *v); #ifdef __cplusplus extern int json_read(struct soap *soap, value& v); extern int json_recv(struct soap *soap, value& v); extern std::istream& operator>>(std::istream&, value&); #endif /** Client-side JSON REST call to endpoint URL with optional in and out values (POST with in/out, GET with out, PUT with in, DELETE without in/out), returns SOAP_OK or HTTP code */ extern int json_call(struct soap *soap, const char *endpoint, const struct value *in, struct value *out); #ifdef __cplusplus extern int json_call(struct soap *soap, const char *endpoint, const struct value& in, struct value& out); #endif extern int json_send_string(struct soap *soap, const char *s); #ifdef __cplusplus extern value json_add(const value&, const value&); template inline value operator+(const value& x, const T& y); template inline value operator+(const value& x, const T& y) { return json_add(x, value(x.soap, y)); } template<> inline value operator+(const value& x, const value& y) { return json_add(x, y); } extern value json_sub(const value&, const value&); template inline value operator-(const value& x, const T& y); template inline value operator-(const value& x, const T& y) { return json_sub(x, value(x.soap, y)); } template<> inline value operator-(const value& x, const value& y) { return json_sub(x, y); } extern value json_mul(const value&, const value&); template inline value operator*(const value& x, const T& y); template inline value operator*(const value& x, const T& y) { return json_mul(x, value(x.soap, y)); } template<> inline value operator*(const value& x, const value& y) { return json_mul(x, y); } extern value json_div(const value&, const value&); template inline value operator/(const value& x, const T& y); template inline value operator/(const value& x, const T& y) { return json_div(x, value(x.soap, y)); } template<> inline value operator/(const value& x, const value& y) { return json_div(x, y); } extern value json_mod(const value&, const value&); template inline value operator%(const value& x, const T& y); template inline value operator%(const value& x, const T& y) { return json_mod(x, value(x.soap, y)); } template<> inline value operator%(const value& x, const value& y) { return json_mod(x, y); } extern bool json_eqv(const value&, const value&); template inline bool operator==(const value& x, const T& y); template inline bool operator==(const value& x, const T& y) { return json_eqv(x, value(x.soap, y)); } template<> inline bool operator==(const value& x, const value& y) { return json_eqv(x, y); } template inline bool operator!=(const value& x, const T& y); template inline bool operator!=(const value& x, const T& y) { return !json_eqv(x, value(x.soap, y)); } template<> inline bool operator!=(const value& x, const value& y) { return !json_eqv(x, y); } extern bool json_leq(const value&, const value&); template inline bool operator<=(const value& x, const T& y); template inline bool operator<=(const value& x, const T& y) { return json_leq(x, value(x.soap, y)); } template<> inline bool operator<=(const value& x, const value& y) { return json_leq(x, y); } template inline bool operator>=(const value& x, const T& y); template inline bool operator>=(const value& x, const T& y) { return json_leq(value(x.soap, y), x); } template<> inline bool operator>=(const value& x, const value& y) { return json_leq(y, x); } extern bool json_lne(const value&, const value&); template inline bool operator<(const value& x, const T& y); template inline bool operator<(const value& x, const T& y) { return json_lne(x, value(x.soap, y)); } template<> inline bool operator<(const value& x, const value& y) { return json_lne(x, y); } template inline bool operator>(const value& x, const T& y); template inline bool operator>(const value& x, const T& y) { return json_lne(value(x.soap, y), x); } template<> inline bool operator>(const value& x, const value& y) { return json_lne(y, x); } #endif #ifdef JSON_NAMESPACE } // namespace json #endif gsoap-2.8.28/gsoap/samples/xml-rpc-json/xml-rpc.c0000644000175000017500000003311612653650160021130 0ustar ellertellert/* xml-rpc.c C API for XML-RPC/JSON data management Note: XML-RPC declarations are located in the gSOAP header file xml-rpc.h, which is used to generate XML-RPC serializers (soapH.h, soapStub.h, and soapC.c) with: $ soapcpp2 -c -CSL xml-rpc.h To generate the soap_dup_value deep copy function use -Ec: $ soapcpp2 -c -Ec -CSL xml-rpc.h For more information please visit: http://www.genivia.com/doc/xml-rpc-json/html/ -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" static int size2k(int n); struct value *new_value(struct soap *soap) { return init_value(soap, (struct value*)soap_malloc(soap, sizeof(struct value))); } struct value *init_value(struct soap *soap, struct value *v) { soap_default_value(soap, v); return v; } _boolean *bool_of(struct value *v) { if (v->__type != SOAP_TYPE__boolean) if ((v->ref = (void*)soap_malloc(v->soap, sizeof(_boolean)))) *(_boolean*)v->ref = 0; v->__type = SOAP_TYPE__boolean; v->__any = NULL; return (_boolean*)v->ref; } _int *int_of(struct value *v) { _int r = 0; if (v->__type == SOAP_TYPE__boolean) r = (_int)*(_boolean*)v->ref; else if (v->__type == SOAP_TYPE__i4) r = (_int)*(_i4*)v->ref; else if (v->__type == SOAP_TYPE__double) r = (_int)(*(_double*)v->ref); else if (v->__type == SOAP_TYPE__string) { soap_s2LONG64(v->soap, (const char*)v->ref, &r); v->soap->error = SOAP_OK; } if (v->__type != SOAP_TYPE__int) if ((v->ref = (void*)soap_malloc(v->soap, sizeof(_int)))) *(_int*)v->ref = r; v->__type = SOAP_TYPE__int; v->__any = NULL; return (_int*)v->ref; } _double *double_of(struct value *v) { _double r = 0; if (v->__type == SOAP_TYPE__boolean) r = (_double)*(_boolean*)v->ref; else if (v->__type == SOAP_TYPE__i4) r = (_double)*(_i4*)v->ref; else if (v->__type == SOAP_TYPE__int) r = (_double)(*(_int*)v->ref); else if (v->__type == SOAP_TYPE__string) { soap_s2double(v->soap, (const char*)v->ref, &r); v->soap->error = SOAP_OK; } if (v->__type != SOAP_TYPE__double) if ((v->ref = (void*)soap_malloc(v->soap, sizeof(_double)))) *(_double*)v->ref = r; v->__type = SOAP_TYPE__double; v->__any = NULL; return (_double*)v->ref; } const char **string_of(struct value *v) { if (v->__type == SOAP_TYPE__string || v->__type == SOAP_TYPE__dateTime_DOTiso8601) return (const char**)&v->ref; if (v->__type == SOAP_TYPE__boolean) v->ref = (void*)(*(_boolean*)v->ref ? "true" : "false"); else if (v->__type == SOAP_TYPE__i4) v->ref = (void*)soap_strdup(v->soap, soap_int2s(v->soap, (int)*(_i4*)v->ref)); else if (v->__type == SOAP_TYPE__int) v->ref = (void*)soap_strdup(v->soap, soap_LONG642s(v->soap, (LONG64)*(_int*)v->ref)); else if (v->__type == SOAP_TYPE__double) v->ref = (void*)soap_strdup(v->soap, soap_double2s(v->soap, (double)*(_double*)v->ref)); else if (v->__type == SOAP_TYPE__base64) v->ref = (void*)soap_s2base64(v->soap, (unsigned char*)((struct _base64*)v->ref)->__ptr, NULL, ((struct _base64*)v->ref)->__size); else if (v->__any) v->ref = (void*)v->__any; else v->ref = (void*)"null"; v->__type = SOAP_TYPE__string; v->__any = NULL; return (const char**)&v->ref; } const char **dateTime_of(struct value *v) { if (v->__type != SOAP_TYPE__dateTime_DOTiso8601) v->ref = (void*)""; v->__type = SOAP_TYPE__dateTime_DOTiso8601; v->__any = NULL; return (const char**)&v->ref; } struct _base64 *base64_of(struct value *v) { if (v->__type != SOAP_TYPE__base64) if ((v->ref = (void*)soap_malloc(v->soap, sizeof(struct _base64)))) soap_default__base64(v->soap, (struct _base64*)v->ref); v->__type = SOAP_TYPE__base64; v->__any = NULL; return (struct _base64*)v->ref; } struct value *value_at(struct value *v, const char *s) { int i = 0; struct _struct *_struct = (struct _struct*)v->ref; if (s == NULL) s = ""; if (v->__type != SOAP_TYPE__struct || !_struct) { v->ref = _struct = (struct _struct*)soap_malloc(v->soap, sizeof(struct _struct)); if (!_struct) return NULL; soap_default__struct(v->soap, _struct); } v->__type = SOAP_TYPE__struct; v->__any = NULL; if (!_struct->member) { int newsize = size2k(_struct->__size = 1); _struct->member = (struct member*)soap_malloc(v->soap, sizeof(struct member) * newsize); if (!_struct->member) return NULL; for (i = 0; i < newsize; i++) soap_default_member(v->soap, &_struct->member[i]); } else { int oldsize, newsize; for (i = 0; i < _struct->__size; i++) if (!strcmp(_struct->member[i].name, s)) return &_struct->member[i].value; oldsize = size2k(_struct->__size); newsize = size2k(++_struct->__size); if (oldsize < newsize) { struct member *newmember = (struct member*)soap_malloc(v->soap, sizeof(struct member) * newsize); if (!newmember) return NULL; soap_memcpy((void*)newmember, sizeof(struct member) * newsize, (const void*)_struct->member, sizeof(struct member) * oldsize); for (i = oldsize; i < newsize; i++) soap_default_member(v->soap, &newmember[i]); soap_unlink(v->soap, _struct->member); free((void*)_struct->member); _struct->member = newmember; } } i = _struct->__size - 1; _struct->member[i].name = soap_strdup(_struct->soap, s); soap_default_value(v->soap, &_struct->member[i].value); return &_struct->member[i].value; } struct value *value_atw(struct value *v, const wchar_t *s) { const char *t = soap_wchar2s(NULL, s); struct value *u = value_at(v, t); free((void*)t); return u; } struct member *nth_member(struct value *v, int n) { struct _struct *_struct = (struct _struct*)v->ref; if (n < 0 && _struct) { n += _struct->__size; if (n < 0) n = 0; } if (v->__type != SOAP_TYPE__struct || !_struct || _struct->__size <= n || n < 0) return NULL; return &_struct->member[n]; } struct value *nth_value(struct value *v, int n) { if (v->__type == SOAP_TYPE__struct) { struct member *member = nth_member(v, n); if (!member) return new_value(v->soap); return &member->value; } else { int i = 0; struct data *data; if (v->__type != SOAP_TYPE__array || v->ref == NULL) { struct _array *_array = (struct _array*)soap_malloc(v->soap, sizeof(struct _array)); v->ref = _array; if (!_array) return NULL; soap_default__array(v->soap, _array); } data = &((struct _array*)v->ref)->data; v->__type = SOAP_TYPE__array; v->__any = NULL; if (n < 0) { n += data->__size; if (n < 0) n = 0; } if (!data->value) { int newsize = size2k(data->__size = n + 1); data->value = (struct value*)soap_malloc(v->soap, sizeof(struct value) * newsize); for (i = 0; i < newsize; i++) soap_default_value(v->soap, &data->value[i]); } else if (data->__size <= n) { int oldsize = size2k(data->__size); int newsize = size2k(data->__size = n + 1); if (oldsize < newsize) { struct value *newvalue = (struct value*)soap_malloc(v->soap, sizeof(struct value) * newsize); if (!newvalue) return NULL; soap_memcpy((void*)newvalue, sizeof(struct value) * newsize, (const void*)data->value, sizeof(struct value) * oldsize); for (i = oldsize; i < newsize; i++) soap_default_value(v->soap, &newvalue[i]); soap_unlink(v->soap, data->value); free((void*)data->value); data->value = newvalue; } } return &data->value[n]; } } void set_struct(struct value *v) { if (v->__type != SOAP_TYPE__struct || !v->ref) v->ref = (struct _struct*)soap_malloc(v->soap, sizeof(struct _struct)); v->__type = SOAP_TYPE__struct; v->__any = NULL; soap_default__struct(v->soap, (struct _struct*)v->ref); } void set_size(struct value *v, int n) { if (v->__type == SOAP_TYPE__array && v->ref) { struct data *data = &((struct _array*)v->ref)->data; if (n < 0) n += data->__size; if (n >= 0) { if (data->__size >= n) data->__size = n; else (void)nth_value(v, n - 1); } } else { v->ref = (void*)soap_malloc(v->soap, sizeof(struct _array)); if (!v->ref) return; v->__type = SOAP_TYPE__array; v->__any = NULL; soap_default__array(v->soap, (struct _array*)v->ref); if (n > 0) (void)nth_value(v, n - 1); } } int has_size(struct value *v) { if (v->__type == SOAP_TYPE__array && v->ref) return ((struct _array*)v->ref)->data.__size; if (v->__type == SOAP_TYPE__struct && v->ref) return ((struct _struct*)v->ref)->__size; return 0; } int nth_at(struct value *v, const char *s) { if (s == NULL) return -1; if (v->__type == SOAP_TYPE__struct) { struct _struct *_struct = (struct _struct*)v->ref; int i; if (s == NULL) s = ""; if (_struct) for (i = 0; i < _struct->__size; i++) if (!strcmp(_struct->member[i].name, s)) return i; } return -1; } int nth_atw(struct value *v, const wchar_t *s) { if (s == NULL) return -1; const char *t = soap_wchar2s(NULL, s); int i = nth_at(v, t); free((void*)t); return i; } int nth_nth(struct value *v, int n) { if (v->__type == SOAP_TYPE__array && v->ref) { int size = ((struct _array*)v->ref)->data.__size; return n < 0 ? n + size : n < size ? n : -1; } return -1; } _boolean is_null(struct value *v) { return v->__type == 0 && !(v->__any && *v->__any); } _boolean is_int(struct value *v) { return v->__type == SOAP_TYPE__i4 || v->__type == SOAP_TYPE__int; } _boolean is_double(struct value *v) { return v->__type == SOAP_TYPE__double; } _boolean is_string(struct value *v) { return v->__type == SOAP_TYPE__string || (v->__any && *v->__any); } _boolean is_bool(struct value *v) { return v->__type == SOAP_TYPE__boolean; } _boolean is_true(struct value *v) { return v->__type == SOAP_TYPE__boolean && *(_boolean*)v->ref; } _boolean is_false(struct value *v) { return v->__type == SOAP_TYPE__boolean && !*(_boolean*)v->ref; } _boolean is_array(struct value *v) { return v->__type == SOAP_TYPE__array; } _boolean is_struct(struct value *v) { return v->__type == SOAP_TYPE__struct; } _boolean is_dateTime(struct value *v) { return v->__type == SOAP_TYPE__dateTime_DOTiso8601; } _boolean is_base64(struct value *v) { return v->__type == SOAP_TYPE__base64; } struct params *new_params(struct soap *soap) { struct params *p = soap_malloc(soap, sizeof(struct params)); soap_default_params(soap, p); return p; } struct value *nth_param(struct params *p, int n) { int i = 0; if (n < 0) { n += p->__size; if (n < 0) n = 0; } if (!p->param) { int newsize = size2k(p->__size = n + 1); p->param = (struct param*)soap_malloc(p->soap, sizeof(struct param) * newsize); for (i = 0; i < newsize; i++) soap_default_param(p->soap, &p->param[i]); } else if (p->__size <= n) { int oldsize = size2k(p->__size); int newsize = size2k(p->__size = n + 1); if (oldsize < newsize) { struct param *newparam = (struct param*)soap_malloc(p->soap, sizeof(struct param) * newsize); if (!newparam) return NULL; soap_memcpy((void*)newparam, sizeof(struct param) * newsize, (const void*)p->param, sizeof(struct param) * oldsize); for (i = oldsize; i < newsize; i++) soap_default_param(p->soap, &newparam[i]); soap_unlink(p->soap, p->param); free((void*)p->param); p->param = newparam; } } return &p->param[n].value; } int call_method(struct soap *soap, const char *endpoint, const char *methodName, struct params *p, struct methodResponse *r) { struct methodCall m; soap_default_methodCall(soap, &m); m.methodName = (char*)methodName; if (p) { m.params.__size = p->__size; m.params.param = p->param; } soap->namespaces = NULL; /* no namespaces */ soap->encodingStyle = NULL; /* no SOAP encodingStyle */ /* connect, send request and receive response */ if (soap_connect(soap, endpoint, NULL) || soap_write_methodCall(soap, &m) || soap_read_methodResponse(soap, r)) return soap_closesock(soap); /* closes socket and returns soap->error */ soap_closesock(soap); return SOAP_OK; } static int size2k(int n) { int k = 2; while (k < n) k *= 2; return k; } gsoap-2.8.28/gsoap/samples/xml-rpc-json/xml-rpc-weblogs.c0000644000175000017500000000544012653650156022574 0ustar ellertellert/* xml-rpc-weblogs.c XML-RPC weblogUpdates.ping example in C Updated for gSOAP 2.8.26 with new XML-RPC C API xml-rpc.c Compile: soapcpp2 -c -CSL xml-rpc.h cc xml-rpc-weblogs.c xml-rpc.c stdsoap2.c soapC.c -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" int main() { struct soap *soap = soap_new1(SOAP_C_UTFSTRING); struct params *p = new_params(soap); struct methodResponse r; /* Set up method call parameters */ *string_of(nth_param(p, 0)) = "Scripting News"; *string_of(nth_param(p, 1)) = "http://www.scripting.com/"; /* connect, send request, and receive response */ if (call_method(soap, "http://rpc.weblogs.com/RPC2", "weblogUpdates.ping", p, &r)) { soap_print_fault(soap, stderr); exit(soap->error); } if (r.fault) { /* print fault on stdout */ soap_write_fault(soap, r.fault); } else if (r.params && r.params->__size == 1) { /* print response parameter, check if first parameter is a struct */ struct value *v = nth_param(r.params, 0); if (v->__type == SOAP_TYPE__struct) { if (is_false(value_at(v, "flerror"))) printf("Weblog ping successful: %s\n", *string_of(value_at(v, "message"))); else printf("Weblog ping failed\n"); } else printf("XML-RPC response message format error: struct expected\n"); } soap_end(soap); soap_free(soap); return 0; } /* Don't need a namespace table. We put an empty one here to avoid link errors */ struct Namespace namespaces[] = { {NULL, NULL} }; gsoap-2.8.28/gsoap/samples/xml-rpc-json/xml-rpc-currentTime.c0000644000175000017500000000473712653650156023443 0ustar ellertellert/* xml-rpc-currentTime.c XML-RPC currenTime (C version) Updated for gSOAP 2.8.26 with new XML-RPC C API xml-rpc.c Prints current time. Compile: soapcpp2 -c -CSL xml-rpc.h cc xml-rpc-currentTime.c xml-rpc.c stdsoap2.c soapC.c -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" int main() { struct soap *soap = soap_new1(SOAP_C_UTFSTRING); struct methodResponse r; /* connect, send request w/o parameters (NULL) and receive response */ if (call_method(soap, "http://www.cs.fsu.edu/~engelen/currentTime.cgi", "currentTime.getCurrentTime", NULL, &r)) { soap_print_fault(soap, stderr); exit(soap->error); } if (r.fault) { soap_write_fault(soap, r.fault); /* print fault on stdout */ } else if (r.params && r.params->__size == 1) { /* print response parameter */ if (nth_param(r.params, 0)->__type == SOAP_TYPE__dateTime_DOTiso8601) printf("Time = %s\n", *dateTime_of(nth_param(r.params, 0))); else printf("Time not provided\n"); } soap_end(soap); soap_free(soap); return 0; } /* Don't need a namespace table. We put an empty one here to avoid link errors */ struct Namespace namespaces[] = { {NULL, NULL} }; gsoap-2.8.28/gsoap/samples/xml-rpc-json/json-GitHub.cpp0000644000175000017500000000531112653650156022240 0ustar ellertellert/* json-GitHub.cpp JSON GitHub API v3 (C++ version) https://developer.github.com/v3/ Compile: soapcpp2 -CSL xml-rpc.h c++ -DWITH_OPENSSL -DWITH_GZIP -o json-GitHub json-GitHub.cpp xml-rpc.cpp json.cpp stdsoap2.cpp soapC.cpp -lcrypto -lssl -lz Usage: ./json-GutHub hostname [username password] Example: ./json-GitHub https://api.github.com/orgs/Genivia/repos -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "json.h" void display(struct value *v); int main(int argc, char **argv) { if (argc < 2) { fprintf(stderr, "Usage: json-GitHub hostname [username password]\nFor example: json-GitHub https://api.github.com/orgs/Genivia/repos\n\n"); exit(1); } else { soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT); value response(ctx); if (argc > 3) { /* Basic authentication with username password */ if (strncmp(argv[1], "https", 5)) { fprintf(stderr, "Basic authentication over http is not secure: use https\n"); exit(1); } ctx->userid = argv[2]; ctx->passwd = argv[3]; } if (json_call(ctx, argv[1], NULL, &response)) soap_print_fault(ctx, stderr); else json_write(ctx, response); printf("\n\nOK\n"); soap_end(ctx); soap_free(ctx); } return 0; } /* Don't need a namespace table. We put an empty one here to avoid link errors */ struct Namespace namespaces[] = { {NULL, NULL} }; gsoap-2.8.28/gsoap/samples/xml-rpc-json/xml-rpc-weblogs.cpp0000644000175000017500000000527312653650160023133 0ustar ellertellert/* xml-rpc-weblogs.cpp XML-RPC weblogUpdates.ping example in C++ See http://xmlrpc.scripting.com/weblogsCom for more details. Requires xml-rpc.h and xml-rpc.cpp Compile: soapcpp2 xml-rpc.h cc xml-rpc-weblogs.cpp xml-rpc.cpp xml-rpc-io.cpp stdsoap2.cpp soapC.cpp -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" #include "xml-rpc-io.h" using namespace std; #define ENDPOINT "http://rpc.weblogs.com/RPC2" int main() { soap *ctx = soap_new1(SOAP_C_UTFSTRING); // define the weblogsUpdates.ping method methodCall ping(ctx, ENDPOINT, "weblogUpdates.ping"); // set the two parameters of the method ping[0] = "Scripting News"; ping[1] = "http://www.scripting.com/"; // make the call params output = ping(); // error? if (ping.error()) soap_print_fault(ctx, stderr); else if (output.empty()) cout << ping.fault() << endl; else { if (output[0].is_struct()) { if (output[0]["flerror"].is_false()) cout << "Success:" << endl; else cout << "Failure:" << endl; cout << output[0]["message"] << endl; } else cout << "Message format error:" << endl << output[0] << endl; } // delete all data soap_destroy(ctx); soap_end(ctx); // free context soap_free(ctx); return 0; } /* Don't need a namespace table. We put an empty one here to avoid link errors */ struct Namespace namespaces[] = { {NULL, NULL} }; gsoap-2.8.28/gsoap/samples/xml-rpc-json/xml-rpc-io.cpp0000644000175000017500000000441112653650156022076 0ustar ellertellert/* xml-rpc-io.cpp XML-RPC io stream operations on XML-RPC values -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #ifdef JSON_NAMESPACE # include "jsonH.h" #else # include "soapH.h" #endif #ifdef JSON_NAMESPACE using namespace json; #endif std::ostream& operator<<(std::ostream& o, const struct value& v) { if (v.soap) { std::ostream *os = v.soap->os; v.soap->os = &o; soap_write_value(v.soap, &v); v.soap->os = os; } else { soap *ctx = soap_new(); ctx->os = &o; soap_write_value(ctx, &v); soap_destroy(ctx); soap_end(ctx); soap_free(ctx); } return o; } std::istream& operator>>(std::istream& i, struct value& v) { if (!v.soap) v.soap = soap_new(); std::istream *is = v.soap->is; v.soap->is = &i; if (soap_read_value(v.soap, &v)) { soap_sprint_fault(v.soap, v.soap->msgbuf, sizeof(v.soap->msgbuf)); v["$error"] = v.soap->msgbuf; v["$code"] = v.soap->error; } v.soap->is = is; return i; } gsoap-2.8.28/gsoap/samples/xml-rpc-json/json-currentTimeServer.cpp0000644000175000017500000001045412653650156024552 0ustar ellertellert/* json-currentTimeServer.cpp JSON currenTime server (C++ version) CGI or stand-alone multi-threaded server Returns JSON message with current time to client. Compile: soapcpp2 xml-rpc.h c++ -o json-currentTimeServer json-currentTimeServer.cpp json.cpp stdsoap2.cpp soapC.cpp Install as CGI on Web server Or run as stand-alone server (e.g. on port 18000): ./json-currentTimeServer 18000 -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "json.h" #include #ifdef _POSIX_THREADS #include // use Pthreads #endif #define BACKLOG (100) // Max. request backlog #define MAX_THR (8) // Max. threads to serve requests using namespace std; int serve_request(soap*); int main(int argc, char **argv) { soap *ctx = soap_new1(SOAP_C_UTFSTRING); ctx->send_timeout = 10; // 10 sec ctx->recv_timeout = 10; // 10 sec if (argc < 2) return serve_request(ctx); int port = atoi(argv[1]); #ifdef _POSIX_THREADS pthread_t tid; #endif if (!soap_valid_socket(soap_bind(ctx, NULL, port, BACKLOG))) { soap_print_fault(ctx, stderr); exit(1); } for (;;) { if (!soap_valid_socket(soap_accept(ctx))) { soap_print_fault(ctx, stderr); } else { #ifdef _POSIX_THREADS pthread_create(&tid, NULL, (void*(*)(void*))serve_request, (void*)soap_copy(ctx)); #else serve_request(ctx); #endif } } soap_free(ctx); return 0; } int serve_request(soap* ctx) { #ifdef _POSIX_THREADS pthread_detach(pthread_self()); #endif value request(ctx); // HTTP keep-alive max number of iterations unsigned int k = ctx->max_keep_alive; do { if (ctx->max_keep_alive > 0 && !--k) ctx->keep_alive = 0; // receive HTTP header (optional) and JSON content if (soap_begin_recv(ctx) || json_recv(ctx, request) || soap_end_recv(ctx)) soap_send_fault(ctx); else { value response(ctx); if (request.is_string() && !strcmp(request, "getCurrentTime")) // method name matches: first parameter of response is time response = time(0); else { // otherwise, set fault response["fault"] = "Wrong method"; response["detail"] = request; } // http content type ctx->http_content = "application/json; charset=utf-8"; // http content length if (soap_begin_count(ctx) || ((ctx->mode & SOAP_IO_LENGTH) && json_send(ctx, response)) || soap_end_count(ctx) || soap_response(ctx, SOAP_FILE) || json_send(ctx, response) || soap_end_send(ctx)) soap_print_fault(ctx, stderr); } // close (keep-alive may keep socket open when client supports it) soap_closesock(ctx); } while (ctx->keep_alive); int err = ctx->error; // clean up soap_destroy(ctx); soap_end(ctx); #ifdef _POSIX_THREADS // free the ctx copy for this thread soap_free(ctx); #endif return err; } /* Don't need a namespace table. We put an empty one here to avoid link errors */ struct Namespace namespaces[] = { {NULL, NULL} }; gsoap-2.8.28/gsoap/samples/xml-rpc-json/json-currentTime.cpp0000644000175000017500000000467712653650156023375 0ustar ellertellert/* json-currentTime.cpp JSON currenTime (C++ version) Prints current time. Compile: soapcpp2 xml-rpc.h c++ json-currentTime.cpp xml-rpc.cpp json.cpp stdsoap2.cpp soapC.cpp -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2012, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "json.h" using namespace std; int main() { soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT); ctx->send_timeout = 10; // 10 sec, stop if server is not accepting msg ctx->recv_timeout = 10; // 10 sec, stop if server does not respond in time value request(ctx), response(ctx); // make the JSON REST POST request and get response request = "getCurrentTime"; if (json_call(ctx, "http://www.cs.fsu.edu/~engelen/currentTimeJSON.cgi", request, response)) soap_print_fault(ctx, stderr); else if (response.is_string()) // JSON does not support a dateTime value: this is a string cout << "Time = " << response << endl; else // error? cout << "Error: " << response << endl; // clean up soap_destroy(ctx); soap_end(ctx); soap_free(ctx); return 0; } /* Don't need a namespace table. We put an empty one here to avoid link errors */ struct Namespace namespaces[] = { {NULL, NULL} }; gsoap-2.8.28/gsoap/samples/xml-rpc-json/xml-rpc.cpp0000644000175000017500000006122112653650160021466 0ustar ellertellert/* xml-rpc.cpp C++ API for XML-RPC/JSON data management Note: XML-RPC declarations are located in the gSOAP header file xml-rpc.h, which is used to generate XML-RPC serializers (soapH.h, soapStub.h, and soapC.cpp) with: $ soapcpp2 -CSL xml-rpc.h To generate the soap_dup_value deep copy function use -Ec: $ soapcpp2 -Ec -CSL xml-rpc.h Iterators to walk the tree data are declared in xml-rpc-iters.h IO stream operations for XML-RPC data are declared in xml-rpc-io.h For more information please visit: http://www.genivia.com/doc/xml-rpc-json/html/ -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #ifdef JSON_NAMESPACE # include "jsonH.h" # define SOAP_TYPE__boolean SOAP_TYPE_json__boolean # define SOAP_TYPE__i4 SOAP_TYPE_json__i4 # define SOAP_TYPE__int SOAP_TYPE_json__int # define SOAP_TYPE__double SOAP_TYPE_json__double # define SOAP_TYPE__dateTime_DOTiso8601 SOAP_TYPE_json__dateTime_DOTiso8601 # define SOAP_TYPE__string SOAP_TYPE_json__string # define SOAP_TYPE__array SOAP_TYPE_json__array # define SOAP_TYPE__struct SOAP_TYPE_json__struct # define SOAP_TYPE__base64 SOAP_TYPE_json__base64 #else # include "soapH.h" #endif #ifdef JSON_NAMESPACE namespace json { #endif static char* s_copy_l(struct soap *soap, const char *s); static char* s_copy_l(struct soap *soap, const wchar_t *s); static int size2k(int n); value::value() { soap_default_value(NULL, this); } value::value(struct soap *soap) { soap_default_value(soap, this); } value::value(struct soap *soap, bool b) { soap_default_value(soap, this); *this = b; } value::value(struct soap *soap, _double d) { soap_default_value(soap, this); *this = d; } value::value(struct soap *soap, _i4 n) { soap_default_value(soap, this); *this = n; } value::value(struct soap *soap, _int n) { soap_default_value(soap, this); *this = n; } value::value(struct soap *soap, ULONG64 t) { soap_default_value(soap, this); *this = t; } value::value(struct soap *soap, const char *s) { soap_default_value(soap, this); *this = s; } value::value(struct soap *soap, const std::string& s) { soap_default_value(soap, this); *this = s; } value::value(struct soap *soap, const wchar_t *s) { soap_default_value(soap, this); *this = s; } value::value(struct soap *soap, const std::wstring& s) { soap_default_value(soap, this); *this = s; } value::value(struct soap *soap, const _array& a) { soap_default_value(soap, this); *this = a; } value::value(struct soap *soap, const _struct& r) { soap_default_value(soap, this); *this = r; } value::value(struct soap *soap, const _base64& b) { soap_default_value(soap, this); *this = b; } value::operator bool() const { return this->is_true(); } value::operator _i4() const { if (__type == SOAP_TYPE__boolean) return (_i4)*(_boolean*)ref; if (__type == SOAP_TYPE__i4) return (_i4)*(_i4*)ref; if (__type == SOAP_TYPE__int) return (_i4)*(_int*)ref; if (__type == SOAP_TYPE__double) return (_i4)(*(_double*)ref); int r = 0; const char *s = *this; soap_s2int(soap, s, &r); soap->error = SOAP_OK; return r; } value::operator _int() const { if (__type == SOAP_TYPE__boolean) return (_int)*(_boolean*)ref; if (__type == SOAP_TYPE__i4) return (_int)*(_i4*)ref; if (__type == SOAP_TYPE__int) return (_int)*(_int*)ref; if (__type == SOAP_TYPE__double) return (_int)(*(_double*)ref); LONG64 r = 0; const char *s = *this; soap_s2LONG64(soap, s, &r); soap->error = SOAP_OK; return r; } value::operator _double() const { if (__type == SOAP_TYPE__boolean) return (_double)*(_boolean*)ref; if (__type == SOAP_TYPE__i4) return (_double)*(_i4*)ref; if (__type == SOAP_TYPE__int) return (_double)*(_int*)ref; if (__type == SOAP_TYPE__double) return (_double)*(_double*)ref; double r = 0.0; const char *s = *this; soap_s2double(soap, s, &r); soap->error = SOAP_OK; return r; } value::operator char*() const { if (__type == SOAP_TYPE__string || __type == SOAP_TYPE__dateTime_DOTiso8601) return (char*)ref; if (__type == SOAP_TYPE__boolean) return (char*)(*(_boolean*)ref ? "true" : "false"); if (__type == SOAP_TYPE__i4) return (char*)soap_strdup(soap, soap_int2s(soap, (int)*(_i4*)ref)); if (__type == SOAP_TYPE__int) return (char*)soap_strdup(soap, soap_LONG642s(soap, (LONG64)*(_int*)ref)); if (__type == SOAP_TYPE__double) return (char*)soap_strdup(soap, soap_double2s(soap, (double)*(_double*)ref)); if (__type == SOAP_TYPE__base64) return (char*)soap_s2base64(soap, (unsigned char*)((_base64*)ref)->ptr(), NULL, ((_base64*)ref)->size()); if (__any) return (char*)__any; if (!__type) return (char*)"null"; return (char*)""; } value::operator std::string() const { const char *s = *this; return std::string(s); } value::operator wchar_t*() const { const char *s = *this; wchar_t *t = NULL; soap_s2wchar(soap, s, &t, 0, 0); soap->error = SOAP_OK; return t; } value::operator std::wstring() const { const char *s = *this; wchar_t *t = NULL; soap_s2wchar(soap, s, &t, 0, 0); soap->error = SOAP_OK; return std::wstring(t); } value::operator ULONG64() const { time_t t = 0; if (__type == SOAP_TYPE__string || __type == SOAP_TYPE__dateTime_DOTiso8601) { if (soap_s2dateTime(soap, (const char*)ref, &t)) { soap->error = SOAP_OK; return 0; } } return (ULONG64)t; } value::operator _array&() { if (__type == SOAP_TYPE__array) return *(_array*)ref; _array& a = *soap_new__array(soap); soap_default__array(soap, &a); a[0] = *this; return a; } value::operator const _array&() const { if (__type == SOAP_TYPE__array) return *(const _array*)ref; _array& a = *soap_new__array(soap); soap_default__array(soap, &a); a[0] = *this; return a; } value::operator _struct&() { if (__type == SOAP_TYPE__struct) return *(_struct*)ref; _struct *r = soap_new__struct(soap); soap_default__struct(soap, r); return *r; } value::operator const _struct&() const { if (__type == SOAP_TYPE__struct) return *(const _struct*)ref; _struct *r = soap_new__struct(soap); soap_default__struct(soap, r); return *r; } value::operator _base64&() { if (__type == SOAP_TYPE__base64) return *(_base64*)ref; _base64 *base64 = soap_new__base64(soap); soap_default__base64(soap, base64); char *s = *this; base64->__ptr = (unsigned char*)s; base64->__size = (int)strlen(s); return *base64; } value::operator const _base64&() const { if (__type == SOAP_TYPE__base64) return *(const _base64*)ref; _base64 *base64 = soap_new__base64(soap); soap_default__base64(soap, base64); const char *s = *this; base64->__ptr = (unsigned char*)s; base64->__size = (int)strlen(s); return *base64; } value& value::operator[](int n) { if (__type == SOAP_TYPE__struct) return ((_struct*)ref)->operator[](n); _array& a = *this; __type = SOAP_TYPE__array; __any = NULL; ref = &a; return a[n]; } value& value::operator[](const char *s) { _struct& r = *this; __type = SOAP_TYPE__struct; __any = NULL; ref = &r; return r[s]; } value& value::operator[](const std::string& s) { _struct& r = *this; __type = SOAP_TYPE__struct; __any = NULL; ref = &r; return r[s.c_str()]; } value& value::operator[](const wchar_t *s) { _struct& r = *this; __type = SOAP_TYPE__struct; __any = NULL; ref = &r; return r[s]; } value& value::operator[](const std::wstring& s) { _struct& r = *this; __type = SOAP_TYPE__struct; __any = NULL; ref = &r; return r[s.c_str()]; } bool value::operator=(bool b) { __type = SOAP_TYPE__boolean; __any = NULL; ref = soap_malloc(soap, sizeof(_boolean)); if (ref) *(_boolean*)ref = (_boolean)b; return b; } _i4 value::operator=(_i4 n) { __type = SOAP_TYPE__i4; __any = NULL; ref = soap_malloc(soap, sizeof(_i4)); if (ref) *(_i4*)ref = n; return n; } _int value::operator=(_int n) { __type = SOAP_TYPE__int; __any = NULL; ref = soap_malloc(soap, sizeof(_int)); if (ref) *(_int*)ref = n; return n; } _double value::operator=(_double d) { __type = SOAP_TYPE__double; __any = NULL; ref = soap_malloc(soap, sizeof(_double)); if (ref) *(_double*)ref = (_double)d; return d; } const char* value::operator=(const char* s) { __type = SOAP_TYPE__string; __any = NULL; ref = s_copy_l(soap, s); return s; } char* value::operator=(char* s) { __type = SOAP_TYPE__string; __any = NULL; ref = s_copy_l(soap, s); return s; } char* value::operator=(const std::string& s) { __type = SOAP_TYPE__string; __any = NULL; ref = s_copy_l(soap, s.c_str()); return (char*)ref; } const char* value::operator=(const wchar_t* s) { __type = SOAP_TYPE__string; __any = NULL; ref = s_copy_l(soap, s); return (char*)ref; } char* value::operator=(wchar_t* s) { __type = SOAP_TYPE__string; __any = NULL; ref = s_copy_l(soap, s); return (char*)ref; } char* value::operator=(const std::wstring& s) { __type = SOAP_TYPE__string; __any = NULL; ref = s_copy_l(soap, s.c_str()); return (char*)ref; } ULONG64 value::operator=(ULONG64 t) { __type = SOAP_TYPE__dateTime_DOTiso8601; __any = NULL; ref = soap_strdup(soap, soap_dateTime2s(soap, (time_t)t)); return t; } _array& value::operator=(const _array& a) { __type = SOAP_TYPE__array; __any = NULL; ref = soap_new__array(soap); if (ref) *(_array*)ref = a; return *(_array*)ref; } _struct& value::operator=(const _struct& r) { __type = SOAP_TYPE__struct; __any = NULL; ref = soap_new__struct(soap); if (ref) *(_struct*)ref = r; return *(_struct*)ref; } _base64& value::operator=(const _base64& b) { __type = SOAP_TYPE__base64; __any = NULL; ref = soap_new__base64(soap); if (ref) *(_base64*)ref = b; return *(_base64*)ref; } void value::size(int n) { if (__type == SOAP_TYPE__array) { ((_array*)ref)->size(n); } else { __type = SOAP_TYPE__array; __any = NULL; ref = soap_new__array(soap); ((_array*)ref)->size(n); } } int value::size() const { if (__type == SOAP_TYPE__array) return ((_array*)ref)->size(); if (__type == SOAP_TYPE__struct) return ((_struct*)ref)->size(); return 0; } bool value::empty() const { if (__type == SOAP_TYPE__array) return ((_array*)ref)->empty(); if (__type == SOAP_TYPE__struct) return ((_struct*)ref)->empty(); return true; } int value::nth(int n) const { if (__type == SOAP_TYPE__array) { if (n < 0) return n + size(); if (n < size()) return n; } return -1; } int value::nth(const char *s) const { if (s != NULL && __type == SOAP_TYPE__struct) { const _struct *r = (const _struct*)ref; for (int i = 0; i < r->__size; i++) if (!strcmp(r->member[i].name, s)) return i; } return -1; } int value::nth(const wchar_t *s) const { if (s == NULL) return -1; const char *t = soap_wchar2s(NULL, s); int i = nth(t); free((void*)t); return i; } bool value::has(int n) const { if (__type == SOAP_TYPE__array) return n < 0 ? n + size() >= 0 : n < size(); return false; } bool value::has(const char *s) const { if (s != NULL && __type == SOAP_TYPE__struct) { const _struct *r = (const _struct*)ref; for (int i = 0; i < r->__size; i++) if (!strcmp(r->member[i].name, s)) return true; } return false; } bool value::has(const wchar_t *s) const { if (s == NULL) return false; const char *t = soap_wchar2s(NULL, s); bool b = has(t); free((void*)t); return b; } bool value::is_null() const { return __type == 0 && !(__any && *__any); } bool value::is_bool() const { return __type == SOAP_TYPE__boolean; } bool value::is_true() const { return __type == SOAP_TYPE__boolean && (bool)*(_boolean*)ref == true; } bool value::is_false() const { return __type == SOAP_TYPE__boolean && (bool)*(_boolean*)ref == false; } bool value::is_int() const { return __type == SOAP_TYPE__i4 || __type == SOAP_TYPE__int; } bool value::is_double() const { return __type == SOAP_TYPE__double; } bool value::is_string() const { return __type == SOAP_TYPE__string || (__any && *__any); } bool value::is_dateTime() const { return __type == SOAP_TYPE__dateTime_DOTiso8601; } bool value::is_array() const { return __type == SOAP_TYPE__array; } bool value::is_struct() const { return __type == SOAP_TYPE__struct; } bool value::is_base64() const { return __type == SOAP_TYPE__base64; } value_iterator value::begin() { if (__type == SOAP_TYPE__struct) return value_iterator(this, ((_struct*)ref)->member); if (__type == SOAP_TYPE__array) return value_iterator(this); return value_iterator(); } value_iterator value::end() { if (__type == SOAP_TYPE__struct) return value_iterator(this, ((_struct*)ref)->member + ((_struct*)ref)->__size); if (__type == SOAP_TYPE__array) return value_iterator(this, ((_array*)ref)->data.__size); return value_iterator(); } bool value_const_iterator::operator==(const value_iterator& that) const { if (_value == NULL) return that._value == NULL; if (that._value == NULL) return _value == NULL; if (_value->__type != that._value->__type) return false; if (_value->__type == SOAP_TYPE__struct) return _member == that._member; if (_value->__type == SOAP_TYPE__array) return (((_array*)_value->ref)->data.value + _index) == (((_array*)that._value->ref)->data.value + that._index); return _value == that._value; } static char* s_copy_l(struct soap *soap, const char *s) { return soap_strdup(soap, s); } static char* s_copy_l(struct soap *soap, const wchar_t *s) { return (char*)soap_wchar2s(soap, s); } _struct::_struct() { soap_default__struct(NULL, this); } _struct::_struct(struct soap *soap) { soap_default__struct(soap, this); } _struct::_struct(struct soap *soap, int size) { soap_default__struct(soap, this); if (size > 0) { __size = size; member = soap_new_member(soap, __size); for (int i = 0; i < __size; i++) soap_default_member(soap, &member[i]); } } bool _struct::empty() const { return __size == 0; } int _struct::size() const { return __size; } value& _struct::operator[](int n) { if (member == NULL || __size == 0) return *new_value(soap); if (n < 0) { n += __size; if (n < 0) n = 0; } if (n >= __size) n = __size - 1; return member[n].value; } value& _struct::operator[](const char *s) { int i = 0; if (s == NULL) s = ""; if (member == NULL) { int newsize = size2k(__size = 1); member = soap_new_member(soap, newsize); for (i = 0; i < newsize; i++) soap_default_member(soap, &member[i]); } else { for (i = 0; i < __size; i++) if (!strcmp(member[i].name, s)) return member[i].value; int oldsize = size2k(__size); int newsize = size2k(++__size); if (oldsize < newsize) { struct member *newmember = soap_new_member(soap, newsize); for (i = 0; i < oldsize; i++) newmember[i] = member[i]; for (; i < newsize; i++) soap_default_member(soap, &newmember[i]); soap_unlink(soap, member); delete[] member; member = newmember; } } i = __size - 1; member[i].name = soap_strdup(soap, s); soap_default_value(soap, &member[i].value); return member[i].value; } value& _struct::operator[](const wchar_t *s) { const char *t = soap_wchar2s(NULL, s); value& r = operator[](t); free((void*)t); return r; } _struct_iterator _struct::begin() const { return _struct_iterator(this); } _struct_iterator _struct::end() const { _struct_iterator i(this); i += __size; return i; } bool _struct_const_iterator::operator==(const _struct_iterator& that) const { return _member == that._member; } _array::_array() { soap_default__array(NULL, this); } _array::_array(struct soap *soap) { soap_default__array(soap, this); } _array::_array(struct soap *soap, int size) { soap_default__array(soap, this); if (size > 0) { data.__size = size; data.value = soap_new_value(soap, data.__size); for (int i = 0; i < data.__size; i++) soap_default_value(soap, &data.value[i]); } } bool _array::empty() const { return data.__size == 0; } int _array::size() const { return data.__size; } void _array::size(int n) { if (n < 0) n += data.__size; if (n >= 0) { if (data.__size >= n) data.__size = n; else (void)(*this)[n - 1]; } } value& _array::operator[](int n) { if (n < 0) { n += data.__size; if (n < 0) n = 0; } if (data.value == NULL) { int newsize = size2k(data.__size = n + 1); data.value = soap_new_value(soap, newsize); for (int i = 0; i < newsize; i++) soap_default_value(soap, &data.value[i]); } else if (data.__size <= n) { int oldsize = size2k(data.__size); int newsize = size2k(data.__size = n + 1); if (oldsize < newsize) { value *newvalue = soap_new_value(soap, newsize); int i; for (i = 0; i < oldsize; i++) newvalue[i] = data.value[i]; for (; i < newsize; i++) soap_default_value(soap, &newvalue[i]); soap_unlink(soap, data.value); delete[] data.value; data.value = newvalue; } } return data.value[n]; } _array_iterator _array::begin() const { return _array_iterator(this); } _array_iterator _array::end() const { _array_iterator i(this); i += data.__size; return i; } bool _array_const_iterator::operator==(const _array_iterator& that) const { return _value == that._value; } _base64::_base64() { } _base64::_base64(struct soap *soap) { soap_default__base64(soap, this); } _base64::_base64(struct soap *soap, int n, unsigned char *p) { soap_default__base64(soap, this); __size = n; __ptr = p; } int _base64::size() const { return __size; } unsigned char* _base64::ptr() { return __ptr; } void _base64::size(int n) { __size = n; } void _base64::ptr(unsigned char *p) { __ptr = p; } params::params() { } params::params(struct soap *soap) { soap_default_params(soap, this); } params::params(struct soap *soap, int size) { soap_default_params(soap, this); if (size > 0) { __size = size; param = soap_new_param(soap, __size); for (int i = 0; i < __size; i++) soap_default_param(soap, ¶m[i]); } } bool params::empty() const { return __size == 0; } int params::size() const { return __size; } value& params::operator[](int n) { if (n < 0) { n += __size; if (n < 0) n = 0; } if (param == NULL) { int newsize = size2k(__size = n + 1); param = soap_new_param(soap, newsize); for (int i = 0; i < newsize; i++) soap_default_param(soap, ¶m[i]); } else if (__size <= n) { int oldsize = size2k(__size); int newsize = size2k(__size = n + 1); if (oldsize < newsize) { struct param *newparam = soap_new_param(soap, newsize); int i; for (i = 0; i < oldsize; i++) newparam[i] = param[i]; for (; i < newsize; i++) soap_default_param(soap, &newparam[i]); soap_unlink(soap, param); delete[] param; param = newparam; } } return param[n].value; } params_iterator params::begin() const { return params_iterator(this); } params_iterator params::end() const { params_iterator i(this); i += __size; return i; } bool params_const_iterator::operator==(const params_iterator& that) const { return _param == that._param; } methodCall::methodCall() { } methodCall::methodCall(struct soap *soap) { soap_default_methodCall(soap, this); } methodCall::methodCall(struct soap *soap, const char *endpoint, const char *name) { soap_default_methodCall(soap, this); methodName = soap_strdup(soap, name); methodEndpoint = soap_strdup(soap, endpoint); methodResponse = NULL; } value& methodCall::operator[](int n) { return params[n]; } struct params& methodCall::operator()() { if (send() == SOAP_OK) { if (methodResponse == NULL) methodResponse = soap_new_methodResponse(soap); if (methodResponse->recv() != SOAP_OK) methodResponse = NULL; } else methodResponse = NULL; soap_closesock(soap); if (methodResponse && methodResponse->params) return *methodResponse->params; struct params *params = soap_new_params(soap); soap_default_params(soap, params); return *params; } struct params& methodCall::operator()(const struct params& args) { /* parameters */ params = args; /* invoke */ return (*this)(); } struct params& methodCall::response() { if (methodResponse == NULL) { methodResponse = soap_new_methodResponse(soap); soap_default_methodResponse(soap, methodResponse); } if (methodResponse->params == NULL) { methodResponse->params = soap_new_params(soap); soap_default_params(soap, methodResponse->params); } return *methodResponse->params; } value& methodCall::fault() { if (methodResponse) return methodResponse->get_fault(); return *new_value(soap); } const char* methodCall::name() const { if (methodName) return methodName; return ""; } int methodCall::error() const { return soap->error; } int methodCall::send() { /* no namespaces */ soap->namespaces = NULL; /* no SOAP encodingStyle */ soap->encodingStyle = NULL; /* content length (needed for HTTP non-chunked) */ soap_begin_count(soap); if (soap->mode & SOAP_IO_LENGTH) soap_put_methodCall(soap, this, "methodCall", NULL); soap_end_count(soap); /* connect and send request */ if (soap_connect(soap, methodEndpoint, NULL) || soap_put_methodCall(soap, this, "methodCall", NULL) || soap_end_send(soap)) return soap->error; return SOAP_OK; } int methodCall::recv() { if (soap_begin_recv(soap) || !soap_get_methodCall(soap, this, "methodCall", NULL) || soap_end_recv(soap)) return soap->error; return SOAP_OK; } methodResponse::methodResponse() { } methodResponse::methodResponse(struct soap *soap) { soap_default_methodResponse(soap, this); } value& methodResponse::operator[](int n) { if (params == NULL) { params = soap_new_params(soap); soap_default_params(soap, params); } return (*params)[n]; } value& methodResponse::get_fault() { if (fault == NULL) { fault = soap_new_fault(soap); soap_default_fault(soap, fault); } return fault->value; } value& methodResponse::set_fault(const char* s) { value* value = new_value(soap); *value = s; return get_fault() = *value; } value& methodResponse::set_fault(value& v) { return get_fault() = v; } int methodResponse::send() { /* no namespaces */ soap->namespaces = NULL; /* no SOAP encodingStyle */ soap->encodingStyle = NULL; /* content length */ soap_begin_count(soap); if (soap->mode & SOAP_IO_LENGTH) soap_put_methodResponse(soap, this, "methodResponse", NULL); soap_end_count(soap); /* send response */ if (soap_response(soap, SOAP_OK) || soap_put_methodResponse(soap, this, "methodResponse", NULL) || soap_end_send(soap)) return soap->error; return SOAP_OK; } int methodResponse::recv() { if (soap_begin_recv(soap) || !soap_get_methodResponse(soap, this, "methodResponse", NULL) || soap_end_recv(soap)) return soap->error; return SOAP_OK; } static int size2k(int n) { int k = 2; while (k < n) k *= 2; return k; } value *new_value(struct soap *soap) { value *v = soap_new_value(soap); return init_value(soap, v); } value *init_value(struct soap *soap, value *v) { soap_default_value(soap, v); return v; } #ifdef JSON_NAMESPACE } // namespace json #endif gsoap-2.8.28/gsoap/samples/xml-rpc-json/jsoncpp.cpp0000644000175000017500000024007712653650156021575 0ustar ellertellert/* jsoncpp.cpp A JSON C/C++ code generator for the gSOAP JSON API. 1. Take a JSON sample document and render it in JSON API code to construct this JSON value: echo '\ { "menu": {\ "id": "file",\ "value": "File",\ "popup": {\ "menuitem": [\ {"value": "New", "onclick": "CreateNewDoc()"},\ {"value": "Open", "onclick": "OpenDoc()"},\ {"value": "Close", "onclick": "CloseDoc()"}\ ]\ }\ }\ }' | ./jsoncpp #include "json.h" { struct soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT); ctx->double_format = "%lG"; value x(ctx); x["menu"]["id"] = "file"; x["menu"]["value"] = "File"; x["menu"]["popup"]["menuitem"][0]["value"] = "New"; x["menu"]["popup"]["menuitem"][0]["onclick"] = "CreateNewDoc()"; x["menu"]["popup"]["menuitem"][1]["value"] = "Open"; x["menu"]["popup"]["menuitem"][1]["onclick"] = "OpenDoc()"; x["menu"]["popup"]["menuitem"][2]["value"] = "Close"; x["menu"]["popup"]["menuitem"][2]["onclick"] = "CloseDoc()"; std::cout << x << std::endl; soap_destroy(ctx); // delete objects soap_end(ctx); // delete data soap_free(ctx); // free context } 2. Take a JSON sample document and render it in JSON API code to inspect and extract values from JSON input data, by using the JSON sample document as a template: echo '\ { "menu": {\ "id": "file",\ "value": "File",\ "popup": {\ "menuitem": [\ {"value": "New", "onclick": "CreateNewDoc()"},\ {"value": "Open", "onclick": "OpenDoc()"},\ {"value": "Close", "onclick": "CloseDoc()"}\ ]\ }\ }\ }' | ./jsoncpp -i #include "json.h" { struct soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT); ctx->double_format = "%lG"; value x(ctx); std::cin >> x; if (x.soap->error) exit(EXIT_FAILURE); // error parsing JSON #define USE_VAL(path, val) std::cout << path << " = " << val << std::endl if (x.has("menu")) { if (x["menu"].has("id")) USE_VAL("$.menu.id", x["menu"]["id"]); if (x["menu"].has("value")) USE_VAL("$.menu.value", x["menu"]["value"]); if (x["menu"].has("popup")) { if (x["menu"]["popup"].has("menuitem")) { for (int i3 = 0; i3 < x["menu"]["popup"]["menuitem"].size(); i3++) { if (x["menu"]["popup"]["menuitem"][i3].has("value")) USE_VAL("$.menu.popup.menuitem[].value", x["menu"]["popup"]["menuitem"][i3]["value"]); if (x["menu"]["popup"]["menuitem"][i3].has("onclick")) USE_VAL("$.menu.popup.menuitem[].onclick", x["menu"]["popup"]["menuitem"][i3]["onclick"]); } } } } std::cout << x << std::endl; soap_destroy(ctx); // delete objects soap_end(ctx); // delete data soap_free(ctx); // free context } 3. Take a JSONPath to generate a stand-alone application that filters JSON documents with a store of books to return their titles: ./jsoncpp -m -p'$.store.book[:].title' #include "json.h" struct Namespace namespaces[] = {{NULL,NULL,NULL,NULL}}; int main(int argc, char **argv) { struct soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT); ctx->double_format = "%lG"; value x(ctx); std::cin >> x; if (x.soap->error) exit(EXIT_FAILURE); // error parsing JSON // $.store.book[:].title #define QUERY_YIELD(val) std::cout << val << std::endl if (x.has("store")) { if (x["store"].has("book")) { if (x["store"]["book"].is_array()) { int j, k = x["store"]["book"].size()-1; for (j = 0; j <= k; j += 1) { value& r = x["store"]["book"][j]; if (r.has("title")) { QUERY_YIELD(r["title"]); } } } } } soap_destroy(ctx); // delete objects soap_end(ctx); // delete data soap_free(ctx); // free context return 0; } 4. To build jsoncpp: cd gsoap/samples/xml-rpc-json soapcpp2 -CSL xml-rpc.h c++ -I../.. -o jsoncpp jsoncpp.cpp json.cpp xml-rpc.cpp soapC.cpp ../../stdsoap2.cpp 5. To compile and link jsoncpp-generated C++ code: ./jsoncpp -o myjson.cpp ... soapcpp2 -CSL xml-rpc.h c++ -I../.. -o myjson myjson.cpp json.cpp xml-rpc.cpp soapC.cpp ../../stdsoap2.cpp 6. To compile and link jsoncpp-generated C code: ./jsoncpp -c -o myjson.c ... soapcpp2 -c -CSL xml-rpc.h cc -I../.. -o myjson myjson.c json.c xml-rpc.c soapC.c ../../stdsoap2.c -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2016, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "json.h" #include #include #include struct Namespace namespaces[] = {{NULL,NULL,NULL,NULL}}; //////////////////////////////////////////////////////////////////////////////// // // Command line options // //////////////////////////////////////////////////////////////////////////////// static bool coutput = false; // -c generate C code instead of C++ static bool explain = false; // -e add explanatory comments to the generated code static bool genread = false; // -i generate code to inspect node graph parsed from JSON input static bool genvars = false; // -l generate code for option -i to store values in local variables static bool genmain = false; // -m generate stand-alone code by adding main() static bool minimal = false; // -M generate minimal code unadorned with initialization and cleanup static bool optimal = false; // -O optimize code by factoring common indices when applicable static bool collect = false; // -y generate code that yields an array 'y' of JSONPath query results static const char *dform = NULL; // -f%fmt use %%fmt to format double floats, e.g. -f%%lG static const char *ofile = NULL; // -ofile save source code to file static const char *jpath = NULL; // -ppath generate JSONPath query code for 'path' static const char *jroot = "x"; // -rroot use 'root' instead of root value 'x' in the generated code static const char *jcode = NULL; // -xcode generate code that executes 'code' for each JSONPath query result static const char *ifile = NULL; // [infile] //////////////////////////////////////////////////////////////////////////////// // // Proto // //////////////////////////////////////////////////////////////////////////////// static void out_gen_c(soap*, value&, std::string, const std::string&, int); static void in_gen_c(soap*, value&, std::string, const std::string&, int); static void out_gen_cpp(soap*, value&, std::string, const std::string&, int); static void in_gen_cpp(soap*, value&, std::string, const std::string&, int); static void path_gen_c(soap*, const char*, std::string&, int, bool); static void path_exec_c(soap*, std::string&, int); static void path_gen_cpp(soap*, const char*, std::string&, int, bool); static void path_exec_cpp(soap*, std::string&, int); static std::ostream& indent(soap*, int); static std::string gen_ident(const std::string&, const char*); static std::string gen_counter(int); static std::string putstrname(const char*); static std::string putname(const char*); static std::string getname(const char**); //////////////////////////////////////////////////////////////////////////////// // // Pretty printer // //////////////////////////////////////////////////////////////////////////////// struct putstr { const char *str; int quote; putstr(const char *str, int quote = '"') : str(str), quote(quote) { } putstr(const std::string& str, int quote = '"') : str(str.c_str()), quote(quote) { } }; std::ostream& operator<<(std::ostream& os, const putstr& p) { if (p.str) { if (p.quote) os << (char)p.quote; for (const char *s = p.str; *s; ++s) { switch (*s) { case '\t': os << "\\t"; break; case '\n': os << "\\n"; break; case '\r': os << "\\r"; break; default: if (*s > 0 && *s < 0x10) os << "\\x0" << std::hex << *s << std::dec; else if (*s < 0x20 || *s > 0x7f) os << "\\x" << std::hex << (*s & 0xff) << std::dec; else if (coutput && !p.quote && s[0] == '*' && s[1] == '/') os << "\\x2a"; else if (p.quote && s[0] == '?' && s[1] == '?') os << "?\\"; else { if (p.quote && (*s == '"' || *s == '\\')) os << "\\"; os << (char)*s; } } } if (p.quote) os << (char)p.quote; } else os << "NULL"; return os; } //////////////////////////////////////////////////////////////////////////////// // // jsoncpp main // //////////////////////////////////////////////////////////////////////////////// int main(int argc, char **argv) { if (argc >= 2) { for (int i = 1; i < argc; i++) { const char *a = argv[i]; if ((a[0] == '-' && a[1]) #ifdef WIN32 || a[0] == '/' #endif ) { bool f = true; while (f && *++a) { switch (*a) { case 'c': coutput = true; break; case 'e': explain = true; break; case 'f': a++; f = false; if (*a) dform = a; else if (i < argc) dform = argv[++i]; break; case 'i': genread = true; if (!ifile) ifile = "-"; break; case 'l': genvars = true; break; case 'm': genmain = true; break; case 'M': minimal = true; break; case 'O': optimal = true; break; case 'o': a++; f = false; if (*a) ofile = a; else if (i < argc) ofile = argv[++i]; break; case 'p': a++; f = false; if (*a) jpath = a; else if (i < argc) jpath = argv[++i]; break; case 'r': a++; f = false; if (*a) jroot = a; else if (i < argc) jroot = argv[++i]; break; case 'x': a++; f = false; if (*a) jcode = a; else if (i < argc) jcode = argv[++i]; break; case 'y': collect = true; break; case '?': case 'h': fprintf(stderr, "Usage: jsoncpp [-c] [-e] [-f%%fmt] [-h] [-i] [-l] [-m] [-M] [-O] [-ofile] [-ppath] [-rroot] [-xcode] [-y] [infile]\n\n" "-c generate C code instead of C++\n" "-e add explanatory comments to the generated code\n" "-f%%fmt use %%fmt to format double floats, e.g. -f%%lG\n" "-h display help message\n" "-i generate code to inspect node graph parsed from JSON input\n" "-l generate code for option -i to store values in local variables\n" "-m generate stand-alone code by adding main()\n" "-M generate minimal code unadorned with initialization and cleanup\n" "-O optimize code by factoring common indices when applicable\n" "-ofile save source code to file\n" "-ppath generate JSONPath query code for 'path'\n" "-rroot use 'root' instead of root value 'x' in the generated code\n" "-xcode generate code that executes 'code' for each JSONPath query result\n" "-y generate code that yields an array 'y' of JSONPath query results\n" "infile optional JSON file to parse\n" "- read JSON from standard input\n\n"); exit(EXIT_SUCCESS); default: fprintf(stderr, "jsoncpp: Unknown option %s\n\n", a); exit(EXIT_FAILURE); } } } else { if (ifile && strcmp(ifile, "-")) fprintf(stderr, "jsoncpp: Input already specified as %s, ignoring %s\n\n", ifile, a); else ifile = argv[i]; } } } else { ifile = "-"; } if (genmain) minimal = false; soap *ctx = soap_new1(SOAP_C_UTFSTRING); if (dform && *dform == '%' && *(dform+1)) ctx->double_format = dform; std::ifstream ifs; if (ifile) { if (!strcmp(ifile, "-")) { ctx->is = &std::cin; } else { ifs.open(ifile, std::ifstream::in); if (!ifs.is_open()) { fprintf(stderr, "Cannot open %s for reading\n", ifile); exit(EXIT_FAILURE); } ctx->is = &ifs; } } std::ofstream ofs; if (ofile) { ofs.open(ofile, std::ofstream::out); if (!ofs.is_open()) { fprintf(stderr, "Cannot open %s for writing\n", ofile); exit(EXIT_FAILURE); } ctx->os = &ofs; } else { ctx->os = &std::cout; } value v(ctx); if (ifile) { if (json_read(ctx, v)) { soap_print_fault(ctx, stderr); soap_print_fault_location(ctx, stderr); exit(EXIT_FAILURE); } } if (ifile && strcmp(ifile, "-")) ifs.close(); if (!minimal) { if (coutput) { *ctx->os << "/* Dependencies:\n" " json.h xml-rpc-iters.h stdsoap2.h\n" " json.c xml-rpc.c stdsoap2.c\n" " Build:\n" " soapcpp2 -c -CSL xml-rpc.h (generates soapStub.h, soapH.h, soapC.c)\n" " cc ... soapC.c json.c xml-rpc.c stdsoap2.c ...\n" "*/\n"; } else { *ctx->os << "// Dependencies:\n" "// json.h xml-rpc-iters.h stdsoap2.h\n" "// json.cpp xml-rpc.cpp stdsoap2.cpp\n" "// Build:\n" "// soapcpp2 -CSL xml-rpc.h (generates soapStub.h, soapH.h, soapC.cpp)\n" "// c++ ... soapC.cpp json.cpp xml-rpc.cpp stdsoap2.cpp ...\n"; } *ctx->os << "\n#include \"json.h\"\n"; if (!coutput && jpath && strstr(jpath, "..")) *ctx->os << "#include \n"; } if (genmain) *ctx->os << "struct Namespace namespaces[] = {{NULL,NULL,NULL,NULL}};\n" "int main(int argc, char **argv)\n"; if (!minimal) { if (coutput) *ctx->os << "{ /* Generated by jsoncpp"; else *ctx->os << "{ // Generated by jsoncpp"; for (int i = 1; i < argc; ++i) *ctx->os << " " << putstr(argv[i], 0); if (coutput) *ctx->os << " */\n" " /* jsoncpp tool Copyright (C) 2000-2016, Robert van Engelen, Genivia Inc. */\n"; else *ctx->os << "\n" " // jsoncpp tool Copyright (C) 2000-2016, Robert van Engelen, Genivia Inc.\n"; *ctx->os << " struct soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT);\n" " ctx->double_format = \"" << (dform ? dform : "%lG") << "\";\n\n"; } if (coutput) { *ctx->os << " struct value *" << jroot << " = new_value(ctx);\n"; if ((ifile && genread && genvars) || jpath) { if (explain) *ctx->os << " /* index to inspect structs and arrays */\n"; *ctx->os << " int j;\n"; } std::string path = "$"; if (ifile && !genread) { out_gen_c(ctx, v, jroot, path, 2); } else { if (explain) *ctx->os << " /* parse JSON into value " << jroot << " */\n"; *ctx->os << " json_read(ctx, " << jroot << ");\n"; if (!minimal) *ctx->os << " if (" << jroot << "->soap->error)\n" " exit(EXIT_FAILURE); /* error parsing JSON */\n"; if (ifile) { *ctx->os << " #define USE_VAL(path, val) printf(\"%s = %s\\n\", path, *string_of(val))\n"; in_gen_c(ctx, v, jroot, path, 2); } } if (jpath) { *ctx->os << " /* JSONPath: " << putstr(jpath, 0) << " */\n"; if (!jcode) { if (collect) { if (explain) *ctx->os << " /* JSONPath query yields an array 'y' of JSONPath query results: */\n"; *ctx->os << " struct value *y = new_value(ctx);\n" " set_size(y, 0);\n" " #define QUERY_YIELD(val) *nth_value(y, has_size(y)) = *val\n"; } else { if (explain) *ctx->os << " /* JSONPath query yields are shown for each JSONPath result: */\n"; *ctx->os << " #define QUERY_YIELD(val) json_write(ctx, val), putchar('\\n')\n"; } } *ctx->os << " #define QUERY_STACK_SIZE 65536\n"; *ctx->os << " #define QUERY_STACK_OVFL exit(EXIT_FAILURE)\n"; std::string root(jroot); if (explain) { *ctx->os << " /* Synopsis of variables used:\n" " " << root << "\troot node value pointer\n" << ( collect ? " y\tyield array of query results\n" : "" ) << " v\tcurrent node value pointer to use in [(expr)]\n" " i\tarray/struct loop index\n" " j\tarray/struct index\n" " k\tswitch case counter / loop end\n" " p\tvalue pointer to current node\n" " q\tvalue pointer to current node\n" " s\tstack pointer\n" " S\tvalue stack for recursive descent\n" " Synopsis of constants used:\n" " QUERY_STACK_SIZE\tmax stack size for recursive descent\n" " QUERY_STACK_OVFL\tcode to execute on stack overflow\n" " */\n"; } path_gen_c(ctx, jpath, root, 2, false); if (!minimal && collect) *ctx->os << " json_write(ctx, y), putchar('\\n');\n"; } else if (!minimal) { if (explain) *ctx->os << " /* output value " << jroot << " in JSON */\n"; *ctx->os << " json_write(ctx, " << jroot << "), putchar('\\n');\n"; } if (!minimal) { *ctx->os << "\n" " soap_end(ctx); /* delete data */\n" " soap_free(ctx); /* free context */\n" << (genmain ? " return 0;\n" : "") << "}\n"; } } else { *ctx->os << " value " << jroot << "(ctx);\n"; std::string path = "$"; if (ifile && !genread) { out_gen_cpp(ctx, v, jroot, path, 2); } else { if (explain) *ctx->os << " // parse JSON into value " << jroot << "\n"; *ctx->os << " std::cin >> " << jroot << ";\n"; if (!minimal) *ctx->os << " if (" << jroot << ".soap->error)\n" " exit(EXIT_FAILURE); // error parsing JSON\n"; if (ifile) { *ctx->os << " #define USE_VAL(path, val) std::cout << path << \" = \" << val << std::endl\n"; in_gen_cpp(ctx, v, jroot, path, 2); } } if (jpath) { *ctx->os << " // JSONPath: " << jpath << "\n"; if (optimal) { if (explain) *ctx->os << " // index to inspect structs and arrays\n"; *ctx->os << " int j;\n"; } if (!jcode) { if (collect) { if (explain) *ctx->os << " // JSONPath query yields an array 'y' of JSONPath query results:\n"; *ctx->os << " value y(ctx);\n" " y.size(0);\n" " #define QUERY_YIELD(val) y[y.size()] = val\n"; } else { if (explain) *ctx->os << " // JSONPath query yields are shown for each JSONPath result:\n"; *ctx->os << " #define QUERY_YIELD(val) std::cout << val << std::endl\n"; } } std::string root(jroot); if (explain) { *ctx->os << " // Synopsis of variables used:\n" " // " << root << "\troot node value\n" << ( collect ? " // y\tyield array of query results\n" : "" ) << " // v\tcurrent node value to use in [(expr)]\n" " // i\titerator over arrays and structs\n" " // j\tarray/struct index\n" " // k\tswitch case counter / loop end\n" " // p\tvalue pointer to current node\n" " // q\tvalue pointer to current node\n" " // r\tvalue reference to current node\n" " // s\tvalue reference to current node\n" " // S\tvalue stack for recursive descent\n"; } path_gen_cpp(ctx, jpath, root, 2, false); if (!minimal && collect) *ctx->os << " std::cout << y << std::endl;\n"; } else if (!minimal) { if (explain) *ctx->os << " // output value " << jroot << " in JSON\n"; *ctx->os << " std::cout << " << jroot << " << std::endl;\n"; } if (!minimal) { *ctx->os << "\n" " soap_destroy(ctx); // delete objects\n" " soap_end(ctx); // delete data\n" " soap_free(ctx); // free context\n" << (genmain ? " return 0;\n" : "") << "}\n"; } } if (ofile) ofs.close(); soap_destroy(ctx); soap_end(ctx); soap_free(ctx); return 0; } //////////////////////////////////////////////////////////////////////////////// // // C gen writer/reader from infile // //////////////////////////////////////////////////////////////////////////////// static void out_gen_c(soap *ctx, value& v, std::string lhs, const std::string& path, int k) { switch (v.__type) { case SOAP_TYPE__boolean: if (explain) indent(ctx, k) << "// " << putstr(path, 0) << " = " << putstr((const char*)v, 0) << "\n"; indent(ctx, k) << "*bool_of(" << lhs << ") = " << (v.is_true() ? 1 : 0) << ";\n"; break; case SOAP_TYPE__i4: case SOAP_TYPE__int: if (explain) indent(ctx, k) << "// " << putstr(path, 0) << " = " << putstr((const char*)v, 0) << "\n"; indent(ctx, k) << "*int_of(" << lhs << ") = "; json_send(ctx, v); *ctx->os << ";\n"; break; case SOAP_TYPE__double: if (explain) indent(ctx, k) << "// " << putstr(path, 0) << " = " << putstr((const char*)v, 0) << "\n"; indent(ctx, k) << "*double_of(" << lhs << ") = "; json_send(ctx, v); *ctx->os << ";\n"; break; case SOAP_TYPE__string: if (explain) indent(ctx, k) << "// " << putstr(path, 0) << " = " << putstr((const char*)v, 0) << "\n"; indent(ctx, k) << "*string_of(" << lhs << ") = " << putstr((const char*)v) << ";\n"; break; case SOAP_TYPE__struct: if (v.empty()) { indent(ctx, k) << "set_struct(" << lhs << ");\n"; } else { _struct& s = v; for (_struct::iterator i = s.begin(); i != s.end(); ++i) { std::string lhsidx; if (optimal && (i->is_struct() || i->is_array()) && !i->empty()) { lhsidx = gen_ident(lhs, i.index()); indent(ctx, k) << "{\n"; k += 2; indent(ctx, k) << "struct value *" << lhsidx << " = value_at(" << lhs << ", " << putstr(i.index()) << ");\n"; } else { lhsidx = "value_at("; lhsidx.append(lhs).append(", ").append(putstrname(i.index())).append(")"); } std::string newpath = path; newpath.append(".").append(putname(i.index())); out_gen_c(ctx, *i, lhsidx, newpath, k); if (optimal && (i->is_struct() || i->is_array()) && !i->empty()) { k -= 2; indent(ctx, k) << "}\n"; } } } break; case SOAP_TYPE__array: if (v.empty()) { indent(ctx, k) << "set_size(" << lhs << ", 0);\n"; } else { _array& a = v; for (_array::iterator i = a.begin(); i != a.end(); ++i) { const char *s = soap_int2s(ctx, i.index()); std::string lhsidx; if (optimal && (i->is_struct() || i->is_array()) && !i->empty()) { lhsidx = lhs; lhsidx.append(s); indent(ctx, k) << "{\n"; k += 2; indent(ctx, k) << "struct value *" << lhsidx << " = nth_value(" << lhs << ", " << s << ");\n"; } else { lhsidx = "nth_value("; lhsidx.append(lhs).append(", ").append(s).append(")"); } std::string newpath = path; newpath.append("[").append(s).append("]"); out_gen_c(ctx, *i, lhsidx, newpath, k); if (optimal && (i->is_struct() || i->is_array()) && !i->empty()) { k -= 2; indent(ctx, k) << "}\n"; } } } break; default: break; } } static void in_gen_c(soap *ctx, value& v, std::string lhs, const std::string& path, int k) { switch (v.__type) { case SOAP_TYPE__boolean: if (explain) indent(ctx, k) << "/* " << putstr(path, 0) << " bool value, is_true(" << lhs << ") and is_false(" << lhs << ") */\n"; indent(ctx, k) << "USE_VAL(" << putstr(path) << ", " << lhs << ");\n"; break; case SOAP_TYPE__i4: case SOAP_TYPE__int: if (explain) indent(ctx, k) << "/* " << putstr(path, 0) << " int value, is_int(" << lhs << ") and *int_of(" << lhs << ") */\n"; indent(ctx, k) << "USE_VAL(" << putstr(path) << ", " << lhs << ");\n"; break; case SOAP_TYPE__double: if (explain) indent(ctx, k) << "/* " << putstr(path, 0) << " double value, is_double(" << lhs << ") and *double_of(" << lhs << ") */\n"; indent(ctx, k) << "USE_VAL(" << putstr(path) << ", " << lhs << ");\n"; break; case SOAP_TYPE__string: if (explain) indent(ctx, k) << "/* " << putstr(path, 0) << " string value, is_string(" << lhs << ") and *string_of(" << lhs << ") */\n"; indent(ctx, k) << "USE_VAL(" << putstr(path) << ", " << lhs << ");\n"; break; case SOAP_TYPE__struct: { _struct& s = v; if (explain) indent(ctx, k) << "/* " << putstr(path, 0) << " object, is_struct(" << lhs << ") */\n"; for (_struct::iterator i = s.begin(); i != s.end(); ++i) { std::string lhsidx; if (genvars) { lhsidx = gen_ident(lhs, i.index()); } else { lhsidx = "value_at("; lhsidx.append(lhs).append(", ").append(putstrname(i.index())).append(")"); } std::string newpath = path; newpath.append(".").append(putname(i.index())); if (genvars) indent(ctx, k) << "if ((j = nth_at(" << lhs << ", " << putstr(i.index()) << ")) >= 0)\n"; else indent(ctx, k) << "if (nth_at(" << lhs << ", " << putstr(i.index()) << ") >= 0)\n"; if (explain || genvars || i->is_struct() || i->is_array()) indent(ctx, k) << "{\n"; if (genvars) indent(ctx, k + 2) << "struct value *" << lhsidx << " = nth_value(" << lhs << ", j);\n"; in_gen_c(ctx, *i, lhsidx, newpath, k + 2); if (explain || genvars || i->is_struct() || i->is_array()) indent(ctx, k) << "}\n"; } } break; case SOAP_TYPE__array: { if (explain) indent(ctx, k) << "/* " << putstr(path, 0) << " array, is_array(" << lhs << ") */\n"; std::string idx; std::string lhsidx; if (genvars) { idx = "i"; lhsidx = lhs; lhsidx.append(idx); } else { idx = gen_counter(k/2 - 1); lhsidx = "nth_value("; lhsidx.append(lhs).append(", ").append(idx).append(")"); } indent(ctx, k) << "int " << idx << ";\n"; indent(ctx, k) << "for (" << idx << " = 0; " << idx << " < has_size(" << lhs << "); " << idx << "++)\n"; std::string newpath = path; newpath.append("[]"); if (explain || genvars || v[0].is_struct() || v[0].is_array()) indent(ctx, k) << "{\n"; if (genvars) indent(ctx, k + 2) << "struct value *" << lhsidx << " = nth_value(" << lhs << ", " << idx << ");\n"; in_gen_c(ctx, v[0], lhsidx, newpath, k + 2); if (explain || genvars || v[0].is_struct() || v[0].is_array()) indent(ctx, k) << "}\n"; } break; default: indent(ctx, k) << "; // null\n"; break; } } //////////////////////////////////////////////////////////////////////////////// // // C++ gen writer/reader from infile // //////////////////////////////////////////////////////////////////////////////// static void out_gen_cpp(soap *ctx, value& v, std::string lhs, const std::string& path, int k) { switch (v.__type) { case SOAP_TYPE__boolean: case SOAP_TYPE__i4: case SOAP_TYPE__int: case SOAP_TYPE__double: if (explain) indent(ctx, k) << "// " << putstr(path, 0) << " = " << putstr((const char*)v, 0) << "\n"; indent(ctx, k) << lhs << " = "; json_send(ctx, v); if (v.__type == SOAP_TYPE__int) *ctx->os << "LL"; *ctx->os << ";\n"; break; case SOAP_TYPE__string: if (explain) indent(ctx, k) << "// " << putstr(path, 0) << " = " << putstr((const char*)v, 0) << "\n"; indent(ctx, k) << lhs << " = " << putstr((const char*)v) << ";\n"; break; case SOAP_TYPE__struct: if (v.empty()) { indent(ctx, k) << lhs << " = _struct(ctx);\n"; } else { _struct& s = v; for (_struct::iterator i = s.begin(); i != s.end(); ++i) { std::string lhsidx; if (optimal && (i->is_struct() || i->is_array()) && !i->empty()) { lhsidx = gen_ident(lhs, i.index()); indent(ctx, k) << "{\n"; k += 2; indent(ctx, k) << "value& " << lhsidx << " = " << lhs << "[" << putstr(i.index()) << "];\n"; } else { lhsidx = lhs; lhsidx.append("[").append(putstrname(i.index())).append("]"); } std::string newpath = path; newpath.append(".").append(putname(i.index())); out_gen_cpp(ctx, *i, lhsidx, newpath, k); if (optimal && (i->is_struct() || i->is_array()) && !i->empty()) { k -= 2; indent(ctx, k) << "}\n"; } } } break; case SOAP_TYPE__array: if (v.empty()) { indent(ctx, k) << lhs << ".size(0);\n"; } else { _array& a = v; for (_array::iterator i = a.begin(); i != a.end(); ++i) { const char *s = soap_int2s(ctx, i.index()); std::string lhsidx; if (optimal && (i->is_struct() || i->is_array()) && !i->empty()) { lhsidx = lhs; lhsidx.append(s); indent(ctx, k) << "{\n"; k += 2; indent(ctx, k) << "value& " << lhsidx << " = " << lhs << "[" << s << "];\n"; } else { lhsidx = lhs; lhsidx.append("[").append(s).append("]"); } std::string newpath = path; newpath.append("[").append(s).append("]"); out_gen_cpp(ctx, *i, lhsidx, newpath, k); if (optimal && (i->is_struct() || i->is_array()) && !i->empty()) { k -= 2; indent(ctx, k) << "}\n"; } } } break; default: break; } } static void in_gen_cpp(soap *ctx, value& v, std::string lhs, const std::string& path, int k) { switch (v.__type) { case SOAP_TYPE__boolean: if (explain) indent(ctx, k) << "// " << putstr(path, 0) << " bool value\n"; indent(ctx, k) << "USE_VAL(" << putstr(path) << ", " << lhs << ");\n"; break; case SOAP_TYPE__i4: case SOAP_TYPE__int: if (explain) indent(ctx, k) << "// " << putstr(path, 0) << " int value\n"; indent(ctx, k) << "USE_VAL(" << putstr(path) << ", " << lhs << ");\n"; break; case SOAP_TYPE__double: if (explain) indent(ctx, k) << "// " << putstr(path, 0) << " double value\n"; indent(ctx, k) << "USE_VAL(" << putstr(path) << ", " << lhs << ");\n"; break; case SOAP_TYPE__string: if (explain) indent(ctx, k) << "// " << putstr(path, 0) << " string value\n"; indent(ctx, k) << "USE_VAL(" << putstr(path) << ", " << lhs << ");\n"; break; case SOAP_TYPE__struct: { _struct& s = v; if (explain) indent(ctx, k) << "// " << putstr(path, 0) << " object\n"; for (_struct::iterator i = s.begin(); i != s.end(); ++i) { std::string lhsidx; if (genvars) { lhsidx = gen_ident(lhs, i.index()); } else { lhsidx = lhs; lhsidx.append("[").append(putstrname(i.index())).append("]"); } std::string newpath = path; newpath.append(".").append(putname(i.index())); indent(ctx, k) << "if (" << lhs << ".has(" << putstr(i.index()) << "))\n"; if (explain || genvars || i->is_struct() || i->is_array()) indent(ctx, k) << "{\n"; if (genvars) indent(ctx, k + 2) << "value& " << lhsidx << " = " << lhs << "[" << putstr(i.index()) << "];\n"; in_gen_cpp(ctx, *i, lhsidx, newpath, k + 2); if (explain || genvars || i->is_struct() || i->is_array()) indent(ctx, k) << "}\n"; } } break; case SOAP_TYPE__array: { if (explain) indent(ctx, k) << "// " << putstr(path, 0) << " array\n"; std::string idx; std::string lhsidx; if (genvars) { idx = "i"; lhsidx = lhs; lhsidx.append(idx); } else { idx = gen_counter(k/2 - 1); lhsidx = lhs; lhsidx.append("[").append(idx).append("]"); } indent(ctx, k) << "for (int " << idx << " = 0; " << idx << " < " << lhs << ".size(); " << idx << "++)\n"; std::string newpath = path; newpath.append("[]"); if (explain || genvars || v[0].is_struct() || v[0].is_array()) indent(ctx, k) << "{\n"; if (genvars) indent(ctx, k + 2) << "value& " << lhsidx << " = " << lhs << "[" << idx << "];\n"; in_gen_cpp(ctx, v[0], lhsidx, newpath, k + 2); if (explain || genvars || v[0].is_struct() || v[0].is_array()) indent(ctx, k) << "}\n"; } break; default: indent(ctx, k) << "; // null\n"; break; } } //////////////////////////////////////////////////////////////////////////////// // // C gen JSONPath from -ppath // //////////////////////////////////////////////////////////////////////////////// static void path_gen_c(struct soap *ctx, const char *jpath, std::string& v, int k, bool throwup) { if (*jpath == '$' || *jpath == '@') // strip $ and @ from path ++jpath; while (isspace(*jpath) || (*jpath == '.' && *(jpath + 1) != '.')) // skip space and single . ++jpath; if (*jpath == '.') // path: .. { ++jpath; if (*jpath == '.') { if (explain) indent(ctx, k) << "/* iterate over descendants of current node " << v << " to match " << jpath << " */\n"; indent(ctx, k) << "struct value *S[QUERY_STACK_SIZE], **s = S;\n"; indent(ctx, k) << "*s++ = " << v << ";\n"; indent(ctx, k) << "while (S < s)\n"; indent(ctx, k) << "{\n"; indent(ctx, k + 2) << "struct value *p = *--s;\n"; indent(ctx, k + 2) << "int i;\n"; indent(ctx, k + 2) << "for (i = has_size(p)-1; i >= 0; --i)\n"; indent(ctx, k + 2) << "{\n"; indent(ctx, k + 4) << "if (s < S + QUERY_STACK_SIZE)\n"; indent(ctx, k + 6) << "*s++ = nth_value(p, i);\n"; indent(ctx, k + 4) << "else\n"; indent(ctx, k + 6) << "QUERY_STACK_OVFL;\n"; indent(ctx, k + 2) << "}\n"; indent(ctx, k + 2) << "{\n"; v = "p"; path_gen_c(ctx, jpath, v, k + 4, throwup); indent(ctx, k + 2) << "}\n"; indent(ctx, k) << "}\n"; } else { fprintf(stderr, "jsoncpp: JSONPath unexpected end at '.'\n\n"); exit(EXIT_FAILURE); } } else if (*jpath == '[') // path: [*]..., [?x], or [(),:]... { ++jpath; if (*jpath == '*') // path: [*]... { ++jpath; if (*jpath != ']') { fprintf(stderr, "jsoncpp: JSONPath ']' expected at ...->%s\n\n", jpath); exit(EXIT_FAILURE); } ++jpath; if (explain) indent(ctx, k) << "/* iterate over current array/struct node " << v << " to match " << jpath << " */\n"; indent(ctx, k) << "int i, k = has_size(" << v << ");\n"; indent(ctx, k) << "for (i = 0; i < k; ++i)\n"; indent(ctx, k) << "{\n"; if (v[0] == 'p') { indent(ctx, k + 2) << "struct value *q = nth_value(" << v << ", i);\n"; v = "q"; } else { indent(ctx, k + 2) << "struct value *p = nth_value(" << v << ", i);\n"; v = "p"; } path_gen_c(ctx, jpath, v, k + 2, throwup); indent(ctx, k) << "}\n"; } else if (*jpath == '?') // path: [?x]... where x is a C++ bool expression { ++jpath; if (*jpath != '(') { fprintf(stderr, "jsoncpp: JSONPath '(' expected at ...->%s\n\n", jpath); exit(EXIT_FAILURE); } ++jpath; int nest = 0; const char *s; for (s = jpath; *s; ++s) { if (*s == ')') { if (nest == 0) break; --nest; } else if (*s == '(') ++nest; } if (*s != ')' || *(s + 1) != ']') { fprintf(stderr, "jsoncpp: JSONPath ')]' expected at ...->%s\n\n", jpath); exit(EXIT_FAILURE); } std::string code(jpath, s - jpath); jpath = s + 2; if (explain) indent(ctx, k) << "/* filter current node " << v << " with 'if (" << code << ")' to match " << jpath << " */\n"; indent(ctx, k) << "struct value *v = " << v << ";\n"; indent(ctx, k) << "if (" << code << ")\n"; indent(ctx, k) << "{\n"; path_gen_c(ctx, jpath, v, k + 2, throwup); indent(ctx, k) << "}\n"; } else // path: [(),:]... { std::string u; int subs = 0; std::string code; std::string name; int start, end, step; while (true) { ++subs; code.clear(); name.clear(); start = end = step = 0; if (*jpath == '(') { ++jpath; int nest = 0; const char *s; for (s = jpath; *s; ++s) { if (*s == ')') { if (nest == 0) break; --nest; } else if (*s == '(') ++nest; } if (*s != ')') { fprintf(stderr, "jsoncpp: JSONPath ')' expected at ...->%s\n\n", jpath); exit(EXIT_FAILURE); } code = std::string(jpath, s - jpath); jpath = s + 1; } else if (*jpath == ':') { ++jpath; bool hasend = true; if (*jpath == '-' || *jpath == '+' || isdigit(*jpath)) end = soap_strtol(jpath, (char**)&jpath, 10); else hasend = false; if (*jpath == ':') step = soap_strtol(jpath + 1, (char**)&jpath, 10); else step = 1; if (step > 0) // end is exclusive (Python array slicing) --end; else if (hasend) ++end; if (step < 0) start = -1; } else if (*jpath == '\'' || *jpath == '"' || isalpha(*jpath)) { name = getname(&jpath); } else if (*jpath == '-' || *jpath == '+' || isdigit(*jpath)) { start = soap_strtol(jpath, (char**)&jpath, 10); if (*jpath == ':') { ++jpath; bool hasend = true; if (*jpath == '-' || *jpath == '+' || isdigit(*jpath)) end = soap_strtol(jpath, (char**)&jpath, 10); else hasend = false; if (*jpath == ':') step = soap_strtol(jpath + 1, (char**)&jpath, 10); else step = 1; if (step > 0) // end is exclusive (Python array slicing) --end; else if (hasend) ++end; } } if ((step > 0 && !(start <= end || (start >= 0 && end < 0))) || (step < 0 && !(start >= end || (start < 0 && end >= 0)))) { fprintf(stderr, "jsoncpp: JSONPath inverted bounds at ...->%s\n\n", jpath); exit(EXIT_FAILURE); } if (subs == 1 && *jpath != ',') // path: [x]... with x a name or index or [start]:[end][:step] slice break; if (subs == 1) // path: [x,...]... with x a name or index or [start]:[end][:step] slice { if (explain) indent(ctx, k) << "/* for each case */\n"; indent(ctx, k) << "int i, k = 1;\n"; if (v[0] == 'p') { indent(ctx, k) << "struct value *q;\n"; u = "q"; } else { indent(ctx, k) << "struct value *p;\n"; u = "p"; } indent(ctx, k) << "do\n"; indent(ctx, k) << "{\n"; indent(ctx, k + 2) << "switch (k)\n"; indent(ctx, k + 2) << "{\n"; } indent(ctx, k + 4) << "case " << 2*subs-1 << ":\n"; if (!code.empty()) { indent(ctx, k + 4) << "{\n"; if (explain) indent(ctx, k + 6) << "/* if current node " << v << " is an array/struct with field/element [(" << code << ")] ... */\n"; indent(ctx, k + 6) << "struct value *v = " << v << ";\n"; indent(ctx, k + 6) << "k = " << 2*subs+1 << ";\n"; indent(ctx, k + 6) << u << " = (" << code << ");\n"; // only value pointer expressions in C indent(ctx, k + 6) << "if (" << u << ")\n"; indent(ctx, k + 8) << "break;\n"; indent(ctx, k + 4) << "}\n"; } else if (!name.empty()) { if (explain) indent(ctx, k + 6) << "/* if current node " << v << " is a struct with field '" << name << "' ... */\n"; indent(ctx, k + 6) << "k = " << 2*subs+1 << ";\n"; indent(ctx, k + 6) << "if ((i = nth_at(" << v << ", " << putstr(name) << ")) >= 0)\n"; indent(ctx, k + 6) << "{\n"; indent(ctx, k + 8) << u << " = nth_value(" << v << ", i);\n"; indent(ctx, k + 8) << "break;\n"; indent(ctx, k + 6) << "}\n"; } else if (step > 0) { if (explain) indent(ctx, k + 6) << "/* if current node " << v << " is an array then iterate from " << start << " to " << end << " by " << step << " ... */\n"; indent(ctx, k + 6) << "if (!is_array(" << v << ")\n"; indent(ctx, k + 6) << "{\n"; indent(ctx, k + 8) << "k = " << 2*subs+1 << ";\n"; indent(ctx, k + 8) << "continue;\n"; indent(ctx, k + 6) << "}\n"; if (start < 0) indent(ctx, k + 6) << "i = (" << start << " >= -has_size(" << v << ") ? " << start << " : -has_size(" << v << "))-" << step << ";\n"; else indent(ctx, k + 6) << "i = " << start-step << ";\n"; indent(ctx, k + 6) << "k = " << 2*subs << ";\n"; indent(ctx, k + 4) << "case " << 2*subs << ":\n"; indent(ctx, k + 6) << "i += " << step << ";\n"; if (start >= 0 && end < 0) // : 0 <= start <= size+end where end < 0 indent(ctx, k + 6) << "if (i <= has_size(" << v << ")+" << end << ")\n"; else if (start >= 0 && end >= 0) // : 0 <= start <= end < size indent(ctx, k + 6) << "if (i <= " << end << " && i < has_size(" << v << "))\n"; else // start < 0 && end < 0 : -size <= start <= end < 0 indent(ctx, k + 6) << "if (i <= " << end << ")\n"; indent(ctx, k + 6) << "{\n"; indent(ctx, k + 8) << u << " = nth_value(" << v << ", i);\n"; indent(ctx, k + 8) << "break;\n"; indent(ctx, k + 6) << "}\n"; indent(ctx, k + 6) << "else\n"; indent(ctx, k + 8) << "k = " << 2*subs+1 << ";\n"; } else if (step < 0) { if (explain) indent(ctx, k + 6) << "/* if current node " << v << " is an array then iterate from " << start << " to " << end << " by " << step << " ... */\n"; indent(ctx, k + 6) << "if (!is_array(" << v << "))\n"; indent(ctx, k + 6) << "{\n"; indent(ctx, k + 8) << "k = " << 2*subs+1 << ";\n"; indent(ctx, k + 8) << "continue;\n"; indent(ctx, k + 6) << "}\n"; if (start < 0 && end >= 0) indent(ctx, k + 6) << "i = has_size(" << v << ")+" << start-step << ";\n"; else if (start >= 0 && end >= 0) indent(ctx, k + 6) << "i = (" << start << " < has_size(" << v << ") ? " << start << " : has_size(" << v << ")-1)+" << -step << ";\n"; else // start < 0 && end < 0 indent(ctx, k + 6) << "i = " << start-step << ";\n"; indent(ctx, k + 6) << "k = " << 2*subs << ";\n"; indent(ctx, k + 4) << "case " << 2*subs << ":\n"; indent(ctx, k + 6) << "i -= " << -step << ";\n"; if (start < 0 && end >= 0) // : 0 <= end <= size+start where start < 0 indent(ctx, k + 6) << "if (i >= " << end << ")\n"; else if (start >= 0 && end >= 0) // : 0 <= end <= start < size indent(ctx, k + 6) << "if (i >= " << end << ")\n"; else // start < 0 && end < 0 : -size <= end <= start < 0 indent(ctx, k + 6) << "if (i >= " << end << " && i >= -has_size(" << v << "))\n"; indent(ctx, k + 6) << "{\n"; indent(ctx, k + 8) << u << " = nth_value(" << v << ", i);\n"; indent(ctx, k + 8) << "break;\n"; indent(ctx, k + 6) << "}\n"; indent(ctx, k + 6) << "else\n"; indent(ctx, k + 8) << "k = " << 2*subs+1 << ";\n"; } else { if (explain) indent(ctx, k + 6) << "/* if current node " << v << " is an array with element [" << start << "] ... */\n"; indent(ctx, k + 6) << "k = " << 2*subs+1 << ";\n"; indent(ctx, k + 6) << "if ((i = nth_nth(" << v << ", " << start << ")) >= 0)\n"; indent(ctx, k + 6) << "{\n"; indent(ctx, k + 8) << u << " = nth_value(" << v << ", i);\n"; indent(ctx, k + 8) << "break;\n"; indent(ctx, k + 6) << "}\n"; } if (*jpath != ',') break; ++jpath; } if (subs == 0 && *jpath == ']') { fprintf(stderr, "jsoncpp: JSONPath empty '[]' at ...->%s\n\n", jpath); exit(EXIT_FAILURE); } if (*jpath != ']') { fprintf(stderr, "jsoncpp: JSONPath ']' expected at ...->%s\n\n", jpath); exit(EXIT_FAILURE); } ++jpath; if (subs == 1) // path: [x]... with x a name or index or [start]:[end][:step] range { if (!code.empty()) { if (explain) indent(ctx, k) << "/* if current node " << v << " is an array/struct with field/element [(" << code << ")] then match " << jpath << " */\n"; indent(ctx, k) << "struct value *v = " << v << ";\n"; indent(ctx, k) << "struct value *p = (" << code << ");\n"; // only value pointer expressions in C indent(ctx, k) << "if (p)\n"; indent(ctx, k) << "{\n"; v = "p"; path_gen_c(ctx, jpath, v, k + 2, throwup); indent(ctx, k) << "}\n"; } else if (!name.empty()) { if (explain) indent(ctx, k) << "/* if current node " << v << " is a struct with field '" << name << "' then match " << jpath << " */\n"; indent(ctx, k) << "if ((j = nth_at(" << v << ", " << putstr(name) << ")) >= 0)\n"; indent(ctx, k) << "{\n"; if (v[0] == 'p') { indent(ctx, k + 2) << "struct value *q = nth_value(" << v << ", j);\n"; v = "q"; } else { indent(ctx, k + 2) << "struct value *p = nth_value(" << v << ", j);\n"; v = "p"; } path_gen_c(ctx, jpath, v, k + 2, throwup); indent(ctx, k) << "}\n"; } else if (step > 0) { if (explain) indent(ctx, k) << "/* if current node " << v << " is an array then iterate from " << start << " to " << end << " by " << step << " to match " << jpath << " */\n"; indent(ctx, k) << "if (is_array(" << v << "))\n"; indent(ctx, k) << "{\n"; if (start >= 0 && end < 0) { indent(ctx, k + 2) << "int i, k = has_size(" << v << ")-" << -end << ";\n"; indent(ctx, k + 2) << "for (i = " << start << "; i <= k; i += " << step << ")\n"; } else if (start >= 0 && end >= 0) { indent(ctx, k + 2) << "int i, k = (" << end << " < has_size(" << v << ") ? " << end << " : has_size(" << v << ")-1);\n"; indent(ctx, k + 2) << "for (i = " << start << "; i <= k; i += " << step << ")\n"; } else // start < 0 && end < 0 { indent(ctx, k + 2) << "int i, k = (" << start << " >= -has_size(" << v << ") ? " << start << " : -has_size(" << v << "));\n"; indent(ctx, k + 2) << "for (i = k; i <= " << end << "; i += " << step << ")\n"; } indent(ctx, k + 2) << "{\n"; if (v[0] == 'p') { indent(ctx, k + 4) << "struct value *q = nth_value(" << v << ", i);\n"; v = "q"; } else { indent(ctx, k + 4) << "struct value *p = nth_value(" << v << ", i);\n"; v = "p"; } path_gen_c(ctx, jpath, v, k + 4, throwup); indent(ctx, k + 2) << "}\n"; indent(ctx, k) << "}\n"; } else if (step < 0) { if (explain) indent(ctx, k) << "/* if current node " << v << " is an array then iterate from " << start << " to " << end << " by " << step << " to match " << jpath << " */\n"; indent(ctx, k) << "if (is_array(" << v << "))\n"; indent(ctx, k) << "{\n"; if (start < 0 && end >= 0) { indent(ctx, k + 2) << "int i, k = has_size(" << v << ")-" << -start << ";\n"; indent(ctx, k + 2) << "for (i = k; i >= " << end << "; i -= " << -step << ")\n"; } else if (start >= 0 && end >= 0) { indent(ctx, k + 2) << "int i, k = (" << start << " < has_size(" << v << ") ? " << start << " : has_size(" << v << ")-1);\n"; indent(ctx, k + 2) << "for (i = k; i >= " << end << "; i -= " << -step << ")\n"; } else // start < 0 && end < 0 { indent(ctx, k + 2) << "int i, k = (" << end << " >= -has_size(" << v << ") ? " << end << " : -has_size(" << v << "));\n"; indent(ctx, k + 2) << "for (i = " << start << "; i >= k; i -= " << -step << ")\n"; } indent(ctx, k + 2) << "{\n"; if (v[0] == 'p') { indent(ctx, k + 4) << "struct value *q = nth_value(" << v << ", i);\n"; v = "q"; } else { indent(ctx, k + 4) << "struct value *p = nth_value(" << v << ", i);\n"; v = "p"; } path_gen_c(ctx, jpath, v, k + 4, throwup); indent(ctx, k + 2) << "}\n"; indent(ctx, k) << "}\n"; } else { if (explain) indent(ctx, k) << "/* if current node " << v << " is an array with element [" << start << "] then match " << jpath << " */\n"; indent(ctx, k) << "if ((j = nth_nth(" << v << ", " << start << ")) >= 0)\n"; indent(ctx, k) << "{\n"; if (v[0] == 'p') { indent(ctx, k + 2) << "struct value *q = nth_value(" << v << ", j);\n"; v = "q"; } else { indent(ctx, k + 2) << "struct value *p = nth_value(" << v << ", j);\n"; v = "p"; } path_gen_c(ctx, jpath, v, k + 2, throwup); indent(ctx, k) << "}\n"; } } else { indent(ctx, k + 4) << "default:\n"; indent(ctx, k + 6) << "continue;\n"; indent(ctx, k + 2) << "}\n"; if (explain) indent(ctx, k + 2) << "/* ... then match " << jpath << " */\n"; indent(ctx, k + 2) << "{\n"; path_gen_c(ctx, jpath, u, k + 4, throwup); indent(ctx, k + 2) << "}\n"; indent(ctx, k) << "} while (k <= " << 2*subs << ");\n"; } } } else if (*jpath == '?') // path: P?Q means all values P such that Q (has at least one result) { if (throwup) { fprintf(stderr, "jsoncpp: JSONPath cannot nest '?' and '!' ...->%s\n\n", jpath); exit(EXIT_FAILURE); } ++jpath; if (explain) indent(ctx, k) << "/* value of current node " << v << " if its descendants match " << jpath << " */\n"; std::string u = v; path_gen_c(ctx, jpath, v, k, true); indent(ctx, k) << "if (0)\n"; indent(ctx, k) << "{\n"; indent(ctx, 2) << "found:\n"; path_exec_c(ctx, u, k + 2); indent(ctx, k) << "}\n"; } else if (*jpath == '!') // path: P!Q means all values P such that not Q (has no results) { if (throwup) { fprintf(stderr, "jsoncpp: JSONPath cannot nest '?' and '!' ...->%s\n\n", jpath); exit(EXIT_FAILURE); } ++jpath; if (explain) indent(ctx, k) << "/* value of current node " << v << " if its descendants do not match " << jpath << " */\n"; std::string u = v; path_gen_c(ctx, jpath, v, k, true); path_exec_c(ctx, u, k); indent(ctx, 2) << "found:\n"; indent(ctx, k) << ";\n"; } else if (*jpath == '*') // path: *... { ++jpath; if (explain) indent(ctx, k) << "/* iterate over current array/struct node " << v << " to match " << jpath << " */\n"; indent(ctx, k) << "int i, k = has_size(" << v << ");\n"; indent(ctx, k) << "for (i = 0; i < k; ++i)\n"; indent(ctx, k) << "{\n"; if (v[0] == 'p') { indent(ctx, k + 2) << "struct value *q = nth_value(" << v << ", i);\n"; v = "q"; } else { indent(ctx, k + 2) << "struct value *p = nth_value(" << v << ", i);\n"; v = "p"; } path_gen_c(ctx, jpath, v, k + 2, throwup); indent(ctx, k) << "}\n"; } else if (!*jpath) { if (throwup) indent(ctx, k) << "goto found;\n"; else path_exec_c(ctx, v, k); } else // path: name... { std::string name = getname(&jpath); if (explain) indent(ctx, k) << "/* if current node " << v << " is a struct with field '" << name << "' then match " << jpath << " */\n"; indent(ctx, k) << "if ((j = nth_at(" << v << ", " << putstr(name) << ")) >= 0)\n"; indent(ctx, k) << "{\n"; if (v[0] == 'p') { indent(ctx, k + 2) << "struct value *q = nth_value(" << v << ", j);\n"; v = "q"; } else { indent(ctx, k + 2) << "struct value *p = nth_value(" << v << ", j);\n"; v = "p"; } path_gen_c(ctx, jpath, v, k + 2, throwup); indent(ctx, k) << "}\n"; } } static void path_exec_c(struct soap *ctx, std::string& v, int k) { if (jcode) { indent(ctx, k) << "value *v = " << v << ";\n"; indent(ctx, k) << jcode << "\n"; } else { indent(ctx, k) << "QUERY_YIELD(" << v << ");\n"; } } //////////////////////////////////////////////////////////////////////////////// // // C++ gen JSONPath from -ppath // //////////////////////////////////////////////////////////////////////////////// static void path_gen_cpp(struct soap *ctx, const char *jpath, std::string& v, int k, bool throwup) { if (*jpath == '$' || *jpath == '@') // strip $ and @ from path ++jpath; while (isspace(*jpath) || (*jpath == '.' && *(jpath + 1) != '.')) // skip space and single . ++jpath; if (*jpath == '.') // path: .. { ++jpath; if (*jpath == '.') { ++jpath; if (explain) indent(ctx, k) << "// iterate over descendants of current node " << v << " to match " << jpath << "\n"; indent(ctx, k) << "std::stack S;\n"; indent(ctx, k) << "S.push(&" << v << ");\n"; indent(ctx, k) << "while (!S.empty())\n"; indent(ctx, k) << "{\n"; indent(ctx, k + 2) << "value& r = *S.top();\n"; indent(ctx, k + 2) << "S.pop();\n"; indent(ctx, k + 2) << "for (int i = r.size()-1; i >= 0; --i)\n"; indent(ctx, k + 4) << "S.push(&r[i]);\n"; v = "r"; path_gen_cpp(ctx, jpath, v, k + 2, throwup); indent(ctx, k) << "}\n"; } else { fprintf(stderr, "jsoncpp: JSONPath unexpected end at '.'\n\n"); exit(EXIT_FAILURE); } } else if (*jpath == '[') // path: [*]..., [?x], or [(),:]... { ++jpath; if (*jpath == '*') // path: [*]... { ++jpath; if (*jpath != ']') { fprintf(stderr, "jsoncpp: JSONPath ']' expected at ...->%s\n\n", jpath); exit(EXIT_FAILURE); } ++jpath; if (explain) indent(ctx, k) << "// iterate over current array/struct node " << v << " to match " << jpath << "\n"; indent(ctx, k) << "value::iterator k = " << v << ".end();\n"; indent(ctx, k) << "for (value::iterator i = " << v << ".begin(); i != k; ++i)\n"; indent(ctx, k) << "{\n"; indent(ctx, k + 2) << "value& r = *i;\n"; v = "r"; path_gen_cpp(ctx, jpath, v, k + 2, throwup); indent(ctx, k) << "}\n"; } else if (*jpath == '?') // path: [?x]... where x is a C++ bool expression { ++jpath; if (*jpath != '(') { fprintf(stderr, "jsoncpp: JSONPath '(' expected at ...->%s\n\n", jpath); exit(EXIT_FAILURE); } ++jpath; int nest = 0; const char *s; for (s = jpath; *s; ++s) { if (*s == ')') { if (nest == 0) break; --nest; } else if (*s == '(') ++nest; } if (*s != ')' || *(s + 1) != ']') { fprintf(stderr, "jsoncpp: JSONPath ')]' expected at ...->%s\n\n", jpath); exit(EXIT_FAILURE); } std::string code(jpath, s - jpath); jpath = s + 2; if (explain) indent(ctx, k) << "// filter current node " << v << " with 'if (" << code << ")' to match " << jpath << "\n"; indent(ctx, k) << "value& v = " << v << ";\n"; indent(ctx, k) << "if (" << code << ")\n"; indent(ctx, k) << "{\n"; path_gen_cpp(ctx, jpath, v, k + 2, throwup); indent(ctx, k) << "}\n"; } else // path: [(),:]... { std::string p, u; int subs = 0; std::string code; std::string name; int start, end, step; while (true) { ++subs; code.clear(); name.clear(); start = end = step = 0; if (*jpath == '(') { ++jpath; int nest = 0; const char *s; for (s = jpath; *s; ++s) { if (*s == ')') { if (nest == 0) break; --nest; } else if (*s == '(') ++nest; } if (*s != ')') { fprintf(stderr, "jsoncpp: JSONPath ')' expected at ...->%s\n\n", jpath); exit(EXIT_FAILURE); } code = std::string(jpath, s - jpath); jpath = s + 1; } else if (*jpath == ':') { ++jpath; bool hasend = true; if (*jpath == '-' || *jpath == '+' || isdigit(*jpath)) end = soap_strtol(jpath, (char**)&jpath, 10); else hasend = false; if (*jpath == ':') step = soap_strtol(jpath + 1, (char**)&jpath, 10); else step = 1; if (step > 0) // end is exclusive (Python array slicing) --end; else if (hasend) ++end; if (step < 0) start = -1; } else if (*jpath == '\'' || *jpath == '"' || isalpha(*jpath)) { name = getname(&jpath); } else if (*jpath == '-' || *jpath == '+' || isdigit(*jpath)) { start = soap_strtol(jpath, (char**)&jpath, 10); if (*jpath == ':') { ++jpath; bool hasend = true; if (*jpath == '-' || *jpath == '+' || isdigit(*jpath)) end = soap_strtol(jpath, (char**)&jpath, 10); else hasend = false; if (*jpath == ':') step = soap_strtol(jpath + 1, (char**)&jpath, 10); else step = 1; if (step > 0) // end is exclusive (Python array slicing) --end; else if (hasend) ++end; } } if ((step > 0 && !(start <= end || (start >= 0 && end < 0))) || (step < 0 && !(start >= end || (start < 0 && end >= 0)))) { fprintf(stderr, "jsoncpp: JSONPath inverted bounds at ...->%s\n\n", jpath); exit(EXIT_FAILURE); } if (subs == 1 && *jpath != ',') // path: [x]... with x a name or index or [start]:[end][:step] slice break; if (subs == 1) // path: [x,...]... with x a name or index or [start]:[end][:step] slice { if (explain) indent(ctx, k) << "// for each case\n"; indent(ctx, k) << "int i, k = 1;\n"; if (v.compare(0, 4, "(*p)") == 0) { indent(ctx, k) << "value *q;\n"; p = "q"; u = "(*q)"; } else { indent(ctx, k) << "value *p;\n"; p = "p"; u = "(*p)"; } indent(ctx, k) << "do\n"; indent(ctx, k) << "{\n"; indent(ctx, k + 2) << "switch (k)\n"; indent(ctx, k + 2) << "{\n"; } indent(ctx, k + 4) << "case " << 2*subs-1 << ":\n"; if (!code.empty()) { indent(ctx, k + 4) << "{\n"; if (explain) indent(ctx, k + 6) << "// if current node " << v << " is an array/struct with field/element [(" << code << ")] ...\n"; indent(ctx, k + 6) << "k = " << 2*subs+1 << ";\n"; indent(ctx, k + 6) << "value& v = " << v << ";\n"; indent(ctx, k + 6) << "if ((i = v.nth(" << code << ")) >= 0)\n"; indent(ctx, k + 6) << "{\n"; indent(ctx, k + 8) << p << " = &v[i];\n"; indent(ctx, k + 8) << "break;\n"; indent(ctx, k + 6) << "}\n"; indent(ctx, k + 4) << "}\n"; } else if (!name.empty()) { if (explain) indent(ctx, k + 6) << "// if current node " << v << " is a struct with field '" << name << "' ...\n"; indent(ctx, k + 6) << "k = " << 2*subs+1 << ";\n"; if (optimal) { indent(ctx, k + 6) << "if ((i = " << v << ".nth(" << putstr(name) << ")) >= 0)\n"; indent(ctx, k + 6) << "{\n"; indent(ctx, k + 8) << p << " = &" << v << "[i];\n"; indent(ctx, k + 8) << "break;\n"; indent(ctx, k + 6) << "}\n"; } else { indent(ctx, k + 6) << "if (" << v << ".has(" << putstr(name) << "))\n"; indent(ctx, k + 6) << "{\n"; indent(ctx, k + 8) << p << " = &" << v << "[" << putstr(name) << "];\n"; indent(ctx, k + 8) << "break;\n"; indent(ctx, k + 6) << "}\n"; } } else if (step > 0) { if (explain) indent(ctx, k + 6) << "// if current node " << v << " is an array then iterate from " << start << " to " << end << " by " << step << " ...\n"; indent(ctx, k + 6) << "if (!" << v << ".is_array())\n"; indent(ctx, k + 6) << "{\n"; indent(ctx, k + 8) << "k = " << 2*subs+1 << ";\n"; indent(ctx, k + 8) << "continue;\n"; indent(ctx, k + 6) << "}\n"; if (start < 0) indent(ctx, k + 6) << "i = (" << start << " >= -" << v << ".size() ? " << start << " : -" << v << ".size())-" << step << ";\n"; else indent(ctx, k + 6) << "i = " << start-step << ";\n"; indent(ctx, k + 6) << "k = " << 2*subs << ";\n"; indent(ctx, k + 4) << "case " << 2*subs << ":\n"; indent(ctx, k + 6) << "i += " << step << ";\n"; if (start >= 0 && end < 0) // : 0 <= start <= size+end where end < 0 indent(ctx, k + 6) << "if (i <= " << v << ".size()+" << end << ")\n"; else if (start >= 0 && end >= 0) // : 0 <= start <= end < size indent(ctx, k + 6) << "if (i <= " << end << " && i < " << v << ".size())\n"; else // start < 0 && end < 0 : -size <= start <= end < 0 indent(ctx, k + 6) << "if (i <= " << end << ")\n"; indent(ctx, k + 6) << "{\n"; indent(ctx, k + 8) << p << " = &" << v << "[i];\n"; indent(ctx, k + 8) << "break;\n"; indent(ctx, k + 6) << "}\n"; indent(ctx, k + 6) << "else\n"; indent(ctx, k + 8) << "k = " << 2*subs+1 << ";\n"; } else if (step < 0) { if (explain) indent(ctx, k + 6) << "// if current node " << v << " is an array then iterate from " << start << " to " << end << " by " << step << " ...\n"; indent(ctx, k + 6) << "if (!" << v << ".is_array())\n"; indent(ctx, k + 6) << "{\n"; indent(ctx, k + 8) << "k = " << 2*subs+1 << ";\n"; indent(ctx, k + 8) << "continue;\n"; indent(ctx, k + 6) << "}\n"; if (start < 0 && end >= 0) indent(ctx, k + 6) << "i = " << v << ".size()+" << start-step << ";\n"; else if (start >= 0 && end >= 0) indent(ctx, k + 6) << "i = (" << start << " < " << v << ".size() ? " << start << " : " << v << ".size()-1)+" << -step << ";\n"; else // start < 0 && end < 0 indent(ctx, k + 6) << "i = " << start-step << ";\n"; indent(ctx, k + 6) << "k = " << 2*subs << ";\n"; indent(ctx, k + 4) << "case " << 2*subs << ":\n"; indent(ctx, k + 6) << "i -= " << -step << ";\n"; if (start < 0 && end >= 0) // : 0 <= end <= size+start where start < 0 indent(ctx, k + 6) << "if (i >= " << end << ")\n"; else if (start >= 0 && end >= 0) // : 0 <= end <= start < size indent(ctx, k + 6) << "if (i >= " << end << ")\n"; else // start < 0 && end < 0 : -size <= end <= start < 0 indent(ctx, k + 6) << "if (i >= " << end << " && i >= -" << v << ".size())\n"; indent(ctx, k + 6) << "{\n"; indent(ctx, k + 8) << p << " = &" << v << "[i];\n"; indent(ctx, k + 8) << "break;\n"; indent(ctx, k + 6) << "}\n"; indent(ctx, k + 6) << "else\n"; indent(ctx, k + 8) << "k = " << 2*subs+1 << ";\n"; } else { if (explain) indent(ctx, k + 6) << "// if current node " << v << " is an array with element [" << start << "] ...\n"; indent(ctx, k + 6) << "k = " << 2*subs+1 << ";\n"; indent(ctx, k + 6) << "if (" << v << ".has(" << start << "))\n"; indent(ctx, k + 6) << "{\n"; indent(ctx, k + 8) << p << " = &" << v << "[" << start << "];\n"; indent(ctx, k + 8) << "break;\n"; indent(ctx, k + 6) << "}\n"; } if (*jpath != ',') break; ++jpath; } if (subs == 0 && *jpath == ']') { fprintf(stderr, "jsoncpp: JSONPath empty '[]' at ...->%s\n\n", jpath); exit(EXIT_FAILURE); } if (*jpath != ']') { fprintf(stderr, "jsoncpp: JSONPath ']' expected at ...->%s\n\n", jpath); exit(EXIT_FAILURE); } ++jpath; if (subs == 1) // path: [x]... with x a name or index or [start]:[end][:step] range { if (!code.empty()) { if (explain) indent(ctx, k) << "// if current node " << v << " is an array/struct with field/element [(" << code << ")] then match " << jpath << "\n"; indent(ctx, k) << "value& v = " << v << ";\n"; indent(ctx, k) << "if ((j = v.nth(" << code << ")) >= 0)\n"; indent(ctx, k) << "{\n"; indent(ctx, k + 2) << "value& r = v[j];\n"; v = "r"; path_gen_cpp(ctx, jpath, v, k + 2, throwup); indent(ctx, k) << "}\n"; } else if (!name.empty()) { if (optimal) { if (explain) indent(ctx, k) << "// if current node " << v << " is a struct with field '" << name << "' then match " << jpath << "\n"; indent(ctx, k) << "if ((j = " << v << ".nth(" << putstr(name) << ")) >= 0)\n"; indent(ctx, k) << "{\n"; if (v[0] == 'r') { indent(ctx, k + 2) << "value& s = " << v << "[j];\n"; v = "s"; } else { indent(ctx, k + 2) << "value& r = " << v << "[j];\n"; v = "r"; } path_gen_cpp(ctx, jpath, v, k + 2, throwup); indent(ctx, k) << "}\n"; } else { indent(ctx, k) << "if (" << v << ".has(" << putstr(name) << "))\n"; indent(ctx, k) << "{\n"; v.append("[").append(putstrname(name.c_str())).append("]"); path_gen_cpp(ctx, jpath, v, k + 2, throwup); indent(ctx, k) << "}\n"; } } else if (step > 0) { if (explain) indent(ctx, k) << "// if current node " << v << " is an array then iterate from " << start << " to " << end << " by " << step << " to match " << jpath << "\n"; indent(ctx, k) << "if (" << v << ".is_array())\n"; indent(ctx, k) << "{\n"; if (start >= 0 && end < 0) { indent(ctx, k + 2) << "int k = " << v << ".size()-" << -end << ";\n"; indent(ctx, k + 2) << "for (int i = " << start << "; i <= k; i += " << step << ")\n"; } else if (start >= 0 && end >= 0) { indent(ctx, k + 2) << "int k = (" << end << " < " << v << ".size() ? " << end << " : " << v << ".size()-1);\n"; indent(ctx, k + 2) << "for (int i = " << start << "; i <= k; i += " << step << ")\n"; } else // start < 0 && end < 0 { indent(ctx, k + 2) << "int k = (" << start << " >= -" << v << ".size() ? " << start << " : -" << v << ".size());\n"; indent(ctx, k + 2) << "for (int i = k; i <= " << end << "; i += " << step << ")\n"; } indent(ctx, k + 2) << "{\n"; if (v[0] == 'r') { indent(ctx, k + 4) << "value& s = " << v << "[i];\n"; v = "s"; } else { indent(ctx, k + 4) << "value& r = " << v << "[i];\n"; v = "r"; } path_gen_cpp(ctx, jpath, v, k + 4, throwup); indent(ctx, k + 2) << "}\n"; indent(ctx, k) << "}\n"; } else if (step < 0) { if (explain) indent(ctx, k) << "// if current node " << v << " is an array then iterate from " << start << " to " << end << " by " << step << " to match " << jpath << "\n"; indent(ctx, k) << "if (" << v << ".is_array())\n"; indent(ctx, k) << "{\n"; if (start < 0 && end >= 0) { indent(ctx, k + 2) << "int k = " << v << ".size()-" << -start << ";\n"; indent(ctx, k + 2) << "for (int i = k; i >= " << end << "; i -= " << -step << ")\n"; } else if (start >= 0 && end >= 0) { indent(ctx, k + 2) << "int k = (" << start << " < " << v << ".size() ? " << start << " : " << v << ".size()-1);\n"; indent(ctx, k + 2) << "for (int i = k; i >= " << end << "; i -= " << -step << ")\n"; } else // start < 0 && end < 0 { indent(ctx, k + 2) << "int k = (" << end << " >= -" << v << ".size() ? " << end << " : -" << v << ".size());\n"; indent(ctx, k + 2) << "for (int i = " << start << "; i >= k; i -= " << -step << ")\n"; } indent(ctx, k + 2) << "{\n"; if (v[0] == 'r') { indent(ctx, k + 4) << "value& s = " << v << "[i];\n"; v = "s"; } else { indent(ctx, k + 4) << "value& r = " << v << "[i];\n"; v = "r"; } path_gen_cpp(ctx, jpath, v, k + 4, throwup); indent(ctx, k + 2) << "}\n"; indent(ctx, k) << "}\n"; } else { if (explain) indent(ctx, k) << "// if current node " << v << " is an array with element [" << start << "] then match " << jpath << "\n"; indent(ctx, k) << "if (" << v << ".has(" << start << "))\n"; indent(ctx, k) << "{\n"; v.append("[").append(soap_int2s(ctx, start)).append("]"); path_gen_cpp(ctx, jpath, v, k + 2, throwup); indent(ctx, k) << "}\n"; } } else { indent(ctx, k + 4) << "default:\n"; indent(ctx, k + 6) << "continue;\n"; indent(ctx, k + 2) << "}\n"; if (explain) indent(ctx, k + 2) << "// ... then match " << jpath << "\n"; path_gen_cpp(ctx, jpath, u, k + 2, throwup); indent(ctx, k) << "} while (k <= " << 2*subs << ");\n"; } } } else if (*jpath == '?') // path: P?Q means all values P such that Q (has at least one result) { if (throwup) { fprintf(stderr, "jsoncpp: JSONPath cannot nest '?' and '!' ...->%s\n\n", jpath); exit(EXIT_FAILURE); } ++jpath; if (explain) indent(ctx, k) << "// value of current node " << v << " if its descendants match " << jpath << "\n"; indent(ctx, k) << "try\n"; indent(ctx, k) << "{\n"; std::string u = v; path_gen_cpp(ctx, jpath, v, k + 2, true); indent(ctx, k) << "}\n"; indent(ctx, k) << "catch (const bool&)\n"; indent(ctx, k) << "{\n"; path_exec_cpp(ctx, u, k + 2); indent(ctx, k) << "}\n"; } else if (*jpath == '!') // path: P!Q means all values P such that not Q (has no results) { if (throwup) { fprintf(stderr, "jsoncpp: JSONPath cannot nest '?' and '!' ...->%s\n\n", jpath); exit(EXIT_FAILURE); } ++jpath; if (explain) indent(ctx, k) << "// value of current node " << v << " if its descendants do not match " << jpath << "\n"; indent(ctx, k) << "try\n"; indent(ctx, k) << "{\n"; std::string u = v; path_gen_cpp(ctx, jpath, v, k + 2, true); indent(ctx, k + 2) << "throw false;\n"; indent(ctx, k) << "}\n"; indent(ctx, k) << "catch (const bool& k)\n"; indent(ctx, k) << "{\n"; indent(ctx, k + 2) << "if (k == false)\n"; path_exec_cpp(ctx, u, k + 4); indent(ctx, k) << "}\n"; } else if (*jpath == '*') // path: *... { ++jpath; if (explain) indent(ctx, k) << "// iterate over current array/struct node " << v << " to match " << jpath << "\n"; indent(ctx, k) << "value::iterator k = " << v << ".end();\n"; indent(ctx, k) << "for (value::iterator i = " << v << ".begin(); i != k; ++i)\n"; indent(ctx, k) << "{\n"; indent(ctx, k + 2) << "value& r = " << v << "*i;\n"; v = "r"; path_gen_cpp(ctx, jpath, v, k + 2, throwup); indent(ctx, k) << "}\n"; } else if (!*jpath) { if (throwup) indent(ctx, k) << "throw true;\n"; else path_exec_cpp(ctx, v, k); } else // path: name... { std::string name = getname(&jpath); if (explain) indent(ctx, k) << "// if current node " << v << " is a struct with field '" << name << "' then match " << jpath << "\n"; if (optimal) { indent(ctx, k) << "if ((j = " << v << ".nth(" << putstr(name) << ")) >= 0)\n"; indent(ctx, k) << "{\n"; if (v[0] == 'r') { indent(ctx, k + 2) << "value& s = " << v << "[j];\n"; v = "s"; } else { indent(ctx, k + 2) << "value& r = " << v << "[j];\n"; v = "r"; } path_gen_cpp(ctx, jpath, v, k + 2, throwup); indent(ctx, k) << "}\n"; } else { indent(ctx, k) << "if (" << v << ".has(" << putstr(name) << "))\n"; indent(ctx, k) << "{\n"; v.append("[").append(putstrname(name.c_str())).append("]"); path_gen_cpp(ctx, jpath, v, k + 2, throwup); indent(ctx, k) << "}\n"; } } } static void path_exec_cpp(struct soap *ctx, std::string& v, int k) { if (jcode) { indent(ctx, k) << "value& v = " << v << ";\n"; indent(ctx, k) << jcode << "\n"; } else { indent(ctx, k) << "QUERY_YIELD(" << v << ");\n"; } } //////////////////////////////////////////////////////////////////////////////// // // Misc // //////////////////////////////////////////////////////////////////////////////// static std::ostream& indent(soap *ctx, int k) { *ctx->os << std::setw(k) << "" << std::setw(0); return *ctx->os; } static std::string gen_ident(const std::string& lhs, const char *name) { std::string id = lhs; id.append("_"); for (const char *s = name; *s; name = s) { while (isalnum(*s)) s++; id.append(name, s - name); if (*s) s++; } return id; } static std::string gen_counter(int k) { std::string id = "i"; char tmp[2]; if (k <= 9) k += '0'; else if (k <= 36) k += 'a' - 10; else k += 'A' - 36; tmp[0] = k; tmp[1] = '\0'; id.append(tmp); return id; } static std::string putstrname(const char *name) { std::stringstream ss; ss << putstr(name); return ss.str(); } static std::string putname(const char *name) { const char *s; for (s = name; isalnum(*s) || *s == '_'; s++) continue; if (!*s) return name; return putstrname(name); } static std::string getname(const char **jpath) { const char *s = *jpath; const char *t = s; if (*t == '\'' || *t == '"') { while (*++t && *t != *s) if (*t == '\\' && *(t+1)) ++t; if (!*t) { fprintf(stderr, "jsoncpp: JSONPath closing quote expected at ...->%s\n\n", s); exit(EXIT_FAILURE); } *jpath = ++t; return std::string(s + 1, t - s - 2); } while (*t && !ispunct(*t) && !isspace(*t)) ++t; if (t == s) { fprintf(stderr, "jsoncpp: JSONPath empty field name at ...->%s\n\n", s); exit(EXIT_FAILURE); } *jpath = t; return std::string(s, t - s); } gsoap-2.8.28/gsoap/samples/xml-rpc-json/xml-rpc.h0000644000175000017500000005124612653650160021141 0ustar ellertellert/* xml-rpc.h XML-RPC binding for C and C++ -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2012, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //////////////////////////////////////////////////////////////////////////////// // // C/C++ XML-RPC/JSON API Value Allocation/Initialization // //////////////////////////////////////////////////////////////////////////////// /// C/C++ function returns a pointer to a new value extern struct value *new_value(struct soap *soap); /// C/C++ function to init or reset a value, returns a pointer to this value extern struct value *init_value(struct soap *soap, struct value *v); //////////////////////////////////////////////////////////////////////////////// // // C++ XML-RPC/JSON API Array, Struct, and Parameter Iterators // //////////////////////////////////////////////////////////////////////////////// #include "xml-rpc-iters.h" // deferred for inclusion by C++ compiler /// C++ external iterator class for values extern class value_iterator; /// C++ external iterator class for values extern class value_const_iterator; /// C++ external iterator class for structs /// C++ external iterator class for structs extern class _struct_iterator; /// C++ external iterator class for structs extern class _struct_const_iterator; /// C++ external iterator class for arrays extern class _array_iterator; /// C++ external iterator class for arrays extern class _array_const_iterator; /// C++ only: declare external iterator class for parameters extern class params_iterator; /// C++ only: declare external iterator class for parameters extern class params_const_iterator; //////////////////////////////////////////////////////////////////////////////// // // C/C++ XML-RPC and JSON Types // //////////////////////////////////////////////////////////////////////////////// /// Scalar <boolean> element with values 0 (false) or 1 (true) typedef char _boolean; /// Scalar <double> element with double floating point typedef double _double; /// Scalar <i4> element with 32 bit integer typedef int _i4; /// Scalar <int> element with 64 bit integer typedef LONG64 _int; /// Scalar <string> element typedef char* _string; /// Scalar <dateTime.iso8601> element with ISO8601 date and time formatted string typedef char* _dateTime_DOTiso8601; /// Represents the <base64> binary data element struct _base64 { // C++ function members, not available in C (when using stdsoap2 -c) public: _base64(); _base64(struct soap*); _base64(struct soap*, int, unsigned char*); int size() const; ///< byte size of data unsigned char* ptr(); ///< pointer to data void size(int); ///< set byte size of data void ptr(unsigned char*);///< set pointer to data // serializable content public: unsigned char* __ptr; ///< pointer to raw binary data block int __size; ///< size of raw binary data block }; /// Represents the <struct> record structure element struct _struct { // C++ function members, not available in C (when using stdsoap2 -c) public: typedef _struct_iterator iterator; typedef _struct_const_iterator const_iterator; _struct(); _struct(struct soap*); _struct(struct soap*, int); extern bool empty() const; ///< true if struct is empty int size() const; ///< number of accessors in struct struct value& operator[](int);///< struct index (negative to get from end) struct value& operator[](const char*);///< struct accessor struct value& operator[](const wchar_t*);///< struct accessor _struct_iterator begin() const; ///< struct iterator begin _struct_iterator end() const; ///< struct iterator end // serializable content public: int __size; ///< number of members struct member* member; ///< pointer to member array struct soap* soap; ///< ref to soap struct that manages this type }; /// Represents the <data> element struct data { // serializable content public: int __size; ///< number of array elements struct value* value; ///< pointer to array elements }; /// Represents the <array> array of values element struct _array { // C++ function members, not available in C (when using stdsoap2 -c) public: typedef _array_iterator iterator; typedef _array_const_iterator const_iterator; _array(); _array(struct soap*); _array(struct soap*, int); extern bool empty() const; ///< true if array is empty int size() const; ///< number of array elements void size(int); ///< (re)set number of array elements struct value& operator[](int);///< array index (negative to get from end) _array_iterator begin() const; ///< array iterator begin _array_iterator end() const; ///< array iterator end // serializable content public: struct data data; ///< data with values struct soap* soap; ///< ref to soap struct that manages this type }; /// Represents the <value> container element /// The <value> element contains either string data stored in __any or an /// other type of data stored in a subelement. In case of a subelement, the /// __type member indicates the type of data pointed to by the ref member. /// For example, when __type = SOAP_TYPE__int then the ref points to a LONG64, /// when __type = SOAP_TYPE__string (char*)ref is a string. struct value { // C++ function members, not available in C (when using stdsoap2 -c) public: typedef value_iterator iterator; typedef value_const_iterator const_iterator; value(); value(struct soap*); value(struct soap*, extern bool); value(struct soap*, _i4); value(struct soap*, _int); value(struct soap*, _double); value(struct soap*, const char*); value(struct soap*, const std::string&); value(struct soap*, const wchar_t*); value(struct soap*, const std::wstring&); value(struct soap*, ULONG64); value(struct soap*, const struct _array&); value(struct soap*, const struct _struct&); value(struct soap*, const struct _base64&); operator extern bool() const; operator _i4() const; operator _int() const; operator _double() const; operator char*() const; operator std::string() const; operator wchar_t*() const; operator std::wstring() const; operator ULONG64() const; operator struct _array&(); operator const struct _array&() const; operator struct _struct&(); operator const struct _struct&() const; operator struct _base64&(); operator const struct _base64&() const; struct value& operator[](int); ///< array/struct index (negative to get from end) struct value& operator[](const char*); ///< struct access struct value& operator[](const std::string&); ///< struct access struct value& operator[](const wchar_t*); ///< struct access struct value& operator[](const std::wstring&); ///< struct access extern bool operator=(extern bool); _i4 operator=(_i4); _int operator=(_int); _double operator=(_double); ULONG64 operator=(ULONG64); const char* operator=(const char*); char* operator=(char*); char* operator=(const std::string&); const char* operator=(const wchar_t*); char* operator=(wchar_t*); char* operator=(const std::wstring&); struct _array& operator=(const struct _array&); struct _struct& operator=(const struct _struct&); struct _base64& operator=(const struct _base64&); extern void size(int); ///< set/allocate size of array extern int size() const; ///< returns array/struct size or 0 extern bool empty() const; ///< true if empty array or struct extern int nth(int) const; ///< returns nth index if index is in bounds, < 0 otherwise extern int nth(const char*) const; ///< returns nth index of name in struct, < 0 otherwise extern int nth(const wchar_t*) const; ///< returns nth index of name in struct, < 0 otherwise extern bool has(int) const; ///< true if array index is in bounds extern bool has(const char*) const; ///< true if struct has name as a key extern bool has(const wchar_t*) const; ///< true if struct has name as a key extern bool is_null() const; ///< true if value is not set (JSON null) extern bool is_bool() const; ///< true if value is Boolean type extern bool is_false() const; ///< true if value is Boolean false extern bool is_true() const; ///< true if value is Boolean true extern bool is_int() const; ///< true if value is int type extern bool is_double() const; ///< true if value is double type extern bool is_string() const; ///< true if value is string type extern bool is_dateTime() const; ///< true if value is dateTime extern bool is_array() const; ///< true if value is array type extern bool is_struct() const; ///< true if value is struct type extern bool is_base64() const; ///< true if value is base64 type value_iterator begin(); ///< value iterator begin value_iterator end(); ///< value iterator end // serializable content public: int __type 0; ///< optional SOAP_TYPE_X, where X is a type name void* ref; ///< ref to data _string __any; ///< <value> string content in XML-RPC (not JSON), if any struct soap* soap; ///< ref to soap struct that manages this type }; /// Represents the <member> element of a <struct> struct member { // serializable content public: char* name; ///< struct accessor name struct value value; ///< struct accessor value }; //////////////////////////////////////////////////////////////////////////////// // // C/C++ XML-RPC API Method Parameters and Call Objects // //////////////////////////////////////////////////////////////////////////////// /// Represents the <params> of a <methodCall> request and response struct params { // C++ function members, not available in C (when using stdsoap2 -c) public: typedef params_iterator iterator; typedef params_const_iterator const_iterator; params(); params(struct soap*); params(struct soap*, int); extern bool empty() const; ///< true if no parameters int size() const; ///< number of parameters struct value& operator[](int);///< parameter index (negative to get from end) params_iterator begin() const; ///< parameter accessor iterator begin params_iterator end() const; ///< parameter accessor iterator end // serializable content public: int __size; ///< number of parameters struct param* param; ///< pointer to array of parameters struct soap* soap; ///< ref to soap struct that manages this type }; /// Represents a <param> of the <params> of a <methodCall> struct param { // serializable content public: struct value value; ///< parameter value }; /// Represents the <methodResponse> element with response <params> and <fault> struct methodResponse { // C++ function members, not available in C (when using stdsoap2 -c) public: methodResponse(); methodResponse(struct soap*); struct value& operator[](int);///< response parameter accessor index struct value& get_fault(void);///< get fault, if set struct value& set_fault(const char*);///< set fault struct value& set_fault(struct value&);///< set fault int recv(); ///< receive response int send(); ///< send response // serializable content public: struct params* params; ///< response return parameters, if any struct fault* fault; ///< response fault, if any struct soap* soap; ///< ref to soap struct that manages this type }; /// Represents the <methodCall> element with <methodName> and request <params> for remote invocation struct methodCall { // private state info private: char* methodEndpoint; ///< XML-RPC endpoint struct methodResponse*methodResponse; ///< holds the response after the call // C++ function members, not available in C (when using stdsoap2 -c) public: methodCall(); methodCall(struct soap*); methodCall(struct soap*, const char *endpoint, const char *methodname); ///< instantiate with endpoint and method name struct value& operator[](int);///< method parameter accessor index struct params& operator()(); ///< method invocation struct params& operator()(const struct params&); ///< method invocation with param list struct params& response(); ///< get last response struct value& fault(); ///< fault value of response const char* name() const; ///< get method name int error() const; ///< gSOAP error code int recv(); ///< receive call int send(); ///< send call // serializable content public: char* methodName; ///< name of the method struct params params; ///< input request parameters struct soap* soap; ///< ref to soap struct that manages this type }; /// Represents the <fault> container element with a value struct fault { // serializable content public: struct value value; ///< value of the fault }; //////////////////////////////////////////////////////////////////////////////// // // C XML-RPC/JSON API Functions // //////////////////////////////////////////////////////////////////////////////// /// C function returns pointer to Boolean, coerces v to Boolean if needed extern _boolean *bool_of(struct value *v); /// C function returns pointer to int, coerces v to int if needed extern _int *int_of(struct value *v); /// C function returns pointer to double, coerces v to double if needed extern _double *double_of(struct value *v); /// C function returns pointer to string (pointer to char * to set or get), coerces v to string if needed extern const char **string_of(struct value *v); /// C function returns pointer to string of ISO 8601, coerces v to string if needed (get time with soap_s2dateTime and set time with soap_dateTime2s) extern const char **dateTime_of(struct value *v); /// C function returns pointer to base64 struct, coerces v to base64 struct if needed extern struct _base64 *base64_of(struct value *v); /// C function returns pointer to member value of a struct, coerces v to struct if needed extern struct value *value_at(struct value *v, const char *s); /// C function returns pointer to member value of a struct, coerces v to struct if needed extern struct value *value_atw(struct value *v, const wchar_t *s); /// C function returns the nth index of a name in a struct, < 0 otherwise extern int nth_at(struct value *v, const char *s); /// C function returns the nth index of a name in a struct, < 0 otherwise extern int nth_atw(struct value *v, const wchar_t *s); /// C function returns the nth index if an nth index in the array exists, < 0 otherwise extern int nth_nth(struct value *v, int n); /// C function returns pointer to nth member (name and value) of a struct extern struct member *nth_member(struct value *v, int n); /// C function returns pointer to array element value at index n, coerces v to array with value at n if needed extern struct value *nth_value(struct value *v, int n); /// C function returns true if value is not set or assigned (JSON null) extern _boolean is_null(struct value *v); /// C function returns true if value is a 32 or a 64 bit int extern _boolean is_int(struct value *v); /// C function returns true if value is a 64 bit double floating point extern _boolean is_double(struct value *v); /// C function returns true if value is a string extern _boolean is_string(struct value *v); /// C function returns true if value is a Boolean "true" or "false" value extern _boolean is_bool(struct value *v); /// C function returns true if value is Boolean "true" extern _boolean is_true(struct value *v); /// C function returns true if value is Boolean "false" extern _boolean is_false(struct value *v); /// C function returns true if array of values extern _boolean is_array(struct value *v); /// C function returns true if structure, a.k.a. a JSON object extern _boolean is_struct(struct value *v); /// C function returns true if ISO 8601, always false for received JSON extern _boolean is_dateTime(struct value *v); /// C function returns true if base64, always false for received JSON extern _boolean is_base64(struct value *v); /// C function to create an empty struct extern void set_struct(struct value *v); /// C function set/allocate size of array extern void set_size(struct value *v, int n); /// C function returns the size of an array or struct extern int has_size(struct value *v); //////////////////////////////////////////////////////////////////////////////// // // C XML-RPC API Method Parameters and Call Function // //////////////////////////////////////////////////////////////////////////////// /// C function returns pointer to new parameters for XML-RPC methodCall extern struct params *new_params(struct soap *soap); /// C function to clear parameters, returns a pointer to the empty parameters extern struct params *init_params(struct soap *soap, struct params *p); /// C function returns pointer to parameter value at index n, creates new parameter if needed extern struct value *nth_param(struct params *p, int n); /// C function to invoke XML-RPC methodCall on endpoint given methodCall m populates methodResponse r, returns SOAP_OK or error extern int call_method(struct soap *soap, const char *endpoint, const char *methodName, struct params *p, struct methodResponse *r); gsoap-2.8.28/gsoap/samples/xml-rpc-json/Makefile.am0000644000175000017500000000164712653650156021447 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 noinst_PROGRAMS = jsoncpp json-GitHub xml-rpc-currentTime SOAPHEADER = xml-rpc.h include ../Makefile.defines include ../Makefile.cpp_rules SOAP_NS = $(SOAP_NS_DEF) jsoncpp_SOURCES = jsoncpp.cpp xml-rpc.cpp json.cpp $(SOAPHEADER) $(SOAP_CPP_CORE) jsoncpp_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) json_GitHub_CPPFLAGS = -DWITH_OPENSSL -DWITH_GZIP json_GitHub_SOURCES = json-GitHub.cpp xml-rpc.cpp json.cpp $(SOAPHEADER) $(SOAP_CPP_CORE) json_GitHub_LDADD = $(SOAP_CPP_LIB_SSL) $(SAMPLE_EXTRA_LIBS) $(SAMPLE_SSL_LIBS) xml_rpc_currentTime_SOURCES = xml-rpc-currentTime.cpp xml-rpc.cpp json.cpp $(SOAPHEADER) $(SOAP_CPP_CORE) xml_rpc_currentTime_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) gsoap-2.8.28/gsoap/samples/xml-rpc-json/xml-rpc-currentTimeServer.cpp0000644000175000017500000000756112653650156025170 0ustar ellertellert/* xml-rpc-currentTimeServer.cpp XML-RPC currenTime server (C++ version) CGI or stand-alone multi-threaded server Returns XML-RPC message with current time to client. Compile: soapcpp2 xml-rpc.h c++ -o xml-rpc-currentTimeServer xml-rpc-currentTimeServer.cpp xml-rpc.cpp xml-rpc-io.cpp stdsoap2.cpp soapC.cpp Install as CGI on Web server Or run as stand-alone server (e.g. on port 18000): ./xml-rpc-currentTimeServer 18000 -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" #include #ifdef _POSIX_THREADS #include // use Pthreads #endif #define BACKLOG (100) // Max. request backlog #define MAX_THR (8) // Max. threads to serve requests using namespace std; int serve_request(soap*); int main(int argc, char **argv) { soap *ctx = soap_new1(SOAP_IO_KEEPALIVE | SOAP_XML_INDENT); ctx->send_timeout = 10; // 10 sec ctx->recv_timeout = 10; // 10 sec if (argc < 2) return serve_request(ctx); int port = atoi(argv[1]); #ifdef _POSIX_THREADS pthread_t tid; #endif if (!soap_valid_socket(soap_bind(ctx, NULL, port, BACKLOG))) { soap_print_fault(ctx, stderr); exit(1); } for (;;) { if (!soap_valid_socket(soap_accept(ctx))) { soap_print_fault(ctx, stderr); } else { #ifdef _POSIX_THREADS pthread_create(&tid, NULL, (void*(*)(void*))serve_request, (void*)soap_copy(ctx)); #else serve_request(ctx); #endif } } soap_free(ctx); return 0; } int serve_request(soap* ctx) { methodCall m(ctx); #ifdef _POSIX_THREADS pthread_detach(pthread_self()); #endif // HTTP keep-alive max number of iterations unsigned int k = ctx->max_keep_alive; do { if (ctx->max_keep_alive > 0 && !--k) ctx->keep_alive = 0; if (m.recv() != SOAP_OK) soap_print_fault(ctx, stderr); else { methodResponse r(ctx); if (!strcmp(m.name(), "currentTime.getCurrentTime")) // method name matches: first parameter of response is time r[0] = time(0); else // otherwise, set fault r.set_fault("Wrong method"); if (r.send() != SOAP_OK) soap_print_fault(ctx, stderr); } // close (keep-alive may keep socket open when client supports it) soap_closesock(ctx); } while (ctx->keep_alive); int err = ctx->error; // clean up soap_destroy(ctx); soap_end(ctx); #ifdef _POSIX_THREADS // free the ctx copy for this thread soap_free(ctx); #endif return err; } /* Don't need a namespace table. We put an empty one here to avoid link errors */ struct Namespace namespaces[] = { {NULL, NULL} }; gsoap-2.8.28/gsoap/samples/xml-rpc-json/xml-rpc-json.cpp0000644000175000017500000001053612653650156022445 0ustar ellertellert/* xml-rpc-json.cpp XML-RPC <=> JSON serialization example Requires xml-rpc.h, xml-rpc.cpp, json.h, and json.cpp Compile: soapcpp2 -CSL xml-rpc.h c++ -o xml-rpc-json xml-rpc-json.cpp xml-rpc.cpp json.cpp stdsoap2.cpp soapC.cpp To put JSON types and operations in a C++ namespace, compile: soapcpp2 -qjson -CSL xml-rpc.h soapcpp2 -CSL -penv env.h c++ -DJSON_NAMESPACE -o xml-rpc-json xml-rpc-json.cpp xml-rpc.cpp json.cpp stdsoap2.cpp jsonC.cpp envC.cpp -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "json.h" #include using namespace std; #ifdef JSON_NAMESPACE using namespace json; #endif int main() { // set up context soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT); // create a value value v(ctx); // create an input stream from a given string with JSON content stringstream in("[ [1,\"2\",3.14, true], {\"name\": \"gsoap\", \"major\": 2.8, \"©\": 2015} ]"); // parse JSON content in >> v; if (v.soap->error) cerr << "Error reading JSON\n"; // write v in XML-RPC format to cout (soap_write_value is soapcpp2-generated) ctx->os = &cout; soap_write_value(ctx, &v); if (v.soap->error) cerr << "Error writing XML-RPC\n"; // assumes writes can fail if deemed critical // let's change some of v's values: v[0][0] = (char*)v[0][0]; // convert int 1 to string "1" v[0][1] = (int)v[0][1]; // convert string "2" to 32 bit int = 2 v[0][2] = (LONG64)v[0][2]; // truncate 3.14 to 64 bit int = 3 v[0].size(3); // reset size to 3 to remove last entry v[1]["name"] = "gSOAP"; v[1]["major"] = 2.9; v[1][L"©"] = 2016; v[1]["released"] = false; // v[2] = deliberately skipped, which will show up as null v[3] = (ULONG64)time(0); v[4] = 123; // see below v[5] = "123"; // see below v[6] = 456; // see below v[7] = v[0] + v[4]; // array concat: copy array v[0] to v[7] extended with one element value of v[4] // find all values 123 in v[] and change to 456, increment all other ints, // string "123" is also changed to 456, since we deliberately do not guard // the change by a type check for (value::iterator i = v.begin(); i != v.end(); ++i) { if ((int)*i == 123) *i = 456; else if (i->is_int()) *i = (int)*i + 1; } // print index, name, and value of structure v[1] for (value::const_iterator i = v[1].begin(); i != v[1].end(); ++i) cout << "[" << i.index() << "] " << i.name() << ": " << *i << endl; // display in JSON format using stream ops defined in json.h/.cpp API cout << endl << "JSON output of modified value:" << endl << v << endl; // display in XML-RPC format using soap_write_value() cout << endl << "XML-RPC output of modified value:" << endl; ctx->os = &cout; soap_write_value(ctx, &v); cout << endl; // clean up soap_destroy(ctx); soap_end(ctx); soap_free(ctx); return 0; } /* Don't need a namespace table. We put an empty one here to avoid link errors */ struct Namespace namespaces[] = { {NULL, NULL} }; gsoap-2.8.28/gsoap/samples/xml-rpc-json/json.c0000644000175000017500000006034112653650156020524 0ustar ellertellert/* json.c[pp] JSON C/C++ API For more information please visit: http://www.genivia.com/doc/xml-rpc-json/html/ -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "json.h" #ifdef JSON_NAMESPACE # define SOAP_TYPE__boolean SOAP_TYPE_json__boolean # define SOAP_TYPE__i4 SOAP_TYPE_json__i4 # define SOAP_TYPE__int SOAP_TYPE_json__int # define SOAP_TYPE__double SOAP_TYPE_json__double # define SOAP_TYPE__dateTime_DOTiso8601 SOAP_TYPE_json__dateTime_DOTiso8601 # define SOAP_TYPE__string SOAP_TYPE_json__string # define SOAP_TYPE__array SOAP_TYPE_json__array # define SOAP_TYPE__struct SOAP_TYPE_json__struct # define SOAP_TYPE__base64 SOAP_TYPE_json__base64 #endif #ifdef JSON_NAMESPACE namespace json { #endif int json_error(struct soap *soap, struct value *v) { if (soap->error && v) { const char *s = *soap_faultstring(soap); const char *t = soap_check_faultdetail(soap); /* set JSON error property (Google JSON Style Guide) */ #ifdef __cplusplus (*v)["error"]["code"] = soap->error; if (s) { (*v)["error"]["message"] = s; if (t) (*v)["error"]["errors"][0]["message"] = t; } #else *int_of(value_at(value_at(v, "error"), "code")) = soap->error; if (s) { *string_of(value_at(value_at(v, "error"), "message")) = soap_strdup(soap, s); if (t) *string_of(value_at(nth_value(value_at(value_at(v, "error"), "errors"), 0), "message")) = soap_strdup(soap, t); } #endif } return soap->error; } int json_write(struct soap *soap, const struct value *v) { if (soap_begin_send(soap) || json_send(soap, v) || soap_end_send(soap)) return soap->error; return SOAP_OK; } int json_send(struct soap *soap, const struct value *v) { static const char *json_indent_string = ",\n "; int i, n = 1; if (!v) return SOAP_OK; switch (v->__type) { case SOAP_TYPE__array: if ((soap->mode & SOAP_XML_INDENT)) n = 2 * (++soap->level % 40) + 2; if (soap_send_raw(soap, "["/*"]"*/, 1)) return soap->error; if (v->ref) { for (i = 0; i < ((struct _array*)v->ref)->data.__size; i++) { if (soap_send_raw(soap, json_indent_string + (i == 0), n - (i == 0))) return soap->error; if (json_send(soap, &(((struct _array*)v->ref)->data.value)[i])) return soap->error; } } if ((soap->mode & SOAP_XML_INDENT)) { if (i && soap_send_raw(soap, json_indent_string + 1, n - 3)) return soap->error; soap->level--; } return soap_send_raw(soap, /*"["*/"]", 1); case SOAP_TYPE__boolean: if (*(_boolean*)v->ref == 1) return soap_send_raw(soap, "true", 4); return soap_send_raw(soap, "false", 5); case SOAP_TYPE__double: return soap_send(soap, soap_double2s(soap, (double)*(_double*)v->ref)); case SOAP_TYPE__i4: return soap_send(soap, soap_int2s(soap, (int)*(_i4*)v->ref)); case SOAP_TYPE__int: return soap_send(soap, soap_LONG642s(soap, (LONG64)*(_int*)v->ref)); case SOAP_TYPE__string: case SOAP_TYPE__dateTime_DOTiso8601: return json_send_string(soap, (const char*)v->ref); case SOAP_TYPE__base64: if (soap_send_raw(soap, "\"", 1)) return soap->error; if (v->ref && soap_putbase64(soap, ((struct _base64*)v->ref)->__ptr, ((struct _base64*)v->ref)->__size)) return soap->error; return soap_send_raw(soap, "\"", 1); case SOAP_TYPE__struct: if ((soap->mode & SOAP_XML_INDENT)) n = 2 * (++soap->level % 40) + 2; if (soap_send_raw(soap, "{"/*"}"*/, 1)) return soap->error; if (v->ref) { for (i = 0; i < ((struct _struct*)v->ref)->__size; i++) { if (soap_send_raw(soap, json_indent_string + (i == 0), n - (i == 0))) return soap->error; if (json_send_string(soap, (((struct _struct*)v->ref)->member)[i].name) || soap_send_raw(soap, ": ", 1 + (n > 1)) || json_send(soap, &(((struct _struct*)v->ref)->member)[i].value)) return soap->error; } } if ((soap->mode & SOAP_XML_INDENT)) { if (i && soap_send_raw(soap, json_indent_string + 1, n - 3)) return soap->error; soap->level--; } return soap_send_raw(soap, /*"{"*/"}", 1); default: if (v->__any) return json_send_string(soap, v->__any); return soap_send_raw(soap, "null", 4); } return SOAP_OK; } int json_read(struct soap *soap, struct value *v) { soap_default_value(soap, v); if (soap_begin_recv(soap) || json_recv(soap, v) || soap_end_recv(soap)) return json_error(soap, v); return SOAP_OK; } int json_recv(struct soap *soap, struct value *v) { soap_wchar c; if (!v) return SOAP_OK; v->__type = 0; v->ref = NULL; v->__any = NULL; v->soap = soap; while (((c = soap_getchar(soap)) > 0 && c <= 0x20) || c == 0xA0) continue; switch (c) { case EOF: return soap->error = SOAP_EOF; case '{'/*'}'*/: { struct value s; #ifdef __cplusplus if (!(v->ref = (void*)soap_new__struct(soap))) return soap->error = SOAP_EOM; #else if (!(v->ref = (void*)soap_malloc(soap, sizeof(struct _struct)))) return soap->error = SOAP_EOM; #endif soap_default__struct(soap, (struct _struct*)v->ref); v->__type = SOAP_TYPE__struct; while (((c = soap_getchar(soap)) > 0 && c <= 0x20) || c == 0xA0) continue; if (c == /*'{'*/'}') return SOAP_OK; soap_unget(soap, c); for (;;) { if (json_recv(soap, &s)) return soap->error; if (s.__type != SOAP_TYPE__string) return soap_set_sender_error(soap, "field name expected", (const char*)s.ref, SOAP_SYNTAX_ERROR); while (((c = soap_getchar(soap)) > 0 && c <= 0x20) || c == 0xA0) continue; if (c != ':') return soap_set_sender_error(soap, "':' expected", (const char*)s.ref, SOAP_SYNTAX_ERROR); #ifdef __cplusplus if (json_recv(soap, v->operator[]((const char*)s.ref))) return soap->error; #else if (json_recv(soap, value_at(v, (const char*)s.ref))) return soap->error; #endif while (((c = soap_getchar(soap)) > 0 && c <= 0x20) || c == 0xA0) continue; if (c == /*'{'*/'}') break; if ((int)c == EOF) return soap->error = SOAP_EOF; if (c != ',') return soap_set_sender_error(soap, "closing '}' or comma expected", NULL, SOAP_SYNTAX_ERROR); } return SOAP_OK; } case '['/*']'*/: { int i; #ifdef __cplusplus if (!(v->ref = (void*)soap_new__array(soap))) return soap->error = SOAP_EOM; #else if (!(v->ref = (void*)soap_malloc(soap, sizeof(struct _array)))) return soap->error = SOAP_EOM; #endif soap_default__array(soap, (struct _array*)v->ref); v->__type = SOAP_TYPE__array; while (((c = soap_getchar(soap)) > 0 && c <= 0x20) || c == 0xA0) continue; if (c == /*'['*/']') return SOAP_OK; soap_unget(soap, c); for (i = 0; ; i++) { #ifdef __cplusplus if (json_recv(soap, v->operator[](i))) return soap->error; #else if (json_recv(soap, nth_value(v, i))) return soap->error; #endif while (((c = soap_getchar(soap)) > 0 && c <= 0x20) || c == 0xA0) continue; if (c == /*'['*/']') break; if ((int)c == EOF) return soap->error = SOAP_EOF; if (c != ',') return soap_set_sender_error(soap, "closing ']' or comma expected", NULL, SOAP_SYNTAX_ERROR); } return SOAP_OK; } case '"': soap->labidx = 0; for (;;) { char *s; const char *t = NULL; register size_t k; if (soap_append_lab(soap, NULL, 0)) return soap->error = SOAP_EOM; s = soap->labbuf + soap->labidx; k = soap->lablen - soap->labidx; soap->labidx = soap->lablen; while (k--) { if (t) { *s++ = *t++; if (!*t) t = NULL; } else { c = soap_getchar(soap); switch (c) { case EOF: return soap->error = SOAP_EOF; case '"': *s = '\0'; v->__type = SOAP_TYPE__string; if (!(v->ref = soap_strdup(soap, soap->labbuf))) return soap->error = SOAP_EOM; return SOAP_OK; case '\\': c = soap_getchar(soap); switch (c) { case EOF: return soap->error = SOAP_EOF; case 'b': c = 8; break; case 'f': c = 12; break; case 'n': c = 10; break; case 'r': c = 13; break; case 't': c = 9; break; case 'u': { char *h; wchar_t wc[2]; int i; /* hex to utf8 conversion */ h = soap->tmpbuf; for (i = 0; i < 4; i++) { if ((c = soap_getchar(soap)) == EOF) return soap->error = SOAP_EOF; h[i] = c; } wc[0] = soap_strtol(h, NULL, 16); wc[1] = 0; t = soap_wchar2s(soap, wc); c = *t++; if (!*t) t = NULL; } } *s++ = c; break; default: if ((c & 0x80) && (soap->imode & SOAP_ENC_LATIN) && (soap->imode & SOAP_C_UTFSTRING)) /* ISO 8859-1 to utf8 */ { *s++ = (char)(0xC0 | ((c >> 6) & 0x1F)); soap->tmpbuf[0] = (0x80 | (c & 0x3F)); soap->tmpbuf[1] = '\0'; t = soap->tmpbuf; } else if ((c & 0x80) && !(soap->imode & SOAP_ENC_LATIN) && !(soap->imode & SOAP_C_UTFSTRING)) /* utf8 to ISO 8859-1 */ { soap_wchar c1 = soap_getchar(soap); if (c1 == SOAP_EOF) return soap->error = SOAP_EOF; if (c < 0xE0 && (c & 0x1F) <= 0x03) *s++ = ((c & 0x1F) << 6) | (c1 & 0x3F); else *s++ = '?'; } else *s++ = c; } } } } default: /* number, true, false, null */ { char *s = soap->tmpbuf; do { *s++ = c; c = soap_getchar(soap); } while ((isalnum((int)c) || (int)c == '.' || (int)c == '+' || (int)c == '-') && s - soap->tmpbuf < (int)sizeof(soap->tmpbuf) - 1); *s = '\0'; soap_unget(soap, c); if (soap->tmpbuf[0] == '-' || isdigit(soap->tmpbuf[0])) { LONG64 n = soap_strtoll(soap->tmpbuf, &s, 10); if (!*s) { v->__type = SOAP_TYPE__int; if (!(v->ref = soap_malloc(soap, sizeof(_int)))) return soap->error = SOAP_EOM; *(_int*)v->ref = n; } else { double x; if (soap_s2double(soap, soap->tmpbuf, &x)) return soap_set_sender_error(soap, "number expected", soap->tmpbuf, SOAP_SYNTAX_ERROR); v->__type = SOAP_TYPE__double; if (!(v->ref = soap_malloc(soap, sizeof(_double)))) return soap->error = SOAP_EOM; *(_double*)v->ref = x; } } else if (!strcmp(soap->tmpbuf, "true")) { v->__type = SOAP_TYPE__boolean; if (!(v->ref = soap_malloc(soap, sizeof(_boolean)))) return soap->error = SOAP_EOM; *(char*)v->ref = 1; } else if (!strcmp(soap->tmpbuf, "false")) { v->__type = SOAP_TYPE__boolean; if (!(v->ref = soap_malloc(soap, sizeof(_boolean)))) return soap->error = SOAP_EOM; *(char*)v->ref = 0; } else if (strcmp(soap->tmpbuf, "null")) { return soap_set_sender_error(soap, "value expected", soap->tmpbuf, SOAP_SYNTAX_ERROR); } return SOAP_OK; } } } int json_call(struct soap *soap, const char *endpoint, const struct value *in, struct value *out) { if (out) soap_default_value(soap, out); soap->http_content = "application/json; charset=utf-8"; if (soap_begin_count(soap) || ((soap->mode & SOAP_IO_LENGTH) && json_send(soap, in)) || soap_end_count(soap) || soap_connect_command(soap, in && out ? SOAP_POST_FILE : out ? SOAP_GET : in ? SOAP_PUT : SOAP_DEL, endpoint, NULL) || json_send(soap, in) || soap_end_send(soap) || soap_begin_recv(soap) || json_recv(soap, out) || soap_end_recv(soap)) json_error(soap, out); return soap_closesock(soap); } int json_send_string(struct soap *soap, const char *s) { const char *t = s; int c; char buf[8]; if (!s) return soap_send_raw(soap, "\"\"", 2); if (soap_send_raw(soap, "\"", 1)) return soap->error; while ((c = *s++)) { if (c < 0x20 && c > 0) { switch (c) { case '\b': c = 'b'; break; case '\f': c = 'f'; break; case '\n': c = 'n'; break; case '\r': c = 'r'; break; case '\t': c = 't'; break; } if (c > 0x20) { buf[0] = '\\'; buf[1] = c; if (soap_send_raw(soap, t, s - t - 1) || soap_send_raw(soap, buf, 2)) return soap->error; t = s; } else { (SOAP_SNPRINTF(buf, sizeof(buf), 7), "\\u%4x", c); if (soap_send_raw(soap, t, s - t - 1) || soap_send_raw(soap, buf, 6)) return soap->error; t = s; } } else if (c == '"' || c == '\\') { buf[0] = '\\'; buf[1] = c; if (soap_send_raw(soap, t, s - t - 1) || soap_send_raw(soap, buf, 2)) return soap->error; t = s; } else if ((c & 0x80)) { if ((soap->omode & SOAP_ENC_LATIN) && (soap->omode & SOAP_C_UTFSTRING)) /* UTF-8 to ISO 8859-1 */ { if (c < 0xE0 && (c & 0x1F) <= 0x03) buf[0] = ((c & 0x1F) << 6) | (*s++ & 0x3F); else buf[0] = '?'; if (soap_send_raw(soap, t, s - t - 1) || soap_send_raw(soap, buf, 1)) return soap->error; t = s; } else if (!(soap->omode & SOAP_ENC_LATIN) && !(soap->omode & SOAP_C_UTFSTRING)) /* ISO 8859-1 to UTF-8 */ { buf[0] = (char)(0xC0 | ((c >> 6) & 0x1F)); buf[1] = (char)(0x80 | (c & 0x3F)); if (soap_send_raw(soap, t, s - t - 1) || soap_send_raw(soap, buf, 2)) return soap->error; t = s; } } } if (soap_send_raw(soap, t, s - t - 1) || soap_send_raw(soap, "\"", 1)) return soap->error; return SOAP_OK; } #ifdef __cplusplus int json_write(struct soap *soap, const struct value& v) { return json_write(soap, &v); } int json_send(struct soap *soap, const struct value& v) { return json_send(soap, &v); } int json_read(struct soap *soap, struct value& v) { return json_read(soap, &v); } int json_recv(struct soap *soap, struct value& v) { return json_recv(soap, &v); } int json_call(struct soap *soap, const char *endpoint, const struct value& in, struct value& out) { return json_call(soap, endpoint, &in, &out); } int json_call(struct soap *soap, const char *endpoint, const struct value *in, struct value& out) { return json_call(soap, endpoint, in, &out); } int json_call(struct soap *soap, const char *endpoint, const struct value& in, struct value *out) { return json_call(soap, endpoint, &in, out); } std::ostream& operator<<(std::ostream& o, const struct value& v) { if (v.soap) { std::ostream *os = v.soap->os; v.soap->os = &o; json_write(v.soap, v); v.soap->os = os; } else { soap *ctx = soap_new(); ctx->os = &o; json_write(ctx, v); soap_destroy(ctx); soap_end(ctx); soap_free(ctx); } return o; } std::istream& operator>>(std::istream& i, struct value& v) { if (!v.soap) v.soap = soap_new(); std::istream *is = v.soap->is; v.soap->is = &i; json_read(v.soap, v); v.soap->is = is; return i; } static int json_promote_type(const value& x, const value& y) { switch (x.__type) { case SOAP_TYPE__array: return x.__type; case SOAP_TYPE__struct: switch (y.__type) { case SOAP_TYPE__array: return y.__type; case SOAP_TYPE__struct: return x.__type; default: return SOAP_TYPE__array; } case SOAP_TYPE__string: case SOAP_TYPE__dateTime_DOTiso8601: switch (y.__type) { case SOAP_TYPE__array: case SOAP_TYPE__struct: return y.__type; default: return x.__type; } case SOAP_TYPE__double: switch (y.__type) { case SOAP_TYPE__array: case SOAP_TYPE__struct: case SOAP_TYPE__string: case SOAP_TYPE__dateTime_DOTiso8601: return y.__type; default: return x.__type; } case SOAP_TYPE__i4: case SOAP_TYPE__int: switch (y.__type) { case SOAP_TYPE__array: case SOAP_TYPE__struct: case SOAP_TYPE__string: case SOAP_TYPE__dateTime_DOTiso8601: case SOAP_TYPE__double: return y.__type; default: return x.__type; } default: return y.__type; } } value json_add(const value& x, const value& y) { switch (json_promote_type(x, y)) { case SOAP_TYPE__boolean: case SOAP_TYPE__i4: case SOAP_TYPE__int: return value(x.soap, (_int)x + (_int)y); case SOAP_TYPE__double: return value(x.soap, (_double)x + (_double)y); case SOAP_TYPE__string: case SOAP_TYPE__dateTime_DOTiso8601: { std::string s = (const char*)x; return value(x.soap, s.append((const char*)y)); } case SOAP_TYPE__struct: { _struct s = x; _struct t = y; _struct st; for (_struct::iterator i = s.begin(); i != s.end(); ++i) st[i.name()] = *i; for (_struct::iterator i = t.begin(); i != t.end(); ++i) st[i.name()] = *i; return value(x.soap, st); } case SOAP_TYPE__array: { _array a = x; _array b = y; int n = a.size(); int m = b.size(); _array ab; ab.size(n + m); for (int i = 0; i < n; ++i) ab[i] = a[i]; for (int i = 0; i < m; ++i) ab[n + i] = b[i]; return value(x.soap, ab); } default: return value(x.soap); } } value json_sub(const value& x, const value& y) { switch (json_promote_type(x, y)) { case SOAP_TYPE__boolean: case SOAP_TYPE__i4: case SOAP_TYPE__int: return value(x.soap, (_int)x - (_int)y); case SOAP_TYPE__double: return value(x.soap, (_double)x - (_double)y); default: return value(x.soap); } } value json_mul(const value& x, const value& y) { switch (json_promote_type(x, y)) { case SOAP_TYPE__boolean: case SOAP_TYPE__i4: case SOAP_TYPE__int: return value(x.soap, (_int)x * (_int)y); case SOAP_TYPE__double: return value(x.soap, (_double)x * (_double)y); default: return value(x.soap); } } value json_div(const value& x, const value& y) { switch (json_promote_type(x, y)) { case SOAP_TYPE__boolean: case SOAP_TYPE__i4: case SOAP_TYPE__int: return value(x.soap, (_int)x / (_int)y); case SOAP_TYPE__double: return value(x.soap, (_double)x / (_double)y); default: return value(x.soap); } } value json_mod(const value& x, const value& y) { switch (json_promote_type(x, y)) { case SOAP_TYPE__boolean: case SOAP_TYPE__i4: case SOAP_TYPE__int: case SOAP_TYPE__double: return value(x.soap, (_int)x % (_int)y); default: return value(x.soap); } } bool json_eqv(const value& x, const value& y) { if (x.__type != y.__type && (x.__type != SOAP_TYPE__i4 || y.__type != SOAP_TYPE__int) && (x.__type != SOAP_TYPE__int || y.__type != SOAP_TYPE__i4)) return false; switch (x.__type) { case SOAP_TYPE__boolean: case SOAP_TYPE__i4: case SOAP_TYPE__int: return value(x.soap, (_int)x == (_int)y); case SOAP_TYPE__double: return value(x.soap, (_double)x == (_double)y); case SOAP_TYPE__string: case SOAP_TYPE__dateTime_DOTiso8601: return value(x.soap, !strcmp((const char*)x, (const char*)y)); case SOAP_TYPE__struct: if (x.size() != y.size()) return false; else { const _struct& s = x; const _struct& t = y; _struct::iterator i = s.begin(); _struct::iterator j = t.begin(); for ( ; i != s.end(); ++i, ++j) if (strcmp(i.name(), j.name()) || *i != *j) return false; return true; } case SOAP_TYPE__array: if (x.size() != y.size()) return false; else { const _array& a = x; const _array& b = y; _array::iterator i = a.begin(); _array::iterator j = b.begin(); for ( ; i != a.end(); ++i, ++j) if (*i != *j) return false; return true; } default: return false; } } bool json_leq(const value& x, const value& y) { if (x.__type != y.__type && (x.__type != SOAP_TYPE__i4 || y.__type != SOAP_TYPE__int) && (x.__type != SOAP_TYPE__int || y.__type != SOAP_TYPE__i4)) return false; switch (x.__type) { case SOAP_TYPE__boolean: case SOAP_TYPE__i4: case SOAP_TYPE__int: return (_int)x <= (_int)y; case SOAP_TYPE__double: return (_double)x <= (_double)y; case SOAP_TYPE__string: case SOAP_TYPE__dateTime_DOTiso8601: return strcmp((const char*)x, (const char*)y) <= 0; default: return false; } } bool json_lne(const value& x, const value& y) { if (x.__type != y.__type && (x.__type != SOAP_TYPE__i4 || y.__type != SOAP_TYPE__int) && (x.__type != SOAP_TYPE__int || y.__type != SOAP_TYPE__i4)) return false; switch (x.__type) { case SOAP_TYPE__boolean: case SOAP_TYPE__i4: case SOAP_TYPE__int: return (_int)x < (_int)y; case SOAP_TYPE__double: return (_double)x < (_double)y; case SOAP_TYPE__string: case SOAP_TYPE__dateTime_DOTiso8601: return strcmp((const char*)x, (const char*)y) < 0; default: return false; } } #endif #ifdef JSON_NAMESPACE } // namespace json #endif gsoap-2.8.28/gsoap/samples/mashup++/0000755000175000017500000000000012653650170016471 5ustar ellertellertgsoap-2.8.28/gsoap/samples/mashup++/Makefile.in0000644000175000017500000004771712653650156020562 0ustar ellertellert# Makefile.in generated by automake 1.14 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = mashupclient$(EXEEXT) mashupserver$(EXEEXT) DIST_COMMON = $(srcdir)/../Makefile.defines \ $(srcdir)/../Makefile.cpp_proxy_rules $(srcdir)/Makefile.in \ $(srcdir)/Makefile.am $(top_srcdir)/mkinstalldirs \ $(top_srcdir)/depcomp subdir = gsoap/samples/mashup++ ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = am__objects_2 = soapC.$(OBJEXT) am_mashupclient_OBJECTS = mashupclient.$(OBJEXT) $(am__objects_1) \ $(am__objects_2) soapmashupProxy.$(OBJEXT) mashupclient_OBJECTS = $(am_mashupclient_OBJECTS) am__DEPENDENCIES_1 = mashupclient_DEPENDENCIES = $(SOAP_CPP_LIB) $(am__DEPENDENCIES_1) am_mashupserver_OBJECTS = mashupserver.$(OBJEXT) $(am__objects_1) \ $(am__objects_2) soapcalcProxy.$(OBJEXT) \ soapServiceProxy.$(OBJEXT) soapmashupService.$(OBJEXT) mashupserver_OBJECTS = $(am_mashupserver_OBJECTS) mashupserver_DEPENDENCIES = $(SOAP_CPP_LIB) $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(mashupclient_SOURCES) $(mashupserver_SOURCES) DIST_SOURCES = $(mashupclient_SOURCES) $(mashupserver_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ STRIP = @STRIP@ VERSION = @VERSION@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 SOAPHEADER = mashup.hpp AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a SOAP_CPP_SRC = $(SOAP_H_FILES) $(SOAP_NS) LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_CPP_SRC) CLEANFILES = $(SOAP_CPP_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.cpp soap*Proxy.h soap*Proxy.cpp soap*Object.h soap*Service.h soap*Service.cpp soapClient.cpp soapServer.cpp soapClientLib.cpp soapServerLib.cpp *~ SOAP_NS = mashup.nsmap mashupclient_SOURCES = mashupclient.cpp $(SOAPHEADER) $(SOAP_CPP_CORE) soapmashupProxy.cpp mashupclient_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) mashupserver_SOURCES = mashupserver.cpp $(SOAPHEADER) $(SOAP_CPP_CORE) soapcalcProxy.cpp soapServiceProxy.cpp soapmashupService.cpp mashupserver_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_proxy_rules $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/mashup++/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/mashup++/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_proxy_rules: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) mashupclient$(EXEEXT): $(mashupclient_OBJECTS) $(mashupclient_DEPENDENCIES) $(EXTRA_mashupclient_DEPENDENCIES) @rm -f mashupclient$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(mashupclient_OBJECTS) $(mashupclient_LDADD) $(LIBS) mashupserver$(EXEEXT): $(mashupserver_OBJECTS) $(mashupserver_DEPENDENCIES) $(EXTRA_mashupserver_DEPENDENCIES) @rm -f mashupserver$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(mashupserver_OBJECTS) $(mashupserver_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mashupclient.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mashupserver.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapC.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapServiceProxy.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapcalcProxy.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapmashupProxy.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapmashupService.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am $(SOAP_CPP_SRC) : $(SOAPHEADER) $(SOAP) -i -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $< # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.28/gsoap/samples/mashup++/t.wsdl0000644000175000017500000000516212653650156017637 0ustar ellertellert Service definition of function t__gmt gSOAP 2.8.27 generated service definition gsoap-2.8.28/gsoap/samples/mashup++/calc.wsdl0000644000175000017500000001256412653650156020302 0ustar ellertellert Sums two values Subtracts two values Multiplies two values Divides two values Raises a to b Simple calculator service gsoap-2.8.28/gsoap/samples/mashup++/mashup.hpp0000644000175000017500000012303512653650156020507 0ustar ellertellert// Reminder: Modify typemap.dat to customize the header file generated by wsdl2h /* mashup.hpp Generated by wsdl2h 2.8.27 from t.wsdl calc.wsdl mashup.wsdl and typemap.dat 2016-01-28 16:25:01 GMT DO NOT INCLUDE THIS FILE DIRECTLY INTO YOUR PROJECT BUILDS USE THE soapcpp2-GENERATED SOURCE CODE FILES FOR YOUR PROJECT BUILDS gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc. All Rights Reserved. This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia Inc., contact@genivia.com -------------------------------------------------------------------------------- */ /** @page page_notes Notes @note HINTS: - Run soapcpp2 on mashup.hpp to generate the SOAP/XML processing logic. Use soapcpp2 -I to specify paths for #import To build with STL, 'stlvector.h' is imported from 'import' dir in package. Use soapcpp2 -j to generate improved proxy and server classes. - Use wsdl2h -c and -s to generate pure C code or C++ code without STL. - Use 'typemap.dat' to control namespace bindings and type mappings. It is strongly recommended to customize the names of the namespace prefixes generated by wsdl2h. To do so, modify the prefix bindings in the Namespaces section below and add the modified lines to 'typemap.dat' to rerun wsdl2h. - Use Doxygen (www.doxygen.org) on this file to generate documentation. - Use wsdl2h -R to generate REST operations. - Use wsdl2h -nname to use name as the base namespace prefix instead of 'ns'. - Use wsdl2h -Nname for service prefix and produce multiple service bindings - Use wsdl2h -d to enable DOM support for xsd:anyType. - Use wsdl2h -g to auto-generate readers and writers for root elements. - Use wsdl2h -b to auto-generate bi-directional operations (duplex ops). - Use wsdl2h -U to map XML names to C++ Unicode identifiers instead of _xNNNN. - Use wsdl2h -u to disable the generation of unions. - Struct/class members serialized as XML attributes are annotated with a '@'. - Struct/class members that have a special role are annotated with a '$'. @warning DO NOT INCLUDE THIS ANNOTATED FILE DIRECTLY IN YOUR PROJECT SOURCE CODE. USE THE FILES GENERATED BY soapcpp2 FOR YOUR PROJECT'S SOURCE CODE: THE soapStub.h FILE CONTAINS THIS CONTENT WITHOUT ANNOTATIONS. @copyright LICENSE: @verbatim -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc. All Rights Reserved. The wsdl2h tool and its generated software are released under the GPL. This software is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial-use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- @endverbatim */ //gsoapopt c++,w /******************************************************************************\ * * * Definitions * * * * * \******************************************************************************/ /******************************************************************************\ * * * $CONTAINER * * std::vector * * * \******************************************************************************/ template class std::vector; /******************************************************************************\ * * * Import * * * \******************************************************************************/ #import "stl.h" // enable STL containers when used (option -s removes STL dependency) /******************************************************************************\ * * * Schema Namespaces * * * \******************************************************************************/ /* NOTE: It is strongly recommended to customize the names of the namespace prefixes generated by wsdl2h. To do so, modify the prefix bindings below and add the modified lines to typemap.dat to rerun wsdl2h: ns1 = "http://tempuri.org/t.xsd" ns2 = "urn:calc" ns3 = "urn:daystoxmas" */ #define SOAP_NAMESPACE_OF_ns1 "http://tempuri.org/t.xsd" //gsoap ns1 schema namespace: http://tempuri.org/t.xsd //gsoap ns1 schema form: unqualified #define SOAP_NAMESPACE_OF_ns2 "urn:calc" //gsoap ns2 schema namespace: urn:calc //gsoap ns2 schema form: unqualified #define SOAP_NAMESPACE_OF_ns3 "urn:daystoxmas" //gsoap ns3 schema namespace: urn:daystoxmas //gsoap ns3 schema form: qualified /******************************************************************************\ * * * Built-in Schema Types and Top-Level Elements and Attributes * * * \******************************************************************************/ /******************************************************************************\ * * * Forward Declarations * * * \******************************************************************************/ // Forward declaration of class _ns1__gmt. class _ns1__gmt; // Forward declaration of class _ns1__gmtResponse. class _ns1__gmtResponse; /// @brief Top-level root element "urn:daystoxmas":daystoxmas. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. // Forward declaration of class _ns3__commingtotown. class _ns3__commingtotown; /******************************************************************************\ * * * Schema Types and Top-Level Elements and Attributes * * http://tempuri.org/t.xsd * * * \******************************************************************************/ /******************************************************************************\ * * * Schema Types and Top-Level Elements and Attributes * * urn:calc * * * \******************************************************************************/ /******************************************************************************\ * * * Schema Types and Top-Level Elements and Attributes * * urn:daystoxmas * * * \******************************************************************************/ /******************************************************************************\ * * * Schema Complex Types and Top-Level Elements * * http://tempuri.org/t.xsd * * * \******************************************************************************/ /// @brief Top-level root element "http://tempuri.org/t.xsd":gmt /// @brief "http://tempuri.org/t.xsd":gmt is a complexType. /// /// class _ns1__gmt operations: /// - _ns1__gmt* soap_new__ns1__gmt(soap*) allocate /// - _ns1__gmt* soap_new__ns1__gmt(soap*, int num) allocate array /// - _ns1__gmt* soap_new_req__ns1__gmt(soap*, ...) allocate, set required members /// - _ns1__gmt* soap_new_set__ns1__gmt(soap*, ...) allocate, set all public members /// - _ns1__gmt::soap_default(soap*) reset members to default /// - int soap_read__ns1__gmt(soap*, _ns1__gmt*) deserialize from a stream /// - int soap_write__ns1__gmt(soap*, _ns1__gmt*) serialize to a stream /// - _ns1__gmt* _ns1__gmt::soap_dup(soap*) returns deep copy of _ns1__gmt, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - _ns1__gmt::soap_del() deep deletes _ns1__gmt data members, use only after _ns1__gmt::soap_dup(NULL) (use soapcpp2 -Ed) class _ns1__gmt { public: /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief Top-level root element "http://tempuri.org/t.xsd":gmtResponse /// @brief "http://tempuri.org/t.xsd":gmtResponse is a complexType. /// /// class _ns1__gmtResponse operations: /// - _ns1__gmtResponse* soap_new__ns1__gmtResponse(soap*) allocate /// - _ns1__gmtResponse* soap_new__ns1__gmtResponse(soap*, int num) allocate array /// - _ns1__gmtResponse* soap_new_req__ns1__gmtResponse(soap*, ...) allocate, set required members /// - _ns1__gmtResponse* soap_new_set__ns1__gmtResponse(soap*, ...) allocate, set all public members /// - _ns1__gmtResponse::soap_default(soap*) reset members to default /// - int soap_read__ns1__gmtResponse(soap*, _ns1__gmtResponse*) deserialize from a stream /// - int soap_write__ns1__gmtResponse(soap*, _ns1__gmtResponse*) serialize to a stream /// - _ns1__gmtResponse* _ns1__gmtResponse::soap_dup(soap*) returns deep copy of _ns1__gmtResponse, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - _ns1__gmtResponse::soap_del() deep deletes _ns1__gmtResponse data members, use only after _ns1__gmtResponse::soap_dup(NULL) (use soapcpp2 -Ed) class _ns1__gmtResponse { public: /// Element "param-1" of XSD type xs:dateTime. time_t* param_1 0; ///< Optional element. /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /******************************************************************************\ * * * Schema Complex Types and Top-Level Elements * * urn:calc * * * \******************************************************************************/ /******************************************************************************\ * * * Schema Complex Types and Top-Level Elements * * urn:daystoxmas * * * \******************************************************************************/ /// @brief Top-level root element "urn:daystoxmas":commingtotown /// @brief "urn:daystoxmas":commingtotown is a complexType. /// /// class _ns3__commingtotown operations: /// - _ns3__commingtotown* soap_new__ns3__commingtotown(soap*) allocate /// - _ns3__commingtotown* soap_new__ns3__commingtotown(soap*, int num) allocate array /// - _ns3__commingtotown* soap_new_req__ns3__commingtotown(soap*, ...) allocate, set required members /// - _ns3__commingtotown* soap_new_set__ns3__commingtotown(soap*, ...) allocate, set all public members /// - _ns3__commingtotown::soap_default(soap*) reset members to default /// - int soap_read__ns3__commingtotown(soap*, _ns3__commingtotown*) deserialize from a stream /// - int soap_write__ns3__commingtotown(soap*, _ns3__commingtotown*) serialize to a stream /// - _ns3__commingtotown* _ns3__commingtotown::soap_dup(soap*) returns deep copy of _ns3__commingtotown, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - _ns3__commingtotown::soap_del() deep deletes _ns3__commingtotown data members, use only after _ns3__commingtotown::soap_dup(NULL) (use soapcpp2 -Ed) class _ns3__commingtotown { public: /// Element "days" of XSD type xs:int. int days 1; ///< Required element. /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /******************************************************************************\ * * * Additional Top-Level Elements * * http://tempuri.org/t.xsd * * * \******************************************************************************/ /******************************************************************************\ * * * Additional Top-Level Attributes * * http://tempuri.org/t.xsd * * * \******************************************************************************/ /******************************************************************************\ * * * Additional Top-Level Elements * * urn:calc * * * \******************************************************************************/ /******************************************************************************\ * * * Additional Top-Level Attributes * * urn:calc * * * \******************************************************************************/ /******************************************************************************\ * * * Additional Top-Level Elements * * urn:daystoxmas * * * \******************************************************************************/ /******************************************************************************\ * * * Additional Top-Level Attributes * * urn:daystoxmas * * * \******************************************************************************/ /******************************************************************************\ * * * Services * * * \******************************************************************************/ //gsoap ns2 service name: calc //gsoap ns2 service type: calcPortType //gsoap ns2 service port: http://websrv.cs.fsu.edu/~engelen/calcserver.cgi //gsoap ns2 service namespace: urn:calc //gsoap ns2 service transport: http://schemas.xmlsoap.org/soap/http //gsoap ns4 service name: Service //gsoap ns4 service type: ServicePortType //gsoap ns4 service port: http://localhost:80 //gsoap ns4 service namespace: http://tempuri.org/t.xsd/Service.wsdl //gsoap ns4 service transport: http://schemas.xmlsoap.org/soap/http //gsoap ns5 service name: mashup //gsoap ns5 service type: PortType //gsoap ns5 service port: http://www.cs.fsu.edu/~engelen/mashup.cgi //gsoap ns5 service namespace: http://www.genivia.com/mashup.wsdl //gsoap ns5 service transport: http://schemas.xmlsoap.org/soap/http /** @mainpage WSDL Definitions @section WSDL_bindings Service Bindings - @ref calc - @ref Service - @ref mashup @section WSDL_more More Information - @ref page_notes "Notes" - @ref page_XMLDataBinding "XML Data Binding" - @ref SOAP_ENV__Header "SOAP Header Content" (when applicable) - @ref SOAP_ENV__Detail "SOAP Fault Detail Content" (when applicable) */ /** @page calc Binding "calc" @section calc_service Service Documentation "calc" Simple calculator service @section calc_operations Operations of Binding "calc" - @ref ns2__add - @ref ns2__sub - @ref ns2__mul - @ref ns2__div - @ref ns2__pow @section calc_ports Endpoints of Binding "calc" - http://websrv.cs.fsu.edu/~engelen/calcserver.cgi @note Use wsdl2h option -Nname to change the service binding prefix name */ /** @page Service Binding "Service" @section Service_service Service Documentation "Service" gSOAP 2.8.27 generated service definition @section Service_operations Operations of Binding "Service" - @ref __ns4__gmt @section Service_ports Endpoints of Binding "Service" - http://localhost:80 @note Use wsdl2h option -Nname to change the service binding prefix name */ /** @page mashup Binding "mashup" @section mashup_operations Operations of Binding "mashup" - @ref __ns5__dtx @section mashup_ports Endpoints of Binding "mashup" - http://www.cs.fsu.edu/~engelen/mashup.cgi @note Use wsdl2h option -Nname to change the service binding prefix name */ /******************************************************************************\ * * * Service Binding * * calc * * * \******************************************************************************/ /******************************************************************************\ * * * Service Operation * * ns2__add * * * \******************************************************************************/ /** Operation "ns2__add" of service binding "calc". Sums two values - http://schemas.xmlsoap.org/soap/encoding/ RPC encodingStyle="SOAP" - Addressing input action: "" - Addressing output action: "Response" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call_ns2__add( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: double a, double b, // output parameters: double &result ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int ns2__add( struct soap *soap, // input parameters: double a, double b, // output parameters: double &result ); @endcode C++ proxy class (defined in soapcalcProxy.h): @code class calcProxy; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use proxy classes; C++ service class (defined in soapcalcService.h): @code class calcService; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use service classes; */ //gsoap ns2 service method-protocol: add SOAP //gsoap ns2 service method-style: add rpc //gsoap ns2 service method-encoding: add http://schemas.xmlsoap.org/soap/encoding/ //gsoap ns2 service method-action: add "" //gsoap ns2 service method-output-action: add Response int ns2__add( double a, ///< Input parameter double b, ///< Input parameter double &result ///< Output parameter ); /******************************************************************************\ * * * Service Operation * * ns2__sub * * * \******************************************************************************/ /** Operation "ns2__sub" of service binding "calc". Subtracts two values - http://schemas.xmlsoap.org/soap/encoding/ RPC encodingStyle="SOAP" - Addressing input action: "" - Addressing output action: "Response" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call_ns2__sub( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: double a, double b, // output parameters: double &result ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int ns2__sub( struct soap *soap, // input parameters: double a, double b, // output parameters: double &result ); @endcode C++ proxy class (defined in soapcalcProxy.h): @code class calcProxy; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use proxy classes; C++ service class (defined in soapcalcService.h): @code class calcService; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use service classes; */ //gsoap ns2 service method-protocol: sub SOAP //gsoap ns2 service method-style: sub rpc //gsoap ns2 service method-encoding: sub http://schemas.xmlsoap.org/soap/encoding/ //gsoap ns2 service method-action: sub "" //gsoap ns2 service method-output-action: sub Response int ns2__sub( double a, ///< Input parameter double b, ///< Input parameter double &result ///< Output parameter ); /******************************************************************************\ * * * Service Operation * * ns2__mul * * * \******************************************************************************/ /** Operation "ns2__mul" of service binding "calc". Multiplies two values - http://schemas.xmlsoap.org/soap/encoding/ RPC encodingStyle="SOAP" - Addressing input action: "" - Addressing output action: "Response" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call_ns2__mul( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: double a, double b, // output parameters: double &result ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int ns2__mul( struct soap *soap, // input parameters: double a, double b, // output parameters: double &result ); @endcode C++ proxy class (defined in soapcalcProxy.h): @code class calcProxy; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use proxy classes; C++ service class (defined in soapcalcService.h): @code class calcService; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use service classes; */ //gsoap ns2 service method-protocol: mul SOAP //gsoap ns2 service method-style: mul rpc //gsoap ns2 service method-encoding: mul http://schemas.xmlsoap.org/soap/encoding/ //gsoap ns2 service method-action: mul "" //gsoap ns2 service method-output-action: mul Response int ns2__mul( double a, ///< Input parameter double b, ///< Input parameter double &result ///< Output parameter ); /******************************************************************************\ * * * Service Operation * * ns2__div * * * \******************************************************************************/ /** Operation "ns2__div" of service binding "calc". Divides two values - http://schemas.xmlsoap.org/soap/encoding/ RPC encodingStyle="SOAP" - Addressing input action: "" - Addressing output action: "Response" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call_ns2__div( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: double a, double b, // output parameters: double &result ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int ns2__div( struct soap *soap, // input parameters: double a, double b, // output parameters: double &result ); @endcode C++ proxy class (defined in soapcalcProxy.h): @code class calcProxy; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use proxy classes; C++ service class (defined in soapcalcService.h): @code class calcService; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use service classes; */ //gsoap ns2 service method-protocol: div SOAP //gsoap ns2 service method-style: div rpc //gsoap ns2 service method-encoding: div http://schemas.xmlsoap.org/soap/encoding/ //gsoap ns2 service method-action: div "" //gsoap ns2 service method-output-action: div Response int ns2__div( double a, ///< Input parameter double b, ///< Input parameter double &result ///< Output parameter ); /******************************************************************************\ * * * Service Operation * * ns2__pow * * * \******************************************************************************/ /** Operation "ns2__pow" of service binding "calc". Raises a to b - http://schemas.xmlsoap.org/soap/encoding/ RPC encodingStyle="SOAP" - Addressing input action: "" - Addressing output action: "Response" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call_ns2__pow( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: double a, double b, // output parameters: double &result ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int ns2__pow( struct soap *soap, // input parameters: double a, double b, // output parameters: double &result ); @endcode C++ proxy class (defined in soapcalcProxy.h): @code class calcProxy; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use proxy classes; C++ service class (defined in soapcalcService.h): @code class calcService; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use service classes; */ //gsoap ns2 service method-protocol: pow SOAP //gsoap ns2 service method-style: pow rpc //gsoap ns2 service method-encoding: pow http://schemas.xmlsoap.org/soap/encoding/ //gsoap ns2 service method-action: pow "" //gsoap ns2 service method-output-action: pow Response int ns2__pow( double a, ///< Input parameter double b, ///< Input parameter double &result ///< Output parameter ); /** @page calc Binding "calc" @section calc_policy_enablers Policy Enablers of Binding "calc" None specified. */ /******************************************************************************\ * * * Service Binding * * Service * * * \******************************************************************************/ /******************************************************************************\ * * * Service Operation * * __ns4__gmt * * * \******************************************************************************/ /** Operation "__ns4__gmt" of service binding "Service". Service definition of function t__gmt - SOAP document/literal style messaging - Addressing input action: "" - Addressing output action: "Response" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___ns4__gmt( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: _ns1__gmt* ns1__gmt, // output parameters: _ns1__gmtResponse &ns1__gmtResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __ns4__gmt( struct soap *soap, // input parameters: _ns1__gmt* ns1__gmt, // output parameters: _ns1__gmtResponse &ns1__gmtResponse ); @endcode C++ proxy class (defined in soapServiceProxy.h): @code class ServiceProxy; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use proxy classes; C++ service class (defined in soapServiceService.h): @code class ServiceService; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use service classes; */ //gsoap ns4 service method-protocol: gmt SOAP //gsoap ns4 service method-style: gmt document //gsoap ns4 service method-encoding: gmt literal //gsoap ns4 service method-action: gmt "" //gsoap ns4 service method-output-action: gmt Response int __ns4__gmt( _ns1__gmt* ns1__gmt, ///< Input parameter _ns1__gmtResponse &ns1__gmtResponse ///< Output parameter ); /** @page Service Binding "Service" @section Service_policy_enablers Policy Enablers of Binding "Service" None specified. */ /******************************************************************************\ * * * Service Binding * * mashup * * * \******************************************************************************/ /******************************************************************************\ * * * Service Operation * * __ns5__dtx * * * \******************************************************************************/ /** Operation "__ns5__dtx" of service binding "mashup". - SOAP document/literal style messaging - Addressing input action: "" - Addressing output action: "Response" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___ns5__dtx( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: _XML ns3__daystoxmas, // output parameters: _ns3__commingtotown &ns3__commingtotown ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __ns5__dtx( struct soap *soap, // input parameters: _XML ns3__daystoxmas, // output parameters: _ns3__commingtotown &ns3__commingtotown ); @endcode C++ proxy class (defined in soapmashupProxy.h): @code class mashupProxy; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use proxy classes; C++ service class (defined in soapmashupService.h): @code class mashupService; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use service classes; */ //gsoap ns5 service method-protocol: dtx SOAP //gsoap ns5 service method-style: dtx document //gsoap ns5 service method-encoding: dtx literal //gsoap ns5 service method-action: dtx "" //gsoap ns5 service method-output-action: dtx Response int __ns5__dtx( _XML ns3__daystoxmas, ///< Input parameter _ns3__commingtotown &ns3__commingtotown ///< Output parameter ); /** @page mashup Binding "mashup" @section mashup_policy_enablers Policy Enablers of Binding "mashup" None specified. */ /******************************************************************************\ * * * XML Data Binding * * * \******************************************************************************/ /** @page page_XMLDataBinding XML Data Binding SOAP/XML services use data bindings contractually bound by WSDL and auto- generated by wsdl2h and soapcpp2 (see Service Bindings). Plain data bindings are adopted from XML schemas as part of the WSDL types section or when running wsdl2h on a set of schemas to produce non-SOAP-based XML data bindings. The following readers and writers are C/C++ data type (de)serializers auto- generated by wsdl2h and soapcpp2. Run soapcpp2 on this file to generate the (de)serialization code, which is stored in soapC.c[pp]. Include "soapH.h" in your code to import these data type and function declarations. Only use the soapcpp2-generated files in your project build. Do not include the wsdl2h- generated .h file in your code. Data can be read and deserialized from: - an int file descriptor, using soap->recvfd = fd - a socket, using soap->socket = (int)... - a C++ stream (istream, stringstream), using soap->is = (istream*)... - a C string, using soap->is = (const char*)... - any input, using the soap->frecv() callback Data can be serialized and written to: - an int file descriptor, using soap->sendfd = (int)... - a socket, using soap->socket = (int)... - a C++ stream (ostream, stringstream), using soap->os = (ostream*)... - a C string, using soap->os = (const char**)... - any output, using the soap->fsend() callback The following options are available for (de)serialization control: - soap->encodingStyle = NULL; to remove SOAP 1.1/1.2 encodingStyle - soap_mode(soap, SOAP_XML_TREE); XML without id-ref (no cycles!) - soap_mode(soap, SOAP_XML_GRAPH); XML with id-ref (including cycles) - soap_set_namespaces(soap, struct Namespace *nsmap); to set xmlns bindings @section ns1 Top-level root elements of schema "http://tempuri.org/t.xsd" - @ref _ns1__gmt @code // Reader (returns SOAP_OK on success): soap_read__ns1__gmt(struct soap*, _ns1__gmt*); // Writer (returns SOAP_OK on success): soap_write__ns1__gmt(struct soap*, _ns1__gmt*); @endcode - @ref _ns1__gmtResponse @code // Reader (returns SOAP_OK on success): soap_read__ns1__gmtResponse(struct soap*, _ns1__gmtResponse*); // Writer (returns SOAP_OK on success): soap_write__ns1__gmtResponse(struct soap*, _ns1__gmtResponse*); @endcode @section ns2 Top-level root elements of schema "urn:calc" @section ns3 Top-level root elements of schema "urn:daystoxmas" - @ref _ns3__daystoxmas @code // Reader (returns SOAP_OK on success): soap_read__ns3__daystoxmas(struct soap*, _XML); // Writer (returns SOAP_OK on success): soap_write__ns3__daystoxmas(struct soap*, _XML); @endcode - @ref _ns3__commingtotown @code // Reader (returns SOAP_OK on success): soap_read__ns3__commingtotown(struct soap*, _ns3__commingtotown*); // Writer (returns SOAP_OK on success): soap_write__ns3__commingtotown(struct soap*, _ns3__commingtotown*); @endcode */ /* End of mashup.hpp */ gsoap-2.8.28/gsoap/samples/mashup++/README.txt0000644000175000017500000000157712653650156020205 0ustar ellertellert A simple example "mashup" service. The service computes the number of days to christmas using the GMT time service and calculator service. The wsdl2h importer accepts multiple WSDLs and generates one gSOAP definitions file to implement clients and/or services. In this case we create a new service to compute the days to christmas by invoking the GMT and calc services. A client for the mashup service is also included. The mashup.h gSOAP definitions file is generated from the GMT and calculator WSDLs using: wsdl2h -s -o mashup.h t.wsdl calc.wsdl mashup.wsdl where t.wsdl is generated in samples/gmt, calc.wsdl is generated in samples/calc, and mashup.wsdl is a new WSDL to expose the new "daystoxmas" service operation. The mashupserver is a CGI application. The mashupclient is a stand-alone client for the service. Invoking mashupclient will return the number of days to christmas. gsoap-2.8.28/gsoap/samples/mashup++/mashupserver.cpp0000644000175000017500000000605112653650156021727 0ustar ellertellert/* mashupserver.cpp Example mashup CGI service in C++ soapcpp2 -i mashup.hpp cc -o mashupserver mashupserver.cpp stdsoap2.cpp soapC.cpp soapcalcProxy.cpp soapServiceProxy.cpp soapmashupService.cpp -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapcalcProxy.h" #include "soapServiceProxy.h" #include "soapmashupService.h" #include "mashup.nsmap" int main() { mashupService service; return service.serve(); } /******************************************************************************\ * * Server operation * \******************************************************************************/ int mashupService::dtx(_XML x, _ns3__commingtotown &response) { (void)x; /* input param that is always empty is simply ignored */ ServiceProxy Time("http://www.cs.fsu.edu/~engelen/gmtlitserver.cgi"); _ns1__gmt gmt; _ns1__gmtResponse gmtResponse; if (Time.gmt(&gmt, gmtResponse)) return soap_receiverfault("Cannot connect to GMT server", NULL); time_t *now = gmtResponse.param_1; if (!now) return soap_receiverfault("Could not retrieve current time", NULL); struct tm tm; memset(&tm, 0, sizeof(struct tm)); tm.tm_mday = 25; tm.tm_mon = 11; tm.tm_year = gmtime(now)->tm_year; // this year time_t xmas = soap_timegm(&tm); if (xmas < *now) { tm.tm_year++; // xmas just passed, go to next year xmas = soap_timegm(&tm); } double sec = difftime(xmas, *now); calcProxy Calc; double days; if (Calc.div(sec, 86400.0, days)) return soap_receiverfault("Cannot connect to calc server", NULL); response.days = (int)days; soap_delegate_deletion(&Time, this); // Time data to be deleted by 'this' soap_delegate_deletion(&Calc, this); // Calc data to be deleted by 'this' return SOAP_OK; } gsoap-2.8.28/gsoap/samples/mashup++/mashupclient.cpp0000644000175000017500000000361212653650156021677 0ustar ellertellert/* mashupclient.cpp Example mashup service client in C++ soapcpp2 -i mashup.hpp cc -o mashupclient mashupclient.cpp stdsoap2.cpp soapC.cpp soapmashupProxy.cpp -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapmashupProxy.h" #include "mashup.nsmap" int main() { mashupProxy proxy; _ns3__commingtotown response; if (proxy.dtx((char*)"", response)) proxy.soap_stream_fault(std::cerr); else if (response.days == 0) std::cout << "Today is the day!" << std::endl; else std::cout << "Wait " << response.days << " more days to xmas" << std::endl; return 0; } gsoap-2.8.28/gsoap/samples/mashup++/Makefile.am0000644000175000017500000000134212653650156020531 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 noinst_PROGRAMS = mashupclient mashupserver SOAPHEADER = mashup.hpp include ../Makefile.defines include ../Makefile.cpp_proxy_rules SOAP_NS = mashup.nsmap mashupclient_SOURCES = mashupclient.cpp $(SOAPHEADER) $(SOAP_CPP_CORE) soapmashupProxy.cpp mashupclient_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) mashupserver_SOURCES = mashupserver.cpp $(SOAPHEADER) $(SOAP_CPP_CORE) soapcalcProxy.cpp soapServiceProxy.cpp soapmashupService.cpp mashupserver_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) gsoap-2.8.28/gsoap/samples/mashup++/mashup.wsdl0000444000175000017500000000426612653650156020673 0ustar ellertellert gsoap-2.8.28/gsoap/samples/oneway++/0000755000175000017500000000000012653650166016503 5ustar ellertellertgsoap-2.8.28/gsoap/samples/oneway++/event.h0000644000175000017500000000370112653650156017775 0ustar ellertellert/* -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap ns service name: Event Service is a simple remote event handler //gsoap ns service style: rpc //gsoap ns service encoding: encoded //gsoap ns service namespace: http://www.cs.fsu.edu/~engelen/event.wsdl //gsoap ns service location: http://localhost:18000 //gsoap ns schema namespace: urn:event //gsoap ns schema type-documentation: event Set of four possible events enum ns__event { EVENT_A, EVENT_B, EVENT_C, EVENT_Z }; //gsoap ns service method-action: handle "event" //gsoap ns service method-documentation: handle Handles asynchronous events int ns__handle(enum ns__event event, void); gsoap-2.8.28/gsoap/samples/oneway++/Makefile.in0000644000175000017500000004705312653650156020560 0ustar ellertellert# Makefile.in generated by automake 1.14 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = event$(EXEEXT) handler$(EXEEXT) DIST_COMMON = $(srcdir)/../Makefile.defines \ $(srcdir)/../Makefile.cpp_proxy_rules $(srcdir)/Makefile.in \ $(srcdir)/Makefile.am $(top_srcdir)/mkinstalldirs \ $(top_srcdir)/depcomp subdir = gsoap/samples/oneway++ ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = am__objects_2 = soapC.$(OBJEXT) am_event_OBJECTS = event.$(OBJEXT) $(am__objects_1) $(am__objects_2) \ soapEventProxy.$(OBJEXT) event_OBJECTS = $(am_event_OBJECTS) am__DEPENDENCIES_1 = event_DEPENDENCIES = $(SOAP_CPP_LIB) $(am__DEPENDENCIES_1) am_handler_OBJECTS = handler.$(OBJEXT) $(am__objects_1) \ $(am__objects_2) soapEventService.$(OBJEXT) \ soapEventProxy.$(OBJEXT) handler_OBJECTS = $(am_handler_OBJECTS) handler_DEPENDENCIES = $(SOAP_CPP_LIB) $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(event_SOURCES) $(handler_SOURCES) DIST_SOURCES = $(event_SOURCES) $(handler_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ STRIP = @STRIP@ VERSION = @VERSION@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 SOAPHEADER = event.h AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a SOAP_CPP_SRC = $(SOAP_H_FILES) $(SOAP_NS) LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_CPP_SRC) CLEANFILES = $(SOAP_CPP_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.cpp soap*Proxy.h soap*Proxy.cpp soap*Object.h soap*Service.h soap*Service.cpp soapClient.cpp soapServer.cpp soapClientLib.cpp soapServerLib.cpp *~ SOAP_NS = Event.nsmap Event.wsdl event_SOURCES = event.cpp $(SOAPHEADER) $(SOAP_CPP_CORE) soapEventProxy.cpp event_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) handler_SOURCES = handler.cpp $(SOAPHEADER) $(SOAP_CPP_CORE) soapEventService.cpp soapEventProxy.cpp handler_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) -lpthread all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_proxy_rules $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/oneway++/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/oneway++/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_proxy_rules: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) event$(EXEEXT): $(event_OBJECTS) $(event_DEPENDENCIES) $(EXTRA_event_DEPENDENCIES) @rm -f event$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(event_OBJECTS) $(event_LDADD) $(LIBS) handler$(EXEEXT): $(handler_OBJECTS) $(handler_DEPENDENCIES) $(EXTRA_handler_DEPENDENCIES) @rm -f handler$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(handler_OBJECTS) $(handler_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/event.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/handler.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapC.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapEventProxy.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapEventService.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am $(SOAP_CPP_SRC) : $(SOAPHEADER) $(SOAP) -i -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $< # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.28/gsoap/samples/oneway++/event.cpp0000644000175000017500000001017312653650156020331 0ustar ellertellert/* event.cpp C++-style client Events based on one-way SOAP messaging using HTTP keep-alive for persistent connections. C++ style with Proxy object. The 'synchronous' global flag illustrates SOAP one-way messaging, which requires an HTTP OK or HTTP Accept response with an empty body to be returned by the server. Compile: soapcpp2 -i event.h c++ -o event event.cpp stdsoap2.cpp soapC.cpp soapEventProxy.cpp Run (first start the event handler on localhost port 18000): event -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapEventProxy.h" #include "Event.nsmap" int synchronous = 1; /* synchronous=0: asynchronous one-way messaging over HTTP (no HTTP response) */ /* synchronous=1: SOAP interoperable synchronous one-way messaging over HTTP */ /* Service details (copied from event.h): */ const char *event_handler_endpoint = "http://localhost:18000"; const char *event_handler_action = "event"; int main() { EventProxy e(SOAP_IO_KEEPALIVE | SOAP_XML_INDENT); // Events A to C do not generate a response from the server fprintf(stderr, "Client Sends Event: A\n"); if (e.send_handle(EVENT_A)) e.soap_print_fault(stderr); else if (synchronous && e.recv_handle_empty_response()) e.soap_print_fault(stderr); fprintf(stderr, "Client Sends Event: B\n"); if (e.send_handle(EVENT_B)) e.soap_print_fault(stderr); else if (synchronous && e.recv_handle_empty_response()) e.soap_print_fault(stderr); // connection should not be kept alive after the last call: be nice to the server and tell it that we close the connection after this call soap_clr_omode(&e, SOAP_IO_KEEPALIVE); fprintf(stderr, "Client Sends Event: C\n"); if (e.send_handle(EVENT_C)) e.soap_print_fault(stderr); else if (synchronous && e.recv_handle_empty_response()) e.soap_print_fault(stderr); e.soap_close_socket(); // Re-enable keep-alive soap_set_omode(&e, SOAP_IO_KEEPALIVE); // Events Z generates a series of responses from the server fprintf(stderr, "Client Sends Event: Z\n"); if (e.send_handle(EVENT_Z)) e.soap_print_fault(stderr); else { struct ns__handle response; for (;;) { if (!soap_valid_socket(e.socket)) { fprintf(stderr, "Connection was terminated (keep alive disabled?)\n"); break; } if (e.recv_handle(response)) { if (e.error == SOAP_EOF) fprintf(stderr, "Connection was gracefully closed by server\n"); else e.soap_print_fault(stderr); break; } else { switch (response.event) { case EVENT_A: fprintf(stderr, "Client Received Event: A\n"); break; case EVENT_B: fprintf(stderr, "Client Received Event: B\n"); break; case EVENT_C: fprintf(stderr, "Client Received Event: C\n"); break; case EVENT_Z: fprintf(stderr, "Client Received Event: Z\n"); break; } } } } return 0; } gsoap-2.8.28/gsoap/samples/oneway++/handler.cpp0000644000175000017500000001264112653650156020627 0ustar ellertellert/* handler.cpp Multi-threaded C++ stand-alone event handler service Events are based on one-way SOAP messaging using HTTP keep-alive for persistent connections The 'synchronous' global flag illustrates SOAP one-way messaging, which requires an HTTP OK response with an empty body to be returned by the server. Compile: soapcpp2 -i event.h cc -o handler++ handler.cpp stdsoap2.cpp soapC.cpp soapEventService.cpp soapEventProxy.cpp Run: handler 18000 & Server will time out after 24hr of inactivity This code enables keep-alive support which can cause "broken pipes" when the client prematurely closes the connection while indicating it wants the connection to stay alive. Broken pipes (SIGPIPE) can be fixed using MSG_NOSIGNAL, SO_NOSIGPIPE, or with a signal handler, but this is not very portable (see code below) -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapEventService.h" #include "soapEventProxy.h" #include "Event.nsmap" #include #ifdef _POSIX_THREADS #include // use Pthreads #endif #define BACKLOG (100) #define TIMEOUT (24*60*60) /* timeout after 24hrs of inactivity */ void *process_request(void*); int synchronous = 1; /* synchronous=0: asynchronous one-way messaging over HTTP (no HTTP response) */ /* synchronous=1: SOAP interoperable synchronous one-way messaging over HTTP */ int main(int argc, char **argv) { if (argc < 2) { fprintf(stderr, "Usage: handler \n"); exit(1); } int port = atoi(argv[1]); /* server with keep I/O alive and timeout settings */ EventService handler(SOAP_IO_KEEPALIVE, SOAP_IO_KEEPALIVE | SOAP_XML_INDENT); handler.accept_timeout = TIMEOUT; handler.bind_flags |= SO_REUSEADDR; /* don't use this in unsecured environments */ /* handler.socket_flags = MSG_NOSIGNAL; */ /* use this to disable SIGPIPE */ /* handler.bind_flags |= SO_NOSIGPIPE; */ /* or use this to disable SIGPIPE */ SOAP_SOCKET m = handler.bind(NULL, port, BACKLOG); if (!soap_valid_socket(m)) { handler.soap_print_fault(stderr); exit(1); } fprintf(stderr, "Socket connection successful %d\n", m); for (int i = 1; ; i++) { SOAP_SOCKET s = handler.accept(); if (!soap_valid_socket(s)) { if (handler.errnum) handler.soap_print_fault(stderr); else fprintf(stderr, "%s timed out\n", argv[0]); /* should really wait for threads to terminate, but 24hr timeout should be enough ... */ break; } fprintf(stderr, "Thread %d accepts socket %d connection from IP %d.%d.%d.%d\n", i, s, (int)(handler.ip>>24)&0xFF, (int)(handler.ip>>16)&0xFF, (int)(handler.ip>>8)&0xFF, (int)handler.ip&0xFF); EventService *thandler = handler.copy(); #ifdef _POSIX_THREADS pthread_t tid; pthread_create(&tid, NULL, (void*(*)(void*))process_request, (void*)thandler); #else process_request((void*)thandler); #endif } return 0; } void *process_request(void *thandler) { EventService *handler = (EventService *)thandler; #ifdef _POSIX_THREADS pthread_detach(pthread_self()); #endif handler->serve(); delete handler; return NULL; } int EventService::handle(enum ns__event event) { switch (event) { /* each event is just consumed without server response */ case EVENT_A: fprintf(stderr, "Server Received Event: A\n"); break; case EVENT_B: fprintf(stderr, "Server Received Event: B\n"); break; case EVENT_C: fprintf(stderr, "Server Received Event: C\n"); break; /* after receiving event Z, we echo events A to C back to the client */ case EVENT_Z: fprintf(stderr, "Server Received Event: Z\n"); { /* create a proxy with a copy of the server state */ EventProxy proxy(*this); /* send message over HTTP on current socket */ proxy.soap_endpoint = "http://"; /* these multiple sends assume that the client enabled keep-alive */ fprintf(stderr, "Server Sends Event: A\n"); proxy.send_handle(EVENT_A); fprintf(stderr, "Server Sends Event: B\n"); proxy.send_handle(EVENT_B); fprintf(stderr, "Server Sends Event: C\n"); proxy.send_handle(EVENT_C); } } if (event != EVENT_Z && synchronous) return send_handle_empty_response(SOAP_OK); return SOAP_OK; } gsoap-2.8.28/gsoap/samples/oneway++/README.txt0000644000175000017500000001574512653650156020214 0ustar ellertellert C++-style eventing client and event handler server. Events are one-way SOAP messages using HTTP keep-alive for persistent connections. This example illustrates one-way message exchange patterns (MEP) between a client and server, each with C and C++ implementations. samples/event: event.c C-based client handler.c C-based multithreaded server (uses Pthreads) samples/event++: event.cpp C++-based client handler.cpp C++-based server (uses Pthreads) For HTTP communications events are not truly one-way, since HTTP Accept or OK responses are expected to be returned to the client. Thus, this is a form of synchronous communication with rendezvous. The code also supports true one-way messaging, by setting the global flag synchronous = 0. Note that all send operations may or may not block. Receive operations always block. All four files are built with the web service definitions given in the gSOAP header file event.h. The event.h file is processed with soapcpp2 as follows: Compilation in C: soapcpp2 -c event.h cc -o event event.c stdsoap2.c soapC.c soapClient.c cc -o handler handler.c stdsoap2.c soapC.c soapServer.c Compilation in C++: soapcpp2 -i event.h cc -o event++ event.cpp stdsoap2.cpp soapC.cpp soapEventProxy.cpp cc -o handler++ handler.cpp stdsoap2.cpp soapC.cpp soapEventService.cpp soap EventProxy.cpp The C client-side uses: Initialization of the runtime engine: soap_init(struct soap*) soap_init2(struct soap*, soap_mode input_modes, soap_mode output_modes) Sending an event to the handler, this function is generated by soapcpp2: soap_send_ns__handle(struct soap*, const char *endpoint, const char *action, enum ns__event event) Note: pass endpoint=NULL and action=NULL for defaults To accept an HTTP Accept or OK message (ack): soap_recv_empty_response(struct soap*) Receiving an event from the handler, this function is generated by soapcpp2: soap_recv_ns__handle(struct soap*, struct ns__handle*) Set and reset HTTP keep-alive connections (optional): soap_set_omode(soap, SOAP_IO_KEEPALIVE) soap_clr_omode(soap, SOAP_IO_KEEPALIVE) Close the socket (to end a keep-alive session) soap_closesocket(struct soap*) Print communication errors: soap_print_fault(struct soap*, FILE*) Allocate data, which stays alive until deallocated by soap_end() soap_malloc(struct soap*, size_t len) Delete deserialized data: soap_end(struct soap*) Finalize and detach the runtime engine: soap_done(struct soap*) The multi-threaded C server-side uses: Initialization of the runtime engine: soap_init(struct soap*) soap_init2(struct soap*, soap_mode input_modes, soap_mode output_modes) Binding the port: soap_bind(struct soap*, const char *host, int port, int backlog) Accepting a request: soap_accept(struct soap*); Invoking the service dispatcher, this function is generated by soapcpp2: soap_serve(struct soap*) Print communication errors: soap_print_fault(struct soap*, FILE*) Allocate data, which stays alive until deallocated by soap_end() soap_malloc(struct soap*, size_t len) Delete deserialized data: soap_end(struct soap*) Send back sender-related fault: soap_sender_fault(struct soap*, const char *string, const char *detailXML) Send back receiver-related fault: soap_receiver_fault(struct soap*, const char *string, const char *detailXML) Make a copy of the current runtime engine: soap_copy(struct soap*) Finalize and detach the runtime engine: soap_done(struct soap*) Finalize, detach, and delete the runtime engine: soap_free(struct soap*) Service operation is not auto-generated (user-defined): ns__handle(struct soap*, enum ns__event *event); Sending an event to the client, this function is generated by soapcpp2: soap_send_ns__handle(struct soap*, const char *endpoint, const char *action, enum ns__event event) where we use endpoint = "http://" to send message over current socket The C++ client-side uses a proxy generated with soapcpp2 -i: class EventProxy Constructor EventProxy(soap_mode input_output_modes) The default endpoint can be changed: const char *EventProxxy::endpoint Invoke a call of xyz: EventProxy::xyz(double a, double b, double *result) Print communication errors: EventProxy::soap_stream_fault(std::ostream&) Error code (see list of error codes in documentation and stdsoap2.h): EventProxy::error Allocate data, deallocated by soap_end() or EventService destructor soap_malloc(EventService*, size_t len) Get new instance of class X, deallocated by soap_destroy() or EventService destructor soap_new_X(EventService*, -1) Get array of new instances of class X, deallocated by soap_destroy() or EventService destructor soap_new_X(EventService*, arraylen) Delete deserialized C++ class instances (also part of EventService destructor): soap_destroy(EventService*) Delete deserialized data (also part of EventService destructor): soap_end(EventService*) The C++ server-side uses the server and proxy classes generated with soapcpp2 option -i. A proxy instance is needed for the one-way send operation. Create a serivce copy for new thread EventService::copy() Bind port EventService::bind(const char *host, int port, int backlog) Accept and set socket EventService::accept() Serve requests over current socket EventService::serve() Print communication errors: EventService::soap_stream_fault(std::ostream&) Error code (see list of error codes in documentation and stdsoap2.h): EventService::error Send back sender-related fault: EventService::soap_senderfault(const char *string, const char *detailXML) Send back sender-related fault with subcode (SOAP 1.2): EventService::soap_senderfault(const char *subcodeQName, const char *string, const char *detailXML) Send back receiver-related fault: EventService::soap_receiverfault(const char *string, const char *detailXML) Send back receiver-related fault with subcode (SOAP 1.2): EventService::soap_receiverfault(const char *subcodeQName, const char *string, const char *detailXML) Service operations are user-defined (not auto-generated): EventService::handle(enum ns__event *event) Allocate data, deallocated by soap_end() or EventService destructor soap_malloc(EventService*, size_t len) Get new instance of class X, deallocated by soap_destroy() or EventService destructor soap_new_X(EventService*, -1) Get array of new instances of class X, deallocated by soap_destroy() or EventService destructor soap_new_X(EventService*, arraylen) Delete deserialized C++ class instances (also part of EventService destructor): soap_destroy(EventService*) Delete deserialized data (also part of EventService destructor): soap_end(EventService*) Note: all soap_xyz(struct soap*, ...) gSOAP API functions are also available to the EventProxy and EventService classes by inheritance of the struct soap runtime engine state object. gsoap-2.8.28/gsoap/samples/oneway++/Makefile.am0000644000175000017500000000125712653650156020543 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 noinst_PROGRAMS = event handler SOAPHEADER = event.h include ../Makefile.defines include ../Makefile.cpp_proxy_rules SOAP_NS = Event.nsmap Event.wsdl event_SOURCES = event.cpp $(SOAPHEADER) $(SOAP_CPP_CORE) soapEventProxy.cpp event_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) handler_SOURCES = handler.cpp $(SOAPHEADER) $(SOAP_CPP_CORE) soapEventService.cpp soapEventProxy.cpp handler_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) -lpthread gsoap-2.8.28/gsoap/samples/factorytest/0000755000175000017500000000000012653650170017415 5ustar ellertellertgsoap-2.8.28/gsoap/samples/factorytest/Makefile.in0000644000175000017500000004570512653650170021475 0ustar ellertellert# Makefile.in generated by automake 1.14 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = factorytest$(EXEEXT) DIST_COMMON = $(srcdir)/../Makefile.defines \ $(srcdir)/../Makefile.cpp_rules $(srcdir)/Makefile.in \ $(srcdir)/Makefile.am $(top_srcdir)/mkinstalldirs \ $(top_srcdir)/depcomp subdir = gsoap/samples/factorytest ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = am__objects_2 = soapC.$(OBJEXT) am__objects_3 = soapClient.$(OBJEXT) $(am__objects_2) am_factorytest_OBJECTS = factorytest.$(OBJEXT) $(am__objects_1) \ $(am__objects_3) factorytest_OBJECTS = $(am_factorytest_OBJECTS) am__DEPENDENCIES_1 = factorytest_DEPENDENCIES = $(SOAP_CPP_LIB) $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(factorytest_SOURCES) DIST_SOURCES = $(factorytest_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ STRIP = @STRIP@ VERSION = @VERSION@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 SOAPHEADER = factorytest.h AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a SOAP_CPP_SRC = $(SOAP_CPP_CLIENT) soapServer.cpp $(SOAP_H_FILES) $(SOAP_NS) LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_CPP_SRC) CLEANFILES = $(SOAP_CPP_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.cpp soap*Proxy.h soap*Proxy.cpp soap*Object.h soap*Service.h soap*Service.cpp soapClient.cpp soapServer.cpp soapClientLib.cpp soapServerLib.cpp *~ SOAP_NS = factorytest.nsmap factorytest.wsdl factorytest_SOURCES = factorytest.cpp $(SOAPHEADER) $(SOAP_CPP_CLIENT) factorytest_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_rules $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/factorytest/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/factorytest/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_rules: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) factorytest$(EXEEXT): $(factorytest_OBJECTS) $(factorytest_DEPENDENCIES) $(EXTRA_factorytest_DEPENDENCIES) @rm -f factorytest$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(factorytest_OBJECTS) $(factorytest_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/factorytest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapC.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapClient.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am $(SOAP_CPP_SRC) : $(SOAPHEADER) $(SOAP) -L -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $(SOAPHEADER) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.28/gsoap/samples/factorytest/factorytest.h0000644000175000017500000000724212653650154022144 0ustar ellertellert/* factorytest.h Client-side remote object factory definitions -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap ns service name: factorytest //gsoap ns service style: rpc //gsoap ns service encoding: encoded //gsoap ns service namespace: http://websrv.cs.fsu.edu/~engelen/factory.wsdl //gsoap ns service location: http://localhost:18085 //gsoap ns schema namespace: urn:factoryService //gsoap t schema namespace: urn:factoryTypes //gsoap h schema namespace: urn:factoryHandles //////////////////////////////////////////////////////////////////////////////// // // SOAP Header: used to exchange stateful object handles // //////////////////////////////////////////////////////////////////////////////// struct SOAP_ENV__Header { mustUnderstand unsigned int h__handle; }; //////////////////////////////////////////////////////////////////////////////// // // Remote factory objects // //////////////////////////////////////////////////////////////////////////////// enum t__object // object types: { ROOT, // t__root object ADDER, // t__adder object COUNTER // t__counter object }; enum t__status // remote object status: { FACTORY_OK, // ok FACTORY_INVALID, // invalid handle (wrong type of object or lease expired) FACTORY_NOTFOUND, // lookup operation not successful FACTORY_RETRY // cannot create new object: try later }; //////////////////////////////////////////////////////////////////////////////// // // Remote factory method interfaces // //////////////////////////////////////////////////////////////////////////////// int ns__create(enum t__object object, char *name, enum t__status &status); int ns__lookup(enum t__object object, char *name, enum t__status &status); int ns__rename(char *name, enum t__status &status); int ns__release(enum t__status &status); //////////////////////////////////////////////////////////////////////////////// // // Rewote adder method interfaces // //////////////////////////////////////////////////////////////////////////////// int ns__set(double val, enum t__status &status); int ns__get(double &val); int ns__add(double val, enum t__status &status); //////////////////////////////////////////////////////////////////////////////// // // Remote counter method interfaces // //////////////////////////////////////////////////////////////////////////////// int ns__inc(enum t__status &status); gsoap-2.8.28/gsoap/samples/factorytest/factorytest.cpp0000644000175000017500000001541612653650154022501 0ustar ellertellert/* factorytest.cpp Test client for remote object factory This is a simple example client program that defines its own proxy objects. The proxy objects utilize the gSOAP remote interfaces to access the remote factory. The remote object interfaces are declared in factorytest.h. Since the remote interfaces are C-style, C-based client programs cam be developed to access remote object factories. Compile: soapcpp2 factorytest.h c++ -o factorytest factorytest.cpp stdsoap2.cpp soapC.cpp soapClient.cpp Run: factorytest where is the service endpoint of a factory server, e.g. http://localhost:18085 -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" #include "factorytest.nsmap" #include // default factory service endpoint: const char *factory = "http://localhost:18085"; //////////////////////////////////////////////////////////////////////////////// // // Client-side root proxy class // //////////////////////////////////////////////////////////////////////////////// class Root { public: char *endpoint; // factory service endpoint enum t__status status; // status flag struct soap *soap; // gSOAP environment (for header h__handle) Root(); Root(const char *factory, enum t__object object, char *name); virtual ~Root(); void rename(char *name); }; Root::Root() { endpoint = NULL; status = FACTORY_OK; soap = NULL; } Root::Root(const char *factory, enum t__object object, char *name) { soap = soap_new(); endpoint = soap_strdup(soap, factory); status = FACTORY_NOTFOUND; if (name) if (soap_call_ns__lookup(soap, endpoint, "", object, name, status)) soap_print_fault(soap, stderr); // for demo, just print if (status == FACTORY_NOTFOUND) do { if (soap_call_ns__create(soap, endpoint, "", object, name, status)) soap_print_fault(soap, stderr); // for demo, just print } while (status == FACTORY_RETRY); } Root::~Root() { if (soap_call_ns__release(soap, endpoint, "", status)) soap_print_fault(soap, stderr); // for demo, just print soap_destroy(soap); soap_end(soap); soap_free(soap); } void Root::rename(char *name) { if (soap_call_ns__rename(soap, endpoint, "", name, status)) soap_print_fault(soap, stderr); // for demo, just print } //////////////////////////////////////////////////////////////////////////////// // // Client-side adder proxy class derived from root // //////////////////////////////////////////////////////////////////////////////// class Adder: public Root { public: Adder() : Root(factory, ADDER, NULL) {}; Adder(char *name) : Root(factory, ADDER, name) {}; Adder(const char *factory, enum t__object object, char *name) : Root(factory, object, name) {}; void set(double val); // to set the remote adder double get(); // to get value of the remote adder void add(double val); // to add a value to the remote adder }; void Adder::set(double val) { if (soap_call_ns__set(soap, endpoint, "", val, status)) soap_print_fault(soap, stderr); // for demo, just print } double Adder::get() { double val; if (soap_call_ns__get(soap, endpoint, "", val)) soap_print_fault(soap, stderr); // for demo, just print return val; } void Adder::add(double val) { if (soap_call_ns__add(soap, endpoint, "", val, status)) soap_print_fault(soap, stderr); // for demo, just print } //////////////////////////////////////////////////////////////////////////////// // // Client-side counter proxy class derived from adder // //////////////////////////////////////////////////////////////////////////////// class Counter: public Adder { public: Counter() : Adder(factory, COUNTER, NULL) {}; Counter(char *name) : Adder(factory, COUNTER, name) {}; Counter(const char *factory, enum t__object object, char *name) : Adder(factory, object, name) {}; void inc(); // to increment the remote counter }; void Counter::inc() { if (soap_call_ns__inc(soap, endpoint, "", status)) soap_print_fault(soap, stderr); // for demo, just print } //////////////////////////////////////////////////////////////////////////////// // // Main client test program // //////////////////////////////////////////////////////////////////////////////// int main(int argc, char **argv) { if (argc > 1) factory = argv[1]; // use factory from command line arg by default std::cout << "Connecting to factory " << factory << std::endl; Adder adder; // create unique new remote adder object Counter counter1((char*)"myCounter"); // new counter object "myCounter" (created if not exists) Counter counter2((char*)"myCounter"); // lookup and use counter "myCounter" (this is an alias to counter1!) adder.set(2.0); counter1.set(adder.get()); adder.add(3.0); counter1.inc(); std::cout << "Adder=" << adder.get() << std::endl; std::cout << "Counter=" << counter2.get() << std::endl; // counter2 is an alias for counter1 so this prints the value of counter1 std::cout << "Sleep for 90 seconds to test factory server purging objects:" << std::endl; // counter is periodically incremented which keeps it alive sleep(30); counter1.inc(); std::cout << "Counter=" << counter2.get() << std::endl; sleep(30); counter1.inc(); std::cout << "Counter=" << counter2.get() << std::endl; sleep(30); counter1.inc(); std::cout << "Counter=" << counter2.get() << std::endl; // after 90 secs, the adder should be gone std::cout << "Adder is no longer available:" << std::endl; adder.add(3.0); std::cout << "Adder status = " << adder.status << std::endl; return 0; } gsoap-2.8.28/gsoap/samples/factorytest/README.txt0000644000175000017500000000065312653650154021121 0ustar ellertellert A remote object factory client. See samples/factory for the server code. Server objects are instantiated, manipulated, and destroyed remotely using SOAP messages. The objects are persistent and can be named. Objects are purged when their lease expires. A lease is renewed when the object is used. The client-side message definitions do not include the server object definitions, since only the messaging parts are needed. gsoap-2.8.28/gsoap/samples/factorytest/Makefile.am0000644000175000017500000000102412653650154021450 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 noinst_PROGRAMS = factorytest SOAPHEADER = factorytest.h include ../Makefile.defines include ../Makefile.cpp_rules SOAP_NS = factorytest.nsmap factorytest.wsdl factorytest_SOURCES = factorytest.cpp $(SOAPHEADER) $(SOAP_CPP_CLIENT) factorytest_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) gsoap-2.8.28/gsoap/samples/oneway/0000755000175000017500000000000012653650166016355 5ustar ellertellertgsoap-2.8.28/gsoap/samples/oneway/event.h0000644000175000017500000000370112653650156017647 0ustar ellertellert/* -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap ns service name: Event Service is a simple remote event handler //gsoap ns service style: rpc //gsoap ns service encoding: encoded //gsoap ns service namespace: http://www.cs.fsu.edu/~engelen/event.wsdl //gsoap ns service location: http://localhost:18000 //gsoap ns schema namespace: urn:event //gsoap ns schema type-documentation: event Set of four possible events enum ns__event { EVENT_A, EVENT_B, EVENT_C, EVENT_Z }; //gsoap ns service method-action: handle "event" //gsoap ns service method-documentation: handle Handles asynchronous events int ns__handle(enum ns__event event, void); gsoap-2.8.28/gsoap/samples/oneway/Makefile.in0000644000175000017500000004567512653650156020442 0ustar ellertellert# Makefile.in generated by automake 1.14 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = event$(EXEEXT) handler$(EXEEXT) DIST_COMMON = $(srcdir)/../Makefile.defines \ $(srcdir)/../Makefile.c_rules $(srcdir)/Makefile.in \ $(srcdir)/Makefile.am $(top_srcdir)/mkinstalldirs \ $(top_srcdir)/depcomp subdir = gsoap/samples/oneway ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = am__objects_2 = soapC.$(OBJEXT) am__objects_3 = soapClient.$(OBJEXT) $(am__objects_2) am_event_OBJECTS = event.$(OBJEXT) $(am__objects_1) $(am__objects_3) event_OBJECTS = $(am_event_OBJECTS) am__DEPENDENCIES_1 = event_DEPENDENCIES = $(SOAP_C_LIB) $(am__DEPENDENCIES_1) am__objects_4 = $(am__objects_3) soapServer.$(OBJEXT) $(am__objects_1) \ $(am__objects_1) am_handler_OBJECTS = handler.$(OBJEXT) $(am__objects_1) \ $(am__objects_4) handler_OBJECTS = $(am_handler_OBJECTS) handler_DEPENDENCIES = $(SOAP_C_LIB) $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(event_SOURCES) $(handler_SOURCES) DIST_SOURCES = $(event_SOURCES) $(handler_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ STRIP = @STRIP@ VERSION = @VERSION@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 SOAPHEADER = event.h AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a SOAP_C_SRC = $(SOAP_C_CLIENT) soapServer.c $(SOAP_H_FILES) $(SOAP_NS) LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_C_SRC) CLEANFILES = $(SOAP_C_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.c soapClient.c soapClientLib.c soapServer.c soapServerLib.c *~ SOAP_NS = Event.nsmap Event.wsdl event_SOURCES = event.c $(SOAPHEADER) $(SOAP_C_CLIENT) event_LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) handler_SOURCES = handler.c $(SOAPHEADER) $(SOAP_C_SRC) handler_LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) -lpthread all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.c_rules $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/oneway/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/oneway/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.c_rules: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) event$(EXEEXT): $(event_OBJECTS) $(event_DEPENDENCIES) $(EXTRA_event_DEPENDENCIES) @rm -f event$(EXEEXT) $(AM_V_CCLD)$(LINK) $(event_OBJECTS) $(event_LDADD) $(LIBS) handler$(EXEEXT): $(handler_OBJECTS) $(handler_DEPENDENCIES) $(EXTRA_handler_DEPENDENCIES) @rm -f handler$(EXEEXT) $(AM_V_CCLD)$(LINK) $(handler_OBJECTS) $(handler_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/event.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/handler.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapC.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapClient.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapServer.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am $(SOAP_C_SRC) : $(SOAPHEADER) $(SOAP) -cL -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $(SOAPHEADER) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.28/gsoap/samples/oneway/README.txt0000644000175000017500000001576212653650156020065 0ustar ellertellert C-style eventing client and event handler server. Events are one-way SOAP messages using HTTP keep-alive for persistent connections. This example illustrates one-way message exchange patterns (MEP) between a client and server, each with C and C++ implementations. samples/event: event.c C-based client handler.c C-based multithreaded server (uses Pthreads) samples/event++: event.cpp C++-based client handler.cpp C++-based server (uses simple iterative server) For HTTP communications events are not truly one-way, since HTTP Accept or OK responses are expected to be returned to the client. Thus, this is a form of synchronous communication with rendezvous. The code also supports true one-way messaging, by setting the global flag synchronous = 0. Note that all send operations may or may not block. Receive operations always block. All four files are built with the web service definitions given in the gSOAP header file event.h. The event.h file is processed with soapcpp2 as follows: Compilation in C: soapcpp2 -c event.h cc -o event event.c stdsoap2.c soapC.c soapClient.c cc -o handler handler.c stdsoap2.c soapC.c soapServer.c Compilation in C++: soapcpp2 -i event.h cc -o event++ event.cpp stdsoap2.cpp soapC.cpp soapEventProxy.cpp cc -o handler++ handler.cpp stdsoap2.cpp soapC.cpp soapEventService.cpp soap EventProxy.cpp The C client-side uses: Initialization of the runtime engine: soap_init(struct soap*) soap_init2(struct soap*, soap_mode input_modes, soap_mode output_modes) Sending an event to the handler, this function is generated by soapcpp2: soap_send_ns__handle(struct soap*, const char *endpoint, const char *action, enum ns__event event) Note: pass endpoint=NULL and action=NULL for defaults To accept an HTTP Accept or OK message (ack): soap_recv_empty_response(struct soap*) Receiving an event from the handler, this function is generated by soapcpp2: soap_recv_ns__handle(struct soap*, struct ns__handle*) Set and reset HTTP keep-alive connections (optional): soap_set_omode(soap, SOAP_IO_KEEPALIVE) soap_clr_omode(soap, SOAP_IO_KEEPALIVE) Close the socket (to end a keep-alive session) soap_closesocket(struct soap*) Print communication errors: soap_print_fault(struct soap*, FILE*) Allocate data, which stays alive until deallocated by soap_end() soap_malloc(struct soap*, size_t len) Delete deserialized data: soap_end(struct soap*) Finalize and detach the runtime engine: soap_done(struct soap*) The multi-threaded C server-side uses: Initialization of the runtime engine: soap_init(struct soap*) soap_init2(struct soap*, soap_mode input_modes, soap_mode output_modes) Binding the port: soap_bind(struct soap*, const char *host, int port, int backlog) Accepting a request: soap_accept(struct soap*); Invoking the service dispatcher, this function is generated by soapcpp2: soap_serve(struct soap*) Print communication errors: soap_print_fault(struct soap*, FILE*) Allocate data, which stays alive until deallocated by soap_end() soap_malloc(struct soap*, size_t len) Delete deserialized data: soap_end(struct soap*) Send back sender-related fault: soap_sender_fault(struct soap*, const char *string, const char *detailXML) Send back receiver-related fault: soap_receiver_fault(struct soap*, const char *string, const char *detailXML) Make a copy of the current runtime engine: soap_copy(struct soap*) Finalize and detach the runtime engine: soap_done(struct soap*) Finalize, detach, and delete the runtime engine: soap_free(struct soap*) Service operation is not auto-generated (user-defined): ns__handle(struct soap*, enum ns__event *event); Sending an event to the client, this function is generated by soapcpp2: soap_send_ns__handle(struct soap*, const char *endpoint, const char *action, enum ns__event event) where we use endpoint = "http://" to send message over current socket The C++ client-side uses a proxy generated with soapcpp2 -i: class EventProxy Constructor EventProxy(soap_mode input_output_modes) The default endpoint can be changed: const char *EventProxxy::endpoint Invoke a call of xyz: EventProxy::xyz(double a, double b, double *result) Print communication errors: EventProxy::soap_stream_fault(std::ostream&) Error code (see list of error codes in documentation and stdsoap2.h): EventProxy::error Allocate data, deallocated by soap_end() or EventService destructor soap_malloc(EventService*, size_t len) Get new instance of class X, deallocated by soap_destroy() or EventService destructor soap_new_X(EventService*, -1) Get array of new instances of class X, deallocated by soap_destroy() or EventService destructor soap_new_X(EventService*, arraylen) Delete deserialized C++ class instances (also part of EventService destructor): soap_destroy(EventService*) Delete deserialized data (also part of EventService destructor): soap_end(EventService*) The C++ server-side uses the server and proxy classes generated with soapcpp2 option -i. A proxy instance is needed for the one-way send operation. Create a serivce copy for new thread EventService::copy() Bind port EventService::bind(const char *host, int port, int backlog) Accept and set socket EventService::accept() Serve requests over current socket EventService::serve() Print communication errors: EventService::soap_stream_fault(std::ostream&) Error code (see list of error codes in documentation and stdsoap2.h): EventService::error Send back sender-related fault: EventService::soap_senderfault(const char *string, const char *detailXML) Send back sender-related fault with subcode (SOAP 1.2): EventService::soap_senderfault(const char *subcodeQName, const char *string, const char *detailXML) Send back receiver-related fault: EventService::soap_receiverfault(const char *string, const char *detailXML) Send back receiver-related fault with subcode (SOAP 1.2): EventService::soap_receiverfault(const char *subcodeQName, const char *string, const char *detailXML) Service operations are user-defined (not auto-generated): EventService::handle(enum ns__event *event) Allocate data, deallocated by soap_end() or EventService destructor soap_malloc(EventService*, size_t len) Get new instance of class X, deallocated by soap_destroy() or EventService destructor soap_new_X(EventService*, -1) Get array of new instances of class X, deallocated by soap_destroy() or EventService destructor soap_new_X(EventService*, arraylen) Delete deserialized C++ class instances (also part of EventService destructor): soap_destroy(EventService*) Delete deserialized data (also part of EventService destructor): soap_end(EventService*) Note: all soap_xyz(struct soap*, ...) gSOAP API functions are also available to the EventProxy and EventService classes by inheritance of the struct soap runtime engine state object. gsoap-2.8.28/gsoap/samples/oneway/handler.c0000644000175000017500000001312312653650156020135 0ustar ellertellert/* handler.c Multi-threaded stand-alone event handler service Events are based on one-way SOAP messaging using HTTP keep-alive for persistent connections The 'synchronous' global flag illustrates SOAP one-way messaging, which requires an HTTP OK response with an empty body to be returned by the server. Copyright (C) 2000-2007 Robert A. van Engelen. All Rights Reserved. Compile: soapcpp2 -c event.h cc -o handler handler.c stdsoap2.c soapC.c soapService.c Run: handler 18000 & Server will time out after 24hr of inactivity This code enables keep-alive support which can cause "broken pipes" when the client prematurely closes the connection while indicating it wants the connection to stay alive. Broken pipes (SIGPIPE) can be fixed using MSG_NOSIGNAL, SO_NOSIGPIPE, or with a signal handler, but this is not very portable (see code below) -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" #include "Event.nsmap" #include #if defined(_POSIX_THREADS) || defined(_SC_THREADS) #include // use Pthreads #endif #define BACKLOG (100) #define TIMEOUT (24*60*60) /* timeout after 24hrs of inactivity */ void *process_request(void*); int synchronous = 1; /* synchronous=0: asynchronous one-way messaging over HTTP (no HTTP response) */ /* synchronous=1: SOAP interoperable synchronous one-way messaging over HTTP */ int main(int argc, char **argv) { #if defined(_POSIX_THREADS) || defined(_SC_THREADS) pthread_t tid; #endif struct soap soap, *tsoap; int port; SOAP_SOCKET m, s; int i; if (argc < 2) { fprintf(stderr, "Usage: handler \n"); exit(1); } port = atoi(argv[1]); /* keep I/O alive and server timeout settings */ soap_init2(&soap, SOAP_IO_KEEPALIVE, SOAP_IO_KEEPALIVE | SOAP_XML_INDENT); soap.accept_timeout = TIMEOUT; soap.bind_flags |= SO_REUSEADDR; /* don't use this in unsecured environments */ /* soap.socket_flags = MSG_NOSIGNAL; */ /* use this to disable SIGPIPE */ /* soap.bind_flags |= SO_NOSIGPIPE; */ /* or use this to disable SIGPIPE */ m = soap_bind(&soap, NULL, port, BACKLOG); if (!soap_valid_socket(m)) { soap_print_fault(&soap, stderr); exit(1); } fprintf(stderr, "Socket connection successful %d\n", m); for (i = 1; ; i++) { s = soap_accept(&soap); if (!soap_valid_socket(s)) { if (soap.errnum) soap_print_fault(&soap, stderr); else fprintf(stderr, "%s timed out\n", argv[0]); /* should really wait for threads to terminate, but 24hr timeout should be enough ... */ break; } fprintf(stderr, "Thread %d accepts socket %d connection from IP %d.%d.%d.%d\n", i, s, (int)(soap.ip>>24)&0xFF, (int)(soap.ip>>16)&0xFF, (int)(soap.ip>>8)&0xFF, (int)soap.ip&0xFF); tsoap = soap_copy(&soap); #if defined(_POSIX_THREADS) || defined(_SC_THREADS) pthread_create(&tid, NULL, (void*(*)(void*))process_request, (void*)tsoap); #else process_request((void*)tsoap); #endif } return 0; } void *process_request(void *soap) { struct soap *tsoap = (struct soap*)soap; #if defined(_POSIX_THREADS) || defined(_SC_THREADS) pthread_detach(pthread_self()); #endif soap_serve(tsoap); soap_destroy(tsoap); soap_end(tsoap); soap_free(tsoap); return NULL; } int ns__handle(struct soap *soap, enum ns__event event) { switch (event) { /* each event is just consumed without server response */ case EVENT_A: fprintf(stderr, "Server Received Event: A\n"); break; case EVENT_B: fprintf(stderr, "Server Received Event: B\n"); break; case EVENT_C: fprintf(stderr, "Server Received Event: C\n"); break; /* after receiving event Z, we echo events A to C back to the client */ case EVENT_Z: fprintf(stderr, "Server Received Event: Z\n"); { struct soap *resp = soap_copy(soap); /* these multiple sends assume that the client enabled keep-alive */ fprintf(stderr, "Server Sends Event: A\n"); soap_send_ns__handle(resp, "http://", NULL, EVENT_A); fprintf(stderr, "Server Sends Event: B\n"); soap_send_ns__handle(resp, "http://", NULL, EVENT_B); fprintf(stderr, "Server Sends Event: C\n"); soap_send_ns__handle(resp, "http://", NULL, EVENT_C); soap_end(resp); soap_free(resp); } } if (event != EVENT_Z && synchronous) return soap_send_empty_response(soap, SOAP_OK); /* HTTP 202 Accepted */ return SOAP_OK; } gsoap-2.8.28/gsoap/samples/oneway/event.c0000644000175000017500000001151212653650156017641 0ustar ellertellert/* event.c C-style eventing client Events are based on one-way SOAP messaging using HTTP keep-alive for persistent connections. The 'synchronous' global flag illustrates SOAP one-way messaging, which requires an HTTP OK or HTTP Accept response with an empty body to be returned by the server. Copyright (C) 2000-2002 Robert A. van Engelen. All Rights Reserved. Compile: soapcpp2 -c event.h cc -o event event.c stdsoap2.c soapC.c soapClient.c Run (first start the event handler on localhost port 18000): event -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" #include "Event.nsmap" int synchronous = 1; /* synchronous=0: asynchronous one-way messaging over HTTP (no HTTP response) */ /* synchronous=1: SOAP interoperable synchronous one-way messaging over HTTP */ /* Service details (copied from event.h): */ const char *event_handler_endpoint = "http://localhost:18000"; const char *event_handler_action = "event"; int main() { struct soap soap; soap_init2(&soap, SOAP_IO_KEEPALIVE, SOAP_IO_KEEPALIVE | SOAP_XML_INDENT); /* Events A to C do not generate a response from the server */ fprintf(stderr, "Client Sends Event: A\n"); if (soap_send_ns__handle(&soap, event_handler_endpoint, event_handler_action, EVENT_A)) soap_print_fault(&soap, stderr); if (synchronous && soap_recv_empty_response(&soap)) soap_print_fault(&soap, stderr); fprintf(stderr, "Client Sends Event: B\n"); if (soap_send_ns__handle(&soap, event_handler_endpoint, event_handler_action, EVENT_B)) soap_print_fault(&soap, stderr); if (synchronous && soap_recv_empty_response(&soap)) soap_print_fault(&soap, stderr); /* reset keep-alive when client needs to inform the server that it will close the connection. It may reconnect later */ soap_clr_omode(&soap, SOAP_IO_KEEPALIVE); fprintf(stderr, "Client Sends Event: C\n"); if (soap_send_ns__handle(&soap, event_handler_endpoint, event_handler_action, EVENT_C)) soap_print_fault(&soap, stderr); if (synchronous && soap_recv_empty_response(&soap)) soap_print_fault(&soap, stderr); /* close the socket */ soap_closesock(&soap); /* re-enable keep-alive which is required to accept and execute multiple receives */ soap_set_omode(&soap, SOAP_IO_KEEPALIVE); /* Events Z generates a series of response from the server */ fprintf(stderr, "Client Sends Event: Z\n"); if (soap_send_ns__handle(&soap, event_handler_endpoint, event_handler_action, EVENT_Z)) soap_print_fault(&soap, stderr); else { struct ns__handle response; for (;;) { if (!soap_valid_socket(soap.socket)) { fprintf(stderr, "Connection was terminated (keep alive disabled?)\n"); break; } if (soap_recv_ns__handle(&soap, &response)) { if (soap.error == SOAP_EOF) fprintf(stderr, "Connection was gracefully closed by server\n"); else soap_print_fault(&soap, stderr); break; } else { switch (response.event) { case EVENT_A: fprintf(stderr, "Client Received Event: A\n"); break; case EVENT_B: fprintf(stderr, "Client Received Event: B\n"); break; case EVENT_C: fprintf(stderr, "Client Received Event: C\n"); break; case EVENT_Z: fprintf(stderr, "Client Received Event: Z\n"); break; } } } } soap_closesock(&soap); /* EVENT_Z has no HTTP response (fire and forget), so close the socket */ soap_end(&soap); /* this will close the socket too (if keep alive is off), just in case */ soap_done(&soap); /* detach environment (also closes sockets even with keep-alive) */ return 0; } gsoap-2.8.28/gsoap/samples/oneway/Makefile.am0000644000175000017500000000114112653650156020405 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 noinst_PROGRAMS = event handler SOAPHEADER = event.h include ../Makefile.defines include ../Makefile.c_rules SOAP_NS = Event.nsmap Event.wsdl event_SOURCES = event.c $(SOAPHEADER) $(SOAP_C_CLIENT) event_LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) handler_SOURCES = handler.c $(SOAPHEADER) $(SOAP_C_SRC) handler_LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) -lpthread gsoap-2.8.28/gsoap/samples/calc++/0000755000175000017500000000000012653650162016077 5ustar ellertellertgsoap-2.8.28/gsoap/samples/calc++/Makefile.in0000644000175000017500000004717712653650162020164 0ustar ellertellert# Makefile.in generated by automake 1.14 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = calcclient$(EXEEXT) calcserver$(EXEEXT) DIST_COMMON = $(srcdir)/../Makefile.defines \ $(srcdir)/../Makefile.cpp_proxy_rules $(srcdir)/Makefile.in \ $(srcdir)/Makefile.am $(top_srcdir)/mkinstalldirs \ $(top_srcdir)/depcomp subdir = gsoap/samples/calc++ ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = am__objects_2 = soapC.$(OBJEXT) am_calcclient_OBJECTS = calcclient.$(OBJEXT) $(am__objects_1) \ $(am__objects_2) soapcalcProxy.$(OBJEXT) calcclient_OBJECTS = $(am_calcclient_OBJECTS) am__DEPENDENCIES_1 = calcclient_DEPENDENCIES = $(SOAP_CPP_LIB) $(am__DEPENDENCIES_1) am_calcserver_OBJECTS = calcserver.$(OBJEXT) $(am__objects_1) \ $(am__objects_2) soapcalcService.$(OBJEXT) calcserver_OBJECTS = $(am_calcserver_OBJECTS) calcserver_DEPENDENCIES = $(SOAP_CPP_LIB) $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(calcclient_SOURCES) $(calcserver_SOURCES) DIST_SOURCES = $(calcclient_SOURCES) $(calcserver_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ STRIP = @STRIP@ VERSION = @VERSION@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 SOAPHEADER = calc.h AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a SOAP_CPP_SRC = $(SOAP_H_FILES) $(SOAP_NS) LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_CPP_SRC) CLEANFILES = $(SOAP_CPP_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.cpp soap*Proxy.h soap*Proxy.cpp soap*Object.h soap*Service.h soap*Service.cpp soapClient.cpp soapServer.cpp soapClientLib.cpp soapServerLib.cpp *~ SOAP_NS = calc.nsmap calc.wsdl calcclient_SOURCES = calcclient.cpp $(SOAPHEADER) $(SOAP_CPP_CORE) soapcalcProxy.cpp calcclient_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) calcserver_SOURCES = calcserver.cpp $(SOAPHEADER) $(SOAP_CPP_CORE) soapcalcService.cpp calcserver_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) -lm all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_proxy_rules $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/calc++/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/calc++/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_proxy_rules: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) calcclient$(EXEEXT): $(calcclient_OBJECTS) $(calcclient_DEPENDENCIES) $(EXTRA_calcclient_DEPENDENCIES) @rm -f calcclient$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(calcclient_OBJECTS) $(calcclient_LDADD) $(LIBS) calcserver$(EXEEXT): $(calcserver_OBJECTS) $(calcserver_DEPENDENCIES) $(EXTRA_calcserver_DEPENDENCIES) @rm -f calcserver$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(calcserver_OBJECTS) $(calcserver_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/calcclient.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/calcserver.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapC.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapcalcProxy.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapcalcService.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am $(SOAP_CPP_SRC) : $(SOAPHEADER) $(SOAP) -i -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $< # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.28/gsoap/samples/calc++/README.txt0000644000175000017500000001333712653650154017605 0ustar ellertellertSimple calculator service implements: add(a,b) sub(a,b) mul(a,b) div(a,b) pow(a,b) Compilation in C (see samples/calc): soapcpp2 -c calc.h cc -o calcclient calcclient.c stdsoap2.c soapC.c soapClient.c cc -o calcserver calcserver.c stdsoap2.c soapC.c soapServer.c Compilation in C++ (see samples/calc++): soapcpp2 -i calc.h cc -o calcclient++ calcclient.cpp stdsoap2.cpp soapC.cpp soapcalcProxy.cpp cc -o calcserver++ calcserver.cpp stdsoap2.cpp soapC.cpp soapcalcService.cpp For C++ development soapcpp2 option -i generates proxy and service classes, which encapsulate the method operations in the class instead of defining them as global functions as in C. The calcclient application invokes the service and is used from the command line as follows: $ calcclient add 3 4 result = 7 The calcserver application is a CGI application that can be installed under the cgibin of your Web server. The C client-side uses: Initialization of the runtime engine: soap_init(struct soap*) Invoking a call of xyz, this function is generated by soapcpp2: soap_call_ns__xyz(struct soap*, const char *endpoint, const char *action, double a, double b, double *result) Note: endpoint=NULL and action=NULL for defaults Print communication errors: soap_print_fault(struct soap*, FILE*) Allocate data, which stays alive until deallocated by soap_end() soap_malloc(struct soap*, size_t len) Delete deserialized data: soap_end(struct soap*) Finalize and detach the runtime engine: soap_done(struct soap*) The C server-side uses: Initialization of the runtime engine: soap_init(struct soap*) Binding the port: soap_bind(struct soap*, const char *host, int port, int backlog) Accepting a request: soap_accept(struct soap*); Invoking the service dispatcher, this function is generated by soapcpp2: soap_serve(struct soap*) Print communication errors: soap_print_fault(struct soap*, FILE*) Allocate data, which stays alive until deallocated by soap_end() soap_malloc(struct soap*, size_t len) Delete deserialized data: soap_end(struct soap*) Send back sender-related fault: soap_sender_fault(struct soap*, const char *string, const char *detailXML) Send back receiver-related fault: soap_receiver_fault(struct soap*, const char *string, const char *detailXML) Finalize and detach the runtime engine: soap_done(struct soap*) Service operations are not auto-generated (user-defined): ns__add(struct soap*, double a, double b, double *result) ns__sub(struct soap*, double a, double b, double *result) ns__mul(struct soap*, double a, double b, double *result) ns__div(struct soap*, double a, double b, double *result) ns__pow(struct soap*, double a, double b, double *result) The C++ client-side uses a proxy generated with soapcpp2 -i: class calcProxy The default endpoint can be changed: const char *calcProxxy::endpoint Invoke a call of xyz: calcProxy::xyz(double a, double b, double *result) Print communication errors: calcProxy::soap_stream_fault(std::ostream&) Error code (see list of error codes in documentation and stdsoap2.h): calcProxy::error Allocate data, deallocated by soap_end() or calcProxy destructor soap_malloc(calcProxy*, size_t len) Get new instance of class X, deallocated by soap_destroy() or calcProxy destructor soap_new_X(calcProxy*, -1) Get array of new instances of class X, deallocated by soap_destroy() or calcProxy destructor soap_new_X(calcProxy*, arraylen) Delete deserialized C++ class instances (also part of calcProxy destructor): soap_destroy(calcProxy*) Delete deserialized data (also part of calcProxy destructor): soap_end(calcProxy*) The C++ server-side uses a class generated with soapcpp2 -i: class calcService Serve requests over stdin/out (for CGI) calcService::serve() Serve multiple requests over port (iterative HTTP server): calcService::run() Print communication errors: calcService::soap_stream_fault(std::ostream&) Error code (see list of error codes in documentation and stdsoap2.h): calcService::error Send back sender-related fault: calcService::soap_senderfault(const char *string, const char *detailXML) Send back sender-related fault with subcode (SOAP 1.2): calcService::soap_senderfault(const char *subcodeQName, const char *string, const char *detailXML) Send back receiver-related fault: calcService::soap_receiver_fault(const char *string, const char *detailXML) Send back receiver-related fault with subcode (SOAP 1.2): calcService::soap_receiver_fault(const char *subcodeQName, const char *string, const char *detailXML) Service operations are user-defined (not auto-generated): calcService::add(double a, double b, double *result) calcService::sub(double a, double b, double *result) calcService::mul(double a, double b, double *result) calcService::div(double a, double b, double *result) calcService::pow(double a, double b, double *result) Allocate data, deallocated by soap_end() or calcService destructor soap_malloc(calcService*, size_t len) Get new instance of class X, deallocated by soap_destroy() or calcService destructor soap_new_X(calcService*, -1) Get array of new instances of class X, deallocated by soap_destroy() or calcService destructor soap_new_X(calcService*, arraylen) Delete deserialized C++ class instances (also part of calcService destructor): soap_destroy(calcService*) Delete deserialized data (also part of calcService destructor): soap_end(calcService*) Note: all soap_xyz(struct soap*, ...) gSOAP API functions are also available to the calcProxy and calcService classes by inheritance of the struct soap runtime engine state object. gsoap-2.8.28/gsoap/samples/calc++/calc.h0000644000175000017500000001041012653650154017147 0ustar ellertellert/* calc.h This is a gSOAP header file with web service definitions. The service operations and type definitions use familiar C/C++ syntax. The following methods are defined by this gSOAP service definition: add(a,b) sub(a,b) mul(a,b) div(a,b) pow(a,b) Compilation in C (see samples/calc): $ soapcpp2 -c calc.h $ cc -o calcclient calcclient.c stdsoap2.c soapC.c soapClient.c $ cc -o calcserver calcserver.c stdsoap2.c soapC.c soapServer.c Compilation in C++ (see samples/calc++): $ soapcpp2 -i calc.h $ cc -o calcclient++ calcclient.cpp stdsoap2.cpp soapC.cpp soapcalcProxy.cpp $ cc -o calcserver++ calcserver.cpp stdsoap2.cpp soapC.cpp soapcalcService.cpp Note that soapcpp2 option -i generates proxy and service classes, which encapsulate the method operations in the class instead of defining them as global functions as in C. The //gsoap directives are used to bind XML namespaces and to define Web service properties: //gsoap service name: //gsoap service style: [rpc|document] //gsoap service encoding: [literal|encoded] //gsoap service namespace: //gsoap service location: Web service operation properties: //gsoap service method-style: [rpc|document] //gsoap service method-encoding: [literal|encoded] //gsoap service method-action: //gsoap service method-documentation: and type schema properties: //gsoap schema namespace: //gsoap schema elementForm: [qualified|unqualified] //gsoap schema attributeForm: [qualified|unqualified] //gsoap schema documentation: //gsoap schema type-documentation: where is an XML namespace prefix, which is used in C/C++ operation names, e.g. ns__add(), and type names, e.g. xsd__int. See the documentation for the full list of //gsoap directives. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap ns service name: calc Simple calculator service //gsoap ns service protocol: SOAP //gsoap ns service style: rpc //gsoap ns service encoding: encoded //gsoap ns service namespace: http://websrv.cs.fsu.edu/~engelen/calc.wsdl //gsoap ns service location: http://websrv.cs.fsu.edu/~engelen/calcserver.cgi //gsoap ns schema namespace: urn:calc //gsoap ns service method-documentation: add Sums two values int ns__add(double a, double b, double *result); //gsoap ns service method-documentation: sub Subtracts two values int ns__sub(double a, double b, double *result); //gsoap ns service method-documentation: mul Multiplies two values int ns__mul(double a, double b, double *result); //gsoap ns service method-documentation: div Divides two values int ns__div(double a, double b, double *result); //gsoap ns service method-documentation: pow Raises a to b int ns__pow(double a, double b, double *result); gsoap-2.8.28/gsoap/samples/calc++/Makefile.am0000644000175000017500000000125712653650154020141 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 noinst_PROGRAMS = calcclient calcserver SOAPHEADER = calc.h include ../Makefile.defines include ../Makefile.cpp_proxy_rules SOAP_NS = calc.nsmap calc.wsdl calcclient_SOURCES = calcclient.cpp $(SOAPHEADER) $(SOAP_CPP_CORE) soapcalcProxy.cpp calcclient_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) calcserver_SOURCES = calcserver.cpp $(SOAPHEADER) $(SOAP_CPP_CORE) soapcalcService.cpp calcserver_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) -lm gsoap-2.8.28/gsoap/samples/calc++/calcclient.cpp0000644000175000017500000000512012653650154020703 0ustar ellertellert/* calcclient.cpp Example calculator service client in C++ Service definitions in calc.h (not generated by wsdl2h, but similar) $ soapcpp2 -i calc.h $ cc -o calcclient calcclient.cpp stdsoap2.cpp soapC.cpp soapcalcProxy.cpp where stdsoap2.cpp is in the 'gsoap' directory, or use libgsoap++: $ cc -o calcclient calcclient.cpp soapC.cpp soapcalcProxy.cpp -lgsoap++ -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapcalcProxy.h" #include "calc.nsmap" const char server[] = "http://websrv.cs.fsu.edu/~engelen/calcserver.cgi"; int main(int argc, char **argv) { if (argc < 4) { fprintf(stderr, "Usage: [add|sub|mul|div|pow] num num\n"); exit(0); } double a, b, result; a = strtod(argv[2], NULL); b = strtod(argv[3], NULL); calcProxy calc; calc.soap_endpoint = server; switch (*argv[1]) { case 'a': calc.add(a, b, &result); break; case 's': calc.sub(a, b, &result); break; case 'm': calc.mul(a, b, &result); break; case 'd': calc.div(a, b, &result); break; case 'p': calc.pow(a, b, &result); break; default: fprintf(stderr, "Unknown command\n"); exit(0); } if (calc.error) calc.soap_stream_fault(std::cerr); else printf("result = %g\n", result); return 0; } gsoap-2.8.28/gsoap/samples/calc++/calcserver.cpp0000644000175000017500000000616212653650154020742 0ustar ellertellert/* calcserver.cpp Example calculator service in C++ $ soapcpp2 -i calc.h $ cc -o calcserver++ calcserver.cpp stdsoap2.cpp soapC.cpp soapcalcService.cpp where stdsoap2.cpp is in the 'gsoap' directory, or use libgsoap++: $ cc -o calcserver++ calcserver.cpp soapC.cpp soapcalcService.cpp -lgsoap++ -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapcalcService.h" #include "calc.nsmap" int main(int argc, char **argv) { calcService calc; if (argc < 2) calc.serve(); /* serve as CGI application */ else { int port = atoi(argv[1]); if (!port) { fprintf(stderr, "Usage: calcserver++ \n"); exit(0); } /* run iterative server on port until fatal error */ if (calc.run(port)) { calc.soap_stream_fault(std::cerr); exit(-1); } } return 0; } int calcService::add(double a, double b, double *result) { *result = a + b; return SOAP_OK; } int calcService::sub(double a, double b, double *result) { *result = a - b; return SOAP_OK; } int calcService::mul(double a, double b, double *result) { *result = a * b; return SOAP_OK; } int calcService::div(double a, double b, double *result) { if (b) *result = a / b; else { char *s = (char*)soap_malloc(this, 1024); (SOAP_SNPRINTF(s, 1024, 100), "Can't divide %f by %f", a, b); return soap_senderfault("Division by zero", s); } return SOAP_OK; } int calcService::pow(double a, double b, double *result) { *result = ::pow(a, b); if (soap_errno == EDOM) /* soap_errno is like errno, but compatible with Win32 */ { char *s = (char*)soap_malloc(this, 1024); (SOAP_SNPRINTF(s, 1024, 100), "Can't take power of %f to %f", a, b); return soap_senderfault("Power function domain error", s); } return SOAP_OK; } gsoap-2.8.28/gsoap/samples/mtom/0000755000175000017500000000000012653650172016024 5ustar ellertellertgsoap-2.8.28/gsoap/samples/mtom/Makefile.in0000644000175000017500000004454612653650156020110 0ustar ellertellert# Makefile.in generated by automake 1.14 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = mtom$(EXEEXT) DIST_COMMON = $(srcdir)/../Makefile.defines \ $(srcdir)/../Makefile.c_rules $(srcdir)/Makefile.in \ $(srcdir)/Makefile.am $(top_srcdir)/mkinstalldirs \ $(top_srcdir)/depcomp subdir = gsoap/samples/mtom ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = am__objects_2 = soapC.$(OBJEXT) am__objects_3 = soapClient.$(OBJEXT) $(am__objects_2) am__objects_4 = $(am__objects_3) soapServer.$(OBJEXT) $(am__objects_1) \ $(am__objects_1) am_mtom_OBJECTS = mtom-test.$(OBJEXT) $(am__objects_1) \ $(am__objects_4) mtom_OBJECTS = $(am_mtom_OBJECTS) am__DEPENDENCIES_1 = mtom_DEPENDENCIES = $(SOAP_C_LIB) $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(mtom_SOURCES) DIST_SOURCES = $(mtom_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ STRIP = @STRIP@ VERSION = @VERSION@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 SOAPHEADER = mtom-test.h AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a SOAP_C_SRC = $(SOAP_C_CLIENT) soapServer.c $(SOAP_H_FILES) $(SOAP_NS) LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_C_SRC) CLEANFILES = $(SOAP_C_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.c soapClient.c soapClientLib.c soapServer.c soapServerLib.c *~ SOAP_NS = mtom_test.nsmap mtom_test.wsdl mtom_SOURCES = mtom-test.c $(SOAPHEADER) $(SOAP_C_SRC) mtom_LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.c_rules $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/mtom/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/mtom/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.c_rules: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) mtom$(EXEEXT): $(mtom_OBJECTS) $(mtom_DEPENDENCIES) $(EXTRA_mtom_DEPENDENCIES) @rm -f mtom$(EXEEXT) $(AM_V_CCLD)$(LINK) $(mtom_OBJECTS) $(mtom_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mtom-test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapC.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapClient.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapServer.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am $(SOAP_C_SRC) : $(SOAPHEADER) $(SOAP) -cL -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $(SOAPHEADER) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.28/gsoap/samples/mtom/README.txt0000644000175000017500000000042712653650156017527 0ustar ellertellertMTOM attachment processing example. This application is a server and client to demonstate MTOM attachment handling. The application runs as a simple CGI server, stand-alone Web server on a port, or a test client application to test multiple MTOM attachment handling features. gsoap-2.8.28/gsoap/samples/mtom/mtom-test.c0000644000175000017500000003124512653650156020130 0ustar ellertellert/* mtom-test.c This application includes a MTOM test client and server. As a client application, it fires four different base64 or MTOM attachments to the server. As a server, it will respond to the messages by converting base64 into MTOM attachments and vice versa. Usage (server): $ mtom Usage (client): $ mtom http://localhost: "" "" "" ... -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" #include "mtom_test.nsmap" int cgi_serve(); int run_serve(int port); int run_tests(int, char**); int main(int argc, char **argv) { if (argc < 2) return cgi_serve(); if (argc < 3) return run_serve(atoi(argv[1])); return run_tests(argc, argv); } int cgi_serve() { /* CGI-style: serve request from stdin */ return soap_serve(soap_new1(SOAP_XML_INDENT | SOAP_ENC_MTOM)); /* enable MTOM XOP attachments (and XML indent) */ } int run_serve(int port) { struct soap *soap = soap_new1(SOAP_ENC_MTOM); /* enable MTOM */ int ret; if (!soap_valid_socket(soap_bind(soap, NULL, port, 100))) soap_print_fault(soap, stderr); else { fprintf(stderr, "Bind to port %d successful\n", port); soap->accept_timeout = 3600; /* let server time out after one hour */ for (;;) { int sock = soap_accept(soap); if (!soap_valid_socket(sock)) { if (soap->errnum) soap_print_fault(soap, stderr); else fprintf(stderr, "Server timed out\n"); break; } fprintf(stderr, "Accepting socket %d connection from IP %d.%d.%d.%d... ", sock, (int)(soap->ip>>24)&0xFF, (int)(soap->ip>>16)&0xFF, (int)(soap->ip>>8)&0xFF, (int)soap->ip&0xFF); if (soap_serve(soap)) soap_print_fault(soap, stderr); fprintf(stderr, "done\n"); soap_destroy(soap); soap_end(soap); } } ret = soap->error; soap_free(soap); /* done and free */ return ret; } int run_tests(int argc, char **argv) { struct soap *soap = soap_new1(SOAP_ENC_MTOM); /* enable MTOM */ int i, ret; struct x__DataType data; struct x__WrapperType wrap; struct m__EchoTestSingleResponse single; struct m__EchoTestMultipleResponse multiple; soap_default_x__DataType(soap, &data); soap_default_x__WrapperType(soap, &wrap); /* First test call */ data.__union = SOAP_UNION_x__data_base64; data.choice.base64.__ptr = (unsigned char*)argv[2]; data.choice.base64.__size = (int)strlen(argv[2]) + 1; if (soap_call_m__EchoTestSingle(soap, argv[1], NULL, &data, &single)) { soap_print_fault(soap, stderr); } else { if (!single.x__Data || single.x__Data->__union != SOAP_UNION_x__data_xop__Include || !single.x__Data->choice.xop__Include.__ptr || single.x__Data->choice.xop__Include.__size != data.choice.base64.__size || strcmp((char*)single.x__Data->choice.xop__Include.__ptr, (char*)data.choice.base64.__ptr)) fprintf(stderr, "EchoTestSingle 1: data transcription error\n"); else fprintf(stderr, "EchoTestSingle 1: OK\n"); /* Second test call */ data.__union = SOAP_UNION_x__data_xop__Include; data.choice.xop__Include.__ptr = (unsigned char*)argv[2]; data.choice.xop__Include.__size = (int)strlen(argv[2]) + 1; data.choice.xop__Include.id = NULL; data.choice.xop__Include.type = "text/xml"; data.choice.xop__Include.options = NULL; data.xmime5__contentType = "text/xml"; #ifdef WITH_NOIDREF /* compiling with WITH_NOIDREF removes auto-detection of attachments */ soap_set_mime(soap, NULL, NULL); /* so we explicitly set MIME attachments */ #endif if (soap_call_m__EchoTestSingle(soap, argv[1], NULL, &data, &single)) { soap_print_fault(soap, stderr); } else { if (!single.x__Data || single.x__Data->__union != SOAP_UNION_x__data_base64 || !single.x__Data->choice.base64.__ptr || single.x__Data->choice.base64.__size != data.choice.xop__Include.__size || strcmp((char*)single.x__Data->choice.base64.__ptr, (char*)data.choice.xop__Include.__ptr)) fprintf(stderr, "EchoTestSingle 2: data transcription error\n"); else { fprintf(stderr, "EchoTestSingle 2: OK\n"); /* Third test call */ wrap.__size = argc - 2; wrap.Data = (struct x__DataType*)soap_malloc(soap, wrap.__size * sizeof(struct x__DataType)); for (i = 0; i < wrap.__size; ++i) { soap_default_x__DataType(soap, &wrap.Data[i]); wrap.Data[i].__union = SOAP_UNION_x__data_base64; wrap.Data[i].choice.base64.__ptr = (unsigned char*)argv[i + 2]; wrap.Data[i].choice.base64.__size = (int)strlen(argv[i + 2]) + 1; wrap.Data[i].xmime5__contentType = "text/xml"; } if (soap_call_m__EchoTestMultiple(soap, argv[1], NULL, &wrap, &multiple)) soap_print_fault(soap, stderr); else { int okay = 1; if (!multiple.x__EchoTest || multiple.x__EchoTest->__size != wrap.__size) okay = 0; else { for (i = 0; i < multiple.x__EchoTest->__size; ++i) if (multiple.x__EchoTest->Data[i].__union != SOAP_UNION_x__data_xop__Include || !multiple.x__EchoTest->Data[i].choice.xop__Include.__ptr || multiple.x__EchoTest->Data[i].choice.xop__Include.__size != wrap.Data[i].choice.base64.__size || strcmp((char*)multiple.x__EchoTest->Data[i].choice.xop__Include.__ptr, (char*)wrap.Data[i].choice.base64.__ptr)) okay = 0; } if (!okay) fprintf(stderr, "EchoTestMultiple 1: data transcription error\n"); else { fprintf(stderr, "EchoTestMultiple 1: OK\n"); /* Fourth test call */ for (i = 0; i < wrap.__size; ++i) { soap_default_x__DataType(soap, &wrap.Data[i]); wrap.Data[i].__union = SOAP_UNION_x__data_xop__Include; wrap.Data[i].choice.xop__Include.__ptr = (unsigned char*)argv[i + 2]; wrap.Data[i].choice.xop__Include.__size = (int)strlen(argv[i + 2]) + 1; wrap.Data[i].choice.xop__Include.id = NULL; wrap.Data[i].choice.xop__Include.type = "text/xml"; wrap.Data[i].choice.xop__Include.options = NULL; wrap.Data[i].xmime5__contentType = "text/xml"; } if (soap_call_m__EchoTestMultiple(soap, argv[1], NULL, &wrap, &multiple)) soap_print_fault(soap, stderr); else { int okay = 1; if (!multiple.x__EchoTest || multiple.x__EchoTest->__size != wrap.__size) okay = 0; else { for (i = 0; i < multiple.x__EchoTest->__size; ++i) if (multiple.x__EchoTest->Data[i].__union != SOAP_UNION_x__data_base64 || !multiple.x__EchoTest->Data[i].choice.base64.__ptr || multiple.x__EchoTest->Data[i].choice.base64.__size != wrap.Data[i].choice.xop__Include.__size || strcmp((char*)multiple.x__EchoTest->Data[i].choice.base64.__ptr, (char*)wrap.Data[i].choice.xop__Include.__ptr)) okay = 0; } if (!okay) fprintf(stderr, "EchoTestMultiple 2: data transcription error\n"); else fprintf(stderr, "EchoTestMultiple 2: OK\n"); } } } } } } ret = soap->error; soap_destroy(soap); soap_end(soap); soap_done(soap); free(soap); return ret; } int m__EchoTestSingle(struct soap *soap, struct x__DataType *data, struct m__EchoTestSingleResponse *response) { if (!data) { /* To return a fault in an MTOM attachment: soap_set_mode(soap, SOAP_ENC_MTOM | SOAP_ENC_MIME); */ return soap_sender_fault(soap, "No data", NULL); } /* allocate response */ response->x__Data = (struct x__DataType*)soap_malloc(soap, sizeof(struct x__DataType)); if (!response->x__Data) return SOAP_EOM; /* copy data into response, switching from base64 to MTOM and vice versa */ switch (data->__union) { case SOAP_UNION_x__data_xop__Include: /* convert MTOM attachment to base64Binary */ response->x__Data->__union = SOAP_UNION_x__data_base64; response->x__Data->choice.base64.__ptr = data->choice.xop__Include.__ptr; response->x__Data->choice.base64.__size = data->choice.xop__Include.__size; response->x__Data->xmime5__contentType = data->choice.xop__Include.type; break; case SOAP_UNION_x__data_base64: /* convert base64Binary to MTOM attachment */ response->x__Data->__union = SOAP_UNION_x__data_xop__Include; response->x__Data->choice.xop__Include.__ptr = data->choice.base64.__ptr; response->x__Data->choice.xop__Include.__size = data->choice.base64.__size; response->x__Data->choice.xop__Include.id = NULL; response->x__Data->choice.xop__Include.type = data->xmime5__contentType; response->x__Data->choice.xop__Include.options = NULL; response->x__Data->xmime5__contentType = data->xmime5__contentType; #ifdef WITH_NOIDREF /* compiling with WITH_NOIDREF removes auto-detection of attachments */ soap_set_mime(soap, NULL, NULL); /* so we explicitly set MIME attachments */ #endif break; default: return soap_sender_fault(soap, "Wrong data format", NULL); } return SOAP_OK; } int m__EchoTestMultiple(struct soap *soap, struct x__WrapperType *x__EchoTest, struct m__EchoTestMultipleResponse *response) { int i; if (!x__EchoTest) return soap_sender_fault(soap, "No data", NULL); /* allocate response */ response->x__EchoTest = (struct x__WrapperType*)soap_malloc(soap, sizeof(struct x__WrapperType)); if (!response->x__EchoTest) return SOAP_EOM; response->x__EchoTest->__size = x__EchoTest->__size; response->x__EchoTest->Data = (struct x__DataType*)soap_malloc(soap, sizeof(struct x__DataType) * x__EchoTest->__size); if (!response->x__EchoTest->Data) return SOAP_EOM; /* copy data into response, switching from base64 to MTOM and vice versa */ for (i = 0; i < x__EchoTest->__size; ++i) { switch (x__EchoTest->Data[i].__union) { case SOAP_UNION_x__data_xop__Include: /* convert MTOM attachment to base64Binary */ response->x__EchoTest->Data[i].__union = SOAP_UNION_x__data_base64; response->x__EchoTest->Data[i].choice.base64.__ptr = x__EchoTest->Data[i].choice.xop__Include.__ptr; response->x__EchoTest->Data[i].choice.base64.__size = x__EchoTest->Data[i].choice.xop__Include.__size; response->x__EchoTest->Data[i].xmime5__contentType = x__EchoTest->Data[i].choice.xop__Include.type; break; case SOAP_UNION_x__data_base64: /* convert base64Binary to MTOM attachment */ response->x__EchoTest->Data[i].__union = SOAP_UNION_x__data_xop__Include; response->x__EchoTest->Data[i].choice.xop__Include.__ptr = x__EchoTest->Data[i].choice.base64.__ptr; response->x__EchoTest->Data[i].choice.xop__Include.__size = x__EchoTest->Data[i].choice.base64.__size; response->x__EchoTest->Data[i].choice.xop__Include.id = NULL; response->x__EchoTest->Data[i].choice.xop__Include.type = x__EchoTest->Data[i].xmime5__contentType; response->x__EchoTest->Data[i].choice.xop__Include.options = NULL; response->x__EchoTest->Data[i].xmime5__contentType = x__EchoTest->Data[i].xmime5__contentType; #ifdef WITH_NOIDREF /* compiling with WITH_NOIDREF removes auto-detection of attachments */ soap_set_mime(soap, NULL, NULL); /* so we explicitly set MIME attachments */ #endif break; default: return soap_sender_fault(soap, "Wrong data format", NULL); } } return SOAP_OK; } gsoap-2.8.28/gsoap/samples/mtom/Makefile.am0000644000175000017500000000075512653650156020071 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 noinst_PROGRAMS = mtom SOAPHEADER = mtom-test.h include ../Makefile.defines include ../Makefile.c_rules SOAP_NS = mtom_test.nsmap mtom_test.wsdl mtom_SOURCES = mtom-test.c $(SOAPHEADER) $(SOAP_C_SRC) mtom_LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) gsoap-2.8.28/gsoap/samples/mtom/mtom-test.h0000644000175000017500000000666512653650156020145 0ustar ellertellert/* mtom-test.h This application includes a MIME test client and server. As a client application, it fires four different base64 or MIME attachments to the server. As a server, it will respond to the messages by converting base64 into MIME attachments and vice versa. Usage (server): $ mtom-test Usage (client): $ mtom-test http://localhost: "" "" "" ... -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #import "soap12.h" #import "xop.h" #import "xmime5.h" //gsoap m service name: mtom_test //gsoap m service namespace: http://www.genivia.com/wsdl/mtom_test.wsdl //gsoap x schema namespace: http://www.genivia.com/schemas/mtom_test.xsd //gsoap x schema elementForm: qualified struct xsd__base64Binary { unsigned char *__ptr; int __size; }; //gsoap x schema type-documentation: DataType a union of an MIME attachment or a base64 binary data type struct x__DataType { int __union; union x__data { _xop__Include xop__Include; struct xsd__base64Binary base64; } choice; @char *xmime5__contentType; }; //gsoap x schema type-documentation: WrapperType wraps a sequence of data elements with MIME attachments or base64 binary data struct x__WrapperType { int __size; struct x__DataType *Data; }; /* m:EchoTestSingle has a single in/out attachment of text/xml */ //gsoap m service method-input-mime-type: EchoTestSingle text/xml //gsoap m service method-output-mime-type: EchoTestSingle text/xml //gsoap m service method-documentation: EchoTestSingle echo a single MIME attachment or base64 binary data element int m__EchoTestSingle( struct x__DataType *x__Data, struct m__EchoTestSingleResponse { struct x__DataType *x__Data; }* ); /* m:EchoTestSingle has at least two in/out attachments of any MIME type */ //gsoap m service method-mime-type: EchoTestMultiple */* //gsoap m service method-mime-type: EchoTestMultiple */* //gsoap m service method-documentation: EchoTestMultiple echo a sequence of MIME attachments or base64 binary data elements int m__EchoTestMultiple( struct x__WrapperType *x__EchoTest, struct m__EchoTestMultipleResponse { struct x__WrapperType *x__EchoTest; }* ); gsoap-2.8.28/gsoap/wsdl/0000755000175000017500000000000012653650160014352 5ustar ellertellertgsoap-2.8.28/gsoap/wsdl/imports.h0000644000175000017500000000326612653650160016227 0ustar ellertellert/* imports.h Common XSD types and externs for gSOAP header file import -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #import "stlvector.h" typedef char *xsd__anyURI, *xsd__ID, *xsd__NCName, *xsd__NMTOKEN, *xsd__NMTOKENS, *xsd__QName, *xsd__string; typedef bool xsd__boolean; extern class ostream; extern class istream; #include "includes.h" extern class SetOfString; gsoap-2.8.28/gsoap/wsdl/gwsdl.h0000644000175000017500000000505212653650160015645 0ustar ellertellert/* gwsdl.h OGSI GWSDL binding schema interface -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap gwsdl schema documentation: OGSI GWSDL binding schema //gsoap gwsdl schema namespace: http://www.gridforum.org/namespaces/2003/03/gridWSDLExtensions //gsoap sd schema namespace: http://www.gridforum.org/namespaces/2003/03/serviceData #import "schema.h" class wsdl__operation; enum sd__mutability { static_, constant, extendable, mutable_ }; class sd__serviceData { public: @xsd__NMTOKEN name; @xsd__QName type; @xsd__boolean nillable = false; @xsd__string minOccurs; // xsd:nonNegativeInteger @xsd__string maxOccurs; // xsd:nonNegativeInteger|unbounded @enum sd__mutability mutability = extendable; @xsd__boolean modifiable = false; /* has any content */ public: }; class sd__staticServiceDataValues { public: int __type; /* any content, probably should use DOM */ void* _any; }; class gwsdl__portType { public: @xsd__NMTOKEN name; @xsd__QName extends; // a list of QNames xsd__string documentation; // ? std::vector operation; // * std::vector sd__serviceData_; sd__staticServiceDataValues *sd__staticServiceDataValues_; public: }; gsoap-2.8.28/gsoap/wsdl/bpel.h0000644000175000017500000000630312653650160015447 0ustar ellertellert/* bpel.h BPEL 2.0 binding schema -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2014, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #import "imports.h" //gsoap plnk schema documentation: Partner Link Type Schema for WS-BPEL 2.0 //gsoap plnk schema namespace: http://docs.oasis-open.org/wsbpel/2.0/plnktype //gsoap plnk schema elementForm: qualified //gsoap plnk schema attributeForm: unqualified //gsoap vprop schema documentation: Variable Properties Schema for WS-BPEL 2.0 //gsoap vprop schema namespace: http://docs.oasis-open.org/wsbpel/2.0/varprop //gsoap vprop schema elementForm: qualified //gsoap vprop schema attributeForm: unqualified class wsdl__definitions; class wsdl__portType; class plnk__tPartnerLinkType; class plnk__tRole { public: @xsd__NCName name; @xsd__QName portType; xsd__string documentation; private: wsdl__portType *portTypeRef; plnk__tPartnerLinkType *plnkRef; public: plnk__tRole(); int traverse(wsdl__definitions&); wsdl__portType *portTypePtr() const; void plnkPtr(plnk__tPartnerLinkType*); plnk__tPartnerLinkType *plnkPtr() const; }; class plnk__tPartnerLinkType { public: @xsd__NCName name; std::vector role; xsd__string documentation; public: int traverse(wsdl__definitions&); }; class vprop__tQuery { public: @xsd__anyURI queryLanguage = "urn:oasis:names:tc:wsbpel:2.0:sublang:xpath1.0"; xsd__QName __mixed; }; class vprop__tProperty { public: @xsd__NCName name; @xsd__QName type; @xsd__QName element; xsd__string documentation; public: int traverse(wsdl__definitions&); }; class vprop__tPropertyAlias { public: vprop__tQuery* query; @xsd__QName propertyName; @xsd__QName messageType; @xsd__NCName part; @xsd__QName type; @xsd__QName element; xsd__string documentation; private: vprop__tProperty *vpropRef; public: int traverse(wsdl__definitions&); vprop__tProperty *vpropPtr() const; }; gsoap-2.8.28/gsoap/wsdl/Make_mvc.mak0000644000175000017500000000441412653650160016571 0ustar ellertellertCC=cl CPP=cl LIBS=wsock32.lib SECURE_LIBS=$(LIBS) libeay32.lib ssleay32.lib GSOAP=..\\soapcpp2.exe SOAPH=stdsoap2.h SOAPC=stdsoap2.c SOAPCPP=stdsoap2.cpp COFLAGS=-O2 # COFLAGS=-ZI -DDEBUG CFLAGS= -EHsc -nologo $(COFLAGS) wsdl2h.exe: wsdlC.obj wsdl.obj schema.obj soap.obj mime.obj wsp.obj bpel.obj types.obj service.obj wsdl2h.obj stdsoap2.obj $(CPP) $(CFLAGS) -Fewsdl2h.exe wsdl2h.obj wsdlC.obj wsdl.obj schema.obj \ soap.obj mime.obj wsp.obj bpel.obj types.obj service.obj stdsoap2.obj $(LIBS) # cp -f wsdl2h .. secure: touch wsdl2h.cpp make wsdl2h_secure wsdl2h_secure: wsdlC.obj wsdl.obj schema.cpp soap.obj mime.obj wsp.obj bpel.obj types.obj service.obj wsdl2h.obj httpda.obj md5evp.obj stdsoap2.obj $(CPP) $(CFLAGS) -DWITH_OPENSSL -Fewsdl2h.exe wsdl2h.obj wsdlC.obj wsdl.obj \ schema.cpp soap.obj mime.obj wsp.obj bpel.obj types.obj service.obj httpda.obj md5evp.obj stdsoap2.obj $(SECURE_LIBS) wsdl2h.obj: wsdl2h.cpp $(CPP) -c $(CFLAGS) wsdl2h.cpp wsdlC.obj: wsdlC.cpp $(CPP) -c $(CFLAGS) wsdlC.cpp wsdlC.cpp: schema.h soap.h mime.h http.h wsdl.h includes.h imports.h $(GSOAP) -CS -pwsdl wsdl.h types.obj: types.h types.cpp $(CPP) -c $(CFLAGS) types.cpp service.obj: types.h service.h service.cpp $(CPP) -c $(CFLAGS) service.cpp wsdl.obj: wsdl.h wsdl.cpp includes.h imports.h $(CPP) -c $(CFLAGS) wsdl.cpp schema.obj: schema.h schema.cpp includes.h imports.h $(CPP) -c $(CFLAGS) schema.cpp soap.obj: soap.h soap.cpp includes.h imports.h $(CPP) -c $(CFLAGS) soap.cpp mime.obj: mime.h mime.cpp includes.h imports.h $(CPP) -c $(CFLAGS) mime.cpp wsp.obj: wsp.h wsp.cpp includes.h imports.h $(CPP) -c $(CFLAGS) wsp.cpp bpel.obj: bpel.h bpel.cpp includes.h imports.h $(CPP) -c $(CFLAGS) bpel.cpp httpda.obj: ../plugin/httpda.c $(CC) -c -I../plugin $(CFLAGS) ../plugin/httpda.c md5evp.obj: ../plugin/md5evp.c $(CC) -c -I../plugin $(CFLAGS) ../plugin/md5evp.c stdsoap2.obj: $(SOAPCPP) $(CPP) -c $(CFLAGS) $(SOAPCPP) clean: del /f *.obj wsdlH.h wsdlStub.h wsdlC.cpp wsdlClient.cpp wsdlServer.cpp \ wsdlClientLib.cpp wsdlServerLib.cpp distclean: del /f *.obj *.wsdl. *.xsd *.xml *.nsmap wsdl2h.exe wsdlH.h wsdlStub.h \ wsdlC.cpp wsdlClient.cpp wsdlServer.cpp wsdlClientLib.cpp wsdlServerLib.cpp gsoap-2.8.28/gsoap/wsdl/wsdl.h0000644000175000017500000003713012653650160015500 0ustar ellertellert/* wsdl.h WSDL 1.1 and WSDL 2.0 schemas -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2014, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoapopt w //gsoap wsdl schema documentation: WSDL 1.1/2.0 binding schema //gsoap wsdl schema namespace: http://schemas.xmlsoap.org/wsdl/ //gsoap wsdl schema namespace2: http://www.w3.org/ns/wsdl //gsoap wsdl schema elementForm: qualified //gsoap wsdl schema attributeForm: unqualified #import "imports.h" #import "schema.h" #import "soap.h" #import "mime.h" #import "dime.h" #import "http.h" #import "gwsdl.h" #import "wsam.h" #import "wsp.h" #import "bpel.h" class wsdl__definitions; // forward declaration class wsdl__import { public: @xsd__anyURI namespace_; @xsd__anyURI location; private: wsdl__definitions *definitionsRef; public: wsdl__import(); int preprocess(wsdl__definitions&); int traverse(wsdl__definitions&); void definitionsPtr(wsdl__definitions*); wsdl__definitions *definitionsPtr() const; }; class wsdl__types : public xs__schema // WSDL 2.0 inlined schema { public: xsd__string documentation; // ? std::vector xs__schema_; // * public: int preprocess(wsdl__definitions&); int traverse(wsdl__definitions&); }; class wsdl__part { public: @xsd__NMTOKEN name; @xsd__QName element; @xsd__QName type; xsd__string documentation; // ? private: xs__element *elementRef; // traverse() finds element xs__simpleType *simpleTypeRef; // traverse() finds simpleType xs__complexType *complexTypeRef; // traverse() finds complexType public: wsdl__part(); int traverse(wsdl__definitions&); void elementPtr(xs__element*); void simpleTypePtr(xs__simpleType*); void complexTypePtr(xs__complexType*); xs__element *elementPtr() const; xs__simpleType *simpleTypePtr() const; xs__complexType *complexTypePtr() const; }; class wsdl__message { public: @xsd__NMTOKEN name; xsd__string documentation; // ? std::vector wsp__Policy_; // * std::vector wsp__PolicyReference_;// * std::vector part; // * public: int traverse(wsdl__definitions&); }; class wsdl__ioput { public: @xsd__NMTOKEN name; @xsd__QName message; @xsd__NMTOKEN messageLabel; // WSDL 2.0 @xsd__QName element; // WSDL 2.0 @xsd__anyURI wsa__Action; @xsd__anyURI wsam__Action; xsd__string documentation; // ? wsp__Policy *wsp__Policy_; // ? wsp__PolicyReference *wsp__PolicyReference_; // ? private: wsdl__message *messageRef; // traverse() finds message xs__element *elementRef; // traverse() finds element WSDL 2.0 public: wsdl__ioput(); int traverse(wsdl__definitions&); void messagePtr(wsdl__message*); wsdl__message *messagePtr() const; void elementPtr(xs__element*); xs__element *elementPtr() const; }; class wsdl__fault { public: @xsd__NMTOKEN name; @xsd__QName message; @xsd__QName ref; // WSDL 2.0 @xsd__NMTOKEN messageLabel; // WSDL 2.0 @xsd__QName element; // WSDL 2.0 @xsd__anyURI wsa__Action; @xsd__anyURI wsam__Action; xsd__string documentation; // ? wsp__Policy *wsp__Policy_; // ? wsp__PolicyReference *wsp__PolicyReference_; // ? private: wsdl__message *messageRef; // traverse() finds message xs__element *elementRef; // traverse() finds element WSDL 2.0 public: wsdl__fault(); int traverse(wsdl__definitions&); void messagePtr(wsdl__message*); wsdl__message *messagePtr() const; void elementPtr(xs__element*); xs__element *elementPtr() const; }; class wsdl__operation { public: @xsd__NMTOKEN name; @xsd__anyURI pattern; // WSDL 2.0 @xsd__anyURI style; // WSDL 2.0 @xsd__string wrpc__signature; // WSDL 2.0 @xsd__string parameterOrder; xsd__string documentation; // ? wsp__Policy *wsp__Policy_; // ? wsp__PolicyReference *wsp__PolicyReference_; // ? $int __union1; union wsdl__union_ioput // | { wsdl__ioput *input; wsdl__ioput *output; } __ioput1; $int __union2; union wsdl__union_ioput __ioput2; // | std::vector fault; // * std::vector infault; // * WSDL 2.0 std::vector outfault; // * WSDL 2.0 public: int traverse(wsdl__definitions&); }; class wsdl__portType // ... and WSDL 2.0 interface { public: @xsd__NMTOKEN name; @xsd__QName extends; // WSDL 2.0 @xsd__anyURI styleDefault; // WSDL 2.0 xsd__string documentation; // ? wsp__Policy *wsp__Policy_; // ? wsp__PolicyReference *wsp__PolicyReference_; // ? std::vector fault; // * WSDL 2.0 std::vector operation; // * private: wsdl__definitions *definitionsRef; public: wsdl__portType(); int traverse(wsdl__definitions&); void definitionsPtr(wsdl__definitions*); wsdl__definitions *definitionsPtr() const; }; class wsdl__ext_ioput // binding extensibility element { public: @xsd__NMTOKEN name; @xsd__NMTOKEN messageLabel; // WSDL 2.0 xsd__string documentation; // ? wsp__Policy *wsp__Policy_; // ? wsp__PolicyReference *wsp__PolicyReference_; // ? dime__message *dime__message_; // ? soap__body *soap__body_; // ? xsd__string http__urlEncoded; // ? mime__multipartRelated *mime__multipartRelated_;// ? mime__content *mime__content_; // ? mime__mimeXml *mime__mimeXml_; // ? std::vector soap__header_; // * std::vector wsoap__module_; // * WSDL 2.0 std::vector wsoap__header_; // * WSDL 2.0 std::vector whttp__header_; // * WSDL 2.0 public: int traverse(wsdl__definitions&); }; class wsdl__ext_fault // binding extensibility element { public: @xsd__NMTOKEN name; @xsd__QName ref; // WSDL 2.0 @xsd__NMTOKEN messageLabel; // WSDL 2.0 @xsd__QName wsoap__code; // WSDL 2.0 @xsd__QName wsoap__subcodes; // WSDL 2.0 xsd__string documentation; // ? wsp__Policy *wsp__Policy_; // ? wsp__PolicyReference *wsp__PolicyReference_; // ? soap__fault *soap__fault_; // ? std::vector wsoap__module_; // * WSDL 2.0 private: wsdl__fault *faultRef; public: wsdl__ext_fault(); int traverse(wsdl__definitions&, wsdl__portType*); void faultPtr(wsdl__fault*); wsdl__fault *faultPtr() const; }; class wsdl__ext_operation // binding extensibility element { public: @xsd__NMTOKEN name; @xsd__QName ref; // WSDL 2.0 @xsd__anyURI wsoap__mep; // WSDL 2.0 @xsd__anyURI wsoap__action; // WSDL 2.0 @xsd__string whttp__method; // WSDL 2.0 @xsd__string whttp__location; // WSDL 2.0 xsd__string documentation; // ? wsp__Policy *wsp__Policy_; // ? wsp__PolicyReference *wsp__PolicyReference_; // ? soap__operation *soap__operation_; // ? http__operation *http__operation_; // ? wsdl__ext_ioput *input; // ? wsdl__ext_ioput *output; // ? std::vector fault; // * std::vector infault; // * WSDL 2.0 std::vector outfault; // * WSDL 2.0 private: wsdl__operation *operationRef; // traverse() finds operation public: wsdl__ext_operation(); int traverse(wsdl__definitions&, wsdl__portType*); void operationPtr(wsdl__operation*); wsdl__operation *operationPtr() const; }; class wsdl__binding { public: @xsd__NMTOKEN name; @xsd__QName type; @xsd__anyURI type_; // WSDL 2.0 @xsd__QName interface_; // WSDL 2.0 @xsd__boolean whttp__cookies = false; // WSDL 2.0 @xsd__string wsoap__version; // WSDL 2.0 @xsd__anyURI wsoap__protocol; // WSDL 2.0 @xsd__anyURI wsoap__mepDefault; // WSDL 2.0 @xsd__string whttp__methodDefault; // WSDL 2.0 xsd__string documentation; // ? std::vector wsp__Policy_; // * std::vector wsp__PolicyReference_;// * soap__binding *soap__binding_; // ? http__binding *http__binding_; // ? std::vector wsoap__module_; // * WSDL 2.0 std::vector fault; // * WSDL 2.0 std::vector operation; // * private: wsdl__portType *portTypeRef; // traverse() finds portType/interface public: wsdl__binding(); int traverse(wsdl__definitions&); void portTypePtr(wsdl__portType*); wsdl__portType *portTypePtr() const; }; class wsdl__port // ... and WSDL 2.0 endpoint { public: @xsd__NMTOKEN name; @xsd__QName binding; @xsd__anyURI address; // WSDL 2.0 @xsd__NMTOKEN whttp__authenticationScheme; // WSDL 2.0 @xsd__NMTOKEN whttp__authenticationRealm; // WSDL 2.0 xsd__string documentation; // ? wsp__Policy *wsp__Policy_; // ? wsp__PolicyReference *wsp__PolicyReference_; // ? wsa__EndpointReferenceType *wsa__EndpointReference;// ? soap__address *soap__address_; // ? http__address *http__address_; // ? private: wsdl__binding *bindingRef; // traverse() finds binding public: wsdl__port(); int traverse(wsdl__definitions&); void bindingPtr(wsdl__binding*); wsdl__binding *bindingPtr() const; }; class wsdl__service { public: @xsd__NMTOKEN name; @xsd__QName interface_; // WSDL 2.0 xsd__string documentation; // ? std::vector wsp__Policy_; // * std::vector wsp__PolicyReference_;// * std::vector port; // * WSDL 1.1 std::vector endpoint; // * WSDL 2.0 public: int traverse(wsdl__definitions&); }; class wsdl__definitions { public: @xsd__NMTOKEN name; @xsd__anyURI targetNamespace = ""; @xsd__NMTOKEN version; std::vector import; // * xsd__string documentation; // ? wsdl__types *types; // ? std::vector message; // * std::vector portType; // * WSDL 1.1 std::vector interface_; // * WSDL 2.0 std::vector binding; // * std::vector service; // * xsd__string wsp__UsingPolicy; // ? WS-Policy 1.2/1.5 std::vector wsp__Policy_; // * WS-Policy 1.2/1.5 std::vector plnk__partnerLinkType; // * BPEL 2.0 std::vector vprop__property; // * BPEL 2.0 std::vector vprop__propertyAlias; // * BPEL 2.0 std::vector gwsdl__portType_; // * struct soap *soap; private: bool soap12; bool updated; char* location; int redirs; SetOfString builtinTypeSet; SetOfString builtinElementSet; SetOfString builtinAttributeSet; public: wsdl__definitions(); wsdl__definitions(struct soap*); wsdl__definitions(struct soap*, const char*, const char*); virtual ~wsdl__definitions(); int get(struct soap*); // gSOAP getter is triggered after parsing int preprocess(); int traverse(); int read(int, char**); int read(const char *cwd, const char*); const char* sourceLocation(); int error(); bool is_updated(); void print_fault(); void builtinType(const char*); void builtinTypes(const SetOfString&); void builtinElement(const char*); void builtinElements(const SetOfString&); void builtinAttribute(const char*); void builtinAttributes(const SetOfString&); const SetOfString& builtinTypes() const; const SetOfString& builtinElements() const; const SetOfString& builtinAttributes() const; friend ostream& operator<<(ostream&, const wsdl__definitions&); friend istream& operator>>(istream&, wsdl__definitions&); }; extern ostream &operator<<(ostream &o, const wsdl__definitions &e); extern istream &operator>>(istream &i, wsdl__definitions &e); gsoap-2.8.28/gsoap/wsdl/soap.h0000644000175000017500000000736312653650160015476 0ustar ellertellert/* soap.h WSDL/SOAP binding schema -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2012, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap soap schema documentation: WSDL 1.1 SOAP binding schema //gsoap soap schema namespace: http://schemas.xmlsoap.org/wsdl/soap/ //gsoap wsoap schema documentation: WSDL 2.0 SOAP binding schema //gsoap wsoap schema namespace: http://www.w3.org/ns/wsdl/soap #import "imports.h" class wsdl__definitions; // forward declaration class wsdl__message; // forward declaration class wsdl__part; // forward declaration enum soap__styleChoice { rpc, document }; class soap__binding { public: @xsd__anyURI transport; @enum soap__styleChoice *style; }; class soap__operation { public: @xsd__anyURI soapAction; @xsd__boolean soapActionRequired = true; @enum soap__styleChoice *style; }; enum soap__useChoice { literal, encoded }; class soap__body { public: @xsd__anyURI encodingStyle; @xsd__NMTOKENS parts; @enum soap__useChoice use; @xsd__anyURI namespace_; }; class soap__fault { public: @xsd__NMTOKEN name; @xsd__anyURI encodingStyle; @enum soap__useChoice use; @xsd__anyURI namespace_; }; class soap__headerfault { public: @xsd__QName message; @xsd__NMTOKEN part; @enum soap__useChoice use; @xsd__anyURI encodingStyle; @xsd__anyURI namespace_; private: wsdl__message *messageRef; wsdl__part *partRef; public: int traverse(wsdl__definitions&); void messagePtr(wsdl__message*); void partPtr(wsdl__part*); wsdl__message *messagePtr() const; wsdl__part *partPtr() const; }; class soap__header { public: @xsd__QName message; @xsd__NMTOKEN part; @enum soap__useChoice use; @xsd__anyURI encodingStyle; @xsd__anyURI namespace_; std::vector headerfault; // * private: wsdl__message *messageRef; wsdl__part *partRef; public: int traverse(wsdl__definitions&); void messagePtr(wsdl__message*); void partPtr(wsdl__part*); wsdl__message *messagePtr() const; wsdl__part *partPtr() const; }; class soap__address { public: @xsd__anyURI location; }; class wsoap__module { public: @xsd__anyURI ref; @xsd__boolean required = false; }; class wsoap__header { public: @xsd__QName element; @xsd__boolean mustUnderstand_ = false; @xsd__boolean required = false; private: xs__element *elementRef; public: int traverse(wsdl__definitions&); void elementPtr(xs__element*); xs__element *elementPtr() const; }; gsoap-2.8.28/gsoap/wsdl/schema.h0000644000175000017500000004372112653650160015772 0ustar ellertellert/* schema.h schema of XSD schemas 1.0 and 1.1 -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap xs schema documentation: XSD binding schema //gsoap xs schema namespace: http://www.w3.org/2001/XMLSchema //gsoap xs schema elementForm: qualified //gsoap xs schema attributeForm: unqualified /* For the wsdl:arrayType attribute to support old style SOAP arrays: */ //gsoap wsdl schema namespace: http://schemas.xmlsoap.org/wsdl/ #import "imports.h" class xs__schema; // forward declaration class xs__simpleType; // forward declaration class xs__complexType; // forward declaration class xs__extension; // forward declaration class xs__restriction; // forward declaration class xs__seqchoice; // forward declaration class xs__group; // forward declaration class xs__list; // forward declaration class xs__union; // forward declaration class xs__annotation { public: char* documentation; }; class xs__assert { public: @xsd__string test; @xsd__anyURI xpathDefaultNamespace; xs__annotation *annotation; }; class xs__alternative { public: @xsd__string test; @xsd__QName type; @xsd__anyURI xpathDefaultNamespace; xs__annotation *annotation; }; enum xs__formChoice { unqualified, qualified }; class xs__element { public: @xsd__NCName name; @xsd__QName ref; @xsd__QName type; @xsd__string default_; @xsd__QName default__; // also get QName value if element type is QName @xsd__string fixed; @xsd__QName fixed_; // also get QName value if element type is QName @enum xs__formChoice *form; @xsd__boolean nillable = false; @xsd__boolean abstract = false; @xsd__QName substitutionGroup; @xsd__string minOccurs; // xsd:nonNegativeInteger @xsd__string maxOccurs; // xsd:nonNegativeInteger|unbounded @xsd__anyURI targetNamespace; // XSD 1.1 @xsd__string xmime__expectedContentTypes; xs__annotation *annotation; xs__simpleType *simpleType; // choice xs__complexType *complexType; // choice std::vector alternative; // XSD 1.1 (unused) xsd__string unique; // unused private: xs__schema *schemaRef; // schema to which this belongs xs__element *elementRef; // traverse() finds ref xs__simpleType *simpleTypeRef; // traverse() finds type or = simpleType above xs__complexType *complexTypeRef; // traverse() finds type or = complexType above std::vector substitutions; // traverse() finds substitutionGroup elements public: xs__element(); int traverse(xs__schema&); void schemaPtr(xs__schema*); void elementPtr(xs__element*); void simpleTypePtr(xs__simpleType*); void complexTypePtr(xs__complexType*); xs__schema *schemaPtr() const; xs__element *elementPtr() const; xs__simpleType *simpleTypePtr() const; xs__complexType *complexTypePtr() const; const std::vector *substitutionsPtr() const; }; enum xs__attribute_use { optional, prohibited, required, default_, fixed_ }; class xs__attribute { public: @xsd__NCName name; @xsd__QName ref; @xsd__QName type; @enum xs__attribute_use use = optional; @xsd__string default_; @xsd__QName default__; // also get QName value if attribute type is QName @xsd__string fixed; @xsd__QName fixed_; // also get QName value if attribute type is QName @enum xs__formChoice *form; @xsd__boolean inheritable; // XSD 1.1 (unused) @xsd__anyURI targetNamespace; // XSD 1.1 @xsd__QName wsdl__arrayType; // extensibility attribute added to simplify WSDL parsing xs__annotation *annotation; xs__simpleType *simpleType; private: xs__schema *schemaRef; // schema to which this belongs xs__attribute *attributeRef; // traverse() finds ref xs__simpleType *simpleTypeRef; // traverse() finds type or = simpleType above public: xs__attribute(); int traverse(xs__schema&); void schemaPtr(xs__schema*); void attributePtr(xs__attribute*); void simpleTypePtr(xs__simpleType*); xs__schema *schemaPtr() const; xs__attribute *attributePtr() const; xs__simpleType *simpleTypePtr() const; }; class xs__all { public: std::vector element; public: int traverse(xs__schema&); }; enum xs__processContents { strict, skip, lax }; typedef char *xs__namespaceList; // "##any" or "##other" or list of URI, "##targetNamespace", "##local" class xs__any { public: @xs__namespaceList namespace_ = "##any"; @enum xs__processContents processContents = strict; @xsd__string minOccurs; // xsd:nonNegativeInteger @xsd__string maxOccurs; // xsd:nonNegativeInteger|unbounded std::vector element; public: int traverse(xs__schema&); }; class xs__contents { public: $int __union; union xs__union_content { xs__element *element; xs__group *group; xs__seqchoice *choice; xs__seqchoice *sequence; xs__any *any; } __content; public: int traverse(xs__schema&); }; class xs__seqchoice { public: @xsd__string minOccurs; // xsd:nonNegativeInteger @xsd__string maxOccurs; // xsd:nonNegativeInteger|unbounded xs__annotation *annotation; std::vector __contents; private: xs__schema *schemaRef; // schema to which this belongs public: xs__seqchoice(); int traverse(xs__schema&); void schemaPtr(xs__schema*); xs__schema *schemaPtr() const; }; class xs__group { public: @xsd__NCName name; @xsd__QName ref; @xsd__string minOccurs; // xsd:nonNegativeInteger @xsd__string maxOccurs; // xsd:nonNegativeInteger|unbounded xs__annotation *annotation; xs__all *all; xs__seqchoice *choice; xs__seqchoice *sequence; private: xs__schema *schemaRef; // schema to which this belongs xs__group *groupRef; // traverse() finds ref public: xs__group(); int traverse(xs__schema&); void schemaPtr(xs__schema*); void groupPtr(xs__group*); xs__schema *schemaPtr() const; xs__group *groupPtr() const; }; class xs__anyAttribute { public: @xs__namespaceList namespace_ = "##any"; @enum xs__processContents processContents = strict; }; class xs__attributeGroup { public: @xsd__NCName name; @xsd__QName ref; xs__annotation *annotation; std::vector attribute; std::vector attributeGroup; xs__anyAttribute *anyAttribute; private: xs__schema *schemaRef; xs__attributeGroup *attributeGroupRef; public: xs__attributeGroup(); int traverse(xs__schema&); void schemaPtr(xs__schema*); void attributeGroupPtr(xs__attributeGroup*); xs__schema *schemaPtr() const; xs__attributeGroup *attributeGroupPtr() const; }; class xs__enumeration { public: @xsd__string value; @xsd__QName value_; // also get QName value if base type is QName xs__annotation *annotation; public: int traverse(xs__schema&); }; class xs__pattern { public: @xsd__string value; public: int traverse(xs__schema&); }; class xs__simpleContent { public: xs__extension *extension; // choice xs__restriction *restriction; // choice public: int traverse(xs__schema&); }; class xs__simpleType { public: @xsd__NMTOKEN name; @xsd__string vc__minVersion; // XSD 1.1 (unused) @xsd__string vc__maxVersion; // XSD 1.1 (unused) xs__annotation *annotation; xs__restriction *restriction; // choice xs__list *list; // choice xs__union *union_; // choice private: xs__schema *schemaRef; int level; public: xs__simpleType(); int traverse(xs__schema&); void schemaPtr(xs__schema*); xs__schema *schemaPtr() const; int baseLevel(); }; class xs__extension { public: @xsd__QName base; xs__group *group; xs__all *all; xs__seqchoice *choice; xs__seqchoice *sequence; std::vector attribute; std::vector attributeGroup; xs__anyAttribute *anyAttribute; xs__annotation *annotation; std::vector assert; // XSD 1.1 private: xs__simpleType *simpleTypeRef; // traverse() finds type xs__complexType *complexTypeRef; // traverse() finds type public: xs__extension(); int traverse(xs__schema&); void simpleTypePtr(xs__simpleType*); void complexTypePtr(xs__complexType*); xs__simpleType *simpleTypePtr() const; xs__complexType *complexTypePtr() const; }; class xs__length { public: @xsd__string value; @xsd__boolean fixed; xs__annotation *annotation; }; class xs__whiteSpace { public: @xsd__string value; }; class xs__restriction { public: @xsd__QName base; xs__simpleType *simpleType; // used in xs__attributeGroup *attributeGroup; // not used in xs__group *group; // not used in xs__all *all; // not used in xs__seqchoice *choice; // not used in xs__seqchoice *sequence; // not used in std::vector attribute; // not used in xs__anyAttribute *anyAttribute; // not used in std::vector enumeration; std::vector pattern; xs__whiteSpace *whiteSpace; xs__length *length; xs__length *minLength; xs__length *maxLength; xs__length *precision; // 2000 XSD 1.0 xs__length *scale; // 2000 XSD 1.0 xs__length *totalDigits; // 2001 XSD 1.0 xs__length *fractionDigits; // 2001 XSD 1.0 xs__length *minInclusive; xs__length *maxInclusive; xs__length *minExclusive; xs__length *maxExclusive; xs__annotation *annotation; std::vector assert; // XSD 1.1 xs__assert *assertion; // XSD 1.1 private: xs__simpleType *simpleTypeRef; // traverse() finds type xs__complexType *complexTypeRef; // traverse() finds type public: xs__restriction(); int traverse(xs__schema&); void simpleTypePtr(xs__simpleType*); void complexTypePtr(xs__complexType*); xs__simpleType *simpleTypePtr() const; xs__complexType *complexTypePtr() const; }; class xs__list { public: @xsd__QName itemType; xs__restriction *restriction; // choice std::vector simpleType; // choice private: xs__simpleType *itemTypeRef; public: xs__list(); int traverse(xs__schema&); void itemTypePtr(xs__simpleType*); xs__simpleType *itemTypePtr() const; }; class xs__union { public: @xsd__NMTOKENS memberTypes; // check if NMTOKENS is ok??? std::vector simpleType; public: int traverse(xs__schema&); }; class xs__complexContent { public: @xsd__boolean mixed = false; xs__extension *extension; xs__restriction *restriction; xs__annotation *annotation; public: int traverse(xs__schema&); }; class xs__complexType { public: @xsd__NMTOKEN name; @xsd__boolean abstract = false; @xsd__boolean mixed = false; @xsd__boolean defaultAttributesApply = true; // XSD 1.1 @xsd__string vc__minVersion; // XSD 1.1 (unused) @xsd__string vc__maxVersion; // XSD 1.1 (unused) xs__annotation *annotation; xs__simpleContent *simpleContent; xs__complexContent *complexContent; xs__all *all; xs__seqchoice *choice; xs__seqchoice *sequence; xs__any *any; std::vector attribute; std::vector attributeGroup; xs__anyAttribute *anyAttribute; std::vector assert; // XSD 1.1 private: xs__schema *schemaRef; int level; public: xs__complexType(); int traverse(xs__schema&); void schemaPtr(xs__schema*); xs__schema *schemaPtr() const; int baseLevel(); }; class xs__import { public: @xsd__anyURI namespace_; @xsd__anyURI schemaLocation; private: xs__schema *schemaRef; // set by WSDL parser or via schemaLocation public: xs__import(); int traverse(xs__schema&); void schemaPtr(xs__schema*); xs__schema *schemaPtr() const; }; class xs__include { public: @xsd__anyURI schemaLocation; private: xs__schema *schemaRef; public: xs__include(); int preprocess(xs__schema&); int traverse(xs__schema&); void schemaPtr(xs__schema*); xs__schema *schemaPtr() const; }; class xs__override { public: @xsd__anyURI schemaLocation; std::vector attribute; std::vector element; std::vector group; std::vector attributeGroup; std::vector simpleType; std::vector complexType; private: xs__schema *schemaRef; public: xs__override(); int preprocess(xs__schema&); int traverse(xs__schema&); void schemaPtr(xs__schema*); xs__schema *schemaPtr() const; }; class xs__redefine { public: @xsd__anyURI schemaLocation; std::vector group; std::vector attributeGroup; std::vector simpleType; std::vector complexType; private: xs__schema *schemaRef; public: xs__redefine(); int preprocess(xs__schema&); int traverse(xs__schema&); void schemaPtr(xs__schema*); xs__schema *schemaPtr() const; }; class xs__schema { public: @xsd__anyURI targetNamespace = ""; @xsd__string version; @xsd__NCName defaultAttributes; // XSD 1.1 @enum xs__formChoice attributeFormDefault = unqualified; @enum xs__formChoice elementFormDefault = unqualified; xs__annotation *annotation; std::vector include; std::vector override_; std::vector redefine; std::vector import; std::vector attribute; std::vector element; std::vector group; std::vector attributeGroup; std::vector simpleType; std::vector complexType; struct soap *soap; private: xs__attributeGroup *attributeGroupRef; // defaultAttributes group bool updated; char* location; int redirs; SetOfString builtinTypeSet; SetOfString builtinElementSet; SetOfString builtinAttributeSet; public: xs__schema(); xs__schema(struct soap*); xs__schema(struct soap*, const char*, const char*); virtual ~xs__schema(); int get(struct soap*); // gSOAP getter is triggered after parsing int preprocess(); int insert(xs__schema&); int traverse(); int read(const char*, const char*); void sourceLocation(const char*); const char* sourceLocation(); xs__attributeGroup *attributeGroupPtr() const; // defaultAttributes group int error(); void print_fault(); void builtinType(const char*); void builtinElement(const char*); void builtinAttribute(const char*); const SetOfString& builtinTypes() const; const SetOfString& builtinElements() const; const SetOfString& builtinAttributes() const; bool empty() const; friend ostream& operator<<(ostream&, const xs__schema&); friend istream& operator>>(istream&, xs__schema&); }; extern ostream &operator<<(ostream &o, const xs__schema &e); extern istream &operator>>(istream &i, xs__schema &e); gsoap-2.8.28/gsoap/wsdl/service.cpp0000644000175000017500000051232412653650160016525 0ustar ellertellert/* service.cpp Generate gSOAP service structures from WSDL. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2016, Robert van Engelen, Genivia Inc. All Rights Reserved. This part of the software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "types.h" #include "service.h" #include #define URI_CHAR(c) (((c) > 32 && (c) != '"' && (c) != '<' && (c) != '>' && (c) != '\\' && (c) != '^' && (c) != '`' && (c) <= 'z') || (c) == '~') static const char *urienc(struct soap*, const char*); static bool imported(const char *tag); static void comment(const char *start, const char *middle, const char *end, const char *text); static void page(const char *page, const char *title, const char *text); static void section(const char *section, const char *title, const char *text); static void banner(const char*, const char* = NULL); static void ident(); static void gen_policy(Service&, const vector&, const char*, Types&); static void gen_policy_enablers(const Service&); static void gen_plnk(const Service& service); static void gen_vprop(const wsdl__definitions& definitions, Types&); //////////////////////////////////////////////////////////////////////////////// // // Definitions methods // //////////////////////////////////////////////////////////////////////////////// Definitions::Definitions() { } void Definitions::collect(const wsdl__definitions& definitions) { // Collect information: analyze WSDL definitions and imported definitions analyze(definitions); for (vector::const_iterator import = definitions.import.begin(); import != definitions.import.end(); ++import) if ((*import).definitionsPtr()) analyze(*(*import).definitionsPtr()); } void Definitions::analyze(const wsdl__definitions& definitions) { // Analyze WSDL and build Service information binding_count = 0; // Determine number of relevant service bindings (service prefix option only) for (vector::const_iterator i = definitions.binding.begin(); i != definitions.binding.end(); ++i) { for (vector::const_iterator j = (*i).operation.begin(); j != (*i).operation.end(); ++j) { if ((*j).operationPtr()) { binding_count++; break; } } } if (vflag && definitions.name) fprintf(stderr, "\nAnalyzing \"%s\" which has %d service binding(s)\n", definitions.name, binding_count); if (binding_count == 0 && definitions.import.empty() && definitions.name && (!definitions.portType.empty() || !definitions.interface_.empty())) fprintf(stderr, "\nWarning: WSDL \"%s\" has no bindings to implement operations\n", definitions.name); else if (binding_count > 1 && !service_prefix) { // This puts all operations under a single binding fprintf(stderr, "\nWarning: %d service bindings found, but collected as one service (use option -Nname to produce a separate service for each binding)\n", binding_count); } // Analyze and collect service data for (vector::const_iterator binding = definitions.binding.begin(); binding != definitions.binding.end(); ++binding) { // /definitions/binding/documentation const char *binding_documentation = (*binding).documentation; // /definitions/binding/soap:binding soap__binding *soap__binding_ = (*binding).soap__binding_; // /definitions/binding/soap:binding/@transport const char *soap__binding_transport = NULL; int version = 0; if (soap__binding_) soap__binding_transport = soap__binding_->transport; else if ((*binding).wsoap__version && strlen((*binding).wsoap__version) > 2) version = (*binding).wsoap__version[2]-'0'; // WSDL 2.0 else if (!(*binding).http__binding_) version = 2; // assume WSDL 2.0 if (version == 2) soap12 = true; // /definitions/binding/@soap:protocol if ((*binding).wsoap__protocol) soap__binding_transport = (*binding).wsoap__protocol; // /definitions/binding/@name const char *binding_name = ""; if ((*binding).name) binding_name = (*binding).name; else if ((*binding).portTypePtr() && (*binding).portTypePtr()->name) { size_t l = strlen((*binding).portTypePtr()->name); char *s = (char*)soap_malloc(definitions.soap, l + 8); if (s) { soap_strcpy(s, l + 8, (*binding).portTypePtr()->name); soap_strcpy(s + l, 8, "Binding"); binding_name = s; } } if (!Rflag && (!soap__binding_transport || (strcmp(soap__binding_transport+strlen(soap__binding_transport)-4, "http") && strcmp(soap__binding_transport+strlen(soap__binding_transport)-5, "HTTP/")))) { // -R not set: skip WSDL REST bindings if (!Wflag) fprintf(stderr, "\nWarning: ignoring RESTful binding \"%s\" because of non-SOAP transport \"%s\" (use option -R to enable REST)\n", binding_name, soap__binding_transport ? soap__binding_transport : ""); } else { // /definitions/binding/@type const char *binding_type = NULL; if ((*binding).type_) binding_type = (*binding).type_; // TODO: need to find the Policy of portType, though it is never used...? // const wsp__Policy *portType_policy = NULL; // /definitions/binding/wsp:Policy and wsp:PolicyReference /* const wsp__Policy *binding_policy = NULL; if ((*binding).wsp__Policy_) binding_policy = (*binding).wsp__Policy_; if ((*binding).wsp__PolicyReference_) binding_policy = (*binding).wsp__PolicyReference_->policyPtr(); */ // /definitions/binding/http:binding http__binding *http__binding_ = (*binding).http__binding_; const char *http__binding_verb = NULL; if (http__binding_) http__binding_verb = http__binding_->verb; // HTTP POST and GET else if ((*binding).whttp__methodDefault) http__binding_verb = (*binding).whttp__methodDefault; // HTTP POST and GET // /definitions/binding/soap:binding/@style soap__styleChoice soap__binding_style = document; if (soap__binding_ && soap__binding_->style) soap__binding_style = *soap__binding_->style; // /definitions/binding/operation* for (vector::const_iterator operation = (*binding).operation.begin(); operation != (*binding).operation.end(); ++operation) { // /definitions/portType/operation/ associated with /definitions/binding/operation wsdl__operation *wsdl__operation_ = (*operation).operationPtr(); // /definitions/binding/operation/soap:operation soap__operation *soap__operation_ = (*operation).soap__operation_; // /definitions/binding/operation/soap:operation/@style soap__styleChoice soap__operation_style = soap__binding_style; if (soap__operation_ && soap__operation_->style) soap__operation_style = *soap__operation_->style; // /definitions/binding/@wsoap:mepDefault const char *soap__operation_mep = (*binding).wsoap__mepDefault; // /definitions/binding/operation/@wsoap:mep if ((*operation).wsoap__mep) soap__operation_mep = (*operation).wsoap__mep; // /definitions/binding/operation/@whttp:method const char *http_method = http__binding_verb; if ((*operation).whttp__method) http_method = (*operation).whttp__method; // /definitions/binding/operation/@wsoap:action const char *soap__operation_action = NULL; if ((*operation).wsoap__action) soap__operation_action = (*operation).wsoap__action; // /definitions/binding/operation/http:operation http__operation *http__operation_ = (*operation).http__operation_; // /definitions/binding/wsp:Policy and wsp:PolicyReference const wsp__Policy *ext_operation_policy = NULL; if ((*operation).wsp__Policy_) ext_operation_policy = (*operation).wsp__Policy_; if ((*operation).wsp__PolicyReference_) ext_operation_policy = (*operation).wsp__PolicyReference_->policyPtr(); // /definitions/binding/operation/http:operation/@location const char *http__operation_location = NULL; if (http__operation_) http__operation_location = http__operation_->location; else if ((*operation).whttp__location) http__operation_location = (*operation).whttp__location; // /definitions/binding/operation/input and output wsdl__ext_ioput *ext_input, *ext_output; // /definitions/portType/operation if (wsdl__operation_ && wsdl__operation_->name) { bool reversed = false; wsdl__ioput *input = NULL; wsdl__ioput *output = NULL; // normalize input/output order for solicit-response operations if (wsdl__operation_->__union1 == SOAP_UNION_wsdl__union_ioput_input) input = wsdl__operation_->__ioput1.input; else if (wsdl__operation_->__union1 == SOAP_UNION_wsdl__union_ioput_output) { reversed = true; input = wsdl__operation_->__ioput1.output; } if (wsdl__operation_->__union2 == SOAP_UNION_wsdl__union_ioput_input) { reversed = true; output = wsdl__operation_->__ioput2.input; } else if (wsdl__operation_->__union2 == SOAP_UNION_wsdl__union_ioput_output) output = wsdl__operation_->__ioput2.output; else // one input only or one output only (or none) { reversed = false; input = NULL; output = NULL; if (wsdl__operation_->__union1 == SOAP_UNION_wsdl__union_ioput_input) input = wsdl__operation_->__ioput1.input; else if (wsdl__operation_->__union1 == SOAP_UNION_wsdl__union_ioput_output) output = wsdl__operation_->__ioput1.output; } if (!reversed) { ext_input = (*operation).input; ext_output = (*operation).output; } else { ext_input = (*operation).output; ext_output = (*operation).input; } if ((http_method && !strcmp(http_method, "GET")) || (wsdl__operation_->pattern && !strstr(wsdl__operation_->pattern, "in"))) input = NULL; if (wsdl__operation_->pattern && !strstr(wsdl__operation_->pattern, "out")) output = NULL; if (wsdl__operation_->pattern) // WSDL 2.0 { soap__operation_style = document; if (wsdl__operation_->style && !strcmp(wsdl__operation_->style, "http://www.w3.org/ns/wsdl/rpc")) soap__operation_style = rpc; else if ((*binding).portTypePtr() && (*binding).portTypePtr()->styleDefault && !strcmp( (*binding).portTypePtr()->styleDefault, "http://www.w3.org/ns/wsdl/rpc")) soap__operation_style = rpc; } // /definitions/binding/wsp:Policy and wsp:PolicyReference const wsp__Policy *operation_policy = NULL; if (wsdl__operation_->wsp__Policy_) operation_policy = wsdl__operation_->wsp__Policy_; if (wsdl__operation_->wsp__PolicyReference_) operation_policy = wsdl__operation_->wsp__PolicyReference_->policyPtr(); if (!Rflag && (http__operation_ || http__operation_location)) { // skip WSDL REST HTTP operations if (!Wflag) fprintf(stderr, "\nWarning: ignoring RESTful operation \"%s\" in binding \"%s\" (use option -R to enable REST)\n", wsdl__operation_->name, binding_name); } else if (input) { soap__body *input_body = NULL; mime__mimeXml *input_mime = NULL; mime__content *input_mime_content = NULL; if (!reversed && ext_input) { input_body = ext_input->soap__body_; input_mime = ext_input->mime__mimeXml_; input_mime_content = ext_input->mime__content_; if (ext_input->mime__multipartRelated_) { for (vector::const_iterator part = ext_input->mime__multipartRelated_->part.begin(); part != ext_input->mime__multipartRelated_->part.end(); ++part) if ((*part).soap__body_) { input_body = (*part).soap__body_; break; } } } else if (ext_output) { input_body = ext_output->soap__body_; input_mime = ext_output->mime__mimeXml_; input_mime_content = ext_output->mime__content_; if (ext_output->mime__multipartRelated_) { for (vector::const_iterator part = ext_output->mime__multipartRelated_->part.begin(); part != ext_output->mime__multipartRelated_->part.end(); ++part) if ((*part).soap__body_) { input_body = (*part).soap__body_; break; } } } if (wsdl__operation_->style && !strcmp(wsdl__operation_->style, "http://www.w3.org/ns/wsdl/style/iri")) { input_mime_content = soap_new_mime__content(definitions.soap); input_mime_content->soap_default(definitions.soap); input_mime_content->type = (char*)"application/x-www-form-urlencoded"; } // MUST have an input binding, otherwise can't generate a service operation if (input_body || input_mime || input_mime_content || input->element) { char *URI; if (input_body && soap__operation_style == rpc) URI = input_body->namespace_; else if (binding_count == 1 || !service_prefix) URI = definitions.targetNamespace; else { // multiple service bidings are used, each needs a unique new URI size_t l = strlen(definitions.targetNamespace) + strlen(binding_name); URI = (char*)soap_malloc(definitions.soap, l + 2); if (URI) { soap_strcpy(URI, l + 2, definitions.targetNamespace); size_t n = strlen(URI); if (n > 0 && URI[n-1] != '/') { soap_strcpy(URI + n, l + 2 - n, "/"); ++n; } soap_strcpy(URI + n, l + 2 - n, binding_name); } } if (URI) { const char *prefix = types.nsprefix(service_prefix, URI); const char *name = types.aname(NULL, NULL, binding_name); // name of service is binding name Service *service = services[prefix]; if (!service) { service = services[prefix] = new Service(); service->prefix = prefix; service->URI = urienc(definitions.soap, URI); service->name = name; service->transport = soap__binding_transport; if ((*binding).portTypePtr() && (*binding).portTypePtr()->name) service->type = types.aname(NULL, NULL, (*binding).portTypePtr()->name); else service->type = NULL; // collect faults (TODO: this is not used anywhere) for (vector::const_iterator fault = (*binding).fault.begin(); fault != (*binding).fault.end(); ++fault) { Message *f = analyze_fault(definitions, service, *fault); if (f) service->fault[f->name] = f; } // collect policies for the bindings for (vector::const_iterator p = (*binding).wsp__Policy_.begin(); p != (*binding).wsp__Policy_.end(); ++p) service->policy.push_back(&(*p)); for (vector::const_iterator r = (*binding).wsp__PolicyReference_.begin(); r != (*binding).wsp__PolicyReference_.end(); ++r) service->policy.push_back((*r).policyPtr()); // collect policies for the service endpoints for (vector::const_iterator s = definitions.service.begin(); s != definitions.service.end(); ++s) { for (vector::const_iterator p = (*s).wsp__Policy_.begin(); p != (*s).wsp__Policy_.end(); ++p) service->policy.push_back(&(*p)); for (vector::const_iterator r = (*s).wsp__PolicyReference_.begin(); r != (*s).wsp__PolicyReference_.end(); ++r) service->policy.push_back((*r).policyPtr()); } // collect BPEL 2.0 partner link roles for (vector::const_iterator p = definitions.plnk__partnerLinkType.begin(); p != definitions.plnk__partnerLinkType.end(); ++p) { for (vector::const_iterator r = (*p).role.begin(); r != (*p).role.end(); ++r) { if ((binding_count > 1 && !service_prefix) || (*r).portTypePtr() == (*binding).portTypePtr()) service->role.push_back(&(*r)); } } } for (vector::const_iterator s = definitions.service.begin(); s != definitions.service.end(); ++s) { for (vector::const_iterator port = (*s).port.begin(); port != (*s).port.end(); ++port) { if ((*port).bindingPtr() == &(*binding)) { if ((*port).soap__address_ && (*port).soap__address_->location) service->location.insert(urienc(definitions.soap, (*port).soap__address_->location)); if ((*port).wsa__EndpointReference && (*port).wsa__EndpointReference->Address) service->location.insert(urienc(definitions.soap, (*port).wsa__EndpointReference->Address)); if ((*port).http__address_ && (*port).http__address_->location) service->location.insert(urienc(definitions.soap, (*port).http__address_->location)); // collect service documentation if ((*s).documentation) service->service_documentation[(*service).name] = (*s).documentation; if ((*port).documentation && (*port).name) service->port_documentation[(*port).name] = (*port).documentation; if (binding_documentation) service->binding_documentation[binding_name] = binding_documentation; // collect policies for the service and endpoints if ((*port).wsp__Policy_) service->policy.push_back((*port).wsp__Policy_); if ((*port).wsp__PolicyReference_ && (*port).wsp__PolicyReference_->policyPtr()) service->policy.push_back((*port).wsp__PolicyReference_->policyPtr()); } } for (vector::const_iterator endpoint = (*s).endpoint.begin(); endpoint != (*s).endpoint.end(); ++endpoint) { if ((*endpoint).bindingPtr() == &(*binding)) { if ((*endpoint).address) service->location.insert(urienc(definitions.soap, (*endpoint).address)); if ((*endpoint).wsa__EndpointReference && (*endpoint).wsa__EndpointReference->Address) service->location.insert(urienc(definitions.soap, (*endpoint).wsa__EndpointReference->Address)); if ((*endpoint).http__address_ && (*endpoint).http__address_->location) service->location.insert(urienc(definitions.soap, (*endpoint).http__address_->location)); // TODO: locations need auth // service->auth_scheme = (*endpoint).whttp__authenticationScheme; // service->auth_realm = (*endpoint).whttp__authenticationRealm; // collect service documentation if ((*s).documentation) service->service_documentation[(*service).name] = (*s).documentation; if ((*endpoint).documentation && (*endpoint).name) service->port_documentation[(*endpoint).name] = (*endpoint).documentation; if (binding_documentation) service->binding_documentation[binding_name] = binding_documentation; // collect policies for the service and endpoints if ((*endpoint).wsp__Policy_) service->policy.push_back((*endpoint).wsp__Policy_); if ((*endpoint).wsp__PolicyReference_ && (*endpoint).wsp__PolicyReference_->policyPtr()) service->policy.push_back((*endpoint).wsp__PolicyReference_->policyPtr()); } } } Operation *op = new Operation(); op->operation = wsdl__operation_; op->name = types.aname(NULL, NULL, wsdl__operation_->name); op->prefix = prefix; op->URI = urienc(definitions.soap, URI); op->style = soap__operation_style; op->mep = soap__operation_mep; if (soap__binding_transport && (!strcmp(soap__binding_transport+strlen(soap__binding_transport)-4, "http") || !strcmp(soap__binding_transport+strlen(soap__binding_transport)-5, "HTTP/"))) { if ((op->mep && strstr(op->mep, "soap-response")) || (http_method && !strcmp(http_method, "GET"))) op->protocol = "SOAP-GET"; else if (version == 1) op->protocol = "SOAP1.1"; else if (version == 2) op->protocol = "SOAP1.2"; else op->protocol = "SOAP"; } else { if (http_method) op->protocol = http_method; else op->protocol = "HTTP"; } op->documentation = wsdl__operation_->documentation; op->operation_documentation = (*operation).documentation; op->parameterOrder = wsdl__operation_->parameterOrder; if (http__operation_location) op->action = http__operation_location; // TODO: for now, store HTTP location in action else { op->action = soap__operation_action; if ((*operation).soap__operation_) { if ((*operation).soap__operation_->soapActionRequired) op->action = (*operation).soap__operation_->soapAction; } else if (version != 2) op->action = ""; } if (operation_policy) op->policy.push_back(operation_policy); if (ext_operation_policy) op->policy.push_back(ext_operation_policy); op->input = new Message(); op->input->name = wsdl__operation_->name; if (input_body && soap__operation_style == rpc && !input_body->namespace_) { op->input->URI = ""; fprintf(stderr, "\nError: no soap:body namespace attribute\n"); } else if (input_body) op->input->URI = urienc(definitions.soap, input_body->namespace_); else op->input->URI = service->URI; op->input->style = soap__operation_style; if (input_body) { op->input->use = input_body->use; op->input->encodingStyle = input_body->encodingStyle; } if (input->wsa__Action) op->input->action = input->wsa__Action; else if (input->wsam__Action) op->input->action = input->wsam__Action; else if (op->action) op->input->action = op->action; else if (definitions.targetNamespace && (*binding).portTypePtr() && (*binding).portTypePtr()->name) { const char *name = input->name ? input->name : op->name; size_t l = strlen(definitions.targetNamespace) + strlen((*binding).portTypePtr()->name) + strlen(name); char *tmp = (char*)soap_malloc(definitions.soap, l + 3); if (tmp) { (SOAP_SNPRINTF(tmp, l + 3, l + 2), "%s/%s/%s", definitions.targetNamespace, (*binding).portTypePtr()->name, name); op->input->action = tmp; } } op->input->message = input->messagePtr(); op->input->element = input->elementPtr(); op->input->part = NULL; op->input->mustUnderstand = false; op->input->multipartRelated = NULL; op->input->content = input_mime_content; op->input->body_parts = NULL; op->input->layout = NULL; op->input->ext_documentation = NULL; if (ext_input) { op->input->multipartRelated = ext_input->mime__multipartRelated_; if (ext_input->mime__multipartRelated_ && !ext_input->mime__multipartRelated_->part.empty()) op->input->header = ext_input->mime__multipartRelated_->part.front().soap__header_; else if (!ext_input->soap__header_.empty()) op->input->header = ext_input->soap__header_; else if (!ext_input->wsoap__header_.empty()) op->input->wheader = ext_input->wsoap__header_; if (ext_input->mime__multipartRelated_ && !ext_input->mime__multipartRelated_->part.empty() && ext_input->mime__multipartRelated_->part.front().soap__body_) op->input->body_parts = ext_input->mime__multipartRelated_->part.front().soap__body_->parts; else if (input_body) op->input->body_parts = input_body->parts; if (ext_input->dime__message_) op->input->layout = ext_input->dime__message_->layout; else op->input->layout = NULL; op->input->ext_documentation = ext_input->documentation; } op->input->documentation = input->documentation; // collect input message policies if (op->input->message) { for (vector::const_iterator p = op->input->message->wsp__Policy_.begin(); p != op->input->message->wsp__Policy_.end(); ++p) op->input->policy.push_back(&(*p)); for (vector::const_iterator r = op->input->message->wsp__PolicyReference_.begin(); r != op->input->message->wsp__PolicyReference_.end(); ++r) op->input->policy.push_back((*r).policyPtr()); } if (input->wsp__Policy_) op->input->policy.push_back(input->wsp__Policy_); if (input->wsp__PolicyReference_ && input->wsp__PolicyReference_->policyPtr()) op->input->policy.push_back(input->wsp__PolicyReference_->policyPtr()); if (ext_input) { if (ext_input->wsp__Policy_) op->input->policy.push_back(ext_input->wsp__Policy_); if (ext_input->wsp__PolicyReference_ && ext_input->wsp__PolicyReference_->policyPtr()) op->input->policy.push_back(ext_input->wsp__PolicyReference_->policyPtr()); } if (soap__operation_style == document) op->input_name = types.oname("__", op->URI, op->input->name); else op->input_name = types.oname(NULL, op->input->URI, op->input->name); if (output) { soap__body *output_body = NULL; mime__mimeXml *output_mime = NULL; mime__content *output_mime_content = NULL; if (ext_output) { output_body = ext_output->soap__body_; output_mime = ext_output->mime__mimeXml_; output_mime_content = ext_output->mime__content_; if (ext_output->mime__multipartRelated_) { for (vector::const_iterator part = ext_output->mime__multipartRelated_->part.begin(); part != ext_output->mime__multipartRelated_->part.end(); ++part) if ((*part).soap__body_) { output_body = (*part).soap__body_; break; } } } if (ext_output && ext_output->mime__content_) { op->output = new Message(); op->output->name = NULL; op->output->URI = NULL; op->output->style = soap__operation_style; op->output->use = literal; op->output->encodingStyle = NULL; op->output->action = NULL; op->output->body_parts = NULL; op->output->part = NULL; op->output->mustUnderstand = false; op->output->multipartRelated = NULL; op->output->content = output_mime_content; op->output->message = output->messagePtr(); op->output->element = output->elementPtr(); op->output->layout = NULL; } else if (output_body || output_mime || output_mime_content || output->element) { op->output = new Message(); op->output->name = wsdl__operation_->name; // RPC uses operation/@name with suffix 'Response' as set below op->output->style = soap__operation_style; if (output_body) { op->output->use = output_body->use; // the code below is a hack around the RPC encoded response message element tag mismatch with Axis: if (!output_body->namespace_ || output_body->use == encoded) op->output->URI = op->input->URI; // encoded seems (?) to require the request's namespace else op->output->URI = urienc(definitions.soap, output_body->namespace_); op->output->encodingStyle = output_body->encodingStyle; } else op->output->URI = service->URI; if (output->wsa__Action) op->output->action = output->wsa__Action; else if (output->wsam__Action) op->output->action = output->wsam__Action; else if (http__operation_location) op->output->action = NULL; else if (op->action) { size_t l = strlen(op->action); char *tmp = (char*)soap_malloc(definitions.soap, l + 9); if (tmp) { (SOAP_SNPRINTF(tmp, l + 9, l + 8), "%sResponse", op->action); op->output->action = tmp; } } else if (definitions.targetNamespace && (*binding).portTypePtr() && (*binding).portTypePtr()->name) { const char *name = output->name ? output->name : op->name; size_t l = strlen(definitions.targetNamespace) + strlen((*binding).portTypePtr()->name) + strlen(name); char *tmp = (char*)soap_malloc(definitions.soap, l + 11); if (tmp) { (SOAP_SNPRINTF(tmp, l + 11, l + 10), "%s/%s/%s%s", definitions.targetNamespace, (*binding).portTypePtr()->name, name, output->name ? "" : "Response"); op->output->action = tmp; } } op->output->message = output->messagePtr(); op->output->element = output->elementPtr(); op->output->part = NULL; op->output->content = output_mime_content; op->output->body_parts = NULL; op->output->layout = NULL; op->output->ext_documentation = NULL; op->output->mustUnderstand = false; } if (ext_output) { op->output->multipartRelated = ext_output->mime__multipartRelated_; if (ext_output->mime__multipartRelated_ && !ext_output->mime__multipartRelated_->part.empty()) op->output->header = ext_output->mime__multipartRelated_->part.front().soap__header_; else if (!ext_output->soap__header_.empty()) op->output->header = ext_output->soap__header_; else if (!ext_output->wsoap__header_.empty()) op->output->wheader = ext_output->wsoap__header_; if (ext_output->mime__multipartRelated_ && !ext_output->mime__multipartRelated_->part.empty() && ext_output->mime__multipartRelated_->part.front().soap__body_) op->output->body_parts = ext_output->mime__multipartRelated_->part.front().soap__body_->parts; else if (output_body) op->output->body_parts = output_body->parts; if (ext_output->dime__message_) op->output->layout = ext_output->dime__message_->layout; else op->output->layout = NULL; op->output->ext_documentation = ext_output->documentation; } if (op->output->name) { size_t l = strlen(op->output->name); char *s = (char*)soap_malloc(definitions.soap, l + 9); if (s) { (SOAP_SNPRINTF(s, l + 9, l + 8), "%sResponse", op->output->name); if (soap__operation_style == document) op->output_name = types.oname("__", op->URI, s); else op->output_name = types.oname(NULL, op->output->URI, s); } } op->output->documentation = output->documentation; // collect output message policies if (op->output->message) { for (vector::const_iterator p = op->output->message->wsp__Policy_.begin(); p != op->output->message->wsp__Policy_.end(); ++p) op->output->policy.push_back(&(*p)); for (vector::const_iterator r = op->output->message->wsp__PolicyReference_.begin(); r != op->output->message->wsp__PolicyReference_.end(); ++r) op->output->policy.push_back((*r).policyPtr()); } if (output->wsp__Policy_) op->output->policy.push_back(output->wsp__Policy_); if (output->wsp__PolicyReference_ && output->wsp__PolicyReference_->policyPtr()) op->output->policy.push_back(output->wsp__PolicyReference_->policyPtr()); if (ext_output) { if (ext_output->wsp__Policy_) op->output->policy.push_back(ext_output->wsp__Policy_); if (ext_output->wsp__PolicyReference_ && ext_output->wsp__PolicyReference_->policyPtr()) op->output->policy.push_back(ext_output->wsp__PolicyReference_->policyPtr()); } } else { op->output_name = NULL; op->output = NULL; } analyze_headers(definitions, service, ext_input, ext_output); analyze_faults(definitions, service, op, operation); service->operation.push_back(op); } else { if (!Wflag) fprintf(stderr, "\nWarning: no SOAP RPC operation namespace, operations will be ignored\n"); } } else fprintf(stderr, "\nError: no wsdl:definitions/binding/operation/input\n"); } else if (output) { // This part is similar to the previous clause, limited to one-way output operations soap__body *output_body = NULL; mime__mimeXml *output_mime = NULL; mime__content *output_mime_content = NULL; if (!reversed && ext_output) { output_body = ext_output->soap__body_; output_mime = ext_output->mime__mimeXml_; output_mime_content = ext_output->mime__content_; if (ext_output->mime__multipartRelated_) { for (vector::const_iterator part = ext_output->mime__multipartRelated_->part.begin(); part != ext_output->mime__multipartRelated_->part.end(); ++part) if ((*part).soap__body_) { output_body = (*part).soap__body_; break; } } } else if (ext_input) { output_body = ext_input->soap__body_; output_mime = ext_input->mime__mimeXml_; output_mime_content = ext_input->mime__content_; if (ext_input->mime__multipartRelated_) { for (vector::const_iterator part = ext_input->mime__multipartRelated_->part.begin(); part != ext_input->mime__multipartRelated_->part.end(); ++part) if ((*part).soap__body_) { output_body = (*part).soap__body_; break; } } } if (wsdl__operation_->style && !strcmp(wsdl__operation_->style, "http://www.w3.org/ns/wsdl/style/iri")) { output_mime_content = soap_new_mime__content(definitions.soap); output_mime_content->soap_default(definitions.soap); output_mime_content->type = (char*)"application/x-www-form-urlencoded"; } if (output_body || output_mime || output_mime_content || output->element) { char *URI; if (output_body && soap__operation_style == rpc) URI = output_body->namespace_; else if (binding_count == 1 || !service_prefix) URI = definitions.targetNamespace; else { // multiple service bidings are used, each needs a unique new URI size_t l = strlen(definitions.targetNamespace) + strlen(binding_name); URI = (char*)soap_malloc(definitions.soap, l + 2); if (URI) { soap_strcpy(URI, l + 2, definitions.targetNamespace); size_t n = strlen(URI); if (n > 0 && URI[n-1] != '/') { soap_strcpy(URI + n, l + 2 - n, "/"); ++n; } soap_strcpy(URI + n, l + 2 - n, binding_name); } } if (URI) { const char *prefix = types.nsprefix(service_prefix, URI); const char *name = types.aname(NULL, NULL, binding_name); // name of service is binding name Service *service = services[prefix]; if (!service) { service = services[prefix] = new Service(); service->prefix = prefix; service->URI = urienc(definitions.soap, URI); service->name = name; service->transport = soap__binding_transport; if ((*binding).portTypePtr() && (*binding).portTypePtr()->name) service->type = types.aname(NULL, NULL, (*binding).portTypePtr()->name); else service->type = NULL; // collect faults (TODO: this is not used anywhere) for (vector::const_iterator fault = (*binding).fault.begin(); fault != (*binding).fault.end(); ++fault) { Message *f = analyze_fault(definitions, service, *fault); if (f) service->fault[f->name] = f; } // collect policies for the bindings for (vector::const_iterator p = (*binding).wsp__Policy_.begin(); p != (*binding).wsp__Policy_.end(); ++p) service->policy.push_back(&(*p)); for (vector::const_iterator r = (*binding).wsp__PolicyReference_.begin(); r != (*binding).wsp__PolicyReference_.end(); ++r) service->policy.push_back((*r).policyPtr()); // collect policies for the service endpoints for (vector::const_iterator s = definitions.service.begin(); s != definitions.service.end(); ++s) { for (vector::const_iterator p = (*s).wsp__Policy_.begin(); p != (*s).wsp__Policy_.end(); ++p) service->policy.push_back(&(*p)); for (vector::const_iterator r = (*s).wsp__PolicyReference_.begin(); r != (*s).wsp__PolicyReference_.end(); ++r) service->policy.push_back((*r).policyPtr()); } // collect BPEL 2.0 partner link roles for (vector::const_iterator p = definitions.plnk__partnerLinkType.begin(); p != definitions.plnk__partnerLinkType.end(); ++p) { for (vector::const_iterator r = (*p).role.begin(); r != (*p).role.end(); ++r) { if ((binding_count > 1 && !service_prefix) || (*r).portTypePtr() == (*binding).portTypePtr()) service->role.push_back(&(*r)); } } } for (vector::const_iterator s = definitions.service.begin(); s != definitions.service.end(); ++s) { for (vector::const_iterator port = (*s).port.begin(); port != (*s).port.end(); ++port) { if ((*port).bindingPtr() == &(*binding)) { if ((*port).soap__address_ && (*port).soap__address_->location) service->location.insert(urienc(definitions.soap, (*port).soap__address_->location)); else if ((*port).wsa__EndpointReference && (*port).wsa__EndpointReference->Address) service->location.insert(urienc(definitions.soap, (*port).wsa__EndpointReference->Address)); // TODO: HTTP address for HTTP operations // if ((*port).http__address_) // http__address_location = http__address_->location; // collect service documentation if ((*s).documentation) service->service_documentation[(*service).name] = (*s).documentation; if ((*port).documentation && (*port).name) service->port_documentation[(*port).name] = (*port).documentation; if (binding_documentation) service->binding_documentation[binding_name] = binding_documentation; // collect policies for the service and endpoints if ((*port).wsp__Policy_) service->policy.push_back((*port).wsp__Policy_); if ((*port).wsp__PolicyReference_ && (*port).wsp__PolicyReference_->policyPtr()) service->policy.push_back((*port).wsp__PolicyReference_->policyPtr()); } } } Operation *op = new Operation(); op->operation = wsdl__operation_; op->input_name = NULL; op->input = NULL; op->name = types.aname(NULL, NULL, wsdl__operation_->name); op->prefix = prefix; op->URI = urienc(definitions.soap, URI); op->style = soap__operation_style; op->mep = soap__operation_mep; if (soap__binding_transport && (!strcmp(soap__binding_transport+strlen(soap__binding_transport)-4, "http") || !strcmp(soap__binding_transport+strlen(soap__binding_transport)-5, "HTTP/"))) { if ((op->mep && strstr(op->mep, "soap-response")) || (http_method && !strcmp(http_method, "GET"))) op->protocol = "SOAP-GET"; else if (version == 1) op->protocol = "SOAP1.1"; else if (version == 2) op->protocol = "SOAP1.2"; else op->protocol = "SOAP"; } else { if (http_method) op->protocol = http_method; else op->protocol = "HTTP"; } op->documentation = wsdl__operation_->documentation; op->operation_documentation = (*operation).documentation; op->parameterOrder = wsdl__operation_->parameterOrder; if (http__operation_location) op->action = http__operation_location; // TODO: for now, store HTTP location in action else { op->action = soap__operation_action; if ((*operation).soap__operation_) { if ((*operation).soap__operation_->soapActionRequired) op->action = (*operation).soap__operation_->soapAction; } else if (version != 2) op->action = ""; } if (operation_policy) op->policy.push_back(operation_policy); if (ext_operation_policy) op->policy.push_back(ext_operation_policy); op->output = new Message(); // one-way output operation op->output->name = wsdl__operation_->name; // RPC uses operation/@name if (output_body && soap__operation_style == rpc && !output_body->namespace_) { op->output->URI = ""; fprintf(stderr, "\nError: no soap:body namespace attribute\n"); } else if (output_body) op->output->URI = urienc(definitions.soap, output_body->namespace_); else op->output->URI = service->URI; op->output->style = soap__operation_style; if (output_body) { op->output->use = output_body->use; op->output->encodingStyle = output_body->encodingStyle; } if (output->wsa__Action) op->output->action = output->wsa__Action; else if (output->wsam__Action) op->output->action = output->wsam__Action; else if (op->action) op->output->action = op->action; else if (definitions.targetNamespace && (*binding).portTypePtr() && (*binding).portTypePtr()->name) { const char *name = output->name ? output->name : op->name; size_t l = strlen(definitions.targetNamespace) + strlen((*binding).portTypePtr()->name) + strlen(name); char *tmp = (char*)soap_malloc(definitions.soap, l + 3); if (tmp) { (SOAP_SNPRINTF(tmp, l + 3, l + 2), "%s/%s/%s", definitions.targetNamespace, (*binding).portTypePtr()->name, name); op->output->action = tmp; } } op->output->message = output->messagePtr(); op->output->element = output->elementPtr(); op->output->part = NULL; op->output->mustUnderstand = false; op->output->multipartRelated = NULL; op->output->content = output_mime_content; op->output->body_parts = NULL; op->output->layout = NULL; op->output->ext_documentation = NULL; if (ext_output) { op->output->multipartRelated = ext_output->mime__multipartRelated_; if (ext_output->mime__multipartRelated_ && !ext_output->mime__multipartRelated_->part.empty()) op->output->header = ext_output->mime__multipartRelated_->part.front().soap__header_; else if (!ext_output->soap__header_.empty()) op->output->header = ext_output->soap__header_; else if (!ext_output->wsoap__header_.empty()) op->output->wheader = ext_output->wsoap__header_; if (ext_output->mime__multipartRelated_ && !ext_output->mime__multipartRelated_->part.empty() && ext_output->mime__multipartRelated_->part.front().soap__body_) op->output->body_parts = ext_output->mime__multipartRelated_->part.front().soap__body_->parts; else if (output_body) op->output->body_parts = output_body->parts; if (ext_output->dime__message_) op->output->layout = ext_output->dime__message_->layout; else op->output->layout = NULL; op->output->ext_documentation = ext_output->documentation; } op->output->documentation = output->documentation; // collect output message policies if (op->output->message) { for (vector::const_iterator p = op->output->message->wsp__Policy_.begin(); p != op->output->message->wsp__Policy_.end(); ++p) op->output->policy.push_back(&(*p)); for (vector::const_iterator r = op->output->message->wsp__PolicyReference_.begin(); r != op->output->message->wsp__PolicyReference_.end(); ++r) op->output->policy.push_back((*r).policyPtr()); } if (output->wsp__Policy_) op->output->policy.push_back(output->wsp__Policy_); if (output->wsp__PolicyReference_ && output->wsp__PolicyReference_->policyPtr()) op->output->policy.push_back(output->wsp__PolicyReference_->policyPtr()); if (ext_output) { if (ext_output->wsp__Policy_) op->output->policy.push_back(ext_output->wsp__Policy_); if (ext_output->wsp__PolicyReference_ && ext_output->wsp__PolicyReference_->policyPtr()) op->output->policy.push_back(ext_output->wsp__PolicyReference_->policyPtr()); } if (soap__operation_style == document) op->input_name = types.oname("__", op->URI, op->output->name); else op->input_name = types.oname(NULL, op->output->URI, op->output->name); size_t l = strlen(op->output->name); char *s = (char*)soap_malloc(definitions.soap, l + 9); if (s) { (SOAP_SNPRINTF(s, l + 9, l + 8), "%sResponse", op->output->name); if (soap__operation_style == document) op->output_name = types.oname("__", op->URI, s); else op->output_name = types.oname(NULL, op->output->URI, s); } analyze_headers(definitions, service, ext_input, ext_output); analyze_faults(definitions, service, op, operation); service->operation.push_back(op); } else { if (!Wflag) fprintf(stderr, "\nWarning: no SOAP RPC operation namespace, operations will be ignored\n"); } } else fprintf(stderr, "\nError: no wsdl:definitions/binding/operation/output\n"); } else fprintf(stderr, "\nError: no wsdl:definitions/portType/operation/input and output\n"); } else fprintf(stderr, "\nError: no wsdl:definitions/portType/operation\n"); } } } } void Definitions::analyze_headers(const wsdl__definitions& definitions, Service *service, wsdl__ext_ioput *ext_input, wsdl__ext_ioput *ext_output) { // collect input headers and headerfaults if (ext_input) { const vector *soap__header_ = NULL; // check if soap header is in mime:multipartRelated if (ext_input->mime__multipartRelated_) { for (vector::const_iterator part = ext_input->mime__multipartRelated_->part.begin(); part != ext_input->mime__multipartRelated_->part.end(); ++part) if (!(*part).soap__header_.empty()) { soap__header_ = &(*part).soap__header_; break; } } if (!soap__header_) soap__header_ = &ext_input->soap__header_; for (vector::const_iterator header = soap__header_->begin(); header != soap__header_->end(); ++header) { Message *h = new Message(); h->message = (*header).messagePtr(); h->element = NULL; h->body_parts = NULL; h->part = (*header).partPtr(); if ((*header).namespace_) h->URI = urienc(definitions.soap, (*header).namespace_); else h->URI = service->URI; if (h->part && h->part->element) h->name = types.aname(NULL, NULL, h->part->element); else if (h->URI && h->part && h->part->name && h->part->type) h->name = types.aname(NULL, h->URI, h->part->name); else { fprintf(stderr, "\nError in SOAP Header part definition: input part \"%s\" missing?\n", h->part && h->part->name ? h->part->name : "?"); h->name = ""; } h->encodingStyle = (*header).encodingStyle; h->style = document; // irrelevant h->use = (*header).use; h->mustUnderstand = true; h->multipartRelated = NULL; h->content = NULL; h->layout = NULL; h->ext_documentation = NULL; // TODO: may wanto to add document content h->documentation = NULL; // TODO: may wanto to add document content service->header[h->name] = h; for (vector::const_iterator headerfault = (*header).headerfault.begin(); headerfault != (*header).headerfault.end(); ++headerfault) { // TODO: headerfault processing. This is practically never used...! } } for (vector::const_iterator wheader = ext_input->wsoap__header_.begin(); wheader != ext_input->wsoap__header_.end(); ++wheader) { Message *h = new Message(); h->message = NULL; h->element = (*wheader).elementPtr(); h->body_parts = NULL; h->part = NULL; h->URI = NULL; h->mustUnderstand = (*wheader).mustUnderstand_; h->name = types.aname(NULL, NULL, (*wheader).element); h->encodingStyle = NULL; h->style = document; // irrelevant h->use = literal; h->multipartRelated = NULL; h->content = NULL; h->layout = NULL; h->ext_documentation = NULL; // TODO: may want to add document content h->documentation = NULL; // TODO: may want to add document content service->header[h->name] = h; } } // collect output headers and headerfaults if (ext_output) { const vector *soap__header_ = NULL; // check if soap header is in mime:multipartRelated if (ext_output->mime__multipartRelated_) { for (vector::const_iterator part = ext_output->mime__multipartRelated_->part.begin(); part != ext_output->mime__multipartRelated_->part.end(); ++part) if (!(*part).soap__header_.empty()) { soap__header_ = &(*part).soap__header_; break; } } if (!soap__header_) soap__header_ = &ext_output->soap__header_; for (vector::const_iterator header = soap__header_->begin(); header != soap__header_->end(); ++header) { Message *h = new Message(); h->message = (*header).messagePtr(); h->element = NULL; h->body_parts = NULL; h->part = (*header).partPtr(); h->URI = urienc(definitions.soap, (*header).namespace_); if (h->part && h->part->element) h->name = types.aname(NULL, NULL, h->part->element); else if (h->URI && h->part && h->part->name && h->part->type) h->name = types.aname(NULL, h->URI, h->part->name); else { fprintf(stderr, "\nError in SOAP Header part definition: output part \"%s\" missing?\n", h->part && h->part->name ? h->part->name : "?"); h->name = ""; } h->encodingStyle = (*header).encodingStyle; h->style = document; // irrelevant h->use = (*header).use; h->mustUnderstand = false; h->multipartRelated = NULL; h->content = NULL; h->layout = NULL; h->ext_documentation = NULL; // TODO: may want to add document content h->documentation = NULL; // TODO: may want to add document content service->header[h->name] = h; for (vector::const_iterator headerfault = (*header).headerfault.begin(); headerfault != (*header).headerfault.end(); ++headerfault) { // TODO: headerfault processing. This is practically never used...! } } for (vector::const_iterator wheader = ext_output->wsoap__header_.begin(); wheader != ext_output->wsoap__header_.end(); ++wheader) { Message *h = new Message(); h->message = NULL; h->element = (*wheader).elementPtr(); h->body_parts = NULL; h->part = NULL; h->URI = NULL; h->mustUnderstand = (*wheader).mustUnderstand_; h->name = types.aname(NULL, NULL, (*wheader).element); h->encodingStyle = NULL; h->style = document; // irrelevant h->use = literal; h->multipartRelated = NULL; h->content = NULL; h->layout = NULL; h->ext_documentation = NULL; // TODO: may want to add document content h->documentation = NULL; // TODO: may want to add document content service->header[h->name] = h; } } } void Definitions::analyze_faults(const wsdl__definitions& definitions, Service *service, Operation *op, vector::const_iterator& operation) { for (vector::const_iterator fault = (*operation).fault.begin(); fault != (*operation).fault.end(); ++fault) { Message *f = analyze_fault(definitions, service, *fault); if (f) { op->outfault.push_back(f); service->fault[f->name] = f; } } for (vector::const_iterator infault = (*operation).infault.begin(); infault != (*operation).infault.end(); ++infault) { Message *f = analyze_fault(definitions, service, *infault); if (f) { op->infault.push_back(f); service->fault[f->name] = f; } } for (vector::const_iterator outfault = (*operation).outfault.begin(); outfault != (*operation).outfault.end(); ++outfault) { Message *f = analyze_fault(definitions, service, *outfault); if (f) { op->outfault.push_back(f); service->fault[f->name] = f; } } } Message *Definitions::analyze_fault(const wsdl__definitions& definitions, Service *service, const wsdl__ext_fault& ext_fault) { Message *f = NULL; const wsdl__fault *fault = ext_fault.faultPtr(); if (fault && (fault->messagePtr() || fault->elementPtr())) { f = new Message(); f->message = fault->messagePtr(); f->element = fault->elementPtr(); f->body_parts = NULL; f->part = NULL; f->encodingStyle = NULL; if (ext_fault.soap__fault_) f->encodingStyle = ext_fault.soap__fault_->encodingStyle; f->action = NULL; if (fault->wsa__Action) f->action = fault->wsa__Action; else f->action = fault->wsam__Action; if (f->element && f->element->schemaPtr()) f->URI = urienc(definitions.soap, f->element->schemaPtr()->targetNamespace); else if (ext_fault.soap__fault_ && ext_fault.soap__fault_->namespace_) f->URI = urienc(definitions.soap, ext_fault.soap__fault_->namespace_); else f->URI = service->URI; // must have a unique URI f->style = document; // irrelevant f->use = literal; if (ext_fault.soap__fault_) f->use = ext_fault.soap__fault_->use; if (ext_fault.wsoap__code) { size_t l = strlen(ext_fault.wsoap__code); if (ext_fault.wsoap__subcodes) l += strlen(ext_fault.wsoap__subcodes); char *s = (char*)soap_malloc(definitions.soap, l + 40); if (s) { (SOAP_SNPRINTF(s, l + 40, l + 19), "\"%s\" with subcodes \"%s\"", ext_fault.wsoap__code, ext_fault.wsoap__subcodes ? ext_fault.wsoap__subcodes : ""); f->body_parts = s; } } else f->ext_documentation = ext_fault.documentation; f->mustUnderstand = false; f->multipartRelated = NULL; f->content = NULL; f->layout = NULL; if (f->message) { f->name = types.aname("_", f->URI, f->message->name); f->documentation = f->message->documentation; } else { f->name = types.aname(NULL, f->URI, fault->element); f->documentation = fault->documentation; } // collect fault message policies if (fault->wsp__Policy_) f->policy.push_back(fault->wsp__Policy_); if (fault->wsp__PolicyReference_ && fault->wsp__PolicyReference_->policyPtr()) f->policy.push_back(fault->wsp__PolicyReference_->policyPtr()); if (ext_fault.wsp__Policy_) f->policy.push_back(ext_fault.wsp__Policy_); if (ext_fault.wsp__PolicyReference_ && ext_fault.wsp__PolicyReference_->policyPtr()) f->policy.push_back(ext_fault.wsp__PolicyReference_->policyPtr()); } else if (ext_fault.soap__fault_ && ext_fault.soap__fault_->name) fprintf(stderr, "\nError: no wsdl:definitions/binding/operation/fault/soap:fault \"%s\"\n", ext_fault.soap__fault_->name); else fprintf(stderr, "\nError: no wsdl:definitions/binding/operation/fault/soap:fault\n"); return f; } void Definitions::compile(const wsdl__definitions& definitions) { // compile the definitions and generate gSOAP header file const char *defs; if (definitions.name) defs = types.aname(NULL, NULL, definitions.name); else defs = "Service"; ident(); fprintf(stream, "/** @page page_notes Notes\n\n@note HINTS:\n - Run soapcpp2 on %s to generate the SOAP/XML processing logic.\n Use soapcpp2 -I to specify paths for #import\n To build with STL, 'stlvector.h' is imported from 'import' dir in package.\n Use soapcpp2 -j to generate improved proxy and server classes.\n - Use wsdl2h -c and -s to generate pure C code or C++ code without STL.\n - Use 'typemap.dat' to control namespace bindings and type mappings.\n It is strongly recommended to customize the names of the namespace prefixes\n generated by wsdl2h. To do so, modify the prefix bindings in the Namespaces\n section below and add the modified lines to 'typemap.dat' to rerun wsdl2h.\n - Use Doxygen (www.doxygen.org) on this file to generate documentation.\n - Use wsdl2h -R to generate REST operations.\n - Use wsdl2h -nname to use name as the base namespace prefix instead of 'ns'.\n - Use wsdl2h -Nname for service prefix and produce multiple service bindings\n - Use wsdl2h -d to enable DOM support for xsd:anyType.\n - Use wsdl2h -g to auto-generate readers and writers for root elements.\n - Use wsdl2h -b to auto-generate bi-directional operations (duplex ops).\n - Use wsdl2h -U to map XML names to C++ Unicode identifiers instead of _xNNNN.\n - Use wsdl2h -u to disable the generation of unions.\n - Struct/class members serialized as XML attributes are annotated with a '@'.\n - Struct/class members that have a special role are annotated with a '$'.\n\n@warning\n DO NOT INCLUDE THIS ANNOTATED FILE DIRECTLY IN YOUR PROJECT SOURCE CODE.\n USE THE FILES GENERATED BY soapcpp2 FOR YOUR PROJECT'S SOURCE CODE:\n THE soapStub.h FILE CONTAINS THIS CONTENT WITHOUT ANNOTATIONS.\n\n", outfile ? outfile : "this file"); fprintf(stream, "@copyright LICENSE:\n@verbatim\n%s@endverbatim\n\n*/\n\n", licensenotice); // gsoap compiler options: 'w' disables WSDL/schema output to avoid file collisions if (cflag) fprintf(stream, "\n//gsoapopt c,w\n"); else if (c11flag) fprintf(stream, "\n//gsoapopt c++11,w\n"); else fprintf(stream, "\n//gsoapopt c++,w\n"); banner("Definitions", definitions.targetNamespace ? definitions.targetNamespace : "targetNamespace"); // copy documentation from WSDL definitions if (definitions.documentation) { fprintf(stream, "/* WSDL Documentation:\n\n"); text(definitions.documentation); fprintf(stream, "*/\n\n"); } if (definitions.version) { banner("Version", definitions.version); fprintf(stream, "#define SOAP_WSDL_VERSION \"%s\"\n", definitions.version); } if (!cflag) { const char *s; if (!sflag) { s = types.vname("$CONTAINER"); if (s && *s != '*' && *s != '$') { banner("$CONTAINER", s); fprintf(stream, "template class %s;\n", s); } } s = types.vname("$POINTER"); if (s && *s != '*' && *s != '$') { banner("$POINTER", s); fprintf(stream, "volatile template class %s;\n", s); } } banner("Import"); if (!cflag && !sflag) { fprintf(stream, "#import \"stl.h\"\t// enable STL containers when used (option -s removes STL dependency)\n"); } if (dflag) { fprintf(stream, "\n// dom.h declares the DOM xsd__anyType object (compiler and link with dom.cpp)\n"); fprintf(stream, "#import \"dom.h\"\n"); } if (mflag) { fprintf(stream, "#import \""); fprintf(stream, "xsd.h\"\t// import primitive XSD types.\n"); } for (SetOfString::const_iterator u = exturis.begin(); u != exturis.end(); ++u) { bool found = false; size_t n = strlen(*u); for (SetOfString::const_iterator i = definitions.builtinTypes().begin(); i != definitions.builtinTypes().end(); ++i) { if (**i == '"' && !strncmp(*u, *i + 1, n) && (*i)[n+1] == '"') { found = true; break; } } if (!found) { for (SetOfString::const_iterator j = definitions.builtinElements().begin(); j != definitions.builtinElements().end(); ++j) { if (**j == '"' && !strncmp(*u, *j + 1, n) && (*j)[n+1] == '"') { found = true; break; } } } if (!found) { for (SetOfString::const_iterator k = definitions.builtinAttributes().begin(); k != definitions.builtinAttributes().end(); ++k) { if (**k == '"' && !strncmp(*u, *k + 1, n) && (*k)[n+1] == '"') { found = true; break; } } } if (found) { if (vflag) fprintf(stderr, "import %s\n", *u); fprintf(stream, "#import \"%s.h\"\t// %s = <%s>\n", types.nsprefix(NULL, *u), types.nsprefix(NULL, *u), *u); } } banner("Schema Namespaces"); // Determine if bindings use SOAP 1.2 soap12 = false; for (Namespace *p = definitions.soap->local_namespaces; p && p->id; p++) { if (p->out && !strcmp(p->id, "soap") && !strcmp(p->out, "http://schemas.xmlsoap.org/wsdl/soap12/")) { soap12 = true; break; } } if (!soap12) { for (vector::const_iterator i = definitions.import.begin(); i != definitions.import.end(); ++i) { if ((*i).definitionsPtr()) { for (Namespace *p = (*i).definitionsPtr()->soap->local_namespaces; p && p->id; p++) { if (p->out && !strcmp(p->id, "soap") && !strcmp(p->out, "http://schemas.xmlsoap.org/wsdl/soap12/")) { soap12 = true; break; } } } if (soap12) break; } } if (definitions.types) { fprintf(stream, "\n/* NOTE:\n\nIt is strongly recommended to customize the names of the namespace prefixes\ngenerated by wsdl2h. To do so, modify the prefix bindings below and add the\nmodified lines to typemap.dat to rerun wsdl2h:\n\n"); if (definitions.targetNamespace && *definitions.targetNamespace) fprintf(stream, "%s = \"%s\"\n", types.nsprefix(service_prefix, definitions.targetNamespace), definitions.targetNamespace); for (vector::const_iterator schema1 = definitions.types->xs__schema_.begin(); schema1 != definitions.types->xs__schema_.end(); ++schema1) if ((*schema1)->targetNamespace && *(*schema1)->targetNamespace && (!definitions.targetNamespace || strcmp((*schema1)->targetNamespace, definitions.targetNamespace))) fprintf(stream, "%s = \"%s\"\n", types.nsprefix(NULL, (*schema1)->targetNamespace), (*schema1)->targetNamespace); fprintf(stream, "\n*/\n"); for (vector::const_iterator schema2 = definitions.types->xs__schema_.begin(); schema2 != definitions.types->xs__schema_.end(); ++schema2) { const char *t = types.nsprefix(NULL, (*schema2)->targetNamespace); if (t) { fprintf(stream, "\n"); types.document((*schema2)->annotation); fprintf(stream, "#define SOAP_NAMESPACE_OF_%s\t\"%s\"\n", types.aname(NULL, NULL, t), urienc(definitions.soap, (*schema2)->targetNamespace)); fprintf(stream, schemaformat, t, "namespace", urienc(definitions.soap, (*schema2)->targetNamespace)); if ((*schema2)->elementFormDefault == (*schema2)->attributeFormDefault) fprintf(stream, schemaformat, t, "form", (*schema2)->elementFormDefault == qualified ? "qualified" : "unqualified"); else { fprintf(stream, schemaformat, t, "elementForm", (*schema2)->elementFormDefault == qualified ? "qualified" : "unqualified"); fprintf(stream, schemaformat, t, "attributeForm", (*schema2)->attributeFormDefault == qualified ? "qualified" : "unqualified"); } } } } // generate the prototypes first: these should allow use before def, e.g. class names then generate the defs // check if xsd:anyType is used if (!cflag && !pflag) { for (SetOfString::const_iterator i = definitions.builtinTypes().begin(); i != definitions.builtinTypes().end(); ++i) { if (!cflag && !strcmp(*i, "xs:anyType")) { pflag = 1; break; } } } // produce built-in primitive types, limited to the ones that are used only banner("Built-in Schema Types and Top-Level Elements and Attributes"); // define xsd:anyType first, if used if (!cflag && !dflag && pflag) { const char *s, *t; t = types.cname(NULL, NULL, "xs:anyType"); s = types.deftypemap[t]; if (s) { if (*s) { if (!mflag) fprintf(stream, "/// Built-in XSD type \"xs:anyType\".\n%s\n\n", s); } s = types.usetypemap[t]; if (s) { if (mflag) fprintf(stream, "// xsd.h: should define type %s\n\n", s); types.knames.insert(s); } } else { fprintf(stderr, "\nError: no xsd__anyType defined in type map\n"); pflag = 0; } } if (Pflag) pflag = 0; if (vflag) fprintf(stderr, "\nGenerating built-in types\n"); for (SetOfString::const_iterator i = definitions.builtinTypes().begin(); i != definitions.builtinTypes().end(); ++i) { const char *s, *t; if (!cflag && !strcmp(*i, "xs:anyType")) continue; t = types.cname(NULL, NULL, *i); s = types.deftypemap[t]; if (s) { if (*s) { if (**i == '"') fprintf(stream, "/// Imported XSD type \"%s\" from typemap \"%s\".\n", *i, mapfile ? mapfile : ""); else fprintf(stream, "/// Built-in XSD type \"%s\".\n", *i); if (mflag) fprintf(stream, "// (declaration of %s removed by option -m)\n\n", t); else if (!iflag && !imported(*i)) { types.format(s); fprintf(stream, "\n"); } } s = types.usetypemap[t]; if (s && *s) { if (mflag && **i != '"') fprintf(stream, "// xsd.h: typemap override of XSD type %s with %s\n\n", t, s); if (types.knames.find(s) == types.knames.end()) types.knames.insert(s); } } } for (SetOfString::const_iterator i = definitions.builtinTypes().begin(); i != definitions.builtinTypes().end(); ++i) { const char *s, *t; if (!cflag && !strcmp(*i, "xs:anyType")) continue; t = types.cname(NULL, NULL, *i); s = types.deftypemap[t]; if (!s) { if (!mflag) { if (**i == '"') fprintf(stream, "// Imported XSD type \"%s\" defined by %s.\n", *i, t); else if (!iflag) { s = types.tname(NULL, NULL, "xsd:string"); fprintf(stream, "/// Primitive built-in type \"%s\".\n", *i); fprintf(stream, "typedef %s %s;\n\n", s, t); types.deftname(TYPEDEF, false, types.is_ptr(NULL, NULL, "xsd:string"), NULL, NULL, *i); const char *u = types.uri(*i); if (u && !types.uris[u]) { fprintf(stream, schemaformat, types.nsprefix(types.prefix(*i), u), "namespace", u); fprintf(stream, "\n"); } } } else if (**i == '"') fprintf(stream, "// Imported XSD type \"%s\" defined by %s.\n", *i, t); else fprintf(stream, "// xsd.h: should define type %s\n", t); types.deftname(TYPEDEF, false, false, NULL, NULL, *i); } if (pflag && !strncmp(*i, "xs:", 3)) // only xsi types are polymorph { s = types.aname(NULL, NULL, *i); if (!mflag) { fprintf(stream, "/// Class wrapper for built-in type \"%s\" derived from xsd__anyType.\n/// Use virtual method soap_type() == SOAP_TYPE_%s to check runtime type (see soapStub.h).\n", *i, s); fprintf(stream, "class %s : public xsd__anyType\n{ public:\n", s); fprintf(stream, elementformat, types.tname(NULL, NULL, *i), "__item;"); fprintf(stream, "\n};\n\n"); } types.knames.insert(s); } } // produce built-in primitive elements, limited to the ones that are used only if (vflag) fprintf(stderr, "\nGenerating built-in elements\n"); for (SetOfString::const_iterator j = definitions.builtinElements().begin(); j != definitions.builtinElements().end(); ++j) { const char *s, *t; t = types.cname("_", NULL, *j); s = types.deftypemap[t]; if (s) { if (*s) { if (**j == '"') fprintf(stream, "/// Imported element \"%s\" from typemap \"%s\".\n", *j, mapfile ? mapfile : ""); else fprintf(stream, "/// Built-in element \"%s\".\n", *j); if (mflag) fprintf(stream, "// (declaration of %s removed by option -m)\n\n", t); else if (!iflag && !imported(*j)) { types.format(s); fprintf(stream, "\n"); } } s = types.usetypemap[t]; if (s && *s) { if (mflag && **j != '"') fprintf(stream, "// xsd.h: typemap override of element %s with %s\n\n", t, s); if (types.knames.find(s) == types.knames.end()) types.knames.insert(s); } } else { if (!mflag) { if (**j == '"') fprintf(stream, "// Imported element \"%s\" declared as %s.\n", *j, t); else if (!iflag && !imported(*j)) { s = types.tname(NULL, NULL, "xsd:any"); fprintf(stream, "/// Built-in element \"%s\".\n", *j); fprintf(stream, "typedef %s %s;\n\n", s, t); types.deftname(TYPEDEF, false, true, "_", NULL, *j); // already pointer const char *u = types.uri(*j); if (u && !types.uris[u]) { fprintf(stream, schemaformat, types.nsprefix(types.prefix(*j), u), "namespace", u); fprintf(stream, "\n"); } } } else if (**j == '"') fprintf(stream, "// Imported element \"%s\" declared as %s.\n\n", *j, t); else fprintf(stream, "// xsd.h: should define element %s\n\n", t); types.deftname(TYPEDEF, false, false, "_", NULL, *j); } } // produce built-in primitive attributes, limited to the ones that are used only if (vflag) fprintf(stderr, "\nGenerating built-in attributes\n"); for (SetOfString::const_iterator k = definitions.builtinAttributes().begin(); k != definitions.builtinAttributes().end(); ++k) { const char *s, *t; t = types.cname("_", NULL, *k); s = types.deftypemap[t]; if (s) { if (*s) { if (**k == '"') fprintf(stream, "/// Imported attribute \"%s\" from typemap \"%s\".\n", *k, mapfile ? mapfile : ""); else fprintf(stream, "/// Built-in attribute \"%s\".\n", *k); if (mflag) fprintf(stream, "// (declaration of %s removed by option -m)\n\n", t); else if (!iflag && !imported(*k)) { types.format(s); fprintf(stream, "\n"); } } s = types.usetypemap[t]; if (s && *s) { if (mflag && **k != '"') fprintf(stream, "// xsd.h: typemap override of attribute %s with %s\n\n", t, s); if (types.knames.find(s) == types.knames.end()) types.knames.insert(s); } } else { s = types.tname(NULL, NULL, "xsd:string"); if (!mflag) { if (**k == '"') fprintf(stream, "// Imported attribute \"%s\" declared as %s.\n", *k, t); else if (!iflag && !imported(*k)) { fprintf(stream, "/// Built-in attribute \"%s\".\n", *k); fprintf(stream, "typedef %s %s;\n\n", s, t); const char *u = types.uri(*k); if (u && !types.uris[u]) { fprintf(stream, schemaformat, types.nsprefix(types.prefix(*k), u), "namespace", u); fprintf(stream, "\n"); } } } else if (**k == '"') fprintf(stream, "// Imported attribute \"%s\" declared as %s.\n\n", *k, t); else fprintf(stream, "// xsd.h: should define attribute %s\n\n", t); types.deftname(TYPEDEF, false, types.is_ptr(NULL, NULL, "xsd:string"), "_", NULL, *k); } } // produce types // define class/struct types first if (!cflag) banner("Forward Declarations"); if (definitions.types) { comment("Definitions", defs, "types", definitions.types->documentation); fprintf(stream, "\n"); for (vector::const_iterator schema4 = definitions.types->xs__schema_.begin(); schema4 != definitions.types->xs__schema_.end(); ++schema4) { if (vflag) fprintf(stderr, "\nDefining types in %s\n", (*schema4)->targetNamespace); for (vector::const_iterator complexType = (*schema4)->complexType.begin(); complexType != (*schema4)->complexType.end(); ++complexType) types.define((*schema4)->targetNamespace, NULL, *complexType); if (vflag) fprintf(stderr, "\nDefining elements in %s\n", (*schema4)->targetNamespace); for (vector::const_iterator element = (*schema4)->element.begin(); element != (*schema4)->element.end(); ++element) { if (!(*element).type && !(*element).abstract) { if ((*element).complexTypePtr()) types.define((*schema4)->targetNamespace, (*element).name, *(*element).complexTypePtr()); else if (!(*element).simpleTypePtr()) { fprintf(stream, "/// @brief Top-level root element \"%s\":%s.\n", (*schema4)->targetNamespace, (*element).name); if (gflag) { const char *t = types.deftname(TYPEDEF, false, false, "_", (*schema4)->targetNamespace, (*element).name); if (t) fprintf(stream, "typedef _XML %s;\n\n", t); else fprintf(stream, "// Element definition intentionally left blank.\n\n"); types.ptrtypemap[t] = types.usetypemap[t] = "_XML"; } else { const char *s = types.cname("_", (*schema4)->targetNamespace, (*element).name); types.ptrtypemap[s] = types.usetypemap[s] = "_XML"; fprintf(stream, "/// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code.\n\n"); } } } } } // visit types with lowest base level first int baseLevel = 1; bool found; do { found = (baseLevel == 1); for (vector::iterator schema = definitions.types->xs__schema_.begin(); schema != definitions.types->xs__schema_.end(); ++schema) { if (found) banner("Schema Types and Top-Level Elements and Attributes", (*schema)->targetNamespace); for (vector::iterator simpleType = (*schema)->simpleType.begin(); simpleType != (*schema)->simpleType.end(); ++simpleType) { if ((*simpleType).baseLevel() == baseLevel) { found = true; types.gen((*schema)->targetNamespace, NULL, *simpleType, false, false); } } for (vector::iterator element = (*schema)->element.begin(); element != (*schema)->element.end(); ++element) { if (!(*element).type && (*element).simpleTypePtr() && (*element).simpleTypePtr()->baseLevel() == baseLevel) { found = true; if ((*element).type) fprintf(stream, "/// @brief Top-level root element \"%s\":%s of simpleType %s.\n", (*schema)->targetNamespace, (*element).name, (*element).type); types.document((*element).annotation); types.gen((*schema)->targetNamespace, (*element).name, *(*element).simpleTypePtr(), false, false); } if (!(*element).type && (*element).complexTypePtr() && (*element).complexTypePtr()->baseLevel() == baseLevel) found = true; } for (vector::const_iterator attribute = (*schema)->attribute.begin(); attribute != (*schema)->attribute.end(); ++attribute) { if (!(*attribute).type && (*attribute).simpleTypePtr() && (*attribute).simpleTypePtr()->baseLevel() == baseLevel) { found = true; if ((*attribute).type) fprintf(stream, "/// @brief Top-level attribute \"%s\":%s of simpleType %s.\n", (*schema)->targetNamespace, (*attribute).name, (*attribute).type); types.document((*attribute).annotation); types.gen((*schema)->targetNamespace, (*attribute).name, *(*attribute).simpleTypePtr(), false, false); // URI = NULL won't generate type in schema (type without namespace qualifier) } } for (vector::iterator complexType = (*schema)->complexType.begin(); complexType != (*schema)->complexType.end(); ++complexType) { if ((*complexType).baseLevel() == baseLevel) found = true; } } ++baseLevel; } while (found); // generate complex type defs. Problem: what if a simpleType restriction/extension depends on a complexType simpleContent restriction/extension? int maxLevel = baseLevel; for (baseLevel = 1; baseLevel < maxLevel; ++baseLevel) { for (vector::iterator schema = definitions.types->xs__schema_.begin(); schema != definitions.types->xs__schema_.end(); ++schema) { if (baseLevel == 1) banner("Schema Complex Types and Top-Level Elements", (*schema)->targetNamespace); for (vector::iterator complexType = (*schema)->complexType.begin(); complexType != (*schema)->complexType.end(); ++complexType) { if ((*complexType).baseLevel() == baseLevel) types.gen((*schema)->targetNamespace, NULL, *complexType, false); } for (vector::iterator element = (*schema)->element.begin(); element != (*schema)->element.end(); ++element) { if (!(*element).type && (*element).complexTypePtr() && (*element).complexTypePtr()->baseLevel() == baseLevel) { fprintf(stream, "/// @brief Top-level root element \"%s\":%s\n", (*schema)->targetNamespace, (*element).name); types.document((*element).annotation); types.gen((*schema)->targetNamespace, (*element).name, *(*element).complexTypePtr(), false); } } } } for (vector::iterator schema = definitions.types->xs__schema_.begin(); schema != definitions.types->xs__schema_.end(); ++schema) { for (vector::iterator simpleType = (*schema)->simpleType.begin(); simpleType != (*schema)->simpleType.end(); ++simpleType) { if ((*simpleType).baseLevel() <= 0) { const char *t = types.deftname(TYPEDEF, false, false, NULL, (*schema)->targetNamespace, (*simpleType).name); fprintf(stderr, "\nError: circular restriction/extension \n", (*simpleType).name ? (*simpleType).name : ""); fprintf(stream, "\n/// @todo !FIXME! @warning %s is a simpleType with circular restriction/extension.\n", (*simpleType).name ? (*simpleType).name : ""); fprintf(stream, "typedef _XML %s;\n\n", t); types.ptrtypemap[t] = types.usetypemap[t] = "_XML"; } } for (vector::iterator complexType = (*schema)->complexType.begin(); complexType != (*schema)->complexType.end(); ++complexType) { if ((*complexType).baseLevel() <= 0) { fprintf(stderr, "\nError: circular restriction/extension \n", (*complexType).name ? (*complexType).name : ""); fprintf(stream, "\n\n/// @todo !FIXME! @warning %s is a complexType with circular restriction/extension.\n", (*complexType).name ? (*complexType).name : ""); if (cflag) fprintf(stream, "struct %s { };\n\n", types.cname(NULL, (*schema)->targetNamespace, (*complexType).name)); else fprintf(stream, "class %s { };\n\n", types.cname(NULL, (*schema)->targetNamespace, (*complexType).name)); } } } // option to consider: generate local complexTypes iteratively /* for (MapOfStringToType::const_iterator local = types.locals.begin(); local != types.locals.end(); ++local) { types.gen(NULL, (*local).first, *(*local).second); } */ for (vector::iterator schema = definitions.types->xs__schema_.begin(); schema != definitions.types->xs__schema_.end(); ++schema) { if (vflag) fprintf(stderr, "\nGenerating elements in %s\n", (*schema)->targetNamespace); banner("Additional Top-Level Elements", (*schema)->targetNamespace); for (vector::iterator element = (*schema)->element.begin(); element != (*schema)->element.end(); ++element) { if ((*element).name && (*element).type && !(*element).abstract) { fprintf(stream, "/// @brief Top-level root element \"%s\":%s of XSD type %s.\n", (*schema)->targetNamespace, (*element).name, (*element).type); types.document((*element).annotation); if (!types.is_defined("_", (*schema)->targetNamespace, (*element).name)) { if (gflag) { const char *s = types.tnamenoptr(NULL, (*schema)->targetNamespace, (*element).type); const char *t = types.deftname(TYPEDEF, false, false, "_", (*schema)->targetNamespace, (*element).name); fprintf(stream, "typedef %s %s;\n\n", s, t); } else fprintf(stream, "/// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code.\n\n"); } else { const char *s = types.cname("_", (*schema)->targetNamespace, (*element).name); const char *t = types.deftypemap[s]; if (t && *t) { fprintf(stream, "/// Imported element \"%s\" from typemap \"%s\".\n", s, mapfile ? mapfile : ""); types.format(t); } else fprintf(stream, "// \"%s\" element definition intentionally left blank.\n", types.cname("_", (*schema)->targetNamespace, (*element).name)); } } } if (vflag) fprintf(stderr, "\nGenerating attributes in %s\n", (*schema)->targetNamespace); banner("Additional Top-Level Attributes", (*schema)->targetNamespace); for (vector::iterator attribute = (*schema)->attribute.begin(); attribute != (*schema)->attribute.end(); ++attribute) { if ((*attribute).name && (*attribute).type) { fprintf(stream, "/// @brief Top-level attribute \"%s\":%s of simpleType %s.\n", (*schema)->targetNamespace, (*attribute).name, (*attribute).type); types.document((*attribute).annotation); if (!types.is_defined("_", (*schema)->targetNamespace, (*attribute).name)) { if (gflag) { const char *s = types.tnamenoptr(NULL, (*schema)->targetNamespace, (*attribute).type); const char *t = types.deftname(TYPEDEF, false, false, "_", (*schema)->targetNamespace, (*attribute).name); fprintf(stream, "typedef %s %s;\n\n", s, t); } else fprintf(stream, "/// @note Use wsdl2h option -g to auto-generate a top-level attribute declaration and processing code.\n\n"); } else { const char *s = types.cname("_", (*schema)->targetNamespace, (*attribute).name); const char *t = types.deftypemap[s]; if (t && *t) { fprintf(stream, "/// Imported attribute \"%s\" from typemap \"%s\".\n", s, mapfile ? mapfile : ""); types.format(t); } else fprintf(stream, "// \"%s\" attribute definition intentionally left blank.\n", types.cname("_", (*schema)->targetNamespace, (*attribute).name)); } } } } } if (vflag) fprintf(stderr, "\nCollecting service bindings\n"); collect(definitions); if (!services.empty()) { banner("Services"); if (soap12) fprintf(stream, "// This service supports SOAP 1.2 namespaces:\n#import \"soap12.h\"\n"); for (MapOfStringToService::const_iterator service1 = services.begin(); service1 != services.end(); ++service1) { Service *sv = (*service1).second; if (sv && sv->prefix) { fprintf(stream, "\n"); if (sv->name) fprintf(stream, serviceformat, sv->prefix, "name", sv->name, ""); if (sv->type) fprintf(stream, serviceformat, sv->prefix, "type", sv->type, ""); for (SetOfString::const_iterator port = sv->location.begin(); port != sv->location.end(); ++port) fprintf(stream, serviceformat, sv->prefix, "port", (*port), ""); if (sv->URI) fprintf(stream, serviceformat, sv->prefix, "namespace", sv->URI, ""); if (sv->transport) fprintf(stream, serviceformat, sv->prefix, "transport", sv->transport, ""); } } fprintf(stream, "\n/** @mainpage %s Definitions\n", defs); if (definitions.version) { section(defs, "_version Version", NULL); text(definitions.version); } if (definitions.documentation) { section(defs, "_documentation Documentation", NULL); text(definitions.documentation); } if (definitions.types && definitions.types->documentation) { section(defs, "_types Schema Type Information", NULL); text(definitions.types->documentation); } section(defs, "_bindings Service Bindings", NULL); for (MapOfStringToService::const_iterator service2 = services.begin(); service2 != services.end(); ++service2) { Service *sv = (*service2).second; if (sv && sv->name) fprintf(stream, "\n - @ref %s\n", sv->name); } section(defs, "_more More Information", NULL); fprintf(stream, "\n - @ref page_notes \"Notes\"\n"); if (!definitions.vprop__property.empty()) fprintf(stream, "\n - @ref page_bpel \"BPEL 2.0 Variables\"\n"); fprintf(stream, "\n - @ref page_XMLDataBinding \"XML Data Binding\"\n"); if (!jflag) fprintf(stream, "\n - @ref SOAP_ENV__Header \"SOAP Header Content\" (when applicable)\n"); if (!jflag) fprintf(stream, "\n - @ref SOAP_ENV__Detail \"SOAP Fault Detail Content\" (when applicable)\n"); fprintf(stream, "\n\n*/\n"); for (MapOfStringToService::const_iterator service3 = services.begin(); service3 != services.end(); ++service3) { Service *sv = (*service3).second; if (sv && sv->name) { fprintf(stream, "\n/**\n"); page(sv->name, " Binding", sv->name); for (MapOfStringToString::const_iterator service_doc = sv->service_documentation.begin(); service_doc != sv->service_documentation.end(); ++service_doc) { const char *name = types.aname(NULL, NULL, (*service_doc).first); section(name, "_service Service Documentation", (*service_doc).first); text((*service_doc).second); } for (MapOfStringToString::const_iterator port_doc = sv->port_documentation.begin(); port_doc != sv->port_documentation.end(); ++port_doc) { const char *name = types.aname(NULL, NULL, (*port_doc).first); section(name, "_port Port Documentation", (*port_doc).first); text((*port_doc).second); } for (MapOfStringToString::const_iterator binding_doc = sv->binding_documentation.begin(); binding_doc != sv->binding_documentation.end(); ++binding_doc) { const char *name = types.aname(NULL, NULL, (*binding_doc).first); section(name, "_binding Binding Documentation", (*binding_doc).first); text((*binding_doc).second); } section(sv->name, "_operations Operations of Binding", sv->name); for (vector::const_iterator op = sv->operation.begin(); op != sv->operation.end(); ++op) { if (*op && (*op)->input && (*op)->input_name) fprintf(stream, "\n - @ref %s\n", (*op)->input_name); else if (*op && (*op)->output_name) fprintf(stream, "\n - @ref %s\n", (*op)->output_name); } if (!sv->role.empty()) { section(sv->name, "_plnk BPEL 2.0 Partner Links for Binding", sv->name); gen_plnk(*sv); } section(sv->name, "_ports Endpoints of Binding", sv->name); for (SetOfString::const_iterator port = sv->location.begin(); port != sv->location.end(); ++port) fprintf(stream, "\n - %s\n", *port); if (!sv->policy.empty()) { section(sv->name, "_policy Policy of Binding", sv->name); fprintf(stream, "\nSee Section @ref %s_policy_enablers\n", sv->name); gen_policy(*sv, sv->policy, "service endpoint ports", types); } if (!service_prefix) { if (binding_count > 1) fprintf(stream, "\n@note Multiple service bindings collected as one, use wsdl2h option -Nname to produce a separate service for each binding\n"); else fprintf(stream, "\n@note Use wsdl2h option -Nname to change the service binding prefix name\n"); } fprintf(stream, "\n\n*/\n"); } } } generate(); if (definitions.types) { gen_vprop(definitions, types); banner("XML Data Binding"); fprintf(stream, "\n/**\n"); page("page_XMLDataBinding", " XML Data Binding", NULL); fprintf(stream, "\nSOAP/XML services use data bindings contractually bound by WSDL and auto-\ngenerated by wsdl2h and soapcpp2 (see Service Bindings). Plain data bindings\nare adopted from XML schemas as part of the WSDL types section or when running\nwsdl2h on a set of schemas to produce non-SOAP-based XML data bindings.\n\nThe following readers and writers are C/C++ data type (de)serializers auto-\ngenerated by wsdl2h and soapcpp2. Run soapcpp2 on this file to generate the\n(de)serialization code, which is stored in soapC.c[pp]. Include \"soapH.h\" in\nyour code to import these data type and function declarations. Only use the\nsoapcpp2-generated files in your project build. Do not include the wsdl2h-\ngenerated .h file in your code.\n\nData can be read and deserialized from:\n - an int file descriptor, using soap->recvfd = fd\n - a socket, using soap->socket = (int)...\n - a C++ stream (istream, stringstream), using soap->is = (istream*)...\n - a C string, using soap->is = (const char*)...\n - any input, using the soap->frecv() callback\n\nData can be serialized and written to:\n - an int file descriptor, using soap->sendfd = (int)...\n - a socket, using soap->socket = (int)...\n - a C++ stream (ostream, stringstream), using soap->os = (ostream*)...\n - a C string, using soap->os = (const char**)...\n - any output, using the soap->fsend() callback\n\nThe following options are available for (de)serialization control:\n - soap->encodingStyle = NULL; to remove SOAP 1.1/1.2 encodingStyle\n - soap_mode(soap, SOAP_XML_TREE); XML without id-ref (no cycles!)\n - soap_mode(soap, SOAP_XML_GRAPH); XML with id-ref (including cycles)\n - soap_set_namespaces(soap, struct Namespace *nsmap); to set xmlns bindings\n\n"); for (vector::const_iterator schema5 = definitions.types->xs__schema_.begin(); schema5 != definitions.types->xs__schema_.end(); ++schema5) { const char *prefix = types.nsprefix(NULL, (*schema5)->targetNamespace); fprintf(stream, "\n@section %s Top-level root elements of schema \"%s\"\n", prefix ? prefix : "default", (*schema5)->targetNamespace); for (vector::const_iterator element = (*schema5)->element.begin(); element != (*schema5)->element.end(); ++element) { if (prefix) fprintf(stream, "\n - <%s:%s> ", prefix, (*element).name); else fprintf(stream, "\n - <%s> ", (*element).name); const char *cname = types.cname("_", (*schema5)->targetNamespace, (*element).name); if (types.is_defined("_", (*schema5)->targetNamespace, (*element).name)) { const char *pname = types.pname(true, false, "_", (*schema5)->targetNamespace, (*element).name); fprintf(stream, "@ref %s\n", cname); fprintf(stream, " @code\n // Reader (returns SOAP_OK on success):\n soap_read_%s(struct soap*, %s);\n // Writer (returns SOAP_OK on success):\n soap_write_%s(struct soap*, %s);\n @endcode\n", cname, pname, cname, pname); } else fprintf(stream, "(use wsdl2h option -g to auto-generate type %s)\n", cname); } } fprintf(stream, "\n*/\n"); } if (cppnamespace) fprintf(stream, "\n} // namespace %s\n", cppnamespace); fprintf(stream, "\n/* End of %s */\n", outfile ? outfile : "file"); } void Definitions::generate() { MapOfStringToMessage headers; MapOfStringToMessage faults; const char *t; for (MapOfStringToService::const_iterator service1 = services.begin(); service1 != services.end(); ++service1) { if ((*service1).second) { for (MapOfStringToMessage::const_iterator header = (*service1).second->header.begin(); header != (*service1).second->header.end(); ++header) headers[(*header).first] = (*header).second; for (MapOfStringToMessage::const_iterator fault = (*service1).second->fault.begin(); fault != (*service1).second->fault.end(); ++fault) faults[(*fault).first] = (*fault).second; } } // Generate SOAP Header definition t = types.deftypemap["SOAP_ENV__Header"]; if (t && *t) { banner("Custom SOAP Header"); types.format(t); } else if (!jflag && !headers.empty()) { banner("SOAP Header"); fprintf(stream, "/**\n\nThe SOAP Header is part of the gSOAP context and its content is accessed\nthrough the soap.header variable. You may have to set the soap.actor variable\nto serialize SOAP Headers with SOAP-ENV:actor or SOAP-ENV:role attributes.\nUse option -j to remove entire SOAP Header definition.\nUse option -k to remove the mustUnderstand qualifiers.\n\n*/\n"); fprintf(stream, "mutable struct SOAP_ENV__Header\n{\n"); for (MapOfStringToMessage::const_iterator header = headers.begin(); header != headers.end(); ++header) { if ((*header).second->use == encoded && (*header).second->URI && *(*header).second->URI) fprintf(stream, schemaformat, types.nsprefix(NULL, (*header).second->URI), "namespace", (*header).second->URI); comment("Header", (*header).first, "WSDL", (*header).second->ext_documentation); comment("Header", (*header).first, "SOAP", (*header).second->documentation); if ((*header).second->mustUnderstand && !kflag) { fprintf(stream, elementformat, "mustUnderstand", "// must be understood by receiver"); fprintf(stream, "\n"); } if ((*header).second->part && (*header).second->part->elementPtr()) { fprintf(stream, "/// \"%s\" SOAP Header part element.\n", (*header).second->part->name); if ((*header).second->part->elementPtr()->type && (*header).second->part->element) fprintf(stream, elementformat, types.pname(true, false, NULL, NULL, (*header).second->part->elementPtr()->type), types.aname(NULL, NULL, (*header).second->part->element)); else if ((*header).second->part->element) fprintf(stream, elementformat, types.pname(true, false, "_", NULL, (*header).second->part->element), types.aname(NULL, NULL, (*header).second->part->element)); else fprintf(stream, elementformat, types.pname(true, false, "_", NULL, (*header).second->part->elementPtr()->name), (*header).first); fprintf(stream, ";\n"); } else if ((*header).second->part && (*header).second->part->type) { fprintf(stream, "/// \"%s\" SOAP Header part type.\n", (*header).second->part->type); fprintf(stream, elementformat, types.pname(true, false, NULL, NULL, (*header).second->part->type), types.aname(NULL, (*header).second->URI, (*header).second->part->name)); fprintf(stream, ";\n"); } else if ((*header).second->element) { fprintf(stream, "/// \"%s\" SOAP Header element", (*header).second->name); (*header).second->generate(types, ";", false, true, false, true); fprintf(stream, "\n"); } else { if ((*header).second->part && (*header).second->part->element) fprintf(stream, elementformat, types.pname(true, false, "_", NULL, (*header).second->part->element), (*header).first); else fprintf(stream, pointerformat, (*header).first, (*header).first); fprintf(stream, ";\t///< @todo Please check element name and type (imported type)\n"); } } types.modify("SOAP_ENV__Header"); fprintf(stream, "\n};\n\n"); } // Generate Fault detail element definitions for (MapOfStringToMessage::const_iterator fault = faults.begin(); fault != faults.end(); ++fault) { if ((*fault).second->use == encoded) { fprintf(stream, schemaformat, types.nsprefix(NULL, (*fault).second->URI), "namespace", (*fault).second->URI); fprintf(stream, "/// SOAP Fault message \"%s\":%s.\n", (*fault).second->URI, (*fault).second->message->name); comment("Fault", (*fault).first, "WSDL", (*fault).second->ext_documentation); comment("Fault", (*fault).first, "SOAP", (*fault).second->documentation); if (cflag) fprintf(stream, "struct %s\n{", (*fault).first); else fprintf(stream, "class %s\n{ public:", (*fault).first); (*fault).second->generate(types, ";", false, true, false, true); if (!cflag) { fprintf(stream, "\n"); fprintf(stream, pointerformat, "struct soap", "soap"); fprintf(stream, ";"); } fprintf(stream, "\n};\n\n"); if (cflag) fprintf(stream, "typedef struct %s %s;\n\n", (*fault).first, (*fault).first); } } t = types.deftypemap["SOAP_ENV__Detail"]; if (t && *t) { banner("Custom SOAP Fault Detail"); types.format(t); } else if (!jflag && !faults.empty()) { SetOfString fault_elements; banner("SOAP Fault Detail"); fprintf(stream, "/**\n\nThe SOAP Fault is part of the gSOAP context and its content is accessed\nthrough the soap.fault->detail variable (SOAP 1.1) or the\nsoap.fault->SOAP_ENV__Detail variable (SOAP 1.2).\nUse wsdl2h option -j to omit these declarations.\n\n*/\n"); fprintf(stream, "mutable struct SOAP_ENV__Detail\n{\n"); if (dflag) { const char *t = types.tname(NULL, NULL, "xsd:anyAttribute"); fprintf(stream, attributeformat, t, "__anyAttribute"); fprintf(stream, ";\t///< Catch any attribute content in DOM.\n"); } else fprintf(stream, "/// xsd:anyAttribute omitted: to parse attribute content of the Detail element into DOM anyAttribute, use wsdl2h option -d.\n"); types.modify("SOAP_ENV__Detail"); /* See below */ /* The DOM representation is not desired since faultdetail is NULL. However, future options may reenable this feature (see keep code here). const char *t = types.tname(NULL, NULL, "xsd:any"); fprintf(stream, elementformat, t, "__any"); if (dflag) fprintf(stream, ";\t///< Catch any element content in DOM.\n"); else fprintf(stream, ";\t///< Catch any element content in XML string.\n"); */ for (MapOfStringToMessage::const_iterator fault = faults.begin(); fault != faults.end(); ++fault) { comment("Fault", (*fault).first, "WSDL", (*fault).second->ext_documentation); comment("Fault", (*fault).first, "SOAP", (*fault).second->documentation); if ((*fault).second->message) { const char *name = (*fault).second->message->name; if (!name) name = "?"; if ((*fault).second->use == literal) { for (vector::const_iterator part = (*fault).second->message->part.begin(); part != (*fault).second->message->part.end(); ++part) { if ((*part).elementPtr()) { if (fault_elements.find((*part).element) == fault_elements.end()) { fprintf(stream, "/// SOAP Fault message \"%s\" part \"%s\" element \"%s\".\n", name, (*part).name ? (*part).name : "", (*part).element ? (*part).element : ""); if ((*part).elementPtr()->type) fprintf(stream, elementformat, types.pname(true, false, NULL, NULL, (*part).elementPtr()->type), types.aname(NULL, (*fault).second->URI, (*part).element)); else fprintf(stream, elementformat, types.pname(true, false, "_", NULL, (*part).element), types.aname(NULL, (*fault).second->URI, (*part).element)); fprintf(stream, ";\n"); fault_elements.insert((*part).element); } } else if ((*part).name && (*part).type) { if (fault_elements.find((*part).name) == fault_elements.end()) { fprintf(stream, schemaformat, types.nsprefix(NULL, (*fault).second->URI), "namespace", (*fault).second->URI); fprintf(stream, "/// SOAP Fault message \"%s\" part \"%s\" type \"%s\".\n", name, (*part).name, (*part).type); fprintf(stream, elementformat, types.pname(true, false, NULL, NULL, (*part).type), types.aname(NULL, (*fault).second->URI, (*part).name)); fprintf(stream, ";\n"); fault_elements.insert((*part).name); } } else fprintf(stream, "// Unknown SOAP Fault message \"%s\":%s part \"%s\"\n", (*fault).second->URI, name, (*part).name ? (*part).name : ""); } } else { fprintf(stream, "/// SOAP Fault message \"%s\":%s\n", (*fault).second->URI, name); fprintf(stream, pointerformat, (*fault).first, types.aname(NULL, (*fault).second->URI, (*fault).second->message->name)); fprintf(stream, ";\n"); } } else if ((*fault).second->element) { if (fault_elements.find((*fault).second->name) == fault_elements.end()) { fprintf(stream, "/// SOAP Fault message \"%s\":%s\n", (*fault).second->URI, (*fault).second->element->name); fprintf(stream, elementformat, types.pname(true, false, "_", (*fault).second->URI, (*fault).second->element->name), (*fault).second->name); fprintf(stream, ";\n"); fault_elements.insert((*fault).second->name); } } } fprintf(stream, elementformat, "int", "__type"); fprintf(stream, ";\t///< set to SOAP_TYPE_X for a serializable type X\n"); fprintf(stream, pointerformat, "void", "fault"); fprintf(stream, ";\t///< points to serializable object of type X or NULL\n"); fprintf(stream, elementformat, "_XML", "__any"); fprintf(stream, ";\t///< Catch any other content in XML string.\n"); fprintf(stream, "};\n\n"); } /* The SOAP Fault struct below is autogenerated by soapcpp2 (kept here for future mods) if (!mflag && !faults.empty()) { fprintf(stream, "struct SOAP_ENV__Code\n{\n"); fprintf(stream, elementformat, "_QName", "SOAP_ENV__Value"); fprintf(stream, ";\n"); fprintf(stream, pointerformat, "char", "SOAP_ENV__Node"); fprintf(stream, ";\n"); fprintf(stream, pointerformat, "char", "SOAP_ENV__Role"); fprintf(stream, ";\n};\n"); fprintf(stream, "struct SOAP_ENV__Detail\n{\n"); fprintf(stream, elementformat, "int", "__type"); fprintf(stream, ";\n"); fprintf(stream, pointerformat, "void", "fault"); fprintf(stream, ";\n"); fprintf(stream, elementformat, "_XML", "__any"); fprintf(stream, ";\n};\n"); fprintf(stream, "struct SOAP_ENV__Fault\n{\n"); fprintf(stream, elementformat, "_QName", "faultcode"); fprintf(stream, ";\n"); fprintf(stream, pointerformat, "char", "faultstring"); fprintf(stream, ";\n"); fprintf(stream, pointerformat, "char", "faultactor"); fprintf(stream, ";\n"); fprintf(stream, pointerformat, "struct SOAP_ENV__Detail", "detail"); fprintf(stream, ";\n"); fprintf(stream, pointerformat, "struct SOAP_ENV__Code", "SOAP_ENV__Code"); fprintf(stream, ";\n"); fprintf(stream, pointerformat, "char", "SOAP_ENV__Reason"); fprintf(stream, ";\n"); fprintf(stream, pointerformat, "struct SOAP_ENV__Detail", "SOAP_ENV__Detail"); fprintf(stream, ";\n};\n"); } */ for (MapOfStringToService::const_iterator service2 = services.begin(); service2 != services.end(); ++service2) if ((*service2).second) (*service2).second->generate(types); } //////////////////////////////////////////////////////////////////////////////// // // Service methods // //////////////////////////////////////////////////////////////////////////////// Service::Service() { prefix = NULL; URI = NULL; name = NULL; type = NULL; transport = NULL; } void Service::generate(Types& types) { const char *method_name; banner("Service Binding", name); for (vector::const_iterator op2 = operation.begin(); op2 != operation.end(); ++op2) { if (*op2 && ((*op2)->input || bflag)) { bool flag = false, anonymous = ((*op2)->style != document && (*op2)->parameterOrder != NULL); if (!(*op2)->input) method_name = (*op2)->output_name; else method_name = (*op2)->input_name; banner("Service Operation", method_name); if ((*op2)->output && (*op2)->output_name) { if ((*op2)->style == document) flag = ((*op2)->output->element || ((*op2)->output->message && (*op2)->output->message->part.size() == 1)); else if (!wflag) flag = ((*op2)->output->element || ((*op2)->output->message && (*op2)->output->use == encoded && (*op2)->output->message->part.size() == 1 && !(*(*op2)->output->message->part.begin()).simpleTypePtr() && !(*(*op2)->output->message->part.begin()).complexTypePtr())); if (flag && (*op2)->input && (*op2)->output && (*op2)->input->message && (*(*op2)->output->message->part.begin()).element) for (vector::const_iterator part = (*op2)->input->message->part.begin(); part != (*op2)->input->message->part.end(); ++part) if ((*part).element && !strcmp((*part).element, (*(*op2)->output->message->part.begin()).element)) flag = false; if (!flag) { if (bflag) fprintf(stream, "/* soapcpp2 generates the following struct automatically for your use:\n"); fprintf(stream, "/// Operation response struct \"%s\" of operation \"%s\".\n", (*op2)->output_name, method_name); fprintf(stream, "struct %s\n{", (*op2)->output_name); (*op2)->output->generate(types, ";", anonymous, false, false, false); fprintf(stream, "\n};\n"); if (bflag) fprintf(stream, "*/\n"); } } fprintf(stream, "\n/** Operation \"%s\" of service binding \"%s\".\n", method_name, name); if ((*op2)->documentation) text((*op2)->documentation); if ((*op2)->operation_documentation) text((*op2)->operation_documentation); if ((*op2)->input && (*op2)->input->documentation) { fprintf(stream, "Input request:\n"); text((*op2)->input->documentation); } if ((*op2)->input && (*op2)->input->ext_documentation) { fprintf(stream, "Input request:\n"); text((*op2)->input->ext_documentation); } if ((*op2)->output) { if ((*op2)->output->documentation) { fprintf(stream, "Output response:\n"); text((*op2)->output->documentation); } if ((*op2)->output->ext_documentation) { fprintf(stream, "Output response:\n"); text((*op2)->output->ext_documentation); } } gen_policy(*this, (*op2)->policy, "operation", types); if ((*op2)->input) { gen_policy(*this, (*op2)->input->policy, "request message", types); if ((*op2)->input->content) { fprintf(stream, "\n - Request message MIME content"); if ((*op2)->input->content->type) { fprintf(stream, " type=\""); text((*op2)->input->content->type); fprintf(stream, "\""); } if ((*op2)->input->content->type && !strcmp((*op2)->input->content->type, "application/x-www-form-urlencoded")) fprintf(stream, "\n Use the httpform.c plugin to retrieve key-value pairs from the REST request\n message form data at the server side (client side is automated).\n"); else fprintf(stream, "\n @todo This form of MIME content is not automatically handled.\n"); } } if ((*op2)->output) { gen_policy(*this, (*op2)->output->policy, "response message", types); if ((*op2)->output->content) { fprintf(stream, "\n - Response message MIME content"); if ((*op2)->output->content->type) { fprintf(stream, " type=\""); text((*op2)->output->content->type); fprintf(stream, "\""); } fprintf(stream, "\n @todo This form of MIME content response is not automatically handled.\n Use one-way request and implement code to parse response.\n"); } } else fprintf(stream, "\n - One-way service request message\n"); if ((*op2)->mep) fprintf(stream, "\n - SOAP MEP: \"%s\"\n", ((*op2)->mep)); if ((*op2)->style == document) fprintf(stream, "\n - %s %s messaging\n", (*op2)->protocol, (*op2)->input && (*op2)->input->content && (*op2)->input->content->type ? (*op2)->input->content->type : "document/literal style"); else if ((*op2)->input) { if ((*op2)->input->use == literal) fprintf(stream, "\n - %s literal messaging\n", (*op2)->protocol); else if ((*op2)->input->encodingStyle) fprintf(stream, "\n - %s RPC encodingStyle=\"%s\"\n", (*op2)->input->encodingStyle, (*op2)->protocol); else fprintf(stream, "\n - %s RPC encoded messaging\n", (*op2)->protocol); } if ((*op2)->output) { if (!(*op2)->input || (*op2)->input->use != (*op2)->output->use) { if ((*op2)->output->use == literal) fprintf(stream, "\n - %s literal response messages\n", (*op2)->protocol); else if ((*op2)->output->encodingStyle) fprintf(stream, "\n - %s RPC response encodingStyle=\"%s\"\n", (*op2)->protocol, (*op2)->output->encodingStyle); else fprintf(stream, "\n - %s RPC encoded response messages\n", (*op2)->protocol); } } if ((*op2)->action) { if (*(*op2)->action) fprintf(stream, "\n - Action: \"%s\"\n", (*op2)->action); } if ((*op2)->input) { if ((*op2)->input->action) fprintf(stream, "\n - Addressing input action: \"%s\"\n", (*op2)->input->action); } if ((*op2)->output) { if ((*op2)->output->action) fprintf(stream, "\n - Addressing output action: \"%s\"\n", (*op2)->output->action); } for (vector::const_iterator infault = (*op2)->infault.begin(); infault != (*op2)->infault.end(); ++infault) { if ((*infault)->message) { if ((*infault)->use == literal) { for (vector::const_iterator part = (*infault)->message->part.begin(); part != (*infault)->message->part.end(); ++part) { if ((*part).element) fprintf(stream, "\n - SOAP Input Fault: %s (literal)\n", (*part).element); else if ((*part).name && (*part).type) fprintf(stream, "\n - SOAP Input Fault: %s (literal)\n", (*part).name); } } else if ((*infault)->message->name) fprintf(stream, "\n - SOAP Input Fault: %s\n", (*infault)->name); if ((*infault)->message->name && (*infault)->action) fprintf(stream, " - SOAP Input Fault addressing action: \"%s\"\n", (*infault)->action); } else if ((*infault)->name) fprintf(stream, "\n - SOAP Input Fault: %s (literal)\n", (*infault)->name); if ((*infault)->body_parts) fprintf(stream, " SOAP Input Fault code: %s\n", (*infault)->body_parts); text((*infault)->documentation); text((*infault)->ext_documentation); gen_policy(*this, (*infault)->policy, "fault message", types); } for (vector::const_iterator outfault = (*op2)->outfault.begin(); outfault != (*op2)->outfault.end(); ++outfault) { if ((*outfault)->message) { if ((*outfault)->use == literal) { for (vector::const_iterator part = (*outfault)->message->part.begin(); part != (*outfault)->message->part.end(); ++part) { if ((*part).element) fprintf(stream, "\n - SOAP Output Fault: %s (literal)\n", (*part).element); else if ((*part).name && (*part).type) fprintf(stream, "\n - SOAP Output Fault: %s (literal)\n", (*part).name); } } else if ((*outfault)->message->name) fprintf(stream, "\n - SOAP Output Fault: %s\n", (*outfault)->name); if ((*outfault)->message->name && (*outfault)->action) fprintf(stream, " - SOAP Output Fault addressing action: \"%s\"\n", (*outfault)->action); } else if ((*outfault)->name) fprintf(stream, "\n - SOAP Output Fault: %s (literal)\n", (*outfault)->name); if ((*outfault)->body_parts) fprintf(stream, " SOAP Output Fault code: %s\n", (*outfault)->body_parts); text((*outfault)->documentation); text((*outfault)->ext_documentation); gen_policy(*this, (*outfault)->policy, "fault message", types); } if ((*op2)->input) { if (!(*op2)->input->header.empty()) fprintf(stream, "\n - Request message has mandatory header part(s) (see @ref SOAP_ENV__Header):\n"); for (vector::const_iterator inputheader = (*op2)->input->header.begin(); inputheader != (*op2)->input->header.end(); ++inputheader) { if ((*inputheader).part) { if ((*inputheader).use == encoded && (*inputheader).namespace_) fprintf(stream, " - %s\n", types.aname(NULL, (*inputheader).namespace_, (*inputheader).part)); else if ((*inputheader).partPtr() && (*inputheader).partPtr()->element) fprintf(stream, " - %s\n", types.aname(NULL, NULL, (*inputheader).partPtr()->element)); } } } if ((*op2)->input && (*op2)->input->multipartRelated) { int k = 2; fprintf(stream, "\n - Request message MIME multipart/related attachments:\n"); for (vector::const_iterator part = (*op2)->input->multipartRelated->part.begin(); part != (*op2)->input->multipartRelated->part.end(); ++part) { if ((*part).soap__body_) { fprintf(stream, " -# MIME attachment with SOAP Body and mandatory header part(s):\n"); for (vector::const_iterator header = (*part).soap__header_.begin(); header != (*part).soap__header_.end(); ++header) { if ((*header).part) { if ((*header).use == encoded && (*header).namespace_) fprintf(stream, " - %s\n", types.aname(NULL, (*header).namespace_, (*header).part)); else if ((*header).partPtr() && (*header).partPtr()->element) fprintf(stream, " - %s\n", types.aname(NULL, NULL, (*header).partPtr()->element)); } } } else { fprintf(stream, " -# MIME attachment %d:\n", k++); for (vector::const_iterator content = (*part).content.begin(); content != (*part).content.end(); ++content) { fprintf(stream, " -"); if ((*content).part) { fprintf(stream, " part=\""); text((*content).part); fprintf(stream, "\""); } if ((*content).type) { fprintf(stream, " type=\""); text((*content).type); fprintf(stream, "\""); } fprintf(stream, "\n"); } } } } if ((*op2)->input && (*op2)->input->layout) fprintf(stream, "\n - Request message has DIME attachments in compliance with %s\n", (*op2)->input->layout); if ((*op2)->output) { if (!(*op2)->output->header.empty()) fprintf(stream, "\n - Response message has mandatory header part(s): (see @ref SOAP_ENV__Header)\n"); for (vector::const_iterator outputheader = (*op2)->output->header.begin(); outputheader != (*op2)->output->header.end(); ++outputheader) { if ((*outputheader).part) { if ((*outputheader).use == encoded && (*outputheader).namespace_) fprintf(stream, " - %s\n", types.aname(NULL, (*outputheader).namespace_, (*outputheader).part)); else if ((*outputheader).partPtr() && (*outputheader).partPtr()->element) fprintf(stream, " - %s\n", types.aname(NULL, NULL, (*outputheader).partPtr()->element)); } } } if ((*op2)->output && (*op2)->output_name && (*op2)->output->multipartRelated) { int k = 2; fprintf(stream, "\n - Response message MIME multipart/related attachments\n"); for (vector::const_iterator part = (*op2)->output->multipartRelated->part.begin(); part != (*op2)->output->multipartRelated->part.end(); ++part) { if ((*part).soap__body_) { fprintf(stream, " -# MIME attachment with SOAP Body and mandatory header part(s):\n"); for (vector::const_iterator header = (*part).soap__header_.begin(); header != (*part).soap__header_.end(); ++header) { if ((*header).part) { if ((*header).use == encoded && (*header).namespace_) fprintf(stream, " - %s\n", types.aname(NULL, (*header).namespace_, (*header).part)); else if ((*header).partPtr() && (*header).partPtr()->element) fprintf(stream, " - %s\n", types.aname(NULL, NULL, (*header).partPtr()->element)); } } } else { fprintf(stream, " -# MIME attachment %d:\n", k++); for (vector::const_iterator content = (*part).content.begin(); content != (*part).content.end(); ++content) { fprintf(stream, " -"); if ((*content).part) { fprintf(stream, " part=\""); text((*content).part); fprintf(stream, "\""); } if ((*content).type) { fprintf(stream, " type=\""); text((*content).type); fprintf(stream, "\""); } fprintf(stream, "\n"); } } } } if ((*op2)->output && (*op2)->output_name && (*op2)->output->layout) fprintf(stream, "\n - Response message has DIME attachments in compliance with %s\n", (*op2)->output->layout); fprintf(stream, "\nC stub function (defined in soapClient.c[pp] generated by soapcpp2):\n@code\n int soap_%s_%s(\n struct soap *soap,\n NULL, // char *endpoint = NULL selects default endpoint for this operation\n NULL, // char *action = NULL selects default action for this operation\n // input parameters:", (*op2)->output ? "call" : "send", method_name); if ((*op2)->input) (*op2)->input->generate(types, ",", false, false, false, false); if ((*op2)->output && (*op2)->output_name) { fprintf(stream, "\n // output parameters:"); if (flag) { if ((*op2)->style == rpc && (*op2)->output->message && (*(*op2)->output->message->part.begin()).name) { fprintf(stream, "\n"); fprintf(stream, anonymous ? anonformat : paraformat, types.tnamenoptr(NULL, NULL, (*(*op2)->output->message->part.begin()).type), cflag ? "*" : "&", types.aname(NULL, NULL, (*(*op2)->output->message->part.begin()).name), ""); } else (*op2)->output->generate(types, "", anonymous, false, true, false); } else fprintf(stream, "\n struct %s%s", (*op2)->output_name, cflag ? "*" : "&"); } fprintf(stream, "\n );\n@endcode\n\nC server function (called from the service dispatcher defined in soapServer.c[pp]):\n@code\n int %s(\n struct soap *soap,\n // input parameters:", method_name); if ((*op2)->input) (*op2)->input->generate(types, ",", false, false, false, false); fprintf(stream, "\n // output parameters:"); if ((*op2)->output && (*op2)->output_name) { if (flag) { if ((*op2)->style == rpc && (*op2)->output->message && (*(*op2)->output->message->part.begin()).name) { fprintf(stream, "\n"); fprintf(stream, anonymous ? anonformat : paraformat, types.tnamenoptr(NULL, NULL, (*(*op2)->output->message->part.begin()).type), cflag ? "*" : "&", types.aname(NULL, NULL, (*(*op2)->output->message->part.begin()).name), ""); } else (*op2)->output->generate(types, "", anonymous, false, true, false); } else fprintf(stream, "\n struct %s%s", (*op2)->output_name, cflag ? "*" : "&"); } fprintf(stream, "\n );\n@endcode\n\n"); if (!cflag) { fprintf(stream, "C++ proxy class (defined in soap%sProxy.h):\n", name); fprintf(stream, "@code\n class %sProxy;\n@endcode\n", name); fprintf(stream, "Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use proxy classes;\n\n"); fprintf(stream, "C++ service class (defined in soap%sService.h):\n", name); fprintf(stream, "@code\n class %sService;\n@endcode\n", name); fprintf(stream, "Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use service classes;\n\n"); } fprintf(stream, "*/\n\n"); (*op2)->generate(types, *this); } else if (*op2 && (*op2)->output) { if (!(*op2)->input) method_name = (*op2)->output_name; else method_name = (*op2)->input_name; banner("Service Operation", method_name); fprintf(stream, "\n/** Operation \"%s\" of service binding \"%s\".\n", method_name, name); if ((*op2)->documentation) text((*op2)->documentation); if ((*op2)->operation_documentation) text((*op2)->operation_documentation); if ((*op2)->output->documentation) { fprintf(stream, "Output response:\n"); text((*op2)->output->documentation); } if ((*op2)->output->ext_documentation) { fprintf(stream, "Output response:\n"); text((*op2)->output->ext_documentation); } gen_policy(*this, (*op2)->policy, "operation", types); gen_policy(*this, (*op2)->output->policy, "response message", types); fprintf(stream, "\n - One-way service response message\n"); if ((*op2)->mep) fprintf(stream, "\n - SOAP MEP: \"%s\"\n", ((*op2)->mep)); if ((*op2)->style == document) fprintf(stream, "\n - %s document/literal style messaging\n", (*op2)->protocol); else { if ((*op2)->output->use == literal) fprintf(stream, "\n - %s RPC literal messaging\n", (*op2)->protocol); else if ((*op2)->output->encodingStyle) fprintf(stream, "\n - %s RPC encodingStyle=\"%s\"\n", (*op2)->output->encodingStyle, (*op2)->protocol); else fprintf(stream, "\n - %s RPC encoded messaging\n", (*op2)->protocol); } if ((*op2)->action) { if (*(*op2)->action) fprintf(stream, "\n - Action: \"%s\"\n", (*op2)->action); } if ((*op2)->output) { if ((*op2)->output->action) fprintf(stream, "\n - Addressing output action: \"%s\"\n", (*op2)->output->action); } for (vector::const_iterator outfault = (*op2)->outfault.begin(); outfault != (*op2)->outfault.end(); ++outfault) { if ((*outfault)->message) { if ((*outfault)->use == literal) { for (vector::const_iterator part = (*outfault)->message->part.begin(); part != (*outfault)->message->part.end(); ++part) { if ((*part).element) fprintf(stream, "\n - SOAP Output Fault: %s (literal)\n", (*part).element); else if ((*part).name && (*part).type) fprintf(stream, "\n - SOAP Output Fault: %s (literal)\n", (*part).name); } } else if ((*outfault)->message->name) fprintf(stream, "\n - SOAP Output Fault: %s\n", (*outfault)->name); if ((*outfault)->message->name && (*outfault)->action) fprintf(stream, " - SOAP Output Fault addressing action: \"%s\"\n", (*outfault)->action); } else if ((*outfault)->name) fprintf(stream, "\n - SOAP Output Fault: %s (literal)\n", (*outfault)->name); gen_policy(*this, (*outfault)->policy, "fault message", types); } if (!(*op2)->output->header.empty()) fprintf(stream, "\n - Response message has mandatory header part(s) (see @ref SOAP_ENV__Header):\n"); for (vector::const_iterator outputheader = (*op2)->output->header.begin(); outputheader != (*op2)->output->header.end(); ++outputheader) { if ((*outputheader).part) { if ((*outputheader).use == encoded && (*outputheader).namespace_) fprintf(stream, " - %s\n", types.aname(NULL, (*outputheader).namespace_, (*outputheader).part)); else if ((*outputheader).partPtr() && (*outputheader).partPtr()->element) fprintf(stream, " - %s\n", types.aname(NULL, NULL, (*outputheader).partPtr()->element)); } } if ((*op2)->output->multipartRelated) { int k = 2; fprintf(stream, "\n - Response message MIME multipart/related attachments:\n"); for (vector::const_iterator part = (*op2)->output->multipartRelated->part.begin(); part != (*op2)->output->multipartRelated->part.end(); ++part) { if ((*part).soap__body_) { fprintf(stream, " -# MIME attachment with SOAP Body and mandatory header part(s):\n"); for (vector::const_iterator header = (*part).soap__header_.begin(); header != (*part).soap__header_.end(); ++header) { if ((*header).part) { if ((*header).use == encoded && (*header).namespace_) fprintf(stream, " - %s\n", types.aname(NULL, (*header).namespace_, (*header).part)); else if ((*header).partPtr() && (*header).partPtr()->element) fprintf(stream, " - %s\n", types.aname(NULL, NULL, (*header).partPtr()->element)); } } } else { fprintf(stream, " -# MIME attachment %d:\n", k++); for (vector::const_iterator content = (*part).content.begin(); content != (*part).content.end(); ++content) { fprintf(stream, " -"); if ((*content).part) { fprintf(stream, " part=\""); text((*content).part); fprintf(stream, "\""); } if ((*content).type) { fprintf(stream, " type=\""); text((*content).type); fprintf(stream, "\""); } fprintf(stream, "\n"); } } } } if ((*op2)->output->layout) fprintf(stream, "\n - Response message has DIME attachments in compliance with %s\n", (*op2)->output->layout); fprintf(stream, "\nC stub function (defined in soapClient.c[pp] generated by soapcpp2):\n@code\n int soap_call_%s(\n struct soap *soap,\n NULL, // char *endpoint = NULL selects default endpoint for this operation\n NULL, // char *action = NULL selects default action for this operation\n // parameters:", method_name); (*op2)->output->generate(types, ",", false, false, false, false); fprintf(stream, "\n );\n@endcode\n\nC server function (called from the service dispatcher defined in soapServer.c[pp]):\n@code\n int %s(\n struct soap *soap,\n // parameters:", method_name); (*op2)->output->generate(types, ",", false, false, false, false); fprintf(stream, "\n );\n@endcode\n\n"); if (!cflag) { fprintf(stream, "C++ proxy class (defined in soap%sProxy.h):\n", name); fprintf(stream, "@code\n class %sProxy;\n@endcode\n", name); fprintf(stream, "Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use proxy classes;\n\n"); fprintf(stream, "C++ service class (defined in soap%sService.h):\n", name); fprintf(stream, "@code\n class %sService;\n@endcode\n", name); fprintf(stream, "Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use service classes;\n\n"); } fprintf(stream, "*/\n\n"); (*op2)->generate(types, *this); } } gen_policy_enablers(*this); } void Service::add_import(const char *s) { if (find_if(imports.begin(), imports.end(), eqstr(s)) == imports.end()) imports.push_back(s); } void Service::del_import(const char *s) { VectorOfString::iterator i = find_if(imports.begin(), imports.end(), eqstr(s)); if (i != imports.end()) imports.erase(i); } //////////////////////////////////////////////////////////////////////////////// // // Operation methods // //////////////////////////////////////////////////////////////////////////////// void Operation::generate(Types& types, Service& service) { bool flag = false, anonymous = ((style != document) && parameterOrder != NULL); const char *method_name = NULL; if (output) { if (style == document) flag = (output->element || (output->message && output->message->part.size() == 1)); else if (!wflag) flag = (output->element || (output->message && output->use == encoded && output->message->part.size() == 1 && !(*output->message->part.begin()).simpleTypePtr() && !(*output->message->part.begin()).complexTypePtr())); if (flag && input && input->message && (*output->message->part.begin()).element) for (vector::const_iterator part = input->message->part.begin(); part != input->message->part.end(); ++part) if ((*part).element && !strcmp((*part).element, (*output->message->part.begin()).element)) flag = false; } if (output && output_name && bflag) // (output && (!input || bflag)) { if (input) { method_name = strstr(output_name + 1, "__"); if (method_name) method_name += 2; else method_name = output_name; } else { method_name = strstr(input_name + 1, "__"); if (method_name) method_name += 2; else method_name = input_name; } if (protocol) fprintf(stream, serviceformat, prefix, "method-protocol", method_name, protocol); if (output->content && output->content->type) fprintf(stream, serviceformat, prefix, "method-mime-type", method_name, output->content->type); else if (style == document) fprintf(stream, serviceformat, prefix, "method-style", method_name, "document"); else fprintf(stream, serviceformat, prefix, "method-style", method_name, "rpc"); if (output->use == literal) fprintf(stream, serviceformat, prefix, "method-encoding", method_name, "literal"); else if (output->encodingStyle) fprintf(stream, serviceformat, prefix, "method-encoding", method_name, output->encodingStyle); else fprintf(stream, serviceformat, prefix, "method-encoding", method_name, "encoded"); if (output && output->action && *output->action) fprintf(stream, serviceformat, prefix, "method-action", method_name, output->action); else if (action) { if (*action) fprintf(stream, serviceformat, prefix, "method-action", method_name, action); else fprintf(stream, serviceformat, prefix, "method-action", method_name, "\"\""); } for (vector::const_iterator message = outfault.begin(); message != outfault.end(); ++message) { if ((*message)->message) { if ((*message)->use == literal) { for (vector::const_iterator part = (*message)->message->part.begin(); part != (*message)->message->part.end(); ++part) { if ((*part).element) fprintf(stream, serviceformat, prefix, "method-fault", method_name, types.aname(NULL, NULL, (*part).element)); else if ((*part).type) fprintf(stream, serviceformat, prefix, "method-fault", method_name, types.aname(NULL, (*message)->URI, (*part).name)); } } else { if ((*message)->message->name) fprintf(stream, serviceformat, prefix, "method-fault", method_name, (*message)->name); } if ((*message)->action) fprintf(stream, serviceformat, prefix, "method-fault-action", method_name, (*message)->action); } else if ((*message)->name) fprintf(stream, serviceformat, prefix, "method-fault", method_name, (*message)->name); } if (output->multipartRelated) { for (vector::const_iterator outputmime = output->multipartRelated->part.begin(); outputmime != output->multipartRelated->part.end(); ++outputmime) { for (vector::const_iterator outputheader = (*outputmime).soap__header_.begin(); outputheader != (*outputmime).soap__header_.end(); ++outputheader) { if ((*outputheader).part) { if ((*outputheader).use == encoded && (*outputheader).namespace_) fprintf(stream, serviceformat, prefix, "method-header-part", method_name, types.aname(NULL, (*outputheader).namespace_, (*outputheader).part)); else if ((*outputheader).partPtr() && (*outputheader).partPtr()->element) fprintf(stream, serviceformat, prefix, "method-header-part", method_name, types.aname(NULL, NULL, (*outputheader).partPtr()->element)); } } for (vector::const_iterator content = (*outputmime).content.begin(); content != (*outputmime).content.end(); ++content) if ((*content).type) fprintf(stream, serviceformat, prefix, "method-mime-type", method_name, (*content).type); } } // TODO: add headerfault directives? for (vector::const_iterator outputheader = output->header.begin(); outputheader != output->header.end(); ++outputheader) { if ((*outputheader).part) { if ((*outputheader).use == encoded && (*outputheader).namespace_) fprintf(stream, serviceformat, prefix, "method-header-part", method_name, types.aname(NULL, (*outputheader).namespace_, (*outputheader).part)); else if ((*outputheader).partPtr() && (*outputheader).partPtr()->element) fprintf(stream, serviceformat, prefix, "method-header-part", method_name, types.aname(NULL, NULL, (*outputheader).partPtr()->element)); } } for (vector::const_iterator outputwheader = output->wheader.begin(); outputwheader != output->wheader.end(); ++outputwheader) { if ((*outputwheader).element) fprintf(stream, serviceformat, prefix, "method-header-part", method_name, types.aname(NULL, NULL, (*outputwheader).element)); } if (input) { fprintf(stream, "/// Operation response \"%s\" of operation \"%s\".\n", output_name, input_name); fprintf(stream, "int %s(", output_name); } else fprintf(stream, "int %s(", input_name); output->generate(types, ",", anonymous, true, false, false); fprintf(stream, "\n void\t///< One-way message: no output parameter\n);\n"); } if (!input && output && output_name) // (!input && output && bflag) { method_name = strstr(output_name + 1, "__"); if (method_name) method_name += 2; else method_name = output_name; if (protocol) fprintf(stream, serviceformat, prefix, "method-protocol", method_name, protocol); if (output->content && output->content->type) fprintf(stream, serviceformat, prefix, "method-mime-type", method_name, output->content->type); else if (style == document) fprintf(stream, serviceformat, prefix, "method-style", method_name, "document"); else fprintf(stream, serviceformat, prefix, "method-style", method_name, "rpc"); if (output->use == literal) fprintf(stream, serviceformat, prefix, "method-encoding", method_name, "literal"); else if (output->encodingStyle) fprintf(stream, serviceformat, prefix, "method-encoding", method_name, output->encodingStyle); else fprintf(stream, serviceformat, prefix, "method-encoding", method_name, "encoded"); if (output && output->action && *output->action) fprintf(stream, serviceformat, prefix, "method-action", method_name, output->action); else if (action) { if (*action) fprintf(stream, serviceformat, prefix, "method-action", method_name, action); else fprintf(stream, serviceformat, prefix, "method-action", method_name, "\"\""); } for (vector::const_iterator message = outfault.begin(); message != outfault.end(); ++message) { if ((*message)->message) { if ((*message)->use == literal) { for (vector::const_iterator part = (*message)->message->part.begin(); part != (*message)->message->part.end(); ++part) { if ((*part).element) fprintf(stream, serviceformat, prefix, "method-fault", method_name, types.aname(NULL, NULL, (*part).element)); else if ((*part).type) fprintf(stream, serviceformat, prefix, "method-fault", method_name, types.aname(NULL, (*message)->URI, (*part).name)); } } else { if ((*message)->message->name) fprintf(stream, serviceformat, prefix, "method-fault", method_name, (*message)->name); } if ((*message)->action) fprintf(stream, serviceformat, prefix, "method-fault-action", method_name, (*message)->action); } else if ((*message)->name) fprintf(stream, serviceformat, prefix, "method-fault", method_name, (*message)->name); } if (output->multipartRelated) { for (vector::const_iterator outputmime = output->multipartRelated->part.begin(); outputmime != output->multipartRelated->part.end(); ++outputmime) { for (vector::const_iterator outputheader = (*outputmime).soap__header_.begin(); outputheader != (*outputmime).soap__header_.end(); ++outputheader) { if ((*outputheader).part) { if ((*outputheader).use == encoded && (*outputheader).namespace_) fprintf(stream, serviceformat, prefix, "method-header-part", method_name, types.aname(NULL, (*outputheader).namespace_, (*outputheader).part)); else if ((*outputheader).partPtr() && (*outputheader).partPtr()->element) fprintf(stream, serviceformat, prefix, "method-header-part", method_name, types.aname(NULL, NULL, (*outputheader).partPtr()->element)); } } for (vector::const_iterator content = (*outputmime).content.begin(); content != (*outputmime).content.end(); ++content) if ((*content).type) fprintf(stream, serviceformat, prefix, "method-mime-type", method_name, (*content).type); } } // TODO: add headerfault directives? for (vector::const_iterator outputheader = output->header.begin(); outputheader != output->header.end(); ++outputheader) { if ((*outputheader).part) { if ((*outputheader).use == encoded && (*outputheader).namespace_) fprintf(stream, serviceformat, prefix, "method-header-part", method_name, types.aname(NULL, (*outputheader).namespace_, (*outputheader).part)); else if ((*outputheader).partPtr() && (*outputheader).partPtr()->element) fprintf(stream, serviceformat, prefix, "method-header-part", method_name, types.aname(NULL, NULL, (*outputheader).partPtr()->element)); } } for (vector::const_iterator outputwheader = output->wheader.begin(); outputwheader != output->wheader.end(); ++outputwheader) { if ((*outputwheader).element) fprintf(stream, serviceformat, prefix, "method-header-part", method_name, types.aname(NULL, NULL, (*outputwheader).element)); } fprintf(stream, "int %s(", output_name); if (flag) { if (style == rpc && output->message && (*output->message->part.begin()).name) { fprintf(stream, "\n"); fprintf(stream, anonymous ? anonformat : paraformat, types.tnamenoptr(NULL, NULL, (*output->message->part.begin()).type), cflag ? "*" : "&", types.aname(NULL, NULL, (*output->message->part.begin()).name), ""); fprintf(stream, "\t///< Output parameter"); } else output->generate(types, "", anonymous, true, true, false); } else { fprintf(stream, "\n struct %-28s%s", output_name, cflag ? "*" : "&"); fprintf(stream, "\t///< Output response struct parameter"); } fprintf(stream, "\n);\n"); } if (input && input_name) { method_name = strstr(input_name + 1, "__"); if (method_name) method_name += 2; else method_name = input_name; if (protocol) fprintf(stream, serviceformat, prefix, "method-protocol", method_name, protocol); if (input->content && input->content->type) fprintf(stream, serviceformat, prefix, "method-mime-type", method_name, input->content->type); else if (style == document) fprintf(stream, serviceformat, prefix, "method-style", method_name, "document"); else fprintf(stream, serviceformat, prefix, "method-style", method_name, "rpc"); if (output && output->content && output->content->type) fprintf(stream, serviceformat, prefix, "method-output-mime-type", method_name, output->content->type); if (!input || input->use == literal) fprintf(stream, serviceformat, prefix, "method-encoding", method_name, "literal"); else if (input->encodingStyle) fprintf(stream, serviceformat, prefix, "method-encoding", method_name, input->encodingStyle); else fprintf(stream, serviceformat, prefix, "method-encoding", method_name, "encoded"); if (output) { if (!input || input->use != output->use) { if (output->use == literal) fprintf(stream, serviceformat, prefix, "method-response-encoding", method_name, "literal"); else if (output->encodingStyle) fprintf(stream, serviceformat, prefix, "method-response-encoding", method_name, output->encodingStyle); else fprintf(stream, serviceformat, prefix, "method-response-encoding", method_name, "encoded"); } if (style == rpc && (!input || (input->URI && output->URI && *output->URI && strcmp(input->URI, output->URI)))) fprintf(stream, schemaformat, types.nsprefix(NULL, output->URI), "namespace", output->URI); } if (input && input->action && *input->action) fprintf(stream, serviceformat, prefix, "method-input-action", method_name, input->action); else if (action) { if (*action) fprintf(stream, serviceformat, prefix, "method-action", method_name, action); else fprintf(stream, serviceformat, prefix, "method-action", method_name, "\"\""); } if (output && output->action && *output->action) fprintf(stream, serviceformat, prefix, "method-output-action", method_name, output->action); for (vector::const_iterator message = outfault.begin(); message != outfault.end(); ++message) { if ((*message)->message) { if ((*message)->use == literal) { for (vector::const_iterator part = (*message)->message->part.begin(); part != (*message)->message->part.end(); ++part) { if ((*part).element) fprintf(stream, serviceformat, prefix, "method-fault", method_name, types.aname(NULL, NULL, (*part).element)); else if ((*part).type) fprintf(stream, serviceformat, prefix, "method-fault", method_name, types.aname(NULL, (*message)->URI, (*part).name)); } } else { if ((*message)->message->name) fprintf(stream, serviceformat, prefix, "method-fault", method_name, (*message)->name); } if ((*message)->action) fprintf(stream, serviceformat, prefix, "method-fault-action", method_name, (*message)->action); } else if ((*message)->name) fprintf(stream, serviceformat, prefix, "method-fault", method_name, (*message)->name); } if (input) { if (input->multipartRelated) { for (vector::const_iterator inputmime = input->multipartRelated->part.begin(); inputmime != input->multipartRelated->part.end(); ++inputmime) { for (vector::const_iterator inputheader = (*inputmime).soap__header_.begin(); inputheader != (*inputmime).soap__header_.end(); ++inputheader) { if ((*inputheader).part) { if ((*inputheader).use == encoded && (*inputheader).namespace_) fprintf(stream, serviceformat, prefix, "method-input-header-part", method_name, types.aname(NULL, (*inputheader).namespace_, (*inputheader).part)); else if ((*inputheader).partPtr() && (*inputheader).partPtr()->element) fprintf(stream, serviceformat, prefix, "method-input-header-part", method_name, types.aname(NULL, NULL, (*inputheader).partPtr()->element)); } } for (vector::const_iterator content = (*inputmime).content.begin(); content != (*inputmime).content.end(); ++content) if ((*content).type) fprintf(stream, serviceformat, prefix, "method-input-mime-type", method_name, (*content).type); } } // TODO: add headerfault directives? for (vector::const_iterator inputheader = input->header.begin(); inputheader != input->header.end(); ++inputheader) { if ((*inputheader).part) { if ((*inputheader).use == encoded && (*inputheader).namespace_) fprintf(stream, serviceformat, prefix, "method-input-header-part", method_name, types.aname(NULL, (*inputheader).namespace_, (*inputheader).part)); else if ((*inputheader).partPtr() && (*inputheader).partPtr()->element) fprintf(stream, serviceformat, prefix, "method-input-header-part", method_name, types.aname(NULL, NULL, (*inputheader).partPtr()->element)); } } for (vector::const_iterator inputwheader = input->wheader.begin(); inputwheader != input->wheader.end(); ++inputwheader) { if ((*inputwheader).element) fprintf(stream, serviceformat, prefix, "method-input-header-part", method_name, types.aname(NULL, NULL, (*inputwheader).element)); } } if (output) { if (output->multipartRelated) { for (vector::const_iterator outputmime = output->multipartRelated->part.begin(); outputmime != output->multipartRelated->part.end(); ++outputmime) { for (vector::const_iterator outputheader = (*outputmime).soap__header_.begin(); outputheader != (*outputmime).soap__header_.end(); ++outputheader) { if ((*outputheader).part) { if ((*outputheader).use == encoded && (*outputheader).namespace_) fprintf(stream, serviceformat, prefix, "method-output-header-part", method_name, types.aname(NULL, (*outputheader).namespace_, (*outputheader).part)); else if ((*outputheader).partPtr() && (*outputheader).partPtr()->element) fprintf(stream, serviceformat, prefix, "method-output-header-part", method_name, types.aname(NULL, NULL, (*outputheader).partPtr()->element)); } } for (vector::const_iterator content = (*outputmime).content.begin(); content != (*outputmime).content.end(); ++content) if ((*content).type) fprintf(stream, serviceformat, prefix, "method-output-mime-type", method_name, (*content).type); } } for (vector::const_iterator outputheader = output->header.begin(); outputheader != output->header.end(); ++outputheader) { if ((*outputheader).part) { if ((*outputheader).use == encoded && (*outputheader).namespace_) fprintf(stream, serviceformat, prefix, "method-output-header-part", method_name, types.aname(NULL, (*outputheader).namespace_, (*outputheader).part)); else if ((*outputheader).partPtr() && (*outputheader).partPtr()->element) fprintf(stream, serviceformat, prefix, "method-output-header-part", method_name, types.aname(NULL, NULL, (*outputheader).partPtr()->element)); } } for (vector::const_iterator outputwheader = output->wheader.begin(); outputwheader != output->wheader.end(); ++outputwheader) { if ((*outputwheader).element) fprintf(stream, serviceformat, prefix, "method-output-header-part", method_name, types.aname(NULL, NULL, (*outputwheader).element)); } } if (input) fprintf(stream, "int %s(", input_name); else fprintf(stream, "int %s(", output_name); if (input) input->generate(types, ",", anonymous, true, false, false); if (output) { if (flag) { if (style == rpc && output->message && (*output->message->part.begin()).name) { fprintf(stream, "\n"); fprintf(stream, anonymous ? anonformat : paraformat, types.tnamenoptr(NULL, NULL, (*output->message->part.begin()).type), cflag ? "*" : "&", types.aname(NULL, NULL, (*output->message->part.begin()).name), ""); fprintf(stream, "\t///< Output parameter"); } else output->generate(types, "", anonymous, true, true, false); } else { fprintf(stream, "\n struct %-28s%s", output_name, cflag ? "*" : "&"); fprintf(stream, "\t///< Output response struct parameter"); } fprintf(stream, "\n);\n"); } else fprintf(stream, "\n void\t///< One-way message: no output parameter\n);\n"); } } //////////////////////////////////////////////////////////////////////////////// // // Message methods // //////////////////////////////////////////////////////////////////////////////// void Message::generate(Types& types, const char *sep, bool anonymous, bool remark, bool response, bool optional) { if (message) { for (vector::const_iterator part = message->part.begin(); part != message->part.end(); ++part) { if (!(*part).name) fprintf(stderr, "\nError: no part name in message \"%s\"\n", message->name ? message->name : ""); else if (!body_parts || soap_tagsearch(body_parts, (*part).name)) { if (remark && (*part).documentation) comment("", (*part).name, "parameter", (*part).documentation); else fprintf(stream, "\n"); if ((*part).element) { if ((*part).elementPtr()) { const char *name, *type, *nameURI = NULL, *typeURI = NULL, *prefix = NULL; if (style == rpc && use == encoded) name = (*part).name; else { name = (*part).elementPtr()->name; if (style == document && (*part).elementPtr()->schemaPtr()) nameURI = (*part).elementPtr()->schemaPtr()->targetNamespace; } if ((*part).elementPtr()->type) type = (*part).elementPtr()->type; else { type = (*part).elementPtr()->name; prefix = "_"; if ((*part).elementPtr()->schemaPtr()) typeURI = (*part).elementPtr()->schemaPtr()->targetNamespace; } if ((*part).elementPtr()->xmime__expectedContentTypes) fprintf(stream, " /// MTOM attachment with content types %s\n", (*part).elementPtr()->xmime__expectedContentTypes); if (response) { const char *t; bool flag = false; if (!zflag || zflag > 6) t = types.tnamenoptr(prefix, typeURI, type); else { t = types.tname(prefix, typeURI, type); flag = (strchr(t, '*') && strcmp(t, "char*") && strcmp(t, "char *")); } fprintf(stream, anonymous ? anonformat : paraformat, t, flag ? " " : cflag ? "*" : "&", types.aname(NULL, nameURI, name), sep); if (remark) fprintf(stream, "\t///< Output parameter"); } else { fprintf(stream, anonymous ? anonformat : paraformat, types.pname(optional, false, prefix, typeURI, type), " ", types.aname(NULL, nameURI, name), sep); if (remark && *sep == ',') fprintf(stream, "\t///< Input parameter"); } } else { fprintf(stream, anonymous ? anonformat : paraformat, types.pname(optional, false, NULL, NULL, (*part).element), " ", types.aname(NULL, NULL, (*part).element), sep); if (remark) fprintf(stream, "\t///< @todo Check element type (imported type)"); } } else if ((*part).type) { if (response) { const char *t; bool flag = false; if (!zflag || zflag > 6) t = types.tnamenoptr(NULL, NULL, (*part).type); else { t = types.tname(NULL, NULL, (*part).type); flag = (strchr(t, '*') && strcmp(t, "char*") && strcmp(t, "char *")); } fprintf(stream, anonymous ? anonformat : paraformat, t, flag ? " " : cflag ? "*" : "&", types.aname(NULL, NULL, (*part).name), sep); if (remark) fprintf(stream, "\t///< Output parameter"); } else { fprintf(stream, anonymous ? anonformat : paraformat, types.pname(optional, false, NULL, NULL, (*part).type), " ", types.aname(NULL, NULL, (*part).name), sep); if (remark && *sep == ',') fprintf(stream, "\t///< Input parameter"); } } else fprintf(stderr, "\nError: no wsdl:definitions/message/part/@type in part \"%s\"\n", (*part).name); } } } else if (element) // WSDL 2.0 { const char *prefix = NULL; const char *URI = NULL; const char *name = element->name; const char *type = element->type; if (!type) { type = name; prefix = "_"; } if (element->schemaPtr()) URI = element->schemaPtr()->targetNamespace; if (response) { const char *t; bool flag = false; if (!zflag || zflag > 6) t = types.tnamenoptr(prefix, URI, type); else { t = types.tname(prefix, URI, type); flag = (strchr(t, '*') && strcmp(t, "char*") && strcmp(t, "char *")); } fprintf(stream, "\n"); fprintf(stream, paraformat, t, flag ? " " : cflag ? "*" : "&", anonymous ? "" : types.aname(NULL, URI, name), sep); if (remark) fprintf(stream, "\t///< Output parameter"); } else if (style == document || element->simpleTypePtr()) { // WSDL 2.0 document style fprintf(stream, "\n"); fprintf(stream, anonymous ? anonformat : paraformat, types.pname(optional, false, prefix, URI, type), " ", types.aname(NULL, URI, name), sep); if (remark && *sep == ',') fprintf(stream, "\t///< Input parameter"); } else if (element->complexTypePtr()) { // WSDL 2.0 RPC style xs__seqchoice *seq = element->complexTypePtr()->sequence; for (vector::const_iterator i = seq->__contents.begin(); i != seq->__contents.end(); ++i) { if ((*i).__union == SOAP_UNION_xs__union_content_element) { name = (*i).__content.element->name; type = (*i).__content.element->type; if (!type) type = name; fprintf(stream, "\n"); fprintf(stream, anonymous ? anonformat : paraformat, types.pname(optional, false, prefix, URI, type), " ", types.aname(NULL, NULL, name), sep); if (remark && *sep == ',') fprintf(stream, "\t///< Input parameter"); } } } } } //////////////////////////////////////////////////////////////////////////////// // // Miscellaneous // //////////////////////////////////////////////////////////////////////////////// static const char *urienc(struct soap *soap, const char *uri) { const char *r, *s; char *t; size_t n = 0; if (!uri) return NULL; for (s = uri; *s; s++) if (!URI_CHAR(*s)) n++; if (!n) return uri; n = strlen(uri) + 2*n; r = t = (char*)soap_malloc(soap, n + 1); if (r) { for (s = uri; *s; s++) { if (URI_CHAR(*s)) *t++ = *s; else { (SOAP_SNPRINTF(t, n + 1 - (t - r), 3), "%%%2.2x", *s); t += 3; } } *t = '\0'; } return r; } static bool imported(const char *tag) { if (!tag || *tag != '"') return false; for (SetOfString::const_iterator u = exturis.begin(); u != exturis.end(); ++u) { size_t n = strlen(*u); if (!strncmp(*u, tag + 1, n) && tag[n+1] == '"') return true; } return false; } static void comment(const char *start, const char *middle, const char *end, const char *text) { if (text) { if (strchr(text, '\r') || strchr(text, '\n')) fprintf(stream, "\n/** %s %s %s documentation:\n%s\n*/\n\n", start, middle, end, text); else fprintf(stream, "\n/// %s %s %s: %s\n", start, middle, end, text); } } static void page(const char *page, const char *title, const char *text) { if (text) fprintf(stream, "\n@page %s%s \"%s\"\n", page, title, text); else fprintf(stream, "\n@page %s%s\n", page, title); } static void section(const char *section, const char *title, const char *text) { if (text) fprintf(stream, "\n@section %s%s \"%s\"\n", section, title, text); else fprintf(stream, "\n@section %s%s\n", section, title); } static void banner(const char *text1, const char *text2) { int i; if (!text1) return; fprintf(stream, "\n/"); for (i = 0; i < 78; i++) fputc('*', stream); if (text2) fprintf(stream, "\\\n *%76s*\n * %-75s*\n * %-73s*\n *%76s*\n\\", "", text1, text2, ""); else fprintf(stream, "\\\n *%76s*\n * %-75s*\n *%76s*\n\\", "", text1, ""); for (i = 0; i < 78; i++) fputc('*', stream); fprintf(stream, "/\n\n"); if (vflag) fprintf(stderr, "\n----<< %s: %s >>----\n\n", text1, text2 ? text2 : ""); } static void ident() { time_t t = time(NULL), *p = &t; char tmp[256]; int i; strftime(tmp, 256, "%Y-%m-%d %H:%M:%S GMT", gmtime(p)); fprintf(stream, "/* %s\n Generated by wsdl2h " WSDL2H_VERSION " from ", outfile ? outfile : ""); if (infiles) { for (i = 0; i < infiles; i++) fprintf(stream, "%s ", infile[i]); } else fprintf(stream, "(stdin) "); fprintf(stream, "and %s\n\ %s\n\n\ DO NOT INCLUDE THIS FILE DIRECTLY INTO YOUR PROJECT BUILDS\n\ USE THE soapcpp2-GENERATED SOURCE CODE FILES FOR YOUR PROJECT BUILDS\n\n\ gSOAP XML Web services tools\n\ Copyright (C) 2000-2016, Robert van Engelen, Genivia Inc. All Rights Reserved.\n\ This program is released under the GPL with the additional exemption that\n\ compiling, linking, and/or using OpenSSL is allowed.\n\ --------------------------------------------------------------------------------\n\ A commercial use license is available from Genivia Inc., contact@genivia.com\n\ --------------------------------------------------------------------------------\n\ */\n\n", mapfile, tmp); } void text(const char *text) { const char *s; if (!text) return; size_t k = 0; for (s = text; *s; s++, k++) { switch (*s) { case '\n': if (k) { fputc('\n', stream); k = 0; } break; case '\t': k = 8 * ((k + 8) / 8) - 1; fputc('\t', stream); break; case '/': fputc(*s, stream); if (s[1] == '*') fputc(' ', stream); break; case '*': fputc(*s, stream); if (s[1] == '/') fputc(' ', stream); break; case ' ': if (k >= 79) { fputc('\n', stream); k = 0; } else fputc(' ', stream); break; default: if (*s >= 32) fputc(*s, stream); } } if (k) fputc('\n', stream); } //////////////////////////////////////////////////////////////////////////////// // // WS-Policy // //////////////////////////////////////////////////////////////////////////////// static void gen_policy(Service& service, const vector& policy, const char *text, Types& types) { if (!policy.empty()) { fprintf(stream, "\n - WS-Policy applicable to the %s:\n", text); for (vector::const_iterator p = policy.begin(); p != policy.end(); ++p) if (*p) (*p)->generate(service, types, 0); } } static void gen_policy_enablers(const Service& service) { fprintf(stream, "\n/**\n"); page(service.name, " Binding", service.name); section(service.name, "_policy_enablers Policy Enablers of Binding", service.name); if (service.imports.empty()) { fprintf(stream, "\nNone specified.\n\n*/\n"); return; } fprintf(stream, "\nBased on policies and protocol requirements, this service requires importing"); for (VectorOfString::const_iterator i = service.imports.begin(); i != service.imports.end(); ++i) fprintf(stream, " \"%s\"", *i); fprintf(stream, "\n\n - WS-Policy reminders and enablers (when applicable):\n"); fprintf(stream, " - WS-Addressing 1.0 (2005/08, accepts 2004/08):\n\t@code\n\t#import \"wsa5.h\" // to be added to this header file for the soapcpp2 build step\n\t@endcode\n\t@code\n\t#include \"plugin/wsaapi.h\"\n\tsoap_register_plugin(soap, soap_wsa); // register the wsa plugin in your code\n\t// See the user guide gsoap/doc/wsa/html/index.html\n\t@endcode\n"); fprintf(stream, " - WS-Addressing (2004/08):\n\t@code\n\t#import \"wsa.h\" // to be added to this header file for the soapcpp2 build step\n\t@endcode\n\t@code\n\t#include \"plugin/wsaapi.h\"\n\tsoap_register_plugin(soap, soap_wsa); // register the wsa plugin in your code\n\t// See the user guide gsoap/doc/wsa/html/index.html\n\t@endcode\n"); fprintf(stream, " - WS-ReliableMessaging 1.0:\n\t@code\n\t#import \"wsrm5.h\" // to be added to this header file for the soapcpp2 build step\n\t@endcode\n\t@code\n\t#include \"plugin/wsrmapi.h\"\n\tsoap_register_plugin(soap, soap_wsa); // register the wsa plugin in your code\n\tsoap_register_plugin(soap, soap_wsrm); // register the wsrm plugin in your code\n\t// See the user guide gsoap/doc/wsrm/html/index.html\n\t@endcode\n"); fprintf(stream, " - WS-ReliableMessaging 1.1:\n\t@code\n\t#import \"wsrm.h\" // to be added to this header file for the soapcpp2 build step\n\t@endcode\n\t@code\n\t#include \"plugin/wsrmapi.h\"\n\tsoap_register_plugin(soap, soap_wsa); // register the wsa plugin in your code\n\tsoap_register_plugin(soap, soap_wsrm); // register the wsrm plugin in your code\n\t// See the user guide gsoap/doc/wsrm/html/index.html\n\t@endcode\n"); fprintf(stream, " - WS-Discovery 1.0:\n\t@code\n\t#import \"wsrm5.h\" // to be added to this header file for the soapcpp2 build step\n\t@endcode\n\t@code\n\t#include \"plugin/wsddapi.h\" // See the user guide gsoap/doc/wsdd/html/index.html\n\t@endcode\n"); fprintf(stream, " - WS-Discovery 1.1:\n\t@code\n\t#import \"wsrm.h\" // to be added to this header file for the soapcpp2 build step\n\t@endcode\n\t@code\n\t#include \"plugin/wsddapi.h\" // See the user guide gsoap/doc/wsdd/html/index.html\n\t@endcode\n"); fprintf(stream, " - WS-Security (SOAP Message Security) 1.0 (accepts 1.1):\n\t@code\n\t#import \"wsse.h\" // to be added to this header file for the soapcpp2 build step\n\t@endcode\n\t@code\n\t#include \"plugin/wsseapi.h\"\n\tsoap_register_plugin(soap, soap_wsse); // register the wsse plugin in your code\n\t// See the user guide gsoap/doc/wsse/html/index.html\n\t@endcode\n"); fprintf(stream, " - WS-Security (SOAP Message Security) 1.1 (accepts 1.0):\n\t@code\n\t#import \"wsse11.h\" // to be added to this header file for the soapcpp2 build step\n\t@endcode\n\t@code\n\t#include \"plugin/wsseapi.h\"\n\tsoap_register_plugin(soap, soap_wsse); // register the wsse plugin in your code\n\t// See the user guide gsoap/doc/wsse/html/index.html\n\t@endcode\n"); fprintf(stream, " - HTTP Digest Authentication:\n\t@code\n\t#include \"plugin/httpda.h\"\n\tsoap_register_plugin(soap, soap_http_da); // register the HTTP DA plugin in your code\n\t// See the user guide gsoap/doc/httpda/html/index.html\n\t@endcode\n"); fprintf(stream, "*/\n\n"); for (VectorOfString::const_iterator i = service.imports.begin(); i != service.imports.end(); ++i) fprintf(stream, "#import \"%s\"\n", *i); } //////////////////////////////////////////////////////////////////////////////// // // BPEL 2.0 // //////////////////////////////////////////////////////////////////////////////// static void gen_plnk(const Service& service) { if (!service.role.empty()) { for (vector::const_iterator r = service.role.begin(); r != service.role.end(); ++r) { if (*r && (*r)->portTypePtr() && (*r)->plnkPtr()) { fprintf(stream, "\n - \"%s\" role \"%s\" port type \"%s\" operations.\n", (*r)->plnkPtr()->name, (*r)->portTypePtr()->name, (*r)->name); text((*r)->documentation); text((*r)->plnkPtr()->documentation); } } } } static void gen_vprop(const wsdl__definitions& definitions, Types& types) { if (!definitions.vprop__property.empty()) { banner("BPEL 2.0 Variables"); fprintf(stream, "/**\n"); page("page_bpel", " BPEL 2.0 Variables", NULL); for (vector::const_iterator i1 = definitions.vprop__property.begin(); i1 != definitions.vprop__property.end(); ++i1) { if ((*i1).name) { fprintf(stream, "\nBPEL 2.0 Variable \"%s\"\n", (*i1).name); text((*i1).documentation); fprintf(stream, "\n"); for (vector::const_iterator j = definitions.vprop__propertyAlias.begin(); j != definitions.vprop__propertyAlias.end(); ++j) { if ((*j).vpropPtr() == &(*i1) && (*j).query && (*j).query->__mixed) { if ((*j).messageType) { if ((*j).type) fprintf(stream, " - Variable property alias for message %s/%s of type %s.\n", (*j).messageType, (*j).part, (*j).type); else if ((*j).element) fprintf(stream, " - Variable property alias for message %s/%s element %s.\n", (*j).messageType, (*j).part, (*j).element); } else fprintf(stream, " - Variable property alias.\n"); text((*j).documentation); if ((*j).type) fprintf(stream, " XPath %s: %s\n", types.tname(NULL, NULL, (*j).type), (*j).query->__mixed); else if ((*j).element) fprintf(stream, " XPath %s: %s\n", types.tname(NULL, NULL, (*j).element), (*j).query->__mixed); } } } } fprintf(stream, "*/\n\n"); for (vector::const_iterator i2 = definitions.vprop__property.begin(); i2 != definitions.vprop__property.end(); ++i2) { if ((*i2).name) { for (vector::const_iterator j = definitions.vprop__propertyAlias.begin(); j != definitions.vprop__propertyAlias.end(); ++j) { if ((*j).vpropPtr() == &(*i2) && (*j).query && (*j).query->__mixed) { if ((*j).type) fprintf(stream, "//xpath %s %s\n", types.tname(NULL, NULL, (*j).type), (*j).query->__mixed); else if ((*j).element) fprintf(stream, "//xpath %s %s\n", types.tname(NULL, NULL, (*j).element), (*j).query->__mixed); } } if ((*i2).type) fprintf(stream, elementformat, types.tname(NULL, NULL, (*i2).type), types.aname(NULL, NULL, (*i2).name)); else if ((*i2).element) fprintf(stream, elementformat, types.tname(NULL, NULL, (*i2).element), types.aname(NULL, NULL, (*i2).name)); fprintf(stream, ";\n"); } } fprintf(stream, "\n"); } } gsoap-2.8.28/gsoap/wsdl/Makefile.in0000644000175000017500000011300112653650160016413 0ustar ellertellert# Makefile.in generated by automake 1.14 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ ####### This is the input file for automake, which will generate Makefile.in ########## VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ bin_PROGRAMS = wsdl2h$(EXEEXT) subdir = gsoap/wsdl DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" PROGRAMS = $(bin_PROGRAMS) am__objects_1 = wsdl2h-wsdlC.$(OBJEXT) am_wsdl2h_OBJECTS = wsdl2h-wsdl2h.$(OBJEXT) wsdl2h-wsdl.$(OBJEXT) \ wsdl2h-schema.$(OBJEXT) wsdl2h-types.$(OBJEXT) \ wsdl2h-service.$(OBJEXT) wsdl2h-soap.$(OBJEXT) \ wsdl2h-mime.$(OBJEXT) wsdl2h-wsp.$(OBJEXT) \ wsdl2h-bpel.$(OBJEXT) $(am__objects_1) wsdl2h_OBJECTS = $(am_wsdl2h_OBJECTS) am__DEPENDENCIES_1 = wsdl2h_DEPENDENCIES = $(SOAP_CPP_LIB) $(am__DEPENDENCIES_1) wsdl2h_LINK = $(CXXLD) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = SOURCES = $(wsdl2h_SOURCES) DIST_SOURCES = $(wsdl2h_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ STRIP = @STRIP@ VERSION = @VERSION@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = foreign 1.4 # INCLUDES=-I$(top_srcdir)/gsoap # AM_LDFLAGS=$(INCLUDES) -I$(srcdir) -L$(srcdir) AM_LDFLAGS = -L$(srcdir) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin AM_CPPFLAGS = -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin SOAP = $(top_builddir)/gsoap/src/soapcpp2$(EXEEXT) SOAP_CPP_LIB = $(top_builddir)/gsoap/$(WSDL2H_SOAP_CPP_LIB) SOAP_CPP_SRC = wsdlC.cpp SOAPHEADER = $(srcdir)/wsdl.h SOAP_FLAGS = -SC -pwsdl -I$(srcdir) -I$(top_srcdir)/gsoap/import BUILT_SOURCES = $(SOAP_CPP_SRC) wsdl2h_CFLAGS = $(C_DEBUG_FLAGS) $(WSDL2H_EXTRA_FLAGS) wsdl2h_CXXFLAGS = $(C_DEBUG_FLAGS) $(WSDL2H_EXTRA_FLAGS) $(WSDL2H_IMPORTPATH) wsdl2h_CPPFLAGS = $(AM_CPPFLAGS) $(SOAPCPP2_NONAMESPACES) -D$(platform) wsdl2h_SOURCES = wsdl2h.cpp wsdl.cpp schema.cpp types.cpp service.cpp soap.cpp mime.cpp wsp.cpp bpel.cpp $(SOAP_CPP_SRC) wsdl2h_LDADD = $(SOAP_CPP_LIB) $(WSDL2H_EXTRA_LIBS) CLEANFILES = *~ *C.cpp *H.h *Stub.h *.nsmap all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/wsdl/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/wsdl/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) wsdl2h$(EXEEXT): $(wsdl2h_OBJECTS) $(wsdl2h_DEPENDENCIES) $(EXTRA_wsdl2h_DEPENDENCIES) @rm -f wsdl2h$(EXEEXT) $(AM_V_CXXLD)$(wsdl2h_LINK) $(wsdl2h_OBJECTS) $(wsdl2h_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsdl2h-bpel.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsdl2h-mime.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsdl2h-schema.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsdl2h-service.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsdl2h-soap.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsdl2h-types.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsdl2h-wsdl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsdl2h-wsdl2h.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsdl2h-wsdlC.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsdl2h-wsp.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` wsdl2h-wsdl2h.o: wsdl2h.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -MT wsdl2h-wsdl2h.o -MD -MP -MF $(DEPDIR)/wsdl2h-wsdl2h.Tpo -c -o wsdl2h-wsdl2h.o `test -f 'wsdl2h.cpp' || echo '$(srcdir)/'`wsdl2h.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsdl2h-wsdl2h.Tpo $(DEPDIR)/wsdl2h-wsdl2h.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='wsdl2h.cpp' object='wsdl2h-wsdl2h.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -c -o wsdl2h-wsdl2h.o `test -f 'wsdl2h.cpp' || echo '$(srcdir)/'`wsdl2h.cpp wsdl2h-wsdl2h.obj: wsdl2h.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -MT wsdl2h-wsdl2h.obj -MD -MP -MF $(DEPDIR)/wsdl2h-wsdl2h.Tpo -c -o wsdl2h-wsdl2h.obj `if test -f 'wsdl2h.cpp'; then $(CYGPATH_W) 'wsdl2h.cpp'; else $(CYGPATH_W) '$(srcdir)/wsdl2h.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsdl2h-wsdl2h.Tpo $(DEPDIR)/wsdl2h-wsdl2h.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='wsdl2h.cpp' object='wsdl2h-wsdl2h.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -c -o wsdl2h-wsdl2h.obj `if test -f 'wsdl2h.cpp'; then $(CYGPATH_W) 'wsdl2h.cpp'; else $(CYGPATH_W) '$(srcdir)/wsdl2h.cpp'; fi` wsdl2h-wsdl.o: wsdl.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -MT wsdl2h-wsdl.o -MD -MP -MF $(DEPDIR)/wsdl2h-wsdl.Tpo -c -o wsdl2h-wsdl.o `test -f 'wsdl.cpp' || echo '$(srcdir)/'`wsdl.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsdl2h-wsdl.Tpo $(DEPDIR)/wsdl2h-wsdl.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='wsdl.cpp' object='wsdl2h-wsdl.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -c -o wsdl2h-wsdl.o `test -f 'wsdl.cpp' || echo '$(srcdir)/'`wsdl.cpp wsdl2h-wsdl.obj: wsdl.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -MT wsdl2h-wsdl.obj -MD -MP -MF $(DEPDIR)/wsdl2h-wsdl.Tpo -c -o wsdl2h-wsdl.obj `if test -f 'wsdl.cpp'; then $(CYGPATH_W) 'wsdl.cpp'; else $(CYGPATH_W) '$(srcdir)/wsdl.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsdl2h-wsdl.Tpo $(DEPDIR)/wsdl2h-wsdl.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='wsdl.cpp' object='wsdl2h-wsdl.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -c -o wsdl2h-wsdl.obj `if test -f 'wsdl.cpp'; then $(CYGPATH_W) 'wsdl.cpp'; else $(CYGPATH_W) '$(srcdir)/wsdl.cpp'; fi` wsdl2h-schema.o: schema.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -MT wsdl2h-schema.o -MD -MP -MF $(DEPDIR)/wsdl2h-schema.Tpo -c -o wsdl2h-schema.o `test -f 'schema.cpp' || echo '$(srcdir)/'`schema.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsdl2h-schema.Tpo $(DEPDIR)/wsdl2h-schema.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='schema.cpp' object='wsdl2h-schema.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -c -o wsdl2h-schema.o `test -f 'schema.cpp' || echo '$(srcdir)/'`schema.cpp wsdl2h-schema.obj: schema.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -MT wsdl2h-schema.obj -MD -MP -MF $(DEPDIR)/wsdl2h-schema.Tpo -c -o wsdl2h-schema.obj `if test -f 'schema.cpp'; then $(CYGPATH_W) 'schema.cpp'; else $(CYGPATH_W) '$(srcdir)/schema.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsdl2h-schema.Tpo $(DEPDIR)/wsdl2h-schema.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='schema.cpp' object='wsdl2h-schema.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -c -o wsdl2h-schema.obj `if test -f 'schema.cpp'; then $(CYGPATH_W) 'schema.cpp'; else $(CYGPATH_W) '$(srcdir)/schema.cpp'; fi` wsdl2h-types.o: types.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -MT wsdl2h-types.o -MD -MP -MF $(DEPDIR)/wsdl2h-types.Tpo -c -o wsdl2h-types.o `test -f 'types.cpp' || echo '$(srcdir)/'`types.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsdl2h-types.Tpo $(DEPDIR)/wsdl2h-types.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='types.cpp' object='wsdl2h-types.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -c -o wsdl2h-types.o `test -f 'types.cpp' || echo '$(srcdir)/'`types.cpp wsdl2h-types.obj: types.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -MT wsdl2h-types.obj -MD -MP -MF $(DEPDIR)/wsdl2h-types.Tpo -c -o wsdl2h-types.obj `if test -f 'types.cpp'; then $(CYGPATH_W) 'types.cpp'; else $(CYGPATH_W) '$(srcdir)/types.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsdl2h-types.Tpo $(DEPDIR)/wsdl2h-types.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='types.cpp' object='wsdl2h-types.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -c -o wsdl2h-types.obj `if test -f 'types.cpp'; then $(CYGPATH_W) 'types.cpp'; else $(CYGPATH_W) '$(srcdir)/types.cpp'; fi` wsdl2h-service.o: service.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -MT wsdl2h-service.o -MD -MP -MF $(DEPDIR)/wsdl2h-service.Tpo -c -o wsdl2h-service.o `test -f 'service.cpp' || echo '$(srcdir)/'`service.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsdl2h-service.Tpo $(DEPDIR)/wsdl2h-service.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='service.cpp' object='wsdl2h-service.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -c -o wsdl2h-service.o `test -f 'service.cpp' || echo '$(srcdir)/'`service.cpp wsdl2h-service.obj: service.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -MT wsdl2h-service.obj -MD -MP -MF $(DEPDIR)/wsdl2h-service.Tpo -c -o wsdl2h-service.obj `if test -f 'service.cpp'; then $(CYGPATH_W) 'service.cpp'; else $(CYGPATH_W) '$(srcdir)/service.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsdl2h-service.Tpo $(DEPDIR)/wsdl2h-service.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='service.cpp' object='wsdl2h-service.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -c -o wsdl2h-service.obj `if test -f 'service.cpp'; then $(CYGPATH_W) 'service.cpp'; else $(CYGPATH_W) '$(srcdir)/service.cpp'; fi` wsdl2h-soap.o: soap.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -MT wsdl2h-soap.o -MD -MP -MF $(DEPDIR)/wsdl2h-soap.Tpo -c -o wsdl2h-soap.o `test -f 'soap.cpp' || echo '$(srcdir)/'`soap.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsdl2h-soap.Tpo $(DEPDIR)/wsdl2h-soap.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soap.cpp' object='wsdl2h-soap.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -c -o wsdl2h-soap.o `test -f 'soap.cpp' || echo '$(srcdir)/'`soap.cpp wsdl2h-soap.obj: soap.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -MT wsdl2h-soap.obj -MD -MP -MF $(DEPDIR)/wsdl2h-soap.Tpo -c -o wsdl2h-soap.obj `if test -f 'soap.cpp'; then $(CYGPATH_W) 'soap.cpp'; else $(CYGPATH_W) '$(srcdir)/soap.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsdl2h-soap.Tpo $(DEPDIR)/wsdl2h-soap.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soap.cpp' object='wsdl2h-soap.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -c -o wsdl2h-soap.obj `if test -f 'soap.cpp'; then $(CYGPATH_W) 'soap.cpp'; else $(CYGPATH_W) '$(srcdir)/soap.cpp'; fi` wsdl2h-mime.o: mime.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -MT wsdl2h-mime.o -MD -MP -MF $(DEPDIR)/wsdl2h-mime.Tpo -c -o wsdl2h-mime.o `test -f 'mime.cpp' || echo '$(srcdir)/'`mime.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsdl2h-mime.Tpo $(DEPDIR)/wsdl2h-mime.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mime.cpp' object='wsdl2h-mime.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -c -o wsdl2h-mime.o `test -f 'mime.cpp' || echo '$(srcdir)/'`mime.cpp wsdl2h-mime.obj: mime.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -MT wsdl2h-mime.obj -MD -MP -MF $(DEPDIR)/wsdl2h-mime.Tpo -c -o wsdl2h-mime.obj `if test -f 'mime.cpp'; then $(CYGPATH_W) 'mime.cpp'; else $(CYGPATH_W) '$(srcdir)/mime.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsdl2h-mime.Tpo $(DEPDIR)/wsdl2h-mime.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mime.cpp' object='wsdl2h-mime.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -c -o wsdl2h-mime.obj `if test -f 'mime.cpp'; then $(CYGPATH_W) 'mime.cpp'; else $(CYGPATH_W) '$(srcdir)/mime.cpp'; fi` wsdl2h-wsp.o: wsp.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -MT wsdl2h-wsp.o -MD -MP -MF $(DEPDIR)/wsdl2h-wsp.Tpo -c -o wsdl2h-wsp.o `test -f 'wsp.cpp' || echo '$(srcdir)/'`wsp.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsdl2h-wsp.Tpo $(DEPDIR)/wsdl2h-wsp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='wsp.cpp' object='wsdl2h-wsp.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -c -o wsdl2h-wsp.o `test -f 'wsp.cpp' || echo '$(srcdir)/'`wsp.cpp wsdl2h-wsp.obj: wsp.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -MT wsdl2h-wsp.obj -MD -MP -MF $(DEPDIR)/wsdl2h-wsp.Tpo -c -o wsdl2h-wsp.obj `if test -f 'wsp.cpp'; then $(CYGPATH_W) 'wsp.cpp'; else $(CYGPATH_W) '$(srcdir)/wsp.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsdl2h-wsp.Tpo $(DEPDIR)/wsdl2h-wsp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='wsp.cpp' object='wsdl2h-wsp.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -c -o wsdl2h-wsp.obj `if test -f 'wsp.cpp'; then $(CYGPATH_W) 'wsp.cpp'; else $(CYGPATH_W) '$(srcdir)/wsp.cpp'; fi` wsdl2h-bpel.o: bpel.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -MT wsdl2h-bpel.o -MD -MP -MF $(DEPDIR)/wsdl2h-bpel.Tpo -c -o wsdl2h-bpel.o `test -f 'bpel.cpp' || echo '$(srcdir)/'`bpel.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsdl2h-bpel.Tpo $(DEPDIR)/wsdl2h-bpel.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='bpel.cpp' object='wsdl2h-bpel.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -c -o wsdl2h-bpel.o `test -f 'bpel.cpp' || echo '$(srcdir)/'`bpel.cpp wsdl2h-bpel.obj: bpel.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -MT wsdl2h-bpel.obj -MD -MP -MF $(DEPDIR)/wsdl2h-bpel.Tpo -c -o wsdl2h-bpel.obj `if test -f 'bpel.cpp'; then $(CYGPATH_W) 'bpel.cpp'; else $(CYGPATH_W) '$(srcdir)/bpel.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsdl2h-bpel.Tpo $(DEPDIR)/wsdl2h-bpel.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='bpel.cpp' object='wsdl2h-bpel.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -c -o wsdl2h-bpel.obj `if test -f 'bpel.cpp'; then $(CYGPATH_W) 'bpel.cpp'; else $(CYGPATH_W) '$(srcdir)/bpel.cpp'; fi` wsdl2h-wsdlC.o: wsdlC.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -MT wsdl2h-wsdlC.o -MD -MP -MF $(DEPDIR)/wsdl2h-wsdlC.Tpo -c -o wsdl2h-wsdlC.o `test -f 'wsdlC.cpp' || echo '$(srcdir)/'`wsdlC.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsdl2h-wsdlC.Tpo $(DEPDIR)/wsdl2h-wsdlC.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='wsdlC.cpp' object='wsdl2h-wsdlC.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -c -o wsdl2h-wsdlC.o `test -f 'wsdlC.cpp' || echo '$(srcdir)/'`wsdlC.cpp wsdl2h-wsdlC.obj: wsdlC.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -MT wsdl2h-wsdlC.obj -MD -MP -MF $(DEPDIR)/wsdl2h-wsdlC.Tpo -c -o wsdl2h-wsdlC.obj `if test -f 'wsdlC.cpp'; then $(CYGPATH_W) 'wsdlC.cpp'; else $(CYGPATH_W) '$(srcdir)/wsdlC.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsdl2h-wsdlC.Tpo $(DEPDIR)/wsdl2h-wsdlC.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='wsdlC.cpp' object='wsdl2h-wsdlC.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -c -o wsdl2h-wsdlC.obj `if test -f 'wsdlC.cpp'; then $(CYGPATH_W) 'wsdlC.cpp'; else $(CYGPATH_W) '$(srcdir)/wsdlC.cpp'; fi` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: for dir in "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-binPROGRAMS clean-generic mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ clean-binPROGRAMS clean-generic cscopelist-am ctags ctags-am \ distclean distclean-compile distclean-generic distclean-tags \ distdir dvi dvi-am html html-am info info-am install \ install-am install-binPROGRAMS install-data install-data-am \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic pdf pdf-am \ ps ps-am tags tags-am uninstall uninstall-am \ uninstall-binPROGRAMS # WSDL2H_EXTRA_FLAGS=-DWITH_OPENSSL -DWITH_GZIP # defined in configure.in # WSDL2H_EXTRA_LIBS=-lssl -lcrypto -lz # defined in configure.in $(SOAP_CPP_SRC) : $(SOAPHEADER) $(SOAP) $(SOAP_FLAGS) $(SOAPHEADER) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.28/gsoap/wsdl/wsrmp.h0000644000175000017500000000401212653650160015670 0ustar ellertellert/* wsrmp.h WS-ReliableMessaging Policy -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2010, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap wsrmp schema documentation: WS-ReliableMessaging Policy binding //gsoap wsrmp schema namespace: http://schemas.xmlsoap.org/ws/2005/02/rm/policy //gsoap wsrmp schema elementForm: qualified //gsoap wsrmp schema attributeForm: unqualified #import "imports.h" class wsrmp__Timeout { public: @char *Milliseconds; }; class wsrmp__RMAssertion : public wsp__Assertion { public: wsrmp__Timeout *InactivityTimeout; wsrmp__Timeout *BaseRetransmissionInterval;; wsrmp__Timeout *AcknowledgementInterval; char *ExponentialBackoff; // TODO: WCF netrmp extension elements go here, as necessary }; gsoap-2.8.28/gsoap/wsdl/wst.h0000644000175000017500000000323212653650160015340 0ustar ellertellert/* wst.h WS-Trust -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap wst schema documentation: WS-Trust //gsoap wst schema namespace: http://docs.oasis-open.org/ws-sx/ws-trust/200512 //gsoap wst schema elementForm: qualified //gsoap wst schema attributeForm: unqualified class wst__Claims { public: @xsd__string Dialect; xsd__string __item; }; gsoap-2.8.28/gsoap/wsdl/typemap.dat0000644000175000017500000004363512653650160016536 0ustar ellertellert# typemap.dat # Use this file to define namespace prefix and type bindings for # the generated header files by the 'wsdl2h' tool. typemap.dat is the # default file processed by 'wsdl2h' to customize its output. You can use # wsdl2h option -t to specify an alternate file. ####### XML NAMESPACE BINDINGS # XML namespace prefix bindings can be provided to override the default # choice of the ns1, ns2, ... prefixes generated by wsdl2h. It is highly # recommended to provide namespace prefixes for your project's XML # namespaces. In this way, changes to the WSDL (or newer releases of # wsdl2h) will have a minimal impact on coding. # Bindings for namespace prefixes are of the form: # prefix = "URI" ####### XSD TYPE BINDINGS # Type bindings can be provided to bind XML schema types to C/C++ # types for your project. # Type bindings are of the form: # prefix__type = declaration | use | ptr-use # where 'prefix__type' is the C/C++-translation of the schema type, # 'declaration' introduces the type in the header file, the optional # 'use' specifies how the type is used directly, and the optional # 'ptr-use' specifies how the type is used as a pointer type. # For example, to use wide stirngs in C: # xsd__string = | wchar_t* | wchar_t* # which replaced the default char* mapping in C of xsd:string. # To use C++ std::wstring for xsd:string: # xsd__string = | std::wstring # After enabling one of these lines, all XSD strings will be remapped. # Note that the 'declaration' part is empty in these case as expected. # # When a type binding requires only the usage to be changed and the # declaration part must be kept intact, then the declaration part can be # replaced by elipsis ..., as in: # prefix__type = ... | use | ptr-use # This ensure that the wsdl2h-generated type definition is preserved, # while the use and ptr-use are remapped. # For example, this is useful to map schema polymorphic types to C types, # where we need to be able to both handle a base type and its extensions # as per schema extensibility. Say base type ns:base allows derived # extensions and we need to map this to C types as follows: # ns__base = ... | int __type_base; void* # where __type_base and void* are used to (de)serialize any data type, # including base and its derived types. ####### CLASS/STRUCT MEMBER ADDITIONS # Additional data and function members can be provided to extend a # wsdl2h-generated struct or class. # Class and struct extensions are of the form: # prefix__type = $ member-declaration # For example, to add a constructor and destructor to class myns__record: # myns__record = $ myns__record(); # myns__record = $ ~myns__record(); ####### TYPE EQUIVALENCES # Type equivalence mappings can be given to map a type to another type: # prefix__type1 == prefix__type2 # which replaces 'prefix__type1' by 'prefix__type2' in the wsdl2h output. # For example: # SOAP_ENC__boolean == xsd__boolean # which replaces 'SOAP_ENC__boolean' with the C/C++ type information that # corresponds to `xsd__boolean' which is 'bool' for C++. # Target C/C++ type names (names without prefix) can also be replaced: # float == double # which replaces all 'float' with 'double' in the wsdl2h output. Beware # that replacement types may lead to xsi:type mismatches and SOAP # encoding id-ref mismatches when parsing inbound XML messages. ####### BUILT-IN VARIABLES # The variable '$CONTAINER' defines the container to emit in the # generated declarations, which is std::vector by default. # For example: # $CONTAINER = std::list # The variable '$POINTER' defines the smart pointer to emit in the # generated declarations, replacing '*'. For example: # $POINTER = std::shared_ptr # Not all pointers in the generated output can be replaced by smart # pointers when standard pointers are used as union members and pointers # to arrays. ####### USER-DEFINED CONTENT # Any other content to be included in the generated header file can be # provided by enclosing it within brackets [ and ]. These brackets MUST # appear at the start of a new line. # For example, to add an #import directive to the wsdl2h-generated output: # [ # #import "wsa5.h" # ] #------------------------------------------------------------------------------- #gSOAP XML Web services tools #Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc. All Rights Reserved. #This software is released under one of the following two licenses: #GPL or Genivia's license for commercial use. #------------------------------------------------------------------------------- #A commercial use license is available from Genivia, Inc., contact@genivia.com #------------------------------------------------------------------------------- [ // Reminder: Modify typemap.dat to customize the header file generated by wsdl2h ] # Remember: type bindings are given on a single line (use \ to continue # with the next line). Here is an example binding for the XSD int type # that maps to an 'int': # xsd__int = | int # To use regular char* strings instead of std::string, use: # xsd__string = | char* | char* # For char* serialized with xsi:type when using soapcpp2 option -t, use: # xsd__string = typedef char *xsd__string; | xsd__string | xsd__string # The following mapping is internally applied by wsdl2h for C (not C++): # (assuming option -e is used to remove the xsd__boolean__ name prefix) # xsd__boolean = enum xsd__boolean { false_, true_ }; | enum xsd__boolean # Uncomment the line below to use __int128_t for xsd:integer instead of # mapping xsd:integer to string. # Must compile and link custom/int128.c with the project. # xsd__integer = #import "custom/int128.h" | xsd__integer # Or if the xsd:integer value range is bounded to int64_t, then: # xsd__integer = typedef int64_t xsd__integer; # Uncomment the line below to use long double for xsd:decimal instead of # mapping xsd:decimal to string. # Must compile and link custom/long_double.c with the project. # xsd__decimal = #import "custom/long_double.h" | long double # Or if your system supports __float128 then you can use: # xsd__decimal = #import "custom/float128.h" | xsd__decimal # Or if the xsd:decimal value range is bounded to double, then: # xsd__decimal = typedef double xsd__decimal; # Uncomment the line below to use struct tm instead of time_t xsd:dateTime # Must compile and link custom/struct_tm.c with the project. # xsd__dateTime = #import "custom/struct_tm.h" | xsd__dateTime # Uncomment the line below to use timeval with usec precision xsd:dateTime # Must compile and link custom/struct_timeval.c with the project. # xsd__dateTime = #import "custom/struct_timeval.h" | xsd__dateTime # Uncomment the line below to use std::chrono::system_clock::time_point # for xsd:dateTime. # Must compile and link custom/chrono_time_point.c with the project. # xsd__dateTime = #import "custom/chrono_time_point.h" | xsd__dateTime # Uncomment the line below to use struct tm for xsd:date instead of # mapping xsd:date to string. # Must compile and link custom/struct_tm_date.c with the project. # xsd__date = #import "custom/struct_tm_date.h" | xsd__date # Uncomment the line below to use LONG64 int for xsd:duration instead of # mapping xsd:duration to string (in milliseconds precision). # Must compile and link custom/duration.c with the project. xsd__duration = #import "custom/duration.h" | xsd__duration # Uncomment the line below to use C++11 std::chrono::nanoseconds for # xsd:duration instead of mapping xsd:duration to string. # Must compile and link custom/chrono_duration.cpp with the project. # xsd__duration = #import "custom/chrono_duration.h" | xsd__duration # Uncomment the line below to use ULONG64 int for xsd:time instead of # mapping xsd:time to string (also comes with high usec precision) # Must compile and link custom/time.c with the project. # xsd__time = #import "custom/long_time.h" | xsd__time # When compiling WITH_LEAN there is no hexBinary serializer. You can # remap the hexBinary type to a string as follows: # xsd__hexBinary = | char* # When wsdl2h option -d is used, xsd:any is mapped to xsd__anyType DOM # declared in dom.h and implemented in dom.c/dom.cpp. You can remap # xsd:any, for example to a pointer to a DOM node as follows: # xsd__any = | xsd__anyType* # When SOAP 1.2 Faults should carry multiple SOAP_ENV__Text elements with # xml:lang attributes, then remap SOAP_ENV__Reason as follows: # [ # struct SOAP_ENV__Reason # { # char *SOAP_ENV__Text; // at least one SOAP-ENV:Text for the gSOAP engine # $int size; # struct SOAP_ENV__Text *SOAP_ENV__Text_; // array of more SOAP-ENV:Text # }; # struct SOAP_ENV__Text # { # char *__item; # @char *xml__lang; # }; # ] # SOAP-ENV mapping (note: SOAP Body content is mapped to an XML string) SOAP_ENV__Envelope = struct SOAP_ENV__Envelope { struct SOAP_ENV__Header *SOAP_ENV__Header; _XML SOAP_ENV__Body; }; | struct SOAP_ENV__Envelope SOAP_ENV__Header = | struct SOAP_ENV__Header SOAP_ENV__Fault = | struct SOAP_ENV__Fault SOAP_ENV__Detail = | struct SOAP_ENV__Detail SOAP_ENV__Code = | struct SOAP_ENV__Code SOAP_ENV__Subcode = | struct SOAP_ENV__Subcode SOAP_ENV__Reason = | struct SOAP_ENV__Reason # Temporary URI tempuri = "http://tempuri.org/" # Empty URI empty = "" # .NET WCF DataContract Serialization Schema ser = arr = "http://schemas.microsoft.com/2003/10/Serialization/Arrays" # .NET WCF DataContract Serialization Schema remappings _ser__anyURI == xsd__anyURI _ser__boolean == xsd__boolean _ser__base64Binary == xsd__base64Binary _ser__byte == xsd__byte _ser__dateTime == xsd__dateTime _ser__decimal == xsd__decimal _ser__double == xsd__double _ser__float == xsd__float _ser__int == xsd__int _ser__long == xsd__long _ser__QName == xsd__QName _ser__short == xsd__short _ser__string == xsd__string _ser__unsignedByte == xsd__unsignedByte _ser__unsignedInt == xsd__unsignedInt _ser__unsignedLong == xsd__unsignedLong _ser__unsignedShort == xsd__unsignedShort # .NET WCF ser:anyType represents an object (see import/ser.h): _ser__anyType = | struct __ser__anyType | struct __ser__anyType # .NET WCF ser:char element and type represents a Unicode character _ser__char = | int ser__char = | int # .NET WCF ser:duration element and type maps to xsd:duration _ser__duration == xsd__duration ser__duration == xsd__duration # .NET WCF ser:guid pattern = "[\da-fA-F]{8}-[\da-fA-F]{4}-[\da-fA-F]{4}-[\da-fA-F]{4}-[\da-fA-F]{12}" _ser__guid = | char* ser__guid = | char* # .NET WCF samples mssamh = "http://Microsoft.Samples.Http" mssamhi = "http://Microsoft.Samples.Http/Imports" mssamt = "http://Microsoft.Samples.TransportSecurity" mssamti = "http://Microsoft.Samples.TransportSecurity/Imports" mssamm = "http://Microsoft.Samples.MessageSecurity" mssammi = "http://Microsoft.Samples.MessageSecurity/Imports" mssadh = "http://Microsoft.Samples.DualHttp" mssadhi = "http://Microsoft.Samples.DualHttp/Imports" # MTOM xop and xmime are imported from xop.h, xmime.h, and xmlmime.h: # Note: changed xmlmime to xmime to avoid other MTOM tools from # complaining that 'xml' is reserved. xop = xmime = xmime4 = xmime5 = # xop:Include is imported from xop.h and redefined as _xop__Include: xop__Include = #import "xop.h" | _xop__Include # xmime/xmlmime:contentType attribute is a string: _xmime__contentType = | char* | char* _xmime4__contentType = | char* | char* _xmime5__contentType = | char* | char* # exc-c14n c14n = # WS-Addressing (2003, 2004, and 2005 schemas) # See import/wsa.h, import/wsa3.h etc for definitions and code examples # The API is defined in plugin/wsaapi.c, plugin/wsaapi3.c, etc. wsa = wsa3 = wsa4 = wsa5 = # The types below should not use pointers, so we add a 3rd column: _wsa__Action = | | _wsa__Action _wsa__MessageID = | | _wsa__MessageID _wsa__To = | | _wsa__To _wsa3__Action = | | _wsa3__Action _wsa3__MessageID = | | _wsa3__MessageID _wsa3__To = | | _wsa3__To _wsa4__Action = | | _wsa4__Action _wsa4__MessageID = | | _wsa4__MessageID _wsa4__To = | | _wsa4__To _wsa5__Action = | | _wsa5__Action _wsa5__MessageID = | | _wsa5__MessageID _wsa5__To = | | _wsa5__To # WS-ReliableMessaging 1.1 and 1.0 (and obsolete WS-Reliability 2004) wsrm = wsrm5 = wsrm4 = # WS-Discovery 1.1 (2009/01) and 1.0 (2004/08 with WS-Addressing) # To upgrade WS-Discovery to WS-Addressing 2005/08, uncomment wsdd5: wsdd = #wsdd5 = wsdd10 = wsdd5__HelloType = | wsdd__HelloType wsdd5__ByeType = | wsdd__ByeType wsdd5__ProbeType = | wsdd__ProbeType wsdd5__ProbeMatchesType = | wsdd__ProbeMatchesType wsdd5__ProbeMatchType = | wsdd__ProbeMatchType wsdd5__ResolveType = | wsdd__ResolveType wsdd5__ResolveMatchesType = | wsdd__ResolveMatchesType wsdd5__ResolveMatchType = | wsdd__ResolveMatchType wsdd5__ScopesType = | wsdd__ScopesType wsdd5__SecurityType = | wsdd__SecurityType wsdd5__SigType = | wsdd__SigType wsdd5__AppSequenceType = | wsdd__AppSequenceType wsdd10__HelloType = | wsdd__HelloType wsdd10__ByeType = | wsdd__ByeType wsdd10__ProbeType = | wsdd__ProbeType wsdd10__ProbeMatchesType = | wsdd__ProbeMatchesType wsdd10__ProbeMatchType = | wsdd__ProbeMatchType wsdd10__ResolveType = | wsdd__ResolveType wsdd10__ResolveMatchesType = | wsdd__ResolveMatchesType wsdd10__ResolveMatchType = | wsdd__ResolveMatchType wsdd10__ScopesType = | wsdd__ScopesType wsdd10__SecurityType = | wsdd__SecurityType wsdd10__SigType = | wsdd__SigType wsdd10__AppSequenceType = | wsdd__AppSequenceType # WS-Policy wsp = # WS-SecureConversation 1.4 wsc = wsc2 = # WS-Trust 1.2 and 1.3 wst = wst12 = # SAML bindings saml1 = saml2 = # WS-Security wsse 2004 v1.0 and 1.1 and old wsse 2002 schema wsse11 = wsse = wsse2 = _wsse2__Security == _wsse__Security wsse2__Security == wsse__Security # wsu 2004 wsu = _wsu__Id = | char* _wsu__Created = | time_t _wsu__Expires = | time_t wsu__AttributedDateTime = | time_t wsu__AttributedURI = | char* # Bindings for ds and xenc for WS-Security protocols: ds = xenc = # xlink xlink = _xlink__actuate = | char* _xlink__arcrole = | char* _xlink__from = | char* _xlink__href = | char* _xlink__label = | char* _xlink__role = | char* _xlink__show = | char* _xlink__to = | char* _xlink__title = | char* _xlink__type = | char* # wsrp routing protocol (deprecated) wsrp = # BPEL 2.0 bpel = "http://docs.oasis-open.org/wsbpel/2.0/process/executable" bpelabs = "http://docs.oasis-open.org/wsbpel/2.0/process/abstract" plnk = "http://docs.oasis-open.org/wsbpel/2.0/plnktype" sref = "http://docs.oasis-open.org/wsbpel/2.0/serviceref" vprop = "http://docs.oasis-open.org/wsbpel/2.0/varprop" # ONVIF recommended prefixes as per 8/20/12 # http://www.onvif.org/onvif/ver10/device/wsdl/devicemgmt.wsdl # http://www.onvif.org/onvif/ver10/event/wsdl/event.wsdl # http://www.onvif.org/onvif/ver10/display.wsdl # http://www.onvif.org/onvif/ver10/deviceio.wsdl # http://www.onvif.org/onvif/ver20/imaging/wsdl/imaging.wsdl # http://www.onvif.org/onvif/ver10/media/wsdl/media.wsdl # http://www.onvif.org/onvif/ver20/ptz/wsdl/ptz.wsdl # http://www.onvif.org/onvif/ver10/receiver.wsdl # http://www.onvif.org/onvif/ver10/recording.wsdl # http://www.onvif.org/onvif/ver10/search.wsdl # http://www.onvif.org/onvif/ver10/network/wsdl/remotediscovery.wsdl # http://www.onvif.org/onvif/ver10/replay.wsdl # http://www.onvif.org/onvif/ver20/analytics/wsdl/analytics.wsdl # http://www.onvif.org/onvif/ver10/analyticsdevice.wsdl # http://www.onvif.org/onvif/ver10/schema/onvif.xsd tds = "http://www.onvif.org/ver10/device/wsdl" tev = "http://www.onvif.org/ver10/events/wsdl" tls = "http://www.onvif.org/ver10/display/wsdl" tmd = "http://www.onvif.org/ver10/deviceIO/wsdl" timg = "http://www.onvif.org/ver20/imaging/wsdl" trt = "http://www.onvif.org/ver10/media/wsdl" tptz = "http://www.onvif.org/ver20/ptz/wsdl" trv = "http://www.onvif.org/ver10/receiver/wsdl" trc = "http://www.onvif.org/ver10/recording/wsdl" tse = "http://www.onvif.org/ver10/search/wsdl" trp = "http://www.onvif.org/ver10/replay/wsdl" tan = "http://www.onvif.org/ver20/analytics/wsdl" tad = "http://www.onvif.org/ver10/analyticsdevice/wsdl" tdn = "http://www.onvif.org/ver10/network/wsdl" tt = "http://www.onvif.org/ver10/schema" # OASIS recommended prefixes wsnt = "http://docs.oasis-open.org/wsn/b-2" wsntw = "http://docs.oasis-open.org/wsn/bw-2" wsrfbf = "http://docs.oasis-open.org/wsrf/bf-2" wsrfr = "http://docs.oasis-open.org/wsrf/r-2" wsrfrw = "http://docs.oasis-open.org/wsrf/rw-2" wstop = "http://docs.oasis-open.org/wsn/t-1" # Prefix bindings for WhiteMesa interoperability testing round 2: i = "http://soapinterop.org/" s = "http://soapinterop.org/xsd" # Prefix binding for Amazon Web Services: aws = "urn:PI/DevCentral/SoapService" # Prefix binding for Mappoint Web services: mpt = "http://s.mappoint.net/mappoint-30/" gsoap-2.8.28/gsoap/wsdl/MakefileManual0000644000175000017500000000505212653650160017152 0ustar ellertellert# gSOAP wsdl2h Makefile by Robert van Engelen, Genivia Inc. # Use this to build the soapcpp2 tool when autoconf/automake are not # available. # # Dependences: # Build soapcpp2 first (should be in ../bin/soapcpp2) # # Use 'make secure' to build SSL-capable wsdlh2 tool (requires OpenSSL) # # Mac OS X universal binary: # CPP=g++ -arch i386 -arch ppc CC=gcc CPP=g++ # SOAPCPP=../bin/soapcpp2 STDSOAPH=../stdsoap2.h STDSOAPC=../stdsoap2.cpp PLUGIN=../plugin # SOCKLIB= # SOCKLIB=-lsocket -lnsl # LIBS=-lm $(SOCKLIB) # COFLAGS=-O1 # For static linking use: # COFLAGS=-O1 -static # For debugging use: # COFLAGS=-DDEBUG -g # COFLAGS=-g CWFLAGS=-Wall # CIFLAGS=-I.. -I$(PLUGIN) # CMFLAGS= # CFLAGS=$(CWFLAGS) $(COFLAGS) $(CIFLAGS) $(CMFLAGS) # all: clean wsdl2h wsdl2h: wsdlC.o wsdl2h.o wsdl.o schema.o soap.o mime.o wsp.o bpel.o types.o service.o stdsoap2.o $(CPP) -o wsdl2h wsdlC.o wsdl2h.o wsdl.o schema.o soap.o mime.o wsp.o bpel.o types.o service.o stdsoap2.o $(LIBS) -cp -f wsdl2h ../bin stdsoap2.o: $(STDSOAPH) $(STDSOAPC) $(CPP) -c $(CFLAGS) $(STDSOAPC) wsdl2h.o: wsdl2h.cpp types.h service.h includes.h $(CPP) -c $(CFLAGS) wsdl2h.cpp wsdlC.o: wsdlC.cpp $(CPP) -c $(CFLAGS) wsdlC.cpp wsdlC.cpp: schema.h soap.h mime.h dime.h http.h wsdl.h includes.h imports.h wsp.h sp.h wsam.h wsrmp.h wsu.h wst.h $(SOAPCPP) -I../import -SC -pwsdl wsdl.h types.o: types.h types.cpp includes.h wsdlC.cpp $(CPP) -c $(CFLAGS) types.cpp service.o: service.h service.cpp includes.h wsdlC.cpp $(CPP) -c $(CFLAGS) service.cpp wsdl.o: wsdl.h wsdl.cpp includes.h imports.h $(CPP) -c $(CFLAGS) wsdl.cpp schema.o: schema.h schema.cpp includes.h imports.h $(CPP) -c $(CFLAGS) schema.cpp soap.o: soap.h soap.cpp includes.h imports.h $(CPP) -c $(CFLAGS) soap.cpp mime.o: mime.h mime.cpp includes.h imports.h $(CPP) -c $(CFLAGS) mime.cpp wsp.o: wsp.h wsp.cpp includes.h imports.h $(CPP) -c $(CFLAGS) wsp.cpp bpel.o: bpel.h bpel.cpp includes.h imports.h $(CPP) -c $(CFLAGS) bpel.cpp httpda.o: $(PLUGIN)/httpda.c $(CC) -c $(CFLAGS) $(PLUGIN)/httpda.c md5evp.o: $(PLUGIN)/md5evp.c $(CC) -c $(CFLAGS) $(PLUGIN)/md5evp.c secure: clean make CMFLAGS='-Wno-deprecated-declarations -DWITH_OPENSSL' LIBS="httpda.o md5evp.o -lcrypto -lssl -lm $(SOCKLIB)" httpda.o md5evp.o wsdl2h .PHONY: clean distclean clean: -rm -f *.o wsdlH.h wsdlStub.h wsdlC.cpp wsdlClient.cpp wsdlServer.cpp wsdlClientLib.cpp wsdlServerLib.cpp distclean: -rm -f *.o *.wsdl *.xsd *.xml *.nsmap wsdl2h wsdlH.h wsdlStub.h wsdlC.cpp wsdlClient.cpp wsdlServer.cpp wsdlClientLib.cpp wsdlServerLib.cpp gsoap-2.8.28/gsoap/wsdl/schema.cpp0000644000175000017500000020161712653650160016325 0ustar ellertellert/* schema.cpp XSD binding schema implementation -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "wsdlH.h" // cannot include "schemaH.h" #include "includes.h" extern struct Namespace namespaces[]; extern "C" { extern int warn_ignore(struct soap*, const char*); } extern const char *qname_token(const char*, const char*); extern int is_builtin_qname(const char*); //////////////////////////////////////////////////////////////////////////////// // // schema // //////////////////////////////////////////////////////////////////////////////// xs__schema::xs__schema() { soap = soap_new1(SOAP_XML_TREE | SOAP_C_UTFSTRING); #ifdef HTTPDA_H soap_register_plugin(soap, http_da); #endif #ifdef WITH_OPENSSL soap_ssl_client_context(soap, SOAP_SSL_NO_AUTHENTICATION, NULL, NULL, NULL, NULL, NULL); #endif soap_set_namespaces(soap, namespaces); soap_default(soap); soap->fignore = warn_ignore; soap->encodingStyle = NULL; soap->proxy_host = proxy_host; soap->proxy_port = proxy_port; soap->proxy_userid = proxy_userid; soap->proxy_passwd = proxy_passwd; targetNamespace = NULL; version = NULL; attributeGroupRef = NULL; updated = false; location = NULL; redirs = 0; } xs__schema::xs__schema(struct soap *copy) { soap = soap_copy(copy); soap->socket = SOAP_INVALID_SOCKET; soap->recvfd = 0; soap->sendfd = 1; soap_default(soap); soap->fignore = warn_ignore; soap->encodingStyle = NULL; targetNamespace = NULL; version = NULL; attributeGroupRef = NULL; updated = false; location = NULL; redirs = 0; } xs__schema::xs__schema(struct soap *copy, const char *cwd, const char *loc) { soap = soap_copy(copy); soap->socket = SOAP_INVALID_SOCKET; soap->recvfd = 0; soap->sendfd = 1; soap_default(soap); soap->fignore = warn_ignore; soap->encodingStyle = NULL; targetNamespace = NULL; version = NULL; attributeGroupRef = NULL; updated = false; location = NULL; redirs = 0; read(cwd, loc); } xs__schema::~xs__schema() { } int xs__schema::get(struct soap *soap) { (void)soap; return preprocess(); } int xs__schema::preprocess() { // process xs:include recursively // NOTE: includes are context sensitive (take context info), so keep including for (vector::iterator in = include.begin(); in != include.end(); ++in) { (*in).preprocess(*this); // read schema and recurse over if ((*in).schemaPtr()) insert(*(*in).schemaPtr()); } for (vector::iterator ov = override_.begin(); ov != override_.end(); ++ov) { (*ov).preprocess(*this); // read schema and recurse over if ((*ov).schemaPtr()) insert(*(*ov).schemaPtr()); } for (vector::iterator re = redefine.begin(); re != redefine.end(); ++re) { (*re).preprocess(*this); // read schema and recurse over if ((*re).schemaPtr()) insert(*(*re).schemaPtr()); } return SOAP_OK; } int xs__schema::insert(xs__schema& schema) { bool found; if (targetNamespace && (!schema.targetNamespace || strcmp(targetNamespace, schema.targetNamespace))) { if (!Wflag) fprintf(stderr, "\nWarning: attempt to include schema '%s' with mismatching targetNamespace '%s' into schema namespace '%s', assuming chameleon schema targetNamespace '%s'\n", schema.sourceLocation() ? schema.sourceLocation() : "", schema.targetNamespace, targetNamespace, targetNamespace); schema.targetNamespace = targetNamespace; } if (elementFormDefault != schema.elementFormDefault) { if (!Wflag) fprintf(stderr, "\nWarning: attempt to include schema '%s' with mismatching elementFormDefault into schema namespace '%s', assuming elementFormDefault '%squalified'\n", schema.sourceLocation() ? schema.sourceLocation() : "", targetNamespace ?targetNamespace : "(null)", elementFormDefault == qualified ? "" : "un"); schema.elementFormDefault = elementFormDefault; } if (attributeFormDefault != schema.attributeFormDefault) { if (!Wflag) fprintf(stderr, "\nWarning: attempt to include schema '%s' with mismatching attributeFormDefault into schema namespace '%s', assuming attributeFormDefault '%squalified'\n", schema.sourceLocation() ? schema.sourceLocation() : "", targetNamespace ? targetNamespace : "(null)", attributeFormDefault == qualified ? "" : "un"); schema.attributeFormDefault = attributeFormDefault; } // insert imports for (vector::const_iterator im = schema.import.begin(); im != schema.import.end(); ++im) { found = false; if ((*im).namespace_) { for (vector::const_iterator i = import.begin(); i != import.end(); ++i) { if ((*i).namespace_ && !strcmp((*im).namespace_, (*i).namespace_)) { found = true; break; } } } if (!found) import.push_back(*im); } // insert attributes, but only add attributes with new name (limited conflict check) for (vector::const_iterator at = schema.attribute.begin(); at != schema.attribute.end(); ++at) { found = false; if ((*at).name) { for (vector::const_iterator a = attribute.begin(); a != attribute.end(); ++a) { if ((*a).name && !strcmp((*at).name, (*a).name)) { found = true; if ((*at).type && (*a).type && strcmp((*at).type, (*a).type)) if (!Wflag) fprintf(stderr, "\nWarning: attempt to redefine attribute '%s' with type '%s' in schema '%s'\n", (*at).name, (*at).type, targetNamespace ? targetNamespace : "(null)"); break; } } } if (!found) { attribute.push_back(*at); attribute.back().schemaPtr(this); } } // insert elements, but only add elements with new name (limited conflict check) for (vector::const_iterator el = schema.element.begin(); el != schema.element.end(); ++el) { found = false; if ((*el).name) { for (vector::const_iterator e = element.begin(); e != element.end(); ++e) { if ((*e).name && !strcmp((*el).name, (*e).name)) { found = true; if ((*el).type && (*e).type && strcmp((*el).type, (*e).type)) if (!Wflag) fprintf(stderr, "\nWarning: attempt to redefine element '%s' with type '%s' in schema '%s'\n", (*el).name, (*el).type, targetNamespace ? targetNamespace : "(null)"); break; } } } if (!found) { element.push_back(*el); element.back().schemaPtr(this); } } // insert groups, but only add groups with new name (no conflict check) for (vector::const_iterator gp = schema.group.begin(); gp != schema.group.end(); ++gp) { found = false; if ((*gp).name) { for (vector::const_iterator g = group.begin(); g != group.end(); ++g) { if ((*g).name && !strcmp((*gp).name, (*g).name)) { found = true; break; } } } if (!found) { group.push_back(*gp); group.back().schemaPtr(this); } } // insert attributeGroups, but only add attributeGroups with new name (no conflict check) for (vector::const_iterator ag = schema.attributeGroup.begin(); ag != schema.attributeGroup.end(); ++ag) { found = false; if ((*ag).name) { for (vector::const_iterator g = attributeGroup.begin(); g != attributeGroup.end(); ++g) { if ((*g).name && !strcmp((*ag).name, (*g).name)) { found = true; break; } } } if (!found) { attributeGroup.push_back(*ag); attributeGroup.back().schemaPtr(this); } } // insert simpleTypes, but only add simpleTypes with new name (no conflict check) for (vector::const_iterator st = schema.simpleType.begin(); st != schema.simpleType.end(); ++st) { found = false; if ((*st).name) { for (vector::const_iterator s = simpleType.begin(); s != simpleType.end(); ++s) { if ((*s).name && !strcmp((*st).name, (*s).name)) { found = true; break; } } } if (!found) { simpleType.push_back(*st); simpleType.back().schemaPtr(this); } } // insert complexTypes, but only add complexTypes with new name (no conflict check) for (vector::const_iterator ct = schema.complexType.begin(); ct != schema.complexType.end(); ++ct) { found = false; if ((*ct).name) { for (vector::const_iterator c = complexType.begin(); c != complexType.end(); ++c) { if ((*c).name && !strcmp((*ct).name, (*c).name)) { found = true; break; } } } if (!found) { complexType.push_back(*ct); complexType.back().schemaPtr(this); } } return SOAP_OK; } int xs__schema::traverse() { if (updated) return SOAP_OK; if (vflag) cerr << " Analyzing schema '" << (targetNamespace ? targetNamespace : "(null)") << "' '" << (sourceLocation() ? sourceLocation() : "") << "'" << endl; updated = true; if (!targetNamespace) { if (vflag) fprintf(stderr, "\nWarning: Schema has no targetNamespace\n"); targetNamespace = soap_strdup(soap, ""); } else if (exturis.find(targetNamespace) != exturis.end()) { if (vflag) fprintf(stderr, "\nWarning: Built-in schema '%s' content encountered\n", targetNamespace); } // process import for (vector::iterator im = import.begin(); im != import.end(); ++im) (*im).traverse(*this); // process attributes for (vector::iterator at = attribute.begin(); at != attribute.end(); ++at) (*at).traverse(*this); // process elements for (vector::iterator el = element.begin(); el != element.end(); ++el) (*el).traverse(*this); // process simpleTypes, check conflicts with complexTypes for (vector::iterator st = simpleType.begin(); st != simpleType.end(); ++st) { (*st).traverse(*this); if ((*st).name) { for (vector::iterator ct = complexType.begin(); ct != complexType.end(); ++ct) { if ((*ct).name && !strcmp((*st).name, (*ct).name)) { if (!Wflag) fprintf(stderr, "\nWarning: top-level simpleType name and complexType name '%s' clash in schema '%s'\n", (*st).name, targetNamespace ? targetNamespace : "(null)"); } } } } // process complexTypes for (vector::iterator ct = complexType.begin(); ct != complexType.end(); ++ct) (*ct).traverse(*this); // process groups for (vector::iterator gp = group.begin(); gp != group.end(); ++gp) (*gp).traverse(*this); // process attributeGroups for (vector::iterator ag = attributeGroup.begin(); ag != attributeGroup.end(); ++ag) (*ag).traverse(*this); // XSD 1.1 defaultAttributes if (defaultAttributes) { for (vector::iterator ag = attributeGroup.begin(); ag != attributeGroup.end(); ++ag) { if (!strcmp(defaultAttributes, (*ag).name)) { attributeGroupRef = &*ag; break; } } if (!attributeGroupRef) cerr << "\nWarning: could not find defaultAttributes attributeGroup '" << defaultAttributes << "' in schema '" << (targetNamespace ? targetNamespace : "(null)") << "'" << endl; } if (vflag) cerr << " End of schema '" << (targetNamespace ? targetNamespace : "(null)") << "'" << endl; return SOAP_OK; } int xs__schema::read(const char *cwd, const char *loc) { const char *cwd_temp; if (!cwd) cwd = cwd_path; if (vflag) fprintf(stderr, "\nOpening schema '%s' from '%s'\n", loc ? loc : "(stdin)", cwd ? cwd : "./"); if (loc) { if (soap->recvfd > 2) { soap_end_recv(soap); close(soap->recvfd); soap->recvfd = -1; } else if (soap_valid_socket(soap->socket)) { soap_end_recv(soap); soap_closesock(soap); } #ifdef WITH_OPENSSL if (!strncmp(loc, "http://", 7) || !strncmp(loc, "https://", 8)) #else if (!strncmp(loc, "https://", 8)) { fprintf(stderr, "\nCannot connect to https site: no SSL support, please rebuild with SSL (default) or download the files and rerun wsdl2h\n"); exit(1); } else if (!strncmp(loc, "http://", 7)) #endif { fprintf(stderr, "%*sConnecting to '%s' to retrieve schema...", 2*openfiles, "", loc); location = soap_strdup(soap, loc); if (soap_connect_command(soap, SOAP_GET, location, NULL)) { fprintf(stderr, "\n\nError: connection failed\n"); exit(1); } fprintf(stderr, " connected, receiving...\n"); openfiles++; } else if (cwd && (!strncmp(cwd, "http://", 7) || !strncmp(cwd, "https://", 8))) { size_t l = strlen(cwd) + strlen(loc); location = (char*)soap_malloc(soap, l + 2); soap_strcpy(location, l + 2, cwd); char *s = strrchr(location, '/'); if (s) *s = '\0'; size_t n = strlen(location); soap_strcpy(location + n, l + 2 - n, "/"); ++n; soap_strcpy(location + n, l + 2 - n, loc); fprintf(stderr, "%*sConnecting to '%s' to retrieve schema '%s'...", 2*openfiles, "", location, loc); if (soap_connect_command(soap, SOAP_GET, location, NULL)) { fprintf(stderr, "\n\nError: connection failed\n"); exit(1); } fprintf(stderr, " connected, receiving...\n"); openfiles++; } else { soap->recvfd = open(loc, O_RDONLY, 0); if (soap->recvfd < 0) { if (cwd) { size_t l = strlen(cwd) + strlen(loc); location = (char*)soap_malloc(soap, l + 2); soap_strcpy(location, l + 2, cwd); char *s = strrchr(location, '/'); #ifdef WIN32 if (!s) s = strrchr(location, '\\'); #endif if (s) *s = '\0'; size_t n = strlen(location); soap_strcpy(location + n, l + 2 - n, "/"); ++n; soap_strcpy(location + n, l + 2 - n, loc); if (!strncmp(location, "file://", 7)) location += 7; soap->recvfd = open(location, O_RDONLY, 0); } if (soap->recvfd < 0 && import_path) { size_t l = strlen(import_path) + strlen(loc); location = (char*)soap_malloc(soap, l + 2); soap_strcpy(location, l + 2, import_path); size_t n = strlen(location); soap_strcpy(location + n, l + 2 - n, "/"); ++n; soap_strcpy(location + n, l + 2 - n, loc); if (!strncmp(location, "file://", 7)) location += 7; soap->recvfd = open(location, O_RDONLY, 0); } if (soap->recvfd < 0) { fprintf(stderr, "\nCannot open '%s' to retrieve schema\n", loc); exit(1); } } else location = soap_strdup(soap, loc); fprintf(stderr, "%*sReading schema '%s'...\n", 2*openfiles, "", location); openfiles++; } } cwd_temp = cwd_path; cwd_path = location; if (!soap_begin_recv(soap)) this->soap_in(soap, "xs:schema", NULL); if ((soap->error >= 301 && soap->error <= 303) || soap->error == 307) // HTTP redirect, socket was closed { int r = SOAP_ERR; fprintf(stderr, "Redirected to '%s'...\n", soap->endpoint); if (redirs++ < 10) r = read(cwd, soap->endpoint); else fprintf(stderr, "\nMax redirects exceeded\n"); redirs--; return r; } else if (soap->error == 401) { int r = SOAP_ERR; fprintf(stderr, "Authenticating to '%s' realm '%s'...\n", loc, soap->authrealm); if (auth_userid && auth_passwd && redirs++ < 1) { #ifdef HTTPDA_H struct http_da_info info; http_da_save(soap, &info, soap->authrealm, auth_userid, auth_passwd); #else soap->userid = auth_userid; soap->passwd = auth_passwd; #endif r = read(cwd, loc); #ifdef HTTPDA_H http_da_release(soap, &info); #endif redirs--; } else fprintf(stderr, "Authentication failed, use option -r:uid:pwd and (re)build with OpenSSL to enable digest authentication\n"); return r; } if (soap->error) { fprintf(stderr, "\nAn error occurred while parsing schema from '%s'\n", loc ? loc : "(stdin)"); soap_print_fault(soap, stderr); if (soap->error < 200) soap_print_fault_location(soap, stderr); fprintf(stderr, "\nIf this schema namespace is considered \"built-in\", then add\n namespaceprefix = \nto typemap.dat.\n"); exit(1); } openfiles--; fprintf(stderr, "%*sDone reading '%s'\n", 2*openfiles, "", loc ? loc : "(stdin)"); soap_end_recv(soap); if (soap->recvfd > 2) { close(soap->recvfd); soap->recvfd = -1; } else soap_closesock(soap); cwd_path = cwd_temp; return SOAP_OK; } void xs__schema::sourceLocation(const char *loc) { location = soap_strdup(soap, loc); } const char *xs__schema::sourceLocation() { return location; } xs__attributeGroup *xs__schema::attributeGroupPtr() const { return attributeGroupRef; } int xs__schema::error() { return soap->error; } void xs__schema::print_fault() { soap_print_fault(soap, stderr); if (soap->error < 200) soap_print_fault_location(soap, stderr); } void xs__schema::builtinType(const char *type) { builtinTypeSet.insert(type); } void xs__schema::builtinElement(const char *element) { builtinElementSet.insert(element); } void xs__schema::builtinAttribute(const char *attribute) { builtinAttributeSet.insert(attribute); } const SetOfString& xs__schema::builtinTypes() const { return builtinTypeSet; } const SetOfString& xs__schema::builtinElements() const { return builtinElementSet; } const SetOfString& xs__schema::builtinAttributes() const { return builtinAttributeSet; } bool xs__schema::empty() const { return include.empty() && redefine.empty() && override_.empty() && attribute.empty() && element.empty() && group.empty() && attributeGroup.empty() && simpleType.empty() && complexType.empty(); // empty except for } xs__include::xs__include() { schemaLocation = NULL; schemaRef = NULL; } int xs__include::preprocess(xs__schema &schema) { if (!schemaRef && schemaLocation) { // only read from include locations not read already, uses static std::map static map included; map::iterator i = included.end(); if (schema.targetNamespace) { for (i = included.begin(); i != included.end(); ++i) { if ((*i).second->targetNamespace && !strcmp(schemaLocation, (*i).first) && !strcmp(schema.targetNamespace, (*i).second->targetNamespace)) break; } } if (i == included.end()) { if (vflag) cerr << "Preprocessing schema include '" << (schemaLocation ? schemaLocation : "(null)") << "' into schema '" << (schema.targetNamespace ? schema.targetNamespace : "(null)") << "'" << endl; schemaRef = new xs__schema(schema.soap); if (!schemaRef) return SOAP_EOF; included[schemaLocation] = schemaRef; schemaRef->read(schema.sourceLocation(), schemaLocation); if (schema.targetNamespace && (!schemaRef->targetNamespace || strcmp(schema.targetNamespace, schemaRef->targetNamespace))) { if (!Wflag) { if (schemaRef->targetNamespace) fprintf(stderr, "\nWarning: attempt to include schema with mismatching targetNamespace '%s' in schema '%s', assigning targetNamespace '%s'\n", schemaRef->targetNamespace, schema.targetNamespace, schema.targetNamespace); else fprintf(stderr, "\nWarning: attempt to include chameleon schema with no targetNamespace in schema '%s', assigning targetNamespace '%s'\n", schema.targetNamespace, schema.targetNamespace); } schemaRef->targetNamespace = schema.targetNamespace; schemaRef->elementFormDefault = schema.elementFormDefault; schemaRef->attributeFormDefault = schema.attributeFormDefault; } } else { if (vflag) cerr << "Schema '" << (schemaLocation ? schemaLocation : "(null)") << "' already included into schema '" << (schema.targetNamespace ? schema.targetNamespace : "(null)") << "'" << endl; schemaRef = (*i).second; } } return SOAP_OK; } int xs__include::traverse(xs__schema &schema) { (void)schema; return SOAP_OK; } void xs__include::schemaPtr(xs__schema *schema) { schemaRef = schema; } xs__schema *xs__include::schemaPtr() const { return schemaRef; } xs__redefine::xs__redefine() { schemaLocation = NULL; schemaRef = NULL; } int xs__redefine::preprocess(xs__schema &schema) { if (vflag) cerr << "Preprocessing schema redefine '" << (schemaLocation ? schemaLocation : "(null)") << "' into schema '" << (schema.targetNamespace ? schema.targetNamespace : "(null)") << "'" << endl; if (!schemaRef) { if (schemaLocation) { schemaRef = new xs__schema(schema.soap, schema.sourceLocation(), schemaLocation); // redefine xs:all, xs:choice, or xs:sequence in a group for (vector::iterator gp = schemaRef->group.begin(); gp != schemaRef->group.end(); ++gp) { if ((*gp).name) { for (vector::const_iterator g = group.begin(); g != group.end(); ++g) { if ((*g).name && !strcmp((*gp).name, (*g).name)) { if ((*g).all) (*gp).all = (*g).all; if ((*g).choice) (*gp).choice = (*g).choice; if ((*g).sequence) (*gp).sequence = (*g).sequence; break; } } } } // redefine specified attributes in an attributeGroup for (vector::iterator ag = schemaRef->attributeGroup.begin(); ag != schemaRef->attributeGroup.end(); ++ag) { if ((*ag).name) { for (vector::const_iterator g = attributeGroup.begin(); g != attributeGroup.end(); ++g) { if ((*g).name && !strcmp((*ag).name, (*g).name)) { for (std::vector::const_iterator ga = (*g).attribute.begin(); ga != (*g).attribute.end(); ++ga) { if ((*ga).name) { bool found = false; for (std::vector::iterator aga = (*ag).attribute.begin(); aga != (*ag).attribute.end(); ++aga) { if ((*aga).name && !strcmp((*aga).name, (*ga).name)) { *aga = *ga; found = true; break; } } if (!found) (*ag).attribute.push_back(*ga); } } } } } } // redefine simpleType for (vector::iterator st = schemaRef->simpleType.begin(); st != schemaRef->simpleType.end(); ++st) { if ((*st).name) { for (vector::const_iterator s = simpleType.begin(); s != simpleType.end(); ++s) { if ((*s).name && !strcmp((*st).name, (*s).name)) { *st = *s; // TODO would it be too crude to simply replace all content? break; } } } } // redefine complexType by extension for (vector::iterator ct = schemaRef->complexType.begin(); ct != schemaRef->complexType.end(); ++ct) { if ((*ct).name) { for (vector::const_iterator c = complexType.begin(); c != complexType.end(); ++c) { if ((*c).name && !strcmp((*ct).name, (*c).name)) { if ((*c).complexContent && (*c).complexContent->extension && (*c).complexContent->extension->sequence && qname_token((*c).complexContent->extension->base, schemaRef->targetNamespace)) { if (!(*ct).sequence) (*ct).sequence = (*c).complexContent->extension->sequence; else { for (std::vector::const_iterator e = (*c).complexContent->extension->sequence->__contents.begin(); e != (*c).complexContent->extension->sequence->__contents.end(); ++e) (*ct).sequence->__contents.push_back(*e); } } else if (!Wflag) fprintf(stderr, "\nWarning: redefining complexType \"%s\" in schema \"%s\" by extension requires an extension base\n", (*ct).name, schemaRef->targetNamespace ? schemaRef->targetNamespace : "(null)"); break; } } } } } } return SOAP_OK; } int xs__redefine::traverse(xs__schema &schema) { (void)schema; return SOAP_OK; } void xs__redefine::schemaPtr(xs__schema *schema) { schemaRef = schema; } xs__schema *xs__redefine::schemaPtr() const { return schemaRef; } xs__override::xs__override() { schemaLocation = NULL; schemaRef = NULL; } int xs__override::preprocess(xs__schema &schema) { if (vflag) cerr << "Preprocessing schema override '" << (schemaLocation ? schemaLocation : "(null)") << "' into schema '" << (schema.targetNamespace ? schema.targetNamespace : "(null)") << "'" << endl; if (!schemaRef) { if (schemaLocation) { schemaRef = new xs__schema(schema.soap, schema.sourceLocation(), schemaLocation); for (vector::iterator el = schemaRef->element.begin(); el != schemaRef->element.end(); ++el) { if ((*el).name) { for (vector::const_iterator e = element.begin(); e != element.end(); ++e) { if ((*e).name && !strcmp((*el).name, (*e).name)) { *el = *e; break; } } } } for (vector::iterator at = schemaRef->attribute.begin(); at != schemaRef->attribute.end(); ++at) { if ((*at).name) { for (vector::const_iterator a = attribute.begin(); a != attribute.end(); ++a) { if ((*a).name && !strcmp((*at).name, (*a).name)) { *at = *a; break; } } } } for (vector::iterator gp = schemaRef->group.begin(); gp != schemaRef->group.end(); ++gp) { if ((*gp).name) { for (vector::const_iterator g = group.begin(); g != group.end(); ++g) { if ((*g).name && !strcmp((*gp).name, (*g).name)) { *gp = *g; break; } } } } for (vector::iterator ag = schemaRef->attributeGroup.begin(); ag != schemaRef->attributeGroup.end(); ++ag) { if ((*ag).name) { for (vector::const_iterator g = attributeGroup.begin(); g != attributeGroup.end(); ++g) { if ((*g).name && !strcmp((*ag).name, (*g).name)) { *ag = *g; break; } } } } for (vector::iterator st = schemaRef->simpleType.begin(); st != schemaRef->simpleType.end(); ++st) { if ((*st).name) { for (vector::const_iterator s = simpleType.begin(); s != simpleType.end(); ++s) { if ((*s).name && !strcmp((*st).name, (*s).name)) { *st = *s; break; } } } } for (vector::iterator ct = schemaRef->complexType.begin(); ct != schemaRef->complexType.end(); ++ct) { if ((*ct).name) { for (vector::const_iterator c = complexType.begin(); c != complexType.end(); ++c) { if ((*c).name && !strcmp((*ct).name, (*c).name)) { *ct = *c; break; } } } } } } return SOAP_OK; } int xs__override::traverse(xs__schema &schema) { (void)schema; return SOAP_OK; } void xs__override::schemaPtr(xs__schema *schema) { schemaRef = schema; } xs__schema *xs__override::schemaPtr() const { return schemaRef; } xs__import::xs__import() { namespace_ = NULL; schemaLocation = NULL; schemaRef = NULL; } int xs__import::traverse(xs__schema &schema) { if (vflag) cerr << " Analyzing schema import '" << (namespace_ ? namespace_ : "(null)") << "'" << endl; if (!schemaRef) { bool found = false; if (namespace_) { for (SetOfString::const_iterator i = exturis.begin(); i != exturis.end(); ++i) { if (!soap_tag_cmp(namespace_, *i)) { found = true; break; } } } else if (!Wflag) fprintf(stderr, "\nWarning: no namespace in \n"); if (!found && !iflag) // don't import any of the schemas in the .nsmap table (or when -i option is used) { const char *s = schemaLocation; if (!s) s = namespace_; // only read from import locations not read already, uses static std::map static map included; map::iterator i = included.find(s); if (i == included.end()) { included[s] = schemaRef = new xs__schema(schema.soap); schemaRef->read(schema.sourceLocation(), s); } else schemaRef = (*i).second; if (schemaRef) { if (!schemaRef->targetNamespace || !*schemaRef->targetNamespace) schemaRef->targetNamespace = namespace_; else if (!namespace_ || strcmp(schemaRef->targetNamespace, namespace_)) if (!Wflag) fprintf(stderr, "\nWarning: schema import '%s' with schema targetNamespace '%s' mismatch\n", namespace_ ? namespace_ : "(null)", schemaRef->targetNamespace); } } } if (schemaRef) schemaRef->traverse(); return SOAP_OK; } void xs__import::schemaPtr(xs__schema *schema) { schemaRef = schema; } xs__schema *xs__import::schemaPtr() const { return schemaRef; } xs__attribute::xs__attribute() { schemaRef = NULL; attributeRef = NULL; simpleTypeRef = NULL; } int xs__attribute::traverse(xs__schema &schema) { if (vflag) cerr << " Analyzing schema attribute '" << (name ? name : "(null)") << "'" << endl; schemaRef = &schema; const char *token = qname_token(ref, schema.targetNamespace); attributeRef = NULL; if (token) { for (vector::iterator i = schema.attribute.begin(); i != schema.attribute.end(); ++i) if (!strcmp((*i).name, token)) { attributeRef = &(*i); if (vflag) cerr << " Found attribute '" << (name ? name : "(null)") << "' ref '" << (token ? token : "(null)") << "'" << endl; break; } } if (!attributeRef) { for (vector::iterator i = schema.import.begin(); i != schema.import.end(); ++i) { xs__schema *s = (*i).schemaPtr(); if (s) { token = qname_token(ref, s->targetNamespace); if (token) { for (vector::iterator j = s->attribute.begin(); j != s->attribute.end(); ++j) { if (!strcmp((*j).name, token)) { attributeRef = &(*j); if (vflag) cerr << " Found attribute '" << (name ? name : "(null)") << "' ref '" << (token ? token : "(null)") << "'" << endl; break; } } if (attributeRef) break; } } } } if (simpleType) { simpleType->traverse(schema); simpleTypeRef = simpleType; } else { token = qname_token(type, schema.targetNamespace); simpleTypeRef = NULL; if (token) { for (vector::iterator i = schema.simpleType.begin(); i != schema.simpleType.end(); ++i) if (!strcmp((*i).name, token)) { simpleTypeRef = &(*i); if (vflag) cerr << " Found attribute '" << (name ? name : "(null)") << "' type '" << (token ? token : "(null)") << "'" << endl; break; } } if (!simpleTypeRef) { for (vector::iterator i = schema.import.begin(); i != schema.import.end(); ++i) { xs__schema *s = (*i).schemaPtr(); if (s) { token = qname_token(type, s->targetNamespace); if (token) { for (vector::iterator j = s->simpleType.begin(); j != s->simpleType.end(); ++j) { if (!strcmp((*j).name, token)) { simpleTypeRef = &(*j); if (vflag) cerr << " Found attribute '" << (name ? name : "(null)") << "' type '" << (token ? token : "(null)") << "'" << endl; break; } } if (simpleTypeRef) break; } } } } } if (!attributeRef && !simpleTypeRef) { if (ref) { if (is_builtin_qname(ref)) schema.builtinAttribute(ref); else if (!Wflag) cerr << "\nWarning: could not find the referenced attribute '" << (name ? name : "") << "' ref '" << ref << "' in schema '" << (schema.targetNamespace ? schema.targetNamespace : "(null)") << "'" << endl; } else if (type) { if (is_builtin_qname(type)) schema.builtinType(type); else if (!Wflag) cerr << "\nWarning: could not find the type for attribute '" << (name ? name : "(null)") << "' type '" << type << "' in schema '" << (schema.targetNamespace ? schema.targetNamespace : "(null)") << "'" << endl; } } return SOAP_OK; } void xs__attribute::schemaPtr(xs__schema *schema) { schemaRef = schema; } xs__schema* xs__attribute::schemaPtr() const { return schemaRef; } void xs__attribute::attributePtr(xs__attribute *attribute) { attributeRef = attribute; } void xs__attribute::simpleTypePtr(xs__simpleType *simpleType) { simpleTypeRef = simpleType; } xs__attribute *xs__attribute::attributePtr() const { return attributeRef; } xs__simpleType *xs__attribute::simpleTypePtr() const { return simpleTypeRef; } xs__element::xs__element() { schemaRef = NULL; elementRef = NULL; simpleTypeRef = NULL; complexTypeRef = NULL; name = NULL; ref = NULL; type = NULL; default_ = NULL; default__ = NULL; fixed = NULL; fixed_ = NULL; form = NULL; nillable = false; abstract = false; substitutionGroup = NULL; minOccurs = NULL; maxOccurs = NULL; xmime__expectedContentTypes = NULL; annotation = NULL; simpleType = NULL; complexType = NULL; unique = NULL; } int xs__element::traverse(xs__schema &schema) { if (vflag) cerr << " Analyzing schema element '" << (name ? name : "(null)") << "'" << endl; schemaRef = &schema; const char *token = qname_token(ref, schema.targetNamespace); elementRef = NULL; if (token) { for (vector::iterator i = schema.element.begin(); i != schema.element.end(); ++i) { if ((*i).name && !strcmp((*i).name, token)) { elementRef = &(*i); if (vflag) cerr << " Found element '" << (name ? name : "(null)") << "' ref '" << (token ? token : "(null)") << "'" << endl; break; } } } if (!elementRef) { for (vector::const_iterator i = schema.import.begin(); i != schema.import.end(); ++i) { xs__schema *s = (*i).schemaPtr(); if (s) { token = qname_token(ref, s->targetNamespace); if (token) { for (vector::iterator j = s->element.begin(); j != s->element.end(); ++j) { if ((*j).name && !strcmp((*j).name, token)) { elementRef = &(*j); if (vflag) cerr << " Found element '" << (name ? name : "(null)") << "' ref '" << (token ? token : "(null)") << "'" << endl; break; } } if (elementRef) break; } } } } if (simpleType) { simpleType->traverse(schema); simpleTypeRef = simpleType; } else { token = qname_token(type, schema.targetNamespace); simpleTypeRef = NULL; if (token) { for (vector::iterator i = schema.simpleType.begin(); i != schema.simpleType.end(); ++i) if ((*i).name && !strcmp((*i).name, token)) { simpleTypeRef = &(*i); if (vflag) cerr << " Found element '" << (name ? name : "(null)") << "' simpleType '" << (token ? token : "(null)") << "'" << endl; break; } } if (!simpleTypeRef) { for (vector::const_iterator i = schema.import.begin(); i != schema.import.end(); ++i) { xs__schema *s = (*i).schemaPtr(); if (s) { token = qname_token(type, s->targetNamespace); if (token) { for (vector::iterator j = s->simpleType.begin(); j != s->simpleType.end(); ++j) { if ((*j).name && !strcmp((*j).name, token)) { simpleTypeRef = &(*j); if (vflag) cerr << " Found element '" << (name ? name : "(null)") << "' simpleType '" << (token ? token : "(null)") << "'" << endl; break; } } if (simpleTypeRef) break; } } } } } if (complexType) { complexType->traverse(schema); complexTypeRef = complexType; } else { token = qname_token(type, schema.targetNamespace); complexTypeRef = NULL; if (token) { for (vector::iterator i = schema.complexType.begin(); i != schema.complexType.end(); ++i) if ((*i).name && !strcmp((*i).name, token)) { complexTypeRef = &(*i); if (vflag) cerr << " Found element '" << (name ? name : "(null)") << "' complexType '" << (token ? token : "(null)") << "'" << endl; break; } } if (!complexTypeRef) { for (vector::const_iterator i = schema.import.begin(); i != schema.import.end(); ++i) { xs__schema *s = (*i).schemaPtr(); if (s) { token = qname_token(type, s->targetNamespace); if (token) { for (vector::iterator j = s->complexType.begin(); j != s->complexType.end(); ++j) { if ((*j).name && !strcmp((*j).name, token)) { complexTypeRef = &(*j); if (vflag) cerr << " Found element '" << (name ? name : "(null)") << "' complexType '" << (token ? token : "(null)") << "'" << endl; break; } } if (complexTypeRef) break; } } } } } if (!abstract && substitutionGroup) { token = qname_token(substitutionGroup, schema.targetNamespace); if (token) { for (vector::iterator i = schema.element.begin(); i != schema.element.end(); ++i) { if (!strcmp((*i).name, token)) { xs__element *elt = this; if (!elementPtr()) { elt = soap_new_xs__element(schema.soap); elt->soap_default(schema.soap); elt->name = name; elt->form = form; elt->elementPtr(this); // create element ref in substitutionsGroup elt->schemaPtr(schemaPtr()); elt->targetNamespace = NULL; } (*i).substitutions.push_back(elt); if (vflag) cerr << " Found substitutionGroup element '" << (name ? name : "(null)") << "' for element '" << (token ? token : "(null)") << "'" << endl; break; } } } for (vector::const_iterator i = schema.import.begin(); i != schema.import.end(); ++i) { xs__schema *s = (*i).schemaPtr(); if (s) { token = qname_token(substitutionGroup, s->targetNamespace); if (token) { for (vector::iterator j = s->element.begin(); j != s->element.end(); ++j) { if (!strcmp((*j).name, token)) { xs__element *elt = this; if (!elementPtr()) { elt = soap_new_xs__element(schema.soap); elt->soap_default(schema.soap); elt->name = name; elt->form = form; elt->elementPtr(this); // create element ref in substitutionsGroup elt->schemaPtr(schemaPtr()); elt->targetNamespace = NULL; } (*j).substitutions.push_back(elt); if (vflag) cerr << " Found substitutionGroup element '" << (name ? name : "(null)") << "' for element '" << (token ? token : "(null)") << "' in '" << s->targetNamespace << "'" << endl; break; } } } } } } if (!elementRef && !simpleTypeRef && !complexTypeRef) { if (ref) { if (is_builtin_qname(ref)) schema.builtinElement(ref); else if (!Wflag) cerr << "\nWarning: could not find the referenced element '" << (name ? name : "") << "' ref '" << ref << "' in schema '" << (schema.targetNamespace ? schema.targetNamespace : "(null)") << "'" << endl; } else if (type) { if (is_builtin_qname(type)) schema.builtinType(type); else if (!Wflag) cerr << "\nWarning: could not find the type for element '" << (name ? name : "(null)") << "' type '" << type << "' in schema '" << (schema.targetNamespace ? schema.targetNamespace : "(null)") << "'" << endl; } } return SOAP_OK; } void xs__element::schemaPtr(xs__schema *schema) { schemaRef = schema; } xs__schema* xs__element::schemaPtr() const { return schemaRef; } void xs__element::elementPtr(xs__element *element) { elementRef = element; } void xs__element::simpleTypePtr(xs__simpleType *simpleType) { simpleTypeRef = simpleType; } void xs__element::complexTypePtr(xs__complexType *complexType) { complexTypeRef = complexType; } xs__element *xs__element::elementPtr() const { return elementRef; } const std::vector* xs__element::substitutionsPtr() const { return &substitutions; } xs__simpleType *xs__element::simpleTypePtr() const { return simpleTypeRef; } xs__complexType *xs__element::complexTypePtr() const { return complexTypeRef; } xs__simpleType::xs__simpleType() { schemaRef = NULL; level = 0; } int xs__simpleType::traverse(xs__schema &schema) { if (vflag) cerr << " Analyzing schema simpleType '" << (name ? name : "(null)") << "'" << endl; schemaRef = &schema; if (list) list->traverse(schema); else if (restriction) restriction->traverse(schema); else if (union_) union_->traverse(schema); return SOAP_OK; } void xs__simpleType::schemaPtr(xs__schema *schema) { schemaRef = schema; } xs__schema *xs__simpleType::schemaPtr() const { return schemaRef; } int xs__simpleType::baseLevel() { if (!level) { if (restriction) { level = -1; if (restriction->simpleTypePtr()) level = restriction->simpleTypePtr()->baseLevel() + 1; else level = 2; } else if (list && list->restriction) { level = -1; if (list->restriction->simpleTypePtr()) level = list->restriction->simpleTypePtr()->baseLevel() + 1; else level = 2; } else level = 1; } else if (level < 0) { cerr << "Error: cyclic simpleType restriction/extension base dependency in '" << (name ? name : "(null)") << "'" << endl; } return level; } xs__complexType::xs__complexType() { schemaRef = NULL; level = 0; } int xs__complexType::traverse(xs__schema &schema) { if (vflag) cerr << " Analyzing schema complexType '" << (name ? name : "(null)") << "'" << endl; schemaRef = &schema; if (simpleContent) simpleContent->traverse(schema); else if (complexContent) complexContent->traverse(schema); else if (all) all->traverse(schema); else if (choice) choice->traverse(schema); else if (sequence) sequence->traverse(schema); else if (any) any->traverse(schema); for (vector::iterator at = attribute.begin(); at != attribute.end(); ++at) (*at).traverse(schema); for (vector::iterator ag = attributeGroup.begin(); ag != attributeGroup.end(); ++ag) (*ag).traverse(schema); return SOAP_OK; } void xs__complexType::schemaPtr(xs__schema *schema) { schemaRef = schema; } xs__schema *xs__complexType::schemaPtr() const { return schemaRef; } int xs__complexType::baseLevel() { if (!level) { if (simpleContent) { if (simpleContent->restriction) { level = -1; if (simpleContent->restriction->simpleTypePtr()) level = simpleContent->restriction->simpleTypePtr()->baseLevel() + 1; else if (simpleContent->restriction->complexTypePtr()) level = simpleContent->restriction->complexTypePtr()->baseLevel() + 1; else level = 2; } else if (simpleContent->extension) { level = -1; if (simpleContent->extension->simpleTypePtr()) level = simpleContent->extension->simpleTypePtr()->baseLevel() + 1; else if (simpleContent->extension->complexTypePtr()) level = simpleContent->extension->complexTypePtr()->baseLevel() + 1; else level = 2; } } else if (complexContent) { if (complexContent->restriction) { level = -1; if (complexContent->restriction->simpleTypePtr()) level = complexContent->restriction->simpleTypePtr()->baseLevel() + 1; else if (complexContent->restriction->complexTypePtr()) level = complexContent->restriction->complexTypePtr()->baseLevel() + 1; else level = 2; } else if (complexContent->extension) { level = -1; if (complexContent->extension->simpleTypePtr()) level = complexContent->extension->simpleTypePtr()->baseLevel() + 1; else if (complexContent->extension->complexTypePtr()) level = complexContent->extension->complexTypePtr()->baseLevel() + 1; else level = 2; } } else level = 1; } else if (level < 0) { cerr << "Error: cyclic complexType restriction/extension base dependency in '" << (name ? name : "(null)") << "'" << endl; } return level; } int xs__simpleContent::traverse(xs__schema &schema) { if (vflag) cerr << " Analyzing schema simpleContent" << endl; if (extension) extension->traverse(schema); else if (restriction) restriction->traverse(schema); return SOAP_OK; } int xs__complexContent::traverse(xs__schema &schema) { if (vflag) cerr << " Analyzing schema complexContent" << endl; if (extension) extension->traverse(schema); else if (restriction) restriction->traverse(schema); return SOAP_OK; } xs__extension::xs__extension() { simpleTypeRef = NULL; complexTypeRef = NULL; } int xs__extension::traverse(xs__schema &schema) { if (vflag) cerr << " Analyzing schema extension '" << (base ? base : "(null)") << "'" << endl; if (group) group->traverse(schema); else if (all) all->traverse(schema); else if (choice) choice->traverse(schema); else if (sequence) sequence->traverse(schema); for (vector::iterator at = attribute.begin(); at != attribute.end(); ++at) (*at).traverse(schema); for (vector::iterator ag = attributeGroup.begin(); ag != attributeGroup.end(); ++ag) (*ag).traverse(schema); const char *token = qname_token(base, schema.targetNamespace); simpleTypeRef = NULL; if (token) { for (vector::iterator i = schema.simpleType.begin(); i != schema.simpleType.end(); ++i) if (!strcmp((*i).name, token)) { simpleTypeRef = &(*i); if (vflag) cerr << " Found extension base type '" << (token ? token : "(null)") << "'" << endl; break; } } if (!simpleTypeRef) { for (vector::const_iterator i = schema.import.begin(); i != schema.import.end(); ++i) { xs__schema *s = (*i).schemaPtr(); if (s) { token = qname_token(base, s->targetNamespace); if (token) { for (vector::iterator j = s->simpleType.begin(); j != s->simpleType.end(); ++j) { if (!strcmp((*j).name, token)) { simpleTypeRef = &(*j); if (vflag) cerr << " Found extension base type '" << (token ? token : "(null)") << "'" << endl; break; } } if (simpleTypeRef) break; } } } } token = qname_token(base, schema.targetNamespace); complexTypeRef = NULL; if (token) { for (vector::iterator i = schema.complexType.begin(); i != schema.complexType.end(); ++i) if ((*i).name && !strcmp((*i).name, token)) { complexTypeRef = &(*i); if (vflag) cerr << " Found extension base type '" << (token ? token : "(null)") << "'" << endl; break; } } if (!complexTypeRef) { for (vector::const_iterator i = schema.import.begin(); i != schema.import.end(); ++i) { xs__schema *s = (*i).schemaPtr(); if (s) { token = qname_token(base, s->targetNamespace); if (token) { for (vector::iterator j = s->complexType.begin(); j != s->complexType.end(); ++j) { if ((*j).name && !strcmp((*j).name, token)) { complexTypeRef = &(*j); if (vflag) cerr << " Found extension base type '" << (token ? token : "(null)") << "'" << endl; break; } } if (complexTypeRef) break; } } } } if (!simpleTypeRef && !complexTypeRef) { if (base) { if (is_builtin_qname(base)) schema.builtinType(base); else if (!Wflag) cerr << "\nWarning: could not find extension base type '" << base << "' in schema '" << (schema.targetNamespace ? schema.targetNamespace : "(null)") << "'" << endl; } else cerr << "Extension has no base" << endl; } return SOAP_OK; } void xs__extension::simpleTypePtr(xs__simpleType *simpleType) { simpleTypeRef = simpleType; } void xs__extension::complexTypePtr(xs__complexType *complexType) { complexTypeRef = complexType; } xs__simpleType *xs__extension::simpleTypePtr() const { return simpleTypeRef; } xs__complexType *xs__extension::complexTypePtr() const { return complexTypeRef; } xs__restriction::xs__restriction() { simpleTypeRef = NULL; complexTypeRef = NULL; } int xs__restriction::traverse(xs__schema &schema) { if (vflag) cerr << " Analyzing schema restriction '" << (base ? base : "(null)") << "'" << endl; if (simpleType) simpleType->traverse(schema); if (attributeGroup) attributeGroup->traverse(schema); if (group) group->traverse(schema); else if (all) all->traverse(schema); else if (choice) choice->traverse(schema); else if (sequence) sequence->traverse(schema); else { for (vector::iterator en = enumeration.begin(); en != enumeration.end(); ++en) (*en).traverse(schema); for (vector::iterator pn = pattern.begin(); pn != pattern.end(); ++pn) (*pn).traverse(schema); } for (vector::iterator at = attribute.begin(); at != attribute.end(); ++at) (*at).traverse(schema); const char *token = qname_token(base, schema.targetNamespace); simpleTypeRef = NULL; if (token) { for (vector::iterator i = schema.simpleType.begin(); i != schema.simpleType.end(); ++i) if (!strcmp((*i).name, token)) { simpleTypeRef = &(*i); if (vflag) cerr << " Found restriction base type '" << (token ? token : "(null)") << "'" << endl; break; } } if (!simpleTypeRef) { for (vector::const_iterator i = schema.import.begin(); i != schema.import.end(); ++i) { xs__schema *s = (*i).schemaPtr(); if (s) { token = qname_token(base, s->targetNamespace); if (token) { for (vector::iterator j = s->simpleType.begin(); j != s->simpleType.end(); ++j) { if (!strcmp((*j).name, token)) { simpleTypeRef = &(*j); if (vflag) cerr << " Found restriction base type '" << (token ? token : "(null)") << "'" << endl; break; } } if (simpleTypeRef) break; } } } } token = qname_token(base, schema.targetNamespace); complexTypeRef = NULL; if (token) { for (vector::iterator i = schema.complexType.begin(); i != schema.complexType.end(); ++i) if ((*i).name && !strcmp((*i).name, token)) { complexTypeRef = &(*i); if (vflag) cerr << " Found restriction base type '" << (token ? token : "(null)") << "'" << endl; break; } } if (!complexTypeRef) { for (vector::const_iterator i = schema.import.begin(); i != schema.import.end(); ++i) { xs__schema *s = (*i).schemaPtr(); if (s) { token = qname_token(base, s->targetNamespace); if (token) { for (vector::iterator j = s->complexType.begin(); j != s->complexType.end(); ++j) { if ((*j).name && !strcmp((*j).name, token)) { complexTypeRef = &(*j); if (vflag) cerr << " Found restriction base type '" << (token ? token : "(null)") << "'" << endl; break; } } if (complexTypeRef) break; } } } } if (!simpleTypeRef && !complexTypeRef) { if (base) { if (is_builtin_qname(base)) schema.builtinType(base); else if (!Wflag) cerr << "\nWarning: could not find restriction base type '" << base << "' in schema '" << (schema.targetNamespace ? schema.targetNamespace : "(null)") << "'" << endl; } else if (!simpleType) cerr << "Restriction has no base" << endl; } return SOAP_OK; } void xs__restriction::simpleTypePtr(xs__simpleType *simpleType) { simpleTypeRef = simpleType; } void xs__restriction::complexTypePtr(xs__complexType *complexType) { complexTypeRef = complexType; } xs__simpleType *xs__restriction::simpleTypePtr() const { return simpleTypeRef; } xs__complexType *xs__restriction::complexTypePtr() const { return complexTypeRef; } xs__list::xs__list() { itemTypeRef = NULL; } int xs__list::traverse(xs__schema &schema) { if (vflag) cerr << " Analyzing schema list" << endl; if (restriction) restriction->traverse(schema); for (vector::iterator i = simpleType.begin(); i != simpleType.end(); ++i) (*i).traverse(schema); itemTypeRef = NULL; const char *token = qname_token(itemType, schema.targetNamespace); if (token) { for (vector::iterator i = schema.simpleType.begin(); i != schema.simpleType.end(); ++i) if (!strcmp((*i).name, token)) { itemTypeRef = &(*i); if (vflag) cerr << " Found list itemType '" << (token ? token : "(null)") << "'" << endl; break; } } if (!itemTypeRef) { for (vector::const_iterator i = schema.import.begin(); i != schema.import.end(); ++i) { xs__schema *s = (*i).schemaPtr(); if (s) { token = qname_token(itemType, s->targetNamespace); if (token) { for (vector::iterator j = s->simpleType.begin(); j != s->simpleType.end(); ++j) { if (!strcmp((*j).name, token)) { itemTypeRef = &(*j); if (vflag) cerr << " Found list itemType '" << (token ? token : "(null)") << "'" << endl; break; } } if (itemTypeRef) break; } } } } if (itemType && !itemTypeRef) { if (is_builtin_qname(itemType)) schema.builtinType(itemType); else if (!Wflag) cerr << "\nWarning: could not find list itemType '" << itemType << "' in schema '" << (schema.targetNamespace ? schema.targetNamespace : "(null)") << "'" << endl; } return SOAP_OK; } void xs__list::itemTypePtr(xs__simpleType *simpleType) { itemTypeRef = simpleType; } xs__simpleType *xs__list::itemTypePtr() const { return itemTypeRef; } int xs__union::traverse(xs__schema &schema) { if (vflag) cerr << " Analyzing schema union" << endl; for (vector::iterator i = simpleType.begin(); i != simpleType.end(); ++i) (*i).traverse(schema); return SOAP_OK; } int xs__all::traverse(xs__schema &schema) { if (vflag) cerr << " Analyzing schema all" << endl; for (vector::iterator i = element.begin(); i != element.end(); ++i) (*i).traverse(schema); return SOAP_OK; } int xs__contents::traverse(xs__schema &schema) { switch (__union) { case SOAP_UNION_xs__union_content_element: if (__content.element) __content.element->traverse(schema); break; case SOAP_UNION_xs__union_content_group: if (__content.group) __content.group->traverse(schema); break; case SOAP_UNION_xs__union_content_choice: if (__content.choice) __content.choice->traverse(schema); break; case SOAP_UNION_xs__union_content_sequence: if (__content.sequence) __content.sequence->traverse(schema); break; case SOAP_UNION_xs__union_content_any: if (__content.any) __content.any->traverse(schema); break; } return SOAP_OK; } xs__seqchoice::xs__seqchoice() { schemaRef = NULL; } int xs__seqchoice::traverse(xs__schema &schema) { if (vflag) cerr << " Analyzing schema sequence/choice" << endl; schemaRef = &schema; for (vector::iterator c = __contents.begin(); c != __contents.end(); ++c) (*c).traverse(schema); return SOAP_OK; } void xs__seqchoice::schemaPtr(xs__schema *schema) { schemaRef = schema; } xs__schema *xs__seqchoice::schemaPtr() const { return schemaRef; } xs__attributeGroup::xs__attributeGroup() { schemaRef = NULL; attributeGroupRef = NULL; } int xs__attributeGroup::traverse(xs__schema& schema) { if (vflag) cerr << " Analyzing schema attributeGroup" << endl; schemaRef = &schema; for (vector::iterator at = attribute.begin(); at != attribute.end(); ++at) (*at).traverse(schema); for (vector::iterator ag = attributeGroup.begin(); ag != attributeGroup.end(); ++ag) (*ag).traverse(schema); attributeGroupRef = NULL; if (ref) { const char *token = qname_token(ref, schema.targetNamespace); if (token) { for (vector::iterator i = schema.attributeGroup.begin(); i != schema.attributeGroup.end(); ++i) if (!strcmp((*i).name, token)) { attributeGroupRef = &(*i); if (vflag) cerr << " Found attributeGroup '" << (name ? name : "(null)") << "' ref '" << (token ? token : "(null)") << "'" << endl; break; } } if (!attributeGroupRef) { for (vector::const_iterator i = schema.import.begin(); i != schema.import.end(); ++i) { xs__schema *s = (*i).schemaPtr(); if (s) { token = qname_token(ref, s->targetNamespace); if (token) { for (vector::iterator j = s->attributeGroup.begin(); j != s->attributeGroup.end(); ++j) { if (!strcmp((*j).name, token)) { attributeGroupRef = &(*j); if (vflag) cerr << " Found attribute Group '" << (name ? name : "(null)") << "' ref '" << (token ? token : "(null)") << "'" << endl; break; } } if (attributeGroupRef) break; } } } } if (!attributeGroupRef) if (!Wflag) cerr << "\nWarning: could not find the referenced attributeGroup '" << (name ? name : "") << "' ref '" << (ref ? ref : "(null)") << "' in schema '" << (schema.targetNamespace ? schema.targetNamespace : "(null)") << "'" << endl; } return SOAP_OK; } void xs__attributeGroup::schemaPtr(xs__schema *schema) { schemaRef = schema; } void xs__attributeGroup::attributeGroupPtr(xs__attributeGroup *attributeGroup) { attributeGroupRef = attributeGroup; } xs__schema *xs__attributeGroup::schemaPtr() const { return schemaRef; } xs__attributeGroup *xs__attributeGroup::attributeGroupPtr() const { return attributeGroupRef; } int xs__any::traverse(xs__schema &schema) { if (vflag) cerr << " Analyzing schema any" << endl; for (vector::iterator i = element.begin(); i != element.end(); ++i) (*i).traverse(schema); return SOAP_OK; } xs__group::xs__group() { schemaRef = NULL; groupRef = NULL; } int xs__group::traverse(xs__schema &schema) { if (vflag) cerr << " Analyzing schema group" << endl; schemaRef = &schema; if (all) all->traverse(schema); else if (choice) choice->traverse(schema); else if (sequence) sequence->traverse(schema); groupRef = NULL; if (ref) { const char *token = qname_token(ref, schema.targetNamespace); if (token) { for (vector::iterator i = schema.group.begin(); i != schema.group.end(); ++i) if (!strcmp((*i).name, token)) { groupRef = &(*i); if (vflag) cerr << " Found group '" << (name ? name : "(null)") << "' ref '" << (token ? token : "(null)") << "'" << endl; break; } } if (!groupRef) { for (vector::const_iterator i = schema.import.begin(); i != schema.import.end(); ++i) { xs__schema *s = (*i).schemaPtr(); if (s) { token = qname_token(ref, s->targetNamespace); if (token) { for (vector::iterator j = s->group.begin(); j != s->group.end(); ++j) { if (!strcmp((*j).name, token)) { groupRef = &(*j); if (vflag) cerr << " Found group '" << (name ? name : "(null)") << "' ref '" << (token ? token : "(null)") << "'" << endl; break; } } if (groupRef) break; } } } } if (!groupRef) if (!Wflag) cerr << "\nWarning: could not find the referenced group '" << (name ? name : "") << "' ref '" << (ref ? ref : "(null)") << "' in schema '" << (schema.targetNamespace ? schema.targetNamespace : "(null)") << "'" << endl; } return SOAP_OK; } void xs__group::schemaPtr(xs__schema *schema) { schemaRef = schema; } xs__schema* xs__group::schemaPtr() const { return schemaRef; } void xs__group::groupPtr(xs__group *group) { groupRef = group; } xs__group* xs__group::groupPtr() const { return groupRef; } int xs__enumeration::traverse(xs__schema &schema) { (void)schema; if (vflag) cerr << " Analyzing schema enumeration '" << (value ? value : "(null)") << "'" << endl; return SOAP_OK; } int xs__pattern::traverse(xs__schema &schema) { (void)schema; if (vflag) cerr << " Analyzing schema pattern" << endl; return SOAP_OK; } //////////////////////////////////////////////////////////////////////////////// // // I/O // //////////////////////////////////////////////////////////////////////////////// ostream &operator<<(ostream &o, const xs__schema &e) { if (!e.soap) { struct soap soap; soap_init2(&soap, SOAP_IO_DEFAULT, SOAP_XML_TREE | SOAP_C_UTFSTRING); soap_set_namespaces(&soap, namespaces); e.soap_serialize(&soap); soap_begin_send(&soap); e.soap_out(&soap, "xs:schema", 0, NULL); soap_end_send(&soap); soap_end(&soap); soap_done(&soap); } else { ostream *os = e.soap->os; e.soap->os = &o; e.soap_serialize(e.soap); soap_begin_send(e.soap); e.soap_out(e.soap, "xs:schema", 0, NULL); soap_end_send(e.soap); e.soap->os = os; } return o; } istream &operator>>(istream &i, xs__schema &e) { if (!e.soap) { e.soap = soap_new(); soap_set_namespaces(e.soap, namespaces); } istream *is = e.soap->is; e.soap->is = &i; if (soap_begin_recv(e.soap) || !e.soap_in(e.soap, "xs:schema", NULL) || soap_end_recv(e.soap)) { // handle error? Note: e.soap->error is set and app should check } e.soap->is = is; return i; } gsoap-2.8.28/gsoap/wsdl/wsp.h0000644000175000017500000002014012653650160015331 0ustar ellertellert/* wsp.h WS-Policy 1.2 and 1.5 binding schema -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2010, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap wsp schema documentation: WS-Policy binding //gsoap wsp schema namespace: http://www.w3.org/ns/ws-policy // 1.2 //gsoap wsp schema namespace: http://schemas.xmlsoap.org/ws/2004/09/policy //gsoap wsp schema elementForm: qualified //gsoap wsp schema attributeForm: unqualified #import "imports.h" #import "wsu.h" class wsp__Policy; class wsp__Content; extern class Service; extern class Types; class wsp__PolicyReference { public: @xsd__anyURI URI; @xsd__string Digest; @xsd__anyURI DigestAlgorithm; private: wsp__Policy *policyRef; public: int traverse(wsdl__definitions&); void policyPtr(wsp__Policy*); wsp__Policy *policyPtr() const; }; class wsp__Assertion { public: @bool Optional = false; @bool Ignorable = false; wsp__Content *Policy; }; #import "sp.h" #import "wsrmp.h" #import "wsam.h" class wsp__Content { public: wsp__Policy *Policy; wsp__PolicyReference *PolicyReference; std::vector All; std::vector ExactlyOne; std::vector sp__SignedParts; std::vector sp__EncryptedParts; std::vector sp__RequiredParts; sp__Elements *sp__SignedElements; sp__Elements *sp__EncryptedElements; sp__Elements *sp__ContentEncryptedElements; sp__Elements *sp__RequiredElements; sp__Token *sp__UsernameToken; sp__Token *sp__IssuedToken; sp__Token *sp__X509Token; sp__Token *sp__KerberosToken; sp__Token *sp__SpnegoContextToken; sp__Token *sp__SecurityContextToken; sp__Token *sp__SecureConversationToken; sp__Token *sp__SamlToken; sp__Token *sp__RelToken; sp__Token *sp__HttpsToken; sp__Token *sp__KeyValueToken; wsp__Assertion *sp__TransportBinding; wsp__Assertion *sp__TransportToken; wsp__Assertion *sp__AlgorithmSuite; wsp__Assertion *sp__Layout; wsp__Assertion *sp__SymmetricBinding; wsp__Assertion *sp__AsymmetricBinding; wsp__Assertion *sp__ProtectionToken; wsp__Assertion *sp__InitiatorToken; wsp__Assertion *sp__InitiatorSignatureToken; wsp__Assertion *sp__InitiatorEncryptionToken; wsp__Assertion *sp__RecipientToken; wsp__Assertion *sp__SupportingTokens; wsp__Assertion *sp__SignedSupportingTokens; wsp__Assertion *sp__EndorsingSupportingTokens; wsp__Assertion *sp__SignedEndorsingSupportingTokens; wsp__Assertion *sp__SignedEncryptedSupportingTokens; wsp__Assertion *sp__EncryptedSupportingTokens; wsp__Assertion *sp__EndorsingEncryptedSupportingTokens; wsp__Assertion *sp__SignedEndorsingEncryptedSupportingTokens; wsp__Assertion *sp__Wss10; wsp__Assertion *sp__Wss11; wsp__Assertion *sp__Trust10; wsp__Assertion *sp__Trust13; wsp__Content *sp__BootstrapPolicy; xsd__string wsaw__UsingAddressing; wsp__Assertion *wsam__Addressing; wsrmp__RMAssertion *wsrmp__RMAssertion_; wsrmp__RMAssertion *wsrmp__DeliveryAssurance; xsd__string wsrmp__AtLeastOnce; xsd__string wsrmp__AtMostOnce; xsd__string wsrmp__ExactlyOnce; xsd__string wsrmp__InOrder; wsp__Assertion *sp__NoPassword; wsp__Assertion *sp__HashPassword; wsp__Assertion *sp__IncludeTimestamp; wsp__Assertion *sp__EncryptBeforeSigning; wsp__Assertion *sp__EncryptSignature; wsp__Assertion *sp__ProtectTokens; wsp__Assertion *sp__OnlySignEntireHeadersAndBody; xsd__string sp__RequireDerivedKeys; xsd__string sp__RequireImpliedDerivedKeys; xsd__string sp__RequireExplicitDerivedKeys; xsd__string sp__WssUsernameToken10; xsd__string sp__WssUsernameToken11; xsd__string sp__RequireExternalReference; xsd__string sp__RequireInternalReference; xsd__string sp__RequireKeyIdentifierReference; xsd__string sp__RequireIssuerSerialReference; xsd__string sp__RequireEmbeddedTokenReference; xsd__string sp__RequireThumbprintReference; xsd__string sp__WssX509V3Token10; xsd__string sp__WssX509Pkcs7Token10; xsd__string sp__WssX509PkiPathV1Token10; xsd__string sp__WssX509V1Token11; xsd__string sp__WssX509V3Token11; xsd__string sp__WssX509Pkcs7Token11; xsd__string sp__WssX509PkiPathV1Token11; xsd__string sp__WssKerberosV5ApReqToken11; xsd__string sp__WssGssKerberosV5ApReqToken11; xsd__string sp__WssRelV10Token10; xsd__string sp__WssRelV20Token10; xsd__string sp__WssRelV10Token11; xsd__string sp__WssRelV20Token11; xsd__string sp__MustNotSendCancel; xsd__string sp__MustNotSendAmend; xsd__string sp__MustNotSendRenew; xsd__string sp__MustSupportRefKeyIdentifier; xsd__string sp__MustSupportRefIssuerSerial; xsd__string sp__MustSupportRefExternalURI; xsd__string sp__MustSupportRefEmbeddedToken; xsd__string sp__MustSupportRefThumbprint; xsd__string sp__MustSupportRefEncryptedKey; xsd__string sp__RequireSignatureConfirmation; xsd__string sp__MustSupportClientChallenge; xsd__string sp__MustSupportServerChallenge; xsd__string sp__RequireClientEntropy; xsd__string sp__RequireServerEntropy; xsd__string sp__MustSupportIssuedTokens; xsd__string sp__RequireRequestSecurityTokenCollection; xsd__string sp__RequireAppliesTo; xsd__string sp__RequireExternalUriReference; xsd__string sp__SC13SecurityContextToken; xsd__string sp__Strict; xsd__string sp__Lax; xsd__string sp__LaxTsFirst; xsd__string sp__LaxTsLast; xsd__string sp__HttpBasicAuthentication; xsd__string sp__HttpDigestAuthentication; xsd__string sp__RequireClientCertificate; xsd__string sp__Basic256; xsd__string sp__Basic192; xsd__string sp__Basic128; xsd__string sp__TripleDes; xsd__string sp__Basic256Rsa15; xsd__string sp__Basic192Rsa15; xsd__string sp__Basic128Rsa15; xsd__string sp__TripleDesRsa15; xsd__string sp__Basic256Sha256; xsd__string sp__Basic192Sha256; xsd__string sp__Basic128Sha256; xsd__string sp__TripleDesSha256; xsd__string sp__Basic256Sha256Rsa15; xsd__string sp__Basic192Sha256Rsa15; xsd__string sp__Basic128Sha256Rsa15; xsd__string sp__TripleDesSha256Rsa15; xsd__string sp__InclusiveC14N; xsd__string sp__SOAPNormalization10; xsd__string sp__STRTransform10; xsd__string sp__Path10; xsd__string sp__XPathFilter20; xsd__string sp__AbsXPath; xsd__string wsam__AnonymousResponses; xsd__string wsam__NonAnonymousResponses; std::vector<_XML> __any; public: int traverse(wsdl__definitions&); void generate(Service& service, Types& types, int indent) const; }; class wsp__Policy : public wsp__Content { public: @xsd__anyURI xml__base; @xsd__string wsu__Id; @xsd__anyURI TargetNamespace; }; class wsp__Attachment { public: wsp__Policy *Policy; wsp__PolicyReference *PolicyReference; }; class wsp__AppliesTo { public: _XML __any; }; class wsp__PolicyAttachment { public: wsp__AppliesTo *AppliesTo; std::vector Attachment; }; gsoap-2.8.28/gsoap/wsdl/wsp.cpp0000644000175000017500000010340112653650160015666 0ustar ellertellert/* wsp.cpp WS-Policy 1.2 and 1.5 binding schema -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2010, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "wsdlH.h" #include "includes.h" #include "types.h" #include "service.h" static wsp__Policy *search(const char *URI, wsdl__definitions& definitions); static wsp__Policy *search(const char *URI, wsp__Policy *policy); static wsp__Policy *search(const char *URI, wsp__Content *content); static void gen_parts(const sp__Parts& parts, Types& types, const char *what, const char *name, int indent); //////////////////////////////////////////////////////////////////////////////// // // wsp:OperatorContentType // //////////////////////////////////////////////////////////////////////////////// int wsp__Content::traverse(wsdl__definitions& definitions) { if (vflag) cerr << " Analyzing wsp Policy" << endl; if (Policy) Policy->traverse(definitions); if (PolicyReference) PolicyReference->traverse(definitions); for (vector::iterator i = All.begin(); i != All.end(); ++i) { if (*i) (*i)->traverse(definitions); } for (vector::iterator j = ExactlyOne.begin(); j != ExactlyOne.end(); ++j) { if (*j) (*j)->traverse(definitions); } return SOAP_OK; } void wsp__Content::generate(Service& service, Types& types, int indent) const { static const char stabs[] = "\t\t\t\t\t\t\t\t\t\t"; const char *tabs; if (indent > 8) indent = 8; tabs = stabs + 9 - indent; // Recursive policies and references if (Policy) Policy->generate(service, types, indent); if (PolicyReference && PolicyReference->policyPtr()) PolicyReference->policyPtr()->generate(service, types, indent); // WS-Policy All if (!All.empty()) { fprintf(stream, "%s- All of the following:\n", tabs); for (vector::const_iterator p = All.begin(); p != All.end(); ++p) if (*p) (*p)->generate(service, types, indent + 1); } // WS-Policy ExactlyOne if (!ExactlyOne.empty()) { fprintf(stream, "%s- Exactly one of the following:\n", tabs); for (vector::const_iterator p = ExactlyOne.begin(); p != ExactlyOne.end(); ++p) if (*p) (*p)->generate(service, types, indent + 1); } // WS-SecurityPolicy Parts (TODO: do we need vectors of these?) for (vector::const_iterator sp = sp__SignedParts.begin(); sp != sp__SignedParts.end(); ++sp) gen_parts(*sp, types, "sign", "[4.1.1] WS-Security Signed Parts", indent); for (vector::const_iterator ep = sp__EncryptedParts.begin(); ep != sp__EncryptedParts.end(); ++ep) gen_parts(*ep, types, "encrypt", "[4.2.1] Security Encrypted Parts", indent); for (vector::const_iterator rp = sp__RequiredParts.begin(); rp != sp__RequiredParts.end(); ++rp) { fprintf(stream, "%s- Required Header elements:", tabs); for (vector::const_iterator h = (*rp).Header.begin(); h != (*rp).Header.end(); ++h) if ((*h).Name) fprintf(stream, " %s", types.aname(NULL, (*h).Namespace, (*h).Name)); else if ((*h).Namespace) fprintf(stream, " %s", (*h).Namespace); } // WS-SecurityPolicy Elements sp__Elements *elts = NULL; const char *elts_name = NULL; if (sp__SignedElements) { elts = sp__SignedElements; elts_name = "[4.1.2] Signed"; } if (sp__EncryptedElements) { elts = sp__EncryptedElements; elts_name = "[4.2.2] Encrypted"; } if (sp__ContentEncryptedElements) { elts = sp__ContentEncryptedElements; elts_name = "[4.2.3] Content Encrypted"; } if (sp__RequiredElements) { elts = sp__RequiredElements; elts_name = "[4.3.1] Required"; } if (elts) { fprintf(stream, "%s- %s Elements requirements (XPath%s):\n%s @verbatim\n", tabs, elts_name, elts->XPathVersion?elts->XPathVersion:"", tabs); for (vector::const_iterator s = elts->XPath.begin(); s != elts->XPath.end(); ++s) { fprintf(stream, "%s ", tabs); text(*s); } fprintf(stream, "%s @endverbatim\n", tabs); service.add_import("wsse.h"); } // WS-SecurityPolicy Tokens sp__Token *token = NULL; const char *token_name = NULL; if (sp__UsernameToken) { token = sp__UsernameToken; token_name = "[5.4.1] WS-Security Username"; } else if (sp__IssuedToken) { token = sp__IssuedToken; token_name = "[5.4.2] WS-Trust Issued"; } else if (sp__X509Token) { token = sp__X509Token; token_name = "[5.4.3] WS-Security X509"; } else if (sp__KerberosToken) { token = sp__KerberosToken; token_name = "[5.4.4] WS-Security Kerberos"; } else if (sp__SpnegoContextToken) { token = sp__SpnegoContextToken; token_name = "[5.4.5] WS-Trust n-leg RST/RSTR SPNEGO binary negotiation protocol (SpnegoContext)"; } else if (sp__SecurityContextToken) { token = sp__SecurityContextToken; token_name = "[5.4.6] WS-SecureConversation SecurityContext"; } else if (sp__SecureConversationToken) { token = sp__SecureConversationToken; token_name = "[5.4.7] WS-SecureConversation"; } else if (sp__SamlToken) { token = sp__SamlToken; token_name = "[5.4.8] SAML"; } else if (sp__RelToken) { token = sp__RelToken; token_name = "[5.4.9] WSS-REL"; } else if (sp__HttpsToken) { token = sp__HttpsToken; token_name = "[5.4.10] HTTPS"; } else if (sp__KeyValueToken) { token = sp__KeyValueToken; token_name = "[5.4.11] XML Signature"; } if (token) { fprintf(stream, "%s- %s required:\n", tabs, token_name); if (token->IncludeToken) fprintf(stream, "%s -# IncludeToken = %s\n", tabs, token->IncludeToken); if (token->Issuer && token->Issuer->Address) fprintf(stream, "%s -# Issuer = %s\n", tabs, token->Issuer->Address); if (token->IssuerName) fprintf(stream, "%s -# Issuer Name = %s\n", tabs, token->IssuerName); if (token->Policy) token->Policy->generate(service, types, indent + 1); // TODO: add wst:Claims? service.add_import("wsse.h"); } // WS-SecurityPolicy if (sp__AlgorithmSuite) { fprintf(stream, "%s- [7.1] Security Binding Algorithm Suite requirements:\n", tabs); if (sp__AlgorithmSuite->Policy) sp__AlgorithmSuite->Policy->generate(service, types, indent + 1); } if (sp__Layout) { fprintf(stream, "%s- [7.2] WS-Security Header Layout requirements:\n", tabs); if (sp__Layout->Policy) sp__Layout->Policy->generate(service, types, indent + 1); } if (sp__TransportBinding) { fprintf(stream, "%s- [7.3] Transport Binding%s requirements:\n", tabs, sp__TransportBinding->Optional ? " (optional)" : sp__TransportBinding->Ignorable ? " (ignorable)" : ""); if (sp__TransportBinding->Policy) sp__TransportBinding->Policy->generate(service, types, indent + 1); } if (sp__TransportToken) { fprintf(stream, "%s- Transport%s requirements:\n", tabs, sp__TransportToken->Optional ? " (optional)" : sp__TransportToken->Ignorable ? " (ignorable)" : ""); if (sp__TransportToken->Policy) sp__TransportToken->Policy->generate(service, types, indent + 1); } if (sp__SymmetricBinding) { fprintf(stream, "%s- [7.4] WS-Security Symmetric Binding%s requirements:\n", tabs, sp__SymmetricBinding->Optional ? " (optional)" : sp__SymmetricBinding->Ignorable ? " (ignorable)" : ""); if (sp__SymmetricBinding->Policy) sp__SymmetricBinding->Policy->generate(service, types, indent + 1); service.add_import("wsse.h"); } if (sp__ProtectionToken) { fprintf(stream, "%s- Symmetric Protection%s requirements:\n", tabs, sp__ProtectionToken->Optional ? " (optional)" : sp__ProtectionToken->Ignorable ? " (ignorable)" : ""); if (sp__ProtectionToken->Policy) sp__ProtectionToken->Policy->generate(service, types, indent + 1); } if (sp__AsymmetricBinding) { fprintf(stream, "%s- [7.5] WS-Security Asymmetric Binding%s (public key) requirements:\n", tabs, sp__AsymmetricBinding->Optional ? " (optional)" : sp__AsymmetricBinding->Ignorable ? " (ignorable)" : ""); if (sp__AsymmetricBinding->Policy) sp__AsymmetricBinding->Policy->generate(service, types, indent + 1); service.add_import("wsse.h"); } if (sp__InitiatorToken) { fprintf(stream, "%s- Initiator%s requirements:\n", tabs, sp__InitiatorToken->Optional ? " (optional)" : sp__InitiatorToken->Ignorable ? " (ignorable)" : ""); if (sp__InitiatorToken->Policy) sp__InitiatorToken->Policy->generate(service, types, indent + 1); } if (sp__InitiatorSignatureToken) { fprintf(stream, "%s- Initiator Signature%s requirements:\n", tabs, sp__InitiatorSignatureToken->Optional ? " (optional)" : sp__InitiatorSignatureToken->Ignorable ? " (ignorable)" : ""); if (sp__InitiatorSignatureToken->Policy) sp__InitiatorSignatureToken->Policy->generate(service, types, indent + 1); } if (sp__InitiatorEncryptionToken) { fprintf(stream, "%s- Initiator Encryption%s requirements:\n", tabs, sp__InitiatorEncryptionToken->Optional ? " (optional)" : sp__InitiatorEncryptionToken->Ignorable ? " (ignorable)" : ""); if (sp__InitiatorEncryptionToken->Policy) sp__InitiatorEncryptionToken->Policy->generate(service, types, indent + 1); } if (sp__RecipientToken) { fprintf(stream, "%s- Recipient%s requirements:\n", tabs, sp__RecipientToken->Optional ? " (optional)" : sp__RecipientToken->Ignorable ? " (ignorable)" : ""); if (sp__RecipientToken->Policy) sp__RecipientToken->Policy->generate(service, types, indent + 1); } if (sp__SupportingTokens) { fprintf(stream, "%s- [8.1] Supporting Tokens%s requirements:\n", tabs, sp__SupportingTokens->Optional ? " (optional)" : sp__SupportingTokens->Ignorable ? " (ignorable)" : ""); if (sp__SupportingTokens->Policy) sp__SupportingTokens->Policy->generate(service, types, indent + 1); } if (sp__SignedSupportingTokens) { fprintf(stream, "%s- [8.2] Signed Supporting Tokens%s requirements:\n", tabs, sp__SignedSupportingTokens->Optional ? " (optional)" : sp__SignedSupportingTokens->Ignorable ? " (ignorable)" : ""); if (sp__SignedSupportingTokens->Policy) sp__SignedSupportingTokens->Policy->generate(service, types, indent + 1); } if (sp__EndorsingSupportingTokens) { fprintf(stream, "%s- [8.3] Endorsing Supporting Tokens%s requirements:\n", tabs, sp__EndorsingSupportingTokens->Optional ? " (optional)" : sp__EndorsingSupportingTokens->Ignorable ? " (ignorable)" : ""); if (sp__EndorsingSupportingTokens->Policy) sp__EndorsingSupportingTokens->Policy->generate(service, types, indent + 1); } if (sp__SignedEndorsingSupportingTokens) { fprintf(stream, "%s- [8.4] Signed Endorsing Supporting Tokens%s requirements:\n", tabs, sp__SignedEndorsingSupportingTokens->Optional ? " (optional)" : sp__SignedEndorsingSupportingTokens->Ignorable ? " (ignorable)" : ""); if (sp__SignedEndorsingSupportingTokens->Policy) sp__SignedEndorsingSupportingTokens->Policy->generate(service, types, indent + 1); } if (sp__SignedEncryptedSupportingTokens) { fprintf(stream, "%s- [8.5] Signed Encrypted Supporting Tokens%s requirements:\n", tabs, sp__SignedEncryptedSupportingTokens->Optional ? " (optional)" : sp__SignedEncryptedSupportingTokens->Ignorable ? " (ignorable)" : ""); if (sp__SignedEncryptedSupportingTokens->Policy) sp__SignedEncryptedSupportingTokens->Policy->generate(service, types, indent + 1); } if (sp__EncryptedSupportingTokens) { fprintf(stream, "%s- [8.6] Encrypted Supporting Tokens%s requirements:\n", tabs, sp__EncryptedSupportingTokens->Optional ? " (optional)" : sp__EncryptedSupportingTokens->Ignorable ? " (ignorable)" : ""); if (sp__EncryptedSupportingTokens->Policy) sp__EncryptedSupportingTokens->Policy->generate(service, types, indent + 1); } if (sp__EndorsingEncryptedSupportingTokens) { fprintf(stream, "%s- [8.7] Endorsing Encrypted Supporting Tokens%s requirements:\n", tabs, sp__EndorsingEncryptedSupportingTokens->Optional ? " (optional)" : sp__EndorsingEncryptedSupportingTokens->Ignorable ? " (ignorable)" : ""); if (sp__EndorsingEncryptedSupportingTokens->Policy) sp__EndorsingEncryptedSupportingTokens->Policy->generate(service, types, indent + 1); } if (sp__SignedEndorsingEncryptedSupportingTokens) { fprintf(stream, "%s- [8.8] Signed Endorsing Encrypted Supporting Tokens%s requirements:\n", tabs, sp__SignedEndorsingEncryptedSupportingTokens->Optional ? " (optional)" : sp__SignedEndorsingEncryptedSupportingTokens->Ignorable ? " (ignorable)" : ""); if (sp__SignedEndorsingEncryptedSupportingTokens->Policy) sp__SignedEndorsingEncryptedSupportingTokens->Policy->generate(service, types, indent + 1); } // Wss10 or Wss11 if (sp__Wss10) { fprintf(stream, "%s- [9.1] WSS: SOAP Message Security 1.0%s options:\n", tabs, sp__Wss10->Optional ? " (optional)" : sp__Wss10->Ignorable ? " (ignorable)" : ""); if (sp__Wss10->Policy) sp__Wss10->Policy->generate(service, types, indent + 1); service.add_import("wsse.h"); } else if (sp__Wss11) { fprintf(stream, "%s- [9.2] WSS: SOAP Message Security 1.1%s options:\n", tabs, sp__Wss11->Optional ? " (optional)" : sp__Wss11->Ignorable ? " (ignorable)" : ""); if (sp__Wss11->Policy) sp__Wss11->Policy->generate(service, types, indent + 1); service.add_import("wsse.h"); } if (sp__MustSupportRefKeyIdentifier) fprintf(stream, "%s- Key Identifier References\n", tabs); if (sp__MustSupportRefIssuerSerial) fprintf(stream, "%s- Issuer Serial References\n", tabs); if (sp__MustSupportRefExternalURI) fprintf(stream, "%s- External URI References\n", tabs); if (sp__MustSupportRefEmbeddedToken) fprintf(stream, "%s- Embedded Token References\n", tabs); if (sp__MustSupportRefThumbprint) fprintf(stream, "%s- Thumbprint References\n", tabs); if (sp__MustSupportRefEncryptedKey) fprintf(stream, "%s- EncryptedKey References\n", tabs); if (sp__RequireSignatureConfirmation) fprintf(stream, "%s- Signature Confirmation\n", tabs); // WS-SecureConversation if (sp__RequireDerivedKeys) fprintf(stream, "%s- Properties = WS-SecureConversation RequireDerivedKeys\n", tabs); else if (sp__RequireImpliedDerivedKeys) fprintf(stream, "%s- Properties = WS-SecureConversation RequireImpliedDerivedKeys\n", tabs); else if (sp__RequireExplicitDerivedKeys) fprintf(stream, "%s- Properties = WS-SecureConversation RequireExplicitDerivedKeys\n", tabs); if (sp__MustNotSendCancel) fprintf(stream, "%s- WS-SecureConversation STS issuing the secure conversation token does not support SCT/Cancel RST messages", tabs); else if (sp__MustNotSendAmend) fprintf(stream, "%s- WS-SecureConversation STS issuing the secure conversation token does not support SCT/Amend RST messages", tabs); else if (sp__MustNotSendRenew) fprintf(stream, "%s- WS-SecureConversation STS issuing the secure conversation token does not support SCT/Renew RST messages", tabs); if (sp__RequireExternalUriReference) fprintf(stream, "%s- WS-SecureConversation external URI reference is required", tabs); if (sp__SC13SecurityContextToken) fprintf(stream, "%s- WS-SecureConversation Security Context Token should be used", tabs); // WS-Security passwords if (sp__NoPassword) fprintf(stream, "%s- No WS-Security password%s required\n", tabs, sp__NoPassword->Optional ? " (optional)" : sp__NoPassword->Ignorable ? " (ignorable)" : ""); else if (sp__HashPassword) { fprintf(stream, "%s- Client-side WS-Security password%s should be set:\n\t@code\n\t#include \"plugin/wsseapi.h\"\n\tsoap_wsse_add_UsernameTokenDigest(soap, \"User\", \"\", \"\");\n\t@endcode\n", tabs, sp__HashPassword->Optional ? " (optional)" : sp__HashPassword->Ignorable ? " (ignorable)" : ""); fprintf(stream, "%s- Server-side WS-Security password%s verified with:\n\t@code\n\t#include \"plugin/wsseapi.h\"\n\tconst char *username = soap_wsse_get_Username(soap);\n\t...\n\tif (soap_wsse_verify_Password(soap, \"\")) ......\n\t@endcode\n", tabs, sp__HashPassword->Optional ? " (optional)" : sp__HashPassword->Ignorable ? " (ignorable)" : ""); service.add_import("wsse.h"); } if (sp__WssUsernameToken10) { fprintf(stream, "%s- Username token should be used as defined in UsernameTokenProfile1.0:\n", tabs); fprintf(stream, "%s - Client-side WS-Security password should be set:\n\t@code\n\t#include \"plugin/wsseapi.h\"\n\tsoap_wsse_add_UsernameTokenDigest(soap, \"User\", \"\", \"\");\n\t@endcode\n", tabs); fprintf(stream, "%s - Server-side WS-Security password verified with:\n\t@code\n\t#include \"plugin/wsseapi.h\"\n\tconst char *username = soap_wsse_get_Username(soap);\n\t...\n\tif (soap_wsse_verify_Password(soap, \"\")) \n\t@endcode\n", tabs); service.add_import("wsse.h"); } else if (sp__WssUsernameToken11) { fprintf(stream, "%s- Username token should be used as defined in UsernameTokenProfile1.1:\n", tabs); fprintf(stream, "%s - Client-side WS-Security plain-text password should be set:\n\t@code\n\t#include \"plugin/wsseapi.h\"\n\tsoap_wsse_add_UsernameToken(soap, \"User\", \"\", \"\");\n\t@endcode\n", tabs); fprintf(stream, "%s - Client-side WS-Security digest password should be set:\n\t@code\n\t#include \"plugin/wsseapi.h\"\n\tsoap_wsse_add_UsernameTokenDigest(soap, \"User\", \"\", \"\");\n\t@endcode\n", tabs); fprintf(stream, "%s - Server-side WS-Security password verified with:\n\t@code\n\t#include \"plugin/wsseapi.h\"\n\tconst char *username = soap_wsse_get_Username(soap);\n\t...\n\tif (soap_wsse_verify_Password(soap, \"\")) ...\n\t@endcode\n", tabs); service.add_import("wsse.h"); } // WS-Trust if (sp__RequireExternalReference) fprintf(stream, "%s- WS-Trust external reference is required when referencing this token\n", tabs); else if (sp__RequireInternalReference) fprintf(stream, "%s- WS-Trust internal reference is required when referencing this token\n", tabs); // WS-Trust 1.0 and 1.3 if (sp__Trust10) { fprintf(stream, "%s- [10.1] WS-Trust 1.0%s options:\n", tabs, sp__Trust10->Optional ? " (optional)" : sp__Trust10->Ignorable ? " (ignorable)" : ""); if (sp__Trust10->Policy) sp__Trust10->Policy->generate(service, types, indent + 1); service.add_import("wst.h"); } else if (sp__Trust13) { fprintf(stream, "%s- [10.1] WS-Trust 1.3%s options:\n", tabs, sp__Trust13->Optional ? " (optional)" : sp__Trust13->Ignorable ? " (ignorable)" : ""); if (sp__Trust13->Policy) sp__Trust13->Policy->generate(service, types, indent + 1); service.add_import("wst.h"); } if (sp__MustSupportClientChallenge) { fprintf(stream, "%s- Client Challenge\n", tabs); service.add_import("wst.h"); } if (sp__MustSupportServerChallenge) { fprintf(stream, "%s- Server Challenge\n", tabs); service.add_import("wst.h"); } if (sp__RequireClientEntropy) { fprintf(stream, "%s- Client Entropy\n", tabs); service.add_import("wst.h"); } if (sp__RequireServerEntropy) { fprintf(stream, "%s- Server Entropy\n", tabs); service.add_import("wst.h"); } if (sp__MustSupportIssuedTokens) { fprintf(stream, "%s- Issued Tokens\n", tabs); service.add_import("wst.h"); } if (sp__RequireRequestSecurityTokenCollection) { fprintf(stream, "%s- Collection\n", tabs); service.add_import("wst.h"); } if (sp__RequireAppliesTo) { fprintf(stream, "%s- STS requires the requestor to specify the scope for the issued token using wsp:AppliesTo in the RST\n", tabs); service.add_import("wst.h"); } // WS-Security header layout if (sp__IncludeTimestamp) { fprintf(stream, "%s- WS-Security Timestamp%s should be set prior to send:\n\t@code\n\t#include \"plugin/wsseapi.h\"\n\tsoap_wsse_add_Timestamp(soap, \"Timestamp\", );\n\t@endcode\n", tabs, sp__IncludeTimestamp->Optional ? " (optional)" : sp__IncludeTimestamp->Ignorable ? " (ignorable)" : ""); fprintf(stream, "%s- WS-Security Timestamp%s presence and expiration verified post-receive with:\n\t@code\n\t#include \"plugin/wsseapi.h\"\n\tif (soap_wsse_verify_Timestamp(soap)) ......\n\t@endcode\n", tabs, sp__IncludeTimestamp->Optional ? " (optional)" : sp__IncludeTimestamp->Ignorable ? " (ignorable)" : ""); } if (sp__EncryptBeforeSigning) fprintf(stream, "%s- WS-Security Encrypt Before Signing%s (gSOAP unsupported)\n", tabs, sp__EncryptBeforeSigning->Optional ? " (optional)" : sp__EncryptBeforeSigning->Ignorable ? " (ignorable)" : ""); if (sp__EncryptSignature) fprintf(stream, "%s- WS-Security Encrypt Signature%s\n\t@code\n\t#include \"plugin/wsseapi.h\"\n\tsoap_wsse_add_EncryptedKey_encrypt_only(soap, , NULL, , NULL, , , \"ds:Signature SOAP-ENV:Body\");\n\t@endcode\n", tabs, sp__EncryptSignature->Optional ? " (optional)" : sp__EncryptSignature->Ignorable ? " (ignorable)" : ""); if (sp__ProtectTokens) fprintf(stream, "%s- WS-Security Token Protection%s required\n", tabs, sp__ProtectTokens->Optional ? " (optional)" : sp__ProtectTokens->Ignorable ? " (ignorable)" : ""); if (sp__OnlySignEntireHeadersAndBody) { fprintf(stream, "%s- WS-Security Sign Entire Headers and Body%s:\n\t@code\n\t#include \"plugin/wsseapi.h\"\n\tsoap_wsse_set_wsu_id(soap, \" ...\"); // list each ns:tagname used in SOAP Header\n\tsoap_wsse_sign_body(soap, , , );\n\t@endcode\n", tabs, sp__OnlySignEntireHeadersAndBody->Optional ? " (optional)" : sp__OnlySignEntireHeadersAndBody->Ignorable ? " (ignorable)" : ""); } if (sp__Strict) fprintf(stream, "%s- WS-Security headers 'declare before use' required (gSOAP default)\n", tabs); else if (sp__Lax) fprintf(stream, "%s- WS-Security headers may occur in any order (gSOAP allows this)\n", tabs); else if (sp__LaxTsFirst) fprintf(stream, "%s- WS-Security Timestamp must appear first (gSOAP default)\n", tabs); else if (sp__LaxTsLast) fprintf(stream, "%s- WS-Security Timestamp must appear last (requires changing the placement of the Timestamp header in SOAP_ENV__Header defined in import/wsse.h)\n", tabs); // HTTP authentication if (sp__HttpBasicAuthentication) fprintf(stream, "%s- HTTP/S Basic Authentication required:\n\t@code\n\tsoap->userid = \"\"; soap->passwd = \"\";\nsoap_call_ns__method(...)\n\t@endcode\n", tabs); else if (sp__HttpDigestAuthentication) fprintf(stream, "%s- HTTP/S Digest Authentication required:\n%sSee plugin/httpda.c plugin for usage details\n", tabs, tabs); if (sp__RequireClientCertificate) fprintf(stream, "%s- HTTPS client must authenticate to server with a certificate:\n\t@code\n\tsoap_ssl_client_context(soap, , \"\", \"\", ...)\n\t@endcode\n", tabs); // Security token requirements if (sp__RequireKeyIdentifierReference) fprintf(stream, "%s- Key identifier reference is required\n", tabs); if (sp__RequireIssuerSerialReference) fprintf(stream, "%s- Issuer serial reference is required\n", tabs); if (sp__RequireEmbeddedTokenReference) fprintf(stream, "%s- An embedded token reference is required\n", tabs); if (sp__RequireThumbprintReference) fprintf(stream, "%s- A thumbprint reference is required\n", tabs); // Algorithm suite if (sp__Basic256) fprintf(stream, "%s- Basic256\n", tabs); else if (sp__Basic192) fprintf(stream, "%s- Basic192\n", tabs); else if (sp__Basic128) fprintf(stream, "%s- Basic128\n", tabs); else if (sp__TripleDes) fprintf(stream, "%s- TripleDes\n", tabs); else if (sp__Basic256Rsa15) fprintf(stream, "%s- Basic256Rsa15\n", tabs); else if (sp__Basic192Rsa15) fprintf(stream, "%s- Basic192Rsa15\n", tabs); else if (sp__Basic128Rsa15) fprintf(stream, "%s- Basic128Rsa15\n", tabs); else if (sp__TripleDesRsa15) fprintf(stream, "%s- TripleDesRsa15\n", tabs); else if (sp__Basic256Sha256) fprintf(stream, "%s- Basic256Sha256\n", tabs); else if (sp__Basic192Sha256) fprintf(stream, "%s- Basic192Sha256\n", tabs); else if (sp__Basic128Sha256) fprintf(stream, "%s- Basic128Sha256\n", tabs); else if (sp__TripleDesSha256) fprintf(stream, "%s- TripleDesSha256\n", tabs); else if (sp__Basic256Sha256Rsa15) fprintf(stream, "%s- Basic256Sha256Rsa15\n", tabs); else if (sp__Basic192Sha256Rsa15) fprintf(stream, "%s- Basic192Sha256Rsa15\n", tabs); else if (sp__Basic128Sha256Rsa15) fprintf(stream, "%s- Basic128Sha256Rsa15\n", tabs); else if (sp__TripleDesSha256Rsa15) fprintf(stream, "%s- TripleDesSha256Rsa15\n", tabs); if (sp__InclusiveC14N) fprintf(stream, "%s- InclusiveC14N\n", tabs); if (sp__SOAPNormalization10) fprintf(stream, "%s- SOAPNormalization10\n", tabs); if (sp__STRTransform10) fprintf(stream, "%s- STRTransform10\n", tabs); if (sp__Path10) fprintf(stream, "%s- Path10\n", tabs); else if (sp__XPathFilter20) fprintf(stream, "%s- XPathFilter20\n", tabs); else if (sp__AbsXPath) fprintf(stream, "%s- AbsXPath\n", tabs); // WSS if (sp__WssX509V3Token10) fprintf(stream, "%s- An X509 Version 3 token should be used as defined in X509TokenProfile1.0\n", tabs); else if (sp__WssX509Pkcs7Token10) fprintf(stream, "%s- An X509 PKCS7 token should be used as defined in X509TokenProfile1.0\n", tabs); else if (sp__WssX509PkiPathV1Token10) fprintf(stream, "%s- An X509 PKI Path Version 1 token should be used as defined in X509TokenProfile1.0\n", tabs); else if (sp__WssX509V1Token11) fprintf(stream, "%s- An X509 Version 1 token should be used as defined in X509TokenProfile1.1\n", tabs); else if (sp__WssX509V3Token11) fprintf(stream, "%s- An X509 Version 3 token should be used as defined in X509TokenProfile1.1\n", tabs); else if (sp__WssX509Pkcs7Token11) fprintf(stream, "%s- An X509 PKCS7 token should be used as defined in X509TokenProfile1.1\n", tabs); else if (sp__WssX509PkiPathV1Token11) fprintf(stream, "%s- An X509 PKI Path Version 1 token should be used as defined in X509TokenProfile1.1\n", tabs); if (sp__WssKerberosV5ApReqToken11) fprintf(stream, "%s- A Kerberos Version 5 AP-REQ X509 token should be used as defined in KerberosTokenProfile1.1\n", tabs); else if (sp__WssGssKerberosV5ApReqToken11) fprintf(stream, "%s- A GSS Kerberos Version 5 AP-REQ token should be used as defined in KerberosTokenProfile1.1\n", tabs); if (sp__WssRelV10Token10) fprintf(stream, "%s- A REL Version 1.0 token should be used as defined in RELTokenProfile1.0\n", tabs); else if (sp__WssRelV20Token10) fprintf(stream, "%s- A REL Version 2.0 token should be used as defined in RELTokenProfile1.0\n", tabs); else if (sp__WssRelV10Token11) fprintf(stream, "%s- A REL Version 1.0 token should be used as defined in RELTokenProfile1.1\n", tabs); else if (sp__WssRelV20Token11) fprintf(stream, "%s- A REL Version 2.0 token should be used as defined in RELTokenProfile1.1\n", tabs); if (sp__BootstrapPolicy) { fprintf(stream, "%s- SecureConversation BootstrapPolicy\n", tabs); sp__BootstrapPolicy->generate(service, types, indent + 1); } // WS-Addressing WSDL Policy if (wsaw__UsingAddressing) { fprintf(stream, "%s- WS-Addressing is used\n", tabs); service.add_import("wsa5.h"); } // WS-Addressing Metadata Policy if (wsam__Addressing) { fprintf(stream, "%s- WS-Addressing%s is used\n", tabs, wsam__Addressing->Optional ? " (optional)" : wsam__Addressing->Ignorable ? " (ignorable)" : ""); if (wsam__Addressing->Policy) wsam__Addressing->Policy->generate(service, types, indent + 1); service.add_import("wsa5.h"); } if (wsam__AnonymousResponses) fprintf(stream, "%s- WS-Addressing Anonymous Responses\n", tabs); else if (wsam__NonAnonymousResponses) fprintf(stream, "%s- WS-Addressing NonAnonymous Responses\n", tabs); // WS-ReliableMessaging Policy if (wsrmp__RMAssertion_) { fprintf(stream, "%s- WS-ReliableMessaging%s is used\n", tabs, wsrmp__RMAssertion_->Optional ? " (optional)" : wsrmp__RMAssertion_->Ignorable ? " (ignorable)" : ""); if (wsrmp__RMAssertion_->InactivityTimeout && wsrmp__RMAssertion_->InactivityTimeout->Milliseconds) fprintf(stream, "%s - Inactivity Timeout = %s (ms)\n", tabs, wsrmp__RMAssertion_->InactivityTimeout->Milliseconds); if (wsrmp__RMAssertion_->BaseRetransmissionInterval && wsrmp__RMAssertion_->BaseRetransmissionInterval->Milliseconds) fprintf(stream, "%s - Base Retransmission Interval = %s (ms)\n", tabs, wsrmp__RMAssertion_->BaseRetransmissionInterval->Milliseconds); if (wsrmp__RMAssertion_->AcknowledgementInterval && wsrmp__RMAssertion_->AcknowledgementInterval->Milliseconds) fprintf(stream, "%s - Acknowledgement Interval = %s (ms)\n", tabs, wsrmp__RMAssertion_->AcknowledgementInterval->Milliseconds); if (wsrmp__RMAssertion_->ExponentialBackoff) fprintf(stream, "%s - ExponentialBackoff\n", tabs); if (wsrmp__RMAssertion_->Policy) wsrmp__RMAssertion_->Policy->generate(service, types, indent + 1); service.add_import("wsrm.h"); } if (wsrmp__DeliveryAssurance) { fprintf(stream, "%s- WS-ReliableMessaging Delivery Assurance%s:\n", tabs, wsrmp__DeliveryAssurance->Optional ? " (optional)" : wsrmp__DeliveryAssurance->Ignorable ? " (ignorable)" : ""); if (wsrmp__DeliveryAssurance->Policy) wsrmp__DeliveryAssurance->Policy->generate(service, types, indent + 1); service.add_import("wsrm.h"); } if (wsrmp__AtLeastOnce) fprintf(stream, "%s- At Least Once\n", tabs); if (wsrmp__AtMostOnce) fprintf(stream, "%s- At Most Once\n", tabs); if (wsrmp__ExactlyOnce) fprintf(stream, "%s- Exactly Once\n", tabs); if (wsrmp__InOrder) fprintf(stream, "%s- In Order\n", tabs); // All else for (vector<_XML>::const_iterator x = __any.begin(); x != __any.end(); ++x) { if (*x && *(*x)) { fprintf(stream, "%s- Other policy requirements:\n\t@verbatim\n", tabs); text(*x); fprintf(stream, "\t@endverbatim\n"); } } } static void gen_parts(const sp__Parts& parts, Types& types, const char *what, const char *name, int indent) { static const char stabs[] = "\t\t\t\t\t\t\t\t\t\t"; const char *tabs; if (indent > 8) indent = 8; tabs = stabs + 9 - indent; fprintf(stream, "%s- %s requirements:\n", tabs, name); if (parts.Body) fprintf(stream, "%s -# Body:\n\t@code\n\t#include \"plugin/wsseapi.h\"\n\tsoap_wsse_%s_body(soap, , , );\n\t@endcode\n", tabs, what); if (!parts.Header.empty()) { fprintf(stream, "%s -# Header elements:\n\t@code\n\t#include \"plugin/wsseapi.h\"\n\tsoap_wsse_set_wsu_id(soap, \"", tabs); for (vector::const_iterator h = parts.Header.begin(); h != parts.Header.end(); ++h) { if ((*h).Name) fprintf(stream, "%s ", types.aname(NULL, (*h).Namespace, (*h).Name)); else if ((*h).Namespace) fprintf(stream, "%s: ", types.nsprefix(NULL, (*h).Namespace)); } fprintf(stream, "\");\n\t@endcode\n"); } if (parts.Attachments) fprintf(stream, "%s -# Attachments as defined in SwAProfile1.1\n", tabs); } //////////////////////////////////////////////////////////////////////////////// // // wsp:PolicyReference // //////////////////////////////////////////////////////////////////////////////// int wsp__PolicyReference::traverse(wsdl__definitions& definitions) { policyRef = NULL; if (!URI || !*URI) { cerr << "PolicyReference has no URI" << endl; return SOAP_OK; } if (*URI == '#') { policyRef = search(URI + 1, definitions); if (!policyRef) { cerr << "PolicyReference URI=\"" << URI << "\" not found" << endl; return SOAP_OK; } } return SOAP_OK; } void wsp__PolicyReference::policyPtr(wsp__Policy *Policy) { policyRef = Policy; } wsp__Policy *wsp__PolicyReference::policyPtr() const { return policyRef; } static wsp__Policy *search(const char *URI, wsdl__definitions& definitions) { for (vector::iterator p = definitions.wsp__Policy_.begin(); p != definitions.wsp__Policy_.end(); ++p) { wsp__Policy *policy = search(URI, &(*p)); if (policy) return policy; } return NULL; } static wsp__Policy *search(const char *URI, wsp__Policy *policy) { if (!policy) return NULL; if (policy->wsu__Id && !strcmp(URI, policy->wsu__Id)) return policy; return search(URI, (wsp__Content*)policy); } static wsp__Policy *search(const char *URI, wsp__Content *content) { wsp__Policy *policy; policy = search(URI, content->Policy); if (policy) return policy; for (vector::iterator i = content->All.begin(); i != content->All.end(); ++i) { policy = search(URI, *i); if (policy) return policy; } for (vector::iterator j = content->ExactlyOne.begin(); j != content->ExactlyOne.end(); ++j) { policy = search(URI, *j); if (policy) return policy; } return NULL; } gsoap-2.8.28/gsoap/wsdl/types.cpp0000644000175000017500000043332212653650160016231 0ustar ellertellert/* types.cpp Generate gSOAP types from XML schemas (e.g. embedded in WSDL). -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "types.h" static char *getline(char *s, size_t n, FILE *fd); static const char *nonblank(const char *s); static const char *fill(char *t, int n, const char *s, int e); static const char *utf8(char **t, const char *s, bool start); static const char *cstring(const char *s); static const char *xstring(const char *s); static bool is_float(const char *s); static bool is_integer(const char *s); static LONG64 to_integer(const char *s); static void documentation(const char *text); static void operations(const char *t); static int comment_nest = 0; /* keep track of block comments to avoid nesting */ //////////////////////////////////////////////////////////////////////////////// // // Keywords and reserved words // //////////////////////////////////////////////////////////////////////////////// static const char *keywords[] = { "alignas", "alignof" "and", "and_eq", "asm", "auto", "bitand", "bitor", "bool", "break", "case", "catch", "char", "char16_t", "char32_t", "class", "compl", "const", "constexpr", "const_cast", "continue", "decltype", "default", "delete", "do", "double", "dynamic_cast", "else", "enum", "errno", "explicit", "export", "extern", "false", "FILE", "final", "float", "for", "friend", "goto", "if", "INFINITY", "inline", "int", "interface", "long", "LONG64", "max", "min", "mustUnderstand", "mutable", "namespace", "new", "not", "not_eq", "NULL", "nullptr", "nullptr_t", "operator", "or", "or_eq", "override", "private", "protected", "public", "_QName", "register", "reinterpret_cast", "restrict", "return", "short", "signed", "size_t", "sizeof", "soap", "static", "static_assert", "static_cast", "struct", "switch", "template", "this", "thread_local", "throw", "time_t", "true", "try", "typedef", "typeid", "typeof", "typename", "ULONG64", "union", "unsigned", "using", "virtual", "void", "volatile", "wchar_t", "while", "XML", "_XML", "xor", "xor_eq", }; //////////////////////////////////////////////////////////////////////////////// // // Types methods // //////////////////////////////////////////////////////////////////////////////// Types::Types() { init(); } int Types::read(const char *file) { FILE *fd; char buf[4096], xsd[4096], def[4096], use[4096], ptr[4096], uri[4096]; const char *s; short copy = 0; MapOfStringToString eqvtypemap; soap_strcpy(buf, sizeof(buf), file); fd = fopen(buf, "r"); if (!fd && import_path) { (SOAP_SNPRINTF(buf, sizeof(buf), strlen(import_path) + strlen(file) + 1), "%s/%s", import_path, file); fd = fopen(buf, "r"); } if (!fd) { fprintf(stderr, "Cannot open file \"%s\"\n", file); return SOAP_EOF; } fprintf(stderr, "Reading type definitions from type map \"%s\"\n", buf); while (getline(buf, sizeof(buf), fd)) { s = buf; if (copy) { if (*s == ']') copy = 0; else fprintf(stream, "%s\n", buf); } else if (*s == '[') { copy = 1; } else if (*s == '<') { s = fill(uri, sizeof(uri), s+1, -1); infile[infiles++] = estrdup(uri); if (infiles >= MAXINFILES) { fprintf(stderr, "wsdl2h: too many files\n"); exit(1); } } else if (*s == '>') { s = fill(uri, sizeof(uri), s+1, -1); if (!outfile) { outfile = estrdup(uri); stream = fopen(outfile, "w"); if (!stream) { fprintf(stderr, "Cannot write to %s\n", outfile); exit(1); } if (cppnamespace) fprintf(stream, "namespace %s {\n", cppnamespace); fprintf(stderr, "Saving %s\n\n", outfile); } } else if (*s && *s != '#') { s = fill(xsd, sizeof(xsd), s, '='); if (s && *s == '=') { s = fill(use, sizeof(use), s+1, '|'); if (*xsd && *use) { s = estrdup(xsd); eqvtypemap[s] = estrdup(use); deftypemap[s] = ""; if (usetypemap.find(use) != usetypemap.end()) usetypemap[s] = usetypemap[use]; else usetypemap[s] = estrdup(use); } } else if (strstr(xsd, "__")) { s = fill(def, sizeof(def), s, '|'); s = fill(use, sizeof(use), s, '|'); s = fill(ptr, sizeof(ptr), s, '|'); if (*xsd) { s = estrdup(xsd); if (*def == '$') { const char *t = modtypemap[s]; if (t) { size_t l = strlen(t) + strlen(def); char *r = (char*)emalloc(l + 1); (SOAP_SNPRINTF(r, l + 1, l), "%s%s", t, def); free((void*)modtypemap[s]); modtypemap[s] = r; } else modtypemap[s] = estrdup(def); } else { if (*def) { if (strcmp(def, "...")) deftypemap[s] = estrdup(def); } else deftypemap[s] = ""; if (*use) usetypemap[s] = estrdupf(use); else usetypemap[s] = estrdupf(xsd); if (*ptr) ptrtypemap[s] = estrdupf(ptr); } } } else if (*xsd == '$') { fill(use, sizeof(use), s, 0); if (*use) { s = estrdup(xsd); usetypemap[s] = estrdup(use); } } else if (*xsd) { s = fill(uri, sizeof(uri), s, 0); if (uri[0] == '"') { uri[strlen(uri) - 1] = '\0'; nsprefix(xsd, estrdup(uri + 1)); } else if (uri[0] == '<') { uri[strlen(uri) - 1] = '\0'; char *s = estrdup(uri + 1); nsprefix(xsd, s); exturis.insert(s); } else nsprefix(xsd, estrdup(uri)); } } } for (MapOfStringToString::const_iterator i = eqvtypemap.begin(); i != eqvtypemap.end(); ++i) { const char *s = (*i).first, *t = (*i).second; if (usetypemap.find(t) != usetypemap.end()) t = usetypemap[t]; deftypemap[s] = ""; usetypemap[s] = t; if (ptrtypemap.find((*i).second) != ptrtypemap.end()) ptrtypemap[s] = ptrtypemap[(*i).second]; else { MapOfStringToString::iterator j = ptrtypemap.find(s); if (j != ptrtypemap.end()) ptrtypemap.erase(j); } for (MapOfStringToString::iterator j = usetypemap.begin(); j != usetypemap.end(); ++j) if (!strcmp((*j).second, s)) (*j).second = t; for (MapOfStringToString::iterator k = ptrtypemap.begin(); k != ptrtypemap.end(); ++k) if (!strcmp((*k).second, s)) (*k).second = t; } fclose(fd); return SOAP_OK; } void Types::init() { snum = 1; unum = 1; gnum = 1; with_union = false; fake_union = false; knames.insert(keywords, keywords + sizeof(keywords)/sizeof(char*)); if (cflag) { deftypemap["xsd__ur_type"] = ""; if (dflag) { usetypemap["xsd__ur_type"] = "xsd__anyType"; } else { usetypemap["xsd__ur_type"] = "_XML"; ptrtypemap["xsd__ur_type"] = "_XML"; } } else { deftypemap["xsd__ur_type"] = "class xsd__ur_type { _XML __item; struct soap *soap; };"; usetypemap["xsd__ur_type"] = "xsd__ur_type"; } if (cflag) { deftypemap["xsd__anyType"] = ""; if (dflag) { usetypemap["xsd__anyType"] = "xsd__anyType"; } else { usetypemap["xsd__anyType"] = "_XML"; ptrtypemap["xsd__anyType"] = "_XML"; } } else { if (dflag) deftypemap["xsd__anyType"] = ""; else deftypemap["xsd__anyType"] = "class xsd__anyType { _XML __item; struct soap *soap; };"; usetypemap["xsd__anyType"] = "xsd__anyType"; } deftypemap["xsd__any"] = ""; if (dflag) { usetypemap["xsd__any"] = "xsd__anyType"; } else { usetypemap["xsd__any"] = "_XML"; ptrtypemap["xsd__any"] = "_XML"; } deftypemap["xsd__anyAttribute"] = ""; if (dflag) { usetypemap["xsd__anyAttribute"] = "xsd__anyAttribute"; } else { usetypemap["xsd__anyAttribute"] = "_XML"; ptrtypemap["xsd__anyAttribute"] = "_XML"; } if (cflag) { deftypemap["xsd__base64Binary"] = "struct xsd__base64Binary\n{\tunsigned char *__ptr;\n\tint __size;\n\tchar *id, *type, *options; // NOTE: non-NULL for DIME/MIME/MTOM XOP attachments only\n};"; usetypemap["xsd__base64Binary"] = "struct xsd__base64Binary"; ptrtypemap["xsd__base64Binary"] = "struct xsd__base64Binary"; } else { deftypemap["xsd__base64Binary"] = "class xsd__base64Binary\n{\tunsigned char *__ptr;\n\tint __size;\n\tchar *id, *type, *options; // NOTE: non-NULL for DIME/MIME/MTOM XOP attachments only\n\tstruct soap *soap;\n};"; usetypemap["xsd__base64Binary"] = "xsd__base64Binary"; } if (cflag) { if (eflag) deftypemap["xsd__boolean"] = "enum xsd__boolean { false_, true_ };"; else deftypemap["xsd__boolean"] = "enum xsd__boolean { xsd__boolean__false_, xsd__boolean__true_ };"; usetypemap["xsd__boolean"] = "enum xsd__boolean"; } else { deftypemap["xsd__boolean"] = ""; usetypemap["xsd__boolean"] = "bool"; } deftypemap["xsd__byte"] = "typedef char xsd__byte;"; usetypemap["xsd__byte"] = "xsd__byte"; deftypemap["xsd__dateTime"] = ""; usetypemap["xsd__dateTime"] = "time_t"; deftypemap["xsd__double"] = ""; usetypemap["xsd__double"] = "double"; deftypemap["xsd__float"] = ""; usetypemap["xsd__float"] = "float"; if (cflag) { deftypemap["xsd__hexBinary"] = "struct xsd__hexBinary { unsigned char *__ptr; int __size; };"; usetypemap["xsd__hexBinary"] = "struct xsd__hexBinary"; ptrtypemap["xsd__hexBinary"] = "struct xsd__hexBinary"; } else { deftypemap["xsd__hexBinary"] = "class xsd__hexBinary { unsigned char *__ptr; int __size; };"; usetypemap["xsd__hexBinary"] = "xsd__hexBinary"; } deftypemap["xsd__int"] = ""; usetypemap["xsd__int"] = "int"; deftypemap["xsd__long"] = ""; usetypemap["xsd__long"] = "LONG64"; deftypemap["xsd__short"] = ""; usetypemap["xsd__short"] = "short"; if (cflag || sflag) { deftypemap["xsd__string"] = ""; usetypemap["xsd__string"] = "char*"; ptrtypemap["xsd__string"] = "char*"; } else { deftypemap["xsd__string"] = ""; usetypemap["xsd__string"] = "std::string"; } if (cflag || sflag) { deftypemap["xsd__QName"] = ""; usetypemap["xsd__QName"] = "_QName"; ptrtypemap["xsd__QName"] = "_QName"; } else { deftypemap["xsd__QName"] = "typedef std::string xsd__QName;"; usetypemap["xsd__QName"] = "xsd__QName"; } deftypemap["xsd__unsignedByte"] = "typedef unsigned char xsd__unsignedByte;"; usetypemap["xsd__unsignedByte"] = "xsd__unsignedByte"; deftypemap["xsd__unsignedInt"] = ""; usetypemap["xsd__unsignedInt"] = "unsigned int"; deftypemap["xsd__unsignedLong"] = ""; usetypemap["xsd__unsignedLong"] = "ULONG64"; deftypemap["xsd__unsignedShort"] = ""; usetypemap["xsd__unsignedShort"] = "unsigned short"; if (cflag) { deftypemap["SOAP_ENC__base64Binary"] = "struct SOAP_ENC__base64Binary { unsigned char *__ptr; int __size; };"; usetypemap["SOAP_ENC__base64Binary"] = "struct SOAP_ENC__base64Binary"; ptrtypemap["SOAP_ENC__base64Binary"] = "struct SOAP_ENC__base64Binary"; deftypemap["SOAP_ENC__base64"] = "struct SOAP_ENC__base64 { unsigned char *__ptr; int __size; };"; usetypemap["SOAP_ENC__base64"] = "struct SOAP_ENC__base64"; ptrtypemap["SOAP_ENC__base64"] = "struct SOAP_ENC__base64"; } else { deftypemap["SOAP_ENC__base64Binary"] = "class SOAP_ENC__base64Binary { unsigned char *__ptr; int __size; };"; usetypemap["SOAP_ENC__base64Binary"] = "SOAP_ENC__base64Binary"; deftypemap["SOAP_ENC__base64"] = "class SOAP_ENC__base64 { unsigned char *__ptr; int __size; };"; usetypemap["SOAP_ENC__base64"] = "SOAP_ENC__base64"; } if (cflag) { deftypemap["SOAP_ENC__boolean"] = "enum SOAP_ENC__boolean { false_, true_ };"; usetypemap["SOAP_ENC__boolean"] = "enum SOAP_ENC__boolean"; } else { deftypemap["SOAP_ENC__boolean"] = "typedef bool SOAP_ENC__boolean;"; usetypemap["SOAP_ENC__boolean"] = "SOAP_ENC__boolean"; } deftypemap["SOAP_ENC__byte"] = "typedef char SOAP_ENC__byte;"; usetypemap["SOAP_ENC__byte"] = "SOAP_ENC__byte"; deftypemap["SOAP_ENC__dateTime"] = "typedef time_t SOAP_ENC__dateTime;"; usetypemap["SOAP_ENC__dateTime"] = "SOAP_ENC__dateTime"; deftypemap["SOAP_ENC__double"] = "typedef double SOAP_ENC__double;"; usetypemap["SOAP_ENC__double"] = "SOAP_ENC__double"; deftypemap["SOAP_ENC__float"] = "typedef float SOAP_ENC__float;"; usetypemap["SOAP_ENC__float"] = "SOAP_ENC__float"; if (cflag) { deftypemap["SOAP_ENC__hexBinary"] = "struct SOAP_ENC__hexBinary { unsigned char *__ptr; int __size; };"; usetypemap["SOAP_ENC__hexBinary"] = "struct SOAP_ENC__hexBinary"; ptrtypemap["SOAP_ENC__hexBinary"] = "struct SOAP_ENC__hexBinary"; } else { deftypemap["SOAP_ENC__hexBinary"] = "class SOAP_ENC__hexBinary { unsigned char *__ptr; int __size; };"; usetypemap["SOAP_ENC__hexBinary"] = "SOAP_ENC__hexBinary"; } deftypemap["SOAP_ENC__int"] = "typedef int SOAP_ENC__int;"; usetypemap["SOAP_ENC__int"] = "SOAP_ENC__int"; deftypemap["SOAP_ENC__long"] = "typedef LONG64 SOAP_ENC__long;"; usetypemap["SOAP_ENC__long"] = "SOAP_ENC__long"; deftypemap["SOAP_ENC__short"] = "typedef short SOAP_ENC__short;"; usetypemap["SOAP_ENC__short"] = "SOAP_ENC__short"; if (cflag || sflag) { deftypemap["SOAP_ENC__string"] = ""; usetypemap["SOAP_ENC__string"] = "char*"; ptrtypemap["SOAP_ENC__string"] = "char*"; } else { deftypemap["SOAP_ENC__string"] = ""; usetypemap["SOAP_ENC__string"] = "std::string"; } deftypemap["SOAP_ENC__unsignedByte"] = "typedef unsigned char SOAP_ENC__unsignedByte;"; usetypemap["SOAP_ENC__unsignedByte"] = "SOAP_ENC__unsignedByte"; deftypemap["SOAP_ENC__unsignedInt"] = "typedef unsigned int SOAP_ENC__unsignedInt;"; usetypemap["SOAP_ENC__unsignedInt"] = "SOAP_ENC__unsignedInt"; deftypemap["SOAP_ENC__unsignedLong"] = "typedef ULONG64 SOAP_ENC__unsignedLong;"; usetypemap["SOAP_ENC__unsignedLong"] = "SOAP_ENC__unsignedLong"; deftypemap["SOAP_ENC__unsignedShort"] = "typedef unsigned short SOAP_ENC__unsignedShort;"; usetypemap["SOAP_ENC__unsignedShort"] = "SOAP_ENC__unsignedShort"; deftypemap["SOAP_ENC__Array"] = ""; usetypemap["SOAP_ENC__Array"] = "struct { _XML *__ptr; int __size; }"; if (cflag) ptrtypemap["SOAP_ENC__Array"] = "struct { _XML *__ptr; int __size; }"; deftypemap["_SOAP_ENC__arrayType"] = ""; deftypemap["SOAP_ENV__Header"] = ""; usetypemap["SOAP_ENV__Header"] = "struct SOAP_ENV__Header"; deftypemap["_SOAP_ENV__mustUnderstand"] = ""; if (cflag || sflag) usetypemap["_SOAP_ENV__mustUnderstand"] = "char*"; else usetypemap["_SOAP_ENV__mustUnderstand"] = "std::string"; deftypemap["SOAP_ENV__Fault"] = ""; usetypemap["SOAP_ENV__Fault"] = "struct SOAP_ENV__Fault"; deftypemap["SOAP_ENV__detail"] = ""; usetypemap["SOAP_ENV__detail"] = "struct SOAP_ENV__Detail"; deftypemap["SOAP_ENV__Detail"] = ""; usetypemap["SOAP_ENV__Detail"] = "struct SOAP_ENV__Detail"; deftypemap["SOAP_ENV__Code"] = ""; usetypemap["SOAP_ENV__Code"] = "struct SOAP_ENV__Code"; deftypemap["SOAP_ENV__Reason"] = ""; usetypemap["SOAP_ENV__Reason"] = "struct SOAP_ENV__Reason"; usetypemap["$CONTAINER"] = "std::vector"; if (read(mapfile)) fprintf(stderr, "Problem reading type map file '%s'.\nUsing internal type definitions for %s instead.\n\n", mapfile, cflag ? "C" : "C++"); } const char *Types::nsprefix(const char *prefix, const char *URI) { if (URI && *URI) { const char *s = uris[URI]; if (!s) { size_t n; if (!prefix || !*prefix || *prefix == '_') s = schema_prefix; else s = estrdup(prefix); if (!syms[s]) n = syms[s] = 1; else n = ++syms[s]; if (n != 1 || !prefix || !*prefix || *prefix == '_') { size_t l = strlen(s); char *t = (char*)emalloc(l + 21); (SOAP_SNPRINTF(t, l + 21, l + 20), "%s%lu", s, (unsigned long)n); s = t; } uris[URI] = s; if (vflag) fprintf(stderr, "namespace prefix %s = \"%s\"\n", s, URI); } // if *prefix == '_', then add prefix string to s if (prefix && *prefix == '_') { size_t l = strlen(s); char *t = (char*)emalloc(l + 2); *t = '_'; soap_strcpy(t + 1, l + 1, s); s = t; } return s; } return NULL; } const char *Types::prefix(const char *name) { const char *s; char *t; if (*name == '"') { s = strchr(name + 1, '"'); t = (char*)emalloc(s - name); soap_strncpy(t, s - name, name + 1, s - name - 1); return nsprefix(NULL, t); } s = strchr(name, ':'); if (s) { t = (char*)emalloc(s - name + 1); soap_strncpy(t, s - name + 1, name, s - name); return t; } return NULL; } const char *Types::uri(const char *name) { const char *s; char *t; if (*name == '"') { s = strchr(name + 1, '"'); t = (char*)emalloc(s - name); soap_strncpy(t, s - name, name + 1, s - name - 1); return t; } s = strchr(name, ':'); if (s) { struct Namespace *p = namespaces; if (p) { for (p += 6; p->id; p++) { if (!strncmp(p->id, name, s - name) && !p->id[s - name]) { if (p->in && *p->in) return p->in; return p->ns; } } } } return NULL; } // Find a C name for a QName. If the name has no qualifier, use URI. Suggest prefix for URI const char *Types::fname(const char *prefix, const char *URI, const char *qname, SetOfString *reserved, enum Lookup lookup, bool isqname) { char buf[4096], *t; const char *p, *s, *name; if (!qname) { fprintf(stream, "// Warning: internal error, no QName in fname()\n"); if (vflag) fprintf(stderr, "Internal error, no QName in fname()\n"); qname = "?"; } name = qname; if (isqname) s = strrchr(name, ':'); else s = NULL; if (s) { name = s + 1; if (qname[0] == '"' && qname[1] == '"') { s = NULL; } else if (*qname == '"') { t = (char*)emalloc(s - qname - 1); soap_strncpy(t, s - qname - 1, qname + 1, s - qname - 2); URI = t; } else if (!strncmp(qname, "xs:", 3)) // this hack is necessary since the nsmap table defines "xs" for "xsd" { s = "xsd"; URI = NULL; } else { t = (char*)emalloc(s - qname + 1); soap_strncpy(t, s - qname + 1, qname, s - qname); s = t; URI = NULL; } } if (URI && *URI) p = nsprefix(prefix, URI); else if (s) p = s; else p = ""; s = NULL; if (lookup == LOOKUP) { if (qnames.find(Pair(p,name)) != qnames.end()) s = qnames[Pair(p,name)]; } if (!s) { t = buf; if (!prefix || *prefix) { s = p; // no longer add '_' when URI != NULL, since nsprefix() will do this if (prefix && *prefix == ':') *t++ = ':'; else if (prefix && *prefix == '_') { if (!URI) *t++ = '_'; if (prefix[1] == '_') // ensures ns prefix starts with __ { soap_strcpy(t, sizeof(buf) - (t - buf), prefix + 1); t += strlen(prefix + 1); } } if (s && *s) { for (; *s; s++) { if (t >= buf + sizeof(buf) - 8) break; if (isalnum(*s)) { *t++ = *s; } else if (*s == '-' && s[1] != '-' && s != p) { *t++ = '_'; } else if (*s == '_') { if (s == p) *t++ = '_'; else if (!_flag) { soap_strcpy(t, sizeof(buf) - (t - buf), "_USCORE"); t += 7; } else { s = utf8(&t, s, t == buf); } } else { s = utf8(&t, s, t == buf); } } if (!prefix || *prefix != '*') { *t++ = '_'; *t++ = '_'; } } else if (isdigit(*name)) { *t++ = '_'; } } for (s = name; *s; s++) { if (t >= buf + sizeof(buf) - 8) break; if (isalnum(*s)) { *t++ = *s; } else if (*s == '-' && s[1] != '-' && s[1] != '\0' && s != name) { *t++ = '_'; } else if (!_flag && *s == '_') { soap_strcpy(t, sizeof(buf) - (t - buf), "_USCORE"); t += 7; } else { s = utf8(&t, s, t == buf); } } *t = '\0'; s = strchr(buf, ':'); if (s) s++; else s = buf; while (knames.find(s) != knames.end() || (reserved && reserved->find(s) != reserved->end())) { *t++ = '_'; *t = '\0'; } if (isalpha(*buf) || *buf == '_' || *buf == ':') { size_t l = strlen(buf); t = (char*)emalloc(l + 1); soap_strcpy(t, l + 1, buf); } else { size_t l = strlen(buf); t = (char*)emalloc(l + 2); *t = '_'; soap_strcpy(t + 1, l + 1, buf); } s = t; if (lookup == LOOKUP) { qnames[Pair(p,name)] = s; if (vflag) { cerr << "Mapping '" << p << ":" << name << "' to '" << s << "'" << endl; #ifdef DEBUG for (MapOfPairToString::const_iterator i = qnames.begin(); i != qnames.end(); ++i) cerr << "Map[" << (*i).first.first << ":" << (*i).first.second << "]='" << (*i).second << "'" << endl; #endif } } } return s; } bool Types::is_defined(const char *prefix, const char *URI, const char *qname) { const char *t = fname(prefix, URI, qname, NULL, LOOKUP, true); return usetypemap.find(t) != usetypemap.end(); } const char *Types::aname(const char *prefix, const char *URI, const char *qname) { return fname(prefix, URI, qname, NULL, NOLOOKUP, true); } const char *Types::wname(const char *prefix, const char *URI, const char *qname) { const char *s = aname(prefix, URI, qname); SetOfString reserved; reserved.insert(s); s = fname(prefix, URI, qname, &reserved, NOLOOKUP, true); knames.insert(s); return s; } const char *Types::cname(const char *prefix, const char *URI, const char *qname) { return fname(prefix, URI, qname, NULL, LOOKUP, true); } const char *Types::tname(const char *prefix, const char *URI, const char *qname) { const char *s, *t; t = cname(prefix, URI, qname); if (usetypemap.find(t) != usetypemap.end()) { s = usetypemap[t]; if (vflag) cerr << "Mapping use of '" << t << "' to '" << s << "'" << endl; } else { s = t; fprintf(stream, "\n/// @todo !FIXME! @warning Undefined QName %s for type %s in namespace \"%s\", check WSDL and schema definitions.\n", qname ? qname : "", t, URI ? URI : "?"); if (vflag) fprintf(stderr, "\nWarning: undefined QName %s for type %s in namespace \"%s\"\n", qname ? qname : "", t, URI ? URI : "?"); } return s; } const char *Types::tnameptr(bool flag, const char *prefix, const char *URI, const char *qname) { const char *s = pname(flag, !flag, prefix, URI, qname); if (flag) { if (!strchr(s, '*') || !strncmp(s, "char", 4) || !strncmp(s, "const char", 10) || !strncmp(s, "wchar_t", 7) || !strncmp(s, "const wchar_t", 13)) { size_t l = strlen(s); char *r = (char*)emalloc(l + 2); soap_strcpy(r, l + 2, s); soap_strcpy(r + l, 2, "*"); return r; } } return s; } const char *Types::tnamenoptr(const char *prefix, const char *URI, const char *qname) { const char *s = tname(prefix, URI, qname); if (strchr(s, '*') && (!strncmp(s, "char", 4) || !strncmp(s, "const char", 10) || !strncmp(s, "wchar_t", 7) || !strncmp(s, "const wchar_t", 13))) return s; size_t n = strlen(s); if (s[n - 1] == '*') { char *r = (char*)emalloc(n); soap_strncpy(r, n, s, n - 1); return r; } return s; } const char *Types::pname(bool flag, bool smart, const char *prefix, const char *URI, const char *qname) { const char *s = NULL, *t; t = cname(prefix, URI, qname); if (flag) { const char *r = NULL; if (!cflag && smart && (r = vname("$POINTER")) && *r != '*' && *r != '$') { if (smptypemap.find(t) != smptypemap.end()) s = smptypemap[t]; else { if (usetypemap.find(t) != usetypemap.end()) s = usetypemap[t]; if (!s) { s = t; fprintf(stream, "\n/// @todo !FIXME! @warning Undefined QName %s for pointer to type %s, check WSDL and schema definitions.\n", qname, t); if (vflag) fprintf(stderr, "\nWarning: undefined QName %s for pointer to type %s in namespace \"%s\"\n", qname, t, URI ? URI : "?"); } if (!is_ptr(prefix, URI, qname)) { size_t k = strlen(r); size_t l = strlen(s); char *p = (char*)emalloc(k + l + 4); soap_strcpy(p, k + l + 4, r); soap_strcpy(p + k, l + 4, "<"); soap_strcpy(p + k + 1, l + 3, s); soap_strcpy(p + k + l + 1, 3, "> "); s = p; } if (vflag) cerr << "Mapping \"smart\" pointer of '" << t << "' to '" << s << "'" << endl; smptypemap[t] = s; } } else if (ptrtypemap.find(t) != ptrtypemap.end()) { s = ptrtypemap[t]; } else { if (usetypemap.find(t) != usetypemap.end()) s = usetypemap[t]; if (!s) { s = t; fprintf(stream, "\n/// @todo !FIXME! @warning Undefined QName %s for pointer to type %s, check WSDL and schema definitions.\n", qname, t); if (vflag) fprintf(stderr, "\nWarning: undefined QName %s for pointer to type %s in namespace \"%s\"\n", qname, t, URI ? URI : "?"); } if (!is_ptr(prefix, URI, qname)) { size_t l = strlen(s); char *p = (char*)emalloc(l + 2); soap_strcpy(p, l + 2, s); soap_strcpy(p + l, 2, "*"); s = p; } if (vflag) cerr << "Mapping pointer of '" << t << "' to '" << s << "'" << endl; ptrtypemap[t] = s; } } else if (usetypemap.find(t) != usetypemap.end()) { if (!cflag && smart && smptypemap.find(t) != smptypemap.end() && ptrtypemap.find(t) != ptrtypemap.end() && usetypemap[t] == ptrtypemap[t]) s = smptypemap[t]; else s = usetypemap[t]; } else { s = t; fprintf(stream, "\n/// @todo !FIXME! @warning Undefined QName %s for type %s in namespace \"%s\", check WSDL and schema definitions.\n", qname, t, URI ? URI : "?"); if (vflag) fprintf(stderr, "\nWarning: undefined QName %s for type %s in namespace \"%s\"\n", qname, t, URI ? URI : "?"); } return s; } const char *Types::deftname(enum Type type, bool mk_pointer, bool is_pointer, const char *prefix, const char *URI, const char *qname) { char buf[4096]; const char *t = fname(prefix, URI, qname, NULL, LOOKUP, true); if (deftypemap[t]) { if (vflag) fprintf(stderr, "Name %s already defined (probably in typemap \"%s\")\n", qname, mapfile); return NULL; } if (usetypemap[t]) { if (vflag) fprintf(stderr, "Name %s is mapped\n", qname); return t; } const char *q = NULL; switch (type) { case ENUM: if (!c11flag) q = "enum"; if (c11flag || yflag) knames.insert(t); break; case STRUCT: q = "struct"; if (yflag) knames.insert(t); break; case CLASS: case TYPEDEF: knames.insert(t); default: break; } buf[0] = '\0'; size_t n = 0; if (q) { soap_strcpy(buf, sizeof(buf), q); n = strlen(buf); soap_strcpy(buf + n, sizeof(buf) - n, " "); ++n; } soap_strcpy(buf + n, sizeof(buf) - n, t); const char *r = vname("$POINTER"); if (!cflag && !is_pointer && r && *r != '*' && *r != '$') { n = strlen(buf); size_t l = strlen(r); char *s = (char*)emalloc(l + n + 4); soap_strcpy(s, l + n + 4, r); soap_strcpy(s + l, n + 4, "<"); soap_strcpy(s + l + 1, n + 3, buf); soap_strcpy(s + l + n + 1, 3, "> "); smptypemap[t] = s; } if (mk_pointer) { n = strlen(buf); soap_strcpy(buf + n, sizeof(buf) - n, "*"); } n = strlen(buf); char *s = (char*)emalloc(n + 1); soap_strcpy(s, n + 1, buf); usetypemap[t] = s; if (mk_pointer || is_pointer) ptrtypemap[t] = s; if (is_pointer) smptypemap[t] = s; if (vflag) cerr << "Defined '" << t << "' ('" << qname << "' in namespace '" << (URI ? URI : prefix ? prefix : "") << "') as '" << s << endl; return t; } // get enumeration value. URI/type refers to the enum simpleType. const char *Types::ename(const char *type, const char *value, bool isqname) { if (c11flag) return fname(NULL, NULL, value, NULL, NOLOOKUP, isqname); const char *s = enames[Pair(type,value)]; if (!s) { s = fname(NULL, NULL, value, &rnames, NOLOOKUP, isqname); if (!eflag && type && *type) { // Add prefix to enum if (!*s || (s[0] == '_' && s[1] == '\0')) s = "_x0000"; size_t l = strlen(type) + strlen(s); char *buf = (char*)emalloc(l + 3); // _xXXXX is OK here if (s[0] == '_' && s[1] != 'x' && strncmp(s, "_USCORE", 7)) (SOAP_SNPRINTF(buf, l + 3, l + 1), "%s_%s", type, s); else (SOAP_SNPRINTF(buf, l + 3, l + 2), "%s__%s", type, s); s = buf; } else rnames.insert(s); enames[Pair(type,value)] = s; } return s; } // get operation name const char *Types::oname(const char *prefix, const char *URI, const char *qname) { const char *s = fname(prefix, URI, qname, NULL, LOOKUP, true); if (s && usetypemap.find(s) != usetypemap.end()) { // Avoid name clash with structs/classes of the same name onames.insert(s); } s = fname(prefix, URI, qname, &onames, NOLOOKUP, true); onames.insert(s); return s; } // generate struct name const char *Types::sname(const char *URI, const char *name) { const char *s; char *t; if (!aflag && name) { size_t l = strlen(name) + 1; for (VectorOfString::const_iterator i = scope.begin(); i != scope.end(); ++i) l += strlen(*i) + 1; t = (char*)emalloc(l); size_t n = 0; for (VectorOfString::const_iterator j = scope.begin(); j != scope.end(); ++j) { soap_strcpy(t + n, l - n, *j); n = strlen(t); soap_strcpy(t + n, l - n, "-"); ++n; if (n >= l) break; } soap_strcpy(t + n, l - n, name); s = fname("_", URI, t, &rnames, NOLOOKUP, true); rnames.insert(s); } else if (URI && *URI) { s = nsprefix(NULL, URI); size_t l = strlen(s); t = (char*)emalloc(l + 30); (SOAP_SNPRINTF(t, l + 30, l + 29), "_%s__struct_%d", s, snum++); s = t; } else { t = (char*)emalloc(28); (SOAP_SNPRINTF(t, 28, 27), "struct_%d", snum++); s = t; } return s; } // generate union name const char *Types::uname(const char *URI) { const char *s; char *t; if (!aflag) { size_t l = 0; for (VectorOfString::const_iterator i = scope.begin(); i != scope.end(); ++i) l += strlen(*i) + 1; t = (char*)emalloc(l + 6); soap_strcpy(t, l + 6, "union"); size_t n = 5; for (VectorOfString::const_iterator j = scope.begin(); j != scope.end(); ++j) { soap_strcpy(t + n, l + 6 - n, "-"); soap_strcpy(t + n + 1, l + 5 - n, *j); n = strlen(t); } s = fname("_", URI, t, &rnames, NOLOOKUP, true); rnames.insert(s); } else if (URI && *URI) { s = nsprefix(NULL, URI); size_t l = strlen(s); t = (char*)emalloc(l + 30); (SOAP_SNPRINTF(t, l + 30, l + 29), "_%s__union_%d", s, unum++); s = t; } else { t = (char*)emalloc(28); (SOAP_SNPRINTF(t, 28, 27), "_union_%d", unum++); s = t; } return s; } // generate enum name const char *Types::gname(const char *URI, const char *name) { const char *s; char *t; if (!aflag && name) { size_t l = strlen(name) + 1; for (VectorOfString::const_iterator i = scope.begin(); i != scope.end(); ++i) l += strlen(*i) + 1; t = (char*)emalloc(l); size_t n = 0; for (VectorOfString::const_iterator j = scope.begin(); j != scope.end(); ++j) { soap_strcpy(t + n, l - n, *j); n = strlen(t); soap_strcpy(t + n, l - n, "-"); ++n; if (n >= l) break; } soap_strcpy(t + n, l - n, name); s = fname("_", URI, t, &rnames, LOOKUP, true); rnames.insert(s); } else if (URI && *URI) { s = nsprefix(NULL, URI); size_t l = strlen(s); t = (char*)emalloc(l + 30); (SOAP_SNPRINTF(t, l + 30, l + 29), "_%s__enum_%d", s, gnum++); s = t; } else { t = (char*)emalloc(28); (SOAP_SNPRINTF(t, 28, 27), "enum_%d", gnum++); s = t; } return s; } const char *Types::vname(const char *var) { MapOfStringToString::const_iterator i = usetypemap.find(var); if (i != usetypemap.end()) return (*i).second; return var; } // checks if nillable or minOccurs=0 bool Types::is_nillable(const xs__element& element) { return (element.nillable || (element.minOccurs && !strcmp(element.minOccurs, "0"))); } // checks if permitted as union member bool Types::is_choicetype(const char *prefix, const char *URI, const char *type) { // TODO: consider c11flag also safe, but classes containing unions must define assignment ops using the selector(s) if (cflag) return true; if (!strcmp(type, "xs:byte")) return true; const char *t = tname(prefix, URI, type); return ( !strncmp(t, "enum ", 5) || !strcmp(t, "bool") || !strcmp(t, "int8_t") || !strcmp(t, "int16_t") || !strcmp(t, "int32_t") || !strcmp(t, "int64_t") || !strcmp(t, "uint8_t") || !strcmp(t, "uint16_t") || !strcmp(t, "uint32_t") || !strcmp(t, "uint64_t") || !strcmp(t, "char") || !strcmp(t, "unsigned char") || !strcmp(t, "short") || !strcmp(t, "unsigned short") || !strcmp(t, "int") || !strcmp(t, "unsigned int") || !strcmp(t, "long") || !strcmp(t, "long long") || !strcmp(t, "unsigned long") || !strcmp(t, "unsigned long long") || !strcmp(t, "LONG64") || !strcmp(t, "ULONG64") || !strcmp(t, "float") || !strcmp(t, "double") || !strcmp(t, "long double") || !strcmp(t, "time_t") || !strcmp(t, "_QName") || !strcmp(t, "_XML") ); } bool Types::is_ptr(const char *prefix, const char *URI, const char *qname) { const char *t = cname(prefix, URI, qname); if (usetypemap.find(t) != usetypemap.end()) { if (ptrtypemap.find(t) != ptrtypemap.end()) return usetypemap[t] == ptrtypemap[t]; const char *s = usetypemap[t]; while (s && *s) { s = strchr(s + 1, '*'); if (s && *(s-1) != '/' && *(s+1) != '/') return true; } } return false; } void Types::dump(FILE *fd) { fprintf(fd, "\nTypes:\n"); for (MapOfStringToString::const_iterator i = usetypemap.begin(); i != usetypemap.end(); ++i) fprintf(fd, "%s=%s\n", (*i).first, (*i).second ? (*i).second : "(null)"); fprintf(fd, "\nPointers:\n"); for (MapOfStringToString::const_iterator j = ptrtypemap.begin(); j != ptrtypemap.end(); ++j) fprintf(fd, "%s=%s\n", (*j).first, (*j).second ? (*j).second : "(null)"); } void Types::define(const char *URI, const char *name, const xs__complexType& complexType) { // generate prototype for structs/classes and store name const char *prefix = NULL; if (complexType.name) name = complexType.name; else prefix = "_"; if (complexType.complexContent && complexType.complexContent->restriction && !strcmp(complexType.complexContent->restriction->base, "SOAP-ENC:Array")) { if (strcmp(schema_prefix, "ns")) prefix = "*"; else prefix = ""; } if (cflag) { const char *t = deftname(STRUCT, true, false, prefix, URI, name); if (t) { if (yflag) fprintf(stream, "/// @brief Typedef synonym for struct %s.\ntypedef struct %s %s;\n", t, t, t); } else if (name) { t = deftypemap[cname(prefix, URI, name)]; if (t) { fprintf(stream, "/// Imported complexType \"%s\":%s from typemap \"%s\".\n", URI, name, mapfile ? mapfile : ""); document(complexType.annotation); if (*t) format(t); else fprintf(stream, "// complexType definition intentionally left blank.\n"); fprintf(stream, "\n"); } } } else { const char *t = deftname(CLASS, true, false, prefix, URI, name); if (t) fprintf(stream, "// Forward declaration of class %s.\nclass %s;\n\n", t, t); else if (name) { t = deftypemap[cname(prefix, URI, name)]; if (t) { fprintf(stream, "/// Imported complexType \"%s\":%s from typemap \"%s\".\n", URI, name, mapfile ? mapfile : ""); document(complexType.annotation); if (*t) format(t); else fprintf(stream, "// complexType definition intentionally left blank.\n"); fprintf(stream, "\n"); } } } } void Types::gen(const char *URI, const char *name, const xs__simpleType& simpleType, bool anonymous, bool nested_restriction) { const char *t = NULL; const char *prefix = NULL; if (simpleType.name) name = simpleType.name; else if (!nested_restriction) prefix = "_"; if (!anonymous) { t = deftypemap[cname(NULL, URI, name)]; if (t) { fprintf(stream, "/// Imported simpleType \"%s\":%s from typemap \"%s\".\n", URI, name, mapfile ? mapfile : ""); document(simpleType.annotation); if (*t) format(t); else fprintf(stream, "// simpleType definition intentionally left blank.\n"); return; } } if (simpleType.restriction) { const char *base = simpleType.restriction->base; if (!base && simpleType.restriction->simpleType) { if (!anonymous) { if (simpleType.restriction->simpleType->list && simpleType.restriction->length && simpleType.restriction->length->value) { fprintf(stream, "/// @brief \"%s\":%s is a simpleType restriction list of length %s.\n///\n", URI ? URI : "", name, simpleType.restriction->length->value); document(simpleType.restriction->length->annotation); } else { const char *a = NULL, *b = "unbounded"; if (simpleType.restriction->minLength) { a = simpleType.restriction->minLength->value; document(simpleType.restriction->minLength->annotation); } if (simpleType.restriction->maxLength) { b = simpleType.restriction->maxLength->value; document(simpleType.restriction->maxLength->annotation); } if (a || b) fprintf(stream, "/// @brief \"%s\":%s is a simpleType restriction list of length %s..%s.\n", URI ? URI : "", name, a ? a : "0", b ? b : ""); else fprintf(stream, "/// @brief \"%s\":%s is a simpleType restriction.\n///\n", URI ? URI : "", name); } } gen(URI, name, *simpleType.restriction->simpleType, anonymous, true); } else { if (!base) base = "xsd:string"; const char *baseURI = NULL; if (simpleType.restriction->simpleTypePtr() && simpleType.restriction->simpleTypePtr()->schemaPtr()) baseURI = simpleType.restriction->simpleTypePtr()->schemaPtr()->targetNamespace; if (!anonymous) fprintf(stream, "/// @brief \"%s\":%s is a simpleType restriction of XSD type %s.\n///\n", URI ? URI : "", name, base); document(simpleType.annotation); document(simpleType.restriction->annotation); if (simpleType.restriction->assertion && simpleType.restriction->assertion->test) { fprintf(stream, "/// Assertion:\n"); documentation(simpleType.restriction->assertion->test); } if (!simpleType.restriction->enumeration.empty()) { bool is_qname = !strcmp(base, "xs:QName"); if (!anonymous) { t = deftname(ENUM, false, false, prefix, URI, name); if (t && !eflag && !c11flag) fprintf(stream, "/// @note The enum values are prefixed with \"%s__\" to prevent name clashes: use wsdl2h option -e to omit this prefix or use option -c++11 for scoped enumerations\n", t); } if (!t) t = gname(URI, name); if (c11flag) { if (!anonymous) fprintf(stream, "enum class %s\n{\n", t); else fprintf(stream, " enum class %s\n {\n", t); } else { if (!anonymous) fprintf(stream, "enum %s\n{\n", t); else fprintf(stream, " enum %s\n {\n", t); } SetOfString enumvals; LONG64 enumval = 0; if (!is_qname) { bool letters_ok = true; for (vector::const_iterator enumeration = simpleType.restriction->enumeration.begin(); enumeration != simpleType.restriction->enumeration.end(); ++enumeration) { const char *s; if ((s = (*enumeration).value)) { if (!enumvals.count(s)) { if (is_integer(s)) { document((*enumeration).annotation); fprintf(stream, "\t%s = %s,\t///< %s value=\"%s\"\n", ename(eflag ? "enum int" : t, s, false), s, base, s); // type="enum int" if eflag so all int enum consts get the same value assigned enumvals.insert(s); LONG64 n = soap_strtoll(s, NULL, 10); if (letters_ok) { if ((n >= 'A' && n <= 'Z') || (n >= 'a' && n <= 'z')) letters_ok = false; } if (n > enumval) enumval = n; } } } } if (letters_ok) { for (vector::const_iterator enumeration = simpleType.restriction->enumeration.begin(); enumeration != simpleType.restriction->enumeration.end(); ++enumeration) { const char *s; if ((s = (*enumeration).value)) { if (!enumvals.count(s)) { if (isalpha(s[0]) && !s[1]) { document((*enumeration).annotation); fprintf(stream, "\t%s = '%c',\t///< %s value=\"%s\"\n", ename(eflag ? "enum char" : t, s, false), *s, base, s); // type="enum char" if eflag so all char enum consts get the same value assigned enumvals.insert(s); if (*s > enumval) enumval = *s; } } } } } } for (vector::const_iterator enumeration = simpleType.restriction->enumeration.begin(); enumeration != simpleType.restriction->enumeration.end(); ++enumeration) { const char *s; if ((s = (*enumeration).value)) { if (!enumvals.count(s)) { document((*enumeration).annotation); if (is_qname) fprintf(stream, "\t%s,\t///< %s value=\"%s\"\n", ename(t, (*enumeration).value_, true), base, (*enumeration).value_); else if (enumval) fprintf(stream, "\t%s = " SOAP_LONG_FORMAT ",\t///< %s value=\"%s\"\n", ename(t, s, false), ++enumval, base, s); else fprintf(stream, "\t%s,\t///< %s value=\"%s\"\n", ename(t, s, false), base, s); enumvals.insert(s); } } else fprintf(stream, "//\tunrecognized: enumeration \"%s\" has no value\n", name ? name : ""); } if (!anonymous) { fprintf(stream, "};\n\n"); if (!c11flag && yflag) fprintf(stream, "/// @brief Typedef synonym for enum %s.\ntypedef enum %s %s;\n", t, t, t); if (pflag && simpleType.name) { const char *s = wname(prefix, URI, name); fprintf(stream, "/// @brief A class wrapper.\n///\n"); fprintf(stream, "class %s : public xsd__anyType\n{ public:\n", s); fprintf(stream, elementformat, tname(prefix, URI, name), "__item;"); modify(s); fprintf(stream, "\n};\n\n"); } } else fprintf(stream, " }\n"); } else { if (simpleType.restriction->length && simpleType.restriction->length->value) { fprintf(stream, "/// Length of this string is %s.\n", simpleType.restriction->length->value); document(simpleType.restriction->length->annotation); } else { const char *a = NULL, *b = NULL; if (simpleType.restriction->minLength) { a = simpleType.restriction->minLength->value; document(simpleType.restriction->minLength->annotation); } if (simpleType.restriction->maxLength) { b = simpleType.restriction->maxLength->value; document(simpleType.restriction->maxLength->annotation); } if (a || b) { fprintf(stream, "/// Length of this string is %s to %s.\n", a ? a : "0", b ? b : "unbounded"); } } char format[16]; format[0] = '\0'; if (simpleType.restriction->precision && simpleType.restriction->precision->value) { soap_strcpy(format, sizeof(format), simpleType.restriction->precision->value); fprintf(stream, "/// %s is %s.\n", simpleType.restriction->precision->fixed ? "Fixed precision" : "Precision", simpleType.restriction->precision->value); } else if (simpleType.restriction->totalDigits && simpleType.restriction->totalDigits->value) { soap_strcpy(format, sizeof(format), simpleType.restriction->totalDigits->value); fprintf(stream, "/// %s of total digits is %s.\n", simpleType.restriction->totalDigits->fixed ? "Fixed number" : "Number", simpleType.restriction->totalDigits->value); } if (simpleType.restriction->scale && simpleType.restriction->scale->value) { size_t n = strlen(format); soap_strcpy(format + n, sizeof(format) - n, "."); soap_strcpy(format + n + 1, sizeof(format) - n - 1, simpleType.restriction->scale->value); fprintf(stream, "/// %s is %s.\n", simpleType.restriction->scale->fixed ? "Fixed scale" : "Scale", simpleType.restriction->scale->value); } else if (simpleType.restriction->fractionDigits && simpleType.restriction->fractionDigits->value) { size_t n = strlen(format); soap_strcpy(format + n, sizeof(format) - n, "."); soap_strcpy(format + n + 1, sizeof(format) - n - 1, simpleType.restriction->fractionDigits->value); fprintf(stream, "/// %s of fraction digits is %s.\n", simpleType.restriction->fractionDigits->fixed ? "Fixed number" : "Number", simpleType.restriction->fractionDigits->value); } for (vector::const_iterator pattern1 = simpleType.restriction->pattern.begin(); pattern1 != simpleType.restriction->pattern.end(); ++pattern1) fprintf(stream, "/// Content pattern is \"%s\".\n", xstring((*pattern1).value)); const char *ai = NULL, *ae = NULL, *bi = NULL, *be = NULL; if (simpleType.restriction->minInclusive) { ai = simpleType.restriction->minInclusive->value; document(simpleType.restriction->minInclusive->annotation); } else if (simpleType.restriction->minExclusive) { ae = simpleType.restriction->minExclusive->value; document(simpleType.restriction->minExclusive->annotation); } if (simpleType.restriction->maxInclusive) { bi = simpleType.restriction->maxInclusive->value; document(simpleType.restriction->maxInclusive->annotation); } else if (simpleType.restriction->maxExclusive) { be = simpleType.restriction->maxExclusive->value; document(simpleType.restriction->maxExclusive->annotation); } if (ai || ae || bi || be) { fprintf(stream, "/// Value range is "); if (ai) fprintf(stream, "%s", ai); else if (ae) fprintf(stream, "%s (exclusive)", ae); else fprintf(stream, "lowest"); fprintf(stream, " to "); if (bi) fprintf(stream, "%s.\n", bi); else if (be) fprintf(stream, "%s (exclusive).\n", be); else fprintf(stream, "highest.\n"); } if (!simpleType.restriction->attribute.empty()) { if (!Wflag) fprintf(stderr, "\nWarning: simpleType \"%s\" should not have attributes\n", name ? name : ""); } const char *s = tname(NULL, baseURI, base); if (!anonymous) { t = deftname(TYPEDEF, false, is_ptr(NULL, baseURI, base), prefix, URI, name); if (t) fprintf(stream, "typedef %s %s", s, t); } else { t = ""; fprintf(stream, elementformat, s, ""); fprintf(stream, "\n"); } if (t) { if (!anonymous && !simpleType.restriction->pattern.empty()) { fprintf(stream, " \""); for (vector::const_iterator pattern2 = simpleType.restriction->pattern.begin(); pattern2 != simpleType.restriction->pattern.end(); ++pattern2) { if (pattern2 != simpleType.restriction->pattern.begin()) fprintf(stream, "|"); fprintf(stream, "%s", xstring((*pattern2).value)); } fprintf(stream, "\""); } // add range info only when type is numeric bool is_numeric_type = false, is_float_type = false; if (!strncmp(s, "signed ", 7)) s += 7; else if (!strncmp(s, "unsigned ", 9)) s += 9; if (!strncmp(s, "long ", 5)) s += 5; else if (!strncmp(s, "short ", 6)) s += 6; if (!strncmp(s, "xsd__unsigned", 13)) s += 13; else if (!strncmp(s, "xsd__", 5)) s += 5; if (!strcmp(s, "float") || !strcmp(s, "double")) is_numeric_type = is_float_type = true; else if (!strcmp(s, "bool") || !strcmp(s, "byte") || !strcmp(s, "Byte") || !strcmp(s, "char") || !strcmp(s, "int") || !strcmp(s, "Int") || !strcmp(s, "long") || !strcmp(s, "Long") || !strcmp(s, "LONG64") || !strcmp(s, "short") || !strcmp(s, "Short") || !strcmp(s, "ULONG64")) is_numeric_type = true; if (!anonymous && *format) { if (is_float_type) fprintf(stream, " \"%%%sf\"", format); else if (is_numeric_type) fprintf(stream, " \"%%%sd\"", format); } if (!anonymous && simpleType.restriction->minLength && simpleType.restriction->minLength->value) fprintf(stream, " %s ", simpleType.restriction->minLength->value); else if (is_float_type && !anonymous && simpleType.restriction->minInclusive && simpleType.restriction->minInclusive->value && is_float(simpleType.restriction->minInclusive->value)) fprintf(stream, " %s ", simpleType.restriction->minInclusive->value); else if (is_numeric_type && !anonymous && simpleType.restriction->minInclusive && simpleType.restriction->minInclusive->value && is_integer(simpleType.restriction->minInclusive->value)) fprintf(stream, " %s ", simpleType.restriction->minInclusive->value); else if (is_float_type && !anonymous && simpleType.restriction->minExclusive && simpleType.restriction->minExclusive->value && is_float(simpleType.restriction->minExclusive->value)) fprintf(stream, " %s <", simpleType.restriction->minExclusive->value); else if (is_numeric_type && !anonymous && simpleType.restriction->minExclusive && simpleType.restriction->minExclusive->value && is_integer(simpleType.restriction->minExclusive->value)) fprintf(stream, " " SOAP_LONG_FORMAT " ", to_integer(simpleType.restriction->minExclusive->value)+1); if (!anonymous && simpleType.restriction->maxLength && simpleType.restriction->maxLength->value) fprintf(stream, ": %s", simpleType.restriction->maxLength->value); else if (is_float_type && !anonymous && simpleType.restriction->maxInclusive && simpleType.restriction->maxInclusive->value && is_float(simpleType.restriction->maxInclusive->value)) fprintf(stream, ": %s", simpleType.restriction->maxInclusive->value); else if (is_numeric_type && !anonymous && simpleType.restriction->maxInclusive && simpleType.restriction->maxInclusive->value && is_integer(simpleType.restriction->maxInclusive->value)) fprintf(stream, ": %s", simpleType.restriction->maxInclusive->value); else if (is_float_type && !anonymous && simpleType.restriction->maxExclusive && simpleType.restriction->maxExclusive->value && is_float(simpleType.restriction->maxExclusive->value)) fprintf(stream, ":< %s", simpleType.restriction->maxExclusive->value); else if (is_numeric_type && !anonymous && simpleType.restriction->maxExclusive && simpleType.restriction->maxExclusive->value && is_integer(simpleType.restriction->maxExclusive->value)) fprintf(stream, ": " SOAP_LONG_FORMAT, to_integer(simpleType.restriction->maxExclusive->value)-1); if (!anonymous) { fprintf(stream, ";\n\n"); if (pflag && simpleType.name) { const char *s = wname(prefix, URI, name); fprintf(stream, "/// @brief A class wrapper.\n///\n"); fprintf(stream, "class %s : public xsd__anyType\n{ public:\n", s); fprintf(stream, elementformat, tname(prefix, URI, name), "__item;"); modify(s); fprintf(stream, "\n};\n\n"); } } } } } } else if (simpleType.list) { if (simpleType.list->restriction && simpleType.list->restriction->base) { if (!anonymous) { fprintf(stream, "/// @brief \"%s\":%s is a simpleType list restriction of XSD type %s.\n///\n", URI ? URI : "", name, simpleType.list->restriction->base); fprintf(stream, "/// @note This enumeration is a bitmask, so a set of values is supported (using | and & bit-ops on the bit vector).\n"); } document(simpleType.annotation); if (!anonymous) { t = deftname(ENUM, false, false, prefix, URI, name); if (t) { if (c11flag) fprintf(stream, "enum * class : int64_t %s\n{\n", t); else fprintf(stream, "enum * %s\n{\n", t); } } else { t = ""; fprintf(stream, "enum *\n{\n"); } if (t) { for (vector::const_iterator enumeration = simpleType.list->restriction->enumeration.begin(); enumeration != simpleType.list->restriction->enumeration.end(); ++enumeration) { if ((*enumeration).value) { if (!strcmp(simpleType.list->restriction->base, "xs:QName") && (*enumeration).value_) fprintf(stream, "\t%s,\t///< %s value=\"%s\"\n", ename(t, (*enumeration).value_, true), simpleType.list->restriction->base, (*enumeration).value_); else fprintf(stream, "\t%s,\t///< %s value=\"%s\"\n", ename(t, (*enumeration).value, false), simpleType.list->restriction->base, (*enumeration).value); } else fprintf(stream, "//\tunrecognized: bitmask enumeration \"%s\" has no value\n", t); } if (!anonymous) { fprintf(stream, "};\n\n"); if (!c11flag && yflag) fprintf(stream, "/// @brief Typedef synonym for enum %s.\ntypedef enum %s %s;\n", t, t, t); if (pflag && simpleType.name) { const char *s = wname(prefix, URI, name); fprintf(stream, "/// @brief A class wrapper.\n///\n"); fprintf(stream, "class %s : public xsd__anyType\n{ public:\n", s); fprintf(stream, elementformat, tname(prefix, URI, name), "__item;"); modify(s); fprintf(stream, "\n};\n\n"); } } else fprintf(stream, "}\n"); } } else if (simpleType.list->itemType) { const xs__simpleType *p = simpleType.list->itemTypePtr(); if (p && p->restriction && p->restriction->base && !p->restriction->enumeration.empty() && p->restriction->enumeration.size() <= 64) { if (!anonymous) { fprintf(stream, "/// @brief \"%s\":%s is a simpleType list of %s.\n///\n", URI ? URI : "", name, simpleType.list->itemType); fprintf(stream, "/// @note This enumeration is a bitmask, so a set of values is supported (using | and & bit-ops on the bit vector).\n"); } document(simpleType.annotation); if (!anonymous) { t = deftname(ENUM, false, false, prefix, URI, name); if (t) { if (c11flag) fprintf(stream, "enum * class %s : int64_t\n{\n", t); else fprintf(stream, "enum * %s\n{\n", t); } } else { t = ""; fprintf(stream, "enum *\n{\n"); } if (t) { for (vector::const_iterator enumeration = p->restriction->enumeration.begin(); enumeration != p->restriction->enumeration.end(); ++enumeration) { if ((*enumeration).value) { if (!strcmp(p->restriction->base, "xs:QName") && (*enumeration).value_) fprintf(stream, "\t%s,\t///< %s value=\"%s\"\n", ename(t, (*enumeration).value_, true), p->restriction->base, (*enumeration).value_); else fprintf(stream, "\t%s,\t///< %s value=\"%s\"\n", ename(t, (*enumeration).value, false), p->restriction->base, (*enumeration).value); } else fprintf(stream, "//\tunrecognized: bitmask enumeration \"%s\" has no value\n", t); } if (!anonymous) { fprintf(stream, "};\n\n"); if (!c11flag && yflag) fprintf(stream, "/// @brief Typedef synonym for enum %s.\ntypedef enum %s %s;\n", t, t, t); if (pflag && simpleType.name) { const char *s = wname(prefix, URI, name); fprintf(stream, "/// @brief A class wrapper.\n///\n"); fprintf(stream, "class %s : public xsd__anyType\n{ public:\n", s); fprintf(stream, elementformat, tname(prefix, URI, name), "__item;"); modify(s); fprintf(stream, "\n};\n\n"); } } else fprintf(stream, "}\n"); } } else { const char *base; if (!strcmp(simpleType.list->itemType, "xs:QName")) base = "xsd:QName"; else base = "xsd:string"; const char *s = tname(NULL, NULL, base); if (!anonymous) { fprintf(stream, "/// @brief \"%s\":%s is a simpleType containing a whitespace separated list of %s.\n///\n", URI ? URI : "", name, simpleType.list->itemType); t = deftname(TYPEDEF, false, is_ptr(NULL, NULL, base), prefix, URI, name); } document(simpleType.annotation); if (t) fprintf(stream, "typedef %s %s;\n", s, t); else { fprintf(stream, elementformat, s, ""); fprintf(stream, "\n"); } fprintf(stream, "\n"); } } else { if (!anonymous) { fprintf(stream, "/// @brief \"%s\":%s is a simpleType list.\n///\n", URI ? URI : "", name); fprintf(stream, "/// @note This enumeration is a bitmask, so a set of values is supported (using | and & bit-ops on the bit vector).\n"); } document(simpleType.annotation); if (!anonymous) { t = deftname(ENUM, false, false, prefix, URI, name); if (t && !eflag && !c11flag) fprintf(stream, "/// @note The enum values are prefixed with \"%s__\" to prevent name clashes: use wsdl2h option -e to omit this prefix or use option -c++11 for scoped enumerations\n", t); } else t = ""; if (t) { if (c11flag) fprintf(stream, "enum * class %s : int64_t\n{\n", t); else fprintf(stream, "enum * %s\n{\n", t); for (vector::const_iterator simple = simpleType.list->simpleType.begin(); simple != simpleType.list->simpleType.end(); ++simple) { if ((*simple).restriction && (*simple).restriction->base) { for (vector::const_iterator enumeration = (*simple).restriction->enumeration.begin(); enumeration != (*simple).restriction->enumeration.end(); ++enumeration) { if ((*enumeration).value) { if (!strcmp((*simple).restriction->base, "xs:QName") && (*enumeration).value_) fprintf(stream, "\t%s,\t///< %s value=\"%s\"\n", ename(t, (*enumeration).value_, true), (*simple).restriction->base, (*enumeration).value_); else fprintf(stream, "\t%s,\t///< %s value=\"%s\"\n", ename(t, (*enumeration).value, false), (*simple).restriction->base, (*enumeration).value); } else fprintf(stream, "//\tunrecognized: bitmask enumeration \"%s\" has no value\n", t); } } } if (!anonymous) { fprintf(stream, "};\n\n"); if (!c11flag && yflag) fprintf(stream, "/// @brief Typedef synonym for enum %s.\ntypedef enum %s %s;\n", t, t, t); if (pflag && simpleType.name) { const char *s = wname(prefix, URI, name); fprintf(stream, "/// @brief A class wrapper.\n///\n"); fprintf(stream, "class %s : public xsd__anyType\n{ public:\n", s); fprintf(stream, elementformat, tname(prefix, URI, name), "__item;"); modify(s); fprintf(stream, "\n};\n\n"); } } else fprintf(stream, "}\n\n"); } } } else if (simpleType.union_) { if (simpleType.union_->memberTypes) { const char *s = tname(NULL, NULL, "xsd:string"); if (!anonymous) t = deftname(TYPEDEF, false, is_ptr(NULL, NULL, "xsd:string"), prefix, URI, name); fprintf(stream, "/// @brief Union of values from member types \"%s\".\n", simpleType.union_->memberTypes); if (t) fprintf(stream, "typedef %s %s;\n\n", s, t); else { fprintf(stream, elementformat, s, ""); fprintf(stream, "\n"); } } else if (!simpleType.union_->simpleType.empty()) { const char *s = tname(NULL, NULL, "xsd:string"); if (!anonymous) t = deftname(TYPEDEF, false, is_ptr(NULL, NULL, "xsd:string"), prefix, URI, name); for (vector::const_iterator simpleType1 = simpleType.union_->simpleType.begin(); simpleType1 != simpleType.union_->simpleType.end(); ++simpleType1) { if ((*simpleType1).restriction) { fprintf(stream, "/// @brief Union of values from type \"%s\".\n", (*simpleType1).restriction->base); // TODO: are there any other types we should report here? } } if (t) fprintf(stream, "typedef %s %s;\n\n", s, t); else { fprintf(stream, elementformat, s, ""); fprintf(stream, "\n"); } } else fprintf(stream, "//\tunrecognized\n"); } else fprintf(stream, "//\tunrecognized simpleType\n"); } void Types::gen(const char *URI, const char *name, const xs__complexType& complexType, bool anonymous) { const char *t = NULL; const char *prefix = NULL; bool soapflag = false; if (complexType.name) name = complexType.name; else prefix = "_"; if (anonymous && name) t = sname(URI, name); else if (name) { t = cname(prefix, URI, name); if (deftypemap[t]) return; } if (name) scope.push_back(name); if (complexType.simpleContent) { if (!anonymous) fprintf(stream, "/// @brief \"%s\":%s is a%s complexType with simpleContent.\n///\n", URI ? URI : "", name, complexType.abstract ? "n abstract" : ""); document(complexType.annotation); if (!complexType.assert.empty()) { fprintf(stream, "/// Assertions:\n"); for (std::vector::const_iterator a = complexType.assert.begin(); a != complexType.assert.end(); ++a) if ((*a).test) documentation((*a).test); } operations(t); if (complexType.simpleContent->restriction) { if (anonymous) { if (cflag) fprintf(stream, " struct %s\n {\n", t); else fprintf(stream, " class %s\n {\n", t); } else if (cflag) fprintf(stream, "struct %s\n{\n", t); else if (pflag && complexType.name) fprintf(stream, "class %s : public xsd__anyType\n{ public:\n", t); else fprintf(stream, "class %s\n{ public:\n", t); const char *base = "xs:string"; const char *baseURI = NULL; const xs__complexType *p = &complexType; do { if (!p->simpleContent) break; if (p->simpleContent->restriction) { if (p->simpleContent->restriction->complexTypePtr()) p = p->simpleContent->restriction->complexTypePtr(); else { base = p->simpleContent->restriction->base; if (p->simpleContent->restriction->simpleTypePtr() && p->simpleContent->restriction->simpleTypePtr()->schemaPtr()) baseURI = p->simpleContent->restriction->simpleTypePtr()->schemaPtr()->targetNamespace; break; } } else if (p->simpleContent->extension) { if (p->simpleContent->extension->complexTypePtr()) p = p->simpleContent->extension->complexTypePtr(); else { base = p->simpleContent->extension->base; if (p->simpleContent->extension->simpleTypePtr() && p->simpleContent->extension->simpleTypePtr()->schemaPtr()) baseURI = p->simpleContent->extension->simpleTypePtr()->schemaPtr()->targetNamespace; break; } } else break; } while (p); fprintf(stream, "/// __item wraps \"%s\" simpleContent.\n", base); fprintf(stream, elementformat, tname(NULL, baseURI, base), "__item"); fprintf(stream, ";\n"); p = &complexType; bool flag = true; do { if (!p->simpleContent) break; if (p->simpleContent->restriction) { // TODO: should only generate attribute when name is different? gen(URI, p->simpleContent->restriction->attribute); if (p->simpleContent->restriction->anyAttribute && flag) { gen(URI, *p->simpleContent->restriction->anyAttribute); flag = false; } if (p->simpleContent->restriction->complexTypePtr()) p = p->simpleContent->restriction->complexTypePtr(); else break; } else if (p->simpleContent->extension) { gen(URI, p->simpleContent->extension->attribute); gen(URI, p->simpleContent->extension->attributeGroup); if (p->simpleContent->extension->anyAttribute && flag) { gen(URI, *p->simpleContent->extension->anyAttribute); flag = false; } if (p->simpleContent->extension->complexTypePtr()) p = p->simpleContent->extension->complexTypePtr(); else break; } else break; } while (p); } else if (complexType.simpleContent->extension) { const char *base = "xs:string"; const char *baseURI = NULL; if (cflag || fflag || anonymous) { if (anonymous) { if (cflag) fprintf(stream, " struct %s\n {\n", t); else fprintf(stream, " class %s\n {\n", t); } else if (cflag) fprintf(stream, "struct %s\n{\n", t); else if (pflag && complexType.name) fprintf(stream, "class %s : public xsd__anyType\n{ public:\n", t); else fprintf(stream, "class %s\n{ public:\n", t); const xs__complexType *p = &complexType; do { if (!p->simpleContent) break; if (p->simpleContent->restriction) { if (p->simpleContent->restriction->complexTypePtr()) p = p->simpleContent->restriction->complexTypePtr(); else { base = p->simpleContent->restriction->base; if (p->simpleContent->restriction->simpleTypePtr() && p->simpleContent->restriction->simpleTypePtr()->schemaPtr()) baseURI = p->simpleContent->restriction->simpleTypePtr()->schemaPtr()->targetNamespace; break; } } else if (p->simpleContent->extension) { if (p->simpleContent->extension->complexTypePtr()) p = p->simpleContent->extension->complexTypePtr(); else { base = p->simpleContent->extension->base; if (p->simpleContent->extension->simpleTypePtr() && p->simpleContent->extension->simpleTypePtr()->schemaPtr()) baseURI = p->simpleContent->extension->simpleTypePtr()->schemaPtr()->targetNamespace; break; } } else break; } while (p); fprintf(stream, "/// __item wraps \"%s\" simpleContent.\n", base); fprintf(stream, elementformat, tname(NULL, baseURI, base), "__item"); fprintf(stream, ";\n"); p = &complexType; bool flag = true; do { if (!p->simpleContent) break; if (p->simpleContent->restriction) { gen(URI, p->simpleContent->restriction->attribute); if (p->simpleContent->restriction->anyAttribute && flag) gen(URI, *p->simpleContent->restriction->anyAttribute); break; } else if (p->simpleContent->extension) { gen(URI, p->simpleContent->extension->attribute); gen(URI, p->simpleContent->extension->attributeGroup); if (p->simpleContent->extension->anyAttribute && flag) { gen(URI, *p->simpleContent->extension->anyAttribute); flag = false; } if (p->simpleContent->extension->complexTypePtr()) p = p->simpleContent->extension->complexTypePtr(); else break; } else break; } while (p); } else { base = complexType.simpleContent->extension->base; if ( /* TODO: in future, may want to add check here for base type == class complexType.simpleContent->extension->simpleTypePtr() || */ complexType.simpleContent->extension->complexTypePtr()) { if (complexType.simpleContent->extension->complexTypePtr()->schemaPtr()) baseURI = complexType.simpleContent->extension->complexTypePtr()->schemaPtr()->targetNamespace; fprintf(stream, "class %s : public %s\n{ public:\n", t, cname(NULL, baseURI, base)); soapflag = true; } else { if (complexType.simpleContent->extension->simpleTypePtr() && complexType.simpleContent->extension->simpleTypePtr()->schemaPtr()) baseURI = complexType.simpleContent->extension->simpleTypePtr()->schemaPtr()->targetNamespace; else if (complexType.simpleContent->extension->complexTypePtr() && complexType.simpleContent->extension->complexTypePtr()->schemaPtr()) baseURI = complexType.simpleContent->extension->complexTypePtr()->schemaPtr()->targetNamespace; if (pflag && complexType.name) fprintf(stream, "class %s : public xsd__anyType\n{ public:\n", t); else fprintf(stream, "class %s\n{ public:\n", t); fprintf(stream, "/// __item wraps \"%s\" simpleContent.\n", base); fprintf(stream, elementformat, tname(NULL, baseURI, base), "__item"); fprintf(stream, ";\n"); } gen(URI, complexType.simpleContent->extension->attribute); gen(URI, complexType.simpleContent->extension->attributeGroup); if (complexType.simpleContent->extension->anyAttribute) gen(URI, *complexType.simpleContent->extension->anyAttribute); } } else fprintf(stream, "//\tunrecognized\n"); } else if (complexType.complexContent) { if (complexType.complexContent->restriction) { if (!anonymous) fprintf(stream, "/// @brief \"%s\":%s is a%s complexType with complexContent restriction of XSD type %s.\n///\n", URI ? URI : "", name, complexType.abstract ? "n abstract" : "", complexType.complexContent->restriction->base); document(complexType.annotation); document(complexType.complexContent->annotation); document(complexType.complexContent->restriction->annotation); if (!complexType.assert.empty()) { fprintf(stream, "/// Assertions:\n"); for (std::vector::const_iterator a = complexType.assert.begin(); a != complexType.assert.end(); ++a) if ((*a).test) documentation((*a).test); } if (!complexType.complexContent->restriction->assert.empty()) { fprintf(stream, "/// Assertions on restriction:\n"); for (std::vector::const_iterator a = complexType.complexContent->restriction->assert.begin(); a != complexType.complexContent->restriction->assert.end(); ++a) if ((*a).test) documentation((*a).test); } operations(t); if (!strcmp(complexType.complexContent->restriction->base, "SOAP-ENC:Array")) { char *item = NULL, *type = NULL; if (!complexType.complexContent->restriction->attribute.empty()) { xs__attribute& attribute = complexType.complexContent->restriction->attribute.front(); if (attribute.wsdl__arrayType) type = attribute.wsdl__arrayType; } xs__seqchoice *s = complexType.complexContent->restriction->sequence; if (s && !s->__contents.empty() && s->__contents.front().__union == SOAP_UNION_xs__union_content_element && s->__contents.front().__content.element) { xs__element& element = *s->__contents.front().__content.element; if (!type) { if (element.type) type = element.type; else if (element.simpleTypePtr()) { if (element.simpleTypePtr()->name) type = element.simpleTypePtr()->name; else if (element.simpleTypePtr()->restriction) type = element.simpleTypePtr()->restriction->base; } else if (element.complexTypePtr()) { if (element.complexTypePtr()->name) type = element.complexTypePtr()->name; else if (element.complexTypePtr()->complexContent && element.complexTypePtr()->complexContent->restriction) type = element.complexTypePtr()->complexContent->restriction->base; } } item = element.name; // } gen_soap_array(t, item, type); } else { if (anonymous) { if (cflag) fprintf(stream, " struct %s\n {\n", t); else fprintf(stream, " class %s\n {\n", t); } else if (cflag) fprintf(stream, "struct %s\n{\n", t); else if (pflag && complexType.name) fprintf(stream, "class %s : public xsd__anyType\n{ public:\n", t); else fprintf(stream, "class %s\n{ public:\n", t); if (complexType.complexContent->restriction->group) gen(URI, *complexType.complexContent->restriction->group, NULL, NULL); if (complexType.complexContent->restriction->all) gen(URI, *complexType.complexContent->restriction->all, NULL, NULL); if (complexType.complexContent->restriction->sequence) gen(URI, *complexType.complexContent->restriction->sequence, NULL, NULL); if (complexType.complexContent->restriction->choice) gen(URI, name, *complexType.complexContent->restriction->choice, NULL, NULL); gen(URI, complexType.complexContent->restriction->attribute); bool flag = true; if (complexType.complexContent->restriction->anyAttribute) { gen(URI, *complexType.complexContent->restriction->anyAttribute); flag = false; } const xs__complexType *p = complexType.complexContent->restriction->complexTypePtr(); while (p) { const char *pURI; if (p->schemaPtr()) pURI = p->schemaPtr()->targetNamespace; else pURI = URI; const char *b = cname(NULL, pURI, p->name); if (zflag && zflag <= 5) fprintf(stream, "/// RESTRICTED FROM %s:\n", b); else if (comment_nest == 0) fprintf(stream, "/* RESTRICTED FROM %s:\n", b); else fprintf(stream, " RESTRICTED FROM %s:\n", b); comment_nest++; if (p->complexContent && p->complexContent->restriction) { gen(URI, p->complexContent->restriction->attribute); if (p->complexContent->restriction->anyAttribute && flag) { gen(URI, *p->complexContent->restriction->anyAttribute); flag = false; } p = p->complexContent->restriction->complexTypePtr(); } else if (p->complexContent && p->complexContent->extension) { gen(URI, p->complexContent->extension->attribute); gen(URI, p->complexContent->extension->attributeGroup); if (p->complexContent->extension->anyAttribute && flag) { gen(URI, *p->complexContent->extension->anyAttribute); flag = false; } p = p->complexContent->extension->complexTypePtr(); } else { gen(URI, p->attribute); gen(URI, p->attributeGroup); if (p->anyAttribute && flag) gen(URI, *p->anyAttribute); p = NULL; } comment_nest--; if (zflag && zflag <= 5) fprintf(stream, "// END OF RESTRICTED FROM %s\n", b); else if (comment_nest == 0) fprintf(stream, " END OF RESTRICTED FROM %s */\n", b); else fprintf(stream, " END OF RESTRICTED FROM %s\n", b); } } } else if (complexType.complexContent->extension) { const char *base = complexType.complexContent->extension->base; xs__complexType *p = complexType.complexContent->extension->complexTypePtr(); if (!anonymous) fprintf(stream, "/// @brief \"%s\":%s is a%s complexType with complexContent extension of XSD type %s.\n///\n", URI ? URI : "", name, complexType.abstract ? "n abstract" : "", base); document(complexType.annotation); document(complexType.complexContent->annotation); document(complexType.complexContent->extension->annotation); if (!complexType.assert.empty()) { fprintf(stream, "/// Assertions:\n"); for (std::vector::const_iterator a = complexType.assert.begin(); a != complexType.assert.end(); ++a) if ((*a).test) documentation((*a).test); } if (!complexType.complexContent->extension->assert.empty()) { fprintf(stream, "/// Assertions on extension:\n"); for (std::vector::const_iterator a = complexType.complexContent->extension->assert.begin(); a != complexType.complexContent->extension->assert.end(); ++a) if ((*a).test) documentation((*a).test); } operations(t); if (anonymous) { if (cflag) fprintf(stream, " struct %s\n {\n", t); else fprintf(stream, " class %s\n {\n", t); } else if (cflag) fprintf(stream, "struct %s\n{\n", t); else if (fflag) fprintf(stream, "class %s\n{ public:\n", t); else // TODO: what to do if base class is in another namespace and elements must be qualified in XML payload? { const char *baseURI = NULL; if (p && p->schemaPtr()) baseURI = p->schemaPtr()->targetNamespace; fprintf(stream, "class %s : public %s\n{ public:\n", t, cname(NULL, baseURI, base)); soapflag = true; } gen_inh(URI, p, anonymous); if (complexType.complexContent->extension->group) gen(URI, *complexType.complexContent->extension->group, NULL, NULL); if (complexType.complexContent->extension->all) gen(URI, *complexType.complexContent->extension->all, NULL, NULL); if (complexType.complexContent->extension->sequence) gen(URI, *complexType.complexContent->extension->sequence, NULL, NULL); if (complexType.complexContent->extension->choice) gen(URI, name, *complexType.complexContent->extension->choice, NULL, NULL); gen(URI, complexType.complexContent->extension->attribute); gen(URI, complexType.complexContent->extension->attributeGroup); if (complexType.complexContent->extension->anyAttribute) gen(URI, *complexType.complexContent->extension->anyAttribute); } else fprintf(stream, "//\tunrecognized\n"); } else { if (!anonymous) fprintf(stream, "/// @brief \"%s\":%s is a%s complexType.\n///\n", URI ? URI : "", name, complexType.abstract ? "n abstract" : ""); document(complexType.annotation); operations(t); if (anonymous) { if (cflag) fprintf(stream, " struct %s\n {\n", t); else fprintf(stream, " class %s\n {\n", t); } else if (cflag) fprintf(stream, "struct %s\n{\n", t); else if (pflag && complexType.name) fprintf(stream, "class %s : public xsd__anyType\n{ public:\n", t); else fprintf(stream, "class %s\n{ public:\n", t); if (complexType.all) gen(URI, *complexType.all, NULL, NULL); else if (complexType.choice) gen(URI, name, *complexType.choice, NULL, NULL); else if (complexType.sequence) gen(URI, *complexType.sequence, NULL, NULL); else if (complexType.any) gen(URI, *complexType.any, NULL, NULL); } if (!(complexType.complexContent && complexType.complexContent->extension) && complexType.defaultAttributesApply && complexType.schemaPtr() && complexType.schemaPtr()->attributeGroupPtr()) { fprintf(stream, "/// Default attributes \"%s\"\n", complexType.schemaPtr()->defaultAttributes); xs__attributeGroup *a = complexType.schemaPtr()->attributeGroupPtr(); if (a->attributeGroupPtr()) a = a->attributeGroupPtr(); gen(URI, a->attribute); gen(URI, a->attributeGroup); if (a->anyAttribute) gen(URI, *a->anyAttribute); } gen(URI, complexType.attribute); gen(URI, complexType.attributeGroup); if (complexType.anyAttribute) gen(URI, *complexType.anyAttribute); if (complexType.mixed || ( complexType.complexContent && ( complexType.complexContent->mixed || ( complexType.complexContent->extension && complexType.complexContent->extension->complexTypePtr() && complexType.complexContent->extension->complexTypePtr()->mixed ) ) )) { fprintf(stream, "/// @todo This mixed content complexType is user-definable.\n/// Consult the protocol documentation to change or insert declarations.\n/// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element).\n"); if (dflag) { if (with_union) fprintf(stream, pointerformat, "xsd__anyType", "__mixed"); else fprintf(stream, elementformat, "xsd__anyType", "__mixed"); fprintf(stream, "0;\t///< Catch mixed content in DOM soap_dom_element linked node structure.\n"); } else { fprintf(stream, elementformat, "_XML", "__mixed"); fprintf(stream, "0;\t///< Catch mixed content in XML string.\n"); } } if (t) modify(t); if (!anonymous) { if (!cflag && !(pflag && complexType.name) && !soapflag) { if (!complexType.complexContent || !complexType.complexContent->extension || !complexType.complexContent->extension->complexTypePtr()) { fprintf(stream, "/// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set).\n"); fprintf(stream, pointerformat, "struct soap", "soap"); fprintf(stream, ";\n"); } } fprintf(stream, "};\n\n"); } scope.pop_back(); } void Types::gen(const char *URI, const vector& attributes) { for (vector::const_iterator attribute = attributes.begin(); attribute != attributes.end(); ++attribute) gen(URI, *attribute); } void Types::gen(const char *URI, const xs__attribute& attribute) { const char *name = attribute.name; const char *type = attribute.type; const char *default_ = attribute.default_; const char *default__ = attribute.default__; const char *fixed = attribute.fixed; const char *fixed_ = attribute.fixed_; const char *nameURI = NULL, *typeURI = NULL, *nameprefix = NULL, *typeprefix = NULL; bool is_optional = attribute.use != required && !default_; document(attribute.annotation); if (!URI) URI = attribute.schemaPtr()->targetNamespace; if (attribute.targetNamespace) { if ((attribute.form && *attribute.form == qualified) || attribute.schemaPtr()->attributeFormDefault == qualified) nameURI = attribute.targetNamespace; else nameprefix = ":"; } else if (!attribute.ref && URI && attribute.schemaPtr() && attribute.schemaPtr()->targetNamespace && strcmp(URI, attribute.schemaPtr()->targetNamespace)) { if ((attribute.form && *attribute.form == qualified) || attribute.schemaPtr()->attributeFormDefault == qualified) nameURI = attribute.schemaPtr()->targetNamespace; // handles attributes defined in another namespace else nameprefix = ":"; } else if (attribute.form) { if (*attribute.form == qualified) nameURI = URI; else nameprefix = ":"; } if (attribute.attributePtr()) // attribute ref { name = attribute.attributePtr()->name; type = attribute.attributePtr()->type; if (!default_) { default_ = attribute.attributePtr()->default_; default__ = attribute.attributePtr()->default__; } if (!fixed) { fixed = attribute.attributePtr()->fixed; fixed_ = attribute.attributePtr()->fixed_; } if (default_) is_optional = false; else if (is_optional) is_optional = attribute.attributePtr()->use != required; if (!type) { type = name; typeprefix = "_"; } if (attribute.attributePtr()->schemaPtr()) { typeURI = attribute.attributePtr()->schemaPtr()->targetNamespace; if (attribute.form && *attribute.form == unqualified) nameprefix = ":"; else if (zflag != 3 && zflag != 2 && URI && typeURI && attribute.schemaPtr()->attributeFormDefault == qualified && !strcmp(URI, typeURI)) nameprefix = NULL; else if (zflag == 3 && URI && typeURI && attribute.schemaPtr()->attributeFormDefault == unqualified && !strcmp(URI, typeURI)) nameprefix = NULL; else nameURI = typeURI; } if (attribute.ref) fprintf(stream, "/// Attribute reference \"%s\":%s.\n", attribute.schemaPtr()->targetNamespace, attribute.ref); document(attribute.attributePtr()->annotation); fprintf(stream, attributeformat, pname(is_optional, true, typeprefix, typeURI, type), aname(nameprefix, nameURI, name)); // make sure no name - type clash } else if (name && type) { fprintf(stream, "/// Attribute \"%s\" of XSD type %s.\n", name, type); fprintf(stream, attributeformat, pname(is_optional, true, NULL, URI, type), aname(nameprefix, nameURI, name)); // make sure no name - type clash } else if (name && attribute.simpleTypePtr()) { const char *s = ""; const char *r = NULL; if (!cflag && is_optional && (r = vname("$POINTER")) && *r != '*' && *r != '$') { s = ">"; fprintf(stream, attrtemplateformat_open, r, "\n"); } else fprintf(stream, "@"); gen(URI, name, *attribute.simpleTypePtr(), true, false); if (r && *r != '*' && *r != '$') fprintf(stream, elementformat, s, aname(nameprefix, nameURI, name)); else if (is_optional) fprintf(stream, pointerformat, s, aname(nameprefix, nameURI, name)); else fprintf(stream, elementformat, s, aname(nameprefix, nameURI, name)); } else if (attribute.ref) { fprintf(stream, "/// Imported attribute reference %s.\n", attribute.ref); fprintf(stream, attributeformat, pname(is_optional, true, "_", NULL, attribute.ref), aname(NULL, NULL, attribute.ref)); } else { fprintf(stream, "/// Attribute \"%s\" has no type or ref: assuming string content.\n", name ? name : ""); fprintf(stream, attributeformat, tname(NULL, NULL, "xs:string"), aname(NULL, nameURI, name)); } switch (attribute.use) { case prohibited: fprintf(stream, " 0:0"); break; case required: fprintf(stream, " 1"); break; default: if (is_optional || default_) fprintf(stream, " 0"); break; } if (default_) { const char *value, *QName; value = default_; QName = default__; const char *t = NULL; if (!type && attribute.simpleTypePtr()) { if (attribute.simpleTypePtr()->restriction && attribute.simpleTypePtr()->restriction->base) { if (!attribute.simpleTypePtr()->restriction->enumeration.empty()) { const char *s; if (is_integer(value)) fprintf(stream, " = %s", value); else if (!*value) fprintf(stream, " = 0"); else if ((s = enames[Pair(gname(URI, name),value)])) fprintf(stream, " = %s", s); } else { const char *baseURI = NULL; if (attribute.simpleTypePtr()->restriction->simpleTypePtr() && attribute.simpleTypePtr()->restriction->simpleTypePtr()->schemaPtr()) baseURI = attribute.simpleTypePtr()->restriction->simpleTypePtr()->schemaPtr()->targetNamespace; t = tname(NULL, baseURI, attribute.simpleTypePtr()->restriction->base); } } } if (type && !t) t = tname(NULL, typeURI ? typeURI : URI, type); if (t) { if (!strncmp(t, "unsigned ", 9)) t += 9; else if (!strncmp(t, "xsd__unsigned", 13)) t += 13; else if (!strncmp(t, "xsd__", 5)) t += 5; if (!strcmp(t, "bool") || !strcmp(t, "byte") || !strcmp(t, "Byte") || !strcmp(t, "char") || !strcmp(t, "double") || !strcmp(t, "float") || !strcmp(t, "int") || !strcmp(t, "Int") || !strcmp(t, "long") || !strcmp(t, "Long") || !strcmp(t, "LONG64") || !strcmp(t, "short") || !strcmp(t, "Short") || !strcmp(t, "ULONG64")) fprintf(stream, " = %s", value); else if (!strncmp(t, "enum ", 5)) { const char *s; if (is_integer(value)) fprintf(stream, " = %s", value); else if (!*value) fprintf(stream, " = 0"); else if ((s = enames[Pair(t + 5,value)])) fprintf(stream, " = %s", s); } else if (!strncmp(t, "char", 4) || !strncmp(t, "const char", 10) || !strncmp(t, "wchar_t", 7) || !strncmp(t, "const wchar_t", 13) || !strncmp(t, "std::string", 11)) fprintf(stream, " = \"%s\"", cstring(value)); else if (!strcmp(t, "xsd__QName") && QName) // QName fprintf(stream, " = \"%s\"", cstring(QName)); } fprintf(stream, ";\t///< Default attribute value=\"%s\".\n", value); } else if (fixed) fprintf(stream, ";\t///< Fixed attribute value=\"%s\".\n", fixed); else if (attribute.use == required) fprintf(stream, ";\t///< Required attribute.\n"); else if (attribute.use == prohibited) fprintf(stream, ";\t///< Prohibited attribute.\n"); else fprintf(stream, ";\t///< Optional attribute.\n"); } void Types::gen(const char *URI, const vector& attributeGroups) { for (vector::const_iterator attributeGroup = attributeGroups.begin(); attributeGroup != attributeGroups.end(); ++attributeGroup) { static set visited; const xs__attributeGroup *p = &*attributeGroup; if (visited.find(p) != visited.end()) { if (p->ref) fprintf(stderr, "\nWarning: circular attributeGroup \n", p->ref); else fprintf(stderr, "\nWarning: circular attributeGroup \n", p->name ? p->name : ""); fprintf(stream, "/// @todo !FIXME! @warning %s is an attributeGroup with a circular reference.\n", p->ref ? p->ref : p->name ? p->name : ""); return; } visited.insert(p); const char *pURI = URI; if (p->ref) // attributeGroup ref fprintf(stream, "// BEGIN ATTRIBUTEGROUP .\n", p->ref ? p->ref : ""); else fprintf(stream, "// BEGIN ATTRIBUTEGROUP .\n", p->name ? p->name : ""); if (p->attributeGroupPtr()) { gen(pURI, p->attributeGroupPtr()->attribute); gen(pURI, p->attributeGroupPtr()->attributeGroup); } else { gen(pURI, p->attribute); gen(pURI, p->attributeGroup); } if (p->anyAttribute) gen(pURI, *p->anyAttribute); fprintf(stream, "// END OF ATTRIBUTEGROUP\n"); visited.erase(p); } } void Types::gen(const char *URI, const vector& alls) { for (vector::const_iterator all = alls.begin(); all != alls.end(); ++all) gen(URI, *all, NULL, NULL); } void Types::gen(const char *URI, const xs__all& all, const char *minOccurs, const char *maxOccurs) { bool tmp_union1 = with_union; bool tmp_union2 = fake_union; with_union = false; fake_union = false; gen(URI, all.element, minOccurs, maxOccurs); with_union = tmp_union1; fake_union = tmp_union2; } void Types::gen(const char *URI, const vector& contents) { for (vector::const_iterator content = contents.begin(); content != contents.end(); ++content) { switch ((*content).__union) { case SOAP_UNION_xs__union_content_element: if ((*content).__content.element) gen(URI, *(*content).__content.element, true, NULL, NULL); break; case SOAP_UNION_xs__union_content_group: if ((*content).__content.group) gen(URI, *(*content).__content.group, NULL, NULL); break; case SOAP_UNION_xs__union_content_choice: if ((*content).__content.choice) gen(URI, NULL, *(*content).__content.choice, NULL, NULL); break; case SOAP_UNION_xs__union_content_sequence: if ((*content).__content.sequence) gen(URI, *(*content).__content.sequence, NULL, NULL); break; case SOAP_UNION_xs__union_content_any: if ((*content).__content.any) gen(URI, *(*content).__content.any, NULL, NULL); break; } } } void Types::gen(const char *URI, const xs__seqchoice& sequence, const char *minOccurs, const char *maxOccurs) { const char *s = NULL; const char *min = minOccurs; const char *max = maxOccurs; char *t = NULL; bool tmp_union = with_union; with_union = false; if (sequence.minOccurs) min = sequence.minOccurs; if (sequence.maxOccurs) max = sequence.maxOccurs; if ((min && strcmp(min, "1")) || (max && strcmp(max, "1"))) { fprintf(stream, "// BEGIN SEQUENCE \n"); document(sequence.annotation); s = sname(URI, "sequence"); size_t l = strlen(s); t = (char*)emalloc(l + 2); soap_strcpy(t, l + 2, "_"); soap_strcpy(t + 1, l + 1, s); s = strstr(s, "__"); if (!s) s = t; if (max && strcmp(max, "1")) { if (cflag || sflag || zflag == 2) { fprintf(stream, sizeformat, "int", s + 1); if (!fake_union && min) fprintf(stream, " %s", min); if (max && strcmp(max, "1") && is_integer(max)) fprintf(stream, ":%s", max); fprintf(stream, ";\n"); } else { fprintf(stream, templateformat_open, vname("$CONTAINER"), "\n"); } } if (cflag) fprintf(stream, " struct %s\n {\n", t); else fprintf(stream, " class %s\n {\n", t); } else { if (fake_union) fprintf(stream, "// BEGIN SEQUENCE \n"); document(sequence.annotation); } gen(URI, sequence.__contents); if (s) { if (max && strcmp(max, "1")) { if (cflag || sflag || zflag == 2) fprintf(stream, pointerformat, "}", s); else { fprintf(stream, elementformat, "}>", s); if (!fake_union && min) fprintf(stream, " %s", min); if (max && strcmp(max, "1") && is_integer(max)) fprintf(stream, ":%s", max); } } else { fprintf(stream, pointerformat, "}", s); if (!fake_union && min) fprintf(stream, " %s", min); } fprintf(stream, ";\n"); } if (s || fake_union) fprintf(stream, "// END OF SEQUENCE\n"); with_union = tmp_union; } void Types::gen(const char *URI, const vector& elements, const char *minOccurs, const char *maxOccurs) { for (vector::const_iterator element = elements.begin(); element != elements.end(); ++element) gen(URI, *element, true, minOccurs, maxOccurs); } void Types::gen(const char *URI, const xs__element& element, bool substok, const char *minOccurs, const char *maxOccurs) { const char *name = element.name; const char *type = element.type; const char *default_ = element.default_; const char *default__ = element.default__; const char *fixed = element.fixed; const char *fixed_ = element.fixed_; const char *min = minOccurs; const char *max = maxOccurs; bool nillable = element.nillable; const char *nameURI = NULL, *typeURI = NULL, *nameprefix = NULL, *typeprefix = NULL; document(element.annotation); if (!URI) URI = element.schemaPtr()->targetNamespace; if (element.minOccurs) min = element.minOccurs; if (element.maxOccurs) max = element.maxOccurs; if (element.xmime__expectedContentTypes) fprintf(stream, "/// MTOM attachment with content types %s.\n", element.xmime__expectedContentTypes); if (element.targetNamespace) { if ((element.form && *element.form == qualified) || element.schemaPtr()->elementFormDefault == qualified) nameURI = element.targetNamespace; else nameprefix = ":"; } else if (!element.ref && URI && element.schemaPtr() && element.schemaPtr()->targetNamespace && strcmp(URI, element.schemaPtr()->targetNamespace)) { if ((element.form && *element.form == qualified) || element.schemaPtr()->elementFormDefault == qualified) nameURI = element.schemaPtr()->targetNamespace; // handles elements defined in another namespace else nameprefix = ":"; } else if (element.form) { if (*element.form == qualified) nameURI = URI; else nameprefix = ":"; } if (element.elementPtr()) // element ref (or ref to substitution element) { name = element.elementPtr()->name; type = element.elementPtr()->type; if (!default_) { default_ = element.elementPtr()->default_; default__ = element.elementPtr()->default__; } if (!fixed) { fixed = element.elementPtr()->fixed; fixed_ = element.elementPtr()->fixed_; } if (!nillable) nillable = element.elementPtr()->nillable; if (!type) { type = name; typeprefix = "_"; } if (element.elementPtr()->schemaPtr()) { typeURI = element.elementPtr()->schemaPtr()->targetNamespace; if (element.form && *element.form == unqualified) nameprefix = ":"; else if (zflag != 3 && zflag != 2 && URI && typeURI && element.schemaPtr()->elementFormDefault == qualified && !strcmp(URI, typeURI)) nameprefix = NULL; else if (zflag == 3 && URI && typeURI && element.schemaPtr()->elementFormDefault == unqualified && !strcmp(URI, typeURI)) nameprefix = NULL; else nameURI = typeURI; } document(element.elementPtr()->annotation); if (element.elementPtr()->xmime__expectedContentTypes) fprintf(stream, "/// MTOM attachment with content types %s.\n", element.elementPtr()->xmime__expectedContentTypes); if (substok && element.elementPtr()->abstract) { fprintf(stream, "/// Reference %s to abstract element.\n", element.ref); gen_substitutions(URI, element); } else if (substok && element.elementPtr()->substitutionsPtr() && !element.elementPtr()->substitutionsPtr()->empty()) { if (vflag) fprintf(stderr, "\nWarning: element ref \"%s\" stands as the head of a substitutionGroup but is not declared abstract\n", element.ref); gen_substitutions(URI, element); } else if (max && strcmp(max, "1")) // maxOccurs != "1" { const char *s = tnameptr(cflag && zflag != 1, typeprefix, typeURI, type); if (cflag || sflag) { fprintf(stream, "/// Size of the dynamic array of %s is %s..%s.\n", s, min ? min : "1", max); fprintf(stream, sizeformat, "int", aname(NULL, NULL, name)); fprintf(stream, " %s", fake_union ? "0" : min ? min : "1"); if (is_integer(max)) fprintf(stream, ":%s", max); fprintf(stream, ";\n"); if (cflag && zflag != 1) { fprintf(stream, "/// Array %s of size %s..%s.\n", s, min ? min : "1", max); fprintf(stream, elementformat, s, aname(nameprefix, nameURI, name)); } else { fprintf(stream, "/// Pointer to array %s of size %s..%s.\n", s, min ? min : "1", max); fprintf(stream, pointerformat, s, aname(nameprefix, nameURI, name)); } } else { fprintf(stream, "/// Vector of %s element refs of length %s..%s.\n", s, min ? min : "1", max); if (with_union) fprintf(stream, pointertemplateformat, vname("$CONTAINER"), s, aname(nameprefix, nameURI, name)); else fprintf(stream, templateformat, vname("$CONTAINER"), s, aname(nameprefix, nameURI, name)); } } else { if (element.ref) fprintf(stream, "/// Element reference \"%s:\"%s.\n", element.schemaPtr()->targetNamespace, element.ref); else fprintf(stream, "/// Element \"%s\":%s.\n", element.schemaPtr()->targetNamespace, name); fprintf(stream, elementformat, pname((with_union && !is_choicetype(typeprefix, typeURI, type)) || ((fake_union || element.nillable || (is_nillable(element) && !(with_union && is_choicetype(typeprefix, typeURI, type)))) && !default_) || fixed, !with_union, typeprefix, typeURI, type), aname(nameprefix, nameURI, name)); } } else if (name && type) { if (substok && element.abstract) { fprintf(stream, "/// Abstract element %s of XSD type %s.\n", name, type); gen_substitutions(URI, element); } else if (substok && element.substitutionsPtr() && !element.substitutionsPtr()->empty()) { if (vflag) fprintf(stderr, "\nWarning: element \"%s\" stands as the head of a substitutionGroup but is not declared abstract\n", name); gen_substitutions(URI, element); } else if (max && strcmp(max, "1")) // maxOccurs != "1" { const char *s = tnameptr(cflag && zflag != 1, NULL, URI, type); if (cflag || sflag) { fprintf(stream, "/// Size of array of %s is %s..%s.\n", s, min ? min : "1", max); fprintf(stream, sizeformat, "int", aname(NULL, NULL, name)); fprintf(stream, " %s", fake_union ? "0" : min ? min : "1"); if (is_integer(max)) fprintf(stream, ":%s", max); fprintf(stream, ";\n"); if (cflag && zflag != 1) { fprintf(stream, "/// Array %s of size %s..%s.\n", s, min ? min : "1", max); fprintf(stream, elementformat, s, aname(nameprefix, nameURI, name)); } else { fprintf(stream, "/// Pointer to array %s of size %s..%s.\n", s, min ? min : "1", max); fprintf(stream, pointerformat, s, aname(nameprefix, nameURI, name)); } } else { fprintf(stream, "/// Vector of %s of length %s..%s.\n", s, min ? min : "1", max); if (with_union) fprintf(stream, pointertemplateformat, vname("$CONTAINER"), s, aname(nameprefix, nameURI, name)); else fprintf(stream, templateformat, vname("$CONTAINER"), s, aname(nameprefix, nameURI, name)); } } else { fprintf(stream, "/// Element \"%s\" of XSD type %s.\n", name, type); fprintf(stream, elementformat, pname((with_union && !is_choicetype(NULL, URI, type)) || ((fake_union || element.nillable || (is_nillable(element) && !(with_union && is_choicetype(NULL, URI, type)))) && !default_) || fixed, !with_union, NULL, URI, type), aname(nameprefix, nameURI, name)); } } else if (name && element.simpleTypePtr()) { const char *s = ""; const char *r = NULL; document(element.simpleTypePtr()->annotation); if (max && strcmp(max, "1")) // maxOccurs != "1" { if (cflag || sflag) { fprintf(stream, "/// Size of %s array is %s..%s.\n", name, min ? min : "1", max); fprintf(stream, sizeformat, "int", aname(NULL, NULL, name)); fprintf(stream, " %s", fake_union ? "0" : min ? min : "1"); if (is_integer(max)) fprintf(stream, ":%s", max); fprintf(stream, ";\n"); } else { s = ">"; fprintf(stream, "/// Vector of %s of length %s..%s.\n", name, min ? min : "1", max); fprintf(stream, templateformat_open, vname("$CONTAINER"), "\n"); } } else if (!cflag && !with_union && (r = vname("$POINTER")) && *r != '*' && *r != '$') { if ((is_nillable(element) && !default_) || fixed || (fake_union && !default_)) { s = ">"; fprintf(stream, templateformat_open, r, "\n"); } } gen(URI, name, *element.simpleTypePtr(), true, false); if (r && *r != '*' && *r != '$') fprintf(stream, elementformat, s, aname(nameprefix, nameURI, name)); else if ((is_nillable(element) && !default_) || fixed || ((cflag || sflag) && max && strcmp(max, "1")) // maxOccurs != "1" || (with_union && !cflag) || (fake_union && !default_)) fprintf(stream, pointerformat, s, aname(nameprefix, nameURI, name)); else fprintf(stream, elementformat, s, aname(nameprefix, nameURI, name)); } else if (name && element.complexTypePtr()) { const char *s = "}"; const char *r = NULL; document(element.complexTypePtr()->annotation); if (max && strcmp(max, "1")) // maxOccurs != "1" { if (cflag || sflag) { fprintf(stream, "/// Size of %s array is %s..%s.\n", name, min ? min : "1", max); fprintf(stream, sizeformat, "int", aname(NULL, NULL, name)); fprintf(stream, " %s", fake_union ? "0" : min ? min : "1"); if (is_integer(max)) fprintf(stream, ":%s", max); fprintf(stream, ";\n"); } else { s = "}>"; fprintf(stream, "/// Vector of %s of length %s..%s.\n", name, min ? min : "1", max); fprintf(stream, templateformat_open, vname("$CONTAINER"), "\n"); } } else if (!cflag && !with_union && (r = vname("$POINTER")) && *r != '*' && *r != '$') { if ((is_nillable(element) && !default_) || fixed || (fake_union && !default_)) { s = "}>"; fprintf(stream, templateformat_open, r, "\n"); } } gen(URI, name, *element.complexTypePtr(), true); if (r && *r != '*' && *r != '$') fprintf(stream, elementformat, s, aname(nameprefix, nameURI, name)); else if ((is_nillable(element) && !default_) || fixed || ((cflag || sflag) && max && strcmp(max, "1")) // maxOccurs != "1" || (with_union && !cflag) || (fake_union && !default_)) fprintf(stream, pointerformat, s, aname(nameprefix, nameURI, name)); else fprintf(stream, elementformat, s, aname(nameprefix, nameURI, name)); } else if (element.ref) { fprintf(stream, "/// Imported element reference %s.\n", element.ref); if (max && strcmp(max, "1")) // maxOccurs != "1" { if (cflag || sflag) { fprintf(stream, "/// Size of %s array is %s..%s.\n", element.ref, min ? min : "1", max); fprintf(stream, sizeformat, "int", aname(NULL, NULL, element.ref)); fprintf(stream, " %s", fake_union ? "0" : min ? min : "1"); if (is_integer(max)) fprintf(stream, ":%s", max); fprintf(stream, ";\n"); fprintf(stream, pointerformat, pname(true, true, "_", NULL, element.ref), aname(nameprefix, nameURI, element.ref)); } else { fprintf(stream, "/// Vector of %s of length %s..%s.\n", element.ref, min ? min : "1", max); fprintf(stream, templateformat, vname("$CONTAINER"), tname("_", NULL, element.ref), aname(nameprefix, nameURI, element.ref)); } } else fprintf(stream, elementformat, pname((with_union && !cflag) || ((fake_union || is_nillable(element)) && !default_) || fixed, !with_union, "_", NULL, element.ref), aname(nameprefix, nameURI, element.ref)); } else if (name) { fprintf(stream, "/// Element \"%s\" has no type or ref (empty or with XML content).\n", name ? name : ""); if (max && strcmp(max, "1")) // maxOccurs != "1" { if (cflag || sflag) { fprintf(stream, sizeformat, "int", aname(NULL, NULL, name)); fprintf(stream, " %s", fake_union ? "0" : min ? min : "1"); if (is_integer(max)) fprintf(stream, ":%s", max); fprintf(stream, ";\n"); fprintf(stream, "/// Pointer to array of XML.\n"); fprintf(stream, pointerformat, "_XML", aname(NULL, nameURI, name)); } else { fprintf(stream, "/// Vector of XML of length %s..%s.\n", min ? min : "1", max); if (with_union) fprintf(stream, pointertemplateformat, vname("$CONTAINER"), "_XML", aname(NULL, nameURI, name)); else fprintf(stream, templateformat, vname("$CONTAINER"), "_XML", aname(NULL, nameURI, name)); } } else fprintf(stream, elementformat, "_XML", aname(NULL, nameURI, name)); } else fprintf(stream, "/// Element has no name, type, or ref.\n"); if (!substok || ( !(element.elementPtr() && element.elementPtr()->abstract) && !(element.substitutionsPtr() && !element.substitutionsPtr()->empty()) && !(element.elementPtr() && element.elementPtr()->substitutionsPtr() && !element.elementPtr()->substitutionsPtr()->empty()) )) { if (!fake_union && !min && (default_ || fixed)) fprintf(stream, " 0"); else if (!fake_union && !min && !element.abstract) fprintf(stream, " 1"); else if (!fake_union && min) fprintf(stream, " %s", min); if (max && strcmp(max, "1") && is_integer(max)) fprintf(stream, ":%s", max); if (default_) { // determine whether the element can be assigned a default value, this is dependent on the choice of mapping for primitive types const char *value, *QName; value = default_; QName = default__; if (type) { const char *t = tname(NULL, typeURI ? typeURI : URI, type); if (!strncmp(t, "unsigned ", 9)) t += 9; else if (!strncmp(t, "xsd__unsigned", 13)) t += 13; else if (!strncmp(t, "xsd__", 5)) t += 5; if (!strcmp(t, "bool") || !strcmp(t, "byte") || !strcmp(t, "Byte") || !strcmp(t, "char") || !strcmp(t, "double") || !strcmp(t, "float") || !strcmp(t, "int") || !strcmp(t, "Int") || !strcmp(t, "long") || !strcmp(t, "Long") || !strcmp(t, "LONG64") || !strcmp(t, "short") || !strcmp(t, "Short") || !strcmp(t, "ULONG64")) fprintf(stream, " = %s", value); else if (!strncmp(t, "enum ", 5)) { const char *s; if (is_integer(value)) fprintf(stream, " = %s", value); else if (!*value) fprintf(stream, " = 0"); else if ((s = enames[Pair(t + 5, value)])) fprintf(stream, " = %s", s); } else if (!strncmp(t, "char", 4) || !strncmp(t, "const char", 10) || !strncmp(t, "wchar_t", 7) || !strncmp(t, "const wchar_t", 13) || !strncmp(t, "std::string", 11)) fprintf(stream, " = \"%s\"", cstring(value)); else if (!strcmp(t, "xsd__QName") && QName) // QName fprintf(stream, " = \"%s\"", cstring(QName)); } fprintf(stream, ";\t///< Default element value=\"%s\".\n", value); } else if (fixed) fprintf(stream, ";\t///< Fixed element value=\"%s\".\n", fixed); else if (nillable && (!min || !strcmp(min, "1")) && (!max || !strcmp(max, "1"))) fprintf(stream, ";\t///< Optional (xsi:nil when NULL) element.\n"); else if (!fake_union && (!min || !strcmp(min, "1")) && (!max || !strcmp(max, "1"))) fprintf(stream, ";\t///< Required element.\n"); else if (!fake_union && min && !strcmp(min, "0") && (!max || !strcmp(max, "1"))) fprintf(stream, ";\t///< Optional element.\n"); else fprintf(stream, ";\n"); } } void Types::gen(const char *URI, const vector& groups) { for (vector::const_iterator group = groups.begin(); group != groups.end(); ++group) gen(URI, *group, NULL, NULL); } void Types::gen(const char *URI, const xs__group& group, const char *minOccurs, const char *maxOccurs) { static set visited; const char *min = minOccurs; const char *max = maxOccurs; if (visited.find(&group) != visited.end()) { if (group.ref) fprintf(stderr, "\nWarning: circular group \n", group.ref); else fprintf(stderr, "\nWarning: circular group \n", group.name ? group.name : ""); fprintf(stream, "/// @todo !FIXME! @warning %s is a group with a circular reference.\n", group.ref ? group.ref : group.name ? group.name : ""); return; } visited.insert(&group); if (group.minOccurs) min = group.minOccurs; if (group.maxOccurs) max = group.maxOccurs; if (group.groupPtr()) { gen(URI, *group.groupPtr(), min, max); } else { fprintf(stream, "// BEGIN GROUP \n"); document(group.annotation); if (group.all) gen(URI, *group.all, min, max); else if (group.choice) gen(URI, NULL, *group.choice, min, max); else if (group.sequence) gen(URI, *group.sequence, min, max); fprintf(stream, "// END OF GROUP\n"); } visited.erase(&group); } void Types::gen(const char *URI, const char *name, const xs__seqchoice& choice, const char *minOccurs, const char *maxOccurs) { const char *r = NULL, *s = NULL, *t = NULL; const char *min = minOccurs; const char *max = maxOccurs; bool use_union = !uflag; bool wrap_union = false; bool tmp_union; if (!URI && choice.schemaPtr()) URI = choice.schemaPtr()->targetNamespace; fprintf(stream, "// BEGIN CHOICE \n"); document(choice.annotation); for (vector::const_iterator c1 = choice.__contents.begin(); c1 != choice.__contents.end(); ++c1) { if ((*c1).__union == SOAP_UNION_xs__union_content_group || (*c1).__union == SOAP_UNION_xs__union_content_sequence) { fprintf(stream, "/// @note with embedded or prevents the use of a union for . Instead of being members of a union, the following members are declared optional. Only one member should be non-NULL by choice.\n"); use_union = false; break; } } if (use_union && (cflag || sflag)) { for (vector::const_iterator c2 = choice.__contents.begin(); c2 != choice.__contents.end(); ++c2) { if ((*c2).__union == SOAP_UNION_xs__union_content_element && (*c2).__content.element && (*c2).__content.element->maxOccurs && strcmp((*c2).__content.element->maxOccurs, "1")) { fprintf(stream, "/// @note with one ore more elements with maxOccurs>1 (%s) prevents the use of a union. Instead of being members of a union, the following members are declared optional. Only one member should be non-NULL by choice.\n", (*c2).__content.element->name ? (*c2).__content.element->name : ""); use_union = false; break; } } } t = uname(URI); s = strstr(t, "__union"); #if 0 // Alternative name for choice selector (old style): r = aname(NULL, NULL, name); #else if (s) r = s + 7; if (!r || !*r) { if (strncmp(t, "union", 5) == 0) { r = t + 5; s = r; } else { r = t; s = t; } } #endif if (max && strcmp(max, "1")) { if (with_union) { // Generate a wrapper when we need a union within a union wrap_union = true; fprintf(stream, " struct __%s\n {\n", t); } fprintf(stream, sizeformat, "int", r); fprintf(stream, " %s", min ? min : "0"); if (is_integer(max)) fprintf(stream, ":%s", max); fprintf(stream, ";\n"); if (cflag) fprintf(stream, " struct _%s\n {\n", t); else fprintf(stream, " class _%s\n {\n", t); } if (use_union) { if (!with_union || wrap_union) { fprintf(stream, choiceformat, "int", r); if (min) fprintf(stream, " %s", min); fprintf(stream, ";\t///< Union %s selector: set to SOAP_UNION_%s_%s\n", t, t, min && !strcmp(min, "0") ? " or 0 to omit" : ""); if (name) fprintf(stream, "/// Union for choice in %s.\n", cname(NULL, URI, name)); fprintf(stream, " union %s\n {\n", t); } tmp_union = with_union; with_union = true; } else { tmp_union = fake_union; fake_union = true; } gen(URI, choice.__contents); if (use_union) { with_union = tmp_union; if (!with_union || wrap_union) { fprintf(stream, elementformat, "}", s[0] == '_' && s[1] == '_' ? s+2 : s); fprintf(stream, ";\n"); } } else fake_union = tmp_union; if (max && strcmp(max, "1")) { fprintf(stream, pointerformat, "}", s); fprintf(stream, ";\n"); } if (wrap_union) { fprintf(stream, elementformat, "}", s); fprintf(stream, ";\n"); } fprintf(stream, "// END OF CHOICE\n"); } void Types::gen(const char *URI, const vector& anys) { for (vector::const_iterator any = anys.begin(); any != anys.end(); ++any) gen(URI, *any, NULL, NULL); } void Types::gen(const char *URI, const xs__any& any, const char *minOccurs, const char *maxOccurs) { const char *min = minOccurs; const char *max = maxOccurs; (void)URI; fprintf(stream, "/// @todo \n/// @todo Schema extensibility is user-definable.\n/// Consult the protocol documentation to change or insert declarations.\n/// Use wsdl2h option -x to remove this element.\n/// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element):\n/// wsdl2h maps xsd:any to xsd__anyType, use typemap.dat to remap.\n"); if (!xflag) { if (max && strcmp(max, "1")) { fprintf(stream, "/// Size of the array of XML or DOM nodes is %s..%s.\n", min ? min : "1", max); if (cflag || sflag) { if (!with_union) { fprintf(stream, sizeformat, "int", ""); fprintf(stream, "0;\n"); fprintf(stream, elementformat, pname(true, false, NULL, NULL, "xsd:any"), "__any"); } else fprintf(stream, elementformat, tname(NULL, NULL, "xsd:any"), "__any"); } else if (with_union) fprintf(stream, pointertemplateformat, vname("$CONTAINER"), tname(NULL, NULL, "xsd:any"), "__any"); else fprintf(stream, templateformat, vname("$CONTAINER"), tname(NULL, NULL, "xsd:any"), "__any"); } else fprintf(stream, elementformat, pname(with_union, false, NULL, NULL, "xsd:any"), "__any"); if (dflag) fprintf(stream, "0;\t///< Catch any element content in DOM.\n"); else fprintf(stream, "0;\t///< Catch any element content in XML string.\n"); } } void Types::gen(const char *URI, const xs__anyAttribute& anyAttribute) { (void)URI; if (anyAttribute.namespace_) fprintf(stream, "/// @todo .\n", anyAttribute.namespace_); fprintf(stream, "/// @todo Schema extensibility is user-definable.\n/// Consult the protocol documentation to change or insert declarations.\n/// Use wsdl2h option -x to remove this attribute.\n/// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute).\n"); if (!xflag) { const char *t = tname(NULL, NULL, "xsd:anyAttribute"); fprintf(stream, attributeformat, t, "__anyAttribute"); if (dflag) fprintf(stream, ";\t///< Store anyAttribute content in DOM soap_dom_attribute linked node structure.\n"); else fprintf(stream, ";\t///< A placeholder that has no effect: please see comment.\n"); } } void Types::gen_inh(const char *URI, const xs__complexType *complexType, bool anonymous) { const xs__complexType *p = complexType; if (!p) return; const char *pURI; if (p->schemaPtr()) pURI = p->schemaPtr()->targetNamespace; else pURI = URI; const char *b = cname(NULL, pURI, p->name); if (p->complexContent && p->complexContent->extension) gen_inh(URI, p->complexContent->extension->complexTypePtr(), anonymous); if (cflag || fflag || anonymous) fprintf(stream, "/// INHERITED FROM %s:\n", b); else if (comment_nest == 0) fprintf(stream, "/* INHERITED FROM %s:\n", b); else fprintf(stream, " INHERITED FROM %s:\n", b); comment_nest++; if (cflag || fflag) pURI = URI; // if base ns != derived ns then qualify elts and atts if (p->complexContent && p->complexContent->extension) { if (p->complexContent->extension->group) gen(pURI, *p->complexContent->extension->group, NULL, NULL); if (p->complexContent->extension->all) gen(pURI, *p->complexContent->extension->all, NULL, NULL); if (p->complexContent->extension->sequence) gen(pURI, *p->complexContent->extension->sequence, NULL, NULL); if (p->complexContent->extension->choice) gen(pURI, p->name, *p->complexContent->extension->choice, NULL, NULL); gen(pURI, p->complexContent->extension->attribute); gen(pURI, p->complexContent->extension->attributeGroup); if (p->complexContent->extension->anyAttribute) gen(pURI, *p->complexContent->extension->anyAttribute); } else { if (p->all) gen(pURI, p->all->element, NULL, NULL); else if (p->all) gen(pURI, *p->all, NULL, NULL); else if (p->choice) gen(pURI, p->name, *p->choice, NULL, NULL); else if (p->sequence) gen(pURI, *p->sequence, NULL, NULL); else if (p->any) gen(pURI, *p->any, NULL, NULL); if (p->defaultAttributesApply && p->schemaPtr() && p->schemaPtr()->attributeGroupPtr()) { xs__attributeGroup *a = p->schemaPtr()->attributeGroupPtr(); if (a->attributeGroupPtr()) a = a->attributeGroupPtr(); gen(pURI, a->attribute); gen(pURI, a->attributeGroup); if (a->anyAttribute) gen(pURI, *a->anyAttribute); } gen(pURI, p->attribute); gen(pURI, p->attributeGroup); if (p->anyAttribute) gen(pURI, *p->anyAttribute); } modify(b); comment_nest--; if (cflag || fflag || anonymous) fprintf(stream, "// END OF INHERITED FROM %s\n", b); else if (comment_nest == 0) fprintf(stream, " END OF INHERITED FROM %s */\n", b); else fprintf(stream, " END OF INHERITED FROM %s\n", b); } void Types::gen_soap_array(const char *t, const char *item, const char *type) { char *tmp = NULL, *dims = NULL, size[24]; if (type) tmp = (char*)estrdup(type); *size = '\0'; if (tmp) dims = strrchr(tmp, '['); if (dims) *dims++ = '\0'; fprintf(stream, "/// SOAP encoded array of %s.\n", tmp ? tmp : "xs:anyType"); if (cflag) fprintf(stream, "struct %s\n{\n", t); else if (pflag && *t) fprintf(stream, "class %s : public xsd__anyType\n{ public:\n", t); else fprintf(stream, "class %s\n{ public:\n", t); if (dims) { char *s = strchr(dims, ']'); if (s && s != dims) (SOAP_SNPRINTF(size, 24, 23), "[%d]", (int)(s - dims + 1)); } if (tmp) { if (strchr(tmp, '[') != NULL) { size_t l = strlen(t); if (!strncmp(t, "ArrayOf", 7) && l > 7) gen_soap_array(t + 7, item, tmp); else if (!strncmp(t, "Array", 5) && l > 5) gen_soap_array(t + 5, item, tmp); else gen_soap_array("", item, tmp); fprintf(stream, arrayformat, "}", item ? aname(NULL, NULL, item) : ""); fprintf(stream, ";\n"); } else { const char *s = tname(NULL, NULL, tmp); fprintf(stream, "/// Pointer to array of %s.\n", s); fprintf(stream, arrayformat, s, item ? aname(NULL, NULL, item) : ""); fprintf(stream, ";\n"); } if (*size) fprintf(stream, "/// Size of the multidimensional dynamic array with dimensions=%s.\n", size); else fprintf(stream, "/// Size of the dynamic array.\n"); fprintf(stream, arraysizeformat, "int", size); fprintf(stream, ";\n/// Offset for partially transmitted arrays (uncomment only when required).\n"); fprintf(stream, arrayoffsetformat, "int", size); fprintf(stream, ";\n"); } else { // TODO: how to handle generic SOAP array? E.g. as an array of anyType? fprintf(stream, "// @todo Add declarations to handle generic SOAP-ENC:Array (array of anyType)\n"); } } void Types::gen_substitutions(const char *URI, const xs__element& element) { const std::vector *substitutions; const char *name; const char *r = NULL, *s = NULL, *t = NULL; bool use_union = !uflag; bool wrap_union = false; bool tmp_union; bool abstract = false; if (!URI && element.schemaPtr()) URI = element.schemaPtr()->targetNamespace; if (element.elementPtr()) { name = element.elementPtr()->name; substitutions = element.elementPtr()->substitutionsPtr(); abstract = element.elementPtr()->abstract; if (!abstract && element.elementPtr()->complexTypePtr()) abstract = element.elementPtr()->complexTypePtr()->abstract; } else { name = element.name; substitutions = element.substitutionsPtr(); abstract = element.abstract; if (!abstract && element.complexTypePtr()) abstract = element.complexTypePtr()->abstract; } fprintf(stream, "// BEGIN CHOICE OF SUBSTITUTIONS with global elements"); for (std::vector::const_iterator i1 = substitutions->begin(); i1 != substitutions->end(); ++i1) fprintf(stream, " <%s>", (*i1)->name); fprintf(stream, "\n"); t = uname(URI); s = strstr(t, "__union"); r = aname(NULL, NULL, name); if (element.maxOccurs && strcmp(element.maxOccurs, "1")) { if (with_union) { // Generate a wrapper when we need a union within a union wrap_union = true; fprintf(stream, " struct __%s\n {\n", t); } fprintf(stream, sizeformat, "int", r); fprintf(stream, " %s", element.minOccurs ? element.minOccurs : "0"); if (is_integer(element.maxOccurs)) fprintf(stream, ":%s", element.maxOccurs); fprintf(stream, ";\n"); if (cflag) fprintf(stream, " struct _%s\n {\n", t); else fprintf(stream, " class _%s\n {\n", t); } if (use_union) { if (!with_union || wrap_union) { fprintf(stream, choiceformat, "int", r); if (element.minOccurs) fprintf(stream, " %s", element.minOccurs); fprintf(stream, ";\t///< Union %s selector: set to SOAP_UNION_%s_%s\n", t, t, element.minOccurs && !strcmp(element.minOccurs, "0") ? " or 0 to omit" : ""); if (name) fprintf(stream, "/// Union for substitutionGroup %s.\n", cname(NULL, URI, name)); fprintf(stream, " union %s\n {\n", t); } tmp_union = with_union; with_union = true; } else { tmp_union = fake_union; fake_union = true; } if (!abstract) gen(URI, element, false, NULL, NULL); for (vector::const_iterator i2 = substitutions->begin(); i2 != substitutions->end(); ++i2) gen(URI, *(*i2), true, NULL, NULL); // substitutions can be recursive? if (use_union) { with_union = tmp_union; if (!with_union || wrap_union) { fprintf(stream, elementformat, "}", s[0] == '_' && s[1] == '_' ? s+2 : s); fprintf(stream, ";\n"); } } else fake_union = tmp_union; if (element.maxOccurs && strcmp(element.maxOccurs, "1")) { fprintf(stream, pointerformat, "}", s); fprintf(stream, ";\n"); } if (wrap_union) { fprintf(stream, elementformat, "}", s); fprintf(stream, ";\n"); } fprintf(stream, "// END OF SUBSTITUTIONS\n"); } void Types::document(const xs__annotation *annotation) { if (annotation && annotation->documentation) documentation(annotation->documentation); } void Types::modify(const char *name) { // TODO: consider support removal of elements/attributes with ns__X = $- Y const char *s = modtypemap[name]; if (s) { while (*s) { if (*s++ == '$') fprintf(stream, "/// Member declared in %s\n ", mapfile); s = format(s); } } } const char* Types::format(const char *text) { const char *s = text; if (!s) return NULL; while (*s && *s != '$') { if (*s == '\\') { switch (s[1]) { case 'n': fputc('\n', stream); break; case 't': fputc('\t', stream); break; default: fputc(s[1], stream); } s++; } else fputc(*s, stream); s++; } fputc('\n', stream); return s; } //////////////////////////////////////////////////////////////////////////////// // // Type map file parsing // //////////////////////////////////////////////////////////////////////////////// static char *getline(char *s, size_t n, FILE *fd) { int c; char *t = s; if (n) n--; for (;;) { c = fgetc(fd); if (c == '\r') continue; if (c == '\\') { c = fgetc(fd); if (c == '\r') c = fgetc(fd); if (c < ' ') continue; if (n) { *t++ = '\\'; n--; } } if (c == '\n' || c == EOF) break; if (n) { *t++ = c; n--; } } *t++ = '\0'; if (!*s && c == EOF) return NULL; return s; } static const char *nonblank(const char *s) { while (*s && isspace(*s)) s++; return s; } static const char *fill(char *t, int n, const char *s, int e) { int i = n; s = nonblank(s); while (*s && *s != e && --i) *t++ = *s++; while (*s && *s != e) s++; if (*s) s++; i = n - i; if (i == 0) *t = '\0'; else { while (isspace(*--t) && i--) ; t[1] = '\0'; } return s; } //////////////////////////////////////////////////////////////////////////////// // // Miscellaneous // //////////////////////////////////////////////////////////////////////////////// static const char *utf8(char **t, const char *s, bool start) { unsigned int c = 0; unsigned int c1, c2, c3, c4; const char *r = s; c = (unsigned char)*r; if (c >= 0x80) { c1 = (unsigned char)*++r; if (c1 < 0x80) r--; else { c1 &= 0x3F; if (c < 0xE0) c = ((c & 0x1F) << 6) | c1; else { c2 = (unsigned char)*++r & 0x3F; if (c < 0xF0) c = ((c & 0x0F) << 12) | (c1 << 6) | c2; else { c3 = (unsigned char)*++r & 0x3F; if (c < 0xF8) c = ((c & 0x07) << 18) | (c1 << 12) | (c2 << 6) | c3; else { c4 = (unsigned char)*++r & 0x3F; if (c < 0xFC) c = ((c & 0x03) << 24) | (c1 << 18) | (c2 << 12) | (c3 << 6) | c4; else c = ((c & 0x01) << 30) | (c1 << 24) | (c2 << 18) | (c3 << 12) | (c4 << 6) | (*++r & 0x3F); } } } } } if (Uflag && // Universal character names for identifier characters // E.1 Ranges of characters allowed ( c == 0x00A8 || c == 0x00AA || c == 0x00AD || c == 0x00AF || (0x00B2 <= c && c <= 0x00B5) || (0x00B7 <= c && c <= 0x00BA) || (0x00BC <= c && c <= 0x00BE) || (0x00C0 <= c && c <= 0x00D6) || (0x00D8 <= c && c <= 0x00F6) || (0x00F8 <= c && c <= 0x00FF) || (0x0100 <= c && c <= 0x167F) || (0x1681 <= c && c <= 0x180D) || (0x180F <= c && c <= 0x1FFF) || (0x200B <= c && c <= 0x200D) || (0x202A <= c && c <= 0x202E) || (0x203F <= c && c <= 0x2040) || c == 0x2054 || (0x2060 <= c && c <= 0x206F) || (0x2070 <= c && c <= 0x218F) || (0x2460 <= c && c <= 0x24FF) || (0x2776 <= c && c <= 0x2793) || (0x2C00 <= c && c <= 0x2DFF) || (0x2E80 <= c && c <= 0x2FFF) || (0x3004 <= c && c <= 0x3007) || (0x3021 <= c && c <= 0x302F) || (0x3031 <= c && c <= 0x303F) || (0x3040 <= c && c <= 0xD7FF) || (0xF900 <= c && c <= 0xFD3D) || (0xFD40 <= c && c <= 0xFDCF) || (0xFDF0 <= c && c <= 0xFE44) || (0xFE47 <= c && c <= 0xFFFD) || (0x10000 <= c && c <= 0x1FFFD) || (0x20000 <= c && c <= 0x2FFFD) || (0x30000 <= c && c <= 0x3FFFD) || (0x40000 <= c && c <= 0x4FFFD) || (0x50000 <= c && c <= 0x5FFFD) || (0x60000 <= c && c <= 0x6FFFD) || (0x70000 <= c && c <= 0x7FFFD) || (0x80000 <= c && c <= 0x8FFFD) || (0x90000 <= c && c <= 0x9FFFD) || (0xA0000 <= c && c <= 0xAFFFD) || (0xB0000 <= c && c <= 0xBFFFD) || (0xC0000 <= c && c <= 0xCFFFD) || (0xD0000 <= c && c <= 0xDFFFD) || (0xE0000 <= c && c <= 0xEFFFD) ) && // E.2 Ranges of characters disallowed initially !(start && ( (0x0300 <= c && c <= 0x036F) || (0x1DC0 <= c && c <= 0x1DFF) || (0x20D0 <= c && c <= 0x20FF) || (0xFE20 <= c && c <= 0xFE2F) ) ) ) { soap_strncpy(*t, 7, s, r - s + 1); *t += r - s + 1; } else { // encode up to UCS4 only if (c > 0xFFFF) c = 0xFFFF; (SOAP_SNPRINTF(*t, 7, 6), "_x%4.4x", c); *t += 6; } return r; } static const char *cstring(const char *s) { size_t n; char *t; const char *r; for (n = 0, r = s; *r; n++, r++) if (*r == '"' || *r == '\\') n++; else if (*r < 32) n += 3; r = t = (char*)emalloc(n + 1); for (; *s; s++) { if (*s == '"' || *s == '\\') { *t++ = '\\'; *t++ = *s; } else if (*s < 32) { (SOAP_SNPRINTF(t, 5, 4), "\\%03o", (unsigned int)(unsigned char)*s); t += 4; } else *t++ = *s; } *t = '\0'; return r; } static const char *xstring(const char *s) { size_t n; char *t; const char *r; for (n = 0, r = s; *r; n++, r++) { if (*r < 32 || *r >= 127) n += 4; else if (*r == '<' || *r == '>') n += 3; else if (*r == '&') n += 4; else if (*r == '"') n += 5; else if (*r == '\\') n += 1; } r = t = (char*)emalloc(n + 1); for (; *s; s++) { if (*s < 32 || *s >= 127) { (SOAP_SNPRINTF(t, 5, 4), "&#%.2x;", (unsigned char)*s); t += 5; } else if (*s == '<') { soap_strcpy(t, 5, "<"); t += 4; } else if (*s == '>') { soap_strcpy(t, 5, ">"); t += 4; } else if (*s == '&') { soap_strcpy(t, 6, "&"); t += 5; } else if (*s == '"') { soap_strcpy(t, 7, """); t += 6; } else if (*s == '\\') { soap_strcpy(t, 3, "\\\\"); t += 2; } else *t++ = *s; } *t = '\0'; return r; } static bool is_float(const char *s) { if (*s == '-' || *s == '+') s++; if (!*s || strlen(s) > 20) return false; while (*s && isdigit(*s)) s++; if (*s == '.') s++; while (*s && isdigit(*s)) s++; if (*s == 'e' || *s == 'E') { s++; if (*s == '-' || *s == '+') s++; while (*s && isdigit(*s)) s++; } return *s == '\0'; } static bool is_integer(const char *s) { if (*s == '-' || *s == '+') s++; if (!*s || strlen(s) > 20) return false; while (*s && isdigit(*s)) s++; return *s == '\0'; } static LONG64 to_integer(const char *s) { char *r; return soap_strtoll(s, &r, 10); } static void documentation(const char *text) { const char *s = text; const char *sep = "///
\n/// "; if (!s) return; while (*s) { switch (*s) { case '\n': if (!sep) sep = "\n/// "; break; case '\t': case ' ': if (!sep) sep = " "; break; default: if (*s > 32) { if (sep) { fputs(sep, stream); sep = NULL; } fputc(*s, stream); } } s++; } fprintf(stream, "\n///
\n"); } static void operations(const char *t) { if (cflag) fprintf(stream, "/// struct %s operations:\n/// - soap_default_%s(soap*, %s*) reset members to default\n/// - int soap_read_%s(soap*, %s*) deserialize from a source\n/// - int soap_write_%s(soap*, %s*) serialize to a sink\n/// - %s* soap_dup_%s(soap*, %s* dst, %s *src) returns deep copy of %s src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec)\n/// - soap_del_%s(%s*) deep deletes %s data members, use only on dst after soap_dup_%s(NULL, %s *dst, %s *src) (use soapcpp2 -Ed)\n", t, t, t, t, t, t, t, t, t, t, t, t, t, t, t, t, t, t); else fprintf(stream, "/// class %s operations:\n/// - %s* soap_new_%s(soap*) allocate\n/// - %s* soap_new_%s(soap*, int num) allocate array\n/// - %s* soap_new_req_%s(soap*, ...) allocate, set required members\n/// - %s* soap_new_set_%s(soap*, ...) allocate, set all public members\n/// - %s::soap_default(soap*) reset members to default\n/// - int soap_read_%s(soap*, %s*) deserialize from a stream\n/// - int soap_write_%s(soap*, %s*) serialize to a stream\n/// - %s* %s::soap_dup(soap*) returns deep copy of %s, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec)\n/// - %s::soap_del() deep deletes %s data members, use only after %s::soap_dup(NULL) (use soapcpp2 -Ed)\n", t, t, t, t, t, t, t, t, t, t, t, t, t, t, t, t, t, t, t, t); } //////////////////////////////////////////////////////////////////////////////// // // Allocation // //////////////////////////////////////////////////////////////////////////////// void *emalloc(size_t size) { void *p = malloc(size); if (!p) { fprintf(stderr, "\nError: Malloc failed\n"); exit(1); } return p; } char *estrdup(const char *s) { size_t l = strlen(s); char *t = (char*)emalloc(l + 1); soap_strcpy(t, l + 1, s); return t; } char *estrdupf(const char *s) { char *t = (char*)emalloc(strlen(s) + 1); char *p; for (p = t; *s; s++) { if (s[0] == '/' && s[1] == '*') { for (s += 2; s[0] && s[1]; s++) { if (s[0] == '*' && s[1] == '/') { s++; break; } } continue; } *p++ = *s; } *p = '\0'; return t; } gsoap-2.8.28/gsoap/wsdl/types.h0000644000175000017500000001372612653650160015700 0ustar ellertellert/* types.h WSDL parser and converter to gSOAP header file format -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2012, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #ifndef TYPES_H #define TYPES_H #include "includes.h" #include "wsdlH.h" enum Type { NONE, CLASS, ENUM, STRUCT, TYPEDEF }; enum Lookup { NOLOOKUP, LOOKUP }; class Types { public: SetOfString knames; // keywords, reserved words, class names, and typedefs MapOfStringToString modtypemap; MapOfStringToString deftypemap; MapOfStringToString usetypemap; MapOfStringToString ptrtypemap; MapOfStringToString smptypemap; MapOfPairToString qnames; // (URI,name) -> name MapOfStringToString uris; // URI -> prefix MapOfStringToNum syms; // prefix -> count (ns1, ns2, ...) SetOfString rnames; // reserved symbolic names to avoid clashes SetOfString onames; // service operator names MapOfPairToString enames; // enum symbolic names VectorOfString scope; // de-anonymizer stack int snum; // struct name index, TODO: consider map of URI to count per URI int unum; // union name index, TODO: consider map of URI to count per URI int gnum; // enum name index, TODO: consider map of URI to count per URI bool with_union; bool fake_union; Types(); void init(); int read(const char *file); private: const char *fname(const char *prefix, const char *URI, const char *qname, SetOfString *reserved, enum Lookup lookup, bool isqname); public: const char *aname(const char *prefix, const char *URI, const char *qname); const char *wname(const char *prefix, const char *URI, const char *qname); const char *cname(const char *prefix, const char *URI, const char *qname); const char *tname(const char *prefix, const char *URI, const char *qname); const char *tnameptr(bool, const char *prefix, const char *URI, const char *qname); const char *tnamenoptr(const char *prefix, const char *URI, const char *qname); const char *pname(bool flag, bool smart, const char *prefix, const char *URI, const char *qname); const char *oname(const char *prefix, const char *URI, const char *qname); const char *ename(const char *type, const char *value, bool isqname); const char *sname(const char *URI, const char *name); const char *gname(const char *URI, const char *name); const char *uname(const char *URI); const char *vname(const char *var); const char *nsprefix(const char *prefix, const char *URI); const char *prefix(const char *name); const char *uri(const char *name); const char *deftname(enum Type type, bool mk_pointer, bool is_pointer, const char *prefix, const char *URI, const char *qname); bool is_defined(const char *prefix, const char *URI, const char *qname); bool is_nillable(const xs__element& element); bool is_choicetype(const char *prefix, const char *URI, const char *type); bool is_ptr(const char *prefix, const char *URI, const char *type); void dump(FILE*); void define(const char *URI, const char *name, const xs__complexType&); void gen(const char *URI, const vector&); void gen(const char *URI, const vector&); void gen(const char *URI, const vector&); void gen(const char *URI, const vector&, const char *minOccurs, const char *maxOccurs); void gen(const char *URI, const vector&); void gen(const char *URI, const vector&); void gen(const char *URI, const vector&); void gen(const char *URI, const char *name, const xs__simpleType&, bool anonymous, bool nested_restriction); void gen(const char *URI, const char *name, const xs__complexType&, bool anonymous); void gen(const char *URI, const xs__attribute&); void gen(const char *URI, const xs__all&, const char *minOccurs, const char *maxOccurs); void gen(const char *URI, const xs__seqchoice&, const char *minOccurs, const char *maxOccurs); void gen(const char *URI, const char *name, const xs__seqchoice&, const char *minOccurs, const char *maxOccurs); void gen(const char *URI, const xs__element&, bool substok, const char *minOccurs, const char *maxOccurs); void gen(const char *URI, const xs__group&, const char *minOccurs, const char *maxOccurs); void gen(const char *URI, const xs__any&, const char *minOccurs, const char *maxOccurs); void gen(const char *URI, const xs__anyAttribute&); void gen_inh(const char *URI, const xs__complexType *complexType, bool anonymous); void gen_soap_array(const char *t, const char *item, const char *type); void gen_substitutions(const char *URI, const xs__element &element); void document(const xs__annotation*); void modify(const char *name); const char *format(const char *text); }; #endif gsoap-2.8.28/gsoap/wsdl/wsam.h0000644000175000017500000000417212653650160015476 0ustar ellertellert/* wsam.h WS-Addressing and WS-Addressing Metadata -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2010, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap wsa schema documentation: WS-Addressing //gsoap wsa schema namespace: http://www.w3.org/2005/08/addressing //gsoap wsa schema elementForm: qualified //gsoap wsa schema attributeForm: unqualified //gsoap wsam schema documentation: WS-Addressing Metadata //gsoap wsam schema namespace: http://www.w3.org/2007/05/addressing/metadata //gsoap wsam schema elementForm: qualified //gsoap wsam schema attributeForm: unqualified //gsoap wsaw schema documentation: WS-Addressing WSDL //gsoap wsaw schema namespace: http://www.w3.org/2006/05/addressing/wsdl //gsoap wsaw schema elementForm: qualified //gsoap wsaw schema attributeForm: unqualified class wsa__EndpointReferenceType { public: xsd__anyURI Address; _XML __any; }; gsoap-2.8.28/gsoap/wsdl/wsu.h0000644000175000017500000000320112653650160015335 0ustar ellertellert/* wsu.h WS-Utility (namespace only) -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap wsu schema documentation: WS-Utility //gsoap wsu schema namespace: http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd //gsoap wsu schema elementForm: qualified //gsoap wsu schema attributeForm: unqualified gsoap-2.8.28/gsoap/wsdl/soap.cpp0000644000175000017500000002177612653650160016035 0ustar ellertellert/* soap.cpp WSDL/SOAP binding schema -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "wsdlH.h" // cannot include "schemaH.h" #include "includes.h" extern const char *qname_token(const char*, const char*); extern int is_builtin_qname(const char*); //////////////////////////////////////////////////////////////////////////////// // // soap:header // //////////////////////////////////////////////////////////////////////////////// int soap__header::traverse(wsdl__definitions& definitions) { if (vflag) cerr << " Analyzing soap header in wsdl namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << endl; messageRef = NULL; partRef = NULL; const char *token = qname_token(message, definitions.targetNamespace); if (token) { for (vector::iterator message = definitions.message.begin(); message != definitions.message.end(); ++message) { if ((*message).name && !strcmp((*message).name, token)) { messageRef = &(*message); if (vflag) cerr << " Found soap header part '" << (part?part:"") << "' message '" << (token?token:"") << "'" << endl; break; } } } if (!messageRef) { for (vector::iterator import = definitions.import.begin(); import != definitions.import.end(); ++import) { wsdl__definitions *importdefinitions = (*import).definitionsPtr(); if (importdefinitions) { token = qname_token(message, importdefinitions->targetNamespace); if (token) { for (vector::iterator message = importdefinitions->message.begin(); message != importdefinitions->message.end(); ++message) { if ((*message).name && !strcmp((*message).name, token)) { messageRef = &(*message); if (vflag) cerr << " Found soap header part '" << (part?part:"") << "' message '" << (token?token:"") << "'" << endl; break; } } } } } } if (messageRef) { if (part) { for (vector::iterator pt = messageRef->part.begin(); pt != messageRef->part.end(); ++pt) if ((*pt).name && !strcmp((*pt).name, part)) { partRef = &(*pt); break; } } if (!partRef) cerr << "Warning: soap header has no matching part in message '" << (message?message:"") << "' in wsdl definitions '" << definitions.name << "' namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << endl; } else cerr << "Warning: could not find soap header part '" << (part?part:"") << "' message '" << (message?message:"") << "' in wsdl definitions '" << definitions.name << "' namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << endl; for (vector::iterator i = headerfault.begin(); i != headerfault.end(); ++i) (*i).traverse(definitions); return SOAP_OK; } void soap__header::messagePtr(wsdl__message *message) { messageRef = message; } wsdl__message *soap__header::messagePtr() const { return messageRef; } void soap__header::partPtr(wsdl__part *part) { partRef = part; } wsdl__part *soap__header::partPtr() const { return partRef; } //////////////////////////////////////////////////////////////////////////////// // // soap:headerfault // //////////////////////////////////////////////////////////////////////////////// int soap__headerfault::traverse(wsdl__definitions& definitions) { if (vflag) cerr << " Analyzing soap headerfault in wsdl namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << endl; messageRef = NULL; partRef = NULL; const char *token = qname_token(message, definitions.targetNamespace); if (token) { for (vector::iterator message = definitions.message.begin(); message != definitions.message.end(); ++message) { if ((*message).name && !strcmp((*message).name, token)) { messageRef = &(*message); if (vflag) cerr << " Found soap headerfault part '" << (part?part:"") << "' message '" << (token?token:"") << "'" << endl; break; } } } else { for (vector::iterator import = definitions.import.begin(); import != definitions.import.end(); ++import) { wsdl__definitions *importdefinitions = (*import).definitionsPtr(); if (importdefinitions) { token = qname_token(message, importdefinitions->targetNamespace); if (token) { for (vector::iterator message = importdefinitions->message.begin(); message != importdefinitions->message.end(); ++message) { if ((*message).name && !strcmp((*message).name, token)) { messageRef = &(*message); if (vflag) cerr << " Found soap headerfault part '" << (part?part:"") << "' message '" << (token?token:"") << "'" << endl; break; } } } } } } if (messageRef) { if (part) { for (vector::iterator pt = messageRef->part.begin(); pt != messageRef->part.end(); ++pt) if ((*pt).name && !strcmp((*pt).name, part)) { partRef = &(*pt); break; } } if (!partRef) cerr << "Warning: soap headerfault has no matching part in message '" << (message?message:"") << "' in wsdl definitions '" << definitions.name << "' namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << endl; } else cerr << "Warning: could not find soap headerfault part '" << (part?part:"") << "' message '" << (message?message:"") << "' in wSDL definitions '" << definitions.name << "' namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << endl; return SOAP_OK; } void soap__headerfault::messagePtr(wsdl__message *message) { messageRef = message; } wsdl__message *soap__headerfault::messagePtr() const { return messageRef; } void soap__headerfault::partPtr(wsdl__part *part) { partRef = part; } wsdl__part *soap__headerfault::partPtr() const { return partRef; } //////////////////////////////////////////////////////////////////////////////// // // wsoap:header // //////////////////////////////////////////////////////////////////////////////// int wsoap__header::traverse(wsdl__definitions& definitions) { if (vflag) cerr << " Analyzing soap header in wsdl namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << endl; elementRef = NULL; // WSDL 2.0 if (element) { if (definitions.types) { for (vector::iterator schema = definitions.types->xs__schema_.begin(); schema != definitions.types->xs__schema_.end(); ++schema) { const char *token = qname_token(element, (*schema)->targetNamespace); if (token) { for (vector::iterator element = (*schema)->element.begin(); element != (*schema)->element.end(); ++element) { if ((*element).name && !strcmp((*element).name, token)) { elementRef = &(*element); if (vflag) cerr << " Found soap header element '" << (token?token:"") << "'" << endl; break; } } } } } if (!elementRef) { if (is_builtin_qname(element)) definitions.builtinElement(element); else if (!Wflag) cerr << "Warning: no soap header element '" << element << "' in wsdl definitions '" << (definitions.name?definitions.name:"") << "' namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << endl; } } return SOAP_OK; } void wsoap__header::elementPtr(xs__element *element) { elementRef = element; } xs__element *wsoap__header::elementPtr() const { return elementRef; } gsoap-2.8.28/gsoap/wsdl/README.txt0000644000175000017500000002161512653650160016055 0ustar ellertellertThe gSOAP WSDL parser 'wsdl2h' INSTRUCTIONS The gSOAP WSDL parser converts one or more WSDLs into a gSOAP header file for processing with the gSOAP soapcpp2 compiler to generate client stubs/proxies and server skeletons/objects to access services or build new services. For example: $ wsdl2h -o XMethodsQuery.h http://www.xmethods.net/wsdl/query.wsdl Note: if an error occurs when running wsdl2h, please try again later. The XMethods site is very popular and suffers under load. It may also be the case that XMethods removed certain services. In that case, try another on-line WSDL. This generates the XMethodsQuery.h header file with Web service operations and C++ data types. This header file is intended to be processed with soapcpp2 to generate the stub and/or skeleton code. You need to have stlvector.h present in the current directory (stlvector.h is in the package) to support STL vectors. To build without STL, use option -s: $ wsdl2h -s -o XMethodsQuery.h http://www.xmethods.net/wsdl/query.wsdl Or to build a pure C application, use option -c: $ wsdl2h -c -o XMethodsQuery.h http://www.xmethods.net/wsdl/query.wsdl Other useful options to control the output are -e and -y (see below). The above commands are to be followed by the soapcpp2 compilation phase: $ soapcpp2 -C XMethodsQuery.h Where option -C indicates client-side only files (soapcpp2 generates both client and server stubs and skeletons by default). The generated XMethodsQuery.h includes the definitions of data types and service operations of the XMethods Query Web service. To develop a C++ client application, you can use the generated 'soapXMethodsQuerySoapProxy' class and 'XMethodsQuerySoap.nsmap' XML namespace table to access the Web service. Both need to be '#include'd in your source. Then compile and link the soapC.cpp, soapClient.cpp, and stdsoap2.cpp sources to complete the build. More information on this process can be found in the gSOAP documentation. When parsing a WSDL, the output file name is the WSDL input file name with extension '.h' instead of '.wsdl'. When an input file is absent or a WSDL file from a Web location is accessed, the header output will be produced on the standard output. Input may also consist of schema files, which is useful when you to need to generate code for serializing schema instances. USING A TYPEMAP FILE TO CONTROL THE INPUT AND OUTPUT The typemap.dat is the default file processed by 'wsdl2h' to customize the generated header file output. The default typemap.dat file is located in the 'WS' directory. Use wsdl2h option -t to specify an alternate file. The typemap.dat file can be used to define namespace prefix and type bindings for the generated header files by the 'wsdl2h' tool. XML namespace prefix bindings can be provided to override the default choice of the ns1, ns2, ... prefixes generated by 'wsdl2h'. It is highly recommended to provide namespace prefixes for your project's XML namespaces. In this way, changes to the WSDL (or newer releases of wsdl2h) will have a minimal impact on coding. Bindings for namespace prefixes in typemap.dat are of the form: prefix = "URI" For example, to bind the 'google' prefix to the Google API's namespace: google = "urn:GoogleSearch" Type bindings can by provided to bind XML schema types to C/C++ types for your project. Type bindings are of the form: prefix__type = declaration | use | ptr-use where 'declaration' introduces the type in the header file, 'use' specifies how the type is used directly, 'ptr-use' specifies how the type is used as a pointer type. For example: xsd__string = | char* | char* After enabling this line, all XSD strings will be mapped to char* and since char* is already a pointer type, the 'ptr-use' part is the same as 'use' part. Note that the 'declaration' part is empty in these cases. Member data and functions can be provided to extend a generated struct or class. Class and struct extensions are of the form: prefix__type = $ member-declaration For example, to add a constructor and destructor to class myns__record: myns__record = $ myns__record(); myns__record = $ ~myns__record(); To specify a set of input files in typemap.dat for wsdl2h to process, use '<': < infile1.wsdl < infile2.xsd < http://www.example.com/example.wsdl To specify the default output file, use '>', for example: > example.h Any other material to be included in the generated header file can be provided by enclosing the text within brackets [ and ]. Brackets MUST appear at the start of a new line. For example, to include a note: [ // TODO: Don't forget to bind the namespace prefixes! ] This comment appears as the first line in the generated header file. INPUT FORMATS wsdl2h reads from standard input or the files provided at the command line: wsdl2h [options] [-o outfile.h] [infile1.wsdl infile2.wsdl infile3.xsd ... ] Valid input file formats are .wsdl and .xsd (schema) files. Multiple wsdl and schema files can be given, which results in a consolidated header file with all definitions combined. OUTPUT FORMAT The output file is a gSOAP-formatted header file. The header file syntax is augmented with annotations reflecting WSDL and schema-specific bindings and validation constraints. We suggest the use of Doxygen (www.doxygen.org) to produce documented for the generated header file. However, we STRONGLY recommend user to inspect the generated header file first for warnings and other annotations (which do not appear in Doxygen's output) indicating potential problems. Note that Doxygen's license model does not infinge on your ownership of the generated gSOAP source code output when you purchased a commercial license. COMMAND LINE OPTIONS -a generate indexed struct names for local elements with anonymous types -b bi-directional operations to serve one-way response messages (duplex) -c generate C source code -d use DOM to populate xs:any and xsd:anyType elements -e don't qualify enum names -f generate flat C++ class hierarchy -g generate global top-level element declarations -h display help info -Ipath use path to find files -i don't import (advanced option) -j don't generate SOAP_ENV__Header and SOAP_ENV__Detail definitions -k don't generate SOAP_ENV__Header mustUnderstand qualifiers -l include license information in output -m use xsd.h module to import primitive types -Nname use name for service prefixes to produce a service for each binding -nname use name as the base namespace prefix instead of 'ns' -ofile output to file -P don't create polymorphic types with C++ inheritance from xsd__anyType -p create polymorphic types with C++ inheritance from base xsd__anyType -qname use name for the C++ namespace for all service declarations -rhost[:port[:uid:pwd]] connect via proxy host, port, and proxy credentials -r:uid:pwd connect with authentication credentials (digest auth requires SSL) -R generate REST operations for REST bindings in the WSDL -s don't generate STL code (no std::string and no std::vector) -tfile use type map file instead of the default file typemap.dat -u don't generate unions -v verbose output -W suppress warnings -w always wrap response parameters in a response struct (<=1.1.4 behavior) -x don't generate _XML any/anyAttribute extensibility elements -y generate typedef synonyms for structs and enums -z1 compatibility with 2.7.6e: generate pointer-based arrays -z2 compatibility with 2.7.15: qualify element/attribute referenced members -z3 compatibility with 2.7.16 to 2.8.7: qualify element/attribute references -z4 compatibility up to 2.8.11: don't generate union structs in std::vector -z5 compatibility up to 2.8.15 -z6 compatibility up to 2.8.17 -_ don't generate _USCORE (replace with UNICODE _x005f) infile.wsdl infile.xsd http://www... list of input sources (if none use stdin) DOCUMENTATION See soapdoc2.pdf for documentation. INSTALLATION Use './configure' and 'make' in the root directory, as explained in the installation instructions. To build 'wsdl2h' when autoconf/automake fail, use: make -f MakefileManual ENABLING HTTPS SSL/TLS CONNECTIVITY AND HTTP DIGEST AUTHENTICATION To build 'wsdl2h' with secure features, use: make -f MakefileManual secure If you don't have OpenSSL installed, you cannot build an SSL-secure version of wsdl2h. In that case we recommend downloading the WSDL and schema files for processing with the non-SSL-enabled wsdl2h tool. LICENSE The gSOAP WSDL parser 'wsdl2h' and source code are released under GPL or a commercial license. The commercial license is available from Genivia. Please visit http://genivia.com/Products/gsoap/contract.html COPYRIGHT NOTICE gSOAP XML Web services tools Copyright (C) 2000-2013, Robert van Engelen, Genivia, Inc. All Rights Reserved. gsoap-2.8.28/gsoap/wsdl/service.h0000644000175000017500000001064712653650160016173 0ustar ellertellert/* service.h Service structures -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2014, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #ifndef SERVICE_H #define SERVICE_H #include "includes.h" #include "wsdlH.h" class Message { public: wsdl__message *message; const char *name; const char *URI; soap__styleChoice style; soap__useChoice use; const char *encodingStyle; const char *action; xs__element *element; const char *body_parts; wsdl__part *part; bool mustUnderstand; vector header; vector wheader; mime__multipartRelated *multipartRelated; // MIME mime__content *content; // REST/MIME const char *layout; // DIME const char *documentation; const char *ext_documentation; vector policy; void generate(Types&, const char *sep, bool anonymous, bool remark, bool response, bool optional); }; typedef map MapOfStringToMessage; class Operation { public: const wsdl__operation *operation; const char *prefix; const char *URI; const char *name; const char *mep; // WSDL 2.0 const char *protocol; soap__styleChoice style; const char *parameterOrder; const char *action; const char *input_name; const char *output_name; Message *input; // name, use, and parts Message *output; // name, use, and parts vector infault; vector outfault; const char *documentation; const char *operation_documentation; vector policy; void generate(Types&, Service&); }; class Service { public: const char *prefix; // a gSOAP service has a unique namespace const char *URI; const char *name; // binding name const char *type; // portType const char *transport; // binding transport SetOfString location; // WSDL may specify multiple locations via -> vector operation; MapOfStringToMessage header; MapOfStringToMessage headerfault; MapOfStringToMessage fault; MapOfStringToString service_documentation; MapOfStringToString port_documentation; MapOfStringToString binding_documentation; vector policy; // WS-Policy vector role; // BPEL 2.0 VectorOfString imports; Service(); void generate(Types&); void add_import(const char*); void del_import(const char*); }; typedef map MapOfStringToService; class Definitions { public: Types types; // to process schema type information MapOfStringToService services; // service information gathered bool soap12; int binding_count; Definitions(); void collect(const wsdl__definitions&); void compile(const wsdl__definitions&); private: void analyze(const wsdl__definitions&); void analyze_headers(const wsdl__definitions&, Service*, wsdl__ext_ioput*, wsdl__ext_ioput*); void analyze_faults(const wsdl__definitions&, Service*, Operation*, vector::const_iterator&); Message *analyze_fault(const wsdl__definitions&, Service*, const wsdl__ext_fault&); void generate(); }; #endif gsoap-2.8.28/gsoap/wsdl/bpel.cpp0000644000175000017500000003305612653650160016007 0ustar ellertellert/* bpel.cpp BPEL 2.0 binding schema -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2014, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "wsdlH.h" #include "includes.h" extern const char *qname_token(const char*, const char*); extern int is_builtin_qname(const char*); //////////////////////////////////////////////////////////////////////////////// // // plnk:tRole // //////////////////////////////////////////////////////////////////////////////// plnk__tRole::plnk__tRole() { portTypeRef = NULL; } wsdl__portType *plnk__tRole::portTypePtr() const { return portTypeRef; } int plnk__tRole::traverse(wsdl__definitions& definitions) { const char *token; if (vflag) cerr << " Analyzing BPEL Partner Link tRole" << endl; portTypeRef = NULL; token = qname_token(portType, definitions.targetNamespace); if (token) { for (vector::iterator portType = definitions.portType.begin(); portType != definitions.portType.end(); ++portType) { if ((*portType).name && !strcmp((*portType).name, token)) { portTypeRef = &(*portType); if (vflag) cerr << " Found tRole '" << (name?name:"") << "' portType '" << (token?token:"") << "'" << endl; break; } } // WSDL 2.0 for (vector::iterator i = definitions.interface_.begin(); i != definitions.interface_.end(); ++i) { if ((*i).name && !strcmp((*i).name, token)) { portTypeRef = &(*i); if (vflag) cerr << " Found tRole '" << (name?name:"") << "' interface '" << (token?token:"") << "'" << endl; break; } } } if (!portTypeRef) { for (vector::iterator import = definitions.import.begin(); import != definitions.import.end(); ++import) { wsdl__definitions *importdefinitions = (*import).definitionsPtr(); if (importdefinitions) { token = qname_token(portType, importdefinitions->targetNamespace); if (token) { for (vector::iterator portType = importdefinitions->portType.begin(); portType != importdefinitions->portType.end(); ++portType) { if ((*portType).name && !strcmp((*portType).name, token)) { portTypeRef = &(*portType); if (vflag) cerr << " Found tRole '" << (name?name:"") << "' portType '" << (token?token:"") << "'" << endl; break; } } // WSDL 2.0 for (vector::iterator i = importdefinitions->interface_.begin(); i != importdefinitions->interface_.end(); ++i) { if ((*i).name && !strcmp((*i).name, token)) { portTypeRef = &(*i); if (vflag) cerr << " Found tRole '" << (name?name:"") << "' interface '" << (token?token:"") << "'" << endl; break; } } } } } } if (!portTypeRef) { if (!Wflag) cerr << "Warning: no tRole '" << (name?name:"") << "' portType '" << (portType?portType:"") << "' in wsdl definitions '" << (definitions.name?definitions.name:"") << "' namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << endl; } return SOAP_OK; } void plnk__tRole::plnkPtr(plnk__tPartnerLinkType *plnk) { plnkRef = plnk; } plnk__tPartnerLinkType* plnk__tRole::plnkPtr() const { return plnkRef; } //////////////////////////////////////////////////////////////////////////////// // // plnk:tPartnerLinkType // //////////////////////////////////////////////////////////////////////////////// int plnk__tPartnerLinkType::traverse(wsdl__definitions& definitions) { if (vflag) cerr << " Analyzing BPEL Partner Link Type" << endl; for (vector::iterator i = role.begin(); i != role.end(); ++i) { (*i).plnkPtr(this); (*i).traverse(definitions); } return SOAP_OK; } //////////////////////////////////////////////////////////////////////////////// // // vprop:property // //////////////////////////////////////////////////////////////////////////////// int vprop__tProperty::traverse(wsdl__definitions& definitions) { if (vflag) cerr << " Analyzing BPEL Variable Properties" << endl; if (element && definitions.types) { for (vector::iterator schema = definitions.types->xs__schema_.begin(); schema != definitions.types->xs__schema_.end(); ++schema) { const char *token = qname_token(element, (*schema)->targetNamespace); if (token) { for (vector::iterator element = (*schema)->element.begin(); element != (*schema)->element.end(); ++element) { if ((*element).name && !strcmp((*element).name, token)) { type = (*element).type; if (vflag) cerr << " Found property '" << (name?name:"") << "' element '" << (token?token:"") << "'" << endl; break; } } } } } if (element && !type) { if (is_builtin_qname(element)) definitions.builtinElement(element); else if (!Wflag) cerr << "Warning: no BPEL Variable Properties '" << (name?name:"") << "' element '" << element << "' in wsdl definitions '" << (definitions.name?definitions.name:"") << "' namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << endl; } else if (type) { if (is_builtin_qname(type)) definitions.builtinType(type); } return SOAP_OK; } //////////////////////////////////////////////////////////////////////////////// // // vprop:tPropertyAlias // //////////////////////////////////////////////////////////////////////////////// int vprop__tPropertyAlias::traverse(wsdl__definitions& definitions) { if (vflag) cerr << " Analyzing BPEL Variable Property Alias" << endl; vpropRef = NULL; for (vector::iterator vprop = definitions.vprop__property.begin(); vprop != definitions.vprop__property.end(); ++vprop) { const char *token = qname_token(propertyName, definitions.targetNamespace); if (token && !strcmp((*vprop).name, token)) { vpropRef = &(*vprop); if (vflag) cerr << " Found property alias '" << (propertyName?propertyName:"") << "' variable" << endl; break; } } if (!vpropRef) { for (vector::iterator import = definitions.import.begin(); !vpropRef && import != definitions.import.end(); ++import) { wsdl__definitions *importdefinitions = (*import).definitionsPtr(); if (importdefinitions) { for (vector::iterator vprop = importdefinitions->vprop__property.begin(); vprop != importdefinitions->vprop__property.end(); ++vprop) { const char *token = qname_token(propertyName, importdefinitions->targetNamespace); if (token && !strcmp((*vprop).name, token)) { vpropRef = &(*vprop); if (vflag) cerr << " Found property alias '" << (propertyName?propertyName:"") << "' variable" << endl; break; } } } } } xs__complexType *complexTypeRef = NULL; if (element && definitions.types) { for (vector::iterator schema = definitions.types->xs__schema_.begin(); schema != definitions.types->xs__schema_.end(); ++schema) { const char *token = qname_token(element, (*schema)->targetNamespace); if (token) { for (vector::iterator element = (*schema)->element.begin(); element != (*schema)->element.end(); ++element) { if ((*element).name && !strcmp((*element).name, token)) { if ((*element).type) type = (*element).type; else complexTypeRef = (*element).complexType; if (vflag) cerr << " Found property alias '" << (propertyName?propertyName:"") << "' element '" << (token?token:"") << "'" << endl; break; } } } } } else if (messageType && part) { wsdl__message *messageRef = NULL; const char *token = qname_token(messageType, definitions.targetNamespace); if (token) { for (vector::iterator message = definitions.message.begin(); message != definitions.message.end(); ++message) { if ((*message).name && !strcmp((*message).name, token)) { messageRef = &(*message); if (vflag) cerr << " Found property alias '" << (propertyName?propertyName:"") << "' message '" << (token?token:"") << "'" << endl; break; } } } if (!messageRef) { for (vector::iterator import = definitions.import.begin(); import != definitions.import.end(); ++import) { wsdl__definitions *importdefinitions = (*import).definitionsPtr(); if (importdefinitions) { token = qname_token(messageType, importdefinitions->targetNamespace); if (token) { for (vector::iterator message = importdefinitions->message.begin(); message != importdefinitions->message.end(); ++message) { if ((*message).name && !strcmp((*message).name, token)) { messageRef = &(*message); if (vflag) cerr << " Found property alias '" << (propertyName?propertyName:"") << "' message '" << (token?token:"") << "'" << endl; break; } } } } } } if (messageRef) { for (vector::iterator parti = messageRef->part.begin(); parti != messageRef->part.end(); ++parti) { if ((*parti).name && !strcmp(part, (*parti).name)) { if ((*parti).element && definitions.types) { for (vector::iterator schema = definitions.types->xs__schema_.begin(); schema != definitions.types->xs__schema_.end(); ++schema) { if ((*parti).type) type = (*parti).type; else { token = qname_token((*parti).element, (*schema)->targetNamespace); if (token) { for (vector::iterator element = (*schema)->element.begin(); element != (*schema)->element.end(); ++element) { if ((*element).name && !strcmp((*element).name, token)) { if ((*element).type) type = (*element).type; else complexTypeRef = (*element).complexType; if (vflag) cerr << " Found property alias '" << (propertyName?propertyName:"") << "' element '" << (token?token:"") << "'" << endl; break; } } } } } } } } } } if (type && !complexTypeRef && definitions.types) { for (vector::iterator schema = definitions.types->xs__schema_.begin(); schema != definitions.types->xs__schema_.end(); ++schema) { const char *token = qname_token(type, (*schema)->targetNamespace); if (token) { for (vector::iterator complexType = (*schema)->complexType.begin(); complexType != (*schema)->complexType.end(); ++complexType) { if ((*complexType).name && !strcmp((*complexType).name, token)) { complexTypeRef = &(*complexType); break; } } } } } if (query && query->__mixed && complexTypeRef) { // TODO query is an XPath expression, most often just the name of an element const char *tag = strchr(query->__mixed, ':'); if (tag) ++tag; else tag = query->__mixed; if (complexTypeRef->all) { for (vector::iterator element = complexTypeRef->all->element.begin(); element != complexTypeRef->all->element.end(); ++element) { if ((*element).name && !strcmp((*element).name, tag)) { // element = (*element).name; type = (*element).type; break; } } } else if (complexTypeRef->sequence) { for (vector::iterator content = complexTypeRef->sequence->__contents.begin(); content != complexTypeRef->sequence->__contents.end(); ++content) { if ((*content).__union == SOAP_UNION_xs__union_content_element && (*content).__content.element && (*content).__content.element->name && !strcmp((*content).__content.element->name, tag)) { element = (*content).__content.element->name; type = (*content).__content.element->type; break; } } } } if (element && !type) { if (is_builtin_qname(element)) definitions.builtinElement(element); } else if (type) { if (is_builtin_qname(type)) definitions.builtinType(type); } return SOAP_OK; } vprop__tProperty *vprop__tPropertyAlias::vpropPtr() const { return vpropRef; } gsoap-2.8.28/gsoap/wsdl/mime.cpp0000644000175000017500000000464212653650160016013 0ustar ellertellert/* mime.cpp WSDL/MIME binding schema -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "wsdlH.h" // cannot include "schemaH.h" #include "includes.h" extern const char *qname_token(const char*, const char*); //////////////////////////////////////////////////////////////////////////////// // // mime:multipartRelated // //////////////////////////////////////////////////////////////////////////////// int mime__multipartRelated::traverse(wsdl__definitions& definitions) { if (vflag) cerr << "Analyzing mime multpartRelated " << endl; for (vector::iterator pt = part.begin(); pt != part.end(); ++pt) (*pt).traverse(definitions); return SOAP_OK; } //////////////////////////////////////////////////////////////////////////////// // // mime:part // //////////////////////////////////////////////////////////////////////////////// int mime__part::traverse(wsdl__definitions& definitions) { if (vflag) cerr << "Analyzing mime part " << endl; for (vector::iterator hd = soap__header_.begin(); hd != soap__header_.end(); ++hd) (*hd).traverse(definitions); return SOAP_OK; } gsoap-2.8.28/gsoap/wsdl/mime.h0000644000175000017500000000416412653650160015457 0ustar ellertellert/* mime.h mime and xmime binding schema -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap mime schema documentation: WSDL/MIME binding schema //gsoap mime schema namespace: http://schemas.xmlsoap.org/wsdl/mime/ //gsoap xmime schema documentation: xmime binding schema //gsoap xmime schema namespace: http://www.w3.org/2005/05/xmlmime #import "imports.h" #import "soap.h" class mime__content { public: @xsd__NMTOKEN part; @xsd__string type; }; class mime__part { public: soap__body *soap__body_; std::vector soap__header_; std::vector content; public: int traverse(wsdl__definitions&); }; class mime__multipartRelated { public: std::vector part; public: int traverse(wsdl__definitions&); }; class mime__mimeXml { public: @xsd__NMTOKEN part; }; gsoap-2.8.28/gsoap/wsdl/wsdl2h.cpp0000644000175000017500000004541412653650160016271 0ustar ellertellert/* wsdl2h.cpp WSDL parser, translator, and generator (of the gSOAP header file format) -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2016, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- Build: soapcpp2 -ipwsdl wsdl.h g++ -o wsdl2h wsdl2h.cpp types.cpp service.cpp wsdl.cpp schema.cpp wsdlC.cpp stdsoap2.cpp TODO: Resolve relative versus absolute import paths for reading imported WSDL/schema (use URL local addresses) Do not generate abstract complexTypes, but include defs in derived types Handle simpleType derivation from base64 */ #include "includes.h" #include "types.h" #include "service.h" #ifndef WSDL2H_IMPORT_PATH #define WSDL2H_IMPORT_PATH (NULL) #endif #ifndef WSDL_TYPEMAP_FILE #define WSDL_TYPEMAP_FILE "typemap.dat" #endif static void init(); static void options(int argc, char **argv); int _flag = 0, aflag = 0, bflag = 0, cflag = 0, c11flag = 0, dflag = 0, eflag = 0, fflag = 0, gflag = 0, iflag = 0, jflag = 0, kflag = 0, mflag = 0, pflag = 0, Pflag = 0, Rflag = 0, sflag = 0, uflag = 0, Uflag = 0, vflag = 0, wflag = 0, Wflag = 0, xflag = 0, yflag = 0, zflag = 0; int openfiles = 0; int infiles = 0; char *infile[MAXINFILES], *outfile = NULL, *proxy_host = NULL, *proxy_userid = NULL, *proxy_passwd = NULL, *auth_userid = NULL, *auth_passwd = NULL; const char *mapfile = WSDL_TYPEMAP_FILE, *import_path = WSDL2H_IMPORT_PATH, *cwd_path = NULL, *cppnamespace = NULL; int proxy_port = 8080; FILE *stream = stdout; SetOfString exturis; extern struct Namespace namespaces[]; const char *service_prefix = NULL; const char *schema_prefix = "ns"; const char elementformat[] = " %-35s %-30s"; const char pointerformat[] = " %-35s *%-30s"; const char attributeformat[] = " @%-35s %-30s"; const char templateformat[] = " %s<%-23s> %-30s"; const char pointertemplateformat[] = " %s<%-22s> *%-30s"; const char templateformat_open[] = " %s<%s"; const char attrtemplateformat_open[] = " @%s<%s"; const char arrayformat[] = " %-35s *__ptr%-25s"; const char arraysizeformat[] = " %-35s __size%-24s"; const char arrayoffsetformat[] = "// %-35s __offset%-22s"; const char sizeformat[] = " $%-35s __size%-24s"; const char choiceformat[] = " $%-35s __union%-23s"; const char schemaformat[] = "//gsoap %-5s schema %s:\t%s\n"; const char serviceformat[] = "//gsoap %-4s service %s:\t%s %s\n"; const char paraformat[] = " %-35s%s%s%s"; const char anonformat[] = " %-35s%s_%s%s"; const char copyrightnotice[] = "\n** The gSOAP WSDL/Schema processor for C and C++, wsdl2h release " WSDL2H_VERSION "\n** Copyright (C) 2000-2016 Robert van Engelen, Genivia Inc.\n** All Rights Reserved. This product is provided \"as is\", without any warranty.\n** The wsdl2h tool and its generated software are released under the GPL.\n** ----------------------------------------------------------------------------\n** A commercial use license is available from Genivia Inc., contact@genivia.com\n** ----------------------------------------------------------------------------\n\n"; const char licensenotice[] = "\ --------------------------------------------------------------------------------\n\ gSOAP XML Web services tools\n\ Copyright (C) 2000-2016, Robert van Engelen, Genivia Inc. All Rights Reserved.\n\ The wsdl2h tool and its generated software are released under the GPL.\n\ This software is released under the GPL with the additional exemption that\n\ compiling, linking, and/or using OpenSSL is allowed.\n\ --------------------------------------------------------------------------------\n\ GPL license.\n\ \n\ This program is free software; you can redistribute it and/or modify it under\n\ the terms of the GNU General Public License as published by the Free Software\n\ Foundation; either version 2 of the License, or (at your option) any later\n\ version.\n\ \n\ This program is distributed in the hope that it will be useful, but WITHOUT ANY\n\ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A\n\ PARTICULAR PURPOSE. See the GNU General Public License for more details.\n\ \n\ You should have received a copy of the GNU General Public License along with\n\ this program; if not, write to the Free Software Foundation, Inc., 59 Temple\n\ Place, Suite 330, Boston, MA 02111-1307 USA\n\ \n\ Author contact information:\n\ engelen@genivia.com / engelen@acm.org\n\ \n\ This program is released under the GPL with the additional exemption that\n\ compiling, linking, and/or using OpenSSL is allowed.\n\ --------------------------------------------------------------------------------\n\ A commercial-use license is available from Genivia, Inc., contact@genivia.com\n\ --------------------------------------------------------------------------------\n"; int main(int argc, char **argv) { fprintf(stderr, "%s", copyrightnotice); options(argc, argv); init(); if (cppnamespace) fprintf(stream, "namespace %s {\n", cppnamespace); Definitions def; wsdl__definitions definitions; definitions.read(infiles, infile); if (definitions.error()) { definitions.print_fault(); exit(1); } definitions.traverse(); def.compile(definitions); if (outfile) { fclose(stream); fprintf(stderr, "\nTo finalize code generation, execute:\n> soapcpp2 %s\n", outfile); if (!cflag) fprintf(stderr, "Or to generate C++ proxy and service classes:\n> soapcpp2 -j %s\n", outfile); fprintf(stderr, "\n"); } return 0; } //////////////////////////////////////////////////////////////////////////////// // // Initialization // //////////////////////////////////////////////////////////////////////////////// static void init() { struct Namespace *p = namespaces; if (p) { for (; p->id; p++) { if (p->in && *p->in) exturis.insert(p->in); if (p->ns && *p->ns) exturis.insert(p->ns); } } } //////////////////////////////////////////////////////////////////////////////// // // Parse command line options // //////////////////////////////////////////////////////////////////////////////// static void options(int argc, char **argv) { int i; infiles = 0; openfiles = 0; for (i = 1; i < argc; i++) { char *a = argv[i]; if (*a == '-' #ifdef WIN32 || *a == '/' #endif ) { int g = 1; while (g && *++a) { switch (*a) { case '_': _flag = 1; break; case 'a': aflag = 1; break; case 'b': bflag = 1; break; case 'c': if (a[1] == '+' && a[2] == '+') { a += 2; if (a[1] == '1' && a[2] == '1') { a += 2; c11flag = 1; } cflag = 0; } else { cflag = 1; if (cppnamespace) fprintf(stderr, "wsdl2h: Options -c and -q cannot be used together\n"); } break; case 'd': dflag = 1; break; case 'e': eflag = 1; break; case 'f': fflag = 1; break; case 'g': gflag = 1; break; case 'i': iflag = 1; break; case 'j': jflag = 1; break; case 'k': kflag = 1; break; case 'I': a++; g = 0; if (*a) import_path = a; else if (i < argc && argv[++i]) import_path = argv[i]; else fprintf(stderr, "wsdl2h: Option -I requires a path argument\n"); break; case 'l': fprintf(stderr, "%s", licensenotice); exit(0); break; case 'm': mflag = 1; break; case 'n': a++; g = 0; if (*a) schema_prefix = a; else if (i < argc && argv[++i]) schema_prefix = argv[i]; else fprintf(stderr, "wsdl2h: Option -n requires a prefix name argument\n"); break; case 'N': a++; g = 0; if (*a) service_prefix = a; else if (i < argc && argv[++i]) service_prefix = argv[i]; else fprintf(stderr, "wsdl2h: Option -N requires a prefix name argument\n"); break; case 'o': a++; g = 0; if (*a) outfile = a; else if (i < argc && argv[++i]) outfile = argv[i]; else fprintf(stderr, "wsdl2h: Option -o requires an output file argument\n"); break; case 'p': pflag = 1; break; case 'P': Pflag = 1; break; case 'q': a++; g = 0; if (*a) cppnamespace = a; else if (i < argc && argv[++i]) cppnamespace = argv[i]; else fprintf(stderr, "wsdl2h: Option -q requires a C++ namespace name argument\n"); if (cflag) fprintf(stderr, "wsdl2h: Options -c and -q cannot be used together\n"); break; case 'r': a++; g = 0; if (*a) proxy_host = a; else if (i < argc && argv[++i]) proxy_host = argv[i]; else fprintf(stderr, "wsdl2h: Option -r requires proxy host:port:userid:passwd or :userid:passwd authentication argument\n"); if (proxy_host) { size_t l = strlen(proxy_host); char *s = (char*)emalloc(l + 1); soap_strcpy(s, l + 2, proxy_host); proxy_host = s; s = strchr(proxy_host, ':'); if (s) { *s = '\0'; if (*proxy_host) { proxy_port = soap_strtol(s + 1, &s, 10); if (s && *s == ':') { *s = '\0'; proxy_userid = s + 1; s = strchr(proxy_userid, ':'); if (s && *s == ':') { *s = '\0'; proxy_passwd = s + 1; } } } else { s = proxy_host; proxy_host = NULL; auth_userid = s + 1; s = strchr(auth_userid, ':'); if (s && *s == ':') { *s = '\0'; auth_passwd = s + 1; } } } } break; case 'R': Rflag = 1; break; case 's': sflag = 1; break; case 't': a++; g = 0; if (*a) mapfile = a; else if (i < argc && argv[++i]) mapfile = argv[i]; else fprintf(stderr, "wsdl2h: Option -t requires a type map file argument\n"); break; case 'U': Uflag = 1; break; case 'u': uflag = 1; break; case 'v': vflag = 1; break; case 'w': wflag = 1; break; case 'W': Wflag = 1; break; case 'x': xflag = 1; break; case 'y': yflag = 1; break; case 'z': a++; g = 0; if (*a) zflag = soap_strtol(a, NULL, 10); else if (i < argc && argv[++i]) zflag = soap_strtol(argv[i], NULL, 10); else zflag = 1; break; case '?': case 'h': fprintf(stderr, "Usage: wsdl2h [-a] [-b] [-c|-c++|-c++11] [-d] [-e] [-f] [-g] [-h] [-I path] [-i] [-j] [-k] [-l] [-m] [-N name] [-n name] [-P|-p] [-q name] [-R] [-r proxyhost[:port[:uid:pwd]]] [-r:userid:passwd] [-s] [-t typemapfile] [-U] [-u] [-v] [-w] [-W] [-x] [-y] [-z#] [-_] [-o outfile.h] infile.wsdl infile.xsd http://www... ...\n\n"); fprintf(stderr, "\ -a generate indexed struct names for local elements with anonymous types\n\ -b bi-directional operations (duplex ops) added to serve one-way responses\n\ -c generate C source code\n\ -c++ generate C++ source code (default)\n\ -c++11 generate C++11 source code\n\ -d use DOM to populate xs:any, xs:anyType, and xs:anyAttribute\n\ -e don't qualify enum names\n\ -f generate flat C++ class hierarchy\n\ -g generate global top-level element declarations\n\ -h display help info\n\ -Ipath use path to find files\n\ -i don't import (advanced option)\n\ -j don't generate SOAP_ENV__Header and SOAP_ENV__Detail definitions\n\ -k don't generate SOAP_ENV__Header mustUnderstand qualifiers\n\ -l display license information\n\ -m use xsd.h module to import primitive types\n\ -Nname use name for service prefixes to produce a service for each binding\n\ -nname use name as the base namespace prefix instead of 'ns'\n\ -ofile output to file\n\ -P don't create polymorphic types inherited from xsd__anyType\n\ -p create polymorphic types inherited from base xsd__anyType\n\ -qname use name for the C++ namespace of all declarations\n\ -R generate REST operations for REST bindings in the WSDL\n\ -rhost[:port[:uid:pwd]]\n\ connect via proxy host, port, and proxy credentials\n\ -r:uid:pwd\n\ connect with authentication credentials (digest auth requires SSL)\n\ -s don't generate STL code (no std::string and no std::vector)\n\ -tfile use type map file instead of the default file typemap.dat\n\ -U allow UTF8-encoded Unicode C/C++ identifiers when mapping XML tag names\n\ -u don't generate unions\n\ -v verbose output\n\ -W suppress warnings\n\ -w always wrap response parameters in a response struct (<=1.1.4 behavior)\n\ -x don't generate _XML any/anyAttribute extensibility elements\n\ -y generate typedef synonyms for structs and enums\n\ -z1 compatibility with 2.7.6e: generate pointer-based arrays\n\ -z2 compatibility with 2.7.7 to 2.7.15: qualify element/attribute references\n\ -z3 compatibility with 2.7.16 to 2.8.7: qualify element/attribute references\n\ -z4 compatibility up to 2.8.11: don't generate union structs in std::vector\n\ -z5 compatibility up to 2.8.15\n\ -z6 compatibility up to 2.8.17\n\ -_ don't generate _USCORE (replace with UNICODE _x005f)\n\ infile.wsdl infile.xsd http://www... list of input sources (if none: use stdin)\n\ \n"); exit(0); default: fprintf(stderr, "wsdl2h: Unknown option %s\n", a); exit(1); } } } else { infile[infiles++] = argv[i]; if (infiles >= MAXINFILES) { fprintf(stderr, "wsdl2h: too many files\n"); exit(1); } } } if (infiles) { if (!outfile) { if (strncmp(infile[0], "http://", 7) && strncmp(infile[0], "https://", 8)) { const char *s = strrchr(infile[0], '.'); if (s && (!soap_tag_cmp(s, ".wsdl") || !soap_tag_cmp(s, ".gwsdl") || !soap_tag_cmp(s, ".xsd"))) { outfile = estrdup(infile[0]); outfile[s - infile[0] + 1] = 'h'; outfile[s - infile[0] + 2] = '\0'; } else { size_t l = strlen(infile[0]); outfile = (char*)emalloc(l + 3); soap_strcpy(outfile, l + 3, infile[0]); soap_strcpy(outfile + l, 3, ".h"); } } } if (outfile) { stream = fopen(outfile, "w"); if (!stream) { fprintf(stderr, "Cannot write to %s\n", outfile); exit(1); } fprintf(stderr, "Saving %s\n\n", outfile); } } } //////////////////////////////////////////////////////////////////////////////// // // Namespaces // //////////////////////////////////////////////////////////////////////////////// struct Namespace namespaces[] = { {"SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/", "http://www.w3.org/*/soap-envelope"}, {"SOAP-ENC", "http://schemas.xmlsoap.org/soap/encoding/", "http://www.w3.org/*/soap-encoding"}, {"xsi", "http://www.w3.org/2001/XMLSchema-instance"}, {"xsd", "-"}, // http://www.w3.org/2001/XMLSchema"}, // don't use this, it might conflict with xs {"xml", "http://www.w3.org/XML/1998/namespace"}, {"xs", "http://www.w3.org/2001/XMLSchema", "http://www.w3.org/*/XMLSchema" }, {"vc", "http://www.w3.org/2007/XMLSchema-versioning" }, {"http", "http://schemas.xmlsoap.org/wsdl/http/"}, {"soap", "http://schemas.xmlsoap.org/wsdl/soap/", "http://schemas.xmlsoap.org/wsdl/soap*/"}, {"mime", "http://schemas.xmlsoap.org/wsdl/mime/"}, {"xmime", "http://www.w3.org/2005/05/xmlmime"}, {"dime", "http://schemas.xmlsoap.org/ws/2002/04/dime/wsdl/", "http://schemas.xmlsoap.org/ws/*/dime/wsdl/"}, {"wsdl", "http://schemas.xmlsoap.org/wsdl/", "http://www.w3.org/ns/wsdl"}, {"wsdli", "http://www.w3.org/ns/wsdl-instance"}, {"wsdlx", "http://www.w3.org/ns/wsdl-extensions"}, {"wsoap", "http://www.w3.org/ns/wsdl/soap"}, {"whttp", "http://www.w3.org/ns/wsdl/http"}, {"wrpc", "http://www.w3.org/ns/wsdl/rpc"}, {"wsaw", "http://www.w3.org/2006/05/addressing/wsdl"}, {"gwsdl", "http://www.gridforum.org/namespaces/2003/03/gridWSDLExtensions"}, {"wsa_", "http://www.w3.org/2005/08/addressing"}, {"wsam", "http://www.w3.org/2007/05/addressing/metadata"}, {"wsrmp", "http://schemas.xmlsoap.org/ws/2005/02/rm/policy", "http://docs.oasis-open.org/ws-rx/wsrmp/*"}, {"sp", "http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702", "http://schemas.xmlsoap.org/ws/2005/07/securitypolicy"}, {"wsp_", "http://www.w3.org/ns/ws-policy", "http://schemas.xmlsoap.org/ws/2004/09/policy"}, {"wst_", "http://docs.oasis-open.org/ws-sx/ws-trust/200512"}, {"wsu_", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"}, {"plnk","http://docs.oasis-open.org/wsbpel/2.0/plnktype"}, {"vprop","http://docs.oasis-open.org/wsbpel/2.0/varprop"}, #ifdef WITH_BPEL {"bpel","http://docs.oasis-open.org/wsbpel/2.0/process/executable"}, {"sref","http://docs.oasis-open.org/wsbpel/2.0/serviceref"}, #endif {NULL, NULL} }; gsoap-2.8.28/gsoap/wsdl/includes.h0000644000175000017500000000774312653650160016344 0ustar ellertellert/* includes.h Common project definitions -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2016, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #ifndef INCLUDES_H #define INCLUDES_H #include "stdsoap2.h" #ifdef WITH_OPENSSL #include "httpda.h" #endif #define WSDL2H_VERSION "2.8.28" #ifdef WIN32 # pragma warning(disable : 4996) #endif #include #include #include #include #include using namespace std; struct ltstr { bool operator()(const char *s1, const char *s2) const { return strcmp(s1, s2) < 0; } }; struct eqstr { const char *s; eqstr(const char *s) : s(s) { } bool operator()(const char *t) const { return strcmp(s, t) == 0; } }; typedef set SetOfString; typedef pair Pair; struct ltpair { bool operator()(Pair s1, Pair s2) const { int cmp = strcmp(s1.first, s2.first); if (cmp == 0) cmp = strcmp(s1.second, s2.second); return cmp < 0; } }; typedef map MapOfStringToString; typedef map MapOfPairToString; typedef map MapOfStringToNum; typedef vector VectorOfString; extern int _flag, aflag, bflag, cflag, c11flag, dflag, eflag, fflag, gflag, iflag, jflag, kflag, mflag, pflag, Pflag, Rflag, sflag, Uflag, uflag, vflag, wflag, Wflag, xflag, yflag, zflag; extern FILE *stream; extern SetOfString exturis; #define MAXINFILES (1000) extern int openfiles; extern int infiles; extern char *infile[MAXINFILES], *outfile, *proxy_host, *proxy_userid, *proxy_passwd, *auth_userid, *auth_passwd; extern const char *mapfile, *import_path, *cwd_path, *cppnamespace; extern int proxy_port; extern const char *service_prefix; extern const char *schema_prefix; extern const char elementformat[]; extern const char pointerformat[]; extern const char attributeformat[]; extern const char templateformat_open[]; extern const char attrtemplateformat_open[]; extern const char templateformat[]; extern const char pointertemplateformat[]; extern const char arrayformat[]; extern const char arraysizeformat[]; extern const char arrayoffsetformat[]; extern const char sizeformat[]; extern const char choiceformat[]; extern const char schemaformat[]; extern const char serviceformat[]; extern const char paraformat[]; extern const char anonformat[]; extern const char copyrightnotice[]; extern const char licensenotice[]; extern void *emalloc(size_t size); extern char *estrdup(const char *s); extern char *estrdupf(const char *s); extern void text(const char*); class Types; class Message; class Operation; class Service; class Definitions; #endif gsoap-2.8.28/gsoap/wsdl/Makefile.am0000644000175000017500000000250512653650160016410 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = foreign 1.4 # INCLUDES=-I$(top_srcdir)/gsoap # AM_LDFLAGS=$(INCLUDES) -I$(srcdir) -L$(srcdir) AM_LDFLAGS=-L$(srcdir) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin AM_CPPFLAGS=-I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin SOAP=$(top_builddir)/gsoap/src/soapcpp2$(EXEEXT) SOAP_CPP_LIB=$(top_builddir)/gsoap/$(WSDL2H_SOAP_CPP_LIB) SOAP_CPP_SRC=wsdlC.cpp SOAPHEADER=$(srcdir)/wsdl.h SOAP_FLAGS=-SC -pwsdl -I$(srcdir) -I$(top_srcdir)/gsoap/import BUILT_SOURCES=$(SOAP_CPP_SRC) # WSDL2H_EXTRA_FLAGS=-DWITH_OPENSSL -DWITH_GZIP # defined in configure.in # WSDL2H_EXTRA_LIBS=-lssl -lcrypto -lz # defined in configure.in $(SOAP_CPP_SRC) : $(SOAPHEADER) $(SOAP) $(SOAP_FLAGS) $(SOAPHEADER) #LIBS= bin_PROGRAMS=wsdl2h wsdl2h_CFLAGS=$(C_DEBUG_FLAGS) $(WSDL2H_EXTRA_FLAGS) wsdl2h_CXXFLAGS=$(C_DEBUG_FLAGS) $(WSDL2H_EXTRA_FLAGS) $(WSDL2H_IMPORTPATH) wsdl2h_CPPFLAGS=$(AM_CPPFLAGS) $(SOAPCPP2_NONAMESPACES) -D$(platform) wsdl2h_SOURCES=wsdl2h.cpp wsdl.cpp schema.cpp types.cpp service.cpp soap.cpp mime.cpp wsp.cpp bpel.cpp $(SOAP_CPP_SRC) wsdl2h_LDADD=$(SOAP_CPP_LIB) $(WSDL2H_EXTRA_LIBS) CLEANFILES= *~ *C.cpp *H.h *Stub.h *.nsmap gsoap-2.8.28/gsoap/wsdl/wsdl.cpp0000644000175000017500000020115212653650160016030 0ustar ellertellert/* wsdl.cpp WSDL 1.1 and WSDL 2.0 binding schema implementation -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "wsdlH.h" #include "includes.h" extern struct Namespace namespaces[]; const char *qname_token(const char *QName, const char *URI) { if (QName && QName[0] == '"' && QName[1] == '"' && QName[2] == ':') return QName + 3; if (QName && URI && *QName == '"') // QNames are stored in the format "URI":name, unless the URI is in the nsmap { size_t n = strlen(URI); if (!strncmp(QName + 1, URI, n) && QName[n + 1] == '"') return QName + n + 3; } return NULL; } int is_builtin_qname(const char *QName) { if (iflag) return 1; if (QName) { if (*QName == '#') // reserved QNames return 0; if (*QName != '"') return 1; // if the QName does not start with a ", it must be in the nsmap const char *s = strchr(QName + 1, '"'); if (s) { size_t n = s - QName - 1; for (SetOfString::const_iterator i = exturis.begin(); i != exturis.end(); ++i) if (strlen(*i) == n && !strncmp(QName + 1, *i, n)) return 1; // QName is in exturis } } return 0; } //////////////////////////////////////////////////////////////////////////////// // // wsdl // //////////////////////////////////////////////////////////////////////////////// extern "C" { int warn_ignore(struct soap*, const char*); int show_ignore(struct soap*, const char*); } wsdl__definitions::wsdl__definitions() { soap = soap_new1(SOAP_XML_TREE | SOAP_C_UTFSTRING); #ifdef HTTPDA_H soap_register_plugin(soap, http_da); #endif #ifdef WITH_OPENSSL soap_ssl_client_context(soap, SOAP_SSL_NO_AUTHENTICATION, NULL, NULL, NULL, NULL, NULL); #endif soap_set_namespaces(soap, namespaces); soap_default(soap); if (vflag) soap->fignore = show_ignore; else soap->fignore = warn_ignore; soap->encodingStyle = NULL; soap->proxy_host = proxy_host; soap->proxy_port = proxy_port; soap->proxy_userid = proxy_userid; soap->proxy_passwd = proxy_passwd; name = NULL; targetNamespace = soap_strdup(soap, ""); documentation = NULL; types = NULL; updated = false; location = NULL; redirs = 0; } wsdl__definitions::wsdl__definitions(struct soap *copy) { soap = soap_copy(copy); soap->socket = SOAP_INVALID_SOCKET; soap->recvfd = 0; soap->sendfd = 1; soap_strcpy(soap->host, sizeof(soap->host), copy->host); soap_default(soap); soap->fignore = warn_ignore; soap->encodingStyle = NULL; updated = false; location = NULL; redirs = 0; } wsdl__definitions::wsdl__definitions(struct soap *copy, const char *cwd, const char *loc) { soap = soap_copy(copy); soap->socket = SOAP_INVALID_SOCKET; soap->recvfd = 0; soap->sendfd = 1; soap_strcpy(soap->host, sizeof(soap->host), copy->host); soap_default(soap); soap->fignore = warn_ignore; soap->encodingStyle = NULL; updated = false; location = NULL; redirs = 0; read(cwd, loc); } wsdl__definitions::~wsdl__definitions() { soap_destroy(soap); soap_end(soap); soap_done(soap); free(soap); } int wsdl__definitions::get(struct soap *soap) { (void)soap; return preprocess(); } int wsdl__definitions::read(int num, char **loc) { if (num <= 0) return read((const char*)NULL, (const char*)NULL); if (num == 1) return read((const char*)NULL, loc[0]); wsdl__import im; im.namespace_ = NULL; name = soap_strdup(soap, "WSDL"); targetNamespace = soap_strdup(soap, "");; for (int i = 0; i < num; i++) { im.location = loc[i]; import.push_back(im); } return preprocess(); } int wsdl__definitions::read(const char *cwd, const char *loc) { const char *cwd_temp; if (!cwd) cwd = cwd_path; if (vflag) fprintf(stderr, "\nOpening WSDL/XSD '%s' from '%s'\n", loc ? loc : "(stdin)", cwd ? cwd : "./"); if (loc) { if (soap->recvfd > 2) { soap_end_recv(soap); close(soap->recvfd); soap->recvfd = -1; } else if (soap_valid_socket(soap->socket)) { soap_end_recv(soap); soap_closesock(soap); } #ifdef WITH_OPENSSL if (!strncmp(loc, "http://", 7) || !strncmp(loc, "https://", 8)) #else if (!strncmp(loc, "https://", 8)) { fprintf(stderr, "\nCannot connect to https site: no SSL support, please rebuild wsdl2h with SSL or download the files and rerun wsdl2h\n"); exit(1); } else if (!strncmp(loc, "http://", 7)) #endif { fprintf(stderr, "%*sConnecting to '%s' to retrieve WSDL/XSD...", 2*openfiles, "", loc); location = soap_strdup(soap, loc); if (soap_connect_command(soap, SOAP_GET, location, NULL)) { fprintf(stderr, "\n\nError: connection failed\n"); soap_print_fault(soap, stderr); exit(1); } fprintf(stderr, " connected, receiving...\n"); openfiles++; } else if (cwd && (!strncmp(cwd, "http://", 7) || !strncmp(cwd, "https://", 8))) { size_t l = strlen(cwd) + strlen(loc); location = (char*)soap_malloc(soap, l + 2); soap_strcpy(location, l + 2, cwd); char *s = strrchr(location, '/'); if (s) *s = '\0'; size_t n = strlen(location); soap_strcpy(location + n, l + 2 - n, "/"); ++n; soap_strcpy(location + n, l + 2 - n, loc); fprintf(stderr, "%*sConnecting to '%s' to retrieve '%s'...", 2*openfiles, "", location, loc); if (soap_connect_command(soap, SOAP_GET, location, NULL)) { fprintf(stderr, "\n\nError: connection failed\n"); exit(1); } fprintf(stderr, " connected, receiving...\n"); openfiles++; } else { soap->recvfd = open(loc, O_RDONLY, 0); if (soap->recvfd < 0) { if (cwd) { size_t l = strlen(cwd) + strlen(loc); location = (char*)soap_malloc(soap, l + 2); soap_strcpy(location, l + 2, cwd); char *s = strrchr(location, '/'); #ifdef WIN32 if (!s) s = strrchr(location, '\\'); #endif if (s) *s = '\0'; size_t n = strlen(location); soap_strcpy(location + n, l + 2 - n, "/"); ++n; soap_strcpy(location + n, l + 2 - n, loc); if (!strncmp(location, "file://", 7)) location += 7; soap->recvfd = open(location, O_RDONLY, 0); } if (soap->recvfd < 0 && import_path) { size_t l = strlen(import_path) + strlen(loc); location = (char*)soap_malloc(soap, l + 2); soap_strcpy(location, l + 2, import_path); size_t n = strlen(location); soap_strcpy(location + n, l + 2 - n, "/"); ++n; soap_strcpy(location + n, l + 2 - n, loc); if (!strncmp(location, "file://", 7)) location += 7; soap->recvfd = open(location, O_RDONLY, 0); } if (soap->recvfd < 0) { fprintf(stderr, "\nCannot open '%s'\n", loc); exit(1); } } else location = soap_strdup(soap, loc); fprintf(stderr, "%*sReading '%s'...\n", 2*openfiles, "", location); openfiles++; } } cwd_temp = cwd_path; cwd_path = location; if (!soap_begin_recv(soap)) this->soap_in(soap, "wsdl:", NULL); if (soap->error) { // handle sloppy WSDLs that import schemas at the top level rather than // importing them in if (soap->error == SOAP_TAG_MISMATCH && soap->level == 0) { soap_retry(soap); xs__schema *schema = soap_new_xs__schema(soap); schema->soap_in(soap, "xs:schema", NULL); if (soap->error) { fprintf(stderr, "\nAn error occurred while parsing WSDL or XSD from '%s'\n", loc ? loc : "(stdin)"); soap_print_fault(soap, stderr); if (soap->error < 200) soap_print_fault_location(soap, stderr); exit(1); } name = NULL; targetNamespace = schema->targetNamespace; if (vflag) cerr << "Found schema '" << (targetNamespace ? targetNamespace : "(null)") << "' when expecting WSDL" << endl; types = soap_new_wsdl__types(soap); types->documentation = NULL; types->xs__schema_.push_back(schema); types->preprocess(*this); } // check HTTP redirect (socket was closed) else if ((soap->error >= 301 && soap->error <= 303) || soap->error == 307) { int r = SOAP_ERR; fprintf(stderr, "Redirected to '%s'...\n", soap->endpoint); if (redirs++ < 10) r = read(cwd, soap->endpoint); else fprintf(stderr, "\nMax redirects exceeded\n"); redirs--; return r; } else if (soap->error == 401) { int r = SOAP_ERR; fprintf(stderr, "Authenticating to '%s' realm '%s'...\n", loc, soap->authrealm); if (auth_userid && auth_passwd && redirs++ < 1) { #ifdef HTTPDA_H struct http_da_info info; http_da_save(soap, &info, soap->authrealm, auth_userid, auth_passwd); #else soap->userid = auth_userid; soap->passwd = auth_passwd; #endif r = read(cwd, loc); #ifdef HTTPDA_H http_da_release(soap, &info); #endif redirs--; } else fprintf(stderr, "Authentication failed, use option -r:uid:pwd and (re)build with OpenSSL to enable digest authentication\n"); return r; } else { fprintf(stderr, "\nAn error occurred while parsing WSDL from '%s'\n", loc ? loc : "(stdin)"); soap_print_fault(soap, stderr); if (soap->error < 200) soap_print_fault_location(soap, stderr); exit(1); } } openfiles--; fprintf(stderr, "%*sDone reading '%s'\n", 2*openfiles, "", loc ? loc : "(stdin)"); soap_end_recv(soap); if (soap->recvfd > 2) { close(soap->recvfd); soap->recvfd = -1; } else soap_closesock(soap); cwd_path = cwd_temp; return SOAP_OK; } int wsdl__definitions::preprocess() { if (vflag) cerr << "Preprocessing wsdl definitions '" << (location ? location : "(null)") << "' namespace '" << (targetNamespace ? targetNamespace : "(null)") << "'" << endl; // process import for (vector::iterator im1 = import.begin(); im1 != import.end(); ++im1) (*im1).preprocess(*this); // merge nested imported WSDLs into single import list again: for (vector::iterator im2 = import.begin(); im2 != import.end(); ++im2) { if ((*im2).definitionsPtr()) { for (vector::iterator i = (*im2).definitionsPtr()->import.begin(); i != (*im2).definitionsPtr()->import.end(); ++i) { if ((*i).definitionsPtr()) { bool found = false; if (vflag) cerr << "Import WSDL '" << ((*i).location ? (*i).location : "(null)") << endl; for (vector::iterator j = import.begin(); j != import.end(); ++j) { if ((*i).definitionsPtr() == (*j).definitionsPtr() || ((*i).location && (*j).location && !strcmp((*i).location, (*j).location))) { found = true; break; } } if (!found) { if (vflag) cerr << "Adding imported WSDL '" << ((*i).location ? (*i).location : "(null)") << "' to '" << (location ? location : "(null)") << "' ('" << (name ? name : "(null)") << "') namespace '" << (targetNamespace ? targetNamespace : "(null)") << "'" << endl; import.push_back(*i); goto again; } } } } } // merge for (vector::iterator im3 = import.begin(); im3 != import.end(); ++im3) { if ((*im3).definitionsPtr() && (*im3).definitionsPtr()->types) { if (!types) { types = soap_new_wsdl__types(soap); types->soap_default(soap); } // merge , check for duplicates, add namespaces for sloppy imports for (vector::const_iterator i = (*im3).definitionsPtr()->types->xs__schema_.begin(); i != (*im3).definitionsPtr()->types->xs__schema_.end(); ++i) { bool found = false; vector::const_iterator j; if (!(*i)->targetNamespace) { (*i)->targetNamespace = targetNamespace; if (!Wflag) cerr << "\nWarning: schema imported without namespace, assigning namespace '" << (targetNamespace ? targetNamespace : "(null)") << "'" << endl; } for (j = types->xs__schema_.begin(); j != types->xs__schema_.end(); ++j) { if ((*j)->targetNamespace && !strcmp((*i)->targetNamespace, (*j)->targetNamespace)) { found = true; break; } } // add new schema only if not already in , otherwise merge schema components if (found) { if (vflag) cerr << "\nSchemas with identical namespace '" << ((*i)->targetNamespace ? (*i)->targetNamespace : "(null)") << "' merged in WSDL '" << (name ? name : "(null)") << "' namespace '" << (targetNamespace ? targetNamespace : "(null)") << "'" << endl; (*j)->insert(*(*i)); } else { if (vflag) cerr << "Adding schema with namespace '" << ((*i)->targetNamespace ? (*i)->targetNamespace : "(null)") << "' to types in WSDL '" << (name ? name : "(null)") << "' namespace '" << (targetNamespace ? targetNamespace : "(null)") << "'" << endl; types->xs__schema_.push_back(*i); } } // make imported WSDL point to merged (*im3).definitionsPtr()->types = types; } } // process the types if (types) types->preprocess(*this); return SOAP_OK; } int wsdl__definitions::traverse() { if (updated) return SOAP_OK; if (vflag) cerr << "Analyzing definitions '" << (name ? name : "(null)") << "' in wsdl namespace '" << (targetNamespace ? targetNamespace : "(null)") << "'" << endl; updated = true; if (!targetNamespace) { if (vflag) cerr << "\nWarning: wsdl '" << (name ? name : "(null)") << "' has no targetNamespace" << endl; targetNamespace = soap_strdup(soap, ""); } // process import first for (vector::iterator im = import.begin(); im != import.end(); ++im) (*im).traverse(*this); // then process the types if (types) types->traverse(*this); // process messages before portType for (vector::iterator mg = message.begin(); mg != message.end(); ++mg) (*mg).traverse(*this); // process portType before binding for (vector::iterator pt = portType.begin(); pt != portType.end(); ++pt) (*pt).traverse(*this); // process interface before binding WSDL 2.0 for (vector::iterator in = interface_.begin(); in != interface_.end(); ++in) (*in).traverse(*this); // process binding for (vector::iterator bg = binding.begin(); bg != binding.end(); ++bg) (*bg).traverse(*this); // process service for (vector::iterator sv = service.begin(); sv != service.end(); ++sv) (*sv).traverse(*this); if (vflag) cerr << "End of definitions '" << (name ? name : "(null)") << "' namespace '" << (targetNamespace ? targetNamespace : "(null)") << "'" << endl; for (std::vector::iterator wsp = wsp__Policy_.begin(); wsp != wsp__Policy_.end(); ++wsp) (*wsp).traverse(*this); for (std::vector::iterator plt = plnk__partnerLinkType.begin(); plt != plnk__partnerLinkType.end(); ++plt) (*plt).traverse(*this); for (std::vector::iterator vp = vprop__property.begin(); vp != vprop__property.end(); ++vp) (*vp).traverse(*this); for (std::vector::iterator vpa = vprop__propertyAlias.begin(); vpa != vprop__propertyAlias.end(); ++vpa) (*vpa).traverse(*this); return SOAP_OK; } const char *wsdl__definitions::sourceLocation() { return location; } int wsdl__definitions::error() { return soap->error; } bool wsdl__definitions::is_updated() { return updated; } void wsdl__definitions::print_fault() { soap_print_fault(soap, stderr); if (soap->error < 200) soap_print_fault_location(soap, stderr); } void wsdl__definitions::builtinType(const char *type) { builtinTypeSet.insert(type); } void wsdl__definitions::builtinTypes(const SetOfString& types) { for (SetOfString::const_iterator tp = types.begin(); tp != types.end(); ++tp) builtinTypeSet.insert(*tp); } void wsdl__definitions::builtinElement(const char *element) { builtinElementSet.insert(element); } void wsdl__definitions::builtinElements(const SetOfString& elements) { for (SetOfString::const_iterator el = elements.begin(); el != elements.end(); ++el) builtinElementSet.insert(*el); } void wsdl__definitions::builtinAttribute(const char *attribute) { builtinAttributeSet.insert(attribute); } void wsdl__definitions::builtinAttributes(const SetOfString& attributes) { for (SetOfString::const_iterator at = attributes.begin(); at != attributes.end(); ++at) builtinAttributeSet.insert(*at); } const SetOfString& wsdl__definitions::builtinTypes() const { return builtinTypeSet; } const SetOfString& wsdl__definitions::builtinElements() const { return builtinElementSet; } const SetOfString& wsdl__definitions::builtinAttributes() const { return builtinAttributeSet; } int wsdl__service::traverse(wsdl__definitions& definitions) { if (vflag) cerr << "Analyzing service '" << (name ? name : "(null)") << "' in wsdl namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << endl; // process ports for (vector::iterator pt = port.begin(); pt != port.end(); ++pt) (*pt).traverse(definitions); for (vector::iterator ep = endpoint.begin(); ep != endpoint.end(); ++ep) (*ep).traverse(definitions); for (vector::iterator py = wsp__Policy_.begin(); py != wsp__Policy_.end(); ++py) (*py).traverse(definitions); for (vector::iterator pr = wsp__PolicyReference_.begin(); pr != wsp__PolicyReference_.end(); ++pr) (*pr).traverse(definitions); return SOAP_OK; } wsdl__port::wsdl__port() { bindingRef = NULL; } int wsdl__port::traverse(wsdl__definitions& definitions) { if (vflag) cerr << " Analyzing service port/endpoint in wsdl namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << endl; // search binding name const char *token = qname_token(binding, definitions.targetNamespace); bindingRef = NULL; if (token) { for (vector::iterator binding = definitions.binding.begin(); binding != definitions.binding.end(); ++binding) { if ((*binding).name && !strcmp((*binding).name, token)) { bindingRef = &(*binding); if (vflag) cerr << " Found port/endpoint '" << (name ? name : "(null)") << "' binding '" << (token ? token : "(null)") << "'" << endl; break; } } } if (!bindingRef) { for (vector::iterator import = definitions.import.begin(); import != definitions.import.end(); ++import) { wsdl__definitions *importdefinitions = (*import).definitionsPtr(); if (importdefinitions) { token = qname_token(binding, importdefinitions->targetNamespace); if (token) { for (vector::iterator binding = importdefinitions->binding.begin(); binding != importdefinitions->binding.end(); ++binding) { if ((*binding).name && !strcmp((*binding).name, token)) { bindingRef = &(*binding); if (vflag) cerr << " Found port/endpoint '" << (name ? name : "(null)") << "' binding '" << (token ? token : "(null)") << "'" << endl; break; } } } } } } if (!bindingRef) if (!Wflag) cerr << "\nWarning: no port/endpoint '" << (name ? name : "(null)") << "' binding '" << (binding ? binding : "(null)") << "' in wsdl definitions '" << (definitions.name ? definitions.name : "(null)") << "' namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << endl; if (wsp__Policy_) wsp__Policy_->traverse(definitions); if (wsp__PolicyReference_) wsp__PolicyReference_->traverse(definitions); return SOAP_OK; } void wsdl__port::bindingPtr(wsdl__binding *binding) { bindingRef = binding; if (!bindingRef && vflag) cerr << "\nWarning: wsdl__port binding set to NULL" << endl; } wsdl__binding *wsdl__port::bindingPtr() const { return bindingRef; } wsdl__binding::wsdl__binding() { portTypeRef = NULL; } int wsdl__binding::traverse(wsdl__definitions& definitions) { const char *token; if (vflag) cerr << " Analyzing binding '" << (name ? name : "(null)") << "' in wsdl namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << endl; portTypeRef = NULL; if (interface_) // WSDL 2.0 token = qname_token(interface_, definitions.targetNamespace); else token = qname_token(type, definitions.targetNamespace); if (token) { for (vector::iterator portType = definitions.portType.begin(); portType != definitions.portType.end(); ++portType) { if ((*portType).name && !strcmp((*portType).name, token)) { portTypeRef = &(*portType); if (vflag) cerr << " Found binding '" << (name ? name : "(null)") << "' portType '" << (token ? token : "(null)") << "'" << endl; break; } } // WSDL 2.0 for (vector::iterator i = definitions.interface_.begin(); i != definitions.interface_.end(); ++i) { if ((*i).name && !strcmp((*i).name, token)) { portTypeRef = &(*i); if (vflag) cerr << " Found binding '" << (name ? name : "(null)") << "' interface '" << (token ? token : "(null)") << "'" << endl; break; } } } if (!portTypeRef) { for (vector::iterator import = definitions.import.begin(); import != definitions.import.end(); ++import) { wsdl__definitions *importdefinitions = (*import).definitionsPtr(); if (importdefinitions) { if (interface_) // WSDL 2.0 token = qname_token(interface_, importdefinitions->targetNamespace); else token = qname_token(type, importdefinitions->targetNamespace); if (token) { for (vector::iterator portType = importdefinitions->portType.begin(); portType != importdefinitions->portType.end(); ++portType) { if ((*portType).name && !strcmp((*portType).name, token)) { portTypeRef = &(*portType); if (vflag) cerr << " Found binding '" << (name ? name : "(null)") << "' portType '" << (token ? token : "(null)") << "'" << endl; break; } } // WSDL 2.0 for (vector::iterator i = importdefinitions->interface_.begin(); i != importdefinitions->interface_.end(); ++i) { if ((*i).name && !strcmp((*i).name, token)) { portTypeRef = &(*i); if (vflag) cerr << " Found binding '" << (name ? name : "(null)") << "' interface '" << (token ? token : "(null)") << "'" << endl; break; } } } } } } if (!portTypeRef) { if (!Wflag) { if (interface_) cerr << "\nWarning: no binding '" << (name ? name : "(null)") << "' interface '" << (interface_ ? interface_ : "(null)") << "' in wsdl definitions '" << (definitions.name ? definitions.name : "(null)") << "' namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << endl; else cerr << "\nWarning: no binding '" << (name ? name : "(null)") << "' portType '" << (type ? type : "(null)") << "' in wsdl definitions '" << (definitions.name ? definitions.name : "(null)") << "' namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << endl; } } // WSDL 2.0 for (vector::iterator f = fault.begin(); f != fault.end(); ++f) (*f).traverse(definitions, portTypeRef); for (vector::iterator i = operation.begin(); i != operation.end(); ++i) (*i).traverse(definitions, portTypeRef); for (vector::iterator p = wsp__Policy_.begin(); p != wsp__Policy_.end(); ++p) (*p).traverse(definitions); for (vector::iterator r = wsp__PolicyReference_.begin(); r != wsp__PolicyReference_.end(); ++r) (*r).traverse(definitions); return SOAP_OK; } void wsdl__binding::portTypePtr(wsdl__portType *portType) { portTypeRef = portType; if (!portTypeRef && vflag) cerr << "\nWarning: wsdl__binding portType set to NULL" << endl; } wsdl__portType *wsdl__binding::portTypePtr() const { return portTypeRef; } wsdl__ext_operation::wsdl__ext_operation() { operationRef = NULL; } int wsdl__ext_operation::traverse(wsdl__definitions& definitions, wsdl__portType *portTypeRef) { if (vflag) cerr << " Analyzing binding operation '" << (name ? name : ref ? ref : "(null)") << "' in wsdl namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << endl; if (input) input->traverse(definitions); if (output) output->traverse(definitions); for (vector::iterator f = fault.begin(); f != fault.end(); ++f) (*f).traverse(definitions, portTypeRef); // WSDL 2.0 for (vector::iterator fi = infault.begin(); fi != infault.end(); ++fi) (*fi).traverse(definitions, portTypeRef); for (vector::iterator fo = outfault.begin(); fo != outfault.end(); ++fo) (*fo).traverse(definitions, portTypeRef); operationRef = NULL; if (portTypeRef) { // WSDL 2.0, assumption: ref refers to an operation in the interface for this binding const char *token = NULL; if (ref) token = qname_token(ref, portTypeRef->definitionsPtr()->targetNamespace); for (vector::iterator i = portTypeRef->operation.begin(); i != portTypeRef->operation.end(); ++i) { if (token) { if ((*i).name && !strcmp((*i).name, token)) { operationRef = &(*i); if (vflag) cerr << " Found operation '" << token << "' in interface '" << portTypeRef->name << "'" << endl; break; } } else if (name && (*i).name && !strcmp((*i).name, name)) { if ((!input || !input->name || ((*i).__union1 == SOAP_UNION_wsdl__union_ioput_input && (*i).__ioput1.input->name && !strcmp((*i).__ioput1.input->name, input->name)) || ((*i).__union2 == SOAP_UNION_wsdl__union_ioput_input && (*i).__ioput2.input->name && !strcmp((*i).__ioput2.input->name, input->name)) ) && (!output || !output->name || ((*i).__union1 == SOAP_UNION_wsdl__union_ioput_output && (*i).__ioput1.output->name && !strcmp((*i).__ioput1.output->name, output->name)) || ((*i).__union2 == SOAP_UNION_wsdl__union_ioput_output && (*i).__ioput2.output->name && !strcmp((*i).__ioput2.output->name, output->name)) )) { operationRef = &(*i); if (vflag) cerr << " Found operation '" << name << "' in portType '" << portTypeRef->name << "'" << endl; break; } } } if (name && !operationRef) { for (vector::iterator j = portTypeRef->operation.begin(); j != portTypeRef->operation.end(); ++j) { if ((*j).name && !strcmp((*j).name, name)) { if (input && input->name && (((*j).__union1 == SOAP_UNION_wsdl__union_ioput_input && (*j).__ioput1.input->name && !strcmp((*j).__ioput1.input->name, input->name)) || ((*j).__union2 == SOAP_UNION_wsdl__union_ioput_input && (*j).__ioput2.input->name && !strcmp((*j).__ioput2.input->name, input->name)) )) cerr << "\nWarning: no matching portType operation input name '" << input->name << "' in wsdl definitions '" << (definitions.name ? definitions.name : "(null)") << "' namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << endl; if (output && output->name && (((*j).__union1 == SOAP_UNION_wsdl__union_ioput_output && (*j).__ioput1.output->name && !strcmp((*j).__ioput1.output->name, output->name)) || ((*j).__union2 == SOAP_UNION_wsdl__union_ioput_output && (*j).__ioput2.output->name && !strcmp((*j).__ioput2.output->name, output->name)) )) cerr << "\nWarning: no matching portType operation output name '" << output->name << "' in wsdl definitions '" << (definitions.name ? definitions.name : "(null)") << "' namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << endl; operationRef = &(*j); if (vflag) cerr << " Found operation '" << name << "'" << endl; break; } } } } if (!operationRef) { if (!Wflag) { if (ref) cerr << "\nWarning: no matching interface operation '" << (ref ? ref : "(null)") << "' in wsdl definitions '" << (definitions.name ? definitions.name : "(null)") << "' namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << endl; else cerr << "\nWarning: no matching portType operation '" << (name ? name : "(null)") << "' in wsdl definitions '" << (definitions.name ? definitions.name : "(null)") << "' namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << endl; } } else { for (vector::iterator i = fault.begin(); i != fault.end(); ++i) { if ((*i).name) { for (vector::iterator j = operationRef->fault.begin(); j != operationRef->fault.end(); ++j) { if ((*j).name && !strcmp((*j).name, (*i).name)) { (*i).faultPtr(&(*j)); if (vflag) cerr << " Found fault '" << (*j).name << "' message" << endl; break; } } } else if ((*i).soap__fault_ && (*i).soap__fault_->name) // try the soap:fault name, this is not elegant, but neither is WSDL 1.1 { for (vector::iterator j = operationRef->fault.begin(); j != operationRef->fault.end(); ++j) { if ((*j).name && !strcmp((*j).name, (*i).soap__fault_->name)) { (*i).faultPtr(&(*j)); if (vflag) cerr << " Found fault '" << ((*j).name ? (*j).name : "(null)") << "' message" << endl; break; } } } if (!(*i).faultPtr()) if (!Wflag) cerr << "\nWarning: no soap:fault '" << ((*i).name ? (*i).name : "(null)") << "' message in wsdl definitions '" << (definitions.name ? definitions.name : "(null)") << "' operation '" << (name ? name : "(null)") << "' namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << endl; } } if (wsp__Policy_) wsp__Policy_->traverse(definitions); if (wsp__PolicyReference_) wsp__PolicyReference_->traverse(definitions); return SOAP_OK; } void wsdl__ext_operation::operationPtr(wsdl__operation *operation) { operationRef = operation; if (!operationRef && vflag) cerr << "\nWarning: wsdl__ext_operation operation set to NULL" << endl; } wsdl__operation *wsdl__ext_operation::operationPtr() const { return operationRef; } int wsdl__ext_ioput::traverse(wsdl__definitions& definitions) { if (vflag) cerr << " Analyzing binding operation input/output in wsdl namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << endl; for (vector::iterator hd = soap__header_.begin(); hd != soap__header_.end(); ++hd) (*hd).traverse(definitions); for (vector::iterator whd = wsoap__header_.begin(); whd != wsoap__header_.end(); ++whd) (*whd).traverse(definitions); if (mime__multipartRelated_) mime__multipartRelated_->traverse(definitions); if (wsp__Policy_) wsp__Policy_->traverse(definitions); if (wsp__PolicyReference_) wsp__PolicyReference_->traverse(definitions); return SOAP_OK; } wsdl__ext_fault::wsdl__ext_fault() { faultRef = NULL; } int wsdl__ext_fault::traverse(wsdl__definitions& definitions, wsdl__portType *portTypeRef) { if (vflag) cerr << " Analyzing binding operation fault in wsdl namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << endl; if (ref && portTypeRef) { // WSDL 2.0, assumption: ref refers to a fault in the interface for this binding const char *token = qname_token(ref, portTypeRef->definitionsPtr()->targetNamespace); if (token) { for (vector::iterator fault = portTypeRef->fault.begin(); fault != portTypeRef->fault.end(); ++fault) { if ((*fault).name && !strcmp((*fault).name, token)) { faultRef = &(*fault); if (vflag) cerr << " Found fault '" << (*fault).name << endl; break; } } } if (!faultRef) if (!Wflag) cerr << "\nWarning: no fault '" << (ref ? ref : "(null)") << "' in wsdl definitions '" << (definitions.name ? definitions.name : "(null)") << "' interface '" << (portTypeRef->name ? portTypeRef->name : "(null)") << "' namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << endl; } if (wsp__Policy_) wsp__Policy_->traverse(definitions); if (wsp__PolicyReference_) wsp__PolicyReference_->traverse(definitions); return SOAP_OK; } void wsdl__ext_fault::faultPtr(wsdl__fault *fault) { faultRef = fault; if (!faultRef && vflag) cerr << "\nWarning: wsdl__ext_fault fault ref set to NULL" << endl; } wsdl__fault *wsdl__ext_fault::faultPtr() const { return faultRef; } wsdl__portType::wsdl__portType() { definitionsRef = NULL; } int wsdl__portType::traverse(wsdl__definitions& definitions) { if (vflag) cerr << " Analyzing portType/interface '" << (name ? name : "(null)") << "' in wsdl namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << endl; definitionsRef = &definitions; // traverse faults before operations, WSDL 2.0 for (vector::iterator f = fault.begin(); f != fault.end(); ++f) (*f).traverse(definitions); for (vector::iterator i = operation.begin(); i != operation.end(); ++i) (*i).traverse(definitions); if (wsp__Policy_) wsp__Policy_->traverse(definitions); if (wsp__PolicyReference_) wsp__PolicyReference_->traverse(definitions); return SOAP_OK; } void wsdl__portType::definitionsPtr(wsdl__definitions *definitions) { definitionsRef = definitions; } wsdl__definitions *wsdl__portType::definitionsPtr() const { return definitionsRef; } int wsdl__operation::traverse(wsdl__definitions& definitions) { if (vflag) cerr << " Analyzing portType/interface operation '" << (name ? name : "(null)") << "' in wsdl namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << endl; if (__union1 == SOAP_UNION_wsdl__union_ioput_input) if (__ioput1.input) __ioput1.input->traverse(definitions); if (__union1 == SOAP_UNION_wsdl__union_ioput_output) if (__ioput1.output) __ioput1.output->traverse(definitions); if (__union2 == SOAP_UNION_wsdl__union_ioput_input) if (__ioput2.input) __ioput2.input->traverse(definitions); if (__union2 == SOAP_UNION_wsdl__union_ioput_output) if (__ioput2.output) __ioput2.output->traverse(definitions); for (vector::iterator i = fault.begin(); i != fault.end(); ++i) (*i).traverse(definitions); // WSDL 2.0 for (vector::iterator fi = infault.begin(); fi != infault.end(); ++fi) (*fi).traverse(definitions); for (vector::iterator fo = outfault.begin(); fo != outfault.end(); ++fo) (*fo).traverse(definitions); if (wsp__Policy_) wsp__Policy_->traverse(definitions); if (wsp__PolicyReference_) wsp__PolicyReference_->traverse(definitions); return SOAP_OK; } wsdl__ioput::wsdl__ioput() { messageRef = NULL; elementRef = NULL; } int wsdl__ioput::traverse(wsdl__definitions& definitions) { if (vflag) cerr << " Analyzing portType/interface operation input/output in wsdl namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << endl; messageRef = NULL; elementRef = NULL; // WSDL 2.0 if (element) { if (definitions.types) { for (vector::iterator schema = definitions.types->xs__schema_.begin(); schema != definitions.types->xs__schema_.end(); ++schema) { const char *token = qname_token(element, (*schema)->targetNamespace); if (token) { for (vector::iterator element = (*schema)->element.begin(); element != (*schema)->element.end(); ++element) { if ((*element).name && !strcmp((*element).name, token)) { elementRef = &(*element); if (vflag) cerr << " Found input/output '" << (messageLabel ? messageLabel : "(null)") << "' element '" << (token ? token : "(null)") << "'" << endl; break; } } } } } if (*element != '#' && !elementRef) { if (is_builtin_qname(element)) definitions.builtinElement(element); else if (!Wflag) cerr << "\nWarning: no input/output '" << (messageLabel ? messageLabel : "(null)") << "' element '" << element << "' in wsdl definitions '" << (definitions.name ? definitions.name : "(null)") << "' namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << endl; } } else { const char *token = qname_token(message, definitions.targetNamespace); if (token) { for (vector::iterator message = definitions.message.begin(); message != definitions.message.end(); ++message) { if ((*message).name && !strcmp((*message).name, token)) { messageRef = &(*message); if (vflag) cerr << " Found input/output '" << (name ? name : "(null)") << "' message '" << (token ? token : "(null)") << "'" << endl; break; } } } if (!messageRef) { for (vector::iterator import = definitions.import.begin(); import != definitions.import.end(); ++import) { wsdl__definitions *importdefinitions = (*import).definitionsPtr(); if (importdefinitions) { token = qname_token(message, importdefinitions->targetNamespace); if (token) { for (vector::iterator message = importdefinitions->message.begin(); message != importdefinitions->message.end(); ++message) { if ((*message).name && !strcmp((*message).name, token)) { messageRef = &(*message); if (vflag) cerr << " Found input/output '" << (name ? name : "(null)") << "' message '" << (token ? token : "(null)") << "'" << endl; break; } } } } } } if (!messageRef) if (!Wflag) cerr << "\nWarning: no input/output '" << (name ? name : "(null)") << "' message '" << (message ? message : "(null)") << "' in wsdl definitions '" << (definitions.name ? definitions.name : "(null)") << "' namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << endl; } if (wsp__Policy_) wsp__Policy_->traverse(definitions); if (wsp__PolicyReference_) wsp__PolicyReference_->traverse(definitions); return SOAP_OK; } void wsdl__ioput::messagePtr(wsdl__message *message) { messageRef = message; } wsdl__message *wsdl__ioput::messagePtr() const { return messageRef; } void wsdl__ioput::elementPtr(xs__element *element) { elementRef = element; } xs__element *wsdl__ioput::elementPtr() const { return elementRef; } wsdl__fault::wsdl__fault() { messageRef = NULL; elementRef = NULL; } int wsdl__fault::traverse(wsdl__definitions& definitions) { if (vflag) cerr << " Analyzing portType/interface operation faults in wsdl namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << endl; messageRef = NULL; elementRef = NULL; // WSDL 2.0 if (ref) { const char *token = qname_token(ref, definitions.targetNamespace); if (token) { for (vector::iterator i = definitions.interface_.begin(); i != definitions.interface_.end(); ++i) { for (vector::iterator fault = (*i).fault.begin(); fault != (*i).fault.end(); ++fault) { if ((*fault).name && !strcmp((*fault).name, token)) { elementRef = (*fault).elementPtr(); if (vflag) cerr << " Found fault '" << (ref ? ref : "(null)") << "' element '" << (token ? token : "(null)") << "'" << endl; break; } } } } if (!elementRef) { for (vector::iterator import = definitions.import.begin(); import != definitions.import.end(); ++import) { wsdl__definitions *importdefinitions = (*import).definitionsPtr(); if (importdefinitions) { token = qname_token(message, importdefinitions->targetNamespace); if (token) { for (vector::iterator i = importdefinitions->interface_.begin(); i != importdefinitions->interface_.end(); ++i) { for (vector::iterator fault = (*i).fault.begin(); fault != (*i).fault.end(); ++fault) { if ((*fault).name && !strcmp((*fault).name, token)) { elementRef = (*fault).elementPtr(); if (vflag) cerr << " Found fault '" << (ref ? ref : "(null)") << "' element '" << (token ? token : "(null)") << "'" << endl; break; } } } } } } } if (!elementRef) { if (is_builtin_qname(element)) definitions.builtinElement(element); else if (!Wflag) cerr << "\nWarning: no fault '" << (messageLabel ? messageLabel : "(null)") << "' ref '" << ref << "' in wsdl definitions '" << (definitions.name ? definitions.name : "(null)") << "' namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << endl; } } else if (element) { if (definitions.types) { for (vector::iterator schema = definitions.types->xs__schema_.begin(); schema != definitions.types->xs__schema_.end(); ++schema) { const char *token = qname_token(element, (*schema)->targetNamespace); if (token) { for (vector::iterator element = (*schema)->element.begin(); element != (*schema)->element.end(); ++element) { if ((*element).name && !strcmp((*element).name, token)) { elementRef = &(*element); if (vflag) cerr << " Found fault '" << (messageLabel ? messageLabel : "(null)") << "' element '" << (token ? token : "(null)") << "'" << endl; break; } } } } } if (!elementRef) { if (is_builtin_qname(element)) definitions.builtinElement(element); else if (!Wflag) cerr << "\nWarning: no fault '" << (messageLabel ? messageLabel : "(null)") << "' element '" << element << "' in wsdl definitions '" << (definitions.name ? definitions.name : "(null)") << "' namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << endl; } } else { const char *token = qname_token(message, definitions.targetNamespace); if (token) { for (vector::iterator message = definitions.message.begin(); message != definitions.message.end(); ++message) { if ((*message).name && !strcmp((*message).name, token)) { messageRef = &(*message); if (vflag) cerr << " Found operation fault '" << (name ? name : "(null)") << "' message '" << (token ? token : "(null)") << "'" << endl; break; } } } if (!messageRef) { for (vector::iterator import = definitions.import.begin(); import != definitions.import.end(); ++import) { wsdl__definitions *importdefinitions = (*import).definitionsPtr(); if (importdefinitions) { token = qname_token(message, importdefinitions->targetNamespace); if (token) { for (vector::iterator message = importdefinitions->message.begin(); message != importdefinitions->message.end(); ++message) { if ((*message).name && !strcmp((*message).name, token)) { messageRef = &(*message); if (vflag) cerr << " Found operation fault '" << (name ? name : "(null)") << "' message '" << (token ? token : "(null)") << "'" << endl; break; } } } } } } if (!messageRef) if (!Wflag) cerr << "\nWarning: no operation fault '" << (name ? name : "(null)") << "' message '" << (message ? message : "(null)") << "' in wsdl definitions '" << (definitions.name ? definitions.name : "(null)") << "' namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << endl; } if (wsp__Policy_) wsp__Policy_->traverse(definitions); if (wsp__PolicyReference_) wsp__PolicyReference_->traverse(definitions); return SOAP_OK; } void wsdl__fault::messagePtr(wsdl__message *message) { messageRef = message; } wsdl__message *wsdl__fault::messagePtr() const { return messageRef; } void wsdl__fault::elementPtr(xs__element *element) { elementRef = element; } xs__element *wsdl__fault::elementPtr() const { return elementRef; } int wsdl__message::traverse(wsdl__definitions& definitions) { if (vflag) cerr << " Analyzing message '" << (name ? name : "(null)") << "' in wsdl namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << endl; for (vector::iterator i = part.begin(); i != part.end(); ++i) (*i).traverse(definitions); for (vector::iterator p = wsp__Policy_.begin(); p != wsp__Policy_.end(); ++p) (*p).traverse(definitions); for (vector::iterator r = wsp__PolicyReference_.begin(); r != wsp__PolicyReference_.end(); ++r) (*r).traverse(definitions); return SOAP_OK; } wsdl__part::wsdl__part() { elementRef = NULL; simpleTypeRef = NULL; complexTypeRef = NULL; } int wsdl__part::traverse(wsdl__definitions& definitions) { if (vflag) cerr << " Analyzing message parts in wsdl namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << endl; elementRef = NULL; simpleTypeRef = NULL; complexTypeRef = NULL; if (definitions.types) { for (vector::iterator schema = definitions.types->xs__schema_.begin(); schema != definitions.types->xs__schema_.end(); ++schema) { const char *token = qname_token(element, (*schema)->targetNamespace); if (token) { for (vector::iterator el = (*schema)->element.begin(); el != (*schema)->element.end(); ++el) { if ((*el).name && !strcmp((*el).name, token)) { elementRef = &(*el); if (vflag) cerr << " Found message part '" << (name ? name : "(null)") << "' element '" << (token ? token : "(null)") << "'" << endl; break; } } } token = qname_token(type, (*schema)->targetNamespace); if (token) { for (vector::iterator st = (*schema)->simpleType.begin(); st != (*schema)->simpleType.end(); ++st) { if ((*st).name && !strcmp((*st).name, token)) { simpleTypeRef = &(*st); if (vflag) cerr << " Found message part '" << (name ? name : "(null)") << "' simpleType '" << (token ? token : "(null)") << "'" << endl; break; } } } token = qname_token(type, (*schema)->targetNamespace); if (token) { for (vector::iterator ct = (*schema)->complexType.begin(); ct != (*schema)->complexType.end(); ++ct) { if ((*ct).name && !strcmp((*ct).name, token)) { complexTypeRef = &(*ct); if (vflag) cerr << " Found message part '" << (name ? name : "(null)") << "' complexType '" << (token ? token : "(null)") << "'" << endl; break; } } } } } if (!elementRef && !simpleTypeRef && !complexTypeRef) { if (element) { if (is_builtin_qname(element)) definitions.builtinElement(element); else if (!Wflag) cerr << "\nWarning: no message part '" << (name ? name : "(null)") << "' element '" << element << "' in wsdl definitions '" << (definitions.name ? definitions.name : "(null)") << "' namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << endl; } else if (type) { if (is_builtin_qname(type)) definitions.builtinType(type); else if (!Wflag) cerr << "\nWarning: no message part '" << (name ? name : "(null)") << "' type '" << type << "' in wsdl definitions '" << (definitions.name ? definitions.name : "(null)") << "' namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << endl; } else if (!Wflag) cerr << "\nWarning: no message part '" << (name ? name : "(null)") << "' element or type in wsdl definitions '" << (definitions.name ? definitions.name : "(null)") << "' namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << endl; } return SOAP_OK; } void wsdl__part::elementPtr(xs__element *element) { elementRef = element; if (!elementRef && vflag) cerr << "\nWarning: wsdl__part element set to NULL" << endl; } void wsdl__part::simpleTypePtr(xs__simpleType *simpleType) { simpleTypeRef = simpleType; if (!simpleTypeRef && vflag) cerr << "\nWarning: wsdl__part simpleType set to NULL" << endl; } void wsdl__part::complexTypePtr(xs__complexType *complexType) { complexTypeRef = complexType; if (!complexTypeRef && vflag) cerr << "\nWarning: wsdl__part complexType set to NULL" << endl; } xs__element *wsdl__part::elementPtr() const { return elementRef; } xs__simpleType *wsdl__part::simpleTypePtr() const { return simpleTypeRef; } xs__complexType *wsdl__part::complexTypePtr() const { return complexTypeRef; } int wsdl__types::preprocess(wsdl__definitions& definitions) { if (vflag) cerr << "Preprocessing wsdl types" << endl; if (xs__schema_.empty()) // WSDL 2.0 w/o { targetNamespace = definitions.targetNamespace; xs__schema_.push_back(this); } again: // link imported schemas, need to repeat when is extended with new imported schema (from inside another schema, etc.) for (vector::iterator schema1 = xs__schema_.begin(); schema1 != xs__schema_.end(); ++schema1) { for (vector::iterator import = (*schema1)->import.begin(); import != (*schema1)->import.end(); ++import) { if ((*import).namespace_ && !(*import).schemaPtr()) { for (vector::const_iterator schema2 = xs__schema_.begin(); schema2 != xs__schema_.end(); ++schema2) { if (schema2 != schema1 && (*schema2)->targetNamespace && !strcmp((*import).namespace_, (*schema2)->targetNamespace)) { (*import).schemaPtr(*schema2); break; } } } } } // if a schema is imported but not in then get it for (vector::iterator schema2 = xs__schema_.begin(); schema2 != xs__schema_.end(); ++schema2) { for (vector::iterator import = (*schema2)->import.begin(); import != (*schema2)->import.end(); ++import) { bool found = false; if ((*import).schemaPtr()) found = true; if (vflag) cerr << "Preprocessing schema '" << (*schema2)->targetNamespace << "' import '" << ((*import).namespace_ ? (*import).namespace_ : "(null)") << "'" << endl; if (!found && (*import).namespace_) { for (SetOfString::const_iterator i = exturis.begin(); i != exturis.end(); ++i) { if (!soap_tag_cmp((*import).namespace_, *i)) { found = true; break; } } } if (!found && !iflag) // don't import any of the schemas in the .nsmap table (or when -i option is used) { xs__schema *importschema; importschema = (*import).schemaPtr(); if (!importschema) { const char *s = (*import).schemaLocation; if (!s) s = (*import).namespace_; if (!s) continue; importschema = new xs__schema(definitions.soap, (*schema2)->sourceLocation(), s); if (!(*import).namespace_) { if (importschema->targetNamespace) (*import).namespace_ = importschema->targetNamespace; else (*import).namespace_ = soap_strdup(definitions.soap, ""); } if (!importschema->targetNamespace || !*importschema->targetNamespace) importschema->targetNamespace = (*import).namespace_; else if ((*import).namespace_ && strcmp(importschema->targetNamespace, (*import).namespace_)) cerr << "Schema import namespace '" << ((*import).namespace_ ? (*import).namespace_ : "(null)") << "' does not correspond to imported namespace '" << importschema->targetNamespace << "'" << endl; for (vector::const_iterator schema3 = xs__schema_.begin(); schema3 != xs__schema_.end(); ++schema3) { if ((*schema3)->targetNamespace && !strcmp((*import).namespace_, (*schema3)->targetNamespace)) { (*import).schemaPtr(*schema3); if ((*schema3) == this || // WSDL 2.0 has no FormDefaults (*schema3)->empty()) // schema w/o components, only imports { (*schema3)->elementFormDefault = importschema->elementFormDefault; (*schema3)->attributeFormDefault = importschema->attributeFormDefault; } (*schema3)->insert(*importschema); // merge content goto again; } } } if (importschema) { (*import).schemaPtr(importschema); xs__schema_.push_back(importschema); if (vflag) cerr << "Adding schema '" << importschema->targetNamespace << "'" << endl; goto again; } } } } if (vflag) { for (vector::iterator schema4 = xs__schema_.begin(); schema4 != xs__schema_.end(); ++schema4) { cerr << endl << "Schema " << ((*schema4)->targetNamespace ? (*schema4)->targetNamespace : "") << " " << ((*schema4)->sourceLocation() ? (*schema4)->sourceLocation() : "") << endl; for (vector::iterator im = (*schema4)->import.begin(); im != (*schema4)->import.end(); ++im) cerr << " import " << ((*im).namespace_ ? (*im).namespace_ : "") << " " << ((*im).schemaLocation ? (*im).schemaLocation : "") << endl; for (vector::iterator st = (*schema4)->simpleType.begin(); st != (*schema4)->simpleType.end(); ++st) cerr << " simpleType " << ((*st).name ? (*st).name : "") << endl; for (vector::iterator ct = (*schema4)->complexType.begin(); ct != (*schema4)->complexType.end(); ++ct) cerr << " complexType " << ((*ct).name ? (*ct).name : "") << endl; for (vector::iterator el = (*schema4)->element.begin(); el != (*schema4)->element.end(); ++el) cerr << " element " << ((*el).name ? (*el).name : "") << endl; for (vector::iterator at = (*schema4)->attribute.begin(); at != (*schema4)->attribute.end(); ++at) cerr << " attribute " << ((*at).name ? (*at).name : "") << endl; } } return SOAP_OK; } int wsdl__types::traverse(wsdl__definitions& definitions) { if (vflag) cerr << " Analyzing types in wsdl namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << endl; for (vector::iterator schema3 = xs__schema_.begin(); schema3 != xs__schema_.end(); ++schema3) { // artificially extend the of each schema to include others so when we traverse schemas we can resolve references for (vector::iterator importschema = xs__schema_.begin(); importschema != xs__schema_.end(); ++importschema) { if (schema3 != importschema && (*importschema)->targetNamespace) { xs__import *import = soap_new_xs__import(definitions.soap); import->namespace_ = (*importschema)->targetNamespace; import->schemaPtr(*importschema); (*schema3)->import.push_back(*import); } } // check and report for (vector::iterator import = (*schema3)->import.begin(); import != (*schema3)->import.end(); ++import) { if ((*import).namespace_) { bool found = false; for (vector::const_iterator importschema = xs__schema_.begin(); importschema != xs__schema_.end(); ++importschema) { if ((*importschema)->targetNamespace && !strcmp((*import).namespace_, (*importschema)->targetNamespace)) { found = true; break; } } if (!found && vflag) cerr << "Schema import namespace '" << (*import).namespace_ << "' refers to an unknown Schema" << endl; } else if (!Wflag) cerr << "\nWarning: schema import '" << ((*import).schemaLocation ? (*import).schemaLocation : "") << "' has no namespace" << endl; } } // traverse the schemas for (vector::iterator schema4 = xs__schema_.begin(); schema4 != xs__schema_.end(); ++schema4) (*schema4)->traverse(); // find all built-in types, elements, and attributes for (vector::iterator schema5 = xs__schema_.begin(); schema5 != xs__schema_.end(); ++schema5) { if (vflag) for (SetOfString::const_iterator i = (*schema5)->builtinTypes().begin(); i != (*schema5)->builtinTypes().end(); ++i) cerr << " Built-in schema type '" << (*i) << "'" << endl; definitions.builtinTypes((*schema5)->builtinTypes()); definitions.builtinElements((*schema5)->builtinElements()); definitions.builtinAttributes((*schema5)->builtinAttributes()); } return SOAP_OK; } int wsdl__import::preprocess(wsdl__definitions& definitions) { static map included; bool found = false; if (vflag) cerr << "Preprocess wsdl import '" << (location ? location : "(null)") << "'" << endl; definitionsRef = NULL; if (namespace_) { for (SetOfString::const_iterator i = exturis.begin(); i != exturis.end(); ++i) { if (!soap_tag_cmp(namespace_, *i)) { found = true; break; } } } if (!found && location) { map::iterator i = included.find(location); if (i != included.end()) { if (vflag) fprintf(stderr, "\nWSDL/XSD '%s' already imported\n", location); found = true; definitionsRef = (*i).second; } } if (!found && location) { // parse imported definitions const char *source = definitions.sourceLocation(); if (vflag) cerr << "Importing '" << location << "' into '" << (source ? source : "(source location not set)") << "'" << endl; definitionsRef = new wsdl__definitions(definitions.soap); if (!definitionsRef) return SOAP_EOF; included[location] = definitionsRef; definitionsRef->read(source, location); if (!namespace_) namespace_ = definitionsRef->targetNamespace; else if (!definitionsRef->targetNamespace || !*definitionsRef->targetNamespace) definitionsRef->targetNamespace = namespace_; else if (strcmp(namespace_, definitionsRef->targetNamespace)) cerr << "Error: wsdl definitions/import '" << location << "' namespace '" << namespace_ << "' does not match imported targetNamespace '" << definitionsRef->targetNamespace << "'" << endl; } else if (!location) cerr << "\nWarning: wsdl definitions/import has no location attribute" << endl; return SOAP_OK; } int wsdl__import::traverse(wsdl__definitions& definitions) { if (definitionsRef) { if (vflag) cerr << " Analyzing imported wsdl namespace '" << (namespace_ ? namespace_ : "(null)") << "' in wsdl namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << endl; if (!definitionsRef->targetNamespace) { if (namespace_) definitionsRef->targetNamespace = namespace_; else definitionsRef->targetNamespace = definitions.targetNamespace; } return definitionsRef->traverse(); } return SOAP_OK; } void wsdl__import::definitionsPtr(wsdl__definitions *definitions) { definitionsRef = definitions; if (!definitionsRef && vflag) cerr << "\nWarning: wsdl__import definitions set to NULL" << endl; } wsdl__definitions *wsdl__import::definitionsPtr() const { return definitionsRef; } wsdl__import::wsdl__import() { definitionsRef = NULL; } //////////////////////////////////////////////////////////////////////////////// // // streams // //////////////////////////////////////////////////////////////////////////////// ostream &operator<<(ostream &o, const wsdl__definitions &e) { if (!e.soap) { struct soap soap; soap_init2(&soap, SOAP_IO_DEFAULT, SOAP_XML_TREE | SOAP_C_UTFSTRING); soap_set_namespaces(&soap, namespaces); e.soap_serialize(&soap); soap_begin_send(&soap); e.soap_out(&soap, "wsdl:definitions", 0, NULL); soap_end_send(&soap); soap_destroy(&soap); soap_end(&soap); soap_done(&soap); } else { ostream *os = e.soap->os; e.soap->os = &o; e.soap_serialize(e.soap); soap_begin_send(e.soap); e.soap_out(e.soap, "wsdl:definitions", 0, NULL); soap_end_send(e.soap); e.soap->os = os; } return o; } istream &operator>>(istream &i, wsdl__definitions &e) { if (!e.soap) { e.soap = soap_new1(SOAP_XML_TREE | SOAP_C_UTFSTRING); soap_set_namespaces(e.soap, namespaces); } istream *is = e.soap->is; e.soap->is = &i; if (soap_begin_recv(e.soap) || !e.soap_in(e.soap, "wsdl:", NULL) || soap_end_recv(e.soap)) { // handle error? Note: e.soap->error is set and app should check } e.soap->is = is; return i; } //////////////////////////////////////////////////////////////////////////////// // // Miscellaneous // //////////////////////////////////////////////////////////////////////////////// extern "C" { int warn_ignore(struct soap *soap, const char *tag) { // We don't warn if the omitted element was an annotation or a documentation in an unexpected place if (soap->mustUnderstand) fprintf(stderr, "Error: element '%s' at level %d must be understood\n", tag, soap->level); if (!Wflag && soap_match_tag(soap, tag, "xs:annotation") && soap_match_tag(soap, tag, "xs:documentation") && soap_match_tag(soap, tag, "xs:appinfo")) fprintf(stderr, "\nWarning: unexpected element '%s' at level %d is skipped (safe to ignore)\n", tag, soap->level); if (soap->body && !soap_string_in(soap, 0, -1, -1, NULL)) return soap->error; return SOAP_OK; } int show_ignore(struct soap *soap, const char *tag) { warn_ignore(soap, tag); soap_print_fault_location(soap, stderr); return SOAP_OK; } } // end extern "C" gsoap-2.8.28/gsoap/wsdl/sp.h0000644000175000017500000000436712653650160015157 0ustar ellertellert/* sp.h WS-SecurityPolicy 1.2 binding schemas -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2010, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap sp schema documentation: WS-SecurityPolicy binding //gsoap sp schema namespace: http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702 // 1.1 //gsoap sp schema namespace: http://schemas.xmlsoap.org/ws/2005/07/securitypolicy //gsoap sp schema elementForm: qualified //gsoap sp schema attributeForm: unqualified #import "imports.h" #import "wsam.h" #import "wst.h" class sp__Header { public: @xsd__NCName Name; @xsd__anyURI Namespace; }; class sp__Parts { public: xsd__string Body; std::vector Header; xsd__string Attachments; }; class sp__Elements { public: @xsd__anyURI XPathVersion; std::vector XPath; }; class sp__Token : public wsp__Assertion { public: @xsd__anyURI IncludeToken; wsa__EndpointReferenceType *Issuer; xsd__anyURI IssuerName; wst__Claims *wst__Claims_; }; gsoap-2.8.28/gsoap/wsdl/dime.h0000644000175000017500000000320712653650160015443 0ustar ellertellert/* dime.h WSDL/DIME binding schema -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap dime schema documentation: WSDL/DIME binding schema //gsoap dime schema namespace: http://schemas.xmlsoap.org/ws/2002/04/dime/wsdl/ #import "imports.h" class dime__message { public: @xsd__anyURI layout; // @xsd__boolean wsdl__required; }; gsoap-2.8.28/gsoap/wsdl/http.h0000644000175000017500000000371312653650160015506 0ustar ellertellert/* http.h WSDL/HTTP binding schema interface -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2012, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap http schema documentation: WSDL 1.1 HTTP binding schema //gsoap http schema namespace: http://schemas.xmlsoap.org/wsdl/http/ //gsoap whttp schema documentation: WSDL 2.0 HTTP binding schema //gsoap whttp schema namespace: http://www.w3.org/ns/wsdl/http #import "imports.h" class http__address { public: @xsd__anyURI location; }; class http__binding { public: @xsd__NMTOKEN verb; }; class http__operation { public: @xsd__anyURI location; }; class whttp__header { public: @xsd__string name; @xsd__QName type; @xsd__boolean required = false; }; gsoap-2.8.28/gsoap/plugin/0000755000175000017500000000000012653650150014676 5ustar ellertellertgsoap-2.8.28/gsoap/plugin/httpdatest.h0000644000175000017500000000421612653650150017236 0ustar ellertellert/* httpdatest.h gSOAP HTTP Digest Authentication example application. gSOAP XML Web services tools Copyright (C) 2000-2005, Robert van Engelen, Genivia, Inc., All Rights Reserved. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2005, Robert van Engelen, Genivia, Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- Compile: soapcpp2 -c httpdatest.h cc -DWITH_OPENSSL -o httpdatest httpdatest.c soapC.c soapClient.c soapServer.c httpda.c md5evp.c threads.c stdsoap2.c -lssl -lcrypto -lz */ int ns__echoString(char *arg, struct ns__echoString*); gsoap-2.8.28/gsoap/plugin/httpmd5test.c0000644000175000017500000000517212653650150017334 0ustar ellertellert/* httpmd5test.c gSOAP HTTP Content-MD5 digest plugin example application. gSOAP XML Web services tools Copyright (C) 2000-2004, Robert van Engelen, Genivia, Inc., All Rights Reserved. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2004, Robert van Engelen, Genivia, Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- Requires OpenSSL Compile: soapcpp2 -c httpmd5test.h cc -DWITH_OPENSSL -o httpmd5test httpmd5test.c soapC.c soapClient.c soapServer.c httpmd5.c md5evp.c stdsoap2.c -lssl -lcrypto -lz */ #include "httpmd5.h" #include "soapH.h" #include "ns.nsmap" int main(int argc, char **argv) { struct soap soap; struct ns__echoString r; soap_init(&soap); soap_register_plugin(&soap, http_md5); if (argc < 2) soap_serve(&soap); else if (soap_call_ns__echoString(&soap, "http://", NULL, argv[1], &r)) soap_print_fault(&soap, stderr); soap_end(&soap); soap_done(&soap); return 0; } int ns__echoString(struct soap *soap, char *arg, struct ns__echoString *response) { response->arg = arg; return SOAP_OK; } gsoap-2.8.28/gsoap/plugin/httpget.h0000644000175000017500000000623612653650150016535 0ustar ellertellert/* httpget.h gSOAP HTTP GET plugin. See httpget.c for usage instructions. gSOAP XML Web services tools Copyright (C) 2000-2008, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under ONE of the following licenses: GPL, the gSOAP public license, OR Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2008 Robert A. van Engelen, Genivia inc. All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- */ #ifndef HTTPGET_H #define HTTPGET_H #include "stdsoap2.h" #ifdef __cplusplus extern "C" { #endif #define HTTP_GET_ID "HTTP-GET-1.1" /* plugin identification */ extern const char http_get_id[]; /* This is the local plugin data shared among all copies of the soap struct: */ struct http_get_data { int (*fparse)(struct soap*); /* to save and call the internal HTTP header parser */ int (*fget)(struct soap*); /* user-defined server-side HTTP GET handler */ size_t stat_get; /* HTTP GET usage statistics */ size_t stat_post; /* HTTP POST usage statistics */ size_t stat_fail; /* HTTP failure statistics */ size_t min[60]; /* Hits by the minute */ size_t hour[24]; /* Hits by the hour */ size_t day[366]; /* Hits by day */ }; int http_get(struct soap*, struct soap_plugin*, void*); int soap_get_connect(struct soap*, const char*, const char*); char *query(struct soap*); char *query_key(struct soap*, char**); char *query_val(struct soap*, char**); int soap_encode_string(const char*, char*, size_t); const char* soap_decode_string(char*, size_t, const char*); #ifdef __cplusplus } #endif #endif gsoap-2.8.28/gsoap/plugin/threads.c0000644000175000017500000001001212653650150016466 0ustar ellertellert/* threads.c Portable threads and locks API implementation gSOAP XML Web services tools Copyright (C) 2000-2010, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under one of the following licenses: GPL, the gSOAP public license, or Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2010, Robert van Engelen, Genivia Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "threads.h" #ifdef WIN32 /******************************************************************************\ * * Emulation of POSIX condition variables for WIN32 * \******************************************************************************/ #ifdef __cplusplus extern "C" { #endif int emulate_pthread_mutex_lock(volatile MUTEX_TYPE *mx) { if (*mx == NULL) /* static initializer? */ { HANDLE p = CreateMutex(NULL, FALSE, NULL); if (InterlockedCompareExchangePointer((PVOID*)mx, (PVOID)p, NULL) != NULL) CloseHandle(p); } return WaitForSingleObject(*mx, INFINITE) == WAIT_FAILED; } int emulate_pthread_cond_init(COND_TYPE *cv) { cv->waiters_count_ = 0; cv->signal_event_ = CreateEvent(NULL, FALSE, FALSE, NULL); InitializeCriticalSection(&cv->waiters_count_lock_); return 0; } int emulate_pthread_cond_destroy(COND_TYPE *cv) { CloseHandle(cv->signal_event_); DeleteCriticalSection(&cv->waiters_count_lock_); return 0; } int emulate_pthread_cond_signal(COND_TYPE *cv) { int have_waiters; EnterCriticalSection(&cv->waiters_count_lock_); have_waiters = cv->waiters_count_ > 0; LeaveCriticalSection(&cv->waiters_count_lock_); if (have_waiters) return SetEvent(cv->signal_event_) == 0; return 0; } int emulate_pthread_cond_wait(COND_TYPE *cv, MUTEX_TYPE *cs) { int result; EnterCriticalSection(&cv->waiters_count_lock_); cv->waiters_count_++; LeaveCriticalSection(&cv->waiters_count_lock_); ReleaseMutex(*cs); result = (WaitForSingleObject(cv->signal_event_, INFINITE) == WAIT_FAILED); if (!result) { EnterCriticalSection(&cv->waiters_count_lock_); cv->waiters_count_--; LeaveCriticalSection(&cv->waiters_count_lock_); result = (WaitForSingleObject(*cs, INFINITE) == WAIT_FAILED); } return result; } #ifdef __cplusplus } #endif #endif gsoap-2.8.28/gsoap/plugin/md5evp.h0000644000175000017500000000600212653650150016245 0ustar ellertellert/* md5evp.h gSOAP HTTP Content-MD5 digest plugin. gSOAP XML Web services tools Copyright (C) 2000-2005, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under one of the following licenses: GPL, the gSOAP public license, or Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2005, Robert van Engelen, Genivia, Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- Defines MD5 handler using EVP interface (e.g. using OpenSSL) int md5_handler(struct soap *soap, void **context, enum md5_action action, char *buf, size_t len) context can be set and passed to subsequent calls. Parameters: action = MD5_INIT: init context MD5_UPDATE: update context with data from buf with size len MD5_FINAL: fill buf with 16 bytes MD5 hash value MD5_DELETE: delete context buf input data, output MD5 128 bit hash value len length of input data */ #ifndef MD5EVP_H #define MD5EVP_H #include "stdsoap2.h" #ifdef WITH_OPENSSL #include #endif #ifdef __cplusplus extern "C" { #endif enum md5_action { MD5_INIT, MD5_UPDATE, MD5_FINAL, MD5_DELETE }; int md5_handler(struct soap *soap, void **context, enum md5_action action, char *buf, size_t len); #ifdef __cplusplus } #endif #endif gsoap-2.8.28/gsoap/plugin/wsaapi.h0000644000175000017500000001441512653650150016340 0ustar ellertellert/* wsaapi.h WS-Addressing plugin gSOAP XML Web services tools Copyright (C) 2000-2008, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under one of the following licenses: GPL, the gSOAP public license, or Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2008, Robert van Engelen, Genivia Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #ifndef WSAAPI_H #define WSAAPI_H #include "soapH.h" /* replace with soapcpp2-generated *H.h file */ #ifdef __cplusplus extern "C" { #endif /** plugin identification for plugin registry */ #define SOAP_WSA_ID "SOAP-WSA-1.3" /** plugin identification for plugin registry */ extern const char soap_wsa_id[]; extern const char *soap_wsa_noneURI; extern const char *soap_wsa_anonymousURI; extern const char *soap_wsa_faultAction; #if defined(SOAP_WSA_2003) # define SOAP_WSA(member) wsa3__##member # define SOAP_WSA_(prefix,member) prefix##_wsa3__##member # define SOAP_WSA__(prefix,member) prefix##wsa3__##member #elif defined(SOAP_WSA_2004) # define SOAP_WSA(member) wsa4__##member # define SOAP_WSA_(prefix,member) prefix##_wsa4__##member # define SOAP_WSA__(prefix,member) prefix##wsa4__##member #elif defined(SOAP_WSA_2005) # define SOAP_WSA(member) wsa5__##member # define SOAP_WSA_(prefix,member) prefix##_wsa5__##member # define SOAP_WSA__(prefix,member) prefix##wsa5__##member #else # define SOAP_WSA(member) wsa__##member # define SOAP_WSA_(prefix,member) prefix##_wsa__##member # define SOAP_WSA__(prefix,member) prefix##wsa__##member #endif /** @struct soap_wsa_data @brief plugin data to override callbacks */ struct soap_wsa_data { /** fheader callback is invoked immediately after parsing a SOAP Header */ int (*fheader)(struct soap*); /** fseterror callback is used to inspect and change gSOAP error codes */ void (*fseterror)(struct soap*, const char**, const char**); /** fresponse callback is used to change a HTTP response into a HTTP POST */ int (*fresponse)(struct soap*, int, size_t); /** fdisconnect callback is used to accept HTTP 202 */ int (*fdisconnect)(struct soap*); }; int soap_wsa(struct soap *soap, struct soap_plugin *p, void *arg); const char *soap_wsa_rand_uuid(struct soap *soap); int soap_wsa_request(struct soap *soap, const char *id, const char *to, const char *action); int soap_wsa_add_From(struct soap *soap, const char *endpoint); int soap_wsa_add_NoReply(struct soap *soap); int soap_wsa_add_ReplyTo(struct soap *soap, const char *endpoint); int soap_wsa_add_FaultTo(struct soap *soap, const char *endpoint); int soap_wsa_add_RelatesTo(struct soap *soap, const char *endpoint); const char *soap_wsa_From(struct soap *soap); const char *soap_wsa_ReplyTo(struct soap *soap); const char *soap_wsa_FaultTo(struct soap *soap); const char *soap_wsa_RelatesTo(struct soap *soap); int soap_wsa_check(struct soap *soap); int soap_wsa_reply(struct soap *soap, const char *id, const char *action); int soap_wsa_fault_subcode(struct soap *soap, int flag, const char *faultsubcode, const char *faultstring, const char *faultdetail); int soap_wsa_fault_subcode_action(struct soap *soap, int flag, const char *faultsubcode, const char *faultstring, const char *faultdetail, const char *action); int soap_wsa_sender_fault_subcode(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail); int soap_wsa_sender_fault_subcode_action(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail, const char *action); int soap_wsa_receiver_fault_subcode(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail); int soap_wsa_receiver_fault_subcode_action(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail, const char *action); int soap_wsa_sender_fault(struct soap *soap, const char *faultstring, const char *faultdetail); int soap_wsa_receiver_fault(struct soap *soap, const char *faultstring, const char *faultdetail); #if defined(SOAP_WSA_2005) int soap_wsa_check_fault(struct soap *soap, SOAP_WSA(FaultCodesType) *fault, const char **info); int soap_wsa_error(struct soap *soap, SOAP_WSA(FaultCodesType) fault, const char *info); #elif defined(SOAP_WSA_2003) int soap_wsa_check_fault(struct soap *soap, char **fault); int soap_wsa_error(struct soap *soap, const char *fault); #else int soap_wsa_check_fault(struct soap *soap, SOAP_WSA(FaultSubcodeValues) *fault); int soap_wsa_error(struct soap *soap, SOAP_WSA(FaultSubcodeValues) fault); #endif #ifdef __cplusplus } #endif #endif gsoap-2.8.28/gsoap/plugin/cacerts.c0000644000175000017500000077366612653650150016517 0ustar ellertellert/* cacerts.c Store CA certificates in memory for optimizations and/or stand-alone clients. gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under one of the following licenses: GPL, the gSOAP public license, or Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- # Part of the source for this file is provided by Mozilla: # http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1 # This file was converted to PEM format with tools provided by OpenSSL. # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cacerts.h" #ifdef __cplusplus extern "C" { #endif int soap_ssl_client_cacerts(struct soap *soap) { extern const char cacert_pem_data[]; const char *data = cacert_pem_data; const char *next = data; int err = SOAP_OK; int max = 0; X509 *cert = NULL; #if (OPENSSL_VERSION_NUMBER >= 0x0090800fL) const unsigned char *der; #else unsigned char *der; #endif char *buf = NULL; X509_STORE *store; if ((err = soap_ssl_client_context(soap, SOAP_SSL_DEFAULT, NULL, NULL, NULL, NULL, NULL))) return err; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Populating certificate chain\n")); store = SSL_CTX_get_cert_store(soap->ctx); for (;;) { int len; data = strstr(next, "-----BEGIN CERTIFICATE-----"); if (!data) break; data += 27; next = strstr(data, "-----END CERTIFICATE-----"); if (!next) break; len = (next - data + 3) / 4 * 3; if (len > max) { if (buf) SOAP_FREE(soap, buf); buf = (char*)SOAP_MALLOC(soap, len); max = len; } soap_base642s(soap, data, buf, (size_t)len, NULL); der = (unsigned char*)buf; if (cert) { X509_free(cert); cert = NULL; } if (!d2i_X509(&cert, &der, len)) break; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Adding certificate %d bytes\n", len)); if (X509_STORE_add_cert(store, cert) != 1) { char line[80]; (SOAP_SNPRINTF(line, sizeof(line), 32), "At position %lu", (unsigned long)(data - cacert_pem_data)); err = soap_set_receiver_error(soap, line, "SSL add chain certificate failed in soap_ssl_client_cacerts()", SOAP_SSL_ERROR); break; } data = next + 25; } if (buf) SOAP_FREE(soap, buf); if (cert) X509_free(cert); return err; } const char cacert_pem_data[] = "\ GlobalSign Root CA\ ==================\ -----BEGIN CERTIFICATE-----\ MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx\ GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds\ b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV\ BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD\ VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa\ DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc\ THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb\ Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP\ c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX\ gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV\ HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF\ AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj\ Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG\ j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH\ hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC\ X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==\ -----END CERTIFICATE-----\ \ GlobalSign Root CA - R2\ =======================\ -----BEGIN CERTIFICATE-----\ MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv\ YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh\ bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT\ aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln\ bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6\ ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp\ s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN\ S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL\ TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C\ ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E\ FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i\ YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN\ BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp\ 9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu\ 01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7\ 9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7\ TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==\ -----END CERTIFICATE-----\ \ Verisign Class 3 Public Primary Certification Authority - G3\ ============================================================\ -----BEGIN CERTIFICATE-----\ MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV\ UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv\ cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl\ IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh\ dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw\ CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy\ dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv\ cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg\ Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC\ ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1\ EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc\ cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw\ EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj\ 055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA\ ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f\ j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC\ /Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0\ xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa\ t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==\ -----END CERTIFICATE-----\ \ Entrust.net Premium 2048 Secure Server CA\ =========================================\ -----BEGIN CERTIFICATE-----\ MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u\ ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp\ bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV\ BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx\ NzUwNTFaFw0yOTA3MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3\ d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl\ MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u\ ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A\ MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL\ Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr\ hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW\ nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi\ VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo0IwQDAOBgNVHQ8BAf8E\ BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJ\ KoZIhvcNAQEFBQADggEBADubj1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPy\ T/4xmf3IDExoU8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf\ zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5bu/8j72gZyxKT\ J1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+bYQLCIt+jerXmCHG8+c8eS9e\ nNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/ErfF6adulZkMV8gzURZVE=\ -----END CERTIFICATE-----\ \ Baltimore CyberTrust Root\ =========================\ -----BEGIN CERTIFICATE-----\ MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE\ ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li\ ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC\ SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs\ dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME\ uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB\ UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C\ G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9\ XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr\ l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI\ VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB\ BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh\ cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5\ hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa\ Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H\ RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp\ -----END CERTIFICATE-----\ \ AddTrust Low-Value Services Root\ ================================\ -----BEGIN CERTIFICATE-----\ MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML\ QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRU\ cnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQsw\ CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBO\ ZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEB\ AQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY6\ 54eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWr\ oulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1\ Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJui\ GMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8w\ HQYDVR0OBBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTAD\ AQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQswCQYDVQQGEwJT\ RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEw\ HwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxt\ ZBsfzQ3duQH6lmM0MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph\ iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY\ eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJlpz/+0WatC7xr\ mYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vj\ ccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk=\ -----END CERTIFICATE-----\ \ AddTrust External Root\ ======================\ -----BEGIN CERTIFICATE-----\ MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML\ QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD\ VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw\ NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU\ cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg\ Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821\ +iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw\ Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo\ aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy\ 2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7\ 7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P\ BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL\ VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk\ VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB\ IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl\ j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5\ 6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355\ e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u\ G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=\ -----END CERTIFICATE-----\ \ AddTrust Public Services Root\ =============================\ -----BEGIN CERTIFICATE-----\ MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEUMBIGA1UEChML\ QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSAwHgYDVQQDExdBZGRU\ cnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJ\ BgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5l\ dHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEF\ AAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbu\ nyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1i\ d9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSG\ Aa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAw\ HM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0G\ A1UdDgQWBBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB\ /zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkGA1UEBhMCU0Ux\ FDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29yazEgMB4G\ A1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4\ JNojVhaTdt02KLmuG7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL\ +YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao\ GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh4SINhwBk/ox9\ Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9H\ EufOX1362KqxMy3ZdvJOOjMMK7MtkAY=\ -----END CERTIFICATE-----\ \ AddTrust Qualified Certificates Root\ ====================================\ -----BEGIN CERTIFICATE-----\ MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEUMBIGA1UEChML\ QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSMwIQYDVQQDExpBZGRU\ cnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcx\ CzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ\ IE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG\ 9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx\ 64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3\ KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1tUvznoD1o\ L/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GR\ wVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HU\ MIHRMB0GA1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/\ BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkwZzELMAkGA1UE\ BhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29y\ azEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQAD\ ggEBABmrder4i2VhlRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG\ GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X\ dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3P6CxB9bpT9ze\ RXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDB\ iFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5noxqE=\ -----END CERTIFICATE-----\ \ Entrust Root Certification Authority\ ====================================\ -----BEGIN CERTIFICATE-----\ MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV\ BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw\ b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG\ A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0\ MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu\ MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu\ Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v\ dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB\ ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz\ A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww\ Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68\ j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN\ rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw\ DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1\ MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH\ hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA\ A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM\ Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa\ v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS\ W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0\ tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8\ -----END CERTIFICATE-----\ \ RSA Security 2048 v3\ ====================\ -----BEGIN CERTIFICATE-----\ MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6MRkwFwYDVQQK\ ExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAy\ MjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAb\ BgNVBAsTFFJTQSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC\ AQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7\ Jylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgb\ WhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iH\ KrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP\ +Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/\ MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4E\ FgQUB8NRMKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmY\ v/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5gEydxiKRz44Rj\ 0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+f00/FGj1EVDVwfSQpQgdMWD/YIwj\ VAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395\ nzIlQnQFgCi/vcEkllgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA\ pKnXwiJPZ9d37CAFYd4=\ -----END CERTIFICATE-----\ \ GeoTrust Global CA\ ==================\ -----BEGIN CERTIFICATE-----\ MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK\ Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw\ MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j\ LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB\ CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo\ BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet\ 8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc\ T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU\ vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD\ AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk\ DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q\ zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4\ d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2\ mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p\ XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm\ Mw==\ -----END CERTIFICATE-----\ \ GeoTrust Global CA 2\ ====================\ -----BEGIN CERTIFICATE-----\ MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN\ R2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwHhcNMDQwMzA0MDUw\ MDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j\ LjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw\ ggEKAoIBAQDvPE1APRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/\ NTL8Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hLTytCOb1k\ LUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL5mkWRxHCJ1kDs6ZgwiFA\ Vvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7S4wMcoKK+xfNAGw6EzywhIdLFnopsk/b\ HdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQF\ MAMBAf8wHQYDVR0OBBYEFHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNH\ K266ZUapEBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6tdEPx7\ srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv/NgdRN3ggX+d6Yvh\ ZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywNA0ZF66D0f0hExghAzN4bcLUprbqL\ OzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkC\ x1YAzUm5s2x7UwQa4qjJqhIFI8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqF\ H4z1Ir+rzoPz4iIprn2DQKi6bA==\ -----END CERTIFICATE-----\ \ GeoTrust Universal CA\ =====================\ -----BEGIN CERTIFICATE-----\ MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN\ R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1\ MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu\ Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP\ ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t\ JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e\ RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs\ 7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d\ 8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V\ qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga\ Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB\ Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu\ KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08\ ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0\ XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB\ hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc\ aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2\ qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL\ oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK\ xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF\ KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2\ DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK\ xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU\ p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI\ P/rmMuGNG2+k5o7Y+SlIis5z/iw=\ -----END CERTIFICATE-----\ \ GeoTrust Universal CA 2\ =======================\ -----BEGIN CERTIFICATE-----\ MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN\ R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0\ MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg\ SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA\ A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0\ DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17\ j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q\ JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a\ QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2\ WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP\ 20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn\ ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC\ SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG\ 8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2\ +/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E\ BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z\ dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ\ 4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+\ mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq\ A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg\ Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP\ pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d\ FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp\ gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm\ X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS\ -----END CERTIFICATE-----\ \ Visa eCommerce Root\ ===================\ -----BEGIN CERTIFICATE-----\ MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG\ EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug\ QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2\ WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm\ VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv\ bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL\ F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b\ RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0\ TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI\ /k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs\ GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG\ MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc\ CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW\ YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz\ zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu\ YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt\ 398znM/jra6O1I7mT1GvFpLgXPYHDw==\ -----END CERTIFICATE-----\ \ Certum Root CA\ ==============\ -----BEGIN CERTIFICATE-----\ MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQK\ ExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQTAeFw0wMjA2MTExMDQ2Mzla\ Fw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8u\ by4xEjAQBgNVBAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6x\ wS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdL\ kKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ\ 89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/K\ Uz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu/qpGWX7P\ NSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq\ hkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+\ GXYkHAQaTOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvg\ GrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqTE5s7FCMTY5w/\ 0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5xO/fIR/RpbxXyEV6DHpx8Uq79AtoS\ qFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs6GAqm4VKQPNriiTsBhYscw==\ -----END CERTIFICATE-----\ \ Comodo AAA Services root\ ========================\ -----BEGIN CERTIFICATE-----\ MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS\ R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg\ TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw\ MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl\ c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV\ BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC\ ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG\ C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs\ i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW\ Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH\ Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK\ Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f\ BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl\ cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz\ LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm\ 7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz\ Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z\ 8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C\ 12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==\ -----END CERTIFICATE-----\ \ Comodo Secure Services root\ ===========================\ -----BEGIN CERTIFICATE-----\ MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS\ R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg\ TGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAw\ MDAwMFoXDTI4MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu\ Y2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAi\ BgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP\ ADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP\ 9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8j6ysNstc\ rbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rC\ oznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3V\ p6ea5EQz6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4E\ FgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w\ gYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL1NlY3VyZUNlcnRpZmlj\ YXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlm\ aWNhdGVTZXJ2aWNlcy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm\ 4J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj\ Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtIgKvcnDe4IRRL\ DXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6Pw\ pCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1H\ RR3B7Hzs/Sk=\ -----END CERTIFICATE-----\ \ Comodo Trusted Services root\ ============================\ -----BEGIN CERTIFICATE-----\ MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS\ R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg\ TGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEw\ MDAwMDBaFw0yODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1h\ bmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUw\ IwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOC\ AQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh7\ 3TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9C1t2ul/y\ /9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6\ juljatEPmsbS9Is6FARW1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsS\ ivnkBbA7kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1Ud\ DgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB\ /zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21vZG9jYS5jb20vVHJ1c3RlZENlcnRp\ ZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENl\ cnRpZmljYXRlU2VydmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw\ uleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32\ pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxISjBc/lDb+XbDA\ BHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0l\ R+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O\ 9y5Xt5hwXsjEeLBi\ -----END CERTIFICATE-----\ \ QuoVadis Root CA\ ================\ -----BEGIN CERTIFICATE-----\ MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE\ ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0\ eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz\ MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp\ cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD\ EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF\ AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk\ J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL\ F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL\ YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen\ AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w\ PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y\ ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7\ MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj\ YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs\ ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh\ Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW\ Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu\ BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw\ FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0\ aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6\ tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo\ fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul\ LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x\ gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi\ 5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi\ 5nrQNiOKSnQ2+Q==\ -----END CERTIFICATE-----\ \ QuoVadis Root CA 2\ ==================\ -----BEGIN CERTIFICATE-----\ MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT\ EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQx\ ODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM\ aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4IC\ DwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6\ XJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yk\ lvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbB\ lDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRcAitMOeGy\ lZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt\ 66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1Jdxn\ wQ5hYIizPtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOh\ D7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR7hYQe7xFSkyy\ BNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuIyV77zGHcizN300QyNQliBJIWENie\ J0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1Ud\ DgQWBBQahGK8SEwzJQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGU\ a6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT\ ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2fBluornFdLwUv\ Z+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3\ UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodm\ VjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK\ +JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrW\ IozchLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1\ WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1B+TJYm5X\ f6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II\ 4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8\ VCLAAVBpQ570su9t+Oza8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u\ -----END CERTIFICATE-----\ \ QuoVadis Root CA 3\ ==================\ -----BEGIN CERTIFICATE-----\ MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT\ EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx\ OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM\ aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC\ DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg\ DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij\ KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K\ DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv\ BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp\ p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8\ nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX\ MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM\ Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz\ uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT\ BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj\ YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0\ aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB\ BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD\ VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4\ ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE\ AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV\ qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s\ hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z\ POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2\ Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp\ 8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC\ bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu\ g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p\ vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr\ qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto=\ -----END CERTIFICATE-----\ \ Security Communication Root CA\ ==============================\ -----BEGIN CERTIFICATE-----\ MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP\ U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw\ HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP\ U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw\ ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw\ 8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM\ DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX\ 5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd\ DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2\ JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw\ DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g\ 0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a\ mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ\ s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ\ 6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi\ FL39vmwLAw==\ -----END CERTIFICATE-----\ \ Sonera Class 2 Root CA\ ======================\ -----BEGIN CERTIFICATE-----\ MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG\ U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw\ NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh\ IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3\ /Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT\ dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG\ f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P\ tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH\ nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT\ XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt\ 0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI\ cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph\ Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx\ EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH\ llpwrN9M\ -----END CERTIFICATE-----\ \ Staat der Nederlanden Root CA\ =============================\ -----BEGIN CERTIFICATE-----\ MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJOTDEeMBwGA1UE\ ChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFhdCBkZXIgTmVkZXJsYW5kZW4g\ Um9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEyMTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4w\ HAYDVQQKExVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxh\ bmRlbiBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFt\ vsznExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw719tV2U02P\ jLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MOhXeiD+EwR+4A5zN9RGca\ C1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+UtFE5A3+y3qcym7RHjm+0Sq7lr7HcsBth\ vJly3uSJt3omXdozSVtSnA71iq3DuD3oBmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn6\ 22r+I/q85Ej0ZytqERAhSQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRV\ HSAAMDwwOgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMvcm9v\ dC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA7Jbg0zTBLL9s+DAN\ BgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k/rvuFbQvBgwp8qiSpGEN/KtcCFtR\ EytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzmeafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbw\ MVcoEoJz6TMvplW0C5GUR5z6u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3y\ nGQI0DvDKcWy7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR\ iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw==\ -----END CERTIFICATE-----\ \ UTN USERFirst Hardware Root CA\ ==============================\ -----BEGIN CERTIFICATE-----\ MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UE\ BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl\ IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAd\ BgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgx\ OTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0\ eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVz\ ZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3\ DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlI\ wrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFd\ tqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8\ i4fDidNdoI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjf\ Pe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhbAgMBAAGjgbkw\ gbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFKFyXyYbKJhDlV0HN9WF\ lp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNF\ UkZpcnN0LUhhcmR3YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF\ BwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM\ //bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28GpgoiskliCE7/yMgUsogW\ XecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2\ lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kn\ iCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67\ nfhmqA==\ -----END CERTIFICATE-----\ \ Camerfirma Chambers of Commerce Root\ ====================================\ -----BEGIN CERTIFICATE-----\ MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe\ QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i\ ZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAx\ NjEzNDNaFw0zNzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZp\ cm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3Jn\ MSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOC\ AQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlU\ xFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41XQEMIwRH\ NaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jW\ DA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFV\ d9oKDMyXroDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1Ud\ EwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFtYmVyc2lnbi5v\ cmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p26EpW1eLTXYGduHRooowDgYDVR0P\ AQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hh\ bWJlcnNpZ24ub3JnMCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD\ VR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz\ aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEBAAxBl8IahsAi\ fJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvD\ L8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wN\ UPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/n\ ADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1\ erfutGWaIZDgqtCYvDi1czyL+Nw=\ -----END CERTIFICATE-----\ \ Camerfirma Global Chambersign Root\ ==================================\ -----BEGIN CERTIFICATE-----\ MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe\ QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i\ ZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYx\ NDE4WhcNMzcwOTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJt\ YSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEg\ MB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAw\ ggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J\ 1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8O\ by4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl\ 6DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c\ 8lCrEqWhz0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/\ BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJzaWduLm9yZy9j\ aGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4wTcbOX60Qq+UDpfqpFDAOBgNVHQ8B\ Af8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBj\ aGFtYmVyc2lnbi5vcmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y\ ZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh\ bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0BAQUFAAOCAQEA\ PDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9Y\ gOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJ\ PJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4\ IBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes\ t2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A==\ -----END CERTIFICATE-----\ \ NetLock Notary (Class A) Root\ =============================\ -----BEGIN CERTIFICATE-----\ MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQI\ EwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6\ dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9j\ ayBLb3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oX\ DTE5MDIxOTIzMTQ0N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQH\ EwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYD\ VQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFz\ cyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSM\ D7tM9DceqQWC2ObhbHDqeLVu0ThEDaiDzl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZ\ z+qMkjvN9wfcZnSX9EUi3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC\ /tmwqcm8WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LYOph7\ tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2EsiNCubMvJIH5+hCoR6\ 4sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCCApswDgYDVR0PAQH/BAQDAgAGMBIG\ A1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaC\ Ak1GSUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pv\ bGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu\ IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2Vn\ LWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0\ ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFz\ IGxlaXJhc2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBh\ IGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVu\ b3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBh\ bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sg\ Q1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFp\ bCBhdCBjcHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5\ ayZrU3/b39/zcT0mwBQOxmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjP\ ytoUMaFP0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQQeJB\ CWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxkf1qbFFgBJ34TUMdr\ KuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK8CtmdWOMovsEPoMOmzbwGOQmIMOM\ 8CgHrTwXZoi1/baI\ -----END CERTIFICATE-----\ \ XRamp Global CA Root\ ====================\ -----BEGIN CERTIFICATE-----\ MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE\ BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj\ dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB\ dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx\ HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg\ U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp\ dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu\ IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx\ foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE\ zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs\ AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry\ xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud\ EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap\ oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC\ AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc\ /Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt\ qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n\ nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz\ 8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw=\ -----END CERTIFICATE-----\ \ Go Daddy Class 2 CA\ ===================\ -----BEGIN CERTIFICATE-----\ MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY\ VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp\ ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG\ A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g\ RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD\ ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv\ 2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32\ qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j\ YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY\ vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O\ BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o\ atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu\ MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG\ A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim\ PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt\ I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ\ HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI\ Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b\ vZ8=\ -----END CERTIFICATE-----\ \ Starfield Class 2 CA\ ====================\ -----BEGIN CERTIFICATE-----\ MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc\ U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg\ Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo\ MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG\ A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG\ SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY\ bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ\ JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm\ epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN\ F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF\ MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f\ hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo\ bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g\ QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs\ afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM\ PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl\ xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD\ KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3\ QBFGmh95DmK/D5fs4C8fF5Q=\ -----END CERTIFICATE-----\ \ StartCom Certification Authority\ ================================\ -----BEGIN CERTIFICATE-----\ MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN\ U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu\ ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0\ NjM2WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk\ LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg\ U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw\ ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y\ o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/\ Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d\ eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt\ 2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z\ 6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ\ osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/\ untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc\ UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT\ 37uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE\ FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0\ Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNj\ YS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUH\ AgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRw\ Oi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYg\ U3RhcnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5\ LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0Q29tIENl\ cnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUgYXQgaHR0cDovL2NlcnQuc3Rh\ cnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilT\ dGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOC\ AgEAFmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8jhvh\ 3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUWFjgKXlf2Ysd6AgXm\ vB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHk\ fY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3\ fsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZ\ EoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq\ yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl\ 1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/7HW/\ lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/FlUQqmMGqz9IgcgA38coro\ g14=\ -----END CERTIFICATE-----\ \ Taiwan GRCA\ ===========\ -----BEGIN CERTIFICATE-----\ MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG\ EwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X\ DTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv\ dmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD\ ggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN\ w8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5\ BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O\ 1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO\ htX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov\ J5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7\ Q3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t\ B6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB\ O9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8\ lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV\ HRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2\ 09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ\ TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj\ Zwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2\ Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU\ D7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz\ DxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk\ Z6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk\ 7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ\ CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy\ +fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS\ -----END CERTIFICATE-----\ \ Swisscom Root CA 1\ ==================\ -----BEGIN CERTIFICATE-----\ MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQG\ EwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2VydGlmaWNhdGUgU2Vy\ dmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3QgQ0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4\ MTgyMjA2MjBaMGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGln\ aXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIIC\ IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9m2BtRsiM\ MW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdihFvkcxC7mlSpnzNApbjyF\ NDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/TilftKaNXXsLmREDA/7n29uj/x2lzZAe\ AR81sH8A25Bvxn570e56eqeqDFdvpG3FEzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkC\ b6dJtDZd0KTeByy2dbcokdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn\ 7uHbHaBuHYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNFvJbN\ cA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo19AOeCMgkckkKmUp\ WyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjCL3UcPX7ape8eYIVpQtPM+GP+HkM5\ haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJWbjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNY\ MUJDLXT5xp6mig/p/r+D5kNXJLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYw\ HQYDVR0hBBYwFDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j\ BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzcK6FptWfUjNP9\ MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzfky9NfEBWMXrrpA9gzXrzvsMn\ jgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7IkVh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQ\ MbFamIp1TpBcahQq4FJHgmDmHtqBsfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4H\ VtA4oJVwIHaM190e3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtl\ vrsRls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ipmXeascCl\ OS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HHb6D0jqTsNFFbjCYDcKF3\ 1QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksfrK/7DZBaZmBwXarNeNQk7shBoJMBkpxq\ nvy5JMWzFYJ+vq6VK+uxwNrjAWALXmmshFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCy\ x/yP2FS1k2Kdzs9Z+z0YzirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMW\ NY6E0F/6MBr1mmz0DlP5OlvRHA==\ -----END CERTIFICATE-----\ \ DigiCert Assured ID Root CA\ ===========================\ -----BEGIN CERTIFICATE-----\ MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG\ EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw\ IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx\ MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL\ ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew\ ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO\ 9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy\ UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW\ /lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy\ oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf\ GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF\ 66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq\ hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc\ EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn\ SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i\ 8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe\ +o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g==\ -----END CERTIFICATE-----\ \ DigiCert Global Root CA\ =======================\ -----BEGIN CERTIFICATE-----\ MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG\ EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw\ HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw\ MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3\ dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq\ hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn\ TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5\ BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H\ 4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y\ 7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB\ o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm\ 8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF\ BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr\ EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt\ tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886\ UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk\ CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=\ -----END CERTIFICATE-----\ \ DigiCert High Assurance EV Root CA\ ==================================\ -----BEGIN CERTIFICATE-----\ MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG\ EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw\ KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw\ MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ\ MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu\ Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t\ Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS\ OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3\ MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ\ NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe\ h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB\ Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY\ JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ\ V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp\ myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK\ mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe\ vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K\ -----END CERTIFICATE-----\ \ Certplus Class 2 Primary CA\ ===========================\ -----BEGIN CERTIFICATE-----\ MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE\ BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN\ OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy\ dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP\ ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR\ 5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ\ Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO\ YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e\ e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME\ CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ\ YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t\ L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD\ P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R\ TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+\ 7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW\ //1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7\ l7+ijrRU\ -----END CERTIFICATE-----\ \ DST Root CA X3\ ==============\ -----BEGIN CERTIFICATE-----\ MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK\ ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X\ DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1\ cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD\ ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT\ rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9\ UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy\ xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d\ utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T\ AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ\ MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug\ dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE\ GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw\ RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS\ fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ\ -----END CERTIFICATE-----\ \ DST ACES CA X6\ ==============\ -----BEGIN CERTIFICATE-----\ MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQG\ EwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VT\ MRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NTha\ MFsxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UE\ CxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOC\ AQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzI\ DZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCa\ pCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKBXy314pow\ GCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPy\ MjwmR/onJALJfh1biEITajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1Ud\ EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3Qu\ Y29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnRy\ dXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMtaW5kZXguaHRtbDAdBgNVHQ4EFgQU\ CXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V2\ 5FYrnJmQ6AgwbN99Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t\ Fr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq\ nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpRrscL9yuwNwXs\ vFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3\ oKfN5XozNmr6mis=\ -----END CERTIFICATE-----\ \ SwissSign Gold CA - G2\ ======================\ -----BEGIN CERTIFICATE-----\ MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkNIMRUw\ EwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcN\ MDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dp\ c3NTaWduIEFHMR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0B\ AQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUq\ t2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5C\ jCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpg\ vd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbLtK/tREDF\ ylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvR\ AiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuend\ jIj3o02yMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkO\ peUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59je883WX0XaxR\ 7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxMgI93e2CaHt+28kgeDrpOVG2Y4OGi\ GqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw\ AwEB/zAdBgNVHQ4EFgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64\ OfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov\ L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe645R88a7A3hfm\ 5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr\ 44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOf\ Mke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6m\ Gu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxp\ mo/a77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJk\ vC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7XdVAyksLf\ KzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG2mqeSz53OiATIgHQv2ieY2Br\ NU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6Lqj\ viOvrv1vA+ACOzB2+httQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ\ -----END CERTIFICATE-----\ \ SwissSign Silver CA - G2\ ========================\ -----BEGIN CERTIFICATE-----\ MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCQ0gxFTAT\ BgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMB4X\ DTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0NlowRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3\ aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG\ 9w0BAQEFAAOCAg8AMIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644\ N0MvFz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7brYT7QbNHm\ +/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieFnbAVlDLaYQ1HTWBCrpJH\ 6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH6ATK72oxh9TAtvmUcXtnZLi2kUpCe2Uu\ MGoM9ZDulebyzYLs2aFK7PayS+VFheZteJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5h\ qAaEuSh6XzjZG6k4sIN/c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5\ FZGkECwJMoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRHHTBs\ ROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTfjNFusB3hB48IHpmc\ celM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb65i/4z3GcRm25xBWNOHkDRUjvxF3X\ CO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/\ BAUwAwEB/zAdBgNVHQ4EFgQUF6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRB\ tjpbO8tFnb0cwpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0\ cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBAHPGgeAn0i0P\ 4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShpWJHckRE1qTodvBqlYJ7YH39F\ kWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L\ 3XWgwF15kIwb4FDm3jH+mHtwX6WQ2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx\ /uNncqCxv1yL5PqZIseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFa\ DGi8aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2Xem1ZqSqP\ e97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQRdAtq/gsD/KNVV4n+Ssuu\ WxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJ\ DIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ub\ DgEj8Z+7fNzcbBGXJbLytGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u\ -----END CERTIFICATE-----\ \ GeoTrust Primary Certification Authority\ ========================================\ -----BEGIN CERTIFICATE-----\ MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG\ EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD\ ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx\ CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ\ cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB\ CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN\ b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9\ nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge\ RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt\ tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD\ AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI\ hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K\ Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN\ NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa\ Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG\ 1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk=\ -----END CERTIFICATE-----\ \ thawte Primary Root CA\ ======================\ -----BEGIN CERTIFICATE-----\ MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE\ BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2\ aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv\ cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3\ MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg\ SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv\ KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT\ FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs\ oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ\ 1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc\ q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K\ aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p\ afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD\ VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF\ AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE\ uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX\ xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89\ jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH\ z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA==\ -----END CERTIFICATE-----\ \ VeriSign Class 3 Public Primary Certification Authority - G5\ ============================================================\ -----BEGIN CERTIFICATE-----\ MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE\ BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO\ ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk\ IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp\ ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB\ yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln\ biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh\ dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt\ YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw\ ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz\ j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD\ Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/\ Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r\ fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/\ BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv\ Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy\ aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG\ SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+\ X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE\ KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC\ Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE\ ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq\ -----END CERTIFICATE-----\ \ SecureTrust CA\ ==============\ -----BEGIN CERTIFICATE-----\ MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG\ EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy\ dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe\ BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC\ ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX\ OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t\ DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH\ GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b\ 01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH\ ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/\ BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj\ aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ\ KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu\ SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf\ mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ\ nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR\ 3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE=\ -----END CERTIFICATE-----\ \ Secure Global CA\ ================\ -----BEGIN CERTIFICATE-----\ MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG\ EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH\ bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg\ MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg\ Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx\ YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ\ bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g\ 8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV\ HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi\ 0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud\ EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn\ oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA\ MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+\ OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn\ CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5\ 3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc\ f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW\ -----END CERTIFICATE-----\ \ COMODO Certification Authority\ ==============================\ -----BEGIN CERTIFICATE-----\ MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE\ BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG\ A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1\ dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb\ MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD\ T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5\ MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH\ +7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww\ xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV\ 4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA\ 1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI\ rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E\ BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k\ b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC\ AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP\ OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/\ RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc\ IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN\ +8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ==\ -----END CERTIFICATE-----\ \ Network Solutions Certificate Authority\ =======================================\ -----BEGIN CERTIFICATE-----\ MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG\ EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr\ IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx\ MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu\ MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G\ CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx\ jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT\ aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT\ crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc\ /Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB\ AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP\ BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv\ bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA\ A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q\ 4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/\ GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv\ wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD\ ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey\ -----END CERTIFICATE-----\ \ WellsSecure Public Root Certificate Authority\ =============================================\ -----BEGIN CERTIFICATE-----\ MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoM\ F1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYw\ NAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN\ MDcxMjEzMTcwNzU0WhcNMjIxMjE0MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dl\ bGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYD\ VQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G\ CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+rWxxTkqxtnt3CxC5FlAM1\ iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjUDk/41itMpBb570OYj7OeUt9tkTmPOL13\ i0Nj67eT/DBMHAGTthP796EfvyXhdDcsHqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8\ bJVhHlfXBIEyg1J55oNjz7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiB\ K0HmOFafSZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/SlwxlAgMB\ AAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly9jcmwu\ cGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0PAQH/BAQDAgHGMB0GA1UdDgQWBBQm\ lRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0jBIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGB\ i6SBiDCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRww\ GgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg\ Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEBALkVsUSRzCPI\ K0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd/ZDJPHV3V3p9+N701NX3leZ0\ bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pBA4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSlj\ qHyita04pO2t/caaH/+Xc/77szWnk4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+es\ E2fDbbFwRnzVlhE9iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJ\ tylv2G0xffX8oRAHh84vWdw+WNs=\ -----END CERTIFICATE-----\ \ COMODO ECC Certification Authority\ ==================================\ -----BEGIN CERTIFICATE-----\ MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC\ R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE\ ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB\ dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix\ GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR\ Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo\ b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X\ 4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni\ wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E\ BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG\ FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA\ U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY=\ -----END CERTIFICATE-----\ \ IGC/A\ =====\ -----BEGIN CERTIFICATE-----\ MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYTAkZSMQ8wDQYD\ VQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVE\ Q1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZy\ MB4XDTAyMTIxMzE0MjkyM1oXDTIwMTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQI\ EwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NT\ STEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMIIB\ IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaIs9z4iPf930Pfeo2aSVz2\ TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCW\ So7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYy\ HF2fYPepraX/z9E0+X1bF8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNd\ frGoRpAxVs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGdPDPQ\ tQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNVHSAEDjAMMAoGCCqB\ egF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAxNjAfBgNVHSMEGDAWgBSjBS8YYFDC\ iQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUFAAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RK\ q89toB9RlPhJy3Q2FLwV3duJL92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3Q\ MZsyK10XZZOYYLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg\ Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2aNjSaTFR+FwNI\ lQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R0982gaEbeC9xs/FZTEYYKKuF\ 0mBWWg==\ -----END CERTIFICATE-----\ \ Security Communication EV RootCA1\ =================================\ -----BEGIN CERTIFICATE-----\ MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDElMCMGA1UEChMc\ U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMhU2VjdXJpdHkgQ29tbXVuaWNh\ dGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIzMloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UE\ BhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNl\ Y3VyaXR5IENvbW11bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC\ AQoCggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSERMqm4miO\ /VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gOzXppFodEtZDkBp2uoQSX\ WHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4z\ ZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDFMxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4\ bepJz11sS6/vmsJWXMY1VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK\ 9U2vP9eCOKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG\ SIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HWtWS3irO4G8za+6xm\ iEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZq51ihPZRwSzJIxXYKLerJRO1RuGG\ Av8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDbEJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnW\ mHyojf6GPgcWkuF75x3sM3Z+Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEW\ T1MKZPlO9L9OVL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490\ -----END CERTIFICATE-----\ \ OISTE WISeKey Global Root GA CA\ ===============================\ -----BEGIN CERTIFICATE-----\ MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE\ BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG\ A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH\ bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD\ VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw\ IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5\ IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9\ Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg\ Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD\ d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ\ /yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R\ LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw\ AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ\ KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm\ MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4\ +vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa\ hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY\ okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0=\ -----END CERTIFICATE-----\ \ Microsec e-Szigno Root CA\ =========================\ -----BEGIN CERTIFICATE-----\ MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAwcjELMAkGA1UE\ BhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNyb3NlYyBMdGQuMRQwEgYDVQQL\ EwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0\ MDYxMjI4NDRaFw0xNzA0MDYxMjI4NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVz\ dDEWMBQGA1UEChMNTWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMT\ GU1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB\ AQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2uuO/TEdyB5s87lozWbxXG\ d36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/N\ oqdNAoI/gqyFxuEPkEeZlApxcpMqyabAvjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjc\ QR/Ji3HWVBTji1R4P770Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJ\ PqW+jqpx62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcBAQRb\ MFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3AwLQYIKwYBBQUHMAKG\ IWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAPBgNVHRMBAf8EBTADAQH/MIIBcwYD\ VR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIBAQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3\ LmUtc3ppZ25vLmh1L1NaU1ovMIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0A\ dAB2AOEAbgB5ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn\ AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABTAHoAbwBsAGcA\ 4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABhACAAcwB6AGUAcgBpAG4AdAAg\ AGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABoAHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMA\ egBpAGcAbgBvAC4AaAB1AC8AUwBaAFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6\ Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NO\ PU1pY3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxPPU1pY3Jv\ c2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdDtiaW5h\ cnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuBEGluZm9AZS1zemlnbm8uaHWkdzB1MSMw\ IQYDVQQDDBpNaWNyb3NlYyBlLVN6aWduw7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhT\ WjEWMBQGA1UEChMNTWljcm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhV\ MIGsBgNVHSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJIVTER\ MA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDASBgNVBAsTC2UtU3pp\ Z25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBSb290IENBghEAzLjnv04pGv2i3Gal\ HCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMT\ nGZjWS7KXHAM/IO8VbH0jgdsZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FE\ aGAHQzAxQmHl7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a\ 86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfRhUZLphK3dehK\ yVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/MPMMNz7UwiiAc7EBt51alhQB\ S6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU=\ -----END CERTIFICATE-----\ \ Certigna\ ========\ -----BEGIN CERTIFICATE-----\ MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw\ EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3\ MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI\ Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q\ XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH\ GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p\ ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg\ DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf\ Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ\ tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ\ BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J\ SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA\ hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+\ ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu\ PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY\ 1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw\ WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg==\ -----END CERTIFICATE-----\ \ Deutsche Telekom Root CA 2\ ==========================\ -----BEGIN CERTIFICATE-----\ MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT\ RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG\ A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5\ MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G\ A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS\ b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5\ bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI\ KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY\ AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK\ Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV\ jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV\ HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr\ E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy\ zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8\ rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G\ dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU\ Cm26OWMohpLzGITY+9HPBVZkVw==\ -----END CERTIFICATE-----\ \ Cybertrust Global Root\ ======================\ -----BEGIN CERTIFICATE-----\ MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li\ ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4\ MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD\ ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\ +Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW\ 0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL\ AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin\ 89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT\ 8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP\ BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2\ MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G\ A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO\ lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi\ 5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2\ hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T\ X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW\ WL1WMRJOEcgh4LMRkWXbtKaIOM5V\ -----END CERTIFICATE-----\ \ ePKI Root Certification Authority\ =================================\ -----BEGIN CERTIFICATE-----\ MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG\ EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg\ Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx\ MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq\ MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B\ AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs\ IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi\ lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv\ qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX\ 12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O\ WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+\ ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao\ lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/\ vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi\ Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi\ MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH\ ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0\ 1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq\ KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV\ xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP\ NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r\ GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE\ xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx\ gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy\ sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD\ BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw=\ -----END CERTIFICATE-----\ \ T\xc3\x9c\x42\xC4\xB0TAK UEKAE K\xC3\xB6k Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 - S\xC3\xBCr\xC3\xBCm 3\ =============================================================================================================================\ -----BEGIN CERTIFICATE-----\ MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRSMRgwFgYDVQQH\ DA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJpbGltc2VsIHZlIFRla25vbG9q\ aWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSwVEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ry\ b25payB2ZSBLcmlwdG9sb2ppIEFyYcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNV\ BAsMGkthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUg\ S8O2ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAeFw0wNzA4\ MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIxGDAWBgNVBAcMD0dlYnpl\ IC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmHF\ n3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBUQUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZl\ IEtyaXB0b2xvamkgQXJhxZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2Ft\ dSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7ZrIFNl\ cnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIBIjANBgkqhkiG9w0B\ AQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4hgb46ezzb8R1Sf1n68yJMlaCQvEhO\ Eav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yKO7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1\ xnnRFDDtG1hba+818qEhTsXOfJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR\ 6Oqeyjh1jmKwlZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL\ hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQIDAQABo0IwQDAd\ BgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF\ MAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmPNOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4\ N5EY3ATIZJkrGG2AA1nJrvhY0D7twyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLT\ y9LQQfMmNkqblWwM7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYh\ LBOhgLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5noN+J1q2M\ dqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUsyZyQ2uypQjyttgI=\ -----END CERTIFICATE-----\ \ Buypass Class 2 CA 1\ ====================\ -----BEGIN CERTIFICATE-----\ MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU\ QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMiBDQSAxMB4XDTA2\ MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh\ c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZI\ hvcNAQEBBQADggEPADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7M\ cXA0ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLXl18xoS83\ 0r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVBHfCuuCkslFJgNJQ72uA4\ 0Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/R\ uFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNC\ MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0P\ AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLPgcIV\ 1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+DKhQ7SLHrQVMdvvt\ 7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKuBctN518fV4bVIJwo+28TOPX2EZL2\ fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHsh7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5w\ wDX3OaJdZtB7WZ+oRxKaJyOkLY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho\ -----END CERTIFICATE-----\ \ EBG Elektronik Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1\ ==========================================================================\ -----BEGIN CERTIFICATE-----\ MIIF5zCCA8+gAwIBAgIITK9zQhyOdAIwDQYJKoZIhvcNAQEFBQAwgYAxODA2BgNVBAMML0VCRyBF\ bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMTcwNQYDVQQKDC5FQkcg\ QmlsacWfaW0gVGVrbm9sb2ppbGVyaSB2ZSBIaXptZXRsZXJpIEEuxZ4uMQswCQYDVQQGEwJUUjAe\ Fw0wNjA4MTcwMDIxMDlaFw0xNjA4MTQwMDMxMDlaMIGAMTgwNgYDVQQDDC9FQkcgRWxla3Ryb25p\ ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTE3MDUGA1UECgwuRUJHIEJpbGnFn2lt\ IFRla25vbG9qaWxlcmkgdmUgSGl6bWV0bGVyaSBBLsWeLjELMAkGA1UEBhMCVFIwggIiMA0GCSqG\ SIb3DQEBAQUAA4ICDwAwggIKAoICAQDuoIRh0DpqZhAy2DE4f6en5f2h4fuXd7hxlugTlkaDT7by\ X3JWbhNgpQGR4lvFzVcfd2NR/y8927k/qqk153nQ9dAktiHq6yOU/im/+4mRDGSaBUorzAzu8T2b\ gmmkTPiab+ci2hC6X5L8GCcKqKpE+i4stPtGmggDg3KriORqcsnlZR9uKg+ds+g75AxuetpX/dfr\ eYteIAbTdgtsApWjluTLdlHRKJ2hGvxEok3MenaoDT2/F08iiFD9rrbskFBKW5+VQarKD7JK/oCZ\ TqNGFav4c0JqwmZ2sQomFd2TkuzbqV9UIlKRcF0T6kjsbgNs2d1s/OsNA/+mgxKb8amTD8UmTDGy\ Y5lhcucqZJnSuOl14nypqZoaqsNW2xCaPINStnuWt6yHd6i58mcLlEOzrz5z+kI2sSXFCjEmN1Zn\ uqMLfdb3ic1nobc6HmZP9qBVFCVMLDMNpkGMvQQxahByCp0OLna9XvNRiYuoP1Vzv9s6xiQFlpJI\ qkuNKgPlV5EQ9GooFW5Hd4RcUXSfGenmHmMWOeMRFeNYGkS9y8RsZteEBt8w9DeiQyJ50hBs37vm\ ExH8nYQKE3vwO9D8owrXieqWfo1IhR5kX9tUoqzVegJ5a9KK8GfaZXINFHDk6Y54jzJ0fFfy1tb0\ Nokb+Clsi7n2l9GkLqq+CxnCRelwXQIDAJ3Zo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB\ /wQEAwIBBjAdBgNVHQ4EFgQU587GT/wWZ5b6SqMHwQSny2re2kcwHwYDVR0jBBgwFoAU587GT/wW\ Z5b6SqMHwQSny2re2kcwDQYJKoZIhvcNAQEFBQADggIBAJuYml2+8ygjdsZs93/mQJ7ANtyVDR2t\ FcU22NU57/IeIl6zgrRdu0waypIN30ckHrMk2pGI6YNw3ZPX6bqz3xZaPt7gyPvT/Wwp+BVGoGgm\ zJNSroIBk5DKd8pNSe/iWtkqvTDOTLKBtjDOWU/aWR1qeqRFsIImgYZ29fUQALjuswnoT4cCB64k\ XPBfrAowzIpAoHMEwfuJJPaaHFy3PApnNgUIMbOv2AFoKuB4j3TeuFGkjGwgPaL7s9QJ/XvCgKqT\ bCmYIai7FvOpEl90tYeY8pUm3zTvilORiF0alKM/fCL414i6poyWqD1SNGKfAB5UVUJnxk1Gj7sU\ RT0KlhaOEKGXmdXTMIXM3rRyt7yKPBgpaP3ccQfuJDlq+u2lrDgv+R4QDgZxGhBM/nV+/x5XOULK\ 1+EVoVZVWRvRo68R2E7DpSvvkL/A7IITW43WciyTTo9qKd+FPNMN4KIYEsxVL0e3p5sC/kH2iExt\ 2qkBR4NkJ2IQgtYSe14DHzSpyZH+r11thie3I6p1GMog57AP14kOpmciY/SDQSsGS7tY1dHXt7kQ\ Y9iJSrSq3RZj9W6+YKH47ejWkE8axsWgKdOnIaj1Wjz3x0miIZpKlVIglnKaZsv30oZDfCK+lvm9\ AahH3eU7QPl1K5srRmSGjR70j/sHd9DqSaIcjVIUpgqT\ -----END CERTIFICATE-----\ \ certSIGN ROOT CA\ ================\ -----BEGIN CERTIFICATE-----\ MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD\ VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa\ Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE\ CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I\ JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH\ rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2\ ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD\ 0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943\ AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B\ Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB\ AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8\ SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0\ x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt\ vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz\ TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD\ -----END CERTIFICATE-----\ \ CNNIC ROOT\ ==========\ -----BEGIN CERTIFICATE-----\ MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJDTjEOMAwGA1UE\ ChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2MDcwOTE0WhcNMjcwNDE2MDcw\ OTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1Qw\ ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzD\ o+/hn7E7SIX1mlwhIhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tiz\ VHa6dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZOV/kbZKKT\ VrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrCGHn2emU1z5DrvTOTn1Or\ czvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gNv7Sg2Ca+I19zN38m5pIEo3/PIKe38zrK\ y5nLAgMBAAGjczBxMBEGCWCGSAGG+EIBAQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscC\ wQ7vptU7ETAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991S\ lgrHAsEO76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnKOOK5\ Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvHugDnuL8BV8F3RTIM\ O/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7HgviyJA/qIYM/PmLXoXLT1tLYhFHxUV8\ BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fLbuXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2\ G8kS1sHNzYDzAgE8yGnLRUhj2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5m\ mxE=\ -----END CERTIFICATE-----\ \ ApplicationCA - Japanese Government\ ===================================\ -----BEGIN CERTIFICATE-----\ MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEcMBoGA1UEChMT\ SmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRpb25DQTAeFw0wNzEyMTIxNTAw\ MDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYTAkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zl\ cm5tZW50MRYwFAYDVQQLEw1BcHBsaWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB\ CgKCAQEAp23gdE6Hj6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4\ fl+Kf5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55IrmTwcrN\ wVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cwFO5cjFW6WY2H/CPek9AE\ jP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDihtQWEjdnjDuGWk81quzMKq2edY3rZ+nYVu\ nyoKb58DKTCXKB28t89UKU5RMfkntigm/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRU\ WssmP3HMlEYNllPqa0jQk/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNV\ BAYTAkpQMRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOCseOD\ vOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADlqRHZ3ODrs\ o2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJhyzjVOGjprIIC8CFqMjSnHH2HZ9g\ /DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYD\ io+nEhEMy/0/ecGc/WLuo89UDNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmW\ dupwX3kSa+SjB1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL\ rosot4LKGAfmt1t06SAZf7IbiVQ=\ -----END CERTIFICATE-----\ \ GeoTrust Primary Certification Authority - G3\ =============================================\ -----BEGIN CERTIFICATE-----\ MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE\ BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0\ IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy\ eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz\ NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo\ YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT\ LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI\ hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j\ K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE\ c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C\ IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu\ dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC\ MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr\ 2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9\ cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE\ Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD\ AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s\ t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt\ -----END CERTIFICATE-----\ \ thawte Primary Root CA - G2\ ===========================\ -----BEGIN CERTIFICATE-----\ MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC\ VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu\ IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg\ Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV\ MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG\ b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt\ IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS\ LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5\ 8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU\ mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN\ G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K\ rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg==\ -----END CERTIFICATE-----\ \ thawte Primary Root CA - G3\ ===========================\ -----BEGIN CERTIFICATE-----\ MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE\ BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2\ aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv\ cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w\ ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh\ d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD\ VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG\ A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A\ MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At\ P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC\ +BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY\ 7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW\ vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E\ BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ\ KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK\ A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu\ t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC\ 8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm\ er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A=\ -----END CERTIFICATE-----\ \ GeoTrust Primary Certification Authority - G2\ =============================================\ -----BEGIN CERTIFICATE-----\ MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC\ VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu\ Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD\ ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1\ OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg\ MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl\ b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG\ BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc\ KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD\ VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+\ EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m\ ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2\ npaqBA+K\ -----END CERTIFICATE-----\ \ VeriSign Universal Root Certification Authority\ ===============================================\ -----BEGIN CERTIFICATE-----\ MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE\ BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO\ ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk\ IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u\ IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV\ UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv\ cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl\ IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0\ aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj\ 1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP\ MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72\ 9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I\ AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR\ tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G\ CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O\ a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud\ DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3\ Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx\ Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx\ P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P\ wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4\ mJO37M2CYfE45k+XmCpajQ==\ -----END CERTIFICATE-----\ \ VeriSign Class 3 Public Primary Certification Authority - G4\ ============================================================\ -----BEGIN CERTIFICATE-----\ MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC\ VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3\ b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz\ ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj\ YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL\ MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU\ cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo\ b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5\ IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8\ Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz\ rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB\ /zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw\ HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u\ Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD\ A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx\ AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA==\ -----END CERTIFICATE-----\ \ NetLock Arany (Class Gold) Főtanúsítvány\ ============================================\ -----BEGIN CERTIFICATE-----\ MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G\ A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610\ dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB\ cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx\ MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO\ ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv\ biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6\ c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu\ 0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw\ /HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk\ H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw\ fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1\ neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB\ BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW\ qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta\ YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC\ bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna\ NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu\ dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E=\ -----END CERTIFICATE-----\ \ Staat der Nederlanden Root CA - G2\ ==================================\ -----BEGIN CERTIFICATE-----\ MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE\ CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g\ Um9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oXDTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMC\ TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l\ ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ\ 5291qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8SpuOUfiUtn\ vWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPUZ5uW6M7XxgpT0GtJlvOj\ CwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvEpMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiil\ e7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCR\ OME4HYYEhLoaJXhena/MUGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpI\ CT0ugpTNGmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy5V65\ 48r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv6q012iDTiIJh8BIi\ trzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEKeN5KzlW/HdXZt1bv8Hb/C3m1r737\ qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMB\ AAGjgZcwgZQwDwYDVR0TAQH/BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcC\ ARYxaHR0cDovL3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV\ HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqGSIb3DQEBCwUA\ A4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLySCZa59sCrI2AGeYwRTlHSeYAz\ +51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwj\ f/ST7ZwaUb7dRUG/kSS0H4zpX897IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaN\ kqbG9AclVMwWVxJKgnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfk\ CpYL+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxLvJxxcypF\ URmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkmbEgeqmiSBeGCc1qb3Adb\ CG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvkN1trSt8sV4pAWja63XVECDdCcAz+3F4h\ oKOKwJCcaNpQ5kUQR3i2TtJlycM33+FCY7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoV\ IPVVYpbtbZNQvOSqeK3Zywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm\ 66+KAQ==\ -----END CERTIFICATE-----\ \ CA Disig\ ========\ -----BEGIN CERTIFICATE-----\ MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMK\ QnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwHhcNMDYw\ MzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlz\ bGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3\ DQEBAQUAA4IBDwAwggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgm\ GErENx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnXmjxUizkD\ Pw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYDXcDtab86wYqg6I7ZuUUo\ hwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhWS8+2rT+MitcE5eN4TPWGqvWP+j1scaMt\ ymfraHtuM6kMgiioTGohQBUgDCZbg8KpFhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8w\ gfwwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0P\ AQH/BAQDAgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cuZGlz\ aWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5zay9jYS9jcmwvY2Ff\ ZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2svY2EvY3JsL2NhX2Rpc2lnLmNybDAa\ BgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEwDQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59t\ WDYcPQuBDRIrRhCA/ec8J9B6yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3\ mkkp7M5+cTxqEEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/\ CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeBEicTXxChds6K\ ezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFNPGO+I++MzVpQuGhU+QqZMxEA\ 4Z7CRneC9VkGjCFMhwnN5ag=\ -----END CERTIFICATE-----\ \ Juur-SK\ =======\ -----BEGIN CERTIFICATE-----\ MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcNAQkBFglwa2lA\ c2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMRAw\ DgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMwMVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqG\ SIb3DQEJARYJcGtpQHNrLmVlMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVy\ aW1pc2tlc2t1czEQMA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC\ ggEBAIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOBSvZiF3tf\ TQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkzABpTpyHhOEvWgxutr2TC\ +Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvHLCu3GFH+4Hv2qEivbDtPL+/40UceJlfw\ UR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMPPbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDa\ Tpxt4brNj3pssAki14sL2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQF\ MAMBAf8wggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwICMIHD\ HoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDkAGwAagBhAHMAdABh\ AHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0AHMAZQBlAHIAaQBtAGkAcwBrAGUA\ cwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABzAGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABr\ AGkAbgBuAGkAdABhAG0AaQBzAGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nw\ cy8wKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE\ FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcYP2/v6X2+MA4G\ A1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOiCfP+JmeaUOTDBS8rNXiRTHyo\ ERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+gkcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyL\ abVAyJRld/JXIWY7zoVAtjNjGr95HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678\ IIbsSt4beDI3poHSna9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkh\ Mp6qqIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0ZTbvGRNs2\ yyqcjg==\ -----END CERTIFICATE-----\ \ Hongkong Post Root CA 1\ =======================\ -----BEGIN CERTIFICATE-----\ MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT\ DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx\ NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n\ IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF\ AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1\ ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr\ auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh\ qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY\ V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV\ HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i\ h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio\ l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei\ IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps\ T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT\ c4afU9hDDl3WY4JxHYB0yvbiAmvZWg==\ -----END CERTIFICATE-----\ \ SecureSign RootCA11\ ===================\ -----BEGIN CERTIFICATE-----\ MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi\ SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS\ b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw\ KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1\ cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL\ TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO\ wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq\ g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP\ O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA\ bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX\ t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh\ OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r\ bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ\ Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01\ y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061\ lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I=\ -----END CERTIFICATE-----\ \ ACEDICOM Root\ =============\ -----BEGIN CERTIFICATE-----\ MIIFtTCCA52gAwIBAgIIYY3HhjsBggUwDQYJKoZIhvcNAQEFBQAwRDEWMBQGA1UEAwwNQUNFRElD\ T00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMB4XDTA4\ MDQxODE2MjQyMloXDTI4MDQxMzE2MjQyMlowRDEWMBQGA1UEAwwNQUNFRElDT00gUm9vdDEMMAoG\ A1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMIICIjANBgkqhkiG9w0BAQEF\ AAOCAg8AMIICCgKCAgEA/5KV4WgGdrQsyFhIyv2AVClVYyT/kGWbEHV7w2rbYgIB8hiGtXxaOLHk\ WLn709gtn70yN78sFW2+tfQh0hOR2QetAQXW8713zl9CgQr5auODAKgrLlUTY4HKRxx7XBZXehuD\ YAQ6PmXDzQHe3qTWDLqO3tkE7hdWIpuPY/1NFgu3e3eM+SW10W2ZEi5PGrjm6gSSrj0RuVFCPYew\ MYWveVqc/udOXpJPQ/yrOq2lEiZmueIM15jO1FillUAKt0SdE3QrwqXrIhWYENiLxQSfHY9g5QYb\ m8+5eaA9oiM/Qj9r+hwDezCNzmzAv+YbX79nuIQZ1RXve8uQNjFiybwCq0Zfm/4aaJQ0PZCOrfbk\ HQl/Sog4P75n/TSW9R28MHTLOO7VbKvU/PQAtwBbhTIWdjPp2KOZnQUAqhbm84F9b32qhm2tFXTT\ xKJxqvQUfecyuB+81fFOvW8XAjnXDpVCOscAPukmYxHqC9FK/xidstd7LzrZlvvoHpKuE1XI2Sf2\ 3EgbsCTBheN3nZqk8wwRHQ3ItBTutYJXCb8gWH8vIiPYcMt5bMlL8qkqyPyHK9caUPgn6C9D4zq9\ 2Fdx/c6mUlv53U3t5fZvie27k5x2IXXwkkwp9y+cAS7+UEaeZAwUswdbxcJzbPEHXEUkFDWug/Fq\ TYl6+rPYLWbwNof1K1MCAwEAAaOBqjCBpzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKaz\ 4SsrSbbXc6GqlPUB53NlTKxQMA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUprPhKytJttdzoaqU\ 9QHnc2VMrFAwRAYDVR0gBD0wOzA5BgRVHSAAMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly9hY2VkaWNv\ bS5lZGljb21ncm91cC5jb20vZG9jMA0GCSqGSIb3DQEBBQUAA4ICAQDOLAtSUWImfQwng4/F9tqg\ aHtPkl7qpHMyEVNEskTLnewPeUKzEKbHDZ3Ltvo/Onzqv4hTGzz3gvoFNTPhNahXwOf9jU8/kzJP\ eGYDdwdY6ZXIfj7QeQCM8htRM5u8lOk6e25SLTKeI6RF+7YuE7CLGLHdztUdp0J/Vb77W7tH1Pwk\ zQSulgUV1qzOMPPKC8W64iLgpq0i5ALudBF/TP94HTXa5gI06xgSYXcGCRZj6hitoocf8seACQl1\ ThCojz2GuHURwCRiipZ7SkXp7FnFvmuD5uHorLUwHv4FB4D54SMNUI8FmP8sX+g7tq3PgbUhh8oI\ KiMnMCArz+2UW6yyetLHKKGKC5tNSixthT8Jcjxn4tncB7rrZXtaAWPWkFtPF2Y9fwsZo5NjEFIq\ nxQWWOLcpfShFosOkYuByptZ+thrkQdlVV9SH686+5DdaaVbnG0OLLb6zqylfDJKZ0DcMDQj3dcE\ I2bw/FWAp/tmGYI1Z2JwOV5vx+qQQEQIHriy1tvuWacNGHk0vFQYXlPKNFHtRQrmjseCNj6nOGOp\ MCwXEGCSn1WHElkQwg9naRHMTh5+Spqtr0CodaxWkHS4oJyleW/c6RrIaQXpuvoDs3zk4E7Czp3o\ tkYNbn5XOmeUwssfnHdKZ05phkOTOPu220+DkdRgfks+KzgHVZhepA==\ -----END CERTIFICATE-----\ \ Microsec e-Szigno Root CA 2009\ ==============================\ -----BEGIN CERTIFICATE-----\ MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER\ MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv\ c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o\ dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE\ BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt\ U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw\ DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA\ fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG\ 0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA\ pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm\ 1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC\ AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf\ QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE\ FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o\ lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX\ I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775\ tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02\ yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi\ LXpUq3DDfSJlgnCW\ -----END CERTIFICATE-----\ \ GlobalSign Root CA - R3\ =======================\ -----BEGIN CERTIFICATE-----\ MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv\ YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh\ bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT\ aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln\ bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt\ iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ\ 0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3\ rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl\ OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2\ xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE\ FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7\ lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8\ EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E\ bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18\ YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r\ kpeDMdmztcpHWD9f\ -----END CERTIFICATE-----\ \ Autoridad de Certificacion Firmaprofesional CIF A62634068\ =========================================================\ -----BEGIN CERTIFICATE-----\ MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA\ BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2\ MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw\ QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB\ NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD\ Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P\ B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY\ 7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH\ ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI\ plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX\ MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX\ LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK\ bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU\ vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud\ EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH\ DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp\ cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA\ bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx\ ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx\ 51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk\ R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP\ T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f\ Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl\ osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR\ crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR\ saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD\ KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi\ 6Et8Vcad+qMUu2WFbm5PEn4KPJ2V\ -----END CERTIFICATE-----\ \ Izenpe.com\ ==========\ -----BEGIN CERTIFICATE-----\ MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4MQswCQYDVQQG\ EwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wHhcNMDcxMjEz\ MTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMu\ QS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ\ 03rKDx6sp4boFmVqscIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAK\ ClaOxdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6HLmYRY2xU\ +zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFXuaOKmMPsOzTFlUFpfnXC\ PCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQDyCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxT\ OTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbK\ F7jJeodWLBoBHmy+E60QrLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK\ 0GqfvEyNBjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8Lhij+\ 0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIBQFqNeb+Lz0vPqhbB\ leStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+HMh3/1uaD7euBUbl8agW7EekFwID\ AQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2luZm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+\ SVpFTlBFIFMuQS4gLSBDSUYgQTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBG\ NjIgUzgxQzBBBgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx\ MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O\ BBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUAA4ICAQB4pgwWSp9MiDrAyw6l\ Fn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWblaQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbga\ kEyrkgPH7UIBzg/YsfqikuFgba56awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8q\ hT/AQKM6WfxZSzwoJNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Cs\ g1lwLDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCTVyvehQP5\ aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGkLhObNA5me0mrZJfQRsN5\ nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJbUjWumDqtujWTI6cfSN01RpiyEGjkpTHC\ ClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZo\ Q0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z\ WrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw==\ -----END CERTIFICATE-----\ \ Chambers of Commerce Root - 2008\ ================================\ -----BEGIN CERTIFICATE-----\ MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD\ MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv\ bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu\ QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy\ Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl\ ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF\ EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl\ cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC\ AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA\ XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj\ h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/\ ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk\ NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g\ D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331\ lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ\ 0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj\ ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2\ EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI\ G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ\ BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh\ bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh\ bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC\ CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH\ AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1\ wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH\ 3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU\ RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6\ M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1\ YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF\ 9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK\ zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG\ nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg\ OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ\ -----END CERTIFICATE-----\ \ Global Chambersign Root - 2008\ ==============================\ -----BEGIN CERTIFICATE-----\ MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD\ MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv\ bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu\ QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx\ NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg\ Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ\ QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD\ aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf\ VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf\ XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0\ ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB\ /gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA\ TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M\ H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe\ Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF\ HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh\ wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB\ AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT\ BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE\ BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm\ aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm\ aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp\ 1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0\ dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG\ /5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6\ ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s\ dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg\ 9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH\ foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du\ qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr\ P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq\ c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z\ 09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B\ -----END CERTIFICATE-----\ \ Go Daddy Root Certificate Authority - G2\ ========================================\ -----BEGIN CERTIFICATE-----\ MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT\ B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu\ MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5\ MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6\ b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G\ A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI\ hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq\ 9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD\ +qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd\ fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl\ NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC\ MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9\ BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac\ vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r\ 5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV\ N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO\ LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1\ -----END CERTIFICATE-----\ \ Starfield Root Certificate Authority - G2\ =========================================\ -----BEGIN CERTIFICATE-----\ MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT\ B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s\ b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0\ eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw\ DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg\ VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB\ dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv\ W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs\ bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk\ N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf\ ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU\ JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC\ AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol\ TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx\ 4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw\ F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K\ pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ\ c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0\ -----END CERTIFICATE-----\ \ Starfield Services Root Certificate Authority - G2\ ==================================================\ -----BEGIN CERTIFICATE-----\ MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT\ B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s\ b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl\ IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV\ BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT\ dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg\ Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC\ AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2\ h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa\ hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP\ LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB\ rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw\ AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG\ SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP\ E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy\ xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd\ iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza\ YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6\ -----END CERTIFICATE-----\ \ AffirmTrust Commercial\ ======================\ -----BEGIN CERTIFICATE-----\ MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS\ BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw\ MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly\ bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF\ AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb\ DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV\ C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6\ BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww\ MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV\ HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC\ AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG\ hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi\ qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv\ 0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh\ sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8=\ -----END CERTIFICATE-----\ \ AffirmTrust Networking\ ======================\ -----BEGIN CERTIFICATE-----\ MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS\ BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw\ MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly\ bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF\ AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE\ Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI\ dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24\ /PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb\ h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV\ HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC\ AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu\ UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6\ 12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23\ WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9\ /ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s=\ -----END CERTIFICATE-----\ \ AffirmTrust Premium\ ===================\ -----BEGIN CERTIFICATE-----\ MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS\ BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy\ OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy\ dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A\ MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn\ BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV\ 5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs\ +7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd\ GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R\ p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI\ S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04\ 6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5\ /bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo\ +Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB\ /wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv\ MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg\ Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC\ 6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S\ L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK\ +4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV\ BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg\ IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60\ g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb\ zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw==\ -----END CERTIFICATE-----\ \ AffirmTrust Premium ECC\ =======================\ -----BEGIN CERTIFICATE-----\ MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV\ BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx\ MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U\ cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA\ IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ\ N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW\ BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK\ BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X\ 57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM\ eQ==\ -----END CERTIFICATE-----\ \ Certum Trusted Network CA\ =========================\ -----BEGIN CERTIFICATE-----\ MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK\ ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv\ biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy\ MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU\ ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5\ MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC\ AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC\ l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J\ J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4\ fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0\ cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB\ Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw\ DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj\ jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1\ mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj\ Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI\ 03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw=\ -----END CERTIFICATE-----\ \ Certinomis - Autorité Racine\ =============================\ -----BEGIN CERTIFICATE-----\ MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjETMBEGA1UEChMK\ Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAkBgNVBAMMHUNlcnRpbm9taXMg\ LSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkG\ A1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYw\ JAYDVQQDDB1DZXJ0aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQAD\ ggIPADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jYF1AMnmHa\ wE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N8y4oH3DfVS9O7cdxbwly\ Lu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWerP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw\ 2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92N\ jMD2AR5vpTESOH2VwnHu7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9q\ c1pkIuVC28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6lSTC\ lrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1Enn1So2+WLhl+HPNb\ xxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB0iSVL1N6aaLwD4ZFjliCK0wi1F6g\ 530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql095gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna\ 4NH4+ej9Uji29YnfAgMBAAGjWzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G\ A1UdDgQWBBQNjLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ\ KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9sov3/4gbIOZ/x\ WqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZMOH8oMDX/nyNTt7buFHAAQCva\ R6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40\ nJ+U8/aGH88bc62UeYdocMMzpXDn2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1B\ CxMjidPJC+iKunqjo3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjv\ JL1vnxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG5ERQL1TE\ qkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWqpdEdnV1j6CTmNhTih60b\ WfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZbdsLLO7XSAPCjDuGtbkD326C00EauFddE\ wk01+dIL8hf2rGbVJLJP0RyZwG71fet0BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/\ vgt2Fl43N+bYdJeimUV5\ -----END CERTIFICATE-----\ \ Root CA Generalitat Valenciana\ ==============================\ -----BEGIN CERTIFICATE-----\ MIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJFUzEfMB0GA1UE\ ChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290\ IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcNMDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3\ WjBoMQswCQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UE\ CxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0G\ CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+WmmmO3I2\ F0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKjSgbwJ/BXufjpTjJ3Cj9B\ ZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGlu6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQ\ D0EbtFpKd71ng+CT516nDOeB0/RSrFOyA8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXte\ JajCq+TA81yc477OMUxkHl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMB\ AAGjggM7MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBraS5n\ dmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIICIwYKKwYBBAG/VQIB\ ADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBl\ AHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIAYQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIA\ YQBsAGkAdABhAHQAIABWAGEAbABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQBy\ AGEAYwBpAPMAbgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA\ aQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMAaQBvAG4AYQBt\ AGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQAZQAgAEEAdQB0AG8AcgBpAGQA\ YQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBu\ AHQAcgBhACAAZQBuACAAbABhACAAZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAA\ OgAvAC8AdwB3AHcALgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0\ dHA6Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+yeAT8MIGV\ BgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQswCQYDVQQGEwJFUzEfMB0G\ A1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5S\ b290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRh\ TvW1yEICKrNcda3FbcrnlD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdz\ Ckj+IHLtb8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg9J63\ NI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XFducTZnV+ZfsBn5OH\ iJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmCIoaZM3Fa6hlXPZHNqcCjbgcTpsnt\ +GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM=\ -----END CERTIFICATE-----\ \ TWCA Root Certification Authority\ =================================\ -----BEGIN CERTIFICATE-----\ MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ\ VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh\ dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG\ EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB\ IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK\ AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx\ QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC\ oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP\ 4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r\ y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB\ BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG\ 9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC\ mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW\ QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY\ T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny\ Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw==\ -----END CERTIFICATE-----\ \ Security Communication RootCA2\ ==============================\ -----BEGIN CERTIFICATE-----\ MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc\ U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh\ dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC\ SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy\ aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB\ ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++\ +T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R\ 3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV\ spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K\ EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8\ QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB\ CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj\ u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk\ 3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q\ tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29\ mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03\ -----END CERTIFICATE-----\ \ EC-ACC\ ======\ -----BEGIN CERTIFICATE-----\ MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE\ BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w\ ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD\ VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE\ CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT\ BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7\ MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt\ SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl\ Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh\ cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND\ MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK\ w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT\ ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4\ HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a\ E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw\ 0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E\ BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD\ VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0\ Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l\ dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ\ lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa\ Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe\ l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2\ E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D\ 5EI=\ -----END CERTIFICATE-----\ \ Hellenic Academic and Research Institutions RootCA 2011\ =======================================================\ -----BEGIN CERTIFICATE-----\ MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT\ O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y\ aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z\ IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT\ AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z\ IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo\ IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB\ AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI\ 1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa\ 71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u\ 8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH\ 3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/\ MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8\ MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu\ b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt\ XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8\ TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD\ /md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N\ 7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4\ -----END CERTIFICATE-----\ \ Actalis Authentication Root CA\ ==============================\ -----BEGIN CERTIFICATE-----\ MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQxDjAM\ BgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UE\ AwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDky\ MjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlz\ IFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290\ IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTufClrJ\ wkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlNAJZa\ by/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45RnijMCO6\ zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1f\ YVEiVRvjRuPjPdA1YprbrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2\ oxgkg4YQ51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2Fbe8l\ EfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxeKF+w6D9Fz8+vm2/7\ hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4Fv6MGn8i1zeQf1xcGDXqVdFUNaBr8\ EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbnfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5\ jF66CyCU3nuDuP/jVo23Eek7jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLY\ iDrIn3hm7YnzezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt\ ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQALe3KHwGCmSUyI\ WOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70jsNjLiNmsGe+b7bAEzlgqqI0\ JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDzWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKx\ K3JCaKygvU5a2hi/a5iB0P2avl4VSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+\ Xlff1ANATIGk0k9jpwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC\ 4yyXX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+OkfcvHlXHo\ 2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7RK4X9p2jIugErsWx0Hbhz\ lefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btUZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXem\ OR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9\ vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg==\ -----END CERTIFICATE-----\ \ Trustis FPS Root CA\ ===================\ -----BEGIN CERTIFICATE-----\ MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQG\ EwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQLExNUcnVzdGlzIEZQUyBSb290\ IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTExMzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNV\ BAoTD1RydXN0aXMgTGltaXRlZDEcMBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJ\ KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQ\ RUN+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihHiTHcDnlk\ H5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjjvSkCqPoc4Vu5g6hBSLwa\ cY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zt\ o3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlBOrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEA\ AaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAd\ BgNVHQ4EFgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01GX2c\ GE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmWzaD+vkAMXBJV+JOC\ yinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP41BIy+Q7DsdwyhEQsb8tGD+pmQQ9P\ 8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZEf1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHV\ l/9D7S3B2l0pKoU/rGXuhg8FjZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYl\ iB6XzCGcKQENZetX2fNXlrtIzYE=\ -----END CERTIFICATE-----\ \ StartCom Certification Authority\ ================================\ -----BEGIN CERTIFICATE-----\ MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN\ U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu\ ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0\ NjM3WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk\ LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg\ U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw\ ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y\ o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/\ Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d\ eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt\ 2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z\ 6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ\ osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/\ untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc\ UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT\ 37uMdBNSSwIDAQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD\ VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFulF2mHMMo0aEPQ\ Qa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCCATgwLgYIKwYBBQUHAgEWImh0\ dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cu\ c3RhcnRzc2wuY29tL2ludGVybWVkaWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENv\ bW1lcmNpYWwgKFN0YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0\ aGUgc2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0aWZpY2F0\ aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3RhcnRzc2wuY29t\ L3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBG\ cmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5\ fPGFf59Jb2vKXfuM/gTFwWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWm\ N3PH/UvSTa0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst0OcN\ Org+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNcpRJvkrKTlMeIFw6T\ tn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKlCcWw0bdT82AUuoVpaiF8H3VhFyAX\ e2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVFP0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA\ 2MFrLH9ZXF2RsXAiV+uKa0hK1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBs\ HvUwyKMQ5bLmKhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE\ JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ8dCAWZvLMdib\ D4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnmfyWl8kgAwKQB2j8=\ -----END CERTIFICATE-----\ \ StartCom Certification Authority G2\ ===================================\ -----BEGIN CERTIFICATE-----\ MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMN\ U3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg\ RzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UE\ ChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3Jp\ dHkgRzIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8O\ o1XJJZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsDvfOpL9HG\ 4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnooD/Uefyf3lLE3PbfHkffi\ Aez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/Q0kGi4xDuFby2X8hQxfqp0iVAXV16iul\ Q5XqFYSdCI0mblWbq9zSOdIxHWDirMxWRST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbs\ O+wmETRIjfaAKxojAuuKHDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8H\ vKTlXcxNnw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM0D4L\ nMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/iUUjXuG+v+E5+M5iS\ FGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9Ha90OrInwMEePnWjFqmveiJdnxMa\ z6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHgTuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8E\ BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJ\ KoZIhvcNAQELBQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K\ 2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfXUfEpY9Z1zRbk\ J4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl6/2o1PXWT6RbdejF0mCy2wl+\ JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG\ /+gyRr61M3Z3qAFdlsHB1b6uJcDJHgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTc\ nIhT76IxW1hPkWLIwpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/Xld\ blhYXzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5lIxKVCCIc\ l85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoohdVddLHRDiBYmxOlsGOm\ 7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulrso8uBtjRkcfGEvRM/TAXw8HaOFvjqerm\ obp573PYtlNXLfbQ4ddI\ -----END CERTIFICATE-----\ \ Buypass Class 2 Root CA\ =======================\ -----BEGIN CERTIFICATE-----\ MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU\ QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X\ DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1\ eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw\ DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1\ g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn\ 9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b\ /+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU\ CqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff\ awrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI\ zRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn\ Bkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX\ Uq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs\ M+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD\ VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF\ AAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s\ A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI\ osHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S\ aq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd\ DnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD\ LfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0\ oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC\ wWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS\ CTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN\ rJgWVqA=\ -----END CERTIFICATE-----\ \ Buypass Class 3 Root CA\ =======================\ -----BEGIN CERTIFICATE-----\ MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU\ QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X\ DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1\ eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw\ DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH\ sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR\ 5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh\ 7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ\ ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH\ 2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV\ /afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ\ RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA\ Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq\ j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD\ VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF\ AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV\ cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G\ uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG\ Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8\ ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2\ KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz\ 6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug\ UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe\ eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi\ Cp/HuZc=\ -----END CERTIFICATE-----\ \ T-TeleSec GlobalRoot Class 3\ ============================\ -----BEGIN CERTIFICATE-----\ MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM\ IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU\ cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx\ MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz\ dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD\ ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3\ DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK\ 9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU\ NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF\ iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W\ 0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA\ MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr\ AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb\ fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT\ ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h\ P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml\ e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw==\ -----END CERTIFICATE-----\ \ EE Certification Centre Root CA\ ===============================\ -----BEGIN CERTIFICATE-----\ MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG\ EwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2Vy\ dGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIw\ MTAxMDMwMTAxMDMwWhgPMjAzMDEyMTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlB\ UyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRy\ ZSBSb290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IB\ DwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUyeuuOF0+W2Ap7kaJjbMeM\ TC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvObntl8jixwKIy72KyaOBhU8E2lf/slLo2\ rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIwWFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw\ 93X2PaRka9ZP585ArQ/dMtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtN\ P2MbRMNE1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYDVR0T\ AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/zQas8fElyalL1BSZ\ MEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEF\ BQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEFBQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+Rj\ xY6hUFaTlrg4wCQiZrxTFGGVv9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqM\ lIpPnTX/dqQGE5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u\ uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU\ 3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfM\ dcGWxZ0=\ -----END CERTIFICATE-----\ \ TURKTRUST Certificate Services Provider Root 2007\ =================================================\ -----BEGIN CERTIFICATE-----\ MIIEPTCCAyWgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvzE/MD0GA1UEAww2VMOcUktUUlVTVCBF\ bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP\ MA0GA1UEBwwGQW5rYXJhMV4wXAYDVQQKDFVUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg\ QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgQXJhbMSxayAyMDA3MB4X\ DTA3MTIyNTE4MzcxOVoXDTE3MTIyMjE4MzcxOVowgb8xPzA9BgNVBAMMNlTDnFJLVFJVU1QgRWxl\ a3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTELMAkGA1UEBhMCVFIxDzAN\ BgNVBAcMBkFua2FyYTFeMFwGA1UECgxVVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp\ bGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7Fni4gKGMpIEFyYWzEsWsgMjAwNzCCASIw\ DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKu3PgqMyKVYFeaK7yc9SrToJdPNM8Ig3BnuiD9N\ YvDdE3ePYakqtdTyuTFYKTsvP2qcb3N2Je40IIDu6rfwxArNK4aUyeNgsURSsloptJGXg9i3phQv\ KUmi8wUG+7RP2qFsmmaf8EMJyupyj+sA1zU511YXRxcw9L6/P8JorzZAwan0qafoEGsIiveGHtya\ KhUG9qPw9ODHFNRRf8+0222vR5YXm3dx2KdxnSQM9pQ/hTEST7ruToK4uT6PIzdezKKqdfcYbwnT\ rqdUKDT74eA7YH2gvnmJhsifLfkKS8RQouf9eRbHegsYz85M733WB2+Y8a+xwXrXgTW4qhe04MsC\ AwEAAaNCMEAwHQYDVR0OBBYEFCnFkKslrxHkYb+j/4hhkeYO/pyBMA4GA1UdDwEB/wQEAwIBBjAP\ BgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAQDdr4Ouwo0RSVgrESLFF6QSU2TJ/s\ Px+EnWVUXKgWAkD6bho3hO9ynYYKVZ1WKKxmLNA6VpM0ByWtCLCPyA8JWcqdmBzlVPi5RX9ql2+I\ aE1KBiY3iAIOtsbWcpnOa3faYjGkVh+uX4132l32iPwa2Z61gfAyuOOI0JzzaqC5mxRZNTZPz/OO\ Xl0XrRWV2N2y1RVuAE6zS89mlOTgzbUF2mNXi+WzqtvALhyQRNsaXRik7r4EW5nVcV9VZWRi1aKb\ BFmGyGJ353yCRWo9F7/snXUMrqNvWtMvmDb08PUZqxFdyKbjKlhqQgnDvZImZjINXQhVdP+MmNAK\ poRq0Tl9\ -----END CERTIFICATE-----\ \ D-TRUST Root Class 3 CA 2 2009\ ==============================\ -----BEGIN CERTIFICATE-----\ MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQK\ DAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTAe\ Fw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NThaME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxE\ LVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIw\ DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOAD\ ER03UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42tSHKXzlA\ BF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9RySPocq60vFYJfxLLHLGv\ KZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsMlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7z\ p+hnUquVH+BGPtikw8paxTGA6Eian5Rp/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUC\ AwEAAaOCARowggEWMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ\ 4PGEMA4GA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVjdG9y\ eS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUyMENBJTIwMiUyMDIw\ MDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRlcmV2b2NhdGlvbmxpc3QwQ6BBoD+G\ PWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAw\ OS5jcmwwDQYJKoZIhvcNAQELBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm\ 2H6NMLVwMeniacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0\ o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4KzCUqNQT4YJEV\ dT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8PIWmawomDeCTmGCufsYkl4ph\ X5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3YJohw1+qRzT65ysCQblrGXnRl11z+o+I=\ -----END CERTIFICATE-----\ \ D-TRUST Root Class 3 CA 2 EV 2009\ =================================\ -----BEGIN CERTIFICATE-----\ MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK\ DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw\ OTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUwNDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK\ DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw\ OTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfS\ egpnljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM03TP1YtHh\ zRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6ZqQTMFexgaDbtCHu39b+T\ 7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lRp75mpoo6Kr3HGrHhFPC+Oh25z1uxav60\ sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure35\ 11H3a6UCAwEAAaOCASQwggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyv\ cop9NteaHNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFwOi8v\ ZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xhc3MlMjAzJTIwQ0El\ MjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1ERT9jZXJ0aWZpY2F0ZXJldm9jYXRp\ b25saXN0MEagRKBChkBodHRwOi8vd3d3LmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xh\ c3NfM19jYV8yX2V2XzIwMDkuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+\ PPoeUSbrh/Yp3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05\ nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNFCSuGdXzfX2lX\ ANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7naxpeG0ILD5EJt/rDiZE4OJudA\ NCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqXKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVv\ w9y4AyHqnxbxLFS1\ -----END CERTIFICATE-----\ \ PSCProcert\ ==========\ -----BEGIN CERTIFICATE-----\ MIIJhjCCB26gAwIBAgIBCzANBgkqhkiG9w0BAQsFADCCAR4xPjA8BgNVBAMTNUF1dG9yaWRhZCBk\ ZSBDZXJ0aWZpY2FjaW9uIFJhaXogZGVsIEVzdGFkbyBWZW5lem9sYW5vMQswCQYDVQQGEwJWRTEQ\ MA4GA1UEBxMHQ2FyYWNhczEZMBcGA1UECBMQRGlzdHJpdG8gQ2FwaXRhbDE2MDQGA1UEChMtU2lz\ dGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMUMwQQYDVQQLEzpTdXBl\ cmludGVuZGVuY2lhIGRlIFNlcnZpY2lvcyBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMSUw\ IwYJKoZIhvcNAQkBFhZhY3JhaXpAc3VzY2VydGUuZ29iLnZlMB4XDTEwMTIyODE2NTEwMFoXDTIw\ MTIyNTIzNTk1OVowgdExJjAkBgkqhkiG9w0BCQEWF2NvbnRhY3RvQHByb2NlcnQubmV0LnZlMQ8w\ DQYDVQQHEwZDaGFjYW8xEDAOBgNVBAgTB01pcmFuZGExKjAoBgNVBAsTIVByb3ZlZWRvciBkZSBD\ ZXJ0aWZpY2Fkb3MgUFJPQ0VSVDE2MDQGA1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZp\ Y2FjaW9uIEVsZWN0cm9uaWNhMQswCQYDVQQGEwJWRTETMBEGA1UEAxMKUFNDUHJvY2VydDCCAiIw\ DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANW39KOUM6FGqVVhSQ2oh3NekS1wwQYalNo97BVC\ wfWMrmoX8Yqt/ICV6oNEolt6Vc5Pp6XVurgfoCfAUFM+jbnADrgV3NZs+J74BCXfgI8Qhd19L3uA\ 3VcAZCP4bsm+lU/hdezgfl6VzbHvvnpC2Mks0+saGiKLt38GieU89RLAu9MLmV+QfI4tL3czkkoh\ RqipCKzx9hEC2ZUWno0vluYC3XXCFCpa1sl9JcLB/KpnheLsvtF8PPqv1W7/U0HU9TI4seJfxPmO\ EO8GqQKJ/+MMbpfg353bIdD0PghpbNjU5Db4g7ayNo+c7zo3Fn2/omnXO1ty0K+qP1xmk6wKImG2\ 0qCZyFSTXai20b1dCl53lKItwIKOvMoDKjSuc/HUtQy9vmebVOvh+qBa7Dh+PsHMosdEMXXqP+UH\ 0quhJZb25uSgXTcYOWEAM11G1ADEtMo88aKjPvM6/2kwLkDd9p+cJsmWN63nOaK/6mnbVSKVUyqU\ td+tFjiBdWbjxywbk5yqjKPK2Ww8F22c3HxT4CAnQzb5EuE8XL1mv6JpIzi4mWCZDlZTOpx+FIyw\ Bm/xhnaQr/2v/pDGj59/i5IjnOcVdo/Vi5QTcmn7K2FjiO/mpF7moxdqWEfLcU8UC17IAggmosvp\ r2uKGcfLFFb14dq12fy/czja+eevbqQ34gcnAgMBAAGjggMXMIIDEzASBgNVHRMBAf8ECDAGAQH/\ AgEBMDcGA1UdEgQwMC6CD3N1c2NlcnRlLmdvYi52ZaAbBgVghl4CAqASDBBSSUYtRy0yMDAwNDAz\ Ni0wMB0GA1UdDgQWBBRBDxk4qpl/Qguk1yeYVKIXTC1RVDCCAVAGA1UdIwSCAUcwggFDgBStuyId\ xuDSAaj9dlBSk+2YwU2u06GCASakggEiMIIBHjE+MDwGA1UEAxM1QXV0b3JpZGFkIGRlIENlcnRp\ ZmljYWNpb24gUmFpeiBkZWwgRXN0YWRvIFZlbmV6b2xhbm8xCzAJBgNVBAYTAlZFMRAwDgYDVQQH\ EwdDYXJhY2FzMRkwFwYDVQQIExBEaXN0cml0byBDYXBpdGFsMTYwNAYDVQQKEy1TaXN0ZW1hIE5h\ Y2lvbmFsIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExQzBBBgNVBAsTOlN1cGVyaW50ZW5k\ ZW5jaWEgZGUgU2VydmljaW9zIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExJTAjBgkqhkiG\ 9w0BCQEWFmFjcmFpekBzdXNjZXJ0ZS5nb2IudmWCAQowDgYDVR0PAQH/BAQDAgEGME0GA1UdEQRG\ MESCDnByb2NlcnQubmV0LnZloBUGBWCGXgIBoAwMClBTQy0wMDAwMDKgGwYFYIZeAgKgEgwQUklG\ LUotMzE2MzUzNzMtNzB2BgNVHR8EbzBtMEagRKBChkBodHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52\ ZS9sY3IvQ0VSVElGSUNBRE8tUkFJWi1TSEEzODRDUkxERVIuY3JsMCOgIaAfhh1sZGFwOi8vYWNy\ YWl6LnN1c2NlcnRlLmdvYi52ZTA3BggrBgEFBQcBAQQrMCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9v\ Y3NwLnN1c2NlcnRlLmdvYi52ZTBBBgNVHSAEOjA4MDYGBmCGXgMBAjAsMCoGCCsGAQUFBwIBFh5o\ dHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9kcGMwDQYJKoZIhvcNAQELBQADggIBACtZ6yKZu4Sq\ T96QxtGGcSOeSwORR3C7wJJg7ODU523G0+1ng3dS1fLld6c2suNUvtm7CpsR72H0xpkzmfWvADmN\ g7+mvTV+LFwxNG9s2/NkAZiqlCxB3RWGymspThbASfzXg0gTB1GEMVKIu4YXx2sviiCtxQuPcD4q\ uxtxj7mkoP3YldmvWb8lK5jpY5MvYB7Eqvh39YtsL+1+LrVPQA3uvFd359m21D+VJzog1eWuq2w1\ n8GhHVnchIHuTQfiSLaeS5UtQbHh6N5+LwUeaO6/u5BlOsju6rEYNxxik6SgMexxbJHmpHmJWhSn\ FFAFTKQAVzAswbVhltw+HoSvOULP5dAssSS830DD7X9jSr3hTxJkhpXzsOfIt+FTvZLm8wyWuevo\ 5pLtp4EJFAv8lXrPj9Y0TzYS3F7RNHXGRoAvlQSMx4bEqCaJqD8Zm4G7UaRKhqsLEQ+xrmNTbSjq\ 3TNWOByyrYDT13K9mmyZY+gAu0F2BbdbmRiKw7gSXFbPVgx96OLP7bx0R/vu0xdOIk9W/1DzLuY5\ poLWccret9W6aAjtmcz9opLLabid+Qqkpj5PkygqYWwHJgD/ll9ohri4zspV4KuxPX+Y1zMOWj3Y\ eMLEYC/HYvBhkdI4sPaeVdtAgAUSM84dkpvRabP/v/GSCmE1P93+hvS84Bpxs2Km\ -----END CERTIFICATE-----\ \ China Internet Network Information Center EV Certificates Root\ ==============================================================\ -----BEGIN CERTIFICATE-----\ MIID9zCCAt+gAwIBAgIESJ8AATANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCQ04xMjAwBgNV\ BAoMKUNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyMUcwRQYDVQQDDD5D\ aGluYSBJbnRlcm5ldCBOZXR3b3JrIEluZm9ybWF0aW9uIENlbnRlciBFViBDZXJ0aWZpY2F0ZXMg\ Um9vdDAeFw0xMDA4MzEwNzExMjVaFw0zMDA4MzEwNzExMjVaMIGKMQswCQYDVQQGEwJDTjEyMDAG\ A1UECgwpQ2hpbmEgSW50ZXJuZXQgTmV0d29yayBJbmZvcm1hdGlvbiBDZW50ZXIxRzBFBgNVBAMM\ PkNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyIEVWIENlcnRpZmljYXRl\ cyBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm35z7r07eKpkQ0H1UN+U8i6y\ jUqORlTSIRLIOTJCBumD1Z9S7eVnAztUwYyZmczpwA//DdmEEbK40ctb3B75aDFk4Zv6dOtouSCV\ 98YPjUesWgbdYavi7NifFy2cyjw1l1VxzUOFsUcW9SxTgHbP0wBkvUCZ3czY28Sf1hNfQYOL+Q2H\ klY0bBoQCxfVWhyXWIQ8hBouXJE0bhlffxdpxWXvayHG1VA6v2G5BY3vbzQ6sm8UY78WO5upKv23\ KzhmBsUs4qpnHkWnjQRmQvaPK++IIGmPMowUc9orhpFjIpryp9vOiYurXccUwVswah+xt54ugQEC\ 7c+WXmPbqOY4twIDAQABo2MwYTAfBgNVHSMEGDAWgBR8cks5x8DbYqVPm6oYNJKiyoOCWTAPBgNV\ HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUfHJLOcfA22KlT5uqGDSSosqD\ glkwDQYJKoZIhvcNAQEFBQADggEBACrDx0M3j92tpLIM7twUbY8opJhJywyA6vPtI2Z1fcXTIWd5\ 0XPFtQO3WKwMVC/GVhMPMdoG52U7HW8228gd+f2ABsqjPWYWqJ1MFn3AlUa1UeTiH9fqBk1jjZaM\ 7+czV0I664zBechNdn3e9rG3geCg+aF4RhcaVpjwTj2rHO3sOdwHSPdj/gauwqRcalsyiMXHM4Ws\ ZkJHwlgkmeHlPuV1LI5D1l08eB6olYIpUNHRFrrvwb562bTYzB5MRuF3sTGrvSrIzo9uoV1/A3U0\ 5K2JRVRevq4opbs/eHnrc7MKDf2+yfdWrPa37S+bISnHOLaVxATywy39FCqQmbkHzJ8=\ -----END CERTIFICATE-----\ \ Swisscom Root CA 2\ ==================\ -----BEGIN CERTIFICATE-----\ MIIF2TCCA8GgAwIBAgIQHp4o6Ejy5e/DfEoeWhhntjANBgkqhkiG9w0BAQsFADBkMQswCQYDVQQG\ EwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2VydGlmaWNhdGUgU2Vy\ dmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3QgQ0EgMjAeFw0xMTA2MjQwODM4MTRaFw0zMTA2\ MjUwNzM4MTRaMGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGln\ aXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAyMIIC\ IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAlUJOhJ1R5tMJ6HJaI2nbeHCOFvErjw0DzpPM\ LgAIe6szjPTpQOYXTKueuEcUMncy3SgM3hhLX3af+Dk7/E6J2HzFZ++r0rk0X2s682Q2zsKwzxNo\ ysjL67XiPS4h3+os1OD5cJZM/2pYmLcX5BtS5X4HAB1f2uY+lQS3aYg5oUFgJWFLlTloYhyxCwWJ\ wDaCFCE/rtuh/bxvHGCGtlOUSbkrRsVPACu/obvLP+DHVxxX6NZp+MEkUp2IVd3Chy50I9AU/SpH\ Wrumnf2U5NGKpV+GY3aFy6//SSj8gO1MedK75MDvAe5QQQg1I3ArqRa0jG6F6bYRzzHdUyYb3y1a\ SgJA/MTAtukxGggo5WDDH8SQjhBiYEQN7Aq+VRhxLKX0srwVYv8c474d2h5Xszx+zYIdkeNL6yxS\ NLCK/RJOlrDrcH+eOfdmQrGrrFLadkBXeyq96G4DsguAhYidDMfCd7Camlf0uPoTXGiTOmekl9Ab\ mbeGMktg2M7v0Ax/lZ9vh0+Hio5fCHyqW/xavqGRn1V9TrALacywlKinh/LTSlDcX3KwFnUey7QY\ Ypqwpzmqm59m2I2mbJYV4+by+PGDYmy7Velhk6M99bFXi08jsJvllGov34zflVEpYKELKeRcVVi3\ qPyZ7iVNTA6z00yPhOgpD/0QVAKFyPnlw4vP5w8CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYw\ HQYDVR0hBBYwFDASBgdghXQBUwIBBgdghXQBUwIBMBIGA1UdEwEB/wQIMAYBAf8CAQcwHQYDVR0O\ BBYEFE0mICKJS9PVpAqhb97iEoHF8TwuMB8GA1UdIwQYMBaAFE0mICKJS9PVpAqhb97iEoHF8Twu\ MA0GCSqGSIb3DQEBCwUAA4ICAQAyCrKkG8t9voJXiblqf/P0wS4RfbgZPnm3qKhyN2abGu2sEzsO\ v2LwnN+ee6FTSA5BesogpxcbtnjsQJHzQq0Qw1zv/2BZf82Fo4s9SBwlAjxnffUy6S8w5X2lejjQ\ 82YqZh6NM4OKb3xuqFp1mrjX2lhIREeoTPpMSQpKwhI3qEAMw8jh0FcNlzKVxzqfl9NX+Ave5XLz\ o9v/tdhZsnPdTSpxsrpJ9csc1fV5yJmz/MFMdOO0vSk3FQQoHt5FRnDsr7p4DooqzgB53MBfGWcs\ a0vvaGgLQ+OswWIJ76bdZWGgr4RVSJFSHMYlkSrQwSIjYVmvRRGFHQEkNI/Ps/8XciATwoCqISxx\ OQ7Qj1zB09GOInJGTB2Wrk9xseEFKZZZ9LuedT3PDTcNYtsmjGOpI99nBjx8Oto0QuFmtEYE3saW\ mA9LSHokMnWRn6z3aOkquVVlzl1h0ydw2Df+n7mvoC5Wt6NlUe07qxS/TFED6F+KBZvuim6c779o\ +sjaC+NCydAXFJy3SuCvkychVSa1ZC+N8f+mQAWFBVzKBxlcCxMoTFh/wqXvRdpg065lYZ1Tg3TC\ rvJcwhbtkj6EPnNgiLx29CzP0H1907he0ZESEOnN3col49XtmS++dYFLJPlFRpTJKSFTnCZFqhMX\ 5OfNeOI5wSsSnqaeG8XmDtkx2Q==\ -----END CERTIFICATE-----\ \ Swisscom Root EV CA 2\ =====================\ -----BEGIN CERTIFICATE-----\ MIIF4DCCA8igAwIBAgIRAPL6ZOJ0Y9ON/RAdBB92ylgwDQYJKoZIhvcNAQELBQAwZzELMAkGA1UE\ BhMCY2gxETAPBgNVBAoTCFN3aXNzY29tMSUwIwYDVQQLExxEaWdpdGFsIENlcnRpZmljYXRlIFNl\ cnZpY2VzMR4wHAYDVQQDExVTd2lzc2NvbSBSb290IEVWIENBIDIwHhcNMTEwNjI0MDk0NTA4WhcN\ MzEwNjI1MDg0NTA4WjBnMQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsT\ HERpZ2l0YWwgQ2VydGlmaWNhdGUgU2VydmljZXMxHjAcBgNVBAMTFVN3aXNzY29tIFJvb3QgRVYg\ Q0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMT3HS9X6lds93BdY7BxUglgRCgz\ o3pOCvrY6myLURYaVa5UJsTMRQdBTxB5f3HSek4/OE6zAMaVylvNwSqD1ycfMQ4jFrclyxy0uYAy\ Xhqdk/HoPGAsp15XGVhRXrwsVgu42O+LgrQ8uMIkqBPHoCE2G3pXKSinLr9xJZDzRINpUKTk4Rti\ GZQJo/PDvO/0vezbE53PnUgJUmfANykRHvvSEaeFGHR55E+FFOtSN+KxRdjMDUN/rhPSays/p8Li\ qG12W0OfvrSdsyaGOx9/5fLoZigWJdBLlzin5M8J0TbDC77aO0RYjb7xnglrPvMyxyuHxuxenPaH\ Za0zKcQvidm5y8kDnftslFGXEBuGCxobP/YCfnvUxVFkKJ3106yDgYjTdLRZncHrYTNaRdHLOdAG\ alNgHa/2+2m8atwBz735j9m9W8E6X47aD0upm50qKGsaCnw8qyIL5XctcfaCNYGu+HuB5ur+rPQa\ m3Rc6I8k9l2dRsQs0h4rIWqDJ2dVSqTjyDKXZpBy2uPUZC5f46Fq9mDU5zXNysRojddxyNMkM3Ox\ bPlq4SjbX8Y96L5V5jcb7STZDxmPX2MYWFCBUWVv8p9+agTnNCRxunZLWB4ZvRVgRaoMEkABnRDi\ xzgHcgplwLa7JSnaFp6LNYth7eVxV4O1PHGf40+/fh6Bn0GXAgMBAAGjgYYwgYMwDgYDVR0PAQH/\ BAQDAgGGMB0GA1UdIQQWMBQwEgYHYIV0AVMCAgYHYIV0AVMCAjASBgNVHRMBAf8ECDAGAQH/AgED\ MB0GA1UdDgQWBBRF2aWBbj2ITY1x0kbBbkUe88SAnTAfBgNVHSMEGDAWgBRF2aWBbj2ITY1x0kbB\ bkUe88SAnTANBgkqhkiG9w0BAQsFAAOCAgEAlDpzBp9SSzBc1P6xXCX5145v9Ydkn+0UjrgEjihL\ j6p7jjm02Vj2e6E1CqGdivdj5eu9OYLU43otb98TPLr+flaYC/NUn81ETm484T4VvwYmneTwkLbU\ wp4wLh/vx3rEUMfqe9pQy3omywC0Wqu1kx+AiYQElY2NfwmTv9SoqORjbdlk5LgpWgi/UOGED1V7\ XwgiG/W9mR4U9s70WBCCswo9GcG/W6uqmdjyMb3lOGbcWAXH7WMaLgqXfIeTK7KK4/HsGOV1timH\ 59yLGn602MnTihdsfSlEvoqq9X46Lmgxk7lq2prg2+kupYTNHAq4Sgj5nPFhJpiTt3tm7JFe3VE/\ 23MPrQRYCd0EApUKPtN236YQHoA96M2kZNEzx5LH4k5E4wnJTsJdhw4Snr8PyQUQ3nqjsTzyP6Wq\ J3mtMX0f/fwZacXduT98zca0wjAefm6S139hdlqP65VNvBFuIXxZN5nQBrz5Bm0yFqXZaajh3DyA\ HmBR3NdUIR7KYndP+tiPsys6DXhyyWhBWkdKwqPrGtcKqzwyVcgKEZzfdNbwQBUdyLmPtTbFr/gi\ uMod89a2GQ+fYWVq6nTIfI/DT11lgh/ZDYnadXL77/FHZxOzyNEZiCcmmpl5fx7kLD977vHeTYuW\ l8PVP3wbI+2ksx0WckNLIOFZfsLorSa/ovc=\ -----END CERTIFICATE-----\ \ CA Disig Root R1\ ================\ -----BEGIN CERTIFICATE-----\ MIIFaTCCA1GgAwIBAgIJAMMDmu5QkG4oMA0GCSqGSIb3DQEBBQUAMFIxCzAJBgNVBAYTAlNLMRMw\ EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp\ ZyBSb290IFIxMB4XDTEyMDcxOTA5MDY1NloXDTQyMDcxOTA5MDY1NlowUjELMAkGA1UEBhMCU0sx\ EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp\ c2lnIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCqw3j33Jijp1pedxiy\ 3QRkD2P9m5YJgNXoqqXinCaUOuiZc4yd39ffg/N4T0Dhf9Kn0uXKE5Pn7cZ3Xza1lK/oOI7bm+V8\ u8yN63Vz4STN5qctGS7Y1oprFOsIYgrY3LMATcMjfF9DCCMyEtztDK3AfQ+lekLZWnDZv6fXARz2\ m6uOt0qGeKAeVjGu74IKgEH3G8muqzIm1Cxr7X1r5OJeIgpFy4QxTaz+29FHuvlglzmxZcfe+5nk\ CiKxLU3lSCZpq+Kq8/v8kiky6bM+TR8noc2OuRf7JT7JbvN32g0S9l3HuzYQ1VTW8+DiR0jm3hTa\ YVKvJrT1cU/J19IG32PK/yHoWQbgCNWEFVP3Q+V8xaCJmGtzxmjOZd69fwX3se72V6FglcXM6pM6\ vpmumwKjrckWtc7dXpl4fho5frLABaTAgqWjR56M6ly2vGfb5ipN0gTco65F97yLnByn1tUD3AjL\ LhbKXEAz6GfDLuemROoRRRw1ZS0eRWEkG4IupZ0zXWX4Qfkuy5Q/H6MMMSRE7cderVC6xkGbrPAX\ ZcD4XW9boAo0PO7X6oifmPmvTiT6l7Jkdtqr9O3jw2Dv1fkCyC2fg69naQanMVXVz0tv/wQFx1is\ XxYb5dKj6zHbHzMVTdDypVP1y+E9Tmgt2BLdqvLmTZtJ5cUoobqwWsagtQIDAQABo0IwQDAPBgNV\ HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUiQq0OJMa5qvum5EY+fU8PjXQ\ 04IwDQYJKoZIhvcNAQEFBQADggIBADKL9p1Kyb4U5YysOMo6CdQbzoaz3evUuii+Eq5FLAR0rBNR\ xVgYZk2C2tXck8An4b58n1KeElb21Zyp9HWc+jcSjxyT7Ff+Bw+r1RL3D65hXlaASfX8MPWbTx9B\ LxyE04nH4toCdu0Jz2zBuByDHBb6lM19oMgY0sidbvW9adRtPTXoHqJPYNcHKfyyo6SdbhWSVhlM\ CrDpfNIZTUJG7L399ldb3Zh+pE3McgODWF3vkzpBemOqfDqo9ayk0d2iLbYq/J8BjuIQscTK5Gfb\ VSUZP/3oNn6z4eGBrxEWi1CXYBmCAMBrTXO40RMHPuq2MU/wQppt4hF05ZSsjYSVPCGvxdpHyN85\ YmLLW1AL14FABZyb7bq2ix4Eb5YgOe2kfSnbSM6C3NQCjR0EMVrHS/BsYVLXtFHCgWzN4funodKS\ ds+xDzdYpPJScWc/DIh4gInByLUfkmO+p3qKViwaqKactV2zY9ATIKHrkWzQjX2v3wvkF7mGnjix\ lAxYjOBVqjtjbZqJYLhkKpLGN/R+Q0O3c+gB53+XD9fyexn9GtePyfqFa3qdnom2piiZk4hA9z7N\ UaPK6u95RyG1/jLix8NRb76AdPCkwzryT+lf3xkK8jsTQ6wxpLPn6/wY1gGp8yqPNg7rtLG8t0zJ\ a7+h89n07eLw4+1knj0vllJPgFOL\ -----END CERTIFICATE-----\ \ CA Disig Root R2\ ================\ -----BEGIN CERTIFICATE-----\ MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNVBAYTAlNLMRMw\ EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp\ ZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQyMDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sx\ EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp\ c2lnIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbC\ w3OeNcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNHPWSb6Wia\ xswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3Ix2ymrdMxp7zo5eFm1tL7\ A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbeQTg06ov80egEFGEtQX6sx3dOy1FU+16S\ GBsEWmjGycT6txOgmLcRK7fWV8x8nhfRyyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqV\ g8NTEQxzHQuyRpDRQjrOQG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa\ 5Beny912H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJQfYE\ koopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUDi/ZnWejBBhG93c+A\ Ak9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORsnLMOPReisjQS1n6yqEm70XooQL6i\ Fh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNV\ HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5u\ Qu0wDQYJKoZIhvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM\ tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqfGopTpti72TVV\ sRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkblvdhuDvEK7Z4bLQjb/D907Je\ dR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W8\ 1k/BfDxujRNt+3vrMNDcTa/F1balTFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjx\ mHHEt38OFdAlab0inSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01\ utI3gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18DrG5gPcFw0\ sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3OszMOl6W8KjptlwlCFtaOg\ UxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8xL4ysEr3vQCj8KWefshNPZiTEUxnpHikV\ 7+ZtsH8tZ/3zbBt1RqPlShfppNcL\ -----END CERTIFICATE-----\ \ ACCVRAIZ1\ =========\ -----BEGIN CERTIFICATE-----\ MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UEAwwJQUNDVlJB\ SVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQswCQYDVQQGEwJFUzAeFw0xMTA1\ MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQBgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwH\ UEtJQUNDVjENMAsGA1UECgwEQUNDVjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4IC\ DwAwggIKAoICAQCbqau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gM\ jmoYHtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWoG2ioPej0\ RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpAlHPrzg5XPAOBOp0KoVdD\ aaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhrIA8wKFSVf+DuzgpmndFALW4ir50awQUZ\ 0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDG\ WuzndN9wrqODJerWx5eHk6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs7\ 8yM2x/474KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMOm3WR\ 5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpacXpkatcnYGMN285J\ 9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPluUsXQA+xtrn13k/c4LOsOxFwYIRK\ Q26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYIKwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRw\ Oi8vd3d3LmFjY3YuZXMvZmlsZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEu\ Y3J0MB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2\ VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeTVfZW6oHlNsyM\ Hj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIGCCsGAQUFBwICMIIBFB6CARAA\ QQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUAcgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBh\ AO0AegAgAGQAZQAgAGwAYQAgAEEAQwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUA\ YwBuAG8AbABvAGcA7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBj\ AHQAcgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAAQwBQAFMA\ IABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUAczAwBggrBgEFBQcCARYk\ aHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2MuaHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0\ dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRtaW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2\ MV9kZXIuY3JsMA4GA1UdDwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZI\ hvcNAQEFBQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdpD70E\ R9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gUJyCpZET/LtZ1qmxN\ YEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+mAM/EKXMRNt6GGT6d7hmKG9Ww7Y49\ nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepDvV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJ\ TS+xJlsndQAJxGJ3KQhfnlmstn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3\ sCPdK6jT2iWH7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h\ I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szAh1xA2syVP1Xg\ Nce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xFd3+YJ5oyXSrjhO7FmGYvliAd\ 3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2HpPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3p\ EfbRD0tVNEYqi4Y7\ -----END CERTIFICATE-----\ \ TWCA Global Root CA\ ===================\ -----BEGIN CERTIFICATE-----\ MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcxEjAQBgNVBAoT\ CVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMTVFdDQSBHbG9iYWwgUm9vdCBD\ QTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQK\ EwlUQUlXQU4tQ0ExEDAOBgNVBAsTB1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3Qg\ Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2C\ nJfF10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz0ALfUPZV\ r2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfChMBwqoJimFb3u/Rk28OKR\ Q4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbHzIh1HrtsBv+baz4X7GGqcXzGHaL3SekV\ tTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1W\ KKD+u4ZqyPpcC1jcxkt2yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99\ sy2sbZCilaLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYPoA/p\ yJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQABDzfuBSO6N+pjWxn\ kjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcEqYSjMq+u7msXi7Kx/mzhkIyIqJdI\ zshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMC\ AQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6g\ cFGn90xHNcgL1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn\ LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WFH6vPNOw/KP4M\ 8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNoRI2T9GRwoD2dKAXDOXC4Ynsg\ /eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlg\ lPx4mI88k1HtQJAH32RjJMtOcQWh15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryP\ A9gK8kxkRr05YuWW6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3m\ i4TWnsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5jwa19hAM8\ EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWzaGHQRiapIVJpLesux+t3\ zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmyKwbQBM0=\ -----END CERTIFICATE-----\ \ TeliaSonera Root CA v1\ ======================\ -----BEGIN CERTIFICATE-----\ MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAwNzEUMBIGA1UE\ CgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJvb3QgQ0EgdjEwHhcNMDcxMDE4\ MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYDVQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwW\ VGVsaWFTb25lcmEgUm9vdCBDQSB2MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+\ 6yfwIaPzaSZVfp3FVRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA\ 3GV17CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+XZ75Ljo1k\ B1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+/jXh7VB7qTCNGdMJjmhn\ Xb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxH\ oLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkmdtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3\ F0fUTPHSiXk+TT2YqGHeOh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJ\ oWjiUIMusDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4pgd7\ gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fsslESl1MpWtTwEhDc\ TwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQarMCpgKIv7NHfirZ1fpoeDVNAgMB\ AAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qW\ DNXr+nuqF+gTEjANBgkqhkiG9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNm\ zqjMDfz1mgbldxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx\ 0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1TjTQpgcmLNkQfW\ pb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBedY2gea+zDTYa4EzAvXUYNR0PV\ G6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpc\ c41teyWRyu5FrgZLAMzTsVlQ2jqIOylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOT\ JsjrDNYmiLbAJM+7vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2\ qReWt88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcnHL/EVlP6\ Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVxSK236thZiNSQvxaz2ems\ WWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY=\ -----END CERTIFICATE-----\ \ E-Tugra Certification Authority\ ===============================\ -----BEGIN CERTIFICATE-----\ MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNVBAYTAlRSMQ8w\ DQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamls\ ZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN\ ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMw\ NTEyMDk0OFoXDTIzMDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmEx\ QDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxl\ cmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQD\ DB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A\ MIICCgKCAgEA4vU/kwVRHoViVF56C/UYB4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vd\ hQd2h8y/L5VMzH2nPbxHD5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5K\ CKpbknSFQ9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEoq1+g\ ElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3Dk14opz8n8Y4e0ypQ\ BaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcHfC425lAcP9tDJMW/hkd5s3kc91r0\ E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsutdEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gz\ rt48Ue7LE3wBf4QOXVGUnhMMti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAq\ jqFGOjGY5RH8zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn\ rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUXU8u3Zg5mTPj5\ dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6Jyr+zE7S6E5UMA8GA1UdEwEB\ /wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEG\ MA0GCSqGSIb3DQEBCwUAA4ICAQAFNzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAK\ kEh47U6YA5n+KGCRHTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jO\ XKqYGwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c77NCR807\ VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3+GbHeJAAFS6LrVE1Uweo\ a2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WKvJUawSg5TB9D0pH0clmKuVb8P7Sd2nCc\ dlqMQ1DujjByTd//SffGqWfZbawCEeI6FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEV\ KV0jq9BgoRJP3vQXzTLlyb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gT\ Dx4JnW2PAJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpDy4Q0\ 8ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8dNL/+I5c30jn6PQ0G\ C7TbO6Orb1wdtn7os4I07QZcJA==\ -----END CERTIFICATE-----\ \ T-TeleSec GlobalRoot Class 2\ ============================\ -----BEGIN CERTIFICATE-----\ MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM\ IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU\ cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgx\ MDAxMTA0MDE0WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz\ dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD\ ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0GCSqGSIb3\ DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUdAqSzm1nzHoqvNK38DcLZ\ SBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiCFoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/F\ vudocP05l03Sx5iRUKrERLMjfTlH6VJi1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx970\ 2cu+fjOlbpSD8DT6IavqjnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGV\ WOHAD3bZwI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGjQjBA\ MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/WSA2AHmgoCJrjNXy\ YdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhyNsZt+U2e+iKo4YFWz827n+qrkRk4\ r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPACuvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNf\ vNoBYimipidx5joifsFvHZVwIEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR\ 3p1m0IvVVGb6g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN\ 9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlPBSeOE6Fuwg==\ -----END CERTIFICATE-----\ \ Atos TrustedRoot 2011\ =====================\ -----BEGIN CERTIFICATE-----\ MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UEAwwVQXRvcyBU\ cnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0xMTA3MDcxNDU4\ MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMMFUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsG\ A1UECgwEQXRvczELMAkGA1UEBhMCREUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCV\ hTuXbyo7LjvPpvMpNb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr\ 54rMVD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+SZFhyBH+\ DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ4J7sVaE3IqKHBAUsR320\ HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0Lcp2AMBYHlT8oDv3FdU9T1nSatCQujgKR\ z3bFmx5VdJx4IbHwLfELn8LVlhgf8FQieowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7R\ l+lwrrw7GWzbITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZ\ bNshMBgGA1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB\ CwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8jvZfza1zv7v1Apt+h\ k6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kPDpFrdRbhIfzYJsdHt6bPWHJxfrrh\ TZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pcmaHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a9\ 61qn8FYiqTxlVMYVqL2Gns2Dlmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G\ 3mB/ufNPRJLvKrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed\ -----END CERTIFICATE-----\ \ QuoVadis Root CA 1 G3\ =====================\ -----BEGIN CERTIFICATE-----\ MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQELBQAwSDELMAkG\ A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv\ b3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJN\ MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEg\ RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakE\ PBtVwedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWerNrwU8lm\ PNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF34168Xfuw6cwI2H44g4hWf6\ Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh4Pw5qlPafX7PGglTvF0FBM+hSo+LdoIN\ ofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXpUhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/l\ g6AnhF4EwfWQvTA9xO+oabw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV\ 7qJZjqlc3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/GKubX\ 9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSthfbZxbGL0eUQMk1f\ iyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KOTk0k+17kBL5yG6YnLUlamXrXXAkg\ t3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOtzCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD\ AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZI\ hvcNAQELBQADggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC\ MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2cDMT/uFPpiN3\ GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUNqXsCHKnQO18LwIE6PWThv6ct\ Tr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP\ +V04ikkwj+3x6xn0dxoxGE1nVGwvb2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh\ 3jRJjehZrJ3ydlo28hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fa\ wx/kNSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNjZgKAvQU6\ O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhpq1467HxpvMc7hU6eFbm0\ FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFtnh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOV\ hMJKzRwuJIczYOXD\ -----END CERTIFICATE-----\ \ QuoVadis Root CA 2 G3\ =====================\ -----BEGIN CERTIFICATE-----\ MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQELBQAwSDELMAkG\ A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv\ b3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJN\ MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIg\ RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFh\ ZiFfqq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMWn4rjyduY\ NM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ymc5GQYaYDFCDy54ejiK2t\ oIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+O7q414AB+6XrW7PFXmAqMaCvN+ggOp+o\ MiwMzAkd056OXbxMmO7FGmh77FOm6RQ1o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+l\ V0POKa2Mq1W/xPtbAd0jIaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZo\ L1NesNKqIcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz8eQQ\ sSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43ehvNURG3YBZwjgQQvD\ 6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l7ZizlWNof/k19N+IxWA1ksB8aRxh\ lRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALGcC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTAD\ AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZI\ hvcNAQELBQADggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66\ AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RCroijQ1h5fq7K\ pVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0GaW/ZZGYjeVYg3UQt4XAoeo0L9\ x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4nlv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgz\ dWqTHBLmYF5vHX/JHyPLhGGfHoJE+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6X\ U/IyAgkwo1jwDQHVcsaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+Nw\ mNtddbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNgKCLjsZWD\ zYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeMHVOyToV7BjjHLPj4sHKN\ JeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4WSr2Rz0ZiC3oheGe7IUIarFsNMkd7Egr\ O3jtZsSOeWmD3n+M\ -----END CERTIFICATE-----\ \ QuoVadis Root CA 3 G3\ =====================\ -----BEGIN CERTIFICATE-----\ MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQELBQAwSDELMAkG\ A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv\ b3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJN\ MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMg\ RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286\ IxSR/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNuFoM7pmRL\ Mon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXRU7Ox7sWTaYI+FrUoRqHe\ 6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+cra1AdHkrAj80//ogaX3T7mH1urPnMNA3\ I4ZyYUUpSFlob3emLoG+B01vr87ERRORFHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3U\ VDmrJqMz6nWB2i3ND0/kA9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f7\ 5li59wzweyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634RylsSqi\ Md5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBpVzgeAVuNVejH38DM\ dyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0QA4XN8f+MFrXBsj6IbGB/kE+V9/Yt\ rQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD\ AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZI\ hvcNAQELBQADggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px\ KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnIFUBhynLWcKzS\ t/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5WvvoxXqA/4Ti2Tk08HS6IT7SdEQ\ TXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFgu/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9Du\ DcpmvJRPpq3t/O5jrFc/ZSXPsoaP0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGib\ Ih6BJpsQBJFxwAYf3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmD\ hPbl8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+DhcI00iX\ 0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HNPlopNLk9hM6xZdRZkZFW\ dSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ywaZWWDYWGWVjUTR939+J399roD1B0y2\ PpxxVJkES/1Y+Zj0\ -----END CERTIFICATE-----\ \ DigiCert Assured ID Root G2\ ===========================\ -----BEGIN CERTIFICATE-----\ MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQG\ EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw\ IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgw\ MTE1MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL\ ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIw\ ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSAn61UQbVH\ 35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4HteccbiJVMWWXvdMX0h5i89vq\ bFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9HpEgjAALAcKxHad3A2m67OeYfcgnDmCXRw\ VWmvo2ifv922ebPynXApVfSr/5Vh88lAbx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OP\ YLfykqGxvYmJHzDNw6YuYjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+Rn\ lTGNAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTO\ w0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPIQW5pJ6d1Ee88hjZv\ 0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I0jJmwYrA8y8678Dj1JGG0VDjA9tz\ d29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4GnilmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAW\ hsI6yLETcDbYz+70CjTVW0z9B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0M\ jomZmWzwPDCvON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo\ IhNzbM8m9Yop5w==\ -----END CERTIFICATE-----\ \ DigiCert Assured ID Root G3\ ===========================\ -----BEGIN CERTIFICATE-----\ MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV\ UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYD\ VQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1\ MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\ d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQ\ BgcqhkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJfZn4f5dwb\ RXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17QRSAPWXYQ1qAk8C3eNvJs\ KTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgF\ UaFNN6KDec6NHSrkhDAKBggqhkjOPQQDAwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5Fy\ YZ5eEJJZVrmDxxDnOOlYJjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy\ 1vUhZscv6pZjamVFkpUBtA==\ -----END CERTIFICATE-----\ \ DigiCert Global Root G2\ =======================\ -----BEGIN CERTIFICATE-----\ MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQG\ EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw\ HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUx\ MjAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3\ dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkq\ hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI2/Ou8jqJ\ kTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx1x7e/dfgy5SDN67sH0NO\ 3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQq2EGnI/yuum06ZIya7XzV+hdG82MHauV\ BJVJ8zUtluNJbd134/tJS7SsVQepj5WztCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyM\ UNGPHgm+F6HmIcr9g+UQvIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQAB\ o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV5uNu\ 5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY1Yl9PMWLSn/pvtsr\ F9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4NeF22d+mQrvHRAiGfzZ0JFrabA0U\ WTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NGFdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBH\ QRFXGU7Aj64GxJUTFy8bJZ918rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/\ iyK5S9kJRaTepLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl\ MrY=\ -----END CERTIFICATE-----\ \ DigiCert Global Root G3\ =======================\ -----BEGIN CERTIFICATE-----\ MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQswCQYDVQQGEwJV\ UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYD\ VQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAw\ MDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5k\ aWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0C\ AQYFK4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FGfp4tn+6O\ YwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPOZ9wj/wMco+I+o0IwQDAP\ BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNp\ Yim8S8YwCgYIKoZIzj0EAwMDaAAwZQIxAK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y\ 3maTD/HMsQmP3Wyr+mt/oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34\ VOKa5Vt8sycX\ -----END CERTIFICATE-----\ \ DigiCert Trusted Root G4\ ========================\ -----BEGIN CERTIFICATE-----\ MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBiMQswCQYDVQQG\ EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEw\ HwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1\ MTIwMDAwWjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\ d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0G\ CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3yithZwuEp\ pz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9o\ k3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7Fsa\ vOvJz82sNEBfsXpm7nfISKhmV1efVFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGY\ QJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6\ MUSaM0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCiEhtm\ mnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADMfRyVw4/3IbKyEbe7\ f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFH\ dL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8\ oR7FwI+isX4KJpn15GkvmB0t9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud\ DwEB/wQEAwIBhjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD\ ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2SV1EY+CtnJYY\ ZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd+SeuMIW59mdNOj6PWTkiU0Tr\ yF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWcfFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy\ 7zBZLq7gcfJW5GqXb5JQbZaNaHqasjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iah\ ixTXTBmyUEFxPT9NcCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN\ 5r5N0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie4u1Ki7wb\ /UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mIr/OSmbaz5mEP0oUA51Aa\ 5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tK\ G48BtieVU+i2iW1bvGjUI+iLUaJW+fCmgKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP\ 82Z+\ -----END CERTIFICATE-----\ \ WoSign\ ======\ -----BEGIN CERTIFICATE-----\ MIIFdjCCA16gAwIBAgIQXmjWEXGUY1BWAGjzPsnFkTANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQG\ EwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxKjAoBgNVBAMTIUNlcnRpZmljYXRpb24g\ QXV0aG9yaXR5IG9mIFdvU2lnbjAeFw0wOTA4MDgwMTAwMDFaFw0zOTA4MDgwMTAwMDFaMFUxCzAJ\ BgNVBAYTAkNOMRowGAYDVQQKExFXb1NpZ24gQ0EgTGltaXRlZDEqMCgGA1UEAxMhQ2VydGlmaWNh\ dGlvbiBBdXRob3JpdHkgb2YgV29TaWduMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA\ vcqNrLiRFVaXe2tcesLea9mhsMMQI/qnobLMMfo+2aYpbxY94Gv4uEBf2zmoAHqLoE1UfcIiePyO\ CbiohdfMlZdLdNiefvAA5A6JrkkoRBoQmTIPJYhTpA2zDxIIFgsDcSccf+Hb0v1naMQFXQoOXXDX\ 2JegvFNBmpGN9J42Znp+VsGQX+axaCA2pIwkLCxHC1l2ZjC1vt7tj/id07sBMOby8w7gLJKA84X5\ KIq0VC6a7fd2/BVoFutKbOsuEo/Uz/4Mx1wdC34FMr5esAkqQtXJTpCzWQ27en7N1QhatH/YHGkR\ +ScPewavVIMYe+HdVHpRaG53/Ma/UkpmRqGyZxq7o093oL5d//xWC0Nyd5DKnvnyOfUNqfTq1+ez\ EC8wQjchzDBwyYaYD8xYTYO7feUapTeNtqwylwA6Y3EkHp43xP901DfA4v6IRmAR3Qg/UDaruHqk\ lWJqbrDKaiFaafPz+x1wOZXzp26mgYmhiMU7ccqjUu6Du/2gd/Tkb+dC221KmYo0SLwX3OSACCK2\ 8jHAPwQ+658geda4BmRkAjHXqc1S+4RFaQkAKtxVi8QGRkvASh0JWzko/amrzgD5LkhLJuYwTKVY\ yrREgk/nkR4zw7CT/xH8gdLKH3Ep3XZPkiWvHYG3Dy+MwwbMLyejSuQOmbp8HkUff6oZRZb9/D0C\ AwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFOFmzw7R\ 8bNLtwYgFP6HEtX2/vs+MA0GCSqGSIb3DQEBBQUAA4ICAQCoy3JAsnbBfnv8rWTjMnvMPLZdRtP1\ LOJwXcgu2AZ9mNELIaCJWSQBnfmvCX0KI4I01fx8cpm5o9dU9OpScA7F9dY74ToJMuYhOZO9sxXq\ T2r09Ys/L3yNWC7F4TmgPsc9SnOeQHrAK2GpZ8nzJLmzbVUsWh2eJXLOC62qx1ViC777Y7NhRCOj\ y+EaDveaBk3e1CNOIZZbOVtXHS9dCF4Jef98l7VNg64N1uajeeAz0JmWAjCnPv/So0M/BVoG6kQC\ 2nz4SNAzqfkHx5Xh9T71XXG68pWpdIhhWeO/yloTunK0jF02h+mmxTwTv97QRCbut+wucPrXnbes\ 5cVAWubXbHssw1abR80LzvobtCHXt2a49CUwi1wNuepnsvRtrtWhnk/Yn+knArAdBtaP4/tIEp9/\ EaEQPkxROpaw0RPxx9gmrjrKkcRpnd8BKWRRb2jaFOwIQZeQjdCygPLPwj2/kWjFgGcexGATVdVh\ mVd8upUPYUk6ynW8yQqTP2cOEvIo4jEbwFcW3wh8GcF+Dx+FHgo2fFt+J7x6v+Db9NpSvd4MVHAx\ kUOVyLzwPt0JfjBkUO1/AaQzZ01oT74V77D2AhGiGxMlOtzCWfHjXEa7ZywCRuoeSKbmW9m1vFGi\ kpbbqsY3Iqb+zCB0oy2pLmvLwIIRIbWTee5Ehr7XHuQe+w==\ -----END CERTIFICATE-----\ \ WoSign China\ ============\ -----BEGIN CERTIFICATE-----\ MIIFWDCCA0CgAwIBAgIQUHBrzdgT/BtOOzNy0hFIjTANBgkqhkiG9w0BAQsFADBGMQswCQYDVQQG\ EwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxGzAZBgNVBAMMEkNBIOayg+mAmuagueiv\ geS5pjAeFw0wOTA4MDgwMTAwMDFaFw0zOTA4MDgwMTAwMDFaMEYxCzAJBgNVBAYTAkNOMRowGAYD\ VQQKExFXb1NpZ24gQ0EgTGltaXRlZDEbMBkGA1UEAwwSQ0Eg5rKD6YCa5qC56K+B5LmmMIICIjAN\ BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0EkhHiX8h8EqwqzbdoYGTufQdDTc7WU1/FDWiD+k\ 8H/rD195L4mx/bxjWDeTmzj4t1up+thxx7S8gJeNbEvxUNUqKaqoGXqW5pWOdO2XCld19AXbbQs5\ uQF/qvbW2mzmBeCkTVL829B0txGMe41P/4eDrv8FAxNXUDf+jJZSEExfv5RxadmWPgxDT74wwJ85\ dE8GRV2j1lY5aAfMh09Qd5Nx2UQIsYo06Yms25tO4dnkUkWMLhQfkWsZHWgpLFbE4h4TV2TwYeO5\ Ed+w4VegG63XX9Gv2ystP9Bojg/qnw+LNVgbExz03jWhCl3W6t8Sb8D7aQdGctyB9gQjF+BNdeFy\ b7Ao65vh4YOhn0pdr8yb+gIgthhid5E7o9Vlrdx8kHccREGkSovrlXLp9glk3Kgtn3R46MGiCWOc\ 76DbT52VqyBPt7D3h1ymoOQ3OMdc4zUPLK2jgKLsLl3Az+2LBcLmc272idX10kaO6m1jGx6KyX2m\ +Jzr5dVjhU1zZmkR/sgO9MHHZklTfuQZa/HpelmjbX7FF+Ynxu8b22/8DU0GAbQOXDBGVWCvOGU6\ yke6rCzMRh+yRpY/8+0mBe53oWprfi1tWFxK1I5nuPHa1UaKJ/kR8slC/k7e3x9cxKSGhxYzoacX\ GKUN5AXlK8IrC6KVkLn9YDxOiT7nnO4fuwECAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1Ud\ EwEB/wQFMAMBAf8wHQYDVR0OBBYEFOBNv9ybQV0T6GTwp+kVpOGBwboxMA0GCSqGSIb3DQEBCwUA\ A4ICAQBqinA4WbbaixjIvirTthnVZil6Xc1bL3McJk6jfW+rtylNpumlEYOnOXOvEESS5iVdT2H6\ yAa+Tkvv/vMx/sZ8cApBWNromUuWyXi8mHwCKe0JgOYKOoICKuLJL8hWGSbueBwj/feTZU7n85iY\ r83d2Z5AiDEoOqsuC7CsDCT6eiaY8xJhEPRdF/d+4niXVOKM6Cm6jBAyvd0zaziGfjk9DgNyp115\ j0WKWa5bIW4xRtVZjc8VX90xJc/bYNaBRHIpAlf2ltTW/+op2znFuCyKGo3Oy+dCMYYFaA6eFN0A\ kLppRQjbbpCBhqcqBT/mhDn4t/lXX0ykeVoQDF7Va/81XwVRHmyjdanPUIPTfPRm94KNPQx96N97\ qA4bLJyuQHCH2u2nFoJavjVsIE4iYdm8UXrNemHcSxH5/mc0zy4EZmFcV5cjjPOGG0jfKq+nwf/Y\ jj4Du9gqsPoUJbJRa4ZDhS4HIxaAjUz7tGM7zMN07RujHv41D198HRaG9Q7DlfEvr10lO1Hm13ZB\ ONFLAzkopR6RctR9q5czxNM+4Gm2KHmgCY0c0f9BckgG/Jou5yD5m6Leie2uPAmvylezkolwQOQv\ T8Jwg0DXJCxr5wkf09XHwQj02w47HAcLQxGEIYbpgNR12KvxAmLBsX5VYc8T1yaw15zLKYs4SgsO\ kI26oQ==\ -----END CERTIFICATE-----\ \ COMODO RSA Certification Authority\ ==================================\ -----BEGIN CERTIFICATE-----\ MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCBhTELMAkGA1UE\ BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG\ A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlv\ biBBdXRob3JpdHkwHhcNMTAwMTE5MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMC\ R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE\ ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBB\ dXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR6FSS0gpWsawNJN3Fz0Rn\ dJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8Xpz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZ\ FGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+\ 5eNu/Nio5JIk2kNrYrhV/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pG\ x8cgoLEfZd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z+pUX\ 2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7wqP/0uK3pN/u6uPQL\ OvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZahSL0896+1DSJMwBGB7FY79tOi4lu3\ sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVICu9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+C\ GCe01a60y1Dma/RMhnEw6abfFobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5\ WdYgGq/yapiqcrxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E\ FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w\ DQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvlwFTPoCWOAvn9sKIN9SCYPBMt\ rFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+\ nq6PK7o9mfjYcwlYRm6mnPTXJ9OV2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSg\ tZx8jb8uk2IntznaFxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwW\ sRqZCuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiKboHGhfKp\ pC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmckejkk9u+UJueBPSZI9FoJA\ zMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yLS0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHq\ ZJx64SIDqZxubw5lT2yHh17zbqD5daWbQOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk52\ 7RH89elWsn2/x20Kk4yl0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7I\ LaZRfyHBNVOFBkpdn627G190\ -----END CERTIFICATE-----\ \ USERTrust RSA Certification Authority\ =====================================\ -----BEGIN CERTIFICATE-----\ MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCBiDELMAkGA1UE\ BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK\ ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh\ dGlvbiBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UE\ BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK\ ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh\ dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCAEmUXNg7D2wiz\ 0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2j\ Y0K2dvKpOyuR+OJv0OwWIJAJPuLodMkYtJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFn\ RghRy4YUVD+8M/5+bJz/Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O\ +T23LLb2VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT79uq\ /nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6c0Plfg6lZrEpfDKE\ Y1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmTYo61Zs8liM2EuLE/pDkP2QKe6xJM\ lXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97lc6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8\ yexDJtC/QV9AqURE9JnnV4eeUB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+\ eLf8ZxXhyVeEHg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd\ BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF\ MAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPFUp/L+M+ZBn8b2kMVn54CVVeW\ FPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KOVWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ\ 7l8wXEskEVX/JJpuXior7gtNn3/3ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQ\ Eg9zKC7F4iRO/Fjs8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM\ 8WcRiQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYzeSf7dNXGi\ FSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZXHlKYC6SQK5MNyosycdi\ yA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9c\ J2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRBVXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGw\ sAvgnEzDHNb842m1R0aBL6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gx\ Q+6IHdfGjjxDah2nGN59PRbxYvnKkKj9\ -----END CERTIFICATE-----\ \ USERTrust ECC Certification Authority\ =====================================\ -----BEGIN CERTIFICATE-----\ MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDELMAkGA1UEBhMC\ VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU\ aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv\ biBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMC\ VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU\ aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv\ biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqfloI+d61SRvU8Za2EurxtW2\ 0eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinngo4N+LZfQYcTxmdwlkWOrfzCjtHDix6Ez\ nPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0GA1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNV\ HQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBB\ HU6+4WMBzzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbWRNZu\ 9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg=\ -----END CERTIFICATE-----\ \ GlobalSign ECC Root CA - R4\ ===========================\ -----BEGIN CERTIFICATE-----\ MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEkMCIGA1UECxMb\ R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD\ EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb\ R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD\ EwpHbG9iYWxTaWduMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprl\ OQcJFspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAwDgYDVR0P\ AQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61FuOJAf/sKbvu+M8k8o4TV\ MAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGXkPoUVy0D7O48027KqGx2vKLeuwIgJ6iF\ JzWbVsaj8kfSt24bAgAXqmemFZHe+pTsewv4n4Q=\ -----END CERTIFICATE-----\ \ GlobalSign ECC Root CA - R5\ ===========================\ -----BEGIN CERTIFICATE-----\ MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEkMCIGA1UECxMb\ R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD\ EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb\ R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD\ EwpHbG9iYWxTaWduMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6\ SFkc8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8kehOvRnkmS\ h5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd\ BgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYIKoZIzj0EAwMDaAAwZQIxAOVpEslu28Yx\ uglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7\ yFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3\ -----END CERTIFICATE-----\ \ Staat der Nederlanden Root CA - G3\ ==================================\ -----BEGIN CERTIFICATE-----\ MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE\ CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g\ Um9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloXDTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMC\ TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l\ ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4y\ olQPcPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WWIkYFsO2t\ x1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqXxz8ecAgwoNzFs21v0IJy\ EavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFyKJLZWyNtZrVtB0LrpjPOktvA9mxjeM3K\ Tj215VKb8b475lRgsGYeCasH/lSJEULR9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUur\ mkVLoR9BvUhTFXFkC4az5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU5\ 1nus6+N86U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7Ngzp\ 07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHPbMk7ccHViLVlvMDo\ FxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXtBznaqB16nzaeErAMZRKQFWDZJkBE\ 41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTtXUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMB\ AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleu\ yjWcLhL75LpdINyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD\ U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwpLiniyMMB8jPq\ KqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8Ipf3YF3qKS9Ysr1YvY2WTxB1\ v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixpgZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA\ 8KCWAg8zxXHzniN9lLf9OtMJgwYh/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b\ 8KKaa8MFSu1BYBQw0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0r\ mj1AfsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq4BZ+Extq\ 1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR1VmiiXTTn74eS9fGbbeI\ JG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/QFH1T/U67cjF68IeHRaVesd+QnGTbksV\ tzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM94B7IWcnMFk=\ -----END CERTIFICATE-----\ \ Staat der Nederlanden EV Root CA\ ================================\ -----BEGIN CERTIFICATE-----\ MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJOTDEeMBwGA1UE\ CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFhdCBkZXIgTmVkZXJsYW5kZW4g\ RVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0yMjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5M\ MR4wHAYDVQQKDBVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRl\ cmxhbmRlbiBFViBSb290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkk\ SzrSM4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nCUiY4iKTW\ O0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3dZ//BYY1jTw+bbRcwJu+r\ 0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46prfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8\ Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13lpJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gV\ XJrm0w912fxBmJc+qiXbj5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr\ 08C+eKxCKFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS/ZbV\ 0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0XcgOPvZuM5l5Tnrmd\ 74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH1vI4gnPah1vlPNOePqc7nvQDs/nx\ fRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrPpx9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNC\ MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwa\ ivsnuL8wbqg7MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI\ eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u2dfOWBfoqSmu\ c0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHSv4ilf0X8rLiltTMMgsT7B/Zq\ 5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTCwPTxGfARKbalGAKb12NMcIxHowNDXLldRqAN\ b/9Zjr7dn3LDWyvfjFvO5QxGbJKyCqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tN\ f1zuacpzEPuKqf2evTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi\ 5Dp6Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIaGl6I6lD4\ WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeLeG9QgkRQP2YGiqtDhFZK\ DyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGy\ eUN51q1veieQA6TqJIc/2b3Z6fJfUEkc7uzXLg==\ -----END CERTIFICATE-----\ \ IdenTrust Commercial Root CA 1\ ==============================\ -----BEGIN CERTIFICATE-----\ MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBKMQswCQYDVQQG\ EwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBS\ b290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQwMTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzES\ MBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENB\ IDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ld\ hNlT3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU+ehcCuz/\ mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gpS0l4PJNgiCL8mdo2yMKi\ 1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1bVoE/c40yiTcdCMbXTMTEl3EASX2MN0C\ XZ/g1Ue9tOsbobtJSdifWwLziuQkkORiT0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl\ 3ZBWzvurpWCdxJ35UrCLvYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzy\ NeVJSQjKVsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZKdHzV\ WYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHTc+XvvqDtMwt0viAg\ xGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hvl7yTmvmcEpB4eoCHFddydJxVdHix\ uuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5NiGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC\ AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZI\ hvcNAQELBQADggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH\ 6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwtLRvM7Kqas6pg\ ghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93nAbowacYXVKV7cndJZ5t+qnt\ ozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmV\ YjzlVYA211QC//G5Xc7UI2/YRYRKW2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUX\ feu+h1sXIFRRk0pTAwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/ro\ kTLql1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG4iZZRHUe\ 2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZmUlO+KWA2yUPHGNiiskz\ Z2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7R\ cGzM7vRX+Bi6hG6H\ -----END CERTIFICATE-----\ \ IdenTrust Public Sector Root CA 1\ =================================\ -----BEGIN CERTIFICATE-----\ MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBNMQswCQYDVQQG\ EwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3Rv\ ciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcNMzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJV\ UzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBS\ b290IENBIDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTy\ P4o7ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGyRBb06tD6\ Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlSbdsHyo+1W/CD80/HLaXI\ rcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF/YTLNiCBWS2ab21ISGHKTN9T0a9SvESf\ qy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoS\ mJxZZoY+rfGwyj4GD3vwEUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFn\ ol57plzy9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9VGxyh\ LrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ2fjXctscvG29ZV/v\ iDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsVWaFHVCkugyhfHMKiq3IXAAaOReyL\ 4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gDW/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8B\ Af8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMw\ DQYJKoZIhvcNAQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj\ t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHVDRDtfULAj+7A\ mgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9TaDKQGXSc3z1i9kKlT/YPyNt\ GtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8GlwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFt\ m6/n6J91eEyrRjuazr8FGF1NFTwWmhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMx\ NRF4eKLg6TCMf4DfWN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4\ Mhn5+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJtshquDDI\ ajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhAGaQdp/lLQzfcaFpPz+vC\ ZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ\ 3Wl9af0AVqW3rLatt8o+Ae+c\ -----END CERTIFICATE-----\ \ Entrust Root Certification Authority - G2\ =========================================\ -----BEGIN CERTIFICATE-----\ MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMCVVMxFjAUBgNV\ BAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVy\ bXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ug\ b25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIw\ HhcNMDkwNzA3MTcyNTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoT\ DUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMx\ OTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25s\ eTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwggEi\ MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP\ /vaCeb9zYQYKpSfYs1/TRU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXz\ HHfV1IWNcCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hWwcKU\ s/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1U1+cPvQXLOZprE4y\ TGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0jaWvYkxN4FisZDQSA/i2jZRjJKRx\ AgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ6\ 0B7vfec7aVHUbI2fkBJmqzANBgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5Z\ iXMRrEPR9RP/jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ\ Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v1fN2D807iDgi\ nWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4RnAuknZoh8/CbCzB428Hch0P+\ vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmHVHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xO\ e4pIb4tF9g==\ -----END CERTIFICATE-----\ \ Entrust Root Certification Authority - EC1\ ==========================================\ -----BEGIN CERTIFICATE-----\ MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkGA1UEBhMCVVMx\ FjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVn\ YWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXpl\ ZCB1c2Ugb25seTEzMDEGA1UEAxMqRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5\ IC0gRUMxMB4XDTEyMTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYw\ FAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2Fs\ LXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQg\ dXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt\ IEVDMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHy\ AsWfoPZb1YsGGYZPUxBtByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef\ 9eNi1KlHBz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE\ FLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVCR98crlOZF7ZvHH3h\ vxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nXhTcGtXsI/esni0qU+eH6p44mCOh8\ kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G\ -----END CERTIFICATE-----\ \ CFCA EV ROOT\ ============\ -----BEGIN CERTIFICATE-----\ MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJDTjEwMC4GA1UE\ CgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNB\ IEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkxMjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEw\ MC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQD\ DAxDRkNBIEVWIFJPT1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnV\ BU03sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpLTIpTUnrD\ 7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5/ZOkVIBMUtRSqy5J35DN\ uF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp7hZZLDRJGqgG16iI0gNyejLi6mhNbiyW\ ZXvKWfry4t3uMCz7zEasxGPrb382KzRzEpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7\ xzbh72fROdOXW3NiGUgthxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9f\ py25IGvPa931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqotaK8K\ gWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNgTnYGmE69g60dWIol\ hdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfVPKPtl8MeNPo4+QgO48BdK4PRVmrJ\ tqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hvcWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAf\ BgNVHSMEGDAWgBTj/i39KNALtbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB\ /wQEAwIBBjAdBgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB\ ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObTej/tUxPQ4i9q\ ecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdLjOztUmCypAbqTuv0axn96/Ua\ 4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBSESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sG\ E5uPhnEFtC+NiWYzKXZUmhH4J/qyP5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfX\ BDrDMlI1Dlb4pd19xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjn\ aH9dCi77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN5mydLIhy\ PDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe/v5WOaHIz16eGWRGENoX\ kbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+ZAAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3C\ ekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su\ -----END CERTIFICATE-----\ \ TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H5\ =========================================================\ -----BEGIN CERTIFICATE-----\ MIIEJzCCAw+gAwIBAgIHAI4X/iQggTANBgkqhkiG9w0BAQsFADCBsTELMAkGA1UEBhMCVFIxDzAN\ BgNVBAcMBkFua2FyYTFNMEsGA1UECgxEVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp\ bGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7Fni4xQjBABgNVBAMMOVTDnFJLVFJVU1Qg\ RWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSBINTAeFw0xMzA0MzAw\ ODA3MDFaFw0yMzA0MjgwODA3MDFaMIGxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMU0w\ SwYDVQQKDERUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnE\ n2kgSGl6bWV0bGVyaSBBLsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBFbGVrdHJvbmlrIFNlcnRp\ ZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIEg1MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB\ CgKCAQEApCUZ4WWe60ghUEoI5RHwWrom/4NZzkQqL/7hzmAD/I0Dpe3/a6i6zDQGn1k19uwsu537\ jVJp45wnEFPzpALFp/kRGml1bsMdi9GYjZOHp3GXDSHHmflS0yxjXVW86B8BSLlg/kJK9siArs1m\ ep5Fimh34khon6La8eHBEJ/rPCmBp+EyCNSgBbGM+42WAA4+Jd9ThiI7/PS98wl+d+yG6w8z5UNP\ 9FR1bSmZLmZaQ9/LXMrI5Tjxfjs1nQ/0xVqhzPMggCTTV+wVunUlm+hkS7M0hO8EuPbJbKoCPrZV\ 4jI3X/xml1/N1p7HIL9Nxqw/dV8c7TKcfGkAaZHjIxhT6QIDAQABo0IwQDAdBgNVHQ4EFgQUVpkH\ HtOsDGlktAxQR95DLL4gwPswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZI\ hvcNAQELBQADggEBAJ5FdnsXSDLyOIspve6WSk6BGLFRRyDN0GSxDsnZAdkJzsiZ3GglE9Rc8qPo\ BP5yCccLqh0lVX6Wmle3usURehnmp349hQ71+S4pL+f5bFgWV1Al9j4uPqrtd3GqqpmWRgqujuwq\ URawXs3qZwQcWDD1YIq9pr1N5Za0/EKJAWv2cMhQOQwt1WbZyNKzMrcbGW3LM/nfpeYVhDfwwvJl\ lpKQd/Ct9JDpEXjXk4nAPQu6KfTomZ1yju2dL+6SfaHx/126M2CFYv4HAqGEVka+lgqaE9chTLd8\ B59OTj+RdPsnnRHM3eaxynFNExc5JsUpISuTKWqW+qtB4Uu2NQvAmxU=\ -----END CERTIFICATE-----\ \ TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H6\ =========================================================\ -----BEGIN CERTIFICATE-----\ MIIEJjCCAw6gAwIBAgIGfaHyZeyKMA0GCSqGSIb3DQEBCwUAMIGxMQswCQYDVQQGEwJUUjEPMA0G\ A1UEBwwGQW5rYXJhMU0wSwYDVQQKDERUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls\ acWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBF\ bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIEg2MB4XDTEzMTIxODA5\ MDQxMFoXDTIzMTIxNjA5MDQxMFowgbExCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExTTBL\ BgNVBAoMRFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBCaWxpxZ9pbSBHw7x2ZW5sacSf\ aSBIaXptZXRsZXJpIEEuxZ4uMUIwQAYDVQQDDDlUw5xSS1RSVVNUIEVsZWt0cm9uaWsgU2VydGlm\ aWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLEgSDYwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK\ AoIBAQCdsGjW6L0UlqMACprx9MfMkU1xeHe59yEmFXNRFpQJRwXiM/VomjX/3EsvMsew7eKC5W/a\ 2uqsxgbPJQ1BgfbBOCK9+bGlprMBvD9QFyv26WZV1DOzXPhDIHiTVRZwGTLmiddk671IUP320EED\ wnS3/faAz1vFq6TWlRKb55cTMgPp1KtDWxbtMyJkKbbSk60vbNg9tvYdDjTu0n2pVQ8g9P0pu5Fb\ HH3GQjhtQiht1AH7zYiXSX6484P4tZgvsycLSF5W506jM7NE1qXyGJTtHB6plVxiSvgNZ1GpryHV\ +DKdeboaX+UEVU0TRv/yz3THGmNtwx8XEsMeED5gCLMxAgMBAAGjQjBAMB0GA1UdDgQWBBTdVRcT\ 9qzoSCHK77Wv0QAy7Z6MtTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG\ 9w0BAQsFAAOCAQEAb1gNl0OqFlQ+v6nfkkU/hQu7VtMMUszIv3ZnXuaqs6fvuay0EBQNdH49ba3R\ fdCaqaXKGDsCQC4qnFAUi/5XfldcEQlLNkVS9z2sFP1E34uXI9TDwe7UU5X+LEr+DXCqu4svLcsy\ o4LyVN/Y8t3XSHLuSqMplsNEzm61kod2pLv0kmzOLBQJZo6NrRa1xxsJYTvjIKIDgI6tflEATseW\ hvtDmHd9KMeP2Cpu54Rvl0EpABZeTeIT6lnAY2c6RPuY/ATTMHKm9ocJV612ph1jmv3XZch4gyt1\ O6VbuA1df74jrlZVlFjvH4GMKrLN5ptjnhi85WsGtAuYSyher4hYyw==\ -----END CERTIFICATE-----\ \ Certinomis - Root CA\ ====================\ -----BEGIN CERTIFICATE-----\ MIIFkjCCA3qgAwIBAgIBATANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJGUjETMBEGA1UEChMK\ Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxHTAbBgNVBAMTFENlcnRpbm9taXMg\ LSBSb290IENBMB4XDTEzMTAyMTA5MTcxOFoXDTMzMTAyMTA5MTcxOFowWjELMAkGA1UEBhMCRlIx\ EzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMR0wGwYDVQQDExRD\ ZXJ0aW5vbWlzIC0gUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANTMCQos\ P5L2fxSeC5yaah1AMGT9qt8OHgZbn1CF6s2Nq0Nn3rD6foCWnoR4kkjW4znuzuRZWJflLieY6pOo\ d5tK8O90gC3rMB+12ceAnGInkYjwSond3IjmFPnVAy//ldu9n+ws+hQVWZUKxkd8aRi5pwP5ynap\ z8dvtF4F/u7BUrJ1Mofs7SlmO/NKFoL21prbcpjp3vDFTKWrteoB4owuZH9kb/2jJZOLyKIOSY00\ 8B/sWEUuNKqEUL3nskoTuLAPrjhdsKkb5nPJWqHZZkCqqU2mNAKthH6yI8H7KsZn9DS2sJVqM09x\ RLWtwHkziOC/7aOgFLScCbAK42C++PhmiM1b8XcF4LVzbsF9Ri6OSyemzTUK/eVNfaoqoynHWmgE\ 6OXWk6RiwsXm9E/G+Z8ajYJJGYrKWUM66A0ywfRMEwNvbqY/kXPLynNvEiCL7sCCeN5LLsJJwx3t\ FvYk9CcbXFcx3FXuqB5vbKziRcxXV4p1VxngtViZSTYxPDMBbRZKzbgqg4SGm/lg0h9tkQPTYKbV\ PZrdd5A9NaSfD171UkRpucC63M9933zZxKyGIjK8e2uR73r4F2iw4lNVYC2vPsKD2NkJK/DAZNuH\ i5HMkesE/Xa0lZrmFAYb1TQdvtj/dBxThZngWVJKYe2InmtJiUZ+IFrZ50rlau7SZRFDAgMBAAGj\ YzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTvkUz1pcMw6C8I\ 6tNxIqSSaHh02TAfBgNVHSMEGDAWgBTvkUz1pcMw6C8I6tNxIqSSaHh02TANBgkqhkiG9w0BAQsF\ AAOCAgEAfj1U2iJdGlg+O1QnurrMyOMaauo++RLrVl89UM7g6kgmJs95Vn6RHJk/0KGRHCwPT5iV\ WVO90CLYiF2cN/z7ZMF4jIuaYAnq1fohX9B0ZedQxb8uuQsLrbWwF6YSjNRieOpWauwK0kDDPAUw\ Pk2Ut59KA9N9J0u2/kTO+hkzGm2kQtHdzMjI1xZSg081lLMSVX3l4kLr5JyTCcBMWwerx20RoFAX\ lCOotQqSD7J6wWAsOMwaplv/8gzjqh8c3LigkyfeY+N/IZ865Z764BNqdeuWXGKRlI5nU7aJ+BIJ\ y29SWwNyhlCVCNSNh4YVH5Uk2KRvms6knZtt0rJ2BobGVgjF6wnaNsIbW0G+YSrjcOa4pvi2WsS9\ Iff/ql+hbHY5ZtbqTFXhADObE5hjyW/QASAJN1LnDE8+zbz1X5YnpyACleAu6AdBBR8Vbtaw5Bng\ DwKTACdyxYvRVB9dSsNAl35VpnzBMwQUAR1JIGkLGZOdblgi90AMRgwjY/M50n92Uaf0yKHxDHYi\ I0ZSKS3io0EHVmmY0gUJvGnHWmHNj4FgFU2A3ZDifcRQ8ow7bkrHxuaAKzyBvBGAFhAn1/DNP3nM\ cyrDflOR1m749fPH0FFNjkulW+YZFzvWgQncItzujrnEj1PhZ7szuIgVRs/taTX/dQ1G885x4cVr\ hkIGuUE=\ -----END CERTIFICATE-----\ \ OISTE WISeKey Global Root GB CA\ ===============================\ -----BEGIN CERTIFICATE-----\ MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBtMQswCQYDVQQG\ EwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl\ ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAw\ MzJaFw0zOTEyMDExNTEwMzFaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYD\ VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEds\ b2JhbCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3HEokKtaX\ scriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGxWuR51jIjK+FTzJlFXHtP\ rby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk\ 9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNku7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4o\ Qnc/nSMbsrY9gBQHTC5P99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvg\ GUpuuy9rM2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB\ /zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZI\ hvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrghcViXfa43FK8+5/ea4n32cZiZBKpD\ dHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0\ VQreUGdNZtGn//3ZwLWoo4rOZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEui\ HZeeevJuQHHfaPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic\ Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM=\ -----END CERTIFICATE-----\ \ Certification Authority of WoSign G2\ ====================================\ -----BEGIN CERTIFICATE-----\ MIIDfDCCAmSgAwIBAgIQayXaioidfLwPBbOxemFFRDANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQG\ EwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxLTArBgNVBAMTJENlcnRpZmljYXRpb24g\ QXV0aG9yaXR5IG9mIFdvU2lnbiBHMjAeFw0xNDExMDgwMDU4NThaFw00NDExMDgwMDU4NThaMFgx\ CzAJBgNVBAYTAkNOMRowGAYDVQQKExFXb1NpZ24gQ0EgTGltaXRlZDEtMCsGA1UEAxMkQ2VydGlm\ aWNhdGlvbiBBdXRob3JpdHkgb2YgV29TaWduIEcyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB\ CgKCAQEAvsXEoCKASU+/2YcRxlPhuw+9YH+v9oIOH9ywjj2X4FA8jzrvZjtFB5sg+OPXJYY1kBai\ XW8wGQiHC38Gsp1ij96vkqVg1CuAmlI/9ZqD6TRay9nVYlzmDuDfBpgOgHzKtB0TiGsOqCR3A9Du\ W/PKaZE1OVbFbeP3PU9ekzgkyhjpJMuSA93MHD0JcOQg5PGurLtzaaNjOg9FD6FKmsLRY6zLEPg9\ 5k4ot+vElbGs/V6r+kHLXZ1L3PR8du9nfwB6jdKgGlxNIuG12t12s9R23164i5jIFFTMaxeSt+BK\ v0mUYQs4kI9dJGwlezt52eJ+na2fmKEG/HgUYFf47oB3sQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC\ AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU+mCp62XF3RYUCE4MD42b4Pdkr2cwDQYJKoZI\ hvcNAQELBQADggEBAFfDejaCnI2Y4qtAqkePx6db7XznPWZaOzG73/MWM5H8fHulwqZm46qwtyeY\ P0nXYGdnPzZPSsvxFPpahygc7Y9BMsaV+X3avXtbwrAh449G3CE4Q3RM+zD4F3LBMvzIkRfEzFg3\ TgvMWvchNSiDbGAtROtSjFA9tWwS1/oJu2yySrHFieT801LYYRf+epSEj3m2M1m6D8QL4nCgS3gu\ +sif/a+RZQp4OBXllxcU3fngLDT4ONCEIgDAFFEYKwLcMFrw6AF8NTojrwjkr6qOKEJJLvD1mTS+\ 7Q9LGOHSJDy7XUe3IfKN0QqZjuNuPq1w4I+5ysxugTH2e5x6eeRncRg=\ -----END CERTIFICATE-----\ \ CA WoSign ECC Root\ ==================\ -----BEGIN CERTIFICATE-----\ MIICCTCCAY+gAwIBAgIQaEpYcIBr8I8C+vbe6LCQkDAKBggqhkjOPQQDAzBGMQswCQYDVQQGEwJD\ TjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxGzAZBgNVBAMTEkNBIFdvU2lnbiBFQ0MgUm9v\ dDAeFw0xNDExMDgwMDU4NThaFw00NDExMDgwMDU4NThaMEYxCzAJBgNVBAYTAkNOMRowGAYDVQQK\ ExFXb1NpZ24gQ0EgTGltaXRlZDEbMBkGA1UEAxMSQ0EgV29TaWduIEVDQyBSb290MHYwEAYHKoZI\ zj0CAQYFK4EEACIDYgAE4f2OuEMkq5Z7hcK6C62N4DrjJLnSsb6IOsq/Srj57ywvr1FQPEd1bPiU\ t5v8KB7FVMxjnRZLU8HnIKvNrCXSf4/CwVqCXjCLelTOA7WRf6qU0NGKSMyCBSah1VES1ns2o0Iw\ QDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUqv3VWqP2h4syhf3R\ MluARZPzA7gwCgYIKoZIzj0EAwMDaAAwZQIxAOSkhLCB1T2wdKyUpOgOPQB0TKGXa/kNUTyh2Tv0\ Daupn75OcsqF1NnstTJFGG+rrQIwfcf3aWMvoeGY7xMQ0Xk/0f7qO3/eVvSQsRUR2LIiFdAvwyYu\ a/GRspBl9JrmkO5K\ -----END CERTIFICATE-----\ "; #ifdef __cplusplus } #endif gsoap-2.8.28/gsoap/plugin/logging.h0000644000175000017500000000635612653650150016507 0ustar ellertellert/* logging.h Message logging plugin and stat collector for webserver. Register the plugin with: soap_register_plugin(soap, logging); Change logging destinations: soap_set_logging_inbound(struct soap*, FILE*); soap_set_logging_outbound(struct soap*, FILE*); Obtain stats (sent and recv octet count): soap_get_logging_stats(soap, size_t *sent, size_t *recv); gSOAP XML Web services tools Copyright (C) 2000-2008, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under one of the following licenses: GPL, the gSOAP public license, or Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2008, Robert van Engelen, Genivia Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #ifndef LOGGING_H #define LOGGING_H #include "stdsoap2.h" #ifdef __cplusplus extern "C" { #endif #define LOGGING_ID "LOGGING-1.3" extern const char logging_id[]; struct logging_data { FILE *inbound; FILE *outbound; size_t stat_sent; size_t stat_recv; int (*fsend)(struct soap*, const char*, size_t); /* to save and use send callback */ size_t (*frecv)(struct soap*, char*, size_t); /* to save and use recv callback */ }; int logging(struct soap *soap, struct soap_plugin *plugin, void *arg); void soap_set_logging_inbound(struct soap *soap, FILE *fd); void soap_set_logging_outbound(struct soap *soap, FILE *fd); void soap_get_logging_stats(struct soap *soap, size_t *sent, size_t *recv); #ifdef __cplusplus } #endif #endif gsoap-2.8.28/gsoap/plugin/httppost.h0000644000175000017500000000712612653650150016742 0ustar ellertellert/* httppost.h gSOAP HTTP POST plugin for non-SOAP payloads. See httppost.c for instructions. Revisions: register multiple POST content handlers, each for a content type gSOAP XML Web services tools Copyright (C) 2004-2009, Robert van Engelen, Genivia, Inc. All Rights Reserved. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2004 Robert A. van Engelen, Genivia inc. All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- */ #ifndef HTTPPOST_H #define HTTPPOST_H #include "stdsoap2.h" #ifdef __cplusplus extern "C" { #endif #define HTTP_POST_ID "HTTP-POST-1.1" /* plugin identification */ extern const char http_post_id[]; typedef int (*http_handler_t)(struct soap*); struct http_post_handlers { const char *type; http_handler_t handler; }; /* This is the local plugin data shared among all copies of the soap struct: */ struct http_post_data { int (*fparsehdr)(struct soap*, const char*, const char*); /* to save and call the internal HTTP header parser */ int (*fput)(struct soap*); /* to save */ int (*fdel)(struct soap*); /* to save */ struct http_post_handlers *handlers; /* the server-side POST content type handlers */ }; /* the http post plugin, note: argument should be a table of type-handler pairs */ int http_post(struct soap*, struct soap_plugin*, void*); /* a function to send HTTP POST, should be followd by a soap_send to transmit and soap_get_http_body to retrieve the HTTP body returned into an internal buffer */ int soap_post_connect(struct soap*, const char *endpoint, const char *action, const char *type); /* a function to send HTTP PUT, should be followed by a soap_send to transmit data */ int soap_put_connect(struct soap*, const char *endpoint, const char *action, const char *type); /* a function to send HTTP DELETE */ int soap_delete_connect(struct soap*, const char *endpoint, const char *action, const char *type); /* a function to retrieve the HTTP body into an internal buffer */ int soap_http_body(struct soap*, char **buf, size_t *len); #ifdef __cplusplus } #endif #endif gsoap-2.8.28/gsoap/plugin/httppost.c0000644000175000017500000002511012653650150016726 0ustar ellertellert/* httppost.c gSOAP HTTP POST plugin for non-SOAP payloads. See instructions below. Revisions: register multiple POST content handlers, each for a content type Note: multipart/related and multipart/form-data are already handled in gSOAP. gSOAP XML Web services tools Copyright (C) 2004-2005, Robert van Engelen, Genivia, Inc. All Rights Reserved. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2004 Robert A. van Engelen, Genivia inc. All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- Compile & link with stand-alone gSOAP server. Usage (server side): Define a NULL-terminated array of type-handler pairs, each with a media type and a the handler function: struct http_post_handlers my_handlers[] = { { "image/jpg", jpeg_handler }, { "image/ *", image_handler }, { "text/html", html_handler }, { "text/ *", text_handler }, { "text/ *;*", text_handler }, { "POST", generic_POST_handler }, { "PUT", generic_PUT_handler }, { "DELETE", generic_DELETE_handler }, { NULL } }; Note that '*' can be used as a wildcard and some media types may have optional parameters (after ';'). Register the plugin and the handlers: struct soap soap; soap_init(&soap); soap_register_plugin_arg(&soap, http_post, my_handlers); ... ... = soap_copy(&soap); // copies plugin too but not its data: plugin data is shared since fcopy is not set ... soap_done(&soap); // detach plugin (calls plugin->fdelete) A POST handler function is triggered by the media type in the http_post_handlers table. Use http_get_http_body() as below to retrieve HTTP POST body data: int image_handler(struct soap *soap) { const char *buf; size_t len; // if necessary, check type in soap->http_content if (soap->http_content && !soap_tag_cmp(soap->http_content, "image/gif") return 404; if (!(buf = soap_get_http_body(soap, &len)) return soap->error; soap_end_recv(soap); // ... process image in buf[0..len-1] // reply with empty HTTP OK response: return soap_send_empty_response(soap, SOAP_OK); } This function should also produce a valid HTTP response, for example: if (we want to return HTML) soap_response(soap, SOAP_HTML); // use this to return HTML... else { soap->http_content = "image/jpeg"; // a jpeg image soap_response(soap, SOAP_FILE); // SOAP_FILE sets custom http content } ... soap_send(soap, "..."); // example HTML ... soap_end_send(soap); soap_closesock(soap); // close, but keep open only with HTTP keep-alive The soap_send(soap, char*) and soap_send_raw(soap, char*, size_t) can be used to return content from server. Usage (client side): char *buf; // to hold the HTTP response body data size_t len; ... if (soap_post_connect(soap, "URL", "SOAP action or NULL", "media type") || soap_send(soap, ...) || soap_end_send(soap)) ... error ... if (soap_begin_recv(&soap) || soap_http_body(&soap, &buf, &len) || soap_end_recv(&soap)) ... error ... // ... use buf[0..len-1] soap_closesock(soap); // close, but keep open only with HTTP keep-alive soap_end(soap); // also deletes buf content The soap_send(soap, char*) and soap_send_raw(soap, char*, size_t) can be used to send content to the server as shown above. */ #include "httppost.h" #ifdef __cplusplus extern "C" { #endif const char http_post_id[14] = HTTP_POST_ID; static int http_post_init(struct soap *soap, struct http_post_data *data, struct http_post_handlers *handlers); static void http_post_delete(struct soap *soap, struct soap_plugin *p); static int http_post_parse_header(struct soap *soap, const char*, const char*); static http_handler_t http_lookup_handler(struct soap *soap, const char *type, struct http_post_data *data); static int http_fput(struct soap *soap); static int http_fdel(struct soap *soap); int http_post(struct soap *soap, struct soap_plugin *p, void *arg) { p->id = http_post_id; p->data = (void*)malloc(sizeof(struct http_post_data)); p->fdelete = http_post_delete; if (p->data) if (http_post_init(soap, (struct http_post_data*)p->data, (struct http_post_handlers *)arg)) { free(p->data); /* error: could not init */ return SOAP_EOM; /* return error */ } return SOAP_OK; } static int http_post_init(struct soap *soap, struct http_post_data *data, struct http_post_handlers *handlers) { data->fparsehdr = soap->fparsehdr; /* save old HTTP header parser callback */ soap->fparsehdr = http_post_parse_header; /* replace HTTP header parser callback with ours */ data->fput = soap->fput; soap->fput = http_fput; data->fdel = soap->fdel; soap->fdel = http_fdel; data->handlers = handlers; return SOAP_OK; } static void http_post_delete(struct soap *soap, struct soap_plugin *p) { soap->fparsehdr = ((struct http_post_data*)p->data)->fparsehdr; soap->fput = ((struct http_post_data*)p->data)->fput; soap->fdel = ((struct http_post_data*)p->data)->fdel; free(p->data); /* free allocated plugin data (this function is not called for shared plugin data, but only when the final soap_done() is invoked on the original soap struct) */ } static int http_post_parse_header(struct soap *soap, const char *key, const char *val) { struct http_post_data *data = (struct http_post_data*)soap_lookup_plugin(soap, http_post_id); if (!data) return SOAP_PLUGIN_ERROR; soap->error = data->fparsehdr(soap, key, val); /* parse HTTP header */ if (soap->error == SOAP_OK) { if (!soap_tag_cmp(key, "Content-Type")) { /* check content type */ soap->fform = http_lookup_handler(soap, val, data); if (!soap->fform) soap->fform = http_lookup_handler(soap, "POST", data); if (soap->fform) return SOAP_FORM; /* calls soap->fform after processing the HTTP header */ } } return soap->error; } static http_handler_t http_lookup_handler(struct soap *soap, const char *type, struct http_post_data *data) { struct http_post_handlers *p; for (p = data->handlers; p && p->type; p++) { if (!soap_tag_cmp(type, p->type)) { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Found HTTP POST plugin handler for '%s'\n", type)); return p->handler; } } return NULL; } static int http_fput(struct soap *soap) { struct http_post_data *data = (struct http_post_data*)soap_lookup_plugin(soap, http_post_id); if (!data) return SOAP_PLUGIN_ERROR; soap->fform = http_lookup_handler(soap, "PUT", data); if (soap->fform) return SOAP_FORM; return 405; } static int http_fdel(struct soap *soap) { struct http_post_data *data = (struct http_post_data*)soap_lookup_plugin(soap, http_post_id); if (!data) return SOAP_PLUGIN_ERROR; soap->fform = http_lookup_handler(soap, "DELETE", data); if (soap->fform) return SOAP_STOP; return 405; } /******************************************************************************/ int soap_post_connect(struct soap *soap, const char *endpoint, const char *action, const char *type) { if ((soap->omode & SOAP_IO) != SOAP_IO_CHUNK) /* not chunking: store in buf */ soap->omode = (soap->omode & ~SOAP_IO) | SOAP_IO_STORE; soap->http_content = type; return soap_connect_command(soap, SOAP_POST_FILE, endpoint, action); } int soap_put_connect(struct soap *soap, const char *endpoint, const char *action, const char *type) { if ((soap->omode & SOAP_IO) != SOAP_IO_CHUNK) /* not chunking: store in buf */ soap->omode = (soap->omode & ~SOAP_IO) | SOAP_IO_STORE; soap->http_content = type; return soap_connect_command(soap, SOAP_PUT, endpoint, action); } int soap_delete_connect(struct soap *soap, const char *endpoint, const char *action, const char *type) { if (soap_connect_command(soap, SOAP_DEL, endpoint, action) || soap_end_send(soap)) return soap_closesock(soap); return soap_closesock(soap); } int soap_http_body(struct soap *soap, char **buf, size_t *len) { char *s = *buf = NULL; /* It is unlikely chunked and/or compressed POST messages are sent by browsers, but we need to handle them */ if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK #ifdef WITH_ZLIB || soap->zlib_in != SOAP_ZLIB_NONE #endif ) { size_t k; size_t n; soap_wchar c = EOF; soap->labidx = 0; do { if (soap_append_lab(soap, NULL, 0)) return soap->error; s = soap->labbuf + soap->labidx; k = soap->lablen - soap->labidx; soap->labidx = soap->lablen; while (k--) { if ((c = soap_getchar(soap)) == (int)EOF) break; *s++ = c; } } while (c != (int)EOF); n = soap->lablen - k - 1; *buf = (char*)soap_malloc(soap, n + 1); soap_memcpy(*buf, n + 1, soap->labbuf, n + 1); if (len) *len = n; } else { if (soap->length) { s = (char*)soap_malloc(soap, soap->length + 1); if (s) { char *t = s; size_t i; for (i = soap->length; i; i--) { soap_wchar c; if ((c = soap_getchar(soap)) == (int)EOF) return soap->error = SOAP_EOF; *t++ = c; } *t = '\0'; } } *buf = s; if (len) *len = soap->length; } return SOAP_OK; } /******************************************************************************/ #ifdef __cplusplus } #endif gsoap-2.8.28/gsoap/plugin/httpget.c0000644000175000017500000002434712653650150016533 0ustar ellertellert/* httpget.c gSOAP HTTP GET plugin. See instructions below. gSOAP XML Web services tools Copyright (C) 2000-2008, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under ONE of the following licenses: GPL, the gSOAP public license, OR Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2008 Robert A. van Engelen, Genivia inc. All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- Compile & link with stand-alone gSOAP server for HTTP GET support. Compile & link with gSOAP clients for client-side HTTP GET requests. Usage (server side): struct soap soap; soap_init(&soap); soap_register_plugin_arg(&soap, http_get, http_get_handler); ... ... = soap_copy(&soap); // copies plugin too but not its data: plugin data is shared since fcopy is not set ... soap_done(&soap); // detach plugin (calls plugin->fdelete) You need to define a HTTP GET handling function at the server-side: int http_get_handler(struct soap*) which will be called from the plugin upon an HTTP GET request. The function should return an error code or SOAP_OK; This function should produce a valid HTTP response, for example: soap_response(soap, SOAP_HTML); // use this to return HTML ... soap_response(soap, SOAP_OK); // ... or use this to return a SOAP message ... soap_send(soap, "..."); // example HTML ... soap_end_send(soap); To get query string key-value pairs within a service routine, use: char *s; s = query(soap); while (s) { char *key = query(soap, &s); char *val = query(soap, &s); ... } This will garble soap->path, which contains the HTTP path of the form: /path?query where path and/or ?query may be absent. The path info is obtained from the HTTP request URL: http://domain/path?query The URL should not exceed the length of SOAP_TAGLEN. Adjust SOAP_TAGLEN in stdsoap2.h if necessary. Usage (client side): For SOAP calls, declare a one-way response message in the header file, for example: int ns__methodResponse(... params ..., void); The params will hold the return values returned by the server's SOAP response message. Client code: struct soap soap; soap_init(&soap); soap_register_plugin(&soap, http_get); // register plugin ... if (soap_get_connect(&soap, endpoint, action)) ... connect error ... else if (soap_recv_ns__methodResponse(&soap, ... params ...)) ... error ... else ... ok ... soap_destroy(&soap); soap_end(&soap); soap_done(&soap); Note that the endpoint URL may contain a query string with key-value pairs to pass to the server, e.g.: http://domain/path?key=val&key=val To use general HTTP GET, for example to retrieve an HTML document, use: struct soap soap; char *buf = NULL; size_t len; soap_init(&soap); soap_register_plugin(&soap, http_get); // register plugin if (soap_get_connect(&soap, endpoint, action) || soap_begin_recv(&soap)) ... connect/recv error ... else buf = soap_get_http_body(&soap, &len); soap_end_recv(&soap); ... process data in buf[0..len-1] soap_destroy(&soap); soap_end(&soap); soap_done(&soap); The soap_get_http_body() function above moves HTTP body content into a buffer. */ #include "httpget.h" #ifdef __cplusplus extern "C" { #endif const char http_get_id[13] = HTTP_GET_ID; static int http_get_init(struct soap *soap, struct http_get_data *data, int (*handler)(struct soap*)); static void http_get_delete(struct soap *soap, struct soap_plugin *p); static int http_get_parse(struct soap *soap); int http_get(struct soap *soap, struct soap_plugin *p, void *arg) { p->id = http_get_id; p->data = (void*)malloc(sizeof(struct http_get_data)); /* p->fcopy = http_get_copy; obsolete, see note with http_get_copy() */ p->fdelete = http_get_delete; if (p->data) if (http_get_init(soap, (struct http_get_data*)p->data, (int (*)(struct soap*))arg)) { free(p->data); /* error: could not init */ return SOAP_EOM; /* return error */ } return SOAP_OK; } static int http_get_init(struct soap *soap, struct http_get_data *data, int (*handler)(struct soap*)) { data->fparse = soap->fparse; /* save old HTTP header parser callback */ data->fget = handler; data->stat_get = 0; data->stat_post = 0; data->stat_fail = 0; memset((void*)data->min, 0, sizeof(data->min)); memset((void*)data->hour, 0, sizeof(data->hour)); memset((void*)data->day, 0, sizeof(data->day)); soap->fparse = http_get_parse; /* replace HTTP header parser callback with ours */ return SOAP_OK; } /* We will share the plugin data among all soap copies created with soap_copy(), so we don't have to define this static int http_get_copy(struct soap *soap, struct soap_plugin *dst, struct soap_plugin *src) { *dst = *src; return SOAP_OK; } */ static void http_get_delete(struct soap *soap, struct soap_plugin *p) { (void)soap; free(p->data); /* free allocated plugin data (this function is not called for shared plugin data, but only when the final soap_done() is invoked on the original soap struct) */ } static int http_get_parse(struct soap *soap) { #ifndef WITH_LEAN time_t t; struct tm T, *pT; #endif struct http_get_data *data = (struct http_get_data*)soap_lookup_plugin(soap, http_get_id); if (!data) return SOAP_PLUGIN_ERROR; #ifndef WITH_LEAN time(&t); #ifdef HAVE_LOCALTIME_R pT = localtime_r(&t, &T); #else pT = localtime(&t); #endif /* updates should be in mutex, but we don't mind some inaccuracy in the count to preserve performance */ data->day[pT->tm_yday]++; data->day[(pT->tm_yday + 1) % 365] = 0; data->hour[pT->tm_hour]++; data->hour[(pT->tm_hour + 1) % 24] = 0; data->min[pT->tm_min]++; data->min[(pT->tm_min + 1) % 60] = 0; #endif soap->error = data->fparse(soap); /* parse HTTP header */ if (soap->error == SOAP_OK) { /* update should be in mutex, but we don't mind some inaccuracy in the count */ data->stat_post++; } else if (soap->error == SOAP_GET_METHOD && data->fget) { soap->error = SOAP_OK; if ((soap->error = data->fget(soap))) /* call user-defined HTTP GET handler */ { /* update should be in mutex, but we don't mind some inaccuracy in the count */ data->stat_fail++; return soap->error; } /* update should be in mutex, but we don't mind some inaccuracy in the count */ data->stat_get++; return SOAP_STOP; /* stop processing the request and do not return SOAP Fault */ } else { /* update should be in mutex, but we don't mind some inaccuracy in the count */ data->stat_fail++; } return soap->error; } /******************************************************************************/ int soap_get_connect(struct soap *soap, const char *endpoint, const char *action) { return soap_connect_command(soap, SOAP_GET, endpoint, action); } char *query(struct soap *soap) { return strchr(soap->path, '?'); } char *query_key(struct soap *soap, char **s) { char *t = *s; (void)soap; if (t && *t) { *s = (char*)soap_decode_string(t, strlen(t), t + 1); return t; } return *s = NULL; } char *query_val(struct soap *soap, char **s) { char *t = *s; (void)soap; if (t && *t == '=') { *s = (char*)soap_decode_string(t, strlen(t), t + 1); return t; } return NULL; } int soap_encode_string(const char *s, char *t, size_t len) { int c; size_t n = len; while ((c = *s++) && n-- > 1) { if (c == ' ') *t++ = '+'; else if (c == '!' || c == '$' || (c >= '(' && c <= '.') || (c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') || c == '_' || (c >= 'a' && c <= 'z')) *t++ = (char)c; else if (n > 2) { *t++ = '%'; *t++ = (char)((c >> 4) + (c > 159 ? '7' : '0')); c &= 0xF; *t++ = (char)(c + (c > 9 ? '7' : '0')); n -= 2; } else break; } *t = '\0'; return len - n; } const char* soap_decode_string(char *buf, size_t len, const char *val) { const char *s; char *t; for (s = val; *s; s++) if (*s != ' ' && *s != '=') break; if (*s == '"') { t = buf; s++; while (*s && *s != '"' && --len) *t++ = *s++; *t = '\0'; do s++; while (*s && *s != '&' && *s != '='); } else { t = buf; while (*s && *s != '&' && *s != '=' && --len) { switch (*s) { case '+': *t++ = ' '; case ' ': s++; break; case '%': *t++ = ((s[1] >= 'A' ? (s[1]&0x7) + 9 : s[1] - '0') << 4) + (s[2] >= 'A' ? (s[2]&0x7) + 9 : s[2] - '0'); s += 3; break; default: *t++ = *s++; } } *t = '\0'; } return s; } /******************************************************************************/ #ifdef __cplusplus } #endif gsoap-2.8.28/gsoap/plugin/wsse2api.h0000644000175000017500000003153012653650150016606 0ustar ellertellert/* wsse2api.h WS-Security plugin. See wsseapi.c for documentation and details. gSOAP XML Web services tools Copyright (C) 2000-2005, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under one of the following licenses: GPL, the gSOAP public license, or Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2005, Robert van Engelen, Genivia Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #ifndef WSSEAPI_H #define WSSEAPI_H #include "soapH.h" /* replace with soapcpp2-generated *H.h file */ #include "smdevp.h" #include "mecevp.h" #ifdef __cplusplus extern "C" { #endif /** plugin identification for plugin registry */ #define SOAP_WSSE_ID "SOAP-WSSE-1.3" /** to ignore extra/external SignedInfo/Reference/@URI */ #define SOAP_WSSE_IGNORE_EXTRA_REFS (0x1000) /** plugin identification for plugin registry */ extern const char soap_wsse_id[]; /** @struct soap_wsse_data @brief wsseapi plugin data The signature key (private) and verification key (public) are kept in the plugin data, together with other info. */ struct soap_wsse_data { const char *sigid; /**< string with wsu:Id names to sign */ const char *encid; /**< string with wsu:Id names to encrypt */ int sign_alg; /**< The digest or signature algorithm used */ const void *sign_key; /**< EVP_PKEY or key string for HMAC */ int sign_keylen; /**< HMAC key length */ int vrfy_alg; /**< The signature verify algorithm used */ const void *vrfy_key; /**< EVP_PKEY or key string for HMAC verify */ int vrfy_keylen; /**< HMAC key length */ int enco_alg; /**< current encrypt algorithm used */ const char *enco_keyname; /**< optional key name (id of symmetric key) */ const void *enco_key; /**< EVP_PKEY or secret key */ int enco_keylen; /**< secret key length */ int deco_alg; /**< decrypt algorithm used */ const void *deco_key; /**< EVP_PKEY or secret key */ int deco_keylen; /**< secret key length */ struct soap_wsse_digest *digest; /**< List of ID-hash pairs */ int (*fpreparesend)(struct soap*, const char*, size_t); int (*fpreparefinalsend)(struct soap*); int (*fpreparefinalrecv)(struct soap*); int (*fheader)(struct soap*); struct soap_mec_data *mec; X509_STORE *store; const void *(*security_token_handler)(struct soap *soap, int *alg, const char *keyname, int *keylen); }; /** @struct soap_wsse_digest @brief Digest dictionary: linked list of ID-hash pairs The digest dictionary is populated by the soap_wsse_preparesend callback. The callback intercepts XML elements with wsu:Id attributes and computes the digest during the preprocessing of a message transmission. The 'level' field is used to determine when the end of an element is reached by handling inner wsu:Id attributed elements, so that the outer wsu:Id attributed element can be hashed. */ struct soap_wsse_digest { struct soap_wsse_digest *next; /**< Next in list */ unsigned int level; /**< XML parser depth level */ struct soap_smd_data smd; /**< smdevp engine context */ unsigned char hash[SOAP_SMD_MAX_SIZE];/**< Digest hash value */ char id[1]; /**< String flows down the struct */ }; extern const char *wsse_PasswordTextURI; extern const char *wsse_PasswordDigestURI; extern const char *wsse_Base64BinaryURI; extern const char *wsse_X509v3URI; extern const char *wsse_X509v3SubjectKeyIdentifierURI; extern const char *ds_sha1URI; extern const char *ds_sha256URI; extern const char *ds_sha512URI; extern const char *ds_hmac_sha1URI; extern const char *ds_hmac_sha256URI; extern const char *ds_hmac_sha512URI; extern const char *ds_dsa_sha1URI; extern const char *ds_rsa_sha1URI; extern const char *ds_rsa_sha256URI; extern const char *ds_rsa_sha512URI; extern const char *xenc_rsa15URI; extern const char *xenc_rsaesURI; extern const char *xenc_3desURI; extern const char *xenc_aes128URI; extern const char *xenc_aes192URI; extern const char *xenc_aes256URI; extern const char *xenc_aes512URI; extern const char *xenc_elementURI; extern const char *xenc_contentURI; extern const char *ds_URI; extern const char *c14n_URI; extern const char *wsu_URI; struct _wsse__Security* soap_wsse_add_Security(struct soap *soap); struct _wsse__Security* soap_wsse_add_Security_actor(struct soap *soap, const char *actor); void soap_wsse_delete_Security(struct soap *soap); struct _wsse__Security* soap_wsse_Security(struct soap *soap); struct ds__SignatureType* soap_wsse_add_Signature(struct soap *soap); void soap_wsse_delete_Signature(struct soap *soap); struct ds__SignatureType* soap_wsse_Signature(struct soap *soap); int soap_wsse_add_Timestamp(struct soap *soap, const char *id, time_t lifetime); struct _wsu__Timestamp *soap_wsse_Timestamp(struct soap *soap); int soap_wsse_verify_Timestamp(struct soap *soap); int soap_wsse_add_UsernameTokenText(struct soap *soap, const char *id, const char *username, const char *password); int soap_wsse_add_UsernameTokenDigest(struct soap *soap, const char *id, const char *username, const char *password); struct _wsse__UsernameToken *soap_wsse_UsernameToken(struct soap *soap, const char *id); const char* soap_wsse_get_Username(struct soap *soap); int soap_wsse_verify_Password(struct soap *soap, const char *password); int soap_wsse_add_BinarySecurityToken(struct soap *soap, const char *id, const char *valueType, const unsigned char *data, int size); int soap_wsse_add_BinarySecurityTokenX509(struct soap *soap, const char *id, X509 *cert); int soap_wsse_add_BinarySecurityTokenPEM(struct soap *soap, const char *id, const char *filename); struct _wsse__BinarySecurityToken *soap_wsse_BinarySecurityToken(struct soap *soap, const char *id); int soap_wsse_get_BinarySecurityToken(struct soap *soap, const char *id, char **valueType, unsigned char **data, int *size); X509 *soap_wsse_get_BinarySecurityTokenX509(struct soap *soap, const char *id); int soap_wsse_verify_X509(struct soap *soap, X509 *cert); int soap_wsse_add_SecurityContextToken(struct soap *soap, const char *id, const char *identifier); const char * soap_wsse_get_SecurityContextToken(struct soap *soap); struct ds__SignedInfoType *soap_wsse_add_SignedInfo(struct soap *soap); int soap_wsse_add_SignedInfo_Reference(struct soap *soap, const char *URI, const char *transform, const char *inclusiveNamespaces, int alg, const char *HA); int soap_wsse_add_SignedInfo_SignatureMethod(struct soap *soap, const char *method, int canonical); struct ds__SignedInfoType *soap_wsse_SignedInfo(struct soap *soap); int soap_wsse_get_SignedInfo_SignatureMethod(struct soap *soap, int *alg); int soap_wsse_add_SignatureValue(struct soap *soap, int alg, const void *key, int keylen); int soap_wsse_verify_SignatureValue(struct soap *soap, int alg, const void *key, int keylen); int soap_wsse_verify_SignedInfo(struct soap *soap); int soap_wsse_verify_digest(struct soap *soap, int alg, int canonical, const char *id, unsigned char hash[SOAP_SMD_MAX_SIZE]); struct ds__KeyInfoType *soap_wsse_add_KeyInfo(struct soap *soap); struct ds__KeyInfoType *soap_wsse_KeyInfo(struct soap *soap); int soap_wsse_add_KeyInfo_KeyName(struct soap *soap, const char *name); const char *soap_wsse_get_KeyInfo_KeyName(struct soap *soap); int soap_wsse_add_KeyInfo_SecurityTokenReferenceURI(struct soap *soap, const char *URI, const char *valueType); int soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(struct soap *soap, const char *URI); const char *soap_wsse_get_KeyInfo_SecurityTokenReferenceURI(struct soap *soap); const char *soap_wsse_get_KeyInfo_SecurityTokenReferenceValueType(struct soap *soap); X509 *soap_wsse_get_KeyInfo_SecurityTokenReferenceX509(struct soap *soap); struct ds__X509IssuerSerialType *soap_wsse_get_KeyInfo_SecurityTokenReferenceX509Data(struct soap *soap); int soap_wsse_add_KeyInfo_SecurityTokenReferenceKeyIdentifier(struct soap *soap, const char *id, const char *valueType, unsigned char *data, int size); const char *soap_wsse_get_KeyInfo_SecurityTokenReferenceKeyIdentifierValueType(struct soap *soap); const unsigned char *soap_wsse_get_KeyInfo_SecurityTokenReferenceKeyIdentifier(struct soap *soap, int *size); int soap_wsse_add_KeyInfo_SecurityTokenReferenceEmbedded(struct soap *soap, const char *id, const char *valueType); int soap_wsse_add_EncryptedData_KeyInfo_KeyName(struct soap *soap, const char *keyname); int soap_wsse_sender_fault_subcode(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail); int soap_wsse_receiver_fault_subcode(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail); int soap_wsse_sender_fault(struct soap *soap, const char *faultstring, const char *faultdetail); int soap_wsse_receiver_fault(struct soap *soap, const char *faultstring, const char *faultdetail); int soap_wsse_fault(struct soap *soap, enum wsse__FaultcodeEnum fault, const char *detail); int soap_wsse(struct soap *soap, struct soap_plugin *p, void *arg); int soap_wsse_sign(struct soap *soap, int alg, const void *key, int keylen); int soap_wsse_sign_body(struct soap *soap, int alg, const void *key, int keylen); int soap_wsse_verify_init(struct soap *soap); int soap_wsse_verify_auto(struct soap *soap, int alg, const void *key, size_t keylen); int soap_wsse_verify_done(struct soap *soap); size_t soap_wsse_verify_element(struct soap *soap, const char *URI, const char *tag); int soap_wsse_verify_body(struct soap *soap); int soap_wsse_set_wsu_id(struct soap *soap, const char *tags); int soap_wsse_sign_only(struct soap *soap, const char *tags); int soap_wsse_add_EncryptedKey(struct soap *soap, int alg, const char *URI, X509 *cert, const char *subjectkeyid, const char *issuer, const char *serial); int soap_wsse_add_EncryptedKey_encrypt_only(struct soap *soap, int alg, const char *URI, X509 *cert, const char *subjectkeyid, const char *issuer, const char *serial, const char *tags); int soap_wsse_verify_EncryptedKey(struct soap *soap); void soap_wsse_delete_EncryptedKey(struct soap *soap); struct xenc__EncryptedKeyType* soap_wsse_EncryptedKey(struct soap *soap); int soap_wsse_add_EncryptedKey_DataReferenceURI(struct soap *soap, const char *URI); int soap_wsse_add_DataReferenceURI(struct soap *soap, const char *URI); int soap_wsse_encrypt_body(struct soap *soap, int alg, const void *key, int keylen); int soap_wsse_encrypt_only(struct soap *soap, int alg, const void *key, int keylen, const char *tags); int soap_wsse_encrypt(struct soap *soap, int alg, const void *key, int keylen); int soap_wsse_decrypt_auto(struct soap *soap, int alg, const void *key, int keylen); int soap_wsse_encrypt_begin(struct soap *soap, const char *id, int alg, const char *URI, const char *keyname, const unsigned char *key); int soap_wsse_encrypt_end(struct soap *soap); int soap_wsse_decrypt_begin(struct soap *soap, const unsigned char *key); int soap_wsse_decrypt_end(struct soap *soap); #ifdef __cplusplus } #endif SOAP_FMAC1 void SOAP_FMAC2 soap_default_xsd__anyType(struct soap*, struct soap_dom_element *node); SOAP_FMAC1 int SOAP_FMAC2 soap_out_xsd__anyType(struct soap *soap, const char *tag, int id, const struct soap_dom_element *node, const char *type); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_in_xsd__anyType(struct soap *soap, const char *tag, struct soap_dom_element *node, const char *type); #endif gsoap-2.8.28/gsoap/plugin/wsseapi-lite.h0000644000175000017500000001010312653650150017450 0ustar ellertellert/* wsseapi-lite.h WS-Security, lite version (time stamp and user name token only). See wsseapi-lite.c for documentation and details. gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under one of the following licenses: GPL, the gSOAP public license, or Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #ifndef WSSEAPI_H #define WSSEAPI_H #include "soapH.h" /* replace with soapcpp2-generated *H.h file */ #ifdef __cplusplus extern "C" { #endif extern const char *wsse_PasswordTextURI; struct _wsse__Security* soap_wsse_add_Security(struct soap *soap); struct _wsse__Security* soap_wsse_add_Security_actor(struct soap *soap, const char *actor); void soap_wsse_delete_Security(struct soap *soap); struct _wsse__Security* soap_wsse_Security(struct soap *soap); struct ds__SignatureType* soap_wsse_add_Signature(struct soap *soap); void soap_wsse_delete_Signature(struct soap *soap); struct ds__SignatureType* soap_wsse_Signature(struct soap *soap); int soap_wsse_add_Timestamp(struct soap *soap, const char *id, time_t lifetime); struct _wsu__Timestamp *soap_wsse_Timestamp(struct soap *soap); int soap_wsse_verify_Timestamp(struct soap *soap); int soap_wsse_add_UsernameTokenText(struct soap *soap, const char *id, const char *username, const char *password); struct _wsse__UsernameToken *soap_wsse_UsernameToken(struct soap *soap, const char *id); const char* soap_wsse_get_Username(struct soap *soap); int soap_wsse_verify_Password(struct soap *soap, const char *password); int soap_wsse_sender_fault_subcode(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail); int soap_wsse_receiver_fault_subcode(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail); int soap_wsse_sender_fault(struct soap *soap, const char *faultstring, const char *faultdetail); int soap_wsse_receiver_fault(struct soap *soap, const char *faultstring, const char *faultdetail); int soap_wsse_fault(struct soap *soap, enum wsse__FaultcodeEnum fault, const char *detail); int soap_wsse_set_wsu_id(struct soap *soap, const char *tags); #ifdef __cplusplus } #endif #endif gsoap-2.8.28/gsoap/plugin/calcrest.h0000644000175000017500000006172112653650150016656 0ustar ellertellert/* calcrest.h Generated by wsdl2h 2.8.14 from calcrest.wsdl and typemap.dat 2013-05-08 02:22:07 GMT DO NOT INCLUDE THIS FILE DIRECTLY INTO YOUR PROJECT BUILDS USE THE soapcpp2-GENERATED SOURCE CODE FILES FOR YOUR PROJECT BUILDS gSOAP XML Web services tools. Copyright (C) 2000-2013 Robert van Engelen, Genivia Inc. All Rights Reserved. Part of this software is released under one of the following licenses: GPL or Genivia's license for commercial use. */ /** @page page_notes Usage Notes NOTE: - Run soapcpp2 on calcrest.h to generate the SOAP/XML processing logic. Use soapcpp2 -I to specify paths for #import To build with STL, 'stlvector.h' is imported from 'import' dir in package. Use soapcpp2 -j to generate improved proxy and server classes. - Use wsdl2h -c and -s to generate pure C code or C++ code without STL. - Use 'typemap.dat' to control namespace bindings and type mappings. It is strongly recommended to customize the names of the namespace prefixes generated by wsdl2h. To do so, modify the prefix bindings in the Namespaces section below and add the modified lines to 'typemap.dat' to rerun wsdl2h. - Use Doxygen (www.doxygen.org) on this file to generate documentation. - Use wsdl2h -R to generate REST operations. - Use wsdl2h -nname to use name as the base namespace prefix instead of 'ns'. - Use wsdl2h -Nname for service prefix and produce multiple service bindings - Use wsdl2h -d to enable DOM support for xsd:anyType. - Use wsdl2h -g to auto-generate readers and writers for root elements. - Use wsdl2h -b to auto-generate bi-directional operations (duplex ops). - Struct/class members serialized as XML attributes are annotated with a '@'. - Struct/class members that have a special role are annotated with a '$'. WARNING: DO NOT INCLUDE THIS ANNOTATED FILE DIRECTLY IN YOUR PROJECT SOURCE CODE. USE THE FILES GENERATED BY soapcpp2 FOR YOUR PROJECT'S SOURCE CODE: THE soapStub.h FILE CONTAINS THIS CONTENT WITHOUT ANNOTATIONS. LICENSE: @verbatim -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2013, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial-use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- @endverbatim */ //gsoapopt cw /******************************************************************************\ * * * Definitions * * http://websrv.cs.fsu.edu/~engelen/calc.wsdl * * * \******************************************************************************/ /******************************************************************************\ * * * Import * * * \******************************************************************************/ /******************************************************************************\ * * * Schema Namespaces * * * \******************************************************************************/ /* NOTE: It is strongly recommended to customize the names of the namespace prefixes generated by wsdl2h. To do so, modify the prefix bindings below and add the modified lines to typemap.dat to rerun wsdl2h: ns1 = "http://websrv.cs.fsu.edu/~engelen/calc.wsdl" ns2 = "urn:calc" */ #define SOAP_NAMESPACE_OF_ns2 "urn:calc" //gsoap ns2 schema namespace: urn:calc //gsoap ns2 schema form: unqualified /******************************************************************************\ * * * Built-in Schema Types and Top-Level Elements and Attributes * * * \******************************************************************************/ /******************************************************************************\ * * * Schema Types and Top-Level Elements and Attributes * * urn:calc * * * \******************************************************************************/ /******************************************************************************\ * * * Schema Complex Types and Top-Level Elements * * urn:calc * * * \******************************************************************************/ /// "urn:calc":pair is a complexType. struct ns2__pair { /// Element a of type xs:double. double a 1; ///< Required element. /// Element b of type xs:double. double b 1; ///< Required element. }; /******************************************************************************\ * * * Additional Top-Level Elements * * urn:calc * * * \******************************************************************************/ /// Top-level root element "urn:calc":add of type "urn:calc":pair. /// Note: use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// Top-level root element "urn:calc":sub of type "urn:calc":pair. /// Note: use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// Top-level root element "urn:calc":mul of type "urn:calc":pair. /// Note: use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// Top-level root element "urn:calc":div of type "urn:calc":pair. /// Note: use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// Top-level root element "urn:calc":pow of type "urn:calc":pair. /// Note: use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// Top-level root element "urn:calc":addResponse of type xs:double. /// Note: use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// Top-level root element "urn:calc":subResponse of type xs:double. /// Note: use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// Top-level root element "urn:calc":mulResponse of type xs:double. /// Note: use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// Top-level root element "urn:calc":divResponse of type xs:double. /// Note: use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// Top-level root element "urn:calc":powResponse of type xs:double. /// Note: use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /******************************************************************************\ * * * Additional Top-Level Attributes * * urn:calc * * * \******************************************************************************/ /******************************************************************************\ * * * Services * * * \******************************************************************************/ //gsoap ns1 service name: calcPOST //gsoap ns1 service type: calcPortType //gsoap ns1 service port: http://websrv.cs.fsu.edu/~engelen/calcserver.cgi //gsoap ns1 service namespace: http://websrv.cs.fsu.edu/~engelen/calc.wsdl /** @mainpage calcPOST Definitions @section calcPOST_bindings Service Bindings - @ref calcPOST @section calcPOST_more More Information - @ref page_notes "Usage Notes" - @ref page_XMLDataBinding "XML Data Binding" - @ref SOAP_ENV__Header "SOAP Header Content" (when applicable) - @ref SOAP_ENV__Detail "SOAP Fault Detail Content" (when applicable) */ /** @page calcPOST Binding "calcPOST" @section calcPOST_operations Operations of Binding "calcPOST" - @ref __ns1__add - @ref __ns1__sub - @ref __ns1__mul - @ref __ns1__div - @ref __ns1__pow @section calcPOST_ports Endpoints of Binding "calcPOST" - http://websrv.cs.fsu.edu/~engelen/calcserver.cgi Note: use wsdl2h option -Nname to change the service binding prefix name */ /******************************************************************************\ * * * Service Binding * * calcPOST * * * \******************************************************************************/ /******************************************************************************\ * * * Service Operation * * __ns1__add * * * \******************************************************************************/ /// Operation "__ns1__add" of service binding "calcPOST" /** Operation details: - POST document/literal style messaging - Addressing input action: "" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___ns1__add( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: struct ns2__pair* ns2__add, // output parameters: double *ns2__addResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __ns1__add( struct soap *soap, // input parameters: struct ns2__pair* ns2__add, // output parameters: double *ns2__addResponse ); @endcode */ //gsoap ns1 service method-protocol: add POST //gsoap ns1 service method-style: add document //gsoap ns1 service method-encoding: add literal //gsoap ns1 service method-action: add "" int __ns1__add( struct ns2__pair* ns2__add, ///< Input parameter double *ns2__addResponse ///< Output parameter ); /******************************************************************************\ * * * Service Operation * * __ns1__sub * * * \******************************************************************************/ /// Operation "__ns1__sub" of service binding "calcPOST" /** Operation details: - POST document/literal style messaging - Addressing input action: "" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___ns1__sub( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: struct ns2__pair* ns2__sub, // output parameters: double *ns2__subResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __ns1__sub( struct soap *soap, // input parameters: struct ns2__pair* ns2__sub, // output parameters: double *ns2__subResponse ); @endcode */ //gsoap ns1 service method-protocol: sub POST //gsoap ns1 service method-style: sub document //gsoap ns1 service method-encoding: sub literal //gsoap ns1 service method-action: sub "" int __ns1__sub( struct ns2__pair* ns2__sub, ///< Input parameter double *ns2__subResponse ///< Output parameter ); /******************************************************************************\ * * * Service Operation * * __ns1__mul * * * \******************************************************************************/ /// Operation "__ns1__mul" of service binding "calcPOST" /** Operation details: - POST document/literal style messaging - Addressing input action: "" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___ns1__mul( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: struct ns2__pair* ns2__mul, // output parameters: double *ns2__mulResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __ns1__mul( struct soap *soap, // input parameters: struct ns2__pair* ns2__mul, // output parameters: double *ns2__mulResponse ); @endcode */ //gsoap ns1 service method-protocol: mul POST //gsoap ns1 service method-style: mul document //gsoap ns1 service method-encoding: mul literal //gsoap ns1 service method-action: mul "" int __ns1__mul( struct ns2__pair* ns2__mul, ///< Input parameter double *ns2__mulResponse ///< Output parameter ); /******************************************************************************\ * * * Service Operation * * __ns1__div * * * \******************************************************************************/ /// Operation "__ns1__div" of service binding "calcPOST" /** Operation details: - POST document/literal style messaging - Addressing input action: "" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___ns1__div( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: struct ns2__pair* ns2__div, // output parameters: double *ns2__divResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __ns1__div( struct soap *soap, // input parameters: struct ns2__pair* ns2__div, // output parameters: double *ns2__divResponse ); @endcode */ //gsoap ns1 service method-protocol: div POST //gsoap ns1 service method-style: div document //gsoap ns1 service method-encoding: div literal //gsoap ns1 service method-action: div "" int __ns1__div( struct ns2__pair* ns2__div, ///< Input parameter double *ns2__divResponse ///< Output parameter ); /******************************************************************************\ * * * Service Operation * * __ns1__pow * * * \******************************************************************************/ /// Operation "__ns1__pow" of service binding "calcPOST" /** Operation details: - POST document/literal style messaging - Addressing input action: "" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___ns1__pow( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: struct ns2__pair* ns2__pow, // output parameters: double *ns2__powResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __ns1__pow( struct soap *soap, // input parameters: struct ns2__pair* ns2__pow, // output parameters: double *ns2__powResponse ); @endcode */ //gsoap ns1 service method-protocol: pow POST //gsoap ns1 service method-style: pow document //gsoap ns1 service method-encoding: pow literal //gsoap ns1 service method-action: pow "" int __ns1__pow( struct ns2__pair* ns2__pow, ///< Input parameter double *ns2__powResponse ///< Output parameter ); /** @page calcPOST Binding "calcPOST" @section calcPOST_policy_enablers Policy Enablers of Binding "calcPOST" Based on policies, this service imports - WS-Policy reminders and enablers: - WS-Addressing 1.0 (2005/08, accepts 2004/08): @code #import "wsa5.h" // to be added to this header file for the soapcpp2 build step @endcode @code #include "plugin/wsaapi.h" soap_register_plugin(soap, soap_wsa); // register the wsa plugin in your code // See the user guide gsoap/doc/wsa/html/index.html @endcode - WS-Addressing (2004/08): @code #import "wsa.h" // to be added to this header file for the soapcpp2 build step @endcode @code #include "plugin/wsaapi.h" soap_register_plugin(soap, soap_wsa); // register the wsa plugin in your code // See the user guide gsoap/doc/wsa/html/index.html @endcode - WS-ReliableMessaging 1.0: @code #import "wsrm5.h" // to be added to this header file for the soapcpp2 build step @endcode @code #include "plugin/wsrmapi.h" soap_register_plugin(soap, soap_wsa); // register the wsa plugin in your code soap_register_plugin(soap, soap_wsrm); // register the wsrm plugin in your code // See the user guide gsoap/doc/wsrm/html/index.html @endcode - WS-ReliableMessaging 1.1: @code #import "wsrm.h" // to be added to this header file for the soapcpp2 build step @endcode @code #include "plugin/wsrmapi.h" soap_register_plugin(soap, soap_wsa); // register the wsa plugin in your code soap_register_plugin(soap, soap_wsrm); // register the wsrm plugin in your code // See the user guide gsoap/doc/wsrm/html/index.html @endcode - WS-Security (SOAP Message Security) 1.0 (accepts 1.1): @code #import "wsse.h" // to be added to this header file for the soapcpp2 build step @endcode @code #include "plugin/wsseapi.h" soap_register_plugin(soap, soap_wsse); // register the wsse plugin in your code // See the user guide gsoap/doc/wsse/html/index.html @endcode - WS-Security (SOAP Message Security) 1.1 (accepts 1.0): @code #import "wsse11.h" // to be added to this header file for the soapcpp2 build step @endcode @code #include "plugin/wsseapi.h" soap_register_plugin(soap, soap_wsse); // register the wsse plugin in your code // See the user guide gsoap/doc/wsse/html/index.html @endcode - HTTP Digest Authentication: @code #include "plugin/httpda.h" soap_register_plugin(soap, soap_http_da); // register the HTTP DA plugin in your code // See the user guide gsoap/doc/httpda/html/index.html @endcode */ /******************************************************************************\ * * * XML Data Binding * * * \******************************************************************************/ /** @page page_XMLDataBinding XML Data Binding SOAP/XML services use data bindings contractually bound by WSDL and auto- generated by wsdl2h and soapcpp2 (see Service Bindings). Plain data bindings are adopted from XML schemas as part of the WSDL types section or when running wsdl2h on a set of schemas to produce non-SOAP-based XML data bindings. The following readers and writers are C/C++ data type (de)serializers auto- generated by wsdl2h and soapcpp2. Run soapcpp2 on this file to generate the (de)serialization code, which is stored in soapC.c[pp]. Include "soapH.h" in your code to import these data type and function declarations. Only use the soapcpp2-generated files in your project build. Do not include the wsdl2h- generated .h file in your code. Data can be read in XML and deserialized from: - a file descriptor, using soap->recvfd = fd - a socket, using soap->socket = ... - a C++ stream, using soap->is = ... - a buffer, using the soap->frecv() callback Data can be serialized in XML and written to: - a file descriptor, using soap->sendfd = fd - a socket, using soap->socket = ... - a C++ stream, using soap->os = ... - a buffer, using the soap->fsend() callback The following options are available for (de)serialization control: - soap->encodingStyle = NULL; to remove SOAP 1.1/1.2 encodingStyle - soap_mode(soap, SOAP_XML_TREE); XML without id-ref (no cycles!) - soap_mode(soap, SOAP_XML_GRAPH); XML with id-ref (including cycles) - soap_set_namespaces(soap, struct Namespace *nsmap); to set xmlns bindings @section ns2 Top-level root elements of schema "urn:calc" - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) */ /* End of calcrest.h */ gsoap-2.8.28/gsoap/plugin/wsddapi.c0000644000175000017500000015600112653650150016500 0ustar ellertellert/* wsddapi.c WS-Discovery 1.0 and 1.1 (WSDD) plugin API See gsoap/doc/wsdd for the WSDD plugin user guide. gSOAP XML Web services tools Copyright (C) 2000-2011, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under one of the following licenses: GPL, the gSOAP public license, or Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2011, Robert van Engelen, Genivia Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ /** @mainpage - @ref wsdd_0 documents the wsdd library for WS-Discovery support. */ /** @page wsdd_0 The WS-Discovery plugin [TOC] @section wsdd_1 WS-Discovery Setup The material in this section relates to the WS-Discovery specification. To use the wsdd library: -# Define WS-Discovery event handlers in your code, see Section @ref wsdd_2. -# Use the wsdd API functions as described below. -# (Re-)compile and link stdsoap2.c/pp or libgsoap, (dom.c/.cpp when needed), wsddapi.c, wsaapi.c and the soapcpp2-generated source files. Compile and link with plugin/threads.c when needed. The material in this document pertains to the WS-Discovery protocol and model and assumes that the reader is familiar with the WS-Discovery protocol, its terms and definitions, and the WS-Discovery model. This document describes the WS-Discovery interface to invoke and handle WS-Discovery events, while the higher-level logic remains application-specific. Especially the mode of operation, ad-hoc or managed with a Discovery Proxy, depends on the application deployment and WS-Discovery support requirements. The following assumptions are made. A Client is an endpoint that searches for Target Service(s). A Target Service (TS) is and endpoint that makes itself available for discovery. A Discovery Proxy (DP) is an endpoint that facilitates discovery of Target Services by Clients. The interfaces defined in the wsdd library can be used to implement Client, Target Service, and Discovery Proxy operations. WS-Discovery ad-hoc and managed modes are supported by the wsdd library. In an ad-hoc mode discovery messages are sent multicast and response messages are sent unicast. In a managed mode discovery messages are sent unicast to a Discovery Proxy. @note The wsdl2h tool uses typemap.dat to auto-generate a gSOAP service definitions header file that imports wsdd.h to support WS-Discovery 1.1 with WS-Addressing 2005/08. The tool imports wsdd10.h to support WS-Discovery 1.0 with WS-Addressing 2004/08. To use WS-Discovery 1.0 with WS-Addressing 2005/08, you will need to change typemap.dat to let wsdl2h import wsdd5.h (see comments in typemap.dat). @section wsdd_2 WS-Discovery Event Handlers The following event handlers MUST be defined by the user to handle inbound WS-Discovery messages. The event handlers receive notifications (Hello, Bye, ProbeMatches, and ResolveMatches) or receive requests to provide data (Probe and Resolve). The event handlers to define are: - @ref wsdd_event_Hello - @ref wsdd_event_Bye - @ref wsdd_event_Probe - @ref wsdd_event_ProbeMatches - @ref wsdd_event_Resolve - @ref wsdd_event_ResolveMatches See the documentation provided with each of these functions in wsddapi.h. @section wsdd_3 WS-Discovery Event Listener Inbound WS-Discovery multicast messages are handled via a listener on a port. The user-defined event handlers are invoked when WS-Discovery messages arrive on the port. The `soap_wsdd_listen` function listens on the current port opened with `soap_bind` for WS-Discovery messages for a brief time period as specified by a timeout value in seconds (negative for micro seconds). The function allows for periodically polling the port as shown: @code #include "wsddapi.h" int port = 8080; struct soap *soap = soap_new(); soap->user = (void*)&my_state; if (!soap_valid_socket(soap_bind(soap, port, 100))) { soap_print_fault(soap, stderr); exit(0); } soap_wsdd_listen(soap, -1000); // listen for messages for 1 ms soap_wsdd_listen(soap, -1000); // listen for messages for 1 ms ... @endcode WS-Discovery messages are relayed to the event handlers. The soap->user pointer can be used to point to a state object that is updated by the event handlers as per desired behavior at the Client side, the Target Service, or the Discovery Proxy implementation. @section wsdd_4 Invoking WS-Discovery Operations A Client may invoke the following WS-Discovery operations: - `soap_wsdd_Probe` - `soap_wsdd_Resolve` A Target Service may invoke the following WS-Discovery operations: - `soap_wsdd_Hello` - `soap_wsdd_Bye` - `soap_wsdd_ProbeMatches` (automatic via `soap_wsdd_listen`) - `soap_wsdd_ResolveMatches` (automatic via `soap_wsdd_listen`) A Discovery Proxy can perform all operations listed above, and should use "wsdd:DiscoveryProxy" as the Type with the Hello, Bye, and ProbeMatches. To send a Hello message to join a network: @code soap_wsdd_Hello(soap, SOAP_WSDD_MANAGED, // or SOAP_WSDD_ADHOC for ad-hoc mode "to address", // "http(s):" URL, or "soap.udp:" UDP, or TCP/IP address soap_wsa_rand_uuid(soap), // a unique message ID NULL, "my address", // where they can find me for WS-Discovery "wsdd:DiscoveryProxy",// Types: I'm a DP NULL, // Scope NULL, // MatchBy NULL, // XAddrs 75965); // MDVersion @endcode Note that `Types` above is a string with namespace-qualified names (QNames). These should be qualified as in "namespace":name or you can use a namespace prefix that is part of your namespace table (in the .nsmap). So you can use "wsdd:DiscoveryPRoxy" as a QName in Types because wsdd is a namespace prefix with a defined binding in the namespace table. For UDP multicast, use @code soap.connect_flags = SO_BROADCAST; @endcode and optionally set the interface and TTL settings: @code in_addr_t addr = inet_addr("1.2.3.4"); soap.ipv4_multicast_if = &addr; // see setsockopt IPPROTO_IP IP_MULTICAST_IF soap.ipv6_multicast_if = addr; // multicast sin6_scope_id soap.ipv4_multicast_ttl = 1; // see setsockopt IPPROTO_IP, IP_MULTICAST_TTL @endcode Please refer to the socket options for `IPPROTO_IP` `IP_MULTICAST_IF` to specify the default interface for multicast datagrams to be sent from. Otherwise, the default interface set by the system administrator will be used (if any). Please refer to the socket options for `IPPROTO_IP` `IP_MULTICAST_TTL` to limit the lifetime of the packet. Multicast datagrams are sent with a default value of 1, to prevent them to be forwarded beyond the local network. This parameter can be set between 1 to 255. To send a Bye message to leave a network: @code soap_wsdd_Bye(soap, SOAP_WSDD_MANAGED, // or SOAP_WSDD_ADHOC for ad-hoc mode "to address", // "http(s):" URL, or "soap.udp:" UDP, or TCP/IP address soap_wsa_rand_uuid(soap), // a unique message ID NULL, "my address", // where they can find me for WS-Discovery "wsdd:DiscoveryProxy",// Types: I'm a DP NULL, // Scope NULL, // MatchBy NULL, // XAddrs 75965); // MDVersion @endcode To send a Probe message (see WS-Discovery 1.1 Section 1.7) and then listen to ProbeMatches: @code struct soap soap = soap_new(); // to invoke messages struct soap serv = soap_new(); // for the listener and event handlers soap_bind(serv, port, 100); const char *id = soap_wsa_rand_uuid(soap); serv->user = (void*)&my_state; my_state.probe_id = id; soap_wsdd_Probe(soap, SOAP_WSDD_ADHOC, // ad-hoc mode SOAP_WSDD_TO_TS, // to a TS "to address", // address of TS id, // message ID NULL, // ReplyTo "\"http://printer.example.org/2003/imaging\":PrintBasic", "ldap:///ou=engineering,o=examplecom,c=us", "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01/ldap"); soap_wsdd_listen(serv, -1000); @endcode The `id` above is the WS-Addressing message ID that will be included in the ProbeMatches RelatesTo WS-Addressing header. As an example, `my_state` is set to this `id` so that when the `wsdd_event_ProbeMatches` event handler is invoked it can find the `id` in the current state that is pointed to by `serv->user` (`soap->user` in the handler). To send a Resolve message and then listen to ResolveMatches: @code struct soap soap = soap_new(); // to invoke messages struct soap serv = soap_new(); // for the listener and event handlers soap_bind(serv, port, 100); const char *id = soap_wsa_rand_uuid(soap); serv->user = (void*)&my_state; my_state.resolve_id = id; soap_wsdd_Resolve(soap, SOAP_WSDD_ADHOC, // ad-hoc mode SOAP_WSDD_TO_TS, // to a TS "to address", // address to send to id, // message ID NULL, // ReplyTo "endpoint"); // EndpointReference of TS soap_wsdd_listen(serv, -1000); @endcode Again, the `id` and `my_state` are used to associate the asynchronously received ResolveMatches response that is handled by the @ref wsdd_event_ResolveMatches for the original request. In managed mode with unicast messages (request-response messages), the `soap_wsdd_Probe` and `soap_wsdd_Resolve` are sufficient to invoke without setting up a listener. The event handlers are invoked when the unicast response message arrives. In managed mode, the ProbeMatches and ResolveMatches are automatically sent via `soap_wsdd_listen` and the event `wsdd_event_Probe` and `wsdd_event_Resolve` handlers. These event handlers should set the matches to be returned. In ad-hoc mode, ProbeMatches or ResolveMatches responses are NOT sent automatically. In ad-hoc mode the responses can be returned by adding code to the event handler or from anywhere in the main program, for example after @ref soap_wsdd_listen. When responses are to be returned from the event handler or from the main program, you should invoke @ref soap_wsdd_ProbeMatches and @ref soap_wsdd_ResolveMatches to explicitly send unicast messages with the match(es) back to the clients. The WS-Addressing ReplyTo address can be used as the return address (when not anonymous), or by using the peer's host information that is accessible in the soap->peer and soap->peerlen members. For example: @code char host[1024], port[16]; getnameinfo((struct sockaddr*)&soap->peer, soap->peerlen, host, sizeof(host), port, 16, NI_DGRAM | NI_NAMEREQD | NI_NUMERICSERV); @endcode @section wsdd_5 Generating C++ Server Objects The WSDD library is developed to support C and C++. To support C++ server objects generated with soapcpp2 options `-j` (or `-i`), you need to define in your C++ code the following wrappers (use `this` instead of `this->soap` below with soapcpp2 option `-i`): @code int wsddService::Hello(struct wsdd__HelloType *hello) { return __wsdd__Hello(this->soap, hello); } int wsddService::Bye(struct wsdd__ByeType *bye { return __wsdd__Bye(this->soap, bye); } int wsddService::Probe(struct wsdd__ProbeType *probe) { return __wsdd__Probe(this->soap, probe); } int wsddService::ProbeMatches(struct wsdd__ProbeMatchesType *matches) { return __wsdd__ProbeMatches(this->soap, matches); } int wsddService::Resolve(struct wsdd__ResolveType *resolve) { return __wsdd__Resolve(this->soap, resolve); } int wsddService::ResolveProbeMatches(struct wsdd__ResolveMatchesType *matches) { return __wsdd__ResolveMatches(this->soap, matches); } @endcode Another approach to generate the WSDD service operations is to run soapcpp2 separately on wsdd.h (or wsdd5.h or wsdd10.h for WS-Discovery 1.0) by: soapcpp2 -a -L -pwsdd -Iimport import/wsdd.h to generate wsddService.cpp. Then chain the service operations at the server side: @code if (soap_begin_serve(service.soap) == SOAP_OK) if (service.dispatch() == SOAP_NO_METHOD) soap_serve_request(service.soap); @endcode where the `service` object is an instance of the application services generated by soapcpp2 `-j`. @section wsdd_6 Miscellaneous You MUST generate client-side operations that the WSDD library expects to be linked with, by executing: soapcpp2 -L -pwsdd -Iimport import/wsdd.h Then compile and link the generated wsddClient.cpp code with your project. Because WS-Addressing may relay faults to a FaultTo service, you need to define a SOAP Fault service operation to accept and handle these: @code int SOAP_ENV__Fault(struct soap *soap, char *faultcode, char *faultstring, char *faultactor, struct SOAP_ENV__Detail *detail, struct SOAP_ENV__Code *SOAP_ENV__Code, struct SOAP_ENV__Reason *SOAP_ENV__Reason, char *SOAP_ENV__Node, char *SOAP_ENV__Role, struct SOAP_ENV__Detail *SOAP_ENV__Detail) { ... = faultcode; // SOAP 1.1 fault code string (QName) ... = faultstring; // SOAP 1.1 fault string ... = faultactor; // SOAP 1.1 fault actor string ... = detail; // SOAP 1.1 fault detail struct ... = SOAP_ENV__Code; // SOAP 1.2 fault code struct ... = SOAP_ENV__Reason; // SOAP 1.2 reason struct ... = SOAP_ENV__Node; // SOAP 1.2 node string ... = SOAP_ENV__Role; // SOAP 1.2 role string ... = SOAP_ENV__Detail; // SOAP 1.2 detail struct return SOAP_OK; } @endcode */ #include "wsddapi.h" #ifdef SOAP_WSDD_2005 /* WS-Discovery 1.0 2005 */ const char *to_ts_URL = "urn:schemas-xmlsoap-org:ws:2005:04:discovery"; #else /* WS-Discovery 1.1 2009 */ const char *to_ts_URL = "urn:docs-oasis-open-org:ws-dd:ns:discovery:2009:01"; #endif /******************************************************************************\ * * WS-Discovery AppSequence State * \******************************************************************************/ static MUTEX_TYPE soap_wsdd_state = MUTEX_INITIALIZER; static unsigned int soap_wsdd_InstanceId = 0; static const char *soap_wsdd_SequenceId = NULL; static unsigned int soap_wsdd_MessageNumber = 1; static int soap_wsdd_serve___wsdd__Hello(struct soap *soap); static int soap_wsdd_serve___wsdd__Bye(struct soap *soap); static int soap_wsdd_serve___wsdd__Probe(struct soap *soap); static int soap_wsdd_serve___wsdd__ProbeMatches(struct soap *soap); static int soap_wsdd_serve___wsdd__Resolve(struct soap *soap); static int soap_wsdd_serve___wsdd__ResolveMatches(struct soap *soap); static void soap_wsdd_set_AppSequence(struct soap*); static void soap_wsdd_reset_AppSequence(struct soap*); static void soap_wsdd_delay(struct soap*); /******************************************************************************\ * * WS-Discovery Outbound Messages * \******************************************************************************/ #ifdef __cplusplus extern "C" { #endif /** @fn int soap_wsdd_Hello(struct soap *soap, soap_wsdd_mode mode, const char *endpoint, const char *MessageID, const char *RelatesTo, const char *EndpointReference, const char *Types, const char *Scopes, const char *MatchBy, const char *XAddrs, unsigned int MetadataVersion) @brief TS or DP Hello message to join a network. @param soap context @param[in] mode SOAP_WSDD_MANAGED or SOAP_WSDD_ADHOC @param[in] endpoint to send Hello message to (unicast or multicast) @param[in] MessageID unique WS-Addressing message ID (@ref soap_wsa_rand_uuid) @param[in] RelatesTo WS-Addressing message ID @param[in] EndpointReference of this Target Server or Discovery Proxy @param[in] Types an unordered string of QNames or NULL, a Discovery Proxy MUST include "wsdd:DiscoveryProxy" @param[in] Scopes an unordered set of scopes or NULL @param[in] MatchBy NULL (unused, reserved) @param[in] XAddrs contains the transport address(es) that MAY be used to communicate with the Target Service or Discovery Proxy @param[in] MetadataVersion incremented by a positive value (>= 1) whenever there is a change in the metadata of the Target Service @return SOAP_OK or error code Hello is a one-way message sent by a Target Service to announce its availability when it joins the network. It is also sent by a Discovery Proxy to reduce multicast traffic on an ad hoc network. */ int soap_wsdd_Hello(struct soap *soap, soap_wsdd_mode mode, const char *endpoint, const char *MessageID, const char *RelatesTo, const char *EndpointReference, const char *Types, const char *Scopes, const char *MatchBy, const char *XAddrs, unsigned int MetadataVersion) { struct wsdd__HelloType req; struct wsdd__ScopesType scopes; const char *Action = SOAP_NAMESPACE_OF_wsdd"/Hello"; const char *To = endpoint; /* SOAP Header */ if (mode == SOAP_WSDD_ADHOC) To = to_ts_URL; soap_wsa_request(soap, MessageID, To, Action); soap_wsa_add_RelatesTo(soap, RelatesTo); #ifdef SOAP_WSDD_2005 soap_wsdd_set_AppSequence(soap); #else if (mode == SOAP_WSDD_ADHOC) soap_wsdd_set_AppSequence(soap); else soap_wsdd_reset_AppSequence(soap); #endif /* Hello */ soap_default_wsdd__HelloType(soap, &req); #ifdef SOAP_WSA_2005 req.wsa5__EndpointReference.Address = (char*)EndpointReference; #else req.wsa__EndpointReference.Address = (char*)EndpointReference; #endif req.Types = (char*)Types; if (Scopes) { soap_default_wsdd__ScopesType(soap, &scopes); scopes.__item = (char*)Scopes; scopes.MatchBy = (char*)MatchBy; req.Scopes = &scopes; } req.XAddrs = (char*)XAddrs; req.MetadataVersion = MetadataVersion; if (soap_send___wsdd__Hello(soap, endpoint, Action, &req)) return soap->error; /* HTTP(S) POST expects an HTTP OK response */ if (endpoint && !strncmp(endpoint, "http", 4)) return soap_recv_empty_response(soap); return SOAP_OK; } /** @fn int soap_wsdd_Bye(struct soap *soap, soap_wsdd_mode mode, const char *endpoint, const char *MessageID, const char *EndpointReference, const char *Types, const char *Scopes, const char *MatchBy, const char *XAddrs, unsigned int MetadataVersion) @brief TS or DP Bye message to leave a network. @param soap context @param[in] mode SOAP_WSDD_MANAGED or SOAP_WSDD_ADHOC @param[in] endpoint to send Bye message to (unicast or multicast) @param[in] MessageID unique WS-Addressing message ID (@ref soap_wsa_rand_uuid) @param[in] EndpointReference of this Target Server or Discovery Proxy @param[in] Types an unordered string of QNames or NULL, a Discovery Proxy MUST include "wsdd:DiscoveryProxy" @param[in] Scopes an unordered set of scopes or NULL @param[in] MatchBy NULL (unused, reserved) @param[in] XAddrs contains the transport address(es) that MAY be used to communicate with the Target Service or Discovery Proxy @param[in] MetadataVersion incremented by a positive value (>= 1) whenever there is a change in the metadata of the Target Service @return SOAP_OK or error code Bye is a one-way message sent by a Target Service to announce its unavailability as a best effort when it leaves the network. */ int soap_wsdd_Bye(struct soap *soap, soap_wsdd_mode mode, const char *endpoint, const char *MessageID, const char *EndpointReference, const char *Types, const char *Scopes, const char *MatchBy, const char *XAddrs, unsigned int MetadataVersion) { struct wsdd__ByeType req; struct wsdd__ScopesType scopes; const char *Action = SOAP_NAMESPACE_OF_wsdd"/Bye"; const char *To = endpoint; /* SOAP Header */ if (mode == SOAP_WSDD_ADHOC) To = to_ts_URL; soap_wsa_request(soap, MessageID, To, Action); #ifdef SOAP_WSDD_2005 soap_wsdd_set_AppSequence(soap); #else if (mode == SOAP_WSDD_ADHOC) soap_wsdd_set_AppSequence(soap); else soap_wsdd_reset_AppSequence(soap); #endif /* Bye */ soap_default_wsdd__ByeType(soap, &req); #ifdef SOAP_WSA_2005 req.wsa5__EndpointReference.Address = (char*)EndpointReference; #else req.wsa__EndpointReference.Address = (char*)EndpointReference; #endif req.Types = (char*)Types; if (Scopes) { soap_default_wsdd__ScopesType(soap, &scopes); scopes.__item = (char*)Scopes; scopes.MatchBy = (char*)MatchBy; req.Scopes = &scopes; } req.XAddrs = (char*)XAddrs; req.MetadataVersion = &MetadataVersion; if (soap_send___wsdd__Bye(soap, endpoint, Action, &req)) return soap->error; /* HTTP(S) POST expects an HTTP OK response */ if (endpoint && !strncmp(endpoint, "http", 4)) return soap_recv_empty_response(soap); return SOAP_OK; } /** @fn int soap_wsdd_Probe(struct soap *soap, soap_wsdd_mode mode, soap_wsdd_to to, const char *endpoint, const char *MessageID, const char *ReplyTo, const char *Types, const char *Scopes, const char *MatchBy) @brief Client Probe message to a TS or DP. @param soap context @param[in] mode SOAP_WSDD_MANAGED or SOAP_WSDD_ADHOC @param[in] to SOAP_WSDD_TO_TS or SOAP_WSDD_TO_DP @param[in] endpoint to send Probe to (unicast or multicast) @param[in] MessageID WS-Addressing message ID of the message @param[in] ReplyTo WS-Addressing ReplyTo message ID of the message @param[in] Types an unordered string of QNames to probe @param[in] Scopes an unordered set of scopes to probe @param[in] MatchBy matching rule to apply for this probe @return SOAP_OK or error code A Client sends a probe to find Target Services by the Type of the Target Service, a Scope in which the Target Service resides, both, or simply all Target Services. The matches will be delivered to @ref wsdd_event_ProbeMatches when @ref soap_wsdd_listen receives a ProbeMatch response. The RelatesTo of the ProbeMatches is the MessageID of the Probe. */ int soap_wsdd_Probe(struct soap *soap, soap_wsdd_mode mode, soap_wsdd_to to, const char *endpoint, const char *MessageID, const char *ReplyTo, const char *Types, const char *Scopes, const char *MatchBy) { unsigned int InstanceId = 0; const char *SequenceId = NULL; unsigned int MessageNumber = 0; struct wsdd__ProbeType req; struct __wsdd__ProbeMatches res; struct wsdd__ScopesType scopes; const char *Action = SOAP_NAMESPACE_OF_wsdd"/Probe"; const char *To = endpoint; /* SOAP Header */ if (to == SOAP_WSDD_TO_TS) To = to_ts_URL; soap_wsa_request(soap, MessageID, To, Action); soap_wsa_add_ReplyTo(soap, ReplyTo); soap_wsdd_reset_AppSequence(soap); /* Probe */ soap_default_wsdd__ProbeType(soap, &req); req.Types = (char*)Types; if (Scopes) { soap_default_wsdd__ScopesType(soap, &scopes); scopes.__item = (char*)Scopes; scopes.MatchBy = (char*)MatchBy; req.Scopes = &scopes; } if (soap_send___wsdd__Probe(soap, endpoint, Action, &req)) return soap->error; /* ad-hoc mode: we're done */ if (mode == SOAP_WSDD_ADHOC) { /* HTTP(S) POST expects an HTTP OK response */ if (endpoint && !strncmp(endpoint, "http", 4)) return soap_recv_empty_response(soap); } else { /* managed mode: receive the matches */ if (soap_recv___wsdd__ProbeMatches(soap, &res)) return soap->error; /* check Header WSDD */ if (!soap->header) return soap_wsa_sender_fault(soap, "WSDD ProbeMatches incomplete", NULL); if (soap->header->wsdd__AppSequence) { wsdd__AppSequenceType *seq = soap->header->wsdd__AppSequence; InstanceId = seq->InstanceId; SequenceId = seq->SequenceId; MessageNumber = seq->MessageNumber; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "AppSeq id=%u seq=%s msg=%u\n", InstanceId, SequenceId ? SequenceId : "(null)", MessageNumber)); } /* pass probe matches on to user-defined event handler */ wsdd_event_ProbeMatches(soap, InstanceId, SequenceId, MessageNumber, #ifdef SOAP_WSA_2005 soap->header->wsa5__MessageID, soap->header->wsa5__RelatesTo ? soap->header->wsa5__RelatesTo->__item : NULL, #else soap->header->wsa__MessageID, soap->header->wsa__RelatesTo ? soap->header->wsa__RelatesTo->__item : NULL, #endif res.wsdd__ProbeMatches); } return SOAP_OK; } /** @fn int soap_wsdd_Resolve(struct soap *soap, soap_wsdd_mode mode, soap_wsdd_to to, const char *endpoint, const char *MessageID, const char *ReplyTo, const char *EndpointReference) @brief Client Resolve message to a TS or DP. @param soap context @param[in] mode SOAP_WSDD_MANAGED or SOAP_WSDD_ADHOC @param[in] to SOAP_WSDD_TO_TS or SOAP_WSDD_TO_DP @param[in] endpoint to send Resolve to (unicast or multicast) @param[in] MessageID WS-Addressing message ID of the message @param[in] ReplyTo WS-Addressing ReplyTo message ID of the message @param[in] EndpointReference of the Target Service or Discovery Proxy @return SOAP_OK or error code A Client sends a resolve to locate a Target Service, i.e., to retrieve its transport address(es). This server-side event handler returns the match(es). The matches will be delivered to @ref wsdd_event_ResolveMatches when @ref soap_wsdd_listen receives a ResolveMatch response. The RelatesTo of the ResolveMatches is the MessageID of the Resolve. */ int soap_wsdd_Resolve(struct soap *soap, soap_wsdd_mode mode, soap_wsdd_to to, const char *endpoint, const char *MessageID, const char *ReplyTo, const char *EndpointReference) { unsigned int InstanceId = 0; const char *SequenceId = NULL; unsigned int MessageNumber = 0; struct wsdd__ResolveType req; struct __wsdd__ResolveMatches res; const char *Action = SOAP_NAMESPACE_OF_wsdd"/Resolve"; const char *To = endpoint; /* SOAP Header */ if (to == SOAP_WSDD_TO_TS) To = to_ts_URL; soap_wsa_request(soap, MessageID, To, Action); soap_wsa_add_ReplyTo(soap, ReplyTo); soap_wsdd_reset_AppSequence(soap); /* Resolve */ soap_default_wsdd__ResolveType(soap, &req); #ifdef SOAP_WSA_2005 req.wsa5__EndpointReference.Address = (char*)EndpointReference; #else req.wsa__EndpointReference.Address = (char*)EndpointReference; #endif if (soap_send___wsdd__Resolve(soap, endpoint, Action, &req)) return soap->error; /* ad-hoc mode: we're done */ if (mode == SOAP_WSDD_ADHOC) { /* HTTP(S) POST expects an HTTP OK response */ if (endpoint && !strncmp(endpoint, "http", 4)) return soap_recv_empty_response(soap); } else { /* managed mode: receive the matches */ if (soap_recv___wsdd__ResolveMatches(soap, &res)) return soap->error; /* check Header WSDD */ if (!soap->header) return soap_wsa_sender_fault(soap, "WSDD ProbeMatches incomplete", NULL); if (soap->header->wsdd__AppSequence) { wsdd__AppSequenceType *seq = soap->header->wsdd__AppSequence; InstanceId = seq->InstanceId; SequenceId = seq->SequenceId; MessageNumber = seq->MessageNumber; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "AppSeq id=%u seq=%s msg=%u\n", InstanceId, SequenceId ? SequenceId : "(null)", MessageNumber)); } /* pass probe matches on to user-defined event handler */ if (res.wsdd__ResolveMatches && res.wsdd__ResolveMatches->ResolveMatch) wsdd_event_ResolveMatches(soap, InstanceId, SequenceId, MessageNumber, #ifdef SOAP_WSA_2005 soap->header->wsa5__MessageID, soap->header->wsa5__RelatesTo ? soap->header->wsa5__RelatesTo->__item : NULL, #else soap->header->wsa__MessageID, soap->header->wsa__RelatesTo ? soap->header->wsa__RelatesTo->__item : NULL, #endif res.wsdd__ResolveMatches->ResolveMatch); } return SOAP_OK; } /** @fn void soap_wsdd_init_ProbeMatches(struct soap *soap, struct wsdd__ProbeMatchesType *matches) @brief Initalize the probe matches container. @param soap context @param matches the container with matches to initialize */ void soap_wsdd_init_ProbeMatches(struct soap *soap, struct wsdd__ProbeMatchesType *matches) { soap_default_wsdd__ProbeMatchesType(soap, matches); } /** @fn int soap_wsdd_add_ProbeMatch(struct soap *soap, struct wsdd__ProbeMatchesType *matches, const char *EndpointReference, const char *Types, const char *Scopes, const char *MatchBy, const char *XAddrs, unsigned int MetadataVersion) @brief Add a match to the probe matches container. @param soap context @param matches the container to update with a new match @param[in] EndpointReference of this Target Server or Discovery Proxy @param[in] Types an unordered string of QNames or NULL, a Discovery Proxy MUST include "wsdd:DiscoveryProxy" @param[in] Scopes an unordered set of scopes or NULL @param[in] MatchBy NULL (unused, reserved) @param[in] XAddrs contains the transport address(es) that MAY be used to communicate with the Target Service or Discovery Proxy @param[in] MetadataVersion incremented by a positive value (>= 1) whenever there is a change in the metadata of the Target Service @return SOAP_OK or error code To populate a Prove matches container, first initialize with @ref soap_wsdd_init_ProbeMatches, then use this function to add each match. The container is deallocated with soap_end(soap) and can be initialized again (without leaks). */ int soap_wsdd_add_ProbeMatch(struct soap *soap, struct wsdd__ProbeMatchesType *matches, const char *EndpointReference, const char *Types, const char *Scopes, const char *MatchBy, const char *XAddrs, unsigned int MetadataVersion) { int n = 0, k = matches->__sizeProbeMatch; struct wsdd__ProbeMatchType *m; /* need to increase space? */ if (k == 0) n = 4; else if (k >= 4 && (k & (k - 1)) == 0) n = 2 * k; /* yes we do */ if (n) { struct wsdd__ProbeMatchType *tmp = (struct wsdd__ProbeMatchType*)soap_malloc(soap, n * sizeof(struct wsdd__ProbeMatchType)); int i; if (!tmp) return soap->error = SOAP_EOM; for (i = 0; i < k; i++) tmp[i] = matches->ProbeMatch[i]; matches->ProbeMatch = tmp; } /* add entry */ m = &matches->ProbeMatch[k]; soap_default_wsdd__ProbeMatchType(soap, m); #ifdef SOAP_WSA_2005 m->wsa5__EndpointReference.Address = (char*)EndpointReference; #else m->wsa__EndpointReference.Address = (char*)EndpointReference; #endif m->Types = (char*)Types; if (Scopes) { m->Scopes = (struct wsdd__ScopesType*)soap_malloc(soap, sizeof(struct wsdd__ScopesType)); soap_default_wsdd__ScopesType(soap, m->Scopes); m->Scopes->__item = (char*)Scopes; m->Scopes->MatchBy = (char*)MatchBy; } m->XAddrs = (char*)XAddrs; m->MetadataVersion = MetadataVersion; matches->__sizeProbeMatch++; return SOAP_OK; } /** @fn int soap_wsdd_ProbeMatches(struct soap *soap, const char *endpoint, const char *MessageID, const char *RelatesTo, const char *To, struct wsdd__ProbeMatchesType *matches) @brief TS or DP ProbeMatches message. @param soap context @param[in] endpoint to send Probe to (unicast or multicast) @param[in] MessageID WS-Addressing message ID of the message @param[in] RelatesTo WS-Addressing RelatesTo message ID of the message @param[in] To WS-Addressing endpoint IP and port or NULL for anonymous @param[in] matches contains the probe matches, use @ref soap_wsdd_add_ProbeMatch to populate this container @return SOAP_OK or error code A Client sends a probe to find Target Services by the Type of the Target Service, a Scope in which the Target Service resides, both, or simply all Target Services. The Target Server(s) or Discovery Proxy responds by sending ProbeMatches to the Client. */ int soap_wsdd_ProbeMatches(struct soap *soap, const char *endpoint, const char *MessageID, const char *RelatesTo, const char *To, struct wsdd__ProbeMatchesType *matches) { const char *Action = SOAP_NAMESPACE_OF_wsdd"/ProbeMatches"; /* 0..APP_MAX_DELAY ms delay */ soap_wsdd_delay(soap); /* SOAP Header */ soap_wsa_request(soap, MessageID, To, Action); soap_wsa_add_RelatesTo(soap, RelatesTo); soap_wsdd_set_AppSequence(soap); /* ProbeMatches */ if (soap_send___wsdd__ProbeMatches(soap, endpoint, Action, matches)) return soap->error; /* HTTP(S) POST expects an HTTP OK response */ if (endpoint && !strncmp(endpoint, "http", 4)) return soap_recv_empty_response(soap); return SOAP_OK; } /** @fn int soap_wsdd_ResolveMatches(struct soap *soap, const char *endpoint, const char *MessageID, const char *RelatesTo, const char *To, const char *EndpointReference, const char *Types, const char *Scopes, const char *MatchBy, const char *XAddrs, unsigned int MetadataVersion) @brief TS or DP ResolveMatches message. @param soap context @param[in] endpoint to send Probe to (unicast or multicast) @param[in] MessageID WS-Addressing message ID of the message @param[in] RelatesTo WS-Addressing RelatesTo message ID of the message @param[in] To WS-Addressing endpoint IP and port or NULL for anonymous @param[in] EndpointReference of the Target Service @param[in] Types an unordered string of QNames or NULL, a Discovery Proxy MUST include "wsdd:DiscoveryProxy" @param[in] Scopes an unordered set of scopes or NULL @param[in] MatchBy NULL (unused, reserved) @param[in] XAddrs contains the transport address(es) that MAY be used to communicate with the Target Service or Discovery Proxy @param[in] MetadataVersion incremented by a positive value (>= 1) whenever there is a change in the metadata of the Target Service @return SOAP_OK or error code A Client sends a resolve to locate a Target Service, i.e., to retrieve its transport address(es). The Target Server(s) or Discovery Proxy responds by sending ResolveMatches to the Client. */ int soap_wsdd_ResolveMatches(struct soap *soap, const char *endpoint, const char *MessageID, const char *RelatesTo, const char *To, const char *EndpointReference, const char *Types, const char *Scopes, const char *MatchBy, const char *XAddrs, unsigned int MetadataVersion) { struct wsdd__ResolveMatchesType res; struct wsdd__ResolveMatchType match; struct wsdd__ScopesType scopes; const char *Action = SOAP_NAMESPACE_OF_wsdd"/ResolveMatches"; /* 0..APP_MAX_DELAY ms delay */ soap_wsdd_delay(soap); /* SOAP Header */ soap_wsa_request(soap, MessageID, To, Action); soap_wsa_add_RelatesTo(soap, RelatesTo); soap_wsdd_set_AppSequence(soap); /* ResolveMatches */ soap_default_wsdd__ResolveMatchType(soap, &match); #ifdef SOAP_WSA_2005 match.wsa5__EndpointReference.Address = (char*)EndpointReference; #else match.wsa__EndpointReference.Address = (char*)EndpointReference; #endif match.Types = (char*)Types; if (Scopes) { soap_default_wsdd__ScopesType(soap, &scopes); scopes.__item = (char*)Scopes; scopes.MatchBy = (char*)MatchBy; match.Scopes = &scopes; } match.XAddrs = (char*)XAddrs; match.MetadataVersion = MetadataVersion; soap_default_wsdd__ResolveMatchesType(soap, &res); res.ResolveMatch = &match; if (soap_send___wsdd__ResolveMatches(soap, endpoint, Action, &res)) return soap->error; /* HTTP(S) POST expects an HTTP OK response */ if (endpoint && !strncmp(endpoint, "http", 4)) return soap_recv_empty_response(soap); return SOAP_OK; } /******************************************************************************\ * * WS-Discovery Serving Inbound Messages * \******************************************************************************/ /** @fn int soap_wsdd_listen(struct soap *soap, int timeout) @brief Listen on a port for inbound WS-Discovery messages. @param soap context @param[in] timeout seconds to listen (use negative value for micro seconds) @return SOAP_OK or error code First you need to open a port with soap_bind(soap). Then invoke this function to listen to WS-Discovery messages on that port. Inbound messages are accepted and the information is relayed to the event handlers, see Section @ref wsdd_2. Use soap->user to pass a pointer to a state object that the event hanlders can use. The timeout allows a Client to periodically poll the port for messages. A value of zero will loop the listener forever or until an error occurs. */ int soap_wsdd_listen(struct soap *soap, int timeout) { soap->accept_timeout = soap->recv_timeout = soap->send_timeout = timeout; /* event-serve loop (exits upon timeout) */ for (;;) { if (!soap_valid_socket(soap_accept(soap))) { /* timeout? */ if (!soap->errnum) return soap->error = SOAP_OK; return soap->error; } if (soap_begin_serve(soap)) return soap->error; /* always close HTTP afterwards */ soap->keep_alive = 0; /* receive event and serve */ if (soap_wsdd_serve_request(soap)) { /* timeout? */ if (!soap->errnum) return soap->error = SOAP_OK; #ifdef WITH_FASTCGI soap_send_fault(soap); #else return soap_send_fault(soap); #endif } /* clean up for next iteration */ soap_destroy(soap); soap_end(soap); } } int soap_wsdd_serve_request(struct soap *soap) { soap_peek_element(soap); if (!soap_match_tag(soap, soap->tag, "wsdd:Hello")) return soap_wsdd_serve___wsdd__Hello(soap); if (!soap_match_tag(soap, soap->tag, "wsdd:Bye")) return soap_wsdd_serve___wsdd__Bye(soap); if (!soap_match_tag(soap, soap->tag, "wsdd:Probe")) return soap_wsdd_serve___wsdd__Probe(soap); if (!soap_match_tag(soap, soap->tag, "wsdd:ProbeMatches")) return soap_wsdd_serve___wsdd__ProbeMatches(soap); if (!soap_match_tag(soap, soap->tag, "wsdd:Resolve")) return soap_wsdd_serve___wsdd__Resolve(soap); if (!soap_match_tag(soap, soap->tag, "wsdd:ResolveMatches")) return soap_wsdd_serve___wsdd__ResolveMatches(soap); soap->error = SOAP_NO_METHOD; /* close socket unless soap->keep_alive == 1 */ return soap_closesock(soap); } #ifdef __cplusplus } #endif static int soap_wsdd_serve___wsdd__Hello(struct soap *soap) { struct __wsdd__Hello soap_tmp___wsdd__Hello; soap_default___wsdd__Hello(soap, &soap_tmp___wsdd__Hello); soap->encodingStyle = NULL; if (!soap_get___wsdd__Hello(soap, &soap_tmp___wsdd__Hello, "-wsdd:Hello", NULL)) return soap->error; if (soap_body_end_in(soap) || soap_envelope_end_in(soap) || soap_end_recv(soap)) return soap->error; soap->error = __wsdd__Hello(soap, soap_tmp___wsdd__Hello.wsdd__Hello); if (soap->error) return soap->error; return soap_closesock(soap); } static int soap_wsdd_serve___wsdd__Bye(struct soap *soap) { struct __wsdd__Bye soap_tmp___wsdd__Bye; soap_default___wsdd__Bye(soap, &soap_tmp___wsdd__Bye); soap->encodingStyle = NULL; if (!soap_get___wsdd__Bye(soap, &soap_tmp___wsdd__Bye, "-wsdd:Bye", NULL)) return soap->error; if (soap_body_end_in(soap) || soap_envelope_end_in(soap) || soap_end_recv(soap)) return soap->error; soap->error = __wsdd__Bye(soap, soap_tmp___wsdd__Bye.wsdd__Bye); if (soap->error) return soap->error; return soap_closesock(soap); } static int soap_wsdd_serve___wsdd__Probe(struct soap *soap) { struct __wsdd__Probe soap_tmp___wsdd__Probe; soap_default___wsdd__Probe(soap, &soap_tmp___wsdd__Probe); soap->encodingStyle = NULL; if (!soap_get___wsdd__Probe(soap, &soap_tmp___wsdd__Probe, "-wsdd:Probe", NULL)) return soap->error; if (soap_body_end_in(soap) || soap_envelope_end_in(soap) || soap_end_recv(soap)) return soap->error; soap->error = __wsdd__Probe(soap, soap_tmp___wsdd__Probe.wsdd__Probe); if (soap->error) return soap->error; return soap_closesock(soap); } static int soap_wsdd_serve___wsdd__ProbeMatches(struct soap *soap) { struct __wsdd__ProbeMatches soap_tmp___wsdd__ProbeMatches; soap_default___wsdd__ProbeMatches(soap, &soap_tmp___wsdd__ProbeMatches); soap->encodingStyle = NULL; if (!soap_get___wsdd__ProbeMatches(soap, &soap_tmp___wsdd__ProbeMatches, "-wsdd:ProbeMatches", NULL)) return soap->error; if (soap_body_end_in(soap) || soap_envelope_end_in(soap) || soap_end_recv(soap)) return soap->error; soap->error = __wsdd__ProbeMatches(soap, soap_tmp___wsdd__ProbeMatches.wsdd__ProbeMatches); if (soap->error) return soap->error; return soap_closesock(soap); } static int soap_wsdd_serve___wsdd__Resolve(struct soap *soap) { struct __wsdd__Resolve soap_tmp___wsdd__Resolve; soap_default___wsdd__Resolve(soap, &soap_tmp___wsdd__Resolve); soap->encodingStyle = NULL; if (!soap_get___wsdd__Resolve(soap, &soap_tmp___wsdd__Resolve, "-wsdd:Resolve", NULL)) return soap->error; if (soap_body_end_in(soap) || soap_envelope_end_in(soap) || soap_end_recv(soap)) return soap->error; soap->error = __wsdd__Resolve(soap, soap_tmp___wsdd__Resolve.wsdd__Resolve); if (soap->error) return soap->error; return soap_closesock(soap); } static int soap_wsdd_serve___wsdd__ResolveMatches(struct soap *soap) { struct __wsdd__ResolveMatches soap_tmp___wsdd__ResolveMatches; soap_default___wsdd__ResolveMatches(soap, &soap_tmp___wsdd__ResolveMatches); soap->encodingStyle = NULL; if (!soap_get___wsdd__ResolveMatches(soap, &soap_tmp___wsdd__ResolveMatches, "-wsdd:ResolveMatches", NULL)) return soap->error; if (soap_body_end_in(soap) || soap_envelope_end_in(soap) || soap_end_recv(soap)) return soap->error; soap->error = __wsdd__ResolveMatches(soap, soap_tmp___wsdd__ResolveMatches.wsdd__ResolveMatches); if (soap->error) return soap->error; return soap_closesock(soap); } /** @fn int __wsdd__Hello(struct soap *soap, struct wsdd__HelloType *Hello) @brief Internal WS-Discovery service operation. */ int __wsdd__Hello(struct soap *soap, struct wsdd__HelloType *Hello) { unsigned int InstanceId = 0; const char *SequenceId = NULL; unsigned int MessageNumber = 0; DBGFUN("__wsdd__Hello"); /* check for WSA */ if (soap_wsa_check(soap)) return soap->error; /* check WSDD */ if (!Hello #ifdef SOAP_WSA_2005 || !Hello->wsa5__EndpointReference.Address #else || !Hello->wsa__EndpointReference.Address #endif ) return soap_wsa_sender_fault(soap, "WSDD Hello incomplete", NULL); #ifdef SOAP_WSA_2005 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "EndpointReference=%s\n", Hello->wsa5__EndpointReference.Address)); #else DBGLOG(TEST, SOAP_MESSAGE(fdebug, "EndpointReference=%s\n", Hello->wsa__EndpointReference.Address)); #endif if (soap->header->wsdd__AppSequence) { wsdd__AppSequenceType *seq = soap->header->wsdd__AppSequence; InstanceId = seq->InstanceId; SequenceId = seq->SequenceId; MessageNumber = seq->MessageNumber; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "AppSeq id=%u seq=%s msg=%u\n", InstanceId, SequenceId ? SequenceId : "(null)", MessageNumber)); } /* pass on to user-defined event handler */ wsdd_event_Hello(soap, InstanceId, SequenceId, MessageNumber, #ifdef SOAP_WSA_2005 soap->header->wsa5__MessageID, soap->header->wsa5__RelatesTo ? soap->header->wsa5__RelatesTo->__item : NULL, Hello->wsa5__EndpointReference.Address, #else soap->header->wsa__MessageID, soap->header->wsa__RelatesTo ? soap->header->wsa__RelatesTo->__item : NULL, Hello->wsa__EndpointReference.Address, #endif Hello->Types, Hello->Scopes ? Hello->Scopes->__item : NULL, Hello->Scopes ? Hello->Scopes->MatchBy : NULL, Hello->XAddrs, Hello->MetadataVersion); /* one-way HTTP(S) POST message requires an HTTP OK response message */ if (!strncmp(soap->endpoint, "http", 4)) return soap_send_empty_response(soap, SOAP_OK); return SOAP_OK; } /** @fn int __wsdd__Bye(struct soap *soap, struct wsdd__ByeType *Bye) @brief Internal WS-Discovery service operation. */ int __wsdd__Bye(struct soap *soap, struct wsdd__ByeType *Bye) { unsigned int InstanceId = 0; const char *SequenceId = NULL; unsigned int MessageNumber = 0; DBGFUN("__wsdd__Bye"); /* check for WSA */ if (soap_wsa_check(soap)) return soap->error; /* check WSDD */ if (!Bye #ifdef SOAP_WSA_2005 || !Bye->wsa5__EndpointReference.Address #else || !Bye->wsa__EndpointReference.Address #endif ) return soap_wsa_sender_fault(soap, "WSDD Bye incomplete", NULL); #ifdef SOAP_WSA_2005 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "EndpointReference=%s\n", Bye->wsa5__EndpointReference.Address)); #else DBGLOG(TEST, SOAP_MESSAGE(fdebug, "EndpointReference=%s\n", Bye->wsa__EndpointReference.Address)); #endif if (soap->header->wsdd__AppSequence) { wsdd__AppSequenceType *seq = soap->header->wsdd__AppSequence; InstanceId = seq->InstanceId; SequenceId = seq->SequenceId; MessageNumber = seq->MessageNumber; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "AppSeq id=%u seq=%s msg=%u\n", InstanceId, SequenceId ? SequenceId : "(null)", MessageNumber)); } /* pass on to user-defined event handler */ wsdd_event_Bye(soap, InstanceId, SequenceId, MessageNumber, #ifdef SOAP_WSA_2005 soap->header->wsa5__MessageID, soap->header->wsa5__RelatesTo ? soap->header->wsa5__RelatesTo->__item : NULL, Bye->wsa5__EndpointReference.Address, #else soap->header->wsa__MessageID, soap->header->wsa__RelatesTo ? soap->header->wsa__RelatesTo->__item : NULL, Bye->wsa__EndpointReference.Address, #endif Bye->Types, Bye->Scopes ? Bye->Scopes->__item : NULL, Bye->Scopes ? Bye->Scopes->MatchBy : NULL, Bye->XAddrs, Bye->MetadataVersion); /* one-way HTTP(S) POST message requires an HTTP OK response message */ if (!strncmp(soap->endpoint, "http", 4)) return soap_send_empty_response(soap, SOAP_OK); return SOAP_OK; } static int soap_wsdd_http(struct soap *soap, const char *endpoint, const char *host, int port, const char *path, const char *action, size_t count) { (void)endpoint; (void)host; (void)port; (void)path; (void)action; return soap->fresponse(soap, SOAP_OK, count); } /** @fn int __wsdd__Probe(struct soap *soap, struct wsdd__ProbeType *Probe) @brief Internal WS-Discovery service operation. */ int __wsdd__Probe(struct soap *soap, struct wsdd__ProbeType *Probe) { struct wsdd__ProbeMatchesType ProbeMatches; soap_wsdd_mode mode; DBGFUN("__wsdd__Probe"); /* check for WSA */ if (soap_wsa_check(soap)) return soap->error; /* check WSDD */ if (!Probe) return soap_wsa_sender_fault(soap, "WSDD Probe incomplete", NULL); soap_default_wsdd__ProbeMatchesType(soap, &ProbeMatches); /* pass probe request on to user-defined event handler to get matches */ mode = wsdd_event_Probe(soap, #ifdef SOAP_WSA_2005 soap->header->wsa5__MessageID, soap->header->wsa5__ReplyTo ? soap->header->wsa5__ReplyTo->Address : NULL, #else soap->header->wsa__MessageID, soap->header->wsa__ReplyTo ? soap->header->wsa__ReplyTo->Address : NULL, #endif Probe->Types, Probe->Scopes ? Probe->Scopes->__item : NULL, Probe->Scopes ? Probe->Scopes->MatchBy : NULL, &ProbeMatches); if (mode == SOAP_WSDD_ADHOC) { /* event handler or main application MUST return matches independently */ /* one-way HTTP(S) POST message requires an HTTP OK response message */ if (!strncmp(soap->endpoint, "http", 4)) return soap_send_empty_response(soap, SOAP_OK); } else { int err; int (*fpost)(struct soap*, const char*, const char*, int, const char*, const char*, size_t); const char *MessageID = soap_wsa_rand_uuid(soap); const char *Action = SOAP_NAMESPACE_OF_wsdd"/ProbeMatches"; /* SOAP Header */ soap_wsdd_set_AppSequence(soap); soap_wsa_reply(soap, MessageID, Action); /* send over current socket as HTTP OK response: */ fpost = soap->fpost; soap->fpost = soap_wsdd_http; err = soap_send___wsdd__ProbeMatches(soap, "http://", Action, &ProbeMatches); soap->fpost = fpost; return err; } return SOAP_OK; } /** @fn int __wsdd__ProbeMatches(struct soap *soap, struct wsdd__ProbeMatchesType *ProbeMatches) @brief Internal WS-Discovery service operation. */ int __wsdd__ProbeMatches(struct soap *soap, struct wsdd__ProbeMatchesType *ProbeMatches) { unsigned int InstanceId = 0; const char *SequenceId = NULL; unsigned int MessageNumber = 0; DBGFUN("__wsdd__ProbeMatches"); /* check for WSA */ if (soap_wsa_check(soap)) return soap->error; /* check WSDD */ if (!ProbeMatches) return soap_wsa_sender_fault(soap, "WSDD ProbeMatches incomplete", NULL); if (soap->header->wsdd__AppSequence) { wsdd__AppSequenceType *seq = soap->header->wsdd__AppSequence; InstanceId = seq->InstanceId; SequenceId = seq->SequenceId; MessageNumber = seq->MessageNumber; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "AppSeq id=%u seq=%s msg=%u\n", InstanceId, SequenceId ? SequenceId : "(null)", MessageNumber)); } /* pass probe matches on to user-defined event handler */ wsdd_event_ProbeMatches(soap, InstanceId, SequenceId, MessageNumber, #ifdef SOAP_WSA_2005 soap->header->wsa5__MessageID, soap->header->wsa5__RelatesTo ? soap->header->wsa5__RelatesTo->__item : NULL, #else soap->header->wsa__MessageID, soap->header->wsa__RelatesTo ? soap->header->wsa__RelatesTo->__item : NULL, #endif ProbeMatches); /* one-way HTTP(S) POST message requires an HTTP OK response message */ if (!strncmp(soap->endpoint, "http", 4)) return soap_send_empty_response(soap, SOAP_OK); return SOAP_OK; } /** @fn int __wsdd__Resolve(struct soap *soap, struct wsdd__ResolveType *Resolve) @brief Internal WS-Discovery service operation. */ int __wsdd__Resolve(struct soap *soap, struct wsdd__ResolveType *Resolve) { struct wsdd__ResolveMatchesType ResolveMatches; struct wsdd__ResolveMatchType match; soap_wsdd_mode mode; DBGFUN("__wsdd__Resolve"); /* check for WSA */ if (soap_wsa_check(soap)) return soap->error; /* check WSDD */ if (!Resolve #ifdef SOAP_WSA_2005 || !Resolve->wsa5__EndpointReference.Address #else || !Resolve->wsa__EndpointReference.Address #endif ) return soap_wsa_sender_fault(soap, "WSDD Resolve incomplete", NULL); soap_default_wsdd__ResolveMatchesType(soap, &ResolveMatches); soap_default_wsdd__ResolveMatchType(soap, &match); ResolveMatches.ResolveMatch = &match; /* pass resolve request on to user-defined event handler */ mode = wsdd_event_Resolve(soap, #ifdef SOAP_WSA_2005 soap->header->wsa5__MessageID, soap->header->wsa5__ReplyTo ? soap->header->wsa5__ReplyTo->Address : NULL, Resolve->wsa5__EndpointReference.Address, #else soap->header->wsa__MessageID, soap->header->wsa__ReplyTo ? soap->header->wsa__ReplyTo->Address : NULL, Resolve->wsa__EndpointReference.Address, #endif &match); if (mode == SOAP_WSDD_ADHOC) { /* event handler or main application MUST return match independently */ /* one-way HTTP(S) POST message requires an HTTP OK response message */ if (!strncmp(soap->endpoint, "http", 4)) return soap_send_empty_response(soap, SOAP_OK); } else { int err; int (*fpost)(struct soap*, const char*, const char*, int, const char*, const char*, size_t); const char *MessageID = soap_wsa_rand_uuid(soap); const char *Action = SOAP_NAMESPACE_OF_wsdd"/ResolveMatches"; /* SOAP Header */ soap_wsdd_set_AppSequence(soap); soap_wsa_reply(soap, MessageID, Action); /* send over current socket as HTTP OK response: */ fpost = soap->fpost; soap->fpost = soap_wsdd_http; err = soap_send___wsdd__ResolveMatches(soap, NULL, Action, &ResolveMatches); soap->fpost = fpost; return err; } return SOAP_OK; } /** @fn int __wsdd__ResolveMatches(struct soap *soap, struct wsdd__ResolveMatchesType *ResolveMatches) @brief Internal WS-Discovery service operation. */ int __wsdd__ResolveMatches(struct soap *soap, struct wsdd__ResolveMatchesType *ResolveMatches) { unsigned int InstanceId = 0; const char *SequenceId = NULL; unsigned int MessageNumber = 0; DBGFUN("__wsdd__ResolveMatches"); /* check for WSA */ if (soap_wsa_check(soap)) return soap->error; /* check WSDD */ if (!ResolveMatches || !ResolveMatches->ResolveMatch) return soap_wsa_sender_fault(soap, "WSDD ResolveMatch incomplete", NULL); if (soap->header->wsdd__AppSequence) { wsdd__AppSequenceType *seq = soap->header->wsdd__AppSequence; InstanceId = seq->InstanceId; SequenceId = seq->SequenceId; MessageNumber = seq->MessageNumber; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "AppSeq id=%u seq=%s msg=%u\n", InstanceId, SequenceId ? SequenceId : "(null)", MessageNumber)); } /* pass resolve matches on to user-defined event handler */ wsdd_event_ResolveMatches(soap, InstanceId, SequenceId, MessageNumber, #ifdef SOAP_WSA_2005 soap->header->wsa5__MessageID, soap->header->wsa5__RelatesTo ? soap->header->wsa5__RelatesTo->__item : NULL, #else soap->header->wsa__MessageID, soap->header->wsa__RelatesTo ? soap->header->wsa__RelatesTo->__item : NULL, #endif ResolveMatches->ResolveMatch); /* one-way HTTP(S) POST message requires an HTTP OK response message */ if (!strncmp(soap->endpoint, "http", 4)) return soap_send_empty_response(soap, SOAP_OK); return SOAP_OK; } /******************************************************************************\ * * WS-Discovery AppSequence State * \******************************************************************************/ #ifdef __cplusplus extern "C" { #endif /** @fn void soap_wsdd_set_InstanceId(unsigned int InstanceId) @brief Set the global AppSequence InstanceId that is used to populate messages @param[in] InstanceId */ void soap_wsdd_set_InstanceId(unsigned int InstanceId) { MUTEX_LOCK(soap_wsdd_state); soap_wsdd_InstanceId = InstanceId; soap_wsdd_MessageNumber = 1; MUTEX_UNLOCK(soap_wsdd_state); } /** @fn void soap_wsdd_set_SequenceId(const char *SequenceId) @brief Set the global AppSequence SequenceId that is used to populate messages @param[in] SequenceId */ void soap_wsdd_set_SequenceId(const char *SequenceId) { MUTEX_LOCK(soap_wsdd_state); if (soap_wsdd_SequenceId) free((void*)soap_wsdd_SequenceId); soap_wsdd_SequenceId = strdup(SequenceId); soap_wsdd_MessageNumber = 1; MUTEX_UNLOCK(soap_wsdd_state); } #ifdef __cplusplus } #endif static void soap_wsdd_set_AppSequence(struct soap *soap) { soap_header(soap); if (!soap->header->wsdd__AppSequence) { soap->header->wsdd__AppSequence = (wsdd__AppSequenceType*)soap_malloc(soap, sizeof(wsdd__AppSequenceType)); soap_default_wsdd__AppSequenceType(soap, soap->header->wsdd__AppSequence); } MUTEX_LOCK(soap_wsdd_state); soap->header->wsdd__AppSequence->InstanceId = soap_wsdd_InstanceId; soap->header->wsdd__AppSequence->SequenceId = (char*)soap_wsdd_SequenceId; soap->header->wsdd__AppSequence->MessageNumber = soap_wsdd_MessageNumber++; MUTEX_UNLOCK(soap_wsdd_state); } static void soap_wsdd_reset_AppSequence(struct soap *soap) { if (soap->header) soap->header->wsdd__AppSequence = NULL; } static void soap_wsdd_delay(struct soap *soap) { (void)soap; useconds_t delay = 1000*((unsigned int)soap_random % SOAP_WSDD_APP_MAX_DELAY); usleep(delay); } gsoap-2.8.28/gsoap/plugin/wsseapi.h0000644000175000017500000003221712653650150016527 0ustar ellertellert/* wsseapi.h WS-Security plugin. See wsseapi.c for documentation and details. gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under one of the following licenses: GPL, the gSOAP public license, or Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #ifndef WSSEAPI_H #define WSSEAPI_H #include "soapH.h" /* replace with soapcpp2-generated *H.h file */ #include "smdevp.h" #include "mecevp.h" #ifdef __cplusplus extern "C" { #endif /** plugin identification for plugin registry */ #define SOAP_WSSE_ID "SOAP-WSSE-1.4" /** to ignore extra/external SignedInfo/Reference/@URI */ #define SOAP_WSSE_IGNORE_EXTRA_REFS (0x1000) /** plugin identification for plugin registry */ extern const char soap_wsse_id[]; /** @struct soap_wsse_data @brief wsseapi plugin data The signature key (private) and verification key (public) are kept in the plugin data, together with other info. */ struct soap_wsse_data { const char *sigid; /**< string with wsu:Id names to sign */ const char *encid; /**< string with wsu:Id names to encrypt */ const char *prefixlist; /**< string with c14n PrefixList to send, or NULL */ int sign_alg; /**< The digest or signature algorithm used */ const void *sign_key; /**< EVP_PKEY or key string for HMAC */ int sign_keylen; /**< HMAC key length */ int vrfy_alg; /**< The signature verify algorithm used */ const void *vrfy_key; /**< EVP_PKEY or key string for HMAC verify */ int vrfy_keylen; /**< HMAC key length */ int enco_alg; /**< current encrypt algorithm used */ const char *enco_keyname; /**< optional key name (id of symmetric key) */ const void *enco_key; /**< EVP_PKEY or secret key */ int enco_keylen; /**< secret key length */ int deco_alg; /**< decrypt algorithm used */ const void *deco_key; /**< EVP_PKEY or secret key */ int deco_keylen; /**< secret key length */ struct soap_wsse_digest *digest; /**< List of ID-hash pairs */ int (*fpreparesend)(struct soap*, const char*, size_t); int (*fpreparefinalsend)(struct soap*); int (*fpreparefinalrecv)(struct soap*); int (*fheader)(struct soap*); struct soap_mec_data *mec; X509_STORE *store; const void *(*security_token_handler)(struct soap *soap, int *alg, const char *keyname, int *keylen); }; /** @struct soap_wsse_digest @brief Digest dictionary: linked list of ID-hash pairs The digest dictionary is populated by the soap_wsse_preparesend callback. The callback intercepts XML elements with wsu:Id attributes and computes the digest during the preprocessing of a message transmission. The 'level' field is used to determine when the end of an element is reached by handling inner wsu:Id attributed elements, so that the outer wsu:Id attributed element can be hashed. */ struct soap_wsse_digest { struct soap_wsse_digest *next; /**< Next in list */ unsigned int level; /**< XML parser depth level */ struct soap_smd_data smd; /**< smdevp engine context */ unsigned char hash[SOAP_SMD_MAX_SIZE];/**< Digest hash value */ char id[1]; /**< String flows down the struct */ }; extern const char *wsse_PasswordTextURI; extern const char *wsse_PasswordDigestURI; extern const char *wsse_Base64BinaryURI; extern const char *wsse_X509v3URI; extern const char *wsse_X509v3SubjectKeyIdentifierURI; extern const char *ds_sha1URI; extern const char *ds_sha256URI; extern const char *ds_sha512URI; extern const char *ds_hmac_sha1URI; extern const char *ds_hmac_sha256URI; extern const char *ds_hmac_sha512URI; extern const char *ds_dsa_sha1URI; extern const char *ds_rsa_sha1URI; extern const char *ds_rsa_sha256URI; extern const char *ds_rsa_sha512URI; extern const char *xenc_3desURI; extern const char *xenc_aes128cbcURI; extern const char *xenc_aes192cbcURI; extern const char *xenc_aes256cbcURI; extern const char *xenc_aes512cbcURI; extern const char *xenc_aes128gcmURI; extern const char *xenc_aes192gcmURI; extern const char *xenc_aes256gcmURI; extern const char *xenc_aes512gcmURI; extern const char *xenc_elementURI; extern const char *xenc_contentURI; extern const char *xenc_rsa15URI; extern const char *xenc_rsaesURI; extern const char *ds_URI; extern const char *c14n_URI; extern const char *wsu_URI; struct _wsse__Security* soap_wsse_add_Security(struct soap *soap); struct _wsse__Security* soap_wsse_add_Security_actor(struct soap *soap, const char *actor); void soap_wsse_delete_Security(struct soap *soap); struct _wsse__Security* soap_wsse_Security(struct soap *soap); struct ds__SignatureType* soap_wsse_add_Signature(struct soap *soap); void soap_wsse_delete_Signature(struct soap *soap); struct ds__SignatureType* soap_wsse_Signature(struct soap *soap); int soap_wsse_add_Timestamp(struct soap *soap, const char *id, time_t lifetime); struct _wsu__Timestamp *soap_wsse_Timestamp(struct soap *soap); int soap_wsse_verify_Timestamp(struct soap *soap); int soap_wsse_add_UsernameTokenText(struct soap *soap, const char *id, const char *username, const char *password); int soap_wsse_add_UsernameTokenDigest(struct soap *soap, const char *id, const char *username, const char *password); struct _wsse__UsernameToken *soap_wsse_UsernameToken(struct soap *soap, const char *id); const char* soap_wsse_get_Username(struct soap *soap); int soap_wsse_verify_Password(struct soap *soap, const char *password); int soap_wsse_add_BinarySecurityToken(struct soap *soap, const char *id, const char *valueType, const unsigned char *data, int size); int soap_wsse_add_BinarySecurityTokenX509(struct soap *soap, const char *id, X509 *cert); int soap_wsse_add_BinarySecurityTokenPEM(struct soap *soap, const char *id, const char *filename); struct _wsse__BinarySecurityToken *soap_wsse_BinarySecurityToken(struct soap *soap, const char *id); int soap_wsse_get_BinarySecurityToken(struct soap *soap, const char *id, char **valueType, unsigned char **data, int *size); X509 *soap_wsse_get_BinarySecurityTokenX509(struct soap *soap, const char *id); int soap_wsse_verify_X509(struct soap *soap, X509 *cert); int soap_wsse_add_SecurityContextToken(struct soap *soap, const char *id, const char *identifier); const char * soap_wsse_get_SecurityContextToken(struct soap *soap); struct ds__SignedInfoType *soap_wsse_add_SignedInfo(struct soap *soap); int soap_wsse_add_SignedInfo_Reference(struct soap *soap, const char *URI, const char *transform, const char *inclusiveNamespaces, int alg, const char *HA); int soap_wsse_add_SignedInfo_SignatureMethod(struct soap *soap, const char *method, int canonical); struct ds__SignedInfoType *soap_wsse_SignedInfo(struct soap *soap); int soap_wsse_get_SignedInfo_SignatureMethod(struct soap *soap, int *alg, int *bits); int soap_wsse_add_SignatureValue(struct soap *soap, int alg, const void *key, int keylen); int soap_wsse_verify_SignatureValue(struct soap *soap, int alg, const void *key, int keylen); int soap_wsse_verify_SignedInfo(struct soap *soap); int soap_wsse_verify_digest(struct soap *soap, int alg, int canonical, const char *id, unsigned char hash[SOAP_SMD_MAX_SIZE]); struct ds__KeyInfoType *soap_wsse_add_KeyInfo(struct soap *soap); struct ds__KeyInfoType *soap_wsse_KeyInfo(struct soap *soap); int soap_wsse_add_KeyInfo_KeyName(struct soap *soap, const char *name); const char *soap_wsse_get_KeyInfo_KeyName(struct soap *soap); int soap_wsse_add_KeyInfo_SecurityTokenReferenceURI(struct soap *soap, const char *URI, const char *valueType); int soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(struct soap *soap, const char *URI); const char *soap_wsse_get_KeyInfo_SecurityTokenReferenceURI(struct soap *soap); const char *soap_wsse_get_KeyInfo_SecurityTokenReferenceValueType(struct soap *soap); X509 *soap_wsse_get_KeyInfo_SecurityTokenReferenceX509(struct soap *soap); struct ds__X509IssuerSerialType *soap_wsse_get_KeyInfo_SecurityTokenReferenceX509Data(struct soap *soap); int soap_wsse_add_KeyInfo_SecurityTokenReferenceKeyIdentifier(struct soap *soap, const char *id, const char *valueType, unsigned char *data, int size); const char *soap_wsse_get_KeyInfo_SecurityTokenReferenceKeyIdentifierValueType(struct soap *soap); const unsigned char *soap_wsse_get_KeyInfo_SecurityTokenReferenceKeyIdentifier(struct soap *soap, int *size); int soap_wsse_add_KeyInfo_SecurityTokenReferenceEmbedded(struct soap *soap, const char *id, const char *valueType); int soap_wsse_add_EncryptedData_KeyInfo_KeyName(struct soap *soap, const char *keyname); int soap_wsse_sender_fault_subcode(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail); int soap_wsse_receiver_fault_subcode(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail); int soap_wsse_sender_fault(struct soap *soap, const char *faultstring, const char *faultdetail); int soap_wsse_receiver_fault(struct soap *soap, const char *faultstring, const char *faultdetail); int soap_wsse_fault(struct soap *soap, enum wsse__FaultcodeEnum fault, const char *detail); int soap_wsse(struct soap *soap, struct soap_plugin *p, void *arg); int soap_wsse_sign(struct soap *soap, int alg, const void *key, int keylen); int soap_wsse_sign_body(struct soap *soap, int alg, const void *key, int keylen); int soap_wsse_verify_init(struct soap *soap); int soap_wsse_verify_auto(struct soap *soap, int alg, const void *key, size_t keylen); int soap_wsse_verify_done(struct soap *soap); size_t soap_wsse_verify_element(struct soap *soap, const char *URI, const char *tag); int soap_wsse_verify_body(struct soap *soap); int soap_wsse_set_wsu_id(struct soap *soap, const char *tags); int soap_wsse_set_InclusiveNamespaces(struct soap *soap, const char *prefixlist); int soap_wsse_sign_only(struct soap *soap, const char *tags); int soap_wsse_add_EncryptedKey(struct soap *soap, int alg, const char *URI, X509 *cert, const char *subjectkeyid, const char *issuer, const char *serial); int soap_wsse_add_EncryptedKey_encrypt_only(struct soap *soap, int alg, const char *URI, X509 *cert, const char *subjectkeyid, const char *issuer, const char *serial, const char *tags); int soap_wsse_verify_EncryptedKey(struct soap *soap); void soap_wsse_delete_EncryptedKey(struct soap *soap); struct xenc__EncryptedKeyType* soap_wsse_EncryptedKey(struct soap *soap); int soap_wsse_add_EncryptedKey_DataReferenceURI(struct soap *soap, const char *URI); int soap_wsse_add_DataReferenceURI(struct soap *soap, const char *URI); int soap_wsse_encrypt_body(struct soap *soap, int alg, const void *key, int keylen); int soap_wsse_encrypt_only(struct soap *soap, int alg, const void *key, int keylen, const char *tags); int soap_wsse_encrypt(struct soap *soap, int alg, const void *key, int keylen); int soap_wsse_decrypt_auto(struct soap *soap, int alg, const void *key, int keylen); int soap_wsse_encrypt_begin(struct soap *soap, const char *id, int alg, const char *URI, const char *keyname, const unsigned char *key); int soap_wsse_encrypt_end(struct soap *soap); int soap_wsse_decrypt_begin(struct soap *soap); int soap_wsse_decrypt_end(struct soap *soap); #ifdef __cplusplus } #endif SOAP_FMAC1 void SOAP_FMAC2 soap_default_xsd__anyType(struct soap*, struct soap_dom_element *node); SOAP_FMAC1 int SOAP_FMAC2 soap_out_xsd__anyType(struct soap *soap, const char *tag, int id, const struct soap_dom_element *node, const char *type); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_in_xsd__anyType(struct soap *soap, const char *tag, struct soap_dom_element *node, const char *type); #endif gsoap-2.8.28/gsoap/plugin/httpmd5.c0000644000175000017500000002246112653650150016434 0ustar ellertellert/* httpmd5.c gSOAP HTTP Content-MD5 digest plugin. Usage (both client and server, see httpmd5test.h/.c for example): soap_register_plugin(&soap, http_md5); This enables HTTP MD5 checksum generation and checking for SOAP/XML messages WITHOUT attachments. Compile with -DWITH_OPENSSL Link with OpenSSL (for md5evp.c), httpmd5.c, and md5evp.c gSOAP XML Web services tools Copyright (C) 2000-2005, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under one of the following licenses: GPL, the gSOAP public license, or Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2005, Robert van Engelen, Genivia, Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- Requires an md5 engine, see md5evp.h int md5_handler(struct soap *soap, void **context, enum md5_action action, char *buf, size_t len) context can be set and passed to subsequent calls. Parameters: action = MD5_INIT: init context MD5_UPDATE: update context with data from buf with size len MD5_FINAL: fill buf with 16 bytes MD5 hash value MD5_DELETE: delete context buf input data, output MD5 128 bit hash value len length of input data Example code: httpmd5test.h, httpmd5test.c Limitations: Does not work with combined chunked + compressed messages. When sending DIME/MIME attachments, you MUST use the SOAP_IO_STORE flag to compute the MD5 hash of the message with attachments. The flag disables streaming DIME. */ #include "httpmd5.h" #ifdef __cplusplus extern "C" { #endif const char http_md5_id[13] = HTTP_MD5_ID; static int http_md5_init(struct soap *soap, struct http_md5_data *data); static int http_md5_copy(struct soap *soap, struct soap_plugin *dst, struct soap_plugin *src); static void http_md5_delete(struct soap *soap, struct soap_plugin *p); static int http_md5_post_header(struct soap *soap, const char *key, const char *val); static int http_md5_parse_header(struct soap *soap, const char *key, const char *val); static int http_md5_prepareinitsend(struct soap *soap); static int http_md5_prepareinitrecv(struct soap *soap); static int http_md5_preparesend(struct soap *soap, const char *buf, size_t len); static int http_md5_preparerecv(struct soap *soap, const char *buf, size_t len); static int http_md5_preparefinalrecv(struct soap *soap); int http_md5(struct soap *soap, struct soap_plugin *p, void *arg) { (void)arg; p->id = http_md5_id; p->data = (void*)SOAP_MALLOC(soap, sizeof(struct http_md5_data)); p->fcopy = http_md5_copy; p->fdelete = http_md5_delete; if (p->data) if (http_md5_init(soap, (struct http_md5_data*)p->data)) { SOAP_FREE(soap, p->data); /* error: could not init */ return SOAP_EOM; /* return error */ } return SOAP_OK; } static int http_md5_init(struct soap *soap, struct http_md5_data *data) { data->fposthdr = soap->fposthdr; soap->fposthdr = http_md5_post_header; data->fparsehdr = soap->fparsehdr; soap->fparsehdr = http_md5_parse_header; data->fprepareinitsend = soap->fprepareinitsend; soap->fprepareinitsend = http_md5_prepareinitsend; data->fprepareinitrecv = soap->fprepareinitrecv; soap->fprepareinitrecv = http_md5_prepareinitrecv; data->fpreparesend = soap->fpreparesend; soap->fpreparesend = http_md5_preparesend; data->context = NULL; memset((void*)data->digest, 0, sizeof(data->digest)); return SOAP_OK; } static int http_md5_copy(struct soap *soap, struct soap_plugin *dst, struct soap_plugin *src) { *dst = *src; dst->data = (void*)SOAP_MALLOC(soap, sizeof(struct http_md5_data)); soap_memcpy((void*)dst->data, sizeof(struct http_md5_data), (const void*)src->data, sizeof(struct http_md5_data)); ((struct http_md5_data*)dst->data)->context = NULL; return SOAP_OK; } static void http_md5_delete(struct soap *soap, struct soap_plugin *p) { (void)p; struct http_md5_data *data = (struct http_md5_data*)soap_lookup_plugin(soap, http_md5_id); if (data) { md5_handler(soap, &data->context, MD5_DELETE, NULL, 0); SOAP_FREE(soap, data); } } static int http_md5_post_header(struct soap *soap, const char *key, const char *val) { struct http_md5_data *data = (struct http_md5_data*)soap_lookup_plugin(soap, http_md5_id); char buf64[25]; /* 24 base64 chars + '\0' */ int err; if (!data) return SOAP_PLUGIN_ERROR; if (!key) /* last line */ { if ((err = md5_handler(soap, &data->context, MD5_FINAL, data->digest, 0))) return err; data->fposthdr(soap, "Content-MD5", soap_s2base64(soap, (unsigned char*)data->digest, buf64, 16)); } return data->fposthdr(soap, key, val); } static int http_md5_parse_header(struct soap *soap, const char *key, const char *val) { struct http_md5_data *data = (struct http_md5_data*)soap_lookup_plugin(soap, http_md5_id); if (!data) return SOAP_PLUGIN_ERROR; if (!soap_tag_cmp(key, "Content-MD5")) { soap_base642s(soap, val, data->digest, 16, NULL); data->fpreparerecv = soap->fpreparerecv; soap->fpreparerecv = http_md5_preparerecv; data->fpreparefinalrecv = soap->fpreparefinalrecv; soap->fpreparefinalrecv = http_md5_preparefinalrecv; md5_handler(soap, &data->context, MD5_INIT, NULL, 0); return SOAP_OK; } return data->fparsehdr(soap, key, val); } static int http_md5_prepareinitsend(struct soap *soap) { struct http_md5_data *data = (struct http_md5_data*)soap_lookup_plugin(soap, http_md5_id); if (!data) return SOAP_PLUGIN_ERROR; if ((soap->mode & SOAP_IO) != SOAP_IO_STORE && (soap->mode & (SOAP_ENC_DIME | SOAP_ENC_MIME))) { /* TODO: handle attachments automatically, does not work yet */ soap->mode &= ~SOAP_IO; soap->mode |= SOAP_IO_STORE; } else md5_handler(soap, &data->context, MD5_INIT, NULL, 0); if (data->fprepareinitsend) return data->fprepareinitsend(soap); return SOAP_OK; } static int http_md5_prepareinitrecv(struct soap *soap) { struct http_md5_data *data = (struct http_md5_data*)soap_lookup_plugin(soap, http_md5_id); if (!data) return SOAP_PLUGIN_ERROR; if (soap->fpreparerecv == http_md5_preparerecv) soap->fpreparerecv = data->fpreparerecv; if (soap->fpreparefinalrecv == http_md5_preparefinalrecv) soap->fpreparefinalrecv = data->fpreparefinalrecv; if (data->fprepareinitrecv) return data->fprepareinitrecv(soap); return SOAP_OK; } static int http_md5_preparesend(struct soap *soap, const char *buf, size_t len) { struct http_md5_data *data = (struct http_md5_data*)soap_lookup_plugin(soap, http_md5_id); if (!data) return SOAP_PLUGIN_ERROR; md5_handler(soap, &data->context, MD5_UPDATE, (char*)buf, len); if (data->fpreparesend) return data->fpreparesend(soap, buf, len); return SOAP_OK; } static int http_md5_preparerecv(struct soap *soap, const char *buf, size_t len) { struct http_md5_data *data = (struct http_md5_data*)soap_lookup_plugin(soap, http_md5_id); if (!data) return SOAP_PLUGIN_ERROR; md5_handler(soap, &data->context, MD5_UPDATE, (char*)buf, len); if (data->fpreparerecv) return data->fpreparerecv(soap, buf, len); return SOAP_OK; } static int http_md5_preparefinalrecv(struct soap *soap) { struct http_md5_data *data = (struct http_md5_data*)soap_lookup_plugin(soap, http_md5_id); char digest[16]; if (!data) return SOAP_PLUGIN_ERROR; md5_handler(soap, &data->context, MD5_FINAL, digest, 0); soap->fpreparerecv = data->fpreparerecv; soap->fpreparefinalrecv = data->fpreparefinalrecv; if (memcmp((void*)digest, (const void*)data->digest, sizeof(data->digest))) return soap_sender_fault(soap, "MD5 digest mismatch: message corrupted", NULL); if (soap->fpreparefinalrecv) return soap->fpreparefinalrecv(soap); return SOAP_OK; } #ifdef __cplusplus } #endif gsoap-2.8.28/gsoap/plugin/logging.c0000644000175000017500000001362312653650150016475 0ustar ellertellert/* logging.c Message logging plugin and stat collector for webserver. Register the plugin with: soap_register_plugin(soap, logging); Change logging destinations: soap_set_logging_inbound(struct soap*, FILE*); soap_set_logging_outbound(struct soap*, FILE*); Obtain stats (sent and recv octet count, independent of log dest): soap_get_logging_stats(soap, size_t *sent, size_t *recv); gSOAP XML Web services tools Copyright (C) 2000-2008, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under one of the following licenses: GPL, the gSOAP public license, or Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2008, Robert van Engelen, Genivia Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "logging.h" #ifdef __cplusplus extern "C" { #endif const char logging_id[] = LOGGING_ID; static int logging_init(struct soap *soap, struct logging_data *data); static void logging_delete(struct soap *soap, struct soap_plugin *p); static int logging_send(struct soap *soap, const char *buf, size_t len); static size_t logging_recv(struct soap *soap, char *buf, size_t len); /* plugin registry function, invoked by soap_register_plugin */ int logging(struct soap *soap, struct soap_plugin *p, void *arg) { (void)arg; p->id = logging_id; /* create local plugin data */ p->data = (void*)SOAP_MALLOC(soap, sizeof(struct logging_data)); /* register the destructor */ p->fdelete = logging_delete; /* if OK then initialize */ if (p->data) { if (logging_init(soap, (struct logging_data*)p->data)) { SOAP_FREE(soap, p->data); /* error: could not init */ return SOAP_EOM; /* return error */ } } return SOAP_OK; } /* set inbound logging FD, NULL to disable */ void soap_set_logging_inbound(struct soap *soap, FILE *fd) { struct logging_data *data = (struct logging_data*)soap_lookup_plugin(soap, logging_id); if (data) data->inbound = fd; } /* set outbound logging FD, NULL to disable */ void soap_set_logging_outbound(struct soap *soap, FILE *fd) { struct logging_data *data = (struct logging_data*)soap_lookup_plugin(soap, logging_id); if (data) data->outbound = fd; } /* get logging sent and recv octet counts */ void soap_get_logging_stats(struct soap *soap, size_t *sent, size_t *recv) { struct logging_data *data = (struct logging_data*)soap_lookup_plugin(soap, logging_id); if (data) { *sent = data->stat_sent; *recv = data->stat_recv; } } /* used by plugin registry function */ static int logging_init(struct soap *soap, struct logging_data *data) { data->inbound = NULL; data->outbound = NULL; data->stat_sent = 0; data->stat_recv = 0; data->fsend = soap->fsend; /* save old recv callback */ data->frecv = soap->frecv; /* save old send callback */ soap->fsend = logging_send; /* replace send callback with ours */ soap->frecv = logging_recv; /* replace recv callback with ours */ return SOAP_OK; } static void logging_delete(struct soap *soap, struct soap_plugin *p) { /* free allocated plugin data. If fcopy() is not set, then this function is not called for all copies of the plugin created with soap_copy(). In this example, the fcopy() callback is omitted and the plugin data is shared by the soap copies created with soap_copy() */ SOAP_FREE(soap, p->data); } static size_t logging_recv(struct soap *soap, char *buf, size_t len) { struct logging_data *data = (struct logging_data*)soap_lookup_plugin(soap, logging_id); size_t res; /* get data from old recv callback */ res = data->frecv(soap, buf, len); /* update should be in mutex, but we don't mind some inaccuracy in stats */ data->stat_recv += res; if (data->inbound) fwrite(buf, res, 1, data->inbound); return res; } static int logging_send(struct soap *soap, const char *buf, size_t len) { struct logging_data *data = (struct logging_data*)soap_lookup_plugin(soap, logging_id); /* update should be in mutex, but we don't mind some inaccuracy in stats */ data->stat_sent += len; if (data->outbound) fwrite(buf, len, 1, data->outbound); return data->fsend(soap, buf, len); /* pass data on to old send callback */ } #ifdef __cplusplus } #endif gsoap-2.8.28/gsoap/plugin/plugin.h0000644000175000017500000000111412653650150016342 0ustar ellertellert/* plugin.h Example gSOAP plug-in. Include this file and link with plugin.c Copyright (C) 2000-2002 Robert A. van Engelen. All Rights Reserved. */ #include "stdsoap2.h" #define PLUGIN_ID "PLUGIN-1.0" /* plugin identification */ #ifdef __cplusplus extern "C" { #endif struct plugin_data { int (*fsend)(struct soap*, const char*, size_t); /* example: to save and use send callback */ size_t (*frecv)(struct soap*, char*, size_t); /* example: to save and use recv callback */ }; int plugin(struct soap *soap, struct soap_plugin *plugin, void *arg); #ifdef __cplusplus } #endif gsoap-2.8.28/gsoap/plugin/httpform.c0000644000175000017500000001615212653650150016712 0ustar ellertellert/* httpform.c gSOAP HTTP POST application/x-www-form-urlencoded plugin. Requires linkage with httpget.c (for query_key and query_val) Note: multipart/related and multipart/form-data are already handled in gSOAP. gSOAP XML Web services tools Copyright (C) 2000-2008, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under ONE of the following licenses: GPL, the gSOAP public license, OR Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2004 Robert A. van Engelen, Genivia inc. All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- Compile & link with stand-alone gSOAP server. Usage (server side): struct soap soap; soap_init(&soap); soap_register_plugin_arg(&soap, http_form, http_form_handler); ... ... = soap_copy(&soap); // copies plugin too but not its data: plugin data is shared since fcopy is not set ... soap_done(&soap); // detach plugin (calls plugin->fdelete) You need to define a HTTP handling function at the server-side: int http_form_handler(struct soap*) which will be called from the plugin upon an HTTP POST request that matches the application/x-www-form-urlencoded content-type. The function should return an error code or SOAP_STOP to prevent the gSOAP engine from processing the message body; To parse form data in the handler, use: char *s = form(soap); while (s) { char *key = query_key(soap, &s); // decode next form string key char *val = query_val(soap, &s); // decode next form string value (if any) ... } The form() function reads an HTTP body and stores it in an internal buffer that is returned as a char*. This buffer can be used to process HTTP POST body content. The query_key/val functions simply extract key-value pairs from this buffer. The handler should also produce a valid HTTP response, for example: soap_response(soap, SOAP_HTML); // use this to return HTML ... soap_response(soap, SOAP_OK); // ... or use this to return a SOAP message ... soap_send(soap, "..."); // example HTML ... soap_end_send(soap); See samples/webserver for an example HTTP POST form handling server. */ #include "httpform.h" #ifdef __cplusplus extern "C" { #endif const char http_form_id[14] = HTTP_FORM_ID; static int http_form_init(struct soap *soap, struct http_form_data *data, int (*handler)(struct soap*)); static void http_form_delete(struct soap *soap, struct soap_plugin *p); static int http_form_parse_header(struct soap *soap, const char*, const char*); int http_form(struct soap *soap, struct soap_plugin *p, void *arg) { p->id = http_form_id; p->data = (void*)malloc(sizeof(struct http_form_data)); p->fdelete = http_form_delete; if (p->data) if (http_form_init(soap, (struct http_form_data*)p->data, (int (*)(struct soap*))arg)) { free(p->data); /* error: could not init */ return SOAP_EOM; /* return error */ } return SOAP_OK; } static int http_form_init(struct soap *soap, struct http_form_data *data, int (*handler)(struct soap*)) { data->fparsehdr = soap->fparsehdr; /* save old HTTP header parser callback */ soap->fparsehdr = http_form_parse_header; /* replace HTTP header parser callback with ours */ if (handler) data->handler = handler; return SOAP_OK; } static void http_form_delete(struct soap *soap, struct soap_plugin *p) { (void)soap; free(p->data); /* free allocated plugin data (this function is not called for shared plugin data, but only when the final soap_done() is invoked on the original soap struct) */ } static int http_form_parse_header(struct soap *soap, const char *key, const char *val) { struct http_form_data *data = (struct http_form_data*)soap_lookup_plugin(soap, http_form_id); if (!data) return SOAP_PLUGIN_ERROR; soap->error = data->fparsehdr(soap, key, val); /* parse HTTP header */ if (soap->error == SOAP_OK) { if (!soap_tag_cmp(key, "Content-Type")) { /* check content type: you can filter any type of payloads here */ if (!soap_tag_cmp(val, "application/x-www-form-urlencoded")) { soap->fform = data->handler; soap->error = SOAP_FORM; /* delegate body parsing to form handler */ } /* it is possible to add other payload types to handle via forms if (!soap_tag_cmp(val, "image/jpg")) soap->error = SOAP_FORM; */ } } return soap->error; } char* form(struct soap *soap) { char *s = NULL; /* It is unlikely chunked and/or compressed POST forms are sent by browsers, but we need to handle them */ if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK #ifdef WITH_ZLIB || soap->zlib_in != SOAP_ZLIB_NONE #endif ) { soap_wchar c = EOF; soap->labidx = 0; if (soap_append_lab(soap, "?", 1)) return NULL; do { size_t k; if (soap_append_lab(soap, NULL, 0)) return NULL; s = soap->labbuf + soap->labidx; k = soap->lablen - soap->labidx; soap->labidx = soap->lablen; while (k--) { if ((c = soap_getchar(soap)) == (int)EOF) break; *s++ = c; } } while (c != (int)EOF); *s = '\0'; s = soap->labbuf; } else { if (soap->length) { s = (char*)soap_malloc(soap, soap->length + 2); if (s) { char *t = s; size_t i; *t++ = '?'; for (i = soap->length; i; i--) { soap_wchar c; if ((c = soap_getchar(soap)) == (int)EOF) { soap->error = SOAP_EOF; return NULL; } *t++ = c; } *t = '\0'; } } } soap_end_recv(soap); return s; } /******************************************************************************/ #ifdef __cplusplus } #endif gsoap-2.8.28/gsoap/plugin/httpposttest.c0000644000175000017500000001550612653650150017636 0ustar ellertellert/* httpposttest.c gSOAP HTTP POST plugin client and server example application. gSOAP XML Web services tools Copyright (C) 2000-2009, Robert van Engelen, Genivia, Inc., All Rights Reserved. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2009, Robert van Engelen, Genivia, Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- Compile: soapcpp2 -S -c httpposttest.h cc -Iplugin -o httpposttest httpposttest.c soapC.c soapServer.c httppost.c stdsoap2.c To support https and compression, compile with: cc -DWITH_OPENSSL -DWITH_GZIP -Iplugin -o httpposttest httpposttest.c soapC.c soapServer.c httppost.c stdsoap2.c -lssl -lcrypto -lz */ #include "soapH.h" #include "httppost.h" int jpg_post_handler(struct soap *soap); int image_post_handler(struct soap *soap); int text_post_handler(struct soap *soap); int generic_POST_handler(struct soap *soap); int generic_PUT_handler(struct soap *soap); int generic_DELETE_handler(struct soap *soap); int main(int argc, char **argv) { char *buf; size_t len; struct soap soap; soap_init(&soap); /* chunking conserves memory and is generally faster: */ soap_set_omode(&soap, SOAP_IO_CHUNK); if (argc < 2) { /* CGI server */ struct http_post_handlers handlers[] = { { "image/jpg", jpg_post_handler }, { "image/*", image_post_handler }, { "image/*;*", image_post_handler }, { "text/*", text_post_handler }, { "text/*;*", text_post_handler }, { "POST", generic_POST_handler }, { "PUT", generic_PUT_handler }, { "DELETE", generic_DELETE_handler }, { NULL } }; soap_register_plugin_arg(&soap, http_post, handlers); /* register plugin (server only) */ soap_serve(&soap); exit(0); } /* HTTP POST client */ if (soap_post_connect(&soap, argv[1], NULL, "text/html") || soap_send(&soap, "") || soap_send(&soap, argc == 2 ? "Hello" : argv[2]) || soap_send(&soap, "") || soap_end_send(&soap)) { soap_print_fault(&soap, stderr); exit(1); } /* after sending POST content, receive body (note: POST handlers should not be set for client) */ if (soap_begin_recv(&soap) || soap_http_body(&soap, &buf, &len) || soap_end_recv(&soap)) { soap_print_fault(&soap, stderr); exit(1); } soap_closesock(&soap); /* close only when not keep-alive */ printf("Received %lu bytes of type %s:\n", (unsigned long)len, soap.http_content?soap.http_content:""); soap_end(&soap); soap_done(&soap); return 0; } /* Calculator service operations */ int __ns1__add(struct soap *soap, struct ns2__pair *in, double *out) { *out = in->a + in->b; return SOAP_OK; } int __ns1__sub(struct soap *soap, struct ns2__pair *in, double *out) { *out = in->a - in->b; return SOAP_OK; } int __ns1__mul(struct soap *soap, struct ns2__pair *in, double *out) { *out = in->a * in->b; return SOAP_OK; } int __ns1__div(struct soap *soap, struct ns2__pair *in, double *out) { *out = in->a / in->b; return SOAP_OK; } int __ns1__pow(struct soap *soap, struct ns2__pair *in, double *out) { *out = pow(in->a, in->b); return SOAP_OK; } /* the jpg handler just responds with HTTP OK */ int jpg_post_handler(struct soap *soap) { char *buf; size_t len; soap_http_body(soap, &buf, &len); soap_response(soap, SOAP_OK); soap_end_send(soap); return SOAP_OK; } /* the image handler responds with HTTP OK and a text/html body */ int image_post_handler(struct soap *soap) { char *buf; size_t len; soap_http_body(soap, &buf, &len); soap_response(soap, SOAP_HTML); soap_send(soap, "Image received"); soap_end_send(soap); return SOAP_OK; } /* the text handler copies the message back */ int text_post_handler(struct soap *soap) { char *buf; size_t len; soap_http_body(soap, &buf, &len); /* use current soap->http_content from HTTP header as return HTTP type */ soap_response(soap, SOAP_FILE); soap_send_raw(soap, buf, len); soap_end_send(soap); return SOAP_OK; } /* the generic POST handler */ int generic_POST_handler(struct soap *soap) { char *buf; size_t len; soap_http_body(soap, &buf, &len); fprintf(stderr, "Generic POST accepted URL=\"%s\" content=\"%s\"\n", soap->endpoint, soap->http_content); soap_response(soap, SOAP_HTML); soap_send(soap, "Data received"); soap_end_send(soap); return SOAP_OK; } /* the generic PUT handler */ int generic_PUT_handler(struct soap *soap) { char *buf; size_t len; soap_http_body(soap, &buf, &len); fprintf(stderr, "Generic PUT accepted URL=\"%s\" content=\"%s\"\n", soap->endpoint, soap->http_content); return soap_send_empty_response(soap, 202); /* HTTP Accepted */ } /* the generic DELETE handler */ int generic_DELETE_handler(struct soap *soap) { fprintf(stderr, "Generic DELETE accepted URL=\"%s\"\n", soap->endpoint); return soap_send_empty_response(soap, 202); /* HTTP Accepted */ } SOAP_NMAC struct Namespace namespaces[] = { {"SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/", "http://www.w3.org/*/soap-envelope", NULL}, {"SOAP-ENC", "http://schemas.xmlsoap.org/soap/encoding/", "http://www.w3.org/*/soap-encoding", NULL}, {"xsi", "http://www.w3.org/2001/XMLSchema-instance", "http://www.w3.org/*/XMLSchema-instance", NULL}, {"xsd", "http://www.w3.org/2001/XMLSchema", "http://www.w3.org/*/XMLSchema", NULL}, {NULL, NULL, NULL, NULL} }; gsoap-2.8.28/gsoap/plugin/plugin.c0000644000175000017500000000714012653650150016342 0ustar ellertellert/* plugin.c Example gSOAP plug-in Copyright (C) 2000-2002 Robert A. van Engelen. All Rights Reserved. Compile & link with gSOAP clients and services to view SOAP messages. Usage (client/server code): struct soap soap; soap_init(&soap); soap_register_plugin(&soap, plugin); // register plugin ... ... = soap_copy(&soap); // copies plugin too ... soap_done(&soap); // detach plugin A plugin is copied with the soap_copy() call. Upon this call, two situations may arise depending on setting the fcopy() callback and the need to share or not share plugin data: 1. if the plugin fcopy() callback is set, it will be called to allow the plugin to copy its local data. When soap_done() is called on the copy, the fdelete() callback is called for cleanup. 2. if the plugin fcopy() callback is not set, then the plugin data will be shared (i.e. the data pointer points to the same address). The fdelete() callback will not be called upon a soap_done() on a copy of the soap struct. The fdelete() callback will be called for the original soap struct with which the plugin registered. */ #include "plugin.h" static const char plugin_id[] = PLUGIN_ID; static int plugin_init(struct soap *soap, struct plugin_data *data); static int plugin_copy(struct soap *soap, struct soap_plugin *dst, struct soap_plugin *src); static void plugin_delete(struct soap *soap, struct soap_plugin *p); static int plugin_send(struct soap *soap, const char *buf, size_t len); static size_t plugin_recv(struct soap *soap, char *buf, size_t len); int plugin(struct soap *soap, struct soap_plugin *p, void *arg) { p->id = plugin_id; p->data = (void*)malloc(sizeof(struct plugin_data)); /* optional: define fcopy() operation. When defined, fdelete() will be called for every copy of the plugin created with fcopy(), when NOT defined, fdelete() will only be called on the original non-copied plugin */ p->fcopy = plugin_copy; p->fdelete = plugin_delete; if (p->data) if (plugin_init(soap, (struct plugin_data*)p->data)) { free(p->data); /* error: could not init */ return SOAP_EOM; /* return error */ } return SOAP_OK; } static int plugin_init(struct soap *soap, struct plugin_data *data) { data->fsend = soap->fsend; /* save old recv callback */ data->frecv = soap->frecv; /* save old send callback */ soap->fsend = plugin_send; /* replace send callback with ours */ soap->frecv = plugin_recv; /* replace recv callback with ours */ return SOAP_OK; } static int plugin_copy(struct soap *soap, struct soap_plugin *dst, struct soap_plugin *src) { if (!(dst->data = (struct plugin_data*)malloc(sizeof(struct plugin_data)))) return SOAP_EOM; *dst->data = *src->data; return SOAP_OK; } static void plugin_delete(struct soap *soap, struct soap_plugin *p) { free(p->data); /* free allocated plugin data. If fcopy() is not set, then this function is not called for all copies of the plugin created with soap_copy(). In this example, the fcopy() callback can be safely omitted. When omitted, the plugin data is shared by the soap copies created with soap_copy() */ } static int plugin_send(struct soap *soap, const char *buf, size_t len) { struct plugin_data *data = (struct plugin_data*)soap_lookup_plugin(soap, plugin_id); fwrite(buf, len, 1, stderr); return data->fsend(soap, buf, len); /* pass data on to old send callback */ } static size_t plugin_recv(struct soap *soap, char *buf, size_t len) { struct plugin_data *data = (struct plugin_data*)soap_lookup_plugin(soap, plugin_id); size_t res = data->frecv(soap, buf, len); /* get data from old recv callback */ fwrite(buf, res, 1, stderr); return res; } gsoap-2.8.28/gsoap/plugin/wsseapi.cpp0000644000175000017500000070177412653650150017075 0ustar ellertellert/* wsseapi.c WS-Security plugin gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under one of the following licenses: GPL, the gSOAP public license, or Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ /** @mainpage - @ref wsse documents the wsse plugin for WS-Security 1.0 support. - @ref smdevp documents the smdevp signature/digest engine. - @ref mecevp documents the mecevp encryption engine. - @ref threads documents a portable threads and locking API. */ /** @page wsse The WS-Security plugin [TOC] @section wsse_5 Security Header The material in this section relates to the WS-Security specification section 5. To use the wsse plugin: -# Run wsdl2h -t typemap.dat on a WSDL of a service that requires WS-Security headers. The typemap.dat file is used to recognize and translate Security header blocks for XML signature and encryption. -# Run soapcpp2 on the header file produced by wsdl2h. -# (Re-)compile stdsoap2.c/pp, dom.c/pp, smdevp.c, mecevp.c, wsseapi.c and the generated source files with the -DWITH_DOM and -DWITH_OPENSSL compile flags set. The smdevp.c, mecevp.c, and wsseapi.c files are located in the 'plugin' directory. -# Use the wsse plugin API functions described below to add and verify Security headers, sign and verify messages, and to encrypt/decrypt messages. An example wsse client/server application can be found in gsoap/samples/wsse. The wsse engine is thread safe. However, if HTTPS is required please follow the instructions in Section @ref wsse_11 to ensure thread-safety of WS-Security with HTTPS. The wsse API is located in: - `gsoap/plugin/wsseapi.h` wsse API. - `gsoap/plugin/wsseapi.c` wsse API for C and C++. You will also need: - `gsoap/plugin/smdevp.c` compile and link this file (C and C++). - `gsoap/plugin/mecevp.c` compile and link this file (C and C++). - compile all sources with `-DWITH_OPENSSL -DWITH_DOM`. - if you have zlib installed, compile all sources also with `-DWITH_GZIP`. - link with `-lssl -lcrypto -lz -gsoapssl++` (or `-lgsoapssl` for C, or compile `stdsoap2.cpp` for C++ and `stdsoap2.c` for C). The gSOAP header file for soapcpp2 should import wsse.h (or the older 2002 version wsse2.h): @code #import "wsse.h" @endcode The wsdl2h tool adds the necessary imports to the generated header file if the WSDL declares the use of WS-Security. If not, you may have to add the import manually before running soapcpp2. The wsse API consists of a set of functions to populate and verify WS-Security headers and message body content. For more details, we refer to the following sections that correspond to the WS-Security specification sections: - Section 6 @ref wsse_6 - Section 7 @ref wsse_7 - Section 8 @ref wsse_8 - Section 9 @ref wsse_9 - Section 10 @ref wsse_10 - @ref wsse_11 - @ref wsse_12 - @ref wsse_13 - @ref wsse_wsc The basic API is introduced below. To add an empty Security header block to the SOAP header, use: @code soap_wsse_add_Security(soap); @endcode To delete a Security header, use: @code soap_wsse_delete_Security(soap); @endcode Adding an empty Security header block is not very useful. In the following, we present the higher-level functions of the wsse plugin to populate and verify Security header content. @note The soap context includes an actor value soap.actor that is populated and rendered as the SOAP-ENV:actor (SOAP 1.1) or SOAP-ENV:role (SOAP 1.2) attribute in XML within the generic SOAP Header. The attribute is optional, but should be used to target a recipient such as an intermediate node to process the SOAP header. In contrast, actor or role attributes within Security header blocks target specific recipients to process the Security header block. The gSOAP implementation does not automate this feature and application should set and check the actor/role attribute when necessary. In addition, the current implementation supports the inclusion of a single Security header block in the SOAP header. To populate the SOAP-ENV:actor or SOAP-ENV:role attribute within the Security header, use: @code soap_wsse_add_Security_actor(soap, "recipient"); @endcode To obtain the actor or role value (e.g. after receiving a message), use: @code _wsse__Security *security = soap_wsse_Security(soap); if (security) { ... = security->SOAP_ENV__actor; // SOAP 1.1 ... = security->SOAP_ENV__role; // SOAP 1.2 @endcode The SOAP-ENV:mustUnderstand attribute is automatically added and checked by the gSOAP engine. A gSOAP application compiled without Security support will reject Security headers. Security header blocks are attached to the soap context, which means that the information will be automatically kept to support multiple invocations. @section wsse_6 Security Tokens The material in this section relates to the WS-Security specification section 6. @subsection wsse_6_2 User Name Token To add a user name token to the Security header block, use: @code soap_wsse_add_UsernameTokenText(soap, "Id", "username", NULL); @endcode The `Id` value is optional. When non-NULL the user name token is included in the digital signature to protect its integrity. It is common for the wsse plugin functions to accept such `Id`s, which are serialized as wsu:Id identifiers for cross-referencing XML elements. The signature engine of the wsse plugin is designed to automatically sign all wsu:Id attributed elements to simplify the code you need to write to implement the signing process. To add a user name token with clear text password, use: @code soap_wsse_add_UsernameTokenText(soap, "Id", "username", "password"); @endcode It is strongly recommended to use `soap_wsse_add_UsernameTokenText` only in combination with HTTPS encrypted transmission or not at all. A better alternative is to use password digests. With password digest authentication, the digest value of a password (with message creation time and a random nonce) is compared on both sides, thus eliminating the need to exchange a password over the wire. To add a user name token with password digest, use: @code soap_wsse_add_UsernameTokenDigest(soap, "Id", "username", "password"); @endcode Although the password string is passed to this function, it is not rendered in XML or stored in a message log. It has been argued that this approach adopted by the WS-Security protocol is still vulnerable since the application retrieves the password in text form requiring a database to store passwords in clear text. However, a digest algorithm can be used to hash the passwords and store their digests instead, which eliminates the need to store clear-text passwords. Note that this is a common approach adopted by Unix for decades. By setting the `Id` value to a unique string, the user name token is also digitally signed by the signature engine further preventing tampering with its value. You must use `soap_wsse_add_UsernameTokenDigest` for each message exchange to refresh the password digest even when the user name and password are not changed. Otherwise, the receiver might flag the message as a replay attack. Clear-text passwords and password digests are verified with `soap_wsse_verify_Password`. To verify a password at the receiving side to authorize a request (e.g. within a Web service operation), use: @code int ns__myMethod(struct soap *soap, ...) { const char *username = soap_wsse_get_Username(soap); const char *password; if (!username) return soap->error; // no username: return FailedAuthentication (from soap_wsse_get_Username) password = ...; // lookup password of username if (soap_wsse_verify_Password(soap, password)) { int err = soap->error; soap_wsse_delete_Security(soap); // remove old security headers // if it is required to return signed faults, then add the following six lines here: if (soap_wsse_add_BinarySecurityTokenX509(soap, "X509Token", cert) || soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(soap, "#X509Token") || soap_wsse_sign_body(soap, SOAP_SMD_SIGN_RSA_SHA256, rsa_private_key, 0) { soap_wsse_delete_Security(soap); // remove security headers (failed construction) return soap->error; } return err; // password verification failed: return FailedAuthentication } ... // process request, then sign the response message: if (soap_wsse_add_BinarySecurityTokenX509(soap, "X509Token", cert) || soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(soap, "#X509Token") || soap_wsse_sign_body(soap, SOAP_SMD_SIGN_RSA_SHA256, rsa_private_key, 0) { soap_wsse_delete_Security(soap); // remove security headers (failed construction) return soap->error; } return SOAP_OK; } @endcode Note that the `soap_wsse_get_Username` functions sets the wsse:FailedAuthentication fault upon failure. It is common for the wsse plugin functions to return `SOAP_OK` or a wsse fault that should be passed to the sender by returning soap->error from service operations. The fault is displayed with the `soap_print_fault` function. To return signed faults back to the client, a signature is constructed as shown in the code snippet above. When the signature construction itself fails, we delete the partially constructed signature and return the fault to the client. Password digest authentication prevents message replay attacks. The wsse plugin keeps a database of password digests to thwart replay attacks. This is the only part in the plugin code that requires mutex provided by threads.h. Of course, this only works correctly if the server is persistent, such as a stand-alone service. Note that CGI-based services do not keep state. Machine clocks must be synchronized and clock skew should not exceed `SOAP_WSSE_CLKSKEW` at the server side. @subsection wsse_6_3 Binary Security Tokens X509 certificates are commonly included in Security header blocks as binary security tokens. A certificate is used to verify the digital signature of a digitally signed message using the public key embedded within the certificate. The certificate itself is signed by a certificate authority (CA) that vouches for the authenticity of the certificate, i.e. to prove the identify of the message originator. This verification process is important, because digital signatures are useless without verification: an attacker could simply replace the message, sign it, and replace the certificate. Certificates are automatically verified by the wsse plugin signature engine when received and accessed, which means that the certificates of the CAs must be made accessible to the wsse plugin as follows: @code soap->cafile = "cacerts.pem"; // use this soap->capath = "dir/to/certs"; // and/or point to CA certs soap->crlfile = "revoked.pem"; // use CRL (optional) @endcode The `soap_wsse_verify_X509` function checks the validity of a certificate. The check is automatically performed. The check is also performed when retrieving the certificate from a Security header block, either automatically by the wsse plugin's signature verification engine or manually as follows: @code X509 *cert = soap_wsse_get_BinarySecurityTokenX509(soap, "Id"); @endcode where `Id` is the identification string of the binary security token or NULL. The X509 certificate returned by this function should be freed with `X509_free` to deallocate the certificate data: @code if (cert) X509_free(cert); cert = NULL; @endcode The verification is an expensive process that will be optimized in future releases by caching the certificate chain. To attach a binary security token stored in a PEM file to a Security header block for transmission, use: @code soap_wsse_add_BinarySecurityTokenPEM(soap, NULL, "mycert.pem") @endcode A binary security token can be automatically signed by setting its `Id` attribute: @code soap_wsse_add_BinarySecurityTokenPEM(soap, "X509Token", "mycert.pem") @endcode Repeatedly loading a certificate from a PEM file is inefficient. To reuse a certificate loaded from a PEM file for multiple invocations, use: @code FILE *fd = fopen("mycert.pem", "r"); X509 *cert = PEM_read_X509(fd, NULL, NULL, NULL); fclose(fd); if (soap_wsse_add_BinarySecurityTokenX509(soap, "X509Token", cert)) ... // an error occurred @endcode Other types of binary security tokens can be added to the Security header block using: @code soap_wsse_add_BinarySecurityToken(soap, "Id", "valueType", data, datalen); @endcode @section wsse_6_4 XML Tokens The use and processing rules for XML tokens such as SAML assertions is specific to an application. The wsse plugin does not automate the use of XML tokens. The developer is encouraged to generate code for the SAML schema with wsdl2h and add the necessary assertions to the Security header block: @code typedef struct _wsse__Security { struct _wsu__Timestamp* wsu__Timestamp; struct _wsse__UsernameToken* UsernameToken; struct _wsse__BinarySecurityToken* BinarySecurityToken; struct _saml__Assertion* saml__Assertion; // added struct xenc__EncryptedKeyType* xenc__EncryptedKey; struct ds__SignatureType* ds__Signature; @char* SOAP_ENV__actor; @char* SOAP_ENV__role; } _wsse__Security; @endcode Alternatively, a DOM can be used to store and retrieve XML tokens: @code #import "dom.h" typedef struct _wsse__Security { struct _wsu__Timestamp* wsu__Timestamp; struct _wsse__UsernameToken* UsernameToken; struct _wsse__BinarySecurityToken* BinarySecurityToken; struct _saml__Assertion* saml__Assertion; // added struct xenc__EncryptedKeyType* xenc__EncryptedKey; struct ds__SignatureType* ds__Signature; int __size; xsd__anyType* any; @char* SOAP_ENV__actor; @char* SOAP_ENV__role; } _wsse__Security; @endcode @section wsse_7 Token References The material in this section relates to the WS-Security specification section 7. To use a certificate for signature verification, add a direct security token reference URI for the token to the KeyInfo, for example: @code soap_wsse_add_KeyInfo_SecurityTokenReferenceURI(soap, "URI", "valueType"); @endcode and: @code soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(soap, "URI"); @endcode For X509 certificates we use this to add a binary security token with the certificate and a reference to the local token: @code if (soap_wsse_add_BinarySecurityTokenX509(soap, "X509Token", cert) || soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(soap, "#X509Token")) ... // an error occurred @endcode This follows the recommended practice to place Security token references in the KeyInfo element of a Signature. The KeyInfo is used to verify the validity of a signature value. Key identifiers can be used as well: @code soap_wsse_add_KeyInfo_SecurityTokenReferenceKeyIdentifier(soap, "Id", "valueType", data, datalen); @endcode Embedded references are added with: @code soap_wsse_add_KeyInfo_SecurityTokenReferenceEmbedded(soap, "Id", "valueType"); @endcode Full support for embedded references requires coding to add tokens and assertions, as well as to consume embedded references at the receiving side. There is no automated mechanism to take the embedded references and process them accordingly. The use of key names is not recommended, but in case they are required they can be added with: @code soap_wsse_add_KeyInfo_KeyName(soap, "name"); @endcode @section wsse_8 Signatures The material in this section relates to the WS-Security specification section 8. The wsse plugin must be registered to sign and verify messages: @code soap_register_plugin(soap, soap_wsse); @endcode XML signatures are usually computed over normalized XML (to ensure the XML processors of intermediate nodes can accurately reproduce the XML). To this end, the exclusive canonical XML standard (exc-c14n) is required, which is set using the `SOAP_XML_CANONICAL` flag: @code struct soap *soap = soap_new1(SOAP_XML_CANONICAL); soap_register_plugin(soap, soap_wsse); @endcode If you prefer XML indentation, use: @code struct soap *soap = soap_new1(SOAP_XML_CANONICAL | SOAP_XML_INDENT); soap_register_plugin(soap, soap_wsse); @endcode Other flags to consider: - `SOAP_IO_CHUNK` for HTTP chunked content to stream messages. - `SOAP_ENC_GZIP` for HTTP compression (also enables HTTP chunking). Next, we decide which signature algorithm is appropriate to use: - HMAC-SHA uses a secret key (also known as a shared key in symmetric cryptography) to sign the SHA digest of the SignedInfo element. - DSA-SHA uses a DSA private key to sign the SHA digest of the SignedInfo element. - RSA-SHA uses a RSA private key to sign the SHA digest of the SignedInfo element. - ECDSA-SHA uses a Elliptic Curve DSA private key to sign the SHA digest of the SignedInfo element. HMAC-SHA is the simplest method, but relies on the fact that you have to make absolutely sure the key is kept secret on both the sending and receiving side. As long as the secret key is confidential, messages are securely signed. However, this is virtually impossible when exchanging messages with untrusted disparate parties. The advantage of HMAC-SHA is the speed by which messages are signed and verified. Algorithms HMAC SHA1, SHA256, and SHA512 are supported: - `SOAP_SMD_HMAC_SHA1` http://www.w3.org/2000/09/xmldsig#hmac-sha1 - `SOAP_SMD_HMAC_SHA224` http://www.w3.org/2001/04/xmldsig-more#hmac-sha224 - `SOAP_SMD_HMAC_SHA256` http://www.w3.org/2001/04/xmldsig-more#hmac-sha256 - `SOAP_SMD_HMAC_SHA384` http://www.w3.org/2001/04/xmldsig-more#hmac-sha384 - `SOAP_SMD_HMAC_SHA512` http://www.w3.org/2001/04/xmldsig-more#hmac-sha512 DSA-SHA and RSA-SHA rely on public key cryptography. In simplified terms, a message is signed using the (confidential!) private key. The public key is used to verify the signature. Since only the originating party could have used its private key to sign the message, the integrity of the message is guaranteed. Of course, we must trust the public key came from the originator (it is often included as an X509 certificate in the message). To this end, a trusted certificate authority should have signed the public key, thereby creating a X509 certificate that contains the public key and the identity of the message originator. The following DSA, RSA, and ECDSA algorithms are supported: - `SOAP_SMD_SIGN_DSA_SHA1` http://www.w3.org/2000/09/xmldsig#dsa-sha1 - `SOAP_SMD_SIGN_DSA_SHA256` http://www.w3.org/2000/09/xmldsig-more#dsa-sha256 - `SOAP_SMD_SIGN_RSA_SHA1` http://www.w3.org/2000/09/xmldsig#rsa-sha1 - `SOAP_SMD_SIGN_RSA_SHA224` http://www.w3.org/2001/04/xmldsig-more#rsa-sha224 - `SOAP_SMD_SIGN_RSA_SHA256` http://www.w3.org/2001/04/xmldsig-more#rsa-sha256 - `SOAP_SMD_SIGN_RSA_SHA384` http://www.w3.org/2001/04/xmldsig-more#rsa-sha384 - `SOAP_SMD_SIGN_RSA_SHA512` http://www.w3.org/2001/04/xmldsig-more#rsa-sha512 - `SOAP_SMD_SIGN_ECDSA_SHA1` http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha1 - `SOAP_SMD_SIGN_ECDSA_SHA224` http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha224 - `SOAP_SMD_SIGN_ECDSA_SHA256` http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha256 - `SOAP_SMD_SIGN_ECDSA_SHA384` http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha384 - `SOAP_SMD_SIGN_ECDSA_SHA512` http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha512 An optional callback function can be passed to the plugin that is responsible for providing a certificate or key to the wsse engine to verify a signed message. For example, when a security token is absent from an DSA-SHA or RSA-SHA signed message then the only mechanism to automatically verify the signature is to let the callback produce a certificate: @code soap_register_plugin_arg(soap, soap_wsse, security_token_handler); const void *security_token_handler(struct soap *soap, int *alg, const char *keyname, int *keylen) { // Note: 'keyname' argument is may be used with shared secret key // decryption where the keyname is from the ds:KeyInfo/KeyName content if (keyname) { ... lookup keyname ... const void *key = ...; *keylen = ...; *alg = ...; return key; } // Get the user name from UsernameToken in message const char *uid = soap_wsse_get_Username(soap); switch (*alg) { case SOAP_SMD_VRFY_DSA_SHA1: case SOAP_SMD_VRFY_DSA_SHA256: case SOAP_SMD_VRFY_RSA_SHA1: case SOAP_SMD_VRFY_RSA_SHA224: case SOAP_SMD_VRFY_RSA_SHA256: case SOAP_SMD_VRFY_RSA_SHA384: case SOAP_SMD_VRFY_RSA_SHA512: case SOAP_SMD_VRFY_ECDSA_SHA1: case SOAP_SMD_VRFY_ECDSA_SHA224: case SOAP_SMD_VRFY_ECDSA_SHA256: case SOAP_SMD_VRFY_ECDSA_SHA384: case SOAP_SMD_VRFY_ECDSA_SHA512: if (uid) { // Lookup uid to retrieve the X509 certificate to verify the signature const X509 *cert = ...; return (const void*)cert; } return NULL; // no certificate: fail case SOAP_SMD_HMAC_SHA224: case SOAP_SMD_HMAC_SHA256: case SOAP_SMD_HMAC_SHA384: case SOAP_SMD_HMAC_SHA512: if (uid) { // Lookup uid to retrieve the HMAC SHA key to verify the signature const void *key = ...; *alg = ...; *keylen = ...; return key; } return NULL; // no certificate: fail case SOAP_MEC_ENV_DEC_DES_CBC: case SOAP_MEC_ENV_DEC_AES128_CBC: case SOAP_MEC_ENV_DEC_AES192_CBC: case SOAP_MEC_ENV_DEC_AES256_CBC: case SOAP_MEC_ENV_DEC_AES512_CBC: // reserved for future use case SOAP_MEC_ENV_DEC_AES128_GCM: // GCM requires OpenSSL 1.0.2 or higher case SOAP_MEC_ENV_DEC_AES192_GCM: // GCM requires OpenSSL 1.0.2 or higher case SOAP_MEC_ENV_DEC_AES256_GCM: // GCM requires OpenSSL 1.0.2 or higher case SOAP_MEC_ENV_DEC_AES512_GCM: // GCM requires OpenSSL 1.0.2 or higher // return decryption private key associated with keyname case SOAP_MEC_DEC_DES_CBC: case SOAP_MEC_DEC_AES128_CBC: case SOAP_MEC_DEC_AES192_CBC: case SOAP_MEC_DEC_AES256_CBC: case SOAP_MEC_DEC_AES512_CBC: // reserved for future use case SOAP_MEC_DEC_AES128_GCM: // GCM requires OpenSSL 1.0.2 or higher case SOAP_MEC_DEC_AES192_GCM: // GCM requires OpenSSL 1.0.2 or higher case SOAP_MEC_DEC_AES256_GCM: // GCM requires OpenSSL 1.0.2 or higher` case SOAP_MEC_DEC_AES512_GCM: // GCM requires OpenSSL 1.0.2 or higher // *keylen = ... // return decryption shared secret key associated with keyname } return NULL; // fail } @endcode @subsection wsse_8_2a Signing Messages After the plugin is registered and a signature algorithm selected, the `soap_wsse_sign` function or the `soap_wsse_sign_body` function is used to initiate the signature engine to automatically sign outbound messages. The code to sign the SOAP Body of a message using HMAC-SHA1 is: @code static char hmac_key[16] = { 0xff, 0xee, 0xdd, 0xcc, 0xbb, 0xaa, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x00 }; struct soap *soap = soap_new1(SOAP_XML_CANONICAL | SOAP_XML_INDENT); soap_register_plugin(soap, soap_wsse); if (soap_wsse_sign_body(soap, SOAP_SMD_HMAC_SHA1, hmac_key, sizeof(hmac_key)) ... // an error occurred else if (soap_call_ns__myMethod(soap, ...)) ... // a transmission error occurred @endcode The `hmac_key` above is some secret key you generated for the sending side and receiving side (don't use the one shown here). Instead of SHA1 above, you can also use the more secure SHA224, SHA256, SHA384 and SHA512 hashes. As always, use `soap_print_fault` to display the error message. To sign the body of an outbound SOAP message using RSA-SHA (DSA-SHA is similar), we include the X509 certificate with the public key as a BinarySecurityToken in the header and a KeyInfo reference to the token to let receivers use the public key in the certificate to verify the authenticity of the message: @code FILE *fd; EVP_PKEY *rsa_private_key; X509 *cert; struct soap *soap = soap_new1(SOAP_XML_CANONICAL | SOAP_XML_INDENT); soap_register_plugin(soap, soap_wsse); fd = fopen("privkey.pem", "r"); rsa_private_key = PEM_read_PrivateKey(fd, NULL, NULL, "password"); fclose(fd); fd = fopen("cert.pem", "r"); X509 *cert = PEM_read_X509(fd, NULL, NULL, NULL); fclose(fd); if (soap_wsse_add_BinarySecurityTokenX509(soap, "X509Token", cert) || soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(soap, "#X509Token") || soap_wsse_sign_body(soap, SOAP_SMD_SIGN_RSA_SHA256, rsa_private_key, 0)) ... // an error occurred else if (soap_call_ns__myMethod(soap, ...)) ... // a transmission error occurred @endcode The private key and its certificate are often placed in the same file, see e.g. server.pem in the package. To summarize the signing process: -# Register the wsse plugin. -# Obtain an HMAC secret key or a DSA/RSA/ECDSA private key. -# For DSA or RSA, obtain the X509 certificate with the public key signed by a certificate authority. -# Add the X509 certificate as a BinarySecurityToken to the header. -# Add a KeyInfo BinarySecurityTokenReference. -# Invoke `soap_wsse_sign` or `soap_wsse_sign_body` to sign the message. -# Always check the function return values for errors. You don't want to produce and accept messages with an invalid Security headers. @subsection wsse_8_2b Signing Message Parts The `soap_wsse_sign_body` function signs the entire SOAP body. If it is desirable to sign individual parts of a message the `soap_wsse_sign` function should be used. All message parts with wsu:Id attributes are signed. These message parts should not be nested (nested elements will not be separately signed). By default, all and only those XML elements with wsu:Id attributes are signed. Therefore, the wsu:Id attribute values used in a message must be unique within the message. Although usually not required, the default signing rule can be overridden with the `soap_wsse_sign_only` function, see @ref wsse_8_3. For example, consider a transaction in which we only want to sign a contract in the SOAP Body. This allows us to modify the rest of the message or extract the contract in XML and pass it on with the signature. The gSOAP header file includes a myContract declaration: @code struct ns__myContract { @char* wsu__Id = "Contract"; char* name; char* title; char* terms; }; int ns__myMethod(struct ns__myContract agreement, bool* accepted); @endcode The default value of the wsu:Id is "Contract" so that we can instantiate the struct, automatically sign it, and send it as follows: @code struct ns__myContract contract; bool accept; soap_default_ns__myContract(soap, &contract); contract.name = ...; contract.title = ...; contract.terms = ...; if (soap_wsse_add_BinarySecurityTokenX509(soap, "X509Token", cert) || soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(soap, "#X509Token") || soap_wsse_sign(soap, SOAP_SMD_SIGN_RSA_SHA256, rsa_private_key, 0)) ... // an error occurred else if (soap_call_ns__myMethod(soap, contract, &accept)) ... // a transmission error occurred @endcode The above example shows a wsu:Id attribute embedded (hardcoded) in a struct. When it is not possible to add the `wsu__Id` member, for example when the type is a string instead of a struct, it is suggested to specify the XML element to be signed with the `soap_wsse_set_wsu_id(soap, "space-separated string of element names")`. Use it before each call or in the server operation (when returning XML data from a service operation). This lets the engine add wsu:Id="tag" attribute-value pair to the element's tag name. For example: @code soap_wsse_set_wsu_id(soap, "ns:myContract"); // ... soap_wsse_set_InclusiveNamespaces(soap, "ns xsd"); // QNames have 'ns' and 'xsd' values if (soap_wsse_add_BinarySecurityTokenX509(soap, "X509Token", cert) || soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(soap, "#X509Token") || soap_wsse_sign(soap, SOAP_SMD_SIGN_RSA_SHA256, rsa_private_key, 0)) ... // an error occurred soap_wsse_set_wsu_id(soap, NULL); // reset soap_wsse_set_InclusiveNamespaces(soap, NULL); // reset @endcode This code adds the wsu:Id="ns-myContract" to the ns:myContract element. Here, the `wsu__Id` value in the struct MUST NOT be set. Otherwise, two wsu:Id attributes are present which is invalid. Also, the element signed must be unique in the message. That is, there cannot be more than one matching element, otherwise the resulting signature is invalid. @note To reset the automatic wsu:Id attributes addition, pass NULL to `soap_wsse_set_wsu_id` as shown above. This is automatically performed when a new message is received (but not automatically in a sequence of one-way sends for example). @note QName content may lead to verification issues with canonicalization (`SOAP_XML_CANONICAL`), because XML processors may not recognize prefixes in QNames as visually utilized. With QName content and `SOAP_XML_CANONICAL` enabled, we should use `soap_wsse_set_InclusiveNamespaces(soap, "prefixlist")` to define which namespace prefixes (space-separated in the string) should be considered inclusive. For example, xsi:type attribute values are QNames with xsd types and other schema types. @note When signing parts of the body as outlined above, use `soap_wsse_sign` (do NOT use `soap_wsse_sign_body`). @warning Do not attempt to sign an element with a wsu:Id that is a subelement of another element with a wsu:Id, that is, do not sign inner nested wsu:Id elements. The element that you will try to sign will not be canonicalized and will lead to a failure of the signature verification. When elements with wsu:Id are nested, sign the outermost element. We recommend to sign the entire SOAP Body using `soap_wsse_sign_body` and reserve the use of `soap_wsse_set_wsu_id` for SOAP Header elements, such as WS-Addressing elements. For example: @code #include "wsaapi.h" ... soap_wsa_request(soap, RequestMessageID, ToAddress, RequestAction); soap_wsse_set_wsu_id(soap, "wsa5:To wsa5:From wsa5:ReplyTo wsa5:Action"); if (soap_wsse_add_BinarySecurityTokenX509(soap, "X509Token", cert) || soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(soap, "#X509Token") || soap_wsse_sign_body(soap, SOAP_SMD_SIGN_RSA_SHA256, rsa_private_key, 0)) ... // an error occurred else if (soap_call_ns__myMethod(soap, ...)) ... // a transmission error occurred soap_wsse_set_wsu_id(soap, NULL); @endcode This code signs the wsa5:To and wsa5:Action SOAP header elements (set with `soap_wsa_request`, see the WS-Addressing "wsa" API in the gSOAP documentation for more information on the use of WS-Addressing). It is fine to specify more elements with `soap_wsse_set_wsu_id` than actually present in the XML payload. The other WS-Addressing headers are not present and are not signed. @note `soap_wsse_set_wsu_id` should only be set once for each `soap_wsse_sign` or `soap_wsse_sign_body`. Each new call overrides the previous setting. @warning Never use `soap_wsse_set_wsu_id` to set the wsu:Id for an element that occurs more than once in the payload, since each will have the same wsu:Id attribute that may lead to a WS-Signature failure. @subsection wsse_8_3 Signing Tokens To sign security tokens such as user names, passwords, and binary security tokens, just assign their Id values with a unique string, such as "Time" for timestamps and "User" for user names. For example: @code soap_wsse_add_Timestamp(soap, "Time", 600); soap_wsse_add_UsernameTokenDigest(soap, "User", "username", "password"); ... // the rest of the signing code @endcode Note that by default all wsu:Id-attributed elements are signed. To filter a subset of wsu:Id-attributed elements for signatures, use the `soap_wsse_sign_only` function as follows: @code soap_wsse_add_UsernameTokenDigest(soap, "User", "username", "password"); soap_wsse_add_BinarySecurityTokenX509(soap, "X509Token", cert); soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(soap, "#X509Token"); soap_wsse_sign_body(soap, SOAP_SMD_SIGN_RSA_SHA256, rsa_private_key, 0); soap_wsse_sign_only(soap, "User Body"); @endcode Note that in the above we MUST set the X509Token name for cross-referencing with a wsu:Id, which normally results in automatically signing that token unless filtered out with `soap_wsse_sign_only`. The SOAP Body wsu:Id is always "Body" and should be part of the `soap_wsse_sign_only` set of wsu:Id names to sign. When using `soap_wsse_set_wsu_id` we need to use the tag name with `soap_wsse_sign_only`. For example: @code soap_wsa_request(soap, RequestMessageID, ToAddress, RequestAction); soap_wsse_set_wsu_id(soap, "wsa5:To wsa5:From wsa5:ReplyTo wsa5:Action"); soap_wsse_add_UsernameTokenDigest(soap, "User", "username", "password"); soap_wsse_add_BinarySecurityTokenX509(soap, "X509Token", cert); soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(soap, "#X509Token"); soap_wsse_sign_body(soap, SOAP_SMD_SIGN_RSA_SHA256, rsa_private_key, 0); soap_wsse_sign_only(soap, "wsa5:To wsa5:From wsa5:ReplyTo wsa5:Action User Body"); @endcode @note `soap_wsse_sign_only` should only be set once for each `soap_wsse_sign` or `soap_wsse_sign_body`. Each new call overrides the previous. @note To reset the filtering of signed tokens and elements, pass NULL to `soap_wsse_sign_only`. This is automatically performed when a new message is received (but not automatically in a sequence of one-way sends for example). @subsection wsse_8_4 Signature Validation To automatically verify the signature of an inbound message signed with DSA or RSA algorithms, assuming the message contains the X509 certificate as a binary security token, use: @code struct soap *soap = soap_new1(SOAP_XML_CANONICAL | SOAP_XML_INDENT); soap_register_plugin(soap, soap_wsse); soap_wsse_verify_auto(soap, SOAP_SMD_NONE, NULL, 0); soap->cafile = "cacerts.pem"; // file with CA certs of peers soap->capath = "dir/to/certs"; // and/or point to CA certs soap->crlfile = "revoked.pem"; // use CRL (optional) // server: if (soap_serve(soap)) ... // an error occurred // client: if (soap_call_ns__myMethod(soap, ...)) ... // an error occurred @endcode All locally referenced and signed elements in the signed message will be verified with `soap_wsse_verify_auto` using the default settings set with `SOAP_SMD_NONE`. Elements that are not signed cannot be verified. Also elements referenced with absolute URIs that are not part of the message are not automatically verified. The received message is stored in a DOM accessible with soap->dom. This enables further analysis of the message content. For a post-parsing check to verify if an XML element was signed in an inbound message, use: @code soap_wsse_verify_auto(soap, SOAP_SMD_NONE, NULL, 0); ... // client call if (soap_wsse_verify_element(soap, "namespaceURI", "tag") > 0) ... // at least one element with matching tag and namespace is signed @endcode The signed element nesting rules are obeyed, so if the matching element is a descendent of a signed element, it is signed as well. Because it is a post check, a client should invoke `soap_wsse_verify_element` after the call completed. A service should invoke this function within the service operation routine, i.e. when the message request is accepted and about to be processed. For example, to check whether the wsu:Timestamp element was signed (assuming it is present and message expiration checked with `soap_wsse_verify_Timestamp)`, use `soap_wsse_verify_element(soap, "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd", "Timestamp")`. To check the SOAP Body (either using SOAP 1.1 or 1.2), simply use `soap_wsse_verify_body`. The `soap_wsse_verify_auto` function keeps processing signed (and unsigned) messages as they arrive. For unsigned messages this can be expensive and the verification engine should be shut down using `soap_wsse_verify_done`. There can be two problems with signature verification. First, some WS-Security implementations include SignedInfo/Reference/@URI without targeting an element, which will produce an error that a Reference URI target does not exist. To ignore these references, use `SOAP_WSSE_IGNORE_EXTRA_REFS`. Second, certificates provided by the peer are not verifiable unless the signing CA certificate is included in the cafile or capath. To disable certificate verification set the fsslverify callback: @code static int ssl_verify(int ok, X509_STORE_CTX *store) { // put certificate verification here, return 0 when fails 1 when ok return 1; } ... soap_wsse_verify_auto(soap, SOAP_SMD_NONE | SOAP_WSSE_IGNORE_EXTRA_REFS, NULL, 0); soap->fsslverify = ssl_verify; @endcode To verify the HMAC signature of an inbound message, the HMAC key must be supplied: @code static char hmac_key[16] = // the same secret key that was used to sign { 0xff, 0xee, 0xdd, 0xcc, 0xbb, 0xaa, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x00 }; struct soap *soap = soap_new1(SOAP_XML_CANONICAL | SOAP_XML_INDENT); soap_register_plugin(soap, soap_wsse); soap_wsse_verify_auto(soap, SOAP_SMD_HMAC_SHA1, hmac_key, sizeof(hmac_key)); // server: if (soap_serve(soap)) ... // an error occurred // client: if (soap_call_ns__myMethod(soap, ...)) ... // an error occurred @endcode To summarize the signature verification process: -# Register the wsse plugin. -# For HMAC, obtain the HMAC secret key -# Use `soap_wsse_verify_auto` to verify inbound messages. -# Set the cafile (or capath) to verify certificates of the peers and crlfile (optional) -# After receiving a message, the DOM in soap->dom can be traversed for further analysis. -# Always check the function return values for errors. You don't want to accept a request or response message with an invalid Security header. -# Use `soap_wsse_verify_done` to terminate verification, e.g. to consume plain messages more efficiently. @section wsse_9 Encryption The material in this section relates to the WS-Security specification section 9. The wsse plugin must be registered: @code struct soap *soap = soap_new1(SOAP_XML_CANONICAL | SOAP_XML_INDENT); soap_register_plugin(soap, soap_wsse); @endcode Other flags to consider: - `SOAP_IO_CHUNK` for HTTP chunked content to stream messages. - `SOAP_ENC_GZIP` for HTTP compression (also enables HTTP chunking). @subsection wsse_9_1 Encrypting Messages Encryption should be used in combination with signing. A signature ensures message integrity while encryption ensures confidentially. Encrypted messages can be tampered with unless integrity is ensured. Therefore, the reader should be familiar with the material in Section @ref wsse_8 should to sign and verify message content. Messages are encrypted using either public key cryptography or by using a symmetric secret key. A symmetric secret key should only be shared between the sender and receiver (or any trusted communicating peer). Encryption with public key cryptography uses an "envelope" process, where the public key of the recipient is used to encrypt a temporary (ephemeral) secret key that is sent together with the secret key-encrypted message to the recipient. The recipient decrypts the ephemeral key and uses it to decrypt the message. The public key is usually part of a X509 certificate. The public key (containing the subject information) is added to the WS-Security header and used for encryption of the SOAP Body as follows: @code X509 *cert = ...; // if (soap_wsse_add_EncryptedKey(soap, SOAP_MEC_ENV_ENC_DES_CBC, "Cert", cert, NULL, NULL, NULL)) soap_print_fault(soap, stderr); @endcode `SOAP_MEC_ENV_ENC_DES_CBC` specifies envelope encoding with triple DES CBC and PKCS1 RSA-1_5. Use `(SOAP_MEC_ENV_ENC_AES256_CBC | SOAP_MEC_OAEP)` for AES256 CBC with OAEP padding (OAEP is recommended over RSA-1_5 or use GCM). The envelope encryption options are: - `SOAP_MEC_ENV_ENC_DES_CBC` RSA-1_5 envelope encryption with triple DES CBC - `SOAP_MEC_ENV_ENC_AES256_CBC` RSA-1_5 envelope encryption with AES256 CBC - `SOAP_MEC_ENV_ENC_AES256_GCM` envelope authenticated encryption with AES256 GCM - `SOAP_MEC_ENV_ENC_AES256_CBC | SOAP_MEC_OAEP` OAEP envelope encryption with AES256 CBC where, in the above, AES256 can be replaced with AES128 or AES192. The "Cert" parameter is a unique URI to reference the key from the encrypted SOAP Body. The above enables the encryption engine for the next message to be sent, either at the client or server side. The server should use this withing a server operation (before returning) to enable the service operation response to be encrypted. To include a subject key ID in the WS-Security header instead of the entire public key, specify the subject key ID parameter: @code X509 *cert = ...; // if (soap_wsse_add_EncryptedKey(soap, SOAP_MEC_ENV_ENC_DES_CBC, "Cert", cert, "Subject Key ID", NULL, NULL)) soap_print_fault(soap, stderr); @endcode The difference with the previous example where no subject key ID was specified is that the WS-Security header only contains the subject key ID and no longer the public key in base64 format. To exclude the encrypted key certificate from the message and include a X509Data element with IssuerName and SerialNumber: @code X509 *cert = ...; if (soap_wsse_add_EncryptedKey(soap, SOAP_MEC_ENV_ENC_DES_CBC, "Cert", cert, NULL, "CN=Root Agency", "-79441640260855276448009124614332182350")) soap_print_fault(soap, stderr); @endcode The issuer name and serial number (must be in decimal for `soap_wsse_add_EncryptedKey`) of a certificate can be obtained as follows: @code X509 *cert = ...; BIGNUM *bn = BN_new(); char issuer[256], *serial; X509_NAME_oneline(X509_get_issuer_name(cert), issuer, sizeof(issuer)); ASN1_INTEGER_to_BN(X509_get_serialNumber(cert), bn); serial = BN_bn2dec(bn); OPENSSL_free(bn); ... if (soap_wsse_add_EncryptedKey(soap, SOAP_MEC_ENV_ENC_DES_CBC, "Cert", cert, NULL, issuer+1, serial)) soap_print_fault(soap, stderr); ... OPENSSL_free(serial); @code Note that in the above code the leading slash in "/CN=Root Agency" is excluded from the issuer name. When excluding the encrypted key certificate from the message, the token handler callback must be provided on the receiving end to obtain the certificate that corresponds to the issuer name and serial number. For example: @code soap_register_plugin_arg(soap, soap_wsse, security_token_handler); static const void *token_handler(struct soap *soap, int alg, const char *keyname, int *keylen) { struct ds__X509IssuerSerialType *issuer; switch (alg) { case SOAP_SMD_VRFY_DSA_SHA1: case SOAP_SMD_VRFY_DSA_SHA256: case SOAP_SMD_VRFY_RSA_SHA1: case SOAP_SMD_VRFY_RSA_SHA224: case SOAP_SMD_VRFY_RSA_SHA256: case SOAP_SMD_VRFY_RSA_SHA384: case SOAP_SMD_VRFY_RSA_SHA512: case SOAP_SMD_VRFY_ECDSA_SHA1: case SOAP_SMD_VRFY_ECDSA_SHA224: case SOAP_SMD_VRFY_ECDSA_SHA256: case SOAP_SMD_VRFY_ECDSA_SHA384: case SOAP_SMD_VRFY_ECDSA_SHA512: issuer = soap_wsse_get_KeyInfo_SecurityTokenReferenceX509Data(soap); if (issuer) { if (!strcmp(issuer->X509IssuerName, clt_issuer) && !strcmp(issuer->X509SerialNumber, clt_serial)) return (const void*)clt_cert; if (!strcmp(issuer->X509IssuerName, srv_issuer) && !strcmp(issuer->X509SerialNumber, srv_serial)) return (const void*)srv_cert; } break; ... @endcode To encrypt specific elements of the SOAP Body rather than the entire SOAP Body, use `soap_wsse_add_EncryptedKey_encrypt_only` in combination with `soap_wsse_set_wsu_id` as follows: @code X509 *cert = ...; // the SOAP Body contains one and one (not nested) soap_wsse_set_wsu_id(soap, "ns:myContract ns:myPIN"); if (soap_wsse_add_EncryptedKey_encrypt_only(soap, SOAP_MEC_ENV_ENC_DES_CBC, "Cert", cert, NULL, NULL, NULL, "ns:myContract ns:myPIN")) soap_print_fault(soap, stderr); @endcode To encrypt the SOAP Body and SOAP Header element(s), such as ds:Signature, use "SOAP-ENV:Body" with `soap_wsse_add_EncryptedKey_encrypt_only`: @code X509 *cert = ...; soap_wsse_set_wsu_id(soap, "ds:Signature"); if (soap_wsse_add_EncryptedKey_encrypt_only(soap, SOAP_MEC_ENV_ENC_DES_CBC, "Cert", cert, NULL, NULL, NULL, "ds:Signature SOAP-ENV:Body")) soap_print_fault(soap, stderr); @endcode @note The `soap_wsse_set_wsu_id` MUST be used to specify all element tag names to encrypt. Additional elements MAY be specified in `soap_wsse_set_wsu_id` (for example elements to digitally sign). @note The elements identified by the tag names in `soap_wsse_set_wsu_id` to encrypt MUST occur EXACTLY ONCE in the SOAP Body. For symmetric encryption with a shared secret key, generate a 160-bit triple DES key and make sure both the sender and reciever can use the key without it being shared by any other party (key exchange problem). Then use the `soap_wsse_encrypt_body` function to encrypt the SOAP Body as follows: @code char des_key[20] = ...; // 20-byte (160-bit) DES shared secret key if (soap_wsse_encrypt_body(soap, SOAP_MEC_ENC_DES_CBC, des_key, sizeof(des_key))) soap_print_fault(soap, stderr); @endcode The symmetric encryption options are: - `SOAP_MEC_ENC_DES_CBC` symmetric encryption with triple DES CBC - `SOAP_MEC_ENC_AES256_CBC` symmetric encryption with AES256 CBC - `SOAP_MEC_ENC_AES256_GCM` symmetric authenticated encryption with AES256 GCM where, in the above, AES256 can be replaced with AES128 or AES192. For example, symmetric encryption with AES256: @code char aes256_key[32] = ...; // 32-byte (256-bit) AES256 shared secret key if (soap_wsse_encrypt_body(soap, SOAP_MEC_ENC_AES256_CBC, aes256_key, sizeof(aes256_key))) soap_print_fault(soap, stderr); @endcode To symmetrically encrypt specific elements of the SOAP Body rather than the entire SOAP Body, use `soap_wsse_encrypt_only` in combination with `soap_wsse_set_wsu_id` as follows: @code char des_key[20] = ...; // 20-byte (160-bit) secret key // the SOAP Body contains one and one (not nested) soap_wsse_set_wsu_id(soap, "ns:myContract ns:myPIN"); if (soap_wsse_encrypt_only(soap, SOAP_MEC_ENC_DES_CBC, des_key, sizeof(des_key), "ns:myContract ns:myPIN")) soap_print_fault(soap, stderr); @endcode @note The `soap_wsse_set_wsu_id` MUST be used to specify all element tag names to encrypt. Additional elements MAY be specified in `soap_wsse_set_wsu_id` (for example elements to digitally sign). @note The elements identified by the tag names in `soap_wsse_set_wsu_id` to encrypt MUST occur EXACTLY ONCE in the SOAP Body. @subsection wsse_9_2 Decrypting Message Parts The wsse engine automatically decrypts message parts, but requires a private key or secret shared key to do so. A default key can be given to enable decryption, but it will fail if a non-compatible key was used for encryption. In that case a token handler callback should be defined by the user to select a proper decryption key based on the available subject key name or identifier embedded in the encrypted message. Here is an example of a token handler callback: @code soap_register_plugin_arg(soap, soap_wsse, security_token_handler); const void *security_token_handler(struct soap *soap, int alg, const char *keyname, int *keylen) { // Note: 'keyname' argument may be used with shared secret key // decryption where the keyname is from the ds:KeyInfo/KeyName content if (keyname) { ... lookup keyname ... const void *key = ...; keylen = ...; *alg = ...; return key; } // Get the user name from UsernameToken in message const char *uid = soap_wsse_get_Username(soap); switch (*alg) { case SOAP_SMD_VRFY_DSA_SHA1: case SOAP_SMD_VRFY_DSA_SHA256: CASE SOAP_SMD_VRFY_RSA_SHA1: CASE SOAP_SMD_VRFY_RSA_SHA224: CASE SOAP_SMD_VRFY_RSA_SHA256: CASE SOAP_SMD_VRFY_RSA_SHA384: CASE SOAP_SMD_VRFY_RSA_SHA512: CASE SOAP_SMD_VRFY_ECDSA_SHA1: CASE SOAP_SMD_VRFY_ECDSA_SHA224: CASE SOAP_SMD_VRFY_ECDSA_SHA256: CASE SOAP_SMD_VRFY_ECDSA_SHA384: CASE SOAP_SMD_VRFY_ECDSA_SHA512: if (uid) { // Lookup uid to retrieve the X509 certificate to verify the signature const X509 *cert = ...; return (const void*)cert; } return NULL; // no certificate: fail case SOAP_SMD_HMAC_SHA1: if (uid) { // Lookup uid to retrieve the HMAC key to verify the signature const void *key = ...; *alg = ...; *keylen = ...; return key; } return NULL; // no certificate: fail case SOAP_MEC_ENV_DEC_DES_CBC: case SOAP_MEC_ENV_DEC_AES128_CBC: case SOAP_MEC_ENV_DEC_AES192_CBC: case SOAP_MEC_ENV_DEC_AES256_CBC: case SOAP_MEC_ENV_DEC_AES256_CBC: case SOAP_MEC_ENV_DEC_AES128_GCM: // GCM requires OpenSSL 1.0.2 or higher case SOAP_MEC_ENV_DEC_AES192_GCM: // GCM requires OpenSSL 1.0.2 or higher case SOAP_MEC_ENV_DEC_AES256_GCM: // GCM requires OpenSSL 1.0.2 or higher case SOAP_MEC_ENV_DEC_AES256_GCM: // GCM requires OpenSSL 1.0.2 or higher // return decryption private key associated with keyname case SOAP_MEC_DEC_DES_CBC: case SOAP_MEC_DEC_AES128_CBC: case SOAP_MEC_DEC_AES192_CBC: case SOAP_MEC_DEC_AES256_CBC: case SOAP_MEC_DEC_AES512_CBC: // reserved for future use case SOAP_MEC_DEC_AES128_GCM: // GCM requires OpenSSL 1.0.2 or higher case SOAP_MEC_DEC_AES192_GCM: // GCM requires OpenSSL 1.0.2 or higher case SOAP_MEC_DEC_AES256_GCM: // GCM requires OpenSSL 1.0.2 or higher case SOAP_MEC_DEC_AES512_GCM: // GCM requires OpenSSL 1.0.2 or higher // *keylen = ... // return decryption shared secret key associated with keyname } return NULL; // fail } @endcode The last two arms are used to return a private key associated with the keyname paramater, which is a string that contains the subject key id from the public key information in an encrypted message or the subject key ID string that was set with `soap_wsse_add_EncryptedKey` at the sender side. To set the default private key for envelope decryption, use: @code EVP_PKEY *rsa_private_key = ...; soap_wsse_decrypt_auto(soap, SOAP_MEC_ENV_DEC_DES_CBC, rsa_private_key, 0); @endcode The envelope decryption options are: - `SOAP_MEC_ENV_DEC_DES_CBC` RSA-1_5 envelope decryption with triple DES CBC - `SOAP_MEC_ENV_DEC_AES256_CBC` RSA-1_5 envelope decryption with AES256 CBC - `SOAP_MEC_ENV_DEC_AES256_GCM` envelope authenticated decryption with AES256 GCM - `SOAP_MEC_ENV_DEC_AES256_CBC | SOAP_MEC_OAEP` OAEP envelope decryption with AES256 CBC where, in the above, AES256 can be replaced with AES128 or AES192. Or to set the default shared secret key for symmetric decryption, use: @code char des_key[20] = ...; // 20-byte (160-bit) triple DES key soap_wsse_decrypt_auto(soap, SOAP_MEC_DEC_DES_CBC, des_key, sizeof(des_key)); @endcode The symmetric decryption options are: - `SOAP_MEC_DEC_DES_CBC` symmetric decryption with triple DES CBC - `SOAP_MEC_DEC_AES256_CBC` symmetric decryption with AES256 CBC - `SOAP_MEC_DEC_AES256_GCM` symmetric authenticated decryption with AES256 GCM where, in the above, AES256 can be replaced with AES128 or AES192. For example, symmetric decryption with AES256: @code char aes256_key[32] = ...; // 32-byte (256-bit) AES256 key soap_wsse_decrypt_auto(soap, SOAP_MEC_DEC_AES256_CBC, aes256_key, sizeof(aes256_key)); @endcode If a default key is not set, the token handler callback should be used as discussed above in this section. Do NOT set a default key if a token handler is used to handle multiple different keys. The default key mechanism is simpler to use when only one decryption key is used to decrypt all encrypted messages. To remove the default key, use: @code soap_wsse_decrypt_auto(soap, SOAP_MEC_NONE, NULL, 0); @endcode @subsection wsse_9_3 Example Combining Signing with Encryption/Decryption Here is an client-side example to use signatures and encryption for the outbound service request message and verification and decryption of the inbound response message: @code FILE *fd; EVP_PKEY *rsa_private_key; X509 *cert; struct soap *soap = soap_new1(SOAP_XML_CANONICAL | SOAP_XML_INDENT); soap_register_plugin(soap, soap_wsse); soap_wsse_verify_auto(soap, SOAP_SMD_NONE, NULL, 0); fd = fopen("privkey.pem", "r"); rsa_private_key = PEM_read_PrivateKey(fd, NULL, NULL, "password"); fclose(fd); soap_wsse_decrypt_auto(soap, SOAP_MEC_ENV_DEC_DES_CBC, rsa_private_key, 0); fd = fopen("cert.pem", "r"); X509 *cert = PEM_read_X509(fd, NULL, NULL, NULL); fclose(fd); if (soap_wsse_add_BinarySecurityTokenX509(soap, "X509Token", cert) || soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(soap, "#X509Token") || soap_wsse_add_EncryptedKey(soap, SOAP_MEC_ENV_ENC_DES_CBC, "Cert", cert, NULL, NULL, NULL) || soap_wsse_sign_body(soap, SOAP_SMD_SIGN_RSA_SHA256, rsa_private_key, 0) ... // an error occurred else if (soap_call_ns__myMethod(soap, ...)) ... // a transmission error occurred ... EVP_PKEY_free(rsa_private_key); X509_free(cert); @endcode The server-side service operation is as follows: @code FILE *fd; EVP_PKEY *rsa_private_key; X509 *cert; struct soap *soap = soap_new1(SOAP_XML_CANONICAL | SOAP_XML_INDENT); soap_register_plugin(soap, soap_wsse); soap_wsse_verify_auto(soap, SOAP_SMD_NONE, NULL, 0); fd = fopen("privkey.pem", "r"); rsa_private_key = PEM_read_PrivateKey(fd, NULL, NULL, "password"); fclose(fd); soap_wsse_decrypt_auto(soap, SOAP_MEC_ENV_DEC_DES_CBC, rsa_private_key, 0); fd = fopen("cert.pem", "r"); X509 *cert = PEM_read_X509(fd, NULL, NULL, NULL); fclose(fd); ... if (soap_serve(soap)) { soap_wsse_delete_Security(soap); soap_print_fault(soap, stderr); } ... EVP_PKEY_free(rsa_private_key); X509_free(cert); @endcode where an example service operation could be: @code int ns__myMethod(struct soap *soap, ...) { ... soap_wsse_delete_Security(soap); if (soap_wsse_add_BinarySecurityTokenX509(soap, "X509Token", cert) || soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(soap, "#X509Token") || soap_wsse_add_EncryptedKey(soap, SOAP_MEC_ENV_ENC_DES_CBC, "Cert", cert, NULL, NULL, NULL) || soap_wsse_sign_body(soap, SOAP_SMD_SIGN_RSA_SHA256, rsa_private_key, 0) { soap_wsse_delete_Security(soap); // remove security headers (failed construction) return soap->error; } return SOAP_OK; } @endcode The service operation signs the message using a private key and encrypts the response message using a public key (from the certificate). @section wsse_10 Security Timestamps The material in this section relates to the WS-Security specification section 10. To add a timestamp with the creation time to the Security header, use: @code soap_wsse_add_Timestamp(soap, NULL, 0); // no expiration @endcode The lifetime of a message (in seconds) is passed as the third argument, which will be displayed as the timestamp expiration time: @code soap_wsse_add_Timestamp(soap, NULL, 10); // 10 seconds lifetime @endcode Timestamps, like other header elements, are not automatically secured with a digital signature. To secure a timestamp, we add an identifier (wsu:Id) to each element we want the WS-Security plugin to sign thereby making it impossible for someone to tamper with that part of the message. To do this for the timestamp, we simply pass a unique identification string as the second argument: @code soap_wsse_add_Timestamp(soap, "Time", 10); // timestamp will be signed @endcode @section wsse_11 WS-Security and HTTPS HTTPS is used at the client side with the usual "https:" URL addressing, shown here with the registration of the wsse plugin and setting up locks for thread-safe use of SSL for HTTPS: @code #include "wsseapi.h" #include "threads.h" struct soap *soap; if (CRYPTO_thread_setup()) ... // error soap = soap_new1(SOAP_XML_CANONICAL | SOAP_XML_INDENT); soap_register_plugin(soap, soap_wsse); if (soap_ssl_client_context(&soap, SOAP_SSL_DEFAULT, // requires server authentication NULL, // keyfile for client authentication to server NULL, // the keyfile password "cacerts.pem", // cafile CA certificates to authenticate the server NULL, // capath CA directory path to certificates NULL )) ... // error soap->cafile = "cacerts.pem"; // same as above (or overrides the above) soap->capath = "dir/to/certs"; // and/or point to CA certs soap->crlfile = "revoked.pem"; // use CRL (optional) ... // set up WS-Security for signatures/encryption etc if (soap_call_ns__myMethod(soap, "https://...", ...)) ... // error ... // process response results soap_destroy(soap); soap_end(soap); soap_free(soap); CRYPTO_thread_cleanup(); @endcode The CRYPTO threads should be set up before any threads are created. The `soap_ssl_client_context` only needs to be set up once. Use the following flags: - `SOAP_SSL_DEFAULT` requires server authentication, CA certs should be used - `SOAP_SSL_NO_AUTHENTICATION` disables server authentication - `SOAP_SSL_SKIP_HOST_CHECK` disables server authentication host check - `SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE` to accept self-signed certificates, expired certificates, and certificates without CRL. The server uses the following: @code #include "wsseapi.h" #include "threads.h" SOAP_SOCKET m, s; int port = 443; struct soap *soap; if (CRYPTO_thread_setup()) ... // error soap = soap_new1(SOAP_XML_CANONICAL | SOAP_XML_INDENT); soap_register_plugin(soap, soap_wsse); if (soap_ssl_server_context(&soap, SOAP_SSL_DEFAULT, // requires server to authenticate, but not the client server.pem, // keyfile for authentication to client "password", // the keyfile password NULL, // CA certificates to authenticate the client NULL, // CA directory path to certificates NULL, // use RSA 2048 bits (or give file name with DH param) NULL, NULL )) ... // error if (!soap_valid_socket(m = soap_bind(soap, NULL, port, 100)) ... // error for (;;) { if (!soap_valid_socket(s = soap_accept(soap))) ... // error THREAD_CREATE(&tid, (void*(*)(void*))&process_request, soap_copy(soap)); } soap_destroy(soap); soap_end(soap); soap_free(soap); CRYPTO_thread_cleanup(); @endcode where we define a process_request function that is executed by the thread to process the request (on a copy of the soap context struct): @code void *process_request(struct soap *soap) { ... // set up WS-Security for signatures/encryption etc if (soap_ssl_accept(soap) || soap_serve(soap)) ... // error soap_destroy(soap); soap_end(soap); soap_free(soap); } @endcode The `soap_ssl_server_context` only needs to be set up once. Use the following flags: - `SOAP_SSL_DEFAULT` requires server authentication, but no client authentication - `SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION` requires client authentication We need to define the thread set up and clean up operations as follows: @code struct CRYPTO_dynlock_value { MUTEX_TYPE mutex; }; static MUTEX_TYPE *mutex_buf; static struct CRYPTO_dynlock_value *dyn_create_function(const char *file, int line) { struct CRYPTO_dynlock_value *value; value = (struct CRYPTO_dynlock_value*)malloc(sizeof(struct CRYPTO_dynlock_value)); if (value) MUTEX_SETUP(value->mutex); return value; } static void dyn_lock_function(int mode, struct CRYPTO_dynlock_value *l, const char *file, int line) { if (mode & CRYPTO_LOCK) MUTEX_LOCK(l->mutex); else MUTEX_UNLOCK(l->mutex); } static void dyn_destroy_function(struct CRYPTO_dynlock_value *l, const char *file, int line) { MUTEX_CLEANUP(l->mutex); free(l); } void locking_function(int mode, int n, const char *file, int line) { if (mode & CRYPTO_LOCK) MUTEX_LOCK(mutex_buf[n]); else MUTEX_UNLOCK(mutex_buf[n]); } unsigned long id_function() { return (unsigned long)THREAD_ID; } int CRYPTO_thread_setup() { int i; mutex_buf = (MUTEX_TYPE*)malloc(CRYPTO_num_locks() * sizeof(pthread_mutex_t)); if (!mutex_buf) return SOAP_EOM; for (i = 0; i < CRYPTO_num_locks(); i++) MUTEX_SETUP(mutex_buf[i]); CRYPTO_set_id_callback(id_function); CRYPTO_set_locking_callback(locking_function); CRYPTO_set_dynlock_create_callback(dyn_create_function); CRYPTO_set_dynlock_lock_callback(dyn_lock_function); CRYPTO_set_dynlock_destroy_callback(dyn_destroy_function); return SOAP_OK; } void CRYPTO_thread_cleanup() { int i; if (!mutex_buf) return; CRYPTO_set_id_callback(NULL); CRYPTO_set_locking_callback(NULL); CRYPTO_set_dynlock_create_callback(NULL); CRYPTO_set_dynlock_lock_callback(NULL); CRYPTO_set_dynlock_destroy_callback(NULL); for (i = 0; i < CRYPTO_num_locks(); i++) MUTEX_CLEANUP(mutex_buf[i]); free(mutex_buf); mutex_buf = NULL; } @endcode For additional details and examples, see the user guide and examples in the gSOAP package directory gsoap/samples/ssl. @section wsse_12 Miscellaneous The Security header block was generated from the WS-Security schema with the wsdl2h tool and WS/WS-typemap.dat: wsdl2h -cegxy -o wsse.h -t WS/WS-typemap.dat WS/wsse.xsd The same process was used to generate the header file ds.h from the XML digital signatures core schema, and the xenc.h encryption schema: wsdl2h -cuxy -o ds.h -t WS/WS-typemap.dat WS/ds.xsd wsdl2h -cuxy -o xenc.h -t WS/WS-typemap.dat WS/xenc.xsd The import/wsse.h file has the following definition for the Security header block: @code typedef struct _wsse__Security { struct _wsu__Timestamp* wsu__Timestamp; struct _wsse__UsernameToken* UsernameToken; struct _wsse__BinarySecurityToken* BinarySecurityToken; struct xenc__EncryptedKeyType* xenc__EncryptedKey; struct _xenc__ReferenceList* xenc__ReferenceList; struct ds__SignatureType* ds__Signature; @char* SOAP_ENV__actor; @char* SOAP_ENV__role; } _wsse__Security; @endcode The `_wsse__Security` header is modified by a WS/WS-typemap.dat mapping rule to include additional details. @section wsse_13 Encryption Limitations - Individual encryption/decryption of simple content (CDATA content) with `soap_wsse_add_EncryptedKey_encrypt_only` IS NOT SUPPORTED. Encrypt the entire SOAP Body or encrypt elements with complex content (complexType and complexContent elements that have sub elements). - Encryption is performed after signing (likewise, signatures are verified after decryption). Signing after encryption is not supported in the current plugin release. - Signing and encrypting XML containing QName content may lead to verification issues, because the W3C C14N canonicalization protocol has known limitations with QName content normalization as prefixes in QNames may be ignored, possibly resulting in missing xmlns bindings). Use `soap_wsse_set_InclusiveNamespaces(soap, "prefixlist")` to define which namespace prefixes (space-separated in the string) should be considered inclusive. All prefixes used in QName content should be listed. The WSSE engine recognizes xsi:type, SOAP-ENC:arrayType, SOAP-ENC:itemType attribute QNames. Therefore, soapcpp2 option `-t` is always safe to use, but a non-gSOAP receiver may still fail. @section wsse_wsc WS-SecureConversation To use a WS-SecureConversation security context token (SCT) with WS-Security: @code const char *identifier = "..."; soap_wsse_add_SecurityContextToken(soap, "SCT", identifier); @endcode In this example a context has been established and the secret that is identified by the 'identifier' string is known to both parties. This secret is used to sign the message body. The "SCT" is a wsu:Id, which is used as a reference to sign the token. */ #include "wsseapi.h" #include "threads.h" /* need threads to enable mutex for MT */ #if defined(SOAP_WSA_2003) || defined(SOAP_WSA_2004) || defined(SOAP_WSA_200408) || defined(SOAP_WSA_2005) #include "wsaapi.h" #endif #ifdef __cplusplus extern "C" { #endif /** Plugin identification for plugin registry */ const char soap_wsse_id[14] = SOAP_WSSE_ID; /** Maximum number of SignedInfo References */ #define SOAP_WSSE_MAX_REF (100) /** Clock skew between machines (in sec) to fit message expiration in window */ #define SOAP_WSSE_CLKSKEW (300) /** Size of the random nonce */ #define SOAP_WSSE_NONCELEN (20) /** Digest authentication accepts messages that are not older than creation time + SOAP_WSSE_NONCETIME */ #define SOAP_WSSE_NONCETIME (SOAP_WSSE_CLKSKEW + 240) /******************************************************************************\ * * Common URIs * \******************************************************************************/ const char *wsse_PasswordTextURI = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText"; const char *wsse_PasswordDigestURI = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest"; const char *wsse_Base64BinaryURI = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary"; const char *wsse_X509v3URI = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3"; const char *wsse_X509v3SubjectKeyIdentifierURI = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509SubjectKeyIdentifier"; const char *ds_sha1URI = "http://www.w3.org/2000/09/xmldsig#sha1"; const char *ds_sha224URI = "http://www.w3.org/2001/04/xmldsig-more#sha224"; const char *ds_sha256URI = "http://www.w3.org/2001/04/xmlenc#sha256"; const char *ds_sha384URI = "http://www.w3.org/2001/04/xmldsig-more#sha384"; const char *ds_sha512URI = "http://www.w3.org/2001/04/xmlenc#sha512"; const char *ds_hmac_sha1URI = "http://www.w3.org/2000/09/xmldsig#hmac-sha1"; const char *ds_hmac_sha224URI = "http://www.w3.org/2001/04/xmldsig-more#hmac-sha224"; const char *ds_hmac_sha256URI = "http://www.w3.org/2001/04/xmldsig-more#hmac-sha256"; const char *ds_hmac_sha384URI = "http://www.w3.org/2001/04/xmldsig-more#hmac-sha384"; const char *ds_hmac_sha512URI = "http://www.w3.org/2001/04/xmldsig-more#hmac-sha512"; const char *ds_dsa_sha1URI = "http://www.w3.org/2000/09/xmldsig#dsa-sha1"; const char *ds_dsa_sha256URI = "http://www.w3.org/2009/xmldsig11#dsa-sha256"; const char *ds_rsa_sha1URI = "http://www.w3.org/2000/09/xmldsig#rsa-sha1"; const char *ds_rsa_sha224URI = "http://www.w3.org/2001/04/xmldsig-more#rsa-sha224"; const char *ds_rsa_sha256URI = "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"; const char *ds_rsa_sha384URI = "http://www.w3.org/2001/04/xmldsig-more#rsa-sha384"; const char *ds_rsa_sha512URI = "http://www.w3.org/2001/04/xmldsig-more#rsa-sha512"; const char *ds_ecdsa_sha1URI = "http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha1"; const char *ds_ecdsa_sha224URI = "http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha224"; const char *ds_ecdsa_sha256URI = "http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha256"; const char *ds_ecdsa_sha384URI = "http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha384"; const char *ds_ecdsa_sha512URI = "http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha512"; const char *xenc_3desURI = "http://www.w3.org/2001/04/xmlenc#tripledes-cbc"; const char *xenc_aes128cbcURI = "http://www.w3.org/2001/04/xmlenc#aes128-cbc"; const char *xenc_aes192cbcURI = "http://www.w3.org/2001/04/xmlenc#aes192-cbc"; const char *xenc_aes256cbcURI = "http://www.w3.org/2001/04/xmlenc#aes256-cbc"; const char *xenc_aes512cbcURI = "http://www.w3.org/2001/04/xmlenc#aes512-cbc"; const char *xenc_aes128gcmURI = "http://www.w3.org/2009/xmlenc11#aes128-gcm"; const char *xenc_aes192gcmURI = "http://www.w3.org/2009/xmlenc11#aes192-gcm"; const char *xenc_aes256gcmURI = "http://www.w3.org/2009/xmlenc11#aes256-gcm"; const char *xenc_aes512gcmURI = "http://www.w3.org/2009/xmlenc11#aes512-gcm"; const char *xenc_elementURI = "http://www.w3.org/2001/04/xmlenc#Element"; const char *xenc_contentURI = "http://www.w3.org/2001/04/xmlenc#Content"; const char *xenc_rsa15URI = "http://www.w3.org/2001/04/xmlenc#rsa-1_5"; const char *xenc_rsaesURI = "http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p"; const char *ds_URI = "http://www.w3.org/2000/09/xmldsig#"; const char *c14n_URI = "http://www.w3.org/2001/10/xml-exc-c14n#"; const char *wsu_URI = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"; /******************************************************************************\ * * Digest authentication session * \******************************************************************************/ /** @struct soap_wsse_session @brief Digest authentication session data */ struct soap_wsse_session { struct soap_wsse_session *next; /**< Next session in list */ time_t expired; /**< Session expiration */ char hash[SOAP_SMD_SHA1_SIZE]; /**< SHA1 digest */ char nonce[1]; /**< Nonce string flows into region below this struct */ }; /** The digest authentication session database */ static struct soap_wsse_session *soap_wsse_session = NULL; /** Lock for digest authentication session database exclusive access */ static MUTEX_TYPE soap_wsse_session_lock = MUTEX_INITIALIZER; static char* soap_wsse_ids(struct soap *soap, const char *tags); static int soap_wsse_session_verify(struct soap *soap, const char hash[SOAP_SMD_SHA1_SIZE], const char *created, const char *nonce); static void soap_wsse_session_cleanup(struct soap *soap); static void calc_digest(struct soap *soap, const char *created, const char *nonce, int noncelen, const char *password, char hash[SOAP_SMD_SHA1_SIZE]); static void calc_nonce(char nonce[SOAP_WSSE_NONCELEN]); static int soap_wsse_init(struct soap *soap, struct soap_wsse_data *data, const void *(*arg)(struct soap*, int*, const char*, int*)); static int soap_wsse_copy(struct soap *soap, struct soap_plugin *dst, struct soap_plugin *src); static void soap_wsse_delete(struct soap *soap, struct soap_plugin *p); static int soap_wsse_preparesend(struct soap *soap, const char *buf, size_t len); static int soap_wsse_preparefinalsend(struct soap *soap); static void soap_wsse_preparecleanup(struct soap *soap, struct soap_wsse_data *data); static int soap_wsse_preparefinalrecv(struct soap *soap); static int soap_wsse_header(struct soap *soap); static int soap_wsse_element_begin_in(struct soap *soap, const char *tag); static int soap_wsse_element_end_in(struct soap *soap, const char *tag1, const char *tag2); static int soap_wsse_element_begin_out(struct soap *soap, const char *tag); static int soap_wsse_element_end_out(struct soap *soap, const char *tag); static size_t soap_wsse_verify_nested(struct soap *soap, struct soap_dom_element *dom, const char *URI, const char *tag); /******************************************************************************\ * * wsse:Security header element * \******************************************************************************/ /** @fn _wsse__Security* soap_wsse_add_Security(struct soap *soap) @brief Adds Security header element. @param soap context @return _wsse__Security object */ struct _wsse__Security* soap_wsse_add_Security(struct soap *soap) { DBGFUN("soap_wsse_add_Security"); /* if we don't have a SOAP Header, create one */ soap_header(soap); /* if we don't have a wsse:Security element in the SOAP Header, create one */ if (!soap->header->wsse__Security) { soap->header->wsse__Security = (_wsse__Security*)soap_malloc(soap, sizeof(_wsse__Security)); if (!soap->header->wsse__Security) return NULL; soap_default__wsse__Security(soap, soap->header->wsse__Security); } return soap->header->wsse__Security; } /** @fn _wsse__Security* soap_wsse_add_Security_actor(struct soap *soap, const char *actor) @brief Adds Security header element with actor or role attribute. @param soap context @param actor string @return _wsse__Security object */ struct _wsse__Security* soap_wsse_add_Security_actor(struct soap *soap, const char *actor) { _wsse__Security *security = soap_wsse_add_Security(soap); DBGFUN1("soap_wsse_add_Security_actor", "actor=%s", actor); if (soap->namespaces && !strcmp(soap->namespaces[0].ns, "http://schemas.xmlsoap.org/soap/envelope/")) security->SOAP_ENV__actor = soap_strdup(soap, actor); else security->SOAP_ENV__role = soap_strdup(soap, actor); return security; } /** @fn void soap_wsse_delete_Security(struct soap *soap) @brief Deletes Security header element. @param soap context */ void soap_wsse_delete_Security(struct soap *soap) { DBGFUN("soap_wsse_delete_Security"); if (soap->header) soap->header->wsse__Security = NULL; } /** @fn _wsse__Security* soap_wsse_Security(struct soap *soap) @brief Returns Security header element if present. @param soap context @return _wsse__Security object or NULL */ struct _wsse__Security* soap_wsse_Security(struct soap *soap) { if (soap->header) return soap->header->wsse__Security; return NULL; } /******************************************************************************\ * * wsse:Security/ds:Signature header element * \******************************************************************************/ /** @fn ds__SignatureType* soap_wsse_add_Signature(struct soap *soap) @brief Adds Signature header element. @param soap context @return ds__SignatureType object */ struct ds__SignatureType* soap_wsse_add_Signature(struct soap *soap) { _wsse__Security *security = soap_wsse_add_Security(soap); DBGFUN("soap_wsse_add_Signature"); /* if we don't have a ds:Signature, create one */ if (!security->ds__Signature) { security->ds__Signature = (ds__SignatureType*)soap_malloc(soap, sizeof(ds__SignatureType)); if (!security->ds__Signature) return NULL; soap_default_ds__SignatureType(soap, security->ds__Signature); } return security->ds__Signature; } /** @fn void soap_wsse_delete_Signature(struct soap *soap) @brief Deletes Signature header element. @param soap context */ void soap_wsse_delete_Signature(struct soap *soap) { _wsse__Security *security = soap_wsse_Security(soap); DBGFUN("soap_wsse_delete_Signature"); if (security) security->ds__Signature = NULL; } /** @fn ds__SignatureType* soap_wsse_Signature(struct soap *soap) @brief Returns Signature header element if present. @param soap context @return ds__SignatureType object or NULL */ struct ds__SignatureType* soap_wsse_Signature(struct soap *soap) { _wsse__Security *security = soap_wsse_Security(soap); if (security) return security->ds__Signature; return NULL; } /******************************************************************************\ * * wsse:Security/wsu:Timestamp header element * \******************************************************************************/ /** @fn int soap_wsse_add_Timestamp(struct soap *soap, const char *id, time_t lifetime) @brief Adds Timestamp element with optional expiration date+time (lifetime). @param[in] soap context @param[in] id for signature referencing or NULL @param[in] lifetime expressed in time_t units, or 0 for no expiration @return SOAP_OK */ int soap_wsse_add_Timestamp(struct soap *soap, const char *id, time_t lifetime) { _wsse__Security *security = soap_wsse_add_Security(soap); time_t now = time(NULL); char *created = soap_strdup(soap, soap_dateTime2s(soap, now)); char *expired = lifetime ? soap_strdup(soap, soap_dateTime2s(soap, now + lifetime)) : NULL; DBGFUN1("soap_wsse_add_Timestamp", "id=%s", id?id:""); /* allocate a Timestamp if we don't have one already */ if (!security->wsu__Timestamp) { security->wsu__Timestamp = (_wsu__Timestamp*)soap_malloc(soap, sizeof(_wsu__Timestamp)); if (!security->wsu__Timestamp) return soap->error = SOAP_EOM; } soap_default__wsu__Timestamp(soap, security->wsu__Timestamp); /* populate the wsu:Timestamp element */ security->wsu__Timestamp->wsu__Id = soap_strdup(soap, id); security->wsu__Timestamp->Created = created; security->wsu__Timestamp->Expires = expired; return SOAP_OK; } /** @fn _wsu__Timestamp *soap_wsse_Timestamp(struct soap *soap) @brief Returns Timestamp element if present. @param soap context @return _wsu__Timestamp object or NULL */ struct _wsu__Timestamp* soap_wsse_Timestamp(struct soap *soap) { _wsse__Security *security = soap_wsse_Security(soap); if (security) return security->wsu__Timestamp; return NULL; } /** @fn int soap_wsse_verify_Timestamp(struct soap *soap) @brief Verifies the Timestamp/Expires element against the current time. @param soap context @return SOAP_OK or SOAP_FAULT with wsu:MessageExpired fault Sets wsu:MessageExpired fault if wsu:Timestamp is expired. The SOAP_WSSE_CLKSKEW value is used as a margin to mitigate clock skew. Keeps silent when no timestamp is supplied or no expiration date is included in the wsu:Timestamp element. */ int soap_wsse_verify_Timestamp(struct soap *soap) { _wsu__Timestamp *timestamp = soap_wsse_Timestamp(soap); DBGFUN("soap_wsse_verify_Timestamp"); /* if we have a timestamp with an expiration date, check it */ if (timestamp && timestamp->Expires) { time_t now = time(NULL), expired; soap_s2dateTime(soap, timestamp->Expires, &expired); if (expired + SOAP_WSSE_CLKSKEW <= now) { const char *code = soap_wsu__tTimestampFault2s(soap, wsu__MessageExpired); return soap_wsse_sender_fault_subcode(soap, code, "Message has expired", timestamp->Expires); } } return SOAP_OK; } /******************************************************************************\ * * wsse:Security/UsernameToken header element * \******************************************************************************/ /** @fn int soap_wsse_add_UsernameTokenText(struct soap *soap, const char *id, const char *username, const char *password) @brief Adds UsernameToken element with optional clear-text password. @param soap context @param[in] id string for signature referencing or NULL @param[in] username string @param[in] password string or NULL to omit the password @return SOAP_OK Passwords are sent in the clear, so transport-level encryption is required. @note This release supports the use of at most one UsernameToken in the header. */ int soap_wsse_add_UsernameTokenText(struct soap *soap, const char *id, const char *username, const char *password) { _wsse__Security *security = soap_wsse_add_Security(soap); DBGFUN2("soap_wsse_add_UsernameTokenText", "id=%s", id?id:"", "username=%s", username?username:""); /* allocate a UsernameToken if we don't have one already */ if (!security->UsernameToken) { if (!(security->UsernameToken = (_wsse__UsernameToken*)soap_malloc(soap, sizeof(_wsse__UsernameToken)))) return soap->error = SOAP_EOM; } soap_default__wsse__UsernameToken(soap, security->UsernameToken); /* populate the UsernameToken */ security->UsernameToken->wsu__Id = soap_strdup(soap, id); security->UsernameToken->Username = soap_strdup(soap, username); /* allocate and populate the Password */ if (password) { if (!(security->UsernameToken->Password = (_wsse__Password*)soap_malloc(soap, sizeof(_wsse__Password)))) return soap->error = SOAP_EOM; soap_default__wsse__Password(soap, security->UsernameToken->Password); security->UsernameToken->Password->Type = (char*)wsse_PasswordTextURI; security->UsernameToken->Password->__item = soap_strdup(soap, password); } return SOAP_OK; } /** @fn int soap_wsse_add_UsernameTokenDigest(struct soap *soap, const char *id, const char *username, const char *password) @brief Adds UsernameToken element for digest authentication. @param soap context @param[in] id string for signature referencing or NULL @param[in] username string @param[in] password string @return SOAP_OK Computes SHA1 digest of the time stamp, a nonce, and the password. The digest provides the authentication credentials. Passwords are NOT sent in the clear. @note This release supports the use of at most one UsernameToken in the header. */ int soap_wsse_add_UsernameTokenDigest(struct soap *soap, const char *id, const char *username, const char *password) { _wsse__Security *security = soap_wsse_add_Security(soap); time_t now = time(NULL); const char *created = soap_dateTime2s(soap, now); char HA[SOAP_SMD_SHA1_SIZE], HABase64[29]; char nonce[SOAP_WSSE_NONCELEN], *nonceBase64; DBGFUN2("soap_wsse_add_UsernameTokenDigest", "id=%s", id?id:"", "username=%s", username?username:""); /* generate a nonce */ calc_nonce(nonce); nonceBase64 = soap_s2base64(soap, (unsigned char*)nonce, NULL, SOAP_WSSE_NONCELEN); /* The specs are not clear: compute digest over binary nonce or base64 nonce? */ /* compute SHA1(created, nonce, password) */ calc_digest(soap, created, nonce, SOAP_WSSE_NONCELEN, password, HA); /* Hm...? calc_digest(soap, created, nonceBase64, strlen(nonceBase64), password, HA); */ soap_s2base64(soap, (unsigned char*)HA, HABase64, SOAP_SMD_SHA1_SIZE); /* populate the UsernameToken with digest */ soap_wsse_add_UsernameTokenText(soap, id, username, HABase64); /* populate the remainder of the password, nonce, and created */ security->UsernameToken->Password->Type = (char*)wsse_PasswordDigestURI; security->UsernameToken->Nonce = nonceBase64; security->UsernameToken->wsu__Created = soap_strdup(soap, created); return SOAP_OK; } /** @fn _wsse__UsernameToken* soap_wsse_UsernameToken(struct soap *soap, const char *id) @brief Returns UsernameToken element if present. @param soap context @param[in] id string of UsernameToken or NULL @return _wsse__UsernameToken object or NULL @note This release supports the use of at most one UsernameToken in the header. */ struct _wsse__UsernameToken* soap_wsse_UsernameToken(struct soap *soap, const char *id) { _wsse__Security *security = soap_wsse_Security(soap); if (security && security->UsernameToken && (!id || (security->UsernameToken->wsu__Id && !strcmp(security->UsernameToken->wsu__Id, id)))) return security->UsernameToken; return NULL; } /** @fn const char* soap_wsse_get_Username(struct soap *soap) @brief Returns UsernameToken/username string or wsse:FailedAuthentication fault. @param soap context @return UsernameToken/username string or NULL with wsse:FailedAuthentication fault error set @see soap_wsse_verify_Password The returned username should be used to lookup the user's password in a dictionary or database for server-side authentication with soap_wsse_verify_Password. */ const char* soap_wsse_get_Username(struct soap *soap) { _wsse__UsernameToken *token = soap_wsse_UsernameToken(soap, NULL); DBGFUN("soap_wsse_get_Username"); if (token) return token->Username; soap_wsse_fault(soap, wsse__FailedAuthentication, "Username authentication required"); return NULL; } /** @fn int soap_wsse_verify_Password(struct soap *soap, const char *password) @brief Verifies the supplied password or sets wsse:FailedAuthentication fault. @param soap context @param[in] password string to verify against @return SOAP_OK (authorized) or SOAP_FAULT with wsse:FailedAuthentication fault The verification supports both clear-text password verification and digest password authentication. For digest authentication a history mechanism with a digest authentication session database ensures protection against replay attacks. @note This release supports the use of at most one UsernameToken in the header. */ int soap_wsse_verify_Password(struct soap *soap, const char *password) { _wsse__UsernameToken *token = soap_wsse_UsernameToken(soap, NULL); DBGFUN("soap_wsse_verify_Password"); /* if we have a UsernameToken with a Password, check it */ if (token && token->Password) { /* password digest or text? */ if (token->Password->Type && !strcmp(token->Password->Type, wsse_PasswordDigestURI)) { /* check password digest: compute SHA1(created, nonce, password) */ if (token->Nonce && token->wsu__Created && strlen(token->Password->__item) == 28) /* digest pw len = 28 */ { char HA1[SOAP_SMD_SHA1_SIZE], HA2[SOAP_SMD_SHA1_SIZE]; /* The specs are not clear: compute digest over binary nonce or base64 nonce? The formet appears to be the case: */ int noncelen; const char *nonce = soap_base642s(soap, token->Nonce, NULL, 0, &noncelen); /* compute HA1 = SHA1(created, nonce, password) */ calc_digest(soap, token->wsu__Created, nonce, noncelen, password, HA1); /* calc_digest(soap, token->wsu__Created, token->Nonce, strlen(token->Nonce), password, HA1); */ /* get HA2 = supplied digest from base64 Password */ soap_base642s(soap, token->Password->__item, HA2, SOAP_SMD_SHA1_SIZE, NULL); /* compare HA1 to HA2 */ if (!memcmp(HA1, HA2, SOAP_SMD_SHA1_SIZE)) { /* authorize if HA1 and HA2 identical and not replay attack */ if (!soap_wsse_session_verify(soap, HA1, token->wsu__Created, token->Nonce)) return SOAP_OK; return soap->error; } } } else { /* check password text */ if (!strcmp(token->Password->__item, password)) return SOAP_OK; } } return soap_wsse_fault(soap, wsse__FailedAuthentication, NULL); } /******************************************************************************\ * * wsse:Security/BinarySecurityToken header element * \******************************************************************************/ /** @fn int soap_wsse_add_BinarySecurityToken(struct soap *soap, const char *id, const char *valueType, const unsigned char *data, int size) @brief Adds BinarySecurityToken element. @param soap context @param[in] id string for signature referencing or NULL @param[in] valueType string @param[in] data points to binary token data @param[in] size is length of binary token @return SOAP_OK */ int soap_wsse_add_BinarySecurityToken(struct soap *soap, const char *id, const char *valueType, const unsigned char *data, int size) { _wsse__Security *security = soap_wsse_add_Security(soap); DBGFUN2("wsse_add_BinarySecurityToken", "id=%s", id?id:"", "valueType=%s", valueType?valueType:""); /* allocate BinarySecurityToken if we don't already have one */ if (!security->BinarySecurityToken) { if (!(security->BinarySecurityToken = (_wsse__BinarySecurityToken*)soap_malloc(soap, sizeof(_wsse__BinarySecurityToken)))) return soap->error = SOAP_EOM; } soap_default__wsse__BinarySecurityToken(soap, security->BinarySecurityToken); /* populate the BinarySecurityToken */ security->BinarySecurityToken->wsu__Id = soap_strdup(soap, id); security->BinarySecurityToken->ValueType = soap_strdup(soap, valueType); security->BinarySecurityToken->EncodingType = (char*)wsse_Base64BinaryURI; security->BinarySecurityToken->__item = soap_s2base64(soap, data, NULL, size); return SOAP_OK; } /** @fn int soap_wsse_add_BinarySecurityTokenX509(struct soap *soap, const char *id, X509 *cert) @brief Adds BinarySecurityToken element with X509 certificate. @param soap context @param[in] id string for signature reference @param[in] cert points to the X509 certificate @return SOAP_OK or SOAP_EOM This function uses i2d_X509 from the the OpenSSL library to convert an X509 object to binary DER format. */ int soap_wsse_add_BinarySecurityTokenX509(struct soap *soap, const char *id, X509 *cert) { int derlen; unsigned char *der, *s; if (!cert) return soap_wsse_fault(soap, wsse__InvalidSecurityToken, "Missing certificate"); /* determine the storage requirement */ derlen = i2d_X509(cert, NULL); if (derlen < 0) return soap_wsse_fault(soap, wsse__InvalidSecurityToken, "Invalid certificate"); /* use the gSOAP engine's look-aside buffer to temporarily hold the cert */ if (soap_store_lab(soap, NULL, derlen)) return SOAP_EOM; s = der = (unsigned char*)soap->labbuf; /* store in DER format */ i2d_X509(cert, &s); /* populate the BinarySecurityToken with base64 certificate data */ return soap_wsse_add_BinarySecurityToken(soap, id, wsse_X509v3URI, der, derlen); } /** @fn int soap_wsse_add_BinarySecurityTokenPEM(struct soap *soap, const char *id, const char *filename) @brief Adds BinarySecurityToken element from a PEM file. @param soap context @param[in] id string for signature reference @param[in] filename @return SOAP_OK or SOAP_FAULT with wsse__InvalidSecurity fault when file cannot be read or does not contain a valid certificate This function uses PEM_read_X509 from the the OpenSSL library to read a certificate from a PEM formatted file. */ int soap_wsse_add_BinarySecurityTokenPEM(struct soap *soap, const char *id, const char *filename) { FILE *fd; DBGFUN2("soap_wsse_add_BinarySecurityTokenPEM", "id=%s", id?id:"", "filename=%s", filename?filename:""); if ((fd = fopen(filename, "r"))) { /* read the certificate */ X509 *cert = PEM_read_X509(fd, NULL, NULL, NULL); fclose(fd); /* if okay, populate the BinarySecurityToken element */ if (cert) { int err = soap_wsse_add_BinarySecurityTokenX509(soap, id, cert); X509_free(cert); return err; } } return soap_wsse_fault(soap, wsse__InvalidSecurityToken, "Missing certificate"); } /** @fn _wsse__BinarySecurityToken* soap_wsse_BinarySecurityToken(struct soap *soap, const char *id) @brief Returns BinarySecurityToken element if present. @param soap context @param[in] id string of token to get or NULL @return _wsse__BinarySecurityToken object or NULL */ struct _wsse__BinarySecurityToken* soap_wsse_BinarySecurityToken(struct soap *soap, const char *id) { _wsse__Security *security = soap_wsse_Security(soap); if (security && security->BinarySecurityToken && (!id || (security->BinarySecurityToken->wsu__Id && !strcmp(security->BinarySecurityToken->wsu__Id, id)))) return security->BinarySecurityToken; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "No BinarySecurityToken id=%s, pointer=%p to token found\n", id, security->BinarySecurityToken)); return NULL; } /** @fn int soap_wsse_get_BinarySecurityToken(struct soap *soap, const char *id, char **valueType, unsigned char **data, int *size) @brief Get wsse:BinarySecurityToken element token data in binary form. @param soap context @param[in] id string of token to get or NULL @param[out] valueType string @param[out] data points to binary token data @param[out] size is length of binary token @return SOAP_OK or SOAP_FAULT with wsse:SecurityTokenUnavailable fault */ int soap_wsse_get_BinarySecurityToken(struct soap *soap, const char *id, char **valueType, unsigned char **data, int *size) { _wsse__BinarySecurityToken *token = soap_wsse_BinarySecurityToken(soap, id); DBGFUN1("soap_wsse_get_BinarySecurityToken", "id=%s", id?id:""); if (token) { *valueType = token->ValueType; /* it appears we don't need HexBinary after all if (token->EncodingType && !strcmp(token->EncodingType, wsse_HexBinaryURI)) *data = (unsigned char*)soap_hex2s(soap, token->__item, NULL, 0, size); else */ /* assume token is represented in base64 by default */ *data = (unsigned char*)soap_base642s(soap, token->__item, NULL, 0, size); if (*data) return SOAP_OK; } return soap_wsse_fault(soap, wsse__SecurityTokenUnavailable, "BinarySecurityToken required"); } /** @fn X509* soap_wsse_get_BinarySecurityTokenX509(struct soap *soap, const char *id) @brief Get X509 wsse:BinarySecurityToken certificate and verify its content. This call must be followed by an X509_free to deallocate the X509 certificate data. @param soap context @param[in] id string of token to get or NULL @return X509 certificate (dynamically allocated) or NULL with wsse:SecurityTokenUnavailable fault */ X509* soap_wsse_get_BinarySecurityTokenX509(struct soap *soap, const char *id) { X509 *cert = NULL; char *valueType = NULL; #if (OPENSSL_VERSION_NUMBER >= 0x0090800fL) const unsigned char *data; #else unsigned char *data; #endif int size; DBGFUN1("soap_wsse_get_BinarySecurityTokenX509", "id=%s", id?id:""); if (!soap_wsse_get_BinarySecurityToken(soap, id, &valueType, (unsigned char**)&data, &size) && valueType && !strcmp(valueType, wsse_X509v3URI)) cert = d2i_X509(NULL, &data, size); /* verify the certificate */ if (cert && soap_wsse_verify_X509(soap, cert)) { X509_free(cert); cert = NULL; } return cert; } /** @fn int soap_wsse_verify_X509(struct soap *soap, X509 *cert) @brief Verifies X509 certificate against soap->cafile, soap->capath, and soap->crlfile @param soap context @param[in] cert X509 certificate @return SOAP_OK or fault This is an expensive operation. Whenever a new soap context is created, the cafile and objects are loaded into that context each time we need to verify a certificate. */ int soap_wsse_verify_X509(struct soap *soap, X509 *cert) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); X509_STORE_CTX *verify; DBGFUN("soap_wsse_verify_X509"); if (!data) return soap_set_receiver_error(soap, "soap_wsse_sign", "Plugin not registered", SOAP_PLUGIN_ERROR); if (!cert) return soap_wsse_sender_fault(soap, "soap_wsse_verify_X509", "No certificate"); if (!data->store) { if (!(data->store = X509_STORE_new())) return soap_wsse_receiver_fault(soap, "soap_wsse_verify_X509", "Could not create X509_STORE object"); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Setting up a new X509 store\n")); X509_STORE_set_verify_cb_func(data->store, soap->fsslverify); if (soap->cafile || soap->capath) { if (X509_STORE_load_locations(data->store, soap->cafile, soap->capath) != 1) return soap_wsse_receiver_fault(soap, "soap_wsse_verify_X509", "Could not load CA file or path"); } #if (OPENSSL_VERSION_NUMBER > 0x00907000L) if (soap->crlfile) { if (*soap->crlfile) { X509_LOOKUP *lookup; if (!(lookup = X509_STORE_add_lookup(data->store, X509_LOOKUP_file()))) return soap_wsse_receiver_fault(soap, "soap_wsse_verify_X509", "Could not create X509_LOOKUP object"); if (X509_load_crl_file(lookup, soap->crlfile, X509_FILETYPE_PEM) != 1) return soap_wsse_receiver_fault(soap, "soap_wsse_verify_X509", "Could not read the CRL file"); } X509_STORE_set_flags(data->store, X509_V_FLAG_CRL_CHECK | X509_V_FLAG_CRL_CHECK_ALL); } #endif } if (!(verify = X509_STORE_CTX_new())) return soap_wsse_receiver_fault(soap, "soap_wsse_verify_X509", "Could not create X509_STORE_CTX object"); #if (OPENSSL_VERSION_NUMBER > 0x00907000L) if (X509_STORE_CTX_init(verify, data->store, cert, NULL) != 1) { X509_STORE_CTX_free(verify); return soap_wsse_receiver_fault(soap, "soap_wsse_verify_X509", "Could not initialize X509_STORE_CTX object"); } #else X509_STORE_CTX_init(verify, data->store, cert, NULL); #endif if (X509_verify_cert(verify) != 1) { X509_STORE_CTX_free(verify); return soap_wsse_sender_fault(soap, "soap_wsse_verify_X509", "Invalid certificate"); } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Certificate is valid\n")); #ifdef SOAP_DEBUG { char buf[1024]; X509_NAME_oneline(X509_get_issuer_name(cert), buf, sizeof(buf)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "certificate issuer %s\n", buf)); X509_NAME_oneline(X509_get_subject_name(cert), buf, sizeof(buf)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "certificate subject %s\n", buf)); } #endif X509_STORE_CTX_free(verify); return SOAP_OK; } /******************************************************************************\ * * wsc:SecurityContextToken * \******************************************************************************/ /** @fn int soap_wsse_add_SecurityContextToken(struct soap *soap, const char *id, const char *identifier) @brief Adds wsc:SecurityContextToken/Identifier and SecurityTokenReference to it @param soap context @param[in] id string for signature reference (required) @param[in] identifier wsc:Identifier value (required) @return SOAP_OK or error code */ int soap_wsse_add_SecurityContextToken(struct soap *soap, const char *id, const char *identifier) { char *URI; size_t l; _wsse__Security *security = soap_wsse_add_Security(soap); DBGFUN2("soap_wsse_add_SecurityContextToken", "id=%s", id, "identifier=%s", identifier?identifier:""); /* allocate wsc:SecurityContextToken if we don't already have one */ if (!security->wsc__SecurityContextToken) { if (!(security->wsc__SecurityContextToken = (struct wsc__SecurityContextTokenType*)soap_malloc(soap, sizeof(struct wsc__SecurityContextTokenType)))) return soap->error = SOAP_EOM; } soap_default_wsc__SecurityContextTokenType(soap, security->wsc__SecurityContextToken); /* populate the wsc:SecurityContextToken */ l = strlen(id); if (!(URI = (char*)soap_malloc(soap, l + 2))) return soap->error = SOAP_EOM; *URI = '#'; soap_strcpy(URI + 1, l + 1, id); security->wsc__SecurityContextToken->wsu__Id = URI + 1; security->wsc__SecurityContextToken->Identifier = soap_strdup(soap, identifier); /* set SecurityTokenReference */ return soap_wsse_add_KeyInfo_SecurityTokenReferenceURI(soap, URI, NULL); } /** @fn const char *soap_wsse_get_SecurityContextToken(struct soap *soap) @brief Returns wsc:SecurityContextToken/Identifier string value or NULL @param soap context @return wsc:SecurityContextToken/Identifier string value value or NULL */ const char * soap_wsse_get_SecurityContextToken(struct soap *soap) { _wsse__Security *security = soap_wsse_Security(soap); DBGFUN("soap_wsse_SecurityContextToken"); if (security->wsc__SecurityContextToken && security->wsc__SecurityContextToken->wsu__Id) { const char *URI = soap_wsse_get_KeyInfo_SecurityTokenReferenceURI(soap); if (URI && !strcmp(URI, security->wsc__SecurityContextToken->wsu__Id)) return security->wsc__SecurityContextToken->Identifier; } return NULL; } /******************************************************************************\ * * ds:Signature/SignedInfo * \******************************************************************************/ /** @fn ds__SignedInfoType* soap_wsse_add_SignedInfo(struct soap *soap) @brief Adds SignedInfo element. @param soap context @return ds__SignedInfoType object */ struct ds__SignedInfoType* soap_wsse_add_SignedInfo(struct soap *soap) { ds__SignatureType *signature = soap_wsse_add_Signature(soap); if (!signature->SignedInfo) { signature->SignedInfo = (ds__SignedInfoType*)soap_malloc(soap, sizeof(ds__SignedInfoType)); if (!signature->SignedInfo) return NULL; soap_default_ds__SignedInfoType(soap, signature->SignedInfo); } return signature->SignedInfo; } /** @fn int soap_wsse_add_SignedInfo_Reference(struct soap *soap, const char *URI, const char *transform, const char *prefixlist, int alg, const char *HA) @brief Adds SignedInfo element with Reference URI, transform algorithm used, and digest value. @param soap context @param[in] URI reference @param[in] transform string should be c14n_URI for exc-c14n or NULL @param[in] prefixlist used by the exc-c14n transform or NULL @param[in] alg is the digest algorithm used @param[in] HA is the digest in binary form @return SOAP_OK or SOAP_EOM when references exceed SOAP_WSSE_MAX_REF This function can be called to add more references to the wsse:SignedInfo element. A maximum number of SOAP_WSSE_MAX_REF references can be added. The digest method is always SHA1. @note XPath transforms cannot be specified in this release. */ int soap_wsse_add_SignedInfo_Reference(struct soap *soap, const char *URI, const char *transform, const char *prefixlist, int alg, const char *HA) { ds__SignedInfoType *signedInfo = soap_wsse_add_SignedInfo(soap); ds__ReferenceType *reference; DBGFUN3("soap_wsse_add_SignedInfo_Reference", "URI=%s", URI?URI:"", "transform=%s", transform?transform:"", "alg=%x", alg); /* if this is the first reference, allocate SOAP_WSSE_MAX_REF references */ if (signedInfo->__sizeReference == 0) signedInfo->Reference = (ds__ReferenceType**)soap_malloc(soap, SOAP_WSSE_MAX_REF*sizeof(ds__ReferenceType*)); else { /* maximum number of references exceeded? */ if (signedInfo->__sizeReference >= SOAP_WSSE_MAX_REF) return soap->error = SOAP_EOM; } /* allocate fresh new reference */ reference = (ds__ReferenceType*)soap_malloc(soap, sizeof(ds__ReferenceType)); if (!reference) return soap->error = SOAP_EOM; soap_default_ds__ReferenceType(soap, reference); /* populate the URI */ reference->URI = soap_strdup(soap, URI); /* if a transform algorithm was used, populate the Transforms element */ if (transform) { reference->Transforms = (ds__TransformsType*)soap_malloc(soap, sizeof(ds__TransformsType)); if (!reference->Transforms) return soap->error = SOAP_EOM; soap_default_ds__TransformsType(soap, reference->Transforms); /* only one transform */ reference->Transforms->__sizeTransform = 1; reference->Transforms->Transform = (ds__TransformType*)soap_malloc(soap, sizeof(ds__TransformType)); soap_default_ds__TransformType(soap, reference->Transforms->Transform); reference->Transforms->Transform->Algorithm = (char*)transform; /* populate the c14n:InclusiveNamespaces element */ if (prefixlist && *prefixlist) { reference->Transforms->Transform->c14n__InclusiveNamespaces = (_c14n__InclusiveNamespaces*)soap_malloc(soap, sizeof(_c14n__InclusiveNamespaces)); if (!reference->Transforms->Transform->c14n__InclusiveNamespaces) return soap->error = SOAP_EOM; soap_default__c14n__InclusiveNamespaces(soap, reference->Transforms->Transform->c14n__InclusiveNamespaces); reference->Transforms->Transform->c14n__InclusiveNamespaces->PrefixList = (char*)prefixlist; } } /* populate the DigestMethod element */ reference->DigestMethod = (ds__DigestMethodType*)soap_malloc(soap, sizeof(ds__DigestMethodType)); if (!reference->DigestMethod) return soap->error = SOAP_EOM; soap_default_ds__DigestMethodType(soap, reference->DigestMethod); /* the DigestMethod algorithm SHA1, SHA256, SHA512 */ switch (alg & SOAP_SMD_HASH) { case SOAP_SMD_SHA1: reference->DigestMethod->Algorithm = (char*)ds_sha1URI; break; #if (OPENSSL_VERSION_NUMBER >= 0x0090800fL) case SOAP_SMD_SHA224: reference->DigestMethod->Algorithm = (char*)ds_sha224URI; break; case SOAP_SMD_SHA256: reference->DigestMethod->Algorithm = (char*)ds_sha256URI; break; case SOAP_SMD_SHA384: reference->DigestMethod->Algorithm = (char*)ds_sha384URI; break; case SOAP_SMD_SHA512: reference->DigestMethod->Algorithm = (char*)ds_sha512URI; break; #endif default: return soap_wsse_fault(soap, wsse__UnsupportedAlgorithm, "SHA224/256/384/512 requires OpenSSL 0.9.8"); } /* populate the DigestValue element */ reference->DigestValue = soap_s2base64(soap, (unsigned char*)HA, NULL, soap_smd_size(alg, NULL)); if (!reference->DigestValue) return soap->error; /* add the fresh new reference to the array */ signedInfo->Reference[signedInfo->__sizeReference] = reference; signedInfo->__sizeReference++; return SOAP_OK; } /** @fn int soap_wsse_add_SignedInfo_SignatureMethod(struct soap *soap, const char *method, int canonical) @brief Adds SignedInfo element with SignatureMethod. @param soap context @param[in] method is the URI of the signature algorithm (e.g. ds_rsa_sha1) @param[in] canonical flag indicating that SignedInfo is signed in exc-c14n form @return SOAP_OK */ int soap_wsse_add_SignedInfo_SignatureMethod(struct soap *soap, const char *method, int canonical) { ds__SignedInfoType *signedInfo = soap_wsse_add_SignedInfo(soap); DBGFUN2("soap_wsse_add_SignedInfo_SignatureMethod", "method=%s", method?method:"", "canonical=%d", canonical); /* if signed in exc-c14n form, populate CanonicalizationMethod element */ signedInfo->CanonicalizationMethod = (ds__CanonicalizationMethodType*)soap_malloc(soap, sizeof(ds__CanonicalizationMethodType)); if (!signedInfo->CanonicalizationMethod) return soap->error = SOAP_EOM; soap_default_ds__CanonicalizationMethodType(soap, signedInfo->CanonicalizationMethod); if (canonical) signedInfo->CanonicalizationMethod->Algorithm = (char*)c14n_URI; /* populate SignatureMethod element */ signedInfo->SignatureMethod = (ds__SignatureMethodType*)soap_malloc(soap, sizeof(ds__SignatureMethodType)); if (!signedInfo->SignatureMethod) return soap->error = SOAP_EOM; soap_default_ds__SignatureMethodType(soap, signedInfo->SignatureMethod); signedInfo->SignatureMethod->Algorithm = (char*)method; return SOAP_OK; } /** @fn ds__SignedInfoType* soap_wsse_SignedInfo(struct soap *soap) @brief Returns SignedInfo element if present. @param soap context @return ds__SignedInfoType object or NULL */ struct ds__SignedInfoType* soap_wsse_SignedInfo(struct soap *soap) { ds__SignatureType *signature = soap_wsse_Signature(soap); if (signature) return signature->SignedInfo; return NULL; } /** @fn int soap_wsse_get_SignedInfo_SignatureMethod(struct soap *soap, int *alg, int *bits) @brief Get SignatureMethod algorithm @param soap context @param[out] alg is a signature algorithm, such as SOAP_SMD_HMAC_SHA1/224/256/384/512, SOAP_SMD_VRFY_DSA_SHA1/256, SOAP_SMD_VRFY_RSA_SHA1/224/256/384/512 or SOAP_SMD_ECDSA_SHA1/224/256/384/512 @param[out] bits is set to HMACOutputLength if present and valid, 0 otherwise @return SOAP_OK or SOAP_FAULT with wsse:UnsupportedAlgorithm, wsse:FailedCheck, or wsse__InvalidSecurity fault */ int soap_wsse_get_SignedInfo_SignatureMethod(struct soap *soap, int *alg, int *bits) { ds__SignedInfoType *signedInfo = soap_wsse_SignedInfo(soap); DBGFUN("soap_wsse_get_SignedInfo_SignatureMethod"); *alg = SOAP_SMD_NONE; *bits = 0; /* if we have a SignedInfo element, get the algorithm */ if (signedInfo && signedInfo->SignatureMethod && signedInfo->SignatureMethod->Algorithm) { const char *method = signedInfo->SignatureMethod->Algorithm; if (!strcmp(method, ds_hmac_sha1URI)) *alg = SOAP_SMD_HMAC_SHA1; else if (!strcmp(method, ds_hmac_sha224URI)) *alg = SOAP_SMD_HMAC_SHA224; else if (!strcmp(method, ds_hmac_sha256URI)) *alg = SOAP_SMD_HMAC_SHA256; else if (!strcmp(method, ds_hmac_sha384URI)) *alg = SOAP_SMD_HMAC_SHA384; else if (!strcmp(method, ds_hmac_sha512URI)) *alg = SOAP_SMD_HMAC_SHA512; else if (!strcmp(method, ds_dsa_sha1URI)) *alg = SOAP_SMD_VRFY_DSA_SHA1; else if (!strcmp(method, ds_dsa_sha256URI)) *alg = SOAP_SMD_VRFY_DSA_SHA256; else if (!strcmp(method, ds_rsa_sha1URI)) *alg = SOAP_SMD_VRFY_RSA_SHA1; else if (!strcmp(method, ds_rsa_sha224URI)) *alg = SOAP_SMD_VRFY_RSA_SHA224; else if (!strcmp(method, ds_rsa_sha256URI)) *alg = SOAP_SMD_VRFY_RSA_SHA256; else if (!strcmp(method, ds_rsa_sha384URI)) *alg = SOAP_SMD_VRFY_RSA_SHA384; else if (!strcmp(method, ds_rsa_sha512URI)) *alg = SOAP_SMD_VRFY_RSA_SHA512; else if (!strcmp(method, ds_ecdsa_sha1URI)) *alg = SOAP_SMD_VRFY_ECDSA_SHA1; else if (!strcmp(method, ds_ecdsa_sha224URI)) *alg = SOAP_SMD_VRFY_ECDSA_SHA224; else if (!strcmp(method, ds_ecdsa_sha256URI)) *alg = SOAP_SMD_VRFY_ECDSA_SHA256; else if (!strcmp(method, ds_ecdsa_sha384URI)) *alg = SOAP_SMD_VRFY_ECDSA_SHA384; else if (!strcmp(method, ds_ecdsa_sha512URI)) *alg = SOAP_SMD_VRFY_ECDSA_SHA512; else return soap_wsse_fault(soap, wsse__UnsupportedAlgorithm, method); if (signedInfo->SignatureMethod->HMACOutputLength) { if ((*alg & SOAP_SMD_ALGO) != SOAP_SMD_HMAC) return soap_wsse_fault(soap, wsse__InvalidSecurity, "Invalid SignatureMethod HMACOutputLength"); *bits = *signedInfo->SignatureMethod->HMACOutputLength; if (*bits < (int)(4 * soap_smd_size(*alg, NULL)) || *bits > (int)(8 * soap_smd_size(*alg, NULL))) return soap_wsse_fault(soap, wsse__InvalidSecurity, "Invalid SignatureMethod HMACOutputLength"); } return SOAP_OK; } return soap_wsse_fault(soap, wsse__FailedCheck, "Signature required"); } /******************************************************************************\ * * ds:Signature/SignatureValue * \******************************************************************************/ /** @fn int soap_wsse_add_SignatureValue(struct soap *soap, int alg, const void *key, int keylen) @brief Adds SignedInfo/SignatureMethod element, signs the SignedInfo element, and adds the resulting SignatureValue element. @param soap context @param[in] alg is SOAP_SMD_HMAC_SHA1/224/256/384/512, SOAP_SMD_SIGN_DSA_SHA1/256, SOAP_SMD_SIGN_RSA_SHA1/224/256/384/512, or SOAP_SMD_SIGN_ECDSA_SHA1/224/256/384/512 @param[in] key to use to sign (HMAC or DSA/RSA/ECDSA EVP_PKEY) @param[in] keylen length of HMAC key @return SOAP_OK, SOAP_EOM, or fault To sign the SignedInfo element with this function, populate SignedInfo with Reference elements first using soap_wsse_add_SignedInfo_Reference. The SignedInfo element must not be modified after signing. The SOAP_XML_INDENT and SOAP_XML_CANONICAL flags are used to serialize the SignedInfo to compute the signature. */ int soap_wsse_add_SignatureValue(struct soap *soap, int alg, const void *key, int keylen) { ds__SignatureType *signature = soap_wsse_add_Signature(soap); const char *method = NULL; char *sig; int siglen; int err; const char *c14ninclude = soap->c14ninclude; DBGFUN1("soap_wsse_add_SignatureValue", "alg=%x", alg); /* determine signature algorithm to use */ switch (alg) { case SOAP_SMD_HMAC_SHA1: method = ds_hmac_sha1URI; break; #if (OPENSSL_VERSION_NUMBER >= 0x0090800fL) case SOAP_SMD_HMAC_SHA224: method = ds_hmac_sha224URI; break; case SOAP_SMD_HMAC_SHA256: method = ds_hmac_sha256URI; break; case SOAP_SMD_HMAC_SHA384: method = ds_hmac_sha384URI; break; case SOAP_SMD_HMAC_SHA512: method = ds_hmac_sha512URI; break; #endif case SOAP_SMD_SIGN_DSA_SHA1: method = ds_dsa_sha1URI; break; #if (OPENSSL_VERSION_NUMBER >= 0x0090800fL) case SOAP_SMD_SIGN_DSA_SHA256: method = ds_dsa_sha256URI; break; #endif case SOAP_SMD_SIGN_RSA_SHA1: method = ds_rsa_sha1URI; break; #if (OPENSSL_VERSION_NUMBER >= 0x0090800fL) case SOAP_SMD_SIGN_RSA_SHA224: method = ds_rsa_sha224URI; break; case SOAP_SMD_SIGN_RSA_SHA256: method = ds_rsa_sha256URI; break; case SOAP_SMD_SIGN_RSA_SHA384: method = ds_rsa_sha512URI; break; case SOAP_SMD_SIGN_RSA_SHA512: method = ds_rsa_sha512URI; break; #endif case SOAP_SMD_SIGN_ECDSA_SHA1: method = ds_ecdsa_sha1URI; break; #if (OPENSSL_VERSION_NUMBER >= 0x0090800fL) case SOAP_SMD_SIGN_ECDSA_SHA224: method = ds_ecdsa_sha224URI; break; case SOAP_SMD_SIGN_ECDSA_SHA256: method = ds_ecdsa_sha256URI; break; case SOAP_SMD_SIGN_ECDSA_SHA384: method = ds_ecdsa_sha512URI; break; case SOAP_SMD_SIGN_ECDSA_SHA512: method = ds_ecdsa_sha512URI; break; #endif default: return soap_wsse_fault(soap, wsse__UnsupportedAlgorithm, "Unsupported algorithm or algorithm requires OpenSSL 0.9.8"); } /* populate SignedInfo/SignatureMethod based on SOAP_XML_CANONICAL flag */ soap_wsse_add_SignedInfo_SignatureMethod(soap, method, (soap->mode & SOAP_XML_CANONICAL)); /* use the gSOAP engine's look-aside buffer to temporarily hold the sig */ if (soap_store_lab(soap, NULL, soap_smd_size(alg, key))) return soap->error = SOAP_EOM; sig = soap->labbuf; /* we will serialize SignedInfo as it appears exactly in the SOAP Header */ soap->part = SOAP_IN_HEADER; /* set indent level for XML SignedInfo as it appears in the SOAP Header */ soap->level = 4; /* prevent xmlns:ds namespace inclusion when non-exclusive is used */ if (!(soap->mode & SOAP_XML_CANONICAL)) soap_push_namespace(soap, "ds", ds_URI); soap->c14ninclude = NULL; /* use smdevp engine to sign SignedInfo */ err = soap_smd_begin(soap, alg, key, keylen); if (!err) err = soap_out_ds__SignedInfoType(soap, "ds:SignedInfo", 0, signature->SignedInfo, NULL); soap->c14ninclude = c14ninclude; if (soap_smd_end(soap, sig, &siglen) || err) return soap_wsse_fault(soap, wsse__InvalidSecurity, "Could not sign"); /* populate the SignatureValue element */ signature->SignatureValue = soap_s2base64(soap, (unsigned char*)sig, NULL, siglen); if (!signature->SignatureValue) return soap->error; return SOAP_OK; } /** @fn int soap_wsse_verify_SignatureValue(struct soap *soap, int alg, const void *key, int keylen) @brief Verifies the SignatureValue of a SignedInfo element. @param soap context @param[in] alg is a signature algorith, such as SOAP_SMD_HMAC_SHA1/224/256/384/512, SOAP_SMD_VRFY_DSA_SHA1/256, SOAP_SMD_VRFY_RSA_SHA1/224/256/384/512 or SOAP_SMD_VRFY_ECDSA_SHA1/224/256/384/512 determined by the SignedInfo/SignatureMethod @param[in] key to use to verify (HMAC or DSA/RSA/ECDSA EVP_PKEY) @param[in] keylen length of HMAC key @return SOAP_OK, SOAP_EOM, or fault This function searches for the SignedInfo element in the soap->dom DOM tree to verify the signature in the SignatureValue element. Using the DOM ensures we will verify the signature of a SignedInfo as it was exactly received by the parser, by using the -DWITH_DOM compile flag and SOAP_XML_DOM runtime flag. If there is no DOM, it verifies the signature of the deserialized SignedInfo element in the SOAP Header. However, serializing deserialized data may change the octet stream that was signed, unless we're using gSOAP as producers and consumers (with the SOAP_XML_INDENT flag reset). */ int soap_wsse_verify_SignatureValue(struct soap *soap, int alg, const void *key, int keylen) { ds__SignatureType *signature = soap_wsse_Signature(soap); DBGFUN1("soap_wsse_verify_SignatureValue", "alg=%x", alg); /* always need an HMAC secret key or DSA/RSA public key to verify */ if (!key) return soap_wsse_fault(soap, wsse__SecurityTokenUnavailable, NULL); /* verify the SignedInfo element with the SignatureValue element */ if (signature && signature->SignedInfo && signature->SignatureValue) { char *sig; const char *sigval; int method, bits, siglen, sigvallen; /* check that we are using the intended signature algorithm */ if (soap_wsse_get_SignedInfo_SignatureMethod(soap, &method, &bits)) return soap->error; if (alg != method) return soap_wsse_fault(soap, wsse__FailedCheck, "Incorrect signature algorithm used"); /* retrieve the signature */ sigval = soap_base642s(soap, signature->SignatureValue, NULL, 0, &sigvallen); /* search the DOM for SignedInfo */ if (soap->dom) { struct soap_dom_element *elt; /* traverse the DOM while searching for SignedInfo in the ds namespace */ for (elt = soap->dom; elt; elt = soap_dom_next_element(elt, NULL)) { if (elt->name && elt->nstr && !strcmp(elt->nstr, ds_URI) && (!strcmp(elt->name, "SignedInfo") || !soap_tag_cmp(elt->name, "*:SignedInfo"))) break; } /* found it? */ if (elt) { int err = SOAP_OK; const char *c14ninclude = soap->c14ninclude; /* should not include leading whitespace in signature verification */ elt->lead = NULL; /* use smdevp engine to verify SignedInfo */ if ((alg & SOAP_SMD_ALGO) == SOAP_SMD_HMAC) sig = (char*)soap_malloc(soap, soap_smd_size(alg, key)); else { sig = (char*)sigval; siglen = sigvallen; } if (signature->SignedInfo->CanonicalizationMethod && signature->SignedInfo->CanonicalizationMethod->Algorithm && !strcmp(signature->SignedInfo->CanonicalizationMethod->Algorithm, c14n_URI)) { struct soap_dom_element *prt; struct soap_dom_attribute *att; if (signature->SignedInfo->CanonicalizationMethod->c14n__InclusiveNamespaces) soap->c14ninclude = signature->SignedInfo->CanonicalizationMethod->c14n__InclusiveNamespaces->PrefixList; else soap->c14ninclude = NULL; /* recanonicalize DOM while keeping content "as is" */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Verifying signed canonicalized DOM with C14N prefix list '%s'\n", soap->c14ninclude ? soap->c14ninclude : "")); soap->mode &= ~SOAP_XML_DOM; soap->mode |= SOAP_XML_CANONICAL | SOAP_DOM_ASIS; err = soap_smd_begin(soap, alg, key, keylen); /* emit all xmlns attributes of ancestors */ while (soap->nlist) { struct soap_nlist *np = soap->nlist->next; SOAP_FREE(soap, soap->nlist); soap->nlist = np; } /* push xmlns:ns="..." */ for (prt = elt->prnt; prt; prt = prt->prnt) { for (att = prt->atts; att; att = att->next) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM attribute = %s\n", att->name)); if (!strncmp(att->name, "xmlns:", 6) && !soap_lookup_ns(soap, att->name + 6, strlen(att->name + 6))) soap_attribute(soap, att->name, att->text); } } /* push xmlns="..." */ for (prt = elt->prnt; prt; prt = prt->prnt) { for (att = prt->atts; att; att = att->next) { if (!strcmp(att->name, "xmlns")) { soap_attribute(soap, att->name, att->text); break; } } } } else { /* compute digest over DOM "as is" */ soap->mode &= ~(SOAP_XML_CANONICAL | SOAP_XML_DOM); soap->mode |= SOAP_DOM_ASIS; err = soap_smd_begin(soap, alg, key, keylen); } /* do not dump namespace table xmlns bindings */ soap->ns = 2; /* compute digest */ soap->feltbegout = NULL; soap->feltendout = NULL; if (!err) err = soap_out_xsd__anyType(soap, NULL, 0, elt, NULL); soap->c14ninclude = c14ninclude; if (soap_smd_end(soap, sig, &siglen) || err) return soap_wsse_fault(soap, wsse__FailedCheck, "The signed SignedInfo SignatureValue is invalid"); if ((alg & SOAP_SMD_ALGO) == SOAP_SMD_HMAC) { if (bits == 0) { if (siglen != sigvallen || memcmp(sig, sigval, siglen)) return soap_wsse_fault(soap, wsse__FailedCheck, "The HMAC-signed SignedInfo is invalid"); } else if (bits > 8 * siglen || memcmp(sig, sigval, 8 * bits)) return soap_wsse_fault(soap, wsse__FailedCheck, "The HMAC-signed SignedInfo is invalid"); } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Signature in DOM is valid\n")); return SOAP_OK; } } else { int err = SOAP_OK; const char *c14nexclude = soap->c14nexclude; const char *c14ninclude = soap->c14ninclude; soap_mode mode = soap->mode; short part = soap->part; /* serialize the SignedInfo element as it appeared in the SOAP Header */ soap->level = 4; soap->c14nexclude = "ds"; soap->c14ninclude = NULL; soap->part = SOAP_IN_HEADER; /* header encoding rules (literal) */ if (signature->SignedInfo->CanonicalizationMethod) soap->mode |= SOAP_XML_CANONICAL; else soap->mode &= ~SOAP_XML_CANONICAL; if ((alg & SOAP_SMD_ALGO) == SOAP_SMD_HMAC) sig = (char*)soap_malloc(soap, soap_smd_size(alg, key)); else { sig = (char*)sigval; siglen = sigvallen; } err = soap_smd_begin(soap, alg, key, keylen); if (!err) err = soap_out_ds__SignedInfoType(soap, "ds:SignedInfo", 0, signature->SignedInfo, NULL); soap->mode = mode; soap->c14nexclude = c14nexclude; soap->c14ninclude = c14ninclude; soap->part = part; if (soap_smd_end(soap, sig, &siglen) || err) return soap_wsse_fault(soap, wsse__FailedCheck, "The signed serialized SignedInfo SignatureValue is invalid"); if ((alg & SOAP_SMD_ALGO) == SOAP_SMD_HMAC) { if (bits == 0) { if (siglen != sigvallen || memcmp(sig, sigval, siglen)) return soap_wsse_fault(soap, wsse__FailedCheck, "The HMAC-signed serialized SignedInfo is invalid"); } else if (bits > 8 * siglen || memcmp(sig, sigval, 8 * bits)) return soap_wsse_fault(soap, wsse__FailedCheck, "The HMAC-signed serialized SignedInfo is invalid"); } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Signature is valid\n")); return SOAP_OK; } } return soap_wsse_fault(soap, wsse__FailedCheck, "SignedInfo required"); } /** @fn int soap_wsse_verify_SignedInfo(struct soap *soap) @brief Verifies the digest values of the XML elements referenced by the SignedInfo References. @param soap context @return SOAP_OK or fault This function searches for the SignedInfo element in the soap->dom DOM tree to verify the digests contained therein. Using the DOM ensures we will verify the digests of the locally signed elements as they were exactly received by the parser, by using the -DWITH_DOM compile flag and SOAP_XML_DOM runtime flag. If there is no DOM, the function fails. */ int soap_wsse_verify_SignedInfo(struct soap *soap) { ds__SignedInfoType *signedInfo = soap_wsse_SignedInfo(soap); DBGFUN("soap_wsse_verify_SignedInfo"); if (signedInfo) { int i; /* must have at least one reference element */ if (signedInfo->__sizeReference == 0) return soap_wsse_fault(soap, wsse__InvalidSecurity, "Missing SignedInfo/Reference"); /* As an alternative to the current implementatin, this might be a good place to re-canonicalize the entire DOM to improve interop. Two DOMs can be used: one with non-c14n XML and one with c14n XML so we can handle multiple different transforms. */ /* for each reference element, check the digest */ for (i = 0; i < signedInfo->__sizeReference; i++) { ds__ReferenceType *reference = signedInfo->Reference[i]; /* reference element is complete? */ if (!reference->URI || !reference->DigestMethod || !reference->DigestMethod->Algorithm || !reference->DigestValue) return soap_wsse_fault(soap, wsse__InvalidSecurity, "Incomplete SignedInfo/Reference"); /* reference is local? */ if (*reference->URI == '#') { int alg, canonical; const char *c14ninclude = soap->c14ninclude; unsigned char hash[SOAP_SMD_MAX_SIZE]; /* digest algorithm */ if (!strcmp(reference->DigestMethod->Algorithm, ds_sha1URI)) alg = SOAP_SMD_DGST_SHA1; #if (OPENSSL_VERSION_NUMBER >= 0x0090800fL) else if (!strcmp(reference->DigestMethod->Algorithm, ds_sha224URI)) alg = SOAP_SMD_DGST_SHA224; else if (!strcmp(reference->DigestMethod->Algorithm, ds_sha256URI)) alg = SOAP_SMD_DGST_SHA256; else if (!strcmp(reference->DigestMethod->Algorithm, ds_sha384URI)) alg = SOAP_SMD_DGST_SHA384; else if (!strcmp(reference->DigestMethod->Algorithm, ds_sha512URI)) alg = SOAP_SMD_DGST_SHA512; #endif else return soap_wsse_fault(soap, wsse__UnsupportedAlgorithm, reference->DigestMethod->Algorithm); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Verifying digest of locally referenced data %s alg=%x\n", reference->URI, alg)); /* if reference has a transform, it should be an exc-c14n transform */ if (reference->Transforms) { if (reference->Transforms->__sizeTransform != 1 || !reference->Transforms->Transform[0].Algorithm || strcmp(reference->Transforms->Transform[0].Algorithm, c14n_URI)) return soap_wsse_fault(soap, wsse__UnsupportedAlgorithm, reference->Transforms->Transform[0].Algorithm); canonical = 1; if (reference->Transforms->Transform[0].c14n__InclusiveNamespaces) soap->c14ninclude = reference->Transforms->Transform[0].c14n__InclusiveNamespaces->PrefixList; else soap->c14ninclude = NULL; } else canonical = 0; /* convert base64 digest to binary */ soap_base642s(soap, reference->DigestValue, (char*)hash, SOAP_SMD_MAX_SIZE, NULL); /* verify the digest of a locally signed element */ if (soap_wsse_verify_digest(soap, alg, canonical, reference->URI + 1, hash)) return soap->error; soap->c14ninclude = c14ninclude; } } return SOAP_OK; } return soap_wsse_fault(soap, wsse__InvalidSecurity, "Missing SignedInfo"); } /** @fn int soap_wsse_verify_digest(struct soap *soap, int alg, int canonical, const char *id, unsigned char hash[SOAP_SMD_MAX_SIZE]) @brief Verifies the digest value of an XML element referenced by id against the hash. @param soap context @param[in] alg digest algorithm @param[in] canonical flag indicating that element is signed in exc-c14n form @param[in] id string of the XML element to verify @param[in] hash digest value to verify against @return SOAP_OK or fault */ int soap_wsse_verify_digest(struct soap *soap, int alg, int canonical, const char *id, unsigned char hash[SOAP_SMD_MAX_SIZE]) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); struct soap_dom_element *elt, *dom = NULL; DBGFUN3("soap_wsse_verify_digest", "alg=%x", alg, "canonical=%d", canonical, "id=%s", id); if (!data) return soap_set_receiver_error(soap, "soap_wsse_verify_digest", "Plugin not registered", SOAP_PLUGIN_ERROR); /* traverse the DOM to find the element with matching wsu:Id or ds:Id */ for (elt = soap->dom; elt; elt = soap_dom_next_element(elt, NULL)) { struct soap_dom_attribute *att; for (att = elt->atts; att; att = att->next) { /* check attribute */ if (att->name && att->nstr && (!strcmp(att->nstr, wsu_URI) || !strcmp(att->nstr, ds_URI)) && (!strcmp(att->name, "Id") || !soap_tag_cmp(att->name, "*:Id"))) { /* found a match, compare attribute value with id */ if (att->text && !strcmp(att->text, id)) { if (dom) return soap_wsse_fault(soap, wsse__FailedCheck, "SignedInfo duplicate Id"); dom = elt; /* elt = NULL; break; */ /* improves speed but skips duplicate Id check */ } } } } if (dom) { unsigned char HA[SOAP_SMD_MAX_SIZE]; int len, err = SOAP_OK; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Computing digest for Id=%s\n", id)); /* do not hash leading whitespace */ dom->lead = NULL; /* canonical or as-is? */ if (canonical) { struct soap_dom_element *prt; struct soap_dom_attribute *att; soap->mode |= SOAP_XML_CANONICAL | SOAP_DOM_ASIS; err = soap_smd_begin(soap, alg, NULL, 0); /* emit all xmlns attributes of ancestors */ while (soap->nlist) { struct soap_nlist *np = soap->nlist->next; SOAP_FREE(soap, soap->nlist); soap->nlist = np; } for (prt = dom->prnt; prt; prt = prt->prnt) { for (att = prt->atts; att; att = att->next) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM attribute = %s\n", att->name)); if (!strncmp(att->name, "xmlns:", 6) && !soap_lookup_ns(soap, att->name + 6, strlen(att->name + 6))) soap_attribute(soap, att->name, att->text); } } for (prt = dom->prnt; prt; prt = prt->prnt) { for (att = prt->atts; att; att = att->next) { if (!strcmp(att->name, "xmlns")) { soap_attribute(soap, att->name, att->text); break; } } } } else { /* compute digest over DOM "as is" */ soap->mode &= ~SOAP_XML_CANONICAL; soap->mode |= SOAP_DOM_ASIS; err = soap_smd_begin(soap, alg, NULL, 0); } /* do not dump namespace table xmlns bindings */ soap->ns = 2; /* compute digest */ soap->feltbegout = NULL; soap->feltendout = NULL; if (!err) err = soap_out_xsd__anyType(soap, NULL, 0, dom, NULL); if (soap_smd_end(soap, (char*)HA, &len) || err) return soap_wsse_fault(soap, wsse__FailedCheck, "Digest computation failed"); /* compare digests, success if identical */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Comparing digest hashes\n")); DBGHEX(TEST, hash, len); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n--\n")); DBGHEX(TEST, HA, len); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n")); if (!memcmp(hash, HA, (size_t)len)) return SOAP_OK; return soap_wsse_fault(soap, wsse__FailedCheck, NULL); } if (data->vrfy_alg & SOAP_WSSE_IGNORE_EXTRA_REFS) return SOAP_OK; return soap_wsse_fault(soap, wsse__FailedCheck, "SignedInfo reference URI target not found"); } /******************************************************************************\ * * ds:Signature/KeyInfo * \******************************************************************************/ /** @fn ds__KeyInfoType* soap_wsse_add_KeyInfo(struct soap *soap) @brief Adds KeyInfo element. @param soap context @return ds__KeyInfo object */ struct ds__KeyInfoType* soap_wsse_add_KeyInfo(struct soap *soap) { ds__SignatureType *signature = soap_wsse_add_Signature(soap); if (!signature->KeyInfo) { signature->KeyInfo = (ds__KeyInfoType*)soap_malloc(soap, sizeof(ds__KeyInfoType)); if (!signature->KeyInfo) return NULL; } soap_default_ds__KeyInfoType(soap, signature->KeyInfo); return signature->KeyInfo; } /** @fn ds__KeyInfoType* soap_wsse_KeyInfo(struct soap *soap) @brief Returns KeyInfo element if present. @param soap context @return ds__KeyInfo object or NULL */ struct ds__KeyInfoType* soap_wsse_KeyInfo(struct soap *soap) { ds__SignatureType *signature = soap_wsse_Signature(soap); if (signature) return signature->KeyInfo; return NULL; } /******************************************************************************\ * * ds:Signature/KeyInfo/KeyName * \******************************************************************************/ /** @fn int soap_wsse_add_KeyInfo_KeyName(struct soap *soap, const char *name) @brief Adds KeyName element. @param soap context @param[in] name string of the KeyName @return SOAP_OK @note The recommended method to add Key information is to utilize KeyIdentifier instead of KeyName. A KeyName is useful mainly for internal use. */ int soap_wsse_add_KeyInfo_KeyName(struct soap *soap, const char *name) { ds__KeyInfoType *keyInfo = soap_wsse_add_KeyInfo(soap); DBGFUN1("soap_wsse_add_KeyInfo_KeyName", "name=%s", name); /* populate the KeyName element */ keyInfo->KeyName = soap_strdup(soap, name); return SOAP_OK; } /** @fn int soap_wsse_get_KeyInfo_KeyName(struct soap *soap) @brief Returns KeyName element if present. @param soap context @return string or NULL */ const char* soap_wsse_get_KeyInfo_KeyName(struct soap *soap) { ds__KeyInfoType *keyInfo = soap_wsse_KeyInfo(soap); DBGFUN("soap_wsse_get_KeyInfo_KeyName"); if (!keyInfo) return NULL; return keyInfo->KeyName; } /******************************************************************************\ * * ds:Signature/KeyInfo/wsse:SecurityTokenReference/Reference/@URI * \******************************************************************************/ /** @fn int soap_wsse_add_KeyInfo_SecurityTokenReferenceURI(struct soap *soap, const char *URI, const char *valueType) @brief Adds KeyInfo element with SecurityTokenReference URI. @param soap context @param[in] URI string referencing a security token @param[in] valueType string or NULL @return SOAP_OK */ int soap_wsse_add_KeyInfo_SecurityTokenReferenceURI(struct soap *soap, const char *URI, const char *valueType) { ds__KeyInfoType *keyInfo = soap_wsse_add_KeyInfo(soap); DBGFUN2("soap_wsse_add_KeyInfo_SecurityTokenReferenceURI", "URI=%s", URI?URI:"", "valueType=%s", valueType?valueType:""); /* allocate SecurityTokenReference element if we don't have one already */ if (!keyInfo->wsse__SecurityTokenReference) { keyInfo->wsse__SecurityTokenReference = (_wsse__SecurityTokenReference*)soap_malloc(soap, sizeof(_wsse__SecurityTokenReference)); if (!keyInfo->wsse__SecurityTokenReference) return soap->error = SOAP_EOM; } soap_default__wsse__SecurityTokenReference(soap, keyInfo->wsse__SecurityTokenReference); /* allocate Reference element */ keyInfo->wsse__SecurityTokenReference->Reference = (_wsse__Reference*)soap_malloc(soap, sizeof(_wsse__Reference)); soap_default__wsse__Reference(soap, keyInfo->wsse__SecurityTokenReference->Reference); /* populate the Reference element */ keyInfo->wsse__SecurityTokenReference->Reference->URI = soap_strdup(soap, URI); keyInfo->wsse__SecurityTokenReference->Reference->ValueType = soap_strdup(soap, valueType); return SOAP_OK; } /** @fn int soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(struct soap *soap, const char *URI) @brief Adds KeyInfo element with SecurityTokenReference URI to an X509 cert. @param soap context @param[in] URI string referencing an X509 certificate @return SOAP_OK */ int soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(struct soap *soap, const char *URI) { return soap_wsse_add_KeyInfo_SecurityTokenReferenceURI(soap, URI, wsse_X509v3URI); } /** @fn const char* soap_wsse_get_KeyInfo_SecurityTokenReferenceURI(struct soap *soap) @brief Returns a SecurityTokenReference URI if present. @param soap context @return string or NULL */ const char* soap_wsse_get_KeyInfo_SecurityTokenReferenceURI(struct soap *soap) { ds__KeyInfoType *keyInfo = soap_wsse_KeyInfo(soap); if (keyInfo && keyInfo->wsse__SecurityTokenReference && keyInfo->wsse__SecurityTokenReference->Reference) return keyInfo->wsse__SecurityTokenReference->Reference->URI; return NULL; } /** @fn const char* soap_wsse_get_KeyInfo_SecurityTokenReferenceValueType(struct soap *soap) @brief Returns a SecurityTokenReference ValueType if present. @param soap context @return string or NULL */ const char* soap_wsse_get_KeyInfo_SecurityTokenReferenceValueType(struct soap *soap) { ds__KeyInfoType *keyInfo = soap_wsse_KeyInfo(soap); if (keyInfo && keyInfo->wsse__SecurityTokenReference && keyInfo->wsse__SecurityTokenReference->Reference) return keyInfo->wsse__SecurityTokenReference->Reference->ValueType; return NULL; } /** @fn X509* soap_wsse_get_KeyInfo_SecurityTokenReferenceX509(struct soap *soap) @brief Returns a X509 certificate if present as a BinarySecurity token. This call must be followed by an X509_free to deallocate the X509 certificate data. @param soap context @return X509 object or NULL with wsse:SecurityTokenUnavailable fault */ X509* soap_wsse_get_KeyInfo_SecurityTokenReferenceX509(struct soap *soap) { const char *URI = soap_wsse_get_KeyInfo_SecurityTokenReferenceURI(soap); X509 *cert = NULL; DBGFUN("soap_wsse_get_KeyInfo_SecurityTokenReferenceX509"); if (URI && *URI == '#') { const char *valueType; valueType = soap_wsse_get_KeyInfo_SecurityTokenReferenceValueType(soap); if (!valueType || !strcmp(valueType, wsse_X509v3URI)) cert = soap_wsse_get_BinarySecurityTokenX509(soap, URI + 1); } return cert; } /** @fn struct ds__X509IssuerSerialType *soap_wsse_get_KeyInfo_SecurityTokenReferenceX509Data(struct soap *soap) @brief Returns ds__X509IssuerSerialType with non-NULL X509IssuerName and non-NULL X509SerialNumber of a X509Data element when present and set. @param soap context @return pointer to ds__X509IssuerSerialType struct or NULL */ struct ds__X509IssuerSerialType * soap_wsse_get_KeyInfo_SecurityTokenReferenceX509Data(struct soap *soap) { ds__KeyInfoType *keyInfo = soap_wsse_KeyInfo(soap); if (keyInfo && keyInfo->wsse__SecurityTokenReference && keyInfo->wsse__SecurityTokenReference->ds__X509Data && keyInfo->wsse__SecurityTokenReference->ds__X509Data->X509IssuerSerial && keyInfo->wsse__SecurityTokenReference->ds__X509Data->X509IssuerSerial->X509IssuerName && keyInfo->wsse__SecurityTokenReference->ds__X509Data->X509IssuerSerial->X509SerialNumber) return keyInfo->wsse__SecurityTokenReference->ds__X509Data->X509IssuerSerial; return NULL; } /******************************************************************************\ * * ds:Signature/KeyInfo/wsse:SecurityTokenReference/Reference/KeyIdentifier * \******************************************************************************/ /** @fn int soap_wsse_add_KeyInfo_SecurityTokenReferenceKeyIdentifier(struct soap *soap, const char *id, const char *valueType, unsigned char *data, int size) @brief Adds KeyInfo element with SecurityTokenReference/KeyIdentifier binary data @param soap context @param[in] id string for signature reference @param[in] valueType string @param[in] data binary data @param[in] size of binary data @return SOAP_OK */ int soap_wsse_add_KeyInfo_SecurityTokenReferenceKeyIdentifier(struct soap *soap, const char *id, const char *valueType, unsigned char *data, int size) { ds__KeyInfoType *keyInfo = soap_wsse_add_KeyInfo(soap); DBGFUN2("soap_wsse_add_KeyInfo_SecurityTokenReferenceKeyIdentifier", "id=%s", id?id:"", "valueType=%s", valueType?valueType:""); /* allocate SecurityTokenReference if we don't have one already */ if (!keyInfo->wsse__SecurityTokenReference) { keyInfo->wsse__SecurityTokenReference = (_wsse__SecurityTokenReference*)soap_malloc(soap, sizeof(_wsse__SecurityTokenReference)); if (!keyInfo->wsse__SecurityTokenReference) return soap->error = SOAP_EOM; } soap_default__wsse__SecurityTokenReference(soap, keyInfo->wsse__SecurityTokenReference); /* allocate KeyIdentifier */ keyInfo->wsse__SecurityTokenReference->KeyIdentifier = (_wsse__KeyIdentifier*)soap_malloc(soap, sizeof(_wsse__KeyIdentifier)); if (!keyInfo->wsse__SecurityTokenReference->KeyIdentifier) return soap->error = SOAP_EOM; soap_default__wsse__KeyIdentifier(soap, keyInfo->wsse__SecurityTokenReference->KeyIdentifier); /* populate KeyIdentifier */ keyInfo->wsse__SecurityTokenReference->KeyIdentifier->wsu__Id = soap_strdup(soap, id); keyInfo->wsse__SecurityTokenReference->KeyIdentifier->ValueType = soap_strdup(soap, valueType); keyInfo->wsse__SecurityTokenReference->KeyIdentifier->EncodingType = (char*)wsse_Base64BinaryURI; keyInfo->wsse__SecurityTokenReference->KeyIdentifier->__item = soap_s2base64(soap, data, NULL, size); return SOAP_OK; } /** @fn const char* soap_wsse_get_KeyInfo_SecurityTokenReferenceKeyIdentifierValueType(struct soap *soap) @brief Returns KeyInfo/SecurityTokenReference/KeyIdentifier/ValueType if present @param soap context @return string or NULL */ const char* soap_wsse_get_KeyInfo_SecurityTokenReferenceKeyIdentifierValueType(struct soap *soap) { ds__KeyInfoType *keyInfo = soap_wsse_KeyInfo(soap); DBGFUN("soap_wsse_get_KeyInfo_SecurityTokenReferenceKeyIdentifierValueType"); if (!keyInfo || !keyInfo->wsse__SecurityTokenReference || !keyInfo->wsse__SecurityTokenReference->KeyIdentifier) return NULL; return keyInfo->wsse__SecurityTokenReference->KeyIdentifier->ValueType; } /** @fn const unsigned char* soap_wsse_get_KeyInfo_SecurityTokenReferenceKeyIdentifier(struct soap *soap, int *size) @brief Returns KeyInfo/SecurityTokenReference/KeyIdentifier binary data @param soap context @param[out] size is set to the size of the decoded data @return data or NULL */ const unsigned char* soap_wsse_get_KeyInfo_SecurityTokenReferenceKeyIdentifier(struct soap *soap, int *size) { ds__KeyInfoType *keyInfo = soap_wsse_KeyInfo(soap); DBGFUN("soap_wsse_get_KeyInfo_SecurityTokenReferenceKeyIdentifier"); if (!keyInfo || !keyInfo->wsse__SecurityTokenReference || !keyInfo->wsse__SecurityTokenReference->KeyIdentifier) return NULL; return (unsigned char*)soap_base642s(soap, keyInfo->wsse__SecurityTokenReference->KeyIdentifier->__item, NULL, 0, size); } /******************************************************************************\ * * ds:Signature/KeyInfo/wsse:SecurityTokenReference/Reference/Embedded * \******************************************************************************/ /** @fn int soap_wsse_add_KeyInfo_SecurityTokenReferenceEmbedded(struct soap *soap, const char *id, const char *valueType) @brief Adds KeyInfo element with Embedded SecurityTokenReference. @param soap context @param[in] id string for signature reference @param[in] valueType string @return SOAP_OK @note This function does not add embedded tokens automatically. See code for comments. */ int soap_wsse_add_KeyInfo_SecurityTokenReferenceEmbedded(struct soap *soap, const char *id, const char *valueType) { ds__KeyInfoType *keyInfo = soap_wsse_add_KeyInfo(soap); DBGFUN("soap_wsse_get_KeyInfo_SecurityTokenReferenceEmbedded"); /* allocate SecurityTokenReference if we don't have one already */ if (!keyInfo->wsse__SecurityTokenReference) { keyInfo->wsse__SecurityTokenReference = (_wsse__SecurityTokenReference*)soap_malloc(soap, sizeof(_wsse__SecurityTokenReference)); if (!keyInfo->wsse__SecurityTokenReference) return soap->error = SOAP_EOM; } soap_default__wsse__SecurityTokenReference(soap, keyInfo->wsse__SecurityTokenReference); /* allocate Embedded element */ keyInfo->wsse__SecurityTokenReference->Embedded = (_wsse__Embedded*)soap_malloc(soap, sizeof(_wsse__Embedded)); if (!keyInfo->wsse__SecurityTokenReference->Embedded) return soap->error = SOAP_EOM; soap_default__wsse__Embedded(soap, keyInfo->wsse__SecurityTokenReference->Embedded); /* populate Embedded element */ keyInfo->wsse__SecurityTokenReference->Embedded->wsu__Id = soap_strdup(soap, id); keyInfo->wsse__SecurityTokenReference->Embedded->ValueType = soap_strdup(soap, valueType); /* TODO: Add embedded tokens and assertions. Could use DOM here? keyInfo->wsse__SecurityTokenReference->Embedded->xyz = ...; */ return SOAP_OK; } /******************************************************************************\ * * wsse:Security/xenc:EncryptedKey header element * \******************************************************************************/ /** @fn int soap_wsse_add_EncryptedKey(struct soap *soap, int alg, const char *URI, X509 *cert, const char *subjectkeyid, const char *issuer, const char *serial) @brief Adds EncryptedKey header element and initiates the encryption of the SOAP Body. @param soap context @param[in] alg algorithm to use, SOAP_MEC_ENV_ENC_DES_CBC etc. @param[in] URI a unique identifier for the key, required for interoperability @param[in] cert the X509 certificate with public key or NULL @param[in] subjectkeyid string identification of the subject which when set to non-NULL is used instead of embedding the public key in the message @param[in] issuer string to include SecurityTokenReference/X509Data @param[in] serial string to include SecurityTokenReference/X509Data @return SOAP_OK or error code This function adds the encrypted key or subject key ID to the WS-Security header and initiates encryption of the SOAP Body. An X509 certificate may be provided, or the subjectkeyid, or the issuer and serial number. The certificate is embedded in the WS-Security EncryptedKey header. If the subjectkeyid string is non-NULL the subject key ID is used in the EncryptedKey header instead of the X509 certificate content. */ int soap_wsse_add_EncryptedKey(struct soap *soap, int alg, const char *URI, X509 *cert, const char *subjectkeyid, const char *issuer, const char *serial) { return soap_wsse_add_EncryptedKey_encrypt_only(soap, alg, URI, cert, subjectkeyid, issuer, serial, NULL); } /** @fn int soap_wsse_add_EncryptedKey_encrypt_only(struct soap *soap, int alg, const char *URI, X509 *cert, const char *subjectkeyid, const char *issuer, const char *serial, const char *tags) @brief Adds EncryptedKey header element and initiates encryption of the given XML elements specified in the tags string. Should be used in combination with soap_wsse_set_wsu_id to set wsu:Id for given XML element tags. @param soap context @param[in] alg algorithm to use, SOAP_MEC_ENV_ENC_DES_CBC etc. @param[in] URI a unique identifier for the key, required for interoperability @param[in] cert the X509 certificate with public key or NULL @param[in] subjectkeyid string identification of the subject which when set to non-NULL is used instead of embedding the public key in the message @param[in] issuer string to include SecurityTokenReference/X509Data @param[in] serial string to include SecurityTokenReference/X509Data @param[in] tags space-separated string of element tag names to encrypt @return xenc__EncryptedKeyType object This function adds the encrypted key or subject key ID to the WS-Security header and initiates encryption of the SOAP Body. An X509 certificate may be provided, or the subjectkeyid, or the issuer and serial number. The certificate is embedded in the WS-Security EncryptedKey header. If the subjectkeyid string is non-NULL the subject key ID is used in the EncryptedKey header instead of the X509 certificate content. Only the XML elements given in the 'tags' string as wsu:Id attributed elements are encrypted. @warning Use @ref soap_wsse_add_EncryptedKey_encrypt_only only in combination with @ref soap_wsse_set_wsu_id with the tag names of the elements to be encrypted. OTHERWISE THE GIVEN XML ELEMENTS ARE NOT ENCRYPTED AND WILL BE SENT IN THE CLEAR. @warning The elements identified with @ref soap_wsse_set_wsu_id to encrypt MUST occur EXACTLY ONCE in the SOAP Body. @warning Encryption/decryption of elements with simple content (CDATA content) IS NOT SUPPORTED. This means that elements you want to encrypt with this function must have complex content. That is, only encrypt elements with sub elements or encrypt the entire SOAP Body. */ int soap_wsse_add_EncryptedKey_encrypt_only(struct soap *soap, int alg, const char *URI, X509 *cert, const char *subjectkeyid, const char *issuer, const char *serial, const char *tags) { EVP_PKEY *pubk; unsigned char *key; int keylen; _wsse__Security *security; struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); DBGFUN("soap_wsse_add_EncryptedKey"); if (!data) return soap_set_receiver_error(soap, "soap_wsse_add_EncryptedKey", "Plugin not registered", SOAP_PLUGIN_ERROR); security = soap_wsse_add_Security(soap); /* if we don't have a xenc:EncryptedKey, create one */ if (!security->xenc__EncryptedKey) { if (!(security->xenc__EncryptedKey = (xenc__EncryptedKeyType*)soap_malloc(soap, sizeof(xenc__EncryptedKeyType)))) return soap->error = SOAP_EOM; } soap_default_xenc__EncryptedKeyType(soap, security->xenc__EncryptedKey); security->xenc__EncryptedKey->Id = soap_strdup(soap, URI); if (!(security->xenc__EncryptedKey->EncryptionMethod = (xenc__EncryptionMethodType*)soap_malloc(soap, sizeof(struct xenc__EncryptionMethodType)))) return soap->error = SOAP_EOM; soap_default_xenc__EncryptionMethodType(soap, security->xenc__EncryptedKey->EncryptionMethod); /* RSA Version 1.5 or RSA-OAEP? */ alg |= (SOAP_MEC_ENV | SOAP_MEC_ENC); if (alg & SOAP_MEC_OAEP) { security->xenc__EncryptedKey->EncryptionMethod->Algorithm = (char*)xenc_rsaesURI; security->xenc__EncryptedKey->EncryptionMethod->OAEPparams = NULL; if (!(security->xenc__EncryptedKey->EncryptionMethod->ds__DigestMethod = (struct ds__DigestMethodType*)soap_malloc(soap, sizeof(struct ds__DigestMethodType)))) return soap->error = SOAP_EOM; soap_default_ds__DigestMethodType(soap, security->xenc__EncryptedKey->EncryptionMethod->ds__DigestMethod); security->xenc__EncryptedKey->EncryptionMethod->ds__DigestMethod->Algorithm = (char*)ds_sha1URI; } else security->xenc__EncryptedKey->EncryptionMethod->Algorithm = (char*)xenc_rsa15URI; /* KeyInfo */ if (!(security->xenc__EncryptedKey->ds__KeyInfo = (_ds__KeyInfo*)soap_malloc(soap, sizeof(_ds__KeyInfo)))) return soap->error = SOAP_EOM; soap_default__ds__KeyInfo(soap, security->xenc__EncryptedKey->ds__KeyInfo); /* allocate SecurityTokenReference */ if (!(security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference = (_wsse__SecurityTokenReference*)soap_malloc(soap, sizeof(_wsse__SecurityTokenReference)))) return soap->error = SOAP_EOM; soap_default__wsse__SecurityTokenReference(soap, security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference); if (issuer && serial) { if (!(security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->ds__X509Data = (struct ds__X509DataType*)soap_malloc(soap, sizeof(struct ds__X509DataType)))) return soap->error = SOAP_EOM; soap_default_ds__X509DataType(soap, security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->ds__X509Data); if (!(security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->ds__X509Data->X509IssuerSerial = (struct ds__X509IssuerSerialType*)soap_malloc(soap, sizeof(struct ds__X509IssuerSerialType)))) return soap->error = SOAP_EOM; soap_default_ds__X509IssuerSerialType(soap, security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->ds__X509Data->X509IssuerSerial); security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->ds__X509Data->X509IssuerSerial->X509IssuerName = soap_strdup(soap, issuer); security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->ds__X509Data->X509IssuerSerial->X509SerialNumber = soap_strdup(soap, serial); } else { /* allocate KeyIdentifier */ if (!(security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier = (_wsse__KeyIdentifier*)soap_malloc(soap, sizeof(_wsse__KeyIdentifier)))) return soap->error = SOAP_EOM; soap_default__wsse__KeyIdentifier(soap, security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier); /* populate KeyIdentifier */ security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier->EncodingType = (char*)wsse_Base64BinaryURI; if (subjectkeyid) { security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier->ValueType = (char*)wsse_X509v3SubjectKeyIdentifierURI; security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier->__item = soap_s2base64(soap, (unsigned char*)subjectkeyid, NULL, strlen(subjectkeyid)); } else if (cert) { unsigned char *der, *s; int derlen; security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier->ValueType = (char*)wsse_X509v3URI; /* determine the storage requirement */ derlen = i2d_X509(cert, NULL); if (derlen < 0) return soap_wsse_fault(soap, wsse__InvalidSecurityToken, "Invalid certificate passed to soap_wsse_add_EncryptedKey_encrypt_only"); /* use the gSOAP engine's look-aside buffer to temporarily hold the cert */ if (soap_store_lab(soap, NULL, derlen)) return SOAP_EOM; s = der = (unsigned char*)soap->labbuf; /* store in DER format */ i2d_X509(cert, &s); security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier->__item = soap_s2base64(soap, der, NULL, derlen); } } /* CipherData */ if (!(security->xenc__EncryptedKey->CipherData = (xenc__CipherDataType*)soap_malloc(soap, sizeof(struct xenc__CipherDataType)))) return soap->error = SOAP_EOM; soap_default_xenc__CipherDataType(soap, security->xenc__EncryptedKey->CipherData); /* get the public key */ pubk = X509_get_pubkey(cert); if (!pubk) return soap_wsse_fault(soap, wsse__InvalidSecurityToken, "Invalid certificate passed to soap_wsse_add_EncryptedKey_encrypt_only"); /* start encryption engine, get the encrypted secret key */ key = (unsigned char*)soap_malloc(soap, soap_mec_size(alg, pubk)); if (data->mec) soap_mec_cleanup(soap, data->mec); else data->mec = (struct soap_mec_data*)SOAP_MALLOC(soap, sizeof(struct soap_mec_data)); if (soap_mec_begin(soap, data->mec, alg, pubk, key, &keylen)) { EVP_PKEY_free(pubk); return soap->error; } EVP_PKEY_free(pubk); data->enco_alg = alg; data->enco_keyname = NULL; data->enco_key = key; data->enco_keylen = keylen; if (!(security->xenc__EncryptedKey->CipherData->CipherValue = soap_s2base64(soap, key, NULL, keylen))) return soap->error = SOAP_EOM; data->encid = soap_strdup(soap, tags); if (!tags) { soap->omode |= SOAP_SEC_WSUID; if (soap_wsse_add_EncryptedKey_DataReferenceURI(soap, "#Body")) return soap->error; } else { char *s, *t; size_t l = strlen(tags); /* make space to insert # to each id converted from a tag name */ t = (char*)soap_malloc(soap, l + 2); if (!t) return soap->error = SOAP_EOM; *t = '#'; soap_strcpy(t + 1, l + 1, tags); s = soap_wsse_ids(soap, t); if (!s) return soap->error = SOAP_EOM; s++; do { t = strchr(s, ' '); if (t) { *t = '\0'; while (*++t == ' ') ; } *--s = '#'; if (soap_wsse_add_EncryptedKey_DataReferenceURI(soap, s)) return soap->error; s = t; } while (s); } soap->feltbegout = soap_wsse_element_begin_out; soap->feltendout = soap_wsse_element_end_out; return SOAP_OK; } /** @fn int soap_wsse_verify_EncryptedKey(struct soap *soap) @brief Verifies the EncryptedKey header information (certificate validity requires soap->cacert to be set). Retrieves the decryption key from the token handler callback to decrypt the decryption key. @param soap context @return SOAP_OK or error code */ int soap_wsse_verify_EncryptedKey(struct soap *soap) { _wsse__Security *security = soap_wsse_Security(soap); struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); DBGFUN("soap_wsse_verify_EncryptedKey"); if (!data) return soap_set_receiver_error(soap, "soap_wsse_verify_EncryptedKey", "Plugin not registered", SOAP_PLUGIN_ERROR); /* if we have a xenc:EncryptedKey, check it and start envelope decryption */ if (security && security->xenc__EncryptedKey) { if (!security->xenc__EncryptedKey->EncryptionMethod || !security->xenc__EncryptedKey->EncryptionMethod->Algorithm) return soap_wsse_fault(soap, wsse__InvalidSecurity, "Invalid Encryption algorithm or key"); /* verify encrypted key */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Verify EncryptedKey alg=%x\n", data->deco_alg)); if (security->xenc__EncryptedKey->ds__KeyInfo) { int keylen; if (security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference && security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier && security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier->ValueType && security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier->__item) { if (!strcmp(security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier->ValueType, wsse_X509v3URI)) { X509 *cert = NULL; #if (OPENSSL_VERSION_NUMBER >= 0x0090800fL) const unsigned char *der; #else unsigned char *der; #endif int derlen; der = (unsigned char*)soap_base642s(soap, security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier->__item, NULL, 0, &derlen); if (!der) return soap_wsse_fault(soap, wsse__InvalidSecurity, "Invalid Encryption algorithm or key"); cert = d2i_X509(&cert, &der, derlen); if (soap_wsse_verify_X509(soap, cert)) { if (cert) X509_free(cert); return soap->error; } /* get the private key from subject name of cert, if not set */ if (!data->deco_key && data->security_token_handler) { char buf[1024]; X509_NAME_oneline(X509_get_subject_name(cert), buf, sizeof(buf)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Getting private key from cert name '%s' through security_token_handler callback\n", buf)); data->deco_alg = SOAP_MEC_ENV_DEC_DES_CBC; data->deco_key = data->security_token_handler(soap, &data->deco_alg, buf, &keylen); data->deco_keylen = 0; } if (cert) X509_free(cert); } else if (!data->deco_key && data->security_token_handler && !strcmp(security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier->ValueType, wsse_X509v3SubjectKeyIdentifierURI)) { int subjectkeyidlen; const char *subjectkeyid = (char*)soap_base642s(soap, security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier->__item, NULL, 0, &subjectkeyidlen); /* get the private key from subject key id */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Getting private key from key id '%s' through security_token_handler callback\n", subjectkeyid)); data->deco_alg = SOAP_MEC_ENV_DEC_DES_CBC; data->deco_key = data->security_token_handler(soap, &data->deco_alg, subjectkeyid, &keylen); data->deco_keylen = 0; } } else if (!data->deco_key && data->security_token_handler) { const char *name = NULL; /* get the private key from key name or subject name */ if (security->xenc__EncryptedKey->ds__KeyInfo->KeyName) name = security->xenc__EncryptedKey->ds__KeyInfo->KeyName; else if (security->xenc__EncryptedKey->ds__KeyInfo->X509Data && security->xenc__EncryptedKey->ds__KeyInfo->X509Data->X509SubjectName) name = security->xenc__EncryptedKey->ds__KeyInfo->X509Data->X509SubjectName; if (name) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Getting private key from name '%s' through security_token_handler callback\n", name)); data->deco_alg = SOAP_MEC_ENV_DEC_DES_CBC; data->deco_key = data->security_token_handler(soap, &data->deco_alg, name, &keylen); data->deco_keylen = 0; } } } /* start decryption */ if (data->deco_key && security->xenc__EncryptedKey->CipherData && security->xenc__EncryptedKey->CipherData->CipherValue) { int keylen; unsigned char *key = (unsigned char*)soap_base642s(soap, security->xenc__EncryptedKey->CipherData->CipherValue, NULL, 0, &keylen); if (!strcmp(security->xenc__EncryptedKey->EncryptionMethod->Algorithm, xenc_rsaesURI)) data->deco_alg |= SOAP_MEC_OAEP; else if (strcmp(security->xenc__EncryptedKey->EncryptionMethod->Algorithm, xenc_rsa15URI)) return soap_wsse_fault(soap, wsse__InvalidSecurity, "Invalid Encryption algorithm or key"); if (data->mec) soap_mec_cleanup(soap, data->mec); else data->mec = (struct soap_mec_data*)SOAP_MALLOC(soap, sizeof(struct soap_mec_data)); if (soap_mec_begin(soap, data->mec, data->deco_alg, (SOAP_MEC_KEY_TYPE*)data->deco_key, key, &keylen)) return soap_wsse_fault(soap, wsse__FailedCheck, NULL); } /* do not process EncryptedKey again */ security->xenc__EncryptedKey = NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Verified EncryptedKey alg=%x\n", data->deco_alg)); } return SOAP_OK; } /** @fn void soap_wsse_delete_EncryptedKey(struct soap *soap) @brief Deletes EncryptedKey header element. @param soap context */ void soap_wsse_delete_EncryptedKey(struct soap *soap) { _wsse__Security *security = soap_wsse_Security(soap); DBGFUN("soap_wsse_delete_EncryptedKey"); if (security) security->xenc__EncryptedKey = NULL; } /** @fn xenc__EncryptedKeyType* soap_wsse_EncryptedKey(struct soap *soap) @brief Returns EncryptedKey header element if present. @param soap context @return xenc__EncryptedKeyType object or NULL */ struct xenc__EncryptedKeyType* soap_wsse_EncryptedKey(struct soap *soap) { _wsse__Security *security = soap_wsse_Security(soap); if (security) return security->xenc__EncryptedKey; return NULL; } /******************************************************************************\ * * wsse:Security/xenc:EncryptedKey/ReferenceList/DataReference * \******************************************************************************/ /** @fn int soap_wsse_add_EncryptedKey_DataReferenceURI(struct soap *soap, const char *URI) @brief Adds a DataReference URI to the EncryptedKey header element. @param soap context @param[in] URI value of the URI ID @return SOAP_OK or error code */ int soap_wsse_add_EncryptedKey_DataReferenceURI(struct soap *soap, const char *URI) { _wsse__Security *security = soap_wsse_add_Security(soap); _xenc__ReferenceList *ref; int k, n = 0; DBGFUN1("soap_wsse_add_EncryptedKey_DataReferenceURI", "URI=%s", URI?URI:""); if (!security->xenc__EncryptedKey) { if (!(security->xenc__EncryptedKey = (xenc__EncryptedKeyType*)soap_malloc(soap, sizeof(xenc__EncryptedKeyType)))) return soap->error = SOAP_EOM; soap_default_xenc__EncryptedKeyType(soap, security->xenc__EncryptedKey); } if (!security->xenc__EncryptedKey->ReferenceList) { if (!(security->xenc__EncryptedKey->ReferenceList = (struct _xenc__ReferenceList*)soap_malloc(soap, sizeof(struct _xenc__ReferenceList)))) return soap->error = SOAP_EOM; soap_default__xenc__ReferenceList(soap, security->xenc__EncryptedKey->ReferenceList); } ref = security->xenc__EncryptedKey->ReferenceList; k = ref->__size_ReferenceList++; /* need to increase space? */ if (k < 0) return soap->error = SOAP_EOM; if (k == 0) n = 1; else if (k >= 1 && (k & (k - 1)) == 0) n = 2 * k; /* yes we do */ if (n) { struct __xenc__union_ReferenceList *tmp = (struct __xenc__union_ReferenceList*)soap_malloc(soap, n * sizeof(struct __xenc__union_ReferenceList)); int i; if (!tmp) return soap->error = SOAP_EOM; for (i = 0; i < k; i++) tmp[i] = ref->__union_ReferenceList[i]; security->xenc__EncryptedKey->ReferenceList->__union_ReferenceList = tmp; ref = security->xenc__EncryptedKey->ReferenceList; } /* add entry */ soap_default___xenc__union_ReferenceList(soap, &ref->__union_ReferenceList[k]); if (!(ref->__union_ReferenceList[k].DataReference = (struct xenc__ReferenceType*)soap_malloc(soap, sizeof(struct xenc__ReferenceType)))) return soap->error = SOAP_EOM; soap_default_xenc__ReferenceType(soap, ref->__union_ReferenceList[k].DataReference); ref->__union_ReferenceList[k].DataReference->URI = soap_strdup(soap, URI); return SOAP_OK; } /** @fn int soap_wsse_add_DataReferenceURI(struct soap *soap, const char *URI) @brief Adds a DataReference URI to the WS-Security header element. @param soap context @param[in] URI value of the URI ID @return SOAP_OK or error code */ int soap_wsse_add_DataReferenceURI(struct soap *soap, const char *URI) { _wsse__Security *security = soap_wsse_add_Security(soap); _xenc__ReferenceList *ref; int k, n = 0; DBGFUN1("soap_wsse_add_DataReferenceURI", "URI=%s", URI?URI:""); /* initial alloc */ if (!security->xenc__ReferenceList) { if (!(security->xenc__ReferenceList = (struct _xenc__ReferenceList*)soap_malloc(soap, sizeof(struct _xenc__ReferenceList)))) return soap->error = SOAP_EOM; soap_default__xenc__ReferenceList(soap, security->xenc__ReferenceList); } ref = security->xenc__ReferenceList; k = ref->__size_ReferenceList++; /* need to increase space? */ if (k < 0) return soap->error = SOAP_EOM; if (k == 0) n = 1; else if (k >= 1 && (k & (k - 1)) == 0) n = 2 * k; /* yes we do */ if (n) { struct __xenc__union_ReferenceList *tmp = (struct __xenc__union_ReferenceList*)soap_malloc(soap, n * sizeof(struct __xenc__union_ReferenceList)); int i; if (!tmp) return soap->error = SOAP_EOM; for (i = 0; i < k; i++) tmp[i] = ref->__union_ReferenceList[i]; security->xenc__ReferenceList->__union_ReferenceList = tmp; ref = security->xenc__ReferenceList; } /* add entry */ soap_default___xenc__union_ReferenceList(soap, &ref->__union_ReferenceList[k]); if (!(ref->__union_ReferenceList[k].DataReference = (struct xenc__ReferenceType*)soap_malloc(soap, sizeof(struct xenc__ReferenceType)))) return soap->error = SOAP_EOM; soap_default_xenc__ReferenceType(soap, ref->__union_ReferenceList[k].DataReference); ref->__union_ReferenceList[k].DataReference->URI = soap_strdup(soap, URI); return SOAP_OK; } /******************************************************************************\ * * xenc:EncryptedData * \******************************************************************************/ /** @fn int soap_wsse_add_EncryptedData_KeyInfo_KeyName(struct soap *soap, const char *keyname) @brief Adds EncryptedData/ds:KeyInfo/Keyname elements. @param soap context @param[in] keyname name of the key @return SOAP_OK or error code This function adds the name of the key to each EncryptedData element to identify the shared secret key used for encryption. */ int soap_wsse_add_EncryptedData_KeyInfo_KeyName(struct soap *soap, const char *keyname) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); DBGFUN("soap_wsse_add_EncryptedData_KeyInfo_KeyName"); if (!data) return soap_set_receiver_error(soap, "soap_wsse_add_EncryptedData_KeyInfo_KeyName", "Plugin not registered", SOAP_PLUGIN_ERROR); data->enco_keyname = soap_strdup(soap, keyname); return SOAP_OK; } /******************************************************************************\ * * Faults * \******************************************************************************/ /** @fn int soap_wsse_sender_fault_subcode(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail) @brief Sets sender SOAP Fault (sub)code for server fault response. @param soap context @param[in] faultsubcode sub code string @param[in] faultstring fault string @param[in] faultdetail detail string @return SOAP_FAULT */ int soap_wsse_sender_fault_subcode(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail) { #if defined(SOAP_WSA_2003) || defined(SOAP_WSA_2004) || defined(SOAP_WSA_200408) || defined(SOAP_WSA_2005) return soap_wsa_sender_fault_subcode(soap, faultsubcode, faultstring, faultdetail); #else return soap_sender_fault_subcode(soap, faultsubcode, faultstring, faultdetail); #endif } /** @fn int soap_wsse_receiver_fault_subcode(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail) @brief Sets receiver SOAP Fault (sub)code for server fault response. @param soap context @param[in] faultsubcode sub code string @param[in] faultstring fault string @param[in] faultdetail detail string @return SOAP_FAULT */ int soap_wsse_receiver_fault_subcode(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail) { #if defined(SOAP_WSA_2003) || defined(SOAP_WSA_2004) || defined(SOAP_WSA_200408) || defined(SOAP_WSA_2005) return soap_wsa_receiver_fault_subcode(soap, faultsubcode, faultstring, faultdetail); #else return soap_receiver_fault_subcode(soap, faultsubcode, faultstring, faultdetail); #endif } /** @fn int soap_wsse_sender_fault(struct soap *soap, const char *faultstring, const char *faultdetail) @brief Sets sender SOAP Fault for server fault response. @param soap context @param[in] faultstring fault string @param[in] faultdetail detail string @return SOAP_FAULT */ int soap_wsse_sender_fault(struct soap *soap, const char *faultstring, const char *faultdetail) { return soap_wsse_sender_fault_subcode(soap, NULL, faultstring, faultdetail); } /** @fn int soap_wsse_receiver_fault(struct soap *soap, const char *faultstring, const char *faultdetail) @brief Sets receiver SOAP Fault for server fault response. @param soap context @param[in] faultstring fault string @param[in] faultdetail detail string @return SOAP_FAULT */ int soap_wsse_receiver_fault(struct soap *soap, const char *faultstring, const char *faultdetail) { return soap_wsse_receiver_fault_subcode(soap, NULL, faultstring, faultdetail); } /** @fn int soap_wsse_fault(struct soap *soap, wsse__FaultcodeEnum fault, const char *detail) @brief Sets SOAP Fault (sub)code for server response. @param soap context @param[in] fault is one of wsse:FaultcodeEnum @param[in] detail string with optional text message @return SOAP_FAULT */ int soap_wsse_fault(struct soap *soap, wsse__FaultcodeEnum fault, const char *detail) { const char *code = soap_wsse__FaultcodeEnum2s(soap, fault); DBGFUN2("soap_wsse_fault", "fault=%s", code?code:"", "detail=%s", detail?detail:""); /* remove incorrect or incomplete Security header */ soap_wsse_delete_Security(soap); /* populate the SOAP Fault as per WS-Security spec */ /* detail = NULL; */ /* uncomment when detail text not recommended */ /* use WSA to populate the SOAP Header when WSA is used */ switch (fault) { case wsse__UnsupportedSecurityToken: return soap_wsse_sender_fault_subcode(soap, code, "An unsupported token was provided", detail); case wsse__UnsupportedAlgorithm: return soap_wsse_sender_fault_subcode(soap, code, "An unsupported signature or encryption algorithm was used", detail); case wsse__InvalidSecurity: return soap_wsse_sender_fault_subcode(soap, code, "An error was discovered processing the header", detail); case wsse__InvalidSecurityToken: return soap_wsse_sender_fault_subcode(soap, code, "An invalid security token was provided", detail); case wsse__FailedAuthentication: return soap_wsse_sender_fault_subcode(soap, code, "The security token could not be authenticated or authorized", detail); case wsse__FailedCheck: return soap_wsse_sender_fault_subcode(soap, code, "The signature or decryption was invalid", detail); case wsse__SecurityTokenUnavailable: return soap_wsse_sender_fault_subcode(soap, code, "Referenced security token could not be retrieved", detail); } return SOAP_FAULT; } /******************************************************************************\ * * Digest authentication session management * \******************************************************************************/ /** @fn static int soap_wsse_session_verify(struct soap *soap, const char hash[SOAP_SMD_SHA1_SIZE], const char *created, const char *nonce) @brief Verifies and updates the digest, nonce, and creation time against the digest authentication session database to prevent replay attacks. @param soap context @param[in] hash binary digest value of PasswordDigest @param[in] created string @param[in] nonce string (base64) @return SOAP_OK or SOAP_FAULT */ static int soap_wsse_session_verify(struct soap *soap, const char hash[SOAP_SMD_SHA1_SIZE], const char *created, const char *nonce) { struct soap_wsse_session *session; time_t expired, now = time(NULL); DBGFUN("soap_wsse_session_verify"); soap_s2dateTime(soap, created, &expired); /* creation time in the future? */ if (expired > now + SOAP_WSSE_CLKSKEW) return soap_wsse_fault(soap, wsse__FailedAuthentication, "Authorization request in future"); expired += SOAP_WSSE_NONCETIME; /* expired? */ if (expired <= now) return soap_wsse_fault(soap, wsse__FailedAuthentication, "Authentication expired"); /* purge expired messages, but don't do this all the time to improve efficiency */ if (now % 10 == 0) soap_wsse_session_cleanup(soap); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Verifying session nonce=%s\n", nonce)); /* enter mutex to check and update session */ MUTEX_LOCK(soap_wsse_session_lock); for (session = soap_wsse_session; session; session = session->next) { if (!memcmp(session->hash, hash, SOAP_SMD_SHA1_SIZE) && !strcmp(session->nonce, nonce)) break; } /* if not found, allocate new session data */ if (!session) { size_t l = strlen(nonce); session = (struct soap_wsse_session*)malloc(sizeof(struct soap_wsse_session) + l); if (session) { session->next = soap_wsse_session; session->expired = expired; soap_memcpy((void*)session->hash, sizeof(session->hash), (const void*)hash, SOAP_SMD_SHA1_SIZE); soap_strcpy(session->nonce, l + 1, nonce); soap_wsse_session = session; } session = NULL; } /* exit mutex */ MUTEX_UNLOCK(soap_wsse_session_lock); /* if replay attack, return non-descript failure */ if (session) return soap_wsse_fault(soap, wsse__FailedAuthentication, NULL); return SOAP_OK; } /** @fn static void soap_wsse_session_cleanup(struct soap *soap) @brief Removes expired authentication data from the digest authentication session database. @param soap context */ static void soap_wsse_session_cleanup(struct soap *soap) { struct soap_wsse_session **session; time_t now = time(NULL); DBGFUN("soap_wsse_session_cleanup"); /* enter mutex to purge expired session data */ MUTEX_LOCK(soap_wsse_session_lock); session = &soap_wsse_session; while (*session) { if ((*session)->expired < now) { struct soap_wsse_session *p = *session; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Deleting session nonce=%s\n", p->nonce)); *session = p->next; free(p); } else session = &(*session)->next; } /* exit mutex */ MUTEX_UNLOCK(soap_wsse_session_lock); } /******************************************************************************\ * * Calculate SHA1(created, nonce, password) digest * \******************************************************************************/ /** @fn static void calc_digest(struct soap *soap, const char *created, const char *nonce, int noncelen, const char *password, char hash[SOAP_SMD_SHA1_SIZE]) @brief Calculates digest value SHA1(created, nonce, password) @param soap context @param[in] created string (XSD dateTime format) @param[in] nonce value @param[in] noncelen length of nonce value @param[in] password string @param[out] hash SHA1 digest */ static void calc_digest(struct soap *soap, const char *created, const char *nonce, int noncelen, const char *password, char hash[SOAP_SMD_SHA1_SIZE]) { struct soap_smd_data context; /* use smdevp engine */ soap_smd_init(soap, &context, SOAP_SMD_DGST_SHA1, NULL, 0); soap_smd_update(soap, &context, nonce, noncelen); soap_smd_update(soap, &context, created, strlen(created)); soap_smd_update(soap, &context, password, strlen(password)); soap_smd_final(soap, &context, hash, NULL); } /******************************************************************************\ * * Calculate randomized hex nonce * \******************************************************************************/ /** @fn static void calc_nonce(char nonce[SOAP_WSSE_NONCELEN]) @brief Calculates randomized nonce (also uses time() in case a poorly seeded PRNG is used) @param[out] nonce value [0..SOAP_WSSE_NONCELEN-1] */ static void calc_nonce(char nonce[SOAP_WSSE_NONCELEN]) { int i; time_t r = time(NULL); soap_memcpy((void*)nonce, SOAP_WSSE_NONCELEN, (const void*)&r, 4); for (i = 4; i < SOAP_WSSE_NONCELEN; i += 4) { r = soap_random; soap_memcpy((void*)(nonce + i), 4, (const void*)&r, 4); } } /******************************************************************************\ * * Plugin registry functions * \******************************************************************************/ /** @fn int soap_wsse(struct soap *soap, struct soap_plugin *p, void *arg) @brief Plugin registry function, used with soap_register_plugin. @param soap context @param[in,out] p plugin created in registry @param[in] arg passed from soap_register_plugin_arg is an optional security token handler callback @return SOAP_OK */ int soap_wsse(struct soap *soap, struct soap_plugin *p, void *arg) { static int done = 0; DBGFUN("soap_wsse"); p->id = soap_wsse_id; p->data = (void*)SOAP_MALLOC(soap, sizeof(struct soap_wsse_data)); p->fcopy = soap_wsse_copy; p->fdelete = soap_wsse_delete; if (p->data) { if (soap_wsse_init(soap, (struct soap_wsse_data*)p->data, (const void *(*)(struct soap*, int*, const char*, int*))arg)) { SOAP_FREE(soap, p->data); return SOAP_EOM; } } if (!done) { #if 0 #ifdef WIN32 /* now uses CreateMutex() for static lock initialization */ static volatile long spinlock = 0; DWORD s = 0; /* Initialize soap_wsse_session_lock with a spinlock */ while (InterlockedExchange(&spinlock, 1) == 1) { Sleep(s); s = !s; } if (!done) MUTEX_SETUP(soap_wsse_session_lock); done = 1; spinlock = 0; #else done = 1; #endif #endif #ifdef WITH_OPENSSL /* moved to stdsoap2.c MUTEX_LOCK(soap_wsse_session_lock); OpenSSL_add_all_digests(); OpenSSL_add_all_algorithms(); MUTEX_UNLOCK(soap_wsse_session_lock); */ #endif } return SOAP_OK; } /** @fn int soap_wsse_init(struct soap *soap, struct soap_wsse_data *data, const void *(*arg)(struct soap*, int*, const char*, int*)) @brief Initializes plugin data. @param soap context @param[in,out] data plugin data @param arg security token handler callback @return SOAP_OK */ static int soap_wsse_init(struct soap *soap, struct soap_wsse_data *data, const void *(*arg)(struct soap*, int *alg, const char *keyname, int *keylen)) { DBGFUN("soap_wsse_init"); data->sigid = NULL; data->encid = NULL; data->prefixlist = NULL; data->sign_alg = SOAP_SMD_NONE; data->sign_key = NULL; data->sign_keylen = 0; data->vrfy_alg = SOAP_SMD_NONE; data->vrfy_key = NULL; data->vrfy_keylen = 0; data->enco_alg = SOAP_MEC_NONE; data->enco_keyname = NULL; data->enco_key = NULL; data->enco_keylen = 0; data->deco_alg = SOAP_MEC_NONE; data->deco_key = NULL; data->deco_keylen = 0; data->digest = NULL; data->fpreparesend = NULL; data->fpreparefinalsend = NULL; data->fpreparefinalrecv = NULL; data->fheader = soap->fheader; soap->fheader = soap_wsse_header; data->mec = NULL; data->store = NULL; data->security_token_handler = arg; soap->feltbegin = soap_wsse_element_begin_in; soap->feltendin = soap_wsse_element_end_in; return SOAP_OK; } /** @fn int soap_wsse_copy(struct soap *soap, struct soap_plugin *dst, struct soap_plugin *src) @brief Copies plugin data to localize plugin data for threads. @param soap context @param[out] dst target plugin @param[in] src source plugin @return SOAP_OK */ static int soap_wsse_copy(struct soap *soap, struct soap_plugin *dst, struct soap_plugin *src) { DBGFUN("soap_wsse_copy"); *dst = *src; dst->data = (void*)SOAP_MALLOC(soap, sizeof(struct soap_wsse_data)); soap_wsse_init(soap, (struct soap_wsse_data*)dst->data, ((struct soap_wsse_data*)src->data)->security_token_handler); return SOAP_OK; } /** @fn void soap_wsse_delete(struct soap *soap, struct soap_plugin *p) @brief Deletes plugin data. @param soap context @param[in,out] p plugin @return SOAP_OK */ static void soap_wsse_delete(struct soap *soap, struct soap_plugin *p) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); (void)p; DBGFUN("soap_wsse_delete"); if (data) { if (data->prefixlist) SOAP_FREE(soap, data->prefixlist); soap_wsse_preparecleanup(soap, data); if (data->mec) { soap_mec_cleanup(soap, data->mec); SOAP_FREE(soap, data->mec); data->mec = NULL; } if (data->store) { X509_STORE_free(data->store); data->store = NULL; } SOAP_FREE(soap, data); } } /******************************************************************************\ * * Plugin-specific functions * \******************************************************************************/ /** @fn int soap_wsse_set_wsu_id(struct soap *soap, const char *tags) @brief Sets the elements that are to be extended with wsu:Id attributes. The wsu:Id attribute values are set to the string value of the tag's QName by replacing colons with hyphens to produce an xsd:ID value. @param soap context @param[in] tags string of space-separated qualified and unqualified element tag names @return SOAP_OK */ int soap_wsse_set_wsu_id(struct soap *soap, const char *tags) { DBGFUN1("soap_wsse_set_wsu_id", "tags=%s", tags?tags:"(null)"); soap->wsuid = soap_strdup(soap, tags); return SOAP_OK; } /** @fn int soap_wsse_set_InclusiveNamespaces(struct soap *soap, const char *prefixlist) @brief Sets the C14N InclusiveNamespaces Prefix List property. @param soap context @param[in] prefixlist string of space-separated namespace prefixes, or NULL to remove @return SOAP_OK */ int soap_wsse_set_InclusiveNamespaces(struct soap *soap, const char *prefixlist) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); DBGFUN1("soap_wsse_set_InclusiveNamespaces", "prefixlist=%s", prefixlist?prefixlist:"(null)"); if (data) { size_t l = strlen(prefixlist); char *s; if (data->prefixlist) SOAP_FREE(soap, data->prefixlist); s = (char*)SOAP_MALLOC(soap, l + 1); soap_strcpy(s, l + 1, prefixlist); data->prefixlist = s; } return SOAP_OK; } /** @fn int soap_wsse_sign_only(struct soap *soap, const char *tags) @brief Filters only the specified wsu:Id names for signing. Can be used with soap_wsse_set_wsu_id() and if so should use the element tag names. @param soap context @param[in] tags string of space-separated qualified and unqualified tag names @return SOAP_OK */ int soap_wsse_sign_only(struct soap *soap, const char *tags) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); DBGFUN1("soap_wsse_sign_only", "tags=%s", tags?tags:"(null)"); if (data) data->sigid = soap_wsse_ids(soap, tags); return SOAP_OK; } /** @fn static char* soap_wsse_ids(struct soap *soap, const char *tags) @brief converts tag name(s) to id name(s) @param soap context @param[in] tags string of space-separated (un)qualified tag names @return string of ids */ static char* soap_wsse_ids(struct soap *soap, const char *tags) { char *s, *t; s = t = soap_strdup(soap, tags); while (s && *s) { if (*s == ':') *s = '-'; s++; } return t; } /** @fn int soap_wsse_sign(struct soap *soap, int alg, const void *key, int keylen) @brief Uses the wsse plugin to sign all wsu:Id attributed elements. @param soap context @param[in] alg is the signature algorithm, such as SOAP_SMD_HMAC_SHA1/224/256/384/512, SOAP_SMD_SIGN_DSA_SHA1/256, SOAP_SMD_SIGN_RSA_SHA1/224/256/384/512, or SOAP_SMD_SIGN_ECDSA_SHA1/224/256/384/512 @param[in] key is the HMAC secret key or DSA/RSA/ECDSA private EVP_PKEY @param[in] keylen is the HMAC key length @return SOAP_OK or fault This function does not actually sign the message, but initiates the plugin's signature algorithm to sign the message upon message transfer. */ int soap_wsse_sign(struct soap *soap, int alg, const void *key, int keylen) { struct soap_wsse_digest *digest, *next; struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); DBGFUN1("soap_wsse_sign", "alg=%x", alg); if (!data) return soap_set_receiver_error(soap, "soap_wsse_sign", "Plugin not registered", SOAP_PLUGIN_ERROR); if (!alg || !key) return soap_wsse_fault(soap, wsse__InvalidSecurity, "Invalid signature algorithm or key"); /* store alg and key in plugin data */ data->sign_alg = alg; data->sign_key = key; data->sign_keylen = keylen; /* save and set the plugin's callbacks to preprocess outbound messages */ if (soap->fpreparesend != soap_wsse_preparesend) { data->fpreparesend = soap->fpreparesend; data->fpreparefinalsend = soap->fpreparefinalsend; } if (soap->fpreparefinalsend != soap_wsse_preparefinalsend) { soap->fpreparesend = soap_wsse_preparesend; soap->fpreparefinalsend = soap_wsse_preparefinalsend; } /* support HTTP compression only with HTTP chunking to allow signing XML */ if ((soap->omode & SOAP_ENC_ZLIB)) soap->omode = (soap->omode & ~SOAP_IO) | SOAP_IO_CHUNK; else if ((soap->omode & SOAP_IO) == SOAP_IO_STORE) /* no store buffering */ soap->omode = (soap->omode & ~SOAP_IO) | SOAP_IO_BUFFER; /* cleanup the digest data */ for (digest = data->digest; digest; digest = next) { next = digest->next; SOAP_FREE(soap, digest); } data->digest = NULL; return SOAP_OK; } /** @fn int soap_wsse_sign_body(struct soap *soap, int alg, const void *key, int keylen) @brief Uses the wsse plugin to sign all wsu:Id attributed elements, including the SOAP Body (by adding a wsu:Id="Body" attribute). @param soap context @param[in] alg is the signature algorithm, such as SOAP_SMD_HMAC_SHA1/224/256/384/512, SOAP_SMD_SIGN_DSA_SHA1/256, SOAP_SMD_SIGN_RSA_SHA1/224/256/384/512, or SOAP_SMD_SIGN_ECDSA_SHA1/224/256/384/512 @param[in] key is the HMAC secret key or DSA/RSA/ECDSA private EVP_PKEY @param[in] keylen is the HMAC key length @return SOAP_OK or fault This function does not actually sign the message, but initiates the plugin's signature algorithm to sign the message upon message transfer. */ int soap_wsse_sign_body(struct soap *soap, int alg, const void *key, int keylen) { DBGFUN1("soap_wsse_sign_body", "alg=%x", alg); soap_wsse_add_Security(soap); soap->omode |= SOAP_SEC_WSUID; return soap_wsse_sign(soap, alg, key, keylen); } /** @fn int soap_wsse_verify_init(struct soap *soap) @brief Uses the wsse plugin to initiate the verification of the signature and SignedInfo Reference digests. @param soap context @return SOAP_OK This function does not actually verify the message, but initiates the plugin's data to store the message in a DOM to verify the signature. The signature and digests in the DOM must be verified manually. */ int soap_wsse_verify_init(struct soap *soap) { DBGFUN("soap_wsse_verify_init"); /* deserialize inbound message to DOM */ soap->imode |= SOAP_XML_DOM; return SOAP_OK; } /** @fn int soap_wsse_verify_auto(struct soap *soap, int alg, const void *key, size_t keylen) @brief Uses the wsse plugin to initiate the automatic verification of the signature and SignedInfo Reference digests. @param soap context @param[in] alg to verify signature if signature has no secret or public key, use SOAP_SMD_NONE to omit @param[in] key is HMAC key or a DSA/RSA/ECDSA EVP_PKEY or NULL @param[in] keylen is HMAC key length or 0 @return SOAP_OK This function does not actually verify the message, but initiates the plugin's algorithm to store the message in a DOM to automatically verify the signature and digests. If the message does not contain a key to verify the signature, the alg, key, and keylen parameters are used. It is important that the X509 certificate used to verify the signature, which requires soap->cafile and/or soap->capath to be set. */ int soap_wsse_verify_auto(struct soap *soap, int alg, const void *key, size_t keylen) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); DBGFUN("soap_wsse_verify_auto"); if (!data) return soap_set_receiver_error(soap, "soap_wsse_verify_auto", "Plugin not registered", SOAP_PLUGIN_ERROR); data->vrfy_alg = alg; data->vrfy_key = key; data->vrfy_keylen = keylen; if (soap->fpreparefinalrecv != soap_wsse_preparefinalrecv) { data->fpreparefinalrecv = soap->fpreparefinalrecv; soap->fpreparefinalrecv = soap_wsse_preparefinalrecv; } return soap_wsse_verify_init(soap); } /** @fn int soap_wsse_verify_done(struct soap *soap) @brief Terminates the automatic verification of signatures. @param soap context @return SOAP_OK */ int soap_wsse_verify_done(struct soap *soap) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); DBGFUN("soap_wsse_verify_done"); if (!data) return soap_set_receiver_error(soap, "soap_wsse_verify_done", "Plugin not registered", SOAP_PLUGIN_ERROR); soap->imode &= ~SOAP_XML_DOM; soap->omode &= ~SOAP_SEC_WSUID; if (soap->fpreparefinalrecv == soap_wsse_preparefinalrecv) soap->fpreparefinalrecv = data->fpreparefinalrecv; return SOAP_OK; } /** @fn size_t soap_wsse_verify_element(struct soap *soap, const char *URI, const char *tag) @brief Post-checks the presence of signed element(s). Does not verify the signature of these elements, which is done with @ref soap_wsse_verify_auto. @param soap context @param URI namespace of element(s) @param tag name of element(s) @return number of matching elements signed. This function does not actually verify the signature of each element, but checks whether the elements are signed and thus their integrity is preserved. Signed element nesting rules are obeyed, so if the matching element is a descendent of a signed element, it is signed as well. Thus, the verification process follows nesting rules. Client should call this function after invocation. Services should call this function inside a service operation. This function traverses the entire DOM, so performance is determined by the size of a message. To check the SOAP Body (either using SOAP 1.1 or 1.2), @ref soap_wsse_verify_element(soap, namespaces[0].ns, "Body"). To check whether the Timestamp was signed (assuming it is present and message expiration checked with @ref soap_wsse_verify_Timestamp), use @ref soap_wsse_verify_element(soap, "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd", "Timestamp"). @note For future releases, XPath queries (or forms of these) will be considered. */ size_t soap_wsse_verify_element(struct soap *soap, const char *URI, const char *tag) { ds__SignedInfoType *signedInfo = soap_wsse_SignedInfo(soap); size_t count = 0; DBGFUN("soap_wsse_verify_element"); if (signedInfo && soap->dom) { struct soap_dom_element *elt; /* traverse the DOM */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SignedInfo and DOM found\n")); elt = soap->dom; while (elt) { /* find wsu:Id or ds:Id and check for Id in signedInfo */ int ok = 0; struct soap_dom_attribute *att; for (att = elt->atts; att; att = att->next) { if (att->name && att->nstr && (!strcmp(att->nstr, wsu_URI) || !strcmp(att->nstr, ds_URI)) && (!strcmp(att->name, "Id") || !soap_tag_cmp(att->name, "*:Id"))) { /* Id attribute found, search Id value in ds:Reference/@URI */ int i; for (i = 0; i < signedInfo->__sizeReference; i++) { ds__ReferenceType *reference = signedInfo->Reference[i]; if (reference->URI && *reference->URI == '#' && !strcmp(reference->URI + 1, att->text)) { ok = 1; break; } } if (ok) break; } } /* the current element is signed, count this and the matching nested */ if (ok) { count += soap_wsse_verify_nested(soap, elt, URI, tag); /* go to next sibling or back up */ if (elt->next) elt = elt->next; else { do elt = elt->prnt; while (elt && !elt->next); if (elt) elt = elt->next; } } else elt = soap_dom_next_element(elt, NULL); } } return count; } /** @fn size_t soap_wsse_verify_nested(struct soap *soap, struct soap_dom_element *dom, const char *URI, const char *tag) @brief Counts signed matching elements from the dom node and down. @param soap context @param dom node to check and down @param URI namespace of element(s) @param tag name of element(s) @return number of matching elements. */ static size_t soap_wsse_verify_nested(struct soap *soap, struct soap_dom_element *dom, const char *URI, const char *tag) { size_t count = 0; /* search the DOM node and descendants for matching elements */ struct soap_dom_element *elt = dom; for (elt = dom; elt && elt != dom->next && elt != dom->prnt; elt = soap_dom_next_element(elt, NULL)) { if (elt->name && ((!elt->nstr && !URI) || (elt->nstr && URI && !strcmp(elt->nstr, URI)))) { const char *s = strchr(elt->name, ':'); if (s) s++; else s = elt->name; /* found element? */ if (!strcmp(s, tag)) count++; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element '%s' (\"%s\":%s) is signed\n", elt->name, elt->nstr, elt->name)); } return count; } /** @fn int soap_wsse_verify_body(struct soap *soap) @brief Post-checks the presence of signed SOAP Body. Does not verify the signature of the Body, which is done with @ref soap_wsse_verify_auto. @param soap context @return SOAP_OK (signed) or SOAP_FAULT This function does not actually verify the signature of the Body. It checks whether the Body is signed and thus its integrity is preserved. Clients should call this function after invocation. Services should call this function inside a service operation. This function traverses the entire DOM, so performance is determined by the size of a message. */ int soap_wsse_verify_body(struct soap *soap) { const char *ns = NULL; /* Are we using SOAP 1.1 or 1.2? Check first row of namespace table */ if (soap->local_namespaces) { if (soap->local_namespaces->out) ns = soap->local_namespaces->out; else if (soap->local_namespaces->ns) ns = soap->local_namespaces->ns; } /* We don't know if we're using SOAP 1.1 or 1.2, so assume it is 1.2 */ if (!ns) ns = "http://www.w3.org/2003/05/soap-envelope"; if (soap_wsse_verify_element(soap, ns, "Body") > 0) return SOAP_OK; return soap_wsse_sender_fault(soap, "Message body not signed", NULL); } /** @fn int soap_wsse_encrypt_body(struct soap *soap, int alg, const void *key, int keylen) @brief Initiates the encryption of the SOAP Body. The algorithm should be SOAP_MEC_ENC_DES_CBC etc. for symmetric encryption. Use soap_wsse_add_EncryptedKey for public key encryption. @param soap context @param[in] alg the encryption algorithm, should be SOAP_MEC_ENC_DES_CBC etc. @param[in] key a certificate with public key for encryption, a DES CBC 160-bit key or AES key @param[in] keylen the symmetric encryption key length, 20 bytes for a DES CBC 160-bit key @return SOAP_OK or error code This function initiates the encryption of the SOAP Body using an RSA public key or a symmetric shared secret key. No WS-Security EncryptedKey header will be set. Use soap_wsse_add_EncryptedKey instead for public key encryption. */ int soap_wsse_encrypt_body(struct soap *soap, int alg, const void *key, int keylen) { struct soap_wsse_data *data; DBGFUN1("soap_wsse_encrypt_body", "alg=%x", alg); data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); if (!data) return soap_set_receiver_error(soap, "soap_wsse_encrypt_body", "Plugin not registered", SOAP_PLUGIN_ERROR); data->encid = NULL; soap->omode |= SOAP_SEC_WSUID; soap_wsse_add_DataReferenceURI(soap, "#Body"); return soap_wsse_encrypt(soap, alg, key, keylen); } /** @fn int soap_wsse_encrypt_only(struct soap *soap, int alg, const void *key, int keylen, const char *tags) @brief Initiates the encryption of XML elements specified in the tags string. Should be used in combination with soap_wsse_set_wsu_id to set wsu:Id for given XML element tags. The algorithm should be SOAP_MEC_ENC_DES_CBC etc. for symmetric encryption. Use soap_wsse_add_EncryptedKey_encrypt_only for public key encryption. @param soap context @param[in] alg the encryption algorithm, should be SOAP_MEC_ENC_DES_CBC etc. @param[in] key a certificate with public key for encryption, a DES CBC 160-bit key or AES key @param[in] keylen the symmetric encryption key length, 20 bytes for a DES CBC 160-bit key @param[in] tags string of space-separated qualified and unqualified tag names @return SOAP_OK or error code This function initiates the encryption using an RSA public key or a symmetric shared secret key. No WS-Security EncryptedKey header will be set. Use soap_wsse_add_EncryptedKey instead for public key encryption. @warning Use @ref soap_wsse_add_EncryptedKey_encrypt_only only in combination with @ref soap_wsse_set_wsu_id with the tag names of the elements to be encrypted. OTHERWISE THE GIVEN XML ELEMENTS ARE NOT ENCRYPTED AND WILL BE SENT IN THE CLEAR. @warning The elements identified with @ref soap_wsse_set_wsu_id to encrypt MUST occur EXACTLY ONCE in the SOAP Body. @warning Encryption/decryption of elements with simple content (CDATA content) IS NOT SUPPORTED. This means that elements you want to encrypt with this function must have complex content. That is, only encrypt elements with sub elements or encrypt the entire SOAP Body. */ int soap_wsse_encrypt_only(struct soap *soap, int alg, const void *key, int keylen, const char *tags) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); DBGFUN2("soap_wsse_encrypt_only", "alg=%x", alg, "tags=%s", tags?tags:"(null)"); if (!data) return soap_set_receiver_error(soap, "soap_wsse_encrypt_only", "Plugin not registered", SOAP_PLUGIN_ERROR); data->encid = soap_strdup(soap, tags); if (tags) { char *s, *t; size_t l = strlen(tags); /* make space to insert # to each id converted from a tag name */ t = (char*)soap_malloc(soap, l + 2); if (!t) return soap->error = SOAP_EOM; *t = '#'; soap_strcpy(t + 1, l + 1, tags); s = soap_wsse_ids(soap, t); if (!s) return soap->error = SOAP_EOM; s++; do { t = strchr(s, ' '); if (t) *t = '\0'; s--; *s = '#'; if (soap_wsse_add_DataReferenceURI(soap, s)) return soap->error; s = t; while (s && *s == ' ') s++; } while (s); } return soap_wsse_encrypt(soap, alg, key, keylen); } /** @fn int soap_wsse_encrypt(struct soap *soap, int alg, const void *key, int keylen) @brief Start encryption. This function is supposed to be used internally only. The algorithm should be SOAP_MEC_ENC_DES_CBC etc. for symmetric encryption. Use soap_wsse_add_EncryptedKey for public key encryption. @param soap context @param[in] alg the encryption algorithm, should be SOAP_MEC_ENC_DES_CBC etc. @param[in] key a certificate with public key for encryption, a DES CBC 160-bit key or AES key @param[in] keylen the symmetric encryption key length, 20 bytes for a DES CBC 160-bit key @return SOAP_OK or error code */ int soap_wsse_encrypt(struct soap *soap, int alg, const void *key, int keylen) { struct soap_wsse_data *data; DBGFUN1("soap_wsse_encrypt", "alg=%x", alg); data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); if (!data) return soap_set_receiver_error(soap, "soap_wsse_encrypt", "Plugin not registered", SOAP_PLUGIN_ERROR); if (!alg || !key) return soap_wsse_fault(soap, wsse__UnsupportedAlgorithm, "An unsupported signature or encryption algorithm was used"); if (alg & SOAP_MEC_ENV) return soap_wsse_add_EncryptedKey(soap, alg, NULL, (X509*)key, NULL, NULL, NULL); /* store alg and key in plugin data */ data->enco_alg = (alg | SOAP_MEC_ENC); data->enco_key = key; data->enco_keylen = keylen; if (data->mec) soap_mec_cleanup(soap, data->mec); else data->mec = (struct soap_mec_data*)SOAP_MALLOC(soap, sizeof(struct soap_mec_data)); if (soap_mec_begin(soap, data->mec, alg, NULL, (unsigned char*)key, &keylen)) return soap->error; soap->feltbegout = soap_wsse_element_begin_out; soap->feltendout = soap_wsse_element_end_out; return SOAP_OK; } /** @fn int soap_wsse_decrypt_auto(struct soap *soap, int alg, const void *key, int keylen) @brief Start automatic decryption when needed using the specified key. This function should be used just once. The algorithm should be SOAP_MEC_ENV_DEC_DES_CBC etc. for public key encryption/decryption and SOAP_MEC_DEC_DES_CBC etc. for symmetric shared secret keys. @param soap context @param[in] alg the decryption algorithm, @param[in] key a persistent decryption key for the algorithm, a private RSA key or a shared symmetric secret key @param[in] keylen use 0 for public-key encryption/decryption or the shared secret decryption key length, 20 bytes for a DES CBC 160-bit key @return SOAP_OK or error code This function can be called once before multiple messages are received with WS-Security encrypted content, where only one key is used for encryption (public key or shared secret key). The default decryption key is set. If multiple decryption keys should be used, do NOT use this function but set the security_token_handler callback of the wsse plugin. See @ref wsse_9_2. Use a NULL key to remove the default decryption key. */ int soap_wsse_decrypt_auto(struct soap *soap, int alg, const void *key, int keylen) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); DBGFUN1("soap_wsse_decrypt_auto", "alg=%x", alg); if (!data) return soap_set_receiver_error(soap, "soap_wsse_decrypt_auto", "Plugin not registered", SOAP_PLUGIN_ERROR); /* store alg and key in plugin data */ data->deco_alg = (alg & ~SOAP_MEC_ENC); /* TODO should add? data->enco_alg = (alg & ~(SOAP_MEC_ENC|SOAP_MEC_ENV)); */ data->deco_key = key; data->deco_keylen = keylen; return SOAP_OK; } /** @fn int soap_wsse_encrypt_begin(struct soap *soap, const char *id, int alg, const char *URI, const char *keyname, const unsigned char *key) @brief Emit XML encryption tags and start encryption of the XML element content. @param soap context @param[in] id string for the EncryptedData element Id attribute @param[in] alg algorithm used, or SOAP_MEC_NONE to ignore @param[in] URI string for the encrypted element wsu:Id attribute @param[in] keyname optional subject key name @param[in] key optional DES/AES key for encryption (to override the current key) @return SOAP_OK or error code */ int soap_wsse_encrypt_begin(struct soap *soap, const char *id, int alg, const char *URI, const char *keyname, const unsigned char *key) { int event; const char *algURI = NULL; DBGFUN("soap_wsse_encrypt_begin"); if ((soap->mode & SOAP_IO_LENGTH) && (soap->mode & SOAP_IO) == SOAP_IO_CHUNK) return SOAP_OK; /* disable digest */ event = soap->event; soap->event = 0; if (soap_set_attr(soap, "Id", id, 1) || soap_set_attr(soap, "Type", xenc_contentURI, 1) || soap_element(soap, "xenc:EncryptedData", 0, NULL) || soap_element_start_end_out(soap, NULL)) return soap->error; switch (alg & SOAP_MEC_MASK & ~SOAP_MEC_ENV) { case SOAP_MEC_ENC_DES_CBC: algURI = xenc_3desURI; break; case SOAP_MEC_ENC_AES128_CBC: algURI = xenc_aes128cbcURI; break; case SOAP_MEC_ENC_AES192_CBC: algURI = xenc_aes192cbcURI; break; case SOAP_MEC_ENC_AES256_CBC: algURI = xenc_aes256cbcURI; break; case SOAP_MEC_ENC_AES512_CBC: algURI = xenc_aes512cbcURI; break; case SOAP_MEC_ENC_AES128_GCM: algURI = xenc_aes128gcmURI; break; case SOAP_MEC_ENC_AES192_GCM: algURI = xenc_aes192gcmURI; break; case SOAP_MEC_ENC_AES256_GCM: algURI = xenc_aes256gcmURI; break; case SOAP_MEC_ENC_AES512_GCM: algURI = xenc_aes512gcmURI; break; } if (algURI) { if (soap_set_attr(soap, "Algorithm", algURI, 1) || soap_element(soap, "xenc:EncryptionMethod", 0, NULL) || soap_element_start_end_out(soap, "xenc:EncryptionMethod")) return soap->error; } if (URI) { if (soap_element(soap, "ds:KeyInfo", 0, NULL) || soap_element_start_end_out(soap, NULL) || soap_element(soap, "wsse:SecurityTokenReference", 0, NULL) || soap_element_start_end_out(soap, NULL) || soap_set_attr(soap, "URI", URI, 1) || soap_element(soap, "wsse:Reference", 0, NULL) || soap_element_start_end_out(soap, NULL) || soap_element_end_out(soap, "wsse:Reference") || soap_element_end_out(soap, "wsse:SecurityTokenReference") || soap_element_end_out(soap, "ds:KeyInfo")) return soap->error; } else if (keyname) { if (soap_element(soap, "ds:KeyInfo", 0, NULL) || soap_element_start_end_out(soap, NULL) || soap_element(soap, "ds:KeyName", 0, NULL) || soap_element_start_end_out(soap, NULL) || soap_string_out(soap, keyname, 0) || soap_element_end_out(soap, "ds:KeyName") || soap_element_end_out(soap, "ds:KeyInfo")) return soap->error; } if (soap_element(soap, "xenc:CipherData", 0, NULL) || soap_element_start_end_out(soap, NULL) || soap_element(soap, "xenc:CipherValue", 0, NULL) || soap_element_start_end_out(soap, NULL)) return soap->error; /* re-enable digest */ soap->event = event; /* adjust level, hiding xenc elements */ soap->level -= 3; return soap_mec_start(soap, key); } /** @fn int soap_wsse_encrypt_end(struct soap *soap) @brief Emit XML encryption end tags and stop encryption of the XML element content. @param soap context @return SOAP_OK or error code */ int soap_wsse_encrypt_end(struct soap *soap) { int event; DBGFUN("soap_wsse_encrypt_end"); if ((soap->mode & SOAP_IO_LENGTH) && (soap->mode & SOAP_IO) == SOAP_IO_CHUNK) return SOAP_OK; /* disable digest */ event = soap->event; soap->event = 0; /* adjust level, hiding xenc elements */ soap->level += 3; if (soap_mec_stop(soap) || soap_element_end_out(soap, "xenc:CipherValue") || soap_element_end_out(soap, "xenc:CipherData") || soap_element_end_out(soap, "xenc:EncryptedData")) return soap->error; /* re-enable digest */ soap->event = event; return SOAP_OK; } /** @fn int soap_wsse_decrypt_begin(struct soap *soap) @brief Check for XML encryption tags and start decryption of the XML element content. If the KeyInfo element is present, the security_token_handler callback will be used to obtain a decryption key based on the key name. @param soap context @return SOAP_OK or error code */ int soap_wsse_decrypt_begin(struct soap *soap) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); struct ds__KeyInfoType info; struct xenc__EncryptionMethodType meth; int alg = data->deco_alg; const unsigned char *key = NULL; int keylen = data->deco_keylen; DBGFUN("soap_wsse_decrypt_begin"); if (!data) return soap_set_receiver_error(soap, "soap_wsse_decrypt_begin", "Plugin not registered", SOAP_PLUGIN_ERROR); if (soap_wsse_verify_EncryptedKey(soap)) return soap->error; if (soap_element_begin_in(soap, "xenc:EncryptedData", 0, NULL)) return soap->error; /* TODO: use Type attribute? */ soap_default_xenc__EncryptionMethodType(soap, &meth); if (soap_in_xenc__EncryptionMethodType(soap, "xenc:EncryptionMethod", &meth, NULL)) { if (meth.Algorithm) { if (!strcmp(meth.Algorithm, xenc_3desURI)) alg = (alg & (~SOAP_MEC_MASK | SOAP_MEC_ENV)) | SOAP_MEC_DEC_DES_CBC; else if (!strcmp(meth.Algorithm, xenc_aes128cbcURI)) alg = (alg & (~SOAP_MEC_MASK | SOAP_MEC_ENV)) | SOAP_MEC_DEC_AES128_CBC; else if (!strcmp(meth.Algorithm, xenc_aes192cbcURI)) alg = (alg & (~SOAP_MEC_MASK | SOAP_MEC_ENV)) | SOAP_MEC_DEC_AES192_CBC; else if (!strcmp(meth.Algorithm, xenc_aes256cbcURI)) alg = (alg & (~SOAP_MEC_MASK | SOAP_MEC_ENV)) | SOAP_MEC_DEC_AES256_CBC; else if (!strcmp(meth.Algorithm, xenc_aes512cbcURI)) alg = (alg & (~SOAP_MEC_MASK | SOAP_MEC_ENV)) | SOAP_MEC_DEC_AES512_CBC; else if (!strcmp(meth.Algorithm, xenc_aes128gcmURI)) alg = (alg & (~SOAP_MEC_MASK | SOAP_MEC_ENV)) | SOAP_MEC_DEC_AES128_GCM; else if (!strcmp(meth.Algorithm, xenc_aes192gcmURI)) alg = (alg & (~SOAP_MEC_MASK | SOAP_MEC_ENV)) | SOAP_MEC_DEC_AES192_GCM; else if (!strcmp(meth.Algorithm, xenc_aes256gcmURI)) alg = (alg & (~SOAP_MEC_MASK | SOAP_MEC_ENV)) | SOAP_MEC_DEC_AES256_GCM; else if (!strcmp(meth.Algorithm, xenc_aes512gcmURI)) alg = (alg & (~SOAP_MEC_MASK | SOAP_MEC_ENV)) | SOAP_MEC_DEC_AES512_GCM; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "EncryptionMethod alg=%x\n", alg)); } } if (soap_in_ds__KeyInfoType(soap, "ds:KeyInfo", &info, NULL)) { if (data->security_token_handler && info.KeyName) { /* retrieve key from token handler callback */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Getting shared secret key '%s' through security_token_handler callback\n", info.KeyName)); key = (const unsigned char*)data->security_token_handler(soap, &alg, info.KeyName, &keylen); if (key) { if (data->mec) soap_mec_cleanup(soap, data->mec); else data->mec = (struct soap_mec_data*)SOAP_MALLOC(soap, sizeof(struct soap_mec_data)); if (soap_mec_begin(soap, data->mec, alg, NULL, (unsigned char*)key, &keylen)) return soap_wsse_fault(soap, wsse__FailedCheck, NULL); } } } if (soap_element_begin_in(soap, "xenc:CipherData", 0, NULL) || soap_element_begin_in(soap, "xenc:CipherValue", 0, NULL)) return soap->error; /* if no default shared key is set for symmetric decryption, get it */ if (!(alg & SOAP_MEC_ENV)) { if (alg != data->deco_alg) { if (data->security_token_handler) { /* retrieve key from token handler callback */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Getting shared secret key for alg=%x through security_token_handler callback\n", alg)); data->deco_key = (const unsigned char*)data->security_token_handler(soap, &alg, NULL, &keylen); } } if (!key && keylen) key = (const unsigned char*)data->deco_key; if (key) { if (data->mec) soap_mec_cleanup(soap, data->mec); else data->mec = (struct soap_mec_data*)SOAP_MALLOC(soap, sizeof(struct soap_mec_data)); if (soap_mec_begin(soap, data->mec, alg, NULL, (unsigned char*)key, &keylen)) return soap_wsse_fault(soap, wsse__FailedCheck, NULL); } } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Key=%p/%p keylen=%d alg=0x%x\n", key, data->deco_key, keylen, alg)); data->deco_alg = alg; data->deco_keylen = keylen; if (soap_mec_start_alg(soap, alg, key)) return soap_wsse_fault(soap, wsse__FailedCheck, NULL); return SOAP_OK; } /** @fn int soap_wsse_decrypt_end(struct soap *soap) @brief Check for XML encryption ending tags and stop decryption of the XML element content. @param soap context @return SOAP_OK or error code */ int soap_wsse_decrypt_end(struct soap *soap) { DBGFUN("soap_wsse_decrypt_end"); if (soap_mec_stop(soap) || soap_element_end_in(soap, "xenc:CipherValue") || soap_element_end_in(soap, "xenc:CipherData") || soap_element_end_in(soap, "xenc:EncryptedData")) return soap_wsse_fault(soap, wsse__FailedCheck, NULL); return SOAP_OK; } /******************************************************************************\ * * Callbacks registered by plugin * \******************************************************************************/ /** @fn int soap_wsse_header(struct soap *soap) @brief This callback is invoked as soon as the SOAP Header is received, we need to obtain the encrypted key when the message is encrypted to start decryption. @param soap context @return SOAP_OK or error code */ static int soap_wsse_header(struct soap *soap) { /* look for encrypted elements in Body */ /* soap->feltbegin = soap_wsse_element_begin_in; Moved, now always set */ /* soap->feltendin = soap_wsse_element_end_in; Moved, now always set */ /* get the encrypted key, if present */ return soap_wsse_verify_EncryptedKey(soap); } /** @fn int soap_wsse_element_begin_in(struct soap *soap, const char *tag) @brief This callback is invoked as soon as a starting tag of an element is received by the XML parser. @param soap context @param[in] tag name of the element parsed @return SOAP_OK or error code */ static int soap_wsse_element_begin_in(struct soap *soap, const char *tag) { /* make sure we always have a header allocated */ if (soap->part == SOAP_IN_ENVELOPE) soap_header(soap); if (!soap_match_tag(soap, tag, "xenc:EncryptedData")) { struct soap_dom_element *dom = soap->dom; /* disable DOM */ soap->dom = NULL; /* parse encryption tags */ if (soap_wsse_decrypt_begin(soap)) return soap->error; /* adjust DOM tree to skip encryption elements */ soap->dom = dom->prnt; soap->dom->elts = NULL; /* adjust nesting level */ soap->level -= 3; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Decryption started, parsing decrypted XML\n")); soap->event = SOAP_SEC_DECRYPT; return soap_peek_element(soap); } return SOAP_OK; } /** @fn int soap_wsse_element_end_in(struct soap *soap, const char *tag1, const char *tag2) @brief This callback is invoked as soon as an ending tag of an element is received by the XML parser. @param soap context @param[in] tag1 name of the element parsed @param[in] tag2 name of the element that was expected by the parser's state, or NULL @return SOAP_OK or error code */ static int soap_wsse_element_end_in(struct soap *soap, const char *tag1, const char *tag2) { if (soap->event == SOAP_SEC_DECRYPT && soap->dom && soap->dom->elts && !soap_match_tag(soap, tag1, ":CipherValue")) { struct soap_dom_element *dom = soap->dom->elts; soap->event = 0; /* disable DOM */ soap->dom = NULL; /* adjust nesting level */ soap->level += 3; /* parse ending tags */ if (soap_mec_stop(soap) || soap_element_end_in(soap, ":CipherData") || soap_element_end_in(soap, ":EncryptedData")) return soap_wsse_fault(soap, wsse__FailedCheck, NULL); /* adjust DOM tree to skip encryption elements */ while (dom->next) dom = dom->next; /* remove the old indent before ending tag */ dom->tail = NULL; /* enable DOM */ soap->dom = dom; if (soap_element_end_in(soap, tag2)) return soap->error; } return SOAP_OK; } /** @fn int soap_wsse_element_begin_out(struct soap *soap, const char *tag) @brief This callback is invoked as soon as a starting tag of an element is to be sent by the XML generator. @param soap context @param[in] tag name of the element @return SOAP_OK or error code */ static int soap_wsse_element_begin_out(struct soap *soap, const char *tag) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); if (data && !data->encid && !strcmp(tag, "SOAP-ENV:Body")) { _wsse__Security *security = soap_wsse_Security(soap); char *URI = NULL; if (security && security->xenc__EncryptedKey && security->xenc__EncryptedKey->Id) { const char *Id = security->xenc__EncryptedKey->Id; size_t l = strlen(Id); if (!(URI = (char*)soap_malloc(soap, l + 2))) return soap->error = SOAP_EOM; *URI = '#'; soap_strcpy(URI + 1, l + 1, Id); } /* this only encrypts the Body, so stop the callback */ if (!(soap->mode & SOAP_IO_LENGTH)) soap->feltbegout = NULL; return soap_wsse_encrypt_begin(soap, "Body", data->enco_alg, URI, data->enco_keyname, NULL); } else if (data && data->encid && soap_tagsearch(data->encid, tag)) { _wsse__Security *security = soap_wsse_Security(soap); char *URI = NULL; if (security && security->xenc__EncryptedKey && security->xenc__EncryptedKey->Id) { const char *Id = security->xenc__EncryptedKey->Id; size_t l = strlen(Id); if (!(URI = (char*)soap_malloc(soap, l + 2))) return soap->error = SOAP_EOM; *URI = '#'; soap_strcpy(URI + 1, l + 1, Id); } return soap_wsse_encrypt_begin(soap, soap_wsse_ids(soap, tag), data->enco_alg, URI, data->enco_keyname, NULL); } return SOAP_OK; } /** @fn int soap_wsse_element_end_out(struct soap *soap, const char *tag) @brief This callback is invoked as soon as an ending tag of an element is to be sent by the XML generator. @param soap context @param[in] tag name of the element @return SOAP_OK or error code */ static int soap_wsse_element_end_out(struct soap *soap, const char *tag) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); if (data && !data->encid && !strcmp(tag, "SOAP-ENV:Body")) { if (soap_wsse_encrypt_end(soap)) return soap->error; /* this version only encrypts Body, so stop the callback */ if (!(soap->mode & SOAP_IO_LENGTH)) soap->feltendout = NULL; } else if (data && data->encid && soap_tagsearch(data->encid, tag)) { if (soap_wsse_encrypt_end(soap)) return soap->error; } return SOAP_OK; } /** @fn int soap_wsse_preparesend(struct soap *soap, const char *buf, size_t len) @brief Takes a piece of the XML message (tokenized) to compute digest. @param soap context @param[in] buf string (XML "tokenized") to be sent @param[in] len buf length @return SOAP_OK or fault This callback is invoked to analyze a message (usually during the HTTP content length phase). @note Nested elements with wsu:Id attributes cannot be individually signed. */ static int soap_wsse_preparesend(struct soap *soap, const char *buf, size_t len) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); DBGFUN("soap_wsse_preparesend"); if (!data) return SOAP_PLUGIN_ERROR; soap->c14ninclude = data->prefixlist; /* the gSOAP engine signals the start of a wsu:Id element */ if (soap->event == SOAP_SEC_BEGIN) { int alg; /* start new digest or continue? */ if (data->digest && data->digest->level) soap->event = SOAP_SEC_SIGN; else if (!data->sigid || soap_tagsearch(data->sigid, soap->id)) { /* initialize smdevp engine */ struct soap_wsse_digest *digest; size_t l = strlen(soap->id); soap->event = SOAP_SEC_SIGN; digest = (struct soap_wsse_digest*)SOAP_MALLOC(soap, sizeof(struct soap_wsse_digest) + l + 1); digest->next = data->digest; digest->level = soap->level; /* digest hash strength is same as signature strength */ alg = (SOAP_SMD_DGST | (data->sign_alg & SOAP_SMD_HASH)); soap_smd_init(soap, &digest->smd, alg, NULL, 0); memset((void*)digest->hash, 0, sizeof(digest->hash)); digest->id[0] = '#'; soap_strcpy(digest->id + 1, l + 1, soap->id); data->digest = digest; /* omit indent for indented XML (next time around, we will catch '<') */ if (*buf != '<') goto end; } } if (soap->event == SOAP_SEC_SIGN) { /* update smdevp engine */ if (data->digest && data->digest->level) { soap_smd_update(soap, &data->digest->smd, buf, len); if (soap->level < data->digest->level) { soap->event = 0; soap_smd_final(soap, &data->digest->smd, (char*)data->digest->hash, NULL); data->digest->level = 0; } } } end: if (data->fpreparesend) return data->fpreparesend(soap, buf, len); return SOAP_OK; } /** @fn int soap_wsse_preparefinalsend(struct soap *soap) @brief Collects the digests of all the wsu:Id elements and populates the SignedInfo. @param soap context @return SOAP_OK or fault This callback is invoked just before the message is sent. */ static int soap_wsse_preparefinalsend(struct soap *soap) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); DBGFUN("soap_wsse_preparefinalsend"); if (!data) return SOAP_PLUGIN_ERROR; if (data->digest) { ds__SignatureType *signature = soap_wsse_Signature(soap); struct soap_wsse_digest *digest; const char *transform; int alg, signature_added = 0; /* if message is canonicalized populate transform element accordingly */ if (soap->mode & SOAP_XML_CANONICAL) transform = c14n_URI; else transform = NULL; /* to increase the message length counter we need to emit the Signature, SignedInfo and SignatureValue elements. However, this does not work if we already populated the wsse:Signature with SignedInfo and should never happen! */ if (!signature) { signature = soap_wsse_add_Signature(soap); signature_added = 1; } else if (signature->SignedInfo) return soap_set_receiver_error(soap, "wsse error", "Cannot use soap_wsse_sign with populated SignedInfo", SOAP_SSL_ERROR); /* digest hash strength is same as signature strength */ alg = (SOAP_SMD_DGST | (data->sign_alg & SOAP_SMD_HASH)); /* add the SignedInfo/Reference elements for each digest */ for (digest = data->digest; digest; digest = digest->next) if (soap_wsse_add_SignedInfo_Reference(soap, digest->id, transform, data->prefixlist, alg, (char*)digest->hash)) return soap->error; /* then compute the signature and add it */ if (soap_wsse_add_SignatureValue(soap, data->sign_alg, data->sign_key, data->sign_keylen)) return soap->error; /* Reset the callbacks and cleanup digests */ soap_wsse_preparecleanup(soap, data); /* if non-chunked, adjust content length */ if ((soap->mode & SOAP_IO) != SOAP_IO_CHUNK) { /* the code below ensures we increase the HTTP length counter */ short part = soap->part; soap->part = SOAP_IN_HEADER; /* header encoding rules (literal) */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Counting the size of additional SOAP Header elements, mode=0x%x\n", soap->mode)); if (signature_added) { const char *c14ninclude = soap->c14ninclude; soap->c14ninclude = NULL; soap->level = 3; /* indent level for XML Signature */ if (soap->mode & SOAP_XML_CANONICAL && soap->mode & SOAP_XML_INDENT) { soap->ns = 0; /* need namespaces for canonicalization */ soap->count += 4; /* correction for soap->ns = 0: add \n+indent */ } soap_out_ds__SignatureType(soap, "ds:Signature", 0, signature, NULL); soap->c14ninclude = c14ninclude; } else { const char *c14nexclude = soap->c14nexclude; soap->c14nexclude = "ds"; /* don't add xmlns:ds to count msg len */ soap->level = 4; /* indent level for XML SignedInfo */ if (soap->mode & SOAP_XML_CANONICAL && soap->mode & SOAP_XML_INDENT) { soap->ns = 0; /* need namespaces for canonicalization */ soap->count += 5; /* correction for soap->ns = 0: add \n+indent */ } soap_out_ds__SignedInfoType(soap, "ds:SignedInfo", 0, signature->SignedInfo, NULL); soap_outstring(soap, "ds:SignatureValue", 0, &signature->SignatureValue, NULL, 0); soap->c14nexclude = c14nexclude; } soap->part = part; } } else /* Reset the callbacks and cleanup digests */ soap_wsse_preparecleanup(soap, data); if (soap->fpreparefinalsend) return soap->fpreparefinalsend(soap); return SOAP_OK; } /** @fn void soap_wsse_preparecleanup(struct soap *soap, struct soap_wsse_data *data) @brief Restores engine state. @param soap context @param[in,out] data plugin data */ static void soap_wsse_preparecleanup(struct soap *soap, struct soap_wsse_data *data) { struct soap_wsse_digest *digest, *next; DBGFUN("soap_wsse_preparecleanup"); data->sign_alg = SOAP_SMD_NONE; data->sign_key = NULL; data->sign_keylen = 0; if (soap->fpreparesend == soap_wsse_preparesend) soap->fpreparesend = data->fpreparesend; if (soap->fpreparefinalsend == soap_wsse_preparefinalsend) soap->fpreparefinalsend = data->fpreparefinalsend; data->fpreparesend = NULL; data->fpreparefinalsend = NULL; for (digest = data->digest; digest; digest = next) { next = digest->next; SOAP_FREE(soap, digest); } data->digest = NULL; } /** @fn int soap_wsse_preparefinalrecv(struct soap *soap) @brief Verify signature and SignedInfo digests initiated with soap_wsse_verify_auto. @param soap context @return SOAP_OK or fault @see soap_wsse_verify_auto This callback is invoked just after a message was received. */ static int soap_wsse_preparefinalrecv(struct soap *soap) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); ds__SignedInfoType *signedInfo = soap_wsse_SignedInfo(soap); soap->omode &= ~SOAP_SEC_WSUID; data->sigid = NULL; /* so we must set again before next send */ data->encid = NULL; /* so we must set again before next send */ DBGFUN("soap_wsse_preparefinalrecv"); if (!data) return SOAP_PLUGIN_ERROR; if (data->deco_alg != SOAP_MEC_NONE && data->mec) if (soap_mec_end(soap, data->mec)) return soap_wsse_fault(soap, wsse__FailedCheck, NULL); data->deco_alg = SOAP_MEC_NONE; if (signedInfo) { int err = SOAP_OK, alg, bits, keylen = 0; EVP_PKEY *pkey = NULL; const void *key = NULL; /* determine which signature algorithm was used */ if (soap_wsse_get_SignedInfo_SignatureMethod(soap, &alg, &bits)) return soap->error; /* for HMAC-SHA1, the secret key might be stored in the KeyIdentifier */ if ((alg & SOAP_SMD_ALGO) == SOAP_SMD_HMAC) { const char *valueType = soap_wsse_get_KeyInfo_SecurityTokenReferenceKeyIdentifierValueType(soap); /* if in the KeyIdentifier, retrieve it */ if (valueType && !strcmp(valueType, ds_hmac_sha1URI)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Using HMAC key from KeyIdentifier to verify signature\n")); key = soap_wsse_get_KeyInfo_SecurityTokenReferenceKeyIdentifier(soap, &keylen); } /* next, try the plugin's security token handler */ if (!key) { if (data->security_token_handler) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Getting HMAC key through security_token_handler callback\n")); key = data->security_token_handler(soap, &alg, NULL, &keylen); } } /* still no key: try to get it from the plugin */ if (!key && alg == (data->vrfy_alg & SOAP_SMD_MASK)) { /* get the HMAC secret key from the plugin */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Using HMAC key from plugin to verify signature\n")); key = data->vrfy_key; keylen = data->vrfy_keylen; } } else { /* get the certificate from the KeyInfo reference */ X509 *cert, *cert1; cert = cert1 = soap_wsse_get_KeyInfo_SecurityTokenReferenceX509(soap); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Got cert=%p\n", cert)); /* next, try the plugin's security token handler */ if (!cert) { if (data->security_token_handler) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Getting certificate through security_token_handler callback\n")); cert = (X509*)data->security_token_handler(soap, &alg, NULL, &keylen); } } /* obtain the public key from the cert */ if (cert) { pkey = X509_get_pubkey((X509*)cert); key = (void*)pkey; } else if (alg == (data->vrfy_alg & SOAP_SMD_MASK)) { /* get the public key from the plugin */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Using public key from plugin to verify signature\n")); key = data->vrfy_key; soap->error = SOAP_OK; } if (cert1) X509_free(cert1); } /* if still no key, fault */ if (!key) err = soap_wsse_fault(soap, wsse__SecurityTokenUnavailable, NULL); /* verify SignedInfo with signature and check digests of local elements */ else if (soap_wsse_verify_SignatureValue(soap, alg, key, keylen) || soap_wsse_verify_SignedInfo(soap)) err = soap->error; if (pkey) EVP_PKEY_free(pkey); if (err) return err; if (data->fpreparefinalrecv && data->fpreparefinalrecv != soap_wsse_preparefinalrecv) return data->fpreparefinalrecv(soap); } else if (!soap->fault) return soap_wsse_fault(soap, wsse__FailedCheck, "Signature required"); return SOAP_OK; } #ifdef __cplusplus } #endif gsoap-2.8.28/gsoap/plugin/httpmd5test.h0000644000175000017500000000421512653650150017336 0ustar ellertellert/* httpmd5test.h gSOAP HTTP Content-MD5 digest plugin example application. gSOAP XML Web services tools Copyright (C) 2000-2004, Robert van Engelen, Genivia, Inc., All Rights Reserved. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2004, Robert van Engelen, Genivia, Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- Compile: soapcpp2 -c httpmd5test.h cc -DWITH_OPENSSL -o httpmd5test httpmd5test.c soapC.c soapClient.c soapServer.c httpmd5.c md5evp.c stdsoap2.c -lssl -lcrypto -lz */ int ns__echoString(char *arg, struct ns__echoString*); gsoap-2.8.28/gsoap/plugin/httpgettest.c0000644000175000017500000000602212653650150017421 0ustar ellertellert/* httpgettest.c gSOAP HTTP GET plugin client example application. For server example usage of the HTTP GET plugin, see samples/webserver gSOAP XML Web services tools Copyright (C) 2000-2006, Robert van Engelen, Genivia, Inc., All Rights Reserved. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2004, Robert van Engelen, Genivia, Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- Compile: soapcpp2 -CS -c httpgettest.h cc -DWITH_NONAMESPACES -Iplugin -o httpgettest httpgettest.c soapC.c soapClient.c httpget.c stdsoap2.c To support https and compression, compile with: cc -DWITH_NONAMESPACES -DWITH_OPENSSL -DWITH_GZIP -Iplugin -o httpgettest httpgettest.c soapC.c httpget.c stdsoap2.c -lssl -lcrypto -lz */ #include "soapH.h" #include "httpget.h" int main(int argc, char **argv) { struct soap soap; char *body; if (argc < 2) { fprintf(stderr, "Usage: httpgettest URL\n"); exit(0); } soap_init(&soap); soap_register_plugin(&soap, http_get); /* register plugin */ if (soap_get_connect(&soap, argv[1], NULL) || soap_begin_recv(&soap)) { soap_print_fault(&soap, stderr); exit(1); } if (soap.http_content) printf("HTTP Content Type: %s\n", soap.http_content); body = soap_get_http_body(&soap, NULL); soap_end_recv(&soap); if (body) printf("HTTP Body:\n%s\n", body); soap_end(&soap); soap_done(&soap); return 0; } SOAP_NMAC struct Namespace namespaces[] = { {NULL, NULL, NULL, NULL} }; gsoap-2.8.28/gsoap/plugin/httpdatest.c0000644000175000017500000001334712653650150017236 0ustar ellertellert/* httpdatest.c gSOAP HTTP Digest Authentication example application. gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia, Inc., All Rights Reserved. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2015, Robert van Engelen, Genivia, Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- Requires OpenSSL Compile: soapcpp2 -c httpdatest.h cc -DWITH_OPENSSL -o httpdatest httpdatest.c soapC.c soapClient.c soapServer.c httpda.c md5evp.c threads.c stdsoap2.c -lssl -lcrypto -lz Run server: ./httpdatest 8080 Run client test: ./httpdatest http://127.0.0.1:8080 hello */ #include "httpda.h" #include "soapH.h" #include "ns.nsmap" static char authrealm[] = "gSOAP Authentication Test"; int run_serve(int port); int run_tests(int,char**); int main(int argc, char **argv) { if (argc < 2) return soap_serve(soap_new1(SOAP_XML_INDENT)); else if (argc < 3) return run_serve(atoi(argv[1])); else return run_tests(argc, argv); } int run_serve(int port) { struct soap *soap = soap_new1(SOAP_XML_INDENT); int ret; soap_register_plugin(soap, http_da); if (!soap_valid_socket(soap_bind(soap, NULL, port, 100))) soap_print_fault(soap, stderr); else { fprintf(stderr, "Bind to port %d successful\n", port); soap->accept_timeout = 3600; /* let server time out after one hour */ for (;;) { SOAP_SOCKET sock = soap_accept(soap); if (!soap_valid_socket(sock)) { if (soap->errnum) soap_print_fault(soap, stderr); else { fprintf(stderr, "Server timed out\n"); break; } } fprintf(stderr, "Accepting socket %d connection from IP %d.%d.%d.%d\n", sock, (int)(soap->ip>>24)&0xFF, (int)(soap->ip>>16)&0xFF, (int)(soap->ip>>8)&0xFF, (int)soap->ip&0xFF); if (soap_serve(soap)) soap_print_fault(soap, stderr); fprintf(stderr, "Served\n\n"); soap_destroy(soap); soap_end(soap); } } ret = soap->error; soap_destroy(soap); soap_end(soap); soap_free(soap); return ret; } int run_tests(int argc, char **argv) { struct soap *soap = soap_new1(SOAP_XML_INDENT); struct ns__echoString r; char *endpoint, *arg; int ret; soap_register_plugin(soap, http_da); endpoint = argv[1]; arg = argv[2]; if (strchr(arg, 'c')) soap_set_omode(soap, SOAP_IO_CHUNK); if (strchr(arg, 'z')) soap_set_omode(soap, SOAP_ENC_ZLIB); if (soap_call_ns__echoString(soap, endpoint, NULL, arg, &r)) { if (soap->error == 401) { if (!strcmp(soap->authrealm, authrealm)) { /* save userid and passwd for basic or digest authentication */ struct http_da_info info; http_da_save(soap, &info, authrealm, "Mufasa", "Circle Of Life"); if (!soap_call_ns__echoString(soap, endpoint, NULL, arg, &r)) { soap_end(soap); /* need to restore for authentication */ http_da_restore(soap, &info); if (!soap_call_ns__echoString(soap, endpoint, NULL, arg, &r)) { if (!strcmp(arg, r.arg)) printf("EchoString test OK\n"); else printf("Transmission error\n"); } } http_da_release(soap, &info); /* regular calls may follow */ } } } if (soap->error) soap_print_fault(soap, stderr); ret = soap->error; soap_destroy(soap); soap_end(soap); soap_free(soap); return ret; } int ns__echoString(struct soap *soap, char *arg, struct ns__echoString *response) { if (soap->userid && soap->passwd) /* Basic authentication: we may want to reject this since the password was sent in the clear */ { if (!strcmp(soap->userid, "Mufasa") && !strcmp(soap->passwd, "Circle Of Life")) { response->arg = arg; return SOAP_OK; } } else if (soap->authrealm && soap->userid) { /* simulate database lookup on userid to find passwd */ if (!strcmp(soap->authrealm, authrealm) && !strcmp(soap->userid, "Mufasa")) { char *passwd = "Circle Of Life"; if (!http_da_verify_post(soap, passwd)) { response->arg = arg; return SOAP_OK; } } } soap->authrealm = authrealm; return 401; /* Not authorized, challenge digest authentication with httpda plugin */ } gsoap-2.8.28/gsoap/plugin/threads.h0000644000175000017500000001471012653650150016504 0ustar ellertellert/* threads.h Portable threads and locks API gSOAP XML Web services tools Copyright (C) 2000-2010, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under one of the following licenses: GPL, the gSOAP public license, or Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2010, Robert van Engelen, Genivia Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ /** @page threads Portable threads and locking support The threads.h and threads.c code define the following portable API: - THREAD_TYPE portable thread type - THREAD_ID returns current thread ID of type THREAD_TYPE* - THREAD_CREATE(t,f,a) start a thread (THREAD_TYPE*)t that calls f(a) - THREAD_DETACH(t) detach thread (THREAD_TYPE*)t - THREAD_JOIN(t) wait to join (THREAD_TYPE*)t - THREAD_EXIT exit the current thread - THREAD_CANCEL(t) kill a thread, dangerous, use only in extreme cases! - MUTEX_TYPE portable mutex type - MUTEX_INITIALIZER global initializer value for static locks - MUTEX_SETUP(m) setup lock (MUTEX_TYPE*)m - MUTEX_CLEANUP(m) cleanup lock (MUTEX_TYPE*)m - MUTEX_LOCK(m) acquire lock (MUTEX_TYPE*)m - MUTEX_UNLOCK(m) release lock (MUTEX_TYPE*)m - COND_TYPE portable condition variable type - COND_SETUP(c) setup condition variable (COND_TYPE*)c - COND_CLEANUP(c) cleanup condition variable (COND_TYPE*)c - COND_SIGNAL(c) signal condition variable (COND_TYPE*)c - COND_WAIT(c,m) wait on variable (COND_TYPE*)c in mutex (MUTEX_TYPE*)m */ #ifndef THREADS_H #define THREADS_H #ifndef WIN32 # include /* defines _POSIX_THREADS if pthreads are available */ #else # define ssize_t int # include # include # include # include #endif #if defined(_POSIX_THREADS) || defined(_SC_THREADS) # include #endif /******************************************************************************\ * * Threads * \******************************************************************************/ #if defined(WIN32) # define THREAD_TYPE HANDLE # define THREAD_ID GetCurrentThreadId() # define THREAD_CREATE(x,y,z) *(x) = (HANDLE)_beginthread((y), 8*4096, (z)) # define THREAD_DETACH(x) # define THREAD_JOIN(x) WaitForSingleObject((x), INFINITE) # define THREAD_EXIT _endthread() # define THREAD_CANCEL(x) TerminateThread(x, 0) # define MUTEX_TYPE HANDLE # define MUTEX_INITIALIZER NULL # define MUTEX_SETUP(x) (x) = CreateMutex(NULL, FALSE, NULL) # define MUTEX_CLEANUP(x) (CloseHandle(x) == 0) # define MUTEX_LOCK(x) emulate_pthread_mutex_lock(&(x)) # define MUTEX_UNLOCK(x) (ReleaseMutex(x) == 0) # define COND_SETUP(x) emulate_pthread_cond_init(&(x)) # define COND_CLEANUP(x) emulate_pthread_cond_destroy(&(x)) # define COND_SIGNAL(x) emulate_pthread_cond_signal(&(x)) # define COND_WAIT(x,y) emulate_pthread_cond_wait(&(x), &(y)) typedef struct { UINT waiters_count_; CRITICAL_SECTION waiters_count_lock_; HANDLE signal_event_; } COND_TYPE; #ifdef __cplusplus extern "C" { #endif int emulate_pthread_mutex_lock(volatile MUTEX_TYPE*); int emulate_pthread_cond_init(COND_TYPE*); int emulate_pthread_cond_destroy(COND_TYPE*); int emulate_pthread_cond_signal(COND_TYPE*); int emulate_pthread_cond_wait(COND_TYPE*, MUTEX_TYPE*); #ifdef __cplusplus } #endif #elif defined(_POSIX_THREADS) || defined(_SC_THREADS) # define THREAD_TYPE pthread_t # define THREAD_ID pthread_self() # define THREAD_CREATE(x,y,z) pthread_create((x), NULL, (y), (z)) # define THREAD_DETACH(x) pthread_detach((x)) # define THREAD_JOIN(x) pthread_join((x), NULL) # define THREAD_EXIT pthread_exit(NULL) # define THREAD_CANCEL(x) pthread_cancel(x) # define MUTEX_TYPE pthread_mutex_t # define MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER # define MUTEX_SETUP(x) pthread_mutex_init(&(x), NULL) # define MUTEX_CLEANUP(x) pthread_mutex_destroy(&(x)) #if 0 /* 1: DEBUG MUTEX */ # define MUTEX_LOCK(x) (fprintf(stderr, "! LOCK %p %s:%d\n", &x, __FILE__, __LINE__), pthread_mutex_lock(&(x))) # define MUTEX_UNLOCK(x) (fprintf(stderr, "! UNLOCK %p %s:%d\n", &x, __FILE__, __LINE__), pthread_mutex_unlock(&(x))) #else # define MUTEX_LOCK(x) pthread_mutex_lock(&(x)) # define MUTEX_UNLOCK(x) pthread_mutex_unlock(&(x)) #endif # define COND_TYPE pthread_cond_t # define COND_SETUP(x) pthread_cond_init(&(x), NULL) # define COND_CLEANUP(x) pthread_cond_destroy(&(x)) # define COND_SIGNAL(x) pthread_cond_signal(&(x)) # define COND_WAIT(x,y) pthread_cond_wait(&(x), &(y)) #else # error "No POSIX threads detected: we need thread and mutex operations. See for example OpenSSL /threads/th-lock.c on how to implement mutex on your platform" #endif #endif gsoap-2.8.28/gsoap/plugin/mecevp.c0000644000175000017500000014273712653650150016337 0ustar ellertellert/* mecevp.c gSOAP interface for streaming message encryption and decryption gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under one of the following licenses: GPL, the gSOAP public license, or Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2015, Robert van Engelen, Genivia, Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ /** @page mecevp The mecevp streaming message encryption and decryption engine The gSOAP mecevp engine encrypts and decrypts messages using the EVP interface of OpenSSL. It supports envelope encryption/decryption with public and private RSA keys and symmetric encryption with shared secret keys. Streaming and buffered message encryption modes are supported. An encryption and decryption algorithm and mode is selected with one of the following: - @ref SOAP_MEC_ENV_ENC_DES_CBC envelope encryption with triple DES CBC - @ref SOAP_MEC_ENV_ENC_AES256_CBC envelope encryption with AES256 CBC - @ref SOAP_MEC_ENV_ENC_AES256_GCM envelope authenticated encryption with AES256 GCM - @ref SOAP_MEC_ENC_DES_CBC symmetric encryption with triple DES CBC - @ref SOAP_MEC_ENC_AES256_CBC symmetric encryption with AES256 CBC - @ref SOAP_MEC_ENC_AES256_GCM symmetric authenticated encryption with AES256 GCM - @ref SOAP_MEC_ENV_DEC_DES_CBC envelope decryption with triple DES CBC - @ref SOAP_MEC_ENV_DEC_AES256_CBC envelope decryption with AES256 CBC - @ref SOAP_MEC_ENV_DEC_AES256_GCM envelope authenticated decryption with AES256 GCM - @ref SOAP_MEC_DEC_DES_CBC symmetric decryption with triple DES CBC - @ref SOAP_MEC_DEC_AES256_CBC symmetric decryption with AES256 CBC - @ref SOAP_MEC_DEC_AES256_GCM symmetric authenticated decryption with AES256 GCM where, in the above, AES256 can be replaced with AES128 ot AES192. Algorithm options: - @ref SOAP_MEC_STORE buffer all output in memory - @ref SOAP_MEC_OAEP use OAEP padding for CBC The mecevp engine wraps the EVP API with four new functions: - @ref soap_mec_init to initialize the engine - @ref soap_mec_update to encrypt/decrypt a message part - @ref soap_mec_final to finalize encryption/decryption - @ref soap_mec_cleanup to deallocate the engine and buffers All cipher data is written and read in base64 format. A higher-level interface for message encryption/decryption in parts (such as individual XML elements) is defined by two new functions: - @ref soap_mec_begin to begin a streaming sequence of encryptions/decryptions - @ref soap_mec_start to start encryption/decryption of a message part - @ref soap_mec_stop to stop encryption/decryption of a message part - @ref soap_mec_end to end the sequence and deallocate the engine buffers Compile all source codes with -DWITH_OPENSSL and link with ssl and crypto libraries. Here is an example to encrypt a message while streaming it to the output. The example uses the public key of the recipient/reader of the message. The recipient/reader uses its private key to decrypt. Envelope encryption is used with SOAP_MEC_ENV_ENC_DES_CBC, which means an ephemeral secret key is generated and encrypted with the public key. This encrypted secret key should be communicated to the recipient/reader with the message to decrypt: @code #include "mecevp.h" soap_mec_data mec; ns__Object object; int alg = SOAP_MEC_ENV_ENC_DES_CBC; FILE *fd = fopen("key.pem", "r"); EVP_PKEY *pubk; unsigned char *key; int keylen; if (...) // key file contains public key? pubk = PEM_read_PUBKEY(fd, NULL, NULL, NULL); else // key file contains certificate { X509 *cert = PEM_read_X509(fd, NULL, NULL, NULL); pubk = X509_get_pubkey(cert); X509_free(cert); } fclose(fd); key = soap_malloc(soap, soap_mec_size(alg, pubk)); if (soap_begin_send(soap) || soap_mec_begin(soap, &mec, alg, pubk, key, &keylen) || soap_mec_start(soap, NULL) || soap_out_ns__Object(soap, "ns:Object", 0, &object, NULL) || soap_mec_stop(soap) || soap_mec_end(soap, &mec) || soap_end_send(soap)) { soap_mec_cleanup(soap, &mec); // clean up when error soap_print_fault(soap, stderr); } EVP_PKEY_free(pubk); @endcode The decryption by the recipient/reader requires the ephemeral encrypted secret key generated by soap_mec_begin by the sender (as set above) to decrypt the message using envelope decryption with SOAP_MEC_ENV_DEC_DES_CBC. @code #include "mecevp.h" soap_mec_data mec; ns__Object object; int alg = SOAP_MEC_ENV_DEC_DES_CBC; FILE *fd = fopen("key.pem", "r"); EVP_PKEY *privk = PEM_read_PrivateKey(fd, NULL, NULL, "password"); unsigned char *key; int keylen; fclose(fd); key = ... // value set as above by sender keylen = ... // value set as above by sender if (soap_begin_recv(soap) || soap_mec_begin(soap, &mec, alg, privk, key, &keylen) || soap_mec_start(soap) || soap_in_ns__Object(soap, "ns:Object", &object, NULL) == NULL || soap_mec_stop(soap) || soap_mec_end(soap, &mec) || soap_end_recv(soap)) { soap_mec_cleanup(soap, &mec); // clean up when error soap_print_fault(soap, stderr); } EVP_PKEY_free(privk); @endcode Note that the encrypted secret key can be send in the clear or stored openly, since only the recipient/reader will be able to decode it for use in message decryption. Symmetric encryption and decryption can be used if both parties can safely share a secret symmetric key that no other party has access to. We use SOAP_MEC_ENC_DES_CBC for encryption and SOAP_MEC_DEC_DES_CBC for decryption using a 160-bit triple DES key. You can also use AES128, AES192, AES256 ciphers. Here is an example to encrypt a message using a shared secret key while streaming it to the output. @code #include "mecevp.h" soap_mec_data mec; ns__Object object; int alg = SOAP_MEC_ENC_DES_CBC; unsigned char key[20] = { ... }; // shared secret triple DES key int keylen = 20; if (soap_begin_send(soap) || soap_mec_begin(soap, &mec, alg, NULL, key, &keylen) || soap_mec_start(soap, NULL) || soap_out_ns__Object(soap, "ns:Object", 0, &object, NULL) || soap_mec_stop(soap) || soap_mec_end(soap, &mec) || soap_end_send(soap)) { soap_mec_cleanup(soap, &mec); // clean up when error soap_print_fault(soap, stderr); } @endcode The decryption by the recipient/reader requires the same shared secret key to decrypt the message using envelope decryption with SOAP_MEC_DEC_DES_CBC. This key is secret and unencrypted, so it should never be shared with any other party besides the sender/writer and recipient/reader. @code #include "mecevp.h" soap_mec_data mec; ns__Object object; int alg = SOAP_MEC_DEC_DES_CBC; unsigned char key[20] = { ... }; // shared secret triple DES key int keylen = 20; if (soap_begin_recv(soap) || soap_mec_begin(soap, &mec, alg, NULL, key, &keylen) || soap_mec_start(soap) || soap_in_ns__Object(soap, "ns:Object", &object, NULL) == NULL || soap_mec_stop(soap) || soap_mec_end(soap, &mec) || soap_end_recv(soap)) { soap_mec_cleanup(soap, &mec); // clean up when error soap_print_fault(soap, stderr); } @endcode @note The mecevp engine uses callbacks of the gSOAP engine that were introduced in version 2.8.1. Earlier gSOAP version releases are not compatible with the mecevp plugin and engine. */ #include "mecevp.h" #ifdef __cplusplus extern "C" { #endif /******************************************************************************\ * * Static local functions used * \******************************************************************************/ static int soap_mec_upd(struct soap *soap, struct soap_mec_data *data, const char **s, size_t *n, int final); static int soap_mec_upd_enc(struct soap *soap, struct soap_mec_data *data, const char **s, size_t *n, int final); static int soap_mec_upd_dec(struct soap *soap, struct soap_mec_data *data, const char **s, size_t *n, int final); static int soap_mec_check(struct soap *soap, struct soap_mec_data *data, int err, const char *msg); static void soap_mec_put_base64(struct soap *soap, struct soap_mec_data *data, const unsigned char *s, int n); static void soap_mec_end_base64(struct soap *soap, struct soap_mec_data *data); static int soap_mec_get_base64(struct soap *soap, struct soap_mec_data *data, char *t, size_t *l, const char *s, size_t n, const char **r, size_t *k); static int soap_mec_filtersend(struct soap *soap, const char **s, size_t *n); static int soap_mec_filterrecv(struct soap *soap, char *buf, size_t *len, size_t maxlen); /******************************************************************************\ * * soap_mec API functions * \******************************************************************************/ /** @fn int soap_mec_init(struct soap *soap, struct soap_mec_data *data, int alg, SOAP_MEC_KEY_TYPE *pkey, unsigned char *key, int *keylen) @brief Initialize mecevp engine state and create context for encryption/decryption algorithm using a private/public key or symmetric secret key. @param soap context @param[in,out] data mecevp engine context @param[in] alg encryption/decryption algorithm @param[in] pkey public/private key or NULL @param[in,out] key secret key or encrypted ephemeral secret key set with envelope encryption, or NULL @param[in,out] keylen secret key length @return SOAP_OK or SOAP_SSL_ERROR */ int soap_mec_init(struct soap *soap, struct soap_mec_data *data, int alg, SOAP_MEC_KEY_TYPE *pkey, unsigned char *key, int *keylen) { int ok = 1; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_mec_init()\n")); soap_ssl_init(); data->ctx = (EVP_CIPHER_CTX*)SOAP_MALLOC(soap, sizeof(EVP_CIPHER_CTX)); if (!data->ctx) return soap->error = SOAP_EOM; EVP_CIPHER_CTX_init(data->ctx); data->alg = alg; data->state = SOAP_MEC_STATE_NONE; data->restidx = 0; data->taglen = 0; switch (alg & SOAP_MEC_ALGO) { case SOAP_MEC_DES_CBC: data->type = EVP_des_ede3_cbc(); break; case SOAP_MEC_AES128_CBC: data->type = EVP_aes_128_cbc(); break; case SOAP_MEC_AES192_CBC: data->type = EVP_aes_192_cbc(); break; case SOAP_MEC_AES256_CBC: data->type = EVP_aes_256_cbc(); break; case SOAP_MEC_AES512_CBC: data->type = NULL; /* N/A */ break; #if (OPENSSL_VERSION_NUMBER >= 0x10002000L) case SOAP_MEC_AES128_GCM: data->type = EVP_aes_128_gcm(); break; case SOAP_MEC_AES192_GCM: data->type = EVP_aes_192_gcm(); break; case SOAP_MEC_AES256_GCM: data->type = EVP_aes_256_gcm(); break; case SOAP_MEC_AES512_GCM: data->type = NULL; /* N/A */ break; #endif default: data->type = NULL; } if (alg & SOAP_MEC_ENC) { if (!data->type) return soap_mec_check(soap, data, 0, "soap_mec_init() failed: cannot load cipher"); ok = EVP_EncryptInit_ex(data->ctx, data->type, NULL, NULL, NULL); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "EVP_EncryptInit ok=%d\n", ok)); } if (alg & SOAP_MEC_GCM) EVP_CIPHER_CTX_set_padding(data->ctx, 0); else { if (alg & SOAP_MEC_OAEP) EVP_CIPHER_CTX_set_padding(data->ctx, RSA_PKCS1_OAEP_PADDING); else EVP_CIPHER_CTX_set_padding(data->ctx, RSA_PKCS1_PADDING); } switch (alg & SOAP_MEC_MASK & ~SOAP_MEC_ALGO) { case SOAP_MEC_ENV_ENC: #if (OPENSSL_VERSION_NUMBER >= 0x0090800fL) ok = EVP_CIPHER_CTX_rand_key(data->ctx, data->ekey); #elif defined(EVP_CIPH_RAND_KEY) if (data->ctx->cipher->flags & EVP_CIPH_RAND_KEY) ok = EVP_CIPHER_CTX_ctrl(data->ctx, EVP_CTRL_RAND_KEY, 0, data->ekey); else ok = RAND_bytes(data->ekey, data->ctx->key_len); #else ok = RAND_bytes(data->ekey, data->ctx->key_len); #endif /* generate ephemeral secret key */ #if (OPENSSL_VERSION_NUMBER >= 0x10000000L) *keylen = EVP_PKEY_encrypt_old(key, data->ekey, EVP_CIPHER_CTX_key_length(data->ctx), pkey); #else *keylen = EVP_PKEY_encrypt(key, data->ekey, EVP_CIPHER_CTX_key_length(data->ctx), pkey); #endif key = data->ekey; /* fall through to next arm */ case SOAP_MEC_ENC: data->bufidx = 0; data->buflen = 1024; /* > iv in base64 must fit */ data->buf = (char*)SOAP_MALLOC(soap, data->buflen); data->key = key; break; case SOAP_MEC_ENV_DEC: case SOAP_MEC_DEC: data->pkey = pkey; data->key = key; data->keylen = *keylen; break; default: return soap_set_receiver_error(soap, "Unsupported encryption algorithm", NULL, SOAP_SSL_ERROR); } return soap_mec_check(soap, data, ok, "soap_mec_init() failed"); } /** @fn int soap_mec_update(struct soap *soap, struct soap_mec_data *data, const char **s, size_t *n) @brief Update mecevp engine state: encrypts plain text (or raw data) or decrypts cipher data in base64 format. @param soap context @param[in,out] data mecevp engine context @param[in,out] s input data to convert, afterwards points to converted data (original content is unchanged) @param[in,out] n size of input, afterwards size of output @return SOAP_OK or SOAP_SSL_ERROR */ int soap_mec_update(struct soap *soap, struct soap_mec_data *data, const char **s, size_t *n) { return soap_mec_upd(soap, data, s, n, 0); } /** @fn int soap_mec_final(struct soap *soap, struct soap_mec_data *data, const char **s, size_t *n) @brief Ends mecevp engine state: encrypt/decrypt remainder from buffers. @param soap context @param[in,out] data mecevp engine context @param[out] s afterwards points to converted remaining data in streaming mode, or entire converted data in buffer mode (SOAP_MEC_STORE option) @param[out] n afterwards size of remaining data @return SOAP_OK or SOAP_SSL_ERROR */ int soap_mec_final(struct soap *soap, struct soap_mec_data *data, const char **s, size_t *n) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_mec_final()\n")); *n = 0; if (!data->ctx) return SOAP_OK; if (soap_mec_upd(soap, data, s, n, 1)) return soap->error; return SOAP_OK; } /** @fn void soap_mec_cleanup(struct soap *soap, struct soap_mec_data *data) @brief Clean up mecevp engine and deallocate cipher context and buffers. @param soap context @param[in,out] data mecevp engine context @return SOAP_OK or SOAP_SSL_ERROR */ void soap_mec_cleanup(struct soap *soap, struct soap_mec_data *data) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_mec_cleanup()\n")); data->alg = SOAP_MEC_NONE; data->state = SOAP_MEC_STATE_NONE; data->type = NULL; if (data->ctx) { EVP_CIPHER_CTX_cleanup(data->ctx); SOAP_FREE(soap, data->ctx); data->ctx = NULL; } if (data->buf) { SOAP_FREE(soap, data->buf); data->buf = NULL; data->buflen = 0; } if (data->rest) { SOAP_FREE(soap, data->rest); data->rest = NULL; data->restlen = 0; } } /** @fn int soap_mec_begin(struct soap *soap, struct soap_mec_data *data, int alg, SOAP_MEC_KEY_TYPE *pkey, unsigned char *key, int *keylen) @brief Initialize the mecevp engine data and begin encryption or decryption message sequence using a private/public key or symmetric secret key. @param soap context @param[in,out] data mecevp engine context @param[in] alg encryption/decryption algorithm @param[in] pkey public/private key or NULL @param[in,out] key secret key or encrypted ephemeral secret key set with envelope encryption, or NULL @param[in,out] keylen secret key length @return SOAP_OK or error code */ int soap_mec_begin(struct soap *soap, struct soap_mec_data *data, int alg, SOAP_MEC_KEY_TYPE *pkey, unsigned char *key, int *keylen) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "MEC Begin alg=0x%x\n", alg)); /* save and set the engine's 'data' field to pass data to the callbacks */ soap->data[1] = (void*)data; data->ctx = NULL; data->type = NULL; data->pkey = NULL; data->key = NULL; data->buf = NULL; data->bufidx = 0; data->buflen = 0; data->rest = NULL; data->restidx = 0; data->restlen = 0; data->taglen = 0; /* save the mode flag */ data->mode = soap->mode; if (alg & SOAP_MEC_ENC) { /* clear the IO flags and DOM flag */ soap->mode &= ~(SOAP_IO | SOAP_IO_LENGTH | SOAP_ENC_ZLIB | SOAP_XML_DOM); /* clear the XML attribute store */ soap_clr_attr(soap); /* load the local XML namespaces store */ soap_set_local_namespaces(soap); if (soap->mode & SOAP_XML_CANONICAL) soap->ns = 0; /* for in c14n, we must have all xmlns bindings available */ } else if (soap->ffilterrecv != soap_mec_filterrecv) { /* save and override the callbacks */ data->ffilterrecv = soap->ffilterrecv; soap->ffilterrecv = soap_mec_filterrecv; } /* init the soap_mec engine */ return soap_mec_init(soap, data, alg, pkey, key, keylen); } /** @fn int soap_mec_start_alg(struct soap *soap, int alg, const unsigned char *key) @brief Start encryption or decryption of current message. If key is non-NULL, use the symmetric key with alg. Use soap_mec_start only after soap_mec_begin. The soap_mec_start should be followed by a soap_mec_stop call. @param soap context @param[in] alg algorithm @param[in] key secret DES/AES key or NULL for private key @return SOAP_OK or error code */ int soap_mec_start_alg(struct soap *soap, int alg, const unsigned char *key) { struct soap_mec_data *data; int ok = 1; data = (struct soap_mec_data*)soap->data[1]; if (!data) return soap->error = SOAP_USER_ERROR; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "MEC Start alg=0x%x\n", data->alg)); if (key) data->key = key; if (alg != SOAP_MEC_NONE) data->alg = alg; if (data->alg & SOAP_MEC_ENC) { unsigned char iv[EVP_MAX_IV_LENGTH]; int ivlen; if (!data->type) return soap_mec_check(soap, data, 0, "soap_mec_start_alg() failed: no cipher"); /* save and override the callbacks */ data->ffiltersend = soap->ffiltersend; soap->ffiltersend = soap_mec_filtersend; data->bufidx = 0; data->i = 0; data->m = 0; ivlen = EVP_CIPHER_iv_length(data->type); if (ivlen) { RAND_pseudo_bytes(iv, ivlen); soap_mec_put_base64(soap, data, (unsigned char*)iv, ivlen); } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "IV = ")); DBGHEX(TEST, iv, ivlen); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n")); ok = EVP_EncryptInit_ex(data->ctx, NULL, NULL, data->key, iv); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "EVP_EncryptInit ok=%d\n", ok)); } else { size_t len; /* algorithm */ switch (data->alg & SOAP_MEC_ALGO) { case SOAP_MEC_DES_CBC: data->type = EVP_des_ede3_cbc(); break; case SOAP_MEC_AES128_CBC: data->type = EVP_aes_128_cbc(); break; case SOAP_MEC_AES192_CBC: data->type = EVP_aes_192_cbc(); break; case SOAP_MEC_AES256_CBC: data->type = EVP_aes_256_cbc(); break; case SOAP_MEC_AES512_CBC: data->type = NULL; /* N/A */ break; #if (OPENSSL_VERSION_NUMBER >= 0x10002000L) case SOAP_MEC_AES128_GCM: data->type = EVP_aes_128_gcm(); break; case SOAP_MEC_AES192_GCM: data->type = EVP_aes_192_gcm(); break; case SOAP_MEC_AES256_GCM: data->type = EVP_aes_256_gcm(); break; case SOAP_MEC_AES512_GCM: data->type = NULL; /* N/A */ break; #endif default: data->type = NULL; } if (!data->type) return soap_mec_check(soap, data, 0, "soap_mec_start_alg() failed: cannot load cipher"); len = 2 * sizeof(soap->buf) + EVP_CIPHER_block_size(data->type); if (!data->buf || data->buflen < len) { if (data->buf) SOAP_FREE(soap, data->buf); data->buflen = len; data->buf = (char*)SOAP_MALLOC(soap, data->buflen); } data->bufidx = soap->buflen - soap->bufidx; /* copy buf[bufidx..buflen-1] to data buf */ soap_memcpy((void*)data->buf, data->buflen, (const void*)(soap->buf + soap->bufidx), data->bufidx); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Alloc buf=%lu, copy %lu message bytes\n", (unsigned long)data->buflen, (unsigned long)data->bufidx)); /* trigger ffilterrecv() */ soap->bufidx = soap->buflen; /* INIT state */ data->i = 0; data->m = 0; data->state = SOAP_MEC_STATE_INIT; } return soap_mec_check(soap, data, ok, "soap_mec_start() failed"); } /** @fn int soap_mec_start(struct soap *soap, const unsigned char *key) @brief Start encryption or decryption of current message. If key is non-NULL, use the symmetric key with alg. Use soap_mec_start only after soap_mec_begin. The soap_mec_start should be followed by a soap_mec_stop call. @param soap context @param[in] key secret DES/AES key or NULL @return SOAP_OK or error code */ int soap_mec_start(struct soap *soap, const unsigned char *key) { return soap_mec_start_alg(soap, SOAP_MEC_NONE, key); } /** @fn int soap_mec_stop(struct soap *soap) @brief Stops encryption or decryption of current message. Use after soap_mec_start. @param soap context @return SOAP_OK or error code */ int soap_mec_stop(struct soap *soap) { struct soap_mec_data *data; int err = SOAP_OK; data = (struct soap_mec_data*)soap->data[1]; if (!data) return soap->error = SOAP_USER_ERROR; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "MEC Stop alg=0x%x\n", data->alg)); if (data->alg & SOAP_MEC_ENC) { const char *s = NULL; size_t n = 0; err = soap_mec_final(soap, data, &s, &n); /* reset callbacks */ if (soap->ffiltersend == soap_mec_filtersend) soap->ffiltersend = data->ffiltersend; /* send remaining cipher data */ if (!err && n) if (soap_send_raw(soap, s, n)) return soap->error; } return err; } /** @fn int soap_mec_end(struct soap *soap, struct soap_mec_data *data) @brief Ends encryption or decryption of a sequence of message parts that began with soap_mec_begin. @param soap context @param[in,out] data mecevp engine context @return SOAP_OK or error code */ int soap_mec_end(struct soap *soap, struct soap_mec_data *data) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "MEC End alg=0x%x\n", data->alg)); /* reset callbacks */ if (soap->ffiltersend == soap_mec_filtersend) soap->ffiltersend = data->ffiltersend; if (soap->ffilterrecv == soap_mec_filterrecv) soap->ffilterrecv = data->ffilterrecv; /* restore the mode flag */ soap->mode = data->mode; /* cleanup and reset mecevp engine */ soap_mec_cleanup(soap, data); soap->data[1] = NULL; return SOAP_OK; } /** @fn size_t soap_mec_size(int alg, SOAP_MEC_KEY_TYPE *pkey) @brief Returns the number of octets needed to store the public/private key or the symmetric key, depending on the algorithm. @param[in] alg is the algorithm to be used @param[in] pkey is a pointer to an EVP_PKEY object or NULL for symmetric keys @return size_t number of octets that is needed to hold the key. */ size_t soap_mec_size(int alg, SOAP_MEC_KEY_TYPE *pkey) { if (alg & SOAP_MEC_ENV) return EVP_PKEY_size(pkey); switch (alg & SOAP_MEC_ALGO & ~SOAP_MEC_GCM) { case SOAP_MEC_DES_CBC: return 20; case SOAP_MEC_AES128_CBC: /* CBC and GCM */ return 16; case SOAP_MEC_AES192_CBC: /* CBC and GCM */ return 24; case SOAP_MEC_AES256_CBC: /* CBC and GCM */ return 32; case SOAP_MEC_AES512_CBC: /* CBC and GCM */ return 64; } return 0; } /******************************************************************************\ * * Static local functions * \******************************************************************************/ /** @fn int soap_mec_upd(struct soap *soap, struct soap_mec_data *data, const char **s, size_t *n, int final) @brief Update encryption/decryption state depending on the current algorithm @param soap context @param[in,out] data mecevp engine context @param[in,out] s input data to convert, afterwards points to converted data (original content is unchanged) @param[in,out] n size of input, afterwards size of output @param[in] final flag to indicate no more input, output is flushed to s @return SOAP_OK or SOAP_SSL_ERROR */ static int soap_mec_upd(struct soap *soap, struct soap_mec_data *data, const char **s, size_t *n, int final) { if (!data || !data->ctx) return soap->error = SOAP_USER_ERROR; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "-- MEC Update alg=0x%x n=%lu final=%d (%p) --\n", data->alg, (unsigned long)*n, final, data->ctx)); DBGMSG(TEST, *s, *n); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n--\n")); if (data->alg & SOAP_MEC_ENC) { if (soap_mec_upd_enc(soap, data, s, n, final)) return soap->error; } else { if (soap_mec_upd_dec(soap, data, s, n, final)) return soap->error; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n--\n")); DBGMSG(TEST, *s, *n); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n--\n")); return SOAP_OK; } /** @fn int soap_mec_upd_enc(struct soap *soap, struct soap_mec_data *data, const char **s, size_t *n, int final) @brief Update encryption state with input plain text (or raw) data and output in base64 format. @param soap context @param[in,out] data mecevp engine context @param[in,out] s input plain text, afterwards points to output cipher data @param[in,out] n size of input text, afterwards size of cipher data @param[in] final flag to indicate no more input, output is flushed to s @return SOAP_OK or SOAP_SSL_ERROR */ static int soap_mec_upd_enc(struct soap *soap, struct soap_mec_data *data, const char **s, size_t *n, int final) { size_t k; int m; int ok = 0; if (!data->type) return soap_mec_check(soap, data, 0, "soap_mec_upd_enc() failed"); /* cipher size */ k = *n + EVP_CIPHER_block_size(data->type); /* scale by base64 size + in-use part + 8 margin */ m = data->bufidx + 8 + (k + 2) / 3 * 4 + 1; #if (OPENSSL_VERSION_NUMBER >= 0x10002000L) if (final && (data->alg & SOAP_MEC_GCM)) m += sizeof(data->tag); #endif /* fits in buf after bufidx? */ if (m > (int)data->buflen) { char *t = data->buf; data->buflen = m; /* + slack? */ data->buf = (char*)SOAP_MALLOC(soap, m); if (t) { soap_memcpy((void*)data->buf, (size_t)m, (const void*)t, data->bufidx); /* copy in-use part */ SOAP_FREE(soap, t); } } if (!final) { /* envelope encryption or with shared key? */ if (data->alg & SOAP_MEC_ENV) { ok = EVP_SealUpdate(data->ctx, (unsigned char*)data->buf + data->buflen - k, &m, (unsigned char*)*s, (int)*n); DBGHEX(TEST, (unsigned char*)(data->buf + data->buflen - k), m); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n--\n")); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "EVP_SealUpdate ok=%d\n", ok)); } else { ok = EVP_EncryptUpdate(data->ctx, (unsigned char*)data->buf + data->buflen - k, &m, (unsigned char*)*s, (int)*n); DBGHEX(TEST, (unsigned char*)(data->buf + data->buflen - k), m); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n--\n")); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "EVP_EncryptUpdate ok=%d\n", ok)); } /* convert to base64 */ soap_mec_put_base64(soap, data, (unsigned char*)(data->buf + data->buflen - k), m); *s = data->buf; *n = data->bufidx; if (!(data->alg & SOAP_MEC_STORE)) data->bufidx = 0; } else { /* envelope encryption or with shared key? */ if (data->alg & SOAP_MEC_ENV) { ok = EVP_SealFinal(data->ctx, (unsigned char*)data->buf + data->buflen - k, &m); DBGHEX(TEST, (unsigned char*)(data->buf + data->buflen - k), m); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n--\n")); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "EVP_SealFinal ok=%d\n", ok)); } else { ok = EVP_EncryptFinal(data->ctx, (unsigned char*)data->buf + data->buflen - k, &m); DBGHEX(TEST, (unsigned char*)(data->buf + data->buflen - k), m); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n--\n")); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "EVP_EncryptFinal ok=%d\n", ok)); } /* convert to base64 */ soap_mec_put_base64(soap, data, (unsigned char*)(data->buf + data->buflen - k), m); #if (OPENSSL_VERSION_NUMBER >= 0x10002000L) if (data->alg & SOAP_MEC_GCM) { /* add GCM tag in base64 */ EVP_CIPHER_CTX_ctrl(data->ctx, EVP_CTRL_GCM_GET_TAG, sizeof(data->tag), data->tag); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get GCM tag = ")); DBGHEX(TEST, data->tag, sizeof(data->tag)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n")); soap_mec_put_base64(soap, data, (unsigned char*)(data->tag), sizeof(data->tag)); } #endif soap_mec_end_base64(soap, data); *s = data->buf; *n = data->bufidx; if (!(data->alg & SOAP_MEC_STORE)) data->bufidx = 0; } if (m > (int)k) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Assertion m<=k failed k=%lu m=%lu\n", (unsigned long)k, (unsigned long)m)); return soap->error = SOAP_USER_ERROR; } return soap_mec_check(soap, data, ok, "soap_mec_upd_enc() failed"); } /** @fn int soap_mec_upd_dec(struct soap *soap, struct soap_mec_data *data, const char **s, size_t *n, int final) @brief Update decryption state with input cipher data in base64 format and output in plain text (or raw) format @param soap context @param[in,out] data mecevp engine context @param[in,out] s input cipher data, afterwards points to output plain text @param[in,out] n size of input cipher data, afterwards size of plain text @param[in] final flag to indicate no more input, output is flushed to s @return SOAP_OK or SOAP_SSL_ERROR */ static int soap_mec_upd_dec(struct soap *soap, struct soap_mec_data *data, const char **s, size_t *n, int final) { const char *r = NULL; size_t k = 0, l = 0, m = 0; int len = 0; int ok = 1; int rest = 0; enum SOAP_MEC_STATE state = data->state; if (!data->type) return soap_mec_check(soap, data, 0, "soap_mec_upd_dec() failed"); if (final && state == SOAP_MEC_STATE_DECRYPT) data->state = SOAP_MEC_STATE_FINAL; /* if flushing the buf, no base64-decode or decryption to do */ if (state == SOAP_MEC_STATE_FLUSH || state == SOAP_MEC_STATE_NONE) { /* old + new fit in buf? */ if (data->bufidx + *n > data->buflen) { char *t = data->buf; do data->buflen += sizeof(soap->buf); while (data->buflen < data->bufidx + *n); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Enlarging buffer n=%lu\n", (unsigned long)data->buflen)); data->buf = (char*)SOAP_MALLOC(soap, data->buflen); if (t) { soap_memcpy((void*)data->buf, data->buflen, (const void*)t, data->bufidx); /* copy old */ SOAP_FREE(soap, t); } } /* concat old + new */ soap_memcpy((void*)(data->buf + data->bufidx), data->buflen - data->bufidx, (const void*)*s, *n); *s = data->buf; *n += data->bufidx; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Flush state n=%lu\n", (unsigned long)*n)); /* release old + new for next round (assuming consumer fetches all) */ if (!(data->alg & SOAP_MEC_STORE)) data->bufidx = 0; return SOAP_OK; } if (state == SOAP_MEC_STATE_INIT) { /* at init, base64 is in data->buf[bufidx] copied from buf[] */ data->i = 0; data->m = 0; k = (data->bufidx + *n + 3) / 4 * 3; /* decoded size from old + new */ data->taglen = 0; /* no GCM tag (yet) */ } else k = (*n + 3) / 4 * 3; /* base64-decoded size */ m = k + EVP_CIPHER_block_size(data->type); /* decrypted data size */ /* decrypted + base64-decoded + GCM tag all fit in current buf? */ if (data->buflen < data->bufidx + m + k + data->taglen) { /* no, need to enlarge */ char *t = data->buf; do data->buflen += sizeof(soap->buf); while (data->buflen < data->bufidx + m + k + data->taglen); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Enlarging buffer n=%lu\n", (unsigned long)data->buflen)); data->buf = (char*)SOAP_MALLOC(soap, data->buflen); if (t) { soap_memcpy((void*)data->buf, data->buflen, (const void*)t, data->bufidx); /* copy old part */ SOAP_FREE(soap, t); } } /* base64 decode */ if (state == SOAP_MEC_STATE_INIT) { /* base64 is in data buf[0..bufidx-1] and *s */ if (soap_mec_get_base64(soap, data, data->buf + data->buflen - k, &m, data->buf, data->bufidx, &r, &l)) return soap->error; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Base64 stage 1 s=%p n=%lu r=%p l=%lu\n", *s, (unsigned long)data->bufidx, r, (unsigned long)l)); /* position 'r' is at a spot that gets overwritten, copy to rest */ if (r) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Base64 stage 2 rest=%lu bytes\n", (unsigned long)*n)); rest = *n; } else { size_t j; /* base64-decode *s */ if (soap_mec_get_base64(soap, data, data->buf + data->buflen - k + m, &j, *s, *n, &r, &l)) return soap->error; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Base64 stage 3 s=%p n=%lu r=%p l=%lu\n", *s, (unsigned long)*n, r, (unsigned long)l)); m += j; } data->bufidx = 0; } else if (state != SOAP_MEC_STATE_FINAL && state != SOAP_MEC_STATE_FLUSH) { /* base64-decode *s */ if (soap_mec_get_base64(soap, data, data->buf + data->buflen - k, &m, *s, *n, &r, &l)) return soap->error; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Base64 stage 4 n=%lu l=%lu\n", (unsigned long)*n, (unsigned long)l)); } if (r) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Rest = %lu + %lu bytes\n", (unsigned long)l, (unsigned long)rest)); if (data->restlen < l + rest) { if (data->rest) SOAP_FREE(soap, data->rest); data->restlen = l + rest; data->rest = (char*)SOAP_MALLOC(soap, data->restlen); } data->restidx = l + rest; soap_memcpy((void*)data->rest, data->restlen, (const void*)r, l); soap_memcpy((void*)(data->rest + l), data->restlen - l, (const void*)*s, rest); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "--\n")); DBGMSG(TEST, data->rest, data->restidx); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n--\n")); } /* debug */ DBGHEX(TEST, (unsigned char*)(data->buf + data->buflen - k), m); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n--\n")); /* decryption of data buf[buflen-k] */ switch (data->state) { case SOAP_MEC_STATE_INIT: /* move to next state */ state = SOAP_MEC_STATE_IV; case SOAP_MEC_STATE_IV: /* get the IV data from buf[buflen-k] */ soap_memmove((void*)(data->buf + data->bufidx), data->buflen - data->bufidx, (const void*)(data->buf + data->buflen - k), m); /* add to IV */ data->bufidx += m; /* got all IV data? */ if (data->bufidx >= (size_t)EVP_CIPHER_iv_length(data->type)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get IV = ")); DBGHEX(TEST, (unsigned char*)data->buf, EVP_CIPHER_iv_length(data->type)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\nInitializing alg=0x%x\n", data->alg)); switch (data->alg & SOAP_MEC_MASK & ~SOAP_MEC_ALGO) { case SOAP_MEC_ENV_DEC: ok = EVP_OpenInit(data->ctx, data->type, data->key, data->keylen, (unsigned char*)data->buf, (EVP_PKEY*)data->pkey); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "EVP_OpenInit ok=%d\n", ok)); break; case SOAP_MEC_DEC: ok = EVP_DecryptInit_ex(data->ctx, data->type, NULL, data->key, (unsigned char*)data->buf); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "EVP_DecryptInit_ex ok=%d\n", ok)); break; } if (ok) { /* shift rest of data to cipher section */ m = k = data->bufidx - EVP_CIPHER_iv_length(data->type); soap_memmove((void*)(data->buf + data->buflen - k), m, (const void*)(data->buf + EVP_CIPHER_iv_length(data->type)), m); #if (OPENSSL_VERSION_NUMBER >= 0x10002000L) if (data->alg & SOAP_MEC_GCM) { /* rotate the last 128 bits through tag[] buffer */ if (m < sizeof(data->tag)) { soap_memcpy((void*)data->tag, sizeof(data->tag), (const void*)(data->buf + data->buflen - k), m); data->taglen = m; m = 0; } else { m -= sizeof(data->tag); soap_memcpy((void*)data->tag, sizeof(data->tag), (const void*)(data->buf + data->buflen - k + m), sizeof(data->tag)); data->taglen = sizeof(data->tag); } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Init GCM tag with %lu bytes\n", (unsigned long)data->taglen)); } #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Decrypt %lu bytes\n", (unsigned long)m)); /* decrypt to buf */ len = 0; switch (data->alg & SOAP_MEC_MASK & ~SOAP_MEC_ALGO) { case SOAP_MEC_ENV_DEC: ok = EVP_OpenUpdate(data->ctx, (unsigned char*)data->buf, &len, (unsigned char*)(data->buf + data->buflen - k), m); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "EVP_OpenUpdate len=%d ok=%d\n", len, ok)); break; case SOAP_MEC_DEC: ok = EVP_DecryptUpdate(data->ctx, (unsigned char*)data->buf, &len, (unsigned char*)(data->buf + data->buflen - k), m); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "EVP_DecryptUpdate len=%d ok=%d\n", len, ok)); break; } *s = data->buf; *n = (size_t)len; } if (!(data->alg & SOAP_MEC_STORE)) data->bufidx = 0; /* next decoded goes to start of buf */ else data->bufidx = *n; /* next state */ state = SOAP_MEC_STATE_DECRYPT; } else { /* nothing to return yet, need more data */ *n = 0; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "IV/decrypt state n=%lu\n", (unsigned long)*n)); break; case SOAP_MEC_STATE_DECRYPT: #if (OPENSSL_VERSION_NUMBER >= 0x10002000L) if (data->alg & SOAP_MEC_GCM) { /* rotate the last 128 bits through tag[] buffer */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Rotate GCM tag with %lu bytes\n", (unsigned long)data->taglen)); k += data->taglen; m += data->taglen; soap_memcpy((void*)(data->buf + data->buflen - k), k, (const void*)data->tag, data->taglen); if (m < sizeof(data->tag)) { soap_memcpy((void*)data->tag, sizeof(data->tag), (const void*)(data->buf + data->buflen - k), m); data->taglen = m; m = 0; } else { m -= sizeof(data->tag); soap_memcpy((void*)data->tag, sizeof(data->tag), (const void*)(data->buf + data->buflen - k + m), sizeof(data->tag)); data->taglen = sizeof(data->tag); } } #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Decrypt %lu bytes\n", (unsigned long)m)); len = 0; switch (data->alg & SOAP_MEC_MASK & ~SOAP_MEC_ALGO) { case SOAP_MEC_ENV_DEC: ok = EVP_OpenUpdate(data->ctx, (unsigned char*)(data->buf + data->bufidx), &len, (unsigned char*)(data->buf + data->buflen - k), m); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "EVP_OpenUpdate len=%d ok=%d\n", len, ok)); break; case SOAP_MEC_DEC: ok = EVP_DecryptUpdate(data->ctx, (unsigned char*)(data->buf + data->bufidx), &len, (unsigned char*)data->buf + data->buflen - k, m); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "EVP_DecryptUpdate len=%d ok=%d\n", len, ok)); break; } *s = data->buf; *n = data->bufidx + (size_t)len; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Decrypt state n=%lu\n", (unsigned long)*n)); if (!(data->alg & SOAP_MEC_STORE)) data->bufidx = 0; /* next decoded goes to start of buf */ break; case SOAP_MEC_STATE_FINAL: { /* we know there is enough space to flush *s and *n through the buf */ const char *t = *s; #if (OPENSSL_VERSION_NUMBER >= 0x10002000L) if (data->alg & SOAP_MEC_GCM) { /* use the tag[] buffer */ EVP_CIPHER_CTX_ctrl(data->ctx, EVP_CTRL_GCM_SET_TAG, sizeof(data->tag), data->tag); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Set GCM tag = ")); DBGHEX(TEST, data->tag, sizeof(data->tag)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n")); } #endif k = *n; len = 0; switch (data->alg & SOAP_MEC_MASK & ~SOAP_MEC_ALGO) { case SOAP_MEC_ENV_DEC: ok = EVP_OpenFinal(data->ctx, (unsigned char*)(data->buf + data->bufidx), &len); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "EVP_OpenFinal ok=%d\n", ok)); break; case SOAP_MEC_DEC: ok = EVP_DecryptFinal(data->ctx, (unsigned char*)(data->buf + data->bufidx), &len); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "EVP_DecryptFinal ok=%d\n", ok)); break; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Append %d bytes from decrypted\n", len)); *s = data->buf; *n = data->bufidx + (size_t)len; if (data->restidx) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Append %lu bytes from rest\n", data->restidx)); soap_memcpy((void*)(data->buf + *n), data->buflen - *n, (const void*)data->rest, data->restidx); *n += data->restidx; } if (k) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Append %lu bytes from input\n", k)); soap_memmove((void*)(data->buf + *n), data->buflen - *n, (const void*)t, k); *n += k; } if (!(data->alg & SOAP_MEC_STORE)) data->bufidx = 0; /* next decoded goes to start of buf */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Final len=%lu\n", (unsigned long)*n)); state = SOAP_MEC_STATE_FLUSH; /* flush data buf, if needed */ break; } default: DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Error in decryption state\n")); return soap->error = SOAP_SSL_ERROR; } if (r) { if (state == SOAP_MEC_STATE_DECRYPT) { state = SOAP_MEC_STATE_FINAL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Append rest of stream %lu (%lu <= %lu)\n", data->restidx, *n, data->buflen)); } } data->state = state; return soap_mec_check(soap, data, ok, "soap_mec_upd_dec() failed"); } /** @fn int soap_mec_check(struct soap *soap, struct soap_mec_data *data, int ok, const char *msg) @brief Check result of init/update/final mecevp engine operations. @param soap context @param[in,out] data mecevp engine context @param[in] ok EVP error value @param[in] msg error message @return SOAP_OK or SOAP_SSL_ERROR */ static int soap_mec_check(struct soap *soap, struct soap_mec_data *data, int ok, const char *msg) { if (ok <= 0) { unsigned long r; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "-- MEC Error (%d)", ok)); while ((r = ERR_get_error())) { ERR_error_string_n(r, soap->msgbuf, sizeof(soap->msgbuf)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, " %s: \"%s\";", msg, soap->msgbuf)); } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n")); /* cleanup and reset mecevp engine */ soap_mec_cleanup(soap, data); return soap_set_receiver_error(soap, msg, soap->msgbuf, SOAP_SSL_ERROR); } return SOAP_OK; } /** @fn void soap_mec_put_base64(struct soap *soap, struct soap_mec_data *data, const unsigned char *s, int n) @brief Write base64 formatted data stored in s of length n to internal buffer @param soap context @param[in,out] data mecevp engine context @param[in] s data to convert @param[in] n length of data to convert */ static void soap_mec_put_base64(struct soap *soap, struct soap_mec_data *data, const unsigned char *s, int n) { char *t; int i; unsigned long m; (void)soap; if (!s || !n) return; t = data->buf + data->bufidx; i = data->i; m = data->m; while (n--) { m = (m << 8) | *s++; if (i++ == 2) { for (i = 4; i > 0; m >>= 6) t[--i] = soap_base64o[m & 0x3F]; t += 4; data->bufidx += 4; } } data->i = i; data->m = m; } /** @fn void soap_mec_end_base64(struct soap *soap, struct soap_mec_data *data) @brief End writing base64 formatted data to internal buffer @param soap context @param[in,out] data mecevp engine context */ static void soap_mec_end_base64(struct soap *soap, struct soap_mec_data *data) { (void)soap; if (data->i) { char *t; int i; unsigned long m; t = data->buf + data->bufidx; i = data->i; m = data->m; for (; i < 3; i++) m <<= 8; for (i++; i > 0; m >>= 6) t[--i] = soap_base64o[m & 0x3F]; for (i = 3; i > data->i; i--) t[i] = '='; data->bufidx += 4; } data->i = 0; data->m = 0; } /** @fn int soap_mec_get_base64(struct soap *soap, struct soap_mec_data *data, char *t, size_t *l, const char *s, size_t n, const char **r, size_t *k) @brief Convert base64-formatted data from s[0..n-1] into raw data in t[0..l-1] where l is the max size and set equal or lower if data fits in t. If data does not fit r points to remainder in s[0..n-1] of size k. @param soap context @param[in,out] data mecevp engine context @param[in] t raw data (converted from base64) @param[in,out] l max size of t[], afterwards actual size of data written to t[] @param[in] s data in base64 format @param[in] n size of base64 data @param[out] r if data does not fit in t[], points to s[] remainder to convert @param[out] k if data does not fit in t[], size of remainder in r[] @return SOAP_OK or SOAP_SSL_ERROR */ static int soap_mec_get_base64(struct soap *soap, struct soap_mec_data *data, char *t, size_t *l, const char *s, size_t n, const char **r, size_t *k) { int i; unsigned long m; size_t j; int c; i = data->i; m = data->m; j = 0; for (;;) { do { if (!n--) { *l = j; data->i = i; data->m = m; *r = NULL; *k = 0; return SOAP_OK; } c = *s++; if (c == '=' || c == '<') { switch (i) { case 2: *t++ = (char)((m >> 4) & 0xFF); j++; break; case 3: *t++ = (char)((m >> 10) & 0xFF); *t++ = (char)((m >> 2) & 0xFF); j += 2; } if (c == '<') { s--; n++; } else if (n && *s == '=') { s++; n--; } *l = j; *k = n; *r = s; return SOAP_OK; } if (c >= '+' && c <= '+' + 79) { int b = soap_base64i[c - '+']; if (b >= 64) return soap->error = SOAP_SSL_ERROR; m = (m << 6) + b; i++; } else if (c < 0 || c > 32) return soap->error = SOAP_SSL_ERROR; } while (i < 4); *t++ = (char)((m >> 16) & 0xFF); *t++ = (char)((m >> 8) & 0xFF); *t++ = (char)(m & 0xFF); j += 3; i = 0; m = 0; } } /******************************************************************************\ * * Callbacks registered by plugin * \******************************************************************************/ /** @fn int soap_mec_filtersend(struct soap *soap, const char **s, size_t *n) @brief Callback to modify outbound messages by encrypting through the engine. @param soap context @param[in,out] s plain text message, afterwards set to encrypted message @param[in,out] n plain text message size, afterwards set to encrypted message size @return SOAP_OK or SOAP_SSL_ERROR */ static int soap_mec_filtersend(struct soap *soap, const char **s, size_t *n) { struct soap_mec_data *data = (struct soap_mec_data*)soap->data[1]; if (!data) return SOAP_OK; /* encrypt to base64 */ return soap_mec_upd(soap, data, s, n, 0); } /** @fn int soap_mec_filterrecv(struct soap *soap, char *buf, size_t *len, size_t maxlen) @brief Callback to modify inbound messages by decrypting through the engine. @param soap context @param[in,out] buf encrypted message, afterwards contains decrypted content @param[in,out] len encrypted message size, afterwards set to decrypted content size @param[in] maxlen max length of allocated buf size to contain decrypted content @return SOAP_OK or SOAP_SSL_ERROR */ static int soap_mec_filterrecv(struct soap *soap, char *buf, size_t *len, size_t maxlen) { struct soap_mec_data *data = (struct soap_mec_data*)soap->data[1]; const char *s = buf; if (!data || (data->alg & SOAP_MEC_MASK) == SOAP_MEC_NONE || (data->alg & SOAP_MEC_ENC)) return SOAP_OK; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Filter recv len in=%lu maxlen=%lu\n", (unsigned long)*len, (unsigned long)maxlen)); /* convert s[len] to new s with len (new s = data->buf) */ if (soap_mec_upd(soap, data, &s, len, 0)) return soap->error; /* does the result fit in buf[maxlen]? */ if (*len <= maxlen) { soap_memcpy((void*)buf, maxlen, (const void*)s, *len); /* yes: copy data to buf[] */ data->bufidx = 0; } else { soap_memcpy((void*)buf, maxlen, (const void*)s, maxlen); /* no: copy first part to buf[maxlen] */ soap_memmove((void*)data->buf, data->buflen, (const void*)(s + maxlen), *len - maxlen); /* shift rest to the left */ data->bufidx = *len - maxlen; /* keep rest of the data in s (data->buf) */ *len = maxlen; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Filter recv len out=%lu\n", (unsigned long)*len)); return SOAP_OK; } #ifdef __cplusplus } #endif gsoap-2.8.28/gsoap/plugin/httpmd5.h0000644000175000017500000000631712653650150016443 0ustar ellertellert/* httpmd5.h gSOAP HTTP Content-MD5 digest plugin. Usage (both client and server, see httpmd5test.h/.c for example): soap_register_plugin(&soap, http_md5); This enables HTTP MD5 checksum generation and checking for SOAP/XML messages WITHOUT attachments. Compile with -DWITH_OPENSSL Link with OpenSSL (for md5evp.c), httpmd5.c, and md5evp.c gSOAP XML Web services tools Copyright (C) 2000-2005, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under one of the following licenses: GPL, the gSOAP public license, or Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2005, Robert van Engelen, Genivia, Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #ifndef HTTPMD5_H #define HTTPMD5_H #include "stdsoap2.h" #include "md5evp.h" #ifdef __cplusplus extern "C" { #endif #define HTTP_MD5_ID "HTTP-MD5-1.2" /* plugin identification */ extern const char http_md5_id[]; int http_md5(struct soap *soap, struct soap_plugin *p, void *arg); struct http_md5_data { int (*fposthdr)(struct soap*, const char*, const char*); int (*fparsehdr)(struct soap*, const char*, const char*); int (*fprepareinitsend)(struct soap*); int (*fprepareinitrecv)(struct soap*); int (*fpreparesend)(struct soap*, const char*, size_t); int (*fpreparerecv)(struct soap*, const char*, size_t); int (*fpreparefinalrecv)(struct soap*); void *context; char digest[16]; }; #ifdef __cplusplus } #endif #endif gsoap-2.8.28/gsoap/plugin/README.txt0000644000175000017500000000325712653650150016403 0ustar ellertellertThis directory contains plugins for extending the gSOAP engine's capabilities. cacerts.* To embed client-side certificate chain in code (no cacerts.pem) httpda.* HTTP Digest Authentication, see doc/httpda httpget.* HTTP GET method support httpform.* HTTP POST application/x-www-form-urlencoded support httppost.* HTTP POST method support for example non-SOAP requests httpmd5.* HTTP MD5 checksums logging.* Message logging (selective inbound/outbound) mq.* Message queueing (for WS-RM message queueing support) plugin.* Example plugin for aspiring plugin developers wsaapi.* WS-Addressing (wsa) plugin, see doc/wsa wsrmapi.* WS-ReliableMessaging (wsrm) plugin, see doc/wsrm wsseapi.* WS-Security (wsse) plugin, see doc/wsse wsseapi-lite.* WS-Security lite API, see doc/wsse-lite wsddapi.* WS-Discovery (wsdd) library, see doc/wsdd Supporting modules: smdevp.* EVP-based streaming (signed) message digest engine mecevp.* EVP-based streaming message encryption engine md5evp.* MD5 EVP interface for httpda and httpmd5 threads.* Portable threads, mutex, and condition variables Test programs for plugins: httpdatest.* HTTP Digest Athentication test and example code httpgettest.* HTTP GET test and example code httpposttest.* HTTP POST test and example code httpmd5test.* HTTP MD5 integrity protection test and example code C versus C++ usage: All files are suitable for C and C++ compilation and C++ checks are included in the source code whenever applicable. If necessary, rename the .c file(s) to .cpp for your project. IMPORTANT FOR VISUAL STUDIO USERS: make sure to compile all sources in C++ compilation mode. If you migrate to a project file .vcproj, please set CompileAs="2" in your .vcproj file. gsoap-2.8.28/gsoap/plugin/md5evp.c0000644000175000017500000000734612653650150016254 0ustar ellertellert/* md5evp.c gSOAP HTTP Content-MD5 digest EVP handler for httpmd5 plugin gSOAP XML Web services tools Copyright (C) 2000-2005, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under one of the following licenses: GPL, the gSOAP public license, or Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2005, Robert van Engelen, Genivia, Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "md5evp.h" #ifdef __cplusplus extern "C" { #endif int md5_handler(struct soap *soap, void **context, enum md5_action action, char *buf, size_t len) { EVP_MD_CTX *ctx; unsigned char hash[EVP_MAX_MD_SIZE]; unsigned int size; switch (action) { case MD5_INIT: soap_ssl_init(); if (!*context) { *context = (void*)SOAP_MALLOC(soap, sizeof(EVP_MD_CTX)); EVP_MD_CTX_init((EVP_MD_CTX*)*context); } ctx = (EVP_MD_CTX*)*context; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "-- MD5 Init %p\n", ctx)); EVP_DigestInit_ex(ctx, EVP_md5(), NULL); break; case MD5_UPDATE: ctx = (EVP_MD_CTX*)*context; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "-- MD5 Update %p (%lu) --\n", ctx, (unsigned long)len)); DBGMSG(TEST, buf, len); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n--")); EVP_DigestUpdate(ctx, (const void*)buf, (unsigned int)len); break; case MD5_FINAL: ctx = (EVP_MD_CTX*)*context; EVP_DigestFinal_ex(ctx, (unsigned char*)hash, &size); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "-- MD5 Final %p --\n", ctx)); DBGHEX(TEST, hash, size); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n--")); soap_memcpy((void*)buf, 16, (const void*)hash, 16); break; case MD5_DELETE: ctx = (EVP_MD_CTX*)*context; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "-- MD5 Delete %p --\n", ctx)); if (ctx) { EVP_MD_CTX_cleanup(ctx); SOAP_FREE(soap, ctx); } *context = NULL; } return SOAP_OK; } #ifdef __cplusplus } #endif gsoap-2.8.28/gsoap/plugin/wsseapi-lite.c0000644000175000017500000007170712653650150017464 0ustar ellertellert/* wsseapi-lite.c WS-Security, lite version (time stamp and user name token only). gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under one of the following licenses: GPL, the gSOAP public license, or Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ /** @mainpage - @ref wsse documents the wsse lite API for WS-Security 1.0 support. */ /** @page wsse WS-Security lite [TOC] @section wsse_5 Security Header The material in this section relates to the WS-Security specification section 5. To use the wsse lite API: -# Run wsdl2h -t typemap.dat on a WSDL of a service that requires WS-Security headers. The typemap.dat file is used to recognize and translate Security header blocks. -# Run soapcpp2 on the header file produced by wsdl2h. -# Use the wsse lite API functions described below to add time stamp and user name tokens. If HTTPS is required with OpenSSL then please follow the instructions in Section @ref wsse_11 to ensure thread-safety of WS-Security with HTTPS. The wsse lite API is located in: - `gsoap/plugin/wsseapi-lite.h` wsse lite API. - `gsoap/plugin/wsseapi-lite.c` wsse lite API for C and C++. You will also need: - compile all sources with `-DWITH_OPENSSL` to enable HTTPS. - if you have zlib installed, compile all sources also with `-DWITH_GZIP`. - link with `-lssl -lcrypto -lz -gsoapssl++` (or `-lgsoapssl` for C, or compile `stdsoap2.cpp` for C++ and `stdsoap2.c` for C). The gSOAP header file for soapcpp2 should import wsse.h (or the older 2002 version wsse2.h): @code #import "wsse.h" @endcode The wsdl2h tool adds the necessary imports to the generated header file if the WSDL declares the use of WS-Security. If not, you may have to add the import manually before running soapcpp2. The wsse lite API consists of a set of functions to populate and verify WS-Security headers and message body content. For more details, we refer to the following sections that correspond to the WS-Security specification sections: - Section 6 @ref wsse_6 - Section 10 @ref wsse_10 - @ref wsse_11 The basic API is introduced below. To add an empty Security header block to the SOAP header, use: @code soap_wsse_add_Security(soap); @endcode To delete a Security header, use: @code soap_wsse_delete_Security(soap); @endcode Adding an empty Security header block is not very useful. In the following, we present the higher-level functions of the wsse lite API to populate and verify Security header content. @note The soap context includes an actor value soap.actor that is populated and rendered as the SOAP-ENV:actor (SOAP 1.1) or SOAP-ENV:role (SOAP 1.2) attribute in XML within the generic SOAP Header. The attribute is optional, but should be used to target a recipient such as an intermediate node to process the SOAP header. In contrast, actor or role attributes within Security header blocks target specific recipients to process the Security header block. The gSOAP implementation does not automate this feature and application should set and check the actor/role attribute when necessary. In addition, the current implementation supports the inclusion of a single Security header block in the SOAP header. To populate the SOAP-ENV:actor or SOAP-ENV:role attribute within the Security header, use: @code soap_wsse_add_Security_actor(soap, "recipient"); @endcode To obtain the actor or role value (e.g. after receiving a message), use: @code _wsse__Security *security = soap_wsse_Security(soap); if (security) { ... = security->SOAP_ENV__actor; // SOAP 1.1 ... = security->SOAP_ENV__role; // SOAP 1.2 @endcode The SOAP-ENV:mustUnderstand attribute is automatically added and checked by the gSOAP engine. A gSOAP application compiled without Security support will reject Security headers. Security header blocks are attached to the soap context, which means that the information will be automatically kept to support multiple invocations. @section wsse_6 Security Tokens The material in this section relates to the WS-Security specification section 6. @subsection wsse_6_2 User Name Token To add a user name token to the Security header block, use: @code soap_wsse_add_UsernameTokenText(soap, "Id", "username", NULL); @endcode The `Id` value is optional and not used in the wsse lite API. These `Id`s are serialized as wsu:Id identifiers for cross-referencing XML elements. To add a user name token with clear text password, use: @code soap_wsse_add_UsernameTokenText(soap, "Id", "username", "password"); @endcode It is strongly recommended to use `soap_wsse_add_UsernameTokenText` only in combination with HTTPS encrypted transmission or not at all. A better alternative is to use password digests (not supported in this wsse lite API). Clear-text passwords are verified with `soap_wsse_verify_Password`. To verify a password at the receiving side to authorize a request (e.g. within a Web service operation), use: @code int ns__myMethod(struct soap *soap, ...) { const char *username = soap_wsse_get_Username(soap); const char *password; if (!username) return soap->error; // no username: return FailedAuthentication (from soap_wsse_get_Username) password = ...; // lookup password of username if (soap_wsse_verify_Password(soap, password)) { int err = soap->error; soap_wsse_delete_Security(soap); // remove old security headers return err; // password verification failed: return FailedAuthentication } return SOAP_OK; } @endcode Note that the `soap_wsse_get_Username` functions sets the wsse:FailedAuthentication fault upon failure. It is common for the API functions functions to return SOAP_OK or a wsse fault that should be passed to the sender by returning soap->error from service operations. The fault is displayed with the `soap_print_fault` function. @section wsse_10 Security Timestamps The material in this section relates to the WS-Security specification section 10. To add a timestamp with the creation time to the Security header, use: @code soap_wsse_add_Timestamp(soap, NULL, 0); // no expiration @endcode The lifetime of a message (in seconds) is passed as the third argument, which will be displayed as the timestamp expiration time: @code soap_wsse_add_Timestamp(soap, NULL, 10); // 10 seconds lifetime @endcode @section wsse_11 WS-Security and HTTPS HTTPS is used at the client side with the usual "https:" URL addressing, shown here: @code #include "wsseapi-lite.h" #include "threads.h" struct soap *soap; if (CRYPTO_thread_setup()) ... // error soap = soap_new1(SOAP_XML_CANONICAL | SOAP_XML_INDENT); if (soap_ssl_client_context(&soap, SOAP_SSL_DEFAULT, // requires server authentication NULL, // keyfile for client authentication to server NULL, // the keyfile password "cacerts.pem", // cafile CA certificates to authenticate the server NULL, // capath CA directory path to certificates NULL )) ... // error soap->cafile = "cacerts.pem"; // same as above (or overrides the above) soap->capath = "dir/to/certs"; // and/or point to CA certs soap->crlfile = "revoked.pem"; // use CRL (optional) soap_wsse_delete_Security(soap); // remove any previous header content soap_wsse_add_UsernameTokenText(soap, NULL, "username", "password"); soap_wsse_add_Timestamp(soap, NULL, 10); // 10 seconds lifetime if (soap_call_ns__myMethod(soap, "https://...", ...)) ... // error ... // process response results soap_destroy(soap); soap_end(soap); soap_free(soap); CRYPTO_thread_cleanup(); @endcode With OpenSSL, the CRYPTO threads should be set up before any threads are created. The `soap_ssl_client_context` only needs to be set up once. Use the following flags: - `SOAP_SSL_DEFAULT` requires server authentication, CA certs should be used - `SOAP_SSL_NO_AUTHENTICATION` disables server authentication - `SOAP_SSL_SKIP_HOST_CHECK` disables server authentication host check - `SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE` to accept self-signed certificates, expired certificates, and certificates without CRL. The server uses the following: @code #include "wsseapi-lite.h" #include "threads.h" SOAP_SOCKET m, s; int port = 443; struct soap *soap; if (CRYPTO_thread_setup()) ... // error soap = soap_new1(SOAP_XML_CANONICAL | SOAP_XML_INDENT); if (soap_ssl_server_context(&soap, SOAP_SSL_DEFAULT, // requires server to authenticate, but not the client server.pem, // keyfile for authentication to client "password", // the keyfile password NULL, // CA certificates to authenticate the client NULL, // CA directory path to certificates NULL, // use RSA 2048 bits (or give file name with DH param) NULL, NULL )) ... // error if (!soap_valid_socket(m = soap_bind(soap, NULL, port, 100)) ... // error for (;;) { if (!soap_valid_socket(s = soap_accept(soap))) ... // error THREAD_CREATE(&tid, (void*(*)(void*))&process_request, soap_copy(soap)); } soap_destroy(soap); soap_end(soap); soap_free(soap); CRYPTO_thread_cleanup(); @endcode where we define a process_request function that is executed by the thread to process the request (on a copy of the soap context struct): @code void *process_request(struct soap *soap) { if (soap_ssl_accept(soap) || soap_serve(soap)) ... // error soap_destroy(soap); soap_end(soap); soap_free(soap); } @endcode The `soap_ssl_server_context` only needs to be set up once. Use the following flags: - `SOAP_SSL_DEFAULT` requires server authentication, but no client authentication - `SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION` requires client authentication With OpenSSL, we need to define the thread set up and clean up operations as follows: @code struct CRYPTO_dynlock_value { MUTEX_TYPE mutex; }; static MUTEX_TYPE *mutex_buf; static struct CRYPTO_dynlock_value *dyn_create_function(const char *file, int line) { struct CRYPTO_dynlock_value *value; value = (struct CRYPTO_dynlock_value*)malloc(sizeof(struct CRYPTO_dynlock_value)); if (value) MUTEX_SETUP(value->mutex); return value; } static void dyn_lock_function(int mode, struct CRYPTO_dynlock_value *l, const char *file, int line) { if (mode & CRYPTO_LOCK) MUTEX_LOCK(l->mutex); else MUTEX_UNLOCK(l->mutex); } static void dyn_destroy_function(struct CRYPTO_dynlock_value *l, const char *file, int line) { MUTEX_CLEANUP(l->mutex); free(l); } void locking_function(int mode, int n, const char *file, int line) { if (mode & CRYPTO_LOCK) MUTEX_LOCK(mutex_buf[n]); else MUTEX_UNLOCK(mutex_buf[n]); } unsigned long id_function() { return (unsigned long)THREAD_ID; } int CRYPTO_thread_setup() { int i; mutex_buf = (MUTEX_TYPE*)malloc(CRYPTO_num_locks() * sizeof(pthread_mutex_t)); if (!mutex_buf) return SOAP_EOM; for (i = 0; i < CRYPTO_num_locks(); i++) MUTEX_SETUP(mutex_buf[i]); CRYPTO_set_id_callback(id_function); CRYPTO_set_locking_callback(locking_function); CRYPTO_set_dynlock_create_callback(dyn_create_function); CRYPTO_set_dynlock_lock_callback(dyn_lock_function); CRYPTO_set_dynlock_destroy_callback(dyn_destroy_function); return SOAP_OK; } void CRYPTO_thread_cleanup() { int i; if (!mutex_buf) return; CRYPTO_set_id_callback(NULL); CRYPTO_set_locking_callback(NULL); CRYPTO_set_dynlock_create_callback(NULL); CRYPTO_set_dynlock_lock_callback(NULL); CRYPTO_set_dynlock_destroy_callback(NULL); for (i = 0; i < CRYPTO_num_locks(); i++) MUTEX_CLEANUP(mutex_buf[i]); free(mutex_buf); mutex_buf = NULL; } @endcode For additional details and examples, see the user guide and examples in the gSOAP package directory `gsoap/samples/ssl`. */ #include "wsseapi-lite.h" #if defined(SOAP_WSA_2003) || defined(SOAP_WSA_2004) || defined(SOAP_WSA_200408) || defined(SOAP_WSA_2005) #include "wsaapi.h" #endif /** Clock skew between machines (in sec) to fit message expiration in window */ #define SOAP_WSSE_CLKSKEW (300) #ifdef __cplusplus extern "C" { #endif /******************************************************************************\ * * Common URIs * \******************************************************************************/ const char *wsse_PasswordTextURI = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText"; /******************************************************************************\ * * wsse:Security header element * \******************************************************************************/ /** @fn _wsse__Security* soap_wsse_add_Security(struct soap *soap) @brief Adds Security header element. @param soap context @return _wsse__Security object */ struct _wsse__Security* soap_wsse_add_Security(struct soap *soap) { DBGFUN("soap_wsse_add_Security"); /* if we don't have a SOAP Header, create one */ soap_header(soap); /* if we don't have a wsse:Security element in the SOAP Header, create one */ if (!soap->header->wsse__Security) { soap->header->wsse__Security = (_wsse__Security*)soap_malloc(soap, sizeof(_wsse__Security)); if (!soap->header->wsse__Security) return NULL; soap_default__wsse__Security(soap, soap->header->wsse__Security); } return soap->header->wsse__Security; } /** @fn _wsse__Security* soap_wsse_add_Security_actor(struct soap *soap, const char *actor) @brief Adds Security header element with actor or role attribute. @param soap context @param actor string @return _wsse__Security object */ struct _wsse__Security* soap_wsse_add_Security_actor(struct soap *soap, const char *actor) { _wsse__Security *security = soap_wsse_add_Security(soap); DBGFUN1("soap_wsse_add_Security_actor", "actor=%s", actor); if (soap->namespaces && !strcmp(soap->namespaces[0].ns, "http://schemas.xmlsoap.org/soap/envelope/")) security->SOAP_ENV__actor = soap_strdup(soap, actor); else security->SOAP_ENV__role = soap_strdup(soap, actor); return security; } /** @fn void soap_wsse_delete_Security(struct soap *soap) @brief Deletes Security header element. @param soap context */ void soap_wsse_delete_Security(struct soap *soap) { DBGFUN("soap_wsse_delete_Security"); if (soap->header) soap->header->wsse__Security = NULL; } /** @fn _wsse__Security* soap_wsse_Security(struct soap *soap) @brief Returns Security header element if present. @param soap context @return _wsse__Security object or NULL */ struct _wsse__Security* soap_wsse_Security(struct soap *soap) { if (soap->header) return soap->header->wsse__Security; return NULL; } /******************************************************************************\ * * wsse:Security/wsu:Timestamp header element * \******************************************************************************/ /** @fn int soap_wsse_add_Timestamp(struct soap *soap, const char *id, time_t lifetime) @brief Adds Timestamp element with optional expiration date+time (lifetime). @param[in] soap context @param[in] id for signature referencing or NULL @param[in] lifetime expressed in time_t units, or 0 for no expiration @return SOAP_OK */ int soap_wsse_add_Timestamp(struct soap *soap, const char *id, time_t lifetime) { _wsse__Security *security = soap_wsse_add_Security(soap); time_t now = time(NULL); char *created = soap_strdup(soap, soap_dateTime2s(soap, now)); char *expired = lifetime ? soap_strdup(soap, soap_dateTime2s(soap, now + lifetime)) : NULL; DBGFUN1("soap_wsse_add_Timestamp", "id=%s", id?id:""); /* allocate a Timestamp if we don't have one already */ if (!security->wsu__Timestamp) { security->wsu__Timestamp = (_wsu__Timestamp*)soap_malloc(soap, sizeof(_wsu__Timestamp)); if (!security->wsu__Timestamp) return soap->error = SOAP_EOM; } soap_default__wsu__Timestamp(soap, security->wsu__Timestamp); /* populate the wsu:Timestamp element */ security->wsu__Timestamp->wsu__Id = soap_strdup(soap, id); security->wsu__Timestamp->Created = created; security->wsu__Timestamp->Expires = expired; return SOAP_OK; } /** @fn _wsu__Timestamp *soap_wsse_Timestamp(struct soap *soap) @brief Returns Timestamp element if present. @param soap context @return _wsu__Timestamp object or NULL */ struct _wsu__Timestamp* soap_wsse_Timestamp(struct soap *soap) { _wsse__Security *security = soap_wsse_Security(soap); if (security) return security->wsu__Timestamp; return NULL; } /** @fn int soap_wsse_verify_Timestamp(struct soap *soap) @brief Verifies the Timestamp/Expires element against the current time. @param soap context @return SOAP_OK or SOAP_FAULT with wsu:MessageExpired fault Sets wsu:MessageExpired fault if wsu:Timestamp is expired. The SOAP_WSSE_CLKSKEW value is used as a margin to mitigate clock skew. Keeps silent when no timestamp is supplied or no expiration date is included in the wsu:Timestamp element. */ int soap_wsse_verify_Timestamp(struct soap *soap) { _wsu__Timestamp *timestamp = soap_wsse_Timestamp(soap); DBGFUN("soap_wsse_verify_Timestamp"); /* if we have a timestamp with an expiration date, check it */ if (timestamp && timestamp->Expires) { time_t now = time(NULL), expired; soap_s2dateTime(soap, timestamp->Expires, &expired); if (expired + SOAP_WSSE_CLKSKEW <= now) { const char *code = soap_wsu__tTimestampFault2s(soap, wsu__MessageExpired); return soap_wsse_sender_fault_subcode(soap, code, "Message has expired", timestamp->Expires); } } return SOAP_OK; } /******************************************************************************\ * * wsse:Security/UsernameToken header element * \******************************************************************************/ /** @fn int soap_wsse_add_UsernameTokenText(struct soap *soap, const char *id, const char *username, const char *password) @brief Adds UsernameToken element with optional clear-text password. @param soap context @param[in] id string for signature referencing or NULL @param[in] username string @param[in] password string or NULL to omit the password @return SOAP_OK Passwords are sent in the clear, so transport-level encryption is required. @note This release supports the use of at most one UsernameToken in the header. */ int soap_wsse_add_UsernameTokenText(struct soap *soap, const char *id, const char *username, const char *password) { _wsse__Security *security = soap_wsse_add_Security(soap); DBGFUN2("soap_wsse_add_UsernameTokenText", "id=%s", id?id:"", "username=%s", username?username:""); /* allocate a UsernameToken if we don't have one already */ if (!security->UsernameToken) { if (!(security->UsernameToken = (_wsse__UsernameToken*)soap_malloc(soap, sizeof(_wsse__UsernameToken)))) return soap->error = SOAP_EOM; } soap_default__wsse__UsernameToken(soap, security->UsernameToken); /* populate the UsernameToken */ security->UsernameToken->wsu__Id = soap_strdup(soap, id); security->UsernameToken->Username = soap_strdup(soap, username); /* allocate and populate the Password */ if (password) { if (!(security->UsernameToken->Password = (_wsse__Password*)soap_malloc(soap, sizeof(_wsse__Password)))) return soap->error = SOAP_EOM; soap_default__wsse__Password(soap, security->UsernameToken->Password); security->UsernameToken->Password->Type = (char*)wsse_PasswordTextURI; security->UsernameToken->Password->__item = soap_strdup(soap, password); } return SOAP_OK; } /** @fn _wsse__UsernameToken* soap_wsse_UsernameToken(struct soap *soap, const char *id) @brief Returns UsernameToken element if present. @param soap context @param[in] id string of UsernameToken or NULL @return _wsse__UsernameToken object or NULL @note This release supports the use of at most one UsernameToken in the header. */ struct _wsse__UsernameToken* soap_wsse_UsernameToken(struct soap *soap, const char *id) { _wsse__Security *security = soap_wsse_Security(soap); if (security && security->UsernameToken && (!id || (security->UsernameToken->wsu__Id && !strcmp(security->UsernameToken->wsu__Id, id)))) return security->UsernameToken; return NULL; } /** @fn const char* soap_wsse_get_Username(struct soap *soap) @brief Returns UsernameToken/username string or wsse:FailedAuthentication fault. @param soap context @return UsernameToken/username string or NULL with wsse:FailedAuthentication fault error set @see soap_wsse_verify_Password The returned username should be used to lookup the user's password in a dictionary or database for server-side authentication with soap_wsse_verify_Password. */ const char* soap_wsse_get_Username(struct soap *soap) { _wsse__UsernameToken *token = soap_wsse_UsernameToken(soap, NULL); DBGFUN("soap_wsse_get_Username"); if (token) return token->Username; soap_wsse_fault(soap, wsse__FailedAuthentication, "Username authentication required"); return NULL; } /** @fn int soap_wsse_verify_Password(struct soap *soap, const char *password) @brief Verifies the supplied password or sets wsse:FailedAuthentication fault. @param soap context @param[in] password string to verify against @return SOAP_OK (authorized) or SOAP_FAULT with wsse:FailedAuthentication fault The verification supports both clear-text password verification only. @note This release supports the use of at most one UsernameToken in the header. */ int soap_wsse_verify_Password(struct soap *soap, const char *password) { _wsse__UsernameToken *token = soap_wsse_UsernameToken(soap, NULL); DBGFUN("soap_wsse_verify_Password"); /* if we have a UsernameToken with a Password, check it */ if (token && token->Password) { /* password digest or text? */ if (token->Password->Type && !strcmp(token->Password->Type, wsse_PasswordTextURI)) { /* check password text */ if (!strcmp(token->Password->__item, password)) return SOAP_OK; } } return soap_wsse_fault(soap, wsse__FailedAuthentication, NULL); } /******************************************************************************\ * * Faults * \******************************************************************************/ /** @fn int soap_wsse_sender_fault_subcode(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail) @brief Sets sender SOAP Fault (sub)code for server fault response. @param soap context @param[in] faultsubcode sub code string @param[in] faultstring fault string @param[in] faultdetail detail string @return SOAP_FAULT */ int soap_wsse_sender_fault_subcode(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail) { #if defined(SOAP_WSA_2003) || defined(SOAP_WSA_2004) || defined(SOAP_WSA_200408) || defined(SOAP_WSA_2005) return soap_wsa_sender_fault_subcode(soap, faultsubcode, faultstring, faultdetail); #else return soap_sender_fault_subcode(soap, faultsubcode, faultstring, faultdetail); #endif } /** @fn int soap_wsse_receiver_fault_subcode(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail) @brief Sets receiver SOAP Fault (sub)code for server fault response. @param soap context @param[in] faultsubcode sub code string @param[in] faultstring fault string @param[in] faultdetail detail string @return SOAP_FAULT */ int soap_wsse_receiver_fault_subcode(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail) { #if defined(SOAP_WSA_2003) || defined(SOAP_WSA_2004) || defined(SOAP_WSA_200408) || defined(SOAP_WSA_2005) return soap_wsa_receiver_fault_subcode(soap, faultsubcode, faultstring, faultdetail); #else return soap_receiver_fault_subcode(soap, faultsubcode, faultstring, faultdetail); #endif } /** @fn int soap_wsse_sender_fault(struct soap *soap, const char *faultstring, const char *faultdetail) @brief Sets sender SOAP Fault for server fault response. @param soap context @param[in] faultstring fault string @param[in] faultdetail detail string @return SOAP_FAULT */ int soap_wsse_sender_fault(struct soap *soap, const char *faultstring, const char *faultdetail) { return soap_wsse_sender_fault_subcode(soap, NULL, faultstring, faultdetail); } /** @fn int soap_wsse_receiver_fault(struct soap *soap, const char *faultstring, const char *faultdetail) @brief Sets receiver SOAP Fault for server fault response. @param soap context @param[in] faultstring fault string @param[in] faultdetail detail string @return SOAP_FAULT */ int soap_wsse_receiver_fault(struct soap *soap, const char *faultstring, const char *faultdetail) { return soap_wsse_receiver_fault_subcode(soap, NULL, faultstring, faultdetail); } /** @fn int soap_wsse_fault(struct soap *soap, wsse__FaultcodeEnum fault, const char *detail) @brief Sets SOAP Fault (sub)code for server response. @param soap context @param[in] fault is one of wsse:FaultcodeEnum @param[in] detail string with optional text message @return SOAP_FAULT */ int soap_wsse_fault(struct soap *soap, wsse__FaultcodeEnum fault, const char *detail) { const char *code = soap_wsse__FaultcodeEnum2s(soap, fault); DBGFUN2("soap_wsse_fault", "fault=%s", code?code:"", "detail=%s", detail?detail:""); /* remove incorrect or incomplete Security header */ soap_wsse_delete_Security(soap); /* populate the SOAP Fault as per WS-Security spec */ /* detail = NULL; */ /* uncomment when detail text not recommended */ /* use WSA to populate the SOAP Header when WSA is used */ switch (fault) { case wsse__UnsupportedSecurityToken: return soap_wsse_sender_fault_subcode(soap, code, "An unsupported token was provided", detail); case wsse__UnsupportedAlgorithm: return soap_wsse_sender_fault_subcode(soap, code, "An unsupported signature or encryption algorithm was used", detail); case wsse__InvalidSecurity: return soap_wsse_sender_fault_subcode(soap, code, "An error was discovered processing the header", detail); case wsse__InvalidSecurityToken: return soap_wsse_sender_fault_subcode(soap, code, "An invalid security token was provided", detail); case wsse__FailedAuthentication: return soap_wsse_sender_fault_subcode(soap, code, "The security token could not be authenticated or authorized", detail); case wsse__FailedCheck: return soap_wsse_sender_fault_subcode(soap, code, "The signature or decryption was invalid", detail); case wsse__SecurityTokenUnavailable: return soap_wsse_sender_fault_subcode(soap, code, "Referenced security token could not be retrieved", detail); } return SOAP_FAULT; } /******************************************************************************\ * * Misc functions * \******************************************************************************/ /** @fn int soap_wsse_set_wsu_id(struct soap *soap, const char *tags) @brief Sets the elements that are to be extended with wsu:Id attributes. The wsu:Id attribute values are set to the string value of the tag's QName by replacing colons with hyphens to produce an xsd:ID value. @param soap context @param[in] tags string of space-separated qualified and unqualified element tag names @return SOAP_OK */ int soap_wsse_set_wsu_id(struct soap *soap, const char *tags) { DBGFUN1("soap_wsse_set_wsu_id", "tags=%s", tags?tags:"(null)"); soap->wsuid = soap_strdup(soap, tags); return SOAP_OK; } #ifdef __cplusplus } #endif gsoap-2.8.28/gsoap/plugin/smdevp.c0000644000175000017500000006147512653650150016355 0ustar ellertellert/* smdevp.c gSOAP interface for (signed) message digest gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under one of the following licenses: GPL, the gSOAP public license, or Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2015, Robert van Engelen, Genivia, Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ /** @page smdevp The smdevp signed message digest engine The gSOAP smdevp engine computes signed/unsigned message digests over any type of data using the EVP interface of OpenSSL. It currently supports MD5, SHA1/224/256/384/512, HMAC_SHA1/224/256/384/512, DSA_SHA1/224256/384/512, and RSA_SHA1/224/256/384/512. A digest or signature algorithm is selected with one the following: - @ref SOAP_SMD_HMAC_MD5 to compute HMAC-MD5 message authentication code - @ref SOAP_SMD_HMAC_SHA1 to compute HMAC-SHA1 message authentication code - @ref SOAP_SMD_HMAC_SHA224 to compute HMAC-SHA224 message authentication code - @ref SOAP_SMD_HMAC_SHA256 to compute HMAC-SHA256 message authentication code - @ref SOAP_SMD_HMAC_SHA384 to compute HMAC-SHA384 message authentication code - @ref SOAP_SMD_HMAC_SHA512 to compute HMAC-SHA512 message authentication code - @ref SOAP_SMD_DGST_MD5 to compute MD5 128-bit digests - @ref SOAP_SMD_DGST_SHA1 to compute SHA1 160-bit digests - @ref SOAP_SMD_DGST_SHA224 to compute SHA224 224-bit digests - @ref SOAP_SMD_DGST_SHA256 to compute SHA256 256-bit digests - @ref SOAP_SMD_DGST_SHA384 to compute SHA384 384-bit digests - @ref SOAP_SMD_DGST_SHA512 to compute SHA512 512-bit digests - @ref SOAP_SMD_SIGN_DSA_SHA1 to compute DSA-SHA1 signatures - @ref SOAP_SMD_SIGN_DSA_SHA224 to compute DSA-SHA224 signatures - @ref SOAP_SMD_SIGN_DSA_SHA256 to compute DSA-SHA256 signatures - @ref SOAP_SMD_SIGN_DSA_SHA384 to compute DSA-SHA384 signatures - @ref SOAP_SMD_SIGN_DSA_SHA512 to compute DSA-SHA512 signatures - @ref SOAP_SMD_SIGN_RSA_SHA1 to compute RSA-SHA1 signatures - @ref SOAP_SMD_SIGN_RSA_SHA224 to compute RSA-SHA224 signatures - @ref SOAP_SMD_SIGN_RSA_SHA256 to compute RSA-SHA256 signatures - @ref SOAP_SMD_SIGN_RSA_SHA384 to compute RSA-SHA384 signatures - @ref SOAP_SMD_SIGN_RSA_SHA512 to compute RSA-SHA512 signatures - @ref SOAP_SMD_VRFY_DSA_SHA1 to verify DSA-SHA1 signatures - @ref SOAP_SMD_VRFY_DSA_SHA224 to verify DSA-SHA224 signatures - @ref SOAP_SMD_VRFY_DSA_SHA256 to verify DSA-SHA256 signatures - @ref SOAP_SMD_VRFY_DSA_SHA384 to verify DSA-SHA384 signatures - @ref SOAP_SMD_VRFY_DSA_SHA512 to verify DSA-SHA512 signatures - @ref SOAP_SMD_VRFY_RSA_SHA1 to verify RSA-SHA1 signatures - @ref SOAP_SMD_VRFY_RSA_SHA224 to verify RSA-SHA224 signatures - @ref SOAP_SMD_VRFY_RSA_SHA256 to verify RSA-SHA256 signatures - @ref SOAP_SMD_VRFY_RSA_SHA384 to verify RSA-SHA384 signatures - @ref SOAP_SMD_VRFY_RSA_SHA512 to verify RSA-SHA512 signatures Algorithm options: - @ref SOAP_SMD_PASSTHRU to pass XML through the smdevp engine The smdevp engine wraps the EVP API with three new functions: - @ref soap_smd_init to initialize the engine - @ref soap_smd_update to update the state with a message part - @ref soap_smd_final to compute the digest, signature, or verify a signature and deallocate the engine A higher-level interface for computing (signed) message digests over messages produced by the gSOAP engine is defined by two new functions: - @ref soap_smd_begin to start a digest or signature computation/verification - @ref soap_smd_end to finalize the digest or signature and clean up Compile all source codes with -DWITH_OPENSSL and link with ssl and crypto libraries. Here is an example to sign an XML serialized C++ object using an RSA private key applied to the SHA digest of the serialized object: @code #include "smdevp.h" ns__Object object; int alg = SOAP_SMD_SIGN_RSA_SHA1; FILE *fd = fopen("key.pem", "r"); EVP_PKEY *key = PEM_read_PrivateKey(fd, NULL, NULL, "password"); char *sig = (char*)soap_malloc(soap, soap_smd_size(alg, key)); int siglen; fclose(fd); if (soap_smd_begin(soap, alg, key, 0) || soap_out_ns__Object(soap, "ns:Object", 0, &object, NULL)) { soap_smd_end(soap, NULL, NULL); // clean up soap_print_fault(soap, stderr); } else if (soap_smd_end(soap, sig, &siglen)) soap_print_fault(soap, stderr); else ... // sig contains RSA-SHA1 signature of length siglen EVP_PKEY_free(key); @endcode Compile the gSOAP sources and your code with -DWITH_OPENSSL and link with OpenSSL libraries. There is no XML output generated by this example, as the object is simply serialized to the smdevp engine. To actually pass the XML object through the smdevp engine and output it to a stream or file simultaneously, use the SOAP_SMD_PASSTHRU flag with the algorithm selection as follows: @code ns__Object object; int alg = SOAP_SMD_SIGN_RSA_SHA1; FILE *fd = fopen("key.pem", "r"); EVP_PKEY *key = PEM_read_PrivateKey(fd, NULL, NULL, "password"); char *sig = (char*)soap_malloc(soap, soap_smd_size(alg, key)); int siglen; fclose(fd); soap->sendfd = open("object.xml", O_CREAT | O_WRONLY, 0600); // a file to save object to if (soap_smd_begin(soap, alg | SOAP_SMD_PASSTHRU, key, 0) || soap_begin_send(soap) || soap_out_ns__Object(soap, "ns:Object", 0, &object, NULL) // save to "object.xml" || soap_end_send(soap)) { soap_smd_end(soap, NULL, NULL); // clean up soap_print_fault(soap, stderr); } else if (soap_smd_end(soap, sig, &siglen)) soap_print_fault(soap, stderr); else ... // sig contains RSA-SHA1 signature of length siglen close(soap->sendfd); EVP_PKEY_free(key); @endcode Note that we used soap_begin_send and soap_end_send to emit the XML to a stream. Each type also has a reader (e.g. soap_read_ns__Object) and writer (e.g. soap_write_ns__Object) that can be used instead as these include soap_begin_recv/soap_end_recv and soap_begin_send/soap_end_send call sequences. To verify the signature of an object read from a stream or file, we pass it through the smdevp engine as follows: @code char *sig = ...; int siglen = ...; ns__Object object; int alg = SOAP_SMD_VRFY_RSA_SHA1; FILE *fd = fopen("key.pem", "r"); EVP_PKEY *key; if (...) // key file contains public key? key = PEM_read_PUBKEY(fd, NULL, NULL, NULL); else // key file contains certificate { X509 *cert = PEM_read_X509(fd, NULL, NULL, NULL); key = X509_get_pubkey(cert); X509_free(cert); } fclose(fd); soap->recvfd = open("object.xml", O_RDONLY); if (soap_smd_begin(soap, alg, key, 0) || soap_begin_recv(soap) || soap_in_ns__Object(soap, "ns:Object", &object, NULL) == NULL || soap_end_recv(soap)) { soap_smd_end(soap, NULL, NULL); // clean up soap_print_fault(soap, stderr); } else if (soap_smd_end(soap, sig, &siglen)) soap_print_fault(soap, stderr); else ... // sig verified, i.e. signed object was not changed close(soap->recvfd); EVP_PKEY_free(key); @endcode To verify the signature of an object stored in memory, we use the RSA public key and re-run the octet stream (by re-serialization in this example) through the smdevp engine using the SOAP_SMD_VRFY_RSA_SHA1 algorithm. Note that a PEM file may contain both the (encrypted) private and public keys. @code char *sig = ...; int siglen = ...; ns__Object object; int alg = SOAP_SMD_VRFY_RSA_SHA1; FILE *fd = fopen("key.pem", "r"); EVP_PKEY *key; if (...) // key file contains public key? key = PEM_read_PUBKEY(fd, NULL, NULL, NULL); else // key file contains certificate { X509 *cert = PEM_read_X509(fd, NULL, NULL, NULL); key = X509_get_pubkey(cert); X509_free(cert); } fclose(fd); if (soap_smd_begin(soap, alg, key, 0) || soap_out_ns__Object(soap, "ns:Object", 0, &object, NULL)) { soap_smd_end(soap, NULL, NULL); // clean up soap_print_fault(soap, stderr); } else if (soap_smd_end(soap, sig, &siglen)) soap_print_fault(soap, stderr); else ... // sig verified, i.e. signed object was not changed EVP_PKEY_free(key); @endcode The HMAC algorithm uses a shared secret key (hence both the sender and receiver must keep it secret) to sign and verify a message: @code ns__Object object; int alg = SOAP_SMD_HMAC_SHA1; static char key[16] = { 0xff, 0xee, 0xdd, 0xcc, 0xbb, 0xaa, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x00 }; char *sig = (char*)soap_malloc(soap, soap_smd_size(alg, NULL)); int siglen; if (soap_smd_begin(soap, alg, key, sizeof(key)) || soap_out_ns__Object(soap, "ns:Object", 0, &object, NULL)) { soap_smd_end(soap, NULL, NULL); // clean up soap_print_fault(soap, stderr); } else if {soap_smd_end(soap, sig, &siglen)) soap_print_fault(soap, stderr); else ... // sig holds the signature @endcode HMAC signature verification proceeds by recomputing the signature value for comparison. A digest is a hash value of an octet stream computed using the MD5 or SHA algorithms: @code ns__Object object; int alg = SOAP_SMD_DGST_SHA1; char *digest = (char*)soap_malloc(soap, soap_smd_size(alg, NULL)); int digestlen; if (soap_smd_begin(soap, alg, NULL, 0) || soap_out_ns__Object(soap, "ns:Object", 0, &object, NULL)) { soap_smd_end(soap, NULL, NULL); // clean up soap_print_fault(soap, stderr); } else if (soap_smd_end(soap, digest, &digestlen)) soap_print_fault(soap, stderr); else ... // digest holds hash value of serialized object @endcode Note that indentation (SOAP_XML_INDENT) and exc-c14n canonicalization (SOAP_XML_CANONICAL) affects the XML serialization format and, therefore, the digest or signature produced. */ #include "smdevp.h" #ifdef __cplusplus extern "C" { #endif /******************************************************************************\ * * Static local functions used * \******************************************************************************/ static int soap_smd_send(struct soap *soap, const char *buf, size_t len); static size_t soap_smd_recv(struct soap *soap, char *buf, size_t len); static int soap_smd_check(struct soap *soap, struct soap_smd_data *data, int err, const char *msg); /******************************************************************************\ * * soap_smd API functions * \******************************************************************************/ /** @fn size_t soap_smd_size(int alg, const void *key) @brief Returns the number of octets needed to store the digest or signature returned by soap_smd_end. @param[in] alg is the digest or signature algorithm to be used @param[in] key is a pointer to an EVP_PKEY object for RSA/DSA signatures or NULL for digests and HMAC @return size_t number of octets that is needed to hold digest or signature @see soap_smd_end The values returned for digests are SOAP_SMD_MD5_SIZE, SOAP_SMD_SHA1_SIZE, SOAP_SMD_SHA256_SIZE, SOAP_SMD_SHA512_SIZE. */ size_t soap_smd_size(int alg, const void *key) { switch (alg & SOAP_SMD_ALGO) { case SOAP_SMD_SIGN: case SOAP_SMD_VRFY: /* OpenSSL EVP_PKEY_size returns size of signatures given a key */ return EVP_PKEY_size((EVP_PKEY*)key); case SOAP_SMD_HMAC: case SOAP_SMD_DGST: switch (alg & SOAP_SMD_HASH) { case SOAP_SMD_MD5: return SOAP_SMD_MD5_SIZE; case SOAP_SMD_SHA1: return SOAP_SMD_SHA1_SIZE; case SOAP_SMD_SHA224: return SOAP_SMD_SHA224_SIZE; case SOAP_SMD_SHA256: return SOAP_SMD_SHA256_SIZE; case SOAP_SMD_SHA384: return SOAP_SMD_SHA384_SIZE; case SOAP_SMD_SHA512: return SOAP_SMD_SHA512_SIZE; default: break; } default: break; } return 0; } /** @fn int soap_smd_begin(struct soap *soap, int alg, const void *key, int keylen) @brief Initiates a digest or signature computation. @param soap context @param[in] alg is the digest or signature (sign/verification) algorithm used @param[in] key is a HMAC key or pointer to EVP_PKEY object or NULL for digests @param[in] keylen is the length of the HMAC key or 0 @return SOAP_OK, SOAP_EOM, or SOAP_SSL_ERROR */ int soap_smd_begin(struct soap *soap, int alg, const void *key, int keylen) { struct soap_smd_data *data; data = (struct soap_smd_data*)SOAP_MALLOC(soap, sizeof(struct soap_smd_data)); if (!data) return soap->error = SOAP_EOM; /* save and set the engine's 'data' field to pass data to the callbacks */ soap->data[0] = (void*)data; /* save and override the send and recv callbacks */ data->fsend = soap->fsend; data->frecv = soap->frecv; soap->fsend = soap_smd_send; soap->frecv = soap_smd_recv; /* save the mode flag */ data->mode = soap->mode; /* clear the IO flags and DOM flag */ soap->mode &= ~(SOAP_IO | SOAP_IO_LENGTH | SOAP_ENC_ZLIB | SOAP_XML_DOM); /* clear the XML attribute store */ soap_clr_attr(soap); /* load the local XML namespaces store */ soap_set_local_namespaces(soap); if (soap->mode & SOAP_XML_CANONICAL) soap->ns = 0; /* for in c14n, we must have all xmlns bindings available */ else if (!(alg & SOAP_SMD_PASSTHRU)) soap->ns = 2; /* we don't want leading whitespace in serialized XML */ /* init the soap_smd engine */ return soap_smd_init(soap, data, alg, key, keylen); } /** @fn int soap_smd_end(struct soap *soap, char *buf, int *len) @brief Completes a digest or signature computation. Also deallocates temporary storage allocated by soap_smd_begin(), so MUST be called after soap_smd_begin(). @param soap context @param[in] buf contains signature for verification (when using a SOAP_SMD_VRFY algorithm) or NULL for cleanup @param[out] buf is populated with the digest or signature with maximum length soap_smd_size(alg, key) @param[in] len points to length of signature to verify (when using a SOAP_SMD_VRFY algorithm) or NULL for cleanup @param[out] len points to length of stored digest or signature (when not NULL) @return SOAP_OK, SOAP_USER_ERROR, or SOAP_SSL_ERROR */ int soap_smd_end(struct soap *soap, char *buf, int *len) { struct soap_smd_data *data; int err; data = (struct soap_smd_data*)soap->data[0]; if (!data) { if (soap->error) return soap->error; return soap->error = SOAP_USER_ERROR; } /* finalize the digest/signature computation and store data in buf[len] */ /* for signature verification, buf[len] contain the signature */ err = soap_smd_final(soap, data, buf, len); /* restore the callbacks */ soap->fsend = data->fsend; soap->frecv = data->frecv; /* restore the mode flag */ soap->mode = data->mode; /* free data */ SOAP_FREE(soap, data); soap->data[0] = NULL; /* return SOAP_OK or error */ return err; } /** @fn int soap_smd_init(struct soap *soap, struct soap_smd_data *data, int alg, const void *key, int keylen) @brief Initiates a (signed) digest computation. @param soap context @param[in,out] data smdevp engine context @param[in] alg is algorithm to use @param[in] key is key to use or NULL for digests @param[in] keylen is length of HMAC key (when provided) @return SOAP_OK or SOAP_SSL_ERROR */ int soap_smd_init(struct soap *soap, struct soap_smd_data *data, int alg, const void *key, int keylen) { int ok = 1; const EVP_MD *type; soap_ssl_init(); /* the algorithm to use */ data->alg = alg; /* the key to use */ data->key = key; /* allocate and init the OpenSSL HMAC or EVP_MD context */ if ((alg & SOAP_SMD_ALGO) == SOAP_SMD_HMAC) { data->ctx = (void*)SOAP_MALLOC(soap, sizeof(HMAC_CTX)); if (!data->ctx) return soap_set_receiver_error(soap, "soap_smd_init() failed", "No context", SOAP_SSL_ERROR); HMAC_CTX_init((HMAC_CTX*)data->ctx); } else { data->ctx = (void*)SOAP_MALLOC(soap, sizeof(EVP_MD_CTX)); if (!data->ctx) return soap_set_receiver_error(soap, "soap_smd_init() failed", "No context", SOAP_SSL_ERROR); EVP_MD_CTX_init((EVP_MD_CTX*)data->ctx); } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "-- SMD Init alg=%x (%p) --\n", alg, data->ctx)); /* init the digest or signature computations */ switch (alg & SOAP_SMD_HASH) { case SOAP_SMD_MD5: type = EVP_md5(); break; case SOAP_SMD_SHA1: type = EVP_sha1(); break; #if (OPENSSL_VERSION_NUMBER >= 0x0090800fL) case SOAP_SMD_SHA224: type = EVP_sha224(); break; case SOAP_SMD_SHA256: type = EVP_sha256(); break; case SOAP_SMD_SHA384: type = EVP_sha384(); break; case SOAP_SMD_SHA512: type = EVP_sha512(); break; #endif default: return soap_smd_check(soap, data, 0, "soap_smd_init() failed: cannot load digest"); } switch (alg & SOAP_SMD_ALGO) { case SOAP_SMD_HMAC: HMAC_Init((HMAC_CTX*)data->ctx, key, keylen, type); break; case SOAP_SMD_DGST: EVP_DigestInit((EVP_MD_CTX*)data->ctx, type); break; case SOAP_SMD_SIGN: ok = EVP_SignInit((EVP_MD_CTX*)data->ctx, type); break; case SOAP_SMD_VRFY: ok = EVP_VerifyInit((EVP_MD_CTX*)data->ctx, type); break; default: return soap_set_receiver_error(soap, "Unsupported digest algorithm", NULL, SOAP_SSL_ERROR); } /* check and return */ return soap_smd_check(soap, data, ok, "soap_smd_init() failed"); } /** @fn int soap_smd_update(struct soap *soap, struct soap_smd_data *data, const char *buf, size_t len) @brief Updates (signed) digest computation with message part. @param soap context @param[in,out] data smdevp engine context @param[in] buf contains message part @param[in] len of message part @return SOAP_OK or SOAP_SSL_ERROR */ int soap_smd_update(struct soap *soap, struct soap_smd_data *data, const char *buf, size_t len) { int ok = 1; if (!data->ctx) return soap_set_receiver_error(soap, "soap_smd_update() failed", "No context", SOAP_SSL_ERROR); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "-- SMD Update alg=%x n=%lu (%p) --\n", data->alg, (unsigned long)len, data->ctx)); switch (data->alg & SOAP_SMD_ALGO) { case SOAP_SMD_HMAC: HMAC_Update((HMAC_CTX*)data->ctx, (const unsigned char*)buf, len); break; case SOAP_SMD_DGST: EVP_DigestUpdate((EVP_MD_CTX*)data->ctx, (const void*)buf, (unsigned int)len); break; case SOAP_SMD_SIGN: ok = EVP_SignUpdate((EVP_MD_CTX*)data->ctx, (const void*)buf, (unsigned int)len); break; case SOAP_SMD_VRFY: ok = EVP_VerifyUpdate((EVP_MD_CTX*)data->ctx, (const void*)buf, (unsigned int)len); break; } DBGMSG(TEST, buf, len); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n--")); /* check and return */ return soap_smd_check(soap, data, ok, "soap_smd_update() failed"); } /** @fn int soap_smd_final(struct soap *soap, struct soap_smd_data *data, char *buf, int *len) @brief Finalizes (signed) digest computation and returns digest or signature. @param soap context @param[in,out] data smdevp engine context @param[in] buf contains signature for verification (SOAP_SMD_VRFY algorithms) @param[out] buf is populated with the digest or signature @param[in] len points to length of signature to verify (SOAP_SMD_VRFY algorithms) @param[out] len points to length of stored digest or signature (pass NULL if you are not interested in this value) @return SOAP_OK or SOAP_SSL_ERROR */ int soap_smd_final(struct soap *soap, struct soap_smd_data *data, char *buf, int *len) { unsigned int n = 0; int ok = 1; if (!data->ctx) return soap_set_receiver_error(soap, "soap_smd_final() failed", "No context", SOAP_SSL_ERROR); if (buf) { /* finalize the digest or signature computation */ switch (data->alg & SOAP_SMD_ALGO) { case SOAP_SMD_HMAC: HMAC_Final((HMAC_CTX*)data->ctx, (unsigned char*)buf, &n); break; case SOAP_SMD_DGST: EVP_DigestFinal_ex((EVP_MD_CTX*)data->ctx, (unsigned char*)buf, &n); break; case SOAP_SMD_SIGN: ok = EVP_SignFinal((EVP_MD_CTX*)data->ctx, (unsigned char*)buf, &n, (EVP_PKEY*)data->key); break; case SOAP_SMD_VRFY: if (len) { n = (unsigned int)*len; ok = EVP_VerifyFinal((EVP_MD_CTX*)data->ctx, (unsigned char*)buf, n, (EVP_PKEY*)data->key); } else ok = 0; break; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "-- SMD Final alg=%x (%p) %d bytes--\n", data->alg, data->ctx, n)); DBGHEX(TEST, buf, n); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n--")); /* pass back length of digest or signature produced */ if (len) *len = (int)n; } /* cleanup */ if ((data->alg & SOAP_SMD_ALGO) == SOAP_SMD_HMAC) HMAC_CTX_cleanup((HMAC_CTX*)data->ctx); else EVP_MD_CTX_cleanup((EVP_MD_CTX*)data->ctx); SOAP_FREE(soap, data->ctx); data->ctx = NULL; /* check and return */ return soap_smd_check(soap, data, ok, "soap_smd_final() failed"); } /******************************************************************************\ * * Static local functions * \******************************************************************************/ /** @fn int soap_smd_check(struct soap *soap, struct soap_smd_data *data, int ok, const char *msg) @brief Check result of init/update/final smdevp engine operations. @param soap context @param[in,out] data smdevp engine context @param[in] ok EVP error value @param[in] msg error message @return SOAP_OK or SOAP_SSL_ERROR */ static int soap_smd_check(struct soap *soap, struct soap_smd_data *data, int ok, const char *msg) { if (ok <= 0) { unsigned long r; while ((r = ERR_get_error())) { ERR_error_string_n(r, soap->msgbuf, sizeof(soap->msgbuf)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "-- SMD Error (%d) %s: %s\n", ok, msg, soap->msgbuf)); } if (data->ctx) { if ((data->alg & SOAP_SMD_ALGO) == SOAP_SMD_HMAC) HMAC_CTX_cleanup((HMAC_CTX*)data->ctx); else EVP_MD_CTX_cleanup((EVP_MD_CTX*)data->ctx); SOAP_FREE(soap, data->ctx); data->ctx = NULL; } return soap_set_receiver_error(soap, msg, soap->msgbuf, SOAP_SSL_ERROR); } return SOAP_OK; } /******************************************************************************\ * * Callbacks registered by plugin * \******************************************************************************/ /** @fn int soap_smd_send(struct soap *soap, const char *buf, size_t len) @brief Callback to intercept messages for digest or signature computation/verification. @param soap context @param[in] buf message @param[in] len message length @return SOAP_OK or SOAP_SSL_ERROR */ static int soap_smd_send(struct soap *soap, const char *buf, size_t len) { int err; if (((struct soap_smd_data*)soap->data[0])->alg & SOAP_SMD_PASSTHRU) { if ((err = ((struct soap_smd_data*)soap->data[0])->fsend(soap, buf, len))) return err; } return soap_smd_update(soap, (struct soap_smd_data*)soap->data[0], buf, len); } /** @fn size_t soap_smd_recv(struct soap *soap, char *buf, size_t len) @brief Callback to intercept messages for digest or signature computation/verification. @param soap context @param[in] buf buffer @param[in] len max buffer length @return message size in buffer or 0 on error. */ static size_t soap_smd_recv(struct soap *soap, char *buf, size_t len) { size_t ret = ((struct soap_smd_data*)soap->data[0])->frecv(soap, buf, len); if (ret && soap_smd_update(soap, (struct soap_smd_data*)soap->data[0], buf, ret)) return 0; return ret; } #ifdef __cplusplus } #endif gsoap-2.8.28/gsoap/plugin/httpform.h0000644000175000017500000000526112653650150016716 0ustar ellertellert/* httpform.h gSOAP HTTP POST application/x-www-form-urlencoded plugin. Requires linkage with httpget.c (for query_key and query_val) Note: multipart/related and multipart/form-data are already handled in gSOAP. gSOAP XML Web services tools Copyright (C) 2004-2005, Robert van Engelen, Genivia, Inc. All Rights Reserved. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2004 Robert A. van Engelen, Genivia inc. All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- */ #ifndef HTTPFORM_H #define HTTPFORM_H #include "stdsoap2.h" #include "httpget.h" /* require soap_decode_string */ #ifdef __cplusplus extern "C" { #endif #define HTTP_FORM_ID "HTTP-FORM-1.1" /* plugin identification */ extern const char http_form_id[]; /* This is the local plugin data shared among all copies of the soap struct: */ struct http_form_data { int (*fparsehdr)(struct soap*, const char*, const char*); /* to save and call the internal HTTP header parser */ int (*handler)(struct soap*); }; int http_form(struct soap*, struct soap_plugin*, void*); char *form(struct soap*); #ifdef __cplusplus } #endif #endif gsoap-2.8.28/gsoap/plugin/wsrmapi.h0000644000175000017500000003132312653650150016533 0ustar ellertellert/* wsrmapi.h WS-ReliableMessaging plugin. See wsrmapi.c for documentation and details. gSOAP XML Web services tools Copyright (C) 2000-2013, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under one of the following licenses: GPL, the gSOAP public license, or Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2014, Robert van Engelen, Genivia Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #ifndef WSRMAPI_H #define WSRMAPI_H #include "wsaapi.h" /* also includes stdsoap2.h, soapH.h */ #include "threads.h" /* mutex for sequence database */ #ifdef __cplusplus extern "C" { #endif /** Plugin identification for plugin registry */ #define SOAP_WSRM_ID "WS-RM-1.14" /** Use fast O(1) message allocation/deallocation and lookup at the cost of storing an array of N pointers per sequence, where N = 2^k >= is the number of messages in the sequence */ /* #define SOAP_WSRM_FAST_ALLOC */ /** Plugin identification for plugin registry */ extern const char soap_wsrm_id[]; /** Max number of retries that soap_wsrm_check_retry can succeed */ #ifndef SOAP_WSRM_MAX_RETRIES # define SOAP_WSRM_MAX_RETRIES 100 #endif /** Max seconds to expire a non-terminated sequence and reclaim its resources */ #ifndef SOAP_WSRM_MAX_SEC_TO_EXPIRE # define SOAP_WSRM_MAX_SEC_TO_EXPIRE 600 /* 600 sec = 10 minutes */ #endif /** Seconds to timeout when sending ack messages to independent acksto server */ #ifndef SOAP_WSRM_TIMEOUT # define SOAP_WSRM_TIMEOUT 10 /* 10 sec */ #endif /** WCF channel instance default value (no channel) */ #define SOAP_WSRM_NOCHAN 0x7FFFFFFF /** @enum soap_wsrm_enable @brief wsrm engine state (on/off) */ enum soap_wsrm_enable { SOAP_WSRM_OFF, SOAP_WSRM_ON }; /** @struct soap_wsrm_data @brief Plugin data. */ struct soap_wsrm_data { enum soap_wsrm_enable state; struct soap_wsrm_sequence *seq; struct soap_wsrm_message *msg; int (*fsend)(struct soap*, const char*, size_t); int (*fpreparefinalrecv)(struct soap*); int (*fdisconnect)(struct soap*); }; /** @enum soap_wsrm_message_state @brief Message state (initial, explicit ack'ed, or explicit nack'ed) */ enum soap_wsrm_message_state { SOAP_WSRM_INIT, SOAP_WSRM_ACK, SOAP_WSRM_NACK }; /** @struct soap_wsrm_message @brief Linked list of unacknowledged messages stored for retransmission. */ struct soap_wsrm_message { enum soap_wsrm_message_state state; /**< (n)ack state */ struct soap_wsrm_content *list, *last; /**< list of content blocks */ #ifndef SOAP_WSRM_FAST_ALLOC ULONG64 num; /**< message number */ struct soap_wsrm_message *next; /**< next message in list */ #endif }; /** @struct soap_wsrm_content @brief Linked list of message content blocks. */ struct soap_wsrm_content { char *buf; size_t len; struct soap_wsrm_content *next; }; /** @struct soap_wsrm_ranges @brief Linked list of message range numbers. */ struct soap_wsrm_range { ULONG64 upper, lower; /**< range */ struct soap_wsrm_range *next; /**< next range in list */ }; /** @enum soap_wsrm_state @brief Sequence state */ enum soap_wsrm_state { SOAP_WSRM_NONE, SOAP_WSRM_UNKNOWN, SOAP_WSRM_CREATED, SOAP_WSRM_CLOSED, SOAP_WSRM_TERMINATED }; /** @struct soap_wsrm_sequence @brief Linked list of currently active message sequences. */ struct soap_wsrm_sequence { struct soap_wsrm_sequence *next; /**< next sequence */ size_t refs; /**< #refs to sequence */ short handle; /**< sequence in use by source (has a handle) */ short ackreq; /**< ack requested by dest */ const char *id; /**< sequence ID (from dest) */ const char *acksid; /**< sequence ID for ack requests (gen by source) */ const char *to; /**< to endpoint */ const char *repto; /**< reply to endpoint */ const char *acksto; /**< ack to endpoint */ time_t timestamp; /**< date/time of most recent update */ time_t expires; /**< date/time of expiration */ int retry; /**< retry count */ enum wsrm__IncompleteSequenceBehaviorType behavior; ULONG64 num; /**< message sequence num sent */ ULONG64 recvnum; /**< message num received (used to be lastnum) */ ULONG64 lastnum; /**< last message num received upon closing */ enum wsrm__FaultCodes fault; /**< sequence fault (use when error) */ enum soap_wsrm_state state; /**< sequence state */ #ifdef SOAP_WSRM_FAST_ALLOC struct soap_wsrm_message **messages; /**< array [0 .. seq->num-1] pointing to message content */ #else struct soap_wsrm_message *messages; /**< linked list of messages */ struct soap_wsrm_message *messageslast; /**< back insertion in message list */ #endif struct soap_wsrm_range *ranges; /**< ranges of received messages */ int channel; /**< callback WCF channel instance */ }; typedef struct soap_wsrm_sequence *soap_wsrm_sequence_handle; int soap_wsrm(struct soap *soap, struct soap_plugin *plugin, void *arg); int soap_wsrm_create(struct soap *soap, const char *to, const char *replyto, LONG64 expires, const char *wsa_id, soap_wsrm_sequence_handle *seq); int soap_wsrm_create_offer(struct soap *soap, const char *to, const char *replyto, const char *id, LONG64 expires, enum wsrm__IncompleteSequenceBehaviorType behavior, const char *wsa_id, soap_wsrm_sequence_handle *seq); int soap_wsrm_create_offer_acksto(struct soap *soap, const char *to, const char *replyto, const char *acksto, const char *id, LONG64 expires, enum wsrm__IncompleteSequenceBehaviorType behavior, const char *wsa_id, soap_wsrm_sequence_handle *seq); int soap_wsrm_request_num(struct soap *soap, soap_wsrm_sequence_handle seq, const char *wsa_id, const char *wsa_action, ULONG64 num); int soap_wsrm_request(struct soap *soap, soap_wsrm_sequence_handle seq, const char *wsa_id, const char *wsa_action); int soap_wsrm_request_acks(struct soap *soap, soap_wsrm_sequence_handle seq, const char *wsa_id, const char *wsa_action); int soap_wsrm_check_retry(struct soap *soap, soap_wsrm_sequence_handle seq); int soap_wsrm_resend(struct soap *soap, soap_wsrm_sequence_handle seq, ULONG64 lower, ULONG64 upper); int soap_wsrm_resend_only_nacked(struct soap *soap, soap_wsrm_sequence_handle seq, ULONG64 lower, ULONG64 upper); int soap_wsrm_close(struct soap *soap, soap_wsrm_sequence_handle seq, const char *wsa_id); int soap_wsrm_terminate(struct soap *soap, soap_wsrm_sequence_handle seq, const char *wsa_id); int soap_wsrm_pulse(struct soap *soap, int timeout); int soap_wsrm_acknowledgement(struct soap *soap, soap_wsrm_sequence_handle seq, const char *wsa_id); int soap_wsrm_non_acknowledgement(struct soap *soap, soap_wsrm_sequence_handle seq, ULONG64 nack); soap_wsrm_sequence_handle soap_wsrm_seq(struct soap *soap); void soap_wsrm_seq_release(struct soap *soap, soap_wsrm_sequence_handle seq); int soap_wsrm_seq_created(struct soap *soap, soap_wsrm_sequence_handle seq); int soap_wsrm_seq_valid(struct soap *soap, soap_wsrm_sequence_handle seq); soap_wsrm_sequence_handle soap_wsrm_seq_lookup_id(struct soap *soap, const char *id); soap_wsrm_sequence_handle soap_wsrm_seq_lookup(struct soap *soap, const char *id); void soap_wsrm_seq_free(struct soap *soap, soap_wsrm_sequence_handle seq); void soap_wsrm_cleanup(struct soap *soap); const char *soap_wsrm_to(const soap_wsrm_sequence_handle seq); const char *soap_wsrm_acksto(const soap_wsrm_sequence_handle seq); ULONG64 soap_wsrm_num(const soap_wsrm_sequence_handle seq); ULONG64 soap_wsrm_nack(const soap_wsrm_sequence_handle seq); ULONG64 soap_wsrm_msgs(const soap_wsrm_sequence_handle seq); ULONG64 soap_wsrm_recvnum(const soap_wsrm_sequence_handle seq); ULONG64 soap_wsrm_lastnum(const soap_wsrm_sequence_handle seq); int soap_wsrm_check(struct soap *soap); int soap_wsrm_check_and_wait(struct soap *soap, int timeout); int soap_wsrm_check_send_empty_response(struct soap *soap); int soap_wsrm_check_send_empty_response_and_wait(struct soap *soap, int timeout); int soap_wsrm_reply_num(struct soap *soap, int flag); int soap_wsrm_reply(struct soap *soap, const char *wsa_id, const char *wsa_action); int soap_wsrm_reply_request_acks(struct soap *soap, const char *wsa_id, const char *wsa_action); int soap_wsrm_fault_subcode(struct soap *soap, int flag, const char *faultsubcode, const char *faultstring, const char *faultdetail); int soap_wsrm_sender_fault_subcode(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail); int soap_wsrm_receiver_fault_subcode(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail); int soap_wsrm_sender_fault(struct soap *soap, const char *faultstring, const char *faultdetail); int soap_wsrm_receiver_fault(struct soap *soap, const char *faultstring, const char *faultdetail); int soap_wsrm_check_fault(struct soap *soap, enum wsrm__FaultCodes *fault, const char **info); int soap_wsrm_error(struct soap *soap, struct soap_wsrm_sequence *seq, enum wsrm__FaultCodes fault); void soap_wsrm_dump(struct soap *soap, FILE *fd); #ifdef __cplusplus } #endif /* Server-side generated operations from wsrm.h */ int __wsrm__CreateSequence(struct soap *soap, struct wsrm__CreateSequenceType *req, struct wsrm__CreateSequenceResponseType *res); int __wsrm__CreateSequenceResponse(struct soap *soap, struct wsrm__CreateSequenceResponseType *res); int __wsrm__CloseSequence(struct soap *soap, struct wsrm__CloseSequenceType *req, struct wsrm__CloseSequenceResponseType *res); int __wsrm__CloseSequenceResponse(struct soap *soap, struct wsrm__CloseSequenceResponseType *res); #ifdef SOAP_WSRM_2005 int __wsrm__TerminateSequence(struct soap *soap, struct wsrm__TerminateSequenceType *req, struct wsrm__TerminateSequenceType *res); #else int __wsrm__TerminateSequence(struct soap *soap, struct wsrm__TerminateSequenceType *req, struct wsrm__TerminateSequenceResponseType *res); #endif int __wsrm__TerminateSequenceResponse(struct soap *soap, struct wsrm__TerminateSequenceResponseType *res); int __wsrm__SequenceAcknowledgement(struct soap *soap); /* Client-side generated operations from wsrm.h */ SOAP_FMAC5 int SOAP_FMAC6 soap_call___wsrm__CreateSequence(struct soap *soap, const char *soap_endpoint, const char *soap_action, struct wsrm__CreateSequenceType *wsrm__CreateSequence, struct wsrm__CreateSequenceResponseType *wsrm__CreateSequenceResponse); SOAP_FMAC5 int SOAP_FMAC6 soap_call___wsrm__CloseSequence(struct soap *soap, const char *soap_endpoint, const char *soap_action, struct wsrm__CloseSequenceType *wsrm__CloseSequence, struct wsrm__CloseSequenceResponseType *wsrm__CloseSequenceResponse); SOAP_FMAC5 int SOAP_FMAC6 soap_call___wsrm__TerminateSequence(struct soap *soap, const char *soap_endpoint, const char *soap_action, struct wsrm__TerminateSequenceType *wsrm__TerminateSequence, struct wsrm__TerminateSequenceResponseType *wsrm__TerminateSequenceResponse); SOAP_FMAC5 int SOAP_FMAC6 soap_send___wsrm__SequenceAcknowledgement(struct soap *soap, const char *soap_endpoint, const char *soap_action); SOAP_FMAC5 int SOAP_FMAC6 soap_recv___wsrm__SequenceAcknowledgement(struct soap *soap, struct __wsrm__SequenceAcknowledgement *); SOAP_FMAC5 int SOAP_FMAC6 soap_send___wsrm__LastMessage(struct soap *soap, const char *soap_endpoint, const char *soap_action); #endif gsoap-2.8.28/gsoap/plugin/mq.c0000644000175000017500000003526512653650150015472 0ustar ellertellert/* mq.c Inbound message queues gSOAP XML Web services tools Copyright (C) 2000-2013, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under ONE of the following licenses: GPL, or the gSOAP public license, or Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2013, Robert van Engelen, Genivia Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ /** @mainpage - @ref mq_0 documents the inbound message queue plugin. */ /** @page mq_0 The mq plugin for inbound message queueing and message replay The inbound message queueing plugin can be used to queue messages that should not be discarded with the WS-RM protocol's NoDiscard behavior. Messages that are out of sequence as per WS-RM protocol and should be handled by one thread (or a thread pool) should be queued for later replay and service operation invocation. If an unlimited number of threads is available, the simplest WS-RM protocol NoDiscard behavior is implemented by starting a thread for each inbound message and letting the thread block with the soap_wsrm_check_and_wait() or soap_wsrm_check_send_empty_response_and_wait() calls. However, that approach is not efficient with HTTP keep-alive because the next messages on the keep-alive socket will be blocked from being processes. This plugin is designed to process messages on an HTTP keep-alive socket even when operations block. @section mq_1 Server-Side Queueing of One-Way Messages Queueing one-way messages for internal replay is implemented with the message queueing plugin as follows, by queueing inbound messages received on a single socket and then replaying them all in sequence as received from the socket: @code #include "mq.h" struct soap *soap = soap_new1(SOAP_IO_KEEPALIVE); soap_register_plugin(soap, soap_mq); ... // port bind etc ... while (soap_valid_socket(soap_accept(soap))) { // queue all messages on this socket (socket is HTTP keep alive) // for each message received, we send HTTP 202 Accepted struct ms_queue *queue = soap_mq_queue(soap); struct ms_msg *msg; while (soap_mq_get(soap, queue)) soap_send_empty_response(soap, 202); // 202 Accept // we now internally replay all messages to invoke services // services are assumed to NOT send a response message back // i.e. one-way operations for (msg = soap_mq_begin(queue); msg; msg = soap_mq_next(msg)) soap_serve(&msg->soap); // delete all queued messages, also calls these on each queued msg state: // soap_destroy(&msg->soap); // soap_end(&msg->soap); // soap_done(&msg->soap); soap_mq_del(queue, NULL); // delete the queue (allocated in current context) soap_destroy(soap); soap_end(soap); } @endcode Alternatively, it is also possible to call soap_mq_del(queue, msg) after soap_serve(&msg->soap) to immediately delete the message after processing (calling soap_mq_next(msg) next in the loop is still valid). @section mq_2 WS-RM Server-Side Message Queueing for NoDiscard Behavior with Callback Services When messages are controlled by the WS-ReliableMessaging protocol, we can keep the WS-RM messages in a queue that were received out of order until the order is restored and queued messages can be dispatched. This WS-RM behavior is desirable with WS-RM NoDiscard. To implement this approach, we use an inbound message queue for each socket accepted and processed by a thread. @code #include "wsaapi.h" #include "wsrmapi.h" #include "mq.h" #include "threads.h" struct soap *soap = soap_new1(SOAP_IO_KEEPALIVE); soap_register_plugin(soap, soap_wsa); soap_register_plugin(soap, soap_wsrm); soap_register_plugin(soap, soap_mq); ... // port bind etc ... while (soap_valid_socket(soap_accept(soap))) { THREAD_TYPE tid; struct soap *tsoap = soap_copy(soap); if (!tsoap) { soap_closesock(soap); continue; } THREAD_CREATE(&tid, (void*(*)(void*))process_request, (void*)tsoap); } void *process_request(void *tsoap) { struct soap *soap = (struct soap*)tsoap; struct ms_queue *queue = soap_mq_queue(soap); struct ms_msg *msg; struct soap ctx; while ((msg = soap_mq_get(soap, queue)) != NULL) { // parse the message headers, if NoDiscard then keep message in queue to retry later // copy the context, since we want to preserve the original to retry later soap_copy_context(&ctx, &msg->soap); if (soap_begin_serve(&ctx)) { soap_send_fault(&ctx); // send fault, close socket soap_mq_del(queue, msg); // delete message from queue } else if (!ctx.header || !ctx.header->wsrm__Sequence) { // this is not a WS-RM message, so serve immediately soap_serve(&msg->soap); // service operations soap_mq_del(queue, msg); // delete message from queue } else if (!soap_wsrm_check(&ctx)) { // check is OK, process this WS-RM message now soap_serve(&msg->soap); // service operations SHOULD NOT call soap_wsrm_check() soap_mq_del(queue, msg); // delete message from queue } else if (ctx.error != SOAP_STOP) { // check failed, not a WS-RM message or other WS-RM error soap_send_fault(&ctx); // send fault, close socket soap_mq_del(queue, msg); // delete message from queue } soap_destroy(&ctx); soap_end(&ctx); soap_done(&ctx); } // as long as the queue is not empty and WS-RM sequence(s) not terminated, keep trying while ((msg = soap_mq_begin(queue)) != NULL) { // process queued WS-RM messages for (; msg != NULL; msg = soap_mq_next(msg)) { // try next message in queue soap_copy_context(&ctx, &msg->soap); if (!soap_begin_serve(&ctx) && !soap_wsrm_check(&ctx)) { // check is OK, process message soap_serve(&msg->soap); soap_mq_del(queue, msg); } else if (ctx.error != SOAP_STOP) soap_mq_del(queue, msg); soap_destroy(&ctx); soap_end(&ctx); soap_done(&ctx); } sleep(1); // sleep some before around we go again } return NULL; } @endcode In the first loop that runs over the messages received on the same keep-alive socket, the messages will be processed and services dispatched immediately for non-WS-RM messages and when the WS-RM check succeeds. This check is done in the server dispatch loop as shown, which means that WS-RM-based service operations SHOULD NOT call soap_wsrm_check() again. WS-RM messages that cannot be processed yet since they are out of the sequence order will remain in the queue. The second loop over the queued messages will retry to dispatch service operations according to the WS-RM message order as required by WS-RM NoDiscard sequence behavior. The loop will run until the queue is empty or when the WS-RM sequences are closed/terminated. */ #include "mq.h" #ifdef __cplusplus extern "C" { #endif const char soap_mq_id[] = SOAP_MQ_ID; static int soap_mq_init(struct soap *soap, struct soap_mq_data *data); static void soap_mq_delete(struct soap *soap, struct soap_plugin *p); static size_t soap_mq_recv(struct soap *soap, char *buf, size_t len); static int soap_mq_serveloop(struct soap *soap); static void soap_mq_set(struct soap_mq_msg *msg); /******************************************************************************\ * * Plugin registry functions * \******************************************************************************/ /** plugin registry function, invoked by soap_register_plugin */ int soap_mq(struct soap *soap, struct soap_plugin *p, void *arg) { p->id = soap_mq_id; /* create local plugin data */ p->data = (void*)SOAP_MALLOC(soap, sizeof(struct soap_mq_data)); /* register the destructor */ p->fdelete = soap_mq_delete; /* if OK then initialize */ if (p->data) { if (soap_mq_init(soap, (struct soap_mq_data*)p->data)) { SOAP_FREE(soap, p->data); /* error: could not init */ return SOAP_EOM; /* return error */ } } return SOAP_OK; } /* used by plugin registry function */ static int soap_mq_init(struct soap *soap, struct soap_mq_data *data) { data->buf = NULL; data->len = 0; return SOAP_OK; } static void soap_mq_delete(struct soap *soap, struct soap_plugin *p) { /* free allocated plugin data. If fcopy() is not set, then this function is not called for all copies of the plugin created with soap_copy(). In this example, the fcopy() callback is omitted and the plugin data is shared by the soap copies created with soap_copy() */ SOAP_FREE(soap, p->data); } /******************************************************************************\ * * Callbacks registered by plugin * \******************************************************************************/ static size_t soap_mq_recv(struct soap *soap, char *buf, size_t len) { struct soap_mq_data *data = (struct soap_mq_data*)soap_lookup_plugin(soap, soap_mq_id); if (!data) { soap->error = SOAP_PLUGIN_ERROR; return 0; } if (data->len < len) { len = data->len; data->len = 0; } soap_memcpy(buf, len, data->buf, len); data->buf += len; return len; } static int soap_mq_serveloop(struct soap *soap) { return soap->error = SOAP_STOP; } /******************************************************************************\ * * Queue Operations * \******************************************************************************/ /** @fn struct soap_mq_queue *soap_mq_queue(struct soap *soap) @brief Create a new queue structure allocated in the current context. Will be deallocated with soap_end(soap). Use soap_mq_get() to receive a message from the current socket to add to the queue. @param soap current context @return pointer to the queue structure */ struct soap_mq_queue * soap_mq_queue(struct soap *soap) { struct soap_mq_queue *mq = (struct soap_mq_queue*)soap_malloc(soap, sizeof(struct soap_mq_queue)); if (mq) mq->head = mq->tail = NULL; return mq; } /** @fn struct soap_mq_msg *soap_mq_get(struct soap *soap, struct soap_mq_queue *mq) @brief Receive message from socket and queue it at the end of the queue. @param soap current context @param mq pointer to the message queue structure created by soap_mq_queue() @return pointer to the message received and queued, or NULL */ struct soap_mq_msg * soap_mq_get(struct soap *soap, struct soap_mq_queue *mq) { struct soap_mq_data *data; struct soap_mq_msg *msg; if (soap_begin_recv(soap)) return NULL; msg = (struct soap_mq_msg*)soap_malloc(soap, sizeof(soap_mq_msg)); if (!msg) { soap->error = SOAP_EOM; return NULL; } msg->next = NULL; soap_copy_context(&msg->soap, soap); msg->buf = soap_get_http_body(soap, &msg->len); soap_end_recv(soap); if (!msg->buf) return NULL; soap_mq_set(msg); if (!mq->head) mq->head = mq->tail = msg; else mq->tail = mq->tail->next = msg; return msg; } /** @fn struct soap_mq_msg *soap_mq_begin(struct soap_mq_queue *mq) @brief Get first message in queue. Use msg->soap to invoke service from the queued message, as in soap_serve(&msg->soap). @param mq pointer to the message queue structure created by soap_mq_queue() @return pointer to first message in the queue, or NULL */ struct soap_mq_msg * soap_mq_begin(struct soap_mq_queue *mq) { struct soap_mq_msg *msg = mq->head; if (msg) soap_mq_set(msg); return msg; } /** @fn struct soap_mq_msg *soap_mq_next(struct soap_mq_msg *msg) @brief Get next message in queue. Use msg->soap to invoke service from the queued message, as in soap_serve(&msg->soap). @param msg pointer to current message in the queue @return pointer to next message in the queue, or NULL */ struct soap_mq_msg * soap_mq_next(struct soap_mq_msg *msg) { if (msg) msg = msg->next; if (msg) soap_mq_set(msg); return msg; } /** @fn void soap_mq_del(struct soap_mq_queue *mq, struct soap_mq_msg *msg) @brief Delete message from queue, e.g. after processing it. Delete entire queue when msg==NULL. Note: structures will be deallocated with deallocation with soap_end(). @param mq pointer to the queue structure @param msg pointer to a message in the queue, when NULL delete entire queue */ void soap_mq_del(struct soap_mq_queue *mq, struct soap_mq_msg *msg) { if (mq) { struct soap_mq_msg *p = mq->head; if (msg) { if (p == msg) mq->head = msg->next; else { while (p && p->next != msg) p = p->next; if (p) { p->next = msg->next; if (mq->tail == msg) mq->tail = p; } } soap_destroy(&msg->soap); soap_end(&msg->soap); soap_done(&msg->soap); } else { while (p) { soap_destroy(&p->soap); soap_end(&p->soap); soap_done(&p->soap); p = p->next; } mq->head = mq->tail = NULL; } } } static void soap_mq_set(struct soap_mq_msg *msg) { struct soap_mq_data *data = (struct soap_mq_data*)soap_lookup_plugin(&msg->soap, soap_mq_id); if (data) { data->buf = msg->buf; data->len = msg->len; soap_clr_imode(&msg->soap, SOAP_IO_CHUNK | SOAP_ENC_ZLIB | SOAP_ENC_SSL); msg->soap.frecv = soap_mq_recv; msg->soap.fserveloop = soap_mq_serveloop; } } #ifdef __cplusplus } #endif gsoap-2.8.28/gsoap/plugin/wsddapi.h0000644000175000017500000004310412653650150016504 0ustar ellertellert/* wsddapi.h WS-Discovery 1.1 and 1.0 (WSDD) plugin API See gsoap/doc/wsdd for the WSDD plugin user guide. gSOAP XML Web services tools Copyright (C) 2000-2011, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under one of the following licenses: GPL, the gSOAP public license, or Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2011, Robert van Engelen, Genivia Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #ifndef WSDDAPI_H #define WSDDAPI_H #include "wsaapi.h" /* also includes soapH.h, change wsaapi.h if needed */ #include "threads.h" /* threads and locks from plugin/threads.h */ /******************************************************************************\ * * Common Constants * \******************************************************************************/ /** A Target Service MUST wait t (ms) to elapse before sending the message, where 0 < t < APP_MAX_DELAY is randomly choosen. The default APP_MAX_DELAY is 500 ms. */ #ifndef SOAP_WSDD_APP_MAX_DELAY # define SOAP_WSDD_APP_MAX_DELAY (500) /* ms delay */ #endif /** If the DP is unresponsive after DP_MAX_TIMEOUT, or if the Client finds the responses from the DP unsatisfactory, the Client reverts to using the multicast messages. */ #ifdef SOAP_WSDD_DP_MAX_TIMEOUT # define SOAP_WSDD_DP_MAX_TIMEOUT (5000) /* ms timeout */ #endif /** Managed or ad-hoc mode */ typedef enum soap_wsdd_mode {SOAP_WSDD_MANAGED, SOAP_WSDD_ADHOC} soap_wsdd_mode; /** Send message to Target Service (TS) or Discovery Proxy (DP) */ typedef enum soap_wsdd_to { SOAP_WSDD_TO_DP, SOAP_WSDD_TO_TS } soap_wsdd_to; /******************************************************************************\ * * WS-Discovery operations (copied here from soapClient.cpp) * \******************************************************************************/ SOAP_FMAC5 int SOAP_FMAC6 soap_send___wsdd__Hello(struct soap *soap, const char *soap_endpoint, const char *soap_action, struct wsdd__HelloType *wsdd__Hello); SOAP_FMAC5 int SOAP_FMAC6 soap_recv___wsdd__Hello(struct soap *soap, struct __wsdd__Hello *); SOAP_FMAC5 int SOAP_FMAC6 soap_send___wsdd__Bye(struct soap *soap, const char *soap_endpoint, const char *soap_action, struct wsdd__ByeType *wsdd__Bye); SOAP_FMAC5 int SOAP_FMAC6 soap_recv___wsdd__Bye(struct soap *soap, struct __wsdd__Bye *); SOAP_FMAC5 int SOAP_FMAC6 soap_send___wsdd__Probe(struct soap *soap, const char *soap_endpoint, const char *soap_action, struct wsdd__ProbeType *wsdd__Probe); SOAP_FMAC5 int SOAP_FMAC6 soap_recv___wsdd__Probe(struct soap *soap, struct __wsdd__Probe *); SOAP_FMAC5 int SOAP_FMAC6 soap_send___wsdd__ProbeMatches(struct soap *soap, const char *soap_endpoint, const char *soap_action, struct wsdd__ProbeMatchesType *wsdd__ProbeMatches); SOAP_FMAC5 int SOAP_FMAC6 soap_recv___wsdd__ProbeMatches(struct soap *soap, struct __wsdd__ProbeMatches *); SOAP_FMAC5 int SOAP_FMAC6 soap_send___wsdd__Resolve(struct soap *soap, const char *soap_endpoint, const char *soap_action, struct wsdd__ResolveType *wsdd__Resolve); SOAP_FMAC5 int SOAP_FMAC6 soap_recv___wsdd__Resolve(struct soap *soap, struct __wsdd__Resolve *); SOAP_FMAC5 int SOAP_FMAC6 soap_send___wsdd__ResolveMatches(struct soap *soap, const char *soap_endpoint, const char *soap_action, struct wsdd__ResolveMatchesType *wsdd__ResolveMatches); SOAP_FMAC5 int SOAP_FMAC6 soap_recv___wsdd__ResolveMatches(struct soap *soap, struct __wsdd__ResolveMatches *); /******************************************************************************\ * * WS-Discovery Operations * \******************************************************************************/ #ifdef __cplusplus extern "C" { #endif void soap_wsdd_set_InstanceId(unsigned int InstanceId); void soap_wsdd_set_SequenceId(const char *SequenceId); int soap_wsdd_Hello(struct soap *soap, soap_wsdd_mode mode, const char *endpoint, const char *MessageID, const char *RelatesTo, const char *EndpointReference, const char *Types, const char *Scopes, const char *MatchBy, const char *XAddrs, unsigned int MetadataVersion); int soap_wsdd_Bye(struct soap *soap, soap_wsdd_mode mode, const char *endpoint, const char *MessageID, const char *EndpointReference, const char *Types, const char *Scopes, const char *MatchBy, const char *XAddrs, unsigned int MetadataVersion); int soap_wsdd_Probe(struct soap *soap, soap_wsdd_mode mode, soap_wsdd_to to, const char *endpoint, const char *MessageID, const char *ReplyTo, const char *Types, const char *Scopes, const char *MatchBy); int soap_wsdd_Resolve(struct soap *soap, soap_wsdd_mode mode, soap_wsdd_to to, const char *endpoint, const char *MessageID, const char *ReplyTo, const char *EndpointReference); void soap_wsdd_init_ProbeMatches(struct soap *soap, struct wsdd__ProbeMatchesType *matches); int soap_wsdd_add_ProbeMatch(struct soap *soap, struct wsdd__ProbeMatchesType *matches, const char *EndpointReference, const char *Types, const char *Scopes, const char *MatchBy, const char *XAddrs, unsigned int MetadataVersion); int soap_wsdd_ProbeMatches(struct soap *soap, const char *endpoint, const char *MessageID, const char *RelatesTo, const char *To, struct wsdd__ProbeMatchesType *matches); int soap_wsdd_ResolveMatches(struct soap *soap, const char *endpoint, const char *MessageID, const char *RelatesTo, const char *To, const char *EndpointReference, const char *Types, const char *Scopes, const char *MatchBy, const char *XAddrs, unsigned int MetadataVersion); int soap_wsdd_listen(struct soap *soap, int timeout); int soap_wsdd_serve_request(struct soap *soap); #ifdef __cplusplus } #endif int __wsdd__Hello(struct soap *soap, struct wsdd__HelloType *Hello); int __wsdd__Bye(struct soap *soap, struct wsdd__ByeType *Bye); int __wsdd__Probe(struct soap *soap, struct wsdd__ProbeType *Probe); int __wsdd__ProbeMatches(struct soap *soap, struct wsdd__ProbeMatchesType *ProbeMatches); int __wsdd__Resolve(struct soap *soap, struct wsdd__ResolveType *Resolve); int __wsdd__ResolveMatches(struct soap *soap, struct wsdd__ResolveMatchesType *ResolveMatches); /******************************************************************************\ * * User-defined WS-Discovery event handlers * \******************************************************************************/ /** @fn void wsdd_event_Hello(struct soap *soap, unsigned int InstanceId, const char *SequenceId, unsigned int MessageNumber, const char *MessageID, const char *RelatesTo, const char *EndpointReference, const char *Types, const char *Scopes, const char *MatchBy, const char *XAddrs, unsigned int MetadataVersion) @brief Handles and registers a Hello event from a TS or DP joining the network. @param soap context (use soap->user as a pointer to a global state if needed) @param[in] InstanceId (see WS-Discovery 1.1 Section 7 Application Sequencing) @param[in] SequenceId (see WS-Discovery 1.1 Section 7 Application Sequencing) @param[in] MessageNumber (see WS-Discovery 1.1 Section 7 Application Sequencing) @param[in] MessageID WS-Addressing message ID of the Hello message @param[in] RelatesTo WS-Addressing RelatesTo message ID of the Hello message @param[in] EndpointReference of the Target Service or Discovery Proxy that joins @param[in] Types an unordered string of QNames of services provided by the Target Service or Discovery Proxy where a Discovery Proxy MUST include "wsdd:DiscoveryProxy" @param[in] Scopes an unordered set of Scopes the Target Service or Discovery Proxy is in @param[in] MatchBy unused (reserved) @param[in] XAddrs contains the transport address(es) that MAY be used to communicate with the Target Service or Discovery Proxy @param[in] MetadataVersion incremented by a positive value (>= 1) whenever there is a change in the metadata of the Target Service Hello is a one-way message sent by a Target Service to announce its availability when it joins the network. It is also sent by a Discovery Proxy to reduce multicast traffic on an ad hoc network. To maintain a global state between events, for example to internally register Target Services, Discovery Proxies, and update the status of these, use void *soap->user to point to a global state (that you need to define). */ void wsdd_event_Hello(struct soap *soap, unsigned int InstanceId, const char *SequenceId, unsigned int MessageNumber, const char *MessageID, const char *RelatesTo, const char *EndpointReference, const char *Types, const char *Scopes, const char *MatchBy, const char *XAddrs, unsigned int MetadataVersion); /** @fn void wsdd_event_Bye(struct soap *soap, unsigned int InstanceId, const char *SequenceId, unsigned int MessageNumber, const char *MessageID, const char *RelatesTo, const char *EndpointReference, const char *Types, const char *Scopes, const char *MatchBy, const char *XAddrs, unsigned int *MetadataVersion) @brief Handles and registers a Bye event from a TS or DP leaving the network. @param soap context (use soap->user as a pointer to a global state if needed) @param[in] InstanceId (see WS-Discovery 1.1 Section 7 Application Sequencing) @param[in] SequenceId (see WS-Discovery 1.1 Section 7 Application Sequencing) @param[in] MessageNumber (see WS-Discovery 1.1 Section 7 Application Sequencing) @param[in] MessageID WS-Addressing message ID of the Bye message @param[in] RelatesTo WS-Addressing RelatesTo message ID of the Bye message @param[in] EndpointReference of the Target Service or Discovery Proxy @param[in] Types an unordered string of QNames of services provided by the Target Service or Discovery Proxy where a Discovery Proxy MUST include "wsdd:DiscoveryProxy" @param[in] Scopes an unordered set of Scopes the Target Service or Discovery Proxy is in @param[in] MatchBy unused (reserved) @param[in] XAddrs contains the transport address(es) that MAY be used to communicate with the Target Service or Discovery Proxy @param[in] MetadataVersion incremented by a positive value (>= 1) whenever there is a change in the metadata of the Target Service Bye is a one-way message sent by a Target Service to announce its unavailability as a best effort when it leaves the network. To maintain a global state between events, for example to internally register Target Services, Discovery Proxies, and update the status of these, use void *soap->user to point to a global state (that you need to define). */ void wsdd_event_Bye(struct soap *soap, unsigned int InstanceId, const char *SequenceId, unsigned int MessageNumber, const char *MessageID, const char *RelatesTo, const char *EndpointReference, const char *Types, const char *Scopes, const char *MatchBy, const char *XAddrs, unsigned int *MetadataVersion); /** @fn soap_wsdd_mode wsdd_event_Probe(struct soap *soap, const char *MessageID, const char *ReplyTo, const char *Types, const char *Scopes, const char *MatchBy, struct wsdd__ProbeMatchesType *matches) @brief Handles a Probe event from a Client. @param soap context (use soap->user as a pointer to a global state if needed) @param[in] MessageID WS-Addressing message ID of the message @param[in] ReplyTo WS-Addressing ReplyTo message ID of the message @param[in] Types an unordered string of QNames to probe @param[in] Scopes an unordered set of scopes to probe @param[in] MatchBy matching rule to apply for this probe @param[out] matches contains probe matches returned by event handler, use @ref soap_wsdd_add_ProbeMatch to populate the matches in the handler @return managed (SOAP_WSDD_MANAGED) or ad-hoc (SOAP_WSDD_ADHOC) mode to use to return the matches A Client sends a probe to find Target Services by the Type of the Target Service, a Scope in which the Target Service resides, both, or simply all Target Services. The matches are returned by this server-side event handler that match the Client's probe. To maintain a global state between events, for example to internally register Target Services, Discovery Proxies, and update the status of these, use void *soap->user to point to a global state (that you need to define). */ soap_wsdd_mode wsdd_event_Probe(struct soap *soap, const char *MessageID, const char *ReplyTo, const char *Types, const char *Scopes, const char *MatchBy, struct wsdd__ProbeMatchesType *matches); /** @fn void wsdd_event_ProbeMatches(struct soap *soap, unsigned int InstanceId, const char *SequenceId, unsigned int MessageNumber, const char *MessageID, const char *RelatesTo, struct wsdd__ProbeMatchesType *matches) @brief Handles a Probe event from a Client. @param soap context (use soap->user as a pointer to a global state if needed) @param[in] InstanceId (see WS-Discovery 1.1 Section 7 Application Sequencing) @param[in] SequenceId (see WS-Discovery 1.1 Section 7 Application Sequencing) @param[in] MessageNumber (see WS-Discovery 1.1 Section 7 Application Sequencing) @param[in] MessageID WS-Addressing message ID of the message @param[in] RelatesTo WS-Addressing RelatesTo message ID of the message @param[in] matches contains the probe matches A Client sends a probe to find Target Services by the Type of the Target Service, a Scope in which the Target Service resides, both, or simply all Target Services. The matches are provided to this client-side event handler. To maintain a global state between events, for example to internally register Target Services, Discovery Proxies, and update the status of these, use void *soap->user to point to a global state (that you need to define). */ void wsdd_event_ProbeMatches(struct soap *soap, unsigned int InstanceId, const char *SequenceId, unsigned int MessageNumber, const char *MessageID, const char *RelatesTo, struct wsdd__ProbeMatchesType *matches); /** @fn soap_wsdd_mode wsdd_event_Resolve(struct soap *soap, const char *MessageID, const char *ReplyTo, const char *EndpointReference, struct wsdd__ResolveMatchType *match); @brief Handles a Resolve event from a Client. @param soap context (use soap->user as a pointer to a global state if needed) @param[in] MessageID WS-Addressing message ID of the message @param[in] ReplyTo WS-Addressing ReplyTo message ID of the message @param[in] EndpointReference of the Target Service or Discovery Proxy @param[out] match contains the match returned by the event handler @return managed (SOAP_WSDD_MANAGED) or ad-hoc (SOAP_WSDD_ADHOC) mode to use to return the matches A Client sends a resolve to locate a Target Service, i.e., to retrieve its transport address(es). This server-side event handler returns the match(es). To maintain a global state between events, for example to internally register Target Services, Discovery Proxies, and update the status of these, use void *soap->user to point to a global state (that you need to define). */ soap_wsdd_mode wsdd_event_Resolve(struct soap *soap, const char *MessageID, const char *ReplyTo, const char *EndpointReference, struct wsdd__ResolveMatchType *match); /** @fn void wsdd_event_ResolveMatches(struct soap *soap, unsigned int InstanceId, const char *SequenceId, unsigned int MessageNumber, const char *MessageID, const char *RelatesTo, struct wsdd__ResolveMatchType *match) @brief Handles a Probe event from a Client. @param soap context (use soap->user as a pointer to a global state if needed) @param[in] InstanceId (see WS-Discovery 1.1 Section 7 Application Sequencing) @param[in] SequenceId (see WS-Discovery 1.1 Section 7 Application Sequencing) @param[in] MessageNumber (see WS-Discovery 1.1 Section 7 Application Sequencing) @param[in] MessageID WS-Addressing message ID of the message @param[in] RelatesTo WS-Addressing RelatesTo message ID of the message @param[in] match contains the resolve match A Client sends a resolve to locate a Target Service, i.e., to retrieve its transport address(es). This client-side event handler receives the match. To maintain a global state between events, for example to internally register Target Services, Discovery Proxies, and update the status of these, use void *soap->user to point to a global state (that you need to define). */ void wsdd_event_ResolveMatches(struct soap *soap, unsigned int InstanceId, const char *SequenceId, unsigned int MessageNumber, const char *MessageID, const char *RelatesTo, struct wsdd__ResolveMatchType *match); #endif gsoap-2.8.28/gsoap/plugin/smdevp.h0000644000175000017500000002617712653650150016362 0ustar ellertellert/* smdevp.h gSOAP interface for (signed) message digest gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under one of the following licenses: GPL, the gSOAP public license, or Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2015, Robert van Engelen, Genivia, Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #ifndef SMDEVP_H #define SMDEVP_H #include "stdsoap2.h" #include #include #include #ifdef __cplusplus extern "C" { #endif /** Expose EVP_PKEY in a portable representation */ #define SOAP_SMD_KEY_TYPE EVP_PKEY /** Expose EVP_MAX_MD_SIZE in a portable representation */ #define SOAP_SMD_MAX_SIZE EVP_MAX_MD_SIZE /** MD5 digest size in octets */ #define SOAP_SMD_MD5_SIZE (16) /** SHA1 digest size in octets */ #define SOAP_SMD_SHA1_SIZE (20) /** SHA224 digest size in octets */ #define SOAP_SMD_SHA224_SIZE (28) /** SHA256 digest size in octets */ #define SOAP_SMD_SHA256_SIZE (32) /** SHA384 digest size in octets */ #define SOAP_SMD_SHA384_SIZE (48) /** SHA512 digest size in octets */ #define SOAP_SMD_SHA512_SIZE (64) /******************************************************************************\ * * Supported algorithms * \******************************************************************************/ #define SOAP_SMD_NONE (0x0000) #define SOAP_SMD_HASH (0x000F) #define SOAP_SMD_ALGO (0x0030) #define SOAP_SMD_MASK (0x01FF) /** MD5 HASH */ #define SOAP_SMD_MD5 (0x00) /** SHA1 HASH */ #define SOAP_SMD_SHA1 (0x01) /** SHA224 HASH */ #define SOAP_SMD_SHA224 (0x02) /** SHA256 HASH */ #define SOAP_SMD_SHA256 (0x03) /** SHA384 HASH */ #define SOAP_SMD_SHA384 (0x04) /** SHA512 HASH */ #define SOAP_SMD_SHA512 (0x05) /** HMAC ALGO */ #define SOAP_SMD_HMAC (0x00) /** Digest ALGO */ #define SOAP_SMD_DGST (0x10) /** Sign ALGO */ #define SOAP_SMD_SIGN (0x20) /** Verify ALGO */ #define SOAP_SMD_VRFY (0x30) /** DSA Sign/Verify ALGO */ #define SOAP_SMD_DSA (0x40) /** ECDSA Sign/Verify ALGO */ #define SOAP_SMD_ECDSA (0x80) /** Additional flag: msg sends will pass through digest/signature algorithm */ #define SOAP_SMD_PASSTHRU (0x100) /** HMAC-MD5 shared key signature algorithm */ #define SOAP_SMD_HMAC_MD5 (SOAP_SMD_HMAC | SOAP_SMD_MD5) /** HMAC-SHA1 shared key signature algorithm */ #define SOAP_SMD_HMAC_SHA1 (SOAP_SMD_HMAC | SOAP_SMD_SHA1) /** HMAC-SHA224 shared key signature algorithm */ #define SOAP_SMD_HMAC_SHA224 (SOAP_SMD_HMAC | SOAP_SMD_SHA224) /** HMAC-SHA256 shared key signature algorithm */ #define SOAP_SMD_HMAC_SHA256 (SOAP_SMD_HMAC | SOAP_SMD_SHA256) /** HMAC-SHA384 shared key signature algorithm */ #define SOAP_SMD_HMAC_SHA384 (SOAP_SMD_HMAC | SOAP_SMD_SHA384) /** HMAC-SHA512 shared key signature algorithm */ #define SOAP_SMD_HMAC_SHA512 (SOAP_SMD_HMAC | SOAP_SMD_SHA512) /** DGST-MD5 digest algorithm */ #define SOAP_SMD_DGST_MD5 (SOAP_SMD_DGST | SOAP_SMD_MD5) /** DGST-SHA1 digest algorithm */ #define SOAP_SMD_DGST_SHA1 (SOAP_SMD_DGST | SOAP_SMD_SHA1) /** DGST-SHA224 digest algorithm */ #define SOAP_SMD_DGST_SHA224 (SOAP_SMD_DGST | SOAP_SMD_SHA224) /** DGST-SHA256 digest algorithm */ #define SOAP_SMD_DGST_SHA256 (SOAP_SMD_DGST | SOAP_SMD_SHA256) /** DGST-SHA384 digest algorithm */ #define SOAP_SMD_DGST_SHA384 (SOAP_SMD_DGST | SOAP_SMD_SHA384) /** DGST-SHA512 digest algorithm */ #define SOAP_SMD_DGST_SHA512 (SOAP_SMD_DGST | SOAP_SMD_SHA512) /** RSA-MD5 secret key signature algorithm */ #define SOAP_SMD_SIGN_RSA_MD5 (SOAP_SMD_SIGN | SOAP_SMD_MD5) /** RSA-SHA1 secret key signature algorithm */ #define SOAP_SMD_SIGN_RSA_SHA1 (SOAP_SMD_SIGN | SOAP_SMD_SHA1) /** RSA-SHA224 secret key signature algorithm */ #define SOAP_SMD_SIGN_RSA_SHA224 (SOAP_SMD_SIGN | SOAP_SMD_SHA224) /** RSA-SHA256 secret key signature algorithm */ #define SOAP_SMD_SIGN_RSA_SHA256 (SOAP_SMD_SIGN | SOAP_SMD_SHA256) /** RSA-SHA384 secret key signature algorithm */ #define SOAP_SMD_SIGN_RSA_SHA384 (SOAP_SMD_SIGN | SOAP_SMD_SHA384) /** RSA-SHA512 secret key signature algorithm */ #define SOAP_SMD_SIGN_RSA_SHA512 (SOAP_SMD_SIGN | SOAP_SMD_SHA512) /** DSA-MD5 secret key signature algorithm */ #define SOAP_SMD_SIGN_DSA_MD5 (SOAP_SMD_SIGN | SOAP_SMD_DSA | SOAP_SMD_MD5) /** DSA-SHA1 secret key signature algorithm */ #define SOAP_SMD_SIGN_DSA_SHA1 (SOAP_SMD_SIGN | SOAP_SMD_DSA | SOAP_SMD_SHA1) /** DSA-SHA224 secret key signature algorithm */ #define SOAP_SMD_SIGN_DSA_SHA224 (SOAP_SMD_SIGN | SOAP_SMD_DSA | SOAP_SMD_SHA224) /** DSA-SHA256 secret key signature algorithm */ #define SOAP_SMD_SIGN_DSA_SHA256 (SOAP_SMD_SIGN | SOAP_SMD_DSA | SOAP_SMD_SHA256) /** DSA-SHA384 secret key signature algorithm */ #define SOAP_SMD_SIGN_DSA_SHA384 (SOAP_SMD_SIGN | SOAP_SMD_DSA | SOAP_SMD_SHA384) /** DSA-SHA512 secret key signature algorithm */ #define SOAP_SMD_SIGN_DSA_SHA512 (SOAP_SMD_SIGN | SOAP_SMD_DSA | SOAP_SMD_SHA512) /** ECDSA-MD5 secret key signature algorithm */ #define SOAP_SMD_SIGN_ECDSA_MD5 (SOAP_SMD_SIGN | SOAP_SMD_ECDSA | SOAP_SMD_MD5) /** ECDSA-SHA1 secret key signature algorithm */ #define SOAP_SMD_SIGN_ECDSA_SHA1 (SOAP_SMD_SIGN | SOAP_SMD_ECDSA | SOAP_SMD_SHA1) /** ECDSA-SHA224 secret key signature algorithm */ #define SOAP_SMD_SIGN_ECDSA_SHA224 (SOAP_SMD_SIGN | SOAP_SMD_ECDSA | SOAP_SMD_SHA224) /** ECDSA-SHA256 secret key signature algorithm */ #define SOAP_SMD_SIGN_ECDSA_SHA256 (SOAP_SMD_SIGN | SOAP_SMD_ECDSA | SOAP_SMD_SHA256) /** ECDSA-SHA384 secret key signature algorithm */ #define SOAP_SMD_SIGN_ECDSA_SHA384 (SOAP_SMD_SIGN | SOAP_SMD_ECDSA | SOAP_SMD_SHA384) /** ECDSA-SHA512 secret key signature algorithm */ #define SOAP_SMD_SIGN_ECDSA_SHA512 (SOAP_SMD_SIGN | SOAP_SMD_ECDSA | SOAP_SMD_SHA512) /** RSA-MD5 secret key signature verification algorithm */ #define SOAP_SMD_VRFY_RSA_MD5 (SOAP_SMD_VRFY | SOAP_SMD_MD5) /** RSA-SHA1 secret key signature verification algorithm */ #define SOAP_SMD_VRFY_RSA_SHA1 (SOAP_SMD_VRFY | SOAP_SMD_SHA1) /** RSA-SHA224 secret key signature verification algorithm */ #define SOAP_SMD_VRFY_RSA_SHA224 (SOAP_SMD_VRFY | SOAP_SMD_SHA224) /** RSA-SHA256 secret key signature verification algorithm */ #define SOAP_SMD_VRFY_RSA_SHA256 (SOAP_SMD_VRFY | SOAP_SMD_SHA256) /** RSA-SHA384 secret key signature verification algorithm */ #define SOAP_SMD_VRFY_RSA_SHA384 (SOAP_SMD_VRFY | SOAP_SMD_SHA384) /** RSA-SHA512 secret key signature verification algorithm */ #define SOAP_SMD_VRFY_RSA_SHA512 (SOAP_SMD_VRFY | SOAP_SMD_SHA512) /** DSA-MD5 secret key signature verification algorithm */ #define SOAP_SMD_VRFY_DSA_MD5 (SOAP_SMD_VRFY | SOAP_SMD_DSA | SOAP_SMD_MD5) /** DSA-SHA1 secret key signature verification algorithm */ #define SOAP_SMD_VRFY_DSA_SHA1 (SOAP_SMD_VRFY | SOAP_SMD_DSA | SOAP_SMD_SHA1) /** DSA-SHA224 secret key signature verification algorithm */ #define SOAP_SMD_VRFY_DSA_SHA224 (SOAP_SMD_VRFY | SOAP_SMD_DSA | SOAP_SMD_SHA224) /** DSA-SHA256 secret key signature verification algorithm */ #define SOAP_SMD_VRFY_DSA_SHA256 (SOAP_SMD_VRFY | SOAP_SMD_DSA | SOAP_SMD_SHA256) /** DSA-SHA384 secret key signature verification algorithm */ #define SOAP_SMD_VRFY_DSA_SHA384 (SOAP_SMD_VRFY | SOAP_SMD_DSA | SOAP_SMD_SHA384) /** DSA-SHA512 secret key signature verification algorithm */ #define SOAP_SMD_VRFY_DSA_SHA512 (SOAP_SMD_VRFY | SOAP_SMD_DSA | SOAP_SMD_SHA512) /** ECDSA-MD5 secret key signature verification algorithm */ #define SOAP_SMD_VRFY_ECDSA_MD5 (SOAP_SMD_VRFY | SOAP_SMD_ECDSA | SOAP_SMD_MD5) /** ECDSA-SHA1 secret key signature verification algorithm */ #define SOAP_SMD_VRFY_ECDSA_SHA1 (SOAP_SMD_VRFY | SOAP_SMD_ECDSA | SOAP_SMD_SHA1) /** ECDSA-SHA224 secret key signature verification algorithm */ #define SOAP_SMD_VRFY_ECDSA_SHA224 (SOAP_SMD_VRFY | SOAP_SMD_ECDSA | SOAP_SMD_SHA224) /** ECDSA-SHA256 secret key signature verification algorithm */ #define SOAP_SMD_VRFY_ECDSA_SHA256 (SOAP_SMD_VRFY | SOAP_SMD_ECDSA | SOAP_SMD_SHA256) /** ECDSA-SHA384 secret key signature verification algorithm */ #define SOAP_SMD_VRFY_ECDSA_SHA384 (SOAP_SMD_VRFY | SOAP_SMD_ECDSA | SOAP_SMD_SHA384) /** ECDSA-SHA512 secret key signature verification algorithm */ #define SOAP_SMD_VRFY_ECDSA_SHA512 (SOAP_SMD_VRFY | SOAP_SMD_ECDSA | SOAP_SMD_SHA512) /** @struct soap_smd_data @brief The smdevp engine context data, which is hooked up to soap->data[0] */ struct soap_smd_data { int alg; /**< The digest or signature algorithm used */ void *ctx; /**< EVP_MD_CTX or HMAC_CTX */ const void *key; /**< EVP_PKEY */ int (*fsend)(struct soap*, const char*, size_t); size_t (*frecv)(struct soap*, char*, size_t); soap_mode mode; /**< to preserve soap->mode value */ }; /******************************************************************************\ * * soap_smd API functions * \******************************************************************************/ size_t soap_smd_size(int alg, const void *key); int soap_smd_begin(struct soap *soap, int alg, const void *key, int keylen); int soap_smd_end(struct soap *soap, char *buf, int *len); int soap_smd_init(struct soap *soap, struct soap_smd_data *data, int alg, const void *key, int keylen); int soap_smd_update(struct soap *soap, struct soap_smd_data *data, const char *buf, size_t len); int soap_smd_final(struct soap *soap, struct soap_smd_data *data, char *buf, int *len); #ifdef __cplusplus } #endif #endif gsoap-2.8.28/gsoap/plugin/wsaapi.c0000644000175000017500000016343312653650150016340 0ustar ellertellert/* wsaapi.c WS-Addressing plugin. gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under one of the following licenses: GPL, the gSOAP public license, or Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ /** @mainpage - @ref wsa_0 documents the wsa plugin for WS-Addressing (2003/2004/2005 standards) support. */ /** @page wsa_0 The WS-Addressing plugin [TOC] @section wsa_1 WS-Addressing Setup The material in this section relates to the WS-Addressing specification. To use the wsa plugin: -# Run wsdl2h -t typemap.dat on a WSDL of a service that requires WS-Addressing headers. The typemap.dat file included in the gSOAP package is used to recognize and translate Addressing header blocks. -# Run soapcpp2 -a on the header file produced by wsdl2h. To enable addressing-based service operation selection, you MUST use soapcpp2 option -a. This allows the service to dispatch methods based on the WS-Addressing action information header value (when the wsa plugin is registered). -# (Re-)compile and link stdsoap2.c/pp or libgsoap, (dom.c/pp when needed), wsaapi.c and the soapcpp2-generated source files. -# Use the wsa plugin API functions described below. An example wsa client/server application can be found in `gsoap/samples/wsa`. A gSOAP service definitions header file with a `#import "wsa.h"` to support WS-Addressing is automatically generated by wsdl2h for a set of WSDLs that use WS-Addressing. The wsdl2h-generated header file should be further processed by soapcpp2 to generate the binding code. The wsaapi.h and wsaapi.c implement the WS-Addressing API described in this document. A wsdl2h-generated service definitions header file might include the following imports: @code #import "soap12.h" #import "wsa.h" // or wsa3.h (2003/03), wsa4.h (2004/03), wsa5.h (2005/03) @endcode The wsa.h header file is imported from import/wsa.h when soapcpp2 is run on this file. The wsa.h import can be manually added to enable WS-Addressing when needed. The gSOAP service definitions header file is processed with soapcpp2 to generate the client-side and/or server-side binding code. Note that the wsa.h, wsa3.h, wsa4.h, and wsa5.h header files are located in the import directory of the gSOAP package. These files define the WS-Addressing information header elements and types. The soap12.h header file enables SOAP 1.2 messaging. For developers: the WS-Addressing header blocks in wsa.h (and others) were generated from the WS-Addressing schema with the wsdl2h tool and WS/WS-typemap.dat as follows: wsdl2h -cegy -o wsa.h -t WS/WS-typemap.dat WS/WS-Addressing.xsd Refer to wsa.h for more details. @section wsa_2 Client-side Usage @subsection wsa_2_1 Constructing WS-Addressing Information Headers To associate WS-Addressing information headers with service operations, the SOAP Header struct `SOAP_ENV__Header` must have been defined and for each service operation that uses WS-Addressing method-header-part directives should be used in the gSOAP service definitions header file as follows: @code #import "wsa.h" //gsoap ns service method-header-part: example wsa__MessageID //gsoap ns service method-header-part: example wsa__RelatesTo //gsoap ns service method-header-part: example wsa__From //gsoap ns service method-header-part: example wsa__ReplyTo //gsoap ns service method-header-part: example wsa__FaultTo //gsoap ns service method-header-part: example wsa__To //gsoap ns service method-header-part: example wsa__Action //gsoap ns service method-action: example urn:example/examplePort/example int ns__example(char *in, struct ns__exampleResponse *out); @endcode Note that the use of wsa versions determines the wsa prefix, e.g. use `wsa5` for the latest WS-Addressing as in `wsa5__MessageID`. In the client-side code, the WS-Addressing information headers are set with `soap_wsa_request` by passing an optional message UUID string, a mandatory destination address URI string, and a mandatory request action URI string. The wsa plugin should be registered with the current soap struct context. An optional source address information header can be added with `soap_wsa_add_From` (must be invoked after the `soap_wsa_request` call). For example: @code #include "wsaapi.h" soap_register_plugin(soap, soap_wsa); if (soap_wsa_request(soap, RequestMessageID, ToAddress, RequestAction)) || soap_wsa_add_From(soap, FromAddress)) // optional: add a 'From' address ... // error: out of memory if (soap_call_ns__example(soap, ToAddress, NULL, ...)) soap_print_fault(soap, stderr); // an error occurred else // process the response @endcode To generate a UUID for the RequestMessageID, use: @code const char *RequestMessageID = soap_wsa_rand_uuid(soap); @endcode @subsection wsa_2_2 Information Headers for Relaying Server Responses To relay the response to another destination, the WS-Addressing ReplyTo information header is added with `soap_wsa_add_ReplyTo` by passing a reply address URI string. The service returns "HTTP 202 ACCEPTED" to the client when the response message relay was successful. For example: @code #include "wsaapi.h" soap_register_plugin(soap, soap_wsa); if (soap_wsa_request(soap, RequestMessageID, ToAddress, RequestAction) || soap_wsa_add_From(soap, FromAddress) // optional: add a 'From' address || soap_wsa_add_ReplyTo(soap, ReplyToAddress)) ... // error: out of memory if (soap_call_ns__example(soap, ToAddress, NULL, ...)) { if (soap->error == 202) // HTTP ACCEPTED printf("Request was accepted and results were forwarded\n"); else soap_print_fault(soap, stderr); // an error occurred } else // unexpected OK: for some reason the response was not relayed @endcode Note: the response message will be relayed when the From address is absent or different than the ReplyTo address @subsection wsa_2_3 Information Headers for Relaying Server Faults To relay a server fault message to another destination, the WS-Addressing FaultTo information header is added with `soap_wsa_add_FaultTo` by passing a relay address URI string. The service returns "HTTP 202 ACCEPTED" to the client when the fault was relayed. For example: @code #include "wsaapi.h" soap_register_plugin(soap, soap_wsa); if (soap_wsa_request(soap, RequestMessageID, ToAddress, RequestAction) || soap_wsa_add_From(soap, FromAddress) // optional: add a 'From' address || soap_wsa_add_FaultTo(soap, FaultToAddress)) ... // error: out of memory if (soap_call_ns__example(soap, ToAddress, NULL, ...)) { if (soap->error == 202) // HTTP ACCEPTED printf("A fault occurred and the fault details were forwarded\n"); else soap_print_fault(soap, stderr); // a connection error occurred } else ... // process response @endcode Note that the call can still return a fault, such as a connection error when the service is not responding. In addition to the fault relay, the responses can be relayed with `soap_wsa_add_ReplyTo`. @subsection wsa_2_4 Error Handling SOAP and HTTP errors set the soap->error attribute, as shown in this example: @code if (soap_call_ns__example(soap, ToAddress, NULL, ...)) { if (soap->error == 202) // HTTP ACCEPTED printf("A fault occurred and the fault details were forwarded\n"); else soap_print_fault(soap, stderr); // a connection error occurred } else ... // process response @endcode When a WS-Addressing error occurred, the wsa error code is stored in the SOAP Fault Subcode field. This information can be retrieved with: @code wsa__FaultSubcodeValues fault; if (soap_wsa_check_fault(soap, &fault)) { switch (fault) { case wsa__InvalidMessageInformationHeader: ... case wsa__MessageInformationHeaderRequired: ... case wsa__DestinationUreachable: ... case wsa__ActionNotSupported: ... case wsa__EndpointUnavailable: ... } } @endcode When using wsa5.h, please refer to the standards and fault codes for this implementation. For the wsa5.h 2005/03 standard, several faults have an additional parameter (SOAP Fault detail): @code wsa5__FaultCodesType fault; char *info; if (soap_wsa_check_fault(soap, &fault, &info)) { switch (fault) { case wsa5__InvalidAddressingHeader: if (info) printf("The invalid addressing header element is %s\n", info); ... } } @endcode @subsection wsa_2_5 Combining WS-Addressing with WS-Security WS-Security can be combined with WS-Addressing. To sign WS-Addressing header blocks, use the `soap_wsse_set_wsu_id` WSSE-plugin call to set the wsu:Id attribute and signing of these attributed elements. For example, suppose we use WS-Addressing 2005: @code #include "wsaapi.h" #include "wsseapi.h" soap_register_plugin(soap, soap_wsa); soap_register_plugin(soap, soap_wsse); soap_wsse_set_wsu_id(soap, "wsa5:From wsa5:To wsa5:ReplyTo wsa5:FaultTo wsa5:Action"); if (soap_wsa_request(soap, RequestMessageID, ToAddress, RequestAction) || soap_wsa_add_From(soap, FromAddress) // optional: add a 'From' address || soap_wsa_add_FaultTo(soap, FaultToAddress)) ... // error: out of memory if (soap_call_ns__example(soap, ToAddress, NULL, ...)) ... // error @endcode Note: `soap_wsse_set_wsu_id` should only be set once. Each new call overrides the previous. For more details on WS-Security, please see the [WS-Security plugin documentation](../../wsse/html/index.html). @section wsa_3 Server-side Usage The wsa plugin should be registered with: @code soap_register_plugin(soap, soap_wsa); @endcode Once the plugin is registered, the `soap_bind`, `soap_accept`, and `soap_serve` functions can be called to process requests and semi-automatically handle the WS-Addressing header blocks. Important: to dispatch service operations based on the WS-Addressing wsa:Action information header, you must use soapcpp2 option `-a`. The generates a new dispatcher (in soapServer.c) based on the action value. A service operation implementation should use `soap_wsa_check` at the start of its execution to verify the validity of the WS-Addressing information headers in the SOAP request message. To allow response message to be automatically relayed based on the ReplyTo information header, the service operation should return `soap_wsa_reply` with an optional message UUID string and a mandatory response action string. The response action string is documented in the wsdl2h-generated .h file for this service operation. For example: @code int ns__example(struct soap *soap, char *in, struct ns__exampleResponse *out) { if (soap_wsa_check(soap)) return soap->error; // ... service logic return soap_wsa_reply(soap, ResponseMessageID, ResponseAction); } @endcode To return a SOAP fault that is automatically relayed to a fault service based on the FaultTo information header, the `soap_wsa_sender_fault`, `soap_wsa_receiver_fault`, `soap_wsa_sender_fault_subcode`, and `soap_wsa_receiver_fault_subcode` functions should be used instead of the usual `soap_sender_fault`, `soap_receiver_fault`, `soap_sender_fault_subcode`, and `soap_receiver_fault_subcode`, respectively: In case a Action must be associated with a SOAP Fault, use the `soap_wsa_sender_fault_subcode_action` and `soap_wsa_receiver_fault_subcode_action` functions to set the WS-Addressing Action (and HTTP SOAP Action header as well). For example, the following service operation illustrates the use of `soap_wsa_check` to verify and process WS-Addressing header blocks and `soap_wsa_reply` to enable responses to be relayed as per ReplyTo address in the WS-Addressing header: @code int ns__example(struct soap *soap, char *in, struct ns__exampleResponse *out) { if (soap_wsa_check(soap)) return soap->error; // ... service logic // ... an error occurred, need to return fault possibly to fault service: return soap_wsa_sender_fault(soap, "Exception in service operation", NULL); // ... normal execution continues return soap_wsa_reply(soap, ResponseMessageID, ResponseAction); } @endcode @section wsa_4 HTTPS Server-side Usage To enable HTTPS (SSL/TSL) servers, compile the sources with -DWITH_OPENSSL (and link with libgsoapssl, libssl, and libcrypto). Because WS-Addressing may relay messages over HTTPS as a sender (client), you must initialize the SSL context for server and client uses. Therefore, the context must have access to all the certificates need to verify the authenticity of the ReplyTo and FaultTo HTTPS servers. To do so, use the following SSL initialization before `soap_bind`: @code struct soap *soap = soap_new(); if (soap_ssl_server_context(soap, SOAP_SSL_DEFAULT, "server.pem", // the keyfile (server should authenticate) "password", // password to read the key file "cacert.pem", // cacert file to store trusted certificates (role as client) NULL, // optional capath NULL, // DH file name or DH param key len bits, when NULL use RSA NULL, // file with random data to seed randomness "myserver" // unique server identification for SSL session cache )) { soap_print_fault(soap, stderr); ... } soap->bind_flags = SO_REUSEADDR; if (!soap_valid_socket(soap_bind(soap, NULL, port, 100))) { soap_print_fault(soap, stderr); ... } @endcode @section wsa_5 Implementing a Server for Handling ReplyTo Response Messages To implement a separate server for handling relayed SOAP response messages based on the ReplyTo information header in the request message, the gSOAP header file should include a one-way service operation for the response message. These one-way response service operations are automatically generated with wsdl2h option `-b`. For example, suppose a service operation returns an exampleResponse message. We declare the one-way exampleResponse operation as follows: @code #import "wsa.h" //gsoap ns service method-header-part: exampleResult wsa__MessageID //gsoap ns service method-header-part: exampleResult wsa__RelatesTo //gsoap ns service method-header-part: exampleResult wsa__From //gsoap ns service method-header-part: exampleResult wsa__ReplyTo //gsoap ns service method-header-part: exampleResult wsa__FaultTo //gsoap ns service method-header-part: exampleResult wsa__To //gsoap ns service method-header-part: exampleResult wsa__Action //gsoap ns service method-action: exampleResult urn:example/examplePort/exampleResponse int ns__exampleResponse(char *out, void); @endcode Note that the action information is important, because it is used by the service dispatcher (assuming soapcpp2 option `-a` is used). The implementation in the server code uses soap_wsa_check() to check the presense and validity of the WS-Addressing information header in the message. The `soap_send_empty_response` function should be used to return an acknowledgment HTTP header with "HTTP 202 ACCEPTED" to the sender: @code int ns__exampleResponse(struct soap *soap, char *out) { if (soap_wsa_check(soap)) return soap_send_empty_response(soap, 500); // HTTP 500 Internal Server Error // ... service logic return soap_send_empty_response(soap, SOAP_OK); // HTTP 202 ACCEPTED } @endcode @section wsa_6 Implementing a Server for Handling FaultTo Fault Messages To implement a separate server for handling relayed SOAP fault messages based on the FaultTo information header in the request message, the gSOAP header file for soapcpp2 should include a SOAP fault service operation. This operation accepts fault messages that are relayed by other services. Basically, we use a trick to generate the SOAP-ENV:Fault struct via a one-way service operation. This allows us both to implement a one-way service operation that accepts faults and to automatically generate the fault struct for fault data storage and manipulation. The fault operation in the WS-Addressing files (wsa5.h etc.) is declared as follows (here shown for the 2004/08 standard): @code //gsoap SOAP_ENV service method-action: Fault http://schemas.xmlsoap.org/ws/2004/08/addressing/fault int SOAP_ENV__Fault ( _QName faultcode, // SOAP 1.1 char *faultstring, // SOAP 1.1 char *faultactor, // SOAP 1.1 struct SOAP_ENV__Detail *detail, // SOAP 1.1 struct SOAP_ENV__Code *SOAP_ENV__Code, // SOAP 1.2 struct SOAP_ENV__Reason *SOAP_ENV__Reason, // SOAP 1.2 char *SOAP_ENV__Node, // SOAP 1.2 char *SOAP_ENV__Role, // SOAP 1.2 struct SOAP_ENV__Detail *SOAP_ENV__Detail, // SOAP 1.2 void ); @endcode Because each service operation has a struct to hold its input parameters, we automatically generate the (original) `SOAP_ENV__Fault` struct on the fly! It is important to associate the wsa fault action with this operation as shown above. The implementation of the Fault service operation in your server code should be similar to: @code int SOAP_ENV__Fault(struct soap *soap, char *faultcode, char *faultstring, char *faultactor, struct SOAP_ENV__Detail *detail, struct SOAP_ENV__Code *SOAP_ENV__Code, struct SOAP_ENV__Reason *SOAP_ENV__Reason, char *SOAP_ENV__Node, char *SOAP_ENV__Role, struct SOAP_ENV__Detail *SOAP_ENV__Detail) { ... = faultcode; // SOAP 1.1 fault code string (QName) ... = faultstring; // SOAP 1.1 fault string ... = faultactor; // SOAP 1.1 fault actor string ... = detail; // SOAP 1.1 fault detail struct ... = SOAP_ENV__Code; // SOAP 1.2 fault code struct ... = SOAP_ENV__Reason; // SOAP 1.2 reason struct ... = SOAP_ENV__Node; // SOAP 1.2 node string ... = SOAP_ENV__Role; // SOAP 1.2 role string ... = SOAP_ENV__Detail; // SOAP 1.2 detail struct return SOAP_OK; } @endcode Note that SOAP 1.1 or SOAP 1.2 parameters are set based on the 1.1/1.2 messaging requirements. */ #include "wsaapi.h" #ifdef __cplusplus extern "C" { #endif /** Plugin identification for plugin registry */ const char soap_wsa_id[] = SOAP_WSA_ID; #if defined(SOAP_WSA_2003) /** Anonymous Reply/To endpoint address */ const char *soap_wsa_anonymousURI = "http://schemas.xmlsoap.org/ws/2003/03/addressing/role/anonymous"; /** Specifies no Reply endpoint address (no reply) */ const char *soap_wsa_noneURI = "addressing/none not supported"; const char *soap_wsa_faultAction = "http://schemas.xmlsoap.org/ws/2003/03/addressing/fault"; #elif defined(SOAP_WSA_2004) /** Anonymous Reply/To endpoint address */ const char *soap_wsa_anonymousURI = "http://schemas.xmlsoap.org/ws/2004/03/addressing/role/anonymous"; /** Specifies no Reply endpoint address (no reply) */ const char *soap_wsa_noneURI = "addressing/none not supported"; const char *soap_wsa_faultAction = "http://schemas.xmlsoap.org/ws/2004/03/addressing/fault"; #elif defined(SOAP_WSA_2005) /** Anonymous Reply/To endpoint address */ const char *soap_wsa_anonymousURI = "http://www.w3.org/2005/08/addressing/anonymous"; /** Specifies no Reply endpoint address (no reply) */ const char *soap_wsa_noneURI = "http://www.w3.org/2005/08/addressing/none"; const char *soap_wsa_faultAction = "http://www.w3.org/2005/08/addressing/soap/fault"; #else /** Anonymous Reply/To endpoint address */ const char *soap_wsa_anonymousURI = "http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous"; /** Specifies no Reply endpoint address (no reply) */ const char *soap_wsa_noneURI = "addressing/none not supported"; const char *soap_wsa_faultAction = "http://schemas.xmlsoap.org/ws/2004/08/addressing/fault"; #endif /** anonymous URI of 2004 and 2005 schemas */ const char *soap_wsa_allAnonymousURI = "http://schemas.xmlsoap.org/ws/2004/03/addressing/role/anonymous http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous http://www.w3.org/2005/08/addressing/anonymous"; /******************************************************************************\ * * Static protos * \******************************************************************************/ static int soap_wsa_init(struct soap *soap, struct soap_wsa_data *data); static void soap_wsa_delete(struct soap *soap, struct soap_plugin *p); static int soap_wsa_header(struct soap *soap); static void soap_wsa_set_error(struct soap *soap, const char **c, const char **s); static int soap_wsa_response(struct soap *soap, int status, size_t count); static int soap_wsa_disconnect(struct soap *soap); static int soap_wsa_alloc_header(struct soap *soap); /******************************************************************************\ * * UUID * \******************************************************************************/ /** @fn const char *soap_wsa_rand_uuid(struct soap *soap) @brief Generates a random UUID (UUID algorithm version 4). Compile all source codes with -DWITH_OPENSSL for better randomness results. @param soap context @return UUID "urn:uuid:xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx" */ const char* soap_wsa_rand_uuid(struct soap *soap) { const int uuidlen = 48; char *uuid = (char*)soap_malloc(soap, uuidlen); int r1, r2, r3, r4; #ifdef WITH_OPENSSL r1 = soap_random; r2 = soap_random; #else static int k = 0xFACEB00B; int lo = k % 127773; int hi = k / 127773; # ifdef HAVE_GETTIMEOFDAY struct timeval tv; gettimeofday(&tv, NULL); r1 = 10000000 * tv.tv_sec + tv.tv_usec; #else r1 = (int)time(NULL); # endif k = 16807 * lo - 2836 * hi; if (k <= 0) k += 0x7FFFFFFF; r2 = k; k &= 0x8FFFFFFF; r2 += *(int*)soap->buf; #endif r3 = soap_random; r4 = soap_random; (SOAP_SNPRINTF(uuid, uuidlen, 45), "urn:uuid:%8.8x-%4.4hx-4%3.3hx-%4.4hx-%4.4hx%8.8x", r1, (short)(r2 >> 16), (short)(((short)r2 >> 4) & 0x0FFF), (short)(((short)(r3 >> 16) & 0x3FFF) | 0x8000), (short)r3, r4); DBGFUN1("soap_wsa_rand_uuid", "%s", uuid); return uuid; } /******************************************************************************\ * * Client-side Request * \******************************************************************************/ /** @fn int soap_wsa_request(struct soap *soap, const char *id, const char *to, const char *action) @brief Sets the WS-Addressing information header for the next request message with MessageID (optional), To (optional), and Action (required). @param soap context @param[in] id is the message ID (optional) @param[in] to is the target endpoint (optional, set to anonymous when NULL) @param[in] action is the target action (required) @return SOAP_OK or error Note: use soap_wsa_add_From, soap_wsa_add_ReplyTo, soap_wsa_add_FaultTo to add other addressing fields following this function call. */ int soap_wsa_request(struct soap *soap, const char *id, const char *to, const char *action) { DBGFUN3("soap_wsa_request", "id=%s", id?id:"(null)", "to=%s", to?to:"(null)", "action=%s", action?action:"(null)"); if (soap_wsa_alloc_header(soap)) return soap->error; soap->header->SOAP_WSA(MessageID) = soap_strdup(soap, id); if (to) soap->header->SOAP_WSA(To) = soap_strdup(soap, to); else /* this is optional */ soap->header->SOAP_WSA(To) = (char*)soap_wsa_anonymousURI; soap->header->SOAP_WSA(Action) = soap_strdup(soap, action); soap->header->SOAP_WSA(RelatesTo) = NULL; soap->header->SOAP_WSA(From) = NULL; soap->header->SOAP_WSA(FaultTo) = NULL; soap_wsa_add_ReplyTo(soap, NULL); return soap_wsa_check(soap); } /** @fn int soap_wsa_add_From(struct soap *soap, const char *from) @brief Sets WS-Addressing From header for request message. @param soap context @param[in] from endpoint URI @return SOAP_OK or SOAP_ERR Use soap_wsa_request to populate the WS-Addressing header first. */ int soap_wsa_add_From(struct soap *soap, const char *from) { if (!soap->header) return SOAP_ERR; soap->header->SOAP_WSA(From) = (SOAP_WSA_(,From)*)soap_malloc(soap, sizeof(SOAP_WSA_(,From))); SOAP_WSA_(soap_default,EndpointReferenceType)(soap, soap->header->SOAP_WSA(From)); soap->header->SOAP_WSA(From)->Address = soap_strdup(soap, from); return SOAP_OK; } /** @fn int soap_wsa_add_NoReply(struct soap *soap) @brief Sets WS-Addressing ReplyTo header to 'none' (no reply) @param soap context @return SOAP_OK or SOAP_ERR Note: WS-Addressing 2005/08 standard. Use soap_wsa_request to populate the WS-Addressing header. */ int soap_wsa_add_NoReply(struct soap *soap) { return soap_wsa_add_ReplyTo(soap, soap_wsa_noneURI); } /** @fn int soap_wsa_add_ReplyTo(struct soap *soap, const char *replyTo) @brief Sets WS-Addressing ReplyTo header for request message. @param soap context @param[in] replyTo endpoint URI or NULL for anonymous @return SOAP_OK or SOAP_ERR Use soap_wsa_request to populate the WS-Addressing header. */ int soap_wsa_add_ReplyTo(struct soap *soap, const char *replyTo) { if (!soap->header) return SOAP_ERR; #ifndef SOAP_WSA_2005 if (!replyTo) replyTo = soap_wsa_anonymousURI; #endif if (replyTo) { soap->header->SOAP_WSA(ReplyTo) = (SOAP_WSA_(,ReplyTo)*)soap_malloc(soap, sizeof(SOAP_WSA_(,ReplyTo))); SOAP_WSA_(soap_default,EndpointReferenceType)(soap, soap->header->SOAP_WSA(ReplyTo)); soap->header->SOAP_WSA(ReplyTo)->Address = soap_strdup(soap, replyTo); } else soap->header->SOAP_WSA(ReplyTo) = NULL; return SOAP_OK; } /** @fn int soap_wsa_add_FaultTo(struct soap *soap, const char *faultTo) @brief Sets WS-Addressing FaultTo header for request message. @param soap context @param[in] faultTo endpoint URI or NULL for remove faultTo @return SOAP_OK or SOAP_ERR Use soap_wsa_request to populate the WS-Addressing header first. */ int soap_wsa_add_FaultTo(struct soap *soap, const char *faultTo) { if (!soap->header) return SOAP_ERR; if (faultTo) { soap->header->SOAP_WSA(FaultTo) = (SOAP_WSA_(,FaultTo)*)soap_malloc(soap, sizeof(SOAP_WSA_(,FaultTo))); SOAP_WSA_(soap_default,EndpointReferenceType)(soap, soap->header->SOAP_WSA(FaultTo)); soap->header->SOAP_WSA(FaultTo)->Address = soap_strdup(soap, faultTo); } else soap->header->SOAP_WSA(FaultTo) = NULL; return SOAP_OK; } /** @fn int soap_wsa_add_RelatesTo(struct soap *soap, const char *relatesTo) @brief Sets WS-Addressing RelatesTo header. @param soap context @param[in] relatesTo endpoint URI @return SOAP_OK or SOAP_ERR Use soap_wsa_request to populate the WS-Addressing header. */ int soap_wsa_add_RelatesTo(struct soap *soap, const char *relatesTo) { if (!soap->header) return SOAP_ERR; if (relatesTo) { soap->header->SOAP_WSA(RelatesTo) = (SOAP_WSA_(,RelatesTo)*)soap_malloc(soap, sizeof(SOAP_WSA_(,RelatesTo))); SOAP_WSA_(soap_default_,RelatesTo)(soap, soap->header->SOAP_WSA(RelatesTo)); soap->header->SOAP_WSA(RelatesTo)->__item = soap_strdup(soap, relatesTo); } return SOAP_OK; } /** @fn const char *soap_wsa_From(struct soap *soap) @brief Returns WS-Addressing From header. @param soap context @return From string or NULL */ const char* soap_wsa_From(struct soap *soap) { if (!soap->header || !soap->header->SOAP_WSA(From)) return NULL; return soap->header->SOAP_WSA(From)->Address; } /** @fn const char *soap_wsa_ReplyTo(struct soap *soap) @brief Returns WS-Addressing ReplyTo header. @param soap context @return From string or NULL */ const char* soap_wsa_ReplyTo(struct soap *soap) { if (!soap->header || !soap->header->SOAP_WSA(ReplyTo)) return NULL; return soap->header->SOAP_WSA(ReplyTo)->Address; } /** @fn const char *soap_wsa_FaultTo(struct soap *soap) @brief Returns WS-Addressing FaultTo header. @param soap context @return From string or NULL */ const char* soap_wsa_FaultTo(struct soap *soap) { if (!soap->header || !soap->header->SOAP_WSA(FaultTo)) return NULL; return soap->header->SOAP_WSA(FaultTo)->Address; } /** @fn const char *soap_wsa_RelatesTo(struct soap *soap) @brief Returns WS-Addressing RelatesTo header. @param soap context @return From string or NULL */ const char* soap_wsa_RelatesTo(struct soap *soap) { if (!soap->header || !soap->header->SOAP_WSA(RelatesTo)) return NULL; return soap->header->SOAP_WSA(RelatesTo)->__item; } /******************************************************************************\ * * Server-side Check and Reply * \******************************************************************************/ /** @fn int soap_wsa_check(struct soap *soap) @brief Checks the presence and validity of WS-Addressing information headers. @param soap context @return SOAP_OK or fault */ int soap_wsa_check(struct soap *soap) { DBGFUN("soap_wsa_check"); if (!soap->header || !soap->header->SOAP_WSA(Action)) #if defined(SOAP_WSA_2005) return soap_wsa_error(soap, wsa5__MessageAddressingHeaderRequired, NULL); #elif defined(SOAP_WSA_2003) return soap_wsa_error(soap, "WS-Addressing header missing"); #else return soap_wsa_error(soap, SOAP_WSA(MessageInformationHeaderRequired)); #endif return SOAP_OK; } /** @fn int soap_wsa_reply(struct soap *soap, const char *id, const char *action) @brief Sets WS-Addressing header fields for server response. Automatically relays the response to the ReplyTo address (when ReplyTo != to From and ReplyTo != 'none') and returns HTTP 202 Accept to sender when relay was successful. @param soap context @param[in] id is the messageID (optional) @param[in] action is the target action (required) @return SOAP_OK or fault */ int soap_wsa_reply(struct soap *soap, const char *id, const char *action) { struct soap_wsa_data *data = (struct soap_wsa_data*)soap_lookup_plugin(soap, soap_wsa_id); struct SOAP_ENV__Header *oldheader, *newheader; DBGFUN1("soap_wsa_reply", "action=%s", action?action:"(null)"); if (!data) return soap->error = SOAP_PLUGIN_ERROR; oldheader = soap->header; soap->header = NULL; /* if endpoint address for reply is 'none' return immediately and STOP engine */ if (oldheader && oldheader->SOAP_WSA(ReplyTo) && oldheader->SOAP_WSA(ReplyTo)->Address && !strcmp(oldheader->SOAP_WSA(ReplyTo)->Address, soap_wsa_noneURI)) return soap_send_empty_response(soap, SOAP_OK); /* allocate a new header */ if (soap_wsa_alloc_header(soap)) return soap->error; newheader = soap->header; /* copy members to new header, except WSA data */ if (oldheader) *newheader = *oldheader; newheader->SOAP_WSA(MessageID) = soap_strdup(soap, id); newheader->SOAP_WSA(Action) = soap_strdup(soap, action); newheader->SOAP_WSA(RelatesTo) = NULL; newheader->SOAP_WSA(From) = NULL; newheader->SOAP_WSA(To) = NULL; newheader->SOAP_WSA(ReplyTo) = NULL; newheader->SOAP_WSA(FaultTo) = NULL; /* check current header content */ if (oldheader && oldheader->SOAP_WSA(MessageID)) { newheader->SOAP_WSA(RelatesTo) = (SOAP_WSA_(,RelatesTo)*)soap_malloc(soap, sizeof(SOAP_WSA_(,RelatesTo))); SOAP_WSA_(soap_default_,RelatesTo)(soap, newheader->SOAP_WSA(RelatesTo)); newheader->SOAP_WSA(RelatesTo)->__item = oldheader->SOAP_WSA(MessageID); } #ifdef SOAP_WSA_2005 /* WCF Interoperability: ChannelInstance is required when the WCF Application hosts multiple Callback Channels within the same application. The ReferenceParameters->ChannelInstance element serves as a hint to the WCF Client dispatcher, as to which WCF callback instance a received SOAP Envelope belongs to ChannelInstance is declared as a pointer, so it is essentially an optional element. Tests with Applications not requiring ChannelInstance have also been done for the following fix. */ if (oldheader && oldheader->SOAP_WSA(ReplyTo) && oldheader->SOAP_WSA(ReplyTo)->ReferenceParameters && oldheader->SOAP_WSA(ReplyTo)->ReferenceParameters->chan__ChannelInstance) { if (newheader) { if (!newheader->chan__ChannelInstance) { newheader->chan__ChannelInstance = (struct chan__ChannelInstanceType*)soap_malloc(soap, sizeof(struct chan__ChannelInstanceType)); if (newheader->chan__ChannelInstance) { soap_default_chan__ChannelInstanceType(soap, newheader->chan__ChannelInstance); newheader->chan__ChannelInstance->__item = *(oldheader->SOAP_WSA(ReplyTo)->ReferenceParameters->chan__ChannelInstance); newheader->chan__ChannelInstance->wsa5__IsReferenceParameter = _wsa5__IsReferenceParameter__true; } } else { newheader->chan__ChannelInstance->__item = *(oldheader->SOAP_WSA(ReplyTo)->ReferenceParameters->chan__ChannelInstance); newheader->chan__ChannelInstance->wsa5__IsReferenceParameter = _wsa5__IsReferenceParameter__true; } } } #endif if (oldheader && oldheader->SOAP_WSA(ReplyTo) && oldheader->SOAP_WSA(ReplyTo)->Address && !soap_tagsearch(soap_wsa_allAnonymousURI, oldheader->SOAP_WSA(ReplyTo)->Address)) { newheader->SOAP_WSA(To) = oldheader->SOAP_WSA(ReplyTo)->Address; /* (re)connect to ReplyTo endpoint if From != ReplyTo */ if (!oldheader->SOAP_WSA(From) || !oldheader->SOAP_WSA(From)->Address || strcmp(oldheader->SOAP_WSA(From)->Address, oldheader->SOAP_WSA(ReplyTo)->Address)) { struct soap *reply_soap = soap_copy(soap); if (reply_soap) { soap_copy_stream(reply_soap, soap); soap_free_stream(soap); /* prevents close in soap_connect() below */ soap->omode |= SOAP_ENC_XML; /* omit HTTP header ("encode XML body only") */ if (soap_connect(soap, newheader->SOAP_WSA(To), newheader->SOAP_WSA(Action))) { int err; soap_copy_stream(soap, reply_soap); soap_free_stream(reply_soap); soap_end(reply_soap); soap_free(reply_soap); soap->header = oldheader; #if defined(SOAP_WSA_2005) err = soap_wsa_error(soap, SOAP_WSA(DestinationUnreachable), newheader->SOAP_WSA(To)); #elif defined(SOAP_WSA_2003) err = soap_wsa_error(soap, "WS-Addessing destination unreachable"); #else err = soap_wsa_error(soap, SOAP_WSA(DestinationUnreachable)); #endif soap->header = NULL; return err; } if (soap_valid_socket(reply_soap->socket)) soap_send_empty_response(reply_soap, SOAP_OK); /* HTTP ACCEPTED */ soap->header = newheader; soap->omode &= ~SOAP_ENC_XML; /* HTTP header required */ soap_end(reply_soap); soap_free(reply_soap); data->fresponse = soap->fresponse; soap->fresponse = soap_wsa_response; /* response will be a POST */ } } } else if (oldheader && oldheader->SOAP_WSA(From)) newheader->SOAP_WSA(To) = oldheader->SOAP_WSA(From)->Address; else newheader->SOAP_WSA(To) = (char*)soap_wsa_anonymousURI; soap->header = newheader; soap->action = newheader->SOAP_WSA(Action); return SOAP_OK; } /******************************************************************************\ * * Server-side SOAP Fault * \******************************************************************************/ /** @fn int soap_wsa_fault_subcode(struct soap *soap, int flag, const char *faultsubcode, const char *faultstring, const char *faultdetail) @brief Sets sender/receiver SOAP Fault (sub)code for server fault response. @param soap context @param[in] flag 0=receiver, 1=sender @param[in] faultsubcode sub code string @param[in] faultstring fault string @param[in] faultdetail detail string @return SOAP_FAULT */ int soap_wsa_fault_subcode(struct soap *soap, int flag, const char *faultsubcode, const char *faultstring, const char *faultdetail) { return soap_wsa_fault_subcode_action(soap, flag, faultsubcode, faultstring, faultdetail, NULL); } /** @fn int soap_wsa_fault_subcode_action(struct soap *soap, int flag, const char *faultsubcode, const char *faultstring, const char *faultdetail, const char *action) @brief Sets sender/receiver SOAP Fault (sub)code and action for server fault response. @param soap context @param[in] flag 0=receiver, 1=sender @param[in] faultsubcode sub code string @param[in] faultstring fault string @param[in] faultdetail detail string @param[in] action WS-Addressing action string @return SOAP_FAULT */ int soap_wsa_fault_subcode_action(struct soap *soap, int flag, const char *faultsubcode, const char *faultstring, const char *faultdetail, const char *action) { struct soap_wsa_data *data = (struct soap_wsa_data*)soap_lookup_plugin(soap, soap_wsa_id); struct SOAP_ENV__Header *oldheader, *newheader; DBGFUN2("soap_wsa_fault_subcode", "faultsubcode=%s", faultsubcode?faultsubcode:"(null)", "faultstring=%s", faultstring?faultstring:"(null)"); if (!data) return soap->error = SOAP_PLUGIN_ERROR; oldheader = soap->header; /* no FaultTo: use ReplyTo */ if (oldheader && oldheader->SOAP_WSA(ReplyTo) && (!oldheader->SOAP_WSA(FaultTo) || soap_tagsearch(soap_wsa_allAnonymousURI, oldheader->SOAP_WSA(FaultTo)->Address))) { if (!oldheader->SOAP_WSA(FaultTo)) { oldheader->SOAP_WSA(FaultTo) = (SOAP_WSA_(,FaultTo)*)soap_malloc(soap, sizeof(SOAP_WSA_(,FaultTo))); SOAP_WSA_(soap_default,EndpointReferenceType)(soap, soap->header->SOAP_WSA(FaultTo)); } oldheader->SOAP_WSA(FaultTo)->Address = oldheader->SOAP_WSA(ReplyTo)->Address; } if (oldheader && oldheader->SOAP_WSA(FaultTo)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "WSA FaultTo='%s'\n", oldheader->SOAP_WSA(FaultTo)->Address)); } if (oldheader && oldheader->SOAP_WSA(FaultTo) && !strcmp(oldheader->SOAP_WSA(FaultTo)->Address, soap_wsa_noneURI)) return soap_send_empty_response(soap, SOAP_OK); /* HTTP ACCEPTED */ soap->header = NULL; /* allocate a new header */ if (soap_wsa_alloc_header(soap)) return soap->error; newheader = soap->header; soap_default_SOAP_ENV__Header(soap, newheader); /* remove/clear SOAP Header */ /* check header */ if (oldheader && oldheader->SOAP_WSA(MessageID)) { newheader->SOAP_WSA(RelatesTo) = (SOAP_WSA_(,RelatesTo)*)soap_malloc(soap, sizeof(SOAP_WSA_(,RelatesTo))); SOAP_WSA_(soap_default_,RelatesTo)(soap, newheader->SOAP_WSA(RelatesTo)); newheader->SOAP_WSA(RelatesTo)->__item = oldheader->SOAP_WSA(MessageID); } /* header->wsa__MessageID = "..."; */ newheader->SOAP_WSA(Action) = (char*)soap_wsa_faultAction; if (oldheader && oldheader->SOAP_WSA(FaultTo) && oldheader->SOAP_WSA(FaultTo)->Address && !soap_tagsearch(soap_wsa_allAnonymousURI, oldheader->SOAP_WSA(FaultTo)->Address)) { newheader->SOAP_WSA(To) = oldheader->SOAP_WSA(FaultTo)->Address; /* (re)connect to FaultTo endpoint if From != FaultTo */ if (!oldheader->SOAP_WSA(From) || !oldheader->SOAP_WSA(From)->Address || strcmp(oldheader->SOAP_WSA(From)->Address, oldheader->SOAP_WSA(FaultTo)->Address)) { soap->keep_alive = 0; soap_send_empty_response(soap, SOAP_OK); /* HTTP ACCEPTED */ if (soap_connect(soap, newheader->SOAP_WSA(To), newheader->SOAP_WSA(Action))) return soap->error = SOAP_STOP; /* nowhere to go */ soap_set_endpoint(soap, newheader->SOAP_WSA(To)); if (action) soap->action = (char*)action; else soap->action = newheader->SOAP_WSA(Action); data->fresponse = soap->fresponse; soap->fresponse = soap_wsa_response; /* response will be a POST */ } } else if (oldheader && oldheader->SOAP_WSA(From)) newheader->SOAP_WSA(To) = oldheader->SOAP_WSA(From)->Address; else newheader->SOAP_WSA(To) = (char*)soap_wsa_anonymousURI; soap->header = newheader; if (flag) return soap_sender_fault_subcode(soap, faultsubcode, faultstring, faultdetail); return soap_receiver_fault_subcode(soap, faultsubcode, faultstring, faultdetail); } /** @fn int soap_wsa_sender_fault_subcode(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail) @brief Sets sender SOAP Fault (sub)code for server fault response. @param soap context @param[in] faultsubcode sub code string @param[in] faultstring fault string @param[in] faultdetail detail string @return SOAP_FAULT */ int soap_wsa_sender_fault_subcode(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail) { return soap_wsa_fault_subcode(soap, 1, faultsubcode, faultstring, faultdetail); } /** @fn int soap_wsa_sender_fault_subcode_action(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail, const char *action) @brief Sets sender SOAP Fault (sub)code for server fault response. @param soap context @param[in] faultsubcode sub code string @param[in] faultstring fault string @param[in] faultdetail detail string @param[in] action WS-Addressing action string @return SOAP_FAULT */ int soap_wsa_sender_fault_subcode_action(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail, const char *action) { return soap_wsa_fault_subcode_action(soap, 1, faultsubcode, faultstring, faultdetail, action); } /** @fn int soap_wsa_receiver_fault_subcode(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail) @brief Sets receiver SOAP Fault (sub)code for server fault response. @param soap context @param[in] faultsubcode sub code string @param[in] faultstring fault string @param[in] faultdetail detail string @return SOAP_FAULT */ int soap_wsa_receiver_fault_subcode(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail) { return soap_wsa_fault_subcode(soap, 0, faultsubcode, faultstring, faultdetail); } /** @fn int soap_wsa_receiver_fault_subcode_action(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail, const char *action) @brief Sets receiver SOAP Fault (sub)code for server fault response. @param soap context @param[in] faultsubcode sub code string @param[in] faultstring fault string @param[in] faultdetail detail string @param[in] action WS-Addressing action string @return SOAP_FAULT */ int soap_wsa_receiver_fault_subcode_action(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail, const char *action) { return soap_wsa_fault_subcode_action(soap, 0, faultsubcode, faultstring, faultdetail, action); } /** @fn int soap_wsa_sender_fault(struct soap *soap, const char *faultstring, const char *faultdetail) @brief Sets sender SOAP Fault for server fault response. @param soap context @param[in] faultstring fault string @param[in] faultdetail detail string @return SOAP_FAULT */ int soap_wsa_sender_fault(struct soap *soap, const char *faultstring, const char *faultdetail) { return soap_wsa_fault_subcode(soap, 1, NULL, faultstring, faultdetail); } /** @fn int soap_wsa_receiver_fault(struct soap *soap, const char *faultstring, const char *faultdetail) @brief Sets receiver SOAP Fault for server fault response. @param soap context @param[in] faultstring fault string @param[in] faultdetail detail string @return SOAP_FAULT */ int soap_wsa_receiver_fault(struct soap *soap, const char *faultstring, const char *faultdetail) { return soap_wsa_fault_subcode(soap, 0, NULL, faultstring, faultdetail); } /******************************************************************************\ * * WS-Addressing Faults * \******************************************************************************/ #if defined(SOAP_WSA_2005) /** @fn int soap_wsa_check_fault(struct soap *soap, SOAP_WSA(FaultCodesType) *fault, const char **info) @brief Checks the presence of a WS-Addressing fault @param soap context @param[out] fault code @param[out] info string pointer related to the wsa fault (or set to NULL) @return SOAP_OK (no fault) or fault code */ int soap_wsa_check_fault(struct soap *soap, SOAP_WSA(FaultCodesType) *fault, const char **info) { if (soap->error && soap->fault && soap->fault->SOAP_ENV__Code) { const char *code = soap_check_faultsubcode(soap); if (code) { SOAP_WSA__(soap_s2,FaultCodesType)(soap, code, fault); if (info) { struct SOAP_ENV__Detail *detail; *info = NULL; if (soap->fault->detail) detail = soap->fault->detail; else detail = soap->fault->SOAP_ENV__Detail; if (detail) { switch (detail->__type) { case SOAP_WSA_(SOAP_TYPE_,ProblemHeaderQName): case SOAP_WSA_(SOAP_TYPE_,ProblemIRI): *info = (char*)detail->fault; break; case SOAP_WSA_(SOAP_TYPE_,ProblemAction): *info = ((SOAP_WSA_(,ProblemAction)*)detail->fault)->Action; break; default: break; } } } return soap->error; } } return SOAP_OK; } #elif defined(SOAP_WSA_2003) int soap_wsa_check_fault(struct soap *soap, char **fault) { struct SOAP_ENV__Detail detail; *fault = NULL; if (soap->error && soap->fault) { if (soap->fault->detail) detail = soap->fault->detail; else detail = soap->fault->SOAP_ENV__Detail; } if (detail) { *fault = detail->__any; if (*fault) return soap->error; } return SOAP_OK; } #else /** @fn int soap_wsa_check_fault(struct soap *soap, SOAP_WSA(FaultSubcodeValues) *fault) @brief Checks the presence of a WS-Addressing fault @param soap context @param[out] fault code @return SOAP_OK (no fault) or fault code */ int soap_wsa_check_fault(struct soap *soap, SOAP_WSA(FaultSubcodeValues) *fault) { if (soap->error && soap->fault && soap->fault->SOAP_ENV__Code) { const char *code = soap_check_faultsubcode(soap); if (code) { SOAP_WSA__(soap_s2,FaultSubcodeValues)(soap, code, fault); return soap->error; } } return SOAP_OK; } #endif #if defined(SOAP_WSA_2005) /** @fn int soap_wsa_error(struct soap *soap, SOAP_WSA(FaultCodesType) fault, const char *info) @brief Sets SOAP Fault (sub)code for server WS-Addressing fault response. @param soap context @param[in] fault is one of wsa:FaultCodesType enumeration values @param[in] info is the value of the element in the Fault detail field @return SOAP_FAULT */ int soap_wsa_error(struct soap *soap, SOAP_WSA(FaultCodesType) fault, const char *info) { const char *code = SOAP_WSA_(soap,FaultCodesType2s)(soap, fault); /* populate the SOAP Fault as per WS-Addressing spec */ switch (fault) { case SOAP_WSA(InvalidAddressingHeader): soap_faultdetail(soap); if (soap->version == 1) { soap->fault->detail->__type = SOAP_WSA_(SOAP_TYPE_,ProblemHeaderQName); soap->fault->detail->fault = (void*)info; } else { soap->fault->SOAP_ENV__Detail->__type = SOAP_WSA_(SOAP_TYPE_,ProblemHeaderQName); soap->fault->SOAP_ENV__Detail->fault = (void*)info; } soap_wsa_sender_fault_subcode(soap, code, "A header representing a Message Addressing Property is not valid and the message cannot be processed.", NULL); break; case SOAP_WSA(InvalidAddress): soap_wsa_sender_fault_subcode(soap, code, "Invalid address.", NULL); break; case SOAP_WSA(InvalidEPR): soap_wsa_sender_fault_subcode(soap, code, "Invalid EPR.", NULL); break; case SOAP_WSA(InvalidCardinality): soap_wsa_sender_fault_subcode(soap, code, "Invalid cardinality of headers.", NULL); break; case SOAP_WSA(MissingAddressInEPR): soap_wsa_sender_fault_subcode(soap, code, "Missing EPR address.", NULL); break; case SOAP_WSA(DuplicateMessageID): soap_wsa_sender_fault_subcode(soap, code, "Message contains the message ID of a message already received.", NULL); break; case SOAP_WSA(ActionMismatch): soap_wsa_sender_fault_subcode(soap, code, "Action and SOAP action of the message do not match.", NULL); break; case SOAP_WSA(MessageAddressingHeaderRequired): soap_faultdetail(soap); if (soap->version == 1) { soap->fault->detail->__type = SOAP_WSA_(SOAP_TYPE_,ProblemHeaderQName); soap->fault->detail->fault = (void*)info; } else { soap->fault->SOAP_ENV__Detail->__type = SOAP_WSA_(SOAP_TYPE_,ProblemHeaderQName); soap->fault->SOAP_ENV__Detail->fault = (void*)info; } soap_wsa_sender_fault_subcode(soap, code, "A required header representing a Message Addressing Property is not present.", NULL); break; case SOAP_WSA(DestinationUnreachable): soap_faultdetail(soap); if (soap->version == 1) { soap->fault->detail->__type = SOAP_WSA_(SOAP_TYPE_,ProblemIRI); soap->fault->detail->fault = (void*)info; } else { soap->fault->SOAP_ENV__Detail->__type = SOAP_WSA_(SOAP_TYPE_,ProblemIRI); soap->fault->SOAP_ENV__Detail->fault = (void*)info; } soap_wsa_sender_fault_subcode(soap, code, "No route can be determined to reach [destination]", NULL); break; case SOAP_WSA(ActionNotSupported): soap_faultdetail(soap); if (soap->version == 1) { soap->fault->detail->__type = SOAP_WSA_(SOAP_TYPE_,ProblemAction); soap->fault->detail->fault = (void*)soap_malloc(soap, sizeof(SOAP_WSA_(,ProblemAction))); SOAP_WSA_(soap_default_,ProblemAction)(soap, (SOAP_WSA_(,ProblemAction)*)soap->fault->detail->fault); ((SOAP_WSA_(,ProblemAction)*)soap->fault->detail->fault)->Action = (char*)info; } else { soap->fault->SOAP_ENV__Detail->__type = SOAP_WSA_(SOAP_TYPE_,ProblemAction); soap->fault->SOAP_ENV__Detail->fault = (void*)soap_malloc(soap, sizeof(SOAP_WSA_(,ProblemAction))); SOAP_WSA_(soap_default_,ProblemAction)(soap, (SOAP_WSA_(,ProblemAction)*)soap->fault->SOAP_ENV__Detail->fault); ((SOAP_WSA_(,ProblemAction)*)soap->fault->SOAP_ENV__Detail->fault)->Action = (char*)info; } soap_wsa_sender_fault_subcode(soap, code, "The [action] cannot be processed at the receiver.", NULL); break; case SOAP_WSA(EndpointUnavailable): soap_faultdetail(soap); if (soap->version == 1) { soap->fault->detail->__type = SOAP_WSA_(SOAP_TYPE_,ProblemIRI); soap->fault->detail->fault = (void*)info; } else { soap->fault->SOAP_ENV__Detail->__type = SOAP_WSA_(SOAP_TYPE_,ProblemIRI); soap->fault->SOAP_ENV__Detail->fault = (void*)info; } soap_wsa_receiver_fault_subcode(soap, code, "The endpoint is unable to process the message at this time.", NULL); break; default: break; } return SOAP_FAULT; } #elif defined(SOAP_WSA_2003) int soap_wsa_error(struct soap *soap, const char *fault) { return soap_wsa_sender_fault_subcode(soap, NULL, fault, NULL); } #else /** @fn int soap_wsa_error(struct soap *soap, SOAP_WSA(FaultSubcodeValues) fault) @brief Sets SOAP Fault (sub)code for server WS-Addressing fault response. @param soap context @param[in] fault is one of wsa:FaultSubcodeValues @return SOAP_FAULT */ int soap_wsa_error(struct soap *soap, SOAP_WSA(FaultSubcodeValues) fault) { const char *code = SOAP_WSA_(soap,FaultSubcodeValues2s)(soap, fault); /* populate the SOAP Fault as per WS-Addressing spec */ switch (fault) { case SOAP_WSA(InvalidMessageInformationHeader): return soap_wsa_sender_fault_subcode(soap, code, "A message information header is not valid and the message cannot be processed. The validity failure can be either structural or semantic, e.g. a [destination] that is not a URI or a [relationship] to a [message id] that was never issued.", "Invalid header"); case SOAP_WSA(MessageInformationHeaderRequired): return soap_wsa_sender_fault_subcode(soap, code, "A required message information header, To, MessageID, or Action, is not present.", "Missing Header QName"); case SOAP_WSA(DestinationUnreachable): return soap_wsa_sender_fault_subcode(soap, code, "No route can be determined to reach the destination role defined by the WS-Addressing To.", NULL); case SOAP_WSA(ActionNotSupported): return soap_wsa_sender_fault_subcode(soap, code, "The [action] cannot be processed at the receiver.", soap->action); case SOAP_WSA(EndpointUnavailable): return soap_wsa_receiver_fault_subcode(soap, code, "The endpoint is unable to process the message at this time.", NULL); default: break; } return SOAP_FAULT; } #endif /******************************************************************************\ * * Plugin registry functions * \******************************************************************************/ /** @fn int soap_wsa(struct soap *soap, struct soap_plugin *p, void *arg) @brief Plugin registry function, used with soap_register_plugin. @param soap context @param[in,out] p plugin created in registry @param[in] arg passed from soap_register_plugin_arg @return SOAP_OK */ int soap_wsa(struct soap *soap, struct soap_plugin *p, void *arg) { (void)arg; DBGFUN("soap_wsa"); p->id = soap_wsa_id; p->data = (void*)SOAP_MALLOC(soap, sizeof(struct soap_wsa_data)); p->fcopy = NULL; p->fdelete = soap_wsa_delete; if (p->data) { if (soap_wsa_init(soap, (struct soap_wsa_data*)p->data)) { SOAP_FREE(soap, p->data); return SOAP_EOM; } } return SOAP_OK; } /** @fn int soap_wsa_init(struct soap *soap, struct soap_wsa_data *data) @brief Initializes plugin data. @param soap context @param[in,out] data plugin data @return SOAP_OK */ static int soap_wsa_init(struct soap *soap, struct soap_wsa_data *data) { DBGFUN("soap_wsa_init"); data->fheader = soap->fheader; data->fseterror = soap->fseterror; soap->fheader = soap_wsa_header; soap->fseterror = soap_wsa_set_error; data->fresponse = NULL; data->fdisconnect = NULL; return SOAP_OK; } /** @fn void soap_wsa_delete(struct soap *soap, struct soap_plugin *p) @brief Deletes plugin data. @param soap context @param[in,out] p plugin @return SOAP_OK */ static void soap_wsa_delete(struct soap *soap, struct soap_plugin *p) { DBGFUN("soap_wsa_delete"); SOAP_FREE(soap, p->data); } /******************************************************************************\ * * Callbacks registered by plugin * \******************************************************************************/ /** @fn int soap_wsa_header(struct soap *soap) @brief Copies WS-Addressing action to SOAP action @param soap context @return SOAP_OK or fault This callback is invoked to copy the WS-Addressing action to the SOAP action before invoking the service operation. */ static int soap_wsa_header(struct soap *soap) { struct soap_wsa_data *data = (struct soap_wsa_data*)soap_lookup_plugin(soap, soap_wsa_id); DBGFUN("soap_wsa_header"); if (!data) return soap->error = SOAP_PLUGIN_ERROR; if (data->fheader && data->fheader(soap)) return soap->error; if (soap->header && soap->header->SOAP_WSA(Action)) { soap->action = soap->header->SOAP_WSA(Action); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "WSA action='%s'\n", soap->action)); } return SOAP_OK; } /** @fn void soap_wsa_set_error(struct soap *soap, const char **c, const char **s) @brief Copies WS-Addressing action to SOAP action @param soap context @param c fault code @param s fault string */ static void soap_wsa_set_error(struct soap *soap, const char **c, const char **s) { struct soap_wsa_data *data = (struct soap_wsa_data*)soap_lookup_plugin(soap, soap_wsa_id); DBGFUN("soap_wsa_set_error"); if (!data) return; if (data->fseterror) data->fseterror(soap, c, s); if (soap->error == SOAP_NO_METHOD || (soap->error == SOAP_TAG_MISMATCH && soap->level == 2)) { #if defined(SOAP_WSA_2005) soap->error = soap_wsa_error(soap, SOAP_WSA(ActionNotSupported), soap->action); #elif defined(SOAP_WSA_2003) soap->error = soap_wsa_error(soap, "Action not supported"); #else soap->error = soap_wsa_error(soap, SOAP_WSA(ActionNotSupported)); #endif } } /** @fn int soap_wsa_response(struct soap *soap, int status, size_t count) @brief Overrides the HTTP response operations to send an HTTP POST @param soap context @param status code @param count message length (if non-chunked) */ static int soap_wsa_response(struct soap *soap, int status, size_t count) { struct soap_wsa_data *data = (struct soap_wsa_data*)soap_lookup_plugin(soap, soap_wsa_id); DBGFUN2("soap_wsa_response", "status=%d", status, "count=%lu", (unsigned long)count); if (!data) return SOAP_PLUGIN_ERROR; soap->fresponse = data->fresponse; /* reset (HTTP response) */ data->fdisconnect = soap->fdisconnect; soap->fdisconnect = soap_wsa_disconnect; /* to accept HTTP 202 */ return soap->fpost(soap, soap_strdup(soap, soap->endpoint), soap->host, soap->port, soap->path, soap->action, count); } /** @fn int soap_wsa_disconnect(struct soap *soap) @brief Accepts HTTP 202 response upon HTTP POST response relay @param soap context */ static int soap_wsa_disconnect(struct soap *soap) { struct soap_wsa_data *data = (struct soap_wsa_data*)soap_lookup_plugin(soap, soap_wsa_id); DBGFUN("soap_wsa_disconnect"); if (!data) return SOAP_PLUGIN_ERROR; soap->fdisconnect = data->fdisconnect; /* reset */ return soap_recv_empty_response(soap); } /******************************************************************************\ * * Misc. * \******************************************************************************/ /** @fn int soap_wsa_alloc_header(struct soap *soap) @brief Adds SOAP Header if not present. @param soap context @return SOAP_OK */ static int soap_wsa_alloc_header(struct soap *soap) { soap_header(soap); if (soap->header) return SOAP_OK; return soap->error = SOAP_EOM; } #ifdef __cplusplus } #endif gsoap-2.8.28/gsoap/plugin/wsrmapi.c0000644000175000017500000054654612653650150016550 0ustar ellertellert/* wsrmapi.c WS-ReliableMessaging plugin. Implements the WS-RM 1.0 and 1.1 logic for import/wsrm.h import/wsrm5.h gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under one of the following licenses: GPL, the gSOAP public license, or Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ /** @mainpage - @ref wsrm_0 documents the wsrm plugin for WS-ReliableMessaging support. Although wsrm uses the wsa plugin for WS-Addressing, there is no need to read the wsa plugin documentation because this part of the documentation is self-contained. WS-Addressing usage is mentioned when applicable. - @ref wsa_0 documents the wsa plugin for WS-Addressing (2003/2004/2005 standards) support. The wsa plugin is used by the wsrm plugin. - @ref mq_0 documents the mq plugin to support optional message queueing for WS-RM NoDiscard behavior. */ /** @page wsrm_0 The WS-ReliableMessaging plugin [TOC] @section wsrm_1 WS-ReliableMessaging Setup The material in this section relates to the WS-ReliableMessaging and WS-Addressing (2005) specifications. To use the wsrm plugin: -# Run `wsdl2h -b -t typemap.dat` on a WSDL of a service that requires WS-ReliableMessaging and WS-Addressing headers. The typemap.dat file included in the gSOAP package is used to recognize and translate header blocks. The `-b` option ensures that one-way response message operations are added for duplex communications that require a client-side callback service. -# Run `soapcpp2 -a` on the header file produced by wsdl2h. To enable reliable-messaging and addressing-based service operation selection, you MUST use soapcpp2 option `-a`. This allows the service to dispatch methods based on the WS-Addressing action information header value (when the wsa plugin is registered). -# (Re-)compile and link stdsoap2.c/pp or libgsoap, (dom.c/pp when needed), plugin/wsrmapi.c, plugin/wsaapi.c, custom/duration.c, and the soapcpp2- generated source files. -# Use the wsrm plugin API functions described below. The wsrm plugin uses the wsa plugin to implement the WS-Addressing 2005 operations. Both must be registered. The wsrm plugin API is self-contained. There is no need to use the wsa plugin API, unless WS-Addressing-specific headers must be added to messages. -# For WCF compatibility and interoperability, compile wsrmapi.c with compiler flag `-DWITH_WCF` to enable simulated WCF features. An example wsrm client/server application can be found in samples/wsrm. A gSOAP service definitions header file with an `#import "wsrm.h"` to support WS-ReliableMessaging 1.1 or `#import "wsrm5.h"` to support WS-ReliableMessaging 1.0 (2005). The imports are automatically generated by wsdl2h for a set of WSDLs that use WS-ReliableMessaging as per WS-Policy. The wsdl2h-generated header file should be further processed by soapcpp2 to generate the binding code. The wsrmapi.h and wsrmapi.c implement the WS-ReliableMessaging API described in this document. A wsdl2h-generated service definitions header file might include the following imports, where the wsrm.h is mandatory to support WS-ReliableMessaging: @code #import "soap12.h" #import "wsrm.h" @endcode The wsrm.h header file is imported from import/wsrm.h by soapcpp2. The wsrm.h import can be manually added to enable WS-ReliableMessaging when needed. The gSOAP service definitions header file is processed with soapcpp2 to generate the client-side and/or server-side binding code. Note that the wsrm.h and the WS-ReliableMessaging-dependent wsrx.h and wsa5.h header files are located in the import directory of the gSOAP package. These files define the WS-ReliableMessaging and WS-Addressing information header elements and types. The wsrx.h header file defines the WS-ReliableMessaging CreateSequence, CloseSequence, and TerminateSequence operations, as well as an one-way SequenceAcknowledgement operation to accept acknowledgements. The soap12.h header file enables SOAP 1.2 messaging. For developers working on protocols: the WS-ReliableMessaging header blocks in wsrm.h were generated from the WS-ReliableMessaging schema with the wsdl2h tool and WS/WS-typemap.dat as follows: wsdl2h -cgyex -o wsrm.h -t WS/WS-typemap.dat WS/WS-ReliableMessaging.xsd This step is not needed to use the wsrm plugin. @section wsrm_2 WS-ReliableMessaging Information Header Bindings To associate WS-ReliableMessaging and WS-Addressing information headers with service operations, the SOAP Header struct `SOAP_ENV__Header` must have been declared and contain the necessary header blocks to be transported with SOAP messages. The `SOAP_ENV__Header` for WS-ReliableMessaging and WS-Addressing is predefined in wsrm.h and imported into the gSOAP service definitions header file (this is automatically generated by wsdl2h). For each service operation in the gSOAP service definitions header file that uses WS-ReliableMessaging and/or WS-Addressing method-header-part directives are used. For example, the following gSOAP service definitions header file illustrates a typical import and service operation definition of operation 'example' in service namespace 'ns': @code #import "wsrm.h" //gsoap ns service method-header-part: example wsa5__MessageID //gsoap ns service method-header-part: example wsa5__RelatesTo //gsoap ns service method-header-part: example wsa5__From //gsoap ns service method-header-part: example wsa5__ReplyTo //gsoap ns service method-header-part: example wsa5__FaultTo //gsoap ns service method-header-part: example wsa5__To //gsoap ns service method-header-part: example wsa5__Action //gsoap ns service method-header-part: example wsrm__Sequence //gsoap ns service method-header-part: example wsrm__AckRequested //gsoap ns service method-header-part: example wsrm__SequenceAcknowledgement //gsoap ns service method-action: example urn:example/examplePort/example //gsoap ns service method-output-action: example urn:example/examplePort/exampleResponse int ns__example(char *in, struct ns__exampleResponse { char *out; } *); @endcode The wsa5 information headers are defined in wsa5.h and imported by wsrm.h (both are located in the 'import' directory). Here, all of the WS-Addressing and WS-ReliableMessaging information headers are bound to the ns__example operation request and response messages. The method action directive is important for WS-Addressing, because WS-Addressing Action information headers must be included that are unique for each operation. The soapcpp2 option `-a` ensures that WS-Addressing Action header blocks (and HTTP Action headers) are processed at the receiving side, which means that the service dispatcher uses the Action together with the operation name to invoke the service operation at the destination. This also means that Action headers must be properly set by the client. Note: the `SOAP_ENV__Header` struct can be declared in multiple files. The soapcpp2 tool gathers all members of the structs into the "final" `SOAP_ENV__Header` struct used by the gSOAP engine and your application. This is convenient when service-specific header blocks are combined with WS-ReliableMessaging and WS-Addressing header blocks or when WS-Security header blocks are added by the WSSE plugin. @section wsrm_3 WS-ReliableMessaging Overview In this section a brief overview of WS-ReliableMessaging is given. For more details please refer to the WS-ReliableMessaging protocol or tutorials on the subject. The following introduces the basic concepts of WS-ReliableMessaging from a practical point of view. WS-ReliableMessaging is useful to improve the reliability of one-way asynchronous messaging, for unreliable data gram messaging (SOAP-over-UDP), or to improve reliable delivery of responses relayed to other destinations, such as response messages that are relayed to destinations indicated by the WS-Addressing ReplyTo header. The protocol is also useful when multiple sources are sending messages that arrive out of order or must be flagged as an incomplete message collection when messages are missing as defined by the notion of a collection of related messages. Messages delivered out-of-order are not internally reordered automatically. The application logic should be designed to be robust to out-of-order delivery effects, for example by using a vector to collect the data elements received before the data is processed. Alternatively, the server-side `soap_wsrm_check_and_wait` calls can be used to let the current thread wait until preceding messages have been received and processed (by other threads). For single-thread processing with keep-alive, this will cause a performance bottleneck unless the message queue plugin is used. The message queue plugin (mq.c) provides an approach to buffer inbound messages for in-order processing. WS-ReliableMessaging is not essential to improve the reliability of request-response message exchanges between two parties over HTTP, since a successful delivery of a request message can be inferred from the fact that a response was received for the request sent. WS-ReliableMessaging "protects" message sequences, i.e. a collection of related messages. A WS-ReliableMessaging message sequence is created after which the sequence of messages is sent. The sequence is closed and terminated by the client after the last message. Either the message sequence is complete or not, and the resulting action to discard the incomplete message sequence or not depends on the chosen behavior. Duplicate messages (e.g. resulting from resends) are always discarded. To create a new sequence, a client (WS-RM source) requests from the server (WS-RM destination) a unique (new) message sequence identification. The server responds with the identification to be used as well as other details, such as the expiration time of the sequence and the behavior implemented when a sequence was received incomplete: - NoDiscard means that the sequence of messages is not discarded by the destination server when one or more messages are missing (or unacknowledged). That is, no acknowledged messages in the sequence will be discarded. The WS-RM plugin will reorder messages either by ignoring any out-of-order messages (when calling `soap_wsrm_check`) or wait for out-of-order messages to arrive in a timeout window (when calling `soap_wsrm_check_and_wait`). - DiscardFollowingFirstGap means that the initial messages of the sequence are retained by the destination up to the first gap (a missing message) in the sequence. Does not allow for out-of-order message delivery. - DiscardEntireSequence means that the entire sequence of messages will be discarded when there are one or more gaps (messages are missing). With the WS-RM plugin, messages may be accepted out-of-order. When the client terminates the sequence, it first sends a sequence close request (or a last message with the older WS-RM 1.0) and then a sequence termination request to the destination server. The sequence close informs the server how many messages should have been received. The client can still resend messages after the close, but no new messages are supposed to be send. After the optional resends, the client requests termination of the sequence. The termination will be successful depending on the behavior when messages went missing, as was listed above. The ensure reliable delivery, the WS-ReliableMessaging protocol allows the client to resend messages. Message resends are desirable when messages are lost in transit. Since the client has limited information on delivery success (message delivery acknowledgments can get lost as well), the client may resend more messages than necessary. This could lead to message duplication. However, messages that were already received by the server are discarded. The client may request message delivery acknowledgements from the server. The server sends message receipt acknowledgements for all the messages it has received in the sequence back to the client, usually by piggy-backing them with the response of a subsequent message exchange. When the client is informed about successful delivery it reduces the number of resends the client will attempt. Messages in a sequence are uniquely identified by their enumeration number in the sequence. Messages may be transmitted out of order. A missing message number indicates a gap in the message sequence. Message receipt acknowledgements consist of ranges of message numbers. Acknowledgements are normally sent to the source to help identify which messages should be resend. With the WS-Addressing protocol, message responses and fault messages can be relayed to other destinations. The ReplyTo and FaultTo WS-Addressing header blocks are used for this purpose. The WS-ReliableMessaging protocol allows message acknowledgements to be relayed. The WS-ReliableMessaging AcksTo header block is used for this purpose. In all, there are four types of communicating peers that are visible to the source (the client): - The destination service. The WS-ReliableMessaging sequence is essentially controlled by this service. When a message is sent by the source to the destination service (over HTTP, TCP, or UDP), the WS-Addressing To information header may contain the endpoint address. The destination service normally returns message responses back to the client (HTTP request-response) or in duplex mode with one-way messages. - Optionally, one of more ReplyTo destination services that accept response messages from the destination service. Rather than sending responses back to the client, the destination service relays them to another service. The WS-Addressing ReplyTo information header is used by the client to indicate the response relay target. - Optionally, one or more FaultTo destination services that accept SOAP fault messages from the destination service. Rather than sending SOAP Faults back to the client, the destination service relays them to another service. The WS-Addressing FaultTo information header is used by the client to indicate the fault relay target. - Optionally, one AcksTo destination service that accept WS-ReliableMessaging acknowledgements. Rather than sending acknowledgements piggy-backed with response messages back to the client, the destination service relays them to another service. The WS-ReliableMessaging AcksTo information header is used by the client when the sequence is created to indicate the acknowledgements relay target. The AcksTo cannot be changed after sequence creation to termination. The destination service normally serves as ReplyTo, FaultTo, and AcksTo service, which is the default scenario with request-response message exchanges. Replies, faults, and acknowledgements can also be asynchroniously transmitted in duplex mode. In that case, the WS-RM source client acts as a callback service to accept messages on a port. The practical aspects of message sequence creation, the message exchanges, the message relays, and sequence close/termination are presented for the client side first and then for each of the four types of destination servers. @section wsrm_4 Client-side Usage @subsection wsrm_4_1 Creating, Closing, and Terminating Message Sequences A sequence is created, closed, terminated, and cleaned-up on the client side as follows, using a 'soap' context struct (use one 'soap' context per thread): @code struct soap *soap = soap_new(); // Note: can use C++ proxy instead of 'soap' soap_register_plugin(soap, soap_wsa); soap_register_plugin(soap, soap_wsrm); const char *destination = "..."; // WS-RM destination server address const char *source = NULL; // WS-RM source (NULL means current) ULONG64 expires = 10000; // 10000 ms to expire (10 seconds) const char *id = NULL; // id = NULL: generate a temp sequence ID const char *opt_msg_id = NULL; // WS-Addressing message ID (optional) soap_wsrm_sequence_handle seq; // a local handle to the sequence state // Step 1: create a sequence if (soap_wsrm_create_offer(soap, destination, source, id, expires, NoDiscard, opt_msg_id, &seq)) { soap_wsrm_seq_free(soap, seq); ... // error creating sequence } // Step 2: exchange messages with WS-RM destination, request acks, receive acks, issue resends (see later) ... // Step 3: optionally close first before terminating if (soap_wsrm_close(soap, seq, NULL)) { soap_wsrm_seq_free(soap, seq); ... // error closing sequence } // Step 4: optionally resend messages before terminating if (soap_wsrm_nack(seq)) // any non-acks for messages sent? soap_wsrm_resend(soap, seq, 0, 0); // resend all non-acked messages // Step 5: terminate if (soap_wsrm_terminate(soap, seq, NULL)) { soap_wsrm_seq_free(soap, seq); ... // error creating sequence } // Step 6: cleanup soap_wsrm_seq_free(soap, seq); @endcode For duplex communication, the responses are sent to the WS-RM source's port, to which we need to listen via a callback service. There are two ways to do so, by polling or by running a separate threat that accepts responses. In the code below we use a polling approach to process responses sent asynchronously to the WS-RM source: @code struct soap *soap = soap_new(); // Note: can use C++ proxy instead of 'soap' soap_register_plugin(soap, soap_wsa); soap_register_plugin(soap, soap_wsrm); const char *destination = "..."; // WS-RM destination server address const char *source = "..."; // WS-RM source address destination sends to int source_port = ...; // port of WS-RM source address ULONG64 expires = 10000; // 10000 ms to expire (10 seconds) const char *id = NULL; // id = NULL: generate a temp sequence ID const char *opt_msg_id = NULL; // WS-Addressing message ID (optional) int retry; soap_wsrm_sequence_handle seq; // a local handle to the sequence state struct soap *callback = soap_new(); // callback for polling // Step 1: create a WS-RM source port binding for the callback to poll messages if (!soap_valid_socket(soap_bind(callback, NULL, source_port, 100))) ... // error // Step 2: create a sequence if (soap_wsrm_create_offer(soap, destination, source, id, expires, NoDiscard, opt_msg_id, &seq)) { if (soap->error != 202) // Error != HTTP Accepted { soap_wsrm_seq_free(soap, seq); ... // error creating sequence } } // poll 10 times for 1 second until the sequence created response received for (retry = 10; retry && !soap_wsrm_seq_created(soap, seq); retry--) if (callback_poll(callback, 1)) // 1 second poll ... // error if (!retry) ... // error // Step 3: exchange messages with WS-RM destination, request acks, receive acks, issue resends, and poll (see later) ... // Step 4: optionally close first before terminating if (soap_wsrm_close(soap, seq, NULL)) { if (soap->error != 202) // Error != HTTP Accepted { soap_wsrm_seq_free(soap, seq); ... // error closing sequence } } if (callback_poll(callback, -500000)) // 500 ms poll ... // error // Step 5: optionally resend messages before terminating if (soap_wsrm_nack(seq)) // any nacks? { soap_wsrm_resend(soap, seq, 0, 0); // resend all non-acked messages if (callback_poll(callback, -100000)) // 100 ms poll ... // error } // Step 6: terminate if (soap_wsrm_terminate(soap, seq, NULL)) { if (soap->error != 202) // Error != HTTP Accepted { soap_wsrm_seq_free(soap, seq); ... // error creating sequence } } // only needed with WS-RM 1.1 to accept terminate response if (callback_poll(callback, -500000)) // 500 ms poll ... // error // Step 7: cleanup soap_wsrm_seq_free(soap, seq); @endcode The polling operation can be implemented as follows: @code int callback_poll(struct soap *soap, int timeout) { int poll = 5; // 5 poll cycles times max, ensures make progress soap->accept_timeout = timeout; // polling timout soap->recv_timeout = timeout; soap->send_timeout = soap->recv_timeout = 1; // 1 sec while (poll-- && soap_valid_socket(soap_accept(soap))) { soap_serve(soap); soap_destroy(soap); soap_end(soap); } if (soap->error == SOAP_STOP || soap->error == SOAP_EOF) // timed out return soap->error = SOAP_OK; return soap->error; } @endcode In addition, callback service operations must be defined to handle faults and, when applicable, one-way message responses sent by the destination. Fault messages are accepted by the callback and processed by the service operation that can be customized to your needs: @code int SOAP_ENV__Fault(struct soap *soap, _QName faultcode, // SOAP 1.1 char *faultstring, // SOAP 1.1 char *faultactor, // SOAP 1.1 struct SOAP_ENV__Detail *detail, // SOAP 1.1 struct SOAP_ENV__Code *Code, // SOAP 1.2 struct SOAP_ENV__Reason *Reason, // SOAP 1.2 char *Node, // SOAP 1.2 char *Role, // SOAP 1.2 struct SOAP_ENV__Detail *Detail // SOAP 1.2 ) { soap_send_empty_response(soap, 202); if (!detail) detail = Detail; if (detail && detail->__type == SOAP_TYPE__wsrm__Identifier) { // the sequence id is in the Fault Detail __type and fault members char *id = (char*)detail->fault; // we opt to treat all faults fatal, so let's terminate the sequence soap_wsrm_sequence_handle seq = soap_wsrm_seq_lookup_id(soap, id); if (seq) { soap_wsrm_error(soap, seq, wsrm__SequenceTerminated); soap_wsrm_seq_release(soap, seq); return soap->error; } } return SOAP_OK; } @endcode This cleanup of memory resources may be performed at any time in the sequence of message exchange or afterwards when desired. The sequence state is maintained independent of these cleanup operations. The sequence termination may fail when the delivery of a sequence of messages is incomplete or when the lifetime of the sequence expired (set macro `SOAP_WSRM_MAX_SEC_TO_EXPIRE`). The WS-RM destination determines the failure based on the final sequence state and the sequence behavior. The behavior is set to NoDiscard by default, which means that the sequence is not discarded when transmission gaps appeared in the messages and the sequence is incomplete. The desired behavior can be specified with a sequence creation offer as explained in the next section. If the source ReplyTo and AcksTo addresses differ in your project, then use the following: @code if (soap_wsrm_create_offer_acksto(soap, destination, replyto, acksto, id, expires, DiscardEntireSequence, opt_msg_id, &seq))) ... // error @endcode @subsection wsrm_4_2 Creating a Sequence without an Offer To enable a destination server to produce a reliable message response sequence, you need to create a sequence with an offer. Otherwise, response messages are not tracked and delivery not verified. Two-way messaging should use the offer mechanism, but if all messages are one-way from source to destination then this is not needed. A sequence is created without an offer as follows: @code if (soap_wsrm_create(soap, destination, source, expires, DiscardEntireSequence, opt_msg_id, &seq)) ... // error @endcode @subsection wsrm_4_3 Exchanging Messages in a Sequence Each message exchange with the WS-RM destination should be preceded with a `soap_wsrm_request` or `soap_wsrm_request_acks` call to set the required WS-RM information headers for the message send operation or request-response exchange. For example, consider the 'example' operation defined previously and suppose we invoke the 'example' operation in a sequence (after creation and before closing): @code const char *exampleRequestAction = "urn:example/examplePort/example"; const char *exampleRequestMessageID = NULL; // optional WS-Addressing ID struct ns__exampleResponse response; const char *endpoint = soap_wsrm_to(seq); if (endpoint) { if (soap_wsrm_request(soap, seq, exampleRequestMessageID, exampleRequestAction)) ... // error: out of memory if (soap_call_ns__example(soap, endpoint, exampleRequestAction, &response)) soap_print_fault(soap, stderr); // an error occurred else ... // process the response } @endcode To generate WS-Addressing message IDs, use `soap_wsa_rand_uuid`, for example: @code const char *exampleRequestAction = "urn:example/examplePort/example"; if (soap_wsrm_request(soap, seq, soap_wsa_rand_uuid(soap), exampleRequestAction)) ... // error: out of memory @endcode The `soap_wsrm_request` takes the sequence handle and optional WS-Addressing message ID and mandatory WS-Addressing action string (this string must match the method-action defined in the gSOAP service definition header file). It produces a WS-RM header block with the message number incremented by one for the invocation. Messages are enumerated from one and included in the WS-RM header to allow the destination to determine which messages were received in the sequence (for acknowledgements) and to ignore duplicate messages. The remote invocation `soap_call_ns__example` uses the endpoint provided by `soap_wsrm_to(seq)` for the WS-RM destination address, which was set by `soap_wsrm_create` or by `soap_wsrm_create_offer`. Because the address may change due to a redirect, we encourage the use of `soap_wsrm_to` for the WS-RM destination address. When used at the server side, `soap_wsrm_to(seq)` is the ReplyTo address provided by the client's request message, which may be none (NULL) for a one-way call. Therefore, it is wise to check the return value of `soap_wsrm_to(seq)`. A C++ proxy object (generated by soapcpp2 option `-j`) that invokes a service operation should reset the destination address explicitly by setting the `soap_endpoint` member string before each operation invocation. @subsection wsrm_4_4 Exchanging Messages with Acknowledgements in a Sequence Before sending a message, a WS-RM request should be issued using `soap_wsrm_request_acks`. This informs the WS-RM destination to return message delivery acknowledgements back to the sender (piggy-backed in the header of the response message), unless the AcksTo is set to target an acknowledgement service endpoint in which case the acknowledgements are sent to. @code if (soap_wsrm_request_acks(soap, seq, opt_msg_id, exampleRequestAction)) ... // error if (soap_call_ns__example(soap, endpoint, exampleRequestAction, &response)) if (soap->error != 202) // Error != HTTP Accepted ... // error @endcode When duplex messaging is used via a callback, a polling operation will be needed afterwards: @code if (callback_poll(callback, -500000)) // 500 ms poll ... // error @endcode The `soap_wsrm_close` returns acknowledgements automatically, so requesting intermediate acknowledgements is not required to issue a final `soap_wsrm_resend` to resend all non-acknowledged messages, e.g. after `soap_wsrm_close`. See also below. @subsection wsrm_4_5 Resending Non-Acknowledged Messages All non-acknowledged messages in a sequence that were previously sent can be resend (from the internal sender-side cache of sent messages in a sequence) as follows: @code soap_wsrm_resend(soap, seq, 0, 0); @endcode To resend a range of non-acknowledged messages, say between 3 and 7, use: @code soap_wsrm_resend(soap, seq, 3, 7); @endcode Or all messages after message number 3: @code soap_wsrm_resend(soap, seq, 3, 0); @endcode Resends should be used with care, since in the worst case when no acknowledgements have been received all messages up to the last will be resend (and ignored by the WS-RM destination when a message is received more than once). Note that when an AcksTo destination service address was set with `soap_wsrm_create` or `soap_wsrm_create_offer`, then the acknowledgements will not be returned to the sender (client). In this case message resends are performed for all messages sent, since these have not been acknowledged. It is permitted to issue resends between creation and termination of a sequence, including after a sequence close (as long as no new messages are sent after close). The sequence close provides acknowledgement information to limit the number of messages that need to be resend. To find out if none, some, or all messages have been acknowledged, use: @code ULONG64 nack = soap_wsrm_nack(seq); if (nack == 0) ... // all sent messages have been acknowledged else if (nack == soap_wsrm_num(seq)) ... // none of the sent messages have been acknowledged else ... // some sent messages have been acknowledged @endcode @subsection wsrm_4_6 Relaying Response and Fault Messages with WS-Addressing WS-ReliableMessaging is important when messages are relayed, and especially when relayed over UDP. The ReplyTo and FaultTo destination service endpoints can be specified for each message as follows: @code const char *replyto = source; // endpoint of WS-RM source const char *faultto = "..."; // endpoint of fault processing service const char *endpoint = soap_wsrm_to(seq); if (endpoint) { if (soap_wsrm_request_acks(soap, seq, NULL, exampleRequestAction) || soap_wsa_add_ReplyTo(soap, replyto) || soap_wsa_add_FaultTo(soap, faultto)) ... // error: out of memory if (soap_call_ns__example(soap, endpoint, exampleRequestAction, &response)) { if (soap->error != 202) ... // error } } @endcode An optional source address information header can be added with `soap_wsa_add_From`: @code const char *from = "..."; // endpoint of the client (could be any URI) if (soap_wsrm_request_acks(soap, seq, NULL, exampleRequestAction) || soap_wsa_add_From(soap, from)) ... // error: out of memory @endcode Adding a From address is optional and usually not required with WS-ReliableMessaging. @subsection wsrm_4_7 Using Retry Loops to Improve Robustness of Message Sends A potential problem with reliable message delivery with resends can fail when the initial send was not successful and message ordering is relevant. Resending will lead to an unordered message delivery. Also, the wsrm plugin records all sent messages when the send operation was not interrupted. A problem occurs when the message cache contains incomplete messages and these messages cannot be resend. This section presents an additional mechanism to ensure messages are cached properly for automatic retransmission. Besides network failues, a request-response message exchange can also appear to fail due to a non `SOAP_OK` returned, such as a benign "HTTP 202 Accept" To distinguish fatal send errors from errors returned by the peer, the `soap_wsrm_check_retry` function can be used as follows to only retry the message exchange (or send) when needed: @code const char *endpoint = NULL; if (soap_wsrm_request_acks(soap, seq, NULL, exampleRequestAction)) ... // error while ((endpoint = soap_wsrm_to(seq)) != NULL && soap_call_ns__example(soap, endpoint, exampleRequestAction, &response)) { if (soap->error == 202) { // request was accepted by destination (HTTP 202 Accept) break; } else if (soap->error == SOAP_NO_TAG) // empty { // request was accepted by destination, acks are returned break; } soap_print_fault(soap, stderr); if (soap_wsrm_check_retry(soap, seq)) break; // do not continue sleep(1); // wait a second to give network a chance to recover } if (soap->error == SOAP_OK) ... // response can be processed @endcode Note that the `soap_wsrm_request` is only invoked once in the above to increment the message enumeration. The loop retries transmissions a maximum of `SOAP_WSRM_MAX_RETRIES` iterations before giving up. Note that this mechanism does not replace acknowledgements for delivery. Delivery acknowledgements are verified with `soap_wsrm_nack`. @subsection wsrm_4_8 Example Client The following code shows an example WS-RM client fragment that combines the concepts introduced in the previous sections for a request-response scenario: @code struct soap *soap = soap_new(); // Note: can use C++ proxy instead of 'soap' soap_register_plugin(soap, soap_wsa); soap_register_plugin(soap, soap_wsrm); struct ns__exampleResponse response; const char *exampleRequestAction = "urn:example/examplePort/example"; const char *destination = "..."; // WS-RM destination server address const char *source = NULL; // WS-RM source (current) ULONG64 expires = 60000; // 1 minute sequence lifetime soap_wsrm_sequence_handle seq; if (soap_wsrm_create_offer(soap, destination, source, NULL, expires, DiscardEntireSequence, NULL, &seq)) { soap_wsrm_seq_free(soap, seq); ... // error creating sequence } if (soap_wsrm_request_acks(soap, seq, NULL, exampleRequestAction)) ... // error while (soap_call_ns__example(soap, destination, exampleRequestAction, &response)) { if (soap->error == 202) { // request was accepted by destination (HTTP 202 Accept) break; } else if (soap->error == SOAP_NO_TAG) // empty { // request was accepted by destination, acks are returned break; } soap_print_fault(soap, stderr); if (soap_wsrm_check_retry(soap, seq)) break; // do not continue sleep(1); // wait a second to give network a chance to recover } if (soap->error == SOAP_OK) ... // response can be processed if (soap_wsrm_close(soap, seq, NULL)) { soap_wsrm_seq_free(soap, seq); ... // error closing sequence } soap_wsrm_resend(soap, seq, 0, 0); // resend non-acked messages if (soap_wsrm_terminate(soap, seq, NULL)) { soap_wsrm_seq_free(soap, seq); ... // error } soap_wsrm_seq_free(soap, seq); soap_destroy(soap); soap_end(soap); soap_free(soap); @endcode A duplex mode client that accepts responses via a callback: @code struct soap *soap = soap_new(); // Note: can use C++ proxy instead of 'soap' soap_register_plugin(soap, soap_wsa); soap_register_plugin(soap, soap_wsrm); struct ns__exampleResponse response; const char *exampleRequestAction = "urn:example/examplePort/example"; const char *destination = "..."; // WS-RM destination server address const char *source = "..."; // WS-RM source address destination sends to int source_port = ...; // port of WS-RM source address ULONG64 expires = 60000; // 1 minute sequence lifetime int retry; soap_wsrm_sequence_handle seq; struct soap *callback = soap_new(); // callback for polling // WS-RM source port binding for the callback to poll messages if (!soap_valid_socket(soap_bind(callback, NULL, source_port, 100))) ... // error if (soap_wsrm_create_offer(soap, destination, source, NULL, expires, DiscardEntireSequence, NULL, &seq)) { if (soap->error != 202) { soap_wsrm_seq_free(soap, seq); ... // error creating sequence } } // poll 10 times for 1 second until the sequence created response received for (retry = 10; retry && !soap_wsrm_seq_created(soap, seq); retry--) if (callback_poll(callback, 1)) // 1 second poll ... // error if (!retry) ... // error if (soap_wsrm_request_acks(soap, seq, NULL, exampleRequestAction)) ... // error while (soap_call_ns__example(soap, destination, exampleRequestAction, &response)) { if (soap->error == 202) { // request was accepted by destination (HTTP 202 Accept) break; } else if (soap->error == SOAP_NO_TAG) // empty { // request was accepted by destination, acks are returned break; } if (soap_wsrm_check_retry(soap, seq)) break; // do not continue sleep(1); // wait a second to give network a chance to recover } if (callback_poll(callback, -500000)) // 500 ms poll ... // error if (soap_wsrm_close(soap, seq, NULL)) { if (soap->error != 202) { soap_wsrm_seq_free(soap, seq); ... // error closing sequence } } // Resend messages marked as non-acked (as an option) for (retry = 2; retry && soap_wsrm_nack(seq); retry--) { soap_wsrm_resend(soap, seq, 0, 0); // 0 0 means full range of msg nums if (callback_poll(callback, -500000)) // 500 ms poll ... // error } if (soap_wsrm_terminate(soap, seq, NULL)) { if (soap->error != 202) { soap_wsrm_seq_free(soap, seq); ... // error closing sequence } } if (callback_poll(callback, -500000)) // 500 ms poll ... // error soap_wsrm_seq_free(soap, seq); soap_destroy(callback); soap_end(callback); soap_free(callback); soap_destroy(soap); soap_end(soap); soap_free(soap); @endcode @section wsrm_5 Server-side Usage To set up a WS-ReliableMessaging compliant server, register the wsa and wsrm plugins with the soap context (or with the C++ proxy object generated by soapcpp2 option `-j`): @code struct soap *soap = soap_new(); // Note: use C++ proxy->soap instead of 'soap' soap_register_plugin(soap, soap_wsa); soap_register_plugin(soap, soap_wsrm); @endcode The following subsections detail the differences between the types of WS-RM destination services. @subsection wsrm_5_1 Setting up a WS-RM Destination Service For duplex communications, it is advisable to send acknowledgements to the peer, which are normally piggy-backed on messages to the peer. If no messages are sent to the peer, explicit acknowledgements can be sent: @code if (soap_wsrm_acknowledgement(soap, seq, NULL)) ... // error @endcode To sent acknowledgements to all peers with open sequences, use: @code int timeout = -10000; // 10 ms if (soap_wsrm_pulse(soap, timeout)) ... // error @endcode where timeout is in seconds (pos value) or microseconds (neg value). Depending on the message exchange scenarios, it may be advisable to have the server send periodic acknowledgement updates as follows: @code soap->accept_timeout = -200000; // 200ms intervals for (;;) { // server loop, accept next message if (!soap_valid_socket(accept())) { // error or timeout? if (soap->errnum) { soap_stream_fault(std::cerr); exit(1); // may want to exit, but trying to continue is also possible } else { // timeout occurs after 200ms // send acks to peers (optional), take 10 ms per message soap_wsrm_pulse(soap, -10000); // 10 ms // sleep(1); // must do this with UDP: since accept() returns immediately } } else { ... // serve } @endcode Each service operation that supports WS-ReliableMessaging and WS-Addressing should use the `soap_wsrm_check`, `soap_wsrm_sender_fault`, `soap_wsrm_receiver_fault`, and `soap_wsrm_reply` functions as follows: @code int ns__example(struct soap *soap, char *in, struct ns__exampleResponse *response) { const char *ResponseAction = "urn:example/examplePort/exampleResponse"; // fatal service operation-specific errors (before soap_wsrm_check()) if (!database) // suppose we need a database, if there is none terminate return soap_wsrm_receiver_fault(soap, "No database!", NULL); // check for WS-RM/WSA and set WS-RM/WSA return headers and protocol errors // note: use soap_wsrm_check_and_wait() with NoDiscard behavior to queue out-of-order messages if (soap_wsrm_check(soap)) return soap->error; // check for non-fatal service operation-specific errors if (!in || !*in) // sender did not put anything in the 'in' string: fault return soap_wsrm_sender_fault(soap, "No string content!", NULL); response->out = ... // return normally, relaying the response to the ReplyTo service when needed return soap_wsrm_reply(soap, NULL, ResponseAction); } @endcode An error produced by `soap_wsrm_sender_fault` or `soap_wsrm_receiver_fault` before `soap_wsrm_check` is considered fatal, it will terminate the sequence and the sender (client) will not be able to continue the sequence transmissions. While the faults preduced after `soap_wsrm_check` allow the sequence to continue. @subsection wsrm_5_2 Handling Duplex Callback Service Operations To set up a callback to accept responses in a duplex scenario, we set up the server in the same way as the destination server. Service opertions should not use `soap_wsrm_reply`. Because response messages are sent (as if these were request messages), the service must define the appropriate one-way operations and gSOAP service definitions bindings. For example, the one-way response message of the ns__example operation is defined as follows in the gSOAP service definitions header file: @code //gsoap ns service method-header-part: exampleResponse wsa5__MessageID //gsoap ns service method-header-part: exampleResponse wsa5__RelatesTo //gsoap ns service method-header-part: exampleResponse wsa5__From //gsoap ns service method-header-part: exampleResponse wsa5__ReplyTo //gsoap ns service method-header-part: exampleResponse wsa5__FaultTo //gsoap ns service method-header-part: exampleResponse wsa5__To //gsoap ns service method-header-part: exampleResponse wsa5__Action //gsoap ns service method-header-part: exampleResponse wsrm__SequenceAcknowledgement //gsoap ns service method-action: exampleResponse urn:example/examplePort/exampleResponse int ns__exampleResponse(char *out, void); @endcode The one-way response service operations are automatically generated with wsdl2h option `-b`. Note that when these definitions are combined with the previous definition for `ns__example`, there is no need to define the `ns__ExampleResponse` struct any longer as this is implied by the `ns__exampleResponse` function content. The server operation implementation is for example: @code int ns__exampleResponse(struct soap *soap, char *out) { // check WS-RM/WSA headers and protocol errors and send 202 Accept back to peer // note: use soap_wsrm_check_send_empty_response_and_wait() with NoDiscard behavior to queue out-of-order messages if (soap_wsrm_check_send_empty_response(soap)) return soap->error; ... // process the 'out' content, invoke callback etc return SOAP_OK; } @endcode @section wsrm_6 WS-ReliableMessaging over HTTPS with Basic Authentication The HTTPS client and server are set up as shown in the gSOAP documentation and examples. There are no additional API calls needed to support WS-RM with HTTPS. Note that the WS-RM destination service may also relay messages to other HTTPS services, thus the WS-RM destination acts as a receiver (server) and sender (client). Therefore, the WS-RM destination server's SSL context should be set to authenticate the other servers: @code if (soap_ssl_server_context(soap, SOAP_SSL_DEFAULT, "server.pem", // keyfile (server) "password", // password to read the key file (server) "cacert.pem", // cacert file to store trusted certificates (client) NULL, // optional capath NULL, // DH file name or DH param key len bits, NULL: RSA NULL, // file with random data to seed randomness argv[1] // unique server identification for SSL session cache )) { soap_print_fault(soap, stderr); ... // handle error } @endcode Here, the cacert.pem file contains certificates to authenticate the ReplyTo, FaultTo, and AcksTo services when HTTPS is used. The client side sets up the SSL context with the `soap_ssl_client_context` as instructed in the documentation and by the examples. Multi-threaded HTTPS clients and servers must register mutex locks with OpenSSL To use Basic Authentication at the client side, set the userid and passwd values: @code soap->userid = "..."; // Basic Auth user id soap->passwd = "..."; // Basic Auth password if (soap_wsrm_request_acks(soap, seq, NULL, exampleRequestAction) ... // error: out of memory if (soap_call_ns__example(soap, endpoint, exampleRequestAction, &response)) { if (soap->error == 401) ... // authentication failed for the userid/passwd pair else ... // other error } @endcode At the server side add the authentication check to the service operation before `soap_wsrm_check` to terminate the sequence when an authentication failure occurs. For example: @code int ns__example(struct soap *soap, char *in, struct ns__exampleResponse *response) { if (!soap->userid || !soap->passwd || strcmp(soap->userid, "...") || strcmp(soap->passwd, "...")) { soap->authrealm = "..."; // optional to set HTTP WWW-Authenticate: Basic realm="..." return 401; // HTTP 401 Unauthorized } if (soap_wsrm_check(soap)) return soap->error; ... @endcode Here, we check only one userid-passwd pair though normally we could search for valid credentials in an authentication store. Note: never use Basic Authentication over HTTP because the password is sent in the clear. You must use HTTPS to encrypt the HTTP authentication information and message content. HTTP Digest Auth is preferred for this reason, because Digest Auth verifies the digest of a userid-passwd rather than require the password to be exchanged or stored in cleartext. @section wsrm_7 WS-ReliableMessaging over UDP with Timeouts The use of UDP is automatic at the client side using the "soap.udp://" protocol. Therefore, endpoints should use a "soap.udp://" URL to connect. (when using an already opened socket, the `SOAP_IO_UDP` flag must be used, see the documentation.) Note that UDP datagram messages should not exceed 8K, which is usually a size that UDP datagrams can support. To reduce the message size, we recommend compression (`-DWITH_GZIP` compile flag to enable ZLIB and use libgsoapssl.a or libgsoapssl++.a for OpenSSL and ZLIB compression combined). The code of an UDP-enabled server is identical to an HTTP/TCP server except that the `soap_accept` call is disabled and unnecessary. When message responses are not returned to the client, the client may block indefinitely when it expects a response. Therefore we recommend the use of send and receive timeouts: @code struct soap *soap = soap_new(); const char *destination = "soap.udp://..."; const char *source = NULL; soap->send_timeout = soap->recv_timeout = 1; // 1 second to timeout if (soap_wsrm_create_offer(soap, destination, source, NULL, expires, NoDiscard, NULL, &seq)) ... // an error occured if (soap_wsrm_request(soap, seq, NULL, exampleRequestAction)) ... // an error occured if (soap_call_ns__example(soap, ...)) { if (soap->error == SOAP_EOF && soap->errnum == 0) ... // a timeout occured else ... // an error occured } @endcode Note that the WS-Addressing ReplyTo and the use of NoReply do not return response message from the server. However, acknowledgements will be returned when acknowledgements were requested (unless acknowledgements are relayed with AcksTo). @code struct soap *soap = soap_new(); soap->send_timeout = soap->recv_timeout = 1; // 1 second to timeout const char *destination = "soap.udp://..."; const char *from = "..."; // some identifying URI const char *source = from; soap->send_timeout = soap->recv_timeout = 1; // 1 second to timeout if (soap_wsrm_create_offer(soap, destination, source, NULL, expires, NoDiscard, NULL, &seq)) ... // an error occured if (soap_wsrm_request_acks(soap, seq, NULL, exampleRequestAction) || soap_wsa_add_NoReply(soap) ... // an error occured if (soap_call_ns__example(soap, ...)) { if (soap->error == SOAP_EOF && soap->errnum == 0) ... // a timeout occured else if (soap->error == SOAP_NO_TAG) ... // ack was received and recorded else ... // an error occured } @endcode In this case an acknowledgement will be returned and the timeout reflects a possible network packet loss. @section wsrm_8 WS-ReliableMessaging and WS-Security WS-Security can be combined with WS-ReliableMessaging using the [WS-Security plugin](../../wsse/html/index.html). Both plugins must be registered at the client and server side. These APIs are independent. @section wsrm_9 The wsrm Plugin and C++ Server Objects Run `soapcpp2 -a -j` (or `-i`) on the .h file with the service operation definitions. When you prefer to use soapcpp2 option `-j` (or `-i`), please run soacpp2 again as follows: soapcpp2 -A -pwsrx import/wsrx.h This generates wsrxClient.cpp and wsrxServer.cpp needed with the WS-ReliableMessaging plugin and code. To dispatch the wsrm service operations when received: Suppose we have a myService server class generated by soapcpp2 option `-j`, which is used to process requests with the serve() member function (also generated): @code myService service; if (soap_invalid_socket(service.bind(NULL, port, 100))) ... // error for (;;) { if (!soap_valid_socket(service.accept())) { service.soap_stream_fault(std::cerr); exit(1); } if (soap_begin_serve(service.soap) == SOAP_OK) { if (service.dispatch() == SOAP_NO_METHOD) { if (soap_serve_request(service.soap) != SOAP_OK) { soap_send_fault(service.soap); service.soap_stream_fault(std::cerr); } } else if (service.soap->error) service.soap_stream_fault(std::cerr); } service.destroy(); } @endcode @section wsrm_10 Speed improvements with large number of sequences Compile wsrmapi.c with `-DSOAP_WSRM_FAST_LOOKUP` to speed up sequence lookups for a large number of concurrent message sequences or sequences with a long time to live. An internal hash table is used, which will grow to accommodate the total number of concurrent sequences. The hash table entries are reused but (temporary) empty entries are never deallocated to avoid allocation overhead, which means that leak detectors may complain about space not being freed. */ #include "wsrmapi.h" #ifdef _WRS_KERNEL #include "sysLib.h" #endif #ifdef __cplusplus extern "C" { #endif /** Plugin identification for plugin registry */ const char soap_wsrm_id[] = SOAP_WSRM_ID; /** Sequence session database */ static struct soap_wsrm_sequence *soap_wsrm_session = NULL; char soap_wsrm_idname[40] = ""; int soap_wsrm_idnum = 0; /** Sequence session database lock */ static MUTEX_TYPE soap_wsrm_session_lock = MUTEX_INITIALIZER; #ifdef SOAP_WSRM_FAST_LOOKUP #define SOAP_WSRM_IDHASH_BLK (8) struct soap_wsrm_hash_id { struct soap_wsrm_hash_id *next; struct soap_wsrm_sequence* seq[SOAP_WSRM_IDHASH_BLK]; }; static struct soap_wsrm_hash_id* soap_wsrm_hash_id[SOAP_IDHASH]; static struct soap_wsrm_hash_id* soap_wsrm_hash_acksid[SOAP_IDHASH]; #endif /******************************************************************************\ * * Static protos * \******************************************************************************/ static int soap_wsrm_init(struct soap *soap, struct soap_wsrm_data *data, void *arg); static int soap_wsrm_copy(struct soap *soap, struct soap_plugin *p, struct soap_plugin *q); static void soap_wsrm_delete(struct soap *soap, struct soap_plugin *p); static int soap_wsrm_send(struct soap *soap, const char *buf, size_t len); static int soap_wsrm_preparefinalrecv(struct soap *soap); static int soap_wsrm_disconnect(struct soap *soap); static int soap_wsrm_process_ack(struct soap *soap, struct _wsrm__SequenceAcknowledgement *ack); static int soap_wsrm_chk(struct soap *soap, int timeout, int flag); static int soap_wsrm_chk_acks(struct soap *soap); static int soap_wsrm_add_acks(struct soap *soap, struct soap_wsrm_sequence *seq, ULONG64 nack, int all, int piggy); static int soap_wsrm_set_ack(struct soap *soap, ULONG64 nack, struct soap_wsrm_sequence *seq, struct _wsrm__SequenceAcknowledgement *ack); #if 0 static int soap_wsrm_post(struct soap *soap, const char *endpoint, const char *host, int port, const char *path, const char *action, size_t count); #endif static int soap_wsrm_resend_seq(struct soap *soap, struct soap_wsrm_sequence *seq, int all, ULONG64 lower, ULONG64 upper); static const char *soap_wsrm_seq_newid(struct soap *soap); static void soap_wsrm_seq_insert_data(struct soap_wsrm_sequence *seq); static void soap_wsrm_seq_delete_data(struct soap_wsrm_sequence *seq); static struct soap_wsrm_sequence *soap_wsrm_seq_lookup_data(const char *id); static void soap_wsrm_seq_insert_ack(struct soap_wsrm_sequence *seq); static void soap_wsrm_seq_delete_ack(struct soap_wsrm_sequence *seq); static struct soap_wsrm_sequence *soap_wsrm_seq_lookup_ack(const char *id); static struct soap_wsrm_sequence *soap_wsrm_seq_insert(struct soap *soap); static int soap_wsrm_msg_append(struct soap *soap, struct soap_wsrm_data *data, const char *buf, size_t len); static int soap_wsrm_num_lookup(struct soap *soap, const struct soap_wsrm_sequence *seq, ULONG64 num); static int soap_wsrm_num_insert(struct soap *soap, struct soap_wsrm_sequence *seq, ULONG64 num); static int soap_wsrm_num_size(const struct soap_wsrm_sequence *seq); static void soap_wsrm_num_free(struct soap *soap, struct soap_wsrm_sequence *seq); static struct soap_wsrm_message *soap_wsrm_msg_new(struct soap *soap, struct soap_wsrm_sequence *seq, ULONG64 num); static void soap_wsrm_msg_free(struct soap *soap, struct soap_wsrm_message *p); /******************************************************************************\ * * Client-side WS-RM Operations * \******************************************************************************/ /** @fn int soap_wsrm_create(struct soap *soap, const char *to, const char *replyto, LONG64 expires, const char *wsa_id, soap_wsrm_sequence_handle *seq) @brief Creates a new sequence. Sequences are usually created by the sender (client) and confirmed by the receiver (server). The 'to' server address must be used for all messages of the sequence to be sent to the WS-RM destination server. Optionally the 'replyto' address can be given of the WS-RM source to reply to. A sequence ID is generated by the server upon success. @param soap context @param[in] to endpoint address of the WS-RM destination server (required) @param[in] replyto endpoint address of the WS-RM source to reply/ack to (optional) @param[in] expires max sequence duration (its lifetime) in ms (use 0 to offer infinite, subject to server policy) @param[in] wsa_id WS-Addressing message ID (optional, use NULL when omitted) @param[out] seq sequence handle is set @return SOAP_OK or error code */ int soap_wsrm_create(struct soap *soap, const char *to, const char *replyto, LONG64 expires, const char *wsa_id, soap_wsrm_sequence_handle *seq) { return soap_wsrm_create_offer(soap, to, replyto, "", expires, NoDiscard, wsa_id, seq); } /** @fn int soap_wsrm_create_offer(struct soap *soap, const char *to, const char *replyto, const char *id, LONG64 expires, enum wsrm__IncompleteSequenceBehaviorType behavior, const char *wsa_id, soap_wsrm_sequence_handle *seq) @brief Creates a new sequence by offering suggested WS-RM parameters to the WS-RM destination. Sequences are usually created by the sender (client) and confirmed by the receiver (server). The 'to' server address must be used for all messages of the sequence to be sent to the WS-RM destination server. Optionally the 'replyto' address can be given of the WS-RM source to reply to. A sequence ID is generated by the server upon success. @param soap context @param[in] to endpoint address of the WS-RM destination server (required) @param[in] replyto endpoint address of the WS-RM source to reply/ack to (optional) @param[in] id offered WS-RM sequence identifier (optional, generate with NULL) @param[in] expires max sequence duration (its lifetime) in ms (use 0 for infinite, subject to server policy) @param[in] behavior offered DiscardEntireSequence, DiscardFollowingFirstGap, or NoDiscard, which specifies the WS-RM destination's action when a sequence is closed/terminated when it is incomplete, and notifies the source when failed. @param[in] wsa_id WS-Addressing message ID (optional, use NULL when omitted) @param[out] seq sequence handle is set or NULL when response is asynchronously send and the sequence is initialized upon receipt of the create response. @return SOAP_OK or error code */ int soap_wsrm_create_offer(struct soap *soap, const char *to, const char *replyto, const char *id, LONG64 expires, enum wsrm__IncompleteSequenceBehaviorType behavior, const char *wsa_id, soap_wsrm_sequence_handle *seq) { return soap_wsrm_create_offer_acksto(soap, to, replyto, NULL, id, expires, behavior, wsa_id, seq); } /** @fn int soap_wsrm_create_offer_acksto(struct soap *soap, const char *to, const char *replyto, const char *acksto, const char *id, LONG64 expires, enum wsrm__IncompleteSequenceBehaviorType behavior, const char *wsa_id, soap_wsrm_sequence_handle *seq) @brief Creates a new sequence by offering suggested WS-RM parameters to the WS-RM destination. Sequences are usually created by the sender (client) and confirmed by the receiver (server). The 'to' server address must be used for all messages of the sequence to be sent to the WS-RM destination server. Optionally the 'replyto' address can be given of the WS-RM source to reply to and an 'acksto' address can be given for acknowledgement messages to be sent to (normally to the reply to). A sequence ID is generated by the server upon success. @param soap context @param[in] to endpoint address of the WS-RM destination server (required) @param[in] replyto endpoint address of the WS-RM source (optional) @param[in] acksto endpoint address for WS-RM acknowledgements (optional) (optional, use NULL when acks are piggy-backed on response messages to the source) @param[in] id offered WS-RM sequence identifier (optional, generate when NULL) @param[in] expires max sequence duration (its lifetime) in ms (use 0 for infinite, subject to server policy) @param[in] behavior offered DiscardEntireSequence, DiscardFollowingFirstGap, or NoDiscard, which specifies the WS-RM destination's action when a sequence is closed/terminated when it is incomplete, and notifies the source when failed. @param[in] wsa_id WS-Addressing message ID (optional, use NULL when omitted) @param[out] seq sequence handle is set or NULL when response is asynchronously send and the sequence is initialized upon receipt of the create response. @return SOAP_OK or error code */ int soap_wsrm_create_offer_acksto(struct soap *soap, const char *to, const char *replyto, const char *acksto, const char *id, LONG64 expires, enum wsrm__IncompleteSequenceBehaviorType behavior, const char *wsa_id, soap_wsrm_sequence_handle *seq) { char *s; size_t l; struct wsrm__CreateSequenceType req; struct wsrm__CreateSequenceResponseType res; struct soap_wsrm_data *data = (struct soap_wsrm_data*)soap_lookup_plugin(soap, soap_wsrm_id); const char *action = SOAP_NAMESPACE_OF_wsrm"/CreateSequence"; DBGFUN3("soap_wsrm_create_offer", "id=%s", id ? id : "(null)", "to=%s", to ? to : "(null)", "acksto=%s", acksto ? acksto : "(null)"); *seq = NULL; if (!data) return soap->error = SOAP_PLUGIN_ERROR; soap_default_wsrm__CreateSequenceType(soap, &req); if (!to) to = soap_wsa_anonymousURI; if (!replyto) replyto = soap_wsa_anonymousURI; else if (!wsa_id) wsa_id = soap_wsa_rand_uuid(soap); if (soap_wsa_request(soap, wsa_id, to, action)) return soap->error; if (!acksto) acksto = replyto; soap_wsa_add_ReplyTo(soap, replyto); #if WITH_WCF #if 0 /* WCF simulated channel instance */ if (strcmp(replyto, soap_wsa_anonymousURI)) /* only with ReplyTo set */ { int ci = 2; /* for example */ struct wsa5__ReferenceParametersType rp; soap_default_wsa5__ReferenceParametersType(soap, &rp); rp.chan__ChannelInstance = &ci; soap->header->wsa5__ReplyTo->ReferenceParameters = &rp; } #endif #endif req.AcksTo.Address = (char*)acksto; if (expires) { req.Expires = (xsd__duration*)soap_malloc(soap, sizeof(xsd__duration)); if (!req.Expires) return soap->error; *req.Expires = expires; } if (!id || *id) { req.Offer = (struct wsrm__OfferType*)soap_malloc(soap, sizeof(struct wsrm__OfferType)); if (!req.Offer) return soap->error; soap_default_wsrm__OfferType(soap, req.Offer); if (!id) { const char *t; MUTEX_LOCK(soap_wsrm_session_lock); t = soap_wsrm_seq_newid(soap); MUTEX_UNLOCK(soap_wsrm_session_lock); if (!t) return soap->error; id = req.Offer->Identifier = soap_strdup(soap, t); /* required */ free((void*)t); } else req.Offer->Identifier = soap_strdup(soap, id); /* required */ #ifdef SOAP_WSRM_2007 req.Offer->Endpoint.Address = (char*)replyto; /* required: use acksto endpoint */ if (expires) req.Offer->Expires = req.Expires; /* expire value */ #endif if (behavior != NoDiscard) req.Offer->IncompleteSequenceBehavior = &behavior; } else req.Offer = NULL; data->state = SOAP_WSRM_OFF; /* disable caching */ MUTEX_LOCK(soap_wsrm_session_lock); *seq = soap_wsrm_seq_insert(soap); if (!*seq) { MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error; } (*seq)->handle = 1; if (expires) (*seq)->expires = (*seq)->timestamp + expires/1000; (*seq)->behavior = behavior; if (id && *id) { l = strlen(id); if ((s = (char*)malloc(l + 1)) == NULL) { MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error = SOAP_EOM; } soap_strcpy(s, l + 1, id); (*seq)->acksid = s; soap_wsrm_seq_insert_ack(*seq); } if (to) { l = strlen(to); if ((s = (char*)malloc(l + 1)) == NULL) { MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error = SOAP_EOM; } soap_strcpy(s, l + 1, to); (*seq)->to = s; } if (wsa_id) { l = strlen(wsa_id); if ((s = (char*)malloc(l + 1)) == NULL) { MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error = SOAP_EOM; } /* trick to keep track of response via RelatesTo */ soap_strcpy(s, l + 1, wsa_id); (*seq)->id = s; soap_wsrm_seq_insert_data(*seq); } MUTEX_UNLOCK(soap_wsrm_session_lock); if (soap_call___wsrm__CreateSequence(soap, to, action, &req, &res)) { if (soap->error == 202) soap->error = SOAP_OK; return soap->error; } /* process response */ l = strlen(res.Identifier); if ((s = (char*)malloc(l + 1)) == NULL) return soap->error = SOAP_EOM; soap_strcpy(s, l + 1, res.Identifier); MUTEX_LOCK(soap_wsrm_session_lock); if ((*seq)->id) free((void*)(*seq)->id); (*seq)->id = s; soap_wsrm_seq_insert_data(*seq); if (res.Expires && (!expires || *res.Expires <= expires)) (*seq)->expires = time(NULL) + *res.Expires/1000; if (res.IncompleteSequenceBehavior) (*seq)->behavior = *res.IncompleteSequenceBehavior; else (*seq)->behavior = behavior; if (res.Accept && res.Accept->AcksTo.Address) { /* accepted: update the sequence for the responses */ l = strlen(res.Accept->AcksTo.Address); if ((s = (char*)malloc(l + 1)) == NULL) { MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error = SOAP_EOM; } if ((*seq)->acksto) free((void*)(*seq)->acksto); soap_strcpy(s, l + 1, res.Accept->AcksTo.Address); (*seq)->acksto = s; } MUTEX_UNLOCK(soap_wsrm_session_lock); (*seq)->state = SOAP_WSRM_CREATED; return SOAP_OK; } /** @fn int soap_wsrm_request_num(struct soap *soap, soap_wsrm_sequence_handle seq, const char *wsa_id, const char *wsa_action, ULONG64 num) @brief Adds a WS-RM sequence message number to the next message transmitted. No acks are requested. @param soap context @param seq sequence handle set by soap_wsrm_create() or soap_wsrm_create_offer() @param[in] wsa_id WS-Addressing message ID (optional, use NULL when omitted) @param[in] wsa_action mandatory WS-Addressing action of the next message sent @param[in] num WS-RM sequence message number @return SOAP_OK or error code */ int soap_wsrm_request_num(struct soap *soap, soap_wsrm_sequence_handle seq, const char *wsa_id, const char *wsa_action, ULONG64 num) { struct soap_wsrm_data *data; DBGFUN1("soap_wsrm_request_num", "num=" SOAP_ULONG_FORMAT, num); if (!soap_wsrm_seq_valid(soap, seq)) return soap_wsrm_error(soap, seq, wsrm__SequenceTerminated); if (num == 0) return soap_wsrm_error(soap, seq, wsrm__MessageNumberRollover); data = (struct soap_wsrm_data*)soap_lookup_plugin(soap, soap_wsrm_id); if (!data) return soap->error = SOAP_PLUGIN_ERROR; /* process response message sequence ID */ /* look into moving this to preparefinalrecv() for client-side only */ if (seq->acksid && soap->header && soap->header->wsrm__Sequence && !strcmp(soap->header->wsrm__Sequence->Identifier, seq->acksid)) { ULONG64 recvnum = soap->header->wsrm__Sequence->MessageNumber; if (soap_wsrm_num_lookup(soap, seq, recvnum)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Response message already received\n")); /* error? */ } else if (seq->behavior == DiscardFollowingFirstGap && recvnum != seq->recvnum + 1) return soap_wsrm_error(soap, seq, wsrm__SequenceTerminated); /* close or term */ else { /* TODO: should add message ordering constraint? */ seq->recvnum = recvnum; MUTEX_LOCK(soap_wsrm_session_lock); if (soap_wsrm_num_insert(soap, seq, seq->recvnum)) { MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error; } MUTEX_UNLOCK(soap_wsrm_session_lock); } } MUTEX_LOCK(soap_wsrm_session_lock); data->msg = soap_wsrm_msg_new(soap, seq, num); #ifdef SOAP_WSA_2005 if (soap->header && soap->header->chan__ChannelInstance) { seq->channel = soap->header->chan__ChannelInstance->__item; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "ChannelInstance = %d\n", seq->channel)); } #endif MUTEX_UNLOCK(soap_wsrm_session_lock); if (!data->msg) return soap->error; soap_header(soap); if (!soap->header) return soap->error; if (!soap->header->wsrm__Sequence && !(soap->header->wsrm__Sequence = (struct wsrm__SequenceType*)soap_malloc(soap, sizeof(struct wsrm__SequenceType)))) return soap->error; soap_default_wsrm__SequenceType(soap, soap->header->wsrm__Sequence); soap->header->wsrm__Sequence->Identifier = soap_strdup(soap, seq->id); soap->header->wsrm__Sequence->MessageNumber = num; /* add acks for ackRequested response from server */ if (soap_wsrm_add_acks(soap, seq, 0, 0, 1)) return soap->error; seq->retry = SOAP_WSRM_MAX_RETRIES; data->state = SOAP_WSRM_ON; return soap_wsa_request(soap, wsa_id, seq->to, wsa_action); } /** @fn int soap_wsrm_request(struct soap *soap, soap_wsrm_sequence_handle seq, const char *wsa_id, const char *wsa_action) @brief Adds a WS-RM sequence message number to the next message transmitted to the WS-RM destination and increments the message counter by one. No acks are requested. @param soap context @param seq sequence handle set by soap_wsrm_create() or soap_wsrm_create_offer() @param[in] wsa_id WS-Addressing message ID (optional, use NULL when omitted) @param[in] wsa_action mandatory WS-Addressing action of the next message sent @return SOAP_OK or error code */ int soap_wsrm_request(struct soap *soap, soap_wsrm_sequence_handle seq, const char *wsa_id, const char *wsa_action) { ULONG64 num; DBGFUN("soap_wsrm_request"); MUTEX_LOCK(soap_wsrm_session_lock); num = seq->num; MUTEX_UNLOCK(soap_wsrm_session_lock); return soap_wsrm_request_num(soap, seq, wsa_id, wsa_action, num + 1); } /** @fn int soap_wsrm_request_acks(struct soap *soap, soap_wsrm_sequence_handle seq, const char *wsa_id, const char *wsa_action) @brief Adds a WS-RM sequence message number to the next message transmitted to the WS-RM destination and increments the message counter by one. Message acks for the current sequence are requested. @param soap context @param seq sequence handle set by soap_wsrm_create() or soap_wsrm_create_offer() @param[in] wsa_id WS-Addressing message ID (optional, use NULL when omitted) @param[in] wsa_action mandatory WS-Addressing action of the next message sent @return SOAP_OK or error code */ int soap_wsrm_request_acks(struct soap *soap, soap_wsrm_sequence_handle seq, const char *wsa_id, const char *wsa_action) { ULONG64 num; DBGFUN("soap_wsrm_request_ack"); MUTEX_LOCK(soap_wsrm_session_lock); num = seq->num; MUTEX_UNLOCK(soap_wsrm_session_lock); if (soap_wsrm_request_num(soap, seq, wsa_id, wsa_action, num + 1)) return soap->error; soap->header->__sizeAckRequested = 1; if (!soap->header->wsrm__AckRequested && !(soap->header->wsrm__AckRequested = (struct wsrm__AckRequestedType*)soap_malloc(soap, sizeof(struct wsrm__AckRequestedType)))) return soap->error; soap_default_wsrm__AckRequestedType(soap, soap->header->wsrm__AckRequested); soap->header->wsrm__AckRequested->Identifier = soap->header->wsrm__Sequence->Identifier; return SOAP_OK; } /** @fn int soap_wsrm_check_retry(struct soap *soap, soap_wsrm_sequence_handle seq) @brief Client-side check to verify if the remote call can be retried when a failure occured. Increases the robustness of messages sends, by ensuring that the message was at least transmitted (but not necessarily received). Also implements HTTP 307 Temporary Redirect. Retries are limited to SOAP_WSRM_MAX_RETRIES iterations. @param soap context @param seq sequence handle set by soap_wsrm_create or soap_wsrm_create_offer @return SOAP_OK when retry is safe, error code otherwise */ int soap_wsrm_check_retry(struct soap *soap, soap_wsrm_sequence_handle seq) { struct soap_wsrm_data *data = (struct soap_wsrm_data*)soap_lookup_plugin(soap, soap_wsrm_id); if (!data) return soap->error = SOAP_PLUGIN_ERROR; DBGFUN("soap_wsrm_check_retry"); if (!soap_wsrm_seq_valid(soap, seq) || seq->retry-- == 0) return soap_wsrm_error(soap, seq, wsrm__SequenceTerminated); /* should actually not call this function when OK */ if (soap->error == SOAP_OK) return SOAP_OK; /* HTTP temporary redirect? */ if (soap->error == 307) { char *s; size_t l = strlen(soap->endpoint); if ((s = (char*)malloc(l + 1)) != NULL) { soap_strcpy(s, l + 1, soap->endpoint); if (seq->to) free((void*)seq->to); seq->to = s; } } /* if the sequence id was changed (eg. response), cannot resend and we fail */ else if (!soap->header || !soap->header->wsrm__Sequence || !soap->header->wsrm__Sequence->Identifier || !seq->id || strcmp(soap->header->wsrm__Sequence->Identifier, seq->id)) return soap->error; /* otherwise, send was not successful and we should try again */ data->state = SOAP_WSRM_ON; /* SOAP_OK to retry the call loop */ return soap->error = SOAP_OK; } /** @fn int soap_wsrm_resend(struct soap *soap, soap_wsrm_sequence_handle seq, ULONG64 lower, ULONG64 upper) @brief Resend all unacknowledged messages, i.e. messages that were automatically cached for this sequence. Messages stored in the sequence for retransmission (those that were previously sent but not acknowledged) are resent to the soap_wsrm_to() address (which was set by soap_wsrm_create() or soap_wsrm_create_offer(), or the ReplyTo address). It is recommended to resend messages after the last message in the sequence was transmitted before closing the sequence. To reduce unnecessary resend attempts, it is recommended to use soap_wsrm_request_ack() with the last message to request acks for messages already delivered. @param soap context @param seq sequence handle set by soap_wsrm_create or soap_wsrm_create_offer @param[in] lower resend message range lower bound (0 for lowest) @param[in] upper resend message range upper bound (or 0 for infinite) @return SOAP_OK or error code (can be ignored when resends are retried later) */ int soap_wsrm_resend(struct soap *soap, soap_wsrm_sequence_handle seq, ULONG64 lower, ULONG64 upper) { struct SOAP_ENV__Header *h = soap->header; struct soap_wsrm_data *data = (struct soap_wsrm_data*)soap_lookup_plugin(soap, soap_wsrm_id); DBGFUN("soap_wsrm_resend"); if (!data) return soap->error = SOAP_PLUGIN_ERROR; MUTEX_LOCK(soap_wsrm_session_lock); if (seq) { if (soap_wsrm_resend_seq(soap, seq, 1, lower, upper)) /* all=1 means non-acked messages */ { soap->header = h; MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error; } } else { for (seq = soap_wsrm_session; seq; seq = seq->next) { if (soap_wsrm_resend_seq(soap, seq, 1, lower, upper)) /* all=1 means non-acked messages */ { soap->header = h; MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error; } } } MUTEX_UNLOCK(soap_wsrm_session_lock); soap->header = h; return SOAP_OK; } /** @fn int soap_wsrm_resend_only_nacked(struct soap *soap, soap_wsrm_sequence_handle seq, ULONG64 lower, ULONG64 upper) @brief Resend all explicitly nack'ed messages indicaed by peer. Messages stored in the sequence for retransmission (those that were previously sent but not acknowledged) are resent to the soap_wsrm_to() address (which was set by soap_wsrm_create() or soap_wsrm_create_offer(), or the ReplyTo address). @param soap context @param seq sequence handle set by soap_wsrm_create or soap_wsrm_create_offer @param[in] lower resend message range lower bound (0 for lowest) @param[in] upper resend message range upper bound (or 0 for infinite) @return SOAP_OK or error code (can be ignored when resends are retried later) */ int soap_wsrm_resend_only_nacked(struct soap *soap, soap_wsrm_sequence_handle seq, ULONG64 lower, ULONG64 upper) { struct SOAP_ENV__Header *h = soap->header; struct soap_wsrm_data *data = (struct soap_wsrm_data*)soap_lookup_plugin(soap, soap_wsrm_id); DBGFUN("soap_wsrm_resend_only_nacked"); if (!data) return soap->error = SOAP_PLUGIN_ERROR; MUTEX_LOCK(soap_wsrm_session_lock); if (seq) { if (soap_wsrm_resend_seq(soap, seq, 0, lower, upper)) /* all=0 means resend only Nack messages */ { soap->header = h; MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error; } } else { for (seq = soap_wsrm_session; seq; seq = seq->next) { if (soap_wsrm_resend_seq(soap, seq, 0, lower, upper)) /* all=0 means resend only Nack messages */ { soap->header = h; MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error; } } } MUTEX_UNLOCK(soap_wsrm_session_lock); soap->header = h; return SOAP_OK; } /** @fn int soap_wsrm_close(struct soap *soap, soap_wsrm_sequence_handle seq, const char *wsa_id) @brief Closes the sequence, but does not yet terminate it. No new messages should be send, but messages can be resend with soap_wsrm_resend() if desired. @param soap context @param seq sequence handle set by soap_wsrm_create or soap_wsrm_create_offer @param[in] wsa_id WS-Addressing message ID (optional) @return SOAP_OK or error code */ int soap_wsrm_close(struct soap *soap, soap_wsrm_sequence_handle seq, const char *wsa_id) { #ifdef SOAP_WSRM_2007 struct wsrm__CloseSequenceType req; struct wsrm__CloseSequenceResponseType res; #endif struct soap_wsrm_data *data = (struct soap_wsrm_data*)soap_lookup_plugin(soap, soap_wsrm_id); DBGFUN1("soap_wsrm_close", "wsa_id=%s", wsa_id ? wsa_id : "(null)"); if (!data) return soap->error = SOAP_PLUGIN_ERROR; if (seq->state == SOAP_WSRM_TERMINATED) return soap_wsrm_error(soap, seq, wsrm__SequenceTerminated); /* process previous response message sequence ID */ /* look into moving this to preparefinalrecv() */ if (seq->acksid && soap->header && soap->header->wsrm__Sequence && !strcmp(soap->header->wsrm__Sequence->Identifier, seq->acksid)) { if (soap_wsrm_num_lookup(soap, seq, soap->header->wsrm__Sequence->MessageNumber)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Response message already received\n")); /* No error? */ } else if (seq->behavior == DiscardFollowingFirstGap && soap->header->wsrm__Sequence->MessageNumber != seq->recvnum + 1) return soap_wsrm_error(soap, seq, wsrm__SequenceTerminated); /* close or terminate */ else { seq->recvnum = soap->header->wsrm__Sequence->MessageNumber; MUTEX_LOCK(soap_wsrm_session_lock); if (soap_wsrm_num_insert(soap, seq, seq->recvnum)) { MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error; } MUTEX_UNLOCK(soap_wsrm_session_lock); } } /* add acks for ackRequested response from server */ /* this appears necessary, but not mentioned in the WS-RM specs */ if (soap_wsrm_add_acks(soap, seq, 0, 1, 1)) return soap->error; #ifdef SOAP_WSRM_2007 soap->header->wsrm__Sequence = NULL; if (soap_wsa_request(soap, wsa_id, seq->to, SOAP_NAMESPACE_OF_wsrm"/CloseSequence")) return soap->error; soap_default_wsrm__CloseSequenceType(soap, &req); req.Identifier = soap_strdup(soap, seq->id); if (seq->num) req.LastMsgNumber = &seq->num; else req.LastMsgNumber = NULL; data->state = SOAP_WSRM_OFF; /* disable caching */ seq->state = SOAP_WSRM_CLOSED; if (soap_call___wsrm__CloseSequence(soap, seq->to, soap->header->wsa5__Action, &req, &res)) { if (soap->error == 202) soap->error = SOAP_OK; else return soap->error; } else if (!res.Identifier || strcmp(res.Identifier, seq->id)) return soap_wsrm_error(soap, seq, wsrm__UnknownSequence); return SOAP_OK; #endif #ifdef SOAP_WSRM_2005 if (soap_wsrm_request_acks(soap, seq, wsa_id, SOAP_NAMESPACE_OF_wsrm"/LastMessage")) return soap->error; soap->header->wsrm__Sequence->LastMessage = (struct _wsrm__UsesSequenceSSL*)soap_malloc(soap, sizeof(struct _wsrm__UsesSequenceSSL)); if (!soap->header->wsrm__Sequence->LastMessage) return soap->error; soap_default__wsrm__UsesSequenceSSL(soap, soap->header->wsrm__Sequence->LastMessage); seq->state = SOAP_WSRM_CLOSED; if (soap_send___wsrm__LastMessage(soap, seq->to, soap->header->wsa5__Action)) return soap->error; return soap_recv_empty_response(soap); #endif } /** @fn int soap_wsrm_terminate(struct soap *soap, soap_wsrm_sequence_handle seq, const char *wsa_id) @brief Terminates the sequence. No new messages should be send and no resends should be tried. Usually done after soap_wsrm_close() or any time to terminate the sequence prematurely. @param soap context @param seq sequence handle set by soap_wsrm_create or soap_wsrm_create_offer @param[in] wsa_id WS-Addressing message ID (optional) @return SOAP_OK or error code */ int soap_wsrm_terminate(struct soap *soap, soap_wsrm_sequence_handle seq, const char *wsa_id) { struct wsrm__TerminateSequenceType req; struct wsrm__TerminateSequenceResponseType res; struct soap_wsrm_data *data = (struct soap_wsrm_data*)soap_lookup_plugin(soap, soap_wsrm_id); DBGFUN1("soap_wsrm_terminate", "wsa_id=%s", wsa_id ? wsa_id : "(null)"); if (!data) return soap->error = SOAP_PLUGIN_ERROR; if (soap->header) { soap->header->wsrm__Sequence = NULL; soap->header->wsrm__AckRequested = NULL; soap->header->wsrm__SequenceAcknowledgement = NULL; } if (soap_wsa_request(soap, wsa_id, seq->to, SOAP_NAMESPACE_OF_wsrm"/TerminateSequence")) return soap->error; soap_default_wsrm__TerminateSequenceType(soap, &req); req.Identifier = soap_strdup(soap, seq->id); #ifdef SOAP_WSRM_2007 if (seq->num) req.LastMsgNumber = &seq->num; if (seq->ranges) seq->lastnum = seq->ranges->upper; /* why does WS-RM 2007 not allow us to check the last message num in a response? */ #endif data->state = SOAP_WSRM_OFF; /* disable caching */ seq->state = SOAP_WSRM_TERMINATED; if (soap_call___wsrm__TerminateSequence(soap, seq->to, soap->header->wsa5__Action, &req, &res)) { if (soap->error == 202) soap->error = SOAP_OK; else return soap->error; } else if (!res.Identifier || strcmp(res.Identifier, seq->id)) return soap_wsrm_error(soap, seq, wsrm__UnknownSequence); if (seq->behavior == DiscardEntireSequence && (soap_wsrm_nack(seq) || (seq->recvnum && (!seq->ranges || seq->ranges->lower != 1 || seq->ranges->upper != seq->lastnum)))) return soap_wsrm_error(soap, seq, wsrm__SequenceTerminated); if (seq->fault != (enum wsrm__FaultCodes)(-1)) return soap_wsrm_error(soap, seq, seq->fault); return SOAP_OK; } /** @fn int soap_wsrm_pulse(struct soap *soap, int timeout) @brief Sends acknowledgements for all open sessions to all peers. Must set send and recv timeouts to prevent blocking. @param soap context @param timeout seconds (positive value) or microseconds (negative value) @return SOAP_OK or an error code when one or more peers fault (the last error code is returned) */ int soap_wsrm_pulse(struct soap *soap, int timeout) { soap_wsrm_sequence_handle seq; int ct = soap->connect_timeout; int st = soap->send_timeout; int rt = soap->recv_timeout; int a = 1; int err = SOAP_OK, errnum = 0; DBGFUN("soap_wsrm_pulse"); soap->connect_timeout = soap->send_timeout = soap->recv_timeout = timeout; MUTEX_LOCK(soap_wsrm_session_lock); for (seq = soap_wsrm_session; seq; seq = seq->next) { if ((seq->state == SOAP_WSRM_CREATED || seq->state == SOAP_WSRM_CLOSED) && seq->recvnum) seq->ackreq = 1; } MUTEX_UNLOCK(soap_wsrm_session_lock); while (a) { a = 0; MUTEX_LOCK(soap_wsrm_session_lock); for (seq = soap_wsrm_session; seq; seq = seq->next) { if (seq->ackreq && seq->recvnum && soap_wsrm_seq_valid(soap, seq)) { seq->refs++; MUTEX_UNLOCK(soap_wsrm_session_lock); /* send acks for this sequence */ if (soap_wsrm_acknowledgement(soap, seq, NULL)) { err = soap->error; errnum = soap->errnum; soap->error = SOAP_OK; /* must keep going, ignore peer-related problems */ } soap_wsrm_seq_release(soap, seq); a = 1; break; } } if (!a) MUTEX_UNLOCK(soap_wsrm_session_lock); } soap->connect_timeout = ct; soap->send_timeout = st; soap->recv_timeout = rt; soap->error = err; soap->errnum = errnum; return err; } /** @fn int soap_wsrm_acknowledgement(struct soap *soap, soap_wsrm_sequence_handle seq, const char *wsa_id) @brief Sends acknowledgements for all message sequences that require an acknowledgement (ack requested by peer) @param soap context @param seq sequence handle set by soap_wsrm_create or soap_wsrm_create_offer @param[in] wsa_id WS-Addressing message ID (deprecated, not used) @return SOAP_OK or error code */ int soap_wsrm_acknowledgement(struct soap *soap, soap_wsrm_sequence_handle seq, const char *wsa_id) { (void)wsa_id; DBGFUN("soap_wsrm_acknowledgement"); if (seq->state == SOAP_WSRM_CREATED || seq->state == SOAP_WSRM_CLOSED) { soap->header = NULL; /* force adding acks and send them all (piggy=0) */ if (soap_wsrm_add_acks(soap, seq, 0, 1, 0)) return soap->error; } seq->ackreq = 0; return SOAP_OK; } /** @fn int soap_wsrm_non_acknowledgement(struct soap *soap, soap_wsrm_sequence_handle seq, ULONG64 nack) @brief Sends nack non-acknowledgement for a message @param soap context @param seq sequence handle set by soap_wsrm_create or soap_wsrm_create_offer @param nack num of message to nack @return SOAP_OK or error code */ int soap_wsrm_non_acknowledgement(struct soap *soap, soap_wsrm_sequence_handle seq, ULONG64 nack) { DBGFUN("soap_wsrm_non_acknowledgement"); seq->ackreq = 0; if ((seq->state == SOAP_WSRM_CREATED || seq->state == SOAP_WSRM_CLOSED)) { soap->header = NULL; /* force adding acks and send them all (piggy=0) */ if (soap_wsrm_add_acks(soap, seq, nack, 0, 0)) return soap->error; } return SOAP_OK; } /** @fn void soap_wsrm_seq_free(struct soap *soap, soap_wsrm_sequence_handle seq) @brief Must be called to free the sequence allocated by soap_wsrm_create() or by soap_wsrm_create_offer(). Sequences created by soap_wsrm_create_offer return handles that are not automatically reclaimed by the engine. @param soap context @param seq sequence handle set by soap_wsrm_create() or soap_wsrm_create_offer() */ void soap_wsrm_seq_free(struct soap *soap, soap_wsrm_sequence_handle seq) { struct soap_wsrm_data *data; struct soap_wsrm_sequence **q; time_t now = time(NULL); DBGFUN("soap_wsrm_seq_free"); data = (struct soap_wsrm_data*)soap_lookup_plugin(soap, soap_wsrm_id); if (!data) return; MUTEX_LOCK(soap_wsrm_session_lock); q = &soap_wsrm_session; while (*q) { if ((!(*q)->handle && !(*q)->refs && (*q)->expires < now) || *q == seq) { struct soap_wsrm_sequence *t = *q; #ifndef SOAP_WSRM_FAST_ALLOC struct soap_wsrm_message *p, *r; #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Deleting sequence %s\n", t->id ? t->id : "(null)")); if (t->id) { soap_wsrm_seq_delete_data(t); free((void*)t->id); } if (t->acksid) { soap_wsrm_seq_delete_ack(t); free((void*)t->acksid); } if (t->to) free((void*)t->to); if (t->repto) free((void*)t->repto); if (t->acksto) free((void*)t->acksto); soap_wsrm_num_free(soap, t); #ifdef SOAP_WSRM_FAST_ALLOC if (t->messages) { ULONG64 i; for (i = 0; i < t->num; i++) { if (t->messages[i]) { soap_wsrm_msg_free(soap, t->messages[i]); free((void*)t->messages[i]); } } free((void*)t->messages); } #else for (p = t->messages; p; p = r) { r = p->next; soap_wsrm_msg_free(soap, p); free((void*)p); } #endif *q = t->next; free((void*)t); if (seq) break; } else q = &(*q)->next; } MUTEX_UNLOCK(soap_wsrm_session_lock); } /** @fn const char *soap_wsrm_to(const soap_wsrm_sequence_handle seq) @brief Returns the endpoint address of the destination service that serves the sequence. Initially set with soap_wsrm_create or soap_wsrm_create_offer. HTTP 307 Temporary Redirect can change the endpoint during the lifetime of a message sequence. Thus, this function returns the most recent endpoint binding that can be used to send message to the server endpoint. @param seq sequence handle set by soap_wsrm_create() or soap_wsrm_create_offer() @return the sequence endpoint address or replyTo address (when provided) or NULL when no destination is given */ const char * soap_wsrm_to(const soap_wsrm_sequence_handle seq) { if (seq->repto) { if (!strcmp(seq->repto, soap_wsa_noneURI)) return NULL; if (strcmp(seq->repto, soap_wsa_anonymousURI)) return seq->repto; } return seq->to; } /** @fn const char *soap_wsrm_acksto(const soap_wsrm_sequence_handle seq) @brief Returns the endpoint address of the AcksTo acknowledgement service that serves the sequence, when set with soap_wsrm_create() or soap_wsrm_create_offer() or NULL otherwise. HTTP 307 Temporary Redirect can change the endpoint during the lifetime of a message sequence. Thus, this function returns the most recent endpoint binding. @param seq sequence handle set by soap_wsrm_create() or soap_wsrm_create_offer() @return the sequence endpoint address */ const char * soap_wsrm_acksto(const soap_wsrm_sequence_handle seq) { return seq->acksto; } /** @fn ULONG64 soap_wsrm_num(const soap_wsrm_sequence_handle seq) @brief Returns the current message number of the sequence @param seq sequence handle set by soap_wsrm_create() or soap_wsrm_create_offer() @return the sequence endpoint address */ ULONG64 soap_wsrm_num(const soap_wsrm_sequence_handle seq) { return seq->num; } /** @fn ULONG64 soap_wsrm_nack(const soap_wsrm_sequence_handle seq) @brief Returns the number of non-acknowledged messages sent @param seq sequence handle set by soap_wsrm_create() or soap_wsrm_create_offer() @return number of non-acknowledged messages sent */ ULONG64 soap_wsrm_nack(const soap_wsrm_sequence_handle seq) { ULONG64 nack = 0; #ifdef SOAP_WSRM_FAST_ALLOC ULONG64 i; MUTEX_LOCK(soap_wsrm_session_lock); for (i = 0; i < seq->num; i++) if (seq->messages[i] && seq->messages[i]->state == SOAP_WSRM_NACK) nack++; MUTEX_UNLOCK(soap_wsrm_session_lock); #else struct soap_wsrm_message *p; MUTEX_LOCK(soap_wsrm_session_lock); for (p = seq->messages; p; p = p->next) if (p->state == SOAP_WSRM_NACK) nack++; MUTEX_UNLOCK(soap_wsrm_session_lock); #endif return nack; } /******************************************************************************\ * * Server * \******************************************************************************/ /** @fn int soap_wsrm_check(struct soap *soap) @brief Receiver (server)-side check for the presence of WS-Addressing and WS-RM header blocks in the SOAP header, checks for protocol errors, and rejects duplicate messages. Also prepares the return WS-RM header. This function should be called in the each service operation that supports WS-RM. Do not use this function in a ReplyTo response-accepting destination service operation. When NoDicards behavior is set, out of sequence messages will be discared until message sequence has resumed (requires peer resends). @param soap context @return SOAP_OK or SOAP_STOP (duplicate message error, MUST be returned by the service operation executing the soap_wsrm_check) or an error code. */ int soap_wsrm_check(struct soap *soap) { DBGFUN("soap_wsrm_check"); return soap_wsrm_chk(soap, 0, 0); } /** @fn int soap_wsrm_check_and_wait(struct soap *soap, int timeout) @brief Receiver (server)-side check for the presence of WS-Addressing and WS-RM header blocks in the SOAP header, checks for protocol errors, and rejects duplicate messages. Also prepares the return WS-RM header. This function should be called in the each service operation that supports WS-RM. Do not use this function in a ReplyTo response-accepting destination service operation. @param soap context @param timeout NoDiscard behavior: 0=discard messages out of sequence to immediately resume, >0 wait (in seconds) until message sequence has resumed while sending Nacks every second to indicate messages are required to continue the flow of messages, <0 wait (in microseconds) until message sequence has resumed, send one nack when timeout occurred. @return SOAP_OK or SOAP_STOP (duplicate message error, MUST be returned by the service operation executing the soap_wsrm_check) or an error code. */ int soap_wsrm_check_and_wait(struct soap *soap, int timeout) { DBGFUN1("soap_wsrm_check_and_wait", "timeout=%d", timeout); return soap_wsrm_chk(soap, timeout, 0); } /** @fn int soap_wsrm_check_send_empty_response(struct soap *soap) @brief Receiver (server)-side check for the presence of WS-Addressing and WS-RM header blocks in the SOAP header, checks for protocol errors, and rejects duplicate messages. Also prepares the return WS-RM header. This function should be called in the each service operation that sends an empty response back (one-way messaging). The behavior is the same as soap_wsrm_check() followed by soap_send_empty_response(), but more efficient and prevents blocking. @param soap context @return SOAP_OK or SOAP_STOP (duplicate message error, MUST be returned by the service operation executing the soap_wsrm_check) or an error code. */ int soap_wsrm_check_send_empty_response(struct soap *soap) { DBGFUN("soap_wsrm_check_send_empty_response"); return soap_wsrm_chk(soap, 0, 1); } /** @fn int soap_wsrm_check_send_empty_response_and_wait(struct soap *soap, int timeout) @brief Receiver (server)-side check for the presence of WS-Addressing and WS-RM header blocks in the SOAP header, checks for protocol errors, and rejects duplicate messages. Also prepares the return WS-RM header. This function should be called in the each service operation that sends an empty response back (one-way messaging). The behavior is the same as soap_wsrm_check() followed by soap_send_empty_response(), but more efficient and prevents blocking. @param soap context @param timeout NoDiscard behavior: 0=discard messages out of sequence to immediately resume, >0 wait (in seconds) until message sequence has resumed while sending Nacks every second to indicate messages are required to continue the flow of messages, <0 wait (in microseconds) until message sequence has resumed, send one nack when timeout occurred. @return SOAP_OK or SOAP_STOP (duplicate message error, MUST be returned by the service operation executing the soap_wsrm_check) or an error code. */ int soap_wsrm_check_send_empty_response_and_wait(struct soap *soap, int timeout) { DBGFUN1("soap_wsrm_check_send_empty_response_and_wait", "timeout=%d", timeout); return soap_wsrm_chk(soap, timeout, 1); } /** @fn int soap_wsrm_chk(struct soap *soap, int timeout, int flag) @brief Receiver (server)-side check for the presence of WS-Addressing and WS-RM header blocks in the SOAP header, checks for protocol errors, and rejects duplicate messages. Also prepares the return WS-RM header. This function should be called in the each service operation that supports WS-RM. Do not use this function in a ReplyTo response-accepting destination service operation. @param soap context @param timeout NoDiscard behavior: 0=discard messages out of sequence to immediately resume, >0 wait (in seconds) until message sequence has resumed while sending Nacks every second to indicate messages are required to continue the flow of messages, <0 wait (in microseconds) until message sequence has resumed, send one nack when timeout occurred. @param flag 0=no response, 1=send empty response @return SOAP_OK or SOAP_STOP (duplicate message error, MUST be returned by the service operation executing the soap_wsrm_check) or an error code. */ static int soap_wsrm_chk(struct soap *soap, int timeout, int flag) { struct soap_wsrm_sequence *seq; struct soap_wsrm_data *data; const char *replyTo; ULONG64 recvnum; if (soap_wsa_check(soap)) return soap->error; data = (struct soap_wsrm_data*)soap_lookup_plugin(soap, soap_wsrm_id); if (!data) return soap->error = SOAP_PLUGIN_ERROR; data->state = SOAP_WSRM_OFF; /* disable caching */ if (!soap->header || !soap->header->wsrm__Sequence) return soap_wsrm_error(soap, NULL, wsrm__WSRMRequired); if (flag) { soap_send_empty_response(soap, 202); soap->error = SOAP_OK; } MUTEX_LOCK(soap_wsrm_session_lock); seq = soap_wsrm_seq_lookup_ack(soap->header->wsrm__Sequence->Identifier); if (!seq) { MUTEX_UNLOCK(soap_wsrm_session_lock); return soap_wsrm_error(soap, NULL, wsrm__UnknownSequence); } if (!soap_wsrm_seq_valid(soap, seq)) { soap_wsrm_error(soap, seq, wsrm__SequenceTerminated); MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error; } seq->timestamp = time(NULL); recvnum = soap->header->wsrm__Sequence->MessageNumber; if (soap_wsrm_num_lookup(soap, seq, recvnum)) { /* changed in 1.3: outbound non-acked message resends removed from WS-RM 1.2 */ seq->refs++; MUTEX_UNLOCK(soap_wsrm_session_lock); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Message " SOAP_ULONG_FORMAT " already received: duplicate message not processed\n", recvnum)); if (!flag) soap_send_empty_response(soap, 202); /* HTTP 202 */ if (soap_wsrm_acknowledgement(soap, seq, NULL)) /* send acks, should help avoid getting resends */ soap->error = SOAP_OK; soap_wsrm_seq_release(soap, seq); return soap->error = SOAP_STOP; /* do not process message */ } if (seq->lastnum && recvnum > seq->lastnum) { #ifdef SOAP_WSRM_2005 soap_wsrm_error(soap, seq, wsrm__LastMessageNumberExceeded); #else soap_wsrm_error(soap, seq, wsrm__SequenceClosed); #endif MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error; } if (seq->behavior == DiscardFollowingFirstGap && recvnum != seq->recvnum + 1) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Message " SOAP_ULONG_FORMAT " received after message " SOAP_ULONG_FORMAT ", sequence discarded following first gap\n", recvnum, seq->recvnum)); soap_wsrm_error(soap, seq, wsrm__SequenceTerminated); /* close or term */ MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error; } else if (seq->behavior == NoDiscard && recvnum != seq->recvnum + 1) { if (timeout) { volatile ULONG64 *vp = &seq->recvnum; /* recvnum is updated by other threads */ int r1, r2; #ifdef _WRS_KERNEL int r3; #else unsigned int r3; #endif struct soap *nack_soap = NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Message " SOAP_ULONG_FORMAT " received after message " SOAP_ULONG_FORMAT "\n", recvnum, *vp)); if (timeout > 0) { r1 = timeout; /* seconds to queue message, send Nack every second (timeout-1 times) */ r2 = 5; /* 5 times... */ #ifdef _WRS_KERNEL r3 = (sysClkRateGet()/1000) * 200; #else r3 = 200000; /* 200 ms sleep in the message queue */ #endif } else if (timeout < -100000) { r1 = 1; r2 = -timeout / 100000 + 1; #ifdef _WRS_KERNEL r3 = (sysClkRateGet()/1000) * 100; #else r3 = 100000; /* 100 ms sleep */ #endif } else { r1 = r2 = 1; #ifdef _WRS_KERNEL r3 = (int)((ULONG64)(-timeout) * sysClkRateGet()/1000000); #else r3 = -timeout; #endif } while (r1) { while (r2) { MUTEX_UNLOCK(soap_wsrm_session_lock); #if defined(_WRS_KERNEL) taskDelay(r3); /* VxWorks compatible sleep API, delay is specified in number of ticks, which depends on the System Clock Rate */ #elif defined(WIN32) Sleep(r3/1000); #else usleep(r3); #endif MUTEX_LOCK(soap_wsrm_session_lock); if (recvnum == *vp + 1) /* check again, exit inner loop when message is in sequence */ break; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Cannot accept message " SOAP_ULONG_FORMAT " after message " SOAP_ULONG_FORMAT "\n", recvnum, *vp)); r2--; } if (recvnum == *vp + 1) /* check again, exit outer loop when message is in sequence */ break; r1--; if (r1) { /* send nack to request resend of message(s) in the gap */ MUTEX_UNLOCK(soap_wsrm_session_lock); if (!nack_soap) nack_soap = soap_copy(soap); /* use a context copy, so we do not alter current context when sending */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Sending Nack for message " SOAP_ULONG_FORMAT "\n", *vp + 1)); if (nack_soap) soap_wsrm_non_acknowledgement(nack_soap, seq, *vp + 1); /* send nack for the message that we need */ MUTEX_LOCK(soap_wsrm_session_lock); } } if (nack_soap) { soap_end(nack_soap); soap_free(nack_soap); /* remove context copy */ } if (recvnum != *vp + 1) { /* timed out, ignore this message */ MUTEX_UNLOCK(soap_wsrm_session_lock); if (!flag) soap_send_empty_response(soap, 202); return soap->error = SOAP_STOP; } } else { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Message " SOAP_ULONG_FORMAT " received after message " SOAP_ULONG_FORMAT "\n", recvnum, seq->recvnum)); /* ignore messages that are not in order, send nack to request resend */ MUTEX_UNLOCK(soap_wsrm_session_lock); if (!flag) soap_send_empty_response(soap, 202); /* soap_wsrm_non_acknowledgement(soap, seq, seq->recvnum + 1); */ /* send nack for the message that we need? */ return soap->error = SOAP_STOP; } } seq->recvnum = recvnum; if (soap_wsrm_num_insert(soap, seq, recvnum)) { MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Message " SOAP_ULONG_FORMAT " accepted\n", recvnum)); if (seq->repto) { free((void*)seq->repto); seq->repto = NULL; } replyTo = soap_wsa_ReplyTo(soap); if (replyTo && strcmp(replyTo, soap_wsa_anonymousURI)) { char *s; size_t l = strlen(replyTo); if ((s = (char*)malloc(l + 1)) == NULL) { MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error = SOAP_EOM; } soap_strcpy(s, l + 1, replyTo); seq->repto = s; } #ifdef SOAP_WSA_2005 if (soap->header && soap->header->chan__ChannelInstance) { seq->channel = soap->header->chan__ChannelInstance->__item; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "ChannelInstance = %d\n", seq->channel)); } #endif MUTEX_UNLOCK(soap_wsrm_session_lock); return soap_wsrm_chk_acks(soap); } /** @fn int soap_wsrm_reply_num(struct soap *soap, int flag) @brief Prepares reply from service. When flag is set, adds a WS-RM sequence message number to the next message transmitted. No acks are requested. No WS-Addressing message relay. @param soap context @param flag true to add a WS-RM sequence message number to the message to be transmitted @return SOAP_OK or error code (and server operation must return this value) */ int soap_wsrm_reply_num(struct soap *soap, int flag) { struct soap_wsrm_sequence *seq; struct soap_wsrm_data *data; DBGFUN("soap_wsrm_reply_num"); data = (struct soap_wsrm_data*)soap_lookup_plugin(soap, soap_wsrm_id); if (!data) return soap->error = SOAP_PLUGIN_ERROR; data->state = SOAP_WSRM_OFF; /* disable caching */ if (!soap->header || !soap->header->wsrm__Sequence) return soap_wsrm_error(soap, NULL, wsrm__WSRMRequired); MUTEX_LOCK(soap_wsrm_session_lock); seq = soap_wsrm_seq_lookup_ack(soap->header->wsrm__Sequence->Identifier); if (!seq) { MUTEX_UNLOCK(soap_wsrm_session_lock); return soap_wsrm_error(soap, NULL, wsrm__UnknownSequence); } if (seq->id) { ULONG64 num = seq->num; if (flag) { if ((data->msg = soap_wsrm_msg_new(soap, seq, num + 1)) == NULL) { MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error; } data->state = SOAP_WSRM_ON; if (data->seq) data->seq->refs--; data->seq = seq; seq->refs++; /* do not dealloc until message sent or error */ num = seq->num; } soap_default_wsrm__SequenceType(soap, soap->header->wsrm__Sequence); soap->header->wsrm__Sequence->Identifier = soap_strdup(soap, seq->id); soap->header->wsrm__Sequence->MessageNumber = num; } else soap->header->wsrm__Sequence = NULL; MUTEX_UNLOCK(soap_wsrm_session_lock); soap->header->__sizeAckRequested = 0; if (!soap->header->SOAP_WSA(ReplyTo) || !soap->header->SOAP_WSA(ReplyTo)->Address || !strcmp(soap->header->SOAP_WSA(ReplyTo)->Address, soap_wsa_anonymousURI)) soap_wsa_add_ReplyTo(soap, seq->to); if (!soap->header->SOAP_WSA(FaultTo) || !soap->header->SOAP_WSA(FaultTo)->Address || !strcmp(soap->header->SOAP_WSA(FaultTo)->Address, soap_wsa_anonymousURI)) soap_wsa_add_FaultTo(soap, seq->to); /* add acks for ackRequested response from server */ return soap_wsrm_add_acks(soap, seq, 0, 0, 1); } /** @fn int soap_wsrm_reply(struct soap *soap, const char *wsa_id, const char *wsa_action) @brief Server-side server operation reply to be performed when the service operation returns. Server operations that support WS-Addressing and WS-RM must call this function to return normally (and/or allow the response message to be relayed as per WS-Addressing). @param soap context @param[in] wsa_id WS-Addressing message ID (optional) @param[in] wsa_action mandatory WS-Addressing action of the response @return SOAP_OK or error code (and server operation must return this value) */ int soap_wsrm_reply(struct soap *soap, const char *wsa_id, const char *wsa_action) { DBGFUN("soap_wsrm_reply"); if (soap_wsrm_reply_num(soap, 1)) return soap->error; return soap_wsa_reply(soap, wsa_id, wsa_action); } /** @fn int soap_wsrm_reply_request_acks(struct soap *soap, const char *wsa_id, const char *wsa_action) @brief Server-side server operation reply to be performed when the service operation returns. Message acks for the current sequence are requested, but only when client made a create sequence offer. Server operations that support WS-Addressing and WS-RM must call this function or call soap_wsrm_reply() to return normally (and/or allow the response message to be relayed as per WS-Addressing). @param soap context @param[in] wsa_id WS-Addressing message ID (optional) @param[in] wsa_action mandatory WS-Addressing action of the response @return SOAP_OK or error code (and server operation must return this value) */ int soap_wsrm_reply_request_acks(struct soap *soap, const char *wsa_id, const char *wsa_action) { DBGFUN("soap_wsrm_reply_request_acks"); if (soap_wsrm_reply_num(soap, 1)) return soap->error; if (soap->header->wsrm__Sequence) { if (!soap->header->wsrm__AckRequested && !(soap->header->wsrm__AckRequested = (struct wsrm__AckRequestedType*)soap_malloc(soap, sizeof(struct wsrm__AckRequestedType)))) return soap->error; soap->header->__sizeAckRequested = 1; soap_default_wsrm__AckRequestedType(soap, soap->header->wsrm__AckRequested); soap->header->wsrm__AckRequested->Identifier = soap->header->wsrm__Sequence->Identifier; } return soap_wsa_reply(soap, wsa_id, wsa_action); } /** @fn void soap_wsrm_cleanup(struct soap *soap) @brief Cleans up all expired sequences and releases resources. To be used at the server side to periodically clean up WS-RM sequences. Server-side cleanup is automatic, as long as WS-RM is in use. Does not release client-side sequences allocated by soap_wsrm_create() or soap_wsrm_create_offer(). @param soap context */ void soap_wsrm_cleanup(struct soap *soap) { DBGFUN("soap_wsrm_cleanup"); soap_wsrm_seq_free(soap, NULL); } #ifdef __cplusplus } #endif /******************************************************************************\ * * Server-side Predefined WS-RM Operations * \******************************************************************************/ /** @fn int __wsrm__CreateSequence(struct soap *soap, struct wsrm__CreateSequenceType *req, struct wsrm__CreateSequenceResponseType *res) @brief WS-RM CreateSequence service operation. Automatically invoked by the server to process a create sequence request (with or without offer). Creates a new local sequence state to keep track of messages. @param soap context @param[in] req wsrm__CreateSequence request message @param[out] res wsrm__CreateSequenceResponse response message @return SOAP_OK or error code */ int __wsrm__CreateSequence(struct soap *soap, struct wsrm__CreateSequenceType *req, struct wsrm__CreateSequenceResponseType *res) { struct soap_wsrm_sequence *seq; struct soap_wsrm_data *data; char *action; const char *replyTo; size_t l; DBGFUN("__wsrm__CreateSequence"); if (soap_wsa_check(soap)) return soap->error; data = (struct soap_wsrm_data*)soap_lookup_plugin(soap, soap_wsrm_id); if (!data) return soap->error = SOAP_PLUGIN_ERROR; data->state = SOAP_WSRM_OFF; /* disable caching */ if (!req) return soap_wsrm_error(soap, NULL, wsrm__WSRMRequired); soap_wsrm_cleanup(soap); MUTEX_LOCK(soap_wsrm_session_lock); seq = soap_wsrm_seq_insert(soap); if (!seq) { MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error; } seq->num = 0; replyTo = soap_wsa_ReplyTo(soap); if (replyTo && strcmp(replyTo, soap_wsa_anonymousURI)) { char *s; l = strlen(replyTo); if ((s = (char*)malloc(l + 1)) == NULL) { MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error = SOAP_EOM; } soap_strcpy(s, l + 1, replyTo); seq->to = s; } if (req->AcksTo.Address) { char *s; l = strlen(req->AcksTo.Address); if ((s = (char*)malloc(l + 1)) == NULL) { MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error = SOAP_EOM; } soap_strcpy(s, l + 1, req->AcksTo.Address); seq->acksto = s; } if (req->Expires && *req->Expires/1000 < SOAP_WSRM_MAX_SEC_TO_EXPIRE) seq->expires = time(NULL) + *req->Expires/1000; seq->state = SOAP_WSRM_CREATED; if (req->Offer) { res->Accept = (struct wsrm__AcceptType*)soap_malloc(soap, sizeof(struct wsrm__AcceptType)); if (!res->Accept) { MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error; } soap_default_wsrm__AcceptType(soap, res->Accept); res->Accept->AcksTo.Address = soap->header->wsa5__To; /* acksto for responses req->AcksTo; */ res->Expires = req->Expires; if (req->Offer->Identifier) { /* check if offered identifier is acceptable? */ /* if (!soap_wsrm_seq_lookup_data(req->Offer->Identifier)) */ { char *s; l = strlen(req->Offer->Identifier); if ((s = (char*)malloc(l + 1)) != NULL) { soap_strcpy(s, l + 1, req->Offer->Identifier); seq->id = s; soap_wsrm_seq_insert_data(seq); } } } if (req->Offer->Expires && *req->Offer->Expires/1000 < SOAP_WSRM_MAX_SEC_TO_EXPIRE) seq->expires = time(NULL) + *req->Offer->Expires/1000; /* copy same behavior for response messages */ if (req->Offer->IncompleteSequenceBehavior) { res->IncompleteSequenceBehavior = req->Offer->IncompleteSequenceBehavior; seq->behavior = *res->IncompleteSequenceBehavior; } } if (!(seq->acksid = soap_wsrm_seq_newid(soap))) { MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error; } soap_wsrm_seq_insert_ack(seq); res->Identifier = soap_strdup(soap, seq->acksid); #ifdef SOAP_WSA_2005 if (soap->header->SOAP_WSA(ReplyTo) && soap->header->SOAP_WSA(ReplyTo)->ReferenceParameters && soap->header->SOAP_WSA(ReplyTo)->ReferenceParameters->chan__ChannelInstance) { seq->channel = *soap->header->SOAP_WSA(ReplyTo)->ReferenceParameters->chan__ChannelInstance; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "ReplyTo ChannelInstance = %d\n", seq->channel)); } #endif MUTEX_UNLOCK(soap_wsrm_session_lock); soap->header->wsrm__Sequence = NULL; soap->header->wsrm__AckRequested = NULL; l = strlen(soap->action); action = (char*)soap_malloc(soap, l + 9); if (!action) return soap->error; soap_strcpy(action, l + 9, soap->action); soap_strcpy(action + l, 9, "Response"); return soap_wsa_reply(soap, NULL, action); } /** @fn int __wsrm__CreateSequenceResponse(struct soap *soap, struct wsrm__CreateSequenceResponseType *res) @brief WS-RM CreateSequenceResponse one-way service operation. Automatically invoked by the server to process a create sequence response (with or without offer). Creates a new local sequence state to keep track of messages. @param soap context @param[in] res wsrm__CreateSequenceResponse response message @return SOAP_OK or error code */ int __wsrm__CreateSequenceResponse(struct soap *soap, struct wsrm__CreateSequenceResponseType *res) { struct soap_wsrm_sequence *seq; struct soap_wsrm_data *data; DBGFUN("__wsrm__CreateSequenceResponse"); if (soap_wsa_check(soap)) return soap->error; data = (struct soap_wsrm_data*)soap_lookup_plugin(soap, soap_wsrm_id); if (!data) return soap->error = SOAP_PLUGIN_ERROR; data->state = SOAP_WSRM_OFF; /* disable caching */ if (!res->Identifier) return soap_wsrm_error(soap, NULL, wsrm__CreateSequenceRefused); MUTEX_LOCK(soap_wsrm_session_lock); seq = soap_wsrm_seq_lookup_data(res->Identifier); if (!seq) { char *s; size_t l; if (!soap_wsa_RelatesTo(soap)) { MUTEX_UNLOCK(soap_wsrm_session_lock); return soap_wsrm_error(soap, NULL, wsrm__UnknownSequence); } seq = soap_wsrm_seq_lookup_data(soap_wsa_RelatesTo(soap)); if (!seq) { MUTEX_UNLOCK(soap_wsrm_session_lock); return soap_wsrm_error(soap, NULL, wsrm__UnknownSequence); } l = strlen(res->Identifier); if ((s = (char*)malloc(l + 1)) == NULL) { MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error = SOAP_EOM; } soap_strcpy(s, l + 1, res->Identifier); if (seq->id) free((void*)seq->id); seq->id = s; soap_wsrm_seq_insert_data(seq); } if (res->Expires && *res->Expires/1000 <= SOAP_WSRM_MAX_SEC_TO_EXPIRE) seq->expires = time(NULL) + *res->Expires/1000; if (res->IncompleteSequenceBehavior) seq->behavior = *res->IncompleteSequenceBehavior; if (res->Accept && res->Accept->AcksTo.Address) { char *s; size_t l = strlen(res->Accept->AcksTo.Address); /* accepted: update the sequence for the responses */ if ((s = (char*)malloc(l + 1)) == NULL) { MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error = SOAP_EOM; } soap_strcpy(s, l + 1, res->Accept->AcksTo.Address); if (seq->acksto) free((void*)seq->acksto); seq->acksto = s; } seq->state = SOAP_WSRM_CREATED; #ifdef SOAP_WSA_2005 if (soap->header && soap->header->chan__ChannelInstance) { seq->channel = soap->header->chan__ChannelInstance->__item; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "ChannelInstance = %d\n", seq->channel)); } #endif MUTEX_UNLOCK(soap_wsrm_session_lock); return soap_send_empty_response(soap, 202); } /** @fn int __wsrm__CloseSequence(struct soap *soap, struct wsrm__CloseSequenceType *req, struct wsrm__CloseSequenceResponseType *res) @brief WS-RM CloseSequence service operation. Automatically invoked by the server to process the close sequence request. Updates the server's local sequence state to closed. @param soap context @param[in] req wsrm__CloseSequence request message @param[out] res wsrm__CloseSequenceResponse response message @return SOAP_OK or error code */ int __wsrm__CloseSequence(struct soap *soap, struct wsrm__CloseSequenceType *req, struct wsrm__CloseSequenceResponseType *res) { struct soap_wsrm_sequence *seq; struct soap_wsrm_data *data; char *action; size_t l; DBGFUN("__wsrm__CloseSequence"); if (soap_wsa_check(soap)) return soap->error; data = (struct soap_wsrm_data*)soap_lookup_plugin(soap, soap_wsrm_id); if (!data) return soap->error = SOAP_PLUGIN_ERROR; data->state = SOAP_WSRM_OFF; /* disable caching */ if (!req) return soap_wsrm_error(soap, NULL, wsrm__WSRMRequired); MUTEX_LOCK(soap_wsrm_session_lock); seq = soap_wsrm_seq_lookup_ack(req->Identifier); if (!seq) { MUTEX_UNLOCK(soap_wsrm_session_lock); return soap_wsrm_error(soap, NULL, wsrm__UnknownSequence); } if (seq->state == SOAP_WSRM_TERMINATED) { soap_wsrm_error(soap, seq, wsrm__SequenceTerminated); MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error; } seq->state = SOAP_WSRM_CLOSED; seq->timestamp = time(NULL); #ifdef SOAP_WSRM_2007 if (req->LastMsgNumber) seq->lastnum = *req->LastMsgNumber; #endif res->Identifier = req->Identifier; soap->header->wsrm__Sequence = NULL; if (!soap->header->wsrm__SequenceAcknowledgement && !(soap->header->wsrm__SequenceAcknowledgement = (struct _wsrm__SequenceAcknowledgement*)soap_malloc(soap, sizeof(struct _wsrm__SequenceAcknowledgement)))) { MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error; } soap->header->__sizeSequenceAcknowledgement = 1; if (soap_wsrm_set_ack(soap, 0, seq, soap->header->wsrm__SequenceAcknowledgement)) { MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error; } soap_wsa_add_ReplyTo(soap, seq->to); MUTEX_UNLOCK(soap_wsrm_session_lock); l = strlen(soap->action); action = (char*)soap_malloc(soap, l + 9); if (!action) return soap->error; soap_strcpy(action, l + 9, soap->action); soap_strcpy(action + l, 9, "Response"); return soap_wsa_reply(soap, NULL, action); } /** @fn int __wsrm__CloseSequenceResponse(struct soap *soap, struct wsrm__CloseSequenceResponseType *res) @brief WS-RM CloseSequenceResponse one-way service operation. Automatically invoked by the server to process the close sequence response. Updates the server's local sequence state to closed. @param soap context @param[in] res wsrm__CloseSequenceResponse response message @return SOAP_OK or error code */ int __wsrm__CloseSequenceResponse(struct soap *soap, struct wsrm__CloseSequenceResponseType *res) { struct soap_wsrm_data *data; DBGFUN("__wsrm__CloseSequenceResponse"); if (soap_wsa_check(soap)) return soap->error; data = (struct soap_wsrm_data*)soap_lookup_plugin(soap, soap_wsrm_id); if (!data) return soap->error = SOAP_PLUGIN_ERROR; data->state = SOAP_WSRM_OFF; /* disable caching */ if (!res->Identifier || !soap_wsrm_seq_lookup_data(res->Identifier)) return soap_wsrm_error(soap, NULL, wsrm__UnknownSequence); return soap_send_empty_response(soap, 202); } /** @fn int __wsrm__TerminateSequence(struct soap *soap, struct wsrm__TerminateSequenceType *req, struct wsrm__TerminateSequenceResponseType *res) @brief WS-RM TerminateSequence service operation. Automatically invoked by the server to process the terminate sequence request. Updates the server's local sequence state to terminated. @param soap context @param[in] req wsrm__TerminateSequence request message @param[out] res wsrm__TerminateSequenceResponse response message @return SOAP_OK or error code */ int __wsrm__TerminateSequence(struct soap *soap, struct wsrm__TerminateSequenceType *req, struct wsrm__TerminateSequenceResponseType *res) { struct soap_wsrm_sequence *seq; struct soap_wsrm_data *data; char *action; size_t l; DBGFUN("__wsrm__TerminateSequence"); if (soap_wsa_check(soap)) return soap->error; data = (struct soap_wsrm_data*)soap_lookup_plugin(soap, soap_wsrm_id); if (!data) return soap->error = SOAP_PLUGIN_ERROR; data->state = SOAP_WSRM_OFF; /* disable caching */ if (!req) return soap_wsrm_error(soap, NULL, wsrm__WSRMRequired); soap_wsrm_cleanup(soap); MUTEX_LOCK(soap_wsrm_session_lock); seq = soap_wsrm_seq_lookup_ack(req->Identifier); if (!seq) { MUTEX_UNLOCK(soap_wsrm_session_lock); return soap_wsrm_error(soap, NULL, wsrm__UnknownSequence); } if (seq->state == SOAP_WSRM_TERMINATED) { MUTEX_UNLOCK(soap_wsrm_session_lock); return soap_send_empty_response(soap, 202); } seq->state = SOAP_WSRM_TERMINATED; seq->timestamp = time(NULL); #ifdef SOAP_WSRM_2007 if (req->LastMsgNumber) seq->lastnum = *req->LastMsgNumber; #endif /* DiscardEntireSequence: fail when inbound message sequence is not complete */ if (seq->behavior == DiscardEntireSequence && (seq->recvnum && (!seq->ranges || seq->ranges->lower != 1 || seq->ranges->upper != seq->lastnum))) { soap_wsrm_num_free(soap, seq); soap_wsrm_error(soap, seq, wsrm__SequenceTerminated); MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error; } #ifdef SOAP_WSRM_2005 res->Identifier = soap_strdup(soap, seq->id); soap->header->wsrm__Sequence = NULL; if (!soap->header->wsrm__SequenceAcknowledgement && !(soap->header->wsrm__SequenceAcknowledgement = (struct _wsrm__SequenceAcknowledgement*)soap_malloc(soap, sizeof(struct _wsrm__SequenceAcknowledgement)))) { MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error; } soap->header->__sizeSequenceAcknowledgement = 1; if (soap_wsrm_set_ack(soap, 0, seq, soap->header->wsrm__SequenceAcknowledgement)) { MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error; } soap_wsrm_num_free(soap, seq); soap_wsa_add_ReplyTo(soap, seq->to); MUTEX_UNLOCK(soap_wsrm_session_lock); action = soap_strdup(soap, soap->action); return soap_wsa_reply(soap, NULL, action); #else res->Identifier = req->Identifier; soap->header->wsrm__Sequence = NULL; if (!soap->header->wsrm__SequenceAcknowledgement && !(soap->header->wsrm__SequenceAcknowledgement = (struct _wsrm__SequenceAcknowledgement*)soap_malloc(soap, sizeof(struct _wsrm__SequenceAcknowledgement)))) { MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error; } soap->header->__sizeSequenceAcknowledgement = 1; if (soap_wsrm_set_ack(soap, 0, seq, soap->header->wsrm__SequenceAcknowledgement)) { MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error; } soap_wsrm_num_free(soap, seq); soap_wsa_add_ReplyTo(soap, seq->to); MUTEX_UNLOCK(soap_wsrm_session_lock); l = strlen(soap->action); action = (char*)soap_malloc(soap, l + 9); if (!action) return soap->error; soap_strcpy(action, l + 9, soap->action); soap_strcpy(action + l, 9, "Response"); return soap_wsa_reply(soap, NULL, action); #endif } /** @fn int __wsrm__TerminateSequenceResponse(struct soap *soap, struct wsrm__TerminateSequenceResponseType *res) @brief WS-RM TerminateSequenceResponse one-way service operation. Automatically invoked by the server to process the terminate sequence response. Updates the server's local sequence state to terminated. @param soap context @param[in] res wsrm__TerminateSequenceResponse response message @return SOAP_OK or error code */ int __wsrm__TerminateSequenceResponse(struct soap *soap, struct wsrm__TerminateSequenceResponseType *res) { struct soap_wsrm_data *data; DBGFUN("__wsrm__TerminateSequenceResponse"); if (soap_wsa_check(soap)) return soap->error; data = (struct soap_wsrm_data*)soap_lookup_plugin(soap, soap_wsrm_id); if (!data) return soap->error = SOAP_PLUGIN_ERROR; data->state = SOAP_WSRM_OFF; /* disable caching */ if (!res->Identifier || !soap_wsrm_seq_lookup_data(res->Identifier)) return soap_wsrm_error(soap, NULL, wsrm__UnknownSequence); return soap_send_empty_response(soap, 202); } /** @fn int __wsrm__SequenceAcknowledgement(struct soap *soap) @brief WS-RM SequenceAcknowledgement operation. @param soap context @return SOAP_OK or error code */ int __wsrm__SequenceAcknowledgement(struct soap *soap) { DBGFUN("__wsrm__SequenceAcknowledgement"); soap_wsrm_cleanup(soap); /* soap_wsrm_preparefinalrecv was called upon invocation, to process acks */ return soap_send_empty_response(soap, 202); } /** @fn int __wsrm__AckRequested(struct soap *soap) @brief WS-RM AckRequested operation. @param soap context @return SOAP_OK or error code */ int __wsrm__AckRequested(struct soap *soap) { struct soap_wsrm_sequence *seq = NULL; DBGFUN("__wsrm__AckRequested"); soap_wsrm_cleanup(soap); /* soap_wsrm_preparefinalrecv was called upon invocation, to process acks */ soap_send_empty_response(soap, 202); if (soap->header && soap->header->wsrm__AckRequested) { struct soap_wsrm_data *data = (struct soap_wsrm_data*)soap_lookup_plugin(soap, soap_wsrm_id); if (!data) return soap->error = SOAP_PLUGIN_ERROR; MUTEX_LOCK(soap_wsrm_session_lock); seq = soap_wsrm_seq_lookup_ack(soap->header->wsrm__AckRequested->Identifier); if (seq) { seq->refs++; MUTEX_UNLOCK(soap_wsrm_session_lock); if (soap_wsrm_acknowledgement(soap, seq, NULL)) soap->error = SOAP_OK; soap_wsrm_seq_release(soap, seq); } else MUTEX_UNLOCK(soap_wsrm_session_lock); } return SOAP_OK; } /** @fn int __wsrm__LastMessage(struct soap *soap) @brief WS-RM LastMessage operation (WS-RM 1.0). @param soap context @return SOAP_OK or error code */ int __wsrm__LastMessage(struct soap *soap) { struct soap_wsrm_sequence *seq = NULL; DBGFUN("__wsrm__LastMessage"); /* soap_wsrm_preparefinalrecv was called upon invocation, to process acks */ if (soap_wsrm_check_send_empty_response_and_wait(soap, SOAP_WSRM_TIMEOUT)) /* wait */ return soap->error; if (soap->header && soap->header->wsrm__Sequence) { struct soap_wsrm_data *data = (struct soap_wsrm_data*)soap_lookup_plugin(soap, soap_wsrm_id); if (!data) return soap->error = SOAP_PLUGIN_ERROR; MUTEX_LOCK(soap_wsrm_session_lock); seq = soap_wsrm_seq_lookup_ack(soap->header->wsrm__Sequence->Identifier); if (seq) { seq->lastnum = seq->recvnum; seq->refs++; MUTEX_UNLOCK(soap_wsrm_session_lock); if (seq->state == SOAP_WSRM_CREATED) soap_wsrm_close(soap, seq, soap_wsa_rand_uuid(soap)); seq->state = SOAP_WSRM_CLOSED; if (soap_wsrm_acknowledgement(soap, seq, NULL)) soap->error = SOAP_OK; soap_wsrm_seq_release(soap, seq); } else MUTEX_UNLOCK(soap_wsrm_session_lock); } return SOAP_OK; } /******************************************************************************\ * * Server-side SOAP Fault * \******************************************************************************/ #ifdef __cplusplus extern "C" { #endif /** @fn int soap_wsrm_fault_subcode(struct soap *soap, int flag, const char *faultsubcode, const char *faultstring, const char *faultdetail) @brief Sets sender/receiver SOAP Fault (sub)code for server faults (can be user defined faults). When called before soap_wsrm_check() in the server operation, terminates the current sequence. Otherwise, the sequence is not terminated. In either case the fault is returned to sender (client) or to the FaultTo server when the WS-Addressing FaultTo header was set by the sender. @param soap context @param[in] flag 0=receiver, 1=sender @param[in] faultsubcode sub code string @param[in] faultstring fault string @param[in] faultdetail detail string @return SOAP_FAULT */ int soap_wsrm_fault_subcode(struct soap *soap, int flag, const char *faultsubcode, const char *faultstring, const char *faultdetail) { DBGFUN2("soap_wsrm_fault_subcode", "code=%s", faultsubcode ? faultsubcode : "(null)", "string=%s", faultstring ? faultstring : "(null)"); soap_wsrm_reply_num(soap, 0); if (soap->header && soap->header->wsrm__Sequence && soap->header->wsrm__Sequence->Identifier) { char *id = soap->header->wsrm__Sequence->Identifier; int err = soap_wsa_fault_subcode(soap, flag, faultsubcode, faultstring, faultdetail); soap_faultdetail(soap); if (soap->version == 2) { soap->fault->SOAP_ENV__Detail->__type = SOAP_TYPE__wsrm__Identifier; soap->fault->SOAP_ENV__Detail->fault = (void*)id; } else { soap->fault->detail->__type = SOAP_TYPE__wsrm__Identifier; soap->fault->detail->fault = (void*)id; } return err; } return soap_wsa_fault_subcode(soap, flag, faultsubcode, faultstring, faultdetail); } /** @fn int soap_wsrm_sender_fault_subcode(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail) @brief Sets sender SOAP Fault (sub)code for server faults (can be user defined faults). When called before soap_wsrm_check() in the server operation, terminates the current sequence. Otherwise, the sequence is not terminated. In either case the fault is returned to sender (client) or to the FaultTo server when the WS-Addressing FaultTo header was set by the sender. @param soap context @param[in] faultsubcode sub code string @param[in] faultstring fault string @param[in] faultdetail detail string @return SOAP_FAULT */ int soap_wsrm_sender_fault_subcode(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail) { return soap_wsrm_fault_subcode(soap, 1, faultsubcode, faultstring, faultdetail); } /** @fn int soap_wsrm_receiver_fault_subcode(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail) @brief Sets receiver SOAP Fault (sub)code for server faults (can be user defined faults). When called before soap_wsrm_check() in the server operation, terminates the current sequence. Otherwise, the sequence is not terminated. In either case the fault is returned to sender (client) or to the FaultTo server when the WS-Addressing FaultTo header was set by the sender. @param soap context @param[in] faultsubcode sub code string @param[in] faultstring fault string @param[in] faultdetail detail string @return SOAP_FAULT */ int soap_wsrm_receiver_fault_subcode(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail) { return soap_wsrm_fault_subcode(soap, 0, faultsubcode, faultstring, faultdetail); } /** @fn int soap_wsrm_sender_fault(struct soap *soap, const char *faultstring, const char *faultdetail) @brief Sets sender SOAP Fault for server faults (can be user defined faults). When called before soap_wsrm_check() in the server operation, terminates the current sequence. Otherwise, the sequence is not terminated. In either case the fault is returned to sender (client) or to the FaultTo server when the WS-Addressing FaultTo header was set by the sender. @param soap context @param[in] faultstring fault string @param[in] faultdetail detail string @return SOAP_FAULT */ int soap_wsrm_sender_fault(struct soap *soap, const char *faultstring, const char *faultdetail) { return soap_wsrm_fault_subcode(soap, 1, NULL, faultstring, faultdetail); } /** @fn int soap_wsrm_receiver_fault(struct soap *soap, const char *faultstring, const char *faultdetail) @brief Sets receiver SOAP Fault for server faults (can be user defined faults). When called before soap_wsrm_check() in the server operation, terminates the current sequence. Otherwise, the sequence is not terminated. In either case the fault is returned to sender (client) or to the FaultTo server when the WS-Addressing FaultTo header was set by the sender. @param soap context @param[in] faultstring fault string @param[in] faultdetail detail string @return SOAP_FAULT */ int soap_wsrm_receiver_fault(struct soap *soap, const char *faultstring, const char *faultdetail) { return soap_wsrm_fault_subcode(soap, 0, NULL, faultstring, faultdetail); } /******************************************************************************\ * * WS-RM Faults * \******************************************************************************/ /** @fn int soap_wsrm_check_fault(struct soap *soap, enum wsrm__FaultCodes *fault, const char **info) @brief Checks the presence of a WS-RM fault at the client side (or in the FaultTo destination service) when a response is received. @param soap context @param[out] fault code @param[out] info string pointer related to the fault (or NULL) @return SOAP_OK (no fault or not a WS-RM fault) or error when not WS-RM fault */ int soap_wsrm_check_fault(struct soap *soap, enum wsrm__FaultCodes *fault, const char **info) { if (soap->error && soap->fault && soap->fault->SOAP_ENV__Code) { const char *code = soap_check_faultsubcode(soap); if (info) *info = soap_check_faultdetail(soap); if (code) return soap_s2wsrm__FaultCodes(soap, code, fault); } return SOAP_OK; } /** @fn int soap_wsrm_error(struct soap *soap, struct soap_wsrm_sequence *seq, enum wsrm__FaultCodes fault) @brief Sets SOAP Fault (sub)code for server WS-RM fault response. Terminates the sequence. @param soap context @param[in] seq pointer to sequence to terminate or NULL @param[in] fault is one of enum wsrm__FaultCodes enumeration values @return SOAP_FAULT */ int soap_wsrm_error(struct soap *soap, struct soap_wsrm_sequence *seq, enum wsrm__FaultCodes fault) { struct soap_wsrm_data *data; const char *code = soap_wsrm__FaultCodes2s(soap, fault); const char *reason = NULL; DBGFUN1("soap_wsrm_error", "code=%s", code ? code : "(null)"); data = (struct soap_wsrm_data*)soap_lookup_plugin(soap, soap_wsrm_id); if (data) { data->state = SOAP_WSRM_OFF; /* disable caching */ soap_wsrm_seq_release(soap, data->seq); data->seq = NULL; } if (seq) { seq->fault = fault; seq->state = SOAP_WSRM_TERMINATED; } switch (fault) { case wsrm__SequenceTerminated: reason = "The Sequence has been terminated due to an unrecoverable error."; break; case wsrm__UnknownSequence: reason = "The value of the wsrm:Identifier is not a known Sequence identifier."; break; case wsrm__InvalidAcknowledgement: reason = "The SequenceAcknowledgement violates the cumulative Acknowledgement invariant."; break; case wsrm__MessageNumberRollover: reason = "The maximum value for wsrm:MessageNumber has been exceeded."; break; #ifdef SOAP_WSRM_2005 case wsrm__LastMessageNumberExceeded: reason = "The value for wsrm:MessageNumber exceeds the value of the MessageNumber accompanying a LastMessage element in this Sequence."; break; #endif case wsrm__CreateSequenceRefused: reason = "The Create Sequence request has been refused by the RM Destination."; break; #ifdef SOAP_WSRM_2007 case wsrm__SequenceClosed: reason = "The Sequence is closed and cannot accept new messages."; break; #endif case wsrm__WSRMRequired: reason = "The RM Destination requires the use of WSRM."; break; default: break; } soap_header(soap); if (soap->header) { soap_default_SOAP_ENV__Header(soap, soap->header); if (soap->version == 1) { soap_default_SOAP_ENV__Header(soap, soap->header); soap->header->wsrm__SequenceFault = (struct wsrm__SequenceFaultType*)soap_malloc(soap, sizeof(struct wsrm__SequenceFaultType)); if (!soap->header->wsrm__SequenceFault) return soap->error; soap_default_wsrm__SequenceFaultType(soap, soap->header->wsrm__SequenceFault); soap->header->wsrm__SequenceFault->FaultCode = fault; soap->header->wsrm__SequenceFault->Detail = (struct SOAP_ENV__Detail*)soap_malloc(soap, sizeof(struct SOAP_ENV__Detail)); if (soap->header->wsrm__SequenceFault->Detail) { soap_default_SOAP_ENV__Detail(soap, soap->header->wsrm__SequenceFault->Detail); soap->header->wsrm__SequenceFault->Detail->__any = (char*)reason; } } if (seq && !seq->handle) /* server side: need to relay error */ soap_wsa_add_ReplyTo(soap, seq->to); } return soap_wsa_sender_fault_subcode(soap, code, reason, NULL); } /******************************************************************************\ * * WS-RM State Dump * \******************************************************************************/ /** @fn void soap_wsrm_dump(struct soap *soap, FILE *fd) @brief Dumps the current sequences and details of the wsrm plugin for diagnotics purposes. @param soap context @param[in] fd file descriptor to send text to */ void soap_wsrm_dump(struct soap *soap, FILE *fd) { struct soap_wsrm_sequence *seq; struct soap_wsrm_data *data = (struct soap_wsrm_data*)soap_lookup_plugin(soap, soap_wsrm_id); if (!data) return; fprintf(fd, "\n**** %s PLUGIN STATE DUMP ****\n", SOAP_WSRM_ID); MUTEX_LOCK(soap_wsrm_session_lock); for (seq = soap_wsrm_session; seq; seq = seq->next) { struct soap_wsrm_range *r; switch (seq->state) { case SOAP_WSRM_UNKNOWN: fputs("UNKNOWN ", fd); break; case SOAP_WSRM_CREATED: fputs("OPEN ", fd); break; case SOAP_WSRM_CLOSED: fputs("CLOSED ", fd); break; case SOAP_WSRM_TERMINATED: fputs("TERMINATED ", fd); break; default: break; } fprintf(fd, "SEQUENCE %s\n", seq->acksid ? seq->acksid : ""); fprintf(fd, " ID = %s\n", seq->id ? seq->id : "(null)"); fprintf(fd, " TO = %s\n", seq->to ? seq->to : "(null)"); fprintf(fd, " ACKSTO%c = %s\n", seq->ackreq ? '?' : ' ', seq->acksto ? seq->acksto : "(null)"); if (seq->repto) fprintf(fd, " REPLYTO = %s\n", seq->repto); if (seq->channel != SOAP_WSRM_NOCHAN) fprintf(fd, " CHANNEL = %d\n", seq->channel); fprintf(fd, " UPDATED = %s\n", soap_dateTime2s(soap, seq->timestamp)); fprintf(fd, " EXPIRES%c = %s\n", seq->handle ? '!' : ' ', soap_dateTime2s(soap, seq->expires)); fprintf(fd, " BEHAVIOR = %s\n", soap_wsrm__IncompleteSequenceBehaviorType2s(soap, seq->behavior)); if (seq->id) { fprintf(fd, " MESSAGES SENT:\n"); if (seq->state == SOAP_WSRM_CLOSED || seq->state == SOAP_WSRM_TERMINATED) fprintf(fd, " LAST = " SOAP_ULONG_FORMAT "\n", seq->num); else fprintf(fd, " NUM = " SOAP_ULONG_FORMAT "\n", seq->num); if (seq->messages) { char sep = ' '; int nack = 0; struct soap_wsrm_message *p; #ifdef SOAP_WSRM_FAST_ALLOC ULONG64 i; #endif fprintf(fd, " ACKED ="); #ifdef SOAP_WSRM_FAST_ALLOC for (i = 0; i < seq->num; i++) { p = seq->messages[i]; if (!p || p->state == SOAP_WSRM_ACK) { fprintf(fd, "%c" SOAP_ULONG_FORMAT, sep, i + 1); sep = ','; } else if (p->state == SOAP_WSRM_NACK) nack = 1; } #else for (p = seq->messages; p; p = p->next) { if (p->state == SOAP_WSRM_ACK) { fprintf(fd, "%c" SOAP_ULONG_FORMAT, sep, p->num); sep = ','; } else if (p->state == SOAP_WSRM_NACK) nack = 1; } #endif fprintf(fd, "\n"); if (nack) { fprintf(fd, " NACKED ="); sep = ' '; #ifdef SOAP_WSRM_FAST_ALLOC for (i = 0; i < seq->num; i++) { p = seq->messages[i]; if (p && p->state == SOAP_WSRM_NACK) { fprintf(fd, "%c" SOAP_ULONG_FORMAT, sep, i + 1); sep = ','; } } #else for (p = seq->messages; p; p = p->next) { if (p->state == SOAP_WSRM_NACK) { fprintf(fd, "%c" SOAP_ULONG_FORMAT, sep, p->num); sep = ','; } } #endif fprintf(fd, "\n"); } } } if (seq->acksid) { char sep = ' '; fprintf(fd, " MESSAGES RECEIVED:\n"); if (seq->lastnum) fprintf(fd, " LAST = " SOAP_ULONG_FORMAT "\n", seq->lastnum); else fprintf(fd, " NUM = " SOAP_ULONG_FORMAT "\n", seq->recvnum); fprintf(fd, " RANGE ="); for (r = seq->ranges; r; r = r->next) { fprintf(fd, "%c" SOAP_ULONG_FORMAT ":" SOAP_ULONG_FORMAT, sep, r->lower, r->upper); sep = ','; } fprintf(fd, "\n"); } fprintf(fd, "END OF SEQUENCE\n"); } MUTEX_UNLOCK(soap_wsrm_session_lock); } /******************************************************************************\ * * Plugin registry functions * \******************************************************************************/ /** @fn int soap_wsrm(struct soap *soap, struct soap_plugin *p, void *arg) @brief Plugin registry function, used with soap_register_plugin. @param soap context @param[in,out] p plugin created in registry @param[in] arg optional argument passed from soap_register_plugin_arg @return SOAP_OK */ int soap_wsrm(struct soap *soap, struct soap_plugin *p, void *arg) { p->id = soap_wsrm_id; /* create local plugin data */ p->data = (void*)SOAP_MALLOC(soap, sizeof(struct soap_wsrm_data)); /* register the copy constructor */ p->fcopy = soap_wsrm_copy; /* register the destructor */ p->fdelete = soap_wsrm_delete; /* if OK then initialize */ if (p->data) { if (soap_wsrm_init(soap, (struct soap_wsrm_data*)p->data, arg)) { SOAP_FREE(soap, p->data); /* error: could not init */ return SOAP_EOM; /* return error */ } } return SOAP_OK; } /** @fn int soap_wsrm_init(struct soap *soap, struct soap_wsrm_data *data, void *arg) @brief Initializes plugin data. @param soap context @param[in,out] data plugin data @param[in] arg optional argument passed from soap_register_plugin_arg @return SOAP_OK */ static int soap_wsrm_init(struct soap *soap, struct soap_wsrm_data *data, void *arg) { if (arg || !*soap_wsrm_idname) { const char *s; if (arg) s = (char*)arg; else s = soap_wsa_rand_uuid(soap); MUTEX_LOCK(soap_wsrm_session_lock); soap_strcpy(soap_wsrm_idname, sizeof(soap_wsrm_idname), s); MUTEX_UNLOCK(soap_wsrm_session_lock); } data->state = SOAP_WSRM_OFF; /* disable caching */ data->seq = NULL; data->msg = NULL; data->fsend = soap->fsend; soap->fsend = soap_wsrm_send; data->fpreparefinalrecv = soap->fpreparefinalrecv; soap->fpreparefinalrecv = soap_wsrm_preparefinalrecv; data->fdisconnect = soap->fdisconnect; soap->fdisconnect = soap_wsrm_disconnect; return SOAP_OK; } /** @fn int soap_wsrm_copy(struct soap *soap, struct soap_plugin *p, struct soap_plugin *q) @brief Copy plugin data (private thread data). @param soap context @param[out] p plugin @param[in] q plugin @return SOAP_OK */ static int soap_wsrm_copy(struct soap *soap, struct soap_plugin *p, struct soap_plugin *q) { /* create local plugin data */ p->data = (void*)SOAP_MALLOC(soap, sizeof(struct soap_wsrm_data)); soap_memcpy((void*)p->data, sizeof(struct soap_wsrm_data), (const void*)q->data, sizeof(struct soap_wsrm_data)); ((struct soap_wsrm_data*)p->data)->state = SOAP_WSRM_OFF; ((struct soap_wsrm_data*)p->data)->seq = NULL; ((struct soap_wsrm_data*)p->data)->msg = NULL; return SOAP_OK; } /** @fn void soap_wsrm_delete(struct soap *soap, struct soap_plugin *p) @brief Deletes plugin data. @param soap context @param[in,out] p plugin @return SOAP_OK */ static void soap_wsrm_delete(struct soap *soap, struct soap_plugin *p) { if (p->data) SOAP_FREE(soap, p->data); } /******************************************************************************\ * * Callbacks registered by plugin * \******************************************************************************/ /** @fn int soap_wsrm_send(struct soap *soap, const char *buf, size_t len) @brief Internal callback function to override fsend(). When the wsrm plugin is enabled, saves the message to the current sequence that is created at the client side. Allows unacknowledged messages to be resend with soap_wsrm_resend(). @param soap context @param[in] buf message data @param[in] len message data length @return SOAP_OK or error code */ static int soap_wsrm_send(struct soap *soap, const char *buf, size_t len) { struct soap_wsrm_data *data = (struct soap_wsrm_data*)soap_lookup_plugin(soap, soap_wsrm_id); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_wsrm_send state=%d\n", data ? data->state : 0)); if (data && data->state == SOAP_WSRM_ON) if (soap_wsrm_msg_append(soap, data, buf, len)) return soap->error; return data->fsend(soap, buf, len); /* pass data on to next send callback */ } /** @fn int soap_wsrm_preparefinalrecv(struct soap *soap) @brief Internal callback function to override fpreparefinalrecv(). Takes acks returned by response to update the states of the sequences with acknowledgements. Acknowledged messages do not have to be resend and are purged from the sequence states. Also checks if at client-side response message was already received and otherwise records it in the state. @param soap context @return SOAP_OK or error code */ static int soap_wsrm_preparefinalrecv(struct soap *soap) { struct soap_wsrm_data *data = (struct soap_wsrm_data*)soap_lookup_plugin(soap, soap_wsrm_id); DBGFUN("soap_wsrm_preparefinalrecv"); #if 0 /* (optional) record service response message num for acks (client side) */ if (soap->header && soap->header->wsrm__Sequence) { struct soap_wsrm_sequence *seq; seq = soap_wsrm_seq_lookup_ack(soap->header->wsrm__Sequence->Identifier); if (seq) { if (soap_wsrm_num_lookup(soap, seq, soap->header->wsrm__Sequence->MessageNumber)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Response message already received\n")); return soap->error = SOAP_STOP; } if (seq->behavior == DiscardFollowingFirstGap && soap->header->wsrm__Sequence->MessageNumber != seq->recvnum + 1) return soap_wsrm_error(soap, seq, wsrm__SequenceClosed); /* close or term */ seq->recvnum = soap->header->wsrm__Sequence->MessageNumber; if (soap_wsrm_num_insert(soap, seq, seq->recvnum)) return soap->error; } } #endif if (soap->header && soap->header->wsrm__SequenceAcknowledgement) { int i; for (i = 0; i < soap->header->__sizeSequenceAcknowledgement; i++) { if (soap_wsrm_process_ack(soap, &soap->header->wsrm__SequenceAcknowledgement[i])) return soap->error; } } if (data->fpreparefinalrecv) return data->fpreparefinalrecv(soap); return SOAP_OK; } /** @fn int soap_wsrm_disconnect(struct soap *soap) @brief Internal callback function to override fdisconnect(). Turns caching off, sets the cached message to NACK, and resets the server-side handle, so sequence can be deallocated later. @param soap context @return SOAP_OK or error code */ static int soap_wsrm_disconnect(struct soap *soap) { struct soap_wsrm_data *data = (struct soap_wsrm_data*)soap_lookup_plugin(soap, soap_wsrm_id); DBGFUN("soap_wsrm_disconnect"); if (!data || (data->fdisconnect && data->fdisconnect(soap))) return soap->error; if (data->seq && data->seq->refs) data->seq->refs--; data->seq = NULL; if (data->msg) { if (data->msg->list) { data->state = SOAP_WSRM_OFF; /* disable caching */ data->msg = NULL; } } return SOAP_OK; } /******************************************************************************\ * * Process Acknowledgements * \******************************************************************************/ /** @fn int soap_wsrm_process_ack(struct soap *soap, struct _wsrm__SequenceAcknowledgement *ack) @brief Internal function to purge acknowledged messages as given by wsrm:SequenceAcknowledgement header. @param soap context @param[in] ack from the WS-RM SequenceAcknowledgement header. @return SOAP_OK or error code */ static int soap_wsrm_process_ack(struct soap *soap, struct _wsrm__SequenceAcknowledgement *ack) { struct soap_wsrm_sequence *seq; struct soap_wsrm_data *data = (struct soap_wsrm_data*)soap_lookup_plugin(soap, soap_wsrm_id); DBGFUN1("soap_wsrm_process_ack", "ack id=%s", ack->Identifier ? ack->Identifier : "none"); if (!data) return soap->error = SOAP_PLUGIN_ERROR; MUTEX_LOCK(soap_wsrm_session_lock); seq = soap_wsrm_seq_lookup_data(ack->Identifier); if (!seq) { /* unknown old sequence should be ignored */ MUTEX_UNLOCK(soap_wsrm_session_lock); return SOAP_OK; } /* if Final no new message allowed (resends OK) */ if (ack->Final) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Final\n")); /* sequence is closed, so soap_wsrm_request() fails anyway */ } /* process Nack */ if (ack->__sizeNack) { int i; for (i = 0; i < ack->__sizeNack; i++) { struct soap_wsrm_message *p; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Nack=" SOAP_ULONG_FORMAT "\n", ack->Nack[i])); if (ack->Nack[i] == 0 || ack->Nack[i] > seq->num) { soap_wsrm_error(soap, seq, wsrm__InvalidAcknowledgement); MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error; } #ifdef SOAP_WSRM_FAST_ALLOC if (seq->messages) { p = seq->messages[ack->Nack[i] - 1]; if (p) p->state = SOAP_WSRM_NACK; } #else for (p = seq->messages; p; p = p->next) { if (p->num == ack->Nack[i]) p->state = SOAP_WSRM_NACK; } #endif } } else if (!ack->None) /* else free acked messages, unless None */ { if (seq->messages) { int i; for (i = 0; i < ack->__sizeAcknowledgementRange; i++) { ULONG64 lo = ack->AcknowledgementRange[i].Lower; ULONG64 hi = ack->AcknowledgementRange[i].Upper; if (lo == 0 || hi > seq->num) { soap_wsrm_error(soap, seq, wsrm__InvalidAcknowledgement); MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error; } else { #ifdef SOAP_WSRM_FAST_ALLOC ULONG64 j; for (j = lo; j <= hi; j++) { struct soap_wsrm_message *p = seq->messages[j - 1]; if (p) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Ack=" SOAP_ULONG_FORMAT "\n", j)); soap_wsrm_msg_free(soap, p); free((void*)p); seq->messages[j - 1] = NULL; } } #else struct soap_wsrm_message *p, **q = &seq->messages; for (p = seq->messages; p && p->num <= hi; p = *q) { if (lo <= p->num) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Ack=" SOAP_ULONG_FORMAT "\n", p->num)); *q = p->next; soap_wsrm_msg_free(soap, p); free((void*)p); } else q = &p->next; } #endif } } #ifndef SOAP_WSRM_FAST_ALLOC if (!seq->messages) seq->messageslast = NULL; #endif } } MUTEX_UNLOCK(soap_wsrm_session_lock); return SOAP_OK; } /******************************************************************************\ * * Check and Add/Send Acknowledgements * \******************************************************************************/ /** @fn int soap_wsrm_chk_acks(struct soap *soap) @brief Internal function to check for AckRequested headers to update state. @param soap context @return SOAP_OK or error code */ static int soap_wsrm_chk_acks(struct soap *soap) { DBGFUN("soap_wsrm_chk_acks"); if (!soap->header) return SOAP_OK; if (soap->header->__sizeAckRequested) { int i; for (i = 0; i < soap->header->__sizeAckRequested; i++) { struct soap_wsrm_sequence *seq; MUTEX_LOCK(soap_wsrm_session_lock); seq = soap_wsrm_seq_lookup_ack(soap->header->wsrm__AckRequested[i].Identifier); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Ack requested for %s\n", soap->header->wsrm__AckRequested[i].Identifier)); if (seq) seq->ackreq = 1; MUTEX_UNLOCK(soap_wsrm_session_lock); } } return SOAP_OK; } /** @fn int soap_wsrm_add_acks(struct soap *soap, struct soap_wsrm_sequence *seq, ULONG64 nack, int all, int piggy) @brief Internal function to add SequenceAcknowledgement headers for AckRequested. When piggy==0 or internal AcksTo destination is set, sends acknowledgements to the AcksTo destination service or back to the source related to the seq. These sends can take time, which can be controlled with the soap context connect_timeout, send_timeout, recv_timeout settings. @param soap context @param[in] seq pointer to sequence @param[in] nack num of nack message, 0 to generate acks @param[in] all when true always include all acks @param[in] piggy when true add acks to message to be send @return SOAP_OK or error code */ static int soap_wsrm_add_acks(struct soap *soap, struct soap_wsrm_sequence *seq, ULONG64 nack, int all, int piggy) { int numack = 0; DBGFUN3("soap_wsrm_add_acks", "nack=%ld", (unsigned long)nack, "all=%d", all, "piggy=%d", piggy); soap_header(soap); if (!soap->header) return soap->error; soap->header->__sizeSequenceAcknowledgement = 0; soap->header->wsrm__SequenceAcknowledgement = NULL; soap->header->wsrm__SequenceFault = NULL; seq->timestamp = time(NULL); MUTEX_LOCK(soap_wsrm_session_lock); #ifdef SOAP_WSA_2005 /* Add WCF ChannelInstance */ if (seq->channel != SOAP_WSRM_NOCHAN) { if (!soap->header->chan__ChannelInstance) soap->header->chan__ChannelInstance = (struct chan__ChannelInstanceType*)soap_malloc(soap, sizeof(struct chan__ChannelInstanceType)); if (!soap->header->chan__ChannelInstance) return soap->error; soap->header->chan__ChannelInstance->__item = seq->channel; soap->header->chan__ChannelInstance->SOAP_WSA(IsReferenceParameter) = SOAP_WSA_(,IsReferenceParameter__true); } #endif if (piggy && seq->recvnum && seq->acksto && strcmp(seq->acksto, soap_wsa_anonymousURI) && strcmp(seq->acksto, soap_wsa_noneURI) && (!seq->to || strcmp(seq->acksto, seq->to))) piggy = 0; /* always add ack if nack or all or when we received a message and we can piggy back the acks */ if (nack || all || (piggy && seq->recvnum)) seq->ackreq = 1; /* add acks of other sequences with the same acksto address (WCF is not agreeable here) */ #ifdef WITH_WCF if (!piggy) #endif if (seq->acksto && strcmp(seq->acksto, soap_wsa_anonymousURI)) { struct soap_wsrm_sequence *q; for (q = soap_wsrm_session; q; q = q->next) { if (q != seq && q->acksto && q->ackreq && q->recvnum && !strcmp(q->acksto, seq->acksto)) numack++; } } if (seq->ackreq && seq->recvnum) numack++; if (numack) { struct soap_wsrm_sequence *q; int num = 0; struct _wsrm__SequenceAcknowledgement *ack; ack = (struct _wsrm__SequenceAcknowledgement*)soap_malloc(soap, numack * sizeof(struct _wsrm__SequenceAcknowledgement)); if (!ack) { MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error; } if (seq->recvnum) { if (soap_wsrm_set_ack(soap, nack, seq, ack)) { MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error; } num++; } #ifdef WITH_WCF if (!piggy) #endif for (q = soap_wsrm_session; q && num < numack; q = q->next) { if (q != seq && q->acksto && q->ackreq && q->recvnum && !strcmp(q->acksto, seq->acksto)) { if (soap_wsrm_set_ack(soap, 0, q, &ack[num])) { MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error; } q->ackreq = 0; num++; } } MUTEX_UNLOCK(soap_wsrm_session_lock); /* for each ack requested, send ack */ if (!piggy) { int retry; const char *acksto; struct soap *acksto_soap = soap_copy(soap); struct soap_wsrm_data *data = (struct soap_wsrm_data*)soap_lookup_plugin(soap, soap_wsrm_id); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Sending ack/nack for seq %s to %s\n", seq->id, seq->acksto)); if (!data) return soap->error = SOAP_PLUGIN_ERROR; acksto_soap->socket = SOAP_INVALID_SOCKET; if (!acksto_soap->connect_timeout) acksto_soap->connect_timeout = SOAP_WSRM_TIMEOUT; if (!acksto_soap->recv_timeout) acksto_soap->recv_timeout = SOAP_WSRM_TIMEOUT; if (!acksto_soap->send_timeout) acksto_soap->send_timeout = SOAP_WSRM_TIMEOUT; acksto_soap->header = NULL; soap_header(acksto_soap); soap_default_SOAP_ENV__Header(acksto_soap, acksto_soap->header); acksto_soap->header->__sizeSequenceAcknowledgement = num; acksto_soap->header->wsrm__SequenceAcknowledgement = ack; #ifdef SOAP_WSA_2005 /* Add WCF ChannelInstance */ acksto_soap->header->chan__ChannelInstance = soap->header->chan__ChannelInstance; #endif acksto = seq->acksto; if (!acksto || !strcmp(acksto, soap_wsa_anonymousURI)) acksto = seq->to; if (acksto && strcmp(acksto, soap_wsa_anonymousURI) && strcmp(acksto, soap_wsa_noneURI)) { soap_wsa_request(acksto_soap, NULL, acksto, SOAP_NAMESPACE_OF_wsrm"/SequenceAcknowledgement"); if (soap->header->wsa5__FaultTo && soap->header->wsa5__FaultTo->Address) soap_wsa_add_FaultTo(acksto_soap, soap->header->wsa5__FaultTo->Address); else soap_wsa_add_FaultTo(acksto_soap, soap_wsa_noneURI); data->state = SOAP_WSRM_OFF; /* disable caching */ /* send, retry when HTTP 307 at most 10 times */ retry = 10; while (soap_send___wsrm__SequenceAcknowledgement(acksto_soap, acksto, NULL) || soap_recv_empty_response(acksto_soap)) { if (acksto_soap->error != 307 || retry-- == 0) break; acksto = soap_strdup(acksto_soap, acksto_soap->endpoint); } soap->error = acksto_soap->error; soap->errnum = acksto_soap->errnum; } soap_end(acksto_soap); soap_free(acksto_soap); } else if (num) { soap->header->__sizeSequenceAcknowledgement = num; soap->header->wsrm__SequenceAcknowledgement = ack; soap->header->wsa5__Action = (char*)SOAP_NAMESPACE_OF_wsrm"/SequenceAcknowledgement"; } } else MUTEX_UNLOCK(soap_wsrm_session_lock); return SOAP_OK; } /** @fn int soap_wsrm_set_ack(struct soap *soap, ULONG64 nack, struct soap_wsrm_sequence *seq, struct _wsrm__SequenceAcknowledgement *ack) @brief Internal function called by soap_wsrm_add_acks() to populate the SequenceAcknowledgement header block. @param soap context @param[in] nack num of message to nack, 0 to pupulate ack with ranges from seq @param[in] seq pointer to sequence @param[out] ack pointer to SequenceAcknowledgement to populate @brief */ static int soap_wsrm_set_ack(struct soap *soap, ULONG64 nack, struct soap_wsrm_sequence *seq, struct _wsrm__SequenceAcknowledgement *ack) { DBGFUN("soap_wsrm_set_ack"); soap_default__wsrm__SequenceAcknowledgement(soap, ack); ack->Identifier = soap_strdup(soap, seq->acksid); if (nack) { ack->__sizeNack = 1; ack->Nack = (ULONG64*)soap_malloc(soap, sizeof(ULONG64)); if (!ack->Nack) return soap->error; *ack->Nack = nack; } else { ack->__sizeAcknowledgementRange = soap_wsrm_num_size(seq); if (ack->__sizeAcknowledgementRange == 0) { ack->AcknowledgementRange = NULL; #ifdef SOAP_WSRM_2007 ack->None = (struct _wsrm__SequenceAcknowledgement_None*)soap_malloc(soap, sizeof(struct _wsrm__SequenceAcknowledgement_None)); if (!ack->None) return soap->error; soap_default__wsrm__SequenceAcknowledgement_None(soap, ack->None); #endif } else { struct soap_wsrm_range *p; struct _wsrm__SequenceAcknowledgement_AcknowledgementRange *q; ack->AcknowledgementRange = (struct _wsrm__SequenceAcknowledgement_AcknowledgementRange*)soap_malloc(soap, ack->__sizeAcknowledgementRange * sizeof(struct _wsrm__SequenceAcknowledgement_AcknowledgementRange)); if (!ack->AcknowledgementRange) return soap->error; soap_default__wsrm__SequenceAcknowledgement_AcknowledgementRange(soap, ack->AcknowledgementRange); for (p = seq->ranges, q = ack->AcknowledgementRange; p; p = p->next, q++) { q->Lower = p->lower; q->Upper = p->upper; } } #ifdef SOAP_WSRM_2007 /* if terminated, set Final */ if (seq->state == SOAP_WSRM_TERMINATED) { ack->Final = (struct _wsrm__SequenceAcknowledgement_Final*)soap_malloc(soap, sizeof(struct _wsrm__SequenceAcknowledgement_Final)); if (!ack->Final) return soap->error; soap_default__wsrm__SequenceAcknowledgement_Final(soap, ack->Final); } #endif } ack->netrm__BufferRemaining = NULL; #ifdef WITH_WCF #if 0 /* simulated WCF netrm BufferRemaining */ if ((ack->netrm__BufferRemaining = (int*)soap_malloc(soap, sizeof(int))) != NULL) *ack->netrm__BufferRemaining = 8; /* should be set as desired */ #endif #endif return SOAP_OK; } #if 0 /** @fn int soap_wsrm_post(struct soap *soap, const char *endpoint, const char *host, int port, const char *path, const char *action, size_t count) @brief Internal callback overrides the HTTP post operations to send an HTTP OK response header in place. @param soap context @param endpoint (not used) @param host (not used) @param port (not used) @param path (not used) @param action (HTTP action not used) @param count message length (if non-chunked) */ static int soap_wsrm_post(struct soap *soap, const char *endpoint, const char *host, int port, const char *path, const char *action, size_t count) { return soap->fresponse(soap, SOAP_OK, count); } #endif /******************************************************************************\ * * WS-RM Resend * \******************************************************************************/ /** @fn int soap_wsrm_resend_seq(struct soap *soap, struct soap_wsrm_sequence *seq, int all, ULONG64 lower, ULONG64 upper) @brief Internal function to resend unacknowledged messages of a sequence given a range of message numbers. Used by soap_wsrm_resend(). @param soap context @param seq sequence handle set by soap_wsrm_create() or soap_wsrm_create_offer() @param[in] all 1= resend all unacknowledged messages (not just the nacked messages) @param[in] lower resend message range lower bound (0 for lowest) @param[in] upper resend message range upper bound (or 0 for infinite) @return SOAP_OK or error code (can be ignored to continue sequence) */ static int soap_wsrm_resend_seq(struct soap *soap, struct soap_wsrm_sequence *seq, int all, ULONG64 lower, ULONG64 upper) { #ifdef SOAP_WSRM_FAST_ALLOC ULONG64 i; struct soap_wsrm_data *data = (struct soap_wsrm_data*)soap_lookup_plugin(soap, soap_wsrm_id); DBGFUN2("soap_wsrm_resend_seq", "lower=" SOAP_ULONG_FORMAT, lower, "upper=" SOAP_ULONG_FORMAT, upper); if (!data) return soap->error = SOAP_PLUGIN_ERROR; if (!seq->to || !seq->num || !seq->messages || seq->state == SOAP_WSRM_TERMINATED) return SOAP_OK; data->state = SOAP_WSRM_OFF; /* disable caching */ if (upper == 0) upper = seq->num; if (lower == 0) lower = 1; for (i = lower; i <= upper; i++) { struct soap_wsrm_message *p = seq->messages[i - 1]; if (p && ((all && p->state != SOAP_WSRM_ACK) || p->state == SOAP_WSRM_NACK) && p->list) /* not acked */ { struct soap_wsrm_content *q; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resending message " SOAP_ULONG_FORMAT "\n", i)); soap->omode |= SOAP_ENC_XML; /* disables HTTP */ if (soap_connect(soap, seq->to, NULL)) return soap->error; DBGLOG(SENT, SOAP_MESSAGE(fdebug, "\n==== BEGIN RESEND ====\n")); for (q = p->list; q; q = q->next) { if (q->buf) { DBGMSG(SENT, q->buf, q->len); if (data->fsend(soap, q->buf, q->len)) return soap->error; } } if (soap_end_send(soap)) return soap_closesock(soap); DBGLOG(SENT, SOAP_MESSAGE(fdebug, "\n==== END RESEND ====\n")); soap->omode &= ~SOAP_ENC_XML; /* reenables HTTP */ if (!soap_begin_recv(soap)) soap_ignore_element(soap); /* read content but ignore */ else if (soap->error != SOAP_NO_DATA && soap->error != 202) return soap_closesock(soap); soap_end_recv(soap); soap_closesock(soap); } } #else struct soap_wsrm_message *p; struct soap_wsrm_data *data = (struct soap_wsrm_data*)soap_lookup_plugin(soap, soap_wsrm_id); DBGFUN2("soap_wsrm_resend_seq", "lower=" SOAP_ULONG_FORMAT, lower, "upper=" SOAP_ULONG_FORMAT, upper); if (!data) return soap->error = SOAP_PLUGIN_ERROR; if (!seq->to || seq->state == SOAP_WSRM_TERMINATED) return SOAP_OK; data->state = SOAP_WSRM_OFF; /* disable caching */ for (p = seq->messages; p; p = p->next) { if (p->num >= lower && (upper == 0 || p->num <= upper)) { if (((all && p->state != SOAP_WSRM_ACK) || p->state == SOAP_WSRM_NACK) && p->list) /* not acked */ { struct soap_wsrm_content *q; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resending message " SOAP_ULONG_FORMAT "\n", p->num)); soap->omode |= SOAP_ENC_XML; /* disables HTTP */ if (soap_connect(soap, seq->to, NULL)) return soap->error; DBGLOG(SENT, SOAP_MESSAGE(fdebug, "\n==== BEGIN RESEND ====\n")); for (q = p->list; q; q = q->next) { DBGMSG(SENT, q->buf, q->len); if (data->fsend(soap, q->buf, q->len)) return soap->error; } if (soap_end_send(soap)) return soap_closesock(soap); DBGLOG(SENT, SOAP_MESSAGE(fdebug, "\n==== END RESEND ====\n")); soap->omode &= ~SOAP_ENC_XML; /* reenables HTTP */ if (!soap_begin_recv(soap)) soap_ignore_element(soap); /* read content but ignore */ else if (soap->error != SOAP_NO_DATA && soap->error != 202) return soap_closesock(soap); soap_end_recv(soap); soap_closesock(soap); } } } #endif return SOAP_OK; } /******************************************************************************\ * * Sequences * \******************************************************************************/ /** @fn const char *soap_wsrm_seq_newid(struct soap *soap) @brief Internal function to generate a new sequence identifier. @param soap context @return sequence identifier string */ static const char * soap_wsrm_seq_newid(struct soap *soap) { size_t l = strlen(soap_wsrm_idname); char *id = (char*)malloc(l + 9); if (!id) { soap->error = SOAP_EOM; return NULL; } (SOAP_SNPRINTF(id, l + 9, l + 8), "%s%8.8x", soap_wsrm_idname, soap_wsrm_idnum++); return id; } /** @fn struct soap_wsrm_sequence *soap_wsrm_seq_lookup_id(struct soap *soap, const char *id) @brief Function to look up sequence given its id. @param soap context @param[in] id identifier string @return sequence handle, must be released with @ref soap_wsrm_seq_release when no longer used */ struct soap_wsrm_sequence * soap_wsrm_seq_lookup_id(struct soap *soap, const char *id) { struct soap_wsrm_data *data = (struct soap_wsrm_data*)soap_lookup_plugin(soap, soap_wsrm_id); struct soap_wsrm_sequence *seq = NULL; if (data) { MUTEX_LOCK(soap_wsrm_session_lock); seq = soap_wsrm_seq_lookup_data(id); if (seq) seq->refs++; MUTEX_UNLOCK(soap_wsrm_session_lock); } return seq; } /** @fn void soap_wsrm_seq_insert_data(struct soap_wsrm_sequence *seq) @brief Internal function to insert seq id in hash table for fast lookup. @param[in] seq sequence */ static void soap_wsrm_seq_insert_data(struct soap_wsrm_sequence *seq) { (void)seq; #ifdef SOAP_WSRM_FAST_LOOKUP if (seq->id) { struct soap_wsrm_hash_id *p; size_t i, h = soap_hash(seq->id); for (p = soap_wsrm_hash_id[h]; p; p = p->next) { for (i = 0; i < SOAP_WSRM_IDHASH_BLK; i++) { if (!p->seq[i]) { p->seq[i] = seq; return; } } } p = soap_wsrm_hash_id[h]; soap_wsrm_hash_id[h] = (struct soap_wsrm_hash_id*)malloc(sizeof(struct soap_wsrm_hash_id)); soap_wsrm_hash_id[h]->next = p; soap_wsrm_hash_id[h]->seq[0] = seq; for (i = 1; i < SOAP_WSRM_IDHASH_BLK; i++) soap_wsrm_hash_id[h]->seq[i] = NULL; } #endif } /** @fn void soap_wsrm_seq_delete_data(struct soap_wsrm_sequence *seq) @brief Internal function to delete seq id from hash table. @param[in] seq sequence */ static void soap_wsrm_seq_delete_data(struct soap_wsrm_sequence *seq) { (void)seq; #ifdef SOAP_WSRM_FAST_LOOKUP if (seq && seq->id) { struct soap_wsrm_hash_id *p; size_t i, h = soap_hash(seq->id); for (p = soap_wsrm_hash_id[h]; p; p = p->next) { for (i = 0; i < SOAP_WSRM_IDHASH_BLK; i++) { if (seq == p->seq[i]) { p->seq[i] = NULL; return; } } } } else { struct soap_wsrm_hash_id *p, *q; size_t h; for (h = 0; h < SOAP_IDHASH; h++) { for (p = soap_wsrm_hash_id[h]; p; p = q) { q = p->next; free((void*)p); } } } #endif } /** @fn struct soap_wsrm_sequence *soap_wsrm_seq_lookup_data(const char *id) @brief Internal function to look up sequence given its id. @param[in] id identifier string @return sequence or NULL */ static struct soap_wsrm_sequence * soap_wsrm_seq_lookup_data(const char *id) { #ifdef SOAP_WSRM_FAST_LOOKUP if (id) { struct soap_wsrm_hash_id *p; size_t i, h = soap_hash(id); for (p = soap_wsrm_hash_id[h]; p; p = p->next) { for (i = 0; i < SOAP_WSRM_IDHASH_BLK; i++) { if (p->seq[i] && !strcmp(p->seq[i]->id, id)) return p->seq[i]; } } } #else if (id) { struct soap_wsrm_sequence *p; for (p = soap_wsrm_session; p; p = p->next) if (p->id && !strcmp(p->id, id)) return p; } #endif return NULL; } /** @fn struct soap_wsrm_sequence *soap_wsrm_seq_lookup(struct soap *soap, const char *id) @brief Function to look up sequence given its id. @param soap context @param[in] id identifier string @return sequence handle, must be released with @ref soap_wsrm_seq_release when no longer used */ struct soap_wsrm_sequence * soap_wsrm_seq_lookup(struct soap *soap, const char *id) { struct soap_wsrm_sequence *seq = NULL; (void)soap; MUTEX_LOCK(soap_wsrm_session_lock); seq = soap_wsrm_seq_lookup_ack(id); if (seq) seq->refs++; MUTEX_UNLOCK(soap_wsrm_session_lock); return seq; } /** @fn void soap_wsrm_seq_insert_ack(struct soap_wsrm_sequence *seq) @brief Internal function to insert acksid for fast lookup. @param[in] seq sequence */ static void soap_wsrm_seq_insert_ack(struct soap_wsrm_sequence *seq) { (void)seq; #ifdef SOAP_WSRM_FAST_LOOKUP if (seq->acksid) { struct soap_wsrm_hash_id *p; size_t i, h = soap_hash(seq->acksid); for (p = soap_wsrm_hash_acksid[h]; p; p = p->next) { for (i = 0; i < SOAP_WSRM_IDHASH_BLK; i++) { if (!p->seq[i]) { p->seq[i] = seq; return; } } } p = soap_wsrm_hash_acksid[h]; soap_wsrm_hash_acksid[h] = (struct soap_wsrm_hash_id*)malloc(sizeof(struct soap_wsrm_hash_id)); soap_wsrm_hash_acksid[h]->next = p; soap_wsrm_hash_acksid[h]->seq[0] = seq; for (i = 1; i < SOAP_WSRM_IDHASH_BLK; i++) soap_wsrm_hash_acksid[h]->seq[i] = NULL; } #endif } /** @fn void soap_wsrm_seq_delete_ack(struct soap_wsrm_sequence *seq) @brief Internal function to delete acksid for fast lookup. @param[in] seq sequence */ static void soap_wsrm_seq_delete_ack(struct soap_wsrm_sequence *seq) { (void)seq; #ifdef SOAP_WSRM_FAST_LOOKUP if (seq && seq->acksid) { struct soap_wsrm_hash_id *p; size_t i, h = soap_hash(seq->acksid); for (p = soap_wsrm_hash_acksid[h]; p; p = p->next) { for (i = 0; i < SOAP_WSRM_IDHASH_BLK; i++) { if (seq == p->seq[i]) { p->seq[i] = NULL; return; } } } } else { struct soap_wsrm_hash_id *p, *q; size_t h; for (h = 0; h < SOAP_IDHASH; h++) { for (p = soap_wsrm_hash_acksid[h]; p; p = q) { q = p->next; free((void*)p); } } } #endif } /** @fn struct soap_wsrm_sequence *soap_wsrm_seq_lookup_ack(const char *id) @brief Internal function to look up sequence given its acksid. @param[in] id identifier string @return sequence or NULL */ static struct soap_wsrm_sequence * soap_wsrm_seq_lookup_ack(const char *id) { #ifdef SOAP_WSRM_FAST_LOOKUP if (id) { struct soap_wsrm_hash_id *p; size_t i, h = soap_hash(id); for (p = soap_wsrm_hash_acksid[h]; p; p = p->next) { for (i = 0; i < SOAP_WSRM_IDHASH_BLK; i++) { if (p->seq[i] && !strcmp(p->seq[i]->acksid, id)) return p->seq[i]; } } } #else if (id) { struct soap_wsrm_sequence *p; for (p = soap_wsrm_session; p; p = p->next) if (p->acksid && !strcmp(p->acksid, id)) return p; } #endif return NULL; } /** @fn struct soap_wsrm_sequence *soap_wsrm_seq_insert(struct soap *soap) @brief Internal function to create a new local sequence state. @param soap context @return sequence or NULL */ static struct soap_wsrm_sequence * soap_wsrm_seq_insert(struct soap *soap) { struct soap_wsrm_sequence *seq; seq = (struct soap_wsrm_sequence*)malloc(sizeof(struct soap_wsrm_sequence)); if (!seq) { soap->error = SOAP_EOM; return NULL; } seq->handle = 0; seq->refs = 0; seq->id = NULL; seq->acksid = NULL; seq->to = NULL; seq->repto = NULL; seq->acksto = NULL; seq->timestamp = time(NULL); seq->expires = seq->timestamp + SOAP_WSRM_MAX_SEC_TO_EXPIRE; seq->behavior = NoDiscard; seq->num = 0; seq->recvnum = 0; seq->lastnum = 0; seq->fault = (enum wsrm__FaultCodes)(-1); seq->state = SOAP_WSRM_NONE; seq->retry = 0; seq->messages = NULL; #ifndef SOAP_WSRM_FAST_ALLOC seq->messageslast = NULL; #endif seq->ranges = NULL; seq->next = soap_wsrm_session; seq->channel = SOAP_WSRM_NOCHAN; soap_wsrm_session = seq; return seq; } /** @fn int soap_wsrm_msg_append(struct soap *soap, struct soap_wsrm_data *data, const char *buf, size_t len) @brief Internal function used by soap_wsrm_send() to append message data to the current message being transmitted in the current sequence. @param soap context @param data plugin @param[in] buf message data @param[in] len message data length @return SOAP_OK or error code */ static int soap_wsrm_msg_append(struct soap *soap, struct soap_wsrm_data *data, const char *buf, size_t len) { struct soap_wsrm_content *p; DBGFUN1("soap_wsrm_msg_append", "len=%lu", (unsigned long)len); if (!data->msg) return SOAP_OK; p = (struct soap_wsrm_content*)malloc(sizeof(struct soap_wsrm_content)); if (!p) return soap->error = SOAP_EOM; p->buf = (char*)malloc(len); if (!p->buf) { free((void*)p); return soap->error = SOAP_EOM; } p->len = len; soap_memcpy((void*)p->buf, len, (const void*)buf, len); p->next = NULL; if (!data->msg->list) data->msg->list = p; if (data->msg->last) data->msg->last->next = p; data->msg->last = p; return SOAP_OK; } /** @fn struct soap_wsrm_sequence *soap_wsrm_seq(struct soap *soap) @brief Assuming a SOAP header is received, gets the sequence associated with the message. @param soap context @return sequence handle, must be released with @ref soap_wsrm_seq_release when no longer used */ struct soap_wsrm_sequence * soap_wsrm_seq(struct soap *soap) { struct soap_wsrm_sequence *seq = NULL; DBGFUN("soap_wsrm_seq"); if (soap->header && soap->header->wsrm__Sequence) seq = soap_wsrm_seq_lookup(soap, soap->header->wsrm__Sequence->Identifier); return seq; } /** @fn void soap_wsrm_seq_release(struct soap *soap, struct soap_wsrm_sequence *seq) @brief Releases handle @param soap context @param seq sequence handle */ void soap_wsrm_seq_release(struct soap *soap, struct soap_wsrm_sequence *seq) { DBGFUN("soap_wsrm_seq_release"); MUTEX_LOCK(soap_wsrm_session_lock); if (seq && seq->refs) seq->refs--; MUTEX_UNLOCK(soap_wsrm_session_lock); } /** @fn int soap_wsrm_seq_created(struct soap *soap, struct soap_wsrm_sequence *seq) @brief Function to check if a sequence is created. @param soap context @param seq pointer to sequence @return 0 (not created) or 1 (created) */ int soap_wsrm_seq_created(struct soap *soap, struct soap_wsrm_sequence *seq) { DBGFUN("soap_wsrm_seq_created"); if (!seq || seq->state != SOAP_WSRM_CREATED) return 0; if (seq->expires && seq->expires < time(NULL)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Sequence %s has expired\n", seq->id ? seq->id : "(null)")); seq->state = SOAP_WSRM_TERMINATED; return 0; } return 1; } /** @fn int soap_wsrm_seq_valid(struct soap *soap, struct soap_wsrm_sequence *seq) @brief Function to check if a sequence is not valid, terminated, or needs to be terminated when expired. @param soap context @param seq pointer to sequence @return 0 (invalid) or 1 (valid) */ int soap_wsrm_seq_valid(struct soap *soap, struct soap_wsrm_sequence *seq) { DBGFUN("soap_wsrm_seq_valid"); if (!seq || (seq->state != SOAP_WSRM_CREATED && seq->state != SOAP_WSRM_CLOSED)) return 0; if (seq->expires && seq->expires < time(NULL)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Sequence %s has expired\n", seq->id ? seq->id : "(null)")); seq->state = SOAP_WSRM_TERMINATED; return 0; } return 1; } /******************************************************************************\ * * Messages and Message Number Ranges * \******************************************************************************/ /** @fn ULONG64 soap_wsrm_msgs(const soap_wsrm_sequence_handle seq) @brief Returns the number of complete messages received, or 0 when there is a gap. @param[in] seq pointer to sequence @return number of messages received or 0 */ ULONG64 soap_wsrm_msgs(const soap_wsrm_sequence_handle seq) { struct soap_wsrm_range *p; ULONG64 sum = 0; MUTEX_LOCK(soap_wsrm_session_lock); if (seq) for (p = seq->ranges; p; p = p->next) sum += p->upper - p->lower + 1; MUTEX_UNLOCK(soap_wsrm_session_lock); return sum; } /** @fn ULONG64 soap_wsrm_recvnum(const soap_wsrm_sequence_handle seq) @brief Returns the message number of last message received @param seq sequence handle set by soap_wsrm_create() or soap_wsrm_create_offer() @return message number of last message received */ ULONG64 soap_wsrm_recvnum(const soap_wsrm_sequence_handle seq) { return seq->recvnum; } /** @fn ULONG64 soap_wsrm_lastnum(const soap_wsrm_sequence_handle seq) @brief Returns the last message number upon sequence close or 0 @param seq sequence handle set by soap_wsrm_create() or soap_wsrm_create_offer() @return last message number or 0 when more messages should be received */ ULONG64 soap_wsrm_lastnum(const soap_wsrm_sequence_handle seq) { return seq->lastnum; } /** @fn int soap_wsrm_num_lookup(struct soap *soap, const struct soap_wsrm_sequence *seq, ULONG64 num) @brief Internal function to look up a message number in the sequence state. @param soap context @param[in] seq pointer to sequence @param[in] num message num to search @return 0 (not found) 1 (found) */ static int soap_wsrm_num_lookup(struct soap *soap, const struct soap_wsrm_sequence *seq, ULONG64 num) { struct soap_wsrm_range *p; DBGFUN1("soap_wsrm_num_lookup", "num=" SOAP_ULONG_FORMAT, num); if (seq) for (p = seq->ranges; p; p = p->next) if (p->lower <= num && num <= p->upper) return 1; return 0; } /** @fn int soap_wsrm_num_insert(struct soap *soap, struct soap_wsrm_sequence *seq, ULONG64 num) @brief Internal function to insert a message number in the sequence state. Updates the sequence ranges. @param soap context @param seq pointer to sequence @param[in] num @return SOAP_OK or error code (out of memory) */ static int soap_wsrm_num_insert(struct soap *soap, struct soap_wsrm_sequence *seq, ULONG64 num) { struct soap_wsrm_range *p, **q; DBGFUN1("soap_wsrm_num_insert", "num=" SOAP_ULONG_FORMAT, num); if (!seq) return SOAP_OK; /* assumes num is not in any range yet */ /* if match: increment upper bound and normalize by joining consecutive ranges */ for (p = seq->ranges; p; p = p->next) { if (num == p->upper + 1) { p->upper = num; if (p->next) { struct soap_wsrm_range *t = p->next; if (p->upper + 1 == t->lower) { p->upper = t->upper; p->next = t->next; free((void*)t); } } return SOAP_OK; } } /* if match: decrement first range's lower bound */ if (seq->ranges && num == seq->ranges->lower - 1) { seq->ranges->lower = num; return SOAP_OK; } /* no match: insert new singleton range */ p = (struct soap_wsrm_range*)malloc(sizeof(struct soap_wsrm_range)); if (!p) return soap->error = SOAP_EOM; p->lower = p->upper = num; p->next = NULL; for (q = &seq->ranges; *q; q = &(*q)->next) { if (num < (*q)->lower) { p->next = *q; break; } } *q = p; return SOAP_OK; } /** @fn int soap_wsrm_num_size(const struct soap_wsrm_sequence *seq) @brief Internal function returns the number of message ranges of the successfully received messages in a sequence state. @param seq pointer to sequence @return number of message ranges */ static int soap_wsrm_num_size(const struct soap_wsrm_sequence *seq) { int n = 0; if (seq) { struct soap_wsrm_range *p; for (p = seq->ranges; p; p = p->next) n++; } return n; } /** @fn void soap_wsrm_num_free(struct soap *soap, struct soap_wsrm_sequence *seq) @brief Internal function to deallocate all message number ranges from a sequence state. @param soap context @param seq pointer to sequence */ static void soap_wsrm_num_free(struct soap *soap, struct soap_wsrm_sequence *seq) { DBGFUN("soap_wsrm_num_free"); if (seq) { struct soap_wsrm_range *p, *q; for (p = seq->ranges; p; p = q) { q = p->next; free((void*)p); } } seq->ranges = NULL; } #ifdef SOAP_WSRM_FAST_ALLOC /** @fn unsigned short soap_wsrm_msb(ULONG64 n) @brief Returns MSB(n) @param n @return MSB (0..63) of n */ inline static unsigned short soap_wsrm_msb(register ULONG64 n) { ULONG64 k; unsigned short m = 0; if ((k = (n >> 32))) n = k, m += 32; if ((k = (n >> 16))) n = k, m += 16; if ((k = (n >> 8))) n = k, m += 8; if ((k = (n >> 4))) n = k, m += 4; if ((k = (n >> 2))) n = k, m += 2; if ((k = (n >> 1))) n = k, m += 1; return m; } #endif /** @fn struct soap_wsrm_message *soap_wsrm_msg_new(struct soap *soap, struct soap_wsrm_sequence *seq, ULONG64 num) @brief Internal function to allocate a new message in a sequence, updates message count seq->num @param soap context @param seq sequence pointer @param num message num (produces error when zero) @return pointer to message struct or NULL when error */ static struct soap_wsrm_message * soap_wsrm_msg_new(struct soap *soap, struct soap_wsrm_sequence *seq, ULONG64 num) { if (num == 0) { soap_wsrm_error(soap, seq, wsrm__MessageNumberRollover); return NULL; } #ifdef SOAP_WSRM_FAST_ALLOC if (!seq->messages || num > seq->num) { ULONG64 i; struct soap_wsrm_message **p = seq->messages; unsigned short m = soap_wsrm_msb(num); if (!p || seq->num == 0 || m > soap_wsrm_msb(seq->num)) { ULONG64 n = (1 << (m + 1)) - 1; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Enlarging messages to " SOAP_ULONG_FORMAT " for num = " SOAP_ULONG_FORMAT "\n", n, num)); p = (struct soap_wsrm_message**)malloc(n * sizeof(struct soap_wsrm_message*)); if (!p) { soap->error = SOAP_EOM; return NULL; } if (seq->messages) { soap_memcpy((void*)p, n * sizeof(struct soap_wsrm_message*), (const void*)seq->messages, seq->num * sizeof(struct soap_wsrm_message*)); free((void*)seq->messages); } seq->messages = p; } for (i = seq->num; i < num; i++) p[i] = NULL; seq->num = num; } if (!seq->messages[num - 1]) { struct soap_wsrm_message *p = (struct soap_wsrm_message*)malloc(sizeof(struct soap_wsrm_message)); if (!p) { soap->error = SOAP_EOM; return NULL; } p->state = SOAP_WSRM_INIT; p->list = p->last = NULL; seq->messages[num - 1] = p; } return seq->messages[num - 1]; #else struct soap_wsrm_message *p; p = (struct soap_wsrm_message*)malloc(sizeof(struct soap_wsrm_message)); if (!p) { soap->error = SOAP_EOM; return NULL; } p->next = NULL; p->num = num; p->state = SOAP_WSRM_INIT; p->list = p->last = NULL; if (seq->messageslast) seq->messageslast->next = p; else seq->messages = p; seq->messageslast = p; if (num > seq->num) seq->num = num; return p; #endif } /** @fn void soap_wsrm_msg_free(struct soap *soap, struct soap_wsrm_message *p) @brief Internal function to deallocate all cached message content from a sequence state. @param soap context @param p pointer to message (in a sequence state) */ static void soap_wsrm_msg_free(struct soap *soap, struct soap_wsrm_message *p) { struct soap_wsrm_content *q, *r; #ifndef SOAP_WSRM_FAST_ALLOC DBGFUN1("soap_wsrm_msg_free", "num=" SOAP_ULONG_FORMAT, p->num); #else (void)soap; #endif for (q = p->list; q; q = r) { r = q->next; if (q->buf) free((void*)q->buf); free((void*)q); } p->list = p->last = NULL; } #ifdef __cplusplus } #endif gsoap-2.8.28/gsoap/plugin/httpposttest.h0000644000175000017500000000440312653650150017635 0ustar ellertellert/* httpposttest.h gSOAP HTTP POST plugin example application. gSOAP XML Web services tools Copyright (C) 2000-2009, Robert van Engelen, Genivia, Inc., All Rights Reserved. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2004, Robert van Engelen, Genivia, Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- Compile: soapcpp2 -c httpposttest.h cc -o httpposttest httpposttest.c soapC.c soapServer.c httppost.c stdsoap2.c To support https and compression, compile with: cc -DWITH_OPENSSL -DWITH_GZIP -o httpposttest httpposttest.c soapC.c soapServer.c httppost.c stdsoap2.c -lssl -lcrypto -lz */ // Implements the REST calculator service #import "calcrest.h" gsoap-2.8.28/gsoap/plugin/mq.h0000644000175000017500000000653512653650150015475 0ustar ellertellert/* mq.h Inbound message queues gSOAP XML Web services tools Copyright (C) 2000-2013, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under ONE of the following licenses: GPL, or the gSOAP public license, or Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2013, Robert van Engelen, Genivia Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #ifndef MQ_H #define MQ_H #include "stdsoap2.h" #ifdef __cplusplus extern "C" { #endif #define SOAP_MQ_ID "MQ-0.9" extern const char soap_mq_id[]; /** @struct ms_data @brief Plugin data. */ struct soap_mq_data { char *buf; /** buffer to read via frecv() */ size_t len; /** buffer length */ size_t (*frecv)(struct soap*, char*, size_t); /** to save and use recv callback */ }; /** @struct soap_mq_msg @brief Queued inbound message (in linked list). */ struct soap_mq_msg { char *buf; /**< inbound HTTP body */ size_t len; /**< inbound HTTP body length */ struct soap soap; /**< saved context to read HTTP body */ struct soap_mq_msg *next; }; /** @struct soap_mq_queue @brief Message queue. */ struct soap_mq_queue { struct soap_mq_msg *head, *tail; }; int soap_mq(struct soap *soap, struct soap_plugin *plugin, void *arg); struct soap_mq_queue *soap_mq_queue(struct soap *); struct soap_mq_msg *soap_mq_get(struct soap *soap, struct soap_mq_queue *); struct soap_mq_msg *soap_mq_begin(struct soap_mq_queue *); struct soap_mq_msg *soap_mq_next(struct soap_mq_msg *); void soap_mq_del(struct soap_mq_queue *, struct soap_mq_msg *); #ifdef __cplusplus } #endif #endif gsoap-2.8.28/gsoap/plugin/wsseapi.c0000644000175000017500000070177412653650150016535 0ustar ellertellert/* wsseapi.c WS-Security plugin gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under one of the following licenses: GPL, the gSOAP public license, or Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ /** @mainpage - @ref wsse documents the wsse plugin for WS-Security 1.0 support. - @ref smdevp documents the smdevp signature/digest engine. - @ref mecevp documents the mecevp encryption engine. - @ref threads documents a portable threads and locking API. */ /** @page wsse The WS-Security plugin [TOC] @section wsse_5 Security Header The material in this section relates to the WS-Security specification section 5. To use the wsse plugin: -# Run wsdl2h -t typemap.dat on a WSDL of a service that requires WS-Security headers. The typemap.dat file is used to recognize and translate Security header blocks for XML signature and encryption. -# Run soapcpp2 on the header file produced by wsdl2h. -# (Re-)compile stdsoap2.c/pp, dom.c/pp, smdevp.c, mecevp.c, wsseapi.c and the generated source files with the -DWITH_DOM and -DWITH_OPENSSL compile flags set. The smdevp.c, mecevp.c, and wsseapi.c files are located in the 'plugin' directory. -# Use the wsse plugin API functions described below to add and verify Security headers, sign and verify messages, and to encrypt/decrypt messages. An example wsse client/server application can be found in gsoap/samples/wsse. The wsse engine is thread safe. However, if HTTPS is required please follow the instructions in Section @ref wsse_11 to ensure thread-safety of WS-Security with HTTPS. The wsse API is located in: - `gsoap/plugin/wsseapi.h` wsse API. - `gsoap/plugin/wsseapi.c` wsse API for C and C++. You will also need: - `gsoap/plugin/smdevp.c` compile and link this file (C and C++). - `gsoap/plugin/mecevp.c` compile and link this file (C and C++). - compile all sources with `-DWITH_OPENSSL -DWITH_DOM`. - if you have zlib installed, compile all sources also with `-DWITH_GZIP`. - link with `-lssl -lcrypto -lz -gsoapssl++` (or `-lgsoapssl` for C, or compile `stdsoap2.cpp` for C++ and `stdsoap2.c` for C). The gSOAP header file for soapcpp2 should import wsse.h (or the older 2002 version wsse2.h): @code #import "wsse.h" @endcode The wsdl2h tool adds the necessary imports to the generated header file if the WSDL declares the use of WS-Security. If not, you may have to add the import manually before running soapcpp2. The wsse API consists of a set of functions to populate and verify WS-Security headers and message body content. For more details, we refer to the following sections that correspond to the WS-Security specification sections: - Section 6 @ref wsse_6 - Section 7 @ref wsse_7 - Section 8 @ref wsse_8 - Section 9 @ref wsse_9 - Section 10 @ref wsse_10 - @ref wsse_11 - @ref wsse_12 - @ref wsse_13 - @ref wsse_wsc The basic API is introduced below. To add an empty Security header block to the SOAP header, use: @code soap_wsse_add_Security(soap); @endcode To delete a Security header, use: @code soap_wsse_delete_Security(soap); @endcode Adding an empty Security header block is not very useful. In the following, we present the higher-level functions of the wsse plugin to populate and verify Security header content. @note The soap context includes an actor value soap.actor that is populated and rendered as the SOAP-ENV:actor (SOAP 1.1) or SOAP-ENV:role (SOAP 1.2) attribute in XML within the generic SOAP Header. The attribute is optional, but should be used to target a recipient such as an intermediate node to process the SOAP header. In contrast, actor or role attributes within Security header blocks target specific recipients to process the Security header block. The gSOAP implementation does not automate this feature and application should set and check the actor/role attribute when necessary. In addition, the current implementation supports the inclusion of a single Security header block in the SOAP header. To populate the SOAP-ENV:actor or SOAP-ENV:role attribute within the Security header, use: @code soap_wsse_add_Security_actor(soap, "recipient"); @endcode To obtain the actor or role value (e.g. after receiving a message), use: @code _wsse__Security *security = soap_wsse_Security(soap); if (security) { ... = security->SOAP_ENV__actor; // SOAP 1.1 ... = security->SOAP_ENV__role; // SOAP 1.2 @endcode The SOAP-ENV:mustUnderstand attribute is automatically added and checked by the gSOAP engine. A gSOAP application compiled without Security support will reject Security headers. Security header blocks are attached to the soap context, which means that the information will be automatically kept to support multiple invocations. @section wsse_6 Security Tokens The material in this section relates to the WS-Security specification section 6. @subsection wsse_6_2 User Name Token To add a user name token to the Security header block, use: @code soap_wsse_add_UsernameTokenText(soap, "Id", "username", NULL); @endcode The `Id` value is optional. When non-NULL the user name token is included in the digital signature to protect its integrity. It is common for the wsse plugin functions to accept such `Id`s, which are serialized as wsu:Id identifiers for cross-referencing XML elements. The signature engine of the wsse plugin is designed to automatically sign all wsu:Id attributed elements to simplify the code you need to write to implement the signing process. To add a user name token with clear text password, use: @code soap_wsse_add_UsernameTokenText(soap, "Id", "username", "password"); @endcode It is strongly recommended to use `soap_wsse_add_UsernameTokenText` only in combination with HTTPS encrypted transmission or not at all. A better alternative is to use password digests. With password digest authentication, the digest value of a password (with message creation time and a random nonce) is compared on both sides, thus eliminating the need to exchange a password over the wire. To add a user name token with password digest, use: @code soap_wsse_add_UsernameTokenDigest(soap, "Id", "username", "password"); @endcode Although the password string is passed to this function, it is not rendered in XML or stored in a message log. It has been argued that this approach adopted by the WS-Security protocol is still vulnerable since the application retrieves the password in text form requiring a database to store passwords in clear text. However, a digest algorithm can be used to hash the passwords and store their digests instead, which eliminates the need to store clear-text passwords. Note that this is a common approach adopted by Unix for decades. By setting the `Id` value to a unique string, the user name token is also digitally signed by the signature engine further preventing tampering with its value. You must use `soap_wsse_add_UsernameTokenDigest` for each message exchange to refresh the password digest even when the user name and password are not changed. Otherwise, the receiver might flag the message as a replay attack. Clear-text passwords and password digests are verified with `soap_wsse_verify_Password`. To verify a password at the receiving side to authorize a request (e.g. within a Web service operation), use: @code int ns__myMethod(struct soap *soap, ...) { const char *username = soap_wsse_get_Username(soap); const char *password; if (!username) return soap->error; // no username: return FailedAuthentication (from soap_wsse_get_Username) password = ...; // lookup password of username if (soap_wsse_verify_Password(soap, password)) { int err = soap->error; soap_wsse_delete_Security(soap); // remove old security headers // if it is required to return signed faults, then add the following six lines here: if (soap_wsse_add_BinarySecurityTokenX509(soap, "X509Token", cert) || soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(soap, "#X509Token") || soap_wsse_sign_body(soap, SOAP_SMD_SIGN_RSA_SHA256, rsa_private_key, 0) { soap_wsse_delete_Security(soap); // remove security headers (failed construction) return soap->error; } return err; // password verification failed: return FailedAuthentication } ... // process request, then sign the response message: if (soap_wsse_add_BinarySecurityTokenX509(soap, "X509Token", cert) || soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(soap, "#X509Token") || soap_wsse_sign_body(soap, SOAP_SMD_SIGN_RSA_SHA256, rsa_private_key, 0) { soap_wsse_delete_Security(soap); // remove security headers (failed construction) return soap->error; } return SOAP_OK; } @endcode Note that the `soap_wsse_get_Username` functions sets the wsse:FailedAuthentication fault upon failure. It is common for the wsse plugin functions to return `SOAP_OK` or a wsse fault that should be passed to the sender by returning soap->error from service operations. The fault is displayed with the `soap_print_fault` function. To return signed faults back to the client, a signature is constructed as shown in the code snippet above. When the signature construction itself fails, we delete the partially constructed signature and return the fault to the client. Password digest authentication prevents message replay attacks. The wsse plugin keeps a database of password digests to thwart replay attacks. This is the only part in the plugin code that requires mutex provided by threads.h. Of course, this only works correctly if the server is persistent, such as a stand-alone service. Note that CGI-based services do not keep state. Machine clocks must be synchronized and clock skew should not exceed `SOAP_WSSE_CLKSKEW` at the server side. @subsection wsse_6_3 Binary Security Tokens X509 certificates are commonly included in Security header blocks as binary security tokens. A certificate is used to verify the digital signature of a digitally signed message using the public key embedded within the certificate. The certificate itself is signed by a certificate authority (CA) that vouches for the authenticity of the certificate, i.e. to prove the identify of the message originator. This verification process is important, because digital signatures are useless without verification: an attacker could simply replace the message, sign it, and replace the certificate. Certificates are automatically verified by the wsse plugin signature engine when received and accessed, which means that the certificates of the CAs must be made accessible to the wsse plugin as follows: @code soap->cafile = "cacerts.pem"; // use this soap->capath = "dir/to/certs"; // and/or point to CA certs soap->crlfile = "revoked.pem"; // use CRL (optional) @endcode The `soap_wsse_verify_X509` function checks the validity of a certificate. The check is automatically performed. The check is also performed when retrieving the certificate from a Security header block, either automatically by the wsse plugin's signature verification engine or manually as follows: @code X509 *cert = soap_wsse_get_BinarySecurityTokenX509(soap, "Id"); @endcode where `Id` is the identification string of the binary security token or NULL. The X509 certificate returned by this function should be freed with `X509_free` to deallocate the certificate data: @code if (cert) X509_free(cert); cert = NULL; @endcode The verification is an expensive process that will be optimized in future releases by caching the certificate chain. To attach a binary security token stored in a PEM file to a Security header block for transmission, use: @code soap_wsse_add_BinarySecurityTokenPEM(soap, NULL, "mycert.pem") @endcode A binary security token can be automatically signed by setting its `Id` attribute: @code soap_wsse_add_BinarySecurityTokenPEM(soap, "X509Token", "mycert.pem") @endcode Repeatedly loading a certificate from a PEM file is inefficient. To reuse a certificate loaded from a PEM file for multiple invocations, use: @code FILE *fd = fopen("mycert.pem", "r"); X509 *cert = PEM_read_X509(fd, NULL, NULL, NULL); fclose(fd); if (soap_wsse_add_BinarySecurityTokenX509(soap, "X509Token", cert)) ... // an error occurred @endcode Other types of binary security tokens can be added to the Security header block using: @code soap_wsse_add_BinarySecurityToken(soap, "Id", "valueType", data, datalen); @endcode @section wsse_6_4 XML Tokens The use and processing rules for XML tokens such as SAML assertions is specific to an application. The wsse plugin does not automate the use of XML tokens. The developer is encouraged to generate code for the SAML schema with wsdl2h and add the necessary assertions to the Security header block: @code typedef struct _wsse__Security { struct _wsu__Timestamp* wsu__Timestamp; struct _wsse__UsernameToken* UsernameToken; struct _wsse__BinarySecurityToken* BinarySecurityToken; struct _saml__Assertion* saml__Assertion; // added struct xenc__EncryptedKeyType* xenc__EncryptedKey; struct ds__SignatureType* ds__Signature; @char* SOAP_ENV__actor; @char* SOAP_ENV__role; } _wsse__Security; @endcode Alternatively, a DOM can be used to store and retrieve XML tokens: @code #import "dom.h" typedef struct _wsse__Security { struct _wsu__Timestamp* wsu__Timestamp; struct _wsse__UsernameToken* UsernameToken; struct _wsse__BinarySecurityToken* BinarySecurityToken; struct _saml__Assertion* saml__Assertion; // added struct xenc__EncryptedKeyType* xenc__EncryptedKey; struct ds__SignatureType* ds__Signature; int __size; xsd__anyType* any; @char* SOAP_ENV__actor; @char* SOAP_ENV__role; } _wsse__Security; @endcode @section wsse_7 Token References The material in this section relates to the WS-Security specification section 7. To use a certificate for signature verification, add a direct security token reference URI for the token to the KeyInfo, for example: @code soap_wsse_add_KeyInfo_SecurityTokenReferenceURI(soap, "URI", "valueType"); @endcode and: @code soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(soap, "URI"); @endcode For X509 certificates we use this to add a binary security token with the certificate and a reference to the local token: @code if (soap_wsse_add_BinarySecurityTokenX509(soap, "X509Token", cert) || soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(soap, "#X509Token")) ... // an error occurred @endcode This follows the recommended practice to place Security token references in the KeyInfo element of a Signature. The KeyInfo is used to verify the validity of a signature value. Key identifiers can be used as well: @code soap_wsse_add_KeyInfo_SecurityTokenReferenceKeyIdentifier(soap, "Id", "valueType", data, datalen); @endcode Embedded references are added with: @code soap_wsse_add_KeyInfo_SecurityTokenReferenceEmbedded(soap, "Id", "valueType"); @endcode Full support for embedded references requires coding to add tokens and assertions, as well as to consume embedded references at the receiving side. There is no automated mechanism to take the embedded references and process them accordingly. The use of key names is not recommended, but in case they are required they can be added with: @code soap_wsse_add_KeyInfo_KeyName(soap, "name"); @endcode @section wsse_8 Signatures The material in this section relates to the WS-Security specification section 8. The wsse plugin must be registered to sign and verify messages: @code soap_register_plugin(soap, soap_wsse); @endcode XML signatures are usually computed over normalized XML (to ensure the XML processors of intermediate nodes can accurately reproduce the XML). To this end, the exclusive canonical XML standard (exc-c14n) is required, which is set using the `SOAP_XML_CANONICAL` flag: @code struct soap *soap = soap_new1(SOAP_XML_CANONICAL); soap_register_plugin(soap, soap_wsse); @endcode If you prefer XML indentation, use: @code struct soap *soap = soap_new1(SOAP_XML_CANONICAL | SOAP_XML_INDENT); soap_register_plugin(soap, soap_wsse); @endcode Other flags to consider: - `SOAP_IO_CHUNK` for HTTP chunked content to stream messages. - `SOAP_ENC_GZIP` for HTTP compression (also enables HTTP chunking). Next, we decide which signature algorithm is appropriate to use: - HMAC-SHA uses a secret key (also known as a shared key in symmetric cryptography) to sign the SHA digest of the SignedInfo element. - DSA-SHA uses a DSA private key to sign the SHA digest of the SignedInfo element. - RSA-SHA uses a RSA private key to sign the SHA digest of the SignedInfo element. - ECDSA-SHA uses a Elliptic Curve DSA private key to sign the SHA digest of the SignedInfo element. HMAC-SHA is the simplest method, but relies on the fact that you have to make absolutely sure the key is kept secret on both the sending and receiving side. As long as the secret key is confidential, messages are securely signed. However, this is virtually impossible when exchanging messages with untrusted disparate parties. The advantage of HMAC-SHA is the speed by which messages are signed and verified. Algorithms HMAC SHA1, SHA256, and SHA512 are supported: - `SOAP_SMD_HMAC_SHA1` http://www.w3.org/2000/09/xmldsig#hmac-sha1 - `SOAP_SMD_HMAC_SHA224` http://www.w3.org/2001/04/xmldsig-more#hmac-sha224 - `SOAP_SMD_HMAC_SHA256` http://www.w3.org/2001/04/xmldsig-more#hmac-sha256 - `SOAP_SMD_HMAC_SHA384` http://www.w3.org/2001/04/xmldsig-more#hmac-sha384 - `SOAP_SMD_HMAC_SHA512` http://www.w3.org/2001/04/xmldsig-more#hmac-sha512 DSA-SHA and RSA-SHA rely on public key cryptography. In simplified terms, a message is signed using the (confidential!) private key. The public key is used to verify the signature. Since only the originating party could have used its private key to sign the message, the integrity of the message is guaranteed. Of course, we must trust the public key came from the originator (it is often included as an X509 certificate in the message). To this end, a trusted certificate authority should have signed the public key, thereby creating a X509 certificate that contains the public key and the identity of the message originator. The following DSA, RSA, and ECDSA algorithms are supported: - `SOAP_SMD_SIGN_DSA_SHA1` http://www.w3.org/2000/09/xmldsig#dsa-sha1 - `SOAP_SMD_SIGN_DSA_SHA256` http://www.w3.org/2000/09/xmldsig-more#dsa-sha256 - `SOAP_SMD_SIGN_RSA_SHA1` http://www.w3.org/2000/09/xmldsig#rsa-sha1 - `SOAP_SMD_SIGN_RSA_SHA224` http://www.w3.org/2001/04/xmldsig-more#rsa-sha224 - `SOAP_SMD_SIGN_RSA_SHA256` http://www.w3.org/2001/04/xmldsig-more#rsa-sha256 - `SOAP_SMD_SIGN_RSA_SHA384` http://www.w3.org/2001/04/xmldsig-more#rsa-sha384 - `SOAP_SMD_SIGN_RSA_SHA512` http://www.w3.org/2001/04/xmldsig-more#rsa-sha512 - `SOAP_SMD_SIGN_ECDSA_SHA1` http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha1 - `SOAP_SMD_SIGN_ECDSA_SHA224` http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha224 - `SOAP_SMD_SIGN_ECDSA_SHA256` http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha256 - `SOAP_SMD_SIGN_ECDSA_SHA384` http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha384 - `SOAP_SMD_SIGN_ECDSA_SHA512` http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha512 An optional callback function can be passed to the plugin that is responsible for providing a certificate or key to the wsse engine to verify a signed message. For example, when a security token is absent from an DSA-SHA or RSA-SHA signed message then the only mechanism to automatically verify the signature is to let the callback produce a certificate: @code soap_register_plugin_arg(soap, soap_wsse, security_token_handler); const void *security_token_handler(struct soap *soap, int *alg, const char *keyname, int *keylen) { // Note: 'keyname' argument is may be used with shared secret key // decryption where the keyname is from the ds:KeyInfo/KeyName content if (keyname) { ... lookup keyname ... const void *key = ...; *keylen = ...; *alg = ...; return key; } // Get the user name from UsernameToken in message const char *uid = soap_wsse_get_Username(soap); switch (*alg) { case SOAP_SMD_VRFY_DSA_SHA1: case SOAP_SMD_VRFY_DSA_SHA256: case SOAP_SMD_VRFY_RSA_SHA1: case SOAP_SMD_VRFY_RSA_SHA224: case SOAP_SMD_VRFY_RSA_SHA256: case SOAP_SMD_VRFY_RSA_SHA384: case SOAP_SMD_VRFY_RSA_SHA512: case SOAP_SMD_VRFY_ECDSA_SHA1: case SOAP_SMD_VRFY_ECDSA_SHA224: case SOAP_SMD_VRFY_ECDSA_SHA256: case SOAP_SMD_VRFY_ECDSA_SHA384: case SOAP_SMD_VRFY_ECDSA_SHA512: if (uid) { // Lookup uid to retrieve the X509 certificate to verify the signature const X509 *cert = ...; return (const void*)cert; } return NULL; // no certificate: fail case SOAP_SMD_HMAC_SHA224: case SOAP_SMD_HMAC_SHA256: case SOAP_SMD_HMAC_SHA384: case SOAP_SMD_HMAC_SHA512: if (uid) { // Lookup uid to retrieve the HMAC SHA key to verify the signature const void *key = ...; *alg = ...; *keylen = ...; return key; } return NULL; // no certificate: fail case SOAP_MEC_ENV_DEC_DES_CBC: case SOAP_MEC_ENV_DEC_AES128_CBC: case SOAP_MEC_ENV_DEC_AES192_CBC: case SOAP_MEC_ENV_DEC_AES256_CBC: case SOAP_MEC_ENV_DEC_AES512_CBC: // reserved for future use case SOAP_MEC_ENV_DEC_AES128_GCM: // GCM requires OpenSSL 1.0.2 or higher case SOAP_MEC_ENV_DEC_AES192_GCM: // GCM requires OpenSSL 1.0.2 or higher case SOAP_MEC_ENV_DEC_AES256_GCM: // GCM requires OpenSSL 1.0.2 or higher case SOAP_MEC_ENV_DEC_AES512_GCM: // GCM requires OpenSSL 1.0.2 or higher // return decryption private key associated with keyname case SOAP_MEC_DEC_DES_CBC: case SOAP_MEC_DEC_AES128_CBC: case SOAP_MEC_DEC_AES192_CBC: case SOAP_MEC_DEC_AES256_CBC: case SOAP_MEC_DEC_AES512_CBC: // reserved for future use case SOAP_MEC_DEC_AES128_GCM: // GCM requires OpenSSL 1.0.2 or higher case SOAP_MEC_DEC_AES192_GCM: // GCM requires OpenSSL 1.0.2 or higher case SOAP_MEC_DEC_AES256_GCM: // GCM requires OpenSSL 1.0.2 or higher` case SOAP_MEC_DEC_AES512_GCM: // GCM requires OpenSSL 1.0.2 or higher // *keylen = ... // return decryption shared secret key associated with keyname } return NULL; // fail } @endcode @subsection wsse_8_2a Signing Messages After the plugin is registered and a signature algorithm selected, the `soap_wsse_sign` function or the `soap_wsse_sign_body` function is used to initiate the signature engine to automatically sign outbound messages. The code to sign the SOAP Body of a message using HMAC-SHA1 is: @code static char hmac_key[16] = { 0xff, 0xee, 0xdd, 0xcc, 0xbb, 0xaa, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x00 }; struct soap *soap = soap_new1(SOAP_XML_CANONICAL | SOAP_XML_INDENT); soap_register_plugin(soap, soap_wsse); if (soap_wsse_sign_body(soap, SOAP_SMD_HMAC_SHA1, hmac_key, sizeof(hmac_key)) ... // an error occurred else if (soap_call_ns__myMethod(soap, ...)) ... // a transmission error occurred @endcode The `hmac_key` above is some secret key you generated for the sending side and receiving side (don't use the one shown here). Instead of SHA1 above, you can also use the more secure SHA224, SHA256, SHA384 and SHA512 hashes. As always, use `soap_print_fault` to display the error message. To sign the body of an outbound SOAP message using RSA-SHA (DSA-SHA is similar), we include the X509 certificate with the public key as a BinarySecurityToken in the header and a KeyInfo reference to the token to let receivers use the public key in the certificate to verify the authenticity of the message: @code FILE *fd; EVP_PKEY *rsa_private_key; X509 *cert; struct soap *soap = soap_new1(SOAP_XML_CANONICAL | SOAP_XML_INDENT); soap_register_plugin(soap, soap_wsse); fd = fopen("privkey.pem", "r"); rsa_private_key = PEM_read_PrivateKey(fd, NULL, NULL, "password"); fclose(fd); fd = fopen("cert.pem", "r"); X509 *cert = PEM_read_X509(fd, NULL, NULL, NULL); fclose(fd); if (soap_wsse_add_BinarySecurityTokenX509(soap, "X509Token", cert) || soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(soap, "#X509Token") || soap_wsse_sign_body(soap, SOAP_SMD_SIGN_RSA_SHA256, rsa_private_key, 0)) ... // an error occurred else if (soap_call_ns__myMethod(soap, ...)) ... // a transmission error occurred @endcode The private key and its certificate are often placed in the same file, see e.g. server.pem in the package. To summarize the signing process: -# Register the wsse plugin. -# Obtain an HMAC secret key or a DSA/RSA/ECDSA private key. -# For DSA or RSA, obtain the X509 certificate with the public key signed by a certificate authority. -# Add the X509 certificate as a BinarySecurityToken to the header. -# Add a KeyInfo BinarySecurityTokenReference. -# Invoke `soap_wsse_sign` or `soap_wsse_sign_body` to sign the message. -# Always check the function return values for errors. You don't want to produce and accept messages with an invalid Security headers. @subsection wsse_8_2b Signing Message Parts The `soap_wsse_sign_body` function signs the entire SOAP body. If it is desirable to sign individual parts of a message the `soap_wsse_sign` function should be used. All message parts with wsu:Id attributes are signed. These message parts should not be nested (nested elements will not be separately signed). By default, all and only those XML elements with wsu:Id attributes are signed. Therefore, the wsu:Id attribute values used in a message must be unique within the message. Although usually not required, the default signing rule can be overridden with the `soap_wsse_sign_only` function, see @ref wsse_8_3. For example, consider a transaction in which we only want to sign a contract in the SOAP Body. This allows us to modify the rest of the message or extract the contract in XML and pass it on with the signature. The gSOAP header file includes a myContract declaration: @code struct ns__myContract { @char* wsu__Id = "Contract"; char* name; char* title; char* terms; }; int ns__myMethod(struct ns__myContract agreement, bool* accepted); @endcode The default value of the wsu:Id is "Contract" so that we can instantiate the struct, automatically sign it, and send it as follows: @code struct ns__myContract contract; bool accept; soap_default_ns__myContract(soap, &contract); contract.name = ...; contract.title = ...; contract.terms = ...; if (soap_wsse_add_BinarySecurityTokenX509(soap, "X509Token", cert) || soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(soap, "#X509Token") || soap_wsse_sign(soap, SOAP_SMD_SIGN_RSA_SHA256, rsa_private_key, 0)) ... // an error occurred else if (soap_call_ns__myMethod(soap, contract, &accept)) ... // a transmission error occurred @endcode The above example shows a wsu:Id attribute embedded (hardcoded) in a struct. When it is not possible to add the `wsu__Id` member, for example when the type is a string instead of a struct, it is suggested to specify the XML element to be signed with the `soap_wsse_set_wsu_id(soap, "space-separated string of element names")`. Use it before each call or in the server operation (when returning XML data from a service operation). This lets the engine add wsu:Id="tag" attribute-value pair to the element's tag name. For example: @code soap_wsse_set_wsu_id(soap, "ns:myContract"); // ... soap_wsse_set_InclusiveNamespaces(soap, "ns xsd"); // QNames have 'ns' and 'xsd' values if (soap_wsse_add_BinarySecurityTokenX509(soap, "X509Token", cert) || soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(soap, "#X509Token") || soap_wsse_sign(soap, SOAP_SMD_SIGN_RSA_SHA256, rsa_private_key, 0)) ... // an error occurred soap_wsse_set_wsu_id(soap, NULL); // reset soap_wsse_set_InclusiveNamespaces(soap, NULL); // reset @endcode This code adds the wsu:Id="ns-myContract" to the ns:myContract element. Here, the `wsu__Id` value in the struct MUST NOT be set. Otherwise, two wsu:Id attributes are present which is invalid. Also, the element signed must be unique in the message. That is, there cannot be more than one matching element, otherwise the resulting signature is invalid. @note To reset the automatic wsu:Id attributes addition, pass NULL to `soap_wsse_set_wsu_id` as shown above. This is automatically performed when a new message is received (but not automatically in a sequence of one-way sends for example). @note QName content may lead to verification issues with canonicalization (`SOAP_XML_CANONICAL`), because XML processors may not recognize prefixes in QNames as visually utilized. With QName content and `SOAP_XML_CANONICAL` enabled, we should use `soap_wsse_set_InclusiveNamespaces(soap, "prefixlist")` to define which namespace prefixes (space-separated in the string) should be considered inclusive. For example, xsi:type attribute values are QNames with xsd types and other schema types. @note When signing parts of the body as outlined above, use `soap_wsse_sign` (do NOT use `soap_wsse_sign_body`). @warning Do not attempt to sign an element with a wsu:Id that is a subelement of another element with a wsu:Id, that is, do not sign inner nested wsu:Id elements. The element that you will try to sign will not be canonicalized and will lead to a failure of the signature verification. When elements with wsu:Id are nested, sign the outermost element. We recommend to sign the entire SOAP Body using `soap_wsse_sign_body` and reserve the use of `soap_wsse_set_wsu_id` for SOAP Header elements, such as WS-Addressing elements. For example: @code #include "wsaapi.h" ... soap_wsa_request(soap, RequestMessageID, ToAddress, RequestAction); soap_wsse_set_wsu_id(soap, "wsa5:To wsa5:From wsa5:ReplyTo wsa5:Action"); if (soap_wsse_add_BinarySecurityTokenX509(soap, "X509Token", cert) || soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(soap, "#X509Token") || soap_wsse_sign_body(soap, SOAP_SMD_SIGN_RSA_SHA256, rsa_private_key, 0)) ... // an error occurred else if (soap_call_ns__myMethod(soap, ...)) ... // a transmission error occurred soap_wsse_set_wsu_id(soap, NULL); @endcode This code signs the wsa5:To and wsa5:Action SOAP header elements (set with `soap_wsa_request`, see the WS-Addressing "wsa" API in the gSOAP documentation for more information on the use of WS-Addressing). It is fine to specify more elements with `soap_wsse_set_wsu_id` than actually present in the XML payload. The other WS-Addressing headers are not present and are not signed. @note `soap_wsse_set_wsu_id` should only be set once for each `soap_wsse_sign` or `soap_wsse_sign_body`. Each new call overrides the previous setting. @warning Never use `soap_wsse_set_wsu_id` to set the wsu:Id for an element that occurs more than once in the payload, since each will have the same wsu:Id attribute that may lead to a WS-Signature failure. @subsection wsse_8_3 Signing Tokens To sign security tokens such as user names, passwords, and binary security tokens, just assign their Id values with a unique string, such as "Time" for timestamps and "User" for user names. For example: @code soap_wsse_add_Timestamp(soap, "Time", 600); soap_wsse_add_UsernameTokenDigest(soap, "User", "username", "password"); ... // the rest of the signing code @endcode Note that by default all wsu:Id-attributed elements are signed. To filter a subset of wsu:Id-attributed elements for signatures, use the `soap_wsse_sign_only` function as follows: @code soap_wsse_add_UsernameTokenDigest(soap, "User", "username", "password"); soap_wsse_add_BinarySecurityTokenX509(soap, "X509Token", cert); soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(soap, "#X509Token"); soap_wsse_sign_body(soap, SOAP_SMD_SIGN_RSA_SHA256, rsa_private_key, 0); soap_wsse_sign_only(soap, "User Body"); @endcode Note that in the above we MUST set the X509Token name for cross-referencing with a wsu:Id, which normally results in automatically signing that token unless filtered out with `soap_wsse_sign_only`. The SOAP Body wsu:Id is always "Body" and should be part of the `soap_wsse_sign_only` set of wsu:Id names to sign. When using `soap_wsse_set_wsu_id` we need to use the tag name with `soap_wsse_sign_only`. For example: @code soap_wsa_request(soap, RequestMessageID, ToAddress, RequestAction); soap_wsse_set_wsu_id(soap, "wsa5:To wsa5:From wsa5:ReplyTo wsa5:Action"); soap_wsse_add_UsernameTokenDigest(soap, "User", "username", "password"); soap_wsse_add_BinarySecurityTokenX509(soap, "X509Token", cert); soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(soap, "#X509Token"); soap_wsse_sign_body(soap, SOAP_SMD_SIGN_RSA_SHA256, rsa_private_key, 0); soap_wsse_sign_only(soap, "wsa5:To wsa5:From wsa5:ReplyTo wsa5:Action User Body"); @endcode @note `soap_wsse_sign_only` should only be set once for each `soap_wsse_sign` or `soap_wsse_sign_body`. Each new call overrides the previous. @note To reset the filtering of signed tokens and elements, pass NULL to `soap_wsse_sign_only`. This is automatically performed when a new message is received (but not automatically in a sequence of one-way sends for example). @subsection wsse_8_4 Signature Validation To automatically verify the signature of an inbound message signed with DSA or RSA algorithms, assuming the message contains the X509 certificate as a binary security token, use: @code struct soap *soap = soap_new1(SOAP_XML_CANONICAL | SOAP_XML_INDENT); soap_register_plugin(soap, soap_wsse); soap_wsse_verify_auto(soap, SOAP_SMD_NONE, NULL, 0); soap->cafile = "cacerts.pem"; // file with CA certs of peers soap->capath = "dir/to/certs"; // and/or point to CA certs soap->crlfile = "revoked.pem"; // use CRL (optional) // server: if (soap_serve(soap)) ... // an error occurred // client: if (soap_call_ns__myMethod(soap, ...)) ... // an error occurred @endcode All locally referenced and signed elements in the signed message will be verified with `soap_wsse_verify_auto` using the default settings set with `SOAP_SMD_NONE`. Elements that are not signed cannot be verified. Also elements referenced with absolute URIs that are not part of the message are not automatically verified. The received message is stored in a DOM accessible with soap->dom. This enables further analysis of the message content. For a post-parsing check to verify if an XML element was signed in an inbound message, use: @code soap_wsse_verify_auto(soap, SOAP_SMD_NONE, NULL, 0); ... // client call if (soap_wsse_verify_element(soap, "namespaceURI", "tag") > 0) ... // at least one element with matching tag and namespace is signed @endcode The signed element nesting rules are obeyed, so if the matching element is a descendent of a signed element, it is signed as well. Because it is a post check, a client should invoke `soap_wsse_verify_element` after the call completed. A service should invoke this function within the service operation routine, i.e. when the message request is accepted and about to be processed. For example, to check whether the wsu:Timestamp element was signed (assuming it is present and message expiration checked with `soap_wsse_verify_Timestamp)`, use `soap_wsse_verify_element(soap, "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd", "Timestamp")`. To check the SOAP Body (either using SOAP 1.1 or 1.2), simply use `soap_wsse_verify_body`. The `soap_wsse_verify_auto` function keeps processing signed (and unsigned) messages as they arrive. For unsigned messages this can be expensive and the verification engine should be shut down using `soap_wsse_verify_done`. There can be two problems with signature verification. First, some WS-Security implementations include SignedInfo/Reference/@URI without targeting an element, which will produce an error that a Reference URI target does not exist. To ignore these references, use `SOAP_WSSE_IGNORE_EXTRA_REFS`. Second, certificates provided by the peer are not verifiable unless the signing CA certificate is included in the cafile or capath. To disable certificate verification set the fsslverify callback: @code static int ssl_verify(int ok, X509_STORE_CTX *store) { // put certificate verification here, return 0 when fails 1 when ok return 1; } ... soap_wsse_verify_auto(soap, SOAP_SMD_NONE | SOAP_WSSE_IGNORE_EXTRA_REFS, NULL, 0); soap->fsslverify = ssl_verify; @endcode To verify the HMAC signature of an inbound message, the HMAC key must be supplied: @code static char hmac_key[16] = // the same secret key that was used to sign { 0xff, 0xee, 0xdd, 0xcc, 0xbb, 0xaa, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x00 }; struct soap *soap = soap_new1(SOAP_XML_CANONICAL | SOAP_XML_INDENT); soap_register_plugin(soap, soap_wsse); soap_wsse_verify_auto(soap, SOAP_SMD_HMAC_SHA1, hmac_key, sizeof(hmac_key)); // server: if (soap_serve(soap)) ... // an error occurred // client: if (soap_call_ns__myMethod(soap, ...)) ... // an error occurred @endcode To summarize the signature verification process: -# Register the wsse plugin. -# For HMAC, obtain the HMAC secret key -# Use `soap_wsse_verify_auto` to verify inbound messages. -# Set the cafile (or capath) to verify certificates of the peers and crlfile (optional) -# After receiving a message, the DOM in soap->dom can be traversed for further analysis. -# Always check the function return values for errors. You don't want to accept a request or response message with an invalid Security header. -# Use `soap_wsse_verify_done` to terminate verification, e.g. to consume plain messages more efficiently. @section wsse_9 Encryption The material in this section relates to the WS-Security specification section 9. The wsse plugin must be registered: @code struct soap *soap = soap_new1(SOAP_XML_CANONICAL | SOAP_XML_INDENT); soap_register_plugin(soap, soap_wsse); @endcode Other flags to consider: - `SOAP_IO_CHUNK` for HTTP chunked content to stream messages. - `SOAP_ENC_GZIP` for HTTP compression (also enables HTTP chunking). @subsection wsse_9_1 Encrypting Messages Encryption should be used in combination with signing. A signature ensures message integrity while encryption ensures confidentially. Encrypted messages can be tampered with unless integrity is ensured. Therefore, the reader should be familiar with the material in Section @ref wsse_8 should to sign and verify message content. Messages are encrypted using either public key cryptography or by using a symmetric secret key. A symmetric secret key should only be shared between the sender and receiver (or any trusted communicating peer). Encryption with public key cryptography uses an "envelope" process, where the public key of the recipient is used to encrypt a temporary (ephemeral) secret key that is sent together with the secret key-encrypted message to the recipient. The recipient decrypts the ephemeral key and uses it to decrypt the message. The public key is usually part of a X509 certificate. The public key (containing the subject information) is added to the WS-Security header and used for encryption of the SOAP Body as follows: @code X509 *cert = ...; // if (soap_wsse_add_EncryptedKey(soap, SOAP_MEC_ENV_ENC_DES_CBC, "Cert", cert, NULL, NULL, NULL)) soap_print_fault(soap, stderr); @endcode `SOAP_MEC_ENV_ENC_DES_CBC` specifies envelope encoding with triple DES CBC and PKCS1 RSA-1_5. Use `(SOAP_MEC_ENV_ENC_AES256_CBC | SOAP_MEC_OAEP)` for AES256 CBC with OAEP padding (OAEP is recommended over RSA-1_5 or use GCM). The envelope encryption options are: - `SOAP_MEC_ENV_ENC_DES_CBC` RSA-1_5 envelope encryption with triple DES CBC - `SOAP_MEC_ENV_ENC_AES256_CBC` RSA-1_5 envelope encryption with AES256 CBC - `SOAP_MEC_ENV_ENC_AES256_GCM` envelope authenticated encryption with AES256 GCM - `SOAP_MEC_ENV_ENC_AES256_CBC | SOAP_MEC_OAEP` OAEP envelope encryption with AES256 CBC where, in the above, AES256 can be replaced with AES128 or AES192. The "Cert" parameter is a unique URI to reference the key from the encrypted SOAP Body. The above enables the encryption engine for the next message to be sent, either at the client or server side. The server should use this withing a server operation (before returning) to enable the service operation response to be encrypted. To include a subject key ID in the WS-Security header instead of the entire public key, specify the subject key ID parameter: @code X509 *cert = ...; // if (soap_wsse_add_EncryptedKey(soap, SOAP_MEC_ENV_ENC_DES_CBC, "Cert", cert, "Subject Key ID", NULL, NULL)) soap_print_fault(soap, stderr); @endcode The difference with the previous example where no subject key ID was specified is that the WS-Security header only contains the subject key ID and no longer the public key in base64 format. To exclude the encrypted key certificate from the message and include a X509Data element with IssuerName and SerialNumber: @code X509 *cert = ...; if (soap_wsse_add_EncryptedKey(soap, SOAP_MEC_ENV_ENC_DES_CBC, "Cert", cert, NULL, "CN=Root Agency", "-79441640260855276448009124614332182350")) soap_print_fault(soap, stderr); @endcode The issuer name and serial number (must be in decimal for `soap_wsse_add_EncryptedKey`) of a certificate can be obtained as follows: @code X509 *cert = ...; BIGNUM *bn = BN_new(); char issuer[256], *serial; X509_NAME_oneline(X509_get_issuer_name(cert), issuer, sizeof(issuer)); ASN1_INTEGER_to_BN(X509_get_serialNumber(cert), bn); serial = BN_bn2dec(bn); OPENSSL_free(bn); ... if (soap_wsse_add_EncryptedKey(soap, SOAP_MEC_ENV_ENC_DES_CBC, "Cert", cert, NULL, issuer+1, serial)) soap_print_fault(soap, stderr); ... OPENSSL_free(serial); @code Note that in the above code the leading slash in "/CN=Root Agency" is excluded from the issuer name. When excluding the encrypted key certificate from the message, the token handler callback must be provided on the receiving end to obtain the certificate that corresponds to the issuer name and serial number. For example: @code soap_register_plugin_arg(soap, soap_wsse, security_token_handler); static const void *token_handler(struct soap *soap, int alg, const char *keyname, int *keylen) { struct ds__X509IssuerSerialType *issuer; switch (alg) { case SOAP_SMD_VRFY_DSA_SHA1: case SOAP_SMD_VRFY_DSA_SHA256: case SOAP_SMD_VRFY_RSA_SHA1: case SOAP_SMD_VRFY_RSA_SHA224: case SOAP_SMD_VRFY_RSA_SHA256: case SOAP_SMD_VRFY_RSA_SHA384: case SOAP_SMD_VRFY_RSA_SHA512: case SOAP_SMD_VRFY_ECDSA_SHA1: case SOAP_SMD_VRFY_ECDSA_SHA224: case SOAP_SMD_VRFY_ECDSA_SHA256: case SOAP_SMD_VRFY_ECDSA_SHA384: case SOAP_SMD_VRFY_ECDSA_SHA512: issuer = soap_wsse_get_KeyInfo_SecurityTokenReferenceX509Data(soap); if (issuer) { if (!strcmp(issuer->X509IssuerName, clt_issuer) && !strcmp(issuer->X509SerialNumber, clt_serial)) return (const void*)clt_cert; if (!strcmp(issuer->X509IssuerName, srv_issuer) && !strcmp(issuer->X509SerialNumber, srv_serial)) return (const void*)srv_cert; } break; ... @endcode To encrypt specific elements of the SOAP Body rather than the entire SOAP Body, use `soap_wsse_add_EncryptedKey_encrypt_only` in combination with `soap_wsse_set_wsu_id` as follows: @code X509 *cert = ...; // the SOAP Body contains one and one (not nested) soap_wsse_set_wsu_id(soap, "ns:myContract ns:myPIN"); if (soap_wsse_add_EncryptedKey_encrypt_only(soap, SOAP_MEC_ENV_ENC_DES_CBC, "Cert", cert, NULL, NULL, NULL, "ns:myContract ns:myPIN")) soap_print_fault(soap, stderr); @endcode To encrypt the SOAP Body and SOAP Header element(s), such as ds:Signature, use "SOAP-ENV:Body" with `soap_wsse_add_EncryptedKey_encrypt_only`: @code X509 *cert = ...; soap_wsse_set_wsu_id(soap, "ds:Signature"); if (soap_wsse_add_EncryptedKey_encrypt_only(soap, SOAP_MEC_ENV_ENC_DES_CBC, "Cert", cert, NULL, NULL, NULL, "ds:Signature SOAP-ENV:Body")) soap_print_fault(soap, stderr); @endcode @note The `soap_wsse_set_wsu_id` MUST be used to specify all element tag names to encrypt. Additional elements MAY be specified in `soap_wsse_set_wsu_id` (for example elements to digitally sign). @note The elements identified by the tag names in `soap_wsse_set_wsu_id` to encrypt MUST occur EXACTLY ONCE in the SOAP Body. For symmetric encryption with a shared secret key, generate a 160-bit triple DES key and make sure both the sender and reciever can use the key without it being shared by any other party (key exchange problem). Then use the `soap_wsse_encrypt_body` function to encrypt the SOAP Body as follows: @code char des_key[20] = ...; // 20-byte (160-bit) DES shared secret key if (soap_wsse_encrypt_body(soap, SOAP_MEC_ENC_DES_CBC, des_key, sizeof(des_key))) soap_print_fault(soap, stderr); @endcode The symmetric encryption options are: - `SOAP_MEC_ENC_DES_CBC` symmetric encryption with triple DES CBC - `SOAP_MEC_ENC_AES256_CBC` symmetric encryption with AES256 CBC - `SOAP_MEC_ENC_AES256_GCM` symmetric authenticated encryption with AES256 GCM where, in the above, AES256 can be replaced with AES128 or AES192. For example, symmetric encryption with AES256: @code char aes256_key[32] = ...; // 32-byte (256-bit) AES256 shared secret key if (soap_wsse_encrypt_body(soap, SOAP_MEC_ENC_AES256_CBC, aes256_key, sizeof(aes256_key))) soap_print_fault(soap, stderr); @endcode To symmetrically encrypt specific elements of the SOAP Body rather than the entire SOAP Body, use `soap_wsse_encrypt_only` in combination with `soap_wsse_set_wsu_id` as follows: @code char des_key[20] = ...; // 20-byte (160-bit) secret key // the SOAP Body contains one and one (not nested) soap_wsse_set_wsu_id(soap, "ns:myContract ns:myPIN"); if (soap_wsse_encrypt_only(soap, SOAP_MEC_ENC_DES_CBC, des_key, sizeof(des_key), "ns:myContract ns:myPIN")) soap_print_fault(soap, stderr); @endcode @note The `soap_wsse_set_wsu_id` MUST be used to specify all element tag names to encrypt. Additional elements MAY be specified in `soap_wsse_set_wsu_id` (for example elements to digitally sign). @note The elements identified by the tag names in `soap_wsse_set_wsu_id` to encrypt MUST occur EXACTLY ONCE in the SOAP Body. @subsection wsse_9_2 Decrypting Message Parts The wsse engine automatically decrypts message parts, but requires a private key or secret shared key to do so. A default key can be given to enable decryption, but it will fail if a non-compatible key was used for encryption. In that case a token handler callback should be defined by the user to select a proper decryption key based on the available subject key name or identifier embedded in the encrypted message. Here is an example of a token handler callback: @code soap_register_plugin_arg(soap, soap_wsse, security_token_handler); const void *security_token_handler(struct soap *soap, int alg, const char *keyname, int *keylen) { // Note: 'keyname' argument may be used with shared secret key // decryption where the keyname is from the ds:KeyInfo/KeyName content if (keyname) { ... lookup keyname ... const void *key = ...; keylen = ...; *alg = ...; return key; } // Get the user name from UsernameToken in message const char *uid = soap_wsse_get_Username(soap); switch (*alg) { case SOAP_SMD_VRFY_DSA_SHA1: case SOAP_SMD_VRFY_DSA_SHA256: CASE SOAP_SMD_VRFY_RSA_SHA1: CASE SOAP_SMD_VRFY_RSA_SHA224: CASE SOAP_SMD_VRFY_RSA_SHA256: CASE SOAP_SMD_VRFY_RSA_SHA384: CASE SOAP_SMD_VRFY_RSA_SHA512: CASE SOAP_SMD_VRFY_ECDSA_SHA1: CASE SOAP_SMD_VRFY_ECDSA_SHA224: CASE SOAP_SMD_VRFY_ECDSA_SHA256: CASE SOAP_SMD_VRFY_ECDSA_SHA384: CASE SOAP_SMD_VRFY_ECDSA_SHA512: if (uid) { // Lookup uid to retrieve the X509 certificate to verify the signature const X509 *cert = ...; return (const void*)cert; } return NULL; // no certificate: fail case SOAP_SMD_HMAC_SHA1: if (uid) { // Lookup uid to retrieve the HMAC key to verify the signature const void *key = ...; *alg = ...; *keylen = ...; return key; } return NULL; // no certificate: fail case SOAP_MEC_ENV_DEC_DES_CBC: case SOAP_MEC_ENV_DEC_AES128_CBC: case SOAP_MEC_ENV_DEC_AES192_CBC: case SOAP_MEC_ENV_DEC_AES256_CBC: case SOAP_MEC_ENV_DEC_AES256_CBC: case SOAP_MEC_ENV_DEC_AES128_GCM: // GCM requires OpenSSL 1.0.2 or higher case SOAP_MEC_ENV_DEC_AES192_GCM: // GCM requires OpenSSL 1.0.2 or higher case SOAP_MEC_ENV_DEC_AES256_GCM: // GCM requires OpenSSL 1.0.2 or higher case SOAP_MEC_ENV_DEC_AES256_GCM: // GCM requires OpenSSL 1.0.2 or higher // return decryption private key associated with keyname case SOAP_MEC_DEC_DES_CBC: case SOAP_MEC_DEC_AES128_CBC: case SOAP_MEC_DEC_AES192_CBC: case SOAP_MEC_DEC_AES256_CBC: case SOAP_MEC_DEC_AES512_CBC: // reserved for future use case SOAP_MEC_DEC_AES128_GCM: // GCM requires OpenSSL 1.0.2 or higher case SOAP_MEC_DEC_AES192_GCM: // GCM requires OpenSSL 1.0.2 or higher case SOAP_MEC_DEC_AES256_GCM: // GCM requires OpenSSL 1.0.2 or higher case SOAP_MEC_DEC_AES512_GCM: // GCM requires OpenSSL 1.0.2 or higher // *keylen = ... // return decryption shared secret key associated with keyname } return NULL; // fail } @endcode The last two arms are used to return a private key associated with the keyname paramater, which is a string that contains the subject key id from the public key information in an encrypted message or the subject key ID string that was set with `soap_wsse_add_EncryptedKey` at the sender side. To set the default private key for envelope decryption, use: @code EVP_PKEY *rsa_private_key = ...; soap_wsse_decrypt_auto(soap, SOAP_MEC_ENV_DEC_DES_CBC, rsa_private_key, 0); @endcode The envelope decryption options are: - `SOAP_MEC_ENV_DEC_DES_CBC` RSA-1_5 envelope decryption with triple DES CBC - `SOAP_MEC_ENV_DEC_AES256_CBC` RSA-1_5 envelope decryption with AES256 CBC - `SOAP_MEC_ENV_DEC_AES256_GCM` envelope authenticated decryption with AES256 GCM - `SOAP_MEC_ENV_DEC_AES256_CBC | SOAP_MEC_OAEP` OAEP envelope decryption with AES256 CBC where, in the above, AES256 can be replaced with AES128 or AES192. Or to set the default shared secret key for symmetric decryption, use: @code char des_key[20] = ...; // 20-byte (160-bit) triple DES key soap_wsse_decrypt_auto(soap, SOAP_MEC_DEC_DES_CBC, des_key, sizeof(des_key)); @endcode The symmetric decryption options are: - `SOAP_MEC_DEC_DES_CBC` symmetric decryption with triple DES CBC - `SOAP_MEC_DEC_AES256_CBC` symmetric decryption with AES256 CBC - `SOAP_MEC_DEC_AES256_GCM` symmetric authenticated decryption with AES256 GCM where, in the above, AES256 can be replaced with AES128 or AES192. For example, symmetric decryption with AES256: @code char aes256_key[32] = ...; // 32-byte (256-bit) AES256 key soap_wsse_decrypt_auto(soap, SOAP_MEC_DEC_AES256_CBC, aes256_key, sizeof(aes256_key)); @endcode If a default key is not set, the token handler callback should be used as discussed above in this section. Do NOT set a default key if a token handler is used to handle multiple different keys. The default key mechanism is simpler to use when only one decryption key is used to decrypt all encrypted messages. To remove the default key, use: @code soap_wsse_decrypt_auto(soap, SOAP_MEC_NONE, NULL, 0); @endcode @subsection wsse_9_3 Example Combining Signing with Encryption/Decryption Here is an client-side example to use signatures and encryption for the outbound service request message and verification and decryption of the inbound response message: @code FILE *fd; EVP_PKEY *rsa_private_key; X509 *cert; struct soap *soap = soap_new1(SOAP_XML_CANONICAL | SOAP_XML_INDENT); soap_register_plugin(soap, soap_wsse); soap_wsse_verify_auto(soap, SOAP_SMD_NONE, NULL, 0); fd = fopen("privkey.pem", "r"); rsa_private_key = PEM_read_PrivateKey(fd, NULL, NULL, "password"); fclose(fd); soap_wsse_decrypt_auto(soap, SOAP_MEC_ENV_DEC_DES_CBC, rsa_private_key, 0); fd = fopen("cert.pem", "r"); X509 *cert = PEM_read_X509(fd, NULL, NULL, NULL); fclose(fd); if (soap_wsse_add_BinarySecurityTokenX509(soap, "X509Token", cert) || soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(soap, "#X509Token") || soap_wsse_add_EncryptedKey(soap, SOAP_MEC_ENV_ENC_DES_CBC, "Cert", cert, NULL, NULL, NULL) || soap_wsse_sign_body(soap, SOAP_SMD_SIGN_RSA_SHA256, rsa_private_key, 0) ... // an error occurred else if (soap_call_ns__myMethod(soap, ...)) ... // a transmission error occurred ... EVP_PKEY_free(rsa_private_key); X509_free(cert); @endcode The server-side service operation is as follows: @code FILE *fd; EVP_PKEY *rsa_private_key; X509 *cert; struct soap *soap = soap_new1(SOAP_XML_CANONICAL | SOAP_XML_INDENT); soap_register_plugin(soap, soap_wsse); soap_wsse_verify_auto(soap, SOAP_SMD_NONE, NULL, 0); fd = fopen("privkey.pem", "r"); rsa_private_key = PEM_read_PrivateKey(fd, NULL, NULL, "password"); fclose(fd); soap_wsse_decrypt_auto(soap, SOAP_MEC_ENV_DEC_DES_CBC, rsa_private_key, 0); fd = fopen("cert.pem", "r"); X509 *cert = PEM_read_X509(fd, NULL, NULL, NULL); fclose(fd); ... if (soap_serve(soap)) { soap_wsse_delete_Security(soap); soap_print_fault(soap, stderr); } ... EVP_PKEY_free(rsa_private_key); X509_free(cert); @endcode where an example service operation could be: @code int ns__myMethod(struct soap *soap, ...) { ... soap_wsse_delete_Security(soap); if (soap_wsse_add_BinarySecurityTokenX509(soap, "X509Token", cert) || soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(soap, "#X509Token") || soap_wsse_add_EncryptedKey(soap, SOAP_MEC_ENV_ENC_DES_CBC, "Cert", cert, NULL, NULL, NULL) || soap_wsse_sign_body(soap, SOAP_SMD_SIGN_RSA_SHA256, rsa_private_key, 0) { soap_wsse_delete_Security(soap); // remove security headers (failed construction) return soap->error; } return SOAP_OK; } @endcode The service operation signs the message using a private key and encrypts the response message using a public key (from the certificate). @section wsse_10 Security Timestamps The material in this section relates to the WS-Security specification section 10. To add a timestamp with the creation time to the Security header, use: @code soap_wsse_add_Timestamp(soap, NULL, 0); // no expiration @endcode The lifetime of a message (in seconds) is passed as the third argument, which will be displayed as the timestamp expiration time: @code soap_wsse_add_Timestamp(soap, NULL, 10); // 10 seconds lifetime @endcode Timestamps, like other header elements, are not automatically secured with a digital signature. To secure a timestamp, we add an identifier (wsu:Id) to each element we want the WS-Security plugin to sign thereby making it impossible for someone to tamper with that part of the message. To do this for the timestamp, we simply pass a unique identification string as the second argument: @code soap_wsse_add_Timestamp(soap, "Time", 10); // timestamp will be signed @endcode @section wsse_11 WS-Security and HTTPS HTTPS is used at the client side with the usual "https:" URL addressing, shown here with the registration of the wsse plugin and setting up locks for thread-safe use of SSL for HTTPS: @code #include "wsseapi.h" #include "threads.h" struct soap *soap; if (CRYPTO_thread_setup()) ... // error soap = soap_new1(SOAP_XML_CANONICAL | SOAP_XML_INDENT); soap_register_plugin(soap, soap_wsse); if (soap_ssl_client_context(&soap, SOAP_SSL_DEFAULT, // requires server authentication NULL, // keyfile for client authentication to server NULL, // the keyfile password "cacerts.pem", // cafile CA certificates to authenticate the server NULL, // capath CA directory path to certificates NULL )) ... // error soap->cafile = "cacerts.pem"; // same as above (or overrides the above) soap->capath = "dir/to/certs"; // and/or point to CA certs soap->crlfile = "revoked.pem"; // use CRL (optional) ... // set up WS-Security for signatures/encryption etc if (soap_call_ns__myMethod(soap, "https://...", ...)) ... // error ... // process response results soap_destroy(soap); soap_end(soap); soap_free(soap); CRYPTO_thread_cleanup(); @endcode The CRYPTO threads should be set up before any threads are created. The `soap_ssl_client_context` only needs to be set up once. Use the following flags: - `SOAP_SSL_DEFAULT` requires server authentication, CA certs should be used - `SOAP_SSL_NO_AUTHENTICATION` disables server authentication - `SOAP_SSL_SKIP_HOST_CHECK` disables server authentication host check - `SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE` to accept self-signed certificates, expired certificates, and certificates without CRL. The server uses the following: @code #include "wsseapi.h" #include "threads.h" SOAP_SOCKET m, s; int port = 443; struct soap *soap; if (CRYPTO_thread_setup()) ... // error soap = soap_new1(SOAP_XML_CANONICAL | SOAP_XML_INDENT); soap_register_plugin(soap, soap_wsse); if (soap_ssl_server_context(&soap, SOAP_SSL_DEFAULT, // requires server to authenticate, but not the client server.pem, // keyfile for authentication to client "password", // the keyfile password NULL, // CA certificates to authenticate the client NULL, // CA directory path to certificates NULL, // use RSA 2048 bits (or give file name with DH param) NULL, NULL )) ... // error if (!soap_valid_socket(m = soap_bind(soap, NULL, port, 100)) ... // error for (;;) { if (!soap_valid_socket(s = soap_accept(soap))) ... // error THREAD_CREATE(&tid, (void*(*)(void*))&process_request, soap_copy(soap)); } soap_destroy(soap); soap_end(soap); soap_free(soap); CRYPTO_thread_cleanup(); @endcode where we define a process_request function that is executed by the thread to process the request (on a copy of the soap context struct): @code void *process_request(struct soap *soap) { ... // set up WS-Security for signatures/encryption etc if (soap_ssl_accept(soap) || soap_serve(soap)) ... // error soap_destroy(soap); soap_end(soap); soap_free(soap); } @endcode The `soap_ssl_server_context` only needs to be set up once. Use the following flags: - `SOAP_SSL_DEFAULT` requires server authentication, but no client authentication - `SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION` requires client authentication We need to define the thread set up and clean up operations as follows: @code struct CRYPTO_dynlock_value { MUTEX_TYPE mutex; }; static MUTEX_TYPE *mutex_buf; static struct CRYPTO_dynlock_value *dyn_create_function(const char *file, int line) { struct CRYPTO_dynlock_value *value; value = (struct CRYPTO_dynlock_value*)malloc(sizeof(struct CRYPTO_dynlock_value)); if (value) MUTEX_SETUP(value->mutex); return value; } static void dyn_lock_function(int mode, struct CRYPTO_dynlock_value *l, const char *file, int line) { if (mode & CRYPTO_LOCK) MUTEX_LOCK(l->mutex); else MUTEX_UNLOCK(l->mutex); } static void dyn_destroy_function(struct CRYPTO_dynlock_value *l, const char *file, int line) { MUTEX_CLEANUP(l->mutex); free(l); } void locking_function(int mode, int n, const char *file, int line) { if (mode & CRYPTO_LOCK) MUTEX_LOCK(mutex_buf[n]); else MUTEX_UNLOCK(mutex_buf[n]); } unsigned long id_function() { return (unsigned long)THREAD_ID; } int CRYPTO_thread_setup() { int i; mutex_buf = (MUTEX_TYPE*)malloc(CRYPTO_num_locks() * sizeof(pthread_mutex_t)); if (!mutex_buf) return SOAP_EOM; for (i = 0; i < CRYPTO_num_locks(); i++) MUTEX_SETUP(mutex_buf[i]); CRYPTO_set_id_callback(id_function); CRYPTO_set_locking_callback(locking_function); CRYPTO_set_dynlock_create_callback(dyn_create_function); CRYPTO_set_dynlock_lock_callback(dyn_lock_function); CRYPTO_set_dynlock_destroy_callback(dyn_destroy_function); return SOAP_OK; } void CRYPTO_thread_cleanup() { int i; if (!mutex_buf) return; CRYPTO_set_id_callback(NULL); CRYPTO_set_locking_callback(NULL); CRYPTO_set_dynlock_create_callback(NULL); CRYPTO_set_dynlock_lock_callback(NULL); CRYPTO_set_dynlock_destroy_callback(NULL); for (i = 0; i < CRYPTO_num_locks(); i++) MUTEX_CLEANUP(mutex_buf[i]); free(mutex_buf); mutex_buf = NULL; } @endcode For additional details and examples, see the user guide and examples in the gSOAP package directory gsoap/samples/ssl. @section wsse_12 Miscellaneous The Security header block was generated from the WS-Security schema with the wsdl2h tool and WS/WS-typemap.dat: wsdl2h -cegxy -o wsse.h -t WS/WS-typemap.dat WS/wsse.xsd The same process was used to generate the header file ds.h from the XML digital signatures core schema, and the xenc.h encryption schema: wsdl2h -cuxy -o ds.h -t WS/WS-typemap.dat WS/ds.xsd wsdl2h -cuxy -o xenc.h -t WS/WS-typemap.dat WS/xenc.xsd The import/wsse.h file has the following definition for the Security header block: @code typedef struct _wsse__Security { struct _wsu__Timestamp* wsu__Timestamp; struct _wsse__UsernameToken* UsernameToken; struct _wsse__BinarySecurityToken* BinarySecurityToken; struct xenc__EncryptedKeyType* xenc__EncryptedKey; struct _xenc__ReferenceList* xenc__ReferenceList; struct ds__SignatureType* ds__Signature; @char* SOAP_ENV__actor; @char* SOAP_ENV__role; } _wsse__Security; @endcode The `_wsse__Security` header is modified by a WS/WS-typemap.dat mapping rule to include additional details. @section wsse_13 Encryption Limitations - Individual encryption/decryption of simple content (CDATA content) with `soap_wsse_add_EncryptedKey_encrypt_only` IS NOT SUPPORTED. Encrypt the entire SOAP Body or encrypt elements with complex content (complexType and complexContent elements that have sub elements). - Encryption is performed after signing (likewise, signatures are verified after decryption). Signing after encryption is not supported in the current plugin release. - Signing and encrypting XML containing QName content may lead to verification issues, because the W3C C14N canonicalization protocol has known limitations with QName content normalization as prefixes in QNames may be ignored, possibly resulting in missing xmlns bindings). Use `soap_wsse_set_InclusiveNamespaces(soap, "prefixlist")` to define which namespace prefixes (space-separated in the string) should be considered inclusive. All prefixes used in QName content should be listed. The WSSE engine recognizes xsi:type, SOAP-ENC:arrayType, SOAP-ENC:itemType attribute QNames. Therefore, soapcpp2 option `-t` is always safe to use, but a non-gSOAP receiver may still fail. @section wsse_wsc WS-SecureConversation To use a WS-SecureConversation security context token (SCT) with WS-Security: @code const char *identifier = "..."; soap_wsse_add_SecurityContextToken(soap, "SCT", identifier); @endcode In this example a context has been established and the secret that is identified by the 'identifier' string is known to both parties. This secret is used to sign the message body. The "SCT" is a wsu:Id, which is used as a reference to sign the token. */ #include "wsseapi.h" #include "threads.h" /* need threads to enable mutex for MT */ #if defined(SOAP_WSA_2003) || defined(SOAP_WSA_2004) || defined(SOAP_WSA_200408) || defined(SOAP_WSA_2005) #include "wsaapi.h" #endif #ifdef __cplusplus extern "C" { #endif /** Plugin identification for plugin registry */ const char soap_wsse_id[14] = SOAP_WSSE_ID; /** Maximum number of SignedInfo References */ #define SOAP_WSSE_MAX_REF (100) /** Clock skew between machines (in sec) to fit message expiration in window */ #define SOAP_WSSE_CLKSKEW (300) /** Size of the random nonce */ #define SOAP_WSSE_NONCELEN (20) /** Digest authentication accepts messages that are not older than creation time + SOAP_WSSE_NONCETIME */ #define SOAP_WSSE_NONCETIME (SOAP_WSSE_CLKSKEW + 240) /******************************************************************************\ * * Common URIs * \******************************************************************************/ const char *wsse_PasswordTextURI = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText"; const char *wsse_PasswordDigestURI = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest"; const char *wsse_Base64BinaryURI = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary"; const char *wsse_X509v3URI = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3"; const char *wsse_X509v3SubjectKeyIdentifierURI = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509SubjectKeyIdentifier"; const char *ds_sha1URI = "http://www.w3.org/2000/09/xmldsig#sha1"; const char *ds_sha224URI = "http://www.w3.org/2001/04/xmldsig-more#sha224"; const char *ds_sha256URI = "http://www.w3.org/2001/04/xmlenc#sha256"; const char *ds_sha384URI = "http://www.w3.org/2001/04/xmldsig-more#sha384"; const char *ds_sha512URI = "http://www.w3.org/2001/04/xmlenc#sha512"; const char *ds_hmac_sha1URI = "http://www.w3.org/2000/09/xmldsig#hmac-sha1"; const char *ds_hmac_sha224URI = "http://www.w3.org/2001/04/xmldsig-more#hmac-sha224"; const char *ds_hmac_sha256URI = "http://www.w3.org/2001/04/xmldsig-more#hmac-sha256"; const char *ds_hmac_sha384URI = "http://www.w3.org/2001/04/xmldsig-more#hmac-sha384"; const char *ds_hmac_sha512URI = "http://www.w3.org/2001/04/xmldsig-more#hmac-sha512"; const char *ds_dsa_sha1URI = "http://www.w3.org/2000/09/xmldsig#dsa-sha1"; const char *ds_dsa_sha256URI = "http://www.w3.org/2009/xmldsig11#dsa-sha256"; const char *ds_rsa_sha1URI = "http://www.w3.org/2000/09/xmldsig#rsa-sha1"; const char *ds_rsa_sha224URI = "http://www.w3.org/2001/04/xmldsig-more#rsa-sha224"; const char *ds_rsa_sha256URI = "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"; const char *ds_rsa_sha384URI = "http://www.w3.org/2001/04/xmldsig-more#rsa-sha384"; const char *ds_rsa_sha512URI = "http://www.w3.org/2001/04/xmldsig-more#rsa-sha512"; const char *ds_ecdsa_sha1URI = "http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha1"; const char *ds_ecdsa_sha224URI = "http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha224"; const char *ds_ecdsa_sha256URI = "http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha256"; const char *ds_ecdsa_sha384URI = "http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha384"; const char *ds_ecdsa_sha512URI = "http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha512"; const char *xenc_3desURI = "http://www.w3.org/2001/04/xmlenc#tripledes-cbc"; const char *xenc_aes128cbcURI = "http://www.w3.org/2001/04/xmlenc#aes128-cbc"; const char *xenc_aes192cbcURI = "http://www.w3.org/2001/04/xmlenc#aes192-cbc"; const char *xenc_aes256cbcURI = "http://www.w3.org/2001/04/xmlenc#aes256-cbc"; const char *xenc_aes512cbcURI = "http://www.w3.org/2001/04/xmlenc#aes512-cbc"; const char *xenc_aes128gcmURI = "http://www.w3.org/2009/xmlenc11#aes128-gcm"; const char *xenc_aes192gcmURI = "http://www.w3.org/2009/xmlenc11#aes192-gcm"; const char *xenc_aes256gcmURI = "http://www.w3.org/2009/xmlenc11#aes256-gcm"; const char *xenc_aes512gcmURI = "http://www.w3.org/2009/xmlenc11#aes512-gcm"; const char *xenc_elementURI = "http://www.w3.org/2001/04/xmlenc#Element"; const char *xenc_contentURI = "http://www.w3.org/2001/04/xmlenc#Content"; const char *xenc_rsa15URI = "http://www.w3.org/2001/04/xmlenc#rsa-1_5"; const char *xenc_rsaesURI = "http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p"; const char *ds_URI = "http://www.w3.org/2000/09/xmldsig#"; const char *c14n_URI = "http://www.w3.org/2001/10/xml-exc-c14n#"; const char *wsu_URI = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"; /******************************************************************************\ * * Digest authentication session * \******************************************************************************/ /** @struct soap_wsse_session @brief Digest authentication session data */ struct soap_wsse_session { struct soap_wsse_session *next; /**< Next session in list */ time_t expired; /**< Session expiration */ char hash[SOAP_SMD_SHA1_SIZE]; /**< SHA1 digest */ char nonce[1]; /**< Nonce string flows into region below this struct */ }; /** The digest authentication session database */ static struct soap_wsse_session *soap_wsse_session = NULL; /** Lock for digest authentication session database exclusive access */ static MUTEX_TYPE soap_wsse_session_lock = MUTEX_INITIALIZER; static char* soap_wsse_ids(struct soap *soap, const char *tags); static int soap_wsse_session_verify(struct soap *soap, const char hash[SOAP_SMD_SHA1_SIZE], const char *created, const char *nonce); static void soap_wsse_session_cleanup(struct soap *soap); static void calc_digest(struct soap *soap, const char *created, const char *nonce, int noncelen, const char *password, char hash[SOAP_SMD_SHA1_SIZE]); static void calc_nonce(char nonce[SOAP_WSSE_NONCELEN]); static int soap_wsse_init(struct soap *soap, struct soap_wsse_data *data, const void *(*arg)(struct soap*, int*, const char*, int*)); static int soap_wsse_copy(struct soap *soap, struct soap_plugin *dst, struct soap_plugin *src); static void soap_wsse_delete(struct soap *soap, struct soap_plugin *p); static int soap_wsse_preparesend(struct soap *soap, const char *buf, size_t len); static int soap_wsse_preparefinalsend(struct soap *soap); static void soap_wsse_preparecleanup(struct soap *soap, struct soap_wsse_data *data); static int soap_wsse_preparefinalrecv(struct soap *soap); static int soap_wsse_header(struct soap *soap); static int soap_wsse_element_begin_in(struct soap *soap, const char *tag); static int soap_wsse_element_end_in(struct soap *soap, const char *tag1, const char *tag2); static int soap_wsse_element_begin_out(struct soap *soap, const char *tag); static int soap_wsse_element_end_out(struct soap *soap, const char *tag); static size_t soap_wsse_verify_nested(struct soap *soap, struct soap_dom_element *dom, const char *URI, const char *tag); /******************************************************************************\ * * wsse:Security header element * \******************************************************************************/ /** @fn _wsse__Security* soap_wsse_add_Security(struct soap *soap) @brief Adds Security header element. @param soap context @return _wsse__Security object */ struct _wsse__Security* soap_wsse_add_Security(struct soap *soap) { DBGFUN("soap_wsse_add_Security"); /* if we don't have a SOAP Header, create one */ soap_header(soap); /* if we don't have a wsse:Security element in the SOAP Header, create one */ if (!soap->header->wsse__Security) { soap->header->wsse__Security = (_wsse__Security*)soap_malloc(soap, sizeof(_wsse__Security)); if (!soap->header->wsse__Security) return NULL; soap_default__wsse__Security(soap, soap->header->wsse__Security); } return soap->header->wsse__Security; } /** @fn _wsse__Security* soap_wsse_add_Security_actor(struct soap *soap, const char *actor) @brief Adds Security header element with actor or role attribute. @param soap context @param actor string @return _wsse__Security object */ struct _wsse__Security* soap_wsse_add_Security_actor(struct soap *soap, const char *actor) { _wsse__Security *security = soap_wsse_add_Security(soap); DBGFUN1("soap_wsse_add_Security_actor", "actor=%s", actor); if (soap->namespaces && !strcmp(soap->namespaces[0].ns, "http://schemas.xmlsoap.org/soap/envelope/")) security->SOAP_ENV__actor = soap_strdup(soap, actor); else security->SOAP_ENV__role = soap_strdup(soap, actor); return security; } /** @fn void soap_wsse_delete_Security(struct soap *soap) @brief Deletes Security header element. @param soap context */ void soap_wsse_delete_Security(struct soap *soap) { DBGFUN("soap_wsse_delete_Security"); if (soap->header) soap->header->wsse__Security = NULL; } /** @fn _wsse__Security* soap_wsse_Security(struct soap *soap) @brief Returns Security header element if present. @param soap context @return _wsse__Security object or NULL */ struct _wsse__Security* soap_wsse_Security(struct soap *soap) { if (soap->header) return soap->header->wsse__Security; return NULL; } /******************************************************************************\ * * wsse:Security/ds:Signature header element * \******************************************************************************/ /** @fn ds__SignatureType* soap_wsse_add_Signature(struct soap *soap) @brief Adds Signature header element. @param soap context @return ds__SignatureType object */ struct ds__SignatureType* soap_wsse_add_Signature(struct soap *soap) { _wsse__Security *security = soap_wsse_add_Security(soap); DBGFUN("soap_wsse_add_Signature"); /* if we don't have a ds:Signature, create one */ if (!security->ds__Signature) { security->ds__Signature = (ds__SignatureType*)soap_malloc(soap, sizeof(ds__SignatureType)); if (!security->ds__Signature) return NULL; soap_default_ds__SignatureType(soap, security->ds__Signature); } return security->ds__Signature; } /** @fn void soap_wsse_delete_Signature(struct soap *soap) @brief Deletes Signature header element. @param soap context */ void soap_wsse_delete_Signature(struct soap *soap) { _wsse__Security *security = soap_wsse_Security(soap); DBGFUN("soap_wsse_delete_Signature"); if (security) security->ds__Signature = NULL; } /** @fn ds__SignatureType* soap_wsse_Signature(struct soap *soap) @brief Returns Signature header element if present. @param soap context @return ds__SignatureType object or NULL */ struct ds__SignatureType* soap_wsse_Signature(struct soap *soap) { _wsse__Security *security = soap_wsse_Security(soap); if (security) return security->ds__Signature; return NULL; } /******************************************************************************\ * * wsse:Security/wsu:Timestamp header element * \******************************************************************************/ /** @fn int soap_wsse_add_Timestamp(struct soap *soap, const char *id, time_t lifetime) @brief Adds Timestamp element with optional expiration date+time (lifetime). @param[in] soap context @param[in] id for signature referencing or NULL @param[in] lifetime expressed in time_t units, or 0 for no expiration @return SOAP_OK */ int soap_wsse_add_Timestamp(struct soap *soap, const char *id, time_t lifetime) { _wsse__Security *security = soap_wsse_add_Security(soap); time_t now = time(NULL); char *created = soap_strdup(soap, soap_dateTime2s(soap, now)); char *expired = lifetime ? soap_strdup(soap, soap_dateTime2s(soap, now + lifetime)) : NULL; DBGFUN1("soap_wsse_add_Timestamp", "id=%s", id?id:""); /* allocate a Timestamp if we don't have one already */ if (!security->wsu__Timestamp) { security->wsu__Timestamp = (_wsu__Timestamp*)soap_malloc(soap, sizeof(_wsu__Timestamp)); if (!security->wsu__Timestamp) return soap->error = SOAP_EOM; } soap_default__wsu__Timestamp(soap, security->wsu__Timestamp); /* populate the wsu:Timestamp element */ security->wsu__Timestamp->wsu__Id = soap_strdup(soap, id); security->wsu__Timestamp->Created = created; security->wsu__Timestamp->Expires = expired; return SOAP_OK; } /** @fn _wsu__Timestamp *soap_wsse_Timestamp(struct soap *soap) @brief Returns Timestamp element if present. @param soap context @return _wsu__Timestamp object or NULL */ struct _wsu__Timestamp* soap_wsse_Timestamp(struct soap *soap) { _wsse__Security *security = soap_wsse_Security(soap); if (security) return security->wsu__Timestamp; return NULL; } /** @fn int soap_wsse_verify_Timestamp(struct soap *soap) @brief Verifies the Timestamp/Expires element against the current time. @param soap context @return SOAP_OK or SOAP_FAULT with wsu:MessageExpired fault Sets wsu:MessageExpired fault if wsu:Timestamp is expired. The SOAP_WSSE_CLKSKEW value is used as a margin to mitigate clock skew. Keeps silent when no timestamp is supplied or no expiration date is included in the wsu:Timestamp element. */ int soap_wsse_verify_Timestamp(struct soap *soap) { _wsu__Timestamp *timestamp = soap_wsse_Timestamp(soap); DBGFUN("soap_wsse_verify_Timestamp"); /* if we have a timestamp with an expiration date, check it */ if (timestamp && timestamp->Expires) { time_t now = time(NULL), expired; soap_s2dateTime(soap, timestamp->Expires, &expired); if (expired + SOAP_WSSE_CLKSKEW <= now) { const char *code = soap_wsu__tTimestampFault2s(soap, wsu__MessageExpired); return soap_wsse_sender_fault_subcode(soap, code, "Message has expired", timestamp->Expires); } } return SOAP_OK; } /******************************************************************************\ * * wsse:Security/UsernameToken header element * \******************************************************************************/ /** @fn int soap_wsse_add_UsernameTokenText(struct soap *soap, const char *id, const char *username, const char *password) @brief Adds UsernameToken element with optional clear-text password. @param soap context @param[in] id string for signature referencing or NULL @param[in] username string @param[in] password string or NULL to omit the password @return SOAP_OK Passwords are sent in the clear, so transport-level encryption is required. @note This release supports the use of at most one UsernameToken in the header. */ int soap_wsse_add_UsernameTokenText(struct soap *soap, const char *id, const char *username, const char *password) { _wsse__Security *security = soap_wsse_add_Security(soap); DBGFUN2("soap_wsse_add_UsernameTokenText", "id=%s", id?id:"", "username=%s", username?username:""); /* allocate a UsernameToken if we don't have one already */ if (!security->UsernameToken) { if (!(security->UsernameToken = (_wsse__UsernameToken*)soap_malloc(soap, sizeof(_wsse__UsernameToken)))) return soap->error = SOAP_EOM; } soap_default__wsse__UsernameToken(soap, security->UsernameToken); /* populate the UsernameToken */ security->UsernameToken->wsu__Id = soap_strdup(soap, id); security->UsernameToken->Username = soap_strdup(soap, username); /* allocate and populate the Password */ if (password) { if (!(security->UsernameToken->Password = (_wsse__Password*)soap_malloc(soap, sizeof(_wsse__Password)))) return soap->error = SOAP_EOM; soap_default__wsse__Password(soap, security->UsernameToken->Password); security->UsernameToken->Password->Type = (char*)wsse_PasswordTextURI; security->UsernameToken->Password->__item = soap_strdup(soap, password); } return SOAP_OK; } /** @fn int soap_wsse_add_UsernameTokenDigest(struct soap *soap, const char *id, const char *username, const char *password) @brief Adds UsernameToken element for digest authentication. @param soap context @param[in] id string for signature referencing or NULL @param[in] username string @param[in] password string @return SOAP_OK Computes SHA1 digest of the time stamp, a nonce, and the password. The digest provides the authentication credentials. Passwords are NOT sent in the clear. @note This release supports the use of at most one UsernameToken in the header. */ int soap_wsse_add_UsernameTokenDigest(struct soap *soap, const char *id, const char *username, const char *password) { _wsse__Security *security = soap_wsse_add_Security(soap); time_t now = time(NULL); const char *created = soap_dateTime2s(soap, now); char HA[SOAP_SMD_SHA1_SIZE], HABase64[29]; char nonce[SOAP_WSSE_NONCELEN], *nonceBase64; DBGFUN2("soap_wsse_add_UsernameTokenDigest", "id=%s", id?id:"", "username=%s", username?username:""); /* generate a nonce */ calc_nonce(nonce); nonceBase64 = soap_s2base64(soap, (unsigned char*)nonce, NULL, SOAP_WSSE_NONCELEN); /* The specs are not clear: compute digest over binary nonce or base64 nonce? */ /* compute SHA1(created, nonce, password) */ calc_digest(soap, created, nonce, SOAP_WSSE_NONCELEN, password, HA); /* Hm...? calc_digest(soap, created, nonceBase64, strlen(nonceBase64), password, HA); */ soap_s2base64(soap, (unsigned char*)HA, HABase64, SOAP_SMD_SHA1_SIZE); /* populate the UsernameToken with digest */ soap_wsse_add_UsernameTokenText(soap, id, username, HABase64); /* populate the remainder of the password, nonce, and created */ security->UsernameToken->Password->Type = (char*)wsse_PasswordDigestURI; security->UsernameToken->Nonce = nonceBase64; security->UsernameToken->wsu__Created = soap_strdup(soap, created); return SOAP_OK; } /** @fn _wsse__UsernameToken* soap_wsse_UsernameToken(struct soap *soap, const char *id) @brief Returns UsernameToken element if present. @param soap context @param[in] id string of UsernameToken or NULL @return _wsse__UsernameToken object or NULL @note This release supports the use of at most one UsernameToken in the header. */ struct _wsse__UsernameToken* soap_wsse_UsernameToken(struct soap *soap, const char *id) { _wsse__Security *security = soap_wsse_Security(soap); if (security && security->UsernameToken && (!id || (security->UsernameToken->wsu__Id && !strcmp(security->UsernameToken->wsu__Id, id)))) return security->UsernameToken; return NULL; } /** @fn const char* soap_wsse_get_Username(struct soap *soap) @brief Returns UsernameToken/username string or wsse:FailedAuthentication fault. @param soap context @return UsernameToken/username string or NULL with wsse:FailedAuthentication fault error set @see soap_wsse_verify_Password The returned username should be used to lookup the user's password in a dictionary or database for server-side authentication with soap_wsse_verify_Password. */ const char* soap_wsse_get_Username(struct soap *soap) { _wsse__UsernameToken *token = soap_wsse_UsernameToken(soap, NULL); DBGFUN("soap_wsse_get_Username"); if (token) return token->Username; soap_wsse_fault(soap, wsse__FailedAuthentication, "Username authentication required"); return NULL; } /** @fn int soap_wsse_verify_Password(struct soap *soap, const char *password) @brief Verifies the supplied password or sets wsse:FailedAuthentication fault. @param soap context @param[in] password string to verify against @return SOAP_OK (authorized) or SOAP_FAULT with wsse:FailedAuthentication fault The verification supports both clear-text password verification and digest password authentication. For digest authentication a history mechanism with a digest authentication session database ensures protection against replay attacks. @note This release supports the use of at most one UsernameToken in the header. */ int soap_wsse_verify_Password(struct soap *soap, const char *password) { _wsse__UsernameToken *token = soap_wsse_UsernameToken(soap, NULL); DBGFUN("soap_wsse_verify_Password"); /* if we have a UsernameToken with a Password, check it */ if (token && token->Password) { /* password digest or text? */ if (token->Password->Type && !strcmp(token->Password->Type, wsse_PasswordDigestURI)) { /* check password digest: compute SHA1(created, nonce, password) */ if (token->Nonce && token->wsu__Created && strlen(token->Password->__item) == 28) /* digest pw len = 28 */ { char HA1[SOAP_SMD_SHA1_SIZE], HA2[SOAP_SMD_SHA1_SIZE]; /* The specs are not clear: compute digest over binary nonce or base64 nonce? The formet appears to be the case: */ int noncelen; const char *nonce = soap_base642s(soap, token->Nonce, NULL, 0, &noncelen); /* compute HA1 = SHA1(created, nonce, password) */ calc_digest(soap, token->wsu__Created, nonce, noncelen, password, HA1); /* calc_digest(soap, token->wsu__Created, token->Nonce, strlen(token->Nonce), password, HA1); */ /* get HA2 = supplied digest from base64 Password */ soap_base642s(soap, token->Password->__item, HA2, SOAP_SMD_SHA1_SIZE, NULL); /* compare HA1 to HA2 */ if (!memcmp(HA1, HA2, SOAP_SMD_SHA1_SIZE)) { /* authorize if HA1 and HA2 identical and not replay attack */ if (!soap_wsse_session_verify(soap, HA1, token->wsu__Created, token->Nonce)) return SOAP_OK; return soap->error; } } } else { /* check password text */ if (!strcmp(token->Password->__item, password)) return SOAP_OK; } } return soap_wsse_fault(soap, wsse__FailedAuthentication, NULL); } /******************************************************************************\ * * wsse:Security/BinarySecurityToken header element * \******************************************************************************/ /** @fn int soap_wsse_add_BinarySecurityToken(struct soap *soap, const char *id, const char *valueType, const unsigned char *data, int size) @brief Adds BinarySecurityToken element. @param soap context @param[in] id string for signature referencing or NULL @param[in] valueType string @param[in] data points to binary token data @param[in] size is length of binary token @return SOAP_OK */ int soap_wsse_add_BinarySecurityToken(struct soap *soap, const char *id, const char *valueType, const unsigned char *data, int size) { _wsse__Security *security = soap_wsse_add_Security(soap); DBGFUN2("wsse_add_BinarySecurityToken", "id=%s", id?id:"", "valueType=%s", valueType?valueType:""); /* allocate BinarySecurityToken if we don't already have one */ if (!security->BinarySecurityToken) { if (!(security->BinarySecurityToken = (_wsse__BinarySecurityToken*)soap_malloc(soap, sizeof(_wsse__BinarySecurityToken)))) return soap->error = SOAP_EOM; } soap_default__wsse__BinarySecurityToken(soap, security->BinarySecurityToken); /* populate the BinarySecurityToken */ security->BinarySecurityToken->wsu__Id = soap_strdup(soap, id); security->BinarySecurityToken->ValueType = soap_strdup(soap, valueType); security->BinarySecurityToken->EncodingType = (char*)wsse_Base64BinaryURI; security->BinarySecurityToken->__item = soap_s2base64(soap, data, NULL, size); return SOAP_OK; } /** @fn int soap_wsse_add_BinarySecurityTokenX509(struct soap *soap, const char *id, X509 *cert) @brief Adds BinarySecurityToken element with X509 certificate. @param soap context @param[in] id string for signature reference @param[in] cert points to the X509 certificate @return SOAP_OK or SOAP_EOM This function uses i2d_X509 from the the OpenSSL library to convert an X509 object to binary DER format. */ int soap_wsse_add_BinarySecurityTokenX509(struct soap *soap, const char *id, X509 *cert) { int derlen; unsigned char *der, *s; if (!cert) return soap_wsse_fault(soap, wsse__InvalidSecurityToken, "Missing certificate"); /* determine the storage requirement */ derlen = i2d_X509(cert, NULL); if (derlen < 0) return soap_wsse_fault(soap, wsse__InvalidSecurityToken, "Invalid certificate"); /* use the gSOAP engine's look-aside buffer to temporarily hold the cert */ if (soap_store_lab(soap, NULL, derlen)) return SOAP_EOM; s = der = (unsigned char*)soap->labbuf; /* store in DER format */ i2d_X509(cert, &s); /* populate the BinarySecurityToken with base64 certificate data */ return soap_wsse_add_BinarySecurityToken(soap, id, wsse_X509v3URI, der, derlen); } /** @fn int soap_wsse_add_BinarySecurityTokenPEM(struct soap *soap, const char *id, const char *filename) @brief Adds BinarySecurityToken element from a PEM file. @param soap context @param[in] id string for signature reference @param[in] filename @return SOAP_OK or SOAP_FAULT with wsse__InvalidSecurity fault when file cannot be read or does not contain a valid certificate This function uses PEM_read_X509 from the the OpenSSL library to read a certificate from a PEM formatted file. */ int soap_wsse_add_BinarySecurityTokenPEM(struct soap *soap, const char *id, const char *filename) { FILE *fd; DBGFUN2("soap_wsse_add_BinarySecurityTokenPEM", "id=%s", id?id:"", "filename=%s", filename?filename:""); if ((fd = fopen(filename, "r"))) { /* read the certificate */ X509 *cert = PEM_read_X509(fd, NULL, NULL, NULL); fclose(fd); /* if okay, populate the BinarySecurityToken element */ if (cert) { int err = soap_wsse_add_BinarySecurityTokenX509(soap, id, cert); X509_free(cert); return err; } } return soap_wsse_fault(soap, wsse__InvalidSecurityToken, "Missing certificate"); } /** @fn _wsse__BinarySecurityToken* soap_wsse_BinarySecurityToken(struct soap *soap, const char *id) @brief Returns BinarySecurityToken element if present. @param soap context @param[in] id string of token to get or NULL @return _wsse__BinarySecurityToken object or NULL */ struct _wsse__BinarySecurityToken* soap_wsse_BinarySecurityToken(struct soap *soap, const char *id) { _wsse__Security *security = soap_wsse_Security(soap); if (security && security->BinarySecurityToken && (!id || (security->BinarySecurityToken->wsu__Id && !strcmp(security->BinarySecurityToken->wsu__Id, id)))) return security->BinarySecurityToken; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "No BinarySecurityToken id=%s, pointer=%p to token found\n", id, security->BinarySecurityToken)); return NULL; } /** @fn int soap_wsse_get_BinarySecurityToken(struct soap *soap, const char *id, char **valueType, unsigned char **data, int *size) @brief Get wsse:BinarySecurityToken element token data in binary form. @param soap context @param[in] id string of token to get or NULL @param[out] valueType string @param[out] data points to binary token data @param[out] size is length of binary token @return SOAP_OK or SOAP_FAULT with wsse:SecurityTokenUnavailable fault */ int soap_wsse_get_BinarySecurityToken(struct soap *soap, const char *id, char **valueType, unsigned char **data, int *size) { _wsse__BinarySecurityToken *token = soap_wsse_BinarySecurityToken(soap, id); DBGFUN1("soap_wsse_get_BinarySecurityToken", "id=%s", id?id:""); if (token) { *valueType = token->ValueType; /* it appears we don't need HexBinary after all if (token->EncodingType && !strcmp(token->EncodingType, wsse_HexBinaryURI)) *data = (unsigned char*)soap_hex2s(soap, token->__item, NULL, 0, size); else */ /* assume token is represented in base64 by default */ *data = (unsigned char*)soap_base642s(soap, token->__item, NULL, 0, size); if (*data) return SOAP_OK; } return soap_wsse_fault(soap, wsse__SecurityTokenUnavailable, "BinarySecurityToken required"); } /** @fn X509* soap_wsse_get_BinarySecurityTokenX509(struct soap *soap, const char *id) @brief Get X509 wsse:BinarySecurityToken certificate and verify its content. This call must be followed by an X509_free to deallocate the X509 certificate data. @param soap context @param[in] id string of token to get or NULL @return X509 certificate (dynamically allocated) or NULL with wsse:SecurityTokenUnavailable fault */ X509* soap_wsse_get_BinarySecurityTokenX509(struct soap *soap, const char *id) { X509 *cert = NULL; char *valueType = NULL; #if (OPENSSL_VERSION_NUMBER >= 0x0090800fL) const unsigned char *data; #else unsigned char *data; #endif int size; DBGFUN1("soap_wsse_get_BinarySecurityTokenX509", "id=%s", id?id:""); if (!soap_wsse_get_BinarySecurityToken(soap, id, &valueType, (unsigned char**)&data, &size) && valueType && !strcmp(valueType, wsse_X509v3URI)) cert = d2i_X509(NULL, &data, size); /* verify the certificate */ if (cert && soap_wsse_verify_X509(soap, cert)) { X509_free(cert); cert = NULL; } return cert; } /** @fn int soap_wsse_verify_X509(struct soap *soap, X509 *cert) @brief Verifies X509 certificate against soap->cafile, soap->capath, and soap->crlfile @param soap context @param[in] cert X509 certificate @return SOAP_OK or fault This is an expensive operation. Whenever a new soap context is created, the cafile and objects are loaded into that context each time we need to verify a certificate. */ int soap_wsse_verify_X509(struct soap *soap, X509 *cert) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); X509_STORE_CTX *verify; DBGFUN("soap_wsse_verify_X509"); if (!data) return soap_set_receiver_error(soap, "soap_wsse_sign", "Plugin not registered", SOAP_PLUGIN_ERROR); if (!cert) return soap_wsse_sender_fault(soap, "soap_wsse_verify_X509", "No certificate"); if (!data->store) { if (!(data->store = X509_STORE_new())) return soap_wsse_receiver_fault(soap, "soap_wsse_verify_X509", "Could not create X509_STORE object"); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Setting up a new X509 store\n")); X509_STORE_set_verify_cb_func(data->store, soap->fsslverify); if (soap->cafile || soap->capath) { if (X509_STORE_load_locations(data->store, soap->cafile, soap->capath) != 1) return soap_wsse_receiver_fault(soap, "soap_wsse_verify_X509", "Could not load CA file or path"); } #if (OPENSSL_VERSION_NUMBER > 0x00907000L) if (soap->crlfile) { if (*soap->crlfile) { X509_LOOKUP *lookup; if (!(lookup = X509_STORE_add_lookup(data->store, X509_LOOKUP_file()))) return soap_wsse_receiver_fault(soap, "soap_wsse_verify_X509", "Could not create X509_LOOKUP object"); if (X509_load_crl_file(lookup, soap->crlfile, X509_FILETYPE_PEM) != 1) return soap_wsse_receiver_fault(soap, "soap_wsse_verify_X509", "Could not read the CRL file"); } X509_STORE_set_flags(data->store, X509_V_FLAG_CRL_CHECK | X509_V_FLAG_CRL_CHECK_ALL); } #endif } if (!(verify = X509_STORE_CTX_new())) return soap_wsse_receiver_fault(soap, "soap_wsse_verify_X509", "Could not create X509_STORE_CTX object"); #if (OPENSSL_VERSION_NUMBER > 0x00907000L) if (X509_STORE_CTX_init(verify, data->store, cert, NULL) != 1) { X509_STORE_CTX_free(verify); return soap_wsse_receiver_fault(soap, "soap_wsse_verify_X509", "Could not initialize X509_STORE_CTX object"); } #else X509_STORE_CTX_init(verify, data->store, cert, NULL); #endif if (X509_verify_cert(verify) != 1) { X509_STORE_CTX_free(verify); return soap_wsse_sender_fault(soap, "soap_wsse_verify_X509", "Invalid certificate"); } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Certificate is valid\n")); #ifdef SOAP_DEBUG { char buf[1024]; X509_NAME_oneline(X509_get_issuer_name(cert), buf, sizeof(buf)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "certificate issuer %s\n", buf)); X509_NAME_oneline(X509_get_subject_name(cert), buf, sizeof(buf)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "certificate subject %s\n", buf)); } #endif X509_STORE_CTX_free(verify); return SOAP_OK; } /******************************************************************************\ * * wsc:SecurityContextToken * \******************************************************************************/ /** @fn int soap_wsse_add_SecurityContextToken(struct soap *soap, const char *id, const char *identifier) @brief Adds wsc:SecurityContextToken/Identifier and SecurityTokenReference to it @param soap context @param[in] id string for signature reference (required) @param[in] identifier wsc:Identifier value (required) @return SOAP_OK or error code */ int soap_wsse_add_SecurityContextToken(struct soap *soap, const char *id, const char *identifier) { char *URI; size_t l; _wsse__Security *security = soap_wsse_add_Security(soap); DBGFUN2("soap_wsse_add_SecurityContextToken", "id=%s", id, "identifier=%s", identifier?identifier:""); /* allocate wsc:SecurityContextToken if we don't already have one */ if (!security->wsc__SecurityContextToken) { if (!(security->wsc__SecurityContextToken = (struct wsc__SecurityContextTokenType*)soap_malloc(soap, sizeof(struct wsc__SecurityContextTokenType)))) return soap->error = SOAP_EOM; } soap_default_wsc__SecurityContextTokenType(soap, security->wsc__SecurityContextToken); /* populate the wsc:SecurityContextToken */ l = strlen(id); if (!(URI = (char*)soap_malloc(soap, l + 2))) return soap->error = SOAP_EOM; *URI = '#'; soap_strcpy(URI + 1, l + 1, id); security->wsc__SecurityContextToken->wsu__Id = URI + 1; security->wsc__SecurityContextToken->Identifier = soap_strdup(soap, identifier); /* set SecurityTokenReference */ return soap_wsse_add_KeyInfo_SecurityTokenReferenceURI(soap, URI, NULL); } /** @fn const char *soap_wsse_get_SecurityContextToken(struct soap *soap) @brief Returns wsc:SecurityContextToken/Identifier string value or NULL @param soap context @return wsc:SecurityContextToken/Identifier string value value or NULL */ const char * soap_wsse_get_SecurityContextToken(struct soap *soap) { _wsse__Security *security = soap_wsse_Security(soap); DBGFUN("soap_wsse_SecurityContextToken"); if (security->wsc__SecurityContextToken && security->wsc__SecurityContextToken->wsu__Id) { const char *URI = soap_wsse_get_KeyInfo_SecurityTokenReferenceURI(soap); if (URI && !strcmp(URI, security->wsc__SecurityContextToken->wsu__Id)) return security->wsc__SecurityContextToken->Identifier; } return NULL; } /******************************************************************************\ * * ds:Signature/SignedInfo * \******************************************************************************/ /** @fn ds__SignedInfoType* soap_wsse_add_SignedInfo(struct soap *soap) @brief Adds SignedInfo element. @param soap context @return ds__SignedInfoType object */ struct ds__SignedInfoType* soap_wsse_add_SignedInfo(struct soap *soap) { ds__SignatureType *signature = soap_wsse_add_Signature(soap); if (!signature->SignedInfo) { signature->SignedInfo = (ds__SignedInfoType*)soap_malloc(soap, sizeof(ds__SignedInfoType)); if (!signature->SignedInfo) return NULL; soap_default_ds__SignedInfoType(soap, signature->SignedInfo); } return signature->SignedInfo; } /** @fn int soap_wsse_add_SignedInfo_Reference(struct soap *soap, const char *URI, const char *transform, const char *prefixlist, int alg, const char *HA) @brief Adds SignedInfo element with Reference URI, transform algorithm used, and digest value. @param soap context @param[in] URI reference @param[in] transform string should be c14n_URI for exc-c14n or NULL @param[in] prefixlist used by the exc-c14n transform or NULL @param[in] alg is the digest algorithm used @param[in] HA is the digest in binary form @return SOAP_OK or SOAP_EOM when references exceed SOAP_WSSE_MAX_REF This function can be called to add more references to the wsse:SignedInfo element. A maximum number of SOAP_WSSE_MAX_REF references can be added. The digest method is always SHA1. @note XPath transforms cannot be specified in this release. */ int soap_wsse_add_SignedInfo_Reference(struct soap *soap, const char *URI, const char *transform, const char *prefixlist, int alg, const char *HA) { ds__SignedInfoType *signedInfo = soap_wsse_add_SignedInfo(soap); ds__ReferenceType *reference; DBGFUN3("soap_wsse_add_SignedInfo_Reference", "URI=%s", URI?URI:"", "transform=%s", transform?transform:"", "alg=%x", alg); /* if this is the first reference, allocate SOAP_WSSE_MAX_REF references */ if (signedInfo->__sizeReference == 0) signedInfo->Reference = (ds__ReferenceType**)soap_malloc(soap, SOAP_WSSE_MAX_REF*sizeof(ds__ReferenceType*)); else { /* maximum number of references exceeded? */ if (signedInfo->__sizeReference >= SOAP_WSSE_MAX_REF) return soap->error = SOAP_EOM; } /* allocate fresh new reference */ reference = (ds__ReferenceType*)soap_malloc(soap, sizeof(ds__ReferenceType)); if (!reference) return soap->error = SOAP_EOM; soap_default_ds__ReferenceType(soap, reference); /* populate the URI */ reference->URI = soap_strdup(soap, URI); /* if a transform algorithm was used, populate the Transforms element */ if (transform) { reference->Transforms = (ds__TransformsType*)soap_malloc(soap, sizeof(ds__TransformsType)); if (!reference->Transforms) return soap->error = SOAP_EOM; soap_default_ds__TransformsType(soap, reference->Transforms); /* only one transform */ reference->Transforms->__sizeTransform = 1; reference->Transforms->Transform = (ds__TransformType*)soap_malloc(soap, sizeof(ds__TransformType)); soap_default_ds__TransformType(soap, reference->Transforms->Transform); reference->Transforms->Transform->Algorithm = (char*)transform; /* populate the c14n:InclusiveNamespaces element */ if (prefixlist && *prefixlist) { reference->Transforms->Transform->c14n__InclusiveNamespaces = (_c14n__InclusiveNamespaces*)soap_malloc(soap, sizeof(_c14n__InclusiveNamespaces)); if (!reference->Transforms->Transform->c14n__InclusiveNamespaces) return soap->error = SOAP_EOM; soap_default__c14n__InclusiveNamespaces(soap, reference->Transforms->Transform->c14n__InclusiveNamespaces); reference->Transforms->Transform->c14n__InclusiveNamespaces->PrefixList = (char*)prefixlist; } } /* populate the DigestMethod element */ reference->DigestMethod = (ds__DigestMethodType*)soap_malloc(soap, sizeof(ds__DigestMethodType)); if (!reference->DigestMethod) return soap->error = SOAP_EOM; soap_default_ds__DigestMethodType(soap, reference->DigestMethod); /* the DigestMethod algorithm SHA1, SHA256, SHA512 */ switch (alg & SOAP_SMD_HASH) { case SOAP_SMD_SHA1: reference->DigestMethod->Algorithm = (char*)ds_sha1URI; break; #if (OPENSSL_VERSION_NUMBER >= 0x0090800fL) case SOAP_SMD_SHA224: reference->DigestMethod->Algorithm = (char*)ds_sha224URI; break; case SOAP_SMD_SHA256: reference->DigestMethod->Algorithm = (char*)ds_sha256URI; break; case SOAP_SMD_SHA384: reference->DigestMethod->Algorithm = (char*)ds_sha384URI; break; case SOAP_SMD_SHA512: reference->DigestMethod->Algorithm = (char*)ds_sha512URI; break; #endif default: return soap_wsse_fault(soap, wsse__UnsupportedAlgorithm, "SHA224/256/384/512 requires OpenSSL 0.9.8"); } /* populate the DigestValue element */ reference->DigestValue = soap_s2base64(soap, (unsigned char*)HA, NULL, soap_smd_size(alg, NULL)); if (!reference->DigestValue) return soap->error; /* add the fresh new reference to the array */ signedInfo->Reference[signedInfo->__sizeReference] = reference; signedInfo->__sizeReference++; return SOAP_OK; } /** @fn int soap_wsse_add_SignedInfo_SignatureMethod(struct soap *soap, const char *method, int canonical) @brief Adds SignedInfo element with SignatureMethod. @param soap context @param[in] method is the URI of the signature algorithm (e.g. ds_rsa_sha1) @param[in] canonical flag indicating that SignedInfo is signed in exc-c14n form @return SOAP_OK */ int soap_wsse_add_SignedInfo_SignatureMethod(struct soap *soap, const char *method, int canonical) { ds__SignedInfoType *signedInfo = soap_wsse_add_SignedInfo(soap); DBGFUN2("soap_wsse_add_SignedInfo_SignatureMethod", "method=%s", method?method:"", "canonical=%d", canonical); /* if signed in exc-c14n form, populate CanonicalizationMethod element */ signedInfo->CanonicalizationMethod = (ds__CanonicalizationMethodType*)soap_malloc(soap, sizeof(ds__CanonicalizationMethodType)); if (!signedInfo->CanonicalizationMethod) return soap->error = SOAP_EOM; soap_default_ds__CanonicalizationMethodType(soap, signedInfo->CanonicalizationMethod); if (canonical) signedInfo->CanonicalizationMethod->Algorithm = (char*)c14n_URI; /* populate SignatureMethod element */ signedInfo->SignatureMethod = (ds__SignatureMethodType*)soap_malloc(soap, sizeof(ds__SignatureMethodType)); if (!signedInfo->SignatureMethod) return soap->error = SOAP_EOM; soap_default_ds__SignatureMethodType(soap, signedInfo->SignatureMethod); signedInfo->SignatureMethod->Algorithm = (char*)method; return SOAP_OK; } /** @fn ds__SignedInfoType* soap_wsse_SignedInfo(struct soap *soap) @brief Returns SignedInfo element if present. @param soap context @return ds__SignedInfoType object or NULL */ struct ds__SignedInfoType* soap_wsse_SignedInfo(struct soap *soap) { ds__SignatureType *signature = soap_wsse_Signature(soap); if (signature) return signature->SignedInfo; return NULL; } /** @fn int soap_wsse_get_SignedInfo_SignatureMethod(struct soap *soap, int *alg, int *bits) @brief Get SignatureMethod algorithm @param soap context @param[out] alg is a signature algorithm, such as SOAP_SMD_HMAC_SHA1/224/256/384/512, SOAP_SMD_VRFY_DSA_SHA1/256, SOAP_SMD_VRFY_RSA_SHA1/224/256/384/512 or SOAP_SMD_ECDSA_SHA1/224/256/384/512 @param[out] bits is set to HMACOutputLength if present and valid, 0 otherwise @return SOAP_OK or SOAP_FAULT with wsse:UnsupportedAlgorithm, wsse:FailedCheck, or wsse__InvalidSecurity fault */ int soap_wsse_get_SignedInfo_SignatureMethod(struct soap *soap, int *alg, int *bits) { ds__SignedInfoType *signedInfo = soap_wsse_SignedInfo(soap); DBGFUN("soap_wsse_get_SignedInfo_SignatureMethod"); *alg = SOAP_SMD_NONE; *bits = 0; /* if we have a SignedInfo element, get the algorithm */ if (signedInfo && signedInfo->SignatureMethod && signedInfo->SignatureMethod->Algorithm) { const char *method = signedInfo->SignatureMethod->Algorithm; if (!strcmp(method, ds_hmac_sha1URI)) *alg = SOAP_SMD_HMAC_SHA1; else if (!strcmp(method, ds_hmac_sha224URI)) *alg = SOAP_SMD_HMAC_SHA224; else if (!strcmp(method, ds_hmac_sha256URI)) *alg = SOAP_SMD_HMAC_SHA256; else if (!strcmp(method, ds_hmac_sha384URI)) *alg = SOAP_SMD_HMAC_SHA384; else if (!strcmp(method, ds_hmac_sha512URI)) *alg = SOAP_SMD_HMAC_SHA512; else if (!strcmp(method, ds_dsa_sha1URI)) *alg = SOAP_SMD_VRFY_DSA_SHA1; else if (!strcmp(method, ds_dsa_sha256URI)) *alg = SOAP_SMD_VRFY_DSA_SHA256; else if (!strcmp(method, ds_rsa_sha1URI)) *alg = SOAP_SMD_VRFY_RSA_SHA1; else if (!strcmp(method, ds_rsa_sha224URI)) *alg = SOAP_SMD_VRFY_RSA_SHA224; else if (!strcmp(method, ds_rsa_sha256URI)) *alg = SOAP_SMD_VRFY_RSA_SHA256; else if (!strcmp(method, ds_rsa_sha384URI)) *alg = SOAP_SMD_VRFY_RSA_SHA384; else if (!strcmp(method, ds_rsa_sha512URI)) *alg = SOAP_SMD_VRFY_RSA_SHA512; else if (!strcmp(method, ds_ecdsa_sha1URI)) *alg = SOAP_SMD_VRFY_ECDSA_SHA1; else if (!strcmp(method, ds_ecdsa_sha224URI)) *alg = SOAP_SMD_VRFY_ECDSA_SHA224; else if (!strcmp(method, ds_ecdsa_sha256URI)) *alg = SOAP_SMD_VRFY_ECDSA_SHA256; else if (!strcmp(method, ds_ecdsa_sha384URI)) *alg = SOAP_SMD_VRFY_ECDSA_SHA384; else if (!strcmp(method, ds_ecdsa_sha512URI)) *alg = SOAP_SMD_VRFY_ECDSA_SHA512; else return soap_wsse_fault(soap, wsse__UnsupportedAlgorithm, method); if (signedInfo->SignatureMethod->HMACOutputLength) { if ((*alg & SOAP_SMD_ALGO) != SOAP_SMD_HMAC) return soap_wsse_fault(soap, wsse__InvalidSecurity, "Invalid SignatureMethod HMACOutputLength"); *bits = *signedInfo->SignatureMethod->HMACOutputLength; if (*bits < (int)(4 * soap_smd_size(*alg, NULL)) || *bits > (int)(8 * soap_smd_size(*alg, NULL))) return soap_wsse_fault(soap, wsse__InvalidSecurity, "Invalid SignatureMethod HMACOutputLength"); } return SOAP_OK; } return soap_wsse_fault(soap, wsse__FailedCheck, "Signature required"); } /******************************************************************************\ * * ds:Signature/SignatureValue * \******************************************************************************/ /** @fn int soap_wsse_add_SignatureValue(struct soap *soap, int alg, const void *key, int keylen) @brief Adds SignedInfo/SignatureMethod element, signs the SignedInfo element, and adds the resulting SignatureValue element. @param soap context @param[in] alg is SOAP_SMD_HMAC_SHA1/224/256/384/512, SOAP_SMD_SIGN_DSA_SHA1/256, SOAP_SMD_SIGN_RSA_SHA1/224/256/384/512, or SOAP_SMD_SIGN_ECDSA_SHA1/224/256/384/512 @param[in] key to use to sign (HMAC or DSA/RSA/ECDSA EVP_PKEY) @param[in] keylen length of HMAC key @return SOAP_OK, SOAP_EOM, or fault To sign the SignedInfo element with this function, populate SignedInfo with Reference elements first using soap_wsse_add_SignedInfo_Reference. The SignedInfo element must not be modified after signing. The SOAP_XML_INDENT and SOAP_XML_CANONICAL flags are used to serialize the SignedInfo to compute the signature. */ int soap_wsse_add_SignatureValue(struct soap *soap, int alg, const void *key, int keylen) { ds__SignatureType *signature = soap_wsse_add_Signature(soap); const char *method = NULL; char *sig; int siglen; int err; const char *c14ninclude = soap->c14ninclude; DBGFUN1("soap_wsse_add_SignatureValue", "alg=%x", alg); /* determine signature algorithm to use */ switch (alg) { case SOAP_SMD_HMAC_SHA1: method = ds_hmac_sha1URI; break; #if (OPENSSL_VERSION_NUMBER >= 0x0090800fL) case SOAP_SMD_HMAC_SHA224: method = ds_hmac_sha224URI; break; case SOAP_SMD_HMAC_SHA256: method = ds_hmac_sha256URI; break; case SOAP_SMD_HMAC_SHA384: method = ds_hmac_sha384URI; break; case SOAP_SMD_HMAC_SHA512: method = ds_hmac_sha512URI; break; #endif case SOAP_SMD_SIGN_DSA_SHA1: method = ds_dsa_sha1URI; break; #if (OPENSSL_VERSION_NUMBER >= 0x0090800fL) case SOAP_SMD_SIGN_DSA_SHA256: method = ds_dsa_sha256URI; break; #endif case SOAP_SMD_SIGN_RSA_SHA1: method = ds_rsa_sha1URI; break; #if (OPENSSL_VERSION_NUMBER >= 0x0090800fL) case SOAP_SMD_SIGN_RSA_SHA224: method = ds_rsa_sha224URI; break; case SOAP_SMD_SIGN_RSA_SHA256: method = ds_rsa_sha256URI; break; case SOAP_SMD_SIGN_RSA_SHA384: method = ds_rsa_sha512URI; break; case SOAP_SMD_SIGN_RSA_SHA512: method = ds_rsa_sha512URI; break; #endif case SOAP_SMD_SIGN_ECDSA_SHA1: method = ds_ecdsa_sha1URI; break; #if (OPENSSL_VERSION_NUMBER >= 0x0090800fL) case SOAP_SMD_SIGN_ECDSA_SHA224: method = ds_ecdsa_sha224URI; break; case SOAP_SMD_SIGN_ECDSA_SHA256: method = ds_ecdsa_sha256URI; break; case SOAP_SMD_SIGN_ECDSA_SHA384: method = ds_ecdsa_sha512URI; break; case SOAP_SMD_SIGN_ECDSA_SHA512: method = ds_ecdsa_sha512URI; break; #endif default: return soap_wsse_fault(soap, wsse__UnsupportedAlgorithm, "Unsupported algorithm or algorithm requires OpenSSL 0.9.8"); } /* populate SignedInfo/SignatureMethod based on SOAP_XML_CANONICAL flag */ soap_wsse_add_SignedInfo_SignatureMethod(soap, method, (soap->mode & SOAP_XML_CANONICAL)); /* use the gSOAP engine's look-aside buffer to temporarily hold the sig */ if (soap_store_lab(soap, NULL, soap_smd_size(alg, key))) return soap->error = SOAP_EOM; sig = soap->labbuf; /* we will serialize SignedInfo as it appears exactly in the SOAP Header */ soap->part = SOAP_IN_HEADER; /* set indent level for XML SignedInfo as it appears in the SOAP Header */ soap->level = 4; /* prevent xmlns:ds namespace inclusion when non-exclusive is used */ if (!(soap->mode & SOAP_XML_CANONICAL)) soap_push_namespace(soap, "ds", ds_URI); soap->c14ninclude = NULL; /* use smdevp engine to sign SignedInfo */ err = soap_smd_begin(soap, alg, key, keylen); if (!err) err = soap_out_ds__SignedInfoType(soap, "ds:SignedInfo", 0, signature->SignedInfo, NULL); soap->c14ninclude = c14ninclude; if (soap_smd_end(soap, sig, &siglen) || err) return soap_wsse_fault(soap, wsse__InvalidSecurity, "Could not sign"); /* populate the SignatureValue element */ signature->SignatureValue = soap_s2base64(soap, (unsigned char*)sig, NULL, siglen); if (!signature->SignatureValue) return soap->error; return SOAP_OK; } /** @fn int soap_wsse_verify_SignatureValue(struct soap *soap, int alg, const void *key, int keylen) @brief Verifies the SignatureValue of a SignedInfo element. @param soap context @param[in] alg is a signature algorith, such as SOAP_SMD_HMAC_SHA1/224/256/384/512, SOAP_SMD_VRFY_DSA_SHA1/256, SOAP_SMD_VRFY_RSA_SHA1/224/256/384/512 or SOAP_SMD_VRFY_ECDSA_SHA1/224/256/384/512 determined by the SignedInfo/SignatureMethod @param[in] key to use to verify (HMAC or DSA/RSA/ECDSA EVP_PKEY) @param[in] keylen length of HMAC key @return SOAP_OK, SOAP_EOM, or fault This function searches for the SignedInfo element in the soap->dom DOM tree to verify the signature in the SignatureValue element. Using the DOM ensures we will verify the signature of a SignedInfo as it was exactly received by the parser, by using the -DWITH_DOM compile flag and SOAP_XML_DOM runtime flag. If there is no DOM, it verifies the signature of the deserialized SignedInfo element in the SOAP Header. However, serializing deserialized data may change the octet stream that was signed, unless we're using gSOAP as producers and consumers (with the SOAP_XML_INDENT flag reset). */ int soap_wsse_verify_SignatureValue(struct soap *soap, int alg, const void *key, int keylen) { ds__SignatureType *signature = soap_wsse_Signature(soap); DBGFUN1("soap_wsse_verify_SignatureValue", "alg=%x", alg); /* always need an HMAC secret key or DSA/RSA public key to verify */ if (!key) return soap_wsse_fault(soap, wsse__SecurityTokenUnavailable, NULL); /* verify the SignedInfo element with the SignatureValue element */ if (signature && signature->SignedInfo && signature->SignatureValue) { char *sig; const char *sigval; int method, bits, siglen, sigvallen; /* check that we are using the intended signature algorithm */ if (soap_wsse_get_SignedInfo_SignatureMethod(soap, &method, &bits)) return soap->error; if (alg != method) return soap_wsse_fault(soap, wsse__FailedCheck, "Incorrect signature algorithm used"); /* retrieve the signature */ sigval = soap_base642s(soap, signature->SignatureValue, NULL, 0, &sigvallen); /* search the DOM for SignedInfo */ if (soap->dom) { struct soap_dom_element *elt; /* traverse the DOM while searching for SignedInfo in the ds namespace */ for (elt = soap->dom; elt; elt = soap_dom_next_element(elt, NULL)) { if (elt->name && elt->nstr && !strcmp(elt->nstr, ds_URI) && (!strcmp(elt->name, "SignedInfo") || !soap_tag_cmp(elt->name, "*:SignedInfo"))) break; } /* found it? */ if (elt) { int err = SOAP_OK; const char *c14ninclude = soap->c14ninclude; /* should not include leading whitespace in signature verification */ elt->lead = NULL; /* use smdevp engine to verify SignedInfo */ if ((alg & SOAP_SMD_ALGO) == SOAP_SMD_HMAC) sig = (char*)soap_malloc(soap, soap_smd_size(alg, key)); else { sig = (char*)sigval; siglen = sigvallen; } if (signature->SignedInfo->CanonicalizationMethod && signature->SignedInfo->CanonicalizationMethod->Algorithm && !strcmp(signature->SignedInfo->CanonicalizationMethod->Algorithm, c14n_URI)) { struct soap_dom_element *prt; struct soap_dom_attribute *att; if (signature->SignedInfo->CanonicalizationMethod->c14n__InclusiveNamespaces) soap->c14ninclude = signature->SignedInfo->CanonicalizationMethod->c14n__InclusiveNamespaces->PrefixList; else soap->c14ninclude = NULL; /* recanonicalize DOM while keeping content "as is" */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Verifying signed canonicalized DOM with C14N prefix list '%s'\n", soap->c14ninclude ? soap->c14ninclude : "")); soap->mode &= ~SOAP_XML_DOM; soap->mode |= SOAP_XML_CANONICAL | SOAP_DOM_ASIS; err = soap_smd_begin(soap, alg, key, keylen); /* emit all xmlns attributes of ancestors */ while (soap->nlist) { struct soap_nlist *np = soap->nlist->next; SOAP_FREE(soap, soap->nlist); soap->nlist = np; } /* push xmlns:ns="..." */ for (prt = elt->prnt; prt; prt = prt->prnt) { for (att = prt->atts; att; att = att->next) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM attribute = %s\n", att->name)); if (!strncmp(att->name, "xmlns:", 6) && !soap_lookup_ns(soap, att->name + 6, strlen(att->name + 6))) soap_attribute(soap, att->name, att->text); } } /* push xmlns="..." */ for (prt = elt->prnt; prt; prt = prt->prnt) { for (att = prt->atts; att; att = att->next) { if (!strcmp(att->name, "xmlns")) { soap_attribute(soap, att->name, att->text); break; } } } } else { /* compute digest over DOM "as is" */ soap->mode &= ~(SOAP_XML_CANONICAL | SOAP_XML_DOM); soap->mode |= SOAP_DOM_ASIS; err = soap_smd_begin(soap, alg, key, keylen); } /* do not dump namespace table xmlns bindings */ soap->ns = 2; /* compute digest */ soap->feltbegout = NULL; soap->feltendout = NULL; if (!err) err = soap_out_xsd__anyType(soap, NULL, 0, elt, NULL); soap->c14ninclude = c14ninclude; if (soap_smd_end(soap, sig, &siglen) || err) return soap_wsse_fault(soap, wsse__FailedCheck, "The signed SignedInfo SignatureValue is invalid"); if ((alg & SOAP_SMD_ALGO) == SOAP_SMD_HMAC) { if (bits == 0) { if (siglen != sigvallen || memcmp(sig, sigval, siglen)) return soap_wsse_fault(soap, wsse__FailedCheck, "The HMAC-signed SignedInfo is invalid"); } else if (bits > 8 * siglen || memcmp(sig, sigval, 8 * bits)) return soap_wsse_fault(soap, wsse__FailedCheck, "The HMAC-signed SignedInfo is invalid"); } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Signature in DOM is valid\n")); return SOAP_OK; } } else { int err = SOAP_OK; const char *c14nexclude = soap->c14nexclude; const char *c14ninclude = soap->c14ninclude; soap_mode mode = soap->mode; short part = soap->part; /* serialize the SignedInfo element as it appeared in the SOAP Header */ soap->level = 4; soap->c14nexclude = "ds"; soap->c14ninclude = NULL; soap->part = SOAP_IN_HEADER; /* header encoding rules (literal) */ if (signature->SignedInfo->CanonicalizationMethod) soap->mode |= SOAP_XML_CANONICAL; else soap->mode &= ~SOAP_XML_CANONICAL; if ((alg & SOAP_SMD_ALGO) == SOAP_SMD_HMAC) sig = (char*)soap_malloc(soap, soap_smd_size(alg, key)); else { sig = (char*)sigval; siglen = sigvallen; } err = soap_smd_begin(soap, alg, key, keylen); if (!err) err = soap_out_ds__SignedInfoType(soap, "ds:SignedInfo", 0, signature->SignedInfo, NULL); soap->mode = mode; soap->c14nexclude = c14nexclude; soap->c14ninclude = c14ninclude; soap->part = part; if (soap_smd_end(soap, sig, &siglen) || err) return soap_wsse_fault(soap, wsse__FailedCheck, "The signed serialized SignedInfo SignatureValue is invalid"); if ((alg & SOAP_SMD_ALGO) == SOAP_SMD_HMAC) { if (bits == 0) { if (siglen != sigvallen || memcmp(sig, sigval, siglen)) return soap_wsse_fault(soap, wsse__FailedCheck, "The HMAC-signed serialized SignedInfo is invalid"); } else if (bits > 8 * siglen || memcmp(sig, sigval, 8 * bits)) return soap_wsse_fault(soap, wsse__FailedCheck, "The HMAC-signed serialized SignedInfo is invalid"); } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Signature is valid\n")); return SOAP_OK; } } return soap_wsse_fault(soap, wsse__FailedCheck, "SignedInfo required"); } /** @fn int soap_wsse_verify_SignedInfo(struct soap *soap) @brief Verifies the digest values of the XML elements referenced by the SignedInfo References. @param soap context @return SOAP_OK or fault This function searches for the SignedInfo element in the soap->dom DOM tree to verify the digests contained therein. Using the DOM ensures we will verify the digests of the locally signed elements as they were exactly received by the parser, by using the -DWITH_DOM compile flag and SOAP_XML_DOM runtime flag. If there is no DOM, the function fails. */ int soap_wsse_verify_SignedInfo(struct soap *soap) { ds__SignedInfoType *signedInfo = soap_wsse_SignedInfo(soap); DBGFUN("soap_wsse_verify_SignedInfo"); if (signedInfo) { int i; /* must have at least one reference element */ if (signedInfo->__sizeReference == 0) return soap_wsse_fault(soap, wsse__InvalidSecurity, "Missing SignedInfo/Reference"); /* As an alternative to the current implementatin, this might be a good place to re-canonicalize the entire DOM to improve interop. Two DOMs can be used: one with non-c14n XML and one with c14n XML so we can handle multiple different transforms. */ /* for each reference element, check the digest */ for (i = 0; i < signedInfo->__sizeReference; i++) { ds__ReferenceType *reference = signedInfo->Reference[i]; /* reference element is complete? */ if (!reference->URI || !reference->DigestMethod || !reference->DigestMethod->Algorithm || !reference->DigestValue) return soap_wsse_fault(soap, wsse__InvalidSecurity, "Incomplete SignedInfo/Reference"); /* reference is local? */ if (*reference->URI == '#') { int alg, canonical; const char *c14ninclude = soap->c14ninclude; unsigned char hash[SOAP_SMD_MAX_SIZE]; /* digest algorithm */ if (!strcmp(reference->DigestMethod->Algorithm, ds_sha1URI)) alg = SOAP_SMD_DGST_SHA1; #if (OPENSSL_VERSION_NUMBER >= 0x0090800fL) else if (!strcmp(reference->DigestMethod->Algorithm, ds_sha224URI)) alg = SOAP_SMD_DGST_SHA224; else if (!strcmp(reference->DigestMethod->Algorithm, ds_sha256URI)) alg = SOAP_SMD_DGST_SHA256; else if (!strcmp(reference->DigestMethod->Algorithm, ds_sha384URI)) alg = SOAP_SMD_DGST_SHA384; else if (!strcmp(reference->DigestMethod->Algorithm, ds_sha512URI)) alg = SOAP_SMD_DGST_SHA512; #endif else return soap_wsse_fault(soap, wsse__UnsupportedAlgorithm, reference->DigestMethod->Algorithm); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Verifying digest of locally referenced data %s alg=%x\n", reference->URI, alg)); /* if reference has a transform, it should be an exc-c14n transform */ if (reference->Transforms) { if (reference->Transforms->__sizeTransform != 1 || !reference->Transforms->Transform[0].Algorithm || strcmp(reference->Transforms->Transform[0].Algorithm, c14n_URI)) return soap_wsse_fault(soap, wsse__UnsupportedAlgorithm, reference->Transforms->Transform[0].Algorithm); canonical = 1; if (reference->Transforms->Transform[0].c14n__InclusiveNamespaces) soap->c14ninclude = reference->Transforms->Transform[0].c14n__InclusiveNamespaces->PrefixList; else soap->c14ninclude = NULL; } else canonical = 0; /* convert base64 digest to binary */ soap_base642s(soap, reference->DigestValue, (char*)hash, SOAP_SMD_MAX_SIZE, NULL); /* verify the digest of a locally signed element */ if (soap_wsse_verify_digest(soap, alg, canonical, reference->URI + 1, hash)) return soap->error; soap->c14ninclude = c14ninclude; } } return SOAP_OK; } return soap_wsse_fault(soap, wsse__InvalidSecurity, "Missing SignedInfo"); } /** @fn int soap_wsse_verify_digest(struct soap *soap, int alg, int canonical, const char *id, unsigned char hash[SOAP_SMD_MAX_SIZE]) @brief Verifies the digest value of an XML element referenced by id against the hash. @param soap context @param[in] alg digest algorithm @param[in] canonical flag indicating that element is signed in exc-c14n form @param[in] id string of the XML element to verify @param[in] hash digest value to verify against @return SOAP_OK or fault */ int soap_wsse_verify_digest(struct soap *soap, int alg, int canonical, const char *id, unsigned char hash[SOAP_SMD_MAX_SIZE]) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); struct soap_dom_element *elt, *dom = NULL; DBGFUN3("soap_wsse_verify_digest", "alg=%x", alg, "canonical=%d", canonical, "id=%s", id); if (!data) return soap_set_receiver_error(soap, "soap_wsse_verify_digest", "Plugin not registered", SOAP_PLUGIN_ERROR); /* traverse the DOM to find the element with matching wsu:Id or ds:Id */ for (elt = soap->dom; elt; elt = soap_dom_next_element(elt, NULL)) { struct soap_dom_attribute *att; for (att = elt->atts; att; att = att->next) { /* check attribute */ if (att->name && att->nstr && (!strcmp(att->nstr, wsu_URI) || !strcmp(att->nstr, ds_URI)) && (!strcmp(att->name, "Id") || !soap_tag_cmp(att->name, "*:Id"))) { /* found a match, compare attribute value with id */ if (att->text && !strcmp(att->text, id)) { if (dom) return soap_wsse_fault(soap, wsse__FailedCheck, "SignedInfo duplicate Id"); dom = elt; /* elt = NULL; break; */ /* improves speed but skips duplicate Id check */ } } } } if (dom) { unsigned char HA[SOAP_SMD_MAX_SIZE]; int len, err = SOAP_OK; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Computing digest for Id=%s\n", id)); /* do not hash leading whitespace */ dom->lead = NULL; /* canonical or as-is? */ if (canonical) { struct soap_dom_element *prt; struct soap_dom_attribute *att; soap->mode |= SOAP_XML_CANONICAL | SOAP_DOM_ASIS; err = soap_smd_begin(soap, alg, NULL, 0); /* emit all xmlns attributes of ancestors */ while (soap->nlist) { struct soap_nlist *np = soap->nlist->next; SOAP_FREE(soap, soap->nlist); soap->nlist = np; } for (prt = dom->prnt; prt; prt = prt->prnt) { for (att = prt->atts; att; att = att->next) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM attribute = %s\n", att->name)); if (!strncmp(att->name, "xmlns:", 6) && !soap_lookup_ns(soap, att->name + 6, strlen(att->name + 6))) soap_attribute(soap, att->name, att->text); } } for (prt = dom->prnt; prt; prt = prt->prnt) { for (att = prt->atts; att; att = att->next) { if (!strcmp(att->name, "xmlns")) { soap_attribute(soap, att->name, att->text); break; } } } } else { /* compute digest over DOM "as is" */ soap->mode &= ~SOAP_XML_CANONICAL; soap->mode |= SOAP_DOM_ASIS; err = soap_smd_begin(soap, alg, NULL, 0); } /* do not dump namespace table xmlns bindings */ soap->ns = 2; /* compute digest */ soap->feltbegout = NULL; soap->feltendout = NULL; if (!err) err = soap_out_xsd__anyType(soap, NULL, 0, dom, NULL); if (soap_smd_end(soap, (char*)HA, &len) || err) return soap_wsse_fault(soap, wsse__FailedCheck, "Digest computation failed"); /* compare digests, success if identical */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Comparing digest hashes\n")); DBGHEX(TEST, hash, len); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n--\n")); DBGHEX(TEST, HA, len); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n")); if (!memcmp(hash, HA, (size_t)len)) return SOAP_OK; return soap_wsse_fault(soap, wsse__FailedCheck, NULL); } if (data->vrfy_alg & SOAP_WSSE_IGNORE_EXTRA_REFS) return SOAP_OK; return soap_wsse_fault(soap, wsse__FailedCheck, "SignedInfo reference URI target not found"); } /******************************************************************************\ * * ds:Signature/KeyInfo * \******************************************************************************/ /** @fn ds__KeyInfoType* soap_wsse_add_KeyInfo(struct soap *soap) @brief Adds KeyInfo element. @param soap context @return ds__KeyInfo object */ struct ds__KeyInfoType* soap_wsse_add_KeyInfo(struct soap *soap) { ds__SignatureType *signature = soap_wsse_add_Signature(soap); if (!signature->KeyInfo) { signature->KeyInfo = (ds__KeyInfoType*)soap_malloc(soap, sizeof(ds__KeyInfoType)); if (!signature->KeyInfo) return NULL; } soap_default_ds__KeyInfoType(soap, signature->KeyInfo); return signature->KeyInfo; } /** @fn ds__KeyInfoType* soap_wsse_KeyInfo(struct soap *soap) @brief Returns KeyInfo element if present. @param soap context @return ds__KeyInfo object or NULL */ struct ds__KeyInfoType* soap_wsse_KeyInfo(struct soap *soap) { ds__SignatureType *signature = soap_wsse_Signature(soap); if (signature) return signature->KeyInfo; return NULL; } /******************************************************************************\ * * ds:Signature/KeyInfo/KeyName * \******************************************************************************/ /** @fn int soap_wsse_add_KeyInfo_KeyName(struct soap *soap, const char *name) @brief Adds KeyName element. @param soap context @param[in] name string of the KeyName @return SOAP_OK @note The recommended method to add Key information is to utilize KeyIdentifier instead of KeyName. A KeyName is useful mainly for internal use. */ int soap_wsse_add_KeyInfo_KeyName(struct soap *soap, const char *name) { ds__KeyInfoType *keyInfo = soap_wsse_add_KeyInfo(soap); DBGFUN1("soap_wsse_add_KeyInfo_KeyName", "name=%s", name); /* populate the KeyName element */ keyInfo->KeyName = soap_strdup(soap, name); return SOAP_OK; } /** @fn int soap_wsse_get_KeyInfo_KeyName(struct soap *soap) @brief Returns KeyName element if present. @param soap context @return string or NULL */ const char* soap_wsse_get_KeyInfo_KeyName(struct soap *soap) { ds__KeyInfoType *keyInfo = soap_wsse_KeyInfo(soap); DBGFUN("soap_wsse_get_KeyInfo_KeyName"); if (!keyInfo) return NULL; return keyInfo->KeyName; } /******************************************************************************\ * * ds:Signature/KeyInfo/wsse:SecurityTokenReference/Reference/@URI * \******************************************************************************/ /** @fn int soap_wsse_add_KeyInfo_SecurityTokenReferenceURI(struct soap *soap, const char *URI, const char *valueType) @brief Adds KeyInfo element with SecurityTokenReference URI. @param soap context @param[in] URI string referencing a security token @param[in] valueType string or NULL @return SOAP_OK */ int soap_wsse_add_KeyInfo_SecurityTokenReferenceURI(struct soap *soap, const char *URI, const char *valueType) { ds__KeyInfoType *keyInfo = soap_wsse_add_KeyInfo(soap); DBGFUN2("soap_wsse_add_KeyInfo_SecurityTokenReferenceURI", "URI=%s", URI?URI:"", "valueType=%s", valueType?valueType:""); /* allocate SecurityTokenReference element if we don't have one already */ if (!keyInfo->wsse__SecurityTokenReference) { keyInfo->wsse__SecurityTokenReference = (_wsse__SecurityTokenReference*)soap_malloc(soap, sizeof(_wsse__SecurityTokenReference)); if (!keyInfo->wsse__SecurityTokenReference) return soap->error = SOAP_EOM; } soap_default__wsse__SecurityTokenReference(soap, keyInfo->wsse__SecurityTokenReference); /* allocate Reference element */ keyInfo->wsse__SecurityTokenReference->Reference = (_wsse__Reference*)soap_malloc(soap, sizeof(_wsse__Reference)); soap_default__wsse__Reference(soap, keyInfo->wsse__SecurityTokenReference->Reference); /* populate the Reference element */ keyInfo->wsse__SecurityTokenReference->Reference->URI = soap_strdup(soap, URI); keyInfo->wsse__SecurityTokenReference->Reference->ValueType = soap_strdup(soap, valueType); return SOAP_OK; } /** @fn int soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(struct soap *soap, const char *URI) @brief Adds KeyInfo element with SecurityTokenReference URI to an X509 cert. @param soap context @param[in] URI string referencing an X509 certificate @return SOAP_OK */ int soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(struct soap *soap, const char *URI) { return soap_wsse_add_KeyInfo_SecurityTokenReferenceURI(soap, URI, wsse_X509v3URI); } /** @fn const char* soap_wsse_get_KeyInfo_SecurityTokenReferenceURI(struct soap *soap) @brief Returns a SecurityTokenReference URI if present. @param soap context @return string or NULL */ const char* soap_wsse_get_KeyInfo_SecurityTokenReferenceURI(struct soap *soap) { ds__KeyInfoType *keyInfo = soap_wsse_KeyInfo(soap); if (keyInfo && keyInfo->wsse__SecurityTokenReference && keyInfo->wsse__SecurityTokenReference->Reference) return keyInfo->wsse__SecurityTokenReference->Reference->URI; return NULL; } /** @fn const char* soap_wsse_get_KeyInfo_SecurityTokenReferenceValueType(struct soap *soap) @brief Returns a SecurityTokenReference ValueType if present. @param soap context @return string or NULL */ const char* soap_wsse_get_KeyInfo_SecurityTokenReferenceValueType(struct soap *soap) { ds__KeyInfoType *keyInfo = soap_wsse_KeyInfo(soap); if (keyInfo && keyInfo->wsse__SecurityTokenReference && keyInfo->wsse__SecurityTokenReference->Reference) return keyInfo->wsse__SecurityTokenReference->Reference->ValueType; return NULL; } /** @fn X509* soap_wsse_get_KeyInfo_SecurityTokenReferenceX509(struct soap *soap) @brief Returns a X509 certificate if present as a BinarySecurity token. This call must be followed by an X509_free to deallocate the X509 certificate data. @param soap context @return X509 object or NULL with wsse:SecurityTokenUnavailable fault */ X509* soap_wsse_get_KeyInfo_SecurityTokenReferenceX509(struct soap *soap) { const char *URI = soap_wsse_get_KeyInfo_SecurityTokenReferenceURI(soap); X509 *cert = NULL; DBGFUN("soap_wsse_get_KeyInfo_SecurityTokenReferenceX509"); if (URI && *URI == '#') { const char *valueType; valueType = soap_wsse_get_KeyInfo_SecurityTokenReferenceValueType(soap); if (!valueType || !strcmp(valueType, wsse_X509v3URI)) cert = soap_wsse_get_BinarySecurityTokenX509(soap, URI + 1); } return cert; } /** @fn struct ds__X509IssuerSerialType *soap_wsse_get_KeyInfo_SecurityTokenReferenceX509Data(struct soap *soap) @brief Returns ds__X509IssuerSerialType with non-NULL X509IssuerName and non-NULL X509SerialNumber of a X509Data element when present and set. @param soap context @return pointer to ds__X509IssuerSerialType struct or NULL */ struct ds__X509IssuerSerialType * soap_wsse_get_KeyInfo_SecurityTokenReferenceX509Data(struct soap *soap) { ds__KeyInfoType *keyInfo = soap_wsse_KeyInfo(soap); if (keyInfo && keyInfo->wsse__SecurityTokenReference && keyInfo->wsse__SecurityTokenReference->ds__X509Data && keyInfo->wsse__SecurityTokenReference->ds__X509Data->X509IssuerSerial && keyInfo->wsse__SecurityTokenReference->ds__X509Data->X509IssuerSerial->X509IssuerName && keyInfo->wsse__SecurityTokenReference->ds__X509Data->X509IssuerSerial->X509SerialNumber) return keyInfo->wsse__SecurityTokenReference->ds__X509Data->X509IssuerSerial; return NULL; } /******************************************************************************\ * * ds:Signature/KeyInfo/wsse:SecurityTokenReference/Reference/KeyIdentifier * \******************************************************************************/ /** @fn int soap_wsse_add_KeyInfo_SecurityTokenReferenceKeyIdentifier(struct soap *soap, const char *id, const char *valueType, unsigned char *data, int size) @brief Adds KeyInfo element with SecurityTokenReference/KeyIdentifier binary data @param soap context @param[in] id string for signature reference @param[in] valueType string @param[in] data binary data @param[in] size of binary data @return SOAP_OK */ int soap_wsse_add_KeyInfo_SecurityTokenReferenceKeyIdentifier(struct soap *soap, const char *id, const char *valueType, unsigned char *data, int size) { ds__KeyInfoType *keyInfo = soap_wsse_add_KeyInfo(soap); DBGFUN2("soap_wsse_add_KeyInfo_SecurityTokenReferenceKeyIdentifier", "id=%s", id?id:"", "valueType=%s", valueType?valueType:""); /* allocate SecurityTokenReference if we don't have one already */ if (!keyInfo->wsse__SecurityTokenReference) { keyInfo->wsse__SecurityTokenReference = (_wsse__SecurityTokenReference*)soap_malloc(soap, sizeof(_wsse__SecurityTokenReference)); if (!keyInfo->wsse__SecurityTokenReference) return soap->error = SOAP_EOM; } soap_default__wsse__SecurityTokenReference(soap, keyInfo->wsse__SecurityTokenReference); /* allocate KeyIdentifier */ keyInfo->wsse__SecurityTokenReference->KeyIdentifier = (_wsse__KeyIdentifier*)soap_malloc(soap, sizeof(_wsse__KeyIdentifier)); if (!keyInfo->wsse__SecurityTokenReference->KeyIdentifier) return soap->error = SOAP_EOM; soap_default__wsse__KeyIdentifier(soap, keyInfo->wsse__SecurityTokenReference->KeyIdentifier); /* populate KeyIdentifier */ keyInfo->wsse__SecurityTokenReference->KeyIdentifier->wsu__Id = soap_strdup(soap, id); keyInfo->wsse__SecurityTokenReference->KeyIdentifier->ValueType = soap_strdup(soap, valueType); keyInfo->wsse__SecurityTokenReference->KeyIdentifier->EncodingType = (char*)wsse_Base64BinaryURI; keyInfo->wsse__SecurityTokenReference->KeyIdentifier->__item = soap_s2base64(soap, data, NULL, size); return SOAP_OK; } /** @fn const char* soap_wsse_get_KeyInfo_SecurityTokenReferenceKeyIdentifierValueType(struct soap *soap) @brief Returns KeyInfo/SecurityTokenReference/KeyIdentifier/ValueType if present @param soap context @return string or NULL */ const char* soap_wsse_get_KeyInfo_SecurityTokenReferenceKeyIdentifierValueType(struct soap *soap) { ds__KeyInfoType *keyInfo = soap_wsse_KeyInfo(soap); DBGFUN("soap_wsse_get_KeyInfo_SecurityTokenReferenceKeyIdentifierValueType"); if (!keyInfo || !keyInfo->wsse__SecurityTokenReference || !keyInfo->wsse__SecurityTokenReference->KeyIdentifier) return NULL; return keyInfo->wsse__SecurityTokenReference->KeyIdentifier->ValueType; } /** @fn const unsigned char* soap_wsse_get_KeyInfo_SecurityTokenReferenceKeyIdentifier(struct soap *soap, int *size) @brief Returns KeyInfo/SecurityTokenReference/KeyIdentifier binary data @param soap context @param[out] size is set to the size of the decoded data @return data or NULL */ const unsigned char* soap_wsse_get_KeyInfo_SecurityTokenReferenceKeyIdentifier(struct soap *soap, int *size) { ds__KeyInfoType *keyInfo = soap_wsse_KeyInfo(soap); DBGFUN("soap_wsse_get_KeyInfo_SecurityTokenReferenceKeyIdentifier"); if (!keyInfo || !keyInfo->wsse__SecurityTokenReference || !keyInfo->wsse__SecurityTokenReference->KeyIdentifier) return NULL; return (unsigned char*)soap_base642s(soap, keyInfo->wsse__SecurityTokenReference->KeyIdentifier->__item, NULL, 0, size); } /******************************************************************************\ * * ds:Signature/KeyInfo/wsse:SecurityTokenReference/Reference/Embedded * \******************************************************************************/ /** @fn int soap_wsse_add_KeyInfo_SecurityTokenReferenceEmbedded(struct soap *soap, const char *id, const char *valueType) @brief Adds KeyInfo element with Embedded SecurityTokenReference. @param soap context @param[in] id string for signature reference @param[in] valueType string @return SOAP_OK @note This function does not add embedded tokens automatically. See code for comments. */ int soap_wsse_add_KeyInfo_SecurityTokenReferenceEmbedded(struct soap *soap, const char *id, const char *valueType) { ds__KeyInfoType *keyInfo = soap_wsse_add_KeyInfo(soap); DBGFUN("soap_wsse_get_KeyInfo_SecurityTokenReferenceEmbedded"); /* allocate SecurityTokenReference if we don't have one already */ if (!keyInfo->wsse__SecurityTokenReference) { keyInfo->wsse__SecurityTokenReference = (_wsse__SecurityTokenReference*)soap_malloc(soap, sizeof(_wsse__SecurityTokenReference)); if (!keyInfo->wsse__SecurityTokenReference) return soap->error = SOAP_EOM; } soap_default__wsse__SecurityTokenReference(soap, keyInfo->wsse__SecurityTokenReference); /* allocate Embedded element */ keyInfo->wsse__SecurityTokenReference->Embedded = (_wsse__Embedded*)soap_malloc(soap, sizeof(_wsse__Embedded)); if (!keyInfo->wsse__SecurityTokenReference->Embedded) return soap->error = SOAP_EOM; soap_default__wsse__Embedded(soap, keyInfo->wsse__SecurityTokenReference->Embedded); /* populate Embedded element */ keyInfo->wsse__SecurityTokenReference->Embedded->wsu__Id = soap_strdup(soap, id); keyInfo->wsse__SecurityTokenReference->Embedded->ValueType = soap_strdup(soap, valueType); /* TODO: Add embedded tokens and assertions. Could use DOM here? keyInfo->wsse__SecurityTokenReference->Embedded->xyz = ...; */ return SOAP_OK; } /******************************************************************************\ * * wsse:Security/xenc:EncryptedKey header element * \******************************************************************************/ /** @fn int soap_wsse_add_EncryptedKey(struct soap *soap, int alg, const char *URI, X509 *cert, const char *subjectkeyid, const char *issuer, const char *serial) @brief Adds EncryptedKey header element and initiates the encryption of the SOAP Body. @param soap context @param[in] alg algorithm to use, SOAP_MEC_ENV_ENC_DES_CBC etc. @param[in] URI a unique identifier for the key, required for interoperability @param[in] cert the X509 certificate with public key or NULL @param[in] subjectkeyid string identification of the subject which when set to non-NULL is used instead of embedding the public key in the message @param[in] issuer string to include SecurityTokenReference/X509Data @param[in] serial string to include SecurityTokenReference/X509Data @return SOAP_OK or error code This function adds the encrypted key or subject key ID to the WS-Security header and initiates encryption of the SOAP Body. An X509 certificate may be provided, or the subjectkeyid, or the issuer and serial number. The certificate is embedded in the WS-Security EncryptedKey header. If the subjectkeyid string is non-NULL the subject key ID is used in the EncryptedKey header instead of the X509 certificate content. */ int soap_wsse_add_EncryptedKey(struct soap *soap, int alg, const char *URI, X509 *cert, const char *subjectkeyid, const char *issuer, const char *serial) { return soap_wsse_add_EncryptedKey_encrypt_only(soap, alg, URI, cert, subjectkeyid, issuer, serial, NULL); } /** @fn int soap_wsse_add_EncryptedKey_encrypt_only(struct soap *soap, int alg, const char *URI, X509 *cert, const char *subjectkeyid, const char *issuer, const char *serial, const char *tags) @brief Adds EncryptedKey header element and initiates encryption of the given XML elements specified in the tags string. Should be used in combination with soap_wsse_set_wsu_id to set wsu:Id for given XML element tags. @param soap context @param[in] alg algorithm to use, SOAP_MEC_ENV_ENC_DES_CBC etc. @param[in] URI a unique identifier for the key, required for interoperability @param[in] cert the X509 certificate with public key or NULL @param[in] subjectkeyid string identification of the subject which when set to non-NULL is used instead of embedding the public key in the message @param[in] issuer string to include SecurityTokenReference/X509Data @param[in] serial string to include SecurityTokenReference/X509Data @param[in] tags space-separated string of element tag names to encrypt @return xenc__EncryptedKeyType object This function adds the encrypted key or subject key ID to the WS-Security header and initiates encryption of the SOAP Body. An X509 certificate may be provided, or the subjectkeyid, or the issuer and serial number. The certificate is embedded in the WS-Security EncryptedKey header. If the subjectkeyid string is non-NULL the subject key ID is used in the EncryptedKey header instead of the X509 certificate content. Only the XML elements given in the 'tags' string as wsu:Id attributed elements are encrypted. @warning Use @ref soap_wsse_add_EncryptedKey_encrypt_only only in combination with @ref soap_wsse_set_wsu_id with the tag names of the elements to be encrypted. OTHERWISE THE GIVEN XML ELEMENTS ARE NOT ENCRYPTED AND WILL BE SENT IN THE CLEAR. @warning The elements identified with @ref soap_wsse_set_wsu_id to encrypt MUST occur EXACTLY ONCE in the SOAP Body. @warning Encryption/decryption of elements with simple content (CDATA content) IS NOT SUPPORTED. This means that elements you want to encrypt with this function must have complex content. That is, only encrypt elements with sub elements or encrypt the entire SOAP Body. */ int soap_wsse_add_EncryptedKey_encrypt_only(struct soap *soap, int alg, const char *URI, X509 *cert, const char *subjectkeyid, const char *issuer, const char *serial, const char *tags) { EVP_PKEY *pubk; unsigned char *key; int keylen; _wsse__Security *security; struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); DBGFUN("soap_wsse_add_EncryptedKey"); if (!data) return soap_set_receiver_error(soap, "soap_wsse_add_EncryptedKey", "Plugin not registered", SOAP_PLUGIN_ERROR); security = soap_wsse_add_Security(soap); /* if we don't have a xenc:EncryptedKey, create one */ if (!security->xenc__EncryptedKey) { if (!(security->xenc__EncryptedKey = (xenc__EncryptedKeyType*)soap_malloc(soap, sizeof(xenc__EncryptedKeyType)))) return soap->error = SOAP_EOM; } soap_default_xenc__EncryptedKeyType(soap, security->xenc__EncryptedKey); security->xenc__EncryptedKey->Id = soap_strdup(soap, URI); if (!(security->xenc__EncryptedKey->EncryptionMethod = (xenc__EncryptionMethodType*)soap_malloc(soap, sizeof(struct xenc__EncryptionMethodType)))) return soap->error = SOAP_EOM; soap_default_xenc__EncryptionMethodType(soap, security->xenc__EncryptedKey->EncryptionMethod); /* RSA Version 1.5 or RSA-OAEP? */ alg |= (SOAP_MEC_ENV | SOAP_MEC_ENC); if (alg & SOAP_MEC_OAEP) { security->xenc__EncryptedKey->EncryptionMethod->Algorithm = (char*)xenc_rsaesURI; security->xenc__EncryptedKey->EncryptionMethod->OAEPparams = NULL; if (!(security->xenc__EncryptedKey->EncryptionMethod->ds__DigestMethod = (struct ds__DigestMethodType*)soap_malloc(soap, sizeof(struct ds__DigestMethodType)))) return soap->error = SOAP_EOM; soap_default_ds__DigestMethodType(soap, security->xenc__EncryptedKey->EncryptionMethod->ds__DigestMethod); security->xenc__EncryptedKey->EncryptionMethod->ds__DigestMethod->Algorithm = (char*)ds_sha1URI; } else security->xenc__EncryptedKey->EncryptionMethod->Algorithm = (char*)xenc_rsa15URI; /* KeyInfo */ if (!(security->xenc__EncryptedKey->ds__KeyInfo = (_ds__KeyInfo*)soap_malloc(soap, sizeof(_ds__KeyInfo)))) return soap->error = SOAP_EOM; soap_default__ds__KeyInfo(soap, security->xenc__EncryptedKey->ds__KeyInfo); /* allocate SecurityTokenReference */ if (!(security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference = (_wsse__SecurityTokenReference*)soap_malloc(soap, sizeof(_wsse__SecurityTokenReference)))) return soap->error = SOAP_EOM; soap_default__wsse__SecurityTokenReference(soap, security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference); if (issuer && serial) { if (!(security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->ds__X509Data = (struct ds__X509DataType*)soap_malloc(soap, sizeof(struct ds__X509DataType)))) return soap->error = SOAP_EOM; soap_default_ds__X509DataType(soap, security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->ds__X509Data); if (!(security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->ds__X509Data->X509IssuerSerial = (struct ds__X509IssuerSerialType*)soap_malloc(soap, sizeof(struct ds__X509IssuerSerialType)))) return soap->error = SOAP_EOM; soap_default_ds__X509IssuerSerialType(soap, security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->ds__X509Data->X509IssuerSerial); security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->ds__X509Data->X509IssuerSerial->X509IssuerName = soap_strdup(soap, issuer); security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->ds__X509Data->X509IssuerSerial->X509SerialNumber = soap_strdup(soap, serial); } else { /* allocate KeyIdentifier */ if (!(security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier = (_wsse__KeyIdentifier*)soap_malloc(soap, sizeof(_wsse__KeyIdentifier)))) return soap->error = SOAP_EOM; soap_default__wsse__KeyIdentifier(soap, security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier); /* populate KeyIdentifier */ security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier->EncodingType = (char*)wsse_Base64BinaryURI; if (subjectkeyid) { security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier->ValueType = (char*)wsse_X509v3SubjectKeyIdentifierURI; security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier->__item = soap_s2base64(soap, (unsigned char*)subjectkeyid, NULL, strlen(subjectkeyid)); } else if (cert) { unsigned char *der, *s; int derlen; security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier->ValueType = (char*)wsse_X509v3URI; /* determine the storage requirement */ derlen = i2d_X509(cert, NULL); if (derlen < 0) return soap_wsse_fault(soap, wsse__InvalidSecurityToken, "Invalid certificate passed to soap_wsse_add_EncryptedKey_encrypt_only"); /* use the gSOAP engine's look-aside buffer to temporarily hold the cert */ if (soap_store_lab(soap, NULL, derlen)) return SOAP_EOM; s = der = (unsigned char*)soap->labbuf; /* store in DER format */ i2d_X509(cert, &s); security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier->__item = soap_s2base64(soap, der, NULL, derlen); } } /* CipherData */ if (!(security->xenc__EncryptedKey->CipherData = (xenc__CipherDataType*)soap_malloc(soap, sizeof(struct xenc__CipherDataType)))) return soap->error = SOAP_EOM; soap_default_xenc__CipherDataType(soap, security->xenc__EncryptedKey->CipherData); /* get the public key */ pubk = X509_get_pubkey(cert); if (!pubk) return soap_wsse_fault(soap, wsse__InvalidSecurityToken, "Invalid certificate passed to soap_wsse_add_EncryptedKey_encrypt_only"); /* start encryption engine, get the encrypted secret key */ key = (unsigned char*)soap_malloc(soap, soap_mec_size(alg, pubk)); if (data->mec) soap_mec_cleanup(soap, data->mec); else data->mec = (struct soap_mec_data*)SOAP_MALLOC(soap, sizeof(struct soap_mec_data)); if (soap_mec_begin(soap, data->mec, alg, pubk, key, &keylen)) { EVP_PKEY_free(pubk); return soap->error; } EVP_PKEY_free(pubk); data->enco_alg = alg; data->enco_keyname = NULL; data->enco_key = key; data->enco_keylen = keylen; if (!(security->xenc__EncryptedKey->CipherData->CipherValue = soap_s2base64(soap, key, NULL, keylen))) return soap->error = SOAP_EOM; data->encid = soap_strdup(soap, tags); if (!tags) { soap->omode |= SOAP_SEC_WSUID; if (soap_wsse_add_EncryptedKey_DataReferenceURI(soap, "#Body")) return soap->error; } else { char *s, *t; size_t l = strlen(tags); /* make space to insert # to each id converted from a tag name */ t = (char*)soap_malloc(soap, l + 2); if (!t) return soap->error = SOAP_EOM; *t = '#'; soap_strcpy(t + 1, l + 1, tags); s = soap_wsse_ids(soap, t); if (!s) return soap->error = SOAP_EOM; s++; do { t = strchr(s, ' '); if (t) { *t = '\0'; while (*++t == ' ') ; } *--s = '#'; if (soap_wsse_add_EncryptedKey_DataReferenceURI(soap, s)) return soap->error; s = t; } while (s); } soap->feltbegout = soap_wsse_element_begin_out; soap->feltendout = soap_wsse_element_end_out; return SOAP_OK; } /** @fn int soap_wsse_verify_EncryptedKey(struct soap *soap) @brief Verifies the EncryptedKey header information (certificate validity requires soap->cacert to be set). Retrieves the decryption key from the token handler callback to decrypt the decryption key. @param soap context @return SOAP_OK or error code */ int soap_wsse_verify_EncryptedKey(struct soap *soap) { _wsse__Security *security = soap_wsse_Security(soap); struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); DBGFUN("soap_wsse_verify_EncryptedKey"); if (!data) return soap_set_receiver_error(soap, "soap_wsse_verify_EncryptedKey", "Plugin not registered", SOAP_PLUGIN_ERROR); /* if we have a xenc:EncryptedKey, check it and start envelope decryption */ if (security && security->xenc__EncryptedKey) { if (!security->xenc__EncryptedKey->EncryptionMethod || !security->xenc__EncryptedKey->EncryptionMethod->Algorithm) return soap_wsse_fault(soap, wsse__InvalidSecurity, "Invalid Encryption algorithm or key"); /* verify encrypted key */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Verify EncryptedKey alg=%x\n", data->deco_alg)); if (security->xenc__EncryptedKey->ds__KeyInfo) { int keylen; if (security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference && security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier && security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier->ValueType && security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier->__item) { if (!strcmp(security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier->ValueType, wsse_X509v3URI)) { X509 *cert = NULL; #if (OPENSSL_VERSION_NUMBER >= 0x0090800fL) const unsigned char *der; #else unsigned char *der; #endif int derlen; der = (unsigned char*)soap_base642s(soap, security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier->__item, NULL, 0, &derlen); if (!der) return soap_wsse_fault(soap, wsse__InvalidSecurity, "Invalid Encryption algorithm or key"); cert = d2i_X509(&cert, &der, derlen); if (soap_wsse_verify_X509(soap, cert)) { if (cert) X509_free(cert); return soap->error; } /* get the private key from subject name of cert, if not set */ if (!data->deco_key && data->security_token_handler) { char buf[1024]; X509_NAME_oneline(X509_get_subject_name(cert), buf, sizeof(buf)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Getting private key from cert name '%s' through security_token_handler callback\n", buf)); data->deco_alg = SOAP_MEC_ENV_DEC_DES_CBC; data->deco_key = data->security_token_handler(soap, &data->deco_alg, buf, &keylen); data->deco_keylen = 0; } if (cert) X509_free(cert); } else if (!data->deco_key && data->security_token_handler && !strcmp(security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier->ValueType, wsse_X509v3SubjectKeyIdentifierURI)) { int subjectkeyidlen; const char *subjectkeyid = (char*)soap_base642s(soap, security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier->__item, NULL, 0, &subjectkeyidlen); /* get the private key from subject key id */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Getting private key from key id '%s' through security_token_handler callback\n", subjectkeyid)); data->deco_alg = SOAP_MEC_ENV_DEC_DES_CBC; data->deco_key = data->security_token_handler(soap, &data->deco_alg, subjectkeyid, &keylen); data->deco_keylen = 0; } } else if (!data->deco_key && data->security_token_handler) { const char *name = NULL; /* get the private key from key name or subject name */ if (security->xenc__EncryptedKey->ds__KeyInfo->KeyName) name = security->xenc__EncryptedKey->ds__KeyInfo->KeyName; else if (security->xenc__EncryptedKey->ds__KeyInfo->X509Data && security->xenc__EncryptedKey->ds__KeyInfo->X509Data->X509SubjectName) name = security->xenc__EncryptedKey->ds__KeyInfo->X509Data->X509SubjectName; if (name) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Getting private key from name '%s' through security_token_handler callback\n", name)); data->deco_alg = SOAP_MEC_ENV_DEC_DES_CBC; data->deco_key = data->security_token_handler(soap, &data->deco_alg, name, &keylen); data->deco_keylen = 0; } } } /* start decryption */ if (data->deco_key && security->xenc__EncryptedKey->CipherData && security->xenc__EncryptedKey->CipherData->CipherValue) { int keylen; unsigned char *key = (unsigned char*)soap_base642s(soap, security->xenc__EncryptedKey->CipherData->CipherValue, NULL, 0, &keylen); if (!strcmp(security->xenc__EncryptedKey->EncryptionMethod->Algorithm, xenc_rsaesURI)) data->deco_alg |= SOAP_MEC_OAEP; else if (strcmp(security->xenc__EncryptedKey->EncryptionMethod->Algorithm, xenc_rsa15URI)) return soap_wsse_fault(soap, wsse__InvalidSecurity, "Invalid Encryption algorithm or key"); if (data->mec) soap_mec_cleanup(soap, data->mec); else data->mec = (struct soap_mec_data*)SOAP_MALLOC(soap, sizeof(struct soap_mec_data)); if (soap_mec_begin(soap, data->mec, data->deco_alg, (SOAP_MEC_KEY_TYPE*)data->deco_key, key, &keylen)) return soap_wsse_fault(soap, wsse__FailedCheck, NULL); } /* do not process EncryptedKey again */ security->xenc__EncryptedKey = NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Verified EncryptedKey alg=%x\n", data->deco_alg)); } return SOAP_OK; } /** @fn void soap_wsse_delete_EncryptedKey(struct soap *soap) @brief Deletes EncryptedKey header element. @param soap context */ void soap_wsse_delete_EncryptedKey(struct soap *soap) { _wsse__Security *security = soap_wsse_Security(soap); DBGFUN("soap_wsse_delete_EncryptedKey"); if (security) security->xenc__EncryptedKey = NULL; } /** @fn xenc__EncryptedKeyType* soap_wsse_EncryptedKey(struct soap *soap) @brief Returns EncryptedKey header element if present. @param soap context @return xenc__EncryptedKeyType object or NULL */ struct xenc__EncryptedKeyType* soap_wsse_EncryptedKey(struct soap *soap) { _wsse__Security *security = soap_wsse_Security(soap); if (security) return security->xenc__EncryptedKey; return NULL; } /******************************************************************************\ * * wsse:Security/xenc:EncryptedKey/ReferenceList/DataReference * \******************************************************************************/ /** @fn int soap_wsse_add_EncryptedKey_DataReferenceURI(struct soap *soap, const char *URI) @brief Adds a DataReference URI to the EncryptedKey header element. @param soap context @param[in] URI value of the URI ID @return SOAP_OK or error code */ int soap_wsse_add_EncryptedKey_DataReferenceURI(struct soap *soap, const char *URI) { _wsse__Security *security = soap_wsse_add_Security(soap); _xenc__ReferenceList *ref; int k, n = 0; DBGFUN1("soap_wsse_add_EncryptedKey_DataReferenceURI", "URI=%s", URI?URI:""); if (!security->xenc__EncryptedKey) { if (!(security->xenc__EncryptedKey = (xenc__EncryptedKeyType*)soap_malloc(soap, sizeof(xenc__EncryptedKeyType)))) return soap->error = SOAP_EOM; soap_default_xenc__EncryptedKeyType(soap, security->xenc__EncryptedKey); } if (!security->xenc__EncryptedKey->ReferenceList) { if (!(security->xenc__EncryptedKey->ReferenceList = (struct _xenc__ReferenceList*)soap_malloc(soap, sizeof(struct _xenc__ReferenceList)))) return soap->error = SOAP_EOM; soap_default__xenc__ReferenceList(soap, security->xenc__EncryptedKey->ReferenceList); } ref = security->xenc__EncryptedKey->ReferenceList; k = ref->__size_ReferenceList++; /* need to increase space? */ if (k < 0) return soap->error = SOAP_EOM; if (k == 0) n = 1; else if (k >= 1 && (k & (k - 1)) == 0) n = 2 * k; /* yes we do */ if (n) { struct __xenc__union_ReferenceList *tmp = (struct __xenc__union_ReferenceList*)soap_malloc(soap, n * sizeof(struct __xenc__union_ReferenceList)); int i; if (!tmp) return soap->error = SOAP_EOM; for (i = 0; i < k; i++) tmp[i] = ref->__union_ReferenceList[i]; security->xenc__EncryptedKey->ReferenceList->__union_ReferenceList = tmp; ref = security->xenc__EncryptedKey->ReferenceList; } /* add entry */ soap_default___xenc__union_ReferenceList(soap, &ref->__union_ReferenceList[k]); if (!(ref->__union_ReferenceList[k].DataReference = (struct xenc__ReferenceType*)soap_malloc(soap, sizeof(struct xenc__ReferenceType)))) return soap->error = SOAP_EOM; soap_default_xenc__ReferenceType(soap, ref->__union_ReferenceList[k].DataReference); ref->__union_ReferenceList[k].DataReference->URI = soap_strdup(soap, URI); return SOAP_OK; } /** @fn int soap_wsse_add_DataReferenceURI(struct soap *soap, const char *URI) @brief Adds a DataReference URI to the WS-Security header element. @param soap context @param[in] URI value of the URI ID @return SOAP_OK or error code */ int soap_wsse_add_DataReferenceURI(struct soap *soap, const char *URI) { _wsse__Security *security = soap_wsse_add_Security(soap); _xenc__ReferenceList *ref; int k, n = 0; DBGFUN1("soap_wsse_add_DataReferenceURI", "URI=%s", URI?URI:""); /* initial alloc */ if (!security->xenc__ReferenceList) { if (!(security->xenc__ReferenceList = (struct _xenc__ReferenceList*)soap_malloc(soap, sizeof(struct _xenc__ReferenceList)))) return soap->error = SOAP_EOM; soap_default__xenc__ReferenceList(soap, security->xenc__ReferenceList); } ref = security->xenc__ReferenceList; k = ref->__size_ReferenceList++; /* need to increase space? */ if (k < 0) return soap->error = SOAP_EOM; if (k == 0) n = 1; else if (k >= 1 && (k & (k - 1)) == 0) n = 2 * k; /* yes we do */ if (n) { struct __xenc__union_ReferenceList *tmp = (struct __xenc__union_ReferenceList*)soap_malloc(soap, n * sizeof(struct __xenc__union_ReferenceList)); int i; if (!tmp) return soap->error = SOAP_EOM; for (i = 0; i < k; i++) tmp[i] = ref->__union_ReferenceList[i]; security->xenc__ReferenceList->__union_ReferenceList = tmp; ref = security->xenc__ReferenceList; } /* add entry */ soap_default___xenc__union_ReferenceList(soap, &ref->__union_ReferenceList[k]); if (!(ref->__union_ReferenceList[k].DataReference = (struct xenc__ReferenceType*)soap_malloc(soap, sizeof(struct xenc__ReferenceType)))) return soap->error = SOAP_EOM; soap_default_xenc__ReferenceType(soap, ref->__union_ReferenceList[k].DataReference); ref->__union_ReferenceList[k].DataReference->URI = soap_strdup(soap, URI); return SOAP_OK; } /******************************************************************************\ * * xenc:EncryptedData * \******************************************************************************/ /** @fn int soap_wsse_add_EncryptedData_KeyInfo_KeyName(struct soap *soap, const char *keyname) @brief Adds EncryptedData/ds:KeyInfo/Keyname elements. @param soap context @param[in] keyname name of the key @return SOAP_OK or error code This function adds the name of the key to each EncryptedData element to identify the shared secret key used for encryption. */ int soap_wsse_add_EncryptedData_KeyInfo_KeyName(struct soap *soap, const char *keyname) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); DBGFUN("soap_wsse_add_EncryptedData_KeyInfo_KeyName"); if (!data) return soap_set_receiver_error(soap, "soap_wsse_add_EncryptedData_KeyInfo_KeyName", "Plugin not registered", SOAP_PLUGIN_ERROR); data->enco_keyname = soap_strdup(soap, keyname); return SOAP_OK; } /******************************************************************************\ * * Faults * \******************************************************************************/ /** @fn int soap_wsse_sender_fault_subcode(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail) @brief Sets sender SOAP Fault (sub)code for server fault response. @param soap context @param[in] faultsubcode sub code string @param[in] faultstring fault string @param[in] faultdetail detail string @return SOAP_FAULT */ int soap_wsse_sender_fault_subcode(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail) { #if defined(SOAP_WSA_2003) || defined(SOAP_WSA_2004) || defined(SOAP_WSA_200408) || defined(SOAP_WSA_2005) return soap_wsa_sender_fault_subcode(soap, faultsubcode, faultstring, faultdetail); #else return soap_sender_fault_subcode(soap, faultsubcode, faultstring, faultdetail); #endif } /** @fn int soap_wsse_receiver_fault_subcode(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail) @brief Sets receiver SOAP Fault (sub)code for server fault response. @param soap context @param[in] faultsubcode sub code string @param[in] faultstring fault string @param[in] faultdetail detail string @return SOAP_FAULT */ int soap_wsse_receiver_fault_subcode(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail) { #if defined(SOAP_WSA_2003) || defined(SOAP_WSA_2004) || defined(SOAP_WSA_200408) || defined(SOAP_WSA_2005) return soap_wsa_receiver_fault_subcode(soap, faultsubcode, faultstring, faultdetail); #else return soap_receiver_fault_subcode(soap, faultsubcode, faultstring, faultdetail); #endif } /** @fn int soap_wsse_sender_fault(struct soap *soap, const char *faultstring, const char *faultdetail) @brief Sets sender SOAP Fault for server fault response. @param soap context @param[in] faultstring fault string @param[in] faultdetail detail string @return SOAP_FAULT */ int soap_wsse_sender_fault(struct soap *soap, const char *faultstring, const char *faultdetail) { return soap_wsse_sender_fault_subcode(soap, NULL, faultstring, faultdetail); } /** @fn int soap_wsse_receiver_fault(struct soap *soap, const char *faultstring, const char *faultdetail) @brief Sets receiver SOAP Fault for server fault response. @param soap context @param[in] faultstring fault string @param[in] faultdetail detail string @return SOAP_FAULT */ int soap_wsse_receiver_fault(struct soap *soap, const char *faultstring, const char *faultdetail) { return soap_wsse_receiver_fault_subcode(soap, NULL, faultstring, faultdetail); } /** @fn int soap_wsse_fault(struct soap *soap, wsse__FaultcodeEnum fault, const char *detail) @brief Sets SOAP Fault (sub)code for server response. @param soap context @param[in] fault is one of wsse:FaultcodeEnum @param[in] detail string with optional text message @return SOAP_FAULT */ int soap_wsse_fault(struct soap *soap, wsse__FaultcodeEnum fault, const char *detail) { const char *code = soap_wsse__FaultcodeEnum2s(soap, fault); DBGFUN2("soap_wsse_fault", "fault=%s", code?code:"", "detail=%s", detail?detail:""); /* remove incorrect or incomplete Security header */ soap_wsse_delete_Security(soap); /* populate the SOAP Fault as per WS-Security spec */ /* detail = NULL; */ /* uncomment when detail text not recommended */ /* use WSA to populate the SOAP Header when WSA is used */ switch (fault) { case wsse__UnsupportedSecurityToken: return soap_wsse_sender_fault_subcode(soap, code, "An unsupported token was provided", detail); case wsse__UnsupportedAlgorithm: return soap_wsse_sender_fault_subcode(soap, code, "An unsupported signature or encryption algorithm was used", detail); case wsse__InvalidSecurity: return soap_wsse_sender_fault_subcode(soap, code, "An error was discovered processing the header", detail); case wsse__InvalidSecurityToken: return soap_wsse_sender_fault_subcode(soap, code, "An invalid security token was provided", detail); case wsse__FailedAuthentication: return soap_wsse_sender_fault_subcode(soap, code, "The security token could not be authenticated or authorized", detail); case wsse__FailedCheck: return soap_wsse_sender_fault_subcode(soap, code, "The signature or decryption was invalid", detail); case wsse__SecurityTokenUnavailable: return soap_wsse_sender_fault_subcode(soap, code, "Referenced security token could not be retrieved", detail); } return SOAP_FAULT; } /******************************************************************************\ * * Digest authentication session management * \******************************************************************************/ /** @fn static int soap_wsse_session_verify(struct soap *soap, const char hash[SOAP_SMD_SHA1_SIZE], const char *created, const char *nonce) @brief Verifies and updates the digest, nonce, and creation time against the digest authentication session database to prevent replay attacks. @param soap context @param[in] hash binary digest value of PasswordDigest @param[in] created string @param[in] nonce string (base64) @return SOAP_OK or SOAP_FAULT */ static int soap_wsse_session_verify(struct soap *soap, const char hash[SOAP_SMD_SHA1_SIZE], const char *created, const char *nonce) { struct soap_wsse_session *session; time_t expired, now = time(NULL); DBGFUN("soap_wsse_session_verify"); soap_s2dateTime(soap, created, &expired); /* creation time in the future? */ if (expired > now + SOAP_WSSE_CLKSKEW) return soap_wsse_fault(soap, wsse__FailedAuthentication, "Authorization request in future"); expired += SOAP_WSSE_NONCETIME; /* expired? */ if (expired <= now) return soap_wsse_fault(soap, wsse__FailedAuthentication, "Authentication expired"); /* purge expired messages, but don't do this all the time to improve efficiency */ if (now % 10 == 0) soap_wsse_session_cleanup(soap); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Verifying session nonce=%s\n", nonce)); /* enter mutex to check and update session */ MUTEX_LOCK(soap_wsse_session_lock); for (session = soap_wsse_session; session; session = session->next) { if (!memcmp(session->hash, hash, SOAP_SMD_SHA1_SIZE) && !strcmp(session->nonce, nonce)) break; } /* if not found, allocate new session data */ if (!session) { size_t l = strlen(nonce); session = (struct soap_wsse_session*)malloc(sizeof(struct soap_wsse_session) + l); if (session) { session->next = soap_wsse_session; session->expired = expired; soap_memcpy((void*)session->hash, sizeof(session->hash), (const void*)hash, SOAP_SMD_SHA1_SIZE); soap_strcpy(session->nonce, l + 1, nonce); soap_wsse_session = session; } session = NULL; } /* exit mutex */ MUTEX_UNLOCK(soap_wsse_session_lock); /* if replay attack, return non-descript failure */ if (session) return soap_wsse_fault(soap, wsse__FailedAuthentication, NULL); return SOAP_OK; } /** @fn static void soap_wsse_session_cleanup(struct soap *soap) @brief Removes expired authentication data from the digest authentication session database. @param soap context */ static void soap_wsse_session_cleanup(struct soap *soap) { struct soap_wsse_session **session; time_t now = time(NULL); DBGFUN("soap_wsse_session_cleanup"); /* enter mutex to purge expired session data */ MUTEX_LOCK(soap_wsse_session_lock); session = &soap_wsse_session; while (*session) { if ((*session)->expired < now) { struct soap_wsse_session *p = *session; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Deleting session nonce=%s\n", p->nonce)); *session = p->next; free(p); } else session = &(*session)->next; } /* exit mutex */ MUTEX_UNLOCK(soap_wsse_session_lock); } /******************************************************************************\ * * Calculate SHA1(created, nonce, password) digest * \******************************************************************************/ /** @fn static void calc_digest(struct soap *soap, const char *created, const char *nonce, int noncelen, const char *password, char hash[SOAP_SMD_SHA1_SIZE]) @brief Calculates digest value SHA1(created, nonce, password) @param soap context @param[in] created string (XSD dateTime format) @param[in] nonce value @param[in] noncelen length of nonce value @param[in] password string @param[out] hash SHA1 digest */ static void calc_digest(struct soap *soap, const char *created, const char *nonce, int noncelen, const char *password, char hash[SOAP_SMD_SHA1_SIZE]) { struct soap_smd_data context; /* use smdevp engine */ soap_smd_init(soap, &context, SOAP_SMD_DGST_SHA1, NULL, 0); soap_smd_update(soap, &context, nonce, noncelen); soap_smd_update(soap, &context, created, strlen(created)); soap_smd_update(soap, &context, password, strlen(password)); soap_smd_final(soap, &context, hash, NULL); } /******************************************************************************\ * * Calculate randomized hex nonce * \******************************************************************************/ /** @fn static void calc_nonce(char nonce[SOAP_WSSE_NONCELEN]) @brief Calculates randomized nonce (also uses time() in case a poorly seeded PRNG is used) @param[out] nonce value [0..SOAP_WSSE_NONCELEN-1] */ static void calc_nonce(char nonce[SOAP_WSSE_NONCELEN]) { int i; time_t r = time(NULL); soap_memcpy((void*)nonce, SOAP_WSSE_NONCELEN, (const void*)&r, 4); for (i = 4; i < SOAP_WSSE_NONCELEN; i += 4) { r = soap_random; soap_memcpy((void*)(nonce + i), 4, (const void*)&r, 4); } } /******************************************************************************\ * * Plugin registry functions * \******************************************************************************/ /** @fn int soap_wsse(struct soap *soap, struct soap_plugin *p, void *arg) @brief Plugin registry function, used with soap_register_plugin. @param soap context @param[in,out] p plugin created in registry @param[in] arg passed from soap_register_plugin_arg is an optional security token handler callback @return SOAP_OK */ int soap_wsse(struct soap *soap, struct soap_plugin *p, void *arg) { static int done = 0; DBGFUN("soap_wsse"); p->id = soap_wsse_id; p->data = (void*)SOAP_MALLOC(soap, sizeof(struct soap_wsse_data)); p->fcopy = soap_wsse_copy; p->fdelete = soap_wsse_delete; if (p->data) { if (soap_wsse_init(soap, (struct soap_wsse_data*)p->data, (const void *(*)(struct soap*, int*, const char*, int*))arg)) { SOAP_FREE(soap, p->data); return SOAP_EOM; } } if (!done) { #if 0 #ifdef WIN32 /* now uses CreateMutex() for static lock initialization */ static volatile long spinlock = 0; DWORD s = 0; /* Initialize soap_wsse_session_lock with a spinlock */ while (InterlockedExchange(&spinlock, 1) == 1) { Sleep(s); s = !s; } if (!done) MUTEX_SETUP(soap_wsse_session_lock); done = 1; spinlock = 0; #else done = 1; #endif #endif #ifdef WITH_OPENSSL /* moved to stdsoap2.c MUTEX_LOCK(soap_wsse_session_lock); OpenSSL_add_all_digests(); OpenSSL_add_all_algorithms(); MUTEX_UNLOCK(soap_wsse_session_lock); */ #endif } return SOAP_OK; } /** @fn int soap_wsse_init(struct soap *soap, struct soap_wsse_data *data, const void *(*arg)(struct soap*, int*, const char*, int*)) @brief Initializes plugin data. @param soap context @param[in,out] data plugin data @param arg security token handler callback @return SOAP_OK */ static int soap_wsse_init(struct soap *soap, struct soap_wsse_data *data, const void *(*arg)(struct soap*, int *alg, const char *keyname, int *keylen)) { DBGFUN("soap_wsse_init"); data->sigid = NULL; data->encid = NULL; data->prefixlist = NULL; data->sign_alg = SOAP_SMD_NONE; data->sign_key = NULL; data->sign_keylen = 0; data->vrfy_alg = SOAP_SMD_NONE; data->vrfy_key = NULL; data->vrfy_keylen = 0; data->enco_alg = SOAP_MEC_NONE; data->enco_keyname = NULL; data->enco_key = NULL; data->enco_keylen = 0; data->deco_alg = SOAP_MEC_NONE; data->deco_key = NULL; data->deco_keylen = 0; data->digest = NULL; data->fpreparesend = NULL; data->fpreparefinalsend = NULL; data->fpreparefinalrecv = NULL; data->fheader = soap->fheader; soap->fheader = soap_wsse_header; data->mec = NULL; data->store = NULL; data->security_token_handler = arg; soap->feltbegin = soap_wsse_element_begin_in; soap->feltendin = soap_wsse_element_end_in; return SOAP_OK; } /** @fn int soap_wsse_copy(struct soap *soap, struct soap_plugin *dst, struct soap_plugin *src) @brief Copies plugin data to localize plugin data for threads. @param soap context @param[out] dst target plugin @param[in] src source plugin @return SOAP_OK */ static int soap_wsse_copy(struct soap *soap, struct soap_plugin *dst, struct soap_plugin *src) { DBGFUN("soap_wsse_copy"); *dst = *src; dst->data = (void*)SOAP_MALLOC(soap, sizeof(struct soap_wsse_data)); soap_wsse_init(soap, (struct soap_wsse_data*)dst->data, ((struct soap_wsse_data*)src->data)->security_token_handler); return SOAP_OK; } /** @fn void soap_wsse_delete(struct soap *soap, struct soap_plugin *p) @brief Deletes plugin data. @param soap context @param[in,out] p plugin @return SOAP_OK */ static void soap_wsse_delete(struct soap *soap, struct soap_plugin *p) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); (void)p; DBGFUN("soap_wsse_delete"); if (data) { if (data->prefixlist) SOAP_FREE(soap, data->prefixlist); soap_wsse_preparecleanup(soap, data); if (data->mec) { soap_mec_cleanup(soap, data->mec); SOAP_FREE(soap, data->mec); data->mec = NULL; } if (data->store) { X509_STORE_free(data->store); data->store = NULL; } SOAP_FREE(soap, data); } } /******************************************************************************\ * * Plugin-specific functions * \******************************************************************************/ /** @fn int soap_wsse_set_wsu_id(struct soap *soap, const char *tags) @brief Sets the elements that are to be extended with wsu:Id attributes. The wsu:Id attribute values are set to the string value of the tag's QName by replacing colons with hyphens to produce an xsd:ID value. @param soap context @param[in] tags string of space-separated qualified and unqualified element tag names @return SOAP_OK */ int soap_wsse_set_wsu_id(struct soap *soap, const char *tags) { DBGFUN1("soap_wsse_set_wsu_id", "tags=%s", tags?tags:"(null)"); soap->wsuid = soap_strdup(soap, tags); return SOAP_OK; } /** @fn int soap_wsse_set_InclusiveNamespaces(struct soap *soap, const char *prefixlist) @brief Sets the C14N InclusiveNamespaces Prefix List property. @param soap context @param[in] prefixlist string of space-separated namespace prefixes, or NULL to remove @return SOAP_OK */ int soap_wsse_set_InclusiveNamespaces(struct soap *soap, const char *prefixlist) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); DBGFUN1("soap_wsse_set_InclusiveNamespaces", "prefixlist=%s", prefixlist?prefixlist:"(null)"); if (data) { size_t l = strlen(prefixlist); char *s; if (data->prefixlist) SOAP_FREE(soap, data->prefixlist); s = (char*)SOAP_MALLOC(soap, l + 1); soap_strcpy(s, l + 1, prefixlist); data->prefixlist = s; } return SOAP_OK; } /** @fn int soap_wsse_sign_only(struct soap *soap, const char *tags) @brief Filters only the specified wsu:Id names for signing. Can be used with soap_wsse_set_wsu_id() and if so should use the element tag names. @param soap context @param[in] tags string of space-separated qualified and unqualified tag names @return SOAP_OK */ int soap_wsse_sign_only(struct soap *soap, const char *tags) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); DBGFUN1("soap_wsse_sign_only", "tags=%s", tags?tags:"(null)"); if (data) data->sigid = soap_wsse_ids(soap, tags); return SOAP_OK; } /** @fn static char* soap_wsse_ids(struct soap *soap, const char *tags) @brief converts tag name(s) to id name(s) @param soap context @param[in] tags string of space-separated (un)qualified tag names @return string of ids */ static char* soap_wsse_ids(struct soap *soap, const char *tags) { char *s, *t; s = t = soap_strdup(soap, tags); while (s && *s) { if (*s == ':') *s = '-'; s++; } return t; } /** @fn int soap_wsse_sign(struct soap *soap, int alg, const void *key, int keylen) @brief Uses the wsse plugin to sign all wsu:Id attributed elements. @param soap context @param[in] alg is the signature algorithm, such as SOAP_SMD_HMAC_SHA1/224/256/384/512, SOAP_SMD_SIGN_DSA_SHA1/256, SOAP_SMD_SIGN_RSA_SHA1/224/256/384/512, or SOAP_SMD_SIGN_ECDSA_SHA1/224/256/384/512 @param[in] key is the HMAC secret key or DSA/RSA/ECDSA private EVP_PKEY @param[in] keylen is the HMAC key length @return SOAP_OK or fault This function does not actually sign the message, but initiates the plugin's signature algorithm to sign the message upon message transfer. */ int soap_wsse_sign(struct soap *soap, int alg, const void *key, int keylen) { struct soap_wsse_digest *digest, *next; struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); DBGFUN1("soap_wsse_sign", "alg=%x", alg); if (!data) return soap_set_receiver_error(soap, "soap_wsse_sign", "Plugin not registered", SOAP_PLUGIN_ERROR); if (!alg || !key) return soap_wsse_fault(soap, wsse__InvalidSecurity, "Invalid signature algorithm or key"); /* store alg and key in plugin data */ data->sign_alg = alg; data->sign_key = key; data->sign_keylen = keylen; /* save and set the plugin's callbacks to preprocess outbound messages */ if (soap->fpreparesend != soap_wsse_preparesend) { data->fpreparesend = soap->fpreparesend; data->fpreparefinalsend = soap->fpreparefinalsend; } if (soap->fpreparefinalsend != soap_wsse_preparefinalsend) { soap->fpreparesend = soap_wsse_preparesend; soap->fpreparefinalsend = soap_wsse_preparefinalsend; } /* support HTTP compression only with HTTP chunking to allow signing XML */ if ((soap->omode & SOAP_ENC_ZLIB)) soap->omode = (soap->omode & ~SOAP_IO) | SOAP_IO_CHUNK; else if ((soap->omode & SOAP_IO) == SOAP_IO_STORE) /* no store buffering */ soap->omode = (soap->omode & ~SOAP_IO) | SOAP_IO_BUFFER; /* cleanup the digest data */ for (digest = data->digest; digest; digest = next) { next = digest->next; SOAP_FREE(soap, digest); } data->digest = NULL; return SOAP_OK; } /** @fn int soap_wsse_sign_body(struct soap *soap, int alg, const void *key, int keylen) @brief Uses the wsse plugin to sign all wsu:Id attributed elements, including the SOAP Body (by adding a wsu:Id="Body" attribute). @param soap context @param[in] alg is the signature algorithm, such as SOAP_SMD_HMAC_SHA1/224/256/384/512, SOAP_SMD_SIGN_DSA_SHA1/256, SOAP_SMD_SIGN_RSA_SHA1/224/256/384/512, or SOAP_SMD_SIGN_ECDSA_SHA1/224/256/384/512 @param[in] key is the HMAC secret key or DSA/RSA/ECDSA private EVP_PKEY @param[in] keylen is the HMAC key length @return SOAP_OK or fault This function does not actually sign the message, but initiates the plugin's signature algorithm to sign the message upon message transfer. */ int soap_wsse_sign_body(struct soap *soap, int alg, const void *key, int keylen) { DBGFUN1("soap_wsse_sign_body", "alg=%x", alg); soap_wsse_add_Security(soap); soap->omode |= SOAP_SEC_WSUID; return soap_wsse_sign(soap, alg, key, keylen); } /** @fn int soap_wsse_verify_init(struct soap *soap) @brief Uses the wsse plugin to initiate the verification of the signature and SignedInfo Reference digests. @param soap context @return SOAP_OK This function does not actually verify the message, but initiates the plugin's data to store the message in a DOM to verify the signature. The signature and digests in the DOM must be verified manually. */ int soap_wsse_verify_init(struct soap *soap) { DBGFUN("soap_wsse_verify_init"); /* deserialize inbound message to DOM */ soap->imode |= SOAP_XML_DOM; return SOAP_OK; } /** @fn int soap_wsse_verify_auto(struct soap *soap, int alg, const void *key, size_t keylen) @brief Uses the wsse plugin to initiate the automatic verification of the signature and SignedInfo Reference digests. @param soap context @param[in] alg to verify signature if signature has no secret or public key, use SOAP_SMD_NONE to omit @param[in] key is HMAC key or a DSA/RSA/ECDSA EVP_PKEY or NULL @param[in] keylen is HMAC key length or 0 @return SOAP_OK This function does not actually verify the message, but initiates the plugin's algorithm to store the message in a DOM to automatically verify the signature and digests. If the message does not contain a key to verify the signature, the alg, key, and keylen parameters are used. It is important that the X509 certificate used to verify the signature, which requires soap->cafile and/or soap->capath to be set. */ int soap_wsse_verify_auto(struct soap *soap, int alg, const void *key, size_t keylen) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); DBGFUN("soap_wsse_verify_auto"); if (!data) return soap_set_receiver_error(soap, "soap_wsse_verify_auto", "Plugin not registered", SOAP_PLUGIN_ERROR); data->vrfy_alg = alg; data->vrfy_key = key; data->vrfy_keylen = keylen; if (soap->fpreparefinalrecv != soap_wsse_preparefinalrecv) { data->fpreparefinalrecv = soap->fpreparefinalrecv; soap->fpreparefinalrecv = soap_wsse_preparefinalrecv; } return soap_wsse_verify_init(soap); } /** @fn int soap_wsse_verify_done(struct soap *soap) @brief Terminates the automatic verification of signatures. @param soap context @return SOAP_OK */ int soap_wsse_verify_done(struct soap *soap) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); DBGFUN("soap_wsse_verify_done"); if (!data) return soap_set_receiver_error(soap, "soap_wsse_verify_done", "Plugin not registered", SOAP_PLUGIN_ERROR); soap->imode &= ~SOAP_XML_DOM; soap->omode &= ~SOAP_SEC_WSUID; if (soap->fpreparefinalrecv == soap_wsse_preparefinalrecv) soap->fpreparefinalrecv = data->fpreparefinalrecv; return SOAP_OK; } /** @fn size_t soap_wsse_verify_element(struct soap *soap, const char *URI, const char *tag) @brief Post-checks the presence of signed element(s). Does not verify the signature of these elements, which is done with @ref soap_wsse_verify_auto. @param soap context @param URI namespace of element(s) @param tag name of element(s) @return number of matching elements signed. This function does not actually verify the signature of each element, but checks whether the elements are signed and thus their integrity is preserved. Signed element nesting rules are obeyed, so if the matching element is a descendent of a signed element, it is signed as well. Thus, the verification process follows nesting rules. Client should call this function after invocation. Services should call this function inside a service operation. This function traverses the entire DOM, so performance is determined by the size of a message. To check the SOAP Body (either using SOAP 1.1 or 1.2), @ref soap_wsse_verify_element(soap, namespaces[0].ns, "Body"). To check whether the Timestamp was signed (assuming it is present and message expiration checked with @ref soap_wsse_verify_Timestamp), use @ref soap_wsse_verify_element(soap, "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd", "Timestamp"). @note For future releases, XPath queries (or forms of these) will be considered. */ size_t soap_wsse_verify_element(struct soap *soap, const char *URI, const char *tag) { ds__SignedInfoType *signedInfo = soap_wsse_SignedInfo(soap); size_t count = 0; DBGFUN("soap_wsse_verify_element"); if (signedInfo && soap->dom) { struct soap_dom_element *elt; /* traverse the DOM */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SignedInfo and DOM found\n")); elt = soap->dom; while (elt) { /* find wsu:Id or ds:Id and check for Id in signedInfo */ int ok = 0; struct soap_dom_attribute *att; for (att = elt->atts; att; att = att->next) { if (att->name && att->nstr && (!strcmp(att->nstr, wsu_URI) || !strcmp(att->nstr, ds_URI)) && (!strcmp(att->name, "Id") || !soap_tag_cmp(att->name, "*:Id"))) { /* Id attribute found, search Id value in ds:Reference/@URI */ int i; for (i = 0; i < signedInfo->__sizeReference; i++) { ds__ReferenceType *reference = signedInfo->Reference[i]; if (reference->URI && *reference->URI == '#' && !strcmp(reference->URI + 1, att->text)) { ok = 1; break; } } if (ok) break; } } /* the current element is signed, count this and the matching nested */ if (ok) { count += soap_wsse_verify_nested(soap, elt, URI, tag); /* go to next sibling or back up */ if (elt->next) elt = elt->next; else { do elt = elt->prnt; while (elt && !elt->next); if (elt) elt = elt->next; } } else elt = soap_dom_next_element(elt, NULL); } } return count; } /** @fn size_t soap_wsse_verify_nested(struct soap *soap, struct soap_dom_element *dom, const char *URI, const char *tag) @brief Counts signed matching elements from the dom node and down. @param soap context @param dom node to check and down @param URI namespace of element(s) @param tag name of element(s) @return number of matching elements. */ static size_t soap_wsse_verify_nested(struct soap *soap, struct soap_dom_element *dom, const char *URI, const char *tag) { size_t count = 0; /* search the DOM node and descendants for matching elements */ struct soap_dom_element *elt = dom; for (elt = dom; elt && elt != dom->next && elt != dom->prnt; elt = soap_dom_next_element(elt, NULL)) { if (elt->name && ((!elt->nstr && !URI) || (elt->nstr && URI && !strcmp(elt->nstr, URI)))) { const char *s = strchr(elt->name, ':'); if (s) s++; else s = elt->name; /* found element? */ if (!strcmp(s, tag)) count++; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element '%s' (\"%s\":%s) is signed\n", elt->name, elt->nstr, elt->name)); } return count; } /** @fn int soap_wsse_verify_body(struct soap *soap) @brief Post-checks the presence of signed SOAP Body. Does not verify the signature of the Body, which is done with @ref soap_wsse_verify_auto. @param soap context @return SOAP_OK (signed) or SOAP_FAULT This function does not actually verify the signature of the Body. It checks whether the Body is signed and thus its integrity is preserved. Clients should call this function after invocation. Services should call this function inside a service operation. This function traverses the entire DOM, so performance is determined by the size of a message. */ int soap_wsse_verify_body(struct soap *soap) { const char *ns = NULL; /* Are we using SOAP 1.1 or 1.2? Check first row of namespace table */ if (soap->local_namespaces) { if (soap->local_namespaces->out) ns = soap->local_namespaces->out; else if (soap->local_namespaces->ns) ns = soap->local_namespaces->ns; } /* We don't know if we're using SOAP 1.1 or 1.2, so assume it is 1.2 */ if (!ns) ns = "http://www.w3.org/2003/05/soap-envelope"; if (soap_wsse_verify_element(soap, ns, "Body") > 0) return SOAP_OK; return soap_wsse_sender_fault(soap, "Message body not signed", NULL); } /** @fn int soap_wsse_encrypt_body(struct soap *soap, int alg, const void *key, int keylen) @brief Initiates the encryption of the SOAP Body. The algorithm should be SOAP_MEC_ENC_DES_CBC etc. for symmetric encryption. Use soap_wsse_add_EncryptedKey for public key encryption. @param soap context @param[in] alg the encryption algorithm, should be SOAP_MEC_ENC_DES_CBC etc. @param[in] key a certificate with public key for encryption, a DES CBC 160-bit key or AES key @param[in] keylen the symmetric encryption key length, 20 bytes for a DES CBC 160-bit key @return SOAP_OK or error code This function initiates the encryption of the SOAP Body using an RSA public key or a symmetric shared secret key. No WS-Security EncryptedKey header will be set. Use soap_wsse_add_EncryptedKey instead for public key encryption. */ int soap_wsse_encrypt_body(struct soap *soap, int alg, const void *key, int keylen) { struct soap_wsse_data *data; DBGFUN1("soap_wsse_encrypt_body", "alg=%x", alg); data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); if (!data) return soap_set_receiver_error(soap, "soap_wsse_encrypt_body", "Plugin not registered", SOAP_PLUGIN_ERROR); data->encid = NULL; soap->omode |= SOAP_SEC_WSUID; soap_wsse_add_DataReferenceURI(soap, "#Body"); return soap_wsse_encrypt(soap, alg, key, keylen); } /** @fn int soap_wsse_encrypt_only(struct soap *soap, int alg, const void *key, int keylen, const char *tags) @brief Initiates the encryption of XML elements specified in the tags string. Should be used in combination with soap_wsse_set_wsu_id to set wsu:Id for given XML element tags. The algorithm should be SOAP_MEC_ENC_DES_CBC etc. for symmetric encryption. Use soap_wsse_add_EncryptedKey_encrypt_only for public key encryption. @param soap context @param[in] alg the encryption algorithm, should be SOAP_MEC_ENC_DES_CBC etc. @param[in] key a certificate with public key for encryption, a DES CBC 160-bit key or AES key @param[in] keylen the symmetric encryption key length, 20 bytes for a DES CBC 160-bit key @param[in] tags string of space-separated qualified and unqualified tag names @return SOAP_OK or error code This function initiates the encryption using an RSA public key or a symmetric shared secret key. No WS-Security EncryptedKey header will be set. Use soap_wsse_add_EncryptedKey instead for public key encryption. @warning Use @ref soap_wsse_add_EncryptedKey_encrypt_only only in combination with @ref soap_wsse_set_wsu_id with the tag names of the elements to be encrypted. OTHERWISE THE GIVEN XML ELEMENTS ARE NOT ENCRYPTED AND WILL BE SENT IN THE CLEAR. @warning The elements identified with @ref soap_wsse_set_wsu_id to encrypt MUST occur EXACTLY ONCE in the SOAP Body. @warning Encryption/decryption of elements with simple content (CDATA content) IS NOT SUPPORTED. This means that elements you want to encrypt with this function must have complex content. That is, only encrypt elements with sub elements or encrypt the entire SOAP Body. */ int soap_wsse_encrypt_only(struct soap *soap, int alg, const void *key, int keylen, const char *tags) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); DBGFUN2("soap_wsse_encrypt_only", "alg=%x", alg, "tags=%s", tags?tags:"(null)"); if (!data) return soap_set_receiver_error(soap, "soap_wsse_encrypt_only", "Plugin not registered", SOAP_PLUGIN_ERROR); data->encid = soap_strdup(soap, tags); if (tags) { char *s, *t; size_t l = strlen(tags); /* make space to insert # to each id converted from a tag name */ t = (char*)soap_malloc(soap, l + 2); if (!t) return soap->error = SOAP_EOM; *t = '#'; soap_strcpy(t + 1, l + 1, tags); s = soap_wsse_ids(soap, t); if (!s) return soap->error = SOAP_EOM; s++; do { t = strchr(s, ' '); if (t) *t = '\0'; s--; *s = '#'; if (soap_wsse_add_DataReferenceURI(soap, s)) return soap->error; s = t; while (s && *s == ' ') s++; } while (s); } return soap_wsse_encrypt(soap, alg, key, keylen); } /** @fn int soap_wsse_encrypt(struct soap *soap, int alg, const void *key, int keylen) @brief Start encryption. This function is supposed to be used internally only. The algorithm should be SOAP_MEC_ENC_DES_CBC etc. for symmetric encryption. Use soap_wsse_add_EncryptedKey for public key encryption. @param soap context @param[in] alg the encryption algorithm, should be SOAP_MEC_ENC_DES_CBC etc. @param[in] key a certificate with public key for encryption, a DES CBC 160-bit key or AES key @param[in] keylen the symmetric encryption key length, 20 bytes for a DES CBC 160-bit key @return SOAP_OK or error code */ int soap_wsse_encrypt(struct soap *soap, int alg, const void *key, int keylen) { struct soap_wsse_data *data; DBGFUN1("soap_wsse_encrypt", "alg=%x", alg); data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); if (!data) return soap_set_receiver_error(soap, "soap_wsse_encrypt", "Plugin not registered", SOAP_PLUGIN_ERROR); if (!alg || !key) return soap_wsse_fault(soap, wsse__UnsupportedAlgorithm, "An unsupported signature or encryption algorithm was used"); if (alg & SOAP_MEC_ENV) return soap_wsse_add_EncryptedKey(soap, alg, NULL, (X509*)key, NULL, NULL, NULL); /* store alg and key in plugin data */ data->enco_alg = (alg | SOAP_MEC_ENC); data->enco_key = key; data->enco_keylen = keylen; if (data->mec) soap_mec_cleanup(soap, data->mec); else data->mec = (struct soap_mec_data*)SOAP_MALLOC(soap, sizeof(struct soap_mec_data)); if (soap_mec_begin(soap, data->mec, alg, NULL, (unsigned char*)key, &keylen)) return soap->error; soap->feltbegout = soap_wsse_element_begin_out; soap->feltendout = soap_wsse_element_end_out; return SOAP_OK; } /** @fn int soap_wsse_decrypt_auto(struct soap *soap, int alg, const void *key, int keylen) @brief Start automatic decryption when needed using the specified key. This function should be used just once. The algorithm should be SOAP_MEC_ENV_DEC_DES_CBC etc. for public key encryption/decryption and SOAP_MEC_DEC_DES_CBC etc. for symmetric shared secret keys. @param soap context @param[in] alg the decryption algorithm, @param[in] key a persistent decryption key for the algorithm, a private RSA key or a shared symmetric secret key @param[in] keylen use 0 for public-key encryption/decryption or the shared secret decryption key length, 20 bytes for a DES CBC 160-bit key @return SOAP_OK or error code This function can be called once before multiple messages are received with WS-Security encrypted content, where only one key is used for encryption (public key or shared secret key). The default decryption key is set. If multiple decryption keys should be used, do NOT use this function but set the security_token_handler callback of the wsse plugin. See @ref wsse_9_2. Use a NULL key to remove the default decryption key. */ int soap_wsse_decrypt_auto(struct soap *soap, int alg, const void *key, int keylen) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); DBGFUN1("soap_wsse_decrypt_auto", "alg=%x", alg); if (!data) return soap_set_receiver_error(soap, "soap_wsse_decrypt_auto", "Plugin not registered", SOAP_PLUGIN_ERROR); /* store alg and key in plugin data */ data->deco_alg = (alg & ~SOAP_MEC_ENC); /* TODO should add? data->enco_alg = (alg & ~(SOAP_MEC_ENC|SOAP_MEC_ENV)); */ data->deco_key = key; data->deco_keylen = keylen; return SOAP_OK; } /** @fn int soap_wsse_encrypt_begin(struct soap *soap, const char *id, int alg, const char *URI, const char *keyname, const unsigned char *key) @brief Emit XML encryption tags and start encryption of the XML element content. @param soap context @param[in] id string for the EncryptedData element Id attribute @param[in] alg algorithm used, or SOAP_MEC_NONE to ignore @param[in] URI string for the encrypted element wsu:Id attribute @param[in] keyname optional subject key name @param[in] key optional DES/AES key for encryption (to override the current key) @return SOAP_OK or error code */ int soap_wsse_encrypt_begin(struct soap *soap, const char *id, int alg, const char *URI, const char *keyname, const unsigned char *key) { int event; const char *algURI = NULL; DBGFUN("soap_wsse_encrypt_begin"); if ((soap->mode & SOAP_IO_LENGTH) && (soap->mode & SOAP_IO) == SOAP_IO_CHUNK) return SOAP_OK; /* disable digest */ event = soap->event; soap->event = 0; if (soap_set_attr(soap, "Id", id, 1) || soap_set_attr(soap, "Type", xenc_contentURI, 1) || soap_element(soap, "xenc:EncryptedData", 0, NULL) || soap_element_start_end_out(soap, NULL)) return soap->error; switch (alg & SOAP_MEC_MASK & ~SOAP_MEC_ENV) { case SOAP_MEC_ENC_DES_CBC: algURI = xenc_3desURI; break; case SOAP_MEC_ENC_AES128_CBC: algURI = xenc_aes128cbcURI; break; case SOAP_MEC_ENC_AES192_CBC: algURI = xenc_aes192cbcURI; break; case SOAP_MEC_ENC_AES256_CBC: algURI = xenc_aes256cbcURI; break; case SOAP_MEC_ENC_AES512_CBC: algURI = xenc_aes512cbcURI; break; case SOAP_MEC_ENC_AES128_GCM: algURI = xenc_aes128gcmURI; break; case SOAP_MEC_ENC_AES192_GCM: algURI = xenc_aes192gcmURI; break; case SOAP_MEC_ENC_AES256_GCM: algURI = xenc_aes256gcmURI; break; case SOAP_MEC_ENC_AES512_GCM: algURI = xenc_aes512gcmURI; break; } if (algURI) { if (soap_set_attr(soap, "Algorithm", algURI, 1) || soap_element(soap, "xenc:EncryptionMethod", 0, NULL) || soap_element_start_end_out(soap, "xenc:EncryptionMethod")) return soap->error; } if (URI) { if (soap_element(soap, "ds:KeyInfo", 0, NULL) || soap_element_start_end_out(soap, NULL) || soap_element(soap, "wsse:SecurityTokenReference", 0, NULL) || soap_element_start_end_out(soap, NULL) || soap_set_attr(soap, "URI", URI, 1) || soap_element(soap, "wsse:Reference", 0, NULL) || soap_element_start_end_out(soap, NULL) || soap_element_end_out(soap, "wsse:Reference") || soap_element_end_out(soap, "wsse:SecurityTokenReference") || soap_element_end_out(soap, "ds:KeyInfo")) return soap->error; } else if (keyname) { if (soap_element(soap, "ds:KeyInfo", 0, NULL) || soap_element_start_end_out(soap, NULL) || soap_element(soap, "ds:KeyName", 0, NULL) || soap_element_start_end_out(soap, NULL) || soap_string_out(soap, keyname, 0) || soap_element_end_out(soap, "ds:KeyName") || soap_element_end_out(soap, "ds:KeyInfo")) return soap->error; } if (soap_element(soap, "xenc:CipherData", 0, NULL) || soap_element_start_end_out(soap, NULL) || soap_element(soap, "xenc:CipherValue", 0, NULL) || soap_element_start_end_out(soap, NULL)) return soap->error; /* re-enable digest */ soap->event = event; /* adjust level, hiding xenc elements */ soap->level -= 3; return soap_mec_start(soap, key); } /** @fn int soap_wsse_encrypt_end(struct soap *soap) @brief Emit XML encryption end tags and stop encryption of the XML element content. @param soap context @return SOAP_OK or error code */ int soap_wsse_encrypt_end(struct soap *soap) { int event; DBGFUN("soap_wsse_encrypt_end"); if ((soap->mode & SOAP_IO_LENGTH) && (soap->mode & SOAP_IO) == SOAP_IO_CHUNK) return SOAP_OK; /* disable digest */ event = soap->event; soap->event = 0; /* adjust level, hiding xenc elements */ soap->level += 3; if (soap_mec_stop(soap) || soap_element_end_out(soap, "xenc:CipherValue") || soap_element_end_out(soap, "xenc:CipherData") || soap_element_end_out(soap, "xenc:EncryptedData")) return soap->error; /* re-enable digest */ soap->event = event; return SOAP_OK; } /** @fn int soap_wsse_decrypt_begin(struct soap *soap) @brief Check for XML encryption tags and start decryption of the XML element content. If the KeyInfo element is present, the security_token_handler callback will be used to obtain a decryption key based on the key name. @param soap context @return SOAP_OK or error code */ int soap_wsse_decrypt_begin(struct soap *soap) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); struct ds__KeyInfoType info; struct xenc__EncryptionMethodType meth; int alg = data->deco_alg; const unsigned char *key = NULL; int keylen = data->deco_keylen; DBGFUN("soap_wsse_decrypt_begin"); if (!data) return soap_set_receiver_error(soap, "soap_wsse_decrypt_begin", "Plugin not registered", SOAP_PLUGIN_ERROR); if (soap_wsse_verify_EncryptedKey(soap)) return soap->error; if (soap_element_begin_in(soap, "xenc:EncryptedData", 0, NULL)) return soap->error; /* TODO: use Type attribute? */ soap_default_xenc__EncryptionMethodType(soap, &meth); if (soap_in_xenc__EncryptionMethodType(soap, "xenc:EncryptionMethod", &meth, NULL)) { if (meth.Algorithm) { if (!strcmp(meth.Algorithm, xenc_3desURI)) alg = (alg & (~SOAP_MEC_MASK | SOAP_MEC_ENV)) | SOAP_MEC_DEC_DES_CBC; else if (!strcmp(meth.Algorithm, xenc_aes128cbcURI)) alg = (alg & (~SOAP_MEC_MASK | SOAP_MEC_ENV)) | SOAP_MEC_DEC_AES128_CBC; else if (!strcmp(meth.Algorithm, xenc_aes192cbcURI)) alg = (alg & (~SOAP_MEC_MASK | SOAP_MEC_ENV)) | SOAP_MEC_DEC_AES192_CBC; else if (!strcmp(meth.Algorithm, xenc_aes256cbcURI)) alg = (alg & (~SOAP_MEC_MASK | SOAP_MEC_ENV)) | SOAP_MEC_DEC_AES256_CBC; else if (!strcmp(meth.Algorithm, xenc_aes512cbcURI)) alg = (alg & (~SOAP_MEC_MASK | SOAP_MEC_ENV)) | SOAP_MEC_DEC_AES512_CBC; else if (!strcmp(meth.Algorithm, xenc_aes128gcmURI)) alg = (alg & (~SOAP_MEC_MASK | SOAP_MEC_ENV)) | SOAP_MEC_DEC_AES128_GCM; else if (!strcmp(meth.Algorithm, xenc_aes192gcmURI)) alg = (alg & (~SOAP_MEC_MASK | SOAP_MEC_ENV)) | SOAP_MEC_DEC_AES192_GCM; else if (!strcmp(meth.Algorithm, xenc_aes256gcmURI)) alg = (alg & (~SOAP_MEC_MASK | SOAP_MEC_ENV)) | SOAP_MEC_DEC_AES256_GCM; else if (!strcmp(meth.Algorithm, xenc_aes512gcmURI)) alg = (alg & (~SOAP_MEC_MASK | SOAP_MEC_ENV)) | SOAP_MEC_DEC_AES512_GCM; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "EncryptionMethod alg=%x\n", alg)); } } if (soap_in_ds__KeyInfoType(soap, "ds:KeyInfo", &info, NULL)) { if (data->security_token_handler && info.KeyName) { /* retrieve key from token handler callback */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Getting shared secret key '%s' through security_token_handler callback\n", info.KeyName)); key = (const unsigned char*)data->security_token_handler(soap, &alg, info.KeyName, &keylen); if (key) { if (data->mec) soap_mec_cleanup(soap, data->mec); else data->mec = (struct soap_mec_data*)SOAP_MALLOC(soap, sizeof(struct soap_mec_data)); if (soap_mec_begin(soap, data->mec, alg, NULL, (unsigned char*)key, &keylen)) return soap_wsse_fault(soap, wsse__FailedCheck, NULL); } } } if (soap_element_begin_in(soap, "xenc:CipherData", 0, NULL) || soap_element_begin_in(soap, "xenc:CipherValue", 0, NULL)) return soap->error; /* if no default shared key is set for symmetric decryption, get it */ if (!(alg & SOAP_MEC_ENV)) { if (alg != data->deco_alg) { if (data->security_token_handler) { /* retrieve key from token handler callback */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Getting shared secret key for alg=%x through security_token_handler callback\n", alg)); data->deco_key = (const unsigned char*)data->security_token_handler(soap, &alg, NULL, &keylen); } } if (!key && keylen) key = (const unsigned char*)data->deco_key; if (key) { if (data->mec) soap_mec_cleanup(soap, data->mec); else data->mec = (struct soap_mec_data*)SOAP_MALLOC(soap, sizeof(struct soap_mec_data)); if (soap_mec_begin(soap, data->mec, alg, NULL, (unsigned char*)key, &keylen)) return soap_wsse_fault(soap, wsse__FailedCheck, NULL); } } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Key=%p/%p keylen=%d alg=0x%x\n", key, data->deco_key, keylen, alg)); data->deco_alg = alg; data->deco_keylen = keylen; if (soap_mec_start_alg(soap, alg, key)) return soap_wsse_fault(soap, wsse__FailedCheck, NULL); return SOAP_OK; } /** @fn int soap_wsse_decrypt_end(struct soap *soap) @brief Check for XML encryption ending tags and stop decryption of the XML element content. @param soap context @return SOAP_OK or error code */ int soap_wsse_decrypt_end(struct soap *soap) { DBGFUN("soap_wsse_decrypt_end"); if (soap_mec_stop(soap) || soap_element_end_in(soap, "xenc:CipherValue") || soap_element_end_in(soap, "xenc:CipherData") || soap_element_end_in(soap, "xenc:EncryptedData")) return soap_wsse_fault(soap, wsse__FailedCheck, NULL); return SOAP_OK; } /******************************************************************************\ * * Callbacks registered by plugin * \******************************************************************************/ /** @fn int soap_wsse_header(struct soap *soap) @brief This callback is invoked as soon as the SOAP Header is received, we need to obtain the encrypted key when the message is encrypted to start decryption. @param soap context @return SOAP_OK or error code */ static int soap_wsse_header(struct soap *soap) { /* look for encrypted elements in Body */ /* soap->feltbegin = soap_wsse_element_begin_in; Moved, now always set */ /* soap->feltendin = soap_wsse_element_end_in; Moved, now always set */ /* get the encrypted key, if present */ return soap_wsse_verify_EncryptedKey(soap); } /** @fn int soap_wsse_element_begin_in(struct soap *soap, const char *tag) @brief This callback is invoked as soon as a starting tag of an element is received by the XML parser. @param soap context @param[in] tag name of the element parsed @return SOAP_OK or error code */ static int soap_wsse_element_begin_in(struct soap *soap, const char *tag) { /* make sure we always have a header allocated */ if (soap->part == SOAP_IN_ENVELOPE) soap_header(soap); if (!soap_match_tag(soap, tag, "xenc:EncryptedData")) { struct soap_dom_element *dom = soap->dom; /* disable DOM */ soap->dom = NULL; /* parse encryption tags */ if (soap_wsse_decrypt_begin(soap)) return soap->error; /* adjust DOM tree to skip encryption elements */ soap->dom = dom->prnt; soap->dom->elts = NULL; /* adjust nesting level */ soap->level -= 3; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Decryption started, parsing decrypted XML\n")); soap->event = SOAP_SEC_DECRYPT; return soap_peek_element(soap); } return SOAP_OK; } /** @fn int soap_wsse_element_end_in(struct soap *soap, const char *tag1, const char *tag2) @brief This callback is invoked as soon as an ending tag of an element is received by the XML parser. @param soap context @param[in] tag1 name of the element parsed @param[in] tag2 name of the element that was expected by the parser's state, or NULL @return SOAP_OK or error code */ static int soap_wsse_element_end_in(struct soap *soap, const char *tag1, const char *tag2) { if (soap->event == SOAP_SEC_DECRYPT && soap->dom && soap->dom->elts && !soap_match_tag(soap, tag1, ":CipherValue")) { struct soap_dom_element *dom = soap->dom->elts; soap->event = 0; /* disable DOM */ soap->dom = NULL; /* adjust nesting level */ soap->level += 3; /* parse ending tags */ if (soap_mec_stop(soap) || soap_element_end_in(soap, ":CipherData") || soap_element_end_in(soap, ":EncryptedData")) return soap_wsse_fault(soap, wsse__FailedCheck, NULL); /* adjust DOM tree to skip encryption elements */ while (dom->next) dom = dom->next; /* remove the old indent before ending tag */ dom->tail = NULL; /* enable DOM */ soap->dom = dom; if (soap_element_end_in(soap, tag2)) return soap->error; } return SOAP_OK; } /** @fn int soap_wsse_element_begin_out(struct soap *soap, const char *tag) @brief This callback is invoked as soon as a starting tag of an element is to be sent by the XML generator. @param soap context @param[in] tag name of the element @return SOAP_OK or error code */ static int soap_wsse_element_begin_out(struct soap *soap, const char *tag) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); if (data && !data->encid && !strcmp(tag, "SOAP-ENV:Body")) { _wsse__Security *security = soap_wsse_Security(soap); char *URI = NULL; if (security && security->xenc__EncryptedKey && security->xenc__EncryptedKey->Id) { const char *Id = security->xenc__EncryptedKey->Id; size_t l = strlen(Id); if (!(URI = (char*)soap_malloc(soap, l + 2))) return soap->error = SOAP_EOM; *URI = '#'; soap_strcpy(URI + 1, l + 1, Id); } /* this only encrypts the Body, so stop the callback */ if (!(soap->mode & SOAP_IO_LENGTH)) soap->feltbegout = NULL; return soap_wsse_encrypt_begin(soap, "Body", data->enco_alg, URI, data->enco_keyname, NULL); } else if (data && data->encid && soap_tagsearch(data->encid, tag)) { _wsse__Security *security = soap_wsse_Security(soap); char *URI = NULL; if (security && security->xenc__EncryptedKey && security->xenc__EncryptedKey->Id) { const char *Id = security->xenc__EncryptedKey->Id; size_t l = strlen(Id); if (!(URI = (char*)soap_malloc(soap, l + 2))) return soap->error = SOAP_EOM; *URI = '#'; soap_strcpy(URI + 1, l + 1, Id); } return soap_wsse_encrypt_begin(soap, soap_wsse_ids(soap, tag), data->enco_alg, URI, data->enco_keyname, NULL); } return SOAP_OK; } /** @fn int soap_wsse_element_end_out(struct soap *soap, const char *tag) @brief This callback is invoked as soon as an ending tag of an element is to be sent by the XML generator. @param soap context @param[in] tag name of the element @return SOAP_OK or error code */ static int soap_wsse_element_end_out(struct soap *soap, const char *tag) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); if (data && !data->encid && !strcmp(tag, "SOAP-ENV:Body")) { if (soap_wsse_encrypt_end(soap)) return soap->error; /* this version only encrypts Body, so stop the callback */ if (!(soap->mode & SOAP_IO_LENGTH)) soap->feltendout = NULL; } else if (data && data->encid && soap_tagsearch(data->encid, tag)) { if (soap_wsse_encrypt_end(soap)) return soap->error; } return SOAP_OK; } /** @fn int soap_wsse_preparesend(struct soap *soap, const char *buf, size_t len) @brief Takes a piece of the XML message (tokenized) to compute digest. @param soap context @param[in] buf string (XML "tokenized") to be sent @param[in] len buf length @return SOAP_OK or fault This callback is invoked to analyze a message (usually during the HTTP content length phase). @note Nested elements with wsu:Id attributes cannot be individually signed. */ static int soap_wsse_preparesend(struct soap *soap, const char *buf, size_t len) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); DBGFUN("soap_wsse_preparesend"); if (!data) return SOAP_PLUGIN_ERROR; soap->c14ninclude = data->prefixlist; /* the gSOAP engine signals the start of a wsu:Id element */ if (soap->event == SOAP_SEC_BEGIN) { int alg; /* start new digest or continue? */ if (data->digest && data->digest->level) soap->event = SOAP_SEC_SIGN; else if (!data->sigid || soap_tagsearch(data->sigid, soap->id)) { /* initialize smdevp engine */ struct soap_wsse_digest *digest; size_t l = strlen(soap->id); soap->event = SOAP_SEC_SIGN; digest = (struct soap_wsse_digest*)SOAP_MALLOC(soap, sizeof(struct soap_wsse_digest) + l + 1); digest->next = data->digest; digest->level = soap->level; /* digest hash strength is same as signature strength */ alg = (SOAP_SMD_DGST | (data->sign_alg & SOAP_SMD_HASH)); soap_smd_init(soap, &digest->smd, alg, NULL, 0); memset((void*)digest->hash, 0, sizeof(digest->hash)); digest->id[0] = '#'; soap_strcpy(digest->id + 1, l + 1, soap->id); data->digest = digest; /* omit indent for indented XML (next time around, we will catch '<') */ if (*buf != '<') goto end; } } if (soap->event == SOAP_SEC_SIGN) { /* update smdevp engine */ if (data->digest && data->digest->level) { soap_smd_update(soap, &data->digest->smd, buf, len); if (soap->level < data->digest->level) { soap->event = 0; soap_smd_final(soap, &data->digest->smd, (char*)data->digest->hash, NULL); data->digest->level = 0; } } } end: if (data->fpreparesend) return data->fpreparesend(soap, buf, len); return SOAP_OK; } /** @fn int soap_wsse_preparefinalsend(struct soap *soap) @brief Collects the digests of all the wsu:Id elements and populates the SignedInfo. @param soap context @return SOAP_OK or fault This callback is invoked just before the message is sent. */ static int soap_wsse_preparefinalsend(struct soap *soap) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); DBGFUN("soap_wsse_preparefinalsend"); if (!data) return SOAP_PLUGIN_ERROR; if (data->digest) { ds__SignatureType *signature = soap_wsse_Signature(soap); struct soap_wsse_digest *digest; const char *transform; int alg, signature_added = 0; /* if message is canonicalized populate transform element accordingly */ if (soap->mode & SOAP_XML_CANONICAL) transform = c14n_URI; else transform = NULL; /* to increase the message length counter we need to emit the Signature, SignedInfo and SignatureValue elements. However, this does not work if we already populated the wsse:Signature with SignedInfo and should never happen! */ if (!signature) { signature = soap_wsse_add_Signature(soap); signature_added = 1; } else if (signature->SignedInfo) return soap_set_receiver_error(soap, "wsse error", "Cannot use soap_wsse_sign with populated SignedInfo", SOAP_SSL_ERROR); /* digest hash strength is same as signature strength */ alg = (SOAP_SMD_DGST | (data->sign_alg & SOAP_SMD_HASH)); /* add the SignedInfo/Reference elements for each digest */ for (digest = data->digest; digest; digest = digest->next) if (soap_wsse_add_SignedInfo_Reference(soap, digest->id, transform, data->prefixlist, alg, (char*)digest->hash)) return soap->error; /* then compute the signature and add it */ if (soap_wsse_add_SignatureValue(soap, data->sign_alg, data->sign_key, data->sign_keylen)) return soap->error; /* Reset the callbacks and cleanup digests */ soap_wsse_preparecleanup(soap, data); /* if non-chunked, adjust content length */ if ((soap->mode & SOAP_IO) != SOAP_IO_CHUNK) { /* the code below ensures we increase the HTTP length counter */ short part = soap->part; soap->part = SOAP_IN_HEADER; /* header encoding rules (literal) */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Counting the size of additional SOAP Header elements, mode=0x%x\n", soap->mode)); if (signature_added) { const char *c14ninclude = soap->c14ninclude; soap->c14ninclude = NULL; soap->level = 3; /* indent level for XML Signature */ if (soap->mode & SOAP_XML_CANONICAL && soap->mode & SOAP_XML_INDENT) { soap->ns = 0; /* need namespaces for canonicalization */ soap->count += 4; /* correction for soap->ns = 0: add \n+indent */ } soap_out_ds__SignatureType(soap, "ds:Signature", 0, signature, NULL); soap->c14ninclude = c14ninclude; } else { const char *c14nexclude = soap->c14nexclude; soap->c14nexclude = "ds"; /* don't add xmlns:ds to count msg len */ soap->level = 4; /* indent level for XML SignedInfo */ if (soap->mode & SOAP_XML_CANONICAL && soap->mode & SOAP_XML_INDENT) { soap->ns = 0; /* need namespaces for canonicalization */ soap->count += 5; /* correction for soap->ns = 0: add \n+indent */ } soap_out_ds__SignedInfoType(soap, "ds:SignedInfo", 0, signature->SignedInfo, NULL); soap_outstring(soap, "ds:SignatureValue", 0, &signature->SignatureValue, NULL, 0); soap->c14nexclude = c14nexclude; } soap->part = part; } } else /* Reset the callbacks and cleanup digests */ soap_wsse_preparecleanup(soap, data); if (soap->fpreparefinalsend) return soap->fpreparefinalsend(soap); return SOAP_OK; } /** @fn void soap_wsse_preparecleanup(struct soap *soap, struct soap_wsse_data *data) @brief Restores engine state. @param soap context @param[in,out] data plugin data */ static void soap_wsse_preparecleanup(struct soap *soap, struct soap_wsse_data *data) { struct soap_wsse_digest *digest, *next; DBGFUN("soap_wsse_preparecleanup"); data->sign_alg = SOAP_SMD_NONE; data->sign_key = NULL; data->sign_keylen = 0; if (soap->fpreparesend == soap_wsse_preparesend) soap->fpreparesend = data->fpreparesend; if (soap->fpreparefinalsend == soap_wsse_preparefinalsend) soap->fpreparefinalsend = data->fpreparefinalsend; data->fpreparesend = NULL; data->fpreparefinalsend = NULL; for (digest = data->digest; digest; digest = next) { next = digest->next; SOAP_FREE(soap, digest); } data->digest = NULL; } /** @fn int soap_wsse_preparefinalrecv(struct soap *soap) @brief Verify signature and SignedInfo digests initiated with soap_wsse_verify_auto. @param soap context @return SOAP_OK or fault @see soap_wsse_verify_auto This callback is invoked just after a message was received. */ static int soap_wsse_preparefinalrecv(struct soap *soap) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); ds__SignedInfoType *signedInfo = soap_wsse_SignedInfo(soap); soap->omode &= ~SOAP_SEC_WSUID; data->sigid = NULL; /* so we must set again before next send */ data->encid = NULL; /* so we must set again before next send */ DBGFUN("soap_wsse_preparefinalrecv"); if (!data) return SOAP_PLUGIN_ERROR; if (data->deco_alg != SOAP_MEC_NONE && data->mec) if (soap_mec_end(soap, data->mec)) return soap_wsse_fault(soap, wsse__FailedCheck, NULL); data->deco_alg = SOAP_MEC_NONE; if (signedInfo) { int err = SOAP_OK, alg, bits, keylen = 0; EVP_PKEY *pkey = NULL; const void *key = NULL; /* determine which signature algorithm was used */ if (soap_wsse_get_SignedInfo_SignatureMethod(soap, &alg, &bits)) return soap->error; /* for HMAC-SHA1, the secret key might be stored in the KeyIdentifier */ if ((alg & SOAP_SMD_ALGO) == SOAP_SMD_HMAC) { const char *valueType = soap_wsse_get_KeyInfo_SecurityTokenReferenceKeyIdentifierValueType(soap); /* if in the KeyIdentifier, retrieve it */ if (valueType && !strcmp(valueType, ds_hmac_sha1URI)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Using HMAC key from KeyIdentifier to verify signature\n")); key = soap_wsse_get_KeyInfo_SecurityTokenReferenceKeyIdentifier(soap, &keylen); } /* next, try the plugin's security token handler */ if (!key) { if (data->security_token_handler) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Getting HMAC key through security_token_handler callback\n")); key = data->security_token_handler(soap, &alg, NULL, &keylen); } } /* still no key: try to get it from the plugin */ if (!key && alg == (data->vrfy_alg & SOAP_SMD_MASK)) { /* get the HMAC secret key from the plugin */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Using HMAC key from plugin to verify signature\n")); key = data->vrfy_key; keylen = data->vrfy_keylen; } } else { /* get the certificate from the KeyInfo reference */ X509 *cert, *cert1; cert = cert1 = soap_wsse_get_KeyInfo_SecurityTokenReferenceX509(soap); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Got cert=%p\n", cert)); /* next, try the plugin's security token handler */ if (!cert) { if (data->security_token_handler) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Getting certificate through security_token_handler callback\n")); cert = (X509*)data->security_token_handler(soap, &alg, NULL, &keylen); } } /* obtain the public key from the cert */ if (cert) { pkey = X509_get_pubkey((X509*)cert); key = (void*)pkey; } else if (alg == (data->vrfy_alg & SOAP_SMD_MASK)) { /* get the public key from the plugin */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Using public key from plugin to verify signature\n")); key = data->vrfy_key; soap->error = SOAP_OK; } if (cert1) X509_free(cert1); } /* if still no key, fault */ if (!key) err = soap_wsse_fault(soap, wsse__SecurityTokenUnavailable, NULL); /* verify SignedInfo with signature and check digests of local elements */ else if (soap_wsse_verify_SignatureValue(soap, alg, key, keylen) || soap_wsse_verify_SignedInfo(soap)) err = soap->error; if (pkey) EVP_PKEY_free(pkey); if (err) return err; if (data->fpreparefinalrecv && data->fpreparefinalrecv != soap_wsse_preparefinalrecv) return data->fpreparefinalrecv(soap); } else if (!soap->fault) return soap_wsse_fault(soap, wsse__FailedCheck, "Signature required"); return SOAP_OK; } #ifdef __cplusplus } #endif gsoap-2.8.28/gsoap/plugin/httpda.c0000644000175000017500000010620412653650150016331 0ustar ellertellert/* httpda.c gSOAP HTTP Digest Authentication plugin. Supports both Basic and Digest authentication. gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under one of the following licenses: GPL, the gSOAP public license, or Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2015, Robert van Engelen, Genivia, Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ /** @mainpage - @ref httpda documents the http_da plugin for HTTP Digest Authentication. */ /** @page httpda The HTTP-DA plugin [TOC] @section httpda_0 HTTP-DA Setup Additional build steps required: - Compile all sources with `-DWITH_OPENSSL` - Link libgsoapssl (libgsoapssl++), or use the lib's stdsoap2.c/.cpp source - Compile and link with plugin/httpda.c, plugin/md5evp.c, and plugin/threads.c @section httpda_1 Client-Side Usage HTTP Basic Authentication is the default authentication supported by gSOAP. The credentials for client-side use age set with: @code soap.userid = ""; soap.passed = ""; if (soap_call_ns__method(&soap, ...)) ... // error @endcode HTTP Basic Authentication should never be used over plain HTTP, because the user ID and password are sent in the clear. It is safe(r) to use over HTTPS, because the HTTP headers and body are encrypted. The better alternative is to use HTTP Digest Authentication, which uses the digest (hash value) of the credentials and avoids a plain-text password exchange. To use HTTP Digest Authentication with gSOAP, register the http_da plugin: @code #include "httpda.h" soap_register_plugin(&soap, http_da); @endcode To make a client-side service call: @code struct http_da_info info; if (soap_call_ns__method(&soap, ...)) { if (soap.error == 401) { http_da_save(&soap, &info, "", "", ""); if (soap_call_ns__method(&soap, ...)) // try again ... // error http_da_release(&soap, &info); } else ... // other error } @endcode The "" is a string that is associated with the server's realm. It can be obtained after an unsuccessful non-authenticated call: @code if (soap_call_ns__method(&soap, ...)) { if (soap.error == 401) // HTTP authentication is required { const char *realm = soap.authrealm; ... } else ... // error } @endcode Before a second call is made to the same endpoint that requires authentication, you must restore the authentication state and then finally release it: @code struct http_da_info info; bool auth = false; if (soap_call_ns__method(&soap, ...)) { if (soap.error == 401) { http_da_save(&soap, &info, "", "", ""); auth = true; } else ... // other error } if (soap_call_ns__method(&soap, ...)) ... // error if (auth) http_da_restore(&soap, &info); if (soap_call_ns__method(&soap, ...)) ... // error soap_destroy(&soap); // okay to dealloc data soap_end(&soap); // okay to dealloc data if (auth) http_da_restore(&soap, &info); if (soap_call_ns__method(&soap, ...)) ... // error if (auth) http_da_release(&soap, &info); soap_destroy(&soap); soap_end(&soap); soap_done(&soap); @endcode For HTTP proxies requiring HTTP Digest Authenticaiton, use the 'proxy' functions: @code struct http_da_info info; ... if (soap_call_ns__method(&soap, ...)) { if (soap.error == 407) { http_da_proxy_save(&soap, &info, "", "", ""); auth = true; } else ... // error } if (auth) http_da_proxy_restore(&soap, &info); if (soap_call_ns__method(&soap, ...)) ... // error http_da_proxy_release(&soap, &info); soap_destroy(&soap); soap_end(&soap); soap_done(&soap); @endcode @section httpda_2 Client Example A client authenticating against a server: @code soap_register_plugin(&soap, http_da); // try calling without authenticating if (soap_call_ns__method(&soap, ...)) { if (soap.error == 401) // HTTP authentication is required { if (!strcmp(soap.authrealm, authrealm)) // check authentication realm { struct http_da_info info; // to store userid and passwd http_da_save(&soap, &info, authrealm, userid, passwd); // call again, now with credentials if (soap_call_ns__method(&soap, ...) == SOAP_OK) { ... // process response data soap_end(&soap); ... // userid and passwd were deallocated (!) http_da_restore(&soap, &info); // get userid and passwd after soap_end() if (!soap_call_ns__method(&soap, ...) == SOAP_OK) ... // error http_da_release(&soap, &info); // free data and remove userid and passwd @endcode A client authenticating against a proxy: @code soap_register_plugin(&soap, http_da); // try calling without authenticating if (soap_call_ns__method(&soap, ...)) { if (soap.error == 407) // HTTP authentication is required { if (!strcmp(soap.authrealm, authrealm)) // check authentication realm { struct http_da_info info; // to store userid and passwd http_da_proxy_save(&soap, &info, authrealm, userid, passwd); // call again, now with credentials if (soap_call_ns__method(&soap, ...) == SOAP_OK) { ... // process response data soap_end(&soap); ... // userid and passwd were deallocated (!) http_da_proxy_restore(&soap, &info); // get userid and passwd after soap_end() if (!soap_call_ns__method(&soap, ...) == SOAP_OK) ... // error http_da_proxy_release(&soap, &info); // free data and remove userid and passwd @endcode @section httpda_3 Server-Side Usage Server-side HTTP Basic Authentication can be enforced by simply checking the soap.userid and soap.passwd values in a service method that requires client authentication: @code soap_register_plugin(&soap, http_da); ... soap_serve(&soap); ... int ns__method(struct soap *soap, ...) { if (!soap->userid || !soap->passwd || strcmp(soap->userid, "") || strcmp(soap->passwd, "")) return 401; // HTTP authentication required ... } @endcode HTTP Digest Authentication is verified differently: @code soap_register_plugin(&soap, http_da); ... soap_serve(&soap); ... int ns__method(struct soap *soap, ...) { if (soap->authrealm && soap->userid) { passwd = ... // database lookup on userid and authrealm to find passwd if (!strcmp(soap->authrealm, authrealm) && !strcmp(soap->userid, userid)) { if (!http_da_verify_post(soap, passwd)) // HTTP POST DA verification { ... // process request and produce response return SOAP_OK; } } } soap->authrealm = authrealm; // realm to send to client return 401; // Not authorized, challenge with digest authentication @endcode The `http_da_verify_post` function checks the HTTP POST credentials. To verify an HTTP GET operation, use `http_da_verify_get`. @section httpda_4 Server Example @code soap_register_plugin(&soap, http_da); ... soap_serve(&soap); ... int ns__method(struct soap *soap, ...) { if (soap->userid && soap->passwd) // Basic authentication { if (!strcmp(soap->userid, userid) && !strcmp(soap->passwd, passwd)) { ... // can also check soap->authrealm ... // process request and produce response return SOAP_OK; } } else if (soap->authrealm && soap->userid) // Digest authentication { passwd = ... // database lookup on userid and authrealm to find passwd if (!strcmp(soap->authrealm, authrealm) && !strcmp(soap->userid, userid)) { if (!http_da_verify_post(soap, passwd)) // HTTP POST DA verification { ... // process request and produce response return SOAP_OK; } } } soap->authrealm = authrealm; // realm to send to client return 401; // Not authorized, challenge with digest authentication } @endcode @section httpda_5 HTTP Digest Authentication Limitations HTTP Digest Authentication cannot be used with streaming MTOM/MIME/DIME attachments. Streaming is turned off by the plugin and attachment data is buffered rather than streamed. Non-streaming MTOM/MIME/DIME attachments are handled just fine. */ #include "httpda.h" #ifdef __cplusplus extern "C" { #endif const char http_da_id[] = HTTP_DA_ID; /** HTTP DA session database */ static struct http_da_session *http_da_session = NULL; /** HTTP DA session database lock */ static MUTEX_TYPE http_da_session_lock = MUTEX_INITIALIZER; #define HTTP_DA_NONCELEN (21) #define HTTP_DA_OPAQUELEN (9) /******************************************************************************\ * * Forward decls * \******************************************************************************/ static int http_da_init(struct soap *soap, struct http_da_data *data); static int http_da_copy(struct soap *soap, struct soap_plugin *dst, struct soap_plugin *src); static void http_da_delete(struct soap *soap, struct soap_plugin *p); static int http_da_post_header(struct soap *soap, const char *key, const char *val); static int http_da_parse(struct soap *soap); static int http_da_parse_header(struct soap *soap, const char *key, const char *val); static int http_da_prepareinitsend(struct soap *soap); static int http_da_prepareinitrecv(struct soap *soap); static int http_da_preparesend(struct soap *soap, const char *buf, size_t len); static int http_da_preparerecv(struct soap *soap, const char *buf, size_t len); static int http_da_preparefinalrecv(struct soap *soap); static int http_da_verify_method(struct soap *soap, const char *method, const char *passwd); static void http_da_session_start(const char *realm, const char *nonce, const char *opaque); static int http_da_session_update(const char *realm, const char *nonce, const char *opaque, const char *cnonce, const char *ncount); static void http_da_session_cleanup(); void http_da_calc_nonce(struct soap *soap, char nonce[HTTP_DA_NONCELEN]); void http_da_calc_opaque(struct soap *soap, char opaque[HTTP_DA_OPAQUELEN]); static void http_da_calc_HA1(struct soap *soap, void **context, const char *alg, const char *userid, const char *realm, const char *passwd, const char *nonce, const char *cnonce, char HA1hex[33]); static void http_da_calc_response(struct soap *soap, void **context, char HA1hex[33], const char *nonce, const char *ncount, const char *cnonce, const char *qop, const char *method, const char *uri, char entityHAhex[33], char response[33], char responseHA[16]); /******************************************************************************\ * * Plugin registry * \******************************************************************************/ int http_da(struct soap *soap, struct soap_plugin *p, void *arg) { (void)arg; p->id = http_da_id; p->data = (void*)SOAP_MALLOC(soap, sizeof(struct http_da_data)); p->fcopy = http_da_copy; p->fdelete = http_da_delete; if (p->data) { if (http_da_init(soap, (struct http_da_data*)p->data)) { SOAP_FREE(soap, p->data); return SOAP_EOM; } } return SOAP_OK; } static int http_da_init(struct soap *soap, struct http_da_data *data) { data->fposthdr = soap->fposthdr; soap->fposthdr = http_da_post_header; data->fparse = soap->fparse; soap->fparse = http_da_parse; data->fparsehdr = soap->fparsehdr; soap->fparsehdr = http_da_parse_header; data->fprepareinitsend = soap->fprepareinitsend; soap->fprepareinitsend = http_da_prepareinitsend; data->fprepareinitrecv = soap->fprepareinitrecv; soap->fprepareinitrecv = http_da_prepareinitrecv; data->context = NULL; memset((void*)data->digest, 0, sizeof(data->digest)); data->nonce = NULL; data->opaque = NULL; data->qop = NULL; data->alg = NULL; data->nc = 0; data->ncount = NULL; data->cnonce = NULL; memset((void*)data->response, 0, sizeof(data->response)); return SOAP_OK; } static int http_da_copy(struct soap *soap, struct soap_plugin *dst, struct soap_plugin *src) { dst->data = (void*)SOAP_MALLOC(soap, sizeof(struct http_da_data)); soap_memcpy((void*)dst->data, sizeof(struct http_da_data), (const void*)src->data, sizeof(struct http_da_data)); ((struct http_da_data*)dst->data)->context = NULL; memset((void*)((struct http_da_data*)dst->data)->digest, 0, sizeof(((struct http_da_data*)dst->data)->digest)); ((struct http_da_data*)dst->data)->nonce = NULL; ((struct http_da_data*)dst->data)->opaque = NULL; ((struct http_da_data*)dst->data)->qop = NULL; ((struct http_da_data*)dst->data)->alg = NULL; ((struct http_da_data*)dst->data)->nc = 0; ((struct http_da_data*)dst->data)->ncount = NULL; ((struct http_da_data*)dst->data)->cnonce = NULL; memset((void*)((struct http_da_data*)dst->data)->response, 0, sizeof(((struct http_da_data*)dst->data)->response)); return SOAP_OK; } static void http_da_delete(struct soap *soap, struct soap_plugin *p) { if (((struct http_da_data*)p->data)->context) md5_handler(soap, &((struct http_da_data*)p->data)->context, MD5_DELETE, NULL, 0); if (p->data) SOAP_FREE(soap, p->data); } /******************************************************************************\ * * Callbacks * \******************************************************************************/ static int http_da_post_header(struct soap *soap, const char *key, const char *val) { struct http_da_data *data = (struct http_da_data*)soap_lookup_plugin(soap, http_da_id); if (!data) return SOAP_PLUGIN_ERROR; /* client's HTTP Authorization request */ if (key && (!strcmp(key, "Authorization") || !strcmp(key, "Proxy-Authorization"))) { char HA1[33], entityHAhex[33], response[33], responseHA[16]; char cnonce[HTTP_DA_NONCELEN]; char ncount[9]; const char *qop, *method; const char *userid = (*key == 'A' ? soap->userid : soap->proxy_userid); const char *passwd = (*key == 'A' ? soap->passwd : soap->proxy_passwd); md5_handler(soap, &data->context, MD5_FINAL, data->digest, 0); if (!userid || !passwd || !soap->authrealm || !data->nonce) { #ifdef SOAP_DEBUG fprintf(stderr, "Debug message: authentication header failed, missing authentication data\n"); #endif return SOAP_OK; } http_da_calc_nonce(soap, cnonce); http_da_calc_HA1(soap, &data->context, data->alg, userid, soap->authrealm, passwd, data->nonce, cnonce, HA1); if (soap->status != SOAP_GET && soap->status != SOAP_CONNECT && data->qop && !soap_tag_cmp(data->qop, "*auth-int*")) { qop = "auth-int"; soap_s2hex(soap, (unsigned char*)data->digest, entityHAhex, 16); } else if (data->qop) qop = "auth"; else qop = NULL; if (soap->status == SOAP_GET) method = "GET"; else if (soap->status == SOAP_CONNECT) method = "CONNECT"; else method = "POST"; (SOAP_SNPRINTF(ncount, sizeof(ncount), 8), "%8.8lx", data->nc++); http_da_calc_response(soap, &data->context, HA1, data->nonce, ncount, cnonce, qop, method, soap->path, entityHAhex, response, responseHA); (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), strlen(soap->authrealm) + strlen(userid) + strlen(data->nonce) + strlen(soap->path) + strlen(ncount) + strlen(cnonce) + strlen(response) + 75), "Digest realm=\"%s\", username=\"%s\", nonce=\"%s\", uri=\"%s\", nc=%s, cnonce=\"%s\", response=\"%s\"", soap->authrealm, userid, data->nonce, soap->path, ncount, cnonce, response); if (data->opaque) { size_t l = strlen(soap->tmpbuf); (SOAP_SNPRINTF(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, strlen(data->opaque) + 11), ", opaque=\"%s\"", data->opaque); } if (qop) { size_t l = strlen(soap->tmpbuf); (SOAP_SNPRINTF(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, strlen(qop) + 8), ", qop=\"%s\"", qop); } return data->fposthdr(soap, key, soap->tmpbuf); } /* server's HTTP Authorization challenge/response */ if (key && (!strcmp(key, "WWW-Authenticate") || !strcmp(key, "Proxy-Authenticate"))) { char nonce[HTTP_DA_NONCELEN]; char opaque[HTTP_DA_OPAQUELEN]; http_da_calc_nonce(soap, nonce); http_da_calc_opaque(soap, opaque); http_da_session_start(soap->authrealm, nonce, opaque); (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), strlen(soap->authrealm) + strlen(nonce) + strlen(opaque) + 59), "Digest realm=\"%s\", qop=\"auth,auth-int\", nonce=\"%s\", opaque=\"%s\"", soap->authrealm, nonce, opaque); return data->fposthdr(soap, key, soap->tmpbuf); } return data->fposthdr(soap, key, val); } static int http_da_parse(struct soap *soap) { struct http_da_data *data = (struct http_da_data*)soap_lookup_plugin(soap, http_da_id); if (!data) return SOAP_PLUGIN_ERROR; data->qop = NULL; /* HTTP GET w/o body with qop=auth-int still requires a digest */ md5_handler(soap, &data->context, MD5_INIT, NULL, 0); md5_handler(soap, &data->context, MD5_FINAL, data->digest, 0); if ((soap->error = data->fparse(soap))) return soap->error; if (data->qop && !soap_tag_cmp(data->qop, "auth-int")) { if (soap->fpreparerecv != http_da_preparerecv) { data->fpreparerecv = soap->fpreparerecv; soap->fpreparerecv = http_da_preparerecv; } if (soap->fpreparefinalrecv != http_da_preparefinalrecv) { data->fpreparefinalrecv = soap->fpreparefinalrecv; soap->fpreparefinalrecv = http_da_preparefinalrecv; } md5_handler(soap, &data->context, MD5_INIT, NULL, 0); } return SOAP_OK; } static int http_da_parse_header(struct soap *soap, const char *key, const char *val) { struct http_da_data *data = (struct http_da_data*)soap_lookup_plugin(soap, http_da_id); if (!data) return SOAP_PLUGIN_ERROR; /* check if server received Authorization Digest HTTP header from client */ if (!soap_tag_cmp(key, "Authorization") && !soap_tag_cmp(val, "Digest *")) { soap->authrealm = soap_strdup(soap, soap_get_header_attribute(soap, val + 7, "realm")); soap->userid = soap_strdup(soap, soap_get_header_attribute(soap, val + 7, "username")); soap->passwd = NULL; data->nonce = soap_strdup(soap, soap_get_header_attribute(soap, val + 7, "nonce")); data->opaque = soap_strdup(soap, soap_get_header_attribute(soap, val + 7, "opaque")); data->qop = soap_strdup(soap, soap_get_header_attribute(soap, val + 7, "qop")); data->alg = NULL; data->ncount = soap_strdup(soap, soap_get_header_attribute(soap, val + 7, "nc")); data->cnonce = soap_strdup(soap, soap_get_header_attribute(soap, val + 7, "cnonce")); soap_hex2s(soap, soap_get_header_attribute(soap, val + 7, "response"), data->response, 16, NULL); return SOAP_OK; } /* check if client received WWW-Authenticate Digest HTTP header from server */ if ((!soap_tag_cmp(key, "WWW-Authenticate") || !soap_tag_cmp(key, "Proxy-Authenticate")) && !soap_tag_cmp(val, "Digest *")) { soap->authrealm = soap_strdup(soap, soap_get_header_attribute(soap, val + 7, "realm")); data->nonce = soap_strdup(soap, soap_get_header_attribute(soap, val + 7, "nonce")); data->opaque = soap_strdup(soap, soap_get_header_attribute(soap, val + 7, "opaque")); data->qop = soap_strdup(soap, soap_get_header_attribute(soap, val + 7, "qop")); data->alg = soap_strdup(soap, soap_get_header_attribute(soap, val + 7, "algorithm")); data->nc = 1; data->ncount = NULL; data->cnonce = NULL; return SOAP_OK; } return data->fparsehdr(soap, key, val); } static int http_da_prepareinitsend(struct soap *soap) { struct http_da_data *data = (struct http_da_data*)soap_lookup_plugin(soap, http_da_id); if (!data) return SOAP_PLUGIN_ERROR; if ((soap->mode & SOAP_IO) != SOAP_IO_STORE && (soap->mode & (SOAP_ENC_DIME | SOAP_ENC_MIME))) { /* support non-streaming MIME/DIME attachments by buffering the message */ soap->omode &= ~SOAP_IO; soap->omode |= SOAP_IO_STORE; soap->mode &= ~SOAP_IO; soap->mode |= SOAP_IO_STORE; } else { if ((soap->userid && soap->passwd) || (soap->proxy_userid && soap->proxy_passwd)) { md5_handler(soap, &data->context, MD5_INIT, NULL, 0); if (soap->fpreparesend != http_da_preparesend) { data->fpreparesend = soap->fpreparesend; soap->fpreparesend = http_da_preparesend; } if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK) soap->mode |= SOAP_IO_LENGTH; } } if (data->fprepareinitsend) return data->fprepareinitsend(soap); return SOAP_OK; } static int http_da_prepareinitrecv(struct soap *soap) { struct http_da_data *data = (struct http_da_data*)soap_lookup_plugin(soap, http_da_id); if (!data) return SOAP_PLUGIN_ERROR; if (soap->fpreparerecv == http_da_preparerecv) soap->fpreparerecv = data->fpreparerecv; if (soap->fpreparefinalrecv == http_da_preparefinalrecv) soap->fpreparefinalrecv = data->fpreparefinalrecv; if (data->fprepareinitrecv) return data->fprepareinitrecv(soap); return SOAP_OK; } static int http_da_preparesend(struct soap *soap, const char *buf, size_t len) { struct http_da_data *data = (struct http_da_data*)soap_lookup_plugin(soap, http_da_id); if (!data) return SOAP_PLUGIN_ERROR; md5_handler(soap, &data->context, MD5_UPDATE, (char*)buf, len); if (data->fpreparesend) return data->fpreparesend(soap, buf, len); return SOAP_OK; } static int http_da_preparerecv(struct soap *soap, const char *buf, size_t len) { struct http_da_data *data = (struct http_da_data*)soap_lookup_plugin(soap, http_da_id); if (!data) return SOAP_PLUGIN_ERROR; md5_handler(soap, &data->context, MD5_UPDATE, (char*)buf, len); if (data->fpreparerecv) return data->fpreparerecv(soap, buf, len); return SOAP_OK; } static int http_da_preparefinalrecv(struct soap *soap) { struct http_da_data *data = (struct http_da_data*)soap_lookup_plugin(soap, http_da_id); if (!data) return SOAP_PLUGIN_ERROR; md5_handler(soap, &data->context, MD5_FINAL, data->digest, 0); soap->fpreparerecv = data->fpreparerecv; soap->fpreparefinalrecv = data->fpreparefinalrecv; if (soap->fpreparefinalrecv) return soap->fpreparefinalrecv(soap); return SOAP_OK; } /******************************************************************************\ * * Client-side digest authentication state management * \******************************************************************************/ void http_da_save(struct soap *soap, struct http_da_info *info, const char *realm, const char *userid, const char *passwd) { struct http_da_data *data = (struct http_da_data*)soap_lookup_plugin(soap, http_da_id); if (!data) return; soap->authrealm = info->authrealm = soap_strdup(NULL, realm); info->userid = soap_strdup(NULL, userid); soap->userid = info->userid; info->passwd = soap_strdup(NULL, passwd); soap->passwd = info->passwd; info->nonce = soap_strdup(NULL, data->nonce); info->opaque = soap_strdup(NULL, data->opaque); info->qop = soap_strdup(NULL, data->qop); info->alg = soap_strdup(NULL, data->alg); } void http_da_proxy_save(struct soap *soap, struct http_da_info *info, const char *realm, const char *userid, const char *passwd) { struct http_da_data *data = (struct http_da_data*)soap_lookup_plugin(soap, http_da_id); if (!data) return; soap->authrealm = info->authrealm = soap_strdup(NULL, realm); info->userid = soap_strdup(NULL, userid); soap->proxy_userid = info->userid; info->passwd = soap_strdup(NULL, passwd); soap->proxy_passwd = info->passwd; info->nonce = soap_strdup(NULL, data->nonce); info->opaque = soap_strdup(NULL, data->opaque); info->qop = soap_strdup(NULL, data->qop); info->alg = soap_strdup(NULL, data->alg); } void http_da_restore(struct soap *soap, struct http_da_info *info) { struct http_da_data *data = (struct http_da_data*)soap_lookup_plugin(soap, http_da_id); if (!data) return; soap->authrealm = info->authrealm; soap->userid = info->userid; soap->passwd = info->passwd; data->nonce = info->nonce; data->opaque = info->opaque; data->qop = info->qop; data->alg = info->alg; } void http_da_proxy_restore(struct soap *soap, struct http_da_info *info) { struct http_da_data *data = (struct http_da_data*)soap_lookup_plugin(soap, http_da_id); if (!data) return; soap->authrealm = info->authrealm; soap->proxy_userid = info->userid; soap->proxy_passwd = info->passwd; data->nonce = info->nonce; data->opaque = info->opaque; data->qop = info->qop; data->alg = info->alg; } void http_da_release(struct soap *soap, struct http_da_info *info) { struct http_da_data *data = (struct http_da_data*)soap_lookup_plugin(soap, http_da_id); if (!data) return; soap->authrealm = NULL; soap->userid = NULL; soap->passwd = NULL; data->nonce = NULL; data->opaque = NULL; data->qop = NULL; data->alg = NULL; if (info->authrealm) { free((void*)info->authrealm); info->authrealm = NULL; } if (info->userid) { free((void*)info->userid); info->userid = NULL; } if (info->passwd) { free((void*)info->passwd); info->passwd = NULL; } if (info->nonce) { free((void*)info->nonce); info->nonce = NULL; } if (info->opaque) { free((void*)info->opaque); info->opaque = NULL; } if (info->qop) { free((void*)info->qop); info->qop = NULL; } if (info->alg) { free((void*)info->alg); info->alg = NULL; } } void http_da_proxy_release(struct soap *soap, struct http_da_info *info) { soap->proxy_userid = NULL; soap->proxy_passwd = NULL; http_da_release(soap, info); } /******************************************************************************\ * * Server-side digest authentication verification * \******************************************************************************/ int http_da_verify_post(struct soap *soap, const char *passwd) { return http_da_verify_method(soap, "POST", passwd); } int http_da_verify_get(struct soap *soap, const char *passwd) { return http_da_verify_method(soap, "GET", passwd); } static int http_da_verify_method(struct soap *soap, const char *method, const char *passwd) { struct http_da_data *data = (struct http_da_data*)soap_lookup_plugin(soap, http_da_id); char HA1[33], entityHAhex[33], response[33], responseHA[16]; if (!data) return SOAP_ERR; /* reject if none or basic authentication was used */ if (!soap->authrealm || !soap->userid || soap->passwd) /* passwd is set when basic auth is used */ return SOAP_ERR; /* require at least qop="auth" to prevent replay attacks */ if (!data->qop) return SOAP_ERR; if (http_da_session_update(soap->authrealm, data->nonce, data->opaque, data->cnonce, data->ncount)) return SOAP_ERR; http_da_calc_HA1(soap, &data->context, NULL, soap->userid, soap->authrealm, passwd, data->nonce, data->cnonce, HA1); if (!soap_tag_cmp(data->qop, "auth-int")) soap_s2hex(soap, (unsigned char*)data->digest, entityHAhex, 16); http_da_calc_response(soap, &data->context, HA1, data->nonce, data->ncount, data->cnonce, data->qop, method, soap->path, entityHAhex, response, responseHA); /* check digest response values */ if (memcmp(data->response, responseHA, 16)) return SOAP_ERR; return SOAP_OK; } /******************************************************************************\ * * Digest authentication session database management * \******************************************************************************/ static void http_da_session_start(const char *realm, const char *nonce, const char *opaque) { struct http_da_session *session; time_t now = time(NULL); if (now % 10 == 0) /* don't do this all the time to improve efficiency */ http_da_session_cleanup(); #ifdef SOAP_DEBUG fprintf(stderr, "Starting session realm=%s nonce=%s\n", realm, nonce); #endif MUTEX_LOCK(http_da_session_lock); session = (struct http_da_session*)malloc(sizeof(struct http_da_session)); if (session) { session->next = http_da_session; session->modified = now; session->realm = soap_strdup(NULL, realm); session->nonce = soap_strdup(NULL, nonce); session->opaque = soap_strdup(NULL, opaque); session->nc = 0; http_da_session = session; } MUTEX_UNLOCK(http_da_session_lock); } static int http_da_session_update(const char *realm, const char *nonce, const char *opaque, const char *cnonce, const char *ncount) { struct http_da_session *session; if (!realm || !nonce || !opaque || !cnonce || !ncount) { #ifdef SOAP_DEBUG fprintf(stderr, "Debug message: authentication update failed, missing authentication data\n"); #endif return SOAP_ERR; } #ifdef SOAP_DEBUG fprintf(stderr, "Debug message: updating session realm=%s nonce=%s\n", realm, nonce); #endif MUTEX_LOCK(http_da_session_lock); for (session = http_da_session; session; session = session->next) if (!strcmp(session->realm, realm) && !strcmp(session->nonce, nonce) && !strcmp(session->opaque, opaque)) break; if (session) { unsigned long nc = soap_strtoul(ncount, NULL, 16); if (session->nc >= nc) { session->modified = 0; /* replay attack: terminate session */ session = NULL; } else { session->nc = nc; session->modified = time(NULL); } } MUTEX_UNLOCK(http_da_session_lock); if (!session) return SOAP_ERR; return SOAP_OK; } static void http_da_session_cleanup() { struct http_da_session **session; time_t now = time(NULL); MUTEX_LOCK(http_da_session_lock); session = &http_da_session; while (*session) { if ((*session)->modified + HTTP_DA_SESSION_TIMEOUT < now) { struct http_da_session *p = *session; #ifdef SOAP_DEBUG fprintf(stderr, "Deleting session realm=%s nonce=%s\n", p->realm, p->nonce); #endif if (p->realm) free((void*)p->realm); if (p->nonce) free((void*)p->nonce); if (p->opaque) free((void*)p->opaque); *session = p->next; free((void*)p); } else session = &(*session)->next; } MUTEX_UNLOCK(http_da_session_lock); } /******************************************************************************\ * * Calculate hex nonce and opaque values * \******************************************************************************/ void http_da_calc_nonce(struct soap *soap, char nonce[HTTP_DA_NONCELEN]) { static short count = 0xCA53; (void)soap; (SOAP_SNPRINTF(nonce, HTTP_DA_NONCELEN, 20), "%8.8x%4.4hx%8.8x", (int)time(NULL), count++, soap_random); } void http_da_calc_opaque(struct soap *soap, char opaque[HTTP_DA_OPAQUELEN]) { (void)soap; (SOAP_SNPRINTF(opaque, HTTP_DA_OPAQUELEN, 8), "%8.8x", soap_random); } /******************************************************************************\ * * Calculate HA1, HA2, and response digest as per RFC 2617 specification * \******************************************************************************/ static void http_da_calc_HA1(struct soap *soap, void **context, const char *alg, const char *userid, const char *realm, const char *passwd, const char *nonce, const char *cnonce, char HA1hex[33]) { char HA1[16]; md5_handler(soap, context, MD5_INIT, NULL, 0); md5_handler(soap, context, MD5_UPDATE, (char*)userid, strlen(userid)); md5_handler(soap, context, MD5_UPDATE, (char*)":", 1); md5_handler(soap, context, MD5_UPDATE, (char*)realm, strlen(realm)); md5_handler(soap, context, MD5_UPDATE, (char*)":", 1); md5_handler(soap, context, MD5_UPDATE, (char*)passwd, strlen(passwd)); md5_handler(soap, context, MD5_FINAL, HA1, 0); if (alg && !soap_tag_cmp(alg, "MD5-sess")) { md5_handler(soap, context, MD5_INIT, NULL, 0); md5_handler(soap, context, MD5_UPDATE, HA1, 16); if (nonce) { md5_handler(soap, context, MD5_UPDATE, (char*)":", 1); md5_handler(soap, context, MD5_UPDATE, (char*)nonce, strlen(nonce)); } md5_handler(soap, context, MD5_UPDATE, (char*)":", 1); md5_handler(soap, context, MD5_UPDATE, (char*)cnonce, strlen(cnonce)); md5_handler(soap, context, MD5_FINAL, HA1, 0); }; soap_s2hex(soap, (unsigned char*)HA1, HA1hex, 16); }; static void http_da_calc_response(struct soap *soap, void **context, char HA1hex[33], const char *nonce, const char *ncount, const char *cnonce, const char *qop, const char *method, const char *uri, char entityHAhex[33], char response[33], char responseHA[16]) { char HA2[16], HA2hex[33]; md5_handler(soap, context, MD5_INIT, NULL, 0); md5_handler(soap, context, MD5_UPDATE, (char*)method, strlen(method)); md5_handler(soap, context, MD5_UPDATE, (char*)":", 1); md5_handler(soap, context, MD5_UPDATE, (char*)uri, strlen(uri)); if (qop && !soap_tag_cmp(qop, "auth-int")) { md5_handler(soap, context, MD5_UPDATE, (char*)":", 1); md5_handler(soap, context, MD5_UPDATE, entityHAhex, 32); } md5_handler(soap, context, MD5_FINAL, HA2, 0); soap_s2hex(soap, (unsigned char*)HA2, HA2hex, 16); md5_handler(soap, context, MD5_INIT, NULL, 0); md5_handler(soap, context, MD5_UPDATE, HA1hex, 32); if (nonce) { md5_handler(soap, context, MD5_UPDATE, (char*)":", 1); md5_handler(soap, context, MD5_UPDATE, (char*)nonce, strlen(nonce)); } md5_handler(soap, context, MD5_UPDATE, (char*)":", 1); if (qop && *qop) { md5_handler(soap, context, MD5_UPDATE, (char*)ncount, strlen(ncount)); md5_handler(soap, context, MD5_UPDATE, (char*)":", 1); md5_handler(soap, context, MD5_UPDATE, (char*)cnonce, strlen(cnonce)); md5_handler(soap, context, MD5_UPDATE, (char*)":", 1); md5_handler(soap, context, MD5_UPDATE, (char*)qop, strlen(qop)); md5_handler(soap, context, MD5_UPDATE, (char*)":", 1); } md5_handler(soap, context, MD5_UPDATE, HA2hex, 32); md5_handler(soap, context, MD5_FINAL, responseHA, 0); soap_s2hex(soap, (unsigned char*)responseHA, response, 16); } #ifdef __cplusplus } #endif gsoap-2.8.28/gsoap/plugin/httpgettest.h0000644000175000017500000000437212653650150017434 0ustar ellertellert/* httpgettest.h gSOAP HTTP GET plugin example application. gSOAP XML Web services tools Copyright (C) 2000-2006, Robert van Engelen, Genivia, Inc., All Rights Reserved. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2004, Robert van Engelen, Genivia, Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- Compile: soapcpp2 -c httpgettest.h cc -o httpgettest httpgettest.c soapC.c soapClient.c httpget.c stdsoap2.c To support https and compression, compile with: cc -DWITH_OPENSSL -DWITH_GZIP -o httpgettest httpgettest.c soapC.c soapClient.c httpget.c stdsoap2.c -lssl -lcrypto -lz */ // Intentionally left blank: there are no SOAP methods supported gsoap-2.8.28/gsoap/plugin/wsse2api.c0000644000175000017500000046054412653650150016614 0ustar ellertellert/* wsse2api.c WS-Security plugin (2002 version) See wsseapi.c for details gSOAP XML Web services tools Copyright (C) 2000-2010, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under one of the following licenses: GPL, the gSOAP public license, or Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2010, Robert van Engelen, Genivia Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "wsse2api.h" #include "smdevp.h" #include "mecevp.h" #include "threads.h" /* only need threads to enable mutex for MT */ #if defined(SOAP_WSA_2003) || defined(SOAP_WSA_2004) || defined(SOAP_WSA_200408) || defined(SOAP_WSA_2005) #include "wsaapi.h" #endif #ifdef __cplusplus extern "C" { #endif /** Plugin identification for plugin registry */ const char soap_wsse_id[14] = SOAP_WSSE_ID; /** Maximum number of SignedInfo References */ #define SOAP_WSSE_MAX_REF (100) /** Clock skew between machines (in sec) to fit message expiration in window */ #define SOAP_WSSE_CLKSKEW (300) /** Size of the random nonce */ #define SOAP_WSSE_NONCELEN (20) /** Digest authentication accepts messages that are not older than creation time + SOAP_WSSE_NONCETIME */ #define SOAP_WSSE_NONCETIME (SOAP_WSSE_CLKSKEW + 240) /******************************************************************************\ * * Common URIs * \******************************************************************************/ const char *wsse_PasswordTextURI = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText"; const char *wsse_PasswordDigestURI = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest"; const char *wsse_Base64BinaryURI = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary"; const char *wsse_X509v3URI = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3"; const char *wsse_X509v3SubjectKeyIdentifierURI = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509SubjectKeyIdentifier"; const char *ds_sha1URI = "http://www.w3.org/2000/09/xmldsig#sha1"; const char *ds_sha256URI = "http://www.w3.org/2001/04/xmlenc#sha256"; const char *ds_sha512URI = "http://www.w3.org/2001/04/xmlenc#sha512"; const char *ds_hmac_sha1URI = "http://www.w3.org/2000/09/xmldsig#hmac-sha1"; const char *ds_hmac_sha256URI = "http://www.w3.org/2001/04/xmldsig-more#hmac-sha256"; const char *ds_hmac_sha512URI = "http://www.w3.org/2001/04/xmldsig-more#hmac-sha512"; const char *ds_dsa_sha1URI = "http://www.w3.org/2000/09/xmldsig#dsa-sha1"; const char *ds_rsa_sha1URI = "http://www.w3.org/2000/09/xmldsig#rsa-sha1"; const char *ds_rsa_sha256URI = "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"; const char *ds_rsa_sha512URI = "http://www.w3.org/2001/04/xmldsig-more#rsa-sha512"; const char *xenc_rsa15URI = "http://www.w3.org/2001/04/xmlenc#rsa-1_5"; const char *xenc_rsaesURI = "http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p"; const char *xenc_3desURI = "http://www.w3.org/2001/04/xmlenc#tripledes-cbc"; const char *xenc_aes128URI = "http://www.w3.org/2001/04/xmlenc#aes128-cbc"; const char *xenc_aes192URI = "http://www.w3.org/2001/04/xmlenc#aes192-cbc"; const char *xenc_aes256URI = "http://www.w3.org/2001/04/xmlenc#aes256-cbc"; const char *xenc_aes512URI = "http://www.w3.org/2001/04/xmlenc#aes512-cbc"; const char *xenc_elementURI = "http://www.w3.org/2001/04/xmlenc#Element"; const char *xenc_contentURI = "http://www.w3.org/2001/04/xmlenc#Content"; const char *ds_URI = "http://www.w3.org/2000/09/xmldsig#"; const char *c14n_URI = "http://www.w3.org/2001/10/xml-exc-c14n#"; const char *wsu_URI = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"; /******************************************************************************\ * * Digest authentication session * \******************************************************************************/ /** @struct soap_wsse_session @brief Digest authentication session data */ struct soap_wsse_session { struct soap_wsse_session *next; /**< Next session in list */ time_t expired; /**< Session expiration */ char hash[SOAP_SMD_SHA1_SIZE]; /**< SHA1 digest */ char nonce[1]; /**< Nonce string flows into region below this struct */ }; /** The digest authentication session database */ static struct soap_wsse_session *soap_wsse_session = NULL; /** Lock for digest authentication session database exclusive access */ static MUTEX_TYPE soap_wsse_session_lock = MUTEX_INITIALIZER; static char* soap_wsse_ids(struct soap *soap, const char *tags); static int soap_wsse_session_verify(struct soap *soap, const char hash[SOAP_SMD_SHA1_SIZE], const char *created, const char *nonce); static void soap_wsse_session_cleanup(struct soap *soap); static void calc_digest(struct soap *soap, const char *created, const char *nonce, int noncelen, const char *password, char hash[SOAP_SMD_SHA1_SIZE]); static void calc_nonce(struct soap *soap, char nonce[SOAP_WSSE_NONCELEN]); static int soap_wsse_init(struct soap *soap, struct soap_wsse_data *data, const void *(*arg)(struct soap*, int*, const char*, int*)); static int soap_wsse_copy(struct soap *soap, struct soap_plugin *dst, struct soap_plugin *src); static void soap_wsse_delete(struct soap *soap, struct soap_plugin *p); static int soap_wsse_preparesend(struct soap *soap, const char *buf, size_t len); static int soap_wsse_preparefinalsend(struct soap *soap); static void soap_wsse_preparecleanup(struct soap *soap, struct soap_wsse_data *data); static int soap_wsse_preparefinalrecv(struct soap *soap); static int soap_wsse_header(struct soap *soap); static int soap_wsse_element_begin_in(struct soap *soap, const char *tag); static int soap_wsse_element_end_in(struct soap *soap, const char *tag1, const char *tag2); static int soap_wsse_element_begin_out(struct soap *soap, const char *tag); static int soap_wsse_element_end_out(struct soap *soap, const char *tag); static size_t soap_wsse_verify_nested(struct soap *soap, struct soap_dom_element *dom, const char *URI, const char *tag); /******************************************************************************\ * * wsse:Security header element * \******************************************************************************/ /** @fn _wsse__Security* soap_wsse_add_Security(struct soap *soap) @brief Adds Security header element. @param soap context @return _wsse__Security object */ struct _wsse__Security* soap_wsse_add_Security(struct soap *soap) { DBGFUN("soap_wsse_add_Security"); /* if we don't have a SOAP Header, create one */ soap_header(soap); /* if we don't have a wsse:Security element in the SOAP Header, create one */ if (!soap->header->wsse__Security) { soap->header->wsse__Security = (_wsse__Security*)soap_malloc(soap, sizeof(_wsse__Security)); if (!soap->header->wsse__Security) return NULL; soap_default__wsse__Security(soap, soap->header->wsse__Security); } return soap->header->wsse__Security; } /** @fn _wsse__Security* soap_wsse_add_Security_actor(struct soap *soap, const char *actor) @brief Adds Security header element with actor or role attribute. @param soap context @param actor string @return _wsse__Security object */ struct _wsse__Security* soap_wsse_add_Security_actor(struct soap *soap, const char *actor) { _wsse__Security *security = soap_wsse_add_Security(soap); DBGFUN1("soap_wsse_add_Security_actor", "actor=%s", actor); if (soap->namespaces && !strcmp(soap->namespaces[0].ns, "http://schemas.xmlsoap.org/soap/envelope/")) security->SOAP_ENV__actor = soap_strdup(soap, actor); else security->SOAP_ENV__role = soap_strdup(soap, actor); return security; } /** @fn void soap_wsse_delete_Security(struct soap *soap) @brief Deletes Security header element. @param soap context */ void soap_wsse_delete_Security(struct soap *soap) { DBGFUN("soap_wsse_delete_Security"); if (soap->header) soap->header->wsse__Security = NULL; } /** @fn _wsse__Security* soap_wsse_Security(struct soap *soap) @brief Returns Security header element if present. @param soap context @return _wsse__Security object or NULL */ struct _wsse__Security* soap_wsse_Security(struct soap *soap) { if (soap->header) return soap->header->wsse__Security; return NULL; } /******************************************************************************\ * * wsse:Security/ds:Signature header element * \******************************************************************************/ /** @fn ds__SignatureType* soap_wsse_add_Signature(struct soap *soap) @brief Adds Signature header element. @param soap context @return ds__SignatureType object */ struct ds__SignatureType* soap_wsse_add_Signature(struct soap *soap) { _wsse__Security *security = soap_wsse_add_Security(soap); DBGFUN("soap_wsse_add_Signature"); /* if we don't have a ds:Signature, create one */ if (!security->ds__Signature) { security->ds__Signature = (ds__SignatureType*)soap_malloc(soap, sizeof(ds__SignatureType)); if (!security->ds__Signature) return NULL; soap_default_ds__SignatureType(soap, security->ds__Signature); } return security->ds__Signature; } /** @fn void soap_wsse_delete_Signature(struct soap *soap) @brief Deletes Signature header element. @param soap context */ void soap_wsse_delete_Signature(struct soap *soap) { _wsse__Security *security = soap_wsse_Security(soap); DBGFUN("soap_wsse_delete_Signature"); if (security) security->ds__Signature = NULL; } /** @fn ds__SignatureType* soap_wsse_Signature(struct soap *soap) @brief Returns Signature header element if present. @param soap context @return ds__SignatureType object or NULL */ struct ds__SignatureType* soap_wsse_Signature(struct soap *soap) { _wsse__Security *security = soap_wsse_Security(soap); if (security) return security->ds__Signature; return NULL; } /******************************************************************************\ * * wsse:Security/wsu:Timestamp header element * \******************************************************************************/ /** @fn int soap_wsse_add_Timestamp(struct soap *soap, const char *id, time_t lifetime) @brief Adds Timestamp element with optional expiration date+time (lifetime). @param[in] soap context @param[in] id for signature referencing or NULL @param[in] lifetime expressed in time_t units, or 0 for no expiration @return SOAP_OK */ int soap_wsse_add_Timestamp(struct soap *soap, const char *id, time_t lifetime) { _wsse__Security *security = soap_wsse_add_Security(soap); time_t now = time(NULL); char *created = soap_strdup(soap, soap_dateTime2s(soap, now)); char *expired = lifetime ? soap_strdup(soap, soap_dateTime2s(soap, now + lifetime)) : NULL; DBGFUN1("soap_wsse_add_Timestamp", "id=%s", id?id:""); /* allocate a Timestamp if we don't have one already */ if (!security->wsu__Timestamp) { security->wsu__Timestamp = (_wsu__Timestamp*)soap_malloc(soap, sizeof(_wsu__Timestamp)); if (!security->wsu__Timestamp) return soap->error = SOAP_EOM; } soap_default__wsu__Timestamp(soap, security->wsu__Timestamp); /* populate the wsu:Timestamp element */ security->wsu__Timestamp->wsu__Id = soap_strdup(soap, id); security->wsu__Timestamp->Created = created; security->wsu__Timestamp->Expires = expired; return SOAP_OK; } /** @fn _wsu__Timestamp *soap_wsse_Timestamp(struct soap *soap) @brief Returns Timestamp element if present. @param soap context @return _wsu__Timestamp object or NULL */ struct _wsu__Timestamp* soap_wsse_Timestamp(struct soap *soap) { _wsse__Security *security = soap_wsse_Security(soap); if (security) return security->wsu__Timestamp; return NULL; } /** @fn int soap_wsse_verify_Timestamp(struct soap *soap) @brief Verifies the Timestamp/Expires element against the current time. @param soap context @return SOAP_OK or SOAP_FAULT with wsse:FailedAuthentication fault Sets wsse:FailedAuthentication fault if wsu:Timestamp is expired. The SOAP_WSSE_CLKSKEW value is used as a margin to mitigate clock skew. Keeps silent when no timestamp is supplied or no expiration date is included in the wsu:Timestamp element. */ int soap_wsse_verify_Timestamp(struct soap *soap) { _wsu__Timestamp *timestamp = soap_wsse_Timestamp(soap); DBGFUN("soap_wsse_verify_Timestamp"); /* if we have a timestamp with an expiration date, check it */ if (timestamp && timestamp->Expires) { time_t now = time(NULL), expired; soap_s2dateTime(soap, timestamp->Expires, &expired); if (expired + SOAP_WSSE_CLKSKEW <= now) { const char *code = soap_wsu__tTimestampFault2s(soap, wsu__MessageExpired); return soap_wsse_sender_fault_subcode(soap, code, "Message has expired", timestamp->Expires); } } return SOAP_OK; } /******************************************************************************\ * * wsse:Security/UsernameToken header element * \******************************************************************************/ /** @fn int soap_wsse_add_UsernameTokenText(struct soap *soap, const char *id, const char *username, const char *password) @brief Adds UsernameToken element with optional clear-text password. @param soap context @param[in] id string for signature referencing or NULL @param[in] username string @param[in] password string or NULL to omit the password @return SOAP_OK Passwords are sent in the clear, so transport-level encryption is required. Note: this release supports the use of at most one UsernameToken in the header. */ int soap_wsse_add_UsernameTokenText(struct soap *soap, const char *id, const char *username, const char *password) { _wsse__Security *security = soap_wsse_add_Security(soap); DBGFUN2("soap_wsse_add_UsernameTokenText", "id=%s", id?id:"", "username=%s", username?username:""); /* allocate a UsernameToken if we don't have one already */ if (!security->UsernameToken) { if (!(security->UsernameToken = (_wsse__UsernameToken*)soap_malloc(soap, sizeof(_wsse__UsernameToken)))) return soap->error = SOAP_EOM; } soap_default__wsse__UsernameToken(soap, security->UsernameToken); /* populate the UsernameToken */ security->UsernameToken->wsu__Id = soap_strdup(soap, id); security->UsernameToken->Username = soap_strdup(soap, username); /* allocate and populate the Password */ if (password) { if (!(security->UsernameToken->Password = (_wsse__Password*)soap_malloc(soap, sizeof(_wsse__Password)))) return soap->error = SOAP_EOM; soap_default__wsse__Password(soap, security->UsernameToken->Password); security->UsernameToken->Password->Type = (char*)wsse_PasswordTextURI; security->UsernameToken->Password->__item = soap_strdup(soap, password); } return SOAP_OK; } /** @fn int soap_wsse_add_UsernameTokenDigest(struct soap *soap, const char *id, const char *username, const char *password) @brief Adds UsernameToken element for digest authentication. @param soap context @param[in] id string for signature referencing or NULL @param[in] username string @param[in] password string @return SOAP_OK Computes SHA1 digest of the time stamp, a nonce, and the password. The digest provides the authentication credentials. Passwords are NOT sent in the clear. Note: this release supports the use of at most one UsernameToken in the header. */ int soap_wsse_add_UsernameTokenDigest(struct soap *soap, const char *id, const char *username, const char *password) { _wsse__Security *security = soap_wsse_add_Security(soap); time_t now = time(NULL); const char *created = soap_dateTime2s(soap, now); char HA[SOAP_SMD_SHA1_SIZE], HABase64[29]; char nonce[SOAP_WSSE_NONCELEN], *nonceBase64; DBGFUN2("soap_wsse_add_UsernameTokenDigest", "id=%s", id?id:"", "username=%s", username?username:""); /* generate a nonce */ calc_nonce(soap, nonce); nonceBase64 = soap_s2base64(soap, (unsigned char*)nonce, NULL, SOAP_WSSE_NONCELEN); /* The specs are not clear: compute digest over binary nonce or base64 nonce? */ /* compute SHA1(created, nonce, password) */ calc_digest(soap, created, nonce, SOAP_WSSE_NONCELEN, password, HA); /* Hm...? calc_digest(soap, created, nonceBase64, strlen(nonceBase64), password, HA); */ soap_s2base64(soap, (unsigned char*)HA, HABase64, SOAP_SMD_SHA1_SIZE); /* populate the UsernameToken with digest */ soap_wsse_add_UsernameTokenText(soap, id, username, HABase64); /* populate the remainder of the password, nonce, and created */ security->UsernameToken->Password->Type = (char*)wsse_PasswordDigestURI; security->UsernameToken->Nonce = nonceBase64; security->UsernameToken->wsu__Created = soap_strdup(soap, created); return SOAP_OK; } /** @fn _wsse__UsernameToken* soap_wsse_UsernameToken(struct soap *soap, const char *id) @brief Returns UsernameToken element if present. @param soap context @param[in] id string of UsernameToken or NULL @return _wsse__UsernameToken object or NULL Note: this release supports the use of at most one UsernameToken in the header. */ struct _wsse__UsernameToken* soap_wsse_UsernameToken(struct soap *soap, const char *id) { _wsse__Security *security = soap_wsse_Security(soap); if (security && security->UsernameToken && (!id || (security->UsernameToken->wsu__Id && !strcmp(security->UsernameToken->wsu__Id, id)))) return security->UsernameToken; return NULL; } /** @fn const char* soap_wsse_get_Username(struct soap *soap) @brief Returns UsernameToken/username string or wsse:FailedAuthentication fault. @param soap context @return UsernameToken/username string or NULL with wsse:FailedAuthentication fault error set @see soap_wsse_verify_Password The returned username should be used to lookup the user's password in a dictionary or database for server-side authentication with soap_wsse_verify_Password. */ const char* soap_wsse_get_Username(struct soap *soap) { _wsse__UsernameToken *token = soap_wsse_UsernameToken(soap, NULL); DBGFUN("soap_wsse_get_Username"); if (token) return token->Username; soap_wsse_fault(soap, wsse__FailedAuthentication, "Username authentication required"); return NULL; } /** @fn int soap_wsse_verify_Password(struct soap *soap, const char *password) @brief Verifies the supplied password or sets wsse:FailedAuthentication fault. @param soap context @param[in] password string to verify against @return SOAP_OK (authorized) or SOAP_FAULT with wsse:FailedAuthentication fault The verification supports both clear-text password verification and digest password authentication. For digest authentication a history mechanism with a digest authentication session database ensures protection against replay attacks. Note: this release supports the use of at most one UsernameToken in the header. */ int soap_wsse_verify_Password(struct soap *soap, const char *password) { _wsse__UsernameToken *token = soap_wsse_UsernameToken(soap, NULL); DBGFUN("soap_wsse_verify_Password"); /* if we have a UsernameToken with a Password, check it */ if (token && token->Password) { /* password digest or text? */ if (token->Password->Type && !strcmp(token->Password->Type, wsse_PasswordDigestURI)) { /* check password digest: compute SHA1(created, nonce, password) */ if (token->Nonce && token->wsu__Created && strlen(token->Password->__item) == 28) /* digest pw len = 28 */ { char HA1[SOAP_SMD_SHA1_SIZE], HA2[SOAP_SMD_SHA1_SIZE]; /* The specs are not clear: compute digest over binary nonce or base64 nonce? The formet appears to be the case: */ int noncelen; const char *nonce = soap_base642s(soap, token->Nonce, NULL, 0, &noncelen); /* compute HA1 = SHA1(created, nonce, password) */ calc_digest(soap, token->wsu__Created, nonce, noncelen, password, HA1); /* calc_digest(soap, token->wsu__Created, token->Nonce, strlen(token->Nonce), password, HA1); */ /* get HA2 = supplied digest from base64 Password */ soap_base642s(soap, token->Password->__item, HA2, SOAP_SMD_SHA1_SIZE, NULL); /* compare HA1 to HA2 */ if (!memcmp(HA1, HA2, SOAP_SMD_SHA1_SIZE)) { /* authorize if HA1 and HA2 identical and not replay attack */ if (!soap_wsse_session_verify(soap, HA1, token->wsu__Created, token->Nonce)) return SOAP_OK; return soap->error; } } } else { /* check password text */ if (!strcmp(token->Password->__item, password)) return SOAP_OK; } } return soap_wsse_fault(soap, wsse__FailedAuthentication, NULL); } /******************************************************************************\ * * wsse:Security/BinarySecurityToken header element * \******************************************************************************/ /** @fn int soap_wsse_add_BinarySecurityToken(struct soap *soap, const char *id, const char *valueType, const unsigned char *data, int size) @brief Adds BinarySecurityToken element. @param soap context @param[in] id string for signature referencing or NULL @param[in] valueType string @param[in] data points to binary token data @param[in] size is length of binary token @return SOAP_OK */ int soap_wsse_add_BinarySecurityToken(struct soap *soap, const char *id, const char *valueType, const unsigned char *data, int size) { _wsse__Security *security = soap_wsse_add_Security(soap); DBGFUN2("wsse_add_BinarySecurityToken", "id=%s", id?id:"", "valueType=%s", valueType?valueType:""); /* allocate BinarySecurityToken if we don't already have one */ if (!security->BinarySecurityToken) { if (!(security->BinarySecurityToken = (_wsse__BinarySecurityToken*)soap_malloc(soap, sizeof(_wsse__BinarySecurityToken)))) return soap->error = SOAP_EOM; } soap_default__wsse__BinarySecurityToken(soap, security->BinarySecurityToken); /* populate the BinarySecurityToken */ security->BinarySecurityToken->wsu__Id = soap_strdup(soap, id); security->BinarySecurityToken->ValueType = soap_strdup(soap, valueType); security->BinarySecurityToken->EncodingType = (char*)wsse_Base64BinaryURI; security->BinarySecurityToken->__item = soap_s2base64(soap, data, NULL, size); return SOAP_OK; } /** @fn int soap_wsse_add_BinarySecurityTokenX509(struct soap *soap, const char *id, X509 *cert) @brief Adds BinarySecurityToken element with X509 certificate. @param soap context @param[in] id string for signature reference @param[in] cert points to the X509 certificate @return SOAP_OK or SOAP_EOM This function uses i2d_X509 from the the OpenSSL library to convert an X509 object to binary DER format. */ int soap_wsse_add_BinarySecurityTokenX509(struct soap *soap, const char *id, X509 *cert) { int derlen; unsigned char *der, *s; if (!cert) return soap_wsse_fault(soap, wsse__InvalidSecurityToken, "Missing certificate"); /* determine the storage requirement */ derlen = i2d_X509(cert, NULL); if (derlen < 0) return soap_wsse_fault(soap, wsse__InvalidSecurityToken, "Invalid certificate"); /* use the gSOAP engine's look-aside buffer to temporarily hold the cert */ if (soap_store_lab(soap, NULL, derlen)) return SOAP_EOM; s = der = (unsigned char*)soap->labbuf; /* store in DER format */ i2d_X509(cert, &s); /* populate the BinarySecurityToken with base64 certificate data */ return soap_wsse_add_BinarySecurityToken(soap, id, wsse_X509v3URI, der, derlen); } /** @fn int soap_wsse_add_BinarySecurityTokenPEM(struct soap *soap, const char *id, const char *filename) @brief Adds BinarySecurityToken element from a PEM file. @param soap context @param[in] id string for signature reference @param[in] filename @return SOAP_OK or SOAP_FAULT with wsse__InvalidSecurity fault when file cannot be read or does not contain a valid certificate This function uses PEM_read_X509 from the the OpenSSL library to read a certificate from a PEM formatted file. */ int soap_wsse_add_BinarySecurityTokenPEM(struct soap *soap, const char *id, const char *filename) { FILE *fd; DBGFUN2("soap_wsse_add_BinarySecurityTokenPEM", "id=%s", id?id:"", "filename=%s", filename?filename:""); if ((fd = fopen(filename, "r"))) { /* read the certificate */ X509 *cert = PEM_read_X509(fd, NULL, NULL, NULL); fclose(fd); /* if okay, populate the BinarySecurityToken element */ if (cert) { int err = soap_wsse_add_BinarySecurityTokenX509(soap, id, cert); X509_free(cert); return err; } } return soap_wsse_fault(soap, wsse__InvalidSecurityToken, "Missing certificate"); } /** @fn _wsse__BinarySecurityToken* soap_wsse_BinarySecurityToken(struct soap *soap, const char *id) @brief Returns BinarySecurityToken element if present. @param soap context @param[in] id string of token to get or NULL @return _wsse__BinarySecurityToken object or NULL */ struct _wsse__BinarySecurityToken* soap_wsse_BinarySecurityToken(struct soap *soap, const char *id) { _wsse__Security *security = soap_wsse_Security(soap); if (security && security->BinarySecurityToken && (!id || (security->BinarySecurityToken->wsu__Id && !strcmp(security->BinarySecurityToken->wsu__Id, id)))) return security->BinarySecurityToken; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "No BinarySecurityToken id=%s, pointer=%p to token found\n", id, security->BinarySecurityToken)); return NULL; } /** @fn int soap_wsse_get_BinarySecurityToken(struct soap *soap, const char *id, char **valueType, unsigned char **data, int *size) @brief Get wsse:BinarySecurityToken element token data in binary form. @param soap context @param[in] id string of token to get or NULL @param[out] valueType string @param[out] data points to binary token data @param[out] size is length of binary token @return SOAP_OK or SOAP_FAULT with wsse:SecurityTokenUnavailable fault */ int soap_wsse_get_BinarySecurityToken(struct soap *soap, const char *id, char **valueType, unsigned char **data, int *size) { _wsse__BinarySecurityToken *token = soap_wsse_BinarySecurityToken(soap, id); DBGFUN1("soap_wsse_get_BinarySecurityToken", "id=%s", id?id:""); if (token) { *valueType = token->ValueType; /* it appears we don't need HexBinary after all if (token->EncodingType && !strcmp(token->EncodingType, wsse_HexBinaryURI)) *data = (unsigned char*)soap_hex2s(soap, token->__item, NULL, 0, size); else */ /* assume token is represented in base64 by default */ *data = (unsigned char*)soap_base642s(soap, token->__item, NULL, 0, size); if (*data) return SOAP_OK; } return soap_wsse_fault(soap, wsse__SecurityTokenUnavailable, "BinarySecurityToken required"); } /** @fn X509* soap_wsse_get_BinarySecurityTokenX509(struct soap *soap, const char *id) @brief Get X509 wsse:BinarySecurityToken certificate and verify its content. @param soap context @param[in] id string of token to get or NULL @return X509 certificate (dynamically allocated) or NULL with wsse:SecurityTokenUnavailable fault */ X509* soap_wsse_get_BinarySecurityTokenX509(struct soap *soap, const char *id) { X509 *cert = NULL; char *valueType = NULL; #if (OPENSSL_VERSION_NUMBER >= 0x0090800fL) const unsigned char *data; #else unsigned char *data; #endif int size; DBGFUN1("soap_wsse_get_BinarySecurityTokenX509", "id=%s", id?id:""); if (!soap_wsse_get_BinarySecurityToken(soap, id, &valueType, (unsigned char**)&data, &size) && valueType && !strcmp(valueType, wsse_X509v3URI)) cert = d2i_X509(NULL, &data, size); /* verify the certificate */ if (!cert || soap_wsse_verify_X509(soap, cert)) return NULL; return cert; } /** @fn int soap_wsse_verify_X509(struct soap *soap, X509 *cert) @brief Verifies X509 certificate against soap->cafile, soap->capath, and soap->crlfile @param soap context @param[in] cert X509 certificate @return SOAP_OK or fault This is an expensive operation. Whenever a new soap context is created, the cafile and objects are loaded into that context each time we need to verify a certificate. */ int soap_wsse_verify_X509(struct soap *soap, X509 *cert) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); X509_STORE_CTX *verify; DBGFUN("soap_wsse_verify_X509"); if (!data) return soap_set_receiver_error(soap, "soap_wsse_sign", "Plugin not registered", SOAP_PLUGIN_ERROR); if (!cert) return soap_wsse_sender_fault(soap, "soap_wsse_verify_X509", "No certificate"); if (!data->store) { if (!(data->store = X509_STORE_new())) return soap_wsse_receiver_fault(soap, "soap_wsse_verify_X509", "Could not create X509_STORE object"); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Setting up a new X509 store\n")); X509_STORE_set_verify_cb_func(data->store, soap->fsslverify); if (soap->cafile || soap->capath) { if (X509_STORE_load_locations(data->store, soap->cafile, soap->capath) != 1) return soap_wsse_receiver_fault(soap, "soap_wsse_verify_X509", "Could not load CA file or path"); } #if (OPENSSL_VERSION_NUMBER > 0x00907000L) if (soap->crlfile) { X509_LOOKUP *lookup; if (!(lookup = X509_STORE_add_lookup(data->store, X509_LOOKUP_file()))) return soap_wsse_receiver_fault(soap, "soap_wsse_verify_X509", "Could not create X509_LOOKUP object"); if (X509_load_crl_file(lookup, soap->crlfile, X509_FILETYPE_PEM) != 1) return soap_wsse_receiver_fault(soap, "soap_wsse_verify_X509", "Could not read the CRL file"); X509_STORE_set_flags(data->store, X509_V_FLAG_CRL_CHECK | X509_V_FLAG_CRL_CHECK_ALL); } #endif } if (!(verify = X509_STORE_CTX_new())) return soap_wsse_receiver_fault(soap, "soap_wsse_verify_X509", "Could not create X509_STORE_CTX object"); #if (OPENSSL_VERSION_NUMBER > 0x00907000L) if (X509_STORE_CTX_init(verify, data->store, cert, NULL) != 1) { X509_STORE_CTX_free(verify); return soap_wsse_receiver_fault(soap, "soap_wsse_verify_X509", "Could not initialize X509_STORE_CTX object"); } #else X509_STORE_CTX_init(verify, data->store, cert, NULL); #endif if (X509_verify_cert(verify) != 1) { X509_STORE_CTX_free(verify); return soap_wsse_sender_fault(soap, "soap_wsse_verify_X509", "Invalid certificate"); } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Certificate is valid\n")); #ifdef SOAP_DEBUG { char buf[1024]; X509_NAME_oneline(X509_get_issuer_name(cert), buf, sizeof(buf)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "certificate issuer %s\n", buf)); X509_NAME_oneline(X509_get_subject_name(cert), buf, sizeof(buf)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "certificate subject %s\n", buf)); } #endif X509_STORE_CTX_free(verify); return SOAP_OK; } /******************************************************************************\ * * wsc:SecurityContextToken * \******************************************************************************/ /** @fn int soap_wsse_add_SecurityContextToken(struct soap *soap, const char *id, const char *identifier) @brief Adds wsc:SecurityContextToken/Identifier and SecurityTokenReference to it @param soap context @param[in] id string for signature reference (required) @param[in] identifier wsc:Identifier value (required) @return SOAP_OK or error code */ int soap_wsse_add_SecurityContextToken(struct soap *soap, const char *id, const char *identifier) { char *URI; size_t l; _wsse__Security *security = soap_wsse_add_Security(soap); DBGFUN2("soap_wsse_add_SecurityContextToken", "id=%s", id, "identifier=%s", identifier?identifier:""); /* allocate wsc:SecurityContextToken if we don't already have one */ if (!security->wsc__SecurityContextToken) { if (!(security->wsc__SecurityContextToken = (struct wsc__SecurityContextTokenType*)soap_malloc(soap, sizeof(struct wsc__SecurityContextTokenType)))) return soap->error = SOAP_EOM; } soap_default_wsc__SecurityContextTokenType(soap, security->wsc__SecurityContextToken); /* populate the wsc:SecurityContextToken */ l = strlen(id); if (!(URI = (char*)soap_malloc(soap, l + 2))) return soap->error = SOAP_EOM; *URI = '#'; soap_strcpy(URI + 1, l + 1, id); security->wsc__SecurityContextToken->wsu__Id = URI + 1; security->wsc__SecurityContextToken->Identifier = soap_strdup(soap, identifier); /* set SecurityTokenReference */ return soap_wsse_add_KeyInfo_SecurityTokenReferenceURI(soap, URI, NULL); } /** @fn const char *soap_wsse_get_SecurityContextToken(struct soap *soap) @brief Returns wsc:SecurityContextToken/Identifier string value or NULL @param soap context @return wsc:SecurityContextToken/Identifier string value value or NULL */ const char * soap_wsse_get_SecurityContextToken(struct soap *soap) { _wsse__Security *security = soap_wsse_Security(soap); DBGFUN("soap_wsse_SecurityContextToken"); if (security->wsc__SecurityContextToken && security->wsc__SecurityContextToken->wsu__Id) { const char *URI = soap_wsse_get_KeyInfo_SecurityTokenReferenceURI(soap); if (URI && !strcmp(URI, security->wsc__SecurityContextToken->wsu__Id)) return security->wsc__SecurityContextToken->Identifier; } return NULL; } /******************************************************************************\ * * ds:Signature/SignedInfo * \******************************************************************************/ /** @fn ds__SignedInfoType* soap_wsse_add_SignedInfo(struct soap *soap) @brief Adds SignedInfo element. @param soap context @return ds__SignedInfoType object */ struct ds__SignedInfoType* soap_wsse_add_SignedInfo(struct soap *soap) { ds__SignatureType *signature = soap_wsse_add_Signature(soap); if (!signature->SignedInfo) { signature->SignedInfo = (ds__SignedInfoType*)soap_malloc(soap, sizeof(ds__SignedInfoType)); if (!signature->SignedInfo) return NULL; soap_default_ds__SignedInfoType(soap, signature->SignedInfo); } return signature->SignedInfo; } /** @fn int soap_wsse_add_SignedInfo_Reference(struct soap *soap, const char *URI, const char *transform, const char *inclusiveNamespaces, int alg, const char *HA) @brief Adds SignedInfo element with Reference URI, transform algorithm used, and digest value. @param soap context @param[in] URI reference @param[in] transform string should be c14n_URI for exc-c14n or NULL @param[in] inclusiveNamespaces used by the exc-c14n transform or NULL @param[in] alg is the digest algorithm used @param[in] HA is the digest in binary form @return SOAP_OK or SOAP_EOM when references exceed SOAP_WSSE_MAX_REF This function can be called to add more references to the wsse:SignedInfo element. A maximum number of SOAP_WSSE_MAX_REF references can be added. The digest method is always SHA1. Note: XPath transforms cannot be specified in this release. */ int soap_wsse_add_SignedInfo_Reference(struct soap *soap, const char *URI, const char *transform, const char *inclusiveNamespaces, int alg, const char *HA) { ds__SignedInfoType *signedInfo = soap_wsse_add_SignedInfo(soap); ds__ReferenceType *reference; DBGFUN3("soap_wsse_add_SignedInfo_Reference", "URI=%s", URI?URI:"", "transform=%s", transform?transform:"", "alg=%x", alg); /* if this is the first reference, allocate SOAP_WSSE_MAX_REF references */ if (signedInfo->__sizeReference == 0) signedInfo->Reference = (ds__ReferenceType**)soap_malloc(soap, SOAP_WSSE_MAX_REF*sizeof(ds__ReferenceType*)); else { /* maximum number of references exceeded? */ if (signedInfo->__sizeReference >= SOAP_WSSE_MAX_REF) return soap->error = SOAP_EOM; } /* allocate fresh new reference */ reference = (ds__ReferenceType*)soap_malloc(soap, sizeof(ds__ReferenceType)); if (!reference) return soap->error = SOAP_EOM; soap_default_ds__ReferenceType(soap, reference); /* populate the URI */ reference->URI = soap_strdup(soap, URI); /* if a transform algorithm was used, populate the Transforms element */ if (transform) { reference->Transforms = (ds__TransformsType*)soap_malloc(soap, sizeof(ds__TransformsType)); if (!reference->Transforms) return soap->error = SOAP_EOM; soap_default_ds__TransformsType(soap, reference->Transforms); /* only one transform */ reference->Transforms->__sizeTransform = 1; reference->Transforms->Transform = (ds__TransformType*)soap_malloc(soap, sizeof(ds__TransformType)); soap_default_ds__TransformType(soap, reference->Transforms->Transform); reference->Transforms->Transform->Algorithm = (char*)transform; /* populate the c14n:InclusiveNamespaces element */ if (inclusiveNamespaces && *inclusiveNamespaces) { reference->Transforms->Transform->c14n__InclusiveNamespaces = (_c14n__InclusiveNamespaces*)soap_malloc(soap, sizeof(_c14n__InclusiveNamespaces)); if (!reference->Transforms->Transform->c14n__InclusiveNamespaces) return soap->error = SOAP_EOM; soap_default__c14n__InclusiveNamespaces(soap, reference->Transforms->Transform->c14n__InclusiveNamespaces); reference->Transforms->Transform->c14n__InclusiveNamespaces->PrefixList = soap_strdup(soap, inclusiveNamespaces); } } /* populate the DigestMethod element */ reference->DigestMethod = (ds__DigestMethodType*)soap_malloc(soap, sizeof(ds__DigestMethodType)); if (!reference->DigestMethod) return soap->error = SOAP_EOM; soap_default_ds__DigestMethodType(soap, reference->DigestMethod); /* the DigestMethod algorithm SHA1, SHA256, SHA512 */ switch (alg & SOAP_SMD_HASH) { case SOAP_SMD_SHA1: reference->DigestMethod->Algorithm = (char*)ds_sha1URI; break; case SOAP_SMD_SHA256: reference->DigestMethod->Algorithm = (char*)ds_sha256URI; break; case SOAP_SMD_SHA512: reference->DigestMethod->Algorithm = (char*)ds_sha512URI; break; } /* populate the DigestValue element */ reference->DigestValue = soap_s2base64(soap, (unsigned char*)HA, NULL, soap_smd_size(alg, NULL)); if (!reference->DigestValue) return soap->error; /* add the fresh new reference to the array */ signedInfo->Reference[signedInfo->__sizeReference] = reference; signedInfo->__sizeReference++; return SOAP_OK; } /** @fn int soap_wsse_add_SignedInfo_SignatureMethod(struct soap *soap, const char *method, int canonical) @brief Adds SignedInfo element with SignatureMethod. @param soap context @param[in] method is the URI of the signature algorithm (e.g. ds_rsa_sha1) @param[in] canonical flag indicating that SignedInfo is signed in exc-c14n form @return SOAP_OK Note: the c14n:InclusiveNamespaces/PrefixList is set to "SOAP-ENV wsse". */ int soap_wsse_add_SignedInfo_SignatureMethod(struct soap *soap, const char *method, int canonical) { ds__SignedInfoType *signedInfo = soap_wsse_add_SignedInfo(soap); DBGFUN2("soap_wsse_add_SignedInfo_SignatureMethod", "method=%s", method?method:"", "canonical=%d", canonical); /* if signed in exc-c14n form, populate CanonicalizationMethod element */ signedInfo->CanonicalizationMethod = (ds__CanonicalizationMethodType*)soap_malloc(soap, sizeof(ds__CanonicalizationMethodType)); if (!signedInfo->CanonicalizationMethod) return soap->error = SOAP_EOM; soap_default_ds__CanonicalizationMethodType(soap, signedInfo->CanonicalizationMethod); if (canonical) { signedInfo->CanonicalizationMethod->Algorithm = (char*)c14n_URI; /* signedInfo->CanonicalizationMethod->c14n__InclusiveNamespaces = (_c14n__InclusiveNamespaces*)soap_malloc(soap, sizeof(_c14n__InclusiveNamespaces)); soap_default__c14n__InclusiveNamespaces(soap, signedInfo->CanonicalizationMethod->c14n__InclusiveNamespaces); signedInfo->CanonicalizationMethod->c14n__InclusiveNamespaces->PrefixList = "SOAP-ENV wsse"; */ } /* populate SignatureMethod element */ signedInfo->SignatureMethod = (ds__SignatureMethodType*)soap_malloc(soap, sizeof(ds__SignatureMethodType)); if (!signedInfo->SignatureMethod) return soap->error = SOAP_EOM; soap_default_ds__SignatureMethodType(soap, signedInfo->SignatureMethod); signedInfo->SignatureMethod->Algorithm = (char*)method; return SOAP_OK; } /** @fn ds__SignedInfoType* soap_wsse_SignedInfo(struct soap *soap) @brief Returns SignedInfo element if present. @param soap context @return ds__SignedInfoType object or NULL */ struct ds__SignedInfoType* soap_wsse_SignedInfo(struct soap *soap) { ds__SignatureType *signature = soap_wsse_Signature(soap); if (signature) return signature->SignedInfo; return NULL; } /** @fn int soap_wsse_get_SignedInfo_SignatureMethod(struct soap *soap, int *alg) @brief Get SignatureMethod algorithm @param soap context @param[out] alg is a signature algorithm, such as SOAP_SMD_HMAC_SHA1, SOAP_SMD_VRFY_DSA_SHA1, or SOAP_SMD_VRFY_RSA_SHA1 @return SOAP_OK or SOAP_FAULT with wsse:UnsupportedAlgorithm or wsse:FailedCheck fault */ int soap_wsse_get_SignedInfo_SignatureMethod(struct soap *soap, int *alg) { ds__SignedInfoType *signedInfo = soap_wsse_SignedInfo(soap); DBGFUN("soap_wsse_get_SignedInfo_SignatureMethod"); *alg = SOAP_SMD_NONE; /* if we have a SignedInfo element, get the algorithm */ if (signedInfo && signedInfo->SignatureMethod && signedInfo->SignatureMethod->Algorithm) { const char *method = signedInfo->SignatureMethod->Algorithm; if (!strcmp(method, ds_hmac_sha1URI)) *alg = SOAP_SMD_HMAC_SHA1; else if (!strcmp(method, ds_hmac_sha256URI)) *alg = SOAP_SMD_HMAC_SHA256; else if (!strcmp(method, ds_hmac_sha512URI)) *alg = SOAP_SMD_HMAC_SHA512; else if (!strcmp(method, ds_dsa_sha1URI)) *alg = SOAP_SMD_VRFY_DSA_SHA1; else if (!strcmp(method, ds_rsa_sha1URI)) *alg = SOAP_SMD_VRFY_RSA_SHA1; else if (!strcmp(method, ds_rsa_sha256URI)) *alg = SOAP_SMD_VRFY_RSA_SHA256; else if (!strcmp(method, ds_rsa_sha512URI)) *alg = SOAP_SMD_VRFY_RSA_SHA512; else return soap_wsse_fault(soap, wsse__UnsupportedAlgorithm, method); return SOAP_OK; } return soap_wsse_fault(soap, wsse__FailedCheck, "Signature required"); } /******************************************************************************\ * * ds:Signature/SignatureValue * \******************************************************************************/ /** @fn int soap_wsse_add_SignatureValue(struct soap *soap, int alg, const void *key, int keylen) @brief Adds SignedInfo/SignatureMethod element, signs the SignedInfo element, and adds the resulting SignatureValue element. @param soap context @param[in] alg is SOAP_SMD_HMAC_SHA1, SOAP_SMD_SIGN_DSA_SHA1, or SOAP_SMD_SIGN_RSA_SHA1 @param[in] key to use to sign (HMAC or EVP_PKEY) @param[in] keylen length of HMAC key @return SOAP_OK, SOAP_EOM, or fault To sign the SignedInfo element with this function, populate SignedInfo with Reference elements first using soap_wsse_add_SignedInfo_Reference. The SignedInfo element must not be modified after signing. The SOAP_XML_INDENT and SOAP_XML_CANONICAL flags are used to serialize the SignedInfo to compute the signature. */ int soap_wsse_add_SignatureValue(struct soap *soap, int alg, const void *key, int keylen) { ds__SignatureType *signature = soap_wsse_add_Signature(soap); const char *method = NULL; char *sig; int siglen; int err; DBGFUN1("soap_wsse_add_SignatureValue", "alg=%x", alg); /* determine signature algorithm to use */ switch (alg) { case SOAP_SMD_HMAC_SHA1: method = ds_hmac_sha1URI; break; case SOAP_SMD_HMAC_SHA256: method = ds_hmac_sha256URI; break; case SOAP_SMD_HMAC_SHA512: method = ds_hmac_sha512URI; break; case SOAP_SMD_SIGN_DSA_SHA1: method = ds_dsa_sha1URI; break; case SOAP_SMD_SIGN_RSA_SHA1: method = ds_rsa_sha1URI; break; case SOAP_SMD_SIGN_RSA_SHA256: method = ds_rsa_sha256URI; break; case SOAP_SMD_SIGN_RSA_SHA512: method = ds_rsa_sha512URI; break; default: return soap_wsse_fault(soap, wsse__UnsupportedAlgorithm, NULL); } /* populate SignedInfo/SignatureMethod based on SOAP_XML_CANONICAL flag */ soap_wsse_add_SignedInfo_SignatureMethod(soap, method, (soap->mode & SOAP_XML_CANONICAL)); /* use the gSOAP engine's look-aside buffer to temporarily hold the sig */ if (soap_store_lab(soap, NULL, soap_smd_size(alg, key))) return soap->error = SOAP_EOM; sig = soap->labbuf; /* we will serialize SignedInfo as it appears exactly in the SOAP Header */ /* set indent level for XML SignedInfo as it appears in the SOAP Header */ soap->level = 4; /* prevent xmlns:ds namespace inclusion when non-exclusive is used */ if (!(soap->mode & SOAP_XML_CANONICAL)) soap_push_namespace(soap, "ds", ds_URI); /* use smdevp engine to sign SignedInfo */ err = soap_smd_begin(soap, alg, key, keylen); if (!err) err = soap_out_ds__SignedInfoType(soap, "ds:SignedInfo", 0, signature->SignedInfo, NULL); if (soap_smd_end(soap, sig, &siglen) || err) return soap_wsse_fault(soap, wsse__InvalidSecurity, "Could not sign"); /* populate the SignatureValue element */ signature->SignatureValue = soap_s2base64(soap, (unsigned char*)sig, NULL, siglen); if (!signature->SignatureValue) return soap->error; return SOAP_OK; } /** @fn int soap_wsse_verify_SignatureValue(struct soap *soap, int alg, const void *key, int keylen) @brief Verifies the SignatureValue of a SignedInfo element. @param soap context @param[in] alg is a signature algorith, such as SOAP_SMD_HMAC_SHA1, SOAP_SMD_VRFY_DSA_SHA1, or SOAP_SMD_VRFY_RSA_SHA1 determined by the SignedInfo/SignatureMethod @param[in] key to use to verify (HMAC or EVP_PKEY) @param[in] keylen length of HMAC key @return SOAP_OK, SOAP_EOM, or fault This function searches for the SignedInfo element in the soap->dom DOM tree to verify the signature in the SignatureValue element. Using the DOM ensures we will verify the signature of a SignedInfo as it was exactly received by the parser, by using the -DWITH_DOM compile flag and SOAP_XML_DOM runtime flag. If there is no DOM, it verifies the signature of the deserialized SignedInfo element in the SOAP Header. However, serializing deserialized data may change the octet stream that was signed, unless we're using gSOAP as producers and consumers (with the SOAP_XML_INDENT flag reset). */ int soap_wsse_verify_SignatureValue(struct soap *soap, int alg, const void *key, int keylen) { ds__SignatureType *signature = soap_wsse_Signature(soap); DBGFUN1("soap_wsse_verify_SignatureValue", "alg=%x", alg); /* always need an HMAC secret key or DSA/RSA public key to verify */ if (!key) return soap_wsse_fault(soap, wsse__SecurityTokenUnavailable, NULL); /* verify the SignedInfo element with the SignatureValue element */ if (signature && signature->SignedInfo && signature->SignatureValue) { char *sig; const char *sigval; int method, siglen, sigvallen; /* check that we are using the intended signature algorithm */ if (soap_wsse_get_SignedInfo_SignatureMethod(soap, &method)) return soap->error; if (alg != method) return soap_wsse_fault(soap, wsse__FailedCheck, "Incorrect signature algorithm used"); /* retrieve the signature */ sigval = soap_base642s(soap, signature->SignatureValue, NULL, 0, &sigvallen); /* search the DOM for SignedInfo */ if (soap->dom) { struct soap_dom_element *elt; /* traverse the DOM while searching for SignedInfo in the ds namespace */ for (elt = soap->dom; elt; elt = soap_dom_next_element(elt)) { if (elt->name && elt->nstr && !strcmp(elt->nstr, ds_URI) && (!strcmp(elt->name, "SignedInfo") || !soap_tag_cmp(elt->name, "*:SignedInfo"))) break; } /* found it? */ if (elt) { int err = SOAP_OK; /* should not include leading whitespace in signature verification */ elt->head = NULL; /* use smdevp engine to verify SignedInfo */ if ((alg & SOAP_SMD_ALGO) == SOAP_SMD_HMAC) sig = (char*)soap_malloc(soap, soap_smd_size(alg, key)); else { sig = (char*)sigval; siglen = sigvallen; } if (signature->SignedInfo->CanonicalizationMethod && signature->SignedInfo->CanonicalizationMethod->Algorithm && !strcmp(signature->SignedInfo->CanonicalizationMethod->Algorithm, c14n_URI)) { struct soap_dom_element *prt; struct soap_dom_attribute *att; /* recanonicalize DOM while keeping content "as is" */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Verifying signed canonicalized DOM\n")); soap->mode &= ~SOAP_XML_DOM; soap->mode |= SOAP_XML_CANONICAL | SOAP_DOM_ASIS; err = soap_smd_begin(soap, alg, key, keylen); /* emit all xmlns attributes of ancestors */ while (soap->nlist) { struct soap_nlist *np = soap->nlist->next; SOAP_FREE(soap, soap->nlist); soap->nlist = np; } /* TODO: consider moving this into dom.cpp */ for (prt = elt->prnt; prt; prt = prt->prnt) { for (att = prt->atts; att; att = att->next) if (!strncmp(att->name, "xmlns:", 6) && !soap_lookup_ns(soap, att->name + 6, strlen(att->name + 6))) soap_attribute(soap, att->name, att->data); } for (prt = elt->prnt; prt; prt = prt->prnt) { for (att = prt->atts; att; att = att->next) if (!strcmp(att->name, "xmlns")) { soap_attribute(soap, att->name, att->data); break; } } } else { /* compute digest over DOM "as is" */ soap->mode &= ~(SOAP_XML_CANONICAL | SOAP_XML_DOM); soap->mode |= SOAP_DOM_ASIS; err = soap_smd_begin(soap, alg, key, keylen); } /* do not dump namespace table xmlns bindings */ soap->ns = 2; /* compute digest */ soap->feltbegout = NULL; soap->feltendout = NULL; if (!err) err = soap_out_xsd__anyType(soap, NULL, 0, elt, NULL); if (soap_smd_end(soap, sig, &siglen) || err) return soap_wsse_fault(soap, wsse__FailedCheck, "The signed SignedInfo SignatureValue is invalid"); if ((alg & SOAP_SMD_ALGO) == SOAP_SMD_HMAC) { if (siglen != sigvallen || memcmp(sig, sigval, siglen)) return soap_wsse_fault(soap, wsse__FailedCheck, "The HMAC-signed SignedInfo is invalid"); } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Signature in DOM is valid\n")); return SOAP_OK; } } else { int err = SOAP_OK; const char *c14nexclude; soap_mode mode; /* serialize the SignedInfo element as it appeared in the SOAP Header */ soap->level = 4; c14nexclude = soap->c14nexclude; soap->c14nexclude = "ds"; mode = soap->mode; if (signature->SignedInfo->CanonicalizationMethod) soap->mode |= SOAP_XML_CANONICAL; else soap->mode &= ~SOAP_XML_CANONICAL; if ((alg & SOAP_SMD_ALGO) == SOAP_SMD_HMAC) sig = (char*)soap_malloc(soap, soap_smd_size(alg, key)); else { sig = (char*)sigval; siglen = sigvallen; } err = soap_smd_begin(soap, alg, key, keylen); if (!err) err = soap_out_ds__SignedInfoType(soap, "ds:SignedInfo", 0, signature->SignedInfo, NULL); soap->mode = mode; soap->c14nexclude = c14nexclude; if (soap_smd_end(soap, sig, &siglen) || err) return soap_wsse_fault(soap, wsse__FailedCheck, "The signed serialized SignedInfo SignatureValue is invalid"); if ((alg & SOAP_SMD_ALGO) == SOAP_SMD_HMAC) { if (siglen != sigvallen || memcmp(sig, sigval, siglen)) return soap_wsse_fault(soap, wsse__FailedCheck, "The HMAC-signed serialized SignedInfo is invalid"); } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Signature is valid\n")); return SOAP_OK; } } return soap_wsse_fault(soap, wsse__FailedCheck, "SignedInfo required"); } /** @fn int soap_wsse_verify_SignedInfo(struct soap *soap) @brief Verifies the digest values of the XML elements referenced by the SignedInfo References. @param soap context @return SOAP_OK or fault This function searches for the SignedInfo element in the soap->dom DOM tree to verify the digests contained therein. Using the DOM ensures we will verify the digests of the locally signed elements as they were exactly received by the parser, by using the -DWITH_DOM compile flag and SOAP_XML_DOM runtime flag. If there is no DOM, the function fails. */ int soap_wsse_verify_SignedInfo(struct soap *soap) { ds__SignedInfoType *signedInfo = soap_wsse_SignedInfo(soap); DBGFUN("soap_wsse_verify_SignedInfo"); if (signedInfo) { int i; /* must have at least one reference element */ if (signedInfo->__sizeReference == 0) return soap_wsse_fault(soap, wsse__InvalidSecurity, "Missing SignedInfo/Reference"); /* As an alternative to the current implementatin, this might be a good place to re-canonicalize the entire DOM to improve interop. Two DOMs can be used: one with non-c14n XML and one with c14n XML so we can handle multiple different transforms. */ /* for each reference element, check the digest */ for (i = 0; i < signedInfo->__sizeReference; i++) { ds__ReferenceType *reference = signedInfo->Reference[i]; /* reference element is complete? */ if (!reference->URI || !reference->DigestMethod || !reference->DigestMethod->Algorithm || !reference->DigestValue) return soap_wsse_fault(soap, wsse__InvalidSecurity, "Incomplete SignedInfo/Reference"); /* reference is local? */ if (*reference->URI == '#') { int alg, canonical; unsigned char hash[SOAP_SMD_MAX_SIZE]; /* digest algorithm */ if (!strcmp(reference->DigestMethod->Algorithm, ds_sha1URI)) alg = SOAP_SMD_DGST_SHA1; else if (!strcmp(reference->DigestMethod->Algorithm, ds_sha256URI)) alg = SOAP_SMD_DGST_SHA256; else if (!strcmp(reference->DigestMethod->Algorithm, ds_sha512URI)) alg = SOAP_SMD_DGST_SHA512; else return soap_wsse_fault(soap, wsse__UnsupportedAlgorithm, reference->DigestMethod->Algorithm); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Verifying digest of locally referenced data %s alg=%x\n", reference->URI, alg)); /* if reference has a transform, it should be an exc-c14n transform */ if (reference->Transforms) { if (reference->Transforms->__sizeTransform != 1 || !reference->Transforms->Transform[0].Algorithm || strcmp(reference->Transforms->Transform[0].Algorithm, c14n_URI)) return soap_wsse_fault(soap, wsse__UnsupportedAlgorithm, reference->Transforms->Transform[0].Algorithm); canonical = 1; } else canonical = 0; /* convert base64 digest to binary */ soap_base642s(soap, reference->DigestValue, (char*)hash, SOAP_SMD_MAX_SIZE, NULL); /* verify the digest of a locally signed element */ if (soap_wsse_verify_digest(soap, alg, canonical, reference->URI + 1, hash)) return soap->error; } } return SOAP_OK; } return soap_wsse_fault(soap, wsse__InvalidSecurity, "Missing SignedInfo"); } /** @fn int soap_wsse_verify_digest(struct soap *soap, int alg, int canonical, const char *id, unsigned char hash[SOAP_SMD_MAX_SIZE]) @brief Verifies the digest value of an XML element referenced by id against the hash. @param soap context @param[in] alg digest algorithm @param[in] canonical flag indicating that element is signed in exc-c14n form @param[in] id string of the XML element to verify @param[in] hash digest value to verify against @return SOAP_OK or fault */ int soap_wsse_verify_digest(struct soap *soap, int alg, int canonical, const char *id, unsigned char hash[SOAP_SMD_MAX_SIZE]) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); struct soap_dom_element *elt, *dom = NULL; DBGFUN3("soap_wsse_verify_digest", "alg=%x", alg, "canonical=%d", canonical, "id=%s", id); if (!data) return soap_set_receiver_error(soap, "soap_wsse_verify_digest", "Plugin not registered", SOAP_PLUGIN_ERROR); /* traverse the DOM to find the element with matching wsu:Id or ds:Id */ for (elt = soap->dom; elt; elt = soap_dom_next_element(elt)) { struct soap_dom_attribute *att; for (att = elt->atts; att; att = att->next) { /* check attribute */ if (att->name && att->nstr && (!strcmp(att->nstr, wsu_URI) || !strcmp(att->nstr, ds_URI)) && (!strcmp(att->name, "Id") || !soap_tag_cmp(att->name, "*:Id"))) { /* found a match, compare attribute value with id */ if (att->data && !strcmp(att->data, id)) { if (dom) return soap_wsse_fault(soap, wsse__FailedCheck, "SignedInfo duplicate Id"); dom = elt; /* elt = NULL; break; */ /* improves speed but skips duplicate Id check */ } } } } if (dom) { unsigned char HA[SOAP_SMD_MAX_SIZE]; int len, err = SOAP_OK; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Computing digest for Id=%s\n", id)); /* do not hash leading whitespace */ dom->head = NULL; /* canonical or as-is? */ if (canonical) { struct soap_dom_element *prt; struct soap_dom_attribute *att; soap->mode |= SOAP_XML_CANONICAL | SOAP_DOM_ASIS; err = soap_smd_begin(soap, alg, NULL, 0); /* emit all xmlns attributes of ancestors */ while (soap->nlist) { struct soap_nlist *np = soap->nlist->next; SOAP_FREE(soap, soap->nlist); soap->nlist = np; } /* TODO: consider moving this into dom.cpp */ for (prt = dom->prnt; prt; prt = prt->prnt) { for (att = prt->atts; att; att = att->next) { if (!strncmp(att->name, "xmlns:", 6) && !soap_lookup_ns(soap, att->name + 6, strlen(att->name + 6))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Attribute=%s\n", att->name)); soap_attribute(soap, att->name, att->data); } } } for (prt = dom->prnt; prt; prt = prt->prnt) { for (att = prt->atts; att; att = att->next) { if (!strcmp(att->name, "xmlns")) { soap_attribute(soap, att->name, att->data); break; } } } } else { /* compute digest over DOM "as is" */ soap->mode &= ~SOAP_XML_CANONICAL; soap->mode |= SOAP_DOM_ASIS; err = soap_smd_begin(soap, alg, NULL, 0); } /* do not dump namespace table xmlns bindings */ soap->ns = 2; /* compute digest */ soap->feltbegout = NULL; soap->feltendout = NULL; if (!err) err = soap_out_xsd__anyType(soap, NULL, 0, dom, NULL); if (soap_smd_end(soap, (char*)HA, &len) || err) return soap_wsse_fault(soap, wsse__FailedCheck, "Digest computation failed"); /* compare digests, success if identical */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Comparing digest hashes\n")); DBGHEX(TEST, hash, len); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n--\n")); DBGHEX(TEST, HA, len); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n")); if (!memcmp(hash, HA, (size_t)len)) return SOAP_OK; return soap_wsse_fault(soap, wsse__FailedCheck, NULL); } if (data->vrfy_alg & SOAP_WSSE_IGNORE_EXTRA_REFS) return SOAP_OK; return soap_wsse_fault(soap, wsse__FailedCheck, "SignedInfo reference URI target not found"); } /******************************************************************************\ * * ds:Signature/KeyInfo * \******************************************************************************/ /** @fn ds__KeyInfoType* soap_wsse_add_KeyInfo(struct soap *soap) @brief Adds KeyInfo element. @param soap context @return ds__KeyInfo object */ struct ds__KeyInfoType* soap_wsse_add_KeyInfo(struct soap *soap) { ds__SignatureType *signature = soap_wsse_add_Signature(soap); if (!signature->KeyInfo) { signature->KeyInfo = (ds__KeyInfoType*)soap_malloc(soap, sizeof(ds__KeyInfoType)); if (!signature->KeyInfo) return NULL; } soap_default_ds__KeyInfoType(soap, signature->KeyInfo); return signature->KeyInfo; } /** @fn ds__KeyInfoType* soap_wsse_KeyInfo(struct soap *soap) @brief Returns KeyInfo element if present. @param soap context @return ds__KeyInfo object or NULL */ struct ds__KeyInfoType* soap_wsse_KeyInfo(struct soap *soap) { ds__SignatureType *signature = soap_wsse_Signature(soap); if (signature) return signature->KeyInfo; return NULL; } /******************************************************************************\ * * ds:Signature/KeyInfo/KeyName * \******************************************************************************/ /** @fn int soap_wsse_add_KeyInfo_KeyName(struct soap *soap, const char *name) @brief Adds KeyName element. @param soap context @param[in] name string of the KeyName @return SOAP_OK Note: the recommended method to add Key information is to utilize KeyIdentifier instead of KeyName. A KeyName is useful mainly for internal use. */ int soap_wsse_add_KeyInfo_KeyName(struct soap *soap, const char *name) { ds__KeyInfoType *keyInfo = soap_wsse_add_KeyInfo(soap); DBGFUN1("soap_wsse_add_KeyInfo_KeyName", "name=%s", name); /* populate the KeyName element */ keyInfo->KeyName = soap_strdup(soap, name); return SOAP_OK; } /** @fn int soap_wsse_get_KeyInfo_KeyName(struct soap *soap) @brief Returns KeyName element if present. @param soap context @return string or NULL */ const char* soap_wsse_get_KeyInfo_KeyName(struct soap *soap) { ds__KeyInfoType *keyInfo = soap_wsse_KeyInfo(soap); DBGFUN("soap_wsse_get_KeyInfo_KeyName"); if (!keyInfo) return NULL; return keyInfo->KeyName; } /******************************************************************************\ * * ds:Signature/KeyInfo/wsse:SecurityTokenReference/Reference/@URI * \******************************************************************************/ /** @fn int soap_wsse_add_KeyInfo_SecurityTokenReferenceURI(struct soap *soap, const char *URI, const char *valueType) @brief Adds KeyInfo element with SecurityTokenReference URI. @param soap context @param[in] URI string referencing a security token @param[in] valueType string or NULL @return SOAP_OK */ int soap_wsse_add_KeyInfo_SecurityTokenReferenceURI(struct soap *soap, const char *URI, const char *valueType) { ds__KeyInfoType *keyInfo = soap_wsse_add_KeyInfo(soap); DBGFUN2("soap_wsse_add_KeyInfo_SecurityTokenReferenceURI", "URI=%s", URI?URI:"", "valueType=%s", valueType?valueType:""); /* allocate SecurityTokenReference element if we don't have one already */ if (!keyInfo->wsse__SecurityTokenReference) { keyInfo->wsse__SecurityTokenReference = (_wsse__SecurityTokenReference*)soap_malloc(soap, sizeof(_wsse__SecurityTokenReference)); if (!keyInfo->wsse__SecurityTokenReference) return soap->error = SOAP_EOM; } soap_default__wsse__SecurityTokenReference(soap, keyInfo->wsse__SecurityTokenReference); /* allocate Reference element */ keyInfo->wsse__SecurityTokenReference->Reference = (_wsse__Reference*)soap_malloc(soap, sizeof(_wsse__Reference)); soap_default__wsse__Reference(soap, keyInfo->wsse__SecurityTokenReference->Reference); /* populate the Reference element */ keyInfo->wsse__SecurityTokenReference->Reference->URI = soap_strdup(soap, URI); keyInfo->wsse__SecurityTokenReference->Reference->ValueType = soap_strdup(soap, valueType); return SOAP_OK; } /** @fn int soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(struct soap *soap, const char *URI) @brief Adds KeyInfo element with SecurityTokenReference URI to an X509 cert. @param soap context @param[in] URI string referencing an X509 certificate @return SOAP_OK */ int soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(struct soap *soap, const char *URI) { return soap_wsse_add_KeyInfo_SecurityTokenReferenceURI(soap, URI, wsse_X509v3URI); } /** @fn const char* soap_wsse_get_KeyInfo_SecurityTokenReferenceURI(struct soap *soap) @brief Returns a SecurityTokenReference URI if present. @param soap context @return string or NULL */ const char* soap_wsse_get_KeyInfo_SecurityTokenReferenceURI(struct soap *soap) { ds__KeyInfoType *keyInfo = soap_wsse_KeyInfo(soap); if (keyInfo && keyInfo->wsse__SecurityTokenReference && keyInfo->wsse__SecurityTokenReference->Reference) return keyInfo->wsse__SecurityTokenReference->Reference->URI; return NULL; } /** @fn const char* soap_wsse_get_KeyInfo_SecurityTokenReferenceValueType(struct soap *soap) @brief Returns a SecurityTokenReference ValueType if present. @param soap context @return string or NULL */ const char* soap_wsse_get_KeyInfo_SecurityTokenReferenceValueType(struct soap *soap) { ds__KeyInfoType *keyInfo = soap_wsse_KeyInfo(soap); if (keyInfo && keyInfo->wsse__SecurityTokenReference && keyInfo->wsse__SecurityTokenReference->Reference) return keyInfo->wsse__SecurityTokenReference->Reference->ValueType; return NULL; } /** @fn X509* soap_wsse_get_KeyInfo_SecurityTokenReferenceX509(struct soap *soap) @brief Returns a X509 certificate if present as a BinarySecurity token. @param soap context @return X509 object or NULL with wsse:SecurityTokenUnavailable fault */ X509* soap_wsse_get_KeyInfo_SecurityTokenReferenceX509(struct soap *soap) { const char *URI = soap_wsse_get_KeyInfo_SecurityTokenReferenceURI(soap); X509 *cert = NULL; DBGFUN("soap_wsse_get_KeyInfo_SecurityTokenReferenceX509"); if (URI && *URI == '#') { const char *valueType; valueType = soap_wsse_get_KeyInfo_SecurityTokenReferenceValueType(soap); if (!valueType || !strcmp(valueType, wsse_X509v3URI)) cert = soap_wsse_get_BinarySecurityTokenX509(soap, URI + 1); } return cert; } /** @fn struct ds__X509IssuerSerialType *soap_wsse_get_KeyInfo_SecurityTokenReferenceX509Data(struct soap *soap) @brief Returns ds__X509IssuerSerialType with non-NULL X509IssuerName and non-NULL X509SerialNumber of a X509Data element when present and set. @param soap context @return pointer to ds__X509IssuerSerialType struct or NULL */ struct ds__X509IssuerSerialType * soap_wsse_get_KeyInfo_SecurityTokenReferenceX509Data(struct soap *soap) { ds__KeyInfoType *keyInfo = soap_wsse_KeyInfo(soap); if (keyInfo && keyInfo->wsse__SecurityTokenReference && keyInfo->wsse__SecurityTokenReference->ds__X509Data && keyInfo->wsse__SecurityTokenReference->ds__X509Data->X509IssuerSerial && keyInfo->wsse__SecurityTokenReference->ds__X509Data->X509IssuerSerial->X509IssuerName && keyInfo->wsse__SecurityTokenReference->ds__X509Data->X509IssuerSerial->X509SerialNumber) return keyInfo->wsse__SecurityTokenReference->ds__X509Data->X509IssuerSerial; return NULL; } /******************************************************************************\ * * ds:Signature/KeyInfo/wsse:SecurityTokenReference/Reference/KeyIdentifier * \******************************************************************************/ /** @fn int soap_wsse_add_KeyInfo_SecurityTokenReferenceKeyIdentifier(struct soap *soap, const char *id, const char *valueType, unsigned char *data, int size) @brief Adds KeyInfo element with SecurityTokenReference/KeyIdentifier binary data @param soap context @param[in] id string for signature reference @param[in] valueType string @param[in] data binary data @param[in] size of binary data @return SOAP_OK */ int soap_wsse_add_KeyInfo_SecurityTokenReferenceKeyIdentifier(struct soap *soap, const char *id, const char *valueType, unsigned char *data, int size) { ds__KeyInfoType *keyInfo = soap_wsse_add_KeyInfo(soap); DBGFUN2("soap_wsse_add_KeyInfo_SecurityTokenReferenceKeyIdentifier", "id=%s", id?id:"", "valueType=%s", valueType?valueType:""); /* allocate SecurityTokenReference if we don't have one already */ if (!keyInfo->wsse__SecurityTokenReference) { keyInfo->wsse__SecurityTokenReference = (_wsse__SecurityTokenReference*)soap_malloc(soap, sizeof(_wsse__SecurityTokenReference)); if (!keyInfo->wsse__SecurityTokenReference) return soap->error = SOAP_EOM; } soap_default__wsse__SecurityTokenReference(soap, keyInfo->wsse__SecurityTokenReference); /* allocate KeyIdentifier */ keyInfo->wsse__SecurityTokenReference->KeyIdentifier = (_wsse__KeyIdentifier*)soap_malloc(soap, sizeof(_wsse__KeyIdentifier)); if (!keyInfo->wsse__SecurityTokenReference->KeyIdentifier) return soap->error = SOAP_EOM; soap_default__wsse__KeyIdentifier(soap, keyInfo->wsse__SecurityTokenReference->KeyIdentifier); /* populate KeyIdentifier */ keyInfo->wsse__SecurityTokenReference->KeyIdentifier->wsu__Id = soap_strdup(soap, id); keyInfo->wsse__SecurityTokenReference->KeyIdentifier->ValueType = soap_strdup(soap, valueType); keyInfo->wsse__SecurityTokenReference->KeyIdentifier->EncodingType = (char*)wsse_Base64BinaryURI; keyInfo->wsse__SecurityTokenReference->KeyIdentifier->__item = soap_s2base64(soap, data, NULL, size); return SOAP_OK; } /** @fn const char* soap_wsse_get_KeyInfo_SecurityTokenReferenceKeyIdentifierValueType(struct soap *soap) @brief Returns KeyInfo/SecurityTokenReference/KeyIdentifier/ValueType if present @param soap context @return string or NULL */ const char* soap_wsse_get_KeyInfo_SecurityTokenReferenceKeyIdentifierValueType(struct soap *soap) { ds__KeyInfoType *keyInfo = soap_wsse_KeyInfo(soap); DBGFUN("soap_wsse_get_KeyInfo_SecurityTokenReferenceKeyIdentifierValueType"); if (!keyInfo || !keyInfo->wsse__SecurityTokenReference || !keyInfo->wsse__SecurityTokenReference->KeyIdentifier) return NULL; return keyInfo->wsse__SecurityTokenReference->KeyIdentifier->ValueType; } /** @fn const unsigned char* soap_wsse_get_KeyInfo_SecurityTokenReferenceKeyIdentifier(struct soap *soap, int *size) @brief Returns KeyInfo/SecurityTokenReference/KeyIdentifier binary data @param soap context @param[out] size is set to the size of the decoded data @return data or NULL */ const unsigned char* soap_wsse_get_KeyInfo_SecurityTokenReferenceKeyIdentifier(struct soap *soap, int *size) { ds__KeyInfoType *keyInfo = soap_wsse_KeyInfo(soap); DBGFUN("soap_wsse_get_KeyInfo_SecurityTokenReferenceKeyIdentifier"); if (!keyInfo || !keyInfo->wsse__SecurityTokenReference || !keyInfo->wsse__SecurityTokenReference->KeyIdentifier) return NULL; return (unsigned char*)soap_base642s(soap, keyInfo->wsse__SecurityTokenReference->KeyIdentifier->__item, NULL, 0, size); } /******************************************************************************\ * * ds:Signature/KeyInfo/wsse:SecurityTokenReference/Reference/Embedded * \******************************************************************************/ /** @fn int soap_wsse_add_KeyInfo_SecurityTokenReferenceEmbedded(struct soap *soap, const char *id, const char *valueType) @brief Adds KeyInfo element with Embedded SecurityTokenReference. @param soap context @param[in] id string for signature reference @param[in] valueType string @return SOAP_OK Note: this function does not add embedded tokens automatically. See code for comments. */ int soap_wsse_add_KeyInfo_SecurityTokenReferenceEmbedded(struct soap *soap, const char *id, const char *valueType) { ds__KeyInfoType *keyInfo = soap_wsse_add_KeyInfo(soap); DBGFUN("soap_wsse_get_KeyInfo_SecurityTokenReferenceEmbedded"); /* allocate SecurityTokenReference if we don't have one already */ if (!keyInfo->wsse__SecurityTokenReference) { keyInfo->wsse__SecurityTokenReference = (_wsse__SecurityTokenReference*)soap_malloc(soap, sizeof(_wsse__SecurityTokenReference)); if (!keyInfo->wsse__SecurityTokenReference) return soap->error = SOAP_EOM; } soap_default__wsse__SecurityTokenReference(soap, keyInfo->wsse__SecurityTokenReference); /* allocate Embedded element */ keyInfo->wsse__SecurityTokenReference->Embedded = (_wsse__Embedded*)soap_malloc(soap, sizeof(_wsse__Embedded)); if (!keyInfo->wsse__SecurityTokenReference->Embedded) return soap->error = SOAP_EOM; soap_default__wsse__Embedded(soap, keyInfo->wsse__SecurityTokenReference->Embedded); /* populate Embedded element */ keyInfo->wsse__SecurityTokenReference->Embedded->wsu__Id = soap_strdup(soap, id); keyInfo->wsse__SecurityTokenReference->Embedded->ValueType = soap_strdup(soap, valueType); /* TODO: Add embedded tokens and assertions. Could use DOM here? keyInfo->wsse__SecurityTokenReference->Embedded->xyz = ...; */ return SOAP_OK; } /******************************************************************************\ * * wsse:Security/xenc:EncryptedKey header element * \******************************************************************************/ /** @fn int soap_wsse_add_EncryptedKey(struct soap *soap, int alg, const char *URI, X509 *cert, const char *subjectkeyid, const char *issuer, const char *serial) @brief Adds EncryptedKey header element and initiates the encryption of the SOAP Body. @param soap context @param[in] alg algorithm to use, SOAP_MEC_ENV_ENC_DES_CBC or SOAP_MEC_ENV_ENC_AEAS256_CBC @param[in] URI a unique identifier for the key, required for interoperability @param[in] cert the X509 certificate with public key or NULL @param[in] subjectkeyid string identification of the subject which when set to non-NULL is used instead of embedding the public key in the message @param[in] issuer string to include SecurityTokenReference/X509Data @param[in] serial string to include SecurityTokenReference/X509Data @return SOAP_OK or error code This function adds the encrypted key or subject key ID to the WS-Security header and initiates encryption of the SOAP Body. An X509 certificate may be provided, or the subjectkeyid, or the issuer and serial number. The certificate is embedded in the WS-Security EncryptedKey header. If the subjectkeyid string is non-NULL the subject key ID is used in the EncryptedKey header instead of the X509 certificate content. */ int soap_wsse_add_EncryptedKey(struct soap *soap, int alg, const char *URI, X509 *cert, const char *subjectkeyid, const char *issuer, const char *serial) { return soap_wsse_add_EncryptedKey_encrypt_only(soap, alg, URI, cert, subjectkeyid, issuer, serial, NULL); } /** @fn int soap_wsse_add_EncryptedKey_encrypt_only(struct soap *soap, int alg, const char *URI, X509 *cert, const char *subjectkeyid, const char *issuer, const char *serial, const char *tags) @brief Adds EncryptedKey header element and initiates encryption of the given XML elements specified in the tags string. Should be used in combination with soap_wsse_set_wsu_id to set wsu:Id for given XML element tags. @param soap context @param[in] alg algorithm to use, SOAP_MEC_ENV_ENC_DES_CBC or SOAP_MEC_ENV_ENC_AEAS256_CBC @param[in] URI a unique identifier for the key, required for interoperability @param[in] cert the X509 certificate with public key or NULL @param[in] subjectkeyid string identification of the subject which when set to non-NULL is used instead of embedding the public key in the message @param[in] issuer string to include SecurityTokenReference/X509Data @param[in] serial string to include SecurityTokenReference/X509Data @param[in] tags space-separated string of element tag names to encrypt @return xenc__EncryptedKeyType object This function adds the encrypted key or subject key ID to the WS-Security header and initiates encryption of the SOAP Body. An X509 certificate may be provided, or the subjectkeyid, or the issuer and serial number. The certificate is embedded in the WS-Security EncryptedKey header. If the subjectkeyid string is non-NULL the subject key ID is used in the EncryptedKey header instead of the X509 certificate content. Only the XML elements given in the 'tags' string as wsu:Id attributed elements are encrypted. WARNING: Use @ref soap_wsse_add_EncryptedKey_encrypt_only only in combination with @ref soap_wsse_set_wsu_id with the tag names of the elements to be encrypted. OTHERWISE THE GIVEN XML ELEMENTS ARE NOT ENCRYPTED AND WILL BE SENT IN THE CLEAR. WARNING: The elements identified with @ref soap_wsse_set_wsu_id to encrypt MUST occur EXACTLY ONCE in the SOAP Body. WARNING: Encryption/decryption of elements with simple content (CDATA content) IS NOT SUPPORTED. This means that elements you want to encrypt with this function must have complex content. That is, only encrypt elements with sub elements or encrypt the entire SOAP Body. */ int soap_wsse_add_EncryptedKey_encrypt_only(struct soap *soap, int alg, const char *URI, X509 *cert, const char *subjectkeyid, const char *issuer, const char *serial, const char *tags) { EVP_PKEY *pubk; unsigned char *key; int keylen; _wsse__Security *security; struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); DBGFUN("soap_wsse_add_EncryptedKey"); if (!data) return soap_set_receiver_error(soap, "soap_wsse_add_EncryptedKey", "Plugin not registered", SOAP_PLUGIN_ERROR); security = soap_wsse_add_Security(soap); /* if we don't have a xenc:EncryptedKey, create one */ if (!security->xenc__EncryptedKey) { if (!(security->xenc__EncryptedKey = (xenc__EncryptedKeyType*)soap_malloc(soap, sizeof(xenc__EncryptedKeyType)))) return soap->error = SOAP_EOM; } soap_default_xenc__EncryptedKeyType(soap, security->xenc__EncryptedKey); security->xenc__EncryptedKey->Id = soap_strdup(soap, URI); if (!(security->xenc__EncryptedKey->EncryptionMethod = (xenc__EncryptionMethodType*)soap_malloc(soap, sizeof(struct xenc__EncryptionMethodType)))) return soap->error = SOAP_EOM; soap_default_xenc__EncryptionMethodType(soap, security->xenc__EncryptedKey->EncryptionMethod); /* RSA Version 1.5 or RSA-OAEP */ alg |= (SOAP_MEC_ENV | SOAP_MEC_ENC); if (alg & SOAP_MEC_OAEP) { security->xenc__EncryptedKey->EncryptionMethod->Algorithm = (char*)xenc_rsaesURI; security->xenc__EncryptedKey->EncryptionMethod->OAEPparams = NULL; if (!(security->xenc__EncryptedKey->EncryptionMethod->ds__DigestMethod = (struct ds__DigestMethodType*)soap_malloc(soap, sizeof(struct ds__DigestMethodType)))) return soap->error = SOAP_EOM; soap_default_ds__DigestMethodType(soap, security->xenc__EncryptedKey->EncryptionMethod->ds__DigestMethod); security->xenc__EncryptedKey->EncryptionMethod->ds__DigestMethod->Algorithm = (char*)ds_sha1URI; } else security->xenc__EncryptedKey->EncryptionMethod->Algorithm = (char*)xenc_rsa15URI; /* KeyInfo */ if (!(security->xenc__EncryptedKey->ds__KeyInfo = (_ds__KeyInfo*)soap_malloc(soap, sizeof(_ds__KeyInfo)))) return soap->error = SOAP_EOM; soap_default__ds__KeyInfo(soap, security->xenc__EncryptedKey->ds__KeyInfo); /* allocate SecurityTokenReference */ if (!(security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference = (_wsse__SecurityTokenReference*)soap_malloc(soap, sizeof(_wsse__SecurityTokenReference)))) return soap->error = SOAP_EOM; soap_default__wsse__SecurityTokenReference(soap, security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference); if (issuer && serial) { if (!(security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->ds__X509Data = (struct ds__X509DataType*)soap_malloc(soap, sizeof(struct ds__X509DataType)))) return soap->error = SOAP_EOM; soap_default_ds__X509DataType(soap, security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->ds__X509Data); if (!(security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->ds__X509Data->X509IssuerSerial = (struct ds__X509IssuerSerialType*)soap_malloc(soap, sizeof(struct ds__X509IssuerSerialType)))) return soap->error = SOAP_EOM; soap_default_ds__X509IssuerSerialType(soap, security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->ds__X509Data->X509IssuerSerial); security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->ds__X509Data->X509IssuerSerial->X509IssuerName = soap_strdup(soap, issuer); security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->ds__X509Data->X509IssuerSerial->X509SerialNumber = soap_strdup(soap, serial); } else { /* allocate KeyIdentifier */ if (!(security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier = (_wsse__KeyIdentifier*)soap_malloc(soap, sizeof(_wsse__KeyIdentifier)))) return soap->error = SOAP_EOM; soap_default__wsse__KeyIdentifier(soap, security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier); /* populate KeyIdentifier */ security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier->EncodingType = (char*)wsse_Base64BinaryURI; if (subjectkeyid) { security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier->ValueType = (char*)wsse_X509v3SubjectKeyIdentifierURI; security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier->__item = soap_s2base64(soap, (unsigned char*)subjectkeyid, NULL, strlen(subjectkeyid)); } else if (cert) { unsigned char *der, *s; int derlen; security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier->ValueType = (char*)wsse_X509v3URI; /* determine the storage requirement */ derlen = i2d_X509(cert, NULL); if (derlen < 0) return soap_wsse_fault(soap, wsse__InvalidSecurityToken, "Invalid certificate passed to soap_wsse_add_EncryptedKey_encrypt_only"); /* use the gSOAP engine's look-aside buffer to temporarily hold the cert */ if (soap_store_lab(soap, NULL, derlen)) return SOAP_EOM; s = der = (unsigned char*)soap->labbuf; /* store in DER format */ i2d_X509(cert, &s); security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier->__item = soap_s2base64(soap, der, NULL, derlen); } } /* CipherData */ if (!(security->xenc__EncryptedKey->CipherData = (xenc__CipherDataType*)soap_malloc(soap, sizeof(struct xenc__CipherDataType)))) return soap->error = SOAP_EOM; soap_default_xenc__CipherDataType(soap, security->xenc__EncryptedKey->CipherData); /* get the public key */ pubk = X509_get_pubkey(cert); if (!pubk) return soap_wsse_fault(soap, wsse__InvalidSecurityToken, "Invalid certificate passed to soap_wsse_add_EncryptedKey_encrypt_only"); /* start encryption engine, get the encrypted secret key */ key = (unsigned char*)soap_malloc(soap, soap_mec_size(alg, pubk)); if (data->mec) soap_mec_cleanup(soap, data->mec); else data->mec = (struct soap_mec_data*)SOAP_MALLOC(soap, sizeof(struct soap_mec_data)); if (soap_mec_begin(soap, data->mec, alg, pubk, key, &keylen)) { EVP_PKEY_free(pubk); return soap->error; } EVP_PKEY_free(pubk); data->enco_alg = alg; data->enco_keyname = NULL; data->enco_key = key; data->enco_keylen = keylen; if (!(security->xenc__EncryptedKey->CipherData->CipherValue = soap_s2base64(soap, key, NULL, keylen))) return soap->error = SOAP_EOM; data->encid = soap_strdup(soap, tags); if (!tags) { soap->omode |= SOAP_SEC_WSUID; if (soap_wsse_add_EncryptedKey_DataReferenceURI(soap, "#Body")) return soap->error; } else { char *s, *t; size_t l = strlen(tags); /* make space to insert # to each id converted from a tag name */ t = (char*)soap_malloc(soap, l + 2); if (!t) return soap->error = SOAP_EOM; *t = '#'; soap_strcpy(t + 1, l + 1, tags); s = soap_wsse_ids(soap, t); if (!s) return soap->error = SOAP_EOM; s++; do { t = strchr(s, ' '); if (t) { *t = '\0'; while (*++t == ' ') ; } *--s = '#'; if (soap_wsse_add_EncryptedKey_DataReferenceURI(soap, s)) return soap->error; s = t; } while (s); } soap->feltbegout = soap_wsse_element_begin_out; soap->feltendout = soap_wsse_element_end_out; return SOAP_OK; } /** @fn int soap_wsse_verify_EncryptedKey(struct soap *soap) @brief Verifies the EncryptedKey header information (certificate validity requires soap->cacert to be set). Retrieves the decryption key from the token handler callback to decrypt the decryption key. @param soap context @return SOAP_OK or error code */ int soap_wsse_verify_EncryptedKey(struct soap *soap) { _wsse__Security *security = soap_wsse_Security(soap); struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); DBGFUN("soap_wsse_verify_EncryptedKey"); if (!data) return soap_set_receiver_error(soap, "soap_wsse_verify_EncryptedKey", "Plugin not registered", SOAP_PLUGIN_ERROR); /* if we have a xenc:EncryptedKey, check it and start envelope decryption */ if (security && security->xenc__EncryptedKey) { if (!security->xenc__EncryptedKey->EncryptionMethod || !security->xenc__EncryptedKey->EncryptionMethod->Algorithm) return soap_wsse_fault(soap, wsse__InvalidSecurity, "Invalid Encryption algorithm or key"); /* verify encrypted key */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Verify EncryptedKey alg=%x\n", data->deco_alg)); if (security->xenc__EncryptedKey->ds__KeyInfo) { int keylen; if (security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference && security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier && security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier->ValueType && security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier->__item) { if (!strcmp(security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier->ValueType, wsse_X509v3URI)) { X509 *cert = NULL; const unsigned char *der; int derlen; der = (unsigned char*)soap_base642s(soap, security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier->__item, NULL, 0, &derlen); if (!der) return soap_wsse_fault(soap, wsse__InvalidSecurity, "Invalid Encryption algorithm or key"); cert = d2i_X509(&cert, &der, derlen); if (soap_wsse_verify_X509(soap, cert)) { if (cert) X509_free(cert); return soap->error; } /* get the private key from subject name of cert, if not set */ if (!data->deco_key && data->security_token_handler) { char buf[1024]; data->deco_alg = SOAP_MEC_ENV_DEC_DES_CBC; data->deco_key = data->security_token_handler(soap, &data->deco_alg, X509_NAME_oneline(X509_get_subject_name(cert), buf, sizeof(buf)), &keylen); data->deco_keylen = 0; } if (cert) X509_free(cert); } else if (!data->deco_key && data->security_token_handler && !strcmp(security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier->ValueType, wsse_X509v3SubjectKeyIdentifierURI)) { int subjectkeyidlen; const char *subjectkeyid = (char*)soap_base642s(soap, security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier->__item, NULL, 0, &subjectkeyidlen); /* get the private key from subject key id */ data->deco_alg = SOAP_MEC_ENV_DEC_DES_CBC; data->deco_key = data->security_token_handler(soap, &data->deco_alg, subjectkeyid, &keylen); data->deco_keylen = 0; } } else if (!data->deco_key && data->security_token_handler) { const char *name = NULL; /* get the private key from key name or subject name */ if (security->xenc__EncryptedKey->ds__KeyInfo->KeyName) name = security->xenc__EncryptedKey->ds__KeyInfo->KeyName; else if (security->xenc__EncryptedKey->ds__KeyInfo->X509Data && security->xenc__EncryptedKey->ds__KeyInfo->X509Data->X509SubjectName) name = security->xenc__EncryptedKey->ds__KeyInfo->X509Data->X509SubjectName; if (name) { data->deco_alg = SOAP_MEC_ENV_DEC_DES_CBC; data->deco_key = data->security_token_handler(soap, &data->deco_alg, name, &keylen); data->deco_keylen = 0; } } } /* start decryption */ if (data->deco_key && security->xenc__EncryptedKey->CipherData && security->xenc__EncryptedKey->CipherData->CipherValue) { int keylen; unsigned char *key = (unsigned char*)soap_base642s(soap, security->xenc__EncryptedKey->CipherData->CipherValue, NULL, 0, &keylen); if (!strcmp(security->xenc__EncryptedKey->EncryptionMethod->Algorithm, xenc_rsaesURI)) data->deco_alg |= SOAP_MEC_OAEP; else if (strcmp(security->xenc__EncryptedKey->EncryptionMethod->Algorithm, xenc_rsa15URI)) return soap_wsse_fault(soap, wsse__InvalidSecurity, "Invalid Encryption algorithm or key"); if (data->mec) soap_mec_cleanup(soap, data->mec); else data->mec = (struct soap_mec_data*)SOAP_MALLOC(soap, sizeof(struct soap_mec_data)); if (soap_mec_begin(soap, data->mec, data->deco_alg, (SOAP_MEC_KEY_TYPE*)data->deco_key, key, &keylen)) return soap_wsse_fault(soap, wsse__FailedCheck, NULL); } /* do not process EncryptedKey again */ security->xenc__EncryptedKey = NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Verified EncryptedKey alg=%x\n", data->deco_alg)); } return SOAP_OK; } /** @fn void soap_wsse_delete_EncryptedKey(struct soap *soap) @brief Deletes EncryptedKey header element. @param soap context */ void soap_wsse_delete_EncryptedKey(struct soap *soap) { _wsse__Security *security = soap_wsse_Security(soap); DBGFUN("soap_wsse_delete_EncryptedKey"); if (security) security->xenc__EncryptedKey = NULL; } /** @fn xenc__EncryptedKeyType* soap_wsse_EncryptedKey(struct soap *soap) @brief Returns EncryptedKey header element if present. @param soap context @return xenc__EncryptedKeyType object or NULL */ struct xenc__EncryptedKeyType* soap_wsse_EncryptedKey(struct soap *soap) { _wsse__Security *security = soap_wsse_Security(soap); if (security) return security->xenc__EncryptedKey; return NULL; } /******************************************************************************\ * * wsse:Security/xenc:EncryptedKey/ReferenceList/DataReference * \******************************************************************************/ /** @fn int soap_wsse_add_EncryptedKey_DataReferenceURI(struct soap *soap, const char *URI) @brief Adds a DataReference URI to the EncryptedKey header element. @param soap context @param[in] URI value of the URI ID @return SOAP_OK or error code */ int soap_wsse_add_EncryptedKey_DataReferenceURI(struct soap *soap, const char *URI) { _wsse__Security *security = soap_wsse_add_Security(soap); _xenc__ReferenceList *ref; int k, n = 0; DBGFUN1("soap_wsse_add_EncryptedKey_DataReferenceURI", "URI=%s", URI?URI:""); if (!security->xenc__EncryptedKey) { if (!(security->xenc__EncryptedKey = (xenc__EncryptedKeyType*)soap_malloc(soap, sizeof(xenc__EncryptedKeyType)))) return soap->error = SOAP_EOM; soap_default_xenc__EncryptedKeyType(soap, security->xenc__EncryptedKey); } if (!security->xenc__EncryptedKey->ReferenceList) { if (!(security->xenc__EncryptedKey->ReferenceList = (struct _xenc__ReferenceList*)soap_malloc(soap, sizeof(struct _xenc__ReferenceList)))) return soap->error = SOAP_EOM; soap_default__xenc__ReferenceList(soap, security->xenc__EncryptedKey->ReferenceList); } ref = security->xenc__EncryptedKey->ReferenceList; k = ref->__size_ReferenceList++; /* need to increase space? */ if (k < 0) return soap->error = SOAP_EOM; if (k == 0) n = 1; else if (k >= 1 && (k & (k - 1)) == 0) n = 2 * k; /* yes we do */ if (n) { struct __xenc__union_ReferenceList *tmp = (struct __xenc__union_ReferenceList*)soap_malloc(soap, n * sizeof(struct __xenc__union_ReferenceList)); int i; if (!tmp) return soap->error = SOAP_EOM; for (i = 0; i < k; i++) tmp[i] = ref->__union_ReferenceList[i]; security->xenc__EncryptedKey->ReferenceList->__union_ReferenceList = tmp; ref = security->xenc__EncryptedKey->ReferenceList; } /* add entry */ soap_default___xenc__union_ReferenceList(soap, &ref->__union_ReferenceList[k]); if (!(ref->__union_ReferenceList[k].DataReference = (struct xenc__ReferenceType*)soap_malloc(soap, sizeof(struct xenc__ReferenceType)))) return soap->error = SOAP_EOM; soap_default_xenc__ReferenceType(soap, ref->__union_ReferenceList[k].DataReference); ref->__union_ReferenceList[k].DataReference->URI = soap_strdup(soap, URI); return SOAP_OK; } /** @fn int soap_wsse_add_DataReferenceURI(struct soap *soap, const char *URI) @brief Adds a DataReference URI to the WS-Security header element. @param soap context @param[in] URI value of the URI ID @return SOAP_OK or error code */ int soap_wsse_add_DataReferenceURI(struct soap *soap, const char *URI) { _wsse__Security *security = soap_wsse_add_Security(soap); _xenc__ReferenceList *ref; int k, n = 0; DBGFUN1("soap_wsse_add_DataReferenceURI", "URI=%s", URI?URI:""); /* initial alloc */ if (!security->xenc__ReferenceList) { if (!(security->xenc__ReferenceList = (struct _xenc__ReferenceList*)soap_malloc(soap, sizeof(struct _xenc__ReferenceList)))) return soap->error = SOAP_EOM; soap_default__xenc__ReferenceList(soap, security->xenc__ReferenceList); } ref = security->xenc__ReferenceList; k = ref->__size_ReferenceList++; /* need to increase space? */ if (k < 0) return soap->error = SOAP_EOM; if (k == 0) n = 1; else if (k >= 1 && (k & (k - 1)) == 0) n = 2 * k; /* yes we do */ if (n) { struct __xenc__union_ReferenceList *tmp = (struct __xenc__union_ReferenceList*)soap_malloc(soap, n * sizeof(struct __xenc__union_ReferenceList)); int i; if (!tmp) return soap->error = SOAP_EOM; for (i = 0; i < k; i++) tmp[i] = ref->__union_ReferenceList[i]; security->xenc__ReferenceList->__union_ReferenceList = tmp; ref = security->xenc__ReferenceList; } /* add entry */ soap_default___xenc__union_ReferenceList(soap, &ref->__union_ReferenceList[k]); if (!(ref->__union_ReferenceList[k].DataReference = (struct xenc__ReferenceType*)soap_malloc(soap, sizeof(struct xenc__ReferenceType)))) return soap->error = SOAP_EOM; soap_default_xenc__ReferenceType(soap, ref->__union_ReferenceList[k].DataReference); ref->__union_ReferenceList[k].DataReference->URI = soap_strdup(soap, URI); return SOAP_OK; } /******************************************************************************\ * * xenc:EncryptedData * \******************************************************************************/ /** @fn int soap_wsse_add_EncryptedData_KeyInfo_KeyName(struct soap *soap, const char *keyname) @brief Adds EncryptedData/ds:KeyInfo/Keyname elements. @param soap context @param[in] keyname name of the key @return SOAP_OK or error code This function adds the name of the key to each EncryptedData element to identify the shared secret key used for encryption. */ int soap_wsse_add_EncryptedData_KeyInfo_KeyName(struct soap *soap, const char *keyname) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); DBGFUN("soap_wsse_add_EncryptedData_KeyInfo_KeyName"); if (!data) return soap_set_receiver_error(soap, "soap_wsse_add_EncryptedData_KeyInfo_KeyName", "Plugin not registered", SOAP_PLUGIN_ERROR); data->enco_keyname = soap_strdup(soap, keyname); return SOAP_OK; } /******************************************************************************\ * * Faults * \******************************************************************************/ /** @fn int soap_wsse_sender_fault_subcode(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail) @brief Sets sender SOAP Fault (sub)code for server fault response. @param soap context @param[in] faultsubcode sub code string @param[in] faultstring fault string @param[in] faultdetail detail string @return SOAP_FAULT */ int soap_wsse_sender_fault_subcode(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail) { #if defined(SOAP_WSA_2003) || defined(SOAP_WSA_2004) || defined(SOAP_WSA_200408) || defined(SOAP_WSA_2005) return soap_wsa_sender_fault_subcode(soap, faultsubcode, faultstring, faultdetail); #else return soap_sender_fault_subcode(soap, faultsubcode, faultstring, faultdetail); #endif } /** @fn int soap_wsse_receiver_fault_subcode(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail) @brief Sets receiver SOAP Fault (sub)code for server fault response. @param soap context @param[in] faultsubcode sub code string @param[in] faultstring fault string @param[in] faultdetail detail string @return SOAP_FAULT */ int soap_wsse_receiver_fault_subcode(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail) { #if defined(SOAP_WSA_2003) || defined(SOAP_WSA_2004) || defined(SOAP_WSA_200408) || defined(SOAP_WSA_2005) return soap_wsa_receiver_fault_subcode(soap, faultsubcode, faultstring, faultdetail); #else return soap_receiver_fault_subcode(soap, faultsubcode, faultstring, faultdetail); #endif } /** @fn int soap_wsse_sender_fault(struct soap *soap, const char *faultstring, const char *faultdetail) @brief Sets sender SOAP Fault for server fault response. @param soap context @param[in] faultstring fault string @param[in] faultdetail detail string @return SOAP_FAULT */ int soap_wsse_sender_fault(struct soap *soap, const char *faultstring, const char *faultdetail) { return soap_wsse_sender_fault_subcode(soap, NULL, faultstring, faultdetail); } /** @fn int soap_wsse_receiver_fault(struct soap *soap, const char *faultstring, const char *faultdetail) @brief Sets receiver SOAP Fault for server fault response. @param soap context @param[in] faultstring fault string @param[in] faultdetail detail string @return SOAP_FAULT */ int soap_wsse_receiver_fault(struct soap *soap, const char *faultstring, const char *faultdetail) { return soap_wsse_receiver_fault_subcode(soap, NULL, faultstring, faultdetail); } /** @fn int soap_wsse_fault(struct soap *soap, wsse__FaultcodeEnum fault, const char *detail) @brief Sets SOAP Fault (sub)code for server response. @param soap context @param[in] fault is one of wsse:FaultcodeEnum @param[in] detail string with optional text message @return SOAP_FAULT */ int soap_wsse_fault(struct soap *soap, wsse__FaultcodeEnum fault, const char *detail) { const char *code = soap_wsse__FaultcodeEnum2s(soap, fault); DBGFUN2("soap_wsse_fault", "fault=%s", code?code:"", "detail=%s", detail?detail:""); /* remove incorrect or incomplete Security header */ soap_wsse_delete_Security(soap); /* populate the SOAP Fault as per WS-Security spec */ /* detail = NULL; */ /* uncomment when detail text not recommended */ /* use WSA to populate the SOAP Header when WSA is used */ switch (fault) { case wsse__UnsupportedSecurityToken: return soap_wsse_sender_fault_subcode(soap, code, "An unsupported token was provided", detail); case wsse__UnsupportedAlgorithm: return soap_wsse_sender_fault_subcode(soap, code, "An unsupported signature or encryption algorithm was used", detail); case wsse__InvalidSecurity: return soap_wsse_sender_fault_subcode(soap, code, "An error was discovered processing the header", detail); case wsse__InvalidSecurityToken: return soap_wsse_sender_fault_subcode(soap, code, "An invalid security token was provided", detail); case wsse__FailedAuthentication: return soap_wsse_sender_fault_subcode(soap, code, "The security token could not be authenticated or authorized", detail); case wsse__FailedCheck: return soap_wsse_sender_fault_subcode(soap, code, "The signature or decryption was invalid", detail); case wsse__SecurityTokenUnavailable: return soap_wsse_sender_fault_subcode(soap, code, "Referenced security token could not be retrieved", detail); } return SOAP_FAULT; } /******************************************************************************\ * * Digest authentication session management * \******************************************************************************/ /** @fn static int soap_wsse_session_verify(struct soap *soap, const char hash[SOAP_SMD_SHA1_SIZE], const char *created, const char *nonce) @brief Verifies and updates the digest, nonce, and creation time against the digest authentication session database to prevent replay attacks. @param soap context @param[in] hash binary digest value of PasswordDigest @param[in] created string @param[in] nonce string (base64) @return SOAP_OK or SOAP_FAULT */ static int soap_wsse_session_verify(struct soap *soap, const char hash[SOAP_SMD_SHA1_SIZE], const char *created, const char *nonce) { struct soap_wsse_session *session; time_t expired, now = time(NULL); DBGFUN("soap_wsse_session_verify"); soap_s2dateTime(soap, created, &expired); /* creation time in the future? */ if (expired > now + SOAP_WSSE_CLKSKEW) return soap_wsse_fault(soap, wsse__FailedAuthentication, "Authorization request in future"); expired += SOAP_WSSE_NONCETIME; /* expired? */ if (expired <= now) return soap_wsse_fault(soap, wsse__FailedAuthentication, "Authentication expired"); /* purge expired messages, but don't do this all the time to improve efficiency */ if (now % 10 == 0) soap_wsse_session_cleanup(soap); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Verifying session nonce=%s\n", nonce)); /* enter mutex to check and update session */ MUTEX_LOCK(soap_wsse_session_lock); for (session = soap_wsse_session; session; session = session->next) { if (!memcmp(session->hash, hash, SOAP_SMD_SHA1_SIZE) && !strcmp(session->nonce, nonce)) break; } /* if not found, allocate new session data */ if (!session) { size_t l = strlen(nonce); session = (struct soap_wsse_session*)malloc(sizeof(struct soap_wsse_session) + l); if (session) { session->next = soap_wsse_session; session->expired = expired; soap_memcpy(session->hash, sizeof(session->hash), hash, SOAP_SMD_SHA1_SIZE); soap_strcpy(session->nonce, l + 1, nonce); soap_wsse_session = session; } session = NULL; } /* exit mutex */ MUTEX_UNLOCK(soap_wsse_session_lock); /* if replay attack, return non-descript failure */ if (session) return soap_wsse_fault(soap, wsse__FailedAuthentication, NULL); return SOAP_OK; } /** @fn static void soap_wsse_session_cleanup(struct soap *soap) @brief Removes expired authentication data from the digest authentication session database. @param soap context */ static void soap_wsse_session_cleanup(struct soap *soap) { struct soap_wsse_session **session; time_t now = time(NULL); DBGFUN("soap_wsse_session_cleanup"); /* enter mutex to purge expired session data */ MUTEX_LOCK(soap_wsse_session_lock); session = &soap_wsse_session; while (*session) { if ((*session)->expired < now) { struct soap_wsse_session *p = *session; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Deleting session nonce=%s\n", p->nonce)); *session = p->next; free(p); } else session = &(*session)->next; } /* exit mutex */ MUTEX_UNLOCK(soap_wsse_session_lock); } /******************************************************************************\ * * Calculate SHA1(created, nonce, password) digest * \******************************************************************************/ /** @fn static void calc_digest(struct soap *soap, const char *created, const char *nonce, int noncelen, const char *password, char hash[SOAP_SMD_SHA1_SIZE]) @brief Calculates digest value SHA1(created, nonce, password) @param soap context @param[in] created string (XSD dateTime format) @param[in] nonce value @param[in] noncelen length of nonce value @param[in] password string @param[out] hash SHA1 digest */ static void calc_digest(struct soap *soap, const char *created, const char *nonce, int noncelen, const char *password, char hash[SOAP_SMD_SHA1_SIZE]) { struct soap_smd_data context; /* use smdevp engine */ soap_smd_init(soap, &context, SOAP_SMD_DGST_SHA1, NULL, 0); soap_smd_update(soap, &context, nonce, noncelen); soap_smd_update(soap, &context, created, strlen(created)); soap_smd_update(soap, &context, password, strlen(password)); soap_smd_final(soap, &context, hash, NULL); } /******************************************************************************\ * * Calculate randomized hex nonce * \******************************************************************************/ /** @fn static void calc_nonce(struct soap *soap, char nonce[SOAP_WSSE_NONCELEN]) @brief Calculates randomized nonce (also uses time() in case a poorly seeded PRNG is used) @param soap context @param[out] nonce value */ static void calc_nonce(struct soap *soap, char nonce[SOAP_WSSE_NONCELEN]) { int i; time_t r = time(NULL); soap_memcpy((void*)nonce, SOAP_WSSE_NONCELEN, (const void*)&r, 4); for (i = 4; i < SOAP_WSSE_NONCELEN; i += 4) { r = soap_random; soap_memcpy((void*)nonce + i, (const void*)&r, 4); } } /******************************************************************************\ * * Plugin registry functions * \******************************************************************************/ /** @fn int soap_wsse(struct soap *soap, struct soap_plugin *p, void *arg) @brief Plugin registry function, used with soap_register_plugin. @param soap context @param[in,out] p plugin created in registry @param[in] arg passed from soap_register_plugin_arg is an optional security token handler callback @return SOAP_OK */ int soap_wsse(struct soap *soap, struct soap_plugin *p, void *arg) { static int done = 0; DBGFUN("soap_wsse"); p->id = soap_wsse_id; p->data = (void*)SOAP_MALLOC(soap, sizeof(struct soap_wsse_data)); p->fcopy = soap_wsse_copy; p->fdelete = soap_wsse_delete; if (p->data) { if (soap_wsse_init(soap, (struct soap_wsse_data*)p->data, (const void *(*)(struct soap*, int*, const char*, int*))arg)) { SOAP_FREE(soap, p->data); return SOAP_EOM; } } if (!done) { #if 0 #ifdef WIN32 /* now uses CreateMutex() for static lock initialization */ static volatile long spinlock = 0; DWORD s = 0; /* Initialize soap_wsse_session_lock with a spinlock */ while (InterlockedExchange(&spinlock, 1) == 1) { Sleep(s); s = !s; } if (!done) MUTEX_SETUP(soap_wsse_session_lock); done = 1; spinlock = 0; #else done = 1; #endif #endif #ifdef WITH_OPENSSL /* moved to stdsoap2.c MUTEX_LOCK(soap_wsse_session_lock); OpenSSL_add_all_digests(); OpenSSL_add_all_algorithms(); MUTEX_UNLOCK(soap_wsse_session_lock); */ #endif } return SOAP_OK; } /** @fn int soap_wsse_init(struct soap *soap, struct soap_wsse_data *data, const void *(*arg)(struct soap*, int*, const char*, int*)) @brief Initializes plugin data. @param soap context @param[in,out] data plugin data @param arg security token handler callback @return SOAP_OK */ static int soap_wsse_init(struct soap *soap, struct soap_wsse_data *data, const void *(*arg)(struct soap*, int *alg, const char *keyname, int *keylen)) { DBGFUN("soap_wsse_init"); data->sigid = NULL; data->encid = NULL; data->sign_alg = SOAP_SMD_NONE; data->sign_key = NULL; data->sign_keylen = 0; data->vrfy_alg = SOAP_SMD_NONE; data->vrfy_key = NULL; data->vrfy_keylen = 0; data->enco_alg = SOAP_MEC_NONE; data->enco_keyname = NULL; data->enco_key = NULL; data->enco_keylen = 0; data->deco_alg = SOAP_MEC_NONE; data->deco_key = NULL; data->deco_keylen = 0; data->digest = NULL; data->fpreparesend = NULL; data->fpreparefinalsend = NULL; data->fpreparefinalrecv = NULL; data->fheader = soap->fheader; soap->fheader = soap_wsse_header; data->mec = NULL; data->store = NULL; data->security_token_handler = arg; soap->feltbegin = soap_wsse_element_begin_in; soap->feltendin = soap_wsse_element_end_in; return SOAP_OK; } /** @fn int soap_wsse_copy(struct soap *soap, struct soap_plugin *dst, struct soap_plugin *src) @brief Copies plugin data to localize plugin data for threads. @param soap context @param[out] dst target plugin @param[in] src source plugin @return SOAP_OK */ static int soap_wsse_copy(struct soap *soap, struct soap_plugin *dst, struct soap_plugin *src) { DBGFUN("soap_wsse_copy"); *dst = *src; dst->data = (void*)SOAP_MALLOC(soap, sizeof(struct soap_wsse_data)); soap_wsse_init(soap, (struct soap_wsse_data*)dst->data, ((struct soap_wsse_data*)src->data)->security_token_handler); return SOAP_OK; } /** @fn void soap_wsse_delete(struct soap *soap, struct soap_plugin *p) @brief Deletes plugin data. @param soap context @param[in,out] p plugin @return SOAP_OK */ static void soap_wsse_delete(struct soap *soap, struct soap_plugin *p) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); DBGFUN("soap_wsse_delete"); if (data) { soap_wsse_preparecleanup(soap, data); if (data->mec) { soap_mec_cleanup(soap, data->mec); SOAP_FREE(soap, data->mec); data->mec = NULL; } if (data->store) { X509_STORE_free(data->store); data->store = NULL; } SOAP_FREE(soap, data); } } /******************************************************************************\ * * Plugin-specific functions * \******************************************************************************/ /** @fn int soap_wsse_set_wsu_id(struct soap *soap, const char *tags) @brief Sets the elements that are to be extended with wsu:Id attributes. The wsu:Id attribute values are set to the string value of the tag's QName by replacing colons with hyphens to produce an xsd:ID value. @param soap context @param[in] tags string of space-separated qualified and unqualified element tag names @return SOAP_OK */ int soap_wsse_set_wsu_id(struct soap *soap, const char *tags) { DBGFUN1("soap_wsse_set_wsu_id", "tags=%s", tags?tags:"(null)"); soap->wsuid = soap_strdup(soap, tags); return SOAP_OK; } /** @fn int soap_wsse_sign_only(struct soap *soap, const char *tags) @brief Filters only the specified wsu:Id names for signing. Can be used with soap_wsse_set_wsu_id() and if so should use the element tag names. @param soap context @param[in] tags string of space-separated qualified and unqualified tag names @return SOAP_OK */ int soap_wsse_sign_only(struct soap *soap, const char *tags) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); DBGFUN1("soap_wsse_sign_only", "tags=%s", tags?tags:"(null)"); if (data) data->sigid = soap_wsse_ids(soap, tags); return SOAP_OK; } /** @fn static char* soap_wsse_ids(struct soap *soap, const char *tags) @brief converts tag name(s) to id name(s) @param soap context @param[in] tags string of space-separated (un)qualified tag names @return string of ids */ static char* soap_wsse_ids(struct soap *soap, const char *tags) { char *s, *t; s = t = soap_strdup(soap, tags); while (s && *s) { if (*s == ':') *s = '-'; s++; } return t; } /** @fn int soap_wsse_sign(struct soap *soap, int alg, const void *key, int keylen) @brief Uses the wsse plugin to sign all wsu:Id attributed elements. @param soap context @param[in] alg is the signature algorithm, such as SOAP_SMD_HMAC_SHA1, SOAP_SMD_SIGN_DSA_SHA1, or SOAP_SMD_SIGN_RSA_SHA1 @param[in] key is the HMAC secret key or DSA/RSA private EVP_PKEY @param[in] keylen is the HMAC key length @return SOAP_OK or fault This function does not actually sign the message, but initiates the plugin's signature algorithm to sign the message upon message transfer. */ int soap_wsse_sign(struct soap *soap, int alg, const void *key, int keylen) { struct soap_wsse_digest *digest, *next; struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); DBGFUN1("soap_wsse_sign", "alg=%x", alg); if (!data) return soap_set_receiver_error(soap, "soap_wsse_sign", "Plugin not registered", SOAP_PLUGIN_ERROR); if (!alg || !key) return soap_wsse_fault(soap, wsse__InvalidSecurity, "Invalid signature algorithm or key"); /* store alg and key in plugin data */ data->sign_alg = alg; data->sign_key = key; data->sign_keylen = keylen; /* save and set the plugin's callbacks to preprocess outbound messages */ if (soap->fpreparesend != soap_wsse_preparesend) { data->fpreparesend = soap->fpreparesend; data->fpreparefinalsend = soap->fpreparefinalsend; } if (soap->fpreparefinalsend != soap_wsse_preparefinalsend) { soap->fpreparesend = soap_wsse_preparesend; soap->fpreparefinalsend = soap_wsse_preparefinalsend; } /* support HTTP compression only with HTTP chunking to allow signing XML */ if ((soap->omode & SOAP_ENC_ZLIB)) soap->omode = (soap->omode & ~SOAP_IO) | SOAP_IO_CHUNK; else if ((soap->omode & SOAP_IO) == SOAP_IO_STORE) /* no store buffering */ soap->omode = (soap->omode & ~SOAP_IO) | SOAP_IO_BUFFER; /* cleanup the digest data */ for (digest = data->digest; digest; digest = next) { next = digest->next; SOAP_FREE(soap, digest); } data->digest = NULL; return SOAP_OK; } /** @fn int soap_wsse_sign_body(struct soap *soap, int alg, const void *key, int keylen) @brief Uses the wsse plugin to sign all wsu:Id attributed elements, including the SOAP Body (by adding a wsu:Id="Body" attribute). @param soap context @param[in] alg is the signature algorithm, such as SOAP_SMD_HMAC_SHA1, SOAP_SMD_SIGN_DSA_SHA1, or SOAP_SMD_SIGN_RSA_SHA1 @param[in] key is the HMAC secret key or DSA/RSA private EVP_PKEY @param[in] keylen is the HMAC key length @return SOAP_OK This function does not actually sign the message, but initiates the plugin's signature algorithm to sign the message upon message transfer. */ int soap_wsse_sign_body(struct soap *soap, int alg, const void *key, int keylen) { DBGFUN1("soap_wsse_sign_body", "alg=%x", alg); soap_wsse_add_Security(soap); soap->omode |= SOAP_SEC_WSUID; return soap_wsse_sign(soap, alg, key, keylen); } /** @fn int soap_wsse_verify_init(struct soap *soap) @brief Uses the wsse plugin to initiate the verification of the signature and SignedInfo Reference digests. @param soap context @return SOAP_OK This function does not actually verify the message, but initiates the plugin's data to store the message in a DOM to verify the signature. The signature and digests in the DOM must be verified manually. */ int soap_wsse_verify_init(struct soap *soap) { DBGFUN("soap_wsse_verify_init"); /* deserialize inbound message to DOM */ soap->imode |= SOAP_XML_DOM; return SOAP_OK; } /** @fn int soap_wsse_verify_auto(struct soap *soap, int alg, const void *key, size_t keylen) @brief Uses the wsse plugin to initiate the automatic verification of the signature and SignedInfo Reference digests. @param soap context @param[in] alg to verify signature if signature has no secret or public key, use SOAP_SMD_NONE to omit @param[in] key is HMAC key or EVP_PKEY or NULL @param[in] keylen is HMAC key length or 0 @return SOAP_OK This function does not actually verify the message, but initiates the plugin's algorithm to store the message in a DOM to automatically verify the signature and digests. If the message does not contain a key to verify the signature, the alg, key, and keylen parameters are used. It is important that the X509 certificate used to verify the signature, which requires soap->cafile and/or soap->capath to be set. */ int soap_wsse_verify_auto(struct soap *soap, int alg, const void *key, size_t keylen) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); DBGFUN("soap_wsse_verify_auto"); if (!data) return soap_set_receiver_error(soap, "soap_wsse_verify_auto", "Plugin not registered", SOAP_PLUGIN_ERROR); data->vrfy_alg = alg; data->vrfy_key = key; data->vrfy_keylen = keylen; if (soap->fpreparefinalrecv != soap_wsse_preparefinalrecv) { data->fpreparefinalrecv = soap->fpreparefinalrecv; soap->fpreparefinalrecv = soap_wsse_preparefinalrecv; } return soap_wsse_verify_init(soap); } /** @fn int soap_wsse_verify_done(struct soap *soap) @brief Terminates the automatic verification of signatures. @param soap context @return SOAP_OK */ int soap_wsse_verify_done(struct soap *soap) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); DBGFUN("soap_wsse_verify_done"); if (!data) return soap_set_receiver_error(soap, "soap_wsse_verify_done", "Plugin not registered", SOAP_PLUGIN_ERROR); soap->imode &= ~SOAP_XML_DOM; soap->omode &= ~SOAP_SEC_WSUID; if (soap->fpreparefinalrecv == soap_wsse_preparefinalrecv) soap->fpreparefinalrecv = data->fpreparefinalrecv; return SOAP_OK; } /** @fn size_t soap_wsse_verify_element(struct soap *soap, const char *URI, const char *tag) @brief Post-checks the presence of signed element(s). Does not verify the signature of these elements, which is done with @ref soap_wsse_verify_auto. @param soap context @param URI namespace of element(s) @param tag name of element(s) @return number of matching elements signed. This function does not actually verify the signature of each element, but checks whether the elements are signed and thus their integrity is preserved. Signed element nesting rules are obeyed, so if the matching element is a descendent of a signed element, it is signed as well. Thus, the verification process follows nesting rules. Client should call this function after invocation. Services should call this function inside a service operation. This function traverses the entire DOM, so performance is determined by the size of a message. To check the SOAP Body (either using SOAP 1.1 or 1.2), @ref soap_wsse_verify_element(soap, namespaces[0].ns, "Body"). To check whether the Timestamp was signed (assuming it is present and message expiration checked with @ref soap_wsse_verify_Timestamp), use @ref soap_wsse_verify_element(soap, "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd", "Timestamp"). Note: for future releases XPath queries (or forms of these) will be considered. */ size_t soap_wsse_verify_element(struct soap *soap, const char *URI, const char *tag) { ds__SignedInfoType *signedInfo = soap_wsse_SignedInfo(soap); size_t count = 0; DBGFUN("soap_wsse_verify_element"); if (signedInfo && soap->dom) { struct soap_dom_element *elt; /* traverse the DOM */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SignedInfo and DOM found\n")); elt = soap->dom; while (elt) { /* find wsu:Id or ds:Id and check for Id in signedInfo */ int ok = 0; struct soap_dom_attribute *att; for (att = elt->atts; att; att = att->next) { if (att->name && att->nstr && (!strcmp(att->nstr, wsu_URI) || !strcmp(att->nstr, ds_URI)) && (!strcmp(att->name, "Id") || !soap_tag_cmp(att->name, "*:Id"))) { /* Id attribute found, search Id value in ds:Reference/@URI */ int i; for (i = 0; i < signedInfo->__sizeReference; i++) { ds__ReferenceType *reference = signedInfo->Reference[i]; if (reference->URI && *reference->URI == '#' && !strcmp(reference->URI + 1, att->data)) { ok = 1; break; } } if (ok) break; } } /* the current element is signed, count this and the matching nested */ if (ok) { count += soap_wsse_verify_nested(soap, elt, URI, tag); /* go to next sibling or back up */ if (elt->next) elt = elt->next; else { do elt = elt->prnt; while (elt && !elt->next); if (elt) elt = elt->next; } } else elt = soap_dom_next_element(elt); } } return count; } /** @fn size_t soap_wsse_verify_nested(struct soap *soap, struct soap_dom_element *dom, const char *URI, const char *tag) @brief Counts signed matching elements from the dom node and down @param soap context @param dom node to check and down @param URI namespace of element(s) @param tag name of element(s) @return number of matching elements. */ static size_t soap_wsse_verify_nested(struct soap *soap, struct soap_dom_element *dom, const char *URI, const char *tag) { size_t count = 0; /* search the DOM node and descendants for matching elements */ struct soap_dom_element *elt = dom; for (elt = dom; elt && elt != dom->next && elt != dom->prnt; elt = soap_dom_next_element(elt)) { if (elt->name && ((!elt->nstr && !URI) || (elt->nstr && URI && !strcmp(elt->nstr, URI)))) { const char *s = strchr(elt->name, ':'); if (s) s++; else s = elt->name; /* found element? */ if (!strcmp(s, tag)) count++; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element '%s' (\"%s\":%s) is signed\n", elt->name, elt->nstr, elt->name)); } return count; } /** @fn int soap_wsse_verify_body(struct soap *soap) @brief Post-checks the presence of signed SOAP Body. Does not verify the signature of the Body, which is done with @ref soap_wsse_verify_auto. @param soap context @return SOAP_OK (signed) or SOAP_FAULT This function does not actually verify the signature of the Body. It checks whether the Body is signed and thus its integrity is preserved. Clients should call this function after invocation. Services should call this function inside a service operation. This function traverses the entire DOM, so performance is determined by the size of a message. */ int soap_wsse_verify_body(struct soap *soap) { const char *ns = NULL; /* Are we using SOAP 1.1 or 1.2? Check first row of namespace table */ if (soap->local_namespaces) { if (soap->local_namespaces->out) ns = soap->local_namespaces->out; else if (soap->local_namespaces->ns) ns = soap->local_namespaces->ns; } /* We don't know if we're using SOAP 1.1 or 1.2, so assume it is 1.2 */ if (!ns) ns = "http://www.w3.org/2003/05/soap-envelope"; if (soap_wsse_verify_element(soap, ns, "Body") > 0) return SOAP_OK; return soap_wsse_sender_fault(soap, "Message body not signed", NULL); } /** @fn int soap_wsse_encrypt_body(struct soap *soap, int alg, const void *key, int keylen) @brief Initiates the encryption of the SOAP Body. The algorithm should be SOAP_MEC_ENC_DES_CBC or one of SOAP_MEC_ENC_AESxxx_CBC for symmetric encryption. Use soap_wsse_add_EncryptedKey for public key encryption. @param soap context @param[in] alg the encryption algorithm, should be SOAP_MEC_ENC_DES_CBC or one of SOAP_MEC_ENC_AESxxx_CBC @param[in] key a certificate with public key for encryption, a DES CBC 160-bit key or AES key @param[in] keylen the symmetric encryption key length, 20 bytes for a DES CBC 160-bit key @return SOAP_OK or error code This function initiates the encryption of the SOAP Body using an RSA public key or a symmetric shared secret key. No WS-Security EncryptedKey header will be set. Use soap_wsse_add_EncryptedKey instead for public key encryption. */ int soap_wsse_encrypt_body(struct soap *soap, int alg, const void *key, int keylen) { struct soap_wsse_data *data; DBGFUN1("soap_wsse_encrypt_body", "alg=%x", alg); data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); if (!data) return soap_set_receiver_error(soap, "soap_wsse_encrypt_body", "Plugin not registered", SOAP_PLUGIN_ERROR); data->encid = NULL; soap->omode |= SOAP_SEC_WSUID; soap_wsse_add_DataReferenceURI(soap, "#Body"); return soap_wsse_encrypt(soap, alg, key, keylen); } /** @fn int soap_wsse_encrypt_only(struct soap *soap, int alg, const void *key, int keylen, const char *tags) @brief Initiates the encryption of XML elements specified in the tags string. Should be used in combination with soap_wsse_set_wsu_id to set wsu:Id for given XML element tags. The algorithm should be SOAP_MEC_ENC_DES_CBC or one of SOAP_MEC_ENC_AESxxx_CBC for symmetric encryption. Use soap_wsse_add_EncryptedKey_encrypt_only for public key encryption. @param soap context @param[in] alg the encryption algorithm, should be SOAP_MEC_ENC_DES_CBC or one of SOAP_MEC_ENC_AESxxx_CBC @param[in] key a certificate with public key for encryption, a DES CBC 160-bit key or AES key @param[in] keylen the symmetric encryption key length, 20 bytes for a DES CBC 160-bit key @param[in] tags string of space-separated qualified and unqualified tag names @return SOAP_OK or error code This function initiates the encryption using an RSA public key or a symmetric shared secret key. No WS-Security EncryptedKey header will be set. Use soap_wsse_add_EncryptedKey instead for public key encryption. WARNING: Use @ref soap_wsse_add_EncryptedKey_encrypt_only only in combination with @ref soap_wsse_set_wsu_id with the tag names of the elements to be encrypted. OTHERWISE THE GIVEN XML ELEMENTS ARE NOT ENCRYPTED AND WILL BE SENT IN THE CLEAR. WARNING: The elements identified with @ref soap_wsse_set_wsu_id to encrypt MUST occur EXACTLY ONCE in the SOAP Body. WARNING: Encryption/decryption of elements with simple content (CDATA content) IS NOT SUPPORTED. This means that elements you want to encrypt with this function must have complex content. That is, only encrypt elements with sub elements or encrypt the entire SOAP Body. */ int soap_wsse_encrypt_only(struct soap *soap, int alg, const void *key, int keylen, const char *tags) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); DBGFUN2("soap_wsse_encrypt_only", "alg=%x", alg, "tags=%s", tags?tags:"(null)"); if (!data) return soap_set_receiver_error(soap, "soap_wsse_encrypt_only", "Plugin not registered", SOAP_PLUGIN_ERROR); data->encid = soap_strdup(soap, tags); if (tags) { char *s, *t; size_t l = strlen(tags); /* make space to insert # to each id converted from a tag name */ t = (char*)soap_malloc(soap, l + 2); if (!t) return soap->error = SOAP_EOM; *t = '#'; soap_strcpy(t + 1, l + 1, tags); s = soap_wsse_ids(soap, t); if (!s) return soap->error = SOAP_EOM; s++; do { t = strchr(s, ' '); if (t) *t = '\0'; s--; *s = '#'; if (soap_wsse_add_DataReferenceURI(soap, s)) return soap->error; s = t; while (s && *s == ' ') s++; } while (s); } return soap_wsse_encrypt(soap, alg, key, keylen); } /** @fn int soap_wsse_encrypt(struct soap *soap, int alg, const void *key, int keylen) @brief Start encryption. This function is supposed to be used internally only. The algorithm should be SOAP_MEC_ENC_DES_CBC or one of SOAP_MEC_ENC_AESxxx_CBC for symmetric encryption. Use soap_wsse_add_EncryptedKey for public key encryption. @param soap context @param[in] alg the encryption algorithm, should be SOAP_MEC_ENC_DES_CBC or one of SOAP_MEC_ENC_AESxxx_CBC @param[in] key a certificate with public key for encryption, a DES CBC 160-bit key or AES key @param[in] keylen the symmetric encryption key length, 20 bytes for a DES CBC 160-bit key @return SOAP_OK or error code */ int soap_wsse_encrypt(struct soap *soap, int alg, const void *key, int keylen) { struct soap_wsse_data *data; DBGFUN1("soap_wsse_encrypt", "alg=%x", alg); data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); if (!data) return soap_set_receiver_error(soap, "soap_wsse_encrypt", "Plugin not registered", SOAP_PLUGIN_ERROR); if (!alg || !key) return soap_wsse_fault(soap, wsse__UnsupportedAlgorithm, "An unsupported signature or encryption algorithm was used"); if (alg & SOAP_MEC_ENV) return soap_wsse_add_EncryptedKey(soap, alg, NULL, (X509*)key, NULL, NULL, NULL); /* store alg and key in plugin data */ data->enco_alg = (alg | SOAP_MEC_ENC); data->enco_key = key; data->enco_keylen = keylen; if (data->mec) soap_mec_cleanup(soap, data->mec); else data->mec = (struct soap_mec_data*)SOAP_MALLOC(soap, sizeof(struct soap_mec_data)); if (soap_mec_begin(soap, data->mec, alg, NULL, (unsigned char*)key, &keylen)) return soap->error; soap->feltbegout = soap_wsse_element_begin_out; soap->feltendout = soap_wsse_element_end_out; return SOAP_OK; } /** @fn int soap_wsse_decrypt_auto(struct soap *soap, int alg, const void *key, int keylen) @brief Start automatic decryption when needed using the specified key. This function should be used just once. The algorithm should be SOAP_MEC_ENV_DEC_DES_CBC for public key encryption/decryption and SOAP_MEC_DEC_DES_CBC for symmetric shared secret keys. @param soap context @param[in] alg the decryption algorithm, @param[in] key a persistent decryption key for the algorithm, a private RSA key or a shared symmetric secret key @param[in] keylen use 0 for public-key encryption/decryption or the shared secret decryption key length, 20 bytes for a DES CBC 160-bit key @return SOAP_OK or error code This function can be called once before multiple messages are received with WS-Security encrypted content, where only one key is used for encryption (public key or shared secret key). The default decryption key is set. If multiple decryption keys should be used, do NOT use this function but set the security_token_handler callback of the wsse plugin. See @ref wsse_9_2. Use a NULL key to remove the default decryption key. */ int soap_wsse_decrypt_auto(struct soap *soap, int alg, const void *key, int keylen) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); DBGFUN1("soap_wsse_decrypt_auto", "alg=%x", alg); if (!data) return soap_set_receiver_error(soap, "soap_wsse_decrypt_auto", "Plugin not registered", SOAP_PLUGIN_ERROR); /* store alg and key in plugin data */ data->deco_alg = (alg & ~SOAP_MEC_ENC); /* TODO add? data->enco_alg = (alg & ~(SOAP_MEC_ENC|SOAP_MEC_ENV)); */ data->deco_key = key; data->deco_keylen = keylen; return SOAP_OK; } /** @fn int soap_wsse_encrypt_begin(struct soap *soap, const char *id, int alg, const char *URI, const char *keyname, const unsigned char *key) @brief Emit XML encryption tags and start encryption of the XML element content. @param soap context @param[in] id string for the EncryptedData element Id attribute @param[in] alg algorithm used, or SOAP_MEC_NONE to ignore @param[in] URI string for the encrypted element wsu:Id attribute @param[in] keyname optional subject key name @param[in] key optional DES/AES key for encryption (to override the current key) @return SOAP_OK or error code */ int soap_wsse_encrypt_begin(struct soap *soap, const char *id, int alg, const char *URI, const char *keyname, const unsigned char *key) { int event; const char *algURI = NULL; DBGFUN("soap_wsse_encrypt_begin"); if ((soap->mode & SOAP_IO_LENGTH) && (soap->mode & SOAP_IO) == SOAP_IO_CHUNK) return SOAP_OK; /* disable digest */ event = soap->event; soap->event = 0; if (soap_set_attr(soap, "Id", id, 1) || soap_set_attr(soap, "Type", xenc_contentURI, 1) || soap_element(soap, "xenc:EncryptedData", 0, NULL) || soap_element_start_end_out(soap, NULL)) return soap->error; switch (alg & SOAP_MEC_MASK & ~SOAP_MEC_ENV) { case SOAP_MEC_ENC_DES_CBC: algURI = xenc_3desURI; break; case SOAP_MEC_ENC_AES128_CBC: algURI = xenc_aes128URI; break; case SOAP_MEC_ENC_AES192_CBC: algURI = xenc_aes192URI; break; case SOAP_MEC_ENC_AES256_CBC: algURI = xenc_aes256URI; break; case SOAP_MEC_ENC_AES512_CBC: algURI = xenc_aes512URI; break; } if (algURI) { if (soap_set_attr(soap, "Algorithm", algURI, 1) || soap_element(soap, "xenc:EncryptionMethod", 0, NULL) || soap_element_start_end_out(soap, "xenc:EncryptionMethod")) return soap->error; } if (URI) { if (soap_element(soap, "ds:KeyInfo", 0, NULL) || soap_element_start_end_out(soap, NULL) || soap_element(soap, "wsse:SecurityTokenReference", 0, NULL) || soap_element_start_end_out(soap, NULL) || soap_set_attr(soap, "URI", URI, 1) || soap_element(soap, "wsse:Reference", 0, NULL) || soap_element_start_end_out(soap, NULL) || soap_element_end_out(soap, "wsse:Reference") || soap_element_end_out(soap, "wsse:SecurityTokenReference") || soap_element_end_out(soap, "ds:KeyInfo")) return soap->error; } else if (keyname) { if (soap_element(soap, "ds:KeyInfo", 0, NULL) || soap_element_start_end_out(soap, NULL) || soap_element(soap, "ds:KeyName", 0, NULL) || soap_element_start_end_out(soap, NULL) || soap_string_out(soap, keyname, 0) || soap_element_end_out(soap, "ds:KeyName") || soap_element_end_out(soap, "ds:KeyInfo")) return soap->error; } if (soap_element(soap, "xenc:CipherData", 0, NULL) || soap_element_start_end_out(soap, NULL) || soap_element(soap, "xenc:CipherValue", 0, NULL) || soap_element_start_end_out(soap, NULL)) return soap->error; /* re-enable digest */ soap->event = event; /* adjust level, hiding xenc elements */ soap->level -= 3; return soap_mec_start(soap, key); } /** @fn int soap_wsse_encrypt_end(struct soap *soap) @brief Emit XML encryption end tags and stop encryption of the XML element content. @param soap context @return SOAP_OK or error code */ int soap_wsse_encrypt_end(struct soap *soap) { int event; DBGFUN("soap_wsse_encrypt_end"); if ((soap->mode & SOAP_IO_LENGTH) && (soap->mode & SOAP_IO) == SOAP_IO_CHUNK) return SOAP_OK; /* disable digest */ event = soap->event; soap->event = 0; /* adjust level, hiding xenc elements */ soap->level += 3; if (soap_mec_stop(soap) || soap_element_end_out(soap, "xenc:CipherValue") || soap_element_end_out(soap, "xenc:CipherData") || soap_element_end_out(soap, "xenc:EncryptedData")) return soap->error; /* re-enable digest */ soap->event = event; return SOAP_OK; } /** @fn int soap_wsse_decrypt_begin(struct soap *soap, const unsigned char *key) @brief Check for XML encryption tags and start decryption of the XML element content. If the KeyInfo element is present, the security_token_handler callback will be used to obtain a decryption key based on the key name. Otherwise the current decryption key will be used. @param soap context @param[in] key optional triple DES key for decryption (to override the current key) @return SOAP_OK or error code */ int soap_wsse_decrypt_begin(struct soap *soap, const unsigned char *key) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); struct ds__KeyInfoType info; struct xenc__EncryptionMethodType meth; int alg; int keylen; DBGFUN("soap_wsse_decrypt_begin"); if (!data) return soap_set_receiver_error(soap, "soap_wsse_decrypt_begin", "Plugin not registered", SOAP_PLUGIN_ERROR); if (soap_wsse_verify_EncryptedKey(soap)) return soap->error; alg = data->deco_alg; keylen = data->deco_keylen; if (soap_element_begin_in(soap, "xenc:EncryptedData", 0, NULL)) return soap->error; /* TODO: use Type attribute */ soap_default_xenc__EncryptionMethodType(soap, &meth); if (soap_in_xenc__EncryptionMethodType(soap, "xenc:EncryptionMethod", &meth, NULL)) { if (meth.Algorithm) { if (!strcmp(meth.Algorithm, xenc_3desURI)) alg = (alg & (~SOAP_MEC_MASK | SOAP_MEC_ENV)) | SOAP_MEC_DEC_DES_CBC; else if (!strcmp(meth.Algorithm, xenc_aes128URI)) alg = (alg & (~SOAP_MEC_MASK | SOAP_MEC_ENV)) | SOAP_MEC_DEC_AES128_CBC; else if (!strcmp(meth.Algorithm, xenc_aes192URI)) alg = (alg & (~SOAP_MEC_MASK | SOAP_MEC_ENV)) | SOAP_MEC_DEC_AES192_CBC; else if (!strcmp(meth.Algorithm, xenc_aes256URI)) alg = (alg & (~SOAP_MEC_MASK | SOAP_MEC_ENV)) | SOAP_MEC_DEC_AES256_CBC; else if (!strcmp(meth.Algorithm, xenc_aes512URI)) alg = (alg & (~SOAP_MEC_MASK | SOAP_MEC_ENV)) | SOAP_MEC_DEC_AES512_CBC; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "EncryptionMethod alg=%x\n", alg)); } } if (soap_in_ds__KeyInfoType(soap, "ds:KeyInfo", &info, NULL)) { if (data->security_token_handler && info.KeyName) { /* retrieve key from token handler callback */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Getting shared secret key '%s' through security_token_handler callback\n", info.KeyName)); key = (const unsigned char*)data->security_token_handler(soap, &alg, info.KeyName, &keylen); } } if (soap_element_begin_in(soap, "xenc:CipherData", 0, NULL) || soap_element_begin_in(soap, "xenc:CipherValue", 0, NULL)) return soap->error; /* if non-envelope decryption and default secret key is set, use it */ if (!(alg & SOAP_MEC_ENV)) { if (alg != data->deco_alg) { if (data->security_token_handler) { /* retrieve key from token handler callback */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Getting shared secret key for alg=%x through security_token_handler callback\n", alg)); data->deco_key = (const unsigned char*)data->security_token_handler(soap, &alg, NULL, &keylen); } } if (!key) key = (const unsigned char*)data->deco_key; if (key) { if (data->mec) soap_mec_cleanup(soap, data->mec); else data->mec = (struct soap_mec_data*)SOAP_MALLOC(soap, sizeof(struct soap_mec_data)); if (soap_mec_begin(soap, data->mec, alg, NULL, (unsigned char*)key, &keylen)) return soap_wsse_fault(soap, wsse__FailedCheck, NULL); } } data->deco_alg = alg; data->deco_keylen = keylen; if (soap_mec_start_alg(soap, alg, key)) return soap_wsse_fault(soap, wsse__FailedCheck, NULL); return SOAP_OK; } /** @fn int soap_wsse_decrypt_end(struct soap *soap) @brief Check for XML encryption ending tags and stop decryption of the XML element content. @param soap context @return SOAP_OK or error code */ int soap_wsse_decrypt_end(struct soap *soap) { DBGFUN("soap_wsse_decrypt_end"); if (soap_mec_stop(soap) || soap_element_end_in(soap, "xenc:CipherValue") || soap_element_end_in(soap, "xenc:CipherData") || soap_element_end_in(soap, "xenc:EncryptedData")) return soap_wsse_fault(soap, wsse__FailedCheck, NULL); return SOAP_OK; } /******************************************************************************\ * * Callbacks registered by plugin * \******************************************************************************/ /** @fn int soap_wsse_header(struct soap *soap) @brief This callback is invoked as soon as the SOAP Header is received, we need to obtain the encrypted key when the message is encrypted to start decryption. @param soap context @return SOAP_OK or error code */ static int soap_wsse_header(struct soap *soap) { /* look for encrypted elements in Body */ /* soap->feltbegin = soap_wsse_element_begin_in; Moved, now always set */ /* soap->feltendin = soap_wsse_element_end_in; Moved, now always set */ /* get the encrypted key, if present */ return soap_wsse_verify_EncryptedKey(soap); } /** @fn int soap_wsse_element_begin_in(struct soap *soap, const char *tag) @brief This callback is invoked as soon as a starting tag of an element is received by the XML parser. @param soap context @param[in] tag name of the element parsed @return SOAP_OK or error code */ static int soap_wsse_element_begin_in(struct soap *soap, const char *tag) { /* make sure we always have a header allocated */ if (soap->part == SOAP_IN_ENVELOPE) soap_header(soap); if (!soap_match_tag(soap, tag, "xenc:EncryptedData")) { struct soap_dom_element *dom = soap->dom; /* disable DOM */ soap->dom = NULL; /* parse encryption tags */ if (soap_wsse_decrypt_begin(soap, NULL)) return soap->error; /* adjust DOM tree to skip encryption elements */ soap->dom = dom->prnt; soap->dom->elts = NULL; /* adjust nesting level */ soap->level -= 3; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Decryption started, parsing decrypted XML\n")); soap->event = SOAP_SEC_DECRYPT; return soap_peek_element(soap); } return SOAP_OK; } /** @fn int soap_wsse_element_end_in(struct soap *soap, const char *tag1, const char *tag2) @brief This callback is invoked as soon as an ending tag of an element is received by the XML parser. @param soap context @param[in] tag1 name of the element parsed @param[in] tag2 name of the element that was expected by the parser's state, or NULL @return SOAP_OK or error code */ static int soap_wsse_element_end_in(struct soap *soap, const char *tag1, const char *tag2) { if (soap->event == SOAP_SEC_DECRYPT && soap->dom && soap->dom->elts && !soap_match_tag(soap, tag1, ":CipherValue")) { struct soap_dom_element *dom = soap->dom->elts; soap->event = 0; /* disable DOM */ soap->dom = NULL; /* adjust nesting level */ soap->level += 3; /* parse ending tags */ if (soap_mec_stop(soap) || soap_element_end_in(soap, ":CipherData") || soap_element_end_in(soap, ":EncryptedData")) return soap_wsse_fault(soap, wsse__FailedCheck, NULL); /* adjust DOM tree to skip encryption elements */ while (dom->next) dom = dom->next; soap->dom = dom; return soap_element_end_in(soap, tag2); } return SOAP_OK; } /** @fn int soap_wsse_element_begin_out(struct soap *soap, const char *tag) @brief This callback is invoked as soon as a starting tag of an element is to be sent by the XML generator. @param soap context @param[in] tag name of the element @return SOAP_OK or error code */ static int soap_wsse_element_begin_out(struct soap *soap, const char *tag) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); if (data && !data->encid && !strcmp(tag, "SOAP-ENV:Body")) { _wsse__Security *security = soap_wsse_Security(soap); char *URI = NULL; if (security && security->xenc__EncryptedKey && security->xenc__EncryptedKey->Id) { const char *Id = security->xenc__EncryptedKey->Id; size_t l = strlen(Id); if (!(URI = (char*)soap_malloc(soap, l + 2))) return soap->error = SOAP_EOM; *URI = '#'; soap_strcpy(URI + 1, l + 1, Id); } /* this only encrypts the Body, so stop the callback */ if (!(soap->mode & SOAP_IO_LENGTH)) soap->feltbegout = NULL; return soap_wsse_encrypt_begin(soap, "Body", data->enco_alg, URI, data->enco_keyname, NULL); } else if (data && data->encid && soap_tagsearch(data->encid, tag)) { _wsse__Security *security = soap_wsse_Security(soap); char *URI = NULL; if (security && security->xenc__EncryptedKey && security->xenc__EncryptedKey->Id) { const char *Id = security->xenc__EncryptedKey->Id; size_t l = strlen(Id); if (!(URI = (char*)soap_malloc(soap, l + 2))) return soap->error = SOAP_EOM; *URI = '#'; soap_strcpy(URI + 1, l + 1, Id); } return soap_wsse_encrypt_begin(soap, soap_wsse_ids(soap, tag), data->enco_alg, URI, data->enco_keyname, NULL); } return SOAP_OK; } /** @fn int soap_wsse_element_end_out(struct soap *soap, const char *tag) @brief This callback is invoked as soon as an ending tag of an element is to be sent by the XML generator. @param soap context @param[in] tag name of the element @return SOAP_OK or error code */ static int soap_wsse_element_end_out(struct soap *soap, const char *tag) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); if (data && !data->encid && !strcmp(tag, "SOAP-ENV:Body")) { if (soap_wsse_encrypt_end(soap)) return soap->error; /* this version only encrypts Body, so stop the callback */ if (!(soap->mode & SOAP_IO_LENGTH)) soap->feltendout = NULL; } else if (data && data->encid && soap_tagsearch(data->encid, tag)) { if (soap_wsse_encrypt_end(soap)) return soap->error; } return SOAP_OK; } /** @fn int soap_wsse_preparesend(struct soap *soap, const char *buf, size_t len) @brief Takes a piece of the XML message (tokenized) to compute digest. @param soap context @param[in] buf string (XML "tokenized") to be sent @param[in] len buf length @return SOAP_OK or fault This callback is invoked to analyze a message (usually during the HTTP content length phase). Note: nested elements with wsu:Id attributes cannot be individually signed. */ static int soap_wsse_preparesend(struct soap *soap, const char *buf, size_t len) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); DBGFUN("soap_wsse_preparesend"); if (!data) return SOAP_PLUGIN_ERROR; /* the gSOAP engine signals the start of a wsu:Id element */ if (soap->event == SOAP_SEC_BEGIN) { int alg; /* start new digest or continue? */ if (data->digest && data->digest->level) soap->event = SOAP_SEC_SIGN; else if (!data->sigid || soap_tagsearch(data->sigid, soap->id)) { soap->event = SOAP_SEC_SIGN; /* initialize smdevp engine */ struct soap_wsse_digest *digest; size_t l = strlen(soap->id); digest = (struct soap_wsse_digest*)SOAP_MALLOC(soap, sizeof(struct soap_wsse_digest) + l + 1); digest->next = data->digest; digest->level = soap->level; /* digest hash strength is same as signature strength */ alg = (SOAP_SMD_DGST | (data->sign_alg & SOAP_SMD_HASH)); soap_smd_init(soap, &digest->smd, alg, NULL, 0); memset((void*)digest->hash, 0, sizeof(digest->hash)); digest->id[0] = '#'; soap_strcpy(digest->id + 1, l + 1, soap->id); data->digest = digest; /* omit indent for indented XML (next time around, we will catch '<') */ if (*buf != '<') goto end; } } if (soap->event == SOAP_SEC_SIGN) { /* update smdevp engine */ if (data->digest && data->digest->level) { soap_smd_update(soap, &data->digest->smd, buf, len); if (soap->level < data->digest->level) { soap->event = 0; soap_smd_final(soap, &data->digest->smd, (char*)data->digest->hash, NULL); data->digest->level = 0; } } } end: if (data->fpreparesend) return data->fpreparesend(soap, buf, len); return SOAP_OK; } /** @fn int soap_wsse_preparefinalsend(struct soap *soap) @brief Collects the digests of all the wsu:Id elements and populates the SignedInfo. @param soap context @return SOAP_OK or fault This callback is invoked just before the message is sent. */ static int soap_wsse_preparefinalsend(struct soap *soap) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); DBGFUN("soap_wsse_preparefinalsend"); if (!data) return SOAP_PLUGIN_ERROR; if (data->digest) { ds__SignatureType *signature = soap_wsse_Signature(soap); struct soap_wsse_digest *digest; const char *transform; int alg, signature_added = 0; /* if message is canonicalized populate transform element accordingly */ if (soap->mode & SOAP_XML_CANONICAL) transform = c14n_URI; else transform = NULL; /* to increase the message length counter we need to emit the Signature, SignedInfo and SignatureValue elements. However, this does not work if we already populated the wsse:Signature with SignedInfo and should never happen! */ if (!signature) { signature = soap_wsse_add_Signature(soap); signature_added = 1; } else if (signature->SignedInfo) return soap_set_receiver_error(soap, "wsse error", "Cannot use soap_wsse_sign with populated SignedInfo", SOAP_SSL_ERROR); /* digest hash strength is same as signature strength */ alg = (SOAP_SMD_DGST | (data->sign_alg & SOAP_SMD_HASH)); /* add the SignedInfo/Reference elements for each digest */ for (digest = data->digest; digest; digest = digest->next) if (soap_wsse_add_SignedInfo_Reference(soap, digest->id, transform, NULL, alg, (char*)digest->hash)) return soap->error; /* then compute the signature and add it */ if (soap_wsse_add_SignatureValue(soap, data->sign_alg, data->sign_key, data->sign_keylen)) return soap->error; /* Reset the callbacks and cleanup digests */ soap_wsse_preparecleanup(soap, data); /* if non-chunked, adjust content length */ if ((soap->mode & SOAP_IO) != SOAP_IO_CHUNK) { /* the code below ensures we increase the HTTP length counter */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Counting the size of additional SOAP Header elements, mode=0x%x\n", soap->mode)); if (signature_added) { soap->level = 3; /* indent level for XML Signature */ if (soap->mode & SOAP_XML_CANONICAL && soap->mode & SOAP_XML_INDENT) { soap->ns = 0; /* need namespaces for canonicalization */ soap->count += 4; /* correction for soap->ns = 0: add \n+indent */ } soap_out_ds__SignatureType(soap, "ds:Signature", 0, signature, NULL); } else { const char *c14nexclude = soap->c14nexclude; soap->c14nexclude = "ds"; /* don't add xmlns:ds to count msg len */ soap->level = 4; /* indent level for XML SignedInfo */ if (soap->mode & SOAP_XML_CANONICAL && soap->mode & SOAP_XML_INDENT) { soap->ns = 0; /* need namespaces for canonicalization */ soap->count += 5; /* correction for soap->ns = 0: add \n+indent */ } soap_out_ds__SignedInfoType(soap, "ds:SignedInfo", 0, signature->SignedInfo, NULL); soap_outstring(soap, "ds:SignatureValue", 0, &signature->SignatureValue, NULL, 0); soap->c14nexclude = c14nexclude; } } } else /* Reset the callbacks and cleanup digests */ soap_wsse_preparecleanup(soap, data); if (soap->fpreparefinalsend) return soap->fpreparefinalsend(soap); return SOAP_OK; } /** @fn void soap_wsse_preparecleanup(struct soap *soap, struct soap_wsse_data *data) @brief Restores engine state. @param soap context @param[in,out] data plugin data */ static void soap_wsse_preparecleanup(struct soap *soap, struct soap_wsse_data *data) { struct soap_wsse_digest *digest, *next; DBGFUN("soap_wsse_preparecleanup"); data->sign_alg = SOAP_SMD_NONE; data->sign_key = NULL; data->sign_keylen = 0; if (soap->fpreparesend == soap_wsse_preparesend) soap->fpreparesend = data->fpreparesend; if (soap->fpreparefinalsend == soap_wsse_preparefinalsend) soap->fpreparefinalsend = data->fpreparefinalsend; data->fpreparesend = NULL; data->fpreparefinalsend = NULL; for (digest = data->digest; digest; digest = next) { next = digest->next; SOAP_FREE(soap, digest); } data->digest = NULL; } /** @fn int soap_wsse_preparefinalrecv(struct soap *soap) @brief Verify signature and SignedInfo digests initiated with soap_wsse_verify_auto. @param soap context @return SOAP_OK or fault @see soap_wsse_verify_auto This callback is invoked just after a message was received. */ static int soap_wsse_preparefinalrecv(struct soap *soap) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); ds__SignedInfoType *signedInfo = soap_wsse_SignedInfo(soap); soap->omode &= ~SOAP_SEC_WSUID; data->sigid = NULL; /* so we must set again before next send */ data->encid = NULL; /* so we must set again before next send */ DBGFUN("soap_wsse_preparefinalrecv"); if (!data) return SOAP_PLUGIN_ERROR; if (data->deco_alg != SOAP_MEC_NONE && data->mec) if (soap_mec_end(soap, data->mec)) return soap_wsse_fault(soap, wsse__FailedCheck, NULL); data->deco_alg = SOAP_MEC_NONE; if (signedInfo) { int err = SOAP_OK, alg, keylen = 0; EVP_PKEY *pkey = NULL; const void *key = NULL; /* determine which signature algorithm was used */ if (soap_wsse_get_SignedInfo_SignatureMethod(soap, &alg)) return soap->error; /* for HMAC-SHA1, the secret key might be stored in the KeyIdentifier */ if ((alg & SOAP_SMD_ALGO) == SOAP_SMD_HMAC) { const char *valueType = soap_wsse_get_KeyInfo_SecurityTokenReferenceKeyIdentifierValueType(soap); /* if in the KeyIdentifier, retrieve it */ if (valueType && !strcmp(valueType, ds_hmac_sha1URI)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Using HMAC key from KeyIdentifier to verify signature\n")); key = soap_wsse_get_KeyInfo_SecurityTokenReferenceKeyIdentifier(soap, &keylen); } /* next, try the plugin's security token handler */ if (!key) { if (data->security_token_handler) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Getting HMAC key through security_token_handler callback\n")); key = data->security_token_handler(soap, &alg, NULL, &keylen); } } /* still no key: try to get it from the plugin */ if (!key && alg == (data->vrfy_alg & SOAP_SMD_MASK)) { /* get the HMAC secret key from the plugin */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Using HMAC key from plugin to verify signature\n")); key = data->vrfy_key; keylen = data->vrfy_keylen; } } else { /* get the certificate from the KeyInfo reference */ X509 *cert, *cert1; cert = cert1 = soap_wsse_get_KeyInfo_SecurityTokenReferenceX509(soap); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Got cert=%p\n", cert)); /* next, try the plugin's security token handler */ if (!cert) { if (data->security_token_handler) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Getting certificate through security_token_handler callback\n")); cert = (X509*)data->security_token_handler(soap, &alg, NULL, &keylen); } } /* obtain the public key from the cert */ if (cert) { pkey = X509_get_pubkey((X509*)cert); key = (void*)pkey; } else if (alg == (data->vrfy_alg & SOAP_SMD_MASK)) { /* get the public key from the plugin */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Using public key from plugin to verify signature\n")); key = data->vrfy_key; soap->error = SOAP_OK; } if (cert1) X509_free(cert1); } /* if still no key, fault */ if (!key) err = soap_wsse_fault(soap, wsse__SecurityTokenUnavailable, NULL); /* verify SignedInfo with signature and check digests of local elements */ else if (soap_wsse_verify_SignatureValue(soap, alg, key, keylen) || soap_wsse_verify_SignedInfo(soap)) err = soap->error; if (pkey) EVP_PKEY_free(pkey); if (err) return err; if (data->fpreparefinalrecv && data->fpreparefinalrecv != soap_wsse_preparefinalrecv) return data->fpreparefinalrecv(soap); } else if (!soap->fault) return soap_wsse_fault(soap, wsse__FailedCheck, "Signature required"); return SOAP_OK; } #ifdef __cplusplus } #endif gsoap-2.8.28/gsoap/plugin/httpda.h0000644000175000017500000001207112653650150016334 0ustar ellertellert/* httpda.h gSOAP HTTP Digest Authentication plugin. Supports both Basic and Digest authentication. gSOAP XML Web services tools Copyright (C) 2000-2005, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under one of the following licenses: GPL, the gSOAP public license, or Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2005, Robert van Engelen, Genivia, Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #ifndef HTTPDA_H #define HTTPDA_H #include "stdsoap2.h" #include "md5evp.h" /* requires MD5 */ #include "threads.h" /* mutex for multi-threaded server implementations */ #ifdef __cplusplus extern "C" { #endif /** pluging identification for plugin registry */ #define HTTP_DA_ID "HTTP-DA-1.2" /** pluging identification for plugin registry */ extern const char http_da_id[]; /** HTTP digest authentication session times out after ten minutes */ #define HTTP_DA_SESSION_TIMEOUT (600) /** @struct http_da_data @brief Plugin data to override callbacks */ struct http_da_data { int (*fposthdr)(struct soap*, const char*, const char*); int (*fparse)(struct soap*); int (*fparsehdr)(struct soap*, const char*, const char*); int (*fprepareinitsend)(struct soap*); int (*fprepareinitrecv)(struct soap*); int (*fpreparesend)(struct soap*, const char*, size_t); int (*fpreparerecv)(struct soap*, const char*, size_t); int (*fpreparefinalrecv)(struct soap*); void *context; /**< ptr to MD5 context for MD5 handler */ char digest[16]; /**< MD5 entity body digest */ char *nonce; /**< client/server-side copy of server's nonce value */ char *opaque; /**< client/server-side copy of server's opaque value */ char *qop; /**< client/server-side copy of server's qop value(s) */ char *alg; /**< client-side: server's algorithm value */ unsigned long nc; /**< client-side: generated nonce count */ char *ncount; /**< server-side: client's nonce count */ char *cnonce; /**< server-side: client's nonce */ char response[16]; /**< server-side: client's response digest key */ }; /** @struct http_da_session @brief Keeps internal state of shared sessions */ struct http_da_session { struct http_da_session *next; time_t modified; char *realm; char *nonce; char *opaque; unsigned long nc; }; int http_da(struct soap *soap, struct soap_plugin *p, void *arg); int http_da_verify_post(struct soap *soap, const char *passwd); int http_da_verify_get(struct soap *soap, const char *passwd); /** @struct http_da_info @brief Used to save and restore credentials for client-side multiple invocations to the same authenticated endpoint */ struct http_da_info { char *authrealm; char *userid; char *passwd; char *nonce; char *opaque; char *qop; char *alg; }; void http_da_save(struct soap *soap, struct http_da_info *info, const char *realm, const char *userid, const char *passwd); void http_da_restore(struct soap *soap, struct http_da_info *info); void http_da_release(struct soap *soap, struct http_da_info *info); void http_da_proxy_save(struct soap *soap, struct http_da_info *info, const char *realm, const char *userid, const char *passwd); void http_da_proxy_restore(struct soap *soap, struct http_da_info *info); void http_da_proxy_release(struct soap *soap, struct http_da_info *info); #ifdef __cplusplus } #endif #endif gsoap-2.8.28/gsoap/plugin/mecevp.h0000644000175000017500000002244512653650150016335 0ustar ellertellert/* mecevp.h gSOAP interface for streaming message encryption and decryption gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under one of the following licenses: GPL, the gSOAP public license, or Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2015, Robert van Engelen, Genivia, Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #ifndef MECEVP_H #define MECEVP_H #include "stdsoap2.h" #include #include #ifdef __cplusplus extern "C" { #endif /** Expose EVP_PKEY in a portable representation */ #define SOAP_MEC_KEY_TYPE EVP_PKEY /******************************************************************************\ * * Supported algorithms * \******************************************************************************/ /** Engine off */ #define SOAP_MEC_NONE (0) /** Cipher type (triple DES CBC) */ #define SOAP_MEC_DES_CBC (0x0010) /** Cipher type (AES128 CBC) */ #define SOAP_MEC_AES128_CBC (0x0020) /** Cipher type (AES192 CBC) */ #define SOAP_MEC_AES192_CBC (0x0040) /** Cipher type (AES256 CBC) */ #define SOAP_MEC_AES256_CBC (0x0080) /** Cipher type (AES512 CBC) */ #define SOAP_MEC_AES512_CBC (0x0100) /** Enable Galois Counter Mode (GCM) */ #define SOAP_MEC_GCM (0x1000) /** Algorithm */ #define SOAP_MEC_ALGO (0x1FFF) /** Cipher type (AES128 GCM) */ #define SOAP_MEC_AES128_GCM (SOAP_MEC_AES128_CBC | SOAP_MEC_GCM) /** Cipher type (AES192 GCM) */ #define SOAP_MEC_AES192_GCM (SOAP_MEC_AES192_CBC | SOAP_MEC_GCM) /** Cipher type (AES256 GCM) */ #define SOAP_MEC_AES256_GCM (SOAP_MEC_AES256_CBC | SOAP_MEC_GCM) /** Cipher type (AES512 GCM) */ #define SOAP_MEC_AES512_GCM (SOAP_MEC_AES512_CBC | SOAP_MEC_GCM) /** Encode mode */ #define SOAP_MEC_ENC (0x2000) /** Decode mode */ #define SOAP_MEC_DEC (0x0000) /** Envelope mode */ #define SOAP_MEC_ENV (0x4000) /** Envelope encryption mode */ #define SOAP_MEC_ENV_ENC (SOAP_MEC_ENV | SOAP_MEC_ENC) /** Envelope decryption mode */ #define SOAP_MEC_ENV_DEC (SOAP_MEC_ENV | SOAP_MEC_DEC) /** Mask */ #define SOAP_MEC_MASK (0xFFFF) /** Enable store (in buffer) instead of streaming mode */ #define SOAP_MEC_STORE (0x010000) /** RSA-OAEP padding */ #define SOAP_MEC_OAEP (0x020000) /* Encode and decode types */ /** Symmetric secret key encryption */ #define SOAP_MEC_ENC_DES_CBC (SOAP_MEC_DES_CBC | SOAP_MEC_ENC) #define SOAP_MEC_ENC_AES128_CBC (SOAP_MEC_AES128_CBC | SOAP_MEC_ENC) #define SOAP_MEC_ENC_AES192_CBC (SOAP_MEC_AES192_CBC | SOAP_MEC_ENC) #define SOAP_MEC_ENC_AES256_CBC (SOAP_MEC_AES256_CBC | SOAP_MEC_ENC) #define SOAP_MEC_ENC_AES512_CBC (SOAP_MEC_AES512_CBC | SOAP_MEC_ENC) #define SOAP_MEC_ENC_AES128_GCM (SOAP_MEC_AES128_GCM | SOAP_MEC_ENC) #define SOAP_MEC_ENC_AES192_GCM (SOAP_MEC_AES192_GCM | SOAP_MEC_ENC) #define SOAP_MEC_ENC_AES256_GCM (SOAP_MEC_AES256_GCM | SOAP_MEC_ENC) #define SOAP_MEC_ENC_AES512_GCM (SOAP_MEC_AES512_GCM | SOAP_MEC_ENC) /** Symmetric secret key decryption */ #define SOAP_MEC_DEC_DES_CBC (SOAP_MEC_DES_CBC | SOAP_MEC_DEC) #define SOAP_MEC_DEC_AES128_CBC (SOAP_MEC_AES128_CBC | SOAP_MEC_DEC) #define SOAP_MEC_DEC_AES192_CBC (SOAP_MEC_AES192_CBC | SOAP_MEC_DEC) #define SOAP_MEC_DEC_AES256_CBC (SOAP_MEC_AES256_CBC | SOAP_MEC_DEC) #define SOAP_MEC_DEC_AES512_CBC (SOAP_MEC_AES512_CBC | SOAP_MEC_DEC) #define SOAP_MEC_DEC_AES128_GCM (SOAP_MEC_AES128_GCM | SOAP_MEC_DEC) #define SOAP_MEC_DEC_AES192_GCM (SOAP_MEC_AES192_GCM | SOAP_MEC_DEC) #define SOAP_MEC_DEC_AES256_GCM (SOAP_MEC_AES256_GCM | SOAP_MEC_DEC) #define SOAP_MEC_DEC_AES512_GCM (SOAP_MEC_AES512_GCM | SOAP_MEC_DEC) /* Envelope types */ /** Envelope (using RSA public key) encryption */ #define SOAP_MEC_ENV_ENC_DES_CBC (SOAP_MEC_ENC_DES_CBC | SOAP_MEC_ENV) #define SOAP_MEC_ENV_ENC_AES128_CBC (SOAP_MEC_ENC_AES128_CBC | SOAP_MEC_ENV) #define SOAP_MEC_ENV_ENC_AES192_CBC (SOAP_MEC_ENC_AES192_CBC | SOAP_MEC_ENV) #define SOAP_MEC_ENV_ENC_AES256_CBC (SOAP_MEC_ENC_AES256_CBC | SOAP_MEC_ENV) #define SOAP_MEC_ENV_ENC_AES512_CBC (SOAP_MEC_ENC_AES512_CBC | SOAP_MEC_ENV) #define SOAP_MEC_ENV_ENC_AES128_GCM (SOAP_MEC_ENC_AES128_GCM | SOAP_MEC_ENV) #define SOAP_MEC_ENV_ENC_AES192_GCM (SOAP_MEC_ENC_AES192_GCM | SOAP_MEC_ENV) #define SOAP_MEC_ENV_ENC_AES256_GCM (SOAP_MEC_ENC_AES256_GCM | SOAP_MEC_ENV) #define SOAP_MEC_ENV_ENC_AES512_GCM (SOAP_MEC_ENC_AES512_GCM | SOAP_MEC_ENV) /** Envelope (using RSA private key) decryption */ #define SOAP_MEC_ENV_DEC_DES_CBC (SOAP_MEC_DEC_DES_CBC | SOAP_MEC_ENV) #define SOAP_MEC_ENV_DEC_AES128_CBC (SOAP_MEC_DEC_AES128_CBC | SOAP_MEC_ENV) #define SOAP_MEC_ENV_DEC_AES192_CBC (SOAP_MEC_DEC_AES192_CBC | SOAP_MEC_ENV) #define SOAP_MEC_ENV_DEC_AES256_CBC (SOAP_MEC_DEC_AES256_CBC | SOAP_MEC_ENV) #define SOAP_MEC_ENV_DEC_AES512_CBC (SOAP_MEC_DEC_AES512_CBC | SOAP_MEC_ENV) #define SOAP_MEC_ENV_DEC_AES128_GCM (SOAP_MEC_DEC_AES128_GCM | SOAP_MEC_ENV) #define SOAP_MEC_ENV_DEC_AES192_GCM (SOAP_MEC_DEC_AES192_GCM | SOAP_MEC_ENV) #define SOAP_MEC_ENV_DEC_AES256_GCM (SOAP_MEC_DEC_AES256_GCM | SOAP_MEC_ENV) #define SOAP_MEC_ENV_DEC_AES512_GCM (SOAP_MEC_DEC_AES512_GCM | SOAP_MEC_ENV) /** Decryption engine states */ enum SOAP_MEC_STATE { SOAP_MEC_STATE_NONE, SOAP_MEC_STATE_INIT, SOAP_MEC_STATE_IV, SOAP_MEC_STATE_DECRYPT, SOAP_MEC_STATE_FINAL, SOAP_MEC_STATE_FLUSH }; /** @struct soap_mec_data @brief The mecevp engine context data */ struct soap_mec_data { int alg; /**< The algorithm used */ enum SOAP_MEC_STATE state; /**< Decryption state */ EVP_CIPHER_CTX *ctx; /**< EVP_CIPHER_CTX context */ const EVP_CIPHER *type; /**< type for OpenInit/DecryptInit */ char tag[16]; /**< GCM authentication tag buffer */ char taglen; /**< GCM authentication tag buffer length */ const EVP_PKEY *pkey; /**< private key for OpenInit */ unsigned char ekey[EVP_MAX_KEY_LENGTH];/**< ephemeral key */ const unsigned char *key; /**< secret key */ int keylen; /**< secret key length */ char *buf; /**< iv and stream buffer */ size_t bufidx; /**< current buffer index */ size_t buflen; /**< buffer max length */ char *rest; /**< rest-append buffer */ size_t restidx; /**< rest-append buffer index */ size_t restlen; /**< rest-append buffer max length */ int i; /**< base64 conversion */ unsigned long m; /**< base64 conversion */ soap_mode mode; int (*ffiltersend)(struct soap*, const char**, size_t*); int (*ffilterrecv)(struct soap*, char*, size_t*, size_t); }; /******************************************************************************\ * * soap_mec API functions * \******************************************************************************/ int soap_mec_begin(struct soap *soap, struct soap_mec_data *data, int alg, SOAP_MEC_KEY_TYPE *pkey, unsigned char *key, int *keylen); int soap_mec_start_alg(struct soap *soap, int alg, const unsigned char *key); int soap_mec_start(struct soap *soap, const unsigned char *key); int soap_mec_stop(struct soap *soap); int soap_mec_end(struct soap *soap, struct soap_mec_data *data); size_t soap_mec_size(int alg, SOAP_MEC_KEY_TYPE *pkey); int soap_mec_init(struct soap *soap, struct soap_mec_data *data, int alg, SOAP_MEC_KEY_TYPE *pkey, unsigned char *key, int *keylen); int soap_mec_update(struct soap *soap, struct soap_mec_data *data, const char **s, size_t *n); int soap_mec_final(struct soap *soap, struct soap_mec_data *data, const char **s, size_t *n); void soap_mec_cleanup(struct soap *soap, struct soap_mec_data *data); #ifdef __cplusplus } #endif #endif gsoap-2.8.28/gsoap/plugin/cacerts.h0000644000175000017500000000572312653650150016502 0ustar ellertellert/* cacerts.h Store CA certificates in memory for optimizations and/or stand-alone clients. gSOAP XML Web services tools Copyright (C) 2000-2009, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under one of the following licenses: GPL, the gSOAP public license, or Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2009, Robert van Engelen, Genivia Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- Usage: The soap_ssl_client_cacerts(struct soap*) function replaces soap_ssl_client_context(). The new function uses the internal CA certificate store to authenticate servers. The soap_ssl_client_cacerts() function should be called just once to set up the CA certificate chain. Compile and link cacerts.c with your project. Example: struct soap *soap = soap_new(); if (soap_ssl_client_cacerts(soap) || soap_call_ns__myMethod(soap, "https://..." ...) != SOAP_OK) { soap_print_fault(soap, stderr); exit(1); } else ... // all OK */ #ifndef WITH_OPENSSL #define WITH_OPENSSL #endif #include "stdsoap2.h" #ifdef __cplusplus extern "C" { #endif int soap_ssl_client_cacerts(struct soap *soap); #ifdef __cplusplus } #endif gsoap-2.8.28/gsoap/WS/0000755000175000017500000000000012654077575013750 5ustar ellertellertgsoap-2.8.28/gsoap/WS/typemap.dat0000644000175000017500000004363512653650160016116 0ustar ellertellert# typemap.dat # Use this file to define namespace prefix and type bindings for # the generated header files by the 'wsdl2h' tool. typemap.dat is the # default file processed by 'wsdl2h' to customize its output. You can use # wsdl2h option -t to specify an alternate file. ####### XML NAMESPACE BINDINGS # XML namespace prefix bindings can be provided to override the default # choice of the ns1, ns2, ... prefixes generated by wsdl2h. It is highly # recommended to provide namespace prefixes for your project's XML # namespaces. In this way, changes to the WSDL (or newer releases of # wsdl2h) will have a minimal impact on coding. # Bindings for namespace prefixes are of the form: # prefix = "URI" ####### XSD TYPE BINDINGS # Type bindings can be provided to bind XML schema types to C/C++ # types for your project. # Type bindings are of the form: # prefix__type = declaration | use | ptr-use # where 'prefix__type' is the C/C++-translation of the schema type, # 'declaration' introduces the type in the header file, the optional # 'use' specifies how the type is used directly, and the optional # 'ptr-use' specifies how the type is used as a pointer type. # For example, to use wide stirngs in C: # xsd__string = | wchar_t* | wchar_t* # which replaced the default char* mapping in C of xsd:string. # To use C++ std::wstring for xsd:string: # xsd__string = | std::wstring # After enabling one of these lines, all XSD strings will be remapped. # Note that the 'declaration' part is empty in these case as expected. # # When a type binding requires only the usage to be changed and the # declaration part must be kept intact, then the declaration part can be # replaced by elipsis ..., as in: # prefix__type = ... | use | ptr-use # This ensure that the wsdl2h-generated type definition is preserved, # while the use and ptr-use are remapped. # For example, this is useful to map schema polymorphic types to C types, # where we need to be able to both handle a base type and its extensions # as per schema extensibility. Say base type ns:base allows derived # extensions and we need to map this to C types as follows: # ns__base = ... | int __type_base; void* # where __type_base and void* are used to (de)serialize any data type, # including base and its derived types. ####### CLASS/STRUCT MEMBER ADDITIONS # Additional data and function members can be provided to extend a # wsdl2h-generated struct or class. # Class and struct extensions are of the form: # prefix__type = $ member-declaration # For example, to add a constructor and destructor to class myns__record: # myns__record = $ myns__record(); # myns__record = $ ~myns__record(); ####### TYPE EQUIVALENCES # Type equivalence mappings can be given to map a type to another type: # prefix__type1 == prefix__type2 # which replaces 'prefix__type1' by 'prefix__type2' in the wsdl2h output. # For example: # SOAP_ENC__boolean == xsd__boolean # which replaces 'SOAP_ENC__boolean' with the C/C++ type information that # corresponds to `xsd__boolean' which is 'bool' for C++. # Target C/C++ type names (names without prefix) can also be replaced: # float == double # which replaces all 'float' with 'double' in the wsdl2h output. Beware # that replacement types may lead to xsi:type mismatches and SOAP # encoding id-ref mismatches when parsing inbound XML messages. ####### BUILT-IN VARIABLES # The variable '$CONTAINER' defines the container to emit in the # generated declarations, which is std::vector by default. # For example: # $CONTAINER = std::list # The variable '$POINTER' defines the smart pointer to emit in the # generated declarations, replacing '*'. For example: # $POINTER = std::shared_ptr # Not all pointers in the generated output can be replaced by smart # pointers when standard pointers are used as union members and pointers # to arrays. ####### USER-DEFINED CONTENT # Any other content to be included in the generated header file can be # provided by enclosing it within brackets [ and ]. These brackets MUST # appear at the start of a new line. # For example, to add an #import directive to the wsdl2h-generated output: # [ # #import "wsa5.h" # ] #------------------------------------------------------------------------------- #gSOAP XML Web services tools #Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc. All Rights Reserved. #This software is released under one of the following two licenses: #GPL or Genivia's license for commercial use. #------------------------------------------------------------------------------- #A commercial use license is available from Genivia, Inc., contact@genivia.com #------------------------------------------------------------------------------- [ // Reminder: Modify typemap.dat to customize the header file generated by wsdl2h ] # Remember: type bindings are given on a single line (use \ to continue # with the next line). Here is an example binding for the XSD int type # that maps to an 'int': # xsd__int = | int # To use regular char* strings instead of std::string, use: # xsd__string = | char* | char* # For char* serialized with xsi:type when using soapcpp2 option -t, use: # xsd__string = typedef char *xsd__string; | xsd__string | xsd__string # The following mapping is internally applied by wsdl2h for C (not C++): # (assuming option -e is used to remove the xsd__boolean__ name prefix) # xsd__boolean = enum xsd__boolean { false_, true_ }; | enum xsd__boolean # Uncomment the line below to use __int128_t for xsd:integer instead of # mapping xsd:integer to string. # Must compile and link custom/int128.c with the project. # xsd__integer = #import "custom/int128.h" | xsd__integer # Or if the xsd:integer value range is bounded to int64_t, then: # xsd__integer = typedef int64_t xsd__integer; # Uncomment the line below to use long double for xsd:decimal instead of # mapping xsd:decimal to string. # Must compile and link custom/long_double.c with the project. # xsd__decimal = #import "custom/long_double.h" | long double # Or if your system supports __float128 then you can use: # xsd__decimal = #import "custom/float128.h" | xsd__decimal # Or if the xsd:decimal value range is bounded to double, then: # xsd__decimal = typedef double xsd__decimal; # Uncomment the line below to use struct tm instead of time_t xsd:dateTime # Must compile and link custom/struct_tm.c with the project. # xsd__dateTime = #import "custom/struct_tm.h" | xsd__dateTime # Uncomment the line below to use timeval with usec precision xsd:dateTime # Must compile and link custom/struct_timeval.c with the project. # xsd__dateTime = #import "custom/struct_timeval.h" | xsd__dateTime # Uncomment the line below to use std::chrono::system_clock::time_point # for xsd:dateTime. # Must compile and link custom/chrono_time_point.c with the project. # xsd__dateTime = #import "custom/chrono_time_point.h" | xsd__dateTime # Uncomment the line below to use struct tm for xsd:date instead of # mapping xsd:date to string. # Must compile and link custom/struct_tm_date.c with the project. # xsd__date = #import "custom/struct_tm_date.h" | xsd__date # Uncomment the line below to use LONG64 int for xsd:duration instead of # mapping xsd:duration to string (in milliseconds precision). # Must compile and link custom/duration.c with the project. xsd__duration = #import "custom/duration.h" | xsd__duration # Uncomment the line below to use C++11 std::chrono::nanoseconds for # xsd:duration instead of mapping xsd:duration to string. # Must compile and link custom/chrono_duration.cpp with the project. # xsd__duration = #import "custom/chrono_duration.h" | xsd__duration # Uncomment the line below to use ULONG64 int for xsd:time instead of # mapping xsd:time to string (also comes with high usec precision) # Must compile and link custom/time.c with the project. # xsd__time = #import "custom/long_time.h" | xsd__time # When compiling WITH_LEAN there is no hexBinary serializer. You can # remap the hexBinary type to a string as follows: # xsd__hexBinary = | char* # When wsdl2h option -d is used, xsd:any is mapped to xsd__anyType DOM # declared in dom.h and implemented in dom.c/dom.cpp. You can remap # xsd:any, for example to a pointer to a DOM node as follows: # xsd__any = | xsd__anyType* # When SOAP 1.2 Faults should carry multiple SOAP_ENV__Text elements with # xml:lang attributes, then remap SOAP_ENV__Reason as follows: # [ # struct SOAP_ENV__Reason # { # char *SOAP_ENV__Text; // at least one SOAP-ENV:Text for the gSOAP engine # $int size; # struct SOAP_ENV__Text *SOAP_ENV__Text_; // array of more SOAP-ENV:Text # }; # struct SOAP_ENV__Text # { # char *__item; # @char *xml__lang; # }; # ] # SOAP-ENV mapping (note: SOAP Body content is mapped to an XML string) SOAP_ENV__Envelope = struct SOAP_ENV__Envelope { struct SOAP_ENV__Header *SOAP_ENV__Header; _XML SOAP_ENV__Body; }; | struct SOAP_ENV__Envelope SOAP_ENV__Header = | struct SOAP_ENV__Header SOAP_ENV__Fault = | struct SOAP_ENV__Fault SOAP_ENV__Detail = | struct SOAP_ENV__Detail SOAP_ENV__Code = | struct SOAP_ENV__Code SOAP_ENV__Subcode = | struct SOAP_ENV__Subcode SOAP_ENV__Reason = | struct SOAP_ENV__Reason # Temporary URI tempuri = "http://tempuri.org/" # Empty URI empty = "" # .NET WCF DataContract Serialization Schema ser = arr = "http://schemas.microsoft.com/2003/10/Serialization/Arrays" # .NET WCF DataContract Serialization Schema remappings _ser__anyURI == xsd__anyURI _ser__boolean == xsd__boolean _ser__base64Binary == xsd__base64Binary _ser__byte == xsd__byte _ser__dateTime == xsd__dateTime _ser__decimal == xsd__decimal _ser__double == xsd__double _ser__float == xsd__float _ser__int == xsd__int _ser__long == xsd__long _ser__QName == xsd__QName _ser__short == xsd__short _ser__string == xsd__string _ser__unsignedByte == xsd__unsignedByte _ser__unsignedInt == xsd__unsignedInt _ser__unsignedLong == xsd__unsignedLong _ser__unsignedShort == xsd__unsignedShort # .NET WCF ser:anyType represents an object (see import/ser.h): _ser__anyType = | struct __ser__anyType | struct __ser__anyType # .NET WCF ser:char element and type represents a Unicode character _ser__char = | int ser__char = | int # .NET WCF ser:duration element and type maps to xsd:duration _ser__duration == xsd__duration ser__duration == xsd__duration # .NET WCF ser:guid pattern = "[\da-fA-F]{8}-[\da-fA-F]{4}-[\da-fA-F]{4}-[\da-fA-F]{4}-[\da-fA-F]{12}" _ser__guid = | char* ser__guid = | char* # .NET WCF samples mssamh = "http://Microsoft.Samples.Http" mssamhi = "http://Microsoft.Samples.Http/Imports" mssamt = "http://Microsoft.Samples.TransportSecurity" mssamti = "http://Microsoft.Samples.TransportSecurity/Imports" mssamm = "http://Microsoft.Samples.MessageSecurity" mssammi = "http://Microsoft.Samples.MessageSecurity/Imports" mssadh = "http://Microsoft.Samples.DualHttp" mssadhi = "http://Microsoft.Samples.DualHttp/Imports" # MTOM xop and xmime are imported from xop.h, xmime.h, and xmlmime.h: # Note: changed xmlmime to xmime to avoid other MTOM tools from # complaining that 'xml' is reserved. xop = xmime = xmime4 = xmime5 = # xop:Include is imported from xop.h and redefined as _xop__Include: xop__Include = #import "xop.h" | _xop__Include # xmime/xmlmime:contentType attribute is a string: _xmime__contentType = | char* | char* _xmime4__contentType = | char* | char* _xmime5__contentType = | char* | char* # exc-c14n c14n = # WS-Addressing (2003, 2004, and 2005 schemas) # See import/wsa.h, import/wsa3.h etc for definitions and code examples # The API is defined in plugin/wsaapi.c, plugin/wsaapi3.c, etc. wsa = wsa3 = wsa4 = wsa5 = # The types below should not use pointers, so we add a 3rd column: _wsa__Action = | | _wsa__Action _wsa__MessageID = | | _wsa__MessageID _wsa__To = | | _wsa__To _wsa3__Action = | | _wsa3__Action _wsa3__MessageID = | | _wsa3__MessageID _wsa3__To = | | _wsa3__To _wsa4__Action = | | _wsa4__Action _wsa4__MessageID = | | _wsa4__MessageID _wsa4__To = | | _wsa4__To _wsa5__Action = | | _wsa5__Action _wsa5__MessageID = | | _wsa5__MessageID _wsa5__To = | | _wsa5__To # WS-ReliableMessaging 1.1 and 1.0 (and obsolete WS-Reliability 2004) wsrm = wsrm5 = wsrm4 = # WS-Discovery 1.1 (2009/01) and 1.0 (2004/08 with WS-Addressing) # To upgrade WS-Discovery to WS-Addressing 2005/08, uncomment wsdd5: wsdd = #wsdd5 = wsdd10 = wsdd5__HelloType = | wsdd__HelloType wsdd5__ByeType = | wsdd__ByeType wsdd5__ProbeType = | wsdd__ProbeType wsdd5__ProbeMatchesType = | wsdd__ProbeMatchesType wsdd5__ProbeMatchType = | wsdd__ProbeMatchType wsdd5__ResolveType = | wsdd__ResolveType wsdd5__ResolveMatchesType = | wsdd__ResolveMatchesType wsdd5__ResolveMatchType = | wsdd__ResolveMatchType wsdd5__ScopesType = | wsdd__ScopesType wsdd5__SecurityType = | wsdd__SecurityType wsdd5__SigType = | wsdd__SigType wsdd5__AppSequenceType = | wsdd__AppSequenceType wsdd10__HelloType = | wsdd__HelloType wsdd10__ByeType = | wsdd__ByeType wsdd10__ProbeType = | wsdd__ProbeType wsdd10__ProbeMatchesType = | wsdd__ProbeMatchesType wsdd10__ProbeMatchType = | wsdd__ProbeMatchType wsdd10__ResolveType = | wsdd__ResolveType wsdd10__ResolveMatchesType = | wsdd__ResolveMatchesType wsdd10__ResolveMatchType = | wsdd__ResolveMatchType wsdd10__ScopesType = | wsdd__ScopesType wsdd10__SecurityType = | wsdd__SecurityType wsdd10__SigType = | wsdd__SigType wsdd10__AppSequenceType = | wsdd__AppSequenceType # WS-Policy wsp = # WS-SecureConversation 1.4 wsc = wsc2 = # WS-Trust 1.2 and 1.3 wst = wst12 = # SAML bindings saml1 = saml2 = # WS-Security wsse 2004 v1.0 and 1.1 and old wsse 2002 schema wsse11 = wsse = wsse2 = _wsse2__Security == _wsse__Security wsse2__Security == wsse__Security # wsu 2004 wsu = _wsu__Id = | char* _wsu__Created = | time_t _wsu__Expires = | time_t wsu__AttributedDateTime = | time_t wsu__AttributedURI = | char* # Bindings for ds and xenc for WS-Security protocols: ds = xenc = # xlink xlink = _xlink__actuate = | char* _xlink__arcrole = | char* _xlink__from = | char* _xlink__href = | char* _xlink__label = | char* _xlink__role = | char* _xlink__show = | char* _xlink__to = | char* _xlink__title = | char* _xlink__type = | char* # wsrp routing protocol (deprecated) wsrp = # BPEL 2.0 bpel = "http://docs.oasis-open.org/wsbpel/2.0/process/executable" bpelabs = "http://docs.oasis-open.org/wsbpel/2.0/process/abstract" plnk = "http://docs.oasis-open.org/wsbpel/2.0/plnktype" sref = "http://docs.oasis-open.org/wsbpel/2.0/serviceref" vprop = "http://docs.oasis-open.org/wsbpel/2.0/varprop" # ONVIF recommended prefixes as per 8/20/12 # http://www.onvif.org/onvif/ver10/device/wsdl/devicemgmt.wsdl # http://www.onvif.org/onvif/ver10/event/wsdl/event.wsdl # http://www.onvif.org/onvif/ver10/display.wsdl # http://www.onvif.org/onvif/ver10/deviceio.wsdl # http://www.onvif.org/onvif/ver20/imaging/wsdl/imaging.wsdl # http://www.onvif.org/onvif/ver10/media/wsdl/media.wsdl # http://www.onvif.org/onvif/ver20/ptz/wsdl/ptz.wsdl # http://www.onvif.org/onvif/ver10/receiver.wsdl # http://www.onvif.org/onvif/ver10/recording.wsdl # http://www.onvif.org/onvif/ver10/search.wsdl # http://www.onvif.org/onvif/ver10/network/wsdl/remotediscovery.wsdl # http://www.onvif.org/onvif/ver10/replay.wsdl # http://www.onvif.org/onvif/ver20/analytics/wsdl/analytics.wsdl # http://www.onvif.org/onvif/ver10/analyticsdevice.wsdl # http://www.onvif.org/onvif/ver10/schema/onvif.xsd tds = "http://www.onvif.org/ver10/device/wsdl" tev = "http://www.onvif.org/ver10/events/wsdl" tls = "http://www.onvif.org/ver10/display/wsdl" tmd = "http://www.onvif.org/ver10/deviceIO/wsdl" timg = "http://www.onvif.org/ver20/imaging/wsdl" trt = "http://www.onvif.org/ver10/media/wsdl" tptz = "http://www.onvif.org/ver20/ptz/wsdl" trv = "http://www.onvif.org/ver10/receiver/wsdl" trc = "http://www.onvif.org/ver10/recording/wsdl" tse = "http://www.onvif.org/ver10/search/wsdl" trp = "http://www.onvif.org/ver10/replay/wsdl" tan = "http://www.onvif.org/ver20/analytics/wsdl" tad = "http://www.onvif.org/ver10/analyticsdevice/wsdl" tdn = "http://www.onvif.org/ver10/network/wsdl" tt = "http://www.onvif.org/ver10/schema" # OASIS recommended prefixes wsnt = "http://docs.oasis-open.org/wsn/b-2" wsntw = "http://docs.oasis-open.org/wsn/bw-2" wsrfbf = "http://docs.oasis-open.org/wsrf/bf-2" wsrfr = "http://docs.oasis-open.org/wsrf/r-2" wsrfrw = "http://docs.oasis-open.org/wsrf/rw-2" wstop = "http://docs.oasis-open.org/wsn/t-1" # Prefix bindings for WhiteMesa interoperability testing round 2: i = "http://soapinterop.org/" s = "http://soapinterop.org/xsd" # Prefix binding for Amazon Web Services: aws = "urn:PI/DevCentral/SoapService" # Prefix binding for Mappoint Web services: mpt = "http://s.mappoint.net/mappoint-30/" gsoap-2.8.28/gsoap/WS/LEGAL.txt0000644000175000017500000000352112653650160015320 0ustar ellertellertThe specifications included in this directory are available to the public without fee or royalty. W3C notices included with XML specifications: Parts are governed by the W3C Software License [1] as described in the FAQ [2]. [1] http://www.w3.org/Consortium/Legal/copyright-software-19980720 [2] http://www.w3.org/Consortium/Legal/IPR-FAQ-20000620.html#DTD OASIS notices included with WS-* specifications: "Permission to copy, display, perform, modify and distribute the WS-* Specification, and to authorize others to do the foregoing, in any medium without fee or royalty is hereby granted for the purpose of developing and evaluating the WS-* Specification." "Permission to copy and display the WS-* (the "Specification", which includes WSDL and schema documents), in any medium without fee or royalty is hereby granted, provided that you include the following on ALL copies of the Specification that you make: 1. A link or URL to the Specification at one of the Co-Developers' websites. 2. The copyright notice as shown in the Specification." "OASIS takes no position regarding the validity or scope of any intellectual property or other rights that might be claimed to pertain to the implementation or use of the technology described in this document or the extent to which any license under such rights might or might not be available; neither does it represent that it has made any effort to identify any such rights. Information on OASIS's procedures with respect to rights in OASIS specifications can be found at the OASIS website. Copies of claims of rights made available for publication and any assurances of licenses to be made available, or the result of an attempt made to obtain a general license or permission for the use of such proprietary rights by implementors or users of this specification, can be obtained from the OASIS Executive Director." gsoap-2.8.28/gsoap/WS/WS-typemap.dat0000644000175000017500000003273512653650160016444 0ustar ellertellert# WS-typemap.dat # #------------------------------------------------------------------------------- #gSOAP XML Web services tools #Copyright (C) 2004-2008, Robert van Engelen, Genivia Inc. All Rights Reserved. #This software is released under one of the following two licenses: #GPL or Genivia's license for commercial use. #------------------------------------------------------------------------------- #A commercial use license is available from Genivia, Inc., contact@genivia.com #------------------------------------------------------------------------------- # Bindings for WS-* protocols: wsrp = "http://schemas.xmlsoap.org/rp/" wsen = "http://schemas.xmlsoap.org/ws/2004/09/enumeration" # wsp bindings wsp = "http://schemas.xmlsoap.org/ws/2004/09/policy" # wsp redeclarations, used in wst.h: #_wsp__Policy = | _XML | _XML #_wsp__PolicyReference = | _XML | _XML _wsp__AppliesTo = typedef struct _wsp__AppliesTo { wsa5__EndpointReferenceType *wsa5__EndpointReference; } _wsp__AppliesTo; | struct _wsp__AppliesTo # wsa bindings wsa = wsa3 = wsa4 = wsa5 = # wsa:AttributedQName is a QName element extensible with attributes. # We redeclare it as a QName string, assuming we don't need attributes: wsa__AttributedQName = | _QName wsa3__AttributedQName = | _QName wsa4__AttributedQName = | _QName wsa5__AttributedQNameType = | _QName # wsa:AttributedURI is an anyURI element extensible with attributes. # We redeclare it as a regular string, assuming we don't need attributes: wsa__AttributedURI = | char* /*URI*/ wsa3__AttributedURI = | char* /*URI*/ wsa4__AttributedURI = | char* /*URI*/ wsa5__AttributedURIType = | char* /*URI*/ # wsa:ReplyAfterType is an nonnegativeInteger extensible with attributes. # We redeclare it here, assuming we don't need attributes: wsa__ReplyAfterType = | unsigned int _wsa__ReplyAfter = | unsigned int wsa4__ReplyAfterType = | unsigned int _wsa4__ReplyAfter = | unsigned int wsa5__AttributedUnsignedLongType = | ULONG64 # wsa:IsReferenceParameter is a boolean, redefined here to avoid clashes: _wsa5__IsReferenceParameter = typedef enum _wsa5__IsReferenceParameter { _wsa5__IsReferenceParameter__false, _wsa5__IsReferenceParameter__true } _wsa5__IsReferenceParameter; | _wsa5__IsReferenceParameter; # wsa5 imports chan WCF ChannelInstance wsa5__ReferenceParametersType = $\ int *chan__ChannelInstance; # wsse, wsu, ds, and xenc bindings wsse = wsu = ds = xenc = wsse2 = # wsrm bindings wsrm = wsrm5 = wsrm4 = ref = wsrm__MessageNumberType = | ULONG64 wsrm__DetailType = | struct SOAP_ENV__Detail _wsrm__UnsupportedElement = | _QName | _QName _wsrm__Identifier = typedef char *_wsrm__Identifier; | char* _wsrm__Address = | char* _wsrm__Expires = #import "custom/duration.h" | xsd__duration # wsdd bindings 1.1 and 1.0 wsdd = wsdd10 = # wsc bindings wsc = wsc2 = # wst bindings wst = wst12 = # SAML bindings saml1 = saml2 = ################################################################################ # # wsc redefinitions # ################################################################################ _wsc__Identifier = | char* _wsc__Instance = | char* _wsc__Name = | char* _wsc__Label = | char* _wsc__Nonce = | char* wsc__SecurityContextTokenType = $\ char* Identifier; wsc__SecurityContextTokenType = $\ char* Instance; ################################################################################ # # wst redefinitions # ################################################################################ wst__RequestTypeEnum = wst__BinarySecretTypeEnum = wst__ComputedKeyEnum = wst__StatusCodeEnum = wst__KeyTypeEnum = wst__RequestSecurityTokenType = $\ char* TokenType; wst__RequestSecurityTokenType = $\ wst__RequestTypeOpenEnum RequestType; wst__RequestSecurityTokenType = $\ unsigned int* KeySize; wst__RequestSecurityTokenType = $\ struct wst__BinaryExchangeType* BinaryExhange; wst__RequestSecurityTokenResponseType = $\ char* TokenType; wst__RequestSecurityTokenResponseType = $\ struct wst__RequestedSecurityTokenType* RequestedSecurityToken; wst__RequestSecurityTokenResponseType = $\ struct wst__BinaryExchangeType* BinaryExhange; # With WS-Policy AppliesTo: wst__RequestSecurityTokenResponseType = $\ #import "wsp.h" wst__RequestSecurityTokenResponseType = $\ struct _wsp__AppliesTo* wsp__AppliesTo; # Without SAML 1.1: #wst__RequestedSecurityTokenType =\ #typedef struct wst__RequestedSecurityTokenType\n\ #{ _wsse__SecurityTokenReference *wsse__SecurityTokenReference;\n\ #} wst__RequestedSecurityTokenType; # With SAML 1.1: wst__RequestedSecurityTokenType =\ #import "saml1.h"\n\ typedef struct wst__RequestedSecurityTokenType\n\ { saml1__AssertionType *saml1__Assertion;\n\ _wsse__SecurityTokenReference *wsse__SecurityTokenReference;\n\ } wst__RequestedSecurityTokenType; wst__EntropyType =\ typedef struct wst__EntropyType\n\ { struct wst__BinarySecretType *BinarySecret;\n\ } wst__EntropyType; wst__DelegatToeType =\ typedef struct wst__DelegateToType\n\ { _wsse__SecurityTokenReference *wsse__SecurityTokenReference;\n\ } wst__DelegateToType; ################################################################################ # # wsu redefinitions # ################################################################################ _wsu__Id = | char* _wsu__Created = | char* _wsu__Expires = | char* wsu__AttributedDateTime = | time_t wsu__AttributedURI = | char* wsu__TimestampType = _wsu__Timestamp =\ typedef struct _wsu__Timestamp\n\ { @char* wsu__Id; // use qualified form to enable signature\n\ char* Created;\n\ char* Expires;\n\ } _wsu__Timestamp; ################################################################################ # # wsse redefinitions # ################################################################################ # wsse:AttributedString has a wsu:Id we don't need wsse__AttributedString = | char* # wsse:EncodedString has an EncodingType attribute we don't need for Nonce wsse__EncodedString = | char* # Don't use global wsse:Nonce _wsse__Nonce = # Don't use wsse:tUsage and global wsse:Usage wsse__tUsage = _wsse__Usage = # Don't use wsse:PasswordString wsse__PasswordString = # But use wsse:Password element with similar content _wsse__Password =\ typedef struct _wsse__Password\n\ { char* __item;\n\ @char* Type;\n\ } _wsse__Password; # Don't use wsse:UsernameTokenType wsse__UsernameTokenType = # But use wsse:UsernameToken element with similar content _wsse__UsernameToken =\ typedef struct _wsse__UsernameToken\n\ { char* Username;\n\ struct _wsse__Password* Password;\n\ char* Nonce;\n\ char* wsu__Created;\n\ @char* wsu__Id;\n\ } _wsse__UsernameToken; # Don't use wsse:BinarySecurityTokenType wsse__BinarySecurityTokenType = # But use wsse:BinarySecurityToken element with similar content _wsse__BinarySecurityToken =\ typedef struct _wsse__BinarySecurityToken\n\ { char* __item;\n\ @char* wsu__Id;\n\ @char* ValueType;\n\ @char* EncodingType;\n\ } _wsse__BinarySecurityToken; # Don't use wsse:SecurityTokenReferenceType wsse__SecurityTokenReferenceType = # But use wsse:SecurityTokenReference element _wsse__SecurityTokenReference =\ typedef struct _wsse__SecurityTokenReference\n\ { struct _wsse__Reference* Reference;\n\ struct _wsse__KeyIdentifier* KeyIdentifier;\n\ struct _wsse__Embedded* Embedded;\n\ struct ds__X509DataType* ds__X509Data;\n\ @char* wsu__Id;\n\ @char* wsc__Instance;\n\ @char* Usage;\n\ } _wsse__SecurityTokenReference; # Don't use wsse:ReferenceType wsse__ReferenceType = # But use wsse:Reference element _wsse__Reference =\ typedef struct _wsse__Reference\n\ { @char* URI;\n\ @char* ValueType;\n\ } _wsse__Reference; # Don't use wsse:KeyIdentifierType wsse__KeyIdentifierType = # But use wsse:KeyIdentifier _wsse__KeyIdentifier =\ typedef struct _wsse__KeyIdentifier\n\ { char* __item;\n\ @char* wsu__Id;\n\ @char* ValueType;\n\ @char* EncodingType;\n\ } _wsse__KeyIdentifier; # Don't use wsse:EmbeddedType wsse__EmbeddedType = # But use wsse:KeyIdentifier _wsse__Embedded =\ typedef struct _wsse__Embedded\n\ { /* Extensible with embedded tokens and assertions */\n\ @char* wsu__Id;\n\ @char* ValueType;\n\ } _wsse__Embedded; # Don't use wsse:TransformationParametersType wsse__TransformationParametersType = # Don't use wsse:TransformationParameters _wsse__TransformationParameters = # Don't use wsse:SecurityHeaderType wsse__SecurityHeaderType = # But use wsse:Security element with additional content _wsse__Security =\ #import "xenc.h"\n\ #import "wsc.h"\n\ typedef struct _wsse__Security\n\ { struct _wsu__Timestamp* wsu__Timestamp;\n\ struct _wsse__UsernameToken* UsernameToken;\n\ struct _wsse__BinarySecurityToken* BinarySecurityToken;\n\ struct xenc__EncryptedKeyType* xenc__EncryptedKey;\n\ struct _xenc__ReferenceList* xenc__ReferenceList;\n\ struct ds__SignatureType* ds__Signature;\n\ @char* SOAP_ENV__actor;\n\ @char* SOAP_ENV__role;\n\ } _wsse__Security; ################################################################################ # # ds redefinitions # ################################################################################ ds__CryptoBinary = | char* /*base64*/ ds__DigestValueType = | char* /*base64*/ ds__HMACOutputLengthType = | int ds__TransformType = #import "c14n.h"\n\ typedef struct ds__TransformType\n\ { _c14n__InclusiveNamespaces* c14n__InclusiveNamespaces;\n\ _XML __any;\n\ @char* Algorithm;\n\ } ds__TransformType, _ds__Transform; ds__KeyInfoType = #import "wsse.h"\n\ typedef struct ds__KeyInfoType\n\ { char* KeyName;\n\ struct ds__KeyValueType* KeyValue;\n\ struct ds__RetrievalMethodType* RetrievalMethod;\n\ struct ds__X509DataType* X509Data;\n\ struct _wsse__SecurityTokenReference* wsse__SecurityTokenReference;\n\ @char* Id;\n\ } ds__KeyInfoType, _ds__KeyInfo; ds__SignatureType =\ typedef struct ds__SignatureType\n\ { struct ds__SignedInfoType* SignedInfo;\n\ char* SignatureValue;\n\ struct ds__KeyInfoType* KeyInfo;\n\ @char* Id;\n\ } ds__SignatureType, _ds__Signature; # Add c14n:InclusiveNamespaces element to ds:CanonicalizationMethodType ds__CanonicalizationMethodType = $\ _c14n__InclusiveNamespaces* c14n__InclusiveNamespaces; # ds:SignatureValueType has an Id we don't need ds__SignatureValueType = ds__ObjectType = ds__ManifestType = ds__SignaturePropertyType = ds__SignaturePropertiesType = ds__PGPDataType = ds__SPKIDataType = ################################################################################ # # xenc redefinitions # ################################################################################ xenc__EncryptionPropertyType =\ typedef struct xenc__EncryptionPropertyType\n\ { @char* Target;\n\ @char* Id;\n\ } xenc__EncryptionPropertyType; xenc__KeySizeType = | int xenc__EncryptionMethodType = $\ struct ds__DigestMethodType* ds__DigestMethod; _xenc__EncryptedData = | xenc__EncryptedDataType _xenc__EncryptedKey = | xenc__EncryptedKeyType ################################################################################ # # Common definitions # ################################################################################ # Use regular char* strings for ID xsd__ID = | char* /*ID*/ # Use regular char* strings for NCName xsd__NCName = | char* /*NCName*/ # Use regular char* strings for anyURI xsd__anyURI = | char* /*URI*/ # Use regular char* strings for xsd:duration xsd__duration = | char* /*duration*/ # Use built-in gSOAP _QName xsd__QName = | _QName | _QName # Map xsd:integer to int xsd__integer = | char* # Map xsd:nonNegativeInteger to unsigned int xsd__nonNegativeInteger = | char* # Map xsd:base64Binary to char* and manipulate base64 data internally xsd__base64Binary = | char* /*base64*/ # Map xsd:boolean to xsd__boolean_ to avoid redefs xsd__boolean = | char* # Map xsd:IDREFS to char* xsd__IDREFS = | char* /*IDREFS*/ # Redeclare wsrp:action_t wsrp__action_USCOREt = | char* # Redeclare wsrp:to_t wsrp__to_USCOREt = | char* # Redeclare wsrp:from_t wsrp__from_USCOREt = | char* # Redeclare wsrp:id_t wsrp__id_USCOREt = | char* # Redeclare wsrp:relatesTo_t wsrp__relatesTo_USCOREt = | char* # Redeclare wsrp:faultcode_t wsrp__faultcode_USCOREt = | char* # Redeclare wsrp:faultreason_t wsrp__faultreason_USCOREt = | char* gsoap-2.8.28/gsoap/WS/README.txt0000644000175000017500000000121112653650160015423 0ustar ellertellertThis directory contains a number of WS-* specifications. It serves as a repository for generating header files stored in the 'import' directory. The 'WS-typemap.dat' contains bindings for these WS-* specs to C (and C++). This file is used by wsdl2h to customize the generated bindings. For example, the 'import/wsa.h' WS-Addressing definitions were generated by: wsdl2h -cgye -o wsa.h -t WS/WS-typemap.dat WS/WS-Addressing.xsd which generated the 'import/wsa.h' file that can be #import-ed in a gSOAP header file to enable WS-Addressing support. All importable WS-* specs in header format are located in the 'import' directory of the package. gsoap-2.8.28/gsoap/dom.c0000644000175000017500000051361212653650146014340 0ustar ellertellert/* dom.c[pp] DOM API v5 gSOAP 2.8.28 See gsoap/doc/dom/html/index.html for the new DOM API v5 documentation Also located in /gsoap/samples/dom/README.md gSOAP XML Web services tools Copyright (C) 2000-2016, Robert van Engelen, Genivia, Inc. All Rights Reserved. This part of the software is released under ONE of the following licenses: GPL, or the gSOAP public license, or Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2016, Robert van Engelen, Genivia Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ /** Compatibility requirement with gSOAP engine version */ #define GSOAP_LIB_VERSION 20828 #include "stdsoap2.h" #if GSOAP_VERSION != GSOAP_LIB_VERSION # error "GSOAP VERSION MISMATCH IN LIBRARY: PLEASE REINSTALL PACKAGE" #endif SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_xsd__anyType(struct soap*, const struct soap_dom_element *); SOAP_FMAC3 void SOAP_FMAC4 soap_traverse_xsd__anyType(struct soap*, struct soap_dom_element*, const char*, soap_walker, soap_walker); SOAP_FMAC1 void SOAP_FMAC2 soap_default_xsd__anyType(struct soap*, struct soap_dom_element *); SOAP_FMAC3 int SOAP_FMAC4 soap_put_xsd__anyType(struct soap*, const struct soap_dom_element*, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_out_xsd__anyType(struct soap*, const char*, int, const struct soap_dom_element*, const char*); SOAP_FMAC3 struct soap_dom_element * SOAP_FMAC4 soap_get_xsd__anyType(struct soap*, struct soap_dom_element*, const char*, const char*); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_in_xsd__anyType(struct soap*, const char*, struct soap_dom_element *, const char*); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_xsd__anyAttribute(struct soap*, const struct soap_dom_attribute*); SOAP_FMAC3 void SOAP_FMAC4 soap_traverse_xsd__anyAttribute(struct soap*, struct soap_dom_attribute*, const char*, soap_walker, soap_walker); SOAP_FMAC1 void SOAP_FMAC2 soap_default_xsd__anyAttribute(struct soap*, struct soap_dom_attribute*); SOAP_FMAC3 int SOAP_FMAC4 soap_put_xsd__anyAttribute(struct soap*, const struct soap_dom_attribute*, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_out_xsd__anyAttribute(struct soap*, const char*, int, const struct soap_dom_attribute*, const char*); SOAP_FMAC3 struct soap_dom_attribute * SOAP_FMAC4 soap_get_xsd__anyAttribute(struct soap*, struct soap_dom_attribute*, const char*, const char*); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_in_xsd__anyAttribute(struct soap*, const char*, struct soap_dom_attribute *, const char*); #ifdef __cplusplus extern "C" { #endif #ifndef WITH_NOIDREF SOAP_FMAC1 void SOAP_FMAC2 soap_markelement(struct soap*, const void*, int); #endif SOAP_FMAC1 int SOAP_FMAC2 soap_putelement(struct soap*, const void*, const char*, int, int); SOAP_FMAC1 void *SOAP_FMAC2 soap_getelement(struct soap*, int*); #ifdef __cplusplus } #endif /** Format string for generating DOM namespace prefixes (< 16 chars total) */ #ifndef SOAP_DOMID_FORMAT #define SOAP_DOMID_FORMAT "_%d" #endif static int out_element(struct soap*, const struct soap_dom_element*, const char*, const char*); static int out_attribute(struct soap*, const char*, const char*, const char*, int); /* namespace name (URI) lookup and store routines */ static const char *soap_push_prefix(struct soap*, const char*, size_t, const char*, int, int); static const char *soap_prefix_of(struct soap*, const char*); static const char *soap_ns_to_set(struct soap*, const char*); static const char *soap_ns_to_get(struct soap*, const char*); static const char *soap_ns_to_find(struct soap*, const char*); static struct soap_dom_element *new_element(struct soap*); static struct soap_dom_attribute *new_attribute(struct soap*); static int soap_tag_match(const char*, const char*); static int soap_patt_match(const char*, const char*); static int soap_name_match(const char*, const char*); /******************************************************************************\ * * DOM custom (de)serializers * \******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_serialize_xsd__anyType(struct soap *soap, const struct soap_dom_element *node) { if (node) { if (node->type && node->node) soap_markelement(soap, node->node, node->type); else { const struct soap_dom_element *elt; for (elt = node->elts; elt; elt = elt->next) soap_serialize_xsd__anyType(soap, elt); } } } SOAP_FMAC3 void SOAP_FMAC4 soap_traverse_xsd__anyType(struct soap *soap, struct soap_dom_element *node, const char *s, soap_walker p, soap_walker q) { (void)soap; (void)node; (void)s; (void)p; (void)q; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_serialize_xsd__anyAttribute(struct soap *soap, const struct soap_dom_attribute *node) { (void)soap; (void)node; } SOAP_FMAC1 void SOAP_FMAC2 soap_traverse_xsd__anyAttribute(struct soap *soap, struct soap_dom_attribute *node, const char *s, soap_walker p, soap_walker q) { (void)soap; (void)node; (void)s; (void)p; (void)q; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_default_xsd__anyType(struct soap *soap, struct soap_dom_element *node) { node->next = NULL; node->prnt = NULL; node->elts = NULL; node->atts = NULL; node->nstr = NULL; node->name = NULL; node->lead = NULL; node->text = NULL; node->code = NULL; node->tail = NULL; node->node = NULL; node->type = 0; node->soap = soap; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_default_xsd__anyAttribute(struct soap *soap, struct soap_dom_attribute *node) { node->next = NULL; node->nstr = NULL; node->name = NULL; node->text = NULL; node->soap = soap; } /******************************************************************************/ static int out_element(struct soap *soap, const struct soap_dom_element *node, const char *prefix, const char *name) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM node lead '%s'\n", node->lead ? node->lead : "")); if (node->lead && soap_send(soap, node->lead)) return soap->error; if (node->type && node->node) { char *s = NULL; struct Namespace *p; if (prefix && *prefix) { size_t l = strlen(prefix) + strlen(name); s = (char*)SOAP_MALLOC(soap, l + 2); if (!s) return soap->error = SOAP_EOM; (SOAP_SNPRINTF(s, l + 2, l + 1), "%s:%s", prefix, name); } for (p = soap->local_namespaces; p && p->id; p++) if (p->ns && soap_push_prefix(soap, p->id, strlen(p->id), p->ns, 1, 0) == NULL) return soap->error; (void)soap_putelement(soap, node->node, s ? s : name, 0, node->type); if (s) SOAP_FREE(soap, s); } else if (prefix && *prefix) { size_t l = strlen(prefix) + strlen(name); char *s; if (l + 1 < sizeof(soap->msgbuf)) s = soap->msgbuf; else { s = (char*)SOAP_MALLOC(soap, l + 2); if (!s) return soap->error = SOAP_EOM; } (SOAP_SNPRINTF(s, l + 2, l + 1), "%s:%s", prefix, name); (void)soap_element(soap, s, 0, NULL); if (s != soap->msgbuf) SOAP_FREE(soap, s); } else if (*name != '-') { soap_mode m = soap->mode; if ((soap->mode & SOAP_DOM_ASIS)) soap->mode &= ~SOAP_XML_INDENT; (void)soap_element(soap, name, 0, NULL); soap->mode = m; } return soap->error; } /******************************************************************************/ static int out_attribute(struct soap *soap, const char *prefix, const char *name, const char *text, int isearly) { char *s; const char *t; size_t l; int err; if (!text) text = ""; if (!prefix || !*prefix) { if ((soap->mode & SOAP_XML_CANONICAL) && !strncmp(name, "xmlns", 5) && (name[5] == ':' || name[5] == '\0')) return soap_attribute(soap, name, text); if (isearly) return soap_set_attr(soap, name, text, 2); return soap_attribute(soap, name, text); } t = strchr(name, ':'); if (t) t++; else t = name; l = strlen(prefix) + strlen(t); if (l + 1 < sizeof(soap->msgbuf)) s = soap->msgbuf; else { s = (char*)SOAP_MALLOC(soap, l + 2); if (!s) return soap->error = SOAP_EOM; } (SOAP_SNPRINTF(s, l + 2, l + 1), "%s:%s", prefix, t); if (isearly) err = soap_set_attr(soap, s, text, 2); else err = soap_attribute(soap, s, text); if (s != soap->msgbuf) SOAP_FREE(soap, s); return err; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_out_xsd__anyType(struct soap *soap, const char *tag, int id, const struct soap_dom_element *node, const char *type) { (void)id; (void)type; if (node) { const char *prefix; /* namespace prefix, if namespace is present */ if (!(soap->mode & SOAP_DOM_ASIS) && !(soap->mode & SOAP_XML_CANONICAL)) { const struct soap_dom_attribute *att; for (att = node->atts; att; att = att->next) { if (att->name && att->text && !strncmp(att->name, "xmlns:", 6)) { if (soap_push_namespace(soap, att->name + 6, att->text) == NULL) return soap->error; } else if (att->name && att->text && !strcmp(att->name, "xmlns")) { if (soap_push_namespace(soap, "", att->text) == NULL) return soap->error; } } } if (node->name) tag = node->name; else if (!tag) tag = "-"; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM node '%s' start at level=%u\n", tag, soap->level)); prefix = NULL; if (!(soap->mode & SOAP_DOM_ASIS)) { const struct soap_nlist *np; size_t n = 0; if ((prefix = strchr(tag, ':'))) { n = prefix - tag; if (n && node->nstr) prefix = soap_prefix_of(soap, node->nstr); else prefix = NULL; } np = soap_lookup_ns(soap, tag, n); if (!prefix && ((n && !np) || (node->nstr && (!np || !np->ns || strcmp(node->nstr, np->ns))))) if (!(prefix = soap_push_prefix(soap, tag, n, node->nstr, 1, 1))) return soap->error; if (n && prefix && *prefix) tag += n + 1; } if (!soap->ns) soap->ns = 2; if (out_element(soap, node, prefix, tag)) return soap->error; if (!node->type || !node->node) { struct soap_dom_attribute *att; struct soap_dom_element *elt; for (att = node->atts; att; att = att->next) { if (att->name) { if (!(soap->mode & SOAP_DOM_ASIS)) { const char *p = NULL; if (strncmp(att->name, "xml", 3)) { if (att->nstr) p = soap_prefix_of(soap, att->nstr); if (!p) { const struct soap_nlist *np; size_t n = 0; p = strchr(att->name, ':'); if (p) n = p - att->name; p = NULL; np = soap_lookup_ns(soap, att->name, n); if ((n && !np) || (att->nstr && (!np || !np->ns || strcmp(att->nstr, np->ns)))) if (!(p = soap_push_prefix(soap, att->name, n, att->nstr, 0, 0))) return soap->error; } } if (out_attribute(soap, p, att->name, att->text, 0)) return soap->error; } else if (soap_attribute(soap, att->name, att->text)) return soap->error; } } if (!node->text && !node->code && !node->tail && !node->elts && !(soap->mode & SOAP_XML_CANONICAL)) { soap_mode m = soap->mode; soap->mode &= ~SOAP_XML_INDENT; if (*tag != '-' && soap_element_start_end_out(soap, tag)) return soap->error; soap->mode = m; } else { if (*tag != '-' && soap_element_start_end_out(soap, NULL)) return soap->error; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM node text '%s'\n", node->text ? node->text : "")); if (node->text && soap_string_out(soap, node->text, 0)) return soap->error; for (elt = node->elts; elt; elt = elt->next) if (soap_out_xsd__anyType(soap, NULL, 0, elt, NULL)) return soap->error; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM node code '%s'\n", node->code ? node->code : "")); if (node->code && soap_send(soap, node->code)) return soap->error; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM node tail '%s'\n", node->tail ? node->tail : "")); if (node->tail && soap_send(soap, node->tail)) return soap->error; if (!prefix || !*prefix) { soap_mode m = soap->mode; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM node '%s' end\n", tag)); if ((soap->mode & SOAP_DOM_ASIS)) soap->mode &= ~SOAP_XML_INDENT; if (soap_element_end_out(soap, tag)) return soap->error; soap->mode = m; } else { char *s; size_t l = strlen(prefix) + strlen(tag); if (l + 1 < sizeof(soap->msgbuf)) s = soap->msgbuf; else { s = (char*)SOAP_MALLOC(soap, l + 2); if (!s) return soap->error = SOAP_EOM; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM node '%s' end\n", tag)); (SOAP_SNPRINTF(s, l + 2, l + 1), "%s:%s", prefix, tag); if (soap_element_end_out(soap, s)) return soap->error; if (s != soap->msgbuf) SOAP_FREE(soap, s); } } } } return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_out_xsd__anyAttribute(struct soap *soap, const char *tag, int id, const struct soap_dom_attribute *node, const char *type) { const struct soap_dom_attribute *att; (void)tag; (void)id; (void)type; if (!(soap->mode & SOAP_DOM_ASIS) && !(soap->mode & SOAP_XML_CANONICAL)) { for (att = node; att; att = att->next) { if (att->name && att->text && !strncmp(att->name, "xmlns:", 6)) { if (soap_push_namespace(soap, att->name + 6, att->text) == NULL) return soap->error; } else if (att->name && att->text && !strcmp(att->name, "xmlns")) { if (soap_push_namespace(soap, "", att->text) == NULL) return soap->error; } } } for (att = node; att; att = att->next) { if (att->name) { if (!(soap->mode & SOAP_DOM_ASIS)) { const char *p = NULL; if (strncmp(att->name, "xml", 3)) { if (att->nstr) p = soap_prefix_of(soap, att->nstr); if (!p) { const struct soap_nlist *np; size_t n = 0; p = strchr(att->name, ':'); if (p) n = p - att->name; p = NULL; np = soap_lookup_ns(soap, att->name, n); if ((n && !np) || (att->nstr && (!np || !np->ns || strcmp(att->nstr, np->ns)))) if (!(p = soap_push_prefix(soap, att->name, n, att->nstr, 1, 0))) return soap->error; } } if (out_attribute(soap, p, att->name, att->text, 1)) return soap->error; } else if (soap_attribute(soap, att->name, att->text)) return soap->error; } } return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_in_xsd__anyType(struct soap *soap, const char *tag, struct soap_dom_element *node, const char *type) { struct soap_attribute *tp; struct soap_dom_attribute **att; soap_mode m = soap->mode; soap->mode |= SOAP_C_UTFSTRING; (void)tag; (void)type; if (soap_peek_element(soap)) { const char *s; if (soap->error != SOAP_NO_TAG) return NULL; s = soap_strtrim(soap, soap_string_in(soap, 1, -1, -1, NULL)); if (!s || !*s) { soap->mode = m; return NULL; } soap->mode = m; if (!node) { node = new_element(soap); if (!node) { soap->error = SOAP_EOM; return NULL; } } node->text = s; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM node with cdata\n")); soap->error = SOAP_OK; soap->peeked = 0; return node; } if (!node) { node = new_element(soap); if (!node) { soap->error = SOAP_EOM; return NULL; } } else { soap_default_xsd__anyType(soap, node); } node->nstr = soap_current_namespace(soap, soap->tag); node->name = soap_strdup(soap, soap->tag); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM node element='%s' start namespace='%s'\n", node->name, node->nstr?node->nstr:"")); if ((soap->mode & SOAP_DOM_NODE) || (!(soap->mode & SOAP_DOM_TREE) && *soap->id && (!type || strcmp(type, "xsd:anyType")))) { soap->mode = m; if ((node->node = soap_getelement(soap, &node->type)) && node->type) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM node contains type %d from xsi:type or matching element tag name\n", node->type)); return node; } if (soap->error == SOAP_TAG_MISMATCH) soap->error = SOAP_OK; else return NULL; soap->mode |= SOAP_C_UTFSTRING; } att = &node->atts; for (tp = soap->attributes; tp; tp = tp->next) { if (tp->visible) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM node attribute='%s'\n", tp->name)); *att = new_attribute(soap); if (!*att) { soap->error = SOAP_EOM; return NULL; } (*att)->next = NULL; (*att)->nstr = soap_current_namespace(soap, tp->name); (*att)->name = soap_strdup(soap, tp->name); if (tp->visible == 2) (*att)->text = soap_strdup(soap, tp->value); else (*att)->text = NULL; (*att)->soap = soap; att = &(*att)->next; tp->visible = 0; } } if (soap_element_begin_in(soap, NULL, 1, NULL)) return NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM node '%s' pulled (level=%u)\n", node->name, soap->level)); if (soap->body) { struct soap_dom_element **elt; if (soap_peek_element(soap)) { if (soap->error != SOAP_NO_TAG) return NULL; if (!(node->text = soap_strtrim(soap, soap_string_in(soap, 1, -1, -1, NULL)))) return NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM node '%s' has cdata\n", node->name)); soap->peeked = 0; } elt = &node->elts; soap->mode = m; for (;;) { if (!(*elt = soap_in_xsd__anyType(soap, NULL, NULL, NULL))) { if (soap->error && soap->error != SOAP_NO_TAG) return NULL; break; } (*elt)->prnt = node; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM node '%s' has subelement '%s'\n", node->name, (*elt)->name)); if (node->text) { if (*node->text) { struct soap_dom_element *elts = new_element(soap); if (!elts) { soap->error = SOAP_EOM; return NULL; } elts->next = *elt; elts->prnt = node; elts->text = node->text; node->elts = elts; elt = &elts->next; } node->text = NULL; } elt = &(*elt)->next; } if (!node->text && !node->elts) node->tail = ""; /* has body so tail is non-NULL for non-empty element tag */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM node '%s' end (level=%u)\n", node->name, soap->level)); if (soap_element_end_in(soap, NULL)) return NULL; if (strcmp(soap->tag, node->name)) { soap->error = SOAP_SYNTAX_ERROR; return NULL; } } soap->mode = m; return node; } /******************************************************************************/ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_in_xsd__anyAttribute(struct soap *soap, const char *tag, struct soap_dom_attribute *node, const char *type) { struct soap_attribute *tp; struct soap_dom_attribute *tmp = node; struct soap_dom_attribute *att = node; (void)tag; (void)type; for (tp = soap->attributes; tp; tp = tp->next) { if (tp->visible) { if (!att) { att = new_attribute(soap); if (tmp) tmp->next = att; else node = att; tmp = att; } if (!att) { soap->error = SOAP_EOM; return NULL; } att->next = NULL; att->nstr = soap_current_namespace(soap, tp->name); att->name = soap_strdup(soap, tp->name); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM node attribute='%s' namespace='%s'\n", att->name, att->nstr ? att->nstr : "(null)")); if (tp->visible == 2) att->text = soap_strdup(soap, tp->value); else att->text = NULL; att->soap = soap; att = NULL; } } return node; } SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_dup_xsd__anyType(struct soap *soap, struct soap_dom_element *d, const struct soap_dom_element *a) { struct soap_dom_element *elt = NULL; if (!a) return NULL; if (!d && !(d = new_element(soap))) return NULL; d->next = NULL; d->nstr = soap_strdup(soap, a->nstr); d->name = soap_strdup(soap, a->name); d->lead = soap_strdup(soap, a->lead); d->text = soap_strdup(soap, a->text); d->code = soap_strdup(soap, a->code); d->tail = soap_strdup(soap, a->tail); d->node = NULL; d->type = 0; d->atts = soap_dup_xsd__anyAttribute(soap, NULL, a->atts); for (a = a->elts; a; a = a->next) { if (elt) elt = elt->next = soap_dup_xsd__anyType(soap, NULL, a); else elt = d->elts = soap_dup_xsd__anyType(soap, NULL, a); elt->prnt = d; } return d; } SOAP_FMAC1 void SOAP_FMAC2 soap_del_xsd__anyType(const struct soap_dom_element *a) { while (a) { if (a->nstr) SOAP_FREE(NULL, a->nstr); if (a->name) SOAP_FREE(NULL, a->name); if (a->lead) SOAP_FREE(NULL, a->lead); if (a->text) SOAP_FREE(NULL, a->text); if (a->code) SOAP_FREE(NULL, a->code); if (a->tail) SOAP_FREE(NULL, a->tail); soap_del_xsd__anyAttribute(a->atts); soap_del_xsd__anyType(a->elts); a = a->next; } } SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_dup_xsd__anyAttribute(struct soap *soap, struct soap_dom_attribute *d, const struct soap_dom_attribute *a) { struct soap_dom_attribute *att; if (!a) return NULL; if (!d && !(d = new_attribute(soap))) return NULL; att = d; while (a) { att->nstr = soap_strdup(soap, a->nstr); att->name = soap_strdup(soap, a->name); att->text = soap_strdup(soap, a->text); a = a->next; if (a) { if (!(att->next = new_attribute(soap))) break; att = att->next; } } return d; } SOAP_FMAC1 void SOAP_FMAC2 soap_del_xsd__anyAttribute(const struct soap_dom_attribute *a) { while (a) { if (a->nstr) SOAP_FREE(NULL, a->nstr); if (a->name) SOAP_FREE(NULL, a->name); if (a->text) SOAP_FREE(NULL, a->text); a = a->next; } } /******************************************************************************\ * * Namespace prefix lookup/store * \******************************************************************************/ static const char * soap_push_prefix(struct soap *soap, const char *id, size_t n, const char *ns, int isearly, int iselement) { struct Namespace *p, *ln = soap->local_namespaces; struct soap_nlist *np; if (!n) id = NULL; if (!ns) { for (p = ln; p && p->id; p++) if (!strncmp(p->id, id, n) && !p->id[n]) break; if (p && p->id) { id = p->id; ns = p->out; if (!ns) ns = p->ns; } if (!ns) return ""; } else if (!id) { if (iselement) { id = ""; /* gen xmlsn="ns" for elements with nstr but no prefix */ } else { for (p = ln; p && p->id; p++) if (p->ns && !strcmp(p->ns, ns)) break; if (p && p->id) id = p->id; else { int i = 0; for (np = soap->nlist; np; np = np->next) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM find binding %s = '%s' level = %d index = %d\n", np->id, np->ns, np->level, np->index)); i++; } (SOAP_SNPRINTF(soap->tag, sizeof(soap->tag), sizeof(SOAP_DOMID_FORMAT) + 20), SOAP_DOMID_FORMAT, i); id = soap->tag; } } } else { for (np = soap->nlist; np; np = np->next) { if (!strncmp(np->id, id, n) && !np->id[n]) { if (np->ns) { if (!strcmp(np->ns, ns)) return ""; /* xmlns:id="ns" already in scope */ } else { if (!strcmp(ln[np->index].ns, ns) || (ln[np->index].out && !strcmp(ln[np->index].out, ns))) return ""; /* xmlns:id="ns" already in scope */ } break; } } soap_strncpy(soap->tag, sizeof(soap->tag), id, n); id = soap->tag; soap->local_namespaces = NULL; /* do not permit a replacement id, when ns is in table */ } /* fix advance generation of xmlns, when element (at level) is not output yet */ if (isearly) soap->level++; np = soap_push_namespace(soap, id, ns); soap->local_namespaces = ln; if (isearly) soap->level--; if (!np) return NULL; if (!np->ns) { np->ns = ln[np->index].out; if (!np->ns) np->ns = ln[np->index].ns; } np->index = 0; /* for C14N visibly utilized mark */ /* gen xmlns:id="ns" */ if (*np->id) { (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), strlen(np->id) + 6), "xmlns:%s", np->id); if (out_attribute(soap, NULL, soap->msgbuf, ns, isearly)) return NULL; } else { if (out_attribute(soap, NULL, "xmlns", ns, isearly)) return NULL; } return np->id; } /******************************************************************************/ static const char * soap_prefix_of(struct soap *soap, const char *ns) { struct soap_nlist *np; for (np = soap->nlist; np; np = np->next) if (np->ns && !strcmp(np->ns, ns)) return np->id; return NULL; } /******************************************************************************/ static const char * soap_ns_to_set(struct soap *soap, const char *tag) { const char *s; size_t n; const struct Namespace *p; if (!tag) return NULL; s = strchr(tag, ':'); if (!s) return NULL; n = s - tag; for (p = soap->namespaces; p && p->id; p++) if (!strncmp(p->id, tag, n) && !p->id[n]) return p->ns; return NULL; } /******************************************************************************/ static const char * soap_ns_to_get(struct soap *soap, const char *tag) { const char *s; size_t n; const struct Namespace *p; if (!tag) return ""; s = strchr(tag, ':'); if (!s) return ""; n = s - tag; for (p = soap->namespaces; p && p->id; p++) if (!strncmp(p->id, tag, n) && !p->id[n]) return p->out ? p->out : p->ns; return ""; } /******************************************************************************/ static const char * soap_ns_to_find(struct soap *soap, const char *tag) { const char *s; size_t n; const struct Namespace *p; if (!tag || (tag[0] == '*' && !tag[1])) return NULL; s = strchr(tag, ':'); if (!s) return ""; if (*tag == '*') return NULL; n = s - tag; for (p = soap->namespaces; p && p->id; p++) if (!strncmp(p->id, tag, n) && !p->id[n]) return p->out ? p->out : p->ns; return NULL; } /******************************************************************************\ * * Tag matching * \******************************************************************************/ static int soap_tag_match(const char *name, const char *tag) { const char *s; if (!name) return !*tag; s = strchr(name, ':'); if (s) name = s + 1; s = strchr(tag, ':'); if (s) tag = s + 1; return !strcmp(name, tag); } /******************************************************************************/ static int soap_patt_match(const char *name, const char *patt) { const char *s; if (!name) return !*patt; s = strchr(name, ':'); if (s) name = s + 1; s = strchr(patt, ':'); if (s) patt = s + 1; return soap_name_match(name, patt); } /******************************************************************************/ static int soap_name_match(const char *name, const char *patt) { for (;;) { int c1 = *name; int c2 = *patt; if (!c1) break; if (c1 != c2) { if (c2 != '*') return 0; c2 = *++patt; if (!c2) return 1; for (;;) { c1 = *name; if (!c1) break; if (c1 == c2 && soap_name_match(name + 1, patt + 1)) return 1; name++; } break; } name++; patt++; } if (*patt == '*' && !patt[1]) return 1; return !*patt; } /******************************************************************************\ * * Memory * \******************************************************************************/ static struct soap_dom_element *new_element(struct soap *soap) { struct soap_dom_element *elt; elt = (struct soap_dom_element*)soap_malloc(soap, sizeof(struct soap_dom_element)); #ifdef __cplusplus SOAP_PLACEMENT_NEW(elt, soap_dom_element); #endif if (elt) soap_default_xsd__anyType(soap, elt); return elt; } /******************************************************************************/ static struct soap_dom_attribute *new_attribute(struct soap *soap) { struct soap_dom_attribute *att; att = (struct soap_dom_attribute*)soap_malloc(soap, sizeof(struct soap_dom_attribute)); #ifdef __cplusplus SOAP_PLACEMENT_NEW(att, soap_dom_attribute); #endif if (att) soap_default_xsd__anyAttribute(soap, att); return att; } /******************************************************************************\ * * soap_dom_element construction * \******************************************************************************/ /** @brief Returns pointer to new xsd__anyType DOM element node. @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name string or NULL (unnamed node) @return pointer to xsd__anyType DOM element node */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_new(struct soap *soap, const char *ns, const char *tag) { return soap_elt_set(new_element(soap), ns, tag); } /******************************************************************************/ /** @brief Returns pointer to new xsd__anyType DOM element node. @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name wide string or NULL (unnamed node) @return pointer to xsd__anyType DOM element node */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_new_w(struct soap *soap, const char *ns, const wchar_t *tag) { return soap_elt_set_w(new_element(soap), ns, tag); } /******************************************************************************/ /** @brief Set xsd__anyType DOM element namespace URI and tag name @param elt pointer to xsd__anyType DOM element to set @param ns namespace URI string or NULL @param tag (un)qualified tag name string or NULL (unnamed node) @return elt */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_set(struct soap_dom_element *elt, const char *ns, const char *tag) { if (elt) { if (tag && !*tag) tag = NULL; elt->name = soap_strdup(elt->soap, tag); if (!ns) elt->nstr = soap_ns_to_set(elt->soap, tag); else elt->nstr = soap_strdup(elt->soap, ns); } return elt; } /******************************************************************************/ /** @brief Set xsd__anyType DOM element namespace URI and tag name @param elt pointer to xsd__anyType DOM element to set @param ns namespace URI string or NULL @param tag (un)qualified tag name wide string or NULL (unnamed node) @return elt */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_set_w(struct soap_dom_element *elt, const char *ns, const wchar_t *tag) { if (elt) { if (tag && !*tag) tag = NULL; elt->name = soap_wchar2s(elt->soap, tag); if (!ns) elt->nstr = soap_ns_to_set(elt->soap, elt->name); else elt->nstr = soap_strdup(elt->soap, ns); } return elt; } /******************************************************************************/ /** @brief Populate xsd__anyType DOM element node with an attribute node @param elt pointer to xsd__anyType DOM element to populate @param ns namespace URI string or NULL of attribute @param tag (un)qualified tag name string of attribute @return pointer to xsd__anyAttribute attribute node (new attribute node if none matches) */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att(struct soap_dom_element *elt, const char *ns, const char *tag) { if (!elt) return NULL; if (elt->atts) return soap_att_add(elt->atts, ns, tag); return elt->atts = soap_att_new(elt->soap, ns, tag); } /******************************************************************************/ /** @brief Populate xsd__anyType DOM element node with an attribute node @param elt pointer to xsd__anyType DOM element to populate @param ns namespace URI string or NULL of attribute @param tag (un)qualified tag name wide string of attribute @return pointer to xsd__anyAttribute attribute node (new attribute node if none matches) */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_w(struct soap_dom_element *elt, const char *ns, const wchar_t *tag) { if (!elt) return NULL; if (elt->atts) return soap_att_add_w(elt->atts, ns, tag); return elt->atts = soap_att_new_w(elt->soap, ns, tag); } /******************************************************************************/ /** @brief Populate xsd__anyType DOM element node with a child element node @param elt pointer to xsd__anyType DOM element to populate @param ns namespace URI string or NULL of child element @param tag (un)qualified tag name string of child element or NULL (unnamed node) @return pointer to child element node (new child element node if none matches) */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt(struct soap_dom_element *elt, const char *ns, const char *tag) { struct soap_dom_element *node = NULL; if (elt) { struct soap_dom_element *last = NULL; const char *ns1 = ns; if (!ns1) ns1 = soap_ns_to_set(elt->soap, tag); for (node = elt->elts; node; node = node->next) { if (tag && soap_tag_match(node->name, tag) && (ns1 == node->nstr || (ns1 && node->nstr && !strcmp(node->nstr, ns1)))) return node; if (!node->next) last = node; } node = soap_elt_new(elt->soap, ns, tag); if (node) node->prnt = elt; if (last) last->next = node; else elt->elts = node; } return node; } /******************************************************************************/ /** @brief Populate xsd__anyType DOM element node with a child element node @param elt pointer to xsd__anyType DOM element to populate @param ns namespace URI string or NULL of child element @param tag (un)qualified tag name wide string of child element or NULL (unnamed node) @return pointer to xsd__anyType child element node (new child element node if none matches) */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_w(struct soap_dom_element *elt, const char *ns, const wchar_t *tag) { struct soap_dom_element *node = NULL; if (elt) { const char *name = soap_wchar2s(elt->soap, tag); struct soap_dom_element *last = NULL; const char *ns1 = ns; if (!ns1) ns1 = soap_ns_to_set(elt->soap, name); for (node = elt->elts; node; node = node->next) { if (name && soap_tag_match(node->name, name) && (ns1 == node->nstr || (ns1 && node->nstr && !strcmp(node->nstr, ns1)))) return node; if (!node->next) last = node; } node = soap_elt_new(elt->soap, ns, name); if (node) node->prnt = elt; if (last) last->next = node; else elt->elts = node; } return node; } /******************************************************************************/ /** @brief Populate xsd__anyType DOM element node with an N-th child element node @param elt pointer to xsd__anyType DOM element to populate @param ns namespace URI string or NULL of child element @param tag (un)qualified tag name string of child element or NULL (unnamed node) @param n child element position, counting from one (1) XPath style @return pointer to xsd__anyType child element node (new child element node if none matches) */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_nth_elt(struct soap_dom_element *elt, const char *ns, const char *tag, size_t n) { return soap_nth(soap_elt(elt, ns, tag), n); } /******************************************************************************/ /** @brief Populate xsd__anyType DOM element node with an N-th child element node @param elt pointer to xsd__anyType DOM element to populate @param ns namespace URI string or NULL of child element @param tag (un)qualified tag name wide string of child element or NULL (unnamed node) @param n child element position, counting from one (1) XPath style @return pointer to xsd__anyType child element node (new child element node if none matches) */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_nth_elt_w(struct soap_dom_element *elt, const char *ns, const wchar_t *tag, size_t n) { return soap_nth(soap_elt_w(elt, ns, tag), n); } /******************************************************************************/ /** @brief Add a N-th child element with the same namespace and tag name as a xsd__anyType DOM child element node at position one (1) in a sibling list @param elt pointer to xsd__anyType DOM child element at position one (1) @param n additional child element position requested, counting from one (1) XPath style @return pointer to xsd__anyType child element node (new child element node if none exists at position n) */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_nth(struct soap_dom_element *elt, size_t n) { struct soap_dom_element *node; struct soap_dom_element *prev = elt; if (!elt || n <= 1) return elt; for (node = elt->next; node; node = node->next) { if ((elt->name == node->name || (elt->name && soap_tag_match(node->name, elt->name))) && (elt->nstr == node->nstr || (elt->nstr && node->nstr && !strcmp(node->nstr, elt->nstr)))) { if (--n <= 1) return node; } prev = node; } while (--n >= 1) { node = new_element(elt->soap); node->next = prev->next; node->prnt = elt->prnt; node->nstr = elt->nstr; node->name = elt->name; prev->next = node; prev = node; } return prev; } /******************************************************************************/ /** @brief Add an attribute node to an xsd__anyType DOM element node @param elt pointer to xsd__anyType DOM element to populate @param node pointer to xsd__anyAttribute attribute node to copy and add to DOM element elt @return elt */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_add_att(struct soap_dom_element *elt, const struct soap_dom_attribute *node) { if (elt && node) { struct soap_dom_attribute *last; struct soap_dom_attribute **next = &elt->atts; for (last = elt->atts; last; last = last->next) if (!last->next) next = &last->next; *next = new_attribute(elt->soap); if (*next) soap_att_copy(*next, node); } return elt; } /******************************************************************************/ /** @brief Add a child element node to an xsd__anyType DOM element node @param elt pointer to xsd__anyType DOM element to populate @param node pointer to element node to copy and add as a child to DOM element elt @return elt */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_add_elt(struct soap_dom_element *elt, const struct soap_dom_element *node) { if (elt && node) { struct soap_dom_element *last; struct soap_dom_element **next = &elt->elts; for (last = elt->elts; last; last = last->next) if (!last->next) next = &last->next; *next = new_element(elt->soap); if (*next) { soap_elt_copy(*next, node); (*next)->prnt = elt; } } return elt; } /******************************************************************************/ /** @brief Copy list of attribute nodes to an xsd__anyType DOM element node @param elt pointer to xsd__anyType DOM element to populate @param atts pointer to list of xsd__anyAttribute attribute nodes to copy and add to DOM element elt @return elt */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_add_atts(struct soap_dom_element *elt, const struct soap_dom_attribute *atts) { if (elt && atts) { struct soap_dom_attribute *last; struct soap_dom_attribute **next = &elt->atts; for (last = elt->atts; last; last = last->next) if (!last->next) next = &last->next; for (; atts; atts = atts->next) { *next = new_attribute(elt->soap); if (*next) { soap_att_copy(*next, atts); next = &(*next)->next; } } } return elt; } /******************************************************************************/ /** @brief Copy list of element nodes to an xsd__anyType DOM element node as children @param elt pointer to xsd__anyType DOM element to populate @param elts pointer to list of xsd__anyType DOM element nodes to copy and add as children to DOM element elt @return elt */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_add_elts(struct soap_dom_element *elt, const struct soap_dom_element *elts) { if (elt && elts) { struct soap_dom_element *last; struct soap_dom_element **next = &elt->elts; for (last = elt->elts; last; last = last->next) if (!last->next) next = &last->next; for (; elts; elts = elts->next) { *next = new_element(elt->soap); if (*next) { soap_elt_copy(*next, elts); (*next)->prnt = elt; next = &(*next)->next; } } } return elt; } /******************************************************************************\ * * soap_dom_element assignment * \******************************************************************************/ /** @brief Set text of an xsd__anyType DOM element node to Boolean "false" or "true" @param elt pointer to xsd__anyType DOM element node to set @param b Boolean value (zero = false, nonzero = true) @return elt */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_bool(struct soap_dom_element *elt, LONG64 b) { if (elt) elt->text = b ? "true" : "false"; return elt; } /******************************************************************************/ /** @brief Set text of an xsd__anyType DOM element node to a 64 bit integer value @param elt pointer to xsd__anyType DOM element node to set @param n 64 bit integer value @return elt */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_int(struct soap_dom_element *elt, LONG64 n) { return soap_elt_text(elt, soap_LONG642s(elt->soap, n)); } /******************************************************************************/ /** @brief Set text of an xsd__anyType DOM element node to a double float value @param elt pointer to xsd__anyType DOM element node to set @param x double float value (NaN and +/-INF are also supported) @return elt */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_double(struct soap_dom_element *elt, double x) { return soap_elt_text(elt, soap_double2s(elt->soap, x)); } /******************************************************************************/ /** @brief Set text of an xsd__anyType DOM element node @param elt pointer to xsd__anyType DOM element node to set @param text string or NULL @return elt */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_text(struct soap_dom_element *elt, const char *text) { if (elt) elt->text = soap_strdup(elt->soap, text); return elt; } /******************************************************************************/ /** @brief Set text of an xsd__anyType DOM element node @param elt pointer to xsd__anyType DOM element node to set @param text wide string or NULL @return elt */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_text_w(struct soap_dom_element *elt, const wchar_t *text) { if (elt) elt->text = soap_wchar2s(elt->soap, text); return elt; } /******************************************************************************/ /** @brief Set an xsd__anyType DOM element node to point to a serializable object @param elt pointer to xsd__anyType DOM element node to set @param node pointer to serializable object @param type SOAP_TYPE_T type of the serializable object of type T @return elt */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_node(struct soap_dom_element *elt, const void *node, int type) { if (elt) { elt->node = node; elt->type = type; } return elt; } /******************************************************************************/ /** @brief Copy an xsd__anyType DOM element node to another (not a deep copy) @param elt pointer to xsd__anyType DOM element node to copy to (destination) @param node pointer to xsd__anyType DOM element node to copy from (source) @return elt */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_copy(struct soap_dom_element *elt, const struct soap_dom_element *node) { elt->nstr = node->nstr; elt->name = node->name; elt->lead = node->lead; elt->text = node->text; elt->code = node->code; elt->tail = node->tail; elt->node = node->node; elt->type = node->type; soap_add_atts(elt, node->atts); return soap_add_elts(elt, node->elts); } /******************************************************************************\ * * soap_dom_element properties * \******************************************************************************/ /** @brief Match the namespace URI and tag name of an xsd__anyType DOM element node against a pattern @param elt pointer to xsd__anyType DOM element node @param ns namespace URI string pattern ("*" matches any, NULL and "" match the null (empty) namespace) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any, "" matches unnamed node) @return nonzero if match */ SOAP_FMAC1 int SOAP_FMAC2 soap_elt_match(const struct soap_dom_element *elt, const char *ns, const char *patt) { if (!elt || !elt->name) return 0; if (!ns && patt) ns = soap_ns_to_find(elt->soap, patt); if (patt && !soap_patt_match(elt->name, patt)) return 0; if (ns && (elt->nstr || *ns) && (!elt->nstr || !soap_name_match(elt->nstr, ns))) return 0; return 1; } /******************************************************************************/ /** @brief Match the namespace URI and tag name of an xsd__anyType DOM element node against a pattern @param elt pointer to xsd__anyType DOM element node @param ns namespace URI string pattern ("*" matches any, NULL and "" match the null (empty) namespace) @param patt (un)qualified tag name wide string pattern (NULL, "*", and "*:*" match any, "" matches unnamed node) @return nonzero if match */ SOAP_FMAC1 int SOAP_FMAC2 soap_elt_match_w(const struct soap_dom_element *elt, const char *ns, const wchar_t *patt) { const char *s; int r = 1; if (!elt || !elt->name) return 0; s = soap_wchar2s(NULL, patt); if (!ns && s) ns = soap_ns_to_find(elt->soap, s); if (s && !soap_patt_match(elt->name, s)) r = 0; else if (ns && (elt->nstr || *ns) && (!elt->nstr || !soap_name_match(elt->nstr, ns))) r = 0; if (s) free((void*)s); return r; } /******************************************************************************/ /** @brief Get the namespace URI of an xsd__anyType DOM element node @param elt pointer to xsd__anyType DOM element node @return namespace URI string or NULL */ SOAP_FMAC1 const char* SOAP_FMAC2 soap_elt_get_ns(const struct soap_dom_element *elt) { if (elt) return elt->nstr; return NULL; } /******************************************************************************/ /** @brief Get the tag name of an xsd__anyType DOM element node, if any @param elt pointer to xsd__anyType DOM element node @return tag name string or NULL */ SOAP_FMAC1 const char* SOAP_FMAC2 soap_elt_get_tag(const struct soap_dom_element *elt) { if (elt) return elt->name; return NULL; } /******************************************************************************/ /** @brief Return nonzero if xsd__anyType DOM element node text is Boolean "true" or "1" @param elt pointer to xsd__anyType DOM element node @return zero (not "true" or "1") or nonzero ("true" or "1") */ SOAP_FMAC1 int SOAP_FMAC2 soap_elt_is_true(const struct soap_dom_element *elt) { return elt->text && (!strcmp(elt->text, "true") || !strcmp(elt->text, "1")); } /******************************************************************************/ /** @brief Return nonzero if xsd__anyType DOM element node text is Boolean "false" or "0" @param elt pointer to xsd__anyType DOM element node @return zero (not "false" or "0") or nonzero ("false" or "0") */ SOAP_FMAC1 int SOAP_FMAC2 soap_elt_is_false(const struct soap_dom_element *elt) { return elt->text && (!strcmp(elt->text, "false") || !strcmp(elt->text, "0")); } /******************************************************************************/ /** @brief Return integer value of numeric text of xsd__anyType DOM element node @param elt pointer to xsd__anyType DOM element node @return integer value or 0 if text is not numeric */ SOAP_FMAC1 int SOAP_FMAC2 soap_elt_get_int(const struct soap_dom_element *elt) { if (elt) { int n; if (elt->text && !soap_s2int(elt->soap, elt->text, &n)) return n; elt->soap->error = SOAP_OK; } return 0; } /******************************************************************************/ /** @brief Return long integer value of numeric text of xsd__anyType DOM element node @param elt pointer to xsd__anyType DOM element node @return long integer value or 0 if text is not numeric */ SOAP_FMAC1 long SOAP_FMAC2 soap_elt_get_long(const struct soap_dom_element *elt) { if (elt) { long n; if (elt->text && !soap_s2long(elt->soap, elt->text, &n)) return n; elt->soap->error = SOAP_OK; } return 0; } /******************************************************************************/ /** @brief Return 64 bit integer value of numeric text of xsd__anyType DOM element node @param elt pointer to xsd__anyType DOM element node @return 64 bit integer value or 0 if text is not numeric */ SOAP_FMAC1 LONG64 SOAP_FMAC2 soap_elt_get_LONG64(const struct soap_dom_element *elt) { if (elt) { LONG64 n; if (elt->text && !soap_s2LONG64(elt->soap, elt->text, &n)) return n; elt->soap->error = SOAP_OK; } return 0; } /******************************************************************************/ /** @brief Return double float value of decimal text of xsd__anyType DOM element node @param elt pointer to xsd__anyType DOM element node @return double float value or NaN if text is not numeric */ SOAP_FMAC1 double SOAP_FMAC2 soap_elt_get_double(const struct soap_dom_element *elt) { if (elt) { double x; if (elt->text && !soap_s2double(elt->soap, elt->text, &x)) return x; elt->soap->error = SOAP_OK; } return DBL_NAN; } /******************************************************************************/ /** @brief Return text of xsd__anyType DOM element node @param elt pointer to xsd__anyType DOM element node @return string or NULL */ SOAP_FMAC1 const char* SOAP_FMAC2 soap_elt_get_text(const struct soap_dom_element *elt) { if (elt) return elt->text; return NULL; } /******************************************************************************/ /** @brief Get pointer to deserialized object stored in xsd__anyType DOM element node @param elt pointer to xsd__anyType DOM element node @param type SOAP_TYPE_T requested type to match @return pointer to deserialized object or NULL if type mismatch or when no deserialized object is present */ SOAP_FMAC1 const void * SOAP_FMAC2 soap_elt_get_node(const struct soap_dom_element *elt, int type) { if (!elt || elt->type != type) return NULL; return elt->node; } /******************************************************************************/ /** @brief Get pointer to deserialized object stored in xsd__anyType DOM element node @param elt pointer to xsd__anyType DOM element node @param node pointer to pointer to void, to be set to point to deserialized object @return SOAP_TYPE_T type of deserialized object, or zero (0) if none */ SOAP_FMAC1 int SOAP_FMAC2 soap_elt_get_type(const struct soap_dom_element *elt, const void **node) { if (!elt) return 0; *node = &elt->node; return elt->type; } /******************************************************************************/ /** @brief Return pointer to parent of an xsd__anyType DOM element node @param elt pointer to xsd__anyType DOM element node @return pointer to xsd__anyType DOM element or NULL */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_parent(const struct soap_dom_element *elt) { if (!elt) return NULL; return elt->prnt; } /******************************************************************************/ /** @brief Return depth from the root node of an xsd__anyType DOM element node @param elt pointer to xsd__anyType DOM element node @return depth from root node, zero if node is a root node and has no parent */ SOAP_FMAC1 size_t SOAP_FMAC2 soap_elt_depth(const struct soap_dom_element *elt) { size_t n = 0; while (elt) { elt = elt->prnt; n++; } return n; } /******************************************************************************/ /** @brief Return child index of an xsd__anyType DOM child element node in sibling list @param elt pointer to xsd__anyType DOM element node @return nonzero index of child among siblings, or 0 if node is a root node and has no parent */ SOAP_FMAC1 size_t SOAP_FMAC2 soap_elt_index(const struct soap_dom_element *elt) { size_t n = 0; if (elt && elt->prnt) { const struct soap_dom_element *node; n++; for (node = elt->prnt->elts; node && node != elt; n++, node = node->next) continue; } return n; } /******************************************************************************/ /** @brief Return number of siblings of an xsd__anyType DOM child node that have the same namespace URI and tag name @param elt pointer to xsd__anyType DOM element node @return number of siblings plus one (for self) that have the same namespace URI and tag name */ SOAP_FMAC1 size_t SOAP_FMAC2 soap_elt_len(const struct soap_dom_element *elt) { size_t n = 0; if (elt && elt->prnt) { const struct soap_dom_element *node; for (node = soap_elt_get(elt->prnt, elt->nstr, elt->name); node; n++, node = soap_elt_get_next(node)) continue; } return n; } /******************************************************************************/ /** @brief Return index of an xsd__anyType DOM child node among siblings that have the same namespace URI and tag name @param elt pointer to xsd__anyType DOM element node @return nonzero N-th index (1 <= nth <= len), or 0 if element is root or is singular (has no siblings with the same namespace URI and tag name) */ SOAP_FMAC1 size_t SOAP_FMAC2 soap_elt_nth(const struct soap_dom_element *elt) { size_t n = 0; if (elt && elt->prnt) { const struct soap_dom_element *node; for (node = soap_elt_get(elt->prnt, elt->nstr, elt->name); node && node != elt; n++, node = soap_elt_get_next(node)) continue; if (node && (n > 0 || soap_elt_get_next(node))) n++; } return n; } /******************************************************************************\ * * soap_dom_attribute construction * \******************************************************************************/ /** @brief Returns pointer to new xsd__anyAttribute DOM attribute node. @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name string @return pointer to xsd__anyAttribute DOM attribute node */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_new(struct soap *soap, const char *ns, const char *tag) { return soap_att_set(new_attribute(soap), ns, tag); } /******************************************************************************/ /** @brief Returns pointer to new xsd__anyAttribute DOM attribute node. @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name wide string @return pointer to xsd__anyAttribute DOM attribute node */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_new_w(struct soap *soap, const char *ns, const wchar_t *tag) { return soap_att_set_w(new_attribute(soap), ns, tag); } /******************************************************************************/ /** @brief Set xsd__anyAttribute DOM attribute namespace URI and tag name @param att pointer to xsd__anyAttribute DOM attribute to set @param ns namespace URI string or NULL @param tag (un)qualified tag name string @return att */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_set(struct soap_dom_attribute *att, const char *ns, const char *tag) { if (att) { att->name = soap_strdup(att->soap, tag); if (!ns) att->nstr = soap_ns_to_set(att->soap, tag); else att->nstr = soap_strdup(att->soap, ns); } return att; } /******************************************************************************/ /** @brief Set xsd__anyAttribute DOM attribute namespace URI and tag name @param att pointer to xsd__anyAttribute DOM attribute to set @param ns namespace URI string or NULL @param tag (un)qualified tag name wide string @return att */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_set_w(struct soap_dom_attribute *att, const char *ns, const wchar_t *tag) { if (att) { att->name = soap_wchar2s(att->soap, tag); if (!ns) att->nstr = soap_ns_to_set(att->soap, att->name); else att->nstr = soap_strdup(att->soap, ns); } return att; } /******************************************************************************/ /** @brief Add an attribute node to an xsd__anyAttribute DOM attribute node to create or extend an attribute list @param att pointer to xsd__anyAttribute DOM attribute @param ns namespace URI string or NULL of attribute @param tag (un)qualified tag name string of attribute @return pointer to xsd__anyAttribute attribute node (new attribute node if none matches in the list) */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_add(struct soap_dom_attribute *att, const char *ns, const char *tag) { if (att && tag) { const char *ns1 = ns; if (!att->name) return soap_att_set(att, ns, tag); if (!ns1) ns1 = soap_ns_to_set(att->soap, tag); while (att) { if (att->name && soap_tag_match(att->name, tag) && (ns1 == att->nstr || (ns1 && att->nstr && !strcmp(ns1, att->nstr)))) return att; if (!att->next) return att->next = soap_att_new(att->soap, ns, tag); att = att->next; } } return att; } /******************************************************************************/ /** @brief Add an attribute node to an xsd__anyAttribute DOM attribute node to create or extend an attribute list @param att pointer to xsd__anyAttribute DOM attribute @param ns namespace URI string or NULL of attribute @param tag (un)qualified tag name wide string of attribute @return pointer to xsd__anyAttribute attribute node (new attribute node if none matches in the list) */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_add_w(struct soap_dom_attribute *att, const char *ns, const wchar_t *tag) { if (att && tag) { const char *name = soap_wchar2s(att->soap, tag); const char *ns1 = ns; if (!att->name) return soap_att_set(att, ns, name); if (!ns1) ns1 = soap_ns_to_set(att->soap, name); while (att) { if (att->name && soap_tag_match(att->name, name) && (ns1 == att->nstr || (ns1 && att->nstr && !strcmp(ns1, att->nstr)))) return att; if (!att->next) { att->next = soap_att_new(att->soap, ns, NULL); if (att->next) att->next->name = name; return att->next; } att = att->next; } } return att; } /******************************************************************************\ * * soap_dom_attribute assignment * \******************************************************************************/ /** @brief Set text of an xsd__anyAttribute DOM attribute node to Boolean "false" or "true" @param att pointer to xsd__anyAttribute DOM attribute node to set @param b Boolean value (zero = false, nonzero = true) @return att */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_bool(struct soap_dom_attribute *att, LONG64 b) { if (att) att->text = b ? "true" : "false"; return att; } /******************************************************************************/ /** @brief Set text of an xsd__anyAttribute DOM attribute node to a 64 bit integer value @param att pointer to xsd__anyAttribute DOM attribute node to set @param n 64 bit integer value @return att */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_int(struct soap_dom_attribute *att, LONG64 n) { return soap_att_text(att, soap_LONG642s(att->soap, n)); } /******************************************************************************/ /** @brief Set text of an xsd__anyAttribute DOM attribute node to a double float value @param att pointer to xsd__anyAttribute DOM attribute node to set @param x double float value (NaN and +/-INF are also supported) @return att */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_double(struct soap_dom_attribute *att, double x) { return soap_att_text(att, soap_double2s(att->soap, x)); } /******************************************************************************/ /** @brief Set text of an xsd__anyAttribute DOM attribute node @param att pointer to xsd__anyAttribute DOM attribute node to set @param text string or NULL @return att */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_text(struct soap_dom_attribute *att, const char *text) { if (att) att->text = soap_strdup(att->soap, text); return att; } /******************************************************************************/ /** @brief Set text of an xsd__anyAttribute DOM attribute node @param att pointer to xsd__anyAttribute DOM attribute node to set @param text wide string or NULL @return att */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_text_w(struct soap_dom_attribute *att, const wchar_t *text) { if (att) att->text = soap_wchar2s(att->soap, text); return att; } /******************************************************************************/ /** @brief Copy an xsd__anyAttribute DOM attribute node to another (not a deep copy) @param att pointer to xsd__anyAttribute DOM attribute node to copy to (destination) @param node pointer to xsd__anyAttribute DOM attribute node to copy from (source) @return att */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_copy(struct soap_dom_attribute *att, const struct soap_dom_attribute *node) { if (att) { att->nstr = node->nstr; att->name = node->name; att->text = node->text; } return att; } /******************************************************************************\ * * soap_dom_attribute properties * \******************************************************************************/ /** @brief Match the namespace URI and tag name of an xsd__anyAttribute DOM attribute node against a pattern @param att pointer to xsd__anyAttribute DOM attribute node @param ns namespace URI string pattern ("*" matches any, NULL and "" match the null (empty) namespace) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any) @return nonzero if match */ SOAP_FMAC1 int SOAP_FMAC2 soap_att_match(const struct soap_dom_attribute *att, const char *ns, const char *patt) { if (!att || !att->name) return 0; if (!ns && patt) ns = soap_ns_to_find(att->soap, patt); if (patt && !soap_patt_match(att->name, patt)) return 0; if (ns && (att->nstr || *ns) && (!att->nstr || !soap_name_match(att->nstr, ns))) return 0; return 1; } /******************************************************************************/ /** @brief Match the namespace URI and tag name of an xsd__anyAttribute DOM attribute node against a pattern @param att pointer to xsd__anyAttribute DOM attribute node @param ns namespace URI string pattern ("*" matches any, NULL and "" match the null (empty) namespace) @param patt (un)qualified tag name wide string pattern (NULL, "*", and "*:*" match any) @return nonzero if match */ SOAP_FMAC1 int SOAP_FMAC2 soap_att_match_w(const struct soap_dom_attribute *att, const char *ns, const wchar_t *patt) { const char *s; int r = 1; if (!att || !att->name) return 0; s = soap_wchar2s(NULL, patt); if (!ns && s) ns = soap_ns_to_find(att->soap, s); if (s && !soap_patt_match(att->name, s)) r = 0; else if (ns && (att->nstr || *ns) && (!att->nstr || !soap_name_match(att->nstr, ns))) r = 0; if (s) free((void*)s); return r; } /******************************************************************************/ /** @brief Get the namespace URI of an xsd__anyAttribute DOM attribute node @param att pointer to xsd__anyAttribute DOM attribute node @return namespace URI string or NULL */ SOAP_FMAC1 const char* SOAP_FMAC2 soap_att_get_ns(const struct soap_dom_attribute *att) { if (att) return att->nstr; return NULL; } /******************************************************************************/ /** @brief Get the tag name of an xsd__anyAttribute DOM attribute node @param att pointer to xsd__anyAttribute DOM attribute node @return tag name string or NULL */ SOAP_FMAC1 const char* SOAP_FMAC2 soap_att_get_tag(const struct soap_dom_attribute *att) { if (att) return att->name; return NULL; } /******************************************************************************/ /** @brief Return nonzero if xsd__anyAttribute DOM attribute node text is Boolean "true" or "1" @param att pointer to xsd__anyAttribute DOM attribute node @return zero (not "true" or "1") or nonzero ("true" or "1") */ SOAP_FMAC1 int SOAP_FMAC2 soap_att_is_true(const struct soap_dom_attribute *att) { return att->text && (!strcmp(att->text, "true") || !strcmp(att->text, "1")); } /******************************************************************************/ /** @brief Return nonzero if xsd__anyAttribute DOM attribute node text is Boolean "false" or "0" @param att pointer to xsd__anyAttribute DOM attribute node @return zero (not "false" or "0") or nonzero ("false" or "0") */ SOAP_FMAC1 int SOAP_FMAC2 soap_att_is_false(const struct soap_dom_attribute *att) { return att->text && (!strcmp(att->text, "false") || !strcmp(att->text, "0")); } /******************************************************************************/ /** @brief Return integer value of numeric text of xsd__anyAttribute DOM attribute node @param att pointer to xsd__anyAttribute DOM attribute node @return integer value or 0 if text is not numeric */ SOAP_FMAC1 int SOAP_FMAC2 soap_att_get_int(const struct soap_dom_attribute *att) { if (att) { int n; if (att->text && !soap_s2int(att->soap, att->text, &n)) return n; att->soap->error = SOAP_OK; } return 0; } /******************************************************************************/ /** @brief Return long integer value of numeric text of xsd__anyAttribute DOM attribute node @param att pointer to xsd__anyAttribute DOM attribute node @return long integer value or 0 if text is not numeric */ SOAP_FMAC1 long SOAP_FMAC2 soap_att_get_long(const struct soap_dom_attribute *att) { if (att) { long n; if (att->text && !soap_s2long(att->soap, att->text, &n)) return n; att->soap->error = SOAP_OK; } return 0; } /******************************************************************************/ /** @brief Return 64 bit integer value of numeric text of xsd__anyAttribute DOM attribute node @param att pointer to xsd__anyAttribute DOM attribute node @return 64 bit integer value or 0 if text is not numeric */ SOAP_FMAC1 LONG64 SOAP_FMAC2 soap_att_get_LONG64(const struct soap_dom_attribute *att) { if (att) { LONG64 n; if (att->text && !soap_s2LONG64(att->soap, att->text, &n)) return n; att->soap->error = SOAP_OK; } return 0; } /******************************************************************************/ /** @brief Return double float value of decimal text of xsd__anyAttribute DOM attribute node @param att pointer to xsd__anyAttribute DOM attribute node @return double float value or NaN if text is not numeric */ SOAP_FMAC1 double SOAP_FMAC2 soap_att_get_double(const struct soap_dom_attribute *att) { if (att) { double x; if (att->text && !soap_s2double(att->soap, att->text, &x)) return x; att->soap->error = SOAP_OK; } return DBL_NAN; } /******************************************************************************/ /** @brief Return text of xsd__anyAttribute DOM attribute node @param att pointer to xsd__anyAttribute DOM attribute node @return string or NULL */ SOAP_FMAC1 const char* SOAP_FMAC2 soap_att_get_text(const struct soap_dom_attribute *att) { if (att) return att->text; return NULL; } /******************************************************************************\ * * DOM local traversal * \******************************************************************************/ /** @brief Returns pointer to first xsd__anyAttribute DOM attribute node of xsd__anyType DOM element node, if any. @param elt pointer to xsd__anyType DOM element node @return pointer to xsd__anyAttribute DOM attribute node or NULL if none */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_first(struct soap_dom_element *elt) { return elt->atts; } /******************************************************************************/ /** @brief Returns pointer to next xsd__anyAttribute DOM attribute node, if any. @param att pointer to current xsd__anyAttribute DOM attribute node in attribute list @return pointer to xsd__anyAttribute DOM attribute node or NULL if none */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_next(const struct soap_dom_attribute *att) { return att->next; } /******************************************************************************/ /** @brief Returns pointer to first child element node of xsd__anyType DOM element node, if any. @param elt pointer to xsd__anyType DOM element node @return pointer to xsd__anyType DOM child element node or NULL if none */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_first(struct soap_dom_element *elt) { return elt->elts; } /******************************************************************************/ /** @brief Returns pointer to next xsd__anyType DOM child element node, if any. @param elt pointer to current xsd__anyType DOM child element node in sibling list @return pointer to xsd__anyType DOM element node or NULL if none */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_next(const struct soap_dom_element *elt) { return elt->next; } /******************************************************************************\ * * DOM local retrieval * \******************************************************************************/ /** @brief Get attribute node of an xsd__anyType DOM element node, if attribute exists @param elt pointer to xsd__anyType DOM element node @param ns namespace URI string (NULL matches the null (empty) namespace if tag is unqualified) of attribute @param tag (un)qualified tag name string of attribute @return pointer to xsd__anyAttribute DOM attribute node or NULL if not exists */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_get(const struct soap_dom_element *elt, const char *ns, const char *tag) { if (elt && tag) { struct soap_dom_attribute *att; if (!ns) ns = soap_ns_to_get(elt->soap, tag); for (att = elt->atts; att; att = att->next) if (att->name && soap_tag_match(att->name, tag) && ((!att->nstr && !*ns) || (att->nstr && !strcmp(att->nstr, ns)))) return att; } return NULL; } /******************************************************************************/ /** @brief Get attribute node of an xsd__anyType DOM element node, if attribute exists @param elt pointer to xsd__anyType DOM element node @param ns namespace URI string (NULL matches the null (empty) namespace if tag is unqualified) of attribute @param tag (un)qualified tag name wide string of attribute @return pointer to xsd__anyAttribute DOM attribute node or NULL if not exists */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_get_w(const struct soap_dom_element *elt, const char *ns, const wchar_t *tag) { if (elt && tag) { const char *name = soap_wchar2s(NULL, tag); struct soap_dom_attribute *att = NULL; if (!ns) ns = soap_ns_to_get(elt->soap, name); for (att = elt->atts; att; att = att->next) if (att->name && soap_tag_match(att->name, name) && ((!att->nstr && !*ns) || (att->nstr && !strcmp(att->nstr, ns)))) break; if (name) free((void*)name); return att; } return NULL; } /******************************************************************************/ /** @brief Get child element node of an xsd__anyType DOM element node, if child element exists @param elt pointer to xsd__anyType DOM element node @param ns namespace URI string (NULL matches the null (empty) namespace if tag is unqualified) of child element @param tag (un)qualified tag name string (NULL matches unnamed node) of child element @return pointer to xsd__anyType DOM child element node or NULL if not exists */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_get(const struct soap_dom_element *elt, const char *ns, const char *tag) { if (elt) { struct soap_dom_element *node; if (!ns) ns = soap_ns_to_get(elt->soap, tag); for (node = elt->elts; node; node = node->next) if ((tag == node->name || (tag && soap_tag_match(node->name, tag))) && ((!node->nstr && !*ns) || (node->nstr && !strcmp(node->nstr, ns)))) return node; } return NULL; } /******************************************************************************/ /** @brief Get child element node of an xsd__anyType DOM element node, if child element exists @param elt pointer to xsd__anyType DOM element node @param ns namespace URI string (NULL matches the null (empty) namespace if tag is unqualified) of child element @param tag (un)qualified tag name wide string (NULL matches unnamed node) of child element @return pointer to xsd__anyType DOM child element node or NULL if not exists */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_get_w(const struct soap_dom_element *elt, const char *ns, const wchar_t *tag) { if (elt) { const char *name = soap_wchar2s(NULL, tag); struct soap_dom_element *node; if (!ns) ns = soap_ns_to_get(elt->soap, name); for (node = elt->elts; node; node = node->next) if (((!name && !node->name) || (name && soap_tag_match(node->name, name))) && ((!node->nstr && !*ns) || (node->nstr && !strcmp(node->nstr, ns)))) break; if (name) free((void*)name); return node; } return NULL; } /******************************************************************************/ /** @brief Get next child element node that has the same namespace URI and tag name as the current child element node @param elt pointer to current xsd__anyType DOM child element node @return pointer to xsd__anyType DOM child element node or NULL if not exists */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_get_next(const struct soap_dom_element *elt) { if (elt) { const char *ns = elt->nstr; const char *tag = elt->name; struct soap_dom_element *node; for (node = elt->next; node; node = node->next) if ((tag == node->name || (tag && soap_tag_match(node->name, tag))) && (ns == node->nstr || (ns && node->nstr && !strcmp(node->nstr, ns)))) return node; } return NULL; } /******************************************************************************/ /** @brief Get N-th child element node that has the same namespace URI and tag name as the current child element node at position one (1) in the sibling list @param elt pointer to current xsd__anyType DOM child element node at position one (1) in the sibling list @param n N-th element minus one located from the current element node at position one (1), 1 returns the current element (elt) @return pointer to xsd__anyType DOM child element node or NULL if not exists */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_get_nth(struct soap_dom_element *elt, size_t n) { while (n-- > 1) elt = soap_elt_get_next(elt); return elt; } /******************************************************************************\ * * DOM local search * \******************************************************************************/ /** @brief Find matching attribute node of an xsd__anyType DOM element node @param elt pointer to xsd__anyType DOM element node @param ns namespace URI string pattern ("*" matches any, "" matches the null (empty) namespace, NULL matches the null (empty) namespace if tag is unqualified or the namespace from namespace table if tag is qualified) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any) @return pointer to xsd__anyAttribute DOM attribute node or NULL if not exists */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_find(struct soap_dom_element *elt, const char *ns, const char *patt) { struct soap_dom_attribute *att = NULL; if (elt) { att = elt->atts; if (att) { if (!ns && patt) ns = soap_ns_to_find(elt->soap, patt); if (patt && !soap_patt_match(att->name, patt)) return soap_att_find_next(att, ns, patt); if (ns && (att->nstr || *ns) && (!att->nstr || !soap_name_match(att->nstr, ns))) return soap_att_find_next(att, ns, patt); } } return att; } /******************************************************************************/ /** @brief Find next matching attribute node of an xsd__anyType DOM element node @param att pointer to current xsd__anyAttribute DOM attribute node @param ns namespace URI string pattern ("*" matches any, "" matches the null (empty) namespace, NULL matches the null (empty) namespace if tag is unqualified or the namespace from namespace table if tag is qualified) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any) @return pointer to xsd__anyAttribute DOM attribute node or NULL if not exists */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_find_next(const struct soap_dom_attribute *att, const char *ns, const char *patt) { if (att) { struct soap_dom_attribute *node; if (!ns && patt) ns = soap_ns_to_find(att->soap, patt); for (node = att->next; node; node = node->next) { if (patt && !soap_patt_match(node->name, patt)) continue; if (ns && (node->nstr || *ns) && (!node->nstr || !soap_name_match(node->nstr, ns))) continue; return node; } } return NULL; } /******************************************************************************/ /** @brief Find matching child element node of an xsd__anyType DOM element node @param elt pointer to xsd__anyType DOM element node @param ns namespace URI string pattern ("*" matches any, "" matches the null (empty) namespace, NULL matches the null (empty) namespace if tag is unqualified or the namespace from namespace table if tag is qualified) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any, "" matches unnamed node) @return pointer to xsd__anyType DOM child element node or NULL if not exists */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_find(struct soap_dom_element *elt, const char *ns, const char *patt) { return soap_elt_find_type(elt, ns, patt, 0); } /******************************************************************************/ /** @brief Find next matching child element node of an xsd__anyType DOM element node @param elt pointer to current xsd__anyType DOM child element node @param ns namespace URI string pattern ("*" matches any, "" matches the null (empty) namespace, NULL matches the null (empty) namespace if tag is unqualified or the namespace from namespace table if tag is qualified) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any, "" matches unnamed node) @return pointer to xsd__anyType DOM child element node or NULL if not exists */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_find_next(const struct soap_dom_element *elt, const char *ns, const char *patt) { return soap_elt_find_next_type(elt, ns, patt, 0); } /******************************************************************************/ /** @brief Find matching child element node of an xsd__anyType DOM element node that has a deserialized object @param elt pointer to xsd__anyType DOM element node @param ns namespace URI string pattern ("*" matches any, "" matches the null (empty) namespace, NULL matches the null (empty) namespace if tag is unqualified or the namespace from namespace table if tag is qualified) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any, "" matches unnamed node) @param type SOAP_TYPE_T type of deserialized object of type T to match or 0 @return pointer to xsd__anyType DOM child element node or NULL if not exists */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_find_type(struct soap_dom_element *elt, const char *ns, const char *patt, int type) { if (elt) { elt = elt->elts; if (elt) { if (!ns && patt) ns = soap_ns_to_find(elt->soap, patt); if (patt && !soap_patt_match(elt->name, patt)) return soap_elt_find_next_type(elt, ns, patt, type); if (ns && (elt->nstr || *ns) && (!elt->nstr || !soap_name_match(elt->nstr, ns))) return soap_elt_find_next_type(elt, ns, patt, type); if (type && type != elt->type) return soap_elt_find_next_type(elt, ns, patt, type); } } return elt; } /******************************************************************************/ /** @brief Find next matching child element node of an xsd__anyType DOM element node that has a deserialized object @param elt pointer to current xsd__anyType DOM child element node @param ns namespace URI string pattern ("*" matches any, "" matches the null (empty) namespace, NULL matches the null (empty) namespace if tag is unqualified or the namespace from namespace table if tag is qualified) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any, "" matches unnamed node) @param type SOAP_TYPE_T type of deserialized object of type T to match or 0 @return pointer to xsd__anyType DOM child element node or NULL if not exists */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_find_next_type(const struct soap_dom_element *elt, const char *ns, const char *patt, int type) { if (elt) { struct soap_dom_element *node; if (!ns && patt) ns = soap_ns_to_find(elt->soap, patt); for (node = elt->next; node; node = node->next) { if (patt && !soap_patt_match(node->name, patt)) continue; if (ns && (node->nstr || *ns) && (!node->nstr || !soap_name_match(node->nstr, ns))) continue; if (type && type != node->type) continue; return node; } } return NULL; } /******************************************************************************\ * * DOM size of local search results * \******************************************************************************/ /** @brief Return number of matching attribute nodes of an xsd__anyType DOM element node @param elt pointer to xsd__anyType DOM element node @param ns namespace URI string pattern ("*" matches any, "" matches the null (empty) namespace, NULL matches the null (empty) namespace if tag is unqualified or the namespace from namespace table if tag is qualified) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any) @return number of matches found */ SOAP_FMAC1 size_t SOAP_FMAC2 soap_att_size(struct soap_dom_element *elt, const char *ns, const char *patt) { size_t n = 0; if (elt) { struct soap_dom_attribute *att = soap_att_find(elt, ns, patt); if (att) { n++; while ((att = soap_att_find_next(att, ns, patt))) n++; } } return n; } /******************************************************************************/ /** @brief Return number of matching child element nodes of an xsd__anyType DOM element node @param elt pointer to xsd__anyType DOM element node @param ns namespace URI string pattern ("*" matches any, "" matches the null (empty) namespace, NULL matches the null (empty) namespace if tag is unqualified or the namespace from namespace table if tag is qualified) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any, "" matches unnamed node) @return number of matches found */ SOAP_FMAC1 size_t SOAP_FMAC2 soap_elt_size(struct soap_dom_element *elt, const char *ns, const char *patt) { return soap_elt_size_type(elt, ns, patt, 0); } /******************************************************************************/ /** @brief Return number of matching child element nodes of an xsd__anyType DOM element node that have deserialized objects @param elt pointer to xsd__anyType DOM element node @param ns namespace URI string pattern ("*" matches any, "" matches the null (empty) namespace, NULL matches the null (empty) namespace if tag is unqualified or the namespace from namespace table if tag is qualified) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any, "" matches unnamed node) @param type SOAP_TYPE_T type of deserialized object of type T to match or 0 @return number of matches found */ SOAP_FMAC1 size_t SOAP_FMAC2 soap_elt_size_type(struct soap_dom_element *elt, const char *ns, const char *patt, int type) { size_t n = 0; if (elt) { elt = soap_elt_find_type(elt, ns, patt, type); if (elt) { n++; while ((elt = soap_elt_find_next_type(elt, ns, patt, type))) n++; } } return n; } /******************************************************************************\ * * DOM deep traversal * \******************************************************************************/ /** @brief Return next xsd__anyAttribute DOM attribute node in attribute list @param att pointer to current xsd__anyAttribute DOM attribute node @return pointer to xsd__anyAttribute DOM node or NULL if none */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_dom_next_attribute(const struct soap_dom_attribute *att) { return att->next; } /******************************************************************************/ /** @brief Return next xsd__anyType DOM element node in depth-first traversal of node graph (XPath recursive descent) @param elt pointer to current xsd__anyType DOM element node @param end pointer to the ending xsd__anyType DOM element node (exclusive), usually the starting node of the graph traversal @return pointer to xsd__anyType DOM node or NULL if none or if next node would be the ending node */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_dom_next_element(const struct soap_dom_element *elt, const struct soap_dom_element *end) { struct soap_dom_element *node; if (elt->elts) return elt->elts; if (elt == end) return NULL; if (elt->next) return elt->next; for (node = elt->prnt; node && !node->next; node = node->prnt) if (node == end) return NULL; if (node) node = node->next; return node; } /******************************************************************************\ * * DOM deep search * \******************************************************************************/ /** @brief Find matching xsd__anyType DOM element node in depth-first traversal of node graph (XPath recursive descent) @param begin pointer to starting xsd__anyType DOM element node of node graph to search @param end pointer to the ending xsd__anyType DOM element node (exclusive), usually the starting node of the graph traversal @param ns namespace URI string pattern ("*" matches any, "" matches the null (empty) namespace, NULL matches the null (empty) namespace if tag is unqualified or the namespace from namespace table if tag is qualified) @param patt (un)qualified tag name string pattern (use '@' to match attributes, NULL, "*" and "*:*" match any, "" matches unnamed node) @param type SOAP_TYPE_T type of deserialized object of type T to match or 0 @return pointer to xsd__anyType DOM node or NULL if none or if next node would be the ending node */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_dom_find(struct soap_dom_element *begin, const struct soap_dom_element *end, const char *ns, const char *patt, int type) { if (begin) { if (patt && *patt == '@') { if (soap_att_find(begin, ns, patt + 1)) return begin; return soap_dom_find_next(begin, end, ns, patt, type); } if (!ns && patt) ns = soap_ns_to_find(begin->soap, patt); if (patt && !soap_patt_match(begin->name, patt)) return soap_dom_find_next(begin, end, ns, patt, type); if (ns && (begin->nstr || *ns) && (!begin->nstr || !soap_name_match(begin->nstr, ns))) return soap_dom_find_next(begin, end, ns, patt, type); if (type && type != begin->type) return soap_dom_find_next(begin, end, ns, patt, type); } return begin; } /******************************************************************************/ /** @brief Find next matching xsd__anyType DOM element node in depth-first traversal of node graph (XPath recursive descent) @param elt pointer to current xsd__anyType DOM element node of node graph to search @param end pointer to the ending xsd__anyType DOM element node, usually the starting node of the graph traversal @param ns namespace URI string pattern ("*" matches any, "" matches the null (empty) namespace, NULL matches the null (empty) namespace if tag is unqualified or the namespace from namespace table if tag is qualified) @param patt (un)qualified tag name string pattern (use '@' to match attributes, NULL, "*" and "*:*" match any, "" matches unnamed node) @param type SOAP_TYPE_T type of deserialized object of type T to match or 0 @return pointer to xsd__anyType DOM node or NULL if none or if next node would be the ending node */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_dom_find_next(const struct soap_dom_element *elt, const struct soap_dom_element *end, const char *ns, const char *patt, int type) { if (elt) { struct soap_dom_element *node; if (!ns && patt) ns = soap_ns_to_find(elt->soap, patt + (*patt == '@')); for (node = soap_dom_next_element(elt, end); node; node = soap_dom_next_element(node, end)) { if (patt && *patt == '@') { if (soap_att_find(node, ns, patt + 1)) return node; continue; } if (patt && !soap_patt_match(node->name, patt)) continue; if (ns && (node->nstr || *ns) && (!node->nstr || !soap_name_match(node->nstr, ns))) continue; if (type && type != node->type) continue; return node; } } return NULL; } /******************************************************************************\ * * C REST POST, GET, PUT, DELETE server invocation * \******************************************************************************/ /* @brief REST POST, GET, PUT, DELETE server invocation with XML @param soap context to manage IO @param endpoint server URL @param optional SOAP Action or NULL @param in request XML to be send to server, or NULL for GET or DELETE (both in and out are NULL) @param out response to be populated with response XML received from server, or NULL for PUT or DELETE (both in and out are NULL) */ SOAP_FMAC1 int SOAP_FMAC2 soap_dom_call(struct soap *soap, const char *endpoint, const char *action, const struct soap_dom_element *in, struct soap_dom_element *out) { if (out) soap_default_xsd__anyType(soap, out); if (in) soap_serialize_xsd__anyType(soap, in); soap->http_content = "text/xml; charset=utf-8"; if (soap_begin_count(soap) || ((soap->mode & SOAP_IO_LENGTH) && soap_out_xsd__anyType(soap, NULL, 0, in, NULL)) || soap_end_count(soap) || soap_connect_command(soap, in && out ? SOAP_POST_FILE : out ? SOAP_GET : in ? SOAP_PUT : SOAP_DEL, endpoint, action) || soap_out_xsd__anyType(soap, NULL, 0, in, NULL) || soap_end_send(soap)) return soap_closesock(soap); if (!out) { if (!soap_begin_recv(soap)) { #ifndef WITH_LEAN (void)soap_get_http_body(soap, NULL); #endif (void)soap_end_recv(soap); } else if (soap->error == SOAP_NO_DATA || soap->error == 200 || soap->error == 202) soap->error = SOAP_OK; return soap_closesock(soap); } if (soap_begin_recv(soap) || soap_in_xsd__anyType(soap, NULL, out, NULL) == NULL || soap_end_recv(soap)) return soap_closesock(soap); return soap_closesock(soap); } /******************************************************************************/ #ifdef __cplusplus /******************************************************************************\ * * C++ REST POST, GET, PUT, DELETE server invocation * \******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_dom_call(struct soap *soap, const char *endpoint, const char *action, const struct soap_dom_element& in, struct soap_dom_element& out) { return soap_dom_call(soap, endpoint, action, &in, &out); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_dom_call(struct soap *soap, const char *endpoint, const char *action, const struct soap_dom_element *in, struct soap_dom_element& out) { return soap_dom_call(soap, endpoint, action, in, &out); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_dom_call(struct soap *soap, const char *endpoint, const char *action, const struct soap_dom_element& in, struct soap_dom_element *out) { return soap_dom_call(soap, endpoint, action, &in, out); } /******************************************************************************\ * * C++ soap_dom_element and soap_dom_attribute classes * \******************************************************************************/ #if 0 // DOXYGEN PROCESSING ONLY /** @class soap_dom_attribute @brief The xsd__anyAttribute DOM attribute node structure (xsd__anyAttribute is a typedef of soap_dom_attribute) */ struct soap_dom_attribute { struct soap_dom_attribute *next; ///< next attribute node in list const char *nstr; ///< namespace string const char *name; ///< (un)qualified tag name const char *text; ///< text cdata in UTF-8 struct soap *soap; ///< context that manages this object /** iterator over attribute list */ typedef soap_dom_attribute_iterator iterator; /** @brief Construct new xsd__anyAttribute DOM attribute that is empty (must be set later) @param soap context that manages this object */ soap_dom_attribute(struct soap *soap = NULL); /** @brief Construct new xsd__anyAttribute DOM attribute by (shallow) copying another attribute @param att xsd__anyAttribute DOM attribute copied */ soap_dom_attribute(const soap_dom_attribute& att); /** @brief Construct new xsd__anyAttribute DOM attribute with (un)qualified tag name, same as xsd__anyAttribute(soap, NULL, tag, NULL) @param soap context that manages this object @param tag (un)qualified tag name string */ soap_dom_attribute(struct soap *soap, const char *tag); /** @brief Construct new xsd__anyAttribute DOM attribute with (un)qualified tag name, same as xsd__anyAttribute(soap, NULL, tag, NULL) @param soap context that manages this object @param tag (un)qualified tag name wide string */ soap_dom_attribute(struct soap *soap, const wchar_t *tag); /** @brief Construct new xsd__anyAttribute DOM attribute with namespace URI (xmlns), (un)qualified tag name, and text @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name string @param text string */ soap_dom_attribute(struct soap *soap, const char *ns, const char *tag, const char *text); /** @brief Construct new xsd__anyAttribute DOM attribute with namespace URI (xmlns), (un)qualified tag name, and text @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name string @param text wide string */ soap_dom_attribute(struct soap *soap, const char *ns, const char *tag, const wchar_t *text); /** @brief Construct new xsd__anyAttribute DOM attribute with namespace URI (xmlns), (un)qualified tag name, and text @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name wide string @param text string */ soap_dom_attribute(struct soap *soap, const char *ns, const wchar_t *tag, const char *text); /** @brief Construct new xsd__anyAttribute DOM attribute with namespace URI (xmlns), (un)qualified tag name, and text @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name wide string @param text wide string */ soap_dom_attribute(struct soap *soap, const char *ns, const wchar_t *tag, const wchar_t *text); /** @brief Construct new xsd__anyAttribute DOM attribute with namespace URI (xmlns), (un)qualified tag name, and text @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name string @param text string */ soap_dom_attribute(struct soap *soap, const char *ns, const char *tag, const std::string& text); /** @brief Construct new xsd__anyAttribute DOM attribute with namespace URI (xmlns), (un)qualified tag name, and text @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name string @param text wide string */ soap_dom_attribute(struct soap *soap, const char *ns, const char *tag, const std::wstring& text); /** @brief Construct new xsd__anyAttribute DOM attribute with namespace URI (xmlns), (un)qualified tag name, and text @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name wide string @param text string */ soap_dom_attribute(struct soap *soap, const char *ns, const wchar_t *tag, const std::string& text); /** @brief Construct new xsd__anyAttribute DOM attribute with namespace URI (xmlns), (un)qualified tag name, and text @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name wide string @param text wide string */ soap_dom_attribute(struct soap *soap, const char *ns, const wchar_t *tag, const std::wstring& text); /** @brief Destructor (no-op, deletes are done by the managing context of this object) */ ~soap_dom_attribute(); /** @brief Set this xsd__anyAttribute DOM attribute namespace URI and tag name @param ns namespace URI string or NULL @param tag (un)qualified tag name string @return reference to *this */ soap_dom_attribute& set(const char *ns, const char *tag); /** @brief Set this xsd__anyAttribute DOM attribute namespace URI and tag name @param ns namespace URI string or NULL @param tag (un)qualified tag name string @return reference to *this */ soap_dom_attribute& set(const char *ns, const wchar_t *tag); /** @brief Set text of this xsd__anyAttribute DOM attribute node to Boolean "false" or "true" @param b Boolean value @return reference to *this */ soap_dom_attribute& set(bool b); /** @brief Set text of this xsd__anyAttribute DOM attribute node to an integer value @param n integer value @return reference to *this */ soap_dom_attribute& set(int n); /** @brief Set text of this xsd__anyAttribute DOM attribute node to a 64 bit integer value @param n 64 bit integer value @return reference to *this */ soap_dom_attribute& set(LONG64 n); /** @brief Set text of this xsd__anyAttribute DOM attribute node to a float value @param x float value (NaN and +/-INF are also supported) @return reference to *this */ soap_dom_attribute& set(float x); /** @brief Set text of this xsd__anyAttribute DOM attribute node to a double float value @param x double float value (NaN and +/-INF are also supported) @return reference to *this */ soap_dom_attribute& set(double x); /** @brief Set text of this xsd__anyAttribute DOM attribute node @param text string or NULL @return reference to *this */ soap_dom_attribute& set(const char *text); /** @brief Set text of this xsd__anyAttribute DOM attribute node @param text wide string or NULL @return reference to *this */ soap_dom_attribute& set(const wchar_t *text); /** @brief Set text of this xsd__anyAttribute DOM attribute node @param text string or NULL @return reference to *this */ soap_dom_attribute& set(const std::string& text); /** @brief Set text of this xsd__anyAttribute DOM attribute node @param text wide string or NULL @return reference to *this */ soap_dom_attribute& set(const std::wstring& text); /** @brief Set text of this xsd__anyAttribute DOM attribute node to Boolean "false" or "true", same as set(b) @param b Boolean value @return reference to *this */ soap_dom_attribute& operator=(bool b); /** @brief Set text of this xsd__anyAttribute DOM attribute node to an integer value, same as set(n) @param n integer value @return reference to *this */ soap_dom_attribute& operator=(int n); /** @brief Set text of this xsd__anyAttribute DOM attribute node to a 64 bit integer value, same as set(n) @param n 64 bit integer value @return reference to *this */ soap_dom_attribute& operator=(LONG64 n); /** @brief Set text of this xsd__anyAttribute DOM attribute node to a float value, same as set(x) @param x float value (NaN and +/-INF are also supported) @return reference to *this */ soap_dom_attribute& operator=(float x); /** @brief Set text of this xsd__anyAttribute DOM attribute node to a double float value, same as set(x) @param x double float value (NaN and +/-INF are also supported) @return reference to *this */ soap_dom_attribute& operator=(double x); /** @brief Set text of this xsd__anyAttribute DOM attribute node, same as set(text) @param text string or NULL @return reference to *this */ soap_dom_attribute& operator=(const char *text); /** @brief Set text of this xsd__anyAttribute DOM attribute node, same as set(text) @param text wide string or NULL @return reference to *this */ soap_dom_attribute& operator=(const wchar_t *text); /** @brief Set text of this xsd__anyAttribute DOM attribute node, same as set(text) @param text string or NULL @return reference to *this */ soap_dom_attribute& operator=(const std::string& text); /** @brief Set text of this xsd__anyAttribute DOM attribute node, same as set(text) @param text wide string or NULL @return reference to *this */ soap_dom_attribute& operator=(const std::wstring& text); /** @brief Copy an xsd__anyAttribute DOM attribute node to this node (not a deep copy) @param att pointer to xsd__anyAttribute DOM attribute node to copy from @return reference to *this */ soap_dom_attribute& operator=(const soap_dom_attribute& att); /** @brief Add an attribute node to this xsd__anyAttribute DOM attribute node to create or extend an attribute list, same as att(NULL, tag) @param tag (un)qualified tag name string of attribute @return reference to xsd__anyAttribute attribute node (new attribute node if none matches in the list) */ soap_dom_attribute& att(const char *tag); /** @brief Add an attribute node to this xsd__anyAttribute DOM attribute node to create or extend an attribute list, same as att(NULL, tag) @param tag (un)qualified tag name wide string of attribute @return reference to xsd__anyAttribute attribute node (new attribute node if none matches in the list) */ soap_dom_attribute& att(const wchar_t *tag); /** @brief Add an attribute node to this xsd__anyAttribute DOM attribute node to create or extend an attribute list @param ns namespace URI string or NULL of attribute @param tag (un)qualified tag name string of attribute @return reference to xsd__anyAttribute attribute node (new attribute node if none matches in the list) */ soap_dom_attribute& att(const char *ns, const char *tag); /** @brief Add an attribute node to this xsd__anyAttribute DOM attribute node to create or extend an attribute list @param ns namespace URI string or NULL of attribute @param tag (un)qualified tag name wide string of attribute @return reference to xsd__anyAttribute attribute node (new attribute node if none matches in the list) */ soap_dom_attribute& att(const char *ns, const wchar_t *tag); /** @brief Match the namespace URI and tag name of this xsd__anyAttribute DOM attribute node against a pattern, same as match(NULL, patt) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any) @return true if match */ bool match(const char *patt) const; /** @brief Match the namespace URI and tag name of this xsd__anyAttribute DOM attribute node against a pattern, same as match(NULL, patt) @param patt (un)qualified tag name wide string pattern (NULL, "*", and "*:*" match any) @return true if match */ bool match(const wchar_t *patt) const; /** @brief Match the namespace URI and tag name of this xsd__anyAttribute DOM attribute node against a pattern @param ns namespace URI string pattern ("*" matches any, NULL and "" match the null (empty) namespace) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any) @return true if match */ bool match(const char *ns, const char *patt) const; /** @brief Match the namespace URI and tag name of this xsd__anyAttribute DOM attribute node against a pattern @param ns namespace URI string pattern ("*" matches any, NULL and "" match the null (empty) namespace) @param patt (un)qualified tag name wide string pattern (NULL, "*", and "*:*" match any) @return true if match */ bool match(const char *ns, const wchar_t *patt) const; /** @brief Get the namespace URI of this xsd__anyAttribute DOM attribute node @return namespace URI string or NULL */ const char *ns() const; /** @brief Get the tag name of this xsd__anyAttribute DOM attribute node @return tag name string or NULL */ const char *tag() const; /** @brief Return true if this xsd__anyAttribute DOM attribute node text is Boolean "true" or "1" @return true if "true" or "1" */ bool is_true() const; /** @brief Return true if this xsd__anyAttribute DOM attribute node text is Boolean "false" or "0" @return true if "false" or "0" */ bool is_false() const; /** @brief Return 64 bit integer value of numeric text of this xsd__anyAttribute DOM attribute node @return 64 bit integer value or 0 if text is not numeric */ LONG64 get_int() const; /** @brief Return double float value of decimal text of this xsd__anyAttribute DOM attribute node @return double float value or NaN if text is not numeric */ double get_double() const; /** @brief Return text of this xsd__anyAttribute DOM attribute node @return string or NULL */ const char *get_text() const; /** @brief Return true if this xsd__anyAttribute DOM attribute node text is Boolean "true" or "1", same as is_true() @return true if "true" or "1" */ operator bool() const; /** @brief Return integer value of numeric text of this xsd__anyAttribute DOM attribute node, same as (int)get_int() @return integer value or 0 if text is not numeric */ operator int() const; /** @brief Return 64 bit integer value of numeric text of this xsd__anyAttribute DOM attribute node, same as get_int() @return 64 bit integer value or 0 if text is not numeric */ operator LONG64() const; /** @brief Return double float value of decimal text of this xsd__anyAttribute DOM attribute node, same as get_double() @return double float value or NaN if text is not numeric */ operator double() const; /** @brief Return text of this xsd__anyAttribute DOM attribute node, same as get_text() @return string or NULL */ operator const char*() const; /** @brief Return iterator to begin of attribute nodes starting with this attribute @return xsd__anyAttribute::iterator */ soap_dom_attribute_iterator att_begin(); /** @brief Return iterator to end of attribute nodes @return xsd__anyAttribute::iterator */ soap_dom_attribute_iterator att_end(); /** @brief Return iterator to search for matching attributes of this node, same as att_find(NULL, patt) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any) @return xsd__anyAttribute::iterator */ soap_dom_attribute_iterator att_find(const char *patt); /** @brief Return iterator to search for matching attributes of this node, same as att_find(NULL, patt) @param patt (un)qualified tag name wide string pattern (NULL, "*", and "*:*" match any) @return xsd__anyAttribute::iterator */ soap_dom_attribute_iterator att_find(const wchar_t *patt); /** @brief Return iterator to search for matching attributes of this node @param ns namespace URI string pattern ("*" matches any, "" matches the null (empty) namespace, NULL matches the null (empty) namespace if tag is unqualified or the namespace from namespace table if tag is qualified) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any) @return xsd__anyAttribute::iterator */ soap_dom_attribute_iterator att_find(const char *ns, const char *patt); /** @brief Return iterator to search for matching attributes of this node @param ns namespace URI string pattern ("*" matches any, "" matches the null (empty) namespace, NULL matches the null (empty) namespace if tag is unqualified or the namespace from namespace table if tag is qualified) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any) @return xsd__anyAttribute::iterator */ soap_dom_attribute_iterator att_find(const char *ns, const wchar_t *patt); void unlink(); }; /** @brief The xsd__anyAttribute DOM attribute node structure (xsd__anyAttribute is a typedef of soap_dom_attribute) */ typedef soap_dom_attribute xsd__anyAttribute; /** @class soap_dom_element @brief The xsd__anyType DOM element node structure (xsd__anyType is a typedef of soap_dom_element). */ struct soap_dom_element { struct soap_dom_element *next; ///< next sibling element node in list struct soap_dom_element *prnt; ///< pointer to parent node struct soap_dom_element *elts; ///< list of child element nodes struct soap_dom_attribute *atts; ///< list of attribute nodes const char *nstr; ///< namespace string const char *name; ///< (un)qualified tag name const char *lead; ///< leading XML content before start tag (used with WITH_DOM) const char *text; ///< text cdata in UTF-8 const char *code; ///< XML "code" (plain unconverted XML used with WTIH_DOM) const char *tail; ///< trailing XML content before end tag (used with WITH_DOM) const void *node; ///< pointer to serializable object int type; ///< SOAP_TYPE_T type of serializable object or 0 struct soap *soap; ///< soap context that manages this object /** iterator over sibling element node list */ typedef soap_dom_element_iterator iterator; /** @brief Construct new xsd__anyType DOM element "root" @param soap context that manages this object */ soap_dom_element(struct soap *soap = NULL); /** @brief Construct new xsd__anyType DOM element by (shallow) copying another element @param elt xsd__anyType DOM element copied */ soap_dom_element(const soap_dom_element& elt); /** @brief Construct new xsd__anyType DOM element with (un)qualified tag name, same as xsd__anyType(soap, NULL, tag) @param soap context that manages this object @param tag (un)qualified tag name string or NULL (unnamed node) */ soap_dom_element(struct soap *soap, const char *tag); /** @brief Construct new xsd__anyType DOM element with (un)qualified tag name, same as xsd__anyType(soap, NULL, tag) @param soap context that manages this object @param tag (un)qualified tag name wide string or NULL (unnamed node) */ soap_dom_element(struct soap *soap, const wchar_t *tag); /** @brief Construct new xsd__anyType DOM element with namespace URI (xmlns) and (un)qualified tag name @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name string or NULL (unnamed node) */ soap_dom_element(struct soap *soap, const char *ns, const char *tag); /** @brief Construct new xsd__anyType DOM element with namespace URI (xmlns) and (un)qualified tag name @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name wide string or NULL (unnamed node) */ soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag); /** @brief Construct new xsd__anyType DOM element with namespace URI (xmlns), (un)qualified tag name, and text @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name string or NULL (unnamed node) @param text string or NULL */ soap_dom_element(struct soap *soap, const char *ns, const char *tag, const char *text); /** @brief Construct new xsd__anyType DOM element with namespace URI (xmlns), (un)qualified tag name, and text @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name string or NULL (unnamed node) @param text wide string or NULL */ soap_dom_element(struct soap *soap, const char *ns, const char *tag, const wchar_t *text); /** @brief Construct new xsd__anyType DOM element with namespace URI (xmlns), (un)qualified tag name, and text @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name wide string or NULL (unnamed node) @param text string or NULL */ soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag, const char *text); /** @brief Construct new xsd__anyType DOM element with namespace URI (xmlns), (un)qualified tag name, and text @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name wide string or NULL (unnamed node) @param text wide string or NULL */ soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag, const wchar_t *text); /** @brief Construct new xsd__anyType DOM element with namespace URI (xmlns), (un)qualified tag name, and text @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name string or "" (unnamed node) @param text string */ soap_dom_element(struct soap *soap, const char *ns, const char *tag, const std::string& text); /** @brief Construct new xsd__anyType DOM element with namespace URI (xmlns), (un)qualified tag name, and text @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name wide string or "" (unnamed node) @param text string */ soap_dom_element(struct soap *soap, const char *ns, const char *tag, const std::wstring& text); /** @brief Construct new xsd__anyType DOM element with namespace URI (xmlns), (un)qualified tag name, and text @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name string or "" (unnamed node) @param text wide string */ soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag, const std::string& text); /** @brief Construct new xsd__anyType DOM element with namespace URI (xmlns), (un)qualified tag name, and text @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name wide string or "" (unnamed node) @param text wide string */ soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag, const std::wstring& text); /** @brief Construct new xsd__anyType DOM element node with namespace URI (xmlns), (un)qualified tag name, and pointer to a serializable object @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name string or NULL (unnamed node) @param node pointer to serializable object @param type SOAP_TYPE_T type of the serializable object of type T */ soap_dom_element(struct soap *soap, const char *ns, const char *tag, const void *node, int type); /** @brief Construct new xsd__anyType DOM element node with namespace URI (xmlns), (un)qualified tag name, and pointer to a serializable object @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name wide string or NULL (unnamed node) @param node pointer to serializable object @param type SOAP_TYPE_T type of the serializable object of type T */ soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag, const void *node, int type); /** @brief Destructor (no-op, deletes are done by the managing context of this object) */ ~soap_dom_element(); /** @brief Set xsd__anyType DOM element namespace URI and tag name @param ns namespace URI string or NULL @param tag (un)qualified tag name string or NULL (unnamed node) @return reference to *this */ soap_dom_element& set(const char *ns, const char *tag); /** @brief Set xsd__anyType DOM element namespace URI and tag name @param ns namespace URI string or NULL @param tag (un)qualified tag name wide string or NULL (unnamed node) @return reference to *this */ soap_dom_element& set(const char *ns, const wchar_t *tag); /** @brief Set text of this xsd__anyType DOM element node to Boolean "false" or "true" @param b Boolean value @return reference to *this */ soap_dom_element& set(bool b); /** @brief Set text of this xsd__anyType DOM element node to an integer value @param n integer value @return reference to *this */ soap_dom_element& set(int n); /** @brief Set text of this xsd__anyType DOM element node to an integer value @param n integer value @return reference to *this */ soap_dom_element& set(LONG64 n); /** @brief Set text of this xsd__anyType DOM element node to a float value @param x float value (NaN and +/-INF are also supported) @return reference to *this */ soap_dom_element& set(float x); /** @brief Set text of this xsd__anyType DOM element node to a double float value @param x double float value (NaN and +/-INF are also supported) @return reference to *this */ soap_dom_element& set(double x); /** @brief Set text of this xsd__anyType DOM element node @param text string or NULL @return reference to *this */ soap_dom_element& set(const char *text); /** @brief Set text of this xsd__anyType DOM element node @param text wide string or NULL @return reference to *this */ soap_dom_element& set(const wchar_t *text); /** @brief Set text of this xsd__anyType DOM element node @param text string @return reference to *this */ soap_dom_element& set(const std::string& text); /** @brief Set text of this xsd__anyType DOM element node @param text wide string @return reference to *this */ soap_dom_element& set(const std::wstring& text); /** @brief Set this xsd__anyType DOM element node to point to a serializable object @param node pointer to serializable object @param type SOAP_TYPE_T type of the serializable object of type T @return reference to *this */ soap_dom_element& set(const void *node, int type); /** @brief Add a child element node to this xsd__anyType DOM element node @param elt reference to element node to copy and add as a child @return reference to *this */ soap_dom_element& add(soap_dom_element& elt); /** @brief Add a child element node to this xsd__anyType DOM element node @param elt pointer to element node to copy and add as a child @return reference to *this */ soap_dom_element& add(soap_dom_element *elt); /** @brief Add an attribute node to this xsd__anyType DOM element node @param att reference to xsd__anyAttribute attribute node to copy and add @return reference to *this */ soap_dom_element& add(soap_dom_attribute& att); /** @brief Add an attribute node to this xsd__anyType DOM element node @param att pointer to xsd__anyAttribute attribute node to copy and add @return reference to *this */ soap_dom_element& add(soap_dom_attribute *att); /** @brief Copy list of element nodes to this xsd__anyType DOM element node as children @param elts reference to list of xsd__anyType DOM element nodes to copy and add as children @return reference to *this */ soap_dom_element& adds(soap_dom_element& elts); /** @brief Copy list of element nodes to this xsd__anyType DOM element node as children @param elts pointer to list of xsd__anyType DOM element nodes to copy and add as children @return reference to *this */ soap_dom_element& adds(soap_dom_element *elts); /** @brief Copy list of attribute nodes to this xsd__anyType DOM element node @param atts reference to list of xsd__anyAttribute attribute nodes to copy and add @return reference to *this */ soap_dom_element& adds(soap_dom_attribute& atts); /** @brief Copy list of attribute nodes to this xsd__anyType DOM element node @param atts pointer to list of xsd__anyAttribute attribute nodes to copy and add @return reference to *this */ soap_dom_element& adds(soap_dom_attribute *atts); /** @brief Set text of this xsd__anyType DOM element node to Boolean "false" or "true", same as set(b) @param b Boolean value @return reference to *this */ soap_dom_element& operator=(bool b); /** @brief Set text of this xsd__anyType DOM element node to an integer value, same as set(n) @param n integer value @return reference to *this */ soap_dom_element& operator=(int n); /** @brief Set text of this xsd__anyType DOM element node to an integer value, same as set(n) @param n 64 bit integer value @return reference to *this */ soap_dom_element& operator=(LONG64 n); /** @brief Set text of this xsd__anyType DOM element node to a float value, same as set(x) @param x float value (NaN and +/-INF are also supported) @return reference to *this */ soap_dom_element& operator=(float x); /** @brief Set text of this xsd__anyType DOM element node to a double float value, same as set(x) @param x double float value (NaN and +/-INF are also supported) @return reference to *this */ soap_dom_element& operator=(double x); /** @brief Set text of this xsd__anyType DOM element node, same as set(text) @param text string or NULL @return reference to *this */ soap_dom_element& operator=(const char *text); /** @brief Set text of this xsd__anyType DOM element node, same as set(text) @param text wide string or NULL @return reference to *this */ soap_dom_element& operator=(const wchar_t *text); /** @brief Set text of this xsd__anyType DOM element node, same as set(text) @param text string @return reference to *this */ soap_dom_element& operator=(const std::string& text); /** @brief Set text of this xsd__anyType DOM element node, same as set(text) @param text wide string @return reference to *this */ soap_dom_element& operator=(const std::wstring& text); /** @brief Copy an xsd__anyType DOM element node to this node (not a deep copy) @param elt reference to xsd__anyType DOM element node to copy from @return reference to *this */ soap_dom_element& operator=(const soap_dom_element& elt); /** @brief Set this xsd__anyType DOM element node to point to a serializable object @param obj reference to serializable object that has a soap_type() member @return reference to *this */ template soap_dom_element& operator=(const T& obj); /** @brief Set this xsd__anyType DOM element node to point to a serializable object @param obj pointer to serializable object that has a soap_type() member @return reference to *this */ template soap_dom_element& operator=(const T *obj); /** @brief Set this xsd__anyType DOM element node to point to a serializable object @param obj pointer to serializable object that has a soap_type() member @return reference to *this */ template soap_dom_element& operator=(T *obj); /** @brief Populate this xsd__anyType DOM element node with an attribute node, same as att(NULL, tag) @param tag (un)qualified tag name string of attribute @return reference to xsd__anyAttribute attribute node (new attribute node if none matches) */ soap_dom_attribute& att(const char *tag); /** @brief Populate this xsd__anyType DOM element node with an attribute node, same as att(NULL, tag) @param tag (un)qualified tag name wide string of attribute @return reference to xsd__anyAttribute attribute node (new attribute node if none matches) */ soap_dom_attribute& att(const wchar_t *tag); /** @brief Populate this xsd__anyType DOM element node with an attribute node @param ns namespace URI string or NULL of attribute @param tag (un)qualified tag name string of attribute @return reference to xsd__anyAttribute attribute node (new attribute node if none matches) */ soap_dom_attribute& att(const char *ns, const char *tag); /** @brief Populate this xsd__anyType DOM element node with an attribute node @param ns namespace URI string or NULL of attribute @param tag (un)qualified tag name wide string of attribute @return reference to xsd__anyAttribute attribute node (new attribute node if none matches) */ soap_dom_attribute& att(const char *ns, const wchar_t *tag); /** @brief Populate this xsd__anyType DOM element node with an unnamed (tagless) child element node, same as elt(NULL, "") @return reference to child element node (new child element node if none matches) */ soap_dom_element& elt(); /** @brief Populate this xsd__anyType DOM element node with a child element node, same as elt(NULL, tag) @param tag (un)qualified tag name string of child element or NULL (unnamed node) @return reference to child element node (new child element node if none matches) */ soap_dom_element& elt(const char *tag); /** @brief Populate this xsd__anyType DOM element node with a child element node, same as elt(NULL, tag) @param tag (un)qualified tag name wide string of child element or NULL (unnamed node) @return reference to child element node (new child element node if none matches) */ soap_dom_element& elt(const wchar_t *tag); /** @brief Populate this xsd__anyType DOM element node with a child element node @param ns namespace URI string or NULL of child element @param tag (un)qualified tag name string of child element or NULL (unnamed node) @return reference to child element node (new child element node if none matches) */ soap_dom_element& elt(const char *ns, const char *tag); /** @brief Populate this xsd__anyType DOM element node with a child element node @param ns namespace URI string or NULL of child element @param tag (un)qualified tag name wide string of child element or NULL (unnamed node) @return reference to child element node (new child element node if none matches) */ soap_dom_element& elt(const char *ns, const wchar_t *tag); /** @brief Populate this xsd__anyType DOM element node with a child element node, same as elt(NULL, tag) @param tag (un)qualified tag name wide string of child element or NULL (unnamed node) @return reference to child element node (new child element node if none matches) */ soap_dom_element& operator[](const char *tag); /** @brief Populate this xsd__anyType DOM element node with a child element node, same as elt(NULL, tag) @param tag (un)qualified tag name wide string of child element or NULL (unnamed node) @return reference to child element node (new child element node if none matches) */ soap_dom_element& operator[](const wchar_t *tag); /** @brief Add a N-th child element with the same namespace and tag name as this xsd__anyType DOM element node that is a child element node at position one (1) in a sibling list @param n additional child element position requested, counting from one (1) XPath style @return reference to xsd__anyType child element node (new child element node if none exists at position n) */ soap_dom_element& operator[](size_t n); /** @brief Get attribute node of this xsd__anyType DOM element node, if attribute exists, same as att_get(NULL, tag) @param tag (un)qualified tag name string of attribute @return pointer to xsd__anyAttribute DOM attribute node or NULL if not exists */ soap_dom_attribute *att_get(const char *tag) const; /** @brief Get attribute node of this xsd__anyType DOM element node, if attribute exists, same as att_get(NULL, tag) @param tag (un)qualified tag name wide string of attribute @return pointer to xsd__anyAttribute DOM attribute node or NULL if not exists */ soap_dom_attribute *att_get(const wchar_t *tag) const; /** @brief Get attribute node of this xsd__anyType DOM element node, if attribute exists @param ns namespace URI string (NULL matches the null (empty) namespace if tag is unqualified) of attribute @param tag (un)qualified tag name string of attribute @return pointer to xsd__anyAttribute DOM attribute node or NULL if not exists */ soap_dom_attribute *att_get(const char *ns, const char *tag) const; /** @brief Get attribute node of this xsd__anyType DOM element node, if attribute exists @param ns namespace URI string (NULL matches the null (empty) namespace if tag is unqualified) of attribute @param tag (un)qualified tag name wide string of attribute @return pointer to xsd__anyAttribute DOM attribute node or NULL if not exists */ soap_dom_attribute *att_get(const char *ns, const wchar_t *tag) const; /** @brief Get unnamed (tagless) child element node of this xsd__anyType DOM element node, if child element exists, same as elt_get(NULL, NULL) or elt_get(NULL, ""); @return pointer to xsd__anyType DOM child element node or NULL if not exists */ soap_dom_element *elt_get() const; /** @brief Get child element node of this xsd__anyType DOM element node, if child element exists @param tag (un)qualified tag name string (NULL matches unnamed node) of child element @return pointer to xsd__anyType DOM child element node or NULL if not exists */ soap_dom_element *elt_get(const char *tag) const; /** @brief Get child element node of this xsd__anyType DOM element node, if child element exists, same as elt_get(NULL, tag) @param tag (un)qualified tag name wide string (NULL matches unnamed node) of child element @return pointer to xsd__anyType DOM child element node or NULL if not exists */ soap_dom_element *elt_get(const wchar_t *tag) const; /** @brief Get child element node of this xsd__anyType DOM element node, if child element exists @param ns namespace URI string (NULL matches the null (empty) namespace if tag is unqualified) of child element @param tag (un)qualified tag name string (NULL matches unnamed node) of child element @return pointer to xsd__anyType DOM child element node or NULL if not exists */ soap_dom_element *elt_get(const char *ns, const char *tag) const; /** @brief Get child element node of this xsd__anyType DOM element node, if child element exists @param ns namespace URI string (NULL matches the null (empty) namespace if tag is unqualified) of child element @param tag (un)qualified tag name wide string (NULL matches unnamed node) of child element @return pointer to xsd__anyType DOM child element node or NULL if not exists */ soap_dom_element *elt_get(const char *ns, const wchar_t *tag) const; /** @brief Get next child element node that has the same namespace URI and tag name as this child element node in a sibling list @return pointer to xsd__anyType DOM child element node or NULL if not exists */ soap_dom_element *get_next() const; /** @brief Get N-th child element node that has the same namespace URI and tag name as this child element node at position one (1) in a sibling list @param n N-th element minus one located from the current element node at position one (1), 1 returns this element node @return pointer to xsd__anyType DOM child element node or NULL if not exists */ soap_dom_element *get_nth(size_t n); /** @brief Match the namespace URI and tag name of this xsd__anyType DOM element node against a pattern @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any, "" matches unnamed node) @return true if match */ bool match(const char *patt) const; /** @brief Match the namespace URI and tag name of this xsd__anyType DOM element node against a pattern, same as match(NULL, patt) @param patt (un)qualified tag name wide string pattern (NULL, "*", and "*:*" match any, "" matches unnamed node) @return true if match */ bool match(const wchar_t *patt) const; /** @brief Match the namespace URI and tag name of this xsd__anyType DOM element node against a pattern, same as match(NULL, patt) @param ns namespace URI string pattern ("*" matches any, NULL and "" match the null (empty) namespace) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any, "" matches unnamed node) @return true if match */ bool match(const char *ns, const char *patt) const; /** @brief Match the namespace URI and tag name of this xsd__anyType DOM element node against a pattern @param ns namespace URI string pattern ("*" matches any, NULL and "" match the null (empty) namespace) @param patt (un)qualified tag name wide string pattern (NULL, "*", and "*:*" match any, "" matches unnamed node) @return true if match */ bool match(const char *ns, const wchar_t *patt) const; /** @brief Get the namespace URI of this xsd__anyType DOM element node @return namespace URI string or NULL */ const char *ns() const; /** @brief Get the tag name of this xsd__anyType DOM element node @return tag name string or NULL */ const char *tag() const; /** @brief Return pointer to parent of this xsd__anyType DOM element node, if any @return pointer to xsd__anyType DOM element or NULL */ soap_dom_element *parent(); /** @brief Return depth from the root node of this xsd__anyType DOM element node @return depth from root node, zero if node is a root node and has no parent */ size_t depth() const; /** @brief Return child index of this xsd__anyType DOM child element node in its sibling list @return nonzero index of child among siblings, or 0 if node is a root node and has no parent */ size_t index() const; /** @brief Return number of siblings of this xsd__anyType DOM child node that have the same namespace URI and tag name @return number of siblings plus one (for self) that have the same namespace URI and tag name */ size_t len() const; /** @brief Return index of this xsd__anyType DOM child node among siblings that have the same namespace URI and tag name @return nonzero N-th index (1 <= nth <= len), or 0 if element is root or is singular (has no siblings with the same namespace URI and tag name) */ size_t nth() const; /** @brief Return number of child element nodes of this xsd__anyType DOM element node, same as elt_size(NULL, NULL) @return number of child elements */ size_t elt_size(); /** @brief Return number of matching child element nodes of this xsd__anyType DOM element node, same as elt_size(NULL, patt, type) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any, "" matches unnamed node) @param type optional SOAP_TYPE_T type of deserialized object of type T to match or 0 @return number of matches found */ size_t elt_size(const char *patt, int type = 0); /** @brief Return number of matching child element nodes of this xsd__anyType DOM element node @param ns namespace URI string pattern ("*" matches any, "" matches the null (empty) namespace, NULL matches the null (empty) namespace if tag is unqualified or the namespace from namespace table if tag is qualified) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any, "" matches unnamed node) @param type optional SOAP_TYPE_T type of deserialized object of type T to match or 0 @return number of matches found */ size_t elt_size(const char *ns, const char *patt, int type = 0); /** @brief Return number of attribute nodes of this xsd__anyType DOM element node, same as att_size(NULL, NULL) @return number of attributes */ size_t att_size(); /** @brief Return number of matching attribute nodes of this xsd__anyType DOM element node, same as att_size(NULL, patt) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any) @return number of matches found */ size_t att_size(const char *patt); /** @brief Return number of matching attribute nodes of this xsd__anyType DOM element node @param ns namespace URI string pattern ("*" matches any, "" matches the null (empty) namespace, NULL matches the null (empty) namespace if tag is unqualified or the namespace from namespace table if tag is qualified) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any) @return number of matches found */ size_t att_size(const char *ns, const char *patt); /** @brief Return true if this xsd__anyType DOM element node text is Boolean "true" or "1" @return true if "true" or "1" */ bool is_true() const; /** @brief Return true if this xsd__anyType DOM element node text is Boolean "false" or "0" @return true if "false" or "0" */ bool is_false() const; /** @brief Return 64 bit integer value of numeric text of this xsd__anyType DOM element node @return 64 bit integer value or 0 if text is not numeric */ LONG64 get_int() const; /** @brief Return double float value of decimal text of this xsd__anyType DOM element node @return double float value or NaN if text is not numeric */ double get_double() const; /** @brief Return text of this xsd__anyType DOM element node @return string or NULL */ const char *get_text() const; /** @brief Return true if this xsd__anyType DOM element node text is Boolean "true" or "1", same as is_true() @return true if "true" or "1" */ operator bool() const; /** @brief Return integer value of numeric text of this xsd__anyType DOM element node, same as (int)get_int() @return integer value or 0 if text is not numeric */ operator int() const; /** @brief Return 64 bit integer value of numeric text of this xsd__anyType DOM element node, same as get_int() @return 64 bit integer value or 0 if text is not numeric */ operator LONG64() const; /** @brief Return double float value of decimal text of this xsd__anyType DOM element node, same as get_double() @return double float value or NaN if text is not numeric */ operator double() const; /** @brief Return text of this xsd__anyType DOM element node, same as get_text() @return string or NULL */ operator const char*() const; /** @brief Return iterator to begin of deep depth-first node graph traversal starting with this node @return xsd__anyType::iterator */ soap_dom_element_iterator begin(); /** @brief Return iterator to end of deep depth-first tnode graph traversal @return xsd__anyType::iterator */ soap_dom_element_iterator end(); /** @brief Return iterator to begin of child element nodes @return xsd__anyType::iterator */ soap_dom_element_iterator elt_begin(); /** @brief Return iterator to end of child element nodes @return xsd__anyType::iterator */ soap_dom_element_iterator elt_end(); /** @brief Return iterator to begin of attribute nodes @return xsd__anyAttribute::iterator */ soap_dom_attribute_iterator att_begin(); /** @brief Return iterator to end of attribute nodes @return xsd__anyAttribute::iterator */ soap_dom_attribute_iterator att_end(); /** @brief Return iterator to search deep depth-first over node graph starting from this node, same as find(NULL, patt, type) @param patt (un)qualified tag name string pattern (use '@' to match attributes, NULL, "*", and "*:*" match any, "" matches unnamed node) @param type optional SOAP_TYPE_T type of deserialized object of type T to match or 0 @return xsd__anyType::iterator */ soap_dom_element_iterator find(const char *patt, int type = 0); /** @brief Return iterator to search deep depth-first over node graph starting from this node, same as find(NULL, patt, type) @param patt (un)qualified tag name wide string pattern (use '@' to match attributes, NULL, "*", and "*:*" match any, "" matches unnamed node) @param type optional SOAP_TYPE_T type of deserialized object of type T to match or 0 @return xsd__anyType::iterator */ soap_dom_element_iterator find(const wchar_t *patt, int type = 0); /** @brief Return iterator to search deep depth-first over node graph starting from this node @param ns namespace URI string pattern ("*" matches any, "" matches the null (empty) namespace, NULL matches the null (empty) namespace if tag is unqualified or the namespace from namespace table if tag is qualified) @param patt (un)qualified tag name string pattern (use '@' to match attributes, NULL, "*", and "*:*" match any, "" matches unnamed node) @param type optional SOAP_TYPE_T type of deserialized object of type T to match or 0 @return xsd__anyType::iterator */ soap_dom_element_iterator find(const char *ns, const char *patt, int type = 0); /** @brief Return iterator to search deep depth-first over node graph starting from this node @param ns namespace URI string pattern ("*" matches any, "" matches the null (empty) namespace, NULL matches the null (empty) namespace if tag is unqualified or the namespace from namespace table if tag is qualified) @param patt (un)qualified tag name wide string pattern (use '@' to match attributes, NULL, "*", and "*:*" match any, "" matches unnamed node) @param type optional SOAP_TYPE_T type of deserialized object of type T to match or 0 @return xsd__anyType::iterator */ soap_dom_element_iterator find(const char *ns, const wchar_t *patt, int type = 0); /** @brief Return iterator to search deep depth-first over node graph to find deserialized objects, starting from this node @param type optional SOAP_TYPE_T type of deserialized object of type T to match or 0 @return xsd__anyType::iterator */ soap_dom_element_iterator find(int type); /** @brief Return iterator to search for matching child elements of this node, same as elt_find(NULL, patt, type) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any, "" matches unnamed node) @param type optional SOAP_TYPE_T type of deserialized object of type T to match or 0 @return xsd__anyType::iterator */ soap_dom_element_iterator elt_find(const char *patt, int type = 0); /** @brief Return iterator to search for matching child elements of this node, same as elt_find(NULL, patt, type) @param patt (un)qualified tag name wide string pattern (NULL, "*", and "*:*" match any, "" matches unnamed node) @param type optional SOAP_TYPE_T type of deserialized object of type T to match or 0 @return xsd__anyType::iterator */ soap_dom_element_iterator elt_find(const wchar_t *patt, int type = 0); /** @brief Return iterator to search for matching child elements of this node @param ns namespace URI string pattern ("*" matches any, "" matches the null (empty) namespace, NULL matches the null (empty) namespace if tag is unqualified or the namespace from namespace table if tag is qualified) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any, "" matches unnamed node) @param type optional SOAP_TYPE_T type of deserialized object of type T to match or 0 @return xsd__anyType::iterator */ soap_dom_element_iterator elt_find(const char *ns, const char *patt, int type = 0); /** @brief Return iterator to search for matching child elements of this node @param ns namespace URI string pattern ("*" matches any, "" matches the null (empty) namespace, NULL matches the null (empty) namespace if tag is unqualified or the namespace from namespace table if tag is qualified) @param patt (un)qualified tag name wide string pattern (NULL, "*", and "*:*" match any, "" matches unnamed node) @param type optional SOAP_TYPE_T type of deserialized object of type T to match or 0 @return xsd__anyType::iterator */ soap_dom_element_iterator elt_find(const char *ns, const wchar_t *patt, int type = 0); /** @brief Return iterator to search for child elements of this node that have deserialized objects @param type SOAP_TYPE_T type of deserialized object of type T to match or 0 @return xsd__anyType::iterator */ soap_dom_element_iterator elt_find(int type); /** @brief Return iterator to search for matching attributes of this node @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any, "" matches unnamed node) @return xsd__anyAttribute::iterator */ soap_dom_attribute_iterator att_find(const char *patt); /** @brief Return iterator to search for matching attributes of this node, same as att_find(NULL, patt) @param patt (un)qualified tag name wide string pattern (NULL, "*", and "*:*" match any) @return xsd__anyAttribute::iterator */ soap_dom_attribute_iterator att_find(const wchar_t *patt); /** @brief Return iterator to search for matching attributes of this node, same as att_find(NULL, patt) @param ns namespace URI string pattern ("*" matches any, "" matches the null (empty) namespace, NULL matches the null (empty) namespace if tag is unqualified or the namespace from namespace table if tag is qualified) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any) @return xsd__anyAttribute::iterator */ soap_dom_attribute_iterator att_find(const char *ns, const char *patt); /** @brief Return iterator to search for matching attributes of this node @param ns namespace URI string pattern ("*" matches any, "" matches the null (empty) namespace, NULL matches the null (empty) namespace if tag is unqualified or the namespace from namespace table if tag is qualified) @param patt (un)qualified tag name wide string pattern (NULL, "*", and "*:*" match any) @return xsd__anyAttribute::iterator */ soap_dom_attribute_iterator att_find(const char *ns, const wchar_t *patt); void unlink(); }; /** @brief The xsd__anyType DOM element node structure (xsd__anyType is a typedef of soap_dom_element). */ typedef soap_dom_element xsd__anyType; /** @brief Write XML to current output (this is an auto-generted macro in soapH.h) @param soap context that manages IO @param dom root element node of the XML document @return SOAP_OK or an error code */ int soap_write_xsd__anyType(struct soap *soap, xsd__anyType *dom); /** @brief Parse XML from current input (this is an auto-generted macro in soapH.h) @param soap context that manages IO @param dom root element node of the XML document @return SOAP_OK or an error code */ int soap_read_xsd__anyType(struct soap *soap, xsd__anyType *dom); #endif /******************************************************************************\ * * soap_dom_element class * \******************************************************************************/ soap_dom_element::soap_dom_element(struct soap *soap) { soap_default_xsd__anyType(soap, this); this->name = "root"; } /******************************************************************************/ soap_dom_element::soap_dom_element(const soap_dom_element& elt) { soap_default_xsd__anyType(elt.soap, this); (void)soap_elt_copy(this, &elt); } /******************************************************************************/ soap_dom_element::soap_dom_element(struct soap *soap, const char *tag) { soap_default_xsd__anyType(soap, this); (void)soap_elt_set(this, NULL, tag); } /******************************************************************************/ soap_dom_element::soap_dom_element(struct soap *soap, const wchar_t *tag) { soap_default_xsd__anyType(soap, this); (void)soap_elt_set_w(this, NULL, tag); } /******************************************************************************/ soap_dom_element::soap_dom_element(struct soap *soap, const char *ns, const char *tag) { soap_default_xsd__anyType(soap, this); (void)soap_elt_set(this, ns, tag); } /******************************************************************************/ soap_dom_element::soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag) { soap_default_xsd__anyType(soap, this); (void)soap_elt_set_w(this, ns, tag); } /******************************************************************************/ soap_dom_element::soap_dom_element(struct soap *soap, const char *ns, const char *tag, const char *text) { soap_default_xsd__anyType(soap, this); (void)soap_elt_text(soap_elt_set(this, ns, tag), text); } /******************************************************************************/ soap_dom_element::soap_dom_element(struct soap *soap, const char *ns, const char *tag, const wchar_t *text) { soap_default_xsd__anyType(soap, this); (void)soap_elt_text_w(soap_elt_set(this, ns, tag), text); } /******************************************************************************/ soap_dom_element::soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag, const char *text) { soap_default_xsd__anyType(soap, this); (void)soap_elt_text(soap_elt_set_w(this, ns, tag), text); } /******************************************************************************/ soap_dom_element::soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag, const wchar_t *text) { soap_default_xsd__anyType(soap, this); (void)soap_elt_text_w(soap_elt_set_w(this, ns, tag), text); } /******************************************************************************/ #ifndef WITH_COMPAT soap_dom_element::soap_dom_element(struct soap *soap, const char *ns, const char *tag, const std::string& text) { soap_default_xsd__anyType(soap, this); (void)soap_elt_text(soap_elt_set(this, ns, tag), text.c_str()); } #endif /******************************************************************************/ #ifndef WITH_COMPAT soap_dom_element::soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag, const std::string& text) { soap_default_xsd__anyType(soap, this); (void)soap_elt_text(soap_elt_set_w(this, ns, tag), text.c_str()); } #endif /******************************************************************************/ #ifndef WITH_COMPAT soap_dom_element::soap_dom_element(struct soap *soap, const char *ns, const char *tag, const std::wstring& text) { soap_default_xsd__anyType(soap, this); (void)soap_elt_text_w(soap_elt_set(this, ns, tag), text.c_str()); } #endif /******************************************************************************/ #ifndef WITH_COMPAT soap_dom_element::soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag, const std::wstring& text) { soap_default_xsd__anyType(soap, this); (void)soap_elt_text_w(soap_elt_set_w(this, ns, tag), text.c_str()); } #endif /******************************************************************************/ soap_dom_element::soap_dom_element(struct soap *soap, const char *ns, const char *tag, const void *node, int type) { soap_default_xsd__anyType(soap, this); (void)soap_elt_node(soap_elt_set(this, ns, tag), node, type); } /******************************************************************************/ soap_dom_element::soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag, const void *node, int type) { soap_default_xsd__anyType(soap, this); (void)soap_elt_node(soap_elt_set_w(this, ns, tag), node, type); } /******************************************************************************/ soap_dom_element::~soap_dom_element() { } /******************************************************************************/ soap_dom_element_iterator soap_dom_element::begin() { soap_dom_element_iterator iter = soap_dom_element_iterator(this); iter.stop = this; iter.deep = true; return iter; } /******************************************************************************/ soap_dom_element_iterator soap_dom_element::find(const char *ns, const char *patt, int type) { soap_dom_element_iterator iter(soap_dom_find(this, this, ns, patt, type)); iter.stop = this; iter.nstr = ns; iter.name = patt; iter.type = type; iter.deep = true; return iter; } /******************************************************************************/ soap_dom_element_iterator soap_dom_element::find(const char *ns, const wchar_t *tag, int type) { const char *s = soap_wchar2s(NULL, tag); soap_dom_element_iterator iter = this->find(ns, s, type); if (s) free((void*)s); return iter; } /******************************************************************************/ soap_dom_element_iterator soap_dom_element::find(int type) { return this->find((const char*)NULL, (const char*)NULL, type); } /******************************************************************************/ soap_dom_element_iterator soap_dom_element::elt_find(const char *ns, const char *patt, int type) { soap_dom_element_iterator iter(soap_elt_find_type(this, ns, patt, type)); iter.nstr = ns; iter.name = patt; iter.type = type; return iter; } /******************************************************************************/ soap_dom_element_iterator soap_dom_element::elt_find(const char *ns, const wchar_t *patt, int type) { const char *s = soap_wchar2s(NULL, patt); soap_dom_element_iterator iter = this->elt_find(ns, s, type); if (s) free((void*)s); return iter; } /******************************************************************************/ soap_dom_element_iterator soap_dom_element::elt_find(int type) { return this->elt_find((const char*)NULL, (const char*)NULL, type); } /******************************************************************************/ soap_dom_attribute_iterator soap_dom_element::att_find(const char *ns, const char *patt) { soap_dom_attribute_iterator iter(soap_att_find(this, ns, patt)); iter.nstr = ns; iter.name = patt; return iter; } /******************************************************************************/ soap_dom_attribute_iterator soap_dom_element::att_find(const char *ns, const wchar_t *patt) { const char *s = soap_wchar2s(NULL, patt); soap_dom_attribute_iterator iter = this->att_find(ns, s); if (s) free((void*)s); return iter; } /******************************************************************************/ void soap_dom_element::unlink() { soap_unlink(soap, this); soap_unlink(soap, nstr); soap_unlink(soap, name); soap_unlink(soap, text); if (elts) elts->unlink(); if (atts) atts->unlink(); if (next) next->unlink(); node = NULL; type = 0; } /******************************************************************************\ * * soap_dom_attribute class * \******************************************************************************/ soap_dom_attribute::soap_dom_attribute(struct soap *soap) { soap_default_xsd__anyAttribute(soap, this); } /******************************************************************************/ soap_dom_attribute::soap_dom_attribute(const soap_dom_attribute& att) { soap_default_xsd__anyAttribute(att.soap, this); (void)soap_att_copy(this, &att); } /******************************************************************************/ soap_dom_attribute::soap_dom_attribute(struct soap *soap, const char *tag) { soap_default_xsd__anyAttribute(soap, this); (void)soap_att_set(this, NULL, tag); } /******************************************************************************/ soap_dom_attribute::soap_dom_attribute(struct soap *soap, const wchar_t *tag) { soap_default_xsd__anyAttribute(soap, this); (void)soap_att_set_w(this, NULL, tag); } /******************************************************************************/ soap_dom_attribute::soap_dom_attribute(struct soap *soap, const char *ns, const char *tag, const char *text) { soap_default_xsd__anyAttribute(soap, this); (void)soap_att_text(soap_att_set(this, ns, tag), text); } /******************************************************************************/ soap_dom_attribute::soap_dom_attribute(struct soap *soap, const char *ns, const char *tag, const wchar_t *text) { soap_default_xsd__anyAttribute(soap, this); (void)soap_att_text_w(soap_att_set(this, ns, tag), text); } /******************************************************************************/ soap_dom_attribute::soap_dom_attribute(struct soap *soap, const char *ns, const wchar_t *tag, const char *text) { soap_default_xsd__anyAttribute(soap, this); (void)soap_att_text(soap_att_set_w(this, ns, tag), text); } /******************************************************************************/ soap_dom_attribute::soap_dom_attribute(struct soap *soap, const char *ns, const wchar_t *tag, const wchar_t *text) { soap_default_xsd__anyAttribute(soap, this); (void)soap_att_text_w(soap_att_set_w(this, ns, tag), text); } /******************************************************************************/ #ifndef WITH_COMPAT soap_dom_attribute::soap_dom_attribute(struct soap *soap, const char *ns, const char *tag, const std::string& text) { soap_default_xsd__anyAttribute(soap, this); (void)soap_att_text(soap_att_set(this, ns, tag), text.c_str()); } #endif /******************************************************************************/ #ifndef WITH_COMPAT soap_dom_attribute::soap_dom_attribute(struct soap *soap, const char *ns, const char *tag, const std::wstring& text) { soap_default_xsd__anyAttribute(soap, this); (void)soap_att_text_w(soap_att_set(this, ns, tag), text.c_str()); } #endif /******************************************************************************/ #ifndef WITH_COMPAT soap_dom_attribute::soap_dom_attribute(struct soap *soap, const char *ns, const wchar_t *tag, const std::string& text) { soap_default_xsd__anyAttribute(soap, this); (void)soap_att_text(soap_att_set_w(this, ns, tag), text.c_str()); } #endif /******************************************************************************/ #ifndef WITH_COMPAT soap_dom_attribute::soap_dom_attribute(struct soap *soap, const char *ns, const wchar_t *tag, const std::wstring& text) { soap_default_xsd__anyAttribute(soap, this); (void)soap_att_text_w(soap_att_set_w(this, ns, tag), text.c_str()); } #endif /******************************************************************************/ soap_dom_attribute::~soap_dom_attribute() { } /******************************************************************************/ soap_dom_attribute_iterator soap_dom_attribute::att_find(const char *ns, const char *patt) { soap_dom_attribute_iterator iter(this); iter.nstr = ns; iter.name = patt; if (patt) { if (!soap_patt_match(this->name, patt)) return ++iter; if (ns && (!this->nstr || strcmp(this->nstr, ns))) return ++iter; if (!ns && this->nstr) return ++iter; } return iter; } /******************************************************************************/ soap_dom_attribute_iterator soap_dom_attribute::att_find(const char *ns, const wchar_t *patt) { const char *s = soap_wchar2s(NULL, patt); soap_dom_attribute_iterator iter = this->att_find(ns, s); if (s) free((void*)s); return iter; } /******************************************************************************/ void soap_dom_attribute::unlink() { soap_unlink(soap, this); soap_unlink(soap, nstr); soap_unlink(soap, name); soap_unlink(soap, text); if (next) next->unlink(); } /******************************************************************************\ * * soap_dom_element_iterator class * \******************************************************************************/ soap_dom_element_iterator::soap_dom_element_iterator() { iter = NULL; stop = NULL; nstr = NULL; name = NULL; type = 0; deep = false; } /******************************************************************************/ soap_dom_element_iterator::soap_dom_element_iterator(soap_dom_element *node) { iter = node; stop = NULL; nstr = NULL; name = NULL; type = 0; deep = false; } /******************************************************************************/ soap_dom_element_iterator::~soap_dom_element_iterator() { } /******************************************************************************/ bool soap_dom_element_iterator::operator==(const soap_dom_element_iterator &it) const { return this->iter == it.iter; } /******************************************************************************/ bool soap_dom_element_iterator::operator!=(const soap_dom_element_iterator &it) const { return this->iter != it.iter; } /******************************************************************************/ soap_dom_element& soap_dom_element_iterator::operator*() const { return *this->iter; } /******************************************************************************/ soap_dom_element *soap_dom_element_iterator::operator->() const { return this->iter; } /******************************************************************************/ soap_dom_element_iterator &soap_dom_element_iterator::operator++() { if (deep) this->iter = soap_dom_find_next(this->iter, this->stop, this->nstr, this->name, this->type); else this->iter = soap_elt_find_next_type(this->iter, this->nstr, this->name, this->type); return *this; } /******************************************************************************/ soap_dom_element_iterator soap_dom_element_iterator::operator++(int) { soap_dom_element_iterator iter(*this); ++*this; return iter; } /******************************************************************************\ * * soap_dom_attribute_iterator class * \******************************************************************************/ soap_dom_attribute_iterator::soap_dom_attribute_iterator() { iter = NULL; nstr = NULL; name = NULL; } /******************************************************************************/ soap_dom_attribute_iterator::soap_dom_attribute_iterator(soap_dom_attribute *node) { this->iter = node; nstr = NULL; name = NULL; } /******************************************************************************/ soap_dom_attribute_iterator::~soap_dom_attribute_iterator() { } /******************************************************************************/ bool soap_dom_attribute_iterator::operator==(const soap_dom_attribute_iterator &it) const { return this->iter == it.iter; } /******************************************************************************/ bool soap_dom_attribute_iterator::operator!=(const soap_dom_attribute_iterator &it) const { return this->iter != it.iter; } /******************************************************************************/ soap_dom_attribute& soap_dom_attribute_iterator::operator*() const { return *this->iter; } /******************************************************************************/ soap_dom_attribute *soap_dom_attribute_iterator::operator->() const { return this->iter; } /******************************************************************************/ soap_dom_attribute_iterator &soap_dom_attribute_iterator::operator++() { this->iter = soap_att_find_next(this->iter, this->nstr, this->name); return *this; } /******************************************************************************/ soap_dom_attribute_iterator soap_dom_attribute_iterator::operator++(int) { soap_dom_attribute_iterator iter(*this); ++*this; return iter; } /******************************************************************************\ * * I/O * \******************************************************************************/ #ifndef WITH_COMPAT std::ostream &operator<<(std::ostream &o, const struct soap_dom_element &e) { if (!e.soap) { struct soap soap; soap_init1(&soap, SOAP_IO_DEFAULT | SOAP_DOM_TREE); soap_serialize_xsd__anyType(&soap, &e); if (soap_begin_send(&soap) || soap_out_xsd__anyType(&soap, NULL, 0, &e, NULL) || soap_end_send(&soap)) { /* error */ } soap_end(&soap); soap_done(&soap); } else { std::ostream *os = e.soap->os; e.soap->os = &o; soap_serialize_xsd__anyType(e.soap, &e); if (soap_begin_send(e.soap) || soap_out_xsd__anyType(e.soap, NULL, 0, &e, NULL) || soap_end_send(e.soap)) { /* e.soap->error is now set and app should check */ } e.soap->os = os; } return o; } /******************************************************************************/ std::istream &operator>>(std::istream &i, struct soap_dom_element &e) { if (!e.soap) e.soap = soap_new(); std::istream *is = e.soap->is; e.soap->is = &i; if (soap_begin_recv(e.soap) || soap_in_xsd__anyType(e.soap, NULL, &e, NULL) == NULL || soap_end_recv(e.soap)) { /* e.soap->error is now set and app should check */ } e.soap->is = is; return i; } #endif #endif gsoap-2.8.28/gsoap/.dirstamp0000644000175000017500000000000012653650144015215 0ustar ellertellertgsoap-2.8.28/gsoap/TandemNonStop/0000755000175000017500000000000012653650160016132 5ustar ellertellertgsoap-2.8.28/gsoap/TandemNonStop/tandem.c0000644000175000017500000002224312653650160017551 0ustar ellertellert/* tandem.c Tandem platform support for gSOAP. See README.txt and tandem.h for usage instructions. gSOAP XML Web services tools Copyright (C) 2000-2010, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under ONE of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "stdsoap2.h" #include "tandem.h" /* process name on the Tandem machine, used to set up sockets */ static const char *procname = NULL; static int fsend(struct soap*, const char*, size_t); static size_t frecv(struct soap*, char*, size_t); static int tcp_connect(struct soap*, const char *endpoint, const char *host, int port); static int tcp_disconnect(struct soap*); static int tcp_closesocket(struct soap*, SOAP_SOCKET); static int tcp_shutdownsocket(struct soap*, SOAP_SOCKET, int); /** @fn void tandem_init(struct soap *soap, const char *name) @brief Initialize soap context for use on the Tandem platform. Immediately use after creating a new soap context. @param soap context @param[in] name of process or NULL */ void tandem_init(struct soap *soap, const char *name) { procname = name; /* set callbacks */ /* soap->fresolve = tcp_gethost; not needed */ soap->fopen = tcp_connect; soap->fclose = tcp_disconnect; soap->fclosesocket = tcp_closesocket; soap->fshutdownsocket = tcp_shutdownsocket; soap->fsend = fsend; soap->frecv = frecv; /* soap->fpoll = soap_poll; enable when needed */ #ifdef SOAP_DEBUG /* in the new gsoap 2.7.16 we override this here rather than in stdsoap2.c: */ soap_set_test_logfile(soap, "TESTlog"); soap_set_sent_logfile(soap, "SENTlog"); soap_set_recv_logfile(soap, "RECVlog"); #endif } /** @fn void tandem_done(struct soap *soap) @brief Disengages soap context for use on the Tandem platform. @param soap context */ void tandem_done(struct soap *soap) { } /** @fn SOAP_SOCKET soap_bind(struct soap *soap, const char *host, int port, int backlog) @brief Binds to port. @param soap context @param[in] host name of machine (optional NULL) @param[in] port to bind @param[in] backlog queue size @return socket fd or -1 */ SOAP_SOCKET soap_bind(struct soap *soap, const char *host, int port, int backlog) { struct sockaddr_in sin; int optVal = 1; if (soap->master != -1) { soap->fclosesocket(soap, soap->master); soap->master = -1; } soap->socket = -1; if ((soap->master = socket(AF_INET, SOCK_STREAM, 0)) < 0) { soap->errnum = errno; soap_set_receiver_error(soap, "", "TCP socket failed in soap_bind()", SOAP_TCP_ERROR); return -1; } setsockopt( soap->master, SOL_SOCKET, SO_REUSEADDR, (char*)&optVal, sizeof(optVal)); memset((void*)&sin, 0, sizeof(sin)); sin.sin_family = AF_INET; sin.sin_addr.s_addr = INADDR_ANY; sin.sin_port = port; if (bind(soap->master, (struct sockaddr*)&sin, (int)sizeof(sin)) || listen(soap->master, backlog)) { soap->errnum = errno; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not bind to host\n")); soap_closesock(soap); soap_set_receiver_error(soap, "", "TCP bind failed in soap_bind()", SOAP_TCP_ERROR); return -1; } return soap->master; } /** @fn SOAP_SOCKET soap_accept(struct soap *soap) @brief Accepts new socket when bound to port. @param soap context @return socket fd or -1 */ SOAP_SOCKET soap_accept(struct soap *soap) { struct sockaddr_in sin; int val = SOAP_BUFLEN; int flen = sizeof(sin); memset((void*)&sin, 0, sizeof(sin)); soap->socket = accept(soap->master, (struct sockaddr*)&sin, &flen); setsockopt(soap->socket, SOL_SOCKET, SO_RCVBUF, (char*)&val, sizeof(val)); setsockopt(soap->socket, SOL_SOCKET, SO_SNDBUF, (char*)&val, sizeof(val)); return soap->socket; } /** @fn static size_t fsend(struct soap *soap, char *s, size_t n) @brief Callback override for soap->fsend to write data. @param soap context @param[in] s points to buffer to send @param[in] n size of buffer content @return SOAP_OK or error */ static int fsend(struct soap *soap, const char *s, size_t n) { if (soap->socket == -1) return SOAP_EOF; while (n) { register int nwritten = send(soap->socket, (char*)s, n, 0); if (nwritten < 0) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "send() error %s\n", errno)); soap->errnum = errno; return SOAP_EOF; } n -= nwritten; s += nwritten; } return SOAP_OK; } /** @fn static size_t frecv(struct soap *soap, char *s, size_t n) @brief Callback override for soap->frecv to read data. @param soap context @param s points to buffer to populate @param[in] n size of buffer space @return number of bytes (less or equal to n) written into s */ static size_t frecv(struct soap *soap, char *s, size_t n) { if (soap->socket == -1) return 0; soap->errnum = 0; for (;;) { register int r = recv(soap->socket, s, n, 0); if (r >= 0) return (size_t)r; /* We can check if there is a condition that warrants us to retry in the loop, here we just stop */ if (r < 0) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "recv() error %s\n", errno)); soap->errnum = errno; break; } } return 0; } /** @fn static int tcp_connect(struct soap *soap, const char *endpoint, const char *host, int port) @brief Callback override for soap->fopen to open a new connection. Also starts other communication-related objects such as SSL (when used). @param soap context @param[in] endpoint string @param[in] host name @param[in] port number @return fd of socket */ static int tcp_connect(struct soap *soap, const char *endpoint, const char *host, int port) { struct sockaddr_in sin; struct hostent *hostent; int val = SOAP_BUFLEN; if (soap->socket != -1) soap->fclosesocket(soap, soap->socket); fprintf(stderr, "Host=%s, port=%d\n", host, port); soap->socket = socket(AF_INET, SOCK_STREAM, 0); if (soap->socket < 0) { soap->errnum = errno; soap_set_sender_error(soap, "", "TCP socket failed in tcp_connect()", SOAP_TCP_ERROR); return -1; } memset((void*)&sin, 0, sizeof(sin)); sin.sin_family = AF_INET; if ((sin.sin_addr.s_addr = inet_addr(host)) == INET_ERROR) { if (!(hostent = gethostbyname((char*)host))) { soap_set_sender_error(soap, "", "TCP get host by name failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, soap->socket); return -1; } sin.sin_addr.s_addr = *(unsigned long*) (*(hostent->h_addr_list)); } else sin.sin_addr.s_addr = inet_addr(host); sin.sin_port = port; if (connect(soap->socket, (struct sockaddr*)&sin, (int)(sizeof(sin))) < 0) { soap_set_sender_error(soap, "", "TCP connect failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, soap->socket); return -1; } setsockopt(soap->socket, SOL_SOCKET, SO_RCVBUF, (char*)&val, sizeof(val)); setsockopt(soap->socket, SOL_SOCKET, SO_SNDBUF, (char*)&val, sizeof(val)); return soap->socket; } /** @fn static int tcp_disconnect(struct soap *soap) @brief Callback override for soap->fclose that closes the socket only when it is currently open. Also closes other communication-related objects such as SSL (when used). @param soap context @return SOAP_OK when successful */ static int tcp_disconnect(struct soap *soap) { if (soap->socket != -1) { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Closing socket %d\n", soap->socket)); soap->fclosesocket(soap, soap->socket); soap->socket = -1; } return SOAP_OK; } /** @fn static int tcp_closesocket(struct soap *soap, SOAP_SOCKET fd) @brief Callback override for soap->fclosesocket that closes the socket. @param soap context @param[in] fd of the socket @return value of close, 0 = successful */ static int tcp_closesocket(struct soap *soap, SOAP_SOCKET fd) { return FILE_CLOSE_(fd); } /** @fn static int tcp_shutdownsocket(struct soap *soap, SOAP_SOCKET fd, int how) @brief Callback override for soap->fshutdownsocket that shuts down socket read or write. May return 0 when shutdown operation is not supported on this platform. @param soap context @param[in] fd of the socket @param[in] how to shutdown the socket @return value of shutdown, 0 = successful */ static int tcp_shutdownsocket(struct soap *soap, SOAP_SOCKET fd, int how) { return shutdown(fd, how); } gsoap-2.8.28/gsoap/TandemNonStop/tandemnw.c0000644000175000017500000003227212653650160020121 0ustar ellertellert/* tandemnw.c Tandem platform support for gSOAP. See README.txt and tandem.h for usage instructions. gSOAP XML Web services tools Copyright (C) 2000-2010, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under ONE of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "stdsoap2.h" #include "tandem.h" /* process name on the Tandem machine, used to set up sockets */ static const char *procname = NULL; static int fsend(struct soap*, const char*, size_t); static size_t frecv(struct soap*, char*, size_t); static int tcp_connect(struct soap*, const char *endpoint, const char *host, int port); static int tcp_disconnect(struct soap*); static int tcp_closesocket(struct soap*, SOAP_SOCKET); static int tcp_shutdownsocket(struct soap*, SOAP_SOCKET, int); /** @fn void tandem_init(struct soap *soap, const char *name) @brief Initialize soap context for use on the Tandem platform. Immediately use after creating a new soap context. @param soap context @param[in] name of process or NULL */ void tandem_init(struct soap *soap, const char *name) { procname = name; /* set callbacks */ /* soap->fresolve = tcp_gethost; not needed */ soap->fopen = tcp_connect; soap->fclose = tcp_disconnect; soap->fclosesocket = tcp_closesocket; soap->fshutdownsocket = tcp_shutdownsocket; soap->fsend = fsend; soap->frecv = frecv; /* soap->fpoll = soap_poll; enable when needed */ #ifdef SOAP_DEBUG /* in the new gsoap 2.7.16 we override this here rather than in stdsoap2.c: */ soap_set_test_logfile(soap, "TESTlog"); soap_set_sent_logfile(soap, "SENTlog"); soap_set_recv_logfile(soap, "RECVlog"); #endif } /** @fn void tandem_done(struct soap *soap) @brief Disengages soap context for use on the Tandem platform. @param soap context */ void tandem_done(struct soap *soap) { /* TODO: cleanup as needed */ } /** @fn SOAP_SOCKET soap_bind(struct soap *soap, const char *host, int port, int backlog) @brief Binds to port. @param soap context @param[in] host name of machine (optional NULL) @param[in] port to bind @param[in] backlog queue size @return socket fd or -1 */ SOAP_SOCKET soap_bind(struct soap *soap, const char *host, int port, int backlog) { struct sockaddr_in sin; int retries = 50; short count; short err; int set = 1; long tag = 1; /* TODO: any reason to pick a special tag value? */ if (soap->master != -1) { soap->fclosesocket(soap, soap->master); soap->master = -1; } soap->socket = -1; /* TODO: check socket_nw params 0, 1, 0 */ if ((soap->master = socket_nw(AF_INET, SOCK_STREAM, 0, 1, 0)) < 0) { soap->errnum = errno; soap_set_receiver_error(soap, "", "TCP socket failed in soap_bind()", SOAP_TCP_ERROR); return -1; } AWAITIOX(&soap->master); /* optionally reuse address immediately */ if (setsockopt_nw(soap->master, SOL_SOCKET, SO_REUSEADDR, (char*)&set, sizeof(set), tag)) { soap->errnum = errno; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not bind to host\n")); soap_closesock(soap); soap_set_receiver_error(soap, "", "setsockopt failed in soap_bind()", SOAP_TCP_ERROR); } AWAITIOX(&soap->master); memset((void*)&sin, 0, sizeof(sin)); sin.sin_family = AF_INET; sin.sin_addr.s_addr = INADDR_ANY; sin.sin_port = port; do { if (bind_nw(soap->master, (struct sockaddr*)&sin, (int)sizeof(sin), tag)) { soap->errnum = errno; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not bind to host\n")); soap_closesock(soap); soap_set_receiver_error(soap, "", "TCP bind failed in soap_bind()", SOAP_TCP_ERROR); return -1; } AWAITIOX(&soap->master, , &count, &tag); FILEINFO(soap->master, &err); /* error 4114 then retry */ if (err == 4114 && retries--) DELAY(1000); else if (err) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not bind to host\n")); soap_closesock(soap); soap_set_receiver_error(soap, "", "TCP bind failed in soap_bind()", SOAP_TCP_ERROR); return -1; } } while (err); if (listen(soap->master, backlog)) { soap_closesock(soap); soap_set_receiver_error(soap, "", "TCP listen failed in soap_bind()", SOAP_TCP_ERROR); return -1; } /* TODO: AWAITIOX() needed here ?? */ return soap->master; } /** @fn SOAP_SOCKET soap_accept(struct soap *soap) @brief Accepts new socket when bound to port. @param soap context @return socket fd or -1 */ SOAP_SOCKET soap_accept(struct soap *soap) { struct sockaddr_in sin; int flen = sizeof(sin); short count; short err; long tag = 1; int val = SOAP_BUFLEN; soap->errnum = 0; memset((void*)&sin, 0, sizeof(sin)); /* retry until timeout, accept error, or success */ do { if (accept_nw(soap->master, (struct sockaddr*)&sin, &flen, tag) < 0) { soap_set_sender_error(soap, "", "TCP accept failed in soap_accept()", SOAP_TCP_ERROR); return -1; } /* TODO: need SETMODE(soap->master, 30, 3) here ?? */ if (soap->accept_timeout > 0) AWAITIOX(&soap->master, , &count, &tag, 100*soap->accept_timeout); else if (soap->accept_timeout < 0) AWAITIOX(&soap->master, , &count, &tag, (5000-soap->accept_timeout)/10000); else AWAITIOX(&soap->master, , &count, &tag); FILE_GETINFO_(soap->master, &err); if (err == 40) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "TCP accept timed out\n")); return -1; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_accept() FILE_GETINFO result = %d\n", err)); } while (err); /* TODO: check socket_nw params 0, 1, 0 */ if ((soap->socket = socket_nw(AF_INET, SOCK_STREAM, 0, 1, 0)) >= 0) { /* TODO: AWAITIOX() ?? */ accept_nw2(soap->socket, (struct sockaddr*)&sin, tag); AWAITIOX(&soap->socket); setsockopt_nw(soap->socket, SOL_SOCKET, SO_RCVBUF, (char*)&val, sizeof(val), tag); AWAITIOX(&soap->socket); setsockopt_nw(soap->socket, SOL_SOCKET, SO_SNDBUF, (char*)&val, sizeof(val), tag); AWAITIOX(&soap->socket); /* need to check timeouts here too, as above? */ } return soap->socket; } /** @fn static size_t fsend(struct soap *soap, char *s, size_t n) @brief Callback override for soap->fsend to write data. @param soap context @param[in] s points to buffer to send @param[in] n size of buffer content @return SOAP_OK or error */ static int fsend(struct soap *soap, const char *s, size_t n) { if (soap->socket == -1) return SOAP_EOF; soap->errnum = 0; while (n) { short nwritten; short err; long tag = 1; if (send_nw2(soap->socket, (char*)s, n, 0, tag)) return SOAP_EOF; if (soap->send_timeout > 0) AWAITIOX(&soap->socket, , &nwritten, &tag, 100*soap->send_timeout); else if (soap->send_timeout < 0) AWAITIOX(&soap->socket, , &nwritten, &tag, (5000-soap->send_timeout)/10000); else AWAITIOX(&soap->socket, , &nwritten, &tag); FILE_GETINFO_(soap->socket, &err); if (err == 40) return SOAP_EOF; nwritten = socket_get_len(soap->socket); if (err > 0) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "send() error %s\n", errno)); soap->errnum = errno; return SOAP_EOF; } n -= nwritten; s += nwritten; } return SOAP_OK; } /** @fn static size_t frecv(struct soap *soap, char *s, size_t n) @brief Callback override for soap->frecv to read data. @param soap context @param s points to buffer to populate @param[in] n size of buffer space @return number of bytes (less or equal to n) written into s */ static size_t frecv(struct soap *soap, char *s, size_t n) { if (soap->socket == -1) return 0; soap->errnum = 0; /* The loop is to retry as long as timout is not exceeded */ for (;;) { long tag = 1; short err; short r; if (recv_nw(soap->socket, s, n, 0, tag)) return 0; if (soap->recv_timeout > 0) AWAITIOX(&soap->socket, , &r, &tag, 100*soap->recv_timeout); else if (soap->recv_timeout < 0) AWAITIOX(&soap->socket, , &r, &tag, (5000-soap->recv_timeout)/10000); else AWAITIOX(&soap->socket, , &r, &tag); FILE_GETINFO_(soap->socket, &err); if (err == 40) break; if (r >= 0) return (size_t)r; if (err > 0) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "recv() error %s\n", errno)); soap->errnum = errno; break; } } return 0; } /** @fn static int tcp_connect(struct soap *soap, const char *endpoint, const char *host, int port) @brief Callback override for soap->fopen to open a new connection. Also starts other communication-related objects such as SSL (when used). @param soap context @param[in] endpoint string @param[in] host name @param[in] port number @return fd of socket */ static int tcp_connect(struct soap *soap, const char *endpoint, const char *host, int port) { struct sockaddr_in sin; struct hostent *hostent; int val = SOAP_BUFLEN; short count; short err; long tag = 1; if (soap->socket != -1) soap->fclosesocket(soap, soap->socket); /* TODO: check socket_nw params 0, 1, 1 */ soap->socket = socket_nw(AF_INET, SOCK_STREAM, 0, 1, 1); soap->errnum = 0; if (soap->socket < 0) { soap->errnum = errno; soap_set_sender_error(soap, "", "TCP socket failed in tcp_connect()", SOAP_TCP_ERROR); return -1; } AWAITIOX(&soap->socket); memset((void*)&sin, 0, sizeof(sin)); sin.sin_family = AF_INET; if ((sin.sin_addr.s_addr = inet_addr(host)) == INET_ERROR) { if (!(hostent = gethostbyname((char*)host))) { soap_set_sender_error(soap, "", "TCP get host by name failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, soap->socket); return -1; } sin.sin_addr.s_addr = *(unsigned long*) (*(hostent->h_addr_list)); } else sin.sin_addr.s_addr = inet_addr(host); sin.sin_port = port; /* retry until timeout, connect error, or success */ do { if (connect_nw(soap->socket, (struct sockaddr*)&sin, (int)(sizeof(sin)), tag) < 0) { soap_set_sender_error(soap, "", "TCP connect failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, soap->socket); return -1; } if (soap->connect_timeout > 0) AWAITIOX(&soap->socket, , , &tag, 100*soap->connect_timeout); else if (soap->connect_timeout < 0) AWAITIOX(&soap->socket, , , &tag, (5000-soap->connect_timeout)/10000); else AWAITIOX(&soap->socket); FILE_GETINFO_(soap->socket, &err); /* +++ More to do - what if there is an err? */ if (err == 40) { soap_set_sender_error(soap, "", "TCP connect timed out", SOAP_TCP_ERROR); soap->fclosesocket(soap, soap->socket); return -1; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "tcp_connect() FILE_GETINFO result = %d\n", err)); } while (err); setsockopt_nw(soap->socket, SOL_SOCKET, SO_RCVBUF, (char*)&val, sizeof(val), tag); AWAITIOX(&soap->socket); setsockopt_nw(soap->socket, SOL_SOCKET, SO_SNDBUF, (char*)&val, sizeof(val), tag); AWAITIOX(&soap->socket); return soap->socket; } /** @fn static int tcp_disconnect(struct soap *soap) @brief Callback override for soap->fclose that closes the socket only when it is currently open. Also closes other communication-related objects such as SSL (when used). @param soap context @return SOAP_OK when successful */ static int tcp_disconnect(struct soap *soap) { if (soap->socket != -1) { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Closing socket %d\n", soap->socket)); soap->fclosesocket(soap, soap->socket); soap->socket = -1; } return SOAP_OK; } /** @fn static int tcp_closesocket(struct soap *soap, SOAP_SOCKET fd) @brief Callback override for soap->fclosesocket that closes the socket. @param soap context @param[in] fd of the socket @return value of close, 0 = successful */ static int tcp_closesocket(struct soap *soap, SOAP_SOCKET fd) { return FILE_CLOSE_(fd); } /** @fn static int tcp_shutdownsocket(struct soap *soap, SOAP_SOCKET fd, int how) @brief Callback override for soap->fshutdownsocket that shuts down socket read or write. May return 0 when shutdown operation is not supported on this platform. @param soap context @param[in] fd of the socket @param[in] how to shutdown the socket @return value of shutdown, 0 = successful */ static int tcp_shutdownsocket(struct soap *soap, SOAP_SOCKET fd, int how) { long tag = 1; if (shutdown_nw(fd, how, tag) < 0) return -1; AWAITIOX(&fd); return 0; } gsoap-2.8.28/gsoap/TandemNonStop/client.c0000644000175000017500000000550012653650160017554 0ustar ellertellert/* calcclient.c Example calculator service client in C Compilation in C (see samples/calc/calc.h): > soapcpp2 -c calc.h > cc -o calcclient calcclient.c stdsoap2.c soapC.c soapClient.c -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2010, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" #include "calc.nsmap" #include "tandem.h" const char server[] = "http://websrv.cs.fsu.edu/~engelen/calcserver.cgi"; int main(int argc, char **argv) { struct soap soap; double a, b, result; if (argc < 4) { fprintf(stderr, "Usage: [add|sub|mul|div|pow] num num\n"); exit(0); } soap_init(&soap); tandem_init(&soap, argv[0]); socket_set_inet_name(argv[0]); /* ? See Tandem TCP/IP programming */ soap.send_timeout = 10; /* 10 sec */ soap.recv_timeout = 10; /* 10 sec */ a = strtod(argv[2], NULL); b = strtod(argv[3], NULL); switch (*argv[1]) { case 'a': soap_call_ns__add(&soap, server, "", a, b, &result); break; case 's': soap_call_ns__sub(&soap, server, "", a, b, &result); break; case 'm': soap_call_ns__mul(&soap, server, "", a, b, &result); break; case 'd': soap_call_ns__div(&soap, server, "", a, b, &result); break; case 'p': soap_call_ns__pow(&soap, server, "", a, b, &result); break; default: fprintf(stderr, "Unknown command\n"); exit(0); } if (soap.error) { soap_print_fault(&soap, stderr); exit(1); } else printf("result = %g\n", result); soap_destroy(&soap); soap_end(&soap); tandem_done(&soap); soap_done(&soap); return 0; } gsoap-2.8.28/gsoap/TandemNonStop/README.txt0000644000175000017500000000360512653650160017634 0ustar ellertellert The Tandem NonStop bridge enables the gSOAP toolkit for Tandem NonStop platforms. The bridge replaces the IO operation of the gSOAP engine with Tandem NonStop IO operations. The approach requires the code to be generated on any platform with the wsdl2h and soapcpp2 tools. The generated code can be compiled an run on Tandem using the bridge with the gSOAP engine (implemented in stdsoap2.c/.cpp). The wsdl2h and soapcpp2 tools will not run on Tandem, which would not be necessary. When your environment supports OSS sockets then this bridge is not required. Tandem NonStop bridge for gSOAP 2.8.0 and higher to support Guardian sockets: tandem.h Tandem IO bridge interface tandem.c Tandem blocking IO bridge tandemnw.c Tandem nonblocking IO (no wait) bridge Usage: Add to your client/server code the following: #include "tandem.h" struct soap *soap = soap_new(); tandem_init(soap, "ProcName"); socket_set_inet_name(argv[0]); // See Tandem docs ... // client or server code goes here as per gSOAP documentation soap_destroy(soap); soap_end(soap); tandem_done(soap); soap_free(soap); Compile flags for compiling the gSOAP software: -DTANDEM_NONSTOP Linkage requirements: Compile and link with tandem.c or tandemnw.c, and stdsoap2.c Use soapcpp2 option -p to generate shorter file names, for example: soapcpp2 -c -L -pT calc.h generates TStub.h TH.h TC.c TClient.c TServer.c To compile the examples: cc -DTANDEM_NONSTOP -o client client.c TC.c TClient.c stdsoap2.c tandem.c or cc -DTANDEM_NONSTOP -o client client.c TC.c TClient.c stdsoap2.c tandemnw.c cc -DTANDEM_NONSTOP -o server server.c TC.c TServer.c stdsoap2.c tandem.c or cc -DTANDEM_NONSTOP -o server server.c TC.c TServer.c stdsoap2.c tandemnw.c where 'cc' refers to your C compiler. Copyright Genivia Inc. Licensing GPL (GNU Public License) Or the Commercial-use license from Genivia Inc. gsoap-2.8.28/gsoap/TandemNonStop/calc.h0000644000175000017500000001034612653650160017211 0ustar ellertellert/* calc.h This is a gSOAP header file with web service definitions. The service operations and type definitions use familiar C/C++ syntax. The following methods are defined by this gSOAP service definition: add(a,b) sub(a,b) mul(a,b) div(a,b) pow(a,b) Compilation in C (see samples/calc): $ soapcpp2 -c calc.h $ cc -o calcclient calcclient.c stdsoap2.c soapC.c soapClient.c $ cc -o calcserver calcserver.c stdsoap2.c soapC.c soapServer.c Compilation in C++ (see samples/calc++): $ soapcpp2 -i calc.h $ cc -o calcclient++ calcclient.cpp stdsoap2.cpp soapC.cpp soapcalcProxy.cpp $ cc -o calcserver++ calcserver.cpp stdsoap2.cpp soapC.cpp soapcalcService.cpp Note that soapcpp2 option -i generates proxy and service classes, which encapsulate the method operations in the class instead of defining them as global functions as in C. The //gsoap directives are used to bind XML namespaces and to define Web service properties: //gsoap service name: //gsoap service style: [rpc|document] //gsoap service encoding: [literal|encoded] //gsoap service namespace: //gsoap service location: Web service operation properties: //gsoap service method-style: [rpc|document] //gsoap service method-encoding: [literal|encoded] //gsoap service method-action: //gsoap service method-documentation: and type schema properties: //gsoap schema namespace: //gsoap schema elementForm: [qualified|unqualified] //gsoap schema attributeForm: [qualified|unqualified] //gsoap schema documentation: //gsoap schema type-documentation: where is an XML namespace prefix, which is used in C/C++ operation names, e.g. ns__add(), and type names, e.g. xsd__int. See the documentation for the full list of //gsoap directives. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap ns service name: calc Simple calculator service //gsoap ns service style: rpc //gsoap ns service encoding: encoded //gsoap ns service namespace: http://websrv.cs.fsu.edu/~engelen/calc.wsdl //gsoap ns service location: http://websrv.cs.fsu.edu/~engelen/calcserver.cgi //gsoap ns schema namespace: urn:calc //gsoap ns service method-documentation: add Sums two values int ns__add(double a, double b, double *result); //gsoap ns service method-documentation: sub Subtracts two values int ns__sub(double a, double b, double *result); //gsoap ns service method-documentation: mul Multiplies two values int ns__mul(double a, double b, double *result); //gsoap ns service method-documentation: div Divides two values int ns__div(double a, double b, double *result); //gsoap ns service method-documentation: pow Raises a to b int ns__pow(double a, double b, double *result); gsoap-2.8.28/gsoap/TandemNonStop/tandem.h0000644000175000017500000000526312653650160017561 0ustar ellertellert/* tandem.h Tandem NonStop bridge for gSOAP 2.8.0 and higher: tandem.h Tandem IO tandem.c Tandem blocking IO tandem_nw.c Tandem nonblocking IO (no wait) Usage: Add to your client/server code the following set up: #include "tandem.h" struct soap *soap = soap_new(); tandem_init(soap, "ProcName"); socket_set_inet_name(argv[0]); // See Tandem docs ... // client or server code goes here as per gSOAP documentation soap_destroy(soap); soap_end(soap); tandem_done(soap); soap_free(soap); Compile flags for C/C++: -DTANDEM_NONSTOP Linkage requirements: Compile and link with tandem.c or tandem_nw.c Example: cc -DTANDEM_NONSTOP -o calcclient calcclient.c soapC.c soapClient.c stdsoap2.c tandem.c or cc -DTANDEM_NONSTOP -o calcclient calcclient.c soapC.c soapClient.c stdsoap2.c tandem_nw.c cc -DTANDEM_NONSTOP -o calcserver calcserver.c soapC.c soapServer.c stdsoap2.c tandem.c or cc -DTANDEM_NONSTOP -o calcserver calcserver.c soapC.c soapServer.c stdsoap2.c tandem_nw.c gSOAP XML Web services tools Copyright (C) 2000-2010, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under ONE of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ void tandem_init(struct soap *soap, const char *procname); void tandem_done(struct soap *soap); SOAP_SOCKET soap_bind(struct soap *soap, const char *host, int port, int backlog); SOAP_SOCKET soap_accept(struct soap *soap); gsoap-2.8.28/gsoap/TandemNonStop/server.c0000644000175000017500000000716312653650160017613 0ustar ellertellert/* calcserver.c Example calculator service in C Compilation in C (see samples/calc/calc.h): > soapcpp2 -c calc.h > cc -o calcserver calcserver.c stdsoap2.c soapC.c soapServer.c -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2010, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" #include "calc.nsmap" #include "tandem.h" int main(int argc, char **argv) { SOAP_SOCKET m, s; /* master and slave sockets */ struct soap soap; if (argc < 2) { fprintf(stderr, "Missing tcpip process and port\n"); fprintf(stderr, "Example: RUN CALCS $ZTC0 3456\n"); exit(-1); } soap_init(&soap); tandem_init(&soap, argv[1]); socket_set_inet_name(argv[1]); /* ? See Tandem TCP/IP programming */ soap.send_timeout = 10; /* 10 sec */ soap.recv_timeout = 10; /* 10 sec */ m = soap_bind(&soap, NULL, atoi(argv[2]), 100); if (m == -1) { soap_print_fault(&soap, stderr); exit(-1); } fprintf(stderr, "Socket connection successful: master socket = %d\n", m); for ( ; ; ) { s = soap_accept(&soap); fprintf(stderr, "Socket connection successful: slave socket = %d\n", s); if (s == -1) { soap_print_fault(&soap, stderr); break; } soap_serve(&soap); soap_end(&soap); } tandem_done(&soap); soap_done(&soap); return 0; } int ns__add(struct soap *soap, double a, double b, double *result) { *result = a + b; return SOAP_OK; } int ns__sub(struct soap *soap, double a, double b, double *result) { *result = a - b; return SOAP_OK; } int ns__mul(struct soap *soap, double a, double b, double *result) { *result = a * b; return SOAP_OK; } int ns__div(struct soap *soap, double a, double b, double *result) { if (b) *result = a / b; else { char *s = (char*)soap_malloc(soap, 1024); sprintf(s, "Can't divide %f by %f", a, b); return soap_sender_fault(soap, "Division by zero", s); } return SOAP_OK; } int ns__pow(struct soap *soap, double a, double b, double *result) { *result = pow(a, b); if (soap_errno == EDOM) /* soap_errno is like errno, but compatible with Win32 */ { char *s = (char*)soap_malloc(soap, 1024); sprintf(s, "Can't take the power of %f to %f", a, b); sprintf(s, "Can't take power of %f to %f", a, b); return soap_sender_fault(soap, "Power function domain error", s); } return SOAP_OK; } gsoap-2.8.28/gsoap/VisualStudio2005/0000755000175000017500000000000012653650160016343 5ustar ellertellertgsoap-2.8.28/gsoap/VisualStudio2005/README.md0000644000175000017500000000444112653650160017625 0ustar ellertellert Flex and Bison for Windows ========================== Visual Studio 2005 Solution files for soapcpp2 and wsdl2h are included. If not already installed, install the Platform SDK (R2) for `winsock2.h`. To build `soapcpp2.exe`, first install Bison and Flex (in the default dirs): then add the FlexBison.rules as explained here: These custom-build rules are used to build the scanner and parser for `soapcpp2.exe`. To build `wsdl2h.exe`, you first need to build `soapcpp2.exe` and install it in Program Files or copy it to the `wsdl` directory. This is needed to execute the custom-build step on `wsdl.h` to generate `wsdlStub.h`, `wsdlH.h`, and `wsdlC.cpp`. Build Rules for `soapcpp2.exe` VS 2008 and 2010 =============================================== To build `soapcpp2.exe` you need to install Flex and Bison. To do so, you need to create custom build rules to compile `.l` and `.y` files with Flex and Bison. Please see: In VS2008, there is UI available to help you create the custom build rule. Make sure you have `flex.exe`, `bison.exe`, and `m4.exe` on the system search path. - Right click on the `.l` file and select properties - Configuration -> All Configurations - General -> Item Typ e-> Custom Build Tool - Apply - Custom Build Tool -> General -> Command Line -> `flex -olexer.c lexer.l` - Custom Build Tool -> General -> Outputs -> `lexer.c` - Custom Build Tool -> General -> Additional Dependencies -> `parser.y parser.c` - Apply - Select the `.y` file in the solution explorer - Configuration -> All Configurations - General -> Item Type -> Custom Build Tool - Apply - Custom Build Tool -> General -> Command Line -> `bison -oparser.c parser.y` - Custom Build Tool -> General -> Outputs -> `parser.c parser.h` In VS2010, there may not be a UI available to create the custom build rules. To add or modify build rules in VS2010 you need to edit: `%ProgramFiles%\MSBuild\Microsoft.Cpp\v4.0\BuildCustomizations` and/or `%ProgramFiles(x86)%\MSBuild\Microsoft.Cpp\v4.0\BuildCustomizations` gsoap-2.8.28/gsoap/VisualStudio2005/soapcpp2/0000755000175000017500000000000012653650160020072 5ustar ellertellertgsoap-2.8.28/gsoap/VisualStudio2005/soapcpp2/soapcpp2/0000755000175000017500000000000012653650160021621 5ustar ellertellertgsoap-2.8.28/gsoap/VisualStudio2005/soapcpp2/soapcpp2/soapcpp2_yacc.tab.h0000644000175000017500000001275712653650160025301 0ustar ellertellert/* A Bison parser, made by GNU Bison 2.3. */ /* Skeleton interface for Bison's Yacc-like parsers in C Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. 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, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /* Tokens. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE /* Put the tokens into the symbol table, so that GDB and other debuggers know about them. */ enum yytokentype { PRAGMA = 258, AUTO = 259, DOUBLE = 260, INT = 261, STRUCT = 262, BREAK = 263, ELSE = 264, LONG = 265, SWITCH = 266, CASE = 267, ENUM = 268, REGISTER = 269, TYPEDEF = 270, CHAR = 271, EXTERN = 272, RETURN = 273, UNION = 274, CONST = 275, FLOAT = 276, SHORT = 277, UNSIGNED = 278, CONTINUE = 279, FOR = 280, SIGNED = 281, VOID = 282, DEFAULT = 283, GOTO = 284, SIZEOF = 285, VOLATILE = 286, DO = 287, IF = 288, STATIC = 289, WHILE = 290, CLASS = 291, PRIVATE = 292, PROTECTED = 293, PUBLIC = 294, VIRTUAL = 295, INLINE = 296, OPERATOR = 297, LLONG = 298, BOOL = 299, CFALSE = 300, CTRUE = 301, WCHAR = 302, TIME = 303, USING = 304, NAMESPACE = 305, ULLONG = 306, MUSTUNDERSTAND = 307, SIZE = 308, FRIEND = 309, TEMPLATE = 310, EXPLICIT = 311, TYPENAME = 312, MUTABLE = 313, FINAL = 314, null = 315, RESTRICT = 316, OVERRIDE = 317, UCHAR = 318, USHORT = 319, UINT = 320, ULONG = 321, NONE = 322, ID = 323, LAB = 324, TYPE = 325, LNG = 326, DBL = 327, CHR = 328, TAG = 329, STR = 330, RA = 331, LA = 332, OA = 333, XA = 334, AA = 335, MA = 336, DA = 337, TA = 338, NA = 339, PA = 340, OR = 341, AN = 342, NE = 343, EQ = 344, GE = 345, LE = 346, RS = 347, LS = 348, AR = 349, PP = 350, NN = 351 }; #endif /* Tokens. */ #define PRAGMA 258 #define AUTO 259 #define DOUBLE 260 #define INT 261 #define STRUCT 262 #define BREAK 263 #define ELSE 264 #define LONG 265 #define SWITCH 266 #define CASE 267 #define ENUM 268 #define REGISTER 269 #define TYPEDEF 270 #define CHAR 271 #define EXTERN 272 #define RETURN 273 #define UNION 274 #define CONST 275 #define FLOAT 276 #define SHORT 277 #define UNSIGNED 278 #define CONTINUE 279 #define FOR 280 #define SIGNED 281 #define VOID 282 #define DEFAULT 283 #define GOTO 284 #define SIZEOF 285 #define VOLATILE 286 #define DO 287 #define IF 288 #define STATIC 289 #define WHILE 290 #define CLASS 291 #define PRIVATE 292 #define PROTECTED 293 #define PUBLIC 294 #define VIRTUAL 295 #define INLINE 296 #define OPERATOR 297 #define LLONG 298 #define BOOL 299 #define CFALSE 300 #define CTRUE 301 #define WCHAR 302 #define TIME 303 #define USING 304 #define NAMESPACE 305 #define ULLONG 306 #define MUSTUNDERSTAND 307 #define SIZE 308 #define FRIEND 309 #define TEMPLATE 310 #define EXPLICIT 311 #define TYPENAME 312 #define MUTABLE 313 #define FINAL 314 #define null 315 #define RESTRICT 316 #define OVERRIDE 317 #define UCHAR 318 #define USHORT 319 #define UINT 320 #define ULONG 321 #define NONE 322 #define ID 323 #define LAB 324 #define TYPE 325 #define LNG 326 #define DBL 327 #define CHR 328 #define TAG 329 #define STR 330 #define RA 331 #define LA 332 #define OA 333 #define XA 334 #define AA 335 #define MA 336 #define DA 337 #define TA 338 #define NA 339 #define PA 340 #define OR 341 #define AN 342 #define NE 343 #define EQ 344 #define GE 345 #define LE 346 #define RS 347 #define LS 348 #define AR 349 #define PP 350 #define NN 351 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED typedef union YYSTYPE #line 153 "soapcpp2_yacc.y" { Symbol *sym; LONG64 i; double r; char c; char *s; Tnode *typ; Storage sto; Node rec; Entry *e; } /* Line 1529 of yacc.c. */ #line 253 "soapcpp2_yacc.tab.h" YYSTYPE; # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 # define YYSTYPE_IS_TRIVIAL 1 #endif extern YYSTYPE yylval; gsoap-2.8.28/gsoap/VisualStudio2005/soapcpp2/soapcpp2/soapcpp2.c0000644000175000017500000003041212653650160023514 0ustar ellertellert/* soapcpp2.c Main compiler and code generator batch program. gSOAP XML Web services tools Copyright (C) 2000-2016, Robert van Engelen, Genivia Inc. All Rights Reserved. This part of the software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapcpp2.h" #ifndef SOAPCPP2_IMPORT_PATH # define SOAPCPP2_IMPORT_PATH (NULL) #endif extern void init(void); extern int yyparse(void); extern FILE *yyin; extern const char *ns_cname(const char*, const char*); FILE *fmsg; /* fd to flush compiler messages */ int soap_version = 0; /* SOAP version, -1=no SOAP, 0=not set, 1=1.1, 2=1.2 */ int vflag = 0; /* verbose output */ int wflag = 0; /* when set, don't generate WSDL and schema files */ int cflag = 0; /* when set, generate files with .c extension */ int c11flag = 0; /* when set, generate C++11 files with .cpp extension */ int Cflag = 0; /* when set, generate only files for clients */ int aflag = 0; /* when set, use value of SOAP Action to dispatch method at server side */ int Aflag = 0; /* when set, require SOAP Action to dispatch method at server side */ int bflag = 0; /* when set, serialize byte arrays char[N] as string */ int eflag = 0; /* when set, use SOAP RPC encoding by default */ int Ecflag = 0; /* when set, generate extra routines for data copying (soap_dup_X) */ int Edflag = 0; /* when set, generate extra routines for data deletion (soap_del_X) */ int Etflag = 0; /* when set, generate data traversal/walker routines */ unsigned long fflag = 0;/* multi-file split for each bundle of -fN defs */ int iflag = 0; /* when set, generate new style proxy/object classes inherited from soap struct */ int jflag = 0; /* when set, generate new style proxy/object classes */ int mflag = 0; /* when set, generate code that requires array/binary classes to explicitly remove malloced array */ int nflag = 0; /* when set, names the namespaces global struct '%NAME%_namespaces */ int lflag = 0; /* when set, create library */ int Lflag = 0; /* when set, don't generate soapClientLib/soapServerLib */ int Qflag = 0; /* when set, use C++ namespaces for custom serializers */ int sflag = 0; /* when set, generate strict validation checks */ int Sflag = 0; /* when set, generate only files for servers */ int Tflag = 0; /* when set, generates server auto-test code */ int tflag = 0; /* when set, generates typed messsages (with xsi:type attributes) */ int uflag = 0; /* when set, uncomment WSDL and schema output */ int xflag = 0; /* when set, don't generate sample XML message files */ int yflag = 0; /* when set, add C/C++ info in sample XML messages */ int zflag = 0; /* when set, use backward compatibility option */ char dirpath[1024]; /* directory path for generated source files */ const char *prefix = "soap"; /* file name prefix for generated source files */ const char *filename; /* current file name */ const char *importpath = NULL; /* default file import path */ const char *defimportpath = SOAPCPP2_IMPORT_PATH; /* default file import path */ /* IMPORTANT: The terms and conditions of use of this software do not allow for the removal of the copyright notice from the main program for visual display. For integrations with other software, a similar copyright notice must be produced that is visible to users of the software. */ int main(int argc, char **argv) { int i, g; char *a, *s; fmsg = stderr; filename = ""; fprintf(fmsg, "\n** The gSOAP code generator for C and C++, soapcpp2 release " VERSION "\n** Copyright (C) 2000-2016, Robert van Engelen, Genivia Inc.\n** All Rights Reserved. This product is provided \"as is\", without any warranty.\n** The soapcpp2 tool and its generated software are released under the GPL.\n** ----------------------------------------------------------------------------\n** A commercial use license is available from Genivia Inc., contact@genivia.com\n** ----------------------------------------------------------------------------\n\n"); for (i = 1; i < argc; i++) { a = argv[i]; if (*a == '-' #ifdef WIN32 || *a == '/' #endif ) { g = 1; while (g && *++a) switch (*a) { case 'C': Cflag = 1; if (Sflag) fprintf(stderr, "soapcpp2: using both options -C and -S omits client/server code\n"); break; case 'c': if (a[1] == '+' && a[2] == '+') { a += 2; if (a[1] == '1' && a[2] == '1') { a += 2; c11flag = 1; } cflag = 0; } else cflag = 1; break; case 'd': a++; g = 0; if (*a) strcpy(dirpath, a); else if (i < argc && argv[++i]) strcpy(dirpath, argv[i]); else execerror("Option -d requires a directory path"); if (*dirpath && dirpath[strlen(dirpath)-1] != '/' && dirpath[strlen(dirpath)-1] != '\\') strcat(dirpath, SOAP_PATHCAT); break; case 'e': eflag = 1; break; case 'E': a++; g = 0; while (*a) { switch (*a) { case 'c': Ecflag = 1; break; case 'd': Edflag = 1; break; case 't': Etflag = 1; break; default: execerror("Option -E requires 'c' and/or 'd'"); } a++; } break; case 'f': a++; g = 0; if (*a) fflag = strtoul(a, NULL, 10); else if (i < argc && argv[++i]) fflag = strtoul(argv[i], NULL, 10); if (!fflag) execerror("Option -f requires a value"); if (fflag < 10) fflag = 10; break; case 'a': aflag = 1; break; case 'A': aflag = 1; Aflag = 1; break; case 'b': bflag = 1; break; case '?': case 'h': fprintf(stderr, "Usage: soapcpp2 [-0|-1|-2] [-C|-S] [-T] [-Ecdt] [-L] [-a] [-A] [-b] [-c|-c++|-c++11] [-d path] [-e] [-f N] [-h] [-i] [-I path" SOAP_PATHSEP "path" SOAP_PATHSEP "...] [-l] [-m] [-n] [-p name] [-s] [-t] [-u] [-v] [-w] [-x] [-y] [-z#] [infile]\n\n"); fprintf(stderr, "\ -1 generate SOAP 1.1 bindings\n\ -2 generate SOAP 1.2 bindings\n\ -0 no SOAP bindings, use REST\n\ -C generate client-side code only\n\ -S generate server-side code only\n\ -T generate server auto-test code\n\ -Ec generate extra routines for deep copying\n\ -Ed generate extra routines for deep deletion\n\ -Et generate extra routines for data traversals with walker functions\n\ -L don't generate soapClientLib/soapServerLib\n\ -a use SOAPAction with WS-Addressing to invoke server-side operations\n\ -A require SOAPAction to invoke server-side operations\n\ -b serialize byte arrays char[N] as string\n\ -c generate C source code\n\ -c++ generate C++ source code (default)\n\ -c++11 generate C++ source code optimized for C++11 (compile with -std=c++11)\n\ -dpath use path to save files\n\ -e generate SOAP RPC encoding style bindings (also use -1 or -2)\n\ -fN multiple soapC files, with N serializer definitions per file (N>=10)\n\ -h display help info\n\ -Ipath use path(s) for #import (paths separated with '" SOAP_PATHSEP "')\n\ -i generate C++ service proxies and objects inherited from soap struct\n\ -j generate C++ service proxies and objects that share a soap struct\n\ -l generate linkable modules (experimental)\n\ -m generate Matlab(tm) code for MEX compiler (deprecated)\n\ -n use service name to rename service functions and namespace table\n\ -pname save files with new prefix name instead of 'soap'\n\ -Qname use name as the C++ namespace for decls, including custom serializers\n\ -qname use name as the C++ namespace for decls, excluding custom serializers\n\ -s generate deserialization code with strict XML validation checks\n\ -t generate code for fully xsi:type typed SOAP/XML messaging\n\ -u uncomment comments in WSDL/schema output by suppressing XML comments\n\ -v verbose output\n\ -w don't generate WSDL and schema files\n\ -x don't generate sample XML message files\n\ -y include C/C++ type access information in sample XML messages\n\ -z1 compatibility: generate old-style C++ service proxies and objects\n\ -z2 compatibility with 2.7.x: omit XML output for NULL pointers\n\ infile header file to parse (or stdin)\n\ \n"); exit(0); case 'I': a++; g = 0; s = NULL; if (*a) s = a; else if (i < argc && argv[++i]) s = argv[i]; else execerror("Option -I requires an import path"); if (importpath && s) { char *t = (char*)emalloc(strlen(importpath) + strlen(s) + 2); strcpy(t, importpath); strcat(t, SOAP_PATHSEP); strcat(t, s); importpath = t; } else importpath = s; break; case 'i': iflag = 1; break; case 'j': jflag = 1; break; case 'm': mflag = 1; break; case 'n': nflag = 1; break; case 'l': lflag = 1; break; case 'L': Lflag = 1; break; case 's': sflag = 1; break; case 'S': Sflag = 1; if (Cflag) fprintf(stderr, "soapcpp2: using both options -C and -S omits client/server code\n"); break; case 'T': Tflag = 1; break; case 't': tflag = 1; break; case 'u': uflag = 1; break; case 'w': wflag = 1; break; case 'x': xflag = 1; break; case 'y': yflag = 1; break; case 'p': a++; g = 0; if (*a) prefix = ns_cname(a, NULL); else if (i < argc && argv[++i]) prefix = ns_cname(argv[i], NULL); else execerror("Option -p requires an output file name prefix"); break; case 'Q': Qflag = 1; /* fall through */ case 'q': a++; g = 0; if (*a) namespaceid = ns_cname(a, NULL); else if (i < argc && argv[++i]) namespaceid = ns_cname(argv[i], NULL); else execerror("Option -q requires a namespace name"); break; case '0': soap_version = -1; break; case '1': soap_version = 1; envURI = "http://schemas.xmlsoap.org/soap/envelope/"; encURI = "http://schemas.xmlsoap.org/soap/encoding/"; break; case '2': soap_version = 2; envURI = "http://www.w3.org/2003/05/soap-envelope"; encURI = "http://www.w3.org/2003/05/soap-encoding"; rpcURI = "http://www.w3.org/2003/05/soap-rpc"; break; case 'v': vflag = 1; break; case 'z': a++; g = 0; if (*a) zflag = *a - '0'; else if (i < argc && argv[++i]) zflag = *argv[i] - '0'; else execerror("Option -z requires a digit"); break; default: fprintf(stderr, "soapcpp2: Unknown option %s\n", a); exit(1); } } else if (!(yyin = fopen(argv[i], "r"))) { sprintf(errbuf, "Cannot open file \"%s\" for reading", argv[i]); execerror(errbuf); } else filename = argv[i]; } if (importpath && defimportpath) { char *t = (char*)emalloc(strlen(importpath) + strlen(defimportpath) + 2); strcpy(t, importpath); strcat(t, SOAP_PATHSEP); strcat(t, defimportpath); importpath = t; } else if (!importpath) importpath = defimportpath; init(); if (yyparse()) synerror("skipping the remaining part of the input"); return errstat(); } gsoap-2.8.28/gsoap/VisualStudio2005/soapcpp2/soapcpp2/Release/0000755000175000017500000000000012653650160023201 5ustar ellertellertgsoap-2.8.28/gsoap/VisualStudio2005/soapcpp2/soapcpp2/soapcpp2_lex.l0000644000175000017500000006612412653650160024406 0ustar ellertellert/* soapcpp2_lex.l Flex/Lex tokenizer for C/C++ -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc. All Rights Reserved. This part of the software is released under ONE of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ %{ #include "soapcpp2.h" #ifdef HAVE_CONFIG_H #include "soapcpp2_yacc.h" #else #include "soapcpp2_yacc.tab.h" #endif #ifdef WITH_BISON YYSTYPE yylval; #undef YY_NEED_STRLEN #define YY_INPUT(buf, result, max_size) \ { \ int c = getc(yyin); \ result = (c == EOF) ? YY_NULL : (buf[0] = c, 1); \ } #endif #ifndef WITH_LEX #define MAX_IMPORT_DEPTH 16 static struct importlist { struct importlist *next; char name[1]; } *importlist = NULL; static const char *fnstk[MAX_IMPORT_DEPTH]; static int lnstk[MAX_IMPORT_DEPTH]; static const char *imstk[MAX_IMPORT_DEPTH]; static YY_BUFFER_STATE instk[MAX_IMPORT_DEPTH]; #endif int imports = 0; const char *imported = NULL; static void check_id(const char*); static Token install_id(void); static Token install_tag(void); static Token install_int(void); static Token install_hex(void); static Token install_num(void); static Token install_chr(void); static Token install_str(void); static Token install_pragma(void); static void directive(void), option(void), xpath(void); static Token error_chr(void); static Token error_str(void); static int convchar(int*); static int hexchar(int*); static int octchar(int*); static void module(const char *name, const char *fullname); static void import(const char *file); static int magic(const char *name); %} BOM \xEF\xBB\xBF ws [ \t\v\r\f\n\x1A\xA0] digit [0-9] alpha ([a-zA-Z_\xA8\xAA\xAD\xAF\xB2\xB5\xB7\xB8\xB9\xBA\xBC\xBD\xBE]|[\xC0-\xFF][\x80-\xBF]*|\\u([0-9a-fA-F]{4})) id (:?{alpha})(:?{alpha}|{digit}|::)* tag `[^`\t\v\r\f\n>]+` int {digit}+ hex 0[xX][0-9a-fA-F]+ num {int}(\.{int}([Ee][+-]?{int})?|(\.{int})?[Ee][+-]?{int}) chr '(\\'|[^'\n])*' str L?\"(\\\"|\\\n|[^"])*\" module #module{ws}+.*\n import #import{ws}+.*\n %option noyywrap %option noinput %option nounput %x MLCOMMENT %% ^{BOM} { /* skip UTF8 BOM */ } {ws} { /* skip white space */ } "/*" { BEGIN(MLCOMMENT); } .|\n { } "*/" { BEGIN(INITIAL); } <> { execerror("Unclosed multiline comment at the end of file"); } "//"\/*"gsoapopt".*\n { option(); } "//"\/*"gsoap".*\n { directive(); } "//"\/*"xpath".*\n { xpath(); } "//".*\n { /* skip single line comment */ } "+=" { return PA; } "-=" { return NA; } "*=" { return TA; } "/=" { return DA; } "%=" { return MA; } "&=" { return AA; } "^=" { return XA; } "|=" { return OA; } "<<=" { return LA; } ">>=" { return RA; } "||" { return OR; } "&&" { return AN; } "==" { return EQ; } "!=" { return NE; } "<=" { return LE; } ">=" { return GE; } "<<" { return LS; } ">>" { return RS; } "++" { return PP; } "--" { return NN; } "->" { return AR; } [;,:=|^&<>+\-*/%!?~(){}\[\].@$] { return yytext[0]; } {id} { return install_id(); } {tag} { return install_tag(); } {int} { return install_int(); } {hex} { return install_hex(); } {num} { return install_num(); } {chr} { return install_chr(); } {str} { return install_str(); } {module} { char *s, *t, buf[1024]; s = strchr(yytext, '"'); if (!s) t = yytext+7; else { strcpy(buf, s+1); s = strchr(buf, '"'); *s = '\0'; t = strchr(s+1, '"'); if (t) { t++; s = strchr(t+1, '"'); if (s) *s = '\0'; } } module(buf, t); } {import} { char *s, buf[1024]; s = strchr(yytext, '"'); if (s) { strncpy(buf, s + 1, sizeof(buf)); buf[sizeof(buf) - 1] = '\0'; s = strchr(buf, '"'); if (!s) lexerror("Invalid import directive: missing ending \" or path too long"); else { *s = '\0'; import(buf); } } else lexerror("Invalid import directive: \" expected"); } #.*\n { return install_pragma(); } '[^'\n]*/\n { return error_chr(); } \"[^"\n]*/\n { return error_str(); } . { lexerror("Skipping unknown symbol"); } <> { /* when Lex complains: remove this line and below */ #ifndef WITH_LEX if (--imports < 0) { yyterminate(); } else { if (vflag) fprintf(stderr, "End of %s\n\n", filename); yy_delete_buffer(YY_CURRENT_BUFFER); yy_switch_to_buffer(instk[imports]); filename = fnstk[imports]; yylineno = lnstk[imports]; imported = imstk[imports]; } #endif } %% /* install_id - lookup identifier in symbol table. If found, return token and symbol table entry. If not found, create entry in symbol table and return ID token. */ static Token install_id() { Symbol *p = lookup(yytext); if (!p) { int i, flag = 0; p = install(yytext, ID); /* [_](x|X)(m|M)(l|L)__ is OK */ /* [_](x|X)(m|M)(l|L).* is not OK */ /* .*__(x|X)(m|M)(l|L) is not OK */ /* .*::(x|X)(m|M)(l|L) is not OK */ for (i = 0; i < (int)yyleng; i++) { if ((yytext[i] == '_' && yytext[i+1] == '_') || (yytext[i] == ':' && yytext[i+1] == ':')) { flag = 1; check_id(yytext + i + 2); } } if (!flag && strcmp(yytext, "XML")) check_id(yytext); } yylval.sym = p; return p->token; } /* install_tag - return TAG token. */ static Token install_tag() { yylval.s = (char*)emalloc(yyleng-1); /* yyleng = length(yytext) */ strcpy(yylval.s, yytext+1); yylval.s[yyleng-2] = '\0'; return TAG; } /* check_id - check for (x|X)(m|M)(l|L) */ static void check_id(const char *s) { while (*s == '_') s++; if ((s[0] == 'x' || s[0] == 'X') && (s[1] == 'm' || s[1] == 'M') && (s[2] == 'l' || s[2] == 'L')) { sprintf(errbuf, "identifier '%s' starts with or embeds '%3.3s' character sequence, which is exclusively reserved for and by the W3C XML standards (for enum constants: please ignore this warning)", yytext, s); semwarn(errbuf); } } /* install_int - convert digits to integer and return LNG token. */ static Token install_int(void) { sscanf(yytext, SOAP_ULONG_FORMAT, &yylval.i); return LNG; } /* install_hex - convert hexadecimal digits to integer and return LNG */ static Token install_hex(void) { sscanf(yytext, SOAP_XLONG_FORMAT, &yylval.i); return LNG; } /* install_num - convert digits to floating point number and return DBL */ static Token install_num(void) { sscanf(yytext, "%lf", &yylval.r); return DBL; } /* install_chr - convert character constant and return CHR. */ static Token install_chr(void) { int i = 2; if (yytext[1] == '\\') yylval.c = convchar(&i); else yylval.c = yytext[i-1]; if (yytext[i] != '\'') lexerror("Illegal character constant"); return CHR; } /* install_str - convert and store string in memory. Return STR. */ static Token install_str(void) { int i, j = 0; yylval.s = (char*)emalloc(yyleng - 1); /* yyleng = length(yytext) */ for (i = 1 + (yytext[0] == 'L'); i < (int)yyleng - 1; i++) if (yytext[i] == '\\') { if (yytext[++i] != '\n') { yylval.s[j++] = convchar(&i); i--; } } else yylval.s[j++] = yytext[i]; yylval.s[j] = '\0'; return STR; } /* install_pragma - store pragma in string. Return PRAGMA. */ static Token install_pragma(void) { yylval.s = (char*)emalloc(yyleng); /* yyleng = length(yytext) */ strncpy(yylval.s, yytext, strlen(yytext)-1); yylval.s[strlen(yytext)-1] = '\0'; return PRAGMA; } static void directive(void) { int i, j, k; char *s; Service *sp; Method *m; Data *d; int service; for (i = 0; yytext[i]; i++) if (yytext[i] <= 32) break; for (; yytext[i]; i++) if (yytext[i] > 32) break; for (j = i; yytext[j]; j++) if (yytext[j] <= 32) break; if (i == j) return; s = (char*)emalloc(j-i+1); for (k = 0; k < j-i; k++) { s[k] = yytext[k+i]; if (s[k] == '_') s[k] = '-'; } s[k] = '\0'; for (sp = services; sp; sp = sp->next) if (!strcmp(sp->ns, s)) break; if (!sp) { sp = (Service*)emalloc(sizeof(Service)); sp->next = services; sp->ns = s; sp->name = NULL; sp->porttype = NULL; sp->portname = NULL; sp->binding = NULL; sp->definitions = NULL; sp->transport = NULL; sp->URL = NULL; sp->URI = NULL; sp->URI2 = NULL; sp->WSDL = NULL; sp->style = NULL; sp->encoding = NULL; sp->protocol = NULL; sp->xsi_type = 0; sp->elementForm = NULL; sp->attributeForm = NULL; sp->executable = NULL; sp->import = NULL; sp->documentation = NULL; sp->list = NULL; sp->data = NULL; services = sp; } for (i = j; yytext[i]; i++) if (yytext[i] > 32) break; if (!strncmp(yytext+i, "service", 7) || !strncmp(yytext+i, "schema", 6)) { service = strncmp(yytext+i, "schema", 6); for (i += 7; yytext[i]; i++) if (yytext[i] > 32) break; for (j = i; yytext[j]; j++) if (yytext[j] <= 32) break; for (; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] <= 32) break; /* if (j == k) return; */ s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; if (!strncmp(yytext+i, "name:", 5)) { sp->name = s; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; sp->documentation = s; } else if (!strncmp(yytext+i, "type:", 5) || !strncmp(yytext+i, "portType:", 9) || !strncmp(yytext+i, "interface:", 10)) sp->porttype = s; else if (!strncmp(yytext+i, "portName:", 9)) sp->portname = s; else if (!strncmp(yytext+i, "binding:", 8)) sp->binding = s; else if (!strncmp(yytext+i, "definitions:", 12)) sp->definitions = s; else if (!strncmp(yytext+i, "documentation:", 14)) { for (k = j; yytext[k]; k++) if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; sp->documentation = s; } else if (!strncmp(yytext+i, "transport:", 10)) sp->transport = s; else if (!strncmp(yytext+i, "location:", 9) || !strncmp(yytext+i, "endpoint:", 9) || !strncmp(yytext+i, "port:", 5)) { if (sp->URL) { char *t = (char*)emalloc(strlen(sp->URL) + strlen(s) + 2); strcpy(t, sp->URL); strcat(t, " "); strcat(t, s); sp->URL = t; } else sp->URL = s; if (!service && !sp->import) sp->import = s; } else if (!strncmp(yytext+i, "executable:", 11)) sp->executable = s; else if (!strncmp(yytext+i, "namespace:", 10)) { if (service) { if (!sp->URI) sp->URI = s; sp->WSDL = s; } else if (!strcmp(sp->ns, "SOAP-ENV")) { if (soap_version > 0) semwarn("option -1 or -2 overrides SOAP-ENV namespace"); else envURI = s; sp->URI = (char*)envURI; } else if (!strcmp(sp->ns, "SOAP-ENC")) { if (soap_version > 0) semwarn("option -1 or -2 overrides SOAP-ENC namespace"); else encURI = s; sp->URI = (char*)encURI; } else sp->URI = s; } else if (!strncmp(yytext+i, "namespace2:", 11)) { sp->URI2 = s; } else if (!strncmp(yytext+i, "typed:", 6)) { sp->xsi_type = (*s == 'y'); } else if (!strncmp(yytext+i, "form:", 5)) { sp->elementForm = s; sp->attributeForm = s; } else if (!strncmp(yytext+i, "elementForm:", 12)) sp->elementForm = s; else if (!strncmp(yytext+i, "attributeForm:", 14)) sp->attributeForm = s; else if (!strncmp(yytext+i, "import:", 7)) { if (!sp->URI) sp->URI = s; sp->import = s; } else if (!strncmp(yytext+i, "encoding:", 9)) { if (!strcmp(s, "encoded")) sp->encoding = ""; else sp->encoding = s; } else if (!strncmp(yytext+i, "style:", 6)) sp->style = s; else if (!strncmp(yytext+i, "protocol:", 9)) sp->protocol = s; else if (!strncmp(yytext+i, "method-protocol:", 16)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = PROTOCOL; m->part = NULL; m->next = sp->list; sp->list = m; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-style:", 13)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = STYLE; m->part = NULL; m->next = sp->list; sp->list = m; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-encoding:", 16)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = ENCODING; m->part = NULL; m->next = sp->list; sp->list = m; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; if (strcmp(s, "encoded")) m->part = s; else m->part = ""; } else if (!strncmp(yytext+i, "method-response-encoding:", 25)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = RESPONSE_ENCODING; m->part = NULL; m->next = sp->list; sp->list = m; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; if (strcmp(s, "encoded")) m->part = s; else m->part = ""; } else if (!strncmp(yytext+i, "method-documentation:", 21)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = COMMENT; m->part = NULL; m->next = sp->list; sp->list = m; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-action:", 14)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = ACTION; m->part = NULL; m->next = sp->list; sp->list = m; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-input-action:", 20)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = REQUEST_ACTION; m->part = NULL; m->next = sp->list; sp->list = m; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-output-action:", 21)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = RESPONSE_ACTION; m->part = NULL; m->next = sp->list; sp->list = m; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-fault-action:", 20)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = FAULT_ACTION; m->part = NULL; m->next = sp->list; sp->list = m; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-mime-type:", 17)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = MIMEIN | MIMEOUT; m->part = NULL; m->next = sp->list; sp->list = m; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] <= 32) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-input-mime-type:", 23)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = MIMEIN; m->part = NULL; m->next = sp->list; sp->list = m; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] <= 32) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-output-mime-type:", 24)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = MIMEOUT; m->part = NULL; m->next = sp->list; sp->list = m; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] <= 32) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-header-part:", 19)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = HDRIN | HDROUT; m->part = NULL; m->next = sp->list; sp->list = m; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] <= 32) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-input-header-part:", 25)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = HDRIN; m->part = NULL; m->next = sp->list; sp->list = m; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] <= 32) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-output-header-part:", 26)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = HDROUT; m->part = NULL; m->next = sp->list; sp->list = m; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] <= 32) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-fault:", 13)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = FAULT; m->part = NULL; m->next = sp->list; sp->list = m; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] <= 32) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "type-documentation:", 19)) { d = (Data*)emalloc(sizeof(Data)); d->name = s; d->text = NULL; d->next = sp->data; sp->data = d; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; d->text = s; } else { sprintf(errbuf, "unrecognized gsoap directive: %s", yytext+i); semwarn(errbuf); } } else { sprintf(errbuf, "unrecognized gsoap directive: %s", yytext); semwarn(errbuf); } } static void option(void) { int i; if (imports) { sprintf(errbuf, "options directive: %s ignored in imported file(s)", yytext); semwarn(errbuf); return; } for (i = 0; yytext[i]; i++) if (yytext[i] <= 32) break; for (; yytext[i]; i++) if (yytext[i] > 32) break; for (; yytext[i]; i++) switch (yytext[i]) { case 'a': aflag = 1; break; case 'c': if (yytext[i+1] == '+' && yytext[i+2] == '+') { i += 2; if (yytext[i+1] == '1' && yytext[i+2] == '1') { i += 2; c11flag = 1; } cflag = 0; } else cflag = 1; break; case 'e': eflag = 1; break; case 'n': nflag = 1; break; case 'l': lflag = 1; break; case 't': tflag = 1; break; case 'w': wflag = 1; break; default: if (yytext[i] < 32 || yytext[i] == '/') return; } } static void xpath(void) { int i, j, k; char *s; XPath *xp; for (i = 0; yytext[i]; i++) if (yytext[i] <= 32) break; for (; yytext[i]; i++) if (yytext[i] > 32) break; for (j = i; yytext[j]; j++) if (yytext[j] <= 32) break; if (i == j) return; for (k = j; yytext[k]; k++) if (yytext[k] > 32) break; s = (char*)emalloc(yyleng - i); strncpy(s, yytext + i, j - i); s[j - i] = '\0'; for (xp = xpaths; xp; xp = xp->next) if (!strcmp(xp->name, s)) break; if (!xp) { xp = (XPath*)emalloc(sizeof(XPath)); xp->next = xpaths; xp->name = s; } s += j - i + 1; strcpy(s, yytext + k); xp->path = s; while (*s > 32) s++; *s = '\0'; } /* error_chr - lexical error in character constant. Return character 0 to allow parsing to continue */ static Token error_chr(void) { lexerror("Ending-' missing in character constant"); yylval.c = '\0'; return CHR; } /* error_str - lexical error in string. Return empty string to allow parsing to continue */ static Token error_str(void) { lexerror("Ending-\" missing in string"); yylval.s = ""; return STR; } /* Character conversion functions */ static int convchar(int *p) { switch (yytext[(*p)++]) { case 'a': return '\a'; case 'b': return '\b'; case 'f': return '\f'; case 'n': return '\n'; case 'r': return '\r'; case 't': return '\t'; case 'v': return '\v'; case 'x': return hexchar(p); case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': (*p)--; return octchar(p); default: return yytext[*p-1]; } } static int hexchar(int *p) { int i, d, c = 0; for (i = 0; isxdigit(d = yytext[*p]) && i < 2; i++) { c = (c << 4) + (d <= '9' ? d - '0' : toupper(d) - '7'); (*p)++; } return c; } static int octchar(int *p) { int i, d, c = 0; for (i = 0; (d = yytext[*p]) >= '0' && d <= '7' && i < 3; i++) { c = (c << 3) + d - '0'; (*p)++; } return c; } static void module(const char *name, const char *fullname) { char *s; if (!fullname) fullname = name; if (imports) { Pragma **pp; s = (char*)emalloc(strlen(fullname)+15); sprintf(s, "#include \"%sH.h\"", fullname); for (pp = &pragmas; *pp; pp = &(*pp)->next) if (!strcmp((*pp)->pragma, s)) break; if (!*pp) { *pp = (Pragma*)emalloc(sizeof(Pragma)); (*pp)->pragma = s; (*pp)->next = NULL; } s = (char*)emalloc(strlen(fullname)+1); imported = strcpy(s, fullname); fprintf(stderr, "Importing module '%s'\n\n", fullname); } else { lflag = 1; typeNO = magic(name); s = (char*)emalloc(strlen(fullname)+1); prefix = strcpy(s, fullname); fprintf(stderr, "Compiling module '%s' (magic number = %d)\n\n", fullname, typeNO); } } static int magic(const char *name) { size_t i; int n; if (strlen(name) > 4) semerror("#module name length must not exceed four characters"); n = 0; for (i = 0; i < strlen(name); i++) if (name[i] >= 'a' && name[i] <= 'z') n = 26*n + name[i] - 'a'; else if (name[i] >= 'A' && name[i] <= 'Z') n = 26*n + name[i] - 'A'; else semerror("#module name must be alphabetic and the length must not exceed four characters.\nUse '#module name longname' for longer names."); return 4699*n + 153424; } #ifdef WITH_LEX static void import(const char *file) { execerror("Cannot #import: soapcpp2 not compiled with flex (replace lex with flex)"); } #else static void import(const char *file) { char buf[1024]; struct importlist *p; if (vflag) fprintf(stderr, "Importing '%s': ", file); for (p = importlist; p; p = p->next) { if (!strcmp(p->name, file)) { if (vflag) fprintf(stderr, "file already read or currently being read\n\n"); return; } } if (imports >= MAX_IMPORT_DEPTH) execerror("Imports nested too deep"); instk[imports] = YY_CURRENT_BUFFER; fnstk[imports] = filename; lnstk[imports] = yylineno; imstk[imports] = imported; yylineno = 1; /* imported = NULL; this is useful to change the semantics of #import to NOT consider non-module imports to be part of the current module */ imports++; buf[0] = '\0'; if (!(yyin = fopen(file, "r"))) { if (importpath) { const char *s, *t; s = importpath; do { size_t n; t = strstr(s, SOAP_PATHSEP); if (t) { if ((size_t)(t - s) >= sizeof(buf)) t = s + sizeof(buf) - 1; strncpy(buf, s, t - s); buf[t - s] = '\0'; s = t + sizeof(SOAP_PATHSEP) - 1; } else { strcpy(buf, s); s = NULL; } n = strlen(buf) - 1; #ifdef __VMS if (buf[n] != ']' && buf[n] != ':') strcat(buf, ":"); #else if (buf[n] != SOAP_PATHCAT[0]) strcat(buf, SOAP_PATHCAT); #endif strcat(buf, file); yyin = fopen(buf, "r"); } while (s && !yyin); } if (!yyin) { sprintf(errbuf, "#import: Cannot open file \"%s\" for reading.\nHint: use option -I (for example -Igsoap/import"SOAP_PATHSEP"gsoap/custom:.)", file); execerror(errbuf); } } if (vflag) { if (buf[0]) fprintf(stderr, "OK, found at %s\n\n", buf); else fprintf(stderr, "OK\n\n"); } p = (struct importlist*)emalloc(sizeof(struct importlist) + strlen(file)); /* has already + 1 byte size */ strcpy(p->name, file); filename = p->name; p->next = importlist; importlist = p; yy_switch_to_buffer(yy_create_buffer(yyin, YY_BUF_SIZE)); } #endif gsoap-2.8.28/gsoap/VisualStudio2005/soapcpp2/soapcpp2/soapcpp2_yacc.y0000644000175000017500000033430612653650160024552 0ustar ellertellert/* soapcpp2_yacc.y Yacc/Bison grammar. Build notes: 1. Bison 1.6 is known to crash on Win32 systems if YYINITDEPTH is too small Compile with -DYYINITDEPTH=5000 2. This grammar has one shift/reduce conflict related to the use of a class declaration with a base class (e.g. class Y : public X) and the use of a maxOccurs (class Y :10). Internally the conflict is resolved in favor of a shift by Bison/Yacc, which leads to the correct parsing behavior. Therefore, the warning can be ignored. If this leads to an error, then please enable the following directive (around line 121): %expect 1 // Bison: ignore one shift/reduce conflict -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc. All Rights Reserved. This part of the software is released under ONE of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ %{ #include "soapcpp2.h" #ifdef WIN32 #ifndef __STDC__ #define __STDC__ #endif #define YYINCLUDED_STDLIB_H #ifdef WIN32_WITHOUT_SOLARIS_FLEX extern int soapcpp2lex(void); #else extern int yylex(void); #endif #else extern int yylex(void); #endif #define MAXNEST 16 /* max. nesting depth of scopes */ typedef struct Scope { Table *table; Entry *entry; Node node; LONG64 val; int offset; Bool grow; /* true if offset grows with declarations */ Bool mask; /* true if enum is mask */ } Scope; Scope stack[MAXNEST], /* stack of tables and offsets */ *sp; /* current scope stack pointer */ Table *classtable = NULL, *enumtable = NULL, *typetable = NULL, *booltable = NULL, *templatetable = NULL; const char *namespaceid = NULL; int transient = 0; int permission = 0; int custom_header = 1; int custom_fault = 1; Pragma *pragmas = NULL; Tnode *qname = NULL; Tnode *xml = NULL; /* function prototypes for support routine section */ static Entry *undefined(Symbol*); static Tnode *mgtype(Tnode*, Tnode*); static Node op(const char*, Node, Node), iop(const char*, Node, Node), relop(const char*, Node, Node); static void mkscope(Table*, int), enterscope(Table*, int), exitscope(void); static int integer(Tnode*), real(Tnode*), numeric(Tnode*); static void add_soap(void), add_XML(void), add_qname(void), add_header(void), add_fault(void), add_response(Entry*, Entry*), add_result(Tnode*), add_request(Symbol*, Scope*); /* imported from symbol2.c */ extern int is_string(Tnode*), is_wstring(Tnode*), is_XML(Tnode*), is_smart(Tnode*); extern char *c_storage(Storage); extern const char *c_type(Tnode*); extern int is_primitive_or_string(Tnode*), is_stdstr(Tnode*), is_binary(Tnode*), is_external(Tnode*), is_mutable(Entry*); extern Entry *unlinklast(Table*); /* Temporaries used in semantic rules */ int i; char *s, *s1; const char *s2; Symbol *sym; Entry *p, *q; Tnode *t; Node tmp, c; Pragma **pp; %} /* We expect one shift-reduce conflict, see build notes in the header above */ /* %expect 1 */ /* directive is not compatible with Yacc */ /* If Yacc complains then remove the line above to allow Yacc to proceed */ %union { Symbol *sym; LONG64 i; double r; char c; char *s; Tnode *typ; Storage sto; Node rec; Entry *e; } /* pragmas */ %token PRAGMA /* keywords */ %token AUTO DOUBLE INT STRUCT %token BREAK ELSE LONG SWITCH %token CASE ENUM REGISTER TYPEDEF %token CHAR EXTERN RETURN UNION %token CONST FLOAT SHORT UNSIGNED %token CONTINUE FOR SIGNED VOID %token DEFAULT GOTO SIZEOF VOLATILE %token DO IF STATIC WHILE %token CLASS PRIVATE PROTECTED PUBLIC %token VIRTUAL INLINE OPERATOR LLONG %token BOOL CFALSE CTRUE WCHAR %token TIME USING NAMESPACE ULLONG %token MUSTUNDERSTAND SIZE FRIEND %token TEMPLATE EXPLICIT TYPENAME MUTABLE %token FINAL null RESTRICT OVERRIDE %token UCHAR USHORT UINT ULONG /* */ %token NONE /* identifiers (TYPE = typedef identifier) */ %token ID LAB TYPE /* constants */ %token LNG %token DBL %token CHR %token TAG STR /* types and related */ %type type %type store virtual const abstract %type fname struct class base enum enumsc mask masksc %type id sc arg name %type tag patt %type utype %type cdbl /* expressions and statements */ %type expr cexp oexp obex aexp abex rexp lexp pexp brinit init spec tspec ptrs array arrayck texpf texp qexp occurs bounds min minmax max /* terminals */ %left ',' %right '=' PA NA TA DA MA AA XA OA LA RA /* += -= *= /= %= &= ^= |= <<= >>= */ %right '?' %right ':' %left OR /* || */ %left AN /* && */ %left '|' %left '^' %left '&' %left EQ NE /* == != */ %left '<' LE '>' GE /* <= >= */ %left LS RS /* << >> */ %left '+' '-' %left '*' '/' '%' %left AR /* -> */ %token PP NN /* ++ -- */ %% /**************************************\ Program syntax \**************************************/ prog : s1 exts { if (lflag) { custom_header = 0; custom_fault = 0; } else { add_header(); add_fault(); } compile(sp->table); freetable(classtable); freetable(enumtable); freetable(typetable); freetable(booltable); freetable(templatetable); yylineno = 0; } ; s1 : /* empty */ { classtable = mktable(NULL); enumtable = mktable(NULL); typetable = mktable(NULL); booltable = mktable(NULL); templatetable = mktable(NULL); p = enter(booltable, lookup("false")); p->info.typ = mkint(); p->info.val.i = 0; p = enter(booltable, lookup("true")); p->info.typ = mkint(); p->info.val.i = 1; mkscope(mktable(mktable(NULL)), 0); } ; exts : NAMESPACE ID '{' exts1 '}' { namespaceid = $2->name; } | exts1 { } ; exts1 : /* empty */ { add_soap(); add_qname(); add_XML(); } | exts1 ext { } ; ext : dclrs ';' { } | pragma { } | t1 { } | t2 { } | error ';' { synerror("input before ; skipped"); while (sp > stack) { freetable(sp->table); exitscope(); } yyerrok; } ; pragma : PRAGMA { if ($1[1] >= 'a' && $1[1] <= 'z') { char *s; for (pp = &pragmas; *pp; pp = &(*pp)->next) ; *pp = (Pragma*)emalloc(sizeof(Pragma)); s = (char*)emalloc(strlen($1)+1); strcpy(s, $1); (*pp)->pragma = s; (*pp)->next = NULL; } else if ((i = atoi($1+2)) > 0) { yylineno = i; } else { sprintf(errbuf, "directive '%s' ignored (use #import to import files)", $1); semwarn(errbuf); } } ; /**************************************\ Declarations \**************************************/ decls : /* empty */ { transient &= ~6; permission = 0; } | dclrs ';' decls { } | PRIVATE ':' t3 decls { } | PROTECTED ':' t4 decls { } | PUBLIC ':' t5 decls { } | t1 decls t2 decls { } | error ';' { synerror("declaration expected"); yyerrok; } ; t1 : '[' { transient |= 1; } ; t2 : ']' { transient &= ~1; } ; t3 : { permission = Sprivate; } ; t4 : { permission = Sprotected; } ; t5 : { permission = 0; } ; dclrs : spec { } | spec dclr { } | spec fdclr func { } | ctor func { } | dtor func { } | dclrs ',' dclr{ } | dclrs ',' fdclr func { } | error ID { sprintf(errbuf, "undefined type in declaration of '%s'", $2->name); synerror(errbuf); yyerrok; } | error ')' { synerror("function declaration?"); yyerrok; } ; dclr : ptrs ID arrayck tag bounds brinit { if (($3.sto & Stypedef) && sp->table->level == GLOBAL) { if (($3.typ->type != Tstruct && $3.typ->type != Tunion && $3.typ->type != Tenum && $3.typ->type != Tenumsc) || strcmp($2->name, $3.typ->id->name)) { p = enter(typetable, $2); p->info.typ = mksymtype($3.typ, $2); if ($3.sto & Sextern) { p->info.typ->transient = -1; p->info.typ->extsym = $2; } else if (is_external($3.typ)) p->info.typ->transient = -3; /* extern and volatile */ else p->info.typ->transient = $3.typ->transient; if (p->info.typ->width == 0) p->info.typ->width = 8; p->info.sto = $3.sto; p->info.typ->synonym = $3.typ->sym; if ($5.hasmin) { p->info.typ->hasmin = $5.hasmin; p->info.typ->incmin = $5.incmin; p->info.typ->min = $5.min; p->info.typ->synonym = NULL; } else { p->info.typ->hasmin = $3.typ->hasmin; p->info.typ->incmin = $3.typ->incmin; p->info.typ->min = $3.typ->min; } if ($5.hasmax) { p->info.typ->hasmax = $5.hasmax; p->info.typ->incmax = $5.incmax; p->info.typ->max = $5.max; p->info.typ->synonym = NULL; } else { p->info.typ->hasmax = $3.typ->hasmax; p->info.typ->incmax = $3.typ->incmax; p->info.typ->max = $3.typ->max; } if ($5.pattern) { p->info.typ->pattern = $5.pattern; p->info.typ->synonym = NULL; } else { p->info.typ->pattern = $3.typ->pattern; } } $2->token = TYPE; } else { p = enter(sp->table, $2); p->tag = $4; p->info.typ = $3.typ; p->info.sto = (Storage)((int)$3.sto | permission); if ($6.hasval) { p->info.hasval = True; switch ($3.typ->type) { case Tchar: case Tuchar: case Tshort: case Tushort: case Tint: case Tuint: case Tlong: case Tulong: case Tllong: case Tullong: case Tenum: case Tenumsc: case Ttime: if ($6.typ->type == Tint || $6.typ->type == Tchar || $6.typ->type == Tenum || $6.typ->type == Tenumsc) { sp->val = p->info.val.i = $6.val.i; if (($3.typ->hasmin && $3.typ->min > (double)$6.val.i) || ($3.typ->hasmin && !$3.typ->incmin && $3.typ->min == (double)$6.val.i) || ($3.typ->hasmax && $3.typ->max < (double)$6.val.i) || ($3.typ->hasmax && !$3.typ->incmax && $3.typ->max == (double)$6.val.i)) semerror("initialization constant outside value range"); } else { semerror("type error in initialization constant"); p->info.hasval = False; } break; case Tfloat: case Tdouble: case Tldouble: if ($6.typ->type == Tfloat || $6.typ->type == Tdouble || $6.typ->type == Tldouble) { p->info.val.r = $6.val.r; if (($3.typ->hasmin && $3.typ->min > $6.val.r) || ($3.typ->hasmin && !$3.typ->incmin && $3.typ->min == $6.val.r) || ($3.typ->hasmax && $3.typ->max < $6.val.r) || ($3.typ->hasmax && !$3.typ->incmax && $3.typ->max == $6.val.r)) semerror("initialization constant outside value range"); } else if ($6.typ->type == Tint) { p->info.val.r = (double)$6.val.i; if (($3.typ->hasmin && $3.typ->min > (double)$6.val.i) || ($3.typ->hasmin && !$3.typ->incmin && $3.typ->min == (double)$6.val.i) || ($3.typ->hasmax && $3.typ->max < (double)$6.val.i) || ($3.typ->hasmax && !$3.typ->incmax && $3.typ->max == (double)$6.val.i)) semerror("initialization constant outside value range"); } else { semerror("type error in initialization constant"); p->info.hasval = False; } break; default: if ($3.typ->type == Tpointer && (((Tnode*)$3.typ->ref)->type == Tchar || ((Tnode*)$3.typ->ref)->type == Twchar) && $6.typ->type == Tpointer && ((Tnode*)$6.typ->ref)->type == Tchar) p->info.val.s = $6.val.s; else if (bflag && $3.typ->type == Tarray && ((Tnode*)$3.typ->ref)->type == Tchar && $6.typ->type == Tpointer && ((Tnode*)$6.typ->ref)->type == Tchar) { if ($3.typ->width / ((Tnode*)$3.typ->ref)->width - 1 < (int)strlen($6.val.s)) { semerror("char[] initialization constant too long"); p->info.val.s = ""; } else { p->info.val.s = $6.val.s; } } else if (($3.typ->type == Tpointer || is_smart($3.typ)) && (((Tnode*)$3.typ->ref)->id == lookup("std::string") || ((Tnode*)$3.typ->ref)->id == lookup("std::wstring"))) { p->info.val.s = $6.val.s; } else if ($3.typ->id == lookup("std::string") || $3.typ->id == lookup("std::wstring")) { p->info.val.s = $6.val.s; } else if ($3.typ->type == Tpointer && $6.typ->type == Tint && $6.val.i == 0) { p->info.val.i = 0; } else { semerror("type error in initialization constant"); p->info.hasval = False; } break; } } else { p->info.val.i = sp->val; } if ($5.minOccurs < 0) { if ($6.hasval || ($3.sto & Sattribute) || $3.typ->type == Tpointer || $3.typ->type == Ttemplate || !strncmp($2->name, "__size", 6)) p->info.minOccurs = 0; else p->info.minOccurs = 1; } else { p->info.minOccurs = $5.minOccurs; } p->info.maxOccurs = $5.maxOccurs; if (sp->mask) sp->val <<= 1; else sp->val++; p->info.offset = sp->offset; if ($3.sto & Sextern) p->level = GLOBAL; else if ($3.sto & Stypedef) ; else if (sp->grow) sp->offset += p->info.typ->width; else if (p->info.typ->width > sp->offset) sp->offset = p->info.typ->width; } sp->entry = p; } ; fdclr : ptrs name { if ($1.sto & Stypedef) { sprintf(errbuf, "invalid typedef qualifier for '%s'", $2->name); semwarn(errbuf); } p = enter(sp->table, $2); p->info.typ = $1.typ; p->info.sto = $1.sto; p->info.hasval = False; p->info.offset = sp->offset; if (sp->grow) sp->offset += p->info.typ->width; else if (p->info.typ->width > sp->offset) sp->offset = p->info.typ->width; sp->entry = p; } ; id : ID { $$ = $1; } | TYPE { $$ = $1; } ; name : ID { $$ = $1; } | OPERATOR '!' { $$ = lookup("operator!"); } | OPERATOR '~' { $$ = lookup("operator~"); } | OPERATOR '=' { $$ = lookup("operator="); } | OPERATOR PA { $$ = lookup("operator+="); } | OPERATOR NA { $$ = lookup("operator-="); } | OPERATOR TA { $$ = lookup("operator*="); } | OPERATOR DA { $$ = lookup("operator/="); } | OPERATOR MA { $$ = lookup("operator%="); } | OPERATOR AA { $$ = lookup("operator&="); } | OPERATOR XA { $$ = lookup("operator^="); } | OPERATOR OA { $$ = lookup("operator|="); } | OPERATOR LA { $$ = lookup("operator<<="); } | OPERATOR RA { $$ = lookup("operator>>="); } | OPERATOR OR { $$ = lookup("operator||"); } | OPERATOR AN { $$ = lookup("operator&&"); } | OPERATOR '|' { $$ = lookup("operator|"); } | OPERATOR '^' { $$ = lookup("operator^"); } | OPERATOR '&' { $$ = lookup("operator&"); } | OPERATOR EQ { $$ = lookup("operator=="); } | OPERATOR NE { $$ = lookup("operator!="); } | OPERATOR '<' { $$ = lookup("operator<"); } | OPERATOR LE { $$ = lookup("operator<="); } | OPERATOR '>' { $$ = lookup("operator>"); } | OPERATOR GE { $$ = lookup("operator>="); } | OPERATOR LS { $$ = lookup("operator<<"); } | OPERATOR RS { $$ = lookup("operator>>"); } | OPERATOR '+' { $$ = lookup("operator+"); } | OPERATOR '-' { $$ = lookup("operator-"); } | OPERATOR '*' { $$ = lookup("operator*"); } | OPERATOR '/' { $$ = lookup("operator/"); } | OPERATOR '%' { $$ = lookup("operator%"); } | OPERATOR PP { $$ = lookup("operator++"); } | OPERATOR NN { $$ = lookup("operator--"); } | OPERATOR AR { $$ = lookup("operator->"); } | OPERATOR'['']'{ $$ = lookup("operator[]"); } | OPERATOR'('')'{ $$ = lookup("operator()"); } | OPERATOR texp { s1 = c_storage($2.sto); s2 = c_type($2.typ); s = (char*)emalloc(strlen(s1) + strlen(s2) + 10); strcpy(s, "operator "); strcat(s, s1); strcat(s, s2); $$ = lookup(s); if (!$$) $$ = install(s, ID); } ; ctor : TYPE { if (!(p = entry(classtable, $1))) semerror("invalid constructor"); sp->entry = enter(sp->table, $1); sp->entry->info.typ = mknone(); sp->entry->info.sto = Snone; sp->entry->info.offset = sp->offset; sp->node.typ = mkvoid(); sp->node.sto = Snone; } ; dtor : virtual '~' TYPE { if (!(p = entry(classtable, $3))) semerror("invalid destructor"); s = (char*)emalloc(strlen($3->name) + 2); s2 = strrchr($3->name, ':'); if (s2 && *(s2+1) && (s2 == $3->name || *(s2-1) != ':')) { strncpy(s, $3->name, s2 - $3->name + 1); strcat(s, "~"); strcat(s, s2 + 1); } else { strcpy(s, "~"); strcat(s, $3->name); } sym = lookup(s); if (!sym) sym = install(s, ID); sp->entry = enter(sp->table, sym); sp->entry->info.typ = mknone(); sp->entry->info.sto = $1; sp->entry->info.offset = sp->offset; sp->node.typ = mkvoid(); sp->node.sto = Snone; } ; func : fname '(' s6 fargso ')' const abstract { if ($1->level == GLOBAL) { if (!($1->info.sto & Sextern) && sp->entry && sp->entry->info.typ->type == Tpointer && ((Tnode*)sp->entry->info.typ->ref)->type == Tchar) { sprintf(errbuf, "last output parameter of service operation function prototype '%s' is a pointer to a char which will only return one byte: use char** instead to return a string", $1->sym->name); semwarn(errbuf); } if ($1->info.sto & Sextern) { $1->info.typ = mkmethod($1->info.typ, sp->table); } else if (sp->entry && (sp->entry->info.typ->type == Tpointer || sp->entry->info.typ->type == Treference || sp->entry->info.typ->type == Tarray || is_transient(sp->entry->info.typ))) { if ($1->info.typ->type == Tint) { sp->entry->info.sto = (Storage)((int)sp->entry->info.sto | (int)Sreturn); $1->info.typ = mkfun(sp->entry); $1->info.typ->id = $1->sym; if (!is_transient(sp->entry->info.typ)) { if (!is_response(sp->entry->info.typ)) { if (!is_XML(sp->entry->info.typ)) add_response($1, sp->entry); } else { add_result(sp->entry->info.typ); } } add_request($1->sym, sp); } else { sprintf(errbuf, "return type of service operation function prototype '%s' must be integer", $1->sym->name); semerror(errbuf); } } else { sprintf(errbuf, "last output parameter of service operation function prototype '%s' is a return parameter and must be a pointer or reference, or use %s(..., void) for one-way sends", $1->sym->name, $1->sym->name); semerror(errbuf); } } else if ($1->level == INTERNAL) { $1->info.typ = mkmethod($1->info.typ, sp->table); $1->info.sto = (Storage)((int)$1->info.sto | (int)$6 | (int)$7); transient &= ~1; } exitscope(); } ; fname : { $$ = sp->entry; } ; fargso : /* empty */ { } | fargs { } ; fargs : farg { } | farg ',' fargs{ } | error ID { sprintf(errbuf, "undefined '%s'", $2->name); synerror(errbuf); } | error ',' { synerror("formal argument expected"); yyerrok; } ; farg : tspec ptrs arg arrayck occurs init { if ($4.sto & Stypedef) semwarn("typedef in function argument"); p = enter(sp->table, $3); p->info.typ = $4.typ; p->info.sto = $4.sto; if ($5.minOccurs < 0) { if ($6.hasval || ($4.sto & Sattribute) || $4.typ->type == Tpointer) p->info.minOccurs = 0; else p->info.minOccurs = 1; } else { p->info.minOccurs = $5.minOccurs; } p->info.maxOccurs = $5.maxOccurs; if ($6.hasval) { p->info.hasval = True; switch ($4.typ->type) { case Tchar: case Tuchar: case Tshort: case Tushort: case Tint: case Tuint: case Tlong: case Tulong: case Tenum: case Tenumsc: case Ttime: if ($6.typ->type == Tint || $6.typ->type == Tchar || $6.typ->type == Tenum || $6.typ->type == Tenumsc) { sp->val = p->info.val.i = $6.val.i; if (($4.typ->hasmin && $4.typ->min > (double)$6.val.i) || ($4.typ->hasmin && !$4.typ->incmin && $4.typ->min == (double)$6.val.i) || ($4.typ->hasmax && $4.typ->max < (double)$6.val.i) || ($4.typ->hasmax && !$4.typ->incmax && $4.typ->max == (double)$6.val.i)) semerror("initialization constant outside value range"); } else { semerror("type error in initialization constant"); p->info.hasval = False; } break; case Tfloat: case Tdouble: case Tldouble: if ($6.typ->type == Tfloat || $6.typ->type == Tdouble || $6.typ->type == Tldouble) { p->info.val.r = $6.val.r; if (($4.typ->hasmin && $4.typ->min > $6.val.r) || ($4.typ->hasmin && !$4.typ->incmin && $4.typ->min == $6.val.r) || ($4.typ->hasmax && $4.typ->max < $6.val.r) || ($4.typ->hasmax && !$4.typ->incmax && $4.typ->max == $6.val.r)) semerror("initialization constant outside value range"); } else if ($6.typ->type == Tint) { p->info.val.r = (double)$6.val.i; if (($4.typ->hasmin && $4.typ->min > (double)$6.val.i) || ($4.typ->hasmin && !$4.typ->incmin && $4.typ->min == (double)$6.val.i) || ($4.typ->hasmax && $4.typ->max < (double)$6.val.i) || ($4.typ->hasmax && !$4.typ->incmax && $4.typ->max == (double)$6.val.i)) semerror("initialization constant outside value range"); } else { semerror("type error in initialization constant"); p->info.hasval = False; } break; default: if ($4.typ->type == Tpointer && (((Tnode*)$4.typ->ref)->type == Tchar || ((Tnode*)$4.typ->ref)->type == Twchar) && $6.typ->type == Tpointer && ((Tnode*)$6.typ->ref)->type == Tchar) { p->info.val.s = $6.val.s; } else if (($4.typ->type == Tpointer || is_smart($4.typ)) && (((Tnode*)$4.typ->ref)->id == lookup("std::string") || ((Tnode*)$4.typ->ref)->id == lookup("std::wstring"))) { p->info.val.s = $6.val.s; } else if ($4.typ->id == lookup("std::string") || $4.typ->id == lookup("std::wstring")) { p->info.val.s = $6.val.s; } else if ($4.typ->type == Tpointer && $6.typ->type == Tint && $6.val.i == 0) { p->info.val.i = 0; } else { semerror("type error in initialization constant"); p->info.hasval = False; } break; } } p->info.offset = sp->offset; if ($4.sto & Sextern) p->level = GLOBAL; else if (sp->grow) sp->offset += p->info.typ->width; else if (p->info.typ->width > sp->offset) sp->offset = p->info.typ->width; sp->entry = p; } ; arg : /* empty */ { if (sp->table->level != PARAM) $$ = gensymidx("param", (int)++sp->val); else if (eflag) $$ = gensymidx("_param", (int)++sp->val); else $$ = gensym("_param"); } | ID { if (soap_version == 2 && *$1->name == '_' && sp->table->level == GLOBAL) { sprintf(errbuf, "SOAP 1.2 does not support anonymous parameters '%s'", $1->name); semwarn(errbuf); } $$ = $1; } ; /**************************************\ Type specification \**************************************/ /* texpf : type expression (subset of C/C++) */ texpf : texp { $$ = $1; } | tspec ptrs '(' s6 fargso ')' { $$.typ = mkmethod(tmp.typ, sp->table); transient &= ~1; exitscope(); } ; texp : tspec ptrs array { $$ = $3; } | tspec ptrs ID array { $$ = $4; } ; spec : /*empty */ { $$.typ = mkint(); $$.sto = Snone; sp->node = $$; } | store spec { $$.typ = $2.typ; $$.sto = (Storage)((int)$1 | (int)$2.sto); if (($$.sto & Sattribute)) { if (is_smart($2.typ)) { if (!is_primitive_or_string($2.typ->ref) && !is_stdstr($2.typ->ref) && !is_binary($2.typ->ref) && !is_external($2.typ->ref)) { semwarn("invalid attribute smart pointer @type"); $$.sto = (Storage)((int)$$.sto & ~Sattribute); } } else if ($2.typ->type == Tpointer) { if (!is_primitive_or_string($2.typ->ref) && !is_stdstr($2.typ->ref) && !is_binary($2.typ->ref) && !is_external($2.typ->ref)) { semwarn("invalid attribute pointer @type"); $$.sto = (Storage)((int)$$.sto & ~Sattribute); } } else if ( !is_primitive_or_string($2.typ) && !is_stdstr($2.typ) && !is_binary($2.typ) && !is_external($2.typ)) { semwarn("invalid attribute @type"); $$.sto = (Storage)((int)$$.sto & ~Sattribute); } } sp->node = $$; if ($1 & Sextern) transient = 0; } | type spec { if ($1->type == Tint) switch ($2.typ->type) { case Tchar: $$.typ = $2.typ; break; case Tshort: $$.typ = $2.typ; break; case Tint: $$.typ = $1; break; case Tlong: $$.typ = $2.typ; break; case Tllong: $$.typ = $2.typ; break; default: semwarn("invalid int type specified"); $$.typ = $2.typ; } else if ($1->type == Tuint) switch ($2.typ->type) { case Tchar: $$.typ = mkuchar(); break; case Tshort: $$.typ = mkushort(); break; case Tint: $$.typ = $1; break; case Tlong: $$.typ = mkulong(); break; case Tllong: $$.typ = mkullong(); break; default: semwarn("invalid unsigned type specified"); $$.typ = $2.typ; } else if ($1->type == Tlong) switch ($2.typ->type) { case Tint: $$.typ = $1; break; case Tlong: $$.typ = mkllong(); break; case Tuint: $$.typ = mkulong(); break; case Tulong: $$.typ = mkullong(); break; case Tdouble: $$.typ = mkldouble(); break; default: semwarn("invalid use of 'long'"); $$.typ = $2.typ; } else if ($1->type == Tulong) switch ($2.typ->type) { case Tint: $$.typ = $1; break; case Tlong: $$.typ = mkullong(); break; case Tuint: $$.typ = $1; break; case Tulong: $$.typ = mkullong(); break; default: semwarn("invalid use of 'long'"); $$.typ = $2.typ; } else if ($2.typ->type == Tint) $$.typ = $1; else semwarn("invalid type specified (missing ';' or type name used as non-type identifier?)"); $$.sto = $2.sto; sp->node = $$; } ; tspec : store { $$.typ = mkint(); $$.sto = $1; sp->node = $$; if ($1 & Sextern) transient = 0; } | type { $$.typ = $1; $$.sto = Snone; sp->node = $$; } | store tspec { $$.typ = $2.typ; $$.sto = (Storage)((int)$1 | (int)$2.sto); if (($$.sto & Sattribute)) { if (is_smart($2.typ)) { if (!is_primitive_or_string($2.typ->ref) && !is_stdstr($2.typ->ref) && !is_binary($2.typ->ref) && !is_external($2.typ->ref)) { semwarn("invalid attribute smart pointer @type"); $$.sto = (Storage)((int)$$.sto & ~Sattribute); } } else if ($2.typ->type == Tpointer) { if (!is_primitive_or_string($2.typ->ref) && !is_stdstr($2.typ->ref) && !is_binary($2.typ->ref) && !is_external($2.typ->ref)) { semwarn("invalid attribute pointer @type"); $$.sto = (Storage)((int)$$.sto & ~Sattribute); } } else if ( !is_primitive_or_string($2.typ) && !is_stdstr($2.typ) && !is_binary($2.typ) && !is_external($2.typ)) { semwarn("invalid attribute @type"); $$.sto = (Storage)((int)$$.sto & ~Sattribute); } } sp->node = $$; if ($1 & Sextern) transient = 0; } | type tspec { if ($1->type == Tint) switch ($2.typ->type) { case Tchar: $$.typ = $2.typ; break; case Tshort: $$.typ = $2.typ; break; case Tint: $$.typ = $1; break; case Tlong: $$.typ = $2.typ; break; case Tllong: $$.typ = $2.typ; break; default: semwarn("invalid int type specified"); $$.typ = $2.typ; } else if ($1->type == Tuint) switch ($2.typ->type) { case Tchar: $$.typ = mkuchar(); break; case Tshort: $$.typ = mkushort(); break; case Tint: $$.typ = $1; break; case Tlong: $$.typ = mkulong(); break; case Tllong: $$.typ = mkullong(); break; default: semwarn("invalid unsigned type specified"); $$.typ = $2.typ; } else if ($1->type == Tlong) switch ($2.typ->type) { case Tint: $$.typ = $1; break; case Tlong: $$.typ = mkllong(); break; case Tuint: $$.typ = mkulong(); break; case Tulong: $$.typ = mkullong(); break; case Tdouble: $$.typ = mkldouble(); break; default: semwarn("invalid use of 'long'"); $$.typ = $2.typ; } else if ($1->type == Tulong) switch ($2.typ->type) { case Tint: $$.typ = $1; break; case Tlong: $$.typ = mkullong(); break; case Tuint: $$.typ = $1; break; case Tulong: $$.typ = mkullong(); break; default: semwarn("invalid use of 'long'"); $$.typ = $2.typ; } else if ($2.typ->type == Tint) $$.typ = $1; else semwarn("invalid type specified (missing ';' or type name used as non-type identifier?)"); $$.sto = $2.sto; sp->node = $$; } ; type : VOID { $$ = mkvoid(); } | BOOL { $$ = mkbool(); } | CHAR { $$ = mkchar(); } | WCHAR { $$ = mkwchart(); } | SHORT { $$ = mkshort(); } | INT { $$ = mkint(); } | LONG { $$ = mklong(); } | LLONG { $$ = mkllong(); } | ULLONG { $$ = mkullong(); } | SIZE { $$ = mksize(); } | FLOAT { $$ = mkfloat(); } | DOUBLE { $$ = mkdouble(); } | SIGNED { $$ = mkint(); } | UNSIGNED { $$ = mkuint(); } | UCHAR { $$ = mkuchar(); } | USHORT { $$ = mkushort(); } | UINT { $$ = mkuint(); } | ULONG { $$ = mkulong(); } | TIME { $$ = mktimet(); } | TEMPLATE '<' tname id '>' CLASS id { if (!(p = entry(templatetable, $7))) { p = enter(templatetable, $7); p->info.typ = mktemplate(NULL, $7); $7->token = TYPE; } $$ = p->info.typ; } | CLASS '{' s2 decls '}' { sym = gensym("_Struct"); sprintf(errbuf, "anonymous class will be named '%s'", sym->name); semwarn(errbuf); if ((p = entry(classtable, sym))) { if (p->info.typ->ref || p->info.typ->type != Tclass) { sprintf(errbuf, "class '%s' already declared at %s:%d", sym->name, p->filename, p->lineno); semerror(errbuf); } } else { p = enter(classtable, sym); p->info.typ = mkclass(NULL, 0); } sym->token = TYPE; sp->table->sym = sym; p->info.typ->ref = sp->table; p->info.typ->width = sp->offset; p->info.typ->id = sym; $$ = p->info.typ; exitscope(); } | class '{' s2 decls '}' { if ((p = entry(classtable, $1->sym)) && p->info.typ->ref) { if (is_mutable(p)) { if (merge((Table*)p->info.typ->ref, sp->table)) { sprintf(errbuf, "member name clash in class '%s' declared at line %d", $1->sym->name, p->lineno); semerror(errbuf); } p->info.typ->width += sp->offset; } } else { p = reenter(classtable, $1->sym); sp->table->sym = p->sym; p->info.typ->ref = sp->table; p->info.typ->width = sp->offset; p->info.typ->id = p->sym; if (p->info.typ->base) sp->table->prev = (Table*)entry(classtable, p->info.typ->base)->info.typ->ref; } $$ = p->info.typ; exitscope(); } | class ':' base '{' s2 decls '}' { p = reenter(classtable, $1->sym); sp->table->sym = p->sym; if (!$3) { semerror("invalid base class"); } else { sp->table->prev = (Table*)$3->info.typ->ref; if (!sp->table->prev && !$3->info.typ->transient) { sprintf(errbuf, "class '%s' has incomplete type (if this class is not serializable then declare 'extern class %s)'", $3->sym->name, $3->sym->name); semerror(errbuf); } p->info.typ->base = $3->info.typ->id; } p->info.typ->ref = sp->table; p->info.typ->width = sp->offset; p->info.typ->id = p->sym; $$ = p->info.typ; exitscope(); } | class { $1->info.typ->id = $1->sym; $$ = $1->info.typ; } | class ':' base { if (!$3) { semerror("invalid base class"); } else { if (!$3->info.typ->ref && !$3->info.typ->transient) { sprintf(errbuf, "class '%s' has incomplete type (if this class is not serializable then declare 'extern class %s)'", $3->sym->name, $3->sym->name); semerror(errbuf); } $1->info.typ->base = $3->info.typ->id; } $1->info.typ->id = $1->sym; $$ = $1->info.typ; } | STRUCT '{' s2 decls '}' { sym = gensym("_Struct"); sprintf(errbuf, "anonymous struct will be named '%s'", sym->name); semwarn(errbuf); if ((p = entry(classtable, sym))) { if (p->info.typ->ref || p->info.typ->type != Tstruct) { sprintf(errbuf, "struct '%s' already declared at %s:%d", sym->name, p->filename, p->lineno); semerror(errbuf); } else { p->info.typ->ref = sp->table; p->info.typ->width = sp->offset; } } else { p = enter(classtable, sym); p->info.typ = mkstruct(sp->table, sp->offset); } p->info.typ->id = sym; $$ = p->info.typ; exitscope(); } | struct '{' s2 decls '}' { if ((p = entry(classtable, $1->sym)) && p->info.typ->ref) { if (is_mutable(p)) { if (merge((Table*)p->info.typ->ref, sp->table)) { sprintf(errbuf, "member name clash in struct '%s' declared at line %d", $1->sym->name, p->lineno); semerror(errbuf); } p->info.typ->width += sp->offset; } } else { p = reenter(classtable, $1->sym); p->info.typ->ref = sp->table; p->info.typ->width = sp->offset; p->info.typ->id = p->sym; } $$ = p->info.typ; exitscope(); } | STRUCT id { if ((p = entry(classtable, $2))) { if (p->info.typ->type == Tstruct) { $$ = p->info.typ; } else { sprintf(errbuf, "'struct %s' redeclaration (line %d)", $2->name, p->lineno); semerror(errbuf); $$ = mkint(); } } else { p = enter(classtable, $2); $$ = p->info.typ = mkstruct(NULL, 0); p->info.typ->id = $2; } } | UNION '{' s3 decls '}' { sym = gensym("_Union"); sprintf(errbuf, "anonymous union will be named '%s'", sym->name); semwarn(errbuf); if ((p = entry(classtable, sym))) { if (p->info.typ->ref) { sprintf(errbuf, "union or struct '%s' already declared at %s:%d", sym->name, p->filename, p->lineno); semerror(errbuf); } else { p->info.typ->ref = sp->table; p->info.typ->width = sp->offset; } } else { p = enter(classtable, sym); p->info.typ = mkunion(sp->table, sp->offset); } p->info.typ->id = sym; $$ = p->info.typ; exitscope(); } | UNION id '{' s3 decls '}' { if ((p = entry(classtable, $2))) { if (p->info.typ->ref || p->info.typ->type != Tunion) { sprintf(errbuf, "union '%s' already declared at %s:%d", $2->name, p->filename, p->lineno); semerror(errbuf); } else { p = reenter(classtable, $2); p->info.typ->ref = sp->table; p->info.typ->width = sp->offset; } } else { p = enter(classtable, $2); p->info.typ = mkunion(sp->table, sp->offset); } p->info.typ->id = $2; $$ = p->info.typ; exitscope(); } | UNION id { if ((p = entry(classtable, $2))) { if (p->info.typ->type == Tunion) { $$ = p->info.typ; } else { sprintf(errbuf, "'union %s' redeclaration (line %d)", $2->name, p->lineno); semerror(errbuf); $$ = mkint(); } } else { p = enter(classtable, $2); $$ = p->info.typ = mkunion(NULL, 0); p->info.typ->id = $2; } } | ENUM '{' s2 dclrs s5 '}' { sym = gensym("_Enum"); sprintf(errbuf, "anonymous enum will be named '%s'", sym->name); semwarn(errbuf); if ((p = entry(enumtable, sym))) { if (p->info.typ->ref) { sprintf(errbuf, "enum '%s' already declared at %s:%d", sym->name, p->filename, p->lineno); semerror(errbuf); } else { p->info.typ->ref = sp->table; p->info.typ->width = 4; /* 4 = enum */ } } else { p = enter(enumtable, sym); p->info.typ = mkenum(sp->table); } p->info.typ->id = sym; $$ = p->info.typ; exitscope(); } | ENUM '*' '{' s2 dclrs s5 '}' { sym = gensym("_Enum"); sprintf(errbuf, "anonymous enum will be named '%s'", sym->name); semwarn(errbuf); if ((p = entry(enumtable, sym))) { if (p->info.typ->ref) { sprintf(errbuf, "enum '%s' already declared at %s:%d", sym->name, p->filename, p->lineno); semerror(errbuf); } else { p->info.typ->ref = sp->table; p->info.typ->width = 9; /* 9 = mask */ } } else { p = enter(enumtable, sym); p->info.typ = mkmask(sp->table); } p->info.typ->id = sym; $$ = p->info.typ; exitscope(); } | enum '{' s2 dclrs s5 '}' { if ((p = entry(enumtable, $1->sym))) if (!p->info.typ->ref) p->info.typ->ref = sp->table; p->info.typ->id = $1->sym; $$ = p->info.typ; exitscope(); } | enumsc '{' s2 dclrs s5 '}' { if ((p = entry(enumtable, $1->sym))) if (!p->info.typ->ref) p->info.typ->ref = sp->table; p->info.typ->id = $1->sym; $$ = p->info.typ; exitscope(); } | mask '{' s4 dclrs s5 '}' { if ((p = entry(enumtable, $1->sym))) { if (!p->info.typ->ref) { p->info.typ->ref = sp->table; p->info.typ->width = 9; /* 9 = mask */ } } p->info.typ->id = $1->sym; $$ = p->info.typ; exitscope(); } | masksc '{' s4 dclrs s5 '}' { if ((p = entry(enumtable, $1->sym))) { if (!p->info.typ->ref) { p->info.typ->ref = sp->table; p->info.typ->width = 9; /* 9 = mask */ } } p->info.typ->id = $1->sym; $$ = p->info.typ; exitscope(); } | ENUM id { if ((p = entry(enumtable, $2))) { if (p->info.typ->type != Tenum) { sprintf(errbuf, "'enum %s' used where enum class is expected", $2->name); semwarn(errbuf); } $$ = p->info.typ; } else { p = enter(enumtable, $2); $$ = p->info.typ = mkenum(NULL); p->info.typ->id = $2; } } | ENUM sc { if ((p = entry(enumtable, $2))) { if (p->info.typ->type != Tenumsc) { sprintf(errbuf, "'enum class %s' used where enum is expected", $2->name); semwarn(errbuf); } $$ = p->info.typ; } else { p = enter(enumtable, $2); $$ = p->info.typ = mkenumsc(NULL); p->info.typ->id = $2; $2->token = TYPE; } } | TYPE { if ((p = entry(typetable, $1))) { $$ = p->info.typ; } else if ((p = entry(classtable, $1))) { $$ = p->info.typ; } else if ((p = entry(enumtable, $1))) { $$ = p->info.typ; } else if ($1 == lookup("std::string") || $1 == lookup("std::wstring")) { p = enter(classtable, $1); $$ = p->info.typ = mkclass(NULL, 8); p->info.typ->id = $1; if (cflag) p->info.typ->transient = 1; /* make std::string transient in C */ else p->info.typ->transient = -2; /* otherwise volatile in C++ */ } else { sprintf(errbuf, "unknown type '%s'", $1->name); semerror(errbuf); $$ = mkint(); } } | TYPE '<' texpf '>' { if ((p = entry(templatetable, $1))) { $$ = mktemplate($3.typ, $1); if (p->info.typ->transient) $$->transient = p->info.typ->transient; } else if ($1 == lookup("std::deque")) { semwarn("To use std::deque, please also add #import \"import/stldeque.h\""); $$ = mktemplate($3.typ, $1); } else if ($1 == lookup("std::list")) { semwarn("To use std::list, please also add #import \"import/stllist.h\""); $$ = mktemplate($3.typ, $1); } else if ($1 == lookup("std::vector")) { semwarn("To use std::vector, please also add #import \"import/stlvector.h\""); $$ = mktemplate($3.typ, $1); } else if ($1 == lookup("std::set")) { semwarn("To use std::set, please also add #import \"import/stlset.h\""); $$ = mktemplate($3.typ, $1); } else if ($1 == lookup("std::queue")) { $$ = mktemplate($3.typ, $1); $$->transient = 1; /* not serializable */ } else if ($1 == lookup("std::stack")) { $$ = mktemplate($3.typ, $1); $$->transient = 1; /* not serializable */ } else if ($1 == lookup("std::shared_ptr") || $1 == lookup("std::unique_ptr") || $1 == lookup("std::auto_ptr")) { $$ = mktemplate($3.typ, $1); $$->transient = -2; /* volatile indicates smart pointer template */ } else if ($1 == lookup("std::weak_ptr") || $1 == lookup("std::function")) { $$ = mktemplate($3.typ, $1); $$->transient = 1; /* not serializable */ } else { semerror("undefined template"); $$ = mkint(); } } | error ID error { sprintf(errbuf, "undeclared '%s'", $2->name); synerror(errbuf); $$ = mkint(); } | error ID '>' { sprintf(errbuf, "perhaps trying to use a template with an undefined type parameter '%s'?", $2->name); synerror(errbuf); $$ = mkint(); } | error '>' { synerror("perhaps trying to use an undefined template or template with a non-type template parameter? Declare 'template class name'"); $$ = mkint(); } | CLASS error '}' { synerror("malformed class definition (use spacing around ':' to separate derived : base)"); yyerrok; $$ = mkint(); } | STRUCT error '}' { synerror("malformed struct definition"); yyerrok; $$ = mkint(); } | UNION error '}' { synerror("malformed union definition"); yyerrok; $$ = mkint(); } | ENUM error '}' { synerror("malformed enum definition"); yyerrok; $$ = mkint(); } ; struct : STRUCT id { if ((p = entry(classtable, $2))) { if (p->info.typ->ref) { if (!is_mutable(p)) { sprintf(errbuf, "struct '%s' already declared at %s:%d", $2->name, p->filename, p->lineno); semerror(errbuf); } } else { p = reenter(classtable, $2); } p->info.typ->transient = transient; } else { p = enter(classtable, $2); p->info.typ = mkstruct(NULL, 0); } $$ = p; } ; class : CLASS id { if ((p = entry(classtable, $2))) { if (p->info.typ->ref) { if (!is_mutable(p)) { sprintf(errbuf, "class '%s' already declared at %s:%d (redundant 'class' specifier here?)", $2->name, p->filename, p->lineno); semerror(errbuf); } } else { p = reenter(classtable, $2); } p->info.typ->transient = transient; } else { p = enter(classtable, $2); p->info.typ = mkclass(NULL, 0); p->info.typ->id = p->sym; } $2->token = TYPE; $$ = p; } ; enum : ENUM id utype { if ((p = entry(enumtable, $2))) { if (p->info.typ->ref) { sprintf(errbuf, "enum '%s' already declared at %s:%d", $2->name, p->filename, p->lineno); semerror(errbuf); } } else { p = enter(enumtable, $2); p->info.typ = mkenum(0); } p->info.typ->width = (int)$3; $$ = p; } ; enumsc : ENUM sc utype { if ((p = entry(enumtable, $2))) { if (p->info.typ->ref) { sprintf(errbuf, "enum '%s' already declared at %s:%d", $2->name, p->filename, p->lineno); semerror(errbuf); } } else { p = enter(enumtable, $2); p->info.typ = mkenumsc(0); } p->info.typ->width = (int)$3; $2->token = TYPE; $$ = p; } ; mask : ENUM '*' id utype { if ((p = entry(enumtable, $3))) { if (p->info.typ->ref) { sprintf(errbuf, "enum '%s' already declared at %s:%d", $3->name, p->filename, p->lineno); semerror(errbuf); } else { p->info.typ = mkmask(0); } } else { p = enter(enumtable, $3); p->info.typ = mkmask(0); } $$ = p; } ; masksc : ENUM '*' sc utype { if ((p = entry(enumtable, $3))) { if (p->info.typ->ref) { sprintf(errbuf, "enum '%s' already declared at %s:%d", $3->name, p->filename, p->lineno); semerror(errbuf); } else { p->info.typ = mkmasksc(0); } } else { p = enter(enumtable, $3); p->info.typ = mkmasksc(0); } $3->token = TYPE; $$ = p; } ; sc : STRUCT id { $$ = $2; if (!c11flag) semwarn("To use scoped enumerations (enum class) you must also use soapcpp2 option -c++11"); } | CLASS id { $$ = $2; if (!c11flag) semwarn("To use scoped enumerations (enum class) you must also use soapcpp2 option -c++11"); } ; utype : ':' CHAR { $$ = 1; } | ':' WCHAR { $$ = 4; } | ':' SHORT { $$ = 2; } | ':' INT { $$ = 4; } | ':' LONG { $$ = 4; } | ':' LLONG { $$ = 8; } | ':' TYPE { $$ = 4; p = entry(typetable, $2); if (!p) p = entry(enumtable, $2); if (!p) semerror("enum underlying type must be one of int8_t, int16_t, int32_t, int64_t"); else $$ = p->info.typ->width; } | ':' { semerror("enum underlying type must be one of int8_t, int16_t, int32_t, int64_t"); $$ = 4; } | /* empty */ { $$ = 4; /* 4 = enum */ } ; tname : CLASS { } | TYPENAME { } ; base : PROTECTED base{ $$ = $2; } | PRIVATE base { $$ = $2; } | PUBLIC base { $$ = $2; } | TYPE { $$ = entry(classtable, $1); if (!$$) { p = entry(typetable, $1); if (p && (p->info.typ->type == Tclass || p->info.typ->type == Tstruct)) $$ = p; } } | STRUCT ID { $$ = entry(classtable, $2); } ; s2 : /* empty */ { if (transient <= -2) transient = 0; permission = 0; enterscope(mktable(NULL), 0); sp->entry = NULL; } ; s3 : /* empty */ { if (transient <= -2) transient = 0; permission = 0; enterscope(mktable(NULL), 0); sp->entry = NULL; sp->grow = False; } ; s4 : /* empty */ { enterscope(mktable(NULL), 0); sp->entry = NULL; sp->mask = True; sp->val = 1; } ; s5 : /* empty */ { } | ',' { } ; s6 : /* empty */ { if (sp->table->level == INTERNAL) transient |= 1; permission = 0; enterscope(mktable(NULL), 0); sp->entry = NULL; sp->table->level = PARAM; } ; store : AUTO { $$ = Sauto; } | REGISTER { $$ = Sregister; } | STATIC { $$ = Sstatic; } | EXPLICIT { $$ = Sexplicit; } | EXTERN { $$ = Sextern; transient = 1; } | TYPEDEF { $$ = Stypedef; } | VIRTUAL { $$ = Svirtual; } | CONST { $$ = Sconst; } | FINAL { $$ = Sfinal; } | OVERRIDE { $$ = Soverride; } | FRIEND { $$ = Sfriend; } | INLINE { $$ = Sinline; } | MUSTUNDERSTAND{ $$ = SmustUnderstand; } | RETURN { $$ = Sreturn; } | '@' { $$ = Sattribute; if (eflag) semwarn("SOAP RPC encoding does not support XML attributes"); } | '$' { $$ = Sspecial; } | VOLATILE { $$ = Sextern; transient = -2; } | MUTABLE { $$ = Smutable; transient = -4; } ; const : /* empty */ { $$ = Snone; } | const CONST { $$ |= Sconstobj; } | const FINAL { $$ |= Sfinal; } | const OVERRIDE{ $$ |= Soverride; } ; abstract: /* empty */ { $$ = Snone; } | '=' LNG { $$ = Sabstract; } ; virtual : /* empty */ { $$ = Snone; } | VIRTUAL { $$ = Svirtual; } ; ptrs : /* empty */ { $$ = tmp = sp->node; } | ptrs '*' { /* handle const pointers, such as const char* */ if ((tmp.sto & Sconst)) tmp.sto = (Storage)(((int)tmp.sto & ~Sconst) | Sconstptr); tmp.typ = mkpointer(tmp.typ); tmp.typ->transient = transient; $$ = tmp; } | ptrs '&' { tmp.typ = mkreference(tmp.typ); tmp.typ->transient = transient; $$ = tmp; } | ptrs AN { tmp.typ = mkrvalueref(tmp.typ); tmp.typ->transient = transient; $$ = tmp; } ; array : /* empty */ { $$ = tmp; } /* tmp is inherited */ | '[' cexp ']' array { if (!bflag && $4.typ->type == Tchar) { sprintf(errbuf, "char[" SOAP_LONG_FORMAT "] will be serialized as an array of " SOAP_LONG_FORMAT " bytes: use soapcpp2 option -b to enable char[] string serialization or use char* for strings", $2.val.i, $2.val.i); semwarn(errbuf); } if ($2.hasval && $2.typ->type == Tint && $2.val.i > 0 && $4.typ->width > 0) { $$.typ = mkarray($4.typ, (int) $2.val.i * $4.typ->width); } else { $$.typ = mkarray($4.typ, 0); semerror("undetermined array size"); } $$.sto = $4.sto; } | '[' ']' array { $$.typ = mkpointer($3.typ); /* zero size array = pointer */ $$.sto = $3.sto; } ; arrayck : array { if ($1.typ->type == Tstruct || $1.typ->type == Tclass) { if (!$1.typ->ref && !$1.typ->transient && !($1.sto & Stypedef)) { if ($1.typ->type == Tstruct) sprintf(errbuf, "struct '%s' has incomplete type (if this struct is not serializable then declare 'extern struct %s)", $1.typ->id->name, $1.typ->id->name); else sprintf(errbuf, "class '%s' has incomplete type (if this class is not serializable then declare 'extern class %s)", $1.typ->id->name, $1.typ->id->name); semerror(errbuf); } } $$ = $1; } ; brinit : init { $$ = $1; } | '{' cexp '}' { if ($2.hasval) { $$.typ = $2.typ; $$.hasval = True; $$.val = $2.val; } else { $$.hasval = False; semerror("initialization expression not constant"); } } ; init : /* empty */ { $$.hasval = False; } | '=' cexp { if ($2.hasval) { $$.typ = $2.typ; $$.hasval = True; $$.val = $2.val; } else { $$.hasval = False; semerror("initialization expression not constant"); } } ; tag : /* empty */ { $$ = NULL; } | TAG { $$ = $1; } ; occurs : /* empty */ { $$.minOccurs = -1; $$.maxOccurs = 1; $$.hasmin = False; $$.hasmax = False; $$.min = 0.0; $$.max = 0.0; $$.incmin = True; $$.incmax = True; $$.pattern = NULL; } | LNG { $$.minOccurs = $1; $$.maxOccurs = 1; if ($$.minOccurs < 0) $$.minOccurs = -1; $$.hasmin = False; $$.hasmax = False; $$.min = 0.0; $$.max = 0.0; $$.incmin = True; $$.incmax = True; $$.pattern = NULL; } | LNG ':' { $$.minOccurs = $1; $$.maxOccurs = 1; if ($$.minOccurs < 0) $$.minOccurs = -1; $$.hasmin = False; $$.hasmax = False; $$.min = 0.0; $$.max = 0.0; $$.incmin = True; $$.incmax = True; $$.pattern = NULL; } | LNG ':' LNG { $$.minOccurs = $1; $$.maxOccurs = $3; if ($$.minOccurs < 0 || $$.maxOccurs < 0) { $$.minOccurs = -1; $$.maxOccurs = 1; } else if ($$.minOccurs > $$.maxOccurs) { $$.minOccurs = -1; $$.maxOccurs = 1; } $$.hasmin = False; $$.hasmax = False; $$.min = 0.0; $$.max = 0.0; $$.incmin = True; $$.incmax = True; $$.pattern = NULL; } | ':' LNG { $$.minOccurs = -1; $$.maxOccurs = $2; if ($$.maxOccurs < 0) { $$.minOccurs = -1; $$.maxOccurs = 1; } $$.hasmin = False; $$.hasmax = False; $$.min = 0.0; $$.max = 0.0; $$.incmin = True; $$.incmax = True; $$.pattern = NULL; } ; bounds : patt { $$.hasmin = False; $$.hasmax = False; $$.minOccurs = -1; $$.maxOccurs = 1; $$.min = 0.0; $$.max = 0.0; $$.incmin = True; $$.incmax = True; $$.pattern = $1; } | patt cdbl min { $$.hasmin = True; $$.hasmax = False; $$.incmin = $3.incmin; $$.incmax = $3.incmax; $$.minOccurs = (LONG64)$2; $$.maxOccurs = 1; if ($$.minOccurs < 0) $$.minOccurs = -1; $$.min = $2; $$.max = 0.0; $$.pattern = $1; } | patt cdbl minmax cdbl { $$.hasmin = True; $$.hasmax = True; $$.incmin = $3.incmin; $$.incmax = $3.incmax; $$.minOccurs = (LONG64)$2; $$.maxOccurs = (LONG64)$4; if ($$.minOccurs < 0 || $$.maxOccurs < 0) { $$.minOccurs = -1; $$.maxOccurs = 1; } else if ($$.minOccurs > $$.maxOccurs) { $$.minOccurs = -1; $$.maxOccurs = 1; } $$.min = $2; $$.max = $4; $$.pattern = $1; } | patt max cdbl { $$.hasmin = False; $$.hasmax = True; $$.incmin = $2.incmin; $$.incmax = $2.incmax; $$.minOccurs = -1; $$.maxOccurs = (LONG64)$3; if ($$.maxOccurs < 0) { $$.minOccurs = -1; $$.maxOccurs = 1; } $$.min = 0.0; $$.max = $3; $$.pattern = $1; } ; patt : /* empty */ { $$ = NULL; } | STR { $$ = $1; } ; cdbl : DBL { $$ = $1; } | LNG { $$ = (double)$1; } | CHR { $$ = (double)$1; } | '+' cdbl { $$ = +$2; } | '-' cdbl { $$ = -$2; } ; min : /* empty */ { $$.incmin = $$.incmax = True; } | ':' { $$.incmin = $$.incmax = True; } | '<' ':' { $$.incmin = False; $$.incmax = True; } | '<' { $$.incmin = False; $$.incmax = True; } ; minmax : ':' { $$.incmin = $$.incmax = True; } | '<' ':' { $$.incmin = False; $$.incmax = True; } | ':' '<' { $$.incmin = True; $$.incmax = False; } | '<' ':' '<' { $$.incmin = False; $$.incmax = False; } | '<' { $$.incmin = False; $$.incmax = False; } ; max : ':' { $$.incmin = $$.incmax = True; } | ':' '<' { $$.incmin = True; $$.incmax = False; } | '<' { $$.incmin = True; $$.incmax = False; } ; /**************************************\ Expressions \**************************************/ expr : expr ',' expr { $$ = $3; } | cexp { $$ = $1; } ; /* cexp : conditional expression */ cexp : obex '?' qexp ':' cexp { $$.typ = $3.typ; $$.sto = Snone; $$.hasval = False; } | oexp ; /* qexp : true-branch of ? : conditional expression */ qexp : expr { $$ = $1; } ; /* oexp : or-expression */ oexp : obex OR aexp { $$.hasval = False; $$.typ = mkint(); } | aexp { $$ = $1; } ; obex : oexp { $$ = $1; } ; /* aexp : and-expression */ aexp : abex AN rexp { $$.hasval = False; $$.typ = mkint(); } | rexp { $$ = $1; } ; abex : aexp { $$ = $1; } ; /* rexp : relational expression */ rexp : rexp '|' rexp { $$ = iop("|", $1, $3); } | rexp '^' rexp { $$ = iop("^", $1, $3); } | rexp '&' rexp { $$ = iop("&", $1, $3); } | rexp EQ rexp { $$ = relop("==", $1, $3); } | rexp NE rexp { $$ = relop("!=", $1, $3); } | rexp '<' rexp { $$ = relop("<", $1, $3); } | rexp LE rexp { $$ = relop("<=", $1, $3); } | rexp '>' rexp { $$ = relop(">", $1, $3); } | rexp GE rexp { $$ = relop(">=", $1, $3); } | rexp LS rexp { $$ = iop("<<", $1, $3); } | rexp RS rexp { $$ = iop(">>", $1, $3); } | rexp '+' rexp { $$ = op("+", $1, $3); } | rexp '-' rexp { $$ = op("-", $1, $3); } | rexp '*' rexp { $$ = op("*", $1, $3); } | rexp '/' rexp { $$ = op("/", $1, $3); } | rexp '%' rexp { $$ = iop("%", $1, $3); } | lexp { $$ = $1; } ; /* lexp : lvalue kind of expression with optional prefix contructs */ lexp : '!' lexp { if ($2.hasval) $$.val.i = !$2.val.i; $$.typ = $2.typ; $$.hasval = $2.hasval; } | '~' lexp { if ($2.hasval) $$.val.i = ~$2.val.i; $$.typ = $2.typ; $$.hasval = $2.hasval; } | '-' lexp { if ($2.hasval) { if (integer($2.typ)) $$.val.i = -$2.val.i; else if (real($2.typ)) $$.val.r = -$2.val.r; else typerror("string?"); } $$.typ = $2.typ; $$.hasval = $2.hasval; } | '+' lexp { $$ = $2; } | '*' lexp { if ($2.typ->type == Tpointer) $$.typ = (Tnode*)$2.typ->ref; else typerror("dereference of non-pointer type"); $$.sto = Snone; $$.hasval = False; } | '&' lexp { $$.typ = mkpointer($2.typ); $$.sto = Snone; $$.hasval = False; } | SIZEOF '(' texp ')' { $$.hasval = True; $$.typ = mkint(); $$.val.i = $3.typ->width; } | pexp { $$ = $1; } ; /* pexp : primitive expression with optional postfix constructs */ pexp : '(' expr ')' { $$ = $2; } | ID { if (!(p = enumentry($1))) p = undefined($1); else $$.hasval = True; $$.typ = p->info.typ; $$.val = p->info.val; } | LNG { $$.typ = mkint(); $$.hasval = True; $$.val.i = $1; } | null { $$.typ = mkint(); $$.hasval = True; $$.val.i = 0; } | DBL { $$.typ = mkfloat(); $$.hasval = True; $$.val.r = $1; } | CHR { $$.typ = mkchar(); $$.hasval = True; $$.val.i = $1; } | STR { $$.typ = mkstring(); $$.hasval = True; $$.val.s = $1; } | CFALSE { $$.typ = mkbool(); $$.hasval = True; $$.val.i = 0; } | CTRUE { $$.typ = mkbool(); $$.hasval = True; $$.val.i = 1; } ; %% /* * ??? */ int yywrap(void) { return 1; } /**************************************\ Support routines \**************************************/ static Node op(const char *op, Node p, Node q) { Node r; Tnode *typ; r.typ = p.typ; r.sto = Snone; if (p.hasval && q.hasval) { if (integer(p.typ) && integer(q.typ)) switch (op[0]) { case '|': r.val.i = p.val.i | q.val.i; break; case '^': r.val.i = p.val.i ^ q.val.i; break; case '&': r.val.i = p.val.i & q.val.i; break; case '<': r.val.i = p.val.i << q.val.i; break; case '>': r.val.i = p.val.i >> q.val.i; break; case '+': r.val.i = p.val.i + q.val.i; break; case '-': r.val.i = p.val.i - q.val.i; break; case '*': r.val.i = p.val.i * q.val.i; break; case '/': r.val.i = p.val.i / q.val.i; break; case '%': r.val.i = p.val.i % q.val.i; break; default: typerror(op); } else if (real(p.typ) && real(q.typ)) switch (op[0]) { case '+': r.val.r = p.val.r + q.val.r; break; case '-': r.val.r = p.val.r - q.val.r; break; case '*': r.val.r = p.val.r * q.val.r; break; case '/': r.val.r = p.val.r / q.val.r; break; default: typerror(op); } else semerror("invalid constant operation"); r.hasval = True; } else { typ = mgtype(p.typ, q.typ); r.hasval = False; } return r; } static Node iop(const char *iop, Node p, Node q) { if (integer(p.typ) && integer(q.typ)) return op(iop, p, q); typerror("integer operands only"); return p; } static Node relop(const char *op, Node p, Node q) { Node r; Tnode *typ; r.typ = mkint(); r.sto = Snone; r.hasval = True; r.val.i = 1; sprintf(errbuf, "comparison '%s' not evaluated and considered true", op); semwarn(errbuf); if (p.typ->type != Tpointer || p.typ != q.typ) typ = mgtype(p.typ, q.typ); return r; } /**************************************\ Scope management \**************************************/ /* mkscope - initialize scope stack with a new table and offset */ static void mkscope(Table *table, int offset) { sp = stack-1; enterscope(table, offset); } /* enterscope - enter a new scope by pushing a new table and offset on the stack */ static void enterscope(Table *table, int offset) { if (++sp == stack+MAXNEST) execerror("maximum scope depth exceeded"); sp->table = table; sp->val = 0; sp->offset = offset; sp->grow = True; /* by default, offset grows */ sp->mask = False; } /* exitscope - exit a scope by popping the table and offset from the stack */ static void exitscope(void) { check(sp-- != stack, "exitscope() has no matching enterscope()"); } /**************************************\ Undefined symbol \**************************************/ static Entry* undefined(Symbol *sym) { Entry *p; sprintf(errbuf, "undefined identifier '%s'", sym->name); semwarn(errbuf); p = enter(sp->table, sym); p->level = GLOBAL; p->info.typ = mkint(); p->info.sto = Sextern; p->info.hasval = False; return p; } /* mgtype - return most general type among two numerical types */ Tnode* mgtype(Tnode *typ1, Tnode *typ2) { if (numeric(typ1) && numeric(typ2)) { if (typ1->type < typ2->type) return typ2; } else { typerror("non-numeric type"); } return typ1; } /**************************************\ Type checks \**************************************/ static int integer(Tnode *typ) { switch (typ->type) { case Tchar: case Tshort: case Tint: case Tlong: return True; default: break; } return False; } static int real(Tnode *typ) { switch (typ->type) { case Tfloat: case Tdouble: case Tldouble: return True; default: break; } return False; } static int numeric(Tnode *typ) { return integer(typ) || real(typ); } static void add_fault(void) { Table *t; Entry *p1, *p2, *p3, *p4; Symbol *s1, *s2, *s3, *s4; imported = NULL; s1 = lookup("SOAP_ENV__Code"); p1 = entry(classtable, s1); if (!p1 || !p1->info.typ->ref) { t = mktable(NULL); if (!p1) { p1 = enter(classtable, s1); p1->info.typ = mkstruct(t, 3*4); p1->info.typ->id = s1; } else { p1->info.typ->ref = t; } p2 = enter(t, lookup("SOAP_ENV__Value")); p2->info.typ = qname; p2->info.minOccurs = 0; p2 = enter(t, lookup("SOAP_ENV__Subcode")); p2->info.typ = mkpointer(p1->info.typ); p2->info.minOccurs = 0; } s2 = lookup("SOAP_ENV__Detail"); p2 = entry(classtable, s2); if (!p2 || !p2->info.typ->ref) { t = mktable(NULL); if (!p2) { p2 = enter(classtable, s2); p2->info.typ = mkstruct(t, 3*4); p2->info.typ->id = s2; } else { p2->info.typ->ref = t; } p3 = enter(t, lookup("__any")); p3->info.typ = xml; p3->info.minOccurs = 0; p3 = enter(t, lookup("__type")); p3->info.typ = mkint(); p3->info.minOccurs = 0; p3 = enter(t, lookup("fault")); p3->info.typ = mkpointer(mkvoid()); p3->info.minOccurs = 0; custom_fault = 0; } s4 = lookup("SOAP_ENV__Reason"); p4 = entry(classtable, s4); if (!p4 || !p4->info.typ->ref) { t = mktable(NULL); if (!p4) { p4 = enter(classtable, s4); p4->info.typ = mkstruct(t, 4); p4->info.typ->id = s4; } else { p4->info.typ->ref = t; } p3 = enter(t, lookup("SOAP_ENV__Text")); p3->info.typ = mkstring(); p3->info.minOccurs = 0; } s3 = lookup("SOAP_ENV__Fault"); p3 = entry(classtable, s3); if (!p3 || !p3->info.typ->ref) { t = mktable(NULL); if (!p3) { p3 = enter(classtable, s3); p3->info.typ = mkstruct(t, 9*4); p3->info.typ->id = s3; } else { p3->info.typ->ref = t; } p3 = enter(t, lookup("faultcode")); p3->info.typ = qname; p3->info.minOccurs = 0; p3 = enter(t, lookup("faultstring")); p3->info.typ = mkstring(); p3->info.minOccurs = 0; p3 = enter(t, lookup("faultactor")); p3->info.typ = mkstring(); p3->info.minOccurs = 0; p3 = enter(t, lookup("detail")); p3->info.typ = mkpointer(p2->info.typ); p3->info.minOccurs = 0; p3 = enter(t, s1); p3->info.typ = mkpointer(p1->info.typ); p3->info.minOccurs = 0; p3 = enter(t, s4); p3->info.typ = mkpointer(p4->info.typ); p3->info.minOccurs = 0; p3 = enter(t, lookup("SOAP_ENV__Node")); p3->info.typ = mkstring(); p3->info.minOccurs = 0; p3 = enter(t, lookup("SOAP_ENV__Role")); p3->info.typ = mkstring(); p3->info.minOccurs = 0; p3 = enter(t, lookup("SOAP_ENV__Detail")); p3->info.typ = mkpointer(p2->info.typ); p3->info.minOccurs = 0; } } static void add_soap(void) { Symbol *s = lookup("soap"); p = enter(classtable, s); p->info.typ = mkstruct(NULL, 0); p->info.typ->transient = -2; p->info.typ->id = s; } static void add_XML(void) { Symbol *s = lookup("_XML"); s->token = TYPE; p = enter(typetable, s); xml = p->info.typ = mksymtype(mkstring(), s); p->info.sto = Stypedef; } static void add_qname(void) { Symbol *s = lookup("_QName"); s->token = TYPE; p = enter(typetable, s); qname = p->info.typ = mksymtype(mkstring(), s); p->info.sto = Stypedef; } static void add_header(void) { Table *t; Entry *p; Symbol *s = lookup("SOAP_ENV__Header"); imported = NULL; p = entry(classtable, s); if (!p || !p->info.typ->ref) { t = mktable(NULL); if (!p) p = enter(classtable, s); p->info.typ = mkstruct(t, 0); p->info.typ->id = s; custom_header = 0; } } static void add_response(Entry *fun, Entry *ret) { Table *t; Entry *p, *q; Symbol *s; size_t i = 0, j, n = strlen(fun->sym->name); char *r = (char*)emalloc(n+100); strcpy(r, fun->sym->name); strcat(r, "Response"); do { for (j = 0; j < i; j++) r[n+j+8] = '_'; r[n+i+8] = '\0'; if (!(s = lookup(r))) s = install(r, ID); i++; } while (entry(classtable, s)); free(r); t = mktable(NULL); q = enter(t, ret->sym); q->info = ret->info; if (q->info.typ->type == Treference) q->info.typ = (Tnode*)q->info.typ->ref; p = enter(classtable, s); p->info.typ = mkstruct(t, 4); p->info.typ->id = s; fun->info.typ->response = p; } static void add_result(Tnode *typ) { Entry *p; if (!typ->ref || !((Tnode*)typ->ref)->ref) { semwarn("response struct/class must be declared before used in function prototype"); return; } for (p = ((Table*)((Tnode*)typ->ref)->ref)->list; p; p = p->next) if (p->info.sto & Sreturn) return; for (p = ((Table*)((Tnode*)typ->ref)->ref)->list; p; p = p->next) { if (p->info.typ->type != Tfun && !(p->info.sto & Sattribute) && !is_transient(p->info.typ) && !(p->info.sto & (Sprivate|Sprotected))) p->info.sto = (Storage)((int)p->info.sto | (int)Sreturn); return; } } static void add_request(Symbol *sym, Scope *sp) { Entry *p; unlinklast(sp->table); if ((p = entry(classtable, sym))) { if (p->info.typ->ref) { sprintf(errbuf, "service operation name clash: struct/class '%s' already declared at %s:%d", sym->name, p->filename, p->lineno); semerror(errbuf); } else { p->info.typ->ref = sp->table; p->info.typ->width = sp->offset; } } else { p = enter(classtable, sym); p->info.typ = mkstruct(sp->table, sp->offset); p->info.typ->id = sym; } if (p->info.typ->ref) { for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next) { if (q->info.typ->type == Treference || q->info.typ->type == Trvalueref) { sprintf(errbuf, "parameter '%s' of service operation function '%s()' in %s:%d cannot be passed by reference: use a pointer instead", q->sym->name, sym->name, q->filename, q->lineno); semwarn(errbuf); } else if ((q->info.sto & (Sconst | Sconstptr))) { if (!is_string(q->info.typ) && !is_wstring(q->info.typ)) { sprintf(errbuf, "parameter '%s' of service operation function '%s()' in %s:%d cannot be declared const", q->sym->name, sym->name, q->filename, q->lineno); semwarn(errbuf); } } else if ((q->info.sto & ~(Sattribute | Sextern | Sspecial))) { sprintf(errbuf, "invalid parameter '%s' of service operation function '%s()' in %s:%d", q->sym->name, sym->name, q->filename, q->lineno); semwarn(errbuf); } } } } gsoap-2.8.28/gsoap/VisualStudio2005/soapcpp2/soapcpp2/Debug/0000755000175000017500000000000012653650160022647 5ustar ellertellertgsoap-2.8.28/gsoap/VisualStudio2005/soapcpp2/soapcpp2/lex.soapcpp2_lex.c0000644000175000017500000025236012653650160025163 0ustar ellertellert #line 3 "lex.yy.c" #define YY_INT_ALIGNED short int /* A lexical scanner generated by flex */ #define FLEX_SCANNER #define YY_FLEX_MAJOR_VERSION 2 #define YY_FLEX_MINOR_VERSION 5 #define YY_FLEX_SUBMINOR_VERSION 35 #if YY_FLEX_SUBMINOR_VERSION > 0 #define FLEX_BETA #endif /* First, we deal with platform-specific or compiler-specific issues. */ /* begin standard C headers. */ #include #include #include #include /* end standard C headers. */ /* flex integer type definitions */ #ifndef FLEXINT_H #define FLEXINT_H /* C99 systems have . Non-C99 systems may or may not. */ #if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, * if you want the limit (max/min) macros for int types. */ #ifndef __STDC_LIMIT_MACROS #define __STDC_LIMIT_MACROS 1 #endif #include typedef int8_t flex_int8_t; typedef uint8_t flex_uint8_t; typedef int16_t flex_int16_t; typedef uint16_t flex_uint16_t; typedef int32_t flex_int32_t; typedef uint32_t flex_uint32_t; typedef uint64_t flex_uint64_t; #else typedef signed char flex_int8_t; typedef short int flex_int16_t; typedef int flex_int32_t; typedef unsigned char flex_uint8_t; typedef unsigned short int flex_uint16_t; typedef unsigned int flex_uint32_t; #endif /* ! C99 */ /* Limits of integral types. */ #ifndef INT8_MIN #define INT8_MIN (-128) #endif #ifndef INT16_MIN #define INT16_MIN (-32767-1) #endif #ifndef INT32_MIN #define INT32_MIN (-2147483647-1) #endif #ifndef INT8_MAX #define INT8_MAX (127) #endif #ifndef INT16_MAX #define INT16_MAX (32767) #endif #ifndef INT32_MAX #define INT32_MAX (2147483647) #endif #ifndef UINT8_MAX #define UINT8_MAX (255U) #endif #ifndef UINT16_MAX #define UINT16_MAX (65535U) #endif #ifndef UINT32_MAX #define UINT32_MAX (4294967295U) #endif #endif /* ! FLEXINT_H */ #ifdef __cplusplus /* The "const" storage-class-modifier is valid. */ #define YY_USE_CONST #else /* ! __cplusplus */ /* C99 requires __STDC__ to be defined as 1. */ #if defined (__STDC__) #define YY_USE_CONST #endif /* defined (__STDC__) */ #endif /* ! __cplusplus */ #ifdef YY_USE_CONST #define yyconst const #else #define yyconst #endif /* Returned upon end-of-file. */ #define YY_NULL 0 /* Promotes a possibly negative, possibly signed char to an unsigned * integer for use as an array index. If the signed char is negative, * we want to instead treat it as an 8-bit unsigned char, hence the * double cast. */ #define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) /* Enter a start condition. This macro really ought to take a parameter, * but we do it the disgusting crufty way forced on us by the ()-less * definition of BEGIN. */ #define BEGIN (yy_start) = 1 + 2 * /* Translate the current start state into a value that can be later handed * to BEGIN to return to the state. The YYSTATE alias is for lex * compatibility. */ #define YY_START (((yy_start) - 1) / 2) #define YYSTATE YY_START /* Action number for EOF rule of a given start state. */ #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) /* Special action meaning "start processing a new file". */ #define YY_NEW_FILE yyrestart(yyin ) #define YY_END_OF_BUFFER_CHAR 0 /* Size of default input buffer. */ #ifndef YY_BUF_SIZE #define YY_BUF_SIZE 16384 #endif /* The state buf must be large enough to hold one state per character in the main buffer. */ #define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) #ifndef YY_TYPEDEF_YY_BUFFER_STATE #define YY_TYPEDEF_YY_BUFFER_STATE typedef struct yy_buffer_state *YY_BUFFER_STATE; #endif #ifndef YY_TYPEDEF_YY_SIZE_T #define YY_TYPEDEF_YY_SIZE_T typedef size_t yy_size_t; #endif extern yy_size_t yyleng; extern FILE *yyin, *yyout; #define EOB_ACT_CONTINUE_SCAN 0 #define EOB_ACT_END_OF_FILE 1 #define EOB_ACT_LAST_MATCH 2 /* Note: We specifically omit the test for yy_rule_can_match_eol because it requires * access to the local variable yy_act. Since yyless() is a macro, it would break * existing scanners that call yyless() from OUTSIDE yylex. * One obvious solution it to make yy_act a global. I tried that, and saw * a 5% performance hit in a non-yylineno scanner, because yy_act is * normally declared as a register variable-- so it is not worth it. */ #define YY_LESS_LINENO(n) \ do { \ yy_size_t yyl;\ for ( yyl = n; yyl < yyleng; ++yyl )\ if ( yytext[yyl] == '\n' )\ --yylineno;\ }while(0) /* Return all but the first "n" matched characters back to the input stream. */ #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ *yy_cp = (yy_hold_char); \ YY_RESTORE_YY_MORE_OFFSET \ (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ YY_DO_BEFORE_ACTION; /* set up yytext again */ \ } \ while ( 0 ) #define unput(c) yyunput( c, (yytext_ptr) ) #ifndef YY_STRUCT_YY_BUFFER_STATE #define YY_STRUCT_YY_BUFFER_STATE struct yy_buffer_state { FILE *yy_input_file; char *yy_ch_buf; /* input buffer */ char *yy_buf_pos; /* current position in input buffer */ /* Size of input buffer in bytes, not including room for EOB * characters. */ yy_size_t yy_buf_size; /* Number of characters read into yy_ch_buf, not including EOB * characters. */ yy_size_t yy_n_chars; /* Whether we "own" the buffer - i.e., we know we created it, * and can realloc() it to grow it, and should free() it to * delete it. */ int yy_is_our_buffer; /* Whether this is an "interactive" input source; if so, and * if we're using stdio for input, then we want to use getc() * instead of fread(), to make sure we stop fetching input after * each newline. */ int yy_is_interactive; /* Whether we're considered to be at the beginning of a line. * If so, '^' rules will be active on the next match, otherwise * not. */ int yy_at_bol; int yy_bs_lineno; /**< The line count. */ int yy_bs_column; /**< The column count. */ /* Whether to try to fill the input buffer when we reach the * end of it. */ int yy_fill_buffer; int yy_buffer_status; #define YY_BUFFER_NEW 0 #define YY_BUFFER_NORMAL 1 /* When an EOF's been seen but there's still some text to process * then we mark the buffer as YY_EOF_PENDING, to indicate that we * shouldn't try reading from the input source any more. We might * still have a bunch of tokens to match, though, because of * possible backing-up. * * When we actually see the EOF, we change the status to "new" * (via yyrestart()), so that the user can continue scanning by * just pointing yyin at a new input file. */ #define YY_BUFFER_EOF_PENDING 2 }; #endif /* !YY_STRUCT_YY_BUFFER_STATE */ /* Stack of input buffers. */ static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */ static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */ static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */ /* We provide macros for accessing buffer states in case in the * future we want to put the buffer states in a more general * "scanner state". * * Returns the top of the stack, or NULL. */ #define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ : NULL) /* Same as previous macro, but useful when we know that the buffer stack is not * NULL or when we need an lvalue. For internal use only. */ #define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] /* yy_hold_char holds the character lost when yytext is formed. */ static char yy_hold_char; static yy_size_t yy_n_chars; /* number of characters read into yy_ch_buf */ yy_size_t yyleng; /* Points to current character in buffer. */ static char *yy_c_buf_p = (char *) 0; static int yy_init = 0; /* whether we need to initialize */ static int yy_start = 0; /* start state number */ /* Flag which is used to allow yywrap()'s to do buffer switches * instead of setting up a fresh yyin. A bit of a hack ... */ static int yy_did_buffer_switch_on_eof; void yyrestart (FILE *input_file ); void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ); YY_BUFFER_STATE yy_create_buffer (FILE *file,int size ); void yy_delete_buffer (YY_BUFFER_STATE b ); void yy_flush_buffer (YY_BUFFER_STATE b ); void yypush_buffer_state (YY_BUFFER_STATE new_buffer ); void yypop_buffer_state (void ); static void yyensure_buffer_stack (void ); static void yy_load_buffer_state (void ); static void yy_init_buffer (YY_BUFFER_STATE b,FILE *file ); #define YY_FLUSH_BUFFER yy_flush_buffer(YY_CURRENT_BUFFER ) YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size ); YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str ); YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,yy_size_t len ); void *yyalloc (yy_size_t ); void *yyrealloc (void *,yy_size_t ); void yyfree (void * ); #define yy_new_buffer yy_create_buffer #define yy_set_interactive(is_interactive) \ { \ if ( ! YY_CURRENT_BUFFER ){ \ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer(yyin,YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ } #define yy_set_bol(at_bol) \ { \ if ( ! YY_CURRENT_BUFFER ){\ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer(yyin,YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ } #define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) /* Begin user sect3 */ #define yywrap(n) 1 #define YY_SKIP_YYWRAP typedef unsigned char YY_CHAR; FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; typedef int yy_state_type; #define YY_FLEX_LEX_COMPAT extern int yylineno; int yylineno = 1; extern char yytext[]; static yy_state_type yy_get_previous_state (void ); static yy_state_type yy_try_NUL_trans (yy_state_type current_state ); static int yy_get_next_buffer (void ); static void yy_fatal_error (yyconst char msg[] ); /* Done after the current pattern has been matched and before the * corresponding action - sets up yytext. */ #define YY_DO_BEFORE_ACTION \ (yytext_ptr) = yy_bp; \ yyleng = (yy_size_t) (yy_cp - yy_bp); \ (yy_hold_char) = *yy_cp; \ *yy_cp = '\0'; \ if ( yyleng + (yy_more_offset) >= YYLMAX ) \ YY_FATAL_ERROR( "token too large, exceeds YYLMAX" ); \ yy_flex_strncpy( &yytext[(yy_more_offset)], (yytext_ptr), yyleng + 1 ); \ yyleng += (yy_more_offset); \ (yy_prev_more_offset) = (yy_more_offset); \ (yy_more_offset) = 0; \ (yy_c_buf_p) = yy_cp; #define YY_NUM_RULES 45 #define YY_END_OF_BUFFER 46 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info { flex_int32_t yy_verify; flex_int32_t yy_nxt; }; static yyconst flex_int16_t yy_acclist[159] = { 0, 46, 44, 45, 2, 44, 45, 2, 45, 31, 44, 45, 44, 45,16427, 44, 45, 31, 44, 45, 31, 44, 45, 31, 44, 45, 44, 45,16426, 31, 44, 45, 31, 44, 45, 31, 44, 45, 31, 44, 45, 34, 44, 45, 34, 44, 45, 31, 44, 45, 31, 44, 45, 31, 44, 45, 31, 44, 45, 32, 44, 45, 32, 44, 45, 44, 45, 31, 44, 45, 44, 45, 31, 44, 45, 32, 44, 45, 32, 44, 45, 4, 45, 4, 45, 23,16427, 8235, 38,16427, 41, 14, 21, 15,16426, 8234, 37,16426, 12, 28, 10, 29, 11, 30, 3, 13, 34, 32, 32, 26, 24, 22, 25, 27, 32, 32, 16, 17, 20, 32, 32, 32, 5, 8235, 38, 37, 9, 36, 36, 35, 18, 19, 32, 32, 33, 1, 32, 36, 41, 41, 7, 9, 8, 9, 40, 41, 40, 39, 41, 39, 40, 41, 40, 39, 41, 39, 6, 7, 9 } ; static yyconst flex_int16_t yy_accept[169] = { 0, 1, 1, 1, 1, 1, 2, 4, 7, 9, 12, 15, 17, 20, 23, 26, 29, 32, 35, 38, 41, 44, 47, 50, 53, 56, 59, 62, 65, 67, 70, 72, 75, 78, 81, 83, 85, 86, 87, 88, 89, 90, 90, 91, 91, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 105, 106, 106, 107, 107, 107, 108, 108, 109, 110, 111, 112, 113, 114, 115, 115, 115, 116, 116, 116, 117, 117, 118, 119, 120, 121, 122, 123, 123, 123, 124, 125, 125, 125, 126, 126, 127, 127, 127, 127, 128, 128, 129, 130, 131, 132, 132, 133, 134, 134, 135, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 139, 139, 140, 140, 142, 142, 142, 144, 144, 144, 146, 146, 146, 147, 147, 147, 149, 149, 149, 150, 150, 152, 153, 155, 156, 156, 156, 159, 159 } ; static yyconst flex_int32_t yy_ec[256] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 4, 5, 6, 7, 8, 9, 10, 11, 8, 8, 12, 13, 8, 14, 15, 16, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 8, 20, 21, 22, 8, 8, 23, 23, 23, 23, 24, 23, 25, 25, 25, 25, 25, 26, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 27, 25, 25, 8, 28, 8, 29, 25, 30, 31, 23, 23, 32, 33, 23, 34, 35, 36, 25, 25, 37, 38, 25, 39, 40, 25, 41, 42, 43, 44, 25, 25, 45, 25, 25, 8, 46, 8, 8, 1, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 48, 47, 47, 47, 47, 47, 47, 47, 49, 47, 49, 47, 47, 49, 47, 49, 47, 47, 49, 47, 47, 49, 47, 49, 49, 49, 49, 50, 49, 49, 49, 51, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 53, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52 } ; static yyconst flex_int32_t yy_meta[54] = { 0, 1, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 4, 4, 1, 1, 2, 5, 5, 5, 5, 5, 5, 1, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1, 1, 1, 5, 1, 1, 5, 5 } ; static yyconst flex_int16_t yy_base[185] = { 0, 0, 346, 385, 384, 395, 500, 500, 500, 373, 51, 52, 500, 372, 46, 55, 370, 47, 48, 59, 67, 78, 45, 43, 367, 55, 53, 80, 343, 364, 0, 57, 115, 334, 500, 366, 500, 86, 59, 500, 98, 378, 500, 71, 107, 500, 500, 500, 110, 500, 500, 112, 500, 500, 500, 500, 500, 500, 500, 113, 500, 100, 124, 136, 152, 103, 335, 0, 347, 500, 500, 500, 346, 108, 154, 312, 130, 124, 169, 500, 325, 500, 500, 0, 0, 298, 500, 131, 185, 145, 168, 104, 186, 117, 323, 500, 187, 191, 194, 181, 102, 107, 192, 500, 500, 212, 190, 199, 234, 500, 0, 189, 216, 209, 200, 231, 217, 223, 255, 253, 257, 219, 224, 260, 259, 261, 265, 275, 286, 284, 261, 292, 293, 298, 309, 321, 294, 317, 332, 335, 338, 341, 302, 500, 311, 298, 500, 297, 344, 350, 228, 356, 359, 205, 362, 368, 201, 371, 374, 347, 500, 500, 500, 500, 132, 58, 500, 500, 422, 427, 432, 437, 54, 439, 444, 449, 454, 459, 464, 469, 474, 479, 484, 489, 494 } ; static yyconst flex_int16_t yy_def[185] = { 0, 167, 1, 168, 168, 167, 167, 167, 167, 167, 169, 170, 167, 167, 167, 171, 167, 167, 167, 167, 167, 167, 172, 167, 167, 167, 173, 173, 167, 167, 174, 167, 173, 32, 167, 167, 167, 169, 175, 167, 169, 170, 167, 170, 170, 167, 167, 167, 171, 167, 167, 171, 167, 167, 167, 167, 167, 167, 167, 176, 167, 167, 167, 167, 167, 173, 167, 32, 167, 167, 167, 167, 167, 173, 173, 167, 32, 175, 167, 167, 174, 167, 167, 32, 32, 32, 167, 175, 175, 175, 175, 170, 170, 177, 176, 167, 176, 176, 176, 167, 167, 167, 167, 167, 167, 167, 32, 32, 167, 167, 32, 175, 170, 170, 177, 177, 176, 176, 167, 167, 167, 170, 170, 176, 176, 167, 167, 167, 167, 170, 170, 176, 176, 167, 170, 170, 178, 179, 180, 181, 182, 183, 178, 167, 178, 179, 167, 180, 180, 181, 181, 181, 181, 182, 182, 183, 183, 183, 183, 178, 167, 167, 167, 167, 184, 184, 167, 0, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167 } ; static yyconst flex_int16_t yy_nxt[554] = { 0, 6, 7, 8, 7, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 12, 19, 20, 21, 22, 23, 24, 25, 26, 26, 26, 27, 26, 28, 29, 30, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 31, 6, 7, 26, 6, 6, 32, 32, 38, 42, 46, 39, 49, 65, 53, 166, 55, 68, 69, 39, 50, 47, 54, 56, 57, 58, 74, 66, 42, 59, 71, 72, 81, 40, 60, 75, 61, 51, 62, 62, 77, 88, 43, 38, 44, 63, 39, 61, 64, 62, 62, 67, 67, 74, 63, 89, 63, 82, 90, 76, 76, 42, 75, 91, 42, 63, 64, 49, 40, 49, 95, 99, 99, 101, 101, 50, 74, 93, 101, 101, 40, 74, 50, 96, 39, 75, 76, 76, 74, 166, 75, 39, 51, 61, 51, 62, 62, 75, 112, 115, 92, 97, 63, 100, 100, 39, 88, 101, 101, 76, 76, 63, 98, 88, 76, 76, 83, 83, 84, 83, 83, 76, 76, 102, 102, 167, 167, 88, 39, 102, 102, 106, 106, 107, 106, 106, 75, 102, 102, 102, 108, 108, 111, 42, 95, 90, 108, 108, 95, 39, 88, 95, 99, 99, 108, 108, 108, 96, 163, 118, 76, 76, 162, 102, 102, 50, 42, 88, 118, 102, 102, 88, 113, 42, 95, 97, 42, 102, 102, 102, 95, 42, 115, 119, 119, 161, 98, 116, 117, 119, 119, 106, 106, 107, 106, 106, 93, 119, 119, 119, 106, 106, 107, 106, 106, 120, 120, 122, 124, 121, 123, 120, 120, 115, 129, 130, 95, 95, 42, 120, 120, 120, 125, 125, 127, 127, 126, 126, 128, 128, 127, 127, 126, 126, 128, 128, 126, 126, 127, 127, 127, 42, 128, 128, 128, 131, 133, 133, 135, 95, 95, 143, 133, 133, 160, 146, 132, 65, 65, 143, 133, 133, 133, 65, 65, 138, 139, 138, 143, 73, 73, 65, 65, 65, 146, 73, 73, 140, 141, 140, 95, 134, 137, 73, 73, 73, 136, 144, 148, 149, 148, 151, 152, 151, 154, 155, 154, 157, 158, 157, 148, 149, 148, 110, 143, 159, 151, 152, 151, 109, 105, 138, 151, 152, 151, 151, 152, 151, 154, 155, 154, 104, 103, 140, 157, 158, 157, 157, 158, 157, 157, 158, 157, 78, 148, 42, 86, 151, 85, 79, 154, 78, 70, 157, 164, 52, 148, 45, 36, 167, 35, 35, 151, 33, 167, 167, 167, 167, 151, 167, 167, 151, 167, 167, 154, 167, 167, 167, 167, 167, 157, 167, 167, 157, 167, 167, 157, 34, 34, 34, 34, 34, 37, 37, 37, 37, 37, 41, 41, 41, 41, 41, 48, 48, 48, 48, 48, 73, 73, 80, 167, 167, 80, 80, 87, 87, 87, 87, 87, 94, 94, 94, 94, 94, 114, 114, 167, 114, 114, 142, 142, 142, 142, 142, 145, 145, 145, 145, 145, 147, 147, 147, 147, 147, 150, 150, 150, 150, 150, 153, 153, 153, 153, 153, 156, 156, 156, 156, 156, 165, 165, 165, 165, 165, 5, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167 } ; static yyconst flex_int16_t yy_chk[554] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 10, 11, 14, 10, 15, 172, 17, 165, 18, 23, 23, 38, 15, 14, 17, 18, 18, 19, 26, 22, 43, 19, 25, 25, 31, 10, 19, 26, 20, 15, 20, 20, 27, 38, 11, 37, 11, 20, 37, 21, 20, 21, 21, 22, 22, 27, 20, 40, 21, 31, 40, 26, 26, 91, 27, 43, 44, 21, 20, 48, 37, 51, 59, 61, 61, 100, 100, 48, 65, 51, 101, 101, 40, 73, 93, 59, 77, 65, 27, 27, 32, 164, 73, 87, 48, 62, 51, 62, 62, 32, 91, 93, 44, 59, 62, 63, 63, 89, 77, 63, 63, 65, 65, 62, 59, 87, 73, 73, 32, 32, 32, 32, 32, 32, 32, 64, 64, 74, 74, 89, 90, 64, 64, 76, 76, 76, 76, 76, 74, 64, 64, 64, 78, 78, 88, 92, 96, 88, 78, 78, 97, 111, 90, 98, 99, 99, 78, 78, 78, 96, 156, 99, 74, 74, 153, 102, 102, 114, 113, 88, 99, 102, 102, 111, 92, 112, 116, 96, 121, 102, 102, 102, 117, 122, 114, 105, 105, 150, 96, 97, 98, 105, 105, 106, 106, 106, 106, 106, 115, 105, 105, 105, 107, 107, 107, 107, 107, 108, 108, 113, 117, 112, 116, 108, 108, 115, 121, 122, 124, 123, 130, 108, 108, 108, 118, 118, 119, 119, 118, 118, 120, 120, 119, 119, 125, 125, 120, 120, 126, 126, 119, 119, 119, 129, 120, 120, 120, 123, 127, 127, 130, 131, 132, 136, 127, 127, 147, 145, 124, 128, 128, 142, 127, 127, 127, 128, 128, 134, 134, 134, 144, 133, 133, 128, 128, 128, 137, 133, 133, 135, 135, 135, 94, 129, 132, 133, 133, 133, 131, 136, 138, 138, 138, 139, 139, 139, 140, 140, 140, 141, 141, 141, 148, 148, 148, 85, 159, 144, 149, 149, 149, 80, 75, 134, 151, 151, 151, 152, 152, 152, 154, 154, 154, 72, 68, 135, 155, 155, 155, 157, 157, 157, 158, 158, 158, 66, 138, 41, 35, 139, 33, 29, 140, 28, 24, 141, 159, 16, 148, 13, 9, 5, 4, 3, 149, 2, 0, 0, 0, 0, 151, 0, 0, 152, 0, 0, 154, 0, 0, 0, 0, 0, 155, 0, 0, 157, 0, 0, 158, 168, 168, 168, 168, 168, 169, 169, 169, 169, 169, 170, 170, 170, 170, 170, 171, 171, 171, 171, 171, 173, 173, 174, 0, 0, 174, 174, 175, 175, 175, 175, 175, 176, 176, 176, 176, 176, 177, 177, 0, 177, 177, 178, 178, 178, 178, 178, 179, 179, 179, 179, 179, 180, 180, 180, 180, 180, 181, 181, 181, 181, 181, 182, 182, 182, 182, 182, 183, 183, 183, 183, 183, 184, 184, 184, 184, 184, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167 } ; /* Table of booleans, true if rule could match eol. */ static yyconst flex_int32_t yy_rule_can_match_eol[46] = { 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, }; extern int yy_flex_debug; int yy_flex_debug = 0; static yy_state_type *yy_state_buf=0, *yy_state_ptr=0; static char *yy_full_match; static int yy_lp; static int yy_looking_for_trail_begin = 0; static int yy_full_lp; static int *yy_full_state; #define YY_TRAILING_MASK 0x2000 #define YY_TRAILING_HEAD_MASK 0x4000 #define REJECT \ { \ *yy_cp = (yy_hold_char); /* undo effects of setting up yytext */ \ yy_cp = (yy_full_match); /* restore poss. backed-over text */ \ (yy_lp) = (yy_full_lp); /* restore orig. accepting pos. */ \ (yy_state_ptr) = (yy_full_state); /* restore orig. state */ \ yy_current_state = *(yy_state_ptr); /* restore curr. state */ \ ++(yy_lp); \ goto find_rule; \ } static int yy_more_offset = 0; static int yy_prev_more_offset = 0; #define yymore() ((yy_more_offset) = yy_flex_strlen( yytext )) #define YY_NEED_STRLEN #define YY_MORE_ADJ 0 #define YY_RESTORE_YY_MORE_OFFSET \ { \ (yy_more_offset) = (yy_prev_more_offset); \ yyleng -= (yy_more_offset); \ } #ifndef YYLMAX #define YYLMAX 8192 #endif char yytext[YYLMAX]; char *yytext_ptr; #line 1 "soapcpp2_lex.l" /* soapcpp2_lex.l Flex/Lex tokenizer for C/C++ -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc. All Rights Reserved. This part of the software is released under ONE of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #line 38 "soapcpp2_lex.l" #include "soapcpp2.h" #ifdef HAVE_CONFIG_H #include "soapcpp2_yacc.h" #else #include "soapcpp2_yacc.tab.h" #endif #ifdef WITH_BISON YYSTYPE yylval; #undef YY_NEED_STRLEN #define YY_INPUT(buf, result, max_size) \ { \ int c = getc(yyin); \ result = (c == EOF) ? YY_NULL : (buf[0] = c, 1); \ } #endif #ifndef WITH_LEX #define MAX_IMPORT_DEPTH 16 static struct importlist { struct importlist *next; char name[1]; } *importlist = NULL; static const char *fnstk[MAX_IMPORT_DEPTH]; static int lnstk[MAX_IMPORT_DEPTH]; static const char *imstk[MAX_IMPORT_DEPTH]; static YY_BUFFER_STATE instk[MAX_IMPORT_DEPTH]; #endif int imports = 0; const char *imported = NULL; static void check_id(const char*); static Token install_id(void); static Token install_tag(void); static Token install_int(void); static Token install_hex(void); static Token install_num(void); static Token install_chr(void); static Token install_str(void); static Token install_pragma(void); static void directive(void), option(void), xpath(void); static Token error_chr(void); static Token error_str(void); static int convchar(int*); static int hexchar(int*); static int octchar(int*); static void module(const char *name, const char *fullname); static void import(const char *file); static int magic(const char *name); #define YY_NO_INPUT 1 #line 790 "lex.yy.c" #define INITIAL 0 #define MLCOMMENT 1 #ifndef YY_NO_UNISTD_H /* Special case for "unistd.h", since it is non-ANSI. We include it way * down here because we want the user's section 1 to have been scanned first. * The user has a chance to override it with an option. */ #include #endif #ifndef YY_EXTRA_TYPE #define YY_EXTRA_TYPE void * #endif static int yy_init_globals (void ); /* Accessor methods to globals. These are made visible to non-reentrant scanners for convenience. */ int yylex_destroy (void ); int yyget_debug (void ); void yyset_debug (int debug_flag ); YY_EXTRA_TYPE yyget_extra (void ); void yyset_extra (YY_EXTRA_TYPE user_defined ); FILE *yyget_in (void ); void yyset_in (FILE * in_str ); FILE *yyget_out (void ); void yyset_out (FILE * out_str ); yy_size_t yyget_leng (void ); char *yyget_text (void ); int yyget_lineno (void ); void yyset_lineno (int line_number ); /* Macros after this point can all be overridden by user definitions in * section 1. */ #ifndef YY_SKIP_YYWRAP #ifdef __cplusplus extern "C" int yywrap (void ); #else extern int yywrap (void ); #endif #endif #ifndef yytext_ptr static void yy_flex_strncpy (char *,yyconst char *,int ); #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (yyconst char * ); #endif #ifndef YY_NO_INPUT #ifdef __cplusplus static int yyinput (void ); #else static int input (void ); #endif #endif /* Amount of stuff to slurp up with each read. */ #ifndef YY_READ_BUF_SIZE #define YY_READ_BUF_SIZE 8192 #endif /* Copy whatever the last rule matched to the standard output. */ #ifndef ECHO /* This used to be an fputs(), but since the string might contain NUL's, * we now use fwrite(). */ #define ECHO fwrite( yytext, yyleng, 1, yyout ) #endif /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, * is returned in "result". */ #ifndef YY_INPUT #define YY_INPUT(buf,result,max_size) \ if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ { \ int c = '*'; \ yy_size_t n; \ for ( n = 0; n < max_size && \ (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ buf[n] = (char) c; \ if ( c == '\n' ) \ buf[n++] = (char) c; \ if ( c == EOF && ferror( yyin ) ) \ YY_FATAL_ERROR( "input in flex scanner failed" ); \ result = n; \ } \ else \ { \ errno=0; \ while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \ { \ if( errno != EINTR) \ { \ YY_FATAL_ERROR( "input in flex scanner failed" ); \ break; \ } \ errno=0; \ clearerr(yyin); \ } \ }\ \ #endif /* No semi-colon after return; correct usage is to write "yyterminate();" - * we don't want an extra ';' after the "return" because that will cause * some compilers to complain about unreachable statements. */ #ifndef yyterminate #define yyterminate() return YY_NULL #endif /* Number of entries by which start-condition stack grows. */ #ifndef YY_START_STACK_INCR #define YY_START_STACK_INCR 25 #endif /* Report a fatal error. */ #ifndef YY_FATAL_ERROR #define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) #endif /* end tables serialization structures and prototypes */ /* Default declaration of generated scanner - a define so the user can * easily add parameters. */ #ifndef YY_DECL #define YY_DECL_IS_OURS 1 extern int yylex (void); #define YY_DECL int yylex (void) #endif /* !YY_DECL */ /* Code executed at the beginning of each rule, after yytext and yyleng * have been set up. */ #ifndef YY_USER_ACTION #define YY_USER_ACTION #endif /* Code executed at the end of each rule. */ #ifndef YY_BREAK #define YY_BREAK break; #endif #define YY_RULE_SETUP \ if ( yyleng > 0 ) \ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = \ (yytext[yyleng - 1] == '\n'); \ YY_USER_ACTION /** The main scanner function which does all the work. */ YY_DECL { register yy_state_type yy_current_state; register char *yy_cp, *yy_bp; register int yy_act; #line 104 "soapcpp2_lex.l" #line 976 "lex.yy.c" if ( !(yy_init) ) { (yy_init) = 1; #ifdef YY_USER_INIT YY_USER_INIT; #endif /* Create the reject buffer large enough to save one state per allowed character. */ if ( ! (yy_state_buf) ) (yy_state_buf) = (yy_state_type *)yyalloc(YY_STATE_BUF_SIZE ); if ( ! (yy_state_buf) ) YY_FATAL_ERROR( "out of dynamic memory in yylex()" ); if ( ! (yy_start) ) (yy_start) = 1; /* first start state */ if ( ! yyin ) yyin = stdin; if ( ! yyout ) yyout = stdout; if ( ! YY_CURRENT_BUFFER ) { yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer(yyin,YY_BUF_SIZE ); } yy_load_buffer_state( ); } while ( 1 ) /* loops until end-of-file is reached */ { yy_cp = (yy_c_buf_p); /* Support of yytext. */ *yy_cp = (yy_hold_char); /* yy_bp points to the position in yy_ch_buf of the start of * the current run. */ yy_bp = yy_cp; yy_current_state = (yy_start); yy_current_state += YY_AT_BOL(); (yy_state_ptr) = (yy_state_buf); *(yy_state_ptr)++ = yy_current_state; yy_match: do { register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 168 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; *(yy_state_ptr)++ = yy_current_state; ++yy_cp; } while ( yy_base[yy_current_state] != 500 ); yy_find_action: yy_current_state = *--(yy_state_ptr); (yy_lp) = yy_accept[yy_current_state]; goto find_rule; /* Shut up GCC warning -Wall */ find_rule: /* we branch to this label when backing up */ for ( ; ; ) /* until we find what rule we matched */ { if ( (yy_lp) && (yy_lp) < yy_accept[yy_current_state + 1] ) { yy_act = yy_acclist[(yy_lp)]; if ( yy_act & YY_TRAILING_HEAD_MASK || (yy_looking_for_trail_begin) ) { if ( yy_act == (yy_looking_for_trail_begin) ) { (yy_looking_for_trail_begin) = 0; yy_act &= ~YY_TRAILING_HEAD_MASK; break; } } else if ( yy_act & YY_TRAILING_MASK ) { (yy_looking_for_trail_begin) = yy_act & ~YY_TRAILING_MASK; (yy_looking_for_trail_begin) |= YY_TRAILING_HEAD_MASK; (yy_full_match) = yy_cp; (yy_full_state) = (yy_state_ptr); (yy_full_lp) = (yy_lp); } else { (yy_full_match) = yy_cp; (yy_full_state) = (yy_state_ptr); (yy_full_lp) = (yy_lp); break; } ++(yy_lp); goto find_rule; } --yy_cp; yy_current_state = *--(yy_state_ptr); (yy_lp) = yy_accept[yy_current_state]; } YY_DO_BEFORE_ACTION; if ( yy_act != YY_END_OF_BUFFER && yy_rule_can_match_eol[yy_act] ) { yy_size_t yyl; for ( yyl = (yy_prev_more_offset); yyl < yyleng; ++yyl ) if ( yytext[yyl] == '\n' ) yylineno++; ; } do_action: /* This label is used only to access EOF actions. */ switch ( yy_act ) { /* beginning of action switch */ case 1: YY_RULE_SETUP #line 105 "soapcpp2_lex.l" { /* skip UTF8 BOM */ } YY_BREAK case 2: /* rule 2 can match eol */ YY_RULE_SETUP #line 106 "soapcpp2_lex.l" { /* skip white space */ } YY_BREAK case 3: YY_RULE_SETUP #line 107 "soapcpp2_lex.l" { BEGIN(MLCOMMENT); } YY_BREAK case 4: /* rule 4 can match eol */ YY_RULE_SETUP #line 108 "soapcpp2_lex.l" { } YY_BREAK case 5: YY_RULE_SETUP #line 109 "soapcpp2_lex.l" { BEGIN(INITIAL); } YY_BREAK case YY_STATE_EOF(MLCOMMENT): #line 110 "soapcpp2_lex.l" { execerror("Unclosed multiline comment at the end of file"); } YY_BREAK case 6: /* rule 6 can match eol */ YY_RULE_SETUP #line 111 "soapcpp2_lex.l" { option(); } YY_BREAK case 7: /* rule 7 can match eol */ YY_RULE_SETUP #line 112 "soapcpp2_lex.l" { directive(); } YY_BREAK case 8: /* rule 8 can match eol */ YY_RULE_SETUP #line 113 "soapcpp2_lex.l" { xpath(); } YY_BREAK case 9: /* rule 9 can match eol */ YY_RULE_SETUP #line 114 "soapcpp2_lex.l" { /* skip single line comment */ } YY_BREAK case 10: YY_RULE_SETUP #line 115 "soapcpp2_lex.l" { return PA; } YY_BREAK case 11: YY_RULE_SETUP #line 116 "soapcpp2_lex.l" { return NA; } YY_BREAK case 12: YY_RULE_SETUP #line 117 "soapcpp2_lex.l" { return TA; } YY_BREAK case 13: YY_RULE_SETUP #line 118 "soapcpp2_lex.l" { return DA; } YY_BREAK case 14: YY_RULE_SETUP #line 119 "soapcpp2_lex.l" { return MA; } YY_BREAK case 15: YY_RULE_SETUP #line 120 "soapcpp2_lex.l" { return AA; } YY_BREAK case 16: YY_RULE_SETUP #line 121 "soapcpp2_lex.l" { return XA; } YY_BREAK case 17: YY_RULE_SETUP #line 122 "soapcpp2_lex.l" { return OA; } YY_BREAK case 18: YY_RULE_SETUP #line 123 "soapcpp2_lex.l" { return LA; } YY_BREAK case 19: YY_RULE_SETUP #line 124 "soapcpp2_lex.l" { return RA; } YY_BREAK case 20: YY_RULE_SETUP #line 125 "soapcpp2_lex.l" { return OR; } YY_BREAK case 21: YY_RULE_SETUP #line 126 "soapcpp2_lex.l" { return AN; } YY_BREAK case 22: YY_RULE_SETUP #line 127 "soapcpp2_lex.l" { return EQ; } YY_BREAK case 23: YY_RULE_SETUP #line 128 "soapcpp2_lex.l" { return NE; } YY_BREAK case 24: YY_RULE_SETUP #line 129 "soapcpp2_lex.l" { return LE; } YY_BREAK case 25: YY_RULE_SETUP #line 130 "soapcpp2_lex.l" { return GE; } YY_BREAK case 26: YY_RULE_SETUP #line 131 "soapcpp2_lex.l" { return LS; } YY_BREAK case 27: YY_RULE_SETUP #line 132 "soapcpp2_lex.l" { return RS; } YY_BREAK case 28: YY_RULE_SETUP #line 133 "soapcpp2_lex.l" { return PP; } YY_BREAK case 29: YY_RULE_SETUP #line 134 "soapcpp2_lex.l" { return NN; } YY_BREAK case 30: YY_RULE_SETUP #line 135 "soapcpp2_lex.l" { return AR; } YY_BREAK case 31: YY_RULE_SETUP #line 136 "soapcpp2_lex.l" { return yytext[0]; } YY_BREAK case 32: YY_RULE_SETUP #line 137 "soapcpp2_lex.l" { return install_id(); } YY_BREAK case 33: YY_RULE_SETUP #line 138 "soapcpp2_lex.l" { return install_tag(); } YY_BREAK case 34: YY_RULE_SETUP #line 139 "soapcpp2_lex.l" { return install_int(); } YY_BREAK case 35: YY_RULE_SETUP #line 140 "soapcpp2_lex.l" { return install_hex(); } YY_BREAK case 36: YY_RULE_SETUP #line 141 "soapcpp2_lex.l" { return install_num(); } YY_BREAK case 37: YY_RULE_SETUP #line 142 "soapcpp2_lex.l" { return install_chr(); } YY_BREAK case 38: /* rule 38 can match eol */ YY_RULE_SETUP #line 143 "soapcpp2_lex.l" { return install_str(); } YY_BREAK case 39: /* rule 39 can match eol */ YY_RULE_SETUP #line 144 "soapcpp2_lex.l" { char *s, *t, buf[1024]; s = strchr(yytext, '"'); if (!s) t = yytext+7; else { strcpy(buf, s+1); s = strchr(buf, '"'); *s = '\0'; t = strchr(s+1, '"'); if (t) { t++; s = strchr(t+1, '"'); if (s) *s = '\0'; } } module(buf, t); } YY_BREAK case 40: /* rule 40 can match eol */ YY_RULE_SETUP #line 162 "soapcpp2_lex.l" { char *s, buf[1024]; s = strchr(yytext, '"'); if (s) { strncpy(buf, s + 1, sizeof(buf)); buf[sizeof(buf) - 1] = '\0'; s = strchr(buf, '"'); if (!s) lexerror("Invalid import directive: missing ending \" or path too long"); else { *s = '\0'; import(buf); } } else lexerror("Invalid import directive: \" expected"); } YY_BREAK case 41: /* rule 41 can match eol */ YY_RULE_SETUP #line 178 "soapcpp2_lex.l" { return install_pragma(); } YY_BREAK case 42: /* rule 42 can match eol */ YY_RULE_SETUP #line 179 "soapcpp2_lex.l" { return error_chr(); } YY_BREAK case 43: /* rule 43 can match eol */ YY_RULE_SETUP #line 180 "soapcpp2_lex.l" { return error_str(); } YY_BREAK case 44: YY_RULE_SETUP #line 181 "soapcpp2_lex.l" { lexerror("Skipping unknown symbol"); } YY_BREAK case YY_STATE_EOF(INITIAL): #line 182 "soapcpp2_lex.l" { /* when Lex complains: remove this line and below */ #ifndef WITH_LEX if (--imports < 0) { yyterminate(); } else { if (vflag) fprintf(stderr, "End of %s\n\n", filename); yy_delete_buffer(YY_CURRENT_BUFFER); yy_switch_to_buffer(instk[imports]); filename = fnstk[imports]; yylineno = lnstk[imports]; imported = imstk[imports]; } #endif } YY_BREAK case 45: YY_RULE_SETUP #line 199 "soapcpp2_lex.l" ECHO; YY_BREAK #line 1396 "lex.yy.c" case YY_END_OF_BUFFER: { /* Amount of text matched not including the EOB char. */ int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; /* Undo the effects of YY_DO_BEFORE_ACTION. */ *yy_cp = (yy_hold_char); YY_RESTORE_YY_MORE_OFFSET if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) { /* We're scanning a new file or input source. It's * possible that this happened because the user * just pointed yyin at a new source and called * yylex(). If so, then we have to assure * consistency between YY_CURRENT_BUFFER and our * globals. Here is the right place to do so, because * this is the first action (other than possibly a * back-up) that will match for the new input source. */ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; } /* Note that here we test for yy_c_buf_p "<=" to the position * of the first EOB in the buffer, since yy_c_buf_p will * already have been incremented past the NUL character * (since all states make transitions on EOB to the * end-of-buffer state). Contrast this with the test * in input(). */ if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) { /* This was really a NUL. */ yy_state_type yy_next_state; (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); /* Okay, we're now positioned to make the NUL * transition. We couldn't have * yy_get_previous_state() go ahead and do it * for us because it doesn't know how to deal * with the possibility of jamming (and we don't * want to build jamming into it because then it * will run more slowly). */ yy_next_state = yy_try_NUL_trans( yy_current_state ); yy_bp = (yytext_ptr) + YY_MORE_ADJ; if ( yy_next_state ) { /* Consume the NUL. */ yy_cp = ++(yy_c_buf_p); yy_current_state = yy_next_state; goto yy_match; } else { yy_cp = (yy_c_buf_p); goto yy_find_action; } } else switch ( yy_get_next_buffer( ) ) { case EOB_ACT_END_OF_FILE: { (yy_did_buffer_switch_on_eof) = 0; if ( yywrap( ) ) { /* Note: because we've taken care in * yy_get_next_buffer() to have set up * yytext, we can now set up * yy_c_buf_p so that if some total * hoser (like flex itself) wants to * call the scanner after we return the * YY_NULL, it'll still work - another * YY_NULL will get returned. */ (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; yy_act = YY_STATE_EOF(YY_START); goto do_action; } else { if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; } break; } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_match; case EOB_ACT_LAST_MATCH: (yy_c_buf_p) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_find_action; } break; } default: YY_FATAL_ERROR( "fatal flex scanner internal error--no action found" ); } /* end of action switch */ } /* end of scanning one token */ } /* end of yylex */ /* yy_get_next_buffer - try to read in a new buffer * * Returns a code representing an action: * EOB_ACT_LAST_MATCH - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position * EOB_ACT_END_OF_FILE - end of file */ static int yy_get_next_buffer (void) { register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; register char *source = (yytext_ptr); register int number_to_move, i; int ret_val; if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) YY_FATAL_ERROR( "fatal flex scanner internal error--end of buffer missed" ); if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) { /* Don't try to fill the buffer, so this is an EOF. */ if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) { /* We matched a single character, the EOB, so * treat this as a final EOF. */ return EOB_ACT_END_OF_FILE; } else { /* We matched some text prior to the EOB, first * process it. */ return EOB_ACT_LAST_MATCH; } } /* Try to read more data. */ /* First move last chars to start of buffer. */ number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; for ( i = 0; i < number_to_move; ++i ) *(dest++) = *(source++); if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) /* don't do the read, it's not guaranteed to return an EOF, * just force an EOF */ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; else { yy_size_t num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; while ( num_to_read <= 0 ) { /* Not enough room in the buffer - grow it. */ YY_FATAL_ERROR( "input buffer overflow, can't enlarge buffer because scanner uses REJECT" ); } if ( num_to_read > YY_READ_BUF_SIZE ) num_to_read = YY_READ_BUF_SIZE; /* Read in more data. */ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), (yy_n_chars), num_to_read ); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } if ( (yy_n_chars) == 0 ) { if ( number_to_move == YY_MORE_ADJ ) { ret_val = EOB_ACT_END_OF_FILE; yyrestart(yyin ); } else { ret_val = EOB_ACT_LAST_MATCH; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_EOF_PENDING; } } else ret_val = EOB_ACT_CONTINUE_SCAN; if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { /* Extend the array by 50%, plus the number we really need. */ yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ); if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); } (yy_n_chars) += number_to_move; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; return ret_val; } /* yy_get_previous_state - get the state just before the EOB char was reached */ static yy_state_type yy_get_previous_state (void) { register yy_state_type yy_current_state; register char *yy_cp; yy_current_state = (yy_start); yy_current_state += YY_AT_BOL(); (yy_state_ptr) = (yy_state_buf); *(yy_state_ptr)++ = yy_current_state; for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) { register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 168 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; *(yy_state_ptr)++ = yy_current_state; } return yy_current_state; } /* yy_try_NUL_trans - try to make a transition on the NUL character * * synopsis * next_state = yy_try_NUL_trans( current_state ); */ static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state ) { register int yy_is_jam; register YY_CHAR yy_c = 1; while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 168 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; yy_is_jam = (yy_current_state == 167); if ( ! yy_is_jam ) *(yy_state_ptr)++ = yy_current_state; return yy_is_jam ? 0 : yy_current_state; } #ifndef YY_NO_INPUT #ifdef __cplusplus static int yyinput (void) #else static int input (void) #endif { int c; *(yy_c_buf_p) = (yy_hold_char); if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) { /* yy_c_buf_p now points to the character we want to return. * If this occurs *before* the EOB characters, then it's a * valid NUL; if not, then we've hit the end of the buffer. */ if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) /* This was really a NUL. */ *(yy_c_buf_p) = '\0'; else { /* need more input */ yy_size_t offset = (yy_c_buf_p) - (yytext_ptr); ++(yy_c_buf_p); switch ( yy_get_next_buffer( ) ) { case EOB_ACT_LAST_MATCH: /* This happens because yy_g_n_b() * sees that we've accumulated a * token and flags that we need to * try matching the token before * proceeding. But for input(), * there's no matching to consider. * So convert the EOB_ACT_LAST_MATCH * to EOB_ACT_END_OF_FILE. */ /* Reset buffer status. */ yyrestart(yyin ); /*FALLTHROUGH*/ case EOB_ACT_END_OF_FILE: { if ( yywrap( ) ) return 0; if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; #ifdef __cplusplus return yyinput(); #else return input(); #endif } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + offset; break; } } } c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ *(yy_c_buf_p) = '\0'; /* preserve yytext */ (yy_hold_char) = *++(yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_at_bol = (c == '\n'); if ( YY_CURRENT_BUFFER_LVALUE->yy_at_bol ) yylineno++; ; return c; } #endif /* ifndef YY_NO_INPUT */ /** Immediately switch to a different input stream. * @param input_file A readable stream. * * @note This function does not reset the start condition to @c INITIAL . */ void yyrestart (FILE * input_file ) { if ( ! YY_CURRENT_BUFFER ){ yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer(yyin,YY_BUF_SIZE ); } yy_init_buffer(YY_CURRENT_BUFFER,input_file ); yy_load_buffer_state( ); } /** Switch to a different input buffer. * @param new_buffer The new input buffer. * */ void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ) { /* TODO. We should be able to replace this entire function body * with * yypop_buffer_state(); * yypush_buffer_state(new_buffer); */ yyensure_buffer_stack (); if ( YY_CURRENT_BUFFER == new_buffer ) return; if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } YY_CURRENT_BUFFER_LVALUE = new_buffer; yy_load_buffer_state( ); /* We don't actually know whether we did this switch during * EOF (yywrap()) processing, but the only time this flag * is looked at is after yywrap() is called, so it's safe * to go ahead and always set it. */ (yy_did_buffer_switch_on_eof) = 1; } static void yy_load_buffer_state (void) { (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; (yy_hold_char) = *(yy_c_buf_p); } /** Allocate and initialize an input buffer state. * @param file A readable stream. * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. * * @return the allocated buffer state. */ YY_BUFFER_STATE yy_create_buffer (FILE * file, int size ) { YY_BUFFER_STATE b; b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_buf_size = size; /* yy_ch_buf has to be 2 characters longer than the size given because * we need to put in 2 end-of-buffer characters. */ b->yy_ch_buf = (char *) yyalloc(b->yy_buf_size + 2 ); if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_is_our_buffer = 1; yy_init_buffer(b,file ); return b; } /** Destroy the buffer. * @param b a buffer created with yy_create_buffer() * */ void yy_delete_buffer (YY_BUFFER_STATE b ) { if ( ! b ) return; if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; if ( b->yy_is_our_buffer ) yyfree((void *) b->yy_ch_buf ); yyfree((void *) b ); } #ifndef __cplusplus extern int isatty (int ); #endif /* __cplusplus */ /* Initializes or reinitializes a buffer. * This function is sometimes called more than once on the same buffer, * such as during a yyrestart() or at EOF. */ static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file ) { int oerrno = errno; yy_flush_buffer(b ); b->yy_input_file = file; b->yy_fill_buffer = 1; /* If b is the current buffer, then yy_init_buffer was _probably_ * called from yyrestart() or through yy_get_next_buffer. * In that case, we don't want to reset the lineno or column. */ if (b != YY_CURRENT_BUFFER){ b->yy_bs_lineno = 1; b->yy_bs_column = 0; } b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; errno = oerrno; } /** Discard all buffered characters. On the next scan, YY_INPUT will be called. * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. * */ void yy_flush_buffer (YY_BUFFER_STATE b ) { if ( ! b ) return; b->yy_n_chars = 0; /* We always need two end-of-buffer characters. The first causes * a transition to the end-of-buffer state. The second causes * a jam in that state. */ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; b->yy_buf_pos = &b->yy_ch_buf[0]; b->yy_at_bol = 1; b->yy_buffer_status = YY_BUFFER_NEW; if ( b == YY_CURRENT_BUFFER ) yy_load_buffer_state( ); } /** Pushes the new state onto the stack. The new state becomes * the current state. This function will allocate the stack * if necessary. * @param new_buffer The new state. * */ void yypush_buffer_state (YY_BUFFER_STATE new_buffer ) { if (new_buffer == NULL) return; yyensure_buffer_stack(); /* This block is copied from yy_switch_to_buffer. */ if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } /* Only push if top exists. Otherwise, replace top. */ if (YY_CURRENT_BUFFER) (yy_buffer_stack_top)++; YY_CURRENT_BUFFER_LVALUE = new_buffer; /* copied from yy_switch_to_buffer. */ yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } /** Removes and deletes the top of the stack, if present. * The next element becomes the new top. * */ void yypop_buffer_state (void) { if (!YY_CURRENT_BUFFER) return; yy_delete_buffer(YY_CURRENT_BUFFER ); YY_CURRENT_BUFFER_LVALUE = NULL; if ((yy_buffer_stack_top) > 0) --(yy_buffer_stack_top); if (YY_CURRENT_BUFFER) { yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } } /* Allocates the stack if it does not exist. * Guarantees space for at least one push. */ static void yyensure_buffer_stack (void) { yy_size_t num_to_alloc; if (!(yy_buffer_stack)) { /* First allocation is just for 2 elements, since we don't know if this * scanner will even need a stack. We use 2 instead of 1 to avoid an * immediate realloc on the next call. */ num_to_alloc = 1; (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc (num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; (yy_buffer_stack_top) = 0; return; } if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ /* Increase the buffer to prepare for a possible push. */ int grow_size = 8 /* arbitrary grow size */; num_to_alloc = (yy_buffer_stack_max) + grow_size; (yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc ((yy_buffer_stack), num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); /* zero only the new slots.*/ memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; } } /** Setup the input buffer state to scan directly from a user-specified character buffer. * @param base the character buffer * @param size the size in bytes of the character buffer * * @return the newly allocated buffer state object. */ YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size ) { YY_BUFFER_STATE b; if ( size < 2 || base[size-2] != YY_END_OF_BUFFER_CHAR || base[size-1] != YY_END_OF_BUFFER_CHAR ) /* They forgot to leave room for the EOB's. */ return 0; b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ b->yy_buf_pos = b->yy_ch_buf = base; b->yy_is_our_buffer = 0; b->yy_input_file = 0; b->yy_n_chars = b->yy_buf_size; b->yy_is_interactive = 0; b->yy_at_bol = 1; b->yy_fill_buffer = 0; b->yy_buffer_status = YY_BUFFER_NEW; yy_switch_to_buffer(b ); return b; } /** Setup the input buffer state to scan a string. The next call to yylex() will * scan from a @e copy of @a str. * @param yystr a NUL-terminated string to scan * * @return the newly allocated buffer state object. * @note If you want to scan bytes that may contain NUL values, then use * yy_scan_bytes() instead. */ YY_BUFFER_STATE yy_scan_string (yyconst char * yystr ) { return yy_scan_bytes(yystr,strlen(yystr) ); } /** Setup the input buffer state to scan the given bytes. The next call to yylex() will * scan from a @e copy of @a bytes. * @param bytes the byte buffer to scan * @param len the number of bytes in the buffer pointed to by @a bytes. * * @return the newly allocated buffer state object. */ YY_BUFFER_STATE yy_scan_bytes (yyconst char * yybytes, yy_size_t _yybytes_len ) { YY_BUFFER_STATE b; char *buf; yy_size_t n, i; /* Get memory for full buffer, including space for trailing EOB's. */ n = _yybytes_len + 2; buf = (char *) yyalloc(n ); if ( ! buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); for ( i = 0; i < _yybytes_len; ++i ) buf[i] = yybytes[i]; buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; b = yy_scan_buffer(buf,n ); if ( ! b ) YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); /* It's okay to grow etc. this buffer, and we should throw it * away when we're done. */ b->yy_is_our_buffer = 1; return b; } #ifndef YY_EXIT_FAILURE #define YY_EXIT_FAILURE 2 #endif static void yy_fatal_error (yyconst char* msg ) { (void) fprintf( stderr, "%s\n", msg ); exit( YY_EXIT_FAILURE ); } /* Redefine yyless() so it works in section 3 code. */ #undef yyless #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ yytext[yyleng] = (yy_hold_char); \ (yy_c_buf_p) = yytext + yyless_macro_arg; \ (yy_hold_char) = *(yy_c_buf_p); \ *(yy_c_buf_p) = '\0'; \ yyleng = yyless_macro_arg; \ } \ while ( 0 ) /* Accessor methods (get/set functions) to struct members. */ /** Get the current line number. * */ int yyget_lineno (void) { return yylineno; } /** Get the input stream. * */ FILE *yyget_in (void) { return yyin; } /** Get the output stream. * */ FILE *yyget_out (void) { return yyout; } /** Get the length of the current token. * */ yy_size_t yyget_leng (void) { return yyleng; } /** Get the current token. * */ char *yyget_text (void) { return yytext; } /** Set the current line number. * @param line_number * */ void yyset_lineno (int line_number ) { yylineno = line_number; } /** Set the input stream. This does not discard the current * input buffer. * @param in_str A readable stream. * * @see yy_switch_to_buffer */ void yyset_in (FILE * in_str ) { yyin = in_str ; } void yyset_out (FILE * out_str ) { yyout = out_str ; } int yyget_debug (void) { return yy_flex_debug; } void yyset_debug (int bdebug ) { yy_flex_debug = bdebug ; } static int yy_init_globals (void) { /* Initialization is the same as for the non-reentrant scanner. * This function is called from yylex_destroy(), so don't allocate here. */ /* We do not touch yylineno unless the option is enabled. */ yylineno = 1; (yy_buffer_stack) = 0; (yy_buffer_stack_top) = 0; (yy_buffer_stack_max) = 0; (yy_c_buf_p) = (char *) 0; (yy_init) = 0; (yy_start) = 0; (yy_state_buf) = 0; (yy_state_ptr) = 0; (yy_full_match) = 0; (yy_lp) = 0; /* Defined in main.c */ #ifdef YY_STDINIT yyin = stdin; yyout = stdout; #else yyin = (FILE *) 0; yyout = (FILE *) 0; #endif /* For future reference: Set errno on error, since we are called by * yylex_init() */ return 0; } /* yylex_destroy is for both reentrant and non-reentrant scanners. */ int yylex_destroy (void) { /* Pop the buffer stack, destroying each element. */ while(YY_CURRENT_BUFFER){ yy_delete_buffer(YY_CURRENT_BUFFER ); YY_CURRENT_BUFFER_LVALUE = NULL; yypop_buffer_state(); } /* Destroy the stack itself. */ yyfree((yy_buffer_stack) ); (yy_buffer_stack) = NULL; yyfree ( (yy_state_buf) ); (yy_state_buf) = NULL; /* Reset the globals. This is important in a non-reentrant scanner so the next time * yylex() is called, initialization will occur. */ yy_init_globals( ); return 0; } /* * Internal utility routines. */ #ifndef yytext_ptr static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) { register int i; for ( i = 0; i < n; ++i ) s1[i] = s2[i]; } #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (yyconst char * s ) { register int n; for ( n = 0; s[n]; ++n ) ; return n; } #endif void *yyalloc (yy_size_t size ) { return (void *) malloc( size ); } void *yyrealloc (void * ptr, yy_size_t size ) { /* The cast to (char *) in the following accommodates both * implementations that use char* generic pointers, and those * that use void* generic pointers. It works with the latter * because both ANSI C and C++ allow castless assignment from * any pointer type to void*, and deal with argument conversions * as though doing an assignment. */ return (void *) realloc( (char *) ptr, size ); } void yyfree (void * ptr ) { free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ } #define YYTABLES_NAME "yytables" #line 199 "soapcpp2_lex.l" /* install_id - lookup identifier in symbol table. If found, return token and symbol table entry. If not found, create entry in symbol table and return ID token. */ static Token install_id() { Symbol *p = lookup(yytext); if (!p) { int i, flag = 0; p = install(yytext, ID); /* [_](x|X)(m|M)(l|L)__ is OK */ /* [_](x|X)(m|M)(l|L).* is not OK */ /* .*__(x|X)(m|M)(l|L) is not OK */ /* .*::(x|X)(m|M)(l|L) is not OK */ for (i = 0; i < (int)yyleng; i++) { if ((yytext[i] == '_' && yytext[i+1] == '_') || (yytext[i] == ':' && yytext[i+1] == ':')) { flag = 1; check_id(yytext + i + 2); } } if (!flag && strcmp(yytext, "XML")) check_id(yytext); } yylval.sym = p; return p->token; } /* install_tag - return TAG token. */ static Token install_tag() { yylval.s = (char*)emalloc(yyleng-1); /* yyleng = length(yytext) */ strcpy(yylval.s, yytext+1); yylval.s[yyleng-2] = '\0'; return TAG; } /* check_id - check for (x|X)(m|M)(l|L) */ static void check_id(const char *s) { while (*s == '_') s++; if ((s[0] == 'x' || s[0] == 'X') && (s[1] == 'm' || s[1] == 'M') && (s[2] == 'l' || s[2] == 'L')) { sprintf(errbuf, "identifier '%s' starts with or embeds '%3.3s' character sequence, which is exclusively reserved for and by the W3C XML standards (for enum constants: please ignore this warning)", yytext, s); semwarn(errbuf); } } /* install_int - convert digits to integer and return LNG token. */ static Token install_int(void) { sscanf(yytext, SOAP_ULONG_FORMAT, &yylval.i); return LNG; } /* install_hex - convert hexadecimal digits to integer and return LNG */ static Token install_hex(void) { sscanf(yytext, SOAP_XLONG_FORMAT, &yylval.i); return LNG; } /* install_num - convert digits to floating point number and return DBL */ static Token install_num(void) { sscanf(yytext, "%lf", &yylval.r); return DBL; } /* install_chr - convert character constant and return CHR. */ static Token install_chr(void) { int i = 2; if (yytext[1] == '\\') yylval.c = convchar(&i); else yylval.c = yytext[i-1]; if (yytext[i] != '\'') lexerror("Illegal character constant"); return CHR; } /* install_str - convert and store string in memory. Return STR. */ static Token install_str(void) { int i, j = 0; yylval.s = (char*)emalloc(yyleng - 1); /* yyleng = length(yytext) */ for (i = 1 + (yytext[0] == 'L'); i < (int)yyleng - 1; i++) if (yytext[i] == '\\') { if (yytext[++i] != '\n') { yylval.s[j++] = convchar(&i); i--; } } else yylval.s[j++] = yytext[i]; yylval.s[j] = '\0'; return STR; } /* install_pragma - store pragma in string. Return PRAGMA. */ static Token install_pragma(void) { yylval.s = (char*)emalloc(yyleng); /* yyleng = length(yytext) */ strncpy(yylval.s, yytext, strlen(yytext)-1); yylval.s[strlen(yytext)-1] = '\0'; return PRAGMA; } static void directive(void) { int i, j, k; char *s; Service *sp; Method *m; Data *d; int service; for (i = 0; yytext[i]; i++) if (yytext[i] <= 32) break; for (; yytext[i]; i++) if (yytext[i] > 32) break; for (j = i; yytext[j]; j++) if (yytext[j] <= 32) break; if (i == j) return; s = (char*)emalloc(j-i+1); for (k = 0; k < j-i; k++) { s[k] = yytext[k+i]; if (s[k] == '_') s[k] = '-'; } s[k] = '\0'; for (sp = services; sp; sp = sp->next) if (!strcmp(sp->ns, s)) break; if (!sp) { sp = (Service*)emalloc(sizeof(Service)); sp->next = services; sp->ns = s; sp->name = NULL; sp->porttype = NULL; sp->portname = NULL; sp->binding = NULL; sp->definitions = NULL; sp->transport = NULL; sp->URL = NULL; sp->URI = NULL; sp->URI2 = NULL; sp->WSDL = NULL; sp->style = NULL; sp->encoding = NULL; sp->protocol = NULL; sp->xsi_type = 0; sp->elementForm = NULL; sp->attributeForm = NULL; sp->executable = NULL; sp->import = NULL; sp->documentation = NULL; sp->list = NULL; sp->data = NULL; services = sp; } for (i = j; yytext[i]; i++) if (yytext[i] > 32) break; if (!strncmp(yytext+i, "service", 7) || !strncmp(yytext+i, "schema", 6)) { service = strncmp(yytext+i, "schema", 6); for (i += 7; yytext[i]; i++) if (yytext[i] > 32) break; for (j = i; yytext[j]; j++) if (yytext[j] <= 32) break; for (; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] <= 32) break; /* if (j == k) return; */ s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; if (!strncmp(yytext+i, "name:", 5)) { sp->name = s; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; sp->documentation = s; } else if (!strncmp(yytext+i, "type:", 5) || !strncmp(yytext+i, "portType:", 9) || !strncmp(yytext+i, "interface:", 10)) sp->porttype = s; else if (!strncmp(yytext+i, "portName:", 9)) sp->portname = s; else if (!strncmp(yytext+i, "binding:", 8)) sp->binding = s; else if (!strncmp(yytext+i, "definitions:", 12)) sp->definitions = s; else if (!strncmp(yytext+i, "documentation:", 14)) { for (k = j; yytext[k]; k++) if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; sp->documentation = s; } else if (!strncmp(yytext+i, "transport:", 10)) sp->transport = s; else if (!strncmp(yytext+i, "location:", 9) || !strncmp(yytext+i, "endpoint:", 9) || !strncmp(yytext+i, "port:", 5)) { if (sp->URL) { char *t = (char*)emalloc(strlen(sp->URL) + strlen(s) + 2); strcpy(t, sp->URL); strcat(t, " "); strcat(t, s); sp->URL = t; } else sp->URL = s; if (!service && !sp->import) sp->import = s; } else if (!strncmp(yytext+i, "executable:", 11)) sp->executable = s; else if (!strncmp(yytext+i, "namespace:", 10)) { if (service) { if (!sp->URI) sp->URI = s; sp->WSDL = s; } else if (!strcmp(sp->ns, "SOAP-ENV")) { if (soap_version > 0) semwarn("option -1 or -2 overrides SOAP-ENV namespace"); else envURI = s; sp->URI = (char*)envURI; } else if (!strcmp(sp->ns, "SOAP-ENC")) { if (soap_version > 0) semwarn("option -1 or -2 overrides SOAP-ENC namespace"); else encURI = s; sp->URI = (char*)encURI; } else sp->URI = s; } else if (!strncmp(yytext+i, "namespace2:", 11)) { sp->URI2 = s; } else if (!strncmp(yytext+i, "typed:", 6)) { sp->xsi_type = (*s == 'y'); } else if (!strncmp(yytext+i, "form:", 5)) { sp->elementForm = s; sp->attributeForm = s; } else if (!strncmp(yytext+i, "elementForm:", 12)) sp->elementForm = s; else if (!strncmp(yytext+i, "attributeForm:", 14)) sp->attributeForm = s; else if (!strncmp(yytext+i, "import:", 7)) { if (!sp->URI) sp->URI = s; sp->import = s; } else if (!strncmp(yytext+i, "encoding:", 9)) { if (!strcmp(s, "encoded")) sp->encoding = ""; else sp->encoding = s; } else if (!strncmp(yytext+i, "style:", 6)) sp->style = s; else if (!strncmp(yytext+i, "protocol:", 9)) sp->protocol = s; else if (!strncmp(yytext+i, "method-protocol:", 16)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = PROTOCOL; m->part = NULL; m->next = sp->list; sp->list = m; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-style:", 13)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = STYLE; m->part = NULL; m->next = sp->list; sp->list = m; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-encoding:", 16)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = ENCODING; m->part = NULL; m->next = sp->list; sp->list = m; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; if (strcmp(s, "encoded")) m->part = s; else m->part = ""; } else if (!strncmp(yytext+i, "method-response-encoding:", 25)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = RESPONSE_ENCODING; m->part = NULL; m->next = sp->list; sp->list = m; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; if (strcmp(s, "encoded")) m->part = s; else m->part = ""; } else if (!strncmp(yytext+i, "method-documentation:", 21)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = COMMENT; m->part = NULL; m->next = sp->list; sp->list = m; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-action:", 14)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = ACTION; m->part = NULL; m->next = sp->list; sp->list = m; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-input-action:", 20)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = REQUEST_ACTION; m->part = NULL; m->next = sp->list; sp->list = m; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-output-action:", 21)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = RESPONSE_ACTION; m->part = NULL; m->next = sp->list; sp->list = m; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-fault-action:", 20)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = FAULT_ACTION; m->part = NULL; m->next = sp->list; sp->list = m; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-mime-type:", 17)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = MIMEIN | MIMEOUT; m->part = NULL; m->next = sp->list; sp->list = m; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] <= 32) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-input-mime-type:", 23)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = MIMEIN; m->part = NULL; m->next = sp->list; sp->list = m; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] <= 32) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-output-mime-type:", 24)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = MIMEOUT; m->part = NULL; m->next = sp->list; sp->list = m; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] <= 32) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-header-part:", 19)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = HDRIN | HDROUT; m->part = NULL; m->next = sp->list; sp->list = m; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] <= 32) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-input-header-part:", 25)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = HDRIN; m->part = NULL; m->next = sp->list; sp->list = m; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] <= 32) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-output-header-part:", 26)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = HDROUT; m->part = NULL; m->next = sp->list; sp->list = m; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] <= 32) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-fault:", 13)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = FAULT; m->part = NULL; m->next = sp->list; sp->list = m; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] <= 32) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "type-documentation:", 19)) { d = (Data*)emalloc(sizeof(Data)); d->name = s; d->text = NULL; d->next = sp->data; sp->data = d; for (j = k; yytext[j]; j++) if (yytext[j] > 32) break; for (k = j; yytext[k]; k++) if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; d->text = s; } else { sprintf(errbuf, "unrecognized gsoap directive: %s", yytext+i); semwarn(errbuf); } } else { sprintf(errbuf, "unrecognized gsoap directive: %s", yytext); semwarn(errbuf); } } static void option(void) { int i; if (imports) { sprintf(errbuf, "options directive: %s ignored in imported file(s)", yytext); semwarn(errbuf); return; } for (i = 0; yytext[i]; i++) if (yytext[i] <= 32) break; for (; yytext[i]; i++) if (yytext[i] > 32) break; for (; yytext[i]; i++) switch (yytext[i]) { case 'a': aflag = 1; break; case 'c': if (yytext[i+1] == '+' && yytext[i+2] == '+') { i += 2; if (yytext[i+1] == '1' && yytext[i+2] == '1') { i += 2; c11flag = 1; } cflag = 0; } else cflag = 1; break; case 'e': eflag = 1; break; case 'n': nflag = 1; break; case 'l': lflag = 1; break; case 't': tflag = 1; break; case 'w': wflag = 1; break; default: if (yytext[i] < 32 || yytext[i] == '/') return; } } static void xpath(void) { int i, j, k; char *s; XPath *xp; for (i = 0; yytext[i]; i++) if (yytext[i] <= 32) break; for (; yytext[i]; i++) if (yytext[i] > 32) break; for (j = i; yytext[j]; j++) if (yytext[j] <= 32) break; if (i == j) return; for (k = j; yytext[k]; k++) if (yytext[k] > 32) break; s = (char*)emalloc(yyleng - i); strncpy(s, yytext + i, j - i); s[j - i] = '\0'; for (xp = xpaths; xp; xp = xp->next) if (!strcmp(xp->name, s)) break; if (!xp) { xp = (XPath*)emalloc(sizeof(XPath)); xp->next = xpaths; xp->name = s; } s += j - i + 1; strcpy(s, yytext + k); xp->path = s; while (*s > 32) s++; *s = '\0'; } /* error_chr - lexical error in character constant. Return character 0 to allow parsing to continue */ static Token error_chr(void) { lexerror("Ending-' missing in character constant"); yylval.c = '\0'; return CHR; } /* error_str - lexical error in string. Return empty string to allow parsing to continue */ static Token error_str(void) { lexerror("Ending-\" missing in string"); yylval.s = ""; return STR; } /* Character conversion functions */ static int convchar(int *p) { switch (yytext[(*p)++]) { case 'a': return '\a'; case 'b': return '\b'; case 'f': return '\f'; case 'n': return '\n'; case 'r': return '\r'; case 't': return '\t'; case 'v': return '\v'; case 'x': return hexchar(p); case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': (*p)--; return octchar(p); default: return yytext[*p-1]; } } static int hexchar(int *p) { int i, d, c = 0; for (i = 0; isxdigit(d = yytext[*p]) && i < 2; i++) { c = (c << 4) + (d <= '9' ? d - '0' : toupper(d) - '7'); (*p)++; } return c; } static int octchar(int *p) { int i, d, c = 0; for (i = 0; (d = yytext[*p]) >= '0' && d <= '7' && i < 3; i++) { c = (c << 3) + d - '0'; (*p)++; } return c; } static void module(const char *name, const char *fullname) { char *s; if (!fullname) fullname = name; if (imports) { Pragma **pp; s = (char*)emalloc(strlen(fullname)+15); sprintf(s, "#include \"%sH.h\"", fullname); for (pp = &pragmas; *pp; pp = &(*pp)->next) if (!strcmp((*pp)->pragma, s)) break; if (!*pp) { *pp = (Pragma*)emalloc(sizeof(Pragma)); (*pp)->pragma = s; (*pp)->next = NULL; } s = (char*)emalloc(strlen(fullname)+1); imported = strcpy(s, fullname); fprintf(stderr, "Importing module '%s'\n\n", fullname); } else { lflag = 1; typeNO = magic(name); s = (char*)emalloc(strlen(fullname)+1); prefix = strcpy(s, fullname); fprintf(stderr, "Compiling module '%s' (magic number = %d)\n\n", fullname, typeNO); } } static int magic(const char *name) { size_t i; int n; if (strlen(name) > 4) semerror("#module name length must not exceed four characters"); n = 0; for (i = 0; i < strlen(name); i++) if (name[i] >= 'a' && name[i] <= 'z') n = 26*n + name[i] - 'a'; else if (name[i] >= 'A' && name[i] <= 'Z') n = 26*n + name[i] - 'A'; else semerror("#module name must be alphabetic and the length must not exceed four characters.\nUse '#module name longname' for longer names."); return 4699*n + 153424; } #ifdef WITH_LEX static void import(const char *file) { execerror("Cannot #import: soapcpp2 not compiled with flex (replace lex with flex)"); } #else static void import(const char *file) { char buf[1024]; struct importlist *p; if (vflag) fprintf(stderr, "Importing '%s': ", file); for (p = importlist; p; p = p->next) { if (!strcmp(p->name, file)) { if (vflag) fprintf(stderr, "file already read or currently being read\n\n"); return; } } if (imports >= MAX_IMPORT_DEPTH) execerror("Imports nested too deep"); instk[imports] = YY_CURRENT_BUFFER; fnstk[imports] = filename; lnstk[imports] = yylineno; imstk[imports] = imported; yylineno = 1; /* imported = NULL; this is useful to change the semantics of #import to NOT consider non-module imports to be part of the current module */ imports++; buf[0] = '\0'; if (!(yyin = fopen(file, "r"))) { if (importpath) { const char *s, *t; s = importpath; do { size_t n; t = strstr(s, SOAP_PATHSEP); if (t) { if ((size_t)(t - s) >= sizeof(buf)) t = s + sizeof(buf) - 1; strncpy(buf, s, t - s); buf[t - s] = '\0'; s = t + sizeof(SOAP_PATHSEP) - 1; } else { strcpy(buf, s); s = NULL; } n = strlen(buf) - 1; #ifdef __VMS if (buf[n] != ']' && buf[n] != ':') strcat(buf, ":"); #else if (buf[n] != SOAP_PATHCAT[0]) strcat(buf, SOAP_PATHCAT); #endif strcat(buf, file); yyin = fopen(buf, "r"); } while (s && !yyin); } if (!yyin) { sprintf(errbuf, "#import: Cannot open file \"%s\" for reading.\nHint: use option -I (for example -Igsoap/import"SOAP_PATHSEP"gsoap/custom:.)", file); execerror(errbuf); } } if (vflag) { if (buf[0]) fprintf(stderr, "OK, found at %s\n\n", buf); else fprintf(stderr, "OK\n\n"); } p = (struct importlist*)emalloc(sizeof(struct importlist) + strlen(file)); /* has already + 1 byte size */ strcpy(p->name, file); filename = p->name; p->next = importlist; importlist = p; yy_switch_to_buffer(yy_create_buffer(yyin,YY_BUF_SIZE)); } #endif gsoap-2.8.28/gsoap/VisualStudio2005/soapcpp2/soapcpp2/soapcpp2.vcproj0000755000175000017500000001411212653650160024577 0ustar ellertellert gsoap-2.8.28/gsoap/VisualStudio2005/soapcpp2/soapcpp2/init2.c0000644000175000017500000001312012653650160023007 0ustar ellertellert/* init2.c Symbol table initialization. gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc. All Rights Reserved. This part of the software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapcpp2.h" #ifdef HAVE_CONFIG_H #include "soapcpp2_yacc.h" #else #include "soapcpp2_yacc.tab.h" #endif typedef struct Keyword { const char *s; /* name */ Token t; /* token */ } Keyword; static Keyword keywords[] = { { "asm", NONE }, { "auto", AUTO }, { "bool", BOOL }, { "break", BREAK }, { "case", CASE }, { "catch", NONE }, { "char", CHAR }, { "class", CLASS }, { "const", CONST }, { "const_cast", NONE }, { "continue", CONTINUE }, { "default", DEFAULT }, { "delete", NONE }, { "do", DO }, { "double", DOUBLE }, { "dynamic_cast", NONE }, { "else", ELSE }, { "enum", ENUM }, { "errno", NONE }, { "explicit", EXPLICIT }, { "export", NONE }, { "extern", EXTERN }, { "false", CFALSE }, { "final", FINAL }, { "float", FLOAT }, { "for", FOR }, { "friend", FRIEND }, { "goto", GOTO }, { "if", IF }, { "inline", INLINE }, { "int", INT }, { "int8_t", CHAR }, { "int16_t", SHORT }, { "int32_t", INT }, { "int64_t", LLONG }, { "long", LONG }, { "LONG64", LLONG }, { "mutable", MUTABLE }, { "namespace", NAMESPACE }, { "new", NONE }, { "nullptr", null }, { "NULL", null }, { "operator", OPERATOR }, { "override", OVERRIDE }, { "private", PRIVATE }, { "protected", PROTECTED }, { "public", PUBLIC }, { "register", REGISTER }, { "reinterpret_cast", NONE }, { "restrict", NONE }, { "return", RETURN }, { "short", SHORT }, { "signed", SIGNED }, { "size_t", SIZE }, { "sizeof", SIZEOF }, { "static", STATIC }, { "static_cast", NONE }, { "struct", STRUCT }, { "switch", SWITCH }, { "template", TEMPLATE }, { "this", NONE }, { "throw", NONE }, { "time_t", TIME }, { "true", CTRUE }, { "typedef", TYPEDEF }, { "typeid", NONE }, { "typename", TYPENAME }, { "uint8_t", UCHAR }, { "uint16_t", USHORT }, { "uint32_t", UINT }, { "uint64_t", ULLONG }, { "ULONG64", ULLONG }, { "union", UNION }, { "unsigned", UNSIGNED }, { "using", USING }, { "virtual", VIRTUAL }, { "void", VOID }, { "volatile", VOLATILE }, { "wchar_t", WCHAR }, { "while", WHILE }, { "operator!", NONE }, { "operator~", NONE }, { "operator=", NONE }, { "operator+=", NONE }, { "operator-=", NONE }, { "operator*=", NONE }, { "operator/=", NONE }, { "operator%=", NONE }, { "operator&=", NONE }, { "operator^=", NONE }, { "operator|=", NONE }, { "operator<<=", NONE }, { "operator>>=", NONE }, { "operator||", NONE }, { "operator&&", NONE }, { "operator|", NONE }, { "operator^", NONE }, { "operator&", NONE }, { "operator==", NONE }, { "operator!=", NONE }, { "operator<", NONE }, { "operator<=", NONE }, { "operator>", NONE }, { "operator>=", NONE }, { "operator<<", NONE }, { "operator>>", NONE }, { "operator+", NONE }, { "operator-", NONE }, { "operator*", NONE }, { "operator/", NONE }, { "operator%", NONE }, { "operator++", NONE }, { "operator--", NONE }, { "operator->", NONE }, { "operator[]", NONE }, { "operator()", NONE }, { "mustUnderstand", MUSTUNDERSTAND }, { "soap", ID }, { "SOAP_ENV__Header", ID }, { "dummy", ID }, { "soap_header", ID }, { "SOAP_ENV__Fault", ID }, { "SOAP_ENV__Code", ID }, { "SOAP_ENV__Subcode",ID }, { "SOAP_ENV__Reason", ID }, { "SOAP_ENV__Text", ID }, { "SOAP_ENV__Detail", ID }, { "SOAP_ENV__Value", ID }, { "SOAP_ENV__Node", ID }, { "SOAP_ENV__Role", ID }, { "faultcode", ID }, { "faultstring", ID }, { "faultactor", ID }, { "detail", ID }, { "__type", ID }, { "fault", ID }, { "__any", ID }, { "_QName", ID }, { "_XML", ID }, { "std::string", TYPE }, { "std::wstring", TYPE }, { "std::deque", TYPE }, { "std::queue", TYPE }, { "std::list", TYPE }, { "std::vector", TYPE }, { "std::set", TYPE }, { "std::shared_ptr", TYPE }, { "std::unique_ptr", TYPE }, { "std::auto_ptr", TYPE }, { "std::weak_ptr", TYPE }, { "std::function", TYPE }, { "/*?*/", NONE }, { 0, 0 } }; /* init - initialize symbol table with predefined keywords */ void init(void) { struct Keyword *k; for (k = keywords; k->s; k++) install(k->s, k->t); } gsoap-2.8.28/gsoap/VisualStudio2005/soapcpp2/soapcpp2/error2.c0000644000175000017500000001063612653650160023206 0ustar ellertellert/* error2.c Error handling. gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc. All Rights Reserved. This part of the software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapcpp2.h" #ifdef HAVE_CONFIG_H #include "soapcpp2_yacc.h" #else #include "soapcpp2_yacc.tab.h" #endif #define MAXERR 10 extern char yytext[]; /* lexeme found by the lexical analyzer */ static int lexerrno = 0; static int synerrno = 0; static int semerrno = 0; static int semwarno = 0; char errbuf[1024]; /* to hold error messages */ /* yyerror - auto-called by parser from an error production with nonterminal `error' */ void yyerror(const char *s) { (void)s; } /* lexerror - called by lexical analyzer upon failure to recognize a token */ void lexerror(const char *s) { fprintf(stderr, "%s(%d): %s: %s\n", filename, yylineno, s, yytext); if (lexerrno++ >= MAXERR) execerror("too many syntactic errors, bailing out"); } /* synerror - called by a semantic action for an error production in the yacc grammar */ void synerror(const char *s) { fprintf(stderr, "%s(%d): Syntax error: %s\n", filename, yylineno, s); if (synerrno++ >= MAXERR) execerror("too many syntactic errors, bailing out"); } /* semerror - report semantic error from static checking */ void semerror(const char *s) { fprintf(stderr, "\n%s(%d): **ERROR**: %s\n\n", filename, yylineno, s); if (semerrno++ >= MAXERR) execerror("too many semantic errors, bailing out"); } /* semwarn - report semantic warning from static checking */ void semwarn(const char *s) { if (yylineno) fprintf(stderr, "\n%s(%d): *WARNING*: %s\n\n", filename, yylineno, s); else fprintf(stderr, "\n%s: *WARNING*: %s\n\n", filename, s); semwarno++; } /* compliancewarn - report compliance warning */ void compliancewarn(const char *s) { fprintf(stderr, "Compliance warning: %s\n", s); } /* typerror - report type error (a semantic error) */ void typerror(const char *s) { fprintf(stderr, "%s(%d): Type error: %s\n", filename, yylineno, s); if (semerrno++ >= MAXERR) execerror("too many semantic errors, bailing out"); } /* execerror - print error message and terminate execution */ void execerror(const char *s) { fprintf(stderr, "Critical error: %s\n", s); exit(1); } /* progerror - called when check(expr) failed, i.e. upon programming error */ void progerror(const char *s, const char *f, int l) { fprintf(stderr, "Program failure: %s in file %s line %d\n", s, f, l); exit(1); } /* errstat - show error statistics */ int errstat(void) { if (!lexerrno && !synerrno && !semerrno) { fprintf(stderr, "\nCompilation successful "); if (semwarno) fprintf(stderr, "(%d warning%s)\n\n", semwarno, semwarno>1?"s":""); else fprintf(stderr, "\n\n"); return 0; } fprintf(stderr, "\nThere were errors:\n"); if (lexerrno) fprintf(stderr, "%d lexical error%s\n", lexerrno, lexerrno>1?"s":""); if (synerrno) fprintf(stderr, "%d syntax error%s\n", synerrno, synerrno>1?"s":""); if (semerrno) fprintf(stderr, "%d semantic error%s\n", semerrno, semerrno>1?"s":""); if (semwarno) fprintf(stderr, "%d warning%s\n", semwarno, semwarno>1?"s":""); fprintf(stderr, "\n"); return -1; } gsoap-2.8.28/gsoap/VisualStudio2005/soapcpp2/soapcpp2/soapcpp2_yacc.tab.c0000644000175000017500000070041612653650160025270 0ustar ellertellert/* A Bison parser, made by GNU Bison 2.3. */ /* Skeleton implementation for Bison's Yacc-like parsers in C Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. 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, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /* C LALR(1) parser skeleton written by Richard Stallman, by simplifying the original so-called "semantic" parser. */ /* All symbols defined below should begin with yy or YY, to avoid infringing on user name space. This should be done even for local variables, as they might otherwise be expanded by user macros. There are some unavoidable exceptions within include files to define necessary library symbols; they are noted "INFRINGES ON USER NAME SPACE" below. */ /* Identify Bison output. */ #define YYBISON 1 /* Bison version. */ #define YYBISON_VERSION "2.3" /* Skeleton name. */ #define YYSKELETON_NAME "yacc.c" /* Pure parsers. */ #define YYPURE 0 /* Using locations. */ #define YYLSP_NEEDED 0 /* Tokens. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE /* Put the tokens into the symbol table, so that GDB and other debuggers know about them. */ enum yytokentype { PRAGMA = 258, AUTO = 259, DOUBLE = 260, INT = 261, STRUCT = 262, BREAK = 263, ELSE = 264, LONG = 265, SWITCH = 266, CASE = 267, ENUM = 268, REGISTER = 269, TYPEDEF = 270, CHAR = 271, EXTERN = 272, RETURN = 273, UNION = 274, CONST = 275, FLOAT = 276, SHORT = 277, UNSIGNED = 278, CONTINUE = 279, FOR = 280, SIGNED = 281, VOID = 282, DEFAULT = 283, GOTO = 284, SIZEOF = 285, VOLATILE = 286, DO = 287, IF = 288, STATIC = 289, WHILE = 290, CLASS = 291, PRIVATE = 292, PROTECTED = 293, PUBLIC = 294, VIRTUAL = 295, INLINE = 296, OPERATOR = 297, LLONG = 298, BOOL = 299, CFALSE = 300, CTRUE = 301, WCHAR = 302, TIME = 303, USING = 304, NAMESPACE = 305, ULLONG = 306, MUSTUNDERSTAND = 307, SIZE = 308, FRIEND = 309, TEMPLATE = 310, EXPLICIT = 311, TYPENAME = 312, MUTABLE = 313, FINAL = 314, null = 315, RESTRICT = 316, OVERRIDE = 317, UCHAR = 318, USHORT = 319, UINT = 320, ULONG = 321, NONE = 322, ID = 323, LAB = 324, TYPE = 325, LNG = 326, DBL = 327, CHR = 328, TAG = 329, STR = 330, RA = 331, LA = 332, OA = 333, XA = 334, AA = 335, MA = 336, DA = 337, TA = 338, NA = 339, PA = 340, OR = 341, AN = 342, NE = 343, EQ = 344, GE = 345, LE = 346, RS = 347, LS = 348, AR = 349, PP = 350, NN = 351 }; #endif /* Tokens. */ #define PRAGMA 258 #define AUTO 259 #define DOUBLE 260 #define INT 261 #define STRUCT 262 #define BREAK 263 #define ELSE 264 #define LONG 265 #define SWITCH 266 #define CASE 267 #define ENUM 268 #define REGISTER 269 #define TYPEDEF 270 #define CHAR 271 #define EXTERN 272 #define RETURN 273 #define UNION 274 #define CONST 275 #define FLOAT 276 #define SHORT 277 #define UNSIGNED 278 #define CONTINUE 279 #define FOR 280 #define SIGNED 281 #define VOID 282 #define DEFAULT 283 #define GOTO 284 #define SIZEOF 285 #define VOLATILE 286 #define DO 287 #define IF 288 #define STATIC 289 #define WHILE 290 #define CLASS 291 #define PRIVATE 292 #define PROTECTED 293 #define PUBLIC 294 #define VIRTUAL 295 #define INLINE 296 #define OPERATOR 297 #define LLONG 298 #define BOOL 299 #define CFALSE 300 #define CTRUE 301 #define WCHAR 302 #define TIME 303 #define USING 304 #define NAMESPACE 305 #define ULLONG 306 #define MUSTUNDERSTAND 307 #define SIZE 308 #define FRIEND 309 #define TEMPLATE 310 #define EXPLICIT 311 #define TYPENAME 312 #define MUTABLE 313 #define FINAL 314 #define null 315 #define RESTRICT 316 #define OVERRIDE 317 #define UCHAR 318 #define USHORT 319 #define UINT 320 #define ULONG 321 #define NONE 322 #define ID 323 #define LAB 324 #define TYPE 325 #define LNG 326 #define DBL 327 #define CHR 328 #define TAG 329 #define STR 330 #define RA 331 #define LA 332 #define OA 333 #define XA 334 #define AA 335 #define MA 336 #define DA 337 #define TA 338 #define NA 339 #define PA 340 #define OR 341 #define AN 342 #define NE 343 #define EQ 344 #define GE 345 #define LE 346 #define RS 347 #define LS 348 #define AR 349 #define PP 350 #define NN 351 /* Copy the first part of user declarations. */ #line 51 "soapcpp2_yacc.y" #include "soapcpp2.h" #ifdef WIN32 #ifndef __STDC__ #define __STDC__ #endif #define YYINCLUDED_STDLIB_H #ifdef WIN32_WITHOUT_SOLARIS_FLEX extern int soapcpp2lex(void); #else extern int yylex(void); #endif #else extern int yylex(void); #endif #define MAXNEST 16 /* max. nesting depth of scopes */ typedef struct Scope { Table *table; Entry *entry; Node node; LONG64 val; int offset; Bool grow; /* true if offset grows with declarations */ Bool mask; /* true if enum is mask */ } Scope; Scope stack[MAXNEST], /* stack of tables and offsets */ *sp; /* current scope stack pointer */ Table *classtable = NULL, *enumtable = NULL, *typetable = NULL, *booltable = NULL, *templatetable = NULL; const char *namespaceid = NULL; int transient = 0; int permission = 0; int custom_header = 1; int custom_fault = 1; Pragma *pragmas = NULL; Tnode *qname = NULL; Tnode *xml = NULL; /* function prototypes for support routine section */ static Entry *undefined(Symbol*); static Tnode *mgtype(Tnode*, Tnode*); static Node op(const char*, Node, Node), iop(const char*, Node, Node), relop(const char*, Node, Node); static void mkscope(Table*, int), enterscope(Table*, int), exitscope(void); static int integer(Tnode*), real(Tnode*), numeric(Tnode*); static void add_soap(void), add_XML(void), add_qname(void), add_header(void), add_fault(void), add_response(Entry*, Entry*), add_result(Tnode*), add_request(Symbol*, Scope*); /* imported from symbol2.c */ extern int is_string(Tnode*), is_wstring(Tnode*), is_XML(Tnode*), is_smart(Tnode*); extern char *c_storage(Storage); extern const char *c_type(Tnode*); extern int is_primitive_or_string(Tnode*), is_stdstr(Tnode*), is_binary(Tnode*), is_external(Tnode*), is_mutable(Entry*); extern Entry *unlinklast(Table*); /* Temporaries used in semantic rules */ int i; char *s, *s1; const char *s2; Symbol *sym; Entry *p, *q; Tnode *t; Node tmp, c; Pragma **pp; /* Enabling traces. */ #ifndef YYDEBUG # define YYDEBUG 0 #endif /* Enabling verbose error messages. */ #ifdef YYERROR_VERBOSE # undef YYERROR_VERBOSE # define YYERROR_VERBOSE 1 #else # define YYERROR_VERBOSE 0 #endif /* Enabling the token table. */ #ifndef YYTOKEN_TABLE # define YYTOKEN_TABLE 0 #endif #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED typedef union YYSTYPE #line 153 "soapcpp2_yacc.y" { Symbol *sym; LONG64 i; double r; char c; char *s; Tnode *typ; Storage sto; Node rec; Entry *e; } /* Line 193 of yacc.c. */ #line 397 "soapcpp2_yacc.tab.c" YYSTYPE; # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 # define YYSTYPE_IS_TRIVIAL 1 #endif /* Copy the second part of user declarations. */ /* Line 216 of yacc.c. */ #line 410 "soapcpp2_yacc.tab.c" #ifdef short # undef short #endif #ifdef YYTYPE_UINT8 typedef YYTYPE_UINT8 yytype_uint8; #else typedef unsigned char yytype_uint8; #endif #ifdef YYTYPE_INT8 typedef YYTYPE_INT8 yytype_int8; #elif (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) typedef signed char yytype_int8; #else typedef short int yytype_int8; #endif #ifdef YYTYPE_UINT16 typedef YYTYPE_UINT16 yytype_uint16; #else typedef unsigned short int yytype_uint16; #endif #ifdef YYTYPE_INT16 typedef YYTYPE_INT16 yytype_int16; #else typedef short int yytype_int16; #endif #ifndef YYSIZE_T # ifdef __SIZE_TYPE__ # define YYSIZE_T __SIZE_TYPE__ # elif defined size_t # define YYSIZE_T size_t # elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) # include /* INFRINGES ON USER NAME SPACE */ # define YYSIZE_T size_t # else # define YYSIZE_T unsigned int # endif #endif #define YYSIZE_MAXIMUM ((YYSIZE_T) -1) #ifndef YY_ # if defined YYENABLE_NLS && YYENABLE_NLS # if ENABLE_NLS # include /* INFRINGES ON USER NAME SPACE */ # define YY_(msgid) dgettext ("bison-runtime", msgid) # endif # endif # ifndef YY_ # define YY_(msgid) msgid # endif #endif /* Suppress unused-variable warnings by "using" E. */ #if ! defined lint || defined __GNUC__ # define YYUSE(e) ((void) (e)) #else # define YYUSE(e) /* empty */ #endif /* Identity function, used to suppress warnings about constant conditions. */ #ifndef lint # define YYID(n) (n) #else #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static int YYID (int i) #else static int YYID (i) int i; #endif { return i; } #endif #if ! defined yyoverflow || YYERROR_VERBOSE /* The parser invokes alloca or malloc; define the necessary symbols. */ # ifdef YYSTACK_USE_ALLOCA # if YYSTACK_USE_ALLOCA # ifdef __GNUC__ # define YYSTACK_ALLOC __builtin_alloca # elif defined __BUILTIN_VA_ARG_INCR # include /* INFRINGES ON USER NAME SPACE */ # elif defined _AIX # define YYSTACK_ALLOC __alloca # elif defined _MSC_VER # include /* INFRINGES ON USER NAME SPACE */ # define alloca _alloca # else # define YYSTACK_ALLOC alloca # if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) # include /* INFRINGES ON USER NAME SPACE */ # ifndef _STDLIB_H # define _STDLIB_H 1 # endif # endif # endif # endif # endif # ifdef YYSTACK_ALLOC /* Pacify GCC's `empty if-body' warning. */ # define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) # ifndef YYSTACK_ALLOC_MAXIMUM /* The OS might guarantee only one guard page at the bottom of the stack, and a page size can be as small as 4096 bytes. So we cannot safely invoke alloca (N) if N exceeds 4096. Use a slightly smaller number to allow for a few compiler-allocated temporary stack slots. */ # define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ # endif # else # define YYSTACK_ALLOC YYMALLOC # define YYSTACK_FREE YYFREE # ifndef YYSTACK_ALLOC_MAXIMUM # define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM # endif # if (defined __cplusplus && ! defined _STDLIB_H \ && ! ((defined YYMALLOC || defined malloc) \ && (defined YYFREE || defined free))) # include /* INFRINGES ON USER NAME SPACE */ # ifndef _STDLIB_H # define _STDLIB_H 1 # endif # endif # ifndef YYMALLOC # define YYMALLOC malloc # if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ # endif # endif # ifndef YYFREE # define YYFREE free # if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) void free (void *); /* INFRINGES ON USER NAME SPACE */ # endif # endif # endif #endif /* ! defined yyoverflow || YYERROR_VERBOSE */ #if (! defined yyoverflow \ && (! defined __cplusplus \ || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) /* A type that is properly aligned for any stack member. */ union yyalloc { yytype_int16 yyss; YYSTYPE yyvs; }; /* The size of the maximum gap between one aligned stack and the next. */ # define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) /* The size of an array large to enough to hold all stacks, each with N elements. */ # define YYSTACK_BYTES(N) \ ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ + YYSTACK_GAP_MAXIMUM) /* Copy COUNT objects from FROM to TO. The source and destination do not overlap. */ # ifndef YYCOPY # if defined __GNUC__ && 1 < __GNUC__ # define YYCOPY(To, From, Count) \ __builtin_memcpy (To, From, (Count) * sizeof (*(From))) # else # define YYCOPY(To, From, Count) \ do \ { \ YYSIZE_T yyi; \ for (yyi = 0; yyi < (Count); yyi++) \ (To)[yyi] = (From)[yyi]; \ } \ while (YYID (0)) # endif # endif /* Relocate STACK from its old location to the new one. The local variables YYSIZE and YYSTACKSIZE give the old and new number of elements in the stack, and YYPTR gives the new location of the stack. Advance YYPTR to a properly aligned location for the next stack. */ # define YYSTACK_RELOCATE(Stack) \ do \ { \ YYSIZE_T yynewbytes; \ YYCOPY (&yyptr->Stack, Stack, yysize); \ Stack = &yyptr->Stack; \ yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ yyptr += yynewbytes / sizeof (*yyptr); \ } \ while (YYID (0)) #endif /* YYFINAL -- State number of the termination state. */ #define YYFINAL 3 /* YYLAST -- Last index in YYTABLE. */ #define YYLAST 1798 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 122 /* YYNNTS -- Number of nonterminals. */ #define YYNNTS 73 /* YYNRULES -- Number of rules. */ #define YYNRULES 291 /* YYNRULES -- Number of states. */ #define YYNSTATES 448 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ #define YYUNDEFTOK 2 #define YYMAXUTOK 351 #define YYTRANSLATE(YYX) \ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) /* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ static const yytype_uint8 yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 117, 2, 2, 121, 107, 94, 2, 119, 116, 105, 103, 76, 104, 2, 106, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 89, 113, 97, 77, 98, 88, 120, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 114, 2, 115, 93, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 111, 92, 112, 118, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 90, 91, 95, 96, 99, 100, 101, 102, 108, 109, 110 }; #if YYDEBUG /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in YYRHS. */ static const yytype_uint16 yyprhs[] = { 0, 0, 3, 6, 7, 13, 15, 16, 19, 22, 24, 26, 28, 31, 33, 34, 38, 43, 48, 53, 58, 61, 63, 65, 66, 67, 68, 70, 73, 77, 80, 83, 87, 92, 95, 98, 105, 108, 110, 112, 114, 117, 120, 123, 126, 129, 132, 135, 138, 141, 144, 147, 150, 153, 156, 159, 162, 165, 168, 171, 174, 177, 180, 183, 186, 189, 192, 195, 198, 201, 204, 207, 210, 213, 216, 220, 224, 227, 229, 233, 241, 242, 243, 245, 247, 251, 254, 257, 264, 265, 267, 269, 276, 280, 285, 286, 289, 292, 294, 296, 299, 302, 304, 306, 308, 310, 312, 314, 316, 318, 320, 322, 324, 326, 328, 330, 332, 334, 336, 338, 340, 348, 354, 360, 368, 370, 374, 380, 386, 389, 395, 402, 405, 412, 420, 427, 434, 441, 448, 451, 454, 456, 461, 465, 469, 472, 476, 480, 484, 488, 491, 494, 498, 502, 507, 512, 515, 518, 521, 524, 527, 530, 533, 536, 539, 541, 542, 544, 546, 549, 552, 555, 557, 560, 561, 562, 563, 564, 566, 567, 569, 571, 573, 575, 577, 579, 581, 583, 585, 587, 589, 591, 593, 595, 597, 599, 601, 603, 604, 607, 610, 613, 614, 617, 618, 620, 621, 624, 627, 630, 631, 636, 640, 642, 644, 648, 649, 652, 653, 655, 656, 658, 661, 665, 668, 670, 674, 679, 683, 684, 686, 688, 690, 692, 695, 698, 699, 701, 704, 706, 708, 711, 714, 718, 720, 722, 725, 727, 731, 733, 739, 741, 743, 747, 749, 751, 755, 757, 759, 763, 767, 771, 775, 779, 783, 787, 791, 795, 799, 803, 807, 811, 815, 819, 823, 825, 828, 831, 834, 837, 840, 843, 848, 850, 854, 856, 858, 860, 862, 864, 866, 868 }; /* YYRHS -- A `-1'-separated list of the rules' RHS. */ static const yytype_int16 yyrhs[] = { 123, 0, -1, 124, 125, -1, -1, 50, 68, 111, 126, 112, -1, 126, -1, -1, 126, 127, -1, 135, 113, -1, 128, -1, 130, -1, 131, -1, 1, 113, -1, 3, -1, -1, 135, 113, 129, -1, 37, 89, 132, 129, -1, 38, 89, 133, 129, -1, 39, 89, 134, 129, -1, 130, 129, 131, 129, -1, 1, 113, -1, 114, -1, 115, -1, -1, -1, -1, 150, -1, 150, 136, -1, 150, 137, 142, -1, 140, 142, -1, 141, 142, -1, 135, 76, 136, -1, 135, 76, 137, 142, -1, 1, 68, -1, 1, 116, -1, 172, 68, 174, 177, 179, 175, -1, 172, 139, -1, 68, -1, 70, -1, 68, -1, 42, 117, -1, 42, 118, -1, 42, 77, -1, 42, 87, -1, 42, 86, -1, 42, 85, -1, 42, 84, -1, 42, 83, -1, 42, 82, -1, 42, 81, -1, 42, 80, -1, 42, 79, -1, 42, 78, -1, 42, 90, -1, 42, 91, -1, 42, 92, -1, 42, 93, -1, 42, 94, -1, 42, 96, -1, 42, 95, -1, 42, 97, -1, 42, 100, -1, 42, 98, -1, 42, 99, -1, 42, 102, -1, 42, 101, -1, 42, 103, -1, 42, 104, -1, 42, 105, -1, 42, 106, -1, 42, 107, -1, 42, 109, -1, 42, 110, -1, 42, 108, -1, 42, 114, 115, -1, 42, 119, 116, -1, 42, 149, -1, 70, -1, 171, 118, 70, -1, 143, 119, 167, 144, 116, 169, 170, -1, -1, -1, 145, -1, 146, -1, 146, 76, 145, -1, 1, 68, -1, 1, 76, -1, 151, 172, 147, 174, 178, 176, -1, -1, 68, -1, 149, -1, 151, 172, 119, 167, 144, 116, -1, 151, 172, 173, -1, 151, 172, 68, 173, -1, -1, 168, 150, -1, 152, 150, -1, 168, -1, 152, -1, 168, 151, -1, 152, 151, -1, 27, -1, 44, -1, 16, -1, 47, -1, 22, -1, 6, -1, 10, -1, 43, -1, 51, -1, 53, -1, 21, -1, 5, -1, 26, -1, 23, -1, 63, -1, 64, -1, 65, -1, 66, -1, 48, -1, 55, 97, 161, 138, 98, 36, 138, -1, 36, 111, 163, 129, 112, -1, 154, 111, 163, 129, 112, -1, 154, 89, 162, 111, 163, 129, 112, -1, 154, -1, 154, 89, 162, -1, 7, 111, 163, 129, 112, -1, 153, 111, 163, 129, 112, -1, 7, 138, -1, 19, 111, 164, 129, 112, -1, 19, 138, 111, 164, 129, 112, -1, 19, 138, -1, 13, 111, 163, 135, 166, 112, -1, 13, 105, 111, 163, 135, 166, 112, -1, 155, 111, 163, 135, 166, 112, -1, 156, 111, 163, 135, 166, 112, -1, 157, 111, 165, 135, 166, 112, -1, 158, 111, 165, 135, 166, 112, -1, 13, 138, -1, 13, 159, -1, 70, -1, 70, 97, 148, 98, -1, 1, 68, 1, -1, 1, 68, 98, -1, 1, 98, -1, 36, 1, 112, -1, 7, 1, 112, -1, 19, 1, 112, -1, 13, 1, 112, -1, 7, 138, -1, 36, 138, -1, 13, 138, 160, -1, 13, 159, 160, -1, 13, 105, 138, 160, -1, 13, 105, 159, 160, -1, 7, 138, -1, 36, 138, -1, 89, 16, -1, 89, 47, -1, 89, 22, -1, 89, 6, -1, 89, 10, -1, 89, 43, -1, 89, 70, -1, 89, -1, -1, 36, -1, 57, -1, 38, 162, -1, 37, 162, -1, 39, 162, -1, 70, -1, 7, 68, -1, -1, -1, -1, -1, 76, -1, -1, 4, -1, 14, -1, 34, -1, 56, -1, 17, -1, 15, -1, 40, -1, 20, -1, 59, -1, 62, -1, 54, -1, 41, -1, 52, -1, 18, -1, 120, -1, 121, -1, 31, -1, 58, -1, -1, 169, 20, -1, 169, 59, -1, 169, 62, -1, -1, 77, 71, -1, -1, 40, -1, -1, 172, 105, -1, 172, 94, -1, 172, 91, -1, -1, 114, 186, 115, 173, -1, 114, 115, 173, -1, 173, -1, 176, -1, 111, 186, 112, -1, -1, 77, 186, -1, -1, 74, -1, -1, 71, -1, 71, 89, -1, 71, 89, 71, -1, 89, 71, -1, 180, -1, 180, 181, 182, -1, 180, 181, 183, 181, -1, 180, 184, 181, -1, -1, 75, -1, 72, -1, 71, -1, 73, -1, 103, 181, -1, 104, 181, -1, -1, 89, -1, 97, 89, -1, 97, -1, 89, -1, 97, 89, -1, 89, 97, -1, 97, 89, 97, -1, 97, -1, 89, -1, 89, 97, -1, 97, -1, 185, 76, 185, -1, 186, -1, 189, 88, 187, 89, 186, -1, 188, -1, 185, -1, 189, 90, 190, -1, 190, -1, 188, -1, 191, 91, 192, -1, 192, -1, 190, -1, 192, 92, 192, -1, 192, 93, 192, -1, 192, 94, 192, -1, 192, 96, 192, -1, 192, 95, 192, -1, 192, 97, 192, -1, 192, 100, 192, -1, 192, 98, 192, -1, 192, 99, 192, -1, 192, 102, 192, -1, 192, 101, 192, -1, 192, 103, 192, -1, 192, 104, 192, -1, 192, 105, 192, -1, 192, 106, 192, -1, 192, 107, 192, -1, 193, -1, 117, 193, -1, 118, 193, -1, 104, 193, -1, 103, 193, -1, 105, 193, -1, 94, 193, -1, 30, 119, 149, 116, -1, 194, -1, 119, 185, 116, -1, 68, -1, 71, -1, 60, -1, 72, -1, 73, -1, 75, -1, 45, -1, 46, -1 }; /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const yytype_uint16 yyrline[] = { 0, 229, 229, 249, 264, 266, 268, 273, 275, 276, 277, 278, 279, 289, 319, 323, 325, 327, 329, 331, 333, 338, 340, 342, 344, 346, 348, 349, 350, 352, 353, 354, 355, 357, 362, 367, 587, 605, 606, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, 657, 668, 696, 757, 759, 760, 762, 763, 764, 768, 773, 901, 909, 927, 928, 935, 937, 940, 945, 986, 1038, 1045, 1050, 1091, 1143, 1144, 1145, 1146, 1147, 1148, 1149, 1150, 1151, 1152, 1153, 1154, 1155, 1156, 1157, 1158, 1159, 1160, 1161, 1162, 1172, 1198, 1225, 1249, 1253, 1271, 1298, 1322, 1343, 1370, 1395, 1416, 1443, 1470, 1479, 1488, 1502, 1516, 1533, 1551, 1581, 1638, 1644, 1649, 1653, 1659, 1665, 1671, 1678, 1703, 1730, 1748, 1767, 1789, 1812, 1817, 1823, 1824, 1825, 1826, 1827, 1828, 1829, 1839, 1843, 1845, 1846, 1848, 1849, 1850, 1851, 1860, 1862, 1870, 1879, 1886, 1887, 1889, 1898, 1899, 1900, 1901, 1902, 1903, 1904, 1905, 1906, 1907, 1908, 1909, 1910, 1911, 1912, 1917, 1918, 1919, 1921, 1922, 1923, 1924, 1926, 1927, 1929, 1930, 1932, 1933, 1941, 1946, 1952, 1953, 1971, 1976, 1991, 1992, 2006, 2007, 2021, 2022, 2024, 2035, 2048, 2061, 2082, 2099, 2110, 2124, 2146, 2163, 2164, 2166, 2167, 2168, 2169, 2170, 2172, 2173, 2174, 2175, 2177, 2178, 2179, 2180, 2181, 2183, 2184, 2185, 2194, 2195, 2198, 2204, 2207, 2210, 2214, 2216, 2219, 2222, 2224, 2227, 2228, 2229, 2230, 2231, 2232, 2233, 2234, 2235, 2236, 2237, 2238, 2239, 2240, 2241, 2242, 2243, 2246, 2252, 2258, 2271, 2272, 2280, 2285, 2291, 2294, 2295, 2303, 2308, 2313, 2318, 2323, 2328, 2333 }; #endif #if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. First, the terminals, then, starting at YYNTOKENS, nonterminals. */ static const char *const yytname[] = { "$end", "error", "$undefined", "PRAGMA", "AUTO", "DOUBLE", "INT", "STRUCT", "BREAK", "ELSE", "LONG", "SWITCH", "CASE", "ENUM", "REGISTER", "TYPEDEF", "CHAR", "EXTERN", "RETURN", "UNION", "CONST", "FLOAT", "SHORT", "UNSIGNED", "CONTINUE", "FOR", "SIGNED", "VOID", "DEFAULT", "GOTO", "SIZEOF", "VOLATILE", "DO", "IF", "STATIC", "WHILE", "CLASS", "PRIVATE", "PROTECTED", "PUBLIC", "VIRTUAL", "INLINE", "OPERATOR", "LLONG", "BOOL", "CFALSE", "CTRUE", "WCHAR", "TIME", "USING", "NAMESPACE", "ULLONG", "MUSTUNDERSTAND", "SIZE", "FRIEND", "TEMPLATE", "EXPLICIT", "TYPENAME", "MUTABLE", "FINAL", "null", "RESTRICT", "OVERRIDE", "UCHAR", "USHORT", "UINT", "ULONG", "NONE", "ID", "LAB", "TYPE", "LNG", "DBL", "CHR", "TAG", "STR", "','", "'='", "RA", "LA", "OA", "XA", "AA", "MA", "DA", "TA", "NA", "PA", "'?'", "':'", "OR", "AN", "'|'", "'^'", "'&'", "NE", "EQ", "'<'", "'>'", "GE", "LE", "RS", "LS", "'+'", "'-'", "'*'", "'/'", "'%'", "AR", "PP", "NN", "'{'", "'}'", "';'", "'['", "']'", "')'", "'!'", "'~'", "'('", "'@'", "'$'", "$accept", "prog", "s1", "exts", "exts1", "ext", "pragma", "decls", "t1", "t2", "t3", "t4", "t5", "dclrs", "dclr", "fdclr", "id", "name", "ctor", "dtor", "func", "fname", "fargso", "fargs", "farg", "arg", "texpf", "texp", "spec", "tspec", "type", "struct", "class", "enum", "enumsc", "mask", "masksc", "sc", "utype", "tname", "base", "s2", "s3", "s4", "s5", "s6", "store", "const", "abstract", "virtual", "ptrs", "array", "arrayck", "brinit", "init", "tag", "occurs", "bounds", "patt", "cdbl", "min", "minmax", "max", "expr", "cexp", "qexp", "oexp", "obex", "aexp", "abex", "rexp", "lexp", "pexp", 0 }; #endif # ifdef YYPRINT /* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to token YYLEX-NUM. */ static const yytype_uint16 yytoknum[] = { 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 44, 61, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 63, 58, 341, 342, 124, 94, 38, 343, 344, 60, 62, 345, 346, 347, 348, 43, 45, 42, 47, 37, 349, 350, 351, 123, 125, 59, 91, 93, 41, 33, 126, 40, 64, 36 }; # endif /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const yytype_uint8 yyr1[] = { 0, 122, 123, 124, 125, 125, 126, 126, 127, 127, 127, 127, 127, 128, 129, 129, 129, 129, 129, 129, 129, 130, 131, 132, 133, 134, 135, 135, 135, 135, 135, 135, 135, 135, 135, 136, 137, 138, 138, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 140, 141, 142, 143, 144, 144, 145, 145, 145, 145, 146, 147, 147, 148, 148, 149, 149, 150, 150, 150, 151, 151, 151, 151, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 153, 154, 155, 156, 157, 158, 159, 159, 160, 160, 160, 160, 160, 160, 160, 160, 160, 161, 161, 162, 162, 162, 162, 162, 163, 164, 165, 166, 166, 167, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 169, 169, 169, 169, 170, 170, 171, 171, 172, 172, 172, 172, 173, 173, 173, 174, 175, 175, 176, 176, 177, 177, 178, 178, 178, 178, 178, 179, 179, 179, 179, 180, 180, 181, 181, 181, 181, 181, 182, 182, 182, 182, 183, 183, 183, 183, 183, 184, 184, 184, 185, 185, 186, 186, 187, 188, 188, 189, 190, 190, 191, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 193, 193, 193, 193, 193, 193, 193, 193, 194, 194, 194, 194, 194, 194, 194, 194, 194 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ static const yytype_uint8 yyr2[] = { 0, 2, 2, 0, 5, 1, 0, 2, 2, 1, 1, 1, 2, 1, 0, 3, 4, 4, 4, 4, 2, 1, 1, 0, 0, 0, 1, 2, 3, 2, 2, 3, 4, 2, 2, 6, 2, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 2, 1, 3, 7, 0, 0, 1, 1, 3, 2, 2, 6, 0, 1, 1, 6, 3, 4, 0, 2, 2, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 5, 5, 7, 1, 3, 5, 5, 2, 5, 6, 2, 6, 7, 6, 6, 6, 6, 2, 2, 1, 4, 3, 3, 2, 3, 3, 3, 3, 2, 2, 3, 3, 4, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 0, 1, 1, 2, 2, 2, 1, 2, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 2, 2, 2, 0, 2, 0, 1, 0, 2, 2, 2, 0, 4, 3, 1, 1, 3, 0, 2, 0, 1, 0, 1, 2, 3, 2, 1, 3, 4, 3, 0, 1, 1, 1, 1, 2, 2, 0, 1, 2, 1, 1, 2, 2, 3, 1, 1, 2, 1, 3, 1, 5, 1, 1, 3, 1, 1, 3, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 2, 2, 2, 2, 2, 2, 4, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1 }; /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state STATE-NUM when YYTABLE doesn't specify something else to do. Zero means the default is an error. */ static const yytype_uint16 yydefact[] = { 3, 0, 6, 1, 0, 2, 0, 0, 0, 13, 179, 112, 106, 0, 107, 0, 180, 184, 103, 183, 192, 0, 186, 111, 105, 114, 113, 101, 195, 181, 0, 185, 190, 108, 102, 104, 119, 109, 191, 110, 189, 0, 182, 196, 187, 188, 115, 116, 117, 118, 140, 21, 22, 193, 194, 7, 9, 10, 11, 0, 80, 80, 205, 0, 0, 124, 0, 0, 0, 0, 0, 0, 6, 0, 144, 12, 34, 0, 37, 38, 173, 128, 0, 0, 0, 0, 173, 138, 139, 0, 174, 131, 0, 173, 150, 0, 0, 205, 8, 29, 0, 30, 27, 80, 0, 0, 185, 140, 96, 173, 0, 173, 173, 173, 175, 175, 95, 0, 0, 142, 143, 146, 0, 148, 155, 156, 173, 165, 165, 0, 164, 151, 152, 147, 0, 174, 145, 0, 166, 167, 0, 0, 90, 205, 0, 0, 31, 80, 178, 28, 0, 209, 208, 207, 206, 36, 0, 0, 0, 0, 0, 0, 171, 125, 0, 0, 0, 0, 0, 78, 4, 0, 0, 0, 0, 0, 0, 0, 0, 153, 154, 0, 176, 160, 161, 157, 159, 162, 158, 163, 0, 0, 0, 0, 141, 209, 100, 99, 32, 0, 42, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 53, 54, 55, 56, 57, 59, 58, 60, 62, 63, 61, 65, 64, 66, 67, 68, 69, 70, 73, 71, 72, 0, 40, 41, 0, 76, 205, 0, 212, 217, 0, 172, 169, 168, 170, 173, 0, 176, 176, 176, 176, 20, 23, 24, 25, 126, 0, 0, 176, 205, 0, 129, 0, 121, 0, 209, 178, 92, 0, 0, 82, 83, 205, 74, 75, 209, 0, 290, 291, 286, 284, 285, 287, 288, 289, 0, 0, 0, 0, 209, 0, 0, 0, 0, 250, 0, 253, 0, 256, 274, 282, 218, 228, 127, 0, 122, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 132, 130, 0, 93, 0, 0, 86, 197, 0, 88, 0, 280, 278, 277, 279, 211, 275, 276, 0, 248, 209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 229, 215, 224, 0, 134, 135, 136, 137, 16, 17, 18, 19, 133, 120, 0, 201, 84, 89, 209, 0, 0, 283, 210, 251, 0, 252, 255, 258, 259, 260, 262, 261, 263, 265, 266, 264, 268, 267, 269, 270, 271, 272, 273, 0, 0, 35, 213, 231, 230, 232, 244, 246, 0, 0, 235, 0, 123, 91, 198, 199, 200, 0, 79, 219, 281, 247, 0, 216, 0, 245, 233, 234, 236, 238, 225, 0, 227, 202, 220, 0, 215, 249, 214, 241, 237, 226, 221, 223, 87, 242, 222 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int16 yydefgoto[] = { -1, 1, 2, 5, 6, 55, 56, 175, 176, 58, 311, 312, 313, 177, 146, 147, 81, 155, 60, 61, 99, 100, 270, 271, 272, 375, 141, 142, 62, 273, 63, 64, 65, 66, 67, 68, 69, 88, 131, 140, 163, 122, 134, 167, 261, 199, 70, 372, 419, 71, 104, 239, 240, 402, 403, 303, 437, 358, 359, 411, 431, 432, 412, 335, 336, 381, 295, 296, 297, 298, 299, 300, 301 }; /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ #define YYPACT_NINF -311 static const yytype_int16 yypact[] = { -311, 33, -9, -311, 21, -311, 237, -14, -38, -311, -311, -311, -311, 13, -311, 12, -311, -311, -311, -311, -311, 23, -311, -311, -311, -311, -311, -311, -311, -311, 24, -13, -311, -311, -311, -311, -311, -311, -311, -311, -311, 19, -311, -311, -311, -311, -311, -311, -311, -311, 2, -311, -311, -311, -311, -311, -311, -311, -311, 35, -311, -311, 25, 1193, 18, 42, 43, 50, 59, 80, 1193, 31, -311, 20, -311, -311, -311, 91, -311, -311, -311, 93, 95, -24, -24, 9, -311, 61, 61, 109, -311, 116, 119, -311, -311, 49, 1491, -311, -311, -311, 79, -311, -311, -311, -7, -25, -311, 65, -311, -311, 105, -311, -311, -311, -311, -311, -311, 150, 833, -311, -311, -311, 594, -311, -311, -311, -311, 139, 139, 1311, 130, -311, -311, -311, 594, -311, -311, 594, -311, -311, -24, 138, -311, -311, 951, 1072, -311, -311, -311, -311, 355, -87, -311, -311, -311, -311, 28, 594, 177, 105, 105, 105, -311, 135, 594, 1311, 1311, 1311, 1311, -311, -311, 47, 172, 173, 180, 158, 712, 38, 1311, -311, -311, -26, 196, -311, -311, -311, -311, -311, -311, -311, 162, 594, 163, 178, -311, 87, -311, -311, -311, 1420, -311, -311, -311, -311, -311, -311, -311, -311, -311, -311, -311, -311, -311, -311, -311, -311, -311, -311, -311, -311, -311, -311, -311, -311, -311, -311, -311, -311, -311, -311, -311, -311, 167, -311, -311, 170, -311, -311, 1592, -311, 209, 175, -311, -311, -311, -311, -311, 182, 196, 196, 196, 196, -311, -311, -311, -311, -311, 191, 476, 196, 208, 214, -311, 215, -311, 281, 216, -311, -311, 117, 213, -311, 258, -311, -311, -311, 108, 217, -311, -311, -311, -311, -311, -311, -311, -311, 1631, 1631, 1631, 1631, 216, 1631, 1631, 1631, 220, 96, 124, 246, 247, 1676, -311, -311, -311, 264, -311, 594, -311, 231, 232, 233, 236, 476, 476, 476, 476, -311, 241, -311, -311, -24, -311, 1420, 11, -311, -311, 1562, 114, 1491, -311, -311, -311, -311, -311, -311, -311, -53, -311, 216, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, -311, -23, 243, 242, -311, -311, -311, -311, -311, -311, -311, -311, -311, -311, 248, 51, -311, -311, 216, 250, 1631, -311, -311, 273, 274, 246, 1676, 1691, 577, 694, 459, 459, 470, 470, 470, 470, 205, 205, 104, 104, -311, -311, -311, 1631, 1631, -311, -311, -311, -311, -311, 270, -311, 194, 194, -58, 194, -311, -311, -311, -311, -311, 308, -311, 85, -311, -311, 1631, -311, 268, -311, -311, -311, 86, 145, -311, 194, -311, -311, 294, 313, 310, -311, -311, -311, 482, -311, 314, -311, -311, -311, -311 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int16 yypgoto[] = { -311, -311, -311, -311, 316, -311, -311, -117, 4, 133, -311, -311, -311, 1, 330, 331, -15, -311, -311, -311, -39, -311, 73, 72, -311, -311, -311, -147, 32, -88, -95, -311, -311, -311, -311, -311, -311, 315, -62, -311, 64, -75, 266, 289, 74, 148, -92, -311, -311, -311, -134, -190, 30, -311, -21, -311, -311, -311, -311, -91, -311, -311, -311, -310, -236, -311, -311, -311, 83, -311, 1411, 403, -311 }; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If positive, shift that token. If negative, reduce the rule which number is the opposite. If zero, do what YYDEFACT says. If YYTABLE_NINF, syntax error. */ #define YYTABLE_NINF -258 static const yytype_int16 yytable[] = { 87, 144, 294, 236, 145, 268, 91, 59, 143, 195, 57, 129, 119, 82, 77, 94, 83, 190, 137, 83, 192, 119, 101, 377, 89, 92, 132, 238, 380, 119, 73, 429, -39, 3, 157, 150, 164, 165, 166, 430, 241, 4, 73, 156, 78, 84, 79, 247, 84, 144, 144, 178, 145, 145, 400, 144, 196, 197, 145, 257, 74, 151, 237, 378, 149, 179, 180, 422, 124, 125, 127, 415, 74, 74, 263, 75, 320, 78, 76, 79, 78, 78, 79, 79, 152, 138, 268, 153, 401, 7, 76, 78, 78, 79, 79, 108, -33, 72, 154, 96, 332, -26, 116, 276, 144, -204, 139, 145, 198, 120, 416, 97, 158, 417, 97, 73, 95, 85, 120, 59, 126, -77, 57, 86, 80, 193, 120, -85, 418, 109, 182, 110, -33, -33, 90, 93, 183, -26, -26, 326, 184, 315, 159, 160, 161, 74, 185, 379, 98, 117, 130, 258, 186, 111, 112, 266, 435, -239, -239, -239, 252, 113, 96, 76, 424, 425, 248, 249, 250, 251, 114, 305, -165, 187, 436, 162, 266, 188, 152, 259, 376, 153, 374, 440, -254, 322, -254, 438, 360, -239, -239, 115, 154, 323, 365, 366, 367, 368, 148, 152, 189, 238, 153, 121, -149, 152, 267, 123, 153, 354, 355, 356, 338, 154, 339, 74, -243, -243, -243, 154, 169, 133, 238, 243, 244, 245, 144, 135, 130, 145, 144, 136, 144, 145, 441, 145, 194, -5, 8, 237, 9, 10, 11, 12, 13, 242, 246, 14, -243, -243, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 253, 254, 26, 27, 404, 405, 406, 28, 255, 256, 29, 260, 30, 262, 264, 265, 31, 32, -94, 33, 34, 274, 302, 35, 36, 275, 304, 37, 38, 39, 40, 41, 42, 306, 43, 44, 409, 410, 45, 46, 47, 48, 49, 370, -94, 52, 50, 352, 353, 354, 355, 356, -94, 404, 405, 406, 319, 427, 428, -177, 433, 307, 308, 309, 310, 317, 318, -94, 324, 238, -94, 407, 316, 325, 337, 327, -257, 340, 357, 408, 442, -94, 361, 362, 363, 409, 410, 364, 377, -94, 51, 52, 369, 413, -203, 105, 53, 54, 10, 11, 12, 13, 423, 414, 14, 421, 426, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 434, 439, 26, 27, 443, 444, 447, 28, 400, 118, 29, 314, 30, 102, 103, 371, 106, 32, 373, 33, 34, 128, 191, 35, 36, 168, 420, 37, 38, 39, 40, 41, 42, 0, 43, 44, 321, 445, 45, 46, 47, 48, 49, 382, 0, 0, 107, 0, 0, 0, 0, 0, 0, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 0, 0, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 0, 0, 0, 232, 0, 0, 233, 234, 235, 53, 54, 171, 0, 0, 10, 11, 12, 13, 0, 0, 14, 0, 0, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 0, 0, 26, 27, 0, 0, 0, 28, 0, 0, 29, 0, 30, 172, 173, 174, 31, 32, -94, 33, 34, 0, 0, 35, 36, 0, 0, 37, 38, 39, 40, 41, 42, 0, 43, 44, 0, 0, 45, 46, 47, 48, 49, 0, -94, 0, 50, 0, 0, 0, 0, 0, -94, -240, -240, -240, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, -94, 0, 0, -94, 350, 351, 352, 353, 354, 355, 356, 0, 446, 0, -94, 0, 0, 0, -240, -240, 0, -14, -94, 51, -14, 0, 0, -203, 171, 53, 54, 10, 11, 12, 13, 0, 0, 14, 0, 0, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 0, 0, 26, 27, 0, 0, 0, 28, 0, 0, 29, 0, 30, 172, 173, 174, 31, 32, -94, 33, 34, 0, 0, 35, 36, 0, 0, 37, 38, 39, 40, 41, 42, 0, 43, 44, 0, 0, 45, 46, 47, 48, 49, 0, -94, 0, 50, 0, 0, 0, 0, 0, -94, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, -94, 0, 0, -94, 328, 329, 330, 331, 0, 333, 334, 0, 0, 0, -94, 0, 0, 0, 0, 0, 0, -14, -94, 51, 0, 0, 0, -203, 171, 53, 54, 10, 11, 12, 13, 0, 0, 14, 0, 0, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 0, 0, 26, 27, 0, 0, 0, 28, 0, 0, 29, 0, 30, 172, 173, 174, 31, 32, -94, 33, 34, 0, 0, 35, 36, 0, 0, 37, 38, 39, 40, 41, 42, 0, 43, 44, 0, 0, 45, 46, 47, 48, 49, 0, -94, 0, 50, 0, 0, 0, 0, 0, -94, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 0, -94, 0, 0, -94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -94, 0, 0, 0, 0, 0, 0, 0, -94, 51, -14, 0, 0, -203, 0, 53, 54, 8, 0, 9, 10, 11, 12, 13, 0, 0, 14, 0, 0, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 0, 0, 26, 27, 0, 0, 0, 28, 0, 0, 29, 0, 30, 0, 0, 0, 31, 32, -94, 33, 34, 0, 0, 35, 36, 0, 0, 37, 38, 39, 40, 41, 42, 0, 43, 44, 0, 0, 45, 46, 47, 48, 49, 0, -94, 0, 50, 0, 0, 0, 0, 0, -94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -94, 0, 0, -94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -94, 0, 0, 0, 0, 0, 0, 170, -94, 51, 52, 0, 0, -203, 105, 53, 54, 10, 11, 12, 13, 0, 0, 14, 0, 0, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 0, 0, 26, 27, 0, 0, 0, 28, 0, 0, 29, 0, 30, 0, 0, 0, 106, 32, 0, 33, 34, 0, 0, 35, 36, 0, 0, 37, 38, 39, 40, 41, 42, 0, 43, 44, 0, 0, 45, 46, 47, 48, 49, 0, -98, 0, 107, -98, 0, 0, 0, 0, -98, -98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -98, 0, -98, 0, 0, -98, 0, 0, 0, -98, 0, 0, 0, 0, 0, 0, -98, 0, 0, 0, 0, 0, 0, 0, 0, -98, 0, -98, 0, 0, -98, 53, 54, 105, 0, 0, 10, 11, 12, 13, 0, 0, 14, 0, 0, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 0, 0, 26, 27, 0, 0, 0, 28, 0, 0, 29, 0, 30, 0, 0, 0, 106, 32, 0, 33, 34, 0, 0, 35, 36, 0, 0, 37, 38, 39, 40, 41, 42, 0, 43, 44, 0, 0, 45, 46, 47, 48, 49, 0, -97, 0, 107, -97, 0, 0, 0, 0, -97, -97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -97, 0, -97, 0, 0, -97, 0, 0, 0, -97, 0, 0, 0, 0, 0, 0, -97, 0, 0, 0, 0, 0, 0, 0, 0, -97, 0, -97, 0, 0, -97, 53, 54, 105, 0, 0, 10, 11, 12, 13, 0, 0, 14, 0, 0, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 0, 0, 26, 27, 0, 0, 0, 28, 0, 0, 29, 0, 30, 0, 0, 0, 106, 32, -94, 33, 34, 0, 0, 35, 36, 0, 0, 37, 38, 39, 40, 41, 42, 0, 43, 44, 0, 0, 45, 46, 47, 48, 49, 0, -94, 0, 107, 0, 0, 0, 0, 0, -94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -94, 0, 0, -94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -94, 0, 0, 0, 0, 0, 0, -94, -94, 0, 0, 0, 0, 0, 181, 53, 54, 10, 11, 12, 13, 0, 0, 14, 0, 0, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 0, 0, 26, 27, 0, 0, 0, 28, 0, 0, 29, 0, 30, 0, 0, 0, 31, 32, -94, 33, 34, 0, 0, 35, 36, 0, 0, 37, 38, 39, 40, 41, 42, 0, 43, 44, 0, 0, 45, 46, 47, 48, 49, 0, -94, 0, 50, 0, 0, 0, 0, 0, -94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -94, 0, 0, -94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -94, 0, 0, 0, 0, 269, 0, -94, 10, 11, 12, 13, 0, -203, 14, 53, 54, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 0, 0, 26, 27, 0, 0, 0, 28, 0, 0, 29, 0, 30, 0, 0, 0, 106, 32, 0, 33, 34, 0, 0, 35, 36, 0, 0, 37, 38, 39, 40, 41, 42, 0, 43, 44, 0, 0, 45, 46, 47, 48, 49, 0, 0, 0, 107, 0, 105, 0, 0, 10, 11, 12, 13, 0, 0, 14, 0, 0, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 0, 0, 26, 27, 0, 0, 0, 28, 0, 0, 29, 0, 30, 0, 0, 0, 106, 32, 0, 33, 34, -81, 0, 35, 36, 53, 54, 37, 38, 39, 40, 41, 42, 0, 43, 44, 0, 0, 45, 46, 47, 48, 49, 0, 0, 0, 107, 0, 269, 0, 0, 10, 11, 12, 13, 0, 0, 14, 0, 0, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 0, 0, 26, 27, 0, 0, 0, 28, 0, 0, 29, 0, 30, 0, 0, 0, 106, 32, 0, 33, 34, 0, 0, 35, 36, 53, 54, 37, 38, 39, 40, 41, 42, 0, 43, 44, 277, 0, 45, 46, 47, 48, 49, 0, 0, 0, 107, 0, 0, 0, 0, 278, 279, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 280, 0, 0, 0, 0, 0, 0, 0, 281, 277, 0, 282, 283, 284, 0, 285, 0, 0, 0, 0, 0, 0, 0, 0, 278, 279, 0, 0, 0, 0, 53, 54, 0, 0, 286, 0, 0, 0, 0, 280, 0, 0, 0, 287, 288, 289, 0, 281, 0, 0, 282, 283, 284, 0, 285, 290, 0, 291, 292, 293, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 286, 0, 0, 0, 0, 0, 0, 0, 0, 287, 288, 289, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 291, 292, 293, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356 }; static const yytype_int16 yycheck[] = { 15, 96, 238, 150, 96, 195, 21, 6, 96, 143, 6, 86, 1, 1, 1, 30, 7, 134, 93, 7, 137, 1, 61, 76, 1, 1, 88, 114, 338, 1, 68, 89, 119, 0, 109, 42, 111, 112, 113, 97, 157, 50, 68, 68, 68, 36, 70, 164, 36, 144, 145, 126, 144, 145, 77, 150, 144, 145, 150, 176, 98, 68, 150, 116, 103, 127, 128, 377, 83, 84, 85, 20, 98, 98, 191, 113, 266, 68, 116, 70, 68, 68, 70, 70, 91, 36, 276, 94, 111, 68, 116, 68, 68, 70, 70, 63, 76, 111, 105, 97, 290, 76, 70, 237, 199, 118, 57, 199, 147, 98, 59, 76, 7, 62, 76, 68, 97, 105, 98, 118, 111, 119, 118, 111, 111, 140, 98, 116, 77, 111, 129, 89, 112, 113, 111, 111, 6, 112, 113, 273, 10, 258, 37, 38, 39, 98, 16, 337, 113, 118, 89, 113, 22, 111, 111, 68, 71, 71, 72, 73, 113, 111, 97, 116, 400, 401, 165, 166, 167, 168, 111, 246, 111, 43, 89, 70, 68, 47, 91, 178, 327, 94, 68, 97, 88, 68, 90, 423, 305, 103, 104, 111, 105, 76, 311, 312, 313, 314, 119, 91, 70, 114, 94, 112, 111, 91, 119, 112, 94, 105, 106, 107, 88, 105, 90, 98, 71, 72, 73, 105, 70, 112, 114, 159, 160, 161, 321, 111, 89, 321, 325, 112, 327, 325, 89, 327, 98, 0, 1, 327, 3, 4, 5, 6, 7, 68, 111, 10, 103, 104, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 89, 89, 26, 27, 71, 72, 73, 31, 89, 112, 34, 76, 36, 112, 112, 98, 40, 41, 42, 43, 44, 115, 74, 47, 48, 116, 112, 51, 52, 53, 54, 55, 56, 112, 58, 59, 103, 104, 62, 63, 64, 65, 66, 319, 68, 115, 70, 103, 104, 105, 106, 107, 76, 71, 72, 73, 36, 409, 410, 112, 412, 248, 249, 250, 251, 112, 112, 91, 116, 114, 94, 89, 259, 76, 115, 119, 91, 91, 75, 97, 432, 105, 112, 112, 112, 103, 104, 112, 76, 113, 114, 115, 112, 112, 118, 1, 120, 121, 4, 5, 6, 7, 89, 116, 10, 116, 97, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 71, 112, 26, 27, 89, 71, 71, 31, 77, 72, 34, 257, 36, 62, 62, 321, 40, 41, 325, 43, 44, 85, 135, 47, 48, 115, 375, 51, 52, 53, 54, 55, 56, -1, 58, 59, 267, 437, 62, 63, 64, 65, 66, 339, -1, -1, 70, -1, -1, -1, -1, -1, -1, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, -1, -1, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, -1, -1, -1, 114, -1, -1, 117, 118, 119, 120, 121, 1, -1, -1, 4, 5, 6, 7, -1, -1, 10, -1, -1, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, -1, -1, 26, 27, -1, -1, -1, 31, -1, -1, 34, -1, 36, 37, 38, 39, 40, 41, 42, 43, 44, -1, -1, 47, 48, -1, -1, 51, 52, 53, 54, 55, 56, -1, 58, 59, -1, -1, 62, 63, 64, 65, 66, -1, 68, -1, 70, -1, -1, -1, -1, -1, 76, 71, 72, 73, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 91, -1, -1, 94, 101, 102, 103, 104, 105, 106, 107, -1, 97, -1, 105, -1, -1, -1, 103, 104, -1, 112, 113, 114, 115, -1, -1, 118, 1, 120, 121, 4, 5, 6, 7, -1, -1, 10, -1, -1, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, -1, -1, 26, 27, -1, -1, -1, 31, -1, -1, 34, -1, 36, 37, 38, 39, 40, 41, 42, 43, 44, -1, -1, 47, 48, -1, -1, 51, 52, 53, 54, 55, 56, -1, 58, 59, -1, -1, 62, 63, 64, 65, 66, -1, 68, -1, 70, -1, -1, -1, -1, -1, 76, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 91, -1, -1, 94, 286, 287, 288, 289, -1, 291, 292, -1, -1, -1, 105, -1, -1, -1, -1, -1, -1, 112, 113, 114, -1, -1, -1, 118, 1, 120, 121, 4, 5, 6, 7, -1, -1, 10, -1, -1, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, -1, -1, 26, 27, -1, -1, -1, 31, -1, -1, 34, -1, 36, 37, 38, 39, 40, 41, 42, 43, 44, -1, -1, 47, 48, -1, -1, 51, 52, 53, 54, 55, 56, -1, 58, 59, -1, -1, 62, 63, 64, 65, 66, -1, 68, -1, 70, -1, -1, -1, -1, -1, 76, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, -1, 91, -1, -1, 94, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 105, -1, -1, -1, -1, -1, -1, -1, 113, 114, 115, -1, -1, 118, -1, 120, 121, 1, -1, 3, 4, 5, 6, 7, -1, -1, 10, -1, -1, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, -1, -1, 26, 27, -1, -1, -1, 31, -1, -1, 34, -1, 36, -1, -1, -1, 40, 41, 42, 43, 44, -1, -1, 47, 48, -1, -1, 51, 52, 53, 54, 55, 56, -1, 58, 59, -1, -1, 62, 63, 64, 65, 66, -1, 68, -1, 70, -1, -1, -1, -1, -1, 76, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 91, -1, -1, 94, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 105, -1, -1, -1, -1, -1, -1, 112, 113, 114, 115, -1, -1, 118, 1, 120, 121, 4, 5, 6, 7, -1, -1, 10, -1, -1, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, -1, -1, 26, 27, -1, -1, -1, 31, -1, -1, 34, -1, 36, -1, -1, -1, 40, 41, -1, 43, 44, -1, -1, 47, 48, -1, -1, 51, 52, 53, 54, 55, 56, -1, 58, 59, -1, -1, 62, 63, 64, 65, 66, -1, 68, -1, 70, 71, -1, -1, -1, -1, 76, 77, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 89, -1, 91, -1, -1, 94, -1, -1, -1, 98, -1, -1, -1, -1, -1, -1, 105, -1, -1, -1, -1, -1, -1, -1, -1, 114, -1, 116, -1, -1, 119, 120, 121, 1, -1, -1, 4, 5, 6, 7, -1, -1, 10, -1, -1, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, -1, -1, 26, 27, -1, -1, -1, 31, -1, -1, 34, -1, 36, -1, -1, -1, 40, 41, -1, 43, 44, -1, -1, 47, 48, -1, -1, 51, 52, 53, 54, 55, 56, -1, 58, 59, -1, -1, 62, 63, 64, 65, 66, -1, 68, -1, 70, 71, -1, -1, -1, -1, 76, 77, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 89, -1, 91, -1, -1, 94, -1, -1, -1, 98, -1, -1, -1, -1, -1, -1, 105, -1, -1, -1, -1, -1, -1, -1, -1, 114, -1, 116, -1, -1, 119, 120, 121, 1, -1, -1, 4, 5, 6, 7, -1, -1, 10, -1, -1, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, -1, -1, 26, 27, -1, -1, -1, 31, -1, -1, 34, -1, 36, -1, -1, -1, 40, 41, 42, 43, 44, -1, -1, 47, 48, -1, -1, 51, 52, 53, 54, 55, 56, -1, 58, 59, -1, -1, 62, 63, 64, 65, 66, -1, 68, -1, 70, -1, -1, -1, -1, -1, 76, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 91, -1, -1, 94, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 105, -1, -1, -1, -1, -1, -1, 112, 113, -1, -1, -1, -1, -1, 1, 120, 121, 4, 5, 6, 7, -1, -1, 10, -1, -1, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, -1, -1, 26, 27, -1, -1, -1, 31, -1, -1, 34, -1, 36, -1, -1, -1, 40, 41, 42, 43, 44, -1, -1, 47, 48, -1, -1, 51, 52, 53, 54, 55, 56, -1, 58, 59, -1, -1, 62, 63, 64, 65, 66, -1, 68, -1, 70, -1, -1, -1, -1, -1, 76, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 91, -1, -1, 94, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 105, -1, -1, -1, -1, 1, -1, 112, 4, 5, 6, 7, -1, 118, 10, 120, 121, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, -1, -1, 26, 27, -1, -1, -1, 31, -1, -1, 34, -1, 36, -1, -1, -1, 40, 41, -1, 43, 44, -1, -1, 47, 48, -1, -1, 51, 52, 53, 54, 55, 56, -1, 58, 59, -1, -1, 62, 63, 64, 65, 66, -1, -1, -1, 70, -1, 1, -1, -1, 4, 5, 6, 7, -1, -1, 10, -1, -1, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, -1, -1, 26, 27, -1, -1, -1, 31, -1, -1, 34, -1, 36, -1, -1, -1, 40, 41, -1, 43, 44, 116, -1, 47, 48, 120, 121, 51, 52, 53, 54, 55, 56, -1, 58, 59, -1, -1, 62, 63, 64, 65, 66, -1, -1, -1, 70, -1, 1, -1, -1, 4, 5, 6, 7, -1, -1, 10, -1, -1, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, -1, -1, 26, 27, -1, -1, -1, 31, -1, -1, 34, -1, 36, -1, -1, -1, 40, 41, -1, 43, 44, -1, -1, 47, 48, 120, 121, 51, 52, 53, 54, 55, 56, -1, 58, 59, 30, -1, 62, 63, 64, 65, 66, -1, -1, -1, 70, -1, -1, -1, -1, 45, 46, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 60, -1, -1, -1, -1, -1, -1, -1, 68, 30, -1, 71, 72, 73, -1, 75, -1, -1, -1, -1, -1, -1, -1, -1, 45, 46, -1, -1, -1, -1, 120, 121, -1, -1, 94, -1, -1, -1, -1, 60, -1, -1, -1, 103, 104, 105, -1, 68, -1, -1, 71, 72, 73, -1, 75, 115, -1, 117, 118, 119, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 94, -1, -1, -1, -1, -1, -1, -1, -1, 103, 104, 105, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 117, 118, 119, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const yytype_uint8 yystos[] = { 0, 123, 124, 0, 50, 125, 126, 68, 1, 3, 4, 5, 6, 7, 10, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 26, 27, 31, 34, 36, 40, 41, 43, 44, 47, 48, 51, 52, 53, 54, 55, 56, 58, 59, 62, 63, 64, 65, 66, 70, 114, 115, 120, 121, 127, 128, 130, 131, 135, 140, 141, 150, 152, 153, 154, 155, 156, 157, 158, 168, 171, 111, 68, 98, 113, 116, 1, 68, 70, 111, 138, 1, 7, 36, 105, 111, 138, 159, 1, 111, 138, 1, 111, 138, 97, 97, 76, 113, 142, 143, 142, 136, 137, 172, 1, 40, 70, 150, 111, 89, 111, 111, 111, 111, 111, 150, 118, 126, 1, 98, 112, 163, 112, 138, 138, 111, 138, 159, 163, 89, 160, 160, 112, 164, 111, 112, 163, 36, 57, 161, 148, 149, 151, 152, 168, 136, 137, 119, 142, 42, 68, 91, 94, 105, 139, 68, 163, 7, 37, 38, 39, 70, 162, 163, 163, 163, 165, 165, 70, 112, 1, 37, 38, 39, 129, 130, 135, 163, 160, 160, 1, 135, 6, 10, 16, 22, 43, 47, 70, 129, 164, 129, 138, 98, 172, 151, 151, 142, 167, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 114, 117, 118, 119, 149, 151, 114, 173, 174, 129, 68, 162, 162, 162, 111, 129, 135, 135, 135, 135, 113, 89, 89, 89, 112, 129, 113, 135, 76, 166, 112, 129, 112, 98, 68, 119, 173, 1, 144, 145, 146, 151, 115, 116, 172, 30, 45, 46, 60, 68, 71, 72, 73, 75, 94, 103, 104, 105, 115, 117, 118, 119, 186, 188, 189, 190, 191, 192, 193, 194, 74, 177, 112, 163, 112, 166, 166, 166, 166, 132, 133, 134, 131, 129, 166, 112, 112, 36, 173, 167, 68, 76, 116, 76, 172, 119, 193, 193, 193, 193, 173, 193, 193, 185, 186, 115, 88, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 75, 179, 180, 129, 112, 112, 112, 112, 129, 129, 129, 129, 112, 138, 144, 169, 145, 68, 147, 149, 76, 116, 173, 185, 187, 190, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 77, 111, 175, 176, 71, 72, 73, 89, 97, 103, 104, 181, 184, 112, 116, 20, 59, 62, 77, 170, 174, 116, 185, 89, 186, 186, 97, 181, 181, 89, 97, 182, 183, 181, 71, 71, 89, 178, 186, 112, 97, 89, 181, 89, 71, 176, 97, 71 }; #define yyerrok (yyerrstatus = 0) #define yyclearin (yychar = YYEMPTY) #define YYEMPTY (-2) #define YYEOF 0 #define YYACCEPT goto yyacceptlab #define YYABORT goto yyabortlab #define YYERROR goto yyerrorlab /* Like YYERROR except do call yyerror. This remains here temporarily to ease the transition to the new meaning of YYERROR, for GCC. Once GCC version 2 has supplanted version 1, this can go. */ #define YYFAIL goto yyerrlab #define YYRECOVERING() (!!yyerrstatus) #define YYBACKUP(Token, Value) \ do \ if (yychar == YYEMPTY && yylen == 1) \ { \ yychar = (Token); \ yylval = (Value); \ yytoken = YYTRANSLATE (yychar); \ YYPOPSTACK (1); \ goto yybackup; \ } \ else \ { \ yyerror (YY_("syntax error: cannot back up")); \ YYERROR; \ } \ while (YYID (0)) #define YYTERROR 1 #define YYERRCODE 256 /* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. If N is 0, then set CURRENT to the empty location which ends the previous symbol: RHS[0] (always defined). */ #define YYRHSLOC(Rhs, K) ((Rhs)[K]) #ifndef YYLLOC_DEFAULT # define YYLLOC_DEFAULT(Current, Rhs, N) \ do \ if (YYID (N)) \ { \ (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ } \ else \ { \ (Current).first_line = (Current).last_line = \ YYRHSLOC (Rhs, 0).last_line; \ (Current).first_column = (Current).last_column = \ YYRHSLOC (Rhs, 0).last_column; \ } \ while (YYID (0)) #endif /* YY_LOCATION_PRINT -- Print the location on the stream. This macro was not mandated originally: define only if we know we won't break user code: when these are the locations we know. */ #ifndef YY_LOCATION_PRINT # if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL # define YY_LOCATION_PRINT(File, Loc) \ fprintf (File, "%d.%d-%d.%d", \ (Loc).first_line, (Loc).first_column, \ (Loc).last_line, (Loc).last_column) # else # define YY_LOCATION_PRINT(File, Loc) ((void) 0) # endif #endif /* YYLEX -- calling `yylex' with the right arguments. */ #ifdef YYLEX_PARAM # define YYLEX yylex (YYLEX_PARAM) #else # define YYLEX yylex () #endif /* Enable debugging if requested. */ #if YYDEBUG # ifndef YYFPRINTF # include /* INFRINGES ON USER NAME SPACE */ # define YYFPRINTF fprintf # endif # define YYDPRINTF(Args) \ do { \ if (yydebug) \ YYFPRINTF Args; \ } while (YYID (0)) # define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ do { \ if (yydebug) \ { \ YYFPRINTF (stderr, "%s ", Title); \ yy_symbol_print (stderr, \ Type, Value); \ YYFPRINTF (stderr, "\n"); \ } \ } while (YYID (0)) /*--------------------------------. | Print this symbol on YYOUTPUT. | `--------------------------------*/ /*ARGSUSED*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) #else static void yy_symbol_value_print (yyoutput, yytype, yyvaluep) FILE *yyoutput; int yytype; YYSTYPE const * const yyvaluep; #endif { if (!yyvaluep) return; # ifdef YYPRINT if (yytype < YYNTOKENS) YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); # else YYUSE (yyoutput); # endif switch (yytype) { default: break; } } /*--------------------------------. | Print this symbol on YYOUTPUT. | `--------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) #else static void yy_symbol_print (yyoutput, yytype, yyvaluep) FILE *yyoutput; int yytype; YYSTYPE const * const yyvaluep; #endif { if (yytype < YYNTOKENS) YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); else YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); yy_symbol_value_print (yyoutput, yytype, yyvaluep); YYFPRINTF (yyoutput, ")"); } /*------------------------------------------------------------------. | yy_stack_print -- Print the state stack from its BOTTOM up to its | | TOP (included). | `------------------------------------------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_stack_print (yytype_int16 *bottom, yytype_int16 *top) #else static void yy_stack_print (bottom, top) yytype_int16 *bottom; yytype_int16 *top; #endif { YYFPRINTF (stderr, "Stack now"); for (; bottom <= top; ++bottom) YYFPRINTF (stderr, " %d", *bottom); YYFPRINTF (stderr, "\n"); } # define YY_STACK_PRINT(Bottom, Top) \ do { \ if (yydebug) \ yy_stack_print ((Bottom), (Top)); \ } while (YYID (0)) /*------------------------------------------------. | Report that the YYRULE is going to be reduced. | `------------------------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_reduce_print (YYSTYPE *yyvsp, int yyrule) #else static void yy_reduce_print (yyvsp, yyrule) YYSTYPE *yyvsp; int yyrule; #endif { int yynrhs = yyr2[yyrule]; int yyi; unsigned long int yylno = yyrline[yyrule]; YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", yyrule - 1, yylno); /* The symbols being reduced. */ for (yyi = 0; yyi < yynrhs; yyi++) { fprintf (stderr, " $%d = ", yyi + 1); yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], &(yyvsp[(yyi + 1) - (yynrhs)]) ); fprintf (stderr, "\n"); } } # define YY_REDUCE_PRINT(Rule) \ do { \ if (yydebug) \ yy_reduce_print (yyvsp, Rule); \ } while (YYID (0)) /* Nonzero means print parse trace. It is left uninitialized so that multiple parsers can coexist. */ int yydebug; #else /* !YYDEBUG */ # define YYDPRINTF(Args) # define YY_SYMBOL_PRINT(Title, Type, Value, Location) # define YY_STACK_PRINT(Bottom, Top) # define YY_REDUCE_PRINT(Rule) #endif /* !YYDEBUG */ /* YYINITDEPTH -- initial size of the parser's stacks. */ #ifndef YYINITDEPTH # define YYINITDEPTH 200 #endif /* YYMAXDEPTH -- maximum size the stacks can grow to (effective only if the built-in stack extension method is used). Do not make this value too large; the results are undefined if YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) evaluated with infinite-precision integer arithmetic. */ #ifndef YYMAXDEPTH # define YYMAXDEPTH 10000 #endif #if YYERROR_VERBOSE # ifndef yystrlen # if defined __GLIBC__ && defined _STRING_H # define yystrlen strlen # else /* Return the length of YYSTR. */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static YYSIZE_T yystrlen (const char *yystr) #else static YYSIZE_T yystrlen (yystr) const char *yystr; #endif { YYSIZE_T yylen; for (yylen = 0; yystr[yylen]; yylen++) continue; return yylen; } # endif # endif # ifndef yystpcpy # if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE # define yystpcpy stpcpy # else /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in YYDEST. */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static char * yystpcpy (char *yydest, const char *yysrc) #else static char * yystpcpy (yydest, yysrc) char *yydest; const char *yysrc; #endif { char *yyd = yydest; const char *yys = yysrc; while ((*yyd++ = *yys++) != '\0') continue; return yyd - 1; } # endif # endif # ifndef yytnamerr /* Copy to YYRES the contents of YYSTR after stripping away unnecessary quotes and backslashes, so that it's suitable for yyerror. The heuristic is that double-quoting is unnecessary unless the string contains an apostrophe, a comma, or backslash (other than backslash-backslash). YYSTR is taken from yytname. If YYRES is null, do not copy; instead, return the length of what the result would have been. */ static YYSIZE_T yytnamerr (char *yyres, const char *yystr) { if (*yystr == '"') { YYSIZE_T yyn = 0; char const *yyp = yystr; for (;;) switch (*++yyp) { case '\'': case ',': goto do_not_strip_quotes; case '\\': if (*++yyp != '\\') goto do_not_strip_quotes; /* Fall through. */ default: if (yyres) yyres[yyn] = *yyp; yyn++; break; case '"': if (yyres) yyres[yyn] = '\0'; return yyn; } do_not_strip_quotes: ; } if (! yyres) return yystrlen (yystr); return yystpcpy (yyres, yystr) - yyres; } # endif /* Copy into YYRESULT an error message about the unexpected token YYCHAR while in state YYSTATE. Return the number of bytes copied, including the terminating null byte. If YYRESULT is null, do not copy anything; just return the number of bytes that would be copied. As a special case, return 0 if an ordinary "syntax error" message will do. Return YYSIZE_MAXIMUM if overflow occurs during size calculation. */ static YYSIZE_T yysyntax_error (char *yyresult, int yystate, int yychar) { int yyn = yypact[yystate]; if (! (YYPACT_NINF < yyn && yyn <= YYLAST)) return 0; else { int yytype = YYTRANSLATE (yychar); YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); YYSIZE_T yysize = yysize0; YYSIZE_T yysize1; int yysize_overflow = 0; enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; int yyx; # if 0 /* This is so xgettext sees the translatable formats that are constructed on the fly. */ YY_("syntax error, unexpected %s"); YY_("syntax error, unexpected %s, expecting %s"); YY_("syntax error, unexpected %s, expecting %s or %s"); YY_("syntax error, unexpected %s, expecting %s or %s or %s"); YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); # endif char *yyfmt; char const *yyf; static char const yyunexpected[] = "syntax error, unexpected %s"; static char const yyexpecting[] = ", expecting %s"; static char const yyor[] = " or %s"; char yyformat[sizeof yyunexpected + sizeof yyexpecting - 1 + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) * (sizeof yyor - 1))]; char const *yyprefix = yyexpecting; /* Start YYX at -YYN if negative to avoid negative indexes in YYCHECK. */ int yyxbegin = yyn < 0 ? -yyn : 0; /* Stay within bounds of both yycheck and yytname. */ int yychecklim = YYLAST - yyn + 1; int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; int yycount = 1; yyarg[0] = yytname[yytype]; yyfmt = yystpcpy (yyformat, yyunexpected); for (yyx = yyxbegin; yyx < yyxend; ++yyx) if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) { if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) { yycount = 1; yysize = yysize0; yyformat[sizeof yyunexpected - 1] = '\0'; break; } yyarg[yycount++] = yytname[yyx]; yysize1 = yysize + yytnamerr (0, yytname[yyx]); yysize_overflow |= (yysize1 < yysize); yysize = yysize1; yyfmt = yystpcpy (yyfmt, yyprefix); yyprefix = yyor; } yyf = YY_(yyformat); yysize1 = yysize + yystrlen (yyf); yysize_overflow |= (yysize1 < yysize); yysize = yysize1; if (yysize_overflow) return YYSIZE_MAXIMUM; if (yyresult) { /* Avoid sprintf, as that infringes on the user's name space. Don't have undefined behavior even if the translation produced a string with the wrong number of "%s"s. */ char *yyp = yyresult; int yyi = 0; while ((*yyp = *yyf) != '\0') { if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) { yyp += yytnamerr (yyp, yyarg[yyi++]); yyf += 2; } else { yyp++; yyf++; } } } return yysize; } } #endif /* YYERROR_VERBOSE */ /*-----------------------------------------------. | Release the memory associated to this symbol. | `-----------------------------------------------*/ /*ARGSUSED*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep) #else static void yydestruct (yymsg, yytype, yyvaluep) const char *yymsg; int yytype; YYSTYPE *yyvaluep; #endif { YYUSE (yyvaluep); if (!yymsg) yymsg = "Deleting"; YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); switch (yytype) { default: break; } } /* Prevent warnings from -Wmissing-prototypes. */ #ifdef YYPARSE_PARAM #if defined __STDC__ || defined __cplusplus int yyparse (void *YYPARSE_PARAM); #else int yyparse (); #endif #else /* ! YYPARSE_PARAM */ #if defined __STDC__ || defined __cplusplus int yyparse (void); #else int yyparse (); #endif #endif /* ! YYPARSE_PARAM */ /* The look-ahead symbol. */ int yychar; /* The semantic value of the look-ahead symbol. */ YYSTYPE yylval; /* Number of syntax errors so far. */ int yynerrs; /*----------. | yyparse. | `----------*/ #ifdef YYPARSE_PARAM #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) int yyparse (void *YYPARSE_PARAM) #else int yyparse (YYPARSE_PARAM) void *YYPARSE_PARAM; #endif #else /* ! YYPARSE_PARAM */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) int yyparse (void) #else int yyparse () #endif #endif { int yystate; int yyn; int yyresult; /* Number of tokens to shift before error messages enabled. */ int yyerrstatus; /* Look-ahead token as an internal (translated) token number. */ int yytoken = 0; #if YYERROR_VERBOSE /* Buffer for error messages, and its allocated size. */ char yymsgbuf[128]; char *yymsg = yymsgbuf; YYSIZE_T yymsg_alloc = sizeof yymsgbuf; #endif /* Three stacks and their tools: `yyss': related to states, `yyvs': related to semantic values, `yyls': related to locations. Refer to the stacks thru separate pointers, to allow yyoverflow to reallocate them elsewhere. */ /* The state stack. */ yytype_int16 yyssa[YYINITDEPTH]; yytype_int16 *yyss = yyssa; yytype_int16 *yyssp; /* The semantic value stack. */ YYSTYPE yyvsa[YYINITDEPTH]; YYSTYPE *yyvs = yyvsa; YYSTYPE *yyvsp; #define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) YYSIZE_T yystacksize = YYINITDEPTH; /* The variables used to return semantic value and location from the action routines. */ YYSTYPE yyval; /* The number of symbols on the RHS of the reduced rule. Keep to zero when no symbol should be popped. */ int yylen = 0; YYDPRINTF ((stderr, "Starting parse\n")); yystate = 0; yyerrstatus = 0; yynerrs = 0; yychar = YYEMPTY; /* Cause a token to be read. */ /* Initialize stack pointers. Waste one element of value and location stack so that they stay on the same level as the state stack. The wasted elements are never initialized. */ yyssp = yyss; yyvsp = yyvs; goto yysetstate; /*------------------------------------------------------------. | yynewstate -- Push a new state, which is found in yystate. | `------------------------------------------------------------*/ yynewstate: /* In all cases, when you get here, the value and location stacks have just been pushed. So pushing a state here evens the stacks. */ yyssp++; yysetstate: *yyssp = yystate; if (yyss + yystacksize - 1 <= yyssp) { /* Get the current used size of the three stacks, in elements. */ YYSIZE_T yysize = yyssp - yyss + 1; #ifdef yyoverflow { /* Give user a chance to reallocate the stack. Use copies of these so that the &'s don't force the real ones into memory. */ YYSTYPE *yyvs1 = yyvs; yytype_int16 *yyss1 = yyss; /* Each stack pointer address is followed by the size of the data in use in that stack, in bytes. This used to be a conditional around just the two extra args, but that might be undefined if yyoverflow is a macro. */ yyoverflow (YY_("memory exhausted"), &yyss1, yysize * sizeof (*yyssp), &yyvs1, yysize * sizeof (*yyvsp), &yystacksize); yyss = yyss1; yyvs = yyvs1; } #else /* no yyoverflow */ # ifndef YYSTACK_RELOCATE goto yyexhaustedlab; # else /* Extend the stack our own way. */ if (YYMAXDEPTH <= yystacksize) goto yyexhaustedlab; yystacksize *= 2; if (YYMAXDEPTH < yystacksize) yystacksize = YYMAXDEPTH; { yytype_int16 *yyss1 = yyss; union yyalloc *yyptr = (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); if (! yyptr) goto yyexhaustedlab; YYSTACK_RELOCATE (yyss); YYSTACK_RELOCATE (yyvs); # undef YYSTACK_RELOCATE if (yyss1 != yyssa) YYSTACK_FREE (yyss1); } # endif #endif /* no yyoverflow */ yyssp = yyss + yysize - 1; yyvsp = yyvs + yysize - 1; YYDPRINTF ((stderr, "Stack size increased to %lu\n", (unsigned long int) yystacksize)); if (yyss + yystacksize - 1 <= yyssp) YYABORT; } YYDPRINTF ((stderr, "Entering state %d\n", yystate)); goto yybackup; /*-----------. | yybackup. | `-----------*/ yybackup: /* Do appropriate processing given the current state. Read a look-ahead token if we need one and don't already have one. */ /* First try to decide what to do without reference to look-ahead token. */ yyn = yypact[yystate]; if (yyn == YYPACT_NINF) goto yydefault; /* Not known => get a look-ahead token if don't already have one. */ /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */ if (yychar == YYEMPTY) { YYDPRINTF ((stderr, "Reading a token: ")); yychar = YYLEX; } if (yychar <= YYEOF) { yychar = yytoken = YYEOF; YYDPRINTF ((stderr, "Now at end of input.\n")); } else { yytoken = YYTRANSLATE (yychar); YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); } /* If the proper action on seeing token YYTOKEN is to reduce or to detect an error, take that action. */ yyn += yytoken; if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) goto yydefault; yyn = yytable[yyn]; if (yyn <= 0) { if (yyn == 0 || yyn == YYTABLE_NINF) goto yyerrlab; yyn = -yyn; goto yyreduce; } if (yyn == YYFINAL) YYACCEPT; /* Count tokens shifted since error; after three, turn off error status. */ if (yyerrstatus) yyerrstatus--; /* Shift the look-ahead token. */ YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); /* Discard the shifted token unless it is eof. */ if (yychar != YYEOF) yychar = YYEMPTY; yystate = yyn; *++yyvsp = yylval; goto yynewstate; /*-----------------------------------------------------------. | yydefault -- do the default action for the current state. | `-----------------------------------------------------------*/ yydefault: yyn = yydefact[yystate]; if (yyn == 0) goto yyerrlab; goto yyreduce; /*-----------------------------. | yyreduce -- Do a reduction. | `-----------------------------*/ yyreduce: /* yyn is the number of a rule to reduce with. */ yylen = yyr2[yyn]; /* If YYLEN is nonzero, implement the default value of the action: `$$ = $1'. Otherwise, the following line sets YYVAL to garbage. This behavior is undocumented and Bison users should not rely upon it. Assigning to YYVAL unconditionally makes the parser a bit smaller, and it avoids a GCC warning that YYVAL may be used uninitialized. */ yyval = yyvsp[1-yylen]; YY_REDUCE_PRINT (yyn); switch (yyn) { case 2: #line 229 "soapcpp2_yacc.y" { if (lflag) { custom_header = 0; custom_fault = 0; } else { add_header(); add_fault(); } compile(sp->table); freetable(classtable); freetable(enumtable); freetable(typetable); freetable(booltable); freetable(templatetable); yylineno = 0; ;} break; case 3: #line 249 "soapcpp2_yacc.y" { classtable = mktable(NULL); enumtable = mktable(NULL); typetable = mktable(NULL); booltable = mktable(NULL); templatetable = mktable(NULL); p = enter(booltable, lookup("false")); p->info.typ = mkint(); p->info.val.i = 0; p = enter(booltable, lookup("true")); p->info.typ = mkint(); p->info.val.i = 1; mkscope(mktable(mktable(NULL)), 0); ;} break; case 4: #line 265 "soapcpp2_yacc.y" { namespaceid = (yyvsp[(2) - (5)].sym)->name; ;} break; case 5: #line 266 "soapcpp2_yacc.y" { ;} break; case 6: #line 268 "soapcpp2_yacc.y" { add_soap(); add_qname(); add_XML(); ;} break; case 7: #line 273 "soapcpp2_yacc.y" { ;} break; case 8: #line 275 "soapcpp2_yacc.y" { ;} break; case 9: #line 276 "soapcpp2_yacc.y" { ;} break; case 10: #line 277 "soapcpp2_yacc.y" { ;} break; case 11: #line 278 "soapcpp2_yacc.y" { ;} break; case 12: #line 279 "soapcpp2_yacc.y" { synerror("input before ; skipped"); while (sp > stack) { freetable(sp->table); exitscope(); } yyerrok; ;} break; case 13: #line 289 "soapcpp2_yacc.y" { if ((yyvsp[(1) - (1)].s)[1] >= 'a' && (yyvsp[(1) - (1)].s)[1] <= 'z') { char *s; for (pp = &pragmas; *pp; pp = &(*pp)->next) ; *pp = (Pragma*)emalloc(sizeof(Pragma)); s = (char*)emalloc(strlen((yyvsp[(1) - (1)].s))+1); strcpy(s, (yyvsp[(1) - (1)].s)); (*pp)->pragma = s; (*pp)->next = NULL; } else if ((i = atoi((yyvsp[(1) - (1)].s)+2)) > 0) { yylineno = i; } else { sprintf(errbuf, "directive '%s' ignored (use #import to import files)", (yyvsp[(1) - (1)].s)); semwarn(errbuf); } ;} break; case 14: #line 319 "soapcpp2_yacc.y" { transient &= ~6; permission = 0; ;} break; case 15: #line 324 "soapcpp2_yacc.y" { ;} break; case 16: #line 326 "soapcpp2_yacc.y" { ;} break; case 17: #line 328 "soapcpp2_yacc.y" { ;} break; case 18: #line 330 "soapcpp2_yacc.y" { ;} break; case 19: #line 332 "soapcpp2_yacc.y" { ;} break; case 20: #line 333 "soapcpp2_yacc.y" { synerror("declaration expected"); yyerrok; ;} break; case 21: #line 338 "soapcpp2_yacc.y" { transient |= 1; ;} break; case 22: #line 340 "soapcpp2_yacc.y" { transient &= ~1; ;} break; case 23: #line 342 "soapcpp2_yacc.y" { permission = Sprivate; ;} break; case 24: #line 344 "soapcpp2_yacc.y" { permission = Sprotected; ;} break; case 25: #line 346 "soapcpp2_yacc.y" { permission = 0; ;} break; case 26: #line 348 "soapcpp2_yacc.y" { ;} break; case 27: #line 349 "soapcpp2_yacc.y" { ;} break; case 28: #line 351 "soapcpp2_yacc.y" { ;} break; case 29: #line 352 "soapcpp2_yacc.y" { ;} break; case 30: #line 353 "soapcpp2_yacc.y" { ;} break; case 31: #line 354 "soapcpp2_yacc.y" { ;} break; case 32: #line 356 "soapcpp2_yacc.y" { ;} break; case 33: #line 357 "soapcpp2_yacc.y" { sprintf(errbuf, "undefined type in declaration of '%s'", (yyvsp[(2) - (2)].sym)->name); synerror(errbuf); yyerrok; ;} break; case 34: #line 362 "soapcpp2_yacc.y" { synerror("function declaration?"); yyerrok; ;} break; case 35: #line 368 "soapcpp2_yacc.y" { if (((yyvsp[(3) - (6)].rec).sto & Stypedef) && sp->table->level == GLOBAL) { if (((yyvsp[(3) - (6)].rec).typ->type != Tstruct && (yyvsp[(3) - (6)].rec).typ->type != Tunion && (yyvsp[(3) - (6)].rec).typ->type != Tenum && (yyvsp[(3) - (6)].rec).typ->type != Tenumsc) || strcmp((yyvsp[(2) - (6)].sym)->name, (yyvsp[(3) - (6)].rec).typ->id->name)) { p = enter(typetable, (yyvsp[(2) - (6)].sym)); p->info.typ = mksymtype((yyvsp[(3) - (6)].rec).typ, (yyvsp[(2) - (6)].sym)); if ((yyvsp[(3) - (6)].rec).sto & Sextern) { p->info.typ->transient = -1; p->info.typ->extsym = (yyvsp[(2) - (6)].sym); } else if (is_external((yyvsp[(3) - (6)].rec).typ)) p->info.typ->transient = -3; /* extern and volatile */ else p->info.typ->transient = (yyvsp[(3) - (6)].rec).typ->transient; if (p->info.typ->width == 0) p->info.typ->width = 8; p->info.sto = (yyvsp[(3) - (6)].rec).sto; p->info.typ->synonym = (yyvsp[(3) - (6)].rec).typ->sym; if ((yyvsp[(5) - (6)].rec).hasmin) { p->info.typ->hasmin = (yyvsp[(5) - (6)].rec).hasmin; p->info.typ->incmin = (yyvsp[(5) - (6)].rec).incmin; p->info.typ->min = (yyvsp[(5) - (6)].rec).min; p->info.typ->synonym = NULL; } else { p->info.typ->hasmin = (yyvsp[(3) - (6)].rec).typ->hasmin; p->info.typ->incmin = (yyvsp[(3) - (6)].rec).typ->incmin; p->info.typ->min = (yyvsp[(3) - (6)].rec).typ->min; } if ((yyvsp[(5) - (6)].rec).hasmax) { p->info.typ->hasmax = (yyvsp[(5) - (6)].rec).hasmax; p->info.typ->incmax = (yyvsp[(5) - (6)].rec).incmax; p->info.typ->max = (yyvsp[(5) - (6)].rec).max; p->info.typ->synonym = NULL; } else { p->info.typ->hasmax = (yyvsp[(3) - (6)].rec).typ->hasmax; p->info.typ->incmax = (yyvsp[(3) - (6)].rec).typ->incmax; p->info.typ->max = (yyvsp[(3) - (6)].rec).typ->max; } if ((yyvsp[(5) - (6)].rec).pattern) { p->info.typ->pattern = (yyvsp[(5) - (6)].rec).pattern; p->info.typ->synonym = NULL; } else { p->info.typ->pattern = (yyvsp[(3) - (6)].rec).typ->pattern; } } (yyvsp[(2) - (6)].sym)->token = TYPE; } else { p = enter(sp->table, (yyvsp[(2) - (6)].sym)); p->tag = (yyvsp[(4) - (6)].s); p->info.typ = (yyvsp[(3) - (6)].rec).typ; p->info.sto = (Storage)((int)(yyvsp[(3) - (6)].rec).sto | permission); if ((yyvsp[(6) - (6)].rec).hasval) { p->info.hasval = True; switch ((yyvsp[(3) - (6)].rec).typ->type) { case Tchar: case Tuchar: case Tshort: case Tushort: case Tint: case Tuint: case Tlong: case Tulong: case Tllong: case Tullong: case Tenum: case Tenumsc: case Ttime: if ((yyvsp[(6) - (6)].rec).typ->type == Tint || (yyvsp[(6) - (6)].rec).typ->type == Tchar || (yyvsp[(6) - (6)].rec).typ->type == Tenum || (yyvsp[(6) - (6)].rec).typ->type == Tenumsc) { sp->val = p->info.val.i = (yyvsp[(6) - (6)].rec).val.i; if (((yyvsp[(3) - (6)].rec).typ->hasmin && (yyvsp[(3) - (6)].rec).typ->min > (double)(yyvsp[(6) - (6)].rec).val.i) || ((yyvsp[(3) - (6)].rec).typ->hasmin && !(yyvsp[(3) - (6)].rec).typ->incmin && (yyvsp[(3) - (6)].rec).typ->min == (double)(yyvsp[(6) - (6)].rec).val.i) || ((yyvsp[(3) - (6)].rec).typ->hasmax && (yyvsp[(3) - (6)].rec).typ->max < (double)(yyvsp[(6) - (6)].rec).val.i) || ((yyvsp[(3) - (6)].rec).typ->hasmax && !(yyvsp[(3) - (6)].rec).typ->incmax && (yyvsp[(3) - (6)].rec).typ->max == (double)(yyvsp[(6) - (6)].rec).val.i)) semerror("initialization constant outside value range"); } else { semerror("type error in initialization constant"); p->info.hasval = False; } break; case Tfloat: case Tdouble: case Tldouble: if ((yyvsp[(6) - (6)].rec).typ->type == Tfloat || (yyvsp[(6) - (6)].rec).typ->type == Tdouble || (yyvsp[(6) - (6)].rec).typ->type == Tldouble) { p->info.val.r = (yyvsp[(6) - (6)].rec).val.r; if (((yyvsp[(3) - (6)].rec).typ->hasmin && (yyvsp[(3) - (6)].rec).typ->min > (yyvsp[(6) - (6)].rec).val.r) || ((yyvsp[(3) - (6)].rec).typ->hasmin && !(yyvsp[(3) - (6)].rec).typ->incmin && (yyvsp[(3) - (6)].rec).typ->min == (yyvsp[(6) - (6)].rec).val.r) || ((yyvsp[(3) - (6)].rec).typ->hasmax && (yyvsp[(3) - (6)].rec).typ->max < (yyvsp[(6) - (6)].rec).val.r) || ((yyvsp[(3) - (6)].rec).typ->hasmax && !(yyvsp[(3) - (6)].rec).typ->incmax && (yyvsp[(3) - (6)].rec).typ->max == (yyvsp[(6) - (6)].rec).val.r)) semerror("initialization constant outside value range"); } else if ((yyvsp[(6) - (6)].rec).typ->type == Tint) { p->info.val.r = (double)(yyvsp[(6) - (6)].rec).val.i; if (((yyvsp[(3) - (6)].rec).typ->hasmin && (yyvsp[(3) - (6)].rec).typ->min > (double)(yyvsp[(6) - (6)].rec).val.i) || ((yyvsp[(3) - (6)].rec).typ->hasmin && !(yyvsp[(3) - (6)].rec).typ->incmin && (yyvsp[(3) - (6)].rec).typ->min == (double)(yyvsp[(6) - (6)].rec).val.i) || ((yyvsp[(3) - (6)].rec).typ->hasmax && (yyvsp[(3) - (6)].rec).typ->max < (double)(yyvsp[(6) - (6)].rec).val.i) || ((yyvsp[(3) - (6)].rec).typ->hasmax && !(yyvsp[(3) - (6)].rec).typ->incmax && (yyvsp[(3) - (6)].rec).typ->max == (double)(yyvsp[(6) - (6)].rec).val.i)) semerror("initialization constant outside value range"); } else { semerror("type error in initialization constant"); p->info.hasval = False; } break; default: if ((yyvsp[(3) - (6)].rec).typ->type == Tpointer && (((Tnode*)(yyvsp[(3) - (6)].rec).typ->ref)->type == Tchar || ((Tnode*)(yyvsp[(3) - (6)].rec).typ->ref)->type == Twchar) && (yyvsp[(6) - (6)].rec).typ->type == Tpointer && ((Tnode*)(yyvsp[(6) - (6)].rec).typ->ref)->type == Tchar) p->info.val.s = (yyvsp[(6) - (6)].rec).val.s; else if (bflag && (yyvsp[(3) - (6)].rec).typ->type == Tarray && ((Tnode*)(yyvsp[(3) - (6)].rec).typ->ref)->type == Tchar && (yyvsp[(6) - (6)].rec).typ->type == Tpointer && ((Tnode*)(yyvsp[(6) - (6)].rec).typ->ref)->type == Tchar) { if ((yyvsp[(3) - (6)].rec).typ->width / ((Tnode*)(yyvsp[(3) - (6)].rec).typ->ref)->width - 1 < (int)strlen((yyvsp[(6) - (6)].rec).val.s)) { semerror("char[] initialization constant too long"); p->info.val.s = ""; } else { p->info.val.s = (yyvsp[(6) - (6)].rec).val.s; } } else if (((yyvsp[(3) - (6)].rec).typ->type == Tpointer || is_smart((yyvsp[(3) - (6)].rec).typ)) && (((Tnode*)(yyvsp[(3) - (6)].rec).typ->ref)->id == lookup("std::string") || ((Tnode*)(yyvsp[(3) - (6)].rec).typ->ref)->id == lookup("std::wstring"))) { p->info.val.s = (yyvsp[(6) - (6)].rec).val.s; } else if ((yyvsp[(3) - (6)].rec).typ->id == lookup("std::string") || (yyvsp[(3) - (6)].rec).typ->id == lookup("std::wstring")) { p->info.val.s = (yyvsp[(6) - (6)].rec).val.s; } else if ((yyvsp[(3) - (6)].rec).typ->type == Tpointer && (yyvsp[(6) - (6)].rec).typ->type == Tint && (yyvsp[(6) - (6)].rec).val.i == 0) { p->info.val.i = 0; } else { semerror("type error in initialization constant"); p->info.hasval = False; } break; } } else { p->info.val.i = sp->val; } if ((yyvsp[(5) - (6)].rec).minOccurs < 0) { if ((yyvsp[(6) - (6)].rec).hasval || ((yyvsp[(3) - (6)].rec).sto & Sattribute) || (yyvsp[(3) - (6)].rec).typ->type == Tpointer || (yyvsp[(3) - (6)].rec).typ->type == Ttemplate || !strncmp((yyvsp[(2) - (6)].sym)->name, "__size", 6)) p->info.minOccurs = 0; else p->info.minOccurs = 1; } else { p->info.minOccurs = (yyvsp[(5) - (6)].rec).minOccurs; } p->info.maxOccurs = (yyvsp[(5) - (6)].rec).maxOccurs; if (sp->mask) sp->val <<= 1; else sp->val++; p->info.offset = sp->offset; if ((yyvsp[(3) - (6)].rec).sto & Sextern) p->level = GLOBAL; else if ((yyvsp[(3) - (6)].rec).sto & Stypedef) ; else if (sp->grow) sp->offset += p->info.typ->width; else if (p->info.typ->width > sp->offset) sp->offset = p->info.typ->width; } sp->entry = p; ;} break; case 36: #line 587 "soapcpp2_yacc.y" { if ((yyvsp[(1) - (2)].rec).sto & Stypedef) { sprintf(errbuf, "invalid typedef qualifier for '%s'", (yyvsp[(2) - (2)].sym)->name); semwarn(errbuf); } p = enter(sp->table, (yyvsp[(2) - (2)].sym)); p->info.typ = (yyvsp[(1) - (2)].rec).typ; p->info.sto = (yyvsp[(1) - (2)].rec).sto; p->info.hasval = False; p->info.offset = sp->offset; if (sp->grow) sp->offset += p->info.typ->width; else if (p->info.typ->width > sp->offset) sp->offset = p->info.typ->width; sp->entry = p; ;} break; case 37: #line 605 "soapcpp2_yacc.y" { (yyval.sym) = (yyvsp[(1) - (1)].sym); ;} break; case 38: #line 606 "soapcpp2_yacc.y" { (yyval.sym) = (yyvsp[(1) - (1)].sym); ;} break; case 39: #line 608 "soapcpp2_yacc.y" { (yyval.sym) = (yyvsp[(1) - (1)].sym); ;} break; case 40: #line 609 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator!"); ;} break; case 41: #line 610 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator~"); ;} break; case 42: #line 611 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator="); ;} break; case 43: #line 612 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator+="); ;} break; case 44: #line 613 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator-="); ;} break; case 45: #line 614 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator*="); ;} break; case 46: #line 615 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator/="); ;} break; case 47: #line 616 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator%="); ;} break; case 48: #line 617 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator&="); ;} break; case 49: #line 618 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator^="); ;} break; case 50: #line 619 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator|="); ;} break; case 51: #line 620 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator<<="); ;} break; case 52: #line 621 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator>>="); ;} break; case 53: #line 622 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator||"); ;} break; case 54: #line 623 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator&&"); ;} break; case 55: #line 624 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator|"); ;} break; case 56: #line 625 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator^"); ;} break; case 57: #line 626 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator&"); ;} break; case 58: #line 627 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator=="); ;} break; case 59: #line 628 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator!="); ;} break; case 60: #line 629 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator<"); ;} break; case 61: #line 630 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator<="); ;} break; case 62: #line 631 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator>"); ;} break; case 63: #line 632 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator>="); ;} break; case 64: #line 633 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator<<"); ;} break; case 65: #line 634 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator>>"); ;} break; case 66: #line 635 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator+"); ;} break; case 67: #line 636 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator-"); ;} break; case 68: #line 637 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator*"); ;} break; case 69: #line 638 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator/"); ;} break; case 70: #line 639 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator%"); ;} break; case 71: #line 640 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator++"); ;} break; case 72: #line 641 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator--"); ;} break; case 73: #line 642 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator->"); ;} break; case 74: #line 643 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator[]"); ;} break; case 75: #line 644 "soapcpp2_yacc.y" { (yyval.sym) = lookup("operator()"); ;} break; case 76: #line 645 "soapcpp2_yacc.y" { s1 = c_storage((yyvsp[(2) - (2)].rec).sto); s2 = c_type((yyvsp[(2) - (2)].rec).typ); s = (char*)emalloc(strlen(s1) + strlen(s2) + 10); strcpy(s, "operator "); strcat(s, s1); strcat(s, s2); (yyval.sym) = lookup(s); if (!(yyval.sym)) (yyval.sym) = install(s, ID); ;} break; case 77: #line 657 "soapcpp2_yacc.y" { if (!(p = entry(classtable, (yyvsp[(1) - (1)].sym)))) semerror("invalid constructor"); sp->entry = enter(sp->table, (yyvsp[(1) - (1)].sym)); sp->entry->info.typ = mknone(); sp->entry->info.sto = Snone; sp->entry->info.offset = sp->offset; sp->node.typ = mkvoid(); sp->node.sto = Snone; ;} break; case 78: #line 669 "soapcpp2_yacc.y" { if (!(p = entry(classtable, (yyvsp[(3) - (3)].sym)))) semerror("invalid destructor"); s = (char*)emalloc(strlen((yyvsp[(3) - (3)].sym)->name) + 2); s2 = strrchr((yyvsp[(3) - (3)].sym)->name, ':'); if (s2 && *(s2+1) && (s2 == (yyvsp[(3) - (3)].sym)->name || *(s2-1) != ':')) { strncpy(s, (yyvsp[(3) - (3)].sym)->name, s2 - (yyvsp[(3) - (3)].sym)->name + 1); strcat(s, "~"); strcat(s, s2 + 1); } else { strcpy(s, "~"); strcat(s, (yyvsp[(3) - (3)].sym)->name); } sym = lookup(s); if (!sym) sym = install(s, ID); sp->entry = enter(sp->table, sym); sp->entry->info.typ = mknone(); sp->entry->info.sto = (yyvsp[(1) - (3)].sto); sp->entry->info.offset = sp->offset; sp->node.typ = mkvoid(); sp->node.sto = Snone; ;} break; case 79: #line 697 "soapcpp2_yacc.y" { if ((yyvsp[(1) - (7)].e)->level == GLOBAL) { if (!((yyvsp[(1) - (7)].e)->info.sto & Sextern) && sp->entry && sp->entry->info.typ->type == Tpointer && ((Tnode*)sp->entry->info.typ->ref)->type == Tchar) { sprintf(errbuf, "last output parameter of service operation function prototype '%s' is a pointer to a char which will only return one byte: use char** instead to return a string", (yyvsp[(1) - (7)].e)->sym->name); semwarn(errbuf); } if ((yyvsp[(1) - (7)].e)->info.sto & Sextern) { (yyvsp[(1) - (7)].e)->info.typ = mkmethod((yyvsp[(1) - (7)].e)->info.typ, sp->table); } else if (sp->entry && (sp->entry->info.typ->type == Tpointer || sp->entry->info.typ->type == Treference || sp->entry->info.typ->type == Tarray || is_transient(sp->entry->info.typ))) { if ((yyvsp[(1) - (7)].e)->info.typ->type == Tint) { sp->entry->info.sto = (Storage)((int)sp->entry->info.sto | (int)Sreturn); (yyvsp[(1) - (7)].e)->info.typ = mkfun(sp->entry); (yyvsp[(1) - (7)].e)->info.typ->id = (yyvsp[(1) - (7)].e)->sym; if (!is_transient(sp->entry->info.typ)) { if (!is_response(sp->entry->info.typ)) { if (!is_XML(sp->entry->info.typ)) add_response((yyvsp[(1) - (7)].e), sp->entry); } else { add_result(sp->entry->info.typ); } } add_request((yyvsp[(1) - (7)].e)->sym, sp); } else { sprintf(errbuf, "return type of service operation function prototype '%s' must be integer", (yyvsp[(1) - (7)].e)->sym->name); semerror(errbuf); } } else { sprintf(errbuf, "last output parameter of service operation function prototype '%s' is a return parameter and must be a pointer or reference, or use %s(..., void) for one-way sends", (yyvsp[(1) - (7)].e)->sym->name, (yyvsp[(1) - (7)].e)->sym->name); semerror(errbuf); } } else if ((yyvsp[(1) - (7)].e)->level == INTERNAL) { (yyvsp[(1) - (7)].e)->info.typ = mkmethod((yyvsp[(1) - (7)].e)->info.typ, sp->table); (yyvsp[(1) - (7)].e)->info.sto = (Storage)((int)(yyvsp[(1) - (7)].e)->info.sto | (int)(yyvsp[(6) - (7)].sto) | (int)(yyvsp[(7) - (7)].sto)); transient &= ~1; } exitscope(); ;} break; case 80: #line 757 "soapcpp2_yacc.y" { (yyval.e) = sp->entry; ;} break; case 81: #line 759 "soapcpp2_yacc.y" { ;} break; case 82: #line 760 "soapcpp2_yacc.y" { ;} break; case 83: #line 762 "soapcpp2_yacc.y" { ;} break; case 84: #line 763 "soapcpp2_yacc.y" { ;} break; case 85: #line 764 "soapcpp2_yacc.y" { sprintf(errbuf, "undefined '%s'", (yyvsp[(2) - (2)].sym)->name); synerror(errbuf); ;} break; case 86: #line 768 "soapcpp2_yacc.y" { synerror("formal argument expected"); yyerrok; ;} break; case 87: #line 774 "soapcpp2_yacc.y" { if ((yyvsp[(4) - (6)].rec).sto & Stypedef) semwarn("typedef in function argument"); p = enter(sp->table, (yyvsp[(3) - (6)].sym)); p->info.typ = (yyvsp[(4) - (6)].rec).typ; p->info.sto = (yyvsp[(4) - (6)].rec).sto; if ((yyvsp[(5) - (6)].rec).minOccurs < 0) { if ((yyvsp[(6) - (6)].rec).hasval || ((yyvsp[(4) - (6)].rec).sto & Sattribute) || (yyvsp[(4) - (6)].rec).typ->type == Tpointer) p->info.minOccurs = 0; else p->info.minOccurs = 1; } else { p->info.minOccurs = (yyvsp[(5) - (6)].rec).minOccurs; } p->info.maxOccurs = (yyvsp[(5) - (6)].rec).maxOccurs; if ((yyvsp[(6) - (6)].rec).hasval) { p->info.hasval = True; switch ((yyvsp[(4) - (6)].rec).typ->type) { case Tchar: case Tuchar: case Tshort: case Tushort: case Tint: case Tuint: case Tlong: case Tulong: case Tenum: case Tenumsc: case Ttime: if ((yyvsp[(6) - (6)].rec).typ->type == Tint || (yyvsp[(6) - (6)].rec).typ->type == Tchar || (yyvsp[(6) - (6)].rec).typ->type == Tenum || (yyvsp[(6) - (6)].rec).typ->type == Tenumsc) { sp->val = p->info.val.i = (yyvsp[(6) - (6)].rec).val.i; if (((yyvsp[(4) - (6)].rec).typ->hasmin && (yyvsp[(4) - (6)].rec).typ->min > (double)(yyvsp[(6) - (6)].rec).val.i) || ((yyvsp[(4) - (6)].rec).typ->hasmin && !(yyvsp[(4) - (6)].rec).typ->incmin && (yyvsp[(4) - (6)].rec).typ->min == (double)(yyvsp[(6) - (6)].rec).val.i) || ((yyvsp[(4) - (6)].rec).typ->hasmax && (yyvsp[(4) - (6)].rec).typ->max < (double)(yyvsp[(6) - (6)].rec).val.i) || ((yyvsp[(4) - (6)].rec).typ->hasmax && !(yyvsp[(4) - (6)].rec).typ->incmax && (yyvsp[(4) - (6)].rec).typ->max == (double)(yyvsp[(6) - (6)].rec).val.i)) semerror("initialization constant outside value range"); } else { semerror("type error in initialization constant"); p->info.hasval = False; } break; case Tfloat: case Tdouble: case Tldouble: if ((yyvsp[(6) - (6)].rec).typ->type == Tfloat || (yyvsp[(6) - (6)].rec).typ->type == Tdouble || (yyvsp[(6) - (6)].rec).typ->type == Tldouble) { p->info.val.r = (yyvsp[(6) - (6)].rec).val.r; if (((yyvsp[(4) - (6)].rec).typ->hasmin && (yyvsp[(4) - (6)].rec).typ->min > (yyvsp[(6) - (6)].rec).val.r) || ((yyvsp[(4) - (6)].rec).typ->hasmin && !(yyvsp[(4) - (6)].rec).typ->incmin && (yyvsp[(4) - (6)].rec).typ->min == (yyvsp[(6) - (6)].rec).val.r) || ((yyvsp[(4) - (6)].rec).typ->hasmax && (yyvsp[(4) - (6)].rec).typ->max < (yyvsp[(6) - (6)].rec).val.r) || ((yyvsp[(4) - (6)].rec).typ->hasmax && !(yyvsp[(4) - (6)].rec).typ->incmax && (yyvsp[(4) - (6)].rec).typ->max == (yyvsp[(6) - (6)].rec).val.r)) semerror("initialization constant outside value range"); } else if ((yyvsp[(6) - (6)].rec).typ->type == Tint) { p->info.val.r = (double)(yyvsp[(6) - (6)].rec).val.i; if (((yyvsp[(4) - (6)].rec).typ->hasmin && (yyvsp[(4) - (6)].rec).typ->min > (double)(yyvsp[(6) - (6)].rec).val.i) || ((yyvsp[(4) - (6)].rec).typ->hasmin && !(yyvsp[(4) - (6)].rec).typ->incmin && (yyvsp[(4) - (6)].rec).typ->min == (double)(yyvsp[(6) - (6)].rec).val.i) || ((yyvsp[(4) - (6)].rec).typ->hasmax && (yyvsp[(4) - (6)].rec).typ->max < (double)(yyvsp[(6) - (6)].rec).val.i) || ((yyvsp[(4) - (6)].rec).typ->hasmax && !(yyvsp[(4) - (6)].rec).typ->incmax && (yyvsp[(4) - (6)].rec).typ->max == (double)(yyvsp[(6) - (6)].rec).val.i)) semerror("initialization constant outside value range"); } else { semerror("type error in initialization constant"); p->info.hasval = False; } break; default: if ((yyvsp[(4) - (6)].rec).typ->type == Tpointer && (((Tnode*)(yyvsp[(4) - (6)].rec).typ->ref)->type == Tchar || ((Tnode*)(yyvsp[(4) - (6)].rec).typ->ref)->type == Twchar) && (yyvsp[(6) - (6)].rec).typ->type == Tpointer && ((Tnode*)(yyvsp[(6) - (6)].rec).typ->ref)->type == Tchar) { p->info.val.s = (yyvsp[(6) - (6)].rec).val.s; } else if (((yyvsp[(4) - (6)].rec).typ->type == Tpointer || is_smart((yyvsp[(4) - (6)].rec).typ)) && (((Tnode*)(yyvsp[(4) - (6)].rec).typ->ref)->id == lookup("std::string") || ((Tnode*)(yyvsp[(4) - (6)].rec).typ->ref)->id == lookup("std::wstring"))) { p->info.val.s = (yyvsp[(6) - (6)].rec).val.s; } else if ((yyvsp[(4) - (6)].rec).typ->id == lookup("std::string") || (yyvsp[(4) - (6)].rec).typ->id == lookup("std::wstring")) { p->info.val.s = (yyvsp[(6) - (6)].rec).val.s; } else if ((yyvsp[(4) - (6)].rec).typ->type == Tpointer && (yyvsp[(6) - (6)].rec).typ->type == Tint && (yyvsp[(6) - (6)].rec).val.i == 0) { p->info.val.i = 0; } else { semerror("type error in initialization constant"); p->info.hasval = False; } break; } } p->info.offset = sp->offset; if ((yyvsp[(4) - (6)].rec).sto & Sextern) p->level = GLOBAL; else if (sp->grow) sp->offset += p->info.typ->width; else if (p->info.typ->width > sp->offset) sp->offset = p->info.typ->width; sp->entry = p; ;} break; case 88: #line 901 "soapcpp2_yacc.y" { if (sp->table->level != PARAM) (yyval.sym) = gensymidx("param", (int)++sp->val); else if (eflag) (yyval.sym) = gensymidx("_param", (int)++sp->val); else (yyval.sym) = gensym("_param"); ;} break; case 89: #line 909 "soapcpp2_yacc.y" { if (soap_version == 2 && *(yyvsp[(1) - (1)].sym)->name == '_' && sp->table->level == GLOBAL) { sprintf(errbuf, "SOAP 1.2 does not support anonymous parameters '%s'", (yyvsp[(1) - (1)].sym)->name); semwarn(errbuf); } (yyval.sym) = (yyvsp[(1) - (1)].sym); ;} break; case 90: #line 927 "soapcpp2_yacc.y" { (yyval.rec) = (yyvsp[(1) - (1)].rec); ;} break; case 91: #line 929 "soapcpp2_yacc.y" { (yyval.rec).typ = mkmethod(tmp.typ, sp->table); transient &= ~1; exitscope(); ;} break; case 92: #line 936 "soapcpp2_yacc.y" { (yyval.rec) = (yyvsp[(3) - (3)].rec); ;} break; case 93: #line 938 "soapcpp2_yacc.y" { (yyval.rec) = (yyvsp[(4) - (4)].rec); ;} break; case 94: #line 940 "soapcpp2_yacc.y" { (yyval.rec).typ = mkint(); (yyval.rec).sto = Snone; sp->node = (yyval.rec); ;} break; case 95: #line 945 "soapcpp2_yacc.y" { (yyval.rec).typ = (yyvsp[(2) - (2)].rec).typ; (yyval.rec).sto = (Storage)((int)(yyvsp[(1) - (2)].sto) | (int)(yyvsp[(2) - (2)].rec).sto); if (((yyval.rec).sto & Sattribute)) { if (is_smart((yyvsp[(2) - (2)].rec).typ)) { if (!is_primitive_or_string((yyvsp[(2) - (2)].rec).typ->ref) && !is_stdstr((yyvsp[(2) - (2)].rec).typ->ref) && !is_binary((yyvsp[(2) - (2)].rec).typ->ref) && !is_external((yyvsp[(2) - (2)].rec).typ->ref)) { semwarn("invalid attribute smart pointer @type"); (yyval.rec).sto = (Storage)((int)(yyval.rec).sto & ~Sattribute); } } else if ((yyvsp[(2) - (2)].rec).typ->type == Tpointer) { if (!is_primitive_or_string((yyvsp[(2) - (2)].rec).typ->ref) && !is_stdstr((yyvsp[(2) - (2)].rec).typ->ref) && !is_binary((yyvsp[(2) - (2)].rec).typ->ref) && !is_external((yyvsp[(2) - (2)].rec).typ->ref)) { semwarn("invalid attribute pointer @type"); (yyval.rec).sto = (Storage)((int)(yyval.rec).sto & ~Sattribute); } } else if ( !is_primitive_or_string((yyvsp[(2) - (2)].rec).typ) && !is_stdstr((yyvsp[(2) - (2)].rec).typ) && !is_binary((yyvsp[(2) - (2)].rec).typ) && !is_external((yyvsp[(2) - (2)].rec).typ)) { semwarn("invalid attribute @type"); (yyval.rec).sto = (Storage)((int)(yyval.rec).sto & ~Sattribute); } } sp->node = (yyval.rec); if ((yyvsp[(1) - (2)].sto) & Sextern) transient = 0; ;} break; case 96: #line 986 "soapcpp2_yacc.y" { if ((yyvsp[(1) - (2)].typ)->type == Tint) switch ((yyvsp[(2) - (2)].rec).typ->type) { case Tchar: (yyval.rec).typ = (yyvsp[(2) - (2)].rec).typ; break; case Tshort: (yyval.rec).typ = (yyvsp[(2) - (2)].rec).typ; break; case Tint: (yyval.rec).typ = (yyvsp[(1) - (2)].typ); break; case Tlong: (yyval.rec).typ = (yyvsp[(2) - (2)].rec).typ; break; case Tllong: (yyval.rec).typ = (yyvsp[(2) - (2)].rec).typ; break; default: semwarn("invalid int type specified"); (yyval.rec).typ = (yyvsp[(2) - (2)].rec).typ; } else if ((yyvsp[(1) - (2)].typ)->type == Tuint) switch ((yyvsp[(2) - (2)].rec).typ->type) { case Tchar: (yyval.rec).typ = mkuchar(); break; case Tshort: (yyval.rec).typ = mkushort(); break; case Tint: (yyval.rec).typ = (yyvsp[(1) - (2)].typ); break; case Tlong: (yyval.rec).typ = mkulong(); break; case Tllong: (yyval.rec).typ = mkullong(); break; default: semwarn("invalid unsigned type specified"); (yyval.rec).typ = (yyvsp[(2) - (2)].rec).typ; } else if ((yyvsp[(1) - (2)].typ)->type == Tlong) switch ((yyvsp[(2) - (2)].rec).typ->type) { case Tint: (yyval.rec).typ = (yyvsp[(1) - (2)].typ); break; case Tlong: (yyval.rec).typ = mkllong(); break; case Tuint: (yyval.rec).typ = mkulong(); break; case Tulong: (yyval.rec).typ = mkullong(); break; case Tdouble: (yyval.rec).typ = mkldouble(); break; default: semwarn("invalid use of 'long'"); (yyval.rec).typ = (yyvsp[(2) - (2)].rec).typ; } else if ((yyvsp[(1) - (2)].typ)->type == Tulong) switch ((yyvsp[(2) - (2)].rec).typ->type) { case Tint: (yyval.rec).typ = (yyvsp[(1) - (2)].typ); break; case Tlong: (yyval.rec).typ = mkullong(); break; case Tuint: (yyval.rec).typ = (yyvsp[(1) - (2)].typ); break; case Tulong: (yyval.rec).typ = mkullong(); break; default: semwarn("invalid use of 'long'"); (yyval.rec).typ = (yyvsp[(2) - (2)].rec).typ; } else if ((yyvsp[(2) - (2)].rec).typ->type == Tint) (yyval.rec).typ = (yyvsp[(1) - (2)].typ); else semwarn("invalid type specified (missing ';' or type name used as non-type identifier?)"); (yyval.rec).sto = (yyvsp[(2) - (2)].rec).sto; sp->node = (yyval.rec); ;} break; case 97: #line 1038 "soapcpp2_yacc.y" { (yyval.rec).typ = mkint(); (yyval.rec).sto = (yyvsp[(1) - (1)].sto); sp->node = (yyval.rec); if ((yyvsp[(1) - (1)].sto) & Sextern) transient = 0; ;} break; case 98: #line 1045 "soapcpp2_yacc.y" { (yyval.rec).typ = (yyvsp[(1) - (1)].typ); (yyval.rec).sto = Snone; sp->node = (yyval.rec); ;} break; case 99: #line 1050 "soapcpp2_yacc.y" { (yyval.rec).typ = (yyvsp[(2) - (2)].rec).typ; (yyval.rec).sto = (Storage)((int)(yyvsp[(1) - (2)].sto) | (int)(yyvsp[(2) - (2)].rec).sto); if (((yyval.rec).sto & Sattribute)) { if (is_smart((yyvsp[(2) - (2)].rec).typ)) { if (!is_primitive_or_string((yyvsp[(2) - (2)].rec).typ->ref) && !is_stdstr((yyvsp[(2) - (2)].rec).typ->ref) && !is_binary((yyvsp[(2) - (2)].rec).typ->ref) && !is_external((yyvsp[(2) - (2)].rec).typ->ref)) { semwarn("invalid attribute smart pointer @type"); (yyval.rec).sto = (Storage)((int)(yyval.rec).sto & ~Sattribute); } } else if ((yyvsp[(2) - (2)].rec).typ->type == Tpointer) { if (!is_primitive_or_string((yyvsp[(2) - (2)].rec).typ->ref) && !is_stdstr((yyvsp[(2) - (2)].rec).typ->ref) && !is_binary((yyvsp[(2) - (2)].rec).typ->ref) && !is_external((yyvsp[(2) - (2)].rec).typ->ref)) { semwarn("invalid attribute pointer @type"); (yyval.rec).sto = (Storage)((int)(yyval.rec).sto & ~Sattribute); } } else if ( !is_primitive_or_string((yyvsp[(2) - (2)].rec).typ) && !is_stdstr((yyvsp[(2) - (2)].rec).typ) && !is_binary((yyvsp[(2) - (2)].rec).typ) && !is_external((yyvsp[(2) - (2)].rec).typ)) { semwarn("invalid attribute @type"); (yyval.rec).sto = (Storage)((int)(yyval.rec).sto & ~Sattribute); } } sp->node = (yyval.rec); if ((yyvsp[(1) - (2)].sto) & Sextern) transient = 0; ;} break; case 100: #line 1091 "soapcpp2_yacc.y" { if ((yyvsp[(1) - (2)].typ)->type == Tint) switch ((yyvsp[(2) - (2)].rec).typ->type) { case Tchar: (yyval.rec).typ = (yyvsp[(2) - (2)].rec).typ; break; case Tshort: (yyval.rec).typ = (yyvsp[(2) - (2)].rec).typ; break; case Tint: (yyval.rec).typ = (yyvsp[(1) - (2)].typ); break; case Tlong: (yyval.rec).typ = (yyvsp[(2) - (2)].rec).typ; break; case Tllong: (yyval.rec).typ = (yyvsp[(2) - (2)].rec).typ; break; default: semwarn("invalid int type specified"); (yyval.rec).typ = (yyvsp[(2) - (2)].rec).typ; } else if ((yyvsp[(1) - (2)].typ)->type == Tuint) switch ((yyvsp[(2) - (2)].rec).typ->type) { case Tchar: (yyval.rec).typ = mkuchar(); break; case Tshort: (yyval.rec).typ = mkushort(); break; case Tint: (yyval.rec).typ = (yyvsp[(1) - (2)].typ); break; case Tlong: (yyval.rec).typ = mkulong(); break; case Tllong: (yyval.rec).typ = mkullong(); break; default: semwarn("invalid unsigned type specified"); (yyval.rec).typ = (yyvsp[(2) - (2)].rec).typ; } else if ((yyvsp[(1) - (2)].typ)->type == Tlong) switch ((yyvsp[(2) - (2)].rec).typ->type) { case Tint: (yyval.rec).typ = (yyvsp[(1) - (2)].typ); break; case Tlong: (yyval.rec).typ = mkllong(); break; case Tuint: (yyval.rec).typ = mkulong(); break; case Tulong: (yyval.rec).typ = mkullong(); break; case Tdouble: (yyval.rec).typ = mkldouble(); break; default: semwarn("invalid use of 'long'"); (yyval.rec).typ = (yyvsp[(2) - (2)].rec).typ; } else if ((yyvsp[(1) - (2)].typ)->type == Tulong) switch ((yyvsp[(2) - (2)].rec).typ->type) { case Tint: (yyval.rec).typ = (yyvsp[(1) - (2)].typ); break; case Tlong: (yyval.rec).typ = mkullong(); break; case Tuint: (yyval.rec).typ = (yyvsp[(1) - (2)].typ); break; case Tulong: (yyval.rec).typ = mkullong(); break; default: semwarn("invalid use of 'long'"); (yyval.rec).typ = (yyvsp[(2) - (2)].rec).typ; } else if ((yyvsp[(2) - (2)].rec).typ->type == Tint) (yyval.rec).typ = (yyvsp[(1) - (2)].typ); else semwarn("invalid type specified (missing ';' or type name used as non-type identifier?)"); (yyval.rec).sto = (yyvsp[(2) - (2)].rec).sto; sp->node = (yyval.rec); ;} break; case 101: #line 1143 "soapcpp2_yacc.y" { (yyval.typ) = mkvoid(); ;} break; case 102: #line 1144 "soapcpp2_yacc.y" { (yyval.typ) = mkbool(); ;} break; case 103: #line 1145 "soapcpp2_yacc.y" { (yyval.typ) = mkchar(); ;} break; case 104: #line 1146 "soapcpp2_yacc.y" { (yyval.typ) = mkwchart(); ;} break; case 105: #line 1147 "soapcpp2_yacc.y" { (yyval.typ) = mkshort(); ;} break; case 106: #line 1148 "soapcpp2_yacc.y" { (yyval.typ) = mkint(); ;} break; case 107: #line 1149 "soapcpp2_yacc.y" { (yyval.typ) = mklong(); ;} break; case 108: #line 1150 "soapcpp2_yacc.y" { (yyval.typ) = mkllong(); ;} break; case 109: #line 1151 "soapcpp2_yacc.y" { (yyval.typ) = mkullong(); ;} break; case 110: #line 1152 "soapcpp2_yacc.y" { (yyval.typ) = mksize(); ;} break; case 111: #line 1153 "soapcpp2_yacc.y" { (yyval.typ) = mkfloat(); ;} break; case 112: #line 1154 "soapcpp2_yacc.y" { (yyval.typ) = mkdouble(); ;} break; case 113: #line 1155 "soapcpp2_yacc.y" { (yyval.typ) = mkint(); ;} break; case 114: #line 1156 "soapcpp2_yacc.y" { (yyval.typ) = mkuint(); ;} break; case 115: #line 1157 "soapcpp2_yacc.y" { (yyval.typ) = mkuchar(); ;} break; case 116: #line 1158 "soapcpp2_yacc.y" { (yyval.typ) = mkushort(); ;} break; case 117: #line 1159 "soapcpp2_yacc.y" { (yyval.typ) = mkuint(); ;} break; case 118: #line 1160 "soapcpp2_yacc.y" { (yyval.typ) = mkulong(); ;} break; case 119: #line 1161 "soapcpp2_yacc.y" { (yyval.typ) = mktimet(); ;} break; case 120: #line 1163 "soapcpp2_yacc.y" { if (!(p = entry(templatetable, (yyvsp[(7) - (7)].sym)))) { p = enter(templatetable, (yyvsp[(7) - (7)].sym)); p->info.typ = mktemplate(NULL, (yyvsp[(7) - (7)].sym)); (yyvsp[(7) - (7)].sym)->token = TYPE; } (yyval.typ) = p->info.typ; ;} break; case 121: #line 1173 "soapcpp2_yacc.y" { sym = gensym("_Struct"); sprintf(errbuf, "anonymous class will be named '%s'", sym->name); semwarn(errbuf); if ((p = entry(classtable, sym))) { if (p->info.typ->ref || p->info.typ->type != Tclass) { sprintf(errbuf, "class '%s' already declared at %s:%d", sym->name, p->filename, p->lineno); semerror(errbuf); } } else { p = enter(classtable, sym); p->info.typ = mkclass(NULL, 0); } sym->token = TYPE; sp->table->sym = sym; p->info.typ->ref = sp->table; p->info.typ->width = sp->offset; p->info.typ->id = sym; (yyval.typ) = p->info.typ; exitscope(); ;} break; case 122: #line 1199 "soapcpp2_yacc.y" { if ((p = entry(classtable, (yyvsp[(1) - (5)].e)->sym)) && p->info.typ->ref) { if (is_mutable(p)) { if (merge((Table*)p->info.typ->ref, sp->table)) { sprintf(errbuf, "member name clash in class '%s' declared at line %d", (yyvsp[(1) - (5)].e)->sym->name, p->lineno); semerror(errbuf); } p->info.typ->width += sp->offset; } } else { p = reenter(classtable, (yyvsp[(1) - (5)].e)->sym); sp->table->sym = p->sym; p->info.typ->ref = sp->table; p->info.typ->width = sp->offset; p->info.typ->id = p->sym; if (p->info.typ->base) sp->table->prev = (Table*)entry(classtable, p->info.typ->base)->info.typ->ref; } (yyval.typ) = p->info.typ; exitscope(); ;} break; case 123: #line 1226 "soapcpp2_yacc.y" { p = reenter(classtable, (yyvsp[(1) - (7)].e)->sym); sp->table->sym = p->sym; if (!(yyvsp[(3) - (7)].e)) { semerror("invalid base class"); } else { sp->table->prev = (Table*)(yyvsp[(3) - (7)].e)->info.typ->ref; if (!sp->table->prev && !(yyvsp[(3) - (7)].e)->info.typ->transient) { sprintf(errbuf, "class '%s' has incomplete type (if this class is not serializable then declare 'extern class %s)'", (yyvsp[(3) - (7)].e)->sym->name, (yyvsp[(3) - (7)].e)->sym->name); semerror(errbuf); } p->info.typ->base = (yyvsp[(3) - (7)].e)->info.typ->id; } p->info.typ->ref = sp->table; p->info.typ->width = sp->offset; p->info.typ->id = p->sym; (yyval.typ) = p->info.typ; exitscope(); ;} break; case 124: #line 1249 "soapcpp2_yacc.y" { (yyvsp[(1) - (1)].e)->info.typ->id = (yyvsp[(1) - (1)].e)->sym; (yyval.typ) = (yyvsp[(1) - (1)].e)->info.typ; ;} break; case 125: #line 1254 "soapcpp2_yacc.y" { if (!(yyvsp[(3) - (3)].e)) { semerror("invalid base class"); } else { if (!(yyvsp[(3) - (3)].e)->info.typ->ref && !(yyvsp[(3) - (3)].e)->info.typ->transient) { sprintf(errbuf, "class '%s' has incomplete type (if this class is not serializable then declare 'extern class %s)'", (yyvsp[(3) - (3)].e)->sym->name, (yyvsp[(3) - (3)].e)->sym->name); semerror(errbuf); } (yyvsp[(1) - (3)].e)->info.typ->base = (yyvsp[(3) - (3)].e)->info.typ->id; } (yyvsp[(1) - (3)].e)->info.typ->id = (yyvsp[(1) - (3)].e)->sym; (yyval.typ) = (yyvsp[(1) - (3)].e)->info.typ; ;} break; case 126: #line 1272 "soapcpp2_yacc.y" { sym = gensym("_Struct"); sprintf(errbuf, "anonymous struct will be named '%s'", sym->name); semwarn(errbuf); if ((p = entry(classtable, sym))) { if (p->info.typ->ref || p->info.typ->type != Tstruct) { sprintf(errbuf, "struct '%s' already declared at %s:%d", sym->name, p->filename, p->lineno); semerror(errbuf); } else { p->info.typ->ref = sp->table; p->info.typ->width = sp->offset; } } else { p = enter(classtable, sym); p->info.typ = mkstruct(sp->table, sp->offset); } p->info.typ->id = sym; (yyval.typ) = p->info.typ; exitscope(); ;} break; case 127: #line 1299 "soapcpp2_yacc.y" { if ((p = entry(classtable, (yyvsp[(1) - (5)].e)->sym)) && p->info.typ->ref) { if (is_mutable(p)) { if (merge((Table*)p->info.typ->ref, sp->table)) { sprintf(errbuf, "member name clash in struct '%s' declared at line %d", (yyvsp[(1) - (5)].e)->sym->name, p->lineno); semerror(errbuf); } p->info.typ->width += sp->offset; } } else { p = reenter(classtable, (yyvsp[(1) - (5)].e)->sym); p->info.typ->ref = sp->table; p->info.typ->width = sp->offset; p->info.typ->id = p->sym; } (yyval.typ) = p->info.typ; exitscope(); ;} break; case 128: #line 1322 "soapcpp2_yacc.y" { if ((p = entry(classtable, (yyvsp[(2) - (2)].sym)))) { if (p->info.typ->type == Tstruct) { (yyval.typ) = p->info.typ; } else { sprintf(errbuf, "'struct %s' redeclaration (line %d)", (yyvsp[(2) - (2)].sym)->name, p->lineno); semerror(errbuf); (yyval.typ) = mkint(); } } else { p = enter(classtable, (yyvsp[(2) - (2)].sym)); (yyval.typ) = p->info.typ = mkstruct(NULL, 0); p->info.typ->id = (yyvsp[(2) - (2)].sym); } ;} break; case 129: #line 1344 "soapcpp2_yacc.y" { sym = gensym("_Union"); sprintf(errbuf, "anonymous union will be named '%s'", sym->name); semwarn(errbuf); if ((p = entry(classtable, sym))) { if (p->info.typ->ref) { sprintf(errbuf, "union or struct '%s' already declared at %s:%d", sym->name, p->filename, p->lineno); semerror(errbuf); } else { p->info.typ->ref = sp->table; p->info.typ->width = sp->offset; } } else { p = enter(classtable, sym); p->info.typ = mkunion(sp->table, sp->offset); } p->info.typ->id = sym; (yyval.typ) = p->info.typ; exitscope(); ;} break; case 130: #line 1371 "soapcpp2_yacc.y" { if ((p = entry(classtable, (yyvsp[(2) - (6)].sym)))) { if (p->info.typ->ref || p->info.typ->type != Tunion) { sprintf(errbuf, "union '%s' already declared at %s:%d", (yyvsp[(2) - (6)].sym)->name, p->filename, p->lineno); semerror(errbuf); } else { p = reenter(classtable, (yyvsp[(2) - (6)].sym)); p->info.typ->ref = sp->table; p->info.typ->width = sp->offset; } } else { p = enter(classtable, (yyvsp[(2) - (6)].sym)); p->info.typ = mkunion(sp->table, sp->offset); } p->info.typ->id = (yyvsp[(2) - (6)].sym); (yyval.typ) = p->info.typ; exitscope(); ;} break; case 131: #line 1395 "soapcpp2_yacc.y" { if ((p = entry(classtable, (yyvsp[(2) - (2)].sym)))) { if (p->info.typ->type == Tunion) { (yyval.typ) = p->info.typ; } else { sprintf(errbuf, "'union %s' redeclaration (line %d)", (yyvsp[(2) - (2)].sym)->name, p->lineno); semerror(errbuf); (yyval.typ) = mkint(); } } else { p = enter(classtable, (yyvsp[(2) - (2)].sym)); (yyval.typ) = p->info.typ = mkunion(NULL, 0); p->info.typ->id = (yyvsp[(2) - (2)].sym); } ;} break; case 132: #line 1417 "soapcpp2_yacc.y" { sym = gensym("_Enum"); sprintf(errbuf, "anonymous enum will be named '%s'", sym->name); semwarn(errbuf); if ((p = entry(enumtable, sym))) { if (p->info.typ->ref) { sprintf(errbuf, "enum '%s' already declared at %s:%d", sym->name, p->filename, p->lineno); semerror(errbuf); } else { p->info.typ->ref = sp->table; p->info.typ->width = 4; /* 4 = enum */ } } else { p = enter(enumtable, sym); p->info.typ = mkenum(sp->table); } p->info.typ->id = sym; (yyval.typ) = p->info.typ; exitscope(); ;} break; case 133: #line 1444 "soapcpp2_yacc.y" { sym = gensym("_Enum"); sprintf(errbuf, "anonymous enum will be named '%s'", sym->name); semwarn(errbuf); if ((p = entry(enumtable, sym))) { if (p->info.typ->ref) { sprintf(errbuf, "enum '%s' already declared at %s:%d", sym->name, p->filename, p->lineno); semerror(errbuf); } else { p->info.typ->ref = sp->table; p->info.typ->width = 9; /* 9 = mask */ } } else { p = enter(enumtable, sym); p->info.typ = mkmask(sp->table); } p->info.typ->id = sym; (yyval.typ) = p->info.typ; exitscope(); ;} break; case 134: #line 1471 "soapcpp2_yacc.y" { if ((p = entry(enumtable, (yyvsp[(1) - (6)].e)->sym))) if (!p->info.typ->ref) p->info.typ->ref = sp->table; p->info.typ->id = (yyvsp[(1) - (6)].e)->sym; (yyval.typ) = p->info.typ; exitscope(); ;} break; case 135: #line 1480 "soapcpp2_yacc.y" { if ((p = entry(enumtable, (yyvsp[(1) - (6)].e)->sym))) if (!p->info.typ->ref) p->info.typ->ref = sp->table; p->info.typ->id = (yyvsp[(1) - (6)].e)->sym; (yyval.typ) = p->info.typ; exitscope(); ;} break; case 136: #line 1489 "soapcpp2_yacc.y" { if ((p = entry(enumtable, (yyvsp[(1) - (6)].e)->sym))) { if (!p->info.typ->ref) { p->info.typ->ref = sp->table; p->info.typ->width = 9; /* 9 = mask */ } } p->info.typ->id = (yyvsp[(1) - (6)].e)->sym; (yyval.typ) = p->info.typ; exitscope(); ;} break; case 137: #line 1503 "soapcpp2_yacc.y" { if ((p = entry(enumtable, (yyvsp[(1) - (6)].e)->sym))) { if (!p->info.typ->ref) { p->info.typ->ref = sp->table; p->info.typ->width = 9; /* 9 = mask */ } } p->info.typ->id = (yyvsp[(1) - (6)].e)->sym; (yyval.typ) = p->info.typ; exitscope(); ;} break; case 138: #line 1516 "soapcpp2_yacc.y" { if ((p = entry(enumtable, (yyvsp[(2) - (2)].sym)))) { if (p->info.typ->type != Tenum) { sprintf(errbuf, "'enum %s' used where enum class is expected", (yyvsp[(2) - (2)].sym)->name); semwarn(errbuf); } (yyval.typ) = p->info.typ; } else { p = enter(enumtable, (yyvsp[(2) - (2)].sym)); (yyval.typ) = p->info.typ = mkenum(NULL); p->info.typ->id = (yyvsp[(2) - (2)].sym); } ;} break; case 139: #line 1533 "soapcpp2_yacc.y" { if ((p = entry(enumtable, (yyvsp[(2) - (2)].sym)))) { if (p->info.typ->type != Tenumsc) { sprintf(errbuf, "'enum class %s' used where enum is expected", (yyvsp[(2) - (2)].sym)->name); semwarn(errbuf); } (yyval.typ) = p->info.typ; } else { p = enter(enumtable, (yyvsp[(2) - (2)].sym)); (yyval.typ) = p->info.typ = mkenumsc(NULL); p->info.typ->id = (yyvsp[(2) - (2)].sym); (yyvsp[(2) - (2)].sym)->token = TYPE; } ;} break; case 140: #line 1551 "soapcpp2_yacc.y" { if ((p = entry(typetable, (yyvsp[(1) - (1)].sym)))) { (yyval.typ) = p->info.typ; } else if ((p = entry(classtable, (yyvsp[(1) - (1)].sym)))) { (yyval.typ) = p->info.typ; } else if ((p = entry(enumtable, (yyvsp[(1) - (1)].sym)))) { (yyval.typ) = p->info.typ; } else if ((yyvsp[(1) - (1)].sym) == lookup("std::string") || (yyvsp[(1) - (1)].sym) == lookup("std::wstring")) { p = enter(classtable, (yyvsp[(1) - (1)].sym)); (yyval.typ) = p->info.typ = mkclass(NULL, 8); p->info.typ->id = (yyvsp[(1) - (1)].sym); if (cflag) p->info.typ->transient = 1; /* make std::string transient in C */ else p->info.typ->transient = -2; /* otherwise volatile in C++ */ } else { sprintf(errbuf, "unknown type '%s'", (yyvsp[(1) - (1)].sym)->name); semerror(errbuf); (yyval.typ) = mkint(); } ;} break; case 141: #line 1582 "soapcpp2_yacc.y" { if ((p = entry(templatetable, (yyvsp[(1) - (4)].sym)))) { (yyval.typ) = mktemplate((yyvsp[(3) - (4)].rec).typ, (yyvsp[(1) - (4)].sym)); if (p->info.typ->transient) (yyval.typ)->transient = p->info.typ->transient; } else if ((yyvsp[(1) - (4)].sym) == lookup("std::deque")) { semwarn("To use std::deque, please also add #import \"import/stldeque.h\""); (yyval.typ) = mktemplate((yyvsp[(3) - (4)].rec).typ, (yyvsp[(1) - (4)].sym)); } else if ((yyvsp[(1) - (4)].sym) == lookup("std::list")) { semwarn("To use std::list, please also add #import \"import/stllist.h\""); (yyval.typ) = mktemplate((yyvsp[(3) - (4)].rec).typ, (yyvsp[(1) - (4)].sym)); } else if ((yyvsp[(1) - (4)].sym) == lookup("std::vector")) { semwarn("To use std::vector, please also add #import \"import/stlvector.h\""); (yyval.typ) = mktemplate((yyvsp[(3) - (4)].rec).typ, (yyvsp[(1) - (4)].sym)); } else if ((yyvsp[(1) - (4)].sym) == lookup("std::set")) { semwarn("To use std::set, please also add #import \"import/stlset.h\""); (yyval.typ) = mktemplate((yyvsp[(3) - (4)].rec).typ, (yyvsp[(1) - (4)].sym)); } else if ((yyvsp[(1) - (4)].sym) == lookup("std::queue")) { (yyval.typ) = mktemplate((yyvsp[(3) - (4)].rec).typ, (yyvsp[(1) - (4)].sym)); (yyval.typ)->transient = 1; /* not serializable */ } else if ((yyvsp[(1) - (4)].sym) == lookup("std::stack")) { (yyval.typ) = mktemplate((yyvsp[(3) - (4)].rec).typ, (yyvsp[(1) - (4)].sym)); (yyval.typ)->transient = 1; /* not serializable */ } else if ((yyvsp[(1) - (4)].sym) == lookup("std::shared_ptr") || (yyvsp[(1) - (4)].sym) == lookup("std::unique_ptr") || (yyvsp[(1) - (4)].sym) == lookup("std::auto_ptr")) { (yyval.typ) = mktemplate((yyvsp[(3) - (4)].rec).typ, (yyvsp[(1) - (4)].sym)); (yyval.typ)->transient = -2; /* volatile indicates smart pointer template */ } else if ((yyvsp[(1) - (4)].sym) == lookup("std::weak_ptr") || (yyvsp[(1) - (4)].sym) == lookup("std::function")) { (yyval.typ) = mktemplate((yyvsp[(3) - (4)].rec).typ, (yyvsp[(1) - (4)].sym)); (yyval.typ)->transient = 1; /* not serializable */ } else { semerror("undefined template"); (yyval.typ) = mkint(); } ;} break; case 142: #line 1639 "soapcpp2_yacc.y" { sprintf(errbuf, "undeclared '%s'", (yyvsp[(2) - (3)].sym)->name); synerror(errbuf); (yyval.typ) = mkint(); ;} break; case 143: #line 1644 "soapcpp2_yacc.y" { sprintf(errbuf, "perhaps trying to use a template with an undefined type parameter '%s'?", (yyvsp[(2) - (3)].sym)->name); synerror(errbuf); (yyval.typ) = mkint(); ;} break; case 144: #line 1649 "soapcpp2_yacc.y" { synerror("perhaps trying to use an undefined template or template with a non-type template parameter? Declare 'template class name'"); (yyval.typ) = mkint(); ;} break; case 145: #line 1654 "soapcpp2_yacc.y" { synerror("malformed class definition (use spacing around ':' to separate derived : base)"); yyerrok; (yyval.typ) = mkint(); ;} break; case 146: #line 1660 "soapcpp2_yacc.y" { synerror("malformed struct definition"); yyerrok; (yyval.typ) = mkint(); ;} break; case 147: #line 1666 "soapcpp2_yacc.y" { synerror("malformed union definition"); yyerrok; (yyval.typ) = mkint(); ;} break; case 148: #line 1672 "soapcpp2_yacc.y" { synerror("malformed enum definition"); yyerrok; (yyval.typ) = mkint(); ;} break; case 149: #line 1678 "soapcpp2_yacc.y" { if ((p = entry(classtable, (yyvsp[(2) - (2)].sym)))) { if (p->info.typ->ref) { if (!is_mutable(p)) { sprintf(errbuf, "struct '%s' already declared at %s:%d", (yyvsp[(2) - (2)].sym)->name, p->filename, p->lineno); semerror(errbuf); } } else { p = reenter(classtable, (yyvsp[(2) - (2)].sym)); } p->info.typ->transient = transient; } else { p = enter(classtable, (yyvsp[(2) - (2)].sym)); p->info.typ = mkstruct(NULL, 0); } (yyval.e) = p; ;} break; case 150: #line 1703 "soapcpp2_yacc.y" { if ((p = entry(classtable, (yyvsp[(2) - (2)].sym)))) { if (p->info.typ->ref) { if (!is_mutable(p)) { sprintf(errbuf, "class '%s' already declared at %s:%d (redundant 'class' specifier here?)", (yyvsp[(2) - (2)].sym)->name, p->filename, p->lineno); semerror(errbuf); } } else { p = reenter(classtable, (yyvsp[(2) - (2)].sym)); } p->info.typ->transient = transient; } else { p = enter(classtable, (yyvsp[(2) - (2)].sym)); p->info.typ = mkclass(NULL, 0); p->info.typ->id = p->sym; } (yyvsp[(2) - (2)].sym)->token = TYPE; (yyval.e) = p; ;} break; case 151: #line 1730 "soapcpp2_yacc.y" { if ((p = entry(enumtable, (yyvsp[(2) - (3)].sym)))) { if (p->info.typ->ref) { sprintf(errbuf, "enum '%s' already declared at %s:%d", (yyvsp[(2) - (3)].sym)->name, p->filename, p->lineno); semerror(errbuf); } } else { p = enter(enumtable, (yyvsp[(2) - (3)].sym)); p->info.typ = mkenum(0); } p->info.typ->width = (int)(yyvsp[(3) - (3)].i); (yyval.e) = p; ;} break; case 152: #line 1748 "soapcpp2_yacc.y" { if ((p = entry(enumtable, (yyvsp[(2) - (3)].sym)))) { if (p->info.typ->ref) { sprintf(errbuf, "enum '%s' already declared at %s:%d", (yyvsp[(2) - (3)].sym)->name, p->filename, p->lineno); semerror(errbuf); } } else { p = enter(enumtable, (yyvsp[(2) - (3)].sym)); p->info.typ = mkenumsc(0); } p->info.typ->width = (int)(yyvsp[(3) - (3)].i); (yyvsp[(2) - (3)].sym)->token = TYPE; (yyval.e) = p; ;} break; case 153: #line 1768 "soapcpp2_yacc.y" { if ((p = entry(enumtable, (yyvsp[(3) - (4)].sym)))) { if (p->info.typ->ref) { sprintf(errbuf, "enum '%s' already declared at %s:%d", (yyvsp[(3) - (4)].sym)->name, p->filename, p->lineno); semerror(errbuf); } else { p->info.typ = mkmask(0); } } else { p = enter(enumtable, (yyvsp[(3) - (4)].sym)); p->info.typ = mkmask(0); } (yyval.e) = p; ;} break; case 154: #line 1790 "soapcpp2_yacc.y" { if ((p = entry(enumtable, (yyvsp[(3) - (4)].sym)))) { if (p->info.typ->ref) { sprintf(errbuf, "enum '%s' already declared at %s:%d", (yyvsp[(3) - (4)].sym)->name, p->filename, p->lineno); semerror(errbuf); } else { p->info.typ = mkmasksc(0); } } else { p = enter(enumtable, (yyvsp[(3) - (4)].sym)); p->info.typ = mkmasksc(0); } (yyvsp[(3) - (4)].sym)->token = TYPE; (yyval.e) = p; ;} break; case 155: #line 1812 "soapcpp2_yacc.y" { (yyval.sym) = (yyvsp[(2) - (2)].sym); if (!c11flag) semwarn("To use scoped enumerations (enum class) you must also use soapcpp2 option -c++11"); ;} break; case 156: #line 1817 "soapcpp2_yacc.y" { (yyval.sym) = (yyvsp[(2) - (2)].sym); if (!c11flag) semwarn("To use scoped enumerations (enum class) you must also use soapcpp2 option -c++11"); ;} break; case 157: #line 1823 "soapcpp2_yacc.y" { (yyval.i) = 1; ;} break; case 158: #line 1824 "soapcpp2_yacc.y" { (yyval.i) = 4; ;} break; case 159: #line 1825 "soapcpp2_yacc.y" { (yyval.i) = 2; ;} break; case 160: #line 1826 "soapcpp2_yacc.y" { (yyval.i) = 4; ;} break; case 161: #line 1827 "soapcpp2_yacc.y" { (yyval.i) = 4; ;} break; case 162: #line 1828 "soapcpp2_yacc.y" { (yyval.i) = 8; ;} break; case 163: #line 1829 "soapcpp2_yacc.y" { (yyval.i) = 4; p = entry(typetable, (yyvsp[(2) - (2)].sym)); if (!p) p = entry(enumtable, (yyvsp[(2) - (2)].sym)); if (!p) semerror("enum underlying type must be one of int8_t, int16_t, int32_t, int64_t"); else (yyval.i) = p->info.typ->width; ;} break; case 164: #line 1839 "soapcpp2_yacc.y" { semerror("enum underlying type must be one of int8_t, int16_t, int32_t, int64_t"); (yyval.i) = 4; ;} break; case 165: #line 1843 "soapcpp2_yacc.y" { (yyval.i) = 4; /* 4 = enum */ ;} break; case 166: #line 1845 "soapcpp2_yacc.y" { ;} break; case 167: #line 1846 "soapcpp2_yacc.y" { ;} break; case 168: #line 1848 "soapcpp2_yacc.y" { (yyval.e) = (yyvsp[(2) - (2)].e); ;} break; case 169: #line 1849 "soapcpp2_yacc.y" { (yyval.e) = (yyvsp[(2) - (2)].e); ;} break; case 170: #line 1850 "soapcpp2_yacc.y" { (yyval.e) = (yyvsp[(2) - (2)].e); ;} break; case 171: #line 1851 "soapcpp2_yacc.y" { (yyval.e) = entry(classtable, (yyvsp[(1) - (1)].sym)); if (!(yyval.e)) { p = entry(typetable, (yyvsp[(1) - (1)].sym)); if (p && (p->info.typ->type == Tclass || p->info.typ->type == Tstruct)) (yyval.e) = p; } ;} break; case 172: #line 1860 "soapcpp2_yacc.y" { (yyval.e) = entry(classtable, (yyvsp[(2) - (2)].sym)); ;} break; case 173: #line 1862 "soapcpp2_yacc.y" { if (transient <= -2) transient = 0; permission = 0; enterscope(mktable(NULL), 0); sp->entry = NULL; ;} break; case 174: #line 1870 "soapcpp2_yacc.y" { if (transient <= -2) transient = 0; permission = 0; enterscope(mktable(NULL), 0); sp->entry = NULL; sp->grow = False; ;} break; case 175: #line 1879 "soapcpp2_yacc.y" { enterscope(mktable(NULL), 0); sp->entry = NULL; sp->mask = True; sp->val = 1; ;} break; case 176: #line 1886 "soapcpp2_yacc.y" { ;} break; case 177: #line 1887 "soapcpp2_yacc.y" { ;} break; case 178: #line 1889 "soapcpp2_yacc.y" { if (sp->table->level == INTERNAL) transient |= 1; permission = 0; enterscope(mktable(NULL), 0); sp->entry = NULL; sp->table->level = PARAM; ;} break; case 179: #line 1898 "soapcpp2_yacc.y" { (yyval.sto) = Sauto; ;} break; case 180: #line 1899 "soapcpp2_yacc.y" { (yyval.sto) = Sregister; ;} break; case 181: #line 1900 "soapcpp2_yacc.y" { (yyval.sto) = Sstatic; ;} break; case 182: #line 1901 "soapcpp2_yacc.y" { (yyval.sto) = Sexplicit; ;} break; case 183: #line 1902 "soapcpp2_yacc.y" { (yyval.sto) = Sextern; transient = 1; ;} break; case 184: #line 1903 "soapcpp2_yacc.y" { (yyval.sto) = Stypedef; ;} break; case 185: #line 1904 "soapcpp2_yacc.y" { (yyval.sto) = Svirtual; ;} break; case 186: #line 1905 "soapcpp2_yacc.y" { (yyval.sto) = Sconst; ;} break; case 187: #line 1906 "soapcpp2_yacc.y" { (yyval.sto) = Sfinal; ;} break; case 188: #line 1907 "soapcpp2_yacc.y" { (yyval.sto) = Soverride; ;} break; case 189: #line 1908 "soapcpp2_yacc.y" { (yyval.sto) = Sfriend; ;} break; case 190: #line 1909 "soapcpp2_yacc.y" { (yyval.sto) = Sinline; ;} break; case 191: #line 1910 "soapcpp2_yacc.y" { (yyval.sto) = SmustUnderstand; ;} break; case 192: #line 1911 "soapcpp2_yacc.y" { (yyval.sto) = Sreturn; ;} break; case 193: #line 1912 "soapcpp2_yacc.y" { (yyval.sto) = Sattribute; if (eflag) semwarn("SOAP RPC encoding does not support XML attributes"); ;} break; case 194: #line 1917 "soapcpp2_yacc.y" { (yyval.sto) = Sspecial; ;} break; case 195: #line 1918 "soapcpp2_yacc.y" { (yyval.sto) = Sextern; transient = -2; ;} break; case 196: #line 1919 "soapcpp2_yacc.y" { (yyval.sto) = Smutable; transient = -4; ;} break; case 197: #line 1921 "soapcpp2_yacc.y" { (yyval.sto) = Snone; ;} break; case 198: #line 1922 "soapcpp2_yacc.y" { (yyval.sto) |= Sconstobj; ;} break; case 199: #line 1923 "soapcpp2_yacc.y" { (yyval.sto) |= Sfinal; ;} break; case 200: #line 1924 "soapcpp2_yacc.y" { (yyval.sto) |= Soverride; ;} break; case 201: #line 1926 "soapcpp2_yacc.y" { (yyval.sto) = Snone; ;} break; case 202: #line 1927 "soapcpp2_yacc.y" { (yyval.sto) = Sabstract; ;} break; case 203: #line 1929 "soapcpp2_yacc.y" { (yyval.sto) = Snone; ;} break; case 204: #line 1930 "soapcpp2_yacc.y" { (yyval.sto) = Svirtual; ;} break; case 205: #line 1932 "soapcpp2_yacc.y" { (yyval.rec) = tmp = sp->node; ;} break; case 206: #line 1933 "soapcpp2_yacc.y" { /* handle const pointers, such as const char* */ if ((tmp.sto & Sconst)) tmp.sto = (Storage)(((int)tmp.sto & ~Sconst) | Sconstptr); tmp.typ = mkpointer(tmp.typ); tmp.typ->transient = transient; (yyval.rec) = tmp; ;} break; case 207: #line 1941 "soapcpp2_yacc.y" { tmp.typ = mkreference(tmp.typ); tmp.typ->transient = transient; (yyval.rec) = tmp; ;} break; case 208: #line 1946 "soapcpp2_yacc.y" { tmp.typ = mkrvalueref(tmp.typ); tmp.typ->transient = transient; (yyval.rec) = tmp; ;} break; case 209: #line 1952 "soapcpp2_yacc.y" { (yyval.rec) = tmp; ;} break; case 210: #line 1954 "soapcpp2_yacc.y" { if (!bflag && (yyvsp[(4) - (4)].rec).typ->type == Tchar) { sprintf(errbuf, "char[" SOAP_LONG_FORMAT "] will be serialized as an array of " SOAP_LONG_FORMAT " bytes: use soapcpp2 option -b to enable char[] string serialization or use char* for strings", (yyvsp[(2) - (4)].rec).val.i, (yyvsp[(2) - (4)].rec).val.i); semwarn(errbuf); } if ((yyvsp[(2) - (4)].rec).hasval && (yyvsp[(2) - (4)].rec).typ->type == Tint && (yyvsp[(2) - (4)].rec).val.i > 0 && (yyvsp[(4) - (4)].rec).typ->width > 0) { (yyval.rec).typ = mkarray((yyvsp[(4) - (4)].rec).typ, (int) (yyvsp[(2) - (4)].rec).val.i * (yyvsp[(4) - (4)].rec).typ->width); } else { (yyval.rec).typ = mkarray((yyvsp[(4) - (4)].rec).typ, 0); semerror("undetermined array size"); } (yyval.rec).sto = (yyvsp[(4) - (4)].rec).sto; ;} break; case 211: #line 1971 "soapcpp2_yacc.y" { (yyval.rec).typ = mkpointer((yyvsp[(3) - (3)].rec).typ); /* zero size array = pointer */ (yyval.rec).sto = (yyvsp[(3) - (3)].rec).sto; ;} break; case 212: #line 1976 "soapcpp2_yacc.y" { if ((yyvsp[(1) - (1)].rec).typ->type == Tstruct || (yyvsp[(1) - (1)].rec).typ->type == Tclass) { if (!(yyvsp[(1) - (1)].rec).typ->ref && !(yyvsp[(1) - (1)].rec).typ->transient && !((yyvsp[(1) - (1)].rec).sto & Stypedef)) { if ((yyvsp[(1) - (1)].rec).typ->type == Tstruct) sprintf(errbuf, "struct '%s' has incomplete type (if this struct is not serializable then declare 'extern struct %s)", (yyvsp[(1) - (1)].rec).typ->id->name, (yyvsp[(1) - (1)].rec).typ->id->name); else sprintf(errbuf, "class '%s' has incomplete type (if this class is not serializable then declare 'extern class %s)", (yyvsp[(1) - (1)].rec).typ->id->name, (yyvsp[(1) - (1)].rec).typ->id->name); semerror(errbuf); } } (yyval.rec) = (yyvsp[(1) - (1)].rec); ;} break; case 213: #line 1991 "soapcpp2_yacc.y" { (yyval.rec) = (yyvsp[(1) - (1)].rec); ;} break; case 214: #line 1992 "soapcpp2_yacc.y" { if ((yyvsp[(2) - (3)].rec).hasval) { (yyval.rec).typ = (yyvsp[(2) - (3)].rec).typ; (yyval.rec).hasval = True; (yyval.rec).val = (yyvsp[(2) - (3)].rec).val; } else { (yyval.rec).hasval = False; semerror("initialization expression not constant"); } ;} break; case 215: #line 2006 "soapcpp2_yacc.y" { (yyval.rec).hasval = False; ;} break; case 216: #line 2007 "soapcpp2_yacc.y" { if ((yyvsp[(2) - (2)].rec).hasval) { (yyval.rec).typ = (yyvsp[(2) - (2)].rec).typ; (yyval.rec).hasval = True; (yyval.rec).val = (yyvsp[(2) - (2)].rec).val; } else { (yyval.rec).hasval = False; semerror("initialization expression not constant"); } ;} break; case 217: #line 2021 "soapcpp2_yacc.y" { (yyval.s) = NULL; ;} break; case 218: #line 2022 "soapcpp2_yacc.y" { (yyval.s) = (yyvsp[(1) - (1)].s); ;} break; case 219: #line 2024 "soapcpp2_yacc.y" { (yyval.rec).minOccurs = -1; (yyval.rec).maxOccurs = 1; (yyval.rec).hasmin = False; (yyval.rec).hasmax = False; (yyval.rec).min = 0.0; (yyval.rec).max = 0.0; (yyval.rec).incmin = True; (yyval.rec).incmax = True; (yyval.rec).pattern = NULL; ;} break; case 220: #line 2035 "soapcpp2_yacc.y" { (yyval.rec).minOccurs = (yyvsp[(1) - (1)].i); (yyval.rec).maxOccurs = 1; if ((yyval.rec).minOccurs < 0) (yyval.rec).minOccurs = -1; (yyval.rec).hasmin = False; (yyval.rec).hasmax = False; (yyval.rec).min = 0.0; (yyval.rec).max = 0.0; (yyval.rec).incmin = True; (yyval.rec).incmax = True; (yyval.rec).pattern = NULL; ;} break; case 221: #line 2048 "soapcpp2_yacc.y" { (yyval.rec).minOccurs = (yyvsp[(1) - (2)].i); (yyval.rec).maxOccurs = 1; if ((yyval.rec).minOccurs < 0) (yyval.rec).minOccurs = -1; (yyval.rec).hasmin = False; (yyval.rec).hasmax = False; (yyval.rec).min = 0.0; (yyval.rec).max = 0.0; (yyval.rec).incmin = True; (yyval.rec).incmax = True; (yyval.rec).pattern = NULL; ;} break; case 222: #line 2061 "soapcpp2_yacc.y" { (yyval.rec).minOccurs = (yyvsp[(1) - (3)].i); (yyval.rec).maxOccurs = (yyvsp[(3) - (3)].i); if ((yyval.rec).minOccurs < 0 || (yyval.rec).maxOccurs < 0) { (yyval.rec).minOccurs = -1; (yyval.rec).maxOccurs = 1; } else if ((yyval.rec).minOccurs > (yyval.rec).maxOccurs) { (yyval.rec).minOccurs = -1; (yyval.rec).maxOccurs = 1; } (yyval.rec).hasmin = False; (yyval.rec).hasmax = False; (yyval.rec).min = 0.0; (yyval.rec).max = 0.0; (yyval.rec).incmin = True; (yyval.rec).incmax = True; (yyval.rec).pattern = NULL; ;} break; case 223: #line 2082 "soapcpp2_yacc.y" { (yyval.rec).minOccurs = -1; (yyval.rec).maxOccurs = (yyvsp[(2) - (2)].i); if ((yyval.rec).maxOccurs < 0) { (yyval.rec).minOccurs = -1; (yyval.rec).maxOccurs = 1; } (yyval.rec).hasmin = False; (yyval.rec).hasmax = False; (yyval.rec).min = 0.0; (yyval.rec).max = 0.0; (yyval.rec).incmin = True; (yyval.rec).incmax = True; (yyval.rec).pattern = NULL; ;} break; case 224: #line 2099 "soapcpp2_yacc.y" { (yyval.rec).hasmin = False; (yyval.rec).hasmax = False; (yyval.rec).minOccurs = -1; (yyval.rec).maxOccurs = 1; (yyval.rec).min = 0.0; (yyval.rec).max = 0.0; (yyval.rec).incmin = True; (yyval.rec).incmax = True; (yyval.rec).pattern = (yyvsp[(1) - (1)].s); ;} break; case 225: #line 2111 "soapcpp2_yacc.y" { (yyval.rec).hasmin = True; (yyval.rec).hasmax = False; (yyval.rec).incmin = (yyvsp[(3) - (3)].rec).incmin; (yyval.rec).incmax = (yyvsp[(3) - (3)].rec).incmax; (yyval.rec).minOccurs = (LONG64)(yyvsp[(2) - (3)].r); (yyval.rec).maxOccurs = 1; if ((yyval.rec).minOccurs < 0) (yyval.rec).minOccurs = -1; (yyval.rec).min = (yyvsp[(2) - (3)].r); (yyval.rec).max = 0.0; (yyval.rec).pattern = (yyvsp[(1) - (3)].s); ;} break; case 226: #line 2125 "soapcpp2_yacc.y" { (yyval.rec).hasmin = True; (yyval.rec).hasmax = True; (yyval.rec).incmin = (yyvsp[(3) - (4)].rec).incmin; (yyval.rec).incmax = (yyvsp[(3) - (4)].rec).incmax; (yyval.rec).minOccurs = (LONG64)(yyvsp[(2) - (4)].r); (yyval.rec).maxOccurs = (LONG64)(yyvsp[(4) - (4)].r); if ((yyval.rec).minOccurs < 0 || (yyval.rec).maxOccurs < 0) { (yyval.rec).minOccurs = -1; (yyval.rec).maxOccurs = 1; } else if ((yyval.rec).minOccurs > (yyval.rec).maxOccurs) { (yyval.rec).minOccurs = -1; (yyval.rec).maxOccurs = 1; } (yyval.rec).min = (yyvsp[(2) - (4)].r); (yyval.rec).max = (yyvsp[(4) - (4)].r); (yyval.rec).pattern = (yyvsp[(1) - (4)].s); ;} break; case 227: #line 2146 "soapcpp2_yacc.y" { (yyval.rec).hasmin = False; (yyval.rec).hasmax = True; (yyval.rec).incmin = (yyvsp[(2) - (3)].rec).incmin; (yyval.rec).incmax = (yyvsp[(2) - (3)].rec).incmax; (yyval.rec).minOccurs = -1; (yyval.rec).maxOccurs = (LONG64)(yyvsp[(3) - (3)].r); if ((yyval.rec).maxOccurs < 0) { (yyval.rec).minOccurs = -1; (yyval.rec).maxOccurs = 1; } (yyval.rec).min = 0.0; (yyval.rec).max = (yyvsp[(3) - (3)].r); (yyval.rec).pattern = (yyvsp[(1) - (3)].s); ;} break; case 228: #line 2163 "soapcpp2_yacc.y" { (yyval.s) = NULL; ;} break; case 229: #line 2164 "soapcpp2_yacc.y" { (yyval.s) = (yyvsp[(1) - (1)].s); ;} break; case 230: #line 2166 "soapcpp2_yacc.y" { (yyval.r) = (yyvsp[(1) - (1)].r); ;} break; case 231: #line 2167 "soapcpp2_yacc.y" { (yyval.r) = (double)(yyvsp[(1) - (1)].i); ;} break; case 232: #line 2168 "soapcpp2_yacc.y" { (yyval.r) = (double)(yyvsp[(1) - (1)].c); ;} break; case 233: #line 2169 "soapcpp2_yacc.y" { (yyval.r) = +(yyvsp[(2) - (2)].r); ;} break; case 234: #line 2170 "soapcpp2_yacc.y" { (yyval.r) = -(yyvsp[(2) - (2)].r); ;} break; case 235: #line 2172 "soapcpp2_yacc.y" { (yyval.rec).incmin = (yyval.rec).incmax = True; ;} break; case 236: #line 2173 "soapcpp2_yacc.y" { (yyval.rec).incmin = (yyval.rec).incmax = True; ;} break; case 237: #line 2174 "soapcpp2_yacc.y" { (yyval.rec).incmin = False; (yyval.rec).incmax = True; ;} break; case 238: #line 2175 "soapcpp2_yacc.y" { (yyval.rec).incmin = False; (yyval.rec).incmax = True; ;} break; case 239: #line 2177 "soapcpp2_yacc.y" { (yyval.rec).incmin = (yyval.rec).incmax = True; ;} break; case 240: #line 2178 "soapcpp2_yacc.y" { (yyval.rec).incmin = False; (yyval.rec).incmax = True; ;} break; case 241: #line 2179 "soapcpp2_yacc.y" { (yyval.rec).incmin = True; (yyval.rec).incmax = False; ;} break; case 242: #line 2180 "soapcpp2_yacc.y" { (yyval.rec).incmin = False; (yyval.rec).incmax = False; ;} break; case 243: #line 2181 "soapcpp2_yacc.y" { (yyval.rec).incmin = False; (yyval.rec).incmax = False; ;} break; case 244: #line 2183 "soapcpp2_yacc.y" { (yyval.rec).incmin = (yyval.rec).incmax = True; ;} break; case 245: #line 2184 "soapcpp2_yacc.y" { (yyval.rec).incmin = True; (yyval.rec).incmax = False; ;} break; case 246: #line 2185 "soapcpp2_yacc.y" { (yyval.rec).incmin = True; (yyval.rec).incmax = False; ;} break; case 247: #line 2194 "soapcpp2_yacc.y" { (yyval.rec) = (yyvsp[(3) - (3)].rec); ;} break; case 248: #line 2195 "soapcpp2_yacc.y" { (yyval.rec) = (yyvsp[(1) - (1)].rec); ;} break; case 249: #line 2199 "soapcpp2_yacc.y" { (yyval.rec).typ = (yyvsp[(3) - (5)].rec).typ; (yyval.rec).sto = Snone; (yyval.rec).hasval = False; ;} break; case 251: #line 2207 "soapcpp2_yacc.y" { (yyval.rec) = (yyvsp[(1) - (1)].rec); ;} break; case 252: #line 2210 "soapcpp2_yacc.y" { (yyval.rec).hasval = False; (yyval.rec).typ = mkint(); ;} break; case 253: #line 2214 "soapcpp2_yacc.y" { (yyval.rec) = (yyvsp[(1) - (1)].rec); ;} break; case 254: #line 2216 "soapcpp2_yacc.y" { (yyval.rec) = (yyvsp[(1) - (1)].rec); ;} break; case 255: #line 2219 "soapcpp2_yacc.y" { (yyval.rec).hasval = False; (yyval.rec).typ = mkint(); ;} break; case 256: #line 2222 "soapcpp2_yacc.y" { (yyval.rec) = (yyvsp[(1) - (1)].rec); ;} break; case 257: #line 2224 "soapcpp2_yacc.y" { (yyval.rec) = (yyvsp[(1) - (1)].rec); ;} break; case 258: #line 2227 "soapcpp2_yacc.y" { (yyval.rec) = iop("|", (yyvsp[(1) - (3)].rec), (yyvsp[(3) - (3)].rec)); ;} break; case 259: #line 2228 "soapcpp2_yacc.y" { (yyval.rec) = iop("^", (yyvsp[(1) - (3)].rec), (yyvsp[(3) - (3)].rec)); ;} break; case 260: #line 2229 "soapcpp2_yacc.y" { (yyval.rec) = iop("&", (yyvsp[(1) - (3)].rec), (yyvsp[(3) - (3)].rec)); ;} break; case 261: #line 2230 "soapcpp2_yacc.y" { (yyval.rec) = relop("==", (yyvsp[(1) - (3)].rec), (yyvsp[(3) - (3)].rec)); ;} break; case 262: #line 2231 "soapcpp2_yacc.y" { (yyval.rec) = relop("!=", (yyvsp[(1) - (3)].rec), (yyvsp[(3) - (3)].rec)); ;} break; case 263: #line 2232 "soapcpp2_yacc.y" { (yyval.rec) = relop("<", (yyvsp[(1) - (3)].rec), (yyvsp[(3) - (3)].rec)); ;} break; case 264: #line 2233 "soapcpp2_yacc.y" { (yyval.rec) = relop("<=", (yyvsp[(1) - (3)].rec), (yyvsp[(3) - (3)].rec)); ;} break; case 265: #line 2234 "soapcpp2_yacc.y" { (yyval.rec) = relop(">", (yyvsp[(1) - (3)].rec), (yyvsp[(3) - (3)].rec)); ;} break; case 266: #line 2235 "soapcpp2_yacc.y" { (yyval.rec) = relop(">=", (yyvsp[(1) - (3)].rec), (yyvsp[(3) - (3)].rec)); ;} break; case 267: #line 2236 "soapcpp2_yacc.y" { (yyval.rec) = iop("<<", (yyvsp[(1) - (3)].rec), (yyvsp[(3) - (3)].rec)); ;} break; case 268: #line 2237 "soapcpp2_yacc.y" { (yyval.rec) = iop(">>", (yyvsp[(1) - (3)].rec), (yyvsp[(3) - (3)].rec)); ;} break; case 269: #line 2238 "soapcpp2_yacc.y" { (yyval.rec) = op("+", (yyvsp[(1) - (3)].rec), (yyvsp[(3) - (3)].rec)); ;} break; case 270: #line 2239 "soapcpp2_yacc.y" { (yyval.rec) = op("-", (yyvsp[(1) - (3)].rec), (yyvsp[(3) - (3)].rec)); ;} break; case 271: #line 2240 "soapcpp2_yacc.y" { (yyval.rec) = op("*", (yyvsp[(1) - (3)].rec), (yyvsp[(3) - (3)].rec)); ;} break; case 272: #line 2241 "soapcpp2_yacc.y" { (yyval.rec) = op("/", (yyvsp[(1) - (3)].rec), (yyvsp[(3) - (3)].rec)); ;} break; case 273: #line 2242 "soapcpp2_yacc.y" { (yyval.rec) = iop("%", (yyvsp[(1) - (3)].rec), (yyvsp[(3) - (3)].rec)); ;} break; case 274: #line 2243 "soapcpp2_yacc.y" { (yyval.rec) = (yyvsp[(1) - (1)].rec); ;} break; case 275: #line 2246 "soapcpp2_yacc.y" { if ((yyvsp[(2) - (2)].rec).hasval) (yyval.rec).val.i = !(yyvsp[(2) - (2)].rec).val.i; (yyval.rec).typ = (yyvsp[(2) - (2)].rec).typ; (yyval.rec).hasval = (yyvsp[(2) - (2)].rec).hasval; ;} break; case 276: #line 2252 "soapcpp2_yacc.y" { if ((yyvsp[(2) - (2)].rec).hasval) (yyval.rec).val.i = ~(yyvsp[(2) - (2)].rec).val.i; (yyval.rec).typ = (yyvsp[(2) - (2)].rec).typ; (yyval.rec).hasval = (yyvsp[(2) - (2)].rec).hasval; ;} break; case 277: #line 2258 "soapcpp2_yacc.y" { if ((yyvsp[(2) - (2)].rec).hasval) { if (integer((yyvsp[(2) - (2)].rec).typ)) (yyval.rec).val.i = -(yyvsp[(2) - (2)].rec).val.i; else if (real((yyvsp[(2) - (2)].rec).typ)) (yyval.rec).val.r = -(yyvsp[(2) - (2)].rec).val.r; else typerror("string?"); } (yyval.rec).typ = (yyvsp[(2) - (2)].rec).typ; (yyval.rec).hasval = (yyvsp[(2) - (2)].rec).hasval; ;} break; case 278: #line 2271 "soapcpp2_yacc.y" { (yyval.rec) = (yyvsp[(2) - (2)].rec); ;} break; case 279: #line 2272 "soapcpp2_yacc.y" { if ((yyvsp[(2) - (2)].rec).typ->type == Tpointer) (yyval.rec).typ = (Tnode*)(yyvsp[(2) - (2)].rec).typ->ref; else typerror("dereference of non-pointer type"); (yyval.rec).sto = Snone; (yyval.rec).hasval = False; ;} break; case 280: #line 2280 "soapcpp2_yacc.y" { (yyval.rec).typ = mkpointer((yyvsp[(2) - (2)].rec).typ); (yyval.rec).sto = Snone; (yyval.rec).hasval = False; ;} break; case 281: #line 2286 "soapcpp2_yacc.y" { (yyval.rec).hasval = True; (yyval.rec).typ = mkint(); (yyval.rec).val.i = (yyvsp[(3) - (4)].rec).typ->width; ;} break; case 282: #line 2291 "soapcpp2_yacc.y" { (yyval.rec) = (yyvsp[(1) - (1)].rec); ;} break; case 283: #line 2294 "soapcpp2_yacc.y" { (yyval.rec) = (yyvsp[(2) - (3)].rec); ;} break; case 284: #line 2295 "soapcpp2_yacc.y" { if (!(p = enumentry((yyvsp[(1) - (1)].sym)))) p = undefined((yyvsp[(1) - (1)].sym)); else (yyval.rec).hasval = True; (yyval.rec).typ = p->info.typ; (yyval.rec).val = p->info.val; ;} break; case 285: #line 2303 "soapcpp2_yacc.y" { (yyval.rec).typ = mkint(); (yyval.rec).hasval = True; (yyval.rec).val.i = (yyvsp[(1) - (1)].i); ;} break; case 286: #line 2308 "soapcpp2_yacc.y" { (yyval.rec).typ = mkint(); (yyval.rec).hasval = True; (yyval.rec).val.i = 0; ;} break; case 287: #line 2313 "soapcpp2_yacc.y" { (yyval.rec).typ = mkfloat(); (yyval.rec).hasval = True; (yyval.rec).val.r = (yyvsp[(1) - (1)].r); ;} break; case 288: #line 2318 "soapcpp2_yacc.y" { (yyval.rec).typ = mkchar(); (yyval.rec).hasval = True; (yyval.rec).val.i = (yyvsp[(1) - (1)].c); ;} break; case 289: #line 2323 "soapcpp2_yacc.y" { (yyval.rec).typ = mkstring(); (yyval.rec).hasval = True; (yyval.rec).val.s = (yyvsp[(1) - (1)].s); ;} break; case 290: #line 2328 "soapcpp2_yacc.y" { (yyval.rec).typ = mkbool(); (yyval.rec).hasval = True; (yyval.rec).val.i = 0; ;} break; case 291: #line 2333 "soapcpp2_yacc.y" { (yyval.rec).typ = mkbool(); (yyval.rec).hasval = True; (yyval.rec).val.i = 1; ;} break; /* Line 1267 of yacc.c. */ #line 5460 "soapcpp2_yacc.tab.c" default: break; } YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); YYPOPSTACK (yylen); yylen = 0; YY_STACK_PRINT (yyss, yyssp); *++yyvsp = yyval; /* Now `shift' the result of the reduction. Determine what state that goes to, based on the state we popped back to and the rule number reduced by. */ yyn = yyr1[yyn]; yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) yystate = yytable[yystate]; else yystate = yydefgoto[yyn - YYNTOKENS]; goto yynewstate; /*------------------------------------. | yyerrlab -- here on detecting error | `------------------------------------*/ yyerrlab: /* If not already recovering from an error, report this error. */ if (!yyerrstatus) { ++yynerrs; #if ! YYERROR_VERBOSE yyerror (YY_("syntax error")); #else { YYSIZE_T yysize = yysyntax_error (0, yystate, yychar); if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM) { YYSIZE_T yyalloc = 2 * yysize; if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM)) yyalloc = YYSTACK_ALLOC_MAXIMUM; if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); yymsg = (char *) YYSTACK_ALLOC (yyalloc); if (yymsg) yymsg_alloc = yyalloc; else { yymsg = yymsgbuf; yymsg_alloc = sizeof yymsgbuf; } } if (0 < yysize && yysize <= yymsg_alloc) { (void) yysyntax_error (yymsg, yystate, yychar); yyerror (yymsg); } else { yyerror (YY_("syntax error")); if (yysize != 0) goto yyexhaustedlab; } } #endif } if (yyerrstatus == 3) { /* If just tried and failed to reuse look-ahead token after an error, discard it. */ if (yychar <= YYEOF) { /* Return failure if at end of input. */ if (yychar == YYEOF) YYABORT; } else { yydestruct ("Error: discarding", yytoken, &yylval); yychar = YYEMPTY; } } /* Else will try to reuse look-ahead token after shifting the error token. */ goto yyerrlab1; /*---------------------------------------------------. | yyerrorlab -- error raised explicitly by YYERROR. | `---------------------------------------------------*/ yyerrorlab: /* Pacify compilers like GCC when the user code never invokes YYERROR and the label yyerrorlab therefore never appears in user code. */ if (/*CONSTCOND*/ 0) goto yyerrorlab; /* Do not reclaim the symbols of the rule which action triggered this YYERROR. */ YYPOPSTACK (yylen); yylen = 0; YY_STACK_PRINT (yyss, yyssp); yystate = *yyssp; goto yyerrlab1; /*-------------------------------------------------------------. | yyerrlab1 -- common code for both syntax error and YYERROR. | `-------------------------------------------------------------*/ yyerrlab1: yyerrstatus = 3; /* Each real token shifted decrements this. */ for (;;) { yyn = yypact[yystate]; if (yyn != YYPACT_NINF) { yyn += YYTERROR; if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) { yyn = yytable[yyn]; if (0 < yyn) break; } } /* Pop the current state because it cannot handle the error token. */ if (yyssp == yyss) YYABORT; yydestruct ("Error: popping", yystos[yystate], yyvsp); YYPOPSTACK (1); yystate = *yyssp; YY_STACK_PRINT (yyss, yyssp); } if (yyn == YYFINAL) YYACCEPT; *++yyvsp = yylval; /* Shift the error token. */ YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); yystate = yyn; goto yynewstate; /*-------------------------------------. | yyacceptlab -- YYACCEPT comes here. | `-------------------------------------*/ yyacceptlab: yyresult = 0; goto yyreturn; /*-----------------------------------. | yyabortlab -- YYABORT comes here. | `-----------------------------------*/ yyabortlab: yyresult = 1; goto yyreturn; #ifndef yyoverflow /*-------------------------------------------------. | yyexhaustedlab -- memory exhaustion comes here. | `-------------------------------------------------*/ yyexhaustedlab: yyerror (YY_("memory exhausted")); yyresult = 2; /* Fall through. */ #endif yyreturn: if (yychar != YYEOF && yychar != YYEMPTY) yydestruct ("Cleanup: discarding lookahead", yytoken, &yylval); /* Do not reclaim the symbols of the rule which action triggered this YYABORT or YYACCEPT. */ YYPOPSTACK (yylen); YY_STACK_PRINT (yyss, yyssp); while (yyssp != yyss) { yydestruct ("Cleanup: popping", yystos[*yyssp], yyvsp); YYPOPSTACK (1); } #ifndef yyoverflow if (yyss != yyssa) YYSTACK_FREE (yyss); #endif #if YYERROR_VERBOSE if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); #endif /* Make sure YYID is used. */ return YYID (yyresult); } #line 2340 "soapcpp2_yacc.y" /* * ??? */ int yywrap(void) { return 1; } /**************************************\ Support routines \**************************************/ static Node op(const char *op, Node p, Node q) { Node r; Tnode *typ; r.typ = p.typ; r.sto = Snone; if (p.hasval && q.hasval) { if (integer(p.typ) && integer(q.typ)) switch (op[0]) { case '|': r.val.i = p.val.i | q.val.i; break; case '^': r.val.i = p.val.i ^ q.val.i; break; case '&': r.val.i = p.val.i & q.val.i; break; case '<': r.val.i = p.val.i << q.val.i; break; case '>': r.val.i = p.val.i >> q.val.i; break; case '+': r.val.i = p.val.i + q.val.i; break; case '-': r.val.i = p.val.i - q.val.i; break; case '*': r.val.i = p.val.i * q.val.i; break; case '/': r.val.i = p.val.i / q.val.i; break; case '%': r.val.i = p.val.i % q.val.i; break; default: typerror(op); } else if (real(p.typ) && real(q.typ)) switch (op[0]) { case '+': r.val.r = p.val.r + q.val.r; break; case '-': r.val.r = p.val.r - q.val.r; break; case '*': r.val.r = p.val.r * q.val.r; break; case '/': r.val.r = p.val.r / q.val.r; break; default: typerror(op); } else semerror("invalid constant operation"); r.hasval = True; } else { typ = mgtype(p.typ, q.typ); r.hasval = False; } return r; } static Node iop(const char *iop, Node p, Node q) { if (integer(p.typ) && integer(q.typ)) return op(iop, p, q); typerror("integer operands only"); return p; } static Node relop(const char *op, Node p, Node q) { Node r; Tnode *typ; r.typ = mkint(); r.sto = Snone; r.hasval = True; r.val.i = 1; sprintf(errbuf, "comparison '%s' not evaluated and considered true", op); semwarn(errbuf); if (p.typ->type != Tpointer || p.typ != q.typ) typ = mgtype(p.typ, q.typ); return r; } /**************************************\ Scope management \**************************************/ /* mkscope - initialize scope stack with a new table and offset */ static void mkscope(Table *table, int offset) { sp = stack-1; enterscope(table, offset); } /* enterscope - enter a new scope by pushing a new table and offset on the stack */ static void enterscope(Table *table, int offset) { if (++sp == stack+MAXNEST) execerror("maximum scope depth exceeded"); sp->table = table; sp->val = 0; sp->offset = offset; sp->grow = True; /* by default, offset grows */ sp->mask = False; } /* exitscope - exit a scope by popping the table and offset from the stack */ static void exitscope(void) { check(sp-- != stack, "exitscope() has no matching enterscope()"); } /**************************************\ Undefined symbol \**************************************/ static Entry* undefined(Symbol *sym) { Entry *p; sprintf(errbuf, "undefined identifier '%s'", sym->name); semwarn(errbuf); p = enter(sp->table, sym); p->level = GLOBAL; p->info.typ = mkint(); p->info.sto = Sextern; p->info.hasval = False; return p; } /* mgtype - return most general type among two numerical types */ Tnode* mgtype(Tnode *typ1, Tnode *typ2) { if (numeric(typ1) && numeric(typ2)) { if (typ1->type < typ2->type) return typ2; } else { typerror("non-numeric type"); } return typ1; } /**************************************\ Type checks \**************************************/ static int integer(Tnode *typ) { switch (typ->type) { case Tchar: case Tshort: case Tint: case Tlong: return True; default: break; } return False; } static int real(Tnode *typ) { switch (typ->type) { case Tfloat: case Tdouble: case Tldouble: return True; default: break; } return False; } static int numeric(Tnode *typ) { return integer(typ) || real(typ); } static void add_fault(void) { Table *t; Entry *p1, *p2, *p3, *p4; Symbol *s1, *s2, *s3, *s4; imported = NULL; s1 = lookup("SOAP_ENV__Code"); p1 = entry(classtable, s1); if (!p1 || !p1->info.typ->ref) { t = mktable(NULL); if (!p1) { p1 = enter(classtable, s1); p1->info.typ = mkstruct(t, 3*4); p1->info.typ->id = s1; } else { p1->info.typ->ref = t; } p2 = enter(t, lookup("SOAP_ENV__Value")); p2->info.typ = qname; p2->info.minOccurs = 0; p2 = enter(t, lookup("SOAP_ENV__Subcode")); p2->info.typ = mkpointer(p1->info.typ); p2->info.minOccurs = 0; } s2 = lookup("SOAP_ENV__Detail"); p2 = entry(classtable, s2); if (!p2 || !p2->info.typ->ref) { t = mktable(NULL); if (!p2) { p2 = enter(classtable, s2); p2->info.typ = mkstruct(t, 3*4); p2->info.typ->id = s2; } else { p2->info.typ->ref = t; } p3 = enter(t, lookup("__any")); p3->info.typ = xml; p3->info.minOccurs = 0; p3 = enter(t, lookup("__type")); p3->info.typ = mkint(); p3->info.minOccurs = 0; p3 = enter(t, lookup("fault")); p3->info.typ = mkpointer(mkvoid()); p3->info.minOccurs = 0; custom_fault = 0; } s4 = lookup("SOAP_ENV__Reason"); p4 = entry(classtable, s4); if (!p4 || !p4->info.typ->ref) { t = mktable(NULL); if (!p4) { p4 = enter(classtable, s4); p4->info.typ = mkstruct(t, 4); p4->info.typ->id = s4; } else { p4->info.typ->ref = t; } p3 = enter(t, lookup("SOAP_ENV__Text")); p3->info.typ = mkstring(); p3->info.minOccurs = 0; } s3 = lookup("SOAP_ENV__Fault"); p3 = entry(classtable, s3); if (!p3 || !p3->info.typ->ref) { t = mktable(NULL); if (!p3) { p3 = enter(classtable, s3); p3->info.typ = mkstruct(t, 9*4); p3->info.typ->id = s3; } else { p3->info.typ->ref = t; } p3 = enter(t, lookup("faultcode")); p3->info.typ = qname; p3->info.minOccurs = 0; p3 = enter(t, lookup("faultstring")); p3->info.typ = mkstring(); p3->info.minOccurs = 0; p3 = enter(t, lookup("faultactor")); p3->info.typ = mkstring(); p3->info.minOccurs = 0; p3 = enter(t, lookup("detail")); p3->info.typ = mkpointer(p2->info.typ); p3->info.minOccurs = 0; p3 = enter(t, s1); p3->info.typ = mkpointer(p1->info.typ); p3->info.minOccurs = 0; p3 = enter(t, s4); p3->info.typ = mkpointer(p4->info.typ); p3->info.minOccurs = 0; p3 = enter(t, lookup("SOAP_ENV__Node")); p3->info.typ = mkstring(); p3->info.minOccurs = 0; p3 = enter(t, lookup("SOAP_ENV__Role")); p3->info.typ = mkstring(); p3->info.minOccurs = 0; p3 = enter(t, lookup("SOAP_ENV__Detail")); p3->info.typ = mkpointer(p2->info.typ); p3->info.minOccurs = 0; } } static void add_soap(void) { Symbol *s = lookup("soap"); p = enter(classtable, s); p->info.typ = mkstruct(NULL, 0); p->info.typ->transient = -2; p->info.typ->id = s; } static void add_XML(void) { Symbol *s = lookup("_XML"); s->token = TYPE; p = enter(typetable, s); xml = p->info.typ = mksymtype(mkstring(), s); p->info.sto = Stypedef; } static void add_qname(void) { Symbol *s = lookup("_QName"); s->token = TYPE; p = enter(typetable, s); qname = p->info.typ = mksymtype(mkstring(), s); p->info.sto = Stypedef; } static void add_header(void) { Table *t; Entry *p; Symbol *s = lookup("SOAP_ENV__Header"); imported = NULL; p = entry(classtable, s); if (!p || !p->info.typ->ref) { t = mktable(NULL); if (!p) p = enter(classtable, s); p->info.typ = mkstruct(t, 0); p->info.typ->id = s; custom_header = 0; } } static void add_response(Entry *fun, Entry *ret) { Table *t; Entry *p, *q; Symbol *s; size_t i = 0, j, n = strlen(fun->sym->name); char *r = (char*)emalloc(n+100); strcpy(r, fun->sym->name); strcat(r, "Response"); do { for (j = 0; j < i; j++) r[n+j+8] = '_'; r[n+i+8] = '\0'; if (!(s = lookup(r))) s = install(r, ID); i++; } while (entry(classtable, s)); free(r); t = mktable(NULL); q = enter(t, ret->sym); q->info = ret->info; if (q->info.typ->type == Treference) q->info.typ = (Tnode*)q->info.typ->ref; p = enter(classtable, s); p->info.typ = mkstruct(t, 4); p->info.typ->id = s; fun->info.typ->response = p; } static void add_result(Tnode *typ) { Entry *p; if (!typ->ref || !((Tnode*)typ->ref)->ref) { semwarn("response struct/class must be declared before used in function prototype"); return; } for (p = ((Table*)((Tnode*)typ->ref)->ref)->list; p; p = p->next) if (p->info.sto & Sreturn) return; for (p = ((Table*)((Tnode*)typ->ref)->ref)->list; p; p = p->next) { if (p->info.typ->type != Tfun && !(p->info.sto & Sattribute) && !is_transient(p->info.typ) && !(p->info.sto & (Sprivate|Sprotected))) p->info.sto = (Storage)((int)p->info.sto | (int)Sreturn); return; } } static void add_request(Symbol *sym, Scope *sp) { Entry *p; unlinklast(sp->table); if ((p = entry(classtable, sym))) { if (p->info.typ->ref) { sprintf(errbuf, "service operation name clash: struct/class '%s' already declared at %s:%d", sym->name, p->filename, p->lineno); semerror(errbuf); } else { p->info.typ->ref = sp->table; p->info.typ->width = sp->offset; } } else { p = enter(classtable, sym); p->info.typ = mkstruct(sp->table, sp->offset); p->info.typ->id = sym; } if (p->info.typ->ref) { for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next) { if (q->info.typ->type == Treference || q->info.typ->type == Trvalueref) { sprintf(errbuf, "parameter '%s' of service operation function '%s()' in %s:%d cannot be passed by reference: use a pointer instead", q->sym->name, sym->name, q->filename, q->lineno); semwarn(errbuf); } else if ((q->info.sto & (Sconst | Sconstptr))) { if (!is_string(q->info.typ) && !is_wstring(q->info.typ)) { sprintf(errbuf, "parameter '%s' of service operation function '%s()' in %s:%d cannot be declared const", q->sym->name, sym->name, q->filename, q->lineno); semwarn(errbuf); } } else if ((q->info.sto & ~(Sattribute | Sextern | Sspecial))) { sprintf(errbuf, "invalid parameter '%s' of service operation function '%s()' in %s:%d", q->sym->name, sym->name, q->filename, q->lineno); semwarn(errbuf); } } } } gsoap-2.8.28/gsoap/VisualStudio2005/soapcpp2/soapcpp2/error2.h0000644000175000017500000000363312653650160023212 0ustar ellertellert/* error2.h Error handling. gSOAP XML Web services tools Copyright (C) 2000-2008, Robert van Engelen, Genivia Inc. All Rights Reserved. This part of the software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ extern char errbuf[]; #ifdef WIN32_WITHOUT_SOLARIS_FLEX extern void soapcpp2error(const char*); #else extern void yyerror(const char*); #endif extern void lexerror(const char*); extern void synerror(const char *); extern void semerror(const char *); extern void semwarn(const char *); extern void compliancewarn(const char *); extern void typerror(const char*); extern void execerror(const char*); extern void progerror(const char*, const char*, int); extern int errstat(void); gsoap-2.8.28/gsoap/VisualStudio2005/soapcpp2/soapcpp2/soapcpp2.h0000644000175000017500000002615312653650160023530 0ustar ellertellert/* soapcpp2.h Common declarations. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc. All Rights Reserved. This part of the software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include #include #include #include #include #include #include "error2.h" #ifndef VERSION # define VERSION "2.8.28" /* Current version */ # define GSOAP_VERSION 20828 #endif #ifdef WIN32 # pragma warning(disable : 4996) # ifndef WITH_BISON # define WITH_BISON # endif #endif /* #define DEBUG */ /* uncomment to debug */ #ifdef DEBUG # define check(expr, msg) (void)((expr) ? 0 : (progerror(msg, __FILE__, __LINE__), 0)) # define DBGLOG(DBGCMD) { DBGCMD; } #else # define check(expr, msg) (void)(expr) # define DBGLOG(DBGCMD) #endif #ifdef WIN32 # ifdef WITH_BISON # ifdef WIN32_WITHOUT_SOLARIS_FLEX # define yyparse soapcpp2parse # define yylex soapcpp2lex # define yyerror soapcpp2error # define yylval soapcpp2lval # define yychar soapcpp2char # define yydebug soapcpp2debug # define yynerrs soapcpp2nerrs # define yylineno soapcpp2lineno # define yytext soapcpp2text # define yyin soapcpp2in # define yywrap soapcpp2wrap # endif # endif #endif #ifdef WIN32 # define SOAP_PATHCAT "\\" # define SOAP_PATHSEP ";" # define LONG64 __int64 #else # define SOAP_PATHCAT "/" # define SOAP_PATHSEP ":" # define LONG64 long long #endif #ifndef ULONG64 # define ULONG64 unsigned LONG64 #endif #if defined(WIN32) # define SOAP_LONG_FORMAT "%I64d" # define SOAP_ULONG_FORMAT "%I64u" # define SOAP_XLONG_FORMAT "%I64x" #elif defined(TRU64) # define SOAP_LONG_FORMAT "%ld" # define SOAP_ULONG_FORMAT "%lu" # define SOAP_XLONG_FORMAT "%lx" #endif #ifndef SOAP_LONG_FORMAT # define SOAP_LONG_FORMAT "%lld" /* printf format for 64 bit ints */ #endif #ifndef SOAP_ULONG_FORMAT # define SOAP_ULONG_FORMAT "%llu" /* printf format for unsigned 64 bit ints */ #endif #ifndef SOAP_XLONG_FORMAT # define SOAP_XLONG_FORMAT "%llx" /* printf format for unsigned 64 bit hex ints */ #endif extern int yylineno; typedef enum Bool {False, True} Bool; typedef int Token; typedef enum Type { Tnone, Tvoid, Tchar, /* primitive types from here*/ Twchar, Tshort, Tint, Tlong, Tllong, Tfloat, Tdouble, Tldouble, Tuchar, Tushort, Tuint, Tulong, Tullong, Tsize, Ttime, Tenum, Tenumsc, Tclass, /* compound types from here */ Tstruct, Tunion, Tpointer, /* pointer T* */ Treference, /* reference T& */ Trvalueref, /* C+11 rvalue reference T&& */ Tarray, /* fixed size array T[N] */ Ttemplate, /* template class */ Tfun } Type; #define TYPES (Tfun+1) /* number of type (operators) enumerated above */ typedef enum Storage { Snone = 0, Sauto = 0x000001, Sregister = 0x000002, Sstatic = 0x000004, Sextern = 0x000008, Stypedef = 0x000010, Svirtual = 0x000020, Sconst = 0x000040, Sconstobj = 0x000080, Sfinal = 0x000100, Soverride = 0x000200, Sconstptr = 0x000400, Sfriend = 0x000800, Sinline = 0x001000, Sabstract = 0x002000, SmustUnderstand = 0x004000, Sreturn = 0x008000, Sattribute = 0x010000, Sspecial = 0x020000, Sexplicit = 0x040000, Sprivate = 0x080000, Sprotected = 0x100000, Smutable = 0x200000 } Storage; typedef enum Level { INTERNAL, GLOBAL, PARAM, LOCAL } Level; #define mknone() mktype(Tnone, NULL, 0) #define mkvoid() mktype(Tvoid, NULL, 0) #define mkbool() mktype(Tenum, booltable, 4) #define mkchar() mktype(Tchar, NULL, 1) /* int8_t */ #define mkwchart() mktype(Twchar, NULL, 4) /* wchar_t */ #define mkshort() mktype(Tshort, NULL, 2) /* int32_t */ #define mkint() mktype(Tint, NULL, 4) /* int32_t */ #define mklong() mktype(Tlong, NULL, 8) /* int32_t */ #define mkllong() mktype(Tllong, NULL, 8) /* int64_t */ #define mkfloat() mktype(Tfloat, NULL, 4) #define mkdouble() mktype(Tdouble, NULL, 8) #define mkldouble() mktype(Tldouble, NULL, 16) /* long double */ #define mkuchar() mktype(Tuchar, NULL, 1) /* uint8_t unsigned char */ #define mkushort() mktype(Tushort, NULL, 2) /* utin16_t unsigned short */ #define mkuint() mktype(Tuint, NULL, 4) /* uint32_t unsigned int */ #define mkulong() mktype(Tulong, NULL, 8) /* uint64_t unsigned long */ #define mkullong() mktype(Tullong, NULL, 8) /* uint64_t unsigned long long */ #define mksize() mktype(Tsize, NULL, 8) /* transient size_t */ #define mktimet() mktype(Ttime, NULL, 4) #define mkenum(t) mktype(Tenum, t, 4) #define mkenumsc(t) mktype(Tenumsc, t, 4) #define mkmask(t) mktype(Tenum, t, 9) #define mkmasksc(t) mktype(Tenumsc, t, 9) #define mkpointer(t) mktype(Tpointer, t, 4) #define mkreference(t) mktype(Treference,t, 4) #define mkrvalueref(t) mktype(Trvalueref,t, 4) #define mkclass(t, w) mktype(Tclass, t, w) #define mkstruct(t, w) mktype(Tstruct, t, w) #define mkunion(t, w) mktype(Tunion, t, w) #define mkarray(t, w) mktype(Tarray, t, w) #define mkfun(t) mktype(Tfun, t, 0) #define mkstring() mkpointer(mkchar()) typedef struct Symbol { char *name; Token token; struct Symbol *next; } Symbol; Symbol *install(const char*, Token), *lookup(const char*), *gensym(const char*), *gensymidx(const char*, int); typedef struct Tnode { Type type; void *ref; Symbol *id; /* struct/class/union/enum name */ Symbol *base; /* base class name */ Symbol *sym; /* typedef name */ Symbol *synonym; /* synonymous typedef base name for 'typedef base id */ Symbol *extsym; /* typedef sym of external type w/ custom serializer */ struct Entry *response; /* funcs only: points to response struct */ int width; int transient; const char *imported; struct Tnode *next; Bool visited; Bool recursive; /* recursive data type */ Bool generated; Bool wsdl; int num; Bool hasmin; Bool hasmax; Bool incmin; Bool incmax; double min; double max; const char *pattern; } Tnode; typedef union Value { LONG64 i; double r; const char *s; } Value; typedef struct IDinfo { Tnode *typ; Storage sto; Bool hasval; /* if true, identifier is constant */ Value val; /* ... with this value */ int offset; LONG64 minOccurs; LONG64 maxOccurs; } IDinfo; typedef struct Entry { Symbol *sym; const char *tag; IDinfo info; Level level; const char *filename; int lineno; struct Entry *next; } Entry; typedef struct Table { Symbol *sym; Level level; Entry *list; struct Table *prev; } Table; typedef struct FNinfo { Tnode *ret; Table *args; } FNinfo; typedef struct Node { Tnode *typ; Storage sto; Bool hasval; /* if true, this node has a constant value */ Value val; /* ... this is the value */ Bool hasmin; Bool hasmax; Bool incmin; Bool incmax; LONG64 minOccurs; LONG64 maxOccurs; double min; double max; const char *pattern; } Node; #define ACTION 0x0000 #define REQUEST_ACTION 0x0001 #define RESPONSE_ACTION 0x0002 #define FAULT_ACTION 0x0004 #define HDRIN 0x0010 #define HDROUT 0x0020 #define MIMEIN 0x0040 #define MIMEOUT 0x0080 #define COMMENT 0x0100 #define ENCODING 0x0200 #define RESPONSE_ENCODING 0x0400 #define STYLE 0x0800 #define FAULT 0x1000 #define PROTOCOL 0x2000 typedef struct Data { struct Data *next; const char *name; const char *text; } Data; typedef struct Method { struct Method *next; const char *name; short mess; /* see #defines above */ const char *part; } Method; typedef struct Service { struct Service *next; const char *ns; const char *name; const char *porttype; const char *portname; const char *binding; const char *definitions; const char *transport; const char *URL; const char *executable; const char *import; const char *URI; const char *URI2; const char *WSDL; const char *style; const char *encoding; const char *protocol; int xsi_type; const char *elementForm; const char *attributeForm; const char *documentation; struct Method *list; struct Data *data; } Service; typedef struct XPath { struct XPath *next; const char *name; const char *path; } XPath; typedef struct Pragma { struct Pragma *next; const char *pragma; } Pragma; extern Entry *enter(Table*, Symbol*), *entry(Table*, Symbol*), *reenter(Table*, Symbol*), *enumentry(Symbol*); extern int merge(Table*, Table*); extern Table *mktable(Table*); extern Tnode *mkmethod(Tnode*, Table*); extern char *emalloc(size_t); extern Tnode *mktype(Type, void*, int); extern Tnode *mksymtype(Tnode*, Symbol*); extern Tnode *mktemplate(Tnode*, Symbol*); extern int is_transient(Tnode*); extern int is_response(Tnode*); extern Table *typetable, *enumtable, *classtable, *booltable, *templatetable; extern void compile(Table*); extern void freetable(Table*); extern Entry *unlinklast(Table*); extern FILE *fmsg; extern int soap_version; extern int aflag; extern int Aflag; extern int bflag; extern int cflag; extern int c11flag; extern int Cflag; extern int eflag; extern int Ecflag; extern int Edflag; extern int Etflag; extern unsigned long fflag; extern int iflag; extern int jflag; extern int mflag; extern int nflag; extern int nflag; extern int lflag; extern int Lflag; extern int Qflag; extern int sflag; extern int Sflag; extern int Tflag; extern int tflag; extern int uflag; extern int vflag; extern int wflag; extern int xflag; extern int yflag; extern int zflag; extern char dirpath[1024]; extern const char *filename; extern const char *prefix; extern const char *importpath; extern int custom_header; extern int custom_fault; extern Pragma *pragmas; extern Service *services; extern XPath *xpaths; extern const char *namespaceid; extern int transient; extern int imports; extern const char *imported; extern int typeNO; extern const char *envURI; extern const char *encURI; extern const char *rpcURI; extern const char *xsiURI; extern const char *xsdURI; gsoap-2.8.28/gsoap/VisualStudio2005/soapcpp2/soapcpp2/symbol2.c0000644000175000017500000271236112653650160023370 0ustar ellertellert/* symbol2.c Symbolic processing: type analysis and code generation. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2016, Robert van Engelen, Genivia Inc. All Rights Reserved. This part of the software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapcpp2.h" #ifdef HAVE_CONFIG_H #include "soapcpp2_yacc.h" #else #include "soapcpp2_yacc.tab.h" #endif const char *envURI = "http://schemas.xmlsoap.org/soap/envelope/"; const char *encURI = "http://schemas.xmlsoap.org/soap/encoding/"; const char *rpcURI = "http://www.w3.org/2003/05/soap-rpc"; const char *xsiURI = "http://www.w3.org/2001/XMLSchema-instance"; const char *xsdURI = "http://www.w3.org/2001/XMLSchema"; const char *tmpURI = "http://tempuri.org"; static Symbol *symlist = (Symbol*) 0; /* pointer to linked list of symbols */ static Symbol *nslist = (Symbol*) 0; /* pointer to linked list of namespace prefix symbols */ static Tnode *Tptr[TYPES]; Service *services = NULL; XPath *xpaths = NULL; /* TODO */ FILE *fout, *fhead, *fclient, *fserver, *fheader, *flib, *fmatlab, *fmheader; int partnum = 0; int typeNO = 1; /* unique nonzero type no. assigned to all types */ static int is_anytype_flag = 0; /* anytype is used */ static int has_nsmap = 0; int tagcmp(const char *s, const char *t); int tagncmp(const char *s, const char *t, size_t n); long minlen(Tnode *typ); long maxlen(Tnode *typ); int is_soap12(const char*); int has_detail_string(void); int has_Detail_string(void); void needs_lang(Entry *e); int is_mutable(Entry *e); int is_header_or_fault(Tnode *typ); int is_body(Tnode *typ); int is_volatile(Tnode* typ); int is_untyped(Tnode* typ); int is_primclass(Tnode* typ); int is_imported(Tnode* typ); int is_smart(Tnode*); int is_smart_shared(Tnode*); const char * make_shared(Tnode*); int is_container(Tnode* typ); int is_template(Tnode* typ); int is_mask(Tnode* typ); int is_attachment(Tnode* typ); int is_void(Tnode* typ); int has_external(Tnode *typ); int has_volatile(Tnode *typ); int is_unmatched(Symbol *sym); int is_invisible(const char *name); int is_invisible_empty(Tnode *p); int is_element(Tnode *typ); int is_eq_nons(const char *s, const char *t); int is_eq(const char *s, const char *t); int is_item(Entry *p); int is_self(Entry *p); const char *cstring(const char*, int); const char *xstring(const char*); const char *get_mxClassID(Tnode*); const char *t_ident(Tnode*); const char *c_ident(Tnode*); const char *ident(const char*); const char *soap_type(Tnode*); const char *soap_union_member(Tnode*, Entry*); const char *c_storage(Storage); const char *c_const(Storage); const char *c_init(Entry*); const char *c_type(Tnode*); const char *c_type_constptr_id(Tnode*, const char*); const char *c_type_id(Tnode*, const char*); const char *c_type_synonym(Tnode*, const char*); const char *xsi_type_cond(Tnode*, int); const char *xsi_type(Tnode*); const char *xsi_type_cond_u(Tnode*, int); const char *xsi_type_u(Tnode*); const char *the_type(Tnode*); const char *wsdl_type(Tnode*, const char*); const char *base_type(Tnode*, const char*); const char *xml_tag(Tnode*); const char *ns_qualifiedElement(Tnode*); const char *ns_qualifiedAttribute(Tnode*); const char *ns_convert(const char*); const char *field(Entry *p, const char *ns); const char *field_overridden(Table *t, Entry *p, const char *ns); const char *ns_add(Entry *p, const char *ns); const char *ns_addx(const char *tag, const char *ns); const char *ns_add_overridden(Table *t, Entry *p, const char *ns); const char *ns_remove(const char*); const char *ns_remove1(const char*); const char *ns_remove2(const char*, const char*); const char *res_remove(const char*); const char *ns_name(const char*); const char *ns_cname(const char*, const char*); const char *ns_fname(const char*); int has_class(Tnode*); const char *union_member(Tnode*); int has_union(Tnode*); int has_constructor(Tnode*); int has_destructor(Tnode*); int has_getter(Tnode*); int has_setter(Tnode*); int has_ns(Tnode*); int has_ns_t(Tnode*); int has_ns_eq(const char*, const char*); const char *strict_check(void); const char *ns_of(const char*); int eq_ns(const char*, const char*); const char *prefix_of(const char*); int has_offset(Tnode*); int is_bool(Tnode*); int is_boolean(Tnode*); int reflevel(Tnode *typ); Tnode* reftype(Tnode *typ); int is_response(Tnode*); int is_XML(Tnode*); int is_stdXML(Tnode *p); Entry *get_response(Tnode*); int is_primitive_or_string(Tnode*); int is_primitive(Tnode*); Entry *is_discriminant(Tnode*); Entry *is_dynamic_array(Tnode*); int is_transient(Tnode*); int is_external(Tnode*); int is_anyType(Tnode*); int is_anyAttribute(Tnode*); int is_binary(Tnode*); int is_hexBinary(Tnode*); int is_fixedstring(Tnode*); int is_string(Tnode*); int is_wstring(Tnode*); int is_stdstring(Tnode*); int is_stdwstring(Tnode*); int is_stdstr(Tnode*); int is_typedef(Tnode*); int is_synonym(Tnode*); int get_dimension(Tnode*); const char *has_soapref(Tnode*); int is_soapref(Tnode*); int is_document(const char*); int is_literal(const char*); int is_keyword(const char *); int is_repetition(Entry*); int is_choice(Entry*); int required_choice(Tnode*); int is_sequence(Entry*); int is_anytype(Entry*); const char *xsi_type_Tarray(Tnode*); const char *xsi_type_Darray(Tnode*); void matlab_def_table(Table*); void generate_defs(void); void generate_type(Tnode *); int no_of_var(Tnode*); const char *pointer_stuff(Tnode*); void in_defs(void); void in_defs2(void); void in_defs3(void); void out_defs(void); void mark_defs(void); void dup_defs(void); void del_defs(void); void in_attach(void); void soap_serialize(Tnode*); void soap_traverse(Tnode*); void soap_default(Tnode*); void soap_put(Tnode*); void soap_out(Tnode*); void soap_out_Darray(Tnode *); void soap_get(Tnode*); void soap_in(Tnode*); void soap_in_Darray(Tnode *); void soap_instantiate(Tnode *); void soap_dup(Tnode *); void soap_del(Tnode *); int get_Darraydims(Tnode *typ); const char* get_Darraysize(const char *a, int d); const char *nillable(Tnode *typ); void soap_serve(Table*); void generate_proto(Table*, Entry*); /* void generate_call(Table*, Entry*); void generate_server(Table*, Entry*); */ void detect_cycles(void); void detect_recursive_type(Tnode*); void generate_header(Table*); void get_namespace_prefixes(void); void generate_schema(Table*); void gen_schema(FILE*, Table*, const char*, const char*, int, const char*, const char*); void gen_type_documentation(FILE *fd, Entry *type, const char *ns); int gen_member_documentation(FILE *fd, Symbol *type, Entry *member, const char *ns, int scope); void gen_schema_elements_attributes(FILE *fd, Table *t, const char *ns, const char *ns1, const char *encoding, const char *style); void gen_schema_elements(FILE *fd, Tnode *p, const char *ns, const char *ns1); int gen_schema_element(FILE *fd, Tnode *p, Entry *q, const char *ns, const char *ns1); void gen_schema_attributes(FILE *fd, Tnode *p, const char *ns, const char *ns1); void gen_wsdl(FILE*, Table*, const char*, const char*, const char*, const char*, const char*, const char*, const char*, const char*); void gen_nsmap(FILE*); void gen_proxy(FILE*, Table*, Symbol*, const char*, const char*); void gen_object(FILE*, Table*, const char*); void gen_proxy_header(FILE*, Table*, Symbol*, const char*); void gen_proxy_code(FILE*, Table*, Symbol*, const char*); void gen_object_header(FILE*, Table*, Symbol*, const char*); void gen_object_code(FILE*, Table*, Symbol*, const char*); void gen_method(FILE *fd, Entry *method, int server); void gen_params(FILE *fd, Table *params, Entry *result, int flag); void gen_args(FILE *fd, Table *params, Entry *result, int flag); void gen_query_url(FILE *fd, Table *params); void gen_query_form(FILE *fd, Table *params); const char* gen_format(Tnode *typ); void gen_call_method(FILE *fd, Entry *method, const char *name); void gen_serve_method(FILE *fd, Table *table, Entry *param, const char *name); void gen_data(const char*, Table*, const char*, const char*); FILE *gen_env(const char*, const char*, int, const char*, int); void gen_xmlns(FILE*); void gen_field(FILE*, int, Entry*, const char*, const char*, const char*); void gen_val(FILE*, int, Tnode*, const char*, const char*, const char*); void gen_atts(FILE*, Table*, const char*); /* install - add new symbol */ Symbol * install(const char *name, Token token) { Symbol *p; p = (Symbol*)emalloc(sizeof(Symbol)); p->name = (char*)emalloc(strlen(name)+1); strcpy(p->name, name); p->token = token; p->next = symlist; symlist = p; return p; } /* lookup - search for an identifier's name. If found, return pointer to symbol table entry. Return pointer 0 if not found. */ Symbol * lookup(const char *name) { Symbol *p; for (p = symlist; p; p = p->next) if (!strcmp(p->name, name)) return p; return NULL; } /* gensymidx - generate new symbol from base name and index */ Symbol * gensymidx(const char *base, int idx) { char buf[1024]; Symbol *s; sprintf(buf, "%s_%d", base, idx); s = lookup(buf); if (s) return s; return install(buf, ID); } /* gensym - generate new symbol from base name */ Symbol * gensym(const char *base) { static int num = 1; return gensymidx(base, num++); } /* mktable - make a new symbol table with a pointer to a previous table */ Table * mktable(Table *table) { Table *p; p = (Table*)emalloc(sizeof(Table)); p->sym = lookup("/*?*/"); p->list = (Entry*) 0; if (table == (Table*) 0) p->level = INTERNAL; else p->level = (enum Level)(((int)table->level) + 1); p->prev = table; return p; } /* mkmethod - make a new method by calling mktype */ Tnode * mkmethod(Tnode *ret, Table *args) { FNinfo *fn = (FNinfo*)emalloc(sizeof(FNinfo)); fn->ret = ret; fn->args = args; return mktype(Tfun, fn, 0); } /* freetable - free space by removing a table */ void freetable(Table *table) { Entry *p, *q; if (table == (Table*) 0) return; for (p = table->list; p != (Entry*) 0; p = q) { q = p->next; free(p); } free(table); } /* unlinklast - unlink last entry added to table */ Entry * unlinklast(Table *table) { Entry **p, *q; if (table == (Table*)0) return (Entry*)0; for (p = &table->list; *p != (Entry*)0 && (*p)->next != (Entry*)0; p = &(*p)->next) ; q = *p; *p = (Entry*)0; return q; } /* enter - enter a symbol in a table. Error if already in the table */ Entry * enter(Table *table, Symbol *sym) { Entry *p, *q = NULL; again: for (p = table->list; p; q = p, p = p->next) { if (p->sym == sym && p->info.typ->type != Tfun) { char *s; sprintf(errbuf, "Duplicate declaration of '%s' (already declared at line %d), changing conflicting identifier name to new name '%s_'. Note: this problem may be caused by importing invalid XML schemas", sym->name, p->lineno, sym->name); semwarn(errbuf); s = (char*)emalloc(strlen(sym->name) + 2); strcpy(s, sym->name); strcat(s, "_"); sym = lookup(s); if (!sym) sym = install(s, ID); free(s); goto again; } } p = (Entry*)emalloc(sizeof(Entry)); p->sym = sym; p->tag = NULL; p->info.typ = NULL; p->info.sto = Snone; p->info.hasval = False; p->info.minOccurs = 1; p->info.maxOccurs = 1; p->info.offset = 0; p->level = table->level; p->filename = filename; p->lineno = yylineno; p->next = NULL; if (!q) table->list = p; else q->next = p; return p; } /* entry - return pointer to table entry of a symbol */ Entry * entry(Table *table, Symbol *sym) { Table *t; Entry *p; for (t = table; t; t = t->prev) for (p = t->list; p; p = p->next) if (p->sym == sym) return p; return (Entry*)0; } /* reenter - re-enter a symbol in a table. */ Entry * reenter(Table *table, Symbol *sym) { Entry *p, *q = NULL; for (p = table->list; p; q = p, p = p->next) if (p->sym == sym) break; if (p && p->next) { if (q) q->next = p->next; else table->list = p->next; for (q = p->next; q->next; q = q->next) ; q->next = p; p->next = NULL; } return p; } /* merge - append two tables if members are not duplicated */ int merge(Table *dest, Table *src) { Entry *p, *q; for (p = src->list; p; p = p->next) { q = entry(dest, p->sym); if (!q) { q = enter(dest, p->sym); q->info = p->info; } else if (q->info.typ != p->info.typ) return 1; } return 0; } Entry * enumentry(Symbol *sym) { const char *s = strstr(sym->name, "::"); if (s && s[2]) { Entry *e; char *t = (char*)emalloc(s - sym->name + 1); strncpy(t, sym->name, s - sym->name); t[s - sym->name] = '\0'; e = entry(enumtable, lookup(t)); free(t); if (!e) return NULL; return entry((Table*)e->info.typ->ref, lookup(s + 2)); } else { Table *t; for (t = enumtable; t; t = t->prev) { Entry *p; for (p = t->list; p; p = p->next) { Entry *e = entry((Table*)p->info.typ->ref, sym); if (e) return e; } } } return NULL; } /* mktype - make a (new) type with a reference to additional information and the width in bytes required to store objects of that type. A pointer to the type is returned which can be compared to check if types are identical. */ Tnode * mktype(Type type, void *ref, int width) { Tnode *p; if (type != Tstruct && type != Tclass && type != Tunion && ((type != Tenum && type != Tenumsc) || ref)) { for (p = Tptr[type]; p; p = p->next) { if (p->ref == ref && p->sym == (Symbol*)0 && p->width == width && ((p->transient == 1 && transient == 1) || (p->transient != 1 && transient != 1))) { if (imported && !p->imported) p->imported = imported; return p; /* type already exists in table */ } } } p = (Tnode*)emalloc(sizeof(Tnode)); /* install new type */ p->type = type; p->ref = ref; p->id = lookup("/*?*/"); p->base = NULL; p->sym = NULL; p->synonym = NULL; p->extsym = NULL; p->response = NULL; p->width = width; p->visited = False; p->recursive = False; p->generated = False; p->wsdl = False; p->next = Tptr[type]; p->transient = transient; p->imported = imported; p->hasmin = False; p->hasmax = False; p->incmin = True; p->incmax = True; p->min = 0.0; p->max = 0.0; p->pattern = NULL; p->num = typeNO++; Tptr[type] = p; DBGLOG(fprintf(stderr, "New type %s %s\n", c_type(p), p->imported)); if (type == Tpointer && ((Tnode*)ref)->imported && (((Tnode*)ref)->type == Tenum || ((Tnode*)ref)->type == Tenumsc || ((Tnode*)ref)->type == Tstruct || ((Tnode*)ref)->type == Tclass)) p->imported = ((Tnode*)ref)->imported; else if (lflag && !is_transient(p) && (type == Tenum || type == Tenumsc || type == Tstruct || type == Tclass)) mkpointer(p); return p; } Tnode * mksymtype(Tnode *typ, Symbol *sym) { Tnode *p; p = (Tnode*)emalloc(sizeof(Tnode)); /* install new type */ p->type = typ->type; p->ref = typ->ref; if (typ->id == lookup("/*?*/")) p->id = sym; else p->id = typ->id; p->sym = sym; p->synonym = NULL; p->extsym = typ->extsym; p->response = (Entry*)0; p->width = typ->width; p->visited = False; p->recursive = False; p->generated = False; p->wsdl = False; p->next = Tptr[typ->type]; p->transient = transient; p->imported = imported; p->hasmin = False; p->hasmax = False; p->incmin = True; p->incmax = True; p->min = 0.0; p->max = 0.0; p->pattern = NULL; p->num = typeNO++; Tptr[typ->type] = p; DBGLOG(fprintf(stderr, "New typedef %s %s\n", c_type(p), p->imported)); return p; } Tnode * mktemplate(Tnode *typ, Symbol *id) { Tnode *p; for (p = Tptr[Ttemplate]; p; p = p->next) { if (p->ref == typ && p->id == id && ((p->transient == 1 && transient == 1) || (p->transient != 1 && transient != 1))) { if (imported && !p->imported) p->imported = imported; return p; /* type alrady exists in table */ } } p = (Tnode*)emalloc(sizeof(Tnode)); /* install new type */ p->type = Ttemplate; p->ref = typ; p->id = id; p->sym = NULL; p->synonym = NULL; p->extsym = NULL; p->response = (Entry*)0; p->width = 0; p->generated = False; p->wsdl = False; p->next = Tptr[Ttemplate]; p->transient = transient; p->imported = imported; p->hasmin = False; p->hasmax = False; p->incmin = True; p->incmax = True; p->min = 0.0; p->max = 0.0; p->pattern = NULL; p->num = typeNO++; Tptr[Ttemplate] = p; return p; } /* DO NOT REMOVE OR ALTER (SEE LICENCE AGREEMENT AND COPYING.txt) */ void copyrightnote(FILE *fd, const char *fn) { fprintf(fd, "/* %s\n Generated by gSOAP " VERSION " from %s\n\ \n\ gSOAP XML Web services tools\n\ Copyright (C) 2000-2016, Robert van Engelen, Genivia Inc. All Rights Reserved.\n\ The soapcpp2 tool and its generated software are released under the GPL.\n\ This program is released under the GPL with the additional exemption that\n\ compiling, linking, and/or using OpenSSL is allowed.\n\ --------------------------------------------------------------------------------\n\ A commercial use license is available from Genivia Inc., contact@genivia.com\n\ --------------------------------------------------------------------------------\n\ */", fn, filename); } void banner(FILE *fd, const char *text) { int i; fprintf(fd, "\n\n/"); for (i = 0; i < 78; i++) fputc('*', fd); fprintf(fd, "\\\n *%76s*\n * %-75s*\n *%76s*\n\\", "", text, ""); for (i = 0; i < 78; i++) fputc('*', fd); fprintf(fd, "/\n"); } void identify(FILE *fd, const char *fn) { time_t t = time(NULL), *p = &t; char tmp[256]; strftime(tmp, 256, "%Y-%m-%d %H:%M:%S GMT", gmtime(p)); fprintf(fd, "\n\nSOAP_SOURCE_STAMP(\"@(#) %s ver " VERSION " %s\")\n", fn, tmp); } void compile(Table *table) { Entry *p; Tnode *typ; Pragma *pragma; int classflag = 0; int found; int filenum; const char *s; char base[1024]; char soapStub[1024]; char soapH[1024]; char soapC[1024]; char soapClient[1024]; char soapServer[1024]; char soapClientLib[1024]; char soapServerLib[1024]; char pathsoapStub[1024]; char pathsoapH[1024]; char pathsoapC[1024]; char pathsoapClient[1024]; char pathsoapServer[1024]; char pathsoapClientLib[1024]; char pathsoapServerLib[1024]; char soapMatlab[1024]; char pathsoapMatlab[1024]; char soapMatlabHdr[1024]; char pathsoapMatlabHdr[1024]; found = 0; for (p = table->list; p; p = p->next) if (p->info.typ->type == Tfun && !(p->info.sto & Sextern)) found = 1; if (!found) Sflag = Cflag = Lflag = 1; /* no service operations were found */ if (*dirpath) fprintf(fmsg, "Using project directory path: %s\n", dirpath); if (namespaceid) { prefix = namespaceid; fprintf(fmsg, "Using code namespace: %s\n", namespaceid); } strcpy(base, prefix); if (cflag) s = ".c"; else s = ".cpp"; strcpy(soapMatlab, base); strcat(soapMatlab, "Matlab.c"); strcpy(pathsoapMatlab, dirpath); strcat(pathsoapMatlab, soapMatlab ); strcpy(soapMatlabHdr, base); strcat(soapMatlabHdr, "Matlab.h"); strcpy(pathsoapMatlabHdr, dirpath); strcat(pathsoapMatlabHdr, soapMatlabHdr); strcpy(soapStub, base); strcat(soapStub, "Stub.h"); strcpy(pathsoapStub, dirpath); strcat(pathsoapStub, soapStub); strcpy(soapH, base); strcat(soapH, "H.h"); strcpy(pathsoapH, dirpath); strcat(pathsoapH, soapH); strcpy(soapC, base); if (fflag) strcat(soapC, "C_nnn"); else strcat(soapC, "C"); strcat(soapC, s); strcpy(pathsoapC, dirpath); strcat(pathsoapC, soapC); strcpy(soapClient, base); strcat(soapClient, "Client"); strcat(soapClient, s); strcpy(pathsoapClient, dirpath); strcat(pathsoapClient, soapClient); strcpy(soapServer, base); strcat(soapServer, "Server"); strcat(soapServer, s); strcpy(pathsoapServer, dirpath); strcat(pathsoapServer, soapServer); strcpy(soapClientLib, base); strcat(soapClientLib, "ClientLib"); strcat(soapClientLib, s); strcpy(pathsoapClientLib, dirpath); strcat(pathsoapClientLib, soapClientLib); strcpy(soapServerLib, base); strcat(soapServerLib, "ServerLib"); strcat(soapServerLib, s); strcpy(pathsoapServerLib, dirpath); strcat(pathsoapServerLib, soapServerLib); if (mflag) { fprintf(fmsg, "Saving %s Matlab definitions\n", pathsoapMatlab); fmatlab = fopen(pathsoapMatlab, "w"); if (!fmatlab) execerror("Cannot write to file"); copyrightnote(fmatlab, soapMatlab); fprintf(fmatlab, "\n#include \"%s\"\n", soapMatlabHdr); fprintf(fmsg, "Saving %s Matlab definitions\n", pathsoapMatlabHdr); fmheader = fopen(pathsoapMatlabHdr, "w"); if (!fmheader) execerror("Cannot write to file"); copyrightnote(fmheader, soapMatlabHdr); fprintf(fmheader, "\n#include \"mex.h\"\n#include \"%s\"\n", soapStub); } fprintf(fmsg, "Saving %s annotated copy of the source input\n", pathsoapStub); fheader = fopen(pathsoapStub, "w"); if (!fheader) execerror("Cannot write to file"); copyrightnote(fheader, soapStub); fprintf(fheader, "\n"); for (pragma = pragmas; pragma; pragma = pragma->next) fprintf(fheader, "\n%s", pragma->pragma); fprintf(fheader, "\n\n#ifndef %sStub_H\n#define %sStub_H", prefix, prefix); if (nflag) fprintf(fheader, "\n#ifndef WITH_NONAMESPACES\n#define WITH_NONAMESPACES\n#endif"); if (namespaceid) fprintf(fheader, "\n#ifndef WITH_NOGLOBAL\n#define WITH_NOGLOBAL\n#endif"); fprintf(fheader, "\n#include \"stdsoap2.h\""); fprintf(fheader, "\n#if GSOAP_VERSION != %d\n# error \"GSOAP VERSION %d MISMATCH IN GENERATED CODE VERSUS LIBRARY CODE: PLEASE REINSTALL PACKAGE\"\n#endif\n", GSOAP_VERSION, GSOAP_VERSION); if (cflag) fprintf(fheader, "\n#ifdef __cplusplus\nextern \"C\" {\n#endif"); if (namespaceid) fprintf(fheader, "\n\nnamespace %s {", namespaceid); fprintf(fmsg, "Saving %s declarations to #include\n", pathsoapH); fhead = fopen(pathsoapH, "w"); if (!fhead) execerror("Cannot write to file"); copyrightnote(fhead, soapH); fprintf(fhead, "\n\n#ifndef %sH_H\n#define %sH_H", prefix, prefix); fprintf(fhead, "\n#include \"%s\"", soapStub); if (cflag) fprintf(fhead, "\n#ifdef __cplusplus\nextern \"C\" {\n#endif"); if (namespaceid) fprintf(fhead, "\n\nnamespace %s {", namespaceid); fprintf(fhead, "\n#ifndef WITH_NOIDREF"); if (!cflag && !namespaceid) fprintf(fhead, "\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif"); fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_markelement(struct soap*, const void*, int);"); if (!cflag && !namespaceid) fprintf(fhead, "\n\n#ifdef __cplusplus\n}\n#endif"); fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_putindependent(struct soap*);"); fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_getindependent(struct soap*);"); fprintf(fhead, "\n#endif"); if (!cflag && !namespaceid) fprintf(fhead, "\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif"); fprintf(fhead, "\nSOAP_FMAC3 void *SOAP_FMAC4 soap_getelement(struct soap*, int*);"); fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_putelement(struct soap*, const void*, const char*, int, int);"); if (Ecflag) fprintf(fhead, "\nSOAP_FMAC3 void * SOAP_FMAC4 soap_dupelement(struct soap*, const void*, int);"); if (Edflag) fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_delelement(const void*, int);"); if (!cflag && !namespaceid) fprintf(fhead, "\n\n#ifdef __cplusplus\n}\n#endif"); fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_ignore_element(struct soap*);"); detect_cycles(); generate_header(table); generate_schema(table); if (!Sflag && !iflag && !jflag) { fprintf(fmsg, "Saving %s client calling stubs\n", pathsoapClient); fclient = fopen(pathsoapClient, "w"); if (!fclient) execerror("Cannot write to file"); copyrightnote(fclient, soapClient); fprintf(fclient, "\n\n#if defined(__BORLANDC__)"); fprintf(fclient, "\n#pragma option push -w-8060"); fprintf(fclient, "\n#pragma option push -w-8004"); fprintf(fclient, "\n#endif"); fprintf(fclient, "\n#include \"%sH.h\"", prefix); if (cflag) fprintf(fclient, "\n#ifdef __cplusplus\nextern \"C\" {\n#endif"); if (namespaceid) fprintf(fclient, "\n\nnamespace %s {", namespaceid); identify(fclient, soapClient); if (!Lflag) { flib = fopen(pathsoapClientLib, "w"); if (!flib) execerror("Cannot write to file"); copyrightnote(flib, soapClientLib); fprintf(fmsg, "Saving %s client stubs with serializers (use only for libs)\n", pathsoapClientLib); fprintf(flib, "\n\n/** Use this file in your project build instead of the two files %s and %s. This hides the serializer functions and avoids linking problems when linking multiple clients and servers. */\n", soapC, soapClient); fprintf(flib, "\n#ifndef WITH_NOGLOBAL\n#define WITH_NOGLOBAL\n#endif"); fprintf(flib, "\n#define SOAP_FMAC3 static"); fprintf(flib, "\n#include \"%s\"", soapC); fprintf(flib, "\n#include \"%s\"", soapClient); fprintf(flib, "\n\n/* End of %s */\n", soapClientLib); fclose(flib); } } if (!Cflag && !iflag && !jflag) { fprintf(fmsg, "Saving %s server request dispatcher\n", pathsoapServer); fserver = fopen(pathsoapServer, "w"); if (!fserver) execerror("Cannot write to file"); copyrightnote(fserver, soapServer); fprintf(fserver, "\n\n#if defined(__BORLANDC__)"); fprintf(fserver, "\n#pragma option push -w-8060"); fprintf(fserver, "\n#pragma option push -w-8004"); fprintf(fserver, "\n#endif"); fprintf(fserver, "\n#include \"%sH.h\"", prefix); if (cflag) fprintf(fserver, "\n#ifdef __cplusplus\nextern \"C\" {\n#endif"); if (namespaceid) fprintf(fserver, "\n\nnamespace %s {", namespaceid); identify(fserver, soapServer); if (!Lflag) { flib = fopen(pathsoapServerLib, "w"); if (!flib) execerror("Cannot write to file"); copyrightnote(flib, soapServerLib); fprintf(fmsg, "Saving %s server request dispatcher with serializers (use only for libs)\n", pathsoapServerLib); fprintf(flib, "\n\n/** Use this file in your project build instead of the two files %s and %s. This hides the serializer functions and avoids linking problems when linking multiple clients and servers. */\n", soapC, soapServer); fprintf(flib, "\n#ifndef WITH_NOGLOBAL\n#define WITH_NOGLOBAL\n#endif"); fprintf(flib, "\n#define SOAP_FMAC3 static"); fprintf(flib, "\n#include \"%s\"", soapC); fprintf(flib, "\n#include \"%s\"", soapServer); fprintf(flib, "\n\n/* End of %s */\n", soapServerLib); fclose(flib); } } if (!iflag && !jflag) soap_serve(table); classflag = 0; for (p = classtable->list; p; p = p->next) { if (p->info.typ->type == Tclass && p->info.typ->transient <= 0) { classflag = 1; break; } } for (p = enumtable->list; p; p = p->next) { if (p->info.typ->type == Tenumsc && p->info.typ->transient <= 0) { classflag = 1; break; } } if (classflag || Tptr[Ttemplate]) { if (cflag) semwarn("Option -c conflicts with the use of class definitions in the specified input"); } for (filenum = 1; partnum == 0; filenum++) { if (fflag) { char *t = strrchr(pathsoapC, '.'); sprintf(t-3, "%03d", filenum); *t = '.'; fprintf(fmsg, "Saving %s serializers (part %d)\n", pathsoapC, filenum); partnum = fflag; /* number of defs per file */ } else { fprintf(fmsg, "Saving %s serializers\n", pathsoapC); partnum = 1; } fout = fopen(pathsoapC, "w"); if (!fout) execerror("Cannot write to file"); copyrightnote(fout, soapC); fprintf(fout, "\n\n#if defined(__BORLANDC__)"); fprintf(fout, "\n#pragma option push -w-8060"); fprintf(fout, "\n#pragma option push -w-8004"); fprintf(fout, "\n#endif"); fprintf(fout, "\n\n#include \"%sH.h\"", prefix); if (cflag) fprintf(fout, "\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif"); if (namespaceid) fprintf(fout, "\n\nnamespace %s {", namespaceid); identify(fout, soapC); fflush(fout); if (filenum == 1) { if (!lflag) { fprintf(fout, "\n\n#ifndef WITH_NOGLOBAL"); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_getheader(struct soap *soap)\n{\n\tsoap->part = SOAP_IN_HEADER;\n\tsoap->header = soap_in_SOAP_ENV__Header(soap, \"SOAP-ENV:Header\", soap->header, NULL);\n\tsoap->part = SOAP_END_HEADER;\n\treturn soap->header == NULL;\n}"); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_putheader(struct soap *soap)\n{\n\tif (soap->version && soap->header)\n\t{\tsoap->part = SOAP_IN_HEADER;\n\t\tif (soap_out_SOAP_ENV__Header(soap, \"SOAP-ENV:Header\", 0, soap->header, NULL))\n\t\t\treturn soap->error;\n\t\tsoap->part = SOAP_END_HEADER;\n\t}\n\treturn SOAP_OK;\n}"); if (cflag) { fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serializeheader(struct soap *soap)\n{\n\tif (soap->version && soap->header)\n\t\tsoap_serialize_SOAP_ENV__Header(soap, soap->header);\n}"); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_header(struct soap *soap)\n{\n\tif (soap->header == NULL)\n\t{\tif ((soap->header = (struct SOAP_ENV__Header*)soap_malloc(soap, sizeof(struct SOAP_ENV__Header))))\n\t\t\tsoap_default_SOAP_ENV__Header(soap, soap->header);\n\t}\n}"); } else if ((p = entry(classtable, lookup("SOAP_ENV__Header"))) && p->info.typ->type == Tstruct) { fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serializeheader(struct soap *soap)\n{\n\tif (soap->version && soap->header)\n\t\tsoap_serialize_SOAP_ENV__Header(soap, soap->header);\n}"); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_header(struct soap *soap)\n{\n\tif (soap->header == NULL)\n\t{\tif ((soap->header = soap_new_SOAP_ENV__Header(soap)))\n\t\t\tsoap_default_SOAP_ENV__Header(soap, soap->header);\n\t}\n}"); } else { fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serializeheader(struct soap *soap)\n{\n\tif (soap->version && soap->header)\n\t\tsoap->header->soap_serialize(soap);\n}"); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_header(struct soap *soap)\n{\n\tif (soap->header == NULL)\n\t{\tif ((soap->header = soap_new_SOAP_ENV__Header(soap)))\n\t\t\tsoap->header->soap_default(soap);\n\t}\n}"); } if (cflag) { fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_fault(struct soap *soap)\n{\n\tif (soap->fault == NULL)\n\t{\tsoap->fault = (struct SOAP_ENV__Fault*)soap_malloc(soap, sizeof(struct SOAP_ENV__Fault));\n\t\tif (soap->fault == NULL)\n\t\t\treturn;\n\t\tsoap_default_SOAP_ENV__Fault(soap, soap->fault);\n\t}\n\tif (soap->version == 2 && !soap->fault->SOAP_ENV__Code)\n\t{\tsoap->fault->SOAP_ENV__Code = (struct SOAP_ENV__Code*)soap_malloc(soap, sizeof(struct SOAP_ENV__Code));\n\t\tsoap_default_SOAP_ENV__Code(soap, soap->fault->SOAP_ENV__Code);\n\t}\n\tif (soap->version == 2 && !soap->fault->SOAP_ENV__Reason)\n\t{\tsoap->fault->SOAP_ENV__Reason = (struct SOAP_ENV__Reason*)soap_malloc(soap, sizeof(struct SOAP_ENV__Reason));\n\t\tsoap_default_SOAP_ENV__Reason(soap, soap->fault->SOAP_ENV__Reason);\n\t}\n}"); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serializefault(struct soap *soap)\n{\n\tif (soap->fault)\n\t\tsoap_serialize_SOAP_ENV__Fault(soap, soap->fault);\n}"); } else if ((p = entry(classtable, lookup("SOAP_ENV__Fault"))) && p->info.typ->type == Tstruct) { fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_fault(struct soap *soap)\n{\n\tif (soap->fault == NULL)\n\t{\tsoap->fault = soap_new_SOAP_ENV__Fault(soap);\n\t\tif (soap->fault == NULL)\n\t\t\treturn;\n\t\tsoap_default_SOAP_ENV__Fault(soap, soap->fault);\n\t}\n\tif (soap->version == 2 && !soap->fault->SOAP_ENV__Code)\n\t{\tsoap->fault->SOAP_ENV__Code = soap_new_SOAP_ENV__Code(soap);\n\t\tsoap_default_SOAP_ENV__Code(soap, soap->fault->SOAP_ENV__Code);\n\t}\n\tif (soap->version == 2 && !soap->fault->SOAP_ENV__Reason)\n\t{\tsoap->fault->SOAP_ENV__Reason = soap_new_SOAP_ENV__Reason(soap);\n\t\tsoap_default_SOAP_ENV__Reason(soap, soap->fault->SOAP_ENV__Reason);\n\t}\n}"); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serializefault(struct soap *soap)\n{\n\tsoap_fault(soap);\n\tif (soap->fault)\n\t\tsoap_serialize_SOAP_ENV__Fault(soap, soap->fault);\n}"); } else { fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_fault(struct soap *soap)\n{\n\tif (soap->fault == NULL)\n\t{\tsoap->fault = soap_new_SOAP_ENV__Fault(soap);\n\t\tsoap->fault->soap_default(soap);\n\t}\n\tif (soap->version == 2 && !soap->fault->SOAP_ENV__Code)\n\t{\tsoap->fault->SOAP_ENV__Code = soap_new_SOAP_ENV__Code(soap);\n\t\tsoap_default_SOAP_ENV__Code(soap, soap->fault->SOAP_ENV__Code);\n\t}\n\tif (soap->version == 2 && !soap->fault->SOAP_ENV__Reason)\n\t{\tsoap->fault->SOAP_ENV__Reason = soap_new_SOAP_ENV__Reason(soap);\n\t\tsoap_default_SOAP_ENV__Reason(soap, soap->fault->SOAP_ENV__Reason);\n\t}\n}"); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serializefault(struct soap *soap)\n{\n\tsoap_fault(soap);\n\tif (soap->fault)\n\t\tsoap->fault->soap_serialize(soap);\n}"); } if ((p = entry(classtable, lookup("SOAP_ENV__Fault"))) && p->info.typ->type == Tstruct) { fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_putfault(struct soap *soap)\n{\n\tif (soap->fault)\n\t\treturn soap_put_SOAP_ENV__Fault(soap, soap->fault, \"SOAP-ENV:Fault\", NULL);\n\treturn SOAP_OK;\n}"); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_getfault(struct soap *soap)\n{\n\treturn (soap->fault = soap_get_SOAP_ENV__Fault(soap, NULL, \"SOAP-ENV:Fault\", NULL)) == NULL;\n}"); } else { fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_putfault(struct soap *soap)\n{\n\tsoap_fault(soap);\n\tif (soap->fault)\n\t\treturn soap->fault->soap_put(soap, \"SOAP-ENV:Fault\", NULL);\n\treturn SOAP_EOM;\n}"); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_getfault(struct soap *soap)\n{\n\tsoap_fault(soap);\n\tif (soap->fault)\n\t\treturn soap->fault->soap_get(soap, \"SOAP-ENV:Fault\", NULL) == NULL;\n\treturn SOAP_EOM;\n}"); } fprintf(fhead, "\n\nSOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultcode(struct soap *soap);"); fprintf(fout, "\n\nSOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultcode(struct soap *soap)\n{\n\tsoap_fault(soap);\n\tif (soap->version == 2 && soap->fault->SOAP_ENV__Code)\n\t\treturn (const char**)(void*)&soap->fault->SOAP_ENV__Code->SOAP_ENV__Value;\n\treturn (const char**)(void*)&soap->fault->faultcode;\n}"); if (cflag) fprintf(fout, "\n\nSOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultsubcode(struct soap *soap)\n{\n\tsoap_fault(soap);\n\tif (soap->version == 2)\n\t{\tif (soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode == NULL)\n\t\t{\tsoap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode = (struct SOAP_ENV__Code*)soap_malloc(soap, sizeof(struct SOAP_ENV__Code));\n\t\t\tsoap_default_SOAP_ENV__Code(soap, soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode);\n\t\t}\n\t\treturn (const char**)(void*)&soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode->SOAP_ENV__Value;\n\t}\n\treturn (const char**)(void*)&soap->fault->faultcode;\n}"); else fprintf(fout, "\n\nSOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultsubcode(struct soap *soap)\n{\n\tsoap_fault(soap);\n\tif (soap->version == 2)\n\t{\tif (soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode == NULL)\n\t\t{\tsoap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode = soap_new_SOAP_ENV__Code(soap);\n\t\t\tsoap_default_SOAP_ENV__Code(soap, soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode);\n\t\t}\n\t\treturn (const char**)(void*)&soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode->SOAP_ENV__Value;\n\t}\n\treturn (const char**)(void*)&soap->fault->faultcode;\n}"); fprintf(fout, "\n\nSOAP_FMAC3 const char * SOAP_FMAC4 soap_check_faultsubcode(struct soap *soap)\n{\n\tsoap_fault(soap);\n\tif (soap->version == 2)\n\t{\tif (soap->fault->SOAP_ENV__Code && soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode)\n\t\t\treturn soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode->SOAP_ENV__Value;\n\t\treturn NULL;\n\t}\n\treturn soap->fault->faultcode;\n}"); fprintf(fout, "\n\nSOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultstring(struct soap *soap)\n{\n\tsoap_fault(soap);\n\tif (soap->version == 2)\n\t\treturn (const char**)(void*)&soap->fault->SOAP_ENV__Reason->SOAP_ENV__Text;\n\treturn (const char**)(void*)&soap->fault->faultstring;\n}"); fprintf(fout, "\n\nSOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultdetail(struct soap *soap)\n{\n\tsoap_fault(soap);"); if (has_Detail_string()) { if (cflag) fprintf(fout, "\n\tif (soap->version == 2)\n\t{\tif (soap->fault->SOAP_ENV__Detail == NULL)\n\t\t{\tsoap->fault->SOAP_ENV__Detail = (struct SOAP_ENV__Detail*)soap_malloc(soap, sizeof(struct SOAP_ENV__Detail));\n\t\t\tsoap_default_SOAP_ENV__Detail(soap, soap->fault->SOAP_ENV__Detail);\n\t\t}\n\t\treturn (const char**)(void*)&soap->fault->SOAP_ENV__Detail->__any;\n\t}"); else fprintf(fout, "\n\tif (soap->version == 2)\n\t{\tif (soap->fault->SOAP_ENV__Detail == NULL)\n\t\t{\tsoap->fault->SOAP_ENV__Detail = soap_new_SOAP_ENV__Detail(soap);\n\t\t\tsoap_default_SOAP_ENV__Detail(soap, soap->fault->SOAP_ENV__Detail);\n\t\t}\n\t\treturn (const char**)(void*)&soap->fault->SOAP_ENV__Detail->__any;\n\t}"); } if (has_detail_string()) { if (cflag) fprintf(fout, "\n\tif (soap->fault->detail == NULL)\n\t{\tsoap->fault->detail = (struct SOAP_ENV__Detail*)soap_malloc(soap, sizeof(struct SOAP_ENV__Detail));\n\t\tsoap_default_SOAP_ENV__Detail(soap, soap->fault->detail);\n\t}\n\treturn (const char**)(void*)&soap->fault->detail->__any;\n}"); else fprintf(fout, "\n\tif (soap->fault->detail == NULL)\n\t{\tsoap->fault->detail = soap_new_SOAP_ENV__Detail(soap);\n\t\tsoap_default_SOAP_ENV__Detail(soap, soap->fault->detail);\n\t}\n\treturn (const char**)(void*)&soap->fault->detail->__any;\n}"); } if (!has_detail_string() && !has_Detail_string()) fprintf(fout, "\n\treturn NULL;\n}"); fprintf(fout, "\n\nSOAP_FMAC3 const char * SOAP_FMAC4 soap_check_faultdetail(struct soap *soap)\n{\n\tsoap_fault(soap);"); if (has_Detail_string()) fprintf(fout, "\n\tif (soap->version == 2 && soap->fault->SOAP_ENV__Detail)\n\t\treturn soap->fault->SOAP_ENV__Detail->__any;"); if (has_detail_string()) fprintf(fout, "\n\tif (soap->fault->detail)\n\t\treturn soap->fault->detail->__any;"); fprintf(fout, "\n\treturn NULL;\n}"); fprintf(fout, "\n\n#endif"); fprintf(fout, "\n\n#ifndef WITH_NOIDREF"); fprintf(fout, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_getindependent(struct soap *soap)\n{"); fprintf(fout, "\n\tint t;\n\tif (soap->version == 1)\n\t{\tfor (;;)\n\t\t{\tif (!soap_getelement(soap, &t))\n\t\t\t\tif ((soap->error && soap->error != SOAP_TAG_MISMATCH) || soap_ignore_element(soap))\n\t\t\t\t\tbreak;\n\t\t}\n\t}"); fprintf(fout, "\n\tif (soap->error == SOAP_NO_TAG || soap->error == SOAP_EOF)"); fprintf(fout, "\n\t\tsoap->error = SOAP_OK;"); fprintf(fout, "\n\treturn soap->error;"); fprintf(fout, "\n}\n#endif"); if (!cflag && !namespaceid) fprintf(fout, "\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif"); fprintf(fout, "\nSOAP_FMAC3 void * SOAP_FMAC4 soap_getelement(struct soap *soap, int *type)\n{\t(void)type;"); fprintf(fout, "\n\tif (soap_peek_element(soap))\n\t\treturn NULL;"); fprintf(fout, "\n#ifndef WITH_NOIDREF\n\tif (!*soap->id || !(*type = soap_lookup_type(soap, soap->id)))\n\t\t*type = soap_lookup_type(soap, soap->href);"); fprintf(fout, "\n\tswitch (*type)\n\t{"); DBGLOG(fprintf(stderr, "\n Calling in_defs( ).")); fflush(fout); in_defs(); DBGLOG(fprintf(stderr, "\n Completed in_defs( ).")); fprintf(fout, "\n\tdefault:\n#else\n\t*type = 0;\n#endif"); fprintf(fout, "\n\t{\tconst char *t = soap->type;\n\t\tif (!*t)\n\t\t\tt = soap->tag;"); fflush(fout); in_defs2(); fprintf(fout, "\n\t\tt = soap->tag;"); in_defs3(); fprintf(fout, "\n#ifndef WITH_NOIDREF\n\t}\n#endif\n\t}\n\tsoap->error = SOAP_TAG_MISMATCH;\n\treturn NULL;\n}"); if (!cflag && !namespaceid) fprintf(fout, "\n\n#ifdef __cplusplus\n}\n#endif"); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_ignore_element(struct soap *soap)\n{"); fprintf(fout, "\n\tif (!soap_peek_element(soap))"); fprintf(fout, "\n\t{\tint t;"); fprintf(fout, "\n\t\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"Unexpected element '%%s' in input (level = %%u, %%d)\\n\", soap->tag, soap->level, soap->body));"); fprintf(fout, "\n\t\tif (soap->mustUnderstand && !soap->other)"); fprintf(fout, "\n\t\t\treturn soap->error = SOAP_MUSTUNDERSTAND;"); /* old code: without option -s required SOAP_XML_STRICT to detect and flag extra elements; fprintf(fout, "\n\t\tif (((soap->mode & SOAP_XML_STRICT) && soap->part != SOAP_IN_HEADER) || !soap_match_tag(soap, soap->tag, \"SOAP-ENV:\"))\n\t\t{\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"REJECTING element '%%s'\\n\", soap->tag));\n\t\t\treturn soap->error = SOAP_TAG_MISMATCH;\n\t\t}"); */ fprintf(fout, "\n\t\tif ((%ssoap->part != SOAP_IN_HEADER) || !soap_match_tag(soap, soap->tag, \"SOAP-ENV:\"))\n\t\t{\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"REJECTING element '%%s'\\n\", soap->tag));\n\t\t\treturn soap->error = SOAP_TAG_MISMATCH;\n\t\t}", strict_check()); fprintf(fout, "\n\t\tif (!*soap->id || !soap_getelement(soap, &t))"); fprintf(fout, "\n\t\t{\tsoap->peeked = 0;"); fprintf(fout, "\n\t\t\tif (soap->fignore)\n\t\t\t\tsoap->error = soap->fignore(soap, soap->tag);\n\t\t\telse\n\t\t\t\tsoap->error = SOAP_OK;"); fprintf(fout, "\n\t\t\tDBGLOG(TEST, if (!soap->error) SOAP_MESSAGE(fdebug, \"IGNORING element '%%s'\\n\", soap->tag));"); fprintf(fout, "\n\t\t\tif (!soap->error && soap->body)"); fprintf(fout, "\n\t\t\t{\tsoap->level++;"); fprintf(fout, "\n\t\t\t\twhile (!soap_ignore_element(soap))"); fprintf(fout, "\n\t\t\t\t\t;"); fprintf(fout, "\n\t\t\t\tif (soap->error == SOAP_NO_TAG)"); fprintf(fout, "\n\t\t\t\t\tsoap->error = soap_element_end_in(soap, NULL);"); fprintf(fout, "\n\t\t\t}"); fprintf(fout, "\n\t\t}"); fprintf(fout, "\n\t}"); fprintf(fout, "\n\treturn soap->error;"); fprintf(fout, "\n}"); fprintf(fout, "\n\n#ifndef WITH_NOIDREF"); fprintf(fout, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_putindependent(struct soap *soap)\n{\n\tint i;\n\tstruct soap_plist *pp;"); fprintf(fout, "\n\tif (soap->version == 1 && soap->encodingStyle && !(soap->mode & (SOAP_XML_TREE | SOAP_XML_GRAPH)))"); fprintf(fout, "\n\t\tfor (i = 0; i < SOAP_PTRHASH; i++)"); fprintf(fout, "\n\t\t\tfor (pp = soap->pht[i]; pp; pp = pp->next)"); fprintf(fout, "\n\t\t\t\tif (pp->mark1 == 2 || pp->mark2 == 2)"); fprintf(fout, "\n\t\t\t\t\tif (soap_putelement(soap, pp->ptr, SOAP_MULTIREFTAG, pp->id, pp->type))\n\t\t\t\t\t\treturn soap->error;"); fprintf(fout, "\n\treturn SOAP_OK;\n}\n#endif"); if (!cflag && !namespaceid) fprintf(fout, "\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif"); fprintf(fout, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_putelement(struct soap *soap, const void *ptr, const char *tag, int id, int type)\n{\t(void)tag;"); fprintf(fout, "\n\tswitch (type)\n\t{"); fflush(fout); out_defs(); fprintf(fout, "\n\t}\n\treturn SOAP_OK;\n}"); if (!cflag && !namespaceid) fprintf(fout, "\n#ifdef __cplusplus\n}\n#endif"); fprintf(fout, "\n\n#ifndef WITH_NOIDREF"); if (!cflag && !namespaceid) fprintf(fout, "\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif"); if (is_anytype_flag) { fprintf(fout, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_markelement(struct soap *soap, const void *ptr, int type)\n{"); fprintf(fout, "\n\t(void)soap; (void)ptr; (void)type; /* appease -Wall -Werror */"); fprintf(fout, "\n\tswitch (type)\n\t{"); fflush(fout); mark_defs(); fprintf(fout, "\n\t}\n}"); } else { fprintf(fout, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_markelement(struct soap *soap, const void *ptr, int type)\n{"); fprintf(fout, "\n\t(void)soap; (void)ptr; (void)type; /* appease -Wall -Werror */"); fprintf(fout, "\n}"); } if (!cflag && !namespaceid) fprintf(fout, "\n#ifdef __cplusplus\n}\n#endif"); fprintf(fout, "\n#endif"); if (Ecflag) { if (!cflag && !namespaceid) fprintf(fout, "\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif"); fprintf(fout, "\n\nSOAP_FMAC3 void * SOAP_FMAC4 soap_dupelement(struct soap *soap, const void *ptr, int type)\n{"); fprintf(fout, "\n\tswitch (type)\n\t{"); fflush(fout); dup_defs(); fprintf(fout, "\n\t}\n\treturn NULL;\n}"); if (!cflag && !namespaceid) fprintf(fout, "\n#ifdef __cplusplus\n}\n#endif"); } if (Edflag) { if (!cflag && !namespaceid) fprintf(fout, "\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif"); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_delelement(const void *ptr, int type)\n{"); fprintf(fout, "\n\tswitch (type)\n\t{"); fflush(fout); del_defs(); fprintf(fout, "\n\t}\n}"); if (!cflag && !namespaceid) fprintf(fout, "\n#ifdef __cplusplus\n}\n#endif"); } } if (!cflag) { fprintf(fhead, "\nSOAP_FMAC3 void * SOAP_FMAC4 %s_instantiate(struct soap*, int, const char*, const char*, size_t*);", prefix); fprintf(fout, "\n\nSOAP_FMAC3 void * SOAP_FMAC4 %s_instantiate(struct soap *soap, int t, const char *type, const char *arrayType, size_t *n)\n{\t(void)type;\n\tswitch (t)\n\t{", prefix); if (classtable) { for (p = classtable->list; p; p = p->next) { if ((p->info.typ->type == Tclass || p->info.typ->type == Tstruct) && !is_transient(p->info.typ)) { if (is_header_or_fault(p->info.typ) || is_body(p->info.typ)) fprintf(fout, "\n#ifndef WITH_NOGLOBAL"); fprintf(fout, "\n\tcase %s:\n\t\treturn (void*)soap_instantiate_%s(soap, -1, type, arrayType, n);", soap_type(p->info.typ), c_ident(p->info.typ)); if (is_header_or_fault(p->info.typ) || is_body(p->info.typ)) fprintf(fout, "\n#endif"); } } } if (typetable) { for (p = typetable->list; p; p = p->next) { if ((p->info.typ->type == Tclass || p->info.typ->type == Tstruct) && !is_transient(p->info.typ)) { if (is_header_or_fault(p->info.typ) || is_body(p->info.typ)) fprintf(fout, "\n#ifndef WITH_NOGLOBAL"); fprintf(fout, "\n\tcase %s:\n\t\treturn (void*)soap_instantiate_%s(soap, -1, type, arrayType, n);", soap_type(p->info.typ), c_ident(p->info.typ)); if (is_header_or_fault(p->info.typ) || is_body(p->info.typ)) fprintf(fout, "\n#endif"); } } } for (typ = Tptr[Ttemplate]; typ; typ = typ->next) if (typ->ref && !is_transient(typ)) fprintf(fout, "\n\tcase %s:\n\t\treturn (void*)soap_instantiate_%s(soap, -1, type, arrayType, n);", soap_type(typ), c_ident(typ)); fprintf(fout, "\n\t}\n\treturn NULL;\n}"); fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 %s_fdelete(struct soap_clist*);", prefix); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 %s_fdelete(struct soap_clist *p)", prefix); fprintf(fout, "\n{\tswitch (p->type)\n\t{"); if (classtable) { for (p = classtable->list; p; p = p->next) { if ((p->info.typ->type == Tclass || p->info.typ->type == Tstruct) && !is_transient(p->info.typ)) { if (is_header_or_fault(p->info.typ) || is_body(p->info.typ)) fprintf(fout, "\n#ifndef WITH_NOGLOBAL"); fprintf(fout, "\n\tcase %s:", soap_type(p->info.typ)); fprintf(fout, "\n\t\tif (p->size < 0)\n\t\t\tSOAP_DELETE(static_cast<%s*>(p->ptr));\n\t\telse\n\t\t\tSOAP_DELETE_ARRAY(static_cast<%s*>(p->ptr));\n\t\tbreak;", c_type(p->info.typ), c_type(p->info.typ)); if (is_header_or_fault(p->info.typ) || is_body(p->info.typ)) fprintf(fout, "\n#endif"); } } } if (typetable) { for (p = typetable->list; p; p = p->next) if (p->info.typ->type == Tclass || p->info.typ->type == Tstruct) /* && is_external(p->info.typ)) */ { if (is_header_or_fault(p->info.typ) || is_body(p->info.typ)) fprintf(fout, "\n#ifndef WITH_NOGLOBAL"); fprintf(fout, "\n\tcase %s:", soap_type(p->info.typ)); fprintf(fout, "\n\t\tif (p->size < 0)\n\t\t\tSOAP_DELETE(static_cast<%s*>(p->ptr));\n\t\telse\n\t\t\tSOAP_DELETE_ARRAY(static_cast<%s*>(p->ptr));\n\t\tbreak;", c_type(p->info.typ), c_type(p->info.typ)); if (is_header_or_fault(p->info.typ) || is_body(p->info.typ)) fprintf(fout, "\n#endif"); } } for (typ = Tptr[Ttemplate]; typ; typ = typ->next) { if (typ->ref && !is_transient(typ)) { fprintf(fout, "\n\tcase %s:", soap_type(typ)); fprintf(fout, "\n\t\tif (p->size < 0)\n\t\t\tSOAP_DELETE(static_cast<%s*>(p->ptr));\n\t\telse\n\t\t\tSOAP_DELETE_ARRAY(static_cast<%s*>(p->ptr));\n\t\tbreak;", c_type(typ), c_type(typ)); } } fprintf(fout, "\n\tdefault:\n\t\treturn SOAP_ERR;"); fprintf(fout, "\n\t}\n\treturn SOAP_OK;"); fprintf(fout, "\n}"); fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 %s_fbase(int, int);", prefix); fprintf(fout, "\n\n#ifdef WIN32\n#pragma warning(push)\n// do not warn on switch w/o cases\n#pragma warning(disable:4065)\n#endif"); fprintf(fout, "\nSOAP_FMAC3 int SOAP_FMAC4 %s_fbase(int t, int b)", prefix); fprintf(fout, "\n{\n\tdo\n\t{\tswitch (t)\n\t\t{"); if (classtable) { for (p = classtable->list; p; p = p->next) { if ((p->info.typ->type == Tclass || p->info.typ->type == Tstruct) && p->info.typ->base && !is_transient(p->info.typ)) { Entry *e = entry(classtable, p->info.typ->base); if (e && !is_transient(e->info.typ)) fprintf(fout, "\n\t\tcase %s: t = %s; break;", soap_type(p->info.typ), soap_type(e->info.typ)); } } } fprintf(fout, "\n\t\tdefault: return 0;\n\t\t}\n\t}\n\twhile (t != b);\n\treturn 1;\n}"); fprintf(fout, "\n#ifdef WIN32\n#pragma warning(pop)\n#endif"); if (Tptr[Ttemplate] || classtable) { fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 %s_finsert(struct soap*, int, int, void*, size_t, const void*, void**);", prefix); if (!lflag) { fprintf(fout, "\n\n#ifndef WITH_NOIDREF"); fprintf(fout, "\n#ifdef WIN32\n#pragma warning(push)\n// do not warn on switch w/o cases\n#pragma warning(disable:4065)\n#endif"); fprintf(fout, "\nSOAP_FMAC3 void SOAP_FMAC4 %s_finsert(struct soap *soap, int t, int tt, void *p, size_t index, const void *q, void **x)", prefix); fprintf(fout, "\n{\n\t(void)soap; (void)t; (void)p; (void)index; (void)q; (void)x; /* appease -Wall -Werror */"); fprintf(fout, "\n\tswitch (tt)\n\t{"); for (typ = Tptr[Ttemplate]; typ; typ = typ->next) { if (typ->ref && !is_transient(typ)) { fprintf(fout, "\n\tcase %s:", soap_type(typ)); if (is_smart(typ)) { if (is_smart_shared(typ)) { fprintf(fout, "\n\t\tif (t == %s)\n\t\t{\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"Smart pointer %s type=%%d location=%%p object=%%p\\n\", t, p, q));\n\t\t\tif (!*x)\n\t\t\t\t*(%s)(*x = (void*)p) = %s<%s>(**(%s)q);", soap_type(reftype(typ->ref)), c_type(typ), c_type_id(typ, "*"), make_shared(typ), c_type(typ->ref), c_type_id(typ->ref, "**")); fprintf(fout, "\n\t\t\telse\n\t\t\t\t*(%s)p = *(%s)(*x);", c_type_id(typ, "*"), c_type_id(typ, "*")); } else { fprintf(fout, "\n\t\tif (t == %s)\n\t\t{\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"Smart pointer %s type=%%d location=%%p object=%%p\\n\", t, p, q));", soap_type(reftype(typ->ref)), c_type(typ)); fprintf(fout, "\n\t\t\t*(*(%s)p = %s(SOAP_NEW(%s))) = **(%s)q;", c_type_id(typ, "*"), c_type(typ), c_type(typ->ref), c_type_id(typ->ref, "**")); } } else { Tnode *ref = (Tnode*)typ->ref; if (is_smart(ref) && strcmp(typ->id->name, "std::set")) { fprintf(fout, "\n\t\tif (t == %s)\n\t\t{\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"Container %s insert type=%%d in %%d location=%%p object=%%p at index=%%lu\\n\", t, tt, p, q, (unsigned long)index));", soap_type(reftype(ref)), c_type(typ)); if (!strcmp(ref->id->name, "std::vector") || !strcmp(ref->id->name, "std::deque")) fprintf(fout, "\n\t\t\t%s::iterator i = ((%s)p)->begin() + index;", c_type(typ), c_type_id(typ, "*")); else fprintf(fout, "\n\t\t\t%s::iterator i = ((%s)p)->begin();\n\t\t\twhile (index--)\n\t\t\t\t++i;", c_type(typ), c_type_id(typ, "*")); if (is_smart_shared(ref)) fprintf(fout, "\n\t\t\tif (!*x)\n\t\t\t\t*(%s)(*x = &*i) = %s<%s>(**(%s)q);\n\t\t\telse\n\t\t\t\t*i = *(%s)*x;", c_type_id(ref, "*"), make_shared(ref), c_type(ref->ref), c_type_id(ref->ref, "**"), c_type_id(ref, "*")); else fprintf(fout, "\n\t\t\t*(*i = %s(SOAP_NEW(%s))) = **(%s)q;", c_type(ref), c_type(ref->ref), c_type_id(ref->ref, "**")); } else { fprintf(fout, "\n\t\tif (t == %s)\n\t\t{\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"Container %s insert type=%%d in %%d location=%%p object=%%p at index=%%lu\\n\", t, tt, p, q, (unsigned long)index));", soap_type(reftype(ref)), c_type(typ)); if (!strcmp(typ->id->name, "std::vector") || !strcmp(typ->id->name, "std::deque")) fprintf(fout, "\n\t\t\t(*(%s)p)[index] = *(%s)q;", c_type_id(typ, "*"), c_type_id(ref, "*")); else if (!strcmp(typ->id->name, "std::set")) fprintf(fout, "\n\t\t\t((%s)p)->insert(*(%s)q);", c_type_id(typ, "*"), c_type_id(ref, "*")); else fprintf(fout, "\n\t\t\t%s::iterator i = ((%s)p)->begin();\n\t\t\twhile (index--)\n\t\t\t\t++i;\n\t\t\t*i = *(%s)q;", c_type(typ), c_type_id(typ, "*"), c_type_id(ref, "*")); } } fprintf(fout, "\n\t\t}\n\t\tbreak;"); } } if (classtable) { for (p = classtable->list; p; p = p->next) { if (!is_transient(p->info.typ)) { if (is_header_or_fault(p->info.typ) || is_body(p->info.typ)) fprintf(fout, "\n#ifndef WITH_NOGLOBAL"); fprintf(fout, "\n\tcase %s:", soap_type(p->info.typ)); fprintf(fout, "\n\t\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"Copy %s type=%%d location=%%p object=%%p\\n\", t, p, q));", c_type(p->info.typ)); fprintf(fout, "\n\t\t*(%s*)p = *(%s*)q;\n\t\tbreak;", c_type(p->info.typ), c_type(p->info.typ)); if (is_header_or_fault(p->info.typ) || is_body(p->info.typ)) fprintf(fout, "\n#endif"); } } } if (typetable) { for (p = typetable->list; p; p = p->next) { if ((p->info.typ->type == Tclass || p->info.typ->type == Tstruct) && !is_transient(p->info.typ)) { if (is_header_or_fault(p->info.typ) || is_body(p->info.typ)) fprintf(fout, "\n#ifndef WITH_NOGLOBAL"); fprintf(fout, "\n\tcase %s:", soap_type(p->info.typ)); fprintf(fout, "\n\t\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"Copy %s type=%%d location=%%p object=%%p\\n\", t, p, q));", c_type(p->info.typ)); fprintf(fout, "\n\t\t*(%s*)p = *(%s*)q;\n\t\tbreak;", c_type(p->info.typ), c_type(p->info.typ)); if (is_header_or_fault(p->info.typ) || is_body(p->info.typ)) fprintf(fout, "\n#endif"); } } } fprintf(fout, "\n\tdefault:\n\t\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"Could not insert type = %%d in %%d\\n\", t, tt));"); fprintf(fout, "\n\t}"); fprintf(fout, "\n}"); fprintf(fout, "\n#ifdef WIN32\n#pragma warning(pop)\n#endif"); fprintf(fout, "\n#endif"); } } } } generate_defs(); if (namespaceid) fprintf(fout, "\n\n} // namespace %s\n", namespaceid); if (cflag) fprintf(fout, "\n\n#ifdef __cplusplus\n}\n#endif"); fprintf(fout, "\n\n#if defined(__BORLANDC__)"); fprintf(fout, "\n#pragma option pop"); fprintf(fout, "\n#pragma option pop"); fprintf(fout, "\n#endif"); fprintf(fout, "\n\n/* End of %s */\n", soapC); fclose(fout); } if (namespaceid) fprintf(fhead, "\n\n} // namespace %s\n", namespaceid); if (cflag) fprintf(fhead, "\n\n#ifdef __cplusplus\n}\n#endif"); fprintf(fhead, "\n\n#endif"); fprintf(fhead, "\n\n/* End of %s */\n", soapH); fclose(fhead); if (namespaceid) fprintf(fheader, "\n\n} // namespace %s\n", namespaceid); if (cflag) fprintf(fheader, "\n\n#ifdef __cplusplus\n}\n#endif"); fprintf(fheader, "\n\n#endif"); fprintf(fheader, "\n\n/* End of %s */\n", soapStub); fclose(fheader); if (mflag) { DBGLOG(fprintf(stderr, "\n Calling matlab_def_table( ).")); matlab_def_table(table); DBGLOG(fprintf(stderr, "\n Completed matlab_def_table( ).")); fclose(fmatlab); fclose(fmheader); } if (!Sflag && !iflag && !jflag) { if (namespaceid) fprintf(fclient, "\n\n} // namespace %s\n", namespaceid); if (cflag) fprintf(fclient, "\n\n#ifdef __cplusplus\n}\n#endif"); fprintf(fclient, "\n\n#if defined(__BORLANDC__)"); fprintf(fclient, "\n#pragma option pop"); fprintf(fclient, "\n#pragma option pop"); fprintf(fclient, "\n#endif"); fprintf(fclient, "\n\n/* End of %s */\n", soapClient); fclose(fclient); } if (!Cflag && !iflag && !jflag) { if (namespaceid) fprintf(fserver, "\n\n} // namespace %s\n", namespaceid); if (cflag) fprintf(fserver, "\n\n#ifdef __cplusplus\n}\n#endif"); fprintf(fserver, "\n\n#if defined(__BORLANDC__)"); fprintf(fserver, "\n#pragma option pop"); fprintf(fserver, "\n#pragma option pop"); fprintf(fserver, "\n#endif"); fprintf(fserver, "\n\n/* End of %s */\n", soapServer); fclose(fserver); } } void gen_class(FILE *fd, Entry *p) { Entry *Eptr; Tnode *typ = p->info.typ; const char *x; if (!typ->ref) { if (!is_transient(typ) && !is_external(typ) && !is_volatile(typ)) { sprintf(errbuf, "%s declared in %s:%d has no content", c_type(typ), p->filename, p->lineno); semwarn(errbuf); } return; } x = xsi_type(typ); if (!x || !*x) x = wsdl_type(typ, ""); fprintf(fd, "\n\n/* %s:%d */", p->filename, p->lineno); if (is_header_or_fault(typ) || is_body(typ)) fprintf(fd, "\n#ifndef WITH_NOGLOBAL"); fprintf(fd, "\n#ifndef %s", soap_type(typ)); fprintf(fd, "\n#define %s (%d)\n", soap_type(typ), typ->num); if (typ->recursive) fprintf(fd, "/* Type %s is a recursive data type (in)directly referencing itself through its (base) class members */\n", typ->id->name); if (is_volatile(typ)) fprintf(fd, "#if 0 /* Volatile: not declared here because it is declared already in a library or in other parts of the user's project */\n"); else if (is_transient(typ)) fprintf(fd, "/* Transient type: */\n"); else if (is_invisible(typ->id->name)) fprintf(fd, "/* Operation wrapper: */\n"); else if (is_hexBinary(typ)) fprintf(fd, "/* hexBinary schema type: */\n"); else if (is_binary(typ)) fprintf(fd, "/* base64Binary schema type: */\n"); else if (is_discriminant(typ)) fprintf(fd, "/* Choice: */\n"); else if (is_dynamic_array(typ)) { Eptr = ((Table*)typ->ref)->list; if (has_ns(typ) || is_untyped(typ)) fprintf(fd, "/* Sequence of %s schema type: */\n", x); else { if (!eflag && soap_version >= 0) { sprintf(errbuf, "using SOAP encoded array '%s' is not compliant with WS-I Basic Profile 1.0a", c_type(typ)); compliancewarn(errbuf); } fprintf(fd, "/* SOAP encoded array of %s schema type: */\n", x); } } else if (is_primclass(typ)) fprintf(fd, "/* %s simple type: */\n", x); else if (!strcmp(typ->id->name, "SOAP_ENV__Header")) fprintf(fd, "/* SOAP Header: */\n"); else if (!strcmp(typ->id->name, "SOAP_ENV__Fault")) fprintf(fd, "/* SOAP Fault: */\n"); else if (!strcmp(typ->id->name, "SOAP_ENV__Code")) fprintf(fd, "/* SOAP Fault Code: */\n"); else if (x && *x) fprintf(fd, "/* %s complex type: */\n", x); fflush(fd); if (typ->type == Tstruct) { int permission = -1; int flag = 0; DBGLOG(fprintf(stderr, "\nstruct %s\n", typ->id->name)); fprintf(fd, "struct %s\n{", ident(typ->id->name)); for (Eptr = ((Table*)typ->ref)->list; Eptr; Eptr = Eptr->next) { if (!cflag && permission != (Eptr->info.sto & (Sprivate | Sprotected))) { if (Eptr->info.sto & Sprivate) fprintf(fd, "\nprivate:"); else if (Eptr->info.sto & Sprotected) fprintf(fd, "\nprotected:"); else fprintf(fd, "\npublic:"); permission = (Eptr->info.sto & (Sprivate | Sprotected)); } if (cflag && Eptr->info.typ->type == Tfun) continue; if (cflag && (Eptr->info.sto & Stypedef)) continue; fprintf(fd, "\n\t%s", c_storage(Eptr->info.sto)); /*if (Eptr->info.typ->type == Tclass && !is_external(Eptr->info.typ) && Eptr->info.typ->classed == False || (Eptr->info.typ->type == Tpointer || Eptr->info.typ->type == Treference || Eptr->info.typ->type == Trvalueref) && Eptr->info.typ->ref && ((Tnode*)Eptr->info.typ->ref)->type == Tclass && !is_external(Eptr->info.typ->ref) && ((Tnode*)Eptr->info.typ->ref)->classed == False) fprintf(fd, "class "); */ if (Eptr->sym == typ->id && Eptr->info.typ->type == Tfun) /* to emit constructor in a struct: constructor has no return value */ ((FNinfo*)Eptr->info.typ->ref)->ret = mknone(); fprintf(fd, "%s", c_type_id(Eptr->info.typ, Eptr->sym->name)); if (Eptr->info.sto & Sconstobj) fprintf(fd, " const"); if (Eptr->info.sto & Sfinal) fprintf(fd, " final"); if (Eptr->info.sto & Soverride) fprintf(fd, " override"); if (Eptr->info.sto & Sconst) fprintf(fd, "%s;", c_init(Eptr)); else fprintf(fd, ";"); if (Eptr->info.sto & Sreturn) fprintf(fd, "\t/* SOAP 1.2 RPC return element (when namespace qualified) */"); if (is_external(Eptr->info.typ)) fprintf(fd, "\t/* external (custom serializer) */"); if (is_transient(Eptr->info.typ)) fprintf(fd, "\t/* transient (not serialized) */"); if (is_imported(Eptr->info.typ)) fprintf(fd, "\t/* type imported from %s */", Eptr->info.typ->imported); if (Eptr->info.sto & Sattribute) { if (Eptr->info.minOccurs >= 1) fprintf(fd, "\t/* required attribute of XSD type %s */", wsdl_type(Eptr->info.typ, "")); else fprintf(fd, "\t/* optional attribute of XSD type %s */", wsdl_type(Eptr->info.typ, "")); } if (flag) flag = 0; else if (Eptr->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fd, "\t/* not serialized */"); else if (Eptr->info.sto & SmustUnderstand) fprintf(fd, "\t/* mustUnderstand */"); else if (!is_dynamic_array(typ) && is_repetition(Eptr)) { if (Eptr->info.maxOccurs > 1) fprintf(fd, "\t/* sequence of " SOAP_LONG_FORMAT " to " SOAP_LONG_FORMAT " elements <%s> of XSD type %s */", Eptr->info.minOccurs, Eptr->info.maxOccurs, ns_convert(Eptr->next->sym->name), wsdl_type(Eptr->next->info.typ, "")); else fprintf(fd, "\t/* sequence of elements <%s> of XSD type %s */", ns_convert(Eptr->next->sym->name), wsdl_type(Eptr->next->info.typ, "")); flag = 1; } else if (is_anytype(Eptr)) { fprintf(fd, "\t/* any type of element <%s> (defined below)\n\t WARNING: do not create a cyclic data structure graph throught this element unless SOAP encoding or SOAP_XML_GRAPH are used for id-ref serialization */", ns_convert(Eptr->next->sym->name)); flag = 1; } else if (is_choice(Eptr)) { fprintf(fd, "\t/* union discriminant (of union defined below) */"); flag = 1; } else if (is_anyType(Eptr->info.typ)) fprintf(fd, "\t/* DOM content */"); else if (is_item(Eptr)) fprintf(fd, "\t/* mixed XML content */"); else if (Eptr->info.typ->type != Tfun && Eptr->info.typ->type != Tunion && !(Eptr->info.sto & (Sconst | Sprivate | Sprotected)) && !(Eptr->info.sto & Sattribute) && !is_transient(Eptr->info.typ) && !is_external(Eptr->info.typ) && strncmp(Eptr->sym->name, "__", 2)) { if (Eptr->info.maxOccurs > 1) fprintf(fd, "\t/* sequence of " SOAP_LONG_FORMAT " to " SOAP_LONG_FORMAT " elements of XSD type %s */", Eptr->info.minOccurs, Eptr->info.maxOccurs, wsdl_type(Eptr->info.typ, "")); else if (Eptr->info.minOccurs >= 1) fprintf(fd, "\t/* required element of XSD type %s */", wsdl_type(Eptr->info.typ, "")); else fprintf(fd, "\t/* optional element of XSD type %s */", wsdl_type(Eptr->info.typ, "")); } if (!is_dynamic_array(typ) && !is_primclass(typ)) { if ((Eptr->info.typ->type == Tint || Eptr->info.typ->type == Tsize) && !strncmp(Eptr->sym->name, "__size", 6)) { if (!Eptr->next || (Eptr->next->info.typ->type != Tpointer && !is_smart(Eptr->next->info.typ))) { sprintf(errbuf, "Member field '%s' is not followed by a pointer member field in struct '%s'", Eptr->sym->name, typ->id->name); semwarn(errbuf); } } else if (Eptr->info.typ->type == Tint && !strncmp(Eptr->sym->name, "__type", 6)) { if (!Eptr->next || ((Eptr->next->info.typ->type != Tpointer || ((Tnode*)Eptr->next->info.typ->ref)->type != Tvoid))) { sprintf(errbuf, "Member field '%s' is not followed by a void pointer member field in struct '%s'", Eptr->sym->name, typ->id->name); semwarn(errbuf); } } else if (Eptr->info.typ->type == Tint && !strncmp(Eptr->sym->name, "__union", 7)) { if (!Eptr->next || ((Eptr->next->info.typ->type != Tunion))) { sprintf(errbuf, "Member field '%s' is not followed by a union member field in struct '%s'", Eptr->sym->name, typ->id->name); semwarn(errbuf); } } else if ((Eptr->info.typ->type == Tint || Eptr->info.typ->type == Tsize) && (Eptr->info.sto & Sspecial)) { if (!Eptr->next || (Eptr->next->info.typ->type != Tpointer && !is_smart(Eptr->next->info.typ) && (Eptr->next->info.typ->type != Tunion))) { sprintf(errbuf, "Member field '%s' is not followed by a pointer or union member field in struct '%s'", Eptr->sym->name, typ->id->name); semwarn(errbuf); } } } } if (!cflag && !is_transient(typ) && !is_volatile(typ)) { fprintf(fd, "\npublic:\n\tint soap_type() const { return %d; } /* = unique type id %s */", typ->num, soap_type(typ)); if ((x = union_member(typ))) { sprintf(errbuf, "struct '%s' cannot be assigned a default constructor because it is used as a member of union '%s'", typ->id->name, ident(x)); semwarn(errbuf); } else { if (!has_constructor(typ)) { Table *t; Entry *p; fprintf(fd, "\n\t %s();", ident(typ->id->name)); for (t = (Table*)typ->ref; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.typ->type == Treference || p->info.typ->type == Trvalueref) { sprintf(errbuf, "no constructor for '%s' to explicitly initialize the reference member '%s'", typ->id->name, p->sym->name); semwarn(errbuf); } } } } /* not necessary to add a default destructor, C -> C++ transparency of structs if (!has_destructor(typ)) fprintf(fd, "\n\t ~%s() { }", ident(typ->id->name)); */ } if (Ecflag) fprintf(fd, "\n\tfriend SOAP_FMAC1 %s * SOAP_FMAC2 soap_dup_%s(struct soap*, %s*, %s);", c_type(typ), c_ident(typ), c_type(typ), c_type_constptr_id(typ, "const*")); if (Edflag) fprintf(fd, "\n\tfriend SOAP_FMAC1 void SOAP_FMAC2 soap_del_%s(%s);", c_ident(typ), c_type_constptr_id(typ, "const*")); fprintf(fd, "\n\tfriend SOAP_FMAC1 %s * SOAP_FMAC2 soap_instantiate_%s(struct soap*, int, const char*, const char*, size_t*);", c_ident(typ), c_ident(typ)); } if (!((Table*)typ->ref)->list) { if (cflag) fprintf(fd, "\n#ifdef WITH_NOEMPTYSTRUCT\n\tchar dummy;\t/* empty struct is a GNU extension */\n#endif"); } fprintf(fd, "\n};"); } else if (typ->type == Tclass) { int permission = -1; int flag = 0; DBGLOG(fprintf(stderr, "\nclass %s\n", typ->id->name)); fprintf(fd, "class SOAP_CMAC %s", ident(typ->id->name)); if (typ->base) fprintf(fd, " : public %s", ident(typ->base->name)); fprintf(fd, "\n{"); for (Eptr = ((Table*)typ->ref)->list; Eptr; Eptr = Eptr->next) { if (permission != (Eptr->info.sto & (Sprivate | Sprotected))) { if (Eptr->info.sto & Sprivate) fprintf(fd, "\nprivate:"); else if (Eptr->info.sto & Sprotected) fprintf(fd, "\nprotected:"); else fprintf(fd, "\npublic:"); permission = (Eptr->info.sto & (Sprivate | Sprotected)); } fprintf(fd, "\n\t%s", c_storage(Eptr->info.sto)); /* if (Eptr->info.typ->type == Tclass && !is_external(Eptr->info.typ) && Eptr->info.typ->classed == False || (Eptr->info.typ->type == Tpointer || Eptr->info.typ->type == Treference || Eptr->info.typ->type == Trvalueref) && Eptr->info.typ->ref && ((Tnode*)Eptr->info.typ->ref)->type == Tclass && !is_external(Eptr->info.typ->ref) && ((Tnode*)Eptr->info.typ->ref)->classed == False) fprintf(fd, "class "); */ fprintf(fd, "%s", c_type_id(Eptr->info.typ, Eptr->sym->name)); if (Eptr->info.sto & Sconstobj) fprintf(fd, " const"); if (Eptr->info.sto & Sfinal) fprintf(fd, " final"); if (Eptr->info.sto & Soverride) fprintf(fd, " override"); if (Eptr->info.sto & Sabstract) fprintf(fd, " = 0;"); else if (Eptr->info.sto & Sconst) fprintf(fd, "%s;", c_init(Eptr)); else fprintf(fd, ";"); if (Eptr->info.sto & Sreturn) fprintf(fd, "\t/* SOAP 1.2 RPC return element (when namespace qualified) */"); if (is_external(Eptr->info.typ)) fprintf(fd, "\t/* external (custom serializer) */"); if (Eptr->info.typ->type != Tfun && is_transient(Eptr->info.typ)) fprintf(fd, "\t/* transient (not serialized) */"); if (is_imported(Eptr->info.typ)) fprintf(fd, "\t/* type imported from %s */", Eptr->info.typ->imported); if (Eptr->info.sto & Sattribute) { if (Eptr->info.minOccurs >= 1) fprintf(fd, "\t/* required attribute of XSD type %s */", wsdl_type(Eptr->info.typ, "")); else fprintf(fd, "\t/* optional attribute of XSD type %s */", wsdl_type(Eptr->info.typ, "")); } if (flag) flag = 0; else if (Eptr->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fd, "\t/* not serialized */"); else if (Eptr->info.sto & SmustUnderstand) fprintf(fd, "\t/* mustUnderstand */"); else if (!is_dynamic_array(typ) && is_repetition(Eptr)) { if (Eptr->info.maxOccurs > 1) fprintf(fd, "\t/* sequence of " SOAP_LONG_FORMAT " to " SOAP_LONG_FORMAT " elements of XSD type %s */", Eptr->info.minOccurs, Eptr->info.maxOccurs, wsdl_type(Eptr->info.typ, "")); else if (Eptr->info.maxOccurs > 1) fprintf(fd, "\t/* sequence of " SOAP_LONG_FORMAT " to " SOAP_LONG_FORMAT " elements <%s> of XSD type %s */", Eptr->info.minOccurs, Eptr->info.maxOccurs, ns_convert(Eptr->next->sym->name), wsdl_type(Eptr->next->info.typ, "")); else fprintf(fd, "\t/* sequence of elements <%s> of XSD type %s */", ns_convert(Eptr->next->sym->name), wsdl_type(Eptr->next->info.typ, "")); flag = 1; } else if (is_anytype(Eptr)) { fprintf(fd, "\t/* any type of element <%s> (defined below)\n\t WARNING: do not create a cyclic data structure graph throught this element unless SOAP encoding or SOAP_XML_GRAPH are used for id-ref serialization */", ns_convert(Eptr->next->sym->name)); flag = 1; } else if (is_choice(Eptr)) { fprintf(fd, "\t/* union discriminant (of union defined below) */"); flag = 1; } else if (is_anyType(Eptr->info.typ)) fprintf(fd, "\t/* DOM content */"); else if (is_item(Eptr)) fprintf(fd, "\t/* mixed XML content */"); else if (Eptr->info.typ->type != Tfun && Eptr->info.typ->type != Tunion && !(Eptr->info.sto & (Sconst | Sprivate | Sprotected)) && !(Eptr->info.sto & Sattribute) && !is_transient(Eptr->info.typ) && !is_external(Eptr->info.typ) && strncmp(Eptr->sym->name, "__", 2)) { if (Eptr->info.minOccurs >= 1) fprintf(fd, "\t/* required element of XSD type %s */", wsdl_type(Eptr->info.typ, "")); else fprintf(fd, "\t/* optional element of XSD type %s */", wsdl_type(Eptr->info.typ, "")); } if (!is_dynamic_array(typ) && !is_primclass(typ)) { if ((Eptr->info.typ->type == Tint || Eptr->info.typ->type == Tsize) && !strncmp(Eptr->sym->name, "__size", 6)) { if (!Eptr->next || (Eptr->next->info.typ->type != Tpointer && !is_smart(Eptr->next->info.typ))) { sprintf(errbuf, "Member field '%s' is not followed by a pointer member field in class '%s'", Eptr->sym->name, typ->id->name); semwarn(errbuf); } } else if (Eptr->info.typ->type == Tint && !strncmp(Eptr->sym->name, "__type", 6)) { if (!Eptr->next || ((Eptr->next->info.typ->type != Tpointer || ((Tnode*)Eptr->next->info.typ->ref)->type != Tvoid))) { sprintf(errbuf, "Member field '%s' is not followed by a void pointer member field in class '%s'", Eptr->sym->name, typ->id->name); semwarn(errbuf); } } else if (Eptr->info.typ->type == Tint && !strncmp(Eptr->sym->name, "__union", 7)) { if (!Eptr->next || ((Eptr->next->info.typ->type != Tunion))) { sprintf(errbuf, "Member field '%s' is not followed by a union member field in class '%s'", Eptr->sym->name, typ->id->name); semwarn(errbuf); } } else if ((Eptr->info.typ->type == Tint || Eptr->info.typ->type == Tsize) && (Eptr->info.sto & Sspecial)) { if (!Eptr->next || (Eptr->next->info.typ->type != Tpointer && !is_smart(Eptr->next->info.typ) && (Eptr->next->info.typ->type != Tunion))) { sprintf(errbuf, "Member field '%s' is not followed by a pointer or union member field in class '%s'", Eptr->sym->name, typ->id->name); semwarn(errbuf); } } } } if (!is_transient(typ) && !is_volatile(typ)) { fprintf(fd, "\npublic:"); fprintf(fd, "\n\t/// Return the unique type ID value %s (%d)", soap_type(typ), typ->num); fprintf(fd, "\n\tvirtual int soap_type(void) const { return %d; }", typ->num); fprintf(fd, "\n\t/// Set object's data members to default values"); fprintf(fd, "\n\tvirtual void soap_default(struct soap*);"); fprintf(fd, "\n\t/// Serialize object to prepare for SOAP 1.1/1.2 encoded output (or with SOAP_XML_GRAPH) by analyzing its (cyclic) structures"); fprintf(fd, "\n\tvirtual void soap_serialize(struct soap*) const;"); if (Etflag) fprintf(fd, "\n\tvirtual void soap_traverse(struct soap*, const char *s, soap_walker, soap_walker);"); fprintf(fd, "\n\t/// Output object in XML, compliant with SOAP 1.1 encoding style, return error code or SOAP_OK"); fprintf(fd, "\n\tvirtual int soap_put(struct soap*, const char *tag, const char *type) const;"); fprintf(fd, "\n\t/// Output object in XML, with tag and optional id attribute and xsi:type, return error code or SOAP_OK"); fprintf(fd, "\n\tvirtual int soap_out(struct soap*, const char *tag, int id, const char *type) const;"); fprintf(fd, "\n\t/// Get object from XML, compliant with SOAP 1.1 encoding style, return pointer to object or NULL on error"); fprintf(fd, "\n\tvirtual void *soap_get(struct soap*, const char *tag, const char *type);"); fprintf(fd, "\n\t/// Get object from XML, with matching tag and type (NULL matches any tag and type), return pointer to object or NULL on error"); fprintf(fd, "\n\tvirtual void *soap_in(struct soap*, const char *tag, const char *type);"); fprintf(fd, "\n\t/// Return a new object of type %s, default initialized and not managed by a soap context", c_type(typ)); fprintf(fd, "\n\tvirtual %s *soap_alloc(void) const { return SOAP_NEW(%s); }", c_type(typ), c_type(typ)); if (Ecflag) { fprintf(fd, "\n\t/// Return a duplicate of this object by deep copying, replicating all deep cycles and shared pointers when a managing soap context is provided as argument.\n\t/// Deep copy is a tree when argument is NULL, but the presence of deep cycles will lead to non-termination.\n\t/// Use flag SOAP_XML_TREE with a managing context to copy into a tree without cycles and pointers to shared objects"); fprintf(fd, "\n\tvirtual %s *soap_dup(struct soap *soap = NULL, void *dest = NULL) const { return soap_dup_%s(soap, (%s*)dest, this); }", c_type(typ), c_ident(typ), c_type(typ)); } if (Edflag) { fprintf(fd, "\n\t/// Delete heap-allocated members of this object by deep deletion ONLY IF this object and all of its (deep) members are not managed by a soap context AND the deep structure is a tree (no cycles and co-referenced objects by way of multiple (non-smart) pointers pointing to the same data)\n\t/// Can be safely used after soap_dup(NULL) to delete the deep copy"); fprintf(fd, "\n\tvirtual void soap_del(void) const { soap_del_%s(this); }", c_ident(typ)); } if ((x = union_member(typ))) { sprintf(errbuf, "class '%s' cannot be assigned a default constructor because it is used as a member of union '%s'", typ->id->name, ident(x)); semwarn(errbuf); } else { if (!has_constructor(typ)) { Table *t; Entry *p; fprintf(fd, "\n\t %s() { %s::soap_default(NULL); }", c_ident(typ), c_ident(typ)); for (t = (Table*)typ->ref; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.typ->type == Treference || p->info.typ->type == Trvalueref) { sprintf(errbuf, "no constructor for '%s' to explicitly initialize the reference member '%s'", typ->id->name, p->sym->name); semwarn(errbuf); } } } } if (!has_destructor(typ)) fprintf(fd, "\n\tvirtual ~%s() { }", c_ident(typ)); } if (Ecflag) fprintf(fd, "\n\tfriend SOAP_FMAC1 %s * SOAP_FMAC2 soap_dup_%s(struct soap*, %s*, %s);", c_type(typ), c_ident(typ), c_type(typ), c_type_constptr_id(typ, "const*")); if (Edflag) fprintf(fd, "\n\tfriend SOAP_FMAC1 void SOAP_FMAC2 soap_del_%s(%s);", c_ident(typ), c_type_constptr_id(typ, "const*")); fprintf(fd, "\n\tfriend SOAP_FMAC1 %s * SOAP_FMAC2 soap_instantiate_%s(struct soap*, int, const char*, const char*, size_t*);", c_ident(typ), c_ident(typ)); /* the use of 'friend' causes problems linking static functions. Adding these friends could enable serializing protected/private members (which is not implemented) fprintf(fd, "\n\tfriend %s *soap_in_%s(struct soap*, const char*, %s*, const char*);", typ->id->name, typ->id->name, typ->id->name); fprintf(fd, "\n\tfriend int soap_out_%s(struct soap*, const char*, int, const %s*, const char*);", typ->id->name, typ->id->name); */ } fprintf(fd, "\n};"); } else if (typ->type == Tunion) { int i = 1; fprintf(fd, "union %s\n{", ident(typ->id->name)); for (Eptr = ((Table*)typ->ref)->list; Eptr; Eptr = Eptr->next) { fprintf(fd, "\n#define %s\t(%d)", soap_union_member(typ, Eptr), i); i++; fprintf(fd, "\n\t%s", c_storage(Eptr->info.sto)); fprintf(fd, "%s;", c_type_id(Eptr->info.typ, Eptr->sym->name)); if (Eptr->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fd, "\t/* const field cannot be deserialized */"); if (is_external(Eptr->info.typ)) fprintf(fd, "\t/* external (custom serializer) */"); if (is_transient(Eptr->info.typ)) fprintf(fd, "\t/* transient (not serialized) */"); if (Eptr->info.sto & Sattribute) { fprintf(fd, "\t/* attribute not allowed in union */"); sprintf(errbuf, "union '%s' contains attribute declarations", typ->id->name); semwarn(errbuf); } if (Eptr->info.sto & SmustUnderstand) fprintf(fd, "\t/* mustUnderstand */"); } if (!((Table*)typ->ref)->list) { if (cflag) fprintf(fd, "\n#ifdef WITH_NOEMPTYSTRUCT\n\tchar dummy;\t/* empty union is a GNU extension */\n#endif"); } fprintf(fd, "\n};"); } if (is_volatile(typ)) fprintf(fd, "\n#endif"); fprintf(fd, "\n#endif"); if (is_header_or_fault(typ) || is_body(typ)) fprintf(fd, "\n#endif"); fflush(fd); } void generate_header(Table *t) { Entry *p, *q; banner(fheader, "Enumerations"); fflush(fheader); if (enumtable) { Table *r = mktable(NULL); for (p = enumtable->list; p; p = p->next) { const char *x; int enum64 = False; if (is_imported(p->info.typ) || (is_transient(p->info.typ) && !p->info.typ->ref)) continue; x = xsi_type(p->info.typ); if (!x || !*x) x = wsdl_type(p->info.typ, ""); fprintf(fheader, "\n\n/* %s:%d */", p->filename, p->lineno); fprintf(fheader, "\n#ifndef %s", soap_type(p->info.typ)); fprintf(fheader, "\n#define %s (%d)", soap_type(p->info.typ), p->info.typ->num); if (is_volatile(p->info.typ)) fprintf(fheader, "\n#if 0 /* Volatile: not declared here */"); if (is_mask(p->info.typ)) fprintf(fheader, "\n/* Bitmask %s */", x); else fprintf(fheader, "\n/* %s */", x); if ((Table*)p->info.typ->ref) { for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next) { if (q->info.val.i > 0x7FFFLL || q->info.val.i < -0x8000LL) { enum64 = True; break; } } } if (cflag && p->info.typ->type == Tenum && p->sym->token == TYPE) fprintf(fheader, "\ntypedef "); else fprintf(fheader, "\n"); if (p->info.typ->width == 4 || is_mask(p->info.typ)) { if (p->info.typ->type == Tenumsc) { if (enum64) fprintf(fheader, "enum class %s : int64_t\n{", ident(p->info.typ->id->name)); else fprintf(fheader, "enum class %s\n{", ident(p->info.typ->id->name)); } else fprintf(fheader, "enum %s\n{", ident(p->info.typ->id->name)); } else { const char *t; switch (p->info.typ->width) { case 1: t = "int8_t"; break; case 2: t = "int16_t"; break; case 4: t = "int32_t"; break; default: t = "int64_t"; break; } if (p->info.typ->type == Tenumsc) fprintf(fheader, "enum class %s : %s\n{", ident(p->info.typ->id->name), t); else fprintf(fheader, "enum %s : %s\n{", ident(p->info.typ->id->name), t); } if ((Table*)p->info.typ->ref) { const char *c = "\n\t"; for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next) { Entry *e = NULL; if (p->info.typ->type == Tenum && (e = entry(r, q->sym)) && e->info.val.i == q->info.val.i) fprintf(fheader, " /* %s%s = " SOAP_LONG_FORMAT " */", c, ident(q->sym->name), q->info.val.i); else { if (q->info.val.i <= 0x7FFFLL && q->info.val.i >= -0x8000LL) fprintf(fheader, "%s%s = " SOAP_LONG_FORMAT, c, ident(q->sym->name), q->info.val.i); else fprintf(fheader, "%s%s = " SOAP_LONG_FORMAT "LL", c, ident(q->sym->name), q->info.val.i); if (p->info.typ->type == Tenum && !e) { e = enter(r, q->sym); e->info.val.i = q->info.val.i; } c = ",\n\t"; } } } if (cflag && p->info.typ->type == Tenum && p->sym->token == TYPE) fprintf(fheader, "\n} %s;", ident(p->sym->name)); else fprintf(fheader, "\n};"); if (is_volatile(p->info.typ)) fprintf(fheader, "\n#endif"); fprintf(fheader, "\n#endif"); } freetable(r); } banner(fheader, "Types with Custom Serializers"); fflush(fheader); if (typetable) { for (p = typetable->list; p; p = p->next) { if (is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_imported(p->info.typ)) { fprintf(fheader, "\n\n/* %s:%d */", p->filename, p->lineno); fprintf(fheader, "\n#ifndef %s", soap_type(p->info.typ)); fprintf(fheader, "\n#define %s (%d)", soap_type(p->info.typ), p->info.typ->num); fprintf(fheader, "\n%s%s;", c_storage(p->info.sto), c_type_synonym(p->info.typ, p->sym->name)); fprintf(fheader, "\n#endif"); } } } if (typetable) { for (p = typetable->list; p; p = p->next) { if (p->info.typ->type == Tclass && is_eq(p->info.typ->sym->name, "xsd__QName") && !is_external(p->info.typ) && !is_imported(p->info.typ)) { fprintf(fheader, "\n#ifndef %s", soap_type(p->info.typ)); fprintf(fheader, "\n#define %s (%d)", soap_type(p->info.typ), p->info.typ->num); fprintf(fheader, "\n%sstd::string %s;", c_storage(p->info.sto), ident(p->sym->name)); fprintf(fheader, "\n#endif\n"); } } } banner(fheader, "Classes, Structs, and Unions"); fflush(fheader); if (classtable) { for (p = classtable->list; p; p = p->next) { if (!is_imported(p->info.typ) && !is_volatile(p->info.typ) && p->info.typ->ref) { if (!is_header_or_fault(p->info.typ) && !is_body(p->info.typ)) { if (cflag && (p->info.typ->type == Tstruct || p->info.typ->type == Tunion) && p->sym->token == TYPE) fprintf(fheader, "\ntypedef "); else fprintf(fheader, "\n"); if (p->info.typ->type == Tstruct) fprintf(fheader, "struct %s", ident(p->sym->name)); else if (!cflag && p->info.typ->type == Tclass) fprintf(fheader, "class %s", ident(p->sym->name)); else if (p->info.typ->type == Tunion) fprintf(fheader, "union %s", ident(p->sym->name)); if (cflag && (p->info.typ->type == Tstruct || p->info.typ->type == Tunion) && p->sym->token == TYPE) fprintf(fheader, " %s;", ident(p->sym->name)); else fprintf(fheader, ";"); fprintf(fheader, "\t/* %s:%d */", p->filename, p->lineno); } } } for (p = classtable->list; p; p = p->next) if (!is_imported(p->info.typ)) gen_class(fheader, p); } banner(fheader, "Typedefs"); fflush(fheader); if (typetable) { for (p = typetable->list; p; p = p->next) { if (!wflag && !is_primitive_or_string(p->info.typ) && !is_external(p->info.typ) && !is_XML(p->info.typ) && !is_transient(p->info.typ) && !has_ns_t(p->info.typ) && !is_imported(p->info.typ) && !is_template(p->info.typ)) { sprintf(errbuf, "serializable typedef '%s' is not namespace qualified: schema definition for '%s' in WSDL file output may be invalid", p->sym->name, p->sym->name); semwarn(errbuf); } if (p->info.typ->type == Tclass && is_eq(p->info.typ->sym->name, "xsd__QName") && !is_external(p->info.typ) && !is_imported(p->info.typ)) continue; if ((!is_external(p->info.typ) && !is_imported(p->info.typ)) || is_synonym(p->info.typ)) { fprintf(fheader, "\n\n/* %s:%d */", p->filename, p->lineno); fprintf(fheader, "\n#ifndef %s", soap_type(p->info.typ)); fprintf(fheader, "\n#define %s (%d)", soap_type(p->info.typ), p->info.typ->num); fprintf(fheader, "\n%s%s;", c_storage(p->info.sto), c_type_synonym(p->info.typ, p->sym->name)); fprintf(fheader, "\n#endif"); } } } banner(fheader, "Externals"); fflush(fheader); if (t) { for (p = t->list; p; p = p->next) { if (p->info.typ->type != Tfun || (p->info.sto & Sextern)) { fprintf(fheader, "\n\n/* %s:%d */\n", p->filename, p->lineno); if (!(p->info.sto & Sstatic)) fprintf(fheader, "extern "); fprintf(fheader, "%s", c_storage(p->info.sto)); fprintf(fheader, "%s;", c_type_id(p->info.typ, p->sym->name)); } } } fflush(fheader); } void get_namespace_prefixes(void) { Symbol *p, *q; int i, n; const char *s; char buf[256]; if (nslist) return; for (p = symlist; p; p = p->next) { s = p->name; while (*s == '_' || *s == '~') s++; n = (int)(strlen(s) - 2); for (i = 1; i < n; i++) { if (s[i] == ':' || (s[i-1] != '_' && s[i] == '_' && s[i+1] == '_' && s[i+2] && s[i+2] != '_') || (s[i-1] != '_' && (!strncmp(s+i, "___DOT", 6) || !strncmp(s+i, "___USCORE", 9) || (!strncmp(s+i, "___x", 4) && isxdigit(s[i+4]) && isxdigit(s[i+5]) && isxdigit(s[i+6]) && isxdigit(s[i+7]))))) { if (s[i+1] == ':') { i++; continue; } strncpy(buf, s, i); buf[i] = '\0'; if (!strcmp(buf, "SOAP_ENV") || !strcmp(buf, "SOAP_ENC") || !strcmp(buf, "xsd") || !strcmp(buf, "xsi") || !strcmp(buf, "xml") || !strcmp(buf, "std") || !strncmp(buf, "soap_", 5)) goto nsnext; for (q = nslist; q; q = q->next) if (!strcmp(q->name, buf)) goto nsnext; q = (Symbol*)emalloc(sizeof(Symbol)); q->name = (char*)emalloc(i+1); strcpy(q->name, buf); q->name[i] = '\0'; q->next = nslist; nslist = q; break; } } nsnext: ; } q = (Symbol*)emalloc(sizeof(Symbol)); q->name = (char*)emalloc(4); strcpy(q->name, "xsd"); q->next = nslist; nslist = q; q = (Symbol*)emalloc(sizeof(Symbol)); q->name = (char*)emalloc(4); strcpy(q->name, "xsi"); q->next = nslist; nslist = q; q = (Symbol*)emalloc(sizeof(Symbol)); q->name = (char*)emalloc(9); strcpy(q->name, "SOAP-ENC"); q->next = nslist; nslist = q; q = (Symbol*)emalloc(sizeof(Symbol)); q->name = (char*)emalloc(9); strcpy(q->name, "SOAP-ENV"); q->next = nslist; nslist = q; } void generate_schema(Table *t) { Entry *p = NULL; Symbol *ns; const char *name = NULL; const char *URL = NULL; const char *executable = NULL; const char *URI = NULL; const char *style = NULL; const char *encoding = NULL; const char *protocol = NULL; const char *import = NULL; Service *sp = NULL; char buf[1024]; FILE *fd; int flag = 0; get_namespace_prefixes(); for (ns = nslist; ns; ns = ns->next) { if (!strcmp(ns->name, "SOAP-ENV") || !strcmp(ns->name, "SOAP-ENC") || !strcmp(ns->name, "xsi") || !strcmp(ns->name, "xsd")) continue; name = NULL; URL = NULL; executable = NULL; URI = NULL; style = NULL; encoding = NULL; import = NULL; for (sp = services; sp; sp = sp->next) { if (!tagcmp(sp->ns, ns->name)) { name = ns_cname(sp->name, NULL); URL = sp->URL; executable = sp->executable; URI = sp->URI; style = sp->style; encoding = sp->encoding; protocol = sp->protocol; import = sp->import; break; } } if (!URI) { char *s = (char*)emalloc(strlen(tmpURI) + strlen(ns->name) + 6); sprintf(s, "%s/%s.xsd", tmpURI, ns_convert(ns->name)); URI = s; } if (soap_version >= 0 && is_document(style) && encoding && !*encoding) { semwarn("Cannot use document style with SOAP encoding"); encoding = NULL; } if (!name) name = "Service"; if (!URL) URL = "http://localhost:80"; if (!import) flag = 1; if (t) { for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun && !(p->info.sto & Sextern) && has_ns_eq(ns->name, p->sym->name)) { if (name) fprintf(fmsg, "Using %s service name: %s\n", ns->name, name); if (protocol) fprintf(fmsg, "Using %s service protocol: %s\n", ns->name, protocol); if (style && soap_version >= 0) fprintf(fmsg, "Using %s service style: %s\n", ns->name, style); else if (!eflag && soap_version >= 0) fprintf(fmsg, "Using %s service style: document\n", ns->name); if (encoding && *encoding) fprintf(fmsg, "Using %s service encoding: %s\n", ns->name, encoding); else if (encoding && !*encoding && soap_version >= 0) fprintf(fmsg, "Using %s service encoding: encoded\n", ns->name); else if (!eflag && soap_version >= 0) fprintf(fmsg, "Using %s service encoding: literal\n", ns->name); if (URL) fprintf(fmsg, "Using %s service location: %s\n", ns->name, URL); if (executable) fprintf(fmsg, "Using %s service executable: %s\n", ns->name, executable); if (import) fprintf(fmsg, "Using %s schema import: %s\n", ns->name, import); else if (URI) fprintf(fmsg, "Using %s schema namespace: %s\n", ns->name, URI); if (sp && sp->name) sprintf(buf, "%s%s.wsdl", dirpath, ns_cname(name, NULL)); else sprintf(buf, "%s%s.wsdl", dirpath, ns_cname(ns->name, NULL)); if (!wflag && !import) { fprintf(fmsg, "Saving %s Web Service description\n", buf); fd = fopen(buf, "w"); if (!fd) execerror("Cannot write WSDL file"); gen_wsdl(fd, t, ns->name, name, URL, executable, URI, style, encoding, protocol); fclose(fd); } if (!cflag) { if (iflag || jflag) { const char *sname; if (sp && sp->name) sname = sp->name; else sname = ""; if (!Sflag) { const char *name1 = ns_cname(sname, "Proxy"); sprintf(buf, "%s%s%s.h", dirpath, prefix, name1); fprintf(fmsg, "Saving %s client proxy class\n", buf); fd = fopen(buf, "w"); if (!fd) execerror("Cannot write proxy class file"); sprintf(buf, "%s%s.h", prefix, name1); copyrightnote(fd, buf); gen_proxy_header(fd, t, ns, name1); fclose(fd); sprintf(buf, "%s%s%s.cpp", dirpath, prefix, name1); fprintf(fmsg, "Saving %s client proxy class\n", buf); fd = fopen(buf, "w"); if (!fd) execerror("Cannot write proxy class file"); sprintf(buf, "%s%s.cpp", prefix, name1); copyrightnote(fd, buf); gen_proxy_code(fd, t, ns, name1); fclose(fd); } if (!Cflag) { const char *name1 = ns_cname(sname, "Service"); sprintf(buf, "%s%s%s.h", dirpath, prefix, name1); fprintf(fmsg, "Saving %s service class\n", buf); fd = fopen(buf, "w"); if (!fd) execerror("Cannot write service class file"); sprintf(buf, "%s%s.h", prefix, name1); copyrightnote(fd, buf); gen_object_header(fd, t, ns, name1); fclose(fd); sprintf(buf, "%s%s%s.cpp", dirpath, prefix, name1); fprintf(fmsg, "Saving %s service class\n", buf); fd = fopen(buf, "w"); if (!fd) execerror("Cannot write service class file"); sprintf(buf, "%s%s.cpp", prefix, name1); copyrightnote(fd, buf); gen_object_code(fd, t, ns, name1); fclose(fd); } } else if (zflag == 1) { if (!Sflag && sp && sp->name) { sprintf(buf, "%s%s%s.h", dirpath, prefix, ns_cname(name, "Proxy")); fprintf(fmsg, "Saving %s simple client proxy (deprecated)\n", buf); fd = fopen(buf, "w"); if (!fd) execerror("Cannot write proxy file"); sprintf(buf, "%s%s.h", prefix, ns_cname(name, "Proxy")); copyrightnote(fd, buf); gen_proxy(fd, t, ns, name, URL); fclose(fd); } else if (!Sflag) { sprintf(buf, "%s%s.h", dirpath, ns_cname(prefix, "Proxy")); fprintf(fmsg, "Saving %s simple client proxy (deprecated)\n", buf); fd = fopen(buf, "w"); if (!fd) execerror("Cannot write proxy file"); sprintf(buf, "%s.h", ns_cname(prefix, "Proxy")); copyrightnote(fd, buf); gen_proxy(fd, t, ns, "Service", URL); fclose(fd); } if (!Cflag && sp && sp->name) { sprintf(buf, "%s%s%s.h", dirpath, prefix, ns_cname(name, "Object")); fprintf(fmsg, "Saving %s simple server object (deprecated)\n", buf); fd = fopen(buf, "w"); if (!fd) execerror("Cannot write server object file"); sprintf(buf, "%s%s.h", prefix, ns_cname(name, "Object")); copyrightnote(fd, buf); gen_object(fd, t, name); fclose(fd); } else if (!Cflag) { sprintf(buf, "%s%s.h", dirpath, ns_cname(prefix, "Object")); fprintf(fmsg, "Saving %s simple server object (deprecated)\n", buf); fd = fopen(buf, "w"); if (!fd) execerror("Cannot write server object file"); sprintf(buf, "%s.h", ns_cname(prefix, "Object")); copyrightnote(fd, buf); gen_object(fd, t, "Service"); fclose(fd); } } } if (!xflag) { strcpy(buf, dirpath); if (sp && sp->name) strcat(buf, ns_fname(name)); else strcat(buf, ns_fname(ns->name)); strcat(buf, "."); gen_data(buf, t, ns->name, encoding); } break; } } if (sp && sp->name) { has_nsmap = 1; if (nflag) sprintf(buf, "%s%s.nsmap", dirpath, prefix); else sprintf(buf, "%s%s.nsmap", dirpath, ns_cname(name, NULL)); fprintf(fmsg, "Saving %s namespace mapping table\n", buf); fd = fopen(buf, "w"); if (!fd) execerror("Cannot write nsmap file"); fprintf(fd, "\n#include \"%sH.h\"", prefix); if (nflag) fprintf(fd, "\nSOAP_NMAC struct Namespace %s_namespaces[] =\n", prefix); else fprintf(fd, "\nSOAP_NMAC struct Namespace namespaces[] =\n"); gen_nsmap(fd); fclose(fd); if (Tflag && !Cflag) { Entry *method; char soapTester[1024]; char pathsoapTester[1024]; const char *name1 = NULL; Tflag = 0; strcpy(soapTester, prefix); strcat(soapTester, "Tester"); if (cflag) strcat(soapTester, ".c"); else strcat(soapTester, ".cpp"); strcpy(pathsoapTester, dirpath); strcat(pathsoapTester, soapTester); fprintf(fmsg, "Saving %s server auto-test code\n", pathsoapTester); fd = fopen(pathsoapTester, "w"); if (!fd) execerror("Cannot write to file"); copyrightnote(fd, soapTester); fprintf(fd, "\n/*\n Stand-alone server auto-test code:\n Takes request from standard input or over TCP/IP socket and returns\nresponse to standard output or socket\n\n Compile:\n cc soapTester.c soapServer.c soapC.c stdsoap2.c\n\n Command line usage with redirect over stdin/out:\n > ./a.out < SomeTest.req.xml\n > ./a.out 12288 < SomeTest.req.xml\n Note: 12288 = SOAP_XML_INDENT | SOAP_XML_STRICT (see codes in stdsoap2.h)\n Command line usage to start server at port 8080:\n > a.out 12288 8080\n*/\n\n#include \""); if (iflag || jflag) { const char *sname; if (sp && sp->name) sname = sp->name; else sname = ""; name1 = ns_cname(sname, "Service"); fprintf(fd, "%s%s%s.h\"\n\n#ifndef SOAP_DEFMAIN\n# define SOAP_DEFMAIN main\t/* redefine to use your own main() */\n#endif\n\nint SOAP_DEFMAIN(int argc, char **argv)\n{\n\t%s service(argc > 1 ? atoi(argv[1]) : 0);\n\tif (argc <= 2)\n\t\treturn service.serve();\n\twhile (service.run(atoi(argv[2])) != SOAP_OK && service.%serror != SOAP_TCP_ERROR)\n\t\tservice.soap_print_fault(stderr);\n\treturn 0;\n}\n", dirpath, prefix, name1, name1, iflag ? "" : "soap->"); } else fprintf(fd, "%s%s.nsmap\"\n\n#ifndef SOAP_DEFMAIN\n# define SOAP_DEFMAIN main\t/* redefine to use your own main() */\n#endif\n\nint SOAP_DEFMAIN(int argc, char **argv)\n{\n\tstruct soap *soap = soap_new1(argc > 1 ? atoi(argv[1]) : 0);\n\tif (argc <= 2)\n\t\treturn %s_serve(soap);\n\tif (soap_valid_socket(soap_bind(soap, NULL, atoi(argv[2]), 100)))\n\t\twhile (soap_valid_socket(soap_accept(soap)))\n\t\t{\tif (%s_serve(soap))\n\t\t\t\tsoap_print_fault(soap, stderr);\n\t\t\tsoap_destroy(soap);\n\t\t\tsoap_end(soap);\n\t\t}\n\tsoap_destroy(soap);\n\tsoap_end(soap);\n\tsoap_free(soap);\n\treturn 0;\n}\n", dirpath, nflag?prefix:ns_cname(name, NULL), nflag?prefix:"soap", nflag?prefix:"soap"); for (method = t->list; method; method = method->next) { if (method->info.typ->type == Tfun && !(method->info.sto & Sextern)) { Entry *p = NULL, *q = entry(t, method->sym); Table *r; if (q) p = (Entry*)q->info.typ->ref; else { fprintf(stderr, "Internal error: no table entry\n"); return; } q = entry(classtable, method->sym); r = (Table*)q->info.typ->ref; if (iflag || jflag) fprintf(fd, "\n\n/** Auto-test server operation %s */\nint %s::%s(", method->sym->name, name1, ns_cname(method->sym->name, NULL)); else fprintf(fd, "\n\n/** Auto-test server operation %s */\nint %s(struct soap *soap", method->sym->name, ident(method->sym->name)); gen_params(fd, r, p, !iflag && !jflag); /* single param to single param echo */ if (p && r && r->list && r->list->info.typ == p->info.typ) fprintf(fd, "\n{\t/* Echo request-response parameter */\n\t*%s = *%s;\n\treturn SOAP_OK;\n}\n", ident(p->sym->name), ident(r->list->sym->name)); else if (p && r && r->list && p->info.typ->type == Tpointer && r->list->info.typ == (Tnode*)p->info.typ->ref) fprintf(fd, "\n{\t/* Echo request-response parameter */\n\t*%s = %s;\n\treturn SOAP_OK;\n}\n", ident(p->sym->name), ident(r->list->sym->name)); else if (p && r && r->list && p->info.typ->type == Treference && r->list->info.typ == (Tnode*)p->info.typ->ref) fprintf(fd, "\n{\t/* Echo request-response parameter */\n\t%s = %s;\n\treturn SOAP_OK;\n}\n", ident(p->sym->name), ident(r->list->sym->name)); else if (p && r && r->list && p->info.typ->type == Treference && r->list->info.typ->type == Tpointer && r->list->info.typ->ref == (Tnode*)p->info.typ->ref) fprintf(fd, "\n{\t/* Echo request-response parameter */\n\t%s = *%s;\n\treturn SOAP_OK;\n}\n", ident(p->sym->name), ident(r->list->sym->name)); /* params to wrapped params echo */ else { fprintf(fd, "\n{\t(void)soap; /* appease -Wall -Werror */"); if (r && p && p->info.typ->ref && ((Tnode*)p->info.typ->ref)->ref && (((Tnode*)p->info.typ->ref)->type == Tstruct || ((Tnode*)p->info.typ->ref)->type == Tclass)) { const char *s, *a; int d = 1; s = ident(p->sym->name); if (p->info.typ->type == Treference || p->info.typ->type == Trvalueref) a = "."; else a = "->"; for (p = ((Table*)((Tnode*)p->info.typ->ref)->ref)->list, q = r->list; p && q; p = p->next, q = q->next) { if (p->info.typ == q->info.typ) fprintf(fd, "\n\t%s%s%s = %s;", s, a, ident(p->sym->name), ident(q->sym->name)); else if (q->info.typ->type == Tpointer && p->info.typ == (Tnode*)q->info.typ->ref) fprintf(fd, "\n\t%s%s%s = *%s;", s, a, ident(p->sym->name), ident(q->sym->name)); else d = 0; } if (!d) fprintf(fd, "\n\t/* Returns incomplete response containing some default data values */"); } fprintf(fd, "\n\treturn SOAP_OK;\n}\n"); } fflush(fd); } } fclose(fd); } } } if (!wflag && !import) { sprintf(buf, "%s%s.xsd", dirpath, ns_cname(ns->name, NULL)); fprintf(fmsg, "Saving %s XML schema\n", buf); fd = fopen(buf, "w"); if (!fd) execerror("Cannot write schema file"); fprintf(fd, "\n"); if (t) for (p = t->list; p; p = p->next) if (p->info.typ->type == Tfun && !(p->info.sto & Sextern) && has_ns_eq(ns->name, p->sym->name)) { gen_schema(fd, t, ns->name, ns->name, 0, style, encoding); break; } if (!t || !p) gen_schema(fd, t, ns->name, ns->name, 0, style, encoding); fclose(fd); } } if (!has_nsmap) { if (Tflag && !Cflag && !iflag && !jflag) fprintf(fmsg, "Warning: cannot save soapTester, need directive //gsoap service name\n"); for (ns = nslist; ns; ns = ns->next) if (strcmp(ns->name, "SOAP-ENV") && strcmp(ns->name, "SOAP-ENC") && strcmp(ns->name, "xsi") && strcmp(ns->name, "xsd")) break; if (nflag) sprintf(buf, "%s%s.nsmap", dirpath, prefix); else if (ns && ns->name) sprintf(buf, "%s%s.nsmap", dirpath, ns_cname(ns->name, NULL)); else sprintf(buf, "%ssoap.nsmap", dirpath); fprintf(fmsg, "Saving %s namespace mapping table\n", buf); fd = fopen(buf, "w"); if (!fd) execerror("Cannot write nsmap file"); fprintf(fd, "\n#include \"%sH.h\"", prefix); if (nflag) fprintf(fd, "\nSOAP_NMAC struct Namespace %s_namespaces[] =\n", prefix); else fprintf(fd, "\nSOAP_NMAC struct Namespace namespaces[] =\n"); gen_nsmap(fd); fclose(fd); } } int chkhdr(const char *part) { Entry *p; p = entry(classtable, lookup("SOAP_ENV__Header")); if (p) for (p = ((Table*)p->info.typ->ref)->list; p; p = p->next) if (has_ns_eq(NULL, p->sym->name) && (!strcmp(part, p->sym->name) || is_eq_nons(part, p->sym->name))) return 1; sprintf(errbuf, "Cannot define method-header-part in WSDL: SOAP_ENV__Header \"%s\" member field is not qualified", part); semwarn(errbuf); return 0; } void gen_wsdl(FILE *fd, Table *t, const char *ns, const char *name, const char *URL, const char *executable, const char *URI, const char *style, const char *encoding, const char *protocol) { Entry *p, *q, *r; Symbol *s; Service *sp, *sp2; Method *m; const char *mimein = NULL, *mimeout = NULL; int prot, mask = 0x0; /* 0x1 = SOAP, 0x2 = GET, 0x4 = PUT, 0x8 = POST */ const char *action, *comment, *method_style = NULL, *method_encoding = NULL, *method_response_encoding = NULL; const char *portname; const char *binding; fprintf(fd, "\n"); for (sp = services; sp; sp = sp->next) if (!tagcmp(sp->ns, ns)) break; if (sp && sp->definitions) fprintf(fd, "definitions); else fprintf(fd, "WSDL) fprintf(fd, " targetNamespace=\"%s\"\n xmlns:tns=\"%s\"", sp->WSDL, sp->WSDL); else fprintf(fd, " targetNamespace=\"%s/%s.wsdl\"\n xmlns:tns=\"%s/%s.wsdl\"", URI, name, URI, name); if (sp && sp->binding) binding = ns_cname(sp->binding, NULL); else binding = name; if (sp && sp->portname) portname = ns_cname(sp->portname, NULL); else portname = name; for (s = nslist; s; s = s->next) { for (sp2 = services; sp2; sp2 = sp2->next) if (!tagcmp(sp2->ns, s->name) && sp2->URI) break; if (sp2) fprintf(fd, "\n xmlns:%s=\"%s\"", ns_convert(s->name), sp2->URI); else if (!strcmp(s->name, "SOAP-ENV")) fprintf(fd, "\n xmlns:SOAP-ENV=\"%s\"", envURI); else if (!strcmp(s->name, "SOAP-ENC")) fprintf(fd, "\n xmlns:SOAP-ENC=\"%s\"", encURI); else if (!strcmp(s->name, "xsi")) fprintf(fd, "\n xmlns:xsi=\"%s\"", xsiURI); else if (!strcmp(s->name, "xsd")) fprintf(fd, "\n xmlns:xsd=\"%s\"", xsdURI); else fprintf(fd, "\n xmlns:%s=\"%s/%s.xsd\"", ns_convert(s->name), tmpURI, ns_convert(s->name)); } if (is_soap12(encoding)) fprintf(fd, "\n xmlns:SOAP=\"http://schemas.xmlsoap.org/wsdl/soap12/\""); else fprintf(fd, "\n xmlns:SOAP=\"http://schemas.xmlsoap.org/wsdl/soap/\""); fprintf(fd, "\n xmlns:HTTP=\"http://schemas.xmlsoap.org/wsdl/http/\""); fprintf(fd, "\n xmlns:MIME=\"http://schemas.xmlsoap.org/wsdl/mime/\""); fprintf(fd, "\n xmlns:DIME=\"http://schemas.xmlsoap.org/ws/2002/04/dime/wsdl/\""); fprintf(fd, "\n xmlns:WSDL=\"http://schemas.xmlsoap.org/wsdl/\""); fprintf(fd, "\n xmlns=\"http://schemas.xmlsoap.org/wsdl/\">\n\n"); fprintf(fd, "\n\n"); for (s = nslist; s; s = s->next) gen_schema(fd, t, ns, s->name, !strcmp(s->name, ns), style, encoding); fprintf(fd, "\n\n"); fflush(fd); if (t) { for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun && !(p->info.sto & Sextern) && has_ns_eq(ns, p->sym->name)) { mimein = NULL; mimeout = NULL; comment = NULL; method_style = style; method_encoding = encoding; method_response_encoding = NULL; if (sp) { for (m = sp->list; m; m = m->next) { if (is_eq_nons(m->name, p->sym->name)) { if (m->mess&MIMEIN) mimein = m->part; if (m->mess&MIMEOUT) mimeout = m->part; if (m->mess == ENCODING) method_encoding = m->part; else if (m->mess == RESPONSE_ENCODING) method_response_encoding = m->part; else if (m->mess == STYLE) method_style = m->part; else if (m->mess == COMMENT) comment = m->part; } } } if (!method_response_encoding) method_response_encoding = method_encoding; if (get_response(p->info.typ)) fprintf(fd, "\n", ns_remove(p->sym->name)); else fprintf(fd, "\n", ns_remove(p->sym->name)); fflush(fd); if (is_document(method_style)) { if (is_invisible(p->sym->name)) { q = entry(classtable, p->sym); if (q) { q = ((Table*)q->info.typ->ref)->list; if (q) { if (is_invisible(q->sym->name)) { r = entry(classtable, q->sym); if (r) { r = ((Table*)r->info.typ->ref)->list; if (r) { fprintf(fd, " sym, r, ns, 1)) fprintf(fd, " \n"); } } } else { fprintf(fd, " sym, q, ns, 1)) fprintf(fd, " \n"); } } } } else { fprintf(fd, " sym, p, ns, 1)) fprintf(fd, " \n"); } } else { q = entry(classtable, p->sym); if (q) { for (q = ((Table*)q->info.typ->ref)->list; q; q = q->next) { if (!is_transient(q->info.typ) && !(q->info.sto & Sattribute) && q->info.typ->type != Tfun && !is_repetition(q) && !is_anytype(q)) { if (is_XML(q->info.typ) || is_stdXML(q->info.typ)) fprintf(fd, " \n"); else { fprintf(fd, " sym->name), wsdl_type(q->info.typ, ns)); if (gen_member_documentation(fd, p->sym, q, ns, 1)) fprintf(fd, " \n"); } } } } } if (mimein) fprintf(fd, " \n"); fprintf(fd, "\n\n"); fflush(fd); q = (Entry*)p->info.typ->ref; for (r = t->list; r; r = r->next) if (r != p && r->info.typ->type == Tfun && !(r->info.sto & Sextern) && q == (Entry*)r->info.typ->ref) q = NULL; if (q && is_transient(q->info.typ)) ; else if (q && !is_response(q->info.typ)) { fprintf(fd, "\n", ns_remove(p->sym->name)); if (is_document(method_style)) fprintf(fd, " \n", ns_add(p, ns)); else if (is_literal(method_response_encoding)) { fprintf(fd, " sym->name), ns_add(q, ns)); if (gen_member_documentation(fd, p->sym, q, ns, 1)) fprintf(fd, " \n"); } else if (is_XML((Tnode*)q->info.typ->ref) || is_stdXML((Tnode*)q->info.typ->ref)) fprintf(fd, " \n"); else { fprintf(fd, " sym->name), wsdl_type(q->info.typ, ns)); if (gen_member_documentation(fd, p->sym, q, ns, 1)) fprintf(fd, " \n"); } if (mimeout) fprintf(fd, " \n"); fprintf(fd, "\n\n"); } else if (q && q->info.typ->wsdl == False) { q->info.typ->wsdl = True; fprintf(fd, "\n", ns_remove(((Tnode*)q->info.typ->ref)->id->name)); if (is_document(method_style)) { if (has_ns_eq(NULL, ((Entry*)p->info.typ->ref)->sym->name)) fprintf(fd, " \n", ns_convert(((Entry*)p->info.typ->ref)->sym->name)); else if (is_invisible(((Tnode*)q->info.typ->ref)->id->name)) { r = ((Table*)((Tnode*)q->info.typ->ref)->ref)->list; if (r) { fprintf(fd, " sym, r, ns, 1)) fprintf(fd, " \n"); } } else { fprintf(fd, " info.typ->ref)->id->name)); if (gen_member_documentation(fd, p->sym, q, ns, 1)) fprintf(fd, " \n"); } } else { if (((Tnode*)q->info.typ->ref)->ref) { for (q = ((Table*)((Tnode*)q->info.typ->ref)->ref)->list; q; q = q->next) { if (!is_transient(q->info.typ) && !(q->info.sto & Sattribute) && q->info.typ->type != Tfun && !is_repetition(q) && !is_anytype(q)) { if (is_XML(q->info.typ) || is_stdXML(q->info.typ)) fprintf(fd, " \n"); else { fprintf(fd, " sym->name), wsdl_type(q->info.typ, ns)); if (gen_member_documentation(fd, p->sym, q, ns, 1)) fprintf(fd, " \n"); } } } } } if (mimeout) fprintf(fd, " \n"); fprintf(fd, "\n\n"); } fflush(fd); } } if (custom_header) { Table *r; fprintf(fd, "\n", name); r = (Table*)entry(classtable, lookup("SOAP_ENV__Header"))->info.typ->ref; if (r) { for (q = r->list; q; q = q->next) { if (!is_transient(q->info.typ) && !(q->info.sto & Sattribute) && q->info.typ->type != Tfun && !is_repetition(q) && !is_anytype(q)) fprintf(fd, " \n", ns_remove(q->sym->name), ns_add(q, ns)); } } fprintf(fd, "\n\n"); } if (custom_fault) { Table *r; fprintf(fd, "\n", name); r = (Table*)entry(classtable, lookup("SOAP_ENV__Detail"))->info.typ->ref; if (r) for (q = r->list; q; q = q->next) if (!is_transient(q->info.typ) && !is_repetition(q) && !is_anytype(q) && !(q->info.sto & Sattribute) && q->info.typ->type != Tfun && has_ns_eq(NULL, q->sym->name)) { fprintf(fd, " sym->name), ns_add(q, ns)); if (gen_member_documentation(fd, q->sym, q, ns, 1)) fprintf(fd, " \n"); } fprintf(fd, "\n\n"); } if (sp) { for (m = sp->list; m; m = m->next) { if (m->mess&FAULT && m->part) { Method *m2; int flag = 0; for (m2 = sp->list; m2 && m2 != m; m2 = m2->next) if (m2->mess&FAULT && !strcmp(m2->part, m->part)) flag = 1; if (!flag) { if (typetable) for (p = typetable->list; p; p = p->next) if ((m->mess&FAULT) && is_eq(m->part, p->info.typ->sym->name)) break; if (!p && classtable) for (p = classtable->list; p; p = p->next) if ((m->mess&FAULT) && is_eq(m->part, p->info.typ->id->name)) break; if (p) { fprintf(fd, "\n", ns_remove(m->part)); fprintf(fd, " \n", ns_convert(m->part)); fprintf(fd, "\n\n"); flag = 0; if (custom_fault) { Table *r; r = (Table*)entry(classtable, lookup("SOAP_ENV__Detail"))->info.typ->ref; if (r) for (q = r->list; q; q = q->next) if (!is_transient(q->info.typ) && !is_repetition(q) && !is_anytype(q) && !(q->info.sto & Sattribute) && q->info.typ->type != Tfun && (!strcmp(q->sym->name, m->part) || !strcmp(q->sym->name + 1, m->part))) { flag = 1; break; } } if (!flag) { sprintf(errbuf, "//gsoap %s method-fault %s %s directive does not refer to a member of struct SOAP_ENV__Detail: suggest to define struct SOAP_ENV__Detail with member %s", sp->ns, m->name, m->part, m->part); semwarn(errbuf); } } else { sprintf(errbuf, "//gsoap %s method-fault %s %s directive does not refer to struct/class or typedef: should globablly define fault %s as type (typedef or struct/class)", sp->ns, m->name, m->part, m->part); semwarn(errbuf); } } } } } fflush(fd); if (sp && sp->porttype) fprintf(fd, "\n", sp->porttype); else fprintf(fd, "\n", ns_cname(name, "PortType")); if (protocol) { if (strncmp(protocol, "SOAP", 4)) { if (strstr(protocol, "GET")) mask = 0x2; else if (strstr(protocol, "PUT")) mask = 0x4; else /* POST */ mask = 0x8; } else mask = 0x1; } for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun && !(p->info.sto & Sextern) && has_ns_eq(ns, p->sym->name)) { comment = NULL; if (sp) { for (m = sp->list; m; m = m->next) { if (m->mess == COMMENT && is_eq_nons(m->name, p->sym->name)) comment = m->part; else if (m->mess == PROTOCOL) { if (strncmp(m->part, "SOAP", 4)) { if (strstr(m->part, "GET")) mask |= 0x2; else if (strstr(m->part, "PUT")) mask |= 0x4; else /* POST */ mask |= 0x8; } else mask |= 0x1; } } } if (!mask) { if (soap_version < 0) mask = 0x8; /* -0 option: use POST */ else mask = 0x1; } fprintf(fd, " \n", ns_remove(p->sym->name)); if (comment) fprintf(fd, " %s\n", comment); else fprintf(fd, " Service definition of function %s\n", p->sym->name); if (get_response(p->info.typ)) fprintf(fd, " \n", ns_remove(p->sym->name)); else fprintf(fd, " \n", ns_remove(p->sym->name)); q = (Entry*)p->info.typ->ref; if (q && is_transient(q->info.typ)) ; else if (q && !is_response(q->info.typ)) fprintf(fd, " \n", ns_remove(p->sym->name)); else if (q) fprintf(fd, " \n", ns_remove(((Tnode*)q->info.typ->ref)->id->name)); if (sp) for (m = sp->list; m; m = m->next) if ((m->mess&FAULT) && is_eq_nons(m->name, p->sym->name)) fprintf(fd, " \n", ns_remove(m->part), ns_remove(m->part)); fprintf(fd, " \n"); } } fprintf(fd, "\n\n"); for (prot = 0x1; prot <= 0x8; prot <<= 1) { if ((prot & mask)) { const char *v = "", *b = ""; switch (prot) { case 0x1: v = ""; b = "SOAP"; break; case 0x2: v = "GET"; b = "HTTP"; break; case 0x4: v = "PUT"; b = "HTTP"; break; case 0x8: v = "POST"; b = "HTTP"; break; } fprintf(fd, "porttype) fprintf(fd, "type=\"tns:%s\">\n porttype); else fprintf(fd, "type=\"tns:%s\">\n porttype) fprintf(fd, "type=\"tns:%s\">\n porttype); else fprintf(fd, "type=\"tns:%s\">\n transport) fprintf(fd, " transport=\"%s\"/>\n", sp->transport); else fprintf(fd, " transport=\"http://schemas.xmlsoap.org/soap/http\"/>\n"); } else { if (sp && sp->porttype) fprintf(fd, "type=\"tns:%s\">\n \n", sp->porttype, v); else fprintf(fd, "type=\"tns:%s\">\n \n", ns_cname(name, "PortType"), v); } fflush(fd); for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun && !(p->info.sto & Sextern) && has_ns_eq(ns, p->sym->name)) { action = ""; mimein = NULL; mimeout = NULL; method_style = style; method_encoding = encoding; method_response_encoding = NULL; if (sp) { int v = 0x1; if (sp->protocol) { if (strncmp(sp->protocol, "SOAP", 4)) { if (strstr(sp->protocol, "GET")) v = 0x2; else if (strstr(sp->protocol, "PUT")) v = 0x4; else /* POST */ v = 0x8; } } for (m = sp->list; m; m = m->next) { if (is_eq_nons(m->name, p->sym->name)) { if (m->mess&MIMEIN) mimein = m->part; if (m->mess&MIMEOUT) mimeout = m->part; if (m->mess == ENCODING) method_encoding = m->part; else if (m->mess == RESPONSE_ENCODING) method_response_encoding = m->part; else if (m->mess == STYLE) method_style = m->part; else if (m->mess == ACTION || m->mess == REQUEST_ACTION) action = m->part; else if (m->mess == RESPONSE_ACTION) action = m->part; else if (m->mess == PROTOCOL) { if (strncmp(m->part, "SOAP", 4)) { if (strstr(m->part, "GET")) v = 0x2; else if (strstr(m->part, "PUT")) v = 0x4; else /* POST */ v = 0x8; } else v = 0x1; } } } if (soap_version < 0) v = 0x8; if (prot != v) continue; } if (!method_response_encoding) method_response_encoding = method_encoding; fprintf(fd, " \n", ns_remove(p->sym->name)); if (prot == 0x1) { if (is_document(style)) { if (is_document(method_style)) { if (is_soap12(encoding) && !*action) fprintf(fd, " \n"); else if (*action == '"') fprintf(fd, " \n", action); else fprintf(fd, " \n", action); } else if (is_soap12(encoding) && !*action) fprintf(fd, " \n"); else if (*action == '"') fprintf(fd, " \n", action); else fprintf(fd, " \n", action); } else { if (is_document(method_style)) { if (is_soap12(encoding) && !*action) fprintf(fd, " \n"); else if (*action == '"') fprintf(fd, " \n", action); else fprintf(fd, " \n", action); } else if (is_soap12(encoding) && !*action) fprintf(fd, " \n"); else if (*action == '"') fprintf(fd, " \n", action); else fprintf(fd, " \n", action); } } else { if (!*action) fprintf(fd, " \n"); else if (*action == '"') fprintf(fd, " \n", action); else fprintf(fd, " \n", action); } fprintf(fd, " \n"); q = entry(classtable, p->sym); if (prot == 0x1) { if (mimein) fprintf(fd, " \n \n"); if (is_literal(method_encoding) || (q && (q = (((Table*)q->info.typ->ref)->list)) && q && is_XML(q->info.typ))) { if (is_document(method_style)) fprintf(fd, " \n"); else fprintf(fd, " \n", URI); } else { if (encoding && *encoding) fprintf(fd, " \n", URI, encoding); else if (method_encoding && *method_encoding) fprintf(fd, " \n", URI, method_encoding); else fprintf(fd, " \n", URI, encURI); if (!eflag) { sprintf(errbuf, "operation '%s' is not compliant with WS-I Basic Profile 1.0a, reason: uses SOAP encoding", p->sym->name); compliancewarn(errbuf); } } if (custom_header) { m = NULL; if (sp) { for (m = sp->list; m; m = m->next) if (is_eq_nons(m->name, p->sym->name) && (m->mess&HDRIN)) { if (chkhdr(m->part)) fprintf(fd, " \n", name, ns_remove(m->part)); } } } if (mimein) { if (sp) { for (m = sp->list; m; m = m->next) { if (is_eq_nons(m->name, p->sym->name) && (m->mess&MIMEIN)) fprintf(fd, " \n \n \n", m->part); } } fprintf(fd, " \n \n"); } } else if (prot == 0x2) fprintf(fd, " \n"); else { if (mimein) fprintf(fd, " \n", mimein); else if (!q || is_document(method_style)) fprintf(fd, " \n"); else fprintf(fd, " \n", ns_remove(q->sym->name)); } fprintf(fd, " \n"); q = (Entry*)p->info.typ->ref; if (!q || !q->info.typ->ref) { fprintf(fd, " \n"); continue; } if (prot != 0x4) { fprintf(fd, " \n"); if (prot == 0x1) { if (mimeout) fprintf(fd, " \n \n"); if (is_literal(method_response_encoding) || is_XML((Tnode*)q->info.typ->ref)) { if (is_document(method_style)) fprintf(fd, " \n"); else fprintf(fd, " \n", URI); } else if (encoding && *encoding) fprintf(fd, " \n", URI, encoding); else if (method_response_encoding && *method_response_encoding) fprintf(fd, " \n", URI, method_response_encoding); else fprintf(fd, " \n", URI, encURI); if (custom_header) { if (sp) for (m = sp->list; m; m = m->next) if (is_eq_nons(m->name, p->sym->name) && (m->mess&HDROUT)) { if (chkhdr(m->part)) fprintf(fd, " \n", name, ns_remove(m->part)); } } if (mimeout) { if (sp) { for (m = sp->list; m; m = m->next) { if (is_eq_nons(m->name, p->sym->name) && (m->mess&MIMEOUT)) fprintf(fd, " \n \n \n", m->part); } } fprintf(fd, " \n \n"); } } else { q = (Entry*)p->info.typ->ref; if (is_document(method_style)) fprintf(fd, " \n"); else if (q && !is_transient(q->info.typ) && !is_response(q->info.typ) && is_literal(method_response_encoding)) fprintf(fd, " \n", ns_remove(q->sym->name)); else fprintf(fd, " \n"); } fprintf(fd, " \n"); } if (sp) for (m = sp->list; m; m = m->next) if ((m->mess&FAULT) && is_eq_nons(m->name, p->sym->name)) fprintf(fd, " \n \n \n", ns_remove(m->part), ns_remove(m->part)); fprintf(fd, " \n"); fflush(fd); } } fprintf(fd, "\n\n"); } } } fprintf(fd, "\n", name); if (sp && sp->documentation) fprintf(fd, " %s\n", sp->documentation); else fprintf(fd, " gSOAP " VERSION " generated service definition\n"); if (executable) fprintf(fd, " \n \n ", portname, binding, URL, executable); for (prot = 0x1; prot <= 0x8; prot <<= 1) { if ((prot & mask)) { const char *s, *t, *v = "", *b = ""; switch (prot) { case 0x1: v = ""; b = "SOAP"; break; case 0x2: v = "GET"; b = "HTTP"; break; case 0x4: v = "PUT"; b = "HTTP"; break; case 0x8: v = "POST"; b = "HTTP"; break; } fprintf(fd, " \n", portname, v, binding, v); for (s = URL; s; s = t) { int n; t = strchr(s, ' '); if (t) { n = (int)(t - s); t++; } else n = (int)strlen(s); fprintf(fd, " <%s:address location=\"%.*s\"/>\n", b, n, s); } fprintf(fd, " \n"); } } fprintf(fd, "\n\n\n"); } const char * default_value(Entry *e) { const char *a; Entry *q; static char buf[4096]; buf[0] = '\0'; if (e->info.sto & Sconst) a = "fixed"; else a = "default"; if (e->info.hasval) { switch (e->info.typ->type) { case Tchar: case Twchar: case Tuchar: case Tshort: case Tushort: case Tint: case Tuint: case Tlong: case Tllong: case Tulong: case Tullong: case Tsize: sprintf(buf, " %s=\"" SOAP_LONG_FORMAT "\"", a, e->info.val.i); break; case Tfloat: case Tdouble: case Tldouble: sprintf(buf, " %s=\"%g\"", a, e->info.val.r); break; case Ttime: break; /* should get value? */ case Tenum: case Tenumsc: for (q = ((Table*)e->info.typ->ref)->list; q; q = q->next) { if (q->info.val.i == e->info.val.i) { sprintf(buf, " %s=\"%s\"", a, ns_remove2(q->sym->name, c_ident(e->info.typ))); break; } } break; default: if (e->info.val.s && strlen(e->info.val.s) < sizeof(buf)-12) sprintf(buf, " %s=\"%s\"", a, xstring(e->info.val.s)); break; } } return buf; } const char * nillable(Tnode *typ) { if (typ->type == Tpointer) return "true"; return "false"; } void gen_schema(FILE *fd, Table *t, const char *ns1, const char *ns, int all, const char *style, const char *encoding) { int i, d; char cbuf[4]; Entry *p, *q, *r; Tnode *n; Symbol *s; Service *sp, *sp2; Method *m; int flag; if (!strcmp(ns, "SOAP-ENV") || !strcmp(ns, "SOAP-ENC") || !strcmp(ns, "xsi") || !strcmp(ns, "xsd")) return; for (sp = services; sp; sp = sp->next) if (!tagcmp(sp->ns, ns) && sp->URI) break; if (sp && sp->import) return; fprintf(fd, " URI); else fprintf(fd, "targetNamespace=\"%s/%s.xsd\"", tmpURI, ns_convert(ns)); for (s = nslist; s; s = s->next) { for (sp2 = services; sp2; sp2 = sp2->next) if (!tagcmp(sp2->ns, s->name) && sp2->URI) break; if (sp2) fprintf(fd, "\n xmlns:%s=\"%s\"", ns_convert(s->name), sp2->URI); else if (!strcmp(s->name, "SOAP-ENV")) { if (soap_version >= 0) fprintf(fd, "\n xmlns:SOAP-ENV=\"%s\"", envURI); } else if (!strcmp(s->name, "SOAP-ENC")) { if (soap_version >= 0) fprintf(fd, "\n xmlns:SOAP-ENC=\"%s\"", encURI); } else if (!strcmp(s->name, "xsi")) fprintf(fd, "\n xmlns:xsi=\"%s\"", xsiURI); else if (!strcmp(s->name, "xsd")) fprintf(fd, "\n xmlns:xsd=\"%s\"", xsdURI); else fprintf(fd, "\n xmlns:%s=\"%s/%s.xsd\"", ns_convert(s->name), tmpURI, ns_convert(s->name)); } fprintf(fd, "\n xmlns=\"%s\"\n", xsdURI); if (sp && (sp->elementForm || sp->attributeForm)) fprintf(fd, " elementFormDefault=\"%s\"\n attributeFormDefault=\"%s\">\n", sp->elementForm?sp->elementForm:"unqualified", sp->attributeForm?sp->attributeForm:"unqualified"); else if (style && !strcmp(style, "document")) fprintf(fd, " elementFormDefault=\"qualified\"\n attributeFormDefault=\"unqualified\">\n"); else fprintf(fd, " elementFormDefault=\"unqualified\"\n attributeFormDefault=\"unqualified\">\n"); fflush(fd); flag = 0; for (s = nslist; s; s = s->next) { for (sp2 = services; sp2; sp2 = sp2->next) if (sp2 != sp && !tagcmp(sp2->ns, s->name) && sp2->URI) break; if (sp2) { fprintf(fd, " URI); if (sp2->import) fprintf(fd, " schemaLocation=\"%s\"", sp2->import); fprintf(fd, "/>\n"); if (!strcmp(sp2->URI, encURI)) flag = 1; } } if (!flag) fprintf(fd, " ", encURI); fprintf(fd, "\n"); fflush(fd); if (typetable) { for (p = typetable->list; p; p = p->next) { if (is_transient(p->info.typ) || is_invisible(p->sym->name) || p->info.typ->type == Ttemplate) continue; if (is_element(p->info.typ) && (p->info.typ->type == Tclass || p->info.typ->type == Tstruct) && !is_stdstr(p->info.typ)) continue; if ((!is_external(p->info.typ) || is_volatile(p->info.typ)) && ((has_ns_eq(ns, p->sym->name)))) { /* typedefs that are used for SOAP Fault details */ m = NULL; if (p->info.typ->type != Tstruct && p->info.typ->type != Tclass) { for (sp2 = services; sp2 && !m; sp2 = sp2->next) { for (m = sp2->list; m; m = m->next) { if ((m->mess&FAULT) && m->part && is_eq(m->part, p->sym->name)) break; } } } if (m) { if (!uflag) fprintf(fd, " \n"); fprintf(fd, " \n", ns_remove(p->sym->name), base_type(p->info.typ, ns1)); gen_type_documentation(fd, p, ns); fprintf(fd, " \n"); continue; } if (is_primitive_or_string(p->info.typ) || (p->info.typ->type == Tpointer && is_primitive_or_string((Tnode*)p->info.typ->ref))) { fprintf(fd, " ", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); if (p->info.typ->pattern && p->info.typ->pattern[0] == '%' && p->info.typ->pattern[1]) { unsigned int n = (unsigned int)strtoul(p->info.typ->pattern + 1, NULL, 10); unsigned int f = 0; const char *s = strchr(p->info.typ->pattern, '.'); if (s) f = (unsigned int)strtoul(s + 1, NULL, 10); if (s && f && (p->info.typ->type == Tfloat || p->info.typ->type == Tdouble || p->info.typ->type == Tldouble)) { fprintf(fd, " \n", base_type(p->info.typ, ns1)); if (n) fprintf(fd, " \n", n); fprintf(fd, " \n", f); } else if (n && (p->info.typ->type == Tfloat || p->info.typ->type == Tdouble || p->info.typ->type == Tldouble)) { fprintf(fd, " \n", base_type(p->info.typ, ns1)); fprintf(fd, " \n", n); } else if (n && p->info.typ->type >= Tchar && p->info.typ->type <= Tullong) { fprintf(fd, " \n", base_type(p->info.typ, ns1)); fprintf(fd, " \n", n); } else { fprintf(fd, " \n", base_type(p->info.typ, ns1)); } } else { fprintf(fd, " \n", base_type(p->info.typ, ns1)); if (p->info.typ->pattern) fprintf(fd, " \n", p->info.typ->pattern); } if (is_primitive(p->info.typ) || (p->info.typ->type == Tpointer && is_primitive((Tnode*)p->info.typ->ref) && !is_string(p->info.typ) && !is_wstring(p->info.typ))) { if (p->info.typ->hasmin) { if (p->info.typ->type >= Tfloat && p->info.typ->type <= Tldouble) { if (p->info.typ->incmin) fprintf(fd, " \n", p->info.typ->min); else fprintf(fd, " \n", p->info.typ->min); } else { if (p->info.typ->incmin) fprintf(fd, " \n", (LONG64)p->info.typ->min); else fprintf(fd, " \n", (LONG64)p->info.typ->min); } } if (p->info.typ->hasmax) { if (p->info.typ->type >= Tfloat && p->info.typ->type <= Tldouble) { if (p->info.typ->incmax) fprintf(fd, " \n", p->info.typ->max); else fprintf(fd, " \n", p->info.typ->max); } else { if (p->info.typ->incmax) fprintf(fd, " \n", (LONG64)p->info.typ->max); else fprintf(fd, " \n", (LONG64)p->info.typ->max); } } } else { if (p->info.typ->hasmax && p->info.typ->max >= 0 && p->info.typ->incmin && p->info.typ->incmax && p->info.typ->min == p->info.typ->max) fprintf(fd, " \n", (ULONG64)p->info.typ->max); else { if (p->info.typ->hasmin && p->info.typ->min >= 0) { if (p->info.typ->incmin) fprintf(fd, " \n", (ULONG64)p->info.typ->min); else fprintf(fd, " \n", (ULONG64)p->info.typ->min + 1); } if (p->info.typ->hasmax && p->info.typ->max >= 0) { if (p->info.typ->incmax) fprintf(fd, " \n", (ULONG64)p->info.typ->max); else fprintf(fd, " \n", (ULONG64)p->info.typ->max - 1); } } } fprintf(fd, " \n \n"); } else if (is_fixedstring(p->info.typ)) { fprintf(fd, " ", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " \n", base_type(p->info.typ, ns1)); if (p->info.typ->hasmin && p->info.typ->min >= 0) { if (p->info.typ->incmin) fprintf(fd, " \n", (ULONG64)p->info.typ->min); else fprintf(fd, " \n", (ULONG64)p->info.typ->min + 1); } if (p->info.typ->hasmax && p->info.typ->max >= 0) { if (p->info.typ->incmax) fprintf(fd, " \n", (ULONG64)p->info.typ->max); else fprintf(fd, " \n", (ULONG64)p->info.typ->max - 1); } else fprintf(fd, " \n", get_dimension(p->info.typ) - 1); fprintf(fd, " \n \n"); } else { fprintf(fd, " ", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " \n \n", base_type(p->info.typ, ns1)); fprintf(fd, " \n \n \n"); } } } } fflush(fd); if (enumtable) { for (p = enumtable->list; p; p = p->next) { if (!is_transient(p->info.typ) && !is_invisible(p->sym->name) && ((!has_ns(p->info.typ) && all) || has_ns_eq(ns, p->sym->name))) { flag = 0; if ((Table*)p->info.typ->ref) { for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next) { if (!has_ns_eq(NULL, ns_remove2(q->sym->name, c_ident(p->info.typ)))) { flag = 1; break; } } if (flag == 1) { for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next) { const char *s = ns_remove2(q->sym->name, c_ident(p->info.typ)); while (*s && isdigit(*s)) s++; if (*s) { flag = 2; break; } } } } fprintf(fd, " ", wsdl_type(p->info.typ, NULL)); gen_type_documentation(fd, p, ns); if (is_mask(p->info.typ)) { fprintf(fd, " \n"); if (flag == 0) fprintf(fd, " \n"); else if (flag == 1) fprintf(fd, " \n"); else fprintf(fd, " \n"); if ((Table*)p->info.typ->ref) { for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next) { fprintf(fd, " sym->name, c_ident(p->info.typ))); if (gen_member_documentation(fd, p->sym, q, ns, q->info.typ->type == Tenumsc)) fprintf(fd, " "); if (!uflag) fprintf(fd, " \n", q->info.val.i); } } fprintf(fd, " \n \n \n"); } else { if (flag == 0) fprintf(fd, " \n"); else if (flag == 1) fprintf(fd, " \n"); else fprintf(fd, " \n"); if ((Table*)p->info.typ->ref) { for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next) { fprintf(fd, " sym->name, c_ident(p->info.typ))); if (gen_member_documentation(fd, p->sym, q, ns, q->info.typ->type == Tenumsc)) fprintf(fd, " "); if (!uflag) fprintf(fd, " \n", q->info.val.i); } } fprintf(fd, " \n
\n"); } } } } fflush(fd); if (classtable) { for (p = classtable->list; p; p = p->next) { if (is_transient(p->info.typ) || is_invisible(p->sym->name)) continue; for (q = t->list; q; q = q->next) if (q->info.typ->type == Tfun && !(q->info.sto & Sextern) && p == get_response(q->info.typ)) break; /* omit the auto-generated and user-defined response struct/class (when necessary) */ if (!q) for (q = t->list; q; q = q->next) if (q->info.typ->type == Tfun && !(q->info.sto & Sextern) && !has_ns_eq(NULL, ((Entry*)q->info.typ->ref)->sym->name)) { r = entry(t, q->sym); if (r && r->info.typ->ref && is_response(((Entry*)r->info.typ->ref)->info.typ) && p->info.typ == (Tnode*)((Entry*)r->info.typ->ref)->info.typ->ref) break; } if (q) continue; /* classes that are used for SOAP Fault details */ m = NULL; for (sp2 = services; sp2 && !m; sp2 = sp2->next) for (m = sp2->list; m; m = m->next) if ((m->mess&FAULT) && m->part && is_eq(m->part, p->sym->name)) break; if (m) { if ((!has_ns(p->info.typ) && all) || has_ns_eq(ns, p->sym->name)) { if (!uflag) fprintf(fd, " \n"); fprintf(fd, " \n", ns_remove(p->sym->name), base_type(p->info.typ, ns1)); gen_type_documentation(fd, p, ns); fprintf(fd, " \n"); } } if (p->info.typ->ref && is_binary(p->info.typ)) { if ((!has_ns(p->info.typ) && all) || has_ns_eq(ns, p->sym->name)) { if (is_attachment(p->info.typ)) { fprintf(fd, " ", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " \n \n"); if (!eflag) fprintf(fd, " \n"); gen_schema_attributes(fd, p->info.typ, ns, ns1); fprintf(fd, " \n \n \n"); } else { fprintf(fd, " ", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " \n"); if (p->info.typ->hasmax && p->info.typ->max >= 0 && p->info.typ->incmin && p->info.typ->incmax && p->info.typ->min == p->info.typ->max) fprintf(fd, " \n", (ULONG64)p->info.typ->min); else { if (p->info.typ->hasmin && p->info.typ->min >= 0) { if (p->info.typ->incmin) fprintf(fd, " \n", (ULONG64)p->info.typ->min); else fprintf(fd, " \n", (ULONG64)p->info.typ->min + 1); } if (p->info.typ->hasmax && p->info.typ->max >= 0) { if (p->info.typ->incmax) fprintf(fd, " \n", (ULONG64)p->info.typ->max); else fprintf(fd, " \n", (ULONG64)p->info.typ->max - 1); } } fprintf(fd, " \n \n"); } } } else if (p->info.typ->ref && !is_transient(p->info.typ) && is_primclass(p->info.typ)) { if ((!has_ns(p->info.typ) && all) || has_ns_eq(ns, p->sym->name)) { q = ((Table*)p->info.typ->ref)->list; if (q && strncmp(q->sym->name, "xsd__anyType", 12)) { if (is_string(q->info.typ) || is_wstring(q->info.typ) || is_stdstring(q->info.typ) || is_stdwstring(q->info.typ)) { fprintf(fd, " ", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " \n \n", wsdl_type(q->info.typ, ns1)); gen_schema_attributes(fd, p->info.typ, ns, ns1); fprintf(fd, " \n \n \n"); } else if (is_primitive(q->info.typ) && q->info.typ->type != Tenum && q->info.typ->type != Tenumsc) { fprintf(fd, " ", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " \n \n", wsdl_type(q->info.typ, ns1)); gen_schema_attributes(fd, p->info.typ, ns, ns1); fprintf(fd, " \n \n \n"); } else if (!has_ns(q->info.typ)) { fprintf(fd, " ", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " \n \n", wsdl_type(q->info.typ, ns1)); gen_schema_attributes(fd, p->info.typ, ns, ns1); fprintf(fd, " \n \n \n"); } } } } else if (p->info.typ->ref && !is_transient(p->info.typ)) { q = ((Table*)p->info.typ->ref)->list; if (entry(t, p->sym) && (!q || !is_XML(q->info.typ))) ; else if (is_dynamic_array(p->info.typ)) { if (eflag || (!has_ns(p->info.typ) && !is_untyped(p->info.typ))) { if (all) { d = get_Darraydims(p->info.typ)-1; for (i = 0; i < d; i++) cbuf[i] = ','; cbuf[i] = '\0'; if (q->info.maxOccurs == 1) { fprintf(fd, " \n \n", wsdl_type(p->info.typ, NULL)); if (!is_literal(encoding)) fprintf(fd, " \n"); fprintf(fd, " \n \n \n", q->sym->name[5]?ns_remove(q->sym->name+5):"item", wsdl_type(q->info.typ, ns1), nillable((Tnode*)q->info.typ->ref)); if (!is_literal(encoding)) fprintf(fd, " \n \n", wsdl_type(p->info.typ, NULL), cbuf); fprintf(fd, " \n \n"); } else { fprintf(fd, " \n \n", wsdl_type(p->info.typ, NULL)); if (!is_literal(encoding)) fprintf(fd, " \n"); fprintf(fd, " \n \n \n", q->sym->name[5]?ns_remove(q->sym->name+5):"item", wsdl_type(q->info.typ, ns1), q->info.minOccurs, q->info.maxOccurs, nillable((Tnode*)q->info.typ->ref)); if (!is_literal(encoding)) fprintf(fd, " \n \n", wsdl_type(q->info.typ, ns1), cbuf); fprintf(fd, " \n \n"); } } } else if (p->info.typ->ref && ((Table*)p->info.typ->ref)->prev && !is_transient(entry(classtable, ((Table*)p->info.typ->ref)->prev->sym)->info.typ) && strncmp(((Table*)p->info.typ->ref)->prev->sym->name, "xsd__anyType", 12)) { if (q->info.maxOccurs == 1) { fprintf(fd, " ", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " \n \n \n", ns_convert(((Table*)p->info.typ->ref)->prev->sym->name)); fprintf(fd, " \n", q->sym->name[5]?ns_remove(q->sym->name+5):"item", wsdl_type(q->info.typ, ns1)); fprintf(fd, " \n \n \n"); gen_schema_attributes(fd, p->info.typ, ns, ns1); fprintf(fd, " \n"); } else { fprintf(fd, " ", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " \n \n \n", ns_convert(((Table*)p->info.typ->ref)->prev->sym->name)); fprintf(fd, " \n", q->sym->name[5]?ns_remove(q->sym->name+5):"item", wsdl_type(q->info.typ, ns1), q->info.minOccurs, q->info.maxOccurs, nillable((Tnode*)q->info.typ->ref)); fprintf(fd, " \n \n \n"); gen_schema_attributes(fd, p->info.typ, ns, ns1); fprintf(fd, " \n"); } } else { if (q->info.maxOccurs == 1) { fprintf(fd, " ", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " \n \n \n \n", q->sym->name[5]?ns_remove(q->sym->name+5):"item", wsdl_type(q->info.typ, ns1), nillable((Tnode*)q->info.typ->ref)); } else { fprintf(fd, " ", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " \n \n \n \n", q->sym->name[5]?ns_remove(q->sym->name+5):"item", wsdl_type(q->info.typ, ns1), q->info.minOccurs, q->info.maxOccurs, nillable((Tnode*)q->info.typ->ref)); } } } else if (is_discriminant(p->info.typ) && ((!has_ns(p->info.typ) && all) || has_ns_eq(ns, p->sym->name))) { if (p->info.typ->ref) { fprintf(fd, " \n", ns_remove(p->sym->name)); gen_schema_elements(fd, p->info.typ, ns, ns1); fprintf(fd, " \n"); } } else if (p->info.typ->type == Tstruct && ((!has_ns(p->info.typ) && all) || has_ns_eq(ns, p->sym->name))) { if (p->info.typ->ref) { fprintf(fd, " ", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " \n"); gen_schema_elements(fd, p->info.typ, ns, ns1); fprintf(fd, " \n"); gen_schema_attributes(fd, p->info.typ, ns, ns1); fprintf(fd, " \n"); } } else if (p->info.typ->type == Tclass && ((!has_ns(p->info.typ) && all) || has_ns_eq(ns, p->sym->name))) { if (p->info.typ->ref) { if (((Table*)p->info.typ->ref)->prev && !is_transient(entry(classtable, ((Table*)p->info.typ->ref)->prev->sym)->info.typ) && strncmp(((Table*)p->info.typ->ref)->prev->sym->name, "xsd__anyType", 12)) { fprintf(fd, " ", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " \n \n \n", ns_convert(((Table*)p->info.typ->ref)->prev->sym->name)); gen_schema_elements(fd, p->info.typ, ns, ns1); fprintf(fd, " \n \n \n"); gen_schema_attributes(fd, p->info.typ, ns, ns1); fprintf(fd, " \n"); } else { fprintf(fd, " ", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " \n"); gen_schema_elements(fd, p->info.typ, ns, ns1); fprintf(fd, " \n"); gen_schema_attributes(fd, p->info.typ, ns, ns1); fprintf(fd, " \n"); } } } } } } fflush(fd); for (n = Tptr[Tarray]; n; n = n->next) { if (is_transient(n) || is_fixedstring(n)) continue; if (is_literal(encoding)) fprintf(fd, " \n \n \n \n \n \n \n", c_ident(n), wsdl_type((Tnode*)n->ref, ns1), get_dimension(n)); else fprintf(fd, " \n \n \n \n \n \n \n", c_ident(n), xsi_type((Tnode*)n->ref), get_dimension(n)); fflush(fd); } gen_schema_elements_attributes(fd, t, ns, ns1, style, encoding); fprintf(fd, " \n\n"); } void gen_schema_elements(FILE *fd, Tnode *p, const char *ns, const char *ns1) { Entry *q; for (q = ((Table*)p->ref)->list; q; q = q->next) if (gen_schema_element(fd, p, q, ns, ns1)) q = q->next; } int gen_schema_element(FILE *fd, Tnode *p, Entry *q, const char *ns, const char *ns1) { const char *s, *t; if (is_transient(q->info.typ) || (q->info.sto & Sattribute) || q->info.typ->type == Tfun || q->info.typ->type == Tunion) return 0; if (is_repetition(q)) { if (is_sequence(q->next)) { fprintf(fd, " \n"); if (q->next->info.typ->ref) gen_schema_elements(fd, (Tnode*)q->next->info.typ->ref, ns, ns1); fprintf(fd, " \n"); return 1; } t = ns_convert(q->next->sym->name); if (*t == '-') fprintf(fd, " \n", q->next->sym->name); else if ((s = strchr(t+1, ':')) && (!strchr(q->next->sym->name+1, ':') || !has_ns_eq(ns, q->next->sym->name))) { if (((Tnode*)q->next->info.typ->ref)->type == Tpointer) { if (q->info.maxOccurs == 1) fprintf(fd, " info.minOccurs); else fprintf(fd, " info.minOccurs, q->info.maxOccurs); } else if (q->info.maxOccurs == 1) fprintf(fd, " info.minOccurs); else fprintf(fd, " info.minOccurs, q->info.maxOccurs); if (gen_member_documentation(fd, p->id, q, ns, 1)) fprintf(fd, " \n"); } else { const char *form = ""; if (!s) { s = t; if (*s == ':') { s++; form = " form=\"unqualified\""; } } else { s++; form = " form=\"qualified\""; } if (((Tnode*)q->next->info.typ->ref)->type == Tpointer) { if (q->info.maxOccurs == 1) fprintf(fd, " next->info.typ->ref, ns1), q->info.minOccurs, form); else fprintf(fd, " next->info.typ->ref, ns1), q->info.minOccurs, q->info.maxOccurs, form); } else if (q->info.maxOccurs == 1) fprintf(fd, " next->info.typ->ref, ns1), q->info.minOccurs, form); else fprintf(fd, " next->info.typ->ref, ns1), q->info.minOccurs, q->info.maxOccurs, form); if (gen_member_documentation(fd, p->id, q, ns, 1)) fprintf(fd, " \n"); } return 1; } else if ((q->info.typ->type == Ttemplate && !is_smart(q->info.typ)) || (q->info.typ->type == Tpointer && ((Tnode*)q->info.typ->ref)->type == Ttemplate) || (q->info.typ->type == Treference && ((Tnode*)q->info.typ->ref)->type == Ttemplate) || (q->info.typ->type == Trvalueref && ((Tnode*)q->info.typ->ref)->type == Ttemplate)) { t = ns_convert(q->sym->name); if (*t == '-') fprintf(fd, " \n", q->sym->name); else if ((s = strchr(t+1, ':')) && (!strchr(q->sym->name+1, ':') || !has_ns_eq(ns, q->sym->name))) { if (((Tnode*)q->info.typ->ref)->type == Tpointer) { if (q->info.maxOccurs == 1) fprintf(fd, " info.minOccurs); else fprintf(fd, " info.minOccurs, q->info.maxOccurs); } else if (q->info.maxOccurs == 1) fprintf(fd, " info.minOccurs); else fprintf(fd, " info.minOccurs, q->info.maxOccurs); if (gen_member_documentation(fd, p->id, q, ns, 1)) fprintf(fd, " \n"); } else { const char *form = ""; if (!s) { s = t; if (*s == ':') { s++; form = " form=\"unqualified\""; } } else { s++; form = " form=\"qualified\""; } if (((Tnode*)q->info.typ->ref)->type == Tpointer) { if (q->info.maxOccurs == 1) fprintf(fd, " info.typ->ref, ns1), q->info.minOccurs, form); else fprintf(fd, " info.typ->ref, ns1), q->info.minOccurs, q->info.maxOccurs, form); } else if (q->info.maxOccurs == 1) fprintf(fd, " info.typ->ref, ns1), q->info.minOccurs, form); else fprintf(fd, " info.typ->ref, ns1), q->info.minOccurs, q->info.maxOccurs, form); if (gen_member_documentation(fd, p->id, q, ns, 1)) fprintf(fd, " \n"); } } else if (is_anytype(q)) /* ... maybe need to show all possible types rather than xsd:anyType */ { fprintf(fd, " \n", ns_convert(q->next->sym->name), q->info.minOccurs, q->info.maxOccurs); return 1; } else if (is_choice(q)) { if (q->info.minOccurs == 0) fprintf(fd, " \n"); else fprintf(fd, " \n"); if (q->next->info.typ->ref) gen_schema_elements(fd, q->next->info.typ, ns, ns1); fprintf(fd, " \n"); return 1; } else if (is_sequence(q)) { if (q->info.minOccurs == 0) fprintf(fd, " \n"); else fprintf(fd, " \n"); if (q->info.typ->type == Tpointer) gen_schema_elements(fd, (Tnode*)q->info.typ->ref, ns, ns1); else if (q->info.typ->ref) gen_schema_elements(fd, q->info.typ, ns, ns1); fprintf(fd, " \n"); return 0; } else { t = ns_convert(q->sym->name); if (*t == '-') fprintf(fd, " \n", q->sym->name); else if ((s = strchr(t+1, ':')) && (!strchr(q->sym->name+1, ':') || !has_ns_eq(ns, q->sym->name))) { if (is_smart(q->info.typ) || q->info.typ->type == Tpointer || q->info.typ->type == Tarray || is_dynamic_array(q->info.typ)) fprintf(fd, " info.minOccurs, q->info.maxOccurs); else fprintf(fd, " info.minOccurs, q->info.maxOccurs); if (gen_member_documentation(fd, p->id, q, ns, 1)) fprintf(fd, " \n"); } else { const char *form = ""; if (!s) { s = t; if (*s == ':') { s++; form = " form=\"unqualified\""; } } else { s++; form = " form=\"qualified\""; } if (is_smart(q->info.typ) || q->info.typ->type == Tpointer || q->info.typ->type == Tarray || is_dynamic_array(q->info.typ)) fprintf(fd, " info.typ, ns1), q->info.minOccurs, q->info.maxOccurs, default_value(q), form); else fprintf(fd, " info.typ, ns1), q->info.minOccurs, q->info.maxOccurs, default_value(q), form); if (gen_member_documentation(fd, p->id, q, ns, 1)) fprintf(fd, " \n"); } } fflush(fd); return 0; } void gen_schema_elements_attributes(FILE *fd, Table *t, const char *ns, const char *ns1, const char *style, const char *encoding) { Entry *p, *q, *e; Table *elt, *att; Service *sp; Method *m; Symbol *sym; const char *s, *method_style, *method_encoding, *method_response_encoding; int all = !strcmp(ns, ns1); elt = mktable(NULL); att = mktable(NULL); if (t && all) { for (p = t->list; p; p = p->next) { if (!eflag && p->info.typ->type == Tfun && !(p->info.sto & Sextern) && has_ns_eq(ns, p->sym->name)) { method_encoding = encoding; method_response_encoding = NULL; method_style = style; for (sp = services; sp; sp = sp->next) { if (!tagcmp(sp->ns, ns)) { for (m = sp->list; m; m = m->next) { if (is_eq_nons(m->name, p->sym->name)) { if (m->mess == ENCODING) method_encoding = m->part; else if (m->mess == RESPONSE_ENCODING) method_response_encoding = m->part; else if (m->mess == STYLE) method_style = m->part; } } } } if (!method_response_encoding) method_response_encoding = method_encoding; q = entry(classtable, p->sym); if (q) { if (is_document(method_style)) { if (!is_invisible(p->sym->name)) { sym = p->sym; s = sym->name; if (*s == '_' && !(sym = lookup(s + 1))) sym = install(s + 1, ID); if (!entry(elt, sym)) { if (!uflag) fprintf(fd, " \n"); fprintf(fd, " \n \n \n", ns_remove(p->sym->name)); gen_schema_elements(fd, q->info.typ, ns, ns1); fprintf(fd, " \n"); gen_schema_attributes(fd, q->info.typ, ns, ns1); fprintf(fd, " \n \n"); e = enter(elt, sym); e->info = p->info; } } else { for (q = ((Table*)q->info.typ->ref)->list; q; q = q->next) { if (!(q->info.sto & Sextern) && !has_ns_eq(NULL, q->sym->name)) { sym = q->sym; s = sym->name; if (*s == '_' && !(sym = lookup(s + 1))) sym = install(s + 1, ID); if (!entry(elt, sym)) /* enter/entry w/o prefix is not useful to avoid clashes */ { if (!uflag) fprintf(fd, " \n"); fprintf(fd, " \n", ns_remove(q->sym->name), wsdl_type(q->info.typ, ns1)); e = enter(elt, sym); e->info = q->info; } } } } } q = (Entry*)p->info.typ->ref; for (e = t->list; e; e = e->next) if (e != p && e->info.typ->type == Tfun && !(e->info.sto & Sextern) && q == (Entry*)e->info.typ->ref) q = NULL; if (q && !is_transient(q->info.typ)) { if (!is_response(q->info.typ)) { if (is_document(method_style)) { if (!uflag) fprintf(fd, " \n"); fprintf(fd, " \n \n", ns_remove(p->sym->name)); fprintf(fd, " \n"); gen_schema_element(fd, p->info.typ, q, ns, ns1); fprintf(fd, " \n"); fprintf(fd, " \n \n"); } } else if (((Tnode*)q->info.typ->ref)->ref) { if (is_document(method_style)) { if (!has_ns_eq(NULL, q->sym->name)) { sym = ((Tnode*)q->info.typ->ref)->id; s = sym->name; if (*s == '_' && !(sym = lookup(s + 1))) sym = install(s + 1, ID); if (!entry(elt, sym)) { if (!uflag) fprintf(fd, " \n"); fprintf(fd, " \n \n", ns_remove(((Tnode*)q->info.typ->ref)->id->name)); fprintf(fd, " \n"); gen_schema_elements(fd, (Tnode*)q->info.typ->ref, ns, ns1); fprintf(fd, " \n"); gen_schema_attributes(fd, (Tnode*)q->info.typ->ref, ns, ns1); fprintf(fd, " \n \n"); e = enter(elt, sym); e->info = q->info; } } } } } } } } } if (t && !eflag) { for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun && !(p->info.sto & Sextern)) { q = (Entry*)p->info.typ->ref; if (q && !is_transient(q->info.typ)) { if (is_response(q->info.typ)) { if (has_ns_eq(ns, q->sym->name)) { sym = q->sym; s = sym->name; if (*s == '_' && !(sym = lookup(s + 1))) sym = install(s + 1, ID); if (!entry(elt, sym)) { if (!uflag) fprintf(fd, " \n"); fprintf(fd, " \n", ns_remove(q->sym->name), wsdl_type(q->info.typ, ns1)); e = enter(elt, sym); e->info = q->info; } } } } } } } for (p = typetable->list; p; p = p->next) { if (is_transient(p->info.typ) || is_primclass(p->info.typ) || is_dynamic_array(p->info.typ)) continue; if (is_element(p->info.typ) && has_ns_eq(ns, p->sym->name)) { m = NULL; for (sp = services; sp && !m; sp = sp->next) for (m = sp->list; m; m = m->next) if ((m->mess&FAULT) && m->part && is_eq(m->part, p->sym->name)) break; if (!m) { sym = p->sym; s = sym->name; if (*s == '_' && !(sym = lookup(s + 1))) sym = install(s + 1, ID); if (!entry(elt, sym)) { fprintf(fd, " \n", ns_remove(p->sym->name), base_type(p->info.typ, ns1)); e = enter(elt, sym); e->info = p->info; } } } } for (p = classtable->list; p; p = p->next) { if (!p->info.typ->ref || /* is_invisible(p->info.typ->id->name) || */ is_transient(p->info.typ) || is_primclass(p->info.typ) || is_dynamic_array(p->info.typ)) continue; for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next) { if (!is_repetition(q) && !is_anytype(q) && (!strchr(q->sym->name+1, ':') || !eq_ns(p->sym->name, q->sym->name)) && has_ns_eq(ns, q->sym->name) && !is_transient(q->info.typ) && q->info.typ->type != Tfun) { m = NULL; for (sp = services; sp && !m; sp = sp->next) for (m = sp->list; m; m = m->next) if ((m->mess&FAULT) && m->part && is_eq(m->part, q->sym->name)) break; if (m) continue; /* already generated element for fault */ if (!(q->info.sto & Sattribute) && (q->info.typ->type == Tclass || q->info.typ->type == Tstruct || is_typedef(q->info.typ))) if (is_element(q->info.typ) || is_eq(q->info.typ->id->name, q->sym->name)) continue; /* type is already an element or type name matches member name */ sym = q->sym; s = sym->name; if (*s == '_' && !(sym = lookup(s + 1))) sym = install(s + 1, ID); if (q->info.sto & Sattribute) { e = entry(att, sym); if (e) { if ((!is_primitive(q->info.typ) || e->info.typ->type != q->info.typ->type) && reftype(e->info.typ) != reftype(q->info.typ)) { sprintf(errbuf, "Member '%s::%s' of type '%s' at line %d has a type that does not correspond to the required unique type '%s' defined for root-level attribute '%s'", p->sym->name, q->sym->name, c_type(q->info.typ), q->lineno, c_type(e->info.typ), ns_convert(q->sym->name)); semwarn(errbuf); } } else { fprintf(fd, " \n", ns_remove(q->sym->name), wsdl_type(q->info.typ, ns1)); e = enter(att, sym); e->info = q->info; } } else { e = entry(elt, sym); if (e) { if ((!is_primitive(q->info.typ) || e->info.typ->type != q->info.typ->type) && reftype(e->info.typ) != reftype(q->info.typ)) { sprintf(errbuf, "Member '%s::%s' of type '%s' at line %d has a type that does not correspond to the required unique type '%s' defined for root-level element '%s'", p->sym->name, q->sym->name, c_type(q->info.typ), q->lineno, c_type(e->info.typ), ns_convert(q->sym->name)); semwarn(errbuf); } } else { fprintf(fd, " \n", ns_remove(q->sym->name), wsdl_type(q->info.typ, ns1)); e = enter(elt, sym); e->info = q->info; } } } } if (is_element(p->info.typ) && has_ns_eq(ns, p->sym->name)) { m = NULL; for (sp = services; sp && !m; sp = sp->next) for (m = sp->list; m; m = m->next) if ((m->mess&FAULT) && m->part && is_eq(m->part, p->sym->name)) break; if (!m) { sym = p->sym; s = sym->name; if (*s == '_' && !(sym = lookup(s + 1))) sym = install(s + 1, ID); if (!entry(elt, sym)) { fprintf(fd, " \n", ns_remove(p->sym->name), wsdl_type(p->info.typ, ns1)); e = enter(elt, sym); e->info = p->info; } } } } freetable(elt); freetable(att); } void gen_schema_attributes(FILE *fd, Tnode *p, const char *ns, const char *ns1) { Entry *q; const char *t, *s, *r; for (q = ((Table*)p->ref)->list; q; q = q->next) { if (q->info.sto & Sattribute && !(q->info.sto & (Sprivate | Sprotected))) { r = default_value(q); t = ns_convert(q->sym->name); if (*t == '-' || is_anyAttribute(q->info.typ)) fprintf(fd, " \n", q->sym->name); else if ((s = strchr(t+1, ':')) && (!strchr(q->sym->name+1, ':') || !has_ns_eq(ns, q->sym->name))) { if (r && *r) fprintf(fd, " \n", t, r); else if ((!is_smart(q->info.typ) && q->info.typ->type != Tpointer) || q->info.minOccurs) fprintf(fd, " \n", t); else if (q->info.maxOccurs == 0) fprintf(fd, " \n", t); else fprintf(fd, " \n", t); } else { const char *form = ""; if (!s) { s = t; if (*s == ':') { s++; form = " form=\"unqualified\""; } } else { s++; form = " form=\"qualified\""; } if (r && *r) fprintf(fd, " info.typ, ns1), r, form); else if ((!is_smart(q->info.typ) && q->info.typ->type != Tpointer) || q->info.minOccurs) fprintf(fd, " info.typ, ns1), form); else if (q->info.maxOccurs == 0) fprintf(fd, " info.typ, ns1)); else fprintf(fd, " info.typ, ns1), form); if (gen_member_documentation(fd, p->id, q, ns, 1)) fprintf(fd, " \n"); } fflush(fd); } } } void gen_type_documentation(FILE *fd, Entry *type, const char *ns) { Service *sp; Data *d; if (!type->sym) { fprintf(fd, "\n"); return; } for (sp = services; sp; sp = sp->next) { if (!tagcmp(sp->ns, ns)) { for (d = sp->data; d; d = d->next) { if (!strstr(d->name, "::") && is_eq_nons(d->name, type->sym->name)) { fprintf(fd, "\n \n %s\n \n", d->text); return; } } } } if (!uflag) fprintf(fd, "", type->sym->name); fprintf(fd, "\n"); } int gen_member_documentation(FILE *fd, Symbol *type, Entry *member, const char *ns, int scope) { Service *sp; Data *d; const char *t; if (!type || !member->sym) { fprintf(fd, "/>\n"); return 0; } t = ns_remove(type->name); for (sp = services; sp; sp = sp->next) { if (!tagcmp(sp->ns, ns)) { for (d = sp->data; d; d = d->next) { const char *s = strstr(d->name, "::"); if (s && !strncmp(t, d->name, s-d->name) && !strcmp(s + 2, member->sym->name)) { fprintf(fd, ">\n \n %s\n \n", d->text); return 1; } } } } fprintf(fd, "/>"); if (!uflag) { if (scope) fprintf(fd, "", type->name, member->sym->name); else fprintf(fd, "", member->sym->name); } fprintf(fd, "\n"); return 0; } void gen_nsmap(FILE *fd) { Symbol *ns1; Service *sp; fprintf(fd, "{\n"); for (ns1 = nslist; ns1; ns1 = ns1->next) { for (sp = services; sp; sp = sp->next) if (!tagcmp(sp->ns, ns1->name) && sp->URI) break; if (sp) { if (!strcmp(ns1->name, "SOAP-ENV")) { if (soap_version < 0) fprintf(fd, "\t{\"SOAP-ENV\", NULL, NULL, NULL},\n"); else fprintf(fd, "\t{\"%s\", \"%s\", \"%s\", NULL},\n", ns_convert(ns1->name), sp->URI, sp->URI2 ? sp->URI2 : envURI); } else if (!strcmp(ns1->name, "SOAP-ENC")) { if (soap_version < 0) fprintf(fd, "\t{\"SOAP-ENC\", NULL, NULL, NULL},\n"); else fprintf(fd, "\t{\"%s\", \"%s\", \"%s\", NULL},\n", ns_convert(ns1->name), sp->URI, sp->URI2 ? sp->URI2 : encURI); } else if (sp->URI2) fprintf(fd, "\t{\"%s\", \"%s\", \"%s\", NULL},\n", ns_convert(ns1->name), sp->URI, sp->URI2); else fprintf(fd, "\t{\"%s\", \"%s\", NULL, NULL},\n", ns_convert(ns1->name), sp->URI); } else if (!strcmp(ns1->name, "SOAP-ENV")) { if (soap_version < 0) fprintf(fd, "\t{\"SOAP-ENV\", NULL, NULL, NULL},\n"); else if (is_soap12(NULL)) fprintf(fd, "\t{\"SOAP-ENV\", \"%s\", \"http://schemas.xmlsoap.org/soap/envelope/\", NULL},\n", envURI); else fprintf(fd, "\t{\"SOAP-ENV\", \"%s\", \"http://www.w3.org/*/soap-envelope\", NULL},\n", envURI); } else if (!strcmp(ns1->name, "SOAP-ENC")) { if (soap_version < 0) fprintf(fd, "\t{\"SOAP-ENC\", NULL, NULL, NULL},\n"); else if (is_soap12(NULL)) fprintf(fd, "\t{\"SOAP-ENC\", \"%s\", \"http://schemas.xmlsoap.org/soap/encoding/\", NULL},\n", encURI); else fprintf(fd, "\t{\"SOAP-ENC\", \"%s\", \"http://www.w3.org/*/soap-encoding\", NULL},\n", encURI); } else if (!strcmp(ns1->name, "xsi")) fprintf(fd, "\t{\"xsi\", \"%s\", \"http://www.w3.org/*/XMLSchema-instance\", NULL},\n", xsiURI); else if (!strcmp(ns1->name, "xsd")) fprintf(fd, "\t{\"xsd\", \"%s\", \"http://www.w3.org/*/XMLSchema\", NULL},\n", xsdURI); else fprintf(fd, "\t{\"%s\", \"%s/%s.xsd\", NULL, NULL},\n", ns_convert(ns1->name), tmpURI, ns_convert(ns1->name)); } fprintf(fd, "\t{NULL, NULL, NULL, NULL}\n};\n"); } void gen_proxy(FILE *fd, Table *table, Symbol *ns, const char *name, const char *URL) { Entry *p, *q, *r; Table *t, *output; Service *sp; int flag; const char *name1; name1 = ns_cname(name, NULL); for (sp = services; sp; sp = sp->next) if (!tagcmp(sp->ns, ns->name)) break; fprintf(fd, "\n\n#ifndef %s%sProxy_H\n#define %s%sProxy_H\n#include \"%sH.h\"", prefix, name1, prefix, name1, prefix); if (nflag) fprintf(fd, "\nextern SOAP_NMAC struct Namespace %s_namespaces[];", prefix); if (namespaceid) fprintf(fd, "\n\nnamespace %s {", namespaceid); fprintf(fd, "\nclass %s\n{ public:\n\t/// Runtime engine context allocated in constructor\n\tstruct soap *soap;\n\t/// Endpoint URL of service '%s' (change as needed)\n\tconst char *endpoint;\n\t/// Constructor allocates soap engine context, sets default endpoint URL, and sets namespace mapping table\n", name1, name); if (nflag) fprintf(fd, "\t%s() { soap = soap_new(); if (soap) soap->namespaces = %s_namespaces; endpoint = \"%s\"; }\n", name1, prefix, URL); else { fprintf(fd, "\t%s()\n\t{ soap = soap_new(); endpoint = \"%s\"; if (soap && !soap->namespaces) { static const struct Namespace namespaces[] = \n", name1, URL); gen_nsmap(fd); fprintf(fd, "\tsoap->namespaces = namespaces; } }\n"); } fprintf(fd, "\t/// Destructor deletes deserialized data and engine context\n\tvirtual ~%s() { if (soap) { soap_destroy(soap); soap_end(soap); soap_free(soap); } }\n", name1); fflush(fd); for (r = table->list; r; r = r->next) { if (r->info.typ->type == Tfun && !(r->info.sto & Sextern) && has_ns_eq(ns->name, r->sym->name)) { p = entry(table, r->sym); if (p) q = (Entry*)p->info.typ->ref; else { fprintf(stderr, "Internal error: no table entry\n"); return; } p = entry(classtable, r->sym); if (!p) { fprintf(stderr, "Internal error: no parameter table entry\n"); return; } output = (Table*)p->info.typ->ref; fprintf(fd, "\t/// Invoke '%s' of service '%s' and return error code (or SOAP_OK)\n", ns_remove(r->sym->name), name); fprintf(fd, "\tvirtual int %s(", ident(r->sym->name)); flag = 0; for (t = output; t; t = t->prev) { p = t->list; if (p) { fprintf(fd, "%s%s", c_storage(p->info.sto), c_type_id(p->info.typ, p->sym->name)); for (p = p->next; p; p = p->next) fprintf(fd, ", %s%s", c_storage(p->info.sto), c_type_id(p->info.typ, p->sym->name)); flag = 1; } } if (is_transient(q->info.typ)) fprintf(fd, ") { return soap ? soap_send_%s(soap, endpoint, NULL", ident(r->sym->name)); else if (flag) fprintf(fd, ", %s%s) { return soap ? soap_call_%s(soap, endpoint, NULL", c_storage(q->info.sto), c_type_id(q->info.typ, q->sym->name), ident(r->sym->name)); else fprintf(fd, "%s%s) { return soap ? soap_call_%s(soap, endpoint, NULL", c_storage(q->info.sto), c_type_id(q->info.typ, q->sym->name), ident(r->sym->name)); /* the action is now handled by the soap_call/soap_send operation when we pass NULL */ #if 0 m = NULL; if (sp && (s = strstr(r->sym->name, "__"))) for (m = sp->list; m; m = m->next) if (m->part && m->mess == ACTION && !strcmp(m->name, s+2)) { if (*m->part == '"') fprintf(fd, "%s", m->part); else fprintf(fd, "\"%s\"", m->part); break; } if (!m) fprintf(fd, "NULL"); #endif for (t = output; t; t = t->prev) for (p = t->list; p; p = p->next) fprintf(fd, ", %s", ident(p->sym->name)); if (is_transient(q->info.typ)) fprintf(fd, ") : SOAP_EOM; }\n"); else fprintf(fd, ", %s) : SOAP_EOM; }\n", ident(q->sym->name)); fflush(fd); } } fprintf(fd, "};"); if (namespaceid) fprintf(fd, "\n\n} // namespace %s\n", namespaceid); fprintf(fd, "\n#endif\n"); } void gen_object(FILE *fd, Table *table, const char *name) { const char *name1; Entry *method; name1 = ns_cname(name, NULL); fprintf(fd, "\n\n#ifndef %s%sObject_H\n#define %s%sObject_H\n#include \"%sH.h\"", prefix, name1, prefix, name1, prefix); banner(fd, "Service Object"); if (namespaceid) fprintf(fd, "\n\nnamespace %s {", namespaceid); fprintf(fd, "\nclass %sService : public soap\n{ public:", name1); fprintf(fd, "\n\t%sService()\n\t{ static const struct Namespace namespaces[] =\n", name1); gen_nsmap(fd); fprintf(fd, "\n\tsoap_init(this); this->namespaces = namespaces; };"); fprintf(fd, "\n\t/// Destructor deletes deserialized data and engine context"); fprintf(fd, "\n\tvirtual ~%sService() { soap_destroy(this); soap_end(this); };", name1); fprintf(fd, "\n\t/// Bind service to port (returns master socket or SOAP_INVALID_SOCKET)"); fprintf(fd, "\n\tvirtual\tSOAP_SOCKET bind(const char *host, int port, int backlog) { return soap_bind(this, host, port, backlog); };"); fprintf(fd, "\n\t/// Accept next request (returns socket or SOAP_INVALID_SOCKET)"); fprintf(fd, "\n\tvirtual\tSOAP_SOCKET accept() { return soap_accept(this); };"); fprintf(fd, "\n#if defined(WITH_OPENSSL) || defined(WITH_GNUTLS)"); fprintf(fd, "\n\t/// Then accept SSL handshake, when SSL is used"); fprintf(fd, "\n\tvirtual\tint ssl_accept() { return soap_ssl_accept(this); };"); fprintf(fd, "\n#endif"); fprintf(fd, "\n\t/// Serve this request (returns error code or SOAP_OK)"); if (nflag) fprintf(fd, "\n\tvirtual\tint serve() { return %s_serve(this); };", prefix); else fprintf(fd, "\n\tvirtual\tint serve() { return soap_serve(this); };"); fprintf(fd, "\n};"); banner(fd, "Service Operations (you should define these globally)"); for (method = table->list; method; method = method->next) { if (method->info.typ->type == Tfun && !(method->info.sto & Sextern)) { Entry *p, *q = entry(table, method->sym); Table *output; if (q) p = (Entry*)q->info.typ->ref; else { fprintf(stderr, "Internal error: no table entry\n"); return; } q = entry(classtable, method->sym); output = (Table*)q->info.typ->ref; fprintf(fd, "\n\nSOAP_FMAC5 int SOAP_FMAC6 %s(struct soap*", ident(method->sym->name)); gen_params(fd, output, p, 1); fprintf(fd, ";"); } } if (namespaceid) fprintf(fd, "\n\n} // namespace %s\n", namespaceid); fprintf(fd, "\n\n#endif\n"); } void gen_proxy_header(FILE *fd, Table *table, Symbol *ns, const char *name) { Entry *p, *method; Table *t; fprintf(fd, "\n\n#ifndef %s%s_H\n#define %s%s_H\n#include \"%sH.h\"", prefix, name, prefix, name, prefix); if (namespaceid) fprintf(fd, "\n\nnamespace %s {", namespaceid); if (iflag) fprintf(fd, "\n\nclass SOAP_CMAC %s : public soap\n{ public:", name); else fprintf(fd, "\n\nclass SOAP_CMAC %s\n{ public:", name); if (!iflag) fprintf(fd, "\n\tstruct soap *soap;\n\tbool soap_own;"); fprintf(fd, "\n\t/// Endpoint URL of service '%s' (change as needed)", name); fprintf(fd, "\n\tconst char *soap_endpoint;"); fprintf(fd, "\n\t/// Variables globally declared in %s (non-static)", filename); for (p = table->list; p; p = p->next) if (p->info.typ->type != Tfun && !(p->info.sto & Sstatic)) fprintf(fd, "\n\t%s%s;", c_storage(p->info.sto), c_type_id(p->info.typ, p->sym->name)); fprintf(fd, "\n\t/// Constructor"); fprintf(fd, "\n\t%s();", name); fprintf(fd, "\n\t/// Copy constructor"); fprintf(fd, "\n\t%s(const %s& rhs);", name, name); if (iflag) { fprintf(fd, "\n\t/// Construct from another engine state"); fprintf(fd, "\n\t%s(const struct soap&);", name); } else { fprintf(fd, "\n\t/// Constructor to use/share an engine state"); fprintf(fd, "\n\t%s(struct soap*);", name); } fprintf(fd, "\n\t/// Constructor with endpoint URL"); fprintf(fd, "\n\t%s(const char *url);", name); fprintf(fd, "\n\t/// Constructor with engine input+output mode control"); fprintf(fd, "\n\t%s(soap_mode iomode);", name); fprintf(fd, "\n\t/// Constructor with URL and input+output mode control"); fprintf(fd, "\n\t%s(const char *url, soap_mode iomode);", name); fprintf(fd, "\n\t/// Constructor with engine input and output mode control"); fprintf(fd, "\n\t%s(soap_mode imode, soap_mode omode);", name); if (iflag) fprintf(fd, "\n\t/// Destructor deletes deserialized data and engine context"); else fprintf(fd, "\n\t/// Destructor deletes non-shared engine context only (use destroy() to delete deserialized data)"); fprintf(fd, "\n\tvirtual\t~%s();", name); fprintf(fd, "\n\t/// Initializer used by constructors"); fprintf(fd, "\n\tvirtual\tvoid %s_init(soap_mode imode, soap_mode omode);", name); fprintf(fd, "\n\t/// Create a new copy"); fprintf(fd, "\n\tvirtual\t%s *copy() SOAP_PURE_VIRTUAL;", name); fprintf(fd, "\n\t/// Copy assignment"); fprintf(fd, "\n\t%s& operator=(const %s&);", name, name); fprintf(fd, "\n\t/// Delete all deserialized data (with soap_destroy and soap_end)"); fprintf(fd, "\n\tvirtual\tvoid destroy();"); fprintf(fd, "\n\t/// Delete all deserialized data and reset to default"); fprintf(fd, "\n\tvirtual\tvoid reset();"); fprintf(fd, "\n\t/// Disables and removes SOAP Header from message"); fprintf(fd, "\n\tvirtual\tvoid soap_noheader();"); if (!namespaceid) { p = entry(classtable, lookup("SOAP_ENV__Header")); if (p) { t = (Table*)p->info.typ->ref; if (t && t->list && !is_void(t->list->info.typ)) { fprintf(fd, "\n\t/// Put SOAP Header in message"); fprintf(fd, "\n\tvirtual\tvoid soap_header("); gen_params(fd, t, NULL, 0); fprintf(fd, ";"); } } } fprintf(fd, "\n\t/// Get SOAP Header structure (NULL when absent)"); fprintf(fd, "\n\tvirtual\tconst SOAP_ENV__Header *soap_header();"); fprintf(fd, "\n\t/// Get SOAP Fault structure (NULL when absent)"); fprintf(fd, "\n\tvirtual\tconst SOAP_ENV__Fault *soap_fault();"); fprintf(fd, "\n\t/// Get SOAP Fault string (NULL when absent)"); fprintf(fd, "\n\tvirtual\tconst char *soap_fault_string();"); fprintf(fd, "\n\t/// Get SOAP Fault detail as string (NULL when absent)"); fprintf(fd, "\n\tvirtual\tconst char *soap_fault_detail();"); fprintf(fd, "\n\t/// Close connection (normally automatic, except for send_X ops)"); fprintf(fd, "\n\tvirtual\tint soap_close_socket();"); fprintf(fd, "\n\t/// Force close connection (can kill a thread blocked on IO)"); fprintf(fd, "\n\tvirtual\tint soap_force_close_socket();"); fprintf(fd, "\n\t/// Print fault"); fprintf(fd, "\n\tvirtual\tvoid soap_print_fault(FILE*);"); fprintf(fd, "\n#ifndef WITH_LEAN\n\t/// Print fault to stream"); fprintf(fd, "\n#ifndef WITH_COMPAT"); fprintf(fd, "\n\tvirtual\tvoid soap_stream_fault(std::ostream&);"); fprintf(fd, "\n#endif\n"); fprintf(fd, "\n\t/// Put fault into buffer"); fprintf(fd, "\n\tvirtual\tchar *soap_sprint_fault(char *buf, size_t len);\n#endif"); for (method = table->list; method; method = method->next) if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && has_ns_eq(ns->name, method->sym->name)) gen_method(fd, method, 0); fprintf(fd, "\n};"); if (namespaceid) fprintf(fd, "\n\n} // namespace %s\n", namespaceid); fprintf(fd, "\n#endif\n"); } void gen_proxy_code(FILE *fd, Table *table, Symbol *ns, const char *name) { Entry *p, *method, *param; Table *t; const char *soap; if (iflag) soap = "this"; else soap = "this->soap"; fprintf(fd, "\n\n#include \"%s%s.h\"", prefix, name); if (namespaceid) fprintf(fd, "\n\nnamespace %s {", namespaceid); if (iflag) { fprintf(fd, "\n\n%s::%s() : soap(SOAP_IO_DEFAULT)\n{\t%s_init(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT);\n}", name, name, name); fprintf(fd, "\n\n%s::%s(const %s& rhs)\n{\tsoap_copy_context(this, &rhs);\n\tthis->soap_endpoint = rhs.soap_endpoint;\n}", name, name, name); fprintf(fd, "\n\n%s::%s(const struct soap &_soap) : soap(_soap)\n{ }", name, name); fprintf(fd, "\n\n%s::%s(const char *url) : soap(SOAP_IO_DEFAULT)\n{\t%s_init(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT);\n\tsoap_endpoint = url;\n}", name, name, name); fprintf(fd, "\n\n%s::%s(soap_mode iomode) : soap(iomode)\n{\t%s_init(iomode, iomode);\n}", name, name, name); fprintf(fd, "\n\n%s::%s(const char *url, soap_mode iomode) : soap(iomode)\n{\t%s_init(iomode, iomode);\n\tsoap_endpoint = url;\n}", name, name, name); fprintf(fd, "\n\n%s::%s(soap_mode imode, soap_mode omode) : soap(imode, omode)\n{\t%s_init(imode, omode);\n}", name, name, name); fprintf(fd, "\n\n%s::~%s()\n{\n\tthis->destroy();\n\t}", name, name); } else { fprintf(fd, "\n\n%s::%s()\n{\tthis->soap = soap_new();\n\tthis->soap_own = true;\n\t%s_init(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT);\n}", name, name, name); fprintf(fd, "\n\n%s::%s(const %s& rhs)\n{\tthis->soap = rhs.soap;\n\tthis->soap_own = false;\n\tthis->soap_endpoint = rhs.soap_endpoint;\n}", name, name, name); fprintf(fd, "\n\n%s::%s(struct soap *_soap)\n{\tthis->soap = _soap;\n\tthis->soap_own = false;\n\t%s_init(_soap->imode, _soap->omode);\n}", name, name, name); fprintf(fd, "\n\n%s::%s(const char *url)\n{\tthis->soap = soap_new();\n\tthis->soap_own = true;\n\t%s_init(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT);\n\tsoap_endpoint = url;\n}", name, name, name); fprintf(fd, "\n\n%s::%s(soap_mode iomode)\n{\tthis->soap = soap_new();\n\tthis->soap_own = true;\n\t%s_init(iomode, iomode);\n}", name, name, name); fprintf(fd, "\n\n%s::%s(const char *url, soap_mode iomode)\n{\tthis->soap = soap_new();\n\tthis->soap_own = true;\n\t%s_init(iomode, iomode);\n\tsoap_endpoint = url;\n}", name, name, name); fprintf(fd, "\n\n%s::%s(soap_mode imode, soap_mode omode)\n{\tthis->soap = soap_new();\n\tthis->soap_own = true;\n\t%s_init(imode, omode);\n}", name, name, name); fprintf(fd, "\n\n%s::~%s()\n{\tif (this->soap_own)\n\t\tsoap_free(this->soap);\n}", name, name); } fprintf(fd, "\n\nvoid %s::%s_init(soap_mode imode, soap_mode omode)\n{\tsoap_imode(%s, imode);\n\tsoap_omode(%s, omode);\n\tsoap_endpoint = NULL;\n\tstatic const struct Namespace namespaces[] =\n", name, name, soap, soap); gen_nsmap(fd); fprintf(fd, "\tsoap_set_namespaces(%s, namespaces);\n}", soap); if (iflag) { fprintf(fd, "\n\n#ifndef WITH_PURE_VIRTUAL\n%s *%s::copy()\n{\t%s *dup = SOAP_NEW_COPY(%s(*(struct soap*)%s));\n\treturn dup;\n}\n#endif", name, name, name, name, soap); fprintf(fd, "\n\n%s& %s::operator=(const %s& rhs)\n{\tsoap_copy_context(this, &rhs);\n\tthis->soap_endpoint = rhs.soap_endpoint;\n\treturn *this;\n}", name, name, name); } else { fprintf(fd, "\n\n#ifndef WITH_PURE_VIRTUAL\n%s *%s::copy()\n{\t%s *dup = SOAP_NEW_COPY(%s);\n\tif (dup)\n\t\tsoap_copy_context(dup->soap, this->soap);\n\treturn dup;\n}\n#endif", name, name, name, name); fprintf(fd, "\n\n%s& %s::operator=(const %s& rhs)\n{\tif (this->soap_own)\n\t\tsoap_free(this->soap);\n\tthis->soap = rhs.soap;\n\tthis->soap_own = false;\n\tthis->soap_endpoint = rhs.soap_endpoint;\n\treturn *this;\n}", name, name, name); } fprintf(fd, "\n\nvoid %s::destroy()\n{\tsoap_destroy(%s);\n\tsoap_end(%s);\n}", name, soap, soap); fprintf(fd, "\n\nvoid %s::reset()\n{\tthis->destroy();\n\tsoap_done(%s);\n\tsoap_initialize(%s);\n\t%s_init(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT);\n}", name, soap, soap, name); fprintf(fd, "\n\nvoid %s::soap_noheader()\n{\t%s->header = NULL;\n}", name, soap); if (!namespaceid) { p = entry(classtable, lookup("SOAP_ENV__Header")); if (p) { t = (Table*)p->info.typ->ref; if (t && t->list && !is_void(t->list->info.typ)) { fprintf(fd, "\n\nvoid %s::soap_header(", name); gen_params(fd, t, NULL, 0); fprintf(fd, "\n{\t::soap_header(%s);", soap); for (param = t->list; param; param = param->next) { if (namespaceid) fprintf(fd, "\n\t((%s::SOAP_ENV__Header*)%s->header)->%s = %s;", namespaceid, soap, ident(param->sym->name), ident(param->sym->name)); else fprintf(fd, "\n\t%s->header->%s = %s;", soap, ident(param->sym->name), ident(param->sym->name)); } fprintf(fd, "\n}"); } } } fprintf(fd, "\n\nconst SOAP_ENV__Header *%s::soap_header()\n{\treturn %s->header;\n}", name, soap); fprintf(fd, "\n\nconst SOAP_ENV__Fault *%s::soap_fault()\n{\treturn %s->fault;\n}", name, soap); fprintf(fd, "\n\nconst char *%s::soap_fault_string()\n{\treturn *soap_faultstring(%s);\n}", name, soap); fprintf(fd, "\n\nconst char *%s::soap_fault_detail()\n{\treturn *soap_faultdetail(%s);\n}", name, soap); fprintf(fd, "\n\nint %s::soap_close_socket()\n{\treturn soap_closesock(%s);\n}", name, soap); fprintf(fd, "\n\nint %s::soap_force_close_socket()\n{\treturn soap_force_closesock(%s);\n}", name, soap); fprintf(fd, "\n\nvoid %s::soap_print_fault(FILE *fd)\n{\t::soap_print_fault(%s, fd);\n}", name, soap); fprintf(fd, "\n\n#ifndef WITH_LEAN\n#ifndef WITH_COMPAT\nvoid %s::soap_stream_fault(std::ostream& os)\n{\t::soap_stream_fault(%s, os);\n}\n#endif", name, soap); fprintf(fd, "\n\nchar *%s::soap_sprint_fault(char *buf, size_t len)\n{\treturn ::soap_sprint_fault(%s, buf, len);\n}\n#endif", name, soap); for (method = table->list; method; method = method->next) if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && !is_imported(method->info.typ) && has_ns_eq(ns->name, method->sym->name)) gen_call_method(fd, method, name); if (namespaceid) fprintf(fd, "\n\n} // namespace %s\n", namespaceid); fprintf(fd, "\n/* End of client proxy code */\n"); } void gen_object_header(FILE *fd, Table *table, Symbol *ns, const char *name) { Entry *p, *method; Table *t; fprintf(fd, "\n\n#ifndef %s%s_H\n#define %s%s_H\n#include \"%sH.h\"", prefix, name, prefix, name, prefix); if (namespaceid) fprintf(fd, "\n\nnamespace %s {", namespaceid); if (iflag) fprintf(fd, "\nclass SOAP_CMAC %s : public soap\n{ public:", name); else { fprintf(fd, "\nclass SOAP_CMAC %s\n{ public:", name); fprintf(fd, "\n\tstruct soap *soap;\n\tbool soap_own;"); } fprintf(fd, "\n\t/// Variables globally declared in %s (non-static)", filename); for (p = table->list; p; p = p->next) if (p->info.typ->type != Tfun && !(p->info.sto & Sstatic)) fprintf(fd, "\n\t%s%s;", c_storage(p->info.sto), c_type_id(p->info.typ, p->sym->name)); fprintf(fd, "\n\t/// Constructor"); fprintf(fd, "\n\t%s();", name); fprintf(fd, "\n\t/// Copy constructor"); fprintf(fd, "\n\t%s(const %s&);", name, name); if (iflag) { fprintf(fd, "\n\t/// Construct from another engine state"); fprintf(fd, "\n\t%s(const struct soap&);", name); } else { fprintf(fd, "\n\t/// Constructor to use/share an engine state"); fprintf(fd, "\n\t%s(struct soap*);", name); } fprintf(fd, "\n\t/// Constructor with engine input+output mode control"); fprintf(fd, "\n\t%s(soap_mode iomode);", name); fprintf(fd, "\n\t/// Constructor with engine input and output mode control"); fprintf(fd, "\n\t%s(soap_mode imode, soap_mode omode);", name); if (iflag) fprintf(fd, "\n\t/// Destructor deletes deserialized data and engine context"); else fprintf(fd, "\n\t/// Destructor deletes non-shared engine context only (use destroy() to delete deserialized data)"); fprintf(fd, "\n\tvirtual ~%s();", name); fprintf(fd, "\n\t/// Delete all deserialized data (with soap_destroy() and soap_end())"); fprintf(fd, "\n\tvirtual\tvoid destroy();"); fprintf(fd, "\n\t/// Delete all deserialized data and reset to defaults"); fprintf(fd, "\n\tvirtual\tvoid reset();"); fprintf(fd, "\n\t/// Initializer used by constructor"); fprintf(fd, "\n\tvirtual\tvoid %s_init(soap_mode imode, soap_mode omode);", name); fprintf(fd, "\n\t/// Create a new copy"); fprintf(fd, "\n\tvirtual\t%s *copy() SOAP_PURE_VIRTUAL;", name); fprintf(fd, "\n\t/// Copy assignment"); fprintf(fd, "\n\t%s& operator=(const %s&);", name, name); fprintf(fd, "\n\t/// Close connection (normally automatic)"); fprintf(fd, "\n\tvirtual\tint soap_close_socket();"); fprintf(fd, "\n\t/// Force close connection (can kill a thread blocked on IO)"); fprintf(fd, "\n\tvirtual\tint soap_force_close_socket();"); fprintf(fd, "\n\t/// Return sender-related fault to sender"); fprintf(fd, "\n\tvirtual\tint soap_senderfault(const char *string, const char *detailXML);"); fprintf(fd, "\n\t/// Return sender-related fault with SOAP 1.2 subcode to sender"); fprintf(fd, "\n\tvirtual\tint soap_senderfault(const char *subcodeQName, const char *string, const char *detailXML);"); fprintf(fd, "\n\t/// Return receiver-related fault to sender"); fprintf(fd, "\n\tvirtual\tint soap_receiverfault(const char *string, const char *detailXML);"); fprintf(fd, "\n\t/// Return receiver-related fault with SOAP 1.2 subcode to sender"); fprintf(fd, "\n\tvirtual\tint soap_receiverfault(const char *subcodeQName, const char *string, const char *detailXML);"); fprintf(fd, "\n\t/// Print fault"); fprintf(fd, "\n\tvirtual\tvoid soap_print_fault(FILE*);"); fprintf(fd, "\n#ifndef WITH_LEAN\n\t/// Print fault to stream"); fprintf(fd, "\n#ifndef WITH_COMPAT"); fprintf(fd, "\n\tvirtual\tvoid soap_stream_fault(std::ostream&);"); fprintf(fd, "\n#endif"); fprintf(fd, "\n\t/// Put fault into buffer"); fprintf(fd, "\n\tvirtual\tchar *soap_sprint_fault(char *buf, size_t len);\n#endif"); fprintf(fd, "\n\t/// Disables and removes SOAP Header from message"); fprintf(fd, "\n\tvirtual\tvoid soap_noheader();"); if (!namespaceid) { p = entry(classtable, lookup("SOAP_ENV__Header")); if (p) { t = (Table*)p->info.typ->ref; if (t && t->list && !is_void(t->list->info.typ)) { fprintf(fd, "\n\t/// Put SOAP Header in message"); fprintf(fd, "\n\tvirtual\tvoid soap_header("); gen_params(fd, t, NULL, 0); fprintf(fd, ";"); } } } fprintf(fd, "\n\t/// Get SOAP Header structure (NULL when absent)"); fprintf(fd, "\n\tvirtual\tconst SOAP_ENV__Header *soap_header();"); fprintf(fd, "\n\t/// Run simple single-thread (iterative, non-SSL) service on port until a connection error occurs (returns error code or SOAP_OK), use this->bind_flag = SO_REUSEADDR to rebind for a rerun"); fprintf(fd, "\n\tvirtual\tint run(int port);"); fprintf(fd, "\n#if defined(WITH_OPENSSL) || defined(WITH_GNUTLS)"); fprintf(fd, "\n\t/// Run simple single-thread SSL service on port until a connection error occurs (returns error code or SOAP_OK), use this->bind_flag = SO_REUSEADDR to rebind for a rerun"); fprintf(fd, "\n\tvirtual\tint ssl_run(int port);"); fprintf(fd, "\n#endif"); fprintf(fd, "\n\t/// Bind service to port (returns master socket or SOAP_INVALID_SOCKET)"); fprintf(fd, "\n\tvirtual\tSOAP_SOCKET bind(const char *host, int port, int backlog);"); fprintf(fd, "\n\t/// Accept next request (returns socket or SOAP_INVALID_SOCKET)"); fprintf(fd, "\n\tvirtual\tSOAP_SOCKET accept();"); fprintf(fd, "\n#if defined(WITH_OPENSSL) || defined(WITH_GNUTLS)"); fprintf(fd, "\n\t/// Then accept SSL handshake, when SSL is used"); fprintf(fd, "\n\tvirtual\tint ssl_accept();"); fprintf(fd, "\n#endif"); fprintf(fd, "\n\t/// Serve this request (returns error code or SOAP_OK)"); fprintf(fd, "\n\tvirtual\tint serve();"); fprintf(fd, "\n\t/// Used by serve() to dispatch a request (returns error or SOAP_OK)"); fprintf(fd, "\n\tvirtual\tint dispatch();"); if (jflag) fprintf(fd, "\n\tvirtual\tint dispatch(struct soap *soap);"); fprintf(fd, "\n\n\t///\n\t/// Service operations (you should define these):\n\t/// Note: compile with -DWITH_PURE_VIRTUAL for pure virtual methods\n\t///"); for (method = table->list; method; method = method->next) if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && has_ns_eq(ns->name, method->sym->name)) gen_method(fd, method, 1); fprintf(fd, "\n};"); if (namespaceid) fprintf(fd, "\n\n} // namespace %s\n", namespaceid); fprintf(fd, "\n#endif\n"); } void gen_method(FILE *fd, Entry *method, int server) { Table *params; Entry *result, *p; const char *soap; if (iflag) soap = "this"; else soap = "this->soap"; result = (Entry*)method->info.typ->ref; p = entry(classtable, method->sym); if (!p) execerror("no table entry"); params = (Table*)p->info.typ->ref; if (server || !is_transient(result->info.typ)) { if (is_transient(result->info.typ)) fprintf(fd, "\n\n\t/// Web service one-way operation '%s' (return error code, SOAP_OK (no response), or send_%s_empty_response())", ns_remove(method->sym->name), ns_remove(method->sym->name)); else fprintf(fd, "\n\n\t/// Web service operation '%s' (returns error code or SOAP_OK)", ns_remove(method->sym->name)); fprintf(fd, "\n\tvirtual\tint %s(", ns_cname(method->sym->name, NULL)); gen_params(fd, params, result, 0); if (!server) { fprintf(fd, " { return this->%s(NULL, NULL", ns_cname(method->sym->name, NULL)); gen_args(fd, params, result, 1); fprintf(fd, "; }"); fprintf(fd, "\n\tvirtual\tint %s(const char *endpoint, const char *soap_action", ns_cname(method->sym->name, NULL)); gen_params(fd, params, result, 1); } if (server) fprintf(fd, " SOAP_PURE_VIRTUAL;"); else fprintf(fd, ";"); if (is_transient(result->info.typ)) fprintf(fd, "\n\tvirtual\tint send_%s_empty_response(int httpcode) { return soap_send_empty_response(%s, httpcode); }", ns_cname(method->sym->name, NULL), soap); } else { fprintf(fd, "\n\n\t/// Web service one-way send operation 'send_%s' (returns error code or SOAP_OK)", ns_remove(method->sym->name)); fprintf(fd, "\n\tvirtual\tint send_%s(", ns_cname(method->sym->name, NULL)); gen_params(fd, params, result, 0); fprintf(fd, " { return this->send_%s(NULL, NULL", ns_cname(method->sym->name, NULL)); gen_args(fd, params, result, 1); fprintf(fd, "; }"); fprintf(fd, "\n\tvirtual\tint send_%s(const char *endpoint, const char *soap_action", ns_cname(method->sym->name, NULL)); gen_params(fd, params, result, 1); fprintf(fd, ";\n\t/// Web service one-way receive operation 'recv_%s' (returns error code or SOAP_OK)", ns_remove(method->sym->name)); fprintf(fd, ";\n\tvirtual\tint recv_%s(", ns_cname(method->sym->name, NULL)); fprintf(fd, "struct %s&);", ident(method->sym->name)); fprintf(fd, "\n\t/// Web service receive of HTTP Accept acknowledgment for one-way send operation 'send_%s' (returns error code or SOAP_OK)", ns_remove(method->sym->name)); fprintf(fd, "\n\tvirtual\tint recv_%s_empty_response() { return soap_recv_empty_response(%s); }", ns_cname(method->sym->name, NULL), soap); fprintf(fd, "\n\t/// Web service one-way synchronous send operation '%s' with HTTP Accept/OK response receive (returns error code or SOAP_OK)", ns_remove(method->sym->name)); fprintf(fd, "\n\tvirtual\tint %s(", ns_cname(method->sym->name, NULL)); gen_params(fd, params, result, 0); fprintf(fd, " { return this->%s(NULL, NULL", ns_cname(method->sym->name, NULL)); gen_args(fd, params, result, 1); fprintf(fd, "; }"); fprintf(fd, "\n\tvirtual\tint %s(const char *endpoint, const char *soap_action", ns_cname(method->sym->name, NULL)); gen_params(fd, params, result, 1); fprintf(fd, " { if (this->send_%s(endpoint, soap_action", ns_cname(method->sym->name, NULL)); gen_args(fd, params, result, 1); fprintf(fd, " || soap_recv_empty_response(%s)) return %s->error; return SOAP_OK; }", soap, soap); } } void gen_params(FILE *fd, Table *params, Entry *result, int flag) { Entry *param; for (param = params->list; param; param = param->next) fprintf(fd, "%s%s%s", flag || param != params->list ? ", " : "", c_storage(param->info.sto), c_type_id(param->info.typ, param->sym->name)); if (!result || is_transient(result->info.typ)) fprintf(fd, ")"); else fprintf(fd, "%s%s%s)", flag || params->list ? ", " : "", c_storage(result->info.sto), c_type_id(result->info.typ, result->sym->name)); } void gen_args(FILE *fd, Table *params, Entry *result, int flag) { Entry *param; for (param = params->list; param; param = param->next) fprintf(fd, "%s%s", flag || param != params->list ? ", " : "", param->sym->name); if (!result || is_transient(result->info.typ)) fprintf(fd, ")"); else fprintf(fd, "%s%s)", flag || params->list ? ", " : "", result->sym->name); } void gen_query_url(FILE *fd, Table *params) { Entry *param; int flag = 0; fprintf(fd, "\n\t(SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), 0), \"%%s?"); for (param = params->list; param; param = param->next) if (!is_transient(param->info.typ) && is_primitive_or_string(param->info.typ)) fprintf(fd, "%s%s=%s", flag++ ? "&" : "", ns_remove(param->sym->name), gen_format(param->info.typ)); fprintf(fd, "\", soap_endpoint"); for (param = params->list; param; param = param->next) { if (!is_transient(param->info.typ) && is_primitive_or_string(param->info.typ)) { if (is_stdstring(param->info.typ)) fprintf(fd, ", soap_encode_url_string(soap, %s.c_str())", ident(param->sym->name)); else if (is_string(param->info.typ)) fprintf(fd, ", soap_encode_url_string(soap, %s)", ident(param->sym->name)); else if (is_primitive(param->info.typ)) fprintf(fd, ", %s", ident(param->sym->name)); } } fprintf(fd, ");"); } void gen_query_form(FILE *fd, Table *params) { Entry *param; int flag = 0; fprintf(fd, "\n\tif ("); for (param = params->list; param; param = param->next) { if (!is_transient(param->info.typ) && is_primitive_or_string(param->info.typ)) { fprintf(fd, "soap_send(soap, \"%s%s=\")", flag++ ? "&" : "", ns_remove(param->sym->name)); if (is_stdstring(param->info.typ)) fprintf(fd, " || soap_send(soap, soap_encode_url_string(soap, %s.c_str()))\n\t || ", ident(param->sym->name)); else if (is_string(param->info.typ)) fprintf(fd, " || soap_send(soap, soap_encode_url_string(soap, %s))\n\t || ", ident(param->sym->name)); else if (is_primitive(param->info.typ)) fprintf(fd, " || soap_send(soap, soap_%s2s(soap, %s))\n\t || ", c_ident(param->info.typ), ident(param->sym->name)); } } } const char* gen_format(Tnode *typ) { if (is_string(typ) || is_stdstring(typ)) return "%s"; switch (typ->type) { case Tchar: return "%hhd"; case Tshort: return "%hd"; case Tint: return "%d"; case Tlong: return "%ld"; case Tllong: return SOAP_LONG_FORMAT; case Tfloat: return "%.9G"; case Tdouble: return "%.17lG"; case Tuchar: return "%hhu"; case Tushort: return "%hu"; case Tuint: return "%u"; case Tulong: return "%lu"; case Tullong: return SOAP_ULONG_FORMAT; default: return ""; } } void gen_call_method(FILE *fd, Entry *method, const char *name) { Service *sp; Method *m; int soap = (soap_version >= 0); int version = soap_version; int get = 0; int put = 0; int post = 0; int mime = 0; const char *style, *encoding; const char *xtag; const char *action = NULL, *method_encoding = NULL, *method_response_encoding = NULL; Table *params; Entry *param, *result, *p, *response = NULL; result = (Entry*)method->info.typ->ref; p = entry(classtable, method->sym); if (!p) execerror("no table entry"); params = (Table*)p->info.typ->ref; if (!is_response(result->info.typ) && !is_XML(result->info.typ)) response = get_response(method->info.typ); if (name) { if (!is_transient(result->info.typ)) fprintf(fd, "\n\nint %s::%s(const char *endpoint, const char *soap_action", name, ns_cname(method->sym->name, NULL)); else fprintf(fd, "\n\nint %s::send_%s(const char *endpoint, const char *soap_action", name, ns_cname(method->sym->name, NULL)); gen_params(fd, params, result, 1); } else if (!is_transient(result->info.typ)) { fprintf(fheader, "\n\nSOAP_FMAC5 int SOAP_FMAC6 soap_call_%s(struct soap *soap, const char *soap_endpoint, const char *soap_action", ident(method->sym->name)); gen_params(fheader, params, result, 1); fprintf(fd, "\n\nSOAP_FMAC5 int SOAP_FMAC6 soap_call_%s(struct soap *soap, const char *soap_endpoint, const char *soap_action", ident(method->sym->name)); gen_params(fd, params, result, 1); } else { fprintf(fheader, "\n\nSOAP_FMAC5 int SOAP_FMAC6 soap_send_%s(struct soap *soap, const char *soap_endpoint, const char *soap_action", ident(method->sym->name)); gen_params(fheader, params, result, 1); fprintf(fd, "\n\nSOAP_FMAC5 int SOAP_FMAC6 soap_send_%s(struct soap *soap, const char *soap_endpoint, const char *soap_action", ident(method->sym->name)); gen_params(fd, params, result, 1); } if (name) { if (iflag) fprintf(fd, "\n{\tstruct soap *soap = this;\n"); else fprintf(fd, "\n{\tstruct soap *soap = this->soap;\n"); } else { fprintf(fheader, ";"); fprintf(fd, "\n{"); } for (sp = services; sp; sp = sp->next) { if (has_ns_eq(sp->ns, method->sym->name)) { style = sp->style; encoding = sp->encoding; method_encoding = encoding; method_response_encoding = NULL; if (sp->protocol) { if (strstr(sp->protocol, "GET")) get = 1; else if (strstr(sp->protocol, "POST")) post = 1; else if (strstr(sp->protocol, "PUT")) put = 1; if (strncmp(sp->protocol, "SOAP", 4)) soap = 0; else if (strlen(sp->protocol) > 6) version = sp->protocol[6] - '0'; } for (m = sp->list; m; m = m->next) { if (is_eq_nons(m->name, method->sym->name)) { if (m->mess == ACTION || m->mess == REQUEST_ACTION) action = m->part; else if (m->mess == ENCODING) method_encoding = m->part; else if (m->mess == RESPONSE_ENCODING) method_response_encoding = m->part; else if (m->mess == PROTOCOL) { if (strstr(m->part, "GET")) get = 1; else if (strstr(m->part, "POST")) post = 1; else if (strstr(m->part, "PUT")) put = 1; if (strncmp(m->part, "SOAP", 4)) soap = 0; else if (strlen(m->part) > 6) version = m->part[6] - '0'; } else if (m->mess&MIMEIN && !strcmp(m->part, "application/x-www-form-urlencoded")) mime = 1; } } break; } } if (!get && !mime) fprintf(fd, "\tstruct %s soap_tmp_%s;", ident(method->sym->name), ident(method->sym->name)); if (response) fprintf(fd, "\n\tstruct %s *soap_tmp_%s;", c_ident(response->info.typ), c_ident(response->info.typ)); if (name) fprintf(fd, "\n\tif (endpoint)\n\t\tsoap_endpoint = endpoint;"); if (sp && sp->URL) fprintf(fd, "\n\tif (soap_endpoint == NULL)\n\t\tsoap_endpoint = \"%s\";", sp->URL); if (action) { fprintf(fd, "\n\tif (soap_action == NULL)\n\t\tsoap_action = "); if (*action == '"') fprintf(fd, "%s;", action); else fprintf(fd, "\"%s\";", action); } if (!method_response_encoding) method_response_encoding = method_encoding; if (!get && !mime) { for (param = params->list; param; param = param->next) { if (param->info.typ->type == Tarray) fprintf(fd, "\n\tsoap_memcpy(soap_tmp_%s.%s, sizeof(%s), %s, sizeof(%s));", ident(method->sym->name), ident(param->sym->name), c_type(param->info.typ), ident(param->sym->name), c_type(param->info.typ)); else fprintf(fd, "\n\tsoap_tmp_%s.%s = %s;", ident(method->sym->name), ident(param->sym->name), ident(param->sym->name)); } fprintf(fd, "\n\tsoap_begin(soap);"); if (!soap) fprintf(fd, "\n\tsoap_set_version(soap, 0); /* no SOAP */"); else if (version > 0) fprintf(fd, "\n\tsoap_set_version(soap, %d); /* SOAP1.%d */", version, version); if (soap && sp && sp->URI && method_encoding) { if (is_literal(method_encoding)) fprintf(fd, "\n\tsoap->encodingStyle = NULL;"); else if (method_encoding) fprintf(fd, "\n\tsoap->encodingStyle = \"%s\";", method_encoding); } else if (!eflag) fprintf(fd, "\n\tsoap->encodingStyle = NULL;"); if (soap) fprintf(fd, "\n\tsoap_serializeheader(soap);"); fprintf(fd, "\n\tsoap_serialize_%s(soap, &soap_tmp_%s);", ident(method->sym->name), ident(method->sym->name)); fprintf(fd, "\n\tif (soap_begin_count(soap))\n\t\treturn soap->error;"); fprintf(fd, "\n\tif (soap->mode & SOAP_IO_LENGTH)"); fprintf(fd, "\n\t{\tif (soap_envelope_begin_out(soap)"); if (soap) { fprintf(fd, "\n\t\t || soap_putheader(soap)"); fprintf(fd, "\n\t\t || soap_body_begin_out(soap)"); } fprintf(fd, "\n\t\t || soap_put_%s(soap, &soap_tmp_%s, \"%s\", NULL)", ident(method->sym->name), ident(method->sym->name), ns_convert(method->sym->name)); if (soap) fprintf(fd, "\n\t\t || soap_body_end_out(soap)"); fprintf(fd, "\n\t\t || soap_envelope_end_out(soap))"); fprintf(fd, "\n\t\t\t return soap->error;"); fprintf(fd, "\n\t}"); fprintf(fd, "\n\tif (soap_end_count(soap))\n\t\treturn soap->error;"); if (soap) fprintf(fd, "\n\tif (soap_connect(soap, soap_url(soap, soap_endpoint, NULL), soap_action)"); else { fprintf(fd, "\n\tsoap->http_content = \"text/xml\";"); if (put) fprintf(fd, "\n\tif (soap_connect_command(soap, SOAP_PUT, soap_url(soap, soap_endpoint, soap_action), soap_action)"); else fprintf(fd, "\n\tif (soap_connect_command(soap, SOAP_POST_FILE, soap_url(soap, soap_endpoint, soap_action), soap_action)"); } fprintf(fd, "\n\t || soap_envelope_begin_out(soap)"); if (soap) { fprintf(fd, "\n\t || soap_putheader(soap)"); fprintf(fd, "\n\t || soap_body_begin_out(soap)"); } fprintf(fd, "\n\t || soap_put_%s(soap, &soap_tmp_%s, \"%s\", NULL)", ident(method->sym->name), ident(method->sym->name), ns_convert(method->sym->name)); if (soap) fprintf(fd, "\n\t || soap_body_end_out(soap)"); fprintf(fd, "\n\t || soap_envelope_end_out(soap)"); fprintf(fd, "\n\t || soap_end_send(soap))"); fprintf(fd, "\n\t\treturn soap_closesock(soap);"); } else if (get) { if (params->list) { gen_query_url(fd, params); fprintf(fd, "\n\tif (soap_connect_command(soap, SOAP_GET, soap->msgbuf, soap_action))"); } else if (soap) fprintf(fd, "\n\tif (soap_connect_command(soap, SOAP_GET, soap_url(soap, soap_endpoint, NULL), soap_action))"); else fprintf(fd, "\n\tif (soap_connect_command(soap, SOAP_GET, soap_url(soap, soap_endpoint, soap_action), soap_action))"); fprintf(fd, "\n\t\treturn soap_closesock(soap);"); } else if (mime) { fprintf(fd, "\n\tsoap->http_content = \"application/x-www-form-urlencoded\";"); if (post) fprintf(fd, "\n\tif (soap_connect_command(soap, SOAP_POST_FILE, soap_url(soap, soap_endpoint, soap_action), soap_action))"); else if (put) fprintf(fd, "\n\tif (soap_connect_command(soap, SOAP_PUT, soap_url(soap, soap_endpoint, soap_action), soap_action))"); fprintf(fd, "\n\t\treturn soap_closesock(soap);"); gen_query_form(fd, params); fprintf(fd, "soap_end_send(soap))\n\t\treturn soap_closesock(soap);"); } if (is_transient(result->info.typ)) { fprintf(fd, "\n\treturn SOAP_OK;\n}"); if (name) { fprintf(fd, "\n\nint %s::recv_%s(", name, ns_cname(method->sym->name, NULL)); fprintf(fd, "struct %s& tmp)", ident(method->sym->name)); if (iflag) fprintf(fd, "\n{\tstruct soap *soap = this;\n"); else fprintf(fd, "\n{\tstruct soap *soap = this->soap;\n"); fprintf(fd, "\n\tstruct %s *%s = &tmp;", ident(method->sym->name), ident(result->sym->name)); } else { fprintf(fheader, "\n\nSOAP_FMAC5 int SOAP_FMAC6 soap_recv_%s(struct soap *soap, ", ident(method->sym->name)); fprintf(fd, "\n\nSOAP_FMAC5 int SOAP_FMAC6 soap_recv_%s(struct soap *soap, ", ident(method->sym->name)); fprintf(fheader, "struct %s *%s);\n", ident(method->sym->name), ident(result->sym->name)); fprintf(fd, "struct %s *%s)\n{", ident(method->sym->name), ident(result->sym->name)); } fprintf(fd, "\n\tsoap_default_%s(soap, %s);", ident(method->sym->name), ident(result->sym->name)); fprintf(fd, "\n\tsoap_begin(soap);"); } else if (result->info.typ->type == Tarray) fprintf(fd, "\n\tsoap_default_%s(soap, %s);", c_ident(result->info.typ), ident(result->sym->name)); else if (result->info.typ->type == Treference && ((Tnode*)result->info.typ->ref)->type == Tclass && !is_external((Tnode*)result->info.typ->ref) && !is_volatile((Tnode*)result->info.typ->ref)) fprintf(fd, "\n\tif (!&%s)\n\t\treturn soap_closesock(soap);\n\t%s.soap_default(soap);", ident(result->sym->name), ident(result->sym->name)); else if (((Tnode*)result->info.typ->ref)->type == Tclass && !is_external((Tnode*)result->info.typ->ref) && !is_volatile((Tnode*)result->info.typ->ref)) fprintf(fd, "\n\tif (!%s)\n\t\treturn soap_closesock(soap);\n\t%s->soap_default(soap);", ident(result->sym->name), ident(result->sym->name)); else if (result->info.typ->type == Treference && ((Tnode*)result->info.typ->ref)->type == Tpointer) fprintf(fd, "\n\t%s = NULL;", ident(result->sym->name)); else if (((Tnode*)result->info.typ->ref)->type == Tpointer) fprintf(fd, "\n\tif (!%s)\n\t\treturn soap_closesock(soap);\n\t*%s = NULL;", ident(result->sym->name), ident(result->sym->name)); else if (result->info.typ->type == Treference) fprintf(fd, "\n\tif (!&%s)\n\t\treturn soap_closesock(soap);\n\tsoap_default_%s(soap, &%s);", ident(result->sym->name), c_ident((Tnode*)result->info.typ->ref), ident(result->sym->name)); else if (!is_void(result->info.typ)) fprintf(fd, "\n\tif (!%s)\n\t\treturn soap_closesock(soap);\n\tsoap_default_%s(soap, %s);", ident(result->sym->name), c_ident((Tnode*)result->info.typ->ref), ident(result->sym->name)); fprintf(fd, "\n\tif (soap_begin_recv(soap)"); fprintf(fd, "\n\t || soap_envelope_begin_in(soap)"); fprintf(fd, "\n\t || soap_recv_header(soap)"); fprintf(fd, "\n\t || soap_body_begin_in(soap))"); fprintf(fd, "\n\t\treturn soap_closesock(soap);"); if (is_transient(result->info.typ)) { if (sflag) fprintf(fd, "\n\tsoap->mode |= SOAP_XML_STRICT;"); fprintf(fd, "\n\tsoap_get_%s(soap, %s, \"%s\", NULL);", ident(method->sym->name), ident(result->sym->name), ns_convert(method->sym->name)); fprintf(fd, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap->level == 2)\n\t\tsoap->error = SOAP_OK;"); fprintf(fd, "\n\tif (soap->error"); fprintf(fd, "\n\t || soap_body_end_in(soap)"); fprintf(fd, "\n\t || soap_envelope_end_in(soap)"); fprintf(fd, "\n\t || soap_end_recv(soap))"); fprintf(fd, "\n\t\treturn soap_closesock(soap);"); fprintf(fd, "\n\treturn soap_closesock(soap);\n}"); fflush(fd); return; } /* With RPC encoded responses, try to parse the fault first */ if (!is_literal(method_response_encoding)) { fprintf(fd, "\n\tif (soap_recv_fault(soap, 1))\n\t\treturn soap->error;"); xtag = ""; } else if ((wflag && !is_unmatched(result->sym)) || has_ns_eq(NULL, result->sym->name)) /* to ensure element name of response can be unqualified */ { if (response) xtag = xml_tag(response->info.typ); else xtag = ns_convert(result->sym->name); } else { if (response) xtag = xml_tag(response->info.typ); else xtag = xml_tag(result->info.typ); } if (sflag) fprintf(fd, "\n\tsoap->mode |= SOAP_XML_STRICT;"); if (response) { fprintf(fd, "\n\tsoap_tmp_%s = soap_get_%s(soap, NULL, \"%s\", NULL);", c_ident(response->info.typ), c_ident(response->info.typ), xtag); fprintf(fd, "\n\tif (!soap_tmp_%s || soap->error)\n\t\treturn soap_recv_fault(soap, 0);", c_ident(response->info.typ)); } else if ((result->info.typ->type == Treference || result->info.typ->type == Tpointer) && !is_invisible_empty((Tnode*)result->info.typ->ref)) { if (result->info.typ->type == Treference && ((Tnode *) result->info.typ->ref)->type == Tclass && !is_external((Tnode*)result->info.typ->ref) && !is_volatile((Tnode*)result->info.typ->ref) && !is_dynamic_array((Tnode*)result->info.typ->ref)) fprintf(fd, "\n\t%s.soap_get(soap, \"%s\", NULL);", ident(result->sym->name), xtag); else if (result->info.typ->type == Tpointer && ((Tnode *) result->info.typ->ref)->type == Tclass && !is_external((Tnode*)result->info.typ->ref) && !is_volatile((Tnode*)result->info.typ->ref) && !is_dynamic_array((Tnode*)result->info.typ->ref)) fprintf(fd, "\n\t%s->soap_get(soap, \"%s\", NULL);", ident(result->sym->name), xtag); else if (result->info.typ->type == Treference && ((Tnode *) result->info.typ->ref)->type == Tstruct && !is_external((Tnode*)result->info.typ->ref) && !is_volatile((Tnode*)result->info.typ->ref) && !is_dynamic_array((Tnode*)result->info.typ->ref)) { fprintf(fd, "\n\tsoap_get_%s(soap, &%s, \"%s\", NULL);", c_ident((Tnode*)result->info.typ->ref), ident(result->sym->name), xtag); } else if (result->info.typ->type == Tpointer && ((Tnode *) result->info.typ->ref)->type == Tstruct && !is_dynamic_array((Tnode*)result->info.typ->ref)) { fprintf(fd, "\n\tsoap_get_%s(soap, %s, \"%s\", NULL);", c_ident((Tnode*)result->info.typ->ref), ident(result->sym->name), xtag); } else if (result->info.typ->type == Tpointer && is_XML((Tnode*)result->info.typ->ref) && is_string((Tnode*)result->info.typ->ref)) { fprintf(fd, "\n\tsoap_inliteral(soap, NULL, (char**)%s);", ident(result->sym->name)); } else if (result->info.typ->type == Treference && is_XML((Tnode*)result->info.typ->ref) && is_string((Tnode*)result->info.typ->ref)) { fprintf(fd, "\n\tsoap_inliteral(soap, NULL, (char**)&%s);", ident(result->sym->name)); } else if (result->info.typ->type == Tpointer && is_XML((Tnode*)result->info.typ->ref) && is_wstring((Tnode*)result->info.typ->ref)) { fprintf(fd, "\n\tsoap_inwliteral(soap, NULL, (wchar_t**)%s);", ident(result->sym->name)); } else if (result->info.typ->type == Treference && is_XML((Tnode*)result->info.typ->ref) && is_wstring((Tnode*)result->info.typ->ref)) { fprintf(fd, "\n\tsoap_inwliteral(soap, NULL, (wchar_t**)&%s);", ident(result->sym->name)); } else if (result->info.typ->type == Treference) { fprintf(fd, "\n\tsoap_get_%s(soap, &%s, \"%s\", NULL);", c_ident(result->info.typ), ident(result->sym->name), xtag); } else { fprintf(fd, "\n\tsoap_get_%s(soap, %s, \"%s\", NULL);", c_ident(result->info.typ), ident(result->sym->name), xtag); } fprintf(fd, "\n\tif (soap->error)\n\t\treturn soap_recv_fault(soap, 0);"); } else if (is_literal(method_response_encoding)) { fprintf(fd, "\n\tif (soap_recv_fault(soap, 1))\n\t\treturn soap->error;"); } fflush(fd); fprintf(fd, "\n\tif (soap_body_end_in(soap)"); fprintf(fd, "\n\t || soap_envelope_end_in(soap)"); fprintf(fd, "\n\t || soap_end_recv(soap))"); fprintf(fd, "\n\t\treturn soap_closesock(soap);"); if (response) { if (result->info.typ->type == Tarray) fprintf(fd, "\n\tsoap_memcpy(%s, sizeof(%s), soap_tmp_%s->%s, sizeof(%s));", ident(result->sym->name), c_ident(response->info.typ), c_type(result->info.typ), ident(result->sym->name), c_type(result->info.typ)); else if (result->info.typ->type == Treference) fprintf(fd, "\n\t%s = soap_tmp_%s->%s;", ident(result->sym->name), c_ident(response->info.typ), ident(result->sym->name)); else { fprintf(fd, "\n\tif (%s && soap_tmp_%s->%s)", ident(result->sym->name), c_ident(response->info.typ), ident(result->sym->name)); fprintf(fd, "\n\t\t*%s = *soap_tmp_%s->%s;", ident(result->sym->name), c_ident(response->info.typ), ident(result->sym->name)); } } fprintf(fd, "\n\treturn soap_closesock(soap);"); fprintf(fd , "\n}"); fflush(fd); } void gen_serve_method(FILE *fd, Table *table, Entry *param, const char *name) { Service *sp = NULL; const char *style, *encoding; Entry *result, *p, *q, *pin, *pout, *response = NULL; Table *input; const char *xtag; Method *m; const char *method_encoding = NULL, *method_response_encoding = NULL; result = (Entry*)param->info.typ->ref; p = entry(classtable, param->sym); if (!p) execerror("no table entry"); if (!is_response(result->info.typ) && !is_XML(result->info.typ)) response = get_response(param->info.typ); q = entry(table, param->sym); if (!q) execerror("no table entry"); pout = (Entry*)q->info.typ->ref; if (name) { if (iflag) fprintf(fd, "\n\nstatic int serve_%s(%s *soap)\n{", ident(param->sym->name), name); else fprintf(fd, "\n\nstatic int serve_%s(struct soap *soap, %s *service)\n{", ident(param->sym->name), name); } else { fprintf(fheader, "\n\nSOAP_FMAC5 int SOAP_FMAC6 soap_serve_%s(struct soap*);", ident(param->sym->name)); fprintf(fd, "\n\nSOAP_FMAC5 int SOAP_FMAC6 soap_serve_%s(struct soap *soap)\n{", ident(param->sym->name)); } fprintf(fd, "\tstruct %s soap_tmp_%s;", ident(param->sym->name), ident(param->sym->name)); for (sp = services; sp; sp = sp->next) { if (has_ns_eq(sp->ns, param->sym->name)) { style = sp->style; encoding = sp->encoding; method_encoding = encoding; method_response_encoding = NULL; for (m = sp->list; m; m = m->next) { if (is_eq_nons(m->name, param->sym->name)) { if (m->mess == ENCODING) method_encoding = m->part; else if (m->mess == RESPONSE_ENCODING) method_response_encoding = m->part; } } break; } } if (!method_response_encoding) method_response_encoding = method_encoding; fflush(fd); if (!is_transient(pout->info.typ)) { if (pout->info.typ->type == Tarray && response) { fprintf(fd, "\n\tstruct %s soap_tmp_%s;", c_ident(response->info.typ), c_ident(response->info.typ)); fprintf(fd, "\n\tsoap_default_%s(soap, &soap_tmp_%s);", c_ident(response->info.typ), c_ident(response->info.typ)); } else if (pout->info.typ->type == Tpointer && !is_stdstring(pout->info.typ) && !is_stdwstring(pout->info.typ) && response) { fprintf(fd, "\n\tstruct %s soap_tmp_%s;", c_ident(response->info.typ), c_ident(response->info.typ)); fprintf(fd, "\n\t%s soap_tmp_%s;", c_type((Tnode*)pout->info.typ->ref), c_ident((Tnode*)pout->info.typ->ref)); fprintf(fd, "\n\tsoap_default_%s(soap, &soap_tmp_%s);", c_ident(response->info.typ), c_ident(response->info.typ)); if (((Tnode*)pout->info.typ->ref)->type == Tclass && !is_external((Tnode*)pout->info.typ->ref) && !is_volatile((Tnode*)pout->info.typ->ref) && !is_typedef((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\tsoap_tmp_%s.soap_default(soap);", c_ident((Tnode*)pout->info.typ->ref)); else if (((Tnode*)pout->info.typ->ref)->type == Tpointer) fprintf(fd, "\n\tsoap_tmp_%s = NULL;", c_ident((Tnode*)pout->info.typ->ref)); else fprintf(fd, "\n\tsoap_default_%s(soap, &soap_tmp_%s);", c_ident((Tnode*)pout->info.typ->ref), c_ident((Tnode*)pout->info.typ->ref)); fprintf(fd, "\n\tsoap_tmp_%s.%s = &soap_tmp_%s;", c_ident(response->info.typ), ident(pout->sym->name), c_ident((Tnode*)pout->info.typ->ref)); } else if (response) { fprintf(fd, "\n\tstruct %s soap_tmp_%s;", c_ident(response->info.typ), c_ident(response->info.typ)); fprintf(fd, "\n\tsoap_default_%s(soap, &soap_tmp_%s);", c_ident(response->info.typ), c_ident(response->info.typ)); } else if (((Tnode *)pout->info.typ->ref)->type == Tclass && !is_stdstring((Tnode*)pout->info.typ->ref) && !is_stdwstring((Tnode*)pout->info.typ->ref) && (is_external((Tnode*)pout->info.typ->ref) || is_volatile((Tnode*)pout->info.typ->ref) || is_typedef((Tnode*)pout->info.typ->ref)) && !is_dynamic_array((Tnode*)pout->info.typ->ref)) { fprintf(fd, "\n\t%s %s;", c_type((Tnode*)pout->info.typ->ref), ident(pout->sym->name)); fprintf(fd, "\n\tsoap_default_%s(soap, &%s);", c_ident((Tnode*)pout->info.typ->ref), ident(pout->sym->name)); } else if (((Tnode *)pout->info.typ->ref)->type == Tclass && !is_stdstring((Tnode*)pout->info.typ->ref) && !is_stdwstring((Tnode*)pout->info.typ->ref) && !is_dynamic_array((Tnode*)pout->info.typ->ref)) { fprintf(fd, "\n\t%s %s;", c_type((Tnode*)pout->info.typ->ref), ident(pout->sym->name)); fprintf(fd, "\n\t%s.soap_default(soap);", ident(pout->sym->name)); } else if (((Tnode *)pout->info.typ->ref)->type == Tstruct && !is_dynamic_array((Tnode*)pout->info.typ->ref)) { fprintf(fd, "\n\t%s %s;", c_type((Tnode*)pout->info.typ->ref), ident(pout->sym->name)); fprintf(fd, "\n\tsoap_default_%s(soap, &%s);", c_ident((Tnode *)pout->info.typ->ref), ident(pout->sym->name)); } else { fprintf(fd, "\n\t%s soap_tmp_%s;", c_type((Tnode*)pout->info.typ->ref), c_ident((Tnode*)pout->info.typ->ref)); if (is_string((Tnode*)pout->info.typ->ref) || is_wstring((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\tsoap_tmp_%s = NULL;", c_ident((Tnode*)pout->info.typ->ref)); else fprintf(fd, "\n\tsoap_default_%s(soap, &soap_tmp_%s);", c_ident((Tnode*)pout->info.typ->ref), c_ident((Tnode*)pout->info.typ->ref)); } } fprintf(fd, "\n\tsoap_default_%s(soap, &soap_tmp_%s);", ident(param->sym->name), ident(param->sym->name)); fflush(fd); q = entry(classtable, param->sym); if (!is_invisible_empty(q->info.typ)) { fprintf(fd, "\n\tif (!soap_get_%s(soap, &soap_tmp_%s, \"%s\", NULL))", ident(param->sym->name), ident(param->sym->name), ns_convert(param->sym->name)); fprintf(fd, "\n\t\treturn soap->error;"); } fprintf(fd, "\n\tif (soap_body_end_in(soap)"); fprintf(fd, "\n\t || soap_envelope_end_in(soap)"); fprintf(fd, "\n\t || soap_end_recv(soap))\n\t\treturn soap->error;"); if (name) { if (iflag) fprintf(fd, "\n\tsoap->error = soap->%s(", ns_cname(param->sym->name, NULL)); else fprintf(fd, "\n\tsoap->error = service->%s(", ns_cname(param->sym->name, NULL)); } else fprintf(fd, "\n\tsoap->error = %s(soap", ident(param->sym->name)); fflush(fd); input = (Table*) q->info.typ->ref; for (pin = input->list; pin; pin = pin->next) { if (pin->info.typ->type == Trvalueref) fprintf(fd, "%sstd::move(soap_tmp_%s.%s)", !name || pin != input->list ? ", " : "", ident(param->sym->name), ident(pin->sym->name)); else fprintf(fd, "%ssoap_tmp_%s.%s", !name || pin != input->list ? ", " : "", ident(param->sym->name), ident(pin->sym->name)); } if (is_transient(pout->info.typ)) fprintf(fd, ");"); else { if (!name || input->list) fprintf(fd, ", "); if (response) fprintf(fd, "soap_tmp_%s.%s);", c_ident(response->info.typ), ident(pout->sym->name)); else if (pout->info.typ->type == Treference && (((Tnode*)pout->info.typ->ref)->type == Tstruct || ((Tnode*)pout->info.typ->ref)->type == Tclass) && !is_stdstring((Tnode*)pout->info.typ->ref) && !is_stdwstring((Tnode*)pout->info.typ->ref) && !is_dynamic_array((Tnode*)pout->info.typ->ref)) fprintf(fd, "%s);", ident(pout->sym->name)); else if ((((Tnode*)pout->info.typ->ref)->type == Tstruct || ((Tnode*)pout->info.typ->ref)->type == Tclass) && !is_stdstring((Tnode*)pout->info.typ->ref) && !is_stdwstring((Tnode*)pout->info.typ->ref) && !is_dynamic_array((Tnode*)pout->info.typ->ref)) fprintf(fd, "&%s);", ident(pout->sym->name)); else if (pout->info.typ->type == Treference) fprintf(fd, "soap_tmp_%s);", c_ident((Tnode*)pout->info.typ->ref)); else fprintf(fd, "&soap_tmp_%s);", c_ident((Tnode*)pout->info.typ->ref)); } fprintf(fd, "\n\tif (soap->error)\n\t\treturn soap->error;"); if (!is_transient(pout->info.typ)) { if (sp && sp->URI && method_response_encoding) { if (is_literal(method_response_encoding)) fprintf(fd, "\n\tsoap->encodingStyle = NULL;"); else if (sp->encoding) fprintf(fd, "\n\tsoap->encodingStyle = \"%s\";", sp->encoding); else if (method_response_encoding) fprintf(fd, "\n\tsoap->encodingStyle = \"%s\";", method_response_encoding); else if (!eflag) fprintf(fd, "\n\tsoap->encodingStyle = NULL;"); } else if (!eflag) fprintf(fd, "\n\tsoap->encodingStyle = NULL;"); fprintf(fd, "\n\tsoap_serializeheader(soap);"); if (pout->info.typ->type == Tarray && response) fprintf(fd, "\n\tsoap_serialize_%s(soap, &soap_tmp_%s);", c_ident(response->info.typ), c_ident(response->info.typ)); else if (response) fprintf(fd, "\n\tsoap_serialize_%s(soap, &soap_tmp_%s);", c_ident(response->info.typ), c_ident(response->info.typ)); else if (((Tnode *)pout->info.typ->ref)->type == Tclass && !is_stdstring((Tnode*)pout->info.typ->ref) && !is_stdwstring((Tnode*)pout->info.typ->ref) && (is_external((Tnode*)pout->info.typ->ref) || is_volatile((Tnode*)pout->info.typ->ref) || is_typedef((Tnode*)pout->info.typ->ref)) && !is_dynamic_array((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\tsoap_serialize_%s(soap, &%s);", c_ident((Tnode*)pout->info.typ->ref), ident(pout->sym->name)); else if (((Tnode *)pout->info.typ->ref)->type == Tclass && !is_stdstring((Tnode*)pout->info.typ->ref) && !is_stdwstring((Tnode*)pout->info.typ->ref) && !is_dynamic_array((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\t%s.soap_serialize(soap);", ident(pout->sym->name)); else if (((Tnode *)pout->info.typ->ref)->type == Tstruct && !is_dynamic_array((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\tsoap_serialize_%s(soap, &%s);", c_ident((Tnode*)pout->info.typ->ref), ident(pout->sym->name)); else if (!is_XML((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\tsoap_serialize_%s(soap, &soap_tmp_%s);", c_ident((Tnode*)pout->info.typ->ref), c_ident((Tnode*)pout->info.typ->ref)); if (is_literal(method_response_encoding) && ((wflag && !is_unmatched(pout->sym)) || has_ns_eq(NULL, pout->sym->name))) /* to ensure element name of response can be unqualified */ xtag = ns_convert(pout->sym->name); else xtag = xml_tag(pout->info.typ); fprintf(fd, "\n\tif (soap_begin_count(soap))\n\t\treturn soap->error;"); fprintf(fd, "\n\tif (soap->mode & SOAP_IO_LENGTH)"); fprintf(fd, "\n\t{\tif (soap_envelope_begin_out(soap)"); fprintf(fd, "\n\t\t || soap_putheader(soap)"); fprintf(fd, "\n\t\t || soap_body_begin_out(soap)"); if (response) fprintf(fd, "\n\t\t || soap_put_%s(soap, &soap_tmp_%s, \"%s\", NULL)", c_ident(response->info.typ), c_ident(response->info.typ), xml_tag(response->info.typ)); else if (((Tnode*)pout->info.typ->ref)->type == Tclass && !is_stdstring((Tnode*)pout->info.typ->ref) && !is_stdwstring((Tnode*)pout->info.typ->ref) && (is_external((Tnode*)pout->info.typ->ref) || is_volatile((Tnode*)pout->info.typ->ref) || is_typedef((Tnode*)pout->info.typ->ref)) && !is_dynamic_array((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\t\t || soap_put_%s(soap, &%s, \"%s\", NULL)", c_ident((Tnode*)pout->info.typ->ref), ident(pout->sym->name), ns_convert(pout->sym->name)); else if (((Tnode*)pout->info.typ->ref)->type == Tclass && !is_stdstring((Tnode*)pout->info.typ->ref) && !is_stdwstring((Tnode*)pout->info.typ->ref) && !is_dynamic_array((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\t\t || %s.soap_put(soap, \"%s\", \"\")", ident(pout->sym->name), xtag); else if (((Tnode*)pout->info.typ->ref)->type == Tstruct && !is_dynamic_array((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\t\t || soap_put_%s(soap, &%s, \"%s\", NULL)", c_ident((Tnode*)pout->info.typ->ref), ident(pout->sym->name), xtag); else if (is_XML((Tnode*)pout->info.typ->ref) && is_string((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\t\t || soap_outliteral(soap, \"%s\", &soap_tmp_%s, NULL)", ns_convert(pout->sym->name), c_ident((Tnode*)pout->info.typ->ref)); else if (is_XML((Tnode*)pout->info.typ->ref) && is_wstring((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\t\t || soap_outwliteral(soap, \"%s\", &soap_tmp_%s, NULL)", ns_convert(pout->sym->name), c_ident((Tnode*)pout->info.typ->ref)); else fprintf(fd, "\n\t\t || soap_put_%s(soap, &soap_tmp_%s, \"%s\", NULL)", c_ident(pout->info.typ), c_ident((Tnode*)pout->info.typ->ref), ns_convert(pout->sym->name)); fprintf(fd, "\n\t\t || soap_body_end_out(soap)"); fprintf(fd, "\n\t\t || soap_envelope_end_out(soap))"); fprintf(fd, "\n\t\t\t return soap->error;"); fprintf(fd, "\n\t};"); fprintf(fd, "\n\tif (soap_end_count(soap)"); fprintf(fd, "\n\t || soap_response(soap, SOAP_OK)"); fprintf(fd, "\n\t || soap_envelope_begin_out(soap)"); fprintf(fd, "\n\t || soap_putheader(soap)"); fprintf(fd, "\n\t || soap_body_begin_out(soap)"); if (response) fprintf(fd, "\n\t || soap_put_%s(soap, &soap_tmp_%s, \"%s\", NULL)", c_ident(response->info.typ), c_ident(response->info.typ), xml_tag(response->info.typ)); else if (((Tnode *)pout->info.typ->ref)->type == Tclass && !is_stdstring((Tnode*)pout->info.typ->ref) && !is_stdwstring((Tnode*)pout->info.typ->ref) && (is_external((Tnode*)pout->info.typ->ref) || is_volatile((Tnode*)pout->info.typ->ref) || is_typedef((Tnode*)pout->info.typ->ref)) && !is_dynamic_array((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\t || soap_put_%s(soap, &%s, \"%s\", NULL)", c_ident((Tnode*)pout->info.typ->ref), ident(pout->sym->name), ns_convert(pout->sym->name)); else if (((Tnode *)pout->info.typ->ref)->type == Tclass && !is_stdstring((Tnode*)pout->info.typ->ref) && !is_stdwstring((Tnode*)pout->info.typ->ref) && !is_dynamic_array((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\t || %s.soap_put(soap, \"%s\", \"\")", ident(pout->sym->name), xtag); else if (((Tnode *)pout->info.typ->ref)->type == Tstruct && !is_dynamic_array((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\t || soap_put_%s(soap, &%s, \"%s\", NULL)", c_ident((Tnode*)pout->info.typ->ref), ident(pout->sym->name), xtag); else if (is_XML((Tnode*)pout->info.typ->ref) && is_string((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\t || soap_outliteral(soap, \"%s\", &soap_tmp_%s, NULL)", ns_convert(pout->sym->name), c_ident((Tnode*)pout->info.typ->ref)); else if (is_XML((Tnode*)pout->info.typ->ref) && is_wstring((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\t || soap_outwliteral(soap, \"%s\", &soap_tmp_%s, NULL)", ns_convert(pout->sym->name), c_ident((Tnode*)pout->info.typ->ref)); else fprintf(fd, "\n\t || soap_put_%s(soap, &soap_tmp_%s, \"%s\", NULL)", c_ident(pout->info.typ), c_ident((Tnode*)pout->info.typ->ref), ns_convert(pout->sym->name)); fprintf(fd, "\n\t || soap_body_end_out(soap)"); fprintf(fd, "\n\t || soap_envelope_end_out(soap)"); fprintf(fd, "\n\t || soap_end_send(soap))"); fprintf(fd, "\n\t\treturn soap->error;"); } fprintf(fd, "\n\treturn soap_closesock(soap);"); fprintf(fd, "\n}"); fflush(fd); } void gen_object_code(FILE *fd, Table *table, Symbol *ns, const char *name) { Entry *p, *method, *catch_method, *param; Table *t; const char *soap, *catch_action; if (iflag) soap = "this"; else soap = "this->soap"; fprintf(fd, "\n\n#include \"%s%s.h\"", prefix, name); if (namespaceid) fprintf(fd, "\n\nnamespace %s {", namespaceid); if (iflag) { fprintf(fd, "\n\n%s::%s() : soap(SOAP_IO_DEFAULT)\n{\t%s_init(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT);\n}", name, name, name); fprintf(fd, "\n\n%s::%s(const %s& rhs)\n{\tsoap_copy_context(this, &rhs);\n}", name, name, name); fprintf(fd, "\n\n%s::%s(const struct soap &_soap) : soap(_soap)\n{ }", name, name); fprintf(fd, "\n\n%s::%s(soap_mode iomode) : soap(iomode)\n{\t%s_init(iomode, iomode);\n}", name, name, name); fprintf(fd, "\n\n%s::%s(soap_mode imode, soap_mode omode) : soap(imode, omode)\n{\t%s_init(imode, omode);\n}", name, name, name); fprintf(fd, "\n\n%s::~%s()\n{\n\tthis->destroy();\n}", name, name); } else { fprintf(fd, "\n\n%s::%s()\n{\tthis->soap = soap_new();\n\tthis->soap_own = true;\n\t%s_init(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT);\n}", name, name, name); fprintf(fd, "\n\n%s::%s(const %s& rhs)\n{\tthis->soap = rhs.soap;\n\tthis->soap_own = false;\n}", name, name, name); fprintf(fd, "\n\n%s::%s(struct soap *_soap)\n{\tthis->soap = _soap;\n\tthis->soap_own = false;\n\t%s_init(_soap->imode, _soap->omode);\n}", name, name, name); fprintf(fd, "\n\n%s::%s(soap_mode iomode)\n{\tthis->soap = soap_new();\n\tthis->soap_own = true;\n\t%s_init(iomode, iomode);\n}", name, name, name); fprintf(fd, "\n\n%s::%s(soap_mode imode, soap_mode omode)\n{\tthis->soap = soap_new();\n\tthis->soap_own = true;\n\t%s_init(imode, omode);\n}", name, name, name); fprintf(fd, "\n\n%s::~%s()\n{\tif (this->soap_own)\n\t\tsoap_free(this->soap);\n}", name, name); } fprintf(fd, "\n\nvoid %s::%s_init(soap_mode imode, soap_mode omode)\n{\tsoap_imode(%s, imode);\n\tsoap_omode(%s, omode);\n\tstatic const struct Namespace namespaces[] =\n", name, name, soap, soap); gen_nsmap(fd); fprintf(fd, "\tsoap_set_namespaces(%s, namespaces);\n}", soap); fprintf(fd, "\n\nvoid %s::destroy()\n{\tsoap_destroy(%s);\n\tsoap_end(%s);\n}", name, soap, soap); fprintf(fd, "\n\nvoid %s::reset()\n{\tthis->destroy();\n\tsoap_done(%s);\n\tsoap_initialize(%s);\n\t%s_init(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT);\n}", name, soap, soap, name); if (iflag) { fprintf(fd, "\n\n#ifndef WITH_PURE_VIRTUAL\n%s *%s::copy()\n{\t%s *dup = SOAP_NEW_COPY(%s(*(struct soap*)%s));\n\treturn dup;\n}\n#endif", name, name, name, name, soap); fprintf(fd, "\n\n%s& %s::operator=(const %s& rhs)\n{\tsoap_copy_context(this, &rhs);\n\treturn *this;\n}", name, name, name); } else { fprintf(fd, "\n\n#ifndef WITH_PURE_VIRTUAL\n%s *%s::copy()\n{\t%s *dup = SOAP_NEW_COPY(%s);\n\tif (dup)\n\t\tsoap_copy_context(dup->soap, this->soap);\n\treturn dup;\n}\n#endif", name, name, name, name); fprintf(fd, "\n\n%s& %s::operator=(const %s& rhs)\n{\tif (this->soap_own)\n\t\tsoap_free(this->soap);\n\tthis->soap = rhs.soap;\n\tthis->soap_own = false;\n\treturn *this;\n}", name, name, name); } fprintf(fd, "\n\nint %s::soap_close_socket()\n{\treturn soap_closesock(%s);\n}", name, soap); fprintf(fd, "\n\nint %s::soap_force_close_socket()\n{\treturn soap_force_closesock(%s);\n}", name, soap); fprintf(fd, "\n\nint %s::soap_senderfault(const char *string, const char *detailXML)\n{\treturn ::soap_sender_fault(%s, string, detailXML);\n}", name, soap); fprintf(fd, "\n\nint %s::soap_senderfault(const char *subcodeQName, const char *string, const char *detailXML)\n{\treturn ::soap_sender_fault_subcode(%s, subcodeQName, string, detailXML);\n}", name, soap); fprintf(fd, "\n\nint %s::soap_receiverfault(const char *string, const char *detailXML)\n{\treturn ::soap_receiver_fault(%s, string, detailXML);\n}", name, soap); fprintf(fd, "\n\nint %s::soap_receiverfault(const char *subcodeQName, const char *string, const char *detailXML)\n{\treturn ::soap_receiver_fault_subcode(%s, subcodeQName, string, detailXML);\n}", name, soap); fprintf(fd, "\n\nvoid %s::soap_print_fault(FILE *fd)\n{\t::soap_print_fault(%s, fd);\n}", name, soap); fprintf(fd, "\n\n#ifndef WITH_LEAN\n#ifndef WITH_COMPAT\nvoid %s::soap_stream_fault(std::ostream& os)\n{\t::soap_stream_fault(%s, os);\n}\n#endif", name, soap); fprintf(fd, "\n\nchar *%s::soap_sprint_fault(char *buf, size_t len)\n{\treturn ::soap_sprint_fault(%s, buf, len);\n}\n#endif", name, soap); fprintf(fd, "\n\nvoid %s::soap_noheader()\n{\t%s->header = NULL;\n}", name, soap); if (!namespaceid) { p = entry(classtable, lookup("SOAP_ENV__Header")); if (p) { t = (Table*)p->info.typ->ref; if (t && t->list && !is_void(t->list->info.typ)) { fprintf(fd, "\n\nvoid %s::soap_header(", name); gen_params(fd, t, NULL, 0); fprintf(fd, "\n{\t::soap_header(%s);", soap); for (param = t->list; param; param = param->next) { if (namespaceid) fprintf(fd, "\n\t((%s::SOAP_ENV__Header*)%s->header)->%s = %s;", namespaceid, soap, ident(param->sym->name), ident(param->sym->name)); else fprintf(fd, "\n\t%s->header->%s = %s;", soap, ident(param->sym->name), ident(param->sym->name)); } fprintf(fd, "\n}"); } } } fprintf(fd, "\n\nconst SOAP_ENV__Header *%s::soap_header()\n{\treturn %s->header;\n}", name, soap); fprintf(fd, "\n\nint %s::run(int port)\n{\tif (!soap_valid_socket(%s->master) && !soap_valid_socket(this->bind(NULL, port, 100)))\n\t\treturn %s->error;\n\tfor (;;)\n\t{\tif (!soap_valid_socket(this->accept()))\n\t\t{\tif (%s->errnum == 0) // timeout?\n\t\t\t\t%s->error = SOAP_OK;\n\t\t\tbreak;\n\t\t}\n\t\tif (this->serve())\n\t\t\tbreak;\n\t\tthis->destroy();\n\t}\n\treturn %s->error;\n}", name, soap, soap, soap, soap, soap); fprintf(fd, "\n\n#if defined(WITH_OPENSSL) || defined(WITH_GNUTLS)"); fprintf(fd, "\nint %s::ssl_run(int port)\n{\tif (!soap_valid_socket(%s->master) && !soap_valid_socket(this->bind(NULL, port, 100)))\n\t\treturn %s->error;\n\tfor (;;)\n\t{\tif (!soap_valid_socket(this->accept()))\n\t\t{\tif (%s->errnum == 0) // timeout?\n\t\t\t\t%s->error = SOAP_OK;\n\t\t\tbreak;\n\t\t}\n\t\tif (this->ssl_accept() || this->serve())\n\t\t\tbreak;\n\t\tthis->destroy();\n\t}\n\treturn %s->error;\n}", name, soap, soap, soap, soap, soap); fprintf(fd, "\n#endif"); fprintf(fd, "\n\nSOAP_SOCKET %s::bind(const char *host, int port, int backlog)\n{\treturn soap_bind(%s, host, port, backlog);\n}", name, soap); fprintf(fd, "\n\nSOAP_SOCKET %s::accept()\n{\treturn soap_accept(%s);\n}", name, soap); fprintf(fd, "\n\n#if defined(WITH_OPENSSL) || defined(WITH_GNUTLS)"); fprintf(fd, "\nint %s::ssl_accept()\n{\treturn soap_ssl_accept(%s);\n}", name, soap); fprintf(fd, "\n#endif"); fprintf(fd, "\n\nint %s::serve()", name); fprintf(fd, "\n{\n#ifndef WITH_FASTCGI\n\tunsigned int k = %s->max_keep_alive;\n#endif\n\tdo\n\t{", soap); fprintf(fd, "\n\n#ifndef WITH_FASTCGI\n\t\tif (%s->max_keep_alive > 0 && !--k)\n\t\t\t%s->keep_alive = 0;\n#endif", soap, soap); fprintf(fd, "\n\n\t\tif (soap_begin_serve(%s))\n\t\t{\tif (%s->error >= SOAP_STOP)\n\t\t\t\tcontinue;\n\t\t\treturn %s->error;\n\t\t}", soap, soap, soap); fprintf(fd, "\n\t\tif (dispatch() || (%s->fserveloop && %s->fserveloop(%s)))\n\t\t{\n#ifdef WITH_FASTCGI\n\t\t\tsoap_send_fault(%s);\n#else\n\t\t\treturn soap_send_fault(%s);\n#endif\n\t\t}", soap, soap, soap, soap, soap); fprintf(fd, "\n\n#ifdef WITH_FASTCGI\n\t\tsoap_destroy(%s);\n\t\tsoap_end(%s);\n\t} while (1);\n#else\n\t} while (%s->keep_alive);\n#endif", soap, soap, soap); fprintf(fd, "\n\treturn SOAP_OK;"); fprintf(fd, "\n}\n"); for (method = table->list; method; method = method->next) { if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && has_ns_eq(ns->name, method->sym->name)) { if (jflag) fprintf(fd, "\nstatic int serve_%s(struct soap*, %s*);", ident(method->sym->name), name); else fprintf(fd, "\nstatic int serve_%s(%s*);", ident(method->sym->name), name); } } fprintf(fd, "\n\nint %s::dispatch()\n{", name); if (!iflag) { fprintf(fd, "\treturn dispatch(this->soap);\n}"); fprintf(fd, "\n\nint %s::dispatch(struct soap* soap)\n{", name); fprintf(fd, "\n\t%s_init(soap->imode, soap->omode);\n", name); soap = "soap"; } if (sflag) fprintf(fd, "\n\tsoap->mode |= SOAP_XML_STRICT;"); fprintf(fd, "\n\tsoap_peek_element(%s);", soap); catch_method = NULL; catch_action = NULL; for (method = table->list; method; method = method->next) { const char *action = NULL; if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && has_ns_eq(ns->name, method->sym->name)) { if (aflag) { Service *sp; for (sp = services; sp; sp = sp->next) { if (has_ns_eq(sp->ns, method->sym->name)) { Method *m; for (m = sp->list; m; m = m->next) { if (is_eq_nons(m->name, method->sym->name)) { if (m->mess == ACTION || m->mess == REQUEST_ACTION) action = m->part; } } } } } if (is_invisible(method->sym->name)) { Entry *param = entry(classtable, method->sym); if (param) param = ((Table*)param->info.typ->ref)->list; if (action) { if (*action == '"') { fprintf(fd, "\n\tif ("); if (param && !Aflag) fprintf(fd, "(!%s->action && !soap_match_tag(%s, %s->tag, \"%s\")) || ", soap, soap, soap, ns_convert(param->sym->name)); else { catch_method = method; catch_action = action; } fprintf(fd, "(%s->action && !strcmp(%s->action, %s))", soap, soap, action); } else { fprintf(fd, "\n\tif ("); if (param && !Aflag) fprintf(fd, "(!%s->action && !soap_match_tag(%s, %s->tag, \"%s\")) || ", soap, soap, soap, ns_convert(param->sym->name)); else { catch_method = method; catch_action = action; } fprintf(fd, "(%s->action && !strcmp(%s->action, \"%s\"))", soap, soap, action); } if (iflag) fprintf(fd, ")\n\t\treturn serve_%s(this);", ident(method->sym->name)); else fprintf(fd, ")\n\t\treturn serve_%s(%s, this);", ident(method->sym->name), soap); } else { if (Aflag) compliancewarn("Option -A requires a SOAPAction where none is defined"); if (param) { fprintf(fd, "\n\tif (!soap_match_tag(%s, %s->tag, \"%s\")", soap, soap, ns_convert(param->sym->name)); if (iflag) fprintf(fd, ")\n\t\treturn serve_%s(this);", ident(method->sym->name)); else fprintf(fd, ")\n\t\treturn serve_%s(%s, this);", ident(method->sym->name), soap); } else { catch_method = method; catch_action = action; } } } else { if (action) { if (*action == '"') { fprintf(fd, "\n\tif ("); if (!Aflag) fprintf(fd, "(!%s->action && !soap_match_tag(%s, %s->tag, \"%s\")) || ", soap, soap, soap, ns_convert(method->sym->name)); fprintf(fd, "(%s->action && !strcmp(%s->action, %s))", soap, soap, action); } else { fprintf(fd, "\n\tif ("); if (!Aflag) fprintf(fd, "(!%s->action && !soap_match_tag(%s, %s->tag, \"%s\")) || ", soap, soap, soap, ns_convert(method->sym->name)); fprintf(fd, "(%s->action && !strcmp(%s->action, \"%s\"))", soap, soap, action); } } else { if (Aflag) compliancewarn("Option -A requires a SOAPAction where none is defined"); fprintf(fd, "\n\tif (!soap_match_tag(%s, %s->tag, \"%s\")", soap, soap, ns_convert(method->sym->name)); } if (iflag) fprintf(fd, ")\n\t\treturn serve_%s(this);", ident(method->sym->name)); else fprintf(fd, ")\n\t\treturn serve_%s(%s, this);", ident(method->sym->name), soap); } } } if (catch_method) { if (Aflag && catch_action) { if (*catch_action == '"') { fprintf(fd, "\n\tif ("); fprintf(fd, "(%s->action && !strcmp(%s->action, %s))", soap, soap, catch_action); if (iflag) fprintf(fd, ")\n\t\treturn serve_%s(this);", ident(catch_method->sym->name)); else fprintf(fd, ")\n\t\treturn serve_%s(%s, this);", ident(catch_method->sym->name), soap); } else { fprintf(fd, "\n\tif ("); fprintf(fd, "(%s->action && !strcmp(%s->action, \"%s\"))", soap, soap, catch_action); if (iflag) fprintf(fd, ")\n\t\treturn serve_%s(this);", ident(catch_method->sym->name)); else fprintf(fd, ")\n\t\treturn serve_%s(%s, this);", ident(catch_method->sym->name), soap); } fprintf(fd, "\n\treturn %s->error = SOAP_NO_METHOD;", soap); } fprintf(fd, "\n\treturn serve_%s(this);\n}", ident(catch_method->sym->name)); } else fprintf(fd, "\n\treturn %s->error = SOAP_NO_METHOD;\n}", soap); for (method = table->list; method; method = method->next) if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && !is_imported(method->info.typ) && has_ns_eq(ns->name, method->sym->name)) gen_serve_method(fd, table, method, name); if (namespaceid) fprintf(fd, "\n\n} // namespace %s\n", namespaceid); fprintf(fd, "\n/* End of server object code */\n"); } void gen_response_begin(FILE *fd, int n, const char *s) { if (!is_invisible(s)) { fprintf(fd, "%*s<%sResponse", n, "", s); if (soap_version < 0) gen_xmlns(fd); fprintf(fd, ">\n"); } } void gen_response_end(FILE *fd, int n, const char *s) { if (!is_invisible(s)) fprintf(fd, "%*s\n", n, "", s); } void gen_element_begin(FILE *fd, int n, const char *s, const char *t) { if (!is_invisible(s)) { if (tflag && t && *t) fprintf(fd, "%*s<%s xsi:type=\"%s\"", n, "", s, t); else fprintf(fd, "%*s<%s", n, "", s); } } void gen_element_end(FILE *fd, int n, const char *s) { if (!is_invisible(s)) fprintf(fd, "%*s\n", n, "", s); else fprintf(fd, "\n"); } void gen_data(const char *buf, Table *t, const char *ns, const char *encoding) { Entry *p, *q, *r; FILE *fd; const char *method_encoding = NULL; const char *method_response_encoding = NULL; if (t) { for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun && !(p->info.sto & Sextern) && has_ns_eq(ns, p->sym->name)) { int get = 0, soap = 1, mime = 0; Service *sp; Method *m; const char *nse = ns_qualifiedElement(p->info.typ); const char *nsa = ns_qualifiedAttribute(p->info.typ); method_encoding = encoding; method_response_encoding = NULL; for (sp = services; sp; sp = sp->next) { if (!tagcmp(sp->ns, ns)) { for (m = sp->list; m; m = m->next) { if (is_eq_nons(m->name, p->sym->name)) { if (m->mess == ENCODING) method_encoding = m->part; else if (m->mess == RESPONSE_ENCODING) method_response_encoding = m->part; else if (m->mess&MIMEIN && !strcmp(m->part, "application/x-www-form-urlencoded")) mime = 1; else if (m->mess == PROTOCOL) { if (strncmp(m->part, "SOAP", 4)) soap = 0; if (strstr(m->part, "GET")) get = 1; } } } } } if (!method_response_encoding) method_response_encoding = method_encoding; /* request */ if (!get && !mime) { fd = gen_env(buf, ns_remove(p->sym->name), 0, method_encoding, soap); if (!fd) return; q = entry(classtable, p->sym); if (yflag) { fprintf(fd, "%*s\n"); } gen_element_begin(fd, 2, ns_convert(p->sym->name), NULL); if (q) { if (!is_invisible(p->sym->name)) { if (soap && soap_version < 0) gen_xmlns(fd); gen_atts(fd, (Table*)q->info.typ->ref, nsa); fprintf(fd, "\n"); } for (q = ((Table*)q->info.typ->ref)->list; q; q = q->next) gen_field(fd, 3, q, nse, nsa, method_encoding); } gen_element_end(fd, 2, ns_convert(p->sym->name)); if (soap && soap_version >= 0) fprintf(fd, " \n\n"); fclose(fd); } /* response */ q = (Entry*)p->info.typ->ref; if (!mime && q && !is_transient(q->info.typ)) { fd = gen_env(buf, ns_remove(p->sym->name), 1, method_response_encoding, soap); if (!fd) return; if (q && !is_response(q->info.typ)) { if (is_XML((Tnode*)q->info.typ->ref)) { gen_response_begin(fd, 2, ns_convert(p->sym->name)); gen_response_end(fd, 2, ns_convert(p->sym->name)); } else { gen_response_begin(fd, 2, ns_convert(p->sym->name)); gen_field(fd, 3, q, nse, nsa, method_response_encoding); gen_response_end(fd, 2, ns_convert(p->sym->name)); } } else if (q && q->info.typ->ref && ((Tnode*)q->info.typ->ref)->ref) { const char *xtag; nse = ns_qualifiedElement((Tnode*)q->info.typ->ref); nsa = ns_qualifiedAttribute((Tnode*)q->info.typ->ref); if ((wflag && !is_unmatched(q->sym)) || has_ns_eq(NULL, q->sym->name)) /* to ensure element name of response can be unqualified */ xtag = q->sym->name; else xtag = ((Tnode*)q->info.typ->ref)->id->name; if (yflag) fprintf(fd, "%*s\n", 2, "", ident(p->sym->name), c_type_id(q->info.typ, q->sym->name)); gen_element_begin(fd, 2, ns_addx(xtag, nse), NULL); if (!is_invisible(xtag)) { if (soap && soap_version < 0) gen_xmlns(fd); gen_atts(fd, (Table*)((Tnode*)q->info.typ->ref)->ref, nsa); fprintf(fd, "\n"); } for (r = ((Table*)((Tnode*)q->info.typ->ref)->ref)->list; r; r = r->next) gen_field(fd, 3, r, nse, nsa, method_response_encoding); gen_element_end(fd, 2, ns_addx(xtag, nse)); } fflush(fd); if (soap && soap_version >= 0) fprintf(fd, " \n\n"); fclose(fd); } } } } } void gen_field(FILE *fd, int n, Entry *p, const char *nse, const char *nsa, const char *encoding) { Entry *q; char tmp[32]; LONG64 i; int d; if (!(p->info.sto & (Sattribute | Sconst | Sprivate | Sprotected)) && !is_transient(p->info.typ) && p->info.typ->type != Tfun && strncmp(p->sym->name, "__size", 6) && strncmp(p->sym->name, "__type", 6) && !is_choice(p)) { if (is_soap12(encoding) && (p->info.sto & Sreturn) && (nse || has_ns_eq(NULL, p->sym->name)) && !is_literal(encoding)) fprintf(fd, "%*s%s\n", n, "", rpcURI, ns_add(p, nse)); if (is_XML(p->info.typ)) { if (yflag) fprintf(fd, "%*s\n", n, "", c_type_id(p->info.typ, p->sym->name)); gen_element_begin(fd, n, ns_add(p, nse), NULL); if (!is_invisible(p->sym->name)) fprintf(fd, ">"); else fprintf(fd, "%*s\n", n, ""); gen_element_end(fd, n, ns_add(p, nse)); } else { if (n >= 8 && !is_string(p->info.typ) && p->info.minOccurs <= 0) { return; } else if (n >= 8 && p->info.typ->type == Tpointer && !is_string(p->info.typ)) { gen_element_begin(fd, n, ns_add(p, nse), NULL); fprintf(fd, " xsi:nil=\"true\"/>"); return; } else if (n >= 16) { fprintf(fd, "%*s\n", n, ""); return; } else if (is_external(p->info.typ) && p->info.typ->sym) { gen_element_begin(fd, n, ns_add(p, nse), xsi_type(p->info.typ)); fprintf(fd, ">"); if (!strcmp(p->info.typ->sym->name, "xsd__boolean")) fprintf(fd, "false"); else if (!strcmp(p->info.typ->sym->name, "xsd__date")) fprintf(fd, "1999-12-31"); else if (!strcmp(p->info.typ->sym->name, "xsd__dateTime")) { char tmp[256]; time_t t = time(NULL), *p = &t; strftime(tmp, 256, "%Y-%m-%dT%H:%M:%SZ", gmtime(p)); fprintf(fd, "%s", tmp); } else if (!strcmp(p->info.typ->sym->name, "xsd__duration")) fprintf(fd, "PT0S"); else if (!strcmp(p->info.typ->sym->name, "xsd__time")) fprintf(fd, "12:34:56.789Z"); fflush(fd); } else if (is_fixedstring(p->info.typ)) { if (yflag) fprintf(fd, "%*s\n", n, "", c_type_id(p->info.typ, p->sym->name)); gen_element_begin(fd, n, ns_add(p, nse), xsi_type(p->info.typ)); fprintf(fd, ">"); fflush(fd); if (p->info.hasval && p->info.val.s) fprintf(fd, "%s", xstring(p->info.val.s)); else gen_val(fd, n, p->info.typ, nse, nsa, encoding); } else if (p->info.typ->type == Tarray) { i = ((Tnode*) p->info.typ->ref)->width; if (i) { i = p->info.typ->width / i; if (i > 4) i = 2; } if (yflag) fprintf(fd, "%*s\n", n, "", c_type_id(p->info.typ, p->sym->name)); gen_element_begin(fd, n, ns_add(p, nse), "SOAP-ENC:Array"); if (is_soap12(encoding)) fprintf(fd, " SOAP-ENC:itemType=\"%s\" SOAP-ENC:arraySize=\"" SOAP_LONG_FORMAT "\"", xsi_type_Tarray(p->info.typ), i); else if (!is_literal(encoding)) fprintf(fd, " SOAP-ENC:arrayType=\"%s[" SOAP_LONG_FORMAT "]\"", xsi_type_Tarray(p->info.typ), i); fprintf(fd, ">"); fflush(fd); gen_val(fd, n, p->info.typ, nse, nsa, encoding); } else if ((q = is_dynamic_array(p->info.typ)) && !is_binary(p->info.typ)) { if (!eflag && (has_ns(p->info.typ) || is_untyped(p->info.typ))) { if (yflag) fprintf(fd, "%*s\n", n, "", c_type_id(p->info.typ, p->sym->name)); gen_element_begin(fd, n, ns_add(p, nse), xsi_type(p->info.typ)); gen_atts(fd, (Table*)p->info.typ->ref, nsa); } else { d = get_Darraydims(p->info.typ); if (d) { for (i = 0; i < d-1; i++) { if (is_soap12(encoding)) tmp[2*i] = ' '; else tmp[2*i] = ','; tmp[2*i+1] = '1'; } tmp[2*d-2] = '\0'; } else *tmp = '\0'; if (yflag) fprintf(fd, "%*s\n", n, "", c_type_id(p->info.typ, p->sym->name)); gen_element_begin(fd, n, ns_add(p, nse), "SOAP-ENC:Array"); if (q->info.minOccurs > 0) { if (is_soap12(encoding)) fprintf(fd, " SOAP-ENC:itemType=\"%s\" SOAP-ENC:arraySize=\"" SOAP_LONG_FORMAT "%s\"", wsdl_type(q->info.typ, ""), q->info.minOccurs, tmp); else if (!is_literal(encoding)) fprintf(fd, " SOAP-ENC:arrayType=\"%s[" SOAP_LONG_FORMAT "%s]\"", wsdl_type(q->info.typ, ""), q->info.minOccurs, tmp); fprintf(fd, ">"); } else { if (is_soap12(encoding)) fprintf(fd, " SOAP-ENC:itemType=\"%s\" SOAP-ENC:arraySize=\"1%s\"", wsdl_type(q->info.typ, ""), tmp); else if (!is_literal(encoding)) fprintf(fd, " SOAP-ENC:arrayType=\"%s[1%s]\"", wsdl_type(q->info.typ, ""), tmp); fprintf(fd, ">"); } } fflush(fd); gen_val(fd, n, p->info.typ, nse, nsa, encoding); } else if ((p->info.typ->type == Tpointer || p->info.typ->type == Treference || p->info.typ->type == Trvalueref) && is_dynamic_array((Tnode*)p->info.typ->ref) && !is_binary((Tnode*)p->info.typ->ref)) { if (!eflag && (has_ns((Tnode*)p->info.typ->ref) || is_untyped((Tnode*)p->info.typ->ref))) { if (yflag) fprintf(fd, "%*s\n", n, "", c_type_id(p->info.typ, p->sym->name)); gen_element_begin(fd, n, ns_add(p, nse), xsi_type((Tnode*)p->info.typ->ref)); gen_atts(fd, (Table*)((Tnode*)p->info.typ->ref)->ref, nsa); } else { d = get_Darraydims((Tnode*)p->info.typ->ref); if (d) { for (i = 0; i < d-1; i++) { tmp[2*i] = ','; tmp[2*i+1] = '1'; } tmp[2*d-2] = '\0'; } else *tmp = '\0'; if (yflag) fprintf(fd, "%*s\n", n, "", c_type_id(p->info.typ, p->sym->name)); gen_element_begin(fd, n, ns_add(p, nse), "SOAP-ENC:Array"); if (is_soap12(encoding)) { if ((((Tnode*)p->info.typ->ref)->type == Tstruct || ((Tnode*)p->info.typ->ref)->type == Tclass) && ((Table*)((Tnode*)p->info.typ->ref)->ref)->list->info.minOccurs > 0) fprintf(fd, " SOAP-ENC:itemType=\"%s\" SOAP-ENC:arraySize=\"[" SOAP_LONG_FORMAT "%s\"", wsdl_type(((Table*)((Tnode*)p->info.typ->ref)->ref)->list->info.typ, ""), ((Table*)((Tnode*)p->info.typ->ref)->ref)->list->info.minOccurs, tmp); else fprintf(fd, " SOAP-ENC:itemType=\"%s\" SOAP-ENC:arraySize=\"1%s\"", wsdl_type(((Table*)((Tnode*)p->info.typ->ref)->ref)->list->info.typ, ""), tmp); } else if (!is_literal(encoding)) { if ((((Tnode*)p->info.typ->ref)->type == Tstruct || ((Tnode*)p->info.typ->ref)->type == Tclass) && ((Table*)((Tnode*)p->info.typ->ref)->ref)->list->info.minOccurs > 0) fprintf(fd, " SOAP-ENC:arrayType=\"%s[" SOAP_LONG_FORMAT "%s]\"", wsdl_type(((Table*)((Tnode*)p->info.typ->ref)->ref)->list->info.typ, ""), ((Table*)((Tnode*)p->info.typ->ref)->ref)->list->info.minOccurs, tmp); else fprintf(fd, " SOAP-ENC:arrayType=\"%s[1%s]\"", wsdl_type(((Table*)((Tnode*)p->info.typ->ref)->ref)->list->info.typ, ""), tmp); } fprintf(fd, ">"); } fflush(fd); gen_val(fd, n, (Tnode*)p->info.typ->ref, nse, nsa, encoding); } else if (p->info.typ->type == Tstruct || p->info.typ->type == Tclass) { /* if (!is_primclass(p->info.typ)) { const char *nse1 = ns_qualifiedElement(p->info.typ); const char *nsa1 = ns_qualifiedAttribute(p->info.typ); if (nse1) nse = nse1; if (nsa1) nsa = nsa1; } */ if (!is_invisible(p->sym->name)) { if (yflag) fprintf(fd, "%*s\n", n, "", c_type_id(p->info.typ, p->sym->name)); gen_element_begin(fd, n, ns_add(p, nse), xsi_type_u(p->info.typ)); gen_atts(fd, (Table*)p->info.typ->ref, nsa); } else if (is_anyType(p->info.typ)) fprintf(fd, "%*s\n", n, ""); } else if ((p->info.typ->type == Tpointer || p->info.typ->type == Treference || p->info.typ->type == Trvalueref) && (((Tnode*)p->info.typ->ref)->type == Tstruct || ((Tnode*)p->info.typ->ref)->type == Tclass)) { /* if (!is_primclass(p->info.typ->ref)) { const char *nse1 = ns_qualifiedElement(p->info.typ->ref); const char *nsa1 = ns_qualifiedAttribute(p->info.typ->ref); if (nse1) nse = nse1; if (nsa1) nsa = nsa1; } */ if (!is_invisible(p->sym->name)) { if (yflag) fprintf(fd, "%*s\n", n, "", c_type_id(p->info.typ, p->sym->name)); gen_element_begin(fd, n, ns_add(p, nse), xsi_type_u(p->info.typ)); gen_atts(fd, (Table*)((Tnode*)p->info.typ->ref)->ref, nsa); } else if (is_anyType(p->info.typ)) fprintf(fd, "%*s\n", n, ""); } else if (p->info.typ->type != Tunion) { if (!is_invisible(p->sym->name)) { if (yflag) fprintf(fd, "%*s\n", n, "", c_type_id(p->info.typ, p->sym->name)); gen_element_begin(fd, n, ns_add(p, nse), xsi_type_u(p->info.typ)); if (p->info.typ->type == Ttemplate) { if (((Tnode*)p->info.typ->ref)->type == Tpointer && (((Tnode*)((Tnode*)p->info.typ->ref)->ref)->type == Tclass || ((Tnode*)((Tnode*)p->info.typ->ref)->ref)->type == Tstruct)) gen_atts(fd, (Table*)((Tnode*)((Tnode*)p->info.typ->ref)->ref)->ref, nsa); else if (((Tnode*)p->info.typ->ref)->type == Tclass || ((Tnode*)p->info.typ->ref)->type == Tstruct) gen_atts(fd, (Table*)((Tnode*)p->info.typ->ref)->ref, nsa); else fprintf(fd, ">"); } else fprintf(fd, ">"); } } if (!is_external(p->info.typ)) { switch (p->info.typ->type) { case Tchar: case Tshort: case Tint: case Tlong: case Tllong: case Tuchar: case Tushort: case Tuint: case Tulong: case Tullong: if (p->info.hasval) fprintf(fd, SOAP_LONG_FORMAT, p->info.val.i); else if (p->info.typ->hasmin) fprintf(fd, SOAP_LONG_FORMAT, (LONG64)p->info.typ->min + (p->info.typ->incmin == False)); else fprintf(fd, "0"); break; case Tfloat: case Tdouble: case Tldouble: if (p->info.hasval) fprintf(fd, "%g", p->info.val.r); else if (p->info.typ->hasmin && p->info.typ->min > 0) fprintf(fd, "%g", p->info.typ->min * (1 + (p->info.typ->incmin == False)/1000)); else if (p->info.typ->hasmax && p->info.typ->max > 0) fprintf(fd, "%g", p->info.typ->max * (1 - (p->info.typ->incmax == False)/1000)); else if (p->info.typ->hasmin && p->info.typ->min < 0) fprintf(fd, "%g", p->info.typ->min * (1 - (p->info.typ->incmin == False)/1000)); else if (p->info.typ->hasmax && p->info.typ->max < 0) fprintf(fd, "%g", p->info.typ->max * (1 + (p->info.typ->incmax == False)/1000)); else fprintf(fd, "0.0"); break; case Ttime: { char tmp[256]; time_t t = time(NULL), *p = &t; strftime(tmp, 256, "%Y-%m-%dT%H:%M:%SZ", gmtime(p)); fprintf(fd, "%s", tmp); } break; case Tenum: case Tenumsc: if (p->info.hasval && p->info.typ->ref) { for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next) { if (p->info.val.i == q->info.val.i) { fprintf(fd, "%s", ns_remove2(q->sym->name, c_ident(p->info.typ))); break; } } } else gen_val(fd, n+1, p->info.typ, nse, nsa, encoding); break; case Tpointer: case Treference: case Trvalueref: if (is_string(p->info.typ) || is_wstring(p->info.typ)) { if (p->info.hasval && p->info.val.s) fprintf(fd, "%s", xstring(p->info.val.s)); else gen_val(fd, n, p->info.typ, nse, nsa, encoding); } else gen_val(fd, n, (Tnode*)p->info.typ->ref, nse, nsa, encoding); break; case Tclass: if (is_stdstr(p->info.typ)) { if (p->info.hasval && p->info.val.s) fprintf(fd, "%s", xstring(p->info.val.s)); else gen_val(fd, n, p->info.typ, nse, nsa, encoding); break; } case Tstruct: if (!is_dynamic_array(p->info.typ)) gen_val(fd, n, p->info.typ, nse, nsa, encoding); break; case Tunion: gen_val(fd, n, p->info.typ, nse, nsa, encoding); break; case Ttemplate: i = p->info.maxOccurs; if (i <= 1 || i > 4) i = p->info.minOccurs; if (i < 1) i = 1; do { /* a bit of a hack, with a copy of the code above */ { gen_val(fd, n, p->info.typ, nse, nsa, encoding); if (i > 1) { gen_element_end(fd, 0, ns_add(p, nse)); if (!is_invisible(p->sym->name)) { if (yflag) fprintf(fd, "%*s\n", n, "", c_type_id(p->info.typ, p->sym->name)); gen_element_begin(fd, n, ns_add(p, nse), xsi_type_u(p->info.typ)); if (p->info.typ->type == Ttemplate) { if (((Tnode*)p->info.typ->ref)->type == Tpointer && (((Tnode*)((Tnode*)p->info.typ->ref)->ref)->type == Tclass || ((Tnode*)((Tnode*)p->info.typ->ref)->ref)->type == Tstruct)) gen_atts(fd, (Table*)((Tnode*)((Tnode*)p->info.typ->ref)->ref)->ref, nsa); else if (((Tnode*)p->info.typ->ref)->type == Tclass || ((Tnode*)p->info.typ->ref)->type == Tstruct) gen_atts(fd, (Table*)((Tnode*)p->info.typ->ref)->ref, nsa); else fprintf(fd, ">"); } else fprintf(fd, ">"); } } fflush(fd); } } while (--i); break; default: break; } } if (p->info.typ->type != Tunion) gen_element_end(fd, 0, ns_add(p, nse)); fflush(fd); } } } void gen_atts(FILE *fd, Table *t, const char *nsa) { static unsigned long idnum = 0; Entry *q, *r; Tnode *p; int i; for (; t; t = t->prev) { for (q = t->list; q; q = q->next) { if (q->info.sto & Sattribute && !is_invisible(q->sym->name) && q->info.maxOccurs != 0) { fprintf(fd, " %s=\"", ns_add(q, nsa)); if ((q->info.typ->type == Tpointer || q->info.typ->type == Treference || q->info.typ->type == Trvalueref || q->info.typ->type == Ttemplate) && !is_string(q->info.typ)) p = (Tnode*)q->info.typ->ref; else p = q->info.typ; if (is_eq(q->sym->name, "id")) fprintf(fd, "%lu", ++idnum); /* id="#" should be unique */ else if (is_external(p) && p->sym) { if (!strcmp(p->sym->name, "xsd__boolean")) fprintf(fd, "false"); else if (!strcmp(p->sym->name, "xsd__date")) fprintf(fd, "1999-12-31"); else if (!strcmp(p->sym->name, "xsd__dateTime")) { char tmp[256]; time_t t = time(NULL), *p = &t; strftime(tmp, 256, "%Y-%m-%dT%H:%M:%SZ", gmtime(p)); fprintf(fd, "%s", tmp); } else if (!strcmp(p->sym->name, "xsd__duration")) fprintf(fd, "PT0S"); else if (!strcmp(p->sym->name, "xsd__time")) fprintf(fd, "12:34:56.789Z"); fflush(fd); } else { switch (p->type) { case Tchar: case Tshort: case Tint: case Tuchar: case Tushort: case Tuint: case Tlong: case Tulong: case Tllong: case Tullong: if (q->info.hasval) fprintf(fd, SOAP_LONG_FORMAT, q->info.val.i); else if (q->info.typ->hasmin) fprintf(fd, SOAP_LONG_FORMAT, (LONG64)q->info.typ->min + (q->info.typ->incmin == False)); else fprintf(fd, "0"); break; case Tfloat: case Tdouble: case Tldouble: if (q->info.hasval) fprintf(fd, "%g", q->info.val.r); else if (q->info.typ->hasmin && q->info.typ->min > 0) fprintf(fd, "%g", q->info.typ->min * (1 + (q->info.typ->incmin == False)/1000)); else if (q->info.typ->hasmax && q->info.typ->max > 0) fprintf(fd, "%g", q->info.typ->max * (1 - (q->info.typ->incmax == False)/1000)); else if (q->info.typ->hasmin && q->info.typ->min < 0) fprintf(fd, "%g", q->info.typ->min * (1 - (q->info.typ->incmin == False)/1000)); else if (q->info.typ->hasmax && q->info.typ->max < 0) fprintf(fd, "%g", q->info.typ->max * (1 + (q->info.typ->incmax == False)/1000)); else fprintf(fd, "0.0"); break; case Ttime: { char tmp[256]; time_t T = time(NULL); strftime(tmp, 256, "%Y-%m-%dT%H:%M:%SZ", gmtime(&T)); fprintf(fd, "%s", tmp); } break; case Tenum: case Tenumsc: if (q->info.hasval && p->ref) { for (r = ((Table*)p->ref)->list; r; r = r->next) { if (r->info.val.i == q->info.val.i) { fprintf(fd, "%s", ns_remove2(r->sym->name, c_ident(p))); break; } } } else if (p->ref) fprintf(fd, "%s", ns_remove2((((Table*)p->ref)->list)->sym->name, c_ident(p))); else fprintf(fd, "0"); break; case Tpointer: case Treference: case Trvalueref: case Ttemplate: if (is_string(p) || is_wstring(p)) { if (q->info.hasval && q->info.val.s) fprintf(fd, "%s", xstring(q->info.val.s)); else if (p->min > 0 && p->min < 10000) for (i = 0; i < (int)p->min; i++) fprintf(fd, "X"); } else if (is_stdstr(p)) { if (p->min > 0 && p->min < 10000) for (i = 0; i < (int)p->min; i++) fprintf(fd, "X"); } break; case Tclass: if (is_stdstr(p)) { if (q->info.hasval && q->info.val.s) fprintf(fd, "%s", xstring(q->info.val.s)); else if (p->min > 0 && p->min < 10000) for (i = 0; i < (int)p->min; i++) fprintf(fd, "X"); } break; default: break; } } if (yflag) fprintf(fd, " // %s //", c_type_id(q->info.typ, q->sym->name)); fprintf(fd, "\""); } } } fprintf(fd, ">"); fflush(fd); } void gen_val(FILE *fd, int n, Tnode *p, const char *nse, const char *nsa, const char *encoding) { Entry *q; LONG64 i; if (!is_transient(p) && p->type != Tfun && !is_XML(p)) { if (is_fixedstring(p)) { for (i = 0; i < p->width / ((Tnode*)p->ref)->width - 1; i++) fprintf(fd, "X"); } else if (p->type == Tarray) { i = ((Tnode*) p->ref)->width; if (i) { i = p->width / i; if (i > 4) i = 2; fprintf(fd, "\n"); for (; i > 0; i--) { fprintf(fd, "%*s", n+1, ""); gen_val(fd, n+1, (Tnode*)p->ref, nse, nsa, encoding); fprintf(fd, "\n"); } fprintf(fd, "%*s", n, ""); } } else if ((q = is_dynamic_array(p))) { if (!is_binary(p)) { fprintf(fd, "\n"); fprintf(fd, "%*s<%s>", n+1, "", q->sym->name[5]?q->sym->name+5:"item"); gen_val(fd, n+1, q->info.typ, nse, nsa, encoding); fprintf(fd, "\n", q->sym->name[5]?q->sym->name+5:"item"); fprintf(fd, "%*s", n, ""); } } switch (p->type) { case Tchar: case Tshort: case Tint: case Tlong: case Tllong: case Tuchar: case Tushort: case Tuint: case Tulong: case Tullong: fprintf(fd, "0"); break; case Tfloat: case Tdouble: case Tldouble: fprintf(fd, "0.0"); break; case Ttime: { char tmp[256]; time_t T = time(NULL); strftime(tmp, 256, "%Y-%m-%dT%H:%M:%SZ", gmtime(&T)); fprintf(fd, "%s", tmp); } break; case Tenum: case Tenumsc: if (p->ref && (q = ((Table*)p->ref)->list)) fprintf(fd, "%s", ns_remove2(q->sym->name, c_ident(p))); else fprintf(fd, "0"); break; case Tpointer: case Treference: case Trvalueref: case Ttemplate: if (is_string(p) || is_wstring(p)) { if (p->min > 0 && p->min < 10000) for (i = 0; i < (int)p->min; i++) fprintf(fd, "X"); } else if (is_stdstr(p)) { if (p->min > 0 && p->min < 10000) for (i = 0; i < (int)p->min; i++) fprintf(fd, "X"); } else gen_val(fd, n, (Tnode*)p->ref, nse, nsa, encoding); break; case Tclass: case Tstruct: nse = ns_qualifiedElement(p); nsa = ns_qualifiedAttribute(p); if (is_stdstr(p)) { if (p->min > 0 && p->min < 10000) for (i = 0; i < (int)p->min; i++) fprintf(fd, "X"); } else if (is_primclass(p)) { Table *t; for (t = (Table*)p->ref; t; t = t->prev) { Entry *r = entry(classtable, t->sym); r = t->list; while (r && !is_item(r)) r = r->next; if (r) { gen_val(fd, n, r->info.typ, nse, nsa, encoding); return; } } } else if (!is_dynamic_array(p) && p->ref) { Table *t; fprintf(fd, "\n"); for (t = (Table*)p->ref; t; t = t->prev) { for (q = t->list; q; q = q->next) { if (is_repetition(q)) { i = q->info.maxOccurs; if (i <= 1 || i > 4) i = q->info.minOccurs; if (i <= 1) i = 2; do gen_field(fd, n+1, q->next, nse, nsa, encoding); while (--i); q = q->next; } else gen_field(fd, n+1, q, nse, nsa, encoding); } } fprintf(fd, "%*s", n, ""); } break; case Tunion: if (((Table*)p->ref)->list) gen_field(fd, n, ((Table*)p->ref)->list, nse, nsa, encoding); break; break; default: break; } } } void gen_header(FILE *fd, const char *method, int response, const char *encoding) { if (custom_header) { Service *sp; Method *m = NULL; Entry *q; Table *r; if (yflag) { if (cflag) fprintf(fd, " \n"); else fprintf(fd, " \n"); } fprintf(fd, " \n"); q = entry(classtable, lookup("SOAP_ENV__Header")); if (q) { r = (Table*)q->info.typ->ref; if (r) { for (q = r->list; q; q = q->next) { if (!is_transient(q->info.typ) && !(q->info.sto & Sattribute) && q->info.typ->type != Tfun) { for (sp = services; sp; sp = sp->next) for (m = sp->list; m; m = m->next) if (is_eq(m->name, method) && (!strcmp(m->part, q->sym->name) || is_eq_nons(m->part, q->sym->name)) && ((!response && (m->mess&HDRIN)) || (response && (m->mess&HDROUT)))) { gen_field(fd, 2, q, NULL, NULL, encoding); break; } } } fprintf(fd, " \n"); } } } } FILE * gen_env(const char *buf, const char *method, int response, const char *encoding, int soap) { char tmp[1024]; FILE *fd; strcpy(tmp, buf); if (!soap) strcat(tmp, "REST."); #ifdef __vms if (!response) { sprintf(strrchr(tmp, '.'), "_%s_req.xml", method); fprintf(fmsg, "Saving %s sample SOAP/XML request\n", tmp); } else { sprintf(strrchr(tmp, '.'), "_%s_res.xml", method); fprintf(fmsg, "Saving %s sample SOAP/XML response\n", tmp); } #else strcpy(strrchr(tmp, '.')+1, method); if (!response) { strcat(tmp, ".req.xml"); fprintf(fmsg, "Saving %s sample SOAP/XML request\n", tmp); } else { strcat(tmp, ".res.xml"); fprintf(fmsg, "Saving %s sample SOAP/XML response\n", tmp); } #endif fd = fopen(tmp, "w"); if (!fd) execerror("Cannot write XML file"); fprintf(fd, "\n"); if (soap && soap_version >= 0) { fprintf(fd, "\n"); gen_header(fd, method, response, encoding); fprintf(fd, " \n"); } return fd; } void gen_xmlns(FILE *fd) { Symbol *s; Service *sp = NULL; for (s = nslist; s; s = s->next) { for (sp = services; sp; sp = sp->next) if (!tagcmp(sp->ns, s->name) && sp->URI) break; if (sp) fprintf(fd, "\n xmlns:%s=\"%s\"", ns_convert(s->name), sp->URI); else if (!strcmp(s->name, "SOAP-ENV")) { if (soap_version >= 0) fprintf(fd, "\n xmlns:SOAP-ENV=\"%s\"", envURI); } else if (!strcmp(s->name, "SOAP-ENC")) { if (soap_version >= 0) fprintf(fd, "\n xmlns:SOAP-ENC=\"%s\"", encURI); } else if (!strcmp(s->name, "xsi")) fprintf(fd, "\n xmlns:xsi=\"%s\"", xsiURI); else if (!strcmp(s->name, "xsd")) fprintf(fd, "\n xmlns:xsd=\"%s\"", xsdURI); else fprintf(fd, "\n xmlns:%s=\"%s/%s.xsd\"", ns_convert(s->name), tmpURI, ns_convert(s->name)); } } char * emalloc(size_t n) { char *p; if ((p = (char*)malloc(n)) == NULL) execerror("out of memory"); return p; } void soap_serve(Table *table) { Entry *method, *catch_method = NULL; const char *catch_action = NULL; if (!Cflag) { fprintf(fserver, "\n\n"); if (!cflag && !namespaceid) fprintf(fserver, "extern \"C\" "); fprintf(fserver, "SOAP_FMAC5 int SOAP_FMAC6 %s_serve(struct soap *soap)", nflag?prefix:"soap"); fprintf(fserver, "\n{\n#ifndef WITH_FASTCGI\n\tunsigned int k = soap->max_keep_alive;\n#endif\n\tdo\n\t{"); fprintf(fserver, "\n#ifndef WITH_FASTCGI\n\t\tif (soap->max_keep_alive > 0 && !--k)\n\t\t\tsoap->keep_alive = 0;\n#endif"); fprintf(fserver, "\n\t\tif (soap_begin_serve(soap))\n\t\t{\tif (soap->error >= SOAP_STOP)\n\t\t\t\tcontinue;\n\t\t\treturn soap->error;\n\t\t}"); if (namespaceid) fprintf(fserver, "\n\t\tif (%s::%s_serve_request(soap) || (soap->fserveloop && soap->fserveloop(soap)))\n\t\t{\n#ifdef WITH_FASTCGI\n\t\t\tsoap_send_fault(soap);\n#else\n\t\t\treturn soap_send_fault(soap);\n#endif\n\t\t}", namespaceid, nflag?prefix:"soap"); else fprintf(fserver, "\n\t\tif (%s_serve_request(soap) || (soap->fserveloop && soap->fserveloop(soap)))\n\t\t{\n#ifdef WITH_FASTCGI\n\t\t\tsoap_send_fault(soap);\n#else\n\t\t\treturn soap_send_fault(soap);\n#endif\n\t\t}", nflag?prefix:"soap"); fprintf(fserver, "\n\n#ifdef WITH_FASTCGI\n\t\tsoap_destroy(soap);\n\t\tsoap_end(soap);\n\t} while (1);\n#else\n\t} while (soap->keep_alive);\n#endif"); fprintf(fserver, "\n\treturn SOAP_OK;"); fprintf(fserver, "\n}"); fprintf(fserver, "\n\n#ifndef WITH_NOSERVEREQUEST\n"); if (!cflag && !namespaceid) fprintf(fserver, "extern \"C\" "); fprintf(fserver, "SOAP_FMAC5 int SOAP_FMAC6 %s_serve_request(struct soap *soap)\n{", nflag?prefix:"soap"); if (sflag) fprintf(fserver, "\n\tsoap->mode |= SOAP_XML_STRICT;"); fprintf(fserver, "\n\tsoap_peek_element(soap);"); for (method = table->list; method; method = method->next) { const char *action = NULL; if (method->info.typ->type == Tfun && !(method->info.sto & Sextern)) { if (aflag) { Service *sp; for (sp = services; sp; sp = sp->next) { if (has_ns_eq(sp->ns, method->sym->name)) { Method *m; for (m = sp->list; m; m = m->next) { if (is_eq_nons(m->name, method->sym->name)) { if (m->mess == ACTION || m->mess == REQUEST_ACTION) action = m->part; } } } } } if (is_invisible(method->sym->name)) { Entry *param = entry(classtable, method->sym); if (param) param = ((Table*)param->info.typ->ref)->list; if (action) { if (*action == '"') { fprintf(fserver, "\n\tif ("); if (param && !Aflag) fprintf(fserver, "(soap->action == NULL && !soap_match_tag(soap, soap->tag, \"%s\")) || ", ns_convert(param->sym->name)); else { catch_method = method; catch_action = action; } fprintf(fserver, "(soap->action && !strcmp(soap->action, %s))", action); } else { fprintf(fserver, "\n\tif ("); if (param && !Aflag) fprintf(fserver, "(soap->action == NULL && !soap_match_tag(soap, soap->tag, \"%s\")) || ", ns_convert(param->sym->name)); else { catch_method = method; catch_action = action; } fprintf(fserver, "(soap->action && !strcmp(soap->action, \"%s\"))", action); } fprintf(fserver, ")\n\t\treturn soap_serve_%s(soap);", ident(method->sym->name)); } else { if (Aflag) compliancewarn("Option -A requires a SOAPAction where none is defined"); if (param) { fprintf(fserver, "\n\tif (!soap_match_tag(soap, soap->tag, \"%s\")", ns_convert(param->sym->name)); fprintf(fserver, ")\n\t\treturn soap_serve_%s(soap);", ident(method->sym->name)); } else { catch_method = method; catch_action = action; } } } else { if (action) { if (*action == '"') { fprintf(fserver, "\n\tif ("); if (!Aflag) fprintf(fserver, "(soap->action == NULL && !soap_match_tag(soap, soap->tag, \"%s\")) || ", ns_convert(method->sym->name)); fprintf(fserver, "(soap->action && !strcmp(soap->action, %s))", action); } else { fprintf(fserver, "\n\tif ("); if (!Aflag) fprintf(fserver, "(soap->action == NULL && !soap_match_tag(soap, soap->tag, \"%s\")) || ", ns_convert(method->sym->name)); fprintf(fserver, "(soap->action && !strcmp(soap->action, \"%s\"))", action); } } else { if (Aflag) compliancewarn("Option -A requires a SOAPAction where none is defined"); fprintf(fserver, "\n\tif (!soap_match_tag(soap, soap->tag, \"%s\")", ns_convert(method->sym->name)); } fprintf(fserver, ")\n\t\treturn soap_serve_%s(soap);", ident(method->sym->name)); } } } if (catch_method) { if (Aflag && catch_action) { if (*catch_action == '"') { fprintf(fserver, "\n\tif ("); fprintf(fserver, "(soap->action && !strcmp(soap->action, %s))", catch_action); fprintf(fserver, ")\n\t\treturn soap_serve_%s(soap);", ident(catch_method->sym->name)); } else { fprintf(fserver, "\n\tif ("); fprintf(fserver, "(soap->action && !strcmp(soap->action, \"%s\"))", catch_action); fprintf(fserver, ")\n\t\treturn soap_serve_%s(soap);", ident(catch_method->sym->name)); } fprintf(fserver, "\n\treturn soap->error = SOAP_NO_METHOD;"); } else fprintf(fserver, "\n\treturn soap_serve_%s(soap);", ident(catch_method->sym->name)); } else fprintf(fserver, "\n\treturn soap->error = SOAP_NO_METHOD;"); fprintf(fserver, "\n}\n#endif"); banner(fheader, "Server-Side Operations"); for (method = table->list; method; method = method->next) if (method->info.typ->type == Tfun && !(method->info.sto & Sextern)) generate_proto(table, method); banner(fheader, "Server-Side Skeletons to Invoke Service Operations"); fprintf(fheader, "\n"); if (!cflag && !namespaceid) fprintf(fheader, "extern \"C\" "); fprintf(fheader, "SOAP_FMAC5 int SOAP_FMAC6 %s_serve(struct soap*);", nflag?prefix:"soap"); fprintf(fheader, "\n\n"); if (!cflag && !namespaceid) fprintf(fheader, "extern \"C\" "); fprintf(fheader, "SOAP_FMAC5 int SOAP_FMAC6 %s_serve_request(struct soap*);", nflag?prefix:"soap"); for (method = table->list; method; method = method->next) if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && !is_imported(method->info.typ)) gen_serve_method(fserver, table, method, NULL); } if (!Sflag) { banner(fheader, "Client-Side Call Stubs"); for (method = table->list; method; method = method->next) if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && !is_imported(method->info.typ)) gen_call_method(fclient, method, NULL); } } void generate_proto(Table *table, Entry *param) { Entry *q, *pout; Table *output; q = entry(table, param->sym); if (q) pout = (Entry*)q->info.typ->ref; else { fprintf(stderr, "Internal error: no table entry\n"); return; } q = entry(classtable, param->sym); output = (Table*)q->info.typ->ref; fprintf(fheader, "\n\nSOAP_FMAC5 int SOAP_FMAC6 %s(struct soap*", ident(param->sym->name)); gen_params(fheader, output, pout, 1); fprintf(fheader, ";"); } int tagcmp(const char *s, const char *t) { size_t i, n; n = strlen(s); for (i = 0; i < n; i++) { int c = t[i]; if (c == '_' && s[i] != '_') c = '-'; if (s[i] > c) return 1; if (s[i] < c) return -1; } return -(t[i] != 0); } int tagncmp(const char *s, const char *t, size_t n) { size_t i; for (i = 0; i < n; i++) { int c = t[i]; if (c == '_' && s[i] != '_') c = '-'; if (s[i] > c) return 1; if (s[i] < c) return -1; } return 0; } int is_qname(Tnode *p) { if (p->sym && is_string(p) && (is_eq(p->sym->name, "xsd__QName") || is_eq(p->sym->name, "QName"))) return 1; return p->id && is_string(p) && (is_eq(p->id->name, "xsd__QName") || is_eq(p->id->name, "QName")); } int is_stdqname(Tnode *p) { if (p->sym && p->type == Tclass && is_volatile(p) && (is_eq(p->sym->name, "xsd__QName") || is_eq(p->sym->name, "QName"))) return 1; return p->id && p->type == Tclass && is_volatile(p) && (is_eq(p->id->name, "xsd__QName") || is_eq(p->id->name, "QName")); } int is_XML(Tnode *p) { if (is_synonym(p)) return (is_string(p) || is_wstring(p)) && is_eq(p->synonym->name, "XML"); return (p->sym && (is_string(p) || is_wstring(p)) && is_eq(p->sym->name, "XML")) || ((p->type == Tpointer || p->type == Treference || p->type == Trvalueref) && is_XML((Tnode*)p->ref)); } int is_stdXML(Tnode *p) { return p->sym && (is_stdstring(p) || is_stdwstring(p)) && is_eq(p->sym->name, "XML"); } int is_response(Tnode *p) { return (p->type == Tpointer || p->type == Treference || p->type == Trvalueref) && p->ref && has_ns((Tnode*)p->ref) && ((((Tnode*)p->ref)->type == Tstruct || ((Tnode*)p->ref)->type == Tclass) && !is_external((Tnode*)p->ref) && !is_primclass((Tnode*)p->ref) && !is_dynamic_array((Tnode*)p->ref) && !is_stdstring((Tnode*)p->ref) && !is_stdwstring((Tnode*)p->ref)); } Entry* get_response(Tnode *p) { if (p->type == Tfun) return p->response; return 0; } int is_unmatched(Symbol *sym) { return sym->name[0] == '_' && sym->name[1] != '_' && strncmp(sym->name, "_DOT", 4) && strncmp(sym->name, "_USCORE", 7) && (strncmp(sym->name, "_x", 2) || !isxdigit(sym->name[2]) || !isxdigit(sym->name[3]) || !isxdigit(sym->name[4]) || !isxdigit(sym->name[5])); } int is_invisible(const char *name) { return name[0] == '-' || (name[0] == '_' && name[1] == '_' && strncmp(name, "__ptr", 5)); } int is_invisible_empty(Tnode *p) { if (p->type == Tstruct || p->type == Tclass) if (is_invisible(p->id->name)) if (!p->ref || !((Table*)p->ref)->list) return 1; return 0; } int is_element(Tnode *typ) { if (is_XML(typ) || is_stdXML(typ) || is_qname(typ) || is_stdqname(typ)) return 0; if (typ->sym) return is_unmatched(typ->sym); if (typ->type == Tstruct || typ->type == Tclass) return is_unmatched(typ->id); return 0; } int is_untyped(Tnode *typ) { Tnode *p; if (typ->sym) return is_unmatched(typ->sym); if (typ->type == Tpointer || typ->type == Treference || typ->type == Trvalueref || typ->type == Tarray) return is_untyped((Tnode*)typ->ref); if (typ->type == Tstruct || typ->type == Tclass) { if (is_dynamic_array(typ) && !has_ns(typ) && !is_binary(typ)) { p = (Tnode*)((Table*)typ->ref)->list->info.typ->ref; return is_untyped(p); } else return is_unmatched(typ->id); } return 0; } int is_primclass(Tnode *typ) { Table *t; if (typ->type == Tstruct || typ->type == Tclass) { if (!is_dynamic_array(typ)) { t = (Table*)typ->ref; while (t) { Entry *p = t->list; while (p && !is_item(p)) p = p->next; if (p) break; t = t->prev; } if (!t) return 0; t = (Table*)typ->ref; while (t) { Entry *p; for (p = t->list; p; p = p->next) if (!is_item(p) && p->info.typ->type != Tfun && !is_transient(p->info.typ) && p->info.sto != Sattribute && p->info.sto != Sprivate && p->info.sto != Sprotected) return 0; t = t->prev; } return 1; } } else if (typ->type == Tpointer || typ->type == Treference || typ->type == Trvalueref) return is_primclass((Tnode*)typ->ref); return 0; } int is_mask(Tnode *typ) { return ((typ->type == Tenum || typ->type == Tenumsc) && typ->width == 9); } int is_void(Tnode *typ) { if (!typ) return 1; if (typ->type == Tvoid) return 1; if (typ->type == Tpointer || typ->type == Treference || typ->type == Trvalueref || typ->type == Tarray || typ->type == Ttemplate) return is_void((Tnode*)typ->ref); return 0; } int is_transient(Tnode *typ) { if (!typ) return 1; if (typ->type == Tstruct && typ->id == lookup("soap")) return 1; if (is_external(typ) || is_volatile(typ)) return 0; if (typ->transient > 0) return 1; if (is_wstring(typ)) /* wchar_t* is serializable but wchar_t is transient */ return 0; switch (typ->type) { case Tpointer: case Treference: case Trvalueref: case Tarray: case Ttemplate: return is_transient((Tnode*)typ->ref); case Tnone: case Tvoid: case Twchar: /* wchar_t is transient */ case Tsize: /* size_t is transient */ return 1; default: break; } return 0; } int is_imported(Tnode* typ) { return typ->imported != NULL; } int is_external(Tnode* typ) { return typ->transient == -1 || typ->transient == -3; } int is_anyType(Tnode* typ) { if (!typ) return 0; if (typ->type == Tpointer || typ->type == Ttemplate) return is_anyType((Tnode*)typ->ref); return is_external(typ) && typ->type == Tstruct && !strcmp(typ->id->name, "soap_dom_element"); } int is_anyAttribute(Tnode* typ) { if (!typ) return 0; if (typ->type == Tpointer || typ->type == Ttemplate) return is_anyAttribute((Tnode*)typ->ref); return is_external(typ) && typ->type == Tstruct && !strcmp(typ->id->name, "soap_dom_attribute"); } int is_volatile(Tnode* typ) { return typ->transient == -2 || typ->transient == -3; } int is_smart(Tnode *p) { return p->type == Ttemplate && p->ref && is_volatile(p); } int is_smart_shared(Tnode *p) { if (is_smart(p)) { const char *s = strstr(p->id->name, "::"); if (s) return !strcmp(s, "::shared_ptr"); /* support shared_ptr STL and Boost */ } return 0; } const char * make_shared(Tnode *p) { const char *s = ""; /* should produce make_shared only if is_smart_shared(p) is true */ if (is_smart_shared(p)) { char *t; s = strstr(p->id->name, "::"); t = emalloc(s - p->id->name + 14); strncpy(t, p->id->name, s - p->id->name + 2); strcat(t, "make_shared"); s = t; } return s; } int is_container(Tnode *p) { if (p->type == Tpointer) return is_container((Tnode*)p->ref); return p->type == Ttemplate && !is_smart(p); } int is_template(Tnode *p) { if (p->type == Tpointer) return is_template((Tnode*)p->ref); return p->type == Ttemplate; } int is_repetition(Entry *p) { if (p) return p->next && p->next->info.typ->type == Tpointer && ((Tnode*)p->next->info.typ->ref)->type != Tvoid && (p->info.typ->type == Tint || p->info.typ->type == Tsize) && ((p->info.sto & Sspecial) || !strncmp(p->sym->name, "__size", 6)); return 0; } int is_item(Entry *p) { if (p) return !strcmp(p->sym->name, "__item"); return 0; } int is_self(Entry *p) { if (p) return !strcmp(p->sym->name, "__self"); return 0; } int is_choice(Entry *p) { if (p) if (p->next && p->next->info.typ->type == Tunion && p->info.typ->type == Tint && ((p->info.sto & Sspecial) || !strncmp(p->sym->name, "__union", 7))) return 1; return 0; } int required_choice(Tnode *typ) { if (typ->type == Tunion) { Entry *p; for (p = ((Table*)typ->ref)->list; p; p = p->next) { if (!(p->info.sto & (Sconst | Sprivate | Sprotected)) && !is_transient(p->info.typ) && (!(p->info.sto & Sattribute)) && !is_repetition(p) && !is_anytype(p)) { if (p->info.minOccurs <= 0) return 0; } } } return -1; } int is_sequence(Entry *p) { if (p) { Tnode *q = p->info.typ; if (q->type == Tpointer) q = (Tnode*)q->ref; if (q->type == Tstruct && is_invisible(p->sym->name) && is_invisible(q->id->name) && !is_transient(q)) return 1; } return 0; } int is_anytype(Entry *p) { if (p) { if (p->next && p->next->info.typ->type == Tpointer && ((Tnode*)p->next->info.typ->ref)->type == Tvoid && p->info.typ->type == Tint && ((p->info.sto & Sspecial) || !strncmp(p->sym->name, "__type", 6))) { is_anytype_flag = 1; return 1; } } return 0; } int is_keyword(const char *name) { Symbol *s = lookup(name); if (s) return s->token != ID; return 0; } int has_ptr(Tnode *typ) { Tnode *p; if (typ->type == Tpointer || typ->type == Treference || typ->type == Trvalueref) return 0; for (p = Tptr[Tpointer]; p; p = p->next) if ((Tnode*)p->ref == typ && p->transient != 1) return 1; return 0; } int has_detail_string(void) { Entry *p = entry(classtable, lookup("SOAP_ENV__Fault")); if (p && p->info.typ->ref && (p->info.typ->type == Tstruct || p->info.typ->type == Tclass)) { Entry *e = entry((Table*)p->info.typ->ref, lookup("detail")); if (e && e->info.typ->ref && e->info.typ->type == Tpointer && ((Tnode*)e->info.typ->ref)->type == Tstruct) { Entry *e2 = entry((Table*)((Tnode*)e->info.typ->ref)->ref, lookup("__any")); return e2 && is_string(e2->info.typ); } } return 0; } int has_Detail_string(void) { Entry *p = entry(classtable, lookup("SOAP_ENV__Fault")); if (p && p->info.typ->ref && (p->info.typ->type == Tstruct || p->info.typ->type == Tclass)) { Entry *e = entry((Table*)p->info.typ->ref, lookup("SOAP_ENV__Detail")); if (e && e->info.typ->ref && e->info.typ->type == Tpointer && ((Tnode*)e->info.typ->ref)->type == Tstruct) { Entry *e2 = entry((Table*)((Tnode*)e->info.typ->ref)->ref, lookup("__any")); return e2 && is_string(e2->info.typ); } } return 0; } int has_class(Tnode *typ) { Entry *p; if (!cflag && typ->type == Tstruct && typ->ref) { for (p = ((Table*)typ->ref)->list; p; p = p->next) { if (p->info.sto & Stypedef) continue; if (p->info.typ->type == Tclass || p->info.typ->type == Ttemplate) return 1; if (p->info.typ->type == Tstruct && has_class(p->info.typ)) return 1; } } return 0; } int has_external(Tnode *typ) { Entry *p; if ((typ->type == Tstruct || typ->type == Tclass) && typ->ref) { for (p = ((Table*)typ->ref)->list; p; p = p->next) { if (p->info.typ->type == Tstruct || p->info.typ->type == Tclass) { if (is_external(p->info.typ) || has_external(p->info.typ)) return 1; } } } return 0; } int has_volatile(Tnode *typ) { Entry *p; if ((typ->type == Tstruct || typ->type == Tclass) && typ->ref) { for (p = ((Table*)typ->ref)->list; p; p = p->next) { if (p->info.typ->type == Tstruct || p->info.typ->type == Tclass) { if (is_volatile(p->info.typ) || has_volatile(p->info.typ)) if (!is_stdstr(p->info.typ)) return 1; } } } return 0; } int has_ns(Tnode *typ) { if (typ->type == Tstruct || typ->type == Tclass || typ->type == Tenum || typ->type == Tenumsc) return has_ns_eq(NULL, typ->id->name); return 0; } int has_ns_t(Tnode *typ) { if (typ->sym) return has_ns_eq(NULL, typ->sym->name); return has_ns(typ); } /* needs_lang adds xml:lang attribute to matching struct/class member name we should use an annotation for soapcpp2's input this in the future instead of a hard-coded member name */ void needs_lang(Entry *e) { if (!strcmp(e->sym->name, "SOAP_ENV__Text")) fprintf(fout, "\n\tif (soap->lang)\n\t\tsoap_set_attr(soap, \"xml:lang\", soap->lang, 1);"); } int is_eq_nons(const char *s, const char *t) { size_t n, m; const char *r; while (*s == '_' || *s == ':') s++; while (*t == '_' || *t == ':') t++; if (!*s || !*t) return 0; r = strstr(t, "__"); if (r) t = r + 2; n = strlen(s) - 1; m = strlen(t) - 1; #ifdef SOAP_OLD_DIRECTIVE_NAME_MATCHING while (n > 0 && s[n] == '_') n--; while (m > 0 && t[m] == '_') m--; #endif if (n != m) return 0; return !strncmp(s, t, n + 1); } int is_eq(const char *s, const char *t) { size_t n, m; while (*s == '_' || *s == ':') s++; while (*t == '_' || *t == ':') t++; if (!*s || !*t) return 0; for (n = strlen(s) - 1; n && s[n] == '_'; n--) ; for (m = strlen(t) - 1; m && t[m] == '_'; m--) ; if (n != m) return 0; return !strncmp(s, t, n + 1); } int has_ns_eq(const char *ns, const char *s) { size_t n; while (*s == '_' || *s == ':') s++; if (!ns) { const char *t = strstr(s + 1, "__"); if (!t || (t[2] == 'x' && isxdigit(t[3]) && isxdigit(t[4]) && isxdigit(t[5]) && isxdigit(t[6])) || !strncmp(t+2, "DOT", 3) || !strncmp(t+2, "USCORE", 6)) { t = strchr(s, ':'); if (t && t[1] == ':') t = NULL; } return t && t[1] && t[2] && t[2] != '_'; } if ((n = strlen(ns)) < strlen(s)) return ((s[n] == '_' && s[n+1] == '_') || (s[n] == ':' && s[n+1] != ':')) && !tagncmp(ns, s, n); return 0; } const char * strict_check(void) { if (sflag) return ""; return "(soap->mode & SOAP_XML_STRICT) && "; } const char * ns_of(const char *name) { Service *sp; for (sp = services; sp; sp = sp->next) if (has_ns_eq(sp->ns, name)) break; if (sp) return sp->URI; return NULL; } int eq_ns(const char *s, const char *t) { return ns_of(s) == ns_of(t); } const char * prefix_of(const char *s) { const char *t; while (*s == '_' || *s == ':') s++; t = strstr(s + 1, "__"); if (!t) { t = strchr(s, ':'); if (t && t[1] == ':') t = NULL; } if (t && t[1] && t[2] && t[2] != '_') { char *r = (char*)emalloc(t - s + 1); strncpy(r, s, t - s); r[t - s] = '\0'; return r; } return s; } const char * ns_add_overridden(Table *t, Entry *p, const char *ns) { Entry *q; Symbol *s = t->sym; if (s) { do { for (q = t->list; q; q = q->next) if (!strcmp(q->sym->name, p->sym->name)) return ns_add(p, ns ? prefix_of(t->sym->name) : NULL); } while ((t = t->prev) != NULL); } return ns_add(p, ns); } const char * c_ident(Tnode *typ) { if (typ->sym && strcmp(typ->sym->name, "/*?*/")) return res_remove(typ->sym->name); return t_ident(typ); } const char * soap_type(Tnode *typ) { const char *t = c_ident(typ); char *s; if (namespaceid && (Qflag || !is_external(typ))) { s = (char*)emalloc(strlen(t) + strlen(namespaceid) + 12); strcpy(s, "SOAP_TYPE_"); strcat(s, namespaceid); strcat(s, "_"); } else { s = (char*)emalloc(strlen(t) + 11); strcpy(s, "SOAP_TYPE_"); } strcat(s, t); return s; } const char * soap_union_member(Tnode *typ, Entry *p) { const char *t = c_ident(typ); const char *n = ident(p->sym->name); char *s; if (namespaceid) { s = (char*)emalloc(strlen(t) + strlen(n) + strlen(namespaceid) + 14); strcpy(s, "SOAP_UNION_"); strcat(s, namespaceid); strcat(s, "_"); } else { s = (char*)emalloc(strlen(t) + strlen(n) + 13); strcpy(s, "SOAP_UNION_"); } strcat(s, t); strcat(s, "_"); strcat(s, n); return s; } const char * ident(const char *name) { if (name) { const char *s = strrchr(name, ':'); if (s && *(s+1) && (s == name || *(s-1) != ':')) return s+1; } return name; } /*t_ident gives the base type name (e.g. when typedef'ed) of a type in identifier format*/ const char * t_ident(Tnode *typ) { char *p; const char *q; if (typ->extsym) return ident(typ->extsym->name); if (typ->synonym) return ident(typ->synonym->name); switch(typ->type) { case Tnone: return ""; case Tvoid: return "void"; case Tchar: return "byte"; case Twchar: return "wchar"; case Tshort: return "short"; case Tint: return "int"; case Tlong: return "long"; case Tllong: return "LONG64"; case Tfloat: return "float"; case Tdouble: return "double"; case Tldouble: return "decimal"; case Tuchar: return "unsignedByte"; case Tushort: return "unsignedShort"; case Tuint: return "unsignedInt"; case Tulong: return "unsignedLong"; case Tullong: return "ULONG64"; case Tsize: return "size_t"; case Ttime: return "dateTime"; case Tstruct: case Tclass: case Tunion: case Tenum: if (is_bool(typ)) return "bool"; case Tenumsc: return res_remove(typ->id->name); case Treference: case Trvalueref: return c_ident((Tnode*)typ->ref); case Tpointer: if (is_string(typ)) return "string"; if (is_wstring(typ)) return "wstring"; p = (char*)emalloc((10+strlen(q = c_ident((Tnode*)typ->ref))) * sizeof(char)); strcpy(p, "PointerTo"); strcat(p, q); return p; case Tarray: p = (char*)emalloc((16+strlen(c_ident((Tnode*)typ->ref))) * sizeof(char)); if (((Tnode*)typ->ref)->width) sprintf(p, "Array%dOf%s", typ->width / ((Tnode*) typ->ref)->width, c_ident((Tnode*)typ->ref)); else sprintf(p, "ArrayOf%s", c_ident((Tnode*)typ->ref)); return p; case Ttemplate: if (typ->ref) { p = (char*)emalloc((11+strlen(res_remove(typ->id->name))+strlen(q = c_ident((Tnode*)typ->ref))) * sizeof(char)); strcpy(p, res_remove(typ->id->name)); strcat(p, "TemplateOf"); strcat(p, q); return p; } case Tfun: return "Function"; } return "anyType"; } void utf8(char **t, long c) { if (c < 0x0080) *(*t)++ = (char)c; else { if (c < 0x0800) *(*t)++ = (char)(0xC0 | ((c >> 6) & 0x1F)); else { if (c < 0x010000) *(*t)++ = (char)(0xE0 | ((c >> 12) & 0x0F)); else { if (c < 0x200000) *(*t)++ = (char)(0xF0 | ((c >> 18) & 0x07)); else { if (c < 0x04000000) *(*t)++ = (char)(0xF8 | ((c >> 24) & 0x03)); else { *(*t)++ = (char)(0xFC | ((c >> 30) & 0x01)); *(*t)++ = (char)(0x80 | ((c >> 24) & 0x3F)); } *(*t)++ = (char)(0x80 | ((c >> 18) & 0x3F)); } *(*t)++ = (char)(0x80 | ((c >> 12) & 0x3F)); } *(*t)++ = (char)(0x80 | ((c >> 6) & 0x3F)); } *(*t)++ = (char)(0x80 | (c & 0x3F)); } *(*t) = '\0'; } const char * ns_convert(const char *tag) { const char *t; char *s; size_t i, n; if (*tag == '_') { if (!strncmp(tag, "__ptr", 5)) { if (tag[5]) tag += 5; else tag = "item"; } else if (strncmp(tag, "_DOT", 4) && strncmp(tag, "_USCORE", 7) && (strncmp(tag, "_x", 2) || !isxdigit(tag[2]) || !isxdigit(tag[3]) || !isxdigit(tag[4]) || !isxdigit(tag[5]))) tag++; /* skip leading _ */ } for (n = strlen(tag); n > 0; n--) { if (tag[n-1] != '_') break; } t = s = (char*)emalloc(n+1); for (i = 0; i < n; i++) { if (tag[i] == '_') { if (tag[i+1] == '_' && !(tag[i+2] == 'x' && isxdigit(tag[i+3]) && isxdigit(tag[i+4]) && isxdigit(tag[i+5]) && isxdigit(tag[i+6]))) break; else if (!strncmp(tag+i, "_DOT", 4)) { *s++ = '.'; i += 3; } else if (!strncmp(tag+i, "_USCORE", 7)) { *s++ = '_'; i += 6; } else if (!strncmp(tag+i, "_x", 2) && isxdigit(tag[i+2]) && isxdigit(tag[i+3]) && isxdigit(tag[i+4]) && isxdigit(tag[i+5])) { char d[5]; strncpy(d, tag+i+2, 4); d[4] = '\0'; utf8(&s, strtoul(d, NULL, 16)); i += 5; } else *s++ = '-'; } else if (!strncmp(tag+i, "\\u", 2) && isxdigit(tag[i+2]) && isxdigit(tag[i+3]) && isxdigit(tag[i+4]) && isxdigit(tag[i+5])) { char d[5]; strncpy(d, tag+i+2, 4); d[4] = '\0'; utf8(&s, strtoul(d, NULL, 16)); i += 5; } else if (tag[i] == ':' && tag[i+1] == ':') break; else *s++ = tag[i]; } if (i < n) { *s++ = ':'; for (i += 2; i < n; i++) { if (tag[i] == '_') { if (!strncmp(tag+i, "_DOT", 4)) { *s++ = '.'; i += 3; } else if (!strncmp(tag+i, "_USCORE", 7)) { *s++ = '_'; i += 6; } else if (!strncmp(tag+i, "_x", 2) && isxdigit(tag[i+2]) && isxdigit(tag[i+3]) && isxdigit(tag[i+4]) && isxdigit(tag[i+5])) { char d[5]; strncpy(d, tag+i+2, 4); d[4] = '\0'; utf8(&s, strtoul(d, NULL, 16)); i += 5; } else *s++ = '-'; } else if (!strncmp(tag+i, "\\u", 2) && isxdigit(tag[i+2]) && isxdigit(tag[i+3]) && isxdigit(tag[i+4]) && isxdigit(tag[i+5])) { char d[5]; strncpy(d, tag+i+2, 4); d[4] = '\0'; utf8(&s, strtoul(d, NULL, 16)); i += 5; } else *s++ = tag[i]; } } *s = '\0'; return t; } const char * res_remove(const char *tag) { char *s; const char *t; if (!(t = strchr(tag, ':'))) return tag; if (t[1] != ':') tag = t + 1; if (!strchr(tag, ':')) return tag; s = (char*)emalloc(strlen(tag) + 1); t = strcpy(s, tag); while ((s = strchr(s, ':'))) *s = '_'; return t; } const char * ns_qualifiedElement(Tnode *typ) { Service *sp; const char *s = NULL; if (typ->sym) s = prefix_of(typ->sym->name); if (!s && typ->id) s = prefix_of(typ->id->name); if (!s) return NULL; for (sp = services; sp; sp = sp->next) { if (sp->elementForm && !tagcmp(sp->ns, s)) { if (!strcmp(sp->elementForm, "qualified")) return s; return NULL; } } for (sp = services; sp; sp = sp->next) if (!tagcmp(sp->ns, s)) if (sp->style && !strcmp(sp->style, "document")) return s; return NULL; } const char * ns_qualifiedAttribute(Tnode *typ) { Service *sp; const char *s = NULL; if (typ->sym) s = prefix_of(typ->sym->name); if (!s && typ->id) s = prefix_of(typ->id->name); if (!s) return NULL; for (sp = services; sp; sp = sp->next) { if (sp->attributeForm && !tagcmp(sp->ns, s)) { if (!strcmp(sp->attributeForm, "qualified")) return s; return NULL; } } return NULL; } const char * field(Entry *p, const char *ns) { const char *r; char *s; if (is_self(p)) return "tag"; r = ns_add(p, ns); s = (char*)emalloc(strlen(r) + 3); strcpy(s, "\""); strcat(s, r); strcat(s, "\""); return s; } const char * field_overridden(Table *t, Entry *p, const char *ns) { const char *r; char *s; if (is_self(p)) return "tag"; r = ns_add_overridden(t, p, ns); s = (char*)emalloc(strlen(r) + 3); strcpy(s, "\""); strcat(s, r); strcat(s, "\""); return s; } const char * ns_add(Entry *p, const char *ns) { if (p->tag) return ns_addx(p->tag, ns); return ns_addx(p->sym->name, ns); } const char * ns_addx(const char *tag, const char *ns) { const char *n; char *t; const char *s = ns_convert(tag); if (*s == ':') return s+1; if (!ns || *s == '-' || strchr(s, ':')) return s; n = ns_convert(ns); t = (char*)emalloc(strlen(n) + strlen(s) + 2); strcpy(t, n); strcat(t, ":"); strcat(t, s); return t; } const char * ns_name(const char *tag) { const char *t, *r, *s = tag; if (*s) { for (r = s+strlen(s)-1; r > s; r--) if (*r != '_') break; for (t = s + 1; t < r; t++) { if (t[0] == '_' && t[1] == '_') { s = t + 2; t++; } else if (t[0] == ':' && t[1] != ':') { s = t + 1; t++; } } } return s; } const char * ns_cname(const char *tag, const char *suffix) { char *s; const char *t; size_t i, n; if (!tag) return NULL; t = ns_name(tag); n = strlen(t); if (suffix) s = (char*)emalloc(n + strlen(suffix) + 2); else s = (char*)emalloc(n + 2); for (i = 0; i < n; i++) { if (!isalnum(t[i])) s[i] = '_'; else s[i] = t[i]; } s[i] = '\0'; if (suffix) strcat(s, suffix); if (is_keyword(t)) strcat(s, "_"); return s; } const char * ns_fname(const char *tag) { char *s; size_t i; s = (char*)emalloc(strlen(tag) + 1); strcpy(s, tag); for (i = 0; s[i]; i++) if (!isalnum(s[i])) s[i] = '_'; return s; } const char * ns_remove(const char *tag) { return ns_convert(ns_name(tag)); } const char * ns_remove1(const char *tag) { const char *t, *s = tag; int n = 2; if (*s) { for (t = s + 1; *t && n; t++) if (t[0] == '_' && t[1] == '_') { s = t + 2; t++; n--; } if (n || (s[0] == '_' && s[1] != 'x' && strncmp(s, "_USCORE", 7)) || !*s) s = tag; } return s; } const char * ns_remove2(const char *tag, const char *type) { size_t n; if (tag && type && !strncmp(tag, type, n = strlen(type)) && strlen(tag) > n + 2) return ns_convert(tag + n + 2); return ns_convert(tag); } const char * xsi_type_cond(Tnode *typ, int flag) { if (flag) return xsi_type(typ); return ""; } const char * xsi_type_cond_u(Tnode *typ, int flag) { if (flag) return xsi_type_u(typ); return ""; } const char * xsi_type_u(Tnode *typ) { Service *sp; const char *s = NULL; if (tflag) return xsi_type(typ); if (typ->sym) s = prefix_of(typ->sym->name); if (!s && typ->id) s = prefix_of(typ->id->name); if (!s) return ""; s = xsi_type(typ); for (sp = services; sp; sp = sp->next) if (sp->xsi_type && has_ns_eq(sp->ns, s)) return s; return ""; } const char * xsi_type(Tnode *typ) { if (!typ) return "NULL"; if (is_dynamic_array(typ) && !has_ns(typ) && !is_binary(typ)) return xsi_type_Darray(typ); if (typ->type == Tarray) return xsi_type_Tarray(typ); if (is_untyped(typ)) return ""; if (typ->sym) { if (!strncmp(typ->sym->name, "SOAP_ENV__", 10)) return ""; if (is_XML(typ)) return "xsd:anyType"; if (typ->type != Ttemplate) return ns_convert(typ->sym->name); } if (is_string(typ) || is_wstring(typ) || is_stdstring(typ) || is_stdwstring(typ)) return "xsd:string"; switch(typ->type) { case Tvoid: return "xsd:anyType"; case Tchar: return "xsd:byte"; case Twchar: return "wchar"; case Tshort: return "xsd:short"; case Tint: return "xsd:int"; case Tlong: case Tllong: return "xsd:long"; case Tfloat: return "xsd:float"; case Tdouble: return "xsd:double"; case Tldouble: return "xsd:decimal"; case Tuchar: return "xsd:unsignedByte"; case Tushort: return "xsd:unsignedShort"; case Tuint: return "xsd:unsignedInt"; case Tulong: case Tullong: return "xsd:unsignedLong"; case Ttime: return "xsd:dateTime"; case Tpointer: case Treference: case Trvalueref: return xsi_type((Tnode*)typ->ref); case Tenum: if (is_bool(typ)) return "xsd:boolean"; case Tenumsc: case Tstruct: case Tclass: if (!strncmp(typ->id->name, "SOAP_ENV__", 10)) return ""; return ns_convert(typ->id->name); case Ttemplate: if ((Tnode*)typ->ref) return xsi_type((Tnode*)typ->ref); break; default: break; } return ""; } const char * xml_tag(Tnode *typ) { if (!typ) return "NULL"; if ((typ->type == Tpointer && !is_string(typ) && !is_wstring(typ)) || typ->type == Treference || typ->type == Trvalueref) return xml_tag((Tnode*)typ->ref); if (typ->sym) return ns_convert(typ->sym->name); return the_type(typ); } const char * wsdl_type(Tnode *typ, const char *ns) { if (!typ) return "NULL"; if ((is_qname(typ) || is_stdqname(typ)) && ns) return "xsd:QName"; if (typ->sym) { if (is_XML(typ)) return "xsd:anyType"; else if (ns) return ns_convert(typ->sym->name); else return ns_remove(typ->sym->name); } return base_type(typ, ns); } const char * base_type(Tnode *typ, const char *ns) { int d; const char *s; char *t; if (is_string(typ) || is_wstring(typ) || is_stdstring(typ) || is_stdwstring(typ) || is_fixedstring(typ)) { if (ns) return "xsd:string"; return "string"; } if (is_dynamic_array(typ) && !is_binary(typ) && !has_ns(typ) && !is_untyped(typ)) { s = ns_remove(wsdl_type(((Table*)typ->ref)->list->info.typ, NULL)); if (ns && *ns) { t = (char*)emalloc(strlen(s)+strlen(ns_convert(ns))+13); strcpy(t, ns_convert(ns)); strcat(t, ":"); strcat(t, "ArrayOf"); } else { t = (char*)emalloc(strlen(s)+12); strcpy(t, "ArrayOf"); } strcat(t, s); d = get_Darraydims(typ); if (d) sprintf(t+strlen(t), "%dD", d); return t; } if (is_synonym(typ)) { if (ns) return ns_convert(typ->synonym->name); else return ns_remove(typ->synonym->name); } switch (typ->type) { case Tvoid : if (ns) return "xsd:anyType"; return "anyType"; case Tchar : if (ns) return "xsd:byte"; return "byte"; case Tshort : if (ns) return "xsd:short"; return "short"; case Tint : if (ns) return "xsd:int"; return "int"; case Tlong : case Tllong : if (ns) return "xsd:long"; return "long"; case Tfloat: if (ns) return "xsd:float"; return "float"; case Tdouble: if (ns) return "xsd:double"; return "double"; case Tldouble: if (ns) return "xsd:decimal"; return "decimal"; case Tuchar: if (ns) return "xsd:unsignedByte"; return "unsignedByte"; case Tushort: if (ns) return "xsd:unsignedShort"; return "unsignedShort"; case Tuint: if (ns) return "xsd:unsignedInt"; return "unsignedInt"; case Tulong: case Tullong: if (ns) return "xsd:unsignedLong"; return "unsignedLong"; case Ttime: if (ns) return "xsd:dateTime"; return "dateTime"; case Tpointer: case Treference: case Trvalueref: return wsdl_type((Tnode*)typ->ref, ns); case Tarray: if (is_fixedstring(typ)) { if (typ->sym) { if (ns) return ns_convert(typ->sym->name); return ns_remove(typ->sym->name); } if (ns) return "xsd:string"; return "string"; } if (ns && *ns) { t = (char*)emalloc((strlen(ns_convert(ns))+strlen(c_ident(typ))+2) * sizeof(char)); strcpy(t, ns_convert(ns)); strcat(t, ":"); strcat(t, c_ident(typ)); return t; } else return c_ident(typ); case Tenum: if (is_bool(typ)) { if (ns) return "xsd:boolean"; return "boolean"; } case Tenumsc: case Tstruct: case Tclass: if (!has_ns(typ) && ns && *ns) { t = (char*)emalloc((strlen(ns_convert(ns))+strlen(typ->id->name)+2) * sizeof(char)); strcpy(t, ns_convert(ns)); strcat(t, ":"); strcat(t, ns_convert(typ->id->name)); return t; } else if (ns) return ns_convert(typ->id->name); else return ns_remove(typ->id->name); case Tunion: if (ns) return "xsd:choice"; return "choice"; case Ttemplate: if ((Tnode*)typ->ref) return wsdl_type((Tnode*)typ->ref, ns); break; default: break; } return ""; } const char * the_type(Tnode *typ) { if (!typ) return "NULL"; if (typ->type == Tarray || (is_dynamic_array(typ) && !is_binary(typ) && (eflag || (!has_ns(typ) && !is_untyped(typ))))) return "SOAP-ENC:Array"; if (is_string(typ) || is_wstring(typ) || is_stdstring(typ) || is_stdwstring(typ)) return "string"; switch (typ->type) { case Tchar: return "byte"; case Twchar: return "wchar"; case Tshort: return "short"; case Tint : return "int"; case Tlong : case Tllong : return "long"; case Tfloat: return "float"; case Tdouble: return "double"; case Tldouble: return "decimal"; case Tuchar: return "unsignedByte"; case Tushort: return "unsignedShort"; case Tuint: return "unsignedInt"; case Tulong: case Tullong: return "unsignedLong"; case Ttime: return "dateTime"; case Tpointer: case Treference: case Trvalueref: return the_type((Tnode*)typ->ref); case Tarray: return "SOAP-ENC:Array"; case Tenum: if (is_bool(typ)) return "boolean"; case Tenumsc: case Tstruct: case Tclass: return ns_convert(typ->id->name); default: break; } return ""; } /* c_type returns the type to be used in parameter declaration*/ const char * c_type(Tnode *typ) { char *p = NULL; const char *q, *r; char tempBuf[10]; Tnode *temp; Entry *e; if (typ == NULL) return "NULL"; switch(typ->type) { case Tnone: return ""; case Tvoid: return "void"; case Tchar: return "char"; case Twchar: return "wchar_t"; case Tshort: return "short"; case Tint : return "int"; case Tlong : return "long"; case Tllong : return "LONG64"; case Tfloat: return "float"; case Tdouble: return "double"; case Tldouble: return "long double"; case Tuchar: return "unsigned char"; case Tushort: return "unsigned short"; case Tuint: return "unsigned int"; case Tulong: return "unsigned long"; case Tullong: return "ULONG64"; case Tsize: return "size_t"; case Ttime: return "time_t"; case Tstruct: q = ident(typ->id->name); p = (char*)emalloc((8+strlen(q)) * sizeof(char)); strcpy(p, "struct "); strcat(p, q); return p; case Tclass: return ident(typ->id->name); case Tunion: q = ident(typ->id->name); p = (char*)emalloc((7+strlen(q)) * sizeof(char)); strcpy(p, "union "); strcat(p, q); return p; case Tenum: if (is_bool(typ)) return "bool"; q = ident(typ->id->name); p = (char*)emalloc((6+strlen(q)) * sizeof(char)); strcpy(p, "enum "); strcat(p, q); return p; case Tenumsc: return ident(typ->id->name); case Tpointer: return c_type_id((Tnode*)typ->ref, "*"); case Treference: return c_type_id((Tnode*)typ->ref, "&"); case Trvalueref: return c_type_id((Tnode*)typ->ref, "&&"); case Tarray: temp = typ; while (((Tnode*) (typ->ref))->type == Tarray) typ = (Tnode*)typ->ref; p = (char*)emalloc((12 + strlen(q = c_type((Tnode*)typ->ref))) * sizeof(char)); if (((Tnode*)typ->ref)->type == Tpointer) sprintf(p, "%s", c_type((Tnode*)typ->ref)); else strcpy(p, q); typ = temp; while (typ->type == Tarray) { if (((Tnode*) typ->ref)->width) { sprintf(tempBuf, "[%d]", (typ->width / ((Tnode*) typ->ref)->width)); strcat(p, tempBuf); } typ = (Tnode*)typ->ref; } break; case Tfun: p = (char*)emalloc(1024); strcpy(p, c_type(((FNinfo*)typ->ref)->ret)); strcat(p, "("); for (e = ((FNinfo*)typ->ref)->args->list; e; e = e->next) { strcat(p, c_storage(e->info.sto)); if (e->info.typ->type != Tvoid) { strcat(p, c_type_id(e->info.typ, e->sym->name)); strcat(p, c_init(e)); } else strcat(p, "void"); if (e->next) strcat(p, ", "); } strcat(p, ")"); return p; case Ttemplate: if (typ->ref) { p = (char*)emalloc((strlen(q = c_type((Tnode*)typ->ref)) + strlen(r = ident(typ->id->name)) + 4) * sizeof(char)); strcpy(p, r); strcat(p, "<"); strcat(p, q); strcat(p, "> "); return p; } default: return "UnknownType"; } return p; } const char * c_storage(Storage sto) { static char buf[256]; buf[0] = '\0'; if (sto & Smutable) strcat(buf, "mutable "); if (sto & Sinline) strcat(buf, "inline "); if (sto & Sfriend) strcat(buf, "friend "); if (sto & Svirtual) strcat(buf, "virtual "); if (sto & Stypedef) strcat(buf, "typedef "); if (sto & Sexplicit) strcat(buf, "explicit "); if (sto & Sstatic) strcat(buf, "static "); if (sto & Sregister) strcat(buf, "register "); if (sto & Sauto) strcat(buf, "auto "); if (sto & Sconstptr) strcat(buf, "const "); if (sto & Sconst) strcat(buf, "const "); return buf; } const char * c_const(Storage sto) { if (sto & Sconst) return "const "; if (sto & Sconstptr) return "const "; return ""; } const char * c_init(Entry *e) { static char buf[4096]; buf[0] = '\0'; if (e && e->info.hasval) { switch (e->info.typ->type) { case Tchar: case Twchar: case Tuchar: case Tshort: case Tushort: case Tint: case Tuint: case Ttime: sprintf(buf, " = " SOAP_LONG_FORMAT, e->info.val.i); break; case Tlong: sprintf(buf, " = " SOAP_LONG_FORMAT "L", e->info.val.i); break; case Tulong: sprintf(buf, " = " SOAP_LONG_FORMAT "UL", e->info.val.i); break; case Tllong: sprintf(buf, " = " SOAP_LONG_FORMAT "LL", e->info.val.i); break; case Tullong: case Tsize: sprintf(buf, " = " SOAP_LONG_FORMAT "ULL", e->info.val.i); break; case Tfloat: case Tdouble: sprintf(buf, " = %g", e->info.val.r); break; case Tldouble: sprintf(buf, " = %gL", e->info.val.r); break; case Tenum: case Tenumsc: if (e->info.val.i <= 0x7FFFLL && e->info.val.i >= -0x8000LL) sprintf(buf, " = (%s)" SOAP_LONG_FORMAT, c_type(e->info.typ), e->info.val.i); else sprintf(buf, " = (%s)" SOAP_LONG_FORMAT "LL", c_type(e->info.typ), e->info.val.i); break; default: if (is_stdstring(e->info.typ) && e->info.val.s && strlen(e->info.val.s) < sizeof(buf)-6) sprintf(buf, " = \"%s\"", cstring(e->info.val.s, 0)); else if (is_stdwstring(e->info.typ) && e->info.val.s && strlen(e->info.val.s) < sizeof(buf)-6) sprintf(buf, " = L\"%s\"", cstring(e->info.val.s, 0)); else if (is_wstring(e->info.typ) && e->info.val.s && strlen(e->info.val.s) < sizeof(buf)-6) sprintf(buf, " = (wchar_t*)L\"%s\"", cstring(e->info.val.s, 0)); else if (e->info.val.s && strlen(e->info.val.s) < sizeof(buf)-6) sprintf(buf, " = (char*)\"%s\"", cstring(e->info.val.s, 0)); else if (e->info.typ->type == Tpointer) sprintf(buf, " = NULL"); break; } } return buf; } /* c_type_constptr_id returns the const* type to be used in parameter declaration */ const char * c_type_constptr_id(Tnode *typ, const char *name) { return c_type_id(typ, name); } /* c_type_id returns the type to be used in parameter declaration */ const char * c_type_id(Tnode *typ, const char *name) { const char *id; char *p = NULL; const char *q; char tempBuf[10]; Tnode *temp; Entry *e; if (!typ) return "NULL"; id = ident(name); switch(typ->type) { case Tnone: return id; case Tvoid: p = (char*)emalloc(6+strlen(id)); strcpy(p, "void "); strcat(p, id); break; case Tchar: p = (char*)emalloc(6+strlen(id)); strcpy(p, "char "); strcat(p, id); break; case Twchar: p = (char*)emalloc(9+strlen(id)); strcpy(p, "wchar_t "); strcat(p, id); break; case Tshort: p = (char*)emalloc(7+strlen(id)); strcpy(p, "short "); strcat(p, id); break; case Tint : p = (char*)emalloc(5+strlen(id)); strcpy(p, "int "); strcat(p, id); break; case Tlong : p = (char*)emalloc(6+strlen(id)); strcpy(p, "long "); strcat(p, id); break; case Tllong : p = (char*)emalloc(8+strlen(id)); strcpy(p, "LONG64 "); strcat(p, id); break; case Tfloat: p = (char*)emalloc(7+strlen(id)); strcpy(p, "float "); strcat(p, id); break; case Tdouble: p = (char*)emalloc(8+strlen(id)); strcpy(p, "double "); strcat(p, id); break; case Tldouble: p = (char*)emalloc(13+strlen(id)); strcpy(p, "long double "); strcat(p, id); break; case Tuchar: p = (char*)emalloc(15+strlen(id)); strcpy(p, "unsigned char "); strcat(p, id); break; case Tushort: p = (char*)emalloc(16+strlen(id)); strcpy(p, "unsigned short "); strcat(p, id); break; case Tuint: p = (char*)emalloc(14+strlen(id)); strcpy(p, "unsigned int "); strcat(p, id); break; case Tulong: p = (char*)emalloc(15+strlen(id)); strcpy(p, "unsigned long "); strcat(p, id); break; case Tullong: p = (char*)emalloc(9+strlen(id)); strcpy(p, "ULONG64 "); strcat(p, id); break; case Tsize: p = (char*)emalloc(8+strlen(id)); strcpy(p, "size_t "); strcat(p, id); break; case Ttime: p = (char*)emalloc(8+strlen(id)); strcpy(p, "time_t "); strcat(p, id); break; case Tstruct: q = ident(typ->id->name); p = (char*)emalloc((9+strlen(q)+strlen(id)) * sizeof(char)); strcpy(p, "struct "); strcat(p, q); strcat(p, " "); strcat(p, id); break; case Tclass: q = ident(typ->id->name); p = (char*)emalloc((2+strlen(q)+strlen(id)) * sizeof(char)); strcpy(p, q); strcat(p, " "); strcat(p, id); break; case Tunion: q = ident(typ->id->name); p = (char*)emalloc((8+strlen(q)+strlen(id)) * sizeof(char)); strcpy(p, "union "); strcat(p, q); strcat(p, " "); strcat(p, id); break; case Tenum: if (is_bool(typ)) { p = (char*)emalloc((strlen(id)+6)* sizeof(char)); strcpy(p, "bool "); strcat(p, id); return p; } q = ident(typ->id->name); p = (char*)emalloc((7+strlen(q)+strlen(id)) * sizeof(char)); strcpy(p, "enum "); strcat(p, q); strcat(p, " "); strcat(p, id); break; case Tenumsc: q = ident(typ->id->name); p = (char*)emalloc((7+strlen(q)+strlen(id)) * sizeof(char)); strcpy(p, q); strcat(p, " "); strcat(p, id); break; case Tpointer: p = (char*)emalloc(strlen(id)+2); p[0] = '*'; strcpy(p+1, id); return c_type_id((Tnode*)typ->ref, p); case Treference: p = (char*)emalloc(strlen(id)+2); p[0] = '&'; strcpy(p+1, id); return c_type_id((Tnode*)typ->ref, p); case Trvalueref: p = (char*)emalloc(strlen(id)+3); p[0] = '&'; p[1] = '&'; strcpy(p+2, id); return c_type_id((Tnode*)typ->ref, p); case Tarray: temp = typ; while (((Tnode*) (typ->ref))->type == Tarray) typ = (Tnode*)typ->ref; p = (char*)emalloc((12+strlen(q = c_type_id((Tnode*)typ->ref, id))) * sizeof(char)); strcpy(p, q); typ = temp; while (typ->type == Tarray) { if (((Tnode*) typ->ref)->width) { sprintf(tempBuf, "[%d]", (typ->width / ((Tnode*) typ->ref)->width)); strcat(p, tempBuf); } typ = (Tnode*)typ->ref; } break; case Tfun: if (id && strncmp(id, "operator ", 9)) q = c_type_id(((FNinfo*)typ->ref)->ret, id); else q = id; p = (char*)emalloc(1024); if (q) strcpy(p, q); strcat(p, "("); for (e = ((FNinfo*)typ->ref)->args->list; e; e = e->next) { strcat(p, c_storage(e->info.sto)); if (e->info.typ->type != Tvoid) { strcat(p, c_type_id(e->info.typ, e->sym->name)); strcat(p, c_init(e)); } else strcat(p, "void"); if (e->next) strcat(p, ", "); } strcat(p, ")"); break; case Ttemplate: if (typ->ref) { p = (char*)emalloc((strlen(q = c_type((Tnode*)typ->ref))+strlen(ident(typ->id->name))+strlen(id)+4) * sizeof(char)); strcpy(p, ident(typ->id->name)); strcat(p, "<"); strcat(p, q); strcat(p, "> "); strcat(p, id); break; } default: return "UnknownType"; } return p; } /* c_type_synonym returns the typedef synonym name as a type (if present) to be used in parameter declaration */ const char * c_type_synonym(Tnode *typ, const char *name) { if (typ->synonym) { const char *synonym = ident(typ->synonym->name); const char *id = ident(name); char *p = (char*)emalloc(strlen(synonym) + strlen(id) + 2); strcpy(p, synonym); strcat(p, " "); strcat(p, id); return p; } return c_type_id(typ, name); } const char * xsi_type_Tarray(Tnode *typ) { Tnode *t; int cardinality; char *p; const char *s; t = (Tnode*)typ->ref; if (is_fixedstring(typ)) { if (typ->sym) return ns_convert(typ->sym->name); return "xsd:string"; } cardinality = 1; while (t->type == Tarray || (is_dynamic_array(t) && !has_ns(t) && !is_untyped(t) && !is_binary(t))) { if (t->type == Tarray) t = (Tnode*)t->ref; else t = (Tnode*)((Table*)t->ref)->list->info.typ->ref; cardinality++; } s = xsi_type(t); if (!*s) s = wsdl_type(t, ""); p = (char*)emalloc(strlen(s)+cardinality+3); strcpy(p, s); if (cardinality > 1) { strcat(p, "["); for (; cardinality > 2; cardinality--) strcat(p, ", "); strcat(p, "]"); } return p; } const char * xsi_type_Darray(Tnode *typ) { Tnode *t; Entry *q; int cardinality; char *p; const char *s; if (!typ->ref) return ""; q = ((Table*)typ->ref)->list; while (q && q->info.typ->type == Tfun) q = q->next; t = (Tnode*)q->info.typ->ref; cardinality = 1; while (t->type == Tarray || (is_dynamic_array(t) && !has_ns(t) && !is_untyped(t) && !is_binary(t))) { if (t->type == Tarray) t = (Tnode*)t->ref; else { q = ((Table*)t->ref)->list; while (q && q->info.typ->type == Tfun) q = q->next; t = (Tnode*)q->info.typ->ref; } cardinality++; } s = xsi_type(t); if (!*s) s = wsdl_type(t, ""); p = (char*)emalloc(strlen(s)+cardinality*2+1); strcpy(p, s); if (cardinality > 1) { strcat(p, "["); for (; cardinality > 2; cardinality--) strcat(p, ", "); strcat(p, "]"); } return p; } void generate_type(Tnode *typ) { if (Etflag && is_XML(typ)) { soap_traverse(typ); return; } if (is_transient(typ) || typ->type == Twchar || is_XML(typ) || is_void(typ)) return; if (lflag && typ->type == Tint && !typ->sym) { fprintf(fhead, "\n\n#ifndef %s", soap_type(typ)); fprintf(fhead, "\n#define %s (%d)", soap_type(typ), typ->num); fprintf(fhead, "\n#endif"); fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_default_int(struct soap*, int*);"); fprintf(fhead, "\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_int(struct soap*, const char*, int, const int*, const char*);"); fprintf(fhead, "\nSOAP_FMAC1 int* SOAP_FMAC2 soap_in_int(struct soap*, const char*, int*, const char*);"); return; /* do not generate int serializers in libs */ } else if (is_imported(typ) && (typ->type != Tint || typ->sym)) return; if (is_typedef(typ) && (is_element(typ) || is_synonym(typ))) fprintf(fhead, "\n/* %s is a typedef synonym for %s */", c_ident(typ), t_ident(typ)); if (is_primitive(typ) || is_string(typ) || is_wstring(typ)) { if (!Qflag && is_external(typ) && namespaceid) { const char *id = namespaceid; fprintf(fhead, "\n\n}"); fprintf(fout, "\n\n}"); namespaceid = NULL; fprintf(fhead, "\n\n#ifndef %s", soap_type(typ)); fprintf(fhead, "\n#define %s (%d)", soap_type(typ), typ->num); fprintf(fhead, "\n#endif"); namespaceid = id; } fprintf(fhead, "\n\n#ifndef %s", soap_type(typ)); fprintf(fhead, "\n#define %s (%d)", soap_type(typ), typ->num); fprintf(fhead, "\n#endif"); fflush(fhead); soap_default(typ); soap_serialize(typ); if (Etflag) soap_traverse(typ); soap_out(typ); soap_in(typ); if (!Qflag && is_external(typ) && namespaceid) { fprintf(fhead, "\n\nnamespace %s {", namespaceid); fprintf(fout, "\n\nnamespace %s {", namespaceid); } if (is_string(typ) || is_wstring(typ)) { soap_dup(typ); soap_del(typ); } soap_put(typ); soap_get(typ); return; } switch(typ->type) { case Ttemplate: case Tenum: case Tenumsc: case Tpointer: case Tarray: case Tstruct: case Tclass: case Tunion: if (is_header_or_fault(typ) || is_body(typ)) { fprintf(fhead, "\n\n#ifndef WITH_NOGLOBAL"); fprintf(fout, "\n\n#ifndef WITH_NOGLOBAL"); } if (!Qflag && is_external(typ) && namespaceid) { const char *id = namespaceid; fprintf(fhead, "\n\n}"); fprintf(fout, "\n\n}"); namespaceid = NULL; fprintf(fhead, "\n\n#ifndef %s", soap_type(typ)); fprintf(fhead, "\n#define %s (%d)", soap_type(typ), typ->num); fprintf(fhead, "\n#endif"); namespaceid = id; } fprintf(fhead, "\n\n#ifndef %s", soap_type(typ)); fprintf(fhead, "\n#define %s (%d)", soap_type(typ), typ->num); fprintf(fhead, "\n#endif"); fflush(fhead); soap_default(typ); soap_serialize(typ); if (Etflag) soap_traverse(typ); soap_out(typ); soap_in(typ); if (!Qflag && is_external(typ) && namespaceid) { fprintf(fhead, "\n\nnamespace %s {", namespaceid); fprintf(fout, "\n\nnamespace %s {", namespaceid); } soap_dup(typ); soap_del(typ); soap_instantiate(typ); soap_put(typ); soap_get(typ); if (is_header_or_fault(typ) || is_body(typ)) { fprintf(fhead, "\n\n#endif"); fprintf(fout, "\n\n#endif"); } break; default: break; } } void matlab_gen_sparseStruct(void) { fprintf(fmheader, "\nstruct soapSparseArray{\n"); fprintf(fmheader, " int *ir;\n"); fprintf(fmheader, " int *jc;\n"); fprintf(fmheader, " double *pr;\n"); fprintf(fmheader, " int num_columns;\n"); fprintf(fmheader, " int num_rows;\n"); fprintf(fmheader, " int nzmax;\n"); fprintf(fmheader, "};\n"); } void matlab_c_to_mx_sparse(void) { fprintf(fmheader, "\nmxArray* c_to_mx_soapSparseArray(struct soapSparseArray);\n"); fprintf(fmatlab, "\nmxArray* c_to_mx_soapSparseArray(struct soapSparseArray a)\n"); fprintf(fmatlab, "{\n"); fprintf(fmatlab, " mxArray *b;\n"); fprintf(fmatlab, " b = mxCreateSparse(a.num_rows, a.num_columns, a.nzmax, mxREAL);\n"); fprintf(fmatlab, " mxSetIr(b,a.ir);\n"); fprintf(fmatlab, " mxSetJc(b,a.jc);\n"); fprintf(fmatlab, " mxSetPr(b,a.pr);\n"); fprintf(fmatlab, " return b;\n"); fprintf(fmatlab, "}\n"); } void matlab_mx_to_c_sparse(void) { fprintf(fmheader, "\nmxArray* mx_to_c_soapSparseArray(const mxArray *, struct soapSparseArray *);\n"); fprintf(fmatlab, "\nmxArray* mx_to_c_soapSparseArray(const mxArray *a, struct soapSparseArray *b)\n"); fprintf(fmatlab, "{\n"); fprintf(fmatlab, " if (!mxIsSparse(a))\n"); fprintf(fmatlab, " {\n"); fprintf(fmatlab, " mexErrMsgTxt(\"Input should be a sparse array.\");\n"); fprintf(fmatlab, " }\n"); fprintf(fmatlab, " /* Get the starting positions of the data in the sparse array. */ \n"); fprintf(fmatlab, " b->pr = mxGetPr(a);\n"); fprintf(fmatlab, " b->ir = mxGetIr(a);\n"); fprintf(fmatlab, " b->jc = mxGetJc(a);\n"); fprintf(fmatlab, " b->num_columns = mxGetN(a);\n"); fprintf(fmatlab, " b->num_rows = mxGetM(a);\n"); fprintf(fmatlab, " b->nzmax = mxGetNzmax(a);\n"); fprintf(fmatlab, "}\n"); } void matlab_mx_to_c_dynamicArray(Tnode* typ) { int d; Entry *p; p = is_dynamic_array(typ); fprintf(fmatlab, "{\n"); fprintf(fmatlab, "\tint i, numdims;\n"); fprintf(fmatlab, "\tconst int *dims;\n"); fprintf(fmatlab, "\tdouble *temp;\n"); fprintf(fmatlab, "\tint size = 1;\n"); fprintf(fmatlab, "\tint ret;\n"); fprintf(fmatlab, "\tnumdims = mxGetNumberOfDimensions(a);\n"); fprintf(fmatlab, "\tdims = mxGetDimensions(a);\n"); d = get_Darraydims(typ); fprintf(fmatlab, "\tif (numdims != %d)\n", d); fprintf(fmatlab, "\t\tmexErrMsgTxt(\"Incompatible array specifications in C and mx.\");\n"); /* fprintf(fmatlab, "\tfor (i=0;i__size[i] = dims[i];\n"); fprintf(fmatlab, "\t}\n"); */ if ((((Tnode *)p->info.typ->ref)->type != Tchar) && (((Tnode *)p->info.typ->ref)->type != Tuchar)) { fprintf(fmatlab, "\ttemp = (double*)mxGetPr(a);\n"); fprintf(fmatlab, "\tif (!temp)\n\t\tmexErrMsgTxt(\"mx_to_c_ArrayOfdouble: Pointer to data is NULL\");\n"); } fprintf(fmatlab, "\tfor (i = 0; i < numdims; i++) {\n"); fprintf(fmatlab, "\t\tif (b->__size[i] < dims[i])\n"); fprintf(fmatlab, "\t\t\tmexErrMsgTxt(\"Incompatible array dimensions in C and mx.\");\n"); fprintf(fmatlab, "\t\tsize *= dims[i];\n"); fprintf(fmatlab, "\t}\n"); if ((((Tnode *)p->info.typ->ref)->type != Tchar) && (((Tnode *)p->info.typ->ref)->type != Tuchar)) { fprintf(fmatlab, "\tfor (i = 0; i < size; i++)\n"); fprintf(fmatlab, "\t\tb->__ptr[i] = (%s)*temp++;\n", c_type((Tnode*)p->info.typ->ref)); } else { fprintf(fmatlab, "\tret = mxGetString(a, b->__ptr, size + 1);\n"); fprintf(fmatlab, "\tmexPrintf(\"ret = %%d, b->__ptr = %%s, size = %%d\", ret, b->__ptr, size);\n"); } fprintf(fmatlab, "\n}\n"); fflush(fmatlab); } void matlab_c_to_mx_dynamicArray(Tnode* typ) { int d, i; Entry *p; p = is_dynamic_array(typ); fprintf(fmatlab, "{\n"); fprintf(fmatlab, "\tmxArray *out;\n"); fprintf(fmatlab, "\t%s;\n", c_type_id((Tnode*)p->info.typ->ref, "*temp")); d = get_Darraydims(typ); fprintf(fmatlab, "\tint i;\n"); fprintf(fmatlab, "\tint ndim = %d, dims[%d] = {", d, d); for (i = 0; i < d; i++) { if (i == 0) fprintf(fmatlab, "a.__size[%d]", i); else fprintf(fmatlab, ", a.__size[%d]", i); } fprintf(fmatlab, "};\n"); fprintf(fmatlab, "\tint size = "); for (i = 0; i < d; i++) { if (i == 0) fprintf(fmatlab, "dims[%d]", i); else fprintf(fmatlab, "*dims[%d]", i); } fprintf(fmatlab, ";\n"); if ((((Tnode *)p->info.typ->ref)->type != Tchar) && (((Tnode *)p->info.typ->ref)->type != Tuchar)) { fprintf(fmatlab, "\tout = mxCreateNumericArray(ndim, dims, %s, mxREAL);\n", get_mxClassID((Tnode*)p->info.typ->ref)); fprintf(fmatlab, "\tif (!out)\n\t\tmexErrMsgTxt(\"Could not create mxArray.\");\n"); fprintf(fmatlab, "\ttemp = (%s) mxGetPr(out);\n", c_type_id((Tnode*)p->info.typ->ref, "*")); fprintf(fmatlab, "\tif (!temp)\n\t\tmexErrMsgTxt(\"matlab_array_c_to_mx: Pointer to data is NULL\");\n"); fprintf(fmatlab, "\tfor (i = 0; i < size; i++)\n"); fprintf(fmatlab, "\t\t*temp++ = a.__ptr[i];\n"); } else { fprintf(fmatlab, "\tout = mxCreateString(a.__ptr);\n"); fprintf(fmatlab, "\tif (!out)\n\t\tmexErrMsgTxt(\"Could not create mxArray.\");\n"); } fprintf(fmatlab, "\treturn out;\n}\n"); fflush(fmatlab); } const char* get_mxClassID(Tnode* typ) { switch(typ->type) { case Tdouble: return "mxDOUBLE_CLASS"; case Tfloat: return "mxSINGLE_CLASS"; case Tshort: return "mxINT16_CLASS"; case Tushort: return "mxUINT16_CLASS"; case Tint: return "mxINT32_CLASS"; case Tuint: return "mxUINT32_CLASS"; case Tlong: return "mxINT32_CLASS"; case Tulong: return "mxUINT32_CLASS"; case Tllong: return "mxINT64_CLASS"; case Tullong: return "mxUINT64_CLASS"; case Tchar: return "mxCHAR_CLASS"; case Tuchar: return "mxCHAR_CLASS"; default: return ""; } } /*Function not in use.*/ void matlab_array_c_to_mx(Tnode* typ) { Tnode* temp; int d, i; fprintf(fmatlab, "{\n\tint rows, r, cols, c;\n"); fprintf(fmatlab, "\tmxArray* out;\n"); fprintf(fmatlab, "\tdouble* temp;\n"); d = get_dimension(typ); fprintf(fmatlab, "\tint ndim = %d, dims[%d] = {", d, d); temp=typ; for (i = 0; i < d; i++) { if (i == 0) fprintf(fmatlab, "%d", temp->width / ((Tnode*) temp->ref)->width); else fprintf(fmatlab, ", %d", temp->width / ((Tnode*) temp->ref)->width); temp=(Tnode*)typ->ref; } fprintf(fmatlab, "};\n"); fprintf(fmatlab, "\tout = mxCreateNumericArray(ndim, dims, mxDOUBLE_CLASS, mxREAL);\n"); fprintf(fmatlab, "\ttemp = (double *) mxGetPr(out);\n"); fprintf(fmatlab, "\tif (!out)\n\t\tmexErrMsgTxt(\"Could not create mxArray.\");\n"); fprintf(fmatlab, "\tif (!temp)\n\t\tmexErrMsgTxt(\"matlab_array_c_to_mx: Pointer to data is NULL\");\n"); fprintf(fmatlab, "\trows = mxGetM(out);\n"); fprintf(fmatlab, "\tif (!rows)\n\t\tmexErrMsgTxt(\"matlab_array_c_to_mx: Data has zero rows\");\n"); fprintf(fmatlab, "\tcols = mxGetN(out);\n"); fprintf(fmatlab, "\tif (!cols)\n\t\tmexErrMsgTxt(\"matlab_array_c_to_mx: Data has zero columns\");\n"); fprintf(fmatlab, "\tfor (c = 0; c < cols; c++)\n"); fprintf(fmatlab, "\t\tfor (r = 0; r < rows; r++)\n"); fprintf(fmatlab, "\t\t\t*temp++ = z->a[r][c];\n"); fprintf(fmatlab, "\treturn out;\n}\n"); fflush(fmatlab); } void matlab_c_to_mx_pointer(Tnode* typ) { if (!typ->ref) return; fprintf(fmheader, "\nmxArray* c_to_mx_%s(%s);\n", c_ident(typ), c_type_id(typ, "")); fprintf(fmatlab, "\nmxArray* c_to_mx_%s(%s)\n", c_ident(typ), c_type_id(typ, "a")); fprintf(fmatlab, "{\n"); fprintf(fmatlab, "\tmxArray *fout;\n"); fprintf(fmatlab, "\tfout = c_to_mx_%s(*a);\n", c_ident((Tnode*)typ->ref)); fprintf(fmatlab, "\treturn fout;\n"); fprintf(fmatlab, "}\n"); } void matlab_mx_to_c_pointer(Tnode* typ) { if (!typ->ref) return; fprintf(fmheader, "\nvoid mx_to_c_%s(const mxArray*, %s);\n", c_ident(typ), c_type_id(typ, "*")); fprintf(fmatlab, "\nvoid mx_to_c_%s(const mxArray* a, %s)\n", c_ident(typ), c_type_id(typ, "*b")); fprintf(fmatlab, "{\n\tmx_to_c_%s(a, *b);\n", c_ident((Tnode*)typ->ref)); fprintf(fmatlab, "\n}\n"); } void func2(Tnode* typ) { Table *table, *t; Entry *p; fprintf(fmatlab, "\tif (!mxIsStruct(a))\n\t\tmexErrMsgTxt(\"Input must be a structure.\");\n"); table=(Table*)typ->ref; for (t = table; t != (Table*)0; t = t->prev) { for (p = t->list; p != (Entry*)0; p = p->next) { if (p->info.typ->type != Tfun && !is_void(p->info.typ) && !is_XML(p->info.typ)) { fprintf(fmatlab, "\t{mxArray *tmp = mxGetField(a, 0, \"%s\");\n", ident(p->sym->name)); fprintf(fmatlab, "\tif (!tmp) {\n"); fprintf(fmatlab, "\t\tmexErrMsgTxt(\"Above member field is empty!\");\n\t}\n"); fprintf(fmatlab, "\tmx_to_c_%s(tmp, &b->%s);}\n", c_ident(p->info.typ), ident(p->sym->name)); } } } } void matlab_mx_to_c_struct(Tnode* typ) { if (!typ->ref) return; if (is_dynamic_array(typ)) { fprintf(fmheader, "\nvoid mx_to_c_%s(const mxArray*, %s);\n", c_ident(typ), c_type_id(typ, "*")); fprintf(fmatlab, "\nvoid mx_to_c_%s(const mxArray* a, %s)\n", c_ident(typ), c_type_id(typ, "*b")); matlab_mx_to_c_dynamicArray(typ); return; } else if (strstr(c_type_id(typ, ""), "soapSparseArray")) { return; } fprintf(fmheader, "\nvoid mx_to_c_%s(const mxArray*, %s);\n", c_ident(typ), c_type_id(typ, "*")); fprintf(fmatlab, "\nvoid mx_to_c_%s(const mxArray* a, %s)\n", c_ident(typ), c_type_id(typ, "*b")); fprintf(fmatlab, "{\n"); func2(typ); fprintf(fmatlab, "\n}\n"); return; } void matlab_c_to_mx_struct(Tnode* typ) { Table *table, *t; Entry *p; int number_of_fields=0; if (!typ->ref) return; if (is_dynamic_array(typ)) { fprintf(fmheader, "\nmxArray* c_to_mx_%s(%s);\n", c_ident(typ), c_type_id(typ, "")); fprintf(fmatlab, "\nmxArray* c_to_mx_%s(%s)\n", c_ident(typ), c_type_id(typ, "a")); matlab_c_to_mx_dynamicArray(typ); return; } else if (strstr(c_type_id(typ, ""), "soapSparseArray")) return; fprintf(fmheader, "\nmxArray* c_to_mx_%s(%s);\n", c_ident(typ), c_type_id(typ, "")); fprintf(fmatlab, "\nmxArray* c_to_mx_%s(%s)\n", c_ident(typ), c_type_id(typ, "a")); table=(Table*)typ->ref; fprintf(fmatlab, "{\n\tconst char* fnames[] = {"); for (t = table; t != (Table*)0; t = t->prev) { for (p = t->list; p != (Entry*)0; p = p->next) { if (p->info.typ->type != Tfun && !is_void(p->info.typ) && !is_XML(p->info.typ)) { if (number_of_fields) fprintf(fmatlab, ", \"%s\"", ident(p->sym->name)); else fprintf(fmatlab, "\"%s\"", ident(p->sym->name)); number_of_fields++; } } } fprintf(fmatlab, "}; /* pointers to member field names */\n"); fprintf(fmatlab, "\tint rows = 1, cols = 1;\n\tint index = 0;\n\tint number_of_fields = %d;\n\tmxArray *struct_array_ptr;\n", number_of_fields); fprintf(fmatlab, "\t/* Create a 1x1 struct matrix for output */\n"); fprintf(fmatlab, "\tstruct_array_ptr = mxCreateStructMatrix(rows, cols, number_of_fields, fnames);\n\tmexPrintf(\"6\");\n\tif (struct_array_ptr == NULL) {\n\t\tmexPrintf(\"COULDNT CREATE A MATRIX\");}\n\tmexPrintf(\"7\");\n"); for (t = table; t != (Table*)0; t = t->prev) { for (p = t->list; p != (Entry*)0; p = p->next) { if (p->info.typ->type != Tfun && !is_void(p->info.typ) && !is_XML(p->info.typ)) { fprintf(fmatlab, "\t{mxArray *fout = c_to_mx_%s(a.%s);\n", c_ident(p->info.typ), ident(p->sym->name)); fprintf(fmatlab, "\tmxSetField(struct_array_ptr, index, \"%s\" , fout);}\n", ident(p->sym->name)); } } } fprintf(fmatlab, "\treturn struct_array_ptr;\n}\n"); } void matlab_c_to_mx_primitive(Tnode *typ) { fprintf(fmheader, "\nmxArray* c_to_mx_%s(%s);", c_ident(typ), c_type_id(typ, "")); fprintf(fmatlab, "\nmxArray* c_to_mx_%s(%s)\n", c_ident(typ), c_type_id(typ, "a")); fprintf(fmatlab, "{\n\tmxArray *fout;\n"); if ((typ->type == Tchar) || (typ->type == Tuchar)) { fprintf(fmatlab, "\tchar buf[2];\n"); fprintf(fmatlab, "\tbuf[0] = a;\n"); fprintf(fmatlab, "\tbuf[1] = \'\\0\';\n"); fprintf(fmatlab, "\tfout = mxCreateString(buf);\n"); fprintf(fmatlab, "\tif (!fout)\n"); fprintf(fmatlab, "\t\tmexErrMsgTxt(\"Could not create mxArray.\");\n"); } else { fprintf(fmatlab, "\tint ndim = 1, dims[1] = {1};\n"); fprintf(fmatlab, "\tfout = mxCreateNumericArray(ndim, dims, %s, mxREAL);\n", get_mxClassID(typ)); fprintf(fmatlab, "\t%s = (%s)mxGetPr(fout);\n", c_type_id(typ, "*temp"), c_type_id(typ, "*")); fprintf(fmatlab, "\tif (!fout)\n"); fprintf(fmatlab, "\t\tmexErrMsgTxt(\"Could not create mxArray.\");\n"); fprintf(fmatlab, "\tif (!temp) \n"); fprintf(fmatlab, "\t\tmexErrMsgTxt(\"matlab_array_c_to_mx: Pointer to data is NULL\");\n"); fprintf(fmatlab, "\t*temp++= a;\n"); } fprintf(fmatlab, "\treturn fout;\n}\n"); } void matlab_mx_to_c_primitive(Tnode *typ) { fprintf(fmheader, "\nvoid mx_to_c_%s(const mxArray *, %s);\n", c_ident(typ), c_type_id(typ, "*")); fprintf(fmatlab, "\nvoid mx_to_c_%s(const mxArray *a, %s)\n", c_ident(typ), c_type_id(typ, "*b")); if ((typ->type == Tchar) || (typ->type == Tuchar)) { fprintf(fmatlab, "{\n\tint ret;\n"); fprintf(fmatlab, "\tchar buf[2];\n"); fprintf(fmatlab, "\tret = mxGetString(a, buf, 2);\n"); fprintf(fmatlab, "\tmexPrintf(\"ret = %%d, buf = %%s\", ret, buf);\n"); fprintf(fmatlab, "\t*b = buf[0];\n"); } else { fprintf(fmatlab, "{\n\tdouble* data = (double*)mxGetData(a);\n"); fprintf(fmatlab, "\t*b = (%s)*data;\n", c_type(typ)); } fprintf(fmatlab, "\n}\n"); } void matlab_out_generate(Tnode *typ) { if (is_transient(typ) || typ->type == Twchar || is_XML(typ)) return; /* typeNO++; if (typeNO>=1024) execerror("Too many user-defined data types"); */ if (is_primitive(typ)) { matlab_c_to_mx_primitive(typ); matlab_mx_to_c_primitive(typ); return; } switch(typ->type) { case Tstruct: matlab_c_to_mx_struct(typ); matlab_mx_to_c_struct(typ); break; case Tpointer: matlab_c_to_mx_pointer(typ); matlab_mx_to_c_pointer(typ); break; default: break; } } /*his function is called first it first generates all routines and then in the second pass calls all routines to generate matlab_out for the table*/ void func1(Table *table, Entry *param) { Entry *q, *pout, *response=NULL; q=entry(table, param->sym); if (q) pout = (Entry*)q->info.typ->ref; else { fprintf(stderr, "Internal error: no table entry\n"); return; } q=entry(classtable, param->sym); if (!is_response(pout->info.typ)) { response = get_response(param->info.typ); } fprintf(fmheader, "\n\toutside loop struct %s soap_tmp_%s;", param->sym->name, param->sym->name); if (!is_response(pout->info.typ) && response) { fprintf(fmheader, "\n\tif..inside loop struct %s *soap_tmp_%s;", c_ident(response->info.typ), c_ident(response->info.typ)); } fflush(fmheader); } void matlab_def_table(Table *table) { Entry *q, *pout, *e, *response=NULL; int i; Tnode *p; /* for (q1 = table->list; q1 != (Entry*) 0; q1 = q1->next) if (q1->info.typ->type == Tfun) func1(table, q1); */ /* Sparse matrix code will be present by default */ matlab_gen_sparseStruct(); matlab_c_to_mx_sparse(); matlab_mx_to_c_sparse(); for (i = 0; i < TYPES; i++) { for (p = Tptr[i]; p != (Tnode*)0 ; p = p->next) { /* This is generated for everything declared in the ".h" file. To make sure that it doesnt get generated for functions do a comparison with p->sym->name, so that its not generated for functions. */ if (is_XML(p)) continue; if (strstr(c_ident(p), "SOAP_ENV_") != NULL) continue; for (q = table->list; q != (Entry*) 0; q = q->next) { if (strcmp(c_ident(p), q->sym->name) == 0) break; e=entry(table, q->sym); if (e) pout = (Entry*)e->info.typ->ref; else { fprintf(stderr, "Internal error: no table entry\n"); return; } if (!is_response(pout->info.typ)) { response = get_response(q->info.typ); } if (!is_response(pout->info.typ) && response) { if (strcmp(c_ident(p), c_ident(response->info.typ)) == 0) break; } } if (q == (Entry*) 0) matlab_out_generate(p); } } } void detect_cycles(void) { Tnode *p; for (p = Tptr[Tclass]; p; p = p->next) detect_recursive_type(p); for (p = Tptr[Tstruct]; p; p = p->next) detect_recursive_type(p); } void detect_recursive_type(Tnode *p) { if (p->type == Tclass || p->type == Tstruct || p->type == Tunion) { if (!p->recursive) { if (!p->visited) { Table *t; Entry *e; p->visited = True; for (t = (Table*)p->ref; t; t = t->prev) for (e = t->list; e; e = e->next) detect_recursive_type(e->info.typ); if ((p->type == Tclass || p->type == Tstruct) && p->base && !is_transient(p)) { e = entry(classtable, p->base); if (e && e->info.typ->recursive) p->recursive = True; else if (e && !e->info.typ->visited) { e->info.typ->visited = True; detect_recursive_type(e->info.typ); e->info.typ->visited = False; if (e->info.typ->recursive) p->recursive = True; } } p->visited = False; } else p->recursive = True; } } else if (p->type == Tpointer || p->type == Treference || p->type == Trvalueref || p->type == Tarray || p->type == Ttemplate) detect_recursive_type(p->ref); } void generate_defs(void) { int i; Tnode *p; for (i = 0; i < TYPES; i++) { for (p = Tptr[i]; p; p = p->next) { if (!p->generated && !is_transient(p) && p->type != Twchar && !is_void(p)) { p->generated = True; generate_type(p); if (fflag) if (--partnum == 0) return; } } } } int no_of_var(Tnode *typ) { Entry *p; Table *t; int i=0; if (typ->type == Tstruct || typ->type == Tclass) { t = (Table*)typ->ref; for (p = t->list; p != (Entry*) 0; p = p->next) { if (p->info.typ->type == Tpointer) i++; } } if ((((Tnode *)(typ->ref))->type == Tstruct) || (((Tnode *)(typ->ref))->type == Tclass) ) { t = (Table*)((Tnode*)(typ->ref))->ref; for (p = t->list; p != (Entry*) 0; p = p->next) { if (p->info.typ->type == Tpointer) i++; } } return i; } void in_defs(void) { int i; Tnode *p; for (i = 0; i < TYPES; i++) { for (p = Tptr[i]; p; p = p->next) { if (!is_element(p) && !is_transient(p) && p->type != Twchar && p->type != Tfun && p->type != Treference && p->type != Trvalueref && p->type != Tunion && !is_XML(p) && !is_header_or_fault(p) && !is_body(p) && !is_template(p)) { const char *s = xsi_type(p); if (!*s) s = wsdl_type(p, ""); if (*s == '-') continue; if (is_string(p)) fprintf(fout, "\n\tcase %s:\n\t{\tchar **s;\n\t\ts = soap_in_%s(soap, NULL, NULL, \"%s\");\n\t\treturn s ? *s : NULL;\n\t}", soap_type(p), c_ident(p), s); else if (is_wstring(p)) fprintf(fout, "\n\tcase %s:\n\t{\twchar_t **s;\n\t\ts = soap_in_%s(soap, NULL, NULL, \"%s\");\n\t\treturn s ? *s : NULL;\n\t}", soap_type(p), c_ident(p), s); else fprintf(fout, "\n\tcase %s:\n\t\treturn soap_in_%s(soap, NULL, NULL, \"%s\");", soap_type(p), c_ident(p), s); } } } } void in_defs2(void) { int i, j; Tnode *p; const char *s; for (i = 0; i < TYPES; i++) { /* make sure (wrapper) classes are checked first */ if (i == 0) j = Tclass; else if (i == Tclass) continue; else j = i; for (p = Tptr[j]; p; p = p->next) { if (!is_element(p) && !is_transient(p) && !is_template(p) && p->type != Twchar && p->type != Tfun && p->type != Treference && p->type != Trvalueref && p->type != Tunion && !is_XML(p) && !is_header_or_fault(p) && !is_body(p)) { s = xsi_type(p); if (!*s) s = wsdl_type(p, ""); if (*s == '-') continue; if (*s) { if (is_dynamic_array(p) && !is_binary(p) && !has_ns(p) && !is_untyped(p)) fprintf(fout, "\n\t\tif (*soap->arrayType && !soap_match_array(soap, \"%s\"))\n\t\t{\t*type = %s;\n\t\t\treturn soap_in_%s(soap, NULL, NULL, NULL);\n\t\t}", s, soap_type(p), c_ident(p)); else if (is_string(p)) fprintf(fout, "\n\t\tif (!soap_match_tag(soap, t, \"%s\"))\n\t\t{\tchar **s;\n\t\t\t*type = %s;\n\t\t\ts = soap_in_%s(soap, NULL, NULL, NULL);\n\t\t\treturn s ? *s : NULL;\n\t\t}", s, soap_type(p), c_ident(p)); else if (is_wstring(p)) fprintf(fout, "\n\t\tif (!soap_match_tag(soap, t, \"%s\"))\n\t\t{\twchar_t **s;\n\t\t\t*type = %s;\n\t\t\ts = soap_in_%s(soap, NULL, NULL, NULL);\n\t\t\treturn s ? *s : NULL;\n\t\t}", s, soap_type(p), c_ident(p)); else if (p->type != Tpointer) fprintf(fout, "\n\t\tif (!soap_match_tag(soap, t, \"%s\"))\n\t\t{\t*type = %s;\n\t\t\treturn soap_in_%s(soap, NULL, NULL, NULL);\n\t\t}", s, soap_type(p), c_ident(p)); } } } } } void in_defs3(void) { int i; Tnode *p; const char *s; for (i = 0; i < TYPES; i++) { for (p = Tptr[i]; p; p = p->next) { if (is_element(p) && !is_transient(p) && !is_template(p) && p->type != Twchar && p->type != Tfun && p->type != Treference && p->type != Trvalueref && p->type != Tunion && !is_XML(p) && !is_header_or_fault(p) && !is_body(p)) { s = xsi_type(p); if (!*s) s = wsdl_type(p, ""); if (*s == '-') continue; if (*s) { if (is_dynamic_array(p) && !is_binary(p) && !has_ns(p) && !is_untyped(p)) fprintf(fout, "\n\t\tif (*soap->arrayType && !soap_match_array(soap, \"%s\"))\n\t\t{\t*type = %s;\n\t\t\treturn soap_in_%s(soap, NULL, NULL, NULL);\n\t\t}", s, soap_type(p), c_ident(p)); else if (is_string(p)) fprintf(fout, "\n\t\tif (!soap_match_tag(soap, t, \"%s\"))\n\t\t{\tchar **s;\n\t\t\t*type = %s;\n\t\t\ts = soap_in_%s(soap, NULL, NULL, NULL);\n\t\t\treturn s ? *s : NULL;\n\t\t}", s, soap_type(p), c_ident(p)); else if (is_wstring(p)) fprintf(fout, "\n\t\tif (!soap_match_tag(soap, t, \"%s\"))\n\t\t{\twchar_t **s;\n\t\t\t*type = %s;\n\t\t\ts = soap_in_%s(soap, NULL, NULL, NULL);\n\t\t\treturn s ? *s : NULL;\n\t\t}", s, soap_type(p), c_ident(p)); else if (p->type != Tpointer) fprintf(fout, "\n\t\tif (!soap_match_tag(soap, t, \"%s\"))\n\t\t{\t*type = %s;\n\t\t\treturn soap_in_%s(soap, NULL, NULL, NULL);\n\t\t}", s, soap_type(p), c_ident(p)); } } } } } void out_defs(void) { int i; const char *s; Tnode *p; for (i = 0; i < TYPES; i++) { for (p = Tptr[i]; p; p = p->next) { if (is_transient(p) || is_template(p) || is_XML(p) || is_header_or_fault(p) || is_body(p)) continue; if (is_element(p)) { s = wsdl_type(p, ""); if (*s == '-') continue; if (p->type == Tarray) fprintf(fout, "\n\tcase %s:\n\t\treturn soap_out_%s(soap, \"%s\", id, (%s)ptr, NULL);", soap_type(p), c_ident(p), s, c_type_id((Tnode*)p->ref, "(*)")); else if (p->type == Tclass && !is_external(p) && !is_volatile(p) && !is_typedef(p)) fprintf(fout, "\n\tcase %s:\n\t\treturn ((%s)ptr)->soap_out(soap, \"%s\", id, NULL);", soap_type(p), c_type_id(p, "*"), s); else if (is_string(p)) fprintf(fout, "\n\tcase %s:\n\t\treturn soap_out_string(soap, \"%s\", id, (char*const*)(void*)&ptr, NULL);", soap_type(p), s); else if (is_wstring(p)) fprintf(fout, "\n\tcase %s:\n\t\treturn soap_out_wstring(soap, \"%s\", id, (wchar_t*const*)(void*)&ptr, NULL);", soap_type(p), s); else if (p->type == Tpointer) fprintf(fout, "\n\tcase %s:\n\t\treturn soap_out_%s(soap, \"%s\", id, (%s)ptr, NULL);", soap_type(p), c_ident(p), s, c_type_constptr_id(p, "const*")); else if (p->type != Tnone && p->type != Ttemplate && p->type != Twchar && !is_void(p) && p->type != Tfun && p->type != Treference && p->type != Trvalueref && p->type != Tunion) fprintf(fout, "\n\tcase %s:\n\t\treturn soap_out_%s(soap, \"%s\", id, (const %s)ptr, NULL);", soap_type(p), c_ident(p), s, c_type_id(p, "*")); } else { s = xsi_type(p); if (!*s) s = wsdl_type(p, ""); if (*s == '-') continue; if (p->type == Tarray) fprintf(fout, "\n\tcase %s:\n\t\treturn soap_out_%s(soap, tag, id, (%s)ptr, \"%s\");", soap_type(p), c_ident(p), c_type_id((Tnode*)p->ref, "(*)"), s); else if (p->type == Tclass && !is_external(p) && !is_volatile(p) && !is_typedef(p)) fprintf(fout, "\n\tcase %s:\n\t\treturn ((%s)ptr)->soap_out(soap, tag, id, \"%s\");", soap_type(p), c_type_id(p, "*"), s); else if (is_string(p)) fprintf(fout, "\n\tcase %s:\n\t\treturn soap_out_string(soap, tag, id, (char*const*)(void*)&ptr, \"%s\");", soap_type(p), s); else if (is_wstring(p)) fprintf(fout, "\n\tcase %s:\n\t\treturn soap_out_wstring(soap, tag, id, (wchar_t*const*)(void*)&ptr, \"%s\");", soap_type(p), s); else if (p->type == Tpointer) fprintf(fout, "\n\tcase %s:\n\t\treturn soap_out_%s(soap, tag, id, (%s)ptr, \"%s\");", soap_type(p), c_ident(p), c_type_constptr_id(p, "const*"), s); else if (p->type != Tnone && p->type != Ttemplate && p->type != Twchar && !is_void(p) && p->type != Tfun && p->type != Treference && p->type != Trvalueref && p->type != Tunion) fprintf(fout, "\n\tcase %s:\n\t\treturn soap_out_%s(soap, tag, id, (const %s)ptr, \"%s\");", soap_type(p), c_ident(p), c_type_id(p, "*"), s); } } } } void mark_defs() { int i; Tnode *p; for (i = 0; i < TYPES; i++) { for (p = Tptr[i]; p; p = p->next) { if (is_transient(p) || is_template(p) || is_XML(p) || is_header_or_fault(p) || is_body(p) || is_void(p)) continue; if (p->type == Tarray) continue; else if (p->type == Tclass && !is_external(p) && !is_volatile(p) && !is_typedef(p)) fprintf(fout, "\n\tcase %s:\n\t\t((%s)ptr)->soap_serialize(soap);\n\t\tbreak;", soap_type(p), c_type_id(p, "*")); else if (is_string(p)) fprintf(fout, "\n\tcase %s:\n\t\tsoap_serialize_string(soap, (char*const*)(void*)&ptr);\n\t\tbreak;", soap_type(p)); else if (is_wstring(p)) fprintf(fout, "\n\tcase %s:\n\t\tsoap_serialize_wstring(soap, (wchar_t*const*)(void*)&ptr);\n\t\tbreak;", soap_type(p)); else if (p->type == Tpointer) fprintf(fout, "\n\tcase %s:\n\t\tsoap_serialize_%s(soap, (%s)ptr);\n\t\tbreak;", soap_type(p), c_ident(p), c_type_constptr_id(p, "const*")); else if (p->type == Ttemplate && p->ref) fprintf(fout, "\n\tcase %s:\n\t\tsoap_serialize_%s(soap, (const %s)ptr);\n\t\tbreak;", soap_type(p), c_ident(p), c_type_id(p, "*")); else if (!is_primitive(p) && p->type != Tnone && p->type != Ttemplate && !is_void(p) && p->type != Tfun && p->type != Treference && p->type != Trvalueref && p->type != Tunion) fprintf(fout, "\n\tcase %s:\n\t\tsoap_serialize_%s(soap, (const %s)ptr);\n\t\tbreak;", soap_type(p), c_ident(p), c_type_id(p, "*")); } } } void dup_defs() { int i; Tnode *p; for (i = 0; i < TYPES; i++) { for (p = Tptr[i]; p; p = p->next) { if (is_transient(p) || is_template(p) || is_XML(p) || is_header_or_fault(p) || is_body(p) || is_void(p)) continue; if (p->type == Tarray) continue; else if (p->type == Tclass && !is_external(p) && !is_volatile(p) && !is_typedef(p)) fprintf(fout, "\n\tcase %s:\n\t\treturn (void*)((%s)ptr)->soap_dup(soap);", soap_type(p), c_type_id(p, "*")); else if (is_string(p)) fprintf(fout, "\n\tcase %s:\n\t\treturn (void*)soap_strdup(soap, (const char*)ptr);", soap_type(p)); else if (is_wstring(p)) fprintf(fout, "\n\tcase %s:\n\t\treturn (void*)soap_wstrdup(soap, (const wchar_t*)ptr);", soap_type(p)); else if (p->type == Tpointer) fprintf(fout, "\n\tcase %s:\n\t\treturn (void*)soap_dup_%s(soap, NULL, (%s)ptr);", soap_type(p), c_ident(p), c_type_constptr_id(p, "const*")); else if (p->type == Ttemplate && p->ref) fprintf(fout, "\n\tcase %s:\n\t\treturn (void*)soap_dup_%s(soap, NULL, (const %s)ptr);", soap_type(p), c_ident(p), c_type_id(p, "*")); else if (!is_primitive(p) && p->type != Tnone && p->type != Ttemplate && !is_void(p) && p->type != Tfun && p->type != Treference && p->type != Trvalueref && p->type != Tunion) fprintf(fout, "\n\tcase %s:\n\t\treturn (void*)soap_dup_%s(soap, NULL, (const %s)ptr);", soap_type(p), c_ident(p), c_type_id(p, "*")); else if (p->type != Tnone && p->type != Ttemplate && !is_void(p) && p->type != Tfun && p->type != Treference && p->type != Trvalueref && p->type != Tunion) fprintf(fout, "\n\tcase %s:\n\t\treturn soap_memdup(soap, ptr, sizeof(%s));", soap_type(p), c_type(p)); } } } void del_defs() { int i; Tnode *p; for (i = 0; i < TYPES; i++) { for (p = Tptr[i]; p; p = p->next) { if (is_transient(p) || is_template(p) || is_XML(p) || is_header_or_fault(p) || is_body(p) || is_void(p)) continue; if (p->type == Tarray) continue; else if (p->type == Tclass && !is_external(p) && !is_volatile(p) && !is_typedef(p)) fprintf(fout, "\n\tcase %s:\n\t\tstatic_cast(ptr)->soap_del();\n\t\tSOAP_DELETE(static_cast(ptr));\n\t\tbreak;", soap_type(p), c_type(p), c_type(p)); else if (is_string(p)) fprintf(fout, "\n\tcase %s:\n\t\tsoap_del_string((char*const*)(void*)&ptr);\n\t\tbreak;", soap_type(p)); else if (is_wstring(p)) fprintf(fout, "\n\tcase %s:\n\t\tsoap_del_wstring((wchar_t*const*)(void*)&ptr);\n\t\tbreak;", soap_type(p)); else if (p->type == Tpointer) fprintf(fout, "\n\tcase %s:\n\t\tsoap_del_%s((%s)ptr);\n\t\tSOAP_FREE(NULL, ptr);\n\t\tbreak;", soap_type(p), c_ident(p), c_type_constptr_id(p, "const*")); else if (p->type == Ttemplate && p->ref) fprintf(fout, "\n\tcase %s:\n\t\tsoap_del_%s((const %s)ptr);\n\t\tSOAP_DELETE(static_cast(ptr));\n\t\tbreak;", soap_type(p), c_ident(p), c_type_id(p, "*"), c_type(p)); else if (!is_primitive(p) && p->type != Tnone && p->type != Ttemplate && !is_void(p) && p->type != Tfun && p->type != Treference && p->type != Trvalueref && p->type != Tunion) { if (!cflag && p->type == Tstruct) fprintf(fout, "\n\tcase %s:\n\t\tsoap_del_%s((const %s)ptr);\n\t\tSOAP_DELETE(static_cast(ptr));\n\t\tbreak;", soap_type(p), c_ident(p), c_type_id(p, "*"), c_type(p)); else fprintf(fout, "\n\tcase %s:\n\t\tsoap_del_%s((const %s)ptr);\n\t\tSOAP_FREE(NULL, ptr);\n\t\tbreak;", soap_type(p), c_ident(p), c_type_id(p, "*")); } else if (p->type != Tnone && p->type != Ttemplate && !is_void(p) && p->type != Tfun && p->type != Treference && p->type != Trvalueref && p->type != Tunion) fprintf(fout, "\n\tcase %s:\n\t\tSOAP_FREE(NULL, (const %s)ptr);\n\t\tbreak;", soap_type(p), c_type_id(p, "*")); } } } void in_attach(void) { int i; Tnode *p; for (i = 0; i < TYPES; i++) { for (p = Tptr[i]; p; p = p->next) { if (is_attachment(p)) { if (p->type == Tclass) fprintf(fout, "\n\t\tcase %s:\n\t\t{\t%s a;\n\t\t\ta = (%s)soap_id_enter(soap, soap->dime.id, NULL, %s, sizeof(%s), NULL, NULL, %s_instantiate, %s_fbase);\n\t\t\tif (a)\n\t\t\t{\ta->__ptr = (unsigned char*)soap->dime.ptr;\n\t\t\t\ta->__size = soap->dime.size;\n\t\t\t\ta->id = (char*)soap->dime.id;\n\t\t\t\ta->type = (char*)soap->dime.type;\n\t\t\t\ta->options = (char*)soap->dime.options;\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn soap->error;\n\t\t\tbreak;\n\t\t}", soap_type(p), c_type_id(p, "*"), c_type_id(p, "*"), soap_type(p), c_type(p), prefix, prefix); else fprintf(fout, "\n\t\tcase %s:\n\t\t{\t%s a;\n\t\t\ta = (%s)soap_id_enter(soap, soap->dime.id, NULL, %s, sizeof(%s), NULL, NULL, NULL, NULL);\n\t\t\tif (!a)\n\t\t\t\treturn soap->error;\n\t\t\ta->__ptr = (unsigned char*)soap->dime.ptr;\n\t\t\ta->__size = soap->dime.size;\n\t\t\ta->id = (char*)soap->dime.id;\n\t\t\ta->type = (char*)soap->dime.type;\n\t\t\ta->options = (char*)soap->dime.options;\n\t\t\tbreak;\n\t\t}", soap_type(p), c_type_id(p, "*"), c_type_id(p, "*"), soap_type(p), c_type(p)); } else if (is_binary(p) && !is_transient(p)) { if (p->type == Tclass) fprintf(fout, "\n\t\tcase %s:\n\t\t{\t%s a;\n\t\t\ta = (%s)soap_id_enter(soap, soap->dime.id, NULL, %s, sizeof(%s), NULL, NULL, %s_instantiate, %s_fbase);\n\t\t\tif (!a)\n\t\t\t\treturn soap->error;\n\t\t\ta->__ptr = (unsigned char*)soap->dime.ptr;\n\t\t\ta->__size = soap->dime.size;\n\t\t\tbreak;\n\t\t}", soap_type(p), c_type_id(p, "*"), c_type_id(p, "*"), soap_type(p), c_type(p), prefix, prefix); else fprintf(fout, "\n\t\tcase %s:\n\t\t{\t%s a;\n\t\t\ta = (%s)soap_id_enter(soap, soap->dime.id, NULL, %s, sizeof(%s), NULL, NULL, NULL, NULL);\n\t\t\tif (!a)\n\t\t\t\treturn soap->error;\n\t\t\ta->__ptr = (unsigned char*)soap->dime.ptr;\n\t\t\ta->__size = soap->dime.size;\n\t\t\tbreak;\n\t\t}", soap_type(p), c_type_id(p, "*"), c_type_id(p, "*"), soap_type(p), c_type(p)); } } } } void soap_instantiate(Tnode *typ) { Table *Tptr; Entry *Eptr; int derclass = 0, flag = 0; const char *s; if (cflag) return; if (typ->type != Tstruct && typ->type != Tclass && typ->type != Ttemplate) return; if (typ->type != Tclass || !typ->sym || !is_eq(typ->sym->name, "xsd__QName") || is_imported(typ)) { if ((is_typedef(typ) && !is_external(typ)) || is_synonym(typ)) { fprintf(fhead, "\n\n#define soap_instantiate_%s soap_instantiate_%s\n", c_ident(typ), t_ident(typ)); fprintf(fhead, "\n\n#define soap_new_%s soap_new_%s\n", c_ident(typ), t_ident(typ)); if ((typ->type == Tclass || typ->type == Tstruct) && typ->ref) { fprintf(fhead, "\n\n#define soap_new_req_%s soap_new_req_%s\n", c_ident(typ), t_ident(typ)); fprintf(fhead, "\n\n#define soap_new_set_%s soap_new_set_%s\n", c_ident(typ), t_ident(typ)); } return; } } fprintf(fhead, "\nSOAP_FMAC1 %s * SOAP_FMAC2 soap_instantiate_%s(struct soap*, int, const char*, const char*, size_t*);", c_type(typ), c_ident(typ)); fprintf(fhead, "\n\ninline %s * soap_new_%s(struct soap *soap, int n = -1) { return soap_instantiate_%s(soap, n, NULL, NULL, NULL); }", c_type(typ), c_ident(typ), c_ident(typ)); if (typ->type == Tclass || typ->type == Tstruct) { fprintf(fhead, "\n\ninline %s * soap_new_req_%s(\n\tstruct soap *soap", c_type(typ), c_ident(typ)); if (!is_dynamic_array(typ)) { for (Tptr = (Table*)typ->ref, derclass = 0; Tptr; Tptr = Tptr->prev, derclass++) { for (Eptr = Tptr->list; Eptr; Eptr = Eptr->next) { if (is_repetition(Eptr) || is_anytype(Eptr)) flag = 2; if ((Eptr->info.minOccurs > 0 || flag) && !(Eptr->info.sto & (Sprivate | Sprotected | Sconst | Sstatic | Stypedef)) && Eptr->info.typ->type != Tfun && strcmp(Eptr->sym->name, "soap")) { if (flag) flag--; if (is_smart(Eptr->info.typ)) { if (is_smart_shared(Eptr->info.typ)) fprintf(fhead, ",\n\t%s %s", c_type_id(Eptr->info.typ, "&"), ident(Eptr->sym->name)); else fprintf(fhead, ",\n\t%s %s", c_type_id(Eptr->info.typ->ref, "*"), ident(Eptr->sym->name)); } else if (Eptr->info.typ->type == Ttemplate && is_smart(Eptr->info.typ->ref) && !is_smart_shared(Eptr->info.typ->ref)) continue; else if (Eptr->info.typ->type == Tclass || Eptr->info.typ->type == Tstruct || Eptr->info.typ->type == Tunion || Eptr->info.typ->type == Ttemplate) fprintf(fhead, ",\n\tconst %s& %s", c_type(Eptr->info.typ), ident(Eptr->sym->name)); else if ((Eptr->info.sto & Sconstptr)) fprintf(fhead, ",\n\tconst %s", c_type_id(Eptr->info.typ, Eptr->sym->name)); else if (Eptr->info.typ->type == Tarray) fprintf(fhead, ",\n\t%s const*%s", c_type(Eptr->info.typ->ref), ident(Eptr->sym->name)); else fprintf(fhead, ",\n\t%s", c_type_id(Eptr->info.typ, Eptr->sym->name)); if (derclass) fprintf(fhead, "%d", derclass); } } } } fprintf(fhead, ")\n{\t%s = soap_new_%s(soap);\n\tif (_p)\n\t{\t", c_type_id(typ, "*_p"), c_ident(typ)); if (!is_external(typ)) { if (typ->type == Tclass && !is_volatile(typ)) fprintf(fhead, "_p->soap_default(soap);"); else fprintf(fhead, "soap_default_%s(soap, _p);", c_ident(typ)); } flag = 0; if (!is_dynamic_array(typ)) { for (Tptr = (Table*)typ->ref, derclass = 0; Tptr; Tptr = Tptr->prev, derclass++) { for (Eptr = Tptr->list; Eptr; Eptr = Eptr->next) { if (is_repetition(Eptr) || is_anytype(Eptr)) flag = 2; if ((Eptr->info.minOccurs > 0 || flag) && !(Eptr->info.sto & (Sprivate | Sprotected | Sconst | Sstatic | Stypedef)) && Eptr->info.typ->type != Tfun && strcmp(Eptr->sym->name, "soap")) { if (flag) flag--; if (is_smart(Eptr->info.typ) && !is_smart_shared(Eptr->info.typ)) /* smart but not shared */ { if (typ->type == Tclass) fprintf(fhead, "\n\t\t_p->%s::%s = %s(%s", ident(Tptr->sym->name), ident(Eptr->sym->name), c_type(Eptr->info.typ), ident(Eptr->sym->name)); else fprintf(fhead, "\n\t\t_p->%s = %s(%s", ident(Eptr->sym->name), c_type(Eptr->info.typ), ident(Eptr->sym->name)); } else if (Eptr->info.typ->type == Tarray) { if (is_fixedstring(Eptr->info.typ)) fprintf(fhead, "\n\t\tsoap_strcpy(_p->%s::%s, %d, %s", ident(Tptr->sym->name), ident(Eptr->sym->name), get_dimension(Eptr->info.typ), ident(Eptr->sym->name)); else if (typ->type == Tclass) fprintf(fhead, "\n\t\tfor (int i = 0; i < %d; i++) _p->%s::%s[i] = %s", get_dimension(Eptr->info.typ), ident(Tptr->sym->name), ident(Eptr->sym->name), ident(Eptr->sym->name)); else fprintf(fhead, "\n\t\tfor (int i = 0; i < %d; i++) _p->%s[i] = %s", get_dimension(Eptr->info.typ), ident(Eptr->sym->name), ident(Eptr->sym->name)); } else if (Eptr->info.typ->type == Ttemplate && is_smart(Eptr->info.typ->ref) && !is_smart_shared(Eptr->info.typ->ref)) continue; else if (typ->type == Tclass) fprintf(fhead, "\n\t\t_p->%s::%s = %s", ident(Tptr->sym->name), ident(Eptr->sym->name), ident(Eptr->sym->name)); else fprintf(fhead, "\n\t\t_p->%s = %s", ident(Eptr->sym->name), ident(Eptr->sym->name)); if (derclass) fprintf(fhead, "%d", derclass); if (is_fixedstring(Eptr->info.typ)) fprintf(fhead, ");"); else if (Eptr->info.typ->type == Tarray) fprintf(fhead, "[i];"); else if (is_smart(Eptr->info.typ) && !is_smart_shared(Eptr->info.typ)) /* smart but not shared */ fprintf(fhead, ");"); else fprintf(fhead, ";"); } } } } fprintf(fhead, "\n\t}\n\treturn _p;\n}"); fprintf(fhead, "\n\ninline %s * soap_new_set_%s(\n\tstruct soap *soap", c_type(typ), c_ident(typ)); for (Tptr = (Table*)typ->ref, derclass = 0; Tptr; Tptr = Tptr->prev, derclass++) { for (Eptr = Tptr->list; Eptr; Eptr = Eptr->next) { if (!(Eptr->info.sto & (Sprivate | Sprotected | Sconst | Sstatic | Stypedef)) && Eptr->info.typ->type != Tfun && strcmp(Eptr->sym->name, "soap")) { if (is_smart(Eptr->info.typ)) { if (is_smart_shared(Eptr->info.typ)) fprintf(fhead, ",\n\t%s %s", c_type_id(Eptr->info.typ, "&"), ident(Eptr->sym->name)); else fprintf(fhead, ",\n\t%s %s", c_type_id(Eptr->info.typ->ref, "*"), ident(Eptr->sym->name)); } else if (Eptr->info.typ->type == Ttemplate && is_smart(Eptr->info.typ->ref) && !is_smart_shared(Eptr->info.typ->ref)) continue; else if (Eptr->info.typ->type == Tclass || Eptr->info.typ->type == Tstruct || Eptr->info.typ->type == Tunion || Eptr->info.typ->type == Ttemplate) fprintf(fhead, ",\n\tconst %s& %s", c_type(Eptr->info.typ), ident(Eptr->sym->name)); else if ((Eptr->info.sto & Sconstptr)) fprintf(fhead, ",\n\tconst %s", c_type_id(Eptr->info.typ, Eptr->sym->name)); else if (Eptr->info.typ->type == Tarray) fprintf(fhead, ",\n\t%s const*%s", c_type(Eptr->info.typ->ref), ident(Eptr->sym->name)); else fprintf(fhead, ",\n\t%s", c_type_id(Eptr->info.typ, Eptr->sym->name)); if (derclass) fprintf(fhead, "%d", derclass); } } } fprintf(fhead, ")\n{\t%s = soap_new_%s(soap);\n\tif (_p)\n\t{\t", c_type_id(typ, "*_p"), c_ident(typ)); if (!is_external(typ)) { if (typ->type == Tclass && !is_volatile(typ)) fprintf(fhead, "_p->soap_default(soap);"); else fprintf(fhead, "soap_default_%s(soap, _p);", c_ident(typ)); } for (Tptr = (Table*)typ->ref, derclass = 0; Tptr; Tptr = Tptr->prev, derclass++) { for (Eptr = Tptr->list; Eptr; Eptr = Eptr->next) { if (!(Eptr->info.sto & (Sprivate | Sprotected | Sconst | Sstatic | Stypedef)) && Eptr->info.typ->type != Tfun && strcmp(Eptr->sym->name, "soap")) { if (is_smart(Eptr->info.typ) && !is_smart_shared(Eptr->info.typ)) /* smart but not shared */ { if (typ->type == Tclass) fprintf(fhead, "\n\t\t_p->%s::%s = %s(%s", ident(Tptr->sym->name), ident(Eptr->sym->name), c_type(Eptr->info.typ), ident(Eptr->sym->name)); else fprintf(fhead, "\n\t\t_p->%s = %s(%s", ident(Eptr->sym->name), c_type(Eptr->info.typ), ident(Eptr->sym->name)); } else if (Eptr->info.typ->type == Tarray) { if (is_fixedstring(Eptr->info.typ)) fprintf(fhead, "\n\t\tsoap_strcpy(_p->%s::%s, %d, %s", ident(Tptr->sym->name), ident(Eptr->sym->name), get_dimension(Eptr->info.typ), ident(Eptr->sym->name)); else if (typ->type == Tclass) fprintf(fhead, "\n\t\tfor (int i = 0; i < %d; i++) _p->%s::%s[i] = %s", get_dimension(Eptr->info.typ), ident(Tptr->sym->name), ident(Eptr->sym->name), ident(Eptr->sym->name)); else fprintf(fhead, "\n\t\tfor (int i = 0; i < %d; i++) _p->%s[i] = %s", get_dimension(Eptr->info.typ), ident(Eptr->sym->name), ident(Eptr->sym->name)); } else if (Eptr->info.typ->type == Ttemplate && is_smart(Eptr->info.typ->ref) && !is_smart_shared(Eptr->info.typ->ref)) continue; else if (typ->type == Tclass) fprintf(fhead, "\n\t\t_p->%s::%s = %s", ident(Tptr->sym->name), ident(Eptr->sym->name), ident(Eptr->sym->name)); else fprintf(fhead, "\n\t\t_p->%s = %s", ident(Eptr->sym->name), ident(Eptr->sym->name)); if (derclass) fprintf(fhead, "%d", derclass); if (is_fixedstring(Eptr->info.typ)) fprintf(fhead, ");"); else if (Eptr->info.typ->type == Tarray) fprintf(fhead, "[i];"); else if (is_smart(Eptr->info.typ) && !is_smart_shared(Eptr->info.typ)) /* smart but not shared */ fprintf(fhead, ");"); else fprintf(fhead, ";"); } } } fprintf(fhead, "\n\t}\n\treturn _p;\n}"); } /* deprecated fprintf(fhead, "\n\ninline void soap_delete_%s(struct soap *soap, %s) { soap_delete(soap, p); }", c_ident(typ), c_type_id(typ, "*p")); */ fprintf(fout, "\n\nSOAP_FMAC1 %s * SOAP_FMAC2 soap_instantiate_%s(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size)", c_type(typ), c_ident(typ)); fprintf(fout, "\n{"); fprintf(fout, "\n\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"soap_instantiate_%s(%%p, %%d, %%s, %%s)\\n\", soap, n, type?type:\"\", arrayType?arrayType:\"\"));", c_ident(typ)); fprintf(fout, "\n\t(void)type; (void)arrayType; /* appease -Wall -Werror */"); for (Eptr = classtable->list; Eptr; Eptr = Eptr->next) { Tptr = ((Table *) Eptr->info.typ->ref); if (Tptr == ((Table *) typ->ref)) { continue; } derclass = 0; while (Tptr) { if (Tptr == (Table*)typ->ref) { derclass = 1; } Tptr = Tptr->prev; } if (derclass == 1 && !is_transient(Eptr->info.typ)) { if (is_dynamic_array(Eptr->info.typ) && !is_binary(Eptr->info.typ) && !has_ns(Eptr->info.typ) && !is_untyped(Eptr->info.typ)) fprintf(fout, "\n\tif (soap && arrayType && !soap_match_tag(soap, arrayType, \"%s\"))", xsi_type(Eptr->info.typ)); else fprintf(fout, "\n\tif (soap && type && !soap_match_tag(soap, type, \"%s\"))", the_type(Eptr->info.typ)); fprintf(fout, "\n\t\treturn soap_instantiate_%s(soap, n, NULL, NULL, size);", c_ident(Eptr->info.typ)); derclass = 0; } } fprintf(fout, "\n\t%s;\n\tsize_t k = sizeof(%s);", c_type_id(typ, "*p"), c_type(typ)); fprintf(fout, "\n\tif (n < 0)"); fprintf(fout, "\n\t{\tp = SOAP_NEW(%s);", c_type(typ)); if ((s = has_soapref(typ))) fprintf(fout, "\n\t\tif (p)\n\t\t\t((%s*)p)->%s = soap;", c_type(typ), s); fprintf(fout, "\n\t}\n\telse"); fprintf(fout, "\n\t{\tp = SOAP_NEW_ARRAY(%s, n);", c_type(typ)); fprintf(fout, "\n\t\tk *= n;"); if (s) fprintf(fout, "\n\t\tif (p)\n\t\t\tfor (int i = 0; i < n; i++)\n\t\t\t\t((%s*)p)[i].%s = soap;", c_type(typ), s); fprintf(fout, "\n\t}"); fprintf(fout, "\n\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"Instantiated %s location=%%p n=%%d\\n\", p, n));", c_type(typ)); fprintf(fout, "\n\tsoap_link(soap, p, %s, n, %s_fdelete);", soap_type(typ), prefix); fprintf(fout, "\n\tif (size)\n\t\t*size = k;"); fprintf(fout, "\n\treturn p;"); fprintf(fout, "\n}"); } void soap_dup(Tnode *typ) { if (!Ecflag) return; if (typ->type != Tstruct && typ->type != Tclass && typ->type != Ttemplate && typ->type != Tpointer) return; if (typ->type != Tclass || !(typ->sym && (is_stdstring(typ) || is_stdwstring(typ)) && is_eq(typ->sym->name, "xsd__QName")) || is_imported(typ)) { if ((is_typedef(typ) && !is_external(typ)) || is_synonym(typ)) { fprintf(fhead, "\n\n#define soap_dup_%s soap_dup_%s\n", c_ident(typ), t_ident(typ)); return; } } if (typ->type == Tstruct && (is_anyType(typ) || is_anyAttribute(typ))) return; fprintf(fhead, "\n\nSOAP_FMAC3 %s * SOAP_FMAC4 soap_dup_%s(struct soap*, %s*, %s);", c_type(typ), c_ident(typ), c_type(typ), c_type_constptr_id(typ, "const*")); fprintf(fout, "\n\nSOAP_FMAC3 %s * SOAP_FMAC4 soap_dup_%s(struct soap *soap, %s *d, %s)\n{", c_type(typ), c_ident(typ), c_type(typ), c_type_constptr_id(typ, "const*a")); if (typ->type == Tclass || typ->type == Tstruct) { fprintf(fout, "\n\tstruct soap_plist *pp = NULL;"); if (typ->recursive) fprintf(fout, "\n\tchar *mark = NULL;"); } fprintf(fout, "\n\tif (!a)\n\t\treturn NULL;"); if (typ->type == Tclass || typ->type == Tstruct) { if (typ->recursive) fprintf(fout, "\n\tif (!d && ((d = (%s*)soap_mark_lookup(soap, (const void*)a, %s, &pp, &mark)) || soap_mark_cycle(soap, pp)))\n\t\treturn d;", c_type(typ), soap_type(typ)); else fprintf(fout, "\n\tif (!d && (d = (%s*)soap_mark_lookup(soap, (const void*)a, %s, &pp, NULL)))\n\t\treturn d;", c_type(typ), soap_type(typ)); } if (cflag) fprintf(fout, "\n\tif (!d && !(d = (%s*)soap_malloc(soap, sizeof(%s))))\n\t\treturn NULL; /* ERROR */", c_type(typ), c_type(typ)); else if (typ->type == Tpointer) fprintf(fout, "\n\tif (!d && !(d = (%s*)soap_malloc(soap, sizeof(%s))))\n\t\treturn NULL; /* ERROR */", c_type(typ), c_type(typ)); else fprintf(fout, "\n\tif (!d && !(d = soap_new_%s(soap)))\n\t\treturn NULL; /* ERROR */", c_ident(typ)); if (typ->type == Tclass || typ->type == Tstruct) fprintf(fout, "\n\tsoap_mark_dup(soap, (void*)d, pp);"); fflush(fout); if (is_string(typ)) { fprintf(fout, "\n\t*d = NULL;\n\tif (*a)\n\t{\tstruct soap_plist *pp = NULL;\n\t\tif (!(*d = (%s)soap_mark_lookup(soap, (const void*)*a, %s, &pp, NULL)))", c_type(typ), soap_type(typ)); fprintf(fout, "\n\t\t\tsoap_mark_dup(soap, *d = soap_strdup(soap, *a), pp);\n\t}\n\telse\n\t\t*d = NULL;"); } else if (is_wstring(typ)) { fprintf(fout, "\n\tif (*a)\n\t{\tstruct soap_plist *pp = NULL;\n\t\tif (!(*d = (%s)soap_mark_lookup(soap, (const void*)*a, %s, &pp, NULL)))", c_type(typ), soap_type(typ)); fprintf(fout, "\n\t\t\tsoap_mark_dup(soap, *d = soap_wstrdup(soap, *a), pp);\n\t}\n\telse\n\t\t*d = NULL;"); } else if (typ->type == Tpointer) { Tnode *ref = typ->ref; if (ref->type == Tclass && !is_external(ref) && !is_volatile(ref) && !is_typedef(ref)) { fprintf(fout, "\n\tif (*a)\n\t\t*d = (*a)->soap_dup(soap);\n\telse\n\t\t*d = NULL;"); } else if (is_XML(ref) && is_string(ref)) { if (cflag) fprintf(fout, "\n\tif (*a && (*d = (%s)soap_malloc(soap, sizeof(%s))))\n\t\t**d = soap_strdup(soap, **a);\n\telse\n\t\t*d = NULL;", c_type(typ), c_type(ref)); else fprintf(fout, "\n\tif (*a && (*d = (%s)soap_malloc(soap, sizeof(%s))))\n\t\t**d = soap_strdup(soap, **a);\n\telse\n\t\t*d = NULL;", c_type(typ), c_type(ref)); } else if (is_XML(ref) && is_wstring(ref)) { if (cflag) fprintf(fout, "\n\tif (*a && (*d = (%s)soap_malloc(soap, sizeof(%s))))\n\t\t**d = soap_wstrdup(soap, **a);\n\telse\n\t\t*d = NULL;", c_type(typ), c_type(ref)); else fprintf(fout, "\n\tif (*a && (*d = (%s)soap_malloc(soap, sizeof(%s))))\n\t\t**d = soap_wstrdup(soap, **a);\n\telse\n\t\t*d = NULL;", c_type(typ), c_type(ref)); } else if (is_primitive(ref) || is_external(typ) || is_volatile(ref) || is_transient(ref)) { if (cflag) fprintf(fout, "\n\tif (*a && (*d = (%s)soap_malloc(soap, sizeof(%s))))\n\t\t**d = **a;\n\telse\n\t\t*d = NULL;", c_type(typ), c_type(ref)); else if (is_primitive(ref)) fprintf(fout, "\n\tif (*a && (*d = (%s)soap_malloc(soap, sizeof(%s))))\n\t\t**d = **a;\n\telse\n\t\t*d = NULL;", c_type(typ), c_type(ref)); else fprintf(fout, "\n\tif (*a && (*d = soap_new_%s(soap)))\n\t\t**d = **a;\n\telse\n\t\t*d = NULL;", c_ident(ref)); if (!is_primitive(ref) && is_transient(ref)) fprintf(fout, " /* transient (shallow copy) */"); } else if (ref->type == Tclass || ref->type == Tstruct || ref->type == Ttemplate || ref->type == Tpointer) { fprintf(fout, "\n\tif (*a)\n\t\t*d = soap_dup_%s(soap, NULL, *a);\n\telse\n\t\t*d = NULL;", c_ident(ref)); } } else if (is_smart(typ)) { Tnode *ref = typ->ref; if (is_smart_shared(typ)) { fprintf(fout, "\n\tif (*a)\n\t{\tstruct soap_plist *pp = NULL;\n\t\tchar *mark = NULL;\n\t\t%s *sp = (%s*)soap_mark_lookup(soap, (const void*)a->get(), %s, &pp, &mark);\n\t\tif (sp)\n\t\t\t*d = *sp;\n\t\telse if (soap_mark_cycle(soap, pp))\n\t\t\treturn d;\n\t\telse\n\t\t{\t", c_type(typ), c_type(typ), soap_type(typ)); if (ref->type == Tclass && !is_external(ref) && !is_volatile(ref) && !is_typedef(ref) && !is_transient(ref)) fprintf(fout, "*d = %s((*a)->soap_alloc());\n\t\t\tsoap_mark_dup(soap, (void*)d, pp);\n\t\t\t(*a)->soap_dup(soap, (void*)d->get());", c_type(typ)); else if (is_primitive(ref) || is_external(ref) || is_volatile(ref) || is_transient(ref)) fprintf(fout, "*d = %s<%s>(**a);", make_shared(typ), c_type(ref)); else if (ref->type == Tclass || ref->type == Tstruct || ref->type == Ttemplate || ref->type == Tpointer) fprintf(fout, "*d = %s<%s>();\n\t\t\tsoap_mark_dup(soap, (void*)d, pp);\n\t\t\tsoap_dup_%s(soap, d->get(), a->get());", make_shared(typ), c_type(ref), c_ident(ref)); fprintf(fout, "\n\t\t\tsoap_unmark(soap, mark);\n\t\t}\n\t}"); } else { if (ref->type == Tclass && !is_external(ref) && !is_volatile(ref) && !is_typedef(ref) && !is_transient(ref)) fprintf(fout, "\n\tif (*a)\n\t\t*d = %s((*a)->soap_dup(soap, (void*)(*a)->soap_alloc()));", c_type(typ)); else if (is_primitive(ref) || is_transient(ref)) fprintf(fout, "\n\tif (*a && (*d = %s(SOAP_NEW(%s))))\n\t\t**d = **a;", c_type(typ), c_type(ref)); else if (ref->type == Tclass || ref->type == Tstruct || ref->type == Ttemplate || ref->type == Tpointer) fprintf(fout, "\n\tif (*a)\n\t\t*d = %s(soap_dup_%s(soap, SOAP_NEW(%s), a->get()));", c_type(typ), c_ident(ref), c_type(ref)); } } else if (typ->type == Ttemplate) { Tnode *ref = typ->ref; if (strcmp(typ->id->name, "std::set") || is_primitive(ref) || is_external(ref) || is_volatile(ref) || is_transient(ref)) fprintf(fout, "\n\t*d = *a;"); if (!is_primitive(ref) && !is_external(ref) && !is_volatile(ref) && !is_transient(ref)) { if (!strcmp(typ->id->name, "std::set")) { fprintf(fout, "\n\t%s v;\n\tfor (%s::const_iterator i = a->begin(); i != a->end(); ++i)\n\t{\t", c_type(ref), c_type(typ)); if (is_XML(ref) && is_string(ref)) fprintf(fout, "v = soap_strdup(soap, *i);\n\t\td->insert(v);"); else if (is_XML(ref) && is_wstring(ref)) fprintf(fout, "v = soap_wstrdup(soap, *i);\n\t\td->insert(v);"); else if (ref->type == Tclass || ref->type == Tstruct || ref->type == Ttemplate || ref->type == Tpointer) fprintf(fout, "soap_dup_%s(soap, &v, &*i);\n\t\td->insert(v);", c_ident(ref)); else fprintf(fout, "\n\t\td->insert(*i);"); } else { fprintf(fout, "\n\t%s::iterator j = d->begin();\n\tfor (%s::const_iterator i = a->begin(); i != a->end(); ++i, ++j)\n\t{\t", c_type(typ), c_type(typ)); if (is_XML(ref) && is_string(ref)) fprintf(fout, "*j = soap_strdup(soap, *i);"); else if (is_XML(ref) && is_wstring(ref)) fprintf(fout, "*j = soap_wstrdup(soap, *i);"); else if (ref->type == Tclass || ref->type == Tstruct || ref->type == Ttemplate || ref->type == Tpointer) fprintf(fout, "soap_dup_%s(soap, &*j, &*i);", c_ident(ref)); } fprintf(fout, "\n\t}"); } } else if (typ->ref) { Entry *p = is_dynamic_array(typ); if (p) { if (is_binary(typ)) { if (cflag) fprintf(fout, "\n\td->__ptr = NULL;\n\td->__size = a->__size;\n\tif (a->__ptr && a->__size > 0)\n\t{\td->__ptr = (unsigned char*)soap_malloc(soap, a->__size);\n\t\tsoap_memcpy(d->__ptr, d->__size, a->__ptr, a->__size);\n\t}"); else fprintf(fout, "\n\td->__ptr = NULL;\n\td->__size = a->__size;\n\tif (a->__ptr && a->__size > 0)\n\t{\td->__ptr = (unsigned char*)soap_malloc(soap, a->__size);\n\t\tsoap_memcpy(d->__ptr, d->__size, a->__ptr, a->__size);\n\t}"); if (is_attachment(typ)) fprintf(fout, "\n\td->id = soap_strdup(soap, a->id);\n\td->type = soap_strdup(soap, a->type);\n\td->options = soap_strdup(soap, a->options); /* WARNING: cannot copy binary DIME attachment options correctly, MIME/MTOM is OK */"); } else { Tnode *ref = p->info.typ->ref; int dim = get_Darraydims(typ); const char *d = ident(p->sym->name); fprintf(fout, "\n\tif (a->%s)\n\t{", d); if (dim) fprintf(fout, "\tsize_t i, n = soap_size(a->__size, %d);", dim); else fprintf(fout, "\tint i, n = a->__size;"); if (cflag) fprintf(fout, "\n\t\td->%s = (%s)soap_malloc(soap, n * sizeof(%s));", d, c_type(p->info.typ), c_type(ref)); else if (is_primitive(ref) || ref->type == Tpointer) fprintf(fout, "\n\t\td->%s = (%s)soap_malloc(soap, n * sizeof(%s));", d, c_type(p->info.typ), c_type(ref)); else fprintf(fout, "\n\t\td->%s = soap_new_%s(soap, n);", d, c_ident(ref)); fprintf(fout, "\n\t\tfor (i = 0; i < n; i++)"); if (is_XML(ref) && is_string(ref)) fprintf(fout, "\n\t\t\td->%s[i] = soap_strdup(soap, a->%s[i]);", d, d); else if (is_XML(ref) && is_wstring(ref)) fprintf(fout, "\n\t\t\td->%s[i] = soap_wstrdup(soap, a->%s[i]);", d, d); else if (is_primitive(ref) || is_transient(ref)) fprintf(fout, "\n\t\t\td->%s[i] = a->%s[i];", d, d); else if (ref->type == Tclass || ref->type == Tstruct || ref->type == Ttemplate || ref->type == Tpointer) fprintf(fout, "\n\t\t\tsoap_dup_%s(soap, &d->%s[i], &a->%s[i]);", c_ident(ref), d, d); fprintf(fout, "\n\t}\n\telse\n\t\td->%s = NULL;", d); if (dim) fprintf(fout, "\n\tsoap_memcpy(&d->__size, sizeof(d->__size), &a->__size, sizeof(a->__size));"); else fprintf(fout, "\n\td->__size = a->__size;"); if (has_offset(typ)) { if (dim) fprintf(fout, "\n\tsoap_memcpy(&d->__offset, sizeof(d->__offset), &a->__offset, sizeof(a->__offset));"); else fprintf(fout, "\n\td->__offset = a->__offset;"); } } } else { Table *t = (Table*)typ->ref; const char *b = ""; const char *c = ""; if (typ->type == Tclass) { b = ident(t->sym->name); c = "::"; } if (t->prev) fprintf(fout, "\n\tsoap_dup_%s(soap, d, a);", ident(t->prev->sym->name)); for (p = ((Table*)typ->ref)->list; p; p = p->next) { const char *d = ident(p->sym->name); if (p->info.typ->type == Tfun || p->info.typ->type == Tunion) { continue; } else if (p->info.sto & Sconst) { fprintf(fout, "\n\t/* const %s skipped */", d); } else if (p->info.sto & Sstatic) { fprintf(fout, "\n\t/* static %s skipped */", d); } else if (p->info.sto & Stypedef) { fprintf(fout, "\n\t/* typedef %s skipped */", d); } else if (is_repetition(p)) { Tnode *ref = p->next->info.typ->ref; const char *e = ident(p->next->sym->name); fprintf(fout, "\n\td->%s%s%s = a->%s%s%s;\n\tif (a->%s%s%s > 0 && a->%s%s%s)", b, c, d, b, c, d, b, c, d, b, c, e); if (cflag) { if (ref->type == Tpointer && (p->next->info.sto & Sconstptr)) fprintf(fout, "\n\t{\tint i;\n\t\td->%s%s%s = (const %s)soap_malloc(soap, a->%s%s%s * sizeof(%s));", b, c, e, c_type(p->next->info.typ), b, c, d, c_type(ref)); else fprintf(fout, "\n\t{\tint i;\n\t\td->%s%s%s = (%s)soap_malloc(soap, a->%s%s%s * sizeof(%s));", b, c, e, c_type(p->next->info.typ), b, c, d, c_type(ref)); } else if (is_primitive(ref) || ref->type == Tpointer) { if (ref->type == Tpointer && (p->next->info.sto & Sconstptr)) fprintf(fout, "\n\t{\tint i;\n\t\td->%s%s%s = (const %s)soap_malloc(soap, a->%s%s%s * sizeof(%s));", b, c, e, c_type(p->next->info.typ), b, c, d, c_type(ref)); else fprintf(fout, "\n\t{\tint i;\n\t\td->%s%s%s = (%s)soap_malloc(soap, a->%s%s%s * sizeof(%s));", b, c, e, c_type(p->next->info.typ), b, c, d, c_type(ref)); } else { fprintf(fout, "\n\t{\tint i;\n\t\td->%s%s%s = soap_new_%s(soap, a->%s%s%s);", b, c, e, c_ident(ref), b, c, d); } fprintf(fout, "\n\t\tfor (i = 0; i < (int)a->%s%s%s; i++)", b, c, d); if (is_XML(ref) && is_string(ref)) fprintf(fout, "\n\t\t\td->%s%s%s[i] = soap_strdup(soap, a->%s%s%s[i]);", b, c, e, b, c, e); else if (is_XML(ref) && is_wstring(ref)) fprintf(fout, "\n\t\t\td->%s%s%s[i] = soap_wstrdup(soap, a->%s%s%s[i]);", b, c, e, b, c, e); else if (is_primitive(ref)) fprintf(fout, "\n\t\t\td->%s%s%s[i] = a->%s%s%s[i];", b, c, e, b, c, e); else if (ref->type == Tpointer && (p->next->info.sto & Sconstptr)) fprintf(fout, "\n\t\t\tsoap_dup_%s(soap, (%s)&d->%s%s%s[i], (%s)&a->%s%s%s[i]);", c_ident(ref), c_type_id(ref, "*"), b, c, e, c_type_id(ref, "const*"), b, c, e); else if (ref->type == Tclass || ref->type == Tstruct || ref->type == Ttemplate || ref->type == Tpointer) fprintf(fout, "\n\t\t\tsoap_dup_%s(soap, &d->%s%s%s[i], &a->%s%s%s[i]);", c_ident(ref), b, c, e, b, c, e); fprintf(fout, "\n\t}\n\telse\n\t\td->%s%s%s = NULL;", b, c, e); p = p->next; } else if (is_anytype(p)) { fprintf(fout, "\n\td->%s%s%s = a->%s%s%s ? soap_dupelement(soap, a->%s%s%s, d->%s%s%s = a->%s%s%s) : NULL;", b, c, ident(p->next->sym->name), b, c, ident(p->next->sym->name), b, c, ident(p->next->sym->name), b, c, d, b, c, d); p = p->next; } else if (is_choice(p)) { Entry *q; const char *e = ident(p->next->sym->name); fprintf(fout, "\n\td->%s%s%s = a->%s%s%s;", b, c, d, b, c, d); fprintf(fout, "\n\tswitch (a->%s%s%s)\n\t{", b, c, d); t = (Table*)p->next->info.typ->ref; if (t) { for (q = t->list; q; q = q->next) { const char *f = ident(q->sym->name); fprintf(fout, "\n\t\tcase %s:", soap_union_member(p->next->info.typ, q)); if (is_XML(q->info.typ) && is_string(q->info.typ)) fprintf(fout, "\n\t\t\td->%s%s%s.%s = soap_strdup(soap, a->%s%s%s.%s);", b, c, e, f, b, c, e, f); else if (is_XML(q->info.typ) && is_wstring(q->info.typ)) fprintf(fout, "\n\t\t\td->%s%s%s.%s = soap_wstrdup(soap, a->%s%s%s.%s);", b, c, e, f, b, c, e, f); else if (is_primitive(q->info.typ)) fprintf(fout, "\n\t\t\td->%s%s%s.%s = a->%s%s%s.%s;", b, c, e, f, b, c, e, f); else if (is_transient(q->info.typ)) fprintf(fout, "\n\t\t\td->%s%s%s.%s = a->%s%s%s.%s; /* transient (shallow copy) */", b, c, e, f, b, c, e, f); else if (q->info.typ->type == Tclass || q->info.typ->type == Tstruct || q->info.typ->type == Ttemplate || q->info.typ->type == Tpointer) fprintf(fout, "\n\t\t\tsoap_dup_%s(soap, &d->%s%s%s.%s, &a->%s%s%s.%s);", c_ident(q->info.typ), b, c, e, f, b, c, e, f); fprintf(fout, "\n\t\t\tbreak;"); } } fprintf(fout, "\n\t}"); p = p->next; } else if (is_XML(p->info.typ) && is_string(p->info.typ)) { fprintf(fout, "\n\td->%s%s%s = soap_strdup(soap, (char*)a->%s%s%s);", b, c, d, b, c, d); } else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) { fprintf(fout, "\n\td->%s%s%s = soap_wstrdup(soap, (char*)a->%s%s%s);", b, c, d, b, c, d); } else if (is_soapref(p->info.typ)) { fprintf(fout, "\n\td->%s%s%s = soap;", b, c, d); } else if (is_primitive(p->info.typ)) { fprintf(fout, "\n\td->%s%s%s = a->%s%s%s;", b, c, d, b, c, d); } else if (is_transient(p->info.typ)) { fprintf(fout, "\n\td->%s%s%s = a->%s%s%s; /* transient (shallow copy) */", b, c, d, b, c, d); } else if (p->info.typ->type == Tarray) { Tnode *ref = p->info.typ->ref; fprintf(fout, "\n\t{\tint i;\n\t\tfor (i = 0; i < %d; i++)", get_dimension(p->info.typ)); if (is_XML(ref) && is_string(ref)) fprintf(fout, "\n\t\t\td->%s%s%s[i] = soap_strdup(soap, a->%s%s%s[i]);", b, c, d, b, c, d); else if (is_XML(ref) && is_wstring(ref)) fprintf(fout, "\n\t\t\td->%s%s%s[i] = soap_wstrdup(soap, a->%s%s%s[i]);", b, c, d, b, c, d); else if (is_primitive(ref)) fprintf(fout, "\n\t\t\td->%s%s%s[i] = a->%s%s%s[i];", b, c, d, b, c, d); else if (is_transient(ref)) fprintf(fout, "\n\t\t\td->%s%s%s[i] = a->%s%s%s[i]; /* transient (shallow copy) */", b, c, d, b, c, d); else if (ref->type == Tclass || ref->type == Tstruct || ref->type == Ttemplate || ref->type == Tpointer) fprintf(fout, "\n\t\t\tsoap_dup_%s(soap, &d->%s%s%s[i], &a->%s%s%s[i]);", c_ident(ref), b, c, d, b, c, d); fprintf(fout, "\n\t}"); } else if (p->info.typ->type == Tpointer && (p->info.sto & Sconstptr)) { fprintf(fout, "\n\tsoap_dup_%s(soap, (%s)&d->%s%s%s, (%s)&a->%s%s%s);", c_ident(p->info.typ), c_type_id(p->info.typ, "*"), b, c, d, c_type_id(p->info.typ, "const*"), b, c, d); } else if (p->info.typ->type == Tclass || p->info.typ->type == Tstruct || p->info.typ->type == Ttemplate || p->info.typ->type == Tpointer) { fprintf(fout, "\n\tsoap_dup_%s(soap, &d->%s%s%s, &a->%s%s%s);", c_ident(p->info.typ), b, c, d, b, c, d); } else { fprintf(fout, "\n\t/* %s skipped */", d); } } } } else { fprintf(fout, "\n\t*d = *a;"); } if ((typ->type == Tclass || typ->type == Tstruct) && typ->recursive) fprintf(fout, "\n\tsoap_unmark(soap, mark);"); fprintf(fout, "\n\treturn d;\n}"); fflush(fout); } void soap_del(Tnode *typ) { if (!Edflag) return; if (typ->type != Tstruct && typ->type != Tclass && typ->type != Ttemplate && typ->type != Tpointer) return; if (typ->type != Tclass || !(typ->sym && (is_stdstring(typ) || is_stdwstring(typ)) && is_eq(typ->sym->name, "xsd__QName")) || is_imported(typ)) { if ((is_typedef(typ) && !is_external(typ)) || is_synonym(typ)) { fprintf(fhead, "\n\n#define soap_del_%s soap_del_%s\n", c_ident(typ), t_ident(typ)); return; } } if (typ->type == Tstruct && (is_anyType(typ) || is_anyAttribute(typ))) return; fprintf(fhead, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_del_%s(%s);", c_ident(typ), c_type_constptr_id(typ, "const*")); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_del_%s(%s)\n{", c_ident(typ), c_type_constptr_id(typ, "const*a")); fprintf(fout, "\n\tif (!a)\n\t\treturn;"); fflush(fout); if (is_string(typ) || is_wstring(typ)) { if (cflag) fprintf(fout, "\n\tif (*a)\n\t\tSOAP_FREE(NULL, *a);"); else fprintf(fout, "\n\tif (*a)\n\t\tSOAP_FREE(NULL, *a);"); } else if (typ->type == Tpointer) { Tnode *ref = typ->ref; if (ref->type == Tclass && !is_external(ref) && !is_volatile(ref) && !is_typedef(ref)) fprintf(fout, "\n\tif (*a)\n\t{\t(*a)->soap_del();\n\t\tSOAP_DELETE(*a);\n\t}"); else if (is_XML(ref)) { if (cflag) fprintf(fout, "\n\tif (*a)\n\t{\tif (**a)\n\t\t\tSOAP_FREE(NULL, **a);\n\t\tSOAP_FREE(NULL, *a);\n\t}"); else fprintf(fout, "\n\tif (*a)\n\t{\tif (**a)\n\t\t\tSOAP_FREE(NULL, **a);\n\t\tSOAP_FREE(NULL, *a);\n\t}"); } else if (is_primitive(ref) || is_external(typ) || is_volatile(ref) || is_transient(ref)) { if (cflag) fprintf(fout, "\n\tif (*a)\n\t\tSOAP_FREE(NULL, *a);"); else if (is_primitive(ref)) fprintf(fout, "\n\tif (*a)\n\t\tSOAP_FREE(NULL, *a);"); else fprintf(fout, "\n\tif (*a)\n\t\tSOAP_DELETE(*a);"); } else if (cflag) fprintf(fout, "\n\tif (*a)\n\t{\tsoap_del_%s(*a);\n\t\tSOAP_FREE(NULL, *a);\n\t}", c_ident(ref)); else if (ref->type == Tpointer) fprintf(fout, "\n\tif (*a)\n\t{\tsoap_del_%s(*a);\n\t\tSOAP_FREE(NULL, *a);\n\t}", c_ident(ref)); else if (ref->type == Tclass || ref->type == Tstruct || ref->type == Ttemplate) fprintf(fout, "\n\tif (*a)\n\t{\tsoap_del_%s(*a);\n\t\tSOAP_DELETE(*a);\n\t}", c_ident(ref)); } else if (is_smart(typ)) { Tnode *ref = typ->ref; if (is_smart_shared(typ)) { if (ref->type == Tclass && !is_external(ref) && !is_volatile(ref) && !is_typedef(ref) && !is_transient(ref)) fprintf(fout, "\n\tif (*a)\n\t\t(*a)->soap_del();"); else if (is_primitive(ref) || is_transient(ref)) ; else if (ref->type == Tclass || ref->type == Tstruct || ref->type == Ttemplate || ref->type == Tpointer) fprintf(fout, "\n\tif (*a)\n\t\tsoap_del_%s(a->get());", c_ident(ref)); } else { if (ref->type == Tclass && !is_external(ref) && !is_volatile(ref) && !is_typedef(ref) && !is_transient(ref)) fprintf(fout, "\n\tif (*a)\n\t\t(*a)->soap_del();"); else if (is_primitive(ref) || is_transient(ref)) ; else if (ref->type == Tclass || ref->type == Tstruct || ref->type == Ttemplate || ref->type == Tpointer) fprintf(fout, "\n\tif (*a)\n\t\tsoap_del_%s(a->get());", c_ident(ref)); } } else if (typ->type == Ttemplate) { Tnode *ref = typ->ref; if (!is_primitive(ref) && !is_external(typ) && !is_volatile(ref) && !is_transient(ref)) { fprintf(fout, "\n\tfor (%s::const_iterator i = a->begin(); i != a->end(); ++i)", c_type(typ)); if (is_XML(ref)) fprintf(fout, "\n\t\tSOAP_FREE(NULL, *i);"); else if (ref->type == Tclass || ref->type == Tstruct || ref->type == Ttemplate || ref->type == Tpointer) fprintf(fout, "\n\t\tsoap_del_%s(&*i);", c_ident(ref)); else fprintf(fout, "\n\t\t; /* skipped */"); } } else if (typ->ref) { Entry *p = is_dynamic_array(typ); if (p) { if (is_binary(typ)) { if (cflag) fprintf(fout, "\n\tif (a->__ptr)\n\t\tSOAP_FREE(NULL, a->__ptr);"); else fprintf(fout, "\n\tif (a->__ptr)\n\t\tSOAP_FREE(NULL, a->__ptr);"); if (is_attachment(typ)) { if (cflag) fprintf(fout, "\n\tif (a->id)\n\t\tSOAP_FREE(NULL, a->id);\n\tif (a->type)\n\t\tSOAP_FREE(NULL, a->type);\n\tif (a->options)\n\t\tSOAP_FREE(NULL, a->options);"); else fprintf(fout, "\n\tif (a->id)\n\t\tSOAP_FREE(NULL, a->id);\n\tif (a->type)\n\t\tSOAP_FREE(NULL, a->type);\n\tif (a->options)\n\t\tSOAP_FREE(NULL, a->options);"); } } else { Tnode *ref = p->info.typ->ref; int dim = get_Darraydims(typ); const char *d = ident(p->sym->name); fprintf(fout, "\n\tif (a->%s)\n\t{", d); if (!is_primitive(ref) && !is_transient(ref)) { if (dim) fprintf(fout, "\tsize_t i, n = soap_size(a->__size, %d);", dim); else fprintf(fout, "\tint i, n = a->__size;"); fprintf(fout, "\n\t\tfor (i = 0; i < n; i++)"); if (is_XML(ref)) fprintf(fout, "\n\t\t\tSOAP_FREE(NULL, a->%s[i]);", d); else if (ref->type == Tclass || ref->type == Tstruct || ref->type == Ttemplate || ref->type == Tpointer) fprintf(fout, "\n\t\t\tsoap_del_%s(&a->%s[i]);", c_ident(ref), d); } if (cflag || is_primitive(ref) || ref->type == Tpointer) fprintf(fout, "\n\t\tSOAP_FREE(NULL, a->%s);\n\t}", d); else fprintf(fout, "\n\t\tSOAP_DELETE_ARRAY(a->%s);\n\t}", d); } } else { Table *t = (Table*)typ->ref; const char *b = ""; const char *c = ""; if (typ->type == Tclass) { b = ident(t->sym->name); c = "::"; } if (t->prev) fprintf(fout, "\n\tsoap_del_%s(a);", ident(t->prev->sym->name)); for (p = ((Table*)typ->ref)->list; p; p = p->next) { const char *d = ident(p->sym->name); if (p->info.typ->type == Tfun || p->info.typ->type == Tunion || is_soapref(p->info.typ)) { continue; } else if (p->info.sto & Sconst) { fprintf(fout, "\n\t/* const %s skipped */", d); } else if (p->info.sto & Sstatic) { fprintf(fout, "\n\t/* static %s skipped */", d); } else if (p->info.sto & Stypedef) { fprintf(fout, "\n\t/* typedef %s skipped */", d); } else if (is_repetition(p)) { Tnode *ref = p->next->info.typ->ref; const char *e = ident(p->next->sym->name); fprintf(fout, "\n\tif (a->%s%s%s)\n\t{", b, c, e); if (!is_primitive(ref) && !is_transient(ref)) { fprintf(fout, "\tint i;\n\t\tfor (i = 0; i < (int)a->%s%s%s; i++)", b, c, d); if (is_XML(ref)) fprintf(fout, "\n\t\t\tSOAP_FREE(NULL, a->%s%s%s[i]);", b, c, e); else if (ref->type == Tpointer && (p->next->info.sto & Sconstptr)) fprintf(fout, "\n\t\t\tsoap_del_%s((%s)&a->%s%s%s[i]);", c_ident(ref), c_type_id(ref, "*"), b, c, e); else if (ref->type == Tclass || ref->type == Tstruct || ref->type == Ttemplate || ref->type == Tpointer) fprintf(fout, "\n\t\t\tsoap_del_%s(&a->%s%s%s[i]);", c_ident(ref), b, c, e); } if (cflag) fprintf(fout, "\n\t\tSOAP_FREE(NULL, a->%s%s%s);\n\t}", b, c, e); else if (is_primitive(ref) || ref->type == Tpointer) fprintf(fout, "\n\t\tSOAP_FREE(NULL, a->%s%s%s);\n\t}", b, c, e); else fprintf(fout, "\n\t\tSOAP_DELETE_ARRAY(a->%s%s%s);\n\t}", b, c, e); p = p->next; } else if (is_anytype(p)) { fprintf(fout, "\n\tif (a->%s%s%s)\n\t\tsoap_delelement(a->%s%s%s, a->%s%s%s);", b, c, ident(p->next->sym->name), b, c, ident(p->next->sym->name), b, c, d); p = p->next; } else if (is_choice(p)) { Entry *q; const char *e = ident(p->next->sym->name); fprintf(fout, "\n\tswitch (a->%s%s%s)\n\t{", b, c, d); t = (Table*)p->next->info.typ->ref; if (t) { for (q = t->list; q; q = q->next) { if (!is_primitive(q->info.typ) && !is_transient(q->info.typ)) { const char *f = ident(q->sym->name); fprintf(fout, "\n\t\tcase %s:", soap_union_member(p->next->info.typ, q)); if (is_XML(q->info.typ)) fprintf(fout, "\n\t\t\tif (a->%s%s%s.%s)\n\t\t\t\tSOAP_FREE(NULL, a->%s%s%s.%s);", b, c, e, f, b, c, e, f); else if (q->info.typ->type == Tclass || q->info.typ->type == Tstruct || q->info.typ->type == Ttemplate || q->info.typ->type == Tpointer) fprintf(fout, "\n\t\t\tsoap_del_%s(&a->%s%s%s.%s);", c_ident(q->info.typ), b, c, e, f); fprintf(fout, "\n\t\t\tbreak;"); } } } fprintf(fout, "\n\t}"); p = p->next; } else if (is_XML(p->info.typ)) { fprintf(fout, "\n\tif (a->%s%s%s)\n\t\tSOAP_FREE(NULL, a->%s%s%s);", b, c, d, b, c, d); } else if (p->info.typ->type == Tpointer && (p->info.sto & Sconstptr)) { fprintf(fout, "\n\tsoap_del_%s((%s)&a->%s%s%s);", c_ident(p->info.typ), c_type_id(p->info.typ, "*"), b, c, d); } else if (is_primitive(p->info.typ)) { fprintf(fout, "\n\t/* %s skipped */", d); } else if (is_transient(p->info.typ)) { fprintf(fout, "\n\t/* transient %s skipped */", d); } else if (p->info.typ->type == Tarray) { Tnode *ref = p->info.typ->ref; if (!is_primitive(ref) && !is_transient(ref)) { fprintf(fout, "\n\t{\tint i;\n\t\tfor (i = 0; i < %d; i++)", get_dimension(p->info.typ)); if (is_XML(ref)) fprintf(fout, "\n\t\t\tif (a->%s%s%s[i])\n\t\t\t\tSOAP_FREE(NULL, a->%s%s%s[i]);", b, c, d, b, c, d); else if (ref->type == Tclass || ref->type == Tstruct || ref->type == Ttemplate || ref->type == Tpointer) fprintf(fout, "\n\t\t\tsoap_del_%s(&a->%s%s%s[i]);", c_ident(ref), b, c, d); fprintf(fout, "\n\t}"); } } else if (p->info.typ->type == Tclass || p->info.typ->type == Tstruct || p->info.typ->type == Ttemplate || p->info.typ->type == Tpointer) { fprintf(fout, "\n\tsoap_del_%s(&a->%s%s%s);", c_ident(p->info.typ), b, c, d); } else { fprintf(fout, "\n\t/* %s skipped */", d); } } } } fprintf(fout, "\n}"); fflush(fout); } int get_dimension(Tnode *typ) { if (((Tnode*)typ->ref)->width) return typ->width / ((Tnode*) typ->ref)->width; return 0; } void soap_serialize(Tnode *typ) { int d; Table *table, *t; Entry *p; Tnode* temp; int cardinality; const char *self; if (is_primitive(typ)) return; if (is_typedef(typ) && (is_template(typ) || is_element(typ) || is_synonym(typ) || is_external(typ) || is_imported(typ)) && (!is_external(typ) || is_volatile(typ))) { if (typ->type == Tclass && !is_stdstring(typ) && !is_stdwstring(typ) && !is_volatile(typ)) fprintf(fhead, "\n\n#define soap_serialize_%s(soap, a) (a)->soap_serialize(soap)\n", c_ident(typ)); else fprintf(fhead, "\n\n#define soap_serialize_%s soap_serialize_%s\n", c_ident(typ), t_ident(typ)); return; } if ((p = is_dynamic_array(typ))) { if (typ->type == Tclass && !is_typedef(typ) && !is_volatile(typ)) { if (is_external(typ)) return; fprintf(fout, "\n\nvoid %s::soap_serialize(struct soap *soap) const\n{", c_ident(typ)); fprintf(fout, "\n\t(void)soap; /* appease -Wall -Werror */\n#ifndef WITH_NOIDREF"); if (is_binary(typ)) { if (is_attachment(typ)) { fprintf(fout, "\n\tif (this->__ptr && !soap_array_reference(soap, this, this->__ptr, this->__size, %s))", soap_type(typ)); fprintf(fout, "\n\t\tif (this->id || this->type)\n\t\t\tsoap->mode |= SOAP_ENC_DIME;\n#endif\n}"); } else fprintf(fout, "\n\tif (this->__ptr)\n\t\tsoap_array_reference(soap, this, this->__ptr, this->__size, %s);\n#endif\n}", soap_type(typ)); fflush(fout); return; } else { d = get_Darraydims(typ); if (d) { fprintf(fout, "\n\tif (this->%s && !soap_array_reference(soap, this, this->%s, %s, %s))", ident(p->sym->name), ident(p->sym->name), get_Darraysize("this", d), soap_type(typ)); fprintf(fout, "\n\t{\tsize_t i, n = soap_size(this->__size, %d);", d); fprintf(fout, "\n\t\tfor (i = 0; i < n; i++)"); } else { fprintf(fout, "\n\tif (this->%s && !soap_array_reference(soap, this, this->%s, this->__size, %s))", ident(p->sym->name), ident(p->sym->name), soap_type(typ)); fprintf(fout, "\n\t{\tfor (size_t i = 0; i < (size_t)this->__size; i++)"); } fprintf(fout, "\n\t\t{"); if (has_ptr((Tnode*)p->info.typ->ref)) fprintf(fout, "\tsoap_embedded(soap, this->%s + i, %s);", ident(p->sym->name), soap_type((Tnode*)p->info.typ->ref)); if (((Tnode*)p->info.typ->ref)->type == Tclass && !is_XML((Tnode*)p->info.typ->ref) && !is_external((Tnode*)p->info.typ->ref) && !is_volatile((Tnode*)p->info.typ->ref) && !is_typedef((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\tthis->%s[i].soap_serialize(soap);", ident(p->sym->name)); else if (is_string((Tnode*)p->info.typ->ref) && !is_XML((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_serialize_%s(soap, (char*const*)(this->%s + i));", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name)); else if (is_wstring((Tnode*)p->info.typ->ref) && !is_XML((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_serialize_%s(soap, (wchar_t*const*)(this->%s + i));", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name)); else if (!is_XML((Tnode*)p->info.typ->ref) && !is_primitive((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_serialize_%s(soap, this->%s + i);", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name)); fprintf(fout, "\n\t\t}\n\t}\n#endif\n}"); return; } } else { if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_serialize_%s(struct soap*, const %s);", c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap*, const %s);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap *soap, const %s)\n{", c_ident(typ), c_type_id(typ, "*a")); if (is_binary(typ)) { fprintf(fout, "\n\t(void)soap; (void)a; /* appease -Wall -Werror */\n#ifndef WITH_NOIDREF"); if (is_attachment(typ)) { fprintf(fout, "\n\tif (a->%s && !soap_array_reference(soap, a, a->%s, a->__size, %s))", ident(p->sym->name), ident(p->sym->name), soap_type(typ)); fprintf(fout, "\n\t\tif (a->id || a->type)\n\t\t\tsoap->mode |= SOAP_ENC_DIME;\n#endif\n}"); } else fprintf(fout, "\n\tif (a->%s)\n\t\tsoap_array_reference(soap, a, a->%s, a->__size, %s);\n#endif\n}", ident(p->sym->name), ident(p->sym->name), soap_type(typ)); fflush(fout); return; } else { fprintf(fout, "\n\t(void)soap; (void)a; /* appease -Wall -Werror */\n#ifndef WITH_NOIDREF"); d = get_Darraydims(typ); if (d) { fprintf(fout, "\n\tif (a->%s && !soap_array_reference(soap, a, a->%s, %s, %s))", ident(p->sym->name), ident(p->sym->name), get_Darraysize("a", d), soap_type(typ)); fprintf(fout, "\n\t{\tsize_t i, n = soap_size(a->__size, %d);", d); fprintf(fout, "\n\t\tfor (i = 0; i < n; i++)"); } else { fprintf(fout, "\n\tif (a->%s && !soap_array_reference(soap, a, a->%s, a->__size, %s))", ident(p->sym->name), ident(p->sym->name), soap_type(typ)); fprintf(fout, "\n\t{\tint i;\n\t\tfor (i = 0; i < a->__size; i++)"); } fprintf(fout, "\n\t\t{"); if (has_ptr((Tnode*)p->info.typ->ref)) fprintf(fout, "\tsoap_embedded(soap, a->%s + i, %s);", ident(p->sym->name), soap_type((Tnode*)p->info.typ->ref)); if (((Tnode*)p->info.typ->ref)->type == Tclass && !is_XML((Tnode*)p->info.typ->ref) && !is_external((Tnode*)p->info.typ->ref) && !is_volatile((Tnode*)p->info.typ->ref) && !is_typedef((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\ta->%s[i].soap_serialize(soap);", ident(p->sym->name)); else if (is_string((Tnode*)p->info.typ->ref) && !is_XML((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_serialize_%s(soap, (char*const*)(a->%s + i));", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name)); else if (is_wstring((Tnode*)p->info.typ->ref) && !is_XML((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_serialize_%s(soap, (wchar_t*const*)(a->%s + i));", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name)); else if (!is_XML((Tnode*)p->info.typ->ref) && !is_primitive((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_serialize_%s(soap, a->%s + i);", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name)); fprintf(fout, "\n\t\t}\n\t}\n#endif\n}"); fflush(fout); return; } } } if (is_stdstring(typ) || is_stdwstring(typ)) { fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap*, const %s);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap *soap, const %s)\n{\t(void)soap; (void)a; /* appease -Wall -Werror */\n}", c_ident(typ), c_type_id(typ, "*a")); return; } switch(typ->type) { case Tclass: if (!is_volatile(typ) && typ->ref) /* fall through to switch case Tstruct */ { if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_serialize_%s(struct soap*, const %s);", c_ident(typ), c_type_id(typ, "*")); return; } if (!is_typedef(typ)) { self = "this"; fprintf(fout, "\n\nvoid %s::soap_serialize(struct soap *soap) const\n{\n\t(void)soap; /* appease -Wall -Werror */", ident(typ->id->name)); } else { self = "p"; fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap*, const %s);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap *soap, const %s)\n{\n\t(void)soap; (void)p; /* appease -Wall -Werror */", c_ident(typ), c_type_id(typ, "*p")); } fprintf(fout, "\n#ifndef WITH_NOIDREF"); table = (Table*)typ->ref; for (p = table->list; p; p = p->next) { if (p->info.typ->type == Tfun || p->info.typ->type == Tunion || is_soapref(p->info.typ)) ; else if (p->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name)); else if (p->info.sto & Sattribute) ; else if (is_repetition(p)) { if (!is_XML(p->next->info.typ)) { fprintf(fout, "\n\tif (%s->%s::%s)", self, ident(table->sym->name), ident(p->next->sym->name)); fprintf(fout, "\n\t{\tint i;\n\t\tfor (i = 0; i < (int)%s->%s::%s; i++)\n\t\t{", self, ident(table->sym->name), ident(p->sym->name)); if (!is_invisible(p->next->sym->name)) if (has_ptr((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_embedded(soap, %s->%s::%s + i, %s);", self, ident(table->sym->name), ident(p->next->sym->name), soap_type((Tnode*)p->next->info.typ->ref)); if (((Tnode*)p->next->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->next->info.typ->ref) && !is_volatile((Tnode*)p->next->info.typ->ref) && !is_typedef((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t%s->%s::%s[i].soap_serialize(soap);", self, ident(table->sym->name), ident(p->next->sym->name)); else if (is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_serialize_%s(soap, (char*const*)(%s->%s::%s + i));", c_ident((Tnode*)p->next->info.typ->ref), self, ident(table->sym->name), ident(p->next->sym->name)); else if (is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_serialize_%s(soap, (wchar_t*const*)(%s->%s::%s + i));", c_ident((Tnode*)p->next->info.typ->ref), self, ident(table->sym->name), ident(p->next->sym->name)); else if (!is_primitive((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_serialize_%s(soap, %s->%s::%s + i);", c_ident((Tnode*)p->next->info.typ->ref), self, ident(table->sym->name), ident(p->next->sym->name)); fprintf(fout, "\n\t\t}\n\t}"); } p = p->next; } else if (is_anytype(p)) { fprintf(fout, "\n\tsoap_markelement(soap, %s->%s, %s->%s);", self, ident(p->next->sym->name), self, ident(p->sym->name)); p = p->next; } else if (is_choice(p)) { fprintf(fout, "\n\tsoap_serialize_%s(soap, %s->%s::%s, &%s->%s::%s);", c_ident(p->next->info.typ), self, ident(table->sym->name), ident(p->sym->name), self, ident(table->sym->name), ident(p->next->sym->name)); p = p->next; } else if (is_transient(p->info.typ)) { fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); } else if (p->info.typ->type == Tarray) { if (has_ptr(p->info.typ)) fprintf(fout, "\n\tsoap_embedded(soap, %s->%s::%s, %s);", self, ident(table->sym->name), ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout, "\n\tsoap_serialize_%s(soap, %s->%s::%s);", c_ident(p->info.typ), self, ident(table->sym->name), ident(p->sym->name)); } else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { if (has_ptr(p->info.typ)) fprintf(fout, "\n\tsoap_embedded(soap, &%s->%s::%s, %s);", self, ident(table->sym->name), ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout, "\n\t%s->%s::%s.soap_serialize(soap);", self, ident(table->sym->name), ident(p->sym->name)); } else if (!is_void(p->info.typ) && !is_XML(p->info.typ)) { if (!is_template(p->info.typ)) if (has_ptr(p->info.typ)) fprintf(fout, "\n\tsoap_embedded(soap, &%s->%s::%s, %s);", self, ident(table->sym->name), ident(p->sym->name), soap_type(p->info.typ)); if (is_string(p->info.typ)) fprintf(fout, "\n\tsoap_serialize_%s(soap, (char*const*)&%s->%s::%s);", c_ident(p->info.typ), self, ident(table->sym->name), ident(p->sym->name)); else if (is_wstring(p->info.typ)) fprintf(fout, "\n\tsoap_serialize_%s(soap, (wchar_t*const*)&%s->%s::%s);", c_ident(p->info.typ), self, ident(table->sym->name), ident(p->sym->name)); else if ((p->info.typ->type == Treference || p->info.typ->type == Trvalueref) && ((Tnode*)(p->info.typ->ref))->type == Tclass && !is_external(p->info.typ->ref) && !is_volatile(p->info.typ->ref)) fprintf(fout, "\n\t%s->%s::%s.soap_serialize(soap);", self, ident(table->sym->name), ident(p->sym->name)); else if ((p->info.typ->type == Treference || p->info.typ->type == Trvalueref) && !is_primitive(p->info.typ->ref)) fprintf(fout, "\n\tsoap_serialize_%s(soap, &%s->%s::%s);", c_ident(p->info.typ), self, ident(table->sym->name), ident(p->sym->name)); else if (!is_primitive(p->info.typ) && p->info.typ->type != Treference && p->info.typ->type != Trvalueref) fprintf(fout, "\n\tsoap_serialize_%s(soap, &%s->%s::%s);", c_ident(p->info.typ), self, ident(table->sym->name), ident(p->sym->name)); else if (!is_primitive(p->info.typ)) fprintf(fout, "\n\t/* %s skipped */", ident(p->sym->name)); } } if (table && table->prev) fprintf(fout, "\n\t%s->%s::soap_serialize(soap);", self, ident(table->prev->sym->name)); fprintf(fout, "\n#endif\n}"); break; } /* fall through to next case when class is volatile, since serializers cannot be member functions */ case Tstruct: if (is_external(typ) && !is_volatile(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_serialize_%s(struct soap*, const %s);", c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap*, const %s);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap *soap, const %s)\n{", c_ident(typ), c_type_id(typ, "*a")); fprintf(fout, "\n\t(void)soap; (void)a; /* appease -Wall -Werror */\n#ifndef WITH_NOIDREF"); table = (Table*)typ->ref; for (t = table; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun || p->info.typ->type == Tunion || is_soapref(p->info.typ)) ; else if (p->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name)); else if (p->info.sto & Sattribute) ; else if (is_repetition(p)) { if (!is_XML(p->next->info.typ)) { fprintf(fout, "\n\tif (a->%s)", ident(p->next->sym->name)); fprintf(fout, "\n\t{\tint i;\n\t\tfor (i = 0; i < (int)a->%s; i++)\n\t\t{", ident(p->sym->name)); if (!is_invisible(p->next->sym->name)) if (has_ptr((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_embedded(soap, a->%s + i, %s);", ident(p->next->sym->name), soap_type((Tnode*)p->next->info.typ->ref)); if (((Tnode*)p->next->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->next->info.typ->ref) && !is_volatile((Tnode*)p->next->info.typ->ref) && !is_typedef((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\ta->%s[i].soap_serialize(soap);", ident(p->next->sym->name)); else if (is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_serialize_%s(soap, (char*const*)(a->%s + i));", c_ident((Tnode*)p->next->info.typ->ref), ident(p->next->sym->name)); else if (is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_serialize_%s(soap, (wchar_t*const*)(a->%s + i));", c_ident((Tnode*)p->next->info.typ->ref), ident(p->next->sym->name)); else if (!is_primitive((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_serialize_%s(soap, a->%s + i);", c_ident((Tnode*)p->next->info.typ->ref), ident(p->next->sym->name)); fprintf(fout, "\n\t\t}\n\t}"); } p = p->next; } else if (is_anytype(p)) { fprintf(fout, "\n\tsoap_markelement(soap, a->%s, a->%s);", ident(p->next->sym->name), ident(p->sym->name)); p = p->next; } else if (is_choice(p)) { fprintf(fout, "\n\tsoap_serialize_%s(soap, a->%s, &a->%s);", c_ident(p->next->info.typ), ident(p->sym->name), ident(p->next->sym->name)); p = p->next; } else if (is_transient(p->info.typ)) { fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); } else if (p->info.typ->type == Tarray) { if (has_ptr(p->info.typ)) fprintf(fout, "\n\tsoap_embedded(soap, a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout, "\n\tsoap_serialize_%s(soap, a->%s);", c_ident(p->info.typ), ident(p->sym->name)); } else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { if (has_ptr(p->info.typ)) fprintf(fout, "\n\tsoap_embedded(soap, &a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout, "\n\ta->%s.soap_serialize(soap);", ident(p->sym->name)); } else if (!is_void(p->info.typ) && !is_XML(p->info.typ)) { if (!is_template(p->info.typ)) if (has_ptr(p->info.typ)) fprintf(fout, "\n\tsoap_embedded(soap, &a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); if (is_string(p->info.typ)) fprintf(fout, "\n\tsoap_serialize_%s(soap, (char*const*)&a->%s);", c_ident(p->info.typ), ident(p->sym->name)); else if (is_wstring(p->info.typ)) fprintf(fout, "\n\tsoap_serialize_%s(soap, (wchar_t*const*)&a->%s);", c_ident(p->info.typ), ident(p->sym->name)); else if ((p->info.typ->type == Treference || p->info.typ->type == Trvalueref) && ((Tnode*)(p->info.typ->ref))->type == Tclass && !is_external(p->info.typ->ref) && !is_volatile(p->info.typ->ref)) fprintf(fout, "\n\ta->%s.soap_serialize(soap);", ident(p->sym->name)); else if ((p->info.typ->type == Treference || p->info.typ->type == Trvalueref) && !is_primitive(p->info.typ->ref)) fprintf(fout, "\n\tsoap_serialize_%s(soap, &a->%s);", c_ident(p->info.typ), ident(p->sym->name)); else if (!is_primitive(p->info.typ) && p->info.typ->type != Treference && p->info.typ->type != Trvalueref) fprintf(fout, "\n\tsoap_serialize_%s(soap, &a->%s);", c_ident(p->info.typ), ident(p->sym->name)); else if (!is_primitive(p->info.typ)) fprintf(fout, "\n\t/* %s skipped */", ident(p->sym->name)); } } } fprintf(fout, "\n#endif\n}"); break; case Tunion: if (is_external(typ) && !is_volatile(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_serialize_%s(struct soap*, int, const %s);", c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap*, int, const %s);", c_ident(typ), c_type_id(typ, "*")); if (!typ->ref) return; fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap *soap, int choice, const %s)\n{", c_ident(typ), c_type_id(typ, "*a")); fprintf(fout, "\n\t(void)soap; (void)choice; (void)a; /* appease -Wall -Werror */\n#ifndef WITH_NOIDREF"); fprintf(fout, "\n\tswitch (choice)\n\t{"); table = (Table*)typ->ref; for (t = table; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun || p->info.typ->type == Tunion) ; else if (p->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name)); else if (p->info.sto & Sattribute) ; else if (is_repetition(p)) ; else if (is_anytype(p)) ; else if (is_transient(p->info.typ)) fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); else if (p->info.typ->type == Tarray) { fprintf(fout, "\n\tcase %s:", soap_union_member(typ, p)); if (has_ptr(p->info.typ)) fprintf(fout, "\n\t\tsoap_embedded(soap, a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout, "\n\t\tsoap_serialize_%s(soap, a->%s);", c_ident(p->info.typ), ident(p->sym->name)); fprintf(fout, "\n\t\tbreak;"); } else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { fprintf(fout, "\n\tcase %s:", soap_union_member(typ, p)); if (has_ptr(p->info.typ)) fprintf(fout, "\n\t\tsoap_embedded(soap, &a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout, "\n\t\ta->%s.soap_serialize(soap);", ident(p->sym->name)); fprintf(fout, "\n\t\tbreak;"); } else if (p->info.typ->type != Tfun && !is_void(p->info.typ) && !is_XML(p->info.typ)) { fprintf(fout, "\n\tcase %s:", soap_union_member(typ, p)); if (has_ptr(p->info.typ)) fprintf(fout, "\n\t\tsoap_embedded(soap, &a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); if (!is_primitive(p->info.typ)) fprintf(fout, "\n\t\tsoap_serialize_%s(soap, &a->%s);", c_ident(p->info.typ), ident(p->sym->name)); fprintf(fout, "\n\t\tbreak;"); } } } fprintf(fout, "\n\tdefault:\n\t\tbreak;\n\t}\n#endif\n}"); break; case Tpointer: if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_serialize_%s(struct soap*, %s);", c_ident(typ), c_type_constptr_id(typ, "const*")); return; } fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap*, %s);", c_ident(typ), c_type_constptr_id(typ, "const*")); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap *soap, %s)\n{\n\t(void)soap; (void)a; /* appease -Wall -Werror */\n#ifndef WITH_NOIDREF", c_ident(typ), c_type_constptr_id(typ, "const*a")); temp = (Tnode*)typ->ref; if (!temp) return; if (is_string(typ) || is_wstring(typ)) fprintf(fout, "\n\tsoap_reference(soap, *a, %s);", soap_type(typ)); else if (is_primitive(temp)) fprintf(fout, "\n\tsoap_reference(soap, *a, %s);", soap_type(temp)); else { if (is_dynamic_array(temp)) fprintf(fout, "\n\tif (*a)"); else fprintf(fout, "\n\tif (!soap_reference(soap, *a, %s))", soap_type(temp)); if (temp->type == Tclass && !is_external(temp) && !is_volatile(temp) && !is_typedef(temp)) fprintf(fout, "\n\t\t(*a)->soap_serialize(soap);"); else fprintf(fout, "\n\t\tsoap_serialize_%s(soap, *a);", c_ident(temp)); } fprintf(fout, "\n#endif\n}"); break; case Tarray: if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_serialize_%s(struct soap*, %s);", c_ident(typ), c_type_id(typ, "const")); return; } fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap*, %s);", c_ident(typ), c_type_id(typ, "const")); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap *soap, %s)\n{", c_ident(typ), c_type_id(typ, "const a")); if (!is_primitive((Tnode*)typ->ref)) { fprintf(fout, "\n\tint i;"); fprintf(fout, "\n\t(void)soap; (void)a; /* appease -Wall -Werror */\n#ifndef WITH_NOIDREF"); fprintf(fout, "\n\tfor (i = 0; i < %d; i++)", get_dimension(typ)); temp = (Tnode*)typ->ref;; cardinality = 1; while (temp->type == Tarray) { temp=(Tnode*)temp->ref; cardinality++; } fprintf(fout, "\n\t{"); if (has_ptr((Tnode*)typ->ref)) { fprintf(fout, "\tsoap_embedded(soap, a"); if (cardinality > 1) fprintf(fout, "[i]"); else fprintf(fout, "+i"); fprintf(fout, ", %s);", soap_type((Tnode*)typ->ref)); } if (((Tnode *)typ->ref)->type == Tclass && !is_external((Tnode*)typ->ref) && !is_volatile((Tnode*)typ->ref) && !is_typedef((Tnode*)typ->ref)) { fprintf(fout, "\n\ta[i].soap_serialize(soap)"); } else if (!is_primitive((Tnode*)typ->ref)) { fprintf(fout, "\n\tsoap_serialize_%s(soap, a", c_ident((Tnode*)typ->ref)); if (cardinality > 1) { fprintf(fout, "[i])"); } else { fprintf(fout, "+i)"); } } fprintf(fout, ";\n\t}"); fprintf(fout, "\n#endif\n}"); } else fprintf(fout, "\n\t(void)soap; (void)a; /* appease -Wall -Werror */\n}"); break; case Ttemplate: if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_serialize_%s(struct soap*, const %s);", c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap*, const %s);", c_ident(typ), c_type_id(typ, "*")); temp = (Tnode*)typ->ref; if (!temp) return; fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap *soap, const %s)\n{\n\t(void)soap; (void)a;/* appease -Wall -Werror */\n#ifndef WITH_NOIDREF", c_ident(typ), c_type_id(typ, "*a")); if (!is_XML(temp) && temp->type != Tfun && !is_void(temp)) { if (is_smart(typ)) { if (is_primitive(temp)) fprintf(fout, "\n\tsoap_reference(soap, a->get(), %s);", soap_type(temp)); else { if (is_dynamic_array(temp)) fprintf(fout, "\n\tif (*a)"); else fprintf(fout, "\n\tif (!soap_reference(soap, a->get(), %s))", soap_type(temp)); if (temp->type == Tclass && !is_external(temp) && !is_volatile(temp) && !is_typedef(temp)) fprintf(fout, "\n\t\t(*a)->soap_serialize(soap);"); else fprintf(fout, "\n\t\tsoap_serialize_%s(soap, a->get());", c_ident(temp)); } } else if (!is_primitive(temp)) { fprintf(fout, "\n\tfor (%s::const_iterator i = a->begin(); i != a->end(); ++i)", c_type(typ)); if (temp->type == Tclass && !is_external(temp) && !is_volatile(temp) && !is_typedef(temp)) fprintf(fout, "\n\t\t(*i).soap_serialize(soap);"); else fprintf(fout, "\n\t\tsoap_serialize_%s(soap, &(*i));", c_ident(temp)); } } fprintf(fout, "\n#endif\n}"); default: break; } } void soap_default(Tnode* typ) { int i, d; Table *table, *t; Entry *p; Tnode *temp; const char *s; int cardinality; if (typ->type == Tpointer && !is_string(typ)) return; if (typ->type != Tclass || !(typ->sym && (is_stdstring(typ) || is_stdwstring(typ)) && is_eq(typ->sym->name, "xsd__QName")) || is_imported(typ)) { if (is_typedef(typ) && (!is_external(typ) || is_volatile(typ))) { if (typ->type == Tclass && !is_stdstring(typ) && !is_stdwstring(typ) && !is_volatile(typ)) fprintf(fhead, "\n\n#define soap_default_%s(soap, a) (a)->%s::soap_default(soap)\n", c_ident(typ), t_ident(typ)); else if (typ->type == Tclass && is_eq(typ->sym->name, "xsd__QName")) fprintf(fhead, "\n\n#define soap_default_%s(soap, a) soap_default_std__string(soap, a)\n", c_ident(typ)); else fprintf(fhead, "\n\n#define soap_default_%s(soap, a) soap_default_%s(soap, a)\n", c_ident(typ), t_ident(typ)); return; } } p = is_dynamic_array(typ); if (p) { if (typ->type == Tclass && !is_volatile(typ)) { if (is_external(typ)) return; fprintf(fout, "\n\nvoid %s::soap_default(struct soap *soap)\n{", c_ident(typ)); if ((s = has_soapref(typ))) fprintf(fout, "\n\tthis->%s = soap;", s); else fprintf(fout, "\n\t(void)soap; /* appease -Wall -Werror */"); if (is_smart(p->info.typ)) fprintf(fout, "\n\tthis->%s.reset();", ident(p->sym->name)); else fprintf(fout, "\n\tthis->%s = NULL;", ident(p->sym->name)); d = get_Darraydims(typ); if (d) { for (i = 0; i < d; i++) { fprintf(fout, "\n\tthis->__size[%d] = 0;", i); if (has_offset(typ) && (((Table*)typ->ref)->list->next->next->info.sto & Sconst) == 0) fprintf(fout, "\n\tthis->__offset[%d] = 0;", i); } } else { fprintf(fout, "\n\tthis->__size = 0;"); if (has_offset(typ) && (((Table*)typ->ref)->list->next->next->info.sto & Sconst) == 0) fprintf(fout, "\n\tthis->__offset = 0;"); } if (is_attachment(typ)) fprintf(fout, "\n\tthis->id = NULL;\n\tthis->type = NULL;\n\tthis->options = NULL;"); fprintf(fout, "\n}"); } else { if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_default_%s(struct soap*, %s);", c_ident(typ), c_type_id(typ, "*")); return; } if (!cflag && !is_volatile(typ) && !has_constructor(typ) && !union_member(typ)) fprintf(fout, "\n\n%s::%s()\n{\n\tsoap_default_%s(NULL, this);\n}", c_ident(typ), c_ident(typ), c_ident(typ)); fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap*, %s);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap *soap, %s)\n{", c_ident(typ), c_type_id(typ, "*a")); if ((s = has_soapref(typ))) fprintf(fout, "\n\ta->%s = soap;", s); else fprintf(fout, "\n\t(void)soap; /* appease -Wall -Werror */"); fprintf(fout, "\n\ta->%s = NULL;", ident(p->sym->name)); d = get_Darraydims(typ); if (d) { for (i = 0; i < d; i++) { fprintf(fout, "\n\ta->__size[%d] = 0;", i); if (has_offset(typ) && (((Table*)typ->ref)->list->next->next->info.sto & Sconst) == 0) fprintf(fout, "\n\ta->__offset[%d] = 0;", i); } } else { fprintf(fout, "\n\ta->__size = 0;"); if (has_offset(typ) && (((Table*)typ->ref)->list->next->next->info.sto & Sconst) == 0) fprintf(fout, "\n\ta->__offset = 0;"); } if (is_attachment(typ)) fprintf(fout, "\n\ta->id = NULL;\n\ta->type = NULL;\n\ta->options = NULL;"); fprintf(fout, "\n}"); } fflush(fout); return; } if (is_primitive(typ) || is_string(typ)) { if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_default_%s(struct soap*, %s);", c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap*, %s);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap *soap, %s)\n{\n\t(void)soap; /* appease -Wall -Werror */\n#ifdef SOAP_DEFAULT_%s\n\t*a = SOAP_DEFAULT_%s;\n#else\n\t*a = (%s)0;\n#endif\n}", c_ident(typ), c_type_id(typ, "*a"), c_ident(typ), c_ident(typ), c_type(typ)); return; } if (is_fixedstring(typ)) { fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap*, char[]);", c_ident(typ)); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap *soap, char a[])\n{\n\t(void)soap; /* appease -Wall -Werror */\n\ta[0] = '\\0';\n}", c_ident(typ)); return; } if (is_stdstring(typ) || is_stdwstring(typ)) { fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap*, %s);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap *soap, %s)\n{\n\t(void)soap; /* appease -Wall -Werror */\n\tp->erase();\n}", c_ident(typ), c_type_id(typ, "*p")); return; } switch(typ->type) { case Tclass: if (!is_volatile(typ) && typ->ref) /* fall through to switch case Tstruct */ { if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_default_%s(struct soap*, %s);", c_ident(typ), c_type_id(typ, "*")); return; } table=(Table*)typ->ref; fprintf(fout, "\n\nvoid %s::soap_default(struct soap *soap)\n{", ident(typ->id->name)); if ((s = has_soapref(typ))) fprintf(fout, "\n\tthis->%s = soap;", s); else fprintf(fout, "\n\t(void)soap; /* appease -Wall -Werror */"); fflush(fout); if (table) { if (table->prev) fprintf(fout, "\n\tthis->%s::soap_default(soap);", ident(table->prev->sym->name)); for (p = table->list; p; p = p->next) { if (p->info.typ->type == Tfun || p->info.typ->type == Tunion) continue; if (p->info.sto & Sconst) fprintf(fout, "\n\t/* const %s skipped */", ident(p->sym->name)); else if (is_choice(p)) { fprintf(fout, "\n\tthis->%s::%s = %d;", ident(table->sym->name), ident(p->sym->name), required_choice(p->next->info.typ)); p = p->next; } else if (is_repetition(p) || is_anytype(p)) { fprintf(fout, "\n\tthis->%s::%s = 0;\n\tthis->%s::%s = NULL;", ident(table->sym->name), ident(p->sym->name), ident(table->sym->name), ident(p->next->sym->name)); p = p->next; } else { if (is_fixedstring(p->info.typ)) { if (p->info.hasval) fprintf(fout, "\n\tsoap_strcpy(this->%s::%s, %d, \"%s\");", ident(table->sym->name), ident(p->sym->name), get_dimension(p->info.typ), cstring(p->info.val.s, 0)); else fprintf(fout, "\n\tthis->%s::%s[0] = '\\0';", ident(table->sym->name), ident(p->sym->name)); } else if (p->info.typ->type == Tarray) { fprintf(fout, "\n\tsoap_default_%s(soap, this->%s::%s);", c_ident(p->info.typ), ident(table->sym->name), ident(p->sym->name)); } else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ) && !is_transient(p->info.typ)) fprintf(fout, "\n\tthis->%s::%s.%s::soap_default(soap);", ident(table->sym->name), ident(p->sym->name), c_ident(p->info.typ)); else if (p->info.hasval) { if (is_smart(p->info.typ)) { if (is_smart_shared(p->info.typ)) fprintf(fout, "\n\tthis->%s::%s = %s<%s>(%s\"%s\");", ident(table->sym->name), ident(p->sym->name), make_shared(p->info.typ), c_type(p->info.typ->ref), is_stdwstring(p->info.typ->ref) ? "L" : "", p->info.val.s); else fprintf(fout, "\n\tthis->%s::%s = %s(SOAP_NEW(%s)(%s\"%s\"));", ident(table->sym->name), ident(p->sym->name), c_type(p->info.typ), c_type(p->info.typ->ref), is_stdwstring(p->info.typ->ref) ? "L" : "", p->info.val.s); } else if (p->info.typ->type == Tpointer && is_stdstring((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\tstatic std::string soap_tmp_%s(\"%s\");\n\tthis->%s::%s = &soap_tmp_%s;", ident(p->sym->name), p->info.val.s, ident(table->sym->name), ident(p->sym->name), ident(p->sym->name)); else fprintf(fout, "\n\tthis->%s::%s%s;", ident(table->sym->name), ident(p->sym->name), c_init(p)); } else if (is_transient(p->info.typ) || is_void(p->info.typ)) fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); else if (p->info.typ->type == Tpointer && (!is_string(p->info.typ) || is_XML(p->info.typ) || (p->info.sto & Sconstptr))) fprintf(fout, "\n\tthis->%s::%s = NULL;", ident(table->sym->name), ident(p->sym->name)); else if (p->info.typ->type != Treference && p->info.typ->type != Trvalueref) fprintf(fout, "\n\tsoap_default_%s(soap, &this->%s::%s);", c_ident(p->info.typ), ident(table->sym->name), ident(p->sym->name)); else fprintf(fout, "\n\t/* %s skipped */", ident(p->sym->name)); } } } fprintf(fout, "\n}"); fflush(fout); break; } case Tstruct: if (is_external(typ) && !is_volatile(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_default_%s(struct soap*, %s);", c_ident(typ), c_type_id(typ, "*")); return; } if (!cflag && !is_volatile(typ) && !has_constructor(typ) && !union_member(typ)) fprintf(fout, "\n\n%s::%s()\n{\n\tsoap_default_%s(NULL, this);\n}", c_ident(typ), c_ident(typ), c_ident(typ)); fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap*, %s);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap *soap, %s)\n{", c_ident(typ), c_type_id(typ, "*a")); fflush(fout); if ((s = has_soapref(typ))) fprintf(fout, "\n\ta->%s = soap;", s); else fprintf(fout, "\n\t(void)soap; (void)a; /* appease -Wall -Werror */"); table = (Table*)typ->ref; for (t = table; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun || p->info.typ->type == Tunion) continue; if (p->info.sto & Sconst) fprintf(fout, "\n\t/* const %s skipped */", ident(p->sym->name)); else if (p->info.sto & (Sprivate | Sprotected)) fprintf(fout, "\n\t/* private/protected %s skipped */", ident(p->sym->name)); else if (is_choice(p)) { fprintf(fout, "\n\ta->%s = %d;", ident(p->sym->name), required_choice(p->next->info.typ)); p = p->next; } else if (is_repetition(p) || is_anytype(p)) { fprintf(fout, "\n\ta->%s = 0;\n\ta->%s = NULL;", ident(p->sym->name), ident(p->next->sym->name)); p = p->next; } else { if (is_fixedstring(p->info.typ)) { if (p->info.hasval) fprintf(fout, "\n\tsoap_strcpy(a->%s, %d, \"%s\");", ident(p->sym->name), get_dimension(p->info.typ), cstring(p->info.val.s, 0)); else fprintf(fout, "\n\ta->%s[0] = '\\0';", ident(p->sym->name)); } else if (p->info.typ->type == Tarray) fprintf(fout, "\n\tsoap_default_%s(soap, a->%s);", c_ident(p->info.typ), ident(p->sym->name)); else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ) && !is_transient(p->info.typ)) fprintf(fout, "\n\ta->%s.%s::soap_default(soap);", ident(p->sym->name), c_ident(p->info.typ)); else if (p->info.hasval) { if (is_smart(p->info.typ)) { if (is_smart_shared(p->info.typ)) fprintf(fout, "\n\tthis->%s = %s<%s>(%s\"%s\");", ident(p->sym->name), make_shared(p->info.typ), c_type(p->info.typ->ref), is_stdwstring(p->info.typ->ref) ? "L" : "", p->info.val.s); else fprintf(fout, "\n\tthis->%s = %s(SOAP_NEW(%s)(%s\"%s\"));", ident(p->sym->name), c_type(p->info.typ), c_type(p->info.typ->ref), is_stdwstring(p->info.typ->ref) ? "L" : "", p->info.val.s); } else if (p->info.typ->type == Tpointer && is_stdstring((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\tstatic std::string soap_tmp_%s(\"%s\");\n\ta->%s = &soap_tmp_%s;", ident(p->sym->name), p->info.val.s, ident(p->sym->name), ident(p->sym->name)); else fprintf(fout, "\n\ta->%s%s;", ident(p->sym->name), c_init(p)); } else if (is_transient(p->info.typ) || is_void(p->info.typ)) fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); else if (p->info.typ->type == Tpointer && (!is_string(p->info.typ) || is_XML(p->info.typ) || (p->info.sto & Sconstptr))) fprintf(fout, "\n\ta->%s = NULL;", ident(p->sym->name)); else if (p->info.typ->type != Treference && p->info.typ->type != Trvalueref) fprintf(fout, "\n\tsoap_default_%s(soap, &a->%s);", c_ident(p->info.typ), ident(p->sym->name)); else fprintf(fout, "\n\t/* %s skipped */", ident(p->sym->name)); } } } fprintf(fout, "\n}"); fflush(fout); break; case Tarray: if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_default_%s(struct soap*, %s);", c_ident(typ), c_type(typ)); return; } fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap*, %s);", c_ident(typ), c_type(typ)); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap *soap, %s)\n{", c_ident(typ), c_type_id(typ, "a")); fprintf(fout, "\n\tint i;"); fprintf(fout, "\n\t(void)soap; /* appease -Wall -Werror */"); fprintf(fout, "\n\tfor (i = 0; i < %d; i++)", get_dimension(typ)); temp = (Tnode*)typ->ref; cardinality = 1; while (temp->type == Tarray) { temp = (Tnode*)temp->ref; cardinality++; } if (((Tnode *)typ->ref)->type == Tclass && !is_external((Tnode*)typ->ref) && !is_volatile((Tnode*)typ->ref)) { if (cardinality>1) fprintf(fout, "a[i].%s::soap_default(soap)", t_ident((Tnode*)typ->ref)); else fprintf(fout, "(a+i)->soap_default(soap)"); } else if (((Tnode*)typ->ref)->type == Tpointer) fprintf(fout, "\n\ta[i] = NULL"); else { fprintf(fout, "\n\tsoap_default_%s(soap, a", c_ident((Tnode*)typ->ref)); if (cardinality>1) fprintf(fout, "[i])"); else fprintf(fout, "+i)"); } fprintf(fout, ";\n}"); break; case Ttemplate: if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_default_%s(struct soap*, %s);", c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap*, %s);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap *soap, %s)\n{", c_ident(typ), c_type_id(typ, "*p")); fprintf(fout, "\n\t(void)soap; /* appease -Wall -Werror */"); if (is_smart(typ)) fprintf(fout, "\n\tp->reset();"); else fprintf(fout, "\n\tp->clear();"); fprintf(fout, "\n}"); fflush(fout); break; default: break; } } void soap_traverse(Tnode* typ) { int d; Table *table, *t; Entry *p; Tnode* temp; int cardinality; if (is_primitive_or_string(typ) || is_fixedstring(typ)) { fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap *soap, %s, const char *s, soap_walker p, soap_walker q)\n{\t(void)soap; (void)q; /* appease -Wall -Werror */", c_ident(typ), c_type_id(typ, "*a")); fprintf(fout, "\n\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout, "\n\tif (q) q(soap, (void*)a, %s, s, \"%s\");\n}", soap_type(typ), c_type(typ)); return; } if (typ->type != Tclass || !(typ->sym && (is_stdstring(typ) || is_stdwstring(typ)) && is_eq(typ->sym->name, "xsd__QName")) || is_external(typ) || is_imported(typ)) if (is_typedef(typ) && !is_external(typ)) { if (typ->type == Tclass && !is_stdstring(typ) && !is_stdwstring(typ) && !is_volatile(typ)) fprintf(fhead, "\n\n#define soap_traverse_%s(soap, a, s, p, q) (a)->soap_traverse(soap, s, p, q)\n", c_ident(typ)); else if (typ->type == Tclass && is_eq(typ->sym->name, "xsd__QName")) fprintf(fhead, "\n\n#define soap_traverse_%s(soap, a, s, p, q) soap_traverse_std__string(soap, a, s, p, q)\n", c_ident(typ)); else fprintf(fhead, "\n\n#define soap_traverse_%s(soap, a, s, p, q) soap_traverse_%s(soap, a, s, p, q)\n", c_ident(typ), t_ident(typ)); return; } if (is_XML(typ)) { fprintf(fhead, "\n\n#define soap_traverse_%s(soap, a, s, p, q) soap_traverse_%s(soap, a, s, p, q)\n", c_ident(typ), t_ident(typ)); return; } if ((p = is_dynamic_array(typ))) { if (typ->type == Tclass && !is_volatile(typ)) { if (is_external(typ)) return; fprintf(fout, "\n\nvoid %s::soap_traverse(struct soap *soap, const char *s, soap_walker p, soap_walker q)\n{", c_ident(typ)); if (is_binary(typ)) { fprintf(fout, "\n\tif (this->%s && !soap_array_reference(soap, this, this->%s, this->__size, %s))\n\t{", ident(p->sym->name), ident(p->sym->name), soap_type(typ)); fprintf(fout, "\n\t\tif (p) p(soap, (void*)this, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout, "\n\t\tif (p) p(soap, (void*)this->%s, 0, \"%s\", NULL);", ident(p->sym->name), p->sym->name); if (is_attachment(typ)) { fprintf(fout, "\n\t\tif (this->id || this->type)\n\t\t\tsoap->mode |= SOAP_ENC_DIME;\n}"); fprintf(fout, "\n\t\tif (p) p(soap, (void*)this->id, SOAP_TYPE_string, \"id\", NULL);"); fprintf(fout, "\n\t\tif (q) q(soap, (void*)this->id, SOAP_TYPE_string, \"id\", NULL);"); fprintf(fout, "\n\t\tif (p) p(soap, (void*)this->type, SOAP_TYPE_string, \"type\", NULL);"); fprintf(fout, "\n\t\tif (q) q(soap, (void*)this->type, SOAP_TYPE_string, \"type\", NULL);"); fprintf(fout, "\n\t\tif (p) p(soap, (void*)this->options, 0, \"options\", NULL);"); fprintf(fout, "\n\t\tif (q) q(soap, (void*)this->options, 0, \"options\", NULL);"); } fprintf(fout, "\n\t\tif (q) q(soap, (void*)this->%s, 0, \"%s\", NULL);", ident(p->sym->name), p->sym->name); fprintf(fout, "\n\t\tif (q) q(soap, (void*)this, %s, s, \"%s\");\n\t}\n}", soap_type(typ), c_type(typ)); fflush(fout); return; } else { d = get_Darraydims(typ); if (d) { fprintf(fout, "\n\tif (this->%s && !soap_array_reference(soap, this, this->%s, %s, %s))\n\t{", ident(p->sym->name), ident(p->sym->name), get_Darraysize("this", d), soap_type(typ)); fprintf(fout, "\n\t\tif (p) p(soap, (void*)this, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout, "\n\t\tfor (size_t i = 0; i < soap_size(this->__size, %d); i++)", d); } else { fprintf(fout, "\n\tif (this->%s && !soap_array_reference(soap, this, this->%s, this->__size, %s))\n\t{", ident(p->sym->name), ident(p->sym->name), soap_type(typ)); fprintf(fout, "\n\t\tif (p) p(soap, (void*)this, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout, "\n\t\tfor (size_t i = 0; i < (size_t)this->__size; i++)"); } fprintf(fout, "\n\t\t{"); if (has_ptr((Tnode*)p->info.typ->ref)) fprintf(fout, "\tsoap_embedded(soap, this->%s + i, %s);", ident(p->sym->name), soap_type((Tnode*)p->info.typ->ref)); if (((Tnode*)p->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->info.typ->ref) && !is_volatile((Tnode*)p->info.typ->ref) && !is_typedef((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\tthis->%s[i].soap_traverse(soap, \"%s\", p, q);", ident(p->sym->name), p->sym->name); else fprintf(fout, "\n\t\t\tsoap_traverse_%s(soap, this->%s + i, \"%s\", p, q);", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name), ident(p->sym->name)); fprintf(fout, "\n\t\t}\n\t\tif (q) q(soap, (void*)this, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout, "\n\t}\n}"); return; } } else { if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap *soap, %s, const char *s, soap_walker p, soap_walker q)\n{", c_ident(typ), c_type_id(typ, "*a")); if (is_binary(typ)) { fprintf(fout, "\n\tif (a->%s && !soap_array_reference(soap, a, a->%s, a->__size, %s))\n\t{", ident(p->sym->name), ident(p->sym->name), soap_type(typ)); fprintf(fout, "\n\t\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout, "\n\t\tif (p) p(soap, (void*)a->%s, 0, \"%s\", NULL);", ident(p->sym->name), p->sym->name); if (is_attachment(typ)) { fprintf(fout, "\n\t\tif (a->id || a->type)\n\t\t\tsoap->mode |= SOAP_ENC_DIME;\n}"); fprintf(fout, "\n\t\tif (p) p(soap, (void*)a->id, SOAP_TYPE_string, \"id\", NULL);"); fprintf(fout, "\n\t\tif (q) q(soap, (void*)a->id, SOAP_TYPE_string, \"id\", NULL);"); fprintf(fout, "\n\t\tif (p) p(soap, (void*)a->type, SOAP_TYPE_string, \"type\", NULL);"); fprintf(fout, "\n\t\tif (q) q(soap, (void*)a->type, SOAP_TYPE_string, \"type\", NULL);"); fprintf(fout, "\n\t\tif (p) p(soap, (void*)a->options, 0, \"options\", NULL);"); fprintf(fout, "\n\t\tif (q) q(soap, (void*)a->options, 0, \"options\", NULL);"); } fprintf(fout, "\n\t\tif (q) q(soap, (void*)a->%s, 0, \"%s\", NULL);", ident(p->sym->name), p->sym->name); fprintf(fout, "\n\t\tif (q) q(soap, (void*)a, %s, s, \"%s\");\n\t}\n}", soap_type(typ), c_type(typ)); fflush(fout); return; } else { fprintf(fout, "\n\tsize_t i;"); d = get_Darraydims(typ); if (d) { fprintf(fout, "\n\tif (a->%s && !soap_array_reference(soap, a, a->%s, %s, %s))\n\t{", ident(p->sym->name), ident(p->sym->name), get_Darraysize("a", d), soap_type(typ)); fprintf(fout, "\n\t\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout, "\n\t\tfor (i = 0; i < soap_size(a->__size, %d); i++)", d); } else { fprintf(fout, "\n\tif (a->%s && !soap_array_reference(soap, a, a->%s, a->__size, %s))\n\t{", ident(p->sym->name), ident(p->sym->name), soap_type(typ)); fprintf(fout, "\n\t\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout, "\n\t\tfor (i = 0; i < (size_t)a->__size; i++)"); } fprintf(fout, "\n\t\t{"); if (has_ptr((Tnode*)p->info.typ->ref)) fprintf(fout, "\tsoap_embedded(soap, a->%s + i, %s);", ident(p->sym->name), soap_type((Tnode*)p->info.typ->ref)); if (((Tnode*)p->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->info.typ->ref) && !is_volatile((Tnode*)p->info.typ->ref) && !is_typedef((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\ta->%s[i].soap_traverse(soap, \"%s\", p, q);", ident(p->sym->name), p->sym->name); else fprintf(fout, "\n\t\t\tsoap_traverse_%s(soap, a->%s + i, \"%s\", p, q);", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name), p->sym->name); fprintf(fout, "\n\t\t}\n\t\tif (q) q(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout, "\n\t}\n}"); fflush(fout); return; } } } switch(typ->type) { case Tclass: if (!is_volatile(typ)) { if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ), c_type_id(typ, "*")); return; } table=(Table*)typ->ref; fprintf(fout, "\n\nvoid %s::soap_traverse(struct soap *soap, const char *s, soap_walker p, soap_walker q)\n{", ident(typ->id->name)); fprintf(fout, "\n\t(void)soap; /* appease -Wall -Werror */"); fprintf(fout, "\n\tif (p) p(soap, (void*)this, %s, s, \"%s\");", soap_type(typ), c_type(typ)); for (t = table; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun || p->info.typ->type == Tunion || is_soapref(p->info.typ)) ; else if (p->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name)); else if (is_transient(p->info.typ)) fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); else if (p->info.sto & Sattribute) ; else if (is_repetition(p)) { fprintf(fout, "\n\tif (this->%s::%s)", ident(t->sym->name), ident(p->next->sym->name)); fprintf(fout, "\n\t{\tint i;\n\t\tfor (i = 0; i < (int)this->%s::%s; i++)\n\t\t{", ident(t->sym->name), ident(p->sym->name)); if (!is_invisible(p->next->sym->name)) if (has_ptr((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_embedded(soap, this->%s::%s + i, %s);", ident(t->sym->name), ident(p->next->sym->name), soap_type((Tnode*)p->next->info.typ->ref)); if (((Tnode*)p->next->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->next->info.typ->ref) && !is_volatile((Tnode*)p->next->info.typ->ref) && !is_typedef((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tthis->%s::%s[i].soap_traverse(soap, \"%s\", p, q);", ident(t->sym->name), ident(p->next->sym->name), p->next->sym->name); else fprintf(fout, "\n\t\t\tsoap_traverse_%s(soap, this->%s::%s + i, \"%s\", p, q);", c_ident((Tnode*)p->next->info.typ->ref), ident(t->sym->name), ident(p->next->sym->name), p->next->sym->name); fprintf(fout, "\n\t\t}\n\t}"); p = p->next; } else if (is_anytype(p)) { p = p->next; } else if (is_choice(p)) { fprintf(fout, "\n\tsoap_traverse_%s(soap, this->%s::%s, &this->%s::%s, \"%s\", p, q);", c_ident(p->next->info.typ), ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->next->sym->name), p->next->sym->name); p = p->next; } else if (p->info.typ->type == Tarray) { if (has_ptr(p->info.typ)) fprintf(fout, "\n\tsoap_embedded(soap, this->%s::%s, %s);", ident(t->sym->name), ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout, "\n\tsoap_traverse_%s(soap, this->%s::%s, \"%s\", p, q);", c_ident(p->info.typ), ident(t->sym->name), ident(p->sym->name), p->sym->name); } else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { if (has_ptr(p->info.typ)) fprintf(fout, "\n\tsoap_embedded(soap, &this->%s::%s, %s);", ident(t->sym->name), ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout, "\n\tthis->%s::%s.soap_traverse(soap, \"%s\", p, q);", ident(t->sym->name), ident(p->sym->name), p->sym->name); } else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { if (!is_template(p->info.typ)) if (has_ptr(p->info.typ)) fprintf(fout, "\n\tsoap_embedded(soap, &this->%s::%s, %s);", ident(t->sym->name), ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout, "\n\tsoap_traverse_%s(soap, &this->%s::%s, \"%s\", p, q);", c_ident(p->info.typ), ident(t->sym->name), ident(p->sym->name), p->sym->name); } } } fprintf(fout, "\n\tif (q) q(soap, (void*)this, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout, "\n}"); break; } /* fall through to next case when class is volatile, since serializers cannot be member functions */ case Tstruct: if (is_external(typ) && !is_volatile(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ), c_type_id(typ, "*")); if (!typ->ref) return; fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap *soap, %s, const char *s, soap_walker p, soap_walker q)\n{", c_ident(typ), c_type_id(typ, "*a")); fprintf(fout, "\n\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); table=(Table*)typ->ref; for (t = table; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun || p->info.typ->type == Tunion || is_soapref(p->info.typ)) ; else if (p->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name)); else if (is_transient(p->info.typ)) fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); else if (p->info.sto & Sattribute) ; else if (is_repetition(p)) { fprintf(fout, "\n\tif (a->%s)", ident(p->next->sym->name)); fprintf(fout, "\n\t{\tint i;\n\t\tfor (i = 0; i < (int)a->%s; i++)\n\t\t{", ident(p->sym->name)); if (!is_invisible(p->next->sym->name)) if (has_ptr((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_embedded(soap, a->%s + i, %s);", ident(p->next->sym->name), soap_type((Tnode*)p->next->info.typ->ref)); if (((Tnode*)p->next->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->next->info.typ->ref) && !is_volatile((Tnode*)p->next->info.typ->ref) && !is_typedef((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\ta->%s[i].soap_traverse(soap, \"%s\", p, q);", ident(p->next->sym->name), p->next->sym->name); else fprintf(fout, "\n\t\t\tsoap_traverse_%s(soap, a->%s + i, \"%s\", p, q);", c_ident((Tnode*)p->next->info.typ->ref), ident(p->next->sym->name), p->next->sym->name); fprintf(fout, "\n\t\t}\n\t}"); p = p->next; } else if (is_anytype(p)) { p = p->next; } else if (is_choice(p)) { fprintf(fout, "\n\tsoap_traverse_%s(soap, a->%s, &a->%s, \"%s\", p, q);", c_ident(p->next->info.typ), ident(p->sym->name), ident(p->next->sym->name), p->next->sym->name); p = p->next; } else if (p->info.typ->type == Tarray) { if (has_ptr(p->info.typ)) fprintf(fout, "\n\tsoap_embedded(soap, a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout, "\n\tsoap_traverse_%s(soap, a->%s, \"%s\", p, q);", c_ident(p->info.typ), ident(p->sym->name), p->sym->name); } else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { if (has_ptr(p->info.typ)) fprintf(fout, "\n\tsoap_embedded(soap, &a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout, "\n\ta->%s.soap_traverse(soap, \"%s\", p, q);", ident(p->sym->name), p->sym->name); } else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { if (!is_template(p->info.typ)) if (has_ptr(p->info.typ)) fprintf(fout, "\n\tsoap_embedded(soap, &a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout, "\n\tsoap_traverse_%s(soap, &a->%s, \"%s\", p, q);", c_ident(p->info.typ), ident(p->sym->name), p->sym->name); } } } fprintf(fout, "\n\tif (q) q(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout, "\n}"); break; case Tunion: if (is_external(typ) && !is_volatile(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_traverse_%s(struct soap*, int, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ), c_type_id(typ, "*")); return; } table = (Table*)typ->ref; fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap*, int, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap *soap, int choice, %s, const char *s, soap_walker p, soap_walker q)\n{", c_ident(typ), c_type_id(typ, "*a")); fprintf(fout, "\n\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout, "\n\tswitch (choice)\n\t{"); for (t = table; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun || p->info.typ->type == Tunion) ; else if (p->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name)); else if (is_transient(p->info.typ)) fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); else if (p->info.sto & Sattribute) ; else if (is_repetition(p)) ; else if (is_anytype(p)) ; else if (p->info.typ->type == Tarray) { fprintf(fout, "\n\tcase %s:", soap_union_member(typ, p)); if (has_ptr(p->info.typ)) fprintf(fout, "\n\t\tsoap_embedded(soap, a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout, "\n\t\tsoap_traverse_%s(soap, a->%s, \"%s\", p, q);", c_ident(p->info.typ), ident(p->sym->name), p->sym->name); fprintf(fout, "\n\t\tbreak;"); } else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { fprintf(fout, "\n\tcase %s:", soap_union_member(typ, p)); if (has_ptr(p->info.typ)) fprintf(fout, "\n\t\tsoap_embedded(soap, &a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout, "\n\t\ta->%s.soap_traverse(soap, \"%s\", p, q);", ident(p->sym->name), p->sym->name); fprintf(fout, "\n\t\tbreak;"); } else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { fprintf(fout, "\n\tcase %s:", soap_union_member(typ, p)); if (has_ptr(p->info.typ)) fprintf(fout, "\n\t\tsoap_embedded(soap, &a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout, "\n\t\tsoap_traverse_%s(soap, &a->%s, \"%s\", p, q);", c_ident(p->info.typ), ident(p->sym->name), p->sym->name); fprintf(fout, "\n\t\tbreak;"); } } } fprintf(fout, "\n\tdefault:\n\t\tbreak;\n\t}"); fprintf(fout, "\n\tif (q) q(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout, "\n}"); break; case Tpointer: if (((Tnode*)typ->ref)->type == Tclass && !is_external((Tnode*)typ->ref) && !is_volatile((Tnode*)typ->ref) && !is_typedef((Tnode*)typ->ref)) { if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap *soap, %s, const char *s, soap_walker p, soap_walker q)\n{", c_ident(typ), c_type_id(typ, "*a")); p = is_dynamic_array((Tnode*)typ->ref); if (p) { d = get_Darraydims((Tnode*)typ->ref); if (d) fprintf(fout, "\n\tif (*a)"); else fprintf(fout, "\n\tif (*a)"); } else fprintf(fout, "\n\tif (!soap_reference(soap, *a, %s))", soap_type((Tnode*)typ->ref)); fprintf(fout, "\n\t\t(*a)->soap_traverse(soap, s, p, q);\n}"); } else { if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap *soap, %s, const char *s, soap_walker p, soap_walker q)\n{", c_ident(typ), c_type_id(typ, "*a")); if (is_primitive((Tnode*)typ->ref)) { fprintf(fout, "\n\tif (!soap_reference(soap, *a, %s))\n\t{", soap_type(typ)); fprintf(fout, "\n\t\tif (p) p(soap, (void*)*a, %s, s, \"%s\");", soap_type((Tnode*)typ->ref), c_type((Tnode*)typ->ref)); fprintf(fout, "\n\t\tif (q) q(soap, (void*)*a, %s, s, \"%s\");\n\t}\n}", soap_type((Tnode*)typ->ref), c_type((Tnode*)typ->ref)); } else if ((p = is_dynamic_array((Tnode*)typ->ref)) != NULL) { d = get_Darraydims((Tnode*)typ->ref); if (d) fprintf(fout, "\n\tif (*a)"); else fprintf(fout, "\n\tif (*a)"); fprintf(fout, "\n\t\tsoap_traverse_%s(soap, *a, s, p, q);\n}", c_ident((Tnode*)typ->ref)); } else { fprintf(fout, "\n\tif (!soap_reference(soap, *a, %s))", soap_type((Tnode*)typ->ref)); fprintf(fout, "\n\t\tsoap_traverse_%s(soap, *a, s, p, q);\n}", c_ident((Tnode*)typ->ref)); } } break; case Tarray: if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ), c_type(typ)); return; } fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ), c_type(typ)); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap *soap, %s, const char *s, soap_walker p, soap_walker q)", c_ident(typ), c_type_id(typ, "a")); if (is_primitive((Tnode*)typ->ref)) { fprintf(fout, "\n{"); fprintf(fout, "\n\t(void)soap; (void)a; /* appease -Wall -Werror */"); fprintf(fout, "\n\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); } else { fprintf(fout, "\n{\tsize_t i;"); fprintf(fout, "\n\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout, "\n\tfor (i = 0; i < %d; i++)", get_dimension(typ)); temp=(Tnode*)typ->ref;; cardinality = 1; while (temp->type == Tarray) { temp=(Tnode*)temp->ref; cardinality++; } fprintf(fout, "\n\t{"); if (has_ptr((Tnode*)typ->ref)) { fprintf(fout, "\tsoap_embedded(soap, a"); if (cardinality > 1) fprintf(fout, "[i]"); else fprintf(fout, "+i"); fprintf(fout, ", %s);", soap_type((Tnode*)typ->ref)); } if (((Tnode *)typ->ref)->type == Tclass && !is_external((Tnode*)typ->ref) && !is_volatile((Tnode*)typ->ref) && !is_typedef((Tnode*)typ->ref)) { fprintf(fout, "\n\ta[i].soap_traverse(soap, s, p, q)"); } else if (!is_primitive((Tnode*)typ->ref)) { fprintf(fout, "\n\tsoap_traverse_%s(soap, a", c_ident((Tnode*)typ->ref)); if (cardinality > 1) fprintf(fout, "[i], s, p, q)"); else fprintf(fout, "+i, s, p, q)"); } fprintf(fout, ";\n\t}"); } fprintf(fout, "\n\tif (q) q(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout, "\n}"); break; case Ttemplate: if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ), c_type_id(typ, "*")); temp = (Tnode*)typ->ref; if (!temp) return; fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap *soap, %s, const char *s, soap_walker p, soap_walker q)\n{\n\t(void)soap; (void)a; (void)s; (void)p; (void)q; /* appease -Wall -Werror */", c_ident(typ), c_type_id(typ, "*a")); if (!is_primitive(temp) && temp->type != Tfun && !is_void(temp)) { fprintf(fout, "\n\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout, "\n\tfor (%s::iterator i = a->begin(); i != a->end(); ++i)", c_type(typ)); if (temp->type == Tclass && !is_external(temp) && !is_volatile(temp) && !is_typedef(temp)) fprintf(fout, "\n\t\t(*i).soap_traverse(soap, s, p, q);"); else fprintf(fout, "\n\t\tsoap_traverse_%s(soap, &(*i), s, p, q);", c_ident(temp)); fprintf(fout, "\n\tif (q) q(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); } fprintf(fout, "\n}"); default: break; } } void soap_put(Tnode *typ) { const char *ci = c_ident(typ); const char *ct = c_type(typ); if (typ->type == Ttemplate || typ->type == Tunion) return; if (is_typedef(typ) && (is_element(typ) || is_synonym(typ))) { fprintf(fhead, "\n\n#define soap_put_%s soap_put_%s\n", c_ident(typ), t_ident(typ)); fprintf(fhead, "\n\n#define soap_write_%s soap_write_%s\n", c_ident(typ), t_ident(typ)); return; } if (typ->type == Tarray) { fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_put_%s(struct soap*, %s, const char*, const char*);", ci, c_type_id(typ, "const")); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_put_%s(struct soap *soap, %s, const char *tag, const char *type)\n{", ci, c_type_id(typ, "const a")); } else if (typ->type == Tclass && !is_external(typ) && !is_volatile(typ) && !is_typedef(typ)) fprintf(fout, "\n\nint %s::soap_put(struct soap *soap, const char *tag, const char *type) const\n{", ct); else if (typ->type == Tpointer) { fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_put_%s(struct soap*, %s, const char*, const char*);", ci, c_type_constptr_id(typ, "const*")); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_put_%s(struct soap *soap, %s, const char *tag, const char *type)\n{", ci, c_type_constptr_id(typ, "const*a")); } else { fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_put_%s(struct soap*, const %s, const char*, const char*);", ci, c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_put_%s(struct soap *soap, const %s, const char *tag, const char *type)\n{", ci, c_type_id(typ, "*a")); } fflush(fout); if (typ->type == Tclass && !is_external(typ) && !is_volatile(typ) && !is_typedef(typ)) fprintf(fout, "\n\tif (this->soap_out(soap, tag?tag:\"%s\", -2, type))\n\t\treturn soap->error;", xml_tag(typ)); else fprintf(fout, "\n\tif (soap_out_%s(soap, tag?tag:\"%s\", -2, a, type))\n\t\treturn soap->error;", ci, xml_tag(typ)); if (!is_invisible(typ->id->name)) fprintf(fout, "\n\treturn soap_putindependent(soap);\n}"); else fprintf(fout, "\n\treturn SOAP_OK;\n}"); #if 0 /* some compilers cannot handle this inlined function */ if (typ->type == Tclass && !is_external(typ) && !is_volatile(typ)) fprintf(fhead, "\n\ninline int soap_write_%s(struct soap *soap, %s) { if (p->soap_put(soap, \"%s\", NULL) || soap_end_send(soap)) return soap->error; return SOAP_OK; }\n", c_ident(typ), c_type_id(typ, "*p"), xml_tag(typ)); else if (typ->type != Treference) fprintf(fhead, "\n\ninline int soap_write_%s(struct soap *soap, %s) { if (soap_begin_send(soap) || soap_put_%s(soap, p, \"%s\", NULL) || soap_end_send(soap)) return soap->error; return SOAP_OK; }\n", c_ident(typ), c_type_id(typ, "*p"), c_ident(typ), xml_tag(typ)); #endif if (typ->type == Tclass && !is_external(typ) && !is_volatile(typ)) fprintf(fhead, "\n\n#ifndef soap_write_%s\n#define soap_write_%s(soap, data) ( soap_free_temp(soap), soap_begin_send(soap) || ((data)->soap_serialize(soap), 0) || (data)->soap_put(soap, \"%s\", NULL) || soap_end_send(soap), (soap)->error )\n#endif\n", c_ident(typ), c_ident(typ), xml_tag(typ)); else if (is_primitive(typ)) { if (namespaceid) fprintf(fhead, "\n\n#ifndef soap_write_%s\n#define soap_write_%s(soap, data) ( soap_free_temp(soap), soap_begin_send(soap) || %s::soap_put_%s(soap, data, \"%s\", NULL) || soap_end_send(soap), (soap)->error )\n#endif\n", c_ident(typ), c_ident(typ), namespaceid, c_ident(typ), xml_tag(typ)); else fprintf(fhead, "\n\n#ifndef soap_write_%s\n#define soap_write_%s(soap, data) ( soap_free_temp(soap), soap_begin_send(soap) || soap_put_%s(soap, data, \"%s\", NULL) || soap_end_send(soap), (soap)->error )\n#endif\n", c_ident(typ), c_ident(typ), c_ident(typ), xml_tag(typ)); } else if (typ->type != Treference) { if (namespaceid && (Qflag || !is_external(typ))) fprintf(fhead, "\n\n#ifndef soap_write_%s\n#define soap_write_%s(soap, data) ( soap_free_temp(soap), soap_begin_send(soap) || (%s::soap_serialize_%s(soap, data), 0) || %s::soap_put_%s(soap, data, \"%s\", NULL) || soap_end_send(soap), (soap)->error )\n#endif\n", c_ident(typ), c_ident(typ), namespaceid, c_ident(typ), namespaceid, c_ident(typ), xml_tag(typ)); else if (namespaceid) fprintf(fhead, "\n\n#ifndef soap_write_%s\n#define soap_write_%s(soap, data) ( soap_free_temp(soap), soap_begin_send(soap) || (soap_serialize_%s(soap, data), 0) || %s::soap_put_%s(soap, data, \"%s\", NULL) || soap_end_send(soap), (soap)->error )\n#endif\n", c_ident(typ), c_ident(typ), c_ident(typ), namespaceid, c_ident(typ), xml_tag(typ)); else fprintf(fhead, "\n\n#ifndef soap_write_%s\n#define soap_write_%s(soap, data) ( soap_free_temp(soap), soap_begin_send(soap) || (soap_serialize_%s(soap, data), 0) || soap_put_%s(soap, data, \"%s\", NULL) || soap_end_send(soap), (soap)->error )\n#endif\n", c_ident(typ), c_ident(typ), c_ident(typ), c_ident(typ), xml_tag(typ)); } fflush(fout); } Entry * is_dynamic_array(Tnode *typ) { Entry *p; Table *t; if ((typ->type == Tstruct || typ->type == Tclass) && typ->ref) { for (t = (Table*)typ->ref; t; t = t->prev) { p = t->list; while (p && p->info.typ->type == Tfun) p = p->next; if (p && (p->info.typ->type == Tpointer || is_smart(p->info.typ)) && !strncmp(ident(p->sym->name), "__ptr", 5)) if (p->next && (p->next->info.typ->type == Tint || (p->next->info.typ->type == Tarray && (((Tnode*)p->next->info.typ->ref)->type == Tint))) && !strcmp(ident(p->next->sym->name), "__size")) return p; } } return NULL; } Entry * is_discriminant(Tnode *typ) { Entry *p; Table *t; if ((typ->type == Tstruct || typ->type == Tclass) && typ->ref) { t = (Table*)typ->ref; /* only if this struct/class has a union and is not derived */ if (t && !t->prev) { p = t->list; if (p && p->info.typ->type == Tint && ((p->info.sto & Sspecial) || !strncmp(ident(p->sym->name), "__union", 7))) if (p->next && p->next->info.typ->type == Tunion) { Entry *q; for (q = p->next->next; q; q = q->next) { if (q->info.typ->type != Tfun && !is_void(q->info.typ) && !is_transient(q->info.typ)) return NULL; } return p; } } } return NULL; } int get_Darraydims(Tnode *typ) { Entry *p; Table *t; if ((typ->type == Tstruct || typ->type == Tclass) && typ->ref) { for (t = (Table*)typ->ref; t; t = t->prev) { p = t->list; while (p && p->info.typ->type == Tfun) p = p->next; if (p && (p->info.typ->type == Tpointer || is_smart(p->info.typ)) && !strncmp(ident(p->sym->name), "__ptr", 5)) if (p->next && p->next->info.typ->type == Tarray && ((Tnode*)p->next->info.typ->ref)->type == Tint && !strcmp(ident(p->next->sym->name), "__size")) return get_dimension(p->next->info.typ); } } return 0; } const char* get_Darraysize(const char *a, int d) { int i; char *s = (char*)emalloc(d * (strlen(a) + 16) + 1); *s = '\0'; for (i = 0; i < d; i++) { size_t l = strlen(s); sprintf(s + l, "%s%s->__size[%d]", i ? " * " : "", a, i); } return s; } int has_offset(Tnode *typ) { Entry *p; Table *t; if (typ->type == Tstruct || typ->type == Tclass) { for (t = (Table*)typ->ref; t; t = t->prev) { for (p = t->list; p; p = p->next) { if ((p->info.typ->type == Tint || (p->info.typ->type == Tarray && ((Tnode*)p->info.typ->ref)->type == Tint)) && !strcmp(ident(p->sym->name), "__offset")) return 1; } } } return 0; } int is_bool(Tnode *typ) { return (typ->type == Tenum && (Table*)typ->ref == booltable); } int is_boolean(Tnode *typ) { if (typ->type == Tenum) { if ((Table*)typ->ref == booltable) return 1; else { size_t n = strlen(ident(typ->id->name)); return n >= 7 && is_eq(ident(typ->id->name) + n - 7, "boolean"); } } return 0; } int is_hexBinary(Tnode *typ) { if (!is_binary(typ)) return 0; if (typ->sym) return typ->sym->name && strstr(typ->sym->name, "hex"); return typ->id && typ->id->name && strstr(typ->id->name, "hex"); } int is_binary(Tnode *typ) { if (!has_ns(typ) && !is_element(typ)) return 0; if (typ->type == Tstruct || typ->type == Tclass) { Table *t; for (t = (Table*)typ->ref; t; t = t->prev) { Entry *p; p = t->list; while (p && p->info.typ->type == Tfun) p = p->next; if (p && (p->info.typ->type == Tpointer || is_smart(p->info.typ)) && ((Tnode*)p->info.typ->ref)->type == Tuchar && !strcmp(ident(p->sym->name), "__ptr")) { p = p->next; return p && p->info.typ->type == Tint && !strcmp(ident(p->sym->name), "__size"); } } } return 0; } int is_attachment(Tnode *typ) { Entry *p; Table *t; if (!is_binary(typ) || is_transient(typ)) return 0; for (t = (Table*)typ->ref; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (is_string(p->info.typ) && !strcmp(p->sym->name, "id")) { p = p->next; if (!p || !is_string(p->info.typ) || strcmp(p->sym->name, "type")) break; p = p->next; if (!p || !is_string(p->info.typ) || strcmp(p->sym->name, "options")) break; return 1; } } } return 0; } int is_mutable(Entry *e) { return e->info.typ->transient == -4 || is_header_or_fault(e->info.typ); } int is_header_or_fault(Tnode *typ) { if (typ->type == Tpointer || typ->type == Treference) return is_header_or_fault((Tnode*)typ->ref); return (typ->type == Tstruct || typ->type == Tclass) && (!strcmp(ident(typ->id->name), "SOAP_ENV__Header") || !strcmp(ident(typ->id->name), "SOAP_ENV__Fault") || !strcmp(ident(typ->id->name), "SOAP_ENV__Code") || !strcmp(ident(typ->id->name), "SOAP_ENV__Detail") || !strcmp(ident(typ->id->name), "SOAP_ENV__Reason")); } int is_body(Tnode *typ) { if (typ->type == Tpointer || typ->type == Treference) return is_body((Tnode*)typ->ref); return (typ->type == Tstruct || typ->type == Tclass) && !strcmp(ident(typ->id->name), "SOAP_ENV__Body"); } long minlen(Tnode *typ) { if (!typ->hasmin || typ->min < 0 || typ->min > 2147483647) return 0; if (typ->incmin) return (long)typ->min; return (long)typ->min + 1; } long maxlen(Tnode *typ) { if (!typ->hasmax || typ->max < 0 || typ->max > 2147483647) return -1; if (typ->incmax) return (long)typ->max; return (long)typ->max - 1; } const char* pattern(Tnode *typ) { if (!typ->pattern || (typ->pattern[0] == '%' && typ->pattern[1])) return "NULL"; return cstring(typ->pattern, 1); } int is_soap12(const char *enc) { return !strcmp(envURI, "http://www.w3.org/2003/05/soap-envelope") || (enc && !strcmp(enc, "http://www.w3.org/2003/05/soap-encoding")); } int is_document(const char *style) { return soap_version < 0 || (!eflag && !style) || (style && !strcmp(style, "document")); } int is_literal(const char *encoding) { return soap_version < 0 || (!eflag && !encoding) || (encoding && !strcmp(encoding, "literal")); } const char * has_soapref(Tnode *typ) { Entry *p; Table *t; if (typ->type == Tstruct || typ->type == Tclass) for (t = (Table*)typ->ref; t; t = t->prev) for (p = t->list; p; p = p->next) if (is_soapref(p->info.typ) && (t == (Table*)typ->ref || !(p->info.sto & Sprivate))) return ident(p->sym->name); return NULL; } int is_soapref(Tnode *typ) { return typ->type == Tpointer && ((Tnode*)typ->ref)->type == Tstruct && ((Tnode*)typ->ref)->id == lookup("soap"); } const char * union_member(Tnode *typ) { Table *t; Entry *p, *q; for (p = classtable->list; p; p = p->next) if (p->info.typ->type == Tunion) for (t = (Table*)p->info.typ->ref; t; t = t->prev) for (q = t->list; q; q = q->next) if (typ == q->info.typ) return p->info.typ->id->name; return NULL; } int has_union(Tnode *typ) { Table *t; Entry *p; if (typ->type == Tclass || typ->type == Tstruct) { for (t = (Table*)typ->ref; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tunion) return 1; else if ((p->info.typ->type == Tstruct || p->info.typ->type == Tclass) && has_union(p->info.typ)) return 1; } } } return 0; } int has_constructor(Tnode *typ) { Table *t; Entry *p; if (typ->type == Tclass || typ->type == Tstruct) for (t = (Table*)typ->ref; t; t = t->prev) for (p = t->list; p; p = p->next) if (p->info.typ->type == Tfun && !strcmp(p->sym->name, typ->id->name) && ((FNinfo *)p->info.typ->ref)->ret->type == Tnone) if (!((FNinfo*)p->info.typ->ref)->args->list) return 1; return 0; } int has_destructor(Tnode *typ) { Entry *p; Table *t; if (typ->type == Tclass || typ->type == Tstruct) for (t = (Table*)typ->ref; t; t = t->prev) for (p = t->list; p; p = p->next) if (p->info.typ->type == Tfun && strchr(p->sym->name, '~')) return 1; return 0; } int has_getter(Tnode *typ) { Entry *p, *q; Table *t; if (typ->type == Tclass || (!cflag && typ->type == Tstruct)) { for (t = (Table*)typ->ref; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun && !strcmp(p->sym->name, "get") && ((FNinfo *)p->info.typ->ref)->ret->type == Tint) { q = ((FNinfo*)p->info.typ->ref)->args->list; if (q && q->info.typ->type == Tpointer && ((Tnode*)q->info.typ->ref)->type == Tstruct && ((Tnode*)q->info.typ->ref)->id == lookup("soap")) return 1; } } } } return 0; } int has_setter(Tnode *typ) { Entry *p, *q; Table *t; if (typ->type == Tclass || (!cflag && typ->type == Tstruct)) { for (t = (Table*)typ->ref; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun && !strcmp(p->sym->name, "set") && ((FNinfo *)p->info.typ->ref)->ret->type == Tint) { q = ((FNinfo*)p->info.typ->ref)->args->list; if (q && q->info.typ->type == Tpointer && ((Tnode*)q->info.typ->ref)->type == Tstruct && ((Tnode*)q->info.typ->ref)->id == lookup("soap")) return 1; } } } } return 0; } int is_primitive_or_string(Tnode *typ) { return is_primitive(typ) || is_string(typ) || is_wstring(typ) || is_stdstring(typ) || is_stdwstring(typ) || is_qname(typ) || is_stdqname(typ); } int is_primitive(Tnode *typ) { return typ->type >= Tchar && typ->type <= Tenumsc; } int is_string(Tnode *typ) { return typ->type == Tpointer && ((Tnode*)typ->ref)->type == Tchar && !((Tnode*)typ->ref)->sym; } int is_fixedstring(Tnode *typ) { return bflag && typ->type == Tarray && ((Tnode*)typ->ref)->type == Tchar; } int is_wstring(Tnode *typ) { return typ->type == Tpointer && ((Tnode*)typ->ref)->type == Twchar; } int is_stdstring(Tnode *typ) { return typ->type == Tclass && typ->id == lookup("std::string"); } int is_stdwstring(Tnode *typ) { return typ->type == Tclass && typ->id == lookup("std::wstring"); } int is_stdstr(Tnode *typ) { if (typ->type == Tpointer) return is_stdstring((Tnode*)typ->ref) || is_stdwstring((Tnode*)typ->ref); return is_stdstring(typ) || is_stdwstring(typ); } int is_typedef(Tnode *typ) { return typ->sym && !is_transient(typ); } /* synonym is a typedef of another typedef */ int is_synonym(Tnode *typ) { return is_typedef(typ) && typ->synonym != NULL; } int reflevel(Tnode *typ) { int level; for (level = 0; typ->type == Tpointer || is_smart(typ); level++) typ = (Tnode*)typ->ref; return level; } Tnode * reftype(Tnode *typ) { while ((typ->type == Tpointer && !is_string(typ) && !is_wstring(typ)) || typ->type == Treference || typ->type == Trvalueref || is_smart(typ)) typ = (Tnode*)typ->ref; return typ; } void soap_set_attr(Entry *p, const char *obj, const char *name, const char *tag) { Tnode *typ = p->info.typ; int flag = (p->info.minOccurs == 0 && !p->info.hasval); int pat = 0; if (p->info.sto & (Sconst | Sprivate | Sprotected)) return; if (typ->type == Treference || typ->type == Trvalueref) typ = typ->ref; if (p->info.typ->pattern && p->info.typ->pattern[0] == '%' && p->info.typ->pattern[1]) { if (typ->type == Tfloat) fprintf(fout, "\n\t{\tconst char *%s_tmp = soap->float_format;\n\t\tsoap->float_format = \"%s\";", name, p->info.typ->pattern); else if (typ->type == Tdouble) fprintf(fout, "\n\t{\tconst char *%s_tmp = soap->double_format;\n\t\tsoap->double_format = \"%s\";", name, p->info.typ->pattern); else if (typ->type == Tldouble) fprintf(fout, "\n\t{\tconst char *%s_tmp = soap->long_double_format;\n\t\tsoap->long_double_format = \"%s\";", name, p->info.typ->pattern); pat = 1; } if ((is_external(typ) || is_typedef(typ)) && !is_anyAttribute(typ) && !is_anyType(typ) && !is_smart(typ) && typ->type != Tpointer && !is_stdstr(typ) && !is_string(typ) && !is_wstring(typ) && !is_binary(typ)) fprintf(fout, "\n\tsoap_set_attr(soap, \"%s\", soap_%s2s(soap, %s->%s), 1);", tag, c_ident(typ), obj, name); else if (is_qname(typ)) fprintf(fout, "\n\tif (%s->%s)\n\t\tsoap_set_attr(soap, \"%s\", soap_QName2s(soap, (char*)%s->%s), 1);", obj, name, tag, obj, name); else if (is_string(typ)) fprintf(fout, "\n\tif (%s->%s)\n\t\tsoap_set_attr(soap, \"%s\", (char*)%s->%s, 1);", obj, name, tag, obj, name); else if (is_wstring(typ)) fprintf(fout, "\n\tif (%s->%s)\n\t\tsoap_set_attr(soap, \"%s\", soap_wchar2s(soap, (wchar_t*)%s->%s), 2);", obj, name, tag, obj, name); else if (is_stdqname(typ)) fprintf(fout, "\n\tif (!%s->%s.empty())\n\t\tsoap_set_attr(soap, \"%s\", soap_QName2s(soap, %s->%s.c_str()), 1);", obj, name, tag, obj, name); else if (is_stdstring(typ)) { if (flag) fprintf(fout, "\n\tif (!%s->%s.empty())", obj, name); fprintf(fout, "\n\tsoap_set_attr(soap, \"%s\", %s->%s.c_str(), 1);", tag, obj, name); } else if (is_stdwstring(typ)) { if (flag) fprintf(fout, "\n\tif (!%s->%s.empty())", obj, name); fprintf(fout, "\n\tsoap_set_attr(soap, \"%s\", soap_wchar2s(soap, %s->%s.c_str()), 2);", tag, obj, name); } else if (typ->type == Tllong || typ->type == Tullong) fprintf(fout, "\n\tsoap_set_attr(soap, \"%s\", soap_%s2s(soap, %s->%s), 1);", tag, c_type(typ), obj, name); else if (typ->type == Tenum || typ->type == Tenumsc) fprintf(fout, "\n\tsoap_set_attr(soap, \"%s\", soap_%s2s(soap, %s->%s), 1);", tag, c_ident(typ), obj, name); else if (is_smart(typ) || typ->type == Tpointer) { Tnode *ptr = (Tnode*)typ->ref; fprintf(fout, "\n\tif (%s->%s)", obj, name); if ((is_external(ptr) || is_typedef(ptr)) && !is_anyAttribute(ptr) && !is_anyType(ptr) && !is_stdstr(ptr) && !is_string(ptr) && !is_wstring(ptr) && !is_binary(ptr)) fprintf(fout, "\n\t\tsoap_set_attr(soap, \"%s\", soap_%s2s(soap, *%s->%s), 1);", tag, c_ident(ptr), obj, name); else if (is_qname(ptr)) fprintf(fout, "\n\t\tif (*%s->%s)\n\t\t\tsoap_set_attr(soap, \"%s\", soap_QName2s(soap, *(char**)%s->%s), 1);", obj, name, tag, obj, name); else if (is_string(ptr)) fprintf(fout, "\n\t\tif (*%s->%s)\n\t\t\tsoap_set_attr(soap, \"%s\", *(char**)%s->%s, 1);", obj, name, tag, obj, name); else if (is_wstring(ptr)) fprintf(fout, "\n\t\tif (*%s->%s)\n\t\t\tsoap_set_attr(soap, \"%s\", soap_wchar2s(soap, *(wchar_t**)%s->%s), 2);", obj, name, tag, obj, name); else if (ptr->type == Tllong || ptr->type == Tullong) fprintf(fout, "\n\t\tsoap_set_attr(soap, \"%s\", soap_%s2s(soap, *%s->%s), 1);", tag, c_type(ptr), obj, name); else if (ptr->type == Tenum || ptr->type == Tenumsc) fprintf(fout, "\n\t\tsoap_set_attr(soap, \"%s\", soap_%s2s(soap, *%s->%s), 1);", tag, c_ident(ptr), obj, name); else if (is_stdqname(ptr)) fprintf(fout, "\n\t\tsoap_set_attr(soap, \"%s\", soap_QName2s(soap, %s->%s->c_str()), 1);", tag, obj, name); else if (is_stdstring(ptr)) fprintf(fout, "\n\t\tsoap_set_attr(soap, \"%s\", %s->%s->c_str(), 1);", tag, obj, name); else if (is_stdwstring(ptr)) fprintf(fout, "\n\t\tsoap_set_attr(soap, \"%s\", soap_wchar2s(soap, %s->%s->c_str()), 2);", tag, obj, name); else if (is_primitive(ptr)) fprintf(fout, "\n\t\tsoap_set_attr(soap, \"%s\", soap_%s2s(soap, *%s->%s), 1);", tag, the_type(ptr), obj, name); else if (is_hexBinary(ptr)) fprintf(fout, "\n\t\tif (%s->%s->__ptr)\n\t\t\tsoap_set_attr(soap, \"%s\", soap_s2hex(soap, %s->%s->__ptr, NULL, %s->%s->__size), 1);", obj, name, tag, obj, name, obj, name); else if (is_binary(ptr)) fprintf(fout, "\n\t\tif (%s->%s->__ptr)\n\t\t\tsoap_set_attr(soap, \"%s\", soap_s2base64(soap, %s->%s->__ptr, NULL, %s->%s->__size), 1);", obj, name, tag, obj, name, obj, name); else if (is_anyAttribute(ptr)) fprintf(fout, "\n\t\tif (soap_out_%s(soap, \"%s\", -1, %s->%s, \"%s\"))\n\t\t\treturn soap->error;", c_ident(ptr), tag, obj, name, xsi_type_u(ptr)); else { sprintf(errbuf, "Member '%s' cannot be serialized as an XML attribute", name); semwarn(errbuf); } } else if (is_primitive(typ)) fprintf(fout, "\n\tsoap_set_attr(soap, \"%s\", soap_%s2s(soap, %s->%s), 1);", tag, the_type(typ), obj, name); else if (is_hexBinary(typ)) fprintf(fout, "\n\tif (%s->%s.__ptr)\n\t\tsoap_set_attr(soap, \"%s\", soap_s2hex(soap, %s->%s.__ptr, NULL, %s->%s.__size), 1);", obj, name, tag, obj, name, obj, name); else if (is_binary(typ)) fprintf(fout, "\n\tif (%s->%s.__ptr)\n\t\tsoap_set_attr(soap, \"%s\", soap_s2base64(soap, %s->%s.__ptr, NULL, %s->%s.__size), 1);", obj, name, tag, obj, name, obj, name); else if (is_anyAttribute(typ)) fprintf(fout, "\n\tif (soap_out_%s(soap, \"%s\", -1, &%s->%s, \"%s\"))\n\t\treturn soap->error;", c_ident(typ), tag, obj, name, xsi_type_u(typ)); else { sprintf(errbuf, "Member '%s' cannot be serialized as an XML attribute", name); semwarn(errbuf); } if (pat) { if (typ->type == Tfloat) fprintf(fout, "\n\t\tsoap->float_format = %s_tmp;\n\t}", name); else if (typ->type == Tdouble) fprintf(fout, "\n\t\tsoap->double_format = %s_tmp;\n\t}", name); else if (typ->type == Tldouble) fprintf(fout, "\n\t\tsoap->long_double_format = %s_tmp;\n\t}", name); } } void soap_attr_value(Entry *p, const char *obj, const char *name, const char *tag) { int flag = 0; Tnode *typ = p->info.typ; if (p->info.sto & (Sconst | Sprivate | Sprotected)) return; if (typ->type == Treference || typ->type == Trvalueref) typ = typ->ref; if (p->info.maxOccurs == 0) flag = 2; /* prohibited */ else if (p->info.minOccurs >= 1 && !p->info.hasval) flag = 1; /* required */ if (sflag && flag) flag += 2; /* prohibited/required if SOAP_XML_STRICT */ if ((is_external(typ) || is_typedef(typ)) && !is_anyAttribute(typ) && !is_anyType(typ) && !is_smart(typ) && typ->type != Tpointer && !is_stdstr(typ) && !is_string(typ) && !is_wstring(typ) && !is_binary(typ)) fprintf(fout, "\n\tif (soap_s2%s(soap, soap_attr_value(soap, \"%s\", %d), &%s->%s))\n\t\treturn NULL;", c_ident(typ), tag, flag, obj, name); else if (typ->type == Tllong || typ->type == Tullong) fprintf(fout, "\n\tif (soap_s2%s(soap, soap_attr_value(soap, \"%s\", %d), &%s->%s))\n\t\treturn NULL;", c_type(typ), tag, flag, obj, name); else if (typ->type == Tenum || typ->type == Tenumsc) fprintf(fout, "\n\tif (soap_s2%s(soap, soap_attr_value(soap, \"%s\", %d), &%s->%s))\n\t\treturn NULL;", c_ident(typ), tag, flag, obj, name); else if (is_qname(typ)) fprintf(fout, "\n\tif (soap_s2QName(soap, soap_attr_value(soap, \"%s\", %d), (char**)&%s->%s, %ld, %ld))\n\t\treturn NULL;", tag, flag, obj, name, minlen(typ), maxlen(typ)); else if (is_string(typ)) fprintf(fout, "\n\tif (soap_s2string(soap, soap_attr_value(soap, \"%s\", %d), (char**)&%s->%s, %ld, %ld))\n\t\treturn NULL;", tag, flag, obj, name, minlen(typ), maxlen(typ)); else if (is_wstring(typ)) fprintf(fout, "\n\tif (soap_s2wchar(soap, soap_attr_value(soap, \"%s\", %d), (wchar_t**)&%s->%s, %ld, %ld))\n\t\treturn NULL;", tag, flag, obj, name, minlen(typ), maxlen(typ)); else if (is_stdqname(typ)) fprintf(fout, "\n\tif (soap_s2std__QName(soap, soap_attr_value(soap, \"%s\", %d), &%s->%s, %ld, %ld))\n\t\treturn NULL;", tag, flag, obj, name, minlen(typ), maxlen(typ)); else if (is_stdstring(typ)) fprintf(fout, "\n\tif (soap_s2std__string(soap, soap_attr_value(soap, \"%s\", %d), &%s->%s, %ld, %ld))\n\t\treturn NULL;", tag, flag, obj, name, minlen(typ), maxlen(typ)); else if (is_stdwstring(typ)) fprintf(fout, "\n\tif (soap_s2std__wstring(soap, soap_attr_value(soap, \"%s\", %d), &%s->%s, %ld, %ld))\n\t\treturn NULL;", tag, flag, obj, name, minlen(typ), maxlen(typ)); else if (is_smart(typ) || typ->type == Tpointer) { Tnode *ptr = (Tnode*)typ->ref; const char *get = ""; if (!is_anyAttribute(ptr) && !is_anyType(ptr)) fprintf(fout, "\n\t{\tconst char *t = soap_attr_value(soap, \"%s\", %d);\n\t\tif (t)\n\t\t{", tag, flag); if (is_smart(typ)) { fprintf(fout, "\n\t\t\t%s->%s = %s(SOAP_NEW(%s));", obj, name, c_type(typ), c_type(ptr)); get = ".get()"; } else if (is_stdstr(ptr)) fprintf(fout, "\n\t\t\tif (!(%s->%s = soap_new_%s(soap)))\n\t\t\t{\tsoap->error = SOAP_EOM;\n\t\t\t\treturn NULL;\n\t\t\t}", obj, name, c_ident(ptr)); else fprintf(fout, "\n\t\t\tif (!(%s->%s = (%s)soap_malloc(soap, sizeof(%s))))\n\t\t\t{\tsoap->error = SOAP_EOM;\n\t\t\t\treturn NULL;\n\t\t\t}", obj, name, c_type(typ), c_type(ptr)); if ((is_external(ptr) || is_typedef(ptr)) && !is_anyAttribute(ptr) && !is_anyType(ptr) && !is_stdstr(ptr) && !is_string(ptr) && !is_wstring(ptr) && !is_binary(ptr)) fprintf(fout, "\n\t\t\tif (soap_s2%s(soap, t, %s->%s%s))\n\t\t\t\treturn NULL;", c_ident(ptr), obj, name, get); else if (ptr->type == Tllong || ptr->type == Tullong) fprintf(fout, "\n\t\t\tif (soap_s2%s(soap, t, %s->%s%s))\n\t\t\t\treturn NULL;", c_type(ptr), obj, name, get); else if (ptr->type == Tenum || ptr->type == Tenumsc) fprintf(fout, "\n\t\t\tif (soap_s2%s(soap, t, %s->%s%s))\n\t\t\t\treturn NULL;", c_ident(ptr), obj, name, get); else if (is_qname(ptr)) fprintf(fout, "\n\t\t\tif (soap_s2QName(soap, t, (char**)%s->%s%s, %ld, %ld))\n\t\t\t\treturn NULL;", obj, name, get, minlen(ptr), maxlen(ptr)); else if (is_string(ptr)) fprintf(fout, "\n\t\t\tif (soap_s2string(soap, t, (char**)%s->%s%s, %ld, %ld))\n\t\t\t\treturn NULL;", obj, name, get, minlen(ptr), maxlen(ptr)); else if (is_wstring(ptr)) fprintf(fout, "\n\t\t\tif (soap_s2wchar(soap, t, (wchar_t**)%s->%s%s, %ld, %ld))\n\t\t\t\treturn NULL;", obj, name, get, minlen(ptr), maxlen(ptr)); else if (is_stdqname(ptr)) fprintf(fout, "\n\t\t\tif (soap_s2std__QName(soap, t, %s->%s%s, %ld, %ld))\n\t\t\t\treturn NULL;", obj, name, get, minlen(ptr), maxlen(ptr)); else if (is_stdstring(ptr)) fprintf(fout, "\n\t\t\tif (soap_s2std__string(soap, t, %s->%s%s, %ld, %ld))\n\t\t\t\treturn NULL;", obj, name, get, minlen(ptr), maxlen(ptr)); else if (is_stdwstring(ptr)) fprintf(fout, "\n\t\t\tif (soap_s2std__wstring(soap, t, %s->%s%s, %ld, %ld))\n\t\t\t\treturn NULL;", obj, name, get, minlen(ptr), maxlen(ptr)); else if (is_hexBinary(ptr)) fprintf(fout, "\n\t\t\tif (!(%s->%s->__ptr = (unsigned char*)soap_hex2s(soap, t, NULL, 0, &%s->%s->__size)))\n\t\t\t\treturn NULL;", obj, name, obj, name); else if (is_binary(ptr)) fprintf(fout, "\n\t\t\tif (!(%s->%s->__ptr = (unsigned char*)soap_base642s(soap, t, NULL, 0, &%s->%s->__size)))\n\t\t\t\treturn NULL;", obj, name, obj, name); else if (is_smart(typ) && is_anyAttribute(ptr)) fprintf(fout, "\n\t\t\tif (!soap_in_%s(soap, \"%s\", %s->%s%s, \"%s\")\n\t\t\t\t%s->%s.reset();", c_ident(ptr), tag, obj, name, get, xsi_type(ptr), obj, name); else if (is_anyAttribute(ptr)) fprintf(fout, "\n\t\t\t%s->%s = soap_in_%s(soap, \"%s\", %s->%s, \"%s\");", obj, name, c_ident(ptr), tag, obj, name, xsi_type(ptr)); else if (is_primitive(ptr)) fprintf(fout, "\n\t\t\tif (soap_s2%s(soap, t, %s->%s%s))\n\t\t\t\treturn NULL;", the_type(ptr), obj, name, get); if (!is_anyAttribute(ptr) && !is_anyType(ptr)) fprintf(fout, "\n\t\t}\n\t\telse if (soap->error)\n\t\t\treturn NULL;\n\t}"); } else if (is_hexBinary(typ)) fprintf(fout, "\n\tif (!(%s->%s.__ptr = (unsigned char*)soap_hex2s(soap, soap_attr_value(soap, \"%s\", %d), NULL, 0, &%s->%s.__size)))\n\t\treturn NULL;", obj, name, tag, flag, obj, name); else if (is_binary(typ)) fprintf(fout, "\n\tif (!(%s->%s.__ptr = (unsigned char*)soap_base642s(soap, soap_attr_value(soap, \"%s\", %d), NULL, 0, &%s->%s.__size)))\n\t\treturn NULL;", obj, name, tag, flag, obj, name); else if (is_anyAttribute(typ)) fprintf(fout, "\n\tsoap_in_%s(soap, \"%s\", &%s->%s, \"%s\");", c_ident(typ), tag, obj, name, xsi_type(typ)); else if (is_primitive(typ)) fprintf(fout, "\n\tif (soap_s2%s(soap, soap_attr_value(soap, \"%s\", %d), &%s->%s))\n\t\treturn NULL;", the_type(typ), tag, flag, obj, name); if (is_smart(typ) || typ->type == Tpointer) { if (!is_string(typ) && !is_wstring(typ)) { Tnode *ptr = (Tnode*)typ->ref; if (!is_string(ptr) && !is_wstring(ptr) && !is_stdstr(ptr)) { if (ptr->hasmin) { if ((ptr->type >= Tfloat && ptr->type <= Tldouble) || is_external(ptr)) fprintf(fout, "\n\tif (%s->%s && *%s->%s %s %lG)\n\t{\tsoap->error = SOAP_LENGTH;\n\t\treturn NULL;\n\t}", obj, name, obj, name, ptr->incmin ? "<" : "<=", ptr->min); else if (ptr->min > 0 || ptr->type < Tuchar || ptr->type > Tullong) fprintf(fout, "\n\tif (%s->%s && *%s->%s %s " SOAP_LONG_FORMAT ")\n\t{\tsoap->error = SOAP_LENGTH;\n\t\treturn NULL;\n\t}", obj, name, obj, name, ptr->incmin ? "<" : "<=", (LONG64)ptr->min); } if (ptr->hasmax) { if ((ptr->type >= Tfloat && ptr->type <= Tldouble) || is_external(ptr)) fprintf(fout, "\n\tif (%s->%s && *%s->%s %s %lG)\n\t{\tsoap->error = SOAP_LENGTH;\n\t\treturn NULL;\n\t}", obj, name, obj, name, ptr->incmax ? ">" : ">=", ptr->max); else if (ptr->max >= 0 || ptr->type < Tuchar || ptr->type > Tullong) fprintf(fout, "\n\tif (%s->%s && *%s->%s %s " SOAP_LONG_FORMAT ")\n\t{\tsoap->error = SOAP_LENGTH;\n\t\treturn NULL;\n\t}", obj, name, obj, name, ptr->incmax ? ">" : ">=", (LONG64)ptr->max); } } } } else if (!is_stdstr(typ)) { if (typ->hasmin) { if ((typ->type >= Tfloat && typ->type <= Tldouble) || is_external(typ)) fprintf(fout, "\n\tif (%s->%s %s %lG)\n\t{\tsoap->error = SOAP_LENGTH;\n\t\treturn NULL;\n\t}", obj, name, typ->incmin ? "<" : "<=", typ->min); else if (typ->min > 0 || typ->type < Tuchar || typ->type > Tullong) fprintf(fout, "\n\tif (%s->%s %s " SOAP_LONG_FORMAT ")\n\t{\tsoap->error = SOAP_LENGTH;\n\t\treturn NULL;\n\t}", obj, name, typ->incmin ? "<" : "<=", (LONG64)typ->min); } if (typ->hasmax) { if ((typ->type >= Tfloat && typ->type <= Tldouble) || is_external(typ)) fprintf(fout, "\n\tif (%s->%s %s %lG)\n\t{\tsoap->error = SOAP_LENGTH;\n\t\treturn NULL;\n\t}", obj, name, typ->incmax ? ">" : ">=", typ->max); else if (typ->max >= 0 || typ->type < Tuchar || typ->type > Tullong) fprintf(fout, "\n\tif (%s->%s %s " SOAP_LONG_FORMAT ")\n\t{\tsoap->error = SOAP_LENGTH;\n\t\treturn NULL;\n\t}", obj, name, typ->incmax ? ">" : ">=", (LONG64)typ->max); } } } const char * ptr_cast(Table *t, const char *name) { const char *type = ident(t->sym->name); char *s = (char*)emalloc(strlen(type) + strlen(name) + 6); sprintf(s, "((%s*)%s)", type, name); return s; } void soap_out(Tnode *typ) { Table *table, *t; Entry *p = NULL; int cardinality, i, j, d; Tnode *n; const char *nse = ns_qualifiedElement(typ); const char *nsa = ns_qualifiedAttribute(typ); if (is_dynamic_array(typ)) { soap_out_Darray(typ); return; } if (is_external(typ) && !is_volatile(typ)) fprintf(fhead, "\nSOAP_FMAC3S const char* SOAP_FMAC4S soap_%s2s(struct soap*, %s);", c_ident(typ), c_type(typ)); if (is_typedef(typ) && (!is_external(typ) || is_volatile(typ)) && !is_qname(typ) && !is_stdqname(typ)) fprintf(fhead, "\n\n#define soap_%s2s soap_%s2s\n", c_ident(typ), t_ident(typ)); if (is_typedef(typ) && (is_element(typ) || is_synonym(typ) || is_external(typ)) && (!is_external(typ) || is_volatile(typ))) { fprintf(fhead, "\n\n#define soap_out_%s soap_out_%s\n", c_ident(typ), t_ident(typ)); return; } if (is_primitive(typ) && typ->type != Tenum && typ->type != Tenumsc) { if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, const %s, const char *type)\n{", c_ident(typ), c_type_id(typ, "*a")); if (typ->pattern && typ->pattern[0] == '%' && typ->pattern[1]) { fprintf(fout, "\n\tint err;"); if (typ->type == Tfloat) fprintf(fout, "\n\tconst char *s = soap->float_format;\n\tsoap->float_format = \"%s\";", typ->pattern); else if (typ->type == Tdouble) fprintf(fout, "\n\tconst char *s = soap->double_format;\n\tsoap->double_format = \"%s\";", typ->pattern); else if (typ->type == Tldouble) fprintf(fout, "\n\tconst char *s = soap->long_double_format;\n\tsoap->long_double_format = \"%s\";", typ->pattern); if (typ->type == Tllong || typ->type == Tullong) fprintf(fout, "\n\terr = soap_out%s(soap, tag, id, a, type, %s);", c_type(typ), soap_type(typ)); else fprintf(fout, "\n\terr = soap_out%s(soap, tag, id, a, type, %s);", the_type(typ), soap_type(typ)); if (typ->type == Tfloat) fprintf(fout, "\n\tsoap->float_format = s;"); else if (typ->type == Tdouble) fprintf(fout, "\n\tsoap->double_format = s;"); else if (typ->type == Tldouble) fprintf(fout, "\n\tsoap->long_double_format = s;"); fprintf(fout, "\n\treturn err;\n}"); } else { if (typ->type == Tllong || typ->type == Tullong) fprintf(fout, "\n\treturn soap_out%s(soap, tag, id, a, type, %s);\n}", c_type(typ), soap_type(typ)); else fprintf(fout, "\n\treturn soap_out%s(soap, tag, id, a, type, %s);\n}", the_type(typ), soap_type(typ)); } return; } if (is_fixedstring(typ)) { fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, const char[], const char*);", c_ident(typ)); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, const char a[], const char *type)\n{", c_ident(typ)); fprintf(fout, "\n\treturn soap_outstring(soap, tag, id, (char*const*)(void*)&a, type, %s);\n}", soap_type(typ)); return; } if (is_string(typ)) { if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, char*const*, const char*);", c_ident(typ)); return; } fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, char*const*, const char*);", c_ident(typ)); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, char *const*a, const char *type)\n{", c_ident(typ)); fprintf(fout, "\n\treturn soap_outstring(soap, tag, id, a, type, %s);\n}", soap_type(typ)); return; } if (is_wstring(typ)) { if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, wchar_t*const*, const char*);", c_ident(typ)); return; } fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, wchar_t*const*, const char*);", c_ident(typ)); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, wchar_t *const*a, const char *type)\n{", c_ident(typ)); fprintf(fout, "\n\treturn soap_outwstring(soap, tag, id, a, type, %s);\n}", soap_type(typ)); return; } if (is_stdstring(typ)) { if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, const std::string*, const char*);", c_ident(typ)); return; } fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, const std::string*, const char*);", c_ident(typ)); if (is_stdXML(typ)) fprintf(fout, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, const std::string *s, const char *type)\n{\n\tconst char *t = s->c_str();\n\treturn soap_outliteral(soap, tag, (char*const*)(void*)&t, type);\n}", c_ident(typ)); else fprintf(fout, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, const std::string *s, const char *type)\n{\n\tif ((soap->mode & SOAP_C_NILSTRING) && s->empty())\n\t\treturn soap_element_null(soap, tag, id, type);\n\tif (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, s, %s), type) || soap_string_out(soap, s->c_str(), 0) || soap_element_end_out(soap, tag))\n\t\treturn soap->error;\n\treturn SOAP_OK;\n}", c_ident(typ), soap_type(typ)); return; } if (is_stdwstring(typ)) { if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, const std::wstring*, const char*);", c_ident(typ)); return; } fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, const std::wstring*, const char*);", c_ident(typ)); if (is_stdXML(typ)) fprintf(fout, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, const std::wstring *s, const char *type)\n{\n\tconst wchar_t *t = s->c_str();\n\treturn soap_outwliteral(soap, tag, (wchar_t*const*)(void*)&t, type);\n}", c_ident(typ)); else fprintf(fout, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, const std::wstring *s, const char *type)\n{\n\tif ((soap->mode & SOAP_C_NILSTRING) && s->empty())\n\t\treturn soap_element_null(soap, tag, id, type);\n\tif (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, s, %s), type) || soap_wstring_out(soap, s->c_str(), 0) || soap_element_end_out(soap, tag))\n\t\treturn soap->error;\n\treturn SOAP_OK;\n}", c_ident(typ), soap_type(typ)); return; } switch(typ->type) { case Tstruct: if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, const %s, const char *type)\n{", c_ident(typ), c_type_id(typ, "*a")); if (has_setter(typ)) fprintf(fout, "\n\tif (((%s)a)->set(soap))\n\t\treturn soap->error;", c_type_id(typ, "*")); table = (Table*)typ->ref; for (t = table; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (is_repetition(p)) p = p->next; else if (p->info.sto & Sattribute) soap_set_attr(p, "a", ident(p->sym->name), ns_add(p, nsa)); else if (is_qname(p->info.typ)) fprintf(fout, "\n\tconst char *soap_tmp_%s = soap_QName2s(soap, a->%s);", ident(p->sym->name), ident(p->sym->name)); else if (is_stdqname(p->info.typ)) fprintf(fout, "\n\tstd::string soap_tmp_%s(soap_QName2s(soap, a->%s.c_str()));", ident(p->sym->name), ident(p->sym->name)); else if (p->info.typ->type == Tpointer && is_qname((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\tconst char *soap_tmp_%s = a->%s ? soap_QName2s(soap, *a->%s) : NULL;", ident(p->sym->name), ident(p->sym->name), ident(p->sym->name)); else if (p->info.typ->type == Tpointer && is_stdqname((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\tstd::string soap_temp_%s(a->%s ? soap_QName2s(soap, a->%s->c_str()) : \"\"), *soap_tmp_%s = a->%s ? &soap_temp_%s : NULL;", ident(p->sym->name), ident(p->sym->name), ident(p->sym->name), ident(p->sym->name), ident(p->sym->name), ident(p->sym->name)); } } fprintf(fout, "\n\t(void)soap; (void)tag; (void)id; (void)a; (void)type; /* appease -Wall -Werror */"); if (!table) { fprintf(fout, "\n\treturn SOAP_OK;\n}"); } else if (is_primclass(typ)) { for (table = (Table*)typ->ref; table; table = table->prev) { p = table->list; while (p && !is_item(p)) p = p->next; if (p) break; } if ((p->info.sto & SmustUnderstand) && !(p->info.sto & (Sconst | Sprivate | Sprotected)) && !(p->info.sto & Sattribute) && !is_transient(p->info.typ) && !is_void(p->info.typ) && p->info.typ->type != Tfun) fprintf(fout, "\n\tsoap->mustUnderstand = 1;"); if (p->info.typ->type == Tarray) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, a->%s, \"%s\");", c_ident(p->info.typ), ident(p->sym->name), xsi_type_u(typ)); else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) fprintf(fout, "\n\treturn a->%s.soap_out(soap, tag, id, \"%s\");", ident(p->sym->name), xsi_type_u(typ)); else if (is_qname(p->info.typ)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, (char*const*)(void*)&soap_tmp_%s, \"%s\");", c_ident(p->info.typ), ident(p->sym->name), xsi_type_u(typ)); else if (is_stdqname(p->info.typ)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, &soap_tmp_%s, \"%s\");", c_ident(p->info.typ), ident(p->sym->name), xsi_type_u(typ)); else if (p->info.typ->type == Tpointer && is_qname((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, (char*const*)soap_tmp_%s, \"%s\");", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name), xsi_type_u(typ)); else if (p->info.typ->type == Tpointer && is_stdqname((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, &soap_tmp_%s, \"%s\");", c_ident(p->info.typ), ident(p->sym->name), xsi_type_u(typ)); else if (is_XML(p->info.typ) && is_string(p->info.typ)) fprintf(fout, "\n\treturn soap_outliteral(soap, tag, (char*const*)&a->%s, NULL);", ident(p->sym->name)); else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) fprintf(fout, "\n\treturn soap_outwliteral(soap, tag, (wchar_t*const*)&a->%s, NULL);", ident(p->sym->name)); else if (is_string(p->info.typ)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, (char*const*)&a->%s, \"%s\");", c_ident(p->info.typ), ident(p->sym->name), xsi_type_u(typ)); else if (is_wstring(p->info.typ)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, (wchar_t*const*)&a->%s, \"%s\");", c_ident(p->info.typ), ident(p->sym->name), xsi_type_u(typ)); else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, &a->%s, \"%s\");", c_ident(p->info.typ), ident(p->sym->name), xsi_type_u(typ)); else fprintf(fout, "\n\treturn SOAP_OK;"); fprintf(fout, "\n}"); } else { if (!is_invisible(typ->id->name)) fprintf(fout, "\n\tif (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, %s), type))\n\t\treturn soap->error;", soap_type(typ)); fflush(fout); for (t = table; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.sto & Sreturn) { if (nse || has_ns_eq(NULL, p->sym->name)) { if (p->info.typ->type == Tpointer) fprintf(fout, "\n\tif (a->%s)\n\t\tsoap_element_result(soap, \"%s\");", ident(p->sym->name), ns_add(p, nse)); else fprintf(fout, "\n\tsoap_element_result(soap, \"%s\");", ns_add(p, nse)); } } if ((p->info.sto & SmustUnderstand) && !(p->info.sto & (Sconst | Sprivate | Sprotected)) && !is_transient(p->info.typ) && !is_void(p->info.typ) && p->info.typ->type != Tfun) fprintf(fout, "\n\tsoap->mustUnderstand = 1;"); needs_lang(p); if (p->info.typ->type == Tfun || p->info.typ->type == Tunion || is_soapref(p->info.typ)) ; else if (p->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name)); else if (p->info.sto & Sattribute) ; else if (is_repetition(p)) { fprintf(fout, "\n\tif (a->%s)", ident(p->next->sym->name)); fprintf(fout, "\n\t{\tint i;\n\t\tfor (i = 0; i < (int)a->%s; i++)", ident(p->sym->name)); if (((Tnode*)p->next->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->next->info.typ->ref) && !is_volatile((Tnode*)p->next->info.typ->ref) && !is_typedef((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tif (a->%s[i].soap_out(soap, \"%s\", -1, \"%s\"))\n\t\t\t\treturn soap->error;", ident(p->next->sym->name), ns_add(p->next, nse), xsi_type_cond_u((Tnode*)p->next->info.typ->ref, !has_ns_eq(NULL, p->next->sym->name))); else if (is_qname((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t{\tconst char *soap_tmp_%s = soap_QName2s(soap, a->%s[i]);\n\t\t\tif (soap_out_%s(soap, \"%s\", -1, (char*const*)(void*)&soap_tmp_%s, \"%s\"))\n\t\t\t\treturn soap->error;\n\t\t}", ident(p->next->sym->name), ident(p->next->sym->name), c_ident((Tnode*)p->next->info.typ->ref), ns_add(p->next, nse), ident(p->next->sym->name), xsi_type_cond_u((Tnode*)p->next->info.typ->ref, !has_ns_eq(NULL, p->next->sym->name))); else if (is_XML((Tnode*)p->next->info.typ->ref) && is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_outliteral(soap, \"%s\", (char*const*)(a->%s + i), NULL);", ns_add(p->next, nse), ident(p->next->sym->name)); else if (is_XML((Tnode*)p->next->info.typ->ref) && is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_outwliteral(soap, \"%s\", (wchar_t*const*)(a->%s + i), NULL);", ns_add(p->next, nse), ident(p->next->sym->name)); else if (is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_out_string(soap, \"%s\", -1, (char*const*)(a->%s + i), \"%s\");", ns_add(p->next, nse), ident(p->next->sym->name), xsi_type_cond_u((Tnode*)p->next->info.typ->ref, !has_ns_eq(NULL, p->next->sym->name))); else if (is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_out_wstring(soap, \"%s\", -1, (wchar_t*const*)(a->%s + i), \"%s\");", ns_add(p->next, nse), ident(p->next->sym->name), xsi_type_cond_u((Tnode*)p->next->info.typ->ref, !has_ns_eq(NULL, p->next->sym->name))); else fprintf(fout, "\n\t\t\tif (soap_out_%s(soap, \"%s\", -1, a->%s + i, \"%s\"))\n\t\t\t\treturn soap->error;", c_ident((Tnode*)p->next->info.typ->ref), ns_add(p->next, nse), ident(p->next->sym->name), xsi_type_cond_u((Tnode*)p->next->info.typ->ref, !has_ns_eq(NULL, p->next->sym->name))); fprintf(fout, "\n\t}"); p = p->next; } else if (is_anytype(p) && is_invisible(p->next->sym->name)) { fprintf(fout, "\n\tif (soap_putelement(soap, a->%s, tag, -1, a->%s))\n\t\treturn soap->error;", ident(p->next->sym->name), ident(p->sym->name)); p = p->next; } else if (is_anytype(p)) { fprintf(fout, "\n\tif (soap_putelement(soap, a->%s, \"%s\", -1, a->%s))\n\t\treturn soap->error;", ident(p->next->sym->name), ns_add(p->next, nse), ident(p->sym->name)); p = p->next; } else if (is_choice(p)) { fprintf(fout, "\n\tif (soap_out_%s(soap, a->%s, &a->%s))\n\t\treturn soap->error;", c_ident(p->next->info.typ), ident(p->sym->name), ident(p->next->sym->name)); p = p->next; } else if (is_transient(p->info.typ)) { fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); } else if (p->info.typ->type == Tarray) fprintf(fout, "\n\tsoap_out_%s(soap, %s, -1, a->%s, \"%s\");", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) fprintf(fout, "\n\tif (a->%s.soap_out(soap, %s, -1, \"%s\"))\n\t\treturn soap->error;", ident(p->sym->name), field(p, nse), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); else if (is_stdqname(p->info.typ)) fprintf(fout, "\n\tif (soap_out_%s(soap, %s, -1, &soap_tmp_%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); else { if (zflag != 2 && p->info.typ->type == Tpointer && !is_void(p->info.typ) && p->info.minOccurs > 0) fprintf(fout, "\n\tif (!a->%s)\n\t{\tif (soap_element_nil(soap, %s))\n\t\t\treturn soap->error;\n\t}\n\telse", ident(p->sym->name), field(p, nse)); if (is_qname(p->info.typ)) fprintf(fout, "\n\tif (soap_out_%s(soap, %s, -1, (char*const*)(void*)&soap_tmp_%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); else if (p->info.typ->type == Tpointer && is_qname((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\tif (soap_out_%s(soap, %s, -1, (char*const*)(void*)&soap_tmp_%s, \"%s\"))\n\t\treturn soap->error;", c_ident((Tnode*)p->info.typ->ref), field(p, nse), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); else if (p->info.typ->type == Tpointer && is_stdqname((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\tif (soap_out_%s(soap, %s, -1, &soap_tmp_%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); else if (is_XML(p->info.typ) && is_string(p->info.typ)) fprintf(fout, "\n\tsoap_outliteral(soap, %s, (char*const*)&a->%s, NULL);", field(p, nse), ident(p->sym->name)); else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) fprintf(fout, "\n\tsoap_outwliteral(soap, %s, (wchar_t*const*)&a->%s, NULL);", field(p, nse), ident(p->sym->name)); else if (is_string(p->info.typ)) fprintf(fout, "\n\tif (soap_out_%s(soap, %s, -1, (char*const*)&a->%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); else if (is_wstring(p->info.typ)) fprintf(fout, "\n\tif (soap_out_%s(soap, %s, -1, (wchar_t*const*)&a->%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) fprintf(fout, "\n\tif (soap_out_%s(soap, %s, -1, &a->%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); } } } if (!is_invisible(typ->id->name)) fprintf(fout, "\n\treturn soap_element_end_out(soap, tag);\n}"); else fprintf(fout, "\n\treturn SOAP_OK;\n}"); } fflush(fout); break; case Tclass: if (is_external(typ) && !is_volatile(typ)) { fprintf(fhead, "\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ), c_type_id(typ, "*")); return; } if (!is_volatile(typ) && !is_typedef(typ)) { if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fout, "\n\nint %s::soap_out(struct soap *soap, const char *tag, int id, const char *type) const", ident(typ->id->name)); fprintf(fout, "\n{\n\treturn soap_out_%s(soap, tag, id, this, type);\n}", c_ident(typ)); } fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, const %s, const char *type)\n{", c_ident(typ), c_type_id(typ, "*a")); fflush(fout); if (has_setter(typ)) fprintf(fout, "\n\tif (((%s)a)->set(soap))\n\t\treturn soap->error;", c_type_id(typ, "*")); table = (Table*)typ->ref; for (t = table; t; t = t->prev) { Entry *e = entry(classtable, t->sym); const char *nsa1 = e ? ns_qualifiedAttribute(e->info.typ) : nsa; for (p = t->list; p; p = p->next) { if (is_repetition(p)) p = p->next; else if (p->info.sto & Sattribute) soap_set_attr(p, ptr_cast(t, "a"), ident(p->sym->name), ns_add(p, nsa1)); else if (is_qname(p->info.typ)) fprintf(fout, "\n\tconst char *soap_tmp_%s = soap_QName2s(soap, a->%s);", ident(p->sym->name), ident(p->sym->name)); else if (is_stdqname(p->info.typ)) fprintf(fout, "\n\tstd::string soap_tmp_%s(soap_QName2s(soap, a->%s.c_str()));", ident(p->sym->name), ident(p->sym->name)); else if (p->info.typ->type == Tpointer && is_qname((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\tconst char *soap_tmp_%s = a->%s ? soap_QName2s(soap, *a->%s) : NULL;", ident(p->sym->name), ident(p->sym->name), ident(p->sym->name)); else if (p->info.typ->type == Tpointer && is_stdqname((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\tstd::string soap_temp_%s(a->%s ? soap_QName2s(soap, a->%s->c_str()) : \"\"), *soap_tmp_%s = a->%s ? &soap_temp_%s : NULL;", ident(p->sym->name), ident(p->sym->name), ident(p->sym->name), ident(p->sym->name), ident(p->sym->name), ident(p->sym->name)); } } fprintf(fout, "\n\t(void)soap; (void)tag; (void)id; (void)a; (void)type; /* appease -Wall -Werror */"); if (!table) { fprintf(fout, "\n\treturn SOAP_OK;\n}"); } else if (is_primclass(typ)) { for (t = table; t; t = t->prev) { p = t->list; while (p && !is_item(p)) p = p->next; if (p) break; } if ((p->info.sto & SmustUnderstand) && !(p->info.sto & (Sconst | Sprivate | Sprotected)) && !(p->info.sto & Sattribute) && !is_transient(p->info.typ) && !is_void(p->info.typ) && p->info.typ->type != Tfun) fprintf(fout, "\n\tsoap->mustUnderstand = 1;"); if (table && table->prev) { if (is_XML(p->info.typ) && is_string(p->info.typ)) fprintf(fout, "\n\treturn soap_outliteral(soap, tag, (char*const*)&a->%s::%s, \"%s\");", ident(t->sym->name), ident(p->sym->name), xsi_type(typ)); else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) fprintf(fout, "\n\treturn soap_outwliteral(soap, tag, (wchar_t*const*)&a->%s::%s, \"%s\");", ident(t->sym->name), ident(p->sym->name), xsi_type(typ)); else if (is_qname(p->info.typ)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, (char*const*)(void*)&soap_tmp_%s, \"%s\");", c_ident(p->info.typ), ident(p->sym->name), xsi_type(typ)); else if (is_string(p->info.typ)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, (char*const*)&a->%s::%s, \"%s\");", c_ident(p->info.typ), ident(t->sym->name), ident(p->sym->name), xsi_type(typ)); else if (is_wstring(p->info.typ)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, (wchar_t*const*)&a->%s::%s, \"%s\");", c_ident(p->info.typ), ident(t->sym->name), ident(p->sym->name), xsi_type(typ)); else if (p->info.typ->type == Tarray) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, a->%s::%s, \"%s\");", c_ident(p->info.typ), ident(t->sym->name), ident(p->sym->name), xsi_type(typ)); else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) fprintf(fout, "\n\treturn (a->%s::%s).soap_out(soap, tag, id, \"%s\");", ident(t->sym->name), ident(p->sym->name), xsi_type(typ)); else if (is_stdqname(p->info.typ)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, &soap_tmp_%s, \"%s\");", c_ident(p->info.typ), ident(p->sym->name), xsi_type(typ)); else if (p->info.typ->type == Tpointer && is_qname((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, (char*const*)(void*)&soap_tmp_%s, \"%s\");", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name), xsi_type_u(typ)); else if (p->info.typ->type == Tpointer && is_stdqname((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, &soap_tmp_%s, \"%s\");", c_ident(p->info.typ), ident(p->sym->name), xsi_type_u(typ)); else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, &a->%s::%s, \"%s\");", c_ident(p->info.typ), ident(t->sym->name), ident(p->sym->name), xsi_type(typ)); else fprintf(fout, "\n\treturn SOAP_OK;"); } else { if (is_XML(p->info.typ) && is_string(p->info.typ)) fprintf(fout, "\n\treturn soap_outliteral(soap, tag, (char*const*)&a->%s::%s, NULL);", ident(t->sym->name), ident(p->sym->name)); else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) fprintf(fout, "\n\treturn soap_outwliteral(soap, tag, (wchar_t*const*)&a->%s::%s, NULL);", ident(t->sym->name), ident(p->sym->name)); else if (is_qname(p->info.typ)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, (char*const*)(void*)&soap_tmp_%s, \"%s\");", c_ident(p->info.typ), ident(p->sym->name), xsi_type_u(typ)); else if (is_string(p->info.typ)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, (char*const*)&a->%s::%s, \"%s\");", c_ident(p->info.typ), ident(t->sym->name), ident(p->sym->name), xsi_type_u(typ)); else if (is_wstring(p->info.typ)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, (wchar_t*const*)&a->%s::%s, \"%s\");", c_ident(p->info.typ), ident(t->sym->name), ident(p->sym->name), xsi_type_u(typ)); else if (p->info.typ->type == Tarray) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, a->%s::%s, \"%s\");", c_ident(p->info.typ), ident(t->sym->name), ident(p->sym->name), xsi_type_u(typ)); else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) fprintf(fout, "\n\treturn (a->%s::%s).soap_out(soap, tag, id, \"%s\");", ident(t->sym->name), ident(p->sym->name), xsi_type_u(typ)); else if (is_stdqname(p->info.typ)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, &soap_tmp_%s, \"%s\");", c_ident(p->info.typ), ident(p->sym->name), xsi_type_u(typ)); else if (p->info.typ->type == Tpointer && is_qname((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, (char*const*)(void*)&soap_tmp_%s, \"%s\");", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name), xsi_type_u(typ)); else if (p->info.typ->type == Tpointer && is_stdqname((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, &soap_tmp_%s, \"%s\");", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name), xsi_type_u(typ)); else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, &a->%s::%s, \"%s\");", c_ident(p->info.typ), ident(t->sym->name), ident(p->sym->name), xsi_type_u(typ)); else fprintf(fout, "\n\treturn SOAP_OK;"); } fprintf(fout, "\n}"); } else { if (!is_invisible(typ->id->name)) { if (table && table->prev) fprintf(fout, "\n\tif (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, %s), \"%s\"))\n\t\treturn soap->error;", soap_type(typ), xsi_type(typ)); else fprintf(fout, "\n\tif (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, %s), type))\n\t\treturn soap->error;", soap_type(typ)); } fflush(fout); i = 0; /* Get the depth of the inheritance hierarchy */ for (t = table; t; t = t->prev) i++; /* Call routines to output the member data of the class */ /* Data members of the Base Classes are outputed first followed by the data members of the Derived classes. Overridden data members are output twice once for the base class they are defined in and once for the derived class that overwrites them */ for (; i > 0; i--) { Entry *e; const char *nse1; t = table; for (j = 0; j < i-1; j++) t = t->prev; e = entry(classtable, t->sym); nse1 = e ? ns_qualifiedElement(e->info.typ) : nse; for (p = t->list; p != (Entry*) 0; p = p->next) { if (p->info.sto & Sreturn) { if (nse1 || has_ns_eq(NULL, p->sym->name)) { if (p->info.typ->type == Tpointer) fprintf(fout, "\n\tif (a->%s)\n\t\tsoap_element_result(soap, \"%s\");", ident(p->sym->name), ns_add(p, nse1)); else fprintf(fout, "\n\tsoap_element_result(soap, \"%s\");", ns_add(p, nse1)); } } if ((p->info.sto & SmustUnderstand) && !(p->info.sto & (Sconst | Sprivate | Sprotected)) && !(p->info.sto & Sattribute) && !is_transient(p->info.typ) && !is_void(p->info.typ) && p->info.typ->type != Tfun) fprintf(fout, "\n\tsoap->mustUnderstand = 1;"); needs_lang(p); if (p->info.typ->type == Tfun || p->info.typ->type == Tunion || is_soapref(p->info.typ)) ; else if (p->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name)); else if (p->info.sto & Sattribute) ; else if (is_repetition(p)) { fprintf(fout, "\n\tif (a->%s::%s)", ident(t->sym->name), ident(p->next->sym->name)); fprintf(fout, "\n\t{\tint i;\n\t\tfor (i = 0; i < (int)a->%s::%s; i++)", ident(t->sym->name), ident(p->sym->name)); if (((Tnode*)p->next->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->next->info.typ->ref) && !is_volatile((Tnode*)p->next->info.typ->ref) && !is_typedef((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tif (a->%s::%s[i].soap_out(soap, %s, -1, \"%s\"))\n\t\t\t\treturn soap->error;", ident(t->sym->name), ident(p->next->sym->name), field_overridden(t, p->next, nse1), xsi_type_cond_u((Tnode*)p->next->info.typ->ref, !has_ns_eq(NULL, p->next->sym->name))); else if (is_qname((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t{\tconst char *soap_tmp_%s = soap_QName2s(soap, a->%s[i]);\n\t\t\tif (soap_out_%s(soap, %s, -1, (char*const*)(void*)&soap_tmp_%s, \"%s\"))\n\t\t\t\treturn soap->error;\n\t\t}", ident(p->next->sym->name), ident(p->next->sym->name), c_ident((Tnode*)p->next->info.typ->ref), field_overridden(t, p->next, nse1), ident(p->next->sym->name), xsi_type_cond_u((Tnode*)p->next->info.typ->ref, !has_ns_eq(NULL, p->next->sym->name))); else if (is_XML((Tnode*)p->next->info.typ->ref) && is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_outliteral(soap, %s, (char*const*)(a->%s::%s + i), NULL);", field_overridden(t, p->next, nse1), ident(t->sym->name), ident(p->next->sym->name)); else if (is_XML((Tnode*)p->next->info.typ->ref) && is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_outwliteral(soap, %s, (wchar_t*const*)(a->%s::%s + i), NULL);", field_overridden(t, p->next, nse1), ident(t->sym->name), ident(p->next->sym->name)); else if (is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_out_string(soap, \"%s\", -1, (char*const*)(a->%s::%s + i), \"%s\");", ns_add(p->next, nse), ident(t->sym->name), ident(p->next->sym->name), xsi_type_cond_u((Tnode*)p->next->info.typ->ref, !has_ns_eq(NULL, p->next->sym->name))); else if (is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_out_wstring(soap, \"%s\", -1, (wchar_t*const*)(a->%s::%s + i), \"%s\");", ns_add(p->next, nse), ident(t->sym->name), ident(p->next->sym->name), xsi_type_cond_u((Tnode*)p->next->info.typ->ref, !has_ns_eq(NULL, p->next->sym->name))); else fprintf(fout, "\n\t\t\tif (soap_out_%s(soap, %s, -1, a->%s::%s + i, \"%s\"))\n\t\t\t\treturn soap->error;", c_ident((Tnode*)p->next->info.typ->ref), field_overridden(t, p->next, nse1), ident(t->sym->name), ident(p->next->sym->name), xsi_type_cond_u((Tnode*)p->next->info.typ->ref, !has_ns_eq(NULL, p->next->sym->name))); fprintf(fout, "\n\t}"); p = p->next; } else if (is_anytype(p) && is_invisible(p->next->sym->name)) { fprintf(fout, "\n\tif (soap_putelement(soap, a->%s::%s, tag, -1, a->%s::%s))\n\t\treturn soap->error;", ident(t->sym->name), ident(p->next->sym->name), ident(t->sym->name), ident(p->sym->name)); p = p->next; } else if (is_anytype(p)) { fprintf(fout, "\n\tif (soap_putelement(soap, a->%s::%s, %s, -1, a->%s::%s))\n\t\treturn soap->error;", ident(t->sym->name), ident(p->next->sym->name), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name)); p = p->next; } else if (is_choice(p)) { fprintf(fout, "\n\tif (soap_out_%s(soap, a->%s::%s, &a->%s::%s))\n\t\treturn soap->error;", c_ident(p->next->info.typ), ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->next->sym->name)); p = p->next; } else if (is_item(p)) ; else if (is_transient(p->info.typ)) fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); else if (p->info.typ->type == Tarray) fprintf(fout, "\n\tsoap_out_%s(soap, %s, -1, a->%s::%s, \"%s\");", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) fprintf(fout, "\n\tif ((a->%s::%s).soap_out(soap, %s, -1, \"%s\"))\n\t\treturn soap->error;", ident(t->sym->name), ident(p->sym->name), field_overridden(t, p, nse1), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); else if (is_stdqname(p->info.typ)) fprintf(fout, "\n\tif (soap_out_%s(soap, %s, -1, &soap_tmp_%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); else { if (zflag != 2 && p->info.typ->type == Tpointer && !is_void(p->info.typ) && p->info.minOccurs > 0) fprintf(fout, "\n\tif (!a->%s::%s)\n\t{\tif (soap_element_nil(soap, %s))\n\t\t\treturn soap->error;\n\t}\n\telse", ident(t->sym->name), ident(p->sym->name), field_overridden(t, p, nse1)); if (is_qname(p->info.typ)) fprintf(fout, "\n\tif (soap_out_%s(soap, %s, -1, (char*const*)(void*)&soap_tmp_%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); else if (p->info.typ->type == Tpointer && is_qname((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\tif (soap_out_%s(soap, %s, -1, (char*const*)(void*)&soap_tmp_%s, \"%s\"))\n\t\treturn soap->error;", c_ident((Tnode*)p->info.typ->ref), field_overridden(t, p, nse1), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); else if (p->info.typ->type == Tpointer && is_stdqname((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\tif (soap_out_%s(soap, %s, -1, &soap_tmp_%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); else if (is_XML(p->info.typ) && is_string(p->info.typ)) fprintf(fout, "\n\tif (soap_outliteral(soap, %s, (char*const*)&a->%s::%s, NULL))\n\t\treturn soap->error;", field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name)); else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) fprintf(fout, "\n\tif (soap_outwliteral(soap, %s, (wchar_t*const*)&a->%s::%s, NULL))\n\t\treturn soap->error;", field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name)); else if (is_string(p->info.typ)) fprintf(fout, "\n\tif (soap_out_%s(soap, %s, -1, (char*const*)&a->%s::%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); else if (is_wstring(p->info.typ)) fprintf(fout, "\n\tif (soap_out_%s(soap, %s, -1, (wchar_t*const*)&a->%s::%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) fprintf(fout, "\n\tif (soap_out_%s(soap, %s, -1, &a->%s::%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); } } } i = 0; /* Get the depth of the inheritance hierarchy */ for (t = table; t; t = t->prev) i++; /* output __item(s) and inherited DOM at the end */ for (; i > 0; i--) { Entry *e; const char *nse1; t = table; for (j = 0; j < i-1; j++) t = t->prev; e = entry(classtable, t->sym); if (!t->prev && e && e->info.typ && e->info.typ->base && !strcmp(e->info.typ->base->name, "soap_dom_element")) fprintf(fout, "\n\tif (soap_out_xsd__anyType(soap, NULL, -1, static_cast(a), NULL))\n\t\treturn soap->error;"); nse1 = e ? ns_qualifiedElement(e->info.typ) : nse; for (p = t->list; p != (Entry*) 0; p = p->next) { if (p->info.typ->type == Tfun || p->info.typ->type == Tunion) ; else if (p->info.sto & (Sconst | Sprivate | Sprotected | Sattribute)) ; else if (is_repetition(p) || is_anytype(p) || is_choice(p)) p = p->next; else if (!is_item(p)) ; else if (is_transient(p->info.typ)) ; else if (p->info.typ->type == Tarray) fprintf(fout, "\n\tsoap_out_%s(soap, %s, -1, a->%s::%s, \"%s\");", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) fprintf(fout, "\n\tif ((a->%s::%s).soap_out(soap, %s, -1, \"%s\"))\n\t\treturn soap->error;", ident(t->sym->name), ident(p->sym->name), field_overridden(t, p, nse1), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); else if (is_stdqname(p->info.typ)) fprintf(fout, "\n\tif (soap_out_%s(soap, %s, -1, &soap_tmp_%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); else { if (zflag != 2 && p->info.typ->type == Tpointer && !is_void(p->info.typ) && p->info.minOccurs > 0) fprintf(fout, "\n\tif(a->%s::%s)\n\t{\tif (soap_element_nil(soap, %s))\n\t\t\treturn soap->error;\n\t}\n\telse", ident(t->sym->name), ident(p->sym->name), field_overridden(t, p, nse1)); if (is_qname(p->info.typ)) fprintf(fout, "\n\tif (soap_out_%s(soap, %s, -1, (char*const*)(void*)&soap_tmp_%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); else if (p->info.typ->type == Tpointer && is_qname((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\tif (soap_out_%s(soap, %s, -1, (char*const*)(void*)&soap_tmp_%s, \"%s\"))\n\t\treturn soap->error;", c_ident((Tnode*)p->info.typ->ref), field_overridden(t, p, nse1), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); else if (p->info.typ->type == Tpointer && is_stdqname((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\tif (soap_out_%s(soap, %s, -1, &soap_tmp_%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); else if (is_XML(p->info.typ) && is_string(p->info.typ)) fprintf(fout, "\n\tif (soap_outliteral(soap, %s, (char*const*)&a->%s::%s, NULL))\n\t\treturn soap->error;", field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name)); else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) fprintf(fout, "\n\tif (soap_outwliteral(soap, %s, (wchar_t*const*)&a->%s::%s, NULL))\n\t\treturn soap->error;", field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name)); else if (is_string(p->info.typ)) fprintf(fout, "\n\tif (soap_out_%s(soap, %s, -1, (char*const*)&a->%s::%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); else if (is_wstring(p->info.typ)) fprintf(fout, "\n\tif (soap_out_%s(soap, %s, -1, (wchar_t*const*)&a->%s::%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) fprintf(fout, "\n\tif (soap_out_%s(soap, %s, -1, &a->%s::%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); } fflush(fout); } } if (!is_invisible(typ->id->name)) fprintf(fout, "\n\treturn soap_element_end_out(soap, tag);\n}"); else fprintf(fout, "\n\treturn SOAP_OK;\n}"); } fflush(fout); break; case Tunion: if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, int, const %s);", c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, int, const %s);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, int choice, const %s)\n{", c_ident(typ), c_type_id(typ, "*a")); table = (Table*)typ->ref; fprintf(fout, "\n\t(void)soap; (void)a; /* appease -Wall -Werror */"); fprintf(fout, "\n\tswitch (choice)\n\t{"); for (p = table->list; p; p = p->next) { if (p->info.typ->type == Tfun || p->info.typ->type == Tunion) ; else if (p->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name)); else if (p->info.sto & Sattribute) ; else if (is_repetition(p)) ; else if (is_anytype(p)) ; else if (is_transient(p->info.typ)) fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); else if (p->info.typ->type == Tarray) { fprintf(fout, "\n\tcase %s:", soap_union_member(typ, p)); fprintf(fout, "\n\t\treturn soap_out_%s(soap, \"%s\", -1, a->%s, \"%s\");", c_ident(p->info.typ), ns_add(p, nse), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); } else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { fprintf(fout, "\n\tcase %s:", soap_union_member(typ, p)); fprintf(fout, "\n\t\treturn a->%s.soap_out(soap, \"%s\", -1, \"%s\");", ident(p->sym->name), ns_add(p, nse), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); } else if (is_qname(p->info.typ) || is_stdqname(p->info.typ)) { fprintf(fout, "\n\tcase %s:", soap_union_member(typ, p)); fprintf(fout, "\n\t{\tconst char *soap_tmp_%s = soap_QName2s(soap, a->%s);", ident(p->sym->name), ident(p->sym->name)); fprintf(fout, "\n\t\treturn soap_out_%s(soap, \"%s\", -1, (char*const*)(void*)&soap_tmp_%s, \"%s\");\n\t}", c_ident(p->info.typ), ns_add(p, nse), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); } else if (is_XML(p->info.typ) && is_string(p->info.typ)) { fprintf(fout, "\n\tcase %s:", soap_union_member(typ, p)); fprintf(fout, "\n\t\treturn soap_outliteral(soap, \"%s\", (char*const*)&a->%s, NULL);", ns_add(p, nse), ident(p->sym->name)); } else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) { fprintf(fout, "\n\tcase %s:", soap_union_member(typ, p)); fprintf(fout, "\n\t\treturn soap_outwliteral(soap, \"%s\", (wchar_t*const*)&a->%s, NULL);", ns_add(p, nse), ident(p->sym->name)); } else if (is_string(p->info.typ)) { fprintf(fout, "\n\tcase %s:", soap_union_member(typ, p)); fprintf(fout, "\n\t\treturn soap_out_%s(soap, \"%s\", -1, (char*const*)&a->%s, \"%s\");", c_ident(p->info.typ), ns_add(p, nse), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); } else if (is_wstring(p->info.typ)) { fprintf(fout, "\n\tcase %s:", soap_union_member(typ, p)); fprintf(fout, "\n\t\treturn soap_out_%s(soap, \"%s\", -1, (wchar_t*const*)&a->%s, \"%s\");", c_ident(p->info.typ), ns_add(p, nse), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); } else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { fprintf(fout, "\n\tcase %s:", soap_union_member(typ, p)); fprintf(fout, "\n\t\treturn soap_out_%s(soap, \"%s\", -1, &a->%s, \"%s\");", c_ident(p->info.typ), ns_add(p, nse), ident(p->sym->name), xsi_type_cond_u(p->info.typ, !has_ns_eq(NULL, p->sym->name))); } } fprintf(fout, "\n\tdefault:\n\t\tbreak;\n\t}\n\treturn SOAP_OK;\n}"); fflush(fout); break; case Tpointer: if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char *, int, %s, const char *);", c_ident(typ), c_type_constptr_id(typ, "const*")); return; } fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char *, int, %s, const char *);", c_ident(typ), c_type_constptr_id(typ, "const*")); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, %s, const char *type)\n{", c_ident(typ), c_type_constptr_id(typ, "const*a")); if (is_template(typ)) { fprintf(fout, "\n\tif (!*a)"); fprintf(fout, "\n\t\treturn soap_element_null(soap, tag, id, type);"); fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, *a, type);", c_ident((Tnode*)typ->ref)); } else { p = is_dynamic_array((Tnode*)typ->ref); if (p) { d = get_Darraydims((Tnode*)typ->ref); if (d) fprintf(fout, "\n\tid = soap_element_id(soap, tag, id, *a, *s ? (*a)->%s : NULL, *s ? %s : 0, type, %s, NULL);", ident(p->sym->name), get_Darraysize("(*a)", d), soap_type((Tnode*)typ->ref)); else fprintf(fout, "\n\tid = soap_element_id(soap, tag, id, *a, *a ? (*a)->%s : NULL, *a ? (*a)->__size : 0, type, %s, NULL);", ident(p->sym->name), soap_type((Tnode*)typ->ref)); } else { if (((Tnode*)typ->ref)->recursive) fprintf(fout, "\n\tchar *mark;\n\tid = soap_element_id(soap, tag, id, *a, NULL, 0, type, %s, &mark);", soap_type((Tnode*)typ->ref)); else fprintf(fout, "\n\tid = soap_element_id(soap, tag, id, *a, NULL, 0, type, %s, NULL);", soap_type((Tnode*)typ->ref)); } fprintf(fout, "\n\tif (id < 0)\n\t\treturn soap->error;"); if (((Tnode *) typ->ref)->type == Tclass && !is_external((Tnode*)typ->ref) && !is_volatile((Tnode*)typ->ref) && !is_typedef((Tnode*)typ->ref)) { if (!p && ((Tnode*)typ->ref)->recursive) fprintf(fout, "\n\t(*a)->soap_out(soap, tag, id, type);\n\tsoap_unmark(soap, mark);\n\treturn soap->error;"); else fprintf(fout, "\n\treturn (*a)->soap_out(soap, tag, id, type);"); } else { if (!p && ((Tnode*)typ->ref)->recursive) fprintf(fout, "\n\tsoap_out_%s(soap, tag, id, *a, type);\n\tsoap_unmark(soap, mark);\n\treturn soap->error;", c_ident((Tnode*)typ->ref)); else fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, *a, type);", c_ident((Tnode*)typ->ref)); } } fprintf(fout, "\n}"); break; case Tarray: if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, %s, const char*);", c_ident(typ), c_type_id(typ, "const")); return; } fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, %s, const char*);", c_ident(typ), c_type_id(typ, "const")); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, %s, const char *type)\n{", c_ident(typ), c_type_id(typ, "const a")); fprintf(fout, "\n\tsize_t i;\n\t(void)type;"); fprintf(fout, "\n\tsoap_array_begin_out(soap, tag, soap_embedded_id(soap, id, a, %s), \"%s[%d]\", 0);", soap_type(typ), xsi_type_Tarray(typ), get_dimension(typ)); n=(Tnode*)typ->ref; cardinality = 1; while (n->type == Tarray) { n = (Tnode*)n->ref; cardinality++; } fprintf(fout, "\n\tfor (i = 0; i < %d; i++)\n\t{", get_dimension(typ)); if (((Tnode *)typ->ref)->type == Tclass && !is_external((Tnode*)typ->ref) && !is_volatile((Tnode*)typ->ref) && !is_typedef((Tnode*)typ->ref)) { if (cardinality>1) fprintf(fout, "\n\t\ta[i].soap_out(soap, \"item\", -1, \"%s\")", xsi_type_u((Tnode*)typ->ref)); else fprintf(fout, "\n\t\t(a+i)->soap_out(soap, \"item\", -1, \"%s\")", xsi_type_u((Tnode*)typ->ref)); } else { if (((Tnode *)typ->ref)->type != Tarray) { if (((Tnode *)typ->ref)->type == Tpointer) fprintf(fout, "\n\t\tsoap->position = 1;\n\t\tsoap->positions[0] = i;\n\t\tsoap_out_%s(soap, \"item\", -1, a", c_ident((Tnode*)typ->ref)); else fprintf(fout, "\n\t\tsoap_out_%s(soap, \"item\", -1, a", c_ident((Tnode*)typ->ref)); } else fprintf(fout, "\n\t\tsoap_out_%s(soap, \"item\", -1, a", c_ident((Tnode*)typ->ref)); if (cardinality>1) fprintf(fout, "[i], \"%s\")", xsi_type_u((Tnode*)typ->ref)); else fprintf(fout, "+i, \"%s\")", xsi_type_u((Tnode*)typ->ref)); } if (((Tnode *)typ->ref)->type == Tpointer) fprintf(fout, ";\n\t}\n\tsoap->position = 0;\n\treturn soap_element_end_out(soap, tag);\n}"); else fprintf(fout, ";\n\t}\n\treturn soap_element_end_out(soap, tag);\n}"); break; case Tenum: case Tenumsc: if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ), c_type_id(typ, "*")); if (!is_typedef(typ)) { fprintf(fout, "\n\nstatic const struct soap_code_map soap_codes_%s[] =\n{", c_ident(typ)); for (t = (Table*)typ->ref; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (typ->type == Tenumsc) fprintf(fout, "\t{ (LONG64)%s::%s, \"%s\" },\n", c_ident(typ), ident(p->sym->name), ns_remove2(p->sym->name, c_ident(typ))); else fprintf(fout, "\t{ (LONG64)%s, \"%s\" },\n", ident(p->sym->name), ns_remove2(p->sym->name, c_ident(typ))); } } fprintf(fout, "\t{ 0, NULL }\n"); fprintf(fout, "};"); } if (!is_typedef(typ)) { fprintf(fhead, "\nSOAP_FMAC3S const char* SOAP_FMAC4S soap_%s2s(struct soap*, %s);", c_ident(typ), c_type(typ)); fprintf(fout, "\n\nSOAP_FMAC3S const char* SOAP_FMAC4S soap_%s2s(struct soap *soap, %s)", c_ident(typ), c_type_id(typ, "n")); if (is_boolean(typ)) fprintf(fout, "\n{\n\t(void)soap; /* appease -Wall -Werror */\nreturn soap_code_str(soap_codes_%s, n != 0);\n}", c_ident(typ)); else if (!is_mask(typ)) { fprintf(fout, "\n{\tconst char *s = soap_code_str(soap_codes_%s, (long)n);", c_ident(typ)); fprintf(fout, "\n\tif (s)\n\t\treturn s;"); fprintf(fout, "\n\treturn soap_long2s(soap, (long)n);"); fprintf(fout, "\n}"); } else fprintf(fout, "\n{\n\treturn soap_code_list(soap, soap_codes_%s, (long)n);\n}", c_ident(typ)); } fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, const %s, const char *type)", c_ident(typ), c_type_id(typ, "*a")); fprintf(fout, "\n{\tif (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, %s), type)", soap_type(typ)); fprintf(fout, " || soap_send(soap, soap_%s2s(soap, *a)))\n\t\treturn soap->error;", c_ident(typ)); fprintf(fout, "\n\treturn soap_element_end_out(soap, tag);\n}"); break; case Ttemplate: if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ), c_type_id(typ, "*")); return; } if (is_typedef(typ)) { fprintf(fhead, "\n\n#define soap_out_%s soap_out_%s\n", c_ident(typ), t_ident(typ)); return; } fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ), c_type_id(typ, "*")); n = (Tnode*)typ->ref; if (!n) return; fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, const %s, const char *type)\n{", c_ident(typ), c_type_id(typ, "*a")); fprintf(fout, "\n\t(void)id; (void)type; /* appease -Wall -Werror */"); if (is_smart(typ)) { p = is_dynamic_array((Tnode*)typ->ref); if (p) { d = get_Darraydims((Tnode*)typ->ref); if (d) fprintf(fout, "\n\tid = soap_element_id(soap, tag, id, a->get(), *a ? (*a)->%s : NULL, *a ? %s : 0, type, %s, NULL);", ident(p->sym->name), get_Darraysize("(*a)", d), soap_type((Tnode*)typ->ref)); else fprintf(fout, "\n\tid = soap_element_id(soap, tag, id, a->get(), *a ? (*a)->%s : NULL, *a ? (*a)->__size : 0, type, %s, NULL);", ident(p->sym->name), soap_type((Tnode*)typ->ref)); } else if (((Tnode*)typ->ref)->recursive) fprintf(fout, "\n\tchar *mark;\n\tid = soap_element_id(soap, tag, id, a->get(), NULL, 0, type, %s, &mark);", soap_type((Tnode*)typ->ref)); else fprintf(fout, "\n\tid = soap_element_id(soap, tag, id, a->get(), NULL, 0, type, %s, NULL);", soap_type((Tnode*)typ->ref)); fprintf(fout, "\n\tif (id < 0)\n\t\treturn soap->error;"); if (((Tnode *) typ->ref)->type == Tclass && !is_external((Tnode*)typ->ref) && !is_volatile((Tnode*)typ->ref) && !is_typedef((Tnode*)typ->ref)) { if (!p && ((Tnode*)typ->ref)->recursive) fprintf(fout, "\n\t(*a)->soap_out(soap, tag, id, type);\n\tsoap_unmark(soap, mark);\n\treturn soap->error;"); else fprintf(fout, "\n\treturn (*a)->soap_out(soap, tag, id, type);"); } else { if (!p && ((Tnode*)typ->ref)->recursive) fprintf(fout, "\n\tsoap_out_%s(soap, tag, id, a->get(), type);\n\tsoap_unmark(soap, mark);\n\treturn soap->error;", c_ident((Tnode*)typ->ref)); else fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, a->get(), type);", c_ident((Tnode*)typ->ref)); } fprintf(fout, "\n}"); } else { fprintf(fout, "\n\tfor (%s::const_iterator i = a->begin(); i != a->end(); ++i)\n\t{", c_type(typ)); if (n->type == Tarray) fprintf(fout, "\n\t\tif (soap_out_%s(soap, tag, id, *i, \"%s\"))", c_ident(n), xsi_type_u(typ)); else if (n->type == Tclass && !is_external(n) && !is_volatile(n) && !is_typedef(n)) fprintf(fout, "\n\t\tif ((*i).soap_out(soap, tag, id, \"%s\"))", xsi_type_u(typ)); else if (is_qname(n)) fprintf(fout, "\n\t\tconst char *soap_tmp = soap_QName2s(soap, *i);\n\t\tif (soap_out_%s(soap, tag, id, (char*const*)(void*)&soap_tmp, \"%s\"))", c_ident(n), xsi_type_u(typ)); else if (is_stdqname(n)) fprintf(fout, "\n\t\tstd::string soap_tmp(soap_QName2s(soap, (*i).c_str()));\n\t\tif (soap_out_%s(soap, tag, id, &soap_tmp, \"%s\"))", c_ident(n), xsi_type_u(typ)); else if (is_XML(n) && is_string(n)) fprintf(fout, "\n\t\tif (soap_outliteral(soap, tag, (char*const*)&(*i), NULL))"); else if (is_XML(n) && is_wstring(n)) fprintf(fout, "\n\t\tif (soap_outwliteral(soap, tag, (wchar_t*const*)&(*i), NULL))"); else if (is_string(n)) fprintf(fout, "\n\t\tif (soap_out_%s(soap, tag, -1, (char*const*)&(*i), \"%s\"))", c_ident(n), xsi_type_u(typ)); else if (is_wstring(n)) fprintf(fout, "\n\t\tif (soap_out_%s(soap, tag, -1, (wchar_t*const*)&(*i), \"%s\"))", c_ident(n), xsi_type_u(typ)); else if (is_bool(n)) fprintf(fout, "\n\t\tbool b = (*i);\n\t\tif (soap_out_%s(soap, tag, id, &b, \"%s\"))", c_ident(n), xsi_type_u(typ)); else fprintf(fout, "\n\t\tif (soap_out_%s(soap, tag, id, &(*i), \"%s\"))", c_ident(n), xsi_type_u(typ)); fprintf(fout, "\n\t\t\treturn soap->error;"); fprintf(fout, "\n\t}\n\treturn SOAP_OK;\n}"); } break; default: break; } } void soap_out_Darray(Tnode *typ) { int i, j, d = 0; Table *t, *table; Entry *p; const char *nse = ns_qualifiedElement(typ); const char *nsa = ns_qualifiedAttribute(typ); const char *item; table = (Table*)typ->ref; fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ), c_type_id(typ, "*")); if (is_external(typ)) return; if (typ->type == Tclass && !is_volatile(typ) && !is_typedef(typ)) { fprintf(fout, "\n\nint %s::soap_out(struct soap *soap, const char *tag, int id, const char *type) const", c_type(typ)); fprintf(fout, "\n{\treturn soap_out_%s(soap, tag, id, this, type);\n}", c_ident(typ)); } fflush(fout); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, const %s, const char *type)\n{", c_ident(typ), c_type_id(typ, "*a")); if (has_setter(typ)) fprintf(fout, "\n\t((%s)a)->set(soap);", c_type_id(typ, "*")); if (!is_binary(typ)) { p = is_dynamic_array(typ); d = get_Darraydims(typ); if (d) fprintf(fout, "\n\tsize_t i, n = soap_size(a->__size, %d);", d); else fprintf(fout, "\n\tint i, n = a->__size;"); } if (typ->type == Tclass) { for (t = table; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.sto & Sattribute) soap_set_attr(p, ptr_cast(t, "a"), ident(p->sym->name), ns_add(p, nsa)); } } } else { for (t = table; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.sto & Sattribute) soap_set_attr(p, "a", ident(p->sym->name), ns_add(p, nsa)); } } } p = is_dynamic_array(typ); if (p->sym->name[5]) item = ns_addx(p->sym->name + 5, nse); else item = ns_addx("item", nse); if (!has_ns(typ) && !is_untyped(typ) && !is_binary(typ)) { const char *s = xsi_type(typ); if (is_untyped(p->info.typ)) s = wsdl_type(p->info.typ, "xsd"); if (d) { if (has_offset(typ)) fprintf(fout, "\n\tchar *t = a->%s ? soap_putsizesoffsets(soap, \"%s\", a->__size, a->__offset, %d) : NULL;", ident(p->sym->name), s, d); else fprintf(fout, "\n\tchar *t = a->%s ? soap_putsizesoffsets(soap, \"%s\", a->__size, NULL, %d) : NULL;", ident(p->sym->name), s, d); } else { if (has_offset(typ)) fprintf(fout, "\n\tchar *t = a->%s ? soap_putsizesoffsets(soap, \"%s\", &a->__size, &a->__offset, 1) : NULL;", ident(p->sym->name), s); else fprintf(fout, "\n\tchar *t = a->%s ? soap_putsizesoffsets(soap, \"%s\", &a->__size, NULL, 1) : NULL;", ident(p->sym->name), s); } } if (d) fprintf(fout, "\n\tid = soap_element_id(soap, tag, id, a, a->%s, %s, type, %s, NULL);", ident(p->sym->name), get_Darraysize("a", d), soap_type(typ)); else if (is_attachment(typ)) { fprintf(fout, "\n#ifndef WITH_LEANER\n\tid = soap_attachment(soap, tag, id, a, a->%s, a->__size, a->id, a->type, a->options, type, %s);", ident(p->sym->name), soap_type(typ)); fprintf(fout, "\n#else\n\tid = soap_element_id(soap, tag, id, a, a->%s, a->__size, type, %s, NULL);\n#endif", ident(p->sym->name), soap_type(typ)); } else fprintf(fout, "\n\tid = soap_element_id(soap, tag, id, a, a->%s, a->__size, type, %s, NULL);", ident(p->sym->name), soap_type(typ)); fprintf(fout, "\n\tif (id < 0)\n\t\treturn soap->error;"); fprintf(fout, "\n\tif ("); if (has_ns(typ) || is_untyped(typ) || is_binary(typ)) { if (table && table->prev) fprintf(fout, "soap_element_begin_out(soap, tag, id, \"%s\")", xsi_type(typ)); else fprintf(fout, "soap_element_begin_out(soap, tag, id, type)"); } else if (has_offset(typ)) { if (d) fprintf(fout, "soap_array_begin_out(soap, tag, id, t, soap_putoffsets(soap, a->__offset, %d))", d); else fprintf(fout, "soap_array_begin_out(soap, tag, id, t, soap_putoffsets(soap, &a->__offset, 1))"); } else fprintf(fout, "soap_array_begin_out(soap, tag, id, t, NULL)"); fprintf(fout, ")\n\t\treturn soap->error;"); if (is_hexBinary(typ)) fprintf(fout, "\n\tif (soap_puthex(soap, a->__ptr, a->__size))\n\t\treturn soap->error;"); else if (is_binary(typ)) fprintf(fout, "\n\tif (soap_putbase64(soap, a->__ptr, a->__size))\n\t\treturn soap->error;"); else { fprintf(fout, "\n\tfor (i = 0; i < n; i++)\n\t{"); if (!has_ns(typ) && !is_untyped(typ)) { if (d) { fprintf(fout, "\n\t\tsoap->position = %d;", d); for (i = 0; i < d; i++) { fprintf(fout, "\n\t\tsoap->positions[%d] = i", i); for (j = i+1; j < d; j++) fprintf(fout, "/a->__size[%d]", j); fprintf(fout, "%%a->__size[%d];", i); } if (is_XML((Tnode*)p->info.typ->ref) && is_string((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\tsoap_outliteral(soap, \"%s\", (char*const*)&a->%s[i], NULL);", item, ident(p->sym->name)); else if (is_XML((Tnode*)p->info.typ->ref) && is_wstring((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\tsoap_outwliteral(soap, \"%s\", (wchar_t*const*)&a->%s[i], NULL);", item, ident(p->sym->name)); else if (is_string((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\tsoap_out_%s(soap, \"%s\", -1, (char*const*)&a->%s[i], \"%s\");", c_ident(((Tnode *)p->info.typ->ref)), item, ident(p->sym->name), xsi_type_u(((Tnode *)p->info.typ->ref))); else if (is_wstring((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\tsoap_out_%s(soap, \"%s\", -1, (wchar_t*const*)&a->%s[i], \"%s\");", c_ident(((Tnode *)p->info.typ->ref)), item, ident(p->sym->name), xsi_type_u(((Tnode *)p->info.typ->ref))); else if (((Tnode *)p->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->info.typ->ref) && !is_volatile((Tnode*)p->info.typ->ref) && !is_typedef((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\ta->%s[i].soap_out(soap, \"%s\", -1, \"%s\");", ident(p->sym->name), item, xsi_type_u(((Tnode *)p->info.typ->ref))); else fprintf(fout, "\n\t\tsoap_out_%s(soap, \"%s\", -1, &a->%s[i], \"%s\");", c_ident(((Tnode *)p->info.typ->ref)), item, ident(p->sym->name), xsi_type_u(((Tnode *)p->info.typ->ref))); } else { fprintf(fout, "\n\t\tsoap->position = 1;\n\t\tsoap->positions[0] = i;"); if (is_XML((Tnode*)p->info.typ->ref) && is_string((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\tsoap_outliteral(soap, \"%s\", &a->%s[i], NULL);", item, ident(p->sym->name)); else if (is_XML((Tnode*)p->info.typ->ref) && is_wstring((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\tsoap_outwliteral(soap, \"%s\", &a->%s[i], NULL);", item, ident(p->sym->name)); else if (is_string((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\tsoap_out_%s(soap, \"%s\", -1, (char*const*)&a->%s[i], \"%s\");", c_ident(((Tnode *)p->info.typ->ref)), item, ident(p->sym->name), xsi_type_u(((Tnode *)p->info.typ->ref))); else if (is_wstring((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\tsoap_out_%s(soap, \"%s\", -1, (wchar_t*const*)&a->%s[i], \"%s\");", c_ident(((Tnode *)p->info.typ->ref)), item, ident(p->sym->name), xsi_type_u(((Tnode *)p->info.typ->ref))); else if (((Tnode *)p->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->info.typ->ref) && !is_volatile((Tnode*)p->info.typ->ref) && !is_typedef((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\ta->%s[i].soap_out(soap, \"%s\", -1, \"%s\");", ident(p->sym->name), item, xsi_type_u(((Tnode *)p->info.typ->ref))); else fprintf(fout, "\n\t\tsoap_out_%s(soap, \"%s\", -1, &a->%s[i], \"%s\");", c_ident(((Tnode *)p->info.typ->ref)), item, ident(p->sym->name), xsi_type_u(((Tnode *)p->info.typ->ref))); } } else { if (is_XML((Tnode*)p->info.typ->ref) && is_string((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\tsoap_outliteral(soap, \"%s\", &a->%s[i], NULL);", item, ident(p->sym->name)); else if (is_XML((Tnode*)p->info.typ->ref) && is_wstring((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\tsoap_outwliteral(soap, \"%s\", &a->%s[i], NULL);", item, ident(p->sym->name)); else if (is_string((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\tsoap_out_%s(soap, \"%s\", -1, (char*const*)&a->%s[i], \"%s\");", c_ident(((Tnode *)p->info.typ->ref)), item, ident(p->sym->name), xsi_type_u(((Tnode *)p->info.typ->ref))); else if (is_wstring((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\tsoap_out_%s(soap, \"%s\", -1, (wchar_t*const*)&a->%s[i], \"%s\");", c_ident(((Tnode *)p->info.typ->ref)), item, ident(p->sym->name), xsi_type_u(((Tnode *)p->info.typ->ref))); else if (((Tnode *)p->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->info.typ->ref) && !is_volatile((Tnode*)p->info.typ->ref) && !is_typedef((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\ta->%s[i].soap_out(soap, \"%s\", -1, \"%s\");", ident(p->sym->name), item, xsi_type_u(((Tnode *)p->info.typ->ref))); else fprintf(fout, "\n\t\tsoap_out_%s(soap, \"%s\", -1, &a->%s[i], \"%s\");", c_ident(((Tnode *)p->info.typ->ref)), item, ident(p->sym->name), xsi_type_u(((Tnode *)p->info.typ->ref))); } } if (is_binary(typ)) fprintf(fout, "\n\treturn soap_element_end_out(soap, tag);\n}"); else if (!has_ns(typ) && !is_untyped(typ)) fprintf(fout, "\n\t}\n\tsoap->position = 0;\n\treturn soap_element_end_out(soap, tag);\n}"); else fprintf(fout, "\n\t}\n\treturn soap_element_end_out(soap, tag);\n}"); } void soap_get(Tnode *typ) { Tnode *temp; if (typ->type == Ttemplate || typ->type == Tunion) return; if (is_typedef(typ) && (is_element(typ) || is_synonym(typ))) { fprintf(fhead, "\n\n#define soap_get_%s soap_get_%s\n", c_ident(typ), t_ident(typ)); fprintf(fhead, "\n\n#define soap_read_%s soap_read_%s\n", c_ident(typ), t_ident(typ)); return; } if (typ->type == Tarray) { /* ARRAY */ temp = typ; while (temp->type == Tarray) { temp = (Tnode*)temp->ref; } fprintf(fhead, "\nSOAP_FMAC3 %s * SOAP_FMAC4 soap_get_%s(struct soap*, %s, const char*, const char*);", c_type(temp), c_ident(typ), c_type(typ)); fprintf(fout, "\n\nSOAP_FMAC3 %s * SOAP_FMAC4 soap_get_%s(struct soap *soap, %s, const char *tag, const char *type)", c_type(temp), c_ident(typ), c_type_id(typ, "a")); fprintf(fout, "\n{\t%s;", c_type_id(temp, "(*p)")); fprintf(fout, "\n\tif ((p = soap_in_%s(soap, tag, a, type)))", c_ident(typ)); } else if (typ->type == Tclass && !is_external(typ) && !is_volatile(typ) && !is_typedef(typ)) { /* CLASS */ fprintf(fout, "\n\nvoid *%s::soap_get(struct soap *soap, const char *tag, const char *type)", c_type(typ)); fprintf(fout, "\n{\n\treturn soap_get_%s(soap, this, tag, type);\n}", c_ident(typ)); fprintf(fhead, "\nSOAP_FMAC3 %s SOAP_FMAC4 soap_get_%s(struct soap*, %s, const char*, const char*);", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 %s SOAP_FMAC4 soap_get_%s(struct soap *soap, %s, const char *tag, const char *type)\n{", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*p")); fprintf(fout, "\n\tif ((p = soap_in_%s(soap, tag, p, type)))", c_ident(typ)); } else { fprintf(fhead, "\nSOAP_FMAC3 %s SOAP_FMAC4 soap_get_%s(struct soap*, %s, const char*, const char*);", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 %s SOAP_FMAC4 soap_get_%s(struct soap *soap, %s, const char *tag, const char *type)\n{", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*p")); fprintf(fout, "\n\tif ((p = soap_in_%s(soap, tag, p, type)))", c_ident(typ)); } fprintf(fout, "\n\t\tif (soap_getindependent(soap))\n\t\t\treturn NULL;"); fprintf(fout, "\n\treturn p;\n}"); #if 0 /* some compilers cannot handle this inlined function */ if (typ->type != Treference) fprintf(fhead, "\n\ninline int soap_read_%s(struct soap *soap, %s) { if (soap_begin_recv(soap) || !soap_get_%s(soap, p, NULL, NULL) || soap_end_recv(soap)) return soap->error; return SOAP_OK; }\n", c_ident(typ), c_type_id(typ, "*p"), c_ident(typ)); #endif if (typ->type == Tclass && !is_external(typ) && !is_volatile(typ) && !is_typedef(typ)) { if (namespaceid) fprintf(fhead, "\n\n#ifndef soap_read_%s\n#define soap_read_%s(soap, data) ( ((data) ? ((data)->soap_default(soap), 0) : 0) || soap_begin_recv(soap) || !%s::soap_get_%s(soap, (data), NULL, NULL) || soap_end_recv(soap), (soap)->error )\n#endif\n", c_ident(typ), c_ident(typ), namespaceid, c_ident(typ)); else fprintf(fhead, "\n\n#ifndef soap_read_%s\n#define soap_read_%s(soap, data) ( ((data) ? ((data)->soap_default(soap), 0) : 0) || soap_begin_recv(soap) || !soap_get_%s(soap, (data), NULL, NULL) || soap_end_recv(soap), (soap)->error )\n#endif\n", c_ident(typ), c_ident(typ), c_ident(typ)); } else { if (namespaceid && (Qflag || !is_external(typ))) fprintf(fhead, "\n\n#ifndef soap_read_%s\n#define soap_read_%s(soap, data) ( ((data) ? (%s::soap_default_%s(soap, (data)), 0) : 0) || soap_begin_recv(soap) || !%s::soap_get_%s(soap, (data), NULL, NULL) || soap_end_recv(soap), (soap)->error )\n#endif\n", c_ident(typ), c_ident(typ), namespaceid, c_ident(typ), namespaceid, c_ident(typ)); else if (namespaceid) fprintf(fhead, "\n\n#ifndef soap_read_%s\n#define soap_read_%s(soap, data) ( ((data) ? (soap_default_%s(soap, (data)), 0) : 0) || soap_begin_recv(soap) || !%s::soap_get_%s(soap, (data), NULL, NULL) || soap_end_recv(soap), (soap)->error )\n#endif\n", c_ident(typ), c_ident(typ), c_ident(typ), namespaceid, c_ident(typ)); else fprintf(fhead, "\n\n#ifndef soap_read_%s\n#define soap_read_%s(soap, data) ( ((data) ? (soap_default_%s(soap, (data)), 0) : 0) || soap_begin_recv(soap) || !soap_get_%s(soap, (data), NULL, NULL) || soap_end_recv(soap), (soap)->error )\n#endif\n", c_ident(typ), c_ident(typ), c_ident(typ), c_ident(typ)); } fflush(fout); } void soap_in(Tnode *typ) { Entry *p = NULL; Table *table, *t; int total, strict, nonempty, flag, cardinality, i, j; long min, max; Tnode *n, *temp; const char *nse = ns_qualifiedElement(typ); const char *nsa = ns_qualifiedAttribute(typ); if (is_dynamic_array(typ)) { soap_in_Darray(typ); return; } if (is_external(typ) && !is_volatile(typ)) fprintf(fhead, "\nSOAP_FMAC3S int SOAP_FMAC4S soap_s2%s(struct soap*, const char*, %s);", c_ident(typ), c_type_id(typ, "*")); if (is_typedef(typ) && (!is_external(typ) || is_volatile(typ)) && !is_qname(typ) && !is_stdqname(typ)) fprintf(fhead, "\n\n#define soap_s2%s soap_s2%s\n", c_ident(typ), t_ident(typ)); if (is_typedef(typ) && (is_element(typ) || is_synonym(typ)) && (!is_external(typ) || is_volatile(typ))) { fprintf(fhead, "\n\n#define soap_in_%s soap_in_%s\n", c_ident(typ), t_ident(typ)); return; } if ((is_primitive_or_string(typ) && typ->type != Tenum && typ->type != Tenumsc) || (is_external(typ) && is_volatile(typ))) { if (is_stdqname(typ)) { fprintf(fhead, "\nSOAP_FMAC3 std::string * SOAP_FMAC4 soap_in_%s(struct soap*, const char*, std::string*, const char*);", c_ident(typ)); fprintf(fout, "\n\nSOAP_FMAC1 std::string * SOAP_FMAC2 soap_in_%s(struct soap *soap, const char *tag, std::string *s, const char *type)\n{\n\tif (soap_element_begin_in(soap, tag, 1, type))\n\t\treturn NULL;\n\tif (!s)\n\t\ts = soap_new_std__string(soap, -1);\n\tif (soap->null)\n\t\tif (s)\n\t\t\ts->erase();", c_ident(typ)); fprintf(fout, "\n\tif (soap->body && !*soap->href)\n\t{\tchar *t;\n\t\ts = (std::string*)soap_id_enter(soap, soap->id, s, %s, sizeof(std::string), soap->type, soap->arrayType, %s_instantiate, %s_fbase);\n\t\tif (s)\n\t\t{\tif (!(t = soap_string_in(soap, 2, %ld, %ld, %s)))\n\t\t\t\treturn NULL;\n\t\t\ts->assign(t);\n\t\t}\n\t}\n\telse\n\t\ts = (std::string*)soap_id_forward(soap, soap->href, soap_id_enter(soap, soap->id, s, %s, sizeof(std::string), soap->type, soap->arrayType, %s_instantiate, %s_fbase), 0, %s, %s, sizeof(std::string), 0, %s_finsert, NULL);\n\tif (soap->body && soap_element_end_in(soap, tag))\n\t\treturn NULL;\n\treturn s;\n}", soap_type(typ), prefix, prefix, minlen(typ), maxlen(typ), pattern(typ), soap_type(typ), prefix, prefix, soap_type(typ), soap_type(typ), prefix); return; } if (is_stdstring(typ)) { if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 std::string * SOAP_FMAC2 soap_in_%s(struct soap*, const char*, std::string*, const char*);", c_ident(typ)); return; } fprintf(fhead, "\nSOAP_FMAC3 std::string * SOAP_FMAC4 soap_in_%s(struct soap*, const char*, std::string*, const char*);", c_ident(typ)); if (is_stdXML(typ)) fprintf(fout, "\n\nSOAP_FMAC3 std::string * SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, std::string *s, const char *type)\n{\n\tchar *t;\n\t(void)type; /* appease -Wall -Werror */\n\tif (soap_inliteral(soap, tag, &t))\n\t{\tif (!s)\n\t\t\ts = soap_new_std__string(soap, -1);\n\t\ts->assign(t);\n\t\treturn s;\n\t}\n\treturn NULL;\n}", c_ident(typ)); else { fprintf(fout, "\n\nSOAP_FMAC3 std::string * SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, std::string *s, const char *type)\n{\n\t(void)type; /* appease -Wall -Werror */\n\tif (soap_element_begin_in(soap, tag, 1, NULL))\n\t\treturn NULL;\n\tif (!s)\n\t\ts = soap_new_std__string(soap, -1);\n\tif (soap->null)\n\t\tif (s)\n\t\t\ts->erase();", c_ident(typ)); fprintf(fout, "\n\tif (soap->body && !*soap->href)\n\t{\tchar *t;\n\t\ts = (std::string*)soap_id_enter(soap, soap->id, s, %s, sizeof(std::string), soap->type, soap->arrayType, %s_instantiate, %s_fbase);\n\t\tif (s)\n\t\t{\tif (!(t = soap_string_in(soap, 1, %ld, %ld, %s)))\n\t\t\t\treturn NULL;\n\t\t\ts->assign(t);\n\t\t}\n\t}\n\telse\n\t\ts = (std::string*)soap_id_forward(soap, soap->href, soap_id_enter(soap, soap->id, s, %s, sizeof(std::string), soap->type, soap->arrayType, %s_instantiate, %s_fbase), 0, %s, %s, sizeof(std::string), 0, %s_finsert, NULL);\n\tif (soap->body && soap_element_end_in(soap, tag))\n\t\treturn NULL;\n\treturn s;\n}", soap_type(typ), prefix, prefix, minlen(typ), maxlen(typ), pattern(typ), soap_type(typ), prefix, prefix, soap_type(typ), soap_type(typ), prefix); } return; } if (is_stdwstring(typ)) { if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC3 std::wstring * SOAP_FMAC4 soap_in_%s(struct soap*, const char*, std::wstring*, const char*);", c_ident(typ)); return; } if (is_stdXML(typ)) fprintf(fout, "\n\nSOAP_FMAC3 std::wstring * SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, std::wstring *s, const char *type)\n{\n\twchar_t *t;\n\t(void)type; /* appease -Wall -Werror */\n\tif (soap_inwliteral(soap, tag, &t))\n\t{\tif (!s)\n\t\t\ts = soap_new_std__wstring(soap, -1);\n\t\ts->assign(t);\n\t\treturn s;\n\t}\n\treturn NULL;\n}", c_ident(typ)); else { fprintf(fhead, "\nSOAP_FMAC3 std::wstring * SOAP_FMAC4 soap_in_%s(struct soap*, const char*, std::wstring*, const char*);", c_ident(typ)); fprintf(fout, "\n\nSOAP_FMAC3 std::wstring * SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, std::wstring *s, const char *type)\n{\n\t(void)type; /* appease -Wall -Werror */\n\tif (soap_element_begin_in(soap, tag, 1, NULL))\n\t\treturn NULL;\n\tif (!s)\n\t\ts = soap_new_std__wstring(soap, -1);\n\tif (soap->null)\n\t\tif (s)\n\t\t\ts->erase();", c_ident(typ)); fprintf(fout, "\n\tif (soap->body && !*soap->href)\n\t{\twchar_t *t;\n\t\ts = (std::wstring*)soap_id_enter(soap, soap->id, s, %s, sizeof(std::wstring), soap->type, soap->arrayType, %s_instantiate, %s_fbase);\n\t\tif (s)\n\t\t{\tif (!(t = soap_wstring_in(soap, 1, %ld, %ld, %s)))\n\t\t\t\treturn NULL;\n\t\t\ts->assign(t);\n\t\t}\n\t}\n\telse\n\t\ts = (std::wstring*)soap_id_forward(soap, soap->href, soap_id_enter(soap, soap->id, s, %s, sizeof(std::wstring), soap->type, soap->arrayType, %s_instantiate, %s_fbase), 0, %s, %s, sizeof(std::wstring), 0, %s_finsert, NULL);\n\tif (soap->body && soap_element_end_in(soap, tag))\n\t\treturn NULL;\n\treturn s;\n}", soap_type(typ), prefix, prefix, minlen(typ), maxlen(typ), pattern(typ), soap_type(typ), prefix, prefix, soap_type(typ), soap_type(typ), prefix); } return; } if (is_external(typ) && !is_volatile(typ)) { fprintf(fhead, "\nSOAP_FMAC1 %s * SOAP_FMAC2 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type(typ), c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 %s * SOAP_FMAC4 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type(typ), c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 %s * SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, %s, const char *type)\n{", c_type(typ), c_ident(typ), c_type_id(typ, "*a")); if (is_wstring(typ)) fprintf(fout, "\n\ta = soap_inwstring(soap, tag, a, type, %s, %ld, %ld, %s);", soap_type(typ), minlen(typ), maxlen(typ), pattern(typ)); else if (is_string(typ)) fprintf(fout, "\n\ta = soap_instring(soap, tag, a, type, %s, %d, %ld, %ld, %s);", soap_type(typ), is_qname(typ)+1, minlen(typ), maxlen(typ), pattern(typ)); else { if (typ->type == Tllong || typ->type == Tullong) fprintf(fout, "\n\ta = soap_in%s(soap, tag, a, type, %s);", c_type(typ), soap_type(typ)); else if (is_primitive_or_string(typ)) fprintf(fout, "\n\ta = soap_in%s(soap, tag, a, type, %s);", the_type(typ), soap_type(typ)); else fprintf(fout, "\n\ta = soap_in_%s(soap, tag, a, type);", t_ident(typ)); if (typ->hasmin) { if ((typ->type >= Tfloat && typ->type <= Tldouble) || is_external(typ)) fprintf(fout, "\n\tif (a && *a %s %lG)\n\t{\tsoap->error = SOAP_LENGTH;\n\t\treturn NULL;\n\t}", typ->incmin ? "<" : "<=", typ->min); else if (typ->min > 0 || typ->type < Tuchar || typ->type > Tullong) fprintf(fout, "\n\tif (a && *a %s " SOAP_LONG_FORMAT ")\n\t{\tsoap->error = SOAP_LENGTH;\n\t\treturn NULL;\n\t}", typ->incmin ? "<" : "<=", (LONG64)typ->min); } if (typ->hasmax) { if ((typ->type >= Tfloat && typ->type <= Tldouble) || is_external(typ)) fprintf(fout, "\n\tif (a && *a %s %lG)\n\t{\tsoap->error = SOAP_LENGTH;\n\t\treturn NULL;\n\t}", typ->incmax ? ">" : ">=", typ->max); else if (typ->max >= 0 || typ->type < Tuchar || typ->type > Tullong) fprintf(fout, "\n\tif (a && *a %s " SOAP_LONG_FORMAT ")\n\t{\tsoap->error = SOAP_LENGTH;\n\t\treturn NULL;\n\t}", typ->incmax ? ">" : ">=", (LONG64)typ->max); } } fprintf(fout, "\n\treturn a;\n}"); fflush(fout); return; } if (is_fixedstring(typ)) { int n = typ->width / ((Tnode*)typ->ref)->width; fprintf(fhead, "\nSOAP_FMAC3 char* SOAP_FMAC4 soap_in_%s(struct soap*, const char*, char[], const char*);", c_ident(typ)); fprintf(fout, "\n\nSOAP_FMAC3 char* SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, char a[], const char *type)\n{\tchar *p = NULL;\n\tif (!soap_instring(soap, tag, &p, type, %s, 1, 0, %d, %s))\n\t\treturn NULL;\n\tif (!p)\n\t{\tif (*soap->href)\n\t\t\tsoap_id_nullify(soap, soap->href);\n\t\telse\n\t\t\tsoap->error = SOAP_NULL;\n\t\treturn NULL;\n\t}\n\tsoap_strncpy(a, %d, p, %d);\n\treturn a;\n}", c_ident(typ), soap_type(typ), n - 1, pattern(typ), n, n - 1); return; } switch(typ->type) { case Tstruct: if (is_external(typ) && !is_volatile(typ)) { fprintf(fhead, "\nSOAP_FMAC1 %s SOAP_FMAC2 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, %s, const char *type)\n{", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*a")); table = (Table*)typ->ref; if (!typ->ref) { fprintf(fout, "\n\t(void)soap; (void)tag; (void)a; (void)type; /* appease -Wall -Werror */"); fprintf(fout, "\n\tif (!a)\n\t\tsoap->error = SOAP_TAG_MISMATCH;\n\treturn a;\n}"); } else if (is_primclass(typ)) { fprintf(fout, "\n\t(void)type; /* appease -Wall -Werror */"); fprintf(fout, "\n\tif (soap_element_begin_in(soap, tag, 1, NULL))\n\t\treturn NULL;"); if (!cflag) fprintf(fout, "\n\tif (!(a = (%s)soap_id_enter(soap, soap->id, a, %s, sizeof(%s), soap->type, soap->arrayType, %s_instantiate, %s_fbase)))\n\t\treturn NULL;", c_type_id(typ, "*"), soap_type(typ), c_type(typ), prefix, prefix); else fprintf(fout, "\n\tif (!(a = (%s)soap_id_enter(soap, soap->id, a, %s, sizeof(%s), NULL, NULL, NULL, NULL)))\n\t\treturn NULL;", c_type_id(typ, "*"), soap_type(typ), c_type(typ)); fprintf(fout, "\n\tsoap_revert(soap);\n\t*soap->id = '\\0';"); fprintf(fout, "\n\tsoap_default_%s(soap, a);", c_ident(typ)); for (t = (Table*)typ->ref; t; t = t->prev) { for (p = t->list; p; p = p->next) if (p->info.sto & Sattribute) soap_attr_value(p, "a", ident(p->sym->name), ns_add(p, nsa)); } fflush(fout); for (table = (Table*)typ->ref; table; table = table->prev) { p = table->list; while (p && !is_item(p)) p = p->next; if (p) break; } if (is_XML(p->info.typ) && is_string(p->info.typ)) fprintf(fout, "\n\tif (!soap_inliteral(soap, tag, (char**)&a->%s))", ident(p->sym->name)); else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) fprintf(fout, "\n\tif (!soap_inwliteral(soap, tag, (wchar_t**)&a->%s))", ident(p->sym->name)); else if (is_string(p->info.typ)) fprintf(fout, "\n\tif (!soap_in_%s(soap, tag, (char**)&a->%s, \"%s\"))", c_ident(p->info.typ), ident(p->sym->name), xsi_type(typ)); else if (is_wstring(p->info.typ)) fprintf(fout, "\n\tif (!soap_in_%s(soap, tag, (wchar_t**)&a->%s, \"%s\"))", c_ident(p->info.typ), ident(p->sym->name), xsi_type(typ)); else if (p->info.typ->type == Tarray) fprintf(fout, "\n\tif (!soap_in_%s(soap, tag, a->%s, \"%s\"))", c_ident(p->info.typ), ident(p->sym->name), xsi_type(typ)); else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) fprintf(fout, "\n\tif (!a->%s.soap_in(soap, tag, \"%s\"))", ident(p->sym->name), xsi_type(typ)); else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) fprintf(fout, "\n\tif (!soap_in_%s(soap, tag, &a->%s, \"%s\"))", c_ident(p->info.typ), ident(p->sym->name), xsi_type(typ)); fprintf(fout, "\n\t\treturn NULL;"); if (has_getter(typ)) fprintf(fout, "\n\tif (a->get(soap))\n\t\treturn NULL;"); fprintf(fout, "\n\treturn a;\n}"); } else { table = (Table*)typ->ref; if (!is_discriminant(typ)) { for (t = table; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (!(p->info.sto & (Sconst | Sprivate | Sprotected)) && !(p->info.sto & Sattribute) && p->info.typ->type != Tfun && !is_void(p->info.typ)) { if (is_anytype(p) || is_choice(p)) { p = p->next; fprintf(fout, "\n\tsize_t soap_flag_%s = " SOAP_LONG_FORMAT ";", ident(p->sym->name), p->info.maxOccurs); } else if (is_repetition(p)) { fprintf(fout, "\n\tstruct soap_blist *soap_blist_%s = NULL;", ident(p->next->sym->name)); p = p->next; } else if (!is_transient(p->info.typ) && !is_container(p->info.typ)) fprintf(fout, "\n\tsize_t soap_flag_%s = " SOAP_LONG_FORMAT ";", ident(p->sym->name), p->info.maxOccurs); } } } } if (!is_invisible(typ->id->name)) { fprintf(fout, "\n\tif (soap_element_begin_in(soap, tag, 0, type))\n\t\treturn NULL;"); } else if (!is_discriminant(typ)) { if (table && (table->prev || table->list)) fprintf(fout, "\n\tshort soap_flag;"); fprintf(fout, "\n\t(void)tag; (void)type; /* appease -Wall -Werror */"); } else fprintf(fout, "\n\t(void)tag; (void)type; /* appease -Wall -Werror */"); if (has_class(typ)) { if (is_invisible(typ->id->name)) fprintf(fout, "\n\ta = (%s)soap_id_enter(soap, \"\", a, %s, sizeof(%s), soap->type, soap->arrayType, %s_instantiate, %s_fbase);", c_type_id(typ, "*"), soap_type(typ), c_type(typ), prefix, prefix); else fprintf(fout, "\n\ta = (%s)soap_id_enter(soap, soap->id, a, %s, sizeof(%s), soap->type, soap->arrayType, %s_instantiate, %s_fbase);", c_type_id(typ, "*"), soap_type(typ), c_type(typ), prefix, prefix); } else if (is_invisible(typ->id->name)) fprintf(fout, "\n\ta = (%s)soap_id_enter(soap, \"\", a, %s, sizeof(%s), NULL, NULL, NULL, NULL);", c_type_id(typ, "*"), soap_type(typ), c_type(typ)); else fprintf(fout, "\n\ta = (%s)soap_id_enter(soap, soap->id, a, %s, sizeof(%s), NULL, NULL, NULL, NULL);", c_type_id(typ, "*"), soap_type(typ), c_type(typ)); fprintf(fout, "\n\tif (!a)\n\t\treturn NULL;"); fprintf(fout, "\n\tsoap_default_%s(soap, a);", c_ident(typ)); for (t = table; t; t = t->prev) { for (p = t->list; p; p = p->next) if (p->info.sto & Sattribute) soap_attr_value(p, "a", ident(p->sym->name), ns_add(p, nsa)); } if (!is_invisible(typ->id->name)) { if (!is_discriminant(typ)) { fprintf(fout, "\n\tif (soap->body && !*soap->href)\n\t{"); fprintf(fout, "\n\t\tfor (;;)\n\t\t{\tsoap->error = SOAP_TAG_MISMATCH;"); } else fprintf(fout, "\n\tif (!tag || *tag == '-' || (soap->body && !*soap->href))\n\t{"); } else if (!is_discriminant(typ)) { if (table && (table->prev || table->list)) fprintf(fout, "\n\t\tfor (soap_flag = 0;; soap_flag = 1)\n\t\t{\tsoap->error = SOAP_TAG_MISMATCH;"); } flag = 0; for (t = table; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun || p->info.typ->type == Tunion || is_soapref(p->info.typ)) ; else if (p->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fout, "\n\t\t/* non-serializable %s skipped */", ident(p->sym->name)); else if (p->info.sto & Sattribute) ; else if (is_repetition(p)) { if (is_unmatched(p->next->sym) || is_invisible(p->next->sym->name)) { p = p->next; continue; } flag = 1; fprintf(fout, "\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH && "); fprintf(fout, "!soap_element_begin_in(soap, %s, 1, NULL))", field(p->next, nse)); fprintf(fout, "\n\t\t\t{\tif (a->%s == NULL)\n\t\t\t\t{\tif (soap_blist_%s == NULL)\n\t\t\t\t\t\tsoap_blist_%s = soap_new_block(soap);", ident(p->next->sym->name), ident(p->next->sym->name), ident(p->next->sym->name)); if (((Tnode*)p->next->info.typ->ref)->type == Tclass || has_class((Tnode*)p->next->info.typ->ref) || (!cflag && ((Tnode*)p->next->info.typ->ref)->type == Tstruct)) fprintf(fout, "\n\t\t\t\t\ta->%s = soap_block<%s>::push(soap, soap_blist_%s);\n\t\t\t\t\tif (a->%s == NULL)\n\t\t\t\t\t\treturn NULL;", ident(p->next->sym->name), c_type(p->next->info.typ->ref), ident(p->next->sym->name), ident(p->next->sym->name)); else if (((Tnode*)p->next->info.typ->ref)->type == Tpointer && (p->next->info.sto & Sconstptr)) fprintf(fout, "\n\t\t\t\t\ta->%s = (const %s)soap_push_block(soap, soap_blist_%s, sizeof(%s));\n\t\t\t\t\tif (a->%s == NULL)\n\t\t\t\t\t\treturn NULL;", ident(p->next->sym->name), c_type(p->next->info.typ), ident(p->next->sym->name), c_type((Tnode*)p->next->info.typ->ref), ident(p->next->sym->name)); else fprintf(fout, "\n\t\t\t\t\ta->%s = (%s)soap_push_block(soap, soap_blist_%s, sizeof(%s));\n\t\t\t\t\tif (a->%s == NULL)\n\t\t\t\t\t\treturn NULL;", ident(p->next->sym->name), c_type(p->next->info.typ), ident(p->next->sym->name), c_type((Tnode*)p->next->info.typ->ref), ident(p->next->sym->name)); if (((Tnode*)p->next->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->next->info.typ->ref) && !is_volatile((Tnode*)p->next->info.typ->ref) && !is_typedef((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\t\ta->%s->soap_default(soap);", ident(p->next->sym->name)); else if (((Tnode*)p->next->info.typ->ref)->type != Tpointer && !is_XML((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\t\tsoap_default_%s(soap, a->%s);", c_ident((Tnode*)p->next->info.typ->ref), ident(p->next->sym->name)); else fprintf(fout, "\n\t\t\t\t\t*a->%s = NULL;", ident(p->next->sym->name)); fprintf(fout, "\n\t\t\t\t}"); fprintf(fout, "\n\t\t\t\tsoap_revert(soap);"); if (is_XML((Tnode*)p->next->info.typ->ref) && is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_inliteral(soap, %s, (char**)a->%s))", field(p->next, nse), ident(p->next->sym->name)); else if (is_XML((Tnode*)p->next->info.typ->ref) && is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_inwliteral(soap, %s, (wchar_t**)a->%s))", field(p->next, nse), ident(p->next->sym->name)); else if (is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, (char**)a->%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), field(p->next, nse), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); else if (is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, (wchar_t**)a->%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), field(p->next, nse), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); else fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, a->%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), field(p->next, nse), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); fprintf(fout, "\n\t\t\t\t{\ta->%s++;\n\t\t\t\t\ta->%s = NULL;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}", ident(p->sym->name), ident(p->next->sym->name)); p = p->next; } else if (is_anytype(p)) { flag = 1; fprintf(fout, "\n\t\t\tif (soap_flag_%s && soap->error == SOAP_TAG_MISMATCH)", ident(p->next->sym->name)); fprintf(fout, "\n\t\t\t\tif ((a->%s = soap_getelement(soap, &a->%s)))", ident(p->next->sym->name), ident(p->sym->name)); fprintf(fout, "\n\t\t\t\t{\tsoap_flag_%s = 0;", ident(p->next->sym->name)); fprintf(fout, "\n\t\t\t\t\tcontinue;"); fprintf(fout, "\n\t\t\t\t}"); p = p->next; } else if (is_discriminant(typ) && p->next) { flag = 1; fprintf(fout, "\n\t\tif (!soap_in_%s(soap, &a->%s, &a->%s))", c_ident(p->next->info.typ), ident(p->sym->name), ident(p->next->sym->name)); fprintf(fout, "\n\t\t\treturn NULL;"); break; } else if (is_choice(p)) { flag = 1; fprintf(fout, "\n\t\t\tif (soap_flag_%s && soap->error == SOAP_TAG_MISMATCH)", ident(p->next->sym->name)); fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, &a->%s, &a->%s))", c_ident(p->next->info.typ), ident(p->sym->name), ident(p->next->sym->name)); fprintf(fout, "\n\t\t\t\t{\tsoap_flag_%s = 0;", ident(p->next->sym->name)); fprintf(fout, "\n\t\t\t\t\tcontinue;"); fprintf(fout, "\n\t\t\t\t}"); p = p->next; } else if (is_transient(p->info.typ)) { fprintf(fout, "\n\t\t\t/* transient %s skipped */", ident(p->sym->name)); } else { flag = 1; if (!is_invisible(p->sym->name) && !is_primclass(typ) && p->info.typ->type != Tfun && !is_void(p->info.typ)) { if (is_string(p->info.typ) || is_wstring(p->info.typ) || is_stdstr(p->info.typ)) fprintf(fout, "\n\t\t\tif (soap_flag_%s && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))", ident(p->sym->name)); else if (is_container(p->info.typ)) fprintf(fout, "\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH)"); else fprintf(fout, "\n\t\t\tif (soap_flag_%s && soap->error == SOAP_TAG_MISMATCH)", ident(p->sym->name)); } if (is_unmatched(p->sym)) { if (is_XML(p->info.typ) && is_string(p->info.typ)) { fprintf(fout, "\n\t\t\t\tif (soap_inliteral(soap, NULL, (char**)&a->%s))", ident(p->sym->name)); } else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) { fprintf(fout, "\n\t\t\t\tif (soap_inwliteral(soap, NULL, (wchar_t**)&a->%s))", ident(p->sym->name)); } else if (is_string(p->info.typ)) { fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, NULL, (char**)&a->%s, \"%s\"))", c_ident(p->info.typ), ident(p->sym->name), xsi_type(p->info.typ)); } else if (is_wstring(p->info.typ)) { fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, NULL, (wchar_t**)&a->%s, \"%s\"))", c_ident(p->info.typ), ident(p->sym->name), xsi_type(p->info.typ)); } else if (p->info.typ->type == Tarray) { fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, NULL, a->%s, \"%s\"))", c_ident(p->info.typ), ident(p->sym->name), xsi_type(p->info.typ)); } else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { fprintf(fout, "\n\t\t\t\tif (a->%s.soap_in(soap, NULL, \"%s\"))", ident(p->sym->name), xsi_type(p->info.typ)); } else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, NULL, &a->%s, \"%s\"))", c_ident(p->info.typ), ident(p->sym->name), xsi_type(p->info.typ)); } } else if (!is_invisible(p->sym->name)) { if (is_XML(p->info.typ) && is_string(p->info.typ)) { fprintf(fout, "\n\t\t\t\tif (soap_inliteral(soap, %s, (char**)&a->%s))", field(p, nse), ident(p->sym->name)); } else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) { fprintf(fout, "\n\t\t\t\tif (soap_inwliteral(soap, %s, (wchar_t**)&a->%s))", field(p, nse), ident(p->sym->name)); } else if (is_string(p->info.typ)) { fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, (char**)&a->%s, \"%s\"))", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type(p->info.typ)); } else if (is_wstring(p->info.typ)) { fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, (wchar_t**)&a->%s, \"%s\"))", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type(p->info.typ)); } else if (p->info.typ->type == Tarray) { fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, a->%s, \"%s\"))", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type(p->info.typ)); } else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { fprintf(fout, "\n\t\t\t\tif (a->%s.soap_in(soap, %s, \"%s\"))", ident(p->sym->name), field(p, nse), xsi_type(p->info.typ)); } else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, &a->%s, \"%s\"))", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type(p->info.typ)); } } if (!is_invisible(p->sym->name) && !is_primclass(typ) && p->info.typ->type != Tfun && !is_void(p->info.typ)) { if (is_container(p->info.typ)) fprintf(fout, "\n\t\t\t\t\tcontinue;"); else { fprintf(fout, "\n\t\t\t\t{\tsoap_flag_%s--;", ident(p->sym->name)); fprintf(fout, "\n\t\t\t\t\tcontinue;"); fprintf(fout, "\n\t\t\t\t}"); } } } fflush(fout); } } if (!is_discriminant(typ)) { for (t = table; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (is_repetition(p) && (is_unmatched(p->next->sym) || (is_invisible(p->next->sym->name)))) { flag = 1; fprintf(fout, "\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH && "); if (is_unmatched(p->next->sym)) fprintf(fout, "!soap_element_begin_in(soap, NULL, 1, NULL))"); else if (is_invisible(p->next->sym->name)) fprintf(fout, "!soap_peek_element(soap))"); fprintf(fout, "\n\t\t\t{\tif (a->%s == NULL)\n\t\t\t\t{\tif (soap_blist_%s == NULL)\n\t\t\t\t\t\tsoap_blist_%s = soap_new_block(soap);", ident(p->next->sym->name), ident(p->next->sym->name), ident(p->next->sym->name)); if (((Tnode*)p->next->info.typ->ref)->type == Tclass || has_class((Tnode*)p->next->info.typ->ref) || (!cflag && ((Tnode*)p->next->info.typ->ref)->type == Tstruct)) fprintf(fout, "\n\t\t\t\t\ta->%s = soap_block<%s>::push(soap, soap_blist_%s);\n\t\t\t\t\tif (a->%s == NULL)\n\t\t\t\t\t\treturn NULL;", ident(p->next->sym->name), c_type(p->next->info.typ->ref), ident(p->next->sym->name), ident(p->next->sym->name)); else if (((Tnode*)p->next->info.typ->ref)->type == Tpointer && (p->next->info.sto & Sconstptr)) fprintf(fout, "\n\t\t\t\t\ta->%s = (const %s)soap_push_block(soap, soap_blist_%s, sizeof(%s));\n\t\t\t\t\tif (a->%s == NULL)\n\t\t\t\t\t\treturn NULL;", ident(p->next->sym->name), c_type(p->next->info.typ), ident(p->next->sym->name), c_type((Tnode*)p->next->info.typ->ref), ident(p->next->sym->name)); else fprintf(fout, "\n\t\t\t\t\ta->%s = (%s)soap_push_block(soap, soap_blist_%s, sizeof(%s));\n\t\t\t\t\tif (a->%s == NULL)\n\t\t\t\t\t\treturn NULL;", ident(p->next->sym->name), c_type(p->next->info.typ), ident(p->next->sym->name), c_type((Tnode*)p->next->info.typ->ref), ident(p->next->sym->name)); if (((Tnode*)p->next->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->next->info.typ->ref) && !is_volatile((Tnode*)p->next->info.typ->ref) && !is_typedef((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\t\ta->%s->soap_default(soap);", ident(p->next->sym->name)); else if (((Tnode*)p->next->info.typ->ref)->type != Tpointer && !is_XML((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\t\tsoap_default_%s(soap, a->%s);", c_ident((Tnode*)p->next->info.typ->ref), ident(p->next->sym->name)); else fprintf(fout, "\n\t\t\t\t\t*a->%s = NULL;", ident(p->next->sym->name)); fprintf(fout, "\n\t\t\t\t}"); if (!is_invisible(p->next->sym->name)) fprintf(fout, "\n\t\t\t\tsoap_revert(soap);"); if (is_unmatched(p->next->sym)) { if (is_XML((Tnode*)p->next->info.typ->ref) && is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_inliteral(soap, NULL, (char**)a->%s))", ident(p->next->sym->name)); else if (is_XML((Tnode*)p->next->info.typ->ref) && is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_inwliteral(soap, NULL, (wchar_t**)a->%s))", ident(p->next->sym->name)); else if (is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, NULL, (char**)a->%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); else if (is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, NULL, (wchar_t**)a->%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); else fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, NULL, a->%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); } else { if (is_XML((Tnode*)p->next->info.typ->ref) && is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_inliteral(soap, %s, (char**)a->%s))", field(p->next, nse), ident(p->next->sym->name)); else if (is_XML((Tnode*)p->next->info.typ->ref) && is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_inwliteral(soap, %s, (wchar_t**)a->%s))", field(p->next, nse), ident(p->next->sym->name)); else if (is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, (char**)a->%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), field(p->next, nse), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); else if (is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, (wchar_t**)a->%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), field(p->next, nse), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); else fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, a->%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), field(p->next, nse), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); } fprintf(fout, "\n\t\t\t\t{\ta->%s++;\n\t\t\t\t\ta->%s = NULL;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}", ident(p->sym->name), ident(p->next->sym->name)); p = p->next; } else if (is_repetition(p) || is_anytype(p) || is_choice(p)) { p = p->next; continue; } else if (is_invisible(p->sym->name) && !(p->info.sto & (Sconst | Sprivate | Sprotected)) && !is_transient(p->info.typ) && !(p->info.sto & Sattribute)) { flag = 1; if (is_string(p->info.typ) || is_wstring(p->info.typ) || is_stdstr(p->info.typ)) fprintf(fout, "\n\t\t\tif (soap_flag_%s && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))", ident(p->sym->name)); else if (is_container(p->info.typ)) fprintf(fout, "\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH)"); else fprintf(fout, "\n\t\t\tif (soap_flag_%s && soap->error == SOAP_TAG_MISMATCH)", ident(p->sym->name)); if (is_XML(p->info.typ) && is_string(p->info.typ)) fprintf(fout, "\n\t\t\t\tif (soap_inliteral(soap, %s, (char**)&a->%s))", field(p, nse), ident(p->sym->name)); else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) fprintf(fout, "\n\t\t\t\tif (soap_inwliteral(soap, %s, (wchar_t**)&a->%s))", field(p, nse), ident(p->sym->name)); else if (is_string(p->info.typ)) fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, (char**)&a->%s, \"%s\"))", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type(p->info.typ)); else if (is_wstring(p->info.typ)) fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, (wchar_t**)&a->%s, \"%s\"))", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type(p->info.typ)); else if (p->info.typ->type == Tarray) fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, a->%s, \"%s\"))", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type(p->info.typ)); else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) fprintf(fout, "\n\t\t\t\tif (a->%s.soap_in(soap, %s, \"%s\"))", ident(p->sym->name), field(p, nse), xsi_type(p->info.typ)); else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, &a->%s, \"%s\"))", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type(p->info.typ)); if (is_container(p->info.typ)) fprintf(fout, "\n\t\t\t\t\tcontinue;"); else { fprintf(fout, "\n\t\t\t\t{\tsoap_flag_%s--;", ident(p->sym->name)); fprintf(fout, "\n\t\t\t\t\tcontinue;"); fprintf(fout, "\n\t\t\t\t}"); } } } } for (t = table; t; t = t->prev) for (p = t->list; p; p = p->next) if (p->info.sto & Sreturn) if (nse || has_ns_eq(NULL, p->sym->name)) fprintf(fout, "\n\t\t\tsoap_check_result(soap, \"%s\");", ns_add(p, nse)); if (!flag && is_invisible(typ->id->name)) fprintf(fout, "\n\tsoap->error = SOAP_TAG_MISMATCH;\n\ta = NULL;"); if (!is_invisible(typ->id->name) || (table && (table->prev || table->list))) { fprintf(fout, "\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH)"); if (!is_invisible(typ->id->name) || is_discriminant(typ)) fprintf(fout, "\n\t\t\t\tsoap->error = soap_ignore_element(soap);"); else fprintf(fout, "\n\t\t\t\tif (soap_flag)\n\t\t\t\t{\tsoap->error = SOAP_OK;\n\t\t\t\t\tbreak;\n\t\t\t\t}"); if (!is_invisible(typ->id->name)) fprintf(fout, "\n\t\t\tif (soap->error == SOAP_NO_TAG)"); else fprintf(fout, "\n\t\t\tif (soap_flag && soap->error == SOAP_NO_TAG)"); fprintf(fout, "\n\t\t\t\tbreak;"); fprintf(fout, "\n\t\t\tif (soap->error)\n\t\t\t\treturn NULL;"); fprintf(fout, "\n\t\t}"); } } if (table && !is_discriminant(typ)) { for (p = table->list; p; p = p->next) { if (is_repetition(p)) { if (((Tnode*)p->next->info.typ->ref)->type == Tclass || has_class((Tnode*)p->next->info.typ->ref) || (((Tnode*)p->next->info.typ->ref)->type == Tstruct && !cflag)) { fprintf(fout, "\n\t\tif (a->%s)\n\t\t\tsoap_block<%s>::pop(soap, soap_blist_%s);", ident(p->next->sym->name), c_type(p->next->info.typ->ref), ident(p->next->sym->name)); fprintf(fout, "\n\t\tif (a->%s)\n\t\t{\ta->%s = soap_new_%s(soap, a->%s);\n\t\t\tif (!a->%s)\n\t\t\t\treturn NULL;\n\t\t\tsoap_block<%s>::save(soap, soap_blist_%s, a->%s);\n\t\t}\n\t\telse\n\t\t{\ta->%s = NULL;\n\t\t\tif (soap_blist_%s)\n\t\t\t\tsoap_block<%s>::end(soap, soap_blist_%s);\n\t\t}", ident(p->sym->name), ident(p->next->sym->name), c_ident(p->next->info.typ->ref), ident(p->sym->name), ident(p->next->sym->name), c_type(p->next->info.typ->ref), ident(p->next->sym->name), ident(p->next->sym->name), ident(p->next->sym->name), ident(p->next->sym->name), c_type(p->next->info.typ->ref), ident(p->next->sym->name)); } else { fprintf(fout, "\n\t\tif (a->%s)\n\t\t\tsoap_pop_block(soap, soap_blist_%s);", ident(p->next->sym->name), ident(p->next->sym->name)); if ((((Tnode*)p->next->info.typ->ref)->type == Tpointer && (p->next->info.sto & Sconstptr))) fprintf(fout, "\n\t\tif (a->%s)\n\t\t{\ta->%s = (const %s)soap_save_block(soap, soap_blist_%s, NULL, 1);\n\t\t}\n\t\telse\n\t\t{\ta->%s = NULL;\n\t\t\tif (soap_blist_%s)\n\t\t\t\tsoap_end_block(soap, soap_blist_%s);\n\t\t}", ident(p->sym->name), ident(p->next->sym->name), c_type(p->next->info.typ), ident(p->next->sym->name), ident(p->next->sym->name), ident(p->next->sym->name), ident(p->next->sym->name)); else fprintf(fout, "\n\t\tif (a->%s)\n\t\t{\ta->%s = (%s)soap_save_block(soap, soap_blist_%s, NULL, 1);\n\t\t}\n\t\telse\n\t\t{\ta->%s = NULL;\n\t\t\tif (soap_blist_%s)\n\t\t\t\tsoap_end_block(soap, soap_blist_%s);\n\t\t}", ident(p->sym->name), ident(p->next->sym->name), c_type(p->next->info.typ), ident(p->next->sym->name), ident(p->next->sym->name), ident(p->next->sym->name), ident(p->next->sym->name)); } p = p->next; } } } strict = 0; nonempty = 0; if (table && !is_discriminant(typ)) { for (p = table->list; p; p = p->next) { if (p->info.minOccurs > 0 && p->info.maxOccurs >= 0 && !(p->info.sto & (Sconst | Sprivate | Sprotected)) && !(p->info.sto & Sattribute) && p->info.typ->type != Tfun && !is_void(p->info.typ) && !is_transient(p->info.typ) && !is_container(p->info.typ) && !is_repetition(p) && !is_choice(p) && p->info.hasval == False) { if (is_item(p)) continue; if (is_anytype(p)) p = p->next; if (strict == 0) { fprintf(fout, "\n\t\tif (%s(soap_flag_%s > " SOAP_LONG_FORMAT "", strict_check(), ident(p->sym->name), p->info.maxOccurs - p->info.minOccurs); strict = 1; } else fprintf(fout, " || soap_flag_%s > " SOAP_LONG_FORMAT "", ident(p->sym->name), p->info.maxOccurs - p->info.minOccurs); nonempty = 1; } else if (is_container(p->info.typ)) { if (p->info.minOccurs > 0) { if (p->info.typ->type == Tpointer) { if (strict == 0) { fprintf(fout, "\n\t\tif (%s(!a->%s || a->%s->size() < " SOAP_LONG_FORMAT, strict_check(), ident(p->sym->name), ident(p->sym->name), p->info.minOccurs); strict = 1; } else fprintf(fout, " || !a->%s || a->%s->size() < " SOAP_LONG_FORMAT, ident(p->sym->name), ident(p->sym->name), p->info.minOccurs); } else { if (strict == 0) { fprintf(fout, "\n\t\tif (%s(a->%s.size() < " SOAP_LONG_FORMAT, strict_check(), ident(p->sym->name), p->info.minOccurs); strict = 1; } else fprintf(fout, " || a->%s.size() < " SOAP_LONG_FORMAT, ident(p->sym->name), p->info.minOccurs); } nonempty = 1; } if (p->info.maxOccurs > 1) { if (p->info.typ->type == Tpointer) { if (strict == 0) { fprintf(fout, "\n\t\tif (%s((a->%s && a->%s->size() > " SOAP_LONG_FORMAT ")", strict_check(), ident(p->sym->name), ident(p->sym->name), p->info.maxOccurs); strict = 1; } else fprintf(fout, " || (a->%s && a->%s->size() > " SOAP_LONG_FORMAT ")", ident(p->sym->name), ident(p->sym->name), p->info.maxOccurs); } else { if (strict == 0) { fprintf(fout, "\n\t\tif (%s(a->%s.size() > " SOAP_LONG_FORMAT, strict_check(), ident(p->sym->name), p->info.maxOccurs); strict = 1; } else fprintf(fout, " || a->%s.size() > " SOAP_LONG_FORMAT, ident(p->sym->name), p->info.maxOccurs); } } } else if (is_repetition(p)) { if (p->info.minOccurs > 0) { if (strict == 0) { fprintf(fout, "\n\t\tif (%s(a->%s < " SOAP_LONG_FORMAT, strict_check(), ident(p->sym->name), p->info.minOccurs); strict = 1; } else fprintf(fout, " || a->%s < " SOAP_LONG_FORMAT, ident(p->sym->name), p->info.minOccurs); nonempty = 1; } if (p->info.maxOccurs > 1) { if (strict == 0) { fprintf(fout, "\n\t\tif (%s(a->%s > " SOAP_LONG_FORMAT, strict_check(), ident(p->sym->name), p->info.maxOccurs); strict = 1; } else fprintf(fout, " || a->%s > " SOAP_LONG_FORMAT, ident(p->sym->name), p->info.maxOccurs); } p = p->next; } else if (is_choice(p)) { if (p->info.minOccurs != 0 && required_choice(p->next->info.typ) < 0) { if (strict == 0) { fprintf(fout, "\n\t\tif (%s(soap_flag_%s", strict_check(), ident(p->next->sym->name)); strict = 1; } else fprintf(fout, " || soap_flag_%s", ident(p->next->sym->name)); nonempty = 1; } p = p->next; } } if (strict) fprintf(fout, "))\n\t\t{\tsoap->error = SOAP_OCCURS;\n\t\t\treturn NULL;\n\t\t}"); } if (has_getter(typ)) fprintf(fout, "\n\t\tif (a->get(soap))\n\t\t\treturn NULL;"); if (!is_invisible(typ->id->name)) { if (is_discriminant(typ)) fprintf(fout, "\n\t\tif (tag && *tag != '-')\n\t\t{\tsoap->error = soap_ignore_element(soap);\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH || soap_element_end_in(soap, tag))\n\t\t\t\treturn NULL;\n\t\t}"); else fprintf(fout, "\n\t\tif (soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); if (nonempty) fprintf(fout, "\n\t}\n\telse if (%s!*soap->href)\n\t{\tsoap->error = SOAP_OCCURS;\n\t\treturn NULL;", strict_check()); fprintf(fout, "\n\t}\n\telse\n\t{\t"); if (!cflag) fprintf(fout, "a = (%s)soap_id_forward(soap, soap->href, (void*)a, 0, %s, %s, sizeof(%s), 0, %s_finsert, NULL);", c_type_id(typ, "*"), soap_type(typ), soap_type(typ), c_type(typ), prefix); else fprintf(fout, "a = (%s)soap_id_forward(soap, soap->href, (void*)a, 0, %s, %s, sizeof(%s), 0, NULL, NULL);", c_type_id(typ, "*"), soap_type(typ), soap_type(typ), c_type(typ)); fprintf(fout, "\n\t\tif (soap->body && soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); fprintf(fout, "\n\t}"); } fprintf(fout, "\n\treturn a;\n}"); } break; case Tclass: if (is_external(typ) && !is_volatile(typ)) { fprintf(fhead, "\nSOAP_FMAC1 %s SOAP_FMAC2 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*")); if (!is_volatile(typ) && !is_typedef(typ)) { fprintf(fout, "\n\nvoid *%s::soap_in(struct soap *soap, const char *tag, const char *type)", c_type(typ)); fprintf(fout, "\n{\treturn soap_in_%s(soap, tag, this, type);\n}", c_ident(typ)); fflush(fout); } fprintf(fout, "\n\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, %s, const char *type)\n{", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*a")); fprintf(fout, "\n\t(void)tag; (void)type; /* appease -Wall -Werror */"); if (!typ->ref) { fprintf(fout, "\n\t(void)soap; (void)a; /* appease -Wall -Werror */"); fprintf(fout, "\n\tif (!a)\n\t\tsoap->error = SOAP_TAG_MISMATCH;\n\treturn a;\n}"); } else if (is_primclass(typ)) { table = (Table*)typ->ref; fprintf(fout, "\n\tif (soap_element_begin_in(soap, tag, 1, NULL))\n\t\treturn NULL;"); fprintf(fout, "\n\tif (!(a = (%s)soap_id_enter(soap, soap->id, a, %s, sizeof(%s), soap->type, soap->arrayType, %s_instantiate, %s_fbase)))\n\t{\tsoap->error = SOAP_TAG_MISMATCH;\n\t\treturn NULL;\n\t}", c_type_id(typ, "*"), soap_type(typ), c_type(typ), prefix, prefix); fprintf(fout, "\n\tsoap_revert(soap);\n\t*soap->id = '\\0';"); if (table && table->prev) { fprintf(fout, "\n\tif (soap->alloced && soap->alloced != %s)", soap_type(typ)); fprintf(fout, "\n\t\treturn (%s)a->soap_in(soap, tag, type);", c_type_id(typ, "*")); } fprintf(fout, "\n\tif (soap->alloced)\n\t\ta->soap_default(soap);"); for (t = table; t; t = t->prev) { Entry *e = entry(classtable, t->sym); const char *nsa1 = e ? ns_qualifiedAttribute(e->info.typ) : nsa; for (p = t->list; p; p = p->next) if (p->info.sto & Sattribute) soap_attr_value(p, ptr_cast(t, "a"), ident(p->sym->name), ns_add(p, nsa1)); } fflush(fout); for (table = (Table*)typ->ref; table; table = table->prev) { p = table->list; while (p && !is_item(p)) p = p->next; if (p) break; } if (is_XML(p->info.typ) && is_string(p->info.typ)) fprintf(fout, "\n\tif (!soap_inliteral(soap, tag, (char**)&a->%s::%s))", ident(table->sym->name), ident(p->sym->name)); else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) fprintf(fout, "\n\tif (!soap_inwliteral(soap, tag, (wchar_t**)&a->%s::%s))", ident(table->sym->name), ident(p->sym->name)); else if (is_string(p->info.typ)) fprintf(fout, "\n\tif (!soap_in_%s(soap, tag, (char**)&a->%s::%s, \"%s\"))", c_ident(p->info.typ), ident(table->sym->name), ident(p->sym->name), xsi_type(typ)); else if (is_wstring(p->info.typ)) fprintf(fout, "\n\tif (!soap_in_%s(soap, tag, (wchar_t**)&a->%s::%s, \"%s\"))", c_ident(p->info.typ), ident(table->sym->name), ident(p->sym->name), xsi_type(typ)); else if (p->info.typ->type == Tarray) fprintf(fout, "\n\tif (!soap_in_%s(soap, tag, a->%s::%s, \"%s\"))", c_ident(p->info.typ), ident(table->sym->name), ident(p->sym->name), xsi_type(typ)); else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) fprintf(fout, "\n\tif (!(a->%s::%s).soap_in(soap, tag, \"%s\"))", ident(table->sym->name), ident(p->sym->name), xsi_type(typ)); else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) fprintf(fout, "\n\tif (!soap_in_%s(soap, tag, &a->%s::%s, \"%s\"))", c_ident(p->info.typ), ident(table->sym->name), ident(p->sym->name), xsi_type(typ)); fprintf(fout, "\n\t\treturn NULL;"); if (has_getter(typ)) fprintf(fout, "\n\tif (a->get(soap))\n\t\treturn NULL;"); fprintf(fout, "\n\treturn a;\n}"); } else { if (!is_invisible(typ->id->name)) { fprintf(fout, "\n\tif (soap_element_begin_in(soap, tag, 0, NULL))\n\t\treturn NULL;"); fprintf(fout, "\n\ta = (%s)soap_id_enter(soap, soap->id, a, %s, sizeof(%s), soap->type, soap->arrayType, %s_instantiate, %s_fbase);", c_type_id(typ, "*"), soap_type(typ), c_type(typ), prefix, prefix); } else fprintf(fout, "\n\ta = (%s)soap_id_enter(soap, \"\", a, %s, sizeof(%s), soap->type, soap->arrayType, %s_instantiate, %s_fbase);", c_type_id(typ, "*"), soap_type(typ), c_type(typ), prefix, prefix); fprintf(fout, "\n\tif (!a)\n\t\treturn NULL;"); table = (Table*)typ->ref; if (!is_discriminant(typ)) { if (table && table->prev && !is_invisible(typ->id->name)) { fprintf(fout, "\n\tif (soap->alloced && soap->alloced != %s)", soap_type(typ)); fprintf(fout, "\n\t{\tsoap_revert(soap);"); fprintf(fout, "\n\t\t*soap->id = '\\0';"); if (is_volatile(typ) || is_typedef(typ)) fprintf(fout, "\n\t\treturn soap_in_%s(soap, tag, a, type);", c_ident(typ)); else fprintf(fout, "\n\t\treturn (%s)a->soap_in(soap, tag, type);", c_type_id(typ, "*")); fprintf(fout, "\n\t}"); } } fprintf(fout, "\n\tif (soap->alloced)"); if (is_volatile(typ) || is_typedef(typ)) fprintf(fout, "\n\t\tsoap_default_%s(soap, a);", c_ident(typ)); else fprintf(fout, "\n\t\ta->soap_default(soap);"); for (t = table; t; t = t->prev) { Entry *e = entry(classtable, t->sym); const char *nsa1 = e ? ns_qualifiedAttribute(e->info.typ) : nsa; for (p = t->list; p; p = p->next) if (p->info.sto & Sattribute) soap_attr_value(p, ptr_cast(t, "a"), ident(p->sym->name), ns_add(p, nsa1)); } fflush(fout); i = 0; if (!is_discriminant(typ)) { for (t = table; t; t = t->prev) i++; for (; i > 0; i--) { t = table; for (j = 0; j < i-1; j++) t = t->prev; if (!t->prev) { Entry *e = entry(classtable, t->sym); if (e && e->info.typ && e->info.typ->base && !strcmp(e->info.typ->base->name, "soap_dom_element")) fprintf(fout, "\n\tsize_t soap_flag_soap_dom_element = 1;"); } for (p = t->list; p; p = p->next) { if (!(p->info.sto & (Sconst | Sprivate | Sprotected)) && !(p->info.sto & Sattribute) && p->info.typ->type != Tfun && !is_void(p->info.typ)) { if (is_anytype(p) || is_choice(p)) { p = p->next; fprintf(fout, "\n\tsize_t soap_flag_%s%d = " SOAP_LONG_FORMAT ";", ident(p->sym->name), i, p->info.maxOccurs); } else if (is_repetition(p)) { fprintf(fout, "\n\tstruct soap_blist *soap_blist_%s%d = NULL;", ident(p->next->sym->name), i); p = p->next; } else if (!is_transient(p->info.typ) && !is_container(p->info.typ)) fprintf(fout, "\n\tsize_t soap_flag_%s%d = " SOAP_LONG_FORMAT ";", ident(p->sym->name), i, p->info.maxOccurs); } } } } fflush(fout); if (!is_invisible(typ->id->name)) { if (!is_discriminant(typ)) { fprintf(fout, "\n\tif (soap->body && !*soap->href)\n\t{"); fprintf(fout, "\n\t\tfor (;;)\n\t\t{\tsoap->error = SOAP_TAG_MISMATCH;"); } else fprintf(fout, "\n\tif (!tag || *tag == '-' || (soap->body && !*soap->href))\n\t{"); } else if (!is_discriminant(typ)) { if (table && (table->prev || table->list)) fprintf(fout, "\n\t\tfor (short soap_flag = 0;; soap_flag = 1)\n\t\t{\tsoap->error = SOAP_TAG_MISMATCH;"); } table = (Table*)typ->ref; i = 0; flag = 0; for (t = table; t; t = t->prev) i++; for (; i > 0; i--) { Entry *e; const char *nse1; t = table; for (j = 0; j < i-1; j++) t = t->prev; e = entry(classtable, t->sym); nse1 = e ? ns_qualifiedElement(e->info.typ) : nse; for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun || p->info.typ->type == Tunion || is_soapref(p->info.typ)) ; else if (is_item(p)) ; else if (p->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fout, "\n\t\t\t/* non-serializable %s skipped */", ident(p->sym->name)); else if (p->info.sto & Sattribute) ; else if (is_repetition(p)) { if (is_unmatched(p->next->sym) || is_invisible(p->next->sym->name)) { p = p->next; continue; } flag = 1; fprintf(fout, "\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH && "); fprintf(fout, "!soap_element_begin_in(soap, %s, 1, NULL))", field(p->next, nse1)); fprintf(fout, "\n\t\t\t{\tif (a->%s::%s == NULL)\n\t\t\t\t{\tif (soap_blist_%s%d == NULL)\n\t\t\t\t\t\tsoap_blist_%s%d = soap_new_block(soap);", ident(t->sym->name), ident(p->next->sym->name), ident(p->next->sym->name), i, ident(p->next->sym->name), i); if (((Tnode*)p->next->info.typ->ref)->type == Tclass || has_class((Tnode*)p->next->info.typ->ref) || (!cflag && ((Tnode*)p->next->info.typ->ref)->type == Tstruct)) fprintf(fout, "\n\t\t\t\t\ta->%s::%s = soap_block<%s>::push(soap, soap_blist_%s%d);\n\t\t\t\t\tif (a->%s::%s == NULL)\n\t\t\t\t\t\treturn NULL;", ident(t->sym->name), ident(p->next->sym->name), c_type(p->next->info.typ->ref), ident(p->next->sym->name), i, ident(t->sym->name), ident(p->next->sym->name)); else if (((Tnode*)p->next->info.typ->ref)->type == Tpointer && (p->next->info.sto & Sconstptr)) fprintf(fout, "\n\t\t\t\t\ta->%s::%s = (const %s)soap_push_block(soap, soap_blist_%s%d, sizeof(%s));\n\t\t\t\t\tif (a->%s::%s == NULL)\n\t\t\t\t\t\treturn NULL;", ident(t->sym->name), ident(p->next->sym->name), c_type(p->next->info.typ), ident(p->next->sym->name), i, c_type((Tnode*)p->next->info.typ->ref), ident(t->sym->name), ident(p->next->sym->name)); else fprintf(fout, "\n\t\t\t\t\ta->%s::%s = (%s)soap_push_block(soap, soap_blist_%s%d, sizeof(%s));\n\t\t\t\t\tif (a->%s::%s == NULL)\n\t\t\t\t\t\treturn NULL;", ident(t->sym->name), ident(p->next->sym->name), c_type(p->next->info.typ), ident(p->next->sym->name), i, c_type((Tnode*)p->next->info.typ->ref), ident(t->sym->name), ident(p->next->sym->name)); if (((Tnode*)p->next->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->next->info.typ->ref) && !is_volatile((Tnode*)p->next->info.typ->ref) && !is_typedef((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\t\ta->%s::%s->soap_default(soap);", ident(t->sym->name), ident(p->next->sym->name)); else if (((Tnode*)p->next->info.typ->ref)->type != Tpointer && !is_XML((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\t\tsoap_default_%s(soap, a->%s::%s);", c_ident((Tnode*)p->next->info.typ->ref), ident(t->sym->name), ident(p->next->sym->name)); else fprintf(fout, "\n\t\t\t\t\t*a->%s::%s = NULL;", ident(t->sym->name), ident(p->next->sym->name)); fprintf(fout, "\n\t\t\t\t}"); fprintf(fout, "\n\t\t\t\tsoap_revert(soap);"); if (is_XML((Tnode*)p->next->info.typ->ref) && is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_inliteral(soap, %s, (char**)a->%s::%s))", field(p->next, nse1), ident(t->sym->name), ident(p->next->sym->name)); else if (is_XML((Tnode*)p->next->info.typ->ref) && is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_inwliteral(soap, %s, (wchar_t**)a->%s::%s))", field(p->next, nse1), ident(t->sym->name), ident(p->next->sym->name)); else if (is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, (char**)a->%s::%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), field(p->next, nse1), ident(t->sym->name), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); else if (is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, (wchar_t**)a->%s::%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), field(p->next, nse1), ident(t->sym->name), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); else fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, a->%s::%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), field(p->next, nse1), ident(t->sym->name), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); fprintf(fout, "\n\t\t\t\t{\ta->%s::%s++;\n\t\t\t\t\ta->%s::%s = NULL;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}", ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->next->sym->name)); p = p->next; } else if (is_anytype(p)) { flag = 1; fprintf(fout, "\n\t\t\tif (soap_flag_%s%d && soap->error == SOAP_TAG_MISMATCH)", ident(p->next->sym->name), i); fprintf(fout, "\n\t\t\t\tif ((a->%s::%s = soap_getelement(soap, &a->%s::%s)))", ident(t->sym->name), ident(p->next->sym->name), ident(t->sym->name), ident(p->sym->name)); fprintf(fout, "\n\t\t\t\t{\tsoap_flag_%s%d = 0;", ident(p->next->sym->name), i); fprintf(fout, "\n\t\t\t\t\tcontinue;"); fprintf(fout, "\n\t\t\t\t}"); p = p->next; } else if (is_discriminant(typ) && p->next) { flag = 1; fprintf(fout, "\n\t\tif (!soap_in_%s(soap, &a->%s, &a->%s))", c_ident(p->next->info.typ), ident(p->sym->name), ident(p->next->sym->name)); fprintf(fout, "\n\t\t\treturn NULL;"); i = 0; break; } else if (is_choice(p)) { flag = 1; fprintf(fout, "\n\t\t\tif (soap_flag_%s%d && soap->error == SOAP_TAG_MISMATCH)", ident(p->next->sym->name), i); fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, &a->%s::%s, &a->%s::%s))", c_ident(p->next->info.typ), ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->next->sym->name)); fprintf(fout, "\n\t\t\t\t{\tsoap_flag_%s%d = 0;", ident(p->next->sym->name), i); fprintf(fout, "\n\t\t\t\t\tcontinue;"); fprintf(fout, "\n\t\t\t\t}"); p = p->next; } else if (is_transient(p->info.typ)) { fprintf(fout, "\n\t\t\t/* transient %s skipped */", ident(p->sym->name)); } else { flag = 1; if (!is_invisible(p->sym->name) && !is_primclass(typ) && p->info.typ->type != Tfun && !is_void(p->info.typ)) { if (is_string(p->info.typ) || is_wstring(p->info.typ) || is_stdstr(p->info.typ)) fprintf(fout, "\n\t\t\tif (soap_flag_%s%d && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))", ident(p->sym->name), i); else if (is_container(p->info.typ)) fprintf(fout, "\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH)"); else fprintf(fout, "\n\t\t\tif (soap_flag_%s%d && soap->error == SOAP_TAG_MISMATCH)", ident(p->sym->name), i); } if (is_unmatched(p->sym)) { if (is_XML(p->info.typ) && is_string(p->info.typ)) { fprintf(fout, "\n\t\t\t\tif (soap_inliteral(soap, NULL, (char**)&a->%s::%s))", ident(t->sym->name), ident(p->sym->name)); } else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) { fprintf(fout, "\n\t\t\t\tif (soap_inwliteral(soap, NULL, (wchar_t**)&a->%s::%s))", ident(t->sym->name), ident(p->sym->name)); } else if (is_string(p->info.typ)) { fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, NULL, (char**)&a->%s::%s, \"%s\"))", c_ident(p->info.typ), ident(t->sym->name), ident(p->sym->name), xsi_type(p->info.typ)); } else if (is_wstring(p->info.typ)) { fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, NULL, (wchar_t**)&a->%s::%s, \"%s\"))", c_ident(p->info.typ), ident(t->sym->name), ident(p->sym->name), xsi_type(p->info.typ)); } else if (p->info.typ->type == Tarray) { fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, NULL, a->%s::%s, \"%s\"))", c_ident(p->info.typ), ident(t->sym->name), ident(p->sym->name), xsi_type(p->info.typ)); } else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { fprintf(fout, "\n\t\t\t\tif ((a->%s::%s).soap_in(soap, NULL, \"%s\"))", ident(t->sym->name), ident(p->sym->name), xsi_type(p->info.typ)); } else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, NULL, &a->%s::%s, \"%s\"))", c_ident(p->info.typ), ident(t->sym->name), ident(p->sym->name), xsi_type(p->info.typ)); } } else if (!is_invisible(p->sym->name)) { if (is_XML(p->info.typ) && is_string(p->info.typ)) { fprintf(fout, "\n\t\t\t\tif (soap_inliteral(soap, %s, (char**)&a->%s::%s))", field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name)); } else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) { fprintf(fout, "\n\t\t\t\tif (soap_inwliteral(soap, %s, (wchar_t**)&a->%s::%s))", field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name)); } else if (is_string(p->info.typ)) { fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, (char**)&a->%s::%s, \"%s\"))", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name), xsi_type(p->info.typ)); } else if (is_wstring(p->info.typ)) { fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, (wchar_t**)&a->%s::%s, \"%s\"))", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name), xsi_type(p->info.typ)); } else if (p->info.typ->type == Tarray) { fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, a->%s::%s, \"%s\"))", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name), xsi_type(p->info.typ)); } else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { fprintf(fout, "\n\t\t\t\tif ((a->%s::%s).soap_in(soap, %s, \"%s\"))", ident(t->sym->name), ident(p->sym->name), field_overridden(t, p, nse1), xsi_type(p->info.typ)); } else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, &a->%s::%s, \"%s\"))", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name), xsi_type(p->info.typ)); } } if (!is_invisible(p->sym->name) && !is_primclass(typ) && p->info.typ->type != Tfun && !is_void(p->info.typ)) { if (is_container(p->info.typ)) fprintf(fout, "\n\t\t\t\t\tcontinue;"); else { fprintf(fout, "\n\t\t\t\t{\tsoap_flag_%s%d--;", ident(p->sym->name), i); fprintf(fout, "\n\t\t\t\t\tcontinue;"); fprintf(fout, "\n\t\t\t\t}"); } } fflush(fout); } } } if (!is_discriminant(typ)) { Entry *e; const char *nse1; i = 0; for (t = table; t; t = t->prev) { i++; e = entry(classtable, t->sym); nse1 = e ? ns_qualifiedElement(e->info.typ) : nse; for (p = t->list; p; p = p->next) { if (is_repetition(p) && (is_unmatched(p->next->sym) || is_invisible(p->next->sym->name))) { flag = 1; fprintf(fout, "\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH && "); if (is_unmatched(p->next->sym)) fprintf(fout, "!soap_element_begin_in(soap, NULL, 1, NULL))"); else if (is_invisible(p->next->sym->name)) fprintf(fout, "!soap_peek_element(soap))"); fprintf(fout, "\n\t\t\t{\tif (a->%s::%s == NULL)\n\t\t\t\t{\tif (soap_blist_%s%d == NULL)\n\t\t\t\t\t\tsoap_blist_%s%d = soap_new_block(soap);", ident(t->sym->name), ident(p->next->sym->name), ident(p->next->sym->name), i, ident(p->next->sym->name), i); if (((Tnode*)p->next->info.typ->ref)->type == Tclass || has_class((Tnode*)p->next->info.typ->ref) || (!cflag && ((Tnode*)p->next->info.typ->ref)->type == Tstruct)) fprintf(fout, "\n\t\t\t\t\ta->%s::%s = soap_block<%s>::push(soap, soap_blist_%s%d);\n\t\t\t\t\tif (a->%s::%s == NULL)\n\t\t\t\t\t\treturn NULL;", ident(t->sym->name), ident(p->next->sym->name), c_type(p->next->info.typ->ref), ident(p->next->sym->name), i, ident(t->sym->name), ident(p->next->sym->name)); else if (((Tnode*)p->next->info.typ->ref)->type == Tpointer && (p->next->info.sto & Sconstptr)) fprintf(fout, "\n\t\t\t\t\ta->%s::%s = (const %s)soap_push_block(soap, soap_blist_%s%d, sizeof(%s));\n\t\t\t\t\tif (a->%s::%s == NULL)\n\t\t\t\t\t\treturn NULL;", ident(t->sym->name), ident(p->next->sym->name), c_type(p->next->info.typ), ident(p->next->sym->name), i, c_type((Tnode*)p->next->info.typ->ref), ident(t->sym->name), ident(p->next->sym->name)); else fprintf(fout, "\n\t\t\t\t\ta->%s::%s = (%s)soap_push_block(soap, soap_blist_%s%d, sizeof(%s));\n\t\t\t\t\tif (a->%s::%s == NULL)\n\t\t\t\t\t\treturn NULL;", ident(t->sym->name), ident(p->next->sym->name), c_type(p->next->info.typ), ident(p->next->sym->name), i, c_type((Tnode*)p->next->info.typ->ref), ident(t->sym->name), ident(p->next->sym->name)); if (((Tnode*)p->next->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->next->info.typ->ref) && !is_volatile((Tnode*)p->next->info.typ->ref) && !is_typedef((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\t\ta->%s::%s->soap_default(soap);", ident(t->sym->name), ident(p->next->sym->name)); else if (((Tnode*)p->next->info.typ->ref)->type != Tpointer && !is_XML((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\t\tsoap_default_%s(soap, a->%s::%s);", c_ident((Tnode*)p->next->info.typ->ref), ident(t->sym->name), ident(p->next->sym->name)); else fprintf(fout, "\n\t\t\t\t\t*a->%s::%s = NULL;", ident(t->sym->name), ident(p->next->sym->name)); fprintf(fout, "\n\t\t\t\t}"); if (!is_invisible(p->next->sym->name)) fprintf(fout, "\n\t\t\t\tsoap_revert(soap);"); if (is_unmatched(p->next->sym)) { if (is_XML((Tnode*)p->next->info.typ->ref) && is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_inliteral(soap, NULL, (char**)a->%s::%s))", ident(t->sym->name), ident(p->next->sym->name)); else if (is_XML((Tnode*)p->next->info.typ->ref) && is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_inwliteral(soap, NULL, (wchar_t**)a->%s::%s))", ident(t->sym->name), ident(p->next->sym->name)); else if (is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, NULL, (char**)a->%s::%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), ident(t->sym->name), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); else if (is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, NULL, (wchar_t**)a->%s::%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), ident(t->sym->name), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); else fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, NULL, a->%s::%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), ident(t->sym->name), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); } else { if (is_XML((Tnode*)p->next->info.typ->ref) && is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_inliteral(soap, %s, (char**)a->%s::%s))", field(p->next, nse1), ident(t->sym->name), ident(p->next->sym->name)); else if (is_XML((Tnode*)p->next->info.typ->ref) && is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_inwliteral(soap, %s, (wchar_t**)a->%s::%s))", field(p->next, nse1), ident(t->sym->name), ident(p->next->sym->name)); else if (is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, (char**)a->%s::%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), field(p->next, nse1), ident(t->sym->name), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); else if (is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, (wchar_t**)a->%s::%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), field(p->next, nse1), ident(t->sym->name), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); else fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, a->%s::%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), field(p->next, nse1), ident(t->sym->name), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); } fprintf(fout, "\n\t\t\t\t{\ta->%s::%s++;\n\t\t\t\t\ta->%s::%s = NULL;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}", ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->next->sym->name)); p = p->next; } else if (is_repetition(p) || is_anytype(p) || is_choice(p)) { p = p->next; continue; } else if (is_invisible(p->sym->name) && !(p->info.sto & (Sconst | Sprivate | Sprotected)) && !is_transient(p->info.typ) && !(p->info.sto & Sattribute)) { flag = 1; if (is_string(p->info.typ) || is_wstring(p->info.typ) || is_stdstr(p->info.typ)) fprintf(fout, "\n\t\t\tif (soap_flag_%s%d && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))", ident(p->sym->name), i); else if (is_container(p->info.typ)) fprintf(fout, "\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH)"); else fprintf(fout, "\n\t\t\tif (soap_flag_%s%d && soap->error == SOAP_TAG_MISMATCH)", ident(p->sym->name), i); if (is_XML(p->info.typ) && is_string(p->info.typ)) { fprintf(fout, "\n\t\t\t\tif (soap_inliteral(soap, %s, (char**)&a->%s::%s))", field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name)); } else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) { fprintf(fout, "\n\t\t\t\tif (soap_inwliteral(soap, %s, (wchar_t**)&a->%s::%s))", field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name)); } else if (is_string(p->info.typ)) { fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, (char**)&a->%s::%s, \"%s\"))", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name), xsi_type(p->info.typ)); } else if (is_wstring(p->info.typ)) { fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, (wchar_t**)&a->%s::%s, \"%s\"))", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name), xsi_type(p->info.typ)); } else if (p->info.typ->type == Tarray) { fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, a->%s::%s, \"%s\"))", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name), xsi_type(p->info.typ)); } else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { fprintf(fout, "\n\t\t\t\tif ((a->%s::%s).soap_in(soap, %s, \"%s\"))", ident(t->sym->name), ident(p->sym->name), field_overridden(t, p, nse1), xsi_type(p->info.typ)); } else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, &a->%s::%s, \"%s\"))", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name), xsi_type(p->info.typ)); } if (is_container(p->info.typ)) fprintf(fout, "\n\t\t\t\t\tcontinue;"); else { fprintf(fout, "\n\t\t\t\t{\tsoap_flag_%s%d--;", ident(p->sym->name), i); fprintf(fout, "\n\t\t\t\t\tcontinue;"); fprintf(fout, "\n\t\t\t\t}"); } } } if (!t->prev && e && e->info.typ && e->info.typ->base && !strcmp(e->info.typ->base->name, "soap_dom_element")) { fprintf(fout, "\n\t\t\tif (soap_flag_soap_dom_element && soap->error == SOAP_TAG_MISMATCH)\n\t\t\t\tif (soap_in_xsd__anyType(soap, NULL, static_cast(a), NULL))"); fprintf(fout, "\n\t\t\t\t{\tsoap_flag_soap_dom_element = 0;"); fprintf(fout, "\n\t\t\t\t\tcontinue;"); fprintf(fout, "\n\t\t\t\t}"); } } for (t = table; t; t = t->prev) for (p = t->list; p; p = p->next) if (p->info.sto & Sreturn) if (nse || has_ns_eq(NULL, p->sym->name)) fprintf(fout, "\n\t\t\tsoap_check_result(soap, \"%s\");", ns_add(p, nse)); if (!flag && is_invisible(typ->id->name)) fprintf(fout, "\n\tsoap->error = SOAP_TAG_MISMATCH;\n\ta = NULL;"); if (!is_invisible(typ->id->name) || (table && (table->prev || table->list))) { fprintf(fout, "\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH)"); if (!is_invisible(typ->id->name) || is_discriminant(typ)) fprintf(fout, "\n\t\t\t\tsoap->error = soap_ignore_element(soap);"); else fprintf(fout, "\n\t\t\t\tif (soap_flag)\n\t\t\t\t{\n\t\t\t\t\tsoap->error = SOAP_OK;\n\t\t\t\t\tbreak;\n\t\t\t\t}"); if (!is_invisible(typ->id->name)) fprintf(fout, "\n\t\t\tif (soap->error == SOAP_NO_TAG)"); else fprintf(fout, "\n\t\t\tif (soap_flag && soap->error == SOAP_NO_TAG)"); fprintf(fout, "\n\t\t\t\tbreak;"); fprintf(fout, "\n\t\t\tif (soap->error)\n\t\t\t\treturn NULL;"); fprintf(fout, "\n\t\t}"); } } if (!is_discriminant(typ)) { i = 0; for (t = table; t; t = t->prev) i++; for (; i > 0; i--) { t = table; for (j = 0; j < i-1; j++) t = t->prev; for (p = t->list; p; p = p->next) { if (is_repetition(p)) { if (((Tnode*)p->next->info.typ->ref)->type == Tclass || has_class((Tnode*)p->next->info.typ->ref) || (((Tnode*)p->next->info.typ->ref)->type == Tstruct && !cflag)) { fprintf(fout, "\n\t\tif (a->%s::%s)\n\t\t\tsoap_block<%s>::pop(soap, soap_blist_%s%d);", ident(t->sym->name), ident(p->next->sym->name), c_type(p->next->info.typ->ref), ident(p->next->sym->name), i); fprintf(fout, "\n\t\tif (a->%s::%s)\n\t\t{\ta->%s::%s = soap_new_%s(soap, a->%s::%s);\n\t\t\tif (!a->%s::%s)\n\t\t\t\treturn NULL;\n\t\t\tsoap_block<%s>::save(soap, soap_blist_%s%d, a->%s::%s);\n\t\t}\n\t\telse\n\t\t{\ta->%s::%s = NULL;\n\t\t\tif (soap_blist_%s%d)\n\t\t\t\tsoap_block<%s>::end(soap, soap_blist_%s%d);\n\t\t}", ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->next->sym->name), c_ident(p->next->info.typ->ref), ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->next->sym->name), c_type(p->next->info.typ->ref), ident(p->next->sym->name), i, ident(t->sym->name), ident(p->next->sym->name), ident(t->sym->name), ident(p->next->sym->name), ident(p->next->sym->name), i, c_type(p->next->info.typ->ref), ident(p->next->sym->name), i); } else { fprintf(fout, "\n\t\tif (a->%s::%s)\n\t\t\tsoap_pop_block(soap, soap_blist_%s%d);", ident(t->sym->name), ident(p->next->sym->name), ident(p->next->sym->name), i); if ((((Tnode*)p->next->info.typ->ref)->type == Tpointer && (p->next->info.sto & Sconstptr))) fprintf(fout, "\n\t\tif (a->%s::%s)\n\t\t{\ta->%s::%s = (const %s)soap_save_block(soap, soap_blist_%s%d, NULL, 1);\n\t\t}\n\t\telse\n\t\t{\ta->%s::%s = NULL;\n\t\t\tif (soap_blist_%s%d)\n\t\t\t\tsoap_end_block(soap, soap_blist_%s%d);\n\t\t}", ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->next->sym->name), c_type(p->next->info.typ), ident(p->next->sym->name), i, ident(t->sym->name), ident(p->next->sym->name), ident(p->next->sym->name), i, ident(p->next->sym->name), i); else fprintf(fout, "\n\t\tif (a->%s::%s)\n\t\t{\ta->%s::%s = (%s)soap_save_block(soap, soap_blist_%s%d, NULL, 1);\n\t\t}\n\t\telse\n\t\t{\ta->%s::%s = NULL;\n\t\t\tif (soap_blist_%s%d)\n\t\t\t\tsoap_end_block(soap, soap_blist_%s%d);\n\t\t}", ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->next->sym->name), c_type(p->next->info.typ), ident(p->next->sym->name), i, ident(t->sym->name), ident(p->next->sym->name), ident(p->next->sym->name), i, ident(p->next->sym->name), i); } p = p->next; } } } } strict = 0; nonempty = 0; if (!is_discriminant(typ)) { i = 0; for (t = table; t; t = t->prev) i++; for (; i > 0; i--) { t = table; for (j = 0; j < i-1; j++) t = t->prev; for (p = t->list; p; p = p->next) { if (p->info.minOccurs > 0 && p->info.maxOccurs >= 0 && !(p->info.sto & (Sconst | Sprivate | Sprotected)) && !(p->info.sto & Sattribute) && p->info.typ->type != Tfun && !is_void(p->info.typ) && !is_transient(p->info.typ) && !is_container(p->info.typ) && !is_repetition(p) && !is_choice(p) && p->info.hasval == False) { if (is_item(p)) continue; if (is_anytype(p)) p = p->next; if (strict == 0) { fprintf(fout, "\n\t\tif (%s(soap_flag_%s%d > " SOAP_LONG_FORMAT, strict_check(), ident(p->sym->name), i, p->info.maxOccurs - p->info.minOccurs); strict = 1; } else fprintf(fout, " || soap_flag_%s%d > " SOAP_LONG_FORMAT, ident(p->sym->name), i, p->info.maxOccurs - p->info.minOccurs); nonempty = 1; } else if (is_container(p->info.typ)) { if (p->info.minOccurs > 0) { if (p->info.typ->type == Tpointer) { if (strict == 0) { fprintf(fout, "\n\t\tif (%s(!a->%s::%s || a->%s::%s->size() < " SOAP_LONG_FORMAT, strict_check(), ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->sym->name), p->info.minOccurs); strict = 1; } else fprintf(fout, " || !a->%s::%s || a->%s::%s->size() < " SOAP_LONG_FORMAT, ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->sym->name), p->info.minOccurs); } else { if (strict == 0) { fprintf(fout, "\n\t\tif (%s(a->%s::%s.size() < " SOAP_LONG_FORMAT, strict_check(), ident(t->sym->name), ident(p->sym->name), p->info.minOccurs); strict = 1; } else fprintf(fout, " || a->%s::%s.size() < " SOAP_LONG_FORMAT, ident(t->sym->name), ident(p->sym->name), p->info.minOccurs); } nonempty = 1; } if (p->info.maxOccurs > 1) { if (p->info.typ->type == Tpointer) { if (strict == 0) { fprintf(fout, "\n\t\tif (%s((a->%s::%s && a->%s::%s->size() > " SOAP_LONG_FORMAT ")", strict_check(), ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->sym->name), p->info.maxOccurs); strict = 1; } else fprintf(fout, " || (a->%s::%s && a->%s::%s->size() > " SOAP_LONG_FORMAT ")", ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->sym->name), p->info.maxOccurs); } else { if (strict == 0) { fprintf(fout, "\n\t\tif (%s(a->%s::%s.size() > " SOAP_LONG_FORMAT, strict_check(), ident(t->sym->name), ident(p->sym->name), p->info.maxOccurs); strict = 1; } else fprintf(fout, " || a->%s::%s.size() > " SOAP_LONG_FORMAT, ident(t->sym->name), ident(p->sym->name), p->info.maxOccurs); } } } else if (is_repetition(p)) { if (p->info.minOccurs > 0) { if (strict == 0) { fprintf(fout, "\n\t\tif (%s(a->%s::%s < " SOAP_LONG_FORMAT, strict_check(), ident(t->sym->name), ident(p->sym->name), p->info.minOccurs); strict = 1; } else fprintf(fout, " || a->%s::%s < " SOAP_LONG_FORMAT, ident(t->sym->name), ident(p->sym->name), p->info.minOccurs); nonempty = 1; } if (p->info.maxOccurs > 1) { if (strict == 0) { fprintf(fout, "\n\t\tif (%s(a->%s::%s > " SOAP_LONG_FORMAT, strict_check(), ident(t->sym->name), ident(p->sym->name), p->info.maxOccurs); strict = 1; } else fprintf(fout, " || a->%s::%s > " SOAP_LONG_FORMAT, ident(t->sym->name), ident(p->sym->name), p->info.maxOccurs); } p = p->next; } else if (is_choice(p)) { if (p->info.minOccurs != 0 && required_choice(p->next->info.typ) < 0) { if (strict == 0) { fprintf(fout, "\n\t\tif (%s(soap_flag_%s%d", strict_check(), ident(p->next->sym->name), i); strict = 1; } else fprintf(fout, " || soap_flag_%s%d", ident(p->next->sym->name), i); nonempty = 1; } p = p->next; } } } if (strict) fprintf(fout, "))\n\t\t{\tsoap->error = SOAP_OCCURS;\n\t\t\treturn NULL;\n\t\t}"); } if (has_getter(typ)) fprintf(fout, "\n\t\tif (a->get(soap))\n\t\t\treturn NULL;"); if (!is_invisible(typ->id->name)) { if (is_discriminant(typ)) fprintf(fout, "\n\t\tif (tag && *tag != '-')\n\t\t{\tsoap->error = soap_ignore_element(soap);\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH || soap_element_end_in(soap, tag))\n\t\t\t\treturn NULL;\n\t\t}"); else fprintf(fout, "\n\t\tif (soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); if (nonempty) fprintf(fout, "\n\t}\n\telse if (%s!*soap->href)\n\t{\tsoap->error = SOAP_OCCURS;\n\t\treturn NULL;", strict_check()); fprintf(fout, "\n\t}\n\telse\n\t{"); fprintf(fout, "\ta = (%s)soap_id_forward(soap, soap->href, (void*)a, 0, %s, %s, sizeof(%s), 0, %s_finsert, %s_fbase);", c_type_id(typ, "*"), soap_type(typ), soap_type(typ), c_type(typ), prefix, prefix); fprintf(fout, "\n\t\tif (soap->body && soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); fprintf(fout, "\n\t}"); } fprintf(fout, "\n\treturn a;\n}"); } break; case Tunion: if (is_external(typ) && !is_volatile(typ)) { fprintf(fhead, "\nSOAP_FMAC1 %s SOAP_FMAC2 soap_in_%s(struct soap*, int*, %s);", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap*, int*, %s);", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap *soap, int *choice, %s)\n{", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*a")); fprintf(fout, "\n\t(void)a; /* appease -Wall -Werror */"); fprintf(fout, "\tsoap->error = SOAP_TAG_MISMATCH;"); table = (Table *)typ->ref; for (p = table->list; p; p = p->next) { if (p->info.typ->type == Tfun || p->info.typ->type == Tunion) ; else if (p->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name)); else if (p->info.sto & Sattribute) ; else if (is_transient(p->info.typ)) fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); else if (!is_invisible(p->sym->name)) { if (is_unmatched(p->sym)) { if (is_XML(p->info.typ) && is_string(p->info.typ)) fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_inliteral(soap, NULL, (char**)&a->%s))", ident(p->sym->name)); else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_inwliteral(soap, NULL, (wchar_t**)&a->%s))", ident(p->sym->name)); else if (p->info.typ->type == Tarray) fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_in_%s(soap, NULL, a->%s, \"%s\"))", c_ident(p->info.typ), ident(p->sym->name), xsi_type(p->info.typ)); else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && a->%s.soap_in(soap, NULL, \"%s\"))", ident(p->sym->name), xsi_type(p->info.typ)); else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { if (p->info.typ->type == Tpointer) fprintf(fout, "\n\ta->%s = NULL;", ident(p->sym->name)); fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_in_%s(soap, NULL, &a->%s, \"%s\"))", c_ident(p->info.typ), ident(p->sym->name), xsi_type(p->info.typ)); } } else { if (is_XML(p->info.typ) && is_string(p->info.typ)) fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_inliteral(soap, \"%s\", (char**)&a->%s))", ns_add(p, nse), ident(p->sym->name)); else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_inwliteral(soap, \"%s\", (wchar_t**)&a->%s))", ns_add(p, nse), ident(p->sym->name)); else if (p->info.typ->type == Tarray) fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_in_%s(soap, \"%s\", a->%s, \"%s\"))", c_ident(p->info.typ), ns_add(p, nse), ident(p->sym->name), xsi_type(p->info.typ)); else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && a->%s.soap_in(soap, \"%s\", \"%s\"))", ident(p->sym->name), ns_add(p, nse), xsi_type(p->info.typ)); else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { if (p->info.typ->type == Tpointer) fprintf(fout, "\n\ta->%s = NULL;", ident(p->sym->name)); fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_in_%s(soap, \"%s\", &a->%s, \"%s\"))", c_ident(p->info.typ), ns_add(p, nse), ident(p->sym->name), xsi_type(p->info.typ)); } } fprintf(fout, "\n\t{\t*choice = %s;", soap_union_member(typ, p)); fprintf(fout, "\n\t\treturn a;"); fprintf(fout, "\n\t}"); fflush(fout); } } table = (Table *)typ->ref; for (p = table->list; p; p = p->next) { if (p->info.typ->type == Tfun || p->info.typ->type == Tunion) ; else if (p->info.sto & (Sconst | Sprivate | Sprotected)) ; else if (is_transient(p->info.typ)) ; else if (p->info.sto & Sattribute) ; else if (is_invisible(p->sym->name)) { if (is_XML(p->info.typ) && is_string(p->info.typ)) fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_inliteral(soap, \"%s\", (char**)&a->%s))", ns_add(p, nse), ident(p->sym->name)); else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_inwliteral(soap, \"%s\", (wchar_t**)&a->%s))", ns_add(p, nse), ident(p->sym->name)); else if (p->info.typ->type == Tarray) fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_in_%s(soap, \"%s\", a->%s, NULL))", c_ident(p->info.typ), ns_add(p, nse), ident(p->sym->name)); else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && a->%s.soap_in(soap, \"%s\", NULL))", ident(p->sym->name), ns_add(p, nse)); else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { if (p->info.typ->type == Tpointer) fprintf(fout, "\n\ta->%s = NULL;", ident(p->sym->name)); fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_in_%s(soap, \"%s\", &a->%s, NULL))", c_ident(p->info.typ), ns_add(p, nse), ident(p->sym->name)); } fprintf(fout, "\n\t{\t*choice = %s;", soap_union_member(typ, p)); fprintf(fout, "\n\t\treturn a;"); fprintf(fout, "\n\t}"); fflush(fout); } } fprintf(fout, "\n\t*choice = %d;", required_choice(typ)); fprintf(fout, "\n\tif (!soap->error)\n\t\tsoap->error = SOAP_TAG_MISMATCH;\n\treturn NULL;\n}"); break; case Tpointer: if (is_external(typ) && !is_volatile(typ)) { fprintf(fhead, "\nSOAP_FMAC1 %s SOAP_FMAC2 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, %s, const char *type)\n{", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*a")); fprintf(fout, "\n\t(void)type; /* appease -Wall -Werror */\n\tif (soap_element_begin_in(soap, tag, 1, NULL))"); fprintf(fout, "\n\t\treturn NULL;"); if (is_template(typ->ref)) { fprintf(fout, "\n\tsoap_revert(soap);"); fprintf(fout, "\n\tif (!a)\n\t{\tif (!(a = (%s)soap_malloc(soap, sizeof(%s))))\n\t\t\treturn NULL;\n\t\t*a = NULL;\n\t}", c_type_id(typ, "*"), c_type(typ)); fprintf(fout, "\n\tif (!(*a = soap_in_%s(soap, tag, *a, type)))\n\t\treturn NULL;", c_ident((Tnode*)typ->ref)); fprintf(fout, "\n\treturn a;\n}"); } else if (((Tnode *) typ->ref)->type == Tclass && !is_external((Tnode*)typ->ref) && !is_volatile((Tnode*)typ->ref) && !is_typedef((Tnode*)typ->ref)) { fprintf(fout, "\n\tif (!a)\n\t\tif (!(a = (%s)soap_malloc(soap, sizeof(%s))))\n\t\t\treturn NULL;", c_type_id(typ, "*"), c_type(typ)); fprintf(fout, "\n\t*a = NULL;\n\tif (!soap->null && *soap->href != '#')"); fprintf(fout, "\n\t{\tsoap_revert(soap);"); fprintf(fout, "\n\t\tif (!(*a = (%s)soap_instantiate_%s(soap, -1, soap->type, soap->arrayType, NULL)))", c_type(typ), c_ident((Tnode*)typ->ref)); fprintf(fout, "\n\t\t\treturn NULL;"); fprintf(fout, "\n\t\t(*a)->soap_default(soap);"); fprintf(fout, "\n\t\tif (!(*a)->soap_in(soap, tag, NULL))"); fprintf(fout, "\n\t\t{\t*a = NULL;\n\t\t\treturn NULL;\n\t\t}"); fprintf(fout, "\n\t}\n\telse\n\t{\ta = (%s)soap_id_lookup(soap, soap->href, (void**)a, %s, sizeof(%s), %d, %s_fbase);", c_type_id(typ, "*"), soap_type(reftype(typ->ref)), c_type(reftype(typ->ref)), reflevel(typ->ref), prefix); fprintf(fout, "\n\t\tif (soap->body && soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); fprintf(fout, "\n\t}\n\treturn a;\n}"); } else { fprintf(fout, "\n\tif (!a)\n\t\tif (!(a = (%s)soap_malloc(soap, sizeof(%s))))\n\t\t\treturn NULL;", c_type_id(typ, "*"), c_type(typ)); fprintf(fout, "\n\t*a = NULL;\n\tif (!soap->null && *soap->href != '#')"); fprintf(fout, "\n\t{\tsoap_revert(soap);"); fprintf(fout, "\n\t\tif (!(*a = soap_in_%s(soap, tag, *a, type)))", c_ident((Tnode*)typ->ref)); fprintf(fout, "\n\t\t\treturn NULL;"); fprintf(fout, "\n\t}\n\telse\n\t{\ta = (%s)soap_id_lookup(soap, soap->href, (void**)a, %s, sizeof(%s), %d, NULL);", c_type_id(typ, "*"), soap_type(reftype(typ->ref)), c_type(reftype(typ->ref)), reflevel(typ->ref)); fprintf(fout, "\n\t\tif (soap->body && soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); fprintf(fout, "\n\t}\n\treturn a;\n}"); } break; case Tarray: temp = typ; while (temp->type == Tarray) temp = (Tnode*)temp->ref; if (is_external(typ) && !is_volatile(typ)) { fprintf(fhead, "\nSOAP_FMAC1 %s SOAP_FMAC2 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type_id(temp, "*"), c_ident(typ), c_type(typ)); return; } fprintf(fhead, "\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type_id(temp, "*"), c_ident(typ), c_type(typ)); fprintf(fout, "\n\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, %s, const char *type)\n{", c_type_id(temp, "*"), c_ident(typ), c_type_id(typ, "a")); fprintf(fout, "\n\tif (soap_element_begin_in(soap, tag, 0, NULL))"); fprintf(fout, "\n\t\treturn NULL;"); fprintf(fout, "\n\tif (soap_match_array(soap, type))"); fprintf(fout, "\n\t{\tsoap->error = SOAP_TYPE;\n\t\treturn NULL;\n\t}"); fprintf(fout, "\n\ta = (%s)soap_id_enter(soap, soap->id, a, %s, sizeof(%s), NULL, NULL, NULL, NULL);", c_type_id((Tnode*)typ->ref, "(*)"), soap_type(typ), c_type(typ)); fprintf(fout, "\n\tif (!a)\n\t\treturn NULL;"); fprintf(fout, "\n\tsoap_default_%s(soap, a);", c_ident(typ)); fprintf(fout, "\n\tif (soap->body && !*soap->href)"); total = get_dimension(typ); n = (Tnode*)typ->ref; cardinality = 1; while (n->type == Tarray) { total=total*get_dimension(n); n = (Tnode*)n->ref; cardinality++; } fprintf(fout, "\n\t{\tint i;\n\t\tfor (i = 0; i < %d; i++)", get_dimension(typ)); fprintf(fout, "\n\t\t{\tsoap_peek_element(soap);\n\t\t\tif (soap->position)\n\t\t\t{\ti = soap->positions[0];\n\t\t\t\tif (i < 0 || i >= %d)\n\t\t\t\t{\tsoap->error = SOAP_IOB;\n\t\t\t\t\treturn NULL;\n\t\t\t\t}\n\t\t\t}", get_dimension(typ)); fprintf(fout, "\n\t\t\tif (!soap_in_%s(soap, NULL, a", c_ident((Tnode*)typ->ref)); if (cardinality > 1) fprintf(fout, "[i]"); else fprintf(fout, "+i"); fprintf(fout, ", \"%s\"))", xsi_type((Tnode*)typ->ref)); fprintf(fout, "\n\t\t\t{\tif (soap->error != SOAP_NO_TAG)\n\t\t\t\t\treturn NULL;"); fprintf(fout, "\n\t\t\t\tsoap->error = SOAP_OK;"); fprintf(fout, "\n\t\t\t\tbreak;"); fprintf(fout, "\n\t\t\t}"); fprintf(fout, "\n\t\t}"); fprintf(fout, "\n\t\tif (soap->mode & SOAP_C_NOIOB)\n\t\t\twhile (soap_element_end_in(soap, tag) == SOAP_SYNTAX_ERROR)\n\t\t\t{\tsoap->peeked = 1;\n\t\t\t\tsoap_ignore_element(soap);\n\t\t\t}"); fprintf(fout, "\n\t\telse if (soap_element_end_in(soap, tag))\n\t\t{\tif (soap->error == SOAP_SYNTAX_ERROR)\n\t\t\t\tsoap->error = SOAP_IOB;\n\t\t\treturn NULL;\n\t\t}"); fprintf(fout, "\n\t}\n\telse\n\t{\ta = (%s)soap_id_forward(soap, soap->href, (void*)soap_id_enter(soap, soap->id, a, %s, sizeof(%s), NULL, NULL, NULL, NULL), 0, %s, %s, sizeof(%s), 0, NULL, NULL);", c_type_id((Tnode*)typ->ref, "(*)"), soap_type(typ), c_type(typ), soap_type(typ), soap_type(typ), c_type(typ)); fprintf(fout, "\n\t\tif (soap->body && soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); fprintf(fout, "\n\t}\n\treturn (%s)a;\n}", c_type_id(temp, "*")); break; case Tenum: case Tenumsc: if (is_external(typ) && !is_volatile(typ)) { fprintf(fhead, "\nSOAP_FMAC1 %s SOAP_FMAC2 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*")); if (!is_typedef(typ)) { fprintf(fhead, "\nSOAP_FMAC3S int SOAP_FMAC4S soap_s2%s(struct soap*, const char*, %s);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3S int SOAP_FMAC4S soap_s2%s(struct soap *soap, const char *s, %s)\n{", c_ident(typ), c_type_id(typ, "*a")); if (!is_mask(typ)) { fprintf(fout, "\n\tconst struct soap_code_map *map;"); t = (Table*)typ->ref; if (t && t->list && has_ns_eq(NULL, ns_remove2(t->list->sym->name, c_ident(typ)))) { fprintf(fout, "\n\tchar *t;"); fprintf(fout, "\n\tif (!s)\n\t\treturn soap->error;"); fprintf(fout, "\n\tsoap_s2QName(soap, s, &t, %ld, %ld);", minlen(typ), maxlen(typ)); fprintf(fout, "\n\tmap = soap_code(soap_codes_%s, t);", c_ident(typ)); } else { fprintf(fout, "\n\tif (!s)\n\t\treturn soap->error;"); fprintf(fout, "\n\tmap = soap_code(soap_codes_%s, s);", c_ident(typ)); } min = 0; max = 0; for (t = (Table*)typ->ref; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.val.i < min) min = (unsigned long)p->info.val.i; if (p->info.val.i > max) max = (unsigned long)p->info.val.i; } } if (is_boolean(typ)) fprintf(fout, "\n\tif (map)\n\t\t*a = (%s)(map->code != 0);\n\telse\n\t{\tlong n;\n\t\tif (soap_s2long(soap, s, &n) || n < 0 || n > 1)\n\t\t\treturn soap->error = SOAP_TYPE;\n\t\t*a = (%s)(n != 0);\n\t}\n\treturn SOAP_OK;\n}", c_type(typ), c_type(typ)); else if (sflag) fprintf(fout, "\n\tif (map)\n\t\t*a = (%s)map->code;\n\telse\n\t\treturn soap->error = SOAP_TYPE;\n\treturn SOAP_OK;\n}", c_type(typ)); else fprintf(fout, "\n\tif (map)\n\t\t*a = (%s)map->code;\n\telse\n\t{\tlong n;\n\t\tif (soap_s2long(soap, s, &n) || ((soap->mode & SOAP_XML_STRICT) && (n < %ld || n > %ld)))\n\t\t\treturn soap->error = SOAP_TYPE;\n\t\t*a = (%s)n;\n\t}\n\treturn SOAP_OK;\n}", c_type(typ), min, max, c_type(typ)); } else { t = (Table*)typ->ref; if (t && t->list && has_ns_eq(NULL, ns_remove1(t->list->sym->name))) { fprintf(fout, "\n\tchar *t;"); fprintf(fout, "\n\tsoap_s2QName(soap, s, &t, %ld, %ld);", minlen(typ), maxlen(typ)); fprintf(fout, "\n\t*a = (%s)soap_code_bits(soap_codes_%s, t);", c_type(typ), c_ident(typ)); } else fprintf(fout, "\n\t(void)soap; /* appease -Wall -Werror */\n\t*a = (%s)soap_code_bits(soap_codes_%s, s);", c_type(typ), c_ident(typ)); fprintf(fout, "\n\treturn SOAP_OK;\n}"); } } fprintf(fout, "\n\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, %s, const char *type)\n{", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*a")); if (is_boolean(typ)) { fprintf(fout, "\n\tif (soap_element_begin_in(soap, tag, 0, NULL))"); fprintf(fout, "\n\t\treturn NULL;"); fprintf(fout, "\n\tif (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, \":boolean\"))"); fprintf(fout, "\n\t{\tsoap->error = SOAP_TYPE;\n\t\treturn NULL;\n\t}"); } else if (typ->sym) { fprintf(fout, "\n\tif (soap_element_begin_in(soap, tag, 0, NULL))"); fprintf(fout, "\n\t\treturn NULL;"); fprintf(fout, "\n\tif (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, \"%s\"))", base_type(typ, "")); fprintf(fout, "\n\t{\tsoap->error = SOAP_TYPE;\n\t\treturn NULL;\n\t}"); } else { fprintf(fout, "\n\tif (soap_element_begin_in(soap, tag, 0, type))"); fprintf(fout, "\n\t\treturn NULL;"); } fprintf(fout, "\n\ta = (%s)soap_id_enter(soap, soap->id, a, %s, sizeof(%s), NULL, NULL, NULL, NULL);", c_type_id(typ, "*"), soap_type(typ), c_type(typ)); fprintf(fout, "\n\tif (!a)\n\t\treturn NULL;"); fprintf(fout, "\n\tif (soap->body && !*soap->href)\n\t{"); fprintf(fout, "\tif (soap_s2%s(soap, soap_value(soap), a) || soap_element_end_in(soap, tag))\n\t\t\treturn NULL;", c_ident(typ)); fprintf(fout, "\n\t}\n\telse\n\t{\ta = (%s)soap_id_forward(soap, soap->href, (void*)a, 0, %s, %s, sizeof(%s), 0, NULL, NULL);", c_type_id(typ, "*"), soap_type(typ), soap_type(typ), c_type(typ)); fprintf(fout, "\n\t\tif (soap->body && soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); fprintf(fout, "\n\t}\n\treturn a;\n}"); break; case Ttemplate: if (is_external(typ) && !is_volatile(typ)) { fprintf(fhead, "\nSOAP_FMAC1 %s SOAP_FMAC2 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*")); return; } if (is_typedef(typ)) { fprintf(fhead, "\n\n#define soap_in_%s soap_in_%s\n", c_ident(typ), t_ident(typ)); return; } n = (Tnode*)typ->ref; if (n->type == Tfun || is_void(n)) return; fprintf(fhead, "\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, %s, const char *type)\n{", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*a")); fprintf(fout, "\n\t(void)type; /* appease -Wall -Werror */"); if (is_smart(typ)) { fprintf(fout, "\n\tif (soap_element_begin_in(soap, tag, 1, NULL))"); fprintf(fout, "\n\t\treturn NULL;"); fprintf(fout, "\n\tif (!a && !(a = soap_new_%s(soap)))\n\t\treturn NULL;", c_ident(typ)); fprintf(fout, "\n\tif (!soap->null && *soap->href != '#')\n\t{"); if (is_smart_shared(typ)) { fprintf(fout, "\tvoid **x = soap_id_smart(soap, soap->id, %s, sizeof(%s));", soap_type(n), c_type(n)); if (n->type == Tclass && !is_external(n) && !is_volatile(n) && !is_typedef(n)) fprintf(fout, "\n\t\tif (x && *x)\n\t\t\t*a = *(%s)(*x);\n\t\telse\n\t\t{\t*a = %s(soap_instantiate_%s(soap, SOAP_NO_LINK_TO_DELETE, soap->type, soap->arrayType, NULL));\n\t\t\tif (x)\n\t\t\t\t*x = (void*)a;\n\t\t}", c_type_id(typ, "*"), c_type(typ), c_ident(n)); else fprintf(fout, "\n\t\tif (x && *x)\n\t\t\t*a = *(%s)(*x);\n\t\telse\n\t\t{\t*a = %s<%s>();\n\t\t\tif (x)\n\t\t\t\t*x = (void*)a;\n\t\t}", c_type_id(typ, "*"), make_shared(typ), c_type(n)); } else if (n->type == Tclass && !is_external(n) && !is_volatile(n) && !is_typedef(n)) fprintf(fout, "\t*a = %s(soap_instantiate_%s(soap, SOAP_NO_LINK_TO_DELETE, soap->type, soap->arrayType, NULL));", c_type(typ), c_ident(n)); else fprintf(fout, "\t*a = %s(SOAP_NEW(%s));", c_type(typ), c_type(n)); fprintf(fout, "\n\t\tsoap_revert(soap);"); if (is_XML(n) && is_string(n)) fprintf(fout, "\n\t\tif (!soap_inliteral(soap, tag, (char*const*)a->get()))\n\t\t\treturn NULL;"); else if (is_XML(n) && is_wstring(n)) fprintf(fout, "\n\t\tif (!soap_inwliteral(soap, tag, (wchar_t*const*)a->get()))\n\t\t\treturn NULL;"); else if (n->type == Tarray) fprintf(fout, "\n\t\tif (!soap_in_%s(soap, tag, a->get(), \"%s\"))\n\t\t\treturn NULL;", c_ident(n), xsi_type(n)); else if (n->type == Tclass && !is_external(n) && !is_volatile(n) && !is_typedef(n)) { fprintf(fout, "\n\t\t(*a)->soap_default(soap);"); fprintf(fout, "\n\t\tif (!(*a)->soap_in(soap, tag, NULL))\n\t\t\treturn NULL;"); } else { fprintf(fout, "\n\t\tsoap_default_%s(soap, a->get());", c_ident(n)); fprintf(fout, "\n\t\tif (!soap_in_%s(soap, tag, a->get(), \"%s\"))\n\t\t\treturn NULL;", c_ident(n), xsi_type(n)); } fprintf(fout, "\n\t}\n\telse\n\t{"); fprintf(fout, "\tif (!soap_id_forward(soap, soap->href, a, 0, %s, %s, sizeof(%s), %d, %s_finsert, %s_fbase))\n\t\t\treturn NULL;", soap_type(reftype(n)), soap_type(typ), c_type(reftype(n)), reflevel(n) + 1, prefix, prefix); /* reflevel + 1 since smart pointer accepts derived types */ fprintf(fout, "\n\t\tif (soap->body && soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); fprintf(fout, "\n\t}\n\treturn a;\n}"); } else if (c11flag && (!strcmp(typ->id->name, "std::deque") || !strcmp(typ->id->name, "std::list") || (!strcmp(typ->id->name, "std::vector") && !is_bool(n)))) /* use C++11 emplace_back */ { fprintf(fout, "\n\tshort soap_flag;"); fprintf(fout, "\n\tfor (soap_flag = 0;; soap_flag = 1)\n\t{"); fprintf(fout, "\n\t\tif (tag && *tag != '-')\n\t\t{\tif (soap_element_begin_in(soap, tag, 1, NULL))\n\t\t\t\tbreak;\n\t\t\tsoap_revert(soap);\n\t\t}"); fprintf(fout, "\n\t\tif (!a && !(a = soap_new_%s(soap)))\n\t\t\treturn NULL;", c_ident(typ)); if (!strcmp(typ->id->name, "std::vector") && !is_primitive(n) && n->type != Tpointer) { fprintf(fout, "\n\t\tif (!a->empty() && a->size() == a->capacity())\n\t\t{\tconst void *p = &a->front();"); fprintf(fout, "\n\t\t\ta->emplace_back();"); fprintf(fout, "\n\t\t\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"Vector capacity increased to %%lu to fit %%lu items: updating pointers\\n\", a->capacity(), a->size()));"); fprintf(fout, "\n\t\t\tsoap_update_pointers(soap, (const char*)&a->front(), (const char*)p, (a->size() - 1) * sizeof(%s));", c_type(n)); fprintf(fout, "\n\t\t}\n\t\telse\n\t\t{\ta->emplace_back();\n\t\t}"); fprintf(fout, "\n\t\t%s *n = &a->back();\n\t\t", c_type(n)); } else { fprintf(fout, "\n\t\ta->emplace_back();\n\t\t%s *n = &a->back();\n\t\t", c_type(n)); } if (n->type == Tpointer) fprintf(fout, "*n = NULL;"); else if (n->type == Tarray) fprintf(fout, "soap_default_%s(soap, n);", c_ident(n)); else if (n->type == Tclass && !is_external(n) && !is_volatile(n) && !is_typedef(n)) fprintf(fout, "n->soap_default(soap);"); else if (n->type != Tfun && !is_void(n) && !is_XML(n)) fprintf(fout, "soap_default_%s(soap, n);", c_ident(n)); if (!is_primitive(n) && n->type != Tpointer) fprintf(fout, "\n\t\tshort soap_shaky = soap_begin_shaky(soap);"); fprintf(fout, "\n\t\tif (tag && *tag != '-' && (*soap->id || *soap->href))\n\t\t{\tif ("); fprintf(fout, "!soap_id_forward(soap, *soap->id?soap->id:soap->href, a, (size_t)a->size() - 1, %s, %s, sizeof(%s), %d, %s_finsert, %s_fbase))\n\t\t\t\tbreak;\n\t\t\tif (", soap_type(reftype(n)), soap_type(typ), c_type(reftype(n)), reflevel(n), prefix, prefix); if (is_XML(n) && is_string(n)) fprintf(fout, "!soap_inliteral(soap, tag, NULL)"); else if (is_XML(n) && is_wstring(n)) fprintf(fout, "!soap_inwliteral(soap, tag, NULL)"); else if (n->type == Tarray) fprintf(fout, "!soap_in_%s(soap, tag, NULL, \"%s\")", c_ident(n), xsi_type(n)); else fprintf(fout, "!soap_in_%s(soap, tag, NULL, \"%s\")", c_ident(n), xsi_type(n)); fprintf(fout, ")\n\t\t\t\tbreak;\n\t\t}\n\t\telse\n\t\t{\t"); if (is_XML(n) && is_string(n)) fprintf(fout, "if (!soap_inliteral(soap, tag, n))"); else if (is_XML(n) && is_wstring(n)) fprintf(fout, "if (!soap_inwliteral(soap, tag, n))"); else if (n->type == Tarray) fprintf(fout, "if (!soap_in_%s(soap, tag, n, \"%s\"))", c_ident(n), xsi_type(n)); else fprintf(fout, "if (!soap_in_%s(soap, tag, n, \"%s\"))", c_ident(n), xsi_type(n)); fprintf(fout, "\n\t\t\t{\ta->pop_back();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}"); if (!is_primitive(n) && n->type != Tpointer) fprintf(fout, "\n\t\tsoap_end_shaky(soap, soap_shaky);"); fprintf(fout, "\n\t\tif (!tag || *tag == '-')\n\t\t\treturn a;\n\t}\n\tif (soap_flag && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))\n\t{\tsoap->error = SOAP_OK;\n\t\treturn a;\n\t}\n\treturn NULL;\n}"); } else { fprintf(fout, "\n\tshort soap_flag;"); fprintf(fout, "\n\tfor (soap_flag = 0;; soap_flag = 1)\n\t{"); fprintf(fout, "\n\t\tif (tag && *tag != '-')\n\t\t{\tif (soap_element_begin_in(soap, tag, 1, NULL))\n\t\t\t\tbreak;\n\t\t\tsoap_revert(soap);\n\t\t}"); fprintf(fout, "\n\t\tif (!a && !(a = soap_new_%s(soap)))\n\t\t\treturn NULL;", c_ident(typ)); fprintf(fout, "\n\t\t%s;\n\t\t", c_type_id(n, "n")); if (n->type == Tpointer) fprintf(fout, "n = NULL;"); else if (n->type == Tarray) fprintf(fout, "soap_default_%s(soap, &n);", c_ident(n)); else if (n->type == Tclass && !is_external(n) && !is_volatile(n) && !is_typedef(n)) fprintf(fout, "n.soap_default(soap);"); else if (n->type != Tfun && !is_void(n) && !is_XML(n)) fprintf(fout, "soap_default_%s(soap, &n);", c_ident(n)); if (!is_primitive(n) && n->type != Tpointer) fprintf(fout, "\n\t\tshort soap_shaky = soap_begin_shaky(soap);"); fprintf(fout, "\n\t\tif (tag && *tag != '-' && (*soap->id || *soap->href))\n\t\t{\tif ("); fprintf(fout, "!soap_id_forward(soap, *soap->id?soap->id:soap->href, a, (size_t)a->size(), %s, %s, sizeof(%s), %d, %s_finsert, %s_fbase))\n\t\t\t\tbreak;\n\t\t\tif (", soap_type(reftype(n)), soap_type(typ), c_type(reftype(n)), reflevel(n), prefix, prefix); if (is_XML(n) && is_string(n)) fprintf(fout, "!soap_inliteral(soap, tag, NULL)"); else if (is_XML(n) && is_wstring(n)) fprintf(fout, "!soap_inwliteral(soap, tag, NULL)"); else if (n->type == Tarray) fprintf(fout, "!soap_in_%s(soap, tag, NULL, \"%s\")", c_ident(n), xsi_type(n)); else fprintf(fout, "!soap_in_%s(soap, tag, NULL, \"%s\")", c_ident(n), xsi_type(n)); fprintf(fout, ")\n\t\t\t\tbreak;\n\t\t}\n\t\telse\n\t\t{\t"); if (is_XML(n) && is_string(n)) fprintf(fout, "if (!soap_inliteral(soap, tag, &n))"); else if (is_XML(n) && is_wstring(n)) fprintf(fout, "if (!soap_inwliteral(soap, tag, &n))"); else if (n->type == Tarray) fprintf(fout, "if (!soap_in_%s(soap, tag, &n, \"%s\"))", c_ident(n), xsi_type(n)); else fprintf(fout, "if (!soap_in_%s(soap, tag, &n, \"%s\"))", c_ident(n), xsi_type(n)); fprintf(fout, "\n\t\t\t\tbreak;\n\t\t}"); if (!is_primitive(n) && n->type != Tpointer) fprintf(fout, "\n\t\tsoap_end_shaky(soap, soap_shaky);"); if (!(!strcmp(typ->id->name, "std::list") || !strcmp(typ->id->name, "std::deque") || !strcmp(typ->id->name, "std::set")) && !is_primitive(n) && n->type != Tpointer) { fprintf(fout, "\n\t\tif (a->size())\n\t\t{\tconst void *p = &*a->begin();\n\t\t\tsoap_update_pointers(soap, (const char*)&(*a->insert(a->end(), n)), (const char*)&n, sizeof(%s));", c_type(n)); fprintf(fout, "\n\t\t\tif (p != &*a->begin())\n\t\t\t{\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"Container capacity increased: updating pointers\\n\"));"); fprintf(fout, "\n\t\t\t\tsoap_update_pointers(soap, (const char*)&*a->begin(), (const char*)p, (a->size() - 1) * sizeof(%s));\n\t\t\t}", c_type(n)); fprintf(fout, "\n\t\t}\n\t\telse\n\t\t{\tsoap_update_pointers(soap, (const char*)&(*a->insert(a->end(), n)), (const char*)&n, sizeof(%s));", c_type(n)); fprintf(fout, "\n\t\t}"); } else { if (is_primitive(n) || n->type == Tpointer) fprintf(fout, "\n\t\ta->insert(a->end(), n);"); else fprintf(fout, "\n\t\tsoap_update_pointers(soap, (const char*)&(*a->insert(a->end(), n)), (const char*)&n, sizeof(%s));", c_type(n)); } fprintf(fout, "\n\t\tif (!tag || *tag == '-')\n\t\t\treturn a;\n\t}\n\tif (soap_flag && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))\n\t{\tsoap->error = SOAP_OK;\n\t\treturn a;\n\t}\n\treturn NULL;\n}"); } break; default: break; } fflush(fout); } void soap_in_Darray(Tnode *typ) { int i, j, d; Entry *p; Table *t, *table; const char *nsa = ns_qualifiedAttribute(typ); table=(Table *)typ->ref; p = is_dynamic_array(typ); d = get_Darraydims(typ); if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 %s SOAP_FMAC2 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*")); if (typ->type == Tclass && !is_volatile(typ) && !is_typedef(typ)) { fprintf(fout, "\n\nvoid *%s::soap_in(struct soap *soap, const char *tag, const char *type)", c_type(typ)); fprintf(fout, "\n{\treturn soap_in_%s(soap, tag, this, type);\n}", c_ident(typ)); } fflush(fout); fprintf(fout, "\n\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, %s, const char *type)", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*a")); if (is_binary(typ)) fprintf(fout, "\n{"); else if (d) fprintf(fout, "\n{\tsize_t i, n;\n\tint j;\n\t%s;", c_type_id(p->info.typ, "p")); else fprintf(fout, "\n{\tint i, j;\n\t%s;", c_type_id(p->info.typ, "p")); fprintf(fout, "\n\tif (soap_element_begin_in(soap, tag, 1, NULL))\n\t\treturn NULL;"); if (is_hexBinary(typ)) fprintf(fout, "\n\tif (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, \":hexBinary\"))"); else if (is_binary(typ)) fprintf(fout, "\n\tif (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, \":base64Binary\") && soap_match_tag(soap, soap->type, \":base64\"))"); else if (has_ns(typ) || is_untyped(typ)) fprintf(fout, "\n\tif (*soap->type && soap_match_array(soap, \"%s\") && soap_match_tag(soap, soap->type, type))", xsi_type((Tnode*)p->info.typ->ref)); else fprintf(fout, "\n\tif (soap_match_array(soap, type))"); fprintf(fout, "\n\t{\tsoap->error = SOAP_TYPE;\n\t\treturn NULL;\n\t}"); if (typ->type == Tclass) { fprintf(fout, "\n\ta = (%s)soap_id_enter(soap, soap->id, a, %s, sizeof(%s), soap->type, soap->arrayType, %s_instantiate, %s_fbase);", c_type_id(typ, "*"), soap_type(typ), c_type(typ), prefix, prefix); fprintf(fout, "\n\tif (!a)\n\t\treturn NULL;"); fprintf(fout, "\n\ta->soap_default(soap);"); for (t = (Table*)typ->ref; t; t = t->prev) { for (p = t->list; p; p = p->next) if (p->info.sto & Sattribute) soap_attr_value(p, ptr_cast(t, "a"), ident(p->sym->name), ns_add(p, nsa)); } } else { fprintf(fout, "\n\ta = (%s)soap_id_enter(soap, soap->id, a, %s, sizeof(%s), NULL, NULL, NULL, NULL);", c_type_id(typ, "*"), soap_type(typ), c_type(typ)); fprintf(fout, "\n\tif (!a)\n\t\treturn NULL;"); fprintf(fout, "\n\tsoap_default_%s(soap, a);", c_ident(typ)); for (t = (Table*)typ->ref; t; t = t->prev) { for (p = t->list; p; p = p->next) if (p->info.sto & Sattribute) soap_attr_value(p, "a", ident(p->sym->name), ns_add(p, nsa)); } } fprintf(fout, "\n\tif (soap->body && !*soap->href)\n\t{"); p = is_dynamic_array(typ); if (is_binary(typ)) { if (is_hexBinary(typ)) fprintf(fout, "\n\t\ta->__ptr = soap_gethex(soap, &a->__size);"); else { fprintf(fout, "\n\t\ta->__ptr = soap_getbase64(soap, &a->__size, 0);"); if (is_attachment(typ)) fprintf(fout, "\n#ifndef WITH_LEANER\n\t\tif (soap_xop_forward(soap, &a->__ptr, &a->__size, &a->id, &a->type, &a->options))\n\t\t\treturn NULL;\n#endif"); } fprintf(fout, "\n\t\tif ((!a->__ptr && soap->error) || soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); } else { fprintf(fout, "\n\t\tif (*soap->arraySize)\n\t\t{"); if (d) { fprintf(fout, "\n\t\t\tn = soap_getsizes(soap->arraySize, a->__size, %d);", d); if (has_offset(typ)) fprintf(fout, "\n\t\t\tn -= j = soap_getoffsets(soap->arrayOffset, a->__size, a->__offset, %d);", d); else fprintf(fout, "\n\t\t\tn -= j = soap_getoffsets(soap->arrayOffset, a->__size, NULL, %d);", d); if (p->info.minOccurs > 0) fprintf(fout, "\n\t\t\tif (%sn < " SOAP_LONG_FORMAT ")\n\t\t\t{\tsoap->error = SOAP_OCCURS;\n\t\t\t\treturn NULL;\n\t\t\t}", strict_check(), p->info.minOccurs); if (p->info.maxOccurs > 1) fprintf(fout, "\n\t\t\t\tif (%sn > " SOAP_LONG_FORMAT ")\n\t\t\t{\tsoap->error = SOAP_OCCURS;\n\t\t\t\treturn NULL;\n\t\t\t}", strict_check(), p->info.maxOccurs); else fprintf(fout, "\n\t\t\tif (n > SOAP_MAXARRAYSIZE)\n\t\t\t{\tsoap->error = SOAP_OCCURS;\n\t\t\t\treturn NULL;\n\t\t\t}"); if (((Tnode*)p->info.typ->ref)->type == Tclass || (((Tnode*)p->info.typ->ref)->type == Tstruct && !cflag)) { fprintf(fout, "\n\t\t\ta->%s = soap_new_%s(soap, n);", ident(p->sym->name), c_ident((Tnode*)p->info.typ->ref)); if (!is_external((Tnode*)p->info.typ->ref) && !is_volatile((Tnode*)p->info.typ->ref) && !is_typedef((Tnode*)p->info.typ->ref) && ((Tnode*)p->info.typ->ref)->type == Tclass) fprintf(fout, "\n\t\t\tfor (i = 0; i < n; i++)\n\t\t\t\t(a->%s+i)->%s::soap_default(soap);", ident(p->sym->name), c_type((Tnode*)p->info.typ->ref)); else if (((Tnode*)p->info.typ->ref)->type == Tpointer) fprintf(fout, "\n\t\t\tfor (i = 0; i < n; i++)\n\t\t\t\tsoap_default_%s(soap, a->%s+i);", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name)); } else if (has_class((Tnode*)p->info.typ->ref)) { fprintf(fout, "\n\t\t\ta->%s = soap_new_%s(soap, n);", ident(p->sym->name), c_ident((Tnode*)p->info.typ->ref)); fprintf(fout, "\n\t\t\tfor (i = 0; i < n; i++)\n\t\t\t\tsoap_default_%s(soap, a->%s+i);", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name)); } else { fprintf(fout, "\n\t\t\ta->%s = (%s)soap_malloc(soap, n * sizeof(%s));", ident(p->sym->name), c_type_id((Tnode*)p->info.typ->ref, "*"), c_type((Tnode*)p->info.typ->ref)); if (((Tnode*)p->info.typ->ref)->type == Tpointer) fprintf(fout, "\n\t\t\tfor (i = 0; i < n; i++)\n\t\t\t\ta->%s[i] = NULL;", ident(p->sym->name)); else if (!is_XML((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\tfor (i = 0; i < n; i++)\n\t\t\t\tsoap_default_%s(soap, a->%s+i);", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name)); } fprintf(fout, "\n\t\t\tfor (i = 0; i < n; i++)"); fprintf(fout, "\n\t\t\t{\tsoap_peek_element(soap);\n\t\t\t\tif (soap->position == %d)", d); fprintf(fout, "\n\t\t\t\t{\ti = (size_t)("); for (i = 0; i < d; i++) { fprintf(fout, "soap->positions[%d]", i); for (j = 1; j < d-i; j++) fprintf(fout, "*a->__size[%d]", j); if (i < d-1) fprintf(fout, "+"); } fprintf(fout, "-j);"); fprintf(fout, "\n\t\t\t\t\tif (i >= n)\n\t\t\t\t\t{\tsoap->error = SOAP_IOB;\n\t\t\t\t\t\treturn NULL;\n\t\t\t\t\t}\n\t\t\t\t}"); fprintf(fout, "\n\t\t\t\tif (!soap_in_%s(soap, NULL, a->%s + i, \"%s\"))", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name), xsi_type((Tnode*)p->info.typ->ref)); fprintf(fout, "\n\t\t\t\t{\tif (soap->error != SOAP_NO_TAG)\n\t\t\t\t\t\treturn NULL;"); fprintf(fout, "\n\t\t\t\t\tsoap->error = SOAP_OK;"); fprintf(fout, "\n\t\t\t\t\tbreak;"); fprintf(fout, "\n\t\t\t\t}"); } else { fprintf(fout, "\n\t\t\tsoap_getsizes(soap->arraySize, &a->__size, 1);"); if (has_offset(typ)) fprintf(fout, "\n\t\t\ta->__size -= j = soap_getoffsets(soap->arrayOffset, &a->__size, &a->__offset, 1);"); else fprintf(fout, "\n\t\t\ta->__size -= j = soap_getoffsets(soap->arrayOffset, &a->__size, NULL, 1);"); if (p->info.minOccurs > 0) fprintf(fout, "\n\t\t\tif (%sa->__size < " SOAP_LONG_FORMAT ")\n\t\t\t{\tsoap->error = SOAP_OCCURS;\n\t\t\t\treturn NULL;\n\t\t\t}", strict_check(), p->info.minOccurs); if (p->info.maxOccurs > 1) fprintf(fout, "\n\t\t\tif (%sa->__size > " SOAP_LONG_FORMAT ")\n\t\t\t{\tsoap->error = SOAP_OCCURS;\n\t\t\t\treturn NULL;\n\t\t\t}", strict_check(), p->info.maxOccurs); else fprintf(fout, "\n\t\t\tif (a->__size > SOAP_MAXARRAYSIZE)\n\t\t\t{\tsoap->error = SOAP_OCCURS;\n\t\t\t\treturn NULL;\n\t\t\t}"); if (((Tnode*)p->info.typ->ref)->type == Tclass || (((Tnode*)p->info.typ->ref)->type == Tstruct && !cflag)) { fprintf(fout, "\n\t\t\ta->%s = soap_new_%s(soap, a->__size);", ident(p->sym->name), c_ident((Tnode*)p->info.typ->ref)); if (!is_external((Tnode*)p->info.typ->ref) && !is_volatile((Tnode*)p->info.typ->ref) && !is_typedef((Tnode*)p->info.typ->ref) && ((Tnode*)p->info.typ->ref)->type == Tclass) fprintf(fout, "\n\t\t\tfor (i = 0; i < a->__size; i++)\n\t\t\t\t(a->%s+i)->%s::soap_default(soap);", ident(p->sym->name), c_type((Tnode*)p->info.typ->ref)); else fprintf(fout, "\n\t\t\tfor (i = 0; i < a->__size; i++)\n\t\t\t\tsoap_default_%s(soap, a->%s+i);", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name)); } else if (has_class((Tnode*)p->info.typ->ref)) { fprintf(fout, "\n\t\t\ta->%s = soap_new_%s(soap, a->__size);", ident(p->sym->name), c_ident((Tnode*)p->info.typ->ref)); fprintf(fout, "\n\t\t\tfor (i = 0; i < a->__size; i++)\n\t\t\t\tsoap_default_%s(soap, a->%s+i);", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name)); } else { fprintf(fout, "\n\t\t\ta->%s = (%s)soap_malloc(soap, sizeof(%s) * a->__size);", ident(p->sym->name), c_type_id((Tnode*)p->info.typ->ref, "*"), c_type((Tnode*)p->info.typ->ref)); if (((Tnode*)p->info.typ->ref)->type == Tpointer) fprintf(fout, "\n\t\t\tfor (i = 0; i < a->__size; i++)\n\t\t\t\ta->%s[i] = NULL;", ident(p->sym->name)); else if (!is_XML((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\tfor (i = 0; i < a->__size; i++)\n\t\t\t\tsoap_default_%s(soap, a->%s+i);", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name)); } fprintf(fout, "\n\t\t\tfor (i = 0; i < a->__size; i++)"); fprintf(fout, "\n\t\t\t{\tsoap_peek_element(soap);\n\t\t\t\tif (soap->position)\n\t\t\t\t{\ti = soap->positions[0]-j;\n\t\t\t\t\tif (i < 0 || i >= a->__size)\n\t\t\t\t\t{\tsoap->error = SOAP_IOB;\n\t\t\t\t\t\treturn NULL;\n\t\t\t\t\t}\n\t\t\t\t}"); if (is_XML((Tnode*)p->info.typ->ref) && is_string((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (!soap_inliteral(soap, NULL, (char**)(a->%s + i)))", ident(p->sym->name)); else if (is_XML((Tnode*)p->info.typ->ref) && is_wstring((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (!soap_inwliteral(soap, NULL, (wchar_t**)(a->%s + i)))", ident(p->sym->name)); else if (is_string((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (!soap_in_%s(soap, NULL, (char**)(a->%s + i), \"%s\"))", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name), xsi_type((Tnode*)p->info.typ->ref)); else if (is_wstring((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (!soap_in_%s(soap, NULL, (wchar_t**)(a->%s + i), \"%s\"))", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name), xsi_type((Tnode*)p->info.typ->ref)); else fprintf(fout, "\n\t\t\t\tif (!soap_in_%s(soap, NULL, a->%s + i, \"%s\"))", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name), xsi_type((Tnode*)p->info.typ->ref)); fprintf(fout, "\n\t\t\t\t{\tif (soap->error != SOAP_NO_TAG)\n\t\t\t\t\t\treturn NULL;"); fprintf(fout, "\n\t\t\t\t\tsoap->error = SOAP_OK;"); fprintf(fout, "\n\t\t\t\t\tbreak;"); fprintf(fout, "\n\t\t\t\t}"); } fprintf(fout, "\n\t\t\t}\n\t\t}\n\t\telse"); fprintf(fout, "\n\t\t{\tif (soap_new_block(soap) == NULL)\n\t\t\t\treturn NULL;"); if (p->info.maxOccurs > 1) { if (d) { for (i = 1; i < d; i++) fprintf(fout, "\n\t\t\ta->__size[%d] = 1;", i); fprintf(fout, "\n\t\t\tfor (a->__size[0] = 0; a->__size[0] <= " SOAP_LONG_FORMAT "; a->__size[0]++)", p->info.maxOccurs); } else fprintf(fout, "\n\t\t\tfor (a->__size = 0; a->__size <= " SOAP_LONG_FORMAT "; a->__size++)", p->info.maxOccurs); } else { if (d) { for (i = 1; i < d; i++) fprintf(fout, "\n\t\t\ta->__size[%d] = 1;", i); fprintf(fout, "\n\t\t\tfor (a->__size[0] = 0; a->__size[0] < SOAP_MAXARRAYSIZE; a->__size[0]++)"); } else fprintf(fout, "\n\t\t\tfor (a->__size = 0; a->__size < SOAP_MAXARRAYSIZE; a->__size++)"); } if (((Tnode*)p->info.typ->ref)->type == Tclass || has_class((Tnode*)p->info.typ->ref) || (!cflag && ((Tnode*)p->info.typ->ref)->type == Tstruct)) fprintf(fout, "\n\t\t\t{\tp = soap_block<%s>::push(soap, NULL);\n\t\t\t\tif (!p)\n\t\t\t\t\tbreak;", c_type((Tnode*)p->info.typ->ref)); else fprintf(fout, "\n\t\t\t{\tp = (%s)soap_push_block(soap, NULL, sizeof(%s));\n\t\t\t\tif (!p)\n\t\t\t\t\tbreak;", c_type(p->info.typ), c_type((Tnode*)p->info.typ->ref)); if (((Tnode*)p->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->info.typ->ref) && !is_volatile((Tnode*)p->info.typ->ref) && !is_typedef((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\t\tp->soap_default(soap);"); else if (((Tnode*)p->info.typ->ref)->type == Tpointer) fprintf(fout, "\n\t\t\t\t*p = NULL;"); else if (!is_XML((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\t\tsoap_default_%s(soap, p);", c_ident((Tnode*)p->info.typ->ref)); if (is_XML((Tnode*)p->info.typ->ref) && is_string((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (!soap_inliteral(soap, NULL, p))"); else if (is_XML((Tnode*)p->info.typ->ref) && is_wstring((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (!soap_inwliteral(soap, NULL, p))"); else fprintf(fout, "\n\t\t\t\tif (!soap_in_%s(soap, NULL, p, \"%s\"))", c_ident((Tnode*)p->info.typ->ref), xsi_type((Tnode*)p->info.typ->ref)); fprintf(fout, "\n\t\t\t\t{\tif (soap->error == SOAP_NO_TAG)"); fprintf(fout, "\n\t\t\t\t\t\tsoap->error = SOAP_OK;"); fprintf(fout, "\n\t\t\t\t\tbreak;"); fprintf(fout, "\n\t\t\t\t}"); fprintf(fout, "\n\t\t\t}"); if (((Tnode*)p->info.typ->ref)->type == Tclass || has_class((Tnode*)p->info.typ->ref) || (!cflag && ((Tnode*)p->info.typ->ref)->type == Tstruct)) fprintf(fout, "\n\t\t\tsoap_block<%s>::pop(soap, NULL);", c_type((Tnode*)p->info.typ->ref)); else fprintf(fout, "\n\t\t\tsoap_pop_block(soap, NULL);"); if (p->info.minOccurs > 0) fprintf(fout, "\n\t\t\tif (%sa->__size < " SOAP_LONG_FORMAT ")\n\t\t\t{\tsoap->error = SOAP_OCCURS;\n\t\t\t\treturn NULL;\n\t\t\t}", strict_check(), p->info.minOccurs); if (p->info.maxOccurs > 1) fprintf(fout, "\n\t\t\tif (%sa->__size > " SOAP_LONG_FORMAT ")\n\t\t\t{\tsoap->error = SOAP_OCCURS;\n\t\t\t\treturn NULL;\n\t\t\t}", strict_check(), p->info.maxOccurs); if (((Tnode*)p->info.typ->ref)->type == Tclass || has_class((Tnode*)p->info.typ->ref) || (((Tnode*)p->info.typ->ref)->type == Tstruct && !cflag)) { fprintf(fout, "\n\t\t\tif (soap->blist->size)\n\t\t\t\ta->%s = soap_new_%s(soap, soap->blist->size/sizeof(%s));\n\t\t\telse\n\t\t\t\ta->%s = NULL;", ident(p->sym->name), c_ident((Tnode*)p->info.typ->ref), c_type((Tnode*)p->info.typ->ref), ident(p->sym->name)); fprintf(fout, "\n\t\t\tif (a->%s)\n\t\t\t\tsoap_block<%s>::save(soap, NULL, a->%s);\n\t\t\telse\n\t\t\t\tsoap_block<%s>::end(soap, NULL);", ident(p->sym->name), c_type((Tnode*)p->info.typ->ref), ident(p->sym->name), c_type((Tnode*)p->info.typ->ref)); } else fprintf(fout, "\n\t\t\ta->%s = (%s)soap_save_block(soap, NULL, NULL, 1);", ident(p->sym->name), c_type(p->info.typ)); fprintf(fout, "\n\t\t}"); fprintf(fout, "\n\t\tif (soap->error || soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); } if (has_getter(typ)) fprintf(fout, "\n\t\tif (a->get(soap))\n\t\t\treturn NULL;"); fprintf(fout, "\n\t}\n\telse\n\t{\t"); if (is_attachment(typ)) fprintf(fout, "\n#ifndef WITH_LEANER\n\t\tif (*soap->href != '#')\n\t\t{\tif (soap_attachment_forward(soap, &a->__ptr, &a->__size, &a->id, &a->type, &a->options))\n\t\t\t\treturn NULL;\n\t\t}\n\t\telse\n#endif\n\t\t\t"); if (typ->type == Tclass || (!cflag && typ->type == Tstruct)) fprintf(fout, "a = (%s)soap_id_forward(soap, soap->href, (void*)a, 0, %s, %s, sizeof(%s), 0, %s_finsert, %s_fbase);", c_type_id(typ, "*"), soap_type(typ), soap_type(typ), c_type(typ), prefix, prefix); else fprintf(fout, "a = (%s)soap_id_forward(soap, soap->href, (void*)a, 0, %s, %s, sizeof(%s), 0, NULL, NULL);", c_type_id(typ, "*"), soap_type(typ), soap_type(typ), c_type(typ)); fprintf(fout, "\n\t\tif (soap->body && soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); fprintf(fout, "\n\t}"); fprintf(fout, "\n\treturn a;\n}"); } const char * cstring(const char *s, int q) { size_t n; char *t; const char *r; for (n = 0, r = s; *r; n++, r++) { if (*r == '"' || *r == '\\') n++; else if (*r < 32) n += 3; } r = t = (char*)emalloc(n + 2*q + 1); if (q) *t++ = '"'; for (; *s; s++) { if (*s == '"' || *s == '\\') { *t++ = '\\'; *t++ = *s; } else if (*s < 32) { sprintf(t, "\\%03o", (unsigned int)(unsigned char)*s); t += 4; } else *t++ = *s; } if (q) *t++ = '"'; *t = '\0'; return r; } const char * xstring(const char *s) { size_t n; char *t; const char *r; for (n = 0, r = s; *r; n++, r++) { if (*r < 32 || *r >= 127) n += 4; else if (*r == '<' || *r == '>') n += 3; else if (*r == '&') n += 4; else if (*r == '"') n += 5; else if (*r == '\\') n += 1; } r = t = (char*)emalloc(n + 1); for (; *s; s++) { if (*s < 32 || *s >= 127) { sprintf(t, "&#%.2x;", (unsigned char)*s); t += 5; } else if (*s == '<') { strcpy(t, "<"); t += 4; } else if (*s == '>') { strcpy(t, ">"); t += 4; } else if (*s == '&') { strcpy(t, "&"); t += 5; } else if (*s == '"') { strcpy(t, """); t += 6; } else if (*s == '\\') { strcpy(t, "\\\\"); t += 2; } else *t++ = *s; } *t = '\0'; return r; } gsoap-2.8.28/gsoap/VisualStudio2005/soapcpp2/soapcpp2.sln0000755000175000017500000000157612653650160022353 0ustar ellertellert Microsoft Visual Studio Solution File, Format Version 9.00 # Visual C++ Express 2005 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "soapcpp2", "soapcpp2\soapcpp2.vcproj", "{BDD1B293-CE39-4BEC-8E63-8B1621F3EB56}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Release|Win32 = Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {BDD1B293-CE39-4BEC-8E63-8B1621F3EB56}.Debug|Win32.ActiveCfg = Debug|Win32 {BDD1B293-CE39-4BEC-8E63-8B1621F3EB56}.Debug|Win32.Build.0 = Debug|Win32 {BDD1B293-CE39-4BEC-8E63-8B1621F3EB56}.Release|Win32.ActiveCfg = Release|Win32 {BDD1B293-CE39-4BEC-8E63-8B1621F3EB56}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal gsoap-2.8.28/gsoap/VisualStudio2005/soapcpp2/debug/0000755000175000017500000000000012653650160021160 5ustar ellertellertgsoap-2.8.28/gsoap/VisualStudio2005/soapcpp2/release/0000755000175000017500000000000012653650160021512 5ustar ellertellertgsoap-2.8.28/gsoap/VisualStudio2005/README.html0000644000175000017500000000610612653650160020171 0ustar ellertellert

Flex and Bison for Windows

Visual Studio 2005 Solution files for soapcpp2 and wsdl2h are included.

If not already installed, install the Platform SDK (R2) for winsock2.h.

To build soapcpp2.exe, first install Bison and Flex (in the default dirs):

then add the FlexBison.rules as explained here:

http://msdn2.microsoft.com/en-us/library/aa730877(VS.80).aspx

These custom-build rules are used to build the scanner and parser for soapcpp2.exe.

To build wsdl2h.exe, you first need to build soapcpp2.exe and install it in Program Files or copy it to the wsdl directory. This is needed to execute the custom-build step on wsdl.h to generate wsdlStub.h, wsdlH.h, and wsdlC.cpp.

Build Rules for soapcpp2.exe VS 2008 and 2010

To build soapcpp2.exe you need to install Flex and Bison. To do so, you need to create custom build rules to compile .l and .y files with Flex and Bison.

Please see:

http://msdn.microsoft.com/en-us/library/aa730877(VS.80).aspx#vccustombr_topic3

In VS2008, there is UI available to help you create the custom build rule.

Make sure you have flex.exe, bison.exe, and m4.exe on the system search path.

  • Right click on the .l file and select properties
  • Configuration -> All Configurations
  • General -> Item Typ e-> Custom Build Tool
  • Apply
  • Custom Build Tool -> General -> Command Line -> flex -olexer.c lexer.l
  • Custom Build Tool -> General -> Outputs -> lexer.c
  • Custom Build Tool -> General -> Additional Dependencies -> parser.y parser.c
  • Apply
  • Select the .y file in the solution explorer
  • Configuration -> All Configurations
  • General -> Item Type -> Custom Build Tool
  • Apply
  • Custom Build Tool -> General -> Command Line -> bison -oparser.c parser.y
  • Custom Build Tool -> General -> Outputs -> parser.c parser.h

In VS2010, there may not be a UI available to create the custom build rules. To add or modify build rules in VS2010 you need to edit:

%ProgramFiles%\MSBuild\Microsoft.Cpp\v4.0\BuildCustomizations

and/or

%ProgramFiles(x86)%\MSBuild\Microsoft.Cpp\v4.0\BuildCustomizations

gsoap-2.8.28/gsoap/VisualStudio2005/wsdl2h/0000755000175000017500000000000012653650160017546 5ustar ellertellertgsoap-2.8.28/gsoap/VisualStudio2005/wsdl2h/wsdl2h.sln0000755000175000017500000000157012653650160021475 0ustar ellertellert Microsoft Visual Studio Solution File, Format Version 9.00 # Visual C++ Express 2005 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "wsdl2h", "wsdl2h\wsdl2h.vcproj", "{6CBC554A-4FFB-461F-91D4-11B358802815}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Release|Win32 = Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {6CBC554A-4FFB-461F-91D4-11B358802815}.Debug|Win32.ActiveCfg = Debug|Win32 {6CBC554A-4FFB-461F-91D4-11B358802815}.Debug|Win32.Build.0 = Debug|Win32 {6CBC554A-4FFB-461F-91D4-11B358802815}.Release|Win32.ActiveCfg = Release|Win32 {6CBC554A-4FFB-461F-91D4-11B358802815}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal gsoap-2.8.28/gsoap/VisualStudio2005/wsdl2h/wsdl2h/0000755000175000017500000000000012654077574020766 5ustar ellertellertgsoap-2.8.28/gsoap/VisualStudio2005/wsdl2h/wsdl2h/imports.h0000644000175000017500000000326612653650160022626 0ustar ellertellert/* imports.h Common XSD types and externs for gSOAP header file import -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #import "stlvector.h" typedef char *xsd__anyURI, *xsd__ID, *xsd__NCName, *xsd__NMTOKEN, *xsd__NMTOKENS, *xsd__QName, *xsd__string; typedef bool xsd__boolean; extern class ostream; extern class istream; #include "includes.h" extern class SetOfString; gsoap-2.8.28/gsoap/VisualStudio2005/wsdl2h/wsdl2h/gwsdl.h0000644000175000017500000000505212653650160022244 0ustar ellertellert/* gwsdl.h OGSI GWSDL binding schema interface -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap gwsdl schema documentation: OGSI GWSDL binding schema //gsoap gwsdl schema namespace: http://www.gridforum.org/namespaces/2003/03/gridWSDLExtensions //gsoap sd schema namespace: http://www.gridforum.org/namespaces/2003/03/serviceData #import "schema.h" class wsdl__operation; enum sd__mutability { static_, constant, extendable, mutable_ }; class sd__serviceData { public: @xsd__NMTOKEN name; @xsd__QName type; @xsd__boolean nillable = false; @xsd__string minOccurs; // xsd:nonNegativeInteger @xsd__string maxOccurs; // xsd:nonNegativeInteger|unbounded @enum sd__mutability mutability = extendable; @xsd__boolean modifiable = false; /* has any content */ public: }; class sd__staticServiceDataValues { public: int __type; /* any content, probably should use DOM */ void* _any; }; class gwsdl__portType { public: @xsd__NMTOKEN name; @xsd__QName extends; // a list of QNames xsd__string documentation; // ? std::vector operation; // * std::vector sd__serviceData_; sd__staticServiceDataValues *sd__staticServiceDataValues_; public: }; gsoap-2.8.28/gsoap/VisualStudio2005/wsdl2h/wsdl2h/bpel.h0000644000175000017500000000630312653650160022046 0ustar ellertellert/* bpel.h BPEL 2.0 binding schema -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2014, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #import "imports.h" //gsoap plnk schema documentation: Partner Link Type Schema for WS-BPEL 2.0 //gsoap plnk schema namespace: http://docs.oasis-open.org/wsbpel/2.0/plnktype //gsoap plnk schema elementForm: qualified //gsoap plnk schema attributeForm: unqualified //gsoap vprop schema documentation: Variable Properties Schema for WS-BPEL 2.0 //gsoap vprop schema namespace: http://docs.oasis-open.org/wsbpel/2.0/varprop //gsoap vprop schema elementForm: qualified //gsoap vprop schema attributeForm: unqualified class wsdl__definitions; class wsdl__portType; class plnk__tPartnerLinkType; class plnk__tRole { public: @xsd__NCName name; @xsd__QName portType; xsd__string documentation; private: wsdl__portType *portTypeRef; plnk__tPartnerLinkType *plnkRef; public: plnk__tRole(); int traverse(wsdl__definitions&); wsdl__portType *portTypePtr() const; void plnkPtr(plnk__tPartnerLinkType*); plnk__tPartnerLinkType *plnkPtr() const; }; class plnk__tPartnerLinkType { public: @xsd__NCName name; std::vector role; xsd__string documentation; public: int traverse(wsdl__definitions&); }; class vprop__tQuery { public: @xsd__anyURI queryLanguage = "urn:oasis:names:tc:wsbpel:2.0:sublang:xpath1.0"; xsd__QName __mixed; }; class vprop__tProperty { public: @xsd__NCName name; @xsd__QName type; @xsd__QName element; xsd__string documentation; public: int traverse(wsdl__definitions&); }; class vprop__tPropertyAlias { public: vprop__tQuery* query; @xsd__QName propertyName; @xsd__QName messageType; @xsd__NCName part; @xsd__QName type; @xsd__QName element; xsd__string documentation; private: vprop__tProperty *vpropRef; public: int traverse(wsdl__definitions&); vprop__tProperty *vpropPtr() const; }; gsoap-2.8.28/gsoap/VisualStudio2005/wsdl2h/wsdl2h/wsdl2h.vcproj0000755000175000017500000001451112653650160023406 0ustar ellertellert gsoap-2.8.28/gsoap/VisualStudio2005/wsdl2h/wsdl2h/wsdl.h0000644000175000017500000003713012653650160022077 0ustar ellertellert/* wsdl.h WSDL 1.1 and WSDL 2.0 schemas -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2014, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoapopt w //gsoap wsdl schema documentation: WSDL 1.1/2.0 binding schema //gsoap wsdl schema namespace: http://schemas.xmlsoap.org/wsdl/ //gsoap wsdl schema namespace2: http://www.w3.org/ns/wsdl //gsoap wsdl schema elementForm: qualified //gsoap wsdl schema attributeForm: unqualified #import "imports.h" #import "schema.h" #import "soap.h" #import "mime.h" #import "dime.h" #import "http.h" #import "gwsdl.h" #import "wsam.h" #import "wsp.h" #import "bpel.h" class wsdl__definitions; // forward declaration class wsdl__import { public: @xsd__anyURI namespace_; @xsd__anyURI location; private: wsdl__definitions *definitionsRef; public: wsdl__import(); int preprocess(wsdl__definitions&); int traverse(wsdl__definitions&); void definitionsPtr(wsdl__definitions*); wsdl__definitions *definitionsPtr() const; }; class wsdl__types : public xs__schema // WSDL 2.0 inlined schema { public: xsd__string documentation; // ? std::vector xs__schema_; // * public: int preprocess(wsdl__definitions&); int traverse(wsdl__definitions&); }; class wsdl__part { public: @xsd__NMTOKEN name; @xsd__QName element; @xsd__QName type; xsd__string documentation; // ? private: xs__element *elementRef; // traverse() finds element xs__simpleType *simpleTypeRef; // traverse() finds simpleType xs__complexType *complexTypeRef; // traverse() finds complexType public: wsdl__part(); int traverse(wsdl__definitions&); void elementPtr(xs__element*); void simpleTypePtr(xs__simpleType*); void complexTypePtr(xs__complexType*); xs__element *elementPtr() const; xs__simpleType *simpleTypePtr() const; xs__complexType *complexTypePtr() const; }; class wsdl__message { public: @xsd__NMTOKEN name; xsd__string documentation; // ? std::vector wsp__Policy_; // * std::vector wsp__PolicyReference_;// * std::vector part; // * public: int traverse(wsdl__definitions&); }; class wsdl__ioput { public: @xsd__NMTOKEN name; @xsd__QName message; @xsd__NMTOKEN messageLabel; // WSDL 2.0 @xsd__QName element; // WSDL 2.0 @xsd__anyURI wsa__Action; @xsd__anyURI wsam__Action; xsd__string documentation; // ? wsp__Policy *wsp__Policy_; // ? wsp__PolicyReference *wsp__PolicyReference_; // ? private: wsdl__message *messageRef; // traverse() finds message xs__element *elementRef; // traverse() finds element WSDL 2.0 public: wsdl__ioput(); int traverse(wsdl__definitions&); void messagePtr(wsdl__message*); wsdl__message *messagePtr() const; void elementPtr(xs__element*); xs__element *elementPtr() const; }; class wsdl__fault { public: @xsd__NMTOKEN name; @xsd__QName message; @xsd__QName ref; // WSDL 2.0 @xsd__NMTOKEN messageLabel; // WSDL 2.0 @xsd__QName element; // WSDL 2.0 @xsd__anyURI wsa__Action; @xsd__anyURI wsam__Action; xsd__string documentation; // ? wsp__Policy *wsp__Policy_; // ? wsp__PolicyReference *wsp__PolicyReference_; // ? private: wsdl__message *messageRef; // traverse() finds message xs__element *elementRef; // traverse() finds element WSDL 2.0 public: wsdl__fault(); int traverse(wsdl__definitions&); void messagePtr(wsdl__message*); wsdl__message *messagePtr() const; void elementPtr(xs__element*); xs__element *elementPtr() const; }; class wsdl__operation { public: @xsd__NMTOKEN name; @xsd__anyURI pattern; // WSDL 2.0 @xsd__anyURI style; // WSDL 2.0 @xsd__string wrpc__signature; // WSDL 2.0 @xsd__string parameterOrder; xsd__string documentation; // ? wsp__Policy *wsp__Policy_; // ? wsp__PolicyReference *wsp__PolicyReference_; // ? $int __union1; union wsdl__union_ioput // | { wsdl__ioput *input; wsdl__ioput *output; } __ioput1; $int __union2; union wsdl__union_ioput __ioput2; // | std::vector fault; // * std::vector infault; // * WSDL 2.0 std::vector outfault; // * WSDL 2.0 public: int traverse(wsdl__definitions&); }; class wsdl__portType // ... and WSDL 2.0 interface { public: @xsd__NMTOKEN name; @xsd__QName extends; // WSDL 2.0 @xsd__anyURI styleDefault; // WSDL 2.0 xsd__string documentation; // ? wsp__Policy *wsp__Policy_; // ? wsp__PolicyReference *wsp__PolicyReference_; // ? std::vector fault; // * WSDL 2.0 std::vector operation; // * private: wsdl__definitions *definitionsRef; public: wsdl__portType(); int traverse(wsdl__definitions&); void definitionsPtr(wsdl__definitions*); wsdl__definitions *definitionsPtr() const; }; class wsdl__ext_ioput // binding extensibility element { public: @xsd__NMTOKEN name; @xsd__NMTOKEN messageLabel; // WSDL 2.0 xsd__string documentation; // ? wsp__Policy *wsp__Policy_; // ? wsp__PolicyReference *wsp__PolicyReference_; // ? dime__message *dime__message_; // ? soap__body *soap__body_; // ? xsd__string http__urlEncoded; // ? mime__multipartRelated *mime__multipartRelated_;// ? mime__content *mime__content_; // ? mime__mimeXml *mime__mimeXml_; // ? std::vector soap__header_; // * std::vector wsoap__module_; // * WSDL 2.0 std::vector wsoap__header_; // * WSDL 2.0 std::vector whttp__header_; // * WSDL 2.0 public: int traverse(wsdl__definitions&); }; class wsdl__ext_fault // binding extensibility element { public: @xsd__NMTOKEN name; @xsd__QName ref; // WSDL 2.0 @xsd__NMTOKEN messageLabel; // WSDL 2.0 @xsd__QName wsoap__code; // WSDL 2.0 @xsd__QName wsoap__subcodes; // WSDL 2.0 xsd__string documentation; // ? wsp__Policy *wsp__Policy_; // ? wsp__PolicyReference *wsp__PolicyReference_; // ? soap__fault *soap__fault_; // ? std::vector wsoap__module_; // * WSDL 2.0 private: wsdl__fault *faultRef; public: wsdl__ext_fault(); int traverse(wsdl__definitions&, wsdl__portType*); void faultPtr(wsdl__fault*); wsdl__fault *faultPtr() const; }; class wsdl__ext_operation // binding extensibility element { public: @xsd__NMTOKEN name; @xsd__QName ref; // WSDL 2.0 @xsd__anyURI wsoap__mep; // WSDL 2.0 @xsd__anyURI wsoap__action; // WSDL 2.0 @xsd__string whttp__method; // WSDL 2.0 @xsd__string whttp__location; // WSDL 2.0 xsd__string documentation; // ? wsp__Policy *wsp__Policy_; // ? wsp__PolicyReference *wsp__PolicyReference_; // ? soap__operation *soap__operation_; // ? http__operation *http__operation_; // ? wsdl__ext_ioput *input; // ? wsdl__ext_ioput *output; // ? std::vector fault; // * std::vector infault; // * WSDL 2.0 std::vector outfault; // * WSDL 2.0 private: wsdl__operation *operationRef; // traverse() finds operation public: wsdl__ext_operation(); int traverse(wsdl__definitions&, wsdl__portType*); void operationPtr(wsdl__operation*); wsdl__operation *operationPtr() const; }; class wsdl__binding { public: @xsd__NMTOKEN name; @xsd__QName type; @xsd__anyURI type_; // WSDL 2.0 @xsd__QName interface_; // WSDL 2.0 @xsd__boolean whttp__cookies = false; // WSDL 2.0 @xsd__string wsoap__version; // WSDL 2.0 @xsd__anyURI wsoap__protocol; // WSDL 2.0 @xsd__anyURI wsoap__mepDefault; // WSDL 2.0 @xsd__string whttp__methodDefault; // WSDL 2.0 xsd__string documentation; // ? std::vector wsp__Policy_; // * std::vector wsp__PolicyReference_;// * soap__binding *soap__binding_; // ? http__binding *http__binding_; // ? std::vector wsoap__module_; // * WSDL 2.0 std::vector fault; // * WSDL 2.0 std::vector operation; // * private: wsdl__portType *portTypeRef; // traverse() finds portType/interface public: wsdl__binding(); int traverse(wsdl__definitions&); void portTypePtr(wsdl__portType*); wsdl__portType *portTypePtr() const; }; class wsdl__port // ... and WSDL 2.0 endpoint { public: @xsd__NMTOKEN name; @xsd__QName binding; @xsd__anyURI address; // WSDL 2.0 @xsd__NMTOKEN whttp__authenticationScheme; // WSDL 2.0 @xsd__NMTOKEN whttp__authenticationRealm; // WSDL 2.0 xsd__string documentation; // ? wsp__Policy *wsp__Policy_; // ? wsp__PolicyReference *wsp__PolicyReference_; // ? wsa__EndpointReferenceType *wsa__EndpointReference;// ? soap__address *soap__address_; // ? http__address *http__address_; // ? private: wsdl__binding *bindingRef; // traverse() finds binding public: wsdl__port(); int traverse(wsdl__definitions&); void bindingPtr(wsdl__binding*); wsdl__binding *bindingPtr() const; }; class wsdl__service { public: @xsd__NMTOKEN name; @xsd__QName interface_; // WSDL 2.0 xsd__string documentation; // ? std::vector wsp__Policy_; // * std::vector wsp__PolicyReference_;// * std::vector port; // * WSDL 1.1 std::vector endpoint; // * WSDL 2.0 public: int traverse(wsdl__definitions&); }; class wsdl__definitions { public: @xsd__NMTOKEN name; @xsd__anyURI targetNamespace = ""; @xsd__NMTOKEN version; std::vector import; // * xsd__string documentation; // ? wsdl__types *types; // ? std::vector message; // * std::vector portType; // * WSDL 1.1 std::vector interface_; // * WSDL 2.0 std::vector binding; // * std::vector service; // * xsd__string wsp__UsingPolicy; // ? WS-Policy 1.2/1.5 std::vector wsp__Policy_; // * WS-Policy 1.2/1.5 std::vector plnk__partnerLinkType; // * BPEL 2.0 std::vector vprop__property; // * BPEL 2.0 std::vector vprop__propertyAlias; // * BPEL 2.0 std::vector gwsdl__portType_; // * struct soap *soap; private: bool soap12; bool updated; char* location; int redirs; SetOfString builtinTypeSet; SetOfString builtinElementSet; SetOfString builtinAttributeSet; public: wsdl__definitions(); wsdl__definitions(struct soap*); wsdl__definitions(struct soap*, const char*, const char*); virtual ~wsdl__definitions(); int get(struct soap*); // gSOAP getter is triggered after parsing int preprocess(); int traverse(); int read(int, char**); int read(const char *cwd, const char*); const char* sourceLocation(); int error(); bool is_updated(); void print_fault(); void builtinType(const char*); void builtinTypes(const SetOfString&); void builtinElement(const char*); void builtinElements(const SetOfString&); void builtinAttribute(const char*); void builtinAttributes(const SetOfString&); const SetOfString& builtinTypes() const; const SetOfString& builtinElements() const; const SetOfString& builtinAttributes() const; friend ostream& operator<<(ostream&, const wsdl__definitions&); friend istream& operator>>(istream&, wsdl__definitions&); }; extern ostream &operator<<(ostream &o, const wsdl__definitions &e); extern istream &operator>>(istream &i, wsdl__definitions &e); gsoap-2.8.28/gsoap/VisualStudio2005/wsdl2h/wsdl2h/soap.h0000644000175000017500000000736312653650160022075 0ustar ellertellert/* soap.h WSDL/SOAP binding schema -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2012, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap soap schema documentation: WSDL 1.1 SOAP binding schema //gsoap soap schema namespace: http://schemas.xmlsoap.org/wsdl/soap/ //gsoap wsoap schema documentation: WSDL 2.0 SOAP binding schema //gsoap wsoap schema namespace: http://www.w3.org/ns/wsdl/soap #import "imports.h" class wsdl__definitions; // forward declaration class wsdl__message; // forward declaration class wsdl__part; // forward declaration enum soap__styleChoice { rpc, document }; class soap__binding { public: @xsd__anyURI transport; @enum soap__styleChoice *style; }; class soap__operation { public: @xsd__anyURI soapAction; @xsd__boolean soapActionRequired = true; @enum soap__styleChoice *style; }; enum soap__useChoice { literal, encoded }; class soap__body { public: @xsd__anyURI encodingStyle; @xsd__NMTOKENS parts; @enum soap__useChoice use; @xsd__anyURI namespace_; }; class soap__fault { public: @xsd__NMTOKEN name; @xsd__anyURI encodingStyle; @enum soap__useChoice use; @xsd__anyURI namespace_; }; class soap__headerfault { public: @xsd__QName message; @xsd__NMTOKEN part; @enum soap__useChoice use; @xsd__anyURI encodingStyle; @xsd__anyURI namespace_; private: wsdl__message *messageRef; wsdl__part *partRef; public: int traverse(wsdl__definitions&); void messagePtr(wsdl__message*); void partPtr(wsdl__part*); wsdl__message *messagePtr() const; wsdl__part *partPtr() const; }; class soap__header { public: @xsd__QName message; @xsd__NMTOKEN part; @enum soap__useChoice use; @xsd__anyURI encodingStyle; @xsd__anyURI namespace_; std::vector headerfault; // * private: wsdl__message *messageRef; wsdl__part *partRef; public: int traverse(wsdl__definitions&); void messagePtr(wsdl__message*); void partPtr(wsdl__part*); wsdl__message *messagePtr() const; wsdl__part *partPtr() const; }; class soap__address { public: @xsd__anyURI location; }; class wsoap__module { public: @xsd__anyURI ref; @xsd__boolean required = false; }; class wsoap__header { public: @xsd__QName element; @xsd__boolean mustUnderstand_ = false; @xsd__boolean required = false; private: xs__element *elementRef; public: int traverse(wsdl__definitions&); void elementPtr(xs__element*); xs__element *elementPtr() const; }; gsoap-2.8.28/gsoap/VisualStudio2005/wsdl2h/wsdl2h/schema.h0000644000175000017500000004372112653650160022371 0ustar ellertellert/* schema.h schema of XSD schemas 1.0 and 1.1 -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap xs schema documentation: XSD binding schema //gsoap xs schema namespace: http://www.w3.org/2001/XMLSchema //gsoap xs schema elementForm: qualified //gsoap xs schema attributeForm: unqualified /* For the wsdl:arrayType attribute to support old style SOAP arrays: */ //gsoap wsdl schema namespace: http://schemas.xmlsoap.org/wsdl/ #import "imports.h" class xs__schema; // forward declaration class xs__simpleType; // forward declaration class xs__complexType; // forward declaration class xs__extension; // forward declaration class xs__restriction; // forward declaration class xs__seqchoice; // forward declaration class xs__group; // forward declaration class xs__list; // forward declaration class xs__union; // forward declaration class xs__annotation { public: char* documentation; }; class xs__assert { public: @xsd__string test; @xsd__anyURI xpathDefaultNamespace; xs__annotation *annotation; }; class xs__alternative { public: @xsd__string test; @xsd__QName type; @xsd__anyURI xpathDefaultNamespace; xs__annotation *annotation; }; enum xs__formChoice { unqualified, qualified }; class xs__element { public: @xsd__NCName name; @xsd__QName ref; @xsd__QName type; @xsd__string default_; @xsd__QName default__; // also get QName value if element type is QName @xsd__string fixed; @xsd__QName fixed_; // also get QName value if element type is QName @enum xs__formChoice *form; @xsd__boolean nillable = false; @xsd__boolean abstract = false; @xsd__QName substitutionGroup; @xsd__string minOccurs; // xsd:nonNegativeInteger @xsd__string maxOccurs; // xsd:nonNegativeInteger|unbounded @xsd__anyURI targetNamespace; // XSD 1.1 @xsd__string xmime__expectedContentTypes; xs__annotation *annotation; xs__simpleType *simpleType; // choice xs__complexType *complexType; // choice std::vector alternative; // XSD 1.1 (unused) xsd__string unique; // unused private: xs__schema *schemaRef; // schema to which this belongs xs__element *elementRef; // traverse() finds ref xs__simpleType *simpleTypeRef; // traverse() finds type or = simpleType above xs__complexType *complexTypeRef; // traverse() finds type or = complexType above std::vector substitutions; // traverse() finds substitutionGroup elements public: xs__element(); int traverse(xs__schema&); void schemaPtr(xs__schema*); void elementPtr(xs__element*); void simpleTypePtr(xs__simpleType*); void complexTypePtr(xs__complexType*); xs__schema *schemaPtr() const; xs__element *elementPtr() const; xs__simpleType *simpleTypePtr() const; xs__complexType *complexTypePtr() const; const std::vector *substitutionsPtr() const; }; enum xs__attribute_use { optional, prohibited, required, default_, fixed_ }; class xs__attribute { public: @xsd__NCName name; @xsd__QName ref; @xsd__QName type; @enum xs__attribute_use use = optional; @xsd__string default_; @xsd__QName default__; // also get QName value if attribute type is QName @xsd__string fixed; @xsd__QName fixed_; // also get QName value if attribute type is QName @enum xs__formChoice *form; @xsd__boolean inheritable; // XSD 1.1 (unused) @xsd__anyURI targetNamespace; // XSD 1.1 @xsd__QName wsdl__arrayType; // extensibility attribute added to simplify WSDL parsing xs__annotation *annotation; xs__simpleType *simpleType; private: xs__schema *schemaRef; // schema to which this belongs xs__attribute *attributeRef; // traverse() finds ref xs__simpleType *simpleTypeRef; // traverse() finds type or = simpleType above public: xs__attribute(); int traverse(xs__schema&); void schemaPtr(xs__schema*); void attributePtr(xs__attribute*); void simpleTypePtr(xs__simpleType*); xs__schema *schemaPtr() const; xs__attribute *attributePtr() const; xs__simpleType *simpleTypePtr() const; }; class xs__all { public: std::vector element; public: int traverse(xs__schema&); }; enum xs__processContents { strict, skip, lax }; typedef char *xs__namespaceList; // "##any" or "##other" or list of URI, "##targetNamespace", "##local" class xs__any { public: @xs__namespaceList namespace_ = "##any"; @enum xs__processContents processContents = strict; @xsd__string minOccurs; // xsd:nonNegativeInteger @xsd__string maxOccurs; // xsd:nonNegativeInteger|unbounded std::vector element; public: int traverse(xs__schema&); }; class xs__contents { public: $int __union; union xs__union_content { xs__element *element; xs__group *group; xs__seqchoice *choice; xs__seqchoice *sequence; xs__any *any; } __content; public: int traverse(xs__schema&); }; class xs__seqchoice { public: @xsd__string minOccurs; // xsd:nonNegativeInteger @xsd__string maxOccurs; // xsd:nonNegativeInteger|unbounded xs__annotation *annotation; std::vector __contents; private: xs__schema *schemaRef; // schema to which this belongs public: xs__seqchoice(); int traverse(xs__schema&); void schemaPtr(xs__schema*); xs__schema *schemaPtr() const; }; class xs__group { public: @xsd__NCName name; @xsd__QName ref; @xsd__string minOccurs; // xsd:nonNegativeInteger @xsd__string maxOccurs; // xsd:nonNegativeInteger|unbounded xs__annotation *annotation; xs__all *all; xs__seqchoice *choice; xs__seqchoice *sequence; private: xs__schema *schemaRef; // schema to which this belongs xs__group *groupRef; // traverse() finds ref public: xs__group(); int traverse(xs__schema&); void schemaPtr(xs__schema*); void groupPtr(xs__group*); xs__schema *schemaPtr() const; xs__group *groupPtr() const; }; class xs__anyAttribute { public: @xs__namespaceList namespace_ = "##any"; @enum xs__processContents processContents = strict; }; class xs__attributeGroup { public: @xsd__NCName name; @xsd__QName ref; xs__annotation *annotation; std::vector attribute; std::vector attributeGroup; xs__anyAttribute *anyAttribute; private: xs__schema *schemaRef; xs__attributeGroup *attributeGroupRef; public: xs__attributeGroup(); int traverse(xs__schema&); void schemaPtr(xs__schema*); void attributeGroupPtr(xs__attributeGroup*); xs__schema *schemaPtr() const; xs__attributeGroup *attributeGroupPtr() const; }; class xs__enumeration { public: @xsd__string value; @xsd__QName value_; // also get QName value if base type is QName xs__annotation *annotation; public: int traverse(xs__schema&); }; class xs__pattern { public: @xsd__string value; public: int traverse(xs__schema&); }; class xs__simpleContent { public: xs__extension *extension; // choice xs__restriction *restriction; // choice public: int traverse(xs__schema&); }; class xs__simpleType { public: @xsd__NMTOKEN name; @xsd__string vc__minVersion; // XSD 1.1 (unused) @xsd__string vc__maxVersion; // XSD 1.1 (unused) xs__annotation *annotation; xs__restriction *restriction; // choice xs__list *list; // choice xs__union *union_; // choice private: xs__schema *schemaRef; int level; public: xs__simpleType(); int traverse(xs__schema&); void schemaPtr(xs__schema*); xs__schema *schemaPtr() const; int baseLevel(); }; class xs__extension { public: @xsd__QName base; xs__group *group; xs__all *all; xs__seqchoice *choice; xs__seqchoice *sequence; std::vector attribute; std::vector attributeGroup; xs__anyAttribute *anyAttribute; xs__annotation *annotation; std::vector assert; // XSD 1.1 private: xs__simpleType *simpleTypeRef; // traverse() finds type xs__complexType *complexTypeRef; // traverse() finds type public: xs__extension(); int traverse(xs__schema&); void simpleTypePtr(xs__simpleType*); void complexTypePtr(xs__complexType*); xs__simpleType *simpleTypePtr() const; xs__complexType *complexTypePtr() const; }; class xs__length { public: @xsd__string value; @xsd__boolean fixed; xs__annotation *annotation; }; class xs__whiteSpace { public: @xsd__string value; }; class xs__restriction { public: @xsd__QName base; xs__simpleType *simpleType; // used in xs__attributeGroup *attributeGroup; // not used in xs__group *group; // not used in xs__all *all; // not used in xs__seqchoice *choice; // not used in xs__seqchoice *sequence; // not used in std::vector attribute; // not used in xs__anyAttribute *anyAttribute; // not used in std::vector enumeration; std::vector pattern; xs__whiteSpace *whiteSpace; xs__length *length; xs__length *minLength; xs__length *maxLength; xs__length *precision; // 2000 XSD 1.0 xs__length *scale; // 2000 XSD 1.0 xs__length *totalDigits; // 2001 XSD 1.0 xs__length *fractionDigits; // 2001 XSD 1.0 xs__length *minInclusive; xs__length *maxInclusive; xs__length *minExclusive; xs__length *maxExclusive; xs__annotation *annotation; std::vector assert; // XSD 1.1 xs__assert *assertion; // XSD 1.1 private: xs__simpleType *simpleTypeRef; // traverse() finds type xs__complexType *complexTypeRef; // traverse() finds type public: xs__restriction(); int traverse(xs__schema&); void simpleTypePtr(xs__simpleType*); void complexTypePtr(xs__complexType*); xs__simpleType *simpleTypePtr() const; xs__complexType *complexTypePtr() const; }; class xs__list { public: @xsd__QName itemType; xs__restriction *restriction; // choice std::vector simpleType; // choice private: xs__simpleType *itemTypeRef; public: xs__list(); int traverse(xs__schema&); void itemTypePtr(xs__simpleType*); xs__simpleType *itemTypePtr() const; }; class xs__union { public: @xsd__NMTOKENS memberTypes; // check if NMTOKENS is ok??? std::vector simpleType; public: int traverse(xs__schema&); }; class xs__complexContent { public: @xsd__boolean mixed = false; xs__extension *extension; xs__restriction *restriction; xs__annotation *annotation; public: int traverse(xs__schema&); }; class xs__complexType { public: @xsd__NMTOKEN name; @xsd__boolean abstract = false; @xsd__boolean mixed = false; @xsd__boolean defaultAttributesApply = true; // XSD 1.1 @xsd__string vc__minVersion; // XSD 1.1 (unused) @xsd__string vc__maxVersion; // XSD 1.1 (unused) xs__annotation *annotation; xs__simpleContent *simpleContent; xs__complexContent *complexContent; xs__all *all; xs__seqchoice *choice; xs__seqchoice *sequence; xs__any *any; std::vector attribute; std::vector attributeGroup; xs__anyAttribute *anyAttribute; std::vector assert; // XSD 1.1 private: xs__schema *schemaRef; int level; public: xs__complexType(); int traverse(xs__schema&); void schemaPtr(xs__schema*); xs__schema *schemaPtr() const; int baseLevel(); }; class xs__import { public: @xsd__anyURI namespace_; @xsd__anyURI schemaLocation; private: xs__schema *schemaRef; // set by WSDL parser or via schemaLocation public: xs__import(); int traverse(xs__schema&); void schemaPtr(xs__schema*); xs__schema *schemaPtr() const; }; class xs__include { public: @xsd__anyURI schemaLocation; private: xs__schema *schemaRef; public: xs__include(); int preprocess(xs__schema&); int traverse(xs__schema&); void schemaPtr(xs__schema*); xs__schema *schemaPtr() const; }; class xs__override { public: @xsd__anyURI schemaLocation; std::vector attribute; std::vector element; std::vector group; std::vector attributeGroup; std::vector simpleType; std::vector complexType; private: xs__schema *schemaRef; public: xs__override(); int preprocess(xs__schema&); int traverse(xs__schema&); void schemaPtr(xs__schema*); xs__schema *schemaPtr() const; }; class xs__redefine { public: @xsd__anyURI schemaLocation; std::vector group; std::vector attributeGroup; std::vector simpleType; std::vector complexType; private: xs__schema *schemaRef; public: xs__redefine(); int preprocess(xs__schema&); int traverse(xs__schema&); void schemaPtr(xs__schema*); xs__schema *schemaPtr() const; }; class xs__schema { public: @xsd__anyURI targetNamespace = ""; @xsd__string version; @xsd__NCName defaultAttributes; // XSD 1.1 @enum xs__formChoice attributeFormDefault = unqualified; @enum xs__formChoice elementFormDefault = unqualified; xs__annotation *annotation; std::vector include; std::vector override_; std::vector redefine; std::vector import; std::vector attribute; std::vector element; std::vector group; std::vector attributeGroup; std::vector simpleType; std::vector complexType; struct soap *soap; private: xs__attributeGroup *attributeGroupRef; // defaultAttributes group bool updated; char* location; int redirs; SetOfString builtinTypeSet; SetOfString builtinElementSet; SetOfString builtinAttributeSet; public: xs__schema(); xs__schema(struct soap*); xs__schema(struct soap*, const char*, const char*); virtual ~xs__schema(); int get(struct soap*); // gSOAP getter is triggered after parsing int preprocess(); int insert(xs__schema&); int traverse(); int read(const char*, const char*); void sourceLocation(const char*); const char* sourceLocation(); xs__attributeGroup *attributeGroupPtr() const; // defaultAttributes group int error(); void print_fault(); void builtinType(const char*); void builtinElement(const char*); void builtinAttribute(const char*); const SetOfString& builtinTypes() const; const SetOfString& builtinElements() const; const SetOfString& builtinAttributes() const; bool empty() const; friend ostream& operator<<(ostream&, const xs__schema&); friend istream& operator>>(istream&, xs__schema&); }; extern ostream &operator<<(ostream &o, const xs__schema &e); extern istream &operator>>(istream &i, xs__schema &e); gsoap-2.8.28/gsoap/VisualStudio2005/wsdl2h/wsdl2h/service.cpp0000644000175000017500000051232412653650160023124 0ustar ellertellert/* service.cpp Generate gSOAP service structures from WSDL. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2016, Robert van Engelen, Genivia Inc. All Rights Reserved. This part of the software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "types.h" #include "service.h" #include #define URI_CHAR(c) (((c) > 32 && (c) != '"' && (c) != '<' && (c) != '>' && (c) != '\\' && (c) != '^' && (c) != '`' && (c) <= 'z') || (c) == '~') static const char *urienc(struct soap*, const char*); static bool imported(const char *tag); static void comment(const char *start, const char *middle, const char *end, const char *text); static void page(const char *page, const char *title, const char *text); static void section(const char *section, const char *title, const char *text); static void banner(const char*, const char* = NULL); static void ident(); static void gen_policy(Service&, const vector&, const char*, Types&); static void gen_policy_enablers(const Service&); static void gen_plnk(const Service& service); static void gen_vprop(const wsdl__definitions& definitions, Types&); //////////////////////////////////////////////////////////////////////////////// // // Definitions methods // //////////////////////////////////////////////////////////////////////////////// Definitions::Definitions() { } void Definitions::collect(const wsdl__definitions& definitions) { // Collect information: analyze WSDL definitions and imported definitions analyze(definitions); for (vector::const_iterator import = definitions.import.begin(); import != definitions.import.end(); ++import) if ((*import).definitionsPtr()) analyze(*(*import).definitionsPtr()); } void Definitions::analyze(const wsdl__definitions& definitions) { // Analyze WSDL and build Service information binding_count = 0; // Determine number of relevant service bindings (service prefix option only) for (vector::const_iterator i = definitions.binding.begin(); i != definitions.binding.end(); ++i) { for (vector::const_iterator j = (*i).operation.begin(); j != (*i).operation.end(); ++j) { if ((*j).operationPtr()) { binding_count++; break; } } } if (vflag && definitions.name) fprintf(stderr, "\nAnalyzing \"%s\" which has %d service binding(s)\n", definitions.name, binding_count); if (binding_count == 0 && definitions.import.empty() && definitions.name && (!definitions.portType.empty() || !definitions.interface_.empty())) fprintf(stderr, "\nWarning: WSDL \"%s\" has no bindings to implement operations\n", definitions.name); else if (binding_count > 1 && !service_prefix) { // This puts all operations under a single binding fprintf(stderr, "\nWarning: %d service bindings found, but collected as one service (use option -Nname to produce a separate service for each binding)\n", binding_count); } // Analyze and collect service data for (vector::const_iterator binding = definitions.binding.begin(); binding != definitions.binding.end(); ++binding) { // /definitions/binding/documentation const char *binding_documentation = (*binding).documentation; // /definitions/binding/soap:binding soap__binding *soap__binding_ = (*binding).soap__binding_; // /definitions/binding/soap:binding/@transport const char *soap__binding_transport = NULL; int version = 0; if (soap__binding_) soap__binding_transport = soap__binding_->transport; else if ((*binding).wsoap__version && strlen((*binding).wsoap__version) > 2) version = (*binding).wsoap__version[2]-'0'; // WSDL 2.0 else if (!(*binding).http__binding_) version = 2; // assume WSDL 2.0 if (version == 2) soap12 = true; // /definitions/binding/@soap:protocol if ((*binding).wsoap__protocol) soap__binding_transport = (*binding).wsoap__protocol; // /definitions/binding/@name const char *binding_name = ""; if ((*binding).name) binding_name = (*binding).name; else if ((*binding).portTypePtr() && (*binding).portTypePtr()->name) { size_t l = strlen((*binding).portTypePtr()->name); char *s = (char*)soap_malloc(definitions.soap, l + 8); if (s) { soap_strcpy(s, l + 8, (*binding).portTypePtr()->name); soap_strcpy(s + l, 8, "Binding"); binding_name = s; } } if (!Rflag && (!soap__binding_transport || (strcmp(soap__binding_transport+strlen(soap__binding_transport)-4, "http") && strcmp(soap__binding_transport+strlen(soap__binding_transport)-5, "HTTP/")))) { // -R not set: skip WSDL REST bindings if (!Wflag) fprintf(stderr, "\nWarning: ignoring RESTful binding \"%s\" because of non-SOAP transport \"%s\" (use option -R to enable REST)\n", binding_name, soap__binding_transport ? soap__binding_transport : ""); } else { // /definitions/binding/@type const char *binding_type = NULL; if ((*binding).type_) binding_type = (*binding).type_; // TODO: need to find the Policy of portType, though it is never used...? // const wsp__Policy *portType_policy = NULL; // /definitions/binding/wsp:Policy and wsp:PolicyReference /* const wsp__Policy *binding_policy = NULL; if ((*binding).wsp__Policy_) binding_policy = (*binding).wsp__Policy_; if ((*binding).wsp__PolicyReference_) binding_policy = (*binding).wsp__PolicyReference_->policyPtr(); */ // /definitions/binding/http:binding http__binding *http__binding_ = (*binding).http__binding_; const char *http__binding_verb = NULL; if (http__binding_) http__binding_verb = http__binding_->verb; // HTTP POST and GET else if ((*binding).whttp__methodDefault) http__binding_verb = (*binding).whttp__methodDefault; // HTTP POST and GET // /definitions/binding/soap:binding/@style soap__styleChoice soap__binding_style = document; if (soap__binding_ && soap__binding_->style) soap__binding_style = *soap__binding_->style; // /definitions/binding/operation* for (vector::const_iterator operation = (*binding).operation.begin(); operation != (*binding).operation.end(); ++operation) { // /definitions/portType/operation/ associated with /definitions/binding/operation wsdl__operation *wsdl__operation_ = (*operation).operationPtr(); // /definitions/binding/operation/soap:operation soap__operation *soap__operation_ = (*operation).soap__operation_; // /definitions/binding/operation/soap:operation/@style soap__styleChoice soap__operation_style = soap__binding_style; if (soap__operation_ && soap__operation_->style) soap__operation_style = *soap__operation_->style; // /definitions/binding/@wsoap:mepDefault const char *soap__operation_mep = (*binding).wsoap__mepDefault; // /definitions/binding/operation/@wsoap:mep if ((*operation).wsoap__mep) soap__operation_mep = (*operation).wsoap__mep; // /definitions/binding/operation/@whttp:method const char *http_method = http__binding_verb; if ((*operation).whttp__method) http_method = (*operation).whttp__method; // /definitions/binding/operation/@wsoap:action const char *soap__operation_action = NULL; if ((*operation).wsoap__action) soap__operation_action = (*operation).wsoap__action; // /definitions/binding/operation/http:operation http__operation *http__operation_ = (*operation).http__operation_; // /definitions/binding/wsp:Policy and wsp:PolicyReference const wsp__Policy *ext_operation_policy = NULL; if ((*operation).wsp__Policy_) ext_operation_policy = (*operation).wsp__Policy_; if ((*operation).wsp__PolicyReference_) ext_operation_policy = (*operation).wsp__PolicyReference_->policyPtr(); // /definitions/binding/operation/http:operation/@location const char *http__operation_location = NULL; if (http__operation_) http__operation_location = http__operation_->location; else if ((*operation).whttp__location) http__operation_location = (*operation).whttp__location; // /definitions/binding/operation/input and output wsdl__ext_ioput *ext_input, *ext_output; // /definitions/portType/operation if (wsdl__operation_ && wsdl__operation_->name) { bool reversed = false; wsdl__ioput *input = NULL; wsdl__ioput *output = NULL; // normalize input/output order for solicit-response operations if (wsdl__operation_->__union1 == SOAP_UNION_wsdl__union_ioput_input) input = wsdl__operation_->__ioput1.input; else if (wsdl__operation_->__union1 == SOAP_UNION_wsdl__union_ioput_output) { reversed = true; input = wsdl__operation_->__ioput1.output; } if (wsdl__operation_->__union2 == SOAP_UNION_wsdl__union_ioput_input) { reversed = true; output = wsdl__operation_->__ioput2.input; } else if (wsdl__operation_->__union2 == SOAP_UNION_wsdl__union_ioput_output) output = wsdl__operation_->__ioput2.output; else // one input only or one output only (or none) { reversed = false; input = NULL; output = NULL; if (wsdl__operation_->__union1 == SOAP_UNION_wsdl__union_ioput_input) input = wsdl__operation_->__ioput1.input; else if (wsdl__operation_->__union1 == SOAP_UNION_wsdl__union_ioput_output) output = wsdl__operation_->__ioput1.output; } if (!reversed) { ext_input = (*operation).input; ext_output = (*operation).output; } else { ext_input = (*operation).output; ext_output = (*operation).input; } if ((http_method && !strcmp(http_method, "GET")) || (wsdl__operation_->pattern && !strstr(wsdl__operation_->pattern, "in"))) input = NULL; if (wsdl__operation_->pattern && !strstr(wsdl__operation_->pattern, "out")) output = NULL; if (wsdl__operation_->pattern) // WSDL 2.0 { soap__operation_style = document; if (wsdl__operation_->style && !strcmp(wsdl__operation_->style, "http://www.w3.org/ns/wsdl/rpc")) soap__operation_style = rpc; else if ((*binding).portTypePtr() && (*binding).portTypePtr()->styleDefault && !strcmp( (*binding).portTypePtr()->styleDefault, "http://www.w3.org/ns/wsdl/rpc")) soap__operation_style = rpc; } // /definitions/binding/wsp:Policy and wsp:PolicyReference const wsp__Policy *operation_policy = NULL; if (wsdl__operation_->wsp__Policy_) operation_policy = wsdl__operation_->wsp__Policy_; if (wsdl__operation_->wsp__PolicyReference_) operation_policy = wsdl__operation_->wsp__PolicyReference_->policyPtr(); if (!Rflag && (http__operation_ || http__operation_location)) { // skip WSDL REST HTTP operations if (!Wflag) fprintf(stderr, "\nWarning: ignoring RESTful operation \"%s\" in binding \"%s\" (use option -R to enable REST)\n", wsdl__operation_->name, binding_name); } else if (input) { soap__body *input_body = NULL; mime__mimeXml *input_mime = NULL; mime__content *input_mime_content = NULL; if (!reversed && ext_input) { input_body = ext_input->soap__body_; input_mime = ext_input->mime__mimeXml_; input_mime_content = ext_input->mime__content_; if (ext_input->mime__multipartRelated_) { for (vector::const_iterator part = ext_input->mime__multipartRelated_->part.begin(); part != ext_input->mime__multipartRelated_->part.end(); ++part) if ((*part).soap__body_) { input_body = (*part).soap__body_; break; } } } else if (ext_output) { input_body = ext_output->soap__body_; input_mime = ext_output->mime__mimeXml_; input_mime_content = ext_output->mime__content_; if (ext_output->mime__multipartRelated_) { for (vector::const_iterator part = ext_output->mime__multipartRelated_->part.begin(); part != ext_output->mime__multipartRelated_->part.end(); ++part) if ((*part).soap__body_) { input_body = (*part).soap__body_; break; } } } if (wsdl__operation_->style && !strcmp(wsdl__operation_->style, "http://www.w3.org/ns/wsdl/style/iri")) { input_mime_content = soap_new_mime__content(definitions.soap); input_mime_content->soap_default(definitions.soap); input_mime_content->type = (char*)"application/x-www-form-urlencoded"; } // MUST have an input binding, otherwise can't generate a service operation if (input_body || input_mime || input_mime_content || input->element) { char *URI; if (input_body && soap__operation_style == rpc) URI = input_body->namespace_; else if (binding_count == 1 || !service_prefix) URI = definitions.targetNamespace; else { // multiple service bidings are used, each needs a unique new URI size_t l = strlen(definitions.targetNamespace) + strlen(binding_name); URI = (char*)soap_malloc(definitions.soap, l + 2); if (URI) { soap_strcpy(URI, l + 2, definitions.targetNamespace); size_t n = strlen(URI); if (n > 0 && URI[n-1] != '/') { soap_strcpy(URI + n, l + 2 - n, "/"); ++n; } soap_strcpy(URI + n, l + 2 - n, binding_name); } } if (URI) { const char *prefix = types.nsprefix(service_prefix, URI); const char *name = types.aname(NULL, NULL, binding_name); // name of service is binding name Service *service = services[prefix]; if (!service) { service = services[prefix] = new Service(); service->prefix = prefix; service->URI = urienc(definitions.soap, URI); service->name = name; service->transport = soap__binding_transport; if ((*binding).portTypePtr() && (*binding).portTypePtr()->name) service->type = types.aname(NULL, NULL, (*binding).portTypePtr()->name); else service->type = NULL; // collect faults (TODO: this is not used anywhere) for (vector::const_iterator fault = (*binding).fault.begin(); fault != (*binding).fault.end(); ++fault) { Message *f = analyze_fault(definitions, service, *fault); if (f) service->fault[f->name] = f; } // collect policies for the bindings for (vector::const_iterator p = (*binding).wsp__Policy_.begin(); p != (*binding).wsp__Policy_.end(); ++p) service->policy.push_back(&(*p)); for (vector::const_iterator r = (*binding).wsp__PolicyReference_.begin(); r != (*binding).wsp__PolicyReference_.end(); ++r) service->policy.push_back((*r).policyPtr()); // collect policies for the service endpoints for (vector::const_iterator s = definitions.service.begin(); s != definitions.service.end(); ++s) { for (vector::const_iterator p = (*s).wsp__Policy_.begin(); p != (*s).wsp__Policy_.end(); ++p) service->policy.push_back(&(*p)); for (vector::const_iterator r = (*s).wsp__PolicyReference_.begin(); r != (*s).wsp__PolicyReference_.end(); ++r) service->policy.push_back((*r).policyPtr()); } // collect BPEL 2.0 partner link roles for (vector::const_iterator p = definitions.plnk__partnerLinkType.begin(); p != definitions.plnk__partnerLinkType.end(); ++p) { for (vector::const_iterator r = (*p).role.begin(); r != (*p).role.end(); ++r) { if ((binding_count > 1 && !service_prefix) || (*r).portTypePtr() == (*binding).portTypePtr()) service->role.push_back(&(*r)); } } } for (vector::const_iterator s = definitions.service.begin(); s != definitions.service.end(); ++s) { for (vector::const_iterator port = (*s).port.begin(); port != (*s).port.end(); ++port) { if ((*port).bindingPtr() == &(*binding)) { if ((*port).soap__address_ && (*port).soap__address_->location) service->location.insert(urienc(definitions.soap, (*port).soap__address_->location)); if ((*port).wsa__EndpointReference && (*port).wsa__EndpointReference->Address) service->location.insert(urienc(definitions.soap, (*port).wsa__EndpointReference->Address)); if ((*port).http__address_ && (*port).http__address_->location) service->location.insert(urienc(definitions.soap, (*port).http__address_->location)); // collect service documentation if ((*s).documentation) service->service_documentation[(*service).name] = (*s).documentation; if ((*port).documentation && (*port).name) service->port_documentation[(*port).name] = (*port).documentation; if (binding_documentation) service->binding_documentation[binding_name] = binding_documentation; // collect policies for the service and endpoints if ((*port).wsp__Policy_) service->policy.push_back((*port).wsp__Policy_); if ((*port).wsp__PolicyReference_ && (*port).wsp__PolicyReference_->policyPtr()) service->policy.push_back((*port).wsp__PolicyReference_->policyPtr()); } } for (vector::const_iterator endpoint = (*s).endpoint.begin(); endpoint != (*s).endpoint.end(); ++endpoint) { if ((*endpoint).bindingPtr() == &(*binding)) { if ((*endpoint).address) service->location.insert(urienc(definitions.soap, (*endpoint).address)); if ((*endpoint).wsa__EndpointReference && (*endpoint).wsa__EndpointReference->Address) service->location.insert(urienc(definitions.soap, (*endpoint).wsa__EndpointReference->Address)); if ((*endpoint).http__address_ && (*endpoint).http__address_->location) service->location.insert(urienc(definitions.soap, (*endpoint).http__address_->location)); // TODO: locations need auth // service->auth_scheme = (*endpoint).whttp__authenticationScheme; // service->auth_realm = (*endpoint).whttp__authenticationRealm; // collect service documentation if ((*s).documentation) service->service_documentation[(*service).name] = (*s).documentation; if ((*endpoint).documentation && (*endpoint).name) service->port_documentation[(*endpoint).name] = (*endpoint).documentation; if (binding_documentation) service->binding_documentation[binding_name] = binding_documentation; // collect policies for the service and endpoints if ((*endpoint).wsp__Policy_) service->policy.push_back((*endpoint).wsp__Policy_); if ((*endpoint).wsp__PolicyReference_ && (*endpoint).wsp__PolicyReference_->policyPtr()) service->policy.push_back((*endpoint).wsp__PolicyReference_->policyPtr()); } } } Operation *op = new Operation(); op->operation = wsdl__operation_; op->name = types.aname(NULL, NULL, wsdl__operation_->name); op->prefix = prefix; op->URI = urienc(definitions.soap, URI); op->style = soap__operation_style; op->mep = soap__operation_mep; if (soap__binding_transport && (!strcmp(soap__binding_transport+strlen(soap__binding_transport)-4, "http") || !strcmp(soap__binding_transport+strlen(soap__binding_transport)-5, "HTTP/"))) { if ((op->mep && strstr(op->mep, "soap-response")) || (http_method && !strcmp(http_method, "GET"))) op->protocol = "SOAP-GET"; else if (version == 1) op->protocol = "SOAP1.1"; else if (version == 2) op->protocol = "SOAP1.2"; else op->protocol = "SOAP"; } else { if (http_method) op->protocol = http_method; else op->protocol = "HTTP"; } op->documentation = wsdl__operation_->documentation; op->operation_documentation = (*operation).documentation; op->parameterOrder = wsdl__operation_->parameterOrder; if (http__operation_location) op->action = http__operation_location; // TODO: for now, store HTTP location in action else { op->action = soap__operation_action; if ((*operation).soap__operation_) { if ((*operation).soap__operation_->soapActionRequired) op->action = (*operation).soap__operation_->soapAction; } else if (version != 2) op->action = ""; } if (operation_policy) op->policy.push_back(operation_policy); if (ext_operation_policy) op->policy.push_back(ext_operation_policy); op->input = new Message(); op->input->name = wsdl__operation_->name; if (input_body && soap__operation_style == rpc && !input_body->namespace_) { op->input->URI = ""; fprintf(stderr, "\nError: no soap:body namespace attribute\n"); } else if (input_body) op->input->URI = urienc(definitions.soap, input_body->namespace_); else op->input->URI = service->URI; op->input->style = soap__operation_style; if (input_body) { op->input->use = input_body->use; op->input->encodingStyle = input_body->encodingStyle; } if (input->wsa__Action) op->input->action = input->wsa__Action; else if (input->wsam__Action) op->input->action = input->wsam__Action; else if (op->action) op->input->action = op->action; else if (definitions.targetNamespace && (*binding).portTypePtr() && (*binding).portTypePtr()->name) { const char *name = input->name ? input->name : op->name; size_t l = strlen(definitions.targetNamespace) + strlen((*binding).portTypePtr()->name) + strlen(name); char *tmp = (char*)soap_malloc(definitions.soap, l + 3); if (tmp) { (SOAP_SNPRINTF(tmp, l + 3, l + 2), "%s/%s/%s", definitions.targetNamespace, (*binding).portTypePtr()->name, name); op->input->action = tmp; } } op->input->message = input->messagePtr(); op->input->element = input->elementPtr(); op->input->part = NULL; op->input->mustUnderstand = false; op->input->multipartRelated = NULL; op->input->content = input_mime_content; op->input->body_parts = NULL; op->input->layout = NULL; op->input->ext_documentation = NULL; if (ext_input) { op->input->multipartRelated = ext_input->mime__multipartRelated_; if (ext_input->mime__multipartRelated_ && !ext_input->mime__multipartRelated_->part.empty()) op->input->header = ext_input->mime__multipartRelated_->part.front().soap__header_; else if (!ext_input->soap__header_.empty()) op->input->header = ext_input->soap__header_; else if (!ext_input->wsoap__header_.empty()) op->input->wheader = ext_input->wsoap__header_; if (ext_input->mime__multipartRelated_ && !ext_input->mime__multipartRelated_->part.empty() && ext_input->mime__multipartRelated_->part.front().soap__body_) op->input->body_parts = ext_input->mime__multipartRelated_->part.front().soap__body_->parts; else if (input_body) op->input->body_parts = input_body->parts; if (ext_input->dime__message_) op->input->layout = ext_input->dime__message_->layout; else op->input->layout = NULL; op->input->ext_documentation = ext_input->documentation; } op->input->documentation = input->documentation; // collect input message policies if (op->input->message) { for (vector::const_iterator p = op->input->message->wsp__Policy_.begin(); p != op->input->message->wsp__Policy_.end(); ++p) op->input->policy.push_back(&(*p)); for (vector::const_iterator r = op->input->message->wsp__PolicyReference_.begin(); r != op->input->message->wsp__PolicyReference_.end(); ++r) op->input->policy.push_back((*r).policyPtr()); } if (input->wsp__Policy_) op->input->policy.push_back(input->wsp__Policy_); if (input->wsp__PolicyReference_ && input->wsp__PolicyReference_->policyPtr()) op->input->policy.push_back(input->wsp__PolicyReference_->policyPtr()); if (ext_input) { if (ext_input->wsp__Policy_) op->input->policy.push_back(ext_input->wsp__Policy_); if (ext_input->wsp__PolicyReference_ && ext_input->wsp__PolicyReference_->policyPtr()) op->input->policy.push_back(ext_input->wsp__PolicyReference_->policyPtr()); } if (soap__operation_style == document) op->input_name = types.oname("__", op->URI, op->input->name); else op->input_name = types.oname(NULL, op->input->URI, op->input->name); if (output) { soap__body *output_body = NULL; mime__mimeXml *output_mime = NULL; mime__content *output_mime_content = NULL; if (ext_output) { output_body = ext_output->soap__body_; output_mime = ext_output->mime__mimeXml_; output_mime_content = ext_output->mime__content_; if (ext_output->mime__multipartRelated_) { for (vector::const_iterator part = ext_output->mime__multipartRelated_->part.begin(); part != ext_output->mime__multipartRelated_->part.end(); ++part) if ((*part).soap__body_) { output_body = (*part).soap__body_; break; } } } if (ext_output && ext_output->mime__content_) { op->output = new Message(); op->output->name = NULL; op->output->URI = NULL; op->output->style = soap__operation_style; op->output->use = literal; op->output->encodingStyle = NULL; op->output->action = NULL; op->output->body_parts = NULL; op->output->part = NULL; op->output->mustUnderstand = false; op->output->multipartRelated = NULL; op->output->content = output_mime_content; op->output->message = output->messagePtr(); op->output->element = output->elementPtr(); op->output->layout = NULL; } else if (output_body || output_mime || output_mime_content || output->element) { op->output = new Message(); op->output->name = wsdl__operation_->name; // RPC uses operation/@name with suffix 'Response' as set below op->output->style = soap__operation_style; if (output_body) { op->output->use = output_body->use; // the code below is a hack around the RPC encoded response message element tag mismatch with Axis: if (!output_body->namespace_ || output_body->use == encoded) op->output->URI = op->input->URI; // encoded seems (?) to require the request's namespace else op->output->URI = urienc(definitions.soap, output_body->namespace_); op->output->encodingStyle = output_body->encodingStyle; } else op->output->URI = service->URI; if (output->wsa__Action) op->output->action = output->wsa__Action; else if (output->wsam__Action) op->output->action = output->wsam__Action; else if (http__operation_location) op->output->action = NULL; else if (op->action) { size_t l = strlen(op->action); char *tmp = (char*)soap_malloc(definitions.soap, l + 9); if (tmp) { (SOAP_SNPRINTF(tmp, l + 9, l + 8), "%sResponse", op->action); op->output->action = tmp; } } else if (definitions.targetNamespace && (*binding).portTypePtr() && (*binding).portTypePtr()->name) { const char *name = output->name ? output->name : op->name; size_t l = strlen(definitions.targetNamespace) + strlen((*binding).portTypePtr()->name) + strlen(name); char *tmp = (char*)soap_malloc(definitions.soap, l + 11); if (tmp) { (SOAP_SNPRINTF(tmp, l + 11, l + 10), "%s/%s/%s%s", definitions.targetNamespace, (*binding).portTypePtr()->name, name, output->name ? "" : "Response"); op->output->action = tmp; } } op->output->message = output->messagePtr(); op->output->element = output->elementPtr(); op->output->part = NULL; op->output->content = output_mime_content; op->output->body_parts = NULL; op->output->layout = NULL; op->output->ext_documentation = NULL; op->output->mustUnderstand = false; } if (ext_output) { op->output->multipartRelated = ext_output->mime__multipartRelated_; if (ext_output->mime__multipartRelated_ && !ext_output->mime__multipartRelated_->part.empty()) op->output->header = ext_output->mime__multipartRelated_->part.front().soap__header_; else if (!ext_output->soap__header_.empty()) op->output->header = ext_output->soap__header_; else if (!ext_output->wsoap__header_.empty()) op->output->wheader = ext_output->wsoap__header_; if (ext_output->mime__multipartRelated_ && !ext_output->mime__multipartRelated_->part.empty() && ext_output->mime__multipartRelated_->part.front().soap__body_) op->output->body_parts = ext_output->mime__multipartRelated_->part.front().soap__body_->parts; else if (output_body) op->output->body_parts = output_body->parts; if (ext_output->dime__message_) op->output->layout = ext_output->dime__message_->layout; else op->output->layout = NULL; op->output->ext_documentation = ext_output->documentation; } if (op->output->name) { size_t l = strlen(op->output->name); char *s = (char*)soap_malloc(definitions.soap, l + 9); if (s) { (SOAP_SNPRINTF(s, l + 9, l + 8), "%sResponse", op->output->name); if (soap__operation_style == document) op->output_name = types.oname("__", op->URI, s); else op->output_name = types.oname(NULL, op->output->URI, s); } } op->output->documentation = output->documentation; // collect output message policies if (op->output->message) { for (vector::const_iterator p = op->output->message->wsp__Policy_.begin(); p != op->output->message->wsp__Policy_.end(); ++p) op->output->policy.push_back(&(*p)); for (vector::const_iterator r = op->output->message->wsp__PolicyReference_.begin(); r != op->output->message->wsp__PolicyReference_.end(); ++r) op->output->policy.push_back((*r).policyPtr()); } if (output->wsp__Policy_) op->output->policy.push_back(output->wsp__Policy_); if (output->wsp__PolicyReference_ && output->wsp__PolicyReference_->policyPtr()) op->output->policy.push_back(output->wsp__PolicyReference_->policyPtr()); if (ext_output) { if (ext_output->wsp__Policy_) op->output->policy.push_back(ext_output->wsp__Policy_); if (ext_output->wsp__PolicyReference_ && ext_output->wsp__PolicyReference_->policyPtr()) op->output->policy.push_back(ext_output->wsp__PolicyReference_->policyPtr()); } } else { op->output_name = NULL; op->output = NULL; } analyze_headers(definitions, service, ext_input, ext_output); analyze_faults(definitions, service, op, operation); service->operation.push_back(op); } else { if (!Wflag) fprintf(stderr, "\nWarning: no SOAP RPC operation namespace, operations will be ignored\n"); } } else fprintf(stderr, "\nError: no wsdl:definitions/binding/operation/input\n"); } else if (output) { // This part is similar to the previous clause, limited to one-way output operations soap__body *output_body = NULL; mime__mimeXml *output_mime = NULL; mime__content *output_mime_content = NULL; if (!reversed && ext_output) { output_body = ext_output->soap__body_; output_mime = ext_output->mime__mimeXml_; output_mime_content = ext_output->mime__content_; if (ext_output->mime__multipartRelated_) { for (vector::const_iterator part = ext_output->mime__multipartRelated_->part.begin(); part != ext_output->mime__multipartRelated_->part.end(); ++part) if ((*part).soap__body_) { output_body = (*part).soap__body_; break; } } } else if (ext_input) { output_body = ext_input->soap__body_; output_mime = ext_input->mime__mimeXml_; output_mime_content = ext_input->mime__content_; if (ext_input->mime__multipartRelated_) { for (vector::const_iterator part = ext_input->mime__multipartRelated_->part.begin(); part != ext_input->mime__multipartRelated_->part.end(); ++part) if ((*part).soap__body_) { output_body = (*part).soap__body_; break; } } } if (wsdl__operation_->style && !strcmp(wsdl__operation_->style, "http://www.w3.org/ns/wsdl/style/iri")) { output_mime_content = soap_new_mime__content(definitions.soap); output_mime_content->soap_default(definitions.soap); output_mime_content->type = (char*)"application/x-www-form-urlencoded"; } if (output_body || output_mime || output_mime_content || output->element) { char *URI; if (output_body && soap__operation_style == rpc) URI = output_body->namespace_; else if (binding_count == 1 || !service_prefix) URI = definitions.targetNamespace; else { // multiple service bidings are used, each needs a unique new URI size_t l = strlen(definitions.targetNamespace) + strlen(binding_name); URI = (char*)soap_malloc(definitions.soap, l + 2); if (URI) { soap_strcpy(URI, l + 2, definitions.targetNamespace); size_t n = strlen(URI); if (n > 0 && URI[n-1] != '/') { soap_strcpy(URI + n, l + 2 - n, "/"); ++n; } soap_strcpy(URI + n, l + 2 - n, binding_name); } } if (URI) { const char *prefix = types.nsprefix(service_prefix, URI); const char *name = types.aname(NULL, NULL, binding_name); // name of service is binding name Service *service = services[prefix]; if (!service) { service = services[prefix] = new Service(); service->prefix = prefix; service->URI = urienc(definitions.soap, URI); service->name = name; service->transport = soap__binding_transport; if ((*binding).portTypePtr() && (*binding).portTypePtr()->name) service->type = types.aname(NULL, NULL, (*binding).portTypePtr()->name); else service->type = NULL; // collect faults (TODO: this is not used anywhere) for (vector::const_iterator fault = (*binding).fault.begin(); fault != (*binding).fault.end(); ++fault) { Message *f = analyze_fault(definitions, service, *fault); if (f) service->fault[f->name] = f; } // collect policies for the bindings for (vector::const_iterator p = (*binding).wsp__Policy_.begin(); p != (*binding).wsp__Policy_.end(); ++p) service->policy.push_back(&(*p)); for (vector::const_iterator r = (*binding).wsp__PolicyReference_.begin(); r != (*binding).wsp__PolicyReference_.end(); ++r) service->policy.push_back((*r).policyPtr()); // collect policies for the service endpoints for (vector::const_iterator s = definitions.service.begin(); s != definitions.service.end(); ++s) { for (vector::const_iterator p = (*s).wsp__Policy_.begin(); p != (*s).wsp__Policy_.end(); ++p) service->policy.push_back(&(*p)); for (vector::const_iterator r = (*s).wsp__PolicyReference_.begin(); r != (*s).wsp__PolicyReference_.end(); ++r) service->policy.push_back((*r).policyPtr()); } // collect BPEL 2.0 partner link roles for (vector::const_iterator p = definitions.plnk__partnerLinkType.begin(); p != definitions.plnk__partnerLinkType.end(); ++p) { for (vector::const_iterator r = (*p).role.begin(); r != (*p).role.end(); ++r) { if ((binding_count > 1 && !service_prefix) || (*r).portTypePtr() == (*binding).portTypePtr()) service->role.push_back(&(*r)); } } } for (vector::const_iterator s = definitions.service.begin(); s != definitions.service.end(); ++s) { for (vector::const_iterator port = (*s).port.begin(); port != (*s).port.end(); ++port) { if ((*port).bindingPtr() == &(*binding)) { if ((*port).soap__address_ && (*port).soap__address_->location) service->location.insert(urienc(definitions.soap, (*port).soap__address_->location)); else if ((*port).wsa__EndpointReference && (*port).wsa__EndpointReference->Address) service->location.insert(urienc(definitions.soap, (*port).wsa__EndpointReference->Address)); // TODO: HTTP address for HTTP operations // if ((*port).http__address_) // http__address_location = http__address_->location; // collect service documentation if ((*s).documentation) service->service_documentation[(*service).name] = (*s).documentation; if ((*port).documentation && (*port).name) service->port_documentation[(*port).name] = (*port).documentation; if (binding_documentation) service->binding_documentation[binding_name] = binding_documentation; // collect policies for the service and endpoints if ((*port).wsp__Policy_) service->policy.push_back((*port).wsp__Policy_); if ((*port).wsp__PolicyReference_ && (*port).wsp__PolicyReference_->policyPtr()) service->policy.push_back((*port).wsp__PolicyReference_->policyPtr()); } } } Operation *op = new Operation(); op->operation = wsdl__operation_; op->input_name = NULL; op->input = NULL; op->name = types.aname(NULL, NULL, wsdl__operation_->name); op->prefix = prefix; op->URI = urienc(definitions.soap, URI); op->style = soap__operation_style; op->mep = soap__operation_mep; if (soap__binding_transport && (!strcmp(soap__binding_transport+strlen(soap__binding_transport)-4, "http") || !strcmp(soap__binding_transport+strlen(soap__binding_transport)-5, "HTTP/"))) { if ((op->mep && strstr(op->mep, "soap-response")) || (http_method && !strcmp(http_method, "GET"))) op->protocol = "SOAP-GET"; else if (version == 1) op->protocol = "SOAP1.1"; else if (version == 2) op->protocol = "SOAP1.2"; else op->protocol = "SOAP"; } else { if (http_method) op->protocol = http_method; else op->protocol = "HTTP"; } op->documentation = wsdl__operation_->documentation; op->operation_documentation = (*operation).documentation; op->parameterOrder = wsdl__operation_->parameterOrder; if (http__operation_location) op->action = http__operation_location; // TODO: for now, store HTTP location in action else { op->action = soap__operation_action; if ((*operation).soap__operation_) { if ((*operation).soap__operation_->soapActionRequired) op->action = (*operation).soap__operation_->soapAction; } else if (version != 2) op->action = ""; } if (operation_policy) op->policy.push_back(operation_policy); if (ext_operation_policy) op->policy.push_back(ext_operation_policy); op->output = new Message(); // one-way output operation op->output->name = wsdl__operation_->name; // RPC uses operation/@name if (output_body && soap__operation_style == rpc && !output_body->namespace_) { op->output->URI = ""; fprintf(stderr, "\nError: no soap:body namespace attribute\n"); } else if (output_body) op->output->URI = urienc(definitions.soap, output_body->namespace_); else op->output->URI = service->URI; op->output->style = soap__operation_style; if (output_body) { op->output->use = output_body->use; op->output->encodingStyle = output_body->encodingStyle; } if (output->wsa__Action) op->output->action = output->wsa__Action; else if (output->wsam__Action) op->output->action = output->wsam__Action; else if (op->action) op->output->action = op->action; else if (definitions.targetNamespace && (*binding).portTypePtr() && (*binding).portTypePtr()->name) { const char *name = output->name ? output->name : op->name; size_t l = strlen(definitions.targetNamespace) + strlen((*binding).portTypePtr()->name) + strlen(name); char *tmp = (char*)soap_malloc(definitions.soap, l + 3); if (tmp) { (SOAP_SNPRINTF(tmp, l + 3, l + 2), "%s/%s/%s", definitions.targetNamespace, (*binding).portTypePtr()->name, name); op->output->action = tmp; } } op->output->message = output->messagePtr(); op->output->element = output->elementPtr(); op->output->part = NULL; op->output->mustUnderstand = false; op->output->multipartRelated = NULL; op->output->content = output_mime_content; op->output->body_parts = NULL; op->output->layout = NULL; op->output->ext_documentation = NULL; if (ext_output) { op->output->multipartRelated = ext_output->mime__multipartRelated_; if (ext_output->mime__multipartRelated_ && !ext_output->mime__multipartRelated_->part.empty()) op->output->header = ext_output->mime__multipartRelated_->part.front().soap__header_; else if (!ext_output->soap__header_.empty()) op->output->header = ext_output->soap__header_; else if (!ext_output->wsoap__header_.empty()) op->output->wheader = ext_output->wsoap__header_; if (ext_output->mime__multipartRelated_ && !ext_output->mime__multipartRelated_->part.empty() && ext_output->mime__multipartRelated_->part.front().soap__body_) op->output->body_parts = ext_output->mime__multipartRelated_->part.front().soap__body_->parts; else if (output_body) op->output->body_parts = output_body->parts; if (ext_output->dime__message_) op->output->layout = ext_output->dime__message_->layout; else op->output->layout = NULL; op->output->ext_documentation = ext_output->documentation; } op->output->documentation = output->documentation; // collect output message policies if (op->output->message) { for (vector::const_iterator p = op->output->message->wsp__Policy_.begin(); p != op->output->message->wsp__Policy_.end(); ++p) op->output->policy.push_back(&(*p)); for (vector::const_iterator r = op->output->message->wsp__PolicyReference_.begin(); r != op->output->message->wsp__PolicyReference_.end(); ++r) op->output->policy.push_back((*r).policyPtr()); } if (output->wsp__Policy_) op->output->policy.push_back(output->wsp__Policy_); if (output->wsp__PolicyReference_ && output->wsp__PolicyReference_->policyPtr()) op->output->policy.push_back(output->wsp__PolicyReference_->policyPtr()); if (ext_output) { if (ext_output->wsp__Policy_) op->output->policy.push_back(ext_output->wsp__Policy_); if (ext_output->wsp__PolicyReference_ && ext_output->wsp__PolicyReference_->policyPtr()) op->output->policy.push_back(ext_output->wsp__PolicyReference_->policyPtr()); } if (soap__operation_style == document) op->input_name = types.oname("__", op->URI, op->output->name); else op->input_name = types.oname(NULL, op->output->URI, op->output->name); size_t l = strlen(op->output->name); char *s = (char*)soap_malloc(definitions.soap, l + 9); if (s) { (SOAP_SNPRINTF(s, l + 9, l + 8), "%sResponse", op->output->name); if (soap__operation_style == document) op->output_name = types.oname("__", op->URI, s); else op->output_name = types.oname(NULL, op->output->URI, s); } analyze_headers(definitions, service, ext_input, ext_output); analyze_faults(definitions, service, op, operation); service->operation.push_back(op); } else { if (!Wflag) fprintf(stderr, "\nWarning: no SOAP RPC operation namespace, operations will be ignored\n"); } } else fprintf(stderr, "\nError: no wsdl:definitions/binding/operation/output\n"); } else fprintf(stderr, "\nError: no wsdl:definitions/portType/operation/input and output\n"); } else fprintf(stderr, "\nError: no wsdl:definitions/portType/operation\n"); } } } } void Definitions::analyze_headers(const wsdl__definitions& definitions, Service *service, wsdl__ext_ioput *ext_input, wsdl__ext_ioput *ext_output) { // collect input headers and headerfaults if (ext_input) { const vector *soap__header_ = NULL; // check if soap header is in mime:multipartRelated if (ext_input->mime__multipartRelated_) { for (vector::const_iterator part = ext_input->mime__multipartRelated_->part.begin(); part != ext_input->mime__multipartRelated_->part.end(); ++part) if (!(*part).soap__header_.empty()) { soap__header_ = &(*part).soap__header_; break; } } if (!soap__header_) soap__header_ = &ext_input->soap__header_; for (vector::const_iterator header = soap__header_->begin(); header != soap__header_->end(); ++header) { Message *h = new Message(); h->message = (*header).messagePtr(); h->element = NULL; h->body_parts = NULL; h->part = (*header).partPtr(); if ((*header).namespace_) h->URI = urienc(definitions.soap, (*header).namespace_); else h->URI = service->URI; if (h->part && h->part->element) h->name = types.aname(NULL, NULL, h->part->element); else if (h->URI && h->part && h->part->name && h->part->type) h->name = types.aname(NULL, h->URI, h->part->name); else { fprintf(stderr, "\nError in SOAP Header part definition: input part \"%s\" missing?\n", h->part && h->part->name ? h->part->name : "?"); h->name = ""; } h->encodingStyle = (*header).encodingStyle; h->style = document; // irrelevant h->use = (*header).use; h->mustUnderstand = true; h->multipartRelated = NULL; h->content = NULL; h->layout = NULL; h->ext_documentation = NULL; // TODO: may wanto to add document content h->documentation = NULL; // TODO: may wanto to add document content service->header[h->name] = h; for (vector::const_iterator headerfault = (*header).headerfault.begin(); headerfault != (*header).headerfault.end(); ++headerfault) { // TODO: headerfault processing. This is practically never used...! } } for (vector::const_iterator wheader = ext_input->wsoap__header_.begin(); wheader != ext_input->wsoap__header_.end(); ++wheader) { Message *h = new Message(); h->message = NULL; h->element = (*wheader).elementPtr(); h->body_parts = NULL; h->part = NULL; h->URI = NULL; h->mustUnderstand = (*wheader).mustUnderstand_; h->name = types.aname(NULL, NULL, (*wheader).element); h->encodingStyle = NULL; h->style = document; // irrelevant h->use = literal; h->multipartRelated = NULL; h->content = NULL; h->layout = NULL; h->ext_documentation = NULL; // TODO: may want to add document content h->documentation = NULL; // TODO: may want to add document content service->header[h->name] = h; } } // collect output headers and headerfaults if (ext_output) { const vector *soap__header_ = NULL; // check if soap header is in mime:multipartRelated if (ext_output->mime__multipartRelated_) { for (vector::const_iterator part = ext_output->mime__multipartRelated_->part.begin(); part != ext_output->mime__multipartRelated_->part.end(); ++part) if (!(*part).soap__header_.empty()) { soap__header_ = &(*part).soap__header_; break; } } if (!soap__header_) soap__header_ = &ext_output->soap__header_; for (vector::const_iterator header = soap__header_->begin(); header != soap__header_->end(); ++header) { Message *h = new Message(); h->message = (*header).messagePtr(); h->element = NULL; h->body_parts = NULL; h->part = (*header).partPtr(); h->URI = urienc(definitions.soap, (*header).namespace_); if (h->part && h->part->element) h->name = types.aname(NULL, NULL, h->part->element); else if (h->URI && h->part && h->part->name && h->part->type) h->name = types.aname(NULL, h->URI, h->part->name); else { fprintf(stderr, "\nError in SOAP Header part definition: output part \"%s\" missing?\n", h->part && h->part->name ? h->part->name : "?"); h->name = ""; } h->encodingStyle = (*header).encodingStyle; h->style = document; // irrelevant h->use = (*header).use; h->mustUnderstand = false; h->multipartRelated = NULL; h->content = NULL; h->layout = NULL; h->ext_documentation = NULL; // TODO: may want to add document content h->documentation = NULL; // TODO: may want to add document content service->header[h->name] = h; for (vector::const_iterator headerfault = (*header).headerfault.begin(); headerfault != (*header).headerfault.end(); ++headerfault) { // TODO: headerfault processing. This is practically never used...! } } for (vector::const_iterator wheader = ext_output->wsoap__header_.begin(); wheader != ext_output->wsoap__header_.end(); ++wheader) { Message *h = new Message(); h->message = NULL; h->element = (*wheader).elementPtr(); h->body_parts = NULL; h->part = NULL; h->URI = NULL; h->mustUnderstand = (*wheader).mustUnderstand_; h->name = types.aname(NULL, NULL, (*wheader).element); h->encodingStyle = NULL; h->style = document; // irrelevant h->use = literal; h->multipartRelated = NULL; h->content = NULL; h->layout = NULL; h->ext_documentation = NULL; // TODO: may want to add document content h->documentation = NULL; // TODO: may want to add document content service->header[h->name] = h; } } } void Definitions::analyze_faults(const wsdl__definitions& definitions, Service *service, Operation *op, vector::const_iterator& operation) { for (vector::const_iterator fault = (*operation).fault.begin(); fault != (*operation).fault.end(); ++fault) { Message *f = analyze_fault(definitions, service, *fault); if (f) { op->outfault.push_back(f); service->fault[f->name] = f; } } for (vector::const_iterator infault = (*operation).infault.begin(); infault != (*operation).infault.end(); ++infault) { Message *f = analyze_fault(definitions, service, *infault); if (f) { op->infault.push_back(f); service->fault[f->name] = f; } } for (vector::const_iterator outfault = (*operation).outfault.begin(); outfault != (*operation).outfault.end(); ++outfault) { Message *f = analyze_fault(definitions, service, *outfault); if (f) { op->outfault.push_back(f); service->fault[f->name] = f; } } } Message *Definitions::analyze_fault(const wsdl__definitions& definitions, Service *service, const wsdl__ext_fault& ext_fault) { Message *f = NULL; const wsdl__fault *fault = ext_fault.faultPtr(); if (fault && (fault->messagePtr() || fault->elementPtr())) { f = new Message(); f->message = fault->messagePtr(); f->element = fault->elementPtr(); f->body_parts = NULL; f->part = NULL; f->encodingStyle = NULL; if (ext_fault.soap__fault_) f->encodingStyle = ext_fault.soap__fault_->encodingStyle; f->action = NULL; if (fault->wsa__Action) f->action = fault->wsa__Action; else f->action = fault->wsam__Action; if (f->element && f->element->schemaPtr()) f->URI = urienc(definitions.soap, f->element->schemaPtr()->targetNamespace); else if (ext_fault.soap__fault_ && ext_fault.soap__fault_->namespace_) f->URI = urienc(definitions.soap, ext_fault.soap__fault_->namespace_); else f->URI = service->URI; // must have a unique URI f->style = document; // irrelevant f->use = literal; if (ext_fault.soap__fault_) f->use = ext_fault.soap__fault_->use; if (ext_fault.wsoap__code) { size_t l = strlen(ext_fault.wsoap__code); if (ext_fault.wsoap__subcodes) l += strlen(ext_fault.wsoap__subcodes); char *s = (char*)soap_malloc(definitions.soap, l + 40); if (s) { (SOAP_SNPRINTF(s, l + 40, l + 19), "\"%s\" with subcodes \"%s\"", ext_fault.wsoap__code, ext_fault.wsoap__subcodes ? ext_fault.wsoap__subcodes : ""); f->body_parts = s; } } else f->ext_documentation = ext_fault.documentation; f->mustUnderstand = false; f->multipartRelated = NULL; f->content = NULL; f->layout = NULL; if (f->message) { f->name = types.aname("_", f->URI, f->message->name); f->documentation = f->message->documentation; } else { f->name = types.aname(NULL, f->URI, fault->element); f->documentation = fault->documentation; } // collect fault message policies if (fault->wsp__Policy_) f->policy.push_back(fault->wsp__Policy_); if (fault->wsp__PolicyReference_ && fault->wsp__PolicyReference_->policyPtr()) f->policy.push_back(fault->wsp__PolicyReference_->policyPtr()); if (ext_fault.wsp__Policy_) f->policy.push_back(ext_fault.wsp__Policy_); if (ext_fault.wsp__PolicyReference_ && ext_fault.wsp__PolicyReference_->policyPtr()) f->policy.push_back(ext_fault.wsp__PolicyReference_->policyPtr()); } else if (ext_fault.soap__fault_ && ext_fault.soap__fault_->name) fprintf(stderr, "\nError: no wsdl:definitions/binding/operation/fault/soap:fault \"%s\"\n", ext_fault.soap__fault_->name); else fprintf(stderr, "\nError: no wsdl:definitions/binding/operation/fault/soap:fault\n"); return f; } void Definitions::compile(const wsdl__definitions& definitions) { // compile the definitions and generate gSOAP header file const char *defs; if (definitions.name) defs = types.aname(NULL, NULL, definitions.name); else defs = "Service"; ident(); fprintf(stream, "/** @page page_notes Notes\n\n@note HINTS:\n - Run soapcpp2 on %s to generate the SOAP/XML processing logic.\n Use soapcpp2 -I to specify paths for #import\n To build with STL, 'stlvector.h' is imported from 'import' dir in package.\n Use soapcpp2 -j to generate improved proxy and server classes.\n - Use wsdl2h -c and -s to generate pure C code or C++ code without STL.\n - Use 'typemap.dat' to control namespace bindings and type mappings.\n It is strongly recommended to customize the names of the namespace prefixes\n generated by wsdl2h. To do so, modify the prefix bindings in the Namespaces\n section below and add the modified lines to 'typemap.dat' to rerun wsdl2h.\n - Use Doxygen (www.doxygen.org) on this file to generate documentation.\n - Use wsdl2h -R to generate REST operations.\n - Use wsdl2h -nname to use name as the base namespace prefix instead of 'ns'.\n - Use wsdl2h -Nname for service prefix and produce multiple service bindings\n - Use wsdl2h -d to enable DOM support for xsd:anyType.\n - Use wsdl2h -g to auto-generate readers and writers for root elements.\n - Use wsdl2h -b to auto-generate bi-directional operations (duplex ops).\n - Use wsdl2h -U to map XML names to C++ Unicode identifiers instead of _xNNNN.\n - Use wsdl2h -u to disable the generation of unions.\n - Struct/class members serialized as XML attributes are annotated with a '@'.\n - Struct/class members that have a special role are annotated with a '$'.\n\n@warning\n DO NOT INCLUDE THIS ANNOTATED FILE DIRECTLY IN YOUR PROJECT SOURCE CODE.\n USE THE FILES GENERATED BY soapcpp2 FOR YOUR PROJECT'S SOURCE CODE:\n THE soapStub.h FILE CONTAINS THIS CONTENT WITHOUT ANNOTATIONS.\n\n", outfile ? outfile : "this file"); fprintf(stream, "@copyright LICENSE:\n@verbatim\n%s@endverbatim\n\n*/\n\n", licensenotice); // gsoap compiler options: 'w' disables WSDL/schema output to avoid file collisions if (cflag) fprintf(stream, "\n//gsoapopt c,w\n"); else if (c11flag) fprintf(stream, "\n//gsoapopt c++11,w\n"); else fprintf(stream, "\n//gsoapopt c++,w\n"); banner("Definitions", definitions.targetNamespace ? definitions.targetNamespace : "targetNamespace"); // copy documentation from WSDL definitions if (definitions.documentation) { fprintf(stream, "/* WSDL Documentation:\n\n"); text(definitions.documentation); fprintf(stream, "*/\n\n"); } if (definitions.version) { banner("Version", definitions.version); fprintf(stream, "#define SOAP_WSDL_VERSION \"%s\"\n", definitions.version); } if (!cflag) { const char *s; if (!sflag) { s = types.vname("$CONTAINER"); if (s && *s != '*' && *s != '$') { banner("$CONTAINER", s); fprintf(stream, "template class %s;\n", s); } } s = types.vname("$POINTER"); if (s && *s != '*' && *s != '$') { banner("$POINTER", s); fprintf(stream, "volatile template class %s;\n", s); } } banner("Import"); if (!cflag && !sflag) { fprintf(stream, "#import \"stl.h\"\t// enable STL containers when used (option -s removes STL dependency)\n"); } if (dflag) { fprintf(stream, "\n// dom.h declares the DOM xsd__anyType object (compiler and link with dom.cpp)\n"); fprintf(stream, "#import \"dom.h\"\n"); } if (mflag) { fprintf(stream, "#import \""); fprintf(stream, "xsd.h\"\t// import primitive XSD types.\n"); } for (SetOfString::const_iterator u = exturis.begin(); u != exturis.end(); ++u) { bool found = false; size_t n = strlen(*u); for (SetOfString::const_iterator i = definitions.builtinTypes().begin(); i != definitions.builtinTypes().end(); ++i) { if (**i == '"' && !strncmp(*u, *i + 1, n) && (*i)[n+1] == '"') { found = true; break; } } if (!found) { for (SetOfString::const_iterator j = definitions.builtinElements().begin(); j != definitions.builtinElements().end(); ++j) { if (**j == '"' && !strncmp(*u, *j + 1, n) && (*j)[n+1] == '"') { found = true; break; } } } if (!found) { for (SetOfString::const_iterator k = definitions.builtinAttributes().begin(); k != definitions.builtinAttributes().end(); ++k) { if (**k == '"' && !strncmp(*u, *k + 1, n) && (*k)[n+1] == '"') { found = true; break; } } } if (found) { if (vflag) fprintf(stderr, "import %s\n", *u); fprintf(stream, "#import \"%s.h\"\t// %s = <%s>\n", types.nsprefix(NULL, *u), types.nsprefix(NULL, *u), *u); } } banner("Schema Namespaces"); // Determine if bindings use SOAP 1.2 soap12 = false; for (Namespace *p = definitions.soap->local_namespaces; p && p->id; p++) { if (p->out && !strcmp(p->id, "soap") && !strcmp(p->out, "http://schemas.xmlsoap.org/wsdl/soap12/")) { soap12 = true; break; } } if (!soap12) { for (vector::const_iterator i = definitions.import.begin(); i != definitions.import.end(); ++i) { if ((*i).definitionsPtr()) { for (Namespace *p = (*i).definitionsPtr()->soap->local_namespaces; p && p->id; p++) { if (p->out && !strcmp(p->id, "soap") && !strcmp(p->out, "http://schemas.xmlsoap.org/wsdl/soap12/")) { soap12 = true; break; } } } if (soap12) break; } } if (definitions.types) { fprintf(stream, "\n/* NOTE:\n\nIt is strongly recommended to customize the names of the namespace prefixes\ngenerated by wsdl2h. To do so, modify the prefix bindings below and add the\nmodified lines to typemap.dat to rerun wsdl2h:\n\n"); if (definitions.targetNamespace && *definitions.targetNamespace) fprintf(stream, "%s = \"%s\"\n", types.nsprefix(service_prefix, definitions.targetNamespace), definitions.targetNamespace); for (vector::const_iterator schema1 = definitions.types->xs__schema_.begin(); schema1 != definitions.types->xs__schema_.end(); ++schema1) if ((*schema1)->targetNamespace && *(*schema1)->targetNamespace && (!definitions.targetNamespace || strcmp((*schema1)->targetNamespace, definitions.targetNamespace))) fprintf(stream, "%s = \"%s\"\n", types.nsprefix(NULL, (*schema1)->targetNamespace), (*schema1)->targetNamespace); fprintf(stream, "\n*/\n"); for (vector::const_iterator schema2 = definitions.types->xs__schema_.begin(); schema2 != definitions.types->xs__schema_.end(); ++schema2) { const char *t = types.nsprefix(NULL, (*schema2)->targetNamespace); if (t) { fprintf(stream, "\n"); types.document((*schema2)->annotation); fprintf(stream, "#define SOAP_NAMESPACE_OF_%s\t\"%s\"\n", types.aname(NULL, NULL, t), urienc(definitions.soap, (*schema2)->targetNamespace)); fprintf(stream, schemaformat, t, "namespace", urienc(definitions.soap, (*schema2)->targetNamespace)); if ((*schema2)->elementFormDefault == (*schema2)->attributeFormDefault) fprintf(stream, schemaformat, t, "form", (*schema2)->elementFormDefault == qualified ? "qualified" : "unqualified"); else { fprintf(stream, schemaformat, t, "elementForm", (*schema2)->elementFormDefault == qualified ? "qualified" : "unqualified"); fprintf(stream, schemaformat, t, "attributeForm", (*schema2)->attributeFormDefault == qualified ? "qualified" : "unqualified"); } } } } // generate the prototypes first: these should allow use before def, e.g. class names then generate the defs // check if xsd:anyType is used if (!cflag && !pflag) { for (SetOfString::const_iterator i = definitions.builtinTypes().begin(); i != definitions.builtinTypes().end(); ++i) { if (!cflag && !strcmp(*i, "xs:anyType")) { pflag = 1; break; } } } // produce built-in primitive types, limited to the ones that are used only banner("Built-in Schema Types and Top-Level Elements and Attributes"); // define xsd:anyType first, if used if (!cflag && !dflag && pflag) { const char *s, *t; t = types.cname(NULL, NULL, "xs:anyType"); s = types.deftypemap[t]; if (s) { if (*s) { if (!mflag) fprintf(stream, "/// Built-in XSD type \"xs:anyType\".\n%s\n\n", s); } s = types.usetypemap[t]; if (s) { if (mflag) fprintf(stream, "// xsd.h: should define type %s\n\n", s); types.knames.insert(s); } } else { fprintf(stderr, "\nError: no xsd__anyType defined in type map\n"); pflag = 0; } } if (Pflag) pflag = 0; if (vflag) fprintf(stderr, "\nGenerating built-in types\n"); for (SetOfString::const_iterator i = definitions.builtinTypes().begin(); i != definitions.builtinTypes().end(); ++i) { const char *s, *t; if (!cflag && !strcmp(*i, "xs:anyType")) continue; t = types.cname(NULL, NULL, *i); s = types.deftypemap[t]; if (s) { if (*s) { if (**i == '"') fprintf(stream, "/// Imported XSD type \"%s\" from typemap \"%s\".\n", *i, mapfile ? mapfile : ""); else fprintf(stream, "/// Built-in XSD type \"%s\".\n", *i); if (mflag) fprintf(stream, "// (declaration of %s removed by option -m)\n\n", t); else if (!iflag && !imported(*i)) { types.format(s); fprintf(stream, "\n"); } } s = types.usetypemap[t]; if (s && *s) { if (mflag && **i != '"') fprintf(stream, "// xsd.h: typemap override of XSD type %s with %s\n\n", t, s); if (types.knames.find(s) == types.knames.end()) types.knames.insert(s); } } } for (SetOfString::const_iterator i = definitions.builtinTypes().begin(); i != definitions.builtinTypes().end(); ++i) { const char *s, *t; if (!cflag && !strcmp(*i, "xs:anyType")) continue; t = types.cname(NULL, NULL, *i); s = types.deftypemap[t]; if (!s) { if (!mflag) { if (**i == '"') fprintf(stream, "// Imported XSD type \"%s\" defined by %s.\n", *i, t); else if (!iflag) { s = types.tname(NULL, NULL, "xsd:string"); fprintf(stream, "/// Primitive built-in type \"%s\".\n", *i); fprintf(stream, "typedef %s %s;\n\n", s, t); types.deftname(TYPEDEF, false, types.is_ptr(NULL, NULL, "xsd:string"), NULL, NULL, *i); const char *u = types.uri(*i); if (u && !types.uris[u]) { fprintf(stream, schemaformat, types.nsprefix(types.prefix(*i), u), "namespace", u); fprintf(stream, "\n"); } } } else if (**i == '"') fprintf(stream, "// Imported XSD type \"%s\" defined by %s.\n", *i, t); else fprintf(stream, "// xsd.h: should define type %s\n", t); types.deftname(TYPEDEF, false, false, NULL, NULL, *i); } if (pflag && !strncmp(*i, "xs:", 3)) // only xsi types are polymorph { s = types.aname(NULL, NULL, *i); if (!mflag) { fprintf(stream, "/// Class wrapper for built-in type \"%s\" derived from xsd__anyType.\n/// Use virtual method soap_type() == SOAP_TYPE_%s to check runtime type (see soapStub.h).\n", *i, s); fprintf(stream, "class %s : public xsd__anyType\n{ public:\n", s); fprintf(stream, elementformat, types.tname(NULL, NULL, *i), "__item;"); fprintf(stream, "\n};\n\n"); } types.knames.insert(s); } } // produce built-in primitive elements, limited to the ones that are used only if (vflag) fprintf(stderr, "\nGenerating built-in elements\n"); for (SetOfString::const_iterator j = definitions.builtinElements().begin(); j != definitions.builtinElements().end(); ++j) { const char *s, *t; t = types.cname("_", NULL, *j); s = types.deftypemap[t]; if (s) { if (*s) { if (**j == '"') fprintf(stream, "/// Imported element \"%s\" from typemap \"%s\".\n", *j, mapfile ? mapfile : ""); else fprintf(stream, "/// Built-in element \"%s\".\n", *j); if (mflag) fprintf(stream, "// (declaration of %s removed by option -m)\n\n", t); else if (!iflag && !imported(*j)) { types.format(s); fprintf(stream, "\n"); } } s = types.usetypemap[t]; if (s && *s) { if (mflag && **j != '"') fprintf(stream, "// xsd.h: typemap override of element %s with %s\n\n", t, s); if (types.knames.find(s) == types.knames.end()) types.knames.insert(s); } } else { if (!mflag) { if (**j == '"') fprintf(stream, "// Imported element \"%s\" declared as %s.\n", *j, t); else if (!iflag && !imported(*j)) { s = types.tname(NULL, NULL, "xsd:any"); fprintf(stream, "/// Built-in element \"%s\".\n", *j); fprintf(stream, "typedef %s %s;\n\n", s, t); types.deftname(TYPEDEF, false, true, "_", NULL, *j); // already pointer const char *u = types.uri(*j); if (u && !types.uris[u]) { fprintf(stream, schemaformat, types.nsprefix(types.prefix(*j), u), "namespace", u); fprintf(stream, "\n"); } } } else if (**j == '"') fprintf(stream, "// Imported element \"%s\" declared as %s.\n\n", *j, t); else fprintf(stream, "// xsd.h: should define element %s\n\n", t); types.deftname(TYPEDEF, false, false, "_", NULL, *j); } } // produce built-in primitive attributes, limited to the ones that are used only if (vflag) fprintf(stderr, "\nGenerating built-in attributes\n"); for (SetOfString::const_iterator k = definitions.builtinAttributes().begin(); k != definitions.builtinAttributes().end(); ++k) { const char *s, *t; t = types.cname("_", NULL, *k); s = types.deftypemap[t]; if (s) { if (*s) { if (**k == '"') fprintf(stream, "/// Imported attribute \"%s\" from typemap \"%s\".\n", *k, mapfile ? mapfile : ""); else fprintf(stream, "/// Built-in attribute \"%s\".\n", *k); if (mflag) fprintf(stream, "// (declaration of %s removed by option -m)\n\n", t); else if (!iflag && !imported(*k)) { types.format(s); fprintf(stream, "\n"); } } s = types.usetypemap[t]; if (s && *s) { if (mflag && **k != '"') fprintf(stream, "// xsd.h: typemap override of attribute %s with %s\n\n", t, s); if (types.knames.find(s) == types.knames.end()) types.knames.insert(s); } } else { s = types.tname(NULL, NULL, "xsd:string"); if (!mflag) { if (**k == '"') fprintf(stream, "// Imported attribute \"%s\" declared as %s.\n", *k, t); else if (!iflag && !imported(*k)) { fprintf(stream, "/// Built-in attribute \"%s\".\n", *k); fprintf(stream, "typedef %s %s;\n\n", s, t); const char *u = types.uri(*k); if (u && !types.uris[u]) { fprintf(stream, schemaformat, types.nsprefix(types.prefix(*k), u), "namespace", u); fprintf(stream, "\n"); } } } else if (**k == '"') fprintf(stream, "// Imported attribute \"%s\" declared as %s.\n\n", *k, t); else fprintf(stream, "// xsd.h: should define attribute %s\n\n", t); types.deftname(TYPEDEF, false, types.is_ptr(NULL, NULL, "xsd:string"), "_", NULL, *k); } } // produce types // define class/struct types first if (!cflag) banner("Forward Declarations"); if (definitions.types) { comment("Definitions", defs, "types", definitions.types->documentation); fprintf(stream, "\n"); for (vector::const_iterator schema4 = definitions.types->xs__schema_.begin(); schema4 != definitions.types->xs__schema_.end(); ++schema4) { if (vflag) fprintf(stderr, "\nDefining types in %s\n", (*schema4)->targetNamespace); for (vector::const_iterator complexType = (*schema4)->complexType.begin(); complexType != (*schema4)->complexType.end(); ++complexType) types.define((*schema4)->targetNamespace, NULL, *complexType); if (vflag) fprintf(stderr, "\nDefining elements in %s\n", (*schema4)->targetNamespace); for (vector::const_iterator element = (*schema4)->element.begin(); element != (*schema4)->element.end(); ++element) { if (!(*element).type && !(*element).abstract) { if ((*element).complexTypePtr()) types.define((*schema4)->targetNamespace, (*element).name, *(*element).complexTypePtr()); else if (!(*element).simpleTypePtr()) { fprintf(stream, "/// @brief Top-level root element \"%s\":%s.\n", (*schema4)->targetNamespace, (*element).name); if (gflag) { const char *t = types.deftname(TYPEDEF, false, false, "_", (*schema4)->targetNamespace, (*element).name); if (t) fprintf(stream, "typedef _XML %s;\n\n", t); else fprintf(stream, "// Element definition intentionally left blank.\n\n"); types.ptrtypemap[t] = types.usetypemap[t] = "_XML"; } else { const char *s = types.cname("_", (*schema4)->targetNamespace, (*element).name); types.ptrtypemap[s] = types.usetypemap[s] = "_XML"; fprintf(stream, "/// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code.\n\n"); } } } } } // visit types with lowest base level first int baseLevel = 1; bool found; do { found = (baseLevel == 1); for (vector::iterator schema = definitions.types->xs__schema_.begin(); schema != definitions.types->xs__schema_.end(); ++schema) { if (found) banner("Schema Types and Top-Level Elements and Attributes", (*schema)->targetNamespace); for (vector::iterator simpleType = (*schema)->simpleType.begin(); simpleType != (*schema)->simpleType.end(); ++simpleType) { if ((*simpleType).baseLevel() == baseLevel) { found = true; types.gen((*schema)->targetNamespace, NULL, *simpleType, false, false); } } for (vector::iterator element = (*schema)->element.begin(); element != (*schema)->element.end(); ++element) { if (!(*element).type && (*element).simpleTypePtr() && (*element).simpleTypePtr()->baseLevel() == baseLevel) { found = true; if ((*element).type) fprintf(stream, "/// @brief Top-level root element \"%s\":%s of simpleType %s.\n", (*schema)->targetNamespace, (*element).name, (*element).type); types.document((*element).annotation); types.gen((*schema)->targetNamespace, (*element).name, *(*element).simpleTypePtr(), false, false); } if (!(*element).type && (*element).complexTypePtr() && (*element).complexTypePtr()->baseLevel() == baseLevel) found = true; } for (vector::const_iterator attribute = (*schema)->attribute.begin(); attribute != (*schema)->attribute.end(); ++attribute) { if (!(*attribute).type && (*attribute).simpleTypePtr() && (*attribute).simpleTypePtr()->baseLevel() == baseLevel) { found = true; if ((*attribute).type) fprintf(stream, "/// @brief Top-level attribute \"%s\":%s of simpleType %s.\n", (*schema)->targetNamespace, (*attribute).name, (*attribute).type); types.document((*attribute).annotation); types.gen((*schema)->targetNamespace, (*attribute).name, *(*attribute).simpleTypePtr(), false, false); // URI = NULL won't generate type in schema (type without namespace qualifier) } } for (vector::iterator complexType = (*schema)->complexType.begin(); complexType != (*schema)->complexType.end(); ++complexType) { if ((*complexType).baseLevel() == baseLevel) found = true; } } ++baseLevel; } while (found); // generate complex type defs. Problem: what if a simpleType restriction/extension depends on a complexType simpleContent restriction/extension? int maxLevel = baseLevel; for (baseLevel = 1; baseLevel < maxLevel; ++baseLevel) { for (vector::iterator schema = definitions.types->xs__schema_.begin(); schema != definitions.types->xs__schema_.end(); ++schema) { if (baseLevel == 1) banner("Schema Complex Types and Top-Level Elements", (*schema)->targetNamespace); for (vector::iterator complexType = (*schema)->complexType.begin(); complexType != (*schema)->complexType.end(); ++complexType) { if ((*complexType).baseLevel() == baseLevel) types.gen((*schema)->targetNamespace, NULL, *complexType, false); } for (vector::iterator element = (*schema)->element.begin(); element != (*schema)->element.end(); ++element) { if (!(*element).type && (*element).complexTypePtr() && (*element).complexTypePtr()->baseLevel() == baseLevel) { fprintf(stream, "/// @brief Top-level root element \"%s\":%s\n", (*schema)->targetNamespace, (*element).name); types.document((*element).annotation); types.gen((*schema)->targetNamespace, (*element).name, *(*element).complexTypePtr(), false); } } } } for (vector::iterator schema = definitions.types->xs__schema_.begin(); schema != definitions.types->xs__schema_.end(); ++schema) { for (vector::iterator simpleType = (*schema)->simpleType.begin(); simpleType != (*schema)->simpleType.end(); ++simpleType) { if ((*simpleType).baseLevel() <= 0) { const char *t = types.deftname(TYPEDEF, false, false, NULL, (*schema)->targetNamespace, (*simpleType).name); fprintf(stderr, "\nError: circular restriction/extension \n", (*simpleType).name ? (*simpleType).name : ""); fprintf(stream, "\n/// @todo !FIXME! @warning %s is a simpleType with circular restriction/extension.\n", (*simpleType).name ? (*simpleType).name : ""); fprintf(stream, "typedef _XML %s;\n\n", t); types.ptrtypemap[t] = types.usetypemap[t] = "_XML"; } } for (vector::iterator complexType = (*schema)->complexType.begin(); complexType != (*schema)->complexType.end(); ++complexType) { if ((*complexType).baseLevel() <= 0) { fprintf(stderr, "\nError: circular restriction/extension \n", (*complexType).name ? (*complexType).name : ""); fprintf(stream, "\n\n/// @todo !FIXME! @warning %s is a complexType with circular restriction/extension.\n", (*complexType).name ? (*complexType).name : ""); if (cflag) fprintf(stream, "struct %s { };\n\n", types.cname(NULL, (*schema)->targetNamespace, (*complexType).name)); else fprintf(stream, "class %s { };\n\n", types.cname(NULL, (*schema)->targetNamespace, (*complexType).name)); } } } // option to consider: generate local complexTypes iteratively /* for (MapOfStringToType::const_iterator local = types.locals.begin(); local != types.locals.end(); ++local) { types.gen(NULL, (*local).first, *(*local).second); } */ for (vector::iterator schema = definitions.types->xs__schema_.begin(); schema != definitions.types->xs__schema_.end(); ++schema) { if (vflag) fprintf(stderr, "\nGenerating elements in %s\n", (*schema)->targetNamespace); banner("Additional Top-Level Elements", (*schema)->targetNamespace); for (vector::iterator element = (*schema)->element.begin(); element != (*schema)->element.end(); ++element) { if ((*element).name && (*element).type && !(*element).abstract) { fprintf(stream, "/// @brief Top-level root element \"%s\":%s of XSD type %s.\n", (*schema)->targetNamespace, (*element).name, (*element).type); types.document((*element).annotation); if (!types.is_defined("_", (*schema)->targetNamespace, (*element).name)) { if (gflag) { const char *s = types.tnamenoptr(NULL, (*schema)->targetNamespace, (*element).type); const char *t = types.deftname(TYPEDEF, false, false, "_", (*schema)->targetNamespace, (*element).name); fprintf(stream, "typedef %s %s;\n\n", s, t); } else fprintf(stream, "/// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code.\n\n"); } else { const char *s = types.cname("_", (*schema)->targetNamespace, (*element).name); const char *t = types.deftypemap[s]; if (t && *t) { fprintf(stream, "/// Imported element \"%s\" from typemap \"%s\".\n", s, mapfile ? mapfile : ""); types.format(t); } else fprintf(stream, "// \"%s\" element definition intentionally left blank.\n", types.cname("_", (*schema)->targetNamespace, (*element).name)); } } } if (vflag) fprintf(stderr, "\nGenerating attributes in %s\n", (*schema)->targetNamespace); banner("Additional Top-Level Attributes", (*schema)->targetNamespace); for (vector::iterator attribute = (*schema)->attribute.begin(); attribute != (*schema)->attribute.end(); ++attribute) { if ((*attribute).name && (*attribute).type) { fprintf(stream, "/// @brief Top-level attribute \"%s\":%s of simpleType %s.\n", (*schema)->targetNamespace, (*attribute).name, (*attribute).type); types.document((*attribute).annotation); if (!types.is_defined("_", (*schema)->targetNamespace, (*attribute).name)) { if (gflag) { const char *s = types.tnamenoptr(NULL, (*schema)->targetNamespace, (*attribute).type); const char *t = types.deftname(TYPEDEF, false, false, "_", (*schema)->targetNamespace, (*attribute).name); fprintf(stream, "typedef %s %s;\n\n", s, t); } else fprintf(stream, "/// @note Use wsdl2h option -g to auto-generate a top-level attribute declaration and processing code.\n\n"); } else { const char *s = types.cname("_", (*schema)->targetNamespace, (*attribute).name); const char *t = types.deftypemap[s]; if (t && *t) { fprintf(stream, "/// Imported attribute \"%s\" from typemap \"%s\".\n", s, mapfile ? mapfile : ""); types.format(t); } else fprintf(stream, "// \"%s\" attribute definition intentionally left blank.\n", types.cname("_", (*schema)->targetNamespace, (*attribute).name)); } } } } } if (vflag) fprintf(stderr, "\nCollecting service bindings\n"); collect(definitions); if (!services.empty()) { banner("Services"); if (soap12) fprintf(stream, "// This service supports SOAP 1.2 namespaces:\n#import \"soap12.h\"\n"); for (MapOfStringToService::const_iterator service1 = services.begin(); service1 != services.end(); ++service1) { Service *sv = (*service1).second; if (sv && sv->prefix) { fprintf(stream, "\n"); if (sv->name) fprintf(stream, serviceformat, sv->prefix, "name", sv->name, ""); if (sv->type) fprintf(stream, serviceformat, sv->prefix, "type", sv->type, ""); for (SetOfString::const_iterator port = sv->location.begin(); port != sv->location.end(); ++port) fprintf(stream, serviceformat, sv->prefix, "port", (*port), ""); if (sv->URI) fprintf(stream, serviceformat, sv->prefix, "namespace", sv->URI, ""); if (sv->transport) fprintf(stream, serviceformat, sv->prefix, "transport", sv->transport, ""); } } fprintf(stream, "\n/** @mainpage %s Definitions\n", defs); if (definitions.version) { section(defs, "_version Version", NULL); text(definitions.version); } if (definitions.documentation) { section(defs, "_documentation Documentation", NULL); text(definitions.documentation); } if (definitions.types && definitions.types->documentation) { section(defs, "_types Schema Type Information", NULL); text(definitions.types->documentation); } section(defs, "_bindings Service Bindings", NULL); for (MapOfStringToService::const_iterator service2 = services.begin(); service2 != services.end(); ++service2) { Service *sv = (*service2).second; if (sv && sv->name) fprintf(stream, "\n - @ref %s\n", sv->name); } section(defs, "_more More Information", NULL); fprintf(stream, "\n - @ref page_notes \"Notes\"\n"); if (!definitions.vprop__property.empty()) fprintf(stream, "\n - @ref page_bpel \"BPEL 2.0 Variables\"\n"); fprintf(stream, "\n - @ref page_XMLDataBinding \"XML Data Binding\"\n"); if (!jflag) fprintf(stream, "\n - @ref SOAP_ENV__Header \"SOAP Header Content\" (when applicable)\n"); if (!jflag) fprintf(stream, "\n - @ref SOAP_ENV__Detail \"SOAP Fault Detail Content\" (when applicable)\n"); fprintf(stream, "\n\n*/\n"); for (MapOfStringToService::const_iterator service3 = services.begin(); service3 != services.end(); ++service3) { Service *sv = (*service3).second; if (sv && sv->name) { fprintf(stream, "\n/**\n"); page(sv->name, " Binding", sv->name); for (MapOfStringToString::const_iterator service_doc = sv->service_documentation.begin(); service_doc != sv->service_documentation.end(); ++service_doc) { const char *name = types.aname(NULL, NULL, (*service_doc).first); section(name, "_service Service Documentation", (*service_doc).first); text((*service_doc).second); } for (MapOfStringToString::const_iterator port_doc = sv->port_documentation.begin(); port_doc != sv->port_documentation.end(); ++port_doc) { const char *name = types.aname(NULL, NULL, (*port_doc).first); section(name, "_port Port Documentation", (*port_doc).first); text((*port_doc).second); } for (MapOfStringToString::const_iterator binding_doc = sv->binding_documentation.begin(); binding_doc != sv->binding_documentation.end(); ++binding_doc) { const char *name = types.aname(NULL, NULL, (*binding_doc).first); section(name, "_binding Binding Documentation", (*binding_doc).first); text((*binding_doc).second); } section(sv->name, "_operations Operations of Binding", sv->name); for (vector::const_iterator op = sv->operation.begin(); op != sv->operation.end(); ++op) { if (*op && (*op)->input && (*op)->input_name) fprintf(stream, "\n - @ref %s\n", (*op)->input_name); else if (*op && (*op)->output_name) fprintf(stream, "\n - @ref %s\n", (*op)->output_name); } if (!sv->role.empty()) { section(sv->name, "_plnk BPEL 2.0 Partner Links for Binding", sv->name); gen_plnk(*sv); } section(sv->name, "_ports Endpoints of Binding", sv->name); for (SetOfString::const_iterator port = sv->location.begin(); port != sv->location.end(); ++port) fprintf(stream, "\n - %s\n", *port); if (!sv->policy.empty()) { section(sv->name, "_policy Policy of Binding", sv->name); fprintf(stream, "\nSee Section @ref %s_policy_enablers\n", sv->name); gen_policy(*sv, sv->policy, "service endpoint ports", types); } if (!service_prefix) { if (binding_count > 1) fprintf(stream, "\n@note Multiple service bindings collected as one, use wsdl2h option -Nname to produce a separate service for each binding\n"); else fprintf(stream, "\n@note Use wsdl2h option -Nname to change the service binding prefix name\n"); } fprintf(stream, "\n\n*/\n"); } } } generate(); if (definitions.types) { gen_vprop(definitions, types); banner("XML Data Binding"); fprintf(stream, "\n/**\n"); page("page_XMLDataBinding", " XML Data Binding", NULL); fprintf(stream, "\nSOAP/XML services use data bindings contractually bound by WSDL and auto-\ngenerated by wsdl2h and soapcpp2 (see Service Bindings). Plain data bindings\nare adopted from XML schemas as part of the WSDL types section or when running\nwsdl2h on a set of schemas to produce non-SOAP-based XML data bindings.\n\nThe following readers and writers are C/C++ data type (de)serializers auto-\ngenerated by wsdl2h and soapcpp2. Run soapcpp2 on this file to generate the\n(de)serialization code, which is stored in soapC.c[pp]. Include \"soapH.h\" in\nyour code to import these data type and function declarations. Only use the\nsoapcpp2-generated files in your project build. Do not include the wsdl2h-\ngenerated .h file in your code.\n\nData can be read and deserialized from:\n - an int file descriptor, using soap->recvfd = fd\n - a socket, using soap->socket = (int)...\n - a C++ stream (istream, stringstream), using soap->is = (istream*)...\n - a C string, using soap->is = (const char*)...\n - any input, using the soap->frecv() callback\n\nData can be serialized and written to:\n - an int file descriptor, using soap->sendfd = (int)...\n - a socket, using soap->socket = (int)...\n - a C++ stream (ostream, stringstream), using soap->os = (ostream*)...\n - a C string, using soap->os = (const char**)...\n - any output, using the soap->fsend() callback\n\nThe following options are available for (de)serialization control:\n - soap->encodingStyle = NULL; to remove SOAP 1.1/1.2 encodingStyle\n - soap_mode(soap, SOAP_XML_TREE); XML without id-ref (no cycles!)\n - soap_mode(soap, SOAP_XML_GRAPH); XML with id-ref (including cycles)\n - soap_set_namespaces(soap, struct Namespace *nsmap); to set xmlns bindings\n\n"); for (vector::const_iterator schema5 = definitions.types->xs__schema_.begin(); schema5 != definitions.types->xs__schema_.end(); ++schema5) { const char *prefix = types.nsprefix(NULL, (*schema5)->targetNamespace); fprintf(stream, "\n@section %s Top-level root elements of schema \"%s\"\n", prefix ? prefix : "default", (*schema5)->targetNamespace); for (vector::const_iterator element = (*schema5)->element.begin(); element != (*schema5)->element.end(); ++element) { if (prefix) fprintf(stream, "\n - <%s:%s> ", prefix, (*element).name); else fprintf(stream, "\n - <%s> ", (*element).name); const char *cname = types.cname("_", (*schema5)->targetNamespace, (*element).name); if (types.is_defined("_", (*schema5)->targetNamespace, (*element).name)) { const char *pname = types.pname(true, false, "_", (*schema5)->targetNamespace, (*element).name); fprintf(stream, "@ref %s\n", cname); fprintf(stream, " @code\n // Reader (returns SOAP_OK on success):\n soap_read_%s(struct soap*, %s);\n // Writer (returns SOAP_OK on success):\n soap_write_%s(struct soap*, %s);\n @endcode\n", cname, pname, cname, pname); } else fprintf(stream, "(use wsdl2h option -g to auto-generate type %s)\n", cname); } } fprintf(stream, "\n*/\n"); } if (cppnamespace) fprintf(stream, "\n} // namespace %s\n", cppnamespace); fprintf(stream, "\n/* End of %s */\n", outfile ? outfile : "file"); } void Definitions::generate() { MapOfStringToMessage headers; MapOfStringToMessage faults; const char *t; for (MapOfStringToService::const_iterator service1 = services.begin(); service1 != services.end(); ++service1) { if ((*service1).second) { for (MapOfStringToMessage::const_iterator header = (*service1).second->header.begin(); header != (*service1).second->header.end(); ++header) headers[(*header).first] = (*header).second; for (MapOfStringToMessage::const_iterator fault = (*service1).second->fault.begin(); fault != (*service1).second->fault.end(); ++fault) faults[(*fault).first] = (*fault).second; } } // Generate SOAP Header definition t = types.deftypemap["SOAP_ENV__Header"]; if (t && *t) { banner("Custom SOAP Header"); types.format(t); } else if (!jflag && !headers.empty()) { banner("SOAP Header"); fprintf(stream, "/**\n\nThe SOAP Header is part of the gSOAP context and its content is accessed\nthrough the soap.header variable. You may have to set the soap.actor variable\nto serialize SOAP Headers with SOAP-ENV:actor or SOAP-ENV:role attributes.\nUse option -j to remove entire SOAP Header definition.\nUse option -k to remove the mustUnderstand qualifiers.\n\n*/\n"); fprintf(stream, "mutable struct SOAP_ENV__Header\n{\n"); for (MapOfStringToMessage::const_iterator header = headers.begin(); header != headers.end(); ++header) { if ((*header).second->use == encoded && (*header).second->URI && *(*header).second->URI) fprintf(stream, schemaformat, types.nsprefix(NULL, (*header).second->URI), "namespace", (*header).second->URI); comment("Header", (*header).first, "WSDL", (*header).second->ext_documentation); comment("Header", (*header).first, "SOAP", (*header).second->documentation); if ((*header).second->mustUnderstand && !kflag) { fprintf(stream, elementformat, "mustUnderstand", "// must be understood by receiver"); fprintf(stream, "\n"); } if ((*header).second->part && (*header).second->part->elementPtr()) { fprintf(stream, "/// \"%s\" SOAP Header part element.\n", (*header).second->part->name); if ((*header).second->part->elementPtr()->type && (*header).second->part->element) fprintf(stream, elementformat, types.pname(true, false, NULL, NULL, (*header).second->part->elementPtr()->type), types.aname(NULL, NULL, (*header).second->part->element)); else if ((*header).second->part->element) fprintf(stream, elementformat, types.pname(true, false, "_", NULL, (*header).second->part->element), types.aname(NULL, NULL, (*header).second->part->element)); else fprintf(stream, elementformat, types.pname(true, false, "_", NULL, (*header).second->part->elementPtr()->name), (*header).first); fprintf(stream, ";\n"); } else if ((*header).second->part && (*header).second->part->type) { fprintf(stream, "/// \"%s\" SOAP Header part type.\n", (*header).second->part->type); fprintf(stream, elementformat, types.pname(true, false, NULL, NULL, (*header).second->part->type), types.aname(NULL, (*header).second->URI, (*header).second->part->name)); fprintf(stream, ";\n"); } else if ((*header).second->element) { fprintf(stream, "/// \"%s\" SOAP Header element", (*header).second->name); (*header).second->generate(types, ";", false, true, false, true); fprintf(stream, "\n"); } else { if ((*header).second->part && (*header).second->part->element) fprintf(stream, elementformat, types.pname(true, false, "_", NULL, (*header).second->part->element), (*header).first); else fprintf(stream, pointerformat, (*header).first, (*header).first); fprintf(stream, ";\t///< @todo Please check element name and type (imported type)\n"); } } types.modify("SOAP_ENV__Header"); fprintf(stream, "\n};\n\n"); } // Generate Fault detail element definitions for (MapOfStringToMessage::const_iterator fault = faults.begin(); fault != faults.end(); ++fault) { if ((*fault).second->use == encoded) { fprintf(stream, schemaformat, types.nsprefix(NULL, (*fault).second->URI), "namespace", (*fault).second->URI); fprintf(stream, "/// SOAP Fault message \"%s\":%s.\n", (*fault).second->URI, (*fault).second->message->name); comment("Fault", (*fault).first, "WSDL", (*fault).second->ext_documentation); comment("Fault", (*fault).first, "SOAP", (*fault).second->documentation); if (cflag) fprintf(stream, "struct %s\n{", (*fault).first); else fprintf(stream, "class %s\n{ public:", (*fault).first); (*fault).second->generate(types, ";", false, true, false, true); if (!cflag) { fprintf(stream, "\n"); fprintf(stream, pointerformat, "struct soap", "soap"); fprintf(stream, ";"); } fprintf(stream, "\n};\n\n"); if (cflag) fprintf(stream, "typedef struct %s %s;\n\n", (*fault).first, (*fault).first); } } t = types.deftypemap["SOAP_ENV__Detail"]; if (t && *t) { banner("Custom SOAP Fault Detail"); types.format(t); } else if (!jflag && !faults.empty()) { SetOfString fault_elements; banner("SOAP Fault Detail"); fprintf(stream, "/**\n\nThe SOAP Fault is part of the gSOAP context and its content is accessed\nthrough the soap.fault->detail variable (SOAP 1.1) or the\nsoap.fault->SOAP_ENV__Detail variable (SOAP 1.2).\nUse wsdl2h option -j to omit these declarations.\n\n*/\n"); fprintf(stream, "mutable struct SOAP_ENV__Detail\n{\n"); if (dflag) { const char *t = types.tname(NULL, NULL, "xsd:anyAttribute"); fprintf(stream, attributeformat, t, "__anyAttribute"); fprintf(stream, ";\t///< Catch any attribute content in DOM.\n"); } else fprintf(stream, "/// xsd:anyAttribute omitted: to parse attribute content of the Detail element into DOM anyAttribute, use wsdl2h option -d.\n"); types.modify("SOAP_ENV__Detail"); /* See below */ /* The DOM representation is not desired since faultdetail is NULL. However, future options may reenable this feature (see keep code here). const char *t = types.tname(NULL, NULL, "xsd:any"); fprintf(stream, elementformat, t, "__any"); if (dflag) fprintf(stream, ";\t///< Catch any element content in DOM.\n"); else fprintf(stream, ";\t///< Catch any element content in XML string.\n"); */ for (MapOfStringToMessage::const_iterator fault = faults.begin(); fault != faults.end(); ++fault) { comment("Fault", (*fault).first, "WSDL", (*fault).second->ext_documentation); comment("Fault", (*fault).first, "SOAP", (*fault).second->documentation); if ((*fault).second->message) { const char *name = (*fault).second->message->name; if (!name) name = "?"; if ((*fault).second->use == literal) { for (vector::const_iterator part = (*fault).second->message->part.begin(); part != (*fault).second->message->part.end(); ++part) { if ((*part).elementPtr()) { if (fault_elements.find((*part).element) == fault_elements.end()) { fprintf(stream, "/// SOAP Fault message \"%s\" part \"%s\" element \"%s\".\n", name, (*part).name ? (*part).name : "", (*part).element ? (*part).element : ""); if ((*part).elementPtr()->type) fprintf(stream, elementformat, types.pname(true, false, NULL, NULL, (*part).elementPtr()->type), types.aname(NULL, (*fault).second->URI, (*part).element)); else fprintf(stream, elementformat, types.pname(true, false, "_", NULL, (*part).element), types.aname(NULL, (*fault).second->URI, (*part).element)); fprintf(stream, ";\n"); fault_elements.insert((*part).element); } } else if ((*part).name && (*part).type) { if (fault_elements.find((*part).name) == fault_elements.end()) { fprintf(stream, schemaformat, types.nsprefix(NULL, (*fault).second->URI), "namespace", (*fault).second->URI); fprintf(stream, "/// SOAP Fault message \"%s\" part \"%s\" type \"%s\".\n", name, (*part).name, (*part).type); fprintf(stream, elementformat, types.pname(true, false, NULL, NULL, (*part).type), types.aname(NULL, (*fault).second->URI, (*part).name)); fprintf(stream, ";\n"); fault_elements.insert((*part).name); } } else fprintf(stream, "// Unknown SOAP Fault message \"%s\":%s part \"%s\"\n", (*fault).second->URI, name, (*part).name ? (*part).name : ""); } } else { fprintf(stream, "/// SOAP Fault message \"%s\":%s\n", (*fault).second->URI, name); fprintf(stream, pointerformat, (*fault).first, types.aname(NULL, (*fault).second->URI, (*fault).second->message->name)); fprintf(stream, ";\n"); } } else if ((*fault).second->element) { if (fault_elements.find((*fault).second->name) == fault_elements.end()) { fprintf(stream, "/// SOAP Fault message \"%s\":%s\n", (*fault).second->URI, (*fault).second->element->name); fprintf(stream, elementformat, types.pname(true, false, "_", (*fault).second->URI, (*fault).second->element->name), (*fault).second->name); fprintf(stream, ";\n"); fault_elements.insert((*fault).second->name); } } } fprintf(stream, elementformat, "int", "__type"); fprintf(stream, ";\t///< set to SOAP_TYPE_X for a serializable type X\n"); fprintf(stream, pointerformat, "void", "fault"); fprintf(stream, ";\t///< points to serializable object of type X or NULL\n"); fprintf(stream, elementformat, "_XML", "__any"); fprintf(stream, ";\t///< Catch any other content in XML string.\n"); fprintf(stream, "};\n\n"); } /* The SOAP Fault struct below is autogenerated by soapcpp2 (kept here for future mods) if (!mflag && !faults.empty()) { fprintf(stream, "struct SOAP_ENV__Code\n{\n"); fprintf(stream, elementformat, "_QName", "SOAP_ENV__Value"); fprintf(stream, ";\n"); fprintf(stream, pointerformat, "char", "SOAP_ENV__Node"); fprintf(stream, ";\n"); fprintf(stream, pointerformat, "char", "SOAP_ENV__Role"); fprintf(stream, ";\n};\n"); fprintf(stream, "struct SOAP_ENV__Detail\n{\n"); fprintf(stream, elementformat, "int", "__type"); fprintf(stream, ";\n"); fprintf(stream, pointerformat, "void", "fault"); fprintf(stream, ";\n"); fprintf(stream, elementformat, "_XML", "__any"); fprintf(stream, ";\n};\n"); fprintf(stream, "struct SOAP_ENV__Fault\n{\n"); fprintf(stream, elementformat, "_QName", "faultcode"); fprintf(stream, ";\n"); fprintf(stream, pointerformat, "char", "faultstring"); fprintf(stream, ";\n"); fprintf(stream, pointerformat, "char", "faultactor"); fprintf(stream, ";\n"); fprintf(stream, pointerformat, "struct SOAP_ENV__Detail", "detail"); fprintf(stream, ";\n"); fprintf(stream, pointerformat, "struct SOAP_ENV__Code", "SOAP_ENV__Code"); fprintf(stream, ";\n"); fprintf(stream, pointerformat, "char", "SOAP_ENV__Reason"); fprintf(stream, ";\n"); fprintf(stream, pointerformat, "struct SOAP_ENV__Detail", "SOAP_ENV__Detail"); fprintf(stream, ";\n};\n"); } */ for (MapOfStringToService::const_iterator service2 = services.begin(); service2 != services.end(); ++service2) if ((*service2).second) (*service2).second->generate(types); } //////////////////////////////////////////////////////////////////////////////// // // Service methods // //////////////////////////////////////////////////////////////////////////////// Service::Service() { prefix = NULL; URI = NULL; name = NULL; type = NULL; transport = NULL; } void Service::generate(Types& types) { const char *method_name; banner("Service Binding", name); for (vector::const_iterator op2 = operation.begin(); op2 != operation.end(); ++op2) { if (*op2 && ((*op2)->input || bflag)) { bool flag = false, anonymous = ((*op2)->style != document && (*op2)->parameterOrder != NULL); if (!(*op2)->input) method_name = (*op2)->output_name; else method_name = (*op2)->input_name; banner("Service Operation", method_name); if ((*op2)->output && (*op2)->output_name) { if ((*op2)->style == document) flag = ((*op2)->output->element || ((*op2)->output->message && (*op2)->output->message->part.size() == 1)); else if (!wflag) flag = ((*op2)->output->element || ((*op2)->output->message && (*op2)->output->use == encoded && (*op2)->output->message->part.size() == 1 && !(*(*op2)->output->message->part.begin()).simpleTypePtr() && !(*(*op2)->output->message->part.begin()).complexTypePtr())); if (flag && (*op2)->input && (*op2)->output && (*op2)->input->message && (*(*op2)->output->message->part.begin()).element) for (vector::const_iterator part = (*op2)->input->message->part.begin(); part != (*op2)->input->message->part.end(); ++part) if ((*part).element && !strcmp((*part).element, (*(*op2)->output->message->part.begin()).element)) flag = false; if (!flag) { if (bflag) fprintf(stream, "/* soapcpp2 generates the following struct automatically for your use:\n"); fprintf(stream, "/// Operation response struct \"%s\" of operation \"%s\".\n", (*op2)->output_name, method_name); fprintf(stream, "struct %s\n{", (*op2)->output_name); (*op2)->output->generate(types, ";", anonymous, false, false, false); fprintf(stream, "\n};\n"); if (bflag) fprintf(stream, "*/\n"); } } fprintf(stream, "\n/** Operation \"%s\" of service binding \"%s\".\n", method_name, name); if ((*op2)->documentation) text((*op2)->documentation); if ((*op2)->operation_documentation) text((*op2)->operation_documentation); if ((*op2)->input && (*op2)->input->documentation) { fprintf(stream, "Input request:\n"); text((*op2)->input->documentation); } if ((*op2)->input && (*op2)->input->ext_documentation) { fprintf(stream, "Input request:\n"); text((*op2)->input->ext_documentation); } if ((*op2)->output) { if ((*op2)->output->documentation) { fprintf(stream, "Output response:\n"); text((*op2)->output->documentation); } if ((*op2)->output->ext_documentation) { fprintf(stream, "Output response:\n"); text((*op2)->output->ext_documentation); } } gen_policy(*this, (*op2)->policy, "operation", types); if ((*op2)->input) { gen_policy(*this, (*op2)->input->policy, "request message", types); if ((*op2)->input->content) { fprintf(stream, "\n - Request message MIME content"); if ((*op2)->input->content->type) { fprintf(stream, " type=\""); text((*op2)->input->content->type); fprintf(stream, "\""); } if ((*op2)->input->content->type && !strcmp((*op2)->input->content->type, "application/x-www-form-urlencoded")) fprintf(stream, "\n Use the httpform.c plugin to retrieve key-value pairs from the REST request\n message form data at the server side (client side is automated).\n"); else fprintf(stream, "\n @todo This form of MIME content is not automatically handled.\n"); } } if ((*op2)->output) { gen_policy(*this, (*op2)->output->policy, "response message", types); if ((*op2)->output->content) { fprintf(stream, "\n - Response message MIME content"); if ((*op2)->output->content->type) { fprintf(stream, " type=\""); text((*op2)->output->content->type); fprintf(stream, "\""); } fprintf(stream, "\n @todo This form of MIME content response is not automatically handled.\n Use one-way request and implement code to parse response.\n"); } } else fprintf(stream, "\n - One-way service request message\n"); if ((*op2)->mep) fprintf(stream, "\n - SOAP MEP: \"%s\"\n", ((*op2)->mep)); if ((*op2)->style == document) fprintf(stream, "\n - %s %s messaging\n", (*op2)->protocol, (*op2)->input && (*op2)->input->content && (*op2)->input->content->type ? (*op2)->input->content->type : "document/literal style"); else if ((*op2)->input) { if ((*op2)->input->use == literal) fprintf(stream, "\n - %s literal messaging\n", (*op2)->protocol); else if ((*op2)->input->encodingStyle) fprintf(stream, "\n - %s RPC encodingStyle=\"%s\"\n", (*op2)->input->encodingStyle, (*op2)->protocol); else fprintf(stream, "\n - %s RPC encoded messaging\n", (*op2)->protocol); } if ((*op2)->output) { if (!(*op2)->input || (*op2)->input->use != (*op2)->output->use) { if ((*op2)->output->use == literal) fprintf(stream, "\n - %s literal response messages\n", (*op2)->protocol); else if ((*op2)->output->encodingStyle) fprintf(stream, "\n - %s RPC response encodingStyle=\"%s\"\n", (*op2)->protocol, (*op2)->output->encodingStyle); else fprintf(stream, "\n - %s RPC encoded response messages\n", (*op2)->protocol); } } if ((*op2)->action) { if (*(*op2)->action) fprintf(stream, "\n - Action: \"%s\"\n", (*op2)->action); } if ((*op2)->input) { if ((*op2)->input->action) fprintf(stream, "\n - Addressing input action: \"%s\"\n", (*op2)->input->action); } if ((*op2)->output) { if ((*op2)->output->action) fprintf(stream, "\n - Addressing output action: \"%s\"\n", (*op2)->output->action); } for (vector::const_iterator infault = (*op2)->infault.begin(); infault != (*op2)->infault.end(); ++infault) { if ((*infault)->message) { if ((*infault)->use == literal) { for (vector::const_iterator part = (*infault)->message->part.begin(); part != (*infault)->message->part.end(); ++part) { if ((*part).element) fprintf(stream, "\n - SOAP Input Fault: %s (literal)\n", (*part).element); else if ((*part).name && (*part).type) fprintf(stream, "\n - SOAP Input Fault: %s (literal)\n", (*part).name); } } else if ((*infault)->message->name) fprintf(stream, "\n - SOAP Input Fault: %s\n", (*infault)->name); if ((*infault)->message->name && (*infault)->action) fprintf(stream, " - SOAP Input Fault addressing action: \"%s\"\n", (*infault)->action); } else if ((*infault)->name) fprintf(stream, "\n - SOAP Input Fault: %s (literal)\n", (*infault)->name); if ((*infault)->body_parts) fprintf(stream, " SOAP Input Fault code: %s\n", (*infault)->body_parts); text((*infault)->documentation); text((*infault)->ext_documentation); gen_policy(*this, (*infault)->policy, "fault message", types); } for (vector::const_iterator outfault = (*op2)->outfault.begin(); outfault != (*op2)->outfault.end(); ++outfault) { if ((*outfault)->message) { if ((*outfault)->use == literal) { for (vector::const_iterator part = (*outfault)->message->part.begin(); part != (*outfault)->message->part.end(); ++part) { if ((*part).element) fprintf(stream, "\n - SOAP Output Fault: %s (literal)\n", (*part).element); else if ((*part).name && (*part).type) fprintf(stream, "\n - SOAP Output Fault: %s (literal)\n", (*part).name); } } else if ((*outfault)->message->name) fprintf(stream, "\n - SOAP Output Fault: %s\n", (*outfault)->name); if ((*outfault)->message->name && (*outfault)->action) fprintf(stream, " - SOAP Output Fault addressing action: \"%s\"\n", (*outfault)->action); } else if ((*outfault)->name) fprintf(stream, "\n - SOAP Output Fault: %s (literal)\n", (*outfault)->name); if ((*outfault)->body_parts) fprintf(stream, " SOAP Output Fault code: %s\n", (*outfault)->body_parts); text((*outfault)->documentation); text((*outfault)->ext_documentation); gen_policy(*this, (*outfault)->policy, "fault message", types); } if ((*op2)->input) { if (!(*op2)->input->header.empty()) fprintf(stream, "\n - Request message has mandatory header part(s) (see @ref SOAP_ENV__Header):\n"); for (vector::const_iterator inputheader = (*op2)->input->header.begin(); inputheader != (*op2)->input->header.end(); ++inputheader) { if ((*inputheader).part) { if ((*inputheader).use == encoded && (*inputheader).namespace_) fprintf(stream, " - %s\n", types.aname(NULL, (*inputheader).namespace_, (*inputheader).part)); else if ((*inputheader).partPtr() && (*inputheader).partPtr()->element) fprintf(stream, " - %s\n", types.aname(NULL, NULL, (*inputheader).partPtr()->element)); } } } if ((*op2)->input && (*op2)->input->multipartRelated) { int k = 2; fprintf(stream, "\n - Request message MIME multipart/related attachments:\n"); for (vector::const_iterator part = (*op2)->input->multipartRelated->part.begin(); part != (*op2)->input->multipartRelated->part.end(); ++part) { if ((*part).soap__body_) { fprintf(stream, " -# MIME attachment with SOAP Body and mandatory header part(s):\n"); for (vector::const_iterator header = (*part).soap__header_.begin(); header != (*part).soap__header_.end(); ++header) { if ((*header).part) { if ((*header).use == encoded && (*header).namespace_) fprintf(stream, " - %s\n", types.aname(NULL, (*header).namespace_, (*header).part)); else if ((*header).partPtr() && (*header).partPtr()->element) fprintf(stream, " - %s\n", types.aname(NULL, NULL, (*header).partPtr()->element)); } } } else { fprintf(stream, " -# MIME attachment %d:\n", k++); for (vector::const_iterator content = (*part).content.begin(); content != (*part).content.end(); ++content) { fprintf(stream, " -"); if ((*content).part) { fprintf(stream, " part=\""); text((*content).part); fprintf(stream, "\""); } if ((*content).type) { fprintf(stream, " type=\""); text((*content).type); fprintf(stream, "\""); } fprintf(stream, "\n"); } } } } if ((*op2)->input && (*op2)->input->layout) fprintf(stream, "\n - Request message has DIME attachments in compliance with %s\n", (*op2)->input->layout); if ((*op2)->output) { if (!(*op2)->output->header.empty()) fprintf(stream, "\n - Response message has mandatory header part(s): (see @ref SOAP_ENV__Header)\n"); for (vector::const_iterator outputheader = (*op2)->output->header.begin(); outputheader != (*op2)->output->header.end(); ++outputheader) { if ((*outputheader).part) { if ((*outputheader).use == encoded && (*outputheader).namespace_) fprintf(stream, " - %s\n", types.aname(NULL, (*outputheader).namespace_, (*outputheader).part)); else if ((*outputheader).partPtr() && (*outputheader).partPtr()->element) fprintf(stream, " - %s\n", types.aname(NULL, NULL, (*outputheader).partPtr()->element)); } } } if ((*op2)->output && (*op2)->output_name && (*op2)->output->multipartRelated) { int k = 2; fprintf(stream, "\n - Response message MIME multipart/related attachments\n"); for (vector::const_iterator part = (*op2)->output->multipartRelated->part.begin(); part != (*op2)->output->multipartRelated->part.end(); ++part) { if ((*part).soap__body_) { fprintf(stream, " -# MIME attachment with SOAP Body and mandatory header part(s):\n"); for (vector::const_iterator header = (*part).soap__header_.begin(); header != (*part).soap__header_.end(); ++header) { if ((*header).part) { if ((*header).use == encoded && (*header).namespace_) fprintf(stream, " - %s\n", types.aname(NULL, (*header).namespace_, (*header).part)); else if ((*header).partPtr() && (*header).partPtr()->element) fprintf(stream, " - %s\n", types.aname(NULL, NULL, (*header).partPtr()->element)); } } } else { fprintf(stream, " -# MIME attachment %d:\n", k++); for (vector::const_iterator content = (*part).content.begin(); content != (*part).content.end(); ++content) { fprintf(stream, " -"); if ((*content).part) { fprintf(stream, " part=\""); text((*content).part); fprintf(stream, "\""); } if ((*content).type) { fprintf(stream, " type=\""); text((*content).type); fprintf(stream, "\""); } fprintf(stream, "\n"); } } } } if ((*op2)->output && (*op2)->output_name && (*op2)->output->layout) fprintf(stream, "\n - Response message has DIME attachments in compliance with %s\n", (*op2)->output->layout); fprintf(stream, "\nC stub function (defined in soapClient.c[pp] generated by soapcpp2):\n@code\n int soap_%s_%s(\n struct soap *soap,\n NULL, // char *endpoint = NULL selects default endpoint for this operation\n NULL, // char *action = NULL selects default action for this operation\n // input parameters:", (*op2)->output ? "call" : "send", method_name); if ((*op2)->input) (*op2)->input->generate(types, ",", false, false, false, false); if ((*op2)->output && (*op2)->output_name) { fprintf(stream, "\n // output parameters:"); if (flag) { if ((*op2)->style == rpc && (*op2)->output->message && (*(*op2)->output->message->part.begin()).name) { fprintf(stream, "\n"); fprintf(stream, anonymous ? anonformat : paraformat, types.tnamenoptr(NULL, NULL, (*(*op2)->output->message->part.begin()).type), cflag ? "*" : "&", types.aname(NULL, NULL, (*(*op2)->output->message->part.begin()).name), ""); } else (*op2)->output->generate(types, "", anonymous, false, true, false); } else fprintf(stream, "\n struct %s%s", (*op2)->output_name, cflag ? "*" : "&"); } fprintf(stream, "\n );\n@endcode\n\nC server function (called from the service dispatcher defined in soapServer.c[pp]):\n@code\n int %s(\n struct soap *soap,\n // input parameters:", method_name); if ((*op2)->input) (*op2)->input->generate(types, ",", false, false, false, false); fprintf(stream, "\n // output parameters:"); if ((*op2)->output && (*op2)->output_name) { if (flag) { if ((*op2)->style == rpc && (*op2)->output->message && (*(*op2)->output->message->part.begin()).name) { fprintf(stream, "\n"); fprintf(stream, anonymous ? anonformat : paraformat, types.tnamenoptr(NULL, NULL, (*(*op2)->output->message->part.begin()).type), cflag ? "*" : "&", types.aname(NULL, NULL, (*(*op2)->output->message->part.begin()).name), ""); } else (*op2)->output->generate(types, "", anonymous, false, true, false); } else fprintf(stream, "\n struct %s%s", (*op2)->output_name, cflag ? "*" : "&"); } fprintf(stream, "\n );\n@endcode\n\n"); if (!cflag) { fprintf(stream, "C++ proxy class (defined in soap%sProxy.h):\n", name); fprintf(stream, "@code\n class %sProxy;\n@endcode\n", name); fprintf(stream, "Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use proxy classes;\n\n"); fprintf(stream, "C++ service class (defined in soap%sService.h):\n", name); fprintf(stream, "@code\n class %sService;\n@endcode\n", name); fprintf(stream, "Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use service classes;\n\n"); } fprintf(stream, "*/\n\n"); (*op2)->generate(types, *this); } else if (*op2 && (*op2)->output) { if (!(*op2)->input) method_name = (*op2)->output_name; else method_name = (*op2)->input_name; banner("Service Operation", method_name); fprintf(stream, "\n/** Operation \"%s\" of service binding \"%s\".\n", method_name, name); if ((*op2)->documentation) text((*op2)->documentation); if ((*op2)->operation_documentation) text((*op2)->operation_documentation); if ((*op2)->output->documentation) { fprintf(stream, "Output response:\n"); text((*op2)->output->documentation); } if ((*op2)->output->ext_documentation) { fprintf(stream, "Output response:\n"); text((*op2)->output->ext_documentation); } gen_policy(*this, (*op2)->policy, "operation", types); gen_policy(*this, (*op2)->output->policy, "response message", types); fprintf(stream, "\n - One-way service response message\n"); if ((*op2)->mep) fprintf(stream, "\n - SOAP MEP: \"%s\"\n", ((*op2)->mep)); if ((*op2)->style == document) fprintf(stream, "\n - %s document/literal style messaging\n", (*op2)->protocol); else { if ((*op2)->output->use == literal) fprintf(stream, "\n - %s RPC literal messaging\n", (*op2)->protocol); else if ((*op2)->output->encodingStyle) fprintf(stream, "\n - %s RPC encodingStyle=\"%s\"\n", (*op2)->output->encodingStyle, (*op2)->protocol); else fprintf(stream, "\n - %s RPC encoded messaging\n", (*op2)->protocol); } if ((*op2)->action) { if (*(*op2)->action) fprintf(stream, "\n - Action: \"%s\"\n", (*op2)->action); } if ((*op2)->output) { if ((*op2)->output->action) fprintf(stream, "\n - Addressing output action: \"%s\"\n", (*op2)->output->action); } for (vector::const_iterator outfault = (*op2)->outfault.begin(); outfault != (*op2)->outfault.end(); ++outfault) { if ((*outfault)->message) { if ((*outfault)->use == literal) { for (vector::const_iterator part = (*outfault)->message->part.begin(); part != (*outfault)->message->part.end(); ++part) { if ((*part).element) fprintf(stream, "\n - SOAP Output Fault: %s (literal)\n", (*part).element); else if ((*part).name && (*part).type) fprintf(stream, "\n - SOAP Output Fault: %s (literal)\n", (*part).name); } } else if ((*outfault)->message->name) fprintf(stream, "\n - SOAP Output Fault: %s\n", (*outfault)->name); if ((*outfault)->message->name && (*outfault)->action) fprintf(stream, " - SOAP Output Fault addressing action: \"%s\"\n", (*outfault)->action); } else if ((*outfault)->name) fprintf(stream, "\n - SOAP Output Fault: %s (literal)\n", (*outfault)->name); gen_policy(*this, (*outfault)->policy, "fault message", types); } if (!(*op2)->output->header.empty()) fprintf(stream, "\n - Response message has mandatory header part(s) (see @ref SOAP_ENV__Header):\n"); for (vector::const_iterator outputheader = (*op2)->output->header.begin(); outputheader != (*op2)->output->header.end(); ++outputheader) { if ((*outputheader).part) { if ((*outputheader).use == encoded && (*outputheader).namespace_) fprintf(stream, " - %s\n", types.aname(NULL, (*outputheader).namespace_, (*outputheader).part)); else if ((*outputheader).partPtr() && (*outputheader).partPtr()->element) fprintf(stream, " - %s\n", types.aname(NULL, NULL, (*outputheader).partPtr()->element)); } } if ((*op2)->output->multipartRelated) { int k = 2; fprintf(stream, "\n - Response message MIME multipart/related attachments:\n"); for (vector::const_iterator part = (*op2)->output->multipartRelated->part.begin(); part != (*op2)->output->multipartRelated->part.end(); ++part) { if ((*part).soap__body_) { fprintf(stream, " -# MIME attachment with SOAP Body and mandatory header part(s):\n"); for (vector::const_iterator header = (*part).soap__header_.begin(); header != (*part).soap__header_.end(); ++header) { if ((*header).part) { if ((*header).use == encoded && (*header).namespace_) fprintf(stream, " - %s\n", types.aname(NULL, (*header).namespace_, (*header).part)); else if ((*header).partPtr() && (*header).partPtr()->element) fprintf(stream, " - %s\n", types.aname(NULL, NULL, (*header).partPtr()->element)); } } } else { fprintf(stream, " -# MIME attachment %d:\n", k++); for (vector::const_iterator content = (*part).content.begin(); content != (*part).content.end(); ++content) { fprintf(stream, " -"); if ((*content).part) { fprintf(stream, " part=\""); text((*content).part); fprintf(stream, "\""); } if ((*content).type) { fprintf(stream, " type=\""); text((*content).type); fprintf(stream, "\""); } fprintf(stream, "\n"); } } } } if ((*op2)->output->layout) fprintf(stream, "\n - Response message has DIME attachments in compliance with %s\n", (*op2)->output->layout); fprintf(stream, "\nC stub function (defined in soapClient.c[pp] generated by soapcpp2):\n@code\n int soap_call_%s(\n struct soap *soap,\n NULL, // char *endpoint = NULL selects default endpoint for this operation\n NULL, // char *action = NULL selects default action for this operation\n // parameters:", method_name); (*op2)->output->generate(types, ",", false, false, false, false); fprintf(stream, "\n );\n@endcode\n\nC server function (called from the service dispatcher defined in soapServer.c[pp]):\n@code\n int %s(\n struct soap *soap,\n // parameters:", method_name); (*op2)->output->generate(types, ",", false, false, false, false); fprintf(stream, "\n );\n@endcode\n\n"); if (!cflag) { fprintf(stream, "C++ proxy class (defined in soap%sProxy.h):\n", name); fprintf(stream, "@code\n class %sProxy;\n@endcode\n", name); fprintf(stream, "Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use proxy classes;\n\n"); fprintf(stream, "C++ service class (defined in soap%sService.h):\n", name); fprintf(stream, "@code\n class %sService;\n@endcode\n", name); fprintf(stream, "Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use service classes;\n\n"); } fprintf(stream, "*/\n\n"); (*op2)->generate(types, *this); } } gen_policy_enablers(*this); } void Service::add_import(const char *s) { if (find_if(imports.begin(), imports.end(), eqstr(s)) == imports.end()) imports.push_back(s); } void Service::del_import(const char *s) { VectorOfString::iterator i = find_if(imports.begin(), imports.end(), eqstr(s)); if (i != imports.end()) imports.erase(i); } //////////////////////////////////////////////////////////////////////////////// // // Operation methods // //////////////////////////////////////////////////////////////////////////////// void Operation::generate(Types& types, Service& service) { bool flag = false, anonymous = ((style != document) && parameterOrder != NULL); const char *method_name = NULL; if (output) { if (style == document) flag = (output->element || (output->message && output->message->part.size() == 1)); else if (!wflag) flag = (output->element || (output->message && output->use == encoded && output->message->part.size() == 1 && !(*output->message->part.begin()).simpleTypePtr() && !(*output->message->part.begin()).complexTypePtr())); if (flag && input && input->message && (*output->message->part.begin()).element) for (vector::const_iterator part = input->message->part.begin(); part != input->message->part.end(); ++part) if ((*part).element && !strcmp((*part).element, (*output->message->part.begin()).element)) flag = false; } if (output && output_name && bflag) // (output && (!input || bflag)) { if (input) { method_name = strstr(output_name + 1, "__"); if (method_name) method_name += 2; else method_name = output_name; } else { method_name = strstr(input_name + 1, "__"); if (method_name) method_name += 2; else method_name = input_name; } if (protocol) fprintf(stream, serviceformat, prefix, "method-protocol", method_name, protocol); if (output->content && output->content->type) fprintf(stream, serviceformat, prefix, "method-mime-type", method_name, output->content->type); else if (style == document) fprintf(stream, serviceformat, prefix, "method-style", method_name, "document"); else fprintf(stream, serviceformat, prefix, "method-style", method_name, "rpc"); if (output->use == literal) fprintf(stream, serviceformat, prefix, "method-encoding", method_name, "literal"); else if (output->encodingStyle) fprintf(stream, serviceformat, prefix, "method-encoding", method_name, output->encodingStyle); else fprintf(stream, serviceformat, prefix, "method-encoding", method_name, "encoded"); if (output && output->action && *output->action) fprintf(stream, serviceformat, prefix, "method-action", method_name, output->action); else if (action) { if (*action) fprintf(stream, serviceformat, prefix, "method-action", method_name, action); else fprintf(stream, serviceformat, prefix, "method-action", method_name, "\"\""); } for (vector::const_iterator message = outfault.begin(); message != outfault.end(); ++message) { if ((*message)->message) { if ((*message)->use == literal) { for (vector::const_iterator part = (*message)->message->part.begin(); part != (*message)->message->part.end(); ++part) { if ((*part).element) fprintf(stream, serviceformat, prefix, "method-fault", method_name, types.aname(NULL, NULL, (*part).element)); else if ((*part).type) fprintf(stream, serviceformat, prefix, "method-fault", method_name, types.aname(NULL, (*message)->URI, (*part).name)); } } else { if ((*message)->message->name) fprintf(stream, serviceformat, prefix, "method-fault", method_name, (*message)->name); } if ((*message)->action) fprintf(stream, serviceformat, prefix, "method-fault-action", method_name, (*message)->action); } else if ((*message)->name) fprintf(stream, serviceformat, prefix, "method-fault", method_name, (*message)->name); } if (output->multipartRelated) { for (vector::const_iterator outputmime = output->multipartRelated->part.begin(); outputmime != output->multipartRelated->part.end(); ++outputmime) { for (vector::const_iterator outputheader = (*outputmime).soap__header_.begin(); outputheader != (*outputmime).soap__header_.end(); ++outputheader) { if ((*outputheader).part) { if ((*outputheader).use == encoded && (*outputheader).namespace_) fprintf(stream, serviceformat, prefix, "method-header-part", method_name, types.aname(NULL, (*outputheader).namespace_, (*outputheader).part)); else if ((*outputheader).partPtr() && (*outputheader).partPtr()->element) fprintf(stream, serviceformat, prefix, "method-header-part", method_name, types.aname(NULL, NULL, (*outputheader).partPtr()->element)); } } for (vector::const_iterator content = (*outputmime).content.begin(); content != (*outputmime).content.end(); ++content) if ((*content).type) fprintf(stream, serviceformat, prefix, "method-mime-type", method_name, (*content).type); } } // TODO: add headerfault directives? for (vector::const_iterator outputheader = output->header.begin(); outputheader != output->header.end(); ++outputheader) { if ((*outputheader).part) { if ((*outputheader).use == encoded && (*outputheader).namespace_) fprintf(stream, serviceformat, prefix, "method-header-part", method_name, types.aname(NULL, (*outputheader).namespace_, (*outputheader).part)); else if ((*outputheader).partPtr() && (*outputheader).partPtr()->element) fprintf(stream, serviceformat, prefix, "method-header-part", method_name, types.aname(NULL, NULL, (*outputheader).partPtr()->element)); } } for (vector::const_iterator outputwheader = output->wheader.begin(); outputwheader != output->wheader.end(); ++outputwheader) { if ((*outputwheader).element) fprintf(stream, serviceformat, prefix, "method-header-part", method_name, types.aname(NULL, NULL, (*outputwheader).element)); } if (input) { fprintf(stream, "/// Operation response \"%s\" of operation \"%s\".\n", output_name, input_name); fprintf(stream, "int %s(", output_name); } else fprintf(stream, "int %s(", input_name); output->generate(types, ",", anonymous, true, false, false); fprintf(stream, "\n void\t///< One-way message: no output parameter\n);\n"); } if (!input && output && output_name) // (!input && output && bflag) { method_name = strstr(output_name + 1, "__"); if (method_name) method_name += 2; else method_name = output_name; if (protocol) fprintf(stream, serviceformat, prefix, "method-protocol", method_name, protocol); if (output->content && output->content->type) fprintf(stream, serviceformat, prefix, "method-mime-type", method_name, output->content->type); else if (style == document) fprintf(stream, serviceformat, prefix, "method-style", method_name, "document"); else fprintf(stream, serviceformat, prefix, "method-style", method_name, "rpc"); if (output->use == literal) fprintf(stream, serviceformat, prefix, "method-encoding", method_name, "literal"); else if (output->encodingStyle) fprintf(stream, serviceformat, prefix, "method-encoding", method_name, output->encodingStyle); else fprintf(stream, serviceformat, prefix, "method-encoding", method_name, "encoded"); if (output && output->action && *output->action) fprintf(stream, serviceformat, prefix, "method-action", method_name, output->action); else if (action) { if (*action) fprintf(stream, serviceformat, prefix, "method-action", method_name, action); else fprintf(stream, serviceformat, prefix, "method-action", method_name, "\"\""); } for (vector::const_iterator message = outfault.begin(); message != outfault.end(); ++message) { if ((*message)->message) { if ((*message)->use == literal) { for (vector::const_iterator part = (*message)->message->part.begin(); part != (*message)->message->part.end(); ++part) { if ((*part).element) fprintf(stream, serviceformat, prefix, "method-fault", method_name, types.aname(NULL, NULL, (*part).element)); else if ((*part).type) fprintf(stream, serviceformat, prefix, "method-fault", method_name, types.aname(NULL, (*message)->URI, (*part).name)); } } else { if ((*message)->message->name) fprintf(stream, serviceformat, prefix, "method-fault", method_name, (*message)->name); } if ((*message)->action) fprintf(stream, serviceformat, prefix, "method-fault-action", method_name, (*message)->action); } else if ((*message)->name) fprintf(stream, serviceformat, prefix, "method-fault", method_name, (*message)->name); } if (output->multipartRelated) { for (vector::const_iterator outputmime = output->multipartRelated->part.begin(); outputmime != output->multipartRelated->part.end(); ++outputmime) { for (vector::const_iterator outputheader = (*outputmime).soap__header_.begin(); outputheader != (*outputmime).soap__header_.end(); ++outputheader) { if ((*outputheader).part) { if ((*outputheader).use == encoded && (*outputheader).namespace_) fprintf(stream, serviceformat, prefix, "method-header-part", method_name, types.aname(NULL, (*outputheader).namespace_, (*outputheader).part)); else if ((*outputheader).partPtr() && (*outputheader).partPtr()->element) fprintf(stream, serviceformat, prefix, "method-header-part", method_name, types.aname(NULL, NULL, (*outputheader).partPtr()->element)); } } for (vector::const_iterator content = (*outputmime).content.begin(); content != (*outputmime).content.end(); ++content) if ((*content).type) fprintf(stream, serviceformat, prefix, "method-mime-type", method_name, (*content).type); } } // TODO: add headerfault directives? for (vector::const_iterator outputheader = output->header.begin(); outputheader != output->header.end(); ++outputheader) { if ((*outputheader).part) { if ((*outputheader).use == encoded && (*outputheader).namespace_) fprintf(stream, serviceformat, prefix, "method-header-part", method_name, types.aname(NULL, (*outputheader).namespace_, (*outputheader).part)); else if ((*outputheader).partPtr() && (*outputheader).partPtr()->element) fprintf(stream, serviceformat, prefix, "method-header-part", method_name, types.aname(NULL, NULL, (*outputheader).partPtr()->element)); } } for (vector::const_iterator outputwheader = output->wheader.begin(); outputwheader != output->wheader.end(); ++outputwheader) { if ((*outputwheader).element) fprintf(stream, serviceformat, prefix, "method-header-part", method_name, types.aname(NULL, NULL, (*outputwheader).element)); } fprintf(stream, "int %s(", output_name); if (flag) { if (style == rpc && output->message && (*output->message->part.begin()).name) { fprintf(stream, "\n"); fprintf(stream, anonymous ? anonformat : paraformat, types.tnamenoptr(NULL, NULL, (*output->message->part.begin()).type), cflag ? "*" : "&", types.aname(NULL, NULL, (*output->message->part.begin()).name), ""); fprintf(stream, "\t///< Output parameter"); } else output->generate(types, "", anonymous, true, true, false); } else { fprintf(stream, "\n struct %-28s%s", output_name, cflag ? "*" : "&"); fprintf(stream, "\t///< Output response struct parameter"); } fprintf(stream, "\n);\n"); } if (input && input_name) { method_name = strstr(input_name + 1, "__"); if (method_name) method_name += 2; else method_name = input_name; if (protocol) fprintf(stream, serviceformat, prefix, "method-protocol", method_name, protocol); if (input->content && input->content->type) fprintf(stream, serviceformat, prefix, "method-mime-type", method_name, input->content->type); else if (style == document) fprintf(stream, serviceformat, prefix, "method-style", method_name, "document"); else fprintf(stream, serviceformat, prefix, "method-style", method_name, "rpc"); if (output && output->content && output->content->type) fprintf(stream, serviceformat, prefix, "method-output-mime-type", method_name, output->content->type); if (!input || input->use == literal) fprintf(stream, serviceformat, prefix, "method-encoding", method_name, "literal"); else if (input->encodingStyle) fprintf(stream, serviceformat, prefix, "method-encoding", method_name, input->encodingStyle); else fprintf(stream, serviceformat, prefix, "method-encoding", method_name, "encoded"); if (output) { if (!input || input->use != output->use) { if (output->use == literal) fprintf(stream, serviceformat, prefix, "method-response-encoding", method_name, "literal"); else if (output->encodingStyle) fprintf(stream, serviceformat, prefix, "method-response-encoding", method_name, output->encodingStyle); else fprintf(stream, serviceformat, prefix, "method-response-encoding", method_name, "encoded"); } if (style == rpc && (!input || (input->URI && output->URI && *output->URI && strcmp(input->URI, output->URI)))) fprintf(stream, schemaformat, types.nsprefix(NULL, output->URI), "namespace", output->URI); } if (input && input->action && *input->action) fprintf(stream, serviceformat, prefix, "method-input-action", method_name, input->action); else if (action) { if (*action) fprintf(stream, serviceformat, prefix, "method-action", method_name, action); else fprintf(stream, serviceformat, prefix, "method-action", method_name, "\"\""); } if (output && output->action && *output->action) fprintf(stream, serviceformat, prefix, "method-output-action", method_name, output->action); for (vector::const_iterator message = outfault.begin(); message != outfault.end(); ++message) { if ((*message)->message) { if ((*message)->use == literal) { for (vector::const_iterator part = (*message)->message->part.begin(); part != (*message)->message->part.end(); ++part) { if ((*part).element) fprintf(stream, serviceformat, prefix, "method-fault", method_name, types.aname(NULL, NULL, (*part).element)); else if ((*part).type) fprintf(stream, serviceformat, prefix, "method-fault", method_name, types.aname(NULL, (*message)->URI, (*part).name)); } } else { if ((*message)->message->name) fprintf(stream, serviceformat, prefix, "method-fault", method_name, (*message)->name); } if ((*message)->action) fprintf(stream, serviceformat, prefix, "method-fault-action", method_name, (*message)->action); } else if ((*message)->name) fprintf(stream, serviceformat, prefix, "method-fault", method_name, (*message)->name); } if (input) { if (input->multipartRelated) { for (vector::const_iterator inputmime = input->multipartRelated->part.begin(); inputmime != input->multipartRelated->part.end(); ++inputmime) { for (vector::const_iterator inputheader = (*inputmime).soap__header_.begin(); inputheader != (*inputmime).soap__header_.end(); ++inputheader) { if ((*inputheader).part) { if ((*inputheader).use == encoded && (*inputheader).namespace_) fprintf(stream, serviceformat, prefix, "method-input-header-part", method_name, types.aname(NULL, (*inputheader).namespace_, (*inputheader).part)); else if ((*inputheader).partPtr() && (*inputheader).partPtr()->element) fprintf(stream, serviceformat, prefix, "method-input-header-part", method_name, types.aname(NULL, NULL, (*inputheader).partPtr()->element)); } } for (vector::const_iterator content = (*inputmime).content.begin(); content != (*inputmime).content.end(); ++content) if ((*content).type) fprintf(stream, serviceformat, prefix, "method-input-mime-type", method_name, (*content).type); } } // TODO: add headerfault directives? for (vector::const_iterator inputheader = input->header.begin(); inputheader != input->header.end(); ++inputheader) { if ((*inputheader).part) { if ((*inputheader).use == encoded && (*inputheader).namespace_) fprintf(stream, serviceformat, prefix, "method-input-header-part", method_name, types.aname(NULL, (*inputheader).namespace_, (*inputheader).part)); else if ((*inputheader).partPtr() && (*inputheader).partPtr()->element) fprintf(stream, serviceformat, prefix, "method-input-header-part", method_name, types.aname(NULL, NULL, (*inputheader).partPtr()->element)); } } for (vector::const_iterator inputwheader = input->wheader.begin(); inputwheader != input->wheader.end(); ++inputwheader) { if ((*inputwheader).element) fprintf(stream, serviceformat, prefix, "method-input-header-part", method_name, types.aname(NULL, NULL, (*inputwheader).element)); } } if (output) { if (output->multipartRelated) { for (vector::const_iterator outputmime = output->multipartRelated->part.begin(); outputmime != output->multipartRelated->part.end(); ++outputmime) { for (vector::const_iterator outputheader = (*outputmime).soap__header_.begin(); outputheader != (*outputmime).soap__header_.end(); ++outputheader) { if ((*outputheader).part) { if ((*outputheader).use == encoded && (*outputheader).namespace_) fprintf(stream, serviceformat, prefix, "method-output-header-part", method_name, types.aname(NULL, (*outputheader).namespace_, (*outputheader).part)); else if ((*outputheader).partPtr() && (*outputheader).partPtr()->element) fprintf(stream, serviceformat, prefix, "method-output-header-part", method_name, types.aname(NULL, NULL, (*outputheader).partPtr()->element)); } } for (vector::const_iterator content = (*outputmime).content.begin(); content != (*outputmime).content.end(); ++content) if ((*content).type) fprintf(stream, serviceformat, prefix, "method-output-mime-type", method_name, (*content).type); } } for (vector::const_iterator outputheader = output->header.begin(); outputheader != output->header.end(); ++outputheader) { if ((*outputheader).part) { if ((*outputheader).use == encoded && (*outputheader).namespace_) fprintf(stream, serviceformat, prefix, "method-output-header-part", method_name, types.aname(NULL, (*outputheader).namespace_, (*outputheader).part)); else if ((*outputheader).partPtr() && (*outputheader).partPtr()->element) fprintf(stream, serviceformat, prefix, "method-output-header-part", method_name, types.aname(NULL, NULL, (*outputheader).partPtr()->element)); } } for (vector::const_iterator outputwheader = output->wheader.begin(); outputwheader != output->wheader.end(); ++outputwheader) { if ((*outputwheader).element) fprintf(stream, serviceformat, prefix, "method-output-header-part", method_name, types.aname(NULL, NULL, (*outputwheader).element)); } } if (input) fprintf(stream, "int %s(", input_name); else fprintf(stream, "int %s(", output_name); if (input) input->generate(types, ",", anonymous, true, false, false); if (output) { if (flag) { if (style == rpc && output->message && (*output->message->part.begin()).name) { fprintf(stream, "\n"); fprintf(stream, anonymous ? anonformat : paraformat, types.tnamenoptr(NULL, NULL, (*output->message->part.begin()).type), cflag ? "*" : "&", types.aname(NULL, NULL, (*output->message->part.begin()).name), ""); fprintf(stream, "\t///< Output parameter"); } else output->generate(types, "", anonymous, true, true, false); } else { fprintf(stream, "\n struct %-28s%s", output_name, cflag ? "*" : "&"); fprintf(stream, "\t///< Output response struct parameter"); } fprintf(stream, "\n);\n"); } else fprintf(stream, "\n void\t///< One-way message: no output parameter\n);\n"); } } //////////////////////////////////////////////////////////////////////////////// // // Message methods // //////////////////////////////////////////////////////////////////////////////// void Message::generate(Types& types, const char *sep, bool anonymous, bool remark, bool response, bool optional) { if (message) { for (vector::const_iterator part = message->part.begin(); part != message->part.end(); ++part) { if (!(*part).name) fprintf(stderr, "\nError: no part name in message \"%s\"\n", message->name ? message->name : ""); else if (!body_parts || soap_tagsearch(body_parts, (*part).name)) { if (remark && (*part).documentation) comment("", (*part).name, "parameter", (*part).documentation); else fprintf(stream, "\n"); if ((*part).element) { if ((*part).elementPtr()) { const char *name, *type, *nameURI = NULL, *typeURI = NULL, *prefix = NULL; if (style == rpc && use == encoded) name = (*part).name; else { name = (*part).elementPtr()->name; if (style == document && (*part).elementPtr()->schemaPtr()) nameURI = (*part).elementPtr()->schemaPtr()->targetNamespace; } if ((*part).elementPtr()->type) type = (*part).elementPtr()->type; else { type = (*part).elementPtr()->name; prefix = "_"; if ((*part).elementPtr()->schemaPtr()) typeURI = (*part).elementPtr()->schemaPtr()->targetNamespace; } if ((*part).elementPtr()->xmime__expectedContentTypes) fprintf(stream, " /// MTOM attachment with content types %s\n", (*part).elementPtr()->xmime__expectedContentTypes); if (response) { const char *t; bool flag = false; if (!zflag || zflag > 6) t = types.tnamenoptr(prefix, typeURI, type); else { t = types.tname(prefix, typeURI, type); flag = (strchr(t, '*') && strcmp(t, "char*") && strcmp(t, "char *")); } fprintf(stream, anonymous ? anonformat : paraformat, t, flag ? " " : cflag ? "*" : "&", types.aname(NULL, nameURI, name), sep); if (remark) fprintf(stream, "\t///< Output parameter"); } else { fprintf(stream, anonymous ? anonformat : paraformat, types.pname(optional, false, prefix, typeURI, type), " ", types.aname(NULL, nameURI, name), sep); if (remark && *sep == ',') fprintf(stream, "\t///< Input parameter"); } } else { fprintf(stream, anonymous ? anonformat : paraformat, types.pname(optional, false, NULL, NULL, (*part).element), " ", types.aname(NULL, NULL, (*part).element), sep); if (remark) fprintf(stream, "\t///< @todo Check element type (imported type)"); } } else if ((*part).type) { if (response) { const char *t; bool flag = false; if (!zflag || zflag > 6) t = types.tnamenoptr(NULL, NULL, (*part).type); else { t = types.tname(NULL, NULL, (*part).type); flag = (strchr(t, '*') && strcmp(t, "char*") && strcmp(t, "char *")); } fprintf(stream, anonymous ? anonformat : paraformat, t, flag ? " " : cflag ? "*" : "&", types.aname(NULL, NULL, (*part).name), sep); if (remark) fprintf(stream, "\t///< Output parameter"); } else { fprintf(stream, anonymous ? anonformat : paraformat, types.pname(optional, false, NULL, NULL, (*part).type), " ", types.aname(NULL, NULL, (*part).name), sep); if (remark && *sep == ',') fprintf(stream, "\t///< Input parameter"); } } else fprintf(stderr, "\nError: no wsdl:definitions/message/part/@type in part \"%s\"\n", (*part).name); } } } else if (element) // WSDL 2.0 { const char *prefix = NULL; const char *URI = NULL; const char *name = element->name; const char *type = element->type; if (!type) { type = name; prefix = "_"; } if (element->schemaPtr()) URI = element->schemaPtr()->targetNamespace; if (response) { const char *t; bool flag = false; if (!zflag || zflag > 6) t = types.tnamenoptr(prefix, URI, type); else { t = types.tname(prefix, URI, type); flag = (strchr(t, '*') && strcmp(t, "char*") && strcmp(t, "char *")); } fprintf(stream, "\n"); fprintf(stream, paraformat, t, flag ? " " : cflag ? "*" : "&", anonymous ? "" : types.aname(NULL, URI, name), sep); if (remark) fprintf(stream, "\t///< Output parameter"); } else if (style == document || element->simpleTypePtr()) { // WSDL 2.0 document style fprintf(stream, "\n"); fprintf(stream, anonymous ? anonformat : paraformat, types.pname(optional, false, prefix, URI, type), " ", types.aname(NULL, URI, name), sep); if (remark && *sep == ',') fprintf(stream, "\t///< Input parameter"); } else if (element->complexTypePtr()) { // WSDL 2.0 RPC style xs__seqchoice *seq = element->complexTypePtr()->sequence; for (vector::const_iterator i = seq->__contents.begin(); i != seq->__contents.end(); ++i) { if ((*i).__union == SOAP_UNION_xs__union_content_element) { name = (*i).__content.element->name; type = (*i).__content.element->type; if (!type) type = name; fprintf(stream, "\n"); fprintf(stream, anonymous ? anonformat : paraformat, types.pname(optional, false, prefix, URI, type), " ", types.aname(NULL, NULL, name), sep); if (remark && *sep == ',') fprintf(stream, "\t///< Input parameter"); } } } } } //////////////////////////////////////////////////////////////////////////////// // // Miscellaneous // //////////////////////////////////////////////////////////////////////////////// static const char *urienc(struct soap *soap, const char *uri) { const char *r, *s; char *t; size_t n = 0; if (!uri) return NULL; for (s = uri; *s; s++) if (!URI_CHAR(*s)) n++; if (!n) return uri; n = strlen(uri) + 2*n; r = t = (char*)soap_malloc(soap, n + 1); if (r) { for (s = uri; *s; s++) { if (URI_CHAR(*s)) *t++ = *s; else { (SOAP_SNPRINTF(t, n + 1 - (t - r), 3), "%%%2.2x", *s); t += 3; } } *t = '\0'; } return r; } static bool imported(const char *tag) { if (!tag || *tag != '"') return false; for (SetOfString::const_iterator u = exturis.begin(); u != exturis.end(); ++u) { size_t n = strlen(*u); if (!strncmp(*u, tag + 1, n) && tag[n+1] == '"') return true; } return false; } static void comment(const char *start, const char *middle, const char *end, const char *text) { if (text) { if (strchr(text, '\r') || strchr(text, '\n')) fprintf(stream, "\n/** %s %s %s documentation:\n%s\n*/\n\n", start, middle, end, text); else fprintf(stream, "\n/// %s %s %s: %s\n", start, middle, end, text); } } static void page(const char *page, const char *title, const char *text) { if (text) fprintf(stream, "\n@page %s%s \"%s\"\n", page, title, text); else fprintf(stream, "\n@page %s%s\n", page, title); } static void section(const char *section, const char *title, const char *text) { if (text) fprintf(stream, "\n@section %s%s \"%s\"\n", section, title, text); else fprintf(stream, "\n@section %s%s\n", section, title); } static void banner(const char *text1, const char *text2) { int i; if (!text1) return; fprintf(stream, "\n/"); for (i = 0; i < 78; i++) fputc('*', stream); if (text2) fprintf(stream, "\\\n *%76s*\n * %-75s*\n * %-73s*\n *%76s*\n\\", "", text1, text2, ""); else fprintf(stream, "\\\n *%76s*\n * %-75s*\n *%76s*\n\\", "", text1, ""); for (i = 0; i < 78; i++) fputc('*', stream); fprintf(stream, "/\n\n"); if (vflag) fprintf(stderr, "\n----<< %s: %s >>----\n\n", text1, text2 ? text2 : ""); } static void ident() { time_t t = time(NULL), *p = &t; char tmp[256]; int i; strftime(tmp, 256, "%Y-%m-%d %H:%M:%S GMT", gmtime(p)); fprintf(stream, "/* %s\n Generated by wsdl2h " WSDL2H_VERSION " from ", outfile ? outfile : ""); if (infiles) { for (i = 0; i < infiles; i++) fprintf(stream, "%s ", infile[i]); } else fprintf(stream, "(stdin) "); fprintf(stream, "and %s\n\ %s\n\n\ DO NOT INCLUDE THIS FILE DIRECTLY INTO YOUR PROJECT BUILDS\n\ USE THE soapcpp2-GENERATED SOURCE CODE FILES FOR YOUR PROJECT BUILDS\n\n\ gSOAP XML Web services tools\n\ Copyright (C) 2000-2016, Robert van Engelen, Genivia Inc. All Rights Reserved.\n\ This program is released under the GPL with the additional exemption that\n\ compiling, linking, and/or using OpenSSL is allowed.\n\ --------------------------------------------------------------------------------\n\ A commercial use license is available from Genivia Inc., contact@genivia.com\n\ --------------------------------------------------------------------------------\n\ */\n\n", mapfile, tmp); } void text(const char *text) { const char *s; if (!text) return; size_t k = 0; for (s = text; *s; s++, k++) { switch (*s) { case '\n': if (k) { fputc('\n', stream); k = 0; } break; case '\t': k = 8 * ((k + 8) / 8) - 1; fputc('\t', stream); break; case '/': fputc(*s, stream); if (s[1] == '*') fputc(' ', stream); break; case '*': fputc(*s, stream); if (s[1] == '/') fputc(' ', stream); break; case ' ': if (k >= 79) { fputc('\n', stream); k = 0; } else fputc(' ', stream); break; default: if (*s >= 32) fputc(*s, stream); } } if (k) fputc('\n', stream); } //////////////////////////////////////////////////////////////////////////////// // // WS-Policy // //////////////////////////////////////////////////////////////////////////////// static void gen_policy(Service& service, const vector& policy, const char *text, Types& types) { if (!policy.empty()) { fprintf(stream, "\n - WS-Policy applicable to the %s:\n", text); for (vector::const_iterator p = policy.begin(); p != policy.end(); ++p) if (*p) (*p)->generate(service, types, 0); } } static void gen_policy_enablers(const Service& service) { fprintf(stream, "\n/**\n"); page(service.name, " Binding", service.name); section(service.name, "_policy_enablers Policy Enablers of Binding", service.name); if (service.imports.empty()) { fprintf(stream, "\nNone specified.\n\n*/\n"); return; } fprintf(stream, "\nBased on policies and protocol requirements, this service requires importing"); for (VectorOfString::const_iterator i = service.imports.begin(); i != service.imports.end(); ++i) fprintf(stream, " \"%s\"", *i); fprintf(stream, "\n\n - WS-Policy reminders and enablers (when applicable):\n"); fprintf(stream, " - WS-Addressing 1.0 (2005/08, accepts 2004/08):\n\t@code\n\t#import \"wsa5.h\" // to be added to this header file for the soapcpp2 build step\n\t@endcode\n\t@code\n\t#include \"plugin/wsaapi.h\"\n\tsoap_register_plugin(soap, soap_wsa); // register the wsa plugin in your code\n\t// See the user guide gsoap/doc/wsa/html/index.html\n\t@endcode\n"); fprintf(stream, " - WS-Addressing (2004/08):\n\t@code\n\t#import \"wsa.h\" // to be added to this header file for the soapcpp2 build step\n\t@endcode\n\t@code\n\t#include \"plugin/wsaapi.h\"\n\tsoap_register_plugin(soap, soap_wsa); // register the wsa plugin in your code\n\t// See the user guide gsoap/doc/wsa/html/index.html\n\t@endcode\n"); fprintf(stream, " - WS-ReliableMessaging 1.0:\n\t@code\n\t#import \"wsrm5.h\" // to be added to this header file for the soapcpp2 build step\n\t@endcode\n\t@code\n\t#include \"plugin/wsrmapi.h\"\n\tsoap_register_plugin(soap, soap_wsa); // register the wsa plugin in your code\n\tsoap_register_plugin(soap, soap_wsrm); // register the wsrm plugin in your code\n\t// See the user guide gsoap/doc/wsrm/html/index.html\n\t@endcode\n"); fprintf(stream, " - WS-ReliableMessaging 1.1:\n\t@code\n\t#import \"wsrm.h\" // to be added to this header file for the soapcpp2 build step\n\t@endcode\n\t@code\n\t#include \"plugin/wsrmapi.h\"\n\tsoap_register_plugin(soap, soap_wsa); // register the wsa plugin in your code\n\tsoap_register_plugin(soap, soap_wsrm); // register the wsrm plugin in your code\n\t// See the user guide gsoap/doc/wsrm/html/index.html\n\t@endcode\n"); fprintf(stream, " - WS-Discovery 1.0:\n\t@code\n\t#import \"wsrm5.h\" // to be added to this header file for the soapcpp2 build step\n\t@endcode\n\t@code\n\t#include \"plugin/wsddapi.h\" // See the user guide gsoap/doc/wsdd/html/index.html\n\t@endcode\n"); fprintf(stream, " - WS-Discovery 1.1:\n\t@code\n\t#import \"wsrm.h\" // to be added to this header file for the soapcpp2 build step\n\t@endcode\n\t@code\n\t#include \"plugin/wsddapi.h\" // See the user guide gsoap/doc/wsdd/html/index.html\n\t@endcode\n"); fprintf(stream, " - WS-Security (SOAP Message Security) 1.0 (accepts 1.1):\n\t@code\n\t#import \"wsse.h\" // to be added to this header file for the soapcpp2 build step\n\t@endcode\n\t@code\n\t#include \"plugin/wsseapi.h\"\n\tsoap_register_plugin(soap, soap_wsse); // register the wsse plugin in your code\n\t// See the user guide gsoap/doc/wsse/html/index.html\n\t@endcode\n"); fprintf(stream, " - WS-Security (SOAP Message Security) 1.1 (accepts 1.0):\n\t@code\n\t#import \"wsse11.h\" // to be added to this header file for the soapcpp2 build step\n\t@endcode\n\t@code\n\t#include \"plugin/wsseapi.h\"\n\tsoap_register_plugin(soap, soap_wsse); // register the wsse plugin in your code\n\t// See the user guide gsoap/doc/wsse/html/index.html\n\t@endcode\n"); fprintf(stream, " - HTTP Digest Authentication:\n\t@code\n\t#include \"plugin/httpda.h\"\n\tsoap_register_plugin(soap, soap_http_da); // register the HTTP DA plugin in your code\n\t// See the user guide gsoap/doc/httpda/html/index.html\n\t@endcode\n"); fprintf(stream, "*/\n\n"); for (VectorOfString::const_iterator i = service.imports.begin(); i != service.imports.end(); ++i) fprintf(stream, "#import \"%s\"\n", *i); } //////////////////////////////////////////////////////////////////////////////// // // BPEL 2.0 // //////////////////////////////////////////////////////////////////////////////// static void gen_plnk(const Service& service) { if (!service.role.empty()) { for (vector::const_iterator r = service.role.begin(); r != service.role.end(); ++r) { if (*r && (*r)->portTypePtr() && (*r)->plnkPtr()) { fprintf(stream, "\n - \"%s\" role \"%s\" port type \"%s\" operations.\n", (*r)->plnkPtr()->name, (*r)->portTypePtr()->name, (*r)->name); text((*r)->documentation); text((*r)->plnkPtr()->documentation); } } } } static void gen_vprop(const wsdl__definitions& definitions, Types& types) { if (!definitions.vprop__property.empty()) { banner("BPEL 2.0 Variables"); fprintf(stream, "/**\n"); page("page_bpel", " BPEL 2.0 Variables", NULL); for (vector::const_iterator i1 = definitions.vprop__property.begin(); i1 != definitions.vprop__property.end(); ++i1) { if ((*i1).name) { fprintf(stream, "\nBPEL 2.0 Variable \"%s\"\n", (*i1).name); text((*i1).documentation); fprintf(stream, "\n"); for (vector::const_iterator j = definitions.vprop__propertyAlias.begin(); j != definitions.vprop__propertyAlias.end(); ++j) { if ((*j).vpropPtr() == &(*i1) && (*j).query && (*j).query->__mixed) { if ((*j).messageType) { if ((*j).type) fprintf(stream, " - Variable property alias for message %s/%s of type %s.\n", (*j).messageType, (*j).part, (*j).type); else if ((*j).element) fprintf(stream, " - Variable property alias for message %s/%s element %s.\n", (*j).messageType, (*j).part, (*j).element); } else fprintf(stream, " - Variable property alias.\n"); text((*j).documentation); if ((*j).type) fprintf(stream, " XPath %s: %s\n", types.tname(NULL, NULL, (*j).type), (*j).query->__mixed); else if ((*j).element) fprintf(stream, " XPath %s: %s\n", types.tname(NULL, NULL, (*j).element), (*j).query->__mixed); } } } } fprintf(stream, "*/\n\n"); for (vector::const_iterator i2 = definitions.vprop__property.begin(); i2 != definitions.vprop__property.end(); ++i2) { if ((*i2).name) { for (vector::const_iterator j = definitions.vprop__propertyAlias.begin(); j != definitions.vprop__propertyAlias.end(); ++j) { if ((*j).vpropPtr() == &(*i2) && (*j).query && (*j).query->__mixed) { if ((*j).type) fprintf(stream, "//xpath %s %s\n", types.tname(NULL, NULL, (*j).type), (*j).query->__mixed); else if ((*j).element) fprintf(stream, "//xpath %s %s\n", types.tname(NULL, NULL, (*j).element), (*j).query->__mixed); } } if ((*i2).type) fprintf(stream, elementformat, types.tname(NULL, NULL, (*i2).type), types.aname(NULL, NULL, (*i2).name)); else if ((*i2).element) fprintf(stream, elementformat, types.tname(NULL, NULL, (*i2).element), types.aname(NULL, NULL, (*i2).name)); fprintf(stream, ";\n"); } } fprintf(stream, "\n"); } } gsoap-2.8.28/gsoap/VisualStudio2005/wsdl2h/wsdl2h/wsrmp.h0000644000175000017500000000401212653650160022267 0ustar ellertellert/* wsrmp.h WS-ReliableMessaging Policy -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2010, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap wsrmp schema documentation: WS-ReliableMessaging Policy binding //gsoap wsrmp schema namespace: http://schemas.xmlsoap.org/ws/2005/02/rm/policy //gsoap wsrmp schema elementForm: qualified //gsoap wsrmp schema attributeForm: unqualified #import "imports.h" class wsrmp__Timeout { public: @char *Milliseconds; }; class wsrmp__RMAssertion : public wsp__Assertion { public: wsrmp__Timeout *InactivityTimeout; wsrmp__Timeout *BaseRetransmissionInterval;; wsrmp__Timeout *AcknowledgementInterval; char *ExponentialBackoff; // TODO: WCF netrmp extension elements go here, as necessary }; gsoap-2.8.28/gsoap/VisualStudio2005/wsdl2h/wsdl2h/wst.h0000644000175000017500000000323212653650160021737 0ustar ellertellert/* wst.h WS-Trust -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap wst schema documentation: WS-Trust //gsoap wst schema namespace: http://docs.oasis-open.org/ws-sx/ws-trust/200512 //gsoap wst schema elementForm: qualified //gsoap wst schema attributeForm: unqualified class wst__Claims { public: @xsd__string Dialect; xsd__string __item; }; gsoap-2.8.28/gsoap/VisualStudio2005/wsdl2h/wsdl2h/schema.cpp0000644000175000017500000020161712653650160022724 0ustar ellertellert/* schema.cpp XSD binding schema implementation -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "wsdlH.h" // cannot include "schemaH.h" #include "includes.h" extern struct Namespace namespaces[]; extern "C" { extern int warn_ignore(struct soap*, const char*); } extern const char *qname_token(const char*, const char*); extern int is_builtin_qname(const char*); //////////////////////////////////////////////////////////////////////////////// // // schema // //////////////////////////////////////////////////////////////////////////////// xs__schema::xs__schema() { soap = soap_new1(SOAP_XML_TREE | SOAP_C_UTFSTRING); #ifdef HTTPDA_H soap_register_plugin(soap, http_da); #endif #ifdef WITH_OPENSSL soap_ssl_client_context(soap, SOAP_SSL_NO_AUTHENTICATION, NULL, NULL, NULL, NULL, NULL); #endif soap_set_namespaces(soap, namespaces); soap_default(soap); soap->fignore = warn_ignore; soap->encodingStyle = NULL; soap->proxy_host = proxy_host; soap->proxy_port = proxy_port; soap->proxy_userid = proxy_userid; soap->proxy_passwd = proxy_passwd; targetNamespace = NULL; version = NULL; attributeGroupRef = NULL; updated = false; location = NULL; redirs = 0; } xs__schema::xs__schema(struct soap *copy) { soap = soap_copy(copy); soap->socket = SOAP_INVALID_SOCKET; soap->recvfd = 0; soap->sendfd = 1; soap_default(soap); soap->fignore = warn_ignore; soap->encodingStyle = NULL; targetNamespace = NULL; version = NULL; attributeGroupRef = NULL; updated = false; location = NULL; redirs = 0; } xs__schema::xs__schema(struct soap *copy, const char *cwd, const char *loc) { soap = soap_copy(copy); soap->socket = SOAP_INVALID_SOCKET; soap->recvfd = 0; soap->sendfd = 1; soap_default(soap); soap->fignore = warn_ignore; soap->encodingStyle = NULL; targetNamespace = NULL; version = NULL; attributeGroupRef = NULL; updated = false; location = NULL; redirs = 0; read(cwd, loc); } xs__schema::~xs__schema() { } int xs__schema::get(struct soap *soap) { (void)soap; return preprocess(); } int xs__schema::preprocess() { // process xs:include recursively // NOTE: includes are context sensitive (take context info), so keep including for (vector::iterator in = include.begin(); in != include.end(); ++in) { (*in).preprocess(*this); // read schema and recurse over if ((*in).schemaPtr()) insert(*(*in).schemaPtr()); } for (vector::iterator ov = override_.begin(); ov != override_.end(); ++ov) { (*ov).preprocess(*this); // read schema and recurse over if ((*ov).schemaPtr()) insert(*(*ov).schemaPtr()); } for (vector::iterator re = redefine.begin(); re != redefine.end(); ++re) { (*re).preprocess(*this); // read schema and recurse over if ((*re).schemaPtr()) insert(*(*re).schemaPtr()); } return SOAP_OK; } int xs__schema::insert(xs__schema& schema) { bool found; if (targetNamespace && (!schema.targetNamespace || strcmp(targetNamespace, schema.targetNamespace))) { if (!Wflag) fprintf(stderr, "\nWarning: attempt to include schema '%s' with mismatching targetNamespace '%s' into schema namespace '%s', assuming chameleon schema targetNamespace '%s'\n", schema.sourceLocation() ? schema.sourceLocation() : "", schema.targetNamespace, targetNamespace, targetNamespace); schema.targetNamespace = targetNamespace; } if (elementFormDefault != schema.elementFormDefault) { if (!Wflag) fprintf(stderr, "\nWarning: attempt to include schema '%s' with mismatching elementFormDefault into schema namespace '%s', assuming elementFormDefault '%squalified'\n", schema.sourceLocation() ? schema.sourceLocation() : "", targetNamespace ?targetNamespace : "(null)", elementFormDefault == qualified ? "" : "un"); schema.elementFormDefault = elementFormDefault; } if (attributeFormDefault != schema.attributeFormDefault) { if (!Wflag) fprintf(stderr, "\nWarning: attempt to include schema '%s' with mismatching attributeFormDefault into schema namespace '%s', assuming attributeFormDefault '%squalified'\n", schema.sourceLocation() ? schema.sourceLocation() : "", targetNamespace ? targetNamespace : "(null)", attributeFormDefault == qualified ? "" : "un"); schema.attributeFormDefault = attributeFormDefault; } // insert imports for (vector::const_iterator im = schema.import.begin(); im != schema.import.end(); ++im) { found = false; if ((*im).namespace_) { for (vector::const_iterator i = import.begin(); i != import.end(); ++i) { if ((*i).namespace_ && !strcmp((*im).namespace_, (*i).namespace_)) { found = true; break; } } } if (!found) import.push_back(*im); } // insert attributes, but only add attributes with new name (limited conflict check) for (vector::const_iterator at = schema.attribute.begin(); at != schema.attribute.end(); ++at) { found = false; if ((*at).name) { for (vector::const_iterator a = attribute.begin(); a != attribute.end(); ++a) { if ((*a).name && !strcmp((*at).name, (*a).name)) { found = true; if ((*at).type && (*a).type && strcmp((*at).type, (*a).type)) if (!Wflag) fprintf(stderr, "\nWarning: attempt to redefine attribute '%s' with type '%s' in schema '%s'\n", (*at).name, (*at).type, targetNamespace ? targetNamespace : "(null)"); break; } } } if (!found) { attribute.push_back(*at); attribute.back().schemaPtr(this); } } // insert elements, but only add elements with new name (limited conflict check) for (vector::const_iterator el = schema.element.begin(); el != schema.element.end(); ++el) { found = false; if ((*el).name) { for (vector::const_iterator e = element.begin(); e != element.end(); ++e) { if ((*e).name && !strcmp((*el).name, (*e).name)) { found = true; if ((*el).type && (*e).type && strcmp((*el).type, (*e).type)) if (!Wflag) fprintf(stderr, "\nWarning: attempt to redefine element '%s' with type '%s' in schema '%s'\n", (*el).name, (*el).type, targetNamespace ? targetNamespace : "(null)"); break; } } } if (!found) { element.push_back(*el); element.back().schemaPtr(this); } } // insert groups, but only add groups with new name (no conflict check) for (vector::const_iterator gp = schema.group.begin(); gp != schema.group.end(); ++gp) { found = false; if ((*gp).name) { for (vector::const_iterator g = group.begin(); g != group.end(); ++g) { if ((*g).name && !strcmp((*gp).name, (*g).name)) { found = true; break; } } } if (!found) { group.push_back(*gp); group.back().schemaPtr(this); } } // insert attributeGroups, but only add attributeGroups with new name (no conflict check) for (vector::const_iterator ag = schema.attributeGroup.begin(); ag != schema.attributeGroup.end(); ++ag) { found = false; if ((*ag).name) { for (vector::const_iterator g = attributeGroup.begin(); g != attributeGroup.end(); ++g) { if ((*g).name && !strcmp((*ag).name, (*g).name)) { found = true; break; } } } if (!found) { attributeGroup.push_back(*ag); attributeGroup.back().schemaPtr(this); } } // insert simpleTypes, but only add simpleTypes with new name (no conflict check) for (vector::const_iterator st = schema.simpleType.begin(); st != schema.simpleType.end(); ++st) { found = false; if ((*st).name) { for (vector::const_iterator s = simpleType.begin(); s != simpleType.end(); ++s) { if ((*s).name && !strcmp((*st).name, (*s).name)) { found = true; break; } } } if (!found) { simpleType.push_back(*st); simpleType.back().schemaPtr(this); } } // insert complexTypes, but only add complexTypes with new name (no conflict check) for (vector::const_iterator ct = schema.complexType.begin(); ct != schema.complexType.end(); ++ct) { found = false; if ((*ct).name) { for (vector::const_iterator c = complexType.begin(); c != complexType.end(); ++c) { if ((*c).name && !strcmp((*ct).name, (*c).name)) { found = true; break; } } } if (!found) { complexType.push_back(*ct); complexType.back().schemaPtr(this); } } return SOAP_OK; } int xs__schema::traverse() { if (updated) return SOAP_OK; if (vflag) cerr << " Analyzing schema '" << (targetNamespace ? targetNamespace : "(null)") << "' '" << (sourceLocation() ? sourceLocation() : "") << "'" << endl; updated = true; if (!targetNamespace) { if (vflag) fprintf(stderr, "\nWarning: Schema has no targetNamespace\n"); targetNamespace = soap_strdup(soap, ""); } else if (exturis.find(targetNamespace) != exturis.end()) { if (vflag) fprintf(stderr, "\nWarning: Built-in schema '%s' content encountered\n", targetNamespace); } // process import for (vector::iterator im = import.begin(); im != import.end(); ++im) (*im).traverse(*this); // process attributes for (vector::iterator at = attribute.begin(); at != attribute.end(); ++at) (*at).traverse(*this); // process elements for (vector::iterator el = element.begin(); el != element.end(); ++el) (*el).traverse(*this); // process simpleTypes, check conflicts with complexTypes for (vector::iterator st = simpleType.begin(); st != simpleType.end(); ++st) { (*st).traverse(*this); if ((*st).name) { for (vector::iterator ct = complexType.begin(); ct != complexType.end(); ++ct) { if ((*ct).name && !strcmp((*st).name, (*ct).name)) { if (!Wflag) fprintf(stderr, "\nWarning: top-level simpleType name and complexType name '%s' clash in schema '%s'\n", (*st).name, targetNamespace ? targetNamespace : "(null)"); } } } } // process complexTypes for (vector::iterator ct = complexType.begin(); ct != complexType.end(); ++ct) (*ct).traverse(*this); // process groups for (vector::iterator gp = group.begin(); gp != group.end(); ++gp) (*gp).traverse(*this); // process attributeGroups for (vector::iterator ag = attributeGroup.begin(); ag != attributeGroup.end(); ++ag) (*ag).traverse(*this); // XSD 1.1 defaultAttributes if (defaultAttributes) { for (vector::iterator ag = attributeGroup.begin(); ag != attributeGroup.end(); ++ag) { if (!strcmp(defaultAttributes, (*ag).name)) { attributeGroupRef = &*ag; break; } } if (!attributeGroupRef) cerr << "\nWarning: could not find defaultAttributes attributeGroup '" << defaultAttributes << "' in schema '" << (targetNamespace ? targetNamespace : "(null)") << "'" << endl; } if (vflag) cerr << " End of schema '" << (targetNamespace ? targetNamespace : "(null)") << "'" << endl; return SOAP_OK; } int xs__schema::read(const char *cwd, const char *loc) { const char *cwd_temp; if (!cwd) cwd = cwd_path; if (vflag) fprintf(stderr, "\nOpening schema '%s' from '%s'\n", loc ? loc : "(stdin)", cwd ? cwd : "./"); if (loc) { if (soap->recvfd > 2) { soap_end_recv(soap); close(soap->recvfd); soap->recvfd = -1; } else if (soap_valid_socket(soap->socket)) { soap_end_recv(soap); soap_closesock(soap); } #ifdef WITH_OPENSSL if (!strncmp(loc, "http://", 7) || !strncmp(loc, "https://", 8)) #else if (!strncmp(loc, "https://", 8)) { fprintf(stderr, "\nCannot connect to https site: no SSL support, please rebuild with SSL (default) or download the files and rerun wsdl2h\n"); exit(1); } else if (!strncmp(loc, "http://", 7)) #endif { fprintf(stderr, "%*sConnecting to '%s' to retrieve schema...", 2*openfiles, "", loc); location = soap_strdup(soap, loc); if (soap_connect_command(soap, SOAP_GET, location, NULL)) { fprintf(stderr, "\n\nError: connection failed\n"); exit(1); } fprintf(stderr, " connected, receiving...\n"); openfiles++; } else if (cwd && (!strncmp(cwd, "http://", 7) || !strncmp(cwd, "https://", 8))) { size_t l = strlen(cwd) + strlen(loc); location = (char*)soap_malloc(soap, l + 2); soap_strcpy(location, l + 2, cwd); char *s = strrchr(location, '/'); if (s) *s = '\0'; size_t n = strlen(location); soap_strcpy(location + n, l + 2 - n, "/"); ++n; soap_strcpy(location + n, l + 2 - n, loc); fprintf(stderr, "%*sConnecting to '%s' to retrieve schema '%s'...", 2*openfiles, "", location, loc); if (soap_connect_command(soap, SOAP_GET, location, NULL)) { fprintf(stderr, "\n\nError: connection failed\n"); exit(1); } fprintf(stderr, " connected, receiving...\n"); openfiles++; } else { soap->recvfd = open(loc, O_RDONLY, 0); if (soap->recvfd < 0) { if (cwd) { size_t l = strlen(cwd) + strlen(loc); location = (char*)soap_malloc(soap, l + 2); soap_strcpy(location, l + 2, cwd); char *s = strrchr(location, '/'); #ifdef WIN32 if (!s) s = strrchr(location, '\\'); #endif if (s) *s = '\0'; size_t n = strlen(location); soap_strcpy(location + n, l + 2 - n, "/"); ++n; soap_strcpy(location + n, l + 2 - n, loc); if (!strncmp(location, "file://", 7)) location += 7; soap->recvfd = open(location, O_RDONLY, 0); } if (soap->recvfd < 0 && import_path) { size_t l = strlen(import_path) + strlen(loc); location = (char*)soap_malloc(soap, l + 2); soap_strcpy(location, l + 2, import_path); size_t n = strlen(location); soap_strcpy(location + n, l + 2 - n, "/"); ++n; soap_strcpy(location + n, l + 2 - n, loc); if (!strncmp(location, "file://", 7)) location += 7; soap->recvfd = open(location, O_RDONLY, 0); } if (soap->recvfd < 0) { fprintf(stderr, "\nCannot open '%s' to retrieve schema\n", loc); exit(1); } } else location = soap_strdup(soap, loc); fprintf(stderr, "%*sReading schema '%s'...\n", 2*openfiles, "", location); openfiles++; } } cwd_temp = cwd_path; cwd_path = location; if (!soap_begin_recv(soap)) this->soap_in(soap, "xs:schema", NULL); if ((soap->error >= 301 && soap->error <= 303) || soap->error == 307) // HTTP redirect, socket was closed { int r = SOAP_ERR; fprintf(stderr, "Redirected to '%s'...\n", soap->endpoint); if (redirs++ < 10) r = read(cwd, soap->endpoint); else fprintf(stderr, "\nMax redirects exceeded\n"); redirs--; return r; } else if (soap->error == 401) { int r = SOAP_ERR; fprintf(stderr, "Authenticating to '%s' realm '%s'...\n", loc, soap->authrealm); if (auth_userid && auth_passwd && redirs++ < 1) { #ifdef HTTPDA_H struct http_da_info info; http_da_save(soap, &info, soap->authrealm, auth_userid, auth_passwd); #else soap->userid = auth_userid; soap->passwd = auth_passwd; #endif r = read(cwd, loc); #ifdef HTTPDA_H http_da_release(soap, &info); #endif redirs--; } else fprintf(stderr, "Authentication failed, use option -r:uid:pwd and (re)build with OpenSSL to enable digest authentication\n"); return r; } if (soap->error) { fprintf(stderr, "\nAn error occurred while parsing schema from '%s'\n", loc ? loc : "(stdin)"); soap_print_fault(soap, stderr); if (soap->error < 200) soap_print_fault_location(soap, stderr); fprintf(stderr, "\nIf this schema namespace is considered \"built-in\", then add\n namespaceprefix = \nto typemap.dat.\n"); exit(1); } openfiles--; fprintf(stderr, "%*sDone reading '%s'\n", 2*openfiles, "", loc ? loc : "(stdin)"); soap_end_recv(soap); if (soap->recvfd > 2) { close(soap->recvfd); soap->recvfd = -1; } else soap_closesock(soap); cwd_path = cwd_temp; return SOAP_OK; } void xs__schema::sourceLocation(const char *loc) { location = soap_strdup(soap, loc); } const char *xs__schema::sourceLocation() { return location; } xs__attributeGroup *xs__schema::attributeGroupPtr() const { return attributeGroupRef; } int xs__schema::error() { return soap->error; } void xs__schema::print_fault() { soap_print_fault(soap, stderr); if (soap->error < 200) soap_print_fault_location(soap, stderr); } void xs__schema::builtinType(const char *type) { builtinTypeSet.insert(type); } void xs__schema::builtinElement(const char *element) { builtinElementSet.insert(element); } void xs__schema::builtinAttribute(const char *attribute) { builtinAttributeSet.insert(attribute); } const SetOfString& xs__schema::builtinTypes() const { return builtinTypeSet; } const SetOfString& xs__schema::builtinElements() const { return builtinElementSet; } const SetOfString& xs__schema::builtinAttributes() const { return builtinAttributeSet; } bool xs__schema::empty() const { return include.empty() && redefine.empty() && override_.empty() && attribute.empty() && element.empty() && group.empty() && attributeGroup.empty() && simpleType.empty() && complexType.empty(); // empty except for } xs__include::xs__include() { schemaLocation = NULL; schemaRef = NULL; } int xs__include::preprocess(xs__schema &schema) { if (!schemaRef && schemaLocation) { // only read from include locations not read already, uses static std::map static map included; map::iterator i = included.end(); if (schema.targetNamespace) { for (i = included.begin(); i != included.end(); ++i) { if ((*i).second->targetNamespace && !strcmp(schemaLocation, (*i).first) && !strcmp(schema.targetNamespace, (*i).second->targetNamespace)) break; } } if (i == included.end()) { if (vflag) cerr << "Preprocessing schema include '" << (schemaLocation ? schemaLocation : "(null)") << "' into schema '" << (schema.targetNamespace ? schema.targetNamespace : "(null)") << "'" << endl; schemaRef = new xs__schema(schema.soap); if (!schemaRef) return SOAP_EOF; included[schemaLocation] = schemaRef; schemaRef->read(schema.sourceLocation(), schemaLocation); if (schema.targetNamespace && (!schemaRef->targetNamespace || strcmp(schema.targetNamespace, schemaRef->targetNamespace))) { if (!Wflag) { if (schemaRef->targetNamespace) fprintf(stderr, "\nWarning: attempt to include schema with mismatching targetNamespace '%s' in schema '%s', assigning targetNamespace '%s'\n", schemaRef->targetNamespace, schema.targetNamespace, schema.targetNamespace); else fprintf(stderr, "\nWarning: attempt to include chameleon schema with no targetNamespace in schema '%s', assigning targetNamespace '%s'\n", schema.targetNamespace, schema.targetNamespace); } schemaRef->targetNamespace = schema.targetNamespace; schemaRef->elementFormDefault = schema.elementFormDefault; schemaRef->attributeFormDefault = schema.attributeFormDefault; } } else { if (vflag) cerr << "Schema '" << (schemaLocation ? schemaLocation : "(null)") << "' already included into schema '" << (schema.targetNamespace ? schema.targetNamespace : "(null)") << "'" << endl; schemaRef = (*i).second; } } return SOAP_OK; } int xs__include::traverse(xs__schema &schema) { (void)schema; return SOAP_OK; } void xs__include::schemaPtr(xs__schema *schema) { schemaRef = schema; } xs__schema *xs__include::schemaPtr() const { return schemaRef; } xs__redefine::xs__redefine() { schemaLocation = NULL; schemaRef = NULL; } int xs__redefine::preprocess(xs__schema &schema) { if (vflag) cerr << "Preprocessing schema redefine '" << (schemaLocation ? schemaLocation : "(null)") << "' into schema '" << (schema.targetNamespace ? schema.targetNamespace : "(null)") << "'" << endl; if (!schemaRef) { if (schemaLocation) { schemaRef = new xs__schema(schema.soap, schema.sourceLocation(), schemaLocation); // redefine xs:all, xs:choice, or xs:sequence in a group for (vector::iterator gp = schemaRef->group.begin(); gp != schemaRef->group.end(); ++gp) { if ((*gp).name) { for (vector::const_iterator g = group.begin(); g != group.end(); ++g) { if ((*g).name && !strcmp((*gp).name, (*g).name)) { if ((*g).all) (*gp).all = (*g).all; if ((*g).choice) (*gp).choice = (*g).choice; if ((*g).sequence) (*gp).sequence = (*g).sequence; break; } } } } // redefine specified attributes in an attributeGroup for (vector::iterator ag = schemaRef->attributeGroup.begin(); ag != schemaRef->attributeGroup.end(); ++ag) { if ((*ag).name) { for (vector::const_iterator g = attributeGroup.begin(); g != attributeGroup.end(); ++g) { if ((*g).name && !strcmp((*ag).name, (*g).name)) { for (std::vector::const_iterator ga = (*g).attribute.begin(); ga != (*g).attribute.end(); ++ga) { if ((*ga).name) { bool found = false; for (std::vector::iterator aga = (*ag).attribute.begin(); aga != (*ag).attribute.end(); ++aga) { if ((*aga).name && !strcmp((*aga).name, (*ga).name)) { *aga = *ga; found = true; break; } } if (!found) (*ag).attribute.push_back(*ga); } } } } } } // redefine simpleType for (vector::iterator st = schemaRef->simpleType.begin(); st != schemaRef->simpleType.end(); ++st) { if ((*st).name) { for (vector::const_iterator s = simpleType.begin(); s != simpleType.end(); ++s) { if ((*s).name && !strcmp((*st).name, (*s).name)) { *st = *s; // TODO would it be too crude to simply replace all content? break; } } } } // redefine complexType by extension for (vector::iterator ct = schemaRef->complexType.begin(); ct != schemaRef->complexType.end(); ++ct) { if ((*ct).name) { for (vector::const_iterator c = complexType.begin(); c != complexType.end(); ++c) { if ((*c).name && !strcmp((*ct).name, (*c).name)) { if ((*c).complexContent && (*c).complexContent->extension && (*c).complexContent->extension->sequence && qname_token((*c).complexContent->extension->base, schemaRef->targetNamespace)) { if (!(*ct).sequence) (*ct).sequence = (*c).complexContent->extension->sequence; else { for (std::vector::const_iterator e = (*c).complexContent->extension->sequence->__contents.begin(); e != (*c).complexContent->extension->sequence->__contents.end(); ++e) (*ct).sequence->__contents.push_back(*e); } } else if (!Wflag) fprintf(stderr, "\nWarning: redefining complexType \"%s\" in schema \"%s\" by extension requires an extension base\n", (*ct).name, schemaRef->targetNamespace ? schemaRef->targetNamespace : "(null)"); break; } } } } } } return SOAP_OK; } int xs__redefine::traverse(xs__schema &schema) { (void)schema; return SOAP_OK; } void xs__redefine::schemaPtr(xs__schema *schema) { schemaRef = schema; } xs__schema *xs__redefine::schemaPtr() const { return schemaRef; } xs__override::xs__override() { schemaLocation = NULL; schemaRef = NULL; } int xs__override::preprocess(xs__schema &schema) { if (vflag) cerr << "Preprocessing schema override '" << (schemaLocation ? schemaLocation : "(null)") << "' into schema '" << (schema.targetNamespace ? schema.targetNamespace : "(null)") << "'" << endl; if (!schemaRef) { if (schemaLocation) { schemaRef = new xs__schema(schema.soap, schema.sourceLocation(), schemaLocation); for (vector::iterator el = schemaRef->element.begin(); el != schemaRef->element.end(); ++el) { if ((*el).name) { for (vector::const_iterator e = element.begin(); e != element.end(); ++e) { if ((*e).name && !strcmp((*el).name, (*e).name)) { *el = *e; break; } } } } for (vector::iterator at = schemaRef->attribute.begin(); at != schemaRef->attribute.end(); ++at) { if ((*at).name) { for (vector::const_iterator a = attribute.begin(); a != attribute.end(); ++a) { if ((*a).name && !strcmp((*at).name, (*a).name)) { *at = *a; break; } } } } for (vector::iterator gp = schemaRef->group.begin(); gp != schemaRef->group.end(); ++gp) { if ((*gp).name) { for (vector::const_iterator g = group.begin(); g != group.end(); ++g) { if ((*g).name && !strcmp((*gp).name, (*g).name)) { *gp = *g; break; } } } } for (vector::iterator ag = schemaRef->attributeGroup.begin(); ag != schemaRef->attributeGroup.end(); ++ag) { if ((*ag).name) { for (vector::const_iterator g = attributeGroup.begin(); g != attributeGroup.end(); ++g) { if ((*g).name && !strcmp((*ag).name, (*g).name)) { *ag = *g; break; } } } } for (vector::iterator st = schemaRef->simpleType.begin(); st != schemaRef->simpleType.end(); ++st) { if ((*st).name) { for (vector::const_iterator s = simpleType.begin(); s != simpleType.end(); ++s) { if ((*s).name && !strcmp((*st).name, (*s).name)) { *st = *s; break; } } } } for (vector::iterator ct = schemaRef->complexType.begin(); ct != schemaRef->complexType.end(); ++ct) { if ((*ct).name) { for (vector::const_iterator c = complexType.begin(); c != complexType.end(); ++c) { if ((*c).name && !strcmp((*ct).name, (*c).name)) { *ct = *c; break; } } } } } } return SOAP_OK; } int xs__override::traverse(xs__schema &schema) { (void)schema; return SOAP_OK; } void xs__override::schemaPtr(xs__schema *schema) { schemaRef = schema; } xs__schema *xs__override::schemaPtr() const { return schemaRef; } xs__import::xs__import() { namespace_ = NULL; schemaLocation = NULL; schemaRef = NULL; } int xs__import::traverse(xs__schema &schema) { if (vflag) cerr << " Analyzing schema import '" << (namespace_ ? namespace_ : "(null)") << "'" << endl; if (!schemaRef) { bool found = false; if (namespace_) { for (SetOfString::const_iterator i = exturis.begin(); i != exturis.end(); ++i) { if (!soap_tag_cmp(namespace_, *i)) { found = true; break; } } } else if (!Wflag) fprintf(stderr, "\nWarning: no namespace in \n"); if (!found && !iflag) // don't import any of the schemas in the .nsmap table (or when -i option is used) { const char *s = schemaLocation; if (!s) s = namespace_; // only read from import locations not read already, uses static std::map static map included; map::iterator i = included.find(s); if (i == included.end()) { included[s] = schemaRef = new xs__schema(schema.soap); schemaRef->read(schema.sourceLocation(), s); } else schemaRef = (*i).second; if (schemaRef) { if (!schemaRef->targetNamespace || !*schemaRef->targetNamespace) schemaRef->targetNamespace = namespace_; else if (!namespace_ || strcmp(schemaRef->targetNamespace, namespace_)) if (!Wflag) fprintf(stderr, "\nWarning: schema import '%s' with schema targetNamespace '%s' mismatch\n", namespace_ ? namespace_ : "(null)", schemaRef->targetNamespace); } } } if (schemaRef) schemaRef->traverse(); return SOAP_OK; } void xs__import::schemaPtr(xs__schema *schema) { schemaRef = schema; } xs__schema *xs__import::schemaPtr() const { return schemaRef; } xs__attribute::xs__attribute() { schemaRef = NULL; attributeRef = NULL; simpleTypeRef = NULL; } int xs__attribute::traverse(xs__schema &schema) { if (vflag) cerr << " Analyzing schema attribute '" << (name ? name : "(null)") << "'" << endl; schemaRef = &schema; const char *token = qname_token(ref, schema.targetNamespace); attributeRef = NULL; if (token) { for (vector::iterator i = schema.attribute.begin(); i != schema.attribute.end(); ++i) if (!strcmp((*i).name, token)) { attributeRef = &(*i); if (vflag) cerr << " Found attribute '" << (name ? name : "(null)") << "' ref '" << (token ? token : "(null)") << "'" << endl; break; } } if (!attributeRef) { for (vector::iterator i = schema.import.begin(); i != schema.import.end(); ++i) { xs__schema *s = (*i).schemaPtr(); if (s) { token = qname_token(ref, s->targetNamespace); if (token) { for (vector::iterator j = s->attribute.begin(); j != s->attribute.end(); ++j) { if (!strcmp((*j).name, token)) { attributeRef = &(*j); if (vflag) cerr << " Found attribute '" << (name ? name : "(null)") << "' ref '" << (token ? token : "(null)") << "'" << endl; break; } } if (attributeRef) break; } } } } if (simpleType) { simpleType->traverse(schema); simpleTypeRef = simpleType; } else { token = qname_token(type, schema.targetNamespace); simpleTypeRef = NULL; if (token) { for (vector::iterator i = schema.simpleType.begin(); i != schema.simpleType.end(); ++i) if (!strcmp((*i).name, token)) { simpleTypeRef = &(*i); if (vflag) cerr << " Found attribute '" << (name ? name : "(null)") << "' type '" << (token ? token : "(null)") << "'" << endl; break; } } if (!simpleTypeRef) { for (vector::iterator i = schema.import.begin(); i != schema.import.end(); ++i) { xs__schema *s = (*i).schemaPtr(); if (s) { token = qname_token(type, s->targetNamespace); if (token) { for (vector::iterator j = s->simpleType.begin(); j != s->simpleType.end(); ++j) { if (!strcmp((*j).name, token)) { simpleTypeRef = &(*j); if (vflag) cerr << " Found attribute '" << (name ? name : "(null)") << "' type '" << (token ? token : "(null)") << "'" << endl; break; } } if (simpleTypeRef) break; } } } } } if (!attributeRef && !simpleTypeRef) { if (ref) { if (is_builtin_qname(ref)) schema.builtinAttribute(ref); else if (!Wflag) cerr << "\nWarning: could not find the referenced attribute '" << (name ? name : "") << "' ref '" << ref << "' in schema '" << (schema.targetNamespace ? schema.targetNamespace : "(null)") << "'" << endl; } else if (type) { if (is_builtin_qname(type)) schema.builtinType(type); else if (!Wflag) cerr << "\nWarning: could not find the type for attribute '" << (name ? name : "(null)") << "' type '" << type << "' in schema '" << (schema.targetNamespace ? schema.targetNamespace : "(null)") << "'" << endl; } } return SOAP_OK; } void xs__attribute::schemaPtr(xs__schema *schema) { schemaRef = schema; } xs__schema* xs__attribute::schemaPtr() const { return schemaRef; } void xs__attribute::attributePtr(xs__attribute *attribute) { attributeRef = attribute; } void xs__attribute::simpleTypePtr(xs__simpleType *simpleType) { simpleTypeRef = simpleType; } xs__attribute *xs__attribute::attributePtr() const { return attributeRef; } xs__simpleType *xs__attribute::simpleTypePtr() const { return simpleTypeRef; } xs__element::xs__element() { schemaRef = NULL; elementRef = NULL; simpleTypeRef = NULL; complexTypeRef = NULL; name = NULL; ref = NULL; type = NULL; default_ = NULL; default__ = NULL; fixed = NULL; fixed_ = NULL; form = NULL; nillable = false; abstract = false; substitutionGroup = NULL; minOccurs = NULL; maxOccurs = NULL; xmime__expectedContentTypes = NULL; annotation = NULL; simpleType = NULL; complexType = NULL; unique = NULL; } int xs__element::traverse(xs__schema &schema) { if (vflag) cerr << " Analyzing schema element '" << (name ? name : "(null)") << "'" << endl; schemaRef = &schema; const char *token = qname_token(ref, schema.targetNamespace); elementRef = NULL; if (token) { for (vector::iterator i = schema.element.begin(); i != schema.element.end(); ++i) { if ((*i).name && !strcmp((*i).name, token)) { elementRef = &(*i); if (vflag) cerr << " Found element '" << (name ? name : "(null)") << "' ref '" << (token ? token : "(null)") << "'" << endl; break; } } } if (!elementRef) { for (vector::const_iterator i = schema.import.begin(); i != schema.import.end(); ++i) { xs__schema *s = (*i).schemaPtr(); if (s) { token = qname_token(ref, s->targetNamespace); if (token) { for (vector::iterator j = s->element.begin(); j != s->element.end(); ++j) { if ((*j).name && !strcmp((*j).name, token)) { elementRef = &(*j); if (vflag) cerr << " Found element '" << (name ? name : "(null)") << "' ref '" << (token ? token : "(null)") << "'" << endl; break; } } if (elementRef) break; } } } } if (simpleType) { simpleType->traverse(schema); simpleTypeRef = simpleType; } else { token = qname_token(type, schema.targetNamespace); simpleTypeRef = NULL; if (token) { for (vector::iterator i = schema.simpleType.begin(); i != schema.simpleType.end(); ++i) if ((*i).name && !strcmp((*i).name, token)) { simpleTypeRef = &(*i); if (vflag) cerr << " Found element '" << (name ? name : "(null)") << "' simpleType '" << (token ? token : "(null)") << "'" << endl; break; } } if (!simpleTypeRef) { for (vector::const_iterator i = schema.import.begin(); i != schema.import.end(); ++i) { xs__schema *s = (*i).schemaPtr(); if (s) { token = qname_token(type, s->targetNamespace); if (token) { for (vector::iterator j = s->simpleType.begin(); j != s->simpleType.end(); ++j) { if ((*j).name && !strcmp((*j).name, token)) { simpleTypeRef = &(*j); if (vflag) cerr << " Found element '" << (name ? name : "(null)") << "' simpleType '" << (token ? token : "(null)") << "'" << endl; break; } } if (simpleTypeRef) break; } } } } } if (complexType) { complexType->traverse(schema); complexTypeRef = complexType; } else { token = qname_token(type, schema.targetNamespace); complexTypeRef = NULL; if (token) { for (vector::iterator i = schema.complexType.begin(); i != schema.complexType.end(); ++i) if ((*i).name && !strcmp((*i).name, token)) { complexTypeRef = &(*i); if (vflag) cerr << " Found element '" << (name ? name : "(null)") << "' complexType '" << (token ? token : "(null)") << "'" << endl; break; } } if (!complexTypeRef) { for (vector::const_iterator i = schema.import.begin(); i != schema.import.end(); ++i) { xs__schema *s = (*i).schemaPtr(); if (s) { token = qname_token(type, s->targetNamespace); if (token) { for (vector::iterator j = s->complexType.begin(); j != s->complexType.end(); ++j) { if ((*j).name && !strcmp((*j).name, token)) { complexTypeRef = &(*j); if (vflag) cerr << " Found element '" << (name ? name : "(null)") << "' complexType '" << (token ? token : "(null)") << "'" << endl; break; } } if (complexTypeRef) break; } } } } } if (!abstract && substitutionGroup) { token = qname_token(substitutionGroup, schema.targetNamespace); if (token) { for (vector::iterator i = schema.element.begin(); i != schema.element.end(); ++i) { if (!strcmp((*i).name, token)) { xs__element *elt = this; if (!elementPtr()) { elt = soap_new_xs__element(schema.soap); elt->soap_default(schema.soap); elt->name = name; elt->form = form; elt->elementPtr(this); // create element ref in substitutionsGroup elt->schemaPtr(schemaPtr()); elt->targetNamespace = NULL; } (*i).substitutions.push_back(elt); if (vflag) cerr << " Found substitutionGroup element '" << (name ? name : "(null)") << "' for element '" << (token ? token : "(null)") << "'" << endl; break; } } } for (vector::const_iterator i = schema.import.begin(); i != schema.import.end(); ++i) { xs__schema *s = (*i).schemaPtr(); if (s) { token = qname_token(substitutionGroup, s->targetNamespace); if (token) { for (vector::iterator j = s->element.begin(); j != s->element.end(); ++j) { if (!strcmp((*j).name, token)) { xs__element *elt = this; if (!elementPtr()) { elt = soap_new_xs__element(schema.soap); elt->soap_default(schema.soap); elt->name = name; elt->form = form; elt->elementPtr(this); // create element ref in substitutionsGroup elt->schemaPtr(schemaPtr()); elt->targetNamespace = NULL; } (*j).substitutions.push_back(elt); if (vflag) cerr << " Found substitutionGroup element '" << (name ? name : "(null)") << "' for element '" << (token ? token : "(null)") << "' in '" << s->targetNamespace << "'" << endl; break; } } } } } } if (!elementRef && !simpleTypeRef && !complexTypeRef) { if (ref) { if (is_builtin_qname(ref)) schema.builtinElement(ref); else if (!Wflag) cerr << "\nWarning: could not find the referenced element '" << (name ? name : "") << "' ref '" << ref << "' in schema '" << (schema.targetNamespace ? schema.targetNamespace : "(null)") << "'" << endl; } else if (type) { if (is_builtin_qname(type)) schema.builtinType(type); else if (!Wflag) cerr << "\nWarning: could not find the type for element '" << (name ? name : "(null)") << "' type '" << type << "' in schema '" << (schema.targetNamespace ? schema.targetNamespace : "(null)") << "'" << endl; } } return SOAP_OK; } void xs__element::schemaPtr(xs__schema *schema) { schemaRef = schema; } xs__schema* xs__element::schemaPtr() const { return schemaRef; } void xs__element::elementPtr(xs__element *element) { elementRef = element; } void xs__element::simpleTypePtr(xs__simpleType *simpleType) { simpleTypeRef = simpleType; } void xs__element::complexTypePtr(xs__complexType *complexType) { complexTypeRef = complexType; } xs__element *xs__element::elementPtr() const { return elementRef; } const std::vector* xs__element::substitutionsPtr() const { return &substitutions; } xs__simpleType *xs__element::simpleTypePtr() const { return simpleTypeRef; } xs__complexType *xs__element::complexTypePtr() const { return complexTypeRef; } xs__simpleType::xs__simpleType() { schemaRef = NULL; level = 0; } int xs__simpleType::traverse(xs__schema &schema) { if (vflag) cerr << " Analyzing schema simpleType '" << (name ? name : "(null)") << "'" << endl; schemaRef = &schema; if (list) list->traverse(schema); else if (restriction) restriction->traverse(schema); else if (union_) union_->traverse(schema); return SOAP_OK; } void xs__simpleType::schemaPtr(xs__schema *schema) { schemaRef = schema; } xs__schema *xs__simpleType::schemaPtr() const { return schemaRef; } int xs__simpleType::baseLevel() { if (!level) { if (restriction) { level = -1; if (restriction->simpleTypePtr()) level = restriction->simpleTypePtr()->baseLevel() + 1; else level = 2; } else if (list && list->restriction) { level = -1; if (list->restriction->simpleTypePtr()) level = list->restriction->simpleTypePtr()->baseLevel() + 1; else level = 2; } else level = 1; } else if (level < 0) { cerr << "Error: cyclic simpleType restriction/extension base dependency in '" << (name ? name : "(null)") << "'" << endl; } return level; } xs__complexType::xs__complexType() { schemaRef = NULL; level = 0; } int xs__complexType::traverse(xs__schema &schema) { if (vflag) cerr << " Analyzing schema complexType '" << (name ? name : "(null)") << "'" << endl; schemaRef = &schema; if (simpleContent) simpleContent->traverse(schema); else if (complexContent) complexContent->traverse(schema); else if (all) all->traverse(schema); else if (choice) choice->traverse(schema); else if (sequence) sequence->traverse(schema); else if (any) any->traverse(schema); for (vector::iterator at = attribute.begin(); at != attribute.end(); ++at) (*at).traverse(schema); for (vector::iterator ag = attributeGroup.begin(); ag != attributeGroup.end(); ++ag) (*ag).traverse(schema); return SOAP_OK; } void xs__complexType::schemaPtr(xs__schema *schema) { schemaRef = schema; } xs__schema *xs__complexType::schemaPtr() const { return schemaRef; } int xs__complexType::baseLevel() { if (!level) { if (simpleContent) { if (simpleContent->restriction) { level = -1; if (simpleContent->restriction->simpleTypePtr()) level = simpleContent->restriction->simpleTypePtr()->baseLevel() + 1; else if (simpleContent->restriction->complexTypePtr()) level = simpleContent->restriction->complexTypePtr()->baseLevel() + 1; else level = 2; } else if (simpleContent->extension) { level = -1; if (simpleContent->extension->simpleTypePtr()) level = simpleContent->extension->simpleTypePtr()->baseLevel() + 1; else if (simpleContent->extension->complexTypePtr()) level = simpleContent->extension->complexTypePtr()->baseLevel() + 1; else level = 2; } } else if (complexContent) { if (complexContent->restriction) { level = -1; if (complexContent->restriction->simpleTypePtr()) level = complexContent->restriction->simpleTypePtr()->baseLevel() + 1; else if (complexContent->restriction->complexTypePtr()) level = complexContent->restriction->complexTypePtr()->baseLevel() + 1; else level = 2; } else if (complexContent->extension) { level = -1; if (complexContent->extension->simpleTypePtr()) level = complexContent->extension->simpleTypePtr()->baseLevel() + 1; else if (complexContent->extension->complexTypePtr()) level = complexContent->extension->complexTypePtr()->baseLevel() + 1; else level = 2; } } else level = 1; } else if (level < 0) { cerr << "Error: cyclic complexType restriction/extension base dependency in '" << (name ? name : "(null)") << "'" << endl; } return level; } int xs__simpleContent::traverse(xs__schema &schema) { if (vflag) cerr << " Analyzing schema simpleContent" << endl; if (extension) extension->traverse(schema); else if (restriction) restriction->traverse(schema); return SOAP_OK; } int xs__complexContent::traverse(xs__schema &schema) { if (vflag) cerr << " Analyzing schema complexContent" << endl; if (extension) extension->traverse(schema); else if (restriction) restriction->traverse(schema); return SOAP_OK; } xs__extension::xs__extension() { simpleTypeRef = NULL; complexTypeRef = NULL; } int xs__extension::traverse(xs__schema &schema) { if (vflag) cerr << " Analyzing schema extension '" << (base ? base : "(null)") << "'" << endl; if (group) group->traverse(schema); else if (all) all->traverse(schema); else if (choice) choice->traverse(schema); else if (sequence) sequence->traverse(schema); for (vector::iterator at = attribute.begin(); at != attribute.end(); ++at) (*at).traverse(schema); for (vector::iterator ag = attributeGroup.begin(); ag != attributeGroup.end(); ++ag) (*ag).traverse(schema); const char *token = qname_token(base, schema.targetNamespace); simpleTypeRef = NULL; if (token) { for (vector::iterator i = schema.simpleType.begin(); i != schema.simpleType.end(); ++i) if (!strcmp((*i).name, token)) { simpleTypeRef = &(*i); if (vflag) cerr << " Found extension base type '" << (token ? token : "(null)") << "'" << endl; break; } } if (!simpleTypeRef) { for (vector::const_iterator i = schema.import.begin(); i != schema.import.end(); ++i) { xs__schema *s = (*i).schemaPtr(); if (s) { token = qname_token(base, s->targetNamespace); if (token) { for (vector::iterator j = s->simpleType.begin(); j != s->simpleType.end(); ++j) { if (!strcmp((*j).name, token)) { simpleTypeRef = &(*j); if (vflag) cerr << " Found extension base type '" << (token ? token : "(null)") << "'" << endl; break; } } if (simpleTypeRef) break; } } } } token = qname_token(base, schema.targetNamespace); complexTypeRef = NULL; if (token) { for (vector::iterator i = schema.complexType.begin(); i != schema.complexType.end(); ++i) if ((*i).name && !strcmp((*i).name, token)) { complexTypeRef = &(*i); if (vflag) cerr << " Found extension base type '" << (token ? token : "(null)") << "'" << endl; break; } } if (!complexTypeRef) { for (vector::const_iterator i = schema.import.begin(); i != schema.import.end(); ++i) { xs__schema *s = (*i).schemaPtr(); if (s) { token = qname_token(base, s->targetNamespace); if (token) { for (vector::iterator j = s->complexType.begin(); j != s->complexType.end(); ++j) { if ((*j).name && !strcmp((*j).name, token)) { complexTypeRef = &(*j); if (vflag) cerr << " Found extension base type '" << (token ? token : "(null)") << "'" << endl; break; } } if (complexTypeRef) break; } } } } if (!simpleTypeRef && !complexTypeRef) { if (base) { if (is_builtin_qname(base)) schema.builtinType(base); else if (!Wflag) cerr << "\nWarning: could not find extension base type '" << base << "' in schema '" << (schema.targetNamespace ? schema.targetNamespace : "(null)") << "'" << endl; } else cerr << "Extension has no base" << endl; } return SOAP_OK; } void xs__extension::simpleTypePtr(xs__simpleType *simpleType) { simpleTypeRef = simpleType; } void xs__extension::complexTypePtr(xs__complexType *complexType) { complexTypeRef = complexType; } xs__simpleType *xs__extension::simpleTypePtr() const { return simpleTypeRef; } xs__complexType *xs__extension::complexTypePtr() const { return complexTypeRef; } xs__restriction::xs__restriction() { simpleTypeRef = NULL; complexTypeRef = NULL; } int xs__restriction::traverse(xs__schema &schema) { if (vflag) cerr << " Analyzing schema restriction '" << (base ? base : "(null)") << "'" << endl; if (simpleType) simpleType->traverse(schema); if (attributeGroup) attributeGroup->traverse(schema); if (group) group->traverse(schema); else if (all) all->traverse(schema); else if (choice) choice->traverse(schema); else if (sequence) sequence->traverse(schema); else { for (vector::iterator en = enumeration.begin(); en != enumeration.end(); ++en) (*en).traverse(schema); for (vector::iterator pn = pattern.begin(); pn != pattern.end(); ++pn) (*pn).traverse(schema); } for (vector::iterator at = attribute.begin(); at != attribute.end(); ++at) (*at).traverse(schema); const char *token = qname_token(base, schema.targetNamespace); simpleTypeRef = NULL; if (token) { for (vector::iterator i = schema.simpleType.begin(); i != schema.simpleType.end(); ++i) if (!strcmp((*i).name, token)) { simpleTypeRef = &(*i); if (vflag) cerr << " Found restriction base type '" << (token ? token : "(null)") << "'" << endl; break; } } if (!simpleTypeRef) { for (vector::const_iterator i = schema.import.begin(); i != schema.import.end(); ++i) { xs__schema *s = (*i).schemaPtr(); if (s) { token = qname_token(base, s->targetNamespace); if (token) { for (vector::iterator j = s->simpleType.begin(); j != s->simpleType.end(); ++j) { if (!strcmp((*j).name, token)) { simpleTypeRef = &(*j); if (vflag) cerr << " Found restriction base type '" << (token ? token : "(null)") << "'" << endl; break; } } if (simpleTypeRef) break; } } } } token = qname_token(base, schema.targetNamespace); complexTypeRef = NULL; if (token) { for (vector::iterator i = schema.complexType.begin(); i != schema.complexType.end(); ++i) if ((*i).name && !strcmp((*i).name, token)) { complexTypeRef = &(*i); if (vflag) cerr << " Found restriction base type '" << (token ? token : "(null)") << "'" << endl; break; } } if (!complexTypeRef) { for (vector::const_iterator i = schema.import.begin(); i != schema.import.end(); ++i) { xs__schema *s = (*i).schemaPtr(); if (s) { token = qname_token(base, s->targetNamespace); if (token) { for (vector::iterator j = s->complexType.begin(); j != s->complexType.end(); ++j) { if ((*j).name && !strcmp((*j).name, token)) { complexTypeRef = &(*j); if (vflag) cerr << " Found restriction base type '" << (token ? token : "(null)") << "'" << endl; break; } } if (complexTypeRef) break; } } } } if (!simpleTypeRef && !complexTypeRef) { if (base) { if (is_builtin_qname(base)) schema.builtinType(base); else if (!Wflag) cerr << "\nWarning: could not find restriction base type '" << base << "' in schema '" << (schema.targetNamespace ? schema.targetNamespace : "(null)") << "'" << endl; } else if (!simpleType) cerr << "Restriction has no base" << endl; } return SOAP_OK; } void xs__restriction::simpleTypePtr(xs__simpleType *simpleType) { simpleTypeRef = simpleType; } void xs__restriction::complexTypePtr(xs__complexType *complexType) { complexTypeRef = complexType; } xs__simpleType *xs__restriction::simpleTypePtr() const { return simpleTypeRef; } xs__complexType *xs__restriction::complexTypePtr() const { return complexTypeRef; } xs__list::xs__list() { itemTypeRef = NULL; } int xs__list::traverse(xs__schema &schema) { if (vflag) cerr << " Analyzing schema list" << endl; if (restriction) restriction->traverse(schema); for (vector::iterator i = simpleType.begin(); i != simpleType.end(); ++i) (*i).traverse(schema); itemTypeRef = NULL; const char *token = qname_token(itemType, schema.targetNamespace); if (token) { for (vector::iterator i = schema.simpleType.begin(); i != schema.simpleType.end(); ++i) if (!strcmp((*i).name, token)) { itemTypeRef = &(*i); if (vflag) cerr << " Found list itemType '" << (token ? token : "(null)") << "'" << endl; break; } } if (!itemTypeRef) { for (vector::const_iterator i = schema.import.begin(); i != schema.import.end(); ++i) { xs__schema *s = (*i).schemaPtr(); if (s) { token = qname_token(itemType, s->targetNamespace); if (token) { for (vector::iterator j = s->simpleType.begin(); j != s->simpleType.end(); ++j) { if (!strcmp((*j).name, token)) { itemTypeRef = &(*j); if (vflag) cerr << " Found list itemType '" << (token ? token : "(null)") << "'" << endl; break; } } if (itemTypeRef) break; } } } } if (itemType && !itemTypeRef) { if (is_builtin_qname(itemType)) schema.builtinType(itemType); else if (!Wflag) cerr << "\nWarning: could not find list itemType '" << itemType << "' in schema '" << (schema.targetNamespace ? schema.targetNamespace : "(null)") << "'" << endl; } return SOAP_OK; } void xs__list::itemTypePtr(xs__simpleType *simpleType) { itemTypeRef = simpleType; } xs__simpleType *xs__list::itemTypePtr() const { return itemTypeRef; } int xs__union::traverse(xs__schema &schema) { if (vflag) cerr << " Analyzing schema union" << endl; for (vector::iterator i = simpleType.begin(); i != simpleType.end(); ++i) (*i).traverse(schema); return SOAP_OK; } int xs__all::traverse(xs__schema &schema) { if (vflag) cerr << " Analyzing schema all" << endl; for (vector::iterator i = element.begin(); i != element.end(); ++i) (*i).traverse(schema); return SOAP_OK; } int xs__contents::traverse(xs__schema &schema) { switch (__union) { case SOAP_UNION_xs__union_content_element: if (__content.element) __content.element->traverse(schema); break; case SOAP_UNION_xs__union_content_group: if (__content.group) __content.group->traverse(schema); break; case SOAP_UNION_xs__union_content_choice: if (__content.choice) __content.choice->traverse(schema); break; case SOAP_UNION_xs__union_content_sequence: if (__content.sequence) __content.sequence->traverse(schema); break; case SOAP_UNION_xs__union_content_any: if (__content.any) __content.any->traverse(schema); break; } return SOAP_OK; } xs__seqchoice::xs__seqchoice() { schemaRef = NULL; } int xs__seqchoice::traverse(xs__schema &schema) { if (vflag) cerr << " Analyzing schema sequence/choice" << endl; schemaRef = &schema; for (vector::iterator c = __contents.begin(); c != __contents.end(); ++c) (*c).traverse(schema); return SOAP_OK; } void xs__seqchoice::schemaPtr(xs__schema *schema) { schemaRef = schema; } xs__schema *xs__seqchoice::schemaPtr() const { return schemaRef; } xs__attributeGroup::xs__attributeGroup() { schemaRef = NULL; attributeGroupRef = NULL; } int xs__attributeGroup::traverse(xs__schema& schema) { if (vflag) cerr << " Analyzing schema attributeGroup" << endl; schemaRef = &schema; for (vector::iterator at = attribute.begin(); at != attribute.end(); ++at) (*at).traverse(schema); for (vector::iterator ag = attributeGroup.begin(); ag != attributeGroup.end(); ++ag) (*ag).traverse(schema); attributeGroupRef = NULL; if (ref) { const char *token = qname_token(ref, schema.targetNamespace); if (token) { for (vector::iterator i = schema.attributeGroup.begin(); i != schema.attributeGroup.end(); ++i) if (!strcmp((*i).name, token)) { attributeGroupRef = &(*i); if (vflag) cerr << " Found attributeGroup '" << (name ? name : "(null)") << "' ref '" << (token ? token : "(null)") << "'" << endl; break; } } if (!attributeGroupRef) { for (vector::const_iterator i = schema.import.begin(); i != schema.import.end(); ++i) { xs__schema *s = (*i).schemaPtr(); if (s) { token = qname_token(ref, s->targetNamespace); if (token) { for (vector::iterator j = s->attributeGroup.begin(); j != s->attributeGroup.end(); ++j) { if (!strcmp((*j).name, token)) { attributeGroupRef = &(*j); if (vflag) cerr << " Found attribute Group '" << (name ? name : "(null)") << "' ref '" << (token ? token : "(null)") << "'" << endl; break; } } if (attributeGroupRef) break; } } } } if (!attributeGroupRef) if (!Wflag) cerr << "\nWarning: could not find the referenced attributeGroup '" << (name ? name : "") << "' ref '" << (ref ? ref : "(null)") << "' in schema '" << (schema.targetNamespace ? schema.targetNamespace : "(null)") << "'" << endl; } return SOAP_OK; } void xs__attributeGroup::schemaPtr(xs__schema *schema) { schemaRef = schema; } void xs__attributeGroup::attributeGroupPtr(xs__attributeGroup *attributeGroup) { attributeGroupRef = attributeGroup; } xs__schema *xs__attributeGroup::schemaPtr() const { return schemaRef; } xs__attributeGroup *xs__attributeGroup::attributeGroupPtr() const { return attributeGroupRef; } int xs__any::traverse(xs__schema &schema) { if (vflag) cerr << " Analyzing schema any" << endl; for (vector::iterator i = element.begin(); i != element.end(); ++i) (*i).traverse(schema); return SOAP_OK; } xs__group::xs__group() { schemaRef = NULL; groupRef = NULL; } int xs__group::traverse(xs__schema &schema) { if (vflag) cerr << " Analyzing schema group" << endl; schemaRef = &schema; if (all) all->traverse(schema); else if (choice) choice->traverse(schema); else if (sequence) sequence->traverse(schema); groupRef = NULL; if (ref) { const char *token = qname_token(ref, schema.targetNamespace); if (token) { for (vector::iterator i = schema.group.begin(); i != schema.group.end(); ++i) if (!strcmp((*i).name, token)) { groupRef = &(*i); if (vflag) cerr << " Found group '" << (name ? name : "(null)") << "' ref '" << (token ? token : "(null)") << "'" << endl; break; } } if (!groupRef) { for (vector::const_iterator i = schema.import.begin(); i != schema.import.end(); ++i) { xs__schema *s = (*i).schemaPtr(); if (s) { token = qname_token(ref, s->targetNamespace); if (token) { for (vector::iterator j = s->group.begin(); j != s->group.end(); ++j) { if (!strcmp((*j).name, token)) { groupRef = &(*j); if (vflag) cerr << " Found group '" << (name ? name : "(null)") << "' ref '" << (token ? token : "(null)") << "'" << endl; break; } } if (groupRef) break; } } } } if (!groupRef) if (!Wflag) cerr << "\nWarning: could not find the referenced group '" << (name ? name : "") << "' ref '" << (ref ? ref : "(null)") << "' in schema '" << (schema.targetNamespace ? schema.targetNamespace : "(null)") << "'" << endl; } return SOAP_OK; } void xs__group::schemaPtr(xs__schema *schema) { schemaRef = schema; } xs__schema* xs__group::schemaPtr() const { return schemaRef; } void xs__group::groupPtr(xs__group *group) { groupRef = group; } xs__group* xs__group::groupPtr() const { return groupRef; } int xs__enumeration::traverse(xs__schema &schema) { (void)schema; if (vflag) cerr << " Analyzing schema enumeration '" << (value ? value : "(null)") << "'" << endl; return SOAP_OK; } int xs__pattern::traverse(xs__schema &schema) { (void)schema; if (vflag) cerr << " Analyzing schema pattern" << endl; return SOAP_OK; } //////////////////////////////////////////////////////////////////////////////// // // I/O // //////////////////////////////////////////////////////////////////////////////// ostream &operator<<(ostream &o, const xs__schema &e) { if (!e.soap) { struct soap soap; soap_init2(&soap, SOAP_IO_DEFAULT, SOAP_XML_TREE | SOAP_C_UTFSTRING); soap_set_namespaces(&soap, namespaces); e.soap_serialize(&soap); soap_begin_send(&soap); e.soap_out(&soap, "xs:schema", 0, NULL); soap_end_send(&soap); soap_end(&soap); soap_done(&soap); } else { ostream *os = e.soap->os; e.soap->os = &o; e.soap_serialize(e.soap); soap_begin_send(e.soap); e.soap_out(e.soap, "xs:schema", 0, NULL); soap_end_send(e.soap); e.soap->os = os; } return o; } istream &operator>>(istream &i, xs__schema &e) { if (!e.soap) { e.soap = soap_new(); soap_set_namespaces(e.soap, namespaces); } istream *is = e.soap->is; e.soap->is = &i; if (soap_begin_recv(e.soap) || !e.soap_in(e.soap, "xs:schema", NULL) || soap_end_recv(e.soap)) { // handle error? Note: e.soap->error is set and app should check } e.soap->is = is; return i; } gsoap-2.8.28/gsoap/VisualStudio2005/wsdl2h/wsdl2h/wsp.h0000644000175000017500000002014012653650160021730 0ustar ellertellert/* wsp.h WS-Policy 1.2 and 1.5 binding schema -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2010, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap wsp schema documentation: WS-Policy binding //gsoap wsp schema namespace: http://www.w3.org/ns/ws-policy // 1.2 //gsoap wsp schema namespace: http://schemas.xmlsoap.org/ws/2004/09/policy //gsoap wsp schema elementForm: qualified //gsoap wsp schema attributeForm: unqualified #import "imports.h" #import "wsu.h" class wsp__Policy; class wsp__Content; extern class Service; extern class Types; class wsp__PolicyReference { public: @xsd__anyURI URI; @xsd__string Digest; @xsd__anyURI DigestAlgorithm; private: wsp__Policy *policyRef; public: int traverse(wsdl__definitions&); void policyPtr(wsp__Policy*); wsp__Policy *policyPtr() const; }; class wsp__Assertion { public: @bool Optional = false; @bool Ignorable = false; wsp__Content *Policy; }; #import "sp.h" #import "wsrmp.h" #import "wsam.h" class wsp__Content { public: wsp__Policy *Policy; wsp__PolicyReference *PolicyReference; std::vector All; std::vector ExactlyOne; std::vector sp__SignedParts; std::vector sp__EncryptedParts; std::vector sp__RequiredParts; sp__Elements *sp__SignedElements; sp__Elements *sp__EncryptedElements; sp__Elements *sp__ContentEncryptedElements; sp__Elements *sp__RequiredElements; sp__Token *sp__UsernameToken; sp__Token *sp__IssuedToken; sp__Token *sp__X509Token; sp__Token *sp__KerberosToken; sp__Token *sp__SpnegoContextToken; sp__Token *sp__SecurityContextToken; sp__Token *sp__SecureConversationToken; sp__Token *sp__SamlToken; sp__Token *sp__RelToken; sp__Token *sp__HttpsToken; sp__Token *sp__KeyValueToken; wsp__Assertion *sp__TransportBinding; wsp__Assertion *sp__TransportToken; wsp__Assertion *sp__AlgorithmSuite; wsp__Assertion *sp__Layout; wsp__Assertion *sp__SymmetricBinding; wsp__Assertion *sp__AsymmetricBinding; wsp__Assertion *sp__ProtectionToken; wsp__Assertion *sp__InitiatorToken; wsp__Assertion *sp__InitiatorSignatureToken; wsp__Assertion *sp__InitiatorEncryptionToken; wsp__Assertion *sp__RecipientToken; wsp__Assertion *sp__SupportingTokens; wsp__Assertion *sp__SignedSupportingTokens; wsp__Assertion *sp__EndorsingSupportingTokens; wsp__Assertion *sp__SignedEndorsingSupportingTokens; wsp__Assertion *sp__SignedEncryptedSupportingTokens; wsp__Assertion *sp__EncryptedSupportingTokens; wsp__Assertion *sp__EndorsingEncryptedSupportingTokens; wsp__Assertion *sp__SignedEndorsingEncryptedSupportingTokens; wsp__Assertion *sp__Wss10; wsp__Assertion *sp__Wss11; wsp__Assertion *sp__Trust10; wsp__Assertion *sp__Trust13; wsp__Content *sp__BootstrapPolicy; xsd__string wsaw__UsingAddressing; wsp__Assertion *wsam__Addressing; wsrmp__RMAssertion *wsrmp__RMAssertion_; wsrmp__RMAssertion *wsrmp__DeliveryAssurance; xsd__string wsrmp__AtLeastOnce; xsd__string wsrmp__AtMostOnce; xsd__string wsrmp__ExactlyOnce; xsd__string wsrmp__InOrder; wsp__Assertion *sp__NoPassword; wsp__Assertion *sp__HashPassword; wsp__Assertion *sp__IncludeTimestamp; wsp__Assertion *sp__EncryptBeforeSigning; wsp__Assertion *sp__EncryptSignature; wsp__Assertion *sp__ProtectTokens; wsp__Assertion *sp__OnlySignEntireHeadersAndBody; xsd__string sp__RequireDerivedKeys; xsd__string sp__RequireImpliedDerivedKeys; xsd__string sp__RequireExplicitDerivedKeys; xsd__string sp__WssUsernameToken10; xsd__string sp__WssUsernameToken11; xsd__string sp__RequireExternalReference; xsd__string sp__RequireInternalReference; xsd__string sp__RequireKeyIdentifierReference; xsd__string sp__RequireIssuerSerialReference; xsd__string sp__RequireEmbeddedTokenReference; xsd__string sp__RequireThumbprintReference; xsd__string sp__WssX509V3Token10; xsd__string sp__WssX509Pkcs7Token10; xsd__string sp__WssX509PkiPathV1Token10; xsd__string sp__WssX509V1Token11; xsd__string sp__WssX509V3Token11; xsd__string sp__WssX509Pkcs7Token11; xsd__string sp__WssX509PkiPathV1Token11; xsd__string sp__WssKerberosV5ApReqToken11; xsd__string sp__WssGssKerberosV5ApReqToken11; xsd__string sp__WssRelV10Token10; xsd__string sp__WssRelV20Token10; xsd__string sp__WssRelV10Token11; xsd__string sp__WssRelV20Token11; xsd__string sp__MustNotSendCancel; xsd__string sp__MustNotSendAmend; xsd__string sp__MustNotSendRenew; xsd__string sp__MustSupportRefKeyIdentifier; xsd__string sp__MustSupportRefIssuerSerial; xsd__string sp__MustSupportRefExternalURI; xsd__string sp__MustSupportRefEmbeddedToken; xsd__string sp__MustSupportRefThumbprint; xsd__string sp__MustSupportRefEncryptedKey; xsd__string sp__RequireSignatureConfirmation; xsd__string sp__MustSupportClientChallenge; xsd__string sp__MustSupportServerChallenge; xsd__string sp__RequireClientEntropy; xsd__string sp__RequireServerEntropy; xsd__string sp__MustSupportIssuedTokens; xsd__string sp__RequireRequestSecurityTokenCollection; xsd__string sp__RequireAppliesTo; xsd__string sp__RequireExternalUriReference; xsd__string sp__SC13SecurityContextToken; xsd__string sp__Strict; xsd__string sp__Lax; xsd__string sp__LaxTsFirst; xsd__string sp__LaxTsLast; xsd__string sp__HttpBasicAuthentication; xsd__string sp__HttpDigestAuthentication; xsd__string sp__RequireClientCertificate; xsd__string sp__Basic256; xsd__string sp__Basic192; xsd__string sp__Basic128; xsd__string sp__TripleDes; xsd__string sp__Basic256Rsa15; xsd__string sp__Basic192Rsa15; xsd__string sp__Basic128Rsa15; xsd__string sp__TripleDesRsa15; xsd__string sp__Basic256Sha256; xsd__string sp__Basic192Sha256; xsd__string sp__Basic128Sha256; xsd__string sp__TripleDesSha256; xsd__string sp__Basic256Sha256Rsa15; xsd__string sp__Basic192Sha256Rsa15; xsd__string sp__Basic128Sha256Rsa15; xsd__string sp__TripleDesSha256Rsa15; xsd__string sp__InclusiveC14N; xsd__string sp__SOAPNormalization10; xsd__string sp__STRTransform10; xsd__string sp__Path10; xsd__string sp__XPathFilter20; xsd__string sp__AbsXPath; xsd__string wsam__AnonymousResponses; xsd__string wsam__NonAnonymousResponses; std::vector<_XML> __any; public: int traverse(wsdl__definitions&); void generate(Service& service, Types& types, int indent) const; }; class wsp__Policy : public wsp__Content { public: @xsd__anyURI xml__base; @xsd__string wsu__Id; @xsd__anyURI TargetNamespace; }; class wsp__Attachment { public: wsp__Policy *Policy; wsp__PolicyReference *PolicyReference; }; class wsp__AppliesTo { public: _XML __any; }; class wsp__PolicyAttachment { public: wsp__AppliesTo *AppliesTo; std::vector Attachment; }; gsoap-2.8.28/gsoap/VisualStudio2005/wsdl2h/wsdl2h/wsp.cpp0000644000175000017500000010340112653650160022265 0ustar ellertellert/* wsp.cpp WS-Policy 1.2 and 1.5 binding schema -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2010, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "wsdlH.h" #include "includes.h" #include "types.h" #include "service.h" static wsp__Policy *search(const char *URI, wsdl__definitions& definitions); static wsp__Policy *search(const char *URI, wsp__Policy *policy); static wsp__Policy *search(const char *URI, wsp__Content *content); static void gen_parts(const sp__Parts& parts, Types& types, const char *what, const char *name, int indent); //////////////////////////////////////////////////////////////////////////////// // // wsp:OperatorContentType // //////////////////////////////////////////////////////////////////////////////// int wsp__Content::traverse(wsdl__definitions& definitions) { if (vflag) cerr << " Analyzing wsp Policy" << endl; if (Policy) Policy->traverse(definitions); if (PolicyReference) PolicyReference->traverse(definitions); for (vector::iterator i = All.begin(); i != All.end(); ++i) { if (*i) (*i)->traverse(definitions); } for (vector::iterator j = ExactlyOne.begin(); j != ExactlyOne.end(); ++j) { if (*j) (*j)->traverse(definitions); } return SOAP_OK; } void wsp__Content::generate(Service& service, Types& types, int indent) const { static const char stabs[] = "\t\t\t\t\t\t\t\t\t\t"; const char *tabs; if (indent > 8) indent = 8; tabs = stabs + 9 - indent; // Recursive policies and references if (Policy) Policy->generate(service, types, indent); if (PolicyReference && PolicyReference->policyPtr()) PolicyReference->policyPtr()->generate(service, types, indent); // WS-Policy All if (!All.empty()) { fprintf(stream, "%s- All of the following:\n", tabs); for (vector::const_iterator p = All.begin(); p != All.end(); ++p) if (*p) (*p)->generate(service, types, indent + 1); } // WS-Policy ExactlyOne if (!ExactlyOne.empty()) { fprintf(stream, "%s- Exactly one of the following:\n", tabs); for (vector::const_iterator p = ExactlyOne.begin(); p != ExactlyOne.end(); ++p) if (*p) (*p)->generate(service, types, indent + 1); } // WS-SecurityPolicy Parts (TODO: do we need vectors of these?) for (vector::const_iterator sp = sp__SignedParts.begin(); sp != sp__SignedParts.end(); ++sp) gen_parts(*sp, types, "sign", "[4.1.1] WS-Security Signed Parts", indent); for (vector::const_iterator ep = sp__EncryptedParts.begin(); ep != sp__EncryptedParts.end(); ++ep) gen_parts(*ep, types, "encrypt", "[4.2.1] Security Encrypted Parts", indent); for (vector::const_iterator rp = sp__RequiredParts.begin(); rp != sp__RequiredParts.end(); ++rp) { fprintf(stream, "%s- Required Header elements:", tabs); for (vector::const_iterator h = (*rp).Header.begin(); h != (*rp).Header.end(); ++h) if ((*h).Name) fprintf(stream, " %s", types.aname(NULL, (*h).Namespace, (*h).Name)); else if ((*h).Namespace) fprintf(stream, " %s", (*h).Namespace); } // WS-SecurityPolicy Elements sp__Elements *elts = NULL; const char *elts_name = NULL; if (sp__SignedElements) { elts = sp__SignedElements; elts_name = "[4.1.2] Signed"; } if (sp__EncryptedElements) { elts = sp__EncryptedElements; elts_name = "[4.2.2] Encrypted"; } if (sp__ContentEncryptedElements) { elts = sp__ContentEncryptedElements; elts_name = "[4.2.3] Content Encrypted"; } if (sp__RequiredElements) { elts = sp__RequiredElements; elts_name = "[4.3.1] Required"; } if (elts) { fprintf(stream, "%s- %s Elements requirements (XPath%s):\n%s @verbatim\n", tabs, elts_name, elts->XPathVersion?elts->XPathVersion:"", tabs); for (vector::const_iterator s = elts->XPath.begin(); s != elts->XPath.end(); ++s) { fprintf(stream, "%s ", tabs); text(*s); } fprintf(stream, "%s @endverbatim\n", tabs); service.add_import("wsse.h"); } // WS-SecurityPolicy Tokens sp__Token *token = NULL; const char *token_name = NULL; if (sp__UsernameToken) { token = sp__UsernameToken; token_name = "[5.4.1] WS-Security Username"; } else if (sp__IssuedToken) { token = sp__IssuedToken; token_name = "[5.4.2] WS-Trust Issued"; } else if (sp__X509Token) { token = sp__X509Token; token_name = "[5.4.3] WS-Security X509"; } else if (sp__KerberosToken) { token = sp__KerberosToken; token_name = "[5.4.4] WS-Security Kerberos"; } else if (sp__SpnegoContextToken) { token = sp__SpnegoContextToken; token_name = "[5.4.5] WS-Trust n-leg RST/RSTR SPNEGO binary negotiation protocol (SpnegoContext)"; } else if (sp__SecurityContextToken) { token = sp__SecurityContextToken; token_name = "[5.4.6] WS-SecureConversation SecurityContext"; } else if (sp__SecureConversationToken) { token = sp__SecureConversationToken; token_name = "[5.4.7] WS-SecureConversation"; } else if (sp__SamlToken) { token = sp__SamlToken; token_name = "[5.4.8] SAML"; } else if (sp__RelToken) { token = sp__RelToken; token_name = "[5.4.9] WSS-REL"; } else if (sp__HttpsToken) { token = sp__HttpsToken; token_name = "[5.4.10] HTTPS"; } else if (sp__KeyValueToken) { token = sp__KeyValueToken; token_name = "[5.4.11] XML Signature"; } if (token) { fprintf(stream, "%s- %s required:\n", tabs, token_name); if (token->IncludeToken) fprintf(stream, "%s -# IncludeToken = %s\n", tabs, token->IncludeToken); if (token->Issuer && token->Issuer->Address) fprintf(stream, "%s -# Issuer = %s\n", tabs, token->Issuer->Address); if (token->IssuerName) fprintf(stream, "%s -# Issuer Name = %s\n", tabs, token->IssuerName); if (token->Policy) token->Policy->generate(service, types, indent + 1); // TODO: add wst:Claims? service.add_import("wsse.h"); } // WS-SecurityPolicy if (sp__AlgorithmSuite) { fprintf(stream, "%s- [7.1] Security Binding Algorithm Suite requirements:\n", tabs); if (sp__AlgorithmSuite->Policy) sp__AlgorithmSuite->Policy->generate(service, types, indent + 1); } if (sp__Layout) { fprintf(stream, "%s- [7.2] WS-Security Header Layout requirements:\n", tabs); if (sp__Layout->Policy) sp__Layout->Policy->generate(service, types, indent + 1); } if (sp__TransportBinding) { fprintf(stream, "%s- [7.3] Transport Binding%s requirements:\n", tabs, sp__TransportBinding->Optional ? " (optional)" : sp__TransportBinding->Ignorable ? " (ignorable)" : ""); if (sp__TransportBinding->Policy) sp__TransportBinding->Policy->generate(service, types, indent + 1); } if (sp__TransportToken) { fprintf(stream, "%s- Transport%s requirements:\n", tabs, sp__TransportToken->Optional ? " (optional)" : sp__TransportToken->Ignorable ? " (ignorable)" : ""); if (sp__TransportToken->Policy) sp__TransportToken->Policy->generate(service, types, indent + 1); } if (sp__SymmetricBinding) { fprintf(stream, "%s- [7.4] WS-Security Symmetric Binding%s requirements:\n", tabs, sp__SymmetricBinding->Optional ? " (optional)" : sp__SymmetricBinding->Ignorable ? " (ignorable)" : ""); if (sp__SymmetricBinding->Policy) sp__SymmetricBinding->Policy->generate(service, types, indent + 1); service.add_import("wsse.h"); } if (sp__ProtectionToken) { fprintf(stream, "%s- Symmetric Protection%s requirements:\n", tabs, sp__ProtectionToken->Optional ? " (optional)" : sp__ProtectionToken->Ignorable ? " (ignorable)" : ""); if (sp__ProtectionToken->Policy) sp__ProtectionToken->Policy->generate(service, types, indent + 1); } if (sp__AsymmetricBinding) { fprintf(stream, "%s- [7.5] WS-Security Asymmetric Binding%s (public key) requirements:\n", tabs, sp__AsymmetricBinding->Optional ? " (optional)" : sp__AsymmetricBinding->Ignorable ? " (ignorable)" : ""); if (sp__AsymmetricBinding->Policy) sp__AsymmetricBinding->Policy->generate(service, types, indent + 1); service.add_import("wsse.h"); } if (sp__InitiatorToken) { fprintf(stream, "%s- Initiator%s requirements:\n", tabs, sp__InitiatorToken->Optional ? " (optional)" : sp__InitiatorToken->Ignorable ? " (ignorable)" : ""); if (sp__InitiatorToken->Policy) sp__InitiatorToken->Policy->generate(service, types, indent + 1); } if (sp__InitiatorSignatureToken) { fprintf(stream, "%s- Initiator Signature%s requirements:\n", tabs, sp__InitiatorSignatureToken->Optional ? " (optional)" : sp__InitiatorSignatureToken->Ignorable ? " (ignorable)" : ""); if (sp__InitiatorSignatureToken->Policy) sp__InitiatorSignatureToken->Policy->generate(service, types, indent + 1); } if (sp__InitiatorEncryptionToken) { fprintf(stream, "%s- Initiator Encryption%s requirements:\n", tabs, sp__InitiatorEncryptionToken->Optional ? " (optional)" : sp__InitiatorEncryptionToken->Ignorable ? " (ignorable)" : ""); if (sp__InitiatorEncryptionToken->Policy) sp__InitiatorEncryptionToken->Policy->generate(service, types, indent + 1); } if (sp__RecipientToken) { fprintf(stream, "%s- Recipient%s requirements:\n", tabs, sp__RecipientToken->Optional ? " (optional)" : sp__RecipientToken->Ignorable ? " (ignorable)" : ""); if (sp__RecipientToken->Policy) sp__RecipientToken->Policy->generate(service, types, indent + 1); } if (sp__SupportingTokens) { fprintf(stream, "%s- [8.1] Supporting Tokens%s requirements:\n", tabs, sp__SupportingTokens->Optional ? " (optional)" : sp__SupportingTokens->Ignorable ? " (ignorable)" : ""); if (sp__SupportingTokens->Policy) sp__SupportingTokens->Policy->generate(service, types, indent + 1); } if (sp__SignedSupportingTokens) { fprintf(stream, "%s- [8.2] Signed Supporting Tokens%s requirements:\n", tabs, sp__SignedSupportingTokens->Optional ? " (optional)" : sp__SignedSupportingTokens->Ignorable ? " (ignorable)" : ""); if (sp__SignedSupportingTokens->Policy) sp__SignedSupportingTokens->Policy->generate(service, types, indent + 1); } if (sp__EndorsingSupportingTokens) { fprintf(stream, "%s- [8.3] Endorsing Supporting Tokens%s requirements:\n", tabs, sp__EndorsingSupportingTokens->Optional ? " (optional)" : sp__EndorsingSupportingTokens->Ignorable ? " (ignorable)" : ""); if (sp__EndorsingSupportingTokens->Policy) sp__EndorsingSupportingTokens->Policy->generate(service, types, indent + 1); } if (sp__SignedEndorsingSupportingTokens) { fprintf(stream, "%s- [8.4] Signed Endorsing Supporting Tokens%s requirements:\n", tabs, sp__SignedEndorsingSupportingTokens->Optional ? " (optional)" : sp__SignedEndorsingSupportingTokens->Ignorable ? " (ignorable)" : ""); if (sp__SignedEndorsingSupportingTokens->Policy) sp__SignedEndorsingSupportingTokens->Policy->generate(service, types, indent + 1); } if (sp__SignedEncryptedSupportingTokens) { fprintf(stream, "%s- [8.5] Signed Encrypted Supporting Tokens%s requirements:\n", tabs, sp__SignedEncryptedSupportingTokens->Optional ? " (optional)" : sp__SignedEncryptedSupportingTokens->Ignorable ? " (ignorable)" : ""); if (sp__SignedEncryptedSupportingTokens->Policy) sp__SignedEncryptedSupportingTokens->Policy->generate(service, types, indent + 1); } if (sp__EncryptedSupportingTokens) { fprintf(stream, "%s- [8.6] Encrypted Supporting Tokens%s requirements:\n", tabs, sp__EncryptedSupportingTokens->Optional ? " (optional)" : sp__EncryptedSupportingTokens->Ignorable ? " (ignorable)" : ""); if (sp__EncryptedSupportingTokens->Policy) sp__EncryptedSupportingTokens->Policy->generate(service, types, indent + 1); } if (sp__EndorsingEncryptedSupportingTokens) { fprintf(stream, "%s- [8.7] Endorsing Encrypted Supporting Tokens%s requirements:\n", tabs, sp__EndorsingEncryptedSupportingTokens->Optional ? " (optional)" : sp__EndorsingEncryptedSupportingTokens->Ignorable ? " (ignorable)" : ""); if (sp__EndorsingEncryptedSupportingTokens->Policy) sp__EndorsingEncryptedSupportingTokens->Policy->generate(service, types, indent + 1); } if (sp__SignedEndorsingEncryptedSupportingTokens) { fprintf(stream, "%s- [8.8] Signed Endorsing Encrypted Supporting Tokens%s requirements:\n", tabs, sp__SignedEndorsingEncryptedSupportingTokens->Optional ? " (optional)" : sp__SignedEndorsingEncryptedSupportingTokens->Ignorable ? " (ignorable)" : ""); if (sp__SignedEndorsingEncryptedSupportingTokens->Policy) sp__SignedEndorsingEncryptedSupportingTokens->Policy->generate(service, types, indent + 1); } // Wss10 or Wss11 if (sp__Wss10) { fprintf(stream, "%s- [9.1] WSS: SOAP Message Security 1.0%s options:\n", tabs, sp__Wss10->Optional ? " (optional)" : sp__Wss10->Ignorable ? " (ignorable)" : ""); if (sp__Wss10->Policy) sp__Wss10->Policy->generate(service, types, indent + 1); service.add_import("wsse.h"); } else if (sp__Wss11) { fprintf(stream, "%s- [9.2] WSS: SOAP Message Security 1.1%s options:\n", tabs, sp__Wss11->Optional ? " (optional)" : sp__Wss11->Ignorable ? " (ignorable)" : ""); if (sp__Wss11->Policy) sp__Wss11->Policy->generate(service, types, indent + 1); service.add_import("wsse.h"); } if (sp__MustSupportRefKeyIdentifier) fprintf(stream, "%s- Key Identifier References\n", tabs); if (sp__MustSupportRefIssuerSerial) fprintf(stream, "%s- Issuer Serial References\n", tabs); if (sp__MustSupportRefExternalURI) fprintf(stream, "%s- External URI References\n", tabs); if (sp__MustSupportRefEmbeddedToken) fprintf(stream, "%s- Embedded Token References\n", tabs); if (sp__MustSupportRefThumbprint) fprintf(stream, "%s- Thumbprint References\n", tabs); if (sp__MustSupportRefEncryptedKey) fprintf(stream, "%s- EncryptedKey References\n", tabs); if (sp__RequireSignatureConfirmation) fprintf(stream, "%s- Signature Confirmation\n", tabs); // WS-SecureConversation if (sp__RequireDerivedKeys) fprintf(stream, "%s- Properties = WS-SecureConversation RequireDerivedKeys\n", tabs); else if (sp__RequireImpliedDerivedKeys) fprintf(stream, "%s- Properties = WS-SecureConversation RequireImpliedDerivedKeys\n", tabs); else if (sp__RequireExplicitDerivedKeys) fprintf(stream, "%s- Properties = WS-SecureConversation RequireExplicitDerivedKeys\n", tabs); if (sp__MustNotSendCancel) fprintf(stream, "%s- WS-SecureConversation STS issuing the secure conversation token does not support SCT/Cancel RST messages", tabs); else if (sp__MustNotSendAmend) fprintf(stream, "%s- WS-SecureConversation STS issuing the secure conversation token does not support SCT/Amend RST messages", tabs); else if (sp__MustNotSendRenew) fprintf(stream, "%s- WS-SecureConversation STS issuing the secure conversation token does not support SCT/Renew RST messages", tabs); if (sp__RequireExternalUriReference) fprintf(stream, "%s- WS-SecureConversation external URI reference is required", tabs); if (sp__SC13SecurityContextToken) fprintf(stream, "%s- WS-SecureConversation Security Context Token should be used", tabs); // WS-Security passwords if (sp__NoPassword) fprintf(stream, "%s- No WS-Security password%s required\n", tabs, sp__NoPassword->Optional ? " (optional)" : sp__NoPassword->Ignorable ? " (ignorable)" : ""); else if (sp__HashPassword) { fprintf(stream, "%s- Client-side WS-Security password%s should be set:\n\t@code\n\t#include \"plugin/wsseapi.h\"\n\tsoap_wsse_add_UsernameTokenDigest(soap, \"User\", \"\", \"\");\n\t@endcode\n", tabs, sp__HashPassword->Optional ? " (optional)" : sp__HashPassword->Ignorable ? " (ignorable)" : ""); fprintf(stream, "%s- Server-side WS-Security password%s verified with:\n\t@code\n\t#include \"plugin/wsseapi.h\"\n\tconst char *username = soap_wsse_get_Username(soap);\n\t...\n\tif (soap_wsse_verify_Password(soap, \"\")) ......\n\t@endcode\n", tabs, sp__HashPassword->Optional ? " (optional)" : sp__HashPassword->Ignorable ? " (ignorable)" : ""); service.add_import("wsse.h"); } if (sp__WssUsernameToken10) { fprintf(stream, "%s- Username token should be used as defined in UsernameTokenProfile1.0:\n", tabs); fprintf(stream, "%s - Client-side WS-Security password should be set:\n\t@code\n\t#include \"plugin/wsseapi.h\"\n\tsoap_wsse_add_UsernameTokenDigest(soap, \"User\", \"\", \"\");\n\t@endcode\n", tabs); fprintf(stream, "%s - Server-side WS-Security password verified with:\n\t@code\n\t#include \"plugin/wsseapi.h\"\n\tconst char *username = soap_wsse_get_Username(soap);\n\t...\n\tif (soap_wsse_verify_Password(soap, \"\")) \n\t@endcode\n", tabs); service.add_import("wsse.h"); } else if (sp__WssUsernameToken11) { fprintf(stream, "%s- Username token should be used as defined in UsernameTokenProfile1.1:\n", tabs); fprintf(stream, "%s - Client-side WS-Security plain-text password should be set:\n\t@code\n\t#include \"plugin/wsseapi.h\"\n\tsoap_wsse_add_UsernameToken(soap, \"User\", \"\", \"\");\n\t@endcode\n", tabs); fprintf(stream, "%s - Client-side WS-Security digest password should be set:\n\t@code\n\t#include \"plugin/wsseapi.h\"\n\tsoap_wsse_add_UsernameTokenDigest(soap, \"User\", \"\", \"\");\n\t@endcode\n", tabs); fprintf(stream, "%s - Server-side WS-Security password verified with:\n\t@code\n\t#include \"plugin/wsseapi.h\"\n\tconst char *username = soap_wsse_get_Username(soap);\n\t...\n\tif (soap_wsse_verify_Password(soap, \"\")) ...\n\t@endcode\n", tabs); service.add_import("wsse.h"); } // WS-Trust if (sp__RequireExternalReference) fprintf(stream, "%s- WS-Trust external reference is required when referencing this token\n", tabs); else if (sp__RequireInternalReference) fprintf(stream, "%s- WS-Trust internal reference is required when referencing this token\n", tabs); // WS-Trust 1.0 and 1.3 if (sp__Trust10) { fprintf(stream, "%s- [10.1] WS-Trust 1.0%s options:\n", tabs, sp__Trust10->Optional ? " (optional)" : sp__Trust10->Ignorable ? " (ignorable)" : ""); if (sp__Trust10->Policy) sp__Trust10->Policy->generate(service, types, indent + 1); service.add_import("wst.h"); } else if (sp__Trust13) { fprintf(stream, "%s- [10.1] WS-Trust 1.3%s options:\n", tabs, sp__Trust13->Optional ? " (optional)" : sp__Trust13->Ignorable ? " (ignorable)" : ""); if (sp__Trust13->Policy) sp__Trust13->Policy->generate(service, types, indent + 1); service.add_import("wst.h"); } if (sp__MustSupportClientChallenge) { fprintf(stream, "%s- Client Challenge\n", tabs); service.add_import("wst.h"); } if (sp__MustSupportServerChallenge) { fprintf(stream, "%s- Server Challenge\n", tabs); service.add_import("wst.h"); } if (sp__RequireClientEntropy) { fprintf(stream, "%s- Client Entropy\n", tabs); service.add_import("wst.h"); } if (sp__RequireServerEntropy) { fprintf(stream, "%s- Server Entropy\n", tabs); service.add_import("wst.h"); } if (sp__MustSupportIssuedTokens) { fprintf(stream, "%s- Issued Tokens\n", tabs); service.add_import("wst.h"); } if (sp__RequireRequestSecurityTokenCollection) { fprintf(stream, "%s- Collection\n", tabs); service.add_import("wst.h"); } if (sp__RequireAppliesTo) { fprintf(stream, "%s- STS requires the requestor to specify the scope for the issued token using wsp:AppliesTo in the RST\n", tabs); service.add_import("wst.h"); } // WS-Security header layout if (sp__IncludeTimestamp) { fprintf(stream, "%s- WS-Security Timestamp%s should be set prior to send:\n\t@code\n\t#include \"plugin/wsseapi.h\"\n\tsoap_wsse_add_Timestamp(soap, \"Timestamp\", );\n\t@endcode\n", tabs, sp__IncludeTimestamp->Optional ? " (optional)" : sp__IncludeTimestamp->Ignorable ? " (ignorable)" : ""); fprintf(stream, "%s- WS-Security Timestamp%s presence and expiration verified post-receive with:\n\t@code\n\t#include \"plugin/wsseapi.h\"\n\tif (soap_wsse_verify_Timestamp(soap)) ......\n\t@endcode\n", tabs, sp__IncludeTimestamp->Optional ? " (optional)" : sp__IncludeTimestamp->Ignorable ? " (ignorable)" : ""); } if (sp__EncryptBeforeSigning) fprintf(stream, "%s- WS-Security Encrypt Before Signing%s (gSOAP unsupported)\n", tabs, sp__EncryptBeforeSigning->Optional ? " (optional)" : sp__EncryptBeforeSigning->Ignorable ? " (ignorable)" : ""); if (sp__EncryptSignature) fprintf(stream, "%s- WS-Security Encrypt Signature%s\n\t@code\n\t#include \"plugin/wsseapi.h\"\n\tsoap_wsse_add_EncryptedKey_encrypt_only(soap, , NULL, , NULL, , , \"ds:Signature SOAP-ENV:Body\");\n\t@endcode\n", tabs, sp__EncryptSignature->Optional ? " (optional)" : sp__EncryptSignature->Ignorable ? " (ignorable)" : ""); if (sp__ProtectTokens) fprintf(stream, "%s- WS-Security Token Protection%s required\n", tabs, sp__ProtectTokens->Optional ? " (optional)" : sp__ProtectTokens->Ignorable ? " (ignorable)" : ""); if (sp__OnlySignEntireHeadersAndBody) { fprintf(stream, "%s- WS-Security Sign Entire Headers and Body%s:\n\t@code\n\t#include \"plugin/wsseapi.h\"\n\tsoap_wsse_set_wsu_id(soap, \" ...\"); // list each ns:tagname used in SOAP Header\n\tsoap_wsse_sign_body(soap, , , );\n\t@endcode\n", tabs, sp__OnlySignEntireHeadersAndBody->Optional ? " (optional)" : sp__OnlySignEntireHeadersAndBody->Ignorable ? " (ignorable)" : ""); } if (sp__Strict) fprintf(stream, "%s- WS-Security headers 'declare before use' required (gSOAP default)\n", tabs); else if (sp__Lax) fprintf(stream, "%s- WS-Security headers may occur in any order (gSOAP allows this)\n", tabs); else if (sp__LaxTsFirst) fprintf(stream, "%s- WS-Security Timestamp must appear first (gSOAP default)\n", tabs); else if (sp__LaxTsLast) fprintf(stream, "%s- WS-Security Timestamp must appear last (requires changing the placement of the Timestamp header in SOAP_ENV__Header defined in import/wsse.h)\n", tabs); // HTTP authentication if (sp__HttpBasicAuthentication) fprintf(stream, "%s- HTTP/S Basic Authentication required:\n\t@code\n\tsoap->userid = \"\"; soap->passwd = \"\";\nsoap_call_ns__method(...)\n\t@endcode\n", tabs); else if (sp__HttpDigestAuthentication) fprintf(stream, "%s- HTTP/S Digest Authentication required:\n%sSee plugin/httpda.c plugin for usage details\n", tabs, tabs); if (sp__RequireClientCertificate) fprintf(stream, "%s- HTTPS client must authenticate to server with a certificate:\n\t@code\n\tsoap_ssl_client_context(soap, , \"\", \"\", ...)\n\t@endcode\n", tabs); // Security token requirements if (sp__RequireKeyIdentifierReference) fprintf(stream, "%s- Key identifier reference is required\n", tabs); if (sp__RequireIssuerSerialReference) fprintf(stream, "%s- Issuer serial reference is required\n", tabs); if (sp__RequireEmbeddedTokenReference) fprintf(stream, "%s- An embedded token reference is required\n", tabs); if (sp__RequireThumbprintReference) fprintf(stream, "%s- A thumbprint reference is required\n", tabs); // Algorithm suite if (sp__Basic256) fprintf(stream, "%s- Basic256\n", tabs); else if (sp__Basic192) fprintf(stream, "%s- Basic192\n", tabs); else if (sp__Basic128) fprintf(stream, "%s- Basic128\n", tabs); else if (sp__TripleDes) fprintf(stream, "%s- TripleDes\n", tabs); else if (sp__Basic256Rsa15) fprintf(stream, "%s- Basic256Rsa15\n", tabs); else if (sp__Basic192Rsa15) fprintf(stream, "%s- Basic192Rsa15\n", tabs); else if (sp__Basic128Rsa15) fprintf(stream, "%s- Basic128Rsa15\n", tabs); else if (sp__TripleDesRsa15) fprintf(stream, "%s- TripleDesRsa15\n", tabs); else if (sp__Basic256Sha256) fprintf(stream, "%s- Basic256Sha256\n", tabs); else if (sp__Basic192Sha256) fprintf(stream, "%s- Basic192Sha256\n", tabs); else if (sp__Basic128Sha256) fprintf(stream, "%s- Basic128Sha256\n", tabs); else if (sp__TripleDesSha256) fprintf(stream, "%s- TripleDesSha256\n", tabs); else if (sp__Basic256Sha256Rsa15) fprintf(stream, "%s- Basic256Sha256Rsa15\n", tabs); else if (sp__Basic192Sha256Rsa15) fprintf(stream, "%s- Basic192Sha256Rsa15\n", tabs); else if (sp__Basic128Sha256Rsa15) fprintf(stream, "%s- Basic128Sha256Rsa15\n", tabs); else if (sp__TripleDesSha256Rsa15) fprintf(stream, "%s- TripleDesSha256Rsa15\n", tabs); if (sp__InclusiveC14N) fprintf(stream, "%s- InclusiveC14N\n", tabs); if (sp__SOAPNormalization10) fprintf(stream, "%s- SOAPNormalization10\n", tabs); if (sp__STRTransform10) fprintf(stream, "%s- STRTransform10\n", tabs); if (sp__Path10) fprintf(stream, "%s- Path10\n", tabs); else if (sp__XPathFilter20) fprintf(stream, "%s- XPathFilter20\n", tabs); else if (sp__AbsXPath) fprintf(stream, "%s- AbsXPath\n", tabs); // WSS if (sp__WssX509V3Token10) fprintf(stream, "%s- An X509 Version 3 token should be used as defined in X509TokenProfile1.0\n", tabs); else if (sp__WssX509Pkcs7Token10) fprintf(stream, "%s- An X509 PKCS7 token should be used as defined in X509TokenProfile1.0\n", tabs); else if (sp__WssX509PkiPathV1Token10) fprintf(stream, "%s- An X509 PKI Path Version 1 token should be used as defined in X509TokenProfile1.0\n", tabs); else if (sp__WssX509V1Token11) fprintf(stream, "%s- An X509 Version 1 token should be used as defined in X509TokenProfile1.1\n", tabs); else if (sp__WssX509V3Token11) fprintf(stream, "%s- An X509 Version 3 token should be used as defined in X509TokenProfile1.1\n", tabs); else if (sp__WssX509Pkcs7Token11) fprintf(stream, "%s- An X509 PKCS7 token should be used as defined in X509TokenProfile1.1\n", tabs); else if (sp__WssX509PkiPathV1Token11) fprintf(stream, "%s- An X509 PKI Path Version 1 token should be used as defined in X509TokenProfile1.1\n", tabs); if (sp__WssKerberosV5ApReqToken11) fprintf(stream, "%s- A Kerberos Version 5 AP-REQ X509 token should be used as defined in KerberosTokenProfile1.1\n", tabs); else if (sp__WssGssKerberosV5ApReqToken11) fprintf(stream, "%s- A GSS Kerberos Version 5 AP-REQ token should be used as defined in KerberosTokenProfile1.1\n", tabs); if (sp__WssRelV10Token10) fprintf(stream, "%s- A REL Version 1.0 token should be used as defined in RELTokenProfile1.0\n", tabs); else if (sp__WssRelV20Token10) fprintf(stream, "%s- A REL Version 2.0 token should be used as defined in RELTokenProfile1.0\n", tabs); else if (sp__WssRelV10Token11) fprintf(stream, "%s- A REL Version 1.0 token should be used as defined in RELTokenProfile1.1\n", tabs); else if (sp__WssRelV20Token11) fprintf(stream, "%s- A REL Version 2.0 token should be used as defined in RELTokenProfile1.1\n", tabs); if (sp__BootstrapPolicy) { fprintf(stream, "%s- SecureConversation BootstrapPolicy\n", tabs); sp__BootstrapPolicy->generate(service, types, indent + 1); } // WS-Addressing WSDL Policy if (wsaw__UsingAddressing) { fprintf(stream, "%s- WS-Addressing is used\n", tabs); service.add_import("wsa5.h"); } // WS-Addressing Metadata Policy if (wsam__Addressing) { fprintf(stream, "%s- WS-Addressing%s is used\n", tabs, wsam__Addressing->Optional ? " (optional)" : wsam__Addressing->Ignorable ? " (ignorable)" : ""); if (wsam__Addressing->Policy) wsam__Addressing->Policy->generate(service, types, indent + 1); service.add_import("wsa5.h"); } if (wsam__AnonymousResponses) fprintf(stream, "%s- WS-Addressing Anonymous Responses\n", tabs); else if (wsam__NonAnonymousResponses) fprintf(stream, "%s- WS-Addressing NonAnonymous Responses\n", tabs); // WS-ReliableMessaging Policy if (wsrmp__RMAssertion_) { fprintf(stream, "%s- WS-ReliableMessaging%s is used\n", tabs, wsrmp__RMAssertion_->Optional ? " (optional)" : wsrmp__RMAssertion_->Ignorable ? " (ignorable)" : ""); if (wsrmp__RMAssertion_->InactivityTimeout && wsrmp__RMAssertion_->InactivityTimeout->Milliseconds) fprintf(stream, "%s - Inactivity Timeout = %s (ms)\n", tabs, wsrmp__RMAssertion_->InactivityTimeout->Milliseconds); if (wsrmp__RMAssertion_->BaseRetransmissionInterval && wsrmp__RMAssertion_->BaseRetransmissionInterval->Milliseconds) fprintf(stream, "%s - Base Retransmission Interval = %s (ms)\n", tabs, wsrmp__RMAssertion_->BaseRetransmissionInterval->Milliseconds); if (wsrmp__RMAssertion_->AcknowledgementInterval && wsrmp__RMAssertion_->AcknowledgementInterval->Milliseconds) fprintf(stream, "%s - Acknowledgement Interval = %s (ms)\n", tabs, wsrmp__RMAssertion_->AcknowledgementInterval->Milliseconds); if (wsrmp__RMAssertion_->ExponentialBackoff) fprintf(stream, "%s - ExponentialBackoff\n", tabs); if (wsrmp__RMAssertion_->Policy) wsrmp__RMAssertion_->Policy->generate(service, types, indent + 1); service.add_import("wsrm.h"); } if (wsrmp__DeliveryAssurance) { fprintf(stream, "%s- WS-ReliableMessaging Delivery Assurance%s:\n", tabs, wsrmp__DeliveryAssurance->Optional ? " (optional)" : wsrmp__DeliveryAssurance->Ignorable ? " (ignorable)" : ""); if (wsrmp__DeliveryAssurance->Policy) wsrmp__DeliveryAssurance->Policy->generate(service, types, indent + 1); service.add_import("wsrm.h"); } if (wsrmp__AtLeastOnce) fprintf(stream, "%s- At Least Once\n", tabs); if (wsrmp__AtMostOnce) fprintf(stream, "%s- At Most Once\n", tabs); if (wsrmp__ExactlyOnce) fprintf(stream, "%s- Exactly Once\n", tabs); if (wsrmp__InOrder) fprintf(stream, "%s- In Order\n", tabs); // All else for (vector<_XML>::const_iterator x = __any.begin(); x != __any.end(); ++x) { if (*x && *(*x)) { fprintf(stream, "%s- Other policy requirements:\n\t@verbatim\n", tabs); text(*x); fprintf(stream, "\t@endverbatim\n"); } } } static void gen_parts(const sp__Parts& parts, Types& types, const char *what, const char *name, int indent) { static const char stabs[] = "\t\t\t\t\t\t\t\t\t\t"; const char *tabs; if (indent > 8) indent = 8; tabs = stabs + 9 - indent; fprintf(stream, "%s- %s requirements:\n", tabs, name); if (parts.Body) fprintf(stream, "%s -# Body:\n\t@code\n\t#include \"plugin/wsseapi.h\"\n\tsoap_wsse_%s_body(soap, , , );\n\t@endcode\n", tabs, what); if (!parts.Header.empty()) { fprintf(stream, "%s -# Header elements:\n\t@code\n\t#include \"plugin/wsseapi.h\"\n\tsoap_wsse_set_wsu_id(soap, \"", tabs); for (vector::const_iterator h = parts.Header.begin(); h != parts.Header.end(); ++h) { if ((*h).Name) fprintf(stream, "%s ", types.aname(NULL, (*h).Namespace, (*h).Name)); else if ((*h).Namespace) fprintf(stream, "%s: ", types.nsprefix(NULL, (*h).Namespace)); } fprintf(stream, "\");\n\t@endcode\n"); } if (parts.Attachments) fprintf(stream, "%s -# Attachments as defined in SwAProfile1.1\n", tabs); } //////////////////////////////////////////////////////////////////////////////// // // wsp:PolicyReference // //////////////////////////////////////////////////////////////////////////////// int wsp__PolicyReference::traverse(wsdl__definitions& definitions) { policyRef = NULL; if (!URI || !*URI) { cerr << "PolicyReference has no URI" << endl; return SOAP_OK; } if (*URI == '#') { policyRef = search(URI + 1, definitions); if (!policyRef) { cerr << "PolicyReference URI=\"" << URI << "\" not found" << endl; return SOAP_OK; } } return SOAP_OK; } void wsp__PolicyReference::policyPtr(wsp__Policy *Policy) { policyRef = Policy; } wsp__Policy *wsp__PolicyReference::policyPtr() const { return policyRef; } static wsp__Policy *search(const char *URI, wsdl__definitions& definitions) { for (vector::iterator p = definitions.wsp__Policy_.begin(); p != definitions.wsp__Policy_.end(); ++p) { wsp__Policy *policy = search(URI, &(*p)); if (policy) return policy; } return NULL; } static wsp__Policy *search(const char *URI, wsp__Policy *policy) { if (!policy) return NULL; if (policy->wsu__Id && !strcmp(URI, policy->wsu__Id)) return policy; return search(URI, (wsp__Content*)policy); } static wsp__Policy *search(const char *URI, wsp__Content *content) { wsp__Policy *policy; policy = search(URI, content->Policy); if (policy) return policy; for (vector::iterator i = content->All.begin(); i != content->All.end(); ++i) { policy = search(URI, *i); if (policy) return policy; } for (vector::iterator j = content->ExactlyOne.begin(); j != content->ExactlyOne.end(); ++j) { policy = search(URI, *j); if (policy) return policy; } return NULL; } gsoap-2.8.28/gsoap/VisualStudio2005/wsdl2h/wsdl2h/types.cpp0000644000175000017500000043332212653650160022630 0ustar ellertellert/* types.cpp Generate gSOAP types from XML schemas (e.g. embedded in WSDL). -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "types.h" static char *getline(char *s, size_t n, FILE *fd); static const char *nonblank(const char *s); static const char *fill(char *t, int n, const char *s, int e); static const char *utf8(char **t, const char *s, bool start); static const char *cstring(const char *s); static const char *xstring(const char *s); static bool is_float(const char *s); static bool is_integer(const char *s); static LONG64 to_integer(const char *s); static void documentation(const char *text); static void operations(const char *t); static int comment_nest = 0; /* keep track of block comments to avoid nesting */ //////////////////////////////////////////////////////////////////////////////// // // Keywords and reserved words // //////////////////////////////////////////////////////////////////////////////// static const char *keywords[] = { "alignas", "alignof" "and", "and_eq", "asm", "auto", "bitand", "bitor", "bool", "break", "case", "catch", "char", "char16_t", "char32_t", "class", "compl", "const", "constexpr", "const_cast", "continue", "decltype", "default", "delete", "do", "double", "dynamic_cast", "else", "enum", "errno", "explicit", "export", "extern", "false", "FILE", "final", "float", "for", "friend", "goto", "if", "INFINITY", "inline", "int", "interface", "long", "LONG64", "max", "min", "mustUnderstand", "mutable", "namespace", "new", "not", "not_eq", "NULL", "nullptr", "nullptr_t", "operator", "or", "or_eq", "override", "private", "protected", "public", "_QName", "register", "reinterpret_cast", "restrict", "return", "short", "signed", "size_t", "sizeof", "soap", "static", "static_assert", "static_cast", "struct", "switch", "template", "this", "thread_local", "throw", "time_t", "true", "try", "typedef", "typeid", "typeof", "typename", "ULONG64", "union", "unsigned", "using", "virtual", "void", "volatile", "wchar_t", "while", "XML", "_XML", "xor", "xor_eq", }; //////////////////////////////////////////////////////////////////////////////// // // Types methods // //////////////////////////////////////////////////////////////////////////////// Types::Types() { init(); } int Types::read(const char *file) { FILE *fd; char buf[4096], xsd[4096], def[4096], use[4096], ptr[4096], uri[4096]; const char *s; short copy = 0; MapOfStringToString eqvtypemap; soap_strcpy(buf, sizeof(buf), file); fd = fopen(buf, "r"); if (!fd && import_path) { (SOAP_SNPRINTF(buf, sizeof(buf), strlen(import_path) + strlen(file) + 1), "%s/%s", import_path, file); fd = fopen(buf, "r"); } if (!fd) { fprintf(stderr, "Cannot open file \"%s\"\n", file); return SOAP_EOF; } fprintf(stderr, "Reading type definitions from type map \"%s\"\n", buf); while (getline(buf, sizeof(buf), fd)) { s = buf; if (copy) { if (*s == ']') copy = 0; else fprintf(stream, "%s\n", buf); } else if (*s == '[') { copy = 1; } else if (*s == '<') { s = fill(uri, sizeof(uri), s+1, -1); infile[infiles++] = estrdup(uri); if (infiles >= MAXINFILES) { fprintf(stderr, "wsdl2h: too many files\n"); exit(1); } } else if (*s == '>') { s = fill(uri, sizeof(uri), s+1, -1); if (!outfile) { outfile = estrdup(uri); stream = fopen(outfile, "w"); if (!stream) { fprintf(stderr, "Cannot write to %s\n", outfile); exit(1); } if (cppnamespace) fprintf(stream, "namespace %s {\n", cppnamespace); fprintf(stderr, "Saving %s\n\n", outfile); } } else if (*s && *s != '#') { s = fill(xsd, sizeof(xsd), s, '='); if (s && *s == '=') { s = fill(use, sizeof(use), s+1, '|'); if (*xsd && *use) { s = estrdup(xsd); eqvtypemap[s] = estrdup(use); deftypemap[s] = ""; if (usetypemap.find(use) != usetypemap.end()) usetypemap[s] = usetypemap[use]; else usetypemap[s] = estrdup(use); } } else if (strstr(xsd, "__")) { s = fill(def, sizeof(def), s, '|'); s = fill(use, sizeof(use), s, '|'); s = fill(ptr, sizeof(ptr), s, '|'); if (*xsd) { s = estrdup(xsd); if (*def == '$') { const char *t = modtypemap[s]; if (t) { size_t l = strlen(t) + strlen(def); char *r = (char*)emalloc(l + 1); (SOAP_SNPRINTF(r, l + 1, l), "%s%s", t, def); free((void*)modtypemap[s]); modtypemap[s] = r; } else modtypemap[s] = estrdup(def); } else { if (*def) { if (strcmp(def, "...")) deftypemap[s] = estrdup(def); } else deftypemap[s] = ""; if (*use) usetypemap[s] = estrdupf(use); else usetypemap[s] = estrdupf(xsd); if (*ptr) ptrtypemap[s] = estrdupf(ptr); } } } else if (*xsd == '$') { fill(use, sizeof(use), s, 0); if (*use) { s = estrdup(xsd); usetypemap[s] = estrdup(use); } } else if (*xsd) { s = fill(uri, sizeof(uri), s, 0); if (uri[0] == '"') { uri[strlen(uri) - 1] = '\0'; nsprefix(xsd, estrdup(uri + 1)); } else if (uri[0] == '<') { uri[strlen(uri) - 1] = '\0'; char *s = estrdup(uri + 1); nsprefix(xsd, s); exturis.insert(s); } else nsprefix(xsd, estrdup(uri)); } } } for (MapOfStringToString::const_iterator i = eqvtypemap.begin(); i != eqvtypemap.end(); ++i) { const char *s = (*i).first, *t = (*i).second; if (usetypemap.find(t) != usetypemap.end()) t = usetypemap[t]; deftypemap[s] = ""; usetypemap[s] = t; if (ptrtypemap.find((*i).second) != ptrtypemap.end()) ptrtypemap[s] = ptrtypemap[(*i).second]; else { MapOfStringToString::iterator j = ptrtypemap.find(s); if (j != ptrtypemap.end()) ptrtypemap.erase(j); } for (MapOfStringToString::iterator j = usetypemap.begin(); j != usetypemap.end(); ++j) if (!strcmp((*j).second, s)) (*j).second = t; for (MapOfStringToString::iterator k = ptrtypemap.begin(); k != ptrtypemap.end(); ++k) if (!strcmp((*k).second, s)) (*k).second = t; } fclose(fd); return SOAP_OK; } void Types::init() { snum = 1; unum = 1; gnum = 1; with_union = false; fake_union = false; knames.insert(keywords, keywords + sizeof(keywords)/sizeof(char*)); if (cflag) { deftypemap["xsd__ur_type"] = ""; if (dflag) { usetypemap["xsd__ur_type"] = "xsd__anyType"; } else { usetypemap["xsd__ur_type"] = "_XML"; ptrtypemap["xsd__ur_type"] = "_XML"; } } else { deftypemap["xsd__ur_type"] = "class xsd__ur_type { _XML __item; struct soap *soap; };"; usetypemap["xsd__ur_type"] = "xsd__ur_type"; } if (cflag) { deftypemap["xsd__anyType"] = ""; if (dflag) { usetypemap["xsd__anyType"] = "xsd__anyType"; } else { usetypemap["xsd__anyType"] = "_XML"; ptrtypemap["xsd__anyType"] = "_XML"; } } else { if (dflag) deftypemap["xsd__anyType"] = ""; else deftypemap["xsd__anyType"] = "class xsd__anyType { _XML __item; struct soap *soap; };"; usetypemap["xsd__anyType"] = "xsd__anyType"; } deftypemap["xsd__any"] = ""; if (dflag) { usetypemap["xsd__any"] = "xsd__anyType"; } else { usetypemap["xsd__any"] = "_XML"; ptrtypemap["xsd__any"] = "_XML"; } deftypemap["xsd__anyAttribute"] = ""; if (dflag) { usetypemap["xsd__anyAttribute"] = "xsd__anyAttribute"; } else { usetypemap["xsd__anyAttribute"] = "_XML"; ptrtypemap["xsd__anyAttribute"] = "_XML"; } if (cflag) { deftypemap["xsd__base64Binary"] = "struct xsd__base64Binary\n{\tunsigned char *__ptr;\n\tint __size;\n\tchar *id, *type, *options; // NOTE: non-NULL for DIME/MIME/MTOM XOP attachments only\n};"; usetypemap["xsd__base64Binary"] = "struct xsd__base64Binary"; ptrtypemap["xsd__base64Binary"] = "struct xsd__base64Binary"; } else { deftypemap["xsd__base64Binary"] = "class xsd__base64Binary\n{\tunsigned char *__ptr;\n\tint __size;\n\tchar *id, *type, *options; // NOTE: non-NULL for DIME/MIME/MTOM XOP attachments only\n\tstruct soap *soap;\n};"; usetypemap["xsd__base64Binary"] = "xsd__base64Binary"; } if (cflag) { if (eflag) deftypemap["xsd__boolean"] = "enum xsd__boolean { false_, true_ };"; else deftypemap["xsd__boolean"] = "enum xsd__boolean { xsd__boolean__false_, xsd__boolean__true_ };"; usetypemap["xsd__boolean"] = "enum xsd__boolean"; } else { deftypemap["xsd__boolean"] = ""; usetypemap["xsd__boolean"] = "bool"; } deftypemap["xsd__byte"] = "typedef char xsd__byte;"; usetypemap["xsd__byte"] = "xsd__byte"; deftypemap["xsd__dateTime"] = ""; usetypemap["xsd__dateTime"] = "time_t"; deftypemap["xsd__double"] = ""; usetypemap["xsd__double"] = "double"; deftypemap["xsd__float"] = ""; usetypemap["xsd__float"] = "float"; if (cflag) { deftypemap["xsd__hexBinary"] = "struct xsd__hexBinary { unsigned char *__ptr; int __size; };"; usetypemap["xsd__hexBinary"] = "struct xsd__hexBinary"; ptrtypemap["xsd__hexBinary"] = "struct xsd__hexBinary"; } else { deftypemap["xsd__hexBinary"] = "class xsd__hexBinary { unsigned char *__ptr; int __size; };"; usetypemap["xsd__hexBinary"] = "xsd__hexBinary"; } deftypemap["xsd__int"] = ""; usetypemap["xsd__int"] = "int"; deftypemap["xsd__long"] = ""; usetypemap["xsd__long"] = "LONG64"; deftypemap["xsd__short"] = ""; usetypemap["xsd__short"] = "short"; if (cflag || sflag) { deftypemap["xsd__string"] = ""; usetypemap["xsd__string"] = "char*"; ptrtypemap["xsd__string"] = "char*"; } else { deftypemap["xsd__string"] = ""; usetypemap["xsd__string"] = "std::string"; } if (cflag || sflag) { deftypemap["xsd__QName"] = ""; usetypemap["xsd__QName"] = "_QName"; ptrtypemap["xsd__QName"] = "_QName"; } else { deftypemap["xsd__QName"] = "typedef std::string xsd__QName;"; usetypemap["xsd__QName"] = "xsd__QName"; } deftypemap["xsd__unsignedByte"] = "typedef unsigned char xsd__unsignedByte;"; usetypemap["xsd__unsignedByte"] = "xsd__unsignedByte"; deftypemap["xsd__unsignedInt"] = ""; usetypemap["xsd__unsignedInt"] = "unsigned int"; deftypemap["xsd__unsignedLong"] = ""; usetypemap["xsd__unsignedLong"] = "ULONG64"; deftypemap["xsd__unsignedShort"] = ""; usetypemap["xsd__unsignedShort"] = "unsigned short"; if (cflag) { deftypemap["SOAP_ENC__base64Binary"] = "struct SOAP_ENC__base64Binary { unsigned char *__ptr; int __size; };"; usetypemap["SOAP_ENC__base64Binary"] = "struct SOAP_ENC__base64Binary"; ptrtypemap["SOAP_ENC__base64Binary"] = "struct SOAP_ENC__base64Binary"; deftypemap["SOAP_ENC__base64"] = "struct SOAP_ENC__base64 { unsigned char *__ptr; int __size; };"; usetypemap["SOAP_ENC__base64"] = "struct SOAP_ENC__base64"; ptrtypemap["SOAP_ENC__base64"] = "struct SOAP_ENC__base64"; } else { deftypemap["SOAP_ENC__base64Binary"] = "class SOAP_ENC__base64Binary { unsigned char *__ptr; int __size; };"; usetypemap["SOAP_ENC__base64Binary"] = "SOAP_ENC__base64Binary"; deftypemap["SOAP_ENC__base64"] = "class SOAP_ENC__base64 { unsigned char *__ptr; int __size; };"; usetypemap["SOAP_ENC__base64"] = "SOAP_ENC__base64"; } if (cflag) { deftypemap["SOAP_ENC__boolean"] = "enum SOAP_ENC__boolean { false_, true_ };"; usetypemap["SOAP_ENC__boolean"] = "enum SOAP_ENC__boolean"; } else { deftypemap["SOAP_ENC__boolean"] = "typedef bool SOAP_ENC__boolean;"; usetypemap["SOAP_ENC__boolean"] = "SOAP_ENC__boolean"; } deftypemap["SOAP_ENC__byte"] = "typedef char SOAP_ENC__byte;"; usetypemap["SOAP_ENC__byte"] = "SOAP_ENC__byte"; deftypemap["SOAP_ENC__dateTime"] = "typedef time_t SOAP_ENC__dateTime;"; usetypemap["SOAP_ENC__dateTime"] = "SOAP_ENC__dateTime"; deftypemap["SOAP_ENC__double"] = "typedef double SOAP_ENC__double;"; usetypemap["SOAP_ENC__double"] = "SOAP_ENC__double"; deftypemap["SOAP_ENC__float"] = "typedef float SOAP_ENC__float;"; usetypemap["SOAP_ENC__float"] = "SOAP_ENC__float"; if (cflag) { deftypemap["SOAP_ENC__hexBinary"] = "struct SOAP_ENC__hexBinary { unsigned char *__ptr; int __size; };"; usetypemap["SOAP_ENC__hexBinary"] = "struct SOAP_ENC__hexBinary"; ptrtypemap["SOAP_ENC__hexBinary"] = "struct SOAP_ENC__hexBinary"; } else { deftypemap["SOAP_ENC__hexBinary"] = "class SOAP_ENC__hexBinary { unsigned char *__ptr; int __size; };"; usetypemap["SOAP_ENC__hexBinary"] = "SOAP_ENC__hexBinary"; } deftypemap["SOAP_ENC__int"] = "typedef int SOAP_ENC__int;"; usetypemap["SOAP_ENC__int"] = "SOAP_ENC__int"; deftypemap["SOAP_ENC__long"] = "typedef LONG64 SOAP_ENC__long;"; usetypemap["SOAP_ENC__long"] = "SOAP_ENC__long"; deftypemap["SOAP_ENC__short"] = "typedef short SOAP_ENC__short;"; usetypemap["SOAP_ENC__short"] = "SOAP_ENC__short"; if (cflag || sflag) { deftypemap["SOAP_ENC__string"] = ""; usetypemap["SOAP_ENC__string"] = "char*"; ptrtypemap["SOAP_ENC__string"] = "char*"; } else { deftypemap["SOAP_ENC__string"] = ""; usetypemap["SOAP_ENC__string"] = "std::string"; } deftypemap["SOAP_ENC__unsignedByte"] = "typedef unsigned char SOAP_ENC__unsignedByte;"; usetypemap["SOAP_ENC__unsignedByte"] = "SOAP_ENC__unsignedByte"; deftypemap["SOAP_ENC__unsignedInt"] = "typedef unsigned int SOAP_ENC__unsignedInt;"; usetypemap["SOAP_ENC__unsignedInt"] = "SOAP_ENC__unsignedInt"; deftypemap["SOAP_ENC__unsignedLong"] = "typedef ULONG64 SOAP_ENC__unsignedLong;"; usetypemap["SOAP_ENC__unsignedLong"] = "SOAP_ENC__unsignedLong"; deftypemap["SOAP_ENC__unsignedShort"] = "typedef unsigned short SOAP_ENC__unsignedShort;"; usetypemap["SOAP_ENC__unsignedShort"] = "SOAP_ENC__unsignedShort"; deftypemap["SOAP_ENC__Array"] = ""; usetypemap["SOAP_ENC__Array"] = "struct { _XML *__ptr; int __size; }"; if (cflag) ptrtypemap["SOAP_ENC__Array"] = "struct { _XML *__ptr; int __size; }"; deftypemap["_SOAP_ENC__arrayType"] = ""; deftypemap["SOAP_ENV__Header"] = ""; usetypemap["SOAP_ENV__Header"] = "struct SOAP_ENV__Header"; deftypemap["_SOAP_ENV__mustUnderstand"] = ""; if (cflag || sflag) usetypemap["_SOAP_ENV__mustUnderstand"] = "char*"; else usetypemap["_SOAP_ENV__mustUnderstand"] = "std::string"; deftypemap["SOAP_ENV__Fault"] = ""; usetypemap["SOAP_ENV__Fault"] = "struct SOAP_ENV__Fault"; deftypemap["SOAP_ENV__detail"] = ""; usetypemap["SOAP_ENV__detail"] = "struct SOAP_ENV__Detail"; deftypemap["SOAP_ENV__Detail"] = ""; usetypemap["SOAP_ENV__Detail"] = "struct SOAP_ENV__Detail"; deftypemap["SOAP_ENV__Code"] = ""; usetypemap["SOAP_ENV__Code"] = "struct SOAP_ENV__Code"; deftypemap["SOAP_ENV__Reason"] = ""; usetypemap["SOAP_ENV__Reason"] = "struct SOAP_ENV__Reason"; usetypemap["$CONTAINER"] = "std::vector"; if (read(mapfile)) fprintf(stderr, "Problem reading type map file '%s'.\nUsing internal type definitions for %s instead.\n\n", mapfile, cflag ? "C" : "C++"); } const char *Types::nsprefix(const char *prefix, const char *URI) { if (URI && *URI) { const char *s = uris[URI]; if (!s) { size_t n; if (!prefix || !*prefix || *prefix == '_') s = schema_prefix; else s = estrdup(prefix); if (!syms[s]) n = syms[s] = 1; else n = ++syms[s]; if (n != 1 || !prefix || !*prefix || *prefix == '_') { size_t l = strlen(s); char *t = (char*)emalloc(l + 21); (SOAP_SNPRINTF(t, l + 21, l + 20), "%s%lu", s, (unsigned long)n); s = t; } uris[URI] = s; if (vflag) fprintf(stderr, "namespace prefix %s = \"%s\"\n", s, URI); } // if *prefix == '_', then add prefix string to s if (prefix && *prefix == '_') { size_t l = strlen(s); char *t = (char*)emalloc(l + 2); *t = '_'; soap_strcpy(t + 1, l + 1, s); s = t; } return s; } return NULL; } const char *Types::prefix(const char *name) { const char *s; char *t; if (*name == '"') { s = strchr(name + 1, '"'); t = (char*)emalloc(s - name); soap_strncpy(t, s - name, name + 1, s - name - 1); return nsprefix(NULL, t); } s = strchr(name, ':'); if (s) { t = (char*)emalloc(s - name + 1); soap_strncpy(t, s - name + 1, name, s - name); return t; } return NULL; } const char *Types::uri(const char *name) { const char *s; char *t; if (*name == '"') { s = strchr(name + 1, '"'); t = (char*)emalloc(s - name); soap_strncpy(t, s - name, name + 1, s - name - 1); return t; } s = strchr(name, ':'); if (s) { struct Namespace *p = namespaces; if (p) { for (p += 6; p->id; p++) { if (!strncmp(p->id, name, s - name) && !p->id[s - name]) { if (p->in && *p->in) return p->in; return p->ns; } } } } return NULL; } // Find a C name for a QName. If the name has no qualifier, use URI. Suggest prefix for URI const char *Types::fname(const char *prefix, const char *URI, const char *qname, SetOfString *reserved, enum Lookup lookup, bool isqname) { char buf[4096], *t; const char *p, *s, *name; if (!qname) { fprintf(stream, "// Warning: internal error, no QName in fname()\n"); if (vflag) fprintf(stderr, "Internal error, no QName in fname()\n"); qname = "?"; } name = qname; if (isqname) s = strrchr(name, ':'); else s = NULL; if (s) { name = s + 1; if (qname[0] == '"' && qname[1] == '"') { s = NULL; } else if (*qname == '"') { t = (char*)emalloc(s - qname - 1); soap_strncpy(t, s - qname - 1, qname + 1, s - qname - 2); URI = t; } else if (!strncmp(qname, "xs:", 3)) // this hack is necessary since the nsmap table defines "xs" for "xsd" { s = "xsd"; URI = NULL; } else { t = (char*)emalloc(s - qname + 1); soap_strncpy(t, s - qname + 1, qname, s - qname); s = t; URI = NULL; } } if (URI && *URI) p = nsprefix(prefix, URI); else if (s) p = s; else p = ""; s = NULL; if (lookup == LOOKUP) { if (qnames.find(Pair(p,name)) != qnames.end()) s = qnames[Pair(p,name)]; } if (!s) { t = buf; if (!prefix || *prefix) { s = p; // no longer add '_' when URI != NULL, since nsprefix() will do this if (prefix && *prefix == ':') *t++ = ':'; else if (prefix && *prefix == '_') { if (!URI) *t++ = '_'; if (prefix[1] == '_') // ensures ns prefix starts with __ { soap_strcpy(t, sizeof(buf) - (t - buf), prefix + 1); t += strlen(prefix + 1); } } if (s && *s) { for (; *s; s++) { if (t >= buf + sizeof(buf) - 8) break; if (isalnum(*s)) { *t++ = *s; } else if (*s == '-' && s[1] != '-' && s != p) { *t++ = '_'; } else if (*s == '_') { if (s == p) *t++ = '_'; else if (!_flag) { soap_strcpy(t, sizeof(buf) - (t - buf), "_USCORE"); t += 7; } else { s = utf8(&t, s, t == buf); } } else { s = utf8(&t, s, t == buf); } } if (!prefix || *prefix != '*') { *t++ = '_'; *t++ = '_'; } } else if (isdigit(*name)) { *t++ = '_'; } } for (s = name; *s; s++) { if (t >= buf + sizeof(buf) - 8) break; if (isalnum(*s)) { *t++ = *s; } else if (*s == '-' && s[1] != '-' && s[1] != '\0' && s != name) { *t++ = '_'; } else if (!_flag && *s == '_') { soap_strcpy(t, sizeof(buf) - (t - buf), "_USCORE"); t += 7; } else { s = utf8(&t, s, t == buf); } } *t = '\0'; s = strchr(buf, ':'); if (s) s++; else s = buf; while (knames.find(s) != knames.end() || (reserved && reserved->find(s) != reserved->end())) { *t++ = '_'; *t = '\0'; } if (isalpha(*buf) || *buf == '_' || *buf == ':') { size_t l = strlen(buf); t = (char*)emalloc(l + 1); soap_strcpy(t, l + 1, buf); } else { size_t l = strlen(buf); t = (char*)emalloc(l + 2); *t = '_'; soap_strcpy(t + 1, l + 1, buf); } s = t; if (lookup == LOOKUP) { qnames[Pair(p,name)] = s; if (vflag) { cerr << "Mapping '" << p << ":" << name << "' to '" << s << "'" << endl; #ifdef DEBUG for (MapOfPairToString::const_iterator i = qnames.begin(); i != qnames.end(); ++i) cerr << "Map[" << (*i).first.first << ":" << (*i).first.second << "]='" << (*i).second << "'" << endl; #endif } } } return s; } bool Types::is_defined(const char *prefix, const char *URI, const char *qname) { const char *t = fname(prefix, URI, qname, NULL, LOOKUP, true); return usetypemap.find(t) != usetypemap.end(); } const char *Types::aname(const char *prefix, const char *URI, const char *qname) { return fname(prefix, URI, qname, NULL, NOLOOKUP, true); } const char *Types::wname(const char *prefix, const char *URI, const char *qname) { const char *s = aname(prefix, URI, qname); SetOfString reserved; reserved.insert(s); s = fname(prefix, URI, qname, &reserved, NOLOOKUP, true); knames.insert(s); return s; } const char *Types::cname(const char *prefix, const char *URI, const char *qname) { return fname(prefix, URI, qname, NULL, LOOKUP, true); } const char *Types::tname(const char *prefix, const char *URI, const char *qname) { const char *s, *t; t = cname(prefix, URI, qname); if (usetypemap.find(t) != usetypemap.end()) { s = usetypemap[t]; if (vflag) cerr << "Mapping use of '" << t << "' to '" << s << "'" << endl; } else { s = t; fprintf(stream, "\n/// @todo !FIXME! @warning Undefined QName %s for type %s in namespace \"%s\", check WSDL and schema definitions.\n", qname ? qname : "", t, URI ? URI : "?"); if (vflag) fprintf(stderr, "\nWarning: undefined QName %s for type %s in namespace \"%s\"\n", qname ? qname : "", t, URI ? URI : "?"); } return s; } const char *Types::tnameptr(bool flag, const char *prefix, const char *URI, const char *qname) { const char *s = pname(flag, !flag, prefix, URI, qname); if (flag) { if (!strchr(s, '*') || !strncmp(s, "char", 4) || !strncmp(s, "const char", 10) || !strncmp(s, "wchar_t", 7) || !strncmp(s, "const wchar_t", 13)) { size_t l = strlen(s); char *r = (char*)emalloc(l + 2); soap_strcpy(r, l + 2, s); soap_strcpy(r + l, 2, "*"); return r; } } return s; } const char *Types::tnamenoptr(const char *prefix, const char *URI, const char *qname) { const char *s = tname(prefix, URI, qname); if (strchr(s, '*') && (!strncmp(s, "char", 4) || !strncmp(s, "const char", 10) || !strncmp(s, "wchar_t", 7) || !strncmp(s, "const wchar_t", 13))) return s; size_t n = strlen(s); if (s[n - 1] == '*') { char *r = (char*)emalloc(n); soap_strncpy(r, n, s, n - 1); return r; } return s; } const char *Types::pname(bool flag, bool smart, const char *prefix, const char *URI, const char *qname) { const char *s = NULL, *t; t = cname(prefix, URI, qname); if (flag) { const char *r = NULL; if (!cflag && smart && (r = vname("$POINTER")) && *r != '*' && *r != '$') { if (smptypemap.find(t) != smptypemap.end()) s = smptypemap[t]; else { if (usetypemap.find(t) != usetypemap.end()) s = usetypemap[t]; if (!s) { s = t; fprintf(stream, "\n/// @todo !FIXME! @warning Undefined QName %s for pointer to type %s, check WSDL and schema definitions.\n", qname, t); if (vflag) fprintf(stderr, "\nWarning: undefined QName %s for pointer to type %s in namespace \"%s\"\n", qname, t, URI ? URI : "?"); } if (!is_ptr(prefix, URI, qname)) { size_t k = strlen(r); size_t l = strlen(s); char *p = (char*)emalloc(k + l + 4); soap_strcpy(p, k + l + 4, r); soap_strcpy(p + k, l + 4, "<"); soap_strcpy(p + k + 1, l + 3, s); soap_strcpy(p + k + l + 1, 3, "> "); s = p; } if (vflag) cerr << "Mapping \"smart\" pointer of '" << t << "' to '" << s << "'" << endl; smptypemap[t] = s; } } else if (ptrtypemap.find(t) != ptrtypemap.end()) { s = ptrtypemap[t]; } else { if (usetypemap.find(t) != usetypemap.end()) s = usetypemap[t]; if (!s) { s = t; fprintf(stream, "\n/// @todo !FIXME! @warning Undefined QName %s for pointer to type %s, check WSDL and schema definitions.\n", qname, t); if (vflag) fprintf(stderr, "\nWarning: undefined QName %s for pointer to type %s in namespace \"%s\"\n", qname, t, URI ? URI : "?"); } if (!is_ptr(prefix, URI, qname)) { size_t l = strlen(s); char *p = (char*)emalloc(l + 2); soap_strcpy(p, l + 2, s); soap_strcpy(p + l, 2, "*"); s = p; } if (vflag) cerr << "Mapping pointer of '" << t << "' to '" << s << "'" << endl; ptrtypemap[t] = s; } } else if (usetypemap.find(t) != usetypemap.end()) { if (!cflag && smart && smptypemap.find(t) != smptypemap.end() && ptrtypemap.find(t) != ptrtypemap.end() && usetypemap[t] == ptrtypemap[t]) s = smptypemap[t]; else s = usetypemap[t]; } else { s = t; fprintf(stream, "\n/// @todo !FIXME! @warning Undefined QName %s for type %s in namespace \"%s\", check WSDL and schema definitions.\n", qname, t, URI ? URI : "?"); if (vflag) fprintf(stderr, "\nWarning: undefined QName %s for type %s in namespace \"%s\"\n", qname, t, URI ? URI : "?"); } return s; } const char *Types::deftname(enum Type type, bool mk_pointer, bool is_pointer, const char *prefix, const char *URI, const char *qname) { char buf[4096]; const char *t = fname(prefix, URI, qname, NULL, LOOKUP, true); if (deftypemap[t]) { if (vflag) fprintf(stderr, "Name %s already defined (probably in typemap \"%s\")\n", qname, mapfile); return NULL; } if (usetypemap[t]) { if (vflag) fprintf(stderr, "Name %s is mapped\n", qname); return t; } const char *q = NULL; switch (type) { case ENUM: if (!c11flag) q = "enum"; if (c11flag || yflag) knames.insert(t); break; case STRUCT: q = "struct"; if (yflag) knames.insert(t); break; case CLASS: case TYPEDEF: knames.insert(t); default: break; } buf[0] = '\0'; size_t n = 0; if (q) { soap_strcpy(buf, sizeof(buf), q); n = strlen(buf); soap_strcpy(buf + n, sizeof(buf) - n, " "); ++n; } soap_strcpy(buf + n, sizeof(buf) - n, t); const char *r = vname("$POINTER"); if (!cflag && !is_pointer && r && *r != '*' && *r != '$') { n = strlen(buf); size_t l = strlen(r); char *s = (char*)emalloc(l + n + 4); soap_strcpy(s, l + n + 4, r); soap_strcpy(s + l, n + 4, "<"); soap_strcpy(s + l + 1, n + 3, buf); soap_strcpy(s + l + n + 1, 3, "> "); smptypemap[t] = s; } if (mk_pointer) { n = strlen(buf); soap_strcpy(buf + n, sizeof(buf) - n, "*"); } n = strlen(buf); char *s = (char*)emalloc(n + 1); soap_strcpy(s, n + 1, buf); usetypemap[t] = s; if (mk_pointer || is_pointer) ptrtypemap[t] = s; if (is_pointer) smptypemap[t] = s; if (vflag) cerr << "Defined '" << t << "' ('" << qname << "' in namespace '" << (URI ? URI : prefix ? prefix : "") << "') as '" << s << endl; return t; } // get enumeration value. URI/type refers to the enum simpleType. const char *Types::ename(const char *type, const char *value, bool isqname) { if (c11flag) return fname(NULL, NULL, value, NULL, NOLOOKUP, isqname); const char *s = enames[Pair(type,value)]; if (!s) { s = fname(NULL, NULL, value, &rnames, NOLOOKUP, isqname); if (!eflag && type && *type) { // Add prefix to enum if (!*s || (s[0] == '_' && s[1] == '\0')) s = "_x0000"; size_t l = strlen(type) + strlen(s); char *buf = (char*)emalloc(l + 3); // _xXXXX is OK here if (s[0] == '_' && s[1] != 'x' && strncmp(s, "_USCORE", 7)) (SOAP_SNPRINTF(buf, l + 3, l + 1), "%s_%s", type, s); else (SOAP_SNPRINTF(buf, l + 3, l + 2), "%s__%s", type, s); s = buf; } else rnames.insert(s); enames[Pair(type,value)] = s; } return s; } // get operation name const char *Types::oname(const char *prefix, const char *URI, const char *qname) { const char *s = fname(prefix, URI, qname, NULL, LOOKUP, true); if (s && usetypemap.find(s) != usetypemap.end()) { // Avoid name clash with structs/classes of the same name onames.insert(s); } s = fname(prefix, URI, qname, &onames, NOLOOKUP, true); onames.insert(s); return s; } // generate struct name const char *Types::sname(const char *URI, const char *name) { const char *s; char *t; if (!aflag && name) { size_t l = strlen(name) + 1; for (VectorOfString::const_iterator i = scope.begin(); i != scope.end(); ++i) l += strlen(*i) + 1; t = (char*)emalloc(l); size_t n = 0; for (VectorOfString::const_iterator j = scope.begin(); j != scope.end(); ++j) { soap_strcpy(t + n, l - n, *j); n = strlen(t); soap_strcpy(t + n, l - n, "-"); ++n; if (n >= l) break; } soap_strcpy(t + n, l - n, name); s = fname("_", URI, t, &rnames, NOLOOKUP, true); rnames.insert(s); } else if (URI && *URI) { s = nsprefix(NULL, URI); size_t l = strlen(s); t = (char*)emalloc(l + 30); (SOAP_SNPRINTF(t, l + 30, l + 29), "_%s__struct_%d", s, snum++); s = t; } else { t = (char*)emalloc(28); (SOAP_SNPRINTF(t, 28, 27), "struct_%d", snum++); s = t; } return s; } // generate union name const char *Types::uname(const char *URI) { const char *s; char *t; if (!aflag) { size_t l = 0; for (VectorOfString::const_iterator i = scope.begin(); i != scope.end(); ++i) l += strlen(*i) + 1; t = (char*)emalloc(l + 6); soap_strcpy(t, l + 6, "union"); size_t n = 5; for (VectorOfString::const_iterator j = scope.begin(); j != scope.end(); ++j) { soap_strcpy(t + n, l + 6 - n, "-"); soap_strcpy(t + n + 1, l + 5 - n, *j); n = strlen(t); } s = fname("_", URI, t, &rnames, NOLOOKUP, true); rnames.insert(s); } else if (URI && *URI) { s = nsprefix(NULL, URI); size_t l = strlen(s); t = (char*)emalloc(l + 30); (SOAP_SNPRINTF(t, l + 30, l + 29), "_%s__union_%d", s, unum++); s = t; } else { t = (char*)emalloc(28); (SOAP_SNPRINTF(t, 28, 27), "_union_%d", unum++); s = t; } return s; } // generate enum name const char *Types::gname(const char *URI, const char *name) { const char *s; char *t; if (!aflag && name) { size_t l = strlen(name) + 1; for (VectorOfString::const_iterator i = scope.begin(); i != scope.end(); ++i) l += strlen(*i) + 1; t = (char*)emalloc(l); size_t n = 0; for (VectorOfString::const_iterator j = scope.begin(); j != scope.end(); ++j) { soap_strcpy(t + n, l - n, *j); n = strlen(t); soap_strcpy(t + n, l - n, "-"); ++n; if (n >= l) break; } soap_strcpy(t + n, l - n, name); s = fname("_", URI, t, &rnames, LOOKUP, true); rnames.insert(s); } else if (URI && *URI) { s = nsprefix(NULL, URI); size_t l = strlen(s); t = (char*)emalloc(l + 30); (SOAP_SNPRINTF(t, l + 30, l + 29), "_%s__enum_%d", s, gnum++); s = t; } else { t = (char*)emalloc(28); (SOAP_SNPRINTF(t, 28, 27), "enum_%d", gnum++); s = t; } return s; } const char *Types::vname(const char *var) { MapOfStringToString::const_iterator i = usetypemap.find(var); if (i != usetypemap.end()) return (*i).second; return var; } // checks if nillable or minOccurs=0 bool Types::is_nillable(const xs__element& element) { return (element.nillable || (element.minOccurs && !strcmp(element.minOccurs, "0"))); } // checks if permitted as union member bool Types::is_choicetype(const char *prefix, const char *URI, const char *type) { // TODO: consider c11flag also safe, but classes containing unions must define assignment ops using the selector(s) if (cflag) return true; if (!strcmp(type, "xs:byte")) return true; const char *t = tname(prefix, URI, type); return ( !strncmp(t, "enum ", 5) || !strcmp(t, "bool") || !strcmp(t, "int8_t") || !strcmp(t, "int16_t") || !strcmp(t, "int32_t") || !strcmp(t, "int64_t") || !strcmp(t, "uint8_t") || !strcmp(t, "uint16_t") || !strcmp(t, "uint32_t") || !strcmp(t, "uint64_t") || !strcmp(t, "char") || !strcmp(t, "unsigned char") || !strcmp(t, "short") || !strcmp(t, "unsigned short") || !strcmp(t, "int") || !strcmp(t, "unsigned int") || !strcmp(t, "long") || !strcmp(t, "long long") || !strcmp(t, "unsigned long") || !strcmp(t, "unsigned long long") || !strcmp(t, "LONG64") || !strcmp(t, "ULONG64") || !strcmp(t, "float") || !strcmp(t, "double") || !strcmp(t, "long double") || !strcmp(t, "time_t") || !strcmp(t, "_QName") || !strcmp(t, "_XML") ); } bool Types::is_ptr(const char *prefix, const char *URI, const char *qname) { const char *t = cname(prefix, URI, qname); if (usetypemap.find(t) != usetypemap.end()) { if (ptrtypemap.find(t) != ptrtypemap.end()) return usetypemap[t] == ptrtypemap[t]; const char *s = usetypemap[t]; while (s && *s) { s = strchr(s + 1, '*'); if (s && *(s-1) != '/' && *(s+1) != '/') return true; } } return false; } void Types::dump(FILE *fd) { fprintf(fd, "\nTypes:\n"); for (MapOfStringToString::const_iterator i = usetypemap.begin(); i != usetypemap.end(); ++i) fprintf(fd, "%s=%s\n", (*i).first, (*i).second ? (*i).second : "(null)"); fprintf(fd, "\nPointers:\n"); for (MapOfStringToString::const_iterator j = ptrtypemap.begin(); j != ptrtypemap.end(); ++j) fprintf(fd, "%s=%s\n", (*j).first, (*j).second ? (*j).second : "(null)"); } void Types::define(const char *URI, const char *name, const xs__complexType& complexType) { // generate prototype for structs/classes and store name const char *prefix = NULL; if (complexType.name) name = complexType.name; else prefix = "_"; if (complexType.complexContent && complexType.complexContent->restriction && !strcmp(complexType.complexContent->restriction->base, "SOAP-ENC:Array")) { if (strcmp(schema_prefix, "ns")) prefix = "*"; else prefix = ""; } if (cflag) { const char *t = deftname(STRUCT, true, false, prefix, URI, name); if (t) { if (yflag) fprintf(stream, "/// @brief Typedef synonym for struct %s.\ntypedef struct %s %s;\n", t, t, t); } else if (name) { t = deftypemap[cname(prefix, URI, name)]; if (t) { fprintf(stream, "/// Imported complexType \"%s\":%s from typemap \"%s\".\n", URI, name, mapfile ? mapfile : ""); document(complexType.annotation); if (*t) format(t); else fprintf(stream, "// complexType definition intentionally left blank.\n"); fprintf(stream, "\n"); } } } else { const char *t = deftname(CLASS, true, false, prefix, URI, name); if (t) fprintf(stream, "// Forward declaration of class %s.\nclass %s;\n\n", t, t); else if (name) { t = deftypemap[cname(prefix, URI, name)]; if (t) { fprintf(stream, "/// Imported complexType \"%s\":%s from typemap \"%s\".\n", URI, name, mapfile ? mapfile : ""); document(complexType.annotation); if (*t) format(t); else fprintf(stream, "// complexType definition intentionally left blank.\n"); fprintf(stream, "\n"); } } } } void Types::gen(const char *URI, const char *name, const xs__simpleType& simpleType, bool anonymous, bool nested_restriction) { const char *t = NULL; const char *prefix = NULL; if (simpleType.name) name = simpleType.name; else if (!nested_restriction) prefix = "_"; if (!anonymous) { t = deftypemap[cname(NULL, URI, name)]; if (t) { fprintf(stream, "/// Imported simpleType \"%s\":%s from typemap \"%s\".\n", URI, name, mapfile ? mapfile : ""); document(simpleType.annotation); if (*t) format(t); else fprintf(stream, "// simpleType definition intentionally left blank.\n"); return; } } if (simpleType.restriction) { const char *base = simpleType.restriction->base; if (!base && simpleType.restriction->simpleType) { if (!anonymous) { if (simpleType.restriction->simpleType->list && simpleType.restriction->length && simpleType.restriction->length->value) { fprintf(stream, "/// @brief \"%s\":%s is a simpleType restriction list of length %s.\n///\n", URI ? URI : "", name, simpleType.restriction->length->value); document(simpleType.restriction->length->annotation); } else { const char *a = NULL, *b = "unbounded"; if (simpleType.restriction->minLength) { a = simpleType.restriction->minLength->value; document(simpleType.restriction->minLength->annotation); } if (simpleType.restriction->maxLength) { b = simpleType.restriction->maxLength->value; document(simpleType.restriction->maxLength->annotation); } if (a || b) fprintf(stream, "/// @brief \"%s\":%s is a simpleType restriction list of length %s..%s.\n", URI ? URI : "", name, a ? a : "0", b ? b : ""); else fprintf(stream, "/// @brief \"%s\":%s is a simpleType restriction.\n///\n", URI ? URI : "", name); } } gen(URI, name, *simpleType.restriction->simpleType, anonymous, true); } else { if (!base) base = "xsd:string"; const char *baseURI = NULL; if (simpleType.restriction->simpleTypePtr() && simpleType.restriction->simpleTypePtr()->schemaPtr()) baseURI = simpleType.restriction->simpleTypePtr()->schemaPtr()->targetNamespace; if (!anonymous) fprintf(stream, "/// @brief \"%s\":%s is a simpleType restriction of XSD type %s.\n///\n", URI ? URI : "", name, base); document(simpleType.annotation); document(simpleType.restriction->annotation); if (simpleType.restriction->assertion && simpleType.restriction->assertion->test) { fprintf(stream, "/// Assertion:\n"); documentation(simpleType.restriction->assertion->test); } if (!simpleType.restriction->enumeration.empty()) { bool is_qname = !strcmp(base, "xs:QName"); if (!anonymous) { t = deftname(ENUM, false, false, prefix, URI, name); if (t && !eflag && !c11flag) fprintf(stream, "/// @note The enum values are prefixed with \"%s__\" to prevent name clashes: use wsdl2h option -e to omit this prefix or use option -c++11 for scoped enumerations\n", t); } if (!t) t = gname(URI, name); if (c11flag) { if (!anonymous) fprintf(stream, "enum class %s\n{\n", t); else fprintf(stream, " enum class %s\n {\n", t); } else { if (!anonymous) fprintf(stream, "enum %s\n{\n", t); else fprintf(stream, " enum %s\n {\n", t); } SetOfString enumvals; LONG64 enumval = 0; if (!is_qname) { bool letters_ok = true; for (vector::const_iterator enumeration = simpleType.restriction->enumeration.begin(); enumeration != simpleType.restriction->enumeration.end(); ++enumeration) { const char *s; if ((s = (*enumeration).value)) { if (!enumvals.count(s)) { if (is_integer(s)) { document((*enumeration).annotation); fprintf(stream, "\t%s = %s,\t///< %s value=\"%s\"\n", ename(eflag ? "enum int" : t, s, false), s, base, s); // type="enum int" if eflag so all int enum consts get the same value assigned enumvals.insert(s); LONG64 n = soap_strtoll(s, NULL, 10); if (letters_ok) { if ((n >= 'A' && n <= 'Z') || (n >= 'a' && n <= 'z')) letters_ok = false; } if (n > enumval) enumval = n; } } } } if (letters_ok) { for (vector::const_iterator enumeration = simpleType.restriction->enumeration.begin(); enumeration != simpleType.restriction->enumeration.end(); ++enumeration) { const char *s; if ((s = (*enumeration).value)) { if (!enumvals.count(s)) { if (isalpha(s[0]) && !s[1]) { document((*enumeration).annotation); fprintf(stream, "\t%s = '%c',\t///< %s value=\"%s\"\n", ename(eflag ? "enum char" : t, s, false), *s, base, s); // type="enum char" if eflag so all char enum consts get the same value assigned enumvals.insert(s); if (*s > enumval) enumval = *s; } } } } } } for (vector::const_iterator enumeration = simpleType.restriction->enumeration.begin(); enumeration != simpleType.restriction->enumeration.end(); ++enumeration) { const char *s; if ((s = (*enumeration).value)) { if (!enumvals.count(s)) { document((*enumeration).annotation); if (is_qname) fprintf(stream, "\t%s,\t///< %s value=\"%s\"\n", ename(t, (*enumeration).value_, true), base, (*enumeration).value_); else if (enumval) fprintf(stream, "\t%s = " SOAP_LONG_FORMAT ",\t///< %s value=\"%s\"\n", ename(t, s, false), ++enumval, base, s); else fprintf(stream, "\t%s,\t///< %s value=\"%s\"\n", ename(t, s, false), base, s); enumvals.insert(s); } } else fprintf(stream, "//\tunrecognized: enumeration \"%s\" has no value\n", name ? name : ""); } if (!anonymous) { fprintf(stream, "};\n\n"); if (!c11flag && yflag) fprintf(stream, "/// @brief Typedef synonym for enum %s.\ntypedef enum %s %s;\n", t, t, t); if (pflag && simpleType.name) { const char *s = wname(prefix, URI, name); fprintf(stream, "/// @brief A class wrapper.\n///\n"); fprintf(stream, "class %s : public xsd__anyType\n{ public:\n", s); fprintf(stream, elementformat, tname(prefix, URI, name), "__item;"); modify(s); fprintf(stream, "\n};\n\n"); } } else fprintf(stream, " }\n"); } else { if (simpleType.restriction->length && simpleType.restriction->length->value) { fprintf(stream, "/// Length of this string is %s.\n", simpleType.restriction->length->value); document(simpleType.restriction->length->annotation); } else { const char *a = NULL, *b = NULL; if (simpleType.restriction->minLength) { a = simpleType.restriction->minLength->value; document(simpleType.restriction->minLength->annotation); } if (simpleType.restriction->maxLength) { b = simpleType.restriction->maxLength->value; document(simpleType.restriction->maxLength->annotation); } if (a || b) { fprintf(stream, "/// Length of this string is %s to %s.\n", a ? a : "0", b ? b : "unbounded"); } } char format[16]; format[0] = '\0'; if (simpleType.restriction->precision && simpleType.restriction->precision->value) { soap_strcpy(format, sizeof(format), simpleType.restriction->precision->value); fprintf(stream, "/// %s is %s.\n", simpleType.restriction->precision->fixed ? "Fixed precision" : "Precision", simpleType.restriction->precision->value); } else if (simpleType.restriction->totalDigits && simpleType.restriction->totalDigits->value) { soap_strcpy(format, sizeof(format), simpleType.restriction->totalDigits->value); fprintf(stream, "/// %s of total digits is %s.\n", simpleType.restriction->totalDigits->fixed ? "Fixed number" : "Number", simpleType.restriction->totalDigits->value); } if (simpleType.restriction->scale && simpleType.restriction->scale->value) { size_t n = strlen(format); soap_strcpy(format + n, sizeof(format) - n, "."); soap_strcpy(format + n + 1, sizeof(format) - n - 1, simpleType.restriction->scale->value); fprintf(stream, "/// %s is %s.\n", simpleType.restriction->scale->fixed ? "Fixed scale" : "Scale", simpleType.restriction->scale->value); } else if (simpleType.restriction->fractionDigits && simpleType.restriction->fractionDigits->value) { size_t n = strlen(format); soap_strcpy(format + n, sizeof(format) - n, "."); soap_strcpy(format + n + 1, sizeof(format) - n - 1, simpleType.restriction->fractionDigits->value); fprintf(stream, "/// %s of fraction digits is %s.\n", simpleType.restriction->fractionDigits->fixed ? "Fixed number" : "Number", simpleType.restriction->fractionDigits->value); } for (vector::const_iterator pattern1 = simpleType.restriction->pattern.begin(); pattern1 != simpleType.restriction->pattern.end(); ++pattern1) fprintf(stream, "/// Content pattern is \"%s\".\n", xstring((*pattern1).value)); const char *ai = NULL, *ae = NULL, *bi = NULL, *be = NULL; if (simpleType.restriction->minInclusive) { ai = simpleType.restriction->minInclusive->value; document(simpleType.restriction->minInclusive->annotation); } else if (simpleType.restriction->minExclusive) { ae = simpleType.restriction->minExclusive->value; document(simpleType.restriction->minExclusive->annotation); } if (simpleType.restriction->maxInclusive) { bi = simpleType.restriction->maxInclusive->value; document(simpleType.restriction->maxInclusive->annotation); } else if (simpleType.restriction->maxExclusive) { be = simpleType.restriction->maxExclusive->value; document(simpleType.restriction->maxExclusive->annotation); } if (ai || ae || bi || be) { fprintf(stream, "/// Value range is "); if (ai) fprintf(stream, "%s", ai); else if (ae) fprintf(stream, "%s (exclusive)", ae); else fprintf(stream, "lowest"); fprintf(stream, " to "); if (bi) fprintf(stream, "%s.\n", bi); else if (be) fprintf(stream, "%s (exclusive).\n", be); else fprintf(stream, "highest.\n"); } if (!simpleType.restriction->attribute.empty()) { if (!Wflag) fprintf(stderr, "\nWarning: simpleType \"%s\" should not have attributes\n", name ? name : ""); } const char *s = tname(NULL, baseURI, base); if (!anonymous) { t = deftname(TYPEDEF, false, is_ptr(NULL, baseURI, base), prefix, URI, name); if (t) fprintf(stream, "typedef %s %s", s, t); } else { t = ""; fprintf(stream, elementformat, s, ""); fprintf(stream, "\n"); } if (t) { if (!anonymous && !simpleType.restriction->pattern.empty()) { fprintf(stream, " \""); for (vector::const_iterator pattern2 = simpleType.restriction->pattern.begin(); pattern2 != simpleType.restriction->pattern.end(); ++pattern2) { if (pattern2 != simpleType.restriction->pattern.begin()) fprintf(stream, "|"); fprintf(stream, "%s", xstring((*pattern2).value)); } fprintf(stream, "\""); } // add range info only when type is numeric bool is_numeric_type = false, is_float_type = false; if (!strncmp(s, "signed ", 7)) s += 7; else if (!strncmp(s, "unsigned ", 9)) s += 9; if (!strncmp(s, "long ", 5)) s += 5; else if (!strncmp(s, "short ", 6)) s += 6; if (!strncmp(s, "xsd__unsigned", 13)) s += 13; else if (!strncmp(s, "xsd__", 5)) s += 5; if (!strcmp(s, "float") || !strcmp(s, "double")) is_numeric_type = is_float_type = true; else if (!strcmp(s, "bool") || !strcmp(s, "byte") || !strcmp(s, "Byte") || !strcmp(s, "char") || !strcmp(s, "int") || !strcmp(s, "Int") || !strcmp(s, "long") || !strcmp(s, "Long") || !strcmp(s, "LONG64") || !strcmp(s, "short") || !strcmp(s, "Short") || !strcmp(s, "ULONG64")) is_numeric_type = true; if (!anonymous && *format) { if (is_float_type) fprintf(stream, " \"%%%sf\"", format); else if (is_numeric_type) fprintf(stream, " \"%%%sd\"", format); } if (!anonymous && simpleType.restriction->minLength && simpleType.restriction->minLength->value) fprintf(stream, " %s ", simpleType.restriction->minLength->value); else if (is_float_type && !anonymous && simpleType.restriction->minInclusive && simpleType.restriction->minInclusive->value && is_float(simpleType.restriction->minInclusive->value)) fprintf(stream, " %s ", simpleType.restriction->minInclusive->value); else if (is_numeric_type && !anonymous && simpleType.restriction->minInclusive && simpleType.restriction->minInclusive->value && is_integer(simpleType.restriction->minInclusive->value)) fprintf(stream, " %s ", simpleType.restriction->minInclusive->value); else if (is_float_type && !anonymous && simpleType.restriction->minExclusive && simpleType.restriction->minExclusive->value && is_float(simpleType.restriction->minExclusive->value)) fprintf(stream, " %s <", simpleType.restriction->minExclusive->value); else if (is_numeric_type && !anonymous && simpleType.restriction->minExclusive && simpleType.restriction->minExclusive->value && is_integer(simpleType.restriction->minExclusive->value)) fprintf(stream, " " SOAP_LONG_FORMAT " ", to_integer(simpleType.restriction->minExclusive->value)+1); if (!anonymous && simpleType.restriction->maxLength && simpleType.restriction->maxLength->value) fprintf(stream, ": %s", simpleType.restriction->maxLength->value); else if (is_float_type && !anonymous && simpleType.restriction->maxInclusive && simpleType.restriction->maxInclusive->value && is_float(simpleType.restriction->maxInclusive->value)) fprintf(stream, ": %s", simpleType.restriction->maxInclusive->value); else if (is_numeric_type && !anonymous && simpleType.restriction->maxInclusive && simpleType.restriction->maxInclusive->value && is_integer(simpleType.restriction->maxInclusive->value)) fprintf(stream, ": %s", simpleType.restriction->maxInclusive->value); else if (is_float_type && !anonymous && simpleType.restriction->maxExclusive && simpleType.restriction->maxExclusive->value && is_float(simpleType.restriction->maxExclusive->value)) fprintf(stream, ":< %s", simpleType.restriction->maxExclusive->value); else if (is_numeric_type && !anonymous && simpleType.restriction->maxExclusive && simpleType.restriction->maxExclusive->value && is_integer(simpleType.restriction->maxExclusive->value)) fprintf(stream, ": " SOAP_LONG_FORMAT, to_integer(simpleType.restriction->maxExclusive->value)-1); if (!anonymous) { fprintf(stream, ";\n\n"); if (pflag && simpleType.name) { const char *s = wname(prefix, URI, name); fprintf(stream, "/// @brief A class wrapper.\n///\n"); fprintf(stream, "class %s : public xsd__anyType\n{ public:\n", s); fprintf(stream, elementformat, tname(prefix, URI, name), "__item;"); modify(s); fprintf(stream, "\n};\n\n"); } } } } } } else if (simpleType.list) { if (simpleType.list->restriction && simpleType.list->restriction->base) { if (!anonymous) { fprintf(stream, "/// @brief \"%s\":%s is a simpleType list restriction of XSD type %s.\n///\n", URI ? URI : "", name, simpleType.list->restriction->base); fprintf(stream, "/// @note This enumeration is a bitmask, so a set of values is supported (using | and & bit-ops on the bit vector).\n"); } document(simpleType.annotation); if (!anonymous) { t = deftname(ENUM, false, false, prefix, URI, name); if (t) { if (c11flag) fprintf(stream, "enum * class : int64_t %s\n{\n", t); else fprintf(stream, "enum * %s\n{\n", t); } } else { t = ""; fprintf(stream, "enum *\n{\n"); } if (t) { for (vector::const_iterator enumeration = simpleType.list->restriction->enumeration.begin(); enumeration != simpleType.list->restriction->enumeration.end(); ++enumeration) { if ((*enumeration).value) { if (!strcmp(simpleType.list->restriction->base, "xs:QName") && (*enumeration).value_) fprintf(stream, "\t%s,\t///< %s value=\"%s\"\n", ename(t, (*enumeration).value_, true), simpleType.list->restriction->base, (*enumeration).value_); else fprintf(stream, "\t%s,\t///< %s value=\"%s\"\n", ename(t, (*enumeration).value, false), simpleType.list->restriction->base, (*enumeration).value); } else fprintf(stream, "//\tunrecognized: bitmask enumeration \"%s\" has no value\n", t); } if (!anonymous) { fprintf(stream, "};\n\n"); if (!c11flag && yflag) fprintf(stream, "/// @brief Typedef synonym for enum %s.\ntypedef enum %s %s;\n", t, t, t); if (pflag && simpleType.name) { const char *s = wname(prefix, URI, name); fprintf(stream, "/// @brief A class wrapper.\n///\n"); fprintf(stream, "class %s : public xsd__anyType\n{ public:\n", s); fprintf(stream, elementformat, tname(prefix, URI, name), "__item;"); modify(s); fprintf(stream, "\n};\n\n"); } } else fprintf(stream, "}\n"); } } else if (simpleType.list->itemType) { const xs__simpleType *p = simpleType.list->itemTypePtr(); if (p && p->restriction && p->restriction->base && !p->restriction->enumeration.empty() && p->restriction->enumeration.size() <= 64) { if (!anonymous) { fprintf(stream, "/// @brief \"%s\":%s is a simpleType list of %s.\n///\n", URI ? URI : "", name, simpleType.list->itemType); fprintf(stream, "/// @note This enumeration is a bitmask, so a set of values is supported (using | and & bit-ops on the bit vector).\n"); } document(simpleType.annotation); if (!anonymous) { t = deftname(ENUM, false, false, prefix, URI, name); if (t) { if (c11flag) fprintf(stream, "enum * class %s : int64_t\n{\n", t); else fprintf(stream, "enum * %s\n{\n", t); } } else { t = ""; fprintf(stream, "enum *\n{\n"); } if (t) { for (vector::const_iterator enumeration = p->restriction->enumeration.begin(); enumeration != p->restriction->enumeration.end(); ++enumeration) { if ((*enumeration).value) { if (!strcmp(p->restriction->base, "xs:QName") && (*enumeration).value_) fprintf(stream, "\t%s,\t///< %s value=\"%s\"\n", ename(t, (*enumeration).value_, true), p->restriction->base, (*enumeration).value_); else fprintf(stream, "\t%s,\t///< %s value=\"%s\"\n", ename(t, (*enumeration).value, false), p->restriction->base, (*enumeration).value); } else fprintf(stream, "//\tunrecognized: bitmask enumeration \"%s\" has no value\n", t); } if (!anonymous) { fprintf(stream, "};\n\n"); if (!c11flag && yflag) fprintf(stream, "/// @brief Typedef synonym for enum %s.\ntypedef enum %s %s;\n", t, t, t); if (pflag && simpleType.name) { const char *s = wname(prefix, URI, name); fprintf(stream, "/// @brief A class wrapper.\n///\n"); fprintf(stream, "class %s : public xsd__anyType\n{ public:\n", s); fprintf(stream, elementformat, tname(prefix, URI, name), "__item;"); modify(s); fprintf(stream, "\n};\n\n"); } } else fprintf(stream, "}\n"); } } else { const char *base; if (!strcmp(simpleType.list->itemType, "xs:QName")) base = "xsd:QName"; else base = "xsd:string"; const char *s = tname(NULL, NULL, base); if (!anonymous) { fprintf(stream, "/// @brief \"%s\":%s is a simpleType containing a whitespace separated list of %s.\n///\n", URI ? URI : "", name, simpleType.list->itemType); t = deftname(TYPEDEF, false, is_ptr(NULL, NULL, base), prefix, URI, name); } document(simpleType.annotation); if (t) fprintf(stream, "typedef %s %s;\n", s, t); else { fprintf(stream, elementformat, s, ""); fprintf(stream, "\n"); } fprintf(stream, "\n"); } } else { if (!anonymous) { fprintf(stream, "/// @brief \"%s\":%s is a simpleType list.\n///\n", URI ? URI : "", name); fprintf(stream, "/// @note This enumeration is a bitmask, so a set of values is supported (using | and & bit-ops on the bit vector).\n"); } document(simpleType.annotation); if (!anonymous) { t = deftname(ENUM, false, false, prefix, URI, name); if (t && !eflag && !c11flag) fprintf(stream, "/// @note The enum values are prefixed with \"%s__\" to prevent name clashes: use wsdl2h option -e to omit this prefix or use option -c++11 for scoped enumerations\n", t); } else t = ""; if (t) { if (c11flag) fprintf(stream, "enum * class %s : int64_t\n{\n", t); else fprintf(stream, "enum * %s\n{\n", t); for (vector::const_iterator simple = simpleType.list->simpleType.begin(); simple != simpleType.list->simpleType.end(); ++simple) { if ((*simple).restriction && (*simple).restriction->base) { for (vector::const_iterator enumeration = (*simple).restriction->enumeration.begin(); enumeration != (*simple).restriction->enumeration.end(); ++enumeration) { if ((*enumeration).value) { if (!strcmp((*simple).restriction->base, "xs:QName") && (*enumeration).value_) fprintf(stream, "\t%s,\t///< %s value=\"%s\"\n", ename(t, (*enumeration).value_, true), (*simple).restriction->base, (*enumeration).value_); else fprintf(stream, "\t%s,\t///< %s value=\"%s\"\n", ename(t, (*enumeration).value, false), (*simple).restriction->base, (*enumeration).value); } else fprintf(stream, "//\tunrecognized: bitmask enumeration \"%s\" has no value\n", t); } } } if (!anonymous) { fprintf(stream, "};\n\n"); if (!c11flag && yflag) fprintf(stream, "/// @brief Typedef synonym for enum %s.\ntypedef enum %s %s;\n", t, t, t); if (pflag && simpleType.name) { const char *s = wname(prefix, URI, name); fprintf(stream, "/// @brief A class wrapper.\n///\n"); fprintf(stream, "class %s : public xsd__anyType\n{ public:\n", s); fprintf(stream, elementformat, tname(prefix, URI, name), "__item;"); modify(s); fprintf(stream, "\n};\n\n"); } } else fprintf(stream, "}\n\n"); } } } else if (simpleType.union_) { if (simpleType.union_->memberTypes) { const char *s = tname(NULL, NULL, "xsd:string"); if (!anonymous) t = deftname(TYPEDEF, false, is_ptr(NULL, NULL, "xsd:string"), prefix, URI, name); fprintf(stream, "/// @brief Union of values from member types \"%s\".\n", simpleType.union_->memberTypes); if (t) fprintf(stream, "typedef %s %s;\n\n", s, t); else { fprintf(stream, elementformat, s, ""); fprintf(stream, "\n"); } } else if (!simpleType.union_->simpleType.empty()) { const char *s = tname(NULL, NULL, "xsd:string"); if (!anonymous) t = deftname(TYPEDEF, false, is_ptr(NULL, NULL, "xsd:string"), prefix, URI, name); for (vector::const_iterator simpleType1 = simpleType.union_->simpleType.begin(); simpleType1 != simpleType.union_->simpleType.end(); ++simpleType1) { if ((*simpleType1).restriction) { fprintf(stream, "/// @brief Union of values from type \"%s\".\n", (*simpleType1).restriction->base); // TODO: are there any other types we should report here? } } if (t) fprintf(stream, "typedef %s %s;\n\n", s, t); else { fprintf(stream, elementformat, s, ""); fprintf(stream, "\n"); } } else fprintf(stream, "//\tunrecognized\n"); } else fprintf(stream, "//\tunrecognized simpleType\n"); } void Types::gen(const char *URI, const char *name, const xs__complexType& complexType, bool anonymous) { const char *t = NULL; const char *prefix = NULL; bool soapflag = false; if (complexType.name) name = complexType.name; else prefix = "_"; if (anonymous && name) t = sname(URI, name); else if (name) { t = cname(prefix, URI, name); if (deftypemap[t]) return; } if (name) scope.push_back(name); if (complexType.simpleContent) { if (!anonymous) fprintf(stream, "/// @brief \"%s\":%s is a%s complexType with simpleContent.\n///\n", URI ? URI : "", name, complexType.abstract ? "n abstract" : ""); document(complexType.annotation); if (!complexType.assert.empty()) { fprintf(stream, "/// Assertions:\n"); for (std::vector::const_iterator a = complexType.assert.begin(); a != complexType.assert.end(); ++a) if ((*a).test) documentation((*a).test); } operations(t); if (complexType.simpleContent->restriction) { if (anonymous) { if (cflag) fprintf(stream, " struct %s\n {\n", t); else fprintf(stream, " class %s\n {\n", t); } else if (cflag) fprintf(stream, "struct %s\n{\n", t); else if (pflag && complexType.name) fprintf(stream, "class %s : public xsd__anyType\n{ public:\n", t); else fprintf(stream, "class %s\n{ public:\n", t); const char *base = "xs:string"; const char *baseURI = NULL; const xs__complexType *p = &complexType; do { if (!p->simpleContent) break; if (p->simpleContent->restriction) { if (p->simpleContent->restriction->complexTypePtr()) p = p->simpleContent->restriction->complexTypePtr(); else { base = p->simpleContent->restriction->base; if (p->simpleContent->restriction->simpleTypePtr() && p->simpleContent->restriction->simpleTypePtr()->schemaPtr()) baseURI = p->simpleContent->restriction->simpleTypePtr()->schemaPtr()->targetNamespace; break; } } else if (p->simpleContent->extension) { if (p->simpleContent->extension->complexTypePtr()) p = p->simpleContent->extension->complexTypePtr(); else { base = p->simpleContent->extension->base; if (p->simpleContent->extension->simpleTypePtr() && p->simpleContent->extension->simpleTypePtr()->schemaPtr()) baseURI = p->simpleContent->extension->simpleTypePtr()->schemaPtr()->targetNamespace; break; } } else break; } while (p); fprintf(stream, "/// __item wraps \"%s\" simpleContent.\n", base); fprintf(stream, elementformat, tname(NULL, baseURI, base), "__item"); fprintf(stream, ";\n"); p = &complexType; bool flag = true; do { if (!p->simpleContent) break; if (p->simpleContent->restriction) { // TODO: should only generate attribute when name is different? gen(URI, p->simpleContent->restriction->attribute); if (p->simpleContent->restriction->anyAttribute && flag) { gen(URI, *p->simpleContent->restriction->anyAttribute); flag = false; } if (p->simpleContent->restriction->complexTypePtr()) p = p->simpleContent->restriction->complexTypePtr(); else break; } else if (p->simpleContent->extension) { gen(URI, p->simpleContent->extension->attribute); gen(URI, p->simpleContent->extension->attributeGroup); if (p->simpleContent->extension->anyAttribute && flag) { gen(URI, *p->simpleContent->extension->anyAttribute); flag = false; } if (p->simpleContent->extension->complexTypePtr()) p = p->simpleContent->extension->complexTypePtr(); else break; } else break; } while (p); } else if (complexType.simpleContent->extension) { const char *base = "xs:string"; const char *baseURI = NULL; if (cflag || fflag || anonymous) { if (anonymous) { if (cflag) fprintf(stream, " struct %s\n {\n", t); else fprintf(stream, " class %s\n {\n", t); } else if (cflag) fprintf(stream, "struct %s\n{\n", t); else if (pflag && complexType.name) fprintf(stream, "class %s : public xsd__anyType\n{ public:\n", t); else fprintf(stream, "class %s\n{ public:\n", t); const xs__complexType *p = &complexType; do { if (!p->simpleContent) break; if (p->simpleContent->restriction) { if (p->simpleContent->restriction->complexTypePtr()) p = p->simpleContent->restriction->complexTypePtr(); else { base = p->simpleContent->restriction->base; if (p->simpleContent->restriction->simpleTypePtr() && p->simpleContent->restriction->simpleTypePtr()->schemaPtr()) baseURI = p->simpleContent->restriction->simpleTypePtr()->schemaPtr()->targetNamespace; break; } } else if (p->simpleContent->extension) { if (p->simpleContent->extension->complexTypePtr()) p = p->simpleContent->extension->complexTypePtr(); else { base = p->simpleContent->extension->base; if (p->simpleContent->extension->simpleTypePtr() && p->simpleContent->extension->simpleTypePtr()->schemaPtr()) baseURI = p->simpleContent->extension->simpleTypePtr()->schemaPtr()->targetNamespace; break; } } else break; } while (p); fprintf(stream, "/// __item wraps \"%s\" simpleContent.\n", base); fprintf(stream, elementformat, tname(NULL, baseURI, base), "__item"); fprintf(stream, ";\n"); p = &complexType; bool flag = true; do { if (!p->simpleContent) break; if (p->simpleContent->restriction) { gen(URI, p->simpleContent->restriction->attribute); if (p->simpleContent->restriction->anyAttribute && flag) gen(URI, *p->simpleContent->restriction->anyAttribute); break; } else if (p->simpleContent->extension) { gen(URI, p->simpleContent->extension->attribute); gen(URI, p->simpleContent->extension->attributeGroup); if (p->simpleContent->extension->anyAttribute && flag) { gen(URI, *p->simpleContent->extension->anyAttribute); flag = false; } if (p->simpleContent->extension->complexTypePtr()) p = p->simpleContent->extension->complexTypePtr(); else break; } else break; } while (p); } else { base = complexType.simpleContent->extension->base; if ( /* TODO: in future, may want to add check here for base type == class complexType.simpleContent->extension->simpleTypePtr() || */ complexType.simpleContent->extension->complexTypePtr()) { if (complexType.simpleContent->extension->complexTypePtr()->schemaPtr()) baseURI = complexType.simpleContent->extension->complexTypePtr()->schemaPtr()->targetNamespace; fprintf(stream, "class %s : public %s\n{ public:\n", t, cname(NULL, baseURI, base)); soapflag = true; } else { if (complexType.simpleContent->extension->simpleTypePtr() && complexType.simpleContent->extension->simpleTypePtr()->schemaPtr()) baseURI = complexType.simpleContent->extension->simpleTypePtr()->schemaPtr()->targetNamespace; else if (complexType.simpleContent->extension->complexTypePtr() && complexType.simpleContent->extension->complexTypePtr()->schemaPtr()) baseURI = complexType.simpleContent->extension->complexTypePtr()->schemaPtr()->targetNamespace; if (pflag && complexType.name) fprintf(stream, "class %s : public xsd__anyType\n{ public:\n", t); else fprintf(stream, "class %s\n{ public:\n", t); fprintf(stream, "/// __item wraps \"%s\" simpleContent.\n", base); fprintf(stream, elementformat, tname(NULL, baseURI, base), "__item"); fprintf(stream, ";\n"); } gen(URI, complexType.simpleContent->extension->attribute); gen(URI, complexType.simpleContent->extension->attributeGroup); if (complexType.simpleContent->extension->anyAttribute) gen(URI, *complexType.simpleContent->extension->anyAttribute); } } else fprintf(stream, "//\tunrecognized\n"); } else if (complexType.complexContent) { if (complexType.complexContent->restriction) { if (!anonymous) fprintf(stream, "/// @brief \"%s\":%s is a%s complexType with complexContent restriction of XSD type %s.\n///\n", URI ? URI : "", name, complexType.abstract ? "n abstract" : "", complexType.complexContent->restriction->base); document(complexType.annotation); document(complexType.complexContent->annotation); document(complexType.complexContent->restriction->annotation); if (!complexType.assert.empty()) { fprintf(stream, "/// Assertions:\n"); for (std::vector::const_iterator a = complexType.assert.begin(); a != complexType.assert.end(); ++a) if ((*a).test) documentation((*a).test); } if (!complexType.complexContent->restriction->assert.empty()) { fprintf(stream, "/// Assertions on restriction:\n"); for (std::vector::const_iterator a = complexType.complexContent->restriction->assert.begin(); a != complexType.complexContent->restriction->assert.end(); ++a) if ((*a).test) documentation((*a).test); } operations(t); if (!strcmp(complexType.complexContent->restriction->base, "SOAP-ENC:Array")) { char *item = NULL, *type = NULL; if (!complexType.complexContent->restriction->attribute.empty()) { xs__attribute& attribute = complexType.complexContent->restriction->attribute.front(); if (attribute.wsdl__arrayType) type = attribute.wsdl__arrayType; } xs__seqchoice *s = complexType.complexContent->restriction->sequence; if (s && !s->__contents.empty() && s->__contents.front().__union == SOAP_UNION_xs__union_content_element && s->__contents.front().__content.element) { xs__element& element = *s->__contents.front().__content.element; if (!type) { if (element.type) type = element.type; else if (element.simpleTypePtr()) { if (element.simpleTypePtr()->name) type = element.simpleTypePtr()->name; else if (element.simpleTypePtr()->restriction) type = element.simpleTypePtr()->restriction->base; } else if (element.complexTypePtr()) { if (element.complexTypePtr()->name) type = element.complexTypePtr()->name; else if (element.complexTypePtr()->complexContent && element.complexTypePtr()->complexContent->restriction) type = element.complexTypePtr()->complexContent->restriction->base; } } item = element.name; // } gen_soap_array(t, item, type); } else { if (anonymous) { if (cflag) fprintf(stream, " struct %s\n {\n", t); else fprintf(stream, " class %s\n {\n", t); } else if (cflag) fprintf(stream, "struct %s\n{\n", t); else if (pflag && complexType.name) fprintf(stream, "class %s : public xsd__anyType\n{ public:\n", t); else fprintf(stream, "class %s\n{ public:\n", t); if (complexType.complexContent->restriction->group) gen(URI, *complexType.complexContent->restriction->group, NULL, NULL); if (complexType.complexContent->restriction->all) gen(URI, *complexType.complexContent->restriction->all, NULL, NULL); if (complexType.complexContent->restriction->sequence) gen(URI, *complexType.complexContent->restriction->sequence, NULL, NULL); if (complexType.complexContent->restriction->choice) gen(URI, name, *complexType.complexContent->restriction->choice, NULL, NULL); gen(URI, complexType.complexContent->restriction->attribute); bool flag = true; if (complexType.complexContent->restriction->anyAttribute) { gen(URI, *complexType.complexContent->restriction->anyAttribute); flag = false; } const xs__complexType *p = complexType.complexContent->restriction->complexTypePtr(); while (p) { const char *pURI; if (p->schemaPtr()) pURI = p->schemaPtr()->targetNamespace; else pURI = URI; const char *b = cname(NULL, pURI, p->name); if (zflag && zflag <= 5) fprintf(stream, "/// RESTRICTED FROM %s:\n", b); else if (comment_nest == 0) fprintf(stream, "/* RESTRICTED FROM %s:\n", b); else fprintf(stream, " RESTRICTED FROM %s:\n", b); comment_nest++; if (p->complexContent && p->complexContent->restriction) { gen(URI, p->complexContent->restriction->attribute); if (p->complexContent->restriction->anyAttribute && flag) { gen(URI, *p->complexContent->restriction->anyAttribute); flag = false; } p = p->complexContent->restriction->complexTypePtr(); } else if (p->complexContent && p->complexContent->extension) { gen(URI, p->complexContent->extension->attribute); gen(URI, p->complexContent->extension->attributeGroup); if (p->complexContent->extension->anyAttribute && flag) { gen(URI, *p->complexContent->extension->anyAttribute); flag = false; } p = p->complexContent->extension->complexTypePtr(); } else { gen(URI, p->attribute); gen(URI, p->attributeGroup); if (p->anyAttribute && flag) gen(URI, *p->anyAttribute); p = NULL; } comment_nest--; if (zflag && zflag <= 5) fprintf(stream, "// END OF RESTRICTED FROM %s\n", b); else if (comment_nest == 0) fprintf(stream, " END OF RESTRICTED FROM %s */\n", b); else fprintf(stream, " END OF RESTRICTED FROM %s\n", b); } } } else if (complexType.complexContent->extension) { const char *base = complexType.complexContent->extension->base; xs__complexType *p = complexType.complexContent->extension->complexTypePtr(); if (!anonymous) fprintf(stream, "/// @brief \"%s\":%s is a%s complexType with complexContent extension of XSD type %s.\n///\n", URI ? URI : "", name, complexType.abstract ? "n abstract" : "", base); document(complexType.annotation); document(complexType.complexContent->annotation); document(complexType.complexContent->extension->annotation); if (!complexType.assert.empty()) { fprintf(stream, "/// Assertions:\n"); for (std::vector::const_iterator a = complexType.assert.begin(); a != complexType.assert.end(); ++a) if ((*a).test) documentation((*a).test); } if (!complexType.complexContent->extension->assert.empty()) { fprintf(stream, "/// Assertions on extension:\n"); for (std::vector::const_iterator a = complexType.complexContent->extension->assert.begin(); a != complexType.complexContent->extension->assert.end(); ++a) if ((*a).test) documentation((*a).test); } operations(t); if (anonymous) { if (cflag) fprintf(stream, " struct %s\n {\n", t); else fprintf(stream, " class %s\n {\n", t); } else if (cflag) fprintf(stream, "struct %s\n{\n", t); else if (fflag) fprintf(stream, "class %s\n{ public:\n", t); else // TODO: what to do if base class is in another namespace and elements must be qualified in XML payload? { const char *baseURI = NULL; if (p && p->schemaPtr()) baseURI = p->schemaPtr()->targetNamespace; fprintf(stream, "class %s : public %s\n{ public:\n", t, cname(NULL, baseURI, base)); soapflag = true; } gen_inh(URI, p, anonymous); if (complexType.complexContent->extension->group) gen(URI, *complexType.complexContent->extension->group, NULL, NULL); if (complexType.complexContent->extension->all) gen(URI, *complexType.complexContent->extension->all, NULL, NULL); if (complexType.complexContent->extension->sequence) gen(URI, *complexType.complexContent->extension->sequence, NULL, NULL); if (complexType.complexContent->extension->choice) gen(URI, name, *complexType.complexContent->extension->choice, NULL, NULL); gen(URI, complexType.complexContent->extension->attribute); gen(URI, complexType.complexContent->extension->attributeGroup); if (complexType.complexContent->extension->anyAttribute) gen(URI, *complexType.complexContent->extension->anyAttribute); } else fprintf(stream, "//\tunrecognized\n"); } else { if (!anonymous) fprintf(stream, "/// @brief \"%s\":%s is a%s complexType.\n///\n", URI ? URI : "", name, complexType.abstract ? "n abstract" : ""); document(complexType.annotation); operations(t); if (anonymous) { if (cflag) fprintf(stream, " struct %s\n {\n", t); else fprintf(stream, " class %s\n {\n", t); } else if (cflag) fprintf(stream, "struct %s\n{\n", t); else if (pflag && complexType.name) fprintf(stream, "class %s : public xsd__anyType\n{ public:\n", t); else fprintf(stream, "class %s\n{ public:\n", t); if (complexType.all) gen(URI, *complexType.all, NULL, NULL); else if (complexType.choice) gen(URI, name, *complexType.choice, NULL, NULL); else if (complexType.sequence) gen(URI, *complexType.sequence, NULL, NULL); else if (complexType.any) gen(URI, *complexType.any, NULL, NULL); } if (!(complexType.complexContent && complexType.complexContent->extension) && complexType.defaultAttributesApply && complexType.schemaPtr() && complexType.schemaPtr()->attributeGroupPtr()) { fprintf(stream, "/// Default attributes \"%s\"\n", complexType.schemaPtr()->defaultAttributes); xs__attributeGroup *a = complexType.schemaPtr()->attributeGroupPtr(); if (a->attributeGroupPtr()) a = a->attributeGroupPtr(); gen(URI, a->attribute); gen(URI, a->attributeGroup); if (a->anyAttribute) gen(URI, *a->anyAttribute); } gen(URI, complexType.attribute); gen(URI, complexType.attributeGroup); if (complexType.anyAttribute) gen(URI, *complexType.anyAttribute); if (complexType.mixed || ( complexType.complexContent && ( complexType.complexContent->mixed || ( complexType.complexContent->extension && complexType.complexContent->extension->complexTypePtr() && complexType.complexContent->extension->complexTypePtr()->mixed ) ) )) { fprintf(stream, "/// @todo This mixed content complexType is user-definable.\n/// Consult the protocol documentation to change or insert declarations.\n/// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element).\n"); if (dflag) { if (with_union) fprintf(stream, pointerformat, "xsd__anyType", "__mixed"); else fprintf(stream, elementformat, "xsd__anyType", "__mixed"); fprintf(stream, "0;\t///< Catch mixed content in DOM soap_dom_element linked node structure.\n"); } else { fprintf(stream, elementformat, "_XML", "__mixed"); fprintf(stream, "0;\t///< Catch mixed content in XML string.\n"); } } if (t) modify(t); if (!anonymous) { if (!cflag && !(pflag && complexType.name) && !soapflag) { if (!complexType.complexContent || !complexType.complexContent->extension || !complexType.complexContent->extension->complexTypePtr()) { fprintf(stream, "/// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set).\n"); fprintf(stream, pointerformat, "struct soap", "soap"); fprintf(stream, ";\n"); } } fprintf(stream, "};\n\n"); } scope.pop_back(); } void Types::gen(const char *URI, const vector& attributes) { for (vector::const_iterator attribute = attributes.begin(); attribute != attributes.end(); ++attribute) gen(URI, *attribute); } void Types::gen(const char *URI, const xs__attribute& attribute) { const char *name = attribute.name; const char *type = attribute.type; const char *default_ = attribute.default_; const char *default__ = attribute.default__; const char *fixed = attribute.fixed; const char *fixed_ = attribute.fixed_; const char *nameURI = NULL, *typeURI = NULL, *nameprefix = NULL, *typeprefix = NULL; bool is_optional = attribute.use != required && !default_; document(attribute.annotation); if (!URI) URI = attribute.schemaPtr()->targetNamespace; if (attribute.targetNamespace) { if ((attribute.form && *attribute.form == qualified) || attribute.schemaPtr()->attributeFormDefault == qualified) nameURI = attribute.targetNamespace; else nameprefix = ":"; } else if (!attribute.ref && URI && attribute.schemaPtr() && attribute.schemaPtr()->targetNamespace && strcmp(URI, attribute.schemaPtr()->targetNamespace)) { if ((attribute.form && *attribute.form == qualified) || attribute.schemaPtr()->attributeFormDefault == qualified) nameURI = attribute.schemaPtr()->targetNamespace; // handles attributes defined in another namespace else nameprefix = ":"; } else if (attribute.form) { if (*attribute.form == qualified) nameURI = URI; else nameprefix = ":"; } if (attribute.attributePtr()) // attribute ref { name = attribute.attributePtr()->name; type = attribute.attributePtr()->type; if (!default_) { default_ = attribute.attributePtr()->default_; default__ = attribute.attributePtr()->default__; } if (!fixed) { fixed = attribute.attributePtr()->fixed; fixed_ = attribute.attributePtr()->fixed_; } if (default_) is_optional = false; else if (is_optional) is_optional = attribute.attributePtr()->use != required; if (!type) { type = name; typeprefix = "_"; } if (attribute.attributePtr()->schemaPtr()) { typeURI = attribute.attributePtr()->schemaPtr()->targetNamespace; if (attribute.form && *attribute.form == unqualified) nameprefix = ":"; else if (zflag != 3 && zflag != 2 && URI && typeURI && attribute.schemaPtr()->attributeFormDefault == qualified && !strcmp(URI, typeURI)) nameprefix = NULL; else if (zflag == 3 && URI && typeURI && attribute.schemaPtr()->attributeFormDefault == unqualified && !strcmp(URI, typeURI)) nameprefix = NULL; else nameURI = typeURI; } if (attribute.ref) fprintf(stream, "/// Attribute reference \"%s\":%s.\n", attribute.schemaPtr()->targetNamespace, attribute.ref); document(attribute.attributePtr()->annotation); fprintf(stream, attributeformat, pname(is_optional, true, typeprefix, typeURI, type), aname(nameprefix, nameURI, name)); // make sure no name - type clash } else if (name && type) { fprintf(stream, "/// Attribute \"%s\" of XSD type %s.\n", name, type); fprintf(stream, attributeformat, pname(is_optional, true, NULL, URI, type), aname(nameprefix, nameURI, name)); // make sure no name - type clash } else if (name && attribute.simpleTypePtr()) { const char *s = ""; const char *r = NULL; if (!cflag && is_optional && (r = vname("$POINTER")) && *r != '*' && *r != '$') { s = ">"; fprintf(stream, attrtemplateformat_open, r, "\n"); } else fprintf(stream, "@"); gen(URI, name, *attribute.simpleTypePtr(), true, false); if (r && *r != '*' && *r != '$') fprintf(stream, elementformat, s, aname(nameprefix, nameURI, name)); else if (is_optional) fprintf(stream, pointerformat, s, aname(nameprefix, nameURI, name)); else fprintf(stream, elementformat, s, aname(nameprefix, nameURI, name)); } else if (attribute.ref) { fprintf(stream, "/// Imported attribute reference %s.\n", attribute.ref); fprintf(stream, attributeformat, pname(is_optional, true, "_", NULL, attribute.ref), aname(NULL, NULL, attribute.ref)); } else { fprintf(stream, "/// Attribute \"%s\" has no type or ref: assuming string content.\n", name ? name : ""); fprintf(stream, attributeformat, tname(NULL, NULL, "xs:string"), aname(NULL, nameURI, name)); } switch (attribute.use) { case prohibited: fprintf(stream, " 0:0"); break; case required: fprintf(stream, " 1"); break; default: if (is_optional || default_) fprintf(stream, " 0"); break; } if (default_) { const char *value, *QName; value = default_; QName = default__; const char *t = NULL; if (!type && attribute.simpleTypePtr()) { if (attribute.simpleTypePtr()->restriction && attribute.simpleTypePtr()->restriction->base) { if (!attribute.simpleTypePtr()->restriction->enumeration.empty()) { const char *s; if (is_integer(value)) fprintf(stream, " = %s", value); else if (!*value) fprintf(stream, " = 0"); else if ((s = enames[Pair(gname(URI, name),value)])) fprintf(stream, " = %s", s); } else { const char *baseURI = NULL; if (attribute.simpleTypePtr()->restriction->simpleTypePtr() && attribute.simpleTypePtr()->restriction->simpleTypePtr()->schemaPtr()) baseURI = attribute.simpleTypePtr()->restriction->simpleTypePtr()->schemaPtr()->targetNamespace; t = tname(NULL, baseURI, attribute.simpleTypePtr()->restriction->base); } } } if (type && !t) t = tname(NULL, typeURI ? typeURI : URI, type); if (t) { if (!strncmp(t, "unsigned ", 9)) t += 9; else if (!strncmp(t, "xsd__unsigned", 13)) t += 13; else if (!strncmp(t, "xsd__", 5)) t += 5; if (!strcmp(t, "bool") || !strcmp(t, "byte") || !strcmp(t, "Byte") || !strcmp(t, "char") || !strcmp(t, "double") || !strcmp(t, "float") || !strcmp(t, "int") || !strcmp(t, "Int") || !strcmp(t, "long") || !strcmp(t, "Long") || !strcmp(t, "LONG64") || !strcmp(t, "short") || !strcmp(t, "Short") || !strcmp(t, "ULONG64")) fprintf(stream, " = %s", value); else if (!strncmp(t, "enum ", 5)) { const char *s; if (is_integer(value)) fprintf(stream, " = %s", value); else if (!*value) fprintf(stream, " = 0"); else if ((s = enames[Pair(t + 5,value)])) fprintf(stream, " = %s", s); } else if (!strncmp(t, "char", 4) || !strncmp(t, "const char", 10) || !strncmp(t, "wchar_t", 7) || !strncmp(t, "const wchar_t", 13) || !strncmp(t, "std::string", 11)) fprintf(stream, " = \"%s\"", cstring(value)); else if (!strcmp(t, "xsd__QName") && QName) // QName fprintf(stream, " = \"%s\"", cstring(QName)); } fprintf(stream, ";\t///< Default attribute value=\"%s\".\n", value); } else if (fixed) fprintf(stream, ";\t///< Fixed attribute value=\"%s\".\n", fixed); else if (attribute.use == required) fprintf(stream, ";\t///< Required attribute.\n"); else if (attribute.use == prohibited) fprintf(stream, ";\t///< Prohibited attribute.\n"); else fprintf(stream, ";\t///< Optional attribute.\n"); } void Types::gen(const char *URI, const vector& attributeGroups) { for (vector::const_iterator attributeGroup = attributeGroups.begin(); attributeGroup != attributeGroups.end(); ++attributeGroup) { static set visited; const xs__attributeGroup *p = &*attributeGroup; if (visited.find(p) != visited.end()) { if (p->ref) fprintf(stderr, "\nWarning: circular attributeGroup \n", p->ref); else fprintf(stderr, "\nWarning: circular attributeGroup \n", p->name ? p->name : ""); fprintf(stream, "/// @todo !FIXME! @warning %s is an attributeGroup with a circular reference.\n", p->ref ? p->ref : p->name ? p->name : ""); return; } visited.insert(p); const char *pURI = URI; if (p->ref) // attributeGroup ref fprintf(stream, "// BEGIN ATTRIBUTEGROUP .\n", p->ref ? p->ref : ""); else fprintf(stream, "// BEGIN ATTRIBUTEGROUP .\n", p->name ? p->name : ""); if (p->attributeGroupPtr()) { gen(pURI, p->attributeGroupPtr()->attribute); gen(pURI, p->attributeGroupPtr()->attributeGroup); } else { gen(pURI, p->attribute); gen(pURI, p->attributeGroup); } if (p->anyAttribute) gen(pURI, *p->anyAttribute); fprintf(stream, "// END OF ATTRIBUTEGROUP\n"); visited.erase(p); } } void Types::gen(const char *URI, const vector& alls) { for (vector::const_iterator all = alls.begin(); all != alls.end(); ++all) gen(URI, *all, NULL, NULL); } void Types::gen(const char *URI, const xs__all& all, const char *minOccurs, const char *maxOccurs) { bool tmp_union1 = with_union; bool tmp_union2 = fake_union; with_union = false; fake_union = false; gen(URI, all.element, minOccurs, maxOccurs); with_union = tmp_union1; fake_union = tmp_union2; } void Types::gen(const char *URI, const vector& contents) { for (vector::const_iterator content = contents.begin(); content != contents.end(); ++content) { switch ((*content).__union) { case SOAP_UNION_xs__union_content_element: if ((*content).__content.element) gen(URI, *(*content).__content.element, true, NULL, NULL); break; case SOAP_UNION_xs__union_content_group: if ((*content).__content.group) gen(URI, *(*content).__content.group, NULL, NULL); break; case SOAP_UNION_xs__union_content_choice: if ((*content).__content.choice) gen(URI, NULL, *(*content).__content.choice, NULL, NULL); break; case SOAP_UNION_xs__union_content_sequence: if ((*content).__content.sequence) gen(URI, *(*content).__content.sequence, NULL, NULL); break; case SOAP_UNION_xs__union_content_any: if ((*content).__content.any) gen(URI, *(*content).__content.any, NULL, NULL); break; } } } void Types::gen(const char *URI, const xs__seqchoice& sequence, const char *minOccurs, const char *maxOccurs) { const char *s = NULL; const char *min = minOccurs; const char *max = maxOccurs; char *t = NULL; bool tmp_union = with_union; with_union = false; if (sequence.minOccurs) min = sequence.minOccurs; if (sequence.maxOccurs) max = sequence.maxOccurs; if ((min && strcmp(min, "1")) || (max && strcmp(max, "1"))) { fprintf(stream, "// BEGIN SEQUENCE \n"); document(sequence.annotation); s = sname(URI, "sequence"); size_t l = strlen(s); t = (char*)emalloc(l + 2); soap_strcpy(t, l + 2, "_"); soap_strcpy(t + 1, l + 1, s); s = strstr(s, "__"); if (!s) s = t; if (max && strcmp(max, "1")) { if (cflag || sflag || zflag == 2) { fprintf(stream, sizeformat, "int", s + 1); if (!fake_union && min) fprintf(stream, " %s", min); if (max && strcmp(max, "1") && is_integer(max)) fprintf(stream, ":%s", max); fprintf(stream, ";\n"); } else { fprintf(stream, templateformat_open, vname("$CONTAINER"), "\n"); } } if (cflag) fprintf(stream, " struct %s\n {\n", t); else fprintf(stream, " class %s\n {\n", t); } else { if (fake_union) fprintf(stream, "// BEGIN SEQUENCE \n"); document(sequence.annotation); } gen(URI, sequence.__contents); if (s) { if (max && strcmp(max, "1")) { if (cflag || sflag || zflag == 2) fprintf(stream, pointerformat, "}", s); else { fprintf(stream, elementformat, "}>", s); if (!fake_union && min) fprintf(stream, " %s", min); if (max && strcmp(max, "1") && is_integer(max)) fprintf(stream, ":%s", max); } } else { fprintf(stream, pointerformat, "}", s); if (!fake_union && min) fprintf(stream, " %s", min); } fprintf(stream, ";\n"); } if (s || fake_union) fprintf(stream, "// END OF SEQUENCE\n"); with_union = tmp_union; } void Types::gen(const char *URI, const vector& elements, const char *minOccurs, const char *maxOccurs) { for (vector::const_iterator element = elements.begin(); element != elements.end(); ++element) gen(URI, *element, true, minOccurs, maxOccurs); } void Types::gen(const char *URI, const xs__element& element, bool substok, const char *minOccurs, const char *maxOccurs) { const char *name = element.name; const char *type = element.type; const char *default_ = element.default_; const char *default__ = element.default__; const char *fixed = element.fixed; const char *fixed_ = element.fixed_; const char *min = minOccurs; const char *max = maxOccurs; bool nillable = element.nillable; const char *nameURI = NULL, *typeURI = NULL, *nameprefix = NULL, *typeprefix = NULL; document(element.annotation); if (!URI) URI = element.schemaPtr()->targetNamespace; if (element.minOccurs) min = element.minOccurs; if (element.maxOccurs) max = element.maxOccurs; if (element.xmime__expectedContentTypes) fprintf(stream, "/// MTOM attachment with content types %s.\n", element.xmime__expectedContentTypes); if (element.targetNamespace) { if ((element.form && *element.form == qualified) || element.schemaPtr()->elementFormDefault == qualified) nameURI = element.targetNamespace; else nameprefix = ":"; } else if (!element.ref && URI && element.schemaPtr() && element.schemaPtr()->targetNamespace && strcmp(URI, element.schemaPtr()->targetNamespace)) { if ((element.form && *element.form == qualified) || element.schemaPtr()->elementFormDefault == qualified) nameURI = element.schemaPtr()->targetNamespace; // handles elements defined in another namespace else nameprefix = ":"; } else if (element.form) { if (*element.form == qualified) nameURI = URI; else nameprefix = ":"; } if (element.elementPtr()) // element ref (or ref to substitution element) { name = element.elementPtr()->name; type = element.elementPtr()->type; if (!default_) { default_ = element.elementPtr()->default_; default__ = element.elementPtr()->default__; } if (!fixed) { fixed = element.elementPtr()->fixed; fixed_ = element.elementPtr()->fixed_; } if (!nillable) nillable = element.elementPtr()->nillable; if (!type) { type = name; typeprefix = "_"; } if (element.elementPtr()->schemaPtr()) { typeURI = element.elementPtr()->schemaPtr()->targetNamespace; if (element.form && *element.form == unqualified) nameprefix = ":"; else if (zflag != 3 && zflag != 2 && URI && typeURI && element.schemaPtr()->elementFormDefault == qualified && !strcmp(URI, typeURI)) nameprefix = NULL; else if (zflag == 3 && URI && typeURI && element.schemaPtr()->elementFormDefault == unqualified && !strcmp(URI, typeURI)) nameprefix = NULL; else nameURI = typeURI; } document(element.elementPtr()->annotation); if (element.elementPtr()->xmime__expectedContentTypes) fprintf(stream, "/// MTOM attachment with content types %s.\n", element.elementPtr()->xmime__expectedContentTypes); if (substok && element.elementPtr()->abstract) { fprintf(stream, "/// Reference %s to abstract element.\n", element.ref); gen_substitutions(URI, element); } else if (substok && element.elementPtr()->substitutionsPtr() && !element.elementPtr()->substitutionsPtr()->empty()) { if (vflag) fprintf(stderr, "\nWarning: element ref \"%s\" stands as the head of a substitutionGroup but is not declared abstract\n", element.ref); gen_substitutions(URI, element); } else if (max && strcmp(max, "1")) // maxOccurs != "1" { const char *s = tnameptr(cflag && zflag != 1, typeprefix, typeURI, type); if (cflag || sflag) { fprintf(stream, "/// Size of the dynamic array of %s is %s..%s.\n", s, min ? min : "1", max); fprintf(stream, sizeformat, "int", aname(NULL, NULL, name)); fprintf(stream, " %s", fake_union ? "0" : min ? min : "1"); if (is_integer(max)) fprintf(stream, ":%s", max); fprintf(stream, ";\n"); if (cflag && zflag != 1) { fprintf(stream, "/// Array %s of size %s..%s.\n", s, min ? min : "1", max); fprintf(stream, elementformat, s, aname(nameprefix, nameURI, name)); } else { fprintf(stream, "/// Pointer to array %s of size %s..%s.\n", s, min ? min : "1", max); fprintf(stream, pointerformat, s, aname(nameprefix, nameURI, name)); } } else { fprintf(stream, "/// Vector of %s element refs of length %s..%s.\n", s, min ? min : "1", max); if (with_union) fprintf(stream, pointertemplateformat, vname("$CONTAINER"), s, aname(nameprefix, nameURI, name)); else fprintf(stream, templateformat, vname("$CONTAINER"), s, aname(nameprefix, nameURI, name)); } } else { if (element.ref) fprintf(stream, "/// Element reference \"%s:\"%s.\n", element.schemaPtr()->targetNamespace, element.ref); else fprintf(stream, "/// Element \"%s\":%s.\n", element.schemaPtr()->targetNamespace, name); fprintf(stream, elementformat, pname((with_union && !is_choicetype(typeprefix, typeURI, type)) || ((fake_union || element.nillable || (is_nillable(element) && !(with_union && is_choicetype(typeprefix, typeURI, type)))) && !default_) || fixed, !with_union, typeprefix, typeURI, type), aname(nameprefix, nameURI, name)); } } else if (name && type) { if (substok && element.abstract) { fprintf(stream, "/// Abstract element %s of XSD type %s.\n", name, type); gen_substitutions(URI, element); } else if (substok && element.substitutionsPtr() && !element.substitutionsPtr()->empty()) { if (vflag) fprintf(stderr, "\nWarning: element \"%s\" stands as the head of a substitutionGroup but is not declared abstract\n", name); gen_substitutions(URI, element); } else if (max && strcmp(max, "1")) // maxOccurs != "1" { const char *s = tnameptr(cflag && zflag != 1, NULL, URI, type); if (cflag || sflag) { fprintf(stream, "/// Size of array of %s is %s..%s.\n", s, min ? min : "1", max); fprintf(stream, sizeformat, "int", aname(NULL, NULL, name)); fprintf(stream, " %s", fake_union ? "0" : min ? min : "1"); if (is_integer(max)) fprintf(stream, ":%s", max); fprintf(stream, ";\n"); if (cflag && zflag != 1) { fprintf(stream, "/// Array %s of size %s..%s.\n", s, min ? min : "1", max); fprintf(stream, elementformat, s, aname(nameprefix, nameURI, name)); } else { fprintf(stream, "/// Pointer to array %s of size %s..%s.\n", s, min ? min : "1", max); fprintf(stream, pointerformat, s, aname(nameprefix, nameURI, name)); } } else { fprintf(stream, "/// Vector of %s of length %s..%s.\n", s, min ? min : "1", max); if (with_union) fprintf(stream, pointertemplateformat, vname("$CONTAINER"), s, aname(nameprefix, nameURI, name)); else fprintf(stream, templateformat, vname("$CONTAINER"), s, aname(nameprefix, nameURI, name)); } } else { fprintf(stream, "/// Element \"%s\" of XSD type %s.\n", name, type); fprintf(stream, elementformat, pname((with_union && !is_choicetype(NULL, URI, type)) || ((fake_union || element.nillable || (is_nillable(element) && !(with_union && is_choicetype(NULL, URI, type)))) && !default_) || fixed, !with_union, NULL, URI, type), aname(nameprefix, nameURI, name)); } } else if (name && element.simpleTypePtr()) { const char *s = ""; const char *r = NULL; document(element.simpleTypePtr()->annotation); if (max && strcmp(max, "1")) // maxOccurs != "1" { if (cflag || sflag) { fprintf(stream, "/// Size of %s array is %s..%s.\n", name, min ? min : "1", max); fprintf(stream, sizeformat, "int", aname(NULL, NULL, name)); fprintf(stream, " %s", fake_union ? "0" : min ? min : "1"); if (is_integer(max)) fprintf(stream, ":%s", max); fprintf(stream, ";\n"); } else { s = ">"; fprintf(stream, "/// Vector of %s of length %s..%s.\n", name, min ? min : "1", max); fprintf(stream, templateformat_open, vname("$CONTAINER"), "\n"); } } else if (!cflag && !with_union && (r = vname("$POINTER")) && *r != '*' && *r != '$') { if ((is_nillable(element) && !default_) || fixed || (fake_union && !default_)) { s = ">"; fprintf(stream, templateformat_open, r, "\n"); } } gen(URI, name, *element.simpleTypePtr(), true, false); if (r && *r != '*' && *r != '$') fprintf(stream, elementformat, s, aname(nameprefix, nameURI, name)); else if ((is_nillable(element) && !default_) || fixed || ((cflag || sflag) && max && strcmp(max, "1")) // maxOccurs != "1" || (with_union && !cflag) || (fake_union && !default_)) fprintf(stream, pointerformat, s, aname(nameprefix, nameURI, name)); else fprintf(stream, elementformat, s, aname(nameprefix, nameURI, name)); } else if (name && element.complexTypePtr()) { const char *s = "}"; const char *r = NULL; document(element.complexTypePtr()->annotation); if (max && strcmp(max, "1")) // maxOccurs != "1" { if (cflag || sflag) { fprintf(stream, "/// Size of %s array is %s..%s.\n", name, min ? min : "1", max); fprintf(stream, sizeformat, "int", aname(NULL, NULL, name)); fprintf(stream, " %s", fake_union ? "0" : min ? min : "1"); if (is_integer(max)) fprintf(stream, ":%s", max); fprintf(stream, ";\n"); } else { s = "}>"; fprintf(stream, "/// Vector of %s of length %s..%s.\n", name, min ? min : "1", max); fprintf(stream, templateformat_open, vname("$CONTAINER"), "\n"); } } else if (!cflag && !with_union && (r = vname("$POINTER")) && *r != '*' && *r != '$') { if ((is_nillable(element) && !default_) || fixed || (fake_union && !default_)) { s = "}>"; fprintf(stream, templateformat_open, r, "\n"); } } gen(URI, name, *element.complexTypePtr(), true); if (r && *r != '*' && *r != '$') fprintf(stream, elementformat, s, aname(nameprefix, nameURI, name)); else if ((is_nillable(element) && !default_) || fixed || ((cflag || sflag) && max && strcmp(max, "1")) // maxOccurs != "1" || (with_union && !cflag) || (fake_union && !default_)) fprintf(stream, pointerformat, s, aname(nameprefix, nameURI, name)); else fprintf(stream, elementformat, s, aname(nameprefix, nameURI, name)); } else if (element.ref) { fprintf(stream, "/// Imported element reference %s.\n", element.ref); if (max && strcmp(max, "1")) // maxOccurs != "1" { if (cflag || sflag) { fprintf(stream, "/// Size of %s array is %s..%s.\n", element.ref, min ? min : "1", max); fprintf(stream, sizeformat, "int", aname(NULL, NULL, element.ref)); fprintf(stream, " %s", fake_union ? "0" : min ? min : "1"); if (is_integer(max)) fprintf(stream, ":%s", max); fprintf(stream, ";\n"); fprintf(stream, pointerformat, pname(true, true, "_", NULL, element.ref), aname(nameprefix, nameURI, element.ref)); } else { fprintf(stream, "/// Vector of %s of length %s..%s.\n", element.ref, min ? min : "1", max); fprintf(stream, templateformat, vname("$CONTAINER"), tname("_", NULL, element.ref), aname(nameprefix, nameURI, element.ref)); } } else fprintf(stream, elementformat, pname((with_union && !cflag) || ((fake_union || is_nillable(element)) && !default_) || fixed, !with_union, "_", NULL, element.ref), aname(nameprefix, nameURI, element.ref)); } else if (name) { fprintf(stream, "/// Element \"%s\" has no type or ref (empty or with XML content).\n", name ? name : ""); if (max && strcmp(max, "1")) // maxOccurs != "1" { if (cflag || sflag) { fprintf(stream, sizeformat, "int", aname(NULL, NULL, name)); fprintf(stream, " %s", fake_union ? "0" : min ? min : "1"); if (is_integer(max)) fprintf(stream, ":%s", max); fprintf(stream, ";\n"); fprintf(stream, "/// Pointer to array of XML.\n"); fprintf(stream, pointerformat, "_XML", aname(NULL, nameURI, name)); } else { fprintf(stream, "/// Vector of XML of length %s..%s.\n", min ? min : "1", max); if (with_union) fprintf(stream, pointertemplateformat, vname("$CONTAINER"), "_XML", aname(NULL, nameURI, name)); else fprintf(stream, templateformat, vname("$CONTAINER"), "_XML", aname(NULL, nameURI, name)); } } else fprintf(stream, elementformat, "_XML", aname(NULL, nameURI, name)); } else fprintf(stream, "/// Element has no name, type, or ref.\n"); if (!substok || ( !(element.elementPtr() && element.elementPtr()->abstract) && !(element.substitutionsPtr() && !element.substitutionsPtr()->empty()) && !(element.elementPtr() && element.elementPtr()->substitutionsPtr() && !element.elementPtr()->substitutionsPtr()->empty()) )) { if (!fake_union && !min && (default_ || fixed)) fprintf(stream, " 0"); else if (!fake_union && !min && !element.abstract) fprintf(stream, " 1"); else if (!fake_union && min) fprintf(stream, " %s", min); if (max && strcmp(max, "1") && is_integer(max)) fprintf(stream, ":%s", max); if (default_) { // determine whether the element can be assigned a default value, this is dependent on the choice of mapping for primitive types const char *value, *QName; value = default_; QName = default__; if (type) { const char *t = tname(NULL, typeURI ? typeURI : URI, type); if (!strncmp(t, "unsigned ", 9)) t += 9; else if (!strncmp(t, "xsd__unsigned", 13)) t += 13; else if (!strncmp(t, "xsd__", 5)) t += 5; if (!strcmp(t, "bool") || !strcmp(t, "byte") || !strcmp(t, "Byte") || !strcmp(t, "char") || !strcmp(t, "double") || !strcmp(t, "float") || !strcmp(t, "int") || !strcmp(t, "Int") || !strcmp(t, "long") || !strcmp(t, "Long") || !strcmp(t, "LONG64") || !strcmp(t, "short") || !strcmp(t, "Short") || !strcmp(t, "ULONG64")) fprintf(stream, " = %s", value); else if (!strncmp(t, "enum ", 5)) { const char *s; if (is_integer(value)) fprintf(stream, " = %s", value); else if (!*value) fprintf(stream, " = 0"); else if ((s = enames[Pair(t + 5, value)])) fprintf(stream, " = %s", s); } else if (!strncmp(t, "char", 4) || !strncmp(t, "const char", 10) || !strncmp(t, "wchar_t", 7) || !strncmp(t, "const wchar_t", 13) || !strncmp(t, "std::string", 11)) fprintf(stream, " = \"%s\"", cstring(value)); else if (!strcmp(t, "xsd__QName") && QName) // QName fprintf(stream, " = \"%s\"", cstring(QName)); } fprintf(stream, ";\t///< Default element value=\"%s\".\n", value); } else if (fixed) fprintf(stream, ";\t///< Fixed element value=\"%s\".\n", fixed); else if (nillable && (!min || !strcmp(min, "1")) && (!max || !strcmp(max, "1"))) fprintf(stream, ";\t///< Optional (xsi:nil when NULL) element.\n"); else if (!fake_union && (!min || !strcmp(min, "1")) && (!max || !strcmp(max, "1"))) fprintf(stream, ";\t///< Required element.\n"); else if (!fake_union && min && !strcmp(min, "0") && (!max || !strcmp(max, "1"))) fprintf(stream, ";\t///< Optional element.\n"); else fprintf(stream, ";\n"); } } void Types::gen(const char *URI, const vector& groups) { for (vector::const_iterator group = groups.begin(); group != groups.end(); ++group) gen(URI, *group, NULL, NULL); } void Types::gen(const char *URI, const xs__group& group, const char *minOccurs, const char *maxOccurs) { static set visited; const char *min = minOccurs; const char *max = maxOccurs; if (visited.find(&group) != visited.end()) { if (group.ref) fprintf(stderr, "\nWarning: circular group \n", group.ref); else fprintf(stderr, "\nWarning: circular group \n", group.name ? group.name : ""); fprintf(stream, "/// @todo !FIXME! @warning %s is a group with a circular reference.\n", group.ref ? group.ref : group.name ? group.name : ""); return; } visited.insert(&group); if (group.minOccurs) min = group.minOccurs; if (group.maxOccurs) max = group.maxOccurs; if (group.groupPtr()) { gen(URI, *group.groupPtr(), min, max); } else { fprintf(stream, "// BEGIN GROUP \n"); document(group.annotation); if (group.all) gen(URI, *group.all, min, max); else if (group.choice) gen(URI, NULL, *group.choice, min, max); else if (group.sequence) gen(URI, *group.sequence, min, max); fprintf(stream, "// END OF GROUP\n"); } visited.erase(&group); } void Types::gen(const char *URI, const char *name, const xs__seqchoice& choice, const char *minOccurs, const char *maxOccurs) { const char *r = NULL, *s = NULL, *t = NULL; const char *min = minOccurs; const char *max = maxOccurs; bool use_union = !uflag; bool wrap_union = false; bool tmp_union; if (!URI && choice.schemaPtr()) URI = choice.schemaPtr()->targetNamespace; fprintf(stream, "// BEGIN CHOICE \n"); document(choice.annotation); for (vector::const_iterator c1 = choice.__contents.begin(); c1 != choice.__contents.end(); ++c1) { if ((*c1).__union == SOAP_UNION_xs__union_content_group || (*c1).__union == SOAP_UNION_xs__union_content_sequence) { fprintf(stream, "/// @note with embedded or prevents the use of a union for . Instead of being members of a union, the following members are declared optional. Only one member should be non-NULL by choice.\n"); use_union = false; break; } } if (use_union && (cflag || sflag)) { for (vector::const_iterator c2 = choice.__contents.begin(); c2 != choice.__contents.end(); ++c2) { if ((*c2).__union == SOAP_UNION_xs__union_content_element && (*c2).__content.element && (*c2).__content.element->maxOccurs && strcmp((*c2).__content.element->maxOccurs, "1")) { fprintf(stream, "/// @note with one ore more elements with maxOccurs>1 (%s) prevents the use of a union. Instead of being members of a union, the following members are declared optional. Only one member should be non-NULL by choice.\n", (*c2).__content.element->name ? (*c2).__content.element->name : ""); use_union = false; break; } } } t = uname(URI); s = strstr(t, "__union"); #if 0 // Alternative name for choice selector (old style): r = aname(NULL, NULL, name); #else if (s) r = s + 7; if (!r || !*r) { if (strncmp(t, "union", 5) == 0) { r = t + 5; s = r; } else { r = t; s = t; } } #endif if (max && strcmp(max, "1")) { if (with_union) { // Generate a wrapper when we need a union within a union wrap_union = true; fprintf(stream, " struct __%s\n {\n", t); } fprintf(stream, sizeformat, "int", r); fprintf(stream, " %s", min ? min : "0"); if (is_integer(max)) fprintf(stream, ":%s", max); fprintf(stream, ";\n"); if (cflag) fprintf(stream, " struct _%s\n {\n", t); else fprintf(stream, " class _%s\n {\n", t); } if (use_union) { if (!with_union || wrap_union) { fprintf(stream, choiceformat, "int", r); if (min) fprintf(stream, " %s", min); fprintf(stream, ";\t///< Union %s selector: set to SOAP_UNION_%s_%s\n", t, t, min && !strcmp(min, "0") ? " or 0 to omit" : ""); if (name) fprintf(stream, "/// Union for choice in %s.\n", cname(NULL, URI, name)); fprintf(stream, " union %s\n {\n", t); } tmp_union = with_union; with_union = true; } else { tmp_union = fake_union; fake_union = true; } gen(URI, choice.__contents); if (use_union) { with_union = tmp_union; if (!with_union || wrap_union) { fprintf(stream, elementformat, "}", s[0] == '_' && s[1] == '_' ? s+2 : s); fprintf(stream, ";\n"); } } else fake_union = tmp_union; if (max && strcmp(max, "1")) { fprintf(stream, pointerformat, "}", s); fprintf(stream, ";\n"); } if (wrap_union) { fprintf(stream, elementformat, "}", s); fprintf(stream, ";\n"); } fprintf(stream, "// END OF CHOICE\n"); } void Types::gen(const char *URI, const vector& anys) { for (vector::const_iterator any = anys.begin(); any != anys.end(); ++any) gen(URI, *any, NULL, NULL); } void Types::gen(const char *URI, const xs__any& any, const char *minOccurs, const char *maxOccurs) { const char *min = minOccurs; const char *max = maxOccurs; (void)URI; fprintf(stream, "/// @todo \n/// @todo Schema extensibility is user-definable.\n/// Consult the protocol documentation to change or insert declarations.\n/// Use wsdl2h option -x to remove this element.\n/// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element):\n/// wsdl2h maps xsd:any to xsd__anyType, use typemap.dat to remap.\n"); if (!xflag) { if (max && strcmp(max, "1")) { fprintf(stream, "/// Size of the array of XML or DOM nodes is %s..%s.\n", min ? min : "1", max); if (cflag || sflag) { if (!with_union) { fprintf(stream, sizeformat, "int", ""); fprintf(stream, "0;\n"); fprintf(stream, elementformat, pname(true, false, NULL, NULL, "xsd:any"), "__any"); } else fprintf(stream, elementformat, tname(NULL, NULL, "xsd:any"), "__any"); } else if (with_union) fprintf(stream, pointertemplateformat, vname("$CONTAINER"), tname(NULL, NULL, "xsd:any"), "__any"); else fprintf(stream, templateformat, vname("$CONTAINER"), tname(NULL, NULL, "xsd:any"), "__any"); } else fprintf(stream, elementformat, pname(with_union, false, NULL, NULL, "xsd:any"), "__any"); if (dflag) fprintf(stream, "0;\t///< Catch any element content in DOM.\n"); else fprintf(stream, "0;\t///< Catch any element content in XML string.\n"); } } void Types::gen(const char *URI, const xs__anyAttribute& anyAttribute) { (void)URI; if (anyAttribute.namespace_) fprintf(stream, "/// @todo .\n", anyAttribute.namespace_); fprintf(stream, "/// @todo Schema extensibility is user-definable.\n/// Consult the protocol documentation to change or insert declarations.\n/// Use wsdl2h option -x to remove this attribute.\n/// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute).\n"); if (!xflag) { const char *t = tname(NULL, NULL, "xsd:anyAttribute"); fprintf(stream, attributeformat, t, "__anyAttribute"); if (dflag) fprintf(stream, ";\t///< Store anyAttribute content in DOM soap_dom_attribute linked node structure.\n"); else fprintf(stream, ";\t///< A placeholder that has no effect: please see comment.\n"); } } void Types::gen_inh(const char *URI, const xs__complexType *complexType, bool anonymous) { const xs__complexType *p = complexType; if (!p) return; const char *pURI; if (p->schemaPtr()) pURI = p->schemaPtr()->targetNamespace; else pURI = URI; const char *b = cname(NULL, pURI, p->name); if (p->complexContent && p->complexContent->extension) gen_inh(URI, p->complexContent->extension->complexTypePtr(), anonymous); if (cflag || fflag || anonymous) fprintf(stream, "/// INHERITED FROM %s:\n", b); else if (comment_nest == 0) fprintf(stream, "/* INHERITED FROM %s:\n", b); else fprintf(stream, " INHERITED FROM %s:\n", b); comment_nest++; if (cflag || fflag) pURI = URI; // if base ns != derived ns then qualify elts and atts if (p->complexContent && p->complexContent->extension) { if (p->complexContent->extension->group) gen(pURI, *p->complexContent->extension->group, NULL, NULL); if (p->complexContent->extension->all) gen(pURI, *p->complexContent->extension->all, NULL, NULL); if (p->complexContent->extension->sequence) gen(pURI, *p->complexContent->extension->sequence, NULL, NULL); if (p->complexContent->extension->choice) gen(pURI, p->name, *p->complexContent->extension->choice, NULL, NULL); gen(pURI, p->complexContent->extension->attribute); gen(pURI, p->complexContent->extension->attributeGroup); if (p->complexContent->extension->anyAttribute) gen(pURI, *p->complexContent->extension->anyAttribute); } else { if (p->all) gen(pURI, p->all->element, NULL, NULL); else if (p->all) gen(pURI, *p->all, NULL, NULL); else if (p->choice) gen(pURI, p->name, *p->choice, NULL, NULL); else if (p->sequence) gen(pURI, *p->sequence, NULL, NULL); else if (p->any) gen(pURI, *p->any, NULL, NULL); if (p->defaultAttributesApply && p->schemaPtr() && p->schemaPtr()->attributeGroupPtr()) { xs__attributeGroup *a = p->schemaPtr()->attributeGroupPtr(); if (a->attributeGroupPtr()) a = a->attributeGroupPtr(); gen(pURI, a->attribute); gen(pURI, a->attributeGroup); if (a->anyAttribute) gen(pURI, *a->anyAttribute); } gen(pURI, p->attribute); gen(pURI, p->attributeGroup); if (p->anyAttribute) gen(pURI, *p->anyAttribute); } modify(b); comment_nest--; if (cflag || fflag || anonymous) fprintf(stream, "// END OF INHERITED FROM %s\n", b); else if (comment_nest == 0) fprintf(stream, " END OF INHERITED FROM %s */\n", b); else fprintf(stream, " END OF INHERITED FROM %s\n", b); } void Types::gen_soap_array(const char *t, const char *item, const char *type) { char *tmp = NULL, *dims = NULL, size[24]; if (type) tmp = (char*)estrdup(type); *size = '\0'; if (tmp) dims = strrchr(tmp, '['); if (dims) *dims++ = '\0'; fprintf(stream, "/// SOAP encoded array of %s.\n", tmp ? tmp : "xs:anyType"); if (cflag) fprintf(stream, "struct %s\n{\n", t); else if (pflag && *t) fprintf(stream, "class %s : public xsd__anyType\n{ public:\n", t); else fprintf(stream, "class %s\n{ public:\n", t); if (dims) { char *s = strchr(dims, ']'); if (s && s != dims) (SOAP_SNPRINTF(size, 24, 23), "[%d]", (int)(s - dims + 1)); } if (tmp) { if (strchr(tmp, '[') != NULL) { size_t l = strlen(t); if (!strncmp(t, "ArrayOf", 7) && l > 7) gen_soap_array(t + 7, item, tmp); else if (!strncmp(t, "Array", 5) && l > 5) gen_soap_array(t + 5, item, tmp); else gen_soap_array("", item, tmp); fprintf(stream, arrayformat, "}", item ? aname(NULL, NULL, item) : ""); fprintf(stream, ";\n"); } else { const char *s = tname(NULL, NULL, tmp); fprintf(stream, "/// Pointer to array of %s.\n", s); fprintf(stream, arrayformat, s, item ? aname(NULL, NULL, item) : ""); fprintf(stream, ";\n"); } if (*size) fprintf(stream, "/// Size of the multidimensional dynamic array with dimensions=%s.\n", size); else fprintf(stream, "/// Size of the dynamic array.\n"); fprintf(stream, arraysizeformat, "int", size); fprintf(stream, ";\n/// Offset for partially transmitted arrays (uncomment only when required).\n"); fprintf(stream, arrayoffsetformat, "int", size); fprintf(stream, ";\n"); } else { // TODO: how to handle generic SOAP array? E.g. as an array of anyType? fprintf(stream, "// @todo Add declarations to handle generic SOAP-ENC:Array (array of anyType)\n"); } } void Types::gen_substitutions(const char *URI, const xs__element& element) { const std::vector *substitutions; const char *name; const char *r = NULL, *s = NULL, *t = NULL; bool use_union = !uflag; bool wrap_union = false; bool tmp_union; bool abstract = false; if (!URI && element.schemaPtr()) URI = element.schemaPtr()->targetNamespace; if (element.elementPtr()) { name = element.elementPtr()->name; substitutions = element.elementPtr()->substitutionsPtr(); abstract = element.elementPtr()->abstract; if (!abstract && element.elementPtr()->complexTypePtr()) abstract = element.elementPtr()->complexTypePtr()->abstract; } else { name = element.name; substitutions = element.substitutionsPtr(); abstract = element.abstract; if (!abstract && element.complexTypePtr()) abstract = element.complexTypePtr()->abstract; } fprintf(stream, "// BEGIN CHOICE OF SUBSTITUTIONS with global elements"); for (std::vector::const_iterator i1 = substitutions->begin(); i1 != substitutions->end(); ++i1) fprintf(stream, " <%s>", (*i1)->name); fprintf(stream, "\n"); t = uname(URI); s = strstr(t, "__union"); r = aname(NULL, NULL, name); if (element.maxOccurs && strcmp(element.maxOccurs, "1")) { if (with_union) { // Generate a wrapper when we need a union within a union wrap_union = true; fprintf(stream, " struct __%s\n {\n", t); } fprintf(stream, sizeformat, "int", r); fprintf(stream, " %s", element.minOccurs ? element.minOccurs : "0"); if (is_integer(element.maxOccurs)) fprintf(stream, ":%s", element.maxOccurs); fprintf(stream, ";\n"); if (cflag) fprintf(stream, " struct _%s\n {\n", t); else fprintf(stream, " class _%s\n {\n", t); } if (use_union) { if (!with_union || wrap_union) { fprintf(stream, choiceformat, "int", r); if (element.minOccurs) fprintf(stream, " %s", element.minOccurs); fprintf(stream, ";\t///< Union %s selector: set to SOAP_UNION_%s_%s\n", t, t, element.minOccurs && !strcmp(element.minOccurs, "0") ? " or 0 to omit" : ""); if (name) fprintf(stream, "/// Union for substitutionGroup %s.\n", cname(NULL, URI, name)); fprintf(stream, " union %s\n {\n", t); } tmp_union = with_union; with_union = true; } else { tmp_union = fake_union; fake_union = true; } if (!abstract) gen(URI, element, false, NULL, NULL); for (vector::const_iterator i2 = substitutions->begin(); i2 != substitutions->end(); ++i2) gen(URI, *(*i2), true, NULL, NULL); // substitutions can be recursive? if (use_union) { with_union = tmp_union; if (!with_union || wrap_union) { fprintf(stream, elementformat, "}", s[0] == '_' && s[1] == '_' ? s+2 : s); fprintf(stream, ";\n"); } } else fake_union = tmp_union; if (element.maxOccurs && strcmp(element.maxOccurs, "1")) { fprintf(stream, pointerformat, "}", s); fprintf(stream, ";\n"); } if (wrap_union) { fprintf(stream, elementformat, "}", s); fprintf(stream, ";\n"); } fprintf(stream, "// END OF SUBSTITUTIONS\n"); } void Types::document(const xs__annotation *annotation) { if (annotation && annotation->documentation) documentation(annotation->documentation); } void Types::modify(const char *name) { // TODO: consider support removal of elements/attributes with ns__X = $- Y const char *s = modtypemap[name]; if (s) { while (*s) { if (*s++ == '$') fprintf(stream, "/// Member declared in %s\n ", mapfile); s = format(s); } } } const char* Types::format(const char *text) { const char *s = text; if (!s) return NULL; while (*s && *s != '$') { if (*s == '\\') { switch (s[1]) { case 'n': fputc('\n', stream); break; case 't': fputc('\t', stream); break; default: fputc(s[1], stream); } s++; } else fputc(*s, stream); s++; } fputc('\n', stream); return s; } //////////////////////////////////////////////////////////////////////////////// // // Type map file parsing // //////////////////////////////////////////////////////////////////////////////// static char *getline(char *s, size_t n, FILE *fd) { int c; char *t = s; if (n) n--; for (;;) { c = fgetc(fd); if (c == '\r') continue; if (c == '\\') { c = fgetc(fd); if (c == '\r') c = fgetc(fd); if (c < ' ') continue; if (n) { *t++ = '\\'; n--; } } if (c == '\n' || c == EOF) break; if (n) { *t++ = c; n--; } } *t++ = '\0'; if (!*s && c == EOF) return NULL; return s; } static const char *nonblank(const char *s) { while (*s && isspace(*s)) s++; return s; } static const char *fill(char *t, int n, const char *s, int e) { int i = n; s = nonblank(s); while (*s && *s != e && --i) *t++ = *s++; while (*s && *s != e) s++; if (*s) s++; i = n - i; if (i == 0) *t = '\0'; else { while (isspace(*--t) && i--) ; t[1] = '\0'; } return s; } //////////////////////////////////////////////////////////////////////////////// // // Miscellaneous // //////////////////////////////////////////////////////////////////////////////// static const char *utf8(char **t, const char *s, bool start) { unsigned int c = 0; unsigned int c1, c2, c3, c4; const char *r = s; c = (unsigned char)*r; if (c >= 0x80) { c1 = (unsigned char)*++r; if (c1 < 0x80) r--; else { c1 &= 0x3F; if (c < 0xE0) c = ((c & 0x1F) << 6) | c1; else { c2 = (unsigned char)*++r & 0x3F; if (c < 0xF0) c = ((c & 0x0F) << 12) | (c1 << 6) | c2; else { c3 = (unsigned char)*++r & 0x3F; if (c < 0xF8) c = ((c & 0x07) << 18) | (c1 << 12) | (c2 << 6) | c3; else { c4 = (unsigned char)*++r & 0x3F; if (c < 0xFC) c = ((c & 0x03) << 24) | (c1 << 18) | (c2 << 12) | (c3 << 6) | c4; else c = ((c & 0x01) << 30) | (c1 << 24) | (c2 << 18) | (c3 << 12) | (c4 << 6) | (*++r & 0x3F); } } } } } if (Uflag && // Universal character names for identifier characters // E.1 Ranges of characters allowed ( c == 0x00A8 || c == 0x00AA || c == 0x00AD || c == 0x00AF || (0x00B2 <= c && c <= 0x00B5) || (0x00B7 <= c && c <= 0x00BA) || (0x00BC <= c && c <= 0x00BE) || (0x00C0 <= c && c <= 0x00D6) || (0x00D8 <= c && c <= 0x00F6) || (0x00F8 <= c && c <= 0x00FF) || (0x0100 <= c && c <= 0x167F) || (0x1681 <= c && c <= 0x180D) || (0x180F <= c && c <= 0x1FFF) || (0x200B <= c && c <= 0x200D) || (0x202A <= c && c <= 0x202E) || (0x203F <= c && c <= 0x2040) || c == 0x2054 || (0x2060 <= c && c <= 0x206F) || (0x2070 <= c && c <= 0x218F) || (0x2460 <= c && c <= 0x24FF) || (0x2776 <= c && c <= 0x2793) || (0x2C00 <= c && c <= 0x2DFF) || (0x2E80 <= c && c <= 0x2FFF) || (0x3004 <= c && c <= 0x3007) || (0x3021 <= c && c <= 0x302F) || (0x3031 <= c && c <= 0x303F) || (0x3040 <= c && c <= 0xD7FF) || (0xF900 <= c && c <= 0xFD3D) || (0xFD40 <= c && c <= 0xFDCF) || (0xFDF0 <= c && c <= 0xFE44) || (0xFE47 <= c && c <= 0xFFFD) || (0x10000 <= c && c <= 0x1FFFD) || (0x20000 <= c && c <= 0x2FFFD) || (0x30000 <= c && c <= 0x3FFFD) || (0x40000 <= c && c <= 0x4FFFD) || (0x50000 <= c && c <= 0x5FFFD) || (0x60000 <= c && c <= 0x6FFFD) || (0x70000 <= c && c <= 0x7FFFD) || (0x80000 <= c && c <= 0x8FFFD) || (0x90000 <= c && c <= 0x9FFFD) || (0xA0000 <= c && c <= 0xAFFFD) || (0xB0000 <= c && c <= 0xBFFFD) || (0xC0000 <= c && c <= 0xCFFFD) || (0xD0000 <= c && c <= 0xDFFFD) || (0xE0000 <= c && c <= 0xEFFFD) ) && // E.2 Ranges of characters disallowed initially !(start && ( (0x0300 <= c && c <= 0x036F) || (0x1DC0 <= c && c <= 0x1DFF) || (0x20D0 <= c && c <= 0x20FF) || (0xFE20 <= c && c <= 0xFE2F) ) ) ) { soap_strncpy(*t, 7, s, r - s + 1); *t += r - s + 1; } else { // encode up to UCS4 only if (c > 0xFFFF) c = 0xFFFF; (SOAP_SNPRINTF(*t, 7, 6), "_x%4.4x", c); *t += 6; } return r; } static const char *cstring(const char *s) { size_t n; char *t; const char *r; for (n = 0, r = s; *r; n++, r++) if (*r == '"' || *r == '\\') n++; else if (*r < 32) n += 3; r = t = (char*)emalloc(n + 1); for (; *s; s++) { if (*s == '"' || *s == '\\') { *t++ = '\\'; *t++ = *s; } else if (*s < 32) { (SOAP_SNPRINTF(t, 5, 4), "\\%03o", (unsigned int)(unsigned char)*s); t += 4; } else *t++ = *s; } *t = '\0'; return r; } static const char *xstring(const char *s) { size_t n; char *t; const char *r; for (n = 0, r = s; *r; n++, r++) { if (*r < 32 || *r >= 127) n += 4; else if (*r == '<' || *r == '>') n += 3; else if (*r == '&') n += 4; else if (*r == '"') n += 5; else if (*r == '\\') n += 1; } r = t = (char*)emalloc(n + 1); for (; *s; s++) { if (*s < 32 || *s >= 127) { (SOAP_SNPRINTF(t, 5, 4), "&#%.2x;", (unsigned char)*s); t += 5; } else if (*s == '<') { soap_strcpy(t, 5, "<"); t += 4; } else if (*s == '>') { soap_strcpy(t, 5, ">"); t += 4; } else if (*s == '&') { soap_strcpy(t, 6, "&"); t += 5; } else if (*s == '"') { soap_strcpy(t, 7, """); t += 6; } else if (*s == '\\') { soap_strcpy(t, 3, "\\\\"); t += 2; } else *t++ = *s; } *t = '\0'; return r; } static bool is_float(const char *s) { if (*s == '-' || *s == '+') s++; if (!*s || strlen(s) > 20) return false; while (*s && isdigit(*s)) s++; if (*s == '.') s++; while (*s && isdigit(*s)) s++; if (*s == 'e' || *s == 'E') { s++; if (*s == '-' || *s == '+') s++; while (*s && isdigit(*s)) s++; } return *s == '\0'; } static bool is_integer(const char *s) { if (*s == '-' || *s == '+') s++; if (!*s || strlen(s) > 20) return false; while (*s && isdigit(*s)) s++; return *s == '\0'; } static LONG64 to_integer(const char *s) { char *r; return soap_strtoll(s, &r, 10); } static void documentation(const char *text) { const char *s = text; const char *sep = "///
\n/// "; if (!s) return; while (*s) { switch (*s) { case '\n': if (!sep) sep = "\n/// "; break; case '\t': case ' ': if (!sep) sep = " "; break; default: if (*s > 32) { if (sep) { fputs(sep, stream); sep = NULL; } fputc(*s, stream); } } s++; } fprintf(stream, "\n///
\n"); } static void operations(const char *t) { if (cflag) fprintf(stream, "/// struct %s operations:\n/// - soap_default_%s(soap*, %s*) reset members to default\n/// - int soap_read_%s(soap*, %s*) deserialize from a source\n/// - int soap_write_%s(soap*, %s*) serialize to a sink\n/// - %s* soap_dup_%s(soap*, %s* dst, %s *src) returns deep copy of %s src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec)\n/// - soap_del_%s(%s*) deep deletes %s data members, use only on dst after soap_dup_%s(NULL, %s *dst, %s *src) (use soapcpp2 -Ed)\n", t, t, t, t, t, t, t, t, t, t, t, t, t, t, t, t, t, t); else fprintf(stream, "/// class %s operations:\n/// - %s* soap_new_%s(soap*) allocate\n/// - %s* soap_new_%s(soap*, int num) allocate array\n/// - %s* soap_new_req_%s(soap*, ...) allocate, set required members\n/// - %s* soap_new_set_%s(soap*, ...) allocate, set all public members\n/// - %s::soap_default(soap*) reset members to default\n/// - int soap_read_%s(soap*, %s*) deserialize from a stream\n/// - int soap_write_%s(soap*, %s*) serialize to a stream\n/// - %s* %s::soap_dup(soap*) returns deep copy of %s, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec)\n/// - %s::soap_del() deep deletes %s data members, use only after %s::soap_dup(NULL) (use soapcpp2 -Ed)\n", t, t, t, t, t, t, t, t, t, t, t, t, t, t, t, t, t, t, t, t); } //////////////////////////////////////////////////////////////////////////////// // // Allocation // //////////////////////////////////////////////////////////////////////////////// void *emalloc(size_t size) { void *p = malloc(size); if (!p) { fprintf(stderr, "\nError: Malloc failed\n"); exit(1); } return p; } char *estrdup(const char *s) { size_t l = strlen(s); char *t = (char*)emalloc(l + 1); soap_strcpy(t, l + 1, s); return t; } char *estrdupf(const char *s) { char *t = (char*)emalloc(strlen(s) + 1); char *p; for (p = t; *s; s++) { if (s[0] == '/' && s[1] == '*') { for (s += 2; s[0] && s[1]; s++) { if (s[0] == '*' && s[1] == '/') { s++; break; } } continue; } *p++ = *s; } *p = '\0'; return t; } gsoap-2.8.28/gsoap/VisualStudio2005/wsdl2h/wsdl2h/Release/0000755000175000017500000000000012653650160022331 5ustar ellertellertgsoap-2.8.28/gsoap/VisualStudio2005/wsdl2h/wsdl2h/types.h0000644000175000017500000001372612653650160022277 0ustar ellertellert/* types.h WSDL parser and converter to gSOAP header file format -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2012, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #ifndef TYPES_H #define TYPES_H #include "includes.h" #include "wsdlH.h" enum Type { NONE, CLASS, ENUM, STRUCT, TYPEDEF }; enum Lookup { NOLOOKUP, LOOKUP }; class Types { public: SetOfString knames; // keywords, reserved words, class names, and typedefs MapOfStringToString modtypemap; MapOfStringToString deftypemap; MapOfStringToString usetypemap; MapOfStringToString ptrtypemap; MapOfStringToString smptypemap; MapOfPairToString qnames; // (URI,name) -> name MapOfStringToString uris; // URI -> prefix MapOfStringToNum syms; // prefix -> count (ns1, ns2, ...) SetOfString rnames; // reserved symbolic names to avoid clashes SetOfString onames; // service operator names MapOfPairToString enames; // enum symbolic names VectorOfString scope; // de-anonymizer stack int snum; // struct name index, TODO: consider map of URI to count per URI int unum; // union name index, TODO: consider map of URI to count per URI int gnum; // enum name index, TODO: consider map of URI to count per URI bool with_union; bool fake_union; Types(); void init(); int read(const char *file); private: const char *fname(const char *prefix, const char *URI, const char *qname, SetOfString *reserved, enum Lookup lookup, bool isqname); public: const char *aname(const char *prefix, const char *URI, const char *qname); const char *wname(const char *prefix, const char *URI, const char *qname); const char *cname(const char *prefix, const char *URI, const char *qname); const char *tname(const char *prefix, const char *URI, const char *qname); const char *tnameptr(bool, const char *prefix, const char *URI, const char *qname); const char *tnamenoptr(const char *prefix, const char *URI, const char *qname); const char *pname(bool flag, bool smart, const char *prefix, const char *URI, const char *qname); const char *oname(const char *prefix, const char *URI, const char *qname); const char *ename(const char *type, const char *value, bool isqname); const char *sname(const char *URI, const char *name); const char *gname(const char *URI, const char *name); const char *uname(const char *URI); const char *vname(const char *var); const char *nsprefix(const char *prefix, const char *URI); const char *prefix(const char *name); const char *uri(const char *name); const char *deftname(enum Type type, bool mk_pointer, bool is_pointer, const char *prefix, const char *URI, const char *qname); bool is_defined(const char *prefix, const char *URI, const char *qname); bool is_nillable(const xs__element& element); bool is_choicetype(const char *prefix, const char *URI, const char *type); bool is_ptr(const char *prefix, const char *URI, const char *type); void dump(FILE*); void define(const char *URI, const char *name, const xs__complexType&); void gen(const char *URI, const vector&); void gen(const char *URI, const vector&); void gen(const char *URI, const vector&); void gen(const char *URI, const vector&, const char *minOccurs, const char *maxOccurs); void gen(const char *URI, const vector&); void gen(const char *URI, const vector&); void gen(const char *URI, const vector&); void gen(const char *URI, const char *name, const xs__simpleType&, bool anonymous, bool nested_restriction); void gen(const char *URI, const char *name, const xs__complexType&, bool anonymous); void gen(const char *URI, const xs__attribute&); void gen(const char *URI, const xs__all&, const char *minOccurs, const char *maxOccurs); void gen(const char *URI, const xs__seqchoice&, const char *minOccurs, const char *maxOccurs); void gen(const char *URI, const char *name, const xs__seqchoice&, const char *minOccurs, const char *maxOccurs); void gen(const char *URI, const xs__element&, bool substok, const char *minOccurs, const char *maxOccurs); void gen(const char *URI, const xs__group&, const char *minOccurs, const char *maxOccurs); void gen(const char *URI, const xs__any&, const char *minOccurs, const char *maxOccurs); void gen(const char *URI, const xs__anyAttribute&); void gen_inh(const char *URI, const xs__complexType *complexType, bool anonymous); void gen_soap_array(const char *t, const char *item, const char *type); void gen_substitutions(const char *URI, const xs__element &element); void document(const xs__annotation*); void modify(const char *name); const char *format(const char *text); }; #endif gsoap-2.8.28/gsoap/VisualStudio2005/wsdl2h/wsdl2h/wsam.h0000644000175000017500000000417212653650160022075 0ustar ellertellert/* wsam.h WS-Addressing and WS-Addressing Metadata -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2010, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap wsa schema documentation: WS-Addressing //gsoap wsa schema namespace: http://www.w3.org/2005/08/addressing //gsoap wsa schema elementForm: qualified //gsoap wsa schema attributeForm: unqualified //gsoap wsam schema documentation: WS-Addressing Metadata //gsoap wsam schema namespace: http://www.w3.org/2007/05/addressing/metadata //gsoap wsam schema elementForm: qualified //gsoap wsam schema attributeForm: unqualified //gsoap wsaw schema documentation: WS-Addressing WSDL //gsoap wsaw schema namespace: http://www.w3.org/2006/05/addressing/wsdl //gsoap wsaw schema elementForm: qualified //gsoap wsaw schema attributeForm: unqualified class wsa__EndpointReferenceType { public: xsd__anyURI Address; _XML __any; }; gsoap-2.8.28/gsoap/VisualStudio2005/wsdl2h/wsdl2h/wsu.h0000644000175000017500000000320112653650160021734 0ustar ellertellert/* wsu.h WS-Utility (namespace only) -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap wsu schema documentation: WS-Utility //gsoap wsu schema namespace: http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd //gsoap wsu schema elementForm: qualified //gsoap wsu schema attributeForm: unqualified gsoap-2.8.28/gsoap/VisualStudio2005/wsdl2h/wsdl2h/Debug/0000755000175000017500000000000012653650160021777 5ustar ellertellertgsoap-2.8.28/gsoap/VisualStudio2005/wsdl2h/wsdl2h/soap.cpp0000644000175000017500000002177612653650160022434 0ustar ellertellert/* soap.cpp WSDL/SOAP binding schema -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "wsdlH.h" // cannot include "schemaH.h" #include "includes.h" extern const char *qname_token(const char*, const char*); extern int is_builtin_qname(const char*); //////////////////////////////////////////////////////////////////////////////// // // soap:header // //////////////////////////////////////////////////////////////////////////////// int soap__header::traverse(wsdl__definitions& definitions) { if (vflag) cerr << " Analyzing soap header in wsdl namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << endl; messageRef = NULL; partRef = NULL; const char *token = qname_token(message, definitions.targetNamespace); if (token) { for (vector::iterator message = definitions.message.begin(); message != definitions.message.end(); ++message) { if ((*message).name && !strcmp((*message).name, token)) { messageRef = &(*message); if (vflag) cerr << " Found soap header part '" << (part?part:"") << "' message '" << (token?token:"") << "'" << endl; break; } } } if (!messageRef) { for (vector::iterator import = definitions.import.begin(); import != definitions.import.end(); ++import) { wsdl__definitions *importdefinitions = (*import).definitionsPtr(); if (importdefinitions) { token = qname_token(message, importdefinitions->targetNamespace); if (token) { for (vector::iterator message = importdefinitions->message.begin(); message != importdefinitions->message.end(); ++message) { if ((*message).name && !strcmp((*message).name, token)) { messageRef = &(*message); if (vflag) cerr << " Found soap header part '" << (part?part:"") << "' message '" << (token?token:"") << "'" << endl; break; } } } } } } if (messageRef) { if (part) { for (vector::iterator pt = messageRef->part.begin(); pt != messageRef->part.end(); ++pt) if ((*pt).name && !strcmp((*pt).name, part)) { partRef = &(*pt); break; } } if (!partRef) cerr << "Warning: soap header has no matching part in message '" << (message?message:"") << "' in wsdl definitions '" << definitions.name << "' namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << endl; } else cerr << "Warning: could not find soap header part '" << (part?part:"") << "' message '" << (message?message:"") << "' in wsdl definitions '" << definitions.name << "' namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << endl; for (vector::iterator i = headerfault.begin(); i != headerfault.end(); ++i) (*i).traverse(definitions); return SOAP_OK; } void soap__header::messagePtr(wsdl__message *message) { messageRef = message; } wsdl__message *soap__header::messagePtr() const { return messageRef; } void soap__header::partPtr(wsdl__part *part) { partRef = part; } wsdl__part *soap__header::partPtr() const { return partRef; } //////////////////////////////////////////////////////////////////////////////// // // soap:headerfault // //////////////////////////////////////////////////////////////////////////////// int soap__headerfault::traverse(wsdl__definitions& definitions) { if (vflag) cerr << " Analyzing soap headerfault in wsdl namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << endl; messageRef = NULL; partRef = NULL; const char *token = qname_token(message, definitions.targetNamespace); if (token) { for (vector::iterator message = definitions.message.begin(); message != definitions.message.end(); ++message) { if ((*message).name && !strcmp((*message).name, token)) { messageRef = &(*message); if (vflag) cerr << " Found soap headerfault part '" << (part?part:"") << "' message '" << (token?token:"") << "'" << endl; break; } } } else { for (vector::iterator import = definitions.import.begin(); import != definitions.import.end(); ++import) { wsdl__definitions *importdefinitions = (*import).definitionsPtr(); if (importdefinitions) { token = qname_token(message, importdefinitions->targetNamespace); if (token) { for (vector::iterator message = importdefinitions->message.begin(); message != importdefinitions->message.end(); ++message) { if ((*message).name && !strcmp((*message).name, token)) { messageRef = &(*message); if (vflag) cerr << " Found soap headerfault part '" << (part?part:"") << "' message '" << (token?token:"") << "'" << endl; break; } } } } } } if (messageRef) { if (part) { for (vector::iterator pt = messageRef->part.begin(); pt != messageRef->part.end(); ++pt) if ((*pt).name && !strcmp((*pt).name, part)) { partRef = &(*pt); break; } } if (!partRef) cerr << "Warning: soap headerfault has no matching part in message '" << (message?message:"") << "' in wsdl definitions '" << definitions.name << "' namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << endl; } else cerr << "Warning: could not find soap headerfault part '" << (part?part:"") << "' message '" << (message?message:"") << "' in wSDL definitions '" << definitions.name << "' namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << endl; return SOAP_OK; } void soap__headerfault::messagePtr(wsdl__message *message) { messageRef = message; } wsdl__message *soap__headerfault::messagePtr() const { return messageRef; } void soap__headerfault::partPtr(wsdl__part *part) { partRef = part; } wsdl__part *soap__headerfault::partPtr() const { return partRef; } //////////////////////////////////////////////////////////////////////////////// // // wsoap:header // //////////////////////////////////////////////////////////////////////////////// int wsoap__header::traverse(wsdl__definitions& definitions) { if (vflag) cerr << " Analyzing soap header in wsdl namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << endl; elementRef = NULL; // WSDL 2.0 if (element) { if (definitions.types) { for (vector::iterator schema = definitions.types->xs__schema_.begin(); schema != definitions.types->xs__schema_.end(); ++schema) { const char *token = qname_token(element, (*schema)->targetNamespace); if (token) { for (vector::iterator element = (*schema)->element.begin(); element != (*schema)->element.end(); ++element) { if ((*element).name && !strcmp((*element).name, token)) { elementRef = &(*element); if (vflag) cerr << " Found soap header element '" << (token?token:"") << "'" << endl; break; } } } } } if (!elementRef) { if (is_builtin_qname(element)) definitions.builtinElement(element); else if (!Wflag) cerr << "Warning: no soap header element '" << element << "' in wsdl definitions '" << (definitions.name?definitions.name:"") << "' namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << endl; } } return SOAP_OK; } void wsoap__header::elementPtr(xs__element *element) { elementRef = element; } xs__element *wsoap__header::elementPtr() const { return elementRef; } gsoap-2.8.28/gsoap/VisualStudio2005/wsdl2h/wsdl2h/service.h0000644000175000017500000001064712653650160022572 0ustar ellertellert/* service.h Service structures -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2014, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #ifndef SERVICE_H #define SERVICE_H #include "includes.h" #include "wsdlH.h" class Message { public: wsdl__message *message; const char *name; const char *URI; soap__styleChoice style; soap__useChoice use; const char *encodingStyle; const char *action; xs__element *element; const char *body_parts; wsdl__part *part; bool mustUnderstand; vector header; vector wheader; mime__multipartRelated *multipartRelated; // MIME mime__content *content; // REST/MIME const char *layout; // DIME const char *documentation; const char *ext_documentation; vector policy; void generate(Types&, const char *sep, bool anonymous, bool remark, bool response, bool optional); }; typedef map MapOfStringToMessage; class Operation { public: const wsdl__operation *operation; const char *prefix; const char *URI; const char *name; const char *mep; // WSDL 2.0 const char *protocol; soap__styleChoice style; const char *parameterOrder; const char *action; const char *input_name; const char *output_name; Message *input; // name, use, and parts Message *output; // name, use, and parts vector infault; vector outfault; const char *documentation; const char *operation_documentation; vector policy; void generate(Types&, Service&); }; class Service { public: const char *prefix; // a gSOAP service has a unique namespace const char *URI; const char *name; // binding name const char *type; // portType const char *transport; // binding transport SetOfString location; // WSDL may specify multiple locations via -> vector operation; MapOfStringToMessage header; MapOfStringToMessage headerfault; MapOfStringToMessage fault; MapOfStringToString service_documentation; MapOfStringToString port_documentation; MapOfStringToString binding_documentation; vector policy; // WS-Policy vector role; // BPEL 2.0 VectorOfString imports; Service(); void generate(Types&); void add_import(const char*); void del_import(const char*); }; typedef map MapOfStringToService; class Definitions { public: Types types; // to process schema type information MapOfStringToService services; // service information gathered bool soap12; int binding_count; Definitions(); void collect(const wsdl__definitions&); void compile(const wsdl__definitions&); private: void analyze(const wsdl__definitions&); void analyze_headers(const wsdl__definitions&, Service*, wsdl__ext_ioput*, wsdl__ext_ioput*); void analyze_faults(const wsdl__definitions&, Service*, Operation*, vector::const_iterator&); Message *analyze_fault(const wsdl__definitions&, Service*, const wsdl__ext_fault&); void generate(); }; #endif gsoap-2.8.28/gsoap/VisualStudio2005/wsdl2h/wsdl2h/bpel.cpp0000644000175000017500000003305612653650160022406 0ustar ellertellert/* bpel.cpp BPEL 2.0 binding schema -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2014, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "wsdlH.h" #include "includes.h" extern const char *qname_token(const char*, const char*); extern int is_builtin_qname(const char*); //////////////////////////////////////////////////////////////////////////////// // // plnk:tRole // //////////////////////////////////////////////////////////////////////////////// plnk__tRole::plnk__tRole() { portTypeRef = NULL; } wsdl__portType *plnk__tRole::portTypePtr() const { return portTypeRef; } int plnk__tRole::traverse(wsdl__definitions& definitions) { const char *token; if (vflag) cerr << " Analyzing BPEL Partner Link tRole" << endl; portTypeRef = NULL; token = qname_token(portType, definitions.targetNamespace); if (token) { for (vector::iterator portType = definitions.portType.begin(); portType != definitions.portType.end(); ++portType) { if ((*portType).name && !strcmp((*portType).name, token)) { portTypeRef = &(*portType); if (vflag) cerr << " Found tRole '" << (name?name:"") << "' portType '" << (token?token:"") << "'" << endl; break; } } // WSDL 2.0 for (vector::iterator i = definitions.interface_.begin(); i != definitions.interface_.end(); ++i) { if ((*i).name && !strcmp((*i).name, token)) { portTypeRef = &(*i); if (vflag) cerr << " Found tRole '" << (name?name:"") << "' interface '" << (token?token:"") << "'" << endl; break; } } } if (!portTypeRef) { for (vector::iterator import = definitions.import.begin(); import != definitions.import.end(); ++import) { wsdl__definitions *importdefinitions = (*import).definitionsPtr(); if (importdefinitions) { token = qname_token(portType, importdefinitions->targetNamespace); if (token) { for (vector::iterator portType = importdefinitions->portType.begin(); portType != importdefinitions->portType.end(); ++portType) { if ((*portType).name && !strcmp((*portType).name, token)) { portTypeRef = &(*portType); if (vflag) cerr << " Found tRole '" << (name?name:"") << "' portType '" << (token?token:"") << "'" << endl; break; } } // WSDL 2.0 for (vector::iterator i = importdefinitions->interface_.begin(); i != importdefinitions->interface_.end(); ++i) { if ((*i).name && !strcmp((*i).name, token)) { portTypeRef = &(*i); if (vflag) cerr << " Found tRole '" << (name?name:"") << "' interface '" << (token?token:"") << "'" << endl; break; } } } } } } if (!portTypeRef) { if (!Wflag) cerr << "Warning: no tRole '" << (name?name:"") << "' portType '" << (portType?portType:"") << "' in wsdl definitions '" << (definitions.name?definitions.name:"") << "' namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << endl; } return SOAP_OK; } void plnk__tRole::plnkPtr(plnk__tPartnerLinkType *plnk) { plnkRef = plnk; } plnk__tPartnerLinkType* plnk__tRole::plnkPtr() const { return plnkRef; } //////////////////////////////////////////////////////////////////////////////// // // plnk:tPartnerLinkType // //////////////////////////////////////////////////////////////////////////////// int plnk__tPartnerLinkType::traverse(wsdl__definitions& definitions) { if (vflag) cerr << " Analyzing BPEL Partner Link Type" << endl; for (vector::iterator i = role.begin(); i != role.end(); ++i) { (*i).plnkPtr(this); (*i).traverse(definitions); } return SOAP_OK; } //////////////////////////////////////////////////////////////////////////////// // // vprop:property // //////////////////////////////////////////////////////////////////////////////// int vprop__tProperty::traverse(wsdl__definitions& definitions) { if (vflag) cerr << " Analyzing BPEL Variable Properties" << endl; if (element && definitions.types) { for (vector::iterator schema = definitions.types->xs__schema_.begin(); schema != definitions.types->xs__schema_.end(); ++schema) { const char *token = qname_token(element, (*schema)->targetNamespace); if (token) { for (vector::iterator element = (*schema)->element.begin(); element != (*schema)->element.end(); ++element) { if ((*element).name && !strcmp((*element).name, token)) { type = (*element).type; if (vflag) cerr << " Found property '" << (name?name:"") << "' element '" << (token?token:"") << "'" << endl; break; } } } } } if (element && !type) { if (is_builtin_qname(element)) definitions.builtinElement(element); else if (!Wflag) cerr << "Warning: no BPEL Variable Properties '" << (name?name:"") << "' element '" << element << "' in wsdl definitions '" << (definitions.name?definitions.name:"") << "' namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << endl; } else if (type) { if (is_builtin_qname(type)) definitions.builtinType(type); } return SOAP_OK; } //////////////////////////////////////////////////////////////////////////////// // // vprop:tPropertyAlias // //////////////////////////////////////////////////////////////////////////////// int vprop__tPropertyAlias::traverse(wsdl__definitions& definitions) { if (vflag) cerr << " Analyzing BPEL Variable Property Alias" << endl; vpropRef = NULL; for (vector::iterator vprop = definitions.vprop__property.begin(); vprop != definitions.vprop__property.end(); ++vprop) { const char *token = qname_token(propertyName, definitions.targetNamespace); if (token && !strcmp((*vprop).name, token)) { vpropRef = &(*vprop); if (vflag) cerr << " Found property alias '" << (propertyName?propertyName:"") << "' variable" << endl; break; } } if (!vpropRef) { for (vector::iterator import = definitions.import.begin(); !vpropRef && import != definitions.import.end(); ++import) { wsdl__definitions *importdefinitions = (*import).definitionsPtr(); if (importdefinitions) { for (vector::iterator vprop = importdefinitions->vprop__property.begin(); vprop != importdefinitions->vprop__property.end(); ++vprop) { const char *token = qname_token(propertyName, importdefinitions->targetNamespace); if (token && !strcmp((*vprop).name, token)) { vpropRef = &(*vprop); if (vflag) cerr << " Found property alias '" << (propertyName?propertyName:"") << "' variable" << endl; break; } } } } } xs__complexType *complexTypeRef = NULL; if (element && definitions.types) { for (vector::iterator schema = definitions.types->xs__schema_.begin(); schema != definitions.types->xs__schema_.end(); ++schema) { const char *token = qname_token(element, (*schema)->targetNamespace); if (token) { for (vector::iterator element = (*schema)->element.begin(); element != (*schema)->element.end(); ++element) { if ((*element).name && !strcmp((*element).name, token)) { if ((*element).type) type = (*element).type; else complexTypeRef = (*element).complexType; if (vflag) cerr << " Found property alias '" << (propertyName?propertyName:"") << "' element '" << (token?token:"") << "'" << endl; break; } } } } } else if (messageType && part) { wsdl__message *messageRef = NULL; const char *token = qname_token(messageType, definitions.targetNamespace); if (token) { for (vector::iterator message = definitions.message.begin(); message != definitions.message.end(); ++message) { if ((*message).name && !strcmp((*message).name, token)) { messageRef = &(*message); if (vflag) cerr << " Found property alias '" << (propertyName?propertyName:"") << "' message '" << (token?token:"") << "'" << endl; break; } } } if (!messageRef) { for (vector::iterator import = definitions.import.begin(); import != definitions.import.end(); ++import) { wsdl__definitions *importdefinitions = (*import).definitionsPtr(); if (importdefinitions) { token = qname_token(messageType, importdefinitions->targetNamespace); if (token) { for (vector::iterator message = importdefinitions->message.begin(); message != importdefinitions->message.end(); ++message) { if ((*message).name && !strcmp((*message).name, token)) { messageRef = &(*message); if (vflag) cerr << " Found property alias '" << (propertyName?propertyName:"") << "' message '" << (token?token:"") << "'" << endl; break; } } } } } } if (messageRef) { for (vector::iterator parti = messageRef->part.begin(); parti != messageRef->part.end(); ++parti) { if ((*parti).name && !strcmp(part, (*parti).name)) { if ((*parti).element && definitions.types) { for (vector::iterator schema = definitions.types->xs__schema_.begin(); schema != definitions.types->xs__schema_.end(); ++schema) { if ((*parti).type) type = (*parti).type; else { token = qname_token((*parti).element, (*schema)->targetNamespace); if (token) { for (vector::iterator element = (*schema)->element.begin(); element != (*schema)->element.end(); ++element) { if ((*element).name && !strcmp((*element).name, token)) { if ((*element).type) type = (*element).type; else complexTypeRef = (*element).complexType; if (vflag) cerr << " Found property alias '" << (propertyName?propertyName:"") << "' element '" << (token?token:"") << "'" << endl; break; } } } } } } } } } } if (type && !complexTypeRef && definitions.types) { for (vector::iterator schema = definitions.types->xs__schema_.begin(); schema != definitions.types->xs__schema_.end(); ++schema) { const char *token = qname_token(type, (*schema)->targetNamespace); if (token) { for (vector::iterator complexType = (*schema)->complexType.begin(); complexType != (*schema)->complexType.end(); ++complexType) { if ((*complexType).name && !strcmp((*complexType).name, token)) { complexTypeRef = &(*complexType); break; } } } } } if (query && query->__mixed && complexTypeRef) { // TODO query is an XPath expression, most often just the name of an element const char *tag = strchr(query->__mixed, ':'); if (tag) ++tag; else tag = query->__mixed; if (complexTypeRef->all) { for (vector::iterator element = complexTypeRef->all->element.begin(); element != complexTypeRef->all->element.end(); ++element) { if ((*element).name && !strcmp((*element).name, tag)) { // element = (*element).name; type = (*element).type; break; } } } else if (complexTypeRef->sequence) { for (vector::iterator content = complexTypeRef->sequence->__contents.begin(); content != complexTypeRef->sequence->__contents.end(); ++content) { if ((*content).__union == SOAP_UNION_xs__union_content_element && (*content).__content.element && (*content).__content.element->name && !strcmp((*content).__content.element->name, tag)) { element = (*content).__content.element->name; type = (*content).__content.element->type; break; } } } } if (element && !type) { if (is_builtin_qname(element)) definitions.builtinElement(element); } else if (type) { if (is_builtin_qname(type)) definitions.builtinType(type); } return SOAP_OK; } vprop__tProperty *vprop__tPropertyAlias::vpropPtr() const { return vpropRef; } gsoap-2.8.28/gsoap/VisualStudio2005/wsdl2h/wsdl2h/mime.cpp0000644000175000017500000000464212653650160022412 0ustar ellertellert/* mime.cpp WSDL/MIME binding schema -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "wsdlH.h" // cannot include "schemaH.h" #include "includes.h" extern const char *qname_token(const char*, const char*); //////////////////////////////////////////////////////////////////////////////// // // mime:multipartRelated // //////////////////////////////////////////////////////////////////////////////// int mime__multipartRelated::traverse(wsdl__definitions& definitions) { if (vflag) cerr << "Analyzing mime multpartRelated " << endl; for (vector::iterator pt = part.begin(); pt != part.end(); ++pt) (*pt).traverse(definitions); return SOAP_OK; } //////////////////////////////////////////////////////////////////////////////// // // mime:part // //////////////////////////////////////////////////////////////////////////////// int mime__part::traverse(wsdl__definitions& definitions) { if (vflag) cerr << "Analyzing mime part " << endl; for (vector::iterator hd = soap__header_.begin(); hd != soap__header_.end(); ++hd) (*hd).traverse(definitions); return SOAP_OK; } gsoap-2.8.28/gsoap/VisualStudio2005/wsdl2h/wsdl2h/mime.h0000644000175000017500000000416412653650160022056 0ustar ellertellert/* mime.h mime and xmime binding schema -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap mime schema documentation: WSDL/MIME binding schema //gsoap mime schema namespace: http://schemas.xmlsoap.org/wsdl/mime/ //gsoap xmime schema documentation: xmime binding schema //gsoap xmime schema namespace: http://www.w3.org/2005/05/xmlmime #import "imports.h" #import "soap.h" class mime__content { public: @xsd__NMTOKEN part; @xsd__string type; }; class mime__part { public: soap__body *soap__body_; std::vector soap__header_; std::vector content; public: int traverse(wsdl__definitions&); }; class mime__multipartRelated { public: std::vector part; public: int traverse(wsdl__definitions&); }; class mime__mimeXml { public: @xsd__NMTOKEN part; }; gsoap-2.8.28/gsoap/VisualStudio2005/wsdl2h/wsdl2h/wsdl2h.cpp0000644000175000017500000004541412653650160022670 0ustar ellertellert/* wsdl2h.cpp WSDL parser, translator, and generator (of the gSOAP header file format) -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2016, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- Build: soapcpp2 -ipwsdl wsdl.h g++ -o wsdl2h wsdl2h.cpp types.cpp service.cpp wsdl.cpp schema.cpp wsdlC.cpp stdsoap2.cpp TODO: Resolve relative versus absolute import paths for reading imported WSDL/schema (use URL local addresses) Do not generate abstract complexTypes, but include defs in derived types Handle simpleType derivation from base64 */ #include "includes.h" #include "types.h" #include "service.h" #ifndef WSDL2H_IMPORT_PATH #define WSDL2H_IMPORT_PATH (NULL) #endif #ifndef WSDL_TYPEMAP_FILE #define WSDL_TYPEMAP_FILE "typemap.dat" #endif static void init(); static void options(int argc, char **argv); int _flag = 0, aflag = 0, bflag = 0, cflag = 0, c11flag = 0, dflag = 0, eflag = 0, fflag = 0, gflag = 0, iflag = 0, jflag = 0, kflag = 0, mflag = 0, pflag = 0, Pflag = 0, Rflag = 0, sflag = 0, uflag = 0, Uflag = 0, vflag = 0, wflag = 0, Wflag = 0, xflag = 0, yflag = 0, zflag = 0; int openfiles = 0; int infiles = 0; char *infile[MAXINFILES], *outfile = NULL, *proxy_host = NULL, *proxy_userid = NULL, *proxy_passwd = NULL, *auth_userid = NULL, *auth_passwd = NULL; const char *mapfile = WSDL_TYPEMAP_FILE, *import_path = WSDL2H_IMPORT_PATH, *cwd_path = NULL, *cppnamespace = NULL; int proxy_port = 8080; FILE *stream = stdout; SetOfString exturis; extern struct Namespace namespaces[]; const char *service_prefix = NULL; const char *schema_prefix = "ns"; const char elementformat[] = " %-35s %-30s"; const char pointerformat[] = " %-35s *%-30s"; const char attributeformat[] = " @%-35s %-30s"; const char templateformat[] = " %s<%-23s> %-30s"; const char pointertemplateformat[] = " %s<%-22s> *%-30s"; const char templateformat_open[] = " %s<%s"; const char attrtemplateformat_open[] = " @%s<%s"; const char arrayformat[] = " %-35s *__ptr%-25s"; const char arraysizeformat[] = " %-35s __size%-24s"; const char arrayoffsetformat[] = "// %-35s __offset%-22s"; const char sizeformat[] = " $%-35s __size%-24s"; const char choiceformat[] = " $%-35s __union%-23s"; const char schemaformat[] = "//gsoap %-5s schema %s:\t%s\n"; const char serviceformat[] = "//gsoap %-4s service %s:\t%s %s\n"; const char paraformat[] = " %-35s%s%s%s"; const char anonformat[] = " %-35s%s_%s%s"; const char copyrightnotice[] = "\n** The gSOAP WSDL/Schema processor for C and C++, wsdl2h release " WSDL2H_VERSION "\n** Copyright (C) 2000-2016 Robert van Engelen, Genivia Inc.\n** All Rights Reserved. This product is provided \"as is\", without any warranty.\n** The wsdl2h tool and its generated software are released under the GPL.\n** ----------------------------------------------------------------------------\n** A commercial use license is available from Genivia Inc., contact@genivia.com\n** ----------------------------------------------------------------------------\n\n"; const char licensenotice[] = "\ --------------------------------------------------------------------------------\n\ gSOAP XML Web services tools\n\ Copyright (C) 2000-2016, Robert van Engelen, Genivia Inc. All Rights Reserved.\n\ The wsdl2h tool and its generated software are released under the GPL.\n\ This software is released under the GPL with the additional exemption that\n\ compiling, linking, and/or using OpenSSL is allowed.\n\ --------------------------------------------------------------------------------\n\ GPL license.\n\ \n\ This program is free software; you can redistribute it and/or modify it under\n\ the terms of the GNU General Public License as published by the Free Software\n\ Foundation; either version 2 of the License, or (at your option) any later\n\ version.\n\ \n\ This program is distributed in the hope that it will be useful, but WITHOUT ANY\n\ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A\n\ PARTICULAR PURPOSE. See the GNU General Public License for more details.\n\ \n\ You should have received a copy of the GNU General Public License along with\n\ this program; if not, write to the Free Software Foundation, Inc., 59 Temple\n\ Place, Suite 330, Boston, MA 02111-1307 USA\n\ \n\ Author contact information:\n\ engelen@genivia.com / engelen@acm.org\n\ \n\ This program is released under the GPL with the additional exemption that\n\ compiling, linking, and/or using OpenSSL is allowed.\n\ --------------------------------------------------------------------------------\n\ A commercial-use license is available from Genivia, Inc., contact@genivia.com\n\ --------------------------------------------------------------------------------\n"; int main(int argc, char **argv) { fprintf(stderr, "%s", copyrightnotice); options(argc, argv); init(); if (cppnamespace) fprintf(stream, "namespace %s {\n", cppnamespace); Definitions def; wsdl__definitions definitions; definitions.read(infiles, infile); if (definitions.error()) { definitions.print_fault(); exit(1); } definitions.traverse(); def.compile(definitions); if (outfile) { fclose(stream); fprintf(stderr, "\nTo finalize code generation, execute:\n> soapcpp2 %s\n", outfile); if (!cflag) fprintf(stderr, "Or to generate C++ proxy and service classes:\n> soapcpp2 -j %s\n", outfile); fprintf(stderr, "\n"); } return 0; } //////////////////////////////////////////////////////////////////////////////// // // Initialization // //////////////////////////////////////////////////////////////////////////////// static void init() { struct Namespace *p = namespaces; if (p) { for (; p->id; p++) { if (p->in && *p->in) exturis.insert(p->in); if (p->ns && *p->ns) exturis.insert(p->ns); } } } //////////////////////////////////////////////////////////////////////////////// // // Parse command line options // //////////////////////////////////////////////////////////////////////////////// static void options(int argc, char **argv) { int i; infiles = 0; openfiles = 0; for (i = 1; i < argc; i++) { char *a = argv[i]; if (*a == '-' #ifdef WIN32 || *a == '/' #endif ) { int g = 1; while (g && *++a) { switch (*a) { case '_': _flag = 1; break; case 'a': aflag = 1; break; case 'b': bflag = 1; break; case 'c': if (a[1] == '+' && a[2] == '+') { a += 2; if (a[1] == '1' && a[2] == '1') { a += 2; c11flag = 1; } cflag = 0; } else { cflag = 1; if (cppnamespace) fprintf(stderr, "wsdl2h: Options -c and -q cannot be used together\n"); } break; case 'd': dflag = 1; break; case 'e': eflag = 1; break; case 'f': fflag = 1; break; case 'g': gflag = 1; break; case 'i': iflag = 1; break; case 'j': jflag = 1; break; case 'k': kflag = 1; break; case 'I': a++; g = 0; if (*a) import_path = a; else if (i < argc && argv[++i]) import_path = argv[i]; else fprintf(stderr, "wsdl2h: Option -I requires a path argument\n"); break; case 'l': fprintf(stderr, "%s", licensenotice); exit(0); break; case 'm': mflag = 1; break; case 'n': a++; g = 0; if (*a) schema_prefix = a; else if (i < argc && argv[++i]) schema_prefix = argv[i]; else fprintf(stderr, "wsdl2h: Option -n requires a prefix name argument\n"); break; case 'N': a++; g = 0; if (*a) service_prefix = a; else if (i < argc && argv[++i]) service_prefix = argv[i]; else fprintf(stderr, "wsdl2h: Option -N requires a prefix name argument\n"); break; case 'o': a++; g = 0; if (*a) outfile = a; else if (i < argc && argv[++i]) outfile = argv[i]; else fprintf(stderr, "wsdl2h: Option -o requires an output file argument\n"); break; case 'p': pflag = 1; break; case 'P': Pflag = 1; break; case 'q': a++; g = 0; if (*a) cppnamespace = a; else if (i < argc && argv[++i]) cppnamespace = argv[i]; else fprintf(stderr, "wsdl2h: Option -q requires a C++ namespace name argument\n"); if (cflag) fprintf(stderr, "wsdl2h: Options -c and -q cannot be used together\n"); break; case 'r': a++; g = 0; if (*a) proxy_host = a; else if (i < argc && argv[++i]) proxy_host = argv[i]; else fprintf(stderr, "wsdl2h: Option -r requires proxy host:port:userid:passwd or :userid:passwd authentication argument\n"); if (proxy_host) { size_t l = strlen(proxy_host); char *s = (char*)emalloc(l + 1); soap_strcpy(s, l + 2, proxy_host); proxy_host = s; s = strchr(proxy_host, ':'); if (s) { *s = '\0'; if (*proxy_host) { proxy_port = soap_strtol(s + 1, &s, 10); if (s && *s == ':') { *s = '\0'; proxy_userid = s + 1; s = strchr(proxy_userid, ':'); if (s && *s == ':') { *s = '\0'; proxy_passwd = s + 1; } } } else { s = proxy_host; proxy_host = NULL; auth_userid = s + 1; s = strchr(auth_userid, ':'); if (s && *s == ':') { *s = '\0'; auth_passwd = s + 1; } } } } break; case 'R': Rflag = 1; break; case 's': sflag = 1; break; case 't': a++; g = 0; if (*a) mapfile = a; else if (i < argc && argv[++i]) mapfile = argv[i]; else fprintf(stderr, "wsdl2h: Option -t requires a type map file argument\n"); break; case 'U': Uflag = 1; break; case 'u': uflag = 1; break; case 'v': vflag = 1; break; case 'w': wflag = 1; break; case 'W': Wflag = 1; break; case 'x': xflag = 1; break; case 'y': yflag = 1; break; case 'z': a++; g = 0; if (*a) zflag = soap_strtol(a, NULL, 10); else if (i < argc && argv[++i]) zflag = soap_strtol(argv[i], NULL, 10); else zflag = 1; break; case '?': case 'h': fprintf(stderr, "Usage: wsdl2h [-a] [-b] [-c|-c++|-c++11] [-d] [-e] [-f] [-g] [-h] [-I path] [-i] [-j] [-k] [-l] [-m] [-N name] [-n name] [-P|-p] [-q name] [-R] [-r proxyhost[:port[:uid:pwd]]] [-r:userid:passwd] [-s] [-t typemapfile] [-U] [-u] [-v] [-w] [-W] [-x] [-y] [-z#] [-_] [-o outfile.h] infile.wsdl infile.xsd http://www... ...\n\n"); fprintf(stderr, "\ -a generate indexed struct names for local elements with anonymous types\n\ -b bi-directional operations (duplex ops) added to serve one-way responses\n\ -c generate C source code\n\ -c++ generate C++ source code (default)\n\ -c++11 generate C++11 source code\n\ -d use DOM to populate xs:any, xs:anyType, and xs:anyAttribute\n\ -e don't qualify enum names\n\ -f generate flat C++ class hierarchy\n\ -g generate global top-level element declarations\n\ -h display help info\n\ -Ipath use path to find files\n\ -i don't import (advanced option)\n\ -j don't generate SOAP_ENV__Header and SOAP_ENV__Detail definitions\n\ -k don't generate SOAP_ENV__Header mustUnderstand qualifiers\n\ -l display license information\n\ -m use xsd.h module to import primitive types\n\ -Nname use name for service prefixes to produce a service for each binding\n\ -nname use name as the base namespace prefix instead of 'ns'\n\ -ofile output to file\n\ -P don't create polymorphic types inherited from xsd__anyType\n\ -p create polymorphic types inherited from base xsd__anyType\n\ -qname use name for the C++ namespace of all declarations\n\ -R generate REST operations for REST bindings in the WSDL\n\ -rhost[:port[:uid:pwd]]\n\ connect via proxy host, port, and proxy credentials\n\ -r:uid:pwd\n\ connect with authentication credentials (digest auth requires SSL)\n\ -s don't generate STL code (no std::string and no std::vector)\n\ -tfile use type map file instead of the default file typemap.dat\n\ -U allow UTF8-encoded Unicode C/C++ identifiers when mapping XML tag names\n\ -u don't generate unions\n\ -v verbose output\n\ -W suppress warnings\n\ -w always wrap response parameters in a response struct (<=1.1.4 behavior)\n\ -x don't generate _XML any/anyAttribute extensibility elements\n\ -y generate typedef synonyms for structs and enums\n\ -z1 compatibility with 2.7.6e: generate pointer-based arrays\n\ -z2 compatibility with 2.7.7 to 2.7.15: qualify element/attribute references\n\ -z3 compatibility with 2.7.16 to 2.8.7: qualify element/attribute references\n\ -z4 compatibility up to 2.8.11: don't generate union structs in std::vector\n\ -z5 compatibility up to 2.8.15\n\ -z6 compatibility up to 2.8.17\n\ -_ don't generate _USCORE (replace with UNICODE _x005f)\n\ infile.wsdl infile.xsd http://www... list of input sources (if none: use stdin)\n\ \n"); exit(0); default: fprintf(stderr, "wsdl2h: Unknown option %s\n", a); exit(1); } } } else { infile[infiles++] = argv[i]; if (infiles >= MAXINFILES) { fprintf(stderr, "wsdl2h: too many files\n"); exit(1); } } } if (infiles) { if (!outfile) { if (strncmp(infile[0], "http://", 7) && strncmp(infile[0], "https://", 8)) { const char *s = strrchr(infile[0], '.'); if (s && (!soap_tag_cmp(s, ".wsdl") || !soap_tag_cmp(s, ".gwsdl") || !soap_tag_cmp(s, ".xsd"))) { outfile = estrdup(infile[0]); outfile[s - infile[0] + 1] = 'h'; outfile[s - infile[0] + 2] = '\0'; } else { size_t l = strlen(infile[0]); outfile = (char*)emalloc(l + 3); soap_strcpy(outfile, l + 3, infile[0]); soap_strcpy(outfile + l, 3, ".h"); } } } if (outfile) { stream = fopen(outfile, "w"); if (!stream) { fprintf(stderr, "Cannot write to %s\n", outfile); exit(1); } fprintf(stderr, "Saving %s\n\n", outfile); } } } //////////////////////////////////////////////////////////////////////////////// // // Namespaces // //////////////////////////////////////////////////////////////////////////////// struct Namespace namespaces[] = { {"SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/", "http://www.w3.org/*/soap-envelope"}, {"SOAP-ENC", "http://schemas.xmlsoap.org/soap/encoding/", "http://www.w3.org/*/soap-encoding"}, {"xsi", "http://www.w3.org/2001/XMLSchema-instance"}, {"xsd", "-"}, // http://www.w3.org/2001/XMLSchema"}, // don't use this, it might conflict with xs {"xml", "http://www.w3.org/XML/1998/namespace"}, {"xs", "http://www.w3.org/2001/XMLSchema", "http://www.w3.org/*/XMLSchema" }, {"vc", "http://www.w3.org/2007/XMLSchema-versioning" }, {"http", "http://schemas.xmlsoap.org/wsdl/http/"}, {"soap", "http://schemas.xmlsoap.org/wsdl/soap/", "http://schemas.xmlsoap.org/wsdl/soap*/"}, {"mime", "http://schemas.xmlsoap.org/wsdl/mime/"}, {"xmime", "http://www.w3.org/2005/05/xmlmime"}, {"dime", "http://schemas.xmlsoap.org/ws/2002/04/dime/wsdl/", "http://schemas.xmlsoap.org/ws/*/dime/wsdl/"}, {"wsdl", "http://schemas.xmlsoap.org/wsdl/", "http://www.w3.org/ns/wsdl"}, {"wsdli", "http://www.w3.org/ns/wsdl-instance"}, {"wsdlx", "http://www.w3.org/ns/wsdl-extensions"}, {"wsoap", "http://www.w3.org/ns/wsdl/soap"}, {"whttp", "http://www.w3.org/ns/wsdl/http"}, {"wrpc", "http://www.w3.org/ns/wsdl/rpc"}, {"wsaw", "http://www.w3.org/2006/05/addressing/wsdl"}, {"gwsdl", "http://www.gridforum.org/namespaces/2003/03/gridWSDLExtensions"}, {"wsa_", "http://www.w3.org/2005/08/addressing"}, {"wsam", "http://www.w3.org/2007/05/addressing/metadata"}, {"wsrmp", "http://schemas.xmlsoap.org/ws/2005/02/rm/policy", "http://docs.oasis-open.org/ws-rx/wsrmp/*"}, {"sp", "http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702", "http://schemas.xmlsoap.org/ws/2005/07/securitypolicy"}, {"wsp_", "http://www.w3.org/ns/ws-policy", "http://schemas.xmlsoap.org/ws/2004/09/policy"}, {"wst_", "http://docs.oasis-open.org/ws-sx/ws-trust/200512"}, {"wsu_", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"}, {"plnk","http://docs.oasis-open.org/wsbpel/2.0/plnktype"}, {"vprop","http://docs.oasis-open.org/wsbpel/2.0/varprop"}, #ifdef WITH_BPEL {"bpel","http://docs.oasis-open.org/wsbpel/2.0/process/executable"}, {"sref","http://docs.oasis-open.org/wsbpel/2.0/serviceref"}, #endif {NULL, NULL} }; gsoap-2.8.28/gsoap/VisualStudio2005/wsdl2h/wsdl2h/includes.h0000644000175000017500000000774312653650160022743 0ustar ellertellert/* includes.h Common project definitions -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2016, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #ifndef INCLUDES_H #define INCLUDES_H #include "stdsoap2.h" #ifdef WITH_OPENSSL #include "httpda.h" #endif #define WSDL2H_VERSION "2.8.28" #ifdef WIN32 # pragma warning(disable : 4996) #endif #include #include #include #include #include using namespace std; struct ltstr { bool operator()(const char *s1, const char *s2) const { return strcmp(s1, s2) < 0; } }; struct eqstr { const char *s; eqstr(const char *s) : s(s) { } bool operator()(const char *t) const { return strcmp(s, t) == 0; } }; typedef set SetOfString; typedef pair Pair; struct ltpair { bool operator()(Pair s1, Pair s2) const { int cmp = strcmp(s1.first, s2.first); if (cmp == 0) cmp = strcmp(s1.second, s2.second); return cmp < 0; } }; typedef map MapOfStringToString; typedef map MapOfPairToString; typedef map MapOfStringToNum; typedef vector VectorOfString; extern int _flag, aflag, bflag, cflag, c11flag, dflag, eflag, fflag, gflag, iflag, jflag, kflag, mflag, pflag, Pflag, Rflag, sflag, Uflag, uflag, vflag, wflag, Wflag, xflag, yflag, zflag; extern FILE *stream; extern SetOfString exturis; #define MAXINFILES (1000) extern int openfiles; extern int infiles; extern char *infile[MAXINFILES], *outfile, *proxy_host, *proxy_userid, *proxy_passwd, *auth_userid, *auth_passwd; extern const char *mapfile, *import_path, *cwd_path, *cppnamespace; extern int proxy_port; extern const char *service_prefix; extern const char *schema_prefix; extern const char elementformat[]; extern const char pointerformat[]; extern const char attributeformat[]; extern const char templateformat_open[]; extern const char attrtemplateformat_open[]; extern const char templateformat[]; extern const char pointertemplateformat[]; extern const char arrayformat[]; extern const char arraysizeformat[]; extern const char arrayoffsetformat[]; extern const char sizeformat[]; extern const char choiceformat[]; extern const char schemaformat[]; extern const char serviceformat[]; extern const char paraformat[]; extern const char anonformat[]; extern const char copyrightnotice[]; extern const char licensenotice[]; extern void *emalloc(size_t size); extern char *estrdup(const char *s); extern char *estrdupf(const char *s); extern void text(const char*); class Types; class Message; class Operation; class Service; class Definitions; #endif gsoap-2.8.28/gsoap/VisualStudio2005/wsdl2h/wsdl2h/wsdl.cpp0000644000175000017500000020115212653650160022427 0ustar ellertellert/* wsdl.cpp WSDL 1.1 and WSDL 2.0 binding schema implementation -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "wsdlH.h" #include "includes.h" extern struct Namespace namespaces[]; const char *qname_token(const char *QName, const char *URI) { if (QName && QName[0] == '"' && QName[1] == '"' && QName[2] == ':') return QName + 3; if (QName && URI && *QName == '"') // QNames are stored in the format "URI":name, unless the URI is in the nsmap { size_t n = strlen(URI); if (!strncmp(QName + 1, URI, n) && QName[n + 1] == '"') return QName + n + 3; } return NULL; } int is_builtin_qname(const char *QName) { if (iflag) return 1; if (QName) { if (*QName == '#') // reserved QNames return 0; if (*QName != '"') return 1; // if the QName does not start with a ", it must be in the nsmap const char *s = strchr(QName + 1, '"'); if (s) { size_t n = s - QName - 1; for (SetOfString::const_iterator i = exturis.begin(); i != exturis.end(); ++i) if (strlen(*i) == n && !strncmp(QName + 1, *i, n)) return 1; // QName is in exturis } } return 0; } //////////////////////////////////////////////////////////////////////////////// // // wsdl // //////////////////////////////////////////////////////////////////////////////// extern "C" { int warn_ignore(struct soap*, const char*); int show_ignore(struct soap*, const char*); } wsdl__definitions::wsdl__definitions() { soap = soap_new1(SOAP_XML_TREE | SOAP_C_UTFSTRING); #ifdef HTTPDA_H soap_register_plugin(soap, http_da); #endif #ifdef WITH_OPENSSL soap_ssl_client_context(soap, SOAP_SSL_NO_AUTHENTICATION, NULL, NULL, NULL, NULL, NULL); #endif soap_set_namespaces(soap, namespaces); soap_default(soap); if (vflag) soap->fignore = show_ignore; else soap->fignore = warn_ignore; soap->encodingStyle = NULL; soap->proxy_host = proxy_host; soap->proxy_port = proxy_port; soap->proxy_userid = proxy_userid; soap->proxy_passwd = proxy_passwd; name = NULL; targetNamespace = soap_strdup(soap, ""); documentation = NULL; types = NULL; updated = false; location = NULL; redirs = 0; } wsdl__definitions::wsdl__definitions(struct soap *copy) { soap = soap_copy(copy); soap->socket = SOAP_INVALID_SOCKET; soap->recvfd = 0; soap->sendfd = 1; soap_strcpy(soap->host, sizeof(soap->host), copy->host); soap_default(soap); soap->fignore = warn_ignore; soap->encodingStyle = NULL; updated = false; location = NULL; redirs = 0; } wsdl__definitions::wsdl__definitions(struct soap *copy, const char *cwd, const char *loc) { soap = soap_copy(copy); soap->socket = SOAP_INVALID_SOCKET; soap->recvfd = 0; soap->sendfd = 1; soap_strcpy(soap->host, sizeof(soap->host), copy->host); soap_default(soap); soap->fignore = warn_ignore; soap->encodingStyle = NULL; updated = false; location = NULL; redirs = 0; read(cwd, loc); } wsdl__definitions::~wsdl__definitions() { soap_destroy(soap); soap_end(soap); soap_done(soap); free(soap); } int wsdl__definitions::get(struct soap *soap) { (void)soap; return preprocess(); } int wsdl__definitions::read(int num, char **loc) { if (num <= 0) return read((const char*)NULL, (const char*)NULL); if (num == 1) return read((const char*)NULL, loc[0]); wsdl__import im; im.namespace_ = NULL; name = soap_strdup(soap, "WSDL"); targetNamespace = soap_strdup(soap, "");; for (int i = 0; i < num; i++) { im.location = loc[i]; import.push_back(im); } return preprocess(); } int wsdl__definitions::read(const char *cwd, const char *loc) { const char *cwd_temp; if (!cwd) cwd = cwd_path; if (vflag) fprintf(stderr, "\nOpening WSDL/XSD '%s' from '%s'\n", loc ? loc : "(stdin)", cwd ? cwd : "./"); if (loc) { if (soap->recvfd > 2) { soap_end_recv(soap); close(soap->recvfd); soap->recvfd = -1; } else if (soap_valid_socket(soap->socket)) { soap_end_recv(soap); soap_closesock(soap); } #ifdef WITH_OPENSSL if (!strncmp(loc, "http://", 7) || !strncmp(loc, "https://", 8)) #else if (!strncmp(loc, "https://", 8)) { fprintf(stderr, "\nCannot connect to https site: no SSL support, please rebuild wsdl2h with SSL or download the files and rerun wsdl2h\n"); exit(1); } else if (!strncmp(loc, "http://", 7)) #endif { fprintf(stderr, "%*sConnecting to '%s' to retrieve WSDL/XSD...", 2*openfiles, "", loc); location = soap_strdup(soap, loc); if (soap_connect_command(soap, SOAP_GET, location, NULL)) { fprintf(stderr, "\n\nError: connection failed\n"); soap_print_fault(soap, stderr); exit(1); } fprintf(stderr, " connected, receiving...\n"); openfiles++; } else if (cwd && (!strncmp(cwd, "http://", 7) || !strncmp(cwd, "https://", 8))) { size_t l = strlen(cwd) + strlen(loc); location = (char*)soap_malloc(soap, l + 2); soap_strcpy(location, l + 2, cwd); char *s = strrchr(location, '/'); if (s) *s = '\0'; size_t n = strlen(location); soap_strcpy(location + n, l + 2 - n, "/"); ++n; soap_strcpy(location + n, l + 2 - n, loc); fprintf(stderr, "%*sConnecting to '%s' to retrieve '%s'...", 2*openfiles, "", location, loc); if (soap_connect_command(soap, SOAP_GET, location, NULL)) { fprintf(stderr, "\n\nError: connection failed\n"); exit(1); } fprintf(stderr, " connected, receiving...\n"); openfiles++; } else { soap->recvfd = open(loc, O_RDONLY, 0); if (soap->recvfd < 0) { if (cwd) { size_t l = strlen(cwd) + strlen(loc); location = (char*)soap_malloc(soap, l + 2); soap_strcpy(location, l + 2, cwd); char *s = strrchr(location, '/'); #ifdef WIN32 if (!s) s = strrchr(location, '\\'); #endif if (s) *s = '\0'; size_t n = strlen(location); soap_strcpy(location + n, l + 2 - n, "/"); ++n; soap_strcpy(location + n, l + 2 - n, loc); if (!strncmp(location, "file://", 7)) location += 7; soap->recvfd = open(location, O_RDONLY, 0); } if (soap->recvfd < 0 && import_path) { size_t l = strlen(import_path) + strlen(loc); location = (char*)soap_malloc(soap, l + 2); soap_strcpy(location, l + 2, import_path); size_t n = strlen(location); soap_strcpy(location + n, l + 2 - n, "/"); ++n; soap_strcpy(location + n, l + 2 - n, loc); if (!strncmp(location, "file://", 7)) location += 7; soap->recvfd = open(location, O_RDONLY, 0); } if (soap->recvfd < 0) { fprintf(stderr, "\nCannot open '%s'\n", loc); exit(1); } } else location = soap_strdup(soap, loc); fprintf(stderr, "%*sReading '%s'...\n", 2*openfiles, "", location); openfiles++; } } cwd_temp = cwd_path; cwd_path = location; if (!soap_begin_recv(soap)) this->soap_in(soap, "wsdl:", NULL); if (soap->error) { // handle sloppy WSDLs that import schemas at the top level rather than // importing them in if (soap->error == SOAP_TAG_MISMATCH && soap->level == 0) { soap_retry(soap); xs__schema *schema = soap_new_xs__schema(soap); schema->soap_in(soap, "xs:schema", NULL); if (soap->error) { fprintf(stderr, "\nAn error occurred while parsing WSDL or XSD from '%s'\n", loc ? loc : "(stdin)"); soap_print_fault(soap, stderr); if (soap->error < 200) soap_print_fault_location(soap, stderr); exit(1); } name = NULL; targetNamespace = schema->targetNamespace; if (vflag) cerr << "Found schema '" << (targetNamespace ? targetNamespace : "(null)") << "' when expecting WSDL" << endl; types = soap_new_wsdl__types(soap); types->documentation = NULL; types->xs__schema_.push_back(schema); types->preprocess(*this); } // check HTTP redirect (socket was closed) else if ((soap->error >= 301 && soap->error <= 303) || soap->error == 307) { int r = SOAP_ERR; fprintf(stderr, "Redirected to '%s'...\n", soap->endpoint); if (redirs++ < 10) r = read(cwd, soap->endpoint); else fprintf(stderr, "\nMax redirects exceeded\n"); redirs--; return r; } else if (soap->error == 401) { int r = SOAP_ERR; fprintf(stderr, "Authenticating to '%s' realm '%s'...\n", loc, soap->authrealm); if (auth_userid && auth_passwd && redirs++ < 1) { #ifdef HTTPDA_H struct http_da_info info; http_da_save(soap, &info, soap->authrealm, auth_userid, auth_passwd); #else soap->userid = auth_userid; soap->passwd = auth_passwd; #endif r = read(cwd, loc); #ifdef HTTPDA_H http_da_release(soap, &info); #endif redirs--; } else fprintf(stderr, "Authentication failed, use option -r:uid:pwd and (re)build with OpenSSL to enable digest authentication\n"); return r; } else { fprintf(stderr, "\nAn error occurred while parsing WSDL from '%s'\n", loc ? loc : "(stdin)"); soap_print_fault(soap, stderr); if (soap->error < 200) soap_print_fault_location(soap, stderr); exit(1); } } openfiles--; fprintf(stderr, "%*sDone reading '%s'\n", 2*openfiles, "", loc ? loc : "(stdin)"); soap_end_recv(soap); if (soap->recvfd > 2) { close(soap->recvfd); soap->recvfd = -1; } else soap_closesock(soap); cwd_path = cwd_temp; return SOAP_OK; } int wsdl__definitions::preprocess() { if (vflag) cerr << "Preprocessing wsdl definitions '" << (location ? location : "(null)") << "' namespace '" << (targetNamespace ? targetNamespace : "(null)") << "'" << endl; // process import for (vector::iterator im1 = import.begin(); im1 != import.end(); ++im1) (*im1).preprocess(*this); // merge nested imported WSDLs into single import list again: for (vector::iterator im2 = import.begin(); im2 != import.end(); ++im2) { if ((*im2).definitionsPtr()) { for (vector::iterator i = (*im2).definitionsPtr()->import.begin(); i != (*im2).definitionsPtr()->import.end(); ++i) { if ((*i).definitionsPtr()) { bool found = false; if (vflag) cerr << "Import WSDL '" << ((*i).location ? (*i).location : "(null)") << endl; for (vector::iterator j = import.begin(); j != import.end(); ++j) { if ((*i).definitionsPtr() == (*j).definitionsPtr() || ((*i).location && (*j).location && !strcmp((*i).location, (*j).location))) { found = true; break; } } if (!found) { if (vflag) cerr << "Adding imported WSDL '" << ((*i).location ? (*i).location : "(null)") << "' to '" << (location ? location : "(null)") << "' ('" << (name ? name : "(null)") << "') namespace '" << (targetNamespace ? targetNamespace : "(null)") << "'" << endl; import.push_back(*i); goto again; } } } } } // merge for (vector::iterator im3 = import.begin(); im3 != import.end(); ++im3) { if ((*im3).definitionsPtr() && (*im3).definitionsPtr()->types) { if (!types) { types = soap_new_wsdl__types(soap); types->soap_default(soap); } // merge , check for duplicates, add namespaces for sloppy imports for (vector::const_iterator i = (*im3).definitionsPtr()->types->xs__schema_.begin(); i != (*im3).definitionsPtr()->types->xs__schema_.end(); ++i) { bool found = false; vector::const_iterator j; if (!(*i)->targetNamespace) { (*i)->targetNamespace = targetNamespace; if (!Wflag) cerr << "\nWarning: schema imported without namespace, assigning namespace '" << (targetNamespace ? targetNamespace : "(null)") << "'" << endl; } for (j = types->xs__schema_.begin(); j != types->xs__schema_.end(); ++j) { if ((*j)->targetNamespace && !strcmp((*i)->targetNamespace, (*j)->targetNamespace)) { found = true; break; } } // add new schema only if not already in , otherwise merge schema components if (found) { if (vflag) cerr << "\nSchemas with identical namespace '" << ((*i)->targetNamespace ? (*i)->targetNamespace : "(null)") << "' merged in WSDL '" << (name ? name : "(null)") << "' namespace '" << (targetNamespace ? targetNamespace : "(null)") << "'" << endl; (*j)->insert(*(*i)); } else { if (vflag) cerr << "Adding schema with namespace '" << ((*i)->targetNamespace ? (*i)->targetNamespace : "(null)") << "' to types in WSDL '" << (name ? name : "(null)") << "' namespace '" << (targetNamespace ? targetNamespace : "(null)") << "'" << endl; types->xs__schema_.push_back(*i); } } // make imported WSDL point to merged (*im3).definitionsPtr()->types = types; } } // process the types if (types) types->preprocess(*this); return SOAP_OK; } int wsdl__definitions::traverse() { if (updated) return SOAP_OK; if (vflag) cerr << "Analyzing definitions '" << (name ? name : "(null)") << "' in wsdl namespace '" << (targetNamespace ? targetNamespace : "(null)") << "'" << endl; updated = true; if (!targetNamespace) { if (vflag) cerr << "\nWarning: wsdl '" << (name ? name : "(null)") << "' has no targetNamespace" << endl; targetNamespace = soap_strdup(soap, ""); } // process import first for (vector::iterator im = import.begin(); im != import.end(); ++im) (*im).traverse(*this); // then process the types if (types) types->traverse(*this); // process messages before portType for (vector::iterator mg = message.begin(); mg != message.end(); ++mg) (*mg).traverse(*this); // process portType before binding for (vector::iterator pt = portType.begin(); pt != portType.end(); ++pt) (*pt).traverse(*this); // process interface before binding WSDL 2.0 for (vector::iterator in = interface_.begin(); in != interface_.end(); ++in) (*in).traverse(*this); // process binding for (vector::iterator bg = binding.begin(); bg != binding.end(); ++bg) (*bg).traverse(*this); // process service for (vector::iterator sv = service.begin(); sv != service.end(); ++sv) (*sv).traverse(*this); if (vflag) cerr << "End of definitions '" << (name ? name : "(null)") << "' namespace '" << (targetNamespace ? targetNamespace : "(null)") << "'" << endl; for (std::vector::iterator wsp = wsp__Policy_.begin(); wsp != wsp__Policy_.end(); ++wsp) (*wsp).traverse(*this); for (std::vector::iterator plt = plnk__partnerLinkType.begin(); plt != plnk__partnerLinkType.end(); ++plt) (*plt).traverse(*this); for (std::vector::iterator vp = vprop__property.begin(); vp != vprop__property.end(); ++vp) (*vp).traverse(*this); for (std::vector::iterator vpa = vprop__propertyAlias.begin(); vpa != vprop__propertyAlias.end(); ++vpa) (*vpa).traverse(*this); return SOAP_OK; } const char *wsdl__definitions::sourceLocation() { return location; } int wsdl__definitions::error() { return soap->error; } bool wsdl__definitions::is_updated() { return updated; } void wsdl__definitions::print_fault() { soap_print_fault(soap, stderr); if (soap->error < 200) soap_print_fault_location(soap, stderr); } void wsdl__definitions::builtinType(const char *type) { builtinTypeSet.insert(type); } void wsdl__definitions::builtinTypes(const SetOfString& types) { for (SetOfString::const_iterator tp = types.begin(); tp != types.end(); ++tp) builtinTypeSet.insert(*tp); } void wsdl__definitions::builtinElement(const char *element) { builtinElementSet.insert(element); } void wsdl__definitions::builtinElements(const SetOfString& elements) { for (SetOfString::const_iterator el = elements.begin(); el != elements.end(); ++el) builtinElementSet.insert(*el); } void wsdl__definitions::builtinAttribute(const char *attribute) { builtinAttributeSet.insert(attribute); } void wsdl__definitions::builtinAttributes(const SetOfString& attributes) { for (SetOfString::const_iterator at = attributes.begin(); at != attributes.end(); ++at) builtinAttributeSet.insert(*at); } const SetOfString& wsdl__definitions::builtinTypes() const { return builtinTypeSet; } const SetOfString& wsdl__definitions::builtinElements() const { return builtinElementSet; } const SetOfString& wsdl__definitions::builtinAttributes() const { return builtinAttributeSet; } int wsdl__service::traverse(wsdl__definitions& definitions) { if (vflag) cerr << "Analyzing service '" << (name ? name : "(null)") << "' in wsdl namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << endl; // process ports for (vector::iterator pt = port.begin(); pt != port.end(); ++pt) (*pt).traverse(definitions); for (vector::iterator ep = endpoint.begin(); ep != endpoint.end(); ++ep) (*ep).traverse(definitions); for (vector::iterator py = wsp__Policy_.begin(); py != wsp__Policy_.end(); ++py) (*py).traverse(definitions); for (vector::iterator pr = wsp__PolicyReference_.begin(); pr != wsp__PolicyReference_.end(); ++pr) (*pr).traverse(definitions); return SOAP_OK; } wsdl__port::wsdl__port() { bindingRef = NULL; } int wsdl__port::traverse(wsdl__definitions& definitions) { if (vflag) cerr << " Analyzing service port/endpoint in wsdl namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << endl; // search binding name const char *token = qname_token(binding, definitions.targetNamespace); bindingRef = NULL; if (token) { for (vector::iterator binding = definitions.binding.begin(); binding != definitions.binding.end(); ++binding) { if ((*binding).name && !strcmp((*binding).name, token)) { bindingRef = &(*binding); if (vflag) cerr << " Found port/endpoint '" << (name ? name : "(null)") << "' binding '" << (token ? token : "(null)") << "'" << endl; break; } } } if (!bindingRef) { for (vector::iterator import = definitions.import.begin(); import != definitions.import.end(); ++import) { wsdl__definitions *importdefinitions = (*import).definitionsPtr(); if (importdefinitions) { token = qname_token(binding, importdefinitions->targetNamespace); if (token) { for (vector::iterator binding = importdefinitions->binding.begin(); binding != importdefinitions->binding.end(); ++binding) { if ((*binding).name && !strcmp((*binding).name, token)) { bindingRef = &(*binding); if (vflag) cerr << " Found port/endpoint '" << (name ? name : "(null)") << "' binding '" << (token ? token : "(null)") << "'" << endl; break; } } } } } } if (!bindingRef) if (!Wflag) cerr << "\nWarning: no port/endpoint '" << (name ? name : "(null)") << "' binding '" << (binding ? binding : "(null)") << "' in wsdl definitions '" << (definitions.name ? definitions.name : "(null)") << "' namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << endl; if (wsp__Policy_) wsp__Policy_->traverse(definitions); if (wsp__PolicyReference_) wsp__PolicyReference_->traverse(definitions); return SOAP_OK; } void wsdl__port::bindingPtr(wsdl__binding *binding) { bindingRef = binding; if (!bindingRef && vflag) cerr << "\nWarning: wsdl__port binding set to NULL" << endl; } wsdl__binding *wsdl__port::bindingPtr() const { return bindingRef; } wsdl__binding::wsdl__binding() { portTypeRef = NULL; } int wsdl__binding::traverse(wsdl__definitions& definitions) { const char *token; if (vflag) cerr << " Analyzing binding '" << (name ? name : "(null)") << "' in wsdl namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << endl; portTypeRef = NULL; if (interface_) // WSDL 2.0 token = qname_token(interface_, definitions.targetNamespace); else token = qname_token(type, definitions.targetNamespace); if (token) { for (vector::iterator portType = definitions.portType.begin(); portType != definitions.portType.end(); ++portType) { if ((*portType).name && !strcmp((*portType).name, token)) { portTypeRef = &(*portType); if (vflag) cerr << " Found binding '" << (name ? name : "(null)") << "' portType '" << (token ? token : "(null)") << "'" << endl; break; } } // WSDL 2.0 for (vector::iterator i = definitions.interface_.begin(); i != definitions.interface_.end(); ++i) { if ((*i).name && !strcmp((*i).name, token)) { portTypeRef = &(*i); if (vflag) cerr << " Found binding '" << (name ? name : "(null)") << "' interface '" << (token ? token : "(null)") << "'" << endl; break; } } } if (!portTypeRef) { for (vector::iterator import = definitions.import.begin(); import != definitions.import.end(); ++import) { wsdl__definitions *importdefinitions = (*import).definitionsPtr(); if (importdefinitions) { if (interface_) // WSDL 2.0 token = qname_token(interface_, importdefinitions->targetNamespace); else token = qname_token(type, importdefinitions->targetNamespace); if (token) { for (vector::iterator portType = importdefinitions->portType.begin(); portType != importdefinitions->portType.end(); ++portType) { if ((*portType).name && !strcmp((*portType).name, token)) { portTypeRef = &(*portType); if (vflag) cerr << " Found binding '" << (name ? name : "(null)") << "' portType '" << (token ? token : "(null)") << "'" << endl; break; } } // WSDL 2.0 for (vector::iterator i = importdefinitions->interface_.begin(); i != importdefinitions->interface_.end(); ++i) { if ((*i).name && !strcmp((*i).name, token)) { portTypeRef = &(*i); if (vflag) cerr << " Found binding '" << (name ? name : "(null)") << "' interface '" << (token ? token : "(null)") << "'" << endl; break; } } } } } } if (!portTypeRef) { if (!Wflag) { if (interface_) cerr << "\nWarning: no binding '" << (name ? name : "(null)") << "' interface '" << (interface_ ? interface_ : "(null)") << "' in wsdl definitions '" << (definitions.name ? definitions.name : "(null)") << "' namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << endl; else cerr << "\nWarning: no binding '" << (name ? name : "(null)") << "' portType '" << (type ? type : "(null)") << "' in wsdl definitions '" << (definitions.name ? definitions.name : "(null)") << "' namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << endl; } } // WSDL 2.0 for (vector::iterator f = fault.begin(); f != fault.end(); ++f) (*f).traverse(definitions, portTypeRef); for (vector::iterator i = operation.begin(); i != operation.end(); ++i) (*i).traverse(definitions, portTypeRef); for (vector::iterator p = wsp__Policy_.begin(); p != wsp__Policy_.end(); ++p) (*p).traverse(definitions); for (vector::iterator r = wsp__PolicyReference_.begin(); r != wsp__PolicyReference_.end(); ++r) (*r).traverse(definitions); return SOAP_OK; } void wsdl__binding::portTypePtr(wsdl__portType *portType) { portTypeRef = portType; if (!portTypeRef && vflag) cerr << "\nWarning: wsdl__binding portType set to NULL" << endl; } wsdl__portType *wsdl__binding::portTypePtr() const { return portTypeRef; } wsdl__ext_operation::wsdl__ext_operation() { operationRef = NULL; } int wsdl__ext_operation::traverse(wsdl__definitions& definitions, wsdl__portType *portTypeRef) { if (vflag) cerr << " Analyzing binding operation '" << (name ? name : ref ? ref : "(null)") << "' in wsdl namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << endl; if (input) input->traverse(definitions); if (output) output->traverse(definitions); for (vector::iterator f = fault.begin(); f != fault.end(); ++f) (*f).traverse(definitions, portTypeRef); // WSDL 2.0 for (vector::iterator fi = infault.begin(); fi != infault.end(); ++fi) (*fi).traverse(definitions, portTypeRef); for (vector::iterator fo = outfault.begin(); fo != outfault.end(); ++fo) (*fo).traverse(definitions, portTypeRef); operationRef = NULL; if (portTypeRef) { // WSDL 2.0, assumption: ref refers to an operation in the interface for this binding const char *token = NULL; if (ref) token = qname_token(ref, portTypeRef->definitionsPtr()->targetNamespace); for (vector::iterator i = portTypeRef->operation.begin(); i != portTypeRef->operation.end(); ++i) { if (token) { if ((*i).name && !strcmp((*i).name, token)) { operationRef = &(*i); if (vflag) cerr << " Found operation '" << token << "' in interface '" << portTypeRef->name << "'" << endl; break; } } else if (name && (*i).name && !strcmp((*i).name, name)) { if ((!input || !input->name || ((*i).__union1 == SOAP_UNION_wsdl__union_ioput_input && (*i).__ioput1.input->name && !strcmp((*i).__ioput1.input->name, input->name)) || ((*i).__union2 == SOAP_UNION_wsdl__union_ioput_input && (*i).__ioput2.input->name && !strcmp((*i).__ioput2.input->name, input->name)) ) && (!output || !output->name || ((*i).__union1 == SOAP_UNION_wsdl__union_ioput_output && (*i).__ioput1.output->name && !strcmp((*i).__ioput1.output->name, output->name)) || ((*i).__union2 == SOAP_UNION_wsdl__union_ioput_output && (*i).__ioput2.output->name && !strcmp((*i).__ioput2.output->name, output->name)) )) { operationRef = &(*i); if (vflag) cerr << " Found operation '" << name << "' in portType '" << portTypeRef->name << "'" << endl; break; } } } if (name && !operationRef) { for (vector::iterator j = portTypeRef->operation.begin(); j != portTypeRef->operation.end(); ++j) { if ((*j).name && !strcmp((*j).name, name)) { if (input && input->name && (((*j).__union1 == SOAP_UNION_wsdl__union_ioput_input && (*j).__ioput1.input->name && !strcmp((*j).__ioput1.input->name, input->name)) || ((*j).__union2 == SOAP_UNION_wsdl__union_ioput_input && (*j).__ioput2.input->name && !strcmp((*j).__ioput2.input->name, input->name)) )) cerr << "\nWarning: no matching portType operation input name '" << input->name << "' in wsdl definitions '" << (definitions.name ? definitions.name : "(null)") << "' namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << endl; if (output && output->name && (((*j).__union1 == SOAP_UNION_wsdl__union_ioput_output && (*j).__ioput1.output->name && !strcmp((*j).__ioput1.output->name, output->name)) || ((*j).__union2 == SOAP_UNION_wsdl__union_ioput_output && (*j).__ioput2.output->name && !strcmp((*j).__ioput2.output->name, output->name)) )) cerr << "\nWarning: no matching portType operation output name '" << output->name << "' in wsdl definitions '" << (definitions.name ? definitions.name : "(null)") << "' namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << endl; operationRef = &(*j); if (vflag) cerr << " Found operation '" << name << "'" << endl; break; } } } } if (!operationRef) { if (!Wflag) { if (ref) cerr << "\nWarning: no matching interface operation '" << (ref ? ref : "(null)") << "' in wsdl definitions '" << (definitions.name ? definitions.name : "(null)") << "' namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << endl; else cerr << "\nWarning: no matching portType operation '" << (name ? name : "(null)") << "' in wsdl definitions '" << (definitions.name ? definitions.name : "(null)") << "' namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << endl; } } else { for (vector::iterator i = fault.begin(); i != fault.end(); ++i) { if ((*i).name) { for (vector::iterator j = operationRef->fault.begin(); j != operationRef->fault.end(); ++j) { if ((*j).name && !strcmp((*j).name, (*i).name)) { (*i).faultPtr(&(*j)); if (vflag) cerr << " Found fault '" << (*j).name << "' message" << endl; break; } } } else if ((*i).soap__fault_ && (*i).soap__fault_->name) // try the soap:fault name, this is not elegant, but neither is WSDL 1.1 { for (vector::iterator j = operationRef->fault.begin(); j != operationRef->fault.end(); ++j) { if ((*j).name && !strcmp((*j).name, (*i).soap__fault_->name)) { (*i).faultPtr(&(*j)); if (vflag) cerr << " Found fault '" << ((*j).name ? (*j).name : "(null)") << "' message" << endl; break; } } } if (!(*i).faultPtr()) if (!Wflag) cerr << "\nWarning: no soap:fault '" << ((*i).name ? (*i).name : "(null)") << "' message in wsdl definitions '" << (definitions.name ? definitions.name : "(null)") << "' operation '" << (name ? name : "(null)") << "' namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << endl; } } if (wsp__Policy_) wsp__Policy_->traverse(definitions); if (wsp__PolicyReference_) wsp__PolicyReference_->traverse(definitions); return SOAP_OK; } void wsdl__ext_operation::operationPtr(wsdl__operation *operation) { operationRef = operation; if (!operationRef && vflag) cerr << "\nWarning: wsdl__ext_operation operation set to NULL" << endl; } wsdl__operation *wsdl__ext_operation::operationPtr() const { return operationRef; } int wsdl__ext_ioput::traverse(wsdl__definitions& definitions) { if (vflag) cerr << " Analyzing binding operation input/output in wsdl namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << endl; for (vector::iterator hd = soap__header_.begin(); hd != soap__header_.end(); ++hd) (*hd).traverse(definitions); for (vector::iterator whd = wsoap__header_.begin(); whd != wsoap__header_.end(); ++whd) (*whd).traverse(definitions); if (mime__multipartRelated_) mime__multipartRelated_->traverse(definitions); if (wsp__Policy_) wsp__Policy_->traverse(definitions); if (wsp__PolicyReference_) wsp__PolicyReference_->traverse(definitions); return SOAP_OK; } wsdl__ext_fault::wsdl__ext_fault() { faultRef = NULL; } int wsdl__ext_fault::traverse(wsdl__definitions& definitions, wsdl__portType *portTypeRef) { if (vflag) cerr << " Analyzing binding operation fault in wsdl namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << endl; if (ref && portTypeRef) { // WSDL 2.0, assumption: ref refers to a fault in the interface for this binding const char *token = qname_token(ref, portTypeRef->definitionsPtr()->targetNamespace); if (token) { for (vector::iterator fault = portTypeRef->fault.begin(); fault != portTypeRef->fault.end(); ++fault) { if ((*fault).name && !strcmp((*fault).name, token)) { faultRef = &(*fault); if (vflag) cerr << " Found fault '" << (*fault).name << endl; break; } } } if (!faultRef) if (!Wflag) cerr << "\nWarning: no fault '" << (ref ? ref : "(null)") << "' in wsdl definitions '" << (definitions.name ? definitions.name : "(null)") << "' interface '" << (portTypeRef->name ? portTypeRef->name : "(null)") << "' namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << endl; } if (wsp__Policy_) wsp__Policy_->traverse(definitions); if (wsp__PolicyReference_) wsp__PolicyReference_->traverse(definitions); return SOAP_OK; } void wsdl__ext_fault::faultPtr(wsdl__fault *fault) { faultRef = fault; if (!faultRef && vflag) cerr << "\nWarning: wsdl__ext_fault fault ref set to NULL" << endl; } wsdl__fault *wsdl__ext_fault::faultPtr() const { return faultRef; } wsdl__portType::wsdl__portType() { definitionsRef = NULL; } int wsdl__portType::traverse(wsdl__definitions& definitions) { if (vflag) cerr << " Analyzing portType/interface '" << (name ? name : "(null)") << "' in wsdl namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << endl; definitionsRef = &definitions; // traverse faults before operations, WSDL 2.0 for (vector::iterator f = fault.begin(); f != fault.end(); ++f) (*f).traverse(definitions); for (vector::iterator i = operation.begin(); i != operation.end(); ++i) (*i).traverse(definitions); if (wsp__Policy_) wsp__Policy_->traverse(definitions); if (wsp__PolicyReference_) wsp__PolicyReference_->traverse(definitions); return SOAP_OK; } void wsdl__portType::definitionsPtr(wsdl__definitions *definitions) { definitionsRef = definitions; } wsdl__definitions *wsdl__portType::definitionsPtr() const { return definitionsRef; } int wsdl__operation::traverse(wsdl__definitions& definitions) { if (vflag) cerr << " Analyzing portType/interface operation '" << (name ? name : "(null)") << "' in wsdl namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << endl; if (__union1 == SOAP_UNION_wsdl__union_ioput_input) if (__ioput1.input) __ioput1.input->traverse(definitions); if (__union1 == SOAP_UNION_wsdl__union_ioput_output) if (__ioput1.output) __ioput1.output->traverse(definitions); if (__union2 == SOAP_UNION_wsdl__union_ioput_input) if (__ioput2.input) __ioput2.input->traverse(definitions); if (__union2 == SOAP_UNION_wsdl__union_ioput_output) if (__ioput2.output) __ioput2.output->traverse(definitions); for (vector::iterator i = fault.begin(); i != fault.end(); ++i) (*i).traverse(definitions); // WSDL 2.0 for (vector::iterator fi = infault.begin(); fi != infault.end(); ++fi) (*fi).traverse(definitions); for (vector::iterator fo = outfault.begin(); fo != outfault.end(); ++fo) (*fo).traverse(definitions); if (wsp__Policy_) wsp__Policy_->traverse(definitions); if (wsp__PolicyReference_) wsp__PolicyReference_->traverse(definitions); return SOAP_OK; } wsdl__ioput::wsdl__ioput() { messageRef = NULL; elementRef = NULL; } int wsdl__ioput::traverse(wsdl__definitions& definitions) { if (vflag) cerr << " Analyzing portType/interface operation input/output in wsdl namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << endl; messageRef = NULL; elementRef = NULL; // WSDL 2.0 if (element) { if (definitions.types) { for (vector::iterator schema = definitions.types->xs__schema_.begin(); schema != definitions.types->xs__schema_.end(); ++schema) { const char *token = qname_token(element, (*schema)->targetNamespace); if (token) { for (vector::iterator element = (*schema)->element.begin(); element != (*schema)->element.end(); ++element) { if ((*element).name && !strcmp((*element).name, token)) { elementRef = &(*element); if (vflag) cerr << " Found input/output '" << (messageLabel ? messageLabel : "(null)") << "' element '" << (token ? token : "(null)") << "'" << endl; break; } } } } } if (*element != '#' && !elementRef) { if (is_builtin_qname(element)) definitions.builtinElement(element); else if (!Wflag) cerr << "\nWarning: no input/output '" << (messageLabel ? messageLabel : "(null)") << "' element '" << element << "' in wsdl definitions '" << (definitions.name ? definitions.name : "(null)") << "' namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << endl; } } else { const char *token = qname_token(message, definitions.targetNamespace); if (token) { for (vector::iterator message = definitions.message.begin(); message != definitions.message.end(); ++message) { if ((*message).name && !strcmp((*message).name, token)) { messageRef = &(*message); if (vflag) cerr << " Found input/output '" << (name ? name : "(null)") << "' message '" << (token ? token : "(null)") << "'" << endl; break; } } } if (!messageRef) { for (vector::iterator import = definitions.import.begin(); import != definitions.import.end(); ++import) { wsdl__definitions *importdefinitions = (*import).definitionsPtr(); if (importdefinitions) { token = qname_token(message, importdefinitions->targetNamespace); if (token) { for (vector::iterator message = importdefinitions->message.begin(); message != importdefinitions->message.end(); ++message) { if ((*message).name && !strcmp((*message).name, token)) { messageRef = &(*message); if (vflag) cerr << " Found input/output '" << (name ? name : "(null)") << "' message '" << (token ? token : "(null)") << "'" << endl; break; } } } } } } if (!messageRef) if (!Wflag) cerr << "\nWarning: no input/output '" << (name ? name : "(null)") << "' message '" << (message ? message : "(null)") << "' in wsdl definitions '" << (definitions.name ? definitions.name : "(null)") << "' namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << endl; } if (wsp__Policy_) wsp__Policy_->traverse(definitions); if (wsp__PolicyReference_) wsp__PolicyReference_->traverse(definitions); return SOAP_OK; } void wsdl__ioput::messagePtr(wsdl__message *message) { messageRef = message; } wsdl__message *wsdl__ioput::messagePtr() const { return messageRef; } void wsdl__ioput::elementPtr(xs__element *element) { elementRef = element; } xs__element *wsdl__ioput::elementPtr() const { return elementRef; } wsdl__fault::wsdl__fault() { messageRef = NULL; elementRef = NULL; } int wsdl__fault::traverse(wsdl__definitions& definitions) { if (vflag) cerr << " Analyzing portType/interface operation faults in wsdl namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << endl; messageRef = NULL; elementRef = NULL; // WSDL 2.0 if (ref) { const char *token = qname_token(ref, definitions.targetNamespace); if (token) { for (vector::iterator i = definitions.interface_.begin(); i != definitions.interface_.end(); ++i) { for (vector::iterator fault = (*i).fault.begin(); fault != (*i).fault.end(); ++fault) { if ((*fault).name && !strcmp((*fault).name, token)) { elementRef = (*fault).elementPtr(); if (vflag) cerr << " Found fault '" << (ref ? ref : "(null)") << "' element '" << (token ? token : "(null)") << "'" << endl; break; } } } } if (!elementRef) { for (vector::iterator import = definitions.import.begin(); import != definitions.import.end(); ++import) { wsdl__definitions *importdefinitions = (*import).definitionsPtr(); if (importdefinitions) { token = qname_token(message, importdefinitions->targetNamespace); if (token) { for (vector::iterator i = importdefinitions->interface_.begin(); i != importdefinitions->interface_.end(); ++i) { for (vector::iterator fault = (*i).fault.begin(); fault != (*i).fault.end(); ++fault) { if ((*fault).name && !strcmp((*fault).name, token)) { elementRef = (*fault).elementPtr(); if (vflag) cerr << " Found fault '" << (ref ? ref : "(null)") << "' element '" << (token ? token : "(null)") << "'" << endl; break; } } } } } } } if (!elementRef) { if (is_builtin_qname(element)) definitions.builtinElement(element); else if (!Wflag) cerr << "\nWarning: no fault '" << (messageLabel ? messageLabel : "(null)") << "' ref '" << ref << "' in wsdl definitions '" << (definitions.name ? definitions.name : "(null)") << "' namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << endl; } } else if (element) { if (definitions.types) { for (vector::iterator schema = definitions.types->xs__schema_.begin(); schema != definitions.types->xs__schema_.end(); ++schema) { const char *token = qname_token(element, (*schema)->targetNamespace); if (token) { for (vector::iterator element = (*schema)->element.begin(); element != (*schema)->element.end(); ++element) { if ((*element).name && !strcmp((*element).name, token)) { elementRef = &(*element); if (vflag) cerr << " Found fault '" << (messageLabel ? messageLabel : "(null)") << "' element '" << (token ? token : "(null)") << "'" << endl; break; } } } } } if (!elementRef) { if (is_builtin_qname(element)) definitions.builtinElement(element); else if (!Wflag) cerr << "\nWarning: no fault '" << (messageLabel ? messageLabel : "(null)") << "' element '" << element << "' in wsdl definitions '" << (definitions.name ? definitions.name : "(null)") << "' namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << endl; } } else { const char *token = qname_token(message, definitions.targetNamespace); if (token) { for (vector::iterator message = definitions.message.begin(); message != definitions.message.end(); ++message) { if ((*message).name && !strcmp((*message).name, token)) { messageRef = &(*message); if (vflag) cerr << " Found operation fault '" << (name ? name : "(null)") << "' message '" << (token ? token : "(null)") << "'" << endl; break; } } } if (!messageRef) { for (vector::iterator import = definitions.import.begin(); import != definitions.import.end(); ++import) { wsdl__definitions *importdefinitions = (*import).definitionsPtr(); if (importdefinitions) { token = qname_token(message, importdefinitions->targetNamespace); if (token) { for (vector::iterator message = importdefinitions->message.begin(); message != importdefinitions->message.end(); ++message) { if ((*message).name && !strcmp((*message).name, token)) { messageRef = &(*message); if (vflag) cerr << " Found operation fault '" << (name ? name : "(null)") << "' message '" << (token ? token : "(null)") << "'" << endl; break; } } } } } } if (!messageRef) if (!Wflag) cerr << "\nWarning: no operation fault '" << (name ? name : "(null)") << "' message '" << (message ? message : "(null)") << "' in wsdl definitions '" << (definitions.name ? definitions.name : "(null)") << "' namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << endl; } if (wsp__Policy_) wsp__Policy_->traverse(definitions); if (wsp__PolicyReference_) wsp__PolicyReference_->traverse(definitions); return SOAP_OK; } void wsdl__fault::messagePtr(wsdl__message *message) { messageRef = message; } wsdl__message *wsdl__fault::messagePtr() const { return messageRef; } void wsdl__fault::elementPtr(xs__element *element) { elementRef = element; } xs__element *wsdl__fault::elementPtr() const { return elementRef; } int wsdl__message::traverse(wsdl__definitions& definitions) { if (vflag) cerr << " Analyzing message '" << (name ? name : "(null)") << "' in wsdl namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << endl; for (vector::iterator i = part.begin(); i != part.end(); ++i) (*i).traverse(definitions); for (vector::iterator p = wsp__Policy_.begin(); p != wsp__Policy_.end(); ++p) (*p).traverse(definitions); for (vector::iterator r = wsp__PolicyReference_.begin(); r != wsp__PolicyReference_.end(); ++r) (*r).traverse(definitions); return SOAP_OK; } wsdl__part::wsdl__part() { elementRef = NULL; simpleTypeRef = NULL; complexTypeRef = NULL; } int wsdl__part::traverse(wsdl__definitions& definitions) { if (vflag) cerr << " Analyzing message parts in wsdl namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << endl; elementRef = NULL; simpleTypeRef = NULL; complexTypeRef = NULL; if (definitions.types) { for (vector::iterator schema = definitions.types->xs__schema_.begin(); schema != definitions.types->xs__schema_.end(); ++schema) { const char *token = qname_token(element, (*schema)->targetNamespace); if (token) { for (vector::iterator el = (*schema)->element.begin(); el != (*schema)->element.end(); ++el) { if ((*el).name && !strcmp((*el).name, token)) { elementRef = &(*el); if (vflag) cerr << " Found message part '" << (name ? name : "(null)") << "' element '" << (token ? token : "(null)") << "'" << endl; break; } } } token = qname_token(type, (*schema)->targetNamespace); if (token) { for (vector::iterator st = (*schema)->simpleType.begin(); st != (*schema)->simpleType.end(); ++st) { if ((*st).name && !strcmp((*st).name, token)) { simpleTypeRef = &(*st); if (vflag) cerr << " Found message part '" << (name ? name : "(null)") << "' simpleType '" << (token ? token : "(null)") << "'" << endl; break; } } } token = qname_token(type, (*schema)->targetNamespace); if (token) { for (vector::iterator ct = (*schema)->complexType.begin(); ct != (*schema)->complexType.end(); ++ct) { if ((*ct).name && !strcmp((*ct).name, token)) { complexTypeRef = &(*ct); if (vflag) cerr << " Found message part '" << (name ? name : "(null)") << "' complexType '" << (token ? token : "(null)") << "'" << endl; break; } } } } } if (!elementRef && !simpleTypeRef && !complexTypeRef) { if (element) { if (is_builtin_qname(element)) definitions.builtinElement(element); else if (!Wflag) cerr << "\nWarning: no message part '" << (name ? name : "(null)") << "' element '" << element << "' in wsdl definitions '" << (definitions.name ? definitions.name : "(null)") << "' namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << endl; } else if (type) { if (is_builtin_qname(type)) definitions.builtinType(type); else if (!Wflag) cerr << "\nWarning: no message part '" << (name ? name : "(null)") << "' type '" << type << "' in wsdl definitions '" << (definitions.name ? definitions.name : "(null)") << "' namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << endl; } else if (!Wflag) cerr << "\nWarning: no message part '" << (name ? name : "(null)") << "' element or type in wsdl definitions '" << (definitions.name ? definitions.name : "(null)") << "' namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << endl; } return SOAP_OK; } void wsdl__part::elementPtr(xs__element *element) { elementRef = element; if (!elementRef && vflag) cerr << "\nWarning: wsdl__part element set to NULL" << endl; } void wsdl__part::simpleTypePtr(xs__simpleType *simpleType) { simpleTypeRef = simpleType; if (!simpleTypeRef && vflag) cerr << "\nWarning: wsdl__part simpleType set to NULL" << endl; } void wsdl__part::complexTypePtr(xs__complexType *complexType) { complexTypeRef = complexType; if (!complexTypeRef && vflag) cerr << "\nWarning: wsdl__part complexType set to NULL" << endl; } xs__element *wsdl__part::elementPtr() const { return elementRef; } xs__simpleType *wsdl__part::simpleTypePtr() const { return simpleTypeRef; } xs__complexType *wsdl__part::complexTypePtr() const { return complexTypeRef; } int wsdl__types::preprocess(wsdl__definitions& definitions) { if (vflag) cerr << "Preprocessing wsdl types" << endl; if (xs__schema_.empty()) // WSDL 2.0 w/o { targetNamespace = definitions.targetNamespace; xs__schema_.push_back(this); } again: // link imported schemas, need to repeat when is extended with new imported schema (from inside another schema, etc.) for (vector::iterator schema1 = xs__schema_.begin(); schema1 != xs__schema_.end(); ++schema1) { for (vector::iterator import = (*schema1)->import.begin(); import != (*schema1)->import.end(); ++import) { if ((*import).namespace_ && !(*import).schemaPtr()) { for (vector::const_iterator schema2 = xs__schema_.begin(); schema2 != xs__schema_.end(); ++schema2) { if (schema2 != schema1 && (*schema2)->targetNamespace && !strcmp((*import).namespace_, (*schema2)->targetNamespace)) { (*import).schemaPtr(*schema2); break; } } } } } // if a schema is imported but not in then get it for (vector::iterator schema2 = xs__schema_.begin(); schema2 != xs__schema_.end(); ++schema2) { for (vector::iterator import = (*schema2)->import.begin(); import != (*schema2)->import.end(); ++import) { bool found = false; if ((*import).schemaPtr()) found = true; if (vflag) cerr << "Preprocessing schema '" << (*schema2)->targetNamespace << "' import '" << ((*import).namespace_ ? (*import).namespace_ : "(null)") << "'" << endl; if (!found && (*import).namespace_) { for (SetOfString::const_iterator i = exturis.begin(); i != exturis.end(); ++i) { if (!soap_tag_cmp((*import).namespace_, *i)) { found = true; break; } } } if (!found && !iflag) // don't import any of the schemas in the .nsmap table (or when -i option is used) { xs__schema *importschema; importschema = (*import).schemaPtr(); if (!importschema) { const char *s = (*import).schemaLocation; if (!s) s = (*import).namespace_; if (!s) continue; importschema = new xs__schema(definitions.soap, (*schema2)->sourceLocation(), s); if (!(*import).namespace_) { if (importschema->targetNamespace) (*import).namespace_ = importschema->targetNamespace; else (*import).namespace_ = soap_strdup(definitions.soap, ""); } if (!importschema->targetNamespace || !*importschema->targetNamespace) importschema->targetNamespace = (*import).namespace_; else if ((*import).namespace_ && strcmp(importschema->targetNamespace, (*import).namespace_)) cerr << "Schema import namespace '" << ((*import).namespace_ ? (*import).namespace_ : "(null)") << "' does not correspond to imported namespace '" << importschema->targetNamespace << "'" << endl; for (vector::const_iterator schema3 = xs__schema_.begin(); schema3 != xs__schema_.end(); ++schema3) { if ((*schema3)->targetNamespace && !strcmp((*import).namespace_, (*schema3)->targetNamespace)) { (*import).schemaPtr(*schema3); if ((*schema3) == this || // WSDL 2.0 has no FormDefaults (*schema3)->empty()) // schema w/o components, only imports { (*schema3)->elementFormDefault = importschema->elementFormDefault; (*schema3)->attributeFormDefault = importschema->attributeFormDefault; } (*schema3)->insert(*importschema); // merge content goto again; } } } if (importschema) { (*import).schemaPtr(importschema); xs__schema_.push_back(importschema); if (vflag) cerr << "Adding schema '" << importschema->targetNamespace << "'" << endl; goto again; } } } } if (vflag) { for (vector::iterator schema4 = xs__schema_.begin(); schema4 != xs__schema_.end(); ++schema4) { cerr << endl << "Schema " << ((*schema4)->targetNamespace ? (*schema4)->targetNamespace : "") << " " << ((*schema4)->sourceLocation() ? (*schema4)->sourceLocation() : "") << endl; for (vector::iterator im = (*schema4)->import.begin(); im != (*schema4)->import.end(); ++im) cerr << " import " << ((*im).namespace_ ? (*im).namespace_ : "") << " " << ((*im).schemaLocation ? (*im).schemaLocation : "") << endl; for (vector::iterator st = (*schema4)->simpleType.begin(); st != (*schema4)->simpleType.end(); ++st) cerr << " simpleType " << ((*st).name ? (*st).name : "") << endl; for (vector::iterator ct = (*schema4)->complexType.begin(); ct != (*schema4)->complexType.end(); ++ct) cerr << " complexType " << ((*ct).name ? (*ct).name : "") << endl; for (vector::iterator el = (*schema4)->element.begin(); el != (*schema4)->element.end(); ++el) cerr << " element " << ((*el).name ? (*el).name : "") << endl; for (vector::iterator at = (*schema4)->attribute.begin(); at != (*schema4)->attribute.end(); ++at) cerr << " attribute " << ((*at).name ? (*at).name : "") << endl; } } return SOAP_OK; } int wsdl__types::traverse(wsdl__definitions& definitions) { if (vflag) cerr << " Analyzing types in wsdl namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << endl; for (vector::iterator schema3 = xs__schema_.begin(); schema3 != xs__schema_.end(); ++schema3) { // artificially extend the of each schema to include others so when we traverse schemas we can resolve references for (vector::iterator importschema = xs__schema_.begin(); importschema != xs__schema_.end(); ++importschema) { if (schema3 != importschema && (*importschema)->targetNamespace) { xs__import *import = soap_new_xs__import(definitions.soap); import->namespace_ = (*importschema)->targetNamespace; import->schemaPtr(*importschema); (*schema3)->import.push_back(*import); } } // check and report for (vector::iterator import = (*schema3)->import.begin(); import != (*schema3)->import.end(); ++import) { if ((*import).namespace_) { bool found = false; for (vector::const_iterator importschema = xs__schema_.begin(); importschema != xs__schema_.end(); ++importschema) { if ((*importschema)->targetNamespace && !strcmp((*import).namespace_, (*importschema)->targetNamespace)) { found = true; break; } } if (!found && vflag) cerr << "Schema import namespace '" << (*import).namespace_ << "' refers to an unknown Schema" << endl; } else if (!Wflag) cerr << "\nWarning: schema import '" << ((*import).schemaLocation ? (*import).schemaLocation : "") << "' has no namespace" << endl; } } // traverse the schemas for (vector::iterator schema4 = xs__schema_.begin(); schema4 != xs__schema_.end(); ++schema4) (*schema4)->traverse(); // find all built-in types, elements, and attributes for (vector::iterator schema5 = xs__schema_.begin(); schema5 != xs__schema_.end(); ++schema5) { if (vflag) for (SetOfString::const_iterator i = (*schema5)->builtinTypes().begin(); i != (*schema5)->builtinTypes().end(); ++i) cerr << " Built-in schema type '" << (*i) << "'" << endl; definitions.builtinTypes((*schema5)->builtinTypes()); definitions.builtinElements((*schema5)->builtinElements()); definitions.builtinAttributes((*schema5)->builtinAttributes()); } return SOAP_OK; } int wsdl__import::preprocess(wsdl__definitions& definitions) { static map included; bool found = false; if (vflag) cerr << "Preprocess wsdl import '" << (location ? location : "(null)") << "'" << endl; definitionsRef = NULL; if (namespace_) { for (SetOfString::const_iterator i = exturis.begin(); i != exturis.end(); ++i) { if (!soap_tag_cmp(namespace_, *i)) { found = true; break; } } } if (!found && location) { map::iterator i = included.find(location); if (i != included.end()) { if (vflag) fprintf(stderr, "\nWSDL/XSD '%s' already imported\n", location); found = true; definitionsRef = (*i).second; } } if (!found && location) { // parse imported definitions const char *source = definitions.sourceLocation(); if (vflag) cerr << "Importing '" << location << "' into '" << (source ? source : "(source location not set)") << "'" << endl; definitionsRef = new wsdl__definitions(definitions.soap); if (!definitionsRef) return SOAP_EOF; included[location] = definitionsRef; definitionsRef->read(source, location); if (!namespace_) namespace_ = definitionsRef->targetNamespace; else if (!definitionsRef->targetNamespace || !*definitionsRef->targetNamespace) definitionsRef->targetNamespace = namespace_; else if (strcmp(namespace_, definitionsRef->targetNamespace)) cerr << "Error: wsdl definitions/import '" << location << "' namespace '" << namespace_ << "' does not match imported targetNamespace '" << definitionsRef->targetNamespace << "'" << endl; } else if (!location) cerr << "\nWarning: wsdl definitions/import has no location attribute" << endl; return SOAP_OK; } int wsdl__import::traverse(wsdl__definitions& definitions) { if (definitionsRef) { if (vflag) cerr << " Analyzing imported wsdl namespace '" << (namespace_ ? namespace_ : "(null)") << "' in wsdl namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << endl; if (!definitionsRef->targetNamespace) { if (namespace_) definitionsRef->targetNamespace = namespace_; else definitionsRef->targetNamespace = definitions.targetNamespace; } return definitionsRef->traverse(); } return SOAP_OK; } void wsdl__import::definitionsPtr(wsdl__definitions *definitions) { definitionsRef = definitions; if (!definitionsRef && vflag) cerr << "\nWarning: wsdl__import definitions set to NULL" << endl; } wsdl__definitions *wsdl__import::definitionsPtr() const { return definitionsRef; } wsdl__import::wsdl__import() { definitionsRef = NULL; } //////////////////////////////////////////////////////////////////////////////// // // streams // //////////////////////////////////////////////////////////////////////////////// ostream &operator<<(ostream &o, const wsdl__definitions &e) { if (!e.soap) { struct soap soap; soap_init2(&soap, SOAP_IO_DEFAULT, SOAP_XML_TREE | SOAP_C_UTFSTRING); soap_set_namespaces(&soap, namespaces); e.soap_serialize(&soap); soap_begin_send(&soap); e.soap_out(&soap, "wsdl:definitions", 0, NULL); soap_end_send(&soap); soap_destroy(&soap); soap_end(&soap); soap_done(&soap); } else { ostream *os = e.soap->os; e.soap->os = &o; e.soap_serialize(e.soap); soap_begin_send(e.soap); e.soap_out(e.soap, "wsdl:definitions", 0, NULL); soap_end_send(e.soap); e.soap->os = os; } return o; } istream &operator>>(istream &i, wsdl__definitions &e) { if (!e.soap) { e.soap = soap_new1(SOAP_XML_TREE | SOAP_C_UTFSTRING); soap_set_namespaces(e.soap, namespaces); } istream *is = e.soap->is; e.soap->is = &i; if (soap_begin_recv(e.soap) || !e.soap_in(e.soap, "wsdl:", NULL) || soap_end_recv(e.soap)) { // handle error? Note: e.soap->error is set and app should check } e.soap->is = is; return i; } //////////////////////////////////////////////////////////////////////////////// // // Miscellaneous // //////////////////////////////////////////////////////////////////////////////// extern "C" { int warn_ignore(struct soap *soap, const char *tag) { // We don't warn if the omitted element was an annotation or a documentation in an unexpected place if (soap->mustUnderstand) fprintf(stderr, "Error: element '%s' at level %d must be understood\n", tag, soap->level); if (!Wflag && soap_match_tag(soap, tag, "xs:annotation") && soap_match_tag(soap, tag, "xs:documentation") && soap_match_tag(soap, tag, "xs:appinfo")) fprintf(stderr, "\nWarning: unexpected element '%s' at level %d is skipped (safe to ignore)\n", tag, soap->level); if (soap->body && !soap_string_in(soap, 0, -1, -1, NULL)) return soap->error; return SOAP_OK; } int show_ignore(struct soap *soap, const char *tag) { warn_ignore(soap, tag); soap_print_fault_location(soap, stderr); return SOAP_OK; } } // end extern "C" gsoap-2.8.28/gsoap/VisualStudio2005/wsdl2h/wsdl2h/sp.h0000644000175000017500000000436712653650160021556 0ustar ellertellert/* sp.h WS-SecurityPolicy 1.2 binding schemas -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2010, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap sp schema documentation: WS-SecurityPolicy binding //gsoap sp schema namespace: http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702 // 1.1 //gsoap sp schema namespace: http://schemas.xmlsoap.org/ws/2005/07/securitypolicy //gsoap sp schema elementForm: qualified //gsoap sp schema attributeForm: unqualified #import "imports.h" #import "wsam.h" #import "wst.h" class sp__Header { public: @xsd__NCName Name; @xsd__anyURI Namespace; }; class sp__Parts { public: xsd__string Body; std::vector Header; xsd__string Attachments; }; class sp__Elements { public: @xsd__anyURI XPathVersion; std::vector XPath; }; class sp__Token : public wsp__Assertion { public: @xsd__anyURI IncludeToken; wsa__EndpointReferenceType *Issuer; xsd__anyURI IssuerName; wst__Claims *wst__Claims_; }; gsoap-2.8.28/gsoap/VisualStudio2005/wsdl2h/wsdl2h/stdsoap2.cpp0000644000175000017500000203723112653650160023224 0ustar ellertellert/* stdsoap2.c[pp] 2.8.28 gSOAP runtime engine gSOAP XML Web services tools Copyright (C) 2000-2016, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under ONE of the following licenses: GPL, or the gSOAP public license, or Genivia's license for commercial use. -------------------------------------------------------------------------------- Contributors: Wind River Systems Inc., for the following additions under gSOAP public license: - vxWorks compatible options -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2014, Robert van Engelen, Genivia Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #define GSOAP_LIB_VERSION 20828 #ifdef AS400 # pragma convert(819) /* EBCDIC to ASCII */ #endif #include "stdsoap2.h" #if GSOAP_VERSION != GSOAP_LIB_VERSION # error "GSOAP VERSION MISMATCH IN LIBRARY: PLEASE REINSTALL PACKAGE" #endif #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE) # include #endif #ifdef __BORLANDC__ # pragma warn -8060 #else # ifdef WIN32 # ifdef UNDER_CE # pragma comment(lib, "ws2.lib") /* WinCE */ # else # pragma comment(lib, "Ws2_32.lib") # endif # pragma warning(disable : 4996) /* disable deprecation warnings */ # endif #endif #ifdef __cplusplus SOAP_SOURCE_STAMP("@(#) stdsoap2.cpp ver 2.8.28 2016-02-01 00:00:00 GMT") extern "C" { #else SOAP_SOURCE_STAMP("@(#) stdsoap2.c ver 2.8.28 2016-02-01 00:00:00 GMT") #endif /* 8bit character representing unknown character entity or multibyte data */ #ifndef SOAP_UNKNOWN_CHAR # define SOAP_UNKNOWN_CHAR (0x7F) #endif /* unicode character representing unknown characters outside the XML 1.0 UTF8 unicode space */ #ifdef WITH_REPLACE_ILLEGAL_UTF8 # ifndef SOAP_UNKNOWN_UNICODE_CHAR # define SOAP_UNKNOWN_UNICODE_CHAR (0xFFFD) # endif #endif /* EOF=-1 */ #define SOAP_LT (soap_wchar)(-2) /* XML-specific '<' */ #define SOAP_TT (soap_wchar)(-3) /* XML-specific '' */ #define SOAP_QT (soap_wchar)(-5) /* XML-specific '"' */ #define SOAP_AP (soap_wchar)(-6) /* XML-specific ''' */ #define soap_blank(c) ((c)+1 > 0 && (c) <= 32) #define soap_notblank(c) ((c) > 32) #if defined(WIN32) && !defined(UNDER_CE) #define soap_hash_ptr(p) ((PtrToUlong(p) >> 3) & (SOAP_PTRHASH - 1)) #else #define soap_hash_ptr(p) ((size_t)(((unsigned long)(p) >> 3) & (SOAP_PTRHASH-1))) #endif #if !defined(WITH_LEAN) || defined(SOAP_DEBUG) static void soap_init_logs(struct soap*); #endif #ifdef SOAP_DEBUG static void soap_close_logfile(struct soap*, int); static void soap_set_logfile(struct soap*, int, const char*); #endif #ifdef SOAP_MEM_DEBUG static void soap_init_mht(struct soap*); static void soap_free_mht(struct soap*); static void soap_track_unlink(struct soap*, const void*); #endif #ifndef PALM_2 static int soap_set_error(struct soap*, const char*, const char*, const char*, const char*, int); static int soap_copy_fault(struct soap*, const char*, const char*, const char*, const char*); static int soap_getattrval(struct soap*, char*, size_t*, soap_wchar); #endif #ifndef PALM_1 static void soap_free_ns(struct soap *soap); static soap_wchar soap_char(struct soap*); static soap_wchar soap_get_pi(struct soap*); static int soap_isxdigit(int); static void *fplugin(struct soap*, const char*); static size_t soap_count_attachments(struct soap *soap); static int soap_try_connect_command(struct soap*, int http_command, const char *endpoint, const char *action); #ifdef WITH_NTLM static int soap_ntlm_handshake(struct soap *soap, int command, const char *endpoint, const char *host, int port); #endif #ifndef WITH_NOIDREF static int soap_has_copies(struct soap*, const char*, const char*); static int soap_type_punned(struct soap*, const struct soap_ilist*); static int soap_is_shaky(struct soap*, void*); static void soap_init_iht(struct soap*); static void soap_free_iht(struct soap*); #endif static void soap_init_pht(struct soap*); static void soap_free_pht(struct soap*); #endif #ifndef WITH_LEAN static const char *soap_set_validation_fault(struct soap*, const char*, const char*); static int soap_isnumeric(struct soap*, const char*); static struct soap_nlist *soap_push_ns(struct soap *soap, const char *id, const char *ns, short utilized); static void soap_utilize_ns(struct soap *soap, const char *tag); static const wchar_t* soap_wstring(struct soap *soap, const char *s, long minlen, long maxlen); #endif #ifndef PALM_2 static const char* soap_string(struct soap *soap, const char *s, long minlen, long maxlen); static const char* soap_QName(struct soap *soap, const char *s, long minlen, long maxlen); #endif #ifndef WITH_LEANER #ifndef PALM_1 static struct soap_multipart *soap_new_multipart(struct soap*, struct soap_multipart**, struct soap_multipart**, char*, size_t); static int soap_putdimefield(struct soap*, const char*, size_t); static char *soap_getdimefield(struct soap*, size_t); static void soap_select_mime_boundary(struct soap*); static int soap_valid_mime_boundary(struct soap*); static void soap_resolve_attachment(struct soap*, struct soap_multipart*); #endif #endif #ifdef WITH_GZIP static int soap_getgziphdr(struct soap*); #endif #ifdef WITH_OPENSSL # ifndef SOAP_SSL_RSA_BITS # define SOAP_SSL_RSA_BITS 2048 # endif static int soap_ssl_init_done = 0; static int ssl_auth_init(struct soap*); static int ssl_verify_callback(int, X509_STORE_CTX*); static int ssl_verify_callback_allow_expired_certificate(int, X509_STORE_CTX*); static int ssl_password(char*, int, int, void *); #endif #ifdef WITH_GNUTLS # ifndef SOAP_SSL_RSA_BITS # define SOAP_SSL_RSA_BITS 2048 # endif static int soap_ssl_init_done = 0; static int ssl_auth_init(struct soap*); static const char *ssl_verify(struct soap *soap, const char *host); # if defined(HAVE_PTHREAD_H) # include /* make GNUTLS thread safe with pthreads */ GCRY_THREAD_OPTION_PTHREAD_IMPL; # elif defined(HAVE_PTH_H) #include /* make GNUTLS thread safe with PTH */ GCRY_THREAD_OPTION_PTH_IMPL; # endif #endif #ifdef WITH_SYSTEMSSL static int ssl_auth_init(struct soap*); static int ssl_recv(int sk, void *s, int n, char *user); static int ssl_send(int sk, void *s, int n, char *user); #endif #if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) #ifndef PALM_1 static const char *soap_decode(char*, size_t, const char*, const char*); #endif #endif #ifndef WITH_NOHTTP #ifndef PALM_1 static soap_wchar soap_getchunkchar(struct soap*); static const char *http_error(struct soap*, int); static int http_get(struct soap*); static int http_405(struct soap*); static int http_200(struct soap*); static int http_post(struct soap*, const char*, const char*, int, const char*, const char*, size_t); static int http_send_header(struct soap*, const char*); static int http_post_header(struct soap*, const char*, const char*); static int http_response(struct soap*, int, size_t); static int http_parse(struct soap*); static int http_parse_header(struct soap*, const char*, const char*); #endif #endif #ifndef WITH_NOIO #ifndef PALM_1 static int fsend(struct soap*, const char*, size_t); static size_t frecv(struct soap*, char*, size_t); static int tcp_init(struct soap*); static const char *tcp_error(struct soap*); #ifndef WITH_IPV6 static int tcp_gethost(struct soap*, const char *addr, struct in_addr *inaddr); #endif static SOAP_SOCKET tcp_connect(struct soap*, const char *endpoint, const char *host, int port); static SOAP_SOCKET tcp_accept(struct soap*, SOAP_SOCKET, struct sockaddr*, int*); static int tcp_select(struct soap*, SOAP_SOCKET, int, int); static int tcp_disconnect(struct soap*); static int tcp_closesocket(struct soap*, SOAP_SOCKET); static int tcp_shutdownsocket(struct soap*, SOAP_SOCKET, int); static const char *soap_strerror(struct soap*); #endif #define SOAP_TCP_SELECT_RCV 0x1 #define SOAP_TCP_SELECT_SND 0x2 #define SOAP_TCP_SELECT_ERR 0x4 #define SOAP_TCP_SELECT_ALL 0x7 #if defined(WIN32) #define SOAP_SOCKBLOCK(fd) \ { u_long blocking = 0; \ ioctlsocket(fd, FIONBIO, &blocking); \ } #define SOAP_SOCKNONBLOCK(fd) \ { u_long nonblocking = 1; \ ioctlsocket(fd, FIONBIO, &nonblocking); \ } #elif defined(VXWORKS) #define SOAP_SOCKBLOCK(fd) \ { u_long blocking = 0; \ ioctl(fd, FIONBIO, (int)(&blocking)); \ } #define SOAP_SOCKNONBLOCK(fd) \ { u_long nonblocking = 1; \ ioctl(fd, FIONBIO, (int)(&nonblocking)); \ } #elif defined(__VMS) #define SOAP_SOCKBLOCK(fd) \ { int blocking = 0; \ ioctl(fd, FIONBIO, &blocking); \ } #define SOAP_SOCKNONBLOCK(fd) \ { int nonblocking = 1; \ ioctl(fd, FIONBIO, &nonblocking); \ } #elif defined(PALM) #define SOAP_SOCKBLOCK(fd) fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0)&~O_NONBLOCK); #define SOAP_SOCKNONBLOCK(fd) fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0)|O_NONBLOCK); #elif defined(SYMBIAN) #define SOAP_SOCKBLOCK(fd) \ { long blocking = 0; \ ioctl(fd, 0/*FIONBIO*/, &blocking); \ } #define SOAP_SOCKNONBLOCK(fd) \ { long nonblocking = 1; \ ioctl(fd, 0/*FIONBIO*/, &nonblocking); \ } #else #define SOAP_SOCKBLOCK(fd) fcntl(fd, F_SETFL, fcntl(fd, F_GETFL)&~O_NONBLOCK); #define SOAP_SOCKNONBLOCK(fd) fcntl(fd, F_SETFL, fcntl(fd, F_GETFL)|O_NONBLOCK); #endif #endif #if defined(PALM) && !defined(PALM_2) unsigned short errno; #endif #ifndef PALM_1 static const char soap_env1[42] = "http://schemas.xmlsoap.org/soap/envelope/"; static const char soap_enc1[42] = "http://schemas.xmlsoap.org/soap/encoding/"; static const char soap_env2[40] = "http://www.w3.org/2003/05/soap-envelope"; static const char soap_enc2[40] = "http://www.w3.org/2003/05/soap-encoding"; static const char soap_rpc[35] = "http://www.w3.org/2003/05/soap-rpc"; #endif #ifndef PALM_1 const union soap_double_nan soap_double_nan = {{0xFFFFFFFF, 0xFFFFFFFF}}; const char soap_base64o[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; const char soap_base64i[81] = "\76XXX\77\64\65\66\67\70\71\72\73\74\75XXXXXXX\00\01\02\03\04\05\06\07\10\11\12\13\14\15\16\17\20\21\22\23\24\25\26\27\30\31XXXXXX\32\33\34\35\36\37\40\41\42\43\44\45\46\47\50\51\52\53\54\55\56\57\60\61\62\63"; #endif #ifndef WITH_LEAN static const char soap_indent[21] = "\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"; /* Alternative indentation form for SOAP_XML_INDENT: static const char soap_indent[41] = "\n "; */ #endif #ifndef SOAP_CANARY # define SOAP_CANARY (0xC0DE) #endif static const char soap_padding[4] = "\0\0\0"; #define SOAP_STR_PADDING (soap_padding) #define SOAP_STR_EOS (soap_padding) #define SOAP_NON_NULL (soap_padding) #ifndef WITH_LEAN static const struct soap_code_map html_entity_codes[] = /* entities for XHTML parsing */ { { 160, "nbsp" }, { 161, "iexcl" }, { 162, "cent" }, { 163, "pound" }, { 164, "curren" }, { 165, "yen" }, { 166, "brvbar" }, { 167, "sect" }, { 168, "uml" }, { 169, "copy" }, { 170, "ordf" }, { 171, "laquo" }, { 172, "not" }, { 173, "shy" }, { 174, "reg" }, { 175, "macr" }, { 176, "deg" }, { 177, "plusmn" }, { 178, "sup2" }, { 179, "sup3" }, { 180, "acute" }, { 181, "micro" }, { 182, "para" }, { 183, "middot" }, { 184, "cedil" }, { 185, "sup1" }, { 186, "ordm" }, { 187, "raquo" }, { 188, "frac14" }, { 189, "frac12" }, { 190, "frac34" }, { 191, "iquest" }, { 192, "Agrave" }, { 193, "Aacute" }, { 194, "Acirc" }, { 195, "Atilde" }, { 196, "Auml" }, { 197, "Aring" }, { 198, "AElig" }, { 199, "Ccedil" }, { 200, "Egrave" }, { 201, "Eacute" }, { 202, "Ecirc" }, { 203, "Euml" }, { 204, "Igrave" }, { 205, "Iacute" }, { 206, "Icirc" }, { 207, "Iuml" }, { 208, "ETH" }, { 209, "Ntilde" }, { 210, "Ograve" }, { 211, "Oacute" }, { 212, "Ocirc" }, { 213, "Otilde" }, { 214, "Ouml" }, { 215, "times" }, { 216, "Oslash" }, { 217, "Ugrave" }, { 218, "Uacute" }, { 219, "Ucirc" }, { 220, "Uuml" }, { 221, "Yacute" }, { 222, "THORN" }, { 223, "szlig" }, { 224, "agrave" }, { 225, "aacute" }, { 226, "acirc" }, { 227, "atilde" }, { 228, "auml" }, { 229, "aring" }, { 230, "aelig" }, { 231, "ccedil" }, { 232, "egrave" }, { 233, "eacute" }, { 234, "ecirc" }, { 235, "euml" }, { 236, "igrave" }, { 237, "iacute" }, { 238, "icirc" }, { 239, "iuml" }, { 240, "eth" }, { 241, "ntilde" }, { 242, "ograve" }, { 243, "oacute" }, { 244, "ocirc" }, { 245, "otilde" }, { 246, "ouml" }, { 247, "divide" }, { 248, "oslash" }, { 249, "ugrave" }, { 250, "uacute" }, { 251, "ucirc" }, { 252, "uuml" }, { 253, "yacute" }, { 254, "thorn" }, { 255, "yuml" }, { 0, NULL } }; #endif #ifndef WITH_NOIO #ifndef WITH_LEAN static const struct soap_code_map h_error_codes[] = { #ifdef HOST_NOT_FOUND { HOST_NOT_FOUND, "Host not found" }, #endif #ifdef TRY_AGAIN { TRY_AGAIN, "Try Again" }, #endif #ifdef NO_RECOVERY { NO_RECOVERY, "No Recovery" }, #endif #ifdef NO_DATA { NO_DATA, "No Data" }, #endif #ifdef NO_ADDRESS { NO_ADDRESS, "No Address" }, #endif { 0, NULL } }; #endif #endif #ifndef WITH_NOHTTP #ifndef WITH_LEAN static const struct soap_code_map h_http_error_codes[] = { { 200, "OK" }, { 201, "Created" }, { 202, "Accepted" }, { 203, "Non-Authoritative Information" }, { 204, "No Content" }, { 205, "Reset Content" }, { 206, "Partial Content" }, { 300, "Multiple Choices" }, { 301, "Moved Permanently" }, { 302, "Found" }, { 303, "See Other" }, { 304, "Not Modified" }, { 305, "Use Proxy" }, { 307, "Temporary Redirect" }, { 400, "Bad Request" }, { 401, "Unauthorized" }, { 402, "Payment Required" }, { 403, "Forbidden" }, { 404, "Not Found" }, { 405, "Method Not Allowed" }, { 406, "Not Acceptable" }, { 407, "Proxy Authentication Required" }, { 408, "Request Time-out" }, { 409, "Conflict" }, { 410, "Gone" }, { 411, "Length Required" }, { 412, "Precondition Failed" }, { 413, "Request Entity Too Large" }, { 414, "Request-URI Too Large" }, { 415, "Unsupported Media Type" }, { 416, "Requested range not satisfiable" }, { 417, "Expectation Failed" }, { 500, "Internal Server Error" }, { 501, "Not Implemented" }, { 502, "Bad Gateway" }, { 503, "Service Unavailable" }, { 504, "Gateway Time-out" }, { 505, "HTTP Version not supported" }, { 0, NULL } }; #endif #endif #ifdef WITH_OPENSSL static const struct soap_code_map h_ssl_error_codes[] = { #define _SSL_ERROR(e) { e, #e } _SSL_ERROR(SSL_ERROR_SSL), _SSL_ERROR(SSL_ERROR_ZERO_RETURN), _SSL_ERROR(SSL_ERROR_WANT_READ), _SSL_ERROR(SSL_ERROR_WANT_WRITE), _SSL_ERROR(SSL_ERROR_WANT_CONNECT), _SSL_ERROR(SSL_ERROR_WANT_X509_LOOKUP), _SSL_ERROR(SSL_ERROR_SYSCALL), { 0, NULL } }; #endif #ifndef WITH_LEANER static const struct soap_code_map mime_codes[] = { { SOAP_MIME_7BIT, "7bit" }, { SOAP_MIME_8BIT, "8bit" }, { SOAP_MIME_BINARY, "binary" }, { SOAP_MIME_QUOTED_PRINTABLE, "quoted-printable" }, { SOAP_MIME_BASE64, "base64" }, { SOAP_MIME_IETF_TOKEN, "ietf-token" }, { SOAP_MIME_X_TOKEN, "x-token" }, { 0, NULL } }; #endif #ifdef WIN32 static int tcp_done = 0; #endif #if defined(HP_UX) && defined(HAVE_GETHOSTBYNAME_R) extern int h_errno; #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 static int fsend(struct soap *soap, const char *s, size_t n) { int nwritten, err; SOAP_SOCKET sk; #if defined(__cplusplus) && !defined(WITH_COMPAT) if (soap->os) { soap->os->write(s, (std::streamsize)n); if (soap->os->good()) return SOAP_OK; soap->errnum = 0; return SOAP_EOF; } #endif sk = soap->sendsk; if (!soap_valid_socket(sk)) sk = soap->socket; while (n) { if (soap_valid_socket(sk)) { if (soap->send_timeout) { for (;;) { int r; #ifdef WITH_OPENSSL if (soap->ssl) r = tcp_select(soap, sk, SOAP_TCP_SELECT_ALL, soap->send_timeout); else #endif #ifdef WITH_GNUTLS if (soap->session) r = tcp_select(soap, sk, SOAP_TCP_SELECT_ALL, soap->send_timeout); else #endif #ifdef WITH_SYSTEMSSL if (soap->ssl) r = tcp_select(soap, sk, SOAP_TCP_SELECT_ALL, soap->send_timeout); else #endif r = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, soap->send_timeout); if (r > 0) break; if (!r) return SOAP_EOF; err = soap->errnum; if (!err) return soap->error; if (err != SOAP_EAGAIN && err != SOAP_EWOULDBLOCK) return SOAP_EOF; } } #ifdef WITH_OPENSSL if (soap->ssl) nwritten = SSL_write(soap->ssl, s, (int)n); else if (soap->bio) nwritten = BIO_write(soap->bio, s, (int)n); else #endif #ifdef WITH_GNUTLS if (soap->session) nwritten = gnutls_record_send(soap->session, s, n); else #endif #ifdef WITH_SYSTEMSSL if (soap->ssl) { err = gsk_secure_socket_write(soap->ssl, (char*)s, n, &nwritten); if (err != GSK_OK) nwritten = 0; } else #endif #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) { if (soap->peerlen) nwritten = sendto(sk, (char*)s, (SOAP_WINSOCKINT)n, soap->socket_flags, &soap->peer.addr, (SOAP_WINSOCKINT)soap->peerlen); else nwritten = send(sk, s, (SOAP_WINSOCKINT)n, soap->socket_flags); /* retry and back-off algorithm */ /* TODO: this is not very clear from specs so verify and limit conditions under which we should loop (e.g. ENOBUFS) */ if (nwritten < 0) { int udp_repeat; int udp_delay; if ((soap->connect_flags & SO_BROADCAST)) udp_repeat = 2; /* SOAP-over-UDP MULTICAST_UDP_REPEAT - 1 */ else udp_repeat = 1; /* SOAP-over-UDP UNICAST_UDP_REPEAT - 1 */ udp_delay = ((unsigned int)soap_random % 201) + 50; /* UDP_MIN_DELAY .. UDP_MAX_DELAY */ do { tcp_select(soap, sk, SOAP_TCP_SELECT_ERR, -1000 * udp_delay); if (soap->peerlen) nwritten = sendto(sk, (char*)s, (SOAP_WINSOCKINT)n, soap->socket_flags, &soap->peer.addr, (SOAP_WINSOCKINT)soap->peerlen); else nwritten = send(sk, s, (SOAP_WINSOCKINT)n, soap->socket_flags); udp_delay <<= 1; if (udp_delay > 500) /* UDP_UPPER_DELAY */ udp_delay = 500; } while (nwritten < 0 && --udp_repeat > 0); } if (nwritten < 0) { err = soap_socket_errno(sk); if (err && err != SOAP_EINTR) { soap->errnum = err; return SOAP_EOF; } nwritten = 0; /* and call write() again */ } } else #endif #if !defined(PALM) && !defined(AS400) nwritten = send(sk, s, (int)n, soap->socket_flags); #else nwritten = send(sk, (void*)s, n, soap->socket_flags); #endif if (nwritten <= 0) { int r = 0; err = soap_socket_errno(sk); #ifdef WITH_OPENSSL if (soap->ssl && (r = SSL_get_error(soap->ssl, nwritten)) != SSL_ERROR_NONE && r != SSL_ERROR_WANT_READ && r != SSL_ERROR_WANT_WRITE) { soap->errnum = err; return SOAP_EOF; } #endif #ifdef WITH_GNUTLS if (soap->session) { if (nwritten == GNUTLS_E_INTERRUPTED) err = SOAP_EINTR; else if (nwritten == GNUTLS_E_AGAIN) err = SOAP_EAGAIN; } #endif if (err == SOAP_EWOULDBLOCK || err == SOAP_EAGAIN) { #if defined(WITH_OPENSSL) if (soap->ssl && r == SSL_ERROR_WANT_READ) r = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, soap->send_timeout ? soap->send_timeout : -10000); else #elif defined(WITH_GNUTLS) if (soap->session && !gnutls_record_get_direction(soap->session)) r = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, soap->send_timeout ? soap->send_timeout : -10000); else #endif r = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, soap->send_timeout ? soap->send_timeout : -10000); if (!r && soap->send_timeout) return SOAP_EOF; if (r < 0) return SOAP_EOF; } else if (err && err != SOAP_EINTR) { soap->errnum = err; return SOAP_EOF; } nwritten = 0; /* and call write() again */ } } else { #ifdef WITH_FASTCGI nwritten = fwrite((void*)s, 1, n, stdout); fflush(stdout); #else #ifdef UNDER_CE nwritten = fwrite(s, 1, n, soap->sendfd); #else #ifdef VXWORKS #ifdef WMW_RPM_IO if (soap->rpmreqid) nwritten = (httpBlockPut(soap->rpmreqid, (char*)s, n) == 0) ? n : -1; else #endif nwritten = fwrite(s, sizeof(char), n, fdopen(soap->sendfd, "w")); #else #ifdef WIN32 nwritten = _write(soap->sendfd, s, (unsigned int)n); #else nwritten = write(soap->sendfd, s, (unsigned int)n); #endif #endif #endif #endif if (nwritten <= 0) { #ifndef WITH_FASTCGI err = soap_errno; #else err = EOF; #endif if (err && err != SOAP_EINTR && err != SOAP_EWOULDBLOCK && err != SOAP_EAGAIN) { soap->errnum = err; return SOAP_EOF; } nwritten = 0; /* and call write() again */ } } n -= nwritten; s += nwritten; } return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_send_raw(struct soap *soap, const char *s, size_t n) { if (!n) return SOAP_OK; #ifndef WITH_LEANER if (soap->fpreparesend && (soap->mode & SOAP_IO) != SOAP_IO_STORE && (soap->mode & SOAP_IO_LENGTH) && (soap->error = soap->fpreparesend(soap, s, n))) return soap->error; if (soap->ffiltersend && (soap->error = soap->ffiltersend(soap, &s, &n))) return soap->error; #endif if ((soap->mode & SOAP_IO_LENGTH)) soap->count += n; else if (soap->mode & SOAP_IO) { size_t i = sizeof(soap->buf) - soap->bufidx; while (n >= i) { soap_memcpy((void*)(soap->buf + soap->bufidx), i, (const void*)s, i); soap->bufidx = sizeof(soap->buf); if (soap_flush(soap)) return soap->error; s += i; n -= i; i = sizeof(soap->buf); } soap_memcpy((void*)(soap->buf + soap->bufidx), sizeof(soap->buf) - soap->bufidx, (const void*)s, n); soap->bufidx += n; } else return soap_flush_raw(soap, s, n); return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_flush(struct soap *soap) { size_t n = soap->bufidx; if (n) { #ifndef WITH_LEANER if ((soap->mode & SOAP_IO) == SOAP_IO_STORE) { int r; if (soap->fpreparesend && (r = soap->fpreparesend(soap, soap->buf, n))) return soap->error = r; } #endif soap->bufidx = 0; #ifdef WITH_ZLIB if (soap->mode & SOAP_ENC_ZLIB) { soap->d_stream->next_in = (Byte*)soap->buf; soap->d_stream->avail_in = (unsigned int)n; #ifdef WITH_GZIP soap->z_crc = crc32(soap->z_crc, (Byte*)soap->buf, (unsigned int)n); #endif do { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Deflating %u bytes\n", soap->d_stream->avail_in)); if (deflate(soap->d_stream, Z_NO_FLUSH) != Z_OK) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unable to deflate: %s\n", soap->d_stream->msg ? soap->d_stream->msg : SOAP_STR_EOS)); return soap->error = SOAP_ZLIB_ERROR; } if (!soap->d_stream->avail_out) { if (soap_flush_raw(soap, soap->z_buf, sizeof(soap->buf))) return soap->error; soap->d_stream->next_out = (Byte*)soap->z_buf; soap->d_stream->avail_out = sizeof(soap->buf); } } while (soap->d_stream->avail_in); } else #endif return soap_flush_raw(soap, soap->buf, n); } return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_flush_raw(struct soap *soap, const char *s, size_t n) { if ((soap->mode & SOAP_IO) == SOAP_IO_STORE) { void *t; if (!(t = soap_push_block(soap, NULL, n))) return soap->error = SOAP_EOM; soap_memcpy(t, n, (const void*)s, n); return SOAP_OK; } #ifndef WITH_LEANER if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK) { char t[24]; (SOAP_SNPRINTF(t, sizeof(t), 20), &"\r\n%lX\r\n"[soap->chunksize ? 0 : 2], (unsigned long)n); DBGMSG(SENT, t, strlen(t)); if ((soap->error = soap->fsend(soap, t, strlen(t)))) return soap->error; soap->chunksize += n; } DBGMSG(SENT, s, n); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Send %u bytes to socket=%d/fd=%d\n", (unsigned int)n, soap->socket, soap->sendfd)); #endif return soap->error = soap->fsend(soap, s, n); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_send(struct soap *soap, const char *s) { if (s) return soap_send_raw(soap, s, strlen(s)); return SOAP_OK; } #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_send2(struct soap *soap, const char *s1, const char *s2) { if (soap_send(soap, s1)) return soap->error; return soap_send(soap, s2); } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_send3(struct soap *soap, const char *s1, const char *s2, const char *s3) { if (soap_send(soap, s1) || soap_send(soap, s2)) return soap->error; return soap_send(soap, s3); } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 static size_t frecv(struct soap *soap, char *s, size_t n) { int r; int retries = 100; /* max 100 retries with non-blocking sockets */ SOAP_SOCKET sk; soap->errnum = 0; #if defined(__cplusplus) && !defined(WITH_COMPAT) if (soap->is) /* recv from C++ stream */ { if (soap->is->good()) return (size_t)soap->is->read(s, (std::streamsize)n).gcount(); return 0; } #else if (soap->is) /* recv from C buffer until NUL */ { size_t l = strlen(soap->is); if (l > n) l = n; soap_memcpy(s, n, soap->is, l); soap->is += l; return l; } #endif sk = soap->recvsk; if (!soap_valid_socket(sk)) sk = soap->socket; if (soap_valid_socket(sk)) { for (;;) { #if defined(WITH_OPENSSL) || defined(WITH_SYSTEMSSL) int err = 0; #endif #ifdef WITH_OPENSSL if (soap->recv_timeout && !soap->ssl) /* OpenSSL: sockets are nonblocking */ #else if (soap->recv_timeout) #endif { for (;;) { r = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, soap->recv_timeout); if (r > 0) break; if (!r) return 0; r = soap->errnum; if (r != SOAP_EAGAIN && r != SOAP_EWOULDBLOCK) return 0; } } #ifdef WITH_OPENSSL if (soap->ssl) { r = SSL_read(soap->ssl, s, (int)n); if (r > 0) return (size_t)r; err = SSL_get_error(soap->ssl, r); if (err != SSL_ERROR_NONE && err != SSL_ERROR_WANT_READ && err != SSL_ERROR_WANT_WRITE) return 0; } else if (soap->bio) { r = BIO_read(soap->bio, s, (int)n); if (r > 0) return (size_t)r; return 0; } else #endif #ifdef WITH_GNUTLS if (soap->session) { r = (int)gnutls_record_recv(soap->session, s, n); if (r >= 0) return (size_t)r; } else #endif #ifdef WITH_SYSTEMSSL if (soap->ssl) { err = gsk_secure_socket_read(soap->ssl, s, n, &r); if (err == GSK_OK && r > 0) return (size_t)r; if (err != GSK_OK && err != GSK_WOULD_BLOCK && err != GSK_WOULD_BLOCK_WRITE) return 0; } else #endif { #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) { SOAP_SOCKLEN_T k = (SOAP_SOCKLEN_T)sizeof(soap->peer); memset((void*)&soap->peer, 0, sizeof(soap->peer)); r = recvfrom(sk, s, (SOAP_WINSOCKINT)n, soap->socket_flags, &soap->peer.addr, &k); /* portability note: see SOAP_SOCKLEN_T definition in stdsoap2.h */ soap->peerlen = (size_t)k; #ifndef WITH_IPV6 soap->ip = ntohl(soap->peer.in.sin_addr.s_addr); #endif } else #endif r = recv(sk, s, (SOAP_WINSOCKINT)n, soap->socket_flags); #ifdef PALM /* CycleSyncDisplay(curStatusMsg); */ #endif if (r >= 0) return (size_t)r; r = soap_socket_errno(sk); if (r != SOAP_EINTR && r != SOAP_EAGAIN && r != SOAP_EWOULDBLOCK) { soap->errnum = r; return 0; } } #if defined(WITH_OPENSSL) if (soap->ssl && err == SSL_ERROR_WANT_WRITE) r = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, soap->recv_timeout ? soap->recv_timeout : 5); else #elif defined(WITH_GNUTLS) if (soap->session && gnutls_record_get_direction(soap->session)) r = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, soap->recv_timeout ? soap->recv_timeout : 5); else #elif defined(WITH_SYSTEMSSL) if (soap->ssl && err == GSK_WOULD_BLOCK_WRITE) r = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, soap->recv_timeout ? soap->recv_timeout : 5); else #endif r = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, soap->recv_timeout ? soap->recv_timeout : 5); if (!r && soap->recv_timeout) return 0; if (r < 0) { r = soap->errnum; if (r != SOAP_EAGAIN && r != SOAP_EWOULDBLOCK) return 0; } if (retries-- <= 0) return 0; #ifdef PALM r = soap_socket_errno(sk); if (r != SOAP_EINTR && retries-- <= 0) { soap->errnum = r; return 0; } #endif } } #ifdef WITH_FASTCGI return fread(s, 1, n, stdin); #else #ifdef UNDER_CE return fread(s, 1, n, soap->recvfd); #else #ifdef WMW_RPM_IO if (soap->rpmreqid) r = httpBlockRead(soap->rpmreqid, s, n); else #endif #ifdef WIN32 r = _read(soap->recvfd, s, (unsigned int)n); #else r = read(soap->recvfd, s, n); #endif if (r >= 0) return (size_t)r; soap->errnum = soap_errno; return 0; #endif #endif } #endif #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 static soap_wchar soap_getchunkchar(struct soap *soap) { if (soap->bufidx < soap->buflen) return soap->buf[soap->bufidx++]; soap->bufidx = 0; soap->buflen = soap->chunkbuflen = soap->frecv(soap, soap->buf, sizeof(soap->buf)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Read %u bytes from socket=%d/fd=%d\n", (unsigned int)soap->buflen, soap->socket, soap->recvfd)); DBGMSG(RECV, soap->buf, soap->buflen); if (soap->buflen) return soap->buf[soap->bufidx++]; return EOF; } #endif #endif /******************************************************************************/ #ifndef PALM_1 static int soap_isxdigit(int c) { return (c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f'); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_recv_raw(struct soap *soap) { size_t ret; #if !defined(WITH_LEANER) || defined(WITH_ZLIB) int r; #endif #ifdef WITH_ZLIB if ((soap->mode & SOAP_ENC_ZLIB) && soap->d_stream) { if (soap->d_stream->next_out == Z_NULL) { soap->bufidx = soap->buflen = 0; return EOF; } if (soap->d_stream->avail_in || !soap->d_stream->avail_out) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflating\n")); soap->d_stream->next_out = (Byte*)soap->buf; soap->d_stream->avail_out = sizeof(soap->buf); r = inflate(soap->d_stream, Z_NO_FLUSH); if (r == Z_NEED_DICT && soap->z_dict) r = inflateSetDictionary(soap->d_stream, (const Bytef*)soap->z_dict, soap->z_dict_len); if (r == Z_OK || r == Z_STREAM_END) { soap->bufidx = 0; ret = soap->buflen = sizeof(soap->buf) - soap->d_stream->avail_out; if (soap->zlib_in == SOAP_ZLIB_GZIP) soap->z_crc = crc32(soap->z_crc, (Byte*)soap->buf, (unsigned int)ret); if (r == Z_STREAM_END) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflated %lu->%lu bytes\n", soap->d_stream->total_in, soap->d_stream->total_out)); soap->z_ratio_in = (float)soap->d_stream->total_in / (float)soap->d_stream->total_out; soap->d_stream->next_out = Z_NULL; } if (ret) { soap->count += ret; if (soap->count > SOAP_MAXINFLATESIZE && soap->z_ratio_in < SOAP_MINDEFLATERATIO) { soap->d_stream->msg = (char*)"caught SOAP_MINDEFLATERATIO explosive decompression guard (remedy: increase SOAP_MAXINFLATESIZE and/or decrease SOAP_MINDEFLATERATIO)"; return soap->error = SOAP_ZLIB_ERROR; } DBGLOG(RECV, SOAP_MESSAGE(fdebug, "\n---- decompressed ----\n")); DBGMSG(RECV, soap->buf, ret); DBGLOG(RECV, SOAP_MESSAGE(fdebug, "\n----\n")); #ifndef WITH_LEANER if (soap->fpreparerecv && (r = soap->fpreparerecv(soap, soap->buf, ret))) return soap->error = r; #endif return SOAP_OK; } } else if (r != Z_BUF_ERROR) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflate error: %s\n", soap->d_stream->msg ? soap->d_stream->msg : SOAP_STR_EOS)); soap->d_stream->next_out = Z_NULL; return soap->error = SOAP_ZLIB_ERROR; } } zlib_again: if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK && !soap->chunksize) { soap_memcpy((void*)soap->buf, sizeof(soap->buf), (const void*)soap->z_buf, sizeof(soap->buf)); soap->buflen = soap->z_buflen; } DBGLOG(RECV, SOAP_MESSAGE(fdebug, "\n---- compressed ----\n")); } #endif #ifndef WITH_NOHTTP if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK) /* read HTTP chunked transfer */ { for (;;) { soap_wchar c; char *t, tmp[17]; if (soap->chunksize) { soap->buflen = ret = soap->frecv(soap, soap->buf, soap->chunksize > sizeof(soap->buf) ? sizeof(soap->buf) : soap->chunksize); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Getting chunk: read %u bytes\n", (unsigned int)ret)); DBGMSG(RECV, soap->buf, ret); soap->bufidx = 0; soap->chunksize -= ret; break; } t = tmp; if (!soap->chunkbuflen) { soap->chunkbuflen = ret = soap->frecv(soap, soap->buf, sizeof(soap->buf)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Read %u bytes (chunked) from socket=%d\n", (unsigned int)ret, soap->socket)); DBGMSG(RECV, soap->buf, ret); soap->bufidx = 0; if (!ret) { soap->ahead = EOF; return EOF; } } else soap->bufidx = soap->buflen; soap->buflen = soap->chunkbuflen; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Getting chunk size (idx=%u len=%u)\n", (unsigned int)soap->bufidx, (unsigned int)soap->buflen)); while (!soap_isxdigit((int)(c = soap_getchunkchar(soap)))) { if ((int)c == EOF) { soap->ahead = EOF; return EOF; } } do *t++ = (char)c; while (soap_isxdigit((int)(c = soap_getchunkchar(soap))) && (size_t)(t - tmp) < sizeof(tmp)-1); while ((int)c != EOF && c != '\n') c = soap_getchunkchar(soap); if ((int)c == EOF) { soap->ahead = EOF; return EOF; } *t = '\0'; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Chunk size = %s (hex)\n", tmp)); soap->chunksize = (size_t)soap_strtoul(tmp, &t, 16); if (!soap->chunksize) { soap->bufidx = soap->buflen = soap->chunkbuflen = 0; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of chunked message\n")); while ((int)c != EOF && c != '\n') c = soap_getchunkchar(soap); ret = 0; soap->ahead = EOF; break; } soap->buflen = soap->bufidx + soap->chunksize; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Moving buf len to idx=%u len=%u (%s)\n", (unsigned int)soap->bufidx, (unsigned int)soap->buflen, tmp)); if (soap->buflen > soap->chunkbuflen) { soap->buflen = soap->chunkbuflen; soap->chunksize -= soap->buflen - soap->bufidx; soap->chunkbuflen = 0; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Passed end of buffer for chunked HTTP (%u bytes left)\n", (unsigned int)(soap->buflen - soap->bufidx))); } else if (soap->chunkbuflen) soap->chunksize = 0; ret = soap->buflen - soap->bufidx; if (ret) break; } } else #endif { soap->bufidx = 0; soap->buflen = ret = soap->frecv(soap, soap->buf, sizeof(soap->buf)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Read %u bytes from socket=%d/fd=%d\n", (unsigned int)ret, soap->socket, soap->recvfd)); DBGMSG(RECV, soap->buf, ret); } #ifdef WITH_ZLIB if (soap->mode & SOAP_ENC_ZLIB) { soap_memcpy((void*)soap->z_buf, sizeof(soap->buf), (const void*)soap->buf, sizeof(soap->buf)); soap->d_stream->next_in = (Byte*)(soap->z_buf + soap->bufidx); soap->d_stream->avail_in = (unsigned int)ret; soap->d_stream->next_out = (Byte*)soap->buf; soap->d_stream->avail_out = sizeof(soap->buf); r = inflate(soap->d_stream, Z_NO_FLUSH); if (r == Z_NEED_DICT && soap->z_dict) r = inflateSetDictionary(soap->d_stream, (const Bytef*)soap->z_dict, soap->z_dict_len); if (r == Z_OK || r == Z_STREAM_END) { soap->bufidx = 0; soap->z_buflen = soap->buflen; soap->buflen = sizeof(soap->buf) - soap->d_stream->avail_out; if (soap->zlib_in == SOAP_ZLIB_GZIP) soap->z_crc = crc32(soap->z_crc, (Byte*)soap->buf, (unsigned int)soap->buflen); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflated %u bytes\n", (unsigned int)soap->buflen)); if (ret && !soap->buflen && r != Z_STREAM_END) goto zlib_again; ret = soap->buflen; if (r == Z_STREAM_END) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflated total %lu->%lu bytes\n", soap->d_stream->total_in, soap->d_stream->total_out)); soap->z_ratio_in = (float)soap->d_stream->total_in / (float)soap->d_stream->total_out; soap->d_stream->next_out = Z_NULL; } if (soap->count + ret > SOAP_MAXINFLATESIZE && soap->z_ratio_in < SOAP_MINDEFLATERATIO) { soap->d_stream->msg = (char*)"caught SOAP_MINDEFLATERATIO explosive decompression guard (remedy: increase SOAP_MAXINFLATESIZE and/or decrease SOAP_MINDEFLATERATIO)"; return soap->error = SOAP_ZLIB_ERROR; } DBGLOG(RECV, SOAP_MESSAGE(fdebug, "\n---- decompressed ----\n")); DBGMSG(RECV, soap->buf, ret); #ifndef WITH_LEANER if (soap->fpreparerecv && (r = soap->fpreparerecv(soap, soap->buf, ret))) return soap->error = r; #endif } else { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unable to inflate: (%d) %s\n", r, soap->d_stream->msg ? soap->d_stream->msg : SOAP_STR_EOS)); soap->d_stream->next_out = Z_NULL; return soap->error = SOAP_ZLIB_ERROR; } } #endif #ifndef WITH_LEANER if (soap->fpreparerecv #ifdef WITH_ZLIB && soap->zlib_in == SOAP_ZLIB_NONE #endif && (r = soap->fpreparerecv(soap, soap->buf + soap->bufidx, ret))) return soap->error = r; #endif if (ret) { soap->count += ret; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Read count=%lu (+%lu)\n", (unsigned long)soap->count, (unsigned long)ret)); return SOAP_OK; } return EOF; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_recv(struct soap *soap) { #ifndef WITH_LEANER if (soap->mode & SOAP_ENC_DIME) { if (soap->dime.buflen) { char *s; int i; unsigned char tmp[12]; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DIME hdr for chunked DIME is in buffer\n")); soap->count += soap->dime.buflen - soap->buflen; soap->buflen = soap->dime.buflen; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Skip padding (%ld bytes)\n", -(long)soap->dime.size&3)); for (i = -(long)soap->dime.size&3; i > 0; i--) { soap->bufidx++; if (soap->bufidx >= soap->buflen) if (soap_recv_raw(soap)) return EOF; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get DIME hdr for next chunk\n")); s = (char*)tmp; for (i = 12; i > 0; i--) { *s++ = soap->buf[soap->bufidx++]; if (soap->bufidx >= soap->buflen) if (soap_recv_raw(soap)) return EOF; } soap->dime.flags = tmp[0] & 0x7; soap->dime.size = ((size_t)tmp[8] << 24) | ((size_t)tmp[9] << 16) | ((size_t)tmp[10] << 8) | ((size_t)tmp[11]); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get DIME chunk (%u bytes)\n", (unsigned int)soap->dime.size)); if (soap->dime.flags & SOAP_DIME_CF) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "More chunking\n")); soap->dime.chunksize = soap->dime.size; if (soap->buflen - soap->bufidx >= soap->dime.size) { soap->dime.buflen = soap->buflen; soap->buflen = soap->bufidx + soap->dime.chunksize; } else soap->dime.chunksize -= soap->buflen - soap->bufidx; } else { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Last chunk\n")); soap->dime.buflen = 0; soap->dime.chunksize = 0; } soap->count = soap->buflen - soap->bufidx; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%u bytes remaining\n", (unsigned int)soap->count)); return SOAP_OK; } if (soap->dime.chunksize) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get next DIME hdr for chunked DIME (%u bytes chunk)\n", (unsigned int)soap->dime.chunksize)); if (soap_recv_raw(soap)) return EOF; if (soap->buflen - soap->bufidx >= soap->dime.chunksize) { soap->dime.buflen = soap->buflen; soap->count -= soap->buflen - soap->bufidx - soap->dime.chunksize; soap->buflen = soap->bufidx + soap->dime.chunksize; } else soap->dime.chunksize -= soap->buflen - soap->bufidx; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%lu bytes remaining, count=%lu\n", (unsigned long)(soap->buflen-soap->bufidx), (unsigned long)soap->count)); return SOAP_OK; } } while (soap->ffilterrecv) { int err; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Filter recverror = %d\n", soap->recverror)); if (soap->recverror) soap->bufidx = soap->buflen = 0; else { soap->recverror = soap_recv_raw(soap); /* do not call again after EOF */ soap->buflen -= soap->bufidx; /* chunked may set bufidx > 0 to skip hex chunk length */ } if ((err = soap->ffilterrecv(soap, soap->buf + soap->bufidx, &soap->buflen, sizeof(soap->buf) - soap->bufidx))) return soap->error = err; if (soap->buflen) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Filtered %lu\n", (unsigned long)soap->buflen)); soap->buflen += soap->bufidx; return SOAP_OK; } if (soap->recverror) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Returning postponed EOF%d\n", soap->recverror)); return soap->recverror; } } return soap->recverror = soap_recv_raw(soap); #else return soap_recv_raw(soap); #endif } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 soap_wchar SOAP_FMAC2 soap_getchar(struct soap *soap) { soap_wchar c; c = soap->ahead; if (c) { if (c != EOF) soap->ahead = 0; return c; } return soap_get1(soap); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 const struct soap_code_map* SOAP_FMAC2 soap_code(const struct soap_code_map *code_map, const char *str) { if (code_map && str) { while (code_map->string) { if (!strcmp(str, code_map->string)) /* case sensitive */ return code_map; code_map++; } } return NULL; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 LONG64 SOAP_FMAC2 soap_code_int(const struct soap_code_map *code_map, const char *str, LONG64 other) { if (code_map) { while (code_map->string) { if (!soap_tag_cmp(str, code_map->string)) /* case insensitive */ return code_map->code; code_map++; } } return other; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 const char* SOAP_FMAC2 soap_code_str(const struct soap_code_map *code_map, long code) { if (!code_map) return NULL; while (code_map->code != code && code_map->string) code_map++; return code_map->string; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 LONG64 SOAP_FMAC2 soap_code_bits(const struct soap_code_map *code_map, const char *str) { LONG64 bits = 0; if (code_map) { while (str && *str) { const struct soap_code_map *p; for (p = code_map; p->string; p++) { size_t n = strlen(p->string); if (!strncmp(p->string, str, n) && soap_blank((soap_wchar)str[n])) { bits |= p->code; str += n; while (*str > 0 && *str <= 32) str++; break; } } if (!p->string) return 0; } } return bits; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 const char* SOAP_FMAC2 soap_code_list(struct soap *soap, const struct soap_code_map *code_map, long code) { char *t = soap->tmpbuf; if (code_map) { while (code_map->string) { if (code_map->code & code) { const char *s = code_map->string; if (t != soap->tmpbuf) *t++ = ' '; while (*s && t < soap->tmpbuf + sizeof(soap->tmpbuf) - 1) *t++ = *s++; if (t == soap->tmpbuf + sizeof(soap->tmpbuf) - 1) break; } code_map++; } } *t = '\0'; return soap->tmpbuf; } #endif /******************************************************************************/ #ifndef PALM_1 static soap_wchar soap_char(struct soap *soap) { char tmp[8]; int i; soap_wchar c; char *s = tmp; for (i = 0; i < 7; i++) { c = soap_get1(soap); if (c == ';' || (int)c == EOF) break; *s++ = (char)c; } *s = '\0'; if (*tmp == '#') { if (tmp[1] == 'x' || tmp[1] == 'X') return (soap_wchar)soap_strtol(tmp + 2, NULL, 16); return (soap_wchar)soap_strtol(tmp + 1, NULL, 10); } if (!strcmp(tmp, "lt")) return '<'; if (!strcmp(tmp, "gt")) return '>'; if (!strcmp(tmp, "amp")) return '&'; if (!strcmp(tmp, "quot")) return '"'; if (!strcmp(tmp, "apos")) return '\''; #ifndef WITH_LEAN return (soap_wchar)soap_code_int(html_entity_codes, tmp, (LONG64)SOAP_UNKNOWN_CHAR); #else return SOAP_UNKNOWN_CHAR; /* use this to represent unknown code */ #endif } #endif /******************************************************************************/ #ifdef WITH_LEAN #ifndef PALM_1 soap_wchar soap_get0(struct soap *soap) { if (soap->bufidx >= soap->buflen && soap_recv(soap)) return EOF; return (unsigned char)soap->buf[soap->bufidx]; } #endif #endif /******************************************************************************/ #ifdef WITH_LEAN #ifndef PALM_1 soap_wchar soap_get1(struct soap *soap) { if (soap->bufidx >= soap->buflen && soap_recv(soap)) return EOF; return (unsigned char)soap->buf[soap->bufidx++]; } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 soap_wchar SOAP_FMAC2 soap_get(struct soap *soap) { soap_wchar c; c = soap->ahead; if (c) { if ((int)c != EOF) soap->ahead = 0; } else c = soap_get1(soap); while ((int)c != EOF) { if (soap->cdata) { if (c == ']') { c = soap_get1(soap); if (c == ']') { c = soap_get0(soap); if (c == '>') { soap->cdata = 0; c = soap_get1(soap); c = soap_get1(soap); } else { soap_unget(soap, ']'); return ']'; } } else { soap_revget1(soap); return ']'; } } else return c; } switch (c) { case '<': do c = soap_get1(soap); while (soap_blank(c)); if (c == '!' || c == '?' || c == '%') { int k = 1; if (c == '!') { c = soap_get1(soap); if (c == '[') { do c = soap_get1(soap); while ((int)c != EOF && c != '['); if ((int)c == EOF) break; soap->cdata = 1; c = soap_get1(soap); continue; } if (c == '-' && (c = soap_get1(soap)) == '-') { do { c = soap_get1(soap); if (c == '-' && (c = soap_get1(soap)) == '-') break; } while ((int)c != EOF); } } else if (c == '?') c = soap_get_pi(soap); while ((int)c != EOF) { if (c == '<') k++; else if (c == '>') { if (--k <= 0) break; } c = soap_get1(soap); } if ((int)c == EOF) break; c = soap_get1(soap); continue; } if (c == '/') return SOAP_TT; soap_revget1(soap); return SOAP_LT; case '>': return SOAP_GT; case '"': return SOAP_QT; case '\'': return SOAP_AP; case '&': return soap_char(soap) | 0x80000000; } break; } return c; } #endif /******************************************************************************/ #ifndef PALM_1 static soap_wchar soap_get_pi(struct soap *soap) { char buf[64]; char *s = buf; int i = sizeof(buf); soap_wchar c = soap_getchar(soap); /* This is a quick way to parse XML PI and we could use a callback instead to * enable applications to intercept processing instructions */ while ((int)c != EOF && c != '?') { if (--i > 0) { if (soap_blank(c)) c = ' '; *s++ = (char)c; } c = soap_getchar(soap); } *s = '\0'; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "XML PI \n", buf)); if (!strncmp(buf, "xml ", 4)) { s = strstr(buf, " encoding="); if (s && s[10]) { if (!soap_tag_cmp(s + 11, "iso-8859-1*") || !soap_tag_cmp(s + 11, "latin1*")) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Switching to latin1 encoding\n")); soap->mode |= SOAP_ENC_LATIN; } else if (!soap_tag_cmp(s + 11, "utf-8*")) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Switching to utf-8 encoding\n")); soap->mode &= ~SOAP_ENC_LATIN; } } } if ((int)c != EOF) c = soap_getchar(soap); return c; } #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_move(struct soap *soap, size_t n) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Moving %lu bytes forward\n", (unsigned long)n)); for (; n; n--) if ((int)soap_getchar(soap) == EOF) return SOAP_EOF; return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 size_t SOAP_FMAC2 soap_tell(struct soap *soap) { return soap->count - soap->buflen + soap->bufidx - (soap->ahead != 0); } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_pututf8(struct soap *soap, unsigned long c) { char tmp[24]; if ((c < 0x7F && c > 0x1F)) { *tmp = (char)c; return soap_send_raw(soap, tmp, 1); } #ifdef WITH_REPLACE_ILLEGAL_UTF8 if (!(c == 0x09 || c == 0x0A || c == 0x0D || (c >= 0x80 && c <= 0xD7FF) || (c >= 0xE000 && c <= 0xFFFD) || (c >= 0x10000 && c <= 0x10FFFF))) c = SOAP_UNKNOWN_UNICODE_CHAR; #endif #ifndef WITH_LEAN if (c > 0x9F) { char *t = tmp; if (c < 0x0800) *t++ = (char)(0xC0 | ((c >> 6) & 0x1F)); else { if (c < 0x010000) *t++ = (char)(0xE0 | ((c >> 12) & 0x0F)); else { if (c < 0x200000) *t++ = (char)(0xF0 | ((c >> 18) & 0x07)); else { if (c < 0x04000000) *t++ = (char)(0xF8 | ((c >> 24) & 0x03)); else { *t++ = (char)(0xFC | ((c >> 30) & 0x01)); *t++ = (char)(0x80 | ((c >> 24) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 18) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 12) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 6) & 0x3F)); } *t++ = (char)(0x80 | (c & 0x3F)); *t = '\0'; } else #endif (SOAP_SNPRINTF(tmp, sizeof(tmp), 20), "&#x%lX;", c); return soap_send(soap, tmp); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 soap_wchar SOAP_FMAC2 soap_getutf8(struct soap *soap) { soap_wchar c, c1, c2, c3, c4; c = soap->ahead; if (c >= 0x80) soap->ahead = 0; else c = soap_get(soap); if (c < 0x80 || c > 0xFF || (soap->mode & SOAP_ENC_LATIN)) return c; c1 = soap_get1(soap); if (c1 < 0x80) { soap_revget1(soap); /* doesn't look like this is UTF8 */ return c; } c1 &= 0x3F; if (c < 0xE0) return ((soap_wchar)(c & 0x1F) << 6) | c1; c2 = (soap_wchar)soap_get1(soap) & 0x3F; if (c < 0xF0) return ((soap_wchar)(c & 0x0F) << 12) | (c1 << 6) | c2; c3 = (soap_wchar)soap_get1(soap) & 0x3F; if (c < 0xF8) return ((soap_wchar)(c & 0x07) << 18) | (c1 << 12) | (c2 << 6) | c3; c4 = (soap_wchar)soap_get1(soap) & 0x3F; if (c < 0xFC) return ((soap_wchar)(c & 0x03) << 24) | (c1 << 18) | (c2 << 12) | (c3 << 6) | c4; return ((soap_wchar)(c & 0x01) << 30) | (c1 << 24) | (c2 << 18) | (c3 << 12) | (c4 << 6) | (soap_wchar)(soap_get1(soap) & 0x3F); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 size_t SOAP_FMAC2 soap_utf8len(const char *s) { size_t l = 0; while (*s) if ((*s++ & 0xC0) != 0x80) l++; return l; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_puthex(struct soap *soap, const unsigned char *s, int n) { char d[2]; int i; #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { if (!(soap->dom->text = soap_s2hex(soap, s, NULL, n))) return soap->error; return SOAP_OK; } #endif for (i = 0; i < n; i++) { int m = *s++; d[0] = (char)((m >> 4) + (m > 159 ? '7' : '0')); m &= 0x0F; d[1] = (char)(m + (m > 9 ? '7' : '0')); if (soap_send_raw(soap, d, 2)) return soap->error; } return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 unsigned char* SOAP_FMAC2 soap_gethex(struct soap *soap, int *n) { #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { soap->dom->text = soap_string_in(soap, 0, -1, -1, NULL); return (unsigned char*)soap_hex2s(soap, soap->dom->text, NULL, 0, n); } #endif #ifdef WITH_FAST soap->labidx = 0; for (;;) { char *s; size_t i, k; if (soap_append_lab(soap, NULL, 0)) return NULL; s = soap->labbuf + soap->labidx; k = soap->lablen - soap->labidx; soap->labidx = soap->lablen; for (i = 0; i < k; i++) { char d1, d2; soap_wchar c; c = soap_get(soap); if (soap_isxdigit(c)) { d1 = (char)c; c = soap_get(soap); if (soap_isxdigit(c)) d2 = (char)c; else { soap->error = SOAP_TYPE; return NULL; } } else { unsigned char *p; size_t l = soap->lablen + i - k; soap_unget(soap, c); if (n) *n = (int)l; p = (unsigned char*)soap_malloc(soap, l); if (p) soap_memcpy((void*)p, l, (const void*)soap->labbuf, l); return p; } *s++ = (char)(((d1 >= 'A' ? (d1 & 0x7) + 9 : d1 - '0') << 4) + (d2 >= 'A' ? (d2 & 0x7) + 9 : d2 - '0')); } } #else if (soap_new_block(soap) == NULL) return NULL; for (;;) { int i; char *s = (char*)soap_push_block(soap, NULL, SOAP_BLKLEN); if (!s) { soap_end_block(soap, NULL); return NULL; } for (i = 0; i < SOAP_BLKLEN; i++) { char d1, d2; soap_wchar c = soap_get(soap); if (soap_isxdigit(c)) { d1 = (char)c; c = soap_get(soap); if (soap_isxdigit(c)) d2 = (char)c; else { soap_end_block(soap, NULL); soap->error = SOAP_TYPE; return NULL; } } else { unsigned char *p; soap_unget(soap, c); if (n) *n = (int)soap_size_block(soap, NULL, i); p = (unsigned char*)soap_save_block(soap, NULL, NULL, 0); return p; } *s++ = ((d1 >= 'A' ? (d1 & 0x7) + 9 : d1 - '0') << 4) + (d2 >= 'A' ? (d2 & 0x7) + 9 : d2 - '0'); } } #endif } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_putbase64(struct soap *soap, const unsigned char *s, int n) { int i; unsigned long m; char d[4]; if (!s) return SOAP_OK; #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { if (!(soap->dom->text = soap_s2base64(soap, s, NULL, n))) return soap->error; return SOAP_OK; } #endif for (; n > 2; n -= 3, s += 3) { m = s[0]; m = (m << 8) | s[1]; m = (m << 8) | s[2]; for (i = 4; i > 0; m >>= 6) d[--i] = soap_base64o[m & 0x3F]; if (soap_send_raw(soap, d, 4)) return soap->error; } if (n > 0) { m = 0; for (i = 0; i < n; i++) m = (m << 8) | *s++; for (; i < 3; i++) m <<= 8; for (i++; i > 0; m >>= 6) d[--i] = soap_base64o[m & 0x3F]; for (i = 3; i > n; i--) d[i] = '='; if (soap_send_raw(soap, d, 4)) return soap->error; } return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 unsigned char* SOAP_FMAC2 soap_getbase64(struct soap *soap, int *n, int malloc_flag) { (void)malloc_flag; #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { soap->dom->text = soap_string_in(soap, 0, -1, -1, NULL); return (unsigned char*)soap_base642s(soap, soap->dom->text, NULL, 0, n); } #endif #ifdef WITH_FAST soap->labidx = 0; for (;;) { size_t i, k; char *s; if (soap_append_lab(soap, NULL, 2)) return NULL; s = soap->labbuf + soap->labidx; k = soap->lablen - soap->labidx; soap->labidx = 3 * (soap->lablen / 3); if (k > 2) { for (i = 0; i < k - 2; i += 3) { unsigned long m = 0; int j = 0; do { soap_wchar c = soap_get(soap); if (c < SOAP_AP) c &= 0x7FFFFFFF; if (c == '=' || c < 0) { unsigned char *p; size_t l; switch (j) { case 2: *s++ = (char)((m >> 4) & 0xFF); i++; break; case 3: *s++ = (char)((m >> 10) & 0xFF); *s++ = (char)((m >> 2) & 0xFF); i += 2; } l = soap->lablen + i - k; if (n) *n = (int)l; p = (unsigned char*)soap_malloc(soap, l); if (p) soap_memcpy((void*)p, l, (const void*)soap->labbuf, l); if (c >= 0) { while ((int)((c = soap_get(soap)) != EOF) && c != SOAP_LT && c != SOAP_TT) continue; } soap_unget(soap, c); return p; } c -= '+'; if (c >= 0 && c <= 79) { int b = soap_base64i[c]; if (b >= 64) { soap->error = SOAP_TYPE; return NULL; } m = (m << 6) + b; j++; } else if (!soap_blank(c + '+')) { soap->error = SOAP_TYPE; return NULL; } } while (j < 4); *s++ = (char)((m >> 16) & 0xFF); *s++ = (char)((m >> 8) & 0xFF); *s++ = (char)(m & 0xFF); } } } #else if (soap_new_block(soap) == NULL) return NULL; for (;;) { int i; char *s = (char*)soap_push_block(soap, NULL, 3 * SOAP_BLKLEN); /* must be multiple of 3 */ if (!s) { soap_end_block(soap, NULL); return NULL; } for (i = 0; i < SOAP_BLKLEN; i++) { unsigned long m = 0; int j = 0; do { soap_wchar c = soap_get(soap); if (c == '=' || c < 0) { unsigned char *p; i *= 3; switch (j) { case 2: *s++ = (char)((m >> 4) & 0xFF); i++; break; case 3: *s++ = (char)((m >> 10) & 0xFF); *s++ = (char)((m >> 2) & 0xFF); i += 2; } if (n) *n = (int)soap_size_block(soap, NULL, i); p = (unsigned char*)soap_save_block(soap, NULL, NULL, 0); if (c >= 0) { while ((int)((c = soap_get(soap)) != EOF) && c != SOAP_LT && c != SOAP_TT) continue; } soap_unget(soap, c); return p; } c -= '+'; if (c >= 0 && c <= 79) { int b = soap_base64i[c]; if (b >= 64) { soap->error = SOAP_TYPE; return NULL; } m = (m << 6) + b; j++; } else if (!soap_blank(c)) { soap->error = SOAP_TYPE; return NULL; } } while (j < 4); *s++ = (char)((m >> 16) & 0xFF); *s++ = (char)((m >> 8) & 0xFF); *s++ = (char)(m & 0xFF); } } #endif } #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_xop_forward(struct soap *soap, unsigned char **ptr, int *size, char **id, char **type, char **options) { /* Check MTOM xop:Include element (within hex/base64Binary) */ /* TODO: this code to be obsoleted with new import/xop.h conventions */ short body = soap->body; /* should save type too? */ if (!soap_peek_element(soap)) { if (!soap_element_begin_in(soap, "xop:Include", 0, NULL)) { if (soap_attachment_forward(soap, ptr, size, id, type, options) || (soap->body && soap_element_end_in(soap, "xop:Include"))) return soap->error; } } soap->body = body; return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_attachment_forward(struct soap *soap, unsigned char **ptr, int *size, char **id, char **type, char **options) { struct soap_xlist *xp; *ptr = NULL; *size = 0; *id = NULL; *type = NULL; *options = NULL; if (!*soap->href) return SOAP_OK; *id = soap_strdup(soap, soap->href); xp = (struct soap_xlist*)SOAP_MALLOC(soap, sizeof(struct soap_xlist)); if (!xp) return soap->error = SOAP_EOM; xp->next = soap->xlist; xp->ptr = ptr; xp->size = size; xp->id = *id; xp->type = type; xp->options = options; soap->xlist = xp; return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void * SOAP_FMAC2 soap_memdup(struct soap *soap, const void *s, size_t n) { void *t = NULL; if (s && (t = soap_malloc(soap, n))) soap_memcpy(t, n, s, n); return t; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 char * SOAP_FMAC2 soap_strdup(struct soap *soap, const char *s) { char *t = NULL; if (s) { size_t l = strlen(s) + 1; if ((t = (char*)soap_malloc(soap, l))) soap_memcpy((void*)t, l, (const void*)s, l); } return t; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 wchar_t * SOAP_FMAC2 soap_wstrdup(struct soap *soap, const wchar_t *s) { wchar_t *t = NULL; if (s) { size_t n = 0; while (s[n]) n++; n = sizeof(wchar_t)*(n+1); if ((t = (wchar_t*)soap_malloc(soap, n))) soap_memcpy((void*)t, n, (const void*)s, n); } return t; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 char * SOAP_FMAC2 soap_strtrim(struct soap *soap, char *s) { (void)soap; if (s) { char *t; while ((*s >= 9 && *s <= 13) || *s == 32) s++; t = s; while (*t) t++; while (--t > s && ((*t >= 9 && *t <= 13) || *t == 32)) continue; t[1] = '\0'; } return s; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 wchar_t * SOAP_FMAC2 soap_wstrtrim(struct soap *soap, wchar_t *s) { (void)soap; if (s) { wchar_t *t; while ((*s >= 9 && *s <= 13) || *s == 32) s++; t = s; while (*t) t++; while (--t > s && ((*t >= 9 && *t <= 13) || *t == 32)) continue; t[1] = L'\0'; } return s; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 struct soap_blist* SOAP_FMAC2 soap_new_block(struct soap *soap) { struct soap_blist *p; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "New block sequence (prev=%p)\n", soap->blist)); if (!(p = (struct soap_blist*)SOAP_MALLOC(soap, sizeof(struct soap_blist)))) { soap->error = SOAP_EOM; return NULL; } p->next = soap->blist; p->head = NULL; p->size = 0; soap->blist = p; return p; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void* SOAP_FMAC2 soap_push_block(struct soap *soap, struct soap_blist *b, size_t n) { struct soap_bhead *p; if (!b) b = soap->blist; if (!(p = (struct soap_bhead*)SOAP_MALLOC(soap, sizeof(struct soap_bhead) + n))) { soap->error = SOAP_EOM; return NULL; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Push block %p of %u bytes (%u bytes total)\n", p, (unsigned int)n, (unsigned int)b->size + (unsigned int)n)); p->next = b->head; b->head = p; p->size = n; b->size += n; return (void*)(p + 1); /* skip block header and point to n allocated bytes */ } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_pop_block(struct soap *soap, struct soap_blist *b) { struct soap_bhead *p; if (!b) b = soap->blist; if (!b->head) return; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Pop block\n")); p = b->head; b->size -= p->size; b->head = p->next; SOAP_FREE(soap, p); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_update_pointers(struct soap *soap, const char *dst, const char *src, size_t len) { const void *start = src, *end = src + len; #ifndef WITH_LEANER struct soap_xlist *xp; #endif #ifndef WITH_NOIDREF if ((soap->version && !(soap->imode & SOAP_XML_TREE)) || (soap->mode & SOAP_XML_GRAPH)) { int i; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Update pointers %p (%lu bytes) -> %p\n", src, (unsigned long)len, dst)); for (i = 0; i < SOAP_IDHASH; i++) { struct soap_ilist *ip; for (ip = soap->iht[i]; ip; ip = ip->next) { struct soap_flist *fp; void *p, **q; if (ip->shaky) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Update shaky id='%s'\n", ip->id)); if (ip->ptr && ip->ptr >= start && ip->ptr < end) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Update ptr %p -> %p\n", ip->ptr, (const char*)ip->ptr + (dst-src))); ip->ptr = (void*)((const char*)ip->ptr + (dst-src)); } for (q = &ip->link; q; q = (void**)p) { p = *q; if (p && p >= start && p < end) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Link update id='%s' %p -> %p\n", ip->id, p, (const char*)p + (dst-src))); *q = (void*)((const char*)p + (dst-src)); } } for (q = &ip->copy; q; q = (void**)p) { p = *q; if (p && p >= start && p < end) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy chain update id='%s' %p -> %p\n", ip->id, p, (const char*)p + (dst-src))); *q = (void*)((const char*)p + (dst-src)); } } for (fp = ip->flist; fp; fp = fp->next) { if (fp->ptr >= start && fp->ptr < end) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy list update id='%s' target type=%d %p -> %p\n", ip->id, fp->type, fp->ptr, (char*)fp->ptr + (dst-src))); fp->ptr = (void*)((const char*)fp->ptr + (dst-src)); } } if (ip->smart && ip->smart >= start && ip->smart < end) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Smart shared pointer update %p -> %p\n", ip->smart, (const char*)ip->smart + (dst-src))); ip->smart = (void*)((const char*)ip->smart + (dst-src)); } } } } } #else (void)soap; (void)start; (void)end; (void)dst; (void)src; #endif #ifndef WITH_LEANER for (xp = soap->xlist; xp; xp = xp->next) { if (xp->ptr && (void*)xp->ptr >= start && (void*)xp->ptr < end) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Update attachment id='%s' %p -> %p\n", xp->id ? xp->id : SOAP_STR_EOS, xp->ptr, (char*)xp->ptr + (dst-src))); xp->ptr = (unsigned char**)((char*)xp->ptr + (dst-src)); xp->size = (int*)((char*)xp->size + (dst-src)); xp->type = (char**)((char*)xp->type + (dst-src)); xp->options = (char**)((char*)xp->options + (dst-src)); } } #endif } #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_1 static int soap_has_copies(struct soap *soap, const char *start, const char *end) { int i; struct soap_ilist *ip = NULL; struct soap_flist *fp = NULL; const char *p; for (i = 0; i < SOAP_IDHASH; i++) { for (ip = soap->iht[i]; ip; ip = ip->next) { for (p = (const char*)ip->copy; p; p = *(const char**)p) if (p >= start && p < end) return SOAP_ERR; for (fp = ip->flist; fp; fp = fp->next) if (fp->type == ip->type && (const char*)fp->ptr >= start && (const char*)fp->ptr < end) return SOAP_ERR; } } return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_resolve(struct soap *soap) { int i; short flag; const char *id; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolving forwarded refs\n")); for (i = 0; i < SOAP_IDHASH; i++) { struct soap_ilist *ip; for (ip = soap->iht[i]; ip; ip = ip->next) { if (ip->ptr) { void **q; struct soap_flist *fp, **fpp = &ip->flist; if (ip->spine) ip->spine[0] = ip->ptr; q = (void**)ip->link; ip->link = NULL; DBGLOG(TEST, if (q) SOAP_MESSAGE(fdebug, "Traversing link chain to resolve id='%s' type=%d\n", ip->id, ip->type)); while (q) { void *p = *q; *q = ip->ptr; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "... link %p -> %p\n", q, ip->ptr)); q = (void**)p; } while ((fp = *fpp)) { if (fp->level > 0 && fp->finsert) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "... insert type=%d link %p -> %p\n", fp->type, fp->ptr, ip->ptr)); if (ip->spine && fp->level <= SOAP_MAXPTRS) fp->finsert(soap, ip->type, fp->type, fp->ptr, fp->index, &ip->spine[fp->level - 1], &ip->smart); else if (fp->level == 1) fp->finsert(soap, ip->type, fp->type, fp->ptr, fp->index, &ip->ptr, &ip->smart); else if (fp->level <= SOAP_MAXPTRS) { int i; if (!(ip->spine = (void**)soap_malloc(soap, SOAP_MAXPTRS * sizeof(void*)))) return soap->error = SOAP_EOM; ip->spine[0] = ip->ptr; for (i = 1; i < SOAP_MAXPTRS; i++) ip->spine[i] = &ip->spine[i - 1]; fp->finsert(soap, ip->type, fp->type, fp->ptr, fp->index, &ip->spine[fp->level - 1], &ip->smart); } *fpp = fp->next; SOAP_FREE(soap, fp); } else fpp = &fp->next; } } else if (*ip->id == '#') { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Missing id='%s'\n", ip->id)); soap_strcpy(soap->id, sizeof(soap->id), ip->id + 1); return soap->error = SOAP_MISSING_ID; } } } do { flag = 0; id = NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolution phase\n")); for (i = 0; i < SOAP_IDHASH; i++) { struct soap_ilist *ip; for (ip = soap->iht[i]; ip; ip = ip->next) { if (ip->copy || ip->flist) { if (ip->ptr && !soap_has_copies(soap, (const char*)ip->ptr, (const char*)ip->ptr + ip->size)) { struct soap_flist *fp; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolving id='%s' type=%d ptr=%p size=%lu ...\n", ip->id, ip->type, ip->ptr, (unsigned long)ip->size)); if (ip->copy) { void *p, **q = (void**)ip->copy; DBGLOG(TEST, if (q) SOAP_MESSAGE(fdebug, "Traversing copy chain to resolve id='%s'\n", ip->id)); ip->copy = NULL; do { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "... copy %p -> %p (%u bytes)\n", ip->ptr, q, (unsigned int)ip->size)); p = *q; soap_memcpy((void*)q, ip->size, (const void*)ip->ptr, ip->size); q = (void**)p; } while (q); flag = 1; } while ((fp = ip->flist)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolving forwarded data type=%d target type=%d location=%p level=%u id='%s'\n", ip->type, fp->type, ip->ptr, fp->level, ip->id)); if (fp->level == 0) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "... copy %p -> %p (%lu bytes)\n", ip->ptr, fp->ptr, (unsigned long)ip->size)); if (fp->finsert) fp->finsert(soap, ip->type, fp->type, fp->ptr, fp->index, ip->ptr, &ip->smart); else soap_memcpy((void*)fp->ptr, ip->size, (const void*)ip->ptr, ip->size); } ip->flist = fp->next; SOAP_FREE(soap, fp); flag = 1; } } else id = ip->id; } } } } while (flag); if (id) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolution error: forwarded data for id='%s' could not be propagated, please report this problem to the gSOAP developers\n", id)); return soap_id_nullify(soap, id); } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolution done\n")); return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 size_t SOAP_FMAC2 soap_size_block(struct soap *soap, struct soap_blist *b, size_t n) { if (!b) b = soap->blist; if (b->head) { b->size -= b->head->size - n; b->head->size = n; } return b->size; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 char* SOAP_FMAC2 soap_first_block(struct soap *soap, struct soap_blist *b) { struct soap_bhead *p, *q, *r; if (!b) b = soap->blist; p = b->head; if (!p) return NULL; r = NULL; do { q = p->next; p->next = r; r = p; p = q; } while (p); b->head = r; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "First block %p\n", r + 1)); return (char*)(r + 1); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 char* SOAP_FMAC2 soap_next_block(struct soap *soap, struct soap_blist *b) { struct soap_bhead *p; if (!b) b = soap->blist; p = b->head; if (p) { b->head = p->next; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Next block %p, deleting current block\n", b->head + 1)); SOAP_FREE(soap, p); if (b->head) return (char*)(b->head + 1); } return NULL; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 size_t SOAP_FMAC2 soap_block_size(struct soap *soap, struct soap_blist *b) { if (!b) b = soap->blist; return b->head->size; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_end_block(struct soap *soap, struct soap_blist *b) { struct soap_bhead *p, *q; if (!b) b = soap->blist; if (b) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of block sequence, free all remaining blocks\n")); for (p = b->head; p; p = q) { q = p->next; SOAP_FREE(soap, p); } if (soap->blist == b) soap->blist = b->next; else { struct soap_blist *bp; for (bp = soap->blist; bp; bp = bp->next) { if (bp->next == b) { bp->next = b->next; break; } } } SOAP_FREE(soap, b); } DBGLOG(TEST, if (soap->blist) SOAP_MESSAGE(fdebug, "Restored previous block sequence\n")); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 char* SOAP_FMAC2 soap_save_block(struct soap *soap, struct soap_blist *b, char *p, int flag) { size_t n; char *q, *s; if (!b) b = soap->blist; if (b->size) { if (!p) p = (char*)soap_malloc(soap, b->size); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Save all blocks in contiguous memory space of %u bytes (%p->%p)\n", (unsigned int)b->size, b->head, p)); if (p) { s = p; for (q = soap_first_block(soap, b); q; q = soap_next_block(soap, b)) { n = soap_block_size(soap, b); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy %u bytes from %p to %p\n", (unsigned int)n, q, s)); if (flag) soap_update_pointers(soap, s, q, n); soap_memcpy((void*)s, n, (const void*)q, n); s += n; } } else soap->error = SOAP_EOM; } soap_end_block(soap, b); #ifndef WITH_NOIDREF if (!soap->blist && ((soap->version && !(soap->imode & SOAP_XML_TREE)) || (soap->mode & SOAP_XML_GRAPH))) { int i; struct soap_ilist *ip = NULL; for (i = 0; i < SOAP_IDHASH; i++) for (ip = soap->iht[i]; ip; ip = ip->next) ip->shaky = 0; } #endif return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 char * SOAP_FMAC2 soap_putsizesoffsets(struct soap *soap, const char *type, const int *size, const int *offset, int dim) { int i; const char *t = ",%d"; if (!type) return NULL; if (soap->version == 2) t = " %d"; if (soap->version != 2 && offset) { (SOAP_SNPRINTF(soap->type, sizeof(soap->type) - 1, strlen(type) + 20), "%s[%d", type, size[0] + offset[0]); for (i = 1; i < dim; i++) { size_t l = strlen(soap->type); (SOAP_SNPRINTF(soap->type + l, sizeof(soap->type) - l - 1, 20), t, size[i] + offset[i]); } } else { (SOAP_SNPRINTF(soap->type, sizeof(soap->type) - 1, strlen(type) + 20), "%s[%d", type, size[0]); for (i = 1; i < dim; i++) { size_t l = strlen(soap->type); (SOAP_SNPRINTF(soap->type + l, sizeof(soap->type) - l - 1, 20), t, size[i]); } } soap_strncat(soap->type, sizeof(soap->type), "]", 1); return soap->type; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 char * SOAP_FMAC2 soap_putoffsets(struct soap *soap, const int *offset, int dim) { int i; soap->arrayOffset[0] = '\0'; if (soap->version == 1) { (SOAP_SNPRINTF(soap->arrayOffset, sizeof(soap->arrayOffset) - 1, 20), "[%d", offset[0]); for (i = 1; i < dim; i++) { size_t l = strlen(soap->arrayOffset); (SOAP_SNPRINTF(soap->arrayOffset + l, sizeof(soap->arrayOffset) - l - 1, 20), ",%d", offset[i]); } soap_strncat(soap->arrayOffset, sizeof(soap->arrayOffset), "]", 1); } return soap->arrayOffset; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 size_t SOAP_FMAC2 soap_size(const int *size, int dim) { int i; size_t n = 0; if (size[0] <= 0) return 0; n = (size_t)size[0]; for (i = 1; i < dim; i++) { if (size[i] <= 0) return 0; n *= (size_t)size[i]; } return (size_t)n; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 size_t SOAP_FMAC2 soap_getsizes(const char *attr, int *size, int dim) { size_t i, k, n; if (!*attr) return 0; i = strlen(attr); n = 1; do { for (; i > 0; i--) if (attr[i - 1] == '[' || attr[i - 1] == ',' || attr[i - 1] == ' ') break; n *= k = (size_t)soap_strtoul(attr + i, NULL, 10); size[--dim] = (int)k; if (n > SOAP_MAXARRAYSIZE) return 0; } while (dim > 0 && --i > 0 && attr[i] != '['); return n; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_getoffsets(const char *attr, const int *size, int *offset, int dim) { int i, j = 0; if (offset) { for (i = 0; i < dim && attr && *attr; i++) { attr++; j *= size[i]; j += offset[i] = (int)soap_strtol(attr, NULL, 10); attr = strchr(attr, ','); } } else { for (i = 0; i < dim && attr && *attr; i++) { attr++; j *= size[i]; j += (int)soap_strtol(attr, NULL, 10); attr = strchr(attr, ','); } } return j; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_getposition(const char *attr, int *pos) { int i, n; if (!*attr) return -1; n = 0; i = 1; do { pos[n++] = (int)soap_strtol(attr + i, NULL, 10); while (attr[i] && attr[i] != ',' && attr[i] != ']') i++; if (attr[i] == ',') i++; } while (n < SOAP_MAXDIMS && attr[i] && attr[i] != ']'); return n; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 struct soap_nlist * SOAP_FMAC2 soap_push_namespace(struct soap *soap, const char *id, const char *ns) { struct soap_nlist *np; struct Namespace *p; short i = -1; size_t n, k; n = strlen(id); k = strlen(ns) + 1; p = soap->local_namespaces; if (p) { for (i = 0; p->id; p++, i++) { if (p->ns && !strcmp(ns, p->ns)) break; if (p->out) { if (!strcmp(ns, p->out)) break; } else if (p->in) { if (!soap_tag_cmp(ns, p->in)) { if ((p->out = (char*)SOAP_MALLOC(soap, k))) soap_strcpy(p->out, k, ns); break; } } } if (!p->id) i = -1; } if (i >= 0) k = 0; np = (struct soap_nlist*)SOAP_MALLOC(soap, sizeof(struct soap_nlist) + n + k); if (!np) { soap->error = SOAP_EOM; return NULL; } np->next = soap->nlist; soap->nlist = np; np->level = soap->level; np->index = i; soap_strcpy((char*)np->id, n + 1, id); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Push namespace binding (level=%u) '%s'='%s'\n", soap->level, id, ns)); if (i < 0) { np->ns = np->id + n + 1; soap_strcpy((char*)np->ns, k, ns); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Push NOT OK: no match found for '%s' in namespace mapping table (added to stack anyway)\n", ns)); } else { np->ns = NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Push OK ('%s' matches '%s' in namespace table)\n", id, p->id)); } return np; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_pop_namespace(struct soap *soap) { struct soap_nlist *np, *nq; for (np = soap->nlist; np && np->level >= soap->level; np = nq) { nq = np->next; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Pop namespace binding (level=%u) '%s' level=%u\n", soap->level, np->id, np->level)); SOAP_FREE(soap, np); } soap->nlist = np; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_match_namespace(struct soap *soap, const char *id1, const char *id2, size_t n1, size_t n2) { struct soap_nlist *np = soap->nlist; const char *s; while (np && (strncmp(np->id, id1, n1) || np->id[n1])) np = np->next; if (np) { if (!(soap->mode & SOAP_XML_IGNORENS) && (n2 > 0 || !np->ns || *np->ns)) { if (np->index < 0 || ((s = soap->local_namespaces[np->index].id) && (strncmp(s, id2, n2) || (s[n2] && s[n2] != '_')))) return SOAP_NAMESPACE; } return SOAP_OK; } if (n1 == 0) return n2 == 0 || (soap->mode & SOAP_XML_IGNORENS) ? SOAP_OK : SOAP_NAMESPACE; if ((n1 == 3 && n1 == n2 && !strncmp(id1, "xml", 3) && !strncmp(id1, id2, 3)) || (soap->mode & SOAP_XML_IGNORENS)) return SOAP_OK; return soap->error = SOAP_SYNTAX_ERROR; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_current_namespace(struct soap *soap, const char *tag) { struct soap_nlist *np; const char *s; if (!tag || !strncmp(tag, "xml", 3)) return NULL; np = soap->nlist; if (!(s = strchr(tag, ':'))) { while (np && *np->id) /* find default namespace, if present */ np = np->next; } else { while (np && (strncmp(np->id, tag, s - tag) || np->id[s - tag])) np = np->next; if (!np) soap->error = SOAP_NAMESPACE; } if (np) { if (np->index >= 0) return soap->namespaces[np->index].ns; if (np->ns && *np->ns) return soap_strdup(soap, np->ns); } return NULL; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_tag_cmp(const char *s, const char *t) { for (;;) { int c1 = *s; int c2 = *t; if (!c1 || c1 == '"') break; if (c2 != '-') { if (c1 != c2) { if (c1 >= 'A' && c1 <= 'Z') c1 += 'a' - 'A'; if (c2 >= 'A' && c2 <= 'Z') c2 += 'a' - 'A'; } if (c1 != c2) { if (c2 != '*') return 1; c2 = *++t; if (!c2) return 0; if (c2 >= 'A' && c2 <= 'Z') c2 += 'a' - 'A'; for (;;) { c1 = *s; if (!c1 || c1 == '"') break; if (c1 >= 'A' && c1 <= 'Z') c1 += 'a' - 'A'; if (c1 == c2 && !soap_tag_cmp(s + 1, t + 1)) return 0; s++; } break; } } s++; t++; } if (*t == '*' && !t[1]) return 0; return *t; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_match_tag(struct soap *soap, const char *tag1, const char *tag2) { const char *s, *t; int err; if (!tag1 || !tag2 || !*tag2) return SOAP_OK; s = strchr(tag1, ':'); t = strchr(tag2, ':'); if (t) { if (s) { if (t[1] && SOAP_STRCMP(s + 1, t + 1)) return SOAP_TAG_MISMATCH; if (t != tag2 && (err = soap_match_namespace(soap, tag1, tag2, s - tag1, t - tag2))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Tags '%s' and '%s' match but namespaces differ\n", tag1, tag2)); if (err == SOAP_NAMESPACE) return SOAP_TAG_MISMATCH; return err; } } else if (!t[1]) { if ((soap->mode & SOAP_XML_IGNORENS) || soap_match_namespace(soap, tag1, tag2, 0, t - tag2)) return SOAP_TAG_MISMATCH; } else if (SOAP_STRCMP(tag1, t + 1)) { return SOAP_TAG_MISMATCH; } else if (t != tag2 && (err = soap_match_namespace(soap, tag1, tag2, 0, t - tag2))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Tags '%s' and '%s' match but namespaces differ\n", tag1, tag2)); if (err == SOAP_NAMESPACE) return SOAP_TAG_MISMATCH; return err; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Tags and (default) namespaces match: '%s' '%s'\n", tag1, tag2)); return SOAP_OK; } if (s) { if (!(soap->mode & SOAP_XML_IGNORENS) || SOAP_STRCMP(s + 1, tag2)) /* always fails (except when ignoring ns) */ return SOAP_TAG_MISMATCH; } else if (SOAP_STRCMP(tag1, tag2) || ((soap->mode & SOAP_XML_STRICT) && !(soap->mode & SOAP_XML_IGNORENS) && soap_match_namespace(soap, tag1, tag2, 0, 0))) /* strict checking: default namespace must be null namespace */ return SOAP_TAG_MISMATCH; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Tags match: '%s' '%s'\n", tag1, tag2)); return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_match_array(struct soap *soap, const char *type) { if (*soap->arrayType) if (soap_match_tag(soap, soap->arrayType, type) && soap_match_tag(soap, soap->arrayType, "xsd:anyType") && soap_match_tag(soap, soap->arrayType, "xsd:ur-type") ) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Array type mismatch: '%s' '%s'\n", soap->arrayType, type)); return SOAP_TAG_MISMATCH; } return SOAP_OK; } #endif /******************************************************************************\ * * SSL/TLS * \******************************************************************************/ #ifdef WITH_OPENSSL #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_rand() { unsigned char buf[4]; if (!soap_ssl_init_done) soap_ssl_init(); RAND_pseudo_bytes(buf, 4); return *(int*)buf; } #endif #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) || defined(WITH_SYSTEMSSL) #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE) soap_ssl_server_context(struct soap *soap, unsigned short flags, const char *keyfile, const char *keyid, const char *password, const char *cafile, const char *capath, const char *dhfile, const char *randfile, const char *sid) #else soap_ssl_server_context(struct soap *soap, unsigned short flags, const char *keyfile, const char *password, const char *cafile, const char *capath, const char *dhfile, const char *randfile, const char *sid) #endif { int err; soap->keyfile = keyfile; #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE) soap->keyid = keyid; #endif soap->password = password; soap->cafile = cafile; soap->capath = capath; #ifdef WITH_OPENSSL soap->dhfile = dhfile; soap->randfile = randfile; if (!soap->fsslverify) soap->fsslverify = ssl_verify_callback; #endif soap->ssl_flags = flags | (dhfile == NULL ? SOAP_SSL_RSA : 0); #ifdef WITH_GNUTLS (void)randfile; (void)sid; if (dhfile) { char *s; int n = (int)soap_strtoul(dhfile, &s, 10); if (!soap->dh_params) gnutls_dh_params_init(&soap->dh_params); /* if dhfile is numeric, treat it as a key length to generate DH params which can take a while */ if (n >= 512 && s && *s == '\0') gnutls_dh_params_generate2(soap->dh_params, (unsigned int)n); else { unsigned int dparams_len; unsigned char dparams_buf[1024]; FILE *fd = fopen(dhfile, "r"); if (!fd) return soap_set_receiver_error(soap, "SSL/TLS error", "Invalid DH file", SOAP_SSL_ERROR); dparams_len = (unsigned int)fread(dparams_buf, 1, sizeof(dparams_buf), fd); fclose(fd); gnutls_datum_t dparams = { dparams_buf, dparams_len }; if (gnutls_dh_params_import_pkcs3(soap->dh_params, &dparams, GNUTLS_X509_FMT_PEM)) return soap_set_receiver_error(soap, "SSL/TLS error", "Invalid DH file", SOAP_SSL_ERROR); } } else { if (!soap->rsa_params) gnutls_rsa_params_init(&soap->rsa_params); gnutls_rsa_params_generate2(soap->rsa_params, SOAP_SSL_RSA_BITS); } if (soap->session) { gnutls_deinit(soap->session); soap->session = NULL; } if (soap->xcred) { gnutls_certificate_free_credentials(soap->xcred); soap->xcred = NULL; } #endif #ifdef WITH_SYSTEMSSL (void)randfile; (void)sid; if (soap->ctx) gsk_environment_close(&soap->ctx); #endif err = soap->fsslauth(soap); #ifdef WITH_OPENSSL if (!err) { if (sid) SSL_CTX_set_session_id_context(soap->ctx, (unsigned char*)sid, (unsigned int)strlen(sid)); else SSL_CTX_set_session_cache_mode(soap->ctx, SSL_SESS_CACHE_OFF); } #endif return err; } #endif #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) || defined(WITH_SYSTEMSSL) #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE) soap_ssl_client_context(struct soap *soap, unsigned short flags, const char *keyfile, const char *keyid, const char *password, const char *cafile, const char *capath, const char *randfile) #else soap_ssl_client_context(struct soap *soap, unsigned short flags, const char *keyfile, const char *password, const char *cafile, const char *capath, const char *randfile) #endif { soap->keyfile = keyfile; #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE) soap->keyid = keyid; #endif soap->password = password; soap->cafile = cafile; soap->capath = capath; soap->ssl_flags = SOAP_SSL_CLIENT | flags; #ifdef WITH_OPENSSL soap->dhfile = NULL; soap->randfile = randfile; if (!soap->fsslverify) soap->fsslverify = (flags & SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE) == 0 ? ssl_verify_callback : ssl_verify_callback_allow_expired_certificate; #endif #ifdef WITH_GNUTLS (void)randfile; if (soap->session) { gnutls_deinit(soap->session); soap->session = NULL; } if (soap->xcred) { gnutls_certificate_free_credentials(soap->xcred); soap->xcred = NULL; } #endif #ifdef WITH_SYSTEMSSL (void)randfile; if (soap->ctx) gsk_environment_close(&soap->ctx); #endif return soap->fsslauth(soap); } #endif #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_ssl_crl(struct soap *soap, const char *crlfile) { #ifdef WITH_OPENSSL if (crlfile && soap->ctx) { #if (OPENSSL_VERSION_NUMBER >= 0x0090800fL) X509_STORE *store = SSL_CTX_get_cert_store(soap->ctx); if (*crlfile) { int ret; X509_LOOKUP *lookup = X509_STORE_add_lookup(store, X509_LOOKUP_file()); if ((ret = X509_load_crl_file(lookup, crlfile, X509_FILETYPE_PEM)) <= 0) return soap_set_receiver_error(soap, soap_ssl_error(soap, ret), "Can't read CRL file", SOAP_SSL_ERROR); } X509_VERIFY_PARAM *param = X509_VERIFY_PARAM_new(); X509_VERIFY_PARAM_set_flags(param, X509_V_FLAG_CRL_CHECK); X509_STORE_set1_param(store, param); X509_VERIFY_PARAM_free(param); #endif } else soap->crlfile = crlfile; /* activate later when store is available */ #endif #ifdef WITH_GNUTLS if (crlfile && soap->xcred) { if (*crlfile) if (gnutls_certificate_set_x509_crl_file(soap->xcred, crlfile, GNUTLS_X509_FMT_PEM) < 0) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read CRL file", SOAP_SSL_ERROR); } else soap->crlfile = crlfile; /* activate later when xcred is available */ #endif return SOAP_OK; } #endif #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_ssl_init() { /* Note: for MT systems, the main program MUST call soap_ssl_init() before any threads are started */ if (!soap_ssl_init_done) { soap_ssl_init_done = 1; #ifdef WITH_OPENSSL SSL_library_init(); OpenSSL_add_all_algorithms(); /* we keep ciphers and digests for the program's lifetime */ #ifndef WITH_LEAN SSL_load_error_strings(); #endif if (!RAND_load_file("/dev/urandom", 1024)) { char buf[1024]; RAND_seed(buf, sizeof(buf)); while (!RAND_status()) { int r = rand(); RAND_seed(&r, sizeof(int)); } } #endif #ifdef WITH_GNUTLS # if defined(HAVE_PTHREAD_H) gcry_control(GCRYCTL_SET_THREAD_CBS, &gcry_threads_pthread); # elif defined(HAVE_PTH_H) gcry_control(GCRYCTL_SET_THREAD_CBS, &gcry_threads_pth); # endif gcry_control(GCRYCTL_ENABLE_QUICK_RANDOM, 0); gcry_control(GCRYCTL_DISABLE_SECMEM, 0); gcry_control(GCRYCTL_INITIALIZATION_FINISHED, 0); /* libgcrypt init done */ gnutls_global_init(); #endif } } #endif #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) #ifndef PALM_1 SOAP_FMAC1 const char * SOAP_FMAC2 soap_ssl_error(struct soap *soap, int ret) { #ifdef WITH_OPENSSL int err = SSL_get_error(soap->ssl, ret); const char *msg = soap_code_str(h_ssl_error_codes, err); if (msg) (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), strlen(msg) + 1), "%s\n", msg); else return ERR_error_string(err, soap->msgbuf); if (ERR_peek_error()) { unsigned long r; while ((r = ERR_get_error())) { size_t l = strlen(soap->msgbuf); ERR_error_string_n(r, soap->msgbuf + l, sizeof(soap->msgbuf) - l); } } else { size_t l = strlen(soap->msgbuf); switch (ret) { case 0: soap_strcpy(soap->msgbuf + l, sizeof(soap->msgbuf) - l, "EOF was observed that violates the SSL/TLS protocol. The client probably provided invalid authentication information."); break; case -1: { const char *s = strerror(soap_errno); (SOAP_SNPRINTF(soap->msgbuf + l, sizeof(soap->msgbuf) - l, strlen(s) + 42), "Error observed by underlying SSL/TLS BIO: %s", s); } break; } } return soap->msgbuf; #endif #ifdef WITH_GNUTLS (void)soap; return gnutls_strerror(ret); #endif } #endif #endif /******************************************************************************/ #ifdef WITH_SYSTEMSSL static int ssl_recv(int sk, void *s, int n, char *user) { (void)user; return recv(sk, s, n, 0); } #endif /******************************************************************************/ #ifdef WITH_SYSTEMSSL static int ssl_send(int sk, void *s, int n, char *user) { (void)user; return send(sk, s, n, 0); } #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) || defined(WITH_SYSTEMSSL) #ifndef PALM_1 static int ssl_auth_init(struct soap *soap) { #ifdef WITH_OPENSSL long flags; int mode; #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE) EVP_PKEY* pkey; #endif if (!soap_ssl_init_done) soap_ssl_init(); ERR_clear_error(); if (!soap->ctx) { #if (OPENSSL_VERSION_NUMBER >= 0x10100000L) /* TLS_method: a TLS/SSL connection established may understand the SSLv3, TLSv1, TLSv1.1 and TLSv1.2 protocols. */ soap->ctx = SSL_CTX_new(TLS_method()); #else /* SSLv23_method: a TLS/SSL connection established may understand the SSLv3, TLSv1, TLSv1.1 and TLSv1.2 protocols. */ soap->ctx = SSL_CTX_new(SSLv23_method()); #endif if (!soap->ctx) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't setup context", SOAP_SSL_ERROR); /* The following alters the behavior of SSL read/write: */ #if 0 SSL_CTX_set_mode(soap->ctx, SSL_MODE_ENABLE_PARTIAL_WRITE | SSL_MODE_AUTO_RETRY); #endif } if (soap->randfile) { if (!RAND_load_file(soap->randfile, -1)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't load randomness", SOAP_SSL_ERROR); } if (soap->cafile || soap->capath) { if (!SSL_CTX_load_verify_locations(soap->ctx, soap->cafile, soap->capath)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read CA file", SOAP_SSL_ERROR); if (soap->cafile && (soap->ssl_flags & SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION)) SSL_CTX_set_client_CA_list(soap->ctx, SSL_load_client_CA_file(soap->cafile)); } if (!(soap->ssl_flags & SOAP_SSL_NO_DEFAULT_CA_PATH)) { if (!SSL_CTX_set_default_verify_paths(soap->ctx)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read default CA file and/or directory", SOAP_SSL_ERROR); } if (soap->crlfile) { if (soap_ssl_crl(soap, soap->crlfile)) return soap->error; } /* This code assumes a typical scenario with key and cert in one PEM file, see alternative code below */ #if 1 if (soap->keyfile) { if (!SSL_CTX_use_certificate_chain_file(soap->ctx, soap->keyfile)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't find or read certificate in key file", SOAP_SSL_ERROR); if (soap->password) { SSL_CTX_set_default_passwd_cb_userdata(soap->ctx, (void*)soap->password); SSL_CTX_set_default_passwd_cb(soap->ctx, ssl_password); } #ifndef WM_SECURE_KEY_STORAGE if (!SSL_CTX_use_PrivateKey_file(soap->ctx, soap->keyfile, SSL_FILETYPE_PEM)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read key file", SOAP_SSL_ERROR); #endif } #else /* Suggested alternative approach to check the key file for cert only when cafile==NULL */ if (soap->password) { SSL_CTX_set_default_passwd_cb_userdata(soap->ctx, (void*)soap->password); SSL_CTX_set_default_passwd_cb(soap->ctx, ssl_password); } if (!soap->cafile) { if (soap->keyfile) { if (!SSL_CTX_use_certificate_chain_file(soap->ctx, soap->keyfile)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't find or read certificate in key file", SOAP_SSL_ERROR); if (!SSL_CTX_use_PrivateKey_file(soap->ctx, soap->keyfile, SSL_FILETYPE_PEM)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read key file", SOAP_SSL_ERROR); } } else /* use cafile for (server) cert and keyfile for (server) key */ { if (!SSL_CTX_use_certificate_chain_file(soap->ctx, soap->cafile)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read CA file", SOAP_SSL_ERROR); if (soap->keyfile) if (!SSL_CTX_use_PrivateKey_file(soap->ctx, soap->keyfile, SSL_FILETYPE_PEM)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read key file", SOAP_SSL_ERROR); } #endif #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE) if (NULL == (pkey = ipcom_key_db_pkey_get(soap->keyid))) return soap_set_receiver_error(soap, "SSL error", "Can't find key", SOAP_SSL_ERROR); if (0 == SSL_CTX_use_PrivateKey(soap->ctx, pkey)) return soap_set_receiver_error(soap, "SSL error", "Can't read key", SOAP_SSL_ERROR); #endif if ((soap->ssl_flags & SOAP_SSL_RSA)) { RSA *rsa = RSA_generate_key(SOAP_SSL_RSA_BITS, RSA_F4, NULL, NULL); if (!SSL_CTX_set_tmp_rsa(soap->ctx, rsa)) { if (rsa) RSA_free(rsa); return soap_set_receiver_error(soap, "SSL/TLS error", "Can't set RSA key", SOAP_SSL_ERROR); } RSA_free(rsa); } else if (soap->dhfile) { DH *dh = 0; char *s; int n = (int)soap_strtoul(soap->dhfile, &s, 10); /* if dhfile is numeric, treat it as a key length to generate DH params which can take a while */ if (n >= 512 && s && *s == '\0') #if defined(VXWORKS) DH_generate_parameters_ex(dh, n, 2/*or 5*/, NULL); #else dh = DH_generate_parameters(n, 2/*or 5*/, NULL, NULL); #endif else { BIO *bio; bio = BIO_new_file(soap->dhfile, "r"); if (!bio) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read DH file", SOAP_SSL_ERROR); dh = PEM_read_bio_DHparams(bio, NULL, NULL, NULL); BIO_free(bio); } if (!dh || DH_check(dh, &n) != 1 || SSL_CTX_set_tmp_dh(soap->ctx, dh) < 0) { if (dh) DH_free(dh); return soap_set_receiver_error(soap, "SSL/TLS error", "Can't set DH parameters", SOAP_SSL_ERROR); } DH_free(dh); } flags = (SSL_OP_ALL | SSL_OP_NO_SSLv2); /* disable SSL v2 by default */ if ((soap->ssl_flags & SOAP_SSLv3)) { #if (OPENSSL_VERSION_NUMBER >= 0x10001000L) flags |= SSL_OP_NO_TLSv1 | SSL_OP_NO_TLSv1_1 | SSL_OP_NO_TLSv1_2; #else flags |= SSL_OP_NO_TLSv1; #endif } else { if (!(soap->ssl_flags & SOAP_SSLv3_TLSv1)) flags |= SSL_OP_NO_SSLv3; /* disable SSL v3 by default, unless SOAP_SSLv3 or SOAP_SSLv3_TLSv1 is set */ #if (OPENSSL_VERSION_NUMBER >= 0x10001000L) if ((soap->ssl_flags & SOAP_TLSv1_0)) flags |= SSL_OP_NO_TLSv1_1 | SSL_OP_NO_TLSv1_2; else if ((soap->ssl_flags & SOAP_TLSv1_1)) flags |= SSL_OP_NO_TLSv1 | SSL_OP_NO_TLSv1_2; else if ((soap->ssl_flags & SOAP_TLSv1_2)) flags |= SSL_OP_NO_TLSv1 | SSL_OP_NO_TLSv1_1; #endif } #ifdef SSL_OP_NO_TICKET /* TLS extension is enabled by default in OPENSSL v0.9.8k Disable it by adding SSL_OP_NO_TICKET */ flags |= SSL_OP_NO_TICKET; #endif SSL_CTX_set_options(soap->ctx, flags); if ((soap->ssl_flags & SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION)) mode = (SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT); else if ((soap->ssl_flags & SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION)) mode = SSL_VERIFY_PEER; else mode = SSL_VERIFY_NONE; SSL_CTX_set_verify(soap->ctx, mode, soap->fsslverify); #if (OPENSSL_VERSION_NUMBER < 0x00905100L) SSL_CTX_set_verify_depth(soap->ctx, 1); #else SSL_CTX_set_verify_depth(soap->ctx, 9); #endif #endif #ifdef WITH_GNUTLS int ret; if (!soap_ssl_init_done) soap_ssl_init(); if (!soap->xcred) { gnutls_certificate_allocate_credentials(&soap->xcred); if (soap->cafile) { if (gnutls_certificate_set_x509_trust_file(soap->xcred, soap->cafile, GNUTLS_X509_FMT_PEM) < 0) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read CA file", SOAP_SSL_ERROR); } if (soap->crlfile) { if (soap_ssl_crl(soap, soap->crlfile)) return soap->error; } if (soap->keyfile) { if (gnutls_certificate_set_x509_key_file(soap->xcred, soap->keyfile, soap->keyfile, GNUTLS_X509_FMT_PEM) < 0) /* Assumes that key and cert(s) are concatenated in the keyfile */ return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read key file", SOAP_SSL_ERROR); } } if ((soap->ssl_flags & SOAP_SSL_CLIENT)) { gnutls_init(&soap->session, GNUTLS_CLIENT); if (soap->cafile || soap->crlfile || soap->keyfile) { ret = gnutls_priority_set_direct(soap->session, "PERFORMANCE", NULL); if (ret < 0) return soap_set_receiver_error(soap, soap_ssl_error(soap, ret), "SSL/TLS set priority error", SOAP_SSL_ERROR); gnutls_credentials_set(soap->session, GNUTLS_CRD_CERTIFICATE, soap->xcred); } else { if (!soap->acred) gnutls_anon_allocate_client_credentials(&soap->acred); gnutls_init(&soap->session, GNUTLS_CLIENT); gnutls_priority_set_direct(soap->session, "PERFORMANCE:+ANON-DH:!ARCFOUR-128", NULL); gnutls_credentials_set(soap->session, GNUTLS_CRD_ANON, soap->acred); } } else { if (!soap->keyfile) return soap_set_receiver_error(soap, "SSL/TLS error", "No key file: anonymous server authentication not supported in this release", SOAP_SSL_ERROR); if ((soap->ssl_flags & SOAP_SSL_RSA) && soap->rsa_params) gnutls_certificate_set_rsa_export_params(soap->xcred, soap->rsa_params); else if (soap->dh_params) gnutls_certificate_set_dh_params(soap->xcred, soap->dh_params); if (!soap->cache) gnutls_priority_init(&soap->cache, "NORMAL", NULL); gnutls_init(&soap->session, GNUTLS_SERVER); gnutls_priority_set(soap->session, soap->cache); gnutls_credentials_set(soap->session, GNUTLS_CRD_CERTIFICATE, soap->xcred); if ((soap->ssl_flags & SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION)) gnutls_certificate_server_set_request(soap->session, GNUTLS_CERT_REQUEST); gnutls_session_enable_compatibility_mode(soap->session); if ((soap->ssl_flags & SOAP_SSLv3)) { int protocol_priority[] = { GNUTLS_SSL3, 0 }; if (gnutls_protocol_set_priority(soap->session, protocol_priority) != GNUTLS_E_SUCCESS) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't set SSLv3 protocol", SOAP_SSL_ERROR); } else if ((soap->ssl_flags & SOAP_TLSv1_0)) { int protocol_priority[] = { GNUTLS_TLS1_0, 0 }; if (gnutls_protocol_set_priority(soap->session, protocol_priority) != GNUTLS_E_SUCCESS) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't set TLSv1.0 protocol", SOAP_SSL_ERROR); } else if ((soap->ssl_flags & SOAP_TLSv1_1)) { int protocol_priority[] = { GNUTLS_TLS1_1, 0 }; if (gnutls_protocol_set_priority(soap->session, protocol_priority) != GNUTLS_E_SUCCESS) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't set TLSv1.1 protocol", SOAP_SSL_ERROR); } else if ((soap->ssl_flags & SOAP_TLSv1_2)) { int protocol_priority[] = { GNUTLS_TLS1_2, 0 }; if (gnutls_protocol_set_priority(soap->session, protocol_priority) != GNUTLS_E_SUCCESS) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't set TLSv1.2 protocol", SOAP_SSL_ERROR); } else if ((soap->ssl_flags & SOAP_SSLv3_TLSv1)) { int protocol_priority[] = { GNUTLS_SSL3, GNUTLS_TLS1_0, GNUTLS_TLS1_1, GNUTLS_TLS1_2, 0 }; if (gnutls_protocol_set_priority(soap->session, protocol_priority) != GNUTLS_E_SUCCESS) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't set SSLv3 & TLSv1 protocols", SOAP_SSL_ERROR); } else { int protocol_priority[] = { GNUTLS_TLS1_0, GNUTLS_TLS1_1, GNUTLS_TLS1_2, 0 }; if (gnutls_protocol_set_priority(soap->session, protocol_priority) != GNUTLS_E_SUCCESS) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't set TLSv1 protocols", SOAP_SSL_ERROR); } } #endif #ifdef WITH_SYSTEMSSL if (!soap->ctx) { int err; err = gsk_environment_open(&soap->ctx); if (err == GSK_OK) err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_SSLV2, GSK_PROTOCOL_SSLV2_OFF); if (err == GSK_OK) { if ((soap->ssl_flags & SOAP_SSLv3) || (soap->ssl_flags & SOAP_SSLv3_TLSv1)) err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_SSLV3, GSK_PROTOCOL_SSLV3_ON); else err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_SSLV3, GSK_PROTOCOL_SSLV3_OFF); } if (!(soap->ssl_flags & SOAP_SSLv3)) { if (err == GSK_OK) err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_TLSV1, GSK_PROTOCOL_TLSV1_ON); if (err == GSK_OK) err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_TLSV1_1, GSK_PROTOCOL_TLSV1_1_ON); if (err == GSK_OK) err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_TLSV1_2, GSK_PROTOCOL_TLSV1_2_ON); } else { if (err == GSK_OK) err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_TLSV1, GSK_PROTOCOL_TLSV1_OFF); if (err == GSK_OK) err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_TLSV1_1, GSK_PROTOCOL_TLSV1_1_OFF); if (err == GSK_OK) err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_TLSV1_2, GSK_PROTOCOL_TLSV1_2_OFF); } if (err == GSK_OK) err = gsk_attribute_set_buffer(soap->ctx, GSK_KEYRING_FILE, soap->keyfile, 0); /* keyfile is a keyring .kdb file */ if (err == GSK_OK) err = gsk_attribute_set_buffer(soap->ctx, GSK_KEYRING_PW, soap->password, 0); /* locked by password */ if (err == GSK_OK) err = gsk_environment_init(soap->ctx); if (err != GSK_OK) return soap_set_receiver_error(soap, gsk_strerror(err), "SYSTEM SSL error in ssl_auth_init()", SOAP_SSL_ERROR); } #endif return SOAP_OK; } #endif #endif /******************************************************************************/ #ifdef WITH_OPENSSL #ifndef PALM_1 static int ssl_password(char *buf, int num, int rwflag, void *userdata) { (void)rwflag; if (!buf || !userdata) return 0; soap_strcpy(buf, (size_t)num, (char*)userdata); return (int)strlen(buf); } #endif #endif /******************************************************************************/ #ifdef WITH_OPENSSL #ifndef PALM_1 static int ssl_verify_callback(int ok, X509_STORE_CTX *store) { (void)store; #ifdef SOAP_DEBUG if (!ok) { char buf[1024]; int err = X509_STORE_CTX_get_error(store); X509 *cert = X509_STORE_CTX_get_current_cert(store); fprintf(stderr, "\nDEBUG mode TLS/SSL warnings:\nSSL verify error %d or warning with certificate at depth %d: %s\n", err, X509_STORE_CTX_get_error_depth(store), X509_verify_cert_error_string(err)); X509_NAME_oneline(X509_get_issuer_name(cert), buf, sizeof(buf)); fprintf(stderr, " certificate issuer: %s\n", buf); X509_NAME_oneline(X509_get_subject_name(cert), buf, sizeof(buf)); fprintf(stderr, " certificate subject: %s\n", buf); /* accept self-signed certificates and certificates out of date */ switch (err) { case X509_V_ERR_CERT_NOT_YET_VALID: case X509_V_ERR_CERT_HAS_EXPIRED: case X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT: case X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN: case X509_V_ERR_UNABLE_TO_GET_CRL: case X509_V_ERR_CRL_NOT_YET_VALID: case X509_V_ERR_CRL_HAS_EXPIRED: X509_STORE_CTX_set_error(store, X509_V_OK); ok = 1; fprintf(stderr, "Initialize soap_ssl_client_context with SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE to allow this verification error to pass without DEBUG mode enabled\n"); } } #endif /* Note: return 1 to try to continue, but unsafe progress will be terminated by OpenSSL */ return ok; } #endif #endif /******************************************************************************/ #ifdef WITH_OPENSSL #ifndef PALM_1 static int ssl_verify_callback_allow_expired_certificate(int ok, X509_STORE_CTX *store) { ok = ssl_verify_callback(ok, store); if (!ok) { /* accept self signed certificates, expired certificates, and certficiates w/o CRL */ switch (X509_STORE_CTX_get_error(store)) { case X509_V_ERR_CERT_NOT_YET_VALID: case X509_V_ERR_CERT_HAS_EXPIRED: case X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT: case X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN: case X509_V_ERR_UNABLE_TO_GET_CRL: case X509_V_ERR_CRL_NOT_YET_VALID: case X509_V_ERR_CRL_HAS_EXPIRED: X509_STORE_CTX_set_error(store, X509_V_OK); ok = 1; } } /* Note: return 1 to continue, but unsafe progress will be terminated by SSL */ return ok; } #endif #endif /******************************************************************************/ #ifdef WITH_GNUTLS static const char * ssl_verify(struct soap *soap, const char *host) { unsigned int status; const char *err = NULL; int r = gnutls_certificate_verify_peers2(soap->session, &status); if (r < 0) err = "Certificate verify error"; else if ((status & GNUTLS_CERT_INVALID)) err = "The certificate is not trusted"; else if ((status & GNUTLS_CERT_SIGNER_NOT_FOUND)) err = "The certificate hasn't got a known issuer"; else if ((status & GNUTLS_CERT_REVOKED)) err = "The certificate has been revoked"; else if (gnutls_certificate_type_get(soap->session) == GNUTLS_CRT_X509) { gnutls_x509_crt_t cert; const gnutls_datum_t *cert_list; unsigned int cert_list_size; if (gnutls_x509_crt_init(&cert) < 0) err = "Could not get X509 certificates"; else if ((cert_list = gnutls_certificate_get_peers(soap->session, &cert_list_size)) == NULL) err = "Could not get X509 certificates"; else if (gnutls_x509_crt_import(cert, &cert_list[0], GNUTLS_X509_FMT_DER) < 0) err = "Error parsing X509 certificate"; else if (!(soap->ssl_flags & SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE) && gnutls_x509_crt_get_expiration_time(cert) < time(NULL)) err = "The certificate has expired"; else if (!(soap->ssl_flags & SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE) && gnutls_x509_crt_get_activation_time(cert) > time(NULL)) err = "The certificate is not yet activated"; else if (host && !(soap->ssl_flags & SOAP_SSL_SKIP_HOST_CHECK)) { if (!gnutls_x509_crt_check_hostname(cert, host)) err = "Certificate host name mismatch"; } gnutls_x509_crt_deinit(cert); } return err; } #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) #ifndef WITH_NOIO #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_ssl_accept(struct soap *soap) { SOAP_SOCKET sk = soap->socket; #ifdef WITH_OPENSSL BIO *bio; int retries, r, s; if (!soap_valid_socket(sk)) return soap_set_receiver_error(soap, "SSL/TLS error", "No socket in soap_ssl_accept()", SOAP_SSL_ERROR); soap->ssl_flags &= ~SOAP_SSL_CLIENT; if (!soap->ctx && (soap->error = soap->fsslauth(soap))) return soap->error; if (!soap->ssl) { soap->ssl = SSL_new(soap->ctx); if (!soap->ssl) return soap_set_receiver_error(soap, "SSL/TLS error", "SSL_new() failed in soap_ssl_accept()", SOAP_SSL_ERROR); } else SSL_clear(soap->ssl); bio = BIO_new_socket((int)sk, BIO_NOCLOSE); SSL_set_bio(soap->ssl, bio, bio); /* Set SSL sockets to non-blocking */ retries = 0; if (soap->accept_timeout) { SOAP_SOCKNONBLOCK(sk) retries = 10*soap->accept_timeout; } if (retries <= 0) retries = 100; /* timeout: 10 sec retries, 100 times 0.1 sec */ while ((r = SSL_accept(soap->ssl)) <= 0) { int err; if (retries-- <= 0) break; err = SSL_get_error(soap->ssl, r); if (err == SSL_ERROR_WANT_ACCEPT || err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE) { if (err == SSL_ERROR_WANT_READ) s = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, -100000); else s = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, -100000); if (s < 0) break; } else { soap->errnum = soap_socket_errno(sk); break; } } if (r <= 0) { soap_set_receiver_error(soap, soap_ssl_error(soap, r), "SSL_accept() failed in soap_ssl_accept()", SOAP_SSL_ERROR); soap_closesock(soap); return SOAP_SSL_ERROR; } if ((soap->ssl_flags & SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION)) { X509 *peer; int err; if ((err = SSL_get_verify_result(soap->ssl)) != X509_V_OK) { soap_closesock(soap); return soap_set_sender_error(soap, X509_verify_cert_error_string(err), "SSL certificate presented by peer cannot be verified in soap_ssl_accept()", SOAP_SSL_ERROR); } peer = SSL_get_peer_certificate(soap->ssl); if (!peer) { soap_closesock(soap); return soap_set_sender_error(soap, "SSL/TLS error", "No SSL certificate was presented by the peer in soap_ssl_accept()", SOAP_SSL_ERROR); } X509_free(peer); } #endif #ifdef WITH_GNUTLS int retries = 0, r; if (!soap_valid_socket(sk)) return soap_set_receiver_error(soap, "SSL/TLS error", "No socket in soap_ssl_accept()", SOAP_SSL_ERROR); soap->ssl_flags &= ~SOAP_SSL_CLIENT; if (!soap->session && (soap->error = soap->fsslauth(soap))) { soap_closesock(soap); return soap->error; } gnutls_transport_set_ptr(soap->session, (gnutls_transport_ptr_t)(long)sk); /* Set SSL sockets to non-blocking */ if (soap->accept_timeout) { SOAP_SOCKNONBLOCK(sk) retries = 10*soap->accept_timeout; } if (retries <= 0) retries = 100; /* timeout: 10 sec retries, 100 times 0.1 sec */ while ((r = gnutls_handshake(soap->session))) { int s; /* GNUTLS repeat handhake when GNUTLS_E_AGAIN */ if (retries-- <= 0) break; if (r == GNUTLS_E_AGAIN || r == GNUTLS_E_INTERRUPTED) { if (!gnutls_record_get_direction(soap->session)) s = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, -100000); else s = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, -100000); if (s < 0) break; } else { soap->errnum = soap_socket_errno(sk); break; } } if (r) { soap_closesock(soap); return soap_set_receiver_error(soap, soap_ssl_error(soap, r), "SSL/TLS handshake failed", SOAP_SSL_ERROR); } if ((soap->ssl_flags & SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION)) { const char *err = ssl_verify(soap, NULL); if (err) { soap_closesock(soap); return soap_set_receiver_error(soap, "SSL/TLS error", err, SOAP_SSL_ERROR); } } #endif #ifdef WITH_SYSTEMSSL gsk_iocallback local_io = { ssl_recv, ssl_send, NULL, NULL, NULL, NULL }; int err, s; int retries = 0; if (soap->accept_timeout) { SOAP_SOCKNONBLOCK(sk) retries = 10*soap->accept_timeout; } if (retries <= 0) retries = 100; /* timeout: 10 sec retries, 100 times 0.1 sec */ err = gsk_secure_socket_open(soap->ctx, &soap->ssl); if (err == GSK_OK) err = gsk_attribute_set_numeric_value(soap->ssl, GSK_FD, sk); if (err == GSK_OK) err = gsk_attribute_set_buffer(soap->ssl, GSK_KEYRING_LABEL, soap->cafile, 0); if (err == GSK_OK) err = gsk_attribute_set_enum(soap->ssl, GSK_SESSION_TYPE, GSK_SERVER_SESSION); if (err == GSK_OK) err = gsk_attribute_set_buffer(soap->ssl, GSK_V3_CIPHER_SPECS_EXPANDED, "0035002F000A", 0); if (err == GSK_OK) err = gsk_attribute_set_enum(soap->ssl, GSK_V3_CIPHERS, GSK_V3_CIPHERS_CHAR4); if (err == GSK_OK) err = gsk_attribute_set_callback(soap->ssl, GSK_IO_CALLBACK, &local_io); if (err != GSK_OK) return soap_set_receiver_error(soap, gsk_strerror(err), "SYSTEM SSL error in soap_ssl_accept()", SOAP_SSL_ERROR); while ((err = gsk_secure_socket_init(soap->ssl)) != GSK_OK) { if (retries-- <= 0) break; if (err == GSK_WOULD_BLOCK_READ || err == GSK_WOULD_BLOCK_WRITE) { if (err == GSK_WOULD_BLOCK_READ) s = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, -100000); else s = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, -100000); if (s < 0) break; } else { soap->errnum = soap_socket_errno(sk); break; } } if (err != GSK_OK) return soap_set_receiver_error(soap, gsk_strerror(err), "gsk_secure_socket_init() failed in soap_ssl_accept()", SOAP_SSL_ERROR); #endif if (soap->recv_timeout || soap->send_timeout) SOAP_SOCKNONBLOCK(sk) else SOAP_SOCKBLOCK(sk) soap->imode |= SOAP_ENC_SSL; soap->omode |= SOAP_ENC_SSL; return SOAP_OK; } #endif #endif #endif /******************************************************************************\ * * TCP/UDP [SSL/TLS] IPv4 and IPv6 * \******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 static int tcp_init(struct soap *soap) { soap->errmode = 1; #ifdef WIN32 if (tcp_done) return 0; else { WSADATA w; if (WSAStartup(MAKEWORD(1, 1), &w)) return -1; tcp_done = 1; } #endif return 0; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 static const char* tcp_error(struct soap *soap) { const char *msg = NULL; switch (soap->errmode) { case 0: msg = soap_strerror(soap); break; case 1: msg = "WSAStartup failed"; break; case 2: { #ifndef WITH_LEAN msg = soap_code_str(h_error_codes, soap->errnum); if (!msg) #endif { (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), 37), "TCP/UDP IP error %d", soap->errnum); msg = soap->msgbuf; } } } return msg; } #endif #endif /******************************************************************************/ #ifndef WITH_IPV6 #ifndef WITH_NOIO #ifndef PALM_1 static int tcp_gethost(struct soap *soap, const char *addr, struct in_addr *inaddr) { soap_int32 iadd = -1; struct hostent hostent, *host = &hostent; #ifdef VXWORKS int hostint; /* inet_addr(), and hostGetByName() expect "char *"; addr is a "const char *". */ iadd = inet_addr((char*)addr); #else #if defined(_AIX43) || ((defined(TRU64) || defined(HP_UX)) && defined(HAVE_GETHOSTBYNAME_R)) struct hostent_data ht_data; #endif #ifdef AS400 iadd = inet_addr((void*)addr); #else iadd = inet_addr((char*)addr); #endif #endif if (iadd != -1) { if (soap_memcpy((void*)inaddr, sizeof(struct in_addr), (const void*)&iadd, sizeof(iadd))) return soap->error = SOAP_EOM; return SOAP_OK; } #if defined(__GLIBC__) || (defined(HAVE_GETHOSTBYNAME_R) && (defined(FREEBSD) || defined(__FreeBSD__))) || defined(__ANDROID__) if (gethostbyname_r(addr, &hostent, soap->buf, sizeof(soap->buf), &host, &soap->errnum) < 0) host = NULL; #elif defined(_AIX43) || ((defined(TRU64) || defined(HP_UX)) && defined(HAVE_GETHOSTBYNAME_R)) memset((void*)&ht_data, 0, sizeof(ht_data)); if (gethostbyname_r(addr, &hostent, &ht_data) < 0) { host = NULL; soap->errnum = h_errno; } #elif defined(HAVE_GETHOSTBYNAME_R) host = gethostbyname_r(addr, &hostent, soap->buf, sizeof(soap->buf), &soap->errnum); #elif defined(VXWORKS) /* If the DNS resolver library resolvLib has been configured in the vxWorks * image, a query for the host IP address is sent to the DNS server, if the * name was not found in the local host table. */ hostint = hostGetByName((char*)addr); if (hostint == ERROR) { host = NULL; soap->errnum = soap_errno; } #else #ifdef AS400 if (!(host = gethostbyname((void*)addr))) soap->errnum = h_errno; #else if (!(host = gethostbyname((char*)addr))) soap->errnum = h_errno; #endif #endif if (!host) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Host name not found\n")); return SOAP_ERR; } #ifdef VXWORKS inaddr->s_addr = hostint; #else if (soap_memcpy((void*)inaddr, sizeof(struct in_addr), (const void*)host->h_addr, (size_t)host->h_length)) return soap->error = SOAP_EOM; #endif return SOAP_OK; } #endif #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 static SOAP_SOCKET tcp_connect(struct soap *soap, const char *endpoint, const char *host, int port) { #ifdef WITH_IPV6 struct addrinfo hints, *res, *ressave; #endif SOAP_SOCKET sk; int err = 0; #ifndef WITH_LEAN #ifndef WIN32 int len = sizeof(soap->buf); #else int len = sizeof(soap->buf) + 1; /* speeds up windows xfer */ #endif int set = 1; #endif #if !defined(WITH_LEAN) || defined(WITH_OPENSSL) || defined(WITH_GNUTLS) || defined(WITH_SYSTEMSSL) int retries; #endif if (soap_valid_socket(soap->socket)) soap->fclosesocket(soap, soap->socket); soap->socket = SOAP_INVALID_SOCKET; if (tcp_init(soap)) { soap->errnum = 0; soap_set_receiver_error(soap, tcp_error(soap), "TCP init failed in tcp_connect()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } soap->errmode = 0; #ifdef WITH_IPV6 memset((void*)&hints, 0, sizeof(hints)); #ifdef WITH_IPV6_V6ONLY hints.ai_family = PF_INET6; #else hints.ai_family = PF_UNSPEC; #endif #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) hints.ai_socktype = SOCK_DGRAM; else #endif hints.ai_socktype = SOCK_STREAM; soap->errmode = 2; if (soap->proxy_host) err = getaddrinfo(soap->proxy_host, soap_int2s(soap, soap->proxy_port), &hints, &res); else err = getaddrinfo(host, soap_int2s(soap, port), &hints, &res); if (err || !res) { soap_set_receiver_error(soap, SOAP_GAI_STRERROR(err), "getaddrinfo failed in tcp_connect()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } ressave = res; again: sk = socket(res->ai_family, res->ai_socktype, res->ai_protocol); soap->error = SOAP_OK; soap->errmode = 0; #else #ifndef WITH_LEAN again: #endif #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) sk = socket(AF_INET, SOCK_DGRAM, 0); else #endif sk = socket(AF_INET, SOCK_STREAM, 0); #endif if (!soap_valid_socket(sk)) { #ifdef WITH_IPV6 if (res->ai_next) { res = res->ai_next; goto again; } #endif soap->errnum = soap_socket_errno(sk); soap_set_receiver_error(soap, tcp_error(soap), "socket failed in tcp_connect()", SOAP_TCP_ERROR); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } #ifdef SOCKET_CLOSE_ON_EXIT #ifdef WIN32 #ifndef UNDER_CE SetHandleInformation((HANDLE)sk, HANDLE_FLAG_INHERIT, 0); #endif #else fcntl(sk, F_SETFD, 1); #endif #endif #ifndef WITH_LEAN if ((soap->connect_flags & SO_LINGER)) { struct linger linger; memset((void*)&linger, 0, sizeof(linger)); linger.l_onoff = 1; linger.l_linger = soap->linger_time; if (setsockopt(sk, SOL_SOCKET, SO_LINGER, (char*)&linger, sizeof(struct linger))) { soap->errnum = soap_socket_errno(sk); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_LINGER failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } } if ((soap->connect_flags & ~SO_LINGER) && setsockopt(sk, SOL_SOCKET, soap->connect_flags & ~SO_LINGER, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(sk); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } #ifndef UNDER_CE if ((soap->keep_alive || soap->tcp_keep_alive) && setsockopt(sk, SOL_SOCKET, SO_KEEPALIVE, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(sk); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_KEEPALIVE failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } if (setsockopt(sk, SOL_SOCKET, SO_SNDBUF, (char*)&len, sizeof(int))) { soap->errnum = soap_socket_errno(sk); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_SNDBUF failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } if (setsockopt(sk, SOL_SOCKET, SO_RCVBUF, (char*)&len, sizeof(int))) { soap->errnum = soap_socket_errno(sk); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_RCVBUF failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } #ifdef TCP_KEEPIDLE if (soap->tcp_keep_idle && setsockopt((SOAP_SOCKET)sk, IPPROTO_TCP, TCP_KEEPIDLE, (char*)&(soap->tcp_keep_idle), sizeof(int))) { soap->errnum = soap_socket_errno(sk); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt TCP_KEEPIDLE failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, (SOAP_SOCKET)sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } #endif #ifdef TCP_KEEPINTVL if (soap->tcp_keep_intvl && setsockopt((SOAP_SOCKET)sk, IPPROTO_TCP, TCP_KEEPINTVL, (char*)&(soap->tcp_keep_intvl), sizeof(int))) { soap->errnum = soap_socket_errno(sk); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt TCP_KEEPINTVL failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, (SOAP_SOCKET)sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } #endif #ifdef TCP_KEEPCNT if (soap->tcp_keep_cnt && setsockopt((SOAP_SOCKET)sk, IPPROTO_TCP, TCP_KEEPCNT, (char*)&(soap->tcp_keep_cnt), sizeof(int))) { soap->errnum = soap_socket_errno(sk); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt TCP_KEEPCNT failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, (SOAP_SOCKET)sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } #endif #ifdef TCP_NODELAY if (!(soap->omode & SOAP_IO_UDP) && setsockopt(sk, IPPROTO_TCP, TCP_NODELAY, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(sk); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt TCP_NODELAY failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } #endif #ifdef WITH_IPV6 if ((soap->omode & SOAP_IO_UDP) && soap->ipv6_multicast_if) { struct sockaddr_in6 *in6addr = (struct sockaddr_in6*)res->ai_addr; in6addr->sin6_scope_id = soap->ipv6_multicast_if; } #endif #ifdef IP_MULTICAST_TTL if ((soap->omode & SOAP_IO_UDP)) { if (soap->ipv4_multicast_ttl) { unsigned char ttl = soap->ipv4_multicast_ttl; if (setsockopt(sk, IPPROTO_IP, IP_MULTICAST_TTL, (char*)&ttl, sizeof(ttl))) { soap->errnum = soap_socket_errno(sk); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt IP_MULTICAST_TTL failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } } if ((soap->omode & SOAP_IO_UDP) && soap->ipv4_multicast_if && !soap->ipv6_multicast_if) { if (setsockopt(sk, IPPROTO_IP, IP_MULTICAST_IF, (char*)soap->ipv4_multicast_if, sizeof(struct in_addr))) #ifndef WINDOWS { soap->errnum = soap_socket_errno(sk); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt IP_MULTICAST_IF failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } #else #ifndef IP_MULTICAST_IF #define IP_MULTICAST_IF 2 #endif if (setsockopt(sk, IPPROTO_IP, IP_MULTICAST_IF, (char*)soap->ipv4_multicast_if, sizeof(struct in_addr))) { soap->errnum = soap_socket_errno(sk); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt IP_MULTICAST_IF failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } #endif } } #endif #endif #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Opening socket=%d to host='%s' port=%d\n", sk, host, port)); #ifndef WITH_IPV6 soap->peerlen = sizeof(soap->peer.in); memset((void*)&soap->peer.in, 0, sizeof(soap->peer.in)); soap->peer.in.sin_family = AF_INET; soap->errmode = 2; if (soap->proxy_host) { if (soap->fresolve(soap, soap->proxy_host, &soap->peer.in.sin_addr)) { soap_set_receiver_error(soap, tcp_error(soap), "get proxy host by name failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } soap->peer.in.sin_port = htons((short)soap->proxy_port); } else { if (soap->fresolve(soap, host, &soap->peer.in.sin_addr)) { soap_set_receiver_error(soap, tcp_error(soap), "get host by name failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } soap->peer.in.sin_port = htons((short)port); } soap->errmode = 0; #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) return sk; #endif #else if ((soap->omode & SOAP_IO_UDP)) { if (soap_memcpy((void*)&soap->peer.storage, sizeof(soap->peer.storage), (const void*)res->ai_addr, res->ai_addrlen)) { soap->error = SOAP_EOM; soap->fclosesocket(soap, sk); sk = SOAP_INVALID_SOCKET; } soap->peerlen = res->ai_addrlen; freeaddrinfo(ressave); return sk; } #endif #ifndef WITH_LEAN if (soap->connect_timeout) SOAP_SOCKNONBLOCK(sk) else SOAP_SOCKBLOCK(sk) retries = 10; #endif for (;;) { #ifdef WITH_IPV6 if (connect(sk, res->ai_addr, (int)res->ai_addrlen)) #else if (connect(sk, &soap->peer.addr, sizeof(soap->peer.in))) #endif { err = soap_socket_errno(sk); #ifdef WITH_IPV6 if (err == SOAP_ECONNREFUSED && res->ai_next) { soap->fclosesocket(soap, sk); res = res->ai_next; goto again; } #endif #ifndef WITH_LEAN if (err == SOAP_EADDRINUSE) { soap->fclosesocket(soap, sk); if (retries-- > 0) goto again; } else if (soap->connect_timeout && (err == SOAP_EINPROGRESS || err == SOAP_EAGAIN || err == SOAP_EWOULDBLOCK)) { SOAP_SOCKLEN_T k; for (;;) { int r; r = tcp_select(soap, sk, SOAP_TCP_SELECT_SND, soap->connect_timeout); if (r > 0) break; if (!r) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connect timeout\n")); soap_set_receiver_error(soap, "Timeout", "connect failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); #ifdef WITH_IPV6 if (res->ai_next) { res = res->ai_next; goto again; } freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } r = soap->errnum = soap_socket_errno(sk); if (r != SOAP_EINTR) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not connect to host\n")); soap_set_receiver_error(soap, tcp_error(soap), "connect failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); #ifdef WITH_IPV6 if (res->ai_next) { res = res->ai_next; goto again; } freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } } k = (SOAP_SOCKLEN_T)sizeof(soap->errnum); if (!getsockopt(sk, SOL_SOCKET, SO_ERROR, (char*)&soap->errnum, &k) && !soap->errnum) /* portability note: see SOAP_SOCKLEN_T definition in stdsoap2.h */ break; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not connect to host\n")); if (!soap->errnum) soap->errnum = soap_socket_errno(sk); soap_set_receiver_error(soap, tcp_error(soap), "connect failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); #ifdef WITH_IPV6 if (res->ai_next) { res = res->ai_next; goto again; } freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } #endif #ifdef WITH_IPV6 if (res->ai_next) { res = res->ai_next; soap->fclosesocket(soap, sk); goto again; } #endif if (err && err != SOAP_EINTR) { soap->errnum = err; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not connect to host\n")); soap_set_receiver_error(soap, tcp_error(soap), "connect failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } } else break; } #ifdef WITH_IPV6 soap->peerlen = 0; /* IPv6: already connected so use send() */ freeaddrinfo(ressave); #endif soap->socket = sk; soap->imode &= ~SOAP_ENC_SSL; soap->omode &= ~SOAP_ENC_SSL; if (endpoint && !soap_tag_cmp(endpoint, "https:*")) { #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) || defined(WITH_SYSTEMSSL) #ifdef WITH_OPENSSL BIO *bio; #endif #ifdef WITH_SYSTEMSSL gsk_iocallback local_io = { ssl_recv, ssl_send, NULL, NULL, NULL, NULL }; #endif int r; if (soap->proxy_host) { soap_mode m = soap->mode; /* preserve settings */ soap_mode om = soap->omode; /* make sure we only parse HTTP */ size_t n = soap->count; /* save the content length */ const char *userid, *passwd; int status = soap->status; /* save the current status/command */ short keep_alive = soap->keep_alive; /* save the KA status */ soap->omode &= ~SOAP_ENC; /* mask IO and ENC */ soap->omode |= SOAP_IO_BUFFER; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connecting to %s proxy server %s for destination endpoint %s\n", soap->proxy_http_version, soap->proxy_host, endpoint)); #ifdef WITH_NTLM if (soap->ntlm_challenge) { if (soap_ntlm_handshake(soap, SOAP_CONNECT, endpoint, host, port)) return soap->error; } #endif if (soap_begin_send(soap)) { soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } soap->status = SOAP_CONNECT; soap->keep_alive = 1; if ((soap->error = soap->fpost(soap, endpoint, host, port, NULL, NULL, 0)) || soap_end_send_flush(soap)) { soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } soap->keep_alive = keep_alive; soap->omode = om; om = soap->imode; soap->imode &= ~SOAP_ENC; /* mask IO and ENC */ userid = soap->userid; /* preserve */ passwd = soap->passwd; /* preserve */ if ((soap->error = soap->fparse(soap))) { soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } soap->status = status; /* restore */ soap->userid = userid; /* restore */ soap->passwd = passwd; /* restore */ soap->imode = om; /* restore */ soap->count = n; /* restore */ if (soap_begin_send(soap)) { soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } if (endpoint) soap_strcpy(soap->endpoint, sizeof(soap->endpoint), endpoint); /* restore */ soap->mode = m; } #ifdef WITH_OPENSSL soap->ssl_flags |= SOAP_SSL_CLIENT; if (!soap->ctx && (soap->error = soap->fsslauth(soap))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL required, but no ctx set\n")); soap->fclosesocket(soap, sk); soap->error = SOAP_SSL_ERROR; return SOAP_INVALID_SOCKET; } if (!soap->ssl) { soap->ssl = SSL_new(soap->ctx); if (!soap->ssl) { soap->fclosesocket(soap, sk); soap->error = SOAP_SSL_ERROR; return SOAP_INVALID_SOCKET; } } else SSL_clear(soap->ssl); if (soap->session) { if (!strcmp(soap->session_host, host) && soap->session_port == port) SSL_set_session(soap->ssl, soap->session); SSL_SESSION_free(soap->session); soap->session = NULL; } #if (OPENSSL_VERSION_NUMBER >= 0x1000000aL) if (!(soap->ssl_flags & SOAP_SSLv3) && !SSL_set_tlsext_host_name(soap->ssl, host)) { soap_set_receiver_error(soap, "SSL/TLS error", "SNI failed", SOAP_SSL_ERROR); soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } #elif (OPENSSL_VERSION_NUMBER >= 0x0090800fL) && defined(SSL_CTRL_SET_TLSEXT_HOSTNAME) if (SSL_ctrl(soap->ssl, SSL_CTRL_SET_TLSEXT_HOSTNAME, TLSEXT_NAMETYPE_host_name, (void*)host)) { soap_set_receiver_error(soap, "SSL/TLS error", "SNI failed", SOAP_SSL_ERROR); soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } #endif bio = BIO_new_socket((int)sk, BIO_NOCLOSE); SSL_set_bio(soap->ssl, bio, bio); /* Connect timeout: set SSL sockets to non-blocking */ retries = 0; if (soap->connect_timeout) { SOAP_SOCKNONBLOCK(sk) retries = 10*soap->connect_timeout; } else SOAP_SOCKBLOCK(sk) if (retries <= 0) retries = 100; /* timeout: 10 sec retries, 100 times 0.1 sec */ /* Try connecting until success or timeout (when nonblocking) */ do { if ((r = SSL_connect(soap->ssl)) <= 0) { int err = SSL_get_error(soap->ssl, r); if (err == SSL_ERROR_WANT_CONNECT || err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE) { int s; if (err == SSL_ERROR_WANT_READ) s = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, -100000); else s = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, -100000); if (s < 0) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL_connect/select error in tcp_connect\n")); soap_set_receiver_error(soap, soap_ssl_error(soap, r), "SSL_connect failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } if (s == 0 && retries-- <= 0) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL/TLS connect timeout\n")); soap_set_receiver_error(soap, "Timeout", "SSL_connect failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } } else { soap_set_receiver_error(soap, soap_ssl_error(soap, r), "SSL_connect error in tcp_connect()", SOAP_SSL_ERROR); soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } } } while (!SSL_is_init_finished(soap->ssl)); /* Set SSL sockets to nonblocking */ SOAP_SOCKNONBLOCK(sk) /* Check server credentials when required */ if ((soap->ssl_flags & SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION)) { int err; if ((err = SSL_get_verify_result(soap->ssl)) != X509_V_OK) { soap_set_sender_error(soap, X509_verify_cert_error_string(err), "SSL/TLS certificate presented by peer cannot be verified in tcp_connect()", SOAP_SSL_ERROR); soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } if (!(soap->ssl_flags & SOAP_SSL_SKIP_HOST_CHECK)) { X509_NAME *subj; STACK_OF(CONF_VALUE) *val = NULL; #if (OPENSSL_VERSION_NUMBER >= 0x0090800fL) GENERAL_NAMES *names = NULL; #else int ext_count; #endif int ok = 0; X509 *peer = SSL_get_peer_certificate(soap->ssl); if (!peer) { soap_set_sender_error(soap, "SSL/TLS error", "No SSL/TLS certificate was presented by the peer in tcp_connect()", SOAP_SSL_ERROR); soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } #if (OPENSSL_VERSION_NUMBER < 0x0090800fL) ext_count = X509_get_ext_count(peer); if (ext_count > 0) { int i; for (i = 0; i < ext_count; i++) { X509_EXTENSION *ext = X509_get_ext(peer, i); const char *ext_str = OBJ_nid2sn(OBJ_obj2nid(X509_EXTENSION_get_object(ext))); if (ext_str && !strcmp(ext_str, "subjectAltName")) { X509V3_EXT_METHOD *meth = (X509V3_EXT_METHOD*)X509V3_EXT_get(ext); unsigned char *data; if (!meth) break; data = ext->value->data; if (data) { #if (OPENSSL_VERSION_NUMBER > 0x00907000L) void *ext_data; if (meth->it) ext_data = ASN1_item_d2i(NULL, &data, ext->value->length, ASN1_ITEM_ptr(meth->it)); else { #if (OPENSSL_VERSION_NUMBER > 0x0090800fL) ext_data = meth->d2i(NULL, (const unsigned char **)&data, ext->value->length); #else ext_data = meth->d2i(NULL, &data, ext->value->length); #endif } if (ext_data) val = meth->i2v(meth, ext_data, NULL); else val = NULL; if (meth->it) ASN1_item_free((ASN1_VALUE*)ext_data, ASN1_ITEM_ptr(meth->it)); else meth->ext_free(ext_data); #else void *ext_data = meth->d2i(NULL, &data, ext->value->length); if (ext_data) val = meth->i2v(meth, ext_data, NULL); meth->ext_free(ext_data); #endif if (val) { int j; for (j = 0; j < sk_CONF_VALUE_num(val); j++) { CONF_VALUE *nval = sk_CONF_VALUE_value(val, j); if (nval && !strcmp(nval->name, "DNS") && !strcmp(nval->value, host)) { ok = 1; break; } } sk_CONF_VALUE_pop_free(val, X509V3_conf_free); } } } if (ok) break; } } #else names = (GENERAL_NAMES*)X509_get_ext_d2i(peer, NID_subject_alt_name, NULL, NULL); if (names) { val = i2v_GENERAL_NAMES(NULL, names, val); sk_GENERAL_NAME_pop_free(names, GENERAL_NAME_free); } if (val) { int j; for (j = 0; j < sk_CONF_VALUE_num(val); j++) { CONF_VALUE *nval = sk_CONF_VALUE_value(val, j); if (nval && !strcmp(nval->name, "DNS") && !strcmp(nval->value, host)) { ok = 1; break; } } sk_CONF_VALUE_pop_free(val, X509V3_conf_free); } #endif if (!ok && (subj = X509_get_subject_name(peer))) { int i = -1; do { ASN1_STRING *name; i = X509_NAME_get_index_by_NID(subj, NID_commonName, i); if (i == -1) break; name = X509_NAME_ENTRY_get_data(X509_NAME_get_entry(subj, i)); if (name) { if (!soap_tag_cmp(host, (const char*)M_ASN1_STRING_data(name))) ok = 1; else { unsigned char *tmp = NULL; ASN1_STRING_to_UTF8(&tmp, name); if (tmp) { if (!soap_tag_cmp(host, (const char*)tmp)) ok = 1; else if (tmp[0] == '*') /* wildcard domain */ { const char *t = strchr(host, '.'); if (t && !soap_tag_cmp(t, (const char*)tmp+1)) ok = 1; } OPENSSL_free(tmp); } } } } while (!ok); } X509_free(peer); if (!ok) { soap_set_sender_error(soap, "SSL/TLS error", "SSL/TLS certificate host name mismatch in tcp_connect()", SOAP_SSL_ERROR); soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } } } #endif #ifdef WITH_GNUTLS soap->ssl_flags |= SOAP_SSL_CLIENT; if (!soap->session && (soap->error = soap->fsslauth(soap))) { soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } gnutls_transport_set_ptr(soap->session, (gnutls_transport_ptr_t)(long)sk); /* Set SSL sockets to non-blocking */ if (soap->connect_timeout) { SOAP_SOCKNONBLOCK(sk) retries = 10*soap->connect_timeout; } else SOAP_SOCKBLOCK(sk) if (retries <= 0) retries = 100; /* timeout: 10 sec retries, 100 times 0.1 sec */ while ((r = gnutls_handshake(soap->session))) { int s; /* GNUTLS repeat handhake when GNUTLS_E_AGAIN */ if (retries-- <= 0) break; if (r == GNUTLS_E_AGAIN || r == GNUTLS_E_INTERRUPTED) { if (!gnutls_record_get_direction(soap->session)) s = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, -100000); else s = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, -100000); if (s < 0) break; } else { soap->errnum = soap_socket_errno(sk); break; } } if (r) { soap_set_sender_error(soap, soap_ssl_error(soap, r), "SSL/TLS handshake failed", SOAP_SSL_ERROR); soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } if ((soap->ssl_flags & SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION)) { const char *err = ssl_verify(soap, host); if (err) { soap->fclosesocket(soap, sk); soap->error = soap_set_sender_error(soap, "SSL/TLS verify error", err, SOAP_SSL_ERROR); return SOAP_INVALID_SOCKET; } } #endif #ifdef WITH_SYSTEMSSL soap->ssl_flags |= SOAP_SSL_CLIENT; if (!soap->ctx && (soap->error = soap->fsslauth(soap))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL required, but no ctx set\n")); soap->fclosesocket(soap, sk); soap->error = SOAP_SSL_ERROR; return SOAP_INVALID_SOCKET; } /* Connect timeout: set SSL sockets to non-blocking */ retries = 0; if (soap->connect_timeout) { SOAP_SOCKNONBLOCK(sk) retries = 10*soap->connect_timeout; } else SOAP_SOCKBLOCK(sk) if (retries <= 0) retries = 100; /* timeout: 10 sec retries, 100 times 0.1 sec */ err = gsk_secure_socket_open(soap->ctx, &soap->ssl); if (err == GSK_OK) err = gsk_attribute_set_numeric_value(soap->ssl, GSK_FD, sk); if (err == GSK_OK) err = gsk_attribute_set_buffer(soap->ssl, GSK_KEYRING_LABEL, soap->cafile, 0); /* Certificate label */ if (err == GSK_OK) err = gsk_attribute_set_enum(soap->ssl, GSK_SESSION_TYPE, GSK_CLIENT_SESSION); if (err == GSK_OK) err = gsk_attribute_set_buffer(soap->ssl, GSK_V3_CIPHER_SPECS_EXPANDED, "0035002F000A", 0); if (err == GSK_OK) err = gsk_attribute_set_enum(soap->ssl, GSK_V3_CIPHERS, GSK_V3_CIPHERS_CHAR4); if (err == GSK_OK) err = gsk_attribute_set_callback(soap->ssl, GSK_IO_CALLBACK, &local_io); if (err != GSK_OK) { soap_set_receiver_error(soap, gsk_strerror(err), "SYSTEM SSL error in tcp_connect()", SOAP_SSL_ERROR); return SOAP_INVALID_SOCKET; } /* Try connecting until success or timeout (when nonblocking) */ while ((err = gsk_secure_socket_init(soap->ssl)) != GSK_OK) { if (err == GSK_WOULD_BLOCK_READ || err == GSK_WOULD_BLOCK_WRITE) { if (err == GSK_WOULD_BLOCK_READ) r = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, -100000); else r = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, -100000); if (r < 0) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL_connect/select error in tcp_connect\n")); soap_set_receiver_error(soap, gsk_strerror(err), "gsk_secure_socket_init failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } if (r == 0 && retries-- <= 0) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL/TLS connect timeout\n")); soap_set_receiver_error(soap, "Timeout", "in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } } else { soap_set_receiver_error(soap, gsk_strerror(err), "gsk_secure_socket_init() failed in tcp_connect()", SOAP_SSL_ERROR); soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } } #endif soap->imode |= SOAP_ENC_SSL; soap->omode |= SOAP_ENC_SSL; #else soap->fclosesocket(soap, sk); soap->error = SOAP_SSL_ERROR; return SOAP_INVALID_SOCKET; #endif } if (soap->recv_timeout || soap->send_timeout) SOAP_SOCKNONBLOCK(sk) else SOAP_SOCKBLOCK(sk) return sk; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 static int tcp_select(struct soap *soap, SOAP_SOCKET sk, int flags, int timeout) { int r; struct timeval tv; fd_set fd[3], *rfd, *sfd, *efd; int retries = 0; int eintr = SOAP_MAXEINTR; soap->errnum = 0; #ifndef WIN32 #if !defined(FD_SETSIZE) || defined(__QNX__) || defined(QNX) /* no FD_SETSIZE or select() is not MT safe on some QNX: always poll */ if (1) #else /* if fd max set size exceeded, use poll() */ if ((int)sk >= (int)FD_SETSIZE) #endif #ifdef HAVE_POLL { struct pollfd pollfd; pollfd.fd = (int)sk; pollfd.events = 0; if (flags & SOAP_TCP_SELECT_RCV) pollfd.events |= POLLIN; if (flags & SOAP_TCP_SELECT_SND) pollfd.events |= POLLOUT; if (flags & SOAP_TCP_SELECT_ERR) pollfd.events |= POLLERR; if (timeout <= 0) timeout /= -1000; /* -usec -> ms */ else { retries = timeout - 1; timeout = 1000; } do { r = poll(&pollfd, 1, timeout); if (r < 0 && (soap->errnum = soap_socket_errno(sk)) == SOAP_EINTR && eintr-- > 0) r = 0; else if (retries-- <= 0) break; } while (r == 0); if (r > 0) { r = 0; if ((flags & SOAP_TCP_SELECT_RCV) && (pollfd.revents & POLLIN)) r |= SOAP_TCP_SELECT_RCV; if ((flags & SOAP_TCP_SELECT_SND) && (pollfd.revents & POLLOUT)) r |= SOAP_TCP_SELECT_SND; if ((flags & SOAP_TCP_SELECT_ERR) && (pollfd.revents & POLLERR)) r |= SOAP_TCP_SELECT_ERR; } else if (r == 0) soap->errnum = 0; return r; } #else { soap->error = SOAP_FD_EXCEEDED; return -1; } #endif #endif if (timeout > 0) retries = timeout - 1; do { rfd = sfd = efd = NULL; if (flags & SOAP_TCP_SELECT_RCV) { rfd = &fd[0]; FD_ZERO(rfd); FD_SET(sk, rfd); } if (flags & SOAP_TCP_SELECT_SND) { sfd = &fd[1]; FD_ZERO(sfd); FD_SET(sk, sfd); } if (flags & SOAP_TCP_SELECT_ERR) { efd = &fd[2]; FD_ZERO(efd); FD_SET(sk, efd); } if (timeout <= 0) { tv.tv_sec = -timeout / 1000000; tv.tv_usec = -timeout % 1000000; } else { tv.tv_sec = 1; tv.tv_usec = 0; } r = select((int)sk + 1, rfd, sfd, efd, &tv); if (r < 0 && (soap->errnum = soap_socket_errno(sk)) == SOAP_EINTR && eintr-- > 0) r = 0; else if (retries-- <= 0) break; } while (r == 0); if (r > 0) { r = 0; if ((flags & SOAP_TCP_SELECT_RCV) && FD_ISSET(sk, rfd)) r |= SOAP_TCP_SELECT_RCV; if ((flags & SOAP_TCP_SELECT_SND) && FD_ISSET(sk, sfd)) r |= SOAP_TCP_SELECT_SND; if ((flags & SOAP_TCP_SELECT_ERR) && FD_ISSET(sk, efd)) r |= SOAP_TCP_SELECT_ERR; } else if (r == 0) soap->errnum = 0; return r; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 static SOAP_SOCKET tcp_accept(struct soap *soap, SOAP_SOCKET s, struct sockaddr *a, int *n) { SOAP_SOCKET sk; (void)soap; sk = accept(s, a, (SOAP_SOCKLEN_T*)n); /* portability note: see SOAP_SOCKLEN_T definition in stdsoap2.h */ #ifdef SOCKET_CLOSE_ON_EXIT #ifdef WIN32 #ifndef UNDER_CE SetHandleInformation((HANDLE)sk, HANDLE_FLAG_INHERIT, 0); #endif #else fcntl(sk, F_SETFD, FD_CLOEXEC); #endif #endif return sk; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 static int tcp_disconnect(struct soap *soap) { #ifdef WITH_OPENSSL if (soap->ssl) { int r, s = 0; if (soap->session) { SSL_SESSION_free(soap->session); soap->session = NULL; } if (*soap->host) { soap->session = SSL_get1_session(soap->ssl); if (soap->session) { soap_strcpy(soap->session_host, sizeof(soap->session_host), soap->host); soap->session_port = soap->port; } } r = SSL_shutdown(soap->ssl); /* SSL shutdown does not work when reads are pending, non-blocking */ if (r == 0) { while (SSL_want_read(soap->ssl)) { if (SSL_read(soap->ssl, NULL, 0) || soap_socket_errno(soap->socket) != SOAP_EAGAIN) { r = SSL_shutdown(soap->ssl); break; } } } if (r == 0) { if (soap_valid_socket(soap->socket)) { if (!soap->fshutdownsocket(soap, soap->socket, SOAP_SHUT_WR)) { #if !defined(WITH_LEAN) && !defined(WIN32) /* wait up to 5 seconds for close_notify to be sent by peer (if peer not present, this avoids calling SSL_shutdown() which has a lengthy return timeout) */ r = tcp_select(soap, soap->socket, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, 5); if (r <= 0) { soap->errnum = 0; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connection lost...\n")); soap->fclosesocket(soap, soap->socket); soap->socket = SOAP_INVALID_SOCKET; ERR_remove_state(0); SSL_free(soap->ssl); soap->ssl = NULL; return SOAP_OK; } #else r = SSL_shutdown(soap->ssl); #endif } } } if (r != 1) { s = ERR_get_error(); if (s) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Shutdown failed: %d\n", SSL_get_error(soap->ssl, r))); if (soap_valid_socket(soap->socket) && !(soap->omode & SOAP_IO_UDP)) { soap->fclosesocket(soap, soap->socket); soap->socket = SOAP_INVALID_SOCKET; } } } SSL_free(soap->ssl); soap->ssl = NULL; if (s) return SOAP_SSL_ERROR; ERR_remove_state(0); } #endif #ifdef WITH_GNUTLS if (soap->session) { gnutls_bye(soap->session, GNUTLS_SHUT_RDWR); gnutls_deinit(soap->session); soap->session = NULL; } #endif #ifdef WITH_SYSTEMSSL if (soap->ssl) { gsk_secure_socket_shutdown(soap->ssl); gsk_secure_socket_close(&soap->ssl); } #endif if (soap_valid_socket(soap->socket) && !(soap->omode & SOAP_IO_UDP)) { soap->fshutdownsocket(soap, soap->socket, SOAP_SHUT_RDWR); soap->fclosesocket(soap, soap->socket); soap->socket = SOAP_INVALID_SOCKET; } return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 static int tcp_closesocket(struct soap *soap, SOAP_SOCKET sk) { (void)soap; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Close socket=%d\n", (int)sk)); return soap_closesocket(sk); } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 static int tcp_shutdownsocket(struct soap *soap, SOAP_SOCKET sk, int how) { (void)soap; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Shutdown socket=%d how=%d\n", (int)sk, how)); return shutdown(sk, how); } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 SOAP_FMAC1 SOAP_SOCKET SOAP_FMAC2 soap_bind(struct soap *soap, const char *host, int port, int backlog) { #ifdef WITH_IPV6 struct addrinfo *addrinfo = NULL; struct addrinfo hints; struct addrinfo res; int err; #ifdef WITH_NO_IPV6_V6ONLY int unset = 0; #endif #endif #ifndef WITH_LEAN #ifndef WIN32 int len = sizeof(soap->buf); #else int len = sizeof(soap->buf) + 1; /* speeds up windows xfer */ #endif int set = 1; #endif if (soap_valid_socket(soap->master)) { soap->fclosesocket(soap, soap->master); soap->master = SOAP_INVALID_SOCKET; } soap->socket = SOAP_INVALID_SOCKET; soap->errmode = 1; if (tcp_init(soap)) { soap_set_receiver_error(soap, tcp_error(soap), "TCP init failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } #ifdef WITH_IPV6 memset((void*)&hints, 0, sizeof(hints)); #ifdef WITH_IPV6_V6ONLY hints.ai_family = PF_INET6; #else hints.ai_family = PF_UNSPEC; #endif #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) hints.ai_socktype = SOCK_DGRAM; else #endif hints.ai_socktype = SOCK_STREAM; hints.ai_flags = AI_PASSIVE; soap->errmode = 2; err = getaddrinfo(host, soap_int2s(soap, port), &hints, &addrinfo); if (err || !addrinfo) { soap_set_receiver_error(soap, SOAP_GAI_STRERROR(err), "getaddrinfo failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } res = *addrinfo; if (soap_memcpy((void*)&soap->peer.storage, sizeof(soap->peer.storage), (const void*)addrinfo->ai_addr, addrinfo->ai_addrlen)) { soap->error = SOAP_EOM; return SOAP_INVALID_SOCKET; } soap->peerlen = addrinfo->ai_addrlen; res.ai_addr = &soap->peer.addr; res.ai_addrlen = soap->peerlen; freeaddrinfo(addrinfo); soap->master = (int)socket(res.ai_family, res.ai_socktype, res.ai_protocol); #else #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) soap->master = (int)socket(AF_INET, SOCK_DGRAM, 0); else #endif soap->master = (int)socket(AF_INET, SOCK_STREAM, 0); #endif soap->errmode = 0; if (!soap_valid_socket(soap->master)) { soap->errnum = soap_socket_errno(soap->master); soap_set_receiver_error(soap, tcp_error(soap), "socket failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } soap->port = port; #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) soap->socket = soap->master; #endif #ifdef SOCKET_CLOSE_ON_EXIT #ifdef WIN32 #ifndef UNDER_CE SetHandleInformation((HANDLE)soap->master, HANDLE_FLAG_INHERIT, 0); #endif #else fcntl(soap->master, F_SETFD, 1); #endif #endif #ifndef WITH_LEAN if (soap->bind_flags && setsockopt(soap->master, SOL_SOCKET, soap->bind_flags, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(soap->master); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } #ifndef UNDER_CE if (((soap->imode | soap->omode) & SOAP_IO_KEEPALIVE) && (!((soap->imode | soap->omode) & SOAP_IO_UDP)) && setsockopt(soap->master, SOL_SOCKET, SO_KEEPALIVE, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(soap->master); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_KEEPALIVE failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } if (setsockopt(soap->master, SOL_SOCKET, SO_SNDBUF, (char*)&len, sizeof(int))) { soap->errnum = soap_socket_errno(soap->master); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_SNDBUF failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } if (setsockopt(soap->master, SOL_SOCKET, SO_RCVBUF, (char*)&len, sizeof(int))) { soap->errnum = soap_socket_errno(soap->master); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_RCVBUF failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } #ifdef TCP_NODELAY if (!(soap->omode & SOAP_IO_UDP) && setsockopt(soap->master, IPPROTO_TCP, TCP_NODELAY, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(soap->master); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt TCP_NODELAY failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } #endif #ifdef TCP_FASTOPEN if (!(soap->omode & SOAP_IO_UDP) && setsockopt(soap->master, SOL_TCP, TCP_FASTOPEN, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(soap->master); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt TCP_FASTOPEN failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } #endif #endif #endif #ifdef WITH_IPV6 #ifdef WITH_IPV6_V6ONLY if (res.ai_family == AF_INET6 && setsockopt(soap->master, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(soap->master); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt set IPV6_V6ONLY failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } #endif #ifdef WITH_NO_IPV6_V6ONLY if (res.ai_family == AF_INET6 && setsockopt(soap->master, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&unset, sizeof(int))) { soap->errnum = soap_socket_errno(soap->master); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt unset IPV6_V6ONLY failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } #endif soap->errmode = 0; if (bind(soap->master, res.ai_addr, (int)res.ai_addrlen)) { soap->errnum = soap_socket_errno(soap->master); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not bind to host\n")); soap_closesock(soap); soap_set_receiver_error(soap, tcp_error(soap), "bind failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } #else soap->peerlen = sizeof(soap->peer.in); memset((void*)&soap->peer.in, 0, sizeof(soap->peer.in)); soap->peer.in.sin_family = AF_INET; soap->errmode = 2; if (host) { if (soap->fresolve(soap, host, &soap->peer.in.sin_addr)) { soap_set_receiver_error(soap, tcp_error(soap), "get host by name failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } } else soap->peer.in.sin_addr.s_addr = htonl(INADDR_ANY); soap->peer.in.sin_port = htons((short)port); soap->errmode = 0; if (bind(soap->master, &soap->peer.addr, (int)soap->peerlen)) { soap->errnum = soap_socket_errno(soap->master); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not bind to host\n")); soap_closesock(soap); soap_set_receiver_error(soap, tcp_error(soap), "bind failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } #endif if (!(soap->omode & SOAP_IO_UDP) && listen(soap->master, backlog)) { soap->errnum = soap_socket_errno(soap->master); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not bind to host\n")); soap_closesock(soap); soap_set_receiver_error(soap, tcp_error(soap), "listen failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } return soap->master; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_poll(struct soap *soap) { #ifndef WITH_LEAN int r; if (soap_valid_socket(soap->socket)) { r = tcp_select(soap, soap->socket, SOAP_TCP_SELECT_ALL, 0); if (r > 0 && (r & SOAP_TCP_SELECT_ERR)) r = -1; } else if (soap_valid_socket(soap->master)) r = tcp_select(soap, soap->master, SOAP_TCP_SELECT_SND, 0); else return SOAP_OK; /* OK when no socket! */ if (r > 0) { #ifdef WITH_OPENSSL if (soap->imode & SOAP_ENC_SSL) { if (soap_valid_socket(soap->socket) && (r & SOAP_TCP_SELECT_SND) && (!(r & SOAP_TCP_SELECT_RCV) || SSL_peek(soap->ssl, soap->tmpbuf, 1) > 0)) return SOAP_OK; } else #endif { int t; if (soap_valid_socket(soap->socket) && (r & SOAP_TCP_SELECT_SND) && (!(r & SOAP_TCP_SELECT_RCV) || recv(soap->socket, (char*)&t, 1, MSG_PEEK) > 0)) return SOAP_OK; } } else if (r < 0) { if ((soap_valid_socket(soap->master) || soap_valid_socket(soap->socket)) && soap_socket_errno(soap->master) != SOAP_EINTR) { soap_set_receiver_error(soap, tcp_error(soap), "select failed in soap_poll()", SOAP_TCP_ERROR); return soap->error = SOAP_TCP_ERROR; } } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Polling: other end down on socket=%d select=%d\n", soap->socket, r)); return SOAP_EOF; #else (void)soap; return SOAP_OK; #endif } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 SOAP_FMAC1 SOAP_SOCKET SOAP_FMAC2 soap_accept(struct soap *soap) { int n = (int)sizeof(soap->peer); int err; #ifndef WITH_LEAN #ifndef WIN32 int len = sizeof(soap->buf); #else int len = sizeof(soap->buf) + 1; /* speeds up windows xfer */ #endif int set = 1; #endif soap->error = SOAP_OK; memset((void*)&soap->peer, 0, sizeof(soap->peer)); soap->socket = SOAP_INVALID_SOCKET; soap->errmode = 0; soap->keep_alive = 0; if (!soap_valid_socket(soap->master)) { soap->errnum = 0; soap_set_receiver_error(soap, tcp_error(soap), "no master socket in soap_accept()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) return soap->socket = soap->master; #endif for (;;) { if (soap->accept_timeout || soap->send_timeout || soap->recv_timeout) { for (;;) { int r; r = tcp_select(soap, soap->master, SOAP_TCP_SELECT_ALL, soap->accept_timeout ? soap->accept_timeout : 60); if (r > 0) break; if (!r && soap->accept_timeout) { soap_set_receiver_error(soap, "Timeout", "accept failed in soap_accept()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } if (r < 0) { r = soap->errnum; if (r != SOAP_EINTR) { soap_closesock(soap); soap_set_receiver_error(soap, tcp_error(soap), "accept failed in soap_accept()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } } } } if (soap->accept_timeout) SOAP_SOCKNONBLOCK(soap->master) else SOAP_SOCKBLOCK(soap->master) n = (int)sizeof(soap->peer); soap->socket = soap->faccept(soap, soap->master, &soap->peer.addr, &n); soap->peerlen = (size_t)n; if (soap_valid_socket(soap->socket)) { #ifdef WITH_IPV6 char *s = soap->host; char port[16]; int i; getnameinfo(&soap->peer.addr, n, soap->host, sizeof(soap->host), port, sizeof(port), NI_NUMERICHOST | NI_NUMERICSERV); soap->ip = 0; for (i = 0; i < 4 && *s; i++) { soap->ip = (soap->ip << 8) + (unsigned int)soap_strtoul(s, &s, 10); if (*s) s++; } soap->port = soap_strtol(port, NULL, 10); #else soap->ip = ntohl(soap->peer.in.sin_addr.s_addr); (SOAP_SNPRINTF(soap->host, sizeof(soap->host), 80), "%u.%u.%u.%u", (int)(soap->ip>>24)&0xFF, (int)(soap->ip>>16)&0xFF, (int)(soap->ip>>8)&0xFF, (int)soap->ip&0xFF); soap->port = (int)ntohs(soap->peer.in.sin_port); /* does not return port number on some systems */ #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Accept socket=%d at port=%d from IP='%s'\n", soap->socket, soap->port, soap->host)); #ifndef WITH_LEAN if ((soap->accept_flags & SO_LINGER)) { struct linger linger; memset((void*)&linger, 0, sizeof(linger)); linger.l_onoff = 1; linger.l_linger = soap->linger_time; if (setsockopt(soap->socket, SOL_SOCKET, SO_LINGER, (char*)&linger, sizeof(struct linger))) { soap->errnum = soap_socket_errno(soap->socket); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_LINGER failed in soap_accept()", SOAP_TCP_ERROR); soap_closesock(soap); return SOAP_INVALID_SOCKET; } } if ((soap->accept_flags & ~SO_LINGER) && setsockopt(soap->socket, SOL_SOCKET, soap->accept_flags & ~SO_LINGER, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(soap->socket); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt failed in soap_accept()", SOAP_TCP_ERROR); soap_closesock(soap); return SOAP_INVALID_SOCKET; } #ifndef UNDER_CE if (((soap->imode | soap->omode) & SOAP_IO_KEEPALIVE) && setsockopt(soap->socket, SOL_SOCKET, SO_KEEPALIVE, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(soap->socket); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_KEEPALIVE failed in soap_accept()", SOAP_TCP_ERROR); soap_closesock(soap); return SOAP_INVALID_SOCKET; } if (setsockopt(soap->socket, SOL_SOCKET, SO_SNDBUF, (char*)&len, sizeof(int))) { soap->errnum = soap_socket_errno(soap->socket); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_SNDBUF failed in soap_accept()", SOAP_TCP_ERROR); soap_closesock(soap); return SOAP_INVALID_SOCKET; } if (setsockopt(soap->socket, SOL_SOCKET, SO_RCVBUF, (char*)&len, sizeof(int))) { soap->errnum = soap_socket_errno(soap->socket); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_RCVBUF failed in soap_accept()", SOAP_TCP_ERROR); soap_closesock(soap); return SOAP_INVALID_SOCKET; } #ifdef TCP_NODELAY if (setsockopt(soap->socket, IPPROTO_TCP, TCP_NODELAY, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(soap->socket); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt TCP_NODELAY failed in soap_accept()", SOAP_TCP_ERROR); soap_closesock(soap); return SOAP_INVALID_SOCKET; } #endif #endif #endif soap->keep_alive = (((soap->imode | soap->omode) & SOAP_IO_KEEPALIVE) != 0); if (soap->send_timeout || soap->recv_timeout) SOAP_SOCKNONBLOCK(soap->socket) else SOAP_SOCKBLOCK(soap->socket) return soap->socket; } err = soap_socket_errno(soap->socket); if (err != 0 && err != SOAP_EINTR && err != SOAP_EAGAIN && err != SOAP_EWOULDBLOCK) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Accept failed from %s\n", soap->host)); soap->errnum = err; soap_set_receiver_error(soap, tcp_error(soap), "accept failed in soap_accept()", SOAP_TCP_ERROR); soap_closesock(soap); return SOAP_INVALID_SOCKET; } } } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_closesock(struct soap *soap) { int status = soap->error; #ifndef WITH_LEANER if (status) /* close on error: attachment state is not to be trusted */ { soap->mime.first = NULL; soap->mime.last = NULL; soap->dime.first = NULL; soap->dime.last = NULL; } #endif if (soap->fdisconnect && (soap->error = soap->fdisconnect(soap))) return soap->error; if (status == SOAP_EOF || status == SOAP_TCP_ERROR || status == SOAP_SSL_ERROR || !soap->keep_alive) { if (soap->fclose && (soap->error = soap->fclose(soap))) return soap->error; soap->keep_alive = 0; } #ifdef WITH_ZLIB if (!(soap->mode & SOAP_MIME_POSTCHECK)) { if (soap->zlib_state == SOAP_ZLIB_DEFLATE) deflateEnd(soap->d_stream); else if (soap->zlib_state == SOAP_ZLIB_INFLATE) inflateEnd(soap->d_stream); soap->zlib_state = SOAP_ZLIB_NONE; } #endif return soap->error = status; } #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_force_closesock(struct soap *soap) { soap->keep_alive = 0; if (soap_valid_socket(soap->socket)) return soap_closesocket(soap->socket); return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_cleanup(struct soap *soap) { soap_done(soap); #ifdef WIN32 if (!tcp_done) return; tcp_done = 0; WSACleanup(); #endif } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_done(struct soap *soap) { #ifdef SOAP_DEBUG int i; #endif if (soap_check_state(soap)) return; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Done with context%s\n", soap->state == SOAP_COPY ? " copy" : "")); soap_free_temp(soap); while (soap->clist) { struct soap_clist *p = soap->clist->next; SOAP_FREE(soap, soap->clist); soap->clist = p; } if (soap->state == SOAP_INIT) soap->omode &= ~SOAP_IO_UDP; /* to force close the socket */ soap->keep_alive = 0; /* to force close the socket */ if (soap->master == soap->socket) /* do not close twice */ soap->master = SOAP_INVALID_SOCKET; soap_closesock(soap); #ifdef WITH_COOKIES soap_free_cookies(soap); #endif while (soap->plugins) { struct soap_plugin *p = soap->plugins->next; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Removing plugin '%s'\n", soap->plugins->id)); if (soap->plugins->fcopy || soap->state == SOAP_INIT) soap->plugins->fdelete(soap, soap->plugins); SOAP_FREE(soap, soap->plugins); soap->plugins = p; } soap->fplugin = fplugin; soap->fmalloc = NULL; #ifndef WITH_NOHTTP soap->fpost = http_post; soap->fget = http_get; soap->fput = http_405; soap->fdel = http_405; soap->fopt = http_200; soap->fhead = http_200; soap->fform = NULL; soap->fposthdr = http_post_header; soap->fresponse = http_response; soap->fparse = http_parse; soap->fparsehdr = http_parse_header; #endif soap->fheader = NULL; #ifndef WITH_NOIO #ifndef WITH_IPV6 soap->fresolve = tcp_gethost; #else soap->fresolve = NULL; #endif soap->faccept = tcp_accept; soap->fopen = tcp_connect; soap->fclose = tcp_disconnect; soap->fclosesocket = tcp_closesocket; soap->fshutdownsocket = tcp_shutdownsocket; soap->fsend = fsend; soap->frecv = frecv; soap->fpoll = soap_poll; #else soap->fopen = NULL; soap->fclose = NULL; soap->fpoll = NULL; #endif #ifndef WITH_LEANER soap->fsvalidate = NULL; soap->fwvalidate = NULL; soap->feltbegin = NULL; soap->feltendin = NULL; soap->feltbegout = NULL; soap->feltendout = NULL; soap->fprepareinitsend = NULL; soap->fprepareinitrecv = NULL; soap->fpreparesend = NULL; soap->fpreparerecv = NULL; soap->fpreparefinalsend = NULL; soap->fpreparefinalrecv = NULL; soap->ffiltersend = NULL; soap->ffilterrecv = NULL; #endif soap->fseterror = NULL; soap->fignore = NULL; soap->fserveloop = NULL; #ifdef WITH_OPENSSL if (soap->session) { SSL_SESSION_free(soap->session); soap->session = NULL; } #endif if (soap->state == SOAP_INIT) { if (soap_valid_socket(soap->master)) { soap->fclosesocket(soap, soap->master); soap->master = SOAP_INVALID_SOCKET; } } #ifdef WITH_OPENSSL if (soap->ssl) { SSL_free(soap->ssl); soap->ssl = NULL; } if (soap->state == SOAP_INIT) { if (soap->ctx) { SSL_CTX_free(soap->ctx); soap->ctx = NULL; } } ERR_remove_state(0); #endif #ifdef WITH_GNUTLS if (soap->state == SOAP_INIT) { if (soap->xcred) { gnutls_certificate_free_credentials(soap->xcred); soap->xcred = NULL; } if (soap->acred) { gnutls_anon_free_client_credentials(soap->acred); soap->acred = NULL; } if (soap->cache) { gnutls_priority_deinit(soap->cache); soap->cache = NULL; } if (soap->dh_params) { gnutls_dh_params_deinit(soap->dh_params); soap->dh_params = NULL; } if (soap->rsa_params) { gnutls_rsa_params_deinit(soap->rsa_params); soap->rsa_params = NULL; } } if (soap->session) { gnutls_deinit(soap->session); soap->session = NULL; } #endif #ifdef WITH_SYSTEMSSL if (soap->ssl) gsk_secure_socket_close(&soap->ssl); if (soap->state == SOAP_INIT) if (soap->ctx) gsk_environment_close(&soap->ctx); #endif #ifdef WITH_C_LOCALE if (soap->c_locale) { # ifdef WIN32 _free_locale(soap->c_locale); # else freelocale(soap->c_locale); # endif soap->c_locale = NULL; } #endif #ifdef WITH_ZLIB if (soap->d_stream) { SOAP_FREE(soap, soap->d_stream); soap->d_stream = NULL; } if (soap->z_buf) { SOAP_FREE(soap, soap->z_buf); soap->z_buf = NULL; } #endif #ifdef SOAP_DEBUG DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free logfiles\n")); for (i = 0; i < SOAP_MAXLOGS; i++) { if (soap->logfile[i]) { SOAP_FREE(soap, soap->logfile[i]); soap->logfile[i] = NULL; } soap_close_logfile(soap, i); } soap->state = SOAP_NONE; #endif #ifdef SOAP_MEM_DEBUG soap_free_mht(soap); #endif } #endif /******************************************************************************\ * * HTTP * \******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 static int http_parse(struct soap *soap) { char header[SOAP_HDRLEN], *s; unsigned short httpcmd = 0; int status = 0; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Waiting for HTTP request/response...\n")); *soap->endpoint = '\0'; #ifdef WITH_NTLM if (!soap->ntlm_challenge) #endif { soap->userid = NULL; soap->passwd = NULL; soap->authrealm = NULL; } #ifdef WITH_NTLM soap->ntlm_challenge = NULL; #endif soap->proxy_from = NULL; do { soap->length = 0; soap->http_content = NULL; soap->action = NULL; soap->status = 0; soap->body = 1; if (soap_getline(soap, soap->msgbuf, sizeof(soap->msgbuf))) { if (soap->error == SOAP_EOF) return SOAP_EOF; return soap->error = 414; } if ((s = strchr(soap->msgbuf, ' '))) { soap->status = (unsigned short)soap_strtoul(s, &s, 10); if (!soap_blank((soap_wchar)*s)) soap->status = 0; } else soap->status = 0; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "HTTP status: %s\n", soap->msgbuf)); for (;;) { if (soap_getline(soap, header, SOAP_HDRLEN)) { if (soap->error == SOAP_EOF) { soap->error = SOAP_OK; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "EOF in HTTP header, continue anyway\n")); break; } return soap->error; } if (!*header) break; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "HTTP header: %s\n", header)); s = strchr(header, ':'); if (s) { char *t; *s = '\0'; do s++; while (*s && *s <= 32); if (*s == '"') s++; t = s + strlen(s) - 1; while (t > s && *t <= 32) t--; if (t >= s && *t == '"') t--; t[1] = '\0'; if ((soap->error = soap->fparsehdr(soap, header, s))) { if (soap->error < SOAP_STOP) return soap->error; status = soap->error; soap->error = SOAP_OK; } } } } while (soap->status == 100); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Finished HTTP header parsing, status = %d\n", soap->status)); s = strstr(soap->msgbuf, "HTTP/"); if (s && s[7] != '1') { if (soap->keep_alive == 1) soap->keep_alive = 0; if (soap->status == 0 && (soap->omode & SOAP_IO) == SOAP_IO_CHUNK) /* soap->status == 0 for HTTP request */ soap->omode = (soap->omode & ~SOAP_IO) | SOAP_IO_STORE; /* HTTP 1.0 does not support chunked transfers */ } if (soap->keep_alive < 0) soap->keep_alive = 1; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Keep alive connection = %d\n", soap->keep_alive)); if (soap->status == 0) { size_t l = 0; if (s) { if (!strncmp(soap->msgbuf, "POST ", l = 5)) httpcmd = 1; else if (!strncmp(soap->msgbuf, "PUT ", l = 4)) httpcmd = 2; else if (!strncmp(soap->msgbuf, "GET ", l = 4)) httpcmd = 3; else if (!strncmp(soap->msgbuf, "DELETE ", l = 7)) httpcmd = 4; else if (!strncmp(soap->msgbuf, "OPTIONS ", l = 8)) httpcmd = 5; else if (!strncmp(soap->msgbuf, "HEAD ", l = 5)) httpcmd = 6; } if (s && httpcmd) { size_t m, n, k; while (soap_blank(soap->msgbuf[l])) l++; m = strlen(soap->endpoint); n = m + (s - soap->msgbuf) - l - 1; if (n >= sizeof(soap->endpoint)) n = sizeof(soap->endpoint) - 1; if (m > n) m = n; k = n - m + 1; if (k >= sizeof(soap->path)) k = sizeof(soap->path) - 1; while (k > 0 && soap_blank(soap->msgbuf[l + k - 1])) k--; soap_strncpy(soap->path, sizeof(soap->path), soap->msgbuf + l, k); if (*soap->path && *soap->path != '/') soap_strncpy(soap->endpoint, sizeof(soap->endpoint), soap->path, k); else soap_strncat(soap->endpoint, sizeof(soap->endpoint), soap->path, k); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Target endpoint='%s' path='%s'\n", soap->endpoint, soap->path)); if (httpcmd > 1) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "HTTP %s handler\n", soap->msgbuf)); switch (httpcmd) { case 2: soap->error = soap->fput(soap); break; case 3: soap->error = soap->fget(soap); break; case 4: soap->error = soap->fdel(soap); break; case 5: soap->error = soap->fopt(soap); break; case 6: soap->error = soap->fhead(soap); break; default: soap->error = 405; break; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "HTTP handler return = %d\n", soap->error)); if (soap->error == SOAP_OK) soap->error = SOAP_STOP; /* prevents further processing */ return soap->error; } if (status) return soap->error = status; } else if (status) return soap->error = status; else if (s) return soap->error = 405; return SOAP_OK; } #if 0 if (soap->length > 0 || (soap->http_content && (!soap->keep_alive || soap->recv_timeout)) || (soap->imode & SOAP_IO) == SOAP_IO_CHUNK) #endif if (soap->body) { if ((soap->status >= 200 && soap->status <= 299) /* OK, Accepted, etc */ || soap->status == 400 /* Bad Request */ || soap->status == 500) /* Internal Server Error */ return soap->error = SOAP_OK; /* force close afterwards in soap_closesock() */ soap->keep_alive = 0; #ifndef WITH_LEAN /* read HTTP body for error details */ s = soap_get_http_body(soap, NULL); if (s) return soap_set_receiver_error(soap, soap->msgbuf, s, soap->status); #endif } else if (soap->status >= 200 && soap->status <= 299) return soap->error = soap->status; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "HTTP error %d: %s\n", soap->status, soap->msgbuf)); return soap_set_receiver_error(soap, "HTTP Error", soap->msgbuf, soap->status); } #endif #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 static int http_parse_header(struct soap *soap, const char *key, const char *val) { if (!soap_tag_cmp(key, "Host")) { #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) if (soap->imode & SOAP_ENC_SSL) soap_strcpy(soap->endpoint, sizeof(soap->endpoint), "https://"); else #endif soap_strcpy(soap->endpoint, sizeof(soap->endpoint), "http://"); soap_strncat(soap->endpoint, sizeof(soap->endpoint), val, sizeof(soap->endpoint) - 9); } #ifndef WITH_LEANER else if (!soap_tag_cmp(key, "Content-Type")) { const char *action; soap->http_content = soap_strdup(soap, val); if (soap_get_header_attribute(soap, val, "application/dime")) soap->imode |= SOAP_ENC_DIME; else if (soap_get_header_attribute(soap, val, "multipart/related") || soap_get_header_attribute(soap, val, "multipart/form-data")) { soap->mime.boundary = soap_strdup(soap, soap_get_header_attribute(soap, val, "boundary")); soap->mime.start = soap_strdup(soap, soap_get_header_attribute(soap, val, "start")); soap->imode |= SOAP_ENC_MIME; } action = soap_get_header_attribute(soap, val, "action"); if (action) { if (*action == '"') { soap->action = soap_strdup(soap, action + 1); if (*soap->action) soap->action[strlen(soap->action) - 1] = '\0'; } else soap->action = soap_strdup(soap, action); } } #endif else if (!soap_tag_cmp(key, "Content-Length")) { soap->length = soap_strtoul(val, NULL, 10); if (!soap->length) soap->body = 0; } else if (!soap_tag_cmp(key, "Content-Encoding")) { if (!soap_tag_cmp(val, "deflate")) #ifdef WITH_ZLIB soap->zlib_in = SOAP_ZLIB_DEFLATE; #else return SOAP_ZLIB_ERROR; #endif else if (!soap_tag_cmp(val, "gzip")) #ifdef WITH_GZIP soap->zlib_in = SOAP_ZLIB_GZIP; #else return SOAP_ZLIB_ERROR; #endif } #ifdef WITH_ZLIB else if (!soap_tag_cmp(key, "Accept-Encoding")) { #ifdef WITH_GZIP if (strchr(val, '*') || soap_get_header_attribute(soap, val, "gzip")) soap->zlib_out = SOAP_ZLIB_GZIP; else #endif if (strchr(val, '*') || soap_get_header_attribute(soap, val, "deflate")) soap->zlib_out = SOAP_ZLIB_DEFLATE; else soap->zlib_out = SOAP_ZLIB_NONE; } #endif else if (!soap_tag_cmp(key, "Transfer-Encoding")) { soap->imode &= ~SOAP_IO; if (!soap_tag_cmp(val, "chunked")) soap->imode |= SOAP_IO_CHUNK; } else if (!soap_tag_cmp(key, "Connection")) { if (!soap_tag_cmp(val, "keep-alive")) soap->keep_alive = -soap->keep_alive; else if (!soap_tag_cmp(val, "close")) soap->keep_alive = 0; } #if !defined(WITH_LEAN) || defined(WITH_NTLM) else if (!soap_tag_cmp(key, "Authorization") || !soap_tag_cmp(key, "Proxy-Authorization")) { #ifdef WITH_NTLM if (!soap_tag_cmp(val, "NTLM*")) soap->ntlm_challenge = soap_strdup(soap, val + 4); else #endif if (!soap_tag_cmp(val, "Basic *")) { int n; char *s; soap_base642s(soap, val + 6, soap->tmpbuf, sizeof(soap->tmpbuf) - 1, &n); soap->tmpbuf[n] = '\0'; if ((s = strchr(soap->tmpbuf, ':'))) { *s = '\0'; soap->userid = soap_strdup(soap, soap->tmpbuf); soap->passwd = soap_strdup(soap, s + 1); } } } else if (!soap_tag_cmp(key, "WWW-Authenticate") || !soap_tag_cmp(key, "Proxy-Authenticate")) { #ifdef WITH_NTLM if (!soap_tag_cmp(val, "NTLM*")) soap->ntlm_challenge = soap_strdup(soap, val + 4); else #endif soap->authrealm = soap_strdup(soap, soap_get_header_attribute(soap, val + 6, "realm")); } else if (!soap_tag_cmp(key, "Expect")) { if (!soap_tag_cmp(val, "100-continue")) { if ((soap->error = soap->fposthdr(soap, "HTTP/1.1 100 Continue", NULL)) || (soap->error = soap->fposthdr(soap, NULL, NULL))) return soap->error; } } #endif else if (!soap_tag_cmp(key, "SOAPAction")) { if (*val == '"') { soap->action = soap_strdup(soap, val + 1); if (*soap->action) soap->action[strlen(soap->action) - 1] = '\0'; } else soap->action = soap_strdup(soap, val); } else if (!soap_tag_cmp(key, "Location")) { soap_strcpy(soap->endpoint, sizeof(soap->endpoint), val); } else if (!soap_tag_cmp(key, "X-Forwarded-For")) { soap->proxy_from = soap_strdup(soap, val); } #ifdef WITH_COOKIES else if (!soap_tag_cmp(key, "Cookie") || !soap_tag_cmp(key, "Cookie2") || !soap_tag_cmp(key, "Set-Cookie") || !soap_tag_cmp(key, "Set-Cookie2")) { soap_getcookies(soap, val); } #endif return SOAP_OK; } #endif #endif /******************************************************************************/ #if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) #ifndef PALM_1 SOAP_FMAC1 const char* SOAP_FMAC2 soap_get_header_attribute(struct soap *soap, const char *line, const char *key) { const char *s = line; if (s) { while (*s) { short flag; s = soap_decode_key(soap->tmpbuf, sizeof(soap->tmpbuf), s); flag = soap_tag_cmp(soap->tmpbuf, key); s = soap_decode_val(soap->tmpbuf, sizeof(soap->tmpbuf), s); if (!flag) return soap->tmpbuf; } } return NULL; } #endif #endif /******************************************************************************/ #if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) #ifndef PALM_1 SOAP_FMAC1 const char* SOAP_FMAC2 soap_decode_key(char *buf, size_t len, const char *val) { return soap_decode(buf, len, val, "=,;"); } #endif #endif /******************************************************************************/ #if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) #ifndef PALM_1 SOAP_FMAC1 const char* SOAP_FMAC2 soap_decode_val(char *buf, size_t len, const char *val) { if (*val != '=') { *buf = '\0'; return val; } return soap_decode(buf, len, val + 1, ",;"); } #endif #endif /******************************************************************************/ #if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) #ifndef PALM_1 static const char* soap_decode(char *buf, size_t len, const char *val, const char *sep) { const char *s; char *t = buf; size_t i = len; for (s = val; *s; s++) if (*s != ' ' && *s != '\t' && !strchr(sep, *s)) break; if (len > 0) { if (*s == '"') { s++; while (*s && *s != '"' && --i) *t++ = *s++; } else { while (*s && !soap_blank((soap_wchar)*s) && !strchr(sep, *s) && --i) { if (*s == '%' && s[1] && s[2]) { *t++ = ((s[1] >= 'A' ? (s[1] & 0x7) + 9 : s[1] - '0') << 4) + (s[2] >= 'A' ? (s[2] & 0x7) + 9 : s[2] - '0'); s += 3; } else *t++ = *s++; } } buf[len - 1] = '\0'; /* appease */ } *t = '\0'; while (*s && !strchr(sep, *s)) s++; return s; } #endif #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 static const char* http_error(struct soap *soap, int status) { const char *msg = SOAP_STR_EOS; (void)soap; (void)status; #ifndef WITH_LEAN msg = soap_code_str(h_http_error_codes, status); if (!msg) msg = SOAP_STR_EOS; #endif return msg; } #endif #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 static int http_get(struct soap *soap) { (void)soap; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "HTTP GET request\n")); return SOAP_GET_METHOD; } #endif #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 static int http_405(struct soap *soap) { (void)soap; return 405; } #endif #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 static int http_200(struct soap *soap) { return soap_send_empty_response(soap, 200); } #endif #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 static int http_post(struct soap *soap, const char *endpoint, const char *host, int port, const char *path, const char *action, size_t count) { const char *s; int err; size_t l; switch (soap->status) { case SOAP_GET: s = "GET"; break; case SOAP_PUT: s = "PUT"; break; case SOAP_DEL: s = "DELETE"; break; case SOAP_CONNECT: s = "CONNECT"; break; default: s = "POST"; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "HTTP %s to %s\n", s, endpoint ? endpoint : "(null)")); #ifdef PALM if (!endpoint || (soap_tag_cmp(endpoint, "http:*") && soap_tag_cmp(endpoint, "https:*") && strncmp(endpoint, "_beam:", 6) && strncmp(endpoint, "_local:", 7) && strncmp(endpoint, "_btobex:", 8)) #else if (!endpoint || (soap_tag_cmp(endpoint, "http:*") && soap_tag_cmp(endpoint, "https:*") && soap_tag_cmp(endpoint, "httpg:*"))) #endif return SOAP_OK; /* set l to prevent overruns ('host' and 'soap->host' are substrings of 'endpoint') */ l = strlen(endpoint) + strlen(soap->http_version) + 80; if (l > sizeof(soap->tmpbuf)) return soap->error = SOAP_EOM; if (soap->status == SOAP_CONNECT) (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), l), "%s %s:%d HTTP/%s", s, soap->host, soap->port, soap->http_version); else if (soap->proxy_host && endpoint) (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), l), "%s %s HTTP/%s", s, endpoint, soap->http_version); else (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), l), "%s /%s HTTP/%s", s, (*path == '/' ? path + 1 : path), soap->http_version); if ((err = soap->fposthdr(soap, soap->tmpbuf, NULL))) return err; #ifdef WITH_OPENSSL if ((soap->ssl && port != 443) || (!soap->ssl && port != 80)) #else if (port != 80) #endif { #ifdef WITH_IPV6 if (*host != '[' && strchr(host, ':')) (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), l), "[%s]:%d", host, port); /* RFC 2732 */ else #endif (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), l), "%s:%d", host, port); } else { #ifdef WITH_IPV6 if (*host != '[' && strchr(host, ':')) (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), l), "[%s]", host); /* RFC 2732 */ else #endif soap_strcpy(soap->tmpbuf, sizeof(soap->tmpbuf), host); } if ((err = soap->fposthdr(soap, "Host", soap->tmpbuf))) return err; if ((err = soap->fposthdr(soap, "User-Agent", "gSOAP/2.8"))) return err; if ((err = soap_puthttphdr(soap, SOAP_OK, count))) return err; #ifdef WITH_ZLIB #ifdef WITH_GZIP if ((err = soap->fposthdr(soap, "Accept-Encoding", "gzip, deflate"))) #else if ((err = soap->fposthdr(soap, "Accept-Encoding", "deflate"))) #endif return err; #endif #if !defined(WITH_LEAN) || defined(WITH_NTLM) #ifdef WITH_NTLM if (soap->ntlm_challenge) { l = strlen(soap->ntlm_challenge); if (l) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), l + 5), "NTLM %s", soap->ntlm_challenge); if (soap->proxy_host) { if ((err = soap->fposthdr(soap, "Proxy-Authorization", soap->tmpbuf))) return err; } else if ((err = soap->fposthdr(soap, "Authorization", soap->tmpbuf))) return err; } } else { #endif if (soap->userid && soap->passwd) { l = strlen(soap->userid) + strlen(soap->passwd); soap_strcpy(soap->tmpbuf, sizeof(soap->tmpbuf), "Basic "); (SOAP_SNPRINTF(soap->tmpbuf + 262, sizeof(soap->tmpbuf) - 262, l + 1), "%s:%s", soap->userid, soap->passwd); soap_s2base64(soap, (const unsigned char*)(soap->tmpbuf + 262), soap->tmpbuf + 6, (int)strlen(soap->tmpbuf + 262)); if ((err = soap->fposthdr(soap, "Authorization", soap->tmpbuf))) return err; } if (soap->proxy_userid && soap->proxy_passwd) { l = strlen(soap->proxy_userid) + strlen(soap->proxy_passwd); soap_strcpy(soap->tmpbuf, sizeof(soap->tmpbuf), "Basic "); (SOAP_SNPRINTF(soap->tmpbuf + 262, sizeof(soap->tmpbuf) - 262, l + 1), "%s:%s", soap->proxy_userid, soap->proxy_passwd); soap_s2base64(soap, (const unsigned char*)(soap->tmpbuf + 262), soap->tmpbuf + 6, (int)strlen(soap->tmpbuf + 262)); if ((err = soap->fposthdr(soap, "Proxy-Authorization", soap->tmpbuf))) return err; } #ifdef WITH_NTLM } #endif #endif #ifdef WITH_COOKIES #ifdef WITH_OPENSSL if (soap_putcookies(soap, host, path, soap->ssl != NULL)) return soap->error; #else if (soap_putcookies(soap, host, path, 0)) return soap->error; #endif #endif if (action && soap->status != SOAP_GET && soap->status != SOAP_DEL) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), strlen(action) + 2), "\"%s\"", action); if ((err = soap->fposthdr(soap, "SOAPAction", soap->tmpbuf))) return err; } return soap->fposthdr(soap, NULL, NULL); } #endif #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 static int http_send_header(struct soap *soap, const char *s) { const char *t; do { t = strchr(s, '\n'); /* disallow \n in HTTP headers */ if (!t) t = s + strlen(s); if (soap_send_raw(soap, s, t - s)) return soap->error; s = t + 1; } while (*t); return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 static int http_post_header(struct soap *soap, const char *key, const char *val) { if (key) { if (http_send_header(soap, key)) return soap->error; if (val && (soap_send_raw(soap, ": ", 2) || http_send_header(soap, val))) return soap->error; } return soap_send_raw(soap, "\r\n", 2); } #endif #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 static int http_response(struct soap *soap, int status, size_t count) { int err; char http[16]; int code = status; const char *line; #ifdef WMW_RPM_IO if (soap->rpmreqid) httpOutputEnable(soap->rpmreqid); #endif #ifdef WMW_RPM_IO if (soap->rpmreqid || soap_valid_socket(soap->master) || soap_valid_socket(soap->socket)) /* RPM behaves as if standalone */ #else if (soap_valid_socket(soap->master) || soap_valid_socket(soap->socket)) /* standalone application (socket) or CGI (stdin/out)? */ #endif (SOAP_SNPRINTF(http, sizeof(http), strlen(soap->http_version) + 5), "HTTP/%s", soap->http_version); else soap_strcpy(http, sizeof(http), "Status:"); if (!status || status == SOAP_HTML || status == SOAP_FILE) { if (count || ((soap->omode & SOAP_IO) == SOAP_IO_CHUNK)) code = 200; else code = 202; } else if (status < 200 || status >= 600) { const char *s = *soap_faultcode(soap); if (status >= SOAP_GET_METHOD && status <= SOAP_HTTP_METHOD) code = 405; else if (soap->version == 2 && (!s || !strcmp(s, "SOAP-ENV:Sender"))) code = 400; else code = 500; } line = http_error(soap, code); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "HTTP Status = %d %s\n", code, line)); (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), sizeof(http) + 22 + strlen(line)), "%s %d %s", http, code, line); if ((err = soap->fposthdr(soap, soap->tmpbuf, NULL))) return err; #ifndef WITH_LEAN if (status == 401) { (SOAP_SNPRINTF_SAFE(soap->tmpbuf, sizeof(soap->tmpbuf)), "Basic realm=\"%s\"", (soap->authrealm && strlen(soap->authrealm) + 14 < sizeof(soap->tmpbuf)) ? soap->authrealm : "gSOAP Web Service"); if ((err = soap->fposthdr(soap, "WWW-Authenticate", soap->tmpbuf))) return err; } else if ((status >= 301 && status <= 303) || status == 307) { if ((err = soap->fposthdr(soap, "Location", soap->endpoint))) return err; } #endif if ((err = soap->fposthdr(soap, "Server", "gSOAP/2.8")) || (err = soap_puthttphdr(soap, status, count))) return err; #ifdef WITH_COOKIES if (soap_putsetcookies(soap)) return soap->error; #endif return soap->fposthdr(soap, NULL, NULL); } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_response(struct soap *soap, int status) { size_t count; if (!(soap->omode & (SOAP_ENC_XML | SOAP_IO_STORE /* this tests for chunking too */)) && (status == SOAP_HTML || status == SOAP_FILE)) soap->omode = (soap->omode & ~SOAP_IO) | SOAP_IO_STORE; soap->status = status; count = soap_count_attachments(soap); if (soap_begin_send(soap)) return soap->error; #ifndef WITH_NOHTTP if ((soap->mode & SOAP_IO) != SOAP_IO_STORE && !(soap->mode & SOAP_ENC_XML)) { int n = soap->mode; soap->mode &= ~(SOAP_IO | SOAP_ENC_ZLIB); if ((n & SOAP_IO) != SOAP_IO_FLUSH) soap->mode |= SOAP_IO_BUFFER; if ((soap->error = soap->fresponse(soap, status, count))) return soap->error; #ifndef WITH_LEANER if ((n & SOAP_IO) == SOAP_IO_CHUNK) { if (soap_flush(soap)) return soap->error; } #endif soap->mode = n; } #endif return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 const char* SOAP_FMAC2 soap_url(struct soap *soap, const char *s, const char *t) { if (!t || (*t != '/' && *t != '?')) return s; (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), strlen(s) + strlen(t)), "%s%s", s, t); return soap->msgbuf; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 size_t SOAP_FMAC2 soap_encode_url(const char *s, char *t, size_t len) { int c; size_t n = len; while ((c = *s++) && --n > 0) { if (c > ' ' && c < 128 && !strchr("()<>@,;:\\\"/[]?={}#!$&'*+", c)) *t++ = c; else if (n > 2) { *t++ = '%'; *t++ = (c >> 4) + (c > 159 ? '7' : '0'); c &= 0xF; *t++ = c + (c > 9 ? '7' : '0'); n -= 2; } else break; } *t = '\0'; return len - n; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 const char* SOAP_FMAC2 soap_encode_url_string(struct soap *soap, const char *s) { if (s) { size_t n = 3*strlen(s)+1; char *t = (char*)soap_malloc(soap, n); if (t) { soap_encode_url(s, t, n); return t; } } return SOAP_STR_EOS; } #endif /******************************************************************************\ * * HTTP Cookies * \******************************************************************************/ #ifdef WITH_COOKIES SOAP_FMAC1 struct soap_cookie* SOAP_FMAC2 soap_cookie(struct soap *soap, const char *name, const char *domain, const char *path) { struct soap_cookie *p; if (!domain) domain = soap->cookie_domain; if (!path) path = soap->cookie_path; if (!path) path = SOAP_STR_EOS; else if (*path == '/') path++; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Search cookie='%s' domain='%s' path='%s'\n", name, domain ? domain : "(null)", path ? path : "(null)")); for (p = soap->cookies; p; p = p->next) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Cookie in database: %s='%s' domain='%s' path='%s' env=%hd\n", p->name, p->value ? p->value : "(null)", p->domain ? p->domain : "(null)", p->path ? p->path : "(null)", p->env)); if (!strcmp(p->name, name) && ((!p->domain && !domain) || (p->domain && !strcmp(p->domain, domain))) && ((!p->path && !path) || (p->path && !strncmp(p->path, path, strlen(p->path))))) break; } return p; } /******************************************************************************/ SOAP_FMAC1 struct soap_cookie* SOAP_FMAC2 soap_set_cookie(struct soap *soap, const char *name, const char *value, const char *domain, const char *path) { struct soap_cookie **p, *q; int n; if (!domain) domain = soap->cookie_domain; if (!path) path = soap->cookie_path; if (!path) path = SOAP_STR_EOS; else if (*path == '/') path++; q = soap_cookie(soap, name, domain, path); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Set %scookie: %s='%s' domain='%s' path='%s'\n", q ? SOAP_STR_EOS : "new ", name, value ? value : "(null)", domain ? domain : "(null)", path ? path : "(null)")); if (!q) { if ((q = (struct soap_cookie*)SOAP_MALLOC(soap, sizeof(struct soap_cookie)))) { size_t l = strlen(name); if ((q->name = (char*)SOAP_MALLOC(soap, l + 1))) soap_strcpy(q->name, l + 1, name); q->value = NULL; q->domain = NULL; q->path = NULL; q->expire = 0; q->maxage = -1; q->version = 1; q->secure = 0; q->modified = 0; for (p = &soap->cookies, n = soap->cookie_max; *p && n; p = &(*p)->next, n--) if (!strcmp((*p)->name, name) && (*p)->path && path && strcmp((*p)->path, path) < 0) break; if (n) { q->next = *p; *p = q; } else { SOAP_FREE(soap, q->name); SOAP_FREE(soap, q); q = NULL; } } } else q->modified = 1; if (q) { if (q->value) { if (!value || strcmp(value, q->value)) { SOAP_FREE(soap, q->value); q->value = NULL; } } if (value && *value && !q->value) { size_t l = strlen(value); q->value = (char*)SOAP_MALLOC(soap, l + 1); if (q->value) soap_strcpy(q->value, l + 1, value); } if (q->domain) { if (!domain || strcmp(domain, q->domain)) { SOAP_FREE(soap, q->domain); q->domain = NULL; } } if (domain && !q->domain) { size_t l = strlen(domain); q->domain = (char*)SOAP_MALLOC(soap, l + 1); if (q->domain) soap_strcpy(q->domain, l + 1, domain); } if (q->path) { if (!path || strncmp(path, q->path, strlen(q->path))) { SOAP_FREE(soap, q->path); q->path = NULL; } } if (path && !q->path) { size_t l = strlen(path); q->path = (char*)SOAP_MALLOC(soap, l + 1); if (q->path) soap_strcpy(q->path, l + 1, path); } q->session = 1; q->env = 0; } return q; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_clr_cookie(struct soap *soap, const char *name, const char *domain, const char *path) { struct soap_cookie **p, *q; if (!domain) domain = soap->cookie_domain; if (!domain) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Error in clear cookie='%s': cookie domain not set\n", name ? name : "(null)")); return; } if (!path) path = soap->cookie_path; if (!path) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Error in clear cookie='%s': cookie path not set\n", name ? name : "(null)")); return; } if (*path == '/') path++; for (p = &soap->cookies, q = *p; q; q = *p) { if (!strcmp(q->name, name) && (!q->domain || !strcmp(q->domain, domain)) && (!q->path || !strncmp(q->path, path, strlen(q->path)))) { if (q->value) SOAP_FREE(soap, q->value); if (q->domain) SOAP_FREE(soap, q->domain); if (q->path) SOAP_FREE(soap, q->path); *p = q->next; SOAP_FREE(soap, q); } else p = &q->next; } } /******************************************************************************/ SOAP_FMAC1 char * SOAP_FMAC2 soap_cookie_value(struct soap *soap, const char *name, const char *domain, const char *path) { struct soap_cookie *p; if ((p = soap_cookie(soap, name, domain, path))) return p->value; return NULL; } /******************************************************************************/ SOAP_FMAC1 char * SOAP_FMAC2 soap_env_cookie_value(struct soap *soap, const char *name, const char *domain, const char *path) { struct soap_cookie *p; if ((p = soap_cookie(soap, name, domain, path)) && p->env) return p->value; return NULL; } /******************************************************************************/ SOAP_FMAC1 time_t SOAP_FMAC2 soap_cookie_expire(struct soap *soap, const char *name, const char *domain, const char *path) { struct soap_cookie *p; if ((p = soap_cookie(soap, name, domain, path))) return p->expire; return -1; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_set_cookie_expire(struct soap *soap, const char *name, long expire, const char *domain, const char *path) { struct soap_cookie *p; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Set cookie expiration max-age=%ld: cookie='%s' domain='%s' path='%s'\n", expire, name, domain ? domain : "(null)", path ? path : "(null)")); if ((p = soap_cookie(soap, name, domain, path))) { p->maxage = expire; p->modified = 1; return SOAP_OK; } return SOAP_ERR; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_set_cookie_session(struct soap *soap, const char *name, const char *domain, const char *path) { struct soap_cookie *p; if ((p = soap_cookie(soap, name, domain, path))) { p->session = 1; p->modified = 1; return SOAP_OK; } return SOAP_ERR; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_clr_cookie_session(struct soap *soap, const char *name, const char *domain, const char *path) { struct soap_cookie *p; if ((p = soap_cookie(soap, name, domain, path))) { p->session = 0; p->modified = 1; return SOAP_OK; } return SOAP_ERR; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_putsetcookies(struct soap *soap) { struct soap_cookie *p; char *s, tmp[4096]; const char *t; for (p = soap->cookies; p; p = p->next) { if (p->modified #ifdef WITH_OPENSSL || (!p->env && !soap->ssl == !p->secure) #endif ) { s = tmp; if (p->name) s += soap_encode_url(p->name, s, 4064 - (s-tmp)); if (p->value && *p->value) { *s++ = '='; s += soap_encode_url(p->value, s, 4064 - (s-tmp)); } if (p->domain && (int)strlen(p->domain) < 4064 - (s-tmp)) { soap_strcpy(s, 4096 - (s-tmp), ";Domain="); soap_strcpy(s + 8, 4088 - (s-tmp), p->domain); } else if (soap->cookie_domain && (int)strlen(soap->cookie_domain) < 4064 - (s-tmp)) { soap_strcpy(s, 4096 - (s-tmp), ";Domain="); soap_strcpy(s + 8, 4088 - (s-tmp), soap->cookie_domain); } s += strlen(s); soap_strcpy(s, 4096 - (s-tmp), ";Path=/"); if (p->path) t = p->path; else t = soap->cookie_path; if (t) { if (*t == '/') t++; if ((int)strlen(t) < 4064 - (s-tmp)) { if (strchr(t, '%')) /* already URL encoded? */ { soap_strcpy(s, 4096 - (s-tmp), t); s += strlen(s); } else s += soap_encode_url(t, s, 4064 - (s-tmp)); } } if (p->version > 0 && s-tmp < 4064) { (SOAP_SNPRINTF(s, 4096 - (s-tmp), 29), ";Version=%u", p->version); s += strlen(s); } if (p->maxage >= 0 && s-tmp < 4064) { (SOAP_SNPRINTF(s, 4096 - (s-tmp), 29), ";Max-Age=%ld", p->maxage); s += strlen(s); } if (s-tmp < 4073 && (p->secure #ifdef WITH_OPENSSL || soap->ssl #endif )) soap_strcpy(s, 4096 - (s-tmp), ";Secure"); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Set-Cookie: %s\n", tmp)); if ((soap->error = soap->fposthdr(soap, "Set-Cookie", tmp))) return soap->error; } } return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_putcookies(struct soap *soap, const char *domain, const char *path, int secure) { struct soap_cookie **p, *q; unsigned int version = 0; time_t now = time(NULL); char *s, tmp[4096]; if (!domain || !path) return SOAP_OK; s = tmp; p = &soap->cookies; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Sending cookies for domain='%s' path='%s'\n", domain, path)); if (*path == '/') path++; while ((q = *p)) { if (q->expire && now > q->expire) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Cookie %s expired\n", q->name)); SOAP_FREE(soap, q->name); if (q->value) SOAP_FREE(soap, q->value); if (q->domain) SOAP_FREE(soap, q->domain); if (q->path) SOAP_FREE(soap, q->path); *p = q->next; SOAP_FREE(soap, q); } else { int flag; char *t = q->domain; size_t n = 0; if (!t) flag = 1; else { const char *r = strchr(t, ':'); if (r) n = r - t; else n = strlen(t); flag = !strncmp(t, domain, n); } /* domain-level cookies, cannot compile when WITH_NOIO set */ #ifndef WITH_NOIO if (!flag) { struct hostent *hostent = gethostbyname((char*)domain); if (hostent) { const char *r = hostent->h_name; if (*t == '.') { size_t k = strlen(hostent->h_name); if (k >= n) r = hostent->h_name + k - n; } flag = !strncmp(t, r, n); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Domain cookie %s host %s (match=%d)\n", t, r, flag)); } } #endif if (flag && (!q->path || !strncmp(q->path, path, strlen(q->path))) && (!q->secure || secure)) { size_t n = 12; if (q->name) n += 3*strlen(q->name); if (q->value && *q->value) n += 3*strlen(q->value) + 1; if (q->path && *q->path) n += strlen(q->path) + 9; if (q->domain) n += strlen(q->domain) + 11; if (tmp - s + n > sizeof(tmp)) { if (s == tmp) return SOAP_OK; /* HTTP header size overflow */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Cookie: %s\n", tmp)); if ((soap->error = soap->fposthdr(soap, "Cookie", tmp))) return soap->error; s = tmp; } else if (s != tmp) { *s++ = ' '; } if (q->version != version && s-tmp < 4060) { (SOAP_SNPRINTF(s, 4096 - (s-tmp), 29), "$Version=%u;", q->version); version = q->version; s += strlen(s); } if (q->name) s += soap_encode_url(q->name, s, tmp+sizeof(tmp)-s-16); if (q->value && *q->value) { *s++ = '='; s += soap_encode_url(q->value, s, tmp+sizeof(tmp)-s-16); } if (q->path && (s-tmp) + strlen(q->path) < 4060) { (SOAP_SNPRINTF_SAFE(s, 4096 - (s-tmp)), ";$Path=\"/%s\"", (*q->path == '/' ? q->path + 1 : q->path)); s += strlen(s); } if (q->domain && (s-tmp) + strlen(q->domain) < 4060) { (SOAP_SNPRINTF_SAFE(s, 4096 - (s-tmp)), ";$Domain=\"%s\"", q->domain); s += strlen(s); } } p = &q->next; } } if (s != tmp) if ((soap->error = soap->fposthdr(soap, "Cookie", tmp))) return soap->error; return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_getcookies(struct soap *soap, const char *val) { struct soap_cookie *p = NULL, *q; const char *s; char *t, tmp[4096]; /* cookie size is up to 4096 bytes [RFC2109] */ char *domain = NULL; char *path = NULL; unsigned int version = 0; time_t now = time(NULL); if (!val) return; s = val; while (*s) { s = soap_decode_key(tmp, sizeof(tmp), s); if (!soap_tag_cmp(tmp, "$Version")) { if ((s = soap_decode_val(tmp, sizeof(tmp), s))) { if (p) p->version = (int)soap_strtol(tmp, NULL, 10); else version = (int)soap_strtol(tmp, NULL, 10); } } else if (!soap_tag_cmp(tmp, "$Path")) { s = soap_decode_val(tmp, sizeof(tmp), s); if (*tmp) { size_t l = strlen(tmp) + 1; if ((t = (char*)SOAP_MALLOC(soap, l))) soap_memcpy((void*)t, l, (const void*)tmp, l); } else t = NULL; if (p) { if (p->path) SOAP_FREE(soap, p->path); p->path = t; } else { if (path) SOAP_FREE(soap, path); path = t; } } else if (!soap_tag_cmp(tmp, "$Domain")) { s = soap_decode_val(tmp, sizeof(tmp), s); if (*tmp) { size_t l = strlen(tmp) + 1; if ((t = (char*)SOAP_MALLOC(soap, l))) soap_memcpy((void*)t, l, (const void*)tmp, l); } else t = NULL; if (p) { if (p->domain) SOAP_FREE(soap, p->domain); p->domain = t; } else { if (domain) SOAP_FREE(soap, domain); domain = t; } } else if (p && !soap_tag_cmp(tmp, "Path")) { if (p->path) SOAP_FREE(soap, p->path); s = soap_decode_val(tmp, sizeof(tmp), s); if (*tmp) { size_t l = strlen(tmp) + 1; if ((p->path = (char*)SOAP_MALLOC(soap, l))) soap_memcpy((void*)p->path, l, (const void*)tmp, l); } else p->path = NULL; } else if (p && !soap_tag_cmp(tmp, "Domain")) { if (p->domain) SOAP_FREE(soap, p->domain); s = soap_decode_val(tmp, sizeof(tmp), s); if (*tmp) { size_t l = strlen(tmp) + 1; if ((p->domain = (char*)SOAP_MALLOC(soap, l))) soap_memcpy((void*)p->domain, l, (const void*)tmp, l); } else p->domain = NULL; } else if (p && !soap_tag_cmp(tmp, "Version")) { s = soap_decode_val(tmp, sizeof(tmp), s); p->version = (unsigned int)soap_strtoul(tmp, NULL, 10); } else if (p && !soap_tag_cmp(tmp, "Max-Age")) { s = soap_decode_val(tmp, sizeof(tmp), s); p->expire = now + soap_strtol(tmp, NULL, 10); } else if (p && !soap_tag_cmp(tmp, "Expires")) { struct tm T; char a[3]; static const char mns[] = "anebarprayunulugepctovec"; s = soap_decode_val(tmp, sizeof(tmp), s); if (strlen(tmp) > 20) { memset((void*)&T, 0, sizeof(T)); a[0] = tmp[4]; a[1] = tmp[5]; a[2] = '\0'; T.tm_mday = (int)soap_strtol(a, NULL, 10); a[0] = tmp[8]; a[1] = tmp[9]; T.tm_mon = (int)(strstr(mns, a) - mns) / 2; a[0] = tmp[11]; a[1] = tmp[12]; T.tm_year = 100 + (int)soap_strtol(a, NULL, 10); a[0] = tmp[13]; a[1] = tmp[14]; T.tm_hour = (int)soap_strtol(a, NULL, 10); a[0] = tmp[16]; a[1] = tmp[17]; T.tm_min = (int)soap_strtol(a, NULL, 10); a[0] = tmp[19]; a[1] = tmp[20]; T.tm_sec = (int)soap_strtol(a, NULL, 10); p->expire = soap_timegm(&T); } } else if (p && !soap_tag_cmp(tmp, "Secure")) p->secure = 1; else { if (p) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Got environment cookie='%s' value='%s' domain='%s' path='%s' expire=%ld secure=%d\n", p->name, p->value ? p->value : "(null)", p->domain ? p->domain : "(null)", p->path ? p->path : "(null)", p->expire, p->secure)); if ((q = soap_set_cookie(soap, p->name, p->value, p->domain, p->path))) { q->version = p->version; q->expire = p->expire; q->secure = p->secure; q->env = 1; } if (p->name) SOAP_FREE(soap, p->name); if (p->value) SOAP_FREE(soap, p->value); if (p->domain) SOAP_FREE(soap, p->domain); if (p->path) SOAP_FREE(soap, p->path); SOAP_FREE(soap, p); } if ((p = (struct soap_cookie*)SOAP_MALLOC(soap, sizeof(struct soap_cookie)))) { size_t l = strlen(tmp) + 1; if ((p->name = (char*)SOAP_MALLOC(soap, l))) soap_memcpy((void*)p->name, l, (const void*)tmp, l); s = soap_decode_val(tmp, sizeof(tmp), s); if (*tmp) { l = strlen(tmp) + 1; if ((p->value = (char*)SOAP_MALLOC(soap, l))) soap_memcpy((void*)p->value, l, (const void*)tmp, l); } else p->value = NULL; if (domain) p->domain = domain; else if (*soap->host) { l = strlen(soap->host) + 1; if ((p->domain = (char*)SOAP_MALLOC(soap, l))) soap_memcpy((void*)p->domain, l, (const void*)soap->host, l); } else p->domain = NULL; if (path) p->path = path; else if (*soap->path) { l = strlen(soap->path) + 1; if ((p->path = (char*)SOAP_MALLOC(soap, l))) soap_memcpy((void*)p->path, l, (const void*)soap->path, l); } else { if ((p->path = (char*)SOAP_MALLOC(soap, 2))) soap_memcpy((void*)p->path, 2, (const void*)"/", 2); } p->expire = 0; p->secure = 0; p->version = version; } } } if (p) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Got environment cookie='%s' value='%s' domain='%s' path='%s' expire=%ld secure=%d\n", p->name, p->value ? p->value : "(null)", p->domain ? p->domain : "(null)", p->path ? p->path : "(null)", p->expire, p->secure)); if ((q = soap_set_cookie(soap, p->name, p->value, p->domain, p->path))) { q->version = p->version; q->expire = p->expire; q->secure = p->secure; q->env = 1; } if (p->name) SOAP_FREE(soap, p->name); if (p->value) SOAP_FREE(soap, p->value); if (p->domain) SOAP_FREE(soap, p->domain); if (p->path) SOAP_FREE(soap, p->path); SOAP_FREE(soap, p); } if (domain) SOAP_FREE(soap, domain); if (path) SOAP_FREE(soap, path); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_getenv_cookies(struct soap *soap) { struct soap_cookie *p; const char *s; char key[4096], val[4096]; /* cookie size is up to 4096 bytes [RFC2109] */ if (!(s = getenv("HTTP_COOKIE"))) return SOAP_ERR; do { s = soap_decode_key(key, sizeof(key), s); s = soap_decode_val(val, sizeof(val), s); p = soap_set_cookie(soap, key, val, NULL, NULL); if (p) p->env = 1; } while (*s); return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 struct soap_cookie* SOAP_FMAC2 soap_copy_cookies(struct soap *copy, const struct soap *soap) { struct soap_cookie *p, **q, *r; q = &r; for (p = soap->cookies; p; p = p->next) { if (!(*q = (struct soap_cookie*)SOAP_MALLOC(copy, sizeof(struct soap_cookie)))) return r; **q = *p; if (p->name) { size_t l = strlen(p->name) + 1; if (((*q)->name = (char*)SOAP_MALLOC(copy, l))) soap_memcpy((*q)->name, l, p->name, l); } if (p->value) { size_t l = strlen(p->value) + 1; if (((*q)->value = (char*)SOAP_MALLOC(copy, l))) soap_memcpy((*q)->value, l, p->value, l); } if (p->domain) { size_t l = strlen(p->domain) + 1; if (((*q)->domain = (char*)SOAP_MALLOC(copy, l))) soap_memcpy((*q)->domain, l, p->domain, l); } if (p->path) { size_t l = strlen(p->path) + 1; if (((*q)->path = (char*)SOAP_MALLOC(copy, l))) soap_memcpy((*q)->path, l, p->path, l); } q = &(*q)->next; } *q = NULL; return r; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_free_cookies(struct soap *soap) { struct soap_cookie *p; for (p = soap->cookies; p; p = soap->cookies) { soap->cookies = p->next; SOAP_FREE(soap, p->name); if (p->value) SOAP_FREE(soap, p->value); if (p->domain) SOAP_FREE(soap, p->domain); if (p->path) SOAP_FREE(soap, p->path); SOAP_FREE(soap, p); } } /******************************************************************************/ #endif /* WITH_COOKIES */ /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 size_t SOAP_FMAC2 soap_hash(const char *s) { size_t h = 0; while (*s) h = 65599*h + *s++; return h % SOAP_IDHASH; } #endif /******************************************************************************/ #ifndef PALM_1 static void soap_init_pht(struct soap *soap) { int i; soap->pblk = NULL; soap->pidx = 0; for (i = 0; i < (int)SOAP_PTRHASH; i++) soap->pht[i] = NULL; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 struct soap* SOAP_FMAC2 soap_versioning(soap_new)(soap_mode imode, soap_mode omode) { struct soap *soap; #ifdef __cplusplus soap = SOAP_NEW(struct soap); #else soap = (struct soap*)malloc(sizeof(struct soap)); #endif if (soap) soap_versioning(soap_init)(soap, imode, omode); return soap; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_free(struct soap *soap) { soap_done(soap); #ifdef __cplusplus SOAP_DELETE(soap); #else free(soap); #endif } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_del(struct soap *soap) { free(soap); } #endif /******************************************************************************/ #ifndef PALM_1 static void soap_free_pht(struct soap *soap) { struct soap_pblk *pb, *next; int i; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free pointer hashtable\n")); for (pb = soap->pblk; pb; pb = next) { next = pb->next; SOAP_FREE(soap, pb); } soap->pblk = NULL; soap->pidx = 0; for (i = 0; i < (int)SOAP_PTRHASH; i++) soap->pht[i] = NULL; } #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_embed(struct soap *soap, const void *p, const void *a, int n, int t) { int id; struct soap_plist *pp; if (soap->version == 2) soap->encoding = 1; if (!p || (!soap->encodingStyle && !(soap->omode & SOAP_XML_GRAPH)) || (soap->omode & SOAP_XML_TREE)) return 0; if (a) id = soap_array_pointer_lookup(soap, p, a, n, t, &pp); else id = soap_pointer_lookup(soap, p, t, &pp); if (id) { if (soap_is_embedded(soap, pp) || soap_is_single(soap, pp)) return 0; soap_set_embedded(soap, pp); } return id; } #endif #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_pointer_lookup(struct soap *soap, const void *p, int type, struct soap_plist **ppp) { struct soap_plist *pp; *ppp = NULL; if (p) { for (pp = soap->pht[soap_hash_ptr(p)]; pp; pp = pp->next) { if (pp->ptr == p && pp->type == type) { *ppp = pp; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Lookup location=%p type=%d id=%d\n", p, type, pp->id)); return pp->id; } } } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Lookup location=%p type=%d: not found\n", p, type)); return 0; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_pointer_enter(struct soap *soap, const void *p, const void *a, int n, int type, struct soap_plist **ppp) { size_t h; struct soap_plist *pp; (void)n; if (!soap->pblk || soap->pidx >= SOAP_PTRBLK) { struct soap_pblk *pb = (struct soap_pblk*)SOAP_MALLOC(soap, sizeof(struct soap_pblk)); if (!pb) { soap->error = SOAP_EOM; return 0; } pb->next = soap->pblk; soap->pblk = pb; soap->pidx = 0; } *ppp = pp = &soap->pblk->plist[soap->pidx++]; if (a) h = soap_hash_ptr(a); else h = soap_hash_ptr(p); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Pointer enter location=%p array=%p size=%lu type=%d id=%d\n", p, a, (unsigned long)n, type, soap->idnum+1)); pp->next = soap->pht[h]; pp->type = type; pp->mark1 = 0; pp->mark2 = 0; pp->ptr = p; pp->dup = NULL; pp->array = a; pp->size = n; soap->pht[h] = pp; pp->id = ++soap->idnum; return pp->id; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_array_pointer_lookup(struct soap *soap, const void *p, const void *a, int n, int type, struct soap_plist **ppp) { struct soap_plist *pp; *ppp = NULL; if (!p || !a) return 0; for (pp = soap->pht[soap_hash_ptr(a)]; pp; pp = pp->next) { if (pp->type == type && pp->array == a && pp->size == n) { *ppp = pp; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Array lookup location=%p type=%d id=%d\n", a, type, pp->id)); return pp->id; } } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Array lookup location=%p type=%d: not found\n", a, type)); return 0; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_begin_count(struct soap *soap) { soap_free_ns(soap); #ifndef WITH_LEANER if ((soap->mode & SOAP_ENC_DIME) || (soap->omode & SOAP_ENC_DIME)) soap->mode = soap->omode | SOAP_IO_LENGTH | SOAP_ENC_DIME; else #endif { soap->mode = soap->omode; if ((soap->mode & SOAP_IO_UDP)) { soap->mode |= SOAP_ENC_XML; soap->mode &= ~SOAP_IO_CHUNK; } if ((soap->mode & SOAP_IO) == SOAP_IO_STORE || (((soap->mode & SOAP_IO) == SOAP_IO_CHUNK || (soap->mode & SOAP_ENC_XML)) #ifndef WITH_LEANER && !soap->fpreparesend #endif )) soap->mode &= ~SOAP_IO_LENGTH; else soap->mode |= SOAP_IO_LENGTH; } #ifdef WITH_ZLIB if ((soap->mode & SOAP_ENC_ZLIB) && (soap->mode & SOAP_IO) == SOAP_IO_FLUSH) { if (!(soap->mode & SOAP_ENC_DIME)) soap->mode &= ~SOAP_IO_LENGTH; if (soap->mode & SOAP_ENC_XML) soap->mode |= SOAP_IO_BUFFER; else soap->mode |= SOAP_IO_STORE; } #endif #ifndef WITH_LEANER if ((soap->mode & SOAP_ENC_MTOM) && (soap->mode & SOAP_ENC_DIME)) soap->mode |= SOAP_ENC_MIME; else if (!(soap->mode & SOAP_ENC_MIME)) soap->mode &= ~SOAP_ENC_MTOM; if (soap->mode & SOAP_ENC_MIME) soap_select_mime_boundary(soap); soap->dime.list = soap->dime.last; /* keep track of last DIME attachment */ #endif soap->count = 0; soap->ns = 0; soap->null = 0; soap->position = 0; soap->mustUnderstand = 0; soap->encoding = 0; soap->part = SOAP_BEGIN; soap->event = 0; soap->evlev = 0; soap->idnum = 0; soap->body = 1; soap->level = 0; soap_clr_attr(soap); soap_set_local_namespaces(soap); #ifndef WITH_LEANER soap->dime.count = 0; /* count # of attachments */ soap->dime.size = 0; /* accumulate total size of attachments */ if (soap->fprepareinitsend && (soap->mode & SOAP_IO) != SOAP_IO_STORE && (soap->error = soap->fprepareinitsend(soap))) return soap->error; #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Begin count phase (socket=%d mode=0x%x count=%lu)\n", soap->socket, (unsigned int)soap->mode, (unsigned long)soap->count)); return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_end_count(struct soap *soap) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of count phase\n")); #ifndef WITH_LEANER if ((soap->mode & SOAP_IO_LENGTH)) { if (soap->fpreparefinalsend && (soap->error = soap->fpreparefinalsend(soap))) return soap->error; } #else (void)soap; #endif return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_begin_send(struct soap *soap) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Initializing for output to socket=%d/fd=%d\n", soap->socket, soap->sendfd)); soap_free_ns(soap); soap->error = SOAP_OK; soap->mode = soap->omode | (soap->mode & (SOAP_IO_LENGTH | SOAP_ENC_DIME)); #ifndef WITH_LEAN if ((soap->mode & SOAP_IO_UDP)) { soap->mode |= SOAP_ENC_XML; soap->mode &= ~SOAP_IO_CHUNK; if (soap->count > sizeof(soap->buf)) return soap->error = SOAP_UDP_ERROR; } #endif #ifdef WITH_ZLIB if ((soap->mode & SOAP_ENC_ZLIB) && (soap->mode & SOAP_IO) == SOAP_IO_FLUSH) { if (soap->mode & SOAP_ENC_XML) soap->mode |= SOAP_IO_BUFFER; else soap->mode |= SOAP_IO_STORE; } #endif if ((soap->mode & SOAP_IO) == SOAP_IO_FLUSH) { if (soap_valid_socket(soap->socket)) { if (soap->count || (soap->mode & SOAP_IO_LENGTH) || (soap->mode & SOAP_ENC_XML)) soap->mode |= SOAP_IO_BUFFER; else soap->mode |= SOAP_IO_STORE; } #if !defined(__cplusplus) || defined(WITH_COMPAT) else if (soap->os != NULL) { *soap->os = NULL; soap->mode |= SOAP_IO_STORE; } #endif } soap->mode &= ~SOAP_IO_LENGTH; if ((soap->mode & SOAP_IO) == SOAP_IO_STORE) if (soap_new_block(soap) == NULL) return soap->error; if (!(soap->mode & SOAP_IO_KEEPALIVE)) soap->keep_alive = 0; #ifndef WITH_LEANER if ((soap->mode & SOAP_ENC_MTOM) && (soap->mode & SOAP_ENC_DIME)) { soap->mode |= SOAP_ENC_MIME; soap->mode &= ~SOAP_ENC_DIME; } else if (!(soap->mode & SOAP_ENC_MIME)) soap->mode &= ~SOAP_ENC_MTOM; if (soap->mode & SOAP_ENC_MIME) soap_select_mime_boundary(soap); #ifdef WIN32 #ifndef UNDER_CE #ifndef WITH_FASTCGI if (!soap_valid_socket(soap->socket) && !soap->os && soap->sendfd >= 0) /* Set win32 stdout or soap->sendfd to BINARY, e.g. to support DIME */ #ifdef __BORLANDC__ setmode(soap->sendfd, _O_BINARY); #else _setmode(soap->sendfd, _O_BINARY); #endif #endif #endif #endif #endif if (soap->mode & SOAP_IO) { soap->bufidx = 0; soap->buflen = 0; } soap->chunksize = 0; soap->ns = 0; soap->null = 0; soap->position = 0; soap->mustUnderstand = 0; soap->encoding = 0; soap->idnum = 0; soap->body = 1; soap->level = 0; soap_clr_attr(soap); soap_set_local_namespaces(soap); #ifdef WITH_ZLIB soap->z_ratio_out = 1.0; if ((soap->mode & SOAP_ENC_ZLIB) && soap->zlib_state != SOAP_ZLIB_DEFLATE) { if (!soap->d_stream) { soap->d_stream = (z_stream*)SOAP_MALLOC(soap, sizeof(z_stream)); soap->d_stream->zalloc = Z_NULL; soap->d_stream->zfree = Z_NULL; soap->d_stream->opaque = Z_NULL; soap->d_stream->next_in = Z_NULL; } if (!soap->z_buf) soap->z_buf = (char*)SOAP_MALLOC(soap, sizeof(soap->buf)); soap->d_stream->next_out = (Byte*)soap->z_buf; soap->d_stream->avail_out = sizeof(soap->buf); #ifdef WITH_GZIP if (soap->zlib_out != SOAP_ZLIB_DEFLATE) { if (soap_memcpy((void*)soap->z_buf, sizeof(soap->buf), (const void*)"\37\213\10\0\0\0\0\0\0\377", 10)) return soap->error = SOAP_EOM; soap->d_stream->next_out = (Byte*)soap->z_buf + 10; soap->d_stream->avail_out = sizeof(soap->buf) - 10; soap->z_crc = crc32(0L, NULL, 0); soap->zlib_out = SOAP_ZLIB_GZIP; if (soap->z_dict) *((Byte*)soap->z_buf + 2) = 0xff; if (deflateInit2(soap->d_stream, soap->z_level, Z_DEFLATED, -MAX_WBITS, 8, Z_DEFAULT_STRATEGY) != Z_OK) return soap->error = SOAP_ZLIB_ERROR; } else #endif if (deflateInit(soap->d_stream, soap->z_level) != Z_OK) return soap->error = SOAP_ZLIB_ERROR; if (soap->z_dict) { if (deflateSetDictionary(soap->d_stream, (const Bytef*)soap->z_dict, soap->z_dict_len) != Z_OK) return soap->error = SOAP_ZLIB_ERROR; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Deflate initialized\n")); soap->zlib_state = SOAP_ZLIB_DEFLATE; } #endif #ifdef WITH_OPENSSL if (soap->ssl) ERR_clear_error(); #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Begin send phase (socket=%d mode=0x%x count=%lu)\n", soap->socket, soap->mode, (unsigned long)soap->count)); soap->part = SOAP_BEGIN; #ifndef WITH_LEANER if (soap->fprepareinitsend && (soap->mode & SOAP_IO) == SOAP_IO_STORE && (soap->error = soap->fprepareinitsend(soap))) return soap->error; #endif return SOAP_OK; } #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_embedded(struct soap *soap, const void *p, int t) { struct soap_plist *pp; if (soap_pointer_lookup(soap, p, t, &pp)) { pp->mark1 = 1; pp->mark2 = 1; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Embedded %p type=%d mark set to 1\n", p, t)); } } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_reference(struct soap *soap, const void *p, int t) { struct soap_plist *pp; if (!p || (!soap->encodingStyle && !(soap->omode & (SOAP_ENC_DIME|SOAP_ENC_MIME|SOAP_ENC_MTOM|SOAP_XML_GRAPH))) || (soap->omode & SOAP_XML_TREE)) return 1; if (soap_pointer_lookup(soap, p, t, &pp)) { if (pp->mark1 == 0) { pp->mark1 = 2; pp->mark2 = 2; } } else if (!soap_pointer_enter(soap, p, NULL, 0, t, &pp)) return 1; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Reference %p type=%d (%d %d)\n", p, t, (int)pp->mark1, (int)pp->mark2)); return pp->mark1; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_array_reference(struct soap *soap, const void *p, const void *a, int n, int t) { struct soap_plist *pp; if (!p || !a || (!soap->encodingStyle && !(soap->omode & (SOAP_ENC_DIME|SOAP_ENC_MIME|SOAP_ENC_MTOM|SOAP_XML_GRAPH))) || (soap->omode & SOAP_XML_TREE)) return 1; if (soap_array_pointer_lookup(soap, p, a, n, t, &pp)) { if (pp->mark1 == 0) { pp->mark1 = 2; pp->mark2 = 2; } } else if (!soap_pointer_enter(soap, p, a, n, t, &pp)) return 1; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Array reference %p ptr=%p n=%lu type=%d (%d %d)\n", p, a, (unsigned long)n, t, (int)pp->mark1, (int)pp->mark2)); return pp->mark1; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_embedded_id(struct soap *soap, int id, const void *p, int t) { struct soap_plist *pp = NULL; if (id >= 0 || (!soap->encodingStyle && !(soap->omode & SOAP_XML_GRAPH)) || (soap->omode & SOAP_XML_TREE)) return id; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Embedded_id %p type=%d id=%d\n", p, t, id)); if (id < -1) return soap_embed(soap, p, NULL, 0, t); if (id < 0) { id = soap_pointer_lookup(soap, p, t, &pp); if (soap->version == 1 && soap->part != SOAP_IN_HEADER) { if (id) { if (soap->mode & SOAP_IO_LENGTH) pp->mark1 = 2; else pp->mark2 = 2; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Embedded_id multiref id=%d %p type=%d = (%d %d)\n", id, p, t, (int)pp->mark1, (int)pp->mark2)); } return -1; } else if (id) { if (soap->mode & SOAP_IO_LENGTH) pp->mark1 = 1; else pp->mark2 = 1; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Embedded_id embedded ref id=%d %p type=%d = (%d %d)\n", id, p, t, (int)pp->mark1, (int)pp->mark2)); } } return id; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_is_embedded(struct soap *soap, struct soap_plist *pp) { if (!pp) return 0; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Is embedded? %d %d\n", (int)pp->mark1, (int)pp->mark2)); if (soap->version == 1 && soap->encodingStyle && !(soap->mode & SOAP_XML_GRAPH) && soap->part != SOAP_IN_HEADER) { if (soap->mode & SOAP_IO_LENGTH) return pp->mark1 != 0; return pp->mark2 != 0; } if (soap->mode & SOAP_IO_LENGTH) return pp->mark1 == 1; return pp->mark2 == 1; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_is_single(struct soap *soap, struct soap_plist *pp) { if (soap->part == SOAP_IN_HEADER) return 1; if (!pp) return 0; if (soap->mode & SOAP_IO_LENGTH) return pp->mark1 == 0; return pp->mark2 == 0; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_set_embedded(struct soap *soap, struct soap_plist *pp) { if (!pp) return; if (soap->mode & SOAP_IO_LENGTH) pp->mark1 = 1; else pp->mark2 = 1; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_attachment(struct soap *soap, const char *tag, int id, const void *p, const void *a, int n, const char *aid, const char *atype, const char *aoptions, const char *type, int t) { struct soap_plist *pp; int i; if (!p || !a || (!aid && !atype)) return soap_element_id(soap, tag, id, p, a, n, type, t, NULL); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Attachment tag='%s' id='%s' (%d) type='%s'\n", tag, aid ? aid : SOAP_STR_EOS, id, atype ? atype : SOAP_STR_EOS)); i = soap_array_pointer_lookup(soap, p, a, n, t, &pp); if (!i) { i = soap_pointer_enter(soap, p, a, n, t, &pp); if (!i) { soap->error = SOAP_EOM; return -1; } } if (id <= 0) id = i; if (!aid) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), strlen(soap->dime_id_format) + 20), soap->dime_id_format, id); aid = soap_strdup(soap, soap->tmpbuf); } /* Add MTOM xop:Include element when necessary */ /* TODO: this code to be obsoleted with new import/xop.h conventions */ if ((soap->mode & SOAP_ENC_MTOM) && strcmp(tag, "xop:Include")) { if (soap_element_begin_out(soap, tag, 0, type) || soap_element_href(soap, "xop:Include", 0, "xmlns:xop=\"http://www.w3.org/2004/08/xop/include\" href", aid) || soap_element_end_out(soap, tag)) return soap->error; } else if (soap_element_href(soap, tag, 0, "href", aid)) return soap->error; if (soap->mode & SOAP_IO_LENGTH) { if (pp->mark1 != 3) { struct soap_multipart *content; if (soap->mode & SOAP_ENC_MTOM) content = soap_new_multipart(soap, &soap->mime.first, &soap->mime.last, (char*)a, n); else content = soap_new_multipart(soap, &soap->dime.first, &soap->dime.last, (char*)a, n); if (!content) { soap->error = SOAP_EOM; return -1; } if (!strncmp(aid, "cid:", 4)) /* RFC 2111 */ { if (soap->mode & SOAP_ENC_MTOM) { size_t l = strlen(aid) - 1; char *s = (char*)soap_malloc(soap, l); if (s) { s[0] = '<'; soap_strncpy(s + 1, l - 1, aid + 4, l - 3); s[l - 2] = '>'; s[l - 1] = '\0'; content->id = s; } } else content->id = aid + 4; } else content->id = aid; content->type = atype; content->options = aoptions; content->encoding = SOAP_MIME_BINARY; pp->mark1 = 3; } } else pp->mark2 = 3; return -1; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_1 static void soap_init_iht(struct soap *soap) { int i; for (i = 0; i < SOAP_IDHASH; i++) soap->iht[i] = NULL; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_1 static void soap_free_iht(struct soap *soap) { int i; struct soap_ilist *ip = NULL, *p = NULL; struct soap_flist *fp = NULL, *fq = NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free ID hashtable\n")); for (i = 0; i < SOAP_IDHASH; i++) { for (ip = soap->iht[i]; ip; ip = p) { for (fp = ip->flist; fp; fp = fq) { fq = fp->next; SOAP_FREE(soap, fp); } p = ip->next; SOAP_FREE(soap, ip); } soap->iht[i] = NULL; } } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 struct soap_ilist * SOAP_FMAC2 soap_lookup(struct soap *soap, const char *id) { struct soap_ilist *ip = NULL; for (ip = soap->iht[soap_hash(id)]; ip; ip = ip->next) if (!strcmp(ip->id, id)) return ip; return NULL; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 struct soap_ilist * SOAP_FMAC2 soap_enter(struct soap *soap, const char *id, int t, size_t n) { size_t h; struct soap_ilist *ip; size_t l = strlen(id); ip = (struct soap_ilist*)SOAP_MALLOC(soap, sizeof(struct soap_ilist) + l); if (ip) { ip->type = t; ip->size = n; ip->ptr = NULL; ip->spine = NULL; ip->link = NULL; ip->copy = NULL; ip->flist = NULL; ip->smart = NULL; ip->shaky = 0; soap_strcpy((char*)ip->id, l + 1, id); h = soap_hash(id); /* h = (HASH(id) % SOAP_IDHASH) so soap->iht[h] is safe */ ip->next = soap->iht[h]; soap->iht[h] = ip; } return ip; } #endif #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void* SOAP_FMAC2 soap_malloc(struct soap *soap, size_t n) { char *p; if (!soap) return SOAP_MALLOC(soap, n); if (soap->fmalloc) p = (char*)soap->fmalloc(soap, n); else { n += sizeof(short); n += (-(long)n) & (sizeof(void*)-1); /* align at 4-, 8- or 16-byte boundary */ if ((p = (char*)SOAP_MALLOC(soap, n + sizeof(void*) + sizeof(size_t))) == NULL) { soap->error = SOAP_EOM; return NULL; } /* set a canary word to detect memory overruns and data corruption */ *(unsigned short*)(p + n - sizeof(unsigned short)) = (unsigned short)SOAP_CANARY; /* keep chain of alloced cells for destruction */ *(void**)(p + n) = soap->alist; *(size_t*)(p + n + sizeof(void*)) = n; soap->alist = p + n; } return p; } #endif /******************************************************************************/ #ifdef SOAP_MEM_DEBUG static void soap_init_mht(struct soap *soap) { int i; for (i = 0; i < (int)SOAP_PTRHASH; i++) soap->mht[i] = NULL; } #endif /******************************************************************************/ #ifdef SOAP_MEM_DEBUG static void soap_free_mht(struct soap *soap) { int i; struct soap_mlist *mp, *mq; for (i = 0; i < (int)SOAP_PTRHASH; i++) { for (mp = soap->mht[i]; mp; mp = mq) { mq = mp->next; if (mp->live) fprintf(stderr, "%s(%d): malloc() = %p not freed (memory leak or forgot to call soap_end()?)\n", mp->file, mp->line, mp->ptr); free(mp); } soap->mht[i] = NULL; } } #endif /******************************************************************************/ #ifdef SOAP_MEM_DEBUG SOAP_FMAC1 void* SOAP_FMAC2 soap_track_malloc(struct soap *soap, const char *file, int line, size_t size) { void *p = malloc(size); if (soap) { size_t h = soap_hash_ptr(p); struct soap_mlist *mp = (struct soap_mlist*)malloc(sizeof(struct soap_mlist)); if (soap->fdebug[SOAP_INDEX_TEST]) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%s(%d): malloc(%lu) = %p\n", file, line, (unsigned long)size, p)); } mp->next = soap->mht[h]; mp->ptr = p; mp->file = file; mp->line = line; mp->live = 1; soap->mht[h] = mp; } return p; } #endif /******************************************************************************/ #ifdef SOAP_MEM_DEBUG SOAP_FMAC1 void SOAP_FMAC2 soap_track_free(struct soap *soap, const char *file, int line, void *p) { if (!soap) free(p); else { size_t h = soap_hash_ptr(p); struct soap_mlist *mp; for (mp = soap->mht[h]; mp; mp = mp->next) if (mp->ptr == p) break; if (mp) { if (mp->live) { if (soap->fdebug[SOAP_INDEX_TEST]) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%s(%d): free(%p)\n", file, line, p)); } free(p); mp->live = 0; } else fprintf(stderr, "%s(%d): free(%p) double free of pointer malloced at %s(%d)\n", file, line, p, mp->file, mp->line); } else fprintf(stderr, "%s(%d): free(%p) pointer not malloced\n", file, line, p); } } #endif /******************************************************************************/ #ifdef SOAP_MEM_DEBUG static void soap_track_unlink(struct soap *soap, const void *p) { size_t h = soap_hash_ptr(p); struct soap_mlist *mp; for (mp = soap->mht[h]; mp; mp = mp->next) if (mp->ptr == p) break; if (mp) mp->live = 0; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_dealloc(struct soap *soap, void *p) { if (soap_check_state(soap)) return; if (p) { char **q; for (q = (char**)(void*)&soap->alist; *q; q = *(char***)q) { if (*(unsigned short*)(char*)(*q - sizeof(unsigned short)) != (unsigned short)SOAP_CANARY) { #ifdef SOAP_MEM_DEBUG fprintf(stderr, "Data corruption in dynamic allocation (see logs)\n"); #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Data corruption:\n")); DBGHEX(TEST, *q - 200, 200); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n")); soap->error = SOAP_MOE; return; } if (p == (void*)(*q - *(size_t*)(*q + sizeof(void*)))) { *q = **(char***)q; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Freed data at %p\n", p)); SOAP_FREE(soap, p); return; } } soap_delete(soap, p); } else { char *q; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free all soap_malloc() data\n")); while (soap->alist) { q = (char*)soap->alist; if (*(unsigned short*)(char*)(q - sizeof(unsigned short)) != (unsigned short)SOAP_CANARY) { #ifdef SOAP_MEM_DEBUG fprintf(stderr, "Data corruption in dynamic allocation (see logs)\n"); #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Data corruption:\n")); DBGHEX(TEST, q - 200, 200); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n")); soap->error = SOAP_MOE; return; } soap->alist = *(void**)q; q -= *(size_t*)(q + sizeof(void*)); SOAP_FREE(soap, q); } /* assume these were deallocated: */ soap->http_content = NULL; soap->action = NULL; soap->fault = NULL; soap->header = NULL; soap->userid = NULL; soap->passwd = NULL; soap->authrealm = NULL; #ifdef WITH_NTLM soap->ntlm_challenge = NULL; #endif #ifndef WITH_LEANER soap_clr_mime(soap); #endif } } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_delete(struct soap *soap, void *p) { struct soap_clist **cp; if (soap_check_state(soap)) return; cp = &soap->clist; if (p) { while (*cp) { if (p == (*cp)->ptr) { struct soap_clist *q = *cp; *cp = q->next; if (q->fdelete(q)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not dealloc data %p: deletion callback failed for object type %d\n", q->ptr, q->type)); #ifdef SOAP_MEM_DEBUG fprintf(stderr, "new(object type = %d) = %p not freed: deletion callback failed\n", q->type, q->ptr); #endif } SOAP_FREE(soap, q); return; } cp = &(*cp)->next; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not dealloc data %p: address not in list\n", p)); } else { while (*cp) { struct soap_clist *q = *cp; *cp = q->next; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Delete %p type=%d (cp=%p)\n", q->ptr, q->type, q)); if (q->fdelete(q)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not dealloc data %p: deletion callback failed for object type %d\n", q->ptr, q->type)); #ifdef SOAP_MEM_DEBUG fprintf(stderr, "new(object type = %d) = %p not freed: deletion callback failed\n", q->type, q->ptr); #endif } SOAP_FREE(soap, q); } } soap->fault = NULL; /* assume this was deallocated */ soap->header = NULL; /* assume this was deallocated */ } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_delegate_deletion(struct soap *soap, struct soap *soap_to) { struct soap_clist *cp; char **q; #ifdef SOAP_MEM_DEBUG void *p; struct soap_mlist **mp, *mq; size_t h; #endif for (q = (char**)(void*)&soap->alist; *q; q = *(char***)q) { if (*(unsigned short*)(char*)(*q - sizeof(unsigned short)) != (unsigned short)SOAP_CANARY) { #ifdef SOAP_MEM_DEBUG fprintf(stderr, "Data corruption in dynamic allocation (see logs)\n"); #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Data corruption:\n")); DBGHEX(TEST, *q - 200, 200); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n")); soap->error = SOAP_MOE; return; } #ifdef SOAP_MEM_DEBUG p = (void*)(*q - *(size_t*)(*q + sizeof(void*))); h = soap_hash_ptr(p); for (mp = &soap->mht[h]; *mp; mp = &(*mp)->next) { if ((*mp)->ptr == p) { mq = *mp; *mp = mq->next; mq->next = soap_to->mht[h]; soap_to->mht[h] = mq; break; } } #endif } *q = (char*)soap_to->alist; soap_to->alist = soap->alist; soap->alist = NULL; #ifdef SOAP_MEM_DEBUG cp = soap->clist; while (cp) { h = soap_hash_ptr(cp); for (mp = &soap->mht[h]; *mp; mp = &(*mp)->next) { if ((*mp)->ptr == cp) { mq = *mp; *mp = mq->next; mq->next = soap_to->mht[h]; soap_to->mht[h] = mq; break; } } cp = cp->next; } #endif cp = soap_to->clist; if (cp) { while (cp->next) cp = cp->next; cp->next = soap->clist; } else soap_to->clist = soap->clist; soap->clist = NULL; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 struct soap_clist * SOAP_FMAC2 soap_link(struct soap *soap, void *p, int t, int n, int (*fdelete)(struct soap_clist*)) { struct soap_clist *cp = NULL; if (soap && p && n != SOAP_NO_LINK_TO_DELETE) { if (!(cp = (struct soap_clist*)SOAP_MALLOC(soap, sizeof(struct soap_clist)))) soap->error = SOAP_EOM; else { cp->next = soap->clist; cp->type = soap->alloced = t; cp->size = n; cp->ptr = p; cp->fdelete = fdelete; soap->clist = cp; } } return cp; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_unlink(struct soap *soap, const void *p) { char **q; struct soap_clist **cp; if (soap && p) { for (q = (char**)(void*)&soap->alist; *q; q = *(char***)q) { if (p == (void*)(*q - *(size_t*)(*q + sizeof(void*)))) { *q = **(char***)q; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unlinked data %p\n", p)); #ifdef SOAP_MEM_DEBUG soap_track_unlink(soap, p); #endif return SOAP_OK; /* found and removed from dealloc chain */ } } for (cp = &soap->clist; *cp; cp = &(*cp)->next) { if (p == (*cp)->ptr) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unlinked class instance %p\n", p)); q = (char**)*cp; *cp = (*cp)->next; SOAP_FREE(soap, q); return SOAP_OK; /* found and removed from dealloc chain */ } } } return SOAP_ERR; } #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_lookup_type(struct soap *soap, const char *id) { struct soap_ilist *ip; if (id && *id) { ip = soap_lookup(soap, id); if (ip) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Lookup id='%s' type=%d\n", id, ip->type)); return ip->type; } } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "lookup type id='%s' NOT FOUND! Need to get it from xsi:type\n", id)); return 0; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_1 SOAP_FMAC1 short SOAP_FMAC2 soap_begin_shaky(struct soap *soap) { short f = soap->shaky; soap->shaky = 1; return f; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_end_shaky(struct soap *soap, short f) { soap->shaky = f; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF static int soap_is_shaky(struct soap *soap, void *p) { (void)p; if (!soap->blist && !soap->shaky) return 0; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Shaky %p\n", p)); return 1; } #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 void* SOAP_FMAC2 soap_id_lookup(struct soap *soap, const char *id, void **p, int t, size_t n, unsigned int k, int (*fbase)(int, int)) { struct soap_ilist *ip; if (!p || !id || !*id) return p; ip = soap_lookup(soap, id); /* lookup pointer to hash table entry for string id */ if (!ip) { if (!(ip = soap_enter(soap, id, t, n))) /* new hash table entry for string id */ return NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forwarding first href='%s' type=%d location=%p (%u bytes) level=%u\n", id, t, p, (unsigned int)n, k)); *p = NULL; if (k) { int i; if (k > SOAP_MAXPTRS) return NULL; if (!(ip->spine = (void**)soap_malloc(soap, SOAP_MAXPTRS * sizeof(void*)))) return NULL; ip->spine[0] = NULL; for (i = 1; i < SOAP_MAXPTRS; i++) ip->spine[i] = &ip->spine[i - 1]; *p = &ip->spine[k - 1]; } else { ip->link = p; ip->shaky = soap_is_shaky(soap, (void*)p); } } else if ((ip->type != t || ip->size != n) && (!fbase || !fbase(ip->type, t)) && (!fbase || !fbase(t, ip->type) || soap_type_punned(soap, ip))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Lookup type incompatibility: ref='%s' id-type=%d ref-type=%d\n", id, ip->type, t)); soap_id_nullify(soap, id); return NULL; } else if (k == 0 && ip->ptr && !ip->shaky) /* when block lists are in use, ip->ptr will change */ { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolved href='%s' type=%d location=%p (%u bytes) level=%u\n", id, t, ip->ptr, (unsigned int)n, k)); *p = ip->ptr; } else { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forwarded href='%s' type=%d location=%p (%u bytes) level=%u\n", id, t, p, (unsigned int)n, k)); if (fbase && fbase(t, ip->type) && !soap_type_punned(soap, ip)) { ip->type = t; ip->size = n; } *p = NULL; if (k) { if (!ip->spine) { int i; if (k > SOAP_MAXPTRS) return NULL; if (!(ip->spine = (void**)soap_malloc(soap, SOAP_MAXPTRS * sizeof(void*)))) return NULL; ip->spine[0] = NULL; for (i = 1; i < SOAP_MAXPTRS; i++) ip->spine[i] = &ip->spine[i - 1]; } *p = &ip->spine[k - 1]; if (ip->ptr && !ip->shaky) ip->spine[0] = ip->ptr; } else { void *q = ip->link; ip->link = p; ip->shaky = soap_is_shaky(soap, (void*)p); *p = q; } } return p; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 void* SOAP_FMAC2 soap_id_forward(struct soap *soap, const char *href, void *p, size_t i, int t, int tt, size_t n, unsigned int k, void (*finsert)(struct soap*, int, int, void*, size_t, const void*, void**), int (*fbase)(int, int)) { struct soap_ilist *ip; if (!p || !href || !*href) return p; ip = soap_lookup(soap, href); /* lookup pointer to hash table entry for string id */ if (!ip) { if (!(ip = soap_enter(soap, href, t, n))) /* new hash table entry for string id */ return NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "New entry href='%s' type=%d size=%lu level=%d location=%p\n", href, t, (unsigned long)n, k, p)); } else if ((ip->type != t || ip->size != n) && k == 0) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forward type incompatibility id='%s' expect type=%d size=%lu level=%u got type=%d size=%lu\n", href, ip->type, (unsigned long)ip->size, k, t, (unsigned long)n)); soap_id_nullify(soap, href); return NULL; } if (finsert || n < sizeof(void*)) { struct soap_flist *fp = (struct soap_flist*)SOAP_MALLOC(soap, sizeof(struct soap_flist)); if (!fp) { soap->error = SOAP_EOM; return NULL; } if (fbase && fbase(t, ip->type) && !soap_type_punned(soap, ip)) { ip->type = t; ip->size = n; } if ((ip->type != t || ip->size != n) && (!fbase || !fbase(ip->type, t))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forward type incompatibility id='%s' expect type=%d size=%lu level=%u got type=%d size=%lu\n", href, ip->type, (unsigned long)ip->size, k, t, (unsigned long)n)); soap_id_nullify(soap, href); return NULL; } fp->next = ip->flist; fp->type = tt; fp->ptr = p; fp->level = k; fp->index = i; fp->finsert = finsert; ip->flist = fp; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forwarding type=%d (target type=%d) size=%lu location=%p level=%u index=%lu href='%s'\n", t, tt, (unsigned long)n, p, k, (unsigned long)i, href)); } else { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forwarding copying address %p for type=%d href='%s'\n", p, t, href)); *(void**)p = ip->copy; ip->copy = p; } ip->shaky = soap_is_shaky(soap, p); return p; } #endif #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void* SOAP_FMAC2 soap_id_enter(struct soap *soap, const char *id, void *p, int t, size_t n, const char *type, const char *arrayType, void *(*finstantiate)(struct soap*, int, const char*, const char*, size_t*), int (*fbase)(int, int)) { #ifndef WITH_NOIDREF struct soap_ilist *ip; #endif (void)id; (void)fbase; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Enter id='%s' type=%d location=%p size=%lu\n", id, t, p, (unsigned long)n)); soap->alloced = 0; if (!p) { if (finstantiate) p = finstantiate(soap, t, type, arrayType, &n); /* alloced set in soap_link() */ else { p = soap_malloc(soap, n); soap->alloced = t; } } #ifndef WITH_NOIDREF if (!id || !*id) #endif return p; #ifndef WITH_NOIDREF ip = soap_lookup(soap, id); /* lookup pointer to hash table entry for string id */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Lookup entry id='%s' for location=%p\n", id, p)); if (!ip) { if (!(ip = soap_enter(soap, id, t, n))) /* new hash table entry for string id */ return NULL; ip->ptr = p; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "New entry id='%s' type=%d size=%lu location=%p\n", id, t, (unsigned long)n, p)); if (!soap->alloced) ip->shaky = soap_is_shaky(soap, p); } else if (ip->ptr) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Multiply defined id='%s'\n", id)); soap_strcpy(soap->id, sizeof(soap->id), id); soap->error = SOAP_DUPLICATE_ID; return NULL; } else if ((ip->type != t || ip->size != n) && (!fbase || !fbase(t, ip->type) || soap_type_punned(soap, ip))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Enter type incompatibility id='%s' expect type=%d size=%lu got type=%d size=%lu\n", id, ip->type, (unsigned long)ip->size, t, (unsigned long)n)); soap_id_nullify(soap, id); return NULL; } else { ip->type = t; ip->size = n; ip->ptr = p; if (!soap->alloced) ip->shaky = soap_is_shaky(soap, p); if (soap->alloced || !ip->shaky) { void **q; /* ptr will not change later, so resolve links now */ if (ip->spine) ip->spine[0] = p; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Traversing link chain to resolve id='%s' type=%d\n", ip->id, ip->type)); q = (void**)ip->link; while (q) { void *r = *q; *q = p; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "... link %p -> %p\n", q, p)); q = (void**)r; } ip->link = NULL; } } return ip->ptr; #endif } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void** SOAP_FMAC2 soap_id_smart(struct soap *soap, const char *id, int t, size_t n) { (void)soap; (void)id; (void)t; (void)n; #ifndef WITH_NOIDREF if (id && *id) { struct soap_ilist *ip = soap_lookup(soap, id); /* lookup pointer to hash table entry for string id */ if (!ip) { if (!(ip = soap_enter(soap, id, t, n))) /* new hash table entry for string id */ return NULL; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "New smart shared pointer entry id='%s' type=%d size=%lu smart=%p\n", id, t, (unsigned long)n, ip->smart)); return &ip->smart; } #endif return NULL; } #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 static int soap_type_punned(struct soap *soap, const struct soap_ilist *ip) { const struct soap_flist *fp; (void)soap; if (ip->ptr || ip->copy) return 1; for (fp = ip->flist; fp; fp = fp->next) if (fp->level == 0) return 1; return 0; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_id_nullify(struct soap *soap, const char *id) { int i; for (i = 0; i < SOAP_IDHASH; i++) { struct soap_ilist *ip; for (ip = soap->iht[i]; ip; ip = ip->next) { void *p, *q; for (p = ip->link; p; p = q) { q = *(void**)p; *(void**)p = NULL; } ip->link = NULL; } } soap_strcpy(soap->id, sizeof(soap->id), id); return soap->error = SOAP_HREF; } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_end_send(struct soap *soap) { #ifndef WITH_LEANER int err; if (soap->dime.list) { /* SOAP body referenced attachments must appear first */ soap->dime.last->next = soap->dime.first; soap->dime.first = soap->dime.list->next; soap->dime.list->next = NULL; soap->dime.last = soap->dime.list; } if (!(err = soap_putdime(soap))) err = soap_putmime(soap); soap->mime.list = NULL; soap->mime.first = NULL; soap->mime.last = NULL; soap->dime.list = NULL; soap->dime.first = NULL; soap->dime.last = NULL; if (err) return err; #endif return soap_end_send_flush(soap); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_end_send_flush(struct soap *soap) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End send mode=0x%x\n", soap->mode)); if (soap->mode & SOAP_IO) /* need to flush the remaining data in buffer */ { if (soap_flush(soap)) #ifdef WITH_ZLIB { if (soap->mode & SOAP_ENC_ZLIB && soap->zlib_state == SOAP_ZLIB_DEFLATE) { soap->zlib_state = SOAP_ZLIB_NONE; deflateEnd(soap->d_stream); } return soap->error; } #else return soap->error; #endif #ifdef WITH_ZLIB if ((soap->mode & SOAP_ENC_ZLIB) && soap->d_stream) { int r; soap->d_stream->avail_in = 0; do { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Deflating remainder\n")); r = deflate(soap->d_stream, Z_FINISH); if (soap->d_stream->avail_out != sizeof(soap->buf)) { if (soap_flush_raw(soap, soap->z_buf, sizeof(soap->buf) - soap->d_stream->avail_out)) { soap->zlib_state = SOAP_ZLIB_NONE; deflateEnd(soap->d_stream); return soap->error; } soap->d_stream->next_out = (Byte*)soap->z_buf; soap->d_stream->avail_out = sizeof(soap->buf); } } while (r == Z_OK); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Deflated total %lu->%lu bytes\n", soap->d_stream->total_in, soap->d_stream->total_out)); soap->z_ratio_out = (float)soap->d_stream->total_out / (float)soap->d_stream->total_in; soap->mode &= ~SOAP_ENC_ZLIB; soap->zlib_state = SOAP_ZLIB_NONE; if (deflateEnd(soap->d_stream) != Z_OK || r != Z_STREAM_END) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unable to end deflate: %s\n", soap->d_stream->msg ? soap->d_stream->msg : SOAP_STR_EOS)); return soap->error = SOAP_ZLIB_ERROR; } #ifdef WITH_GZIP if (soap->zlib_out != SOAP_ZLIB_DEFLATE) { soap->z_buf[0] = soap->z_crc & 0xFF; soap->z_buf[1] = (soap->z_crc >> 8) & 0xFF; soap->z_buf[2] = (soap->z_crc >> 16) & 0xFF; soap->z_buf[3] = (soap->z_crc >> 24) & 0xFF; soap->z_buf[4] = soap->d_stream->total_in & 0xFF; soap->z_buf[5] = (soap->d_stream->total_in >> 8) & 0xFF; soap->z_buf[6] = (soap->d_stream->total_in >> 16) & 0xFF; soap->z_buf[7] = (soap->d_stream->total_in >> 24) & 0xFF; if (soap_flush_raw(soap, soap->z_buf, 8)) return soap->error; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "gzip crc32=%lu\n", (unsigned long)soap->z_crc)); } #endif } #endif if ((soap->mode & SOAP_IO) == SOAP_IO_STORE) { #if !defined(__cplusplus) || defined(WITH_COMPAT) if (soap->os) { char *b = (char*)soap_push_block(soap, NULL, 1); if (b) *soap->os = soap_save_block(soap, NULL, NULL, 0); } else #endif { char *p; #ifndef WITH_NOHTTP if (!(soap->mode & SOAP_ENC_XML)) { soap->mode--; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Sending buffered message of length %u\n", (unsigned int)soap->blist->size)); if (soap->status >= SOAP_POST) soap->error = soap->fpost(soap, soap->endpoint, soap->host, soap->port, soap->path, soap->action, soap->blist->size); else if (soap->status != SOAP_STOP) soap->error = soap->fresponse(soap, soap->status, soap->blist->size); if (soap->error || soap_flush(soap)) return soap->error; soap->mode++; } #endif for (p = soap_first_block(soap, NULL); p; p = soap_next_block(soap, NULL)) { DBGMSG(SENT, p, soap_block_size(soap, NULL)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Send %u bytes to socket=%d/fd=%d\n", (unsigned int)soap_block_size(soap, NULL), soap->socket, soap->sendfd)); if ((soap->error = soap->fsend(soap, p, soap_block_size(soap, NULL)))) { soap_end_block(soap, NULL); return soap->error; } } soap_end_block(soap, NULL); } #ifndef WITH_LEANER if (soap->fpreparefinalsend && (soap->error = soap->fpreparefinalsend(soap))) return soap->error; #endif } #ifndef WITH_LEANER else if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK) { DBGMSG(SENT, "\r\n0\r\n\r\n", 7); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Send 7 bytes to socket=%d/fd=%d\n", soap->socket, soap->sendfd)); if ((soap->error = soap->fsend(soap, "\r\n0\r\n\r\n", 7))) return soap->error; } #endif } #ifdef WITH_TCPFIN #if defined(WITH_OPENSSL) || defined(WITH_SYSTEMSSL) if (!soap->ssl) #endif if (soap_valid_socket(soap->socket) && !soap->keep_alive && !(soap->omode & SOAP_IO_UDP)) soap->fshutdownsocket(soap, soap->socket, SOAP_SHUT_WR); /* Send TCP FIN */ #endif #if defined(__cplusplus) && !defined(WITH_COMPAT) if (soap->os) soap->os->flush(); #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of send phase\n")); soap->omode &= ~SOAP_SEC_WSUID; soap->count = 0; soap->part = SOAP_END; return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_end_recv(struct soap *soap) { soap->part = SOAP_END; #ifndef WITH_LEAN soap->wsuid = NULL; /* reset before next send */ soap->c14nexclude = NULL; /* reset before next send */ soap->c14ninclude = NULL; /* reset before next send */ #endif #ifndef WITH_LEANER soap->ffilterrecv = NULL; if ((soap->mode & SOAP_ENC_DIME) && soap_getdime(soap)) { soap->dime.first = NULL; soap->dime.last = NULL; return soap->error; } soap->dime.list = soap->dime.first; soap->dime.first = NULL; soap->dime.last = NULL; /* Check if MIME attachments and mime-post-check flag is set, if so call soap_resolve() and return */ if (soap->mode & SOAP_ENC_MIME) { if (soap->mode & SOAP_MIME_POSTCHECK) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Post checking MIME attachments\n")); if (!soap->keep_alive) soap->keep_alive = -1; #ifndef WITH_NOIDREF soap_resolve(soap); #endif return SOAP_OK; } if (soap_getmime(soap)) return soap->error; } soap->mime.list = soap->mime.first; soap->mime.first = NULL; soap->mime.last = NULL; soap->mime.boundary = NULL; if (soap->xlist) { struct soap_multipart *content; for (content = soap->mime.list; content; content = content->next) soap_resolve_attachment(soap, content); } #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of receive message ok\n")); #ifdef WITH_ZLIB if ((soap->mode & SOAP_ENC_ZLIB) && soap->d_stream) { /* Make sure end of compressed content is reached */ while (soap->d_stream->next_out != Z_NULL) if ((int)soap_get1(soap) == EOF) break; soap->mode &= ~SOAP_ENC_ZLIB; soap_memcpy((void*)soap->buf, sizeof(soap->buf), (const void*)soap->z_buf, sizeof(soap->buf)); soap->bufidx = (char*)soap->d_stream->next_in - soap->z_buf; soap->buflen = soap->z_buflen; soap->zlib_state = SOAP_ZLIB_NONE; if (inflateEnd(soap->d_stream) != Z_OK) return soap->error = SOAP_ZLIB_ERROR; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflate end ok\n")); #ifdef WITH_GZIP if (soap->zlib_in == SOAP_ZLIB_GZIP) { soap_wchar c; short i; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflate gzip crc check\n")); for (i = 0; i < 8; i++) { if ((int)(c = soap_get1(soap)) == EOF) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Gzip error: unable to read crc value\n")); return soap->error = SOAP_ZLIB_ERROR; } soap->z_buf[i] = (char)c; } if (soap->z_crc != ((uLong)(unsigned char)soap->z_buf[0] | ((uLong)(unsigned char)soap->z_buf[1] << 8) | ((uLong)(unsigned char)soap->z_buf[2] << 16) | ((uLong)(unsigned char)soap->z_buf[3] << 24))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Gzip inflate error: crc check failed, message corrupted? (crc32=%lu)\n", (unsigned long)soap->z_crc)); return soap->error = SOAP_ZLIB_ERROR; } if (soap->d_stream->total_out != ((uLong)(unsigned char)soap->z_buf[4] | ((uLong)(unsigned char)soap->z_buf[5] << 8) | ((uLong)(unsigned char)soap->z_buf[6] << 16) | ((uLong)(unsigned char)soap->z_buf[7] << 24))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Gzip inflate error: incorrect message length\n")); return soap->error = SOAP_ZLIB_ERROR; } } soap->zlib_in = SOAP_ZLIB_NONE; #endif } #endif if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK) while (soap->ahead != EOF && !soap_recv_raw(soap)) continue; #ifndef WITH_NOIDREF if (soap_resolve(soap)) return soap->error; #endif #ifndef WITH_LEANER if (soap->xlist) { if (soap->mode & SOAP_ENC_MTOM) return soap->error = SOAP_MIME_HREF; return soap->error = SOAP_DIME_HREF; } #endif soap_free_ns(soap); #ifndef WITH_LEANER if (soap->fpreparefinalrecv) return soap->error = soap->fpreparefinalrecv(soap); #endif return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_free_temp(struct soap *soap) { struct soap_attribute *tp, *tq; struct Namespace *ns; soap_free_ns(soap); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free any remaining temp blocks\n")); while (soap->blist) soap_end_block(soap, NULL); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free attribute storage\n")); for (tp = soap->attributes; tp; tp = tq) { tq = tp->next; if (tp->value) SOAP_FREE(soap, tp->value); SOAP_FREE(soap, tp); } soap->attributes = NULL; #ifdef WITH_FAST if (soap->labbuf) SOAP_FREE(soap, soap->labbuf); soap->labbuf = NULL; soap->lablen = 0; soap->labidx = 0; #endif ns = soap->local_namespaces; if (ns) { for (; ns->id; ns++) { if (ns->out) { SOAP_FREE(soap, ns->out); ns->out = NULL; } } SOAP_FREE(soap, soap->local_namespaces); soap->local_namespaces = NULL; } #ifndef WITH_LEANER while (soap->xlist) { struct soap_xlist *xp = soap->xlist->next; SOAP_FREE(soap, soap->xlist); soap->xlist = xp; } #endif #ifndef WITH_NOIDREF soap_free_iht(soap); #endif soap_free_pht(soap); } #endif /******************************************************************************/ #ifndef PALM_1 static void soap_free_ns(struct soap *soap) { struct soap_nlist *np, *nq; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free namespace stack\n")); for (np = soap->nlist; np; np = nq) { nq = np->next; SOAP_FREE(soap, np); } soap->nlist = NULL; } #endif /******************************************************************************/ #ifndef PALM_1 #if !defined(WITH_LEAN) || defined(SOAP_DEBUG) static void soap_init_logs(struct soap *soap) { int i; for (i = 0; i < SOAP_MAXLOGS; i++) { soap->logfile[i] = NULL; soap->fdebug[i] = NULL; } } #endif #endif /******************************************************************************/ #if !defined(WITH_LEAN) || defined(SOAP_DEBUG) SOAP_FMAC1 void SOAP_FMAC2 soap_open_logfile(struct soap *soap, int i) { if (soap->logfile[i]) soap->fdebug[i] = fopen(soap->logfile[i], i < 2 ? "ab" : "a"); } #endif /******************************************************************************/ #ifdef SOAP_DEBUG static void soap_close_logfile(struct soap *soap, int i) { if (soap->fdebug[i]) { fclose(soap->fdebug[i]); soap->fdebug[i] = NULL; } } #endif /******************************************************************************/ #ifdef SOAP_DEBUG SOAP_FMAC1 void SOAP_FMAC2 soap_close_logfiles(struct soap *soap) { int i; for (i = 0; i < SOAP_MAXLOGS; i++) soap_close_logfile(soap, i); } #endif /******************************************************************************/ #ifdef SOAP_DEBUG static void soap_set_logfile(struct soap *soap, int i, const char *logfile) { const char *s; char *t = NULL; soap_close_logfile(soap, i); s = soap->logfile[i]; soap->logfile[i] = logfile; if (s) SOAP_FREE(soap, s); if (logfile) { size_t l = strlen(logfile) + 1; if ((t = (char*)SOAP_MALLOC(soap, l))) soap_memcpy((void*)t, l, (const void*)logfile, l); } soap->logfile[i] = t; } #endif /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_set_recv_logfile(struct soap *soap, const char *logfile) { (void)soap; (void)logfile; #ifdef SOAP_DEBUG soap_set_logfile(soap, SOAP_INDEX_RECV, logfile); #endif } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_set_sent_logfile(struct soap *soap, const char *logfile) { (void)soap; (void)logfile; #ifdef SOAP_DEBUG soap_set_logfile(soap, SOAP_INDEX_SENT, logfile); #endif } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_set_test_logfile(struct soap *soap, const char *logfile) { (void)soap; (void)logfile; #ifdef SOAP_DEBUG soap_set_logfile(soap, SOAP_INDEX_TEST, logfile); #endif } /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 struct soap* SOAP_FMAC2 soap_copy(const struct soap *soap) { struct soap *copy = soap_versioning(soap_new)(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT); if (soap_copy_context(copy, soap) != NULL) return copy; soap_free(copy); return NULL; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 struct soap* SOAP_FMAC2 soap_copy_context(struct soap *copy, const struct soap *soap) { if (copy == soap) return copy; if (soap_check_state(soap)) return NULL; if (copy) { struct soap_plugin *p = NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copying context\n")); soap_memcpy((void*)copy, sizeof(struct soap), (const void*)soap, sizeof(struct soap)); copy->state = SOAP_COPY; copy->error = SOAP_OK; copy->userid = NULL; copy->passwd = NULL; #ifdef WITH_NTLM copy->ntlm_challenge = NULL; #endif copy->nlist = NULL; copy->blist = NULL; copy->clist = NULL; copy->alist = NULL; copy->attributes = NULL; copy->labbuf = NULL; copy->lablen = 0; copy->labidx = 0; #ifdef SOAP_MEM_DEBUG soap_init_mht(copy); #endif #if !defined(WITH_LEAN) || defined(SOAP_DEBUG) soap_init_logs(copy); #endif #ifdef SOAP_DEBUG soap_set_test_logfile(copy, soap->logfile[SOAP_INDEX_TEST]); soap_set_sent_logfile(copy, soap->logfile[SOAP_INDEX_SENT]); soap_set_recv_logfile(copy, soap->logfile[SOAP_INDEX_RECV]); #endif copy->namespaces = soap->local_namespaces; copy->local_namespaces = NULL; soap_set_local_namespaces(copy); /* copy content of soap->local_namespaces */ copy->namespaces = soap->namespaces; /* point to shared read-only namespaces table */ copy->c_locale = NULL; #ifdef WITH_OPENSSL copy->bio = NULL; copy->ssl = NULL; copy->session = NULL; #endif #ifdef WITH_GNUTLS copy->session = NULL; #endif #ifdef WITH_ZLIB copy->d_stream = NULL; copy->z_buf = NULL; #endif #ifndef WITH_NOIDREF soap_init_iht(copy); #endif soap_init_pht(copy); copy->header = NULL; copy->fault = NULL; copy->action = NULL; #ifndef WITH_LEAN #ifdef WITH_COOKIES copy->cookies = soap_copy_cookies(copy, soap); #else copy->cookies = NULL; #endif #endif copy->plugins = NULL; for (p = soap->plugins; p; p = p->next) { struct soap_plugin *q = (struct soap_plugin*)SOAP_MALLOC(copy, sizeof(struct soap_plugin)); if (!q) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not allocate plugin '%s'\n", p->id)); soap_end(copy); soap_done(copy); return NULL; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copying plugin '%s'\n", p->id)); *q = *p; if (p->fcopy && (copy->error = p->fcopy(copy, q, p))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not copy plugin '%s' error = %d\n", p->id, copy->error)); SOAP_FREE(copy, q); soap_end(copy); soap_done(copy); return NULL; } q->next = copy->plugins; copy->plugins = q; } } return copy; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_copy_stream(struct soap *copy, struct soap *soap) { struct soap_attribute *tp = NULL, *tq; if (copy == soap) return; copy->header = soap->header; copy->mode = soap->mode; copy->imode = soap->imode; copy->omode = soap->omode; copy->master = soap->master; copy->socket = soap->socket; copy->sendsk = soap->sendsk; copy->recvsk = soap->recvsk; copy->recv_timeout = soap->recv_timeout; copy->send_timeout = soap->send_timeout; copy->os = soap->os; copy->is = soap->is; copy->sendfd = soap->sendfd; copy->recvfd = soap->recvfd; copy->bufidx = soap->bufidx; copy->buflen = soap->buflen; copy->ahead = soap->ahead; copy->cdata = soap->cdata; copy->chunksize = soap->chunksize; copy->chunkbuflen = soap->chunkbuflen; copy->keep_alive = soap->keep_alive; copy->tcp_keep_alive = soap->tcp_keep_alive; copy->tcp_keep_idle = soap->tcp_keep_idle; copy->tcp_keep_intvl = soap->tcp_keep_intvl; copy->tcp_keep_cnt = soap->tcp_keep_cnt; copy->max_keep_alive = soap->max_keep_alive; #ifndef WITH_NOIO copy->peer = soap->peer; copy->peerlen = soap->peerlen; copy->ip = soap->ip; copy->port = soap->port; soap_memcpy((void*)copy->host, sizeof(copy->host), (const void*)soap->host, sizeof(soap->host)); soap_memcpy((void*)copy->endpoint, sizeof(copy->endpoint), (const void*)soap->endpoint, sizeof(soap->endpoint)); #endif #ifdef WITH_OPENSSL copy->bio = soap->bio; copy->ctx = soap->ctx; copy->ssl = soap->ssl; #endif #ifdef WITH_GNUTLS copy->session = soap->session; #endif #ifdef WITH_SYSTEMSSL copy->ctx = soap->ctx; copy->ssl = soap->ssl; #endif #ifdef WITH_ZLIB copy->zlib_state = soap->zlib_state; copy->zlib_in = soap->zlib_in; copy->zlib_out = soap->zlib_out; if (soap->d_stream && soap->zlib_state != SOAP_ZLIB_NONE) { if (!copy->d_stream) copy->d_stream = (z_stream*)SOAP_MALLOC(copy, sizeof(z_stream)); if (copy->d_stream) soap_memcpy((void*)copy->d_stream, sizeof(z_stream), (const void*)soap->d_stream, sizeof(z_stream)); } copy->z_crc = soap->z_crc; copy->z_ratio_in = soap->z_ratio_in; copy->z_ratio_out = soap->z_ratio_out; copy->z_buf = NULL; copy->z_buflen = soap->z_buflen; copy->z_level = soap->z_level; if (soap->z_buf && soap->zlib_state != SOAP_ZLIB_NONE) { copy->z_buf = (char*)SOAP_MALLOC(copy, sizeof(soap->buf)); if (copy->z_buf) soap_memcpy((void*)copy->z_buf, sizeof(soap->buf), (const void*)soap->z_buf, sizeof(soap->buf)); } copy->z_dict = soap->z_dict; copy->z_dict_len = soap->z_dict_len; #endif soap_memcpy((void*)copy->buf, sizeof(copy->buf), (const void*)soap->buf, sizeof(soap->buf)); /* copy XML parser state */ soap_free_ns(copy); soap_set_local_namespaces(copy); copy->version = soap->version; if (soap->nlist && soap->local_namespaces) { struct soap_nlist *np = NULL, *nq; /* copy reversed nlist */ for (nq = soap->nlist; nq; nq = nq->next) { struct soap_nlist *nr = np; size_t n = sizeof(struct soap_nlist) + strlen(nq->id); np = (struct soap_nlist*)SOAP_MALLOC(copy, n); if (!np) break; soap_memcpy((void*)np, n, (const void*)nq, n); np->next = nr; } while (np) { const char *s = np->ns; copy->level = np->level; /* preserve element nesting level */ if (!s && np->index >= 0) { s = soap->local_namespaces[np->index].out; if (!s) s = soap->local_namespaces[np->index].ns; } if (s && soap_push_namespace(copy, np->id, s) == NULL) break; nq = np; np = np->next; SOAP_FREE(copy, nq); } } soap_memcpy((void*)copy->tag, sizeof(copy->tag), (const void*)soap->tag, sizeof(soap->tag)); soap_memcpy((void*)copy->id, sizeof(copy->id), (const void*)soap->id, sizeof(soap->id)); soap_memcpy((void*)copy->href, sizeof(copy->href), (const void*)soap->href, sizeof(soap->href)); soap_memcpy((void*)copy->type, sizeof(copy->type), (const void*)soap->type, sizeof(soap->type)); copy->other = soap->other; copy->root = soap->root; copy->null = soap->null; copy->body = soap->body; copy->part = soap->part; copy->mustUnderstand = soap->mustUnderstand; copy->level = soap->level; copy->peeked = soap->peeked; /* copy attributes */ for (tq = soap->attributes; tq; tq = tq->next) { struct soap_attribute *tr = tp; size_t n = sizeof(struct soap_attribute) + strlen(tq->name); tp = (struct soap_attribute*)SOAP_MALLOC(copy, n); soap_memcpy((void*)tp, n, (const void*)tq, n); if (tp->size) { tp->value = (char*)SOAP_MALLOC(copy, tp->size); if (tp->value) soap_memcpy((void*)tp->value, tp->size, (const void*)tq->value, tp->size); } tp->ns = NULL; tp->next = tr; } copy->attributes = tp; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_free_stream(struct soap *soap) { soap->socket = SOAP_INVALID_SOCKET; soap->sendsk = SOAP_INVALID_SOCKET; soap->recvsk = SOAP_INVALID_SOCKET; #ifdef WITH_OPENSSL soap->bio = NULL; soap->ctx = NULL; soap->ssl = NULL; #endif #ifdef WITH_GNUTLS soap->xcred = NULL; soap->acred = NULL; soap->cache = NULL; soap->session = NULL; soap->dh_params = NULL; soap->rsa_params = NULL; #endif #ifdef WITH_SYSTEMSSL soap->ctx = (gsk_handle)NULL; soap->ssl = (gsk_handle)NULL; #endif #ifdef WITH_ZLIB if (soap->z_buf) SOAP_FREE(soap, soap->z_buf); soap->z_buf = NULL; #endif } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_initialize(struct soap *soap) { soap_versioning(soap_init)(soap, SOAP_IO_DEFAULT, SOAP_IO_DEFAULT); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_versioning(soap_init)(struct soap *soap, soap_mode imode, soap_mode omode) { size_t i; soap->state = SOAP_INIT; #ifdef SOAP_MEM_DEBUG soap_init_mht(soap); #endif #if !defined(WITH_LEAN) || defined(SOAP_DEBUG) soap_init_logs(soap); #endif #ifdef SOAP_DEBUG #ifdef TANDEM_NONSTOP soap_set_test_logfile(soap, "TESTLOG"); soap_set_sent_logfile(soap, "SENTLOG"); soap_set_recv_logfile(soap, "RECVLOG"); #else soap_set_test_logfile(soap, "TEST.log"); soap_set_sent_logfile(soap, "SENT.log"); soap_set_recv_logfile(soap, "RECV.log"); #endif #endif soap->version = 0; soap_mode(soap, imode); soap_imode(soap, imode); soap_omode(soap, omode); soap->plugins = NULL; soap->user = NULL; for (i = 0; i < sizeof(soap->data)/sizeof(*soap->data); i++) soap->data[i] = NULL; soap->userid = NULL; soap->passwd = NULL; soap->authrealm = NULL; #ifdef WITH_NTLM soap->ntlm_challenge = NULL; #endif #ifndef WITH_NOHTTP soap->fpost = http_post; soap->fget = http_get; soap->fput = http_405; soap->fdel = http_405; soap->fopt = http_200; soap->fhead = http_200; soap->fform = NULL; soap->fposthdr = http_post_header; soap->fresponse = http_response; soap->fparse = http_parse; soap->fparsehdr = http_parse_header; #endif soap->fheader = NULL; soap->fconnect = NULL; soap->fdisconnect = NULL; #ifndef WITH_NOIO soap->ipv6_multicast_if = 0; /* in_addr_t value */ soap->ipv4_multicast_if = NULL; /* points to struct in_addr or in_addr_t */ soap->ipv4_multicast_ttl = 0; /* 0: use default */ #ifndef WITH_IPV6 soap->fresolve = tcp_gethost; #else soap->fresolve = NULL; #endif soap->faccept = tcp_accept; soap->fopen = tcp_connect; soap->fclose = tcp_disconnect; soap->fclosesocket = tcp_closesocket; soap->fshutdownsocket = tcp_shutdownsocket; soap->fsend = fsend; soap->frecv = frecv; soap->fpoll = soap_poll; #else soap->fopen = NULL; soap->fclose = NULL; soap->fpoll = NULL; #endif soap->fseterror = NULL; soap->fignore = NULL; soap->fserveloop = NULL; soap->fplugin = fplugin; soap->fmalloc = NULL; #ifndef WITH_LEANER soap->fsvalidate = NULL; soap->fwvalidate = NULL; soap->feltbegin = NULL; soap->feltendin = NULL; soap->feltbegout = NULL; soap->feltendout = NULL; soap->fprepareinitsend = NULL; soap->fprepareinitrecv = NULL; soap->fpreparesend = NULL; soap->fpreparerecv = NULL; soap->fpreparefinalsend = NULL; soap->fpreparefinalrecv = NULL; soap->ffiltersend = NULL; soap->ffilterrecv = NULL; soap->fdimereadopen = NULL; soap->fdimewriteopen = NULL; soap->fdimereadclose = NULL; soap->fdimewriteclose = NULL; soap->fdimeread = NULL; soap->fdimewrite = NULL; soap->fmimereadopen = NULL; soap->fmimewriteopen = NULL; soap->fmimereadclose = NULL; soap->fmimewriteclose = NULL; soap->fmimeread = NULL; soap->fmimewrite = NULL; #endif soap->float_format = "%.9G"; /* Alternative: use "%G" */ soap->double_format = "%.17lG"; /* Alternative: use "%lG" */ soap->long_double_format = NULL; /* Defined in custom serializer custom/long_double.c */ soap->dime_id_format = "cid:id%d"; /* default DIME id format for int id index */ soap->http_version = "1.1"; soap->proxy_http_version = "1.0"; soap->http_content = NULL; soap->actor = NULL; soap->lang = "en"; soap->keep_alive = 0; soap->tcp_keep_alive = 0; soap->tcp_keep_idle = 0; soap->tcp_keep_intvl = 0; soap->tcp_keep_cnt = 0; soap->max_keep_alive = SOAP_MAXKEEPALIVE; soap->recv_timeout = 0; soap->send_timeout = 0; soap->connect_timeout = 0; soap->accept_timeout = 0; soap->socket_flags = 0; soap->connect_flags = 0; soap->bind_flags = 0; soap->accept_flags = 0; soap->linger_time = 0; soap->ip = 0; soap->labbuf = NULL; soap->lablen = 0; soap->labidx = 0; soap->encodingStyle = NULL; #ifndef WITH_NONAMESPACES soap->namespaces = namespaces; #else soap->namespaces = NULL; #endif soap->local_namespaces = NULL; soap->nlist = NULL; soap->blist = NULL; soap->clist = NULL; soap->alist = NULL; soap->shaky = 0; soap->attributes = NULL; soap->header = NULL; soap->fault = NULL; soap->master = SOAP_INVALID_SOCKET; soap->socket = SOAP_INVALID_SOCKET; soap->sendsk = SOAP_INVALID_SOCKET; soap->recvsk = SOAP_INVALID_SOCKET; soap->os = NULL; soap->is = NULL; #ifndef WITH_LEANER soap->dom = NULL; soap->dime.list = NULL; soap->dime.first = NULL; soap->dime.last = NULL; soap->mime.list = NULL; soap->mime.first = NULL; soap->mime.last = NULL; soap->mime.boundary = NULL; soap->mime.start = NULL; soap->xlist = NULL; #endif #ifndef UNDER_CE soap->recvfd = 0; soap->sendfd = 1; #else soap->recvfd = stdin; soap->sendfd = stdout; #endif soap->host[0] = '\0'; soap->path[0] = '\0'; soap->port = 0; soap->action = NULL; soap->proxy_host = NULL; soap->proxy_port = 8080; soap->proxy_userid = NULL; soap->proxy_passwd = NULL; soap->prolog = "\n"; #ifdef WITH_ZLIB soap->zlib_state = SOAP_ZLIB_NONE; soap->zlib_in = SOAP_ZLIB_NONE; soap->zlib_out = SOAP_ZLIB_NONE; soap->d_stream = NULL; soap->z_buf = NULL; soap->z_level = 6; soap->z_dict = NULL; soap->z_dict_len = 0; #endif #ifndef WITH_LEAN soap->wsuid = NULL; soap->c14nexclude = NULL; soap->c14ninclude = NULL; soap->cookies = NULL; soap->cookie_domain = NULL; soap->cookie_path = NULL; soap->cookie_max = 32; #endif #ifdef WMW_RPM_IO soap->rpmreqid = NULL; #endif #ifdef PALM palmNetLibOpen(); #endif #ifndef WITH_NOIDREF soap_init_iht(soap); #endif soap_init_pht(soap); #ifdef WITH_OPENSSL if (!soap_ssl_init_done) soap_ssl_init(); soap->fsslauth = ssl_auth_init; soap->fsslverify = NULL; soap->bio = NULL; soap->ssl = NULL; soap->ctx = NULL; soap->session = NULL; soap->ssl_flags = SOAP_SSL_DEFAULT; soap->keyfile = NULL; soap->keyid = NULL; soap->password = NULL; soap->cafile = NULL; soap->capath = NULL; soap->crlfile = NULL; soap->dhfile = NULL; soap->randfile = NULL; #endif #ifdef WITH_GNUTLS if (!soap_ssl_init_done) soap_ssl_init(); soap->fsslauth = ssl_auth_init; soap->fsslverify = NULL; soap->xcred = NULL; soap->acred = NULL; soap->cache = NULL; soap->session = NULL; soap->ssl_flags = SOAP_SSL_DEFAULT; soap->keyfile = NULL; soap->keyid = NULL; soap->password = NULL; soap->cafile = NULL; soap->capath = NULL; soap->crlfile = NULL; soap->dh_params = NULL; soap->rsa_params = NULL; #endif #ifdef WITH_SYSTEMSSL soap->fsslauth = ssl_auth_init; soap->fsslverify = NULL; soap->bio = NULL; soap->ssl = (gsk_handle)NULL; soap->ctx = (gsk_handle)NULL; soap->session = NULL; soap->ssl_flags = SOAP_SSL_DEFAULT; soap->keyfile = NULL; soap->keyid = NULL; soap->password = NULL; soap->cafile = NULL; soap->capath = NULL; soap->crlfile = NULL; soap->dhfile = NULL; soap->randfile = NULL; #endif soap->c_locale = NULL; soap->buflen = 0; soap->bufidx = 0; #ifndef WITH_LEANER soap->dime.chunksize = 0; soap->dime.buflen = 0; #endif soap->null = 0; soap->position = 0; soap->encoding = 0; soap->mustUnderstand = 0; soap->ns = 0; soap->part = SOAP_END; soap->event = 0; soap->evlev = 0; soap->alloced = 0; soap->count = 0; soap->length = 0; soap->cdata = 0; soap->peeked = 0; soap->ahead = 0; soap->idnum = 0; soap->level = 0; soap->endpoint[0] = '\0'; soap->error = SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_begin(struct soap *soap) { if (soap_check_state(soap)) return; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Reinitializing context\n")); if (!soap->keep_alive) { soap->buflen = 0; soap->bufidx = 0; } soap->null = 0; soap->position = 0; soap->encoding = 0; soap->mustUnderstand = 0; soap->mode = 0; soap->ns = 0; soap->part = SOAP_END; soap->event = 0; soap->evlev = 0; soap->count = 0; soap->length = 0; soap->cdata = 0; soap->error = SOAP_OK; soap->peeked = 0; soap->ahead = 0; soap->idnum = 0; soap->level = 0; soap->endpoint[0] = '\0'; soap->encodingStyle = SOAP_STR_EOS; #ifndef WITH_LEANER soap->dime.chunksize = 0; soap->dime.buflen = 0; #endif soap_free_temp(soap); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_end(struct soap *soap) { if (soap_check_state(soap)) return; soap_free_temp(soap); soap_dealloc(soap, NULL); while (soap->clist) { struct soap_clist *cp = soap->clist->next; SOAP_FREE(soap, soap->clist); soap->clist = cp; } soap_closesock(soap); #ifdef SOAP_DEBUG soap_close_logfiles(soap); #endif #ifdef PALM palmNetLibClose(); #endif } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_set_version(struct soap *soap, short version) { soap_set_local_namespaces(soap); if (soap->version != version && soap->local_namespaces && soap->local_namespaces[0].id && soap->local_namespaces[1].id) { if (version == 1) { soap->local_namespaces[0].ns = soap_env1; soap->local_namespaces[1].ns = soap_enc1; } else if (version == 2) { soap->local_namespaces[0].ns = soap_env2; soap->local_namespaces[1].ns = soap_enc2; } soap->version = version; } if (version == 0) soap->encodingStyle = SOAP_STR_EOS; else soap->encodingStyle = NULL; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_get_version(struct soap *soap) { struct Namespace *p = soap->local_namespaces; if (p) { const char *ns = p[0].out; if (!ns) ns = p[0].ns; if (!strcmp(ns, soap_env1)) { soap->version = 1; /* make sure we use SOAP 1.1 */ if (p[1].out) SOAP_FREE(soap, p[1].out); if ((p[1].out = (char*)SOAP_MALLOC(soap, sizeof(soap_enc1)))) soap_strncpy(p[1].out, sizeof(soap_enc1), soap_enc1, sizeof(soap_enc1) - 1); } else if (!strcmp(ns, soap_env2)) { soap->version = 2; /* make sure we use SOAP 1.2 */ if (p[1].out) SOAP_FREE(soap, p[1].out); if ((p[1].out = (char*)SOAP_MALLOC(soap, sizeof(soap_enc2)))) soap_strncpy(p[1].out, sizeof(soap_enc2), soap_enc2, sizeof(soap_enc2) - 1); } } } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_set_namespaces(struct soap *soap, const struct Namespace *p) { struct Namespace *ns = soap->local_namespaces; struct soap_nlist *np, *nq, *nr; unsigned int level = soap->level; soap->namespaces = p; soap->local_namespaces = NULL; soap_set_local_namespaces(soap); /* reverse the namespace list */ np = soap->nlist; soap->nlist = NULL; if (np) { nq = np->next; np->next = NULL; while (nq) { nr = nq->next; nq->next = np; np = nq; nq = nr; } } /* then push on new stack */ while (np) { const char *s; soap->level = np->level; /* preserve element nesting level */ s = np->ns; if (!s && np->index >= 0 && ns) { s = ns[np->index].out; if (!s) s = ns[np->index].ns; } if (s && soap_push_namespace(soap, np->id, s) == NULL) return soap->error; nq = np; np = np->next; SOAP_FREE(soap, nq); } if (ns) { int i; for (i = 0; ns[i].id; i++) { if (ns[i].out) { SOAP_FREE(soap, ns[i].out); ns[i].out = NULL; } } SOAP_FREE(soap, ns); } soap->level = level; /* restore level */ return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_set_local_namespaces(struct soap *soap) { if (soap->namespaces && !soap->local_namespaces) { const struct Namespace *ns1; struct Namespace *ns2; size_t n = 1; for (ns1 = soap->namespaces; ns1->id; ns1++) n++; n *= sizeof(struct Namespace); ns2 = (struct Namespace*)SOAP_MALLOC(soap, n); if (ns2) { soap_memcpy((void*)ns2, n, (const void*)soap->namespaces, n); if (ns2[0].ns) { if (!strcmp(ns2[0].ns, soap_env1)) soap->version = 1; else if (!strcmp(ns2[0].ns, soap_env2)) soap->version = 2; } soap->local_namespaces = ns2; for (; ns2->id; ns2++) ns2->out = NULL; } } } #endif /******************************************************************************/ #ifndef WITH_LEAN #ifndef PALM_1 SOAP_FMAC1 const char * SOAP_FMAC2 soap_tagsearch(const char *big, const char *little) { if (big && little) { size_t n = strlen(little); const char *s = big; while (s) { const char *t = s; size_t i; for (i = 0; i < n; i++, t++) { if (*t != little[i]) break; } if (*t == '\0' || *t == ' ') { if (i == n || (i && little[i-1] == ':')) return s; } s = strchr(t, ' '); if (s) s++; } } return NULL; } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 struct soap_nlist * SOAP_FMAC2 soap_lookup_ns(struct soap *soap, const char *tag, size_t n) { struct soap_nlist *np; for (np = soap->nlist; np; np = np->next) if (!strncmp(np->id, tag, n) && !np->id[n]) return np; return NULL; } #endif /******************************************************************************/ #ifndef WITH_LEAN static struct soap_nlist * soap_push_ns(struct soap *soap, const char *id, const char *ns, short utilized) { struct soap_nlist *np; size_t n, k; if (soap_tagsearch(soap->c14nexclude, id)) return NULL; if (!utilized) { for (np = soap->nlist; np; np = np->next) { if (!strcmp(np->id, id) && (!np->ns || !strcmp(np->ns, ns))) break; } if (np) { if ((np->level < soap->level || !np->ns) && np->index == 1) utilized = 1; else return NULL; } } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Adding namespace binding (level=%u) '%s' '%s' utilized=%d\n", soap->level, id, ns ? ns : "(null)", utilized)); n = strlen(id); if (ns) k = strlen(ns); else k = 0; np = (struct soap_nlist*)SOAP_MALLOC(soap, sizeof(struct soap_nlist) + n + k + 1); if (!np) { soap->error = SOAP_EOM; return NULL; } np->next = soap->nlist; soap->nlist = np; soap_strcpy((char*)np->id, n + 1, id); if (ns) { np->ns = np->id + n + 1; soap_strcpy((char*)np->ns, k + 1, ns); } else np->ns = NULL; np->level = soap->level; np->index = utilized; return np; } #endif /******************************************************************************/ #ifndef WITH_LEAN static void soap_utilize_ns(struct soap *soap, const char *tag) { struct soap_nlist *np; size_t n = 0; const char *t = strchr(tag, ':'); if (t) n = t - tag; np = soap_lookup_ns(soap, tag, n); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Utilizing namespace of '%s'\n", tag)); if (np) { if (np->index <= 0) { if (np->level == soap->level) np->index = 1; else soap_push_ns(soap, np->id, np->ns, 1); } } else if (n && strncmp(tag, "xml", 3)) { soap_strncpy(soap->tmpbuf, sizeof(soap->tmpbuf), tag, n); soap_push_ns(soap, soap->tmpbuf, NULL, 1); } } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_element(struct soap *soap, const char *tag, int id, const char *type) { #ifndef WITH_LEAN const char *s; #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element begin tag='%s' level='%u' id='%d' type='%s'\n", tag, soap->level, id, type ? type : SOAP_STR_EOS)); soap->level++; #ifdef WITH_DOM #ifndef WITH_LEAN if (soap_tagsearch(soap->wsuid, tag)) { size_t i; for (s = tag, i = 0; *s && i < sizeof(soap->tag) - 1; s++, i++) soap->tag[i] = *s == ':' ? '-' : *s; soap->tag[i] = '\0'; if (soap_set_attr(soap, "wsu:Id", soap->tag, 1)) return soap->error; } if ((soap->mode & SOAP_XML_CANONICAL) && !(soap->mode & SOAP_DOM_ASIS)) { if (soap->evlev >= soap->level) soap->evlev = 0; if (soap->event == SOAP_SEC_BEGIN && !soap->evlev) { struct soap_nlist *np; /* non-nested wsu:Id found: clear xmlns, re-emit them for exc-c14n */ for (np = soap->nlist; np; np = np->next) { int p = soap_tagsearch(soap->c14ninclude, np->id) != NULL; if (np->index == 2 || p) { struct soap_nlist *np1 = soap_push_ns(soap, np->id, np->ns, 1); if (np1 && !p) np1->index = 0; } } soap->evlev = soap->level; } } #endif if (soap->mode & SOAP_XML_DOM) { struct soap_dom_element *elt = (struct soap_dom_element*)soap_malloc(soap, sizeof(struct soap_dom_element)); if (!elt) return soap->error; elt->soap = soap; elt->next = NULL; elt->prnt = soap->dom; elt->elts = NULL; elt->atts = NULL; elt->nstr = NULL; elt->name = soap_strdup(soap, tag); elt->lead = NULL; elt->text = NULL; elt->code = NULL; elt->tail = NULL; elt->node = NULL; elt->type = 0; if (soap->dom) { struct soap_dom_element *p = soap->dom->elts; if (p) { while (p->next) p = p->next; p->next = elt; } else soap->dom->elts = elt; } soap->dom = elt; } else { #endif #ifndef WITH_LEAN if (!soap->ns) { if (!(soap->mode & SOAP_XML_CANONICAL) && soap_send(soap, soap->prolog)) return soap->error; } else if (soap->mode & SOAP_XML_INDENT) { if (soap->ns == 1 && soap_send_raw(soap, soap_indent, soap->level < sizeof(soap_indent) ? soap->level : sizeof(soap_indent) - 1)) return soap->error; soap->body = 1; } if ((soap->mode & SOAP_XML_DEFAULTNS)) { struct Namespace *ns = soap->local_namespaces; size_t n = 0; s = strchr(tag, ':'); if (s) n = s++ - tag; else s = tag; if (soap_send_raw(soap, "<", 1) || soap_send(soap, s)) return soap->error; if (n) { if (soap->nlist && !strncmp(soap->nlist->id, tag, n) && !soap->nlist->id[n]) ns = NULL; for (; ns && ns->id; ns++) { if (*ns->id && ns->ns && !strncmp(ns->id, tag, n) && !ns->id[n]) { soap_push_ns(soap, ns->id, ns->out ? ns->out : ns->ns, 0); if (soap_attribute(soap, "xmlns", ns->out ? ns->out : ns->ns)) return soap->error; break; } } } else if (!soap->nlist || *soap->nlist->id) { soap_push_ns(soap, "", "", 0); if (soap_attribute(soap, "xmlns", "")) return soap->error; } } else #endif if (soap_send_raw(soap, "<", 1) || soap_send(soap, tag)) return soap->error; #ifdef WITH_DOM } #endif if (!soap->ns) { struct Namespace *ns = soap->local_namespaces; int k = -1; if (ns) { #ifndef WITH_LEAN if ((soap->mode & SOAP_XML_DEFAULTNS)) { if (soap->version) k = 4; /* first four required entries */ else if (!(soap->mode & SOAP_XML_NOTYPE) || (soap->mode & SOAP_XML_NIL)) { ns += 2; k = 2; /* next two entries */ } else k = 0; /* no entries */ } #endif while (k-- && ns->id) { const char *t = ns->out; if (!t) t = ns->ns; if (*ns->id && t && *t) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), strlen(ns->id) + 6), "xmlns:%s", ns->id); if (soap_attribute(soap, soap->tmpbuf, t)) return soap->error; } ns++; } } } soap->ns = 1; /* namespace table control: ns = 0 or 2 to start, then 1 to stop dumping the table */ #ifndef WITH_LEAN if ((soap->mode & SOAP_XML_CANONICAL)) soap_utilize_ns(soap, tag); #endif if (id > 0) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), sizeof(SOAP_BASEREFNAME) + 20), SOAP_BASEREFNAME "%d", id); if (soap->version == 2) { if (soap_attribute(soap, "SOAP-ENC:id", soap->tmpbuf)) return soap->error; } else if (soap_attribute(soap, "id", soap->tmpbuf)) return soap->error; } if (type && *type && !(soap->mode & SOAP_XML_NOTYPE) && soap->part != SOAP_IN_HEADER) { const char *t = type; #ifndef WITH_LEAN if (soap->mode & SOAP_XML_DEFAULTNS) { t = strchr(type, ':'); if (t) t++; else t = type; } else if ((soap->mode & SOAP_XML_CANONICAL)) soap_utilize_ns(soap, type); #endif if (soap->attributes ? soap_set_attr(soap, "xsi:type", t, 1) : soap_attribute(soap, "xsi:type", t)) return soap->error; } if (soap->null && soap->position > 0 && soap->version == 1) { int i; (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf) - 1, 20), "[%d", soap->positions[0]); for (i = 1; i < soap->position; i++) { size_t l = strlen(soap->tmpbuf); (SOAP_SNPRINTF(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l - 1, 20), ",%d", soap->positions[i]); } soap_strncat(soap->tmpbuf, sizeof(soap->tmpbuf), "]", 1); if (soap_attribute(soap, "SOAP-ENC:position", soap->tmpbuf)) return soap->error; } if (soap->mustUnderstand) { if (soap->actor && *soap->actor) { if (soap_attribute(soap, soap->version == 2 ? "SOAP-ENV:role" : "SOAP-ENV:actor", soap->actor)) return soap->error; } if (soap_attribute(soap, "SOAP-ENV:mustUnderstand", soap->version == 2 ? "true" : "1")) return soap->error; soap->mustUnderstand = 0; } if (soap->encoding) { if (soap->encodingStyle && soap->local_namespaces && soap->local_namespaces[0].id && soap->local_namespaces[1].id) { if (!*soap->encodingStyle) { if (soap->local_namespaces[1].out) soap->encodingStyle = soap->local_namespaces[1].out; else soap->encodingStyle = soap->local_namespaces[1].ns; } if (soap->encodingStyle && soap_attribute(soap, "SOAP-ENV:encodingStyle", soap->encodingStyle)) return soap->error; } else soap->encodingStyle = NULL; soap->encoding = 0; } soap->null = 0; soap->position = 0; if (soap->event == SOAP_SEC_BEGIN) soap->event = 0; return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_element_begin_out(struct soap *soap, const char *tag, int id, const char *type) { if (*tag == '-') return SOAP_OK; if (soap_element(soap, tag, id, type)) return soap->error; #ifdef WITH_DOM if (soap_element_start_end_out(soap, NULL)) return soap->error; if (soap->feltbegout) return soap->error = soap->feltbegout(soap, tag); return SOAP_OK; #else return soap_element_start_end_out(soap, NULL); #endif } #endif /******************************************************************************/ #ifndef PALM_2 #ifndef HAVE_STRRCHR SOAP_FMAC1 char* SOAP_FMAC2 soap_strrchr(const char *s, int t) { char *r = NULL; while (*s) if (*s++ == t) r = (char*)s - 1; return r; } #endif #endif /******************************************************************************/ #ifndef PALM_2 #ifndef HAVE_STRTOL SOAP_FMAC1 long SOAP_FMAC2 soap_strtol(const char *s, char **t, int b) { long n = 0; int c; while (*s > 0 && *s <= 32) s++; if (b == 10) { short neg = 0; if (*s == '-') { s++; neg = 1; } else if (*s == '+') s++; while ((c = *s) && c >= '0' && c <= '9') { if (n >= 214748364 && (n > 214748364 || c >= '8')) { if (neg && n == 214748364 && c == '8') { if (t) *t = (char*)(s + 1); return -2147483648; } break; } n *= 10; n += c - '0'; s++; } if (neg) n = -n; } else /* assume b == 16 and value is always positive */ { while ((c = *s)) { if (c >= '0' && c <= '9') c -= '0'; else if (c >= 'A' && c <= 'F') c -= 'A' - 10; else if (c >= 'a' && c <= 'f') c -= 'a' - 10; if (n > 0x07FFFFFF) break; n <<= 4; n += c; s++; } } if (t) *t = (char*)s; return n; } #endif #endif /******************************************************************************/ #ifndef PALM_2 #ifndef HAVE_STRTOUL SOAP_FMAC1 unsigned long SOAP_FMAC2 soap_strtoul(const char *s, char **t, int b) { unsigned long n = 0; int c; while (*s > 0 && *s <= 32) s++; if (b == 10) { if (*s == '+') s++; while ((c = *s) && c >= '0' && c <= '9') { if (n >= 429496729 && (n > 429496729 || c >= '6')) break; n *= 10; n += c - '0'; s++; } } else /* b == 16 */ { while ((c = *s)) { if (c >= '0' && c <= '9') c -= '0'; else if (c >= 'A' && c <= 'F') c -= 'A' - 10; else if (c >= 'a' && c <= 'f') c -= 'a' - 10; if (n > 0x0FFFFFFF) break; n <<= 4; n += c; s++; } } if (t) *t = (char*)s; return n; } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_array_begin_out(struct soap *soap, const char *tag, int id, const char *type, const char *offset) { if (!type || !*type || soap->version == 0) return soap_element_begin_out(soap, tag, id, NULL); if (soap_element(soap, tag, id, NULL)) return soap->error; if (soap->version == 1) { if (offset && soap_attribute(soap, "SOAP-ENC:offset", offset)) return soap->error; if (soap_attribute(soap, "SOAP-ENC:arrayType", type)) return soap->error; } else { const char *s; s = soap_strrchr(type, '['); if (s && (size_t)(s - type) < sizeof(soap->tmpbuf)) { soap_strncpy(soap->tmpbuf, sizeof(soap->tmpbuf), type, s - type); if (soap_attribute(soap, "SOAP-ENC:itemType", soap->tmpbuf)) return soap->error; s++; if (*s) { soap_strcpy(soap->tmpbuf, sizeof(soap->tmpbuf), s); soap->tmpbuf[strlen(soap->tmpbuf) - 1] = '\0'; if (soap_attribute(soap, "SOAP-ENC:arraySize", soap->tmpbuf)) return soap->error; } } } #ifndef WITH_LEAN if ((soap->mode & SOAP_XML_CANONICAL)) soap_utilize_ns(soap, type); #endif return soap_element_start_end_out(soap, NULL); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_element_start_end_out(struct soap *soap, const char *tag) { struct soap_attribute *tp; #ifndef WITH_LEAN if ((soap->mode & SOAP_XML_CANONICAL)) { struct soap_nlist *np; for (tp = soap->attributes; tp; tp = tp->next) { if (tp->visible && *tp->name) soap_utilize_ns(soap, tp->name); } for (np = soap->nlist; np; np = np->next) { if (np->ns && (np->index == 1 || (np->index == 0 && soap->event == SOAP_SEC_BEGIN && soap_tagsearch(soap->c14ninclude, np->id)))) { if (*(np->id)) (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), strlen(np->id) + 6), "xmlns:%s", np->id); else soap_strcpy(soap->tmpbuf, sizeof(soap->tmpbuf), "xmlns"); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Enabling utilized binding (level=%u) %s='%s' c14ninclude='%s'\n", np->level, soap->tmpbuf, np->ns, soap->c14ninclude ? soap->c14ninclude : "(null)")); soap_set_attr(soap, soap->tmpbuf, np->ns, 1); np->index = 2; } else { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Binding (level=%u) %s='%s' utilized=%d\n", np->level, np->id, np->ns, np->index)); } } } #endif #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { struct soap_dom_attribute **att; att = &soap->dom->atts; for (tp = soap->attributes; tp; tp = tp->next) { if (tp->visible) { *att = (struct soap_dom_attribute*)soap_malloc(soap, sizeof(struct soap_dom_attribute)); if (!*att) return soap->error; (*att)->next = NULL; (*att)->nstr = NULL; (*att)->name = soap_strdup(soap, tp->name); (*att)->text = soap_strdup(soap, tp->value); (*att)->soap = soap; att = &(*att)->next; tp->visible = 0; } } return SOAP_OK; } #endif for (tp = soap->attributes; tp; tp = tp->next) { if (tp->visible) { #ifndef WITH_LEAN const char *s; if ((soap->mode & SOAP_XML_DEFAULTNS) && (s = strchr(tp->name, ':'))) { size_t n = s - tp->name; if (soap->nlist && !strncmp(soap->nlist->id, tp->name, n) && !soap->nlist->id[n]) s++; else s = tp->name; if (soap_send_raw(soap, " ", 1) || soap_send(soap, s)) return soap->error; } else #endif if (soap_send_raw(soap, " ", 1) || soap_send(soap, tp->name)) return soap->error; if (tp->visible == 2 && tp->value) { if (soap_send_raw(soap, "=\"", 2) || soap_string_out(soap, tp->value, tp->flag) || soap_send_raw(soap, "\"", 1)) return soap->error; } else if (soap->mode & SOAP_XML_STRICT) { if (soap_send_raw(soap, "=\"\"", 3)) return soap->error; } tp->visible = 0; } } if (tag) { #ifndef WITH_LEAN if ((soap->mode & SOAP_XML_CANONICAL)) { if (soap_send_raw(soap, ">", 1) || soap_element_end_out(soap, tag)) return soap->error; return SOAP_OK; } #endif if (soap->nlist) soap_pop_namespace(soap); soap->level--; /* decrement level just before /> */ soap->body = 0; return soap_send_raw(soap, "/>", 2); } return soap_send_raw(soap, ">", 1); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_element_end_out(struct soap *soap, const char *tag) { #ifndef WITH_LEAN const char *s; #endif if (*tag == '-') return SOAP_OK; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element ending tag='%s'\n", tag)); #ifdef WITH_DOM if (soap->feltendout && (soap->error = soap->feltendout(soap, tag))) return soap->error; if ((soap->mode & SOAP_XML_DOM) && soap->dom) { if (soap->dom->prnt) soap->dom = soap->dom->prnt; return SOAP_OK; } #endif #ifndef WITH_LEAN if (soap->nlist) soap_pop_namespace(soap); if (soap->mode & SOAP_XML_INDENT) { if (!soap->body) { if (soap_send_raw(soap, soap_indent, soap->level < sizeof(soap_indent) ? soap->level : sizeof(soap_indent) - 1)) return soap->error; } soap->body = 0; } if ((soap->mode & SOAP_XML_DEFAULTNS) && (s = strchr(tag, ':'))) tag = s + 1; #endif if (soap_send_raw(soap, "error; soap->level--; /* decrement level just before > */ return soap_send_raw(soap, ">", 1); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_element_ref(struct soap *soap, const char *tag, int id, int href) { const char *s = "ref"; int n = 1; if (soap->version == 1) { s = "href"; n = 0; } else if (soap->version == 2) s = "SOAP-ENC:ref"; (SOAP_SNPRINTF(soap->href, sizeof(soap->href), sizeof(SOAP_BASEREFNAME) + 21), "#" SOAP_BASEREFNAME "%d", href); return soap_element_href(soap, tag, id, s, soap->href + n); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_element_href(struct soap *soap, const char *tag, int id, const char *ref, const char *val) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element '%s' reference %s='%s'\n", tag, ref, val)); if (soap_element(soap, tag, id, NULL) || soap_attribute(soap, ref, val) || soap_element_start_end_out(soap, tag)) return soap->error; soap->body = 0; return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_element_null(struct soap *soap, const char *tag, int id, const char *type) { struct soap_attribute *tp = NULL; for (tp = soap->attributes; tp; tp = tp->next) if (tp->visible) break; if (tp || (soap->version == 2 && soap->position > 0) || id > 0 || (soap->mode & SOAP_XML_NIL)) { if (soap_element(soap, tag, id, type) || (!tp && soap_attribute(soap, "xsi:nil", "true")) || soap_element_start_end_out(soap, tag)) return soap->error; soap->body = 0; } else { soap->null = 1; soap->position = 0; soap->mustUnderstand = 0; } return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_element_nil(struct soap *soap, const char *tag) { if (soap_element(soap, tag, -1, NULL) || (soap_attribute(soap, "xsi:nil", "true"))) return soap->error; return soap_element_start_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_element_id(struct soap *soap, const char *tag, int id, const void *p, const void *a, int n, const char *type, int t, char **mark) { (void)a; (void)n; if (!p) { soap->error = soap_element_null(soap, tag, id, type); return -1; } #ifndef WITH_NOIDREF DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element_id %p type=%d id=%d\n", p, t, id)); if ((!soap->encodingStyle && !(soap->omode & SOAP_XML_GRAPH)) || (soap->omode & SOAP_XML_TREE)) return soap_check_and_mark(soap, p, t, mark); if (mark) *mark = NULL; if (id < -1) return soap_embed(soap, p, a, n, t); else if (id <= 0) { struct soap_plist *pp; if (a) id = soap_array_pointer_lookup(soap, p, a, n, t, &pp); else id = soap_pointer_lookup(soap, p, t, &pp); if (id) { if (soap_is_embedded(soap, pp)) { soap_element_ref(soap, tag, 0, id); return -1; } if (soap_is_single(soap, pp)) return 0; soap_set_embedded(soap, pp); } } return id; #else return soap_check_and_mark(soap, p, t, mark); #endif } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_check_and_mark(struct soap *soap, const void *p, int t, char **mark) { if (mark) { struct soap_plist *pp; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Check %p and mark %p\n", p, mark)); if (!soap_pointer_lookup(soap, p, t, &pp)) if (!soap_pointer_enter(soap, p, NULL, 0, t, &pp)) return -1; if (soap->mode & SOAP_IO_LENGTH) { if (pp->mark1 > 0) return -1; pp->mark1 = 1; *mark = &pp->mark1; } else { if (pp->mark2 > 0) return -1; pp->mark2 = 1; *mark = &pp->mark2; } } return 0; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void * SOAP_FMAC2 soap_mark_lookup(struct soap *soap, const void *p, int t, struct soap_plist **ppp, char **mark) { if (!soap) return NULL; if (mark || !(soap->mode & SOAP_XML_TREE)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Mark lookup %p type %d\n", p, t)); if (!soap_pointer_lookup(soap, p, t, ppp)) { if (!soap_pointer_enter(soap, p, NULL, 0, t, ppp)) return NULL; } else if (!(soap->mode & SOAP_XML_TREE)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Mark found %p\n", (*ppp)->dup)); return (*ppp)->dup; } if (mark) { if ((*ppp)->mark1 > 0) (*ppp)->mark1 = 2; /* cycle */ else (*ppp)->mark1 = 1; /* cycle detection */ *mark = &(*ppp)->mark1; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Mark cycle %d\n", (*ppp)->mark1)); } } return NULL; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_mark_cycle(struct soap *soap, struct soap_plist *pp) { (void)soap; return pp && pp->mark1 == 2 && (soap->mode & SOAP_XML_TREE); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_mark_dup(struct soap *soap, void *a, struct soap_plist *pp) { (void)soap; if (pp) pp->dup = a; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_unmark(struct soap *soap, char *mark) { (void)soap; if (mark) *mark = 0; /* release detection */ } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_element_result(struct soap *soap, const char *tag) { if (soap->version == 2 && soap->encodingStyle) { if (soap_element(soap, "SOAP-RPC:result", 0, NULL) || soap_attribute(soap, "xmlns:SOAP-RPC", soap_rpc) || soap_element_start_end_out(soap, NULL) || soap_string_out(soap, tag, 0) || soap_element_end_out(soap, "SOAP-RPC:result")) return soap->error; } return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_check_result(struct soap *soap, const char *tag) { (void)tag; if (soap->version == 2 && soap->encodingStyle) { soap_instring(soap, ":result", NULL, NULL, 0, 2, -1, -1, NULL); /* just ignore content for compliance reasons, but should compare tag to element's QName value? */ } } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_attribute(struct soap *soap, const char *name, const char *value) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Attribute '%s'='%s'\n", name, value)); #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && !(soap->mode & SOAP_XML_CANONICAL) && soap->dom) { struct soap_dom_attribute *a = (struct soap_dom_attribute*)soap_malloc(soap, sizeof(struct soap_dom_attribute)); if (!a) return soap->error; a->next = soap->dom->atts; a->nstr = NULL; a->name = soap_strdup(soap, name); a->text = soap_strdup(soap, value); a->soap = soap; soap->dom->atts = a; return SOAP_OK; } #endif #ifndef WITH_LEAN if ((soap->mode & SOAP_XML_CANONICAL)) { /* push namespace */ if (!strncmp(name, "xmlns", 5) && (name[5] == ':' || name[5] == '\0')) soap_push_ns(soap, name + 5 + (name[5] == ':'), value, 0); else if (soap_set_attr(soap, name, value, 1)) return soap->error; } else #endif { if (soap_send_raw(soap, " ", 1) || soap_send(soap, name)) return soap->error; if (value) if (soap_send_raw(soap, "=\"", 2) || soap_string_out(soap, value, 1) || soap_send_raw(soap, "\"", 1)) return soap->error; } return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_element_begin_in(struct soap *soap, const char *tag, int nillable, const char *type) { if (!soap_peek_element(soap)) { if (soap->other) return soap->error = SOAP_TAG_MISMATCH; if (tag && *tag == '-') return SOAP_OK; if (!(soap->error = soap_match_tag(soap, soap->tag, tag))) { soap->peeked = 0; if (type && *soap->type && soap_match_tag(soap, soap->type, type)) return soap->error = SOAP_TYPE; if (!nillable && soap->null && (soap->mode & SOAP_XML_STRICT)) return soap->error = SOAP_NULL; if (soap->body) soap->level++; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Begin tag found (level=%u) '%s'='%s'\n", soap->level, soap->tag, tag ? tag : SOAP_STR_EOS )); soap->error = SOAP_OK; } } else if (soap->error == SOAP_NO_TAG && tag && *tag == '-') soap->error = SOAP_OK; return soap->error; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_element_end_in(struct soap *soap, const char *tag) { soap_wchar c; char *s; int n = 0; if (tag && *tag == '-') return SOAP_OK; if (soap->error == SOAP_NO_TAG) soap->error = SOAP_OK; #ifdef WITH_DOM /* this whitespace or mixed content is significant for DOM as-is */ if ((soap->mode & SOAP_XML_DOM) && soap->dom) { if (!soap->peeked && !soap_string_in(soap, -1, -1, -1, NULL)) return soap->error; if (soap->dom->prnt) soap->dom = soap->dom->prnt; } #endif if (soap->peeked) { if (*soap->tag) n++; soap->peeked = 0; } do { while (((c = soap_get(soap)) != SOAP_TT)) { if ((int)c == EOF) return soap->error = SOAP_CHK_EOF; if (c == SOAP_LT) n++; else if (c == '/') { c = soap_get(soap); if (c == SOAP_GT) n--; else soap_unget(soap, c); } } } while (n--); s = soap->tag; n = sizeof(soap->tag); while (soap_notblank(c = soap_get(soap))) { if (--n > 0) *s++ = (char)c; } *s = '\0'; if ((int)c == EOF) return soap->error = SOAP_CHK_EOF; while (soap_blank(c)) c = soap_get(soap); if (c != SOAP_GT) return soap->error = SOAP_SYNTAX_ERROR; #ifndef WITH_LEAN #ifdef WITH_DOM if (soap->feltendin) { soap->level--; return soap->error = soap->feltendin(soap, soap->tag, tag); } #endif if (tag && (soap->mode & SOAP_XML_STRICT)) { soap_pop_namespace(soap); if (soap_match_tag(soap, soap->tag, tag)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End tag '%s' does not match '%s'\n", soap->tag, tag ? tag : SOAP_STR_EOS)); return soap->error = SOAP_SYNTAX_ERROR; } } #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End tag found (level=%u) '%s'='%s'\n", soap->level, soap->tag, tag ? tag : SOAP_STR_EOS)); soap->level--; return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char * SOAP_FMAC2 soap_attr_value(struct soap *soap, const char *name, int flag) { struct soap_attribute *tp; if (*name == '-') return SOAP_STR_EOS; for (tp = soap->attributes; tp; tp = tp->next) { if (!soap_match_tag(soap, tp->name, name)) break; } if (tp && tp->visible == 2) { if (flag == 4 || (flag == 2 && (soap->mode & SOAP_XML_STRICT))) soap->error = SOAP_PROHIBITED; else return tp->value; } else if (flag == 3 || (flag == 1 && (soap->mode & SOAP_XML_STRICT))) soap->error = SOAP_REQUIRED; else soap->error = SOAP_OK; return NULL; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_set_attr(struct soap *soap, const char *name, const char *value, int flag) { struct soap_attribute *tp, *tq; if (*name == '-') return SOAP_OK; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Set attribute %s='%s'\n", name, value ? value : SOAP_STR_EOS)); tq = NULL; for (tp = soap->attributes; tp; tq = tp, tp = tp->next) { if (!strcmp(tp->name, name)) break; } if (!tp) { size_t l = strlen(name); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Allocate attribute %s\n", name)); if (!(tp = (struct soap_attribute*)SOAP_MALLOC(soap, sizeof(struct soap_attribute) + l))) return soap->error = SOAP_EOM; tp->ns = NULL; #ifndef WITH_LEAN if ((soap->mode & SOAP_XML_CANONICAL)) { struct soap_attribute **tpp = &soap->attributes; const char *s = strchr(name, ':'); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inserting attribute %s for c14n\n", name)); if (!strncmp(name, "xmlns", 5)) { for (; *tpp; tpp = &(*tpp)->next) if (strncmp((*tpp)->name, "xmlns", 5) || strcmp((*tpp)->name + 5, name + 5) > 0) break; } else if (!s) { for (; *tpp; tpp = &(*tpp)->next) if (strncmp((*tpp)->name, "xmlns", 5) && ((*tpp)->ns || strcmp((*tpp)->name, name) > 0)) break; } else { struct soap_nlist *np = soap_lookup_ns(soap, name, s - name); if (np) tp->ns = np->ns; else { struct soap_attribute *tq; for (tq = soap->attributes; tq; tq = tq->next) { if (!strncmp(tq->name, "xmlns:", 6) && !strncmp(tq->name + 6, name, s - name) && !tq->name[6 + s - name]) { tp->ns = tq->ns; break; } } } for (; *tpp; tpp = &(*tpp)->next) { int k; if (strncmp((*tpp)->name, "xmlns", 5) && (*tpp)->ns && tp->ns && ((k = strcmp((*tpp)->ns, tp->ns)) > 0 || (!k && strcmp((*tpp)->name, name) > 0))) break; } } tp->next = *tpp; *tpp = tp; } else #endif if (tq) { tq->next = tp; tp->next = NULL; } else { tp->next = soap->attributes; soap->attributes = tp; } soap_strcpy((char*)tp->name, l + 1, name); tp->value = NULL; } else if (tp->visible) { return SOAP_OK; } else if (value && tp->value && tp->size <= strlen(value)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free attribute value of %s (free %p)\n", name, tp->value)); SOAP_FREE(soap, tp->value); tp->value = NULL; tp->ns = NULL; } if (value) { if (!tp->value) { tp->size = strlen(value) + 1; if (!(tp->value = (char*)SOAP_MALLOC(soap, tp->size))) return soap->error = SOAP_EOM; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Allocate attribute value for %s (%p)\n", tp->name, tp->value)); } soap_strcpy(tp->value, tp->size, value); if (!strncmp(tp->name, "xmlns:", 6)) tp->ns = tp->value; tp->visible = 2; tp->flag = (short)flag; #ifndef WITH_LEAN if (!strcmp(name, "wsu:Id")) { soap->event = SOAP_SEC_BEGIN; soap_strcpy(soap->id, sizeof(soap->id), value); } if ((soap->mode & SOAP_XML_CANONICAL)) { const char *s = strchr(name, ':'); if (s) /* should also check default namespace when 'type' is not qualified? */ { struct soap_nlist *np = soap_lookup_ns(soap, name, s - name); if (np && np->ns && soap->local_namespaces) { if ((!strcmp(s + 1, "type") && !strcmp(np->ns, soap->local_namespaces[2].ns)) /* xsi:type QName */ || ((!strcmp(s + 1, "arrayType") || !strcmp(s + 1, "itemType")) && !strcmp(np->ns, soap->local_namespaces[1].ns))) /* SOAP-ENC:arrayType and SOAP-ENC:itemType QName */ soap_utilize_ns(soap, value); } } } #endif } else tp->visible = 1; return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_clr_attr(struct soap *soap) { struct soap_attribute *tp; #ifndef WITH_LEAN if ((soap->mode & SOAP_XML_CANONICAL)) { while (soap->attributes) { tp = soap->attributes->next; if (soap->attributes->value) SOAP_FREE(soap, soap->attributes->value); SOAP_FREE(soap, soap->attributes); soap->attributes = tp; } } else #endif { for (tp = soap->attributes; tp; tp = tp->next) tp->visible = 0; } } #endif /******************************************************************************/ #ifndef PALM_2 static int soap_getattrval(struct soap *soap, char *s, size_t *n, soap_wchar d) { char buf[8]; size_t i; size_t k = *n; size_t m = 0; char *t = buf; for (i = 0; i < k; i++) { soap_wchar c; if (m) { *s++ = *t++; m--; continue; } if ((soap->mode & SOAP_C_UTFSTRING)) { if (((c = soap_get(soap)) & 0x80000000) && c >= -0x7FFFFF80 && c < SOAP_AP) { t = buf; c &= 0x7FFFFFFF; if (c < 0x0800) *t++ = (char)(0xC0 | ((c >> 6) & 0x1F)); else { if (c < 0x010000) *t++ = (char)(0xE0 | ((c >> 12) & 0x0F)); else { if (c < 0x200000) *t++ = (char)(0xF0 | ((c >> 18) & 0x07)); else { if (c < 0x04000000) *t++ = (char)(0xF8 | ((c >> 24) & 0x03)); else { *t++ = (char)(0xFC | ((c >> 30) & 0x01)); *t++ = (char)(0x80 | ((c >> 24) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 18) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 12) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 6) & 0x3F)); } *t++ = (char)(0x80 | (c & 0x3F)); m = t - buf - 1; if (i + m >= k) { soap_unget(soap, c | 0x80000000); *n = i; return soap->error = SOAP_EOM; } t = buf; *s++ = *t++; continue; } } else c = soap_getutf8(soap); switch (c) { case SOAP_TT: *s++ = '<'; soap_unget(soap, '/'); break; case SOAP_LT: *s++ = '<'; break; case SOAP_GT: if (d == ' ') { soap_unget(soap, c); *s = '\0'; *n = i + 1; return SOAP_OK; } *s++ = '>'; break; case SOAP_QT: if (c == d) { *s = '\0'; *n = i + 1; return SOAP_OK; } *s++ = '"'; break; case SOAP_AP: if (c == d) { *s = '\0'; *n = i + 1; return SOAP_OK; } *s++ = '\''; break; case '\t': case '\n': case '\r': case ' ': case '/': if (d == ' ') { soap_unget(soap, c); *s = '\0'; *n = i + 1; return SOAP_OK; } *s++ = (char)c; break; default: if ((int)c == EOF) { *s = '\0'; *n = i + 1; return soap->error = SOAP_CHK_EOF; } *s++ = (char)c; } } return soap->error = SOAP_EOM; } #endif /******************************************************************************/ #ifdef WITH_FAST #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_store_lab(struct soap *soap, const char *s, size_t n) { soap->labidx = 0; return soap_append_lab(soap, s, n); } #endif #endif /******************************************************************************/ #ifdef WITH_FAST #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_append_lab(struct soap *soap, const char *s, size_t n) { if (soap->labidx + n >= soap->lablen) { char *t = soap->labbuf; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Enlarging look-aside buffer to append data, size=%lu\n", (unsigned long)soap->lablen)); if (soap->lablen == 0) soap->lablen = SOAP_LABLEN; while (soap->labidx + n >= soap->lablen) soap->lablen <<= 1; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "New look-aside buffer size=%lu\n", (unsigned long)soap->lablen)); soap->labbuf = (char*)SOAP_MALLOC(soap, soap->lablen); if (!soap->labbuf) { if (t) SOAP_FREE(soap, t); return soap->error = SOAP_EOM; } if (t) { soap_memcpy((void*)soap->labbuf, soap->lablen, (const void*)t, soap->labidx); SOAP_FREE(soap, t); } } if (s) { soap_memcpy((void*)(soap->labbuf + soap->labidx), soap->lablen - soap->labidx, (const void*)s, n); soap->labidx += n; } return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_peek_element(struct soap *soap) { #ifdef WITH_DOM struct soap_dom_attribute **att = NULL; char *lead = NULL; #endif struct soap_attribute *tp, *tq = NULL; const char *t; char *s; soap_wchar c; int i; if (soap->peeked) { if (!*soap->tag) return soap->error = SOAP_NO_TAG; return SOAP_OK; } soap->peeked = 1; soap->id[0] = '\0'; soap->href[0] = '\0'; soap->type[0] = '\0'; soap->arrayType[0] = '\0'; soap->arraySize[0] = '\0'; soap->arrayOffset[0] = '\0'; soap->other = 0; soap->root = -1; soap->position = 0; soap->null = 0; soap->mustUnderstand = 0; /* UTF-8 BOM? */ c = soap_getchar(soap); if (c == 0xEF && soap_get0(soap) == 0xBB) { c = soap_get1(soap); if ((c = soap_get1(soap)) == 0xBF) soap->mode &= ~SOAP_ENC_LATIN; else soap_unget(soap, (0x0F << 12) | (0xBB << 6) | (c & 0x3F)); /* UTF-8 */ } else if ((c == 0xFE && soap_get0(soap) == 0xFF) /* UTF-16 BE */ || (c == 0xFF && soap_get0(soap) == 0xFE)) /* UTF-16 LE */ return soap->error = SOAP_UTF_ERROR; else soap_unget(soap, c); c = soap_get(soap); #ifdef WITH_DOM /* whitespace leading up to the start tag is significant for DOM as-is (but comments and PIs are removed from this lead) */ if (soap_blank(c)) { soap->labidx = 0; do { if (soap_append_lab(soap, NULL, 0)) return soap->error; s = soap->labbuf + soap->labidx; i = soap->lablen - soap->labidx; soap->labidx = soap->lablen; while (soap_blank(c) && i--) { *s++ = c; c = soap_get(soap); } } while (soap_blank(c)); *s = '\0'; lead = soap->labbuf; } #else /* skip space */ while (soap_blank(c)) c = soap_get(soap); #endif if (c != SOAP_LT) { *soap->tag = '\0'; if ((int)c == EOF) return soap->error = SOAP_CHK_EOF; soap_unget(soap, c); #ifdef WITH_DOM /* whitespace leading up to the end tag is significant for DOM as-is */ if ((soap->mode & SOAP_XML_DOM) && soap->dom) { if (lead && *lead) soap->dom->tail = soap_strdup(soap, lead); else soap->dom->tail = SOAP_STR_EOS; /* body with closing tag instead of */ } #endif return soap->error = SOAP_NO_TAG; } do c = soap_get1(soap); while (soap_blank(c)); s = soap->tag; i = sizeof(soap->tag); while (c != '>' && c != '/' && soap_notblank(c) && (int)c != EOF) { if (--i > 0) *s++ = (char)c; c = soap_get1(soap); } *s = '\0'; while (soap_blank(c)) c = soap_get1(soap); #ifdef WITH_DOM if (soap->mode & SOAP_XML_DOM) { struct soap_dom_element *elt; elt = (struct soap_dom_element*)soap_malloc(soap, sizeof(struct soap_dom_element)); if (!elt) return soap->error; elt->next = NULL; elt->prnt = soap->dom; elt->elts = NULL; elt->atts = NULL; elt->nstr = NULL; elt->name = soap_strdup(soap, soap->tag); elt->text = NULL; elt->code = NULL; elt->tail = NULL; elt->node = NULL; elt->type = 0; if (lead && *lead) elt->lead = soap_strdup(soap, lead); else elt->lead = NULL; elt->soap = soap; if (soap->dom) { struct soap_dom_element *p = soap->dom->elts; if (p) { while (p->next) p = p->next; p->next = elt; } else soap->dom->elts = elt; } soap->dom = elt; att = &elt->atts; } #endif soap_pop_namespace(soap); for (tp = soap->attributes; tp; tp = tp->next) tp->visible = 0; while ((int)c != EOF && c != '>' && c != '/') { s = soap->tmpbuf; i = sizeof(soap->tmpbuf); while (c != '=' && c != '>' && c != '/' && soap_notblank(c) && (int)c != EOF) { if (--i > 0) *s++ = (char)c; c = soap_get1(soap); } *s = '\0'; if (i == sizeof(soap->tmpbuf)) return soap->error = SOAP_SYNTAX_ERROR; #ifdef WITH_DOM /* add attribute name to dom */ if (att) { *att = (struct soap_dom_attribute*)soap_malloc(soap, sizeof(struct soap_dom_attribute)); if (!*att) return soap->error; (*att)->next = NULL; (*att)->nstr = NULL; (*att)->name = soap_strdup(soap, soap->tmpbuf); (*att)->text = NULL; (*att)->soap = soap; } #endif if (!strncmp(soap->tmpbuf, "xmlns", 5)) { if (soap->tmpbuf[5] == ':') t = soap->tmpbuf + 6; else if (soap->tmpbuf[5]) t = NULL; else t = SOAP_STR_EOS; } else t = NULL; tq = NULL; for (tp = soap->attributes; tp; tq = tp, tp = tp->next) { if (!SOAP_STRCMP(tp->name, soap->tmpbuf)) break; } if (!tp) { size_t l = strlen(soap->tmpbuf); tp = (struct soap_attribute*)SOAP_MALLOC(soap, sizeof(struct soap_attribute) + l); if (!tp) return soap->error = SOAP_EOM; soap_strcpy((char*)tp->name, l + 1, soap->tmpbuf); tp->value = NULL; tp->size = 0; tp->ns = NULL; /* append attribute to the end of the list */ if (tq) { tq->next = tp; tp->next = NULL; } else { tp->next = soap->attributes; soap->attributes = tp; } } while (soap_blank(c)) c = soap_get1(soap); if (c == '=') { size_t k; do c = soap_getutf8(soap); while (soap_blank(c)); if (c != SOAP_QT && c != SOAP_AP) { soap_unget(soap, c); c = ' '; /* blank delimiter */ } k = tp->size; if (soap_getattrval(soap, tp->value, &k, c)) { #ifdef WITH_FAST if (soap->error != SOAP_EOM) return soap->error; soap->error = SOAP_OK; if (soap_store_lab(soap, tp->value, k)) return soap->error; if (tp->value) SOAP_FREE(soap, tp->value); tp->value = NULL; for (;;) { k = soap->lablen - soap->labidx; if (soap_getattrval(soap, soap->labbuf + soap->labidx, &k, c)) { if (soap->error != SOAP_EOM) return soap->error; soap->error = SOAP_OK; soap->labidx = soap->lablen; if (soap_append_lab(soap, NULL, 0)) return soap->error; } else break; } if (soap->labidx) tp->size = soap->lablen; else { tp->size = strlen(soap->labbuf) + 1; if (tp->size < SOAP_LABLEN) tp->size = SOAP_LABLEN; } if (!(tp->value = (char*)SOAP_MALLOC(soap, tp->size))) return soap->error = SOAP_EOM; soap_strcpy(tp->value, tp->size, soap->labbuf); #else tp->size = k; if (soap->error != SOAP_EOM) return soap->error; soap->error = SOAP_OK; if (soap_new_block(soap) == NULL) return soap->error; for (;;) { if (!(s = (char*)soap_push_block(soap, NULL, SOAP_BLKLEN))) return soap->error; k = SOAP_BLKLEN; if (soap_getattrval(soap, s, &k, c)) { if (soap->error != SOAP_EOM) return soap->error; soap->error = SOAP_OK; soap_size_block(soap, NULL, k); } else break; } k = tp->size + soap->blist->size; if (!(s = (char*)SOAP_MALLOC(soap, k))) return soap->error = SOAP_EOM; if (tp->value) { soap_memcpy((void*)s, k, (const void*)tp->value, tp->size); SOAP_FREE(soap, tp->value); } soap_save_block(soap, NULL, s + tp->size, 0); tp->value = s; tp->size = k; #endif } do c = soap_get1(soap); while (soap_blank(c)); tp->visible = 2; /* seen this attribute w/ value */ #ifdef WITH_DOM if (att) (*att)->text = soap_strdup(soap, tp->value); #endif } else tp->visible = 1; /* seen this attribute w/o value */ #ifdef WITH_DOM if (att) att = &(*att)->next; #endif if (t && tp->value) { if (soap_push_namespace(soap, t, tp->value) == NULL) return soap->error; } } #ifdef WITH_DOM if (att) { soap->dom->nstr = soap_current_namespace(soap, soap->tag); for (att = &soap->dom->atts; *att; att = &(*att)->next) (*att)->nstr = soap_current_namespace(soap, (*att)->name); } #endif if ((int)c == EOF) return soap->error = SOAP_CHK_EOF; if (!(soap->body = (c != '/'))) do c = soap_get1(soap); while (soap_blank(c)); #ifdef WITH_DOM if (soap->mode & SOAP_XML_DOM) { if (!soap->body && soap->dom->prnt) soap->dom = soap->dom->prnt; } #endif for (tp = soap->attributes; tp; tp = tp->next) { if (tp->visible && tp->value) { #ifndef WITH_NOIDREF if (!strcmp(tp->name, "id")) { if ((soap->version > 0 && !(soap->imode & SOAP_XML_TREE)) || (soap->mode & SOAP_XML_GRAPH)) { *soap->id = '#'; soap_strcpy(soap->id + 1, sizeof(soap->id) - 1, tp->value); } } else if (!strcmp(tp->name, "href")) { if ((soap->version == 1 && !(soap->imode & SOAP_XML_TREE)) || (soap->mode & SOAP_XML_GRAPH) || ((soap->mode & (SOAP_ENC_MTOM | SOAP_ENC_DIME)) && *tp->value != '#')) soap_strcpy(soap->href, sizeof(soap->href), tp->value); } else if (!strcmp(tp->name, "ref")) { if ((soap->version == 2 && !(soap->imode & SOAP_XML_TREE)) || (soap->mode & SOAP_XML_GRAPH)) { *soap->href = '#'; soap_strcpy(soap->href + (*tp->value != '#'), sizeof(soap->href) - 1, tp->value); } } #else if (!strcmp(tp->name, "href")) { if ((soap->mode & (SOAP_ENC_MTOM | SOAP_ENC_DIME)) && *tp->value != '#') soap_strcpy(soap->href, sizeof(soap->href), tp->value); } #endif else if (!soap_match_tag(soap, tp->name, "xsi:type")) { soap_strcpy(soap->type, sizeof(soap->type), tp->value); } else if ((!soap_match_tag(soap, tp->name, "xsi:null") || !soap_match_tag(soap, tp->name, "xsi:nil")) && (!strcmp(tp->value, "1") || !strcmp(tp->value, "true"))) { soap->null = 1; } else if (!soap_match_tag(soap, tp->name, "SOAP-ENV:encodingStyle")) { if (!soap->encodingStyle) soap->encodingStyle = SOAP_STR_EOS; soap_get_version(soap); } else if (soap->version == 1) { if (!soap_match_tag(soap, tp->name, "SOAP-ENC:arrayType")) { s = soap_strrchr(tp->value, '['); if (s && (size_t)(s - tp->value) < sizeof(soap->arrayType)) { soap_strncpy(soap->arrayType, sizeof(soap->arrayType), tp->value, s - tp->value); soap_strcpy(soap->arraySize, sizeof(soap->arraySize), s); } else soap_strcpy(soap->arrayType, sizeof(soap->arrayType), tp->value); } else if (!soap_match_tag(soap, tp->name, "SOAP-ENC:offset")) soap_strcpy(soap->arrayOffset, sizeof(soap->arrayOffset), tp->value); else if (!soap_match_tag(soap, tp->name, "SOAP-ENC:position")) soap->position = soap_getposition(tp->value, soap->positions); else if (!soap_match_tag(soap, tp->name, "SOAP-ENC:root")) soap->root = ((!strcmp(tp->value, "1") || !strcmp(tp->value, "true"))); else if (!soap_match_tag(soap, tp->name, "SOAP-ENV:mustUnderstand") && (!strcmp(tp->value, "1") || !strcmp(tp->value, "true"))) soap->mustUnderstand = 1; else if (!soap_match_tag(soap, tp->name, "SOAP-ENV:actor")) { if ((!soap->actor || strcmp(soap->actor, tp->value)) && strcmp(tp->value, "http://schemas.xmlsoap.org/soap/actor/next")) soap->other = 1; } } else if (soap->version == 2) { #ifndef WITH_NOIDREF if (!soap_match_tag(soap, tp->name, "SOAP-ENC:id")) { *soap->id = '#'; soap_strcpy(soap->id + 1, sizeof(soap->id) - 1, tp->value); } else if (!soap_match_tag(soap, tp->name, "SOAP-ENC:ref")) { *soap->href = '#'; soap_strcpy(soap->href + (*tp->value != '#'), sizeof(soap->href) - 1, tp->value); } else #endif if (!soap_match_tag(soap, tp->name, "SOAP-ENC:itemType")) soap_strcpy(soap->arrayType, sizeof(soap->arrayType), tp->value); else if (!soap_match_tag(soap, tp->name, "SOAP-ENC:arraySize")) soap_strcpy(soap->arraySize, sizeof(soap->arraySize), tp->value); else if (!soap_match_tag(soap, tp->name, "SOAP-ENV:mustUnderstand") && (!strcmp(tp->value, "1") || !strcmp(tp->value, "true"))) soap->mustUnderstand = 1; else if (!soap_match_tag(soap, tp->name, "SOAP-ENV:role")) { if ((!soap->actor || strcmp(soap->actor, tp->value)) && strcmp(tp->value, "http://www.w3.org/2003/05/soap-envelope/role/next")) soap->other = 1; } } else { if (!soap_match_tag(soap, tp->name, "wsdl:required") && !strcmp(tp->value, "true")) soap->mustUnderstand = 1; } } } #ifdef WITH_DOM if (soap->feltbegin) return soap->error = soap->feltbegin(soap, soap->tag); #endif return soap->error = SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_retry(struct soap *soap) { soap->error = SOAP_OK; soap_revert(soap); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_revert(struct soap *soap) { if (!soap->peeked) { soap->peeked = 1; if (soap->body) soap->level--; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Reverting to last element '%s' (level=%u)\n", soap->tag, soap->level)); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_string_out(struct soap *soap, const char *s, int flag) { const char *t; soap_wchar c; soap_wchar mask = (soap_wchar)0xFFFFFF80UL; #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { soap->dom->text = soap_strdup(soap, s); return SOAP_OK; } #endif if (flag == 2 || (soap->mode & SOAP_C_UTFSTRING)) mask = 0; t = s; while ((c = *t++)) { switch (c) { case 0x09: if (flag) { if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, " ", 5)) return soap->error; s = t; } break; case 0x0A: if (flag || !(soap->mode & SOAP_XML_CANONICAL)) { if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, " ", 5)) return soap->error; s = t; } break; case '&': if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, "&", 5)) return soap->error; s = t; break; case '<': if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, "<", 4)) return soap->error; s = t; break; case '>': if (!flag) { if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, ">", 4)) return soap->error; s = t; } break; case '"': if (flag) { if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, """, 6)) return soap->error; s = t; } break; case 0x7F: if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, "", 6)) return soap->error; s = t; break; default: #ifndef WITH_LEANER #ifdef HAVE_MBTOWC if (soap->mode & SOAP_C_MBSTRING) { wchar_t wc; int m = mbtowc(&wc, t - 1, MB_CUR_MAX); if (m > 0 && !((soap_wchar)wc == c && m == 1 && c < 0x80)) { if (soap_send_raw(soap, s, t - s - 1) || soap_pututf8(soap, (unsigned long)wc)) return soap->error; s = t += m - 1; continue; } } #endif #endif #ifndef WITH_NOSTRINGTOUTF8 if ((c & mask) || !(c & 0xFFFFFFE0UL)) { if (soap_send_raw(soap, s, t - s - 1) || soap_pututf8(soap, (unsigned char)c)) return soap->error; s = t; } #endif } } return soap_send_raw(soap, s, t - s - 1); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 char * SOAP_FMAC2 soap_string_in(struct soap *soap, int flag, long minlen, long maxlen, const char *pattern) { char *s; char *t = NULL; size_t i; long l = 0; int n = 0, f = 0, m = 0; soap_wchar c; #if !defined(WITH_LEANER) && defined(HAVE_WCTOMB) char buf[MB_LEN_MAX > 8 ? MB_LEN_MAX : 8]; #else char buf[8]; #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Reading string content, flag=%d\n", flag)); if (flag <= 0 && soap->peeked && *soap->tag) { #ifndef WITH_LEAN struct soap_attribute *tp; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "String content includes tag '%s' and attributes\n", soap->tag)); t = soap->tmpbuf; *t = '<'; soap_strcpy(t + 1, sizeof(soap->tmpbuf) - 1, soap->tag); t += strlen(t); for (tp = soap->attributes; tp; tp = tp->next) { if (tp->visible) { size_t l = strlen(tp->name); if (t + l + 1 >= soap->tmpbuf + sizeof(soap->tmpbuf)) break; /* too many or attribute values to large */ *t++ = ' '; soap_strncpy(t, sizeof(soap->tmpbuf) - (t - soap->tmpbuf), tp->name, l); t += l; if (tp->value) { l = strlen(tp->value); if (t + l + 3 >= soap->tmpbuf + sizeof(soap->tmpbuf)) break; /* too many or attribute values to large */ *t++ = '='; *t++ = '"'; soap_strncpy(t, sizeof(soap->tmpbuf) - (t - soap->tmpbuf), tp->value, l); t += l; *t++ = '"'; } } } if (!soap->body) *t++ = '/'; *t++ = '>'; *t = '\0'; t = soap->tmpbuf; m = (int)strlen(soap->tmpbuf); #endif if (soap->body) n = 1; f = 1; soap->peeked = 0; } #ifdef WITH_CDATA if (flag <= 0) { int state = 0; #ifdef WITH_FAST soap->labidx = 0; /* use look-aside buffer */ #else if (soap_new_block(soap) == NULL) return NULL; #endif for (;;) { #ifdef WITH_FAST size_t k; if (soap_append_lab(soap, NULL, 0)) /* allocate more space in look-aside buffer if necessary */ return NULL; s = soap->labbuf + soap->labidx; /* space to populate */ k = soap->lablen - soap->labidx; /* number of bytes available */ soap->labidx = soap->lablen; /* claim this space */ #else size_t k = SOAP_BLKLEN; if (!(s = (char*)soap_push_block(soap, NULL, k))) return NULL; #endif for (i = 0; i < k; i++) { if (m > 0) { *s++ = *t++; /* copy multibyte characters */ m--; continue; } c = soap_getchar(soap); if ((int)c == EOF) goto end; if ((c >= 0x80 || c < SOAP_AP) && state != 1 && !(soap->mode & SOAP_ENC_LATIN)) { if ((c & 0x7FFFFFFF) >= 0x80) { soap_unget(soap, c); c = soap_getutf8(soap); } if ((c & 0x7FFFFFFF) >= 0x80 && (flag <= 0 || (soap->mode & SOAP_C_UTFSTRING))) { c &= 0x7FFFFFFF; t = buf; if (c < 0x0800) *t++ = (char)(0xC0 | ((c >> 6) & 0x1F)); else { if (c < 0x010000) *t++ = (char)(0xE0 | ((c >> 12) & 0x0F)); else { if (c < 0x200000) *t++ = (char)(0xF0 | ((c >> 18) & 0x07)); else { if (c < 0x04000000) *t++ = (char)(0xF8 | ((c >> 24) & 0x03)); else { *t++ = (char)(0xFC | ((c >> 30) & 0x01)); *t++ = (char)(0x80 | ((c >> 24) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 18) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 12) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 6) & 0x3F)); } *t++ = (char)(0x80 | (c & 0x3F)); m = (int)(t - buf) - 1; t = buf; *s++ = *t++; continue; } } switch (state) { case 1: if (c == ']') state = 4; *s++ = (char)c; continue; case 2: if (c == '-') state = 6; *s++ = (char)c; continue; case 3: if (c == '?') state = 8; *s++ = (char)c; continue; /* CDATA */ case 4: if (c == ']') state = 5; else state = 1; *s++ = (char)c; continue; case 5: if (c == '>') state = 0; else if (c != ']') state = 1; *s++ = (char)c; continue; /* comment */ case 6: if (c == '-') state = 7; else state = 2; *s++ = (char)c; continue; case 7: if (c == '>') state = 0; else if (c != '-') state = 2; *s++ = (char)c; continue; /* PI */ case 8: if (c == '>') state = 0; else if (c != '?') state = 3; *s++ = (char)c; continue; } switch (c) { case SOAP_TT: if (n == 0) goto end; n--; *s++ = '<'; t = (char*)"/"; m = 1; break; case SOAP_LT: if ((!f && flag >= 0) || (f && n == 0)) goto end; n++; *s++ = '<'; break; case SOAP_GT: *s++ = '>'; break; case SOAP_QT: *s++ = '"'; break; case SOAP_AP: *s++ = '\''; break; case '/': if (n > 0) { c = soap_getchar(soap); if (c == '>') n--; soap_unget(soap, c); } *s++ = '/'; break; case '<': c = soap_getchar(soap); if (c == '/') { if (n == 0) { c = SOAP_TT; goto end; } n--; } else if (c == '!') { c = soap_getchar(soap); if (c == '[') { do c = soap_getchar(soap); while ((int)c != EOF && c != '['); if ((int)c == EOF) goto end; t = (char*)"![CDATA["; m = 8; state = 1; } else if (c == '-') { if ((c = soap_getchar(soap)) == '-') state = 2; t = (char*)"!-"; m = 2; soap_unget(soap, c); } else { t = (char*)"!"; m = 1; soap_unget(soap, c); } *s++ = '<'; break; } else if (c == '?') state = 3; else if (f && n == 0) { soap_revget1(soap); c = '<'; goto end; } else n++; soap_unget(soap, c); *s++ = '<'; break; case '>': *s++ = '>'; break; case '"': *s++ = '"'; break; default: #ifndef WITH_LEANER #ifdef HAVE_WCTOMB if (soap->mode & SOAP_C_MBSTRING) { #ifdef WIN32 m = 0; wctomb_s(&m, buf, sizeof(buf), (wchar_t)(c & 0x7FFFFFFF)); #else m = wctomb(buf, (wchar_t)(c & 0x7FFFFFFF)); #endif if (m >= 1 && m <= (int)MB_CUR_MAX) { t = buf; *s++ = *t++; m--; } else { *s++ = SOAP_UNKNOWN_CHAR; m = 0; } } else #endif #endif *s++ = (char)(c & 0xFF); } l++; if (maxlen >= 0 && l > maxlen) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "String too long: maxlen=%ld\n", maxlen)); soap->error = SOAP_LENGTH; return NULL; } } } } #endif #ifdef WITH_FAST soap->labidx = 0; /* use look-aside buffer */ #else if (soap_new_block(soap) == NULL) return NULL; #endif for (;;) { #ifdef WITH_FAST size_t k; if (soap_append_lab(soap, NULL, 0)) /* allocate more space in look-aside buffer if necessary */ return NULL; s = soap->labbuf + soap->labidx; /* space to populate */ k = soap->lablen - soap->labidx; /* number of bytes available */ soap->labidx = soap->lablen; /* claim this space */ #else size_t k = SOAP_BLKLEN; if (!(s = (char*)soap_push_block(soap, NULL, k))) return NULL; #endif for (i = 0; i < k; i++) { if (m > 0) { *s++ = *t++; /* copy multibyte characters */ m--; continue; } #ifndef WITH_CDATA if (flag <= 0) c = soap_getchar(soap); else #endif { c = soap_getutf8(soap); if ((soap->mode & SOAP_C_UTFSTRING)) { if (c >= 0x80 || (c < SOAP_AP && c >= -0x7FFFFF80)) { c &= 0x7FFFFFFF; t = buf; if (c < 0x0800) *t++ = (char)(0xC0 | ((c >> 6) & 0x1F)); else { if (c < 0x010000) *t++ = (char)(0xE0 | ((c >> 12) & 0x0F)); else { if (c < 0x200000) *t++ = (char)(0xF0 | ((c >> 18) & 0x07)); else { if (c < 0x04000000) *t++ = (char)(0xF8 | ((c >> 24) & 0x03)); else { *t++ = (char)(0xFC | ((c >> 30) & 0x01)); *t++ = (char)(0x80 | ((c >> 24) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 18) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 12) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 6) & 0x3F)); } *t++ = (char)(0x80 | (c & 0x3F)); m = (int)(t - buf) - 1; t = buf; *s++ = *t++; l++; if (maxlen >= 0 && l > maxlen) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "String too long: maxlen=%ld\n", maxlen)); soap->error = SOAP_LENGTH; return NULL; } continue; } } } switch (c) { case SOAP_TT: if (n == 0) goto end; n--; *s++ = '<'; t = (char*)"/"; m = 1; break; case SOAP_LT: if ((!f && flag >= 0) || (f && n == 0)) goto end; n++; *s++ = '<'; break; case SOAP_GT: *s++ = '>'; break; case SOAP_QT: *s++ = '"'; break; case SOAP_AP: *s++ = '\''; break; case '/': if (n > 0) { if (flag > 0) { c = soap_get(soap); if (c == SOAP_GT) n--; } else { c = soap_getchar(soap); if (c == '>') n--; } soap_unget(soap, c); } *s++ = '/'; break; case (soap_wchar)('<' | 0x80000000): if (flag > 0) *s++ = '<'; else { *s++ = '&'; t = (char*)"lt;"; m = 3; } break; case (soap_wchar)('>' | 0x80000000): if (flag > 0) *s++ = '>'; else { *s++ = '&'; t = (char*)"gt;"; m = 3; } break; case (soap_wchar)('&' | 0x80000000): if (flag > 0) *s++ = '&'; else { *s++ = '&'; t = (char*)"amp;"; m = 4; } break; case (soap_wchar)('"' | 0x80000000): if (flag > 0) *s++ = '"'; else { *s++ = '&'; t = (char*)"quot;"; m = 5; } break; case (soap_wchar)('\'' | 0x80000000): if (flag > 0) *s++ = '\''; else { *s++ = '&'; t = (char*)"apos;"; m = 5; } break; default: if ((int)c == EOF) goto end; #ifndef WITH_CDATA if (c == '<') { c = soap_getchar(soap); soap_unget(soap, c); if (c == '/') { c = SOAP_TT; if (n == 0) goto end; n--; } else n++; *s++ = '<'; break; } else #endif #ifndef WITH_LEANER #ifdef HAVE_WCTOMB if (soap->mode & SOAP_C_MBSTRING) { #ifdef WIN32 m = 0; wctomb_s(&m, buf, sizeof(buf), (wchar_t)(c & 0x7FFFFFFF)); #else m = wctomb(buf, (wchar_t)(c & 0x7FFFFFFF)); #endif if (m >= 1 && m <= (int)MB_CUR_MAX) { t = buf; *s++ = *t++; m--; } else { *s++ = SOAP_UNKNOWN_CHAR; m = 0; } } else #endif #endif *s++ = (char)(c & 0xFF); } l++; if (maxlen >= 0 && l > maxlen) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "String too long: maxlen=%ld\n", maxlen)); soap->error = SOAP_LENGTH; return NULL; } } } end: soap_unget(soap, c); *s = '\0'; #ifdef WITH_FAST t = soap_strdup(soap, soap->labbuf); #else soap_size_block(soap, NULL, i + 1); t = soap_save_block(soap, NULL, NULL, 0); #endif if (l < minlen) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "String too short: %ld chars, minlen=%ld\n", l, minlen)); soap->error = SOAP_LENGTH; return NULL; } #ifndef WITH_LEANER if (pattern && soap->fsvalidate && (soap->error = soap->fsvalidate(soap, pattern, s))) return NULL; #else (void)pattern; #endif #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { if (flag > 0) soap->dom->text = t; else soap->dom->code = t; } #endif if (flag == 2) if (soap_s2QName(soap, t, &t, minlen, maxlen)) return NULL; return t; } #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_wstring_out(struct soap *soap, const wchar_t *s, int flag) { const char *t; char tmp; soap_wchar c; #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { soap->dom->text = soap_wchar2s(soap, s); return SOAP_OK; } #endif while ((c = *s++)) { switch (c) { case 0x09: if (flag) t = " "; else t = "\t"; break; case 0x0A: if (flag || !(soap->mode & SOAP_XML_CANONICAL)) t = " "; else t = "\n"; break; case 0x0D: t = " "; break; case '&': t = "&"; break; case '<': t = "<"; break; case '>': if (flag) t = ">"; else t = ">"; break; case '"': if (flag) t = """; else t = "\""; break; default: if (c >= 0x20 && c < 0x80) { tmp = (char)c; if (soap_send_raw(soap, &tmp, 1)) return soap->error; } else { /* check for UTF16 encoding when wchar_t is too small to hold UCS */ if (sizeof(wchar_t) < 4 && (c & 0xFC00) == 0xD800) { soap_wchar d = *s++; if ((d & 0xFC00) == 0xDC00) c = ((c - 0xD800) << 10) + (d - 0xDC00) + 0x10000; else c = 0xFFFD; /* Malformed */ } if (soap_pututf8(soap, (unsigned long)c)) return soap->error; } continue; } if (soap_send(soap, t)) return soap->error; } return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_2 SOAP_FMAC1 wchar_t * SOAP_FMAC2 soap_wstring_in(struct soap *soap, int flag, long minlen, long maxlen, const char *pattern) { wchar_t *s; int i, n = 0, f = 0; long l = 0; soap_wchar c; char *t = NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Reading wide string content\n")); if (flag <= 0 && soap->peeked && *soap->tag) { #ifndef WITH_LEAN struct soap_attribute *tp; t = soap->tmpbuf; *t = '<'; soap_strcpy(t + 1, sizeof(soap->tmpbuf) - 1, soap->tag); t += strlen(t); for (tp = soap->attributes; tp; tp = tp->next) { if (tp->visible) { size_t l = strlen(tp->name); if (t + l + 1 >= soap->tmpbuf + sizeof(soap->tmpbuf)) break; *t++ = ' '; soap_strncpy(t, sizeof(soap->tmpbuf) - (t - soap->tmpbuf), tp->name, l); t += l; if (tp->value) { l = strlen(tp->value); if (t + l + 3 >= soap->tmpbuf + sizeof(soap->tmpbuf)) break; *t++ = '='; *t++ = '"'; soap_strncpy(t, sizeof(soap->tmpbuf) - (t - soap->tmpbuf), tp->value, l); t += l; *t++ = '"'; } } } if (!soap->body) *t++ = '/'; *t++ = '>'; *t = '\0'; t = soap->tmpbuf; #endif if (soap->body) n = 1; f = 1; soap->peeked = 0; } if (soap_new_block(soap) == NULL) return NULL; for (;;) { if (!(s = (wchar_t*)soap_push_block(soap, NULL, sizeof(wchar_t)*SOAP_BLKLEN))) return NULL; for (i = 0; i < SOAP_BLKLEN; i++) { if (t) { *s++ = (wchar_t)*t++; if (!*t) t = NULL; continue; } c = soap_getutf8(soap); switch (c) { case SOAP_TT: if (n == 0) goto end; n--; *s++ = '<'; soap_unget(soap, '/'); break; case SOAP_LT: if ((!f && flag >= 0) || (f && n == 0)) goto end; n++; *s++ = '<'; break; case SOAP_GT: *s++ = '>'; break; case SOAP_QT: *s++ = '"'; break; case SOAP_AP: *s++ = '\''; break; case '/': if (n > 0) { c = soap_getutf8(soap); if (c == SOAP_GT) n--; soap_unget(soap, c); } *s++ = '/'; break; case '<': if (flag > 0) *s++ = (soap_wchar)'<'; else { *s++ = (soap_wchar)'&'; t = (char*)"lt;"; } break; case '>': if (flag > 0) *s++ = (soap_wchar)'>'; else { *s++ = (soap_wchar)'&'; t = (char*)"gt;"; } break; case '"': if (flag > 0) *s++ = (soap_wchar)'"'; else { *s++ = (soap_wchar)'&'; t = (char*)"quot;"; } break; default: if ((int)c == EOF) goto end; /* use UTF16 encoding when wchar_t is too small to hold UCS */ if (sizeof(wchar_t) < 4 && c > 0xFFFF) { soap_wchar c1, c2; c1 = 0xD800 - (0x10000 >> 10) + (c >> 10); c2 = 0xDC00 + (c & 0x3FF); c = c1; soap_unget(soap, c2); } *s++ = (wchar_t)c & 0x7FFFFFFF; } l++; if (maxlen >= 0 && l > maxlen) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "String too long: maxlen=%ld\n", maxlen)); soap->error = SOAP_LENGTH; return NULL; } } } end: soap_unget(soap, c); *s = '\0'; soap_size_block(soap, NULL, sizeof(wchar_t) * (i + 1)); if (l < minlen) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "String too short: %ld chars, minlen=%ld\n", l, minlen)); soap->error = SOAP_LENGTH; return NULL; } s = (wchar_t*)soap_save_block(soap, NULL, NULL, 0); #ifndef WITH_LEANER if (pattern && soap->fwvalidate && (soap->error = soap->fwvalidate(soap, pattern, s))) return NULL; #endif #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) soap->dom->text = soap_wchar2s(soap, s); #endif return s; } #endif #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_int2s(struct soap *soap, int n) { return soap_long2s(soap, (long)n); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outint(struct soap *soap, const char *tag, int id, const int *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_long2s(soap, (long)*p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2int(struct soap *soap, const char *s, int *p) { if (s) { long n; char *r; #ifndef WITH_NOIO #ifndef WITH_LEAN soap_reset_errno; #endif #endif n = soap_strtol(s, &r, 10); if (s == r || *r #ifndef WITH_LEAN || n != (int)n #endif #ifndef WITH_NOIO #ifndef WITH_LEAN || soap_errno == SOAP_ERANGE #endif #endif ) soap->error = SOAP_TYPE; *p = (int)n; } return soap->error; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int * SOAP_FMAC2 soap_inint(struct soap *soap, const char *tag, int *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; #ifndef WITH_LEAN if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":int") && soap_match_tag(soap, soap->type, ":short") && soap_match_tag(soap, soap->type, ":byte")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } #else (void)type; #endif p = (int*)soap_id_enter(soap, soap->id, p, t, sizeof(int), NULL, NULL, NULL, NULL); if (*soap->href) p = (int*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(int), 0, NULL, NULL); else if (p) { if (soap_s2int(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_long2s(struct soap *soap, long n) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 20), "%ld", n); return soap->tmpbuf; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outlong(struct soap *soap, const char *tag, int id, const long *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_long2s(soap, *p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2long(struct soap *soap, const char *s, long *p) { if (s) { char *r; #ifndef WITH_NOIO #ifndef WITH_LEAN soap_reset_errno; #endif #endif *p = soap_strtol(s, &r, 10); if (s == r || *r #ifndef WITH_NOIO #ifndef WITH_LEAN || soap_errno == SOAP_ERANGE #endif #endif ) soap->error = SOAP_TYPE; } return soap->error; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 long * SOAP_FMAC2 soap_inlong(struct soap *soap, const char *tag, long *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; #ifndef WITH_LEAN if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":int") && soap_match_tag(soap, soap->type, ":short") && soap_match_tag(soap, soap->type, ":byte")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } #else (void)type; #endif p = (long*)soap_id_enter(soap, soap->id, p, t, sizeof(long), NULL, NULL, NULL, NULL); if (*soap->href) p = (long*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(long), 0, NULL, NULL); else if (p) { if (soap_s2long(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 const char* SOAP_FMAC2 soap_LONG642s(struct soap *soap, LONG64 n) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 20), SOAP_LONG_FORMAT, n); return soap->tmpbuf; } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 int SOAP_FMAC2 soap_outLONG64(struct soap *soap, const char *tag, int id, const LONG64 *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_LONG642s(soap, *p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 int SOAP_FMAC2 soap_s2LONG64(struct soap *soap, const char *s, LONG64 *p) { if (s) { char *r; #ifndef WITH_NOIO #ifndef WITH_LEAN soap_reset_errno; #endif #endif #ifdef HAVE_STRTOLL *p = soap_strtoll(s, &r, 10); #else *p = (LONG64)soap_strtol(s, &r, 10); #endif if (s == r || *r #ifndef WITH_NOIO #ifndef WITH_LEAN || soap_errno == SOAP_ERANGE #endif #endif ) soap->error = SOAP_TYPE; } return soap->error; } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 LONG64 * SOAP_FMAC2 soap_inLONG64(struct soap *soap, const char *tag, LONG64 *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; #ifndef WITH_LEAN if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":integer") && soap_match_tag(soap, soap->type, ":positiveInteger") && soap_match_tag(soap, soap->type, ":negativeInteger") && soap_match_tag(soap, soap->type, ":nonPositiveInteger") && soap_match_tag(soap, soap->type, ":nonNegativeInteger") && soap_match_tag(soap, soap->type, ":long") && soap_match_tag(soap, soap->type, ":int") && soap_match_tag(soap, soap->type, ":short") && soap_match_tag(soap, soap->type, ":byte")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } #endif p = (LONG64*)soap_id_enter(soap, soap->id, p, t, sizeof(LONG64), NULL, NULL, NULL, NULL); if (*soap->href) p = (LONG64*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(LONG64), 0, NULL, NULL); else if (p) { if (soap_s2LONG64(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_byte2s(struct soap *soap, char n) { return soap_long2s(soap, (long)n); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outbyte(struct soap *soap, const char *tag, int id, const char *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_long2s(soap, (long)*p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2byte(struct soap *soap, const char *s, char *p) { if (s) { long n; char *r; n = soap_strtol(s, &r, 10); if (s == r || *r || n < -128 || n > 127) soap->error = SOAP_TYPE; *p = (char)n; } return soap->error; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 char * SOAP_FMAC2 soap_inbyte(struct soap *soap, const char *tag, char *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; #ifndef WITH_LEAN if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":byte")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } #else (void)type; #endif p = (char*)soap_id_enter(soap, soap->id, p, t, sizeof(char), NULL, NULL, NULL, NULL); if (*soap->href) p = (char*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(char), 0, NULL, NULL); else if (p) { if (soap_s2byte(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_short2s(struct soap *soap, short n) { return soap_long2s(soap, (long)n); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outshort(struct soap *soap, const char *tag, int id, const short *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_long2s(soap, (long)*p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2short(struct soap *soap, const char *s, short *p) { if (s) { long n; char *r; n = soap_strtol(s, &r, 10); if (s == r || *r || n < -32768 || n > 32767) soap->error = SOAP_TYPE; *p = (short)n; } return soap->error; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 short * SOAP_FMAC2 soap_inshort(struct soap *soap, const char *tag, short *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; #ifndef WITH_LEAN if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":short") && soap_match_tag(soap, soap->type, ":byte")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } #else (void)type; #endif p = (short*)soap_id_enter(soap, soap->id, p, t, sizeof(short), NULL, NULL, NULL, NULL); if (*soap->href) p = (short*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(short), 0, NULL, NULL); else if (p) { if (soap_s2short(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_float2s(struct soap *soap, float n) { #if !defined(WITH_C_LOCALE) || !defined(HAVE_SPRINTF_L) char *s; #endif if (soap_isnan((double)n)) return "NaN"; if (soap_ispinff(n)) return "INF"; if (soap_isninff(n)) return "-INF"; #if defined(WITH_C_LOCALE) && defined(HAVE_SPRINTF_L) # ifdef WIN32 _sprintf_s_l(soap->tmpbuf, _countof(soap->tmpbuf), soap->float_format, SOAP_LOCALE(soap), n); # else sprintf_l(soap->tmpbuf, SOAP_LOCALE(soap), soap->float_format, n); # endif #else (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 20), soap->float_format, n); s = strchr(soap->tmpbuf, ','); /* convert decimal comma to DP */ if (s) *s = '.'; #endif return soap->tmpbuf; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outfloat(struct soap *soap, const char *tag, int id, const float *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_float2s(soap, *p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2float(struct soap *soap, const char *s, float *p) { if (s) { if (!*s) return soap->error = SOAP_TYPE; if (!soap_tag_cmp(s, "INF")) *p = FLT_PINFTY; else if (!soap_tag_cmp(s, "+INF")) *p = FLT_PINFTY; else if (!soap_tag_cmp(s, "-INF")) *p = FLT_NINFTY; else if (!soap_tag_cmp(s, "NaN")) *p = FLT_NAN; else { /* On some systems strtof requires -std=c99 or does not even link: so we try to use strtod first */ #if defined(WITH_C_LOCALE) && defined(HAVE_STRTOD_L) char *r; # ifdef WIN32 *p = (float)_strtod_l(s, &r, SOAP_LOCALE(soap)); # else *p = (float)strtod_l(s, &r, SOAP_LOCALE(soap)); # endif if (*r) soap->error = SOAP_TYPE; #elif defined(HAVE_STRTOD) char *r; *p = (float)strtod(s, &r); if (*r) soap->error = SOAP_TYPE; #elif defined(WITH_C_LOCALE) && defined(HAVE_STRTOF_L) char *r; *p = strtof_l((char*)s, &r, SOAP_LOCALE(soap)); if (*r) soap->error = SOAP_TYPE; #elif defined(HAVE_STRTOF) char *r; *p = strtof((char*)s, &r); if (*r) soap->error = SOAP_TYPE; #elif defined(WITH_C_LOCALE) && defined(HAVE_SSCANF_L) && !defined(HAVE_STRTOF_L) && !defined(HAVE_STRTOD_L) double n; if (sscanf_l(s, SOAP_LOCALE(soap), "%lf", &n) != 1) soap->error = SOAP_TYPE; *p = (float)n; #elif defined(HAVE_SSCANF) double n; if (sscanf(s, "%lf", &n) != 1) soap->error = SOAP_TYPE; *p = (float)n; #else soap->error = SOAP_TYPE; #endif } } return soap->error; } #endif /******************************************************************************/ #ifndef WITH_LEAN static int soap_isnumeric(struct soap *soap, const char *type) { if (soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":float") && soap_match_tag(soap, soap->type, ":double") && soap_match_tag(soap, soap->type, ":decimal") && soap_match_tag(soap, soap->type, ":integer") && soap_match_tag(soap, soap->type, ":positiveInteger") && soap_match_tag(soap, soap->type, ":negativeInteger") && soap_match_tag(soap, soap->type, ":nonPositiveInteger") && soap_match_tag(soap, soap->type, ":nonNegativeInteger") && soap_match_tag(soap, soap->type, ":long") && soap_match_tag(soap, soap->type, ":int") && soap_match_tag(soap, soap->type, ":short") && soap_match_tag(soap, soap->type, ":byte") && soap_match_tag(soap, soap->type, ":unsignedLong") && soap_match_tag(soap, soap->type, ":unsignedInt") && soap_match_tag(soap, soap->type, ":unsignedShort") && soap_match_tag(soap, soap->type, ":unsignedByte")) { soap->error = SOAP_TYPE; soap_revert(soap); return SOAP_ERR; } return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 float * SOAP_FMAC2 soap_infloat(struct soap *soap, const char *tag, float *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; #ifndef WITH_LEAN if (*soap->type != '\0' && soap_isnumeric(soap, type)) return NULL; #else (void)type; #endif p = (float*)soap_id_enter(soap, soap->id, p, t, sizeof(float), NULL, NULL, NULL, NULL); if (*soap->href) p = (float*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(float), 0, NULL, NULL); else if (p) { if (soap_s2float(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_double2s(struct soap *soap, double n) { #if !defined(WITH_C_LOCALE) || !defined(HAVE_SPRINTF_L) char *s; #endif if (soap_isnan(n)) return "NaN"; if (soap_ispinfd(n)) return "INF"; if (soap_isninfd(n)) return "-INF"; #if defined(WITH_C_LOCALE) && defined(HAVE_SPRINTF_L) # ifdef WIN32 _sprintf_s_l(soap->tmpbuf, _countof(soap->tmpbuf), soap->double_format, SOAP_LOCALE(soap), n); # else sprintf_l(soap->tmpbuf, SOAP_LOCALE(soap), soap->double_format, n); # endif #else (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 40), soap->double_format, n); s = strchr(soap->tmpbuf, ','); /* convert decimal comma to DP */ if (s) *s = '.'; #endif return soap->tmpbuf; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outdouble(struct soap *soap, const char *tag, int id, const double *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_double2s(soap, *p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2double(struct soap *soap, const char *s, double *p) { if (s) { if (!*s) return soap->error = SOAP_TYPE; if (!soap_tag_cmp(s, "INF")) *p = DBL_PINFTY; else if (!soap_tag_cmp(s, "+INF")) *p = DBL_PINFTY; else if (!soap_tag_cmp(s, "-INF")) *p = DBL_NINFTY; else if (!soap_tag_cmp(s, "NaN")) *p = DBL_NAN; else { #if defined(WITH_C_LOCALE) && defined(HAVE_STRTOD_L) char *r; # ifdef WIN32 *p = _strtod_l(s, &r, SOAP_LOCALE(soap)); # else *p = strtod_l(s, &r, SOAP_LOCALE(soap)); # endif if (*r) soap->error = SOAP_TYPE; #elif defined(HAVE_STRTOD) char *r; *p = strtod(s, &r); if (*r) soap->error = SOAP_TYPE; #elif defined(WITH_C_LOCALE) && defined(HAVE_SSCANF_L) && !defined(HAVE_STRTOF_L) && !defined(HAVE_STRTOD_L) if (sscanf_l(s, SOAP_LOCALE(soap), "%lf", p) != 1) soap->error = SOAP_TYPE; #elif defined(HAVE_SSCANF) if (sscanf(s, "%lf", p) != 1) soap->error = SOAP_TYPE; #else soap->error = SOAP_TYPE; #endif } } return soap->error; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 double * SOAP_FMAC2 soap_indouble(struct soap *soap, const char *tag, double *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; #ifndef WITH_LEAN if (*soap->type != '\0' && soap_isnumeric(soap, type)) return NULL; #else (void)type; #endif p = (double*)soap_id_enter(soap, soap->id, p, t, sizeof(double), NULL, NULL, NULL, NULL); if (*soap->href) p = (double*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(double), 0, NULL, NULL); else if (p) { if (soap_s2double(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedByte2s(struct soap *soap, unsigned char n) { return soap_unsignedLong2s(soap, (unsigned long)n); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outunsignedByte(struct soap *soap, const char *tag, int id, const unsigned char *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_unsignedLong2s(soap, (unsigned long)*p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedByte(struct soap *soap, const char *s, unsigned char *p) { if (s) { unsigned long n; char *r; n = soap_strtoul(s, &r, 10); if (s == r || *r || n > 255) soap->error = SOAP_TYPE; *p = (unsigned char)n; } return soap->error; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 unsigned char * SOAP_FMAC2 soap_inunsignedByte(struct soap *soap, const char *tag, unsigned char *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; #ifndef WITH_LEAN if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":unsignedByte")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } #else (void)type; #endif p = (unsigned char*)soap_id_enter(soap, soap->id, p, t, sizeof(unsigned char), NULL, NULL, NULL, NULL); if (*soap->href) p = (unsigned char*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(unsigned char), 0, NULL, NULL); else if (p) { if (soap_s2unsignedByte(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedShort2s(struct soap *soap, unsigned short n) { return soap_unsignedLong2s(soap, (unsigned long)n); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outunsignedShort(struct soap *soap, const char *tag, int id, const unsigned short *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_unsignedLong2s(soap, (unsigned long)*p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedShort(struct soap *soap, const char *s, unsigned short *p) { if (s) { unsigned long n; char *r; n = soap_strtoul(s, &r, 10); if (s == r || *r || n > 65535) soap->error = SOAP_TYPE; *p = (unsigned short)n; } return soap->error; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 unsigned short * SOAP_FMAC2 soap_inunsignedShort(struct soap *soap, const char *tag, unsigned short *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; #ifndef WITH_LEAN if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":unsignedShort") && soap_match_tag(soap, soap->type, ":unsignedByte")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } #else (void)type; #endif p = (unsigned short*)soap_id_enter(soap, soap->id, p, t, sizeof(unsigned short), NULL, NULL, NULL, NULL); if (*soap->href) p = (unsigned short*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(unsigned short), 0, NULL, NULL); else if (p) { if (soap_s2unsignedShort(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedInt2s(struct soap *soap, unsigned int n) { return soap_unsignedLong2s(soap, (unsigned long)n); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outunsignedInt(struct soap *soap, const char *tag, int id, const unsigned int *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_unsignedLong2s(soap, (unsigned long)*p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedInt(struct soap *soap, const char *s, unsigned int *p) { if (s) { char *r; #ifndef WITH_NOIO #ifndef WITH_LEAN soap_reset_errno; #endif #endif *p = (unsigned int)soap_strtoul(s, &r, 10); if (s == r || *r #ifndef WITH_NOIO #ifndef WITH_LEAN || soap_errno == SOAP_ERANGE #endif #endif ) soap->error = SOAP_TYPE; } return soap->error; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 unsigned int * SOAP_FMAC2 soap_inunsignedInt(struct soap *soap, const char *tag, unsigned int *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; #ifndef WITH_LEAN if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":unsignedInt") && soap_match_tag(soap, soap->type, ":unsignedShort") && soap_match_tag(soap, soap->type, ":unsignedByte")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } #else (void)type; #endif p = (unsigned int*)soap_id_enter(soap, soap->id, p, t, sizeof(unsigned int), NULL, NULL, NULL, NULL); if (*soap->href) p = (unsigned int*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(unsigned int), 0, NULL, NULL); else if (p) { if (soap_s2unsignedInt(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedLong2s(struct soap *soap, unsigned long n) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 20), "%lu", n); return soap->tmpbuf; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outunsignedLong(struct soap *soap, const char *tag, int id, const unsigned long *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_unsignedLong2s(soap, *p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedLong(struct soap *soap, const char *s, unsigned long *p) { if (s) { char *r; #ifndef WITH_NOIO #ifndef WITH_LEAN soap_reset_errno; #endif #endif *p = soap_strtoul(s, &r, 10); if (s == r || *r #ifndef WITH_NOIO #ifndef WITH_LEAN || soap_errno == SOAP_ERANGE #endif #endif ) soap->error = SOAP_TYPE; } return soap->error; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 unsigned long * SOAP_FMAC2 soap_inunsignedLong(struct soap *soap, const char *tag, unsigned long *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; #ifndef WITH_LEAN if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":unsignedInt") && soap_match_tag(soap, soap->type, ":unsignedShort") && soap_match_tag(soap, soap->type, ":unsignedByte")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } #else (void)type; #endif p = (unsigned long*)soap_id_enter(soap, soap->id, p, t, sizeof(unsigned long), NULL, NULL, NULL, NULL); if (*soap->href) p = (unsigned long*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(unsigned long), 0, NULL, NULL); else if (p) { if (soap_s2unsignedLong(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_ULONG642s(struct soap *soap, ULONG64 n) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 20), SOAP_ULONG_FORMAT, n); return soap->tmpbuf; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outULONG64(struct soap *soap, const char *tag, int id, const ULONG64 *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_ULONG642s(soap, *p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2ULONG64(struct soap *soap, const char *s, ULONG64 *p) { if (s) { char *r; #ifndef WITH_NOIO #ifndef WITH_LEAN soap_reset_errno; #endif #endif #ifdef HAVE_STRTOULL *p = soap_strtoull(s, &r, 10); #else *p = (ULONG64)soap_strtoul(s, &r, 10); #endif if (s == r || *r #ifndef WITH_NOIO #ifndef WITH_LEAN || soap_errno == SOAP_ERANGE #endif #endif ) soap->error = SOAP_TYPE; } return soap->error; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 ULONG64 * SOAP_FMAC2 soap_inULONG64(struct soap *soap, const char *tag, ULONG64 *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":positiveInteger") && soap_match_tag(soap, soap->type, ":nonNegativeInteger") && soap_match_tag(soap, soap->type, ":unsignedLong") && soap_match_tag(soap, soap->type, ":unsignedInt") && soap_match_tag(soap, soap->type, ":unsignedShort") && soap_match_tag(soap, soap->type, ":unsignedByte")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } p = (ULONG64*)soap_id_enter(soap, soap->id, p, t, sizeof(ULONG64), NULL, NULL, NULL, NULL); if (*soap->href) p = (ULONG64*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(ULONG64), 0, NULL, NULL); else if (p) { if (soap_s2ULONG64(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2string(struct soap *soap, const char *s, char **t, long minlen, long maxlen) { if (s) { const char *r = soap_string(soap, s, minlen, maxlen); if (r && !(*t = soap_strdup(soap, r))) return soap->error = SOAP_EOM; } return soap->error; } #endif /******************************************************************************/ #ifndef WITH_COMPAT #ifdef __cplusplus #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2std__string(struct soap *soap, const char *s, std::string *t, long minlen, long maxlen) { if (s) { const char *r = soap_string(soap, s, minlen, maxlen); if (r) t->assign(r); } return soap->error; } #endif #endif #endif /******************************************************************************/ #ifndef PALM_2 static const char* soap_string(struct soap *soap, const char *s, long minlen, long maxlen) { if (s) { if (minlen > 0 || maxlen >= 0) { long l; if ((soap->mode & SOAP_C_UTFSTRING)) l = (long)soap_utf8len(s); else l = (long)strlen(s); if (l > maxlen || l < minlen) { soap->error = SOAP_LENGTH; return NULL; } } } return s; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2QName(struct soap *soap, const char *s, char **t, long minlen, long maxlen) { if (s) { const char *r = soap_QName(soap, s, minlen, maxlen); if (r && !(*t = soap_strdup(soap, r))) return soap->error = SOAP_EOM; } return soap->error; } #endif /******************************************************************************/ #ifndef WITH_COMPAT #ifdef __cplusplus #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2std__QName(struct soap *soap, const char *s, std::string *t, long minlen, long maxlen) { if (s) { const char *r = soap_QName(soap, s, minlen, maxlen); if (r) t->assign(r); } return soap->error; } #endif #endif #endif /******************************************************************************/ #ifndef PALM_2 static const char* soap_QName(struct soap *soap, const char *s, long minlen, long maxlen) { if (s) { #ifndef WITH_FAST char *b; #endif if (minlen > 0 || maxlen >= 0) { long l; if ((soap->mode & SOAP_C_UTFSTRING)) l = (long)soap_utf8len(s); else l = (long)strlen(s); if (l > maxlen || l < minlen) { soap->error = SOAP_LENGTH; return NULL; } } #ifdef WITH_FAST soap->labidx = 0; #else if (soap_new_block(soap) == NULL) return NULL; #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Normalized namespace(s) of QNames '%s'", s)); /* convert (by prefix normalize prefix) all QNames in s */ for (;;) { size_t n; struct soap_nlist *np; const char *p = NULL; short flag = 0; const char *r = NULL; size_t m = 0; #ifndef WITH_FAST size_t k = 0; #endif /* skip blanks */ while (*s && soap_blank((soap_wchar)*s)) s++; if (!*s) break; /* find next QName */ n = 1; while (s[n] && !soap_blank((soap_wchar)s[n])) n++; np = soap->nlist; /* if there is no namespace stack, or prefix is "#" or "xml" then copy string */ if (!np || *s == '#' || !strncmp(s, "xml:", 4)) { r = s; m = n; } else /* we normalize the QName by replacing its prefix */ { const char *q; for (p = s; *p && p < s + n; p++) if (*p == ':') break; if (*p == ':') { size_t k = p - s; while (np && (strncmp(np->id, s, k) || np->id[k])) np = np->next; p++; } else { while (np && *np->id) np = np->next; p = s; } /* replace prefix */ if (np) { if (np->index >= 0 && soap->local_namespaces && (q = soap->local_namespaces[np->index].id)) { size_t k = strlen(q); if (q[k-1] != '_') { r = q; m = k; } else { flag = 1; r = soap->local_namespaces[np->index].ns; m = strlen(r); } } else if (np->ns) { flag = 1; r = np->ns; m = strlen(r); } else { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\nNamespace prefix of '%s' not defined (index=%d, URI='%s')\n", s, np->index, np->ns ? np->ns : SOAP_STR_EOS)); soap->error = SOAP_NAMESPACE; return NULL; } } else if (s[n]) /* no namespace, part of string */ { r = s; m = n; } else /* no namespace: assume "" namespace */ { flag = 1; } } #ifdef WITH_FAST if ((flag && soap_append_lab(soap, "\"", 1)) || (m && soap_append_lab(soap, r, m)) || (flag && soap_append_lab(soap, "\"", 1)) || (p && (soap_append_lab(soap, ":", 1) || soap_append_lab(soap, p, n - (p-s))))) return NULL; #else k = 2*flag + m + (p ? n - (p-s) + 1 : 0) + (s[n] != '\0'); b = (char*)soap_push_block(soap, NULL, k); if (!b) return NULL; if (flag) *b++ = '"'; if (m) { if (soap_memcpy((void*)b, k, (const void*)r, m)) { soap->error = SOAP_EOM; return NULL; } b += m; } if (flag) *b++ = '"'; if (p) { *b++ = ':'; if (soap_memcpy((void*)b, k - m - flag - 1, (const void*)p, n - (p-s))) { soap->error = SOAP_EOM; return NULL; } b += n - (p-s); } #endif /* advance to next and add spacing */ s += n; if (*s) { #ifdef WITH_FAST if (soap_append_lab(soap, " ", 1)) return NULL; #else *b = ' '; #endif } } #ifdef WITH_FAST if (soap_append_lab(soap, SOAP_STR_EOS, 1)) return NULL; return soap->labbuf; #else b = (char*)soap_push_block(soap, NULL, 1); if (!b) return NULL; *b = '\0'; return (char*)soap_save_block(soap, NULL, NULL, 0); #endif } return NULL; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_QName2s(struct soap *soap, const char *s) { const char *t = NULL; if (s) { #ifdef WITH_FAST soap->labidx = 0; #else char *b; if (soap_new_block(soap) == NULL) return NULL; #endif for (;;) { size_t n; const char *q = NULL; const char *r = NULL; size_t m = 0; #ifndef WITH_FAST size_t k = 0; #endif /* skip blanks */ while (*s && soap_blank((soap_wchar)*s)) s++; if (!*s) break; /* find next QName */ n = 0; while (s[n] && !soap_blank((soap_wchar)s[n])) n++; /* normal prefix: pass string as is */ if (*s != '"') { #ifndef WITH_LEAN if ((soap->mode & SOAP_XML_CANONICAL)) soap_utilize_ns(soap, s); if ((soap->mode & SOAP_XML_DEFAULTNS)) { r = strchr(s, ':'); if (r && soap->nlist && !strncmp(soap->nlist->id, s, r - s) && !soap->nlist->id[r - s]) { n -= r - s + 1; s = r + 1; } } #endif r = s; m = n + 1; } else /* URL-based string prefix */ { s++; q = strchr(s, '"'); if (q) { struct Namespace *p = soap->local_namespaces; if (p) { for (; p->id; p++) { if (p->ns) if (!soap_tag_cmp(s, p->ns)) break; if (p->in) if (!soap_tag_cmp(s, p->in)) break; } } q++; /* URL is in the namespace table? */ if (p && p->id) { r = p->id; #ifndef WITH_LEAN if ((soap->mode & SOAP_XML_DEFAULTNS) && soap->nlist && !strcmp(soap->nlist->id, r)) q++; else #endif m = strlen(r); } else /* not in namespace table: create xmlns binding */ { char *x = soap_strdup(soap, s); x[q - s - 1] = '\0'; (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 27), "xmlns:_%d", soap->idnum++); soap_set_attr(soap, soap->tmpbuf, x, 1); r = soap->tmpbuf + 6; m = strlen(r); } } } /* copy normalized QName into buffer, including the ending blank or NUL */ #ifdef WITH_FAST if ((m && soap_append_lab(soap, r, m)) || (q && soap_append_lab(soap, q, n - (q - s)))) return NULL; #else k = m + (q ? n - (q - s) : 0); b = (char*)soap_push_block(soap, NULL, k); if (soap_memcpy((void*)b, k, (const void*)r, m)) { soap->error = SOAP_EOM; return NULL; } b += m; if (q) { if (soap_memcpy((void*)b, k - m, (const void*)q, n - (q - s))) { soap->error = SOAP_EOM; return NULL; } b += n - (q - s); } #endif /* advance to next */ s += n; } #ifdef WITH_FAST t = soap_strdup(soap, soap->labbuf); #else t = (char*)soap_save_block(soap, NULL, NULL, 0); #endif } return t; } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 int SOAP_FMAC2 soap_s2wchar(struct soap *soap, const char *s, wchar_t **t, long minlen, long maxlen) { if (s) { const wchar_t *r = soap_wstring(soap, s, minlen, maxlen); if (r && !(*t = soap_wstrdup(soap, r))) return soap->error = SOAP_EOM; } return soap->error; } #endif /******************************************************************************/ #ifndef WITH_COMPAT #ifdef __cplusplus #ifndef WITH_LEAN SOAP_FMAC1 int SOAP_FMAC2 soap_s2std__wstring(struct soap *soap, const char *s, std::wstring *t, long minlen, long maxlen) { if (s) { const wchar_t *r = soap_wstring(soap, s, minlen, maxlen); if (r) t->assign(r); } return soap->error; } #endif #endif #endif /******************************************************************************/ #ifndef WITH_LEAN static const wchar_t* soap_wstring(struct soap *soap, const char *s, long minlen, long maxlen) { if (s) { long l; wchar_t wc; soap->labidx = 0; if (soap->mode & SOAP_ENC_LATIN) { wchar_t *r; if (soap_append_lab(soap, NULL, sizeof(wchar_t) * (strlen(s) + 1))) return NULL; r = (wchar_t*)soap->labbuf; while (*s) *r++ = (wchar_t)*s++; } else { /* Convert UTF8 to wchar */ while (*s) { soap_wchar c, c1, c2, c3, c4; c = (unsigned char)*s++; if (c < 0x80) wc = (wchar_t)c; else { c1 = (soap_wchar)*s++ & 0x3F; if (c < 0xE0) wc = (wchar_t)(((soap_wchar)(c & 0x1F) << 6) | c1); else { c2 = (soap_wchar)*s++ & 0x3F; if (c < 0xF0) wc = (wchar_t)(((soap_wchar)(c & 0x0F) << 12) | (c1 << 6) | c2); else { c3 = (soap_wchar)*s++ & 0x3F; if (c < 0xF8) wc = (wchar_t)(((soap_wchar)(c & 0x07) << 18) | (c1 << 12) | (c2 << 6) | c3); else { c4 = (soap_wchar)*s++ & 0x3F; if (c < 0xFC) wc = (wchar_t)(((soap_wchar)(c & 0x03) << 24) | (c1 << 18) | (c2 << 12) | (c3 << 6) | c4); else wc = (wchar_t)(((soap_wchar)(c & 0x01) << 30) | (c1 << 24) | (c2 << 18) | (c3 << 12) | (c4 << 6) | (soap_wchar)(*s++ & 0x3F)); } } } } if (soap_append_lab(soap, (const char*)&wc, sizeof(wc))) return NULL; } } l = (long)(soap->labidx / sizeof(wchar_t)); wc = L'\0'; if (soap_append_lab(soap, (const char*)&wc, sizeof(wc))) return NULL; if ((maxlen >= 0 && l > maxlen) || l < minlen) { soap->error = SOAP_LENGTH; return NULL; } return (wchar_t*)soap->labbuf; } return NULL; } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 const char* SOAP_FMAC2 soap_wchar2s(struct soap *soap, const wchar_t *s) { soap_wchar c; char *r, *t; const wchar_t *q = s; size_t n = 0; if (!s) return NULL; while ((c = *q++)) { if (c > 0 && c < 0x80) n++; else n += 6; } r = t = (char*)soap_malloc(soap, n + 1); if (r) { /* Convert wchar to UTF8 */ while ((c = *s++)) { if (c > 0 && c < 0x80) *t++ = (char)c; else { if (c < 0x0800) *t++ = (char)(0xC0 | ((c >> 6) & 0x1F)); else { if (c < 0x010000) *t++ = (char)(0xE0 | ((c >> 12) & 0x0F)); else { if (c < 0x200000) *t++ = (char)(0xF0 | ((c >> 18) & 0x07)); else { if (c < 0x04000000) *t++ = (char)(0xF8 | ((c >> 24) & 0x03)); else { *t++ = (char)(0xFC | ((c >> 30) & 0x01)); *t++ = (char)(0x80 | ((c >> 24) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 18) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 12) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 6) & 0x3F)); } *t++ = (char)(0x80 | (c & 0x3F)); } } *t = '\0'; } return r; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outstring(struct soap *soap, const char *tag, int id, char *const*p, const char *type, int n) { id = soap_element_id(soap, tag, id, *p, NULL, 0, type, n, NULL); if (id < 0) return soap->error; if (!**p && (soap->mode & SOAP_C_NILSTRING)) return soap_element_null(soap, tag, id, type); if (soap_element_begin_out(soap, tag, id, type) || soap_string_out(soap, *p, 0) || soap_element_end_out(soap, tag)) return soap->error; return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 char ** SOAP_FMAC2 soap_instring(struct soap *soap, const char *tag, char **p, const char *type, int t, int flag, long minlen, long maxlen, const char *pattern) { (void)type; if (soap_element_begin_in(soap, tag, 1, NULL)) { if (!tag || *tag != '-' || soap->error != SOAP_NO_TAG) return NULL; soap->error = SOAP_OK; } if (!p) { if (!(p = (char**)soap_malloc(soap, sizeof(char*)))) return NULL; } if (soap->null) *p = NULL; else if (soap->body) { *p = soap_string_in(soap, flag, minlen, maxlen, pattern); if (!*p || !(char*)soap_id_enter(soap, soap->id, *p, t, sizeof(char*), NULL, NULL, NULL, NULL)) return NULL; if (!**p && tag && *tag == '-') { soap->error = SOAP_NO_TAG; return NULL; } } else if (tag && *tag == '-') { soap->error = SOAP_NO_TAG; return NULL; } else if (!*soap->href) { if (minlen > 0) { soap->error = SOAP_LENGTH; return NULL; } *p = soap_strdup(soap, SOAP_STR_EOS); } if (*soap->href) p = (char**)soap_id_lookup(soap, soap->href, (void**)p, t, sizeof(char**), 0, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outwstring(struct soap *soap, const char *tag, int id, wchar_t *const*p, const char *type, int n) { id = soap_element_id(soap, tag, id, *p, NULL, 0, type, n, NULL); if (id < 0) return soap->error; if (!**p && (soap->mode & SOAP_C_NILSTRING)) return soap_element_null(soap, tag, id, type); if (soap_element_begin_out(soap, tag, id, type) || soap_wstring_out(soap, *p, 0) || soap_element_end_out(soap, tag)) return soap->error; return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_2 SOAP_FMAC1 wchar_t ** SOAP_FMAC2 soap_inwstring(struct soap *soap, const char *tag, wchar_t **p, const char *type, int t, long minlen, long maxlen, const char *pattern) { (void)type; if (soap_element_begin_in(soap, tag, 1, NULL)) { if (!tag || *tag != '-' || soap->error != SOAP_NO_TAG) return NULL; soap->error = SOAP_OK; } if (!p) { if (!(p = (wchar_t**)soap_malloc(soap, sizeof(wchar_t*)))) return NULL; } if (soap->null) *p = NULL; else if (soap->body) { *p = soap_wstring_in(soap, 1, minlen, maxlen, pattern); if (!*p || !(wchar_t*)soap_id_enter(soap, soap->id, *p, t, sizeof(wchar_t*), NULL, NULL, NULL, NULL)) return NULL; if (!**p && tag && *tag == '-') { soap->error = SOAP_NO_TAG; return NULL; } } else if (tag && *tag == '-') { soap->error = SOAP_NO_TAG; return NULL; } else if (!*soap->href) { if (minlen > 0) { soap->error = SOAP_LENGTH; return NULL; } *p = soap_wstrdup(soap, (wchar_t*)SOAP_STR_EOS); } if (*soap->href) p = (wchar_t**)soap_id_lookup(soap, soap->href, (void**)p, t, sizeof(wchar_t**), 0, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif #endif /******************************************************************************/ #ifndef WITH_LEAN #ifdef UNDER_CE /* WinCE mktime (based on the mingw-runtime, public domain) */ #define __FILETIME_to_ll(f) ((long long)(f).dwHighDateTime << 32 | (long long)(f).dwLowDateTime) static time_t mktime(struct tm *pt) { SYSTEMTIME s, s1, s2; FILETIME f, f1, f2; long long diff; GetSystemTime(&s1); GetLocalTime(&s2); SystemTimeToFileTime(&s1, &f1); SystemTimeToFileTime(&s2, &f2); diff = (__FILETIME_to_ll(f2) - __FILETIME_to_ll(f1)) / 10000000LL; s.wYear = pt->tm_year + 1900; s.wMonth = pt->tm_mon + 1; s.wDayOfWeek = pt->tm_wday; s.wDay = pt->tm_mday; s.wHour = pt->tm_hour; s.wMinute = pt->tm_min; s.wSecond = pt->tm_sec; s.wMilliseconds = 0; SystemTimeToFileTime(&s, &f); return (time_t)((__FILETIME_to_ll(f) - 116444736000000000LL) / 10000000LL) - (time_t)diff; } #endif #endif /******************************************************************************/ #ifndef WITH_LEAN #ifdef UNDER_CE /* WinCE gmtime_r (based on the mingw-runtime, public domain) */ #define HAVE_GMTIME_R static struct tm* gmtime_r(const time_t *t, struct tm *pt) { FILETIME f, f1, f2; SYSTEMTIME s, s1 = {0}; long long time = (long long)(*t) * 10000000LL + 116444736000000000LL; f.dwHighDateTime = (DWORD)((time >> 32) & 0x00000000FFFFFFFF); f.dwLowDateTime = (DWORD)(time & 0x00000000FFFFFFFF); FileTimeToSystemTime(&f, &s); pt->tm_year = s.wYear - 1900; pt->tm_mon = s.wMonth - 1; pt->tm_wday = s.wDayOfWeek; pt->tm_mday = s.wDay; s1.wYear = s.wYear; s1.wMonth = 1; s1.wDayOfWeek = 1; s1.wDay = 1; SystemTimeToFileTime(&s1, &f1); SystemTimeToFileTime(&s, &f2); pt->tm_yday = (((__FILETIME_to_ll(f2) - __FILETIME_to_ll(f1)) / 10000000LL) / (60 * 60 * 24)); pt->tm_hour = s.wHour; pt->tm_min = s.wMinute; pt->tm_sec = s.wSecond; pt->tm_isdst = 0; return pt; } #endif #endif /******************************************************************************/ #ifndef WITH_LEAN #ifdef UNDER_CE /* WinCE very simple strftime for format "%Y-%m-%dT%H:%M:%SZ", note: %F and %T not supported by MS */ static size_t strftime(char *buf, size_t len, const char *format, const struct tm *pT) { (void)len; (void)format; #ifndef WITH_NOZONE (SOAP_SNPRINTF(buf, len, 20), "%04d-%02d-%02dT%02d:%02d:%02dZ", pT->tm_year + 1900, pT->tm_mon + 1, pT->tm_mday, pT->tm_hour, pT->tm_min, pT->tm_sec); #else (SOAP_SNPRINTF(buf, len, 20), "%04d-%02d-%02dT%02d:%02d:%02d", pT->tm_year + 1900, pT->tm_mon + 1, pT->tm_mday, pT->tm_hour, pT->tm_min, pT->tm_sec); #endif return len; } #endif #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 time_t SOAP_FMAC2 soap_timegm(struct tm *T) { #if defined(HAVE_TIMEGM) return timegm(T); #else time_t t, g, z; struct tm tm; #ifndef HAVE_GMTIME_R struct tm *tp; #endif t = mktime(T); if (t == (time_t)-1) return (time_t)-1; #ifdef HAVE_GMTIME_R if (gmtime_r(&t, &tm) == SOAP_FUNC_R_ERR) return (time_t)-1; #else tp = gmtime(&t); if (!tp) return (time_t)-1; tm = *tp; #endif tm.tm_isdst = 0; g = mktime(&tm); if (g == (time_t)-1) return (time_t)-1; z = g - t; return t - z; #endif } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 const char* SOAP_FMAC2 soap_dateTime2s(struct soap *soap, time_t n) { struct tm T, *pT = &T; #if defined(HAVE_GMTIME_R) && !defined(WITH_NOZONE) if (gmtime_r(&n, pT) != SOAP_FUNC_R_ERR) strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%SZ", pT); #elif defined(HAVE_GMTIME) && !defined(WITH_NOZONE) if ((pT = gmtime(&n))) strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%SZ", pT); #elif (defined(HAVE_TM_GMTOFF) || defined(HAVE_STRUCT_TM_TM_GMTOFF) || defined(HAVE_STRUCT_TM___TM_GMTOFF)) && !defined(WITH_NOZONE) #if defined(HAVE_LOCALTIME_R) if (localtime_r(&n, pT) != SOAP_FUNC_R_ERR) { strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S%z", pT); soap_memmove(soap->tmpbuf + 23, sizeof(soap->tmpbuf) - 23, soap->tmpbuf + 22, 3); /* 2000-03-01T02:00:00+0300 */ soap->tmpbuf[22] = ':'; /* 2000-03-01T02:00:00+03:00 */ } #else if ((pT = localtime(&n))) { strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S%z", pT); soap_memmove(soap->tmpbuf + 23, sizeof(soap->tmpbuf) - 23, soap->tmpbuf + 22, 3); /* 2000-03-01T02:00:00+0300 */ soap->tmpbuf[22] = ':'; /* 2000-03-01T02:00:00+03:00 */ } #endif #elif defined(HAVE_GETTIMEOFDAY) && !defined(WITH_NOZONE) struct timezone tz; memset((void*)&tz, 0, sizeof(tz)); #if defined(HAVE_LOCALTIME_R) if (localtime_r(&n, pT) != SOAP_FUNC_R_ERR) { struct timeval tv; size_t l; gettimeofday(&tv, &tz); strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT); l = strlen(soap->tmpbuf); (SOAP_SNPRINTF(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, 7), "%+03d:%02d", -tz.tz_minuteswest/60+(pT->tm_isdst!=0), abs(tz.tz_minuteswest)%60); } #else if ((pT = localtime(&n))) { struct timeval tv; size_t l; gettimeofday(&tv, &tz); strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT); l = strlen(soap->tmpbuf); (SOAP_SNPRINTF(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, 7), "%+03d:%02d", -tz.tz_minuteswest/60+(pT->tm_isdst!=0), abs(tz.tz_minuteswest)%60); } #endif #elif defined(HAVE_FTIME) && !defined(WITH_NOZONE) struct timeb t; memset((void*)&t, 0, sizeof(t)); #if defined(HAVE_LOCALTIME_R) if (localtime_r(&n, pT) != SOAP_FUNC_R_ERR) { size_t l; #ifdef __BORLANDC__ ::ftime(&t); #else ftime(&t); #endif strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT); l = strlen(soap->tmpbuf); (SOAP_SNPRINTF(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, 7), "%+03d:%02d", -t.timezone/60+(pT->tm_isdst!=0), abs(t.timezone)%60); } #else if ((pT = localtime(&n))) { size_t l; #ifdef __BORLANDC__ ::ftime(&t); #else ftime(&t); #endif strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT); l = strlen(soap->tmpbuf); (SOAP_SNPRINTF(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, 7), "%+03d:%02d", -t.timezone/60+(pT->tm_isdst!=0), abs(t.timezone)%60); } #endif #elif defined(HAVE_LOCALTIME_R) if (localtime_r(&n, pT) != SOAP_FUNC_R_ERR) strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT); #else if ((pT = localtime(&n))) strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT); #endif else soap_strcpy(soap->tmpbuf, sizeof(soap->tmpbuf), "1969-12-31T23:59:59Z"); return soap->tmpbuf; } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 int SOAP_FMAC2 soap_outdateTime(struct soap *soap, const char *tag, int id, const time_t *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_dateTime2s(soap, *p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 int SOAP_FMAC2 soap_s2dateTime(struct soap *soap, const char *s, time_t *p) { *p = 0; if (s) { char *t; unsigned long d; struct tm T; memset((void*)&T, 0, sizeof(T)); d = soap_strtoul(s, &t, 10); if (*t == '-') { /* YYYY-MM-DD */ T.tm_year = (int)d; T.tm_mon = (int)soap_strtoul(t + 1, &t, 10); T.tm_mday = (int)soap_strtoul(t + 1, &t, 10); } else if (!(soap->mode & SOAP_XML_STRICT)) { /* YYYYMMDD */ T.tm_year = (int)(d / 10000); T.tm_mon = (int)(d / 100 % 100); T.tm_mday = (int)(d % 100); } else return soap->error = SOAP_TYPE; if (*t == 'T' || ((*t == 't' || *t == ' ') && !(soap->mode & SOAP_XML_STRICT))) { d = soap_strtoul(t + 1, &t, 10); if (*t == ':') { /* Thh:mm:ss */ T.tm_hour = (int)d; T.tm_min = (int)soap_strtoul(t + 1, &t, 10); T.tm_sec = (int)soap_strtoul(t + 1, &t, 10); } else if (!(soap->mode & SOAP_XML_STRICT)) { /* Thhmmss */ T.tm_hour = (int)(d / 10000); T.tm_min = (int)(d / 100 % 100); T.tm_sec = (int)(d % 100); } else return soap->error = SOAP_TYPE; } if (T.tm_year == 1) T.tm_year = 70; else T.tm_year -= 1900; T.tm_mon--; if (*t == '.') { for (t++; *t; t++) if (*t < '0' || *t > '9') break; } if (*t == ' ' && !(soap->mode & SOAP_XML_STRICT)) t++; if (*t) { #ifndef WITH_NOZONE if (*t == '+' || *t == '-') { int h, m; m = (int)soap_strtol(t, &t, 10); if (*t == ':') { /* +hh:mm */ h = m; m = (int)soap_strtol(t + 1, &t, 10); if (h < 0) m = -m; } else if (!(soap->mode & SOAP_XML_STRICT)) { /* +hhmm */ h = m / 100; m = m % 100; } else { /* +hh */ h = m; m = 0; } if (*t) return soap->error = SOAP_TYPE; T.tm_min -= m; T.tm_hour -= h; /* put hour and min in range */ T.tm_hour += T.tm_min / 60; T.tm_min %= 60; if (T.tm_min < 0) { T.tm_min += 60; T.tm_hour--; } T.tm_mday += T.tm_hour / 24; T.tm_hour %= 24; if (T.tm_hour < 0) { T.tm_hour += 24; T.tm_mday--; } /* note: day of the month may be out of range, timegm() handles it */ } else if (*t != 'Z') return soap->error = SOAP_TYPE; #endif *p = soap_timegm(&T); } else /* no UTC or timezone, so assume we got a localtime */ { T.tm_isdst = -1; *p = mktime(&T); } } return soap->error; } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 time_t * SOAP_FMAC2 soap_indateTime(struct soap *soap, const char *tag, time_t *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":dateTime")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } p = (time_t*)soap_id_enter(soap, soap->id, p, t, sizeof(time_t), NULL, NULL, NULL, NULL); if (*soap->href) p = (time_t*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(time_t), 0, NULL, NULL); else if (p) { if (soap_s2dateTime(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outliteral(struct soap *soap, const char *tag, char *const*p, const char *type) { int i; const char *t = NULL; if (tag && *tag != '-') { if (soap->local_namespaces && (t = strchr(tag, ':'))) { size_t n = t - tag; if (n >= sizeof(soap->tmpbuf)) n = sizeof(soap->tmpbuf) - 1; soap_strncpy(soap->tmpbuf, sizeof(soap->tmpbuf), tag, n); for (i = 0; soap->local_namespaces[i].id; i++) if (!strcmp(soap->tmpbuf, soap->local_namespaces[i].id)) break; t++; if (soap_element(soap, t, 0, type) || soap_attribute(soap, "xmlns", soap->local_namespaces[i].ns ? soap->local_namespaces[i].ns : SOAP_STR_EOS) || soap_element_start_end_out(soap, NULL)) return soap->error; } else { t = tag; if (soap_element_begin_out(soap, t, 0, type)) return soap->error; } } if (p && *p) { if (soap_send(soap, *p)) /* send as-is */ return soap->error; } if (t) return soap_element_end_out(soap, t); return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 char ** SOAP_FMAC2 soap_inliteral(struct soap *soap, const char *tag, char **p) { if (soap_element_begin_in(soap, tag, 1, NULL)) { if (soap->error != SOAP_NO_TAG || soap_unget(soap, soap_get(soap)) == SOAP_TT) return NULL; soap->error = SOAP_OK; } if (!p) { if (!(p = (char**)soap_malloc(soap, sizeof(char*)))) return NULL; } if (soap->body || (tag && *tag == '-')) { if (tag && *tag != '-') *p = soap_string_in(soap, -1, -1, -1, NULL); else *p = soap_string_in(soap, 0, -1, -1, NULL); if (!*p) return NULL; if (!**p && tag && *tag == '-') { soap->error = SOAP_NO_TAG; return NULL; } } else if (soap->null) *p = NULL; else *p = soap_strdup(soap, SOAP_STR_EOS); if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outwliteral(struct soap *soap, const char *tag, wchar_t *const*p, const char *type) { int i; const char *t = NULL; if (tag && *tag != '-') { if (soap->local_namespaces && (t = strchr(tag, ':'))) { size_t n = t - tag; if (n >= sizeof(soap->tmpbuf)) n = sizeof(soap->tmpbuf) - 1; soap_strncpy(soap->tmpbuf, sizeof(soap->tmpbuf), tag, n); for (i = 0; soap->local_namespaces[i].id; i++) if (!strcmp(soap->tmpbuf, soap->local_namespaces[i].id)) break; t++; if (soap_element(soap, t, 0, type) || soap_attribute(soap, "xmlns", soap->local_namespaces[i].ns ? soap->local_namespaces[i].ns : SOAP_STR_EOS) || soap_element_start_end_out(soap, NULL)) return soap->error; } else { t = tag; if (soap_element_begin_out(soap, t, 0, type)) return soap->error; } } if (p) { wchar_t c; const wchar_t *s = *p; while ((c = *s++)) { if (soap_pututf8(soap, (unsigned long)c)) /* send as-is in UTF8 */ return soap->error; } } if (t) return soap_element_end_out(soap, t); return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_2 SOAP_FMAC1 wchar_t ** SOAP_FMAC2 soap_inwliteral(struct soap *soap, const char *tag, wchar_t **p) { if (soap_element_begin_in(soap, tag, 1, NULL)) { if (soap->error != SOAP_NO_TAG || soap_unget(soap, soap_get(soap)) == SOAP_TT) return NULL; soap->error = SOAP_OK; } if (!p) { if (!(p = (wchar_t**)soap_malloc(soap, sizeof(wchar_t*)))) return NULL; } if (soap->body) { if (tag && *tag != '-') *p = soap_wstring_in(soap, -1, -1, -1, NULL); else *p = soap_wstring_in(soap, 0, -1, -1, NULL); if (!*p) return NULL; if (!**p && tag && *tag == '-') { soap->error = SOAP_NO_TAG; return NULL; } } else if (tag && *tag == '-') { soap->error = SOAP_NO_TAG; return NULL; } else if (soap->null) *p = NULL; else *p = soap_wstrdup(soap, (wchar_t*)SOAP_STR_EOS); if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char * SOAP_FMAC2 soap_value(struct soap *soap) { size_t i; soap_wchar c = 0; char *s = soap->tmpbuf; if (!soap->body) return SOAP_STR_EOS; do c = soap_get(soap); while (soap_blank(c)); for (i = 0; i < sizeof(soap->tmpbuf) - 1; i++) { if (c == SOAP_TT || c == SOAP_LT || (int)c == EOF) break; *s++ = (char)c; c = soap_get(soap); } for (s--; i > 0; i--, s--) { if (!soap_blank((soap_wchar)*s)) break; } s[1] = '\0'; soap->tmpbuf[sizeof(soap->tmpbuf) - 1] = '\0'; /* appease */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element content value='%s'\n", soap->tmpbuf)); if (c == SOAP_TT || c == SOAP_LT || (int)c == EOF) soap_unget(soap, c); else { soap->error = SOAP_LENGTH; return NULL; } #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) soap->dom->text = soap_strdup(soap, soap->tmpbuf); #endif return soap->tmpbuf; /* return non-null pointer */ } #endif /******************************************************************************/ #if !defined(WITH_LEANER) || !defined(WITH_NOHTTP) #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_getline(struct soap *soap, char *buf, int len) { char *s = buf; int i = len; soap_wchar c = 0; for (;;) { while (--i > 0) { c = soap_getchar(soap); if (c == '\r' || c == '\n') break; if ((int)c == EOF) return soap->error = SOAP_CHK_EOF; *s++ = (char)c; } *s = '\0'; if (c != '\n') c = soap_getchar(soap); /* got \r or something else, now get \n */ if (c == '\n') { if (i + 1 == len) /* empty line: end of HTTP/MIME header */ break; c = soap_get0(soap); if (c != ' ' && c != '\t') /* HTTP line continuation? */ break; } else if ((int)c == EOF) return soap->error = SOAP_CHK_EOF; if (i <= 0) return soap->error = SOAP_HDR; } return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef PALM_1 static size_t soap_count_attachments(struct soap *soap) { #ifndef WITH_LEANER struct soap_multipart *content; size_t count = soap->count; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Calculating the message size with attachments, current count=%lu\n", (unsigned long)count)); if ((soap->mode & SOAP_ENC_DIME) && !(soap->mode & SOAP_ENC_MTOM)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Calculating the size of DIME attachments\n")); for (content = soap->dime.first; content; content = content->next) { count += 12 + ((content->size+3)&(~3)); if (content->id) count += ((strlen(content->id)+3)&(~3)); if (content->type) count += ((strlen(content->type)+3)&(~3)); if (content->options) count += ((((unsigned char)content->options[2] << 8) | ((unsigned char)content->options[3]))+7)&(~3); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Size of DIME attachment content is %lu bytes\n", (unsigned long)content->size)); } } if ((soap->mode & SOAP_ENC_MIME) && soap->mime.boundary) { size_t n = strlen(soap->mime.boundary); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Calculating the size of MIME attachments\n")); for (content = soap->mime.first; content; content = content->next) { const char *s; /* count \r\n--boundary\r\n */ count += 6 + n; /* count Content-Type: ...\r\n */ if (content->type) count += 16 + strlen(content->type); /* count Content-Transfer-Encoding: ...\r\n */ s = soap_code_str(mime_codes, content->encoding); if (s) count += 29 + strlen(s); /* count Content-ID: ...\r\n */ if (content->id) count += 14 + strlen(content->id); /* count Content-Location: ...\r\n */ if (content->location) count += 20 + strlen(content->location); /* count Content-Description: ...\r\n */ if (content->description) count += 23 + strlen(content->description); /* count \r\n...content */ count += 2 + content->size; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Size of MIME attachment content is %lu bytes\n", (unsigned long)content->size)); } /* count \r\n--boundary-- */ count += 6 + n; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "New count=%lu\n", (unsigned long)count)); return count; #else return soap->count; #endif } #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 static int soap_putdimefield(struct soap *soap, const char *s, size_t n) { if (soap_send_raw(soap, s, n)) return soap->error; return soap_send_raw(soap, SOAP_STR_PADDING, -(long)n&3); } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 char * SOAP_FMAC2 soap_dime_option(struct soap *soap, unsigned short optype, const char *option) { size_t n; char *s = NULL; if (option) { n = strlen(option); s = (char*)soap_malloc(soap, n + 5); if (s) { s[0] = (char)(optype >> 8); s[1] = (char)(optype & 0xFF); s[2] = (char)(n >> 8); s[3] = (char)(n & 0xFF); soap_strcpy(s + 4, n + 1, option); } } return s; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_putdimehdr(struct soap *soap) { unsigned char tmp[12]; size_t optlen = 0, idlen = 0, typelen = 0; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Put DIME header id='%s'\n", soap->dime.id ? soap->dime.id : SOAP_STR_EOS)); if (soap->dime.options) optlen = (((unsigned char)soap->dime.options[2] << 8) | ((unsigned char)soap->dime.options[3])) + 4; if (soap->dime.id) { idlen = strlen(soap->dime.id); if (idlen > 0x0000FFFF) idlen = 0x0000FFFF; } if (soap->dime.type) { typelen = strlen(soap->dime.type); if (typelen > 0x0000FFFF) typelen = 0x0000FFFF; } tmp[0] = SOAP_DIME_VERSION | (soap->dime.flags & 0x7); tmp[1] = soap->dime.flags & 0xF0; tmp[2] = (char)(optlen >> 8); tmp[3] = (char)(optlen & 0xFF); tmp[4] = (char)(idlen >> 8); tmp[5] = (char)(idlen & 0xFF); tmp[6] = (char)(typelen >> 8); tmp[7] = (char)(typelen & 0xFF); tmp[8] = (char)(soap->dime.size >> 24); tmp[9] = (char)((soap->dime.size >> 16) & 0xFF); tmp[10] = (char)((soap->dime.size >> 8) & 0xFF); tmp[11] = (char)(soap->dime.size & 0xFF); if (soap_send_raw(soap, (char*)tmp, 12) || soap_putdimefield(soap, soap->dime.options, optlen) || soap_putdimefield(soap, soap->dime.id, idlen) || soap_putdimefield(soap, soap->dime.type, typelen)) return soap->error; return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_putdime(struct soap *soap) { struct soap_multipart *content; if (!(soap->mode & SOAP_ENC_DIME)) return SOAP_OK; for (content = soap->dime.first; content; content = content->next) { void *handle; soap->dime.size = content->size; soap->dime.id = content->id; soap->dime.type = content->type; soap->dime.options = content->options; soap->dime.flags = SOAP_DIME_VERSION | SOAP_DIME_MEDIA; if (soap->fdimereadopen && ((handle = soap->fdimereadopen(soap, (void*)content->ptr, content->id, content->type, content->options)) || soap->error)) { size_t size = content->size; if (!handle) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fdimereadopen failed\n")); return soap->error; } if (!size && ((soap->mode & SOAP_ENC_XML) || (soap->mode & SOAP_IO) == SOAP_IO_CHUNK || (soap->mode & SOAP_IO) == SOAP_IO_STORE)) { size_t chunksize = sizeof(soap->tmpbuf); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Chunked streaming DIME\n")); do { size = soap->fdimeread(soap, handle, soap->tmpbuf, chunksize); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fdimeread returned %lu bytes\n", (unsigned long)size)); if (size < chunksize) { soap->dime.flags &= ~SOAP_DIME_CF; if (!content->next) soap->dime.flags |= SOAP_DIME_ME; } else soap->dime.flags |= SOAP_DIME_CF; soap->dime.size = size; if (soap_putdimehdr(soap) || soap_putdimefield(soap, soap->tmpbuf, size)) break; if (soap->dime.id) { soap->dime.flags &= ~(SOAP_DIME_MB | SOAP_DIME_MEDIA); soap->dime.id = NULL; soap->dime.type = NULL; soap->dime.options = NULL; } } while (size >= chunksize); } else { if (!content->next) soap->dime.flags |= SOAP_DIME_ME; if (soap_putdimehdr(soap)) return soap->error; do { size_t bufsize; if (size < sizeof(soap->tmpbuf)) bufsize = size; else bufsize = sizeof(soap->tmpbuf); if (!(bufsize = soap->fdimeread(soap, handle, soap->tmpbuf, bufsize))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fdimeread failed: insufficient data (%lu bytes remaining from %lu bytes)\n", (unsigned long)size, (unsigned long)content->size)); soap->error = SOAP_CHK_EOF; break; } if (soap_send_raw(soap, soap->tmpbuf, bufsize)) break; size -= bufsize; } while (size); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fdimereadclose\n")); soap_send_raw(soap, SOAP_STR_PADDING, -(long)soap->dime.size&3); } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fdimereadclose\n")); if (soap->fdimereadclose) soap->fdimereadclose(soap, handle); } else { if (!content->next) soap->dime.flags |= SOAP_DIME_ME; if (soap_putdimehdr(soap) || soap_putdimefield(soap, (char*)content->ptr, content->size)) return soap->error; } } return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 static char * soap_getdimefield(struct soap *soap, size_t n) { soap_wchar c; size_t i; char *s; char *p = NULL; if (n) { p = (char*)soap_malloc(soap, n + 1); if (p) { s = p; for (i = n; i > 0; i--) { if ((int)(c = soap_get1(soap)) == EOF) { soap->error = SOAP_CHK_EOF; return NULL; } *s++ = (char)c; } *s = '\0'; /* force NUL terminated */ if ((soap->error = soap_move(soap, (size_t)(-(long)n&3)))) return NULL; } else soap->error = SOAP_EOM; } return p; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_getdimehdr(struct soap *soap) { soap_wchar c; char *s; int i; unsigned char tmp[12]; size_t optlen, idlen, typelen; if (!(soap->mode & SOAP_ENC_DIME)) return soap->error = SOAP_DIME_END; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get DIME header\n")); if (soap->dime.buflen || soap->dime.chunksize) { if (soap_move(soap, soap->dime.size - soap_tell(soap))) return soap->error = SOAP_CHK_EOF; soap_unget(soap, soap_getchar(soap)); /* skip padding and get hdr */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "... From chunked\n")); return SOAP_OK; } s = (char*)tmp; for (i = 12; i > 0; i--) { if ((int)(c = soap_getchar(soap)) == EOF) return soap->error = SOAP_CHK_EOF; *s++ = (char)c; } if ((tmp[0] & 0xF8) != SOAP_DIME_VERSION) return soap->error = SOAP_DIME_MISMATCH; soap->dime.flags = (tmp[0] & 0x7) | (tmp[1] & 0xF0); optlen = (tmp[2] << 8) | tmp[3]; idlen = (tmp[4] << 8) | tmp[5]; typelen = (tmp[6] << 8) | tmp[7]; soap->dime.size = ((size_t)tmp[8] << 24) | ((size_t)tmp[9] << 16) | ((size_t)tmp[10] << 8) | ((size_t)tmp[11]); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DIME size=%lu flags=0x%X\n", (unsigned long)soap->dime.size, soap->dime.flags)); if (!(soap->dime.options = soap_getdimefield(soap, optlen)) && soap->error) return soap->error; if (!(soap->dime.id = soap_getdimefield(soap, idlen)) && soap->error) return soap->error; if (!(soap->dime.type = soap_getdimefield(soap, typelen)) && soap->error) return soap->error; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DIME id='%s', type='%s', options='%s'\n", soap->dime.id ? soap->dime.id : SOAP_STR_EOS, soap->dime.type ? soap->dime.type : "", soap->dime.options ? soap->dime.options+4 : SOAP_STR_EOS)); if (soap->dime.flags & SOAP_DIME_ME) soap->mode &= ~SOAP_ENC_DIME; return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_getdime(struct soap *soap) { while (soap->dime.flags & SOAP_DIME_CF) { if (soap_getdimehdr(soap)) return soap->error; if (soap_move(soap, soap->dime.size)) return soap->error = SOAP_EOF; } if (soap_move(soap, (size_t)(((soap->dime.size+3)&(~3)) - soap_tell(soap)))) return soap->error = SOAP_EOF; for (;;) { struct soap_multipart *content; if (soap_getdimehdr(soap)) break; if (soap->fdimewriteopen && ((soap->dime.ptr = (char*)soap->fdimewriteopen(soap, soap->dime.id, soap->dime.type, soap->dime.options)) || soap->error)) { const char *id, *type, *options; size_t size, n; if (!soap->dime.ptr) return soap->error; id = soap->dime.id; type = soap->dime.type; options = soap->dime.options; for (;;) { size = soap->dime.size; for (;;) { n = soap->buflen - soap->bufidx; if (size < n) n = size; if ((soap->error = soap->fdimewrite(soap, (void*)soap->dime.ptr, soap->buf + soap->bufidx, n))) break; size -= n; if (!size) { soap->bufidx += n; break; } if (soap_recv(soap)) { soap->error = SOAP_EOF; goto end; } } if (soap_move(soap, (size_t)(-(long)soap->dime.size&3))) { soap->error = SOAP_EOF; break; } if (!(soap->dime.flags & SOAP_DIME_CF)) break; if (soap_getdimehdr(soap)) break; } end: if (soap->fdimewriteclose) soap->fdimewriteclose(soap, (void*)soap->dime.ptr); soap->dime.size = 0; soap->dime.id = id; soap->dime.type = type; soap->dime.options = options; } else if (soap->dime.flags & SOAP_DIME_CF) { const char *id, *type, *options; id = soap->dime.id; type = soap->dime.type; options = soap->dime.options; if (soap_new_block(soap) == NULL) return SOAP_EOM; for (;;) { soap_wchar c; size_t i; char *s; if (soap->dime.size > SOAP_MAXDIMESIZE) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DIME size=%lu exceeds SOAP_MAXDIMESIZE=%lu\n", (unsigned long)soap->dime.size, (unsigned long)SOAP_MAXDIMESIZE)); return soap->error = SOAP_DIME_ERROR; } s = (char*)soap_push_block(soap, NULL, soap->dime.size); if (!s) return soap->error = SOAP_EOM; for (i = soap->dime.size; i > 0; i--) { if ((int)(c = soap_get1(soap)) == EOF) return soap->error = SOAP_EOF; *s++ = (char)c; } if (soap_move(soap, (size_t)(-(long)soap->dime.size&3))) return soap->error = SOAP_EOF; if (!(soap->dime.flags & SOAP_DIME_CF)) break; if (soap_getdimehdr(soap)) return soap->error; } soap->dime.size = soap->blist->size++; /* allocate one more byte in blist for the terminating '\0' */ if (!(soap->dime.ptr = soap_save_block(soap, NULL, NULL, 0))) return soap->error; soap->dime.ptr[soap->dime.size] = '\0'; /* make 0-terminated */ soap->dime.id = id; soap->dime.type = type; soap->dime.options = options; } else soap->dime.ptr = soap_getdimefield(soap, soap->dime.size); content = soap_new_multipart(soap, &soap->dime.first, &soap->dime.last, soap->dime.ptr, soap->dime.size); if (!content) return soap->error = SOAP_EOM; content->id = soap->dime.id; content->type = soap->dime.type; content->options = soap->dime.options; if (soap->error) return soap->error; soap_resolve_attachment(soap, content); } if (soap->error != SOAP_DIME_END) return soap->error; return soap->error = SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_getmimehdr(struct soap *soap) { struct soap_multipart *content; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get MIME header\n")); do { if (soap_getline(soap, soap->msgbuf, sizeof(soap->msgbuf))) return soap->error; } while (!*soap->msgbuf); if (soap->msgbuf[0] == '-' && soap->msgbuf[1] == '-') { char *s = soap->msgbuf + strlen(soap->msgbuf) - 1; /* remove white space */ while (soap_blank((soap_wchar)*s)) s--; s[1] = '\0'; if (soap->mime.boundary) { if (strcmp(soap->msgbuf + 2, soap->mime.boundary)) return soap->error = SOAP_MIME_ERROR; } else soap->mime.boundary = soap_strdup(soap, soap->msgbuf + 2); if (soap_getline(soap, soap->msgbuf, sizeof(soap->msgbuf))) return soap->error; } if (soap_set_mime_attachment(soap, NULL, 0, SOAP_MIME_NONE, NULL, NULL, NULL, NULL)) return soap->error = SOAP_EOM; content = soap->mime.last; for (;;) { char *key = soap->msgbuf; char *val; if (!*key) break; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "MIME header: %s\n", key)); val = strchr(soap->msgbuf, ':'); if (val) { *val = '\0'; do val++; while (*val && *val <= 32); if (!soap_tag_cmp(key, "Content-ID")) content->id = soap_strdup(soap, val); else if (!soap_tag_cmp(key, "Content-Location")) content->location = soap_strdup(soap, val); else if (!content->id && !soap_tag_cmp(key, "Content-Disposition")) content->id = soap_strdup(soap, soap_get_header_attribute(soap, val, "name")); else if (!soap_tag_cmp(key, "Content-Type")) content->type = soap_strdup(soap, val); else if (!soap_tag_cmp(key, "Content-Description")) content->description = soap_strdup(soap, val); else if (!soap_tag_cmp(key, "Content-Transfer-Encoding")) content->encoding = (enum soap_mime_encoding)soap_code_int(mime_codes, val, (LONG64)SOAP_MIME_NONE); } if (soap_getline(soap, key, sizeof(soap->msgbuf))) return soap->error; } return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_getmime(struct soap *soap) { while (soap_get_mime_attachment(soap, NULL)) continue; return soap->error; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_post_check_mime_attachments(struct soap *soap) { soap->imode |= SOAP_MIME_POSTCHECK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_check_mime_attachments(struct soap *soap) { if (soap->mode & SOAP_MIME_POSTCHECK) return soap_get_mime_attachment(soap, NULL) != NULL; return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 struct soap_multipart * SOAP_FMAC2 soap_get_mime_attachment(struct soap *soap, void *handle) { soap_wchar c = 0; size_t i, m = 0; char *s, *t = NULL; struct soap_multipart *content; short flag = 0; if (!(soap->mode & SOAP_ENC_MIME)) return NULL; content = soap->mime.last; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get MIME (%p)\n", content)); if (!content) { if (soap_getmimehdr(soap)) return NULL; content = soap->mime.last; } else if (content != soap->mime.first) { if (soap->fmimewriteopen && ((content->ptr = (char*)soap->fmimewriteopen(soap, (void*)handle, content->id, content->type, content->description, content->encoding)) || soap->error)) { if (!content->ptr) return NULL; } } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Parsing MIME content id='%s' type='%s'\n", content->id ? content->id : SOAP_STR_EOS, content->type ? content->type : SOAP_STR_EOS)); if (!content->ptr && soap_new_block(soap) == NULL) { soap->error = SOAP_EOM; return NULL; } for (;;) { if (content->ptr) s = soap->tmpbuf; else if (!(s = (char*)soap_push_block(soap, NULL, sizeof(soap->tmpbuf)))) { soap->error = SOAP_EOM; return NULL; } for (i = 0; i < sizeof(soap->tmpbuf); i++) { if (m > 0) { *s++ = *t++; m--; } else { if (!flag) { c = soap_getchar(soap); if ((int)c == EOF) { if (content->ptr && soap->fmimewriteclose) soap->fmimewriteclose(soap, (void*)content->ptr); soap->error = SOAP_CHK_EOF; return NULL; } } if (flag || c == '\r') { memset((void*)soap->msgbuf, 0, sizeof(soap->msgbuf)); soap_strcpy(soap->msgbuf, sizeof(soap->msgbuf), "\n--"); if (soap->mime.boundary) soap_strncat(soap->msgbuf, sizeof(soap->msgbuf), soap->mime.boundary, sizeof(soap->msgbuf) - 4); t = soap->msgbuf; do c = soap_getchar(soap); while (c == *t++); if ((int)c == EOF) { if (content->ptr && soap->fmimewriteclose) soap->fmimewriteclose(soap, (void*)content->ptr); soap->error = SOAP_CHK_EOF; return NULL; } if (!*--t) goto end; *t = (char)c; flag = (c == '\r'); m = t - soap->msgbuf + 1 - flag; t = soap->msgbuf; c = '\r'; } *s++ = (char)c; } } if (content->ptr && soap->fmimewrite) { if ((soap->error = soap->fmimewrite(soap, (void*)content->ptr, soap->tmpbuf, i))) break; } } end: *s = '\0'; /* make 0-terminated */ if (content->ptr) { if (!soap->error && soap->fmimewrite) soap->error = soap->fmimewrite(soap, (void*)content->ptr, soap->tmpbuf, i); if (soap->fmimewriteclose) soap->fmimewriteclose(soap, (void*)content->ptr); if (soap->error) return NULL; } else { content->size = soap_size_block(soap, NULL, i+1) - 1; /* last block with '\0' */ content->ptr = soap_save_block(soap, NULL, NULL, 0); } soap_resolve_attachment(soap, content); if (c == '-' && soap_getchar(soap) == '-') { soap->mode &= ~SOAP_ENC_MIME; if ((soap->mode & SOAP_MIME_POSTCHECK) && soap_end_recv(soap)) { if (soap->keep_alive < 0) soap->keep_alive = 0; soap_closesock(soap); return NULL; } } else { while (c != '\r' && (int)c != EOF && soap_blank(c)) c = soap_getchar(soap); if (c != '\r' || soap_getchar(soap) != '\n') { soap->error = SOAP_MIME_ERROR; return NULL; } if (soap_getmimehdr(soap)) return NULL; } return content; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_match_cid(struct soap *soap, const char *s, const char *t) { size_t n; if (!s) return 1; if (!strcmp(s, t)) return 0; if (!strncmp(s, "cid:", 4)) s += 4; n = strlen(t); if (*t == '<') { t++; n -= 2; } if (!strncmp(s, t, n) && !s[n]) return 0; soap_decode(soap->tmpbuf, sizeof(soap->tmpbuf), s, SOAP_STR_EOS); if (!strncmp(soap->tmpbuf, t, n) && !soap->tmpbuf[n]) return 0; return 1; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 static void soap_resolve_attachment(struct soap *soap, struct soap_multipart *content) { if (content->id) { struct soap_xlist **xp = &soap->xlist; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolving attachment data for id='%s'\n", content->id)); while (*xp) { struct soap_xlist *xq = *xp; if (!soap_match_cid(soap, xq->id, content->id)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Found matching attachment id='%s' for content id='%s'\n", xq->id, content->id)); *xp = xq->next; *xq->ptr = (unsigned char*)content->ptr; *xq->size = (int)content->size; *xq->type = (char*)content->type; if (content->options) *xq->options = (char*)content->options; else *xq->options = (char*)content->description; SOAP_FREE(soap, xq); } else xp = &(*xp)->next; } } } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_putmimehdr(struct soap *soap, struct soap_multipart *content) { const char *s; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "MIME attachment type='%s'\n", content->type ? content->type : SOAP_STR_EOS)); if (soap_send3(soap, "\r\n--", soap->mime.boundary, "\r\n")) return soap->error; if (content->type && soap_send3(soap, "Content-Type: ", content->type, "\r\n")) return soap->error; s = soap_code_str(mime_codes, content->encoding); if (s && soap_send3(soap, "Content-Transfer-Encoding: ", s, "\r\n")) return soap->error; if (content->id && soap_send3(soap, "Content-ID: ", content->id, "\r\n")) return soap->error; if (content->location && soap_send3(soap, "Content-Location: ", content->location, "\r\n")) return soap->error; if (content->description && soap_send3(soap, "Content-Description: ", content->description, "\r\n")) return soap->error; return soap_send_raw(soap, "\r\n", 2); } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_putmime(struct soap *soap) { struct soap_multipart *content; if (!(soap->mode & SOAP_ENC_MIME) || !soap->mime.boundary) return SOAP_OK; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Sending MIME attachments\n")); for (content = soap->mime.first; content; content = content->next) { void *handle; if (soap->fmimereadopen && ((handle = soap->fmimereadopen(soap, (void*)content->ptr, content->id, content->type, content->description)) || soap->error)) { size_t size = content->size; if (!handle) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fmimereadopen failed\n")); return soap->error; } if (soap_putmimehdr(soap, content)) return soap->error; if (!size) { if ((soap->mode & SOAP_ENC_XML) || (soap->mode & SOAP_IO) == SOAP_IO_CHUNK || (soap->mode & SOAP_IO) == SOAP_IO_STORE) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Chunked streaming MIME\n")); do { size = soap->fmimeread(soap, handle, soap->tmpbuf, sizeof(soap->tmpbuf)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fmimeread returned %lu bytes\n", (unsigned long)size)); if (soap_send_raw(soap, soap->tmpbuf, size)) break; } while (size); } else { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Error: cannot chunk streaming MIME (no HTTP chunking)\n")); } } else { do { size_t bufsize; if (size < sizeof(soap->tmpbuf)) bufsize = size; else bufsize = sizeof(soap->tmpbuf); if (!(bufsize = soap->fmimeread(soap, handle, soap->tmpbuf, bufsize))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fmimeread failed: insufficient data (%lu bytes remaining from %lu bytes)\n", (unsigned long)size, (unsigned long)content->size)); soap->error = SOAP_EOF; break; } if (soap_send_raw(soap, soap->tmpbuf, bufsize)) break; size -= bufsize; } while (size); } if (soap->fmimereadclose) soap->fmimereadclose(soap, handle); } else { if (soap_putmimehdr(soap, content) || soap_send_raw(soap, content->ptr, content->size)) return soap->error; } } return soap_send3(soap, "\r\n--", soap->mime.boundary, "--"); } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_set_dime(struct soap *soap) { soap->omode |= SOAP_ENC_DIME; soap->dime.first = NULL; soap->dime.last = NULL; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_set_mime(struct soap *soap, const char *boundary, const char *start) { soap->omode |= SOAP_ENC_MIME; soap->mime.first = NULL; soap->mime.last = NULL; soap->mime.boundary = soap_strdup(soap, boundary); soap->mime.start = soap_strdup(soap, start); } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_clr_dime(struct soap *soap) { soap->omode &= ~SOAP_ENC_DIME; soap->dime.first = NULL; soap->dime.last = NULL; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_clr_mime(struct soap *soap) { soap->omode &= ~SOAP_ENC_MIME; soap->mime.first = NULL; soap->mime.last = NULL; soap->mime.boundary = NULL; soap->mime.start = NULL; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 static struct soap_multipart* soap_new_multipart(struct soap *soap, struct soap_multipart **first, struct soap_multipart **last, char *ptr, size_t size) { struct soap_multipart *content; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "New MIME attachment %p (%lu)\n", ptr, (unsigned long)size)); content = (struct soap_multipart*)soap_malloc(soap, sizeof(struct soap_multipart)); if (content) { content->next = NULL; content->ptr = ptr; content->size = size; content->id = NULL; content->type = NULL; content->options = NULL; content->encoding = SOAP_MIME_NONE; content->location = NULL; content->description = NULL; if (!*first) *first = content; if (*last) (*last)->next = content; *last = content; } return content; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_set_dime_attachment(struct soap *soap, char *ptr, size_t size, const char *type, const char *id, unsigned short optype, const char *option) { struct soap_multipart *content = soap_new_multipart(soap, &soap->dime.first, &soap->dime.last, ptr, size); if (!content) return SOAP_EOM; content->id = soap_strdup(soap, id); content->type = soap_strdup(soap, type); content->options = soap_dime_option(soap, optype, option); return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_set_mime_attachment(struct soap *soap, char *ptr, size_t size, enum soap_mime_encoding encoding, const char *type, const char *id, const char *location, const char *description) { struct soap_multipart *content = soap_new_multipart(soap, &soap->mime.first, &soap->mime.last, ptr, size); if (!content) return SOAP_EOM; content->id = soap_strdup(soap, id); content->type = soap_strdup(soap, type); content->encoding = encoding; content->location = soap_strdup(soap, location); content->description = soap_strdup(soap, description); return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 struct soap_multipart* SOAP_FMAC2 soap_next_multipart(struct soap_multipart *content) { if (content) return content->next; return NULL; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 static void soap_select_mime_boundary(struct soap *soap) { while (!soap->mime.boundary || soap_valid_mime_boundary(soap)) { char *s = soap->mime.boundary; size_t n = 0; if (s) n = strlen(s); if (n < 16) { n = 64; s = soap->mime.boundary = (char*)soap_malloc(soap, n + 1); if (!s) return; } *s++ = '='; *s++ = '='; n -= 4; while (n) { *s++ = soap_base64o[soap_random & 0x3F]; n--; } *s++ = '='; *s++ = '='; *s = '\0'; } if (!soap->mime.start) soap->mime.start = ""; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 static int soap_valid_mime_boundary(struct soap *soap) { struct soap_multipart *content; size_t k; if (soap->fmimeread) return SOAP_OK; k = strlen(soap->mime.boundary); for (content = soap->mime.first; content; content = content->next) { if (content->ptr && content->size >= k) { const char *p = (const char*)content->ptr; size_t i; for (i = 0; i < content->size - k; i++, p++) { if (!strncmp(p, soap->mime.boundary, k)) return SOAP_ERR; } } } return SOAP_OK; } #endif #endif /******************************************************************************/ #ifdef WITH_GZIP #ifndef PALM_1 static int soap_getgziphdr(struct soap *soap) { int i; soap_wchar c = 0, f = 0; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get gzip header\n")); for (i = 0; i < 9; i++) { if ((int)(c = soap_get1(soap) == EOF)) return soap->error = SOAP_ZLIB_ERROR; if (i == 1 && c == 8) soap->z_dict = 0; if (i == 2) f = c; } if (f & 0x04) /* FEXTRA */ { for (i = soap_get1(soap) | (soap_get1(soap) << 8); i; i--) { if ((int)soap_get1(soap) == EOF) return soap->error = SOAP_ZLIB_ERROR; } } if (f & 0x08) /* skip FNAME */ { do c = soap_get1(soap); while (c && (int)c != EOF); } if ((int)c != EOF && (f & 0x10)) /* skip FCOMMENT */ { do c = soap_get1(soap); while (c && (int)c != EOF); } if ((int)c != EOF && (f & 0x02)) /* skip FHCRC (CRC32 is used) */ { if ((int)(c = soap_get1(soap)) != EOF) c = soap_get1(soap); } if ((int)c == EOF) return soap->error = SOAP_ZLIB_ERROR; return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_begin_serve(struct soap *soap) { #ifdef WITH_FASTCGI if (FCGI_Accept() < 0) { soap->error = SOAP_EOF; return soap_send_fault(soap); } #endif soap_begin(soap); if (soap_begin_recv(soap) || soap_envelope_begin_in(soap) || soap_recv_header(soap) || soap_body_begin_in(soap)) { if (soap->error < SOAP_STOP) { #ifdef WITH_FASTCGI soap_send_fault(soap); #else return soap_send_fault(soap); #endif } return soap_closesock(soap); } return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_begin_recv(struct soap *soap) { soap_wchar c; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Initializing for input from socket=%d/fd=%d\n", soap->socket, soap->recvfd)); soap->error = SOAP_OK; #ifndef WITH_LEANER soap->recverror = SOAP_OK; #endif soap_free_temp(soap); soap_set_local_namespaces(soap); soap->version = 0; /* don't assume we're parsing SOAP content by default */ #ifndef WITH_NOIDREF soap_free_iht(soap); #endif if ((soap->imode & SOAP_IO) == SOAP_IO_CHUNK) soap->omode |= SOAP_IO_CHUNK; soap->imode &= ~(SOAP_IO | SOAP_ENC_MIME); soap->mode = soap->imode; if (!soap->keep_alive) { soap->buflen = 0; soap->bufidx = 0; } if (!(soap->mode & SOAP_IO_KEEPALIVE)) soap->keep_alive = 0; soap->shaky = 0; soap->ahead = 0; soap->peeked = 0; soap->level = 0; soap->part = SOAP_BEGIN; soap->body = 1; soap->count = 0; soap->length = 0; soap->cdata = 0; *soap->endpoint = '\0'; soap->action = NULL; soap->header = NULL; soap->fault = NULL; soap->status = 0; soap->fform = NULL; #ifndef WITH_LEANER soap->dom = NULL; soap->dime.chunksize = 0; soap->dime.buflen = 0; soap->dime.list = NULL; soap->dime.first = NULL; soap->dime.last = NULL; soap->mime.list = NULL; soap->mime.first = NULL; soap->mime.last = NULL; soap->mime.boundary = NULL; soap->mime.start = NULL; #endif #ifdef WIN32 #ifndef UNDER_CE #ifndef WITH_FASTCGI if (!soap_valid_socket(soap->socket) && !soap->is && soap->recvfd >= 0) /* Set win32 stdin or soap->recvfd to BINARY, e.g. to support DIME */ #ifdef __BORLANDC__ setmode(soap->recvfd, _O_BINARY); #else _setmode(soap->recvfd, _O_BINARY); #endif #endif #endif #endif #ifdef WITH_ZLIB soap->mode &= ~SOAP_ENC_ZLIB; soap->zlib_in = SOAP_ZLIB_NONE; soap->zlib_out = SOAP_ZLIB_NONE; if (!soap->d_stream) { soap->d_stream = (z_stream*)SOAP_MALLOC(soap, sizeof(z_stream)); soap->d_stream->zalloc = Z_NULL; soap->d_stream->zfree = Z_NULL; soap->d_stream->opaque = Z_NULL; soap->d_stream->next_in = Z_NULL; } soap->d_stream->avail_in = 0; soap->d_stream->next_out = (Byte*)soap->buf; soap->d_stream->avail_out = sizeof(soap->buf); soap->z_ratio_in = 1.0; #endif #ifdef WITH_OPENSSL if (soap->ssl) ERR_clear_error(); #endif #ifndef WITH_LEANER if (soap->fprepareinitrecv && (soap->error = soap->fprepareinitrecv(soap))) return soap->error; #endif c = soap_getchar(soap); #ifdef WITH_GZIP if (c == 0x1F) { if (soap_getgziphdr(soap)) return soap->error; if (inflateInit2(soap->d_stream, -MAX_WBITS) != Z_OK) return soap->error = SOAP_ZLIB_ERROR; if (soap->z_dict) { if (inflateSetDictionary(soap->d_stream, (const Bytef*)soap->z_dict, soap->z_dict_len) != Z_OK) return soap->error = SOAP_ZLIB_ERROR; } soap->zlib_state = SOAP_ZLIB_INFLATE; soap->mode |= SOAP_ENC_ZLIB; soap->zlib_in = SOAP_ZLIB_GZIP; soap->z_crc = crc32(0L, NULL, 0); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "gzip initialized\n")); if (!soap->z_buf) soap->z_buf = (char*)SOAP_MALLOC(soap, sizeof(soap->buf)); soap_memcpy((void*)soap->z_buf, sizeof(soap->buf), (const void*)soap->buf, sizeof(soap->buf)); /* should not chunk over plain transport, so why bother to check? */ /* if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK) */ /* soap->z_buflen = soap->bufidx; */ /* else */ soap->d_stream->next_in = (Byte*)(soap->z_buf + soap->bufidx); soap->d_stream->avail_in = (unsigned int)(soap->buflen - soap->bufidx); soap->z_buflen = soap->buflen; soap->buflen = soap->bufidx; c = ' '; } #endif while (soap_blank(c)) c = soap_getchar(soap); #ifndef WITH_LEANER if (c == '-' && soap_get0(soap) == '-') soap->mode |= SOAP_ENC_MIME; else if ((c & 0xFFFC) == (SOAP_DIME_VERSION | SOAP_DIME_MB) && (soap_get0(soap) & 0xFFF0) == 0x20) soap->mode |= SOAP_ENC_DIME; else #endif { /* skip BOM */ if (c == 0xEF && soap_get0(soap) == 0xBB) { c = soap_get1(soap); if ((c = soap_get1(soap)) == 0xBF) { soap->mode &= ~SOAP_ENC_LATIN; c = soap_getchar(soap); } else c = (0x0F << 12) | (0xBB << 6) | (c & 0x3F); /* UTF-8 */ } else if ((c == 0xFE && soap_get0(soap) == 0xFF) /* UTF-16 BE */ || (c == 0xFF && soap_get0(soap) == 0xFE)) /* UTF-16 LE */ return soap->error = SOAP_UTF_ERROR; /* skip space */ while (soap_blank(c)) c = soap_getchar(soap); } if ((int)c == EOF) return soap->error = SOAP_CHK_EOF; soap_unget(soap, c); #ifndef WITH_NOHTTP /* if not XML/MIME/DIME/ZLIB, assume HTTP method or status line */ if (((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')) && !(soap->mode & (SOAP_ENC_MIME | SOAP_ENC_DIME | SOAP_ENC_ZLIB | SOAP_ENC_XML))) { soap_mode m = soap->imode; soap->mode &= ~SOAP_IO; soap->error = soap->fparse(soap); if (soap->error && soap->error < SOAP_STOP) { soap->keep_alive = 0; /* force close later */ return soap->error; } if (soap->error == SOAP_STOP) { if (soap->fform) { soap->error = soap->fform(soap); if (soap->error == SOAP_OK) soap->error = SOAP_STOP; /* prevents further processing */ } return soap->error; } soap->mode = soap->imode; /* if imode is changed, effectuate */ soap->imode = m; /* restore imode */ #ifdef WITH_ZLIB soap->mode &= ~SOAP_ENC_ZLIB; #endif if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK) { soap->chunkbuflen = soap->buflen; soap->buflen = soap->bufidx; soap->chunksize = 0; } /* Note: fparse should not use soap_unget to push back last char */ #if 0 if (soap->status > 200 && soap->length == 0 && !(soap->http_content && (!soap->keep_alive || soap->recv_timeout)) && (soap->imode & SOAP_IO) != SOAP_IO_CHUNK) #endif if (soap->status && !soap->body) return soap->error = soap->status; #ifdef WITH_ZLIB if (soap->zlib_in != SOAP_ZLIB_NONE) { #ifdef WITH_GZIP if (soap->zlib_in != SOAP_ZLIB_DEFLATE) { c = soap_get1(soap); if (c == (int)EOF) return soap->error = SOAP_EOF; if (c == 0x1F) { if (soap_getgziphdr(soap)) return soap->error; if (inflateInit2(soap->d_stream, -MAX_WBITS) != Z_OK) return soap->error = SOAP_ZLIB_ERROR; soap->z_crc = crc32(0L, NULL, 0); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "gzip initialized\n")); } else { soap_revget1(soap); if (inflateInit(soap->d_stream) != Z_OK) return soap->error = SOAP_ZLIB_ERROR; soap->zlib_in = SOAP_ZLIB_DEFLATE; } } else #endif if (inflateInit(soap->d_stream) != Z_OK) return soap->error = SOAP_ZLIB_ERROR; if (soap->z_dict) { if (inflateSetDictionary(soap->d_stream, (const Bytef*)soap->z_dict, soap->z_dict_len) != Z_OK) return soap->error = SOAP_ZLIB_ERROR; } soap->zlib_state = SOAP_ZLIB_INFLATE; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflate initialized\n")); soap->mode |= SOAP_ENC_ZLIB; if (!soap->z_buf) soap->z_buf = (char*)SOAP_MALLOC(soap, sizeof(soap->buf)); soap_memcpy((void*)soap->z_buf, sizeof(soap->buf), (const void*)soap->buf, sizeof(soap->buf)); soap->d_stream->next_in = (Byte*)(soap->z_buf + soap->bufidx); soap->d_stream->avail_in = (unsigned int)(soap->buflen - soap->bufidx); soap->z_buflen = soap->buflen; soap->buflen = soap->bufidx; } #endif #ifndef WITH_LEANER if (soap->fpreparerecv && (soap->mode & SOAP_IO) != SOAP_IO_CHUNK && soap->buflen > soap->bufidx) { int r; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Invoking fpreparerecv\n")); if ((r = soap->fpreparerecv(soap, soap->buf + soap->bufidx, soap->buflen - soap->bufidx))) return soap->error = r; } #endif if (soap_get0(soap) == (int)EOF) { if (soap->status == 0) return soap->error = SOAP_NO_DATA; /* server side expects data */ return soap->error = soap->status; /* client side received HTTP status code */ } if (soap->error) { if (soap->error == SOAP_FORM && soap->fform) { soap->error = soap->fform(soap); if (soap->error == SOAP_OK) soap->error = SOAP_STOP; /* prevents further processing */ } return soap->error; } } #endif #ifndef WITH_LEANER if (soap->mode & SOAP_ENC_MIME) { do /* skip preamble */ { if ((int)(c = soap_getchar(soap)) == EOF) return soap->error = SOAP_CHK_EOF; } while (c != '-' || soap_get0(soap) != '-'); soap_unget(soap, c); if (soap_getmimehdr(soap)) return soap->error; if (soap->mime.start) { do { if (!soap->mime.last->id) break; if (!soap_match_cid(soap, soap->mime.start, soap->mime.last->id)) break; } while (soap_get_mime_attachment(soap, NULL)); } if (soap_get_header_attribute(soap, soap->mime.first->type, "application/dime")) soap->mode |= SOAP_ENC_DIME; } if (soap->mode & SOAP_ENC_DIME) { if (soap_getdimehdr(soap)) return soap->error; if (soap->dime.flags & SOAP_DIME_CF) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Chunked DIME SOAP message\n")); soap->dime.chunksize = soap->dime.size; if (soap->buflen - soap->bufidx >= soap->dime.chunksize) { soap->dime.buflen = soap->buflen; soap->buflen = soap->bufidx + soap->dime.chunksize; } else soap->dime.chunksize -= soap->buflen - soap->bufidx; } soap->count = soap->buflen - soap->bufidx; } #endif return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_begin_out(struct soap *soap) { #ifndef WITH_LEANER size_t n = 0; if ((soap->mode & SOAP_ENC_MIME) && soap->mime.boundary && soap->mime.start) { const char *s; if (strlen(soap->mime.boundary) + strlen(soap->mime.start) + 140 > sizeof(soap->tmpbuf)) return soap->error = SOAP_EOM; if ((soap->mode & SOAP_ENC_DIME) && !(soap->mode & SOAP_ENC_MTOM)) s = "application/dime"; else if (soap->version == 2) { if (soap->mode & SOAP_ENC_MTOM) s = "application/xop+xml; charset=utf-8; type=\"application/soap+xml\""; else s = "application/soap+xml; charset=utf-8"; } else if (soap->mode & SOAP_ENC_MTOM) s = "application/xop+xml; charset=utf-8; type=\"text/xml\""; else s = "text/xml; charset=utf-8"; (SOAP_SNPRINTF_SAFE(soap->tmpbuf, sizeof(soap->tmpbuf)), "--%s\r\nContent-Type: %s\r\nContent-Transfer-Encoding: binary\r\nContent-ID: %s\r\n\r\n", soap->mime.boundary, s, soap->mime.start); n = strlen(soap->tmpbuf); if (soap_send_raw(soap, soap->tmpbuf, n)) return soap->error; } if (soap->mode & SOAP_IO_LENGTH) soap->dime.size = soap->count; /* DIME in MIME correction */ if (!(soap->mode & SOAP_IO_LENGTH) && (soap->mode & SOAP_ENC_DIME)) { if (soap_putdimehdr(soap)) return soap->error; } #endif if (soap->version == 0) return SOAP_OK; soap->part = SOAP_IN_ENVELOPE; return soap_element_begin_out(soap, "SOAP-ENV:Envelope", 0, NULL); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_end_out(struct soap *soap) { if (soap->version == 0) return SOAP_OK; if (soap_element_end_out(soap, "SOAP-ENV:Envelope") || soap_send_raw(soap, "\r\n", 2)) /* 2.8: always emit \r\n */ return soap->error; #ifndef WITH_LEANER if ((soap->mode & SOAP_IO_LENGTH) && (soap->mode & SOAP_ENC_DIME) && !(soap->mode & SOAP_ENC_MTOM)) { soap->dime.size = soap->count - soap->dime.size; /* DIME in MIME correction */ (SOAP_SNPRINTF(soap->id, sizeof(soap->id), strlen(soap->dime_id_format) + 20), soap->dime_id_format, 0); soap->dime.id = soap->id; if (soap->local_namespaces) { if (soap->local_namespaces[0].out) soap->dime.type = (char*)soap->local_namespaces[0].out; else soap->dime.type = (char*)soap->local_namespaces[0].ns; } soap->dime.options = NULL; soap->dime.flags = SOAP_DIME_MB | SOAP_DIME_ABSURI; if (!soap->dime.first) soap->dime.flags |= SOAP_DIME_ME; soap->count += 12 + ((strlen(soap->dime.id)+3)&(~3)) + (soap->dime.type ? ((strlen(soap->dime.type)+3)&(~3)) : 0); } if ((soap->mode & SOAP_ENC_DIME) && !(soap->mode & SOAP_ENC_MTOM)) return soap_send_raw(soap, SOAP_STR_PADDING, -(long)soap->dime.size&3); #endif soap->part = SOAP_END_ENVELOPE; return SOAP_OK; } #endif /******************************************************************************/ #ifndef WITH_LEAN #ifndef PALM_1 SOAP_FMAC1 char* SOAP_FMAC2 soap_get_http_body(struct soap *soap, size_t *len) { #ifndef WITH_LEAN size_t l = 0, n = 0; char *s; if (len) *len = 0; /* get HTTP body length */ if (!(soap->mode & SOAP_ENC_ZLIB) && (soap->mode & SOAP_IO) != SOAP_IO_CHUNK) { n = soap->length; if (!n) return NULL; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Parsing HTTP body (mode=0x%x,len=%lu)\n", soap->mode, (unsigned long)n)); #ifdef WITH_FAST soap->labidx = 0; /* use look-aside buffer */ #else if (soap_new_block(soap) == NULL) return NULL; #endif for (;;) { #ifdef WITH_FAST size_t i, k; if (soap_append_lab(soap, NULL, 0)) /* allocate more space in look-aside buffer if necessary */ return NULL; s = soap->labbuf + soap->labidx; /* space to populate */ k = soap->lablen - soap->labidx; /* number of bytes available */ soap->labidx = soap->lablen; /* claim this space */ #else size_t i, k = SOAP_BLKLEN; if (!(s = (char*)soap_push_block(soap, NULL, k))) return NULL; #endif for (i = 0; i < k; i++) { soap_wchar c; l++; if (n > 0 && l > n) goto end; c = soap_get1(soap); if ((int)c == EOF) goto end; *s++ = (char)(c & 0xFF); } } end: *s = '\0'; if (len) *len = l - 1; /* len excludes terminating \0 */ #ifdef WITH_FAST if ((s = (char*)soap_malloc(soap, l))) soap_memcpy((void*)s, l, (const void*)soap->labbuf, l); #else soap_size_block(soap, NULL, i+1); s = soap_save_block(soap, NULL, NULL, 0); #endif return s; #else if (len) *len = 0; return NULL; #endif } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_begin_in(struct soap *soap) { soap->part = SOAP_IN_ENVELOPE; if (soap_element_begin_in(soap, "SOAP-ENV:Envelope", 0, NULL)) { if (soap->error == SOAP_TAG_MISMATCH) { if (!soap_element_begin_in(soap, "Envelope", 0, NULL)) soap->error = SOAP_VERSIONMISMATCH; else if (soap->status == 0 || (soap->status >= 200 && soap->status <= 299)) return SOAP_OK; /* allow non-SOAP (REST) XML content to be captured */ soap->error = soap->status; } else if (soap->status) soap->error = soap->status; return soap->error; } soap_get_version(soap); return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_end_in(struct soap *soap) { if (soap->version == 0) return SOAP_OK; soap->part = SOAP_END_ENVELOPE; return soap_element_end_in(soap, "SOAP-ENV:Envelope"); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_body_begin_out(struct soap *soap) { if (soap->version == 1) soap->encoding = 1; #ifndef WITH_LEAN if ((soap->mode & SOAP_SEC_WSUID) && soap_set_attr(soap, "wsu:Id", "Body", 1)) return soap->error; #endif if (soap->version == 0) return SOAP_OK; soap->part = SOAP_IN_BODY; return soap_element_begin_out(soap, "SOAP-ENV:Body", 0, NULL); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_body_end_out(struct soap *soap) { if (soap->version == 0) return SOAP_OK; if (soap_element_end_out(soap, "SOAP-ENV:Body")) return soap->error; soap->part = SOAP_END_BODY; return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_body_begin_in(struct soap *soap) { if (soap->version == 0) return SOAP_OK; soap->part = SOAP_IN_BODY; if (soap_element_begin_in(soap, "SOAP-ENV:Body", 0, NULL)) return soap->error; if (!soap->body) soap->part = SOAP_NO_BODY; return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_body_end_in(struct soap *soap) { if (soap->version == 0) return SOAP_OK; if (soap->part == SOAP_NO_BODY) return soap->error = SOAP_OK; soap->part = SOAP_END_BODY; return soap_element_end_in(soap, "SOAP-ENV:Body"); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_recv_header(struct soap *soap) { if (soap_getheader(soap) && soap->error == SOAP_TAG_MISMATCH) soap->error = SOAP_OK; if (soap->error == SOAP_OK && soap->fheader) soap->error = soap->fheader(soap); return soap->error; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_set_endpoint(struct soap *soap, const char *endpoint) { const char *s; size_t i, n; soap->endpoint[0] = '\0'; soap->host[0] = '\0'; soap->path[0] = '/'; soap->path[1] = '\0'; soap->port = 80; if (!endpoint || !*endpoint) return; #ifdef WITH_OPENSSL if (!soap_tag_cmp(endpoint, "https:*")) soap->port = 443; #endif soap_strcpy(soap->endpoint, sizeof(soap->endpoint), endpoint); s = strchr(endpoint, ':'); if (s && s[1] == '/' && s[2] == '/') s += 3; else s = endpoint; n = strlen(s); if (n >= sizeof(soap->host)) n = sizeof(soap->host) - 1; #ifdef WITH_IPV6 if (s[0] == '[') { s++; for (i = 0; i < n; i++) { if (s[i] == ']') { s++; --n; break; } soap->host[i] = s[i]; } } else { for (i = 0; i < n; i++) { soap->host[i] = s[i]; if (s[i] == '/' || s[i] == ':') break; } } #else for (i = 0; i < n; i++) { soap->host[i] = s[i]; if (s[i] == '/' || s[i] == ':') break; } #endif soap->host[i] = '\0'; if (s[i] == ':') { soap->port = (int)soap_strtol(s + i + 1, NULL, 10); for (i++; i < n; i++) if (s[i] == '/') break; } if (i < n && s[i]) soap_strcpy(soap->path, sizeof(soap->path), s + i); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_connect(struct soap *soap, const char *endpoint, const char *action) { return soap_connect_command(soap, SOAP_POST, endpoint, action); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_connect_command(struct soap *soap, int http_command, const char *endpoints, const char *action) { if (endpoints) { const char *s; s = strchr(endpoints, ' '); if (s) { size_t l = strlen(endpoints); char *endpoint = (char*)SOAP_MALLOC(soap, l + 1); for (;;) { soap_strncpy(endpoint, l + 1, endpoints, s - endpoints); endpoint[s - endpoints] = '\0'; if (soap_try_connect_command(soap, http_command, endpoint, action) != SOAP_TCP_ERROR) break; if (!*s) break; soap->error = SOAP_OK; while (*s == ' ') s++; endpoints = s; s = strchr(endpoints, ' '); if (!s) s = endpoints + strlen(endpoints); } SOAP_FREE(soap, endpoint); } else soap_try_connect_command(soap, http_command, endpoints, action); } return soap->error; } #endif /******************************************************************************/ #ifndef PALM_1 static int soap_try_connect_command(struct soap *soap, int http_command, const char *endpoint, const char *action) { char host[sizeof(soap->host)]; int port; size_t count; soap->error = SOAP_OK; soap_strcpy(host, sizeof(soap->host), soap->host); /* save previous host name: if != then reconnect */ port = soap->port; /* save previous port to compare */ soap->status = http_command; soap_set_endpoint(soap, endpoint); soap->action = soap_strdup(soap, action); #ifndef WITH_LEANER if (soap->fconnect) { if ((soap->error = soap->fconnect(soap, endpoint, soap->host, soap->port))) return soap->error; } else #endif if (soap->fopen && *soap->host) { if (!soap->keep_alive || !soap_valid_socket(soap->socket) || strcmp(soap->host, host) || soap->port != port || !soap->fpoll || soap->fpoll(soap)) { soap->error = SOAP_OK; #ifndef WITH_LEAN if (!strncmp(endpoint, "soap.udp:", 9)) soap->omode |= SOAP_IO_UDP; else #endif { soap->keep_alive = 0; /* to force close */ soap->omode &= ~SOAP_IO_UDP; /* to force close */ } soap_closesock(soap); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connect/reconnect to '%s' host='%s' path='%s' port=%d\n", endpoint?endpoint:"(null)", soap->host, soap->path, soap->port)); if (!soap->keep_alive || !soap_valid_socket(soap->socket)) { soap->socket = soap->fopen(soap, endpoint, soap->host, soap->port); if (soap->error) return soap->error; soap->keep_alive = ((soap->omode & SOAP_IO_KEEPALIVE) != 0); } } } #ifdef WITH_NTLM if (soap_ntlm_handshake(soap, SOAP_GET, endpoint, soap->host, soap->port)) return soap->error; #endif count = soap_count_attachments(soap); if (soap_begin_send(soap)) return soap->error; if (http_command == SOAP_GET) { soap->mode &= ~SOAP_IO; soap->mode |= SOAP_IO_BUFFER; } #ifndef WITH_NOHTTP if ((soap->mode & SOAP_IO) != SOAP_IO_STORE && !(soap->mode & SOAP_ENC_XML) && endpoint) { unsigned int k = soap->mode; soap->mode &= ~(SOAP_IO | SOAP_ENC_ZLIB); if ((k & SOAP_IO) != SOAP_IO_FLUSH) soap->mode |= SOAP_IO_BUFFER; if ((soap->error = soap->fpost(soap, endpoint, soap->host, soap->port, soap->path, action, count))) return soap->error; #ifndef WITH_LEANER if ((k & SOAP_IO) == SOAP_IO_CHUNK) { if (soap_flush(soap)) return soap->error; } #endif soap->mode = k; } if (http_command == SOAP_GET || http_command == SOAP_DEL) return soap_end_send_flush(soap); #endif return SOAP_OK; } #endif /******************************************************************************/ #ifdef WITH_NTLM #ifndef PALM_1 static int soap_ntlm_handshake(struct soap *soap, int command, const char *endpoint, const char *host, int port) { /* requires libntlm from http://www.nongnu.org/libntlm/ */ const char *userid = (soap->proxy_userid ? soap->proxy_userid : soap->userid); const char *passwd = (soap->proxy_passwd ? soap->proxy_passwd : soap->passwd); struct SOAP_ENV__Header *oldheader; if (soap->ntlm_challenge && userid && passwd && soap->authrealm) { tSmbNtlmAuthRequest req; tSmbNtlmAuthResponse res; tSmbNtlmAuthChallenge ch; short k = soap->keep_alive; size_t l = soap->length; size_t c = soap->count; soap_mode m = soap->mode, o = soap->omode; int s = soap->status; char *a = soap->action; short v = soap->version; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "NTLM '%s'\n", soap->ntlm_challenge)); if (!*soap->ntlm_challenge) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "NTLM S->C Type 1: received NTLM authentication challenge from server\n")); /* S -> C 401 Unauthorized WWW-Authenticate: NTLM */ buildSmbNtlmAuthRequest(&req, userid, soap->authrealm); soap->ntlm_challenge = soap_s2base64(soap, (unsigned char*)(void*)&req, NULL, SmbLength(&req)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "NTLM C->S Type 2: sending NTLM authorization to server\nAuthorization: NTLM %s\n", soap->ntlm_challenge)); /* C -> S GET ... Authorization: NTLM TlRMTVNTUAABAAAAA7IAAAoACgApAAAACQAJACAAAABMSUdIVENJVFlVUlNBLU1JTk9S */ soap->omode = SOAP_IO_BUFFER; if (soap_begin_send(soap)) return soap->error; soap->keep_alive = 1; soap->status = command; if (soap->fpost(soap, endpoint, host, port, soap->path, soap->action, 0) || soap_end_send_flush(soap)) return soap->error; soap->mode = m; soap->keep_alive = k; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "NTLM S->C Type 2: waiting on server NTLM response\n")); oldheader = soap->header; if (soap_begin_recv(soap)) if (soap->error == SOAP_EOF) return soap->error; soap_end_recv(soap); soap->header = oldheader; soap->length = l; if (soap->status != 401 && soap->status != 407) return soap->error = SOAP_NTLM_ERROR; soap->error = SOAP_OK; } /* S -> C 401 Unauthorized WWW-Authenticate: NTLM TlRMTVNTUAACAAAAAAAAACgAAAABggAAU3J2Tm9uY2UAAAAAAAAAAA== */ soap_base642s(soap, soap->ntlm_challenge, (char*)&ch, sizeof(tSmbNtlmAuthChallenge), NULL); buildSmbNtlmAuthResponse(&ch, &res, userid, passwd); soap->ntlm_challenge = soap_s2base64(soap, (unsigned char*)(void*)&res, NULL, SmbLength(&res)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "NTLM C->S Type 3: sending NTLM authorization to server\nAuthorization: NTLM %s\n", soap->ntlm_challenge)); /* C -> S GET ... Authorization: NTLM TlRMTVNTUAADAAAAGAAYAHIAAAAYABgAigAAABQAFABAAAAADAAMAFQAAAASABIAYAAAAAAAAACiAAAAAYIAAFUAUgBTAEEALQBNAEkATgBPAFIAWgBhAHAAaABvAGQATABJAEcASABUAEMASQBUAFkArYfKbe/jRoW5xDxHeoxC1gBmfWiS5+iX4OAN4xBKG/IFPwfH3agtPEia6YnhsADT */ soap->userid = NULL; soap->passwd = NULL; soap->proxy_userid = NULL; soap->proxy_passwd = NULL; soap->keep_alive = k; soap->length = l; soap->count = c; soap->mode = m; soap->omode = o; soap->status = s; soap->action = a; soap->version = v; } return SOAP_OK; } #endif #endif /******************************************************************************/ #if !defined(WITH_LEAN) || defined(WITH_NTLM) SOAP_FMAC1 char* SOAP_FMAC2 soap_s2base64(struct soap *soap, const unsigned char *s, char *t, int n) { int i; unsigned long m; char *p; if (!t) t = (char*)soap_malloc(soap, (n + 2) / 3 * 4 + 1); if (!t) return NULL; p = t; t[0] = '\0'; if (!s) return p; for (; n > 2; n -= 3, s += 3) { m = s[0]; m = (m << 8) | s[1]; m = (m << 8) | s[2]; for (i = 4; i > 0; m >>= 6) t[--i] = soap_base64o[m & 0x3F]; t += 4; } t[0] = '\0'; if (n > 0) /* 0 < n <= 2 implies that t[0..4] is allocated (base64 scaling formula) */ { m = 0; for (i = 0; i < n; i++) m = (m << 8) | *s++; for (; i < 3; i++) m <<= 8; for (i = 4; i > 0; m >>= 6) t[--i] = soap_base64o[m & 0x3F]; for (i = 3; i > n; i--) t[i] = '='; t[4] = '\0'; } return p; } #endif /******************************************************************************/ #if !defined(WITH_LEAN) || defined(WITH_NTLM) SOAP_FMAC1 const char* SOAP_FMAC2 soap_base642s(struct soap *soap, const char *s, char *t, size_t l, int *n) { size_t i, j; soap_wchar c; unsigned long m; const char *p; if (!s || !*s) { if (n) *n = 0; if (soap->error) return NULL; return SOAP_NON_NULL; } if (!t) { l = (strlen(s) + 3) / 4 * 3 + 1; /* space for raw binary and \0 */ t = (char*)soap_malloc(soap, l); } if (!t) return NULL; p = t; if (n) *n = 0; for (i = 0; ; i += 3, l -= 3) { m = 0; j = 0; while (j < 4) { c = *s++; if (c == '=' || !c) { if (l >= j - 1) { switch (j) { case 2: *t++ = (char)((m >> 4) & 0xFF); i++; l--; break; case 3: *t++ = (char)((m >> 10) & 0xFF); *t++ = (char)((m >> 2) & 0xFF); i += 2; l -= 2; } } if (n) *n = (int)i; if (l) *t = '\0'; return p; } c -= '+'; if (c >= 0 && c <= 79) { int b = soap_base64i[c]; if (b >= 64) { soap->error = SOAP_TYPE; return NULL; } m = (m << 6) + b; j++; } else if (!soap_blank(c + '+')) { soap->error = SOAP_TYPE; return NULL; } } if (l < 3) { if (n) *n = (int)i; if (l) *t = '\0'; return p; } *t++ = (char)((m >> 16) & 0xFF); *t++ = (char)((m >> 8) & 0xFF); *t++ = (char)(m & 0xFF); } } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 char* SOAP_FMAC2 soap_s2hex(struct soap *soap, const unsigned char *s, char *t, int n) { char *p; if (!t) t = (char*)soap_malloc(soap, 2 * n + 1); if (!t) return NULL; p = t; t[0] = '\0'; if (s) { for (; n > 0; n--) { int m = *s++; *t++ = (char)((m >> 4) + (m > 159 ? 'a' - 10 : '0')); m &= 0x0F; *t++ = (char)(m + (m > 9 ? 'a' - 10 : '0')); } } *t++ = '\0'; return p; } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 const char* SOAP_FMAC2 soap_hex2s(struct soap *soap, const char *s, char *t, size_t l, int *n) { const char *p; if (!s || !*s) { if (n) *n = 0; if (soap->error) return NULL; return SOAP_NON_NULL; } if (!t) { l = strlen(s) / 2 + 1; /* make sure enough space for \0 */ t = (char*)soap_malloc(soap, l); } if (!t) return NULL; p = t; while (l) { int d1, d2; d1 = *s++; if (!d1) break; d2 = *s++; if (!d2) break; *t++ = (char)(((d1 >= 'A' ? (d1 & 0x7) + 9 : d1 - '0') << 4) + (d2 >= 'A' ? (d2 & 0x7) + 9 : d2 - '0')); l--; } if (n) *n = (int)(t - p); if (l) *t = '\0'; return p; } #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_puthttphdr(struct soap *soap, int status, size_t count) { if (soap->status != SOAP_GET && soap->status != SOAP_DEL && soap->status != SOAP_CONNECT) { const char *s = "text/xml; charset=utf-8"; int err = SOAP_OK; #ifndef WITH_LEANER const char *r = NULL; size_t n; #endif if ((status == SOAP_FILE || soap->status == SOAP_PUT || soap->status == SOAP_POST_FILE) && soap->http_content && !strchr(s, 10) && !strchr(s, 13)) s = soap->http_content; else if (status == SOAP_HTML) s = "text/html; charset=utf-8"; else if (count || ((soap->omode & SOAP_IO) == SOAP_IO_CHUNK)) { if (soap->version == 2) s = "application/soap+xml; charset=utf-8"; } #ifndef WITH_LEANER if (soap->mode & (SOAP_ENC_DIME | SOAP_ENC_MTOM)) { if (soap->mode & SOAP_ENC_MTOM) { if (soap->version == 2) r = "application/soap+xml"; else r = "text/xml"; s = "application/xop+xml"; } else s = "application/dime"; } if ((soap->mode & SOAP_ENC_MIME) && soap->mime.boundary) { const char *t; size_t l; n = strlen(soap->mime.boundary); (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), n + 53), "multipart/related; charset=utf-8; boundary=\"%s\"; type=\"", soap->mime.boundary); t = strchr(s, ';'); if (t) n = t - s; else n = strlen(s); l = strlen(soap->tmpbuf); if (sizeof(soap->tmpbuf) - l > n) soap_strncpy(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, s, n); if (soap->mime.start) { l = strlen(soap->tmpbuf); n = strlen(soap->mime.start); (SOAP_SNPRINTF(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, n + 10), "\"; start=\"%s", soap->mime.start); } if (r) { l = strlen(soap->tmpbuf); n = strlen(r); (SOAP_SNPRINTF(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, n + 15), "\"; start-info=\"%s", r); } l = strlen(soap->tmpbuf); if (sizeof(soap->tmpbuf) - l > 1) soap_strncpy(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, "\"", 1); } else soap_strcpy(soap->tmpbuf, sizeof(soap->tmpbuf), s); if (status == SOAP_OK && soap->version == 2 && soap->action) { size_t l = strlen(soap->tmpbuf); (SOAP_SNPRINTF(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, n + 11), "; action=\"%s\"", soap->action); } #endif if ((err = soap->fposthdr(soap, "Content-Type", soap->tmpbuf))) return err; #ifdef WITH_ZLIB if ((soap->omode & SOAP_ENC_ZLIB)) { #ifdef WITH_GZIP err = soap->fposthdr(soap, "Content-Encoding", soap->zlib_out == SOAP_ZLIB_DEFLATE ? "deflate" : "gzip"); #else err = soap->fposthdr(soap, "Content-Encoding", "deflate"); #endif if (err) return err; } #endif #ifndef WITH_LEANER if ((soap->omode & SOAP_IO) == SOAP_IO_CHUNK) err = soap->fposthdr(soap, "Transfer-Encoding", "chunked"); else #endif { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 20), SOAP_ULONG_FORMAT, (ULONG64)count); err = soap->fposthdr(soap, "Content-Length", soap->tmpbuf); } if (err) return err; } return soap->fposthdr(soap, "Connection", soap->keep_alive ? "keep-alive" : "close"); } #endif #endif /******************************************************************************/ #ifndef WITH_LEAN static const char* soap_set_validation_fault(struct soap *soap, const char *s, const char *t) { if (!t) t = SOAP_STR_EOS; if (*soap->tag) (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), strlen(s) + strlen(t) + strlen(soap->tag) + 47), "Validation constraint violation: %s%s in element '%s'", s, t, soap->tag); else (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), strlen(s) + strlen(t) + 33), "Validation constraint violation: %s%s", s, t); return soap->msgbuf; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_set_fault(struct soap *soap) { const char **c = soap_faultcode(soap); const char **s = soap_faultstring(soap); if (soap->fseterror) soap->fseterror(soap, c, s); if (!*c) { if (soap->version == 2) *c = "SOAP-ENV:Sender"; else if (soap->version == 1) *c = "SOAP-ENV:Client"; else *c = "at source"; } if (*s) return; switch (soap->error) { #ifndef WITH_LEAN case SOAP_CLI_FAULT: *s = "Client fault"; break; case SOAP_SVR_FAULT: *s = "Server fault"; break; case SOAP_TAG_MISMATCH: *s = soap_set_validation_fault(soap, "tag name or namespace mismatch", NULL); break; case SOAP_TYPE: if (*soap->type) *s = soap_set_validation_fault(soap, "type mismatch ", soap->type); else *s = soap_set_validation_fault(soap, "invalid value", NULL); break; case SOAP_SYNTAX_ERROR: *s = soap_set_validation_fault(soap, "syntax error", NULL); break; case SOAP_NO_TAG: if (soap->version == 0 && soap->level == 0) *s = soap_set_validation_fault(soap, "missing root element", NULL); else if (soap->version != 0 && soap->level < 3) *s = soap_set_validation_fault(soap, "missing SOAP message", NULL); else *s = soap_set_validation_fault(soap, "missing element", NULL); break; case SOAP_MUSTUNDERSTAND: *c = "SOAP-ENV:MustUnderstand"; (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), strlen(soap->tag) + 65), "The data in element '%s' must be understood but cannot be processed", soap->tag); *s = soap->msgbuf; break; case SOAP_VERSIONMISMATCH: *c = "SOAP-ENV:VersionMismatch"; *s = "Invalid SOAP message or SOAP version mismatch"; break; case SOAP_DATAENCODINGUNKNOWN: *c = "SOAP-ENV:DataEncodingUnknown"; *s = "Unsupported SOAP data encoding"; break; case SOAP_NAMESPACE: *s = soap_set_validation_fault(soap, "namespace error", NULL); break; case SOAP_USER_ERROR: *s = "User data access error"; break; case SOAP_FATAL_ERROR: *s = "A fatal error has occurred"; break; case SOAP_NO_METHOD: (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), strlen(soap->tag) + 66), "Method '%s' not implemented: method name or namespace not recognized", soap->tag); *s = soap->msgbuf; break; case SOAP_NO_DATA: *s = "Data required for operation"; break; case SOAP_GET_METHOD: *s = "HTTP GET method not implemented"; break; case SOAP_PUT_METHOD: *s = "HTTP PUT method not implemented"; break; case SOAP_HTTP_METHOD: *s = "HTTP method not implemented"; break; case SOAP_EOM: *s = "Out of memory"; break; case SOAP_MOE: *s = "Memory overflow or memory corruption error"; break; case SOAP_HDR: *s = "Header line too long"; break; case SOAP_IOB: *s = "Array index out of bounds"; break; case SOAP_NULL: *s = soap_set_validation_fault(soap, "nil not allowed", NULL); break; case SOAP_DUPLICATE_ID: *s = soap_set_validation_fault(soap, "multiple elements (use the SOAP_XML_TREE flag) with duplicate id ", soap->id); if (soap->version == 2) *soap_faultsubcode(soap) = "SOAP-ENC:DuplicateID"; break; case SOAP_MISSING_ID: *s = soap_set_validation_fault(soap, "missing id for ref ", soap->id); if (soap->version == 2) *soap_faultsubcode(soap) = "SOAP-ENC:MissingID"; break; case SOAP_HREF: *s = soap_set_validation_fault(soap, "incompatible object type id-ref ", soap->id); break; case SOAP_FAULT: break; #ifndef WITH_NOIO case SOAP_UDP_ERROR: *s = "Message too large for UDP packet"; break; case SOAP_TCP_ERROR: *s = tcp_error(soap); break; #endif case SOAP_HTTP_ERROR: *s = "An HTTP processing error occurred"; break; case SOAP_NTLM_ERROR: *s = "An HTTP NTLM authentication error occurred"; break; case SOAP_SSL_ERROR: #ifdef WITH_OPENSSL *s = "SSL/TLS error"; #else *s = "OpenSSL not installed: recompile with -DWITH_OPENSSL"; #endif break; case SOAP_PLUGIN_ERROR: *s = "Plugin registry error"; break; case SOAP_DIME_ERROR: *s = "DIME format error or max DIME size exceeds SOAP_MAXDIMESIZE"; break; case SOAP_DIME_HREF: *s = "DIME href to missing attachment"; break; case SOAP_DIME_MISMATCH: *s = "DIME version/transmission error"; break; case SOAP_DIME_END: *s = "End of DIME error"; break; case SOAP_MIME_ERROR: *s = "MIME format error"; break; case SOAP_MIME_HREF: *s = "MIME href to missing attachment"; break; case SOAP_MIME_END: *s = "End of MIME error"; break; case SOAP_ZLIB_ERROR: #ifdef WITH_ZLIB (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), (soap->d_stream && soap->d_stream->msg ? strlen(soap->d_stream->msg) : 0) + 19), "Zlib/gzip error: '%s'", soap->d_stream && soap->d_stream->msg ? soap->d_stream->msg : SOAP_STR_EOS); *s = soap->msgbuf; #else *s = "Zlib/gzip not installed for (de)compression: recompile with -DWITH_GZIP"; #endif break; case SOAP_REQUIRED: *s = soap_set_validation_fault(soap, "missing required attribute", NULL); break; case SOAP_PROHIBITED: *s = soap_set_validation_fault(soap, "prohibited attribute present", NULL); break; case SOAP_OCCURS: *s = soap_set_validation_fault(soap, "occurrence violation", NULL); break; case SOAP_LENGTH: *s = soap_set_validation_fault(soap, "value range or content length violation", NULL); break; case SOAP_FD_EXCEEDED: *s = "Maximum number of open connections was reached (no define HAVE_POLL): increase FD_SETSIZE"; break; case SOAP_UTF_ERROR: *s = "UTF content encoding error"; break; case SOAP_STOP: *s = "Stopped: no response sent or received (informative)"; break; #endif case SOAP_EOF: #ifndef WITH_NOIO *s = soap_strerror(soap); /* *s = soap->msgbuf */ #ifndef WITH_LEAN if (strlen(soap->msgbuf) + 25 < sizeof(soap->msgbuf)) { soap_memmove((void*)(soap->msgbuf + 25), sizeof(soap->tmpbuf) - 25, (const void*)soap->msgbuf, strlen(soap->msgbuf) + 1); if (soap->is) #if defined(__cplusplus) && !defined(WITH_COMPAT) soap_memcpy((void*)soap->msgbuf, sizeof(soap->msgbuf), (const void*)"End or bad std::istream: ", 25); #else soap_memcpy((void*)soap->msgbuf, sizeof(soap->msgbuf), (const void*)"End at NUL buffer input: ", 25); #endif else soap_memcpy((void*)soap->msgbuf, sizeof(soap->msgbuf), (const void*)"End of file or no input: ", 25); } #endif break; #else *s = "End of file or no input"; break; #endif default: #ifndef WITH_NOHTTP #ifndef WITH_LEAN if (soap->error >= 200 && soap->error < 600) { const char *t = http_error(soap, soap->error); (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), strlen(t) + 54), "Error %d: HTTP %d %s", soap->error, soap->error, t); *s = soap->msgbuf; } else #endif #endif { (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), 26), "Error %d", soap->error); *s = soap->msgbuf; } } } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_send_fault(struct soap *soap) { int status = soap->error; if (status == SOAP_OK || status == SOAP_STOP) return soap_closesock(soap); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Sending back fault struct for error code %d\n", soap->error)); soap->keep_alive = 0; /* to terminate connection */ soap_set_fault(soap); if (soap->error < 200 && soap->error != SOAP_FAULT) soap->header = NULL; if (status != SOAP_EOF || (!soap->recv_timeout && !soap->send_timeout)) { int r = 1; #ifndef WITH_NOIO if (soap->fpoll && soap->fpoll(soap)) r = 0; #ifndef WITH_LEAN else if (soap_valid_socket(soap->socket)) { r = tcp_select(soap, soap->socket, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_SND, 0); if (r > 0) { int t; if (!(r & SOAP_TCP_SELECT_SND) || ((r & SOAP_TCP_SELECT_RCV) && recv(soap->socket, (char*)&t, 1, MSG_PEEK) < 0)) r = 0; } } #endif #endif if (r > 0) { soap->error = SOAP_OK; soap->encodingStyle = NULL; /* no encodingStyle in Faults */ soap_serializeheader(soap); soap_serializefault(soap); (void)soap_begin_count(soap); if (soap->mode & SOAP_IO_LENGTH) { if (soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_putfault(soap) || soap_body_end_out(soap) || soap_envelope_end_out(soap)) return soap_closesock(soap); } (void)soap_end_count(soap); if (soap_response(soap, status) || soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_putfault(soap) || soap_body_end_out(soap) || soap_envelope_end_out(soap) || soap_end_send(soap)) return soap_closesock(soap); } } soap->error = status; return soap_closesock(soap); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_recv_fault(struct soap *soap, int check) { int status = soap->status; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Check (%d) if receiving SOAP Fault (status = %d)\n", check, status)); if (!check) { /* try getfault when no tag or tag mismatched at level 2, otherwise ret */ if (soap->error != SOAP_NO_TAG && (soap->error != SOAP_TAG_MISMATCH || soap->level != 2)) return soap->error; } else if (soap->version == 0) /* check == 1 but no SOAP: do not parse SOAP Fault */ { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Not a SOAP protocol\n")); return SOAP_OK; } soap->error = SOAP_OK; if (soap_getfault(soap)) { /* check flag set: check if SOAP Fault is present, if not just return */ if (check && soap->error == SOAP_TAG_MISMATCH && soap->level == 2) return soap->error = SOAP_OK; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Error: soap_get_soapfault() failed at level %u tag '%s'\n", soap->level, soap->tag)); *soap_faultcode(soap) = (soap->version == 2 ? "SOAP-ENV:Sender" : "SOAP-ENV:Client"); if (status) soap->error = status; else soap->error = status = SOAP_NO_DATA; soap_set_fault(soap); } else { const char *s = *soap_faultcode(soap); if (!soap_match_tag(soap, s, "SOAP-ENV:Server") || !soap_match_tag(soap, s, "SOAP-ENV:Receiver")) status = SOAP_SVR_FAULT; else if (!soap_match_tag(soap, s, "SOAP-ENV:Client") || !soap_match_tag(soap, s, "SOAP-ENV:Sender")) status = SOAP_CLI_FAULT; else if (!soap_match_tag(soap, s, "SOAP-ENV:MustUnderstand")) status = SOAP_MUSTUNDERSTAND; else if (!soap_match_tag(soap, s, "SOAP-ENV:VersionMismatch")) status = SOAP_VERSIONMISMATCH; else { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Received SOAP Fault code %s\n", s)); status = SOAP_FAULT; } if (!soap_body_end_in(soap)) soap_envelope_end_in(soap); } soap_end_recv(soap); soap->error = status; return soap_closesock(soap); } #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_send_empty_response(struct soap *soap, int httpstatuscode) { soap_mode m = soap->omode; if (!(m & SOAP_IO_UDP)) { soap->count = 0; if ((m & SOAP_IO) == SOAP_IO_CHUNK) soap->omode = (m & ~SOAP_IO) | SOAP_IO_BUFFER; soap_response(soap, httpstatuscode); soap_end_send(soap); /* force end of sends */ soap->error = SOAP_STOP; /* stops the server (from returning another response */ soap->omode = m; } return soap_closesock(soap); } #endif #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_recv_empty_response(struct soap *soap) { if (!(soap->omode & SOAP_IO_UDP)) { if (!soap_begin_recv(soap)) { if (soap->body) { if ((soap->status != 400 && soap->status != 500) || soap_envelope_begin_in(soap) || soap_recv_header(soap) || soap_body_begin_in(soap)) { #ifndef WITH_LEAN const char *s = soap_get_http_body(soap, NULL); #endif soap_end_recv(soap); #ifndef WITH_LEAN if (s) soap_set_receiver_error(soap, "HTTP Error", s, soap->status); #endif } else return soap_recv_fault(soap, 1); } else soap_end_recv(soap); } else if (soap->error == SOAP_NO_DATA || soap->error == 200 || soap->error == 202) soap->error = SOAP_OK; } return soap_closesock(soap); } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 static const char* soap_strerror(struct soap *soap) { int err = soap->errnum; *soap->msgbuf = '\0'; if (err) { #ifndef WIN32 # ifdef HAVE_STRERROR_R # ifdef _GNU_SOURCE return strerror_r(err, soap->msgbuf, sizeof(soap->msgbuf)); /* GNU-specific */ # else strerror_r(err, soap->msgbuf, sizeof(soap->msgbuf)); /* XSI-compliant */ # endif # else return strerror(err); # endif #else #ifndef UNDER_CE DWORD len; *soap->msgbuf = '\0'; len = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)soap->msgbuf, (DWORD)sizeof(soap->msgbuf), NULL); #else DWORD i, len; *soap->msgbuf = '\0'; len = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, err, 0, (LPTSTR)soap->msgbuf, (DWORD)(sizeof(soap->msgbuf)/sizeof(TCHAR)), NULL); for (i = 0; i <= len; i++) { if (((TCHAR*)soap->msgbuf)[i] < 0x80) soap->msgbuf[i] = (char)((TCHAR*)soap->msgbuf)[i]; else soap->msgbuf[i] = '?'; } #endif #endif } else { int rt = soap->recv_timeout, st = soap->send_timeout; #ifndef WITH_LEAN int ru = ' ', su = ' '; #endif soap_strcpy(soap->msgbuf, sizeof(soap->msgbuf), "message transfer interrupted"); if (rt || st) soap_strcpy(soap->msgbuf + 28, sizeof(soap->msgbuf) - 28, " or timed out"); #ifndef WITH_LEAN if (rt < 0) { rt = -rt; ru = 'u'; } if (st < 0) { st = -st; su = 'u'; } if (rt) { size_t l = strlen(soap->msgbuf); (SOAP_SNPRINTF(soap->msgbuf + l, sizeof(soap->msgbuf) - l, 36), " (%d%cs recv delay)", rt, ru); } if (st) { size_t l = strlen(soap->msgbuf); (SOAP_SNPRINTF(soap->msgbuf + l, sizeof(soap->msgbuf) - l, 36), " (%d%cs send delay)", st, su); } #endif } return soap->msgbuf; } #endif #endif /******************************************************************************/ #ifndef PALM_2 static int soap_set_error(struct soap *soap, const char *faultcode, const char *faultsubcodeQName, const char *faultstring, const char *faultdetailXML, int soaperror) { *soap_faultcode(soap) = faultcode; if (faultsubcodeQName) *soap_faultsubcode(soap) = faultsubcodeQName; *soap_faultstring(soap) = faultstring; if (faultdetailXML && *faultdetailXML) { const char **s = soap_faultdetail(soap); if (s) *s = faultdetailXML; } return soap->error = soaperror; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_set_sender_error(struct soap *soap, const char *faultstring, const char *faultdetailXML, int soaperror) { return soap_set_error(soap, soap->version == 2 ? "SOAP-ENV:Sender" : soap->version == 1 ? "SOAP-ENV:Client" : "at source", NULL, faultstring, faultdetailXML, soaperror); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_set_receiver_error(struct soap *soap, const char *faultstring, const char *faultdetailXML, int soaperror) { return soap_set_error(soap, soap->version == 2 ? "SOAP-ENV:Receiver" : soap->version == 1 ? "SOAP-ENV:Server" : "is internal", NULL, faultstring, faultdetailXML, soaperror); } #endif /******************************************************************************/ #ifndef PALM_2 static int soap_copy_fault(struct soap *soap, const char *faultcode, const char *faultsubcodeQName, const char *faultstring, const char *faultdetailXML) { char *r = NULL, *s = NULL, *t = NULL; if (faultsubcodeQName) r = soap_strdup(soap, faultsubcodeQName); if (faultstring) s = soap_strdup(soap, faultstring); if (faultdetailXML) t = soap_strdup(soap, faultdetailXML); return soap_set_error(soap, faultcode, r, s, t, SOAP_FAULT); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_sender_fault(struct soap *soap, const char *faultstring, const char *faultdetailXML) { return soap_sender_fault_subcode(soap, NULL, faultstring, faultdetailXML); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_sender_fault_subcode(struct soap *soap, const char *faultsubcodeQName, const char *faultstring, const char *faultdetailXML) { return soap_copy_fault(soap, soap->version == 2 ? "SOAP-ENV:Sender" : soap->version == 1 ? "SOAP-ENV:Client" : "at source", faultsubcodeQName, faultstring, faultdetailXML); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_receiver_fault(struct soap *soap, const char *faultstring, const char *faultdetailXML) { return soap_receiver_fault_subcode(soap, NULL, faultstring, faultdetailXML); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_receiver_fault_subcode(struct soap *soap, const char *faultsubcodeQName, const char *faultstring, const char *faultdetailXML) { return soap_copy_fault(soap, soap->version == 2 ? "SOAP-ENV:Receiver" : soap->version == 1 ? "SOAP-ENV:Server" : "is internal", faultsubcodeQName, faultstring, faultdetailXML); } #endif /******************************************************************************/ #ifndef PALM_2 #ifndef WITH_NOSTDLIB SOAP_FMAC1 void SOAP_FMAC2 soap_print_fault(struct soap *soap, FILE *fd) { if (soap_check_state(soap)) fprintf(fd, "Error: soap struct state not initialized with soap_init\n"); else if (soap->error) { const char **c, *v = NULL, *s, *d; c = soap_faultcode(soap); if (!*c) soap_set_fault(soap); if (soap->version == 2) v = soap_check_faultsubcode(soap); s = *soap_faultstring(soap); d = soap_check_faultdetail(soap); fprintf(fd, "%s%d fault %s [%s]\n\"%s\"\nDetail: %s\n", soap->version ? "SOAP 1." : "Error ", soap->version ? (int)soap->version : soap->error, *c, v ? v : "no subcode", s ? s : "[no reason]", d ? d : "[no detail]"); } } #endif #endif /******************************************************************************/ #ifdef __cplusplus #ifndef WITH_LEAN #ifndef WITH_NOSTDLIB #ifndef WITH_COMPAT SOAP_FMAC1 void SOAP_FMAC2 soap_stream_fault(struct soap *soap, std::ostream& os) { if (soap_check_state(soap)) os << "Error: soap struct state not initialized with soap_init\n"; else if (soap->error) { const char **c, *v = NULL, *s, *d; c = soap_faultcode(soap); if (!*c) soap_set_fault(soap); if (soap->version == 2) v = soap_check_faultsubcode(soap); s = *soap_faultstring(soap); d = soap_check_faultdetail(soap); os << (soap->version ? "SOAP 1." : "Error ") << (soap->version ? (int)soap->version : soap->error) << " fault " << *c << "[" << (v ? v : "no subcode") << "]" << std::endl << "\"" << (s ? s : "[no reason]") << "\"" << std::endl << "Detail: " << (d ? d : "[no detail]") << std::endl; } } #endif #endif #endif #endif /******************************************************************************/ #ifndef WITH_LEAN #ifndef WITH_NOSTDLIB SOAP_FMAC1 char* SOAP_FMAC2 soap_sprint_fault(struct soap *soap, char *buf, size_t len) { if (soap_check_state(soap)) { soap_strcpy(buf, len, "Error: soap struct not initialized with soap_init"); } else if (soap->error) { const char **c, *v = NULL, *s, *d; c = soap_faultcode(soap); if (!*c) soap_set_fault(soap); if (soap->version == 2) v = soap_check_faultsubcode(soap); s = *soap_faultstring(soap); d = soap_check_faultdetail(soap); (SOAP_SNPRINTF(buf, len, strlen(*c) + strlen(v) + strlen(s) + strlen(d) + 72), "%s%d fault %s [%s]\n\"%s\"\nDetail: %s\n", soap->version ? "SOAP 1." : "Error ", soap->version ? (int)soap->version : soap->error, *c, v ? v : "no subcode", s ? s : "[no reason]", d ? d : "[no detail]"); } return buf; } #endif #endif /******************************************************************************/ #ifndef PALM_1 #ifndef WITH_NOSTDLIB SOAP_FMAC1 void SOAP_FMAC2 soap_print_fault_location(struct soap *soap, FILE *fd) { #ifndef WITH_LEAN int i, j, c1, c2; if (soap->error && soap->error != SOAP_STOP && soap->bufidx <= soap->buflen && soap->buflen > 0 && soap->buflen <= sizeof(soap->buf)) { i = (int)soap->bufidx - 1; if (i <= 0) i = 0; c1 = soap->buf[i]; soap->buf[i] = '\0'; if ((int)soap->buflen >= i + 1024) j = i + 1023; else j = (int)soap->buflen - 1; c2 = soap->buf[j]; soap->buf[j] = '\0'; fprintf(fd, "%s%c\n\n", soap->buf, c1); if (soap->bufidx < soap->buflen) fprintf(fd, "%s\n", soap->buf + soap->bufidx); soap->buf[i] = (char)c1; soap->buf[j] = (char)c2; } #else (void)soap; (void)fd; #endif } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_register_plugin_arg(struct soap *soap, int (*fcreate)(struct soap*, struct soap_plugin*, void*), void *arg) { struct soap_plugin *p; int r; if (!(p = (struct soap_plugin*)SOAP_MALLOC(soap, sizeof(struct soap_plugin)))) return soap->error = SOAP_EOM; p->id = NULL; p->data = NULL; p->fcopy = NULL; p->fdelete = NULL; r = fcreate(soap, p, arg); if (!r && p->fdelete) { p->next = soap->plugins; soap->plugins = p; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Registered '%s' plugin\n", p->id)); return SOAP_OK; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not register plugin '%s': plugin returned error %d (or fdelete callback not set)\n", p->id ? p->id : "?", r)); SOAP_FREE(soap, p); return r; } #endif /******************************************************************************/ #ifndef PALM_1 static void * fplugin(struct soap *soap, const char *id) { struct soap_plugin *p; for (p = soap->plugins; p; p = p->next) if (p->id == id || !strcmp(p->id, id)) return p->data; return NULL; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void * SOAP_FMAC2 soap_lookup_plugin(struct soap *soap, const char *id) { return soap->fplugin(soap, id); } #endif /******************************************************************************/ #ifdef __cplusplus } #endif /******************************************************************************\ * * C++ soap struct methods * \******************************************************************************/ #ifdef __cplusplus soap::soap() { soap_init(this); /* no logs to prevent leaks when user calls soap_init() on this context */ soap_set_test_logfile(this, NULL); soap_set_sent_logfile(this, NULL); soap_set_recv_logfile(this, NULL); } #endif /******************************************************************************/ #ifdef __cplusplus soap::soap(soap_mode m) { soap_init1(this, m); } #endif /******************************************************************************/ #ifdef __cplusplus soap::soap(soap_mode im, soap_mode om) { soap_init2(this, im, om); } #endif /******************************************************************************/ #ifdef __cplusplus soap::soap(const struct soap& soap) { soap_copy_context(this, &soap); } #endif /******************************************************************************/ #ifdef __cplusplus struct soap& soap::operator=(const struct soap& soap) { soap_copy_context(this, &soap); return *this; } #endif /******************************************************************************/ #ifdef __cplusplus soap::~soap() { soap_done(this); } #endif /******************************************************************************/ gsoap-2.8.28/gsoap/VisualStudio2005/wsdl2h/wsdl2h/stdsoap2.h0000644000175000017500000042137712653650160022677 0ustar ellertellert/* stdsoap2.h 2.8.28 gSOAP runtime engine gSOAP XML Web services tools Copyright (C) 2000-2016, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under ONE of the following licenses: GPL, or the gSOAP public license, or Genivia's license for commercial use. -------------------------------------------------------------------------------- Contributors: Wind River Systems, Inc., for the following additions - vxWorks compatible -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2014, Robert van Engelen, Genivia Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #define GSOAP_VERSION 20828 #ifdef WITH_SOAPDEFS_H # include "soapdefs.h" /* include user-defined stuff in soapdefs.h */ #endif #ifndef _THREAD_SAFE # define _THREAD_SAFE #endif #ifndef OPENSERVER # ifndef _REENTRANT # define _REENTRANT # endif #endif #ifndef SOAP_FMAC1 /* stdsoap2.h declaration macro */ # define SOAP_FMAC1 #endif #ifndef SOAP_FMAC2 /* stdsoap2.h declaration macro */ # define SOAP_FMAC2 #endif #ifndef SOAP_FMAC3 /* (de)serializer declaration macro */ # define SOAP_FMAC3 #endif #ifndef SOAP_FMAC3S /* string converter for (de)serializer declaration macro */ # define SOAP_FMAC3S SOAP_FMAC3 #endif #ifndef SOAP_FMAC4 /* (de)serializer declaration macro */ # define SOAP_FMAC4 #endif #ifndef SOAP_FMAC4S /* string converter for (de)serializer declaration macro */ # define SOAP_FMAC4S SOAP_FMAC4 #endif #ifndef SOAP_FMAC5 /* stub/skeleton declaration macro */ # define SOAP_FMAC5 #endif #ifndef SOAP_FMAC6 /* stub/skeleton declaration macro */ # define SOAP_FMAC6 #endif #ifndef SOAP_CMAC /* class declaration macro */ # define SOAP_CMAC #endif #ifndef SOAP_NMAC /* namespace table declaration macro */ # define SOAP_NMAC #endif #ifndef SOAP_SOURCE_STAMP # define SOAP_SOURCE_STAMP(str) #endif #ifndef STDSOAP_H #define STDSOAP_H #define SOAP_XSTRINGIFY(s) SOAP_STRINGIFY(s) #define SOAP_STRINGIFY(s) #s #ifdef SOAPDEFS_H # include SOAP_XSTRINGIFY(SOAPDEFS_H) /* include user-defined "SOAPDEFS_H" */ #endif #if defined(__vxworks) || defined(__VXWORKS__) # ifndef VXWORKS # define VXWORKS # endif #endif #ifdef _WIN32 # ifndef WIN32 # define WIN32 # endif #endif /* for legacy purposes we use WIN32 macro, even when WIN64 is supported */ #ifdef _WIN64 # ifndef WIN32 # define WIN32 # endif #endif #ifdef _WIN32_WCE # ifndef UNDER_CE # define UNDER_CE _WIN32_WCE # endif #endif #ifdef UNDER_CE # ifndef WIN32 # define WIN32 # endif #endif #ifdef __BORLANDC__ # ifdef __WIN32__ # ifndef WIN32 # define WIN32 # endif # endif #endif #ifdef __CYGWIN__ # ifndef CYGWIN # define CYGWIN # endif #endif #ifdef __SYMBIAN32__ # define SYMBIAN # undef WIN32 #endif #if defined(__palmos__) || defined(PALM_GCC) || defined(__PALMOS_TRAPS__) # ifndef PALM # define PALM # endif #endif #if defined(__hpux) # ifndef HP_UX # define HP_UX # endif #endif #if defined(__digital__) && defined(__unix__) # ifndef TRU64 # define TRU64 # endif #endif #ifdef __MVS__ # ifndef OS390 # define OS390 # endif #endif #if defined(__sun) && defined(__SVR4) # ifndef SUN_OS # define SUN_OS # endif #endif #ifdef HAVE_CONFIG_H # include "config.h" # if defined(WITH_OPENSSL) # ifndef HAVE_OPENSSL_SSL_H # undef WITH_OPENSSL # endif # endif # if defined(WITH_GNUTLS) # ifndef HAVE_GNUTLS_GNUTLS_H # undef WITH_GNUTLS # endif # endif # if defined(WITH_ZLIB) || defined(WITH_GZIP) # ifndef HAVE_ZLIB_H # undef WITH_ZLIB # undef WITH_GZIP # endif # endif #else # if defined(UNDER_CE) # define SOAP_BUFLEN (2048) # define SOAP_PTRHASH (32) # define SOAP_IDHASH (19) # define SOAP_BLKLEN (32) # define SOAP_TAGLEN (128) # define SOAP_HDRLEN (1024) # define SOAP_MAXDIMS (4) # define HAVE_SSCANF # elif defined(WIN32) # if _MSC_VER >= 1400 # define HAVE_SNPRINTF # endif # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOD_L # define HAVE_SPRINTF_L # define HAVE_STRTOL # define HAVE_STRTOUL # if _MSC_VER >= 1300 # define HAVE_STRTOLL /* use _strtoi64 */ # define HAVE_STRTOULL /* use _strtoui64 */ # endif # define HAVE_SYS_TIMEB_H # define HAVE_FTIME # define HAVE_GMTIME # define HAVE_WCTOMB # define HAVE_MBTOWC # define SOAP_LONG_FORMAT "%I64d" # define SOAP_ULONG_FORMAT "%I64u" # elif defined(CYGWIN) # define HAVE_POLL # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_SYS_TIMEB_H # define HAVE_FTIME # define HAVE_RAND_R # define HAVE_GMTIME_R # define HAVE_LOCALTIME_R # define HAVE_STRERROR_R # define HAVE_WCTOMB # define HAVE_MBTOWC # elif defined(__APPLE__) # define HAVE_POLL # define HAVE_SNPRINTF # define HAVE_STRLCPY # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOD_L # define HAVE_SSCANF_L # define HAVE_SPRINTF_L # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_STRTOLL # define HAVE_STRTOULL # define HAVE_RAND_R # define HAVE_GMTIME_R # define HAVE_TM_GMTOFF # define HAVE_GETTIMEOFDAY # define HAVE_LOCALTIME_R # define HAVE_STRERROR_R # define HAVE_TIMEGM # define HAVE_WCTOMB # define HAVE_MBTOWC # define HAVE_INTTYPES_H # elif defined(_AIX43) # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_SYS_TIMEB_H # define HAVE_FTIME # define HAVE_RAND_R # define HAVE_GMTIME_R # define HAVE_LOCALTIME_R # define HAVE_WCTOMB # define HAVE_MBTOWC # elif defined(_AIX41) # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_SYS_TIMEB_H # define HAVE_WCTOMB # define HAVE_MBTOWC # elif defined(HP_UX) # include extern intmax_t __strtoll(const char*, char**, int); extern intmax_t __strtoull(const char*, char**, int); # define strtoll __strtoll # define strtoull __strtoull # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_STRTOLL # define HAVE_STRTOULL # define HAVE_SYS_TIMEB_H # define HAVE_FTIME # define HAVE_RAND_R # define HAVE_GMTIME_R # define HAVE_LOCALTIME_R # define HAVE_WCTOMB # define HAVE_MBTOWC # define HAVE_ISNAN # elif defined(FREEBSD) || defined(__FreeBSD__) || defined(OPENBSD) # define HAVE_POLL # define HAVE_SNPRINTF # define HAVE_STRLCPY # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOD_L # define HAVE_SSCANF_L # define HAVE_SPRINTF_L # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_STRTOLL # define HAVE_STRTOULL # define HAVE_GETTIMEOFDAY # define HAVE_RAND_R # define HAVE_GMTIME_R # define HAVE_LOCALTIME_R # define HAVE_STRERROR_R # define HAVE_WCTOMB # define HAVE_MBTOWC # define SOAP_LONG_FORMAT "%qd" # define SOAP_ULONG_FORMAT "%qu" # define HAVE_ISNAN # define HAVE_ISINF # elif defined(__VMS) # include # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_SYS_TIMEB_H # define HAVE_FTIME # define HAVE_RAND_R # define HAVE_GMTIME_R # define HAVE_LOCALTIME_R # define HAVE_WCTOMB # define HAVE_MBTOWC # elif defined(__GLIBC__) || defined(__GNU__) # define HAVE_POLL # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOD_L # define HAVE_SSCANF_L # define HAVE_SPRINTF_L # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_STRTOLL # define HAVE_STRTOULL # define HAVE_SYS_TIMEB_H # define HAVE_FTIME # define HAVE_RAND_R # define HAVE_GMTIME_R # define HAVE_LOCALTIME_R # define HAVE_STRERROR_R # define HAVE_TIMEGM # define HAVE_WCTOMB # define HAVE_MBTOWC # define HAVE_ISNAN # define HAVE_ISINF # elif defined(TRU64) # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_GETTIMEOFDAY # define HAVE_SYS_TIMEB_H # define HAVE_RAND_R # define HAVE_GMTIME_R # define HAVE_LOCALTIME_R # define __USE_STD_IOSTREAM # define HAVE_WCTOMB # define HAVE_MBTOWC # define SOAP_LONG_FORMAT "%ld" # define SOAP_ULONG_FORMAT "%lu" # elif defined(MAC_CARBON) # define WITH_NOIO # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOD_L # define HAVE_SSCANF_L # define HAVE_SPRINTF_L # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_FTIME # define HAVE_RAND_R # define HAVE_GETHOSTBYNAME_R # define HAVE_GMTIME_R # define HAVE_LOCALTIME_R # define HAVE_STRERROR_R # define HAVE_WCTOMB # define HAVE_MBTOWC # elif defined(PALM) # define WITH_LEAN # define HAVE_STRTOD /* strtod() is defined in palmFunctions.h */ # include /* Needs to be included before unix headers */ # include # define IGNORE_STDIO_STUBS # include # define O_NONBLOCK FNONBIO # include # include "palmFunctions.h" # elif defined(SYMBIAN) # define WITH_LEAN # define WITH_NONAMESPACES # define HAVE_STRTOD /* use STRTOD since sscanf doesn't seem to work */ # include # include # elif defined(VXWORKS) # ifdef _WRS_KERNEL # define _POSIX_THREADS 1 # endif # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_GMTIME # define HAVE_LOCALTIME # define HAVE_MKTIME # elif defined(OS390) # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_SYS_TIMEB_H # define HAVE_FTIME # define HAVE_RAND_R # define HAVE_GMTIME_R # define HAVE_LOCALTIME_R # define HAVE_WCTOMB # define HAVE_MBTOWC # elif defined(AS400) # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_SYS_TIMEB_H # define HAVE_FTIME # define HAVE_RAND_R # define HAVE_GMTIME_R # define HAVE_LOCALTIME_R # define HAVE_WCTOMB # define HAVE_MBTOWC # elif defined(__QNX__) || defined(QNX) /* QNX does not have a working version of strtof */ # undef HAVE_STRTOF # define HAVE_POLL # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_STRTOLL # define HAVE_STRTOULL # define HAVE_SYS_TIMEB_H # define HAVE_FTIME # define HAVE_RAND_R # define HAVE_GETHOSTBYNAME_R # define HAVE_GMTIME_R # define HAVE_LOCALTIME_R # define HAVE_STRERROR_R # define HAVE_WCTOMB # define HAVE_MBTOWC # elif defined(SUN_OS) # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_SYS_TIMEB_H # define HAVE_FTIME # define HAVE_RAND_R # define HAVE_GETHOSTBYNAME_R # define HAVE_GMTIME_R # define HAVE_LOCALTIME_R # else /* Default assumptions for supported library functions when not including config.h */ # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_STRTOLL # define HAVE_STRTOULL # define HAVE_SYS_TIMEB_H # define HAVE_FTIME # define HAVE_RAND_R # define HAVE_GETHOSTBYNAME_R # define HAVE_GMTIME_R # define HAVE_LOCALTIME_R # define HAVE_STRERROR_R # ifdef MB_LEN_MAX # define HAVE_WCTOMB # define HAVE_MBTOWC # endif # endif #endif #ifdef WITH_LEANER # ifndef WITH_LEAN # define WITH_LEAN # endif #endif /* gSOAP 2.7.15 and higher: always use FAST and retain CDATA in literal XML, unless WITH_LEAN or WITH_NOCDATA */ #ifndef WITH_LEAN # ifndef WITH_FAST # define WITH_FAST # endif # ifndef WITH_NOCDATA # ifndef WITH_CDATA # define WITH_CDATA # endif # endif #endif #ifdef WITH_LEAN # ifdef WITH_COOKIES # error "Cannot build WITH_LEAN code WITH_COOKIES enabled" # endif #endif /* allowing empty struct/union in C is a GNU extension */ #if !defined(__GNU__) # define WITH_NOEMPTYSTRUCT #endif /* silence clang's C99 variadic macro warnings */ #ifdef __clang__ # pragma clang diagnostic ignored "-Wvariadic-macros" #endif #ifdef WITH_PURE_VIRTUAL # define SOAP_PURE_VIRTUAL = 0 #else # define SOAP_PURE_VIRTUAL #endif /* older OpenVMS TCP/IP stacks cannot handle 65536 bytes */ #ifdef __VMS # ifndef SOAP_BUFLEN # define SOAP_BUFLEN (65535) # endif #endif /* if we have xlocale.h then we can use it WITH_C_LOCALE enabled to avoid decimal point conversion issues */ #ifdef WITH_C_LOCALE # ifdef WIN32 # include # define SOAP_LOCALE(soap) ((soap)->c_locale ? (soap)->c_locale : ((soap)->c_locale = _create_locale(LC_ALL, "C"))) # else # include # define SOAP_LOCALE(soap) ((soap)->c_locale ? (soap)->c_locale : ((soap)->c_locale = newlocale(LC_ALL_MASK, "C", NULL))) # endif #else # undef HAVE_STRTOF_L # undef HAVE_STRTOD_L # undef HAVE_SSCANF_L # undef HAVE_SPRINTF_L #endif #ifdef TANDEM_NONSTOP /* Support for Guardian */ # define SOAP_BUFLEN (32767) /*# define WITH_NOSTDLIB */ /* uncommment to remove stdlib dependences */ # define WITH_NOIO /* no IO dependences, e.g. remove TCP/IP */ # define int32_t int # define int64_t long long # define LONG64 long long # define ULONG64 long long # define DBL_PINFTY (1.1579208923716189e77) # undef HAVE_WCTOMB # undef HAVE_MBTOWC # undef HAVE_GMTIME_R # undef HAVE_LOCALTIME_R # undef HAVE_SNPRINTF # define SOAP_BUFLEN (32767) # define SOAP_SOCKET short #pragma nolist # include # include # include # include # include # include # include # include # include # include # include # define INET_ERROR 4294967295 #pragma list #elif defined(__TANDEM) /* Support for OSS */ # define int32_t int # define SOAP_BUFLEN (32767) #endif #ifndef WITH_NOSTDLIB # include # ifndef PALM # include # include # endif # if !defined(HAVE_CONFIG_H) || defined(HAVE_CTYPE_H) # include # endif # if !defined(HAVE_CONFIG_H) || defined(HAVE_LIMITS_H) # include /* for MB_LEN_MAX */ # endif # if !defined(HAVE_CONFIG_H) || defined(HAVE_FLOAT_H) # include /* for INFINITY */ # endif # if !defined(HAVE_CONFIG_H) || defined(HAVE_MATH_H) # ifndef PALM # include /* for isnan() and isinf() */ # endif # endif #endif #ifdef WITH_NTLM # include #endif #ifdef HAVE_POLL # include #endif #if defined(__cplusplus) # include # include # if !defined(WITH_LEAN) && !defined(WITH_COMPAT) # include # include # endif #endif #ifdef WITH_NOHTTP # ifndef WITH_NOIO # define WITH_NOIO # undef WITH_COOKIES # endif #endif /* Suggestion when SOAP_FD_EXCEEDED error occurs: Some systems allow increasing FD_SETSIZE before including sys/types.h: #define FD_SETSIZE (2048) */ #ifndef UNDER_CE # ifndef PALM # ifndef WITH_NOIO # include # include # endif # ifndef WITH_LEAN # ifdef HAVE_SYS_TIMEB_H # include /* for ftime() */ # endif # include # endif # endif #endif #ifdef OPENSERVER # include # include # include extern int h_errno; #endif #ifndef WITH_NOIO # ifndef WIN32 # ifndef PALM # include # ifdef VXWORKS # include # include # ifndef _WRS_KERNEL # include # endif # else # ifndef SYMBIAN # include # endif # endif # ifdef SUN_OS # include /* SUN */ # include /* only needed with SUN < 2.8 ? */ # endif # ifdef VXWORKS # ifdef _WRS_KERNEL # include # endif # else # include # endif # include # ifdef OS390 # include # else # include /* TCP_NODELAY, TCP_FASTOPEN */ # endif # include # endif # endif #endif #ifdef WIN32 # define SOAP_WINSOCKINT int #else # define SOAP_WINSOCKINT size_t #endif #if defined(WITH_IPV6_V6ONLY) || defined(WITH_NO_IPV6_V6ONLY) # ifndef WITH_IPV6 # define WITH_IPV6 # endif #endif #ifdef WIN32 # ifndef UNDER_CE # include # include # endif // When you get macro redefinition errors when compiling the code below, then: // a) try arrange your includes so is included after "stdsoap2.h" // b) or define _WINSOCKAPI_ first: // #define _WINSOCKAPI_ // stops windows.h including winsock.h // #include // #include "stdsoap2.h" // c) or compile with the -DWIN32_LEAN_AND_MEAN switch # include // Visual Studio 2005 users: install Platform SDK (R2) # include // # define _WSPIAPI_COUNTOF // DEV NOTE: enble to fix problems with VC6 // # include # include // DEV NOTE: replaces older wspiapi.h above # ifdef WITH_IPV6 # define SOAP_GAI_STRERROR gai_strerrorA # endif #else # ifdef VXWORKS # include # include # include # endif # ifndef WITH_NOIO # ifndef PALM # include # include # include # include # ifdef _AIX41 # include # endif # endif # endif #endif #ifdef WITH_FASTCGI # include #endif #ifdef WITH_OPENSSL # ifdef __VMS # pragma names save # pragma names uppercase # endif # undef WITH_GNUTLS # define OPENSSL_NO_KRB5 # include # include # include # include # include # ifndef ALLOW_OLD_VERSIONS # if (OPENSSL_VERSION_NUMBER < 0x00905100L) # error "Must use OpenSSL 0.9.6 or later" # endif # endif # ifdef __VMS # pragma names restore # endif #endif #ifdef WITH_GNUTLS # include # include # include # ifndef HAVE_PTHREAD_H # ifdef _POSIX_THREADS # define HAVE_PTHREAD_H /* make GNUTLS thread safe */ # endif # endif #endif #ifdef WITH_SYSTEMSSL # include #endif #ifdef WITH_GZIP # ifndef WITH_ZLIB # define WITH_ZLIB # endif #endif #ifdef WITH_CASEINSENSITIVETAGS # define SOAP_STRCMP soap_tag_cmp /* case insensitve XML element/attribute names */ #else # define SOAP_STRCMP strcmp /* case sensitive XML element/attribute names */ #endif #ifdef WITH_ZLIB # include #endif /* #define DEBUG */ /* Uncomment to debug sending (in file SENT.log) receiving (in file RECV.log) and internal operations (in file TEST.log) */ /* #define DEBUG_STAMP */ /* Uncomment to debug sending (in file SENT.log) receiving (in file RECV.log) and time-stamped operations (in file TEST.log) */ #ifdef __cplusplus extern "C" { #endif /* Portability (X/Open, BSD sockets etc): define SOAP_SOCKLEN_T as socklen_t or int or ... */ #if defined(_AIX) || defined(AIX) # if defined(_AIX43) # define SOAP_SOCKLEN_T socklen_t # else # define SOAP_SOCKLEN_T int # endif #elif defined(SOCKLEN_T) # define SOAP_SOCKLEN_T SOCKLEN_T #elif defined(__socklen_t_defined) || defined(_SOCKLEN_T) || defined(CYGWIN) || defined(FREEBSD) || defined(__FreeBSD__) || defined(OPENBSD) || defined(__QNX__) || defined(QNX) || defined(OS390) || defined(__ANDROID__) || defined(_XOPEN_SOURCE) # define SOAP_SOCKLEN_T socklen_t #elif defined(IRIX) || defined(WIN32) || defined(__APPLE__) || defined(SUN_OS) || defined(OPENSERVER) || defined(TRU64) || defined(VXWORKS) || defined(HP_UX) # define SOAP_SOCKLEN_T int #elif !defined(SOAP_SOCKLEN_T) # define SOAP_SOCKLEN_T size_t #endif /* AIX DCE threads portability: define SOAP_FUNC_R_ERR gmtime_r and localtime_r err ret val as -1 */ #ifdef _AIX32_THREADS # define SOAP_FUNC_R_ERR (-1) #elif !defined(SOAP_FUNC_R_ERR) # define SOAP_FUNC_R_ERR (NULL) #endif #ifndef SOAP_SOCKET # ifdef WIN32 # define SOAP_SOCKET SOCKET # define soap_closesocket(n) closesocket(n) # else # define SOAP_SOCKET int # define soap_closesocket(n) close(n) # endif #endif #define SOAP_INVALID_SOCKET ((SOAP_SOCKET)-1) #define soap_valid_socket(n) ((n) != SOAP_INVALID_SOCKET) #define SOAP_SHUT_WR (1) #define SOAP_SHUT_RDWR (2) #ifndef SOAP_GAI_STRERROR # define SOAP_GAI_STRERROR gai_strerror #endif #ifndef FD_SETSIZE # define FD_SETSIZE (1024) #endif #ifdef WITH_LEAN # define SOAP_CHK_EOF SOAP_EOF #else # define SOAP_CHK_EOF (soap->error ? soap->error : SOAP_EOF) #endif #ifdef __cplusplus # ifndef __STDC_FORMAT_MACROS # define __STDC_FORMAT_MACROS # endif #endif #if defined(SYMBIAN) # define LONG64 long # define ULONG64 unsigned LONG64 #elif !defined(__cplusplus) && defined(__STDC__) && !defined(__STDC_VERSION__) /* C90? */ # define LONG64 long # define ULONG64 unsigned LONG64 # ifndef SOAP_LONG_FORMAT # define SOAP_LONG_FORMAT "%ld" # endif # ifndef SOAP_ULONG_FORMAT # define SOAP_ULONG_FORMAT "%lu" # endif # undef HAVE_STRTOLL # undef HAVE_STRTOULL #elif !defined(WIN32) || defined(CYGWIN) || defined(__GLIBC__) || defined(__GNU__) # ifndef LONG64 # if defined(HAVE_INTTYPES_H) # ifdef HAVE_STDINT_H # include # endif # include # define LONG64 int64_t # define ULONG64 uint64_t # elif defined(HAVE_SYS_INTTYPES_H) # include # define LONG64 int64_t # define ULONG64 uint64_t # elif defined(HAVE_STDINT_H) # include # define LONG64 int64_t # define ULONG64 uint64_t # elif defined(__GLIBC__) # include # if (__WORDSIZE == 64) # define LONG64 int64_t # define ULONG64 uint64_t # ifndef SOAP_LONG_FORMAT # define SOAP_LONG_FORMAT "%ld" # endif # ifndef SOAP_ULONG_FORMAT # define SOAP_ULONG_FORMAT "%lu" # endif # else # define LONG64 long long # define ULONG64 unsigned LONG64 # endif # else # define LONG64 long long # define ULONG64 unsigned LONG64 # endif # endif #elif defined(UNDER_CE) # define LONG64 __int64 # define ULONG64 unsigned LONG64 #elif defined(__BORLANDC__) # define LONG64 __int64 # define ULONG64 unsigned LONG64 #endif #ifdef PRId64 # ifndef SOAP_LONG_FORMAT # define SOAP_LONG_FORMAT "%" PRId64 # endif #endif #ifdef PRIu64 # ifndef SOAP_ULONG_FORMAT # define SOAP_ULONG_FORMAT "%" PRIu64 # endif #endif #ifndef SOAP_LONG_FORMAT # define SOAP_LONG_FORMAT "%lld" /* printf format for 64 bit ints */ #endif #ifndef SOAP_ULONG_FORMAT # define SOAP_ULONG_FORMAT "%llu" /* printf format for unsigned 64 bit ints */ #endif #if defined(WIN32) && !defined(CYGWIN) # define soap_int32 __int32 #elif defined(SYMBIAN) # define soap_int32 long #elif defined(PALM) # define soap_int32 Int32 #elif defined(_AIX) || defined(AIX) # if defined(_AIX43) # define soap_int32 int32_t # else # define soap_int32 signed int # endif #else # define soap_int32 int32_t #endif #ifdef WIN32 # define SOAP_ERANGE ERANGE # define SOAP_EINTR WSAEINTR # define SOAP_EAGAIN WSAEWOULDBLOCK # define SOAP_EWOULDBLOCK WSAEWOULDBLOCK # define SOAP_EINPROGRESS WSAEINPROGRESS # define SOAP_EADDRINUSE WSAEADDRINUSE # define SOAP_ECONNREFUSED WSAECONNREFUSED #else # ifdef ERANGE # define SOAP_ERANGE ERANGE # else # define SOAP_ERANGE (34) # endif # define SOAP_EINTR EINTR # define SOAP_EAGAIN EAGAIN # define SOAP_EADDRINUSE EADDRINUSE # define SOAP_ECONNREFUSED ECONNREFUSED # ifdef SYMBIAN # define SOAP_EWOULDBLOCK 9898 # define SOAP_EINPROGRESS 9899 # else # define SOAP_EWOULDBLOCK EWOULDBLOCK # define SOAP_EINPROGRESS EINPROGRESS # endif #endif #ifdef WIN32 # ifdef UNDER_CE # define soap_errno GetLastError() # define soap_socket_errno(s) GetLastError() # define soap_reset_errno SetLastError(0) # else # define soap_errno GetLastError() # define soap_socket_errno(s) WSAGetLastError() # define soap_reset_errno SetLastError(0) # endif #else # ifndef WITH_NOIO # define soap_errno errno # define soap_socket_errno(s) errno # define soap_reset_errno (errno = 0) # else # define soap_errno 0 # define soap_socket_errno(s) 0 # define soap_reset_errno # endif #endif #ifndef SOAP_BUFLEN # if !defined(WITH_LEAN) # define SOAP_BUFLEN (65536) /* buffer length for socket packets, also used by gethostbyname_r and UDP messages, so don't make this too small */ # else # define SOAP_BUFLEN (2048) /* lean size */ # endif #endif #ifndef SOAP_LABLEN # define SOAP_LABLEN (256) /* initial look-aside buffer length */ #endif #ifndef SOAP_PTRBLK # define SOAP_PTRBLK (32) /* block allocation for pointer hash table chains */ #endif #ifndef SOAP_PTRHASH # ifndef WITH_LEAN # define SOAP_PTRHASH (4096) /* size of pointer analysis hash table (must be power of 2) */ # else # define SOAP_PTRHASH (32) # endif #endif #ifndef SOAP_IDHASH # ifndef WITH_LEAN # define SOAP_IDHASH (1999) /* prime size of hash table for parsed id/ref */ # else # define SOAP_IDHASH (19) /* 19, 199 */ # endif #endif #ifndef SOAP_BLKLEN # ifndef WITH_LEAN # define SOAP_BLKLEN (256) /* to collect long strings and XML attributes */ # else # define SOAP_BLKLEN (32) # endif #endif #ifndef SOAP_TAGLEN # ifndef WITH_LEAN # define SOAP_TAGLEN (1024) /* maximum length of XML element tag/attribute name or host/path name + 1 */ # else # define SOAP_TAGLEN (128) # endif #endif #ifndef SOAP_HDRLEN # ifndef WITH_LEAN # define SOAP_HDRLEN (8192) /* maximum length of HTTP header line (must be >4096 to read cookies) */ # else # define SOAP_HDRLEN (1024) # endif #endif #ifndef SOAP_TMPLEN # ifndef WITH_LEAN # define SOAP_TMPLEN (1024) /* maximum length of msgbuf and tmpbuf short message buffers, must be >=1024 */ # else # define SOAP_TMPLEN (1024) # endif #endif #ifndef SOAP_MAXDIMS # ifndef WITH_LEAN # define SOAP_MAXDIMS (16) /* maximum array dimensions (array nestings) must be less than 64 to protect soap->tmpbuf */ # else # define SOAP_MAXDIMS (4) # endif #endif #ifndef SOAP_MAXPTRS # ifndef WITH_LEAN # define SOAP_MAXPTRS (4) /* maximum depth + 1 of id-ref deserialized pointer types (int* has depth 0, int*** has depth 2) */ # else # define SOAP_MAXPTRS (2) # endif #endif #ifndef SOAP_MAXLOGS # define SOAP_MAXLOGS (3) /* max number of debug logs per struct soap environment */ # define SOAP_INDEX_RECV (0) # define SOAP_INDEX_SENT (1) # define SOAP_INDEX_TEST (2) #endif /* Tag name of multiref elements in SOAP 1.1 encoding */ #ifndef SOAP_MULTIREFTAG # define SOAP_MULTIREFTAG "id" #endif /* href-id value base name in multiref SOAP encoding */ #ifndef SOAP_BASEREFNAME # define SOAP_BASEREFNAME "_" #endif /* Max number of EINTR while poll/select on a socket */ /* Each EINTR can lengthen the I/O blocking time by at most one second */ #ifndef SOAP_MAXEINTR # define SOAP_MAXEINTR (10) #endif /* SOAP_MAXKEEPALIVE: Max iterations in soap_serve() to keep server connection alive */ #ifndef SOAP_MAXKEEPALIVE # define SOAP_MAXKEEPALIVE (100) #endif /* SOAP_MAXARRAYSIZE: Trusted total max size of an inbound SOAP Array. Arrays of larger size are not pre-allocated, but deserialized on an element-by-element basis. */ #ifndef SOAP_MAXARRAYSIZE # define SOAP_MAXARRAYSIZE (100000) #endif /* SOAP_MAXDIMESIZE: Trusted max size of inbound DIME data. Increase if necessary to allow larger attachments, or decrease when server resources are limited. */ #ifndef SOAP_MAXDIMESIZE # define SOAP_MAXDIMESIZE (8*1048576) /* 8 MB */ #endif /* SOAP_MAXINFLATESIZE: Trusted inflated content size. Larger content is subject to the SOAP_MINDEFLATERATIO constraint. If SOAP_MINDEFLATERATIO is 1.0, SOAP_MAXINFLATESIZE is always the max size of uncompressed content. */ #ifndef SOAP_MAXINFLATESIZE # define SOAP_MAXINFLATESIZE (1*1048576) /* 1 MB */ #endif /* SOAP_MINDEFLATERATIO: Trusted deflation ratio after SOAP_MAXINFLATESIZE is reached. Trust when compressed / deflated > SOAP_MINDEFLATERATIO Sets a ratio > 0.00096899224806 (1032:1) According to the zlib site: the limit (1032:1) comes from the fact that one length/distance pair can represent at most 258 output bytes. A length requires at least one bit and a distance requires at least one bit, so two bits in can give 258 bytes out, or eight bits in give 1032 bytes out. A dynamic block has no length restriction, so you could get arbitrarily close to the limit of 1032:1. */ #ifndef SOAP_MINDEFLATERATIO # define SOAP_MINDEFLATERATIO (0.001) /* ratio of deflated/inflated > 0.1% */ #endif #ifdef VXWORKS # ifdef WMW_RPM_IO # include "httpLib.h" # endif # ifdef __INCmathh # include # ifndef HAVE_ISNAN # define HAVE_ISNAN # endif # ifndef soap_isnan # define soap_isnan(num) isNan(num) # endif # endif # ifdef WM_SECURE_KEY_STORAGE # include # endif #endif #ifdef WIN32 # ifndef HAVE_ISNAN # define HAVE_ISNAN # endif # define soap_isnan(n) _isnan(n) # ifndef HAVE_ISINF # define HAVE_ISINF # endif # define soap_isinf(n) (!_finite(n)) #endif #ifdef SUN_OS # define HAVE_ISNAN #endif #ifdef __APPLE__ # ifdef __cplusplus # ifndef isnan extern "C" int isnan(double); extern "C" int isinf(double); # endif # endif # ifndef HAVE_ISNAN # define HAVE_ISNAN # endif # ifndef HAVE_ISINF # define HAVE_ISINF # endif #endif #if !defined(HAVE_ISNAN) && (defined(_MATH_H) || defined(_MATH_INCLUDED)) # define HAVE_ISNAN #endif union soap_double_nan {struct {unsigned int n1, n2;} iv; double dv; float fv;}; extern const union soap_double_nan soap_double_nan; extern const char soap_base64o[], soap_base64i[]; #ifdef VXWORKS # ifndef FLT_MAX # define FLT_MAX _ARCH_FLT_MAX # endif # ifndef DBL_MAX # define DBL_MAX _ARCH_DBL_MAX # endif #endif #ifndef FLT_NAN # define FLT_NAN (soap_double_nan.fv) #endif #ifndef FLT_PINFTY # if defined(INFINITY) # define FLT_PINFTY INFINITY # elif defined(FLT_MAX) # define FLT_PINFTY FLT_MAX # elif defined(HUGE_VALF) # define FLT_PINFTY (float)HUGE_VALF # elif defined(HUGE_VAL) # define FLT_PINFTY (float)HUGE_VAL # elif defined(FLOAT_MAX) # define FLT_PINFTY FLOAT_MAX # else # define FLT_PINFTY (3.40282347e+38F) # endif #endif #ifndef FLT_NINFTY # define FLT_NINFTY (-FLT_PINFTY) #endif #ifndef DBL_NAN # define DBL_NAN (soap_double_nan.dv) #endif #ifndef DBL_PINFTY # if defined(INFINITY) # define DBL_PINFTY INFINITY # elif defined(DBL_MAX) # define DBL_PINFTY DBL_MAX # elif defined(HUGE_VALF) # define DBL_PINFTY (double)HUGE_VALF # elif defined(HUGE_VAL) # define DBL_PINFTY (double)HUGE_VAL # elif defined(DOUBLE_MAX) # define DBL_PINFTY DOUBLE_MAX # else # define DBL_PINFTY (1.7976931348623157e+308) # endif #endif #ifndef DBL_NINFTY # define DBL_NINFTY (-DBL_PINFTY) #endif #ifndef soap_isnan # ifdef HAVE_ISNAN # define soap_isnan(n) isnan(n) # else # define soap_isnan(n) ((n) != (n)) # endif #endif #ifndef soap_isinf # ifdef HAVE_ISINF # define soap_isinf(n) isinf(n) # else # define soap_isinf(n) (!soap_isnan(n) && soap_isnan((n) - (n))) # endif #endif #define soap_ispinfd(n) ((n) > 0 && soap_isinf(n)) #define soap_ispinff(n) ((n) > 0 && soap_isinf(n)) #define soap_isninfd(n) ((n) < 0 && soap_isinf(n)) #define soap_isninff(n) ((n) < 0 && soap_isinf(n)) /* Safer str & mem functions */ /* The gSOAP code uses guards to ensure that these functions are well behaved and do not raise errors. Therefore, the WIN _s functions should never execute the "invalid parameter handler". */ /* use safer snprintf if possible or guard sprintf against overrun (assumes no variadic macros) */ # ifdef HAVE_SNPRINTF # if _MSC_VER >= 1400 # define SOAP_SNPRINTF(buf, len, num) void)_snprintf_s((buf), (len), _TRUNCATE # define SOAP_SNPRINTF_SAFE(buf, len) void)_snprintf_s((buf), (len), _TRUNCATE # else # define SOAP_SNPRINTF(buf, len, num) void)snprintf((buf), (len) # define SOAP_SNPRINTF_SAFE(buf, len) void)snprintf((buf), (len) # endif # else # define SOAP_SNPRINTF(buf, len, num) (len) <= (num)) ? (void)((buf)[0] = '\0') : (void)sprintf((buf) # define SOAP_SNPRINTF_SAFE(buf, len) void)sprintf((buf) # endif /* copy string (truncating the result) */ #if _MSC_VER >= 1400 # define soap_strcpy(buf, len, src) (void)strncpy_s((buf), (len), (src), _TRUNCATE) #elif defined(HAVE_STRLCPY) # define soap_strcpy(buf, len, src) (void)strlcpy((buf), (src), (len)) #else # define soap_strcpy(buf, len, src) (void)((buf) && (size_t)(len) > 0 && (strncpy((buf), (src), (len) - 1), (buf)[(len) - 1] = '\0')) #endif /* copy string up to n chars (nul on overrun) */ #if _MSC_VER >= 1400 # define soap_strncpy(buf, len, src, num) (void)strncpy_s((buf), (len), (src), (num)) #else # define soap_strncpy(buf, len, src, num) (void)((buf) && ((size_t)(len) > (size_t)(num) ? (strncpy((buf), (src), (num)), (buf)[(size_t)(num)] = '\0') : ((buf)[0] = '\0'))) #endif /* concat string up to n chars (nul on overrun) */ #if _MSC_VER >= 1400 # define soap_strncat(buf, len, src, num) (void)strncat_s((buf), (len), (src), (num)) #else # define soap_strncat(buf, len, src, num) (void)((buf) && ((size_t)(len) > strlen((buf)) + (size_t)(num) ? (strncat((buf), (src), (num)), (buf)[(size_t)(len) - 1] = '\0') : ((buf)[0] = '\0'))) #endif /* copy memory (error on overrun) */ #if _MSC_VER >= 1400 # define soap_memcpy(buf, len, src, num) ((buf) && (size_t)(len) >= (size_t)(num) ? memcpy_s((buf), (len), (src), (num)) : SOAP_ERANGE) #else # define soap_memcpy(buf, len, src, num) ((buf) && (size_t)(len) >= (size_t)(num) ? !memcpy((buf), (src), (num)) : SOAP_ERANGE) #endif /* move memory (error on overrun) */ #if _MSC_VER >= 1400 # define soap_memmove(buf, len, src, num) ((buf) && (size_t)(len) >= (size_t)(num) ? memmove_s((buf), (len), (src), (num)) : SOAP_ERANGE) #else # define soap_memmove(buf, len, src, num) ((buf) && (size_t)(len) >= (size_t)(num) ? !memmove((buf), (src), (num)) : SOAP_ERANGE) #endif /* gSOAP status/error codes */ typedef soap_int32 soap_status; #define SOAP_EOF EOF #define SOAP_ERR EOF #define SOAP_OK 0 #define SOAP_CLI_FAULT 1 #define SOAP_SVR_FAULT 2 #define SOAP_TAG_MISMATCH 3 #define SOAP_TYPE 4 #define SOAP_SYNTAX_ERROR 5 #define SOAP_NO_TAG 6 #define SOAP_IOB 7 #define SOAP_MUSTUNDERSTAND 8 #define SOAP_NAMESPACE 9 #define SOAP_USER_ERROR 10 #define SOAP_FATAL_ERROR 11 #define SOAP_FAULT 12 #define SOAP_NO_METHOD 13 #define SOAP_NO_DATA 14 #define SOAP_GET_METHOD 15 #define SOAP_PUT_METHOD 16 #define SOAP_DEL_METHOD 17 /* deprecated */ #define SOAP_HEAD_METHOD 18 /* deprecated */ #define SOAP_HTTP_METHOD 19 #define SOAP_EOM 20 #define SOAP_MOE 21 #define SOAP_HDR 22 #define SOAP_NULL 23 #define SOAP_DUPLICATE_ID 24 #define SOAP_MISSING_ID 25 #define SOAP_HREF 26 #define SOAP_UDP_ERROR 27 #define SOAP_TCP_ERROR 28 #define SOAP_HTTP_ERROR 29 #define SOAP_SSL_ERROR 30 #define SOAP_ZLIB_ERROR 31 #define SOAP_DIME_ERROR 32 #define SOAP_DIME_HREF 33 #define SOAP_DIME_MISMATCH 34 #define SOAP_DIME_END 35 #define SOAP_MIME_ERROR 36 #define SOAP_MIME_HREF 37 #define SOAP_MIME_END 38 #define SOAP_VERSIONMISMATCH 39 #define SOAP_PLUGIN_ERROR 40 #define SOAP_DATAENCODINGUNKNOWN 41 #define SOAP_REQUIRED 42 #define SOAP_PROHIBITED 43 #define SOAP_OCCURS 44 #define SOAP_LENGTH 45 #define SOAP_PATTERN 46 #define SOAP_FD_EXCEEDED 47 #define SOAP_UTF_ERROR 48 #define SOAP_NTLM_ERROR 49 #define soap_xml_error_check(e) ((e) == SOAP_TAG_MISMATCH || (e) == SOAP_NO_TAG || (e) == SOAP_SYNTAX_ERROR || (e) == SOAP_NAMESPACE || (e) == SOAP_DUPLICATE_ID || (e) == SOAP_MISSING_ID || (e) == SOAP_REQUIRED || (e) == SOAP_PROHIBITED || (e) == SOAP_OCCURS || (e) == SOAP_LENGTH || (e) == SOAP_PATTERN || (e) == SOAP_NULL || (e) == SOAP_HREF) #define soap_soap_error_check(e) ((e) == SOAP_CLI_FAULT || (e) == SOAP_SVR_FAULT || (e) == SOAP_VERSIONMISMATCH || (e) == SOAP_MUSTUNDERSTAND || (e) == SOAP_FAULT || (e) == SOAP_NO_METHOD) #define soap_tcp_error_check(e) ((e) == SOAP_EOF || (e) == SOAP_TCP_ERROR) #define soap_ssl_error_check(e) ((e) == SOAP_SSL_ERROR) #define soap_zlib_error_check(e) ((e) == SOAP_ZLIB_ERROR) #define soap_http_error_check(e) ((e) == SOAP_HTTP_ERROR || (e) == SOAP_NO_DATA || ((e) >= SOAP_GET_METHOD && (e) <= SOAP_HTTP_METHOD) || ((e) >= 100 && (e) < 600)) /* gSOAP HTTP response status codes 100 to 599 are reserved */ /* Codes 600 to 999 are user definable */ /* Exceptional gSOAP HTTP server response status codes >= 1000 */ #define SOAP_STOP 1000 /* No HTTP response */ #define SOAP_FORM 1001 /* Request (form) data is present, no HTTP response */ #define SOAP_HTML 1002 /* Custom HTML response */ #define SOAP_FILE 1003 /* Custom file-based response */ /* gSOAP HTTP method codes (client) */ #define SOAP_POST 2000 /* POST request */ #define SOAP_POST_FILE 2001 /* Custom file-based POST request */ #define SOAP_GET 2002 /* GET request */ #define SOAP_PUT 2003 /* PUT request */ #define SOAP_DEL 2004 /* DELETE request */ #define SOAP_CONNECT 2005 /* CONNECT request */ /* gSOAP DIME */ #define SOAP_DIME_CF 0x01 #define SOAP_DIME_ME 0x02 #define SOAP_DIME_MB 0x04 #define SOAP_DIME_VERSION 0x08 /* DIME version 1 */ #define SOAP_DIME_MEDIA 0x10 #define SOAP_DIME_ABSURI 0x20 /* gSOAP ZLIB */ #define SOAP_ZLIB_NONE 0x00 #define SOAP_ZLIB_DEFLATE 0x01 #define SOAP_ZLIB_INFLATE 0x02 #define SOAP_ZLIB_GZIP 0x02 /* gSOAP transport, connection, and content encoding modes */ typedef soap_int32 soap_mode; #define SOAP_IO 0x00000003 /* IO mask */ #define SOAP_IO_FLUSH 0x00000000 /* flush output immediately, no buffering */ #define SOAP_IO_BUFFER 0x00000001 /* buffer output in packets of size SOAP_BUFLEN */ #define SOAP_IO_STORE 0x00000002 /* store entire output to determine length for transport */ #define SOAP_IO_CHUNK 0x00000003 /* use HTTP chunked transfer AND buffer packets */ #define SOAP_IO_UDP 0x00000004 /* TCP or UDP */ #define SOAP_IO_LENGTH 0x00000008 /* calc message length (internal) */ #define SOAP_IO_KEEPALIVE 0x00000010 /* keep connection alive */ #define SOAP_ENC 0x00000FFF /* IO and ENC mask */ #define SOAP_ENC_LATIN 0x00000020 /* in: accept iso-8859-1 */ #define SOAP_ENC_XML 0x00000040 /* out: plain (XML or other) body, no HTTP header */ #define SOAP_ENC_DIME 0x00000080 #define SOAP_ENC_MIME 0x00000100 #define SOAP_ENC_MTOM 0x00000200 #define SOAP_ENC_ZLIB 0x00000400 #define SOAP_ENC_SSL 0x00000800 #define SOAP_XML_STRICT 0x00001000 /* in: strict validation */ #define SOAP_XML_INDENT 0x00002000 /* out: emit indented XML */ #define SOAP_XML_IGNORENS 0x00004000 /* in: ignore namespaces */ #define SOAP_XML_DEFAULTNS 0x00008000 /* out: emit xmlns="..." */ #define SOAP_XML_CANONICAL 0x00010000 /* out: excC14N canonical XML */ #define SOAP_XML_TREE 0x00020000 /* in/out: XML tree (no id/ref) */ #define SOAP_XML_NIL 0x00040000 /* out: all NULLs as xsi:nil */ #define SOAP_XML_NOTYPE 0x00080000 /* out: do not add xsi:type */ #define SOAP_DOM_TREE 0x00100000 /* see DOM manual */ #define SOAP_DOM_NODE 0x00200000 #define SOAP_DOM_ASIS 0x00400000 #define SOAP_RESERVED 0x00800000 /* reserved for future use */ #define SOAP_C_NOIOB 0x01000000 /* don't fault on array index out of bounds (just ignore) */ #define SOAP_C_UTFSTRING 0x02000000 /* (de)serialize strings with UTF8 content */ #define SOAP_C_MBSTRING 0x04000000 /* (de)serialize strings with multi-byte content */ #define SOAP_C_NILSTRING 0x08000000 /* serialize empty strings as nil (omitted) */ #define SOAP_XML_DOM 0x10000000 /* enable internal DOM */ #define SOAP_XML_GRAPH 0x20000000 /* force id-ref XML graph */ #define SOAP_MIME_POSTCHECK 0x40000000 /* MIME flag (internal) */ #define SOAP_SEC_WSUID 0x80000000 /* Add Body wsu:Id flag (internal) */ /* WITH_XMLNS backward compatibility: always use XML default namespaces */ #ifdef WITH_XMLNS # define SOAP_IO_DEFAULT (SOAP_IO_FLUSH | SOAP_XML_DEFAULTNS) #else # define SOAP_IO_DEFAULT SOAP_IO_FLUSH #endif /* SSL client/server authentication settings */ #define SOAP_SSL_NO_AUTHENTICATION 0x0000 /* for testing purposes */ #define SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION 0x0001 /* client requires server to authenticate (default) */ #define SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION 0x0002 /* server requires client to authenticate */ #define SOAP_SSL_SKIP_HOST_CHECK 0x0004 /* client skips common name check against host name */ #define SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE 0x0008 /* allow self-signed and expired certificates and those w/o CRL */ #define SOAP_SSL_NO_DEFAULT_CA_PATH 0x0010 /* don't use default_verify_paths */ #define SOAP_SSL_RSA 0x0020 /* use RSA */ #define SOAP_TLSv1 0x0000 /* enable TLS v1.0/1.1/1.2 only (default) */ #define SOAP_SSLv3_TLSv1 0x0040 /* enable SSL v3 and TLS v1.0/1.1/1.2 */ #define SOAP_SSLv3 0x0080 /* only SSL v3 */ #define SOAP_TLSv1_0 0x0100 /* only TLS v1.0 */ #define SOAP_TLSv1_1 0x0200 /* only TLS v1.1 */ #define SOAP_TLSv1_2 0x0400 /* only TLS v1.2 */ #define SOAP_SSL_CLIENT 0x1000 /* client context */ #define SOAP_SSL_DEFAULT (SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION | SOAP_TLSv1) /* state */ #define SOAP_NONE 0 #define SOAP_INIT 1 #define SOAP_COPY 2 #define soap_check_state(soap) (!(soap) || ((soap)->state != SOAP_INIT && (soap)->state != SOAP_COPY)) /* parts */ #define SOAP_BEGIN 0 #define SOAP_IN_ENVELOPE 2 #define SOAP_IN_HEADER 3 #define SOAP_END_HEADER 4 #define SOAP_NO_BODY 5 #define SOAP_IN_BODY 6 #define SOAP_END_BODY 7 #define SOAP_END_ENVELOPE 8 #define SOAP_END 9 /* events */ #define SOAP_SEC_BEGIN 1 #define SOAP_SEC_SIGN 2 #define SOAP_SEC_DECRYPT 3 /* DEBUG macros */ #ifndef WITH_LEAN # ifdef DEBUG_STAMP # ifndef DEBUG # define DEBUG # endif # endif # ifdef DEBUG # ifndef SOAP_DEBUG # define SOAP_DEBUG # endif # ifndef SOAP_MEM_DEBUG # define SOAP_MEM_DEBUG # endif # endif #endif #ifdef SOAP_MEM_DEBUG # ifndef SOAP_MALLOC # define SOAP_MALLOC(soap, size) soap_track_malloc((soap), __FILE__, __LINE__, (size)) # endif # ifndef SOAP_FREE # define SOAP_FREE(soap, ptr) soap_track_free((soap), __FILE__, __LINE__, (void*)(ptr)) # endif #endif #ifndef SOAP_MALLOC /* use libc malloc */ # define SOAP_MALLOC(soap, size) malloc(size) #endif #ifndef SOAP_FREE /* use libc free */ # define SOAP_FREE(soap, ptr) free((void*)(ptr)) #endif #ifndef SOAP_NOTHROW # if defined(__GNUC__) && (__GNUC__ <= 2) # define SOAP_NOTHROW # elif defined(WITH_LEAN) || defined(WITH_COMPAT) # define SOAP_NOTHROW # else # define SOAP_NOTHROW (std::nothrow) # endif #endif #if (defined(__GNUC__) && (__GNUC__ <= 2) && !defined(__BORLANDC__)) || defined(__clang__) || defined(_AIX) || defined(AIX) /* old form w/o parenthesis */ # ifndef SOAP_NEW # define SOAP_NEW(type) new SOAP_NOTHROW type # endif # ifndef SOAP_NEW_ARRAY # define SOAP_NEW_ARRAY(type, n) new SOAP_NOTHROW type[n] # endif # ifndef SOAP_PLACEMENT_NEW # define SOAP_PLACEMENT_NEW(buf, type) new (buf) type # endif #else /* new form with parenthesis */ # ifndef SOAP_NEW # define SOAP_NEW(type) new SOAP_NOTHROW (type) # endif # ifndef SOAP_NEW_ARRAY # define SOAP_NEW_ARRAY(type, n) new SOAP_NOTHROW type[n] # endif # ifndef SOAP_PLACEMENT_NEW # define SOAP_PLACEMENT_NEW(buf, type) new (buf) (type) # endif #endif #ifndef SOAP_NEW_COPY /* use C++ new operator for ::copy() */ # define SOAP_NEW_COPY(clas) new SOAP_NOTHROW clas #endif #ifndef SOAP_DELETE /* use C++ delete operator */ # define SOAP_DELETE(obj) delete obj #endif #ifndef SOAP_DELETE_ARRAY /* use C++ delete[] operator */ # define SOAP_DELETE_ARRAY(obj) delete[] obj #endif #ifdef SOAP_DEBUG # ifndef SOAP_MESSAGE # define SOAP_MESSAGE fprintf # endif # ifndef DBGLOG # ifdef DEBUG_STAMP # ifdef WIN32 # define DBGLOG(DBGFILE, CMD) \ { if (soap)\ { if (!soap->fdebug[SOAP_INDEX_##DBGFILE])\ soap_open_logfile((struct soap*)soap, SOAP_INDEX_##DBGFILE);\ if (soap->fdebug[SOAP_INDEX_##DBGFILE])\ { FILE *fdebug = soap->fdebug[SOAP_INDEX_##DBGFILE];\ SYSTEMTIME _localTime;\ ::GetLocalTime(&_localTime); \ fprintf(fdebug, "%02d%02d%02d %02d:%02d:%02d.%03d|", _localTime.wYear%100, _localTime.wMonth, _localTime.wDay, _localTime.wHour, _localTime.wMinute, _localTime.wSecond, _localTime.wMilliseconds);\ CMD;\ fflush(fdebug);\ }\ }\ } # else # define DBGLOG(DBGFILE, CMD) \ { if (soap)\ { if (!soap->fdebug[SOAP_INDEX_##DBGFILE])\ soap_open_logfile((struct soap*)soap, SOAP_INDEX_##DBGFILE);\ if (soap->fdebug[SOAP_INDEX_##DBGFILE])\ { FILE *fdebug = soap->fdebug[SOAP_INDEX_##DBGFILE];\ struct timeval _tv;\ struct tm _tm;\ gettimeofday(&_tv, NULL);\ localtime_r(&_tv.tv_sec, &_tm);\ fprintf(fdebug, "%02d%02d%02d %02d:%02d:%02d.%06d|", _tm.tm_year%100, _tm.tm_mon+1, _tm.tm_mday, _tm.tm_hour, _tm.tm_min, _tm.tm_sec, _tv.tv_usec);\ CMD;\ fflush(fdebug);\ }\ }\ } # endif # else # define DBGLOG(DBGFILE, CMD) \ { if (soap)\ { if (!soap->fdebug[SOAP_INDEX_##DBGFILE])\ soap_open_logfile((struct soap*)soap, SOAP_INDEX_##DBGFILE);\ if (soap->fdebug[SOAP_INDEX_##DBGFILE])\ { FILE *fdebug = soap->fdebug[SOAP_INDEX_##DBGFILE];\ CMD;\ fflush(fdebug);\ }\ }\ } # endif # endif # ifndef DBGMSG # define DBGMSG(DBGFILE, MSG, LEN) \ { if (soap)\ { if (!soap->fdebug[SOAP_INDEX_##DBGFILE])\ soap_open_logfile((struct soap*)soap, SOAP_INDEX_##DBGFILE);\ if (soap->fdebug[SOAP_INDEX_##DBGFILE])\ { fwrite((void*)(MSG), 1, (size_t)(LEN), soap->fdebug[SOAP_INDEX_##DBGFILE]);\ fflush(soap->fdebug[SOAP_INDEX_##DBGFILE]);\ }\ }\ } # endif # ifndef DBGFUN # define DBGFUN(FNAME) DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%s(%d): %s()\n", __FILE__, __LINE__, FNAME)) # define DBGFUN1(FNAME, FMT, ARG) DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%s(%d): %s(" FMT ")\n", __FILE__, __LINE__, FNAME, (ARG))) # define DBGFUN2(FNAME, FMT1, ARG1, FMT2, ARG2) DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%s(%d): %s(" FMT1 ", " FMT2 ")\n", __FILE__, __LINE__, FNAME, (ARG1), (ARG2))) # define DBGFUN3(FNAME, FMT1, ARG1, FMT2, ARG2, FMT3, ARG3) DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%s(%d): %s(" FMT1 ", " FMT2 ", " FMT3 ")\n", __FILE__, __LINE__, FNAME, (ARG1), (ARG2), (ARG3))) # endif # ifndef DBGHEX # define DBGHEX(DBGFILE, MSG, LEN) \ { if (soap)\ { if (!soap->fdebug[SOAP_INDEX_##DBGFILE])\ soap_open_logfile(soap, SOAP_INDEX_##DBGFILE);\ if (soap->fdebug[SOAP_INDEX_##DBGFILE])\ { int i; char *s;\ for (s = (char*)(MSG), i = (LEN); i; i--)\ fprintf(soap->fdebug[SOAP_INDEX_##DBGFILE], "%2.2X ", (int)*s++&0xFF);\ fflush(soap->fdebug[SOAP_INDEX_##DBGFILE]);\ }\ }\ } # endif #else # define DBGLOG(DBGFILE, CMD) # define DBGMSG(DBGFILE, MSG, LEN) # define DBGFUN(FNAME) # define DBGFUN1(FNAME, FMT, ARG) # define DBGFUN2(FNAME, FMT1, ARG1, FMT2, ARG2) # define DBGFUN3(FNAME, FMT1, ARG1, FMT2, ARG2, FMT3, ARG3) # define DBGHEX(DBGFILE, MSG, LEN) #endif /* UCS-4 requires 32 bits (0-7FFFFFFF, the sign bit is used by gSOAP to distinguish XML entities) */ typedef soap_int32 soap_wchar; /* namespace table row */ struct Namespace { const char *id; const char *ns; const char *in; char *out; }; /* namespace stack */ struct soap_nlist { struct soap_nlist *next; unsigned int level; /* nesting depth level */ short index; /* corresponding entry in ns mapping table */ const char *ns; /* only set when parsed ns URI is not in the ns mapping table */ char id[1]; /* the actual string value flows into the allocated region id[0...] below this struct */ }; /* block header, the data flows into the allocated region below this struct */ struct soap_bhead { struct soap_bhead *next; size_t size; }; /* block stack for nested block allocations */ struct soap_blist { struct soap_blist *next; struct soap_bhead *head; size_t size; }; /* pointer serialization management */ struct soap_plist { struct soap_plist *next; const void *ptr; void *dup; const void *array; /* array pointer */ int size; /* array size */ int type; int id; char mark1; /* 0=single-ref, 1=embedded-multi-ref (SOAP1.1), 2=multi-ref, 3=attachment */ char mark2; }; /* block allocation for pointer serialization management */ struct soap_pblk { struct soap_pblk *next; struct soap_plist plist[SOAP_PTRBLK]; }; #ifdef SOAP_MEM_DEBUG /* malloc/free tracking for debugging */ struct soap_mlist { struct soap_mlist *next; const void *ptr; const char *file; int line; short live; }; #endif /* class allocation list */ struct soap_clist { struct soap_clist *next; void *ptr; int type; int size; /* array size */ int (*fdelete)(struct soap_clist*); }; /* attributes */ struct soap_attribute { struct soap_attribute *next; short flag; /* soap_set_attr: 1 = normal, 2 = utf content */ char *value; size_t size; const char *ns; short visible; char name[1]; /* the actual name string flows into the allocated region below this struct */ }; #ifndef WITH_LEAN struct soap_cookie { struct soap_cookie *next; char *name; char *value; char *domain; char *path; time_t expire; /* client-side: local time to expire */ long maxage; /* server-side: seconds to expire */ unsigned int version; short secure; short session; /* server-side */ short env; /* server-side: got cookie from client and should not be (re)send */ short modified; /* server-side: client cookie was modified and should be send */ }; #endif SOAP_FMAC1 struct soap_multipart* SOAP_FMAC2 soap_next_multipart(struct soap_multipart*); #ifdef __cplusplus class soap_multipart_iterator { public: struct soap_multipart *content; bool operator==(const soap_multipart_iterator& iter) const { return (bool)(content == iter.content); } bool operator!=(const soap_multipart_iterator& iter) const { return (bool)(content != iter.content); } struct soap_multipart &operator*() const { return *content; } soap_multipart_iterator &operator++() { content = soap_next_multipart(content); return *this; } soap_multipart_iterator() : content(NULL) { } soap_multipart_iterator(struct soap_multipart *p) : content(p) { } }; #endif #ifndef WITH_LEANER struct soap_dime { size_t count; size_t size; size_t chunksize; size_t buflen; char flags; char *ptr; const char *id; const char *type; const char *options; struct soap_multipart *list; /* list of DIME attachments received */ struct soap_multipart *first, *last; /* temporary in/out queue */ #ifdef __cplusplus soap_multipart_iterator begin() { soap_multipart_iterator iter(list); return iter; }; soap_multipart_iterator end() { soap_multipart_iterator iter(NULL); return iter; }; #endif }; #endif #ifndef WITH_LEANER struct soap_mime { char *boundary; /* MIME boundary */ const char *start; /* MIME start ID */ struct soap_multipart *list; /* list of MIME attachments received */ struct soap_multipart *first, *last; /* temporary in/out queue */ #ifdef __cplusplus soap_multipart_iterator begin() { soap_multipart_iterator iter(list); return iter; }; soap_multipart_iterator end() { soap_multipart_iterator iter(NULL); return iter; }; #endif }; #endif #ifndef WITH_LEANER /* RFC2045 MIME content transfer encodings */ enum soap_mime_encoding { SOAP_MIME_NONE, SOAP_MIME_7BIT, SOAP_MIME_8BIT, SOAP_MIME_BINARY, SOAP_MIME_QUOTED_PRINTABLE, SOAP_MIME_BASE64, SOAP_MIME_IETF_TOKEN, SOAP_MIME_X_TOKEN }; #endif #ifndef WITH_LEANER /* DIME/MIME multipart list */ struct soap_multipart { struct soap_multipart *next; char *ptr; /* points to raw data content */ size_t size; /* size of data content */ const char *id; /* DIME/MIME content ID or form data name */ const char *type; /* DIME/MIME type (MIME type format) */ const char *options; /* DIME options */ enum soap_mime_encoding encoding; /* MIME Content-Transfer-Encoding */ const char *location; /* MIME Content-Location (optional) */ const char *description; /* MIME Content-Description (optional) */ #ifdef __cplusplus typedef soap_multipart_iterator iterator; #endif }; #endif #ifndef WITH_LEANER /* attachment DIME and MTOM XOP forwarding */ struct soap_xlist { struct soap_xlist *next; unsigned char **ptr; int *size; char *id; char **type; char **options; }; #endif /******************************************************************************/ #ifndef WITH_LEANER /* dom.c[pp] functions (optional, compile and link dom.c[pp] */ struct soap; struct soap_dom_element; struct soap_dom_attribute; /* soap_dom_element construction */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_new(struct soap *soap, const char *ns, const char *tag); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_new_w(struct soap *soap, const char *ns, const wchar_t *tag); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_set(struct soap_dom_element *elt, const char *ns, const char *tag); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_set_w(struct soap_dom_element *elt, const char *ns, const wchar_t *tag); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att(struct soap_dom_element *elt, const char *ns, const char *tag); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_w(struct soap_dom_element *elt, const char *ns, const wchar_t *tag); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt(struct soap_dom_element *elt, const char *ns, const char *tag); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_w(struct soap_dom_element *elt, const char *ns, const wchar_t *tag); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_nth_elt(struct soap_dom_element *elt, const char *ns, const char *tag, size_t n); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_nth_elt_w(struct soap_dom_element *elt, const char *ns, const wchar_t *tag, size_t n); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_nth(struct soap_dom_element *elt, size_t n); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_add_att(struct soap_dom_element *elt, const struct soap_dom_attribute *node); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_add_elt(struct soap_dom_element *elt, const struct soap_dom_element *node); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_add_atts(struct soap_dom_element *elt, const struct soap_dom_attribute *atts); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_add_elts(struct soap_dom_element *elt, const struct soap_dom_element *elts); /* soap_dom_element assignment */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_bool(struct soap_dom_element *elt, LONG64 b); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_int(struct soap_dom_element *elt, LONG64 n); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_double(struct soap_dom_element *elt, double x); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_text(struct soap_dom_element *elt, const char *text); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_text_w(struct soap_dom_element *elt, const wchar_t *text); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_node(struct soap_dom_element *elt, const void *node, int type); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_copy(struct soap_dom_element *elt, const struct soap_dom_element *node); /* soap_dom_element properties */ SOAP_FMAC1 int SOAP_FMAC2 soap_elt_match(const struct soap_dom_element *elt, const char *ns, const char *patt); SOAP_FMAC1 int SOAP_FMAC2 soap_elt_match_w(const struct soap_dom_element *elt, const char *ns, const wchar_t *patt); SOAP_FMAC1 const char * SOAP_FMAC2 soap_elt_get_ns(const struct soap_dom_element *elt); SOAP_FMAC1 const char * SOAP_FMAC2 soap_elt_get_tag(const struct soap_dom_element *elt); SOAP_FMAC1 int SOAP_FMAC2 soap_elt_is_true(const struct soap_dom_element *elt); SOAP_FMAC1 int SOAP_FMAC2 soap_elt_is_false(const struct soap_dom_element *elt); SOAP_FMAC1 int SOAP_FMAC2 soap_elt_get_int(const struct soap_dom_element *elt); SOAP_FMAC1 long SOAP_FMAC2 soap_elt_get_long(const struct soap_dom_element *elt); SOAP_FMAC1 LONG64 SOAP_FMAC2 soap_elt_get_LONG64(const struct soap_dom_element *elt); SOAP_FMAC1 double SOAP_FMAC2 soap_elt_get_double(const struct soap_dom_element *elt); SOAP_FMAC1 const char * SOAP_FMAC2 soap_elt_get_text(const struct soap_dom_element *elt); SOAP_FMAC1 const void * SOAP_FMAC2 soap_elt_get_node(const struct soap_dom_element *elt, int type); SOAP_FMAC1 int SOAP_FMAC2 soap_elt_get_type(const struct soap_dom_element *elt, const void **node); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_parent(const struct soap_dom_element *elt); SOAP_FMAC1 size_t SOAP_FMAC2 soap_elt_depth(const struct soap_dom_element *elt); SOAP_FMAC1 size_t SOAP_FMAC2 soap_elt_index(const struct soap_dom_element *elt); SOAP_FMAC1 size_t SOAP_FMAC2 soap_elt_len(const struct soap_dom_element *elt); SOAP_FMAC1 size_t SOAP_FMAC2 soap_elt_nth(const struct soap_dom_element *elt); /* soap_dom_attribute construction */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_new(struct soap *soap, const char *ns, const char *tag); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_new_w(struct soap *soap, const char *ns, const wchar_t *tag); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_set(struct soap_dom_attribute *att, const char *ns, const char *tag); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_set_w(struct soap_dom_attribute *att, const char *ns, const wchar_t *tag); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_add(struct soap_dom_attribute *att, const char *ns, const char *tag); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_add_w(struct soap_dom_attribute *att, const char *ns, const wchar_t *tag); /* soap_dom_attribute assignment */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_bool(struct soap_dom_attribute *att, LONG64 b); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_int(struct soap_dom_attribute *att, LONG64 n); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_double(struct soap_dom_attribute *att, double x); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_text(struct soap_dom_attribute *att, const char *text); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_text_w(struct soap_dom_attribute *att, const wchar_t *text); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_copy(struct soap_dom_attribute *att, const struct soap_dom_attribute *node); /* soap_dom_attribute properties */ SOAP_FMAC1 int SOAP_FMAC2 soap_att_match(const struct soap_dom_attribute *att, const char *ns, const char *patt); SOAP_FMAC1 int SOAP_FMAC2 soap_att_match_w(const struct soap_dom_attribute *att, const char *ns, const wchar_t *patt); SOAP_FMAC1 const char * SOAP_FMAC2 soap_att_get_ns(const struct soap_dom_attribute *att); SOAP_FMAC1 const char * SOAP_FMAC2 soap_att_get_tag(const struct soap_dom_attribute *att); SOAP_FMAC1 int SOAP_FMAC2 soap_att_is_true(const struct soap_dom_attribute *att); SOAP_FMAC1 int SOAP_FMAC2 soap_att_is_false(const struct soap_dom_attribute *att); SOAP_FMAC1 int SOAP_FMAC2 soap_att_get_int(const struct soap_dom_attribute *att); SOAP_FMAC1 long SOAP_FMAC2 soap_att_get_long(const struct soap_dom_attribute *att); SOAP_FMAC1 LONG64 SOAP_FMAC2 soap_att_get_LONG64(const struct soap_dom_attribute *att); SOAP_FMAC1 double SOAP_FMAC2 soap_att_get_double(const struct soap_dom_attribute *att); SOAP_FMAC1 const char * SOAP_FMAC2 soap_att_get_text(const struct soap_dom_attribute *att); /* DOM local traversal */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_first(struct soap_dom_element *elt); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_next(const struct soap_dom_attribute *att); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_first(struct soap_dom_element *elt); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_next(const struct soap_dom_element *elt); /* DOM local retrieval */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_get(const struct soap_dom_element *elt, const char *ns, const char *tag); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_get_w(const struct soap_dom_element *elt, const char *ns, const wchar_t *tag); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_get(const struct soap_dom_element *elt, const char *ns, const char *tag); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_get_w(const struct soap_dom_element *elt, const char *ns, const wchar_t *tag); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_get_next(const struct soap_dom_element *elt); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_get_nth(struct soap_dom_element *elt, size_t n); /* DOM local search */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_find(struct soap_dom_element *elt, const char *ns, const char *patt); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_find_next(const struct soap_dom_attribute *att, const char *ns, const char *patt); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_find(struct soap_dom_element *elt, const char *ns, const char *patt); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_find_next(const struct soap_dom_element *elt, const char *ns, const char *patt); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_find_type(struct soap_dom_element *elt, const char *ns, const char *patt, int type); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_find_next_type(const struct soap_dom_element *elt, const char *ns, const char *patt, int type); /* DOM size of local search results */ SOAP_FMAC1 size_t SOAP_FMAC2 soap_att_size(struct soap_dom_element *elt, const char *ns, const char *patt); SOAP_FMAC1 size_t SOAP_FMAC2 soap_elt_size(struct soap_dom_element *elt, const char *ns, const char *patt); SOAP_FMAC1 size_t SOAP_FMAC2 soap_elt_size_type(struct soap_dom_element *elt, const char *ns, const char *patt, int type); /* DOM deep traversal */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_dom_next_attribute(const struct soap_dom_attribute *att); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_dom_next_element(const struct soap_dom_element *elt, const struct soap_dom_element *end); /* DOM deep search */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_dom_find(struct soap_dom_element *begin, const struct soap_dom_element *end, const char *ns, const char *patt, int type); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_dom_find_next(const struct soap_dom_element *elt, const struct soap_dom_element *end, const char *ns, const char *patt, int type); #endif #if defined(__cplusplus) } #endif #ifndef WITH_LEANER #ifdef __cplusplus class soap_dom_attribute_iterator { public: struct soap_dom_attribute *iter; const char *nstr; const char *name; bool operator==(const soap_dom_attribute_iterator&) const; bool operator!=(const soap_dom_attribute_iterator&) const; struct soap_dom_attribute& operator*() const; struct soap_dom_attribute *operator->() const; soap_dom_attribute_iterator& operator++(); soap_dom_attribute_iterator operator++(int); soap_dom_attribute_iterator(); soap_dom_attribute_iterator(struct soap_dom_attribute*); ~soap_dom_attribute_iterator(); }; #endif #endif #ifndef WITH_LEANER struct soap_dom_attribute { struct soap_dom_attribute *next; const char *nstr; const char *name; const char *text; struct soap *soap; #ifdef __cplusplus typedef soap_dom_attribute_iterator iterator; soap_dom_attribute(struct soap *soap = NULL); soap_dom_attribute(const soap_dom_attribute& att); soap_dom_attribute(struct soap *soap, const char *tag); soap_dom_attribute(struct soap *soap, const wchar_t *tag); soap_dom_attribute(struct soap *soap, const char *ns, const char *tag, const char *text); soap_dom_attribute(struct soap *soap, const char *ns, const char *tag, const wchar_t *text); soap_dom_attribute(struct soap *soap, const char *ns, const wchar_t *tag, const char *text); soap_dom_attribute(struct soap *soap, const char *ns, const wchar_t *tag, const wchar_t *text); soap_dom_attribute(struct soap *soap, const char *ns, const char *tag, const std::string& text); soap_dom_attribute(struct soap *soap, const char *ns, const char *tag, const std::wstring& text); soap_dom_attribute(struct soap *soap, const char *ns, const wchar_t *tag, const std::string& text); soap_dom_attribute(struct soap *soap, const char *ns, const wchar_t *tag, const std::wstring& text); ~soap_dom_attribute(); soap_dom_attribute& set(const char *ns, const char *tag) { return *soap_att_set(this, ns, tag); } soap_dom_attribute& set(const char *ns, const wchar_t *tag) { return *soap_att_set_w(this, ns, tag); } soap_dom_attribute& set(bool b) { return *soap_att_bool(this, b); } soap_dom_attribute& set(int n) { return *soap_att_int(this, n); } soap_dom_attribute& set(LONG64 n) { return *soap_att_int(this, n); } soap_dom_attribute& set(float x) { return *soap_att_double(this, x); } soap_dom_attribute& set(double x) { return *soap_att_double(this, x); } soap_dom_attribute& set(const char *text) { return *soap_att_text(this, text); } soap_dom_attribute& set(const wchar_t *text) { return *soap_att_text_w(this, text); } #ifndef WITH_COMPAT soap_dom_attribute& set(const std::string& text) { return *soap_att_text(this, text.c_str()); } soap_dom_attribute& set(const std::wstring& text) { return *soap_att_text_w(this, text.c_str()); } #endif soap_dom_attribute& operator=(bool b) { return *soap_att_bool(this, b); } soap_dom_attribute& operator=(int n) { return *soap_att_int(this, n); } soap_dom_attribute& operator=(LONG64 n) { return *soap_att_int(this, n); } soap_dom_attribute& operator=(float x) { return *soap_att_double(this, x); } soap_dom_attribute& operator=(double x) { return *soap_att_double(this, x); } soap_dom_attribute& operator=(const char *text) { return *soap_att_text(this, text); } soap_dom_attribute& operator=(const wchar_t *text) { return *soap_att_text_w(this, text); } #ifndef WITH_COMPAT soap_dom_attribute& operator=(const std::string& text) { return *soap_att_text(this, text.c_str()); } soap_dom_attribute& operator=(const std::wstring& text) { return *soap_att_text_w(this, text.c_str()); } #endif soap_dom_attribute& operator=(const soap_dom_attribute& att) { return *soap_att_copy(this, &att); } soap_dom_attribute& att(const char *tag) { return *soap_att_add(this, NULL, tag); } soap_dom_attribute& att(const wchar_t *tag) { return *soap_att_add_w(this, NULL, tag); } soap_dom_attribute& att(const char *ns, const char *tag) { return *soap_att_add(this, ns, tag); } soap_dom_attribute& att(const char *ns, const wchar_t *tag) { return *soap_att_add_w(this, ns, tag); } bool match(const char *patt) const { return soap_att_match(this, NULL, patt) != 0; } bool match(const wchar_t *patt) const { return soap_att_match_w(this, NULL, patt) != 0; } bool match(const char *ns, const char *patt) const { return soap_att_match(this, ns, patt) != 0; } bool match(const char *ns, const wchar_t *patt) const { return soap_att_match_w(this, ns, patt) != 0; } const char *ns() const { return this->nstr; } const char *tag() const { return this->name; } bool is_true() const { return soap_att_is_true(this) != 0; } bool is_false() const { return soap_att_is_false(this) != 0; } LONG64 get_int() const { return soap_att_get_LONG64(this); } double get_double() const { return soap_att_get_double(this); } const char *get_text() const { return this->text; } operator bool() const { return soap_att_is_true(this) != 0; } operator int() const { return soap_att_get_int(this); } operator LONG64() const { return soap_att_get_LONG64(this); } operator double() const { return soap_att_get_double(this); } operator const char*() const { return this->text; } soap_dom_attribute_iterator att_begin() { return soap_dom_attribute_iterator(this); } soap_dom_attribute_iterator att_end() { return soap_dom_attribute_iterator(NULL); } soap_dom_attribute_iterator att_find(const char *patt) { return att_find(NULL, patt); } soap_dom_attribute_iterator att_find(const wchar_t *patt) { return att_find(NULL, patt); } soap_dom_attribute_iterator att_find(const char *ns, const char *patt); soap_dom_attribute_iterator att_find(const char *ns, const wchar_t *patt); void unlink(); #endif }; #endif #ifndef WITH_LEANER #ifdef __cplusplus class soap_dom_element_iterator { public: struct soap_dom_element *iter; struct soap_dom_element *stop; const char *nstr; const char *name; int type; bool deep; bool operator==(const soap_dom_element_iterator&) const; bool operator!=(const soap_dom_element_iterator&) const; struct soap_dom_element& operator*() const; struct soap_dom_element *operator->() const; soap_dom_element_iterator& operator++(); soap_dom_element_iterator operator++(int); soap_dom_element_iterator(); soap_dom_element_iterator(struct soap_dom_element*); ~soap_dom_element_iterator(); }; #endif #endif #ifndef WITH_LEANER struct soap_dom_element { struct soap_dom_element *next; struct soap_dom_element *prnt; struct soap_dom_element *elts; struct soap_dom_attribute *atts; const char *nstr; const char *name; const char *lead; const char *text; const char *code; const char *tail; const void *node; int type; struct soap *soap; #ifdef __cplusplus typedef soap_dom_element_iterator iterator; soap_dom_element(struct soap *soap = NULL); soap_dom_element(const soap_dom_element& elt); soap_dom_element(struct soap *soap, const char *tag); soap_dom_element(struct soap *soap, const wchar_t *tag); soap_dom_element(struct soap *soap, const char *ns, const char *tag); soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag); soap_dom_element(struct soap *soap, const char *ns, const char *tag, const char *text); soap_dom_element(struct soap *soap, const char *ns, const char *tag, const wchar_t *text); soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag, const char *text); soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag, const wchar_t *text); #ifndef WITH_COMPAT soap_dom_element(struct soap *soap, const char *ns, const char *tag, const std::string& text); soap_dom_element(struct soap *soap, const char *ns, const char *tag, const std::wstring& text); soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag, const std::string& text); soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag, const std::wstring& text); #endif soap_dom_element(struct soap *soap, const char *ns, const char *tag, const void *node, int type); soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag, const void *node, int type); ~soap_dom_element(); soap_dom_element& set(const char *ns, const char *tag) { return *soap_elt_set(this, ns, tag); } soap_dom_element& set(const char *ns, const wchar_t *tag) { return *soap_elt_set_w(this, ns, tag); } soap_dom_element& set(bool b) { return *soap_elt_bool(this, b); } soap_dom_element& set(int n) { return *soap_elt_int(this, n); } soap_dom_element& set(LONG64 n) { return *soap_elt_int(this, n); } soap_dom_element& set(float x) { return *soap_elt_double(this, x); } soap_dom_element& set(double x) { return *soap_elt_double(this, x); } soap_dom_element& set(const char *text) { return *soap_elt_text(this, text); } soap_dom_element& set(const wchar_t *text) { return *soap_elt_text_w(this, text); } #ifndef WITH_COMPAT soap_dom_element& set(const std::string& text) { return *soap_elt_text(this, text.c_str()); } soap_dom_element& set(const std::wstring& text) { return *soap_elt_text_w(this, text.c_str()); } #endif soap_dom_element& set(const void *node, int type) { return *soap_elt_node(this, node, type); } soap_dom_element& add(soap_dom_element& elt) { return *soap_add_elt(this, &elt); } soap_dom_element& add(soap_dom_element *elt) { return *soap_add_elt(this, elt); } soap_dom_element& add(soap_dom_attribute& att) { return *soap_add_att(this, &att); } soap_dom_element& add(soap_dom_attribute *att) { return *soap_add_att(this, att); } soap_dom_element& adds(soap_dom_element& elts) { return *soap_add_elts(this, &elts); } soap_dom_element& adds(soap_dom_element *elts) { return *soap_add_elts(this, elts); } soap_dom_element& adds(soap_dom_attribute& atts) { return *soap_add_atts(this, &atts); } soap_dom_element& adds(soap_dom_attribute *atts) { return *soap_add_atts(this, atts); } soap_dom_element& operator=(bool b) { return *soap_elt_bool(this, b); } soap_dom_element& operator=(int n) { return *soap_elt_int(this, n); } soap_dom_element& operator=(LONG64 n) { return *soap_elt_int(this, n); } soap_dom_element& operator=(float x) { return *soap_elt_double(this, x); } soap_dom_element& operator=(double x) { return *soap_elt_double(this, x); } soap_dom_element& operator=(const char *text) { return *soap_elt_text(this, text); } soap_dom_element& operator=(const wchar_t *text) { return *soap_elt_text_w(this, text); } #ifndef WITH_COMPAT soap_dom_element& operator=(const std::string& text) { return *soap_elt_text(this, text.c_str()); } soap_dom_element& operator=(const std::wstring& text) { return *soap_elt_text_w(this, text.c_str()); } #endif soap_dom_element& operator=(const soap_dom_element& elt) { return *soap_elt_copy(this, &elt); } template soap_dom_element& operator=(const T& node) { return this->set(&node, node.soap_type()); } template soap_dom_element& operator=(const T *node) { return this->set(node, node->soap_type()); } template soap_dom_element& operator=(T *node) { return this->set(node, node->soap_type()); } soap_dom_attribute& att(const char *tag) { return *soap_att(this, NULL, tag); } soap_dom_attribute& att(const wchar_t *tag) { return *soap_att_w(this, NULL, tag); } soap_dom_attribute& att(const char *ns, const char *tag) { return *soap_att(this, ns, tag); } soap_dom_attribute& att(const char *ns, const wchar_t *tag) { return *soap_att_w(this, ns, tag); } soap_dom_element& elt() { return *soap_elt(this, NULL, NULL); } soap_dom_element& elt(const char *tag) { return *soap_elt(this, NULL, tag); } soap_dom_element& elt(const wchar_t *tag) { return *soap_elt_w(this, NULL, tag); } soap_dom_element& elt(const char *ns, const char *tag) { return *soap_elt(this, ns, tag); } soap_dom_element& elt(const char *ns, const wchar_t *tag) { return *soap_elt_w(this, ns, tag); } soap_dom_element& operator[](const char *tag) { return *soap_elt(this, NULL, tag); } soap_dom_element& operator[](const wchar_t *tag) { return *soap_elt_w(this, NULL, tag); } soap_dom_element& operator[](size_t n) { return *soap_nth(this, n); } soap_dom_attribute *att_get(const char *tag) const { return soap_att_get(this, NULL, tag); } soap_dom_attribute *att_get(const wchar_t *tag) const { return soap_att_get_w(this, NULL, tag); } soap_dom_attribute *att_get(const char *ns, const char *tag) const { return soap_att_get(this, ns, tag); } soap_dom_attribute *att_get(const char *ns, const wchar_t *tag) const { return soap_att_get_w(this, ns, tag); } soap_dom_element *elt_get() const { return soap_elt_get(this, NULL, NULL); } soap_dom_element *elt_get(const char *tag) const { return soap_elt_get(this, NULL, tag); } soap_dom_element *elt_get(const wchar_t *tag) const { return soap_elt_get_w(this, NULL, tag); } soap_dom_element *elt_get(const char *ns, const char *tag) const { return soap_elt_get(this, ns, tag); } soap_dom_element *elt_get(const char *ns, const wchar_t *tag) const { return soap_elt_get_w(this, ns, tag); } soap_dom_element *get_next() const { return soap_elt_get_next(this); } soap_dom_element *get_nth(size_t n) { return soap_elt_get_nth(this, n); } bool match(const char *patt) const { return soap_elt_match(this, NULL, patt) != 0; } bool match(const wchar_t *patt) const { return soap_elt_match_w(this, NULL, patt) != 0; } bool match(const char *ns, const char *patt) const { return soap_elt_match(this, ns, patt) != 0; } bool match(const char *ns, const wchar_t *patt) const { return soap_elt_match_w(this, ns, patt) != 0; } const char *ns() const { return this->nstr; } const char *tag() const { return this->name; } soap_dom_element *parent() { return this->prnt; } size_t depth() const { return soap_elt_depth(this); } size_t index() const { return soap_elt_index(this); } size_t len() const { return soap_elt_len(this); } size_t nth() const { return soap_elt_nth(this); } size_t elt_size() { return soap_elt_size(this, NULL, NULL); } size_t elt_size(const char *patt, int type = 0) { return elt_size(NULL, patt, type); } size_t elt_size(const char *ns, const char *patt, int type = 0) { return soap_elt_size_type(this, ns, patt, type); } size_t att_size() { return soap_att_size(this, NULL, NULL); } size_t att_size(const char *patt) { return att_size(NULL, patt); } #ifndef WITH_COMPAT size_t att_size(const std::string& patt) { return att_size(NULL, patt); } #endif size_t att_size(const char *ns, const char *patt) { return soap_att_size(this, ns, patt); } #ifndef WITH_COMPAT size_t att_size(const char *ns, const std::string& patt) { return soap_att_size(this, ns, patt.c_str()); } #endif bool is_true() const { return soap_elt_is_true(this) != 0; } bool is_false() const { return soap_elt_is_false(this) != 0; } LONG64 get_int() const { return soap_elt_get_LONG64(this); } double get_double() const { return soap_elt_get_double(this); } const char *get_text() const { return this->text; } const void *get_node(int type) const { return soap_elt_get_node(this, type); } int get_type(const void **node) const { return soap_elt_get_type(this, node); } operator bool() const { return soap_elt_is_true(this) != 0; } operator int() const { return soap_elt_get_int(this); } operator LONG64() const { return soap_elt_get_LONG64(this); } operator double() const { return soap_elt_get_double(this); } operator const char*() const { return this->text; } soap_dom_element_iterator begin(); soap_dom_element_iterator end() { return soap_dom_element_iterator(NULL); } soap_dom_element_iterator elt_begin() { return soap_dom_element_iterator(this->elts); } soap_dom_element_iterator elt_end() { return soap_dom_element_iterator(NULL); } soap_dom_attribute_iterator att_begin() { return soap_dom_attribute_iterator(this->atts); } soap_dom_attribute_iterator att_end() { return soap_dom_attribute_iterator(NULL); } soap_dom_element_iterator find(const char *patt, int type = 0) { return find(NULL, patt, type); } soap_dom_element_iterator find(const wchar_t *patt, int type = 0) { return find(NULL, patt, type); } soap_dom_element_iterator find(const char *ns, const char *patt, int type = 0); soap_dom_element_iterator find(const char *ns, const wchar_t *patt, int type = 0); soap_dom_element_iterator find(int type); soap_dom_element_iterator elt_find(const char *patt, int type = 0) { return elt_find(NULL, patt, type); } soap_dom_element_iterator elt_find(const wchar_t *patt, int type = 0) { return elt_find(NULL, patt, type); } soap_dom_element_iterator elt_find(const char *ns, const char *patt, int type = 0); soap_dom_element_iterator elt_find(const char *ns, const wchar_t *patt, int type = 0); soap_dom_element_iterator elt_find(int type); soap_dom_attribute_iterator att_find(const char *patt) { return att_find(NULL, patt); } soap_dom_attribute_iterator att_find(const wchar_t *patt) { return att_find(NULL, patt); } soap_dom_attribute_iterator att_find(const char *ns, const char *patt); soap_dom_attribute_iterator att_find(const char *ns, const wchar_t *patt); void unlink(); #endif }; #endif SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_dup_xsd__anyType(struct soap *soap, struct soap_dom_element *d, const struct soap_dom_element *a); SOAP_FMAC1 void SOAP_FMAC2 soap_del_xsd__anyType(const struct soap_dom_element *a); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_dup_xsd__anyAttribute(struct soap *soap, struct soap_dom_attribute *d, const struct soap_dom_attribute *a); SOAP_FMAC1 void SOAP_FMAC2 soap_del_xsd__anyAttribute(const struct soap_dom_attribute *a); SOAP_FMAC1 int SOAP_FMAC2 soap_dom_call(struct soap *soap, const char *endpoint, const char *action, const struct soap_dom_element *in, struct soap_dom_element *out); #if defined(__cplusplus) && !defined(WITH_COMPAT) extern std::ostream &operator<<(std::ostream&, const struct soap_dom_element&); extern std::istream &operator>>(std::istream&, struct soap_dom_element&); SOAP_FMAC1 int SOAP_FMAC2 soap_dom_call(struct soap *soap, const char *endpoint, const char *action, const struct soap_dom_element& in, struct soap_dom_element& out); SOAP_FMAC1 int SOAP_FMAC2 soap_dom_call(struct soap *soap, const char *endpoint, const char *action, const struct soap_dom_element *in, struct soap_dom_element& out); SOAP_FMAC1 int SOAP_FMAC2 soap_dom_call(struct soap *soap, const char *endpoint, const char *action, const struct soap_dom_element& in, struct soap_dom_element *out); #endif #if defined(__cplusplus) extern "C" { #endif /******************************************************************************/ #ifdef WIN32 # ifdef SOAP_STD_EXPORTS # define SOAP_STD_API __declspec(dllexport) # else # define SOAP_STD_API # endif #else # define SOAP_STD_API #endif struct SOAP_STD_API soap { short state; /* 0 = uninitialized, 1 = initialized, 2 = copy of another soap struct */ short version; /* 1 = SOAP1.1 and 2 = SOAP1.2 (set automatically from namespace URI in nsmap table), 0 indicates non-SOAP content */ soap_mode mode; soap_mode imode; soap_mode omode; const char *float_format; /* user-definable format string for floats (<1024 chars) */ const char *double_format; /* user-definable format string for doubles (<1024 chars) */ const char *long_double_format; /* user-definable format string for long doubles (<1024 chars) */ const char *dime_id_format; /* user-definable format string for integer DIME id ( 0, gives socket recv timeout in seconds, < 0 in usec */ int send_timeout; /* when > 0, gives socket send timeout in seconds, < 0 in usec */ int connect_timeout; /* when > 0, gives socket connect() timeout in seconds, < 0 in usec */ int accept_timeout; /* when > 0, gives socket accept() timeout in seconds, < 0 in usec */ int socket_flags; /* socket recv() and send() flags, e.g. set to MSG_NOSIGNAL to disable sigpipe */ int connect_flags; /* connect() SOL_SOCKET sockopt flags, e.g. set to SO_DEBUG to debug socket */ int bind_flags; /* bind() SOL_SOCKET sockopt flags, e.g. set to SO_REUSEADDR to enable reuse */ int accept_flags; /* accept() SOL_SOCKET sockopt flags */ unsigned short linger_time; /* linger time for SO_LINGER option */ const struct Namespace *namespaces; /* Pointer to global namespace mapping table */ struct Namespace *local_namespaces; /* Local namespace mapping table */ struct soap_nlist *nlist; /* namespace stack */ struct soap_blist *blist; /* block allocation stack */ struct soap_clist *clist; /* class instance allocation list */ void *alist; /* memory allocation (malloc) list */ short shaky; /* objects in reallocatable containers are on shaky grounds */ #if !defined(WITH_LEANER) || !defined(WITH_NOIDREF) struct soap_ilist *iht[SOAP_IDHASH]; #endif struct soap_plist *pht[SOAP_PTRHASH]; struct soap_pblk *pblk; /* plist block allocation */ short pidx; /* plist block allocation */ struct SOAP_ENV__Header *header; struct SOAP_ENV__Fault *fault; int idnum; void *user; /* for user to pass user-defined data to callbacks */ void *data[4]; /* extension data = {smdevp, mecevp, ...} */ struct soap_plugin *plugins; /* linked list of plug-in data */ const char *userid; /* HTTP Basic authorization userid */ const char *passwd; /* HTTP Basic authorization passwd */ const char *authrealm; /* HTTP authentication realm (NTLM domain) */ #if !defined(WITH_LEAN) || defined(WITH_NTLM) const char *ntlm_challenge; /* HTTP NTLM challenge key string */ short ntlm_auth; /* HTTP NTLM authentication type */ short ntlm_stage; /* HTTP NTLM stage 0..3 */ #endif int (*fpost)(struct soap*, const char*, const char*, int, const char*, const char*, size_t); int (*fget)(struct soap*); /* HTTP GET hook (not set by default) */ int (*fput)(struct soap*); /* HTTP PUT hook (handled as POST by default) */ int (*fdel)(struct soap*); /* HTTP DELETE hook (not set by default) */ int (*fopt)(struct soap*); /* HTTP OPTIONS hook (not set by default) */ int (*fhead)(struct soap*); /* HTTP HEAD hook (not set by default) */ int (*fform)(struct soap*); /* HTTP/HTML form handler for plugins */ int (*fposthdr)(struct soap*, const char*, const char*); int (*fresponse)(struct soap*, int, size_t); int (*fparse)(struct soap*); int (*fparsehdr)(struct soap*, const char*, const char*); int (*fheader)(struct soap*); int (*fresolve)(struct soap*, const char*, struct in_addr* inaddr); int (*fconnect)(struct soap*, const char*, const char*, int); int (*fdisconnect)(struct soap*); int (*fclosesocket)(struct soap*, SOAP_SOCKET); int (*fshutdownsocket)(struct soap*, SOAP_SOCKET, int); SOAP_SOCKET (*fopen)(struct soap*, const char*, const char*, int); SOAP_SOCKET (*faccept)(struct soap*, SOAP_SOCKET, struct sockaddr*, int *n); int (*fclose)(struct soap*); int (*fsend)(struct soap*, const char*, size_t); size_t (*frecv)(struct soap*, char*, size_t); int (*fpoll)(struct soap*); void (*fseterror)(struct soap*, const char **c, const char **s); int (*fignore)(struct soap*, const char*); int (*fserveloop)(struct soap*); void *(*fplugin)(struct soap*, const char*); void *(*fmalloc)(struct soap*, size_t); #ifndef WITH_LEANER int (*fsvalidate)(struct soap*, const char*, const char*); int (*fwvalidate)(struct soap*, const char*, const wchar_t*); int (*feltbegin)(struct soap*, const char*); int (*feltendin)(struct soap*, const char*, const char*); int (*feltbegout)(struct soap*, const char*); int (*feltendout)(struct soap*, const char*); int (*fprepareinitsend)(struct soap*); int (*fprepareinitrecv)(struct soap*); int (*fpreparesend)(struct soap*, const char*, size_t); int (*fpreparerecv)(struct soap*, const char*, size_t); int (*fpreparefinalsend)(struct soap*); int (*fpreparefinalrecv)(struct soap*); int recverror; /* last soap_recv_raw error code for filterrecv */ int (*ffiltersend)(struct soap*, const char**, size_t*); int (*ffilterrecv)(struct soap*, char*, size_t*, size_t); void *(*fdimereadopen)(struct soap*, void*, const char*, const char*, const char*); void *(*fdimewriteopen)(struct soap*, const char*, const char*, const char*); void (*fdimereadclose)(struct soap*, void*); void (*fdimewriteclose)(struct soap*, void*); size_t (*fdimeread)(struct soap*, void*, char*, size_t); int (*fdimewrite)(struct soap*, void*, const char*, size_t); void *(*fmimereadopen)(struct soap*, void*, const char*, const char*, const char*); void *(*fmimewriteopen)(struct soap*, void*, const char*, const char*, const char*, enum soap_mime_encoding); void (*fmimereadclose)(struct soap*, void*); void (*fmimewriteclose)(struct soap*, void*); size_t (*fmimeread)(struct soap*, void*, char*, size_t); int (*fmimewrite)(struct soap*, void*, const char*, size_t); #endif SOAP_SOCKET master; /* socket bound to TCP/IP port */ SOAP_SOCKET socket; /* socket to send and receive */ SOAP_SOCKET sendsk; /* socket to send (overrides ::socket) */ SOAP_SOCKET recvsk; /* socket to receive (overrides ::socket) */ #if defined(__cplusplus) && !defined(WITH_COMPAT) std::ostream *os; /* C++ only: ostream to send */ std::istream *is; /* C++ only: istream to receive */ #else const char **os; /* C only: pointer to a const char*, will be set to point to the string output */ const char *is; /* C only: a const char* to read from (soap->is will advance) */ #endif #ifndef UNDER_CE int sendfd; /* int file descriptor for sending */ int recvfd; /* int file descriptor for receiving */ #else FILE *sendfd; /* WinCE FILE* to send */ FILE *recvfd; /* WinCE FILE* to receive */ #endif size_t bufidx; /* index in soap.buf[] */ size_t buflen; /* length of soap.buf[] content */ soap_wchar ahead; /* parser lookahead */ short cdata; /* CDATA parser state */ short body; /* HTTP or XML element has a body (1) or not (0) */ unsigned int level; /* XML nesting level */ size_t count; /* message length counter */ size_t length; /* message length as set by HTTP header */ char *labbuf; /* look-aside buffer */ size_t lablen; /* look-aside buffer allocated length */ size_t labidx; /* look-aside buffer index to available part */ char buf[SOAP_BUFLEN];/* send and receive buffer */ char msgbuf[SOAP_TMPLEN]; /* in/out buffer for HTTP/MIME headers and short messages, must be >=1024 bytes */ char tmpbuf[SOAP_TMPLEN]; /* in/out buffer for HTTP/MIME headers, simpleType values, element and attribute tag names, and DIME must be >=1024 bytes */ char tag[SOAP_TAGLEN]; char id[SOAP_TAGLEN]; char href[SOAP_TAGLEN]; char type[SOAP_TAGLEN]; char arrayType[SOAP_TAGLEN]; char arraySize[SOAP_TAGLEN]; char arrayOffset[SOAP_TAGLEN]; short other; short root; int position; int positions[SOAP_MAXDIMS]; struct soap_attribute *attributes; /* attribute list */ short encoding; /* when set, output encodingStyle */ short mustUnderstand; /* a mustUnderstand element was parsed or is output */ short null; /* parsed XML is xsi:nil */ short ns; /* zero to output all xmlns */ short part; /* SOAP part state (header or body) */ short event; /* engine events and states for use by plugins */ short peeked; unsigned int evlev; /* event level */ int alloced; size_t chunksize; size_t chunkbuflen; char endpoint[SOAP_TAGLEN]; char path[SOAP_TAGLEN]; char host[SOAP_TAGLEN]; char *action; const char *prolog; /* XML declaration prolog */ unsigned long ip; /* IP number */ int port; /* port number */ short keep_alive; /* connection should be kept open */ short tcp_keep_alive; /* enable SO_KEEPALIVE */ unsigned int tcp_keep_idle; /* set TCP_KEEPIDLE */ unsigned int tcp_keep_intvl; /* set TCP_KEEPINTVL */ unsigned int tcp_keep_cnt; /* set TCP_KEEPCNT */ unsigned int max_keep_alive; /* maximum keep-alive session (default=100) */ const char *proxy_http_version;/* HTTP version of proxy "1.0" or "1.1" */ const char *proxy_host; /* Proxy Server host name */ int proxy_port; /* Proxy Server port (default = 8080) */ const char *proxy_userid; /* Proxy Authorization user name */ const char *proxy_passwd; /* Proxy Authorization password */ const char *proxy_from; /* X-Forwarding-For header returned by proxy */ int status; /* -1 when request, else error code to be returned by server */ int error; int errmode; int errnum; #ifndef WITH_LEANER struct soap_dom_element *dom; struct soap_dime dime; struct soap_mime mime; struct soap_xlist *xlist; #endif #if !defined(WITH_LEAN) || defined(SOAP_DEBUG) const char *logfile[SOAP_MAXLOGS]; FILE *fdebug[SOAP_MAXLOGS]; struct soap_mlist *mht[SOAP_PTRHASH]; #endif #ifndef WITH_LEAN const char *wsuid; /* space-separated string of element tags */ const char *c14nexclude; /* space-separated string of prefixes for c14n exclusion */ const char *c14ninclude; /* space-separated string of prefixes for c14n inclusion */ struct soap_cookie *cookies; const char *cookie_domain; const char *cookie_path; int cookie_max; #endif #ifndef WITH_NOIO unsigned int ipv6_multicast_if; /* in_addr_t in6addr->sin6_scope_id IPv6 value */ char* ipv4_multicast_if; /* IP_MULTICAST_IF IPv4 setsockopt interface_addr */ unsigned char ipv4_multicast_ttl; /* IP_MULTICAST_TTL value 0..255 */ union { struct sockaddr addr; struct sockaddr_in in; struct sockaddr_storage storage; } peer; /* set by soap_connect/soap_accept and by UDP recv */ #endif size_t peerlen; #if defined(WITH_OPENSSL) /* OpenSSL */ int (*fsslauth)(struct soap*); int (*fsslverify)(int, X509_STORE_CTX*); BIO *bio; SSL *ssl; SSL_CTX *ctx; SSL_SESSION *session; const char *dhfile; const char *randfile; #elif defined(WITH_GNUTLS) /* GNUTLS */ int (*fsslauth)(struct soap*); void *fsslverify; gnutls_certificate_credentials_t xcred; /* cert pointer */ gnutls_anon_client_credentials_t acred; /* anon pointer */ gnutls_priority_t cache; /* priority cache pointer */ gnutls_session_t session; /* session pointer */ gnutls_dh_params_t dh_params; gnutls_rsa_params_t rsa_params; #elif defined(WITH_SYSTEMSSL) /* SYSTEM SSL */ int (*fsslauth)(struct soap*); void *fsslverify; /* N/A */ void *bio; /* N/A */ gsk_handle ctx; /* environment */ gsk_handle ssl; /* ssl socket */ void *session; /* N/A */ const char *dhfile; /* N/A */ const char *randfile; /* N/A */ #else /* No SSL/TLS */ void *fsslauth; /* dummy members, to preserve struct size */ void *fsslverify; void *bio; void *ssl; void *ctx; void *session; void *dh_params; void *rsa_params; #endif unsigned short ssl_flags; const char *keyfile; const char *keyid; const char *password; const char *cafile; const char *capath; const char *crlfile; char session_host[SOAP_TAGLEN]; int session_port; #ifdef WITH_C_LOCALE # ifdef WIN32 _locale_t c_locale; /* set to C locale by default */ # else locale_t c_locale; /* set to C locale by default */ # endif #else void *c_locale; #endif #ifdef WITH_ZLIB z_stream *d_stream; /* decompression stream */ uLong z_crc; /* internal gzip crc */ #else void *d_stream; /* dummy members, to preserve struct size */ soap_int32 z_crc; #endif const char *z_dict; /* support for zlib static dictionaries */ unsigned int z_dict_len; short zlib_state; /* SOAP_ZLIB_NONE, SOAP_ZLIB_DEFLATE, or SOAP_ZLIB_INFLATE */ short zlib_in; /* SOAP_ZLIB_NONE, SOAP_ZLIB_DEFLATE, or SOAP_ZLIB_GZIP */ short zlib_out; /* SOAP_ZLIB_NONE, SOAP_ZLIB_DEFLATE, or SOAP_ZLIB_GZIP */ char *z_buf; /* buffer */ size_t z_buflen; unsigned short z_level; /* compression level to be used (0=none, 1=fast to 9=best) */ float z_ratio_in; /* detected compression ratio compressed_length/length of inbound message */ float z_ratio_out; /* detected compression ratio compressed_length/length of outbound message */ #ifdef WMW_RPM_IO /* VxWorks */ void *rpmreqid; #endif #ifdef __cplusplus soap(); soap(soap_mode); soap(soap_mode, soap_mode); soap(const struct soap&); struct soap& operator=(const struct soap&); ~soap(); /* no virtual methods, so sizeof(soap) is same in C and C++ */ #endif }; struct soap_code_map { LONG64 code; const char *string; }; /* forwarding list */ struct soap_flist { struct soap_flist *next; int type; void *ptr; unsigned int level; size_t index; void (*finsert)(struct soap*, int, int, void*, size_t, const void*, void**); }; /* id-ref forwarding list */ struct soap_ilist { struct soap_ilist *next; int type; size_t size; void *ptr; void **spine; void *link; void *copy; struct soap_flist *flist; void *smart; short shaky; char id[1]; /* the actual id string value flows into the allocated region below this struct */ }; struct soap_plugin { struct soap_plugin *next; const char *id; void *data; int (*fcopy)(struct soap *soap, struct soap_plugin *dst, struct soap_plugin *src); void (*fdelete)(struct soap *soap, struct soap_plugin *p); /* should delete fields of plugin only and not free(p) */ }; extern SOAP_NMAC struct Namespace namespaces[]; #ifndef WITH_LEAN # define soap_get0(soap) (((soap)->bufidx>=(soap)->buflen && soap_recv(soap)) ? EOF : (unsigned char)(soap)->buf[(soap)->bufidx]) # define soap_get1(soap) (((soap)->bufidx>=(soap)->buflen && soap_recv(soap)) ? EOF : (unsigned char)(soap)->buf[(soap)->bufidx++]) #else soap_wchar soap_get0(struct soap*); soap_wchar soap_get1(struct soap*); #endif #define soap_versioning_paste(name, ext) name##_REQUIRE_lib_v##ext #define soap_versioning_ext(name, ext) soap_versioning_paste(name, ext) #define soap_versioning(name) soap_versioning_ext(name, GSOAP_VERSION) #define soap_init(soap) soap_init1(soap, SOAP_IO_DEFAULT) #define soap_init1(soap, mode) soap_init2(soap, mode, mode) #define soap_init2(soap, imode, omode) soap_versioning(soap_init)(soap, imode, omode) #define soap_new() soap_new1(SOAP_IO_DEFAULT) #define soap_new1(mode) soap_new2(mode, mode) #define soap_new2(imode, omode) soap_versioning(soap_new)(imode, omode) #define soap_revget1(soap) ((soap)->bufidx--) #define soap_unget(soap, c) ((soap)->ahead = c) #define soap_register_plugin(soap, plugin) soap_register_plugin_arg(soap, plugin, NULL) #define soap_mode(soap, n) ((soap)->mode = (soap)->imode = (soap)->omode = (n)) #define soap_imode(soap, n) ((soap)->imode = (n)) #define soap_omode(soap, n) ((soap)->omode = (n)) #define soap_set_imode(soap, n) ((soap)->imode |= (n)) #define soap_clr_imode(soap, n) ((soap)->imode &= ~(n)) #define soap_set_omode(soap, n) ((soap)->omode |= (n)) #define soap_clr_omode(soap, n) ((soap)->omode &= ~(n)) #define soap_set_mode(soap, n) ((soap)->mode |= (n), (soap)->imode |= (n), (soap)->omode |= (n)) #define soap_clr_mode(soap, n) ((soap)->mode &= ~(n), (soap)->imode &= ~(n), (soap)->omode &= ~(n)) #define soap_destroy(soap) soap_delete((soap), NULL) #define SOAP_NO_LINK_TO_DELETE (-2) /* pass to soap_link() as size n: do not manage, smart pointers are self-managing */ #ifdef HAVE_STRRCHR # define soap_strrchr(s, t) strrchr(s, t) #else SOAP_FMAC1 char* SOAP_FMAC2 soap_strrchr(const char *s, int t); #endif #ifdef HAVE_STRTOL # define soap_strtol(s, t, b) strtol(s, t, b) #else SOAP_FMAC1 long SOAP_FMAC2 soap_strtol(const char*, char**, int); #endif #ifdef HAVE_STRTOUL # define soap_strtoul(s, t, b) strtoul(s, t, b) #else SOAP_FMAC1 unsigned long SOAP_FMAC2 soap_strtoul(const char*, char**, int); #endif #if defined(WIN32) && !defined(__MINGW32__) && !defined(__MINGW64__) # define soap_strtoll _strtoi64 #else # define soap_strtoll strtoll #endif #if defined(WIN32) && !defined(__MINGW32__) && !defined(__MINGW64__) # define soap_strtoull _strtoui64 #else # define soap_strtoull strtoull #endif #if defined(WITH_OPENSSL) # define soap_random soap_rand() SOAP_FMAC1 int SOAP_FMAC2 soap_rand(void); #elif defined(HAVE_RANDOM) # define soap_random (int)random() #else # define soap_random rand() #endif #ifdef WITH_NOIDREF # define soap_embedded(s, p, t) ((void)(s), 0) # define soap_id_lookup(s, i, p, t, n, k, fb) ((void)(s), (p)) # define soap_id_forward(s, h, p, i, t, tt, n, k, fi, fb) ((void)(s), (p)) # define soap_id_nullify(s, i) ((void)(s), (i)) # define soap_reference(s, a, t) ((void)(s), 1) # define soap_array_reference(s, p, a, n, t) ((void)(s), 1) # define soap_embed(s, p, a, n, t) ((void)(s), 0) # define soap_embedded_id(s, i, p, t) ((void)(s), (void)(t), i) # define soap_is_embedded(s, p) ((void)(s), 0) # define soap_is_single(s, p) ((void)(s), 1) # define soap_lookup_type(s, i) ((void)(s), 0) # define soap_getindependent(s) ((void)(s), 0) # define soap_putindependent(s) ((void)(s), 0) # define soap_markelement(s, p, t) ((void)(s), 0) # define soap_begin_shaky(s) ((void)(s), 0) # define soap_end_shaky(s, f) ((void)(s), (void)(f), 0) #endif /* soap_traverse() traversal/walker routines take walker function arguments */ typedef void soap_walker(struct soap*, void*, int, const char*, const char*); SOAP_FMAC5 int SOAP_FMAC6 soap_serve(struct soap *soap); SOAP_FMAC5 int SOAP_FMAC6 soap_serve_request(struct soap *soap); SOAP_FMAC3 void SOAP_FMAC4 soap_header(struct soap*); SOAP_FMAC3 void SOAP_FMAC4 soap_fault(struct soap*); SOAP_FMAC3 const char** SOAP_FMAC4 soap_faultcode(struct soap*); SOAP_FMAC3 const char** SOAP_FMAC4 soap_faultsubcode(struct soap*); SOAP_FMAC3 const char** SOAP_FMAC4 soap_faultstring(struct soap*); SOAP_FMAC3 const char** SOAP_FMAC4 soap_faultdetail(struct soap*); SOAP_FMAC3 const char* SOAP_FMAC4 soap_check_faultsubcode(struct soap*); SOAP_FMAC3 const char* SOAP_FMAC4 soap_check_faultdetail(struct soap*); SOAP_FMAC3 void SOAP_FMAC4 soap_serializefault(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_serializeheader(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_getheader(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_putheader(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_getfault(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_putfault(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_ssl_init(void); SOAP_FMAC1 int SOAP_FMAC2 soap_poll(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_connect_command(struct soap*, int, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_connect(struct soap*, const char*, const char*); SOAP_FMAC1 SOAP_SOCKET SOAP_FMAC2 soap_bind(struct soap*, const char*, int, int); SOAP_FMAC1 SOAP_SOCKET SOAP_FMAC2 soap_accept(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_ssl_accept(struct soap*); SOAP_FMAC1 const char * SOAP_FMAC2 soap_ssl_error(struct soap*, int); SOAP_FMAC1 int SOAP_FMAC2 soap_ssl_crl(struct soap*, const char*); #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE) SOAP_FMAC1 int SOAP_FMAC2 soap_ssl_server_context(struct soap *soap, unsigned short flags, const char *keyfile, const char *keyid, const char *password, const char *cafile, const char *capath, const char *dhfile, const char *randfile, const char *sid); #else SOAP_FMAC1 int SOAP_FMAC2 soap_ssl_server_context(struct soap *soap, unsigned short flags, const char *keyfile, const char *password, const char *cafile, const char *capath, const char *dhfile, const char *randfile, const char *sid); #endif #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE) SOAP_FMAC1 int SOAP_FMAC2 soap_ssl_client_context(struct soap *soap, unsigned short flags, const char *keyfile, const char *keyid, const char *password, const char *cafile, const char *capath, const char *randfile); #else SOAP_FMAC1 int SOAP_FMAC2 soap_ssl_client_context(struct soap *soap, unsigned short flags, const char *keyfile, const char *password, const char *cafile, const char *capath, const char *randfile); #endif SOAP_FMAC1 int SOAP_FMAC2 soap_puthttphdr(struct soap*, int status, size_t count); SOAP_FMAC1 const char* SOAP_FMAC2 soap_get_header_attribute(struct soap*, const char*, const char*); SOAP_FMAC1 const char* SOAP_FMAC2 soap_decode_key(char*, size_t, const char*); SOAP_FMAC1 const char* SOAP_FMAC2 soap_decode_val(char*, size_t, const char*); SOAP_FMAC1 size_t SOAP_FMAC2 soap_hash(const char*); SOAP_FMAC1 void SOAP_FMAC2 soap_set_endpoint(struct soap*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_flush_raw(struct soap*, const char*, size_t); SOAP_FMAC1 int SOAP_FMAC2 soap_flush(struct soap*); SOAP_FMAC1 soap_wchar SOAP_FMAC2 soap_get(struct soap*); SOAP_FMAC1 soap_wchar SOAP_FMAC2 soap_getchar(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_tag_cmp(const char*, const char*); SOAP_FMAC1 void SOAP_FMAC2 soap_set_fault(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_sender_fault(struct soap*, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_sender_fault_subcode(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_receiver_fault(struct soap*, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_receiver_fault_subcode(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_set_sender_error(struct soap*, const char*, const char*, int); SOAP_FMAC1 int SOAP_FMAC2 soap_set_receiver_error(struct soap*, const char*, const char*, int); SOAP_FMAC1 int SOAP_FMAC2 soap_send_raw(struct soap*, const char*, size_t); SOAP_FMAC1 int SOAP_FMAC2 soap_recv_raw(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_recv(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_send(struct soap*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_send2(struct soap*, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_send3(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_pututf8(struct soap*, unsigned long); SOAP_FMAC1 soap_wchar SOAP_FMAC2 soap_getutf8(struct soap*); SOAP_FMAC1 size_t SOAP_FMAC2 soap_utf8len(const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_putbase64(struct soap*, const unsigned char*, int); SOAP_FMAC1 unsigned char* SOAP_FMAC2 soap_getbase64(struct soap*, int*, int); SOAP_FMAC1 int SOAP_FMAC2 soap_puthex(struct soap*, const unsigned char*, int); SOAP_FMAC1 unsigned char* SOAP_FMAC2 soap_gethex(struct soap*, int*); #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_xop_forward(struct soap*, unsigned char**, int*, char**, char**, char**); SOAP_FMAC1 int SOAP_FMAC2 soap_attachment_forward(struct soap*, unsigned char**, int*, char**, char**, char**); #endif SOAP_FMAC1 int SOAP_FMAC2 soap_pointer_lookup(struct soap*, const void *p, int t, struct soap_plist**); SOAP_FMAC1 int SOAP_FMAC2 soap_pointer_enter(struct soap*, const void *p, const void *a, int n, int t, struct soap_plist**); SOAP_FMAC1 int SOAP_FMAC2 soap_array_pointer_lookup(struct soap*, const void *p, const void *a, int n, int t, struct soap_plist**); #ifndef WITH_NOIDREF SOAP_FMAC1 int SOAP_FMAC2 soap_pointer_lookup_id(struct soap*, void *p, int t, struct soap_plist**); SOAP_FMAC1 int SOAP_FMAC2 soap_embed(struct soap *soap, const void *p, const void *a, int n, int type); SOAP_FMAC1 struct soap_ilist* SOAP_FMAC2 soap_lookup(struct soap*, const char*); SOAP_FMAC1 struct soap_ilist* SOAP_FMAC2 soap_enter(struct soap*, const char*, int, size_t); SOAP_FMAC1 int SOAP_FMAC2 soap_resolve(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_embedded(struct soap*, const void *p, int t); SOAP_FMAC1 int SOAP_FMAC2 soap_reference(struct soap*, const void *p, int t); SOAP_FMAC1 int SOAP_FMAC2 soap_array_reference(struct soap*, const void *p, const void *a, int n, int t); SOAP_FMAC1 int SOAP_FMAC2 soap_embedded_id(struct soap*, int id, const void *p, int t); SOAP_FMAC1 int SOAP_FMAC2 soap_is_embedded(struct soap*, struct soap_plist*); SOAP_FMAC1 int SOAP_FMAC2 soap_is_single(struct soap*, struct soap_plist*); SOAP_FMAC1 void SOAP_FMAC2 soap_set_embedded(struct soap*, struct soap_plist*); #endif SOAP_FMAC1 int SOAP_FMAC2 soap_check_and_mark(struct soap *soap, const void *p, int t, char **mark); SOAP_FMAC1 void * SOAP_FMAC2 soap_mark_lookup(struct soap *soap, const void *p, int t, struct soap_plist **pp, char **mark); SOAP_FMAC1 int SOAP_FMAC2 soap_mark_cycle(struct soap *soap, struct soap_plist *pp); SOAP_FMAC1 void SOAP_FMAC2 soap_mark_dup(struct soap *soap, void *a, struct soap_plist *pp); SOAP_FMAC1 void SOAP_FMAC2 soap_unmark(struct soap *soap, char *mark); SOAP_FMAC1 int SOAP_FMAC2 soap_begin_count(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_end_count(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_begin_send(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_end_send(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_end_send_flush(struct soap*); SOAP_FMAC1 const struct soap_code_map* SOAP_FMAC2 soap_code(const struct soap_code_map*, const char*); SOAP_FMAC1 LONG64 SOAP_FMAC2 soap_code_int(const struct soap_code_map*, const char*, LONG64); SOAP_FMAC1 const char* SOAP_FMAC2 soap_code_str(const struct soap_code_map*, long); SOAP_FMAC1 LONG64 SOAP_FMAC2 soap_code_bits(const struct soap_code_map*, const char*); SOAP_FMAC1 const char* SOAP_FMAC2 soap_code_list(struct soap*, const struct soap_code_map*, long); SOAP_FMAC1 int SOAP_FMAC2 soap_getline(struct soap*, char*, int); SOAP_FMAC1 int SOAP_FMAC2 soap_begin_serve(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_begin_recv(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_end_recv(struct soap*); SOAP_FMAC1 void* SOAP_FMAC2 soap_malloc(struct soap*, size_t); SOAP_FMAC1 void SOAP_FMAC2 soap_dealloc(struct soap*, void*); SOAP_FMAC1 struct soap_clist * SOAP_FMAC2 soap_link(struct soap*, void*, int, int, int (*fdelete)(struct soap_clist*)); SOAP_FMAC1 int SOAP_FMAC2 soap_unlink(struct soap*, const void*); SOAP_FMAC1 void SOAP_FMAC2 soap_free_temp(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_del(struct soap*); SOAP_FMAC1 void* SOAP_FMAC2 soap_track_malloc(struct soap*, const char*, int, size_t); SOAP_FMAC1 void SOAP_FMAC2 soap_track_free(struct soap*, const char*, int, void*); #ifndef WITH_NOIDREF SOAP_FMAC1 int SOAP_FMAC2 soap_lookup_type(struct soap*, const char *id); SOAP_FMAC1 short SOAP_FMAC2 soap_begin_shaky(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_end_shaky(struct soap*, short); SOAP_FMAC1 void* SOAP_FMAC2 soap_id_lookup(struct soap*, const char *id, void **p, int t, size_t n, unsigned int k, int (*fbase)(int, int)); SOAP_FMAC1 void* SOAP_FMAC2 soap_id_forward(struct soap*, const char *id, void *p, size_t i, int t, int tt, size_t n, unsigned int k, void(*finsert)(struct soap*, int, int, void*, size_t, const void*, void**), int (*fbase)(int, int)); SOAP_FMAC1 int SOAP_FMAC2 soap_id_nullify(struct soap*, const char*); #endif SOAP_FMAC1 void* SOAP_FMAC2 soap_id_enter(struct soap*, const char *id, void *p, int t, size_t n, const char *type, const char *arrayType, void *(*finstantiate)(struct soap*, int, const char*, const char*, size_t*), int (*fbase)(int, int)); SOAP_FMAC1 void** SOAP_FMAC2 soap_id_smart(struct soap *soap, const char*, int, size_t); SOAP_FMAC1 size_t SOAP_FMAC2 soap_size(const int *, int); SOAP_FMAC1 size_t SOAP_FMAC2 soap_getsizes(const char *, int *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_getoffsets(const char *, const int *, int *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_getposition(const char *, int *); SOAP_FMAC1 char* SOAP_FMAC2 soap_putsizesoffsets(struct soap*, const char *, const int *, const int *, int); SOAP_FMAC1 char* SOAP_FMAC2 soap_putoffsets(struct soap*, const int *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_closesock(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_force_closesock(struct soap*); SOAP_FMAC1 struct soap *SOAP_FMAC2 soap_versioning(soap_new)(soap_mode, soap_mode); SOAP_FMAC1 void SOAP_FMAC2 soap_free(struct soap*); SOAP_FMAC1 struct soap *SOAP_FMAC2 soap_copy(const struct soap*); SOAP_FMAC1 struct soap *SOAP_FMAC2 soap_copy_context(struct soap*, const struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_copy_stream(struct soap*, struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_free_stream(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_versioning(soap_init)(struct soap*, soap_mode, soap_mode); SOAP_FMAC1 void SOAP_FMAC2 soap_initialize(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_done(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_cleanup(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_begin(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_end(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_delete(struct soap*, void*); SOAP_FMAC1 void SOAP_FMAC2 soap_delegate_deletion(struct soap*, struct soap*); /* API functions available with DEBUG or SOAP_DEBUG defined: */ SOAP_FMAC1 void SOAP_FMAC2 soap_set_recv_logfile(struct soap*, const char*); SOAP_FMAC1 void SOAP_FMAC2 soap_set_sent_logfile(struct soap*, const char*); SOAP_FMAC1 void SOAP_FMAC2 soap_set_test_logfile(struct soap*, const char*); SOAP_FMAC1 void SOAP_FMAC2 soap_close_logfiles(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_open_logfile(struct soap*, int); /* */ SOAP_FMAC1 const char* SOAP_FMAC2 soap_value(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_match_tag(struct soap*, const char*, const char *); SOAP_FMAC1 int SOAP_FMAC2 soap_match_array(struct soap*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_element(struct soap*, const char*, int, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_element_begin_out(struct soap*, const char *tag, int id, const char *type); SOAP_FMAC1 int SOAP_FMAC2 soap_array_begin_out(struct soap*, const char *tag, int id, const char *type, const char *offset); SOAP_FMAC1 int SOAP_FMAC2 soap_element_ref(struct soap*, const char *tag, int id, int href); SOAP_FMAC1 int SOAP_FMAC2 soap_element_href(struct soap*, const char *tag, int id, const char *ref, const char *val); SOAP_FMAC1 int SOAP_FMAC2 soap_element_null(struct soap*, const char *tag, int id, const char *type); SOAP_FMAC1 int SOAP_FMAC2 soap_element_nil(struct soap*, const char *tag); SOAP_FMAC1 int SOAP_FMAC2 soap_element_id(struct soap*, const char *tag, int id, const void *p, const void *a, int n, const char *type, int t, char **mark); SOAP_FMAC1 int SOAP_FMAC2 soap_element_result(struct soap*, const char *tag); SOAP_FMAC1 void SOAP_FMAC2 soap_check_result(struct soap*, const char *tag); SOAP_FMAC1 int SOAP_FMAC2 soap_element_end_out(struct soap*, const char *tag); SOAP_FMAC1 int SOAP_FMAC2 soap_element_start_end_out(struct soap*, const char *tag); SOAP_FMAC1 int SOAP_FMAC2 soap_attribute(struct soap*, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_element_begin_in(struct soap*, const char *tag, int nillable, const char *type); SOAP_FMAC1 int SOAP_FMAC2 soap_element_end_in(struct soap*, const char *tag); SOAP_FMAC1 int SOAP_FMAC2 soap_peek_element(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_retry(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_revert(struct soap*); SOAP_FMAC1 void* SOAP_FMAC2 soap_memdup(struct soap*, const void*, size_t); SOAP_FMAC1 char* SOAP_FMAC2 soap_strdup(struct soap*, const char*); SOAP_FMAC1 wchar_t* SOAP_FMAC2 soap_wstrdup(struct soap*, const wchar_t*); SOAP_FMAC1 char* SOAP_FMAC2 soap_strtrim(struct soap*, char*); SOAP_FMAC1 wchar_t* SOAP_FMAC2 soap_wstrtrim(struct soap*, wchar_t*); SOAP_FMAC1 const char * SOAP_FMAC2 soap_tagsearch(const char *big, const char *little); SOAP_FMAC1 int SOAP_FMAC2 soap_string_out(struct soap*, const char *s, int flag); SOAP_FMAC1 char* SOAP_FMAC2 soap_string_in(struct soap*, int, long, long, const char*); #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_wstring_out(struct soap*, const wchar_t *s, int flag); SOAP_FMAC1 wchar_t* SOAP_FMAC2 soap_wstring_in(struct soap*, int, long, long, const char*); #endif SOAP_FMAC1 int SOAP_FMAC2 soap_match_namespace(struct soap*, const char *, const char*, size_t n1, size_t n2); SOAP_FMAC1 void SOAP_FMAC2 soap_set_version(struct soap*, short); SOAP_FMAC1 void SOAP_FMAC2 soap_get_version(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_set_namespaces(struct soap*, const struct Namespace*); SOAP_FMAC1 void SOAP_FMAC2 soap_set_local_namespaces(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_pop_namespace(struct soap*); SOAP_FMAC1 struct soap_nlist* SOAP_FMAC2 soap_push_namespace(struct soap*, const char *,const char *); SOAP_FMAC1 const char* SOAP_FMAC2 soap_current_namespace(struct soap *soap, const char *tag); SOAP_FMAC1 struct soap_nlist* SOAP_FMAC2 soap_lookup_ns(struct soap *soap, const char *tag, size_t n); SOAP_FMAC1 int SOAP_FMAC2 soap_store_lab(struct soap*, const char*, size_t); SOAP_FMAC1 int SOAP_FMAC2 soap_append_lab(struct soap*, const char*, size_t); SOAP_FMAC1 struct soap_blist* SOAP_FMAC2 soap_new_block(struct soap*); SOAP_FMAC1 void* SOAP_FMAC2 soap_push_block(struct soap*, struct soap_blist*, size_t); SOAP_FMAC1 void SOAP_FMAC2 soap_pop_block(struct soap*, struct soap_blist*); SOAP_FMAC1 size_t SOAP_FMAC2 soap_size_block(struct soap*, struct soap_blist*, size_t); SOAP_FMAC1 char* SOAP_FMAC2 soap_first_block(struct soap*, struct soap_blist*); SOAP_FMAC1 char* SOAP_FMAC2 soap_next_block(struct soap*, struct soap_blist*); SOAP_FMAC1 size_t SOAP_FMAC2 soap_block_size(struct soap*, struct soap_blist*); SOAP_FMAC1 char* SOAP_FMAC2 soap_save_block(struct soap*, struct soap_blist*, char*, int); SOAP_FMAC1 void SOAP_FMAC2 soap_end_block(struct soap*, struct soap_blist*); SOAP_FMAC1 void SOAP_FMAC2 soap_update_pointers(struct soap *soap, const char *dst, const char *src, size_t len); SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_begin_out(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_end_out(struct soap*); SOAP_FMAC1 char * SOAP_FMAC2 soap_get_http_body(struct soap*, size_t *len); SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_begin_in(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_end_in(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_body_begin_out(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_body_end_out(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_body_begin_in(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_body_end_in(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_recv_header(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_response(struct soap*, int); SOAP_FMAC1 int SOAP_FMAC2 soap_send_empty_response(struct soap*, int status); SOAP_FMAC1 int SOAP_FMAC2 soap_recv_empty_response(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_send_fault(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_recv_fault(struct soap*, int check); #ifndef WITH_NOSTDLIB SOAP_FMAC1 void SOAP_FMAC2 soap_print_fault(struct soap*, FILE*); SOAP_FMAC1 void SOAP_FMAC2 soap_print_fault_location(struct soap*, FILE*); # ifndef WITH_LEAN # ifndef WITH_COMPAT # ifdef __cplusplus SOAP_FMAC1 void SOAP_FMAC2 soap_stream_fault(struct soap*, std::ostream&); # endif # endif SOAP_FMAC1 char* SOAP_FMAC2 soap_sprint_fault(struct soap*, char*, size_t); # endif #endif SOAP_FMAC1 int SOAP_FMAC2 soap_s2byte(struct soap*, const char*, char*); SOAP_FMAC1 int SOAP_FMAC2 soap_s2short(struct soap*, const char*, short*); SOAP_FMAC1 int SOAP_FMAC2 soap_s2int(struct soap*, const char*, int*); SOAP_FMAC1 int SOAP_FMAC2 soap_s2long(struct soap*, const char*, long*); SOAP_FMAC1 int SOAP_FMAC2 soap_s2LONG64(struct soap*, const char*, LONG64*); SOAP_FMAC1 int SOAP_FMAC2 soap_s2float(struct soap*, const char*, float*); SOAP_FMAC1 int SOAP_FMAC2 soap_s2double(struct soap*, const char*, double*); SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedByte(struct soap*, const char*, unsigned char*); SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedShort(struct soap*, const char*, unsigned short*); SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedInt(struct soap*, const char*, unsigned int*); SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedLong(struct soap*, const char*, unsigned long*); SOAP_FMAC1 int SOAP_FMAC2 soap_s2ULONG64(struct soap*, const char*, ULONG64*); SOAP_FMAC1 int SOAP_FMAC2 soap_s2string(struct soap*, const char*, char**, long minlen, long maxlen); SOAP_FMAC1 int SOAP_FMAC2 soap_s2QName(struct soap*, const char*, char**, long minlen, long maxlen); #ifndef WITH_COMPAT #ifdef __cplusplus SOAP_FMAC1 int SOAP_FMAC2 soap_s2std__QName(struct soap*, const char*, std::string*, long minlen, long maxlen); SOAP_FMAC1 int SOAP_FMAC2 soap_s2std__string(struct soap*, const char*, std::string*, long minlen, long maxlen); SOAP_FMAC1 int SOAP_FMAC2 soap_s2std__wstring(struct soap*, const char*, std::wstring*, long minlen, long maxlen); #endif #endif #if !defined(WITH_LEAN) || defined(WITH_NTLM) SOAP_FMAC1 int SOAP_FMAC2 soap_s2wchar(struct soap*, const char*, wchar_t**, long minlen, long maxlen); SOAP_FMAC1 int SOAP_FMAC2 soap_s2dateTime(struct soap*, const char*, time_t*); SOAP_FMAC1 char* SOAP_FMAC2 soap_s2base64(struct soap*, const unsigned char*, char*, int); SOAP_FMAC1 char* SOAP_FMAC2 soap_s2hex(struct soap*, const unsigned char*, char*, int); #endif SOAP_FMAC1 const char* SOAP_FMAC2 soap_byte2s(struct soap*, char); SOAP_FMAC1 const char* SOAP_FMAC2 soap_short2s(struct soap*, short); SOAP_FMAC1 const char* SOAP_FMAC2 soap_int2s(struct soap*, int); SOAP_FMAC1 const char* SOAP_FMAC2 soap_long2s(struct soap*, long); SOAP_FMAC1 const char* SOAP_FMAC2 soap_LONG642s(struct soap*, LONG64); SOAP_FMAC1 const char* SOAP_FMAC2 soap_float2s(struct soap*, float); SOAP_FMAC1 const char* SOAP_FMAC2 soap_double2s(struct soap*, double); SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedByte2s(struct soap*, unsigned char); SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedShort2s(struct soap*, unsigned short); SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedInt2s(struct soap*, unsigned int); SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedLong2s(struct soap*, unsigned long); SOAP_FMAC1 const char* SOAP_FMAC2 soap_ULONG642s(struct soap*, ULONG64); SOAP_FMAC1 const char* SOAP_FMAC2 soap_QName2s(struct soap*, const char*); #if !defined(WITH_LEAN) || defined(WITH_NTLM) SOAP_FMAC1 const char* SOAP_FMAC2 soap_wchar2s(struct soap*, const wchar_t*); SOAP_FMAC1 const char* SOAP_FMAC2 soap_dateTime2s(struct soap*, time_t); SOAP_FMAC1 const char* SOAP_FMAC2 soap_base642s(struct soap*, const char*, char*, size_t, int*); SOAP_FMAC1 const char* SOAP_FMAC2 soap_hex2s(struct soap*, const char*, char*, size_t, int*); #endif SOAP_FMAC1 int* SOAP_FMAC2 soap_inint(struct soap*, const char *tag, int *p, const char *, int); SOAP_FMAC1 char* SOAP_FMAC2 soap_inbyte(struct soap*, const char *tag, char *p, const char *, int); SOAP_FMAC1 long* SOAP_FMAC2 soap_inlong(struct soap*, const char *tag, long *p, const char *, int); SOAP_FMAC1 LONG64* SOAP_FMAC2 soap_inLONG64(struct soap*, const char *tag, LONG64 *p, const char *, int); SOAP_FMAC1 short* SOAP_FMAC2 soap_inshort(struct soap*, const char *tag, short *p, const char *, int); SOAP_FMAC1 float* SOAP_FMAC2 soap_infloat(struct soap*, const char *tag, float *p, const char *, int); SOAP_FMAC1 double* SOAP_FMAC2 soap_indouble(struct soap*, const char *tag, double *p, const char *, int); SOAP_FMAC1 unsigned char* SOAP_FMAC2 soap_inunsignedByte(struct soap*, const char *tag, unsigned char *p, const char *, int); SOAP_FMAC1 unsigned short* SOAP_FMAC2 soap_inunsignedShort(struct soap*, const char *tag, unsigned short *p, const char *, int); SOAP_FMAC1 unsigned int* SOAP_FMAC2 soap_inunsignedInt(struct soap*, const char *tag, unsigned int *p, const char *, int); SOAP_FMAC1 unsigned long* SOAP_FMAC2 soap_inunsignedLong(struct soap*, const char *tag, unsigned long *p, const char *, int); SOAP_FMAC1 ULONG64* SOAP_FMAC2 soap_inULONG64(struct soap*, const char *tag, ULONG64 *p, const char *, int); SOAP_FMAC1 char** SOAP_FMAC2 soap_instring(struct soap*, const char *tag, char **p, const char *, int, int, long, long, const char*); SOAP_FMAC1 char** SOAP_FMAC2 soap_inliteral(struct soap*, const char *tag, char **p); #ifndef WITH_LEAN SOAP_FMAC1 time_t* SOAP_FMAC2 soap_indateTime(struct soap*, const char *tag, time_t *p, const char *, int); SOAP_FMAC1 time_t SOAP_FMAC2 soap_timegm(struct tm*); #endif #ifndef WITH_LEANER SOAP_FMAC1 wchar_t** SOAP_FMAC2 soap_inwstring(struct soap*, const char *tag, wchar_t **p, const char *, int, long, long, const char*); SOAP_FMAC1 wchar_t** SOAP_FMAC2 soap_inwliteral(struct soap*, const char *tag, wchar_t **p); #endif SOAP_FMAC1 int SOAP_FMAC2 soap_outbyte(struct soap*, const char *tag, int id, const char *p, const char *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_outshort(struct soap*, const char *tag, int id, const short *p, const char *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_outint(struct soap*, const char *tag, int id, const int *p, const char *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_outlong(struct soap*, const char *tag, int id, const long *p, const char *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_outLONG64(struct soap*, const char *tag, int id, const LONG64 *p, const char *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_outfloat(struct soap*, const char *tag, int id, const float *p, const char *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_outdouble(struct soap*, const char *tag, int id, const double *p, const char *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_outunsignedByte(struct soap*, const char *tag, int id, const unsigned char *p, const char *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_outunsignedShort(struct soap*, const char *tag, int id, const unsigned short *p, const char *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_outunsignedInt(struct soap*, const char *tag, int id, const unsigned int *p, const char *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_outunsignedLong(struct soap*, const char *tag, int id, const unsigned long *p, const char *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_outULONG64(struct soap*, const char *tag, int id, const ULONG64 *p, const char *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_outstring(struct soap*, const char *tag, int id, char *const*p, const char *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_outliteral(struct soap*, const char *tag, char *const*p, const char *type); #ifndef WITH_LEAN SOAP_FMAC1 int SOAP_FMAC2 soap_outdateTime(struct soap*, const char *tag, int id, const time_t *p, const char *, int); #endif #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_outwstring(struct soap*, const char *tag, int id, wchar_t *const*p, const char *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_outwliteral(struct soap*, const char *tag, wchar_t *const*p, const char *type); #endif #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_attachment(struct soap *, const char*, int, const void*, const void*, int, const char*, const char*, const char*, const char*, int); SOAP_FMAC1 int SOAP_FMAC2 soap_move(struct soap*, size_t); SOAP_FMAC1 size_t SOAP_FMAC2 soap_tell(struct soap*); SOAP_FMAC1 char* SOAP_FMAC2 soap_dime_option(struct soap*, unsigned short, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_getdimehdr(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_getdime(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_putdimehdr(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_putdime(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_getmimehdr(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_getmime(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_putmimehdr(struct soap*, struct soap_multipart*); SOAP_FMAC1 int SOAP_FMAC2 soap_putmime(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_set_dime(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_set_mime(struct soap*, const char *boundary, const char *start); SOAP_FMAC1 void SOAP_FMAC2 soap_clr_dime(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_clr_mime(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_set_dime_attachment(struct soap*, char *ptr, size_t size, const char *type, const char *id, unsigned short optype, const char *option); SOAP_FMAC1 int SOAP_FMAC2 soap_set_mime_attachment(struct soap*, char *ptr, size_t size, enum soap_mime_encoding encoding, const char *type, const char *id, const char *location, const char *description); SOAP_FMAC1 void SOAP_FMAC2 soap_post_check_mime_attachments(struct soap *soap); SOAP_FMAC1 int SOAP_FMAC2 soap_check_mime_attachments(struct soap *soap); SOAP_FMAC1 struct soap_multipart* SOAP_FMAC2 soap_get_mime_attachment(struct soap *soap, void *handle); SOAP_FMAC1 int SOAP_FMAC2 soap_match_cid(struct soap*, const char*, const char*); #endif SOAP_FMAC1 int SOAP_FMAC2 soap_register_plugin_arg(struct soap*, int (*fcreate)(struct soap*, struct soap_plugin*, void*), void*); SOAP_FMAC1 void* SOAP_FMAC2 soap_lookup_plugin(struct soap*, const char*); SOAP_FMAC1 const char* SOAP_FMAC2 soap_attr_value(struct soap *soap, const char *name, int flag); SOAP_FMAC1 int SOAP_FMAC2 soap_set_attr(struct soap *soap, const char *name, const char *value, int flag); SOAP_FMAC1 void SOAP_FMAC2 soap_clr_attr(struct soap *soap); SOAP_FMAC1 const char* SOAP_FMAC2 soap_url(struct soap *soap, const char*, const char*); SOAP_FMAC1 size_t SOAP_FMAC2 soap_encode_url(const char*, char*, size_t); SOAP_FMAC1 const char* SOAP_FMAC2 soap_encode_url_string(struct soap*, const char*); #ifdef WITH_COOKIES SOAP_FMAC1 void SOAP_FMAC2 soap_getcookies(struct soap *soap, const char *val); SOAP_FMAC1 extern struct soap_cookie* SOAP_FMAC2 soap_set_cookie(struct soap*, const char*, const char*, const char*, const char*); SOAP_FMAC1 extern struct soap_cookie* SOAP_FMAC2 soap_cookie(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 extern char* SOAP_FMAC2 soap_cookie_value(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 extern char* SOAP_FMAC2 soap_env_cookie_value(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 extern time_t SOAP_FMAC2 soap_cookie_expire(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 extern int SOAP_FMAC2 soap_set_cookie_expire(struct soap*, const char*, long, const char*, const char*); SOAP_FMAC1 extern int SOAP_FMAC2 soap_set_cookie_session(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 extern int SOAP_FMAC2 soap_clr_cookie_session(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 extern void SOAP_FMAC2 soap_clr_cookie(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 extern int SOAP_FMAC2 soap_getenv_cookies(struct soap*); SOAP_FMAC1 extern struct soap_cookie* SOAP_FMAC2 soap_copy_cookies(struct soap*, const struct soap*); SOAP_FMAC1 extern void SOAP_FMAC2 soap_free_cookies(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_putsetcookies(struct soap *soap); SOAP_FMAC1 int SOAP_FMAC2 soap_putcookies(struct soap *soap, const char *domain, const char *path, int secure); #endif #ifdef __cplusplus } /* extern "C" */ #endif #ifdef __cplusplus /* C++ templates (for generated C++ only, not needed nor used in generated C code) */ template struct soap_block { static T *push(struct soap *soap, struct soap_blist *b) { if (!b) b = soap->blist; if (!b) return NULL; T *p = (T*)soap_push_block(soap, b, sizeof(T)); if (p) SOAP_PLACEMENT_NEW(p, T); return p; } static void pop(struct soap *soap, struct soap_blist *b) { if (!b) b = soap->blist; if (!b || !b->head) return; ((T*)(b->head + 1))->T::~T(); soap_pop_block(soap, b); } static void save(struct soap *soap, struct soap_blist *b, T *p) { if (!b) b = soap->blist; for (T *q = (T*)soap_first_block(soap, b); q; q = (T*)soap_next_block(soap, b)) { soap_update_pointers(soap, (const char*)p, (const char*)q, sizeof(T)); *p++ = *q; q->T::~T(); } } static void end(struct soap *soap, struct soap_blist *b) { if (!b) b = soap->blist; for (T *p = (T*)soap_first_block(soap, b); p; p = (T*)soap_next_block(soap, b)) p->T::~T(); soap_end_block(soap, b); } }; #endif #endif /* STDSOAP_H */ gsoap-2.8.28/gsoap/VisualStudio2005/wsdl2h/wsdl2h/dime.h0000644000175000017500000000320712653650160022042 0ustar ellertellert/* dime.h WSDL/DIME binding schema -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap dime schema documentation: WSDL/DIME binding schema //gsoap dime schema namespace: http://schemas.xmlsoap.org/ws/2002/04/dime/wsdl/ #import "imports.h" class dime__message { public: @xsd__anyURI layout; // @xsd__boolean wsdl__required; }; gsoap-2.8.28/gsoap/VisualStudio2005/wsdl2h/wsdl2h/stlvector.h0000644000175000017500000000455212653650160023155 0ustar ellertellert/* stlvector.h Use #import "stlvector.h" in a gSOAP header file to enable STL vectors. Use soapcpp2 option -Ipath:path:... to specify the path(s) for #import gSOAP XML Web services tools Copyright (C) 2000-2005, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under one of the following licenses: GPL, the gSOAP public license, or Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2005 Robert A. van Engelen, Genivia inc. All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include template class std::vector; gsoap-2.8.28/gsoap/VisualStudio2005/wsdl2h/wsdl2h/http.h0000644000175000017500000000371312653650160022105 0ustar ellertellert/* http.h WSDL/HTTP binding schema interface -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2012, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap http schema documentation: WSDL 1.1 HTTP binding schema //gsoap http schema namespace: http://schemas.xmlsoap.org/wsdl/http/ //gsoap whttp schema documentation: WSDL 2.0 HTTP binding schema //gsoap whttp schema namespace: http://www.w3.org/ns/wsdl/http #import "imports.h" class http__address { public: @xsd__anyURI location; }; class http__binding { public: @xsd__NMTOKEN verb; }; class http__operation { public: @xsd__anyURI location; }; class whttp__header { public: @xsd__string name; @xsd__QName type; @xsd__boolean required = false; }; gsoap-2.8.28/gsoap/VisualStudio2005/wsdl2h/debug/0000755000175000017500000000000012653650160020634 5ustar ellertellertgsoap-2.8.28/gsoap/VisualStudio2005/wsdl2h/release/0000755000175000017500000000000012653650160021166 5ustar ellertellertgsoap-2.8.28/gsoap/VisualStudio2005/README.txt0000644000175000017500000000444112653650160020044 0ustar ellertellert Flex and Bison for Windows ========================== Visual Studio 2005 Solution files for soapcpp2 and wsdl2h are included. If not already installed, install the Platform SDK (R2) for `winsock2.h`. To build `soapcpp2.exe`, first install Bison and Flex (in the default dirs): then add the FlexBison.rules as explained here: These custom-build rules are used to build the scanner and parser for `soapcpp2.exe`. To build `wsdl2h.exe`, you first need to build `soapcpp2.exe` and install it in Program Files or copy it to the `wsdl` directory. This is needed to execute the custom-build step on `wsdl.h` to generate `wsdlStub.h`, `wsdlH.h`, and `wsdlC.cpp`. Build Rules for `soapcpp2.exe` VS 2008 and 2010 =============================================== To build `soapcpp2.exe` you need to install Flex and Bison. To do so, you need to create custom build rules to compile `.l` and `.y` files with Flex and Bison. Please see: In VS2008, there is UI available to help you create the custom build rule. Make sure you have `flex.exe`, `bison.exe`, and `m4.exe` on the system search path. - Right click on the `.l` file and select properties - Configuration -> All Configurations - General -> Item Typ e-> Custom Build Tool - Apply - Custom Build Tool -> General -> Command Line -> `flex -olexer.c lexer.l` - Custom Build Tool -> General -> Outputs -> `lexer.c` - Custom Build Tool -> General -> Additional Dependencies -> `parser.y parser.c` - Apply - Select the `.y` file in the solution explorer - Configuration -> All Configurations - General -> Item Type -> Custom Build Tool - Apply - Custom Build Tool -> General -> Command Line -> `bison -oparser.c parser.y` - Custom Build Tool -> General -> Outputs -> `parser.c parser.h` In VS2010, there may not be a UI available to create the custom build rules. To add or modify build rules in VS2010 you need to edit: `%ProgramFiles%\MSBuild\Microsoft.Cpp\v4.0\BuildCustomizations` and/or `%ProgramFiles(x86)%\MSBuild\Microsoft.Cpp\v4.0\BuildCustomizations` gsoap-2.8.28/gsoap/dom.cpp0000644000175000017500000051361212653650146014700 0ustar ellertellert/* dom.c[pp] DOM API v5 gSOAP 2.8.28 See gsoap/doc/dom/html/index.html for the new DOM API v5 documentation Also located in /gsoap/samples/dom/README.md gSOAP XML Web services tools Copyright (C) 2000-2016, Robert van Engelen, Genivia, Inc. All Rights Reserved. This part of the software is released under ONE of the following licenses: GPL, or the gSOAP public license, or Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2016, Robert van Engelen, Genivia Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ /** Compatibility requirement with gSOAP engine version */ #define GSOAP_LIB_VERSION 20828 #include "stdsoap2.h" #if GSOAP_VERSION != GSOAP_LIB_VERSION # error "GSOAP VERSION MISMATCH IN LIBRARY: PLEASE REINSTALL PACKAGE" #endif SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_xsd__anyType(struct soap*, const struct soap_dom_element *); SOAP_FMAC3 void SOAP_FMAC4 soap_traverse_xsd__anyType(struct soap*, struct soap_dom_element*, const char*, soap_walker, soap_walker); SOAP_FMAC1 void SOAP_FMAC2 soap_default_xsd__anyType(struct soap*, struct soap_dom_element *); SOAP_FMAC3 int SOAP_FMAC4 soap_put_xsd__anyType(struct soap*, const struct soap_dom_element*, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_out_xsd__anyType(struct soap*, const char*, int, const struct soap_dom_element*, const char*); SOAP_FMAC3 struct soap_dom_element * SOAP_FMAC4 soap_get_xsd__anyType(struct soap*, struct soap_dom_element*, const char*, const char*); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_in_xsd__anyType(struct soap*, const char*, struct soap_dom_element *, const char*); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_xsd__anyAttribute(struct soap*, const struct soap_dom_attribute*); SOAP_FMAC3 void SOAP_FMAC4 soap_traverse_xsd__anyAttribute(struct soap*, struct soap_dom_attribute*, const char*, soap_walker, soap_walker); SOAP_FMAC1 void SOAP_FMAC2 soap_default_xsd__anyAttribute(struct soap*, struct soap_dom_attribute*); SOAP_FMAC3 int SOAP_FMAC4 soap_put_xsd__anyAttribute(struct soap*, const struct soap_dom_attribute*, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_out_xsd__anyAttribute(struct soap*, const char*, int, const struct soap_dom_attribute*, const char*); SOAP_FMAC3 struct soap_dom_attribute * SOAP_FMAC4 soap_get_xsd__anyAttribute(struct soap*, struct soap_dom_attribute*, const char*, const char*); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_in_xsd__anyAttribute(struct soap*, const char*, struct soap_dom_attribute *, const char*); #ifdef __cplusplus extern "C" { #endif #ifndef WITH_NOIDREF SOAP_FMAC1 void SOAP_FMAC2 soap_markelement(struct soap*, const void*, int); #endif SOAP_FMAC1 int SOAP_FMAC2 soap_putelement(struct soap*, const void*, const char*, int, int); SOAP_FMAC1 void *SOAP_FMAC2 soap_getelement(struct soap*, int*); #ifdef __cplusplus } #endif /** Format string for generating DOM namespace prefixes (< 16 chars total) */ #ifndef SOAP_DOMID_FORMAT #define SOAP_DOMID_FORMAT "_%d" #endif static int out_element(struct soap*, const struct soap_dom_element*, const char*, const char*); static int out_attribute(struct soap*, const char*, const char*, const char*, int); /* namespace name (URI) lookup and store routines */ static const char *soap_push_prefix(struct soap*, const char*, size_t, const char*, int, int); static const char *soap_prefix_of(struct soap*, const char*); static const char *soap_ns_to_set(struct soap*, const char*); static const char *soap_ns_to_get(struct soap*, const char*); static const char *soap_ns_to_find(struct soap*, const char*); static struct soap_dom_element *new_element(struct soap*); static struct soap_dom_attribute *new_attribute(struct soap*); static int soap_tag_match(const char*, const char*); static int soap_patt_match(const char*, const char*); static int soap_name_match(const char*, const char*); /******************************************************************************\ * * DOM custom (de)serializers * \******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_serialize_xsd__anyType(struct soap *soap, const struct soap_dom_element *node) { if (node) { if (node->type && node->node) soap_markelement(soap, node->node, node->type); else { const struct soap_dom_element *elt; for (elt = node->elts; elt; elt = elt->next) soap_serialize_xsd__anyType(soap, elt); } } } SOAP_FMAC3 void SOAP_FMAC4 soap_traverse_xsd__anyType(struct soap *soap, struct soap_dom_element *node, const char *s, soap_walker p, soap_walker q) { (void)soap; (void)node; (void)s; (void)p; (void)q; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_serialize_xsd__anyAttribute(struct soap *soap, const struct soap_dom_attribute *node) { (void)soap; (void)node; } SOAP_FMAC1 void SOAP_FMAC2 soap_traverse_xsd__anyAttribute(struct soap *soap, struct soap_dom_attribute *node, const char *s, soap_walker p, soap_walker q) { (void)soap; (void)node; (void)s; (void)p; (void)q; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_default_xsd__anyType(struct soap *soap, struct soap_dom_element *node) { node->next = NULL; node->prnt = NULL; node->elts = NULL; node->atts = NULL; node->nstr = NULL; node->name = NULL; node->lead = NULL; node->text = NULL; node->code = NULL; node->tail = NULL; node->node = NULL; node->type = 0; node->soap = soap; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_default_xsd__anyAttribute(struct soap *soap, struct soap_dom_attribute *node) { node->next = NULL; node->nstr = NULL; node->name = NULL; node->text = NULL; node->soap = soap; } /******************************************************************************/ static int out_element(struct soap *soap, const struct soap_dom_element *node, const char *prefix, const char *name) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM node lead '%s'\n", node->lead ? node->lead : "")); if (node->lead && soap_send(soap, node->lead)) return soap->error; if (node->type && node->node) { char *s = NULL; struct Namespace *p; if (prefix && *prefix) { size_t l = strlen(prefix) + strlen(name); s = (char*)SOAP_MALLOC(soap, l + 2); if (!s) return soap->error = SOAP_EOM; (SOAP_SNPRINTF(s, l + 2, l + 1), "%s:%s", prefix, name); } for (p = soap->local_namespaces; p && p->id; p++) if (p->ns && soap_push_prefix(soap, p->id, strlen(p->id), p->ns, 1, 0) == NULL) return soap->error; (void)soap_putelement(soap, node->node, s ? s : name, 0, node->type); if (s) SOAP_FREE(soap, s); } else if (prefix && *prefix) { size_t l = strlen(prefix) + strlen(name); char *s; if (l + 1 < sizeof(soap->msgbuf)) s = soap->msgbuf; else { s = (char*)SOAP_MALLOC(soap, l + 2); if (!s) return soap->error = SOAP_EOM; } (SOAP_SNPRINTF(s, l + 2, l + 1), "%s:%s", prefix, name); (void)soap_element(soap, s, 0, NULL); if (s != soap->msgbuf) SOAP_FREE(soap, s); } else if (*name != '-') { soap_mode m = soap->mode; if ((soap->mode & SOAP_DOM_ASIS)) soap->mode &= ~SOAP_XML_INDENT; (void)soap_element(soap, name, 0, NULL); soap->mode = m; } return soap->error; } /******************************************************************************/ static int out_attribute(struct soap *soap, const char *prefix, const char *name, const char *text, int isearly) { char *s; const char *t; size_t l; int err; if (!text) text = ""; if (!prefix || !*prefix) { if ((soap->mode & SOAP_XML_CANONICAL) && !strncmp(name, "xmlns", 5) && (name[5] == ':' || name[5] == '\0')) return soap_attribute(soap, name, text); if (isearly) return soap_set_attr(soap, name, text, 2); return soap_attribute(soap, name, text); } t = strchr(name, ':'); if (t) t++; else t = name; l = strlen(prefix) + strlen(t); if (l + 1 < sizeof(soap->msgbuf)) s = soap->msgbuf; else { s = (char*)SOAP_MALLOC(soap, l + 2); if (!s) return soap->error = SOAP_EOM; } (SOAP_SNPRINTF(s, l + 2, l + 1), "%s:%s", prefix, t); if (isearly) err = soap_set_attr(soap, s, text, 2); else err = soap_attribute(soap, s, text); if (s != soap->msgbuf) SOAP_FREE(soap, s); return err; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_out_xsd__anyType(struct soap *soap, const char *tag, int id, const struct soap_dom_element *node, const char *type) { (void)id; (void)type; if (node) { const char *prefix; /* namespace prefix, if namespace is present */ if (!(soap->mode & SOAP_DOM_ASIS) && !(soap->mode & SOAP_XML_CANONICAL)) { const struct soap_dom_attribute *att; for (att = node->atts; att; att = att->next) { if (att->name && att->text && !strncmp(att->name, "xmlns:", 6)) { if (soap_push_namespace(soap, att->name + 6, att->text) == NULL) return soap->error; } else if (att->name && att->text && !strcmp(att->name, "xmlns")) { if (soap_push_namespace(soap, "", att->text) == NULL) return soap->error; } } } if (node->name) tag = node->name; else if (!tag) tag = "-"; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM node '%s' start at level=%u\n", tag, soap->level)); prefix = NULL; if (!(soap->mode & SOAP_DOM_ASIS)) { const struct soap_nlist *np; size_t n = 0; if ((prefix = strchr(tag, ':'))) { n = prefix - tag; if (n && node->nstr) prefix = soap_prefix_of(soap, node->nstr); else prefix = NULL; } np = soap_lookup_ns(soap, tag, n); if (!prefix && ((n && !np) || (node->nstr && (!np || !np->ns || strcmp(node->nstr, np->ns))))) if (!(prefix = soap_push_prefix(soap, tag, n, node->nstr, 1, 1))) return soap->error; if (n && prefix && *prefix) tag += n + 1; } if (!soap->ns) soap->ns = 2; if (out_element(soap, node, prefix, tag)) return soap->error; if (!node->type || !node->node) { struct soap_dom_attribute *att; struct soap_dom_element *elt; for (att = node->atts; att; att = att->next) { if (att->name) { if (!(soap->mode & SOAP_DOM_ASIS)) { const char *p = NULL; if (strncmp(att->name, "xml", 3)) { if (att->nstr) p = soap_prefix_of(soap, att->nstr); if (!p) { const struct soap_nlist *np; size_t n = 0; p = strchr(att->name, ':'); if (p) n = p - att->name; p = NULL; np = soap_lookup_ns(soap, att->name, n); if ((n && !np) || (att->nstr && (!np || !np->ns || strcmp(att->nstr, np->ns)))) if (!(p = soap_push_prefix(soap, att->name, n, att->nstr, 0, 0))) return soap->error; } } if (out_attribute(soap, p, att->name, att->text, 0)) return soap->error; } else if (soap_attribute(soap, att->name, att->text)) return soap->error; } } if (!node->text && !node->code && !node->tail && !node->elts && !(soap->mode & SOAP_XML_CANONICAL)) { soap_mode m = soap->mode; soap->mode &= ~SOAP_XML_INDENT; if (*tag != '-' && soap_element_start_end_out(soap, tag)) return soap->error; soap->mode = m; } else { if (*tag != '-' && soap_element_start_end_out(soap, NULL)) return soap->error; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM node text '%s'\n", node->text ? node->text : "")); if (node->text && soap_string_out(soap, node->text, 0)) return soap->error; for (elt = node->elts; elt; elt = elt->next) if (soap_out_xsd__anyType(soap, NULL, 0, elt, NULL)) return soap->error; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM node code '%s'\n", node->code ? node->code : "")); if (node->code && soap_send(soap, node->code)) return soap->error; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM node tail '%s'\n", node->tail ? node->tail : "")); if (node->tail && soap_send(soap, node->tail)) return soap->error; if (!prefix || !*prefix) { soap_mode m = soap->mode; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM node '%s' end\n", tag)); if ((soap->mode & SOAP_DOM_ASIS)) soap->mode &= ~SOAP_XML_INDENT; if (soap_element_end_out(soap, tag)) return soap->error; soap->mode = m; } else { char *s; size_t l = strlen(prefix) + strlen(tag); if (l + 1 < sizeof(soap->msgbuf)) s = soap->msgbuf; else { s = (char*)SOAP_MALLOC(soap, l + 2); if (!s) return soap->error = SOAP_EOM; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM node '%s' end\n", tag)); (SOAP_SNPRINTF(s, l + 2, l + 1), "%s:%s", prefix, tag); if (soap_element_end_out(soap, s)) return soap->error; if (s != soap->msgbuf) SOAP_FREE(soap, s); } } } } return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_out_xsd__anyAttribute(struct soap *soap, const char *tag, int id, const struct soap_dom_attribute *node, const char *type) { const struct soap_dom_attribute *att; (void)tag; (void)id; (void)type; if (!(soap->mode & SOAP_DOM_ASIS) && !(soap->mode & SOAP_XML_CANONICAL)) { for (att = node; att; att = att->next) { if (att->name && att->text && !strncmp(att->name, "xmlns:", 6)) { if (soap_push_namespace(soap, att->name + 6, att->text) == NULL) return soap->error; } else if (att->name && att->text && !strcmp(att->name, "xmlns")) { if (soap_push_namespace(soap, "", att->text) == NULL) return soap->error; } } } for (att = node; att; att = att->next) { if (att->name) { if (!(soap->mode & SOAP_DOM_ASIS)) { const char *p = NULL; if (strncmp(att->name, "xml", 3)) { if (att->nstr) p = soap_prefix_of(soap, att->nstr); if (!p) { const struct soap_nlist *np; size_t n = 0; p = strchr(att->name, ':'); if (p) n = p - att->name; p = NULL; np = soap_lookup_ns(soap, att->name, n); if ((n && !np) || (att->nstr && (!np || !np->ns || strcmp(att->nstr, np->ns)))) if (!(p = soap_push_prefix(soap, att->name, n, att->nstr, 1, 0))) return soap->error; } } if (out_attribute(soap, p, att->name, att->text, 1)) return soap->error; } else if (soap_attribute(soap, att->name, att->text)) return soap->error; } } return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_in_xsd__anyType(struct soap *soap, const char *tag, struct soap_dom_element *node, const char *type) { struct soap_attribute *tp; struct soap_dom_attribute **att; soap_mode m = soap->mode; soap->mode |= SOAP_C_UTFSTRING; (void)tag; (void)type; if (soap_peek_element(soap)) { const char *s; if (soap->error != SOAP_NO_TAG) return NULL; s = soap_strtrim(soap, soap_string_in(soap, 1, -1, -1, NULL)); if (!s || !*s) { soap->mode = m; return NULL; } soap->mode = m; if (!node) { node = new_element(soap); if (!node) { soap->error = SOAP_EOM; return NULL; } } node->text = s; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM node with cdata\n")); soap->error = SOAP_OK; soap->peeked = 0; return node; } if (!node) { node = new_element(soap); if (!node) { soap->error = SOAP_EOM; return NULL; } } else { soap_default_xsd__anyType(soap, node); } node->nstr = soap_current_namespace(soap, soap->tag); node->name = soap_strdup(soap, soap->tag); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM node element='%s' start namespace='%s'\n", node->name, node->nstr?node->nstr:"")); if ((soap->mode & SOAP_DOM_NODE) || (!(soap->mode & SOAP_DOM_TREE) && *soap->id && (!type || strcmp(type, "xsd:anyType")))) { soap->mode = m; if ((node->node = soap_getelement(soap, &node->type)) && node->type) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM node contains type %d from xsi:type or matching element tag name\n", node->type)); return node; } if (soap->error == SOAP_TAG_MISMATCH) soap->error = SOAP_OK; else return NULL; soap->mode |= SOAP_C_UTFSTRING; } att = &node->atts; for (tp = soap->attributes; tp; tp = tp->next) { if (tp->visible) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM node attribute='%s'\n", tp->name)); *att = new_attribute(soap); if (!*att) { soap->error = SOAP_EOM; return NULL; } (*att)->next = NULL; (*att)->nstr = soap_current_namespace(soap, tp->name); (*att)->name = soap_strdup(soap, tp->name); if (tp->visible == 2) (*att)->text = soap_strdup(soap, tp->value); else (*att)->text = NULL; (*att)->soap = soap; att = &(*att)->next; tp->visible = 0; } } if (soap_element_begin_in(soap, NULL, 1, NULL)) return NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM node '%s' pulled (level=%u)\n", node->name, soap->level)); if (soap->body) { struct soap_dom_element **elt; if (soap_peek_element(soap)) { if (soap->error != SOAP_NO_TAG) return NULL; if (!(node->text = soap_strtrim(soap, soap_string_in(soap, 1, -1, -1, NULL)))) return NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM node '%s' has cdata\n", node->name)); soap->peeked = 0; } elt = &node->elts; soap->mode = m; for (;;) { if (!(*elt = soap_in_xsd__anyType(soap, NULL, NULL, NULL))) { if (soap->error && soap->error != SOAP_NO_TAG) return NULL; break; } (*elt)->prnt = node; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM node '%s' has subelement '%s'\n", node->name, (*elt)->name)); if (node->text) { if (*node->text) { struct soap_dom_element *elts = new_element(soap); if (!elts) { soap->error = SOAP_EOM; return NULL; } elts->next = *elt; elts->prnt = node; elts->text = node->text; node->elts = elts; elt = &elts->next; } node->text = NULL; } elt = &(*elt)->next; } if (!node->text && !node->elts) node->tail = ""; /* has body so tail is non-NULL for non-empty element tag */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM node '%s' end (level=%u)\n", node->name, soap->level)); if (soap_element_end_in(soap, NULL)) return NULL; if (strcmp(soap->tag, node->name)) { soap->error = SOAP_SYNTAX_ERROR; return NULL; } } soap->mode = m; return node; } /******************************************************************************/ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_in_xsd__anyAttribute(struct soap *soap, const char *tag, struct soap_dom_attribute *node, const char *type) { struct soap_attribute *tp; struct soap_dom_attribute *tmp = node; struct soap_dom_attribute *att = node; (void)tag; (void)type; for (tp = soap->attributes; tp; tp = tp->next) { if (tp->visible) { if (!att) { att = new_attribute(soap); if (tmp) tmp->next = att; else node = att; tmp = att; } if (!att) { soap->error = SOAP_EOM; return NULL; } att->next = NULL; att->nstr = soap_current_namespace(soap, tp->name); att->name = soap_strdup(soap, tp->name); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM node attribute='%s' namespace='%s'\n", att->name, att->nstr ? att->nstr : "(null)")); if (tp->visible == 2) att->text = soap_strdup(soap, tp->value); else att->text = NULL; att->soap = soap; att = NULL; } } return node; } SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_dup_xsd__anyType(struct soap *soap, struct soap_dom_element *d, const struct soap_dom_element *a) { struct soap_dom_element *elt = NULL; if (!a) return NULL; if (!d && !(d = new_element(soap))) return NULL; d->next = NULL; d->nstr = soap_strdup(soap, a->nstr); d->name = soap_strdup(soap, a->name); d->lead = soap_strdup(soap, a->lead); d->text = soap_strdup(soap, a->text); d->code = soap_strdup(soap, a->code); d->tail = soap_strdup(soap, a->tail); d->node = NULL; d->type = 0; d->atts = soap_dup_xsd__anyAttribute(soap, NULL, a->atts); for (a = a->elts; a; a = a->next) { if (elt) elt = elt->next = soap_dup_xsd__anyType(soap, NULL, a); else elt = d->elts = soap_dup_xsd__anyType(soap, NULL, a); elt->prnt = d; } return d; } SOAP_FMAC1 void SOAP_FMAC2 soap_del_xsd__anyType(const struct soap_dom_element *a) { while (a) { if (a->nstr) SOAP_FREE(NULL, a->nstr); if (a->name) SOAP_FREE(NULL, a->name); if (a->lead) SOAP_FREE(NULL, a->lead); if (a->text) SOAP_FREE(NULL, a->text); if (a->code) SOAP_FREE(NULL, a->code); if (a->tail) SOAP_FREE(NULL, a->tail); soap_del_xsd__anyAttribute(a->atts); soap_del_xsd__anyType(a->elts); a = a->next; } } SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_dup_xsd__anyAttribute(struct soap *soap, struct soap_dom_attribute *d, const struct soap_dom_attribute *a) { struct soap_dom_attribute *att; if (!a) return NULL; if (!d && !(d = new_attribute(soap))) return NULL; att = d; while (a) { att->nstr = soap_strdup(soap, a->nstr); att->name = soap_strdup(soap, a->name); att->text = soap_strdup(soap, a->text); a = a->next; if (a) { if (!(att->next = new_attribute(soap))) break; att = att->next; } } return d; } SOAP_FMAC1 void SOAP_FMAC2 soap_del_xsd__anyAttribute(const struct soap_dom_attribute *a) { while (a) { if (a->nstr) SOAP_FREE(NULL, a->nstr); if (a->name) SOAP_FREE(NULL, a->name); if (a->text) SOAP_FREE(NULL, a->text); a = a->next; } } /******************************************************************************\ * * Namespace prefix lookup/store * \******************************************************************************/ static const char * soap_push_prefix(struct soap *soap, const char *id, size_t n, const char *ns, int isearly, int iselement) { struct Namespace *p, *ln = soap->local_namespaces; struct soap_nlist *np; if (!n) id = NULL; if (!ns) { for (p = ln; p && p->id; p++) if (!strncmp(p->id, id, n) && !p->id[n]) break; if (p && p->id) { id = p->id; ns = p->out; if (!ns) ns = p->ns; } if (!ns) return ""; } else if (!id) { if (iselement) { id = ""; /* gen xmlsn="ns" for elements with nstr but no prefix */ } else { for (p = ln; p && p->id; p++) if (p->ns && !strcmp(p->ns, ns)) break; if (p && p->id) id = p->id; else { int i = 0; for (np = soap->nlist; np; np = np->next) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM find binding %s = '%s' level = %d index = %d\n", np->id, np->ns, np->level, np->index)); i++; } (SOAP_SNPRINTF(soap->tag, sizeof(soap->tag), sizeof(SOAP_DOMID_FORMAT) + 20), SOAP_DOMID_FORMAT, i); id = soap->tag; } } } else { for (np = soap->nlist; np; np = np->next) { if (!strncmp(np->id, id, n) && !np->id[n]) { if (np->ns) { if (!strcmp(np->ns, ns)) return ""; /* xmlns:id="ns" already in scope */ } else { if (!strcmp(ln[np->index].ns, ns) || (ln[np->index].out && !strcmp(ln[np->index].out, ns))) return ""; /* xmlns:id="ns" already in scope */ } break; } } soap_strncpy(soap->tag, sizeof(soap->tag), id, n); id = soap->tag; soap->local_namespaces = NULL; /* do not permit a replacement id, when ns is in table */ } /* fix advance generation of xmlns, when element (at level) is not output yet */ if (isearly) soap->level++; np = soap_push_namespace(soap, id, ns); soap->local_namespaces = ln; if (isearly) soap->level--; if (!np) return NULL; if (!np->ns) { np->ns = ln[np->index].out; if (!np->ns) np->ns = ln[np->index].ns; } np->index = 0; /* for C14N visibly utilized mark */ /* gen xmlns:id="ns" */ if (*np->id) { (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), strlen(np->id) + 6), "xmlns:%s", np->id); if (out_attribute(soap, NULL, soap->msgbuf, ns, isearly)) return NULL; } else { if (out_attribute(soap, NULL, "xmlns", ns, isearly)) return NULL; } return np->id; } /******************************************************************************/ static const char * soap_prefix_of(struct soap *soap, const char *ns) { struct soap_nlist *np; for (np = soap->nlist; np; np = np->next) if (np->ns && !strcmp(np->ns, ns)) return np->id; return NULL; } /******************************************************************************/ static const char * soap_ns_to_set(struct soap *soap, const char *tag) { const char *s; size_t n; const struct Namespace *p; if (!tag) return NULL; s = strchr(tag, ':'); if (!s) return NULL; n = s - tag; for (p = soap->namespaces; p && p->id; p++) if (!strncmp(p->id, tag, n) && !p->id[n]) return p->ns; return NULL; } /******************************************************************************/ static const char * soap_ns_to_get(struct soap *soap, const char *tag) { const char *s; size_t n; const struct Namespace *p; if (!tag) return ""; s = strchr(tag, ':'); if (!s) return ""; n = s - tag; for (p = soap->namespaces; p && p->id; p++) if (!strncmp(p->id, tag, n) && !p->id[n]) return p->out ? p->out : p->ns; return ""; } /******************************************************************************/ static const char * soap_ns_to_find(struct soap *soap, const char *tag) { const char *s; size_t n; const struct Namespace *p; if (!tag || (tag[0] == '*' && !tag[1])) return NULL; s = strchr(tag, ':'); if (!s) return ""; if (*tag == '*') return NULL; n = s - tag; for (p = soap->namespaces; p && p->id; p++) if (!strncmp(p->id, tag, n) && !p->id[n]) return p->out ? p->out : p->ns; return NULL; } /******************************************************************************\ * * Tag matching * \******************************************************************************/ static int soap_tag_match(const char *name, const char *tag) { const char *s; if (!name) return !*tag; s = strchr(name, ':'); if (s) name = s + 1; s = strchr(tag, ':'); if (s) tag = s + 1; return !strcmp(name, tag); } /******************************************************************************/ static int soap_patt_match(const char *name, const char *patt) { const char *s; if (!name) return !*patt; s = strchr(name, ':'); if (s) name = s + 1; s = strchr(patt, ':'); if (s) patt = s + 1; return soap_name_match(name, patt); } /******************************************************************************/ static int soap_name_match(const char *name, const char *patt) { for (;;) { int c1 = *name; int c2 = *patt; if (!c1) break; if (c1 != c2) { if (c2 != '*') return 0; c2 = *++patt; if (!c2) return 1; for (;;) { c1 = *name; if (!c1) break; if (c1 == c2 && soap_name_match(name + 1, patt + 1)) return 1; name++; } break; } name++; patt++; } if (*patt == '*' && !patt[1]) return 1; return !*patt; } /******************************************************************************\ * * Memory * \******************************************************************************/ static struct soap_dom_element *new_element(struct soap *soap) { struct soap_dom_element *elt; elt = (struct soap_dom_element*)soap_malloc(soap, sizeof(struct soap_dom_element)); #ifdef __cplusplus SOAP_PLACEMENT_NEW(elt, soap_dom_element); #endif if (elt) soap_default_xsd__anyType(soap, elt); return elt; } /******************************************************************************/ static struct soap_dom_attribute *new_attribute(struct soap *soap) { struct soap_dom_attribute *att; att = (struct soap_dom_attribute*)soap_malloc(soap, sizeof(struct soap_dom_attribute)); #ifdef __cplusplus SOAP_PLACEMENT_NEW(att, soap_dom_attribute); #endif if (att) soap_default_xsd__anyAttribute(soap, att); return att; } /******************************************************************************\ * * soap_dom_element construction * \******************************************************************************/ /** @brief Returns pointer to new xsd__anyType DOM element node. @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name string or NULL (unnamed node) @return pointer to xsd__anyType DOM element node */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_new(struct soap *soap, const char *ns, const char *tag) { return soap_elt_set(new_element(soap), ns, tag); } /******************************************************************************/ /** @brief Returns pointer to new xsd__anyType DOM element node. @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name wide string or NULL (unnamed node) @return pointer to xsd__anyType DOM element node */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_new_w(struct soap *soap, const char *ns, const wchar_t *tag) { return soap_elt_set_w(new_element(soap), ns, tag); } /******************************************************************************/ /** @brief Set xsd__anyType DOM element namespace URI and tag name @param elt pointer to xsd__anyType DOM element to set @param ns namespace URI string or NULL @param tag (un)qualified tag name string or NULL (unnamed node) @return elt */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_set(struct soap_dom_element *elt, const char *ns, const char *tag) { if (elt) { if (tag && !*tag) tag = NULL; elt->name = soap_strdup(elt->soap, tag); if (!ns) elt->nstr = soap_ns_to_set(elt->soap, tag); else elt->nstr = soap_strdup(elt->soap, ns); } return elt; } /******************************************************************************/ /** @brief Set xsd__anyType DOM element namespace URI and tag name @param elt pointer to xsd__anyType DOM element to set @param ns namespace URI string or NULL @param tag (un)qualified tag name wide string or NULL (unnamed node) @return elt */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_set_w(struct soap_dom_element *elt, const char *ns, const wchar_t *tag) { if (elt) { if (tag && !*tag) tag = NULL; elt->name = soap_wchar2s(elt->soap, tag); if (!ns) elt->nstr = soap_ns_to_set(elt->soap, elt->name); else elt->nstr = soap_strdup(elt->soap, ns); } return elt; } /******************************************************************************/ /** @brief Populate xsd__anyType DOM element node with an attribute node @param elt pointer to xsd__anyType DOM element to populate @param ns namespace URI string or NULL of attribute @param tag (un)qualified tag name string of attribute @return pointer to xsd__anyAttribute attribute node (new attribute node if none matches) */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att(struct soap_dom_element *elt, const char *ns, const char *tag) { if (!elt) return NULL; if (elt->atts) return soap_att_add(elt->atts, ns, tag); return elt->atts = soap_att_new(elt->soap, ns, tag); } /******************************************************************************/ /** @brief Populate xsd__anyType DOM element node with an attribute node @param elt pointer to xsd__anyType DOM element to populate @param ns namespace URI string or NULL of attribute @param tag (un)qualified tag name wide string of attribute @return pointer to xsd__anyAttribute attribute node (new attribute node if none matches) */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_w(struct soap_dom_element *elt, const char *ns, const wchar_t *tag) { if (!elt) return NULL; if (elt->atts) return soap_att_add_w(elt->atts, ns, tag); return elt->atts = soap_att_new_w(elt->soap, ns, tag); } /******************************************************************************/ /** @brief Populate xsd__anyType DOM element node with a child element node @param elt pointer to xsd__anyType DOM element to populate @param ns namespace URI string or NULL of child element @param tag (un)qualified tag name string of child element or NULL (unnamed node) @return pointer to child element node (new child element node if none matches) */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt(struct soap_dom_element *elt, const char *ns, const char *tag) { struct soap_dom_element *node = NULL; if (elt) { struct soap_dom_element *last = NULL; const char *ns1 = ns; if (!ns1) ns1 = soap_ns_to_set(elt->soap, tag); for (node = elt->elts; node; node = node->next) { if (tag && soap_tag_match(node->name, tag) && (ns1 == node->nstr || (ns1 && node->nstr && !strcmp(node->nstr, ns1)))) return node; if (!node->next) last = node; } node = soap_elt_new(elt->soap, ns, tag); if (node) node->prnt = elt; if (last) last->next = node; else elt->elts = node; } return node; } /******************************************************************************/ /** @brief Populate xsd__anyType DOM element node with a child element node @param elt pointer to xsd__anyType DOM element to populate @param ns namespace URI string or NULL of child element @param tag (un)qualified tag name wide string of child element or NULL (unnamed node) @return pointer to xsd__anyType child element node (new child element node if none matches) */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_w(struct soap_dom_element *elt, const char *ns, const wchar_t *tag) { struct soap_dom_element *node = NULL; if (elt) { const char *name = soap_wchar2s(elt->soap, tag); struct soap_dom_element *last = NULL; const char *ns1 = ns; if (!ns1) ns1 = soap_ns_to_set(elt->soap, name); for (node = elt->elts; node; node = node->next) { if (name && soap_tag_match(node->name, name) && (ns1 == node->nstr || (ns1 && node->nstr && !strcmp(node->nstr, ns1)))) return node; if (!node->next) last = node; } node = soap_elt_new(elt->soap, ns, name); if (node) node->prnt = elt; if (last) last->next = node; else elt->elts = node; } return node; } /******************************************************************************/ /** @brief Populate xsd__anyType DOM element node with an N-th child element node @param elt pointer to xsd__anyType DOM element to populate @param ns namespace URI string or NULL of child element @param tag (un)qualified tag name string of child element or NULL (unnamed node) @param n child element position, counting from one (1) XPath style @return pointer to xsd__anyType child element node (new child element node if none matches) */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_nth_elt(struct soap_dom_element *elt, const char *ns, const char *tag, size_t n) { return soap_nth(soap_elt(elt, ns, tag), n); } /******************************************************************************/ /** @brief Populate xsd__anyType DOM element node with an N-th child element node @param elt pointer to xsd__anyType DOM element to populate @param ns namespace URI string or NULL of child element @param tag (un)qualified tag name wide string of child element or NULL (unnamed node) @param n child element position, counting from one (1) XPath style @return pointer to xsd__anyType child element node (new child element node if none matches) */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_nth_elt_w(struct soap_dom_element *elt, const char *ns, const wchar_t *tag, size_t n) { return soap_nth(soap_elt_w(elt, ns, tag), n); } /******************************************************************************/ /** @brief Add a N-th child element with the same namespace and tag name as a xsd__anyType DOM child element node at position one (1) in a sibling list @param elt pointer to xsd__anyType DOM child element at position one (1) @param n additional child element position requested, counting from one (1) XPath style @return pointer to xsd__anyType child element node (new child element node if none exists at position n) */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_nth(struct soap_dom_element *elt, size_t n) { struct soap_dom_element *node; struct soap_dom_element *prev = elt; if (!elt || n <= 1) return elt; for (node = elt->next; node; node = node->next) { if ((elt->name == node->name || (elt->name && soap_tag_match(node->name, elt->name))) && (elt->nstr == node->nstr || (elt->nstr && node->nstr && !strcmp(node->nstr, elt->nstr)))) { if (--n <= 1) return node; } prev = node; } while (--n >= 1) { node = new_element(elt->soap); node->next = prev->next; node->prnt = elt->prnt; node->nstr = elt->nstr; node->name = elt->name; prev->next = node; prev = node; } return prev; } /******************************************************************************/ /** @brief Add an attribute node to an xsd__anyType DOM element node @param elt pointer to xsd__anyType DOM element to populate @param node pointer to xsd__anyAttribute attribute node to copy and add to DOM element elt @return elt */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_add_att(struct soap_dom_element *elt, const struct soap_dom_attribute *node) { if (elt && node) { struct soap_dom_attribute *last; struct soap_dom_attribute **next = &elt->atts; for (last = elt->atts; last; last = last->next) if (!last->next) next = &last->next; *next = new_attribute(elt->soap); if (*next) soap_att_copy(*next, node); } return elt; } /******************************************************************************/ /** @brief Add a child element node to an xsd__anyType DOM element node @param elt pointer to xsd__anyType DOM element to populate @param node pointer to element node to copy and add as a child to DOM element elt @return elt */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_add_elt(struct soap_dom_element *elt, const struct soap_dom_element *node) { if (elt && node) { struct soap_dom_element *last; struct soap_dom_element **next = &elt->elts; for (last = elt->elts; last; last = last->next) if (!last->next) next = &last->next; *next = new_element(elt->soap); if (*next) { soap_elt_copy(*next, node); (*next)->prnt = elt; } } return elt; } /******************************************************************************/ /** @brief Copy list of attribute nodes to an xsd__anyType DOM element node @param elt pointer to xsd__anyType DOM element to populate @param atts pointer to list of xsd__anyAttribute attribute nodes to copy and add to DOM element elt @return elt */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_add_atts(struct soap_dom_element *elt, const struct soap_dom_attribute *atts) { if (elt && atts) { struct soap_dom_attribute *last; struct soap_dom_attribute **next = &elt->atts; for (last = elt->atts; last; last = last->next) if (!last->next) next = &last->next; for (; atts; atts = atts->next) { *next = new_attribute(elt->soap); if (*next) { soap_att_copy(*next, atts); next = &(*next)->next; } } } return elt; } /******************************************************************************/ /** @brief Copy list of element nodes to an xsd__anyType DOM element node as children @param elt pointer to xsd__anyType DOM element to populate @param elts pointer to list of xsd__anyType DOM element nodes to copy and add as children to DOM element elt @return elt */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_add_elts(struct soap_dom_element *elt, const struct soap_dom_element *elts) { if (elt && elts) { struct soap_dom_element *last; struct soap_dom_element **next = &elt->elts; for (last = elt->elts; last; last = last->next) if (!last->next) next = &last->next; for (; elts; elts = elts->next) { *next = new_element(elt->soap); if (*next) { soap_elt_copy(*next, elts); (*next)->prnt = elt; next = &(*next)->next; } } } return elt; } /******************************************************************************\ * * soap_dom_element assignment * \******************************************************************************/ /** @brief Set text of an xsd__anyType DOM element node to Boolean "false" or "true" @param elt pointer to xsd__anyType DOM element node to set @param b Boolean value (zero = false, nonzero = true) @return elt */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_bool(struct soap_dom_element *elt, LONG64 b) { if (elt) elt->text = b ? "true" : "false"; return elt; } /******************************************************************************/ /** @brief Set text of an xsd__anyType DOM element node to a 64 bit integer value @param elt pointer to xsd__anyType DOM element node to set @param n 64 bit integer value @return elt */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_int(struct soap_dom_element *elt, LONG64 n) { return soap_elt_text(elt, soap_LONG642s(elt->soap, n)); } /******************************************************************************/ /** @brief Set text of an xsd__anyType DOM element node to a double float value @param elt pointer to xsd__anyType DOM element node to set @param x double float value (NaN and +/-INF are also supported) @return elt */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_double(struct soap_dom_element *elt, double x) { return soap_elt_text(elt, soap_double2s(elt->soap, x)); } /******************************************************************************/ /** @brief Set text of an xsd__anyType DOM element node @param elt pointer to xsd__anyType DOM element node to set @param text string or NULL @return elt */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_text(struct soap_dom_element *elt, const char *text) { if (elt) elt->text = soap_strdup(elt->soap, text); return elt; } /******************************************************************************/ /** @brief Set text of an xsd__anyType DOM element node @param elt pointer to xsd__anyType DOM element node to set @param text wide string or NULL @return elt */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_text_w(struct soap_dom_element *elt, const wchar_t *text) { if (elt) elt->text = soap_wchar2s(elt->soap, text); return elt; } /******************************************************************************/ /** @brief Set an xsd__anyType DOM element node to point to a serializable object @param elt pointer to xsd__anyType DOM element node to set @param node pointer to serializable object @param type SOAP_TYPE_T type of the serializable object of type T @return elt */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_node(struct soap_dom_element *elt, const void *node, int type) { if (elt) { elt->node = node; elt->type = type; } return elt; } /******************************************************************************/ /** @brief Copy an xsd__anyType DOM element node to another (not a deep copy) @param elt pointer to xsd__anyType DOM element node to copy to (destination) @param node pointer to xsd__anyType DOM element node to copy from (source) @return elt */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_copy(struct soap_dom_element *elt, const struct soap_dom_element *node) { elt->nstr = node->nstr; elt->name = node->name; elt->lead = node->lead; elt->text = node->text; elt->code = node->code; elt->tail = node->tail; elt->node = node->node; elt->type = node->type; soap_add_atts(elt, node->atts); return soap_add_elts(elt, node->elts); } /******************************************************************************\ * * soap_dom_element properties * \******************************************************************************/ /** @brief Match the namespace URI and tag name of an xsd__anyType DOM element node against a pattern @param elt pointer to xsd__anyType DOM element node @param ns namespace URI string pattern ("*" matches any, NULL and "" match the null (empty) namespace) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any, "" matches unnamed node) @return nonzero if match */ SOAP_FMAC1 int SOAP_FMAC2 soap_elt_match(const struct soap_dom_element *elt, const char *ns, const char *patt) { if (!elt || !elt->name) return 0; if (!ns && patt) ns = soap_ns_to_find(elt->soap, patt); if (patt && !soap_patt_match(elt->name, patt)) return 0; if (ns && (elt->nstr || *ns) && (!elt->nstr || !soap_name_match(elt->nstr, ns))) return 0; return 1; } /******************************************************************************/ /** @brief Match the namespace URI and tag name of an xsd__anyType DOM element node against a pattern @param elt pointer to xsd__anyType DOM element node @param ns namespace URI string pattern ("*" matches any, NULL and "" match the null (empty) namespace) @param patt (un)qualified tag name wide string pattern (NULL, "*", and "*:*" match any, "" matches unnamed node) @return nonzero if match */ SOAP_FMAC1 int SOAP_FMAC2 soap_elt_match_w(const struct soap_dom_element *elt, const char *ns, const wchar_t *patt) { const char *s; int r = 1; if (!elt || !elt->name) return 0; s = soap_wchar2s(NULL, patt); if (!ns && s) ns = soap_ns_to_find(elt->soap, s); if (s && !soap_patt_match(elt->name, s)) r = 0; else if (ns && (elt->nstr || *ns) && (!elt->nstr || !soap_name_match(elt->nstr, ns))) r = 0; if (s) free((void*)s); return r; } /******************************************************************************/ /** @brief Get the namespace URI of an xsd__anyType DOM element node @param elt pointer to xsd__anyType DOM element node @return namespace URI string or NULL */ SOAP_FMAC1 const char* SOAP_FMAC2 soap_elt_get_ns(const struct soap_dom_element *elt) { if (elt) return elt->nstr; return NULL; } /******************************************************************************/ /** @brief Get the tag name of an xsd__anyType DOM element node, if any @param elt pointer to xsd__anyType DOM element node @return tag name string or NULL */ SOAP_FMAC1 const char* SOAP_FMAC2 soap_elt_get_tag(const struct soap_dom_element *elt) { if (elt) return elt->name; return NULL; } /******************************************************************************/ /** @brief Return nonzero if xsd__anyType DOM element node text is Boolean "true" or "1" @param elt pointer to xsd__anyType DOM element node @return zero (not "true" or "1") or nonzero ("true" or "1") */ SOAP_FMAC1 int SOAP_FMAC2 soap_elt_is_true(const struct soap_dom_element *elt) { return elt->text && (!strcmp(elt->text, "true") || !strcmp(elt->text, "1")); } /******************************************************************************/ /** @brief Return nonzero if xsd__anyType DOM element node text is Boolean "false" or "0" @param elt pointer to xsd__anyType DOM element node @return zero (not "false" or "0") or nonzero ("false" or "0") */ SOAP_FMAC1 int SOAP_FMAC2 soap_elt_is_false(const struct soap_dom_element *elt) { return elt->text && (!strcmp(elt->text, "false") || !strcmp(elt->text, "0")); } /******************************************************************************/ /** @brief Return integer value of numeric text of xsd__anyType DOM element node @param elt pointer to xsd__anyType DOM element node @return integer value or 0 if text is not numeric */ SOAP_FMAC1 int SOAP_FMAC2 soap_elt_get_int(const struct soap_dom_element *elt) { if (elt) { int n; if (elt->text && !soap_s2int(elt->soap, elt->text, &n)) return n; elt->soap->error = SOAP_OK; } return 0; } /******************************************************************************/ /** @brief Return long integer value of numeric text of xsd__anyType DOM element node @param elt pointer to xsd__anyType DOM element node @return long integer value or 0 if text is not numeric */ SOAP_FMAC1 long SOAP_FMAC2 soap_elt_get_long(const struct soap_dom_element *elt) { if (elt) { long n; if (elt->text && !soap_s2long(elt->soap, elt->text, &n)) return n; elt->soap->error = SOAP_OK; } return 0; } /******************************************************************************/ /** @brief Return 64 bit integer value of numeric text of xsd__anyType DOM element node @param elt pointer to xsd__anyType DOM element node @return 64 bit integer value or 0 if text is not numeric */ SOAP_FMAC1 LONG64 SOAP_FMAC2 soap_elt_get_LONG64(const struct soap_dom_element *elt) { if (elt) { LONG64 n; if (elt->text && !soap_s2LONG64(elt->soap, elt->text, &n)) return n; elt->soap->error = SOAP_OK; } return 0; } /******************************************************************************/ /** @brief Return double float value of decimal text of xsd__anyType DOM element node @param elt pointer to xsd__anyType DOM element node @return double float value or NaN if text is not numeric */ SOAP_FMAC1 double SOAP_FMAC2 soap_elt_get_double(const struct soap_dom_element *elt) { if (elt) { double x; if (elt->text && !soap_s2double(elt->soap, elt->text, &x)) return x; elt->soap->error = SOAP_OK; } return DBL_NAN; } /******************************************************************************/ /** @brief Return text of xsd__anyType DOM element node @param elt pointer to xsd__anyType DOM element node @return string or NULL */ SOAP_FMAC1 const char* SOAP_FMAC2 soap_elt_get_text(const struct soap_dom_element *elt) { if (elt) return elt->text; return NULL; } /******************************************************************************/ /** @brief Get pointer to deserialized object stored in xsd__anyType DOM element node @param elt pointer to xsd__anyType DOM element node @param type SOAP_TYPE_T requested type to match @return pointer to deserialized object or NULL if type mismatch or when no deserialized object is present */ SOAP_FMAC1 const void * SOAP_FMAC2 soap_elt_get_node(const struct soap_dom_element *elt, int type) { if (!elt || elt->type != type) return NULL; return elt->node; } /******************************************************************************/ /** @brief Get pointer to deserialized object stored in xsd__anyType DOM element node @param elt pointer to xsd__anyType DOM element node @param node pointer to pointer to void, to be set to point to deserialized object @return SOAP_TYPE_T type of deserialized object, or zero (0) if none */ SOAP_FMAC1 int SOAP_FMAC2 soap_elt_get_type(const struct soap_dom_element *elt, const void **node) { if (!elt) return 0; *node = &elt->node; return elt->type; } /******************************************************************************/ /** @brief Return pointer to parent of an xsd__anyType DOM element node @param elt pointer to xsd__anyType DOM element node @return pointer to xsd__anyType DOM element or NULL */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_parent(const struct soap_dom_element *elt) { if (!elt) return NULL; return elt->prnt; } /******************************************************************************/ /** @brief Return depth from the root node of an xsd__anyType DOM element node @param elt pointer to xsd__anyType DOM element node @return depth from root node, zero if node is a root node and has no parent */ SOAP_FMAC1 size_t SOAP_FMAC2 soap_elt_depth(const struct soap_dom_element *elt) { size_t n = 0; while (elt) { elt = elt->prnt; n++; } return n; } /******************************************************************************/ /** @brief Return child index of an xsd__anyType DOM child element node in sibling list @param elt pointer to xsd__anyType DOM element node @return nonzero index of child among siblings, or 0 if node is a root node and has no parent */ SOAP_FMAC1 size_t SOAP_FMAC2 soap_elt_index(const struct soap_dom_element *elt) { size_t n = 0; if (elt && elt->prnt) { const struct soap_dom_element *node; n++; for (node = elt->prnt->elts; node && node != elt; n++, node = node->next) continue; } return n; } /******************************************************************************/ /** @brief Return number of siblings of an xsd__anyType DOM child node that have the same namespace URI and tag name @param elt pointer to xsd__anyType DOM element node @return number of siblings plus one (for self) that have the same namespace URI and tag name */ SOAP_FMAC1 size_t SOAP_FMAC2 soap_elt_len(const struct soap_dom_element *elt) { size_t n = 0; if (elt && elt->prnt) { const struct soap_dom_element *node; for (node = soap_elt_get(elt->prnt, elt->nstr, elt->name); node; n++, node = soap_elt_get_next(node)) continue; } return n; } /******************************************************************************/ /** @brief Return index of an xsd__anyType DOM child node among siblings that have the same namespace URI and tag name @param elt pointer to xsd__anyType DOM element node @return nonzero N-th index (1 <= nth <= len), or 0 if element is root or is singular (has no siblings with the same namespace URI and tag name) */ SOAP_FMAC1 size_t SOAP_FMAC2 soap_elt_nth(const struct soap_dom_element *elt) { size_t n = 0; if (elt && elt->prnt) { const struct soap_dom_element *node; for (node = soap_elt_get(elt->prnt, elt->nstr, elt->name); node && node != elt; n++, node = soap_elt_get_next(node)) continue; if (node && (n > 0 || soap_elt_get_next(node))) n++; } return n; } /******************************************************************************\ * * soap_dom_attribute construction * \******************************************************************************/ /** @brief Returns pointer to new xsd__anyAttribute DOM attribute node. @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name string @return pointer to xsd__anyAttribute DOM attribute node */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_new(struct soap *soap, const char *ns, const char *tag) { return soap_att_set(new_attribute(soap), ns, tag); } /******************************************************************************/ /** @brief Returns pointer to new xsd__anyAttribute DOM attribute node. @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name wide string @return pointer to xsd__anyAttribute DOM attribute node */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_new_w(struct soap *soap, const char *ns, const wchar_t *tag) { return soap_att_set_w(new_attribute(soap), ns, tag); } /******************************************************************************/ /** @brief Set xsd__anyAttribute DOM attribute namespace URI and tag name @param att pointer to xsd__anyAttribute DOM attribute to set @param ns namespace URI string or NULL @param tag (un)qualified tag name string @return att */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_set(struct soap_dom_attribute *att, const char *ns, const char *tag) { if (att) { att->name = soap_strdup(att->soap, tag); if (!ns) att->nstr = soap_ns_to_set(att->soap, tag); else att->nstr = soap_strdup(att->soap, ns); } return att; } /******************************************************************************/ /** @brief Set xsd__anyAttribute DOM attribute namespace URI and tag name @param att pointer to xsd__anyAttribute DOM attribute to set @param ns namespace URI string or NULL @param tag (un)qualified tag name wide string @return att */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_set_w(struct soap_dom_attribute *att, const char *ns, const wchar_t *tag) { if (att) { att->name = soap_wchar2s(att->soap, tag); if (!ns) att->nstr = soap_ns_to_set(att->soap, att->name); else att->nstr = soap_strdup(att->soap, ns); } return att; } /******************************************************************************/ /** @brief Add an attribute node to an xsd__anyAttribute DOM attribute node to create or extend an attribute list @param att pointer to xsd__anyAttribute DOM attribute @param ns namespace URI string or NULL of attribute @param tag (un)qualified tag name string of attribute @return pointer to xsd__anyAttribute attribute node (new attribute node if none matches in the list) */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_add(struct soap_dom_attribute *att, const char *ns, const char *tag) { if (att && tag) { const char *ns1 = ns; if (!att->name) return soap_att_set(att, ns, tag); if (!ns1) ns1 = soap_ns_to_set(att->soap, tag); while (att) { if (att->name && soap_tag_match(att->name, tag) && (ns1 == att->nstr || (ns1 && att->nstr && !strcmp(ns1, att->nstr)))) return att; if (!att->next) return att->next = soap_att_new(att->soap, ns, tag); att = att->next; } } return att; } /******************************************************************************/ /** @brief Add an attribute node to an xsd__anyAttribute DOM attribute node to create or extend an attribute list @param att pointer to xsd__anyAttribute DOM attribute @param ns namespace URI string or NULL of attribute @param tag (un)qualified tag name wide string of attribute @return pointer to xsd__anyAttribute attribute node (new attribute node if none matches in the list) */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_add_w(struct soap_dom_attribute *att, const char *ns, const wchar_t *tag) { if (att && tag) { const char *name = soap_wchar2s(att->soap, tag); const char *ns1 = ns; if (!att->name) return soap_att_set(att, ns, name); if (!ns1) ns1 = soap_ns_to_set(att->soap, name); while (att) { if (att->name && soap_tag_match(att->name, name) && (ns1 == att->nstr || (ns1 && att->nstr && !strcmp(ns1, att->nstr)))) return att; if (!att->next) { att->next = soap_att_new(att->soap, ns, NULL); if (att->next) att->next->name = name; return att->next; } att = att->next; } } return att; } /******************************************************************************\ * * soap_dom_attribute assignment * \******************************************************************************/ /** @brief Set text of an xsd__anyAttribute DOM attribute node to Boolean "false" or "true" @param att pointer to xsd__anyAttribute DOM attribute node to set @param b Boolean value (zero = false, nonzero = true) @return att */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_bool(struct soap_dom_attribute *att, LONG64 b) { if (att) att->text = b ? "true" : "false"; return att; } /******************************************************************************/ /** @brief Set text of an xsd__anyAttribute DOM attribute node to a 64 bit integer value @param att pointer to xsd__anyAttribute DOM attribute node to set @param n 64 bit integer value @return att */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_int(struct soap_dom_attribute *att, LONG64 n) { return soap_att_text(att, soap_LONG642s(att->soap, n)); } /******************************************************************************/ /** @brief Set text of an xsd__anyAttribute DOM attribute node to a double float value @param att pointer to xsd__anyAttribute DOM attribute node to set @param x double float value (NaN and +/-INF are also supported) @return att */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_double(struct soap_dom_attribute *att, double x) { return soap_att_text(att, soap_double2s(att->soap, x)); } /******************************************************************************/ /** @brief Set text of an xsd__anyAttribute DOM attribute node @param att pointer to xsd__anyAttribute DOM attribute node to set @param text string or NULL @return att */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_text(struct soap_dom_attribute *att, const char *text) { if (att) att->text = soap_strdup(att->soap, text); return att; } /******************************************************************************/ /** @brief Set text of an xsd__anyAttribute DOM attribute node @param att pointer to xsd__anyAttribute DOM attribute node to set @param text wide string or NULL @return att */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_text_w(struct soap_dom_attribute *att, const wchar_t *text) { if (att) att->text = soap_wchar2s(att->soap, text); return att; } /******************************************************************************/ /** @brief Copy an xsd__anyAttribute DOM attribute node to another (not a deep copy) @param att pointer to xsd__anyAttribute DOM attribute node to copy to (destination) @param node pointer to xsd__anyAttribute DOM attribute node to copy from (source) @return att */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_copy(struct soap_dom_attribute *att, const struct soap_dom_attribute *node) { if (att) { att->nstr = node->nstr; att->name = node->name; att->text = node->text; } return att; } /******************************************************************************\ * * soap_dom_attribute properties * \******************************************************************************/ /** @brief Match the namespace URI and tag name of an xsd__anyAttribute DOM attribute node against a pattern @param att pointer to xsd__anyAttribute DOM attribute node @param ns namespace URI string pattern ("*" matches any, NULL and "" match the null (empty) namespace) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any) @return nonzero if match */ SOAP_FMAC1 int SOAP_FMAC2 soap_att_match(const struct soap_dom_attribute *att, const char *ns, const char *patt) { if (!att || !att->name) return 0; if (!ns && patt) ns = soap_ns_to_find(att->soap, patt); if (patt && !soap_patt_match(att->name, patt)) return 0; if (ns && (att->nstr || *ns) && (!att->nstr || !soap_name_match(att->nstr, ns))) return 0; return 1; } /******************************************************************************/ /** @brief Match the namespace URI and tag name of an xsd__anyAttribute DOM attribute node against a pattern @param att pointer to xsd__anyAttribute DOM attribute node @param ns namespace URI string pattern ("*" matches any, NULL and "" match the null (empty) namespace) @param patt (un)qualified tag name wide string pattern (NULL, "*", and "*:*" match any) @return nonzero if match */ SOAP_FMAC1 int SOAP_FMAC2 soap_att_match_w(const struct soap_dom_attribute *att, const char *ns, const wchar_t *patt) { const char *s; int r = 1; if (!att || !att->name) return 0; s = soap_wchar2s(NULL, patt); if (!ns && s) ns = soap_ns_to_find(att->soap, s); if (s && !soap_patt_match(att->name, s)) r = 0; else if (ns && (att->nstr || *ns) && (!att->nstr || !soap_name_match(att->nstr, ns))) r = 0; if (s) free((void*)s); return r; } /******************************************************************************/ /** @brief Get the namespace URI of an xsd__anyAttribute DOM attribute node @param att pointer to xsd__anyAttribute DOM attribute node @return namespace URI string or NULL */ SOAP_FMAC1 const char* SOAP_FMAC2 soap_att_get_ns(const struct soap_dom_attribute *att) { if (att) return att->nstr; return NULL; } /******************************************************************************/ /** @brief Get the tag name of an xsd__anyAttribute DOM attribute node @param att pointer to xsd__anyAttribute DOM attribute node @return tag name string or NULL */ SOAP_FMAC1 const char* SOAP_FMAC2 soap_att_get_tag(const struct soap_dom_attribute *att) { if (att) return att->name; return NULL; } /******************************************************************************/ /** @brief Return nonzero if xsd__anyAttribute DOM attribute node text is Boolean "true" or "1" @param att pointer to xsd__anyAttribute DOM attribute node @return zero (not "true" or "1") or nonzero ("true" or "1") */ SOAP_FMAC1 int SOAP_FMAC2 soap_att_is_true(const struct soap_dom_attribute *att) { return att->text && (!strcmp(att->text, "true") || !strcmp(att->text, "1")); } /******************************************************************************/ /** @brief Return nonzero if xsd__anyAttribute DOM attribute node text is Boolean "false" or "0" @param att pointer to xsd__anyAttribute DOM attribute node @return zero (not "false" or "0") or nonzero ("false" or "0") */ SOAP_FMAC1 int SOAP_FMAC2 soap_att_is_false(const struct soap_dom_attribute *att) { return att->text && (!strcmp(att->text, "false") || !strcmp(att->text, "0")); } /******************************************************************************/ /** @brief Return integer value of numeric text of xsd__anyAttribute DOM attribute node @param att pointer to xsd__anyAttribute DOM attribute node @return integer value or 0 if text is not numeric */ SOAP_FMAC1 int SOAP_FMAC2 soap_att_get_int(const struct soap_dom_attribute *att) { if (att) { int n; if (att->text && !soap_s2int(att->soap, att->text, &n)) return n; att->soap->error = SOAP_OK; } return 0; } /******************************************************************************/ /** @brief Return long integer value of numeric text of xsd__anyAttribute DOM attribute node @param att pointer to xsd__anyAttribute DOM attribute node @return long integer value or 0 if text is not numeric */ SOAP_FMAC1 long SOAP_FMAC2 soap_att_get_long(const struct soap_dom_attribute *att) { if (att) { long n; if (att->text && !soap_s2long(att->soap, att->text, &n)) return n; att->soap->error = SOAP_OK; } return 0; } /******************************************************************************/ /** @brief Return 64 bit integer value of numeric text of xsd__anyAttribute DOM attribute node @param att pointer to xsd__anyAttribute DOM attribute node @return 64 bit integer value or 0 if text is not numeric */ SOAP_FMAC1 LONG64 SOAP_FMAC2 soap_att_get_LONG64(const struct soap_dom_attribute *att) { if (att) { LONG64 n; if (att->text && !soap_s2LONG64(att->soap, att->text, &n)) return n; att->soap->error = SOAP_OK; } return 0; } /******************************************************************************/ /** @brief Return double float value of decimal text of xsd__anyAttribute DOM attribute node @param att pointer to xsd__anyAttribute DOM attribute node @return double float value or NaN if text is not numeric */ SOAP_FMAC1 double SOAP_FMAC2 soap_att_get_double(const struct soap_dom_attribute *att) { if (att) { double x; if (att->text && !soap_s2double(att->soap, att->text, &x)) return x; att->soap->error = SOAP_OK; } return DBL_NAN; } /******************************************************************************/ /** @brief Return text of xsd__anyAttribute DOM attribute node @param att pointer to xsd__anyAttribute DOM attribute node @return string or NULL */ SOAP_FMAC1 const char* SOAP_FMAC2 soap_att_get_text(const struct soap_dom_attribute *att) { if (att) return att->text; return NULL; } /******************************************************************************\ * * DOM local traversal * \******************************************************************************/ /** @brief Returns pointer to first xsd__anyAttribute DOM attribute node of xsd__anyType DOM element node, if any. @param elt pointer to xsd__anyType DOM element node @return pointer to xsd__anyAttribute DOM attribute node or NULL if none */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_first(struct soap_dom_element *elt) { return elt->atts; } /******************************************************************************/ /** @brief Returns pointer to next xsd__anyAttribute DOM attribute node, if any. @param att pointer to current xsd__anyAttribute DOM attribute node in attribute list @return pointer to xsd__anyAttribute DOM attribute node or NULL if none */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_next(const struct soap_dom_attribute *att) { return att->next; } /******************************************************************************/ /** @brief Returns pointer to first child element node of xsd__anyType DOM element node, if any. @param elt pointer to xsd__anyType DOM element node @return pointer to xsd__anyType DOM child element node or NULL if none */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_first(struct soap_dom_element *elt) { return elt->elts; } /******************************************************************************/ /** @brief Returns pointer to next xsd__anyType DOM child element node, if any. @param elt pointer to current xsd__anyType DOM child element node in sibling list @return pointer to xsd__anyType DOM element node or NULL if none */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_next(const struct soap_dom_element *elt) { return elt->next; } /******************************************************************************\ * * DOM local retrieval * \******************************************************************************/ /** @brief Get attribute node of an xsd__anyType DOM element node, if attribute exists @param elt pointer to xsd__anyType DOM element node @param ns namespace URI string (NULL matches the null (empty) namespace if tag is unqualified) of attribute @param tag (un)qualified tag name string of attribute @return pointer to xsd__anyAttribute DOM attribute node or NULL if not exists */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_get(const struct soap_dom_element *elt, const char *ns, const char *tag) { if (elt && tag) { struct soap_dom_attribute *att; if (!ns) ns = soap_ns_to_get(elt->soap, tag); for (att = elt->atts; att; att = att->next) if (att->name && soap_tag_match(att->name, tag) && ((!att->nstr && !*ns) || (att->nstr && !strcmp(att->nstr, ns)))) return att; } return NULL; } /******************************************************************************/ /** @brief Get attribute node of an xsd__anyType DOM element node, if attribute exists @param elt pointer to xsd__anyType DOM element node @param ns namespace URI string (NULL matches the null (empty) namespace if tag is unqualified) of attribute @param tag (un)qualified tag name wide string of attribute @return pointer to xsd__anyAttribute DOM attribute node or NULL if not exists */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_get_w(const struct soap_dom_element *elt, const char *ns, const wchar_t *tag) { if (elt && tag) { const char *name = soap_wchar2s(NULL, tag); struct soap_dom_attribute *att = NULL; if (!ns) ns = soap_ns_to_get(elt->soap, name); for (att = elt->atts; att; att = att->next) if (att->name && soap_tag_match(att->name, name) && ((!att->nstr && !*ns) || (att->nstr && !strcmp(att->nstr, ns)))) break; if (name) free((void*)name); return att; } return NULL; } /******************************************************************************/ /** @brief Get child element node of an xsd__anyType DOM element node, if child element exists @param elt pointer to xsd__anyType DOM element node @param ns namespace URI string (NULL matches the null (empty) namespace if tag is unqualified) of child element @param tag (un)qualified tag name string (NULL matches unnamed node) of child element @return pointer to xsd__anyType DOM child element node or NULL if not exists */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_get(const struct soap_dom_element *elt, const char *ns, const char *tag) { if (elt) { struct soap_dom_element *node; if (!ns) ns = soap_ns_to_get(elt->soap, tag); for (node = elt->elts; node; node = node->next) if ((tag == node->name || (tag && soap_tag_match(node->name, tag))) && ((!node->nstr && !*ns) || (node->nstr && !strcmp(node->nstr, ns)))) return node; } return NULL; } /******************************************************************************/ /** @brief Get child element node of an xsd__anyType DOM element node, if child element exists @param elt pointer to xsd__anyType DOM element node @param ns namespace URI string (NULL matches the null (empty) namespace if tag is unqualified) of child element @param tag (un)qualified tag name wide string (NULL matches unnamed node) of child element @return pointer to xsd__anyType DOM child element node or NULL if not exists */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_get_w(const struct soap_dom_element *elt, const char *ns, const wchar_t *tag) { if (elt) { const char *name = soap_wchar2s(NULL, tag); struct soap_dom_element *node; if (!ns) ns = soap_ns_to_get(elt->soap, name); for (node = elt->elts; node; node = node->next) if (((!name && !node->name) || (name && soap_tag_match(node->name, name))) && ((!node->nstr && !*ns) || (node->nstr && !strcmp(node->nstr, ns)))) break; if (name) free((void*)name); return node; } return NULL; } /******************************************************************************/ /** @brief Get next child element node that has the same namespace URI and tag name as the current child element node @param elt pointer to current xsd__anyType DOM child element node @return pointer to xsd__anyType DOM child element node or NULL if not exists */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_get_next(const struct soap_dom_element *elt) { if (elt) { const char *ns = elt->nstr; const char *tag = elt->name; struct soap_dom_element *node; for (node = elt->next; node; node = node->next) if ((tag == node->name || (tag && soap_tag_match(node->name, tag))) && (ns == node->nstr || (ns && node->nstr && !strcmp(node->nstr, ns)))) return node; } return NULL; } /******************************************************************************/ /** @brief Get N-th child element node that has the same namespace URI and tag name as the current child element node at position one (1) in the sibling list @param elt pointer to current xsd__anyType DOM child element node at position one (1) in the sibling list @param n N-th element minus one located from the current element node at position one (1), 1 returns the current element (elt) @return pointer to xsd__anyType DOM child element node or NULL if not exists */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_get_nth(struct soap_dom_element *elt, size_t n) { while (n-- > 1) elt = soap_elt_get_next(elt); return elt; } /******************************************************************************\ * * DOM local search * \******************************************************************************/ /** @brief Find matching attribute node of an xsd__anyType DOM element node @param elt pointer to xsd__anyType DOM element node @param ns namespace URI string pattern ("*" matches any, "" matches the null (empty) namespace, NULL matches the null (empty) namespace if tag is unqualified or the namespace from namespace table if tag is qualified) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any) @return pointer to xsd__anyAttribute DOM attribute node or NULL if not exists */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_find(struct soap_dom_element *elt, const char *ns, const char *patt) { struct soap_dom_attribute *att = NULL; if (elt) { att = elt->atts; if (att) { if (!ns && patt) ns = soap_ns_to_find(elt->soap, patt); if (patt && !soap_patt_match(att->name, patt)) return soap_att_find_next(att, ns, patt); if (ns && (att->nstr || *ns) && (!att->nstr || !soap_name_match(att->nstr, ns))) return soap_att_find_next(att, ns, patt); } } return att; } /******************************************************************************/ /** @brief Find next matching attribute node of an xsd__anyType DOM element node @param att pointer to current xsd__anyAttribute DOM attribute node @param ns namespace URI string pattern ("*" matches any, "" matches the null (empty) namespace, NULL matches the null (empty) namespace if tag is unqualified or the namespace from namespace table if tag is qualified) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any) @return pointer to xsd__anyAttribute DOM attribute node or NULL if not exists */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_find_next(const struct soap_dom_attribute *att, const char *ns, const char *patt) { if (att) { struct soap_dom_attribute *node; if (!ns && patt) ns = soap_ns_to_find(att->soap, patt); for (node = att->next; node; node = node->next) { if (patt && !soap_patt_match(node->name, patt)) continue; if (ns && (node->nstr || *ns) && (!node->nstr || !soap_name_match(node->nstr, ns))) continue; return node; } } return NULL; } /******************************************************************************/ /** @brief Find matching child element node of an xsd__anyType DOM element node @param elt pointer to xsd__anyType DOM element node @param ns namespace URI string pattern ("*" matches any, "" matches the null (empty) namespace, NULL matches the null (empty) namespace if tag is unqualified or the namespace from namespace table if tag is qualified) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any, "" matches unnamed node) @return pointer to xsd__anyType DOM child element node or NULL if not exists */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_find(struct soap_dom_element *elt, const char *ns, const char *patt) { return soap_elt_find_type(elt, ns, patt, 0); } /******************************************************************************/ /** @brief Find next matching child element node of an xsd__anyType DOM element node @param elt pointer to current xsd__anyType DOM child element node @param ns namespace URI string pattern ("*" matches any, "" matches the null (empty) namespace, NULL matches the null (empty) namespace if tag is unqualified or the namespace from namespace table if tag is qualified) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any, "" matches unnamed node) @return pointer to xsd__anyType DOM child element node or NULL if not exists */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_find_next(const struct soap_dom_element *elt, const char *ns, const char *patt) { return soap_elt_find_next_type(elt, ns, patt, 0); } /******************************************************************************/ /** @brief Find matching child element node of an xsd__anyType DOM element node that has a deserialized object @param elt pointer to xsd__anyType DOM element node @param ns namespace URI string pattern ("*" matches any, "" matches the null (empty) namespace, NULL matches the null (empty) namespace if tag is unqualified or the namespace from namespace table if tag is qualified) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any, "" matches unnamed node) @param type SOAP_TYPE_T type of deserialized object of type T to match or 0 @return pointer to xsd__anyType DOM child element node or NULL if not exists */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_find_type(struct soap_dom_element *elt, const char *ns, const char *patt, int type) { if (elt) { elt = elt->elts; if (elt) { if (!ns && patt) ns = soap_ns_to_find(elt->soap, patt); if (patt && !soap_patt_match(elt->name, patt)) return soap_elt_find_next_type(elt, ns, patt, type); if (ns && (elt->nstr || *ns) && (!elt->nstr || !soap_name_match(elt->nstr, ns))) return soap_elt_find_next_type(elt, ns, patt, type); if (type && type != elt->type) return soap_elt_find_next_type(elt, ns, patt, type); } } return elt; } /******************************************************************************/ /** @brief Find next matching child element node of an xsd__anyType DOM element node that has a deserialized object @param elt pointer to current xsd__anyType DOM child element node @param ns namespace URI string pattern ("*" matches any, "" matches the null (empty) namespace, NULL matches the null (empty) namespace if tag is unqualified or the namespace from namespace table if tag is qualified) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any, "" matches unnamed node) @param type SOAP_TYPE_T type of deserialized object of type T to match or 0 @return pointer to xsd__anyType DOM child element node or NULL if not exists */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_find_next_type(const struct soap_dom_element *elt, const char *ns, const char *patt, int type) { if (elt) { struct soap_dom_element *node; if (!ns && patt) ns = soap_ns_to_find(elt->soap, patt); for (node = elt->next; node; node = node->next) { if (patt && !soap_patt_match(node->name, patt)) continue; if (ns && (node->nstr || *ns) && (!node->nstr || !soap_name_match(node->nstr, ns))) continue; if (type && type != node->type) continue; return node; } } return NULL; } /******************************************************************************\ * * DOM size of local search results * \******************************************************************************/ /** @brief Return number of matching attribute nodes of an xsd__anyType DOM element node @param elt pointer to xsd__anyType DOM element node @param ns namespace URI string pattern ("*" matches any, "" matches the null (empty) namespace, NULL matches the null (empty) namespace if tag is unqualified or the namespace from namespace table if tag is qualified) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any) @return number of matches found */ SOAP_FMAC1 size_t SOAP_FMAC2 soap_att_size(struct soap_dom_element *elt, const char *ns, const char *patt) { size_t n = 0; if (elt) { struct soap_dom_attribute *att = soap_att_find(elt, ns, patt); if (att) { n++; while ((att = soap_att_find_next(att, ns, patt))) n++; } } return n; } /******************************************************************************/ /** @brief Return number of matching child element nodes of an xsd__anyType DOM element node @param elt pointer to xsd__anyType DOM element node @param ns namespace URI string pattern ("*" matches any, "" matches the null (empty) namespace, NULL matches the null (empty) namespace if tag is unqualified or the namespace from namespace table if tag is qualified) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any, "" matches unnamed node) @return number of matches found */ SOAP_FMAC1 size_t SOAP_FMAC2 soap_elt_size(struct soap_dom_element *elt, const char *ns, const char *patt) { return soap_elt_size_type(elt, ns, patt, 0); } /******************************************************************************/ /** @brief Return number of matching child element nodes of an xsd__anyType DOM element node that have deserialized objects @param elt pointer to xsd__anyType DOM element node @param ns namespace URI string pattern ("*" matches any, "" matches the null (empty) namespace, NULL matches the null (empty) namespace if tag is unqualified or the namespace from namespace table if tag is qualified) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any, "" matches unnamed node) @param type SOAP_TYPE_T type of deserialized object of type T to match or 0 @return number of matches found */ SOAP_FMAC1 size_t SOAP_FMAC2 soap_elt_size_type(struct soap_dom_element *elt, const char *ns, const char *patt, int type) { size_t n = 0; if (elt) { elt = soap_elt_find_type(elt, ns, patt, type); if (elt) { n++; while ((elt = soap_elt_find_next_type(elt, ns, patt, type))) n++; } } return n; } /******************************************************************************\ * * DOM deep traversal * \******************************************************************************/ /** @brief Return next xsd__anyAttribute DOM attribute node in attribute list @param att pointer to current xsd__anyAttribute DOM attribute node @return pointer to xsd__anyAttribute DOM node or NULL if none */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_dom_next_attribute(const struct soap_dom_attribute *att) { return att->next; } /******************************************************************************/ /** @brief Return next xsd__anyType DOM element node in depth-first traversal of node graph (XPath recursive descent) @param elt pointer to current xsd__anyType DOM element node @param end pointer to the ending xsd__anyType DOM element node (exclusive), usually the starting node of the graph traversal @return pointer to xsd__anyType DOM node or NULL if none or if next node would be the ending node */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_dom_next_element(const struct soap_dom_element *elt, const struct soap_dom_element *end) { struct soap_dom_element *node; if (elt->elts) return elt->elts; if (elt == end) return NULL; if (elt->next) return elt->next; for (node = elt->prnt; node && !node->next; node = node->prnt) if (node == end) return NULL; if (node) node = node->next; return node; } /******************************************************************************\ * * DOM deep search * \******************************************************************************/ /** @brief Find matching xsd__anyType DOM element node in depth-first traversal of node graph (XPath recursive descent) @param begin pointer to starting xsd__anyType DOM element node of node graph to search @param end pointer to the ending xsd__anyType DOM element node (exclusive), usually the starting node of the graph traversal @param ns namespace URI string pattern ("*" matches any, "" matches the null (empty) namespace, NULL matches the null (empty) namespace if tag is unqualified or the namespace from namespace table if tag is qualified) @param patt (un)qualified tag name string pattern (use '@' to match attributes, NULL, "*" and "*:*" match any, "" matches unnamed node) @param type SOAP_TYPE_T type of deserialized object of type T to match or 0 @return pointer to xsd__anyType DOM node or NULL if none or if next node would be the ending node */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_dom_find(struct soap_dom_element *begin, const struct soap_dom_element *end, const char *ns, const char *patt, int type) { if (begin) { if (patt && *patt == '@') { if (soap_att_find(begin, ns, patt + 1)) return begin; return soap_dom_find_next(begin, end, ns, patt, type); } if (!ns && patt) ns = soap_ns_to_find(begin->soap, patt); if (patt && !soap_patt_match(begin->name, patt)) return soap_dom_find_next(begin, end, ns, patt, type); if (ns && (begin->nstr || *ns) && (!begin->nstr || !soap_name_match(begin->nstr, ns))) return soap_dom_find_next(begin, end, ns, patt, type); if (type && type != begin->type) return soap_dom_find_next(begin, end, ns, patt, type); } return begin; } /******************************************************************************/ /** @brief Find next matching xsd__anyType DOM element node in depth-first traversal of node graph (XPath recursive descent) @param elt pointer to current xsd__anyType DOM element node of node graph to search @param end pointer to the ending xsd__anyType DOM element node, usually the starting node of the graph traversal @param ns namespace URI string pattern ("*" matches any, "" matches the null (empty) namespace, NULL matches the null (empty) namespace if tag is unqualified or the namespace from namespace table if tag is qualified) @param patt (un)qualified tag name string pattern (use '@' to match attributes, NULL, "*" and "*:*" match any, "" matches unnamed node) @param type SOAP_TYPE_T type of deserialized object of type T to match or 0 @return pointer to xsd__anyType DOM node or NULL if none or if next node would be the ending node */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_dom_find_next(const struct soap_dom_element *elt, const struct soap_dom_element *end, const char *ns, const char *patt, int type) { if (elt) { struct soap_dom_element *node; if (!ns && patt) ns = soap_ns_to_find(elt->soap, patt + (*patt == '@')); for (node = soap_dom_next_element(elt, end); node; node = soap_dom_next_element(node, end)) { if (patt && *patt == '@') { if (soap_att_find(node, ns, patt + 1)) return node; continue; } if (patt && !soap_patt_match(node->name, patt)) continue; if (ns && (node->nstr || *ns) && (!node->nstr || !soap_name_match(node->nstr, ns))) continue; if (type && type != node->type) continue; return node; } } return NULL; } /******************************************************************************\ * * C REST POST, GET, PUT, DELETE server invocation * \******************************************************************************/ /* @brief REST POST, GET, PUT, DELETE server invocation with XML @param soap context to manage IO @param endpoint server URL @param optional SOAP Action or NULL @param in request XML to be send to server, or NULL for GET or DELETE (both in and out are NULL) @param out response to be populated with response XML received from server, or NULL for PUT or DELETE (both in and out are NULL) */ SOAP_FMAC1 int SOAP_FMAC2 soap_dom_call(struct soap *soap, const char *endpoint, const char *action, const struct soap_dom_element *in, struct soap_dom_element *out) { if (out) soap_default_xsd__anyType(soap, out); if (in) soap_serialize_xsd__anyType(soap, in); soap->http_content = "text/xml; charset=utf-8"; if (soap_begin_count(soap) || ((soap->mode & SOAP_IO_LENGTH) && soap_out_xsd__anyType(soap, NULL, 0, in, NULL)) || soap_end_count(soap) || soap_connect_command(soap, in && out ? SOAP_POST_FILE : out ? SOAP_GET : in ? SOAP_PUT : SOAP_DEL, endpoint, action) || soap_out_xsd__anyType(soap, NULL, 0, in, NULL) || soap_end_send(soap)) return soap_closesock(soap); if (!out) { if (!soap_begin_recv(soap)) { #ifndef WITH_LEAN (void)soap_get_http_body(soap, NULL); #endif (void)soap_end_recv(soap); } else if (soap->error == SOAP_NO_DATA || soap->error == 200 || soap->error == 202) soap->error = SOAP_OK; return soap_closesock(soap); } if (soap_begin_recv(soap) || soap_in_xsd__anyType(soap, NULL, out, NULL) == NULL || soap_end_recv(soap)) return soap_closesock(soap); return soap_closesock(soap); } /******************************************************************************/ #ifdef __cplusplus /******************************************************************************\ * * C++ REST POST, GET, PUT, DELETE server invocation * \******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_dom_call(struct soap *soap, const char *endpoint, const char *action, const struct soap_dom_element& in, struct soap_dom_element& out) { return soap_dom_call(soap, endpoint, action, &in, &out); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_dom_call(struct soap *soap, const char *endpoint, const char *action, const struct soap_dom_element *in, struct soap_dom_element& out) { return soap_dom_call(soap, endpoint, action, in, &out); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_dom_call(struct soap *soap, const char *endpoint, const char *action, const struct soap_dom_element& in, struct soap_dom_element *out) { return soap_dom_call(soap, endpoint, action, &in, out); } /******************************************************************************\ * * C++ soap_dom_element and soap_dom_attribute classes * \******************************************************************************/ #if 0 // DOXYGEN PROCESSING ONLY /** @class soap_dom_attribute @brief The xsd__anyAttribute DOM attribute node structure (xsd__anyAttribute is a typedef of soap_dom_attribute) */ struct soap_dom_attribute { struct soap_dom_attribute *next; ///< next attribute node in list const char *nstr; ///< namespace string const char *name; ///< (un)qualified tag name const char *text; ///< text cdata in UTF-8 struct soap *soap; ///< context that manages this object /** iterator over attribute list */ typedef soap_dom_attribute_iterator iterator; /** @brief Construct new xsd__anyAttribute DOM attribute that is empty (must be set later) @param soap context that manages this object */ soap_dom_attribute(struct soap *soap = NULL); /** @brief Construct new xsd__anyAttribute DOM attribute by (shallow) copying another attribute @param att xsd__anyAttribute DOM attribute copied */ soap_dom_attribute(const soap_dom_attribute& att); /** @brief Construct new xsd__anyAttribute DOM attribute with (un)qualified tag name, same as xsd__anyAttribute(soap, NULL, tag, NULL) @param soap context that manages this object @param tag (un)qualified tag name string */ soap_dom_attribute(struct soap *soap, const char *tag); /** @brief Construct new xsd__anyAttribute DOM attribute with (un)qualified tag name, same as xsd__anyAttribute(soap, NULL, tag, NULL) @param soap context that manages this object @param tag (un)qualified tag name wide string */ soap_dom_attribute(struct soap *soap, const wchar_t *tag); /** @brief Construct new xsd__anyAttribute DOM attribute with namespace URI (xmlns), (un)qualified tag name, and text @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name string @param text string */ soap_dom_attribute(struct soap *soap, const char *ns, const char *tag, const char *text); /** @brief Construct new xsd__anyAttribute DOM attribute with namespace URI (xmlns), (un)qualified tag name, and text @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name string @param text wide string */ soap_dom_attribute(struct soap *soap, const char *ns, const char *tag, const wchar_t *text); /** @brief Construct new xsd__anyAttribute DOM attribute with namespace URI (xmlns), (un)qualified tag name, and text @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name wide string @param text string */ soap_dom_attribute(struct soap *soap, const char *ns, const wchar_t *tag, const char *text); /** @brief Construct new xsd__anyAttribute DOM attribute with namespace URI (xmlns), (un)qualified tag name, and text @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name wide string @param text wide string */ soap_dom_attribute(struct soap *soap, const char *ns, const wchar_t *tag, const wchar_t *text); /** @brief Construct new xsd__anyAttribute DOM attribute with namespace URI (xmlns), (un)qualified tag name, and text @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name string @param text string */ soap_dom_attribute(struct soap *soap, const char *ns, const char *tag, const std::string& text); /** @brief Construct new xsd__anyAttribute DOM attribute with namespace URI (xmlns), (un)qualified tag name, and text @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name string @param text wide string */ soap_dom_attribute(struct soap *soap, const char *ns, const char *tag, const std::wstring& text); /** @brief Construct new xsd__anyAttribute DOM attribute with namespace URI (xmlns), (un)qualified tag name, and text @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name wide string @param text string */ soap_dom_attribute(struct soap *soap, const char *ns, const wchar_t *tag, const std::string& text); /** @brief Construct new xsd__anyAttribute DOM attribute with namespace URI (xmlns), (un)qualified tag name, and text @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name wide string @param text wide string */ soap_dom_attribute(struct soap *soap, const char *ns, const wchar_t *tag, const std::wstring& text); /** @brief Destructor (no-op, deletes are done by the managing context of this object) */ ~soap_dom_attribute(); /** @brief Set this xsd__anyAttribute DOM attribute namespace URI and tag name @param ns namespace URI string or NULL @param tag (un)qualified tag name string @return reference to *this */ soap_dom_attribute& set(const char *ns, const char *tag); /** @brief Set this xsd__anyAttribute DOM attribute namespace URI and tag name @param ns namespace URI string or NULL @param tag (un)qualified tag name string @return reference to *this */ soap_dom_attribute& set(const char *ns, const wchar_t *tag); /** @brief Set text of this xsd__anyAttribute DOM attribute node to Boolean "false" or "true" @param b Boolean value @return reference to *this */ soap_dom_attribute& set(bool b); /** @brief Set text of this xsd__anyAttribute DOM attribute node to an integer value @param n integer value @return reference to *this */ soap_dom_attribute& set(int n); /** @brief Set text of this xsd__anyAttribute DOM attribute node to a 64 bit integer value @param n 64 bit integer value @return reference to *this */ soap_dom_attribute& set(LONG64 n); /** @brief Set text of this xsd__anyAttribute DOM attribute node to a float value @param x float value (NaN and +/-INF are also supported) @return reference to *this */ soap_dom_attribute& set(float x); /** @brief Set text of this xsd__anyAttribute DOM attribute node to a double float value @param x double float value (NaN and +/-INF are also supported) @return reference to *this */ soap_dom_attribute& set(double x); /** @brief Set text of this xsd__anyAttribute DOM attribute node @param text string or NULL @return reference to *this */ soap_dom_attribute& set(const char *text); /** @brief Set text of this xsd__anyAttribute DOM attribute node @param text wide string or NULL @return reference to *this */ soap_dom_attribute& set(const wchar_t *text); /** @brief Set text of this xsd__anyAttribute DOM attribute node @param text string or NULL @return reference to *this */ soap_dom_attribute& set(const std::string& text); /** @brief Set text of this xsd__anyAttribute DOM attribute node @param text wide string or NULL @return reference to *this */ soap_dom_attribute& set(const std::wstring& text); /** @brief Set text of this xsd__anyAttribute DOM attribute node to Boolean "false" or "true", same as set(b) @param b Boolean value @return reference to *this */ soap_dom_attribute& operator=(bool b); /** @brief Set text of this xsd__anyAttribute DOM attribute node to an integer value, same as set(n) @param n integer value @return reference to *this */ soap_dom_attribute& operator=(int n); /** @brief Set text of this xsd__anyAttribute DOM attribute node to a 64 bit integer value, same as set(n) @param n 64 bit integer value @return reference to *this */ soap_dom_attribute& operator=(LONG64 n); /** @brief Set text of this xsd__anyAttribute DOM attribute node to a float value, same as set(x) @param x float value (NaN and +/-INF are also supported) @return reference to *this */ soap_dom_attribute& operator=(float x); /** @brief Set text of this xsd__anyAttribute DOM attribute node to a double float value, same as set(x) @param x double float value (NaN and +/-INF are also supported) @return reference to *this */ soap_dom_attribute& operator=(double x); /** @brief Set text of this xsd__anyAttribute DOM attribute node, same as set(text) @param text string or NULL @return reference to *this */ soap_dom_attribute& operator=(const char *text); /** @brief Set text of this xsd__anyAttribute DOM attribute node, same as set(text) @param text wide string or NULL @return reference to *this */ soap_dom_attribute& operator=(const wchar_t *text); /** @brief Set text of this xsd__anyAttribute DOM attribute node, same as set(text) @param text string or NULL @return reference to *this */ soap_dom_attribute& operator=(const std::string& text); /** @brief Set text of this xsd__anyAttribute DOM attribute node, same as set(text) @param text wide string or NULL @return reference to *this */ soap_dom_attribute& operator=(const std::wstring& text); /** @brief Copy an xsd__anyAttribute DOM attribute node to this node (not a deep copy) @param att pointer to xsd__anyAttribute DOM attribute node to copy from @return reference to *this */ soap_dom_attribute& operator=(const soap_dom_attribute& att); /** @brief Add an attribute node to this xsd__anyAttribute DOM attribute node to create or extend an attribute list, same as att(NULL, tag) @param tag (un)qualified tag name string of attribute @return reference to xsd__anyAttribute attribute node (new attribute node if none matches in the list) */ soap_dom_attribute& att(const char *tag); /** @brief Add an attribute node to this xsd__anyAttribute DOM attribute node to create or extend an attribute list, same as att(NULL, tag) @param tag (un)qualified tag name wide string of attribute @return reference to xsd__anyAttribute attribute node (new attribute node if none matches in the list) */ soap_dom_attribute& att(const wchar_t *tag); /** @brief Add an attribute node to this xsd__anyAttribute DOM attribute node to create or extend an attribute list @param ns namespace URI string or NULL of attribute @param tag (un)qualified tag name string of attribute @return reference to xsd__anyAttribute attribute node (new attribute node if none matches in the list) */ soap_dom_attribute& att(const char *ns, const char *tag); /** @brief Add an attribute node to this xsd__anyAttribute DOM attribute node to create or extend an attribute list @param ns namespace URI string or NULL of attribute @param tag (un)qualified tag name wide string of attribute @return reference to xsd__anyAttribute attribute node (new attribute node if none matches in the list) */ soap_dom_attribute& att(const char *ns, const wchar_t *tag); /** @brief Match the namespace URI and tag name of this xsd__anyAttribute DOM attribute node against a pattern, same as match(NULL, patt) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any) @return true if match */ bool match(const char *patt) const; /** @brief Match the namespace URI and tag name of this xsd__anyAttribute DOM attribute node against a pattern, same as match(NULL, patt) @param patt (un)qualified tag name wide string pattern (NULL, "*", and "*:*" match any) @return true if match */ bool match(const wchar_t *patt) const; /** @brief Match the namespace URI and tag name of this xsd__anyAttribute DOM attribute node against a pattern @param ns namespace URI string pattern ("*" matches any, NULL and "" match the null (empty) namespace) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any) @return true if match */ bool match(const char *ns, const char *patt) const; /** @brief Match the namespace URI and tag name of this xsd__anyAttribute DOM attribute node against a pattern @param ns namespace URI string pattern ("*" matches any, NULL and "" match the null (empty) namespace) @param patt (un)qualified tag name wide string pattern (NULL, "*", and "*:*" match any) @return true if match */ bool match(const char *ns, const wchar_t *patt) const; /** @brief Get the namespace URI of this xsd__anyAttribute DOM attribute node @return namespace URI string or NULL */ const char *ns() const; /** @brief Get the tag name of this xsd__anyAttribute DOM attribute node @return tag name string or NULL */ const char *tag() const; /** @brief Return true if this xsd__anyAttribute DOM attribute node text is Boolean "true" or "1" @return true if "true" or "1" */ bool is_true() const; /** @brief Return true if this xsd__anyAttribute DOM attribute node text is Boolean "false" or "0" @return true if "false" or "0" */ bool is_false() const; /** @brief Return 64 bit integer value of numeric text of this xsd__anyAttribute DOM attribute node @return 64 bit integer value or 0 if text is not numeric */ LONG64 get_int() const; /** @brief Return double float value of decimal text of this xsd__anyAttribute DOM attribute node @return double float value or NaN if text is not numeric */ double get_double() const; /** @brief Return text of this xsd__anyAttribute DOM attribute node @return string or NULL */ const char *get_text() const; /** @brief Return true if this xsd__anyAttribute DOM attribute node text is Boolean "true" or "1", same as is_true() @return true if "true" or "1" */ operator bool() const; /** @brief Return integer value of numeric text of this xsd__anyAttribute DOM attribute node, same as (int)get_int() @return integer value or 0 if text is not numeric */ operator int() const; /** @brief Return 64 bit integer value of numeric text of this xsd__anyAttribute DOM attribute node, same as get_int() @return 64 bit integer value or 0 if text is not numeric */ operator LONG64() const; /** @brief Return double float value of decimal text of this xsd__anyAttribute DOM attribute node, same as get_double() @return double float value or NaN if text is not numeric */ operator double() const; /** @brief Return text of this xsd__anyAttribute DOM attribute node, same as get_text() @return string or NULL */ operator const char*() const; /** @brief Return iterator to begin of attribute nodes starting with this attribute @return xsd__anyAttribute::iterator */ soap_dom_attribute_iterator att_begin(); /** @brief Return iterator to end of attribute nodes @return xsd__anyAttribute::iterator */ soap_dom_attribute_iterator att_end(); /** @brief Return iterator to search for matching attributes of this node, same as att_find(NULL, patt) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any) @return xsd__anyAttribute::iterator */ soap_dom_attribute_iterator att_find(const char *patt); /** @brief Return iterator to search for matching attributes of this node, same as att_find(NULL, patt) @param patt (un)qualified tag name wide string pattern (NULL, "*", and "*:*" match any) @return xsd__anyAttribute::iterator */ soap_dom_attribute_iterator att_find(const wchar_t *patt); /** @brief Return iterator to search for matching attributes of this node @param ns namespace URI string pattern ("*" matches any, "" matches the null (empty) namespace, NULL matches the null (empty) namespace if tag is unqualified or the namespace from namespace table if tag is qualified) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any) @return xsd__anyAttribute::iterator */ soap_dom_attribute_iterator att_find(const char *ns, const char *patt); /** @brief Return iterator to search for matching attributes of this node @param ns namespace URI string pattern ("*" matches any, "" matches the null (empty) namespace, NULL matches the null (empty) namespace if tag is unqualified or the namespace from namespace table if tag is qualified) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any) @return xsd__anyAttribute::iterator */ soap_dom_attribute_iterator att_find(const char *ns, const wchar_t *patt); void unlink(); }; /** @brief The xsd__anyAttribute DOM attribute node structure (xsd__anyAttribute is a typedef of soap_dom_attribute) */ typedef soap_dom_attribute xsd__anyAttribute; /** @class soap_dom_element @brief The xsd__anyType DOM element node structure (xsd__anyType is a typedef of soap_dom_element). */ struct soap_dom_element { struct soap_dom_element *next; ///< next sibling element node in list struct soap_dom_element *prnt; ///< pointer to parent node struct soap_dom_element *elts; ///< list of child element nodes struct soap_dom_attribute *atts; ///< list of attribute nodes const char *nstr; ///< namespace string const char *name; ///< (un)qualified tag name const char *lead; ///< leading XML content before start tag (used with WITH_DOM) const char *text; ///< text cdata in UTF-8 const char *code; ///< XML "code" (plain unconverted XML used with WTIH_DOM) const char *tail; ///< trailing XML content before end tag (used with WITH_DOM) const void *node; ///< pointer to serializable object int type; ///< SOAP_TYPE_T type of serializable object or 0 struct soap *soap; ///< soap context that manages this object /** iterator over sibling element node list */ typedef soap_dom_element_iterator iterator; /** @brief Construct new xsd__anyType DOM element "root" @param soap context that manages this object */ soap_dom_element(struct soap *soap = NULL); /** @brief Construct new xsd__anyType DOM element by (shallow) copying another element @param elt xsd__anyType DOM element copied */ soap_dom_element(const soap_dom_element& elt); /** @brief Construct new xsd__anyType DOM element with (un)qualified tag name, same as xsd__anyType(soap, NULL, tag) @param soap context that manages this object @param tag (un)qualified tag name string or NULL (unnamed node) */ soap_dom_element(struct soap *soap, const char *tag); /** @brief Construct new xsd__anyType DOM element with (un)qualified tag name, same as xsd__anyType(soap, NULL, tag) @param soap context that manages this object @param tag (un)qualified tag name wide string or NULL (unnamed node) */ soap_dom_element(struct soap *soap, const wchar_t *tag); /** @brief Construct new xsd__anyType DOM element with namespace URI (xmlns) and (un)qualified tag name @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name string or NULL (unnamed node) */ soap_dom_element(struct soap *soap, const char *ns, const char *tag); /** @brief Construct new xsd__anyType DOM element with namespace URI (xmlns) and (un)qualified tag name @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name wide string or NULL (unnamed node) */ soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag); /** @brief Construct new xsd__anyType DOM element with namespace URI (xmlns), (un)qualified tag name, and text @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name string or NULL (unnamed node) @param text string or NULL */ soap_dom_element(struct soap *soap, const char *ns, const char *tag, const char *text); /** @brief Construct new xsd__anyType DOM element with namespace URI (xmlns), (un)qualified tag name, and text @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name string or NULL (unnamed node) @param text wide string or NULL */ soap_dom_element(struct soap *soap, const char *ns, const char *tag, const wchar_t *text); /** @brief Construct new xsd__anyType DOM element with namespace URI (xmlns), (un)qualified tag name, and text @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name wide string or NULL (unnamed node) @param text string or NULL */ soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag, const char *text); /** @brief Construct new xsd__anyType DOM element with namespace URI (xmlns), (un)qualified tag name, and text @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name wide string or NULL (unnamed node) @param text wide string or NULL */ soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag, const wchar_t *text); /** @brief Construct new xsd__anyType DOM element with namespace URI (xmlns), (un)qualified tag name, and text @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name string or "" (unnamed node) @param text string */ soap_dom_element(struct soap *soap, const char *ns, const char *tag, const std::string& text); /** @brief Construct new xsd__anyType DOM element with namespace URI (xmlns), (un)qualified tag name, and text @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name wide string or "" (unnamed node) @param text string */ soap_dom_element(struct soap *soap, const char *ns, const char *tag, const std::wstring& text); /** @brief Construct new xsd__anyType DOM element with namespace URI (xmlns), (un)qualified tag name, and text @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name string or "" (unnamed node) @param text wide string */ soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag, const std::string& text); /** @brief Construct new xsd__anyType DOM element with namespace URI (xmlns), (un)qualified tag name, and text @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name wide string or "" (unnamed node) @param text wide string */ soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag, const std::wstring& text); /** @brief Construct new xsd__anyType DOM element node with namespace URI (xmlns), (un)qualified tag name, and pointer to a serializable object @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name string or NULL (unnamed node) @param node pointer to serializable object @param type SOAP_TYPE_T type of the serializable object of type T */ soap_dom_element(struct soap *soap, const char *ns, const char *tag, const void *node, int type); /** @brief Construct new xsd__anyType DOM element node with namespace URI (xmlns), (un)qualified tag name, and pointer to a serializable object @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name wide string or NULL (unnamed node) @param node pointer to serializable object @param type SOAP_TYPE_T type of the serializable object of type T */ soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag, const void *node, int type); /** @brief Destructor (no-op, deletes are done by the managing context of this object) */ ~soap_dom_element(); /** @brief Set xsd__anyType DOM element namespace URI and tag name @param ns namespace URI string or NULL @param tag (un)qualified tag name string or NULL (unnamed node) @return reference to *this */ soap_dom_element& set(const char *ns, const char *tag); /** @brief Set xsd__anyType DOM element namespace URI and tag name @param ns namespace URI string or NULL @param tag (un)qualified tag name wide string or NULL (unnamed node) @return reference to *this */ soap_dom_element& set(const char *ns, const wchar_t *tag); /** @brief Set text of this xsd__anyType DOM element node to Boolean "false" or "true" @param b Boolean value @return reference to *this */ soap_dom_element& set(bool b); /** @brief Set text of this xsd__anyType DOM element node to an integer value @param n integer value @return reference to *this */ soap_dom_element& set(int n); /** @brief Set text of this xsd__anyType DOM element node to an integer value @param n integer value @return reference to *this */ soap_dom_element& set(LONG64 n); /** @brief Set text of this xsd__anyType DOM element node to a float value @param x float value (NaN and +/-INF are also supported) @return reference to *this */ soap_dom_element& set(float x); /** @brief Set text of this xsd__anyType DOM element node to a double float value @param x double float value (NaN and +/-INF are also supported) @return reference to *this */ soap_dom_element& set(double x); /** @brief Set text of this xsd__anyType DOM element node @param text string or NULL @return reference to *this */ soap_dom_element& set(const char *text); /** @brief Set text of this xsd__anyType DOM element node @param text wide string or NULL @return reference to *this */ soap_dom_element& set(const wchar_t *text); /** @brief Set text of this xsd__anyType DOM element node @param text string @return reference to *this */ soap_dom_element& set(const std::string& text); /** @brief Set text of this xsd__anyType DOM element node @param text wide string @return reference to *this */ soap_dom_element& set(const std::wstring& text); /** @brief Set this xsd__anyType DOM element node to point to a serializable object @param node pointer to serializable object @param type SOAP_TYPE_T type of the serializable object of type T @return reference to *this */ soap_dom_element& set(const void *node, int type); /** @brief Add a child element node to this xsd__anyType DOM element node @param elt reference to element node to copy and add as a child @return reference to *this */ soap_dom_element& add(soap_dom_element& elt); /** @brief Add a child element node to this xsd__anyType DOM element node @param elt pointer to element node to copy and add as a child @return reference to *this */ soap_dom_element& add(soap_dom_element *elt); /** @brief Add an attribute node to this xsd__anyType DOM element node @param att reference to xsd__anyAttribute attribute node to copy and add @return reference to *this */ soap_dom_element& add(soap_dom_attribute& att); /** @brief Add an attribute node to this xsd__anyType DOM element node @param att pointer to xsd__anyAttribute attribute node to copy and add @return reference to *this */ soap_dom_element& add(soap_dom_attribute *att); /** @brief Copy list of element nodes to this xsd__anyType DOM element node as children @param elts reference to list of xsd__anyType DOM element nodes to copy and add as children @return reference to *this */ soap_dom_element& adds(soap_dom_element& elts); /** @brief Copy list of element nodes to this xsd__anyType DOM element node as children @param elts pointer to list of xsd__anyType DOM element nodes to copy and add as children @return reference to *this */ soap_dom_element& adds(soap_dom_element *elts); /** @brief Copy list of attribute nodes to this xsd__anyType DOM element node @param atts reference to list of xsd__anyAttribute attribute nodes to copy and add @return reference to *this */ soap_dom_element& adds(soap_dom_attribute& atts); /** @brief Copy list of attribute nodes to this xsd__anyType DOM element node @param atts pointer to list of xsd__anyAttribute attribute nodes to copy and add @return reference to *this */ soap_dom_element& adds(soap_dom_attribute *atts); /** @brief Set text of this xsd__anyType DOM element node to Boolean "false" or "true", same as set(b) @param b Boolean value @return reference to *this */ soap_dom_element& operator=(bool b); /** @brief Set text of this xsd__anyType DOM element node to an integer value, same as set(n) @param n integer value @return reference to *this */ soap_dom_element& operator=(int n); /** @brief Set text of this xsd__anyType DOM element node to an integer value, same as set(n) @param n 64 bit integer value @return reference to *this */ soap_dom_element& operator=(LONG64 n); /** @brief Set text of this xsd__anyType DOM element node to a float value, same as set(x) @param x float value (NaN and +/-INF are also supported) @return reference to *this */ soap_dom_element& operator=(float x); /** @brief Set text of this xsd__anyType DOM element node to a double float value, same as set(x) @param x double float value (NaN and +/-INF are also supported) @return reference to *this */ soap_dom_element& operator=(double x); /** @brief Set text of this xsd__anyType DOM element node, same as set(text) @param text string or NULL @return reference to *this */ soap_dom_element& operator=(const char *text); /** @brief Set text of this xsd__anyType DOM element node, same as set(text) @param text wide string or NULL @return reference to *this */ soap_dom_element& operator=(const wchar_t *text); /** @brief Set text of this xsd__anyType DOM element node, same as set(text) @param text string @return reference to *this */ soap_dom_element& operator=(const std::string& text); /** @brief Set text of this xsd__anyType DOM element node, same as set(text) @param text wide string @return reference to *this */ soap_dom_element& operator=(const std::wstring& text); /** @brief Copy an xsd__anyType DOM element node to this node (not a deep copy) @param elt reference to xsd__anyType DOM element node to copy from @return reference to *this */ soap_dom_element& operator=(const soap_dom_element& elt); /** @brief Set this xsd__anyType DOM element node to point to a serializable object @param obj reference to serializable object that has a soap_type() member @return reference to *this */ template soap_dom_element& operator=(const T& obj); /** @brief Set this xsd__anyType DOM element node to point to a serializable object @param obj pointer to serializable object that has a soap_type() member @return reference to *this */ template soap_dom_element& operator=(const T *obj); /** @brief Set this xsd__anyType DOM element node to point to a serializable object @param obj pointer to serializable object that has a soap_type() member @return reference to *this */ template soap_dom_element& operator=(T *obj); /** @brief Populate this xsd__anyType DOM element node with an attribute node, same as att(NULL, tag) @param tag (un)qualified tag name string of attribute @return reference to xsd__anyAttribute attribute node (new attribute node if none matches) */ soap_dom_attribute& att(const char *tag); /** @brief Populate this xsd__anyType DOM element node with an attribute node, same as att(NULL, tag) @param tag (un)qualified tag name wide string of attribute @return reference to xsd__anyAttribute attribute node (new attribute node if none matches) */ soap_dom_attribute& att(const wchar_t *tag); /** @brief Populate this xsd__anyType DOM element node with an attribute node @param ns namespace URI string or NULL of attribute @param tag (un)qualified tag name string of attribute @return reference to xsd__anyAttribute attribute node (new attribute node if none matches) */ soap_dom_attribute& att(const char *ns, const char *tag); /** @brief Populate this xsd__anyType DOM element node with an attribute node @param ns namespace URI string or NULL of attribute @param tag (un)qualified tag name wide string of attribute @return reference to xsd__anyAttribute attribute node (new attribute node if none matches) */ soap_dom_attribute& att(const char *ns, const wchar_t *tag); /** @brief Populate this xsd__anyType DOM element node with an unnamed (tagless) child element node, same as elt(NULL, "") @return reference to child element node (new child element node if none matches) */ soap_dom_element& elt(); /** @brief Populate this xsd__anyType DOM element node with a child element node, same as elt(NULL, tag) @param tag (un)qualified tag name string of child element or NULL (unnamed node) @return reference to child element node (new child element node if none matches) */ soap_dom_element& elt(const char *tag); /** @brief Populate this xsd__anyType DOM element node with a child element node, same as elt(NULL, tag) @param tag (un)qualified tag name wide string of child element or NULL (unnamed node) @return reference to child element node (new child element node if none matches) */ soap_dom_element& elt(const wchar_t *tag); /** @brief Populate this xsd__anyType DOM element node with a child element node @param ns namespace URI string or NULL of child element @param tag (un)qualified tag name string of child element or NULL (unnamed node) @return reference to child element node (new child element node if none matches) */ soap_dom_element& elt(const char *ns, const char *tag); /** @brief Populate this xsd__anyType DOM element node with a child element node @param ns namespace URI string or NULL of child element @param tag (un)qualified tag name wide string of child element or NULL (unnamed node) @return reference to child element node (new child element node if none matches) */ soap_dom_element& elt(const char *ns, const wchar_t *tag); /** @brief Populate this xsd__anyType DOM element node with a child element node, same as elt(NULL, tag) @param tag (un)qualified tag name wide string of child element or NULL (unnamed node) @return reference to child element node (new child element node if none matches) */ soap_dom_element& operator[](const char *tag); /** @brief Populate this xsd__anyType DOM element node with a child element node, same as elt(NULL, tag) @param tag (un)qualified tag name wide string of child element or NULL (unnamed node) @return reference to child element node (new child element node if none matches) */ soap_dom_element& operator[](const wchar_t *tag); /** @brief Add a N-th child element with the same namespace and tag name as this xsd__anyType DOM element node that is a child element node at position one (1) in a sibling list @param n additional child element position requested, counting from one (1) XPath style @return reference to xsd__anyType child element node (new child element node if none exists at position n) */ soap_dom_element& operator[](size_t n); /** @brief Get attribute node of this xsd__anyType DOM element node, if attribute exists, same as att_get(NULL, tag) @param tag (un)qualified tag name string of attribute @return pointer to xsd__anyAttribute DOM attribute node or NULL if not exists */ soap_dom_attribute *att_get(const char *tag) const; /** @brief Get attribute node of this xsd__anyType DOM element node, if attribute exists, same as att_get(NULL, tag) @param tag (un)qualified tag name wide string of attribute @return pointer to xsd__anyAttribute DOM attribute node or NULL if not exists */ soap_dom_attribute *att_get(const wchar_t *tag) const; /** @brief Get attribute node of this xsd__anyType DOM element node, if attribute exists @param ns namespace URI string (NULL matches the null (empty) namespace if tag is unqualified) of attribute @param tag (un)qualified tag name string of attribute @return pointer to xsd__anyAttribute DOM attribute node or NULL if not exists */ soap_dom_attribute *att_get(const char *ns, const char *tag) const; /** @brief Get attribute node of this xsd__anyType DOM element node, if attribute exists @param ns namespace URI string (NULL matches the null (empty) namespace if tag is unqualified) of attribute @param tag (un)qualified tag name wide string of attribute @return pointer to xsd__anyAttribute DOM attribute node or NULL if not exists */ soap_dom_attribute *att_get(const char *ns, const wchar_t *tag) const; /** @brief Get unnamed (tagless) child element node of this xsd__anyType DOM element node, if child element exists, same as elt_get(NULL, NULL) or elt_get(NULL, ""); @return pointer to xsd__anyType DOM child element node or NULL if not exists */ soap_dom_element *elt_get() const; /** @brief Get child element node of this xsd__anyType DOM element node, if child element exists @param tag (un)qualified tag name string (NULL matches unnamed node) of child element @return pointer to xsd__anyType DOM child element node or NULL if not exists */ soap_dom_element *elt_get(const char *tag) const; /** @brief Get child element node of this xsd__anyType DOM element node, if child element exists, same as elt_get(NULL, tag) @param tag (un)qualified tag name wide string (NULL matches unnamed node) of child element @return pointer to xsd__anyType DOM child element node or NULL if not exists */ soap_dom_element *elt_get(const wchar_t *tag) const; /** @brief Get child element node of this xsd__anyType DOM element node, if child element exists @param ns namespace URI string (NULL matches the null (empty) namespace if tag is unqualified) of child element @param tag (un)qualified tag name string (NULL matches unnamed node) of child element @return pointer to xsd__anyType DOM child element node or NULL if not exists */ soap_dom_element *elt_get(const char *ns, const char *tag) const; /** @brief Get child element node of this xsd__anyType DOM element node, if child element exists @param ns namespace URI string (NULL matches the null (empty) namespace if tag is unqualified) of child element @param tag (un)qualified tag name wide string (NULL matches unnamed node) of child element @return pointer to xsd__anyType DOM child element node or NULL if not exists */ soap_dom_element *elt_get(const char *ns, const wchar_t *tag) const; /** @brief Get next child element node that has the same namespace URI and tag name as this child element node in a sibling list @return pointer to xsd__anyType DOM child element node or NULL if not exists */ soap_dom_element *get_next() const; /** @brief Get N-th child element node that has the same namespace URI and tag name as this child element node at position one (1) in a sibling list @param n N-th element minus one located from the current element node at position one (1), 1 returns this element node @return pointer to xsd__anyType DOM child element node or NULL if not exists */ soap_dom_element *get_nth(size_t n); /** @brief Match the namespace URI and tag name of this xsd__anyType DOM element node against a pattern @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any, "" matches unnamed node) @return true if match */ bool match(const char *patt) const; /** @brief Match the namespace URI and tag name of this xsd__anyType DOM element node against a pattern, same as match(NULL, patt) @param patt (un)qualified tag name wide string pattern (NULL, "*", and "*:*" match any, "" matches unnamed node) @return true if match */ bool match(const wchar_t *patt) const; /** @brief Match the namespace URI and tag name of this xsd__anyType DOM element node against a pattern, same as match(NULL, patt) @param ns namespace URI string pattern ("*" matches any, NULL and "" match the null (empty) namespace) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any, "" matches unnamed node) @return true if match */ bool match(const char *ns, const char *patt) const; /** @brief Match the namespace URI and tag name of this xsd__anyType DOM element node against a pattern @param ns namespace URI string pattern ("*" matches any, NULL and "" match the null (empty) namespace) @param patt (un)qualified tag name wide string pattern (NULL, "*", and "*:*" match any, "" matches unnamed node) @return true if match */ bool match(const char *ns, const wchar_t *patt) const; /** @brief Get the namespace URI of this xsd__anyType DOM element node @return namespace URI string or NULL */ const char *ns() const; /** @brief Get the tag name of this xsd__anyType DOM element node @return tag name string or NULL */ const char *tag() const; /** @brief Return pointer to parent of this xsd__anyType DOM element node, if any @return pointer to xsd__anyType DOM element or NULL */ soap_dom_element *parent(); /** @brief Return depth from the root node of this xsd__anyType DOM element node @return depth from root node, zero if node is a root node and has no parent */ size_t depth() const; /** @brief Return child index of this xsd__anyType DOM child element node in its sibling list @return nonzero index of child among siblings, or 0 if node is a root node and has no parent */ size_t index() const; /** @brief Return number of siblings of this xsd__anyType DOM child node that have the same namespace URI and tag name @return number of siblings plus one (for self) that have the same namespace URI and tag name */ size_t len() const; /** @brief Return index of this xsd__anyType DOM child node among siblings that have the same namespace URI and tag name @return nonzero N-th index (1 <= nth <= len), or 0 if element is root or is singular (has no siblings with the same namespace URI and tag name) */ size_t nth() const; /** @brief Return number of child element nodes of this xsd__anyType DOM element node, same as elt_size(NULL, NULL) @return number of child elements */ size_t elt_size(); /** @brief Return number of matching child element nodes of this xsd__anyType DOM element node, same as elt_size(NULL, patt, type) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any, "" matches unnamed node) @param type optional SOAP_TYPE_T type of deserialized object of type T to match or 0 @return number of matches found */ size_t elt_size(const char *patt, int type = 0); /** @brief Return number of matching child element nodes of this xsd__anyType DOM element node @param ns namespace URI string pattern ("*" matches any, "" matches the null (empty) namespace, NULL matches the null (empty) namespace if tag is unqualified or the namespace from namespace table if tag is qualified) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any, "" matches unnamed node) @param type optional SOAP_TYPE_T type of deserialized object of type T to match or 0 @return number of matches found */ size_t elt_size(const char *ns, const char *patt, int type = 0); /** @brief Return number of attribute nodes of this xsd__anyType DOM element node, same as att_size(NULL, NULL) @return number of attributes */ size_t att_size(); /** @brief Return number of matching attribute nodes of this xsd__anyType DOM element node, same as att_size(NULL, patt) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any) @return number of matches found */ size_t att_size(const char *patt); /** @brief Return number of matching attribute nodes of this xsd__anyType DOM element node @param ns namespace URI string pattern ("*" matches any, "" matches the null (empty) namespace, NULL matches the null (empty) namespace if tag is unqualified or the namespace from namespace table if tag is qualified) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any) @return number of matches found */ size_t att_size(const char *ns, const char *patt); /** @brief Return true if this xsd__anyType DOM element node text is Boolean "true" or "1" @return true if "true" or "1" */ bool is_true() const; /** @brief Return true if this xsd__anyType DOM element node text is Boolean "false" or "0" @return true if "false" or "0" */ bool is_false() const; /** @brief Return 64 bit integer value of numeric text of this xsd__anyType DOM element node @return 64 bit integer value or 0 if text is not numeric */ LONG64 get_int() const; /** @brief Return double float value of decimal text of this xsd__anyType DOM element node @return double float value or NaN if text is not numeric */ double get_double() const; /** @brief Return text of this xsd__anyType DOM element node @return string or NULL */ const char *get_text() const; /** @brief Return true if this xsd__anyType DOM element node text is Boolean "true" or "1", same as is_true() @return true if "true" or "1" */ operator bool() const; /** @brief Return integer value of numeric text of this xsd__anyType DOM element node, same as (int)get_int() @return integer value or 0 if text is not numeric */ operator int() const; /** @brief Return 64 bit integer value of numeric text of this xsd__anyType DOM element node, same as get_int() @return 64 bit integer value or 0 if text is not numeric */ operator LONG64() const; /** @brief Return double float value of decimal text of this xsd__anyType DOM element node, same as get_double() @return double float value or NaN if text is not numeric */ operator double() const; /** @brief Return text of this xsd__anyType DOM element node, same as get_text() @return string or NULL */ operator const char*() const; /** @brief Return iterator to begin of deep depth-first node graph traversal starting with this node @return xsd__anyType::iterator */ soap_dom_element_iterator begin(); /** @brief Return iterator to end of deep depth-first tnode graph traversal @return xsd__anyType::iterator */ soap_dom_element_iterator end(); /** @brief Return iterator to begin of child element nodes @return xsd__anyType::iterator */ soap_dom_element_iterator elt_begin(); /** @brief Return iterator to end of child element nodes @return xsd__anyType::iterator */ soap_dom_element_iterator elt_end(); /** @brief Return iterator to begin of attribute nodes @return xsd__anyAttribute::iterator */ soap_dom_attribute_iterator att_begin(); /** @brief Return iterator to end of attribute nodes @return xsd__anyAttribute::iterator */ soap_dom_attribute_iterator att_end(); /** @brief Return iterator to search deep depth-first over node graph starting from this node, same as find(NULL, patt, type) @param patt (un)qualified tag name string pattern (use '@' to match attributes, NULL, "*", and "*:*" match any, "" matches unnamed node) @param type optional SOAP_TYPE_T type of deserialized object of type T to match or 0 @return xsd__anyType::iterator */ soap_dom_element_iterator find(const char *patt, int type = 0); /** @brief Return iterator to search deep depth-first over node graph starting from this node, same as find(NULL, patt, type) @param patt (un)qualified tag name wide string pattern (use '@' to match attributes, NULL, "*", and "*:*" match any, "" matches unnamed node) @param type optional SOAP_TYPE_T type of deserialized object of type T to match or 0 @return xsd__anyType::iterator */ soap_dom_element_iterator find(const wchar_t *patt, int type = 0); /** @brief Return iterator to search deep depth-first over node graph starting from this node @param ns namespace URI string pattern ("*" matches any, "" matches the null (empty) namespace, NULL matches the null (empty) namespace if tag is unqualified or the namespace from namespace table if tag is qualified) @param patt (un)qualified tag name string pattern (use '@' to match attributes, NULL, "*", and "*:*" match any, "" matches unnamed node) @param type optional SOAP_TYPE_T type of deserialized object of type T to match or 0 @return xsd__anyType::iterator */ soap_dom_element_iterator find(const char *ns, const char *patt, int type = 0); /** @brief Return iterator to search deep depth-first over node graph starting from this node @param ns namespace URI string pattern ("*" matches any, "" matches the null (empty) namespace, NULL matches the null (empty) namespace if tag is unqualified or the namespace from namespace table if tag is qualified) @param patt (un)qualified tag name wide string pattern (use '@' to match attributes, NULL, "*", and "*:*" match any, "" matches unnamed node) @param type optional SOAP_TYPE_T type of deserialized object of type T to match or 0 @return xsd__anyType::iterator */ soap_dom_element_iterator find(const char *ns, const wchar_t *patt, int type = 0); /** @brief Return iterator to search deep depth-first over node graph to find deserialized objects, starting from this node @param type optional SOAP_TYPE_T type of deserialized object of type T to match or 0 @return xsd__anyType::iterator */ soap_dom_element_iterator find(int type); /** @brief Return iterator to search for matching child elements of this node, same as elt_find(NULL, patt, type) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any, "" matches unnamed node) @param type optional SOAP_TYPE_T type of deserialized object of type T to match or 0 @return xsd__anyType::iterator */ soap_dom_element_iterator elt_find(const char *patt, int type = 0); /** @brief Return iterator to search for matching child elements of this node, same as elt_find(NULL, patt, type) @param patt (un)qualified tag name wide string pattern (NULL, "*", and "*:*" match any, "" matches unnamed node) @param type optional SOAP_TYPE_T type of deserialized object of type T to match or 0 @return xsd__anyType::iterator */ soap_dom_element_iterator elt_find(const wchar_t *patt, int type = 0); /** @brief Return iterator to search for matching child elements of this node @param ns namespace URI string pattern ("*" matches any, "" matches the null (empty) namespace, NULL matches the null (empty) namespace if tag is unqualified or the namespace from namespace table if tag is qualified) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any, "" matches unnamed node) @param type optional SOAP_TYPE_T type of deserialized object of type T to match or 0 @return xsd__anyType::iterator */ soap_dom_element_iterator elt_find(const char *ns, const char *patt, int type = 0); /** @brief Return iterator to search for matching child elements of this node @param ns namespace URI string pattern ("*" matches any, "" matches the null (empty) namespace, NULL matches the null (empty) namespace if tag is unqualified or the namespace from namespace table if tag is qualified) @param patt (un)qualified tag name wide string pattern (NULL, "*", and "*:*" match any, "" matches unnamed node) @param type optional SOAP_TYPE_T type of deserialized object of type T to match or 0 @return xsd__anyType::iterator */ soap_dom_element_iterator elt_find(const char *ns, const wchar_t *patt, int type = 0); /** @brief Return iterator to search for child elements of this node that have deserialized objects @param type SOAP_TYPE_T type of deserialized object of type T to match or 0 @return xsd__anyType::iterator */ soap_dom_element_iterator elt_find(int type); /** @brief Return iterator to search for matching attributes of this node @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any, "" matches unnamed node) @return xsd__anyAttribute::iterator */ soap_dom_attribute_iterator att_find(const char *patt); /** @brief Return iterator to search for matching attributes of this node, same as att_find(NULL, patt) @param patt (un)qualified tag name wide string pattern (NULL, "*", and "*:*" match any) @return xsd__anyAttribute::iterator */ soap_dom_attribute_iterator att_find(const wchar_t *patt); /** @brief Return iterator to search for matching attributes of this node, same as att_find(NULL, patt) @param ns namespace URI string pattern ("*" matches any, "" matches the null (empty) namespace, NULL matches the null (empty) namespace if tag is unqualified or the namespace from namespace table if tag is qualified) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any) @return xsd__anyAttribute::iterator */ soap_dom_attribute_iterator att_find(const char *ns, const char *patt); /** @brief Return iterator to search for matching attributes of this node @param ns namespace URI string pattern ("*" matches any, "" matches the null (empty) namespace, NULL matches the null (empty) namespace if tag is unqualified or the namespace from namespace table if tag is qualified) @param patt (un)qualified tag name wide string pattern (NULL, "*", and "*:*" match any) @return xsd__anyAttribute::iterator */ soap_dom_attribute_iterator att_find(const char *ns, const wchar_t *patt); void unlink(); }; /** @brief The xsd__anyType DOM element node structure (xsd__anyType is a typedef of soap_dom_element). */ typedef soap_dom_element xsd__anyType; /** @brief Write XML to current output (this is an auto-generted macro in soapH.h) @param soap context that manages IO @param dom root element node of the XML document @return SOAP_OK or an error code */ int soap_write_xsd__anyType(struct soap *soap, xsd__anyType *dom); /** @brief Parse XML from current input (this is an auto-generted macro in soapH.h) @param soap context that manages IO @param dom root element node of the XML document @return SOAP_OK or an error code */ int soap_read_xsd__anyType(struct soap *soap, xsd__anyType *dom); #endif /******************************************************************************\ * * soap_dom_element class * \******************************************************************************/ soap_dom_element::soap_dom_element(struct soap *soap) { soap_default_xsd__anyType(soap, this); this->name = "root"; } /******************************************************************************/ soap_dom_element::soap_dom_element(const soap_dom_element& elt) { soap_default_xsd__anyType(elt.soap, this); (void)soap_elt_copy(this, &elt); } /******************************************************************************/ soap_dom_element::soap_dom_element(struct soap *soap, const char *tag) { soap_default_xsd__anyType(soap, this); (void)soap_elt_set(this, NULL, tag); } /******************************************************************************/ soap_dom_element::soap_dom_element(struct soap *soap, const wchar_t *tag) { soap_default_xsd__anyType(soap, this); (void)soap_elt_set_w(this, NULL, tag); } /******************************************************************************/ soap_dom_element::soap_dom_element(struct soap *soap, const char *ns, const char *tag) { soap_default_xsd__anyType(soap, this); (void)soap_elt_set(this, ns, tag); } /******************************************************************************/ soap_dom_element::soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag) { soap_default_xsd__anyType(soap, this); (void)soap_elt_set_w(this, ns, tag); } /******************************************************************************/ soap_dom_element::soap_dom_element(struct soap *soap, const char *ns, const char *tag, const char *text) { soap_default_xsd__anyType(soap, this); (void)soap_elt_text(soap_elt_set(this, ns, tag), text); } /******************************************************************************/ soap_dom_element::soap_dom_element(struct soap *soap, const char *ns, const char *tag, const wchar_t *text) { soap_default_xsd__anyType(soap, this); (void)soap_elt_text_w(soap_elt_set(this, ns, tag), text); } /******************************************************************************/ soap_dom_element::soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag, const char *text) { soap_default_xsd__anyType(soap, this); (void)soap_elt_text(soap_elt_set_w(this, ns, tag), text); } /******************************************************************************/ soap_dom_element::soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag, const wchar_t *text) { soap_default_xsd__anyType(soap, this); (void)soap_elt_text_w(soap_elt_set_w(this, ns, tag), text); } /******************************************************************************/ #ifndef WITH_COMPAT soap_dom_element::soap_dom_element(struct soap *soap, const char *ns, const char *tag, const std::string& text) { soap_default_xsd__anyType(soap, this); (void)soap_elt_text(soap_elt_set(this, ns, tag), text.c_str()); } #endif /******************************************************************************/ #ifndef WITH_COMPAT soap_dom_element::soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag, const std::string& text) { soap_default_xsd__anyType(soap, this); (void)soap_elt_text(soap_elt_set_w(this, ns, tag), text.c_str()); } #endif /******************************************************************************/ #ifndef WITH_COMPAT soap_dom_element::soap_dom_element(struct soap *soap, const char *ns, const char *tag, const std::wstring& text) { soap_default_xsd__anyType(soap, this); (void)soap_elt_text_w(soap_elt_set(this, ns, tag), text.c_str()); } #endif /******************************************************************************/ #ifndef WITH_COMPAT soap_dom_element::soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag, const std::wstring& text) { soap_default_xsd__anyType(soap, this); (void)soap_elt_text_w(soap_elt_set_w(this, ns, tag), text.c_str()); } #endif /******************************************************************************/ soap_dom_element::soap_dom_element(struct soap *soap, const char *ns, const char *tag, const void *node, int type) { soap_default_xsd__anyType(soap, this); (void)soap_elt_node(soap_elt_set(this, ns, tag), node, type); } /******************************************************************************/ soap_dom_element::soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag, const void *node, int type) { soap_default_xsd__anyType(soap, this); (void)soap_elt_node(soap_elt_set_w(this, ns, tag), node, type); } /******************************************************************************/ soap_dom_element::~soap_dom_element() { } /******************************************************************************/ soap_dom_element_iterator soap_dom_element::begin() { soap_dom_element_iterator iter = soap_dom_element_iterator(this); iter.stop = this; iter.deep = true; return iter; } /******************************************************************************/ soap_dom_element_iterator soap_dom_element::find(const char *ns, const char *patt, int type) { soap_dom_element_iterator iter(soap_dom_find(this, this, ns, patt, type)); iter.stop = this; iter.nstr = ns; iter.name = patt; iter.type = type; iter.deep = true; return iter; } /******************************************************************************/ soap_dom_element_iterator soap_dom_element::find(const char *ns, const wchar_t *tag, int type) { const char *s = soap_wchar2s(NULL, tag); soap_dom_element_iterator iter = this->find(ns, s, type); if (s) free((void*)s); return iter; } /******************************************************************************/ soap_dom_element_iterator soap_dom_element::find(int type) { return this->find((const char*)NULL, (const char*)NULL, type); } /******************************************************************************/ soap_dom_element_iterator soap_dom_element::elt_find(const char *ns, const char *patt, int type) { soap_dom_element_iterator iter(soap_elt_find_type(this, ns, patt, type)); iter.nstr = ns; iter.name = patt; iter.type = type; return iter; } /******************************************************************************/ soap_dom_element_iterator soap_dom_element::elt_find(const char *ns, const wchar_t *patt, int type) { const char *s = soap_wchar2s(NULL, patt); soap_dom_element_iterator iter = this->elt_find(ns, s, type); if (s) free((void*)s); return iter; } /******************************************************************************/ soap_dom_element_iterator soap_dom_element::elt_find(int type) { return this->elt_find((const char*)NULL, (const char*)NULL, type); } /******************************************************************************/ soap_dom_attribute_iterator soap_dom_element::att_find(const char *ns, const char *patt) { soap_dom_attribute_iterator iter(soap_att_find(this, ns, patt)); iter.nstr = ns; iter.name = patt; return iter; } /******************************************************************************/ soap_dom_attribute_iterator soap_dom_element::att_find(const char *ns, const wchar_t *patt) { const char *s = soap_wchar2s(NULL, patt); soap_dom_attribute_iterator iter = this->att_find(ns, s); if (s) free((void*)s); return iter; } /******************************************************************************/ void soap_dom_element::unlink() { soap_unlink(soap, this); soap_unlink(soap, nstr); soap_unlink(soap, name); soap_unlink(soap, text); if (elts) elts->unlink(); if (atts) atts->unlink(); if (next) next->unlink(); node = NULL; type = 0; } /******************************************************************************\ * * soap_dom_attribute class * \******************************************************************************/ soap_dom_attribute::soap_dom_attribute(struct soap *soap) { soap_default_xsd__anyAttribute(soap, this); } /******************************************************************************/ soap_dom_attribute::soap_dom_attribute(const soap_dom_attribute& att) { soap_default_xsd__anyAttribute(att.soap, this); (void)soap_att_copy(this, &att); } /******************************************************************************/ soap_dom_attribute::soap_dom_attribute(struct soap *soap, const char *tag) { soap_default_xsd__anyAttribute(soap, this); (void)soap_att_set(this, NULL, tag); } /******************************************************************************/ soap_dom_attribute::soap_dom_attribute(struct soap *soap, const wchar_t *tag) { soap_default_xsd__anyAttribute(soap, this); (void)soap_att_set_w(this, NULL, tag); } /******************************************************************************/ soap_dom_attribute::soap_dom_attribute(struct soap *soap, const char *ns, const char *tag, const char *text) { soap_default_xsd__anyAttribute(soap, this); (void)soap_att_text(soap_att_set(this, ns, tag), text); } /******************************************************************************/ soap_dom_attribute::soap_dom_attribute(struct soap *soap, const char *ns, const char *tag, const wchar_t *text) { soap_default_xsd__anyAttribute(soap, this); (void)soap_att_text_w(soap_att_set(this, ns, tag), text); } /******************************************************************************/ soap_dom_attribute::soap_dom_attribute(struct soap *soap, const char *ns, const wchar_t *tag, const char *text) { soap_default_xsd__anyAttribute(soap, this); (void)soap_att_text(soap_att_set_w(this, ns, tag), text); } /******************************************************************************/ soap_dom_attribute::soap_dom_attribute(struct soap *soap, const char *ns, const wchar_t *tag, const wchar_t *text) { soap_default_xsd__anyAttribute(soap, this); (void)soap_att_text_w(soap_att_set_w(this, ns, tag), text); } /******************************************************************************/ #ifndef WITH_COMPAT soap_dom_attribute::soap_dom_attribute(struct soap *soap, const char *ns, const char *tag, const std::string& text) { soap_default_xsd__anyAttribute(soap, this); (void)soap_att_text(soap_att_set(this, ns, tag), text.c_str()); } #endif /******************************************************************************/ #ifndef WITH_COMPAT soap_dom_attribute::soap_dom_attribute(struct soap *soap, const char *ns, const char *tag, const std::wstring& text) { soap_default_xsd__anyAttribute(soap, this); (void)soap_att_text_w(soap_att_set(this, ns, tag), text.c_str()); } #endif /******************************************************************************/ #ifndef WITH_COMPAT soap_dom_attribute::soap_dom_attribute(struct soap *soap, const char *ns, const wchar_t *tag, const std::string& text) { soap_default_xsd__anyAttribute(soap, this); (void)soap_att_text(soap_att_set_w(this, ns, tag), text.c_str()); } #endif /******************************************************************************/ #ifndef WITH_COMPAT soap_dom_attribute::soap_dom_attribute(struct soap *soap, const char *ns, const wchar_t *tag, const std::wstring& text) { soap_default_xsd__anyAttribute(soap, this); (void)soap_att_text_w(soap_att_set_w(this, ns, tag), text.c_str()); } #endif /******************************************************************************/ soap_dom_attribute::~soap_dom_attribute() { } /******************************************************************************/ soap_dom_attribute_iterator soap_dom_attribute::att_find(const char *ns, const char *patt) { soap_dom_attribute_iterator iter(this); iter.nstr = ns; iter.name = patt; if (patt) { if (!soap_patt_match(this->name, patt)) return ++iter; if (ns && (!this->nstr || strcmp(this->nstr, ns))) return ++iter; if (!ns && this->nstr) return ++iter; } return iter; } /******************************************************************************/ soap_dom_attribute_iterator soap_dom_attribute::att_find(const char *ns, const wchar_t *patt) { const char *s = soap_wchar2s(NULL, patt); soap_dom_attribute_iterator iter = this->att_find(ns, s); if (s) free((void*)s); return iter; } /******************************************************************************/ void soap_dom_attribute::unlink() { soap_unlink(soap, this); soap_unlink(soap, nstr); soap_unlink(soap, name); soap_unlink(soap, text); if (next) next->unlink(); } /******************************************************************************\ * * soap_dom_element_iterator class * \******************************************************************************/ soap_dom_element_iterator::soap_dom_element_iterator() { iter = NULL; stop = NULL; nstr = NULL; name = NULL; type = 0; deep = false; } /******************************************************************************/ soap_dom_element_iterator::soap_dom_element_iterator(soap_dom_element *node) { iter = node; stop = NULL; nstr = NULL; name = NULL; type = 0; deep = false; } /******************************************************************************/ soap_dom_element_iterator::~soap_dom_element_iterator() { } /******************************************************************************/ bool soap_dom_element_iterator::operator==(const soap_dom_element_iterator &it) const { return this->iter == it.iter; } /******************************************************************************/ bool soap_dom_element_iterator::operator!=(const soap_dom_element_iterator &it) const { return this->iter != it.iter; } /******************************************************************************/ soap_dom_element& soap_dom_element_iterator::operator*() const { return *this->iter; } /******************************************************************************/ soap_dom_element *soap_dom_element_iterator::operator->() const { return this->iter; } /******************************************************************************/ soap_dom_element_iterator &soap_dom_element_iterator::operator++() { if (deep) this->iter = soap_dom_find_next(this->iter, this->stop, this->nstr, this->name, this->type); else this->iter = soap_elt_find_next_type(this->iter, this->nstr, this->name, this->type); return *this; } /******************************************************************************/ soap_dom_element_iterator soap_dom_element_iterator::operator++(int) { soap_dom_element_iterator iter(*this); ++*this; return iter; } /******************************************************************************\ * * soap_dom_attribute_iterator class * \******************************************************************************/ soap_dom_attribute_iterator::soap_dom_attribute_iterator() { iter = NULL; nstr = NULL; name = NULL; } /******************************************************************************/ soap_dom_attribute_iterator::soap_dom_attribute_iterator(soap_dom_attribute *node) { this->iter = node; nstr = NULL; name = NULL; } /******************************************************************************/ soap_dom_attribute_iterator::~soap_dom_attribute_iterator() { } /******************************************************************************/ bool soap_dom_attribute_iterator::operator==(const soap_dom_attribute_iterator &it) const { return this->iter == it.iter; } /******************************************************************************/ bool soap_dom_attribute_iterator::operator!=(const soap_dom_attribute_iterator &it) const { return this->iter != it.iter; } /******************************************************************************/ soap_dom_attribute& soap_dom_attribute_iterator::operator*() const { return *this->iter; } /******************************************************************************/ soap_dom_attribute *soap_dom_attribute_iterator::operator->() const { return this->iter; } /******************************************************************************/ soap_dom_attribute_iterator &soap_dom_attribute_iterator::operator++() { this->iter = soap_att_find_next(this->iter, this->nstr, this->name); return *this; } /******************************************************************************/ soap_dom_attribute_iterator soap_dom_attribute_iterator::operator++(int) { soap_dom_attribute_iterator iter(*this); ++*this; return iter; } /******************************************************************************\ * * I/O * \******************************************************************************/ #ifndef WITH_COMPAT std::ostream &operator<<(std::ostream &o, const struct soap_dom_element &e) { if (!e.soap) { struct soap soap; soap_init1(&soap, SOAP_IO_DEFAULT | SOAP_DOM_TREE); soap_serialize_xsd__anyType(&soap, &e); if (soap_begin_send(&soap) || soap_out_xsd__anyType(&soap, NULL, 0, &e, NULL) || soap_end_send(&soap)) { /* error */ } soap_end(&soap); soap_done(&soap); } else { std::ostream *os = e.soap->os; e.soap->os = &o; soap_serialize_xsd__anyType(e.soap, &e); if (soap_begin_send(e.soap) || soap_out_xsd__anyType(e.soap, NULL, 0, &e, NULL) || soap_end_send(e.soap)) { /* e.soap->error is now set and app should check */ } e.soap->os = os; } return o; } /******************************************************************************/ std::istream &operator>>(std::istream &i, struct soap_dom_element &e) { if (!e.soap) e.soap = soap_new(); std::istream *is = e.soap->is; e.soap->is = &i; if (soap_begin_recv(e.soap) || soap_in_xsd__anyType(e.soap, NULL, &e, NULL) == NULL || soap_end_recv(e.soap)) { /* e.soap->error is now set and app should check */ } e.soap->is = is; return i; } #endif #endif gsoap-2.8.28/gsoap/custom/0000755000175000017500000000000012653650144014715 5ustar ellertellertgsoap-2.8.28/gsoap/custom/duration.h0000644000175000017500000000757112653650144016725 0ustar ellertellert/* duration.h Custom serializer for xsd:duration stored in a LONG64 with millisecond (ms) precision. LONG64 is equivalent to long long int and int64_t Millisecond resolution (1/1000 sec) means 1 second = 1000. The `xsd__duration` type is a 64 bit signed integer that can represent 106751991167 days forward (positive) and backward (negative), with increments of 1 ms (1/1000 second). Durations that exceed a month are always output in days, rather than months to avoid days-per-month conversion inacurracies. Durations that are received in years and months instead of total number of days from a reference point are not well defined, since there is no accepted reference time point (it may or may not be the current time). The decoder simple assumes that there are 30 days per month. For example, conversion of "P4M" gives 120 days. Therefore, the durations "P4M" and "P120D" are assumed to be identical, which is not necessarily true depending on the reference point in time. Rescaling of the duration value by may be needed when adding the duration value to a `time_t` value, because `time_t` may or may not have a seconds resolution, depending on the platform and possible changes to `time_t`. #import this file into your gSOAP .h file To automate the wsdl2h-mapping of xsd:duration to LONG64, add this line to the typemap.dat file: xsd__duration = #import "custom/duration.h" | xsd__duration The typemap.dat file is used by wsdl2h to map types (wsdl2h option -t). When using soapcpp2 option -q or -p, you must change duration.c as follows: #include "soapH.h" -> #include "nameH.h" Compile and link your code with custom/duration.c gSOAP XML Web services tools Copyright (C) 2000-2009, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under ONE of the following licenses: GPL, the gSOAP public license, OR Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2009, Robert van Engelen, Genivia, Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ extern typedef long long xsd__duration; /* duration in ms (1/1000 sec) */ gsoap-2.8.28/gsoap/custom/struct_tm.h0000644000175000017500000001033612653650144017115 0ustar ellertellert/* struct_tm.h Custom serializer for struct tm as xsd:dateTime Because time_t is limited to dates between 1970 and 2038, struct tm should be used for wider date ranges. This custom serializer avoids storing date+time information in time_t values for this reason. #import this file into your gSOAP .h file to enable struct tm serialization and use the serializable xsd__dateTime type. struct tm { int tm_sec; // seconds (0 - 60) int tm_min; // minutes (0 - 59) int tm_hour; // hours (0 - 23) int tm_mday; // day of month (1 - 31) int tm_mon; // month of year (0 - 11) int tm_year; // year - 1900 int tm_wday; // day of week (Sunday = 0) int tm_yday; // day of year (0 - 365) int tm_isdst; // is summer time in effect? char *tm_zone; // abbreviation of timezone name }; Note that tm_wday is always set to 0 (Sunday) when receiving a xsd:dateTime value, because the struct tm content is not computed. To automate the wsdl2h-mapping of xsd:dateTime to struct tm, add this line to the typemap.dat file: xsd__dateTime = #import "custom/struct_tm.h" | xsd__dateTime The typemap.dat file is used by wsdl2h to map types (wsdl2h option -t). When using soapcpp2 option -q or -p, you must change struct_tm.c as follows: #include "soapH.h" -> #include "nameH.h" Compile and link your code with custom/struct_tm.c gSOAP XML Web services tools Copyright (C) 2000-2007, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under ONE of the following licenses: GPL, the gSOAP public license, OR Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2007, Robert van Engelen, Genivia, Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include /** externally declared ("volatila"e). Declared here for soapcpp2 to produce soap_dup_xsd__dateTime() */ extern typedef volatile struct tm { int tm_sec; ///< seconds (0 - 60) int tm_min; ///< minutes (0 - 59) int tm_hour; ///< hours (0 - 23) int tm_mday; ///< day of month (1 - 31) int tm_mon; ///< month of year (0 - 11) int tm_year; ///< year - 1900 // N/A: int tm_wday; ///< day of week (Sunday = 0) (NOT USED) // N/A: int tm_yday; ///< day of year (0 - 365) (NOT USED) int tm_isdst; ///< is summer time in effect? // N/A: char* tm_zone; ///< abbreviation of timezone (NOT USED) } xsd__dateTime; gsoap-2.8.28/gsoap/custom/int128.h0000644000175000017500000000520012653650144016110 0ustar ellertellert/* int128.h Custom serializer for __int128_t as xsd:integer (big int). #import this file into your gSOAP .h file. Add this line to typemap.dat to automate the mapping with wsdl2h: xsd__integer = #import "custom/int128.h" | xsd__integer When using soapcpp2 option -q or -p, you must change int128.c as follows: #include "soapH.h" -> #include "nameH.h" Compile and link your code with custom/int128.c gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under ONE of the following licenses: GPL, the gSOAP public license, OR Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2015, Robert van Engelen, Genivia, Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ extern class __int128_t; extern typedef __int128_t xsd__integer; gsoap-2.8.28/gsoap/custom/float128.c0000644000175000017500000001071112653650144016421 0ustar ellertellert/* float128.c Custom serializer for the __float128 quad precision float type as xsd:decimal. Compile this file and link it with your code. gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under ONE of the following licenses: GPL, the gSOAP public license, OR Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2015, Robert van Engelen, Genivia, Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ /* soapH.h generated by soapcpp2 from .h file containing #import "float128.h" */ #include "soapH.h" void soap_default_xsd__decimal(struct soap *soap, __float128 *a) { (void)soap; *a = 0.0; } void soap_serialize_xsd__decimal(struct soap *soap, const __float128 *a) { (void)soap; (void)a; } int soap_s2xsd__decimal(struct soap *soap, const char *s, __float128 *a) { if (s) { if (!*s) return soap->error = SOAP_TYPE; if (!soap_tag_cmp(s, "INF")) *a = (__float128)DBL_PINFTY; else if (!soap_tag_cmp(s, "+INF")) *a = (__float128)DBL_PINFTY; else if (!soap_tag_cmp(s, "-INF")) *a = (__float128)DBL_NINFTY; else if (!soap_tag_cmp(s, "NaN")) *a = (__float128)DBL_NAN; else { char *r; *a = strtoflt128(s, &r); if (*r) soap->error = SOAP_TYPE; } } return soap->error; } const char * soap_xsd__decimal2s(struct soap *soap, __float128 a) { char *s; if (isnanq(a)) return "NaN"; if (isinfq(a)) { if (a >= 0) return "INF"; return "-INF"; } quadmath_snprintf(soap->tmpbuf, sizeof(soap->tmpbuf), "%Qg", a); s = strchr(soap->tmpbuf, ','); /* convert decimal comma to DP */ if (s) *s = '.'; return soap->tmpbuf; } int soap_out_xsd__decimal(struct soap *soap, const char *tag, int id, const __float128 *p, const char *type) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, SOAP_TYPE_xsd__decimal), type) || soap_string_out(soap, soap_xsd__decimal2s(soap, *p), 0)) return soap->error; return soap_element_end_out(soap, tag); } __float128 * soap_in_xsd__decimal(struct soap *soap, const char *tag, __float128 *a, const char *type) { if (soap_element_begin_in(soap, tag, 0, type)) return NULL; a = (__float128*)soap_id_enter(soap, soap->id, a, SOAP_TYPE_xsd__decimal, sizeof(__float128), NULL, NULL, NULL, NULL); if (*soap->href) a = (__float128*)soap_id_forward(soap, soap->href, a, 0, SOAP_TYPE_xsd__decimal, 0, sizeof(__float128), 0, NULL, NULL); else if (a) { if (soap_s2xsd__decimal(soap, soap_value(soap), a)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return a; } gsoap-2.8.28/gsoap/custom/struct_tm_date.h0000644000175000017500000000611712653650144020114 0ustar ellertellert/* struct_tm_date.h Custom serializer for xsd:date Gregorian calendar date stored in a struct tm. Basically the same as the struct tm xsd:dateTime serializer, but without the time part, which is considered 00:00:00. Timezone offsets are taken into account to adjust the time part from 00:00:00 UTC. Note that tm_wday is always set to 0 (Sunday) when receiving a xsd:date value, because the tm content is not calculated. #import this file into your gSOAP .h file To automate the wsdl2h-mapping of xsd:date to int, add this line to the typemap.dat file: xsd__date = #import "custom/struct_tm_date.h" | xsd__date The typemap.dat file is used by wsdl2h to map types (wsdl2h option -t). When using soapcpp2 option -q or -p, you must change date.c as follows: #include "soapH.h" -> #include "nameH.h" Compile and link your code with custom/struct_tm_date.c gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under ONE of the following licenses: GPL, the gSOAP public license, OR Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2015, Robert van Engelen, Genivia, Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include extern typedef struct tm xsd__date; gsoap-2.8.28/gsoap/custom/struct_tm.c0000644000175000017500000001462512653650144017115 0ustar ellertellert/* struct_tm.c Custom serializer for struct tm as xsd:dateTime See struct_tm.h for documentation. Compile this file and link it with your code. gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under ONE of the following licenses: GPL, the gSOAP public license, OR Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2015, Robert van Engelen, Genivia, Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ /* soapH.h generated by soapcpp2 from .h file containing #import "struct_tm.h" */ #include "soapH.h" void soap_default_xsd__dateTime(struct soap *soap, struct tm *a) { (void)soap; memset((void*)a, 0, sizeof(struct tm)); } void soap_serialize_xsd__dateTime(struct soap *soap, struct tm const *a) { (void)soap; (void)a; } const char *soap_xsd__dateTime2s(struct soap *soap, const struct tm a) { strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%SZ", &a); return soap->tmpbuf; } int soap_out_xsd__dateTime(struct soap *soap, const char *tag, int id, const struct tm *a, const char *type) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_xsd__dateTime), type) || soap_string_out(soap, soap_xsd__dateTime2s(soap, *a), 0)) return soap->error; return soap_element_end_out(soap, tag); } int soap_s2xsd__dateTime(struct soap *soap, const char *s, struct tm *a) { memset((void*)a, 0, sizeof(struct tm)); if (s) { char *t; unsigned long d; d = soap_strtoul(s, &t, 10); if (*t == '-') { /* YYYY-MM-DD */ a->tm_year = (int)d; a->tm_mon = (int)soap_strtoul(t + 1, &t, 10); a->tm_mday = (int)soap_strtoul(t + 1, &t, 10); } else if (!(soap->mode & SOAP_XML_STRICT)) { /* YYYYMMDD */ a->tm_year = (int)(d / 10000); a->tm_mon = (int)(d / 100 % 100); a->tm_mday = (int)(d % 100); } else return soap->error = SOAP_TYPE; if (*t == 'T' || ((*t == 't' || *t == ' ') && !(soap->mode & SOAP_XML_STRICT))) { d = soap_strtoul(t + 1, &t, 10); if (*t == ':') { /* Thh:mm:ss */ a->tm_hour = (int)d; a->tm_min = (int)soap_strtoul(t + 1, &t, 10); a->tm_sec = (int)soap_strtoul(t + 1, &t, 10); } else if (!(soap->mode & SOAP_XML_STRICT)) { /* Thhmmss */ a->tm_hour = (int)(d / 10000); a->tm_min = (int)(d / 100 % 100); a->tm_sec = (int)(d % 100); } else return soap->error = SOAP_TYPE; } if (a->tm_year == 1) a->tm_year = 70; else a->tm_year -= 1900; a->tm_mon--; if (*t == '.') { for (t++; *t; t++) if (*t < '0' || *t > '9') break; } if (*t == ' ' && !(soap->mode & SOAP_XML_STRICT)) t++; if (*t) { #ifndef WITH_NOZONE if (*t == '+' || *t == '-') { int h, m; m = (int)soap_strtol(t, &t, 10); if (*t == ':') { /* +hh:mm */ h = m; m = (int)soap_strtol(t + 1, &t, 10); if (h < 0) m = -m; } else if (!(soap->mode & SOAP_XML_STRICT)) { /* +hhmm */ h = m / 100; m = m % 100; } else { /* +hh */ h = m; m = 0; } if (*t) return soap->error = SOAP_TYPE; a->tm_min -= m; a->tm_hour -= h; /* put hour and min in range */ a->tm_hour += a->tm_min / 60; a->tm_min %= 60; if (a->tm_min < 0) { a->tm_min += 60; a->tm_hour--; } a->tm_mday += a->tm_hour / 24; a->tm_hour %= 24; if (a->tm_hour < 0) { a->tm_hour += 24; a->tm_mday--; } /* note: day of the month may be out of range, timegm() handles it */ } else if (*t != 'Z') return soap->error = SOAP_TYPE; #endif } else /* no UTC or timezone, so assume we got a localtime */ a->tm_isdst = -1; } return soap->error; } struct tm *soap_in_xsd__dateTime(struct soap *soap, const char *tag, struct tm *a, const char *type) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":dateTime")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } a = (struct tm*)soap_id_enter(soap, soap->id, a, SOAP_TYPE_xsd__dateTime, sizeof(struct tm), NULL, NULL, NULL, NULL); if (*soap->href) a = (struct tm*)soap_id_forward(soap, soap->href, a, 0, SOAP_TYPE_xsd__dateTime, 0, sizeof(struct tm), 0, NULL, NULL); else if (a) { if (soap_s2xsd__dateTime(soap, soap_value(soap), a)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return a; } gsoap-2.8.28/gsoap/custom/float128.h0000644000175000017500000000530012653650144016424 0ustar ellertellert/* float128.h Custom serializer for the __float128 quad precision float type as xsd:decimal. #import this file into your gSOAP .h file. Add this line to typemap.dat to automate the mapping with wsdl2h: xsd__decimal = #import "custom/float128.h" | xsd__decimal When using soapcpp2 option -q or -p, you must change float128.c as follows: #include "soapH.h" -> #include "nameH.h" Compile and link your code with custom/float128.c gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under ONE of the following licenses: GPL, the gSOAP public license, OR Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2015, Robert van Engelen, Genivia, Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include extern class __float128; extern typedef __float128 xsd__decimal; gsoap-2.8.28/gsoap/custom/chrono_time_point.h0000644000175000017500000000563612653650144020617 0ustar ellertellert/* chrono_time_point.h Custom serializer for std::chrono::system_clock::time_point as xsd:dateTime Requires C++11 or higher (compile with -std=c++11). #import this file into your gSOAP .h file To automate the wsdl2h-mapping of xsd:dateTime to std::chrono::system_clock::time_point, add this line to the typemap.dat file: xsd__dateTime = #import "custom/chrono_time_point.h" | xsd__dateTime The typemap.dat file is used by wsdl2h to map types (wsdl2h option -t). When using soapcpp2 option -q or -p, you must change chrono_time_point.cpp as follows: #include "soapH.h" -> #include "nameH.h" Compile and link your code with custom/chrono_time_point.cpp gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under ONE of the following licenses: GPL, the gSOAP public license, OR Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2015, Robert van Engelen, Genivia, Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include extern typedef class std::chrono::system_clock::time_point xsd__dateTime; gsoap-2.8.28/gsoap/custom/long_time.c0000644000175000017500000001350512653650144017042 0ustar ellertellert/* long_time.c Custom serializer for xsd:time stored in an ULONG64 with usec (microsecond) precision See long_time.h for documentation. Compile this file and link it with your code. gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under ONE of the following licenses: GPL, the gSOAP public license, OR Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2015, Robert van Engelen, Genivia, Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ /* soapH.h generated by soapcpp2 from .h file containing #import "time.h" */ #include "soapH.h" void soap_default_xsd__time(struct soap *soap, ULONG64 *a) { (void)soap; /* appease -Wall -Werror */ *a = 0; } const char *soap_xsd__time2s(struct soap *soap, ULONG64 a) { unsigned int H, M, S, f; f = a % 1000000; a /= 1000000; S = a % 60; a /= 60; M = a % 60; a /= 60; H = a % 24; if (f) (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 17), "%02u:%02u:%02u.%06uZ", H, M, S, f); else (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 10), "%02u:%02u:%02uZ", H, M, S); return soap->tmpbuf; } int soap_out_xsd__time(struct soap *soap, const char *tag, int id, const ULONG64 *a, const char *type) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_xsd__time), type) || soap_string_out(soap, soap_xsd__time2s(soap, *a), 0)) return soap->error; return soap_element_end_out(soap, tag); } int soap_s2xsd__time(struct soap *soap, const char *s, ULONG64 *a) { char *r; ULONG64 H = 0, M = 0, S = 0; float f = 0; *a = 0; if (s) { H = soap_strtoul(s, &r, 10); if (!r || *r != ':') return soap->error = SOAP_TYPE; s = r + 1; M = soap_strtoul(s, &r, 10); if (!r || *r != ':') return soap->error = SOAP_TYPE; s = r + 1; S = soap_strtoul(s, &r, 10); if (!r) return soap->error = SOAP_TYPE; s = r; if (*s == '.') { #if defined(WITH_C_LOCALE) && defined(HAVE_STRTOD_L) # ifdef WIN32 f = (float)_strtod_l(s, NULL, SOAP_LOCALE(soap)); # else f = (float)strtod_l(s, NULL, SOAP_LOCALE(soap)); # endif #elif defined(HAVE_STRTOD) f = (float)strtod(s, NULL); #elif defined(WITH_C_LOCALE) && defined(HAVE_STRTOF_L) f = strtof_l((char*)s, NULL, SOAP_LOCALE(soap)); #elif defined(HAVE_STRTOF) f = strtof((char*)s, NULL); #endif for (s++; *s; s++) if (*s < '0' || *s > '9') break; } if (*s == ' ' && !(soap->mode & SOAP_XML_STRICT)) s++; if (*s == 'Z' || *s == 'z') { s++; } else if (*s == '+' || *s == '-') { int h = 0, m = 0; h = soap_strtol(s, &r, 10); if (!r || *r != ':') return soap->error = SOAP_TYPE; s = r + 1; m = soap_strtol(s, &r, 10); if (!r) return soap->error = SOAP_TYPE; s = r; H += h; if (h < 0) { M += 60 - m; if (M >= 60) M -= 60; else H--; } else { M += m; if (M >= 60) { H++; M -= 60; } } if (H >= 24) return soap->error = SOAP_TYPE; } if (*s) return soap->error = SOAP_TYPE; /* convert H:M:S.f to unsigned long long int microseconds */ *a = ((((((H * 60) + M) * 60) + S) * 1000000) + (ULONG64)(f * 1000000.0 + 0.5)); } return soap->error; } ULONG64 *soap_in_xsd__time(struct soap *soap, const char *tag, ULONG64 *a, const char *type) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":time")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } a = (ULONG64*)soap_id_enter(soap, soap->id, a, SOAP_TYPE_xsd__time, sizeof(ULONG64), NULL, NULL, NULL, NULL); if (*soap->href) a = (ULONG64*)soap_id_forward(soap, soap->href, a, 0, SOAP_TYPE_xsd__time, 0, sizeof(ULONG64), 0, NULL, NULL); else if (a) { if (soap_s2xsd__time(soap, soap_value(soap), a)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return a; } gsoap-2.8.28/gsoap/custom/long_double.h0000644000175000017500000000567012653650144017367 0ustar ellertellert/* long_double.h Custom serializer for the long double (extended double) type as xsd:decimal. #import this file into your gSOAP .h file. Add this line to typemap.dat to automate the mapping with wsdl2h: xsd__decimal = #import "custom/long_double.h" | long double When using soapcpp2 option -q or -p, you must change long_double.c as follows: #include "soapH.h" -> #include "nameH.h" Compile and link your code with custom/long_double.c gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under ONE of the following licenses: GPL, the gSOAP public license, OR Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2015, Robert van Engelen, Genivia, Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ extern int soap_s2decimal(struct soap *soap, const char *s, long double *p); extern const char *soap_decimal2s(struct soap *soap, long double n); extern int soap_outdecimal(struct soap*, const char*, int, const long double*, const char*, int); extern long double *soap_indecimal(struct soap*, const char*, long double*, const char*, int); gsoap-2.8.28/gsoap/custom/struct_tm_date.c0000644000175000017500000001363612653650144020113 0ustar ellertellert/* struct_tm_date.c Custom serializer for xsd:date Gregorian calendar date stored in a struct tm. Basically the same as the struct tm xsd:dateTime serializer, but without the time part, which is considered 00:00:00. See struct_tm_date.h for documentation. Compile this file and link it with your code. gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under ONE of the following licenses: GPL, the gSOAP public license, OR Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2015, Robert van Engelen, Genivia, Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ /* soapH.h generated by soapcpp2 from .h file containing #import "date.h" */ #include "soapH.h" void soap_default_xsd__date(struct soap *soap, struct tm *a) { (void)soap; /* appease -Wall -Werror */ memset((void*)a, 0, sizeof(struct tm)); } void soap_serialize_xsd__date(struct soap *soap, struct tm const *a) { (void)soap; (void)a; } const char *soap_xsd__date2s(struct soap *soap, struct tm a) { strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dZ", &a); return soap->tmpbuf; } int soap_out_xsd__date(struct soap *soap, const char *tag, int id, const struct tm *a, const char *type) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_xsd__date), type) || soap_string_out(soap, soap_xsd__date2s(soap, *a), 0)) return soap->error; return soap_element_end_out(soap, tag); } int soap_s2xsd__date(struct soap *soap, const char *s, struct tm *a) { memset((void*)a, 0, sizeof(struct tm)); if (s) { char *t; unsigned long d; d = soap_strtoul(s, &t, 10); if (*t == '-') { /* YYYY-MM-DD */ a->tm_year = (int)d; a->tm_mon = (int)soap_strtoul(t + 1, &t, 10); a->tm_mday = (int)soap_strtoul(t + 1, &t, 10); } else if (!(soap->mode & SOAP_XML_STRICT)) { /* YYYYMMDD */ a->tm_year = (int)(d / 10000); a->tm_mon = (int)(d / 100 % 100); a->tm_mday = (int)(d % 100); } else return soap->error = SOAP_TYPE; if (a->tm_year == 1) a->tm_year = 70; else a->tm_year -= 1900; a->tm_mon--; if (*t == ' ' && !(soap->mode & SOAP_XML_STRICT)) t++; if (*t) { #ifndef WITH_NOZONE if (*t == '+' || *t == '-') { int h, m; m = (int)soap_strtol(t, &t, 10); if (*t == ':') { /* +hh:mm */ h = m; m = (int)soap_strtol(t + 1, &t, 10); if (h < 0) m = -m; } else if (!(soap->mode & SOAP_XML_STRICT)) { /* +hhmm */ h = m / 100; m = m % 100; } else { /* +hh */ h = m; m = 0; } if (*t) return soap->error = SOAP_TYPE; a->tm_min -= m; a->tm_hour -= h; /* put hour and min in range */ a->tm_hour += a->tm_min / 60; a->tm_min %= 60; if (a->tm_min < 0) { a->tm_min += 60; a->tm_hour--; } a->tm_mday += a->tm_hour / 24; a->tm_hour %= 24; if (a->tm_hour < 0) { a->tm_hour += 24; a->tm_mday--; } /* note: day of the month may be out of range, timegm() handles it */ } else if (*t != 'Z') return soap->error = SOAP_TYPE; #endif } else /* no UTC or timezone, so assume we got a localtime */ a->tm_isdst = -1; } return soap->error; } struct tm *soap_in_xsd__date(struct soap *soap, const char *tag, struct tm *a, const char *type) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":date")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } a = (struct tm*)soap_id_enter(soap, soap->id, a, SOAP_TYPE_xsd__date, sizeof(struct tm), NULL, NULL, NULL, NULL); if (*soap->href) a = (struct tm*)soap_id_forward(soap, soap->href, a, 0, SOAP_TYPE_xsd__date, 0, sizeof(struct tm), 0, NULL, NULL); else if (a) { if (soap_s2xsd__date(soap, soap_value(soap), a)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return a; } gsoap-2.8.28/gsoap/custom/long_time.h0000644000175000017500000000645512653650144017055 0ustar ellertellert/* long_time.h Custom serializer for xsd:time stored in an ULONG64 with usec (microsecond) precision - can represent 00:00:00 to 23:59:59.999999 (= 86399999999) UTC. - inbound value with timezone offset is converted to UTC. - ULONG64 is equivalent to unsigned long long int and uint64_t. - microsecond resolution (1/1000000 sec) means 1 second = 1000000. To obtain the current time and set the UTC time value accordingly: #include struct timeval tv; xsd__time t; // a ULONG64 custom serialized as xsd:time in UTC gettimeofday(&tv, NULL); t = tv.tv_usec + (tv.tv_sec % (24*60*60)) * 1000000; #import this file into your gSOAP .h file To automate the wsdl2h-mapping of xsd:time to ULONG64, add this line to the typemap.dat file: xsd__time = #import "custom/long_time.h" | xsd__time The typemap.dat file is used by wsdl2h to map types (wsdl2h option -t). When using soapcpp2 option -q or -p, you must change time.c as follows: #include "soapH.h" -> #include "nameH.h" Compile and link your code with custom/long_time.c gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under ONE of the following licenses: GPL, the gSOAP public license, OR Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2015, Robert van Engelen, Genivia, Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ extern typedef unsigned long long xsd__time; /* HH:MM:SS.uuuuuu time in usec (1/1000000 sec) */ gsoap-2.8.28/gsoap/custom/chrono_duration.cpp0000644000175000017500000002114212653650144020616 0ustar ellertellert/* chrono_duration.cpp See chrono_duration.h for documentation. Compile this file and link it with your code. gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under ONE of the following licenses: GPL, the gSOAP public license, OR Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2015, Robert van Engelen, Genivia, Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ /* When using soapcpp2 option -q or -p, change "soapH.h" in the line below. */ /* soapH.h generated by soapcpp2 from .h file containing #import "chrono_duration.h" */ #include "soapH.h" static void *instantiate_xsd__duration(struct soap*, int, const char*, const char*, size_t*); static int delete_xsd__duration(struct soap_clist*); static void copy_xsd__duration(struct soap*, int, int, void*, size_t, const void*, void**); void soap_default_xsd__duration(struct soap *soap, std::chrono::nanoseconds *a) { (void)soap; /* appease -Wall -Werror */ *a = a->zero(); } void soap_serialize_xsd__duration(struct soap *soap, const std::chrono::nanoseconds *a) { (void)soap; (void)a; /* appease -Wall -Werror */ } const char *soap_xsd__duration2s(struct soap *soap, std::chrono::nanoseconds a) { LONG64 n = a.count(); int k, h, m, s, f; if (n < 0) { soap_strcpy(soap->tmpbuf, sizeof(soap->tmpbuf), "-P"); k = 2; n = -n; } else { soap_strcpy(soap->tmpbuf, sizeof(soap->tmpbuf), "P"); k = 1; } f = n % 1000000000LL; n /= 1000000000LL; s = n % 60; n /= 60; m = n % 60; n /= 60; h = n % 24; n /= 24; if (n) (SOAP_SNPRINTF(soap->tmpbuf + k, sizeof(soap->tmpbuf) - k, 21), SOAP_LONG_FORMAT "D", n); if (h || m || s || f) { if (n) k = strlen(soap->tmpbuf); if (f) (SOAP_SNPRINTF(soap->tmpbuf + k, sizeof(soap->tmpbuf) - k, 14), "T%02dH%02dM%02d.%09dS", h, m, s, f); else (SOAP_SNPRINTF(soap->tmpbuf + k, sizeof(soap->tmpbuf) - k, 10), "T%02dH%02dM%02dS", h, m, s); } else if (!n) soap_strcpy(soap->tmpbuf + k, sizeof(soap->tmpbuf) - k, "T0S"); return soap->tmpbuf; } int soap_out_xsd__duration(struct soap *soap, const char *tag, int id, const std::chrono::nanoseconds *a, const char *type) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_xsd__duration), type) || soap_string_out(soap, soap_xsd__duration2s(soap, *a), 0)) return soap->error; return soap_element_end_out(soap, tag); } int soap_s2xsd__duration(struct soap *soap, const char *s, std::chrono::nanoseconds *a) { LONG64 sign = 1, Y = 0, M = 0, D = 0, H = 0, N = 0, S = 0; double f = 0; *a = a->zero(); if (s) { if (*s == '-') { sign = -1; s++; } if (*s != 'P' && *s != 'p') return soap->error = SOAP_TYPE; s++; /* date part */ while (s && *s) { char *r = NULL; LONG64 n; if (*s == 'T' || *s == 't') { s++; break; } n = soap_strtol(s, &r, 10); if (!r) return soap->error = SOAP_TYPE; s = r; switch (*s) { case 'Y': case 'y': Y = n; break; case 'M': case 'm': M = n; break; case 'D': case 'd': D = n; break; default: return soap->error = SOAP_TYPE; } s++; } /* time part */ while (s && *s) { char *r = NULL; LONG64 n; n = soap_strtol(s, &r, 10); if (!r) return soap->error = SOAP_TYPE; s = r; switch (*s) { case 'H': case 'h': H = n; break; case 'M': case 'm': N = n; break; case '.': S = n; #if defined(WITH_C_LOCALE) && defined(HAVE_STRTOD_L) # ifdef WIN32 f = _strtod_l(s, NULL, SOAP_LOCALE(soap)); # else f = strtod_l(s, NULL, SOAP_LOCALE(soap)); # endif #elif defined(HAVE_STRTOD) f = strtod(s, NULL); #elif defined(WITH_C_LOCALE) && defined(HAVE_STRTOF_L) f = (double)strtof_l((char*)s, NULL, SOAP_LOCALE(soap)); #elif defined(HAVE_STRTOF) f = (double)strtof((char*)s, NULL); #endif s = NULL; continue; case 'S': case 's': S = n; break; default: return soap->error = SOAP_TYPE; } s++; } /* convert Y-M-D H:N:S.f to std::chrono::nanoseconds */ std::chrono::hours hours(sign * ((((((Y * 12) + M) * 30) + D) * 24) + H)); std::chrono::seconds seconds(sign * ((N * 60) + S)); std::chrono::nanoseconds nanos(sign * (LONG64)(1e9 * f + 0.5)); *a = hours + seconds + nanos; } return soap->error; } std::chrono::nanoseconds *soap_in_xsd__duration(struct soap *soap, const char *tag, std::chrono::nanoseconds *a, const char *type) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":duration")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } a = (std::chrono::nanoseconds*)soap_id_enter(soap, soap->id, a, SOAP_TYPE_xsd__duration, sizeof(std::chrono::nanoseconds), NULL, NULL, instantiate_xsd__duration, NULL); if (*soap->href) a = (std::chrono::nanoseconds*)soap_id_forward(soap, soap->href, a, 0, SOAP_TYPE_xsd__duration, 0, sizeof(std::chrono::nanoseconds), 0, copy_xsd__duration, NULL); else if (a) { if (soap_s2xsd__duration(soap, soap_value(soap), a)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return a; } static void *instantiate_xsd__duration(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_instantiate_xsd__duration(%d, %s, %s)\n", n, type?type:"", arrayType?arrayType:"")); struct soap_clist *cp = soap_link(soap, NULL, SOAP_TYPE_xsd__duration, n, delete_xsd__duration); (void)type; (void)arrayType; /* appease -Wall -Werror */ if (!cp) return NULL; if (n < 0) { cp->ptr = SOAP_NEW(std::chrono::nanoseconds); if (size) *size = sizeof(std::chrono::nanoseconds); } else { cp->ptr = SOAP_NEW_ARRAY(std::chrono::nanoseconds, n); if (size) *size = n * sizeof(std::chrono::nanoseconds); } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Instantiated location=%p\n", cp->ptr)); if (!cp->ptr) soap->error = SOAP_EOM; return (std::chrono::nanoseconds*)cp->ptr; } static int delete_xsd__duration(struct soap_clist *p) { if (p->type == SOAP_TYPE_xsd__duration) { if (p->size < 0) SOAP_DELETE(static_cast(p->ptr)); else SOAP_DELETE_ARRAY(static_cast(p->ptr)); return SOAP_OK; } return SOAP_ERR; } static void copy_xsd__duration(struct soap *soap, int st, int tt, void *p, size_t index, const void *q, void **x) { (void)soap; (void)st; (void)tt; (void)index; (void)x; /* appease -Wall -Werror */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copying std::chrono::nanoseconds %p -> %p\n", q, p)); *(std::chrono::nanoseconds*)p = *(std::chrono::nanoseconds*)q; } gsoap-2.8.28/gsoap/custom/README.txt0000644000175000017500000000701012653650144016411 0ustar ellertellert OVERVIEW -------- This directory contains custom serializers for common data types. CONTENTS -------- Custom serializers replace the soapcpp2-generated serialization routines. See the notes in the source files on specific usage. The following serializers are available: long_double.* Serializes long double (extended double) type as xsd:decimal float128.* Serializes __float128 type as xsd:decimal int128.* Serializes __int128_t as xsd:integer struct_tm.* Serializes struct tm as xsd:dateTime struct_timeval.* Serializes struct timeval as xsd:dateTime duration.* Serializes LONG64 milliseconds as xsd:duration struct_tm_date.* Serializes struct tm as xsd:date long_time.* Serializes LONG64 milliseconds as xsd:time chrono_duration.* Serializes C++11 std::chrono::nanoseconds as xsd:duration chrono_time_point.* Serializes C++11 std::chrono::system_clock as xsd:dateTime The xsd:dateTime parsers are more permissive to accept alternative ISO8601 formats. To restrict xsd:dateTime formats to the XSD standard, use the SOAP_XML_STRICT flag. C VERSUS C++ ------------ Only .c files are included for custom serializers that work both in C and in C++. Copy the .c files that you need to .cpp for compiling and linking in C++. THE 2038 PROBLEM ---------------- Because time_t is limited to dates between 1970 and 2038 (on 32 bit systems), struct tm should be used for wider date ranges. USAGE ----- To use a custom serializer add an import statement to your gSOAP header file, for example: #import "struct_tm.h" This replaces time_t for xsd__dateTime by struct tm to support a wider date range. You can use xsd__dateTime as XML elements and attributes: struct ns__example { @xsd__dateTime start; // attribute xsd__dateTime end; // element }; Then compile with soapcpp2 and cc and link struct_tm.c When using soapcpp2 option -q, -q, or -p, you must change struct_tm.c (and other custom serializer .c/.cpp files that you are using) by changing #include "soapH.h" as follows: #include "soapH.h" -> #include "nameH.h" HOW TO MODIFY TYPEMAP.DAT TO AUTOMATE THE MAPPING TO A CUSTOM TYPE WITH WSDL2H ------------------------------------------------------------------------------ The mapping is specified in typemap.dat as follows: xsd__dateTime = #import "custom/struct_tm.h" which maps xsd:dateTime to struct tm when wsdl2h is applied to a WSDL. xsd__decimal = #import "custom/long_double.h" | long double this maps xsd:decimal to long double (the column after | specifies usage). IMPLEMENTING YOUR OWN CUSTOM SERIALIZERS ---------------------------------------- To build your own custom serializers: a custom serializer is typically declared in the imported file as follows extern typedef Type X; To implement custom serializers you should implement the following routines: void soap_default_X(struct soap*, X*); sets default values for X void soap_serialize_X(struct soap*, const X*); analyzes X for id-ref serialization (maybe empty) int soap_out_X(struct soap*, const char *tag, int id, const X*, const char *type); emits X in XML as (type is optional) X *soap_in_X(struct soap*, const char *tag, X*, const char *type); parses X from XML as To support XML attribute serialization, you should also define: int soap_s2X(struct soap*, const char *value, X*); converts string to X and returns SOAP_OK const char *soap_X2s(struct soap*, X); converts X to string (or NULL when error) gsoap-2.8.28/gsoap/custom/chrono_time_point.cpp0000644000175000017500000001443312653650144021145 0ustar ellertellert/* chrono_time_point.cpp Custom serializer for std::chrono::system_clock::time_point as xsd:dateTime See chrono_time_point.h for documentation. Compile this file and link it with your code. gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under ONE of the following licenses: GPL, the gSOAP public license, OR Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2015, Robert van Engelen, Genivia, Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ /* When using soapcpp2 option -q or -p, change "soapH.h" in the line below. */ /* soapH.h generated by soapcpp2 from .h file containing #import "chrono_time_point.h" */ #include "soapH.h" static void *instantiate_xsd__dateTime(struct soap*, int, const char*, const char*, size_t*); static int delete_xsd__dateTime(struct soap_clist*); static void copy_xsd__dateTime(struct soap*, int, int, void*, size_t, const void*, void**); void soap_default_xsd__dateTime(struct soap *soap, std::chrono::system_clock::time_point *a) { (void)soap; (void)a; } void soap_serialize_xsd__dateTime(struct soap *soap, std::chrono::system_clock::time_point const *a) { (void)soap; (void)a; } const char *soap_xsd__dateTime2s(struct soap *soap, const std::chrono::system_clock::time_point a) { time_t t = std::chrono::system_clock::to_time_t(a); return soap_dateTime2s(soap, t); } int soap_out_xsd__dateTime(struct soap *soap, const char *tag, int id, const std::chrono::system_clock::time_point *a, const char *type) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_xsd__dateTime), type) || soap_string_out(soap, soap_xsd__dateTime2s(soap, *a), 0)) return soap->error; return soap_element_end_out(soap, tag); } int soap_s2xsd__dateTime(struct soap *soap, const char *s, std::chrono::system_clock::time_point *a) { time_t t; if (!soap_s2dateTime(soap, s, &t)) *a = std::chrono::system_clock::from_time_t(t); return soap->error; } std::chrono::system_clock::time_point *soap_in_xsd__dateTime(struct soap *soap, const char *tag, std::chrono::system_clock::time_point *a, const char *type) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":dateTime")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } a = (std::chrono::system_clock::time_point*)soap_id_enter(soap, soap->id, a, SOAP_TYPE_xsd__dateTime, sizeof(std::chrono::system_clock::time_point), NULL, NULL, instantiate_xsd__dateTime, NULL); if (*soap->href) a = (std::chrono::system_clock::time_point*)soap_id_forward(soap, soap->href, a, 0, SOAP_TYPE_xsd__dateTime, 0, sizeof(std::chrono::system_clock::time_point), 0, copy_xsd__dateTime, NULL); else if (a) { if (soap_s2xsd__dateTime(soap, soap_value(soap), a)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return a; } static void *instantiate_xsd__dateTime(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_instantiate_xsd__dateTime(%d, %s, %s)\n", n, type?type:"", arrayType?arrayType:"")); struct soap_clist *cp = soap_link(soap, NULL, SOAP_TYPE_xsd__dateTime, n, delete_xsd__dateTime); (void)type; (void)arrayType; /* appease -Wall -Werror */ if (!cp) return NULL; if (n < 0) { cp->ptr = SOAP_NEW(std::chrono::nanoseconds); if (size) *size = sizeof(std::chrono::nanoseconds); } else { cp->ptr = SOAP_NEW_ARRAY(std::chrono::nanoseconds, n); if (size) *size = n * sizeof(std::chrono::nanoseconds); } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Instantiated location=%p\n", cp->ptr)); if (!cp->ptr) soap->error = SOAP_EOM; return (std::chrono::nanoseconds*)cp->ptr; } static int delete_xsd__dateTime(struct soap_clist *p) { if (p->type == SOAP_TYPE_xsd__dateTime) { if (p->size < 0) SOAP_DELETE(static_cast(p->ptr)); else SOAP_DELETE_ARRAY(static_cast(p->ptr)); return SOAP_OK; } return SOAP_ERR; } static void copy_xsd__dateTime(struct soap *soap, int st, int tt, void *p, size_t index, const void *q, void **x) { (void)soap; (void)st; (void)tt; (void)index; (void)x; /* appease -Wall -Werror */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copying std::chrono::system_clock::time_point %p -> %p\n", q, p)); *(std::chrono::nanoseconds*)p = *(std::chrono::nanoseconds*)q; } gsoap-2.8.28/gsoap/custom/int128.c0000644000175000017500000001333412653650144016112 0ustar ellertellert/* int128.c Custom serializer for __int128_t_t as xsd:integer (big int). Compile this file and link it with your code. gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under ONE of the following licenses: GPL, the gSOAP public license, OR Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2015, Robert van Engelen, Genivia, Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ /* soapH.h generated by soapcpp2 from .h file containing #import "int128.h" */ #include "soapH.h" void soap_default_xsd__integer(struct soap *soap, __int128_t *a) { (void)soap; *a = 0; } void soap_serialize_xsd__integer(struct soap *soap, const __int128_t *a) { (void)soap; (void)a; } int soap_s2xsd__integer(struct soap *soap, const char *s, __int128_t *a) { if (s) { if (!*s) return soap->error = SOAP_TYPE; else { __int128_t bigint = 0; /* INT128_MIN = -170141183460469231731687303715884105728 */ __int128_t min128 = -(((__int128_t)UINT64_MAX + 1) * 0x7FFFFFFFFFFFFFFFULL + 0xFFFFFFFFFFFFFFFFULL) - 1; /* INT128_MAX/10 = 17014118346046923173168730371588410572 */ __int128_t max128over10 = ((__int128_t)UINT64_MAX + 1) * 0x0CCCCCCCCCCCCCCCULL + 0xCCCCCCCCCCCCCCCCULL; short len = 0, neg = 0; if (*s == '-') { neg = 1; s++; } else if (*s == '+') s++; while (isdigit(*s) && (len++ < 38 || bigint < max128over10 || (bigint == max128over10 && *s <= '7'))) bigint = 10*bigint + (*s++ - '0'); if (neg && len == 39 && bigint == max128over10 && *s == '8' && !*++s) *a = min128; else if (*s) soap->error = SOAP_TYPE; else if (neg) *a = -bigint; else *a = bigint; } } return soap->error; } const char * soap_xsd__integer2s(struct soap *soap, __int128_t a) { char *s = soap->tmpbuf; /* INT128_MIN = -170141183460469231731687303715884105728 */ __int128_t min128 = -(((__int128_t)UINT64_MAX + 1) * 0x7FFFFFFFFFFFFFFFULL + 0xFFFFFFFFFFFFFFFFULL) - 1; if (a < 0) { if (a == min128) return "-170141183460469231731687303715884105728"; *s++ = '-'; a = -a; } if (a > UINT64_MAX) { __int128_t l = a / 10000000000000000000ULL; /* leading digits */ uint64_t t = a % 10000000000000000000ULL; /* trailing 19 digits */ if (l > UINT64_MAX) { uint64_t ll = l / 10000000000000000000ULL; uint64_t tl = l % 10000000000000000000ULL; (SOAP_SNPRINTF(s, (s - soap->tmpbuf) + sizeof(soap->tmpbuf), 20), "%" PRIu64, ll); s += strlen(s); (SOAP_SNPRINTF(s, (s - soap->tmpbuf) + sizeof(soap->tmpbuf), 20), "%0.19" PRIu64, tl); } else { (SOAP_SNPRINTF(s, (s - soap->tmpbuf) + sizeof(soap->tmpbuf), 20), "%" PRIu64, (uint64_t)l); } s += strlen(s); (SOAP_SNPRINTF(s, (s - soap->tmpbuf) + sizeof(soap->tmpbuf), 20), "%0.19" PRIu64, t); } else { (SOAP_SNPRINTF(s, sizeof(soap->tmpbuf) - 1, 20), "%" PRIu64, (uint64_t)a); } return soap->tmpbuf; } int soap_out_xsd__integer(struct soap *soap, const char *tag, int id, const __int128_t *p, const char *type) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, SOAP_TYPE_xsd__integer), type) || soap_string_out(soap, soap_xsd__integer2s(soap, *p), 0)) return soap->error; return soap_element_end_out(soap, tag); } __int128_t * soap_in_xsd__integer(struct soap *soap, const char *tag, __int128_t *a, const char *type) { if (soap_element_begin_in(soap, tag, 0, type)) return NULL; a = (__int128_t*)soap_id_enter(soap, soap->id, a, SOAP_TYPE_xsd__integer, sizeof(__int128_t), NULL, NULL, NULL, NULL); if (*soap->href) a = (__int128_t*)soap_id_forward(soap, soap->href, a, 0, SOAP_TYPE_xsd__integer, 0, sizeof(__int128_t), 0, NULL, NULL); else if (a) { if (soap_s2xsd__integer(soap, soap_value(soap), a)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return a; } gsoap-2.8.28/gsoap/custom/struct_timeval.c0000644000175000017500000001621612653650144020134 0ustar ellertellert/* struct_timeval.c Custom serializer for struct timeval as xsd:dateTime See struct_timeval.h for documentation. Compile this file and link it with your code. gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under ONE of the following licenses: GPL, the gSOAP public license, OR Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2015, Robert van Engelen, Genivia, Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ /* soapH.h generated by soapcpp2 from .h file containing #import "struct_timeval.h" */ #include "soapH.h" void soap_default_xsd__dateTime(struct soap *soap, struct timeval *a) { (void)soap; memset((void*)a, 0, sizeof(struct timeval)); } void soap_serialize_xsd__dateTime(struct soap *soap, struct timeval const *a) { (void)soap; (void)a; } const char *soap_xsd__dateTime2s(struct soap *soap, const struct timeval a) { size_t n; soap_dateTime2s(soap, a.tv_sec); /* assuming result is in tmpbuf! */ n = strlen(soap->tmpbuf); if (soap->tmpbuf[n-1] == 'Z') n--; (SOAP_SNPRINTF(soap->tmpbuf + n, sizeof(soap->tmpbuf) - n, 10), ".%.6dZ", a.tv_usec); return soap->tmpbuf; } int soap_out_xsd__dateTime(struct soap *soap, const char *tag, int id, const struct timeval *a, const char *type) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_xsd__dateTime), type) || soap_string_out(soap, soap_xsd__dateTime2s(soap, *a), 0)) return soap->error; return soap_element_end_out(soap, tag); } int soap_s2xsd__dateTime(struct soap *soap, const char *s, struct timeval *a) { memset((void*)a, 0, sizeof(struct timeval)); if (s) { char *t; unsigned long d; struct tm T; memset((void*)&T, 0, sizeof(T)); d = soap_strtoul(s, &t, 10); if (*t == '-') { /* YYYY-MM-DD */ T.tm_year = (int)d; T.tm_mon = (int)soap_strtoul(t + 1, &t, 10); T.tm_mday = (int)soap_strtoul(t + 1, &t, 10); } else if (!(soap->mode & SOAP_XML_STRICT)) { /* YYYYMMDD */ T.tm_year = (int)(d / 10000); T.tm_mon = (int)(d / 100 % 100); T.tm_mday = (int)(d % 100); } else return soap->error = SOAP_TYPE; if (*t == 'T' || ((*t == 't' || *t == ' ') && !(soap->mode & SOAP_XML_STRICT))) { d = soap_strtoul(t + 1, &t, 10); if (*t == ':') { /* Thh:mm:ss */ T.tm_hour = (int)d; T.tm_min = (int)soap_strtoul(t + 1, &t, 10); T.tm_sec = (int)soap_strtoul(t + 1, &t, 10); } else if (!(soap->mode & SOAP_XML_STRICT)) { /* Thhmmss */ T.tm_hour = (int)(d / 10000); T.tm_min = (int)(d / 100 % 100); T.tm_sec = (int)(d % 100); } else return soap->error = SOAP_TYPE; } if (T.tm_year == 1) T.tm_year = 70; else T.tm_year -= 1900; T.tm_mon--; a->tv_usec = 0; if (*t == '.') { float f; #if defined(WITH_C_LOCALE) && defined(HAVE_STRTOD_L) # ifdef WIN32 f = (float)_strtod_l(t, NULL, SOAP_LOCALE(soap)); # else f = (float)strtod_l(t, NULL, SOAP_LOCALE(soap)); # endif #elif defined(HAVE_STRTOD) f = (float)strtod(t, NULL); #elif defined(WITH_C_LOCALE) && defined(HAVE_STRTOF_L) f = strtof_l((char*)t, NULL, SOAP_LOCALE(soap)); #elif defined(HAVE_STRTOF) f = strtof((char*)t, NULL); #endif a->tv_usec = (long)(1e6 * f + 0.5); for (t++; *t; t++) if (*t < '0' || *t > '9') break; } if (*t == ' ' && !(soap->mode & SOAP_XML_STRICT)) t++; if (*t) { #ifndef WITH_NOZONE if (*t == '+' || *t == '-') { int h, m; m = (int)soap_strtol(t, &t, 10); if (*t == ':') { /* +hh:mm */ h = m; m = (int)soap_strtol(t + 1, &t, 10); if (h < 0) m = -m; } else if (!(soap->mode & SOAP_XML_STRICT)) { /* +hhmm */ h = m / 100; m = m % 100; } else { /* +hh */ h = m; m = 0; } if (*t) return soap->error = SOAP_TYPE; T.tm_min -= m; T.tm_hour -= h; /* put hour and min in range */ T.tm_hour += T.tm_min / 60; T.tm_min %= 60; if (T.tm_min < 0) { T.tm_min += 60; T.tm_hour--; } T.tm_mday += T.tm_hour / 24; T.tm_hour %= 24; if (T.tm_hour < 0) { T.tm_hour += 24; T.tm_mday--; } /* note: day of the month may be out of range, timegm() handles it */ } else if (*t != 'Z') return soap->error = SOAP_TYPE; #endif a->tv_sec = soap_timegm(&T); } else a->tv_sec = mktime(&T); } return soap->error; } struct timeval *soap_in_xsd__dateTime(struct soap *soap, const char *tag, struct timeval *a, const char *type) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":dateTime")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } a = (struct timeval*)soap_id_enter(soap, soap->id, a, SOAP_TYPE_xsd__dateTime, sizeof(struct timeval), NULL, NULL, NULL, NULL); if (*soap->href) a = (struct timeval*)soap_id_forward(soap, soap->href, a, 0, SOAP_TYPE_xsd__dateTime, 0, sizeof(struct timeval), 0, NULL, NULL); else if (a) { if (soap_s2xsd__dateTime(soap, soap_value(soap), a)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return a; } gsoap-2.8.28/gsoap/custom/long_double.c0000644000175000017500000001264512653650144017362 0ustar ellertellert/* long_double.c Custom serializer for the long double (extended double) type as xsd:decimal. Compile this file and link it with your code. gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under ONE of the following licenses: GPL, the gSOAP public license, OR Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2015, Robert van Engelen, Genivia, Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ /* soapH.h generated by soapcpp2 from .h file containing #import "long_double.h" */ #include "soapH.h" #include int soap_s2decimal(struct soap *soap, const char *s, long double *p) { if (s) { if (!*s) return soap->error = SOAP_TYPE; if (!soap_tag_cmp(s, "INF")) *p = (long double)DBL_PINFTY; else if (!soap_tag_cmp(s, "+INF")) *p = (long double)DBL_PINFTY; else if (!soap_tag_cmp(s, "-INF")) *p = (long double)DBL_NINFTY; else if (!soap_tag_cmp(s, "NaN")) *p = (long double)DBL_NAN; else { #if defined(WITH_C_LOCALE) && defined(HAVE_STRTOLD_L) char *r; # ifdef WIN32 *p = _strtold_l(s, &r, SOAP_LOCALE(soap)); # else *p = strtold_l(s, &r, SOAP_LOCALE(soap)); # endif if (*r) #elif defined(HAVE_STRTOLD) char *r; *p = strtold(s, &r); if (*r) #endif #if defined(WITH_C_LOCALE) && defined(HAVE_SSCANF_L) if (sscanf_l(s, SOAP_LOCALE(soap), "%Lf", p) != 1) soap->error = SOAP_TYPE; #elif defined(HAVE_SSCANF) if (sscanf(s, "%Lf", p) != 1) soap->error = SOAP_TYPE; #else soap->error = SOAP_TYPE; #endif } } return soap->error; } const char *soap_decimal2s(struct soap *soap, long double n) { #if !defined(WITH_C_LOCALE) || !defined(HAVE_SPRINTF_L) char *s; #endif if (soap_isnan(n)) return "NaN"; if (soap_ispinfd(n)) return "INF"; if (soap_isninfd(n)) return "-INF"; #if defined(WITH_C_LOCALE) && defined(HAVE_SPRINTF_L) # ifdef WIN32 if (soap->long_double_format) _sprintf_s_l(soap->tmpbuf, _countof(soap->tmpbuf), soap->long_double_format, SOAP_LOCALE(soap), n); else _sprintf_s_l(soap->tmpbuf, _countof(soap->tmpbuf), "%.*Lg", SOAP_LOCALE(soap), LDBL_DIG, n); # else if (soap->long_double_format) sprintf_l(soap->tmpbuf, SOAP_LOCALE(soap), soap->long_double_format, n); else sprintf_l(soap->tmpbuf, SOAP_LOCALE(soap), "%.*Lg", LDBL_DIG, n); # endif #else if (soap->long_double_format) (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), LDBL_DIG + 8), soap->long_double_format, n); else (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), LDBL_DIG + 8), "%.*Lg", LDBL_DIG, n); s = strchr(soap->tmpbuf, ','); /* convert decimal comma to DP */ if (s) *s = '.'; #endif return soap->tmpbuf; } int soap_outdecimal(struct soap *soap, const char *tag, int id, const long double *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_decimal2s(soap, *p), 0)) return soap->error; return soap_element_end_out(soap, tag); } long double * soap_indecimal(struct soap *soap, const char *tag, long double *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, type)) return NULL; p = (long double*)soap_id_enter(soap, soap->id, p, t, sizeof(long double), NULL, NULL, NULL, NULL); if (*soap->href) p = (long double*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(long double), 0, NULL, NULL); else if (p) { if (soap_s2decimal(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } gsoap-2.8.28/gsoap/custom/chrono_duration.h0000644000175000017500000000755512653650144020277 0ustar ellertellert/* chrono_duration.h Custom serializer for xsd:duration stored in a std::chrono::nanoseconds object. Requires C++11 or higher (compile with -std=c++11). Can represent 384307168 days (2^63 nanoseconds) forward and backward. Durations that exceed a month are always output in days, rather than months to avoid days-per-month conversion inacurracies. Durations that are received in years and months instead of total number of days from a reference point are not well defined, since there is no accepted reference time point (it may or may not be the current time). The decoder simple assumes that there are 30 days per month. For example, conversion of "P4M" gives 120 days. Therefore, the durations "P4M" and "P120D" are assumed to be identical, which is not necessarily true depending on the reference point in time. Adding std::chrono::nanoseconds values to values of std::chrono::system_clock::time_point is safe. Rescaling of the duration value by may be needed when adding the duration value to a `time_t` value, because `time_t` may or may not have a seconds resolution, depending on the platform and possible changes to `time_t`. #import this file into your gSOAP .h file To automate the wsdl2h-mapping of xsd:duration to std::chrono::nanoseconds, add this line to the typemap.dat file: xsd__duration = #import "custom/chrono_nanoseconds.h" | xsd__duration The typemap.dat file is used by wsdl2h to map types (wsdl2h option -t). When using soapcpp2 option -q or -p, you must change chrono_duration.cpp as follows: #include "soapH.h" -> #include "nameH.h" Compile and link your code with custom/chrono_duration.cpp gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under ONE of the following licenses: GPL, the gSOAP public license, OR Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2015, Robert van Engelen, Genivia, Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include extern typedef class std::chrono::nanoseconds xsd__duration; gsoap-2.8.28/gsoap/custom/duration.c0000644000175000017500000001440112653650144016706 0ustar ellertellert/* duration.c See duration.h for documentation. Compile this file and link it with your code. gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under ONE of the following licenses: GPL, the gSOAP public license, OR Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2015, Robert van Engelen, Genivia, Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ /* soapH.h generated by soapcpp2 from .h file containing #import "duration.h" */ #include "soapH.h" void soap_default_xsd__duration(struct soap *soap, LONG64 *a) { (void)soap; /* appease -Wall -Werror */ *a = 0; } const char *soap_xsd__duration2s(struct soap *soap, LONG64 a) { LONG64 d; int k, h, m, s, f; if (a < 0) { soap_strcpy(soap->tmpbuf, sizeof(soap->tmpbuf), "-P"); k = 2; a = -a; } else { soap_strcpy(soap->tmpbuf, sizeof(soap->tmpbuf), "P"); k = 1; } f = a % 1000; a /= 1000; s = a % 60; a /= 60; m = a % 60; a /= 60; h = a % 24; d = a / 24; if (d) (SOAP_SNPRINTF(soap->tmpbuf + k, sizeof(soap->tmpbuf) - k, 21), SOAP_LONG_FORMAT "D", d); if (h || m || s || f) { if (d) k = strlen(soap->tmpbuf); if (f) (SOAP_SNPRINTF(soap->tmpbuf + k, sizeof(soap->tmpbuf) - k, 14), "T%02dH%02dM%02d.%03dS", h, m, s, f); else (SOAP_SNPRINTF(soap->tmpbuf + k, sizeof(soap->tmpbuf) - k, 10), "T%02dH%02dM%02dS", h, m, s); } else if (!d) soap_strcpy(soap->tmpbuf + k, sizeof(soap->tmpbuf) - k, "T0S"); return soap->tmpbuf; } int soap_out_xsd__duration(struct soap *soap, const char *tag, int id, const LONG64 *a, const char *type) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_xsd__duration), type) || soap_string_out(soap, soap_xsd__duration2s(soap, *a), 0)) return soap->error; return soap_element_end_out(soap, tag); } int soap_s2xsd__duration(struct soap *soap, const char *s, LONG64 *a) { LONG64 sign = 1, Y = 0, M = 0, D = 0, H = 0, N = 0, S = 0; float f = 0; *a = 0; if (s) { if (*s == '-') { sign = -1; s++; } if (*s != 'P' && *s != 'p') return soap->error = SOAP_TYPE; s++; /* date part */ while (s && *s) { char *r = NULL; LONG64 n; if (*s == 'T' || *s == 't') { s++; break; } n = soap_strtol(s, &r, 10); if (!r) return soap->error = SOAP_TYPE; s = r; switch (*s) { case 'Y': case 'y': Y = n; break; case 'M': case 'm': M = n; break; case 'D': case 'd': D = n; break; default: return soap->error = SOAP_TYPE; } s++; } /* time part */ while (s && *s) { char *r = NULL; LONG64 n; n = soap_strtol(s, &r, 10); if (!r) return soap->error = SOAP_TYPE; s = r; switch (*s) { case 'H': case 'h': H = n; break; case 'M': case 'm': N = n; break; case '.': S = n; #if defined(WITH_C_LOCALE) && defined(HAVE_STRTOD_L) # ifdef WIN32 f = (float)_strtod_l(s, NULL, SOAP_LOCALE(soap)); # else f = (float)strtod_l(s, NULL, SOAP_LOCALE(soap)); # endif #elif defined(HAVE_STRTOD) f = (float)strtod(s, NULL); #elif defined(WITH_C_LOCALE) && defined(HAVE_STRTOF_L) f = strtof_l((char*)s, NULL, SOAP_LOCALE(soap)); #elif defined(HAVE_STRTOF) f = strtof((char*)s, NULL); #endif s = NULL; continue; case 'S': case 's': S = n; break; default: return soap->error = SOAP_TYPE; } s++; } /* convert Y-M-D H:N:S.f to signed long long int milliseconds */ *a = sign * ((((((((((((Y * 12) + M) * 30) + D) * 24) + H) * 60) + N) * 60) + S) * 1000) + (LONG64)(1000.0 * f + 0.5)); } return soap->error; } LONG64 *soap_in_xsd__duration(struct soap *soap, const char *tag, LONG64 *a, const char *type) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":duration")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } a = (LONG64*)soap_id_enter(soap, soap->id, a, SOAP_TYPE_xsd__duration, sizeof(LONG64), NULL, NULL, NULL, NULL); if (*soap->href) a = (LONG64*)soap_id_forward(soap, soap->href, a, 0, SOAP_TYPE_xsd__duration, 0, sizeof(LONG64), 0, NULL, NULL); else if (a) { if (soap_s2xsd__duration(soap, soap_value(soap), a)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return a; } gsoap-2.8.28/gsoap/custom/struct_timeval.h0000644000175000017500000000624312653650144020140 0ustar ellertellert/* struct_timeval.h Custom serializer for struct timeval as xsd::dateTime Because time_t (binds to xsd:dateTime) lacks fractional seconds, struct timeval can be used to represent microseconds since 1970-01-01. #import this file into your gSOAP .h file to enable struct timeval serialization and use the serializable xsd__dateTime type. The struct timeval represents dates since 1970-01-01 with microsecond precision: struct timeval { time_t tv_sec; // seconds since Jan. 1, 1970 suseconds_t tv_usec; // and microseconds }; To automate the wsdl2h-mapping of xsd:dateTime to struct timeval, add this line to the typemap.dat file: xsd__dateTime = #import "custom/struct_timeval.h" | xsd__dateTime The typemap.dat file is used by wsdl2h to map types (wsdl2h option -t). When using soapcpp2 option -q or -p, you must change struct_timeval.c as follows: #include "soapH.h" -> #include "nameH.h" Compiler and link your code with struct_timeval.c gSOAP XML Web services tools Copyright (C) 2000-2007, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under ONE of the following licenses: GPL, the gSOAP public license, OR Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2007, Robert van Engelen, Genivia, Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ extern typedef struct timeval xsd__dateTime; gsoap-2.8.28/gsoap/Makefile.am0000644000175000017500000000563012653650150015440 0ustar ellertellert## This is the input file for automake, which will generate Makefile.in ## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 SUBDIRS = . src wsdl @SAMPLE_DIRS@ CLEANFILES = soapcpp2 wsdl2h stdsoap2_cpp.cpp stdsoap2_ck.c stdsoap2_ck_cpp.cpp stdsoap2_ssl.c stdsoap2_ssl_cpp.cpp dom_cpp.cpp ## *~ *.req.xml *.res.xml *.nsmap *.wsdl *.xsd *Proxy.h \ ## *.o soapH.h soapStub.h soapC.cpp soapC.c soapClient.cpp soapClient.c soapServer.cpp soapServer.c AM_CXXFLAGS = $(SOAPCPP2_DEBUG) -D$(platform) AM_CFLAGS = $(SOAPCPP2_DEBUG) -D$(platform) # Install all soapcpp2 and wsdl2h files into ${prefix}/share/gsoap nobase_pkgdata_DATA = $(srcdir)/import/* $(srcdir)/plugin/* $(srcdir)/WS/* $(srcdir)/custom/* $(srcdir)/extras/* ## we cannot build stdsoap2.o from 2 different sources (stdsoap2.cpp and stdsoap2.c), so we need an intermediate target: stdsoap2_ck.c: stdsoap2.cpp $(LN_S) -f $(srcdir)/stdsoap2.cpp stdsoap2_ck.c stdsoap2_cpp.cpp: stdsoap2.cpp $(LN_S) -f $(srcdir)/stdsoap2.cpp stdsoap2_cpp.cpp stdsoap2_ck_cpp.cpp: stdsoap2.cpp $(LN_S) -f $(srcdir)/stdsoap2.cpp stdsoap2_ck_cpp.cpp stdsoap2_ssl.c: stdsoap2.cpp $(LN_S) -f $(srcdir)/stdsoap2.cpp stdsoap2_ssl.c stdsoap2_ssl_cpp.cpp: stdsoap2.cpp $(LN_S) -f $(srcdir)/stdsoap2.cpp stdsoap2_ssl_cpp.cpp ## do the same fo dom.cpp since we want to link it into the cpp libs and dom.c into the c libs dom_cpp.cpp: dom.cpp $(LN_S) -f $(srcdir)/dom.cpp dom_cpp.cpp lib_LIBRARIES = libgsoap.a libgsoap++.a libgsoapck.a libgsoapck++.a libgsoapssl.a libgsoapssl++.a libgsoap_a_SOURCES = stdsoap2.c dom.c libgsoap_a_CFLAGS = $(SOAPCPP2_DEBUG) $(SOAPCPP2_NONAMESPACES) $(SOAPCPP2_IPV6) -D$(platform) libgsoap___a_SOURCES = stdsoap2_cpp.cpp dom_cpp.cpp libgsoap___a_CXXFLAGS = $(SOAPCPP2_DEBUG) $(SOAPCPP2_NONAMESPACES) $(SOAPCPP2_IPV6) -D$(platform) libgsoapck_a_SOURCES = stdsoap2_ck.c dom.c libgsoapck_a_CFLAGS = $(SOAPCPP2_DEBUG) $(SOAPCPP2_NONAMESPACES) $(SOAPCPP2_IPV6) -D$(platform) -DWITH_COOKIES libgsoapck___a_SOURCES = stdsoap2_ck_cpp.cpp dom_cpp.cpp libgsoapck___a_CXXFLAGS = $(SOAPCPP2_DEBUG) $(SOAPCPP2_NONAMESPACES) $(SOAPCPP2_IPV6) -D$(platform) -DWITH_COOKIES libgsoapssl_a_SOURCES = stdsoap2_ssl.c dom.c libgsoapssl_a_CFLAGS = $(SOAPCPP2_DEBUG) $(SOAPCPP2_NONAMESPACES) $(SOAPCPP2_IPV6) -D$(platform) $(WSDL2H_EXTRA_FLAGS) -DWITH_DOM -DWITH_COOKIES libgsoapssl___a_SOURCES = stdsoap2_ssl_cpp.cpp dom_cpp.cpp libgsoapssl___a_CXXFLAGS = $(SOAPCPP2_DEBUG) $(SOAPCPP2_NONAMESPACES) $(SOAPCPP2_IPV6) -D$(platform) $(WSDL2H_EXTRA_FLAGS) -DWITH_DOM -DWITH_COOKIES BUILT_SOURCES = stdsoap2_cpp.cpp dom_cpp.cpp $(lib_LIBRARIES) include_HEADERS = stdsoap2.h install-data-hook: $(LN_S) -f $(top_builddir)/gsoap/src/soapcpp2 $(top_builddir)/gsoap/soapcpp2 || echo "ok, link already exists". $(LN_S) -f $(top_builddir)/gsoap/wsdl/wsdl2h $(top_builddir)/gsoap/wsdl2h || echo "ok, link already exists". gsoap-2.8.28/gsoap/stdsoap2.c0000644000175000017500000203723112653650160015314 0ustar ellertellert/* stdsoap2.c[pp] 2.8.28 gSOAP runtime engine gSOAP XML Web services tools Copyright (C) 2000-2016, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under ONE of the following licenses: GPL, or the gSOAP public license, or Genivia's license for commercial use. -------------------------------------------------------------------------------- Contributors: Wind River Systems Inc., for the following additions under gSOAP public license: - vxWorks compatible options -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2014, Robert van Engelen, Genivia Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #define GSOAP_LIB_VERSION 20828 #ifdef AS400 # pragma convert(819) /* EBCDIC to ASCII */ #endif #include "stdsoap2.h" #if GSOAP_VERSION != GSOAP_LIB_VERSION # error "GSOAP VERSION MISMATCH IN LIBRARY: PLEASE REINSTALL PACKAGE" #endif #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE) # include #endif #ifdef __BORLANDC__ # pragma warn -8060 #else # ifdef WIN32 # ifdef UNDER_CE # pragma comment(lib, "ws2.lib") /* WinCE */ # else # pragma comment(lib, "Ws2_32.lib") # endif # pragma warning(disable : 4996) /* disable deprecation warnings */ # endif #endif #ifdef __cplusplus SOAP_SOURCE_STAMP("@(#) stdsoap2.cpp ver 2.8.28 2016-02-01 00:00:00 GMT") extern "C" { #else SOAP_SOURCE_STAMP("@(#) stdsoap2.c ver 2.8.28 2016-02-01 00:00:00 GMT") #endif /* 8bit character representing unknown character entity or multibyte data */ #ifndef SOAP_UNKNOWN_CHAR # define SOAP_UNKNOWN_CHAR (0x7F) #endif /* unicode character representing unknown characters outside the XML 1.0 UTF8 unicode space */ #ifdef WITH_REPLACE_ILLEGAL_UTF8 # ifndef SOAP_UNKNOWN_UNICODE_CHAR # define SOAP_UNKNOWN_UNICODE_CHAR (0xFFFD) # endif #endif /* EOF=-1 */ #define SOAP_LT (soap_wchar)(-2) /* XML-specific '<' */ #define SOAP_TT (soap_wchar)(-3) /* XML-specific '' */ #define SOAP_QT (soap_wchar)(-5) /* XML-specific '"' */ #define SOAP_AP (soap_wchar)(-6) /* XML-specific ''' */ #define soap_blank(c) ((c)+1 > 0 && (c) <= 32) #define soap_notblank(c) ((c) > 32) #if defined(WIN32) && !defined(UNDER_CE) #define soap_hash_ptr(p) ((PtrToUlong(p) >> 3) & (SOAP_PTRHASH - 1)) #else #define soap_hash_ptr(p) ((size_t)(((unsigned long)(p) >> 3) & (SOAP_PTRHASH-1))) #endif #if !defined(WITH_LEAN) || defined(SOAP_DEBUG) static void soap_init_logs(struct soap*); #endif #ifdef SOAP_DEBUG static void soap_close_logfile(struct soap*, int); static void soap_set_logfile(struct soap*, int, const char*); #endif #ifdef SOAP_MEM_DEBUG static void soap_init_mht(struct soap*); static void soap_free_mht(struct soap*); static void soap_track_unlink(struct soap*, const void*); #endif #ifndef PALM_2 static int soap_set_error(struct soap*, const char*, const char*, const char*, const char*, int); static int soap_copy_fault(struct soap*, const char*, const char*, const char*, const char*); static int soap_getattrval(struct soap*, char*, size_t*, soap_wchar); #endif #ifndef PALM_1 static void soap_free_ns(struct soap *soap); static soap_wchar soap_char(struct soap*); static soap_wchar soap_get_pi(struct soap*); static int soap_isxdigit(int); static void *fplugin(struct soap*, const char*); static size_t soap_count_attachments(struct soap *soap); static int soap_try_connect_command(struct soap*, int http_command, const char *endpoint, const char *action); #ifdef WITH_NTLM static int soap_ntlm_handshake(struct soap *soap, int command, const char *endpoint, const char *host, int port); #endif #ifndef WITH_NOIDREF static int soap_has_copies(struct soap*, const char*, const char*); static int soap_type_punned(struct soap*, const struct soap_ilist*); static int soap_is_shaky(struct soap*, void*); static void soap_init_iht(struct soap*); static void soap_free_iht(struct soap*); #endif static void soap_init_pht(struct soap*); static void soap_free_pht(struct soap*); #endif #ifndef WITH_LEAN static const char *soap_set_validation_fault(struct soap*, const char*, const char*); static int soap_isnumeric(struct soap*, const char*); static struct soap_nlist *soap_push_ns(struct soap *soap, const char *id, const char *ns, short utilized); static void soap_utilize_ns(struct soap *soap, const char *tag); static const wchar_t* soap_wstring(struct soap *soap, const char *s, long minlen, long maxlen); #endif #ifndef PALM_2 static const char* soap_string(struct soap *soap, const char *s, long minlen, long maxlen); static const char* soap_QName(struct soap *soap, const char *s, long minlen, long maxlen); #endif #ifndef WITH_LEANER #ifndef PALM_1 static struct soap_multipart *soap_new_multipart(struct soap*, struct soap_multipart**, struct soap_multipart**, char*, size_t); static int soap_putdimefield(struct soap*, const char*, size_t); static char *soap_getdimefield(struct soap*, size_t); static void soap_select_mime_boundary(struct soap*); static int soap_valid_mime_boundary(struct soap*); static void soap_resolve_attachment(struct soap*, struct soap_multipart*); #endif #endif #ifdef WITH_GZIP static int soap_getgziphdr(struct soap*); #endif #ifdef WITH_OPENSSL # ifndef SOAP_SSL_RSA_BITS # define SOAP_SSL_RSA_BITS 2048 # endif static int soap_ssl_init_done = 0; static int ssl_auth_init(struct soap*); static int ssl_verify_callback(int, X509_STORE_CTX*); static int ssl_verify_callback_allow_expired_certificate(int, X509_STORE_CTX*); static int ssl_password(char*, int, int, void *); #endif #ifdef WITH_GNUTLS # ifndef SOAP_SSL_RSA_BITS # define SOAP_SSL_RSA_BITS 2048 # endif static int soap_ssl_init_done = 0; static int ssl_auth_init(struct soap*); static const char *ssl_verify(struct soap *soap, const char *host); # if defined(HAVE_PTHREAD_H) # include /* make GNUTLS thread safe with pthreads */ GCRY_THREAD_OPTION_PTHREAD_IMPL; # elif defined(HAVE_PTH_H) #include /* make GNUTLS thread safe with PTH */ GCRY_THREAD_OPTION_PTH_IMPL; # endif #endif #ifdef WITH_SYSTEMSSL static int ssl_auth_init(struct soap*); static int ssl_recv(int sk, void *s, int n, char *user); static int ssl_send(int sk, void *s, int n, char *user); #endif #if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) #ifndef PALM_1 static const char *soap_decode(char*, size_t, const char*, const char*); #endif #endif #ifndef WITH_NOHTTP #ifndef PALM_1 static soap_wchar soap_getchunkchar(struct soap*); static const char *http_error(struct soap*, int); static int http_get(struct soap*); static int http_405(struct soap*); static int http_200(struct soap*); static int http_post(struct soap*, const char*, const char*, int, const char*, const char*, size_t); static int http_send_header(struct soap*, const char*); static int http_post_header(struct soap*, const char*, const char*); static int http_response(struct soap*, int, size_t); static int http_parse(struct soap*); static int http_parse_header(struct soap*, const char*, const char*); #endif #endif #ifndef WITH_NOIO #ifndef PALM_1 static int fsend(struct soap*, const char*, size_t); static size_t frecv(struct soap*, char*, size_t); static int tcp_init(struct soap*); static const char *tcp_error(struct soap*); #ifndef WITH_IPV6 static int tcp_gethost(struct soap*, const char *addr, struct in_addr *inaddr); #endif static SOAP_SOCKET tcp_connect(struct soap*, const char *endpoint, const char *host, int port); static SOAP_SOCKET tcp_accept(struct soap*, SOAP_SOCKET, struct sockaddr*, int*); static int tcp_select(struct soap*, SOAP_SOCKET, int, int); static int tcp_disconnect(struct soap*); static int tcp_closesocket(struct soap*, SOAP_SOCKET); static int tcp_shutdownsocket(struct soap*, SOAP_SOCKET, int); static const char *soap_strerror(struct soap*); #endif #define SOAP_TCP_SELECT_RCV 0x1 #define SOAP_TCP_SELECT_SND 0x2 #define SOAP_TCP_SELECT_ERR 0x4 #define SOAP_TCP_SELECT_ALL 0x7 #if defined(WIN32) #define SOAP_SOCKBLOCK(fd) \ { u_long blocking = 0; \ ioctlsocket(fd, FIONBIO, &blocking); \ } #define SOAP_SOCKNONBLOCK(fd) \ { u_long nonblocking = 1; \ ioctlsocket(fd, FIONBIO, &nonblocking); \ } #elif defined(VXWORKS) #define SOAP_SOCKBLOCK(fd) \ { u_long blocking = 0; \ ioctl(fd, FIONBIO, (int)(&blocking)); \ } #define SOAP_SOCKNONBLOCK(fd) \ { u_long nonblocking = 1; \ ioctl(fd, FIONBIO, (int)(&nonblocking)); \ } #elif defined(__VMS) #define SOAP_SOCKBLOCK(fd) \ { int blocking = 0; \ ioctl(fd, FIONBIO, &blocking); \ } #define SOAP_SOCKNONBLOCK(fd) \ { int nonblocking = 1; \ ioctl(fd, FIONBIO, &nonblocking); \ } #elif defined(PALM) #define SOAP_SOCKBLOCK(fd) fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0)&~O_NONBLOCK); #define SOAP_SOCKNONBLOCK(fd) fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0)|O_NONBLOCK); #elif defined(SYMBIAN) #define SOAP_SOCKBLOCK(fd) \ { long blocking = 0; \ ioctl(fd, 0/*FIONBIO*/, &blocking); \ } #define SOAP_SOCKNONBLOCK(fd) \ { long nonblocking = 1; \ ioctl(fd, 0/*FIONBIO*/, &nonblocking); \ } #else #define SOAP_SOCKBLOCK(fd) fcntl(fd, F_SETFL, fcntl(fd, F_GETFL)&~O_NONBLOCK); #define SOAP_SOCKNONBLOCK(fd) fcntl(fd, F_SETFL, fcntl(fd, F_GETFL)|O_NONBLOCK); #endif #endif #if defined(PALM) && !defined(PALM_2) unsigned short errno; #endif #ifndef PALM_1 static const char soap_env1[42] = "http://schemas.xmlsoap.org/soap/envelope/"; static const char soap_enc1[42] = "http://schemas.xmlsoap.org/soap/encoding/"; static const char soap_env2[40] = "http://www.w3.org/2003/05/soap-envelope"; static const char soap_enc2[40] = "http://www.w3.org/2003/05/soap-encoding"; static const char soap_rpc[35] = "http://www.w3.org/2003/05/soap-rpc"; #endif #ifndef PALM_1 const union soap_double_nan soap_double_nan = {{0xFFFFFFFF, 0xFFFFFFFF}}; const char soap_base64o[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; const char soap_base64i[81] = "\76XXX\77\64\65\66\67\70\71\72\73\74\75XXXXXXX\00\01\02\03\04\05\06\07\10\11\12\13\14\15\16\17\20\21\22\23\24\25\26\27\30\31XXXXXX\32\33\34\35\36\37\40\41\42\43\44\45\46\47\50\51\52\53\54\55\56\57\60\61\62\63"; #endif #ifndef WITH_LEAN static const char soap_indent[21] = "\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"; /* Alternative indentation form for SOAP_XML_INDENT: static const char soap_indent[41] = "\n "; */ #endif #ifndef SOAP_CANARY # define SOAP_CANARY (0xC0DE) #endif static const char soap_padding[4] = "\0\0\0"; #define SOAP_STR_PADDING (soap_padding) #define SOAP_STR_EOS (soap_padding) #define SOAP_NON_NULL (soap_padding) #ifndef WITH_LEAN static const struct soap_code_map html_entity_codes[] = /* entities for XHTML parsing */ { { 160, "nbsp" }, { 161, "iexcl" }, { 162, "cent" }, { 163, "pound" }, { 164, "curren" }, { 165, "yen" }, { 166, "brvbar" }, { 167, "sect" }, { 168, "uml" }, { 169, "copy" }, { 170, "ordf" }, { 171, "laquo" }, { 172, "not" }, { 173, "shy" }, { 174, "reg" }, { 175, "macr" }, { 176, "deg" }, { 177, "plusmn" }, { 178, "sup2" }, { 179, "sup3" }, { 180, "acute" }, { 181, "micro" }, { 182, "para" }, { 183, "middot" }, { 184, "cedil" }, { 185, "sup1" }, { 186, "ordm" }, { 187, "raquo" }, { 188, "frac14" }, { 189, "frac12" }, { 190, "frac34" }, { 191, "iquest" }, { 192, "Agrave" }, { 193, "Aacute" }, { 194, "Acirc" }, { 195, "Atilde" }, { 196, "Auml" }, { 197, "Aring" }, { 198, "AElig" }, { 199, "Ccedil" }, { 200, "Egrave" }, { 201, "Eacute" }, { 202, "Ecirc" }, { 203, "Euml" }, { 204, "Igrave" }, { 205, "Iacute" }, { 206, "Icirc" }, { 207, "Iuml" }, { 208, "ETH" }, { 209, "Ntilde" }, { 210, "Ograve" }, { 211, "Oacute" }, { 212, "Ocirc" }, { 213, "Otilde" }, { 214, "Ouml" }, { 215, "times" }, { 216, "Oslash" }, { 217, "Ugrave" }, { 218, "Uacute" }, { 219, "Ucirc" }, { 220, "Uuml" }, { 221, "Yacute" }, { 222, "THORN" }, { 223, "szlig" }, { 224, "agrave" }, { 225, "aacute" }, { 226, "acirc" }, { 227, "atilde" }, { 228, "auml" }, { 229, "aring" }, { 230, "aelig" }, { 231, "ccedil" }, { 232, "egrave" }, { 233, "eacute" }, { 234, "ecirc" }, { 235, "euml" }, { 236, "igrave" }, { 237, "iacute" }, { 238, "icirc" }, { 239, "iuml" }, { 240, "eth" }, { 241, "ntilde" }, { 242, "ograve" }, { 243, "oacute" }, { 244, "ocirc" }, { 245, "otilde" }, { 246, "ouml" }, { 247, "divide" }, { 248, "oslash" }, { 249, "ugrave" }, { 250, "uacute" }, { 251, "ucirc" }, { 252, "uuml" }, { 253, "yacute" }, { 254, "thorn" }, { 255, "yuml" }, { 0, NULL } }; #endif #ifndef WITH_NOIO #ifndef WITH_LEAN static const struct soap_code_map h_error_codes[] = { #ifdef HOST_NOT_FOUND { HOST_NOT_FOUND, "Host not found" }, #endif #ifdef TRY_AGAIN { TRY_AGAIN, "Try Again" }, #endif #ifdef NO_RECOVERY { NO_RECOVERY, "No Recovery" }, #endif #ifdef NO_DATA { NO_DATA, "No Data" }, #endif #ifdef NO_ADDRESS { NO_ADDRESS, "No Address" }, #endif { 0, NULL } }; #endif #endif #ifndef WITH_NOHTTP #ifndef WITH_LEAN static const struct soap_code_map h_http_error_codes[] = { { 200, "OK" }, { 201, "Created" }, { 202, "Accepted" }, { 203, "Non-Authoritative Information" }, { 204, "No Content" }, { 205, "Reset Content" }, { 206, "Partial Content" }, { 300, "Multiple Choices" }, { 301, "Moved Permanently" }, { 302, "Found" }, { 303, "See Other" }, { 304, "Not Modified" }, { 305, "Use Proxy" }, { 307, "Temporary Redirect" }, { 400, "Bad Request" }, { 401, "Unauthorized" }, { 402, "Payment Required" }, { 403, "Forbidden" }, { 404, "Not Found" }, { 405, "Method Not Allowed" }, { 406, "Not Acceptable" }, { 407, "Proxy Authentication Required" }, { 408, "Request Time-out" }, { 409, "Conflict" }, { 410, "Gone" }, { 411, "Length Required" }, { 412, "Precondition Failed" }, { 413, "Request Entity Too Large" }, { 414, "Request-URI Too Large" }, { 415, "Unsupported Media Type" }, { 416, "Requested range not satisfiable" }, { 417, "Expectation Failed" }, { 500, "Internal Server Error" }, { 501, "Not Implemented" }, { 502, "Bad Gateway" }, { 503, "Service Unavailable" }, { 504, "Gateway Time-out" }, { 505, "HTTP Version not supported" }, { 0, NULL } }; #endif #endif #ifdef WITH_OPENSSL static const struct soap_code_map h_ssl_error_codes[] = { #define _SSL_ERROR(e) { e, #e } _SSL_ERROR(SSL_ERROR_SSL), _SSL_ERROR(SSL_ERROR_ZERO_RETURN), _SSL_ERROR(SSL_ERROR_WANT_READ), _SSL_ERROR(SSL_ERROR_WANT_WRITE), _SSL_ERROR(SSL_ERROR_WANT_CONNECT), _SSL_ERROR(SSL_ERROR_WANT_X509_LOOKUP), _SSL_ERROR(SSL_ERROR_SYSCALL), { 0, NULL } }; #endif #ifndef WITH_LEANER static const struct soap_code_map mime_codes[] = { { SOAP_MIME_7BIT, "7bit" }, { SOAP_MIME_8BIT, "8bit" }, { SOAP_MIME_BINARY, "binary" }, { SOAP_MIME_QUOTED_PRINTABLE, "quoted-printable" }, { SOAP_MIME_BASE64, "base64" }, { SOAP_MIME_IETF_TOKEN, "ietf-token" }, { SOAP_MIME_X_TOKEN, "x-token" }, { 0, NULL } }; #endif #ifdef WIN32 static int tcp_done = 0; #endif #if defined(HP_UX) && defined(HAVE_GETHOSTBYNAME_R) extern int h_errno; #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 static int fsend(struct soap *soap, const char *s, size_t n) { int nwritten, err; SOAP_SOCKET sk; #if defined(__cplusplus) && !defined(WITH_COMPAT) if (soap->os) { soap->os->write(s, (std::streamsize)n); if (soap->os->good()) return SOAP_OK; soap->errnum = 0; return SOAP_EOF; } #endif sk = soap->sendsk; if (!soap_valid_socket(sk)) sk = soap->socket; while (n) { if (soap_valid_socket(sk)) { if (soap->send_timeout) { for (;;) { int r; #ifdef WITH_OPENSSL if (soap->ssl) r = tcp_select(soap, sk, SOAP_TCP_SELECT_ALL, soap->send_timeout); else #endif #ifdef WITH_GNUTLS if (soap->session) r = tcp_select(soap, sk, SOAP_TCP_SELECT_ALL, soap->send_timeout); else #endif #ifdef WITH_SYSTEMSSL if (soap->ssl) r = tcp_select(soap, sk, SOAP_TCP_SELECT_ALL, soap->send_timeout); else #endif r = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, soap->send_timeout); if (r > 0) break; if (!r) return SOAP_EOF; err = soap->errnum; if (!err) return soap->error; if (err != SOAP_EAGAIN && err != SOAP_EWOULDBLOCK) return SOAP_EOF; } } #ifdef WITH_OPENSSL if (soap->ssl) nwritten = SSL_write(soap->ssl, s, (int)n); else if (soap->bio) nwritten = BIO_write(soap->bio, s, (int)n); else #endif #ifdef WITH_GNUTLS if (soap->session) nwritten = gnutls_record_send(soap->session, s, n); else #endif #ifdef WITH_SYSTEMSSL if (soap->ssl) { err = gsk_secure_socket_write(soap->ssl, (char*)s, n, &nwritten); if (err != GSK_OK) nwritten = 0; } else #endif #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) { if (soap->peerlen) nwritten = sendto(sk, (char*)s, (SOAP_WINSOCKINT)n, soap->socket_flags, &soap->peer.addr, (SOAP_WINSOCKINT)soap->peerlen); else nwritten = send(sk, s, (SOAP_WINSOCKINT)n, soap->socket_flags); /* retry and back-off algorithm */ /* TODO: this is not very clear from specs so verify and limit conditions under which we should loop (e.g. ENOBUFS) */ if (nwritten < 0) { int udp_repeat; int udp_delay; if ((soap->connect_flags & SO_BROADCAST)) udp_repeat = 2; /* SOAP-over-UDP MULTICAST_UDP_REPEAT - 1 */ else udp_repeat = 1; /* SOAP-over-UDP UNICAST_UDP_REPEAT - 1 */ udp_delay = ((unsigned int)soap_random % 201) + 50; /* UDP_MIN_DELAY .. UDP_MAX_DELAY */ do { tcp_select(soap, sk, SOAP_TCP_SELECT_ERR, -1000 * udp_delay); if (soap->peerlen) nwritten = sendto(sk, (char*)s, (SOAP_WINSOCKINT)n, soap->socket_flags, &soap->peer.addr, (SOAP_WINSOCKINT)soap->peerlen); else nwritten = send(sk, s, (SOAP_WINSOCKINT)n, soap->socket_flags); udp_delay <<= 1; if (udp_delay > 500) /* UDP_UPPER_DELAY */ udp_delay = 500; } while (nwritten < 0 && --udp_repeat > 0); } if (nwritten < 0) { err = soap_socket_errno(sk); if (err && err != SOAP_EINTR) { soap->errnum = err; return SOAP_EOF; } nwritten = 0; /* and call write() again */ } } else #endif #if !defined(PALM) && !defined(AS400) nwritten = send(sk, s, (int)n, soap->socket_flags); #else nwritten = send(sk, (void*)s, n, soap->socket_flags); #endif if (nwritten <= 0) { int r = 0; err = soap_socket_errno(sk); #ifdef WITH_OPENSSL if (soap->ssl && (r = SSL_get_error(soap->ssl, nwritten)) != SSL_ERROR_NONE && r != SSL_ERROR_WANT_READ && r != SSL_ERROR_WANT_WRITE) { soap->errnum = err; return SOAP_EOF; } #endif #ifdef WITH_GNUTLS if (soap->session) { if (nwritten == GNUTLS_E_INTERRUPTED) err = SOAP_EINTR; else if (nwritten == GNUTLS_E_AGAIN) err = SOAP_EAGAIN; } #endif if (err == SOAP_EWOULDBLOCK || err == SOAP_EAGAIN) { #if defined(WITH_OPENSSL) if (soap->ssl && r == SSL_ERROR_WANT_READ) r = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, soap->send_timeout ? soap->send_timeout : -10000); else #elif defined(WITH_GNUTLS) if (soap->session && !gnutls_record_get_direction(soap->session)) r = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, soap->send_timeout ? soap->send_timeout : -10000); else #endif r = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, soap->send_timeout ? soap->send_timeout : -10000); if (!r && soap->send_timeout) return SOAP_EOF; if (r < 0) return SOAP_EOF; } else if (err && err != SOAP_EINTR) { soap->errnum = err; return SOAP_EOF; } nwritten = 0; /* and call write() again */ } } else { #ifdef WITH_FASTCGI nwritten = fwrite((void*)s, 1, n, stdout); fflush(stdout); #else #ifdef UNDER_CE nwritten = fwrite(s, 1, n, soap->sendfd); #else #ifdef VXWORKS #ifdef WMW_RPM_IO if (soap->rpmreqid) nwritten = (httpBlockPut(soap->rpmreqid, (char*)s, n) == 0) ? n : -1; else #endif nwritten = fwrite(s, sizeof(char), n, fdopen(soap->sendfd, "w")); #else #ifdef WIN32 nwritten = _write(soap->sendfd, s, (unsigned int)n); #else nwritten = write(soap->sendfd, s, (unsigned int)n); #endif #endif #endif #endif if (nwritten <= 0) { #ifndef WITH_FASTCGI err = soap_errno; #else err = EOF; #endif if (err && err != SOAP_EINTR && err != SOAP_EWOULDBLOCK && err != SOAP_EAGAIN) { soap->errnum = err; return SOAP_EOF; } nwritten = 0; /* and call write() again */ } } n -= nwritten; s += nwritten; } return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_send_raw(struct soap *soap, const char *s, size_t n) { if (!n) return SOAP_OK; #ifndef WITH_LEANER if (soap->fpreparesend && (soap->mode & SOAP_IO) != SOAP_IO_STORE && (soap->mode & SOAP_IO_LENGTH) && (soap->error = soap->fpreparesend(soap, s, n))) return soap->error; if (soap->ffiltersend && (soap->error = soap->ffiltersend(soap, &s, &n))) return soap->error; #endif if ((soap->mode & SOAP_IO_LENGTH)) soap->count += n; else if (soap->mode & SOAP_IO) { size_t i = sizeof(soap->buf) - soap->bufidx; while (n >= i) { soap_memcpy((void*)(soap->buf + soap->bufidx), i, (const void*)s, i); soap->bufidx = sizeof(soap->buf); if (soap_flush(soap)) return soap->error; s += i; n -= i; i = sizeof(soap->buf); } soap_memcpy((void*)(soap->buf + soap->bufidx), sizeof(soap->buf) - soap->bufidx, (const void*)s, n); soap->bufidx += n; } else return soap_flush_raw(soap, s, n); return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_flush(struct soap *soap) { size_t n = soap->bufidx; if (n) { #ifndef WITH_LEANER if ((soap->mode & SOAP_IO) == SOAP_IO_STORE) { int r; if (soap->fpreparesend && (r = soap->fpreparesend(soap, soap->buf, n))) return soap->error = r; } #endif soap->bufidx = 0; #ifdef WITH_ZLIB if (soap->mode & SOAP_ENC_ZLIB) { soap->d_stream->next_in = (Byte*)soap->buf; soap->d_stream->avail_in = (unsigned int)n; #ifdef WITH_GZIP soap->z_crc = crc32(soap->z_crc, (Byte*)soap->buf, (unsigned int)n); #endif do { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Deflating %u bytes\n", soap->d_stream->avail_in)); if (deflate(soap->d_stream, Z_NO_FLUSH) != Z_OK) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unable to deflate: %s\n", soap->d_stream->msg ? soap->d_stream->msg : SOAP_STR_EOS)); return soap->error = SOAP_ZLIB_ERROR; } if (!soap->d_stream->avail_out) { if (soap_flush_raw(soap, soap->z_buf, sizeof(soap->buf))) return soap->error; soap->d_stream->next_out = (Byte*)soap->z_buf; soap->d_stream->avail_out = sizeof(soap->buf); } } while (soap->d_stream->avail_in); } else #endif return soap_flush_raw(soap, soap->buf, n); } return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_flush_raw(struct soap *soap, const char *s, size_t n) { if ((soap->mode & SOAP_IO) == SOAP_IO_STORE) { void *t; if (!(t = soap_push_block(soap, NULL, n))) return soap->error = SOAP_EOM; soap_memcpy(t, n, (const void*)s, n); return SOAP_OK; } #ifndef WITH_LEANER if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK) { char t[24]; (SOAP_SNPRINTF(t, sizeof(t), 20), &"\r\n%lX\r\n"[soap->chunksize ? 0 : 2], (unsigned long)n); DBGMSG(SENT, t, strlen(t)); if ((soap->error = soap->fsend(soap, t, strlen(t)))) return soap->error; soap->chunksize += n; } DBGMSG(SENT, s, n); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Send %u bytes to socket=%d/fd=%d\n", (unsigned int)n, soap->socket, soap->sendfd)); #endif return soap->error = soap->fsend(soap, s, n); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_send(struct soap *soap, const char *s) { if (s) return soap_send_raw(soap, s, strlen(s)); return SOAP_OK; } #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_send2(struct soap *soap, const char *s1, const char *s2) { if (soap_send(soap, s1)) return soap->error; return soap_send(soap, s2); } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_send3(struct soap *soap, const char *s1, const char *s2, const char *s3) { if (soap_send(soap, s1) || soap_send(soap, s2)) return soap->error; return soap_send(soap, s3); } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 static size_t frecv(struct soap *soap, char *s, size_t n) { int r; int retries = 100; /* max 100 retries with non-blocking sockets */ SOAP_SOCKET sk; soap->errnum = 0; #if defined(__cplusplus) && !defined(WITH_COMPAT) if (soap->is) /* recv from C++ stream */ { if (soap->is->good()) return (size_t)soap->is->read(s, (std::streamsize)n).gcount(); return 0; } #else if (soap->is) /* recv from C buffer until NUL */ { size_t l = strlen(soap->is); if (l > n) l = n; soap_memcpy(s, n, soap->is, l); soap->is += l; return l; } #endif sk = soap->recvsk; if (!soap_valid_socket(sk)) sk = soap->socket; if (soap_valid_socket(sk)) { for (;;) { #if defined(WITH_OPENSSL) || defined(WITH_SYSTEMSSL) int err = 0; #endif #ifdef WITH_OPENSSL if (soap->recv_timeout && !soap->ssl) /* OpenSSL: sockets are nonblocking */ #else if (soap->recv_timeout) #endif { for (;;) { r = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, soap->recv_timeout); if (r > 0) break; if (!r) return 0; r = soap->errnum; if (r != SOAP_EAGAIN && r != SOAP_EWOULDBLOCK) return 0; } } #ifdef WITH_OPENSSL if (soap->ssl) { r = SSL_read(soap->ssl, s, (int)n); if (r > 0) return (size_t)r; err = SSL_get_error(soap->ssl, r); if (err != SSL_ERROR_NONE && err != SSL_ERROR_WANT_READ && err != SSL_ERROR_WANT_WRITE) return 0; } else if (soap->bio) { r = BIO_read(soap->bio, s, (int)n); if (r > 0) return (size_t)r; return 0; } else #endif #ifdef WITH_GNUTLS if (soap->session) { r = (int)gnutls_record_recv(soap->session, s, n); if (r >= 0) return (size_t)r; } else #endif #ifdef WITH_SYSTEMSSL if (soap->ssl) { err = gsk_secure_socket_read(soap->ssl, s, n, &r); if (err == GSK_OK && r > 0) return (size_t)r; if (err != GSK_OK && err != GSK_WOULD_BLOCK && err != GSK_WOULD_BLOCK_WRITE) return 0; } else #endif { #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) { SOAP_SOCKLEN_T k = (SOAP_SOCKLEN_T)sizeof(soap->peer); memset((void*)&soap->peer, 0, sizeof(soap->peer)); r = recvfrom(sk, s, (SOAP_WINSOCKINT)n, soap->socket_flags, &soap->peer.addr, &k); /* portability note: see SOAP_SOCKLEN_T definition in stdsoap2.h */ soap->peerlen = (size_t)k; #ifndef WITH_IPV6 soap->ip = ntohl(soap->peer.in.sin_addr.s_addr); #endif } else #endif r = recv(sk, s, (SOAP_WINSOCKINT)n, soap->socket_flags); #ifdef PALM /* CycleSyncDisplay(curStatusMsg); */ #endif if (r >= 0) return (size_t)r; r = soap_socket_errno(sk); if (r != SOAP_EINTR && r != SOAP_EAGAIN && r != SOAP_EWOULDBLOCK) { soap->errnum = r; return 0; } } #if defined(WITH_OPENSSL) if (soap->ssl && err == SSL_ERROR_WANT_WRITE) r = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, soap->recv_timeout ? soap->recv_timeout : 5); else #elif defined(WITH_GNUTLS) if (soap->session && gnutls_record_get_direction(soap->session)) r = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, soap->recv_timeout ? soap->recv_timeout : 5); else #elif defined(WITH_SYSTEMSSL) if (soap->ssl && err == GSK_WOULD_BLOCK_WRITE) r = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, soap->recv_timeout ? soap->recv_timeout : 5); else #endif r = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, soap->recv_timeout ? soap->recv_timeout : 5); if (!r && soap->recv_timeout) return 0; if (r < 0) { r = soap->errnum; if (r != SOAP_EAGAIN && r != SOAP_EWOULDBLOCK) return 0; } if (retries-- <= 0) return 0; #ifdef PALM r = soap_socket_errno(sk); if (r != SOAP_EINTR && retries-- <= 0) { soap->errnum = r; return 0; } #endif } } #ifdef WITH_FASTCGI return fread(s, 1, n, stdin); #else #ifdef UNDER_CE return fread(s, 1, n, soap->recvfd); #else #ifdef WMW_RPM_IO if (soap->rpmreqid) r = httpBlockRead(soap->rpmreqid, s, n); else #endif #ifdef WIN32 r = _read(soap->recvfd, s, (unsigned int)n); #else r = read(soap->recvfd, s, n); #endif if (r >= 0) return (size_t)r; soap->errnum = soap_errno; return 0; #endif #endif } #endif #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 static soap_wchar soap_getchunkchar(struct soap *soap) { if (soap->bufidx < soap->buflen) return soap->buf[soap->bufidx++]; soap->bufidx = 0; soap->buflen = soap->chunkbuflen = soap->frecv(soap, soap->buf, sizeof(soap->buf)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Read %u bytes from socket=%d/fd=%d\n", (unsigned int)soap->buflen, soap->socket, soap->recvfd)); DBGMSG(RECV, soap->buf, soap->buflen); if (soap->buflen) return soap->buf[soap->bufidx++]; return EOF; } #endif #endif /******************************************************************************/ #ifndef PALM_1 static int soap_isxdigit(int c) { return (c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f'); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_recv_raw(struct soap *soap) { size_t ret; #if !defined(WITH_LEANER) || defined(WITH_ZLIB) int r; #endif #ifdef WITH_ZLIB if ((soap->mode & SOAP_ENC_ZLIB) && soap->d_stream) { if (soap->d_stream->next_out == Z_NULL) { soap->bufidx = soap->buflen = 0; return EOF; } if (soap->d_stream->avail_in || !soap->d_stream->avail_out) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflating\n")); soap->d_stream->next_out = (Byte*)soap->buf; soap->d_stream->avail_out = sizeof(soap->buf); r = inflate(soap->d_stream, Z_NO_FLUSH); if (r == Z_NEED_DICT && soap->z_dict) r = inflateSetDictionary(soap->d_stream, (const Bytef*)soap->z_dict, soap->z_dict_len); if (r == Z_OK || r == Z_STREAM_END) { soap->bufidx = 0; ret = soap->buflen = sizeof(soap->buf) - soap->d_stream->avail_out; if (soap->zlib_in == SOAP_ZLIB_GZIP) soap->z_crc = crc32(soap->z_crc, (Byte*)soap->buf, (unsigned int)ret); if (r == Z_STREAM_END) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflated %lu->%lu bytes\n", soap->d_stream->total_in, soap->d_stream->total_out)); soap->z_ratio_in = (float)soap->d_stream->total_in / (float)soap->d_stream->total_out; soap->d_stream->next_out = Z_NULL; } if (ret) { soap->count += ret; if (soap->count > SOAP_MAXINFLATESIZE && soap->z_ratio_in < SOAP_MINDEFLATERATIO) { soap->d_stream->msg = (char*)"caught SOAP_MINDEFLATERATIO explosive decompression guard (remedy: increase SOAP_MAXINFLATESIZE and/or decrease SOAP_MINDEFLATERATIO)"; return soap->error = SOAP_ZLIB_ERROR; } DBGLOG(RECV, SOAP_MESSAGE(fdebug, "\n---- decompressed ----\n")); DBGMSG(RECV, soap->buf, ret); DBGLOG(RECV, SOAP_MESSAGE(fdebug, "\n----\n")); #ifndef WITH_LEANER if (soap->fpreparerecv && (r = soap->fpreparerecv(soap, soap->buf, ret))) return soap->error = r; #endif return SOAP_OK; } } else if (r != Z_BUF_ERROR) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflate error: %s\n", soap->d_stream->msg ? soap->d_stream->msg : SOAP_STR_EOS)); soap->d_stream->next_out = Z_NULL; return soap->error = SOAP_ZLIB_ERROR; } } zlib_again: if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK && !soap->chunksize) { soap_memcpy((void*)soap->buf, sizeof(soap->buf), (const void*)soap->z_buf, sizeof(soap->buf)); soap->buflen = soap->z_buflen; } DBGLOG(RECV, SOAP_MESSAGE(fdebug, "\n---- compressed ----\n")); } #endif #ifndef WITH_NOHTTP if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK) /* read HTTP chunked transfer */ { for (;;) { soap_wchar c; char *t, tmp[17]; if (soap->chunksize) { soap->buflen = ret = soap->frecv(soap, soap->buf, soap->chunksize > sizeof(soap->buf) ? sizeof(soap->buf) : soap->chunksize); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Getting chunk: read %u bytes\n", (unsigned int)ret)); DBGMSG(RECV, soap->buf, ret); soap->bufidx = 0; soap->chunksize -= ret; break; } t = tmp; if (!soap->chunkbuflen) { soap->chunkbuflen = ret = soap->frecv(soap, soap->buf, sizeof(soap->buf)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Read %u bytes (chunked) from socket=%d\n", (unsigned int)ret, soap->socket)); DBGMSG(RECV, soap->buf, ret); soap->bufidx = 0; if (!ret) { soap->ahead = EOF; return EOF; } } else soap->bufidx = soap->buflen; soap->buflen = soap->chunkbuflen; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Getting chunk size (idx=%u len=%u)\n", (unsigned int)soap->bufidx, (unsigned int)soap->buflen)); while (!soap_isxdigit((int)(c = soap_getchunkchar(soap)))) { if ((int)c == EOF) { soap->ahead = EOF; return EOF; } } do *t++ = (char)c; while (soap_isxdigit((int)(c = soap_getchunkchar(soap))) && (size_t)(t - tmp) < sizeof(tmp)-1); while ((int)c != EOF && c != '\n') c = soap_getchunkchar(soap); if ((int)c == EOF) { soap->ahead = EOF; return EOF; } *t = '\0'; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Chunk size = %s (hex)\n", tmp)); soap->chunksize = (size_t)soap_strtoul(tmp, &t, 16); if (!soap->chunksize) { soap->bufidx = soap->buflen = soap->chunkbuflen = 0; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of chunked message\n")); while ((int)c != EOF && c != '\n') c = soap_getchunkchar(soap); ret = 0; soap->ahead = EOF; break; } soap->buflen = soap->bufidx + soap->chunksize; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Moving buf len to idx=%u len=%u (%s)\n", (unsigned int)soap->bufidx, (unsigned int)soap->buflen, tmp)); if (soap->buflen > soap->chunkbuflen) { soap->buflen = soap->chunkbuflen; soap->chunksize -= soap->buflen - soap->bufidx; soap->chunkbuflen = 0; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Passed end of buffer for chunked HTTP (%u bytes left)\n", (unsigned int)(soap->buflen - soap->bufidx))); } else if (soap->chunkbuflen) soap->chunksize = 0; ret = soap->buflen - soap->bufidx; if (ret) break; } } else #endif { soap->bufidx = 0; soap->buflen = ret = soap->frecv(soap, soap->buf, sizeof(soap->buf)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Read %u bytes from socket=%d/fd=%d\n", (unsigned int)ret, soap->socket, soap->recvfd)); DBGMSG(RECV, soap->buf, ret); } #ifdef WITH_ZLIB if (soap->mode & SOAP_ENC_ZLIB) { soap_memcpy((void*)soap->z_buf, sizeof(soap->buf), (const void*)soap->buf, sizeof(soap->buf)); soap->d_stream->next_in = (Byte*)(soap->z_buf + soap->bufidx); soap->d_stream->avail_in = (unsigned int)ret; soap->d_stream->next_out = (Byte*)soap->buf; soap->d_stream->avail_out = sizeof(soap->buf); r = inflate(soap->d_stream, Z_NO_FLUSH); if (r == Z_NEED_DICT && soap->z_dict) r = inflateSetDictionary(soap->d_stream, (const Bytef*)soap->z_dict, soap->z_dict_len); if (r == Z_OK || r == Z_STREAM_END) { soap->bufidx = 0; soap->z_buflen = soap->buflen; soap->buflen = sizeof(soap->buf) - soap->d_stream->avail_out; if (soap->zlib_in == SOAP_ZLIB_GZIP) soap->z_crc = crc32(soap->z_crc, (Byte*)soap->buf, (unsigned int)soap->buflen); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflated %u bytes\n", (unsigned int)soap->buflen)); if (ret && !soap->buflen && r != Z_STREAM_END) goto zlib_again; ret = soap->buflen; if (r == Z_STREAM_END) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflated total %lu->%lu bytes\n", soap->d_stream->total_in, soap->d_stream->total_out)); soap->z_ratio_in = (float)soap->d_stream->total_in / (float)soap->d_stream->total_out; soap->d_stream->next_out = Z_NULL; } if (soap->count + ret > SOAP_MAXINFLATESIZE && soap->z_ratio_in < SOAP_MINDEFLATERATIO) { soap->d_stream->msg = (char*)"caught SOAP_MINDEFLATERATIO explosive decompression guard (remedy: increase SOAP_MAXINFLATESIZE and/or decrease SOAP_MINDEFLATERATIO)"; return soap->error = SOAP_ZLIB_ERROR; } DBGLOG(RECV, SOAP_MESSAGE(fdebug, "\n---- decompressed ----\n")); DBGMSG(RECV, soap->buf, ret); #ifndef WITH_LEANER if (soap->fpreparerecv && (r = soap->fpreparerecv(soap, soap->buf, ret))) return soap->error = r; #endif } else { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unable to inflate: (%d) %s\n", r, soap->d_stream->msg ? soap->d_stream->msg : SOAP_STR_EOS)); soap->d_stream->next_out = Z_NULL; return soap->error = SOAP_ZLIB_ERROR; } } #endif #ifndef WITH_LEANER if (soap->fpreparerecv #ifdef WITH_ZLIB && soap->zlib_in == SOAP_ZLIB_NONE #endif && (r = soap->fpreparerecv(soap, soap->buf + soap->bufidx, ret))) return soap->error = r; #endif if (ret) { soap->count += ret; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Read count=%lu (+%lu)\n", (unsigned long)soap->count, (unsigned long)ret)); return SOAP_OK; } return EOF; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_recv(struct soap *soap) { #ifndef WITH_LEANER if (soap->mode & SOAP_ENC_DIME) { if (soap->dime.buflen) { char *s; int i; unsigned char tmp[12]; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DIME hdr for chunked DIME is in buffer\n")); soap->count += soap->dime.buflen - soap->buflen; soap->buflen = soap->dime.buflen; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Skip padding (%ld bytes)\n", -(long)soap->dime.size&3)); for (i = -(long)soap->dime.size&3; i > 0; i--) { soap->bufidx++; if (soap->bufidx >= soap->buflen) if (soap_recv_raw(soap)) return EOF; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get DIME hdr for next chunk\n")); s = (char*)tmp; for (i = 12; i > 0; i--) { *s++ = soap->buf[soap->bufidx++]; if (soap->bufidx >= soap->buflen) if (soap_recv_raw(soap)) return EOF; } soap->dime.flags = tmp[0] & 0x7; soap->dime.size = ((size_t)tmp[8] << 24) | ((size_t)tmp[9] << 16) | ((size_t)tmp[10] << 8) | ((size_t)tmp[11]); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get DIME chunk (%u bytes)\n", (unsigned int)soap->dime.size)); if (soap->dime.flags & SOAP_DIME_CF) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "More chunking\n")); soap->dime.chunksize = soap->dime.size; if (soap->buflen - soap->bufidx >= soap->dime.size) { soap->dime.buflen = soap->buflen; soap->buflen = soap->bufidx + soap->dime.chunksize; } else soap->dime.chunksize -= soap->buflen - soap->bufidx; } else { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Last chunk\n")); soap->dime.buflen = 0; soap->dime.chunksize = 0; } soap->count = soap->buflen - soap->bufidx; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%u bytes remaining\n", (unsigned int)soap->count)); return SOAP_OK; } if (soap->dime.chunksize) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get next DIME hdr for chunked DIME (%u bytes chunk)\n", (unsigned int)soap->dime.chunksize)); if (soap_recv_raw(soap)) return EOF; if (soap->buflen - soap->bufidx >= soap->dime.chunksize) { soap->dime.buflen = soap->buflen; soap->count -= soap->buflen - soap->bufidx - soap->dime.chunksize; soap->buflen = soap->bufidx + soap->dime.chunksize; } else soap->dime.chunksize -= soap->buflen - soap->bufidx; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%lu bytes remaining, count=%lu\n", (unsigned long)(soap->buflen-soap->bufidx), (unsigned long)soap->count)); return SOAP_OK; } } while (soap->ffilterrecv) { int err; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Filter recverror = %d\n", soap->recverror)); if (soap->recverror) soap->bufidx = soap->buflen = 0; else { soap->recverror = soap_recv_raw(soap); /* do not call again after EOF */ soap->buflen -= soap->bufidx; /* chunked may set bufidx > 0 to skip hex chunk length */ } if ((err = soap->ffilterrecv(soap, soap->buf + soap->bufidx, &soap->buflen, sizeof(soap->buf) - soap->bufidx))) return soap->error = err; if (soap->buflen) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Filtered %lu\n", (unsigned long)soap->buflen)); soap->buflen += soap->bufidx; return SOAP_OK; } if (soap->recverror) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Returning postponed EOF%d\n", soap->recverror)); return soap->recverror; } } return soap->recverror = soap_recv_raw(soap); #else return soap_recv_raw(soap); #endif } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 soap_wchar SOAP_FMAC2 soap_getchar(struct soap *soap) { soap_wchar c; c = soap->ahead; if (c) { if (c != EOF) soap->ahead = 0; return c; } return soap_get1(soap); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 const struct soap_code_map* SOAP_FMAC2 soap_code(const struct soap_code_map *code_map, const char *str) { if (code_map && str) { while (code_map->string) { if (!strcmp(str, code_map->string)) /* case sensitive */ return code_map; code_map++; } } return NULL; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 LONG64 SOAP_FMAC2 soap_code_int(const struct soap_code_map *code_map, const char *str, LONG64 other) { if (code_map) { while (code_map->string) { if (!soap_tag_cmp(str, code_map->string)) /* case insensitive */ return code_map->code; code_map++; } } return other; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 const char* SOAP_FMAC2 soap_code_str(const struct soap_code_map *code_map, long code) { if (!code_map) return NULL; while (code_map->code != code && code_map->string) code_map++; return code_map->string; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 LONG64 SOAP_FMAC2 soap_code_bits(const struct soap_code_map *code_map, const char *str) { LONG64 bits = 0; if (code_map) { while (str && *str) { const struct soap_code_map *p; for (p = code_map; p->string; p++) { size_t n = strlen(p->string); if (!strncmp(p->string, str, n) && soap_blank((soap_wchar)str[n])) { bits |= p->code; str += n; while (*str > 0 && *str <= 32) str++; break; } } if (!p->string) return 0; } } return bits; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 const char* SOAP_FMAC2 soap_code_list(struct soap *soap, const struct soap_code_map *code_map, long code) { char *t = soap->tmpbuf; if (code_map) { while (code_map->string) { if (code_map->code & code) { const char *s = code_map->string; if (t != soap->tmpbuf) *t++ = ' '; while (*s && t < soap->tmpbuf + sizeof(soap->tmpbuf) - 1) *t++ = *s++; if (t == soap->tmpbuf + sizeof(soap->tmpbuf) - 1) break; } code_map++; } } *t = '\0'; return soap->tmpbuf; } #endif /******************************************************************************/ #ifndef PALM_1 static soap_wchar soap_char(struct soap *soap) { char tmp[8]; int i; soap_wchar c; char *s = tmp; for (i = 0; i < 7; i++) { c = soap_get1(soap); if (c == ';' || (int)c == EOF) break; *s++ = (char)c; } *s = '\0'; if (*tmp == '#') { if (tmp[1] == 'x' || tmp[1] == 'X') return (soap_wchar)soap_strtol(tmp + 2, NULL, 16); return (soap_wchar)soap_strtol(tmp + 1, NULL, 10); } if (!strcmp(tmp, "lt")) return '<'; if (!strcmp(tmp, "gt")) return '>'; if (!strcmp(tmp, "amp")) return '&'; if (!strcmp(tmp, "quot")) return '"'; if (!strcmp(tmp, "apos")) return '\''; #ifndef WITH_LEAN return (soap_wchar)soap_code_int(html_entity_codes, tmp, (LONG64)SOAP_UNKNOWN_CHAR); #else return SOAP_UNKNOWN_CHAR; /* use this to represent unknown code */ #endif } #endif /******************************************************************************/ #ifdef WITH_LEAN #ifndef PALM_1 soap_wchar soap_get0(struct soap *soap) { if (soap->bufidx >= soap->buflen && soap_recv(soap)) return EOF; return (unsigned char)soap->buf[soap->bufidx]; } #endif #endif /******************************************************************************/ #ifdef WITH_LEAN #ifndef PALM_1 soap_wchar soap_get1(struct soap *soap) { if (soap->bufidx >= soap->buflen && soap_recv(soap)) return EOF; return (unsigned char)soap->buf[soap->bufidx++]; } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 soap_wchar SOAP_FMAC2 soap_get(struct soap *soap) { soap_wchar c; c = soap->ahead; if (c) { if ((int)c != EOF) soap->ahead = 0; } else c = soap_get1(soap); while ((int)c != EOF) { if (soap->cdata) { if (c == ']') { c = soap_get1(soap); if (c == ']') { c = soap_get0(soap); if (c == '>') { soap->cdata = 0; c = soap_get1(soap); c = soap_get1(soap); } else { soap_unget(soap, ']'); return ']'; } } else { soap_revget1(soap); return ']'; } } else return c; } switch (c) { case '<': do c = soap_get1(soap); while (soap_blank(c)); if (c == '!' || c == '?' || c == '%') { int k = 1; if (c == '!') { c = soap_get1(soap); if (c == '[') { do c = soap_get1(soap); while ((int)c != EOF && c != '['); if ((int)c == EOF) break; soap->cdata = 1; c = soap_get1(soap); continue; } if (c == '-' && (c = soap_get1(soap)) == '-') { do { c = soap_get1(soap); if (c == '-' && (c = soap_get1(soap)) == '-') break; } while ((int)c != EOF); } } else if (c == '?') c = soap_get_pi(soap); while ((int)c != EOF) { if (c == '<') k++; else if (c == '>') { if (--k <= 0) break; } c = soap_get1(soap); } if ((int)c == EOF) break; c = soap_get1(soap); continue; } if (c == '/') return SOAP_TT; soap_revget1(soap); return SOAP_LT; case '>': return SOAP_GT; case '"': return SOAP_QT; case '\'': return SOAP_AP; case '&': return soap_char(soap) | 0x80000000; } break; } return c; } #endif /******************************************************************************/ #ifndef PALM_1 static soap_wchar soap_get_pi(struct soap *soap) { char buf[64]; char *s = buf; int i = sizeof(buf); soap_wchar c = soap_getchar(soap); /* This is a quick way to parse XML PI and we could use a callback instead to * enable applications to intercept processing instructions */ while ((int)c != EOF && c != '?') { if (--i > 0) { if (soap_blank(c)) c = ' '; *s++ = (char)c; } c = soap_getchar(soap); } *s = '\0'; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "XML PI \n", buf)); if (!strncmp(buf, "xml ", 4)) { s = strstr(buf, " encoding="); if (s && s[10]) { if (!soap_tag_cmp(s + 11, "iso-8859-1*") || !soap_tag_cmp(s + 11, "latin1*")) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Switching to latin1 encoding\n")); soap->mode |= SOAP_ENC_LATIN; } else if (!soap_tag_cmp(s + 11, "utf-8*")) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Switching to utf-8 encoding\n")); soap->mode &= ~SOAP_ENC_LATIN; } } } if ((int)c != EOF) c = soap_getchar(soap); return c; } #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_move(struct soap *soap, size_t n) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Moving %lu bytes forward\n", (unsigned long)n)); for (; n; n--) if ((int)soap_getchar(soap) == EOF) return SOAP_EOF; return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 size_t SOAP_FMAC2 soap_tell(struct soap *soap) { return soap->count - soap->buflen + soap->bufidx - (soap->ahead != 0); } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_pututf8(struct soap *soap, unsigned long c) { char tmp[24]; if ((c < 0x7F && c > 0x1F)) { *tmp = (char)c; return soap_send_raw(soap, tmp, 1); } #ifdef WITH_REPLACE_ILLEGAL_UTF8 if (!(c == 0x09 || c == 0x0A || c == 0x0D || (c >= 0x80 && c <= 0xD7FF) || (c >= 0xE000 && c <= 0xFFFD) || (c >= 0x10000 && c <= 0x10FFFF))) c = SOAP_UNKNOWN_UNICODE_CHAR; #endif #ifndef WITH_LEAN if (c > 0x9F) { char *t = tmp; if (c < 0x0800) *t++ = (char)(0xC0 | ((c >> 6) & 0x1F)); else { if (c < 0x010000) *t++ = (char)(0xE0 | ((c >> 12) & 0x0F)); else { if (c < 0x200000) *t++ = (char)(0xF0 | ((c >> 18) & 0x07)); else { if (c < 0x04000000) *t++ = (char)(0xF8 | ((c >> 24) & 0x03)); else { *t++ = (char)(0xFC | ((c >> 30) & 0x01)); *t++ = (char)(0x80 | ((c >> 24) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 18) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 12) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 6) & 0x3F)); } *t++ = (char)(0x80 | (c & 0x3F)); *t = '\0'; } else #endif (SOAP_SNPRINTF(tmp, sizeof(tmp), 20), "&#x%lX;", c); return soap_send(soap, tmp); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 soap_wchar SOAP_FMAC2 soap_getutf8(struct soap *soap) { soap_wchar c, c1, c2, c3, c4; c = soap->ahead; if (c >= 0x80) soap->ahead = 0; else c = soap_get(soap); if (c < 0x80 || c > 0xFF || (soap->mode & SOAP_ENC_LATIN)) return c; c1 = soap_get1(soap); if (c1 < 0x80) { soap_revget1(soap); /* doesn't look like this is UTF8 */ return c; } c1 &= 0x3F; if (c < 0xE0) return ((soap_wchar)(c & 0x1F) << 6) | c1; c2 = (soap_wchar)soap_get1(soap) & 0x3F; if (c < 0xF0) return ((soap_wchar)(c & 0x0F) << 12) | (c1 << 6) | c2; c3 = (soap_wchar)soap_get1(soap) & 0x3F; if (c < 0xF8) return ((soap_wchar)(c & 0x07) << 18) | (c1 << 12) | (c2 << 6) | c3; c4 = (soap_wchar)soap_get1(soap) & 0x3F; if (c < 0xFC) return ((soap_wchar)(c & 0x03) << 24) | (c1 << 18) | (c2 << 12) | (c3 << 6) | c4; return ((soap_wchar)(c & 0x01) << 30) | (c1 << 24) | (c2 << 18) | (c3 << 12) | (c4 << 6) | (soap_wchar)(soap_get1(soap) & 0x3F); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 size_t SOAP_FMAC2 soap_utf8len(const char *s) { size_t l = 0; while (*s) if ((*s++ & 0xC0) != 0x80) l++; return l; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_puthex(struct soap *soap, const unsigned char *s, int n) { char d[2]; int i; #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { if (!(soap->dom->text = soap_s2hex(soap, s, NULL, n))) return soap->error; return SOAP_OK; } #endif for (i = 0; i < n; i++) { int m = *s++; d[0] = (char)((m >> 4) + (m > 159 ? '7' : '0')); m &= 0x0F; d[1] = (char)(m + (m > 9 ? '7' : '0')); if (soap_send_raw(soap, d, 2)) return soap->error; } return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 unsigned char* SOAP_FMAC2 soap_gethex(struct soap *soap, int *n) { #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { soap->dom->text = soap_string_in(soap, 0, -1, -1, NULL); return (unsigned char*)soap_hex2s(soap, soap->dom->text, NULL, 0, n); } #endif #ifdef WITH_FAST soap->labidx = 0; for (;;) { char *s; size_t i, k; if (soap_append_lab(soap, NULL, 0)) return NULL; s = soap->labbuf + soap->labidx; k = soap->lablen - soap->labidx; soap->labidx = soap->lablen; for (i = 0; i < k; i++) { char d1, d2; soap_wchar c; c = soap_get(soap); if (soap_isxdigit(c)) { d1 = (char)c; c = soap_get(soap); if (soap_isxdigit(c)) d2 = (char)c; else { soap->error = SOAP_TYPE; return NULL; } } else { unsigned char *p; size_t l = soap->lablen + i - k; soap_unget(soap, c); if (n) *n = (int)l; p = (unsigned char*)soap_malloc(soap, l); if (p) soap_memcpy((void*)p, l, (const void*)soap->labbuf, l); return p; } *s++ = (char)(((d1 >= 'A' ? (d1 & 0x7) + 9 : d1 - '0') << 4) + (d2 >= 'A' ? (d2 & 0x7) + 9 : d2 - '0')); } } #else if (soap_new_block(soap) == NULL) return NULL; for (;;) { int i; char *s = (char*)soap_push_block(soap, NULL, SOAP_BLKLEN); if (!s) { soap_end_block(soap, NULL); return NULL; } for (i = 0; i < SOAP_BLKLEN; i++) { char d1, d2; soap_wchar c = soap_get(soap); if (soap_isxdigit(c)) { d1 = (char)c; c = soap_get(soap); if (soap_isxdigit(c)) d2 = (char)c; else { soap_end_block(soap, NULL); soap->error = SOAP_TYPE; return NULL; } } else { unsigned char *p; soap_unget(soap, c); if (n) *n = (int)soap_size_block(soap, NULL, i); p = (unsigned char*)soap_save_block(soap, NULL, NULL, 0); return p; } *s++ = ((d1 >= 'A' ? (d1 & 0x7) + 9 : d1 - '0') << 4) + (d2 >= 'A' ? (d2 & 0x7) + 9 : d2 - '0'); } } #endif } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_putbase64(struct soap *soap, const unsigned char *s, int n) { int i; unsigned long m; char d[4]; if (!s) return SOAP_OK; #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { if (!(soap->dom->text = soap_s2base64(soap, s, NULL, n))) return soap->error; return SOAP_OK; } #endif for (; n > 2; n -= 3, s += 3) { m = s[0]; m = (m << 8) | s[1]; m = (m << 8) | s[2]; for (i = 4; i > 0; m >>= 6) d[--i] = soap_base64o[m & 0x3F]; if (soap_send_raw(soap, d, 4)) return soap->error; } if (n > 0) { m = 0; for (i = 0; i < n; i++) m = (m << 8) | *s++; for (; i < 3; i++) m <<= 8; for (i++; i > 0; m >>= 6) d[--i] = soap_base64o[m & 0x3F]; for (i = 3; i > n; i--) d[i] = '='; if (soap_send_raw(soap, d, 4)) return soap->error; } return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 unsigned char* SOAP_FMAC2 soap_getbase64(struct soap *soap, int *n, int malloc_flag) { (void)malloc_flag; #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { soap->dom->text = soap_string_in(soap, 0, -1, -1, NULL); return (unsigned char*)soap_base642s(soap, soap->dom->text, NULL, 0, n); } #endif #ifdef WITH_FAST soap->labidx = 0; for (;;) { size_t i, k; char *s; if (soap_append_lab(soap, NULL, 2)) return NULL; s = soap->labbuf + soap->labidx; k = soap->lablen - soap->labidx; soap->labidx = 3 * (soap->lablen / 3); if (k > 2) { for (i = 0; i < k - 2; i += 3) { unsigned long m = 0; int j = 0; do { soap_wchar c = soap_get(soap); if (c < SOAP_AP) c &= 0x7FFFFFFF; if (c == '=' || c < 0) { unsigned char *p; size_t l; switch (j) { case 2: *s++ = (char)((m >> 4) & 0xFF); i++; break; case 3: *s++ = (char)((m >> 10) & 0xFF); *s++ = (char)((m >> 2) & 0xFF); i += 2; } l = soap->lablen + i - k; if (n) *n = (int)l; p = (unsigned char*)soap_malloc(soap, l); if (p) soap_memcpy((void*)p, l, (const void*)soap->labbuf, l); if (c >= 0) { while ((int)((c = soap_get(soap)) != EOF) && c != SOAP_LT && c != SOAP_TT) continue; } soap_unget(soap, c); return p; } c -= '+'; if (c >= 0 && c <= 79) { int b = soap_base64i[c]; if (b >= 64) { soap->error = SOAP_TYPE; return NULL; } m = (m << 6) + b; j++; } else if (!soap_blank(c + '+')) { soap->error = SOAP_TYPE; return NULL; } } while (j < 4); *s++ = (char)((m >> 16) & 0xFF); *s++ = (char)((m >> 8) & 0xFF); *s++ = (char)(m & 0xFF); } } } #else if (soap_new_block(soap) == NULL) return NULL; for (;;) { int i; char *s = (char*)soap_push_block(soap, NULL, 3 * SOAP_BLKLEN); /* must be multiple of 3 */ if (!s) { soap_end_block(soap, NULL); return NULL; } for (i = 0; i < SOAP_BLKLEN; i++) { unsigned long m = 0; int j = 0; do { soap_wchar c = soap_get(soap); if (c == '=' || c < 0) { unsigned char *p; i *= 3; switch (j) { case 2: *s++ = (char)((m >> 4) & 0xFF); i++; break; case 3: *s++ = (char)((m >> 10) & 0xFF); *s++ = (char)((m >> 2) & 0xFF); i += 2; } if (n) *n = (int)soap_size_block(soap, NULL, i); p = (unsigned char*)soap_save_block(soap, NULL, NULL, 0); if (c >= 0) { while ((int)((c = soap_get(soap)) != EOF) && c != SOAP_LT && c != SOAP_TT) continue; } soap_unget(soap, c); return p; } c -= '+'; if (c >= 0 && c <= 79) { int b = soap_base64i[c]; if (b >= 64) { soap->error = SOAP_TYPE; return NULL; } m = (m << 6) + b; j++; } else if (!soap_blank(c)) { soap->error = SOAP_TYPE; return NULL; } } while (j < 4); *s++ = (char)((m >> 16) & 0xFF); *s++ = (char)((m >> 8) & 0xFF); *s++ = (char)(m & 0xFF); } } #endif } #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_xop_forward(struct soap *soap, unsigned char **ptr, int *size, char **id, char **type, char **options) { /* Check MTOM xop:Include element (within hex/base64Binary) */ /* TODO: this code to be obsoleted with new import/xop.h conventions */ short body = soap->body; /* should save type too? */ if (!soap_peek_element(soap)) { if (!soap_element_begin_in(soap, "xop:Include", 0, NULL)) { if (soap_attachment_forward(soap, ptr, size, id, type, options) || (soap->body && soap_element_end_in(soap, "xop:Include"))) return soap->error; } } soap->body = body; return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_attachment_forward(struct soap *soap, unsigned char **ptr, int *size, char **id, char **type, char **options) { struct soap_xlist *xp; *ptr = NULL; *size = 0; *id = NULL; *type = NULL; *options = NULL; if (!*soap->href) return SOAP_OK; *id = soap_strdup(soap, soap->href); xp = (struct soap_xlist*)SOAP_MALLOC(soap, sizeof(struct soap_xlist)); if (!xp) return soap->error = SOAP_EOM; xp->next = soap->xlist; xp->ptr = ptr; xp->size = size; xp->id = *id; xp->type = type; xp->options = options; soap->xlist = xp; return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void * SOAP_FMAC2 soap_memdup(struct soap *soap, const void *s, size_t n) { void *t = NULL; if (s && (t = soap_malloc(soap, n))) soap_memcpy(t, n, s, n); return t; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 char * SOAP_FMAC2 soap_strdup(struct soap *soap, const char *s) { char *t = NULL; if (s) { size_t l = strlen(s) + 1; if ((t = (char*)soap_malloc(soap, l))) soap_memcpy((void*)t, l, (const void*)s, l); } return t; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 wchar_t * SOAP_FMAC2 soap_wstrdup(struct soap *soap, const wchar_t *s) { wchar_t *t = NULL; if (s) { size_t n = 0; while (s[n]) n++; n = sizeof(wchar_t)*(n+1); if ((t = (wchar_t*)soap_malloc(soap, n))) soap_memcpy((void*)t, n, (const void*)s, n); } return t; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 char * SOAP_FMAC2 soap_strtrim(struct soap *soap, char *s) { (void)soap; if (s) { char *t; while ((*s >= 9 && *s <= 13) || *s == 32) s++; t = s; while (*t) t++; while (--t > s && ((*t >= 9 && *t <= 13) || *t == 32)) continue; t[1] = '\0'; } return s; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 wchar_t * SOAP_FMAC2 soap_wstrtrim(struct soap *soap, wchar_t *s) { (void)soap; if (s) { wchar_t *t; while ((*s >= 9 && *s <= 13) || *s == 32) s++; t = s; while (*t) t++; while (--t > s && ((*t >= 9 && *t <= 13) || *t == 32)) continue; t[1] = L'\0'; } return s; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 struct soap_blist* SOAP_FMAC2 soap_new_block(struct soap *soap) { struct soap_blist *p; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "New block sequence (prev=%p)\n", soap->blist)); if (!(p = (struct soap_blist*)SOAP_MALLOC(soap, sizeof(struct soap_blist)))) { soap->error = SOAP_EOM; return NULL; } p->next = soap->blist; p->head = NULL; p->size = 0; soap->blist = p; return p; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void* SOAP_FMAC2 soap_push_block(struct soap *soap, struct soap_blist *b, size_t n) { struct soap_bhead *p; if (!b) b = soap->blist; if (!(p = (struct soap_bhead*)SOAP_MALLOC(soap, sizeof(struct soap_bhead) + n))) { soap->error = SOAP_EOM; return NULL; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Push block %p of %u bytes (%u bytes total)\n", p, (unsigned int)n, (unsigned int)b->size + (unsigned int)n)); p->next = b->head; b->head = p; p->size = n; b->size += n; return (void*)(p + 1); /* skip block header and point to n allocated bytes */ } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_pop_block(struct soap *soap, struct soap_blist *b) { struct soap_bhead *p; if (!b) b = soap->blist; if (!b->head) return; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Pop block\n")); p = b->head; b->size -= p->size; b->head = p->next; SOAP_FREE(soap, p); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_update_pointers(struct soap *soap, const char *dst, const char *src, size_t len) { const void *start = src, *end = src + len; #ifndef WITH_LEANER struct soap_xlist *xp; #endif #ifndef WITH_NOIDREF if ((soap->version && !(soap->imode & SOAP_XML_TREE)) || (soap->mode & SOAP_XML_GRAPH)) { int i; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Update pointers %p (%lu bytes) -> %p\n", src, (unsigned long)len, dst)); for (i = 0; i < SOAP_IDHASH; i++) { struct soap_ilist *ip; for (ip = soap->iht[i]; ip; ip = ip->next) { struct soap_flist *fp; void *p, **q; if (ip->shaky) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Update shaky id='%s'\n", ip->id)); if (ip->ptr && ip->ptr >= start && ip->ptr < end) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Update ptr %p -> %p\n", ip->ptr, (const char*)ip->ptr + (dst-src))); ip->ptr = (void*)((const char*)ip->ptr + (dst-src)); } for (q = &ip->link; q; q = (void**)p) { p = *q; if (p && p >= start && p < end) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Link update id='%s' %p -> %p\n", ip->id, p, (const char*)p + (dst-src))); *q = (void*)((const char*)p + (dst-src)); } } for (q = &ip->copy; q; q = (void**)p) { p = *q; if (p && p >= start && p < end) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy chain update id='%s' %p -> %p\n", ip->id, p, (const char*)p + (dst-src))); *q = (void*)((const char*)p + (dst-src)); } } for (fp = ip->flist; fp; fp = fp->next) { if (fp->ptr >= start && fp->ptr < end) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy list update id='%s' target type=%d %p -> %p\n", ip->id, fp->type, fp->ptr, (char*)fp->ptr + (dst-src))); fp->ptr = (void*)((const char*)fp->ptr + (dst-src)); } } if (ip->smart && ip->smart >= start && ip->smart < end) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Smart shared pointer update %p -> %p\n", ip->smart, (const char*)ip->smart + (dst-src))); ip->smart = (void*)((const char*)ip->smart + (dst-src)); } } } } } #else (void)soap; (void)start; (void)end; (void)dst; (void)src; #endif #ifndef WITH_LEANER for (xp = soap->xlist; xp; xp = xp->next) { if (xp->ptr && (void*)xp->ptr >= start && (void*)xp->ptr < end) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Update attachment id='%s' %p -> %p\n", xp->id ? xp->id : SOAP_STR_EOS, xp->ptr, (char*)xp->ptr + (dst-src))); xp->ptr = (unsigned char**)((char*)xp->ptr + (dst-src)); xp->size = (int*)((char*)xp->size + (dst-src)); xp->type = (char**)((char*)xp->type + (dst-src)); xp->options = (char**)((char*)xp->options + (dst-src)); } } #endif } #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_1 static int soap_has_copies(struct soap *soap, const char *start, const char *end) { int i; struct soap_ilist *ip = NULL; struct soap_flist *fp = NULL; const char *p; for (i = 0; i < SOAP_IDHASH; i++) { for (ip = soap->iht[i]; ip; ip = ip->next) { for (p = (const char*)ip->copy; p; p = *(const char**)p) if (p >= start && p < end) return SOAP_ERR; for (fp = ip->flist; fp; fp = fp->next) if (fp->type == ip->type && (const char*)fp->ptr >= start && (const char*)fp->ptr < end) return SOAP_ERR; } } return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_resolve(struct soap *soap) { int i; short flag; const char *id; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolving forwarded refs\n")); for (i = 0; i < SOAP_IDHASH; i++) { struct soap_ilist *ip; for (ip = soap->iht[i]; ip; ip = ip->next) { if (ip->ptr) { void **q; struct soap_flist *fp, **fpp = &ip->flist; if (ip->spine) ip->spine[0] = ip->ptr; q = (void**)ip->link; ip->link = NULL; DBGLOG(TEST, if (q) SOAP_MESSAGE(fdebug, "Traversing link chain to resolve id='%s' type=%d\n", ip->id, ip->type)); while (q) { void *p = *q; *q = ip->ptr; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "... link %p -> %p\n", q, ip->ptr)); q = (void**)p; } while ((fp = *fpp)) { if (fp->level > 0 && fp->finsert) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "... insert type=%d link %p -> %p\n", fp->type, fp->ptr, ip->ptr)); if (ip->spine && fp->level <= SOAP_MAXPTRS) fp->finsert(soap, ip->type, fp->type, fp->ptr, fp->index, &ip->spine[fp->level - 1], &ip->smart); else if (fp->level == 1) fp->finsert(soap, ip->type, fp->type, fp->ptr, fp->index, &ip->ptr, &ip->smart); else if (fp->level <= SOAP_MAXPTRS) { int i; if (!(ip->spine = (void**)soap_malloc(soap, SOAP_MAXPTRS * sizeof(void*)))) return soap->error = SOAP_EOM; ip->spine[0] = ip->ptr; for (i = 1; i < SOAP_MAXPTRS; i++) ip->spine[i] = &ip->spine[i - 1]; fp->finsert(soap, ip->type, fp->type, fp->ptr, fp->index, &ip->spine[fp->level - 1], &ip->smart); } *fpp = fp->next; SOAP_FREE(soap, fp); } else fpp = &fp->next; } } else if (*ip->id == '#') { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Missing id='%s'\n", ip->id)); soap_strcpy(soap->id, sizeof(soap->id), ip->id + 1); return soap->error = SOAP_MISSING_ID; } } } do { flag = 0; id = NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolution phase\n")); for (i = 0; i < SOAP_IDHASH; i++) { struct soap_ilist *ip; for (ip = soap->iht[i]; ip; ip = ip->next) { if (ip->copy || ip->flist) { if (ip->ptr && !soap_has_copies(soap, (const char*)ip->ptr, (const char*)ip->ptr + ip->size)) { struct soap_flist *fp; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolving id='%s' type=%d ptr=%p size=%lu ...\n", ip->id, ip->type, ip->ptr, (unsigned long)ip->size)); if (ip->copy) { void *p, **q = (void**)ip->copy; DBGLOG(TEST, if (q) SOAP_MESSAGE(fdebug, "Traversing copy chain to resolve id='%s'\n", ip->id)); ip->copy = NULL; do { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "... copy %p -> %p (%u bytes)\n", ip->ptr, q, (unsigned int)ip->size)); p = *q; soap_memcpy((void*)q, ip->size, (const void*)ip->ptr, ip->size); q = (void**)p; } while (q); flag = 1; } while ((fp = ip->flist)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolving forwarded data type=%d target type=%d location=%p level=%u id='%s'\n", ip->type, fp->type, ip->ptr, fp->level, ip->id)); if (fp->level == 0) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "... copy %p -> %p (%lu bytes)\n", ip->ptr, fp->ptr, (unsigned long)ip->size)); if (fp->finsert) fp->finsert(soap, ip->type, fp->type, fp->ptr, fp->index, ip->ptr, &ip->smart); else soap_memcpy((void*)fp->ptr, ip->size, (const void*)ip->ptr, ip->size); } ip->flist = fp->next; SOAP_FREE(soap, fp); flag = 1; } } else id = ip->id; } } } } while (flag); if (id) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolution error: forwarded data for id='%s' could not be propagated, please report this problem to the gSOAP developers\n", id)); return soap_id_nullify(soap, id); } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolution done\n")); return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 size_t SOAP_FMAC2 soap_size_block(struct soap *soap, struct soap_blist *b, size_t n) { if (!b) b = soap->blist; if (b->head) { b->size -= b->head->size - n; b->head->size = n; } return b->size; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 char* SOAP_FMAC2 soap_first_block(struct soap *soap, struct soap_blist *b) { struct soap_bhead *p, *q, *r; if (!b) b = soap->blist; p = b->head; if (!p) return NULL; r = NULL; do { q = p->next; p->next = r; r = p; p = q; } while (p); b->head = r; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "First block %p\n", r + 1)); return (char*)(r + 1); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 char* SOAP_FMAC2 soap_next_block(struct soap *soap, struct soap_blist *b) { struct soap_bhead *p; if (!b) b = soap->blist; p = b->head; if (p) { b->head = p->next; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Next block %p, deleting current block\n", b->head + 1)); SOAP_FREE(soap, p); if (b->head) return (char*)(b->head + 1); } return NULL; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 size_t SOAP_FMAC2 soap_block_size(struct soap *soap, struct soap_blist *b) { if (!b) b = soap->blist; return b->head->size; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_end_block(struct soap *soap, struct soap_blist *b) { struct soap_bhead *p, *q; if (!b) b = soap->blist; if (b) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of block sequence, free all remaining blocks\n")); for (p = b->head; p; p = q) { q = p->next; SOAP_FREE(soap, p); } if (soap->blist == b) soap->blist = b->next; else { struct soap_blist *bp; for (bp = soap->blist; bp; bp = bp->next) { if (bp->next == b) { bp->next = b->next; break; } } } SOAP_FREE(soap, b); } DBGLOG(TEST, if (soap->blist) SOAP_MESSAGE(fdebug, "Restored previous block sequence\n")); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 char* SOAP_FMAC2 soap_save_block(struct soap *soap, struct soap_blist *b, char *p, int flag) { size_t n; char *q, *s; if (!b) b = soap->blist; if (b->size) { if (!p) p = (char*)soap_malloc(soap, b->size); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Save all blocks in contiguous memory space of %u bytes (%p->%p)\n", (unsigned int)b->size, b->head, p)); if (p) { s = p; for (q = soap_first_block(soap, b); q; q = soap_next_block(soap, b)) { n = soap_block_size(soap, b); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy %u bytes from %p to %p\n", (unsigned int)n, q, s)); if (flag) soap_update_pointers(soap, s, q, n); soap_memcpy((void*)s, n, (const void*)q, n); s += n; } } else soap->error = SOAP_EOM; } soap_end_block(soap, b); #ifndef WITH_NOIDREF if (!soap->blist && ((soap->version && !(soap->imode & SOAP_XML_TREE)) || (soap->mode & SOAP_XML_GRAPH))) { int i; struct soap_ilist *ip = NULL; for (i = 0; i < SOAP_IDHASH; i++) for (ip = soap->iht[i]; ip; ip = ip->next) ip->shaky = 0; } #endif return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 char * SOAP_FMAC2 soap_putsizesoffsets(struct soap *soap, const char *type, const int *size, const int *offset, int dim) { int i; const char *t = ",%d"; if (!type) return NULL; if (soap->version == 2) t = " %d"; if (soap->version != 2 && offset) { (SOAP_SNPRINTF(soap->type, sizeof(soap->type) - 1, strlen(type) + 20), "%s[%d", type, size[0] + offset[0]); for (i = 1; i < dim; i++) { size_t l = strlen(soap->type); (SOAP_SNPRINTF(soap->type + l, sizeof(soap->type) - l - 1, 20), t, size[i] + offset[i]); } } else { (SOAP_SNPRINTF(soap->type, sizeof(soap->type) - 1, strlen(type) + 20), "%s[%d", type, size[0]); for (i = 1; i < dim; i++) { size_t l = strlen(soap->type); (SOAP_SNPRINTF(soap->type + l, sizeof(soap->type) - l - 1, 20), t, size[i]); } } soap_strncat(soap->type, sizeof(soap->type), "]", 1); return soap->type; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 char * SOAP_FMAC2 soap_putoffsets(struct soap *soap, const int *offset, int dim) { int i; soap->arrayOffset[0] = '\0'; if (soap->version == 1) { (SOAP_SNPRINTF(soap->arrayOffset, sizeof(soap->arrayOffset) - 1, 20), "[%d", offset[0]); for (i = 1; i < dim; i++) { size_t l = strlen(soap->arrayOffset); (SOAP_SNPRINTF(soap->arrayOffset + l, sizeof(soap->arrayOffset) - l - 1, 20), ",%d", offset[i]); } soap_strncat(soap->arrayOffset, sizeof(soap->arrayOffset), "]", 1); } return soap->arrayOffset; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 size_t SOAP_FMAC2 soap_size(const int *size, int dim) { int i; size_t n = 0; if (size[0] <= 0) return 0; n = (size_t)size[0]; for (i = 1; i < dim; i++) { if (size[i] <= 0) return 0; n *= (size_t)size[i]; } return (size_t)n; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 size_t SOAP_FMAC2 soap_getsizes(const char *attr, int *size, int dim) { size_t i, k, n; if (!*attr) return 0; i = strlen(attr); n = 1; do { for (; i > 0; i--) if (attr[i - 1] == '[' || attr[i - 1] == ',' || attr[i - 1] == ' ') break; n *= k = (size_t)soap_strtoul(attr + i, NULL, 10); size[--dim] = (int)k; if (n > SOAP_MAXARRAYSIZE) return 0; } while (dim > 0 && --i > 0 && attr[i] != '['); return n; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_getoffsets(const char *attr, const int *size, int *offset, int dim) { int i, j = 0; if (offset) { for (i = 0; i < dim && attr && *attr; i++) { attr++; j *= size[i]; j += offset[i] = (int)soap_strtol(attr, NULL, 10); attr = strchr(attr, ','); } } else { for (i = 0; i < dim && attr && *attr; i++) { attr++; j *= size[i]; j += (int)soap_strtol(attr, NULL, 10); attr = strchr(attr, ','); } } return j; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_getposition(const char *attr, int *pos) { int i, n; if (!*attr) return -1; n = 0; i = 1; do { pos[n++] = (int)soap_strtol(attr + i, NULL, 10); while (attr[i] && attr[i] != ',' && attr[i] != ']') i++; if (attr[i] == ',') i++; } while (n < SOAP_MAXDIMS && attr[i] && attr[i] != ']'); return n; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 struct soap_nlist * SOAP_FMAC2 soap_push_namespace(struct soap *soap, const char *id, const char *ns) { struct soap_nlist *np; struct Namespace *p; short i = -1; size_t n, k; n = strlen(id); k = strlen(ns) + 1; p = soap->local_namespaces; if (p) { for (i = 0; p->id; p++, i++) { if (p->ns && !strcmp(ns, p->ns)) break; if (p->out) { if (!strcmp(ns, p->out)) break; } else if (p->in) { if (!soap_tag_cmp(ns, p->in)) { if ((p->out = (char*)SOAP_MALLOC(soap, k))) soap_strcpy(p->out, k, ns); break; } } } if (!p->id) i = -1; } if (i >= 0) k = 0; np = (struct soap_nlist*)SOAP_MALLOC(soap, sizeof(struct soap_nlist) + n + k); if (!np) { soap->error = SOAP_EOM; return NULL; } np->next = soap->nlist; soap->nlist = np; np->level = soap->level; np->index = i; soap_strcpy((char*)np->id, n + 1, id); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Push namespace binding (level=%u) '%s'='%s'\n", soap->level, id, ns)); if (i < 0) { np->ns = np->id + n + 1; soap_strcpy((char*)np->ns, k, ns); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Push NOT OK: no match found for '%s' in namespace mapping table (added to stack anyway)\n", ns)); } else { np->ns = NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Push OK ('%s' matches '%s' in namespace table)\n", id, p->id)); } return np; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_pop_namespace(struct soap *soap) { struct soap_nlist *np, *nq; for (np = soap->nlist; np && np->level >= soap->level; np = nq) { nq = np->next; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Pop namespace binding (level=%u) '%s' level=%u\n", soap->level, np->id, np->level)); SOAP_FREE(soap, np); } soap->nlist = np; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_match_namespace(struct soap *soap, const char *id1, const char *id2, size_t n1, size_t n2) { struct soap_nlist *np = soap->nlist; const char *s; while (np && (strncmp(np->id, id1, n1) || np->id[n1])) np = np->next; if (np) { if (!(soap->mode & SOAP_XML_IGNORENS) && (n2 > 0 || !np->ns || *np->ns)) { if (np->index < 0 || ((s = soap->local_namespaces[np->index].id) && (strncmp(s, id2, n2) || (s[n2] && s[n2] != '_')))) return SOAP_NAMESPACE; } return SOAP_OK; } if (n1 == 0) return n2 == 0 || (soap->mode & SOAP_XML_IGNORENS) ? SOAP_OK : SOAP_NAMESPACE; if ((n1 == 3 && n1 == n2 && !strncmp(id1, "xml", 3) && !strncmp(id1, id2, 3)) || (soap->mode & SOAP_XML_IGNORENS)) return SOAP_OK; return soap->error = SOAP_SYNTAX_ERROR; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_current_namespace(struct soap *soap, const char *tag) { struct soap_nlist *np; const char *s; if (!tag || !strncmp(tag, "xml", 3)) return NULL; np = soap->nlist; if (!(s = strchr(tag, ':'))) { while (np && *np->id) /* find default namespace, if present */ np = np->next; } else { while (np && (strncmp(np->id, tag, s - tag) || np->id[s - tag])) np = np->next; if (!np) soap->error = SOAP_NAMESPACE; } if (np) { if (np->index >= 0) return soap->namespaces[np->index].ns; if (np->ns && *np->ns) return soap_strdup(soap, np->ns); } return NULL; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_tag_cmp(const char *s, const char *t) { for (;;) { int c1 = *s; int c2 = *t; if (!c1 || c1 == '"') break; if (c2 != '-') { if (c1 != c2) { if (c1 >= 'A' && c1 <= 'Z') c1 += 'a' - 'A'; if (c2 >= 'A' && c2 <= 'Z') c2 += 'a' - 'A'; } if (c1 != c2) { if (c2 != '*') return 1; c2 = *++t; if (!c2) return 0; if (c2 >= 'A' && c2 <= 'Z') c2 += 'a' - 'A'; for (;;) { c1 = *s; if (!c1 || c1 == '"') break; if (c1 >= 'A' && c1 <= 'Z') c1 += 'a' - 'A'; if (c1 == c2 && !soap_tag_cmp(s + 1, t + 1)) return 0; s++; } break; } } s++; t++; } if (*t == '*' && !t[1]) return 0; return *t; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_match_tag(struct soap *soap, const char *tag1, const char *tag2) { const char *s, *t; int err; if (!tag1 || !tag2 || !*tag2) return SOAP_OK; s = strchr(tag1, ':'); t = strchr(tag2, ':'); if (t) { if (s) { if (t[1] && SOAP_STRCMP(s + 1, t + 1)) return SOAP_TAG_MISMATCH; if (t != tag2 && (err = soap_match_namespace(soap, tag1, tag2, s - tag1, t - tag2))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Tags '%s' and '%s' match but namespaces differ\n", tag1, tag2)); if (err == SOAP_NAMESPACE) return SOAP_TAG_MISMATCH; return err; } } else if (!t[1]) { if ((soap->mode & SOAP_XML_IGNORENS) || soap_match_namespace(soap, tag1, tag2, 0, t - tag2)) return SOAP_TAG_MISMATCH; } else if (SOAP_STRCMP(tag1, t + 1)) { return SOAP_TAG_MISMATCH; } else if (t != tag2 && (err = soap_match_namespace(soap, tag1, tag2, 0, t - tag2))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Tags '%s' and '%s' match but namespaces differ\n", tag1, tag2)); if (err == SOAP_NAMESPACE) return SOAP_TAG_MISMATCH; return err; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Tags and (default) namespaces match: '%s' '%s'\n", tag1, tag2)); return SOAP_OK; } if (s) { if (!(soap->mode & SOAP_XML_IGNORENS) || SOAP_STRCMP(s + 1, tag2)) /* always fails (except when ignoring ns) */ return SOAP_TAG_MISMATCH; } else if (SOAP_STRCMP(tag1, tag2) || ((soap->mode & SOAP_XML_STRICT) && !(soap->mode & SOAP_XML_IGNORENS) && soap_match_namespace(soap, tag1, tag2, 0, 0))) /* strict checking: default namespace must be null namespace */ return SOAP_TAG_MISMATCH; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Tags match: '%s' '%s'\n", tag1, tag2)); return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_match_array(struct soap *soap, const char *type) { if (*soap->arrayType) if (soap_match_tag(soap, soap->arrayType, type) && soap_match_tag(soap, soap->arrayType, "xsd:anyType") && soap_match_tag(soap, soap->arrayType, "xsd:ur-type") ) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Array type mismatch: '%s' '%s'\n", soap->arrayType, type)); return SOAP_TAG_MISMATCH; } return SOAP_OK; } #endif /******************************************************************************\ * * SSL/TLS * \******************************************************************************/ #ifdef WITH_OPENSSL #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_rand() { unsigned char buf[4]; if (!soap_ssl_init_done) soap_ssl_init(); RAND_pseudo_bytes(buf, 4); return *(int*)buf; } #endif #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) || defined(WITH_SYSTEMSSL) #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE) soap_ssl_server_context(struct soap *soap, unsigned short flags, const char *keyfile, const char *keyid, const char *password, const char *cafile, const char *capath, const char *dhfile, const char *randfile, const char *sid) #else soap_ssl_server_context(struct soap *soap, unsigned short flags, const char *keyfile, const char *password, const char *cafile, const char *capath, const char *dhfile, const char *randfile, const char *sid) #endif { int err; soap->keyfile = keyfile; #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE) soap->keyid = keyid; #endif soap->password = password; soap->cafile = cafile; soap->capath = capath; #ifdef WITH_OPENSSL soap->dhfile = dhfile; soap->randfile = randfile; if (!soap->fsslverify) soap->fsslverify = ssl_verify_callback; #endif soap->ssl_flags = flags | (dhfile == NULL ? SOAP_SSL_RSA : 0); #ifdef WITH_GNUTLS (void)randfile; (void)sid; if (dhfile) { char *s; int n = (int)soap_strtoul(dhfile, &s, 10); if (!soap->dh_params) gnutls_dh_params_init(&soap->dh_params); /* if dhfile is numeric, treat it as a key length to generate DH params which can take a while */ if (n >= 512 && s && *s == '\0') gnutls_dh_params_generate2(soap->dh_params, (unsigned int)n); else { unsigned int dparams_len; unsigned char dparams_buf[1024]; FILE *fd = fopen(dhfile, "r"); if (!fd) return soap_set_receiver_error(soap, "SSL/TLS error", "Invalid DH file", SOAP_SSL_ERROR); dparams_len = (unsigned int)fread(dparams_buf, 1, sizeof(dparams_buf), fd); fclose(fd); gnutls_datum_t dparams = { dparams_buf, dparams_len }; if (gnutls_dh_params_import_pkcs3(soap->dh_params, &dparams, GNUTLS_X509_FMT_PEM)) return soap_set_receiver_error(soap, "SSL/TLS error", "Invalid DH file", SOAP_SSL_ERROR); } } else { if (!soap->rsa_params) gnutls_rsa_params_init(&soap->rsa_params); gnutls_rsa_params_generate2(soap->rsa_params, SOAP_SSL_RSA_BITS); } if (soap->session) { gnutls_deinit(soap->session); soap->session = NULL; } if (soap->xcred) { gnutls_certificate_free_credentials(soap->xcred); soap->xcred = NULL; } #endif #ifdef WITH_SYSTEMSSL (void)randfile; (void)sid; if (soap->ctx) gsk_environment_close(&soap->ctx); #endif err = soap->fsslauth(soap); #ifdef WITH_OPENSSL if (!err) { if (sid) SSL_CTX_set_session_id_context(soap->ctx, (unsigned char*)sid, (unsigned int)strlen(sid)); else SSL_CTX_set_session_cache_mode(soap->ctx, SSL_SESS_CACHE_OFF); } #endif return err; } #endif #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) || defined(WITH_SYSTEMSSL) #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE) soap_ssl_client_context(struct soap *soap, unsigned short flags, const char *keyfile, const char *keyid, const char *password, const char *cafile, const char *capath, const char *randfile) #else soap_ssl_client_context(struct soap *soap, unsigned short flags, const char *keyfile, const char *password, const char *cafile, const char *capath, const char *randfile) #endif { soap->keyfile = keyfile; #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE) soap->keyid = keyid; #endif soap->password = password; soap->cafile = cafile; soap->capath = capath; soap->ssl_flags = SOAP_SSL_CLIENT | flags; #ifdef WITH_OPENSSL soap->dhfile = NULL; soap->randfile = randfile; if (!soap->fsslverify) soap->fsslverify = (flags & SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE) == 0 ? ssl_verify_callback : ssl_verify_callback_allow_expired_certificate; #endif #ifdef WITH_GNUTLS (void)randfile; if (soap->session) { gnutls_deinit(soap->session); soap->session = NULL; } if (soap->xcred) { gnutls_certificate_free_credentials(soap->xcred); soap->xcred = NULL; } #endif #ifdef WITH_SYSTEMSSL (void)randfile; if (soap->ctx) gsk_environment_close(&soap->ctx); #endif return soap->fsslauth(soap); } #endif #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_ssl_crl(struct soap *soap, const char *crlfile) { #ifdef WITH_OPENSSL if (crlfile && soap->ctx) { #if (OPENSSL_VERSION_NUMBER >= 0x0090800fL) X509_STORE *store = SSL_CTX_get_cert_store(soap->ctx); if (*crlfile) { int ret; X509_LOOKUP *lookup = X509_STORE_add_lookup(store, X509_LOOKUP_file()); if ((ret = X509_load_crl_file(lookup, crlfile, X509_FILETYPE_PEM)) <= 0) return soap_set_receiver_error(soap, soap_ssl_error(soap, ret), "Can't read CRL file", SOAP_SSL_ERROR); } X509_VERIFY_PARAM *param = X509_VERIFY_PARAM_new(); X509_VERIFY_PARAM_set_flags(param, X509_V_FLAG_CRL_CHECK); X509_STORE_set1_param(store, param); X509_VERIFY_PARAM_free(param); #endif } else soap->crlfile = crlfile; /* activate later when store is available */ #endif #ifdef WITH_GNUTLS if (crlfile && soap->xcred) { if (*crlfile) if (gnutls_certificate_set_x509_crl_file(soap->xcred, crlfile, GNUTLS_X509_FMT_PEM) < 0) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read CRL file", SOAP_SSL_ERROR); } else soap->crlfile = crlfile; /* activate later when xcred is available */ #endif return SOAP_OK; } #endif #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_ssl_init() { /* Note: for MT systems, the main program MUST call soap_ssl_init() before any threads are started */ if (!soap_ssl_init_done) { soap_ssl_init_done = 1; #ifdef WITH_OPENSSL SSL_library_init(); OpenSSL_add_all_algorithms(); /* we keep ciphers and digests for the program's lifetime */ #ifndef WITH_LEAN SSL_load_error_strings(); #endif if (!RAND_load_file("/dev/urandom", 1024)) { char buf[1024]; RAND_seed(buf, sizeof(buf)); while (!RAND_status()) { int r = rand(); RAND_seed(&r, sizeof(int)); } } #endif #ifdef WITH_GNUTLS # if defined(HAVE_PTHREAD_H) gcry_control(GCRYCTL_SET_THREAD_CBS, &gcry_threads_pthread); # elif defined(HAVE_PTH_H) gcry_control(GCRYCTL_SET_THREAD_CBS, &gcry_threads_pth); # endif gcry_control(GCRYCTL_ENABLE_QUICK_RANDOM, 0); gcry_control(GCRYCTL_DISABLE_SECMEM, 0); gcry_control(GCRYCTL_INITIALIZATION_FINISHED, 0); /* libgcrypt init done */ gnutls_global_init(); #endif } } #endif #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) #ifndef PALM_1 SOAP_FMAC1 const char * SOAP_FMAC2 soap_ssl_error(struct soap *soap, int ret) { #ifdef WITH_OPENSSL int err = SSL_get_error(soap->ssl, ret); const char *msg = soap_code_str(h_ssl_error_codes, err); if (msg) (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), strlen(msg) + 1), "%s\n", msg); else return ERR_error_string(err, soap->msgbuf); if (ERR_peek_error()) { unsigned long r; while ((r = ERR_get_error())) { size_t l = strlen(soap->msgbuf); ERR_error_string_n(r, soap->msgbuf + l, sizeof(soap->msgbuf) - l); } } else { size_t l = strlen(soap->msgbuf); switch (ret) { case 0: soap_strcpy(soap->msgbuf + l, sizeof(soap->msgbuf) - l, "EOF was observed that violates the SSL/TLS protocol. The client probably provided invalid authentication information."); break; case -1: { const char *s = strerror(soap_errno); (SOAP_SNPRINTF(soap->msgbuf + l, sizeof(soap->msgbuf) - l, strlen(s) + 42), "Error observed by underlying SSL/TLS BIO: %s", s); } break; } } return soap->msgbuf; #endif #ifdef WITH_GNUTLS (void)soap; return gnutls_strerror(ret); #endif } #endif #endif /******************************************************************************/ #ifdef WITH_SYSTEMSSL static int ssl_recv(int sk, void *s, int n, char *user) { (void)user; return recv(sk, s, n, 0); } #endif /******************************************************************************/ #ifdef WITH_SYSTEMSSL static int ssl_send(int sk, void *s, int n, char *user) { (void)user; return send(sk, s, n, 0); } #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) || defined(WITH_SYSTEMSSL) #ifndef PALM_1 static int ssl_auth_init(struct soap *soap) { #ifdef WITH_OPENSSL long flags; int mode; #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE) EVP_PKEY* pkey; #endif if (!soap_ssl_init_done) soap_ssl_init(); ERR_clear_error(); if (!soap->ctx) { #if (OPENSSL_VERSION_NUMBER >= 0x10100000L) /* TLS_method: a TLS/SSL connection established may understand the SSLv3, TLSv1, TLSv1.1 and TLSv1.2 protocols. */ soap->ctx = SSL_CTX_new(TLS_method()); #else /* SSLv23_method: a TLS/SSL connection established may understand the SSLv3, TLSv1, TLSv1.1 and TLSv1.2 protocols. */ soap->ctx = SSL_CTX_new(SSLv23_method()); #endif if (!soap->ctx) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't setup context", SOAP_SSL_ERROR); /* The following alters the behavior of SSL read/write: */ #if 0 SSL_CTX_set_mode(soap->ctx, SSL_MODE_ENABLE_PARTIAL_WRITE | SSL_MODE_AUTO_RETRY); #endif } if (soap->randfile) { if (!RAND_load_file(soap->randfile, -1)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't load randomness", SOAP_SSL_ERROR); } if (soap->cafile || soap->capath) { if (!SSL_CTX_load_verify_locations(soap->ctx, soap->cafile, soap->capath)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read CA file", SOAP_SSL_ERROR); if (soap->cafile && (soap->ssl_flags & SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION)) SSL_CTX_set_client_CA_list(soap->ctx, SSL_load_client_CA_file(soap->cafile)); } if (!(soap->ssl_flags & SOAP_SSL_NO_DEFAULT_CA_PATH)) { if (!SSL_CTX_set_default_verify_paths(soap->ctx)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read default CA file and/or directory", SOAP_SSL_ERROR); } if (soap->crlfile) { if (soap_ssl_crl(soap, soap->crlfile)) return soap->error; } /* This code assumes a typical scenario with key and cert in one PEM file, see alternative code below */ #if 1 if (soap->keyfile) { if (!SSL_CTX_use_certificate_chain_file(soap->ctx, soap->keyfile)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't find or read certificate in key file", SOAP_SSL_ERROR); if (soap->password) { SSL_CTX_set_default_passwd_cb_userdata(soap->ctx, (void*)soap->password); SSL_CTX_set_default_passwd_cb(soap->ctx, ssl_password); } #ifndef WM_SECURE_KEY_STORAGE if (!SSL_CTX_use_PrivateKey_file(soap->ctx, soap->keyfile, SSL_FILETYPE_PEM)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read key file", SOAP_SSL_ERROR); #endif } #else /* Suggested alternative approach to check the key file for cert only when cafile==NULL */ if (soap->password) { SSL_CTX_set_default_passwd_cb_userdata(soap->ctx, (void*)soap->password); SSL_CTX_set_default_passwd_cb(soap->ctx, ssl_password); } if (!soap->cafile) { if (soap->keyfile) { if (!SSL_CTX_use_certificate_chain_file(soap->ctx, soap->keyfile)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't find or read certificate in key file", SOAP_SSL_ERROR); if (!SSL_CTX_use_PrivateKey_file(soap->ctx, soap->keyfile, SSL_FILETYPE_PEM)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read key file", SOAP_SSL_ERROR); } } else /* use cafile for (server) cert and keyfile for (server) key */ { if (!SSL_CTX_use_certificate_chain_file(soap->ctx, soap->cafile)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read CA file", SOAP_SSL_ERROR); if (soap->keyfile) if (!SSL_CTX_use_PrivateKey_file(soap->ctx, soap->keyfile, SSL_FILETYPE_PEM)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read key file", SOAP_SSL_ERROR); } #endif #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE) if (NULL == (pkey = ipcom_key_db_pkey_get(soap->keyid))) return soap_set_receiver_error(soap, "SSL error", "Can't find key", SOAP_SSL_ERROR); if (0 == SSL_CTX_use_PrivateKey(soap->ctx, pkey)) return soap_set_receiver_error(soap, "SSL error", "Can't read key", SOAP_SSL_ERROR); #endif if ((soap->ssl_flags & SOAP_SSL_RSA)) { RSA *rsa = RSA_generate_key(SOAP_SSL_RSA_BITS, RSA_F4, NULL, NULL); if (!SSL_CTX_set_tmp_rsa(soap->ctx, rsa)) { if (rsa) RSA_free(rsa); return soap_set_receiver_error(soap, "SSL/TLS error", "Can't set RSA key", SOAP_SSL_ERROR); } RSA_free(rsa); } else if (soap->dhfile) { DH *dh = 0; char *s; int n = (int)soap_strtoul(soap->dhfile, &s, 10); /* if dhfile is numeric, treat it as a key length to generate DH params which can take a while */ if (n >= 512 && s && *s == '\0') #if defined(VXWORKS) DH_generate_parameters_ex(dh, n, 2/*or 5*/, NULL); #else dh = DH_generate_parameters(n, 2/*or 5*/, NULL, NULL); #endif else { BIO *bio; bio = BIO_new_file(soap->dhfile, "r"); if (!bio) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read DH file", SOAP_SSL_ERROR); dh = PEM_read_bio_DHparams(bio, NULL, NULL, NULL); BIO_free(bio); } if (!dh || DH_check(dh, &n) != 1 || SSL_CTX_set_tmp_dh(soap->ctx, dh) < 0) { if (dh) DH_free(dh); return soap_set_receiver_error(soap, "SSL/TLS error", "Can't set DH parameters", SOAP_SSL_ERROR); } DH_free(dh); } flags = (SSL_OP_ALL | SSL_OP_NO_SSLv2); /* disable SSL v2 by default */ if ((soap->ssl_flags & SOAP_SSLv3)) { #if (OPENSSL_VERSION_NUMBER >= 0x10001000L) flags |= SSL_OP_NO_TLSv1 | SSL_OP_NO_TLSv1_1 | SSL_OP_NO_TLSv1_2; #else flags |= SSL_OP_NO_TLSv1; #endif } else { if (!(soap->ssl_flags & SOAP_SSLv3_TLSv1)) flags |= SSL_OP_NO_SSLv3; /* disable SSL v3 by default, unless SOAP_SSLv3 or SOAP_SSLv3_TLSv1 is set */ #if (OPENSSL_VERSION_NUMBER >= 0x10001000L) if ((soap->ssl_flags & SOAP_TLSv1_0)) flags |= SSL_OP_NO_TLSv1_1 | SSL_OP_NO_TLSv1_2; else if ((soap->ssl_flags & SOAP_TLSv1_1)) flags |= SSL_OP_NO_TLSv1 | SSL_OP_NO_TLSv1_2; else if ((soap->ssl_flags & SOAP_TLSv1_2)) flags |= SSL_OP_NO_TLSv1 | SSL_OP_NO_TLSv1_1; #endif } #ifdef SSL_OP_NO_TICKET /* TLS extension is enabled by default in OPENSSL v0.9.8k Disable it by adding SSL_OP_NO_TICKET */ flags |= SSL_OP_NO_TICKET; #endif SSL_CTX_set_options(soap->ctx, flags); if ((soap->ssl_flags & SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION)) mode = (SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT); else if ((soap->ssl_flags & SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION)) mode = SSL_VERIFY_PEER; else mode = SSL_VERIFY_NONE; SSL_CTX_set_verify(soap->ctx, mode, soap->fsslverify); #if (OPENSSL_VERSION_NUMBER < 0x00905100L) SSL_CTX_set_verify_depth(soap->ctx, 1); #else SSL_CTX_set_verify_depth(soap->ctx, 9); #endif #endif #ifdef WITH_GNUTLS int ret; if (!soap_ssl_init_done) soap_ssl_init(); if (!soap->xcred) { gnutls_certificate_allocate_credentials(&soap->xcred); if (soap->cafile) { if (gnutls_certificate_set_x509_trust_file(soap->xcred, soap->cafile, GNUTLS_X509_FMT_PEM) < 0) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read CA file", SOAP_SSL_ERROR); } if (soap->crlfile) { if (soap_ssl_crl(soap, soap->crlfile)) return soap->error; } if (soap->keyfile) { if (gnutls_certificate_set_x509_key_file(soap->xcred, soap->keyfile, soap->keyfile, GNUTLS_X509_FMT_PEM) < 0) /* Assumes that key and cert(s) are concatenated in the keyfile */ return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read key file", SOAP_SSL_ERROR); } } if ((soap->ssl_flags & SOAP_SSL_CLIENT)) { gnutls_init(&soap->session, GNUTLS_CLIENT); if (soap->cafile || soap->crlfile || soap->keyfile) { ret = gnutls_priority_set_direct(soap->session, "PERFORMANCE", NULL); if (ret < 0) return soap_set_receiver_error(soap, soap_ssl_error(soap, ret), "SSL/TLS set priority error", SOAP_SSL_ERROR); gnutls_credentials_set(soap->session, GNUTLS_CRD_CERTIFICATE, soap->xcred); } else { if (!soap->acred) gnutls_anon_allocate_client_credentials(&soap->acred); gnutls_init(&soap->session, GNUTLS_CLIENT); gnutls_priority_set_direct(soap->session, "PERFORMANCE:+ANON-DH:!ARCFOUR-128", NULL); gnutls_credentials_set(soap->session, GNUTLS_CRD_ANON, soap->acred); } } else { if (!soap->keyfile) return soap_set_receiver_error(soap, "SSL/TLS error", "No key file: anonymous server authentication not supported in this release", SOAP_SSL_ERROR); if ((soap->ssl_flags & SOAP_SSL_RSA) && soap->rsa_params) gnutls_certificate_set_rsa_export_params(soap->xcred, soap->rsa_params); else if (soap->dh_params) gnutls_certificate_set_dh_params(soap->xcred, soap->dh_params); if (!soap->cache) gnutls_priority_init(&soap->cache, "NORMAL", NULL); gnutls_init(&soap->session, GNUTLS_SERVER); gnutls_priority_set(soap->session, soap->cache); gnutls_credentials_set(soap->session, GNUTLS_CRD_CERTIFICATE, soap->xcred); if ((soap->ssl_flags & SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION)) gnutls_certificate_server_set_request(soap->session, GNUTLS_CERT_REQUEST); gnutls_session_enable_compatibility_mode(soap->session); if ((soap->ssl_flags & SOAP_SSLv3)) { int protocol_priority[] = { GNUTLS_SSL3, 0 }; if (gnutls_protocol_set_priority(soap->session, protocol_priority) != GNUTLS_E_SUCCESS) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't set SSLv3 protocol", SOAP_SSL_ERROR); } else if ((soap->ssl_flags & SOAP_TLSv1_0)) { int protocol_priority[] = { GNUTLS_TLS1_0, 0 }; if (gnutls_protocol_set_priority(soap->session, protocol_priority) != GNUTLS_E_SUCCESS) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't set TLSv1.0 protocol", SOAP_SSL_ERROR); } else if ((soap->ssl_flags & SOAP_TLSv1_1)) { int protocol_priority[] = { GNUTLS_TLS1_1, 0 }; if (gnutls_protocol_set_priority(soap->session, protocol_priority) != GNUTLS_E_SUCCESS) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't set TLSv1.1 protocol", SOAP_SSL_ERROR); } else if ((soap->ssl_flags & SOAP_TLSv1_2)) { int protocol_priority[] = { GNUTLS_TLS1_2, 0 }; if (gnutls_protocol_set_priority(soap->session, protocol_priority) != GNUTLS_E_SUCCESS) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't set TLSv1.2 protocol", SOAP_SSL_ERROR); } else if ((soap->ssl_flags & SOAP_SSLv3_TLSv1)) { int protocol_priority[] = { GNUTLS_SSL3, GNUTLS_TLS1_0, GNUTLS_TLS1_1, GNUTLS_TLS1_2, 0 }; if (gnutls_protocol_set_priority(soap->session, protocol_priority) != GNUTLS_E_SUCCESS) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't set SSLv3 & TLSv1 protocols", SOAP_SSL_ERROR); } else { int protocol_priority[] = { GNUTLS_TLS1_0, GNUTLS_TLS1_1, GNUTLS_TLS1_2, 0 }; if (gnutls_protocol_set_priority(soap->session, protocol_priority) != GNUTLS_E_SUCCESS) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't set TLSv1 protocols", SOAP_SSL_ERROR); } } #endif #ifdef WITH_SYSTEMSSL if (!soap->ctx) { int err; err = gsk_environment_open(&soap->ctx); if (err == GSK_OK) err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_SSLV2, GSK_PROTOCOL_SSLV2_OFF); if (err == GSK_OK) { if ((soap->ssl_flags & SOAP_SSLv3) || (soap->ssl_flags & SOAP_SSLv3_TLSv1)) err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_SSLV3, GSK_PROTOCOL_SSLV3_ON); else err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_SSLV3, GSK_PROTOCOL_SSLV3_OFF); } if (!(soap->ssl_flags & SOAP_SSLv3)) { if (err == GSK_OK) err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_TLSV1, GSK_PROTOCOL_TLSV1_ON); if (err == GSK_OK) err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_TLSV1_1, GSK_PROTOCOL_TLSV1_1_ON); if (err == GSK_OK) err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_TLSV1_2, GSK_PROTOCOL_TLSV1_2_ON); } else { if (err == GSK_OK) err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_TLSV1, GSK_PROTOCOL_TLSV1_OFF); if (err == GSK_OK) err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_TLSV1_1, GSK_PROTOCOL_TLSV1_1_OFF); if (err == GSK_OK) err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_TLSV1_2, GSK_PROTOCOL_TLSV1_2_OFF); } if (err == GSK_OK) err = gsk_attribute_set_buffer(soap->ctx, GSK_KEYRING_FILE, soap->keyfile, 0); /* keyfile is a keyring .kdb file */ if (err == GSK_OK) err = gsk_attribute_set_buffer(soap->ctx, GSK_KEYRING_PW, soap->password, 0); /* locked by password */ if (err == GSK_OK) err = gsk_environment_init(soap->ctx); if (err != GSK_OK) return soap_set_receiver_error(soap, gsk_strerror(err), "SYSTEM SSL error in ssl_auth_init()", SOAP_SSL_ERROR); } #endif return SOAP_OK; } #endif #endif /******************************************************************************/ #ifdef WITH_OPENSSL #ifndef PALM_1 static int ssl_password(char *buf, int num, int rwflag, void *userdata) { (void)rwflag; if (!buf || !userdata) return 0; soap_strcpy(buf, (size_t)num, (char*)userdata); return (int)strlen(buf); } #endif #endif /******************************************************************************/ #ifdef WITH_OPENSSL #ifndef PALM_1 static int ssl_verify_callback(int ok, X509_STORE_CTX *store) { (void)store; #ifdef SOAP_DEBUG if (!ok) { char buf[1024]; int err = X509_STORE_CTX_get_error(store); X509 *cert = X509_STORE_CTX_get_current_cert(store); fprintf(stderr, "\nDEBUG mode TLS/SSL warnings:\nSSL verify error %d or warning with certificate at depth %d: %s\n", err, X509_STORE_CTX_get_error_depth(store), X509_verify_cert_error_string(err)); X509_NAME_oneline(X509_get_issuer_name(cert), buf, sizeof(buf)); fprintf(stderr, " certificate issuer: %s\n", buf); X509_NAME_oneline(X509_get_subject_name(cert), buf, sizeof(buf)); fprintf(stderr, " certificate subject: %s\n", buf); /* accept self-signed certificates and certificates out of date */ switch (err) { case X509_V_ERR_CERT_NOT_YET_VALID: case X509_V_ERR_CERT_HAS_EXPIRED: case X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT: case X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN: case X509_V_ERR_UNABLE_TO_GET_CRL: case X509_V_ERR_CRL_NOT_YET_VALID: case X509_V_ERR_CRL_HAS_EXPIRED: X509_STORE_CTX_set_error(store, X509_V_OK); ok = 1; fprintf(stderr, "Initialize soap_ssl_client_context with SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE to allow this verification error to pass without DEBUG mode enabled\n"); } } #endif /* Note: return 1 to try to continue, but unsafe progress will be terminated by OpenSSL */ return ok; } #endif #endif /******************************************************************************/ #ifdef WITH_OPENSSL #ifndef PALM_1 static int ssl_verify_callback_allow_expired_certificate(int ok, X509_STORE_CTX *store) { ok = ssl_verify_callback(ok, store); if (!ok) { /* accept self signed certificates, expired certificates, and certficiates w/o CRL */ switch (X509_STORE_CTX_get_error(store)) { case X509_V_ERR_CERT_NOT_YET_VALID: case X509_V_ERR_CERT_HAS_EXPIRED: case X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT: case X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN: case X509_V_ERR_UNABLE_TO_GET_CRL: case X509_V_ERR_CRL_NOT_YET_VALID: case X509_V_ERR_CRL_HAS_EXPIRED: X509_STORE_CTX_set_error(store, X509_V_OK); ok = 1; } } /* Note: return 1 to continue, but unsafe progress will be terminated by SSL */ return ok; } #endif #endif /******************************************************************************/ #ifdef WITH_GNUTLS static const char * ssl_verify(struct soap *soap, const char *host) { unsigned int status; const char *err = NULL; int r = gnutls_certificate_verify_peers2(soap->session, &status); if (r < 0) err = "Certificate verify error"; else if ((status & GNUTLS_CERT_INVALID)) err = "The certificate is not trusted"; else if ((status & GNUTLS_CERT_SIGNER_NOT_FOUND)) err = "The certificate hasn't got a known issuer"; else if ((status & GNUTLS_CERT_REVOKED)) err = "The certificate has been revoked"; else if (gnutls_certificate_type_get(soap->session) == GNUTLS_CRT_X509) { gnutls_x509_crt_t cert; const gnutls_datum_t *cert_list; unsigned int cert_list_size; if (gnutls_x509_crt_init(&cert) < 0) err = "Could not get X509 certificates"; else if ((cert_list = gnutls_certificate_get_peers(soap->session, &cert_list_size)) == NULL) err = "Could not get X509 certificates"; else if (gnutls_x509_crt_import(cert, &cert_list[0], GNUTLS_X509_FMT_DER) < 0) err = "Error parsing X509 certificate"; else if (!(soap->ssl_flags & SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE) && gnutls_x509_crt_get_expiration_time(cert) < time(NULL)) err = "The certificate has expired"; else if (!(soap->ssl_flags & SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE) && gnutls_x509_crt_get_activation_time(cert) > time(NULL)) err = "The certificate is not yet activated"; else if (host && !(soap->ssl_flags & SOAP_SSL_SKIP_HOST_CHECK)) { if (!gnutls_x509_crt_check_hostname(cert, host)) err = "Certificate host name mismatch"; } gnutls_x509_crt_deinit(cert); } return err; } #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) #ifndef WITH_NOIO #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_ssl_accept(struct soap *soap) { SOAP_SOCKET sk = soap->socket; #ifdef WITH_OPENSSL BIO *bio; int retries, r, s; if (!soap_valid_socket(sk)) return soap_set_receiver_error(soap, "SSL/TLS error", "No socket in soap_ssl_accept()", SOAP_SSL_ERROR); soap->ssl_flags &= ~SOAP_SSL_CLIENT; if (!soap->ctx && (soap->error = soap->fsslauth(soap))) return soap->error; if (!soap->ssl) { soap->ssl = SSL_new(soap->ctx); if (!soap->ssl) return soap_set_receiver_error(soap, "SSL/TLS error", "SSL_new() failed in soap_ssl_accept()", SOAP_SSL_ERROR); } else SSL_clear(soap->ssl); bio = BIO_new_socket((int)sk, BIO_NOCLOSE); SSL_set_bio(soap->ssl, bio, bio); /* Set SSL sockets to non-blocking */ retries = 0; if (soap->accept_timeout) { SOAP_SOCKNONBLOCK(sk) retries = 10*soap->accept_timeout; } if (retries <= 0) retries = 100; /* timeout: 10 sec retries, 100 times 0.1 sec */ while ((r = SSL_accept(soap->ssl)) <= 0) { int err; if (retries-- <= 0) break; err = SSL_get_error(soap->ssl, r); if (err == SSL_ERROR_WANT_ACCEPT || err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE) { if (err == SSL_ERROR_WANT_READ) s = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, -100000); else s = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, -100000); if (s < 0) break; } else { soap->errnum = soap_socket_errno(sk); break; } } if (r <= 0) { soap_set_receiver_error(soap, soap_ssl_error(soap, r), "SSL_accept() failed in soap_ssl_accept()", SOAP_SSL_ERROR); soap_closesock(soap); return SOAP_SSL_ERROR; } if ((soap->ssl_flags & SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION)) { X509 *peer; int err; if ((err = SSL_get_verify_result(soap->ssl)) != X509_V_OK) { soap_closesock(soap); return soap_set_sender_error(soap, X509_verify_cert_error_string(err), "SSL certificate presented by peer cannot be verified in soap_ssl_accept()", SOAP_SSL_ERROR); } peer = SSL_get_peer_certificate(soap->ssl); if (!peer) { soap_closesock(soap); return soap_set_sender_error(soap, "SSL/TLS error", "No SSL certificate was presented by the peer in soap_ssl_accept()", SOAP_SSL_ERROR); } X509_free(peer); } #endif #ifdef WITH_GNUTLS int retries = 0, r; if (!soap_valid_socket(sk)) return soap_set_receiver_error(soap, "SSL/TLS error", "No socket in soap_ssl_accept()", SOAP_SSL_ERROR); soap->ssl_flags &= ~SOAP_SSL_CLIENT; if (!soap->session && (soap->error = soap->fsslauth(soap))) { soap_closesock(soap); return soap->error; } gnutls_transport_set_ptr(soap->session, (gnutls_transport_ptr_t)(long)sk); /* Set SSL sockets to non-blocking */ if (soap->accept_timeout) { SOAP_SOCKNONBLOCK(sk) retries = 10*soap->accept_timeout; } if (retries <= 0) retries = 100; /* timeout: 10 sec retries, 100 times 0.1 sec */ while ((r = gnutls_handshake(soap->session))) { int s; /* GNUTLS repeat handhake when GNUTLS_E_AGAIN */ if (retries-- <= 0) break; if (r == GNUTLS_E_AGAIN || r == GNUTLS_E_INTERRUPTED) { if (!gnutls_record_get_direction(soap->session)) s = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, -100000); else s = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, -100000); if (s < 0) break; } else { soap->errnum = soap_socket_errno(sk); break; } } if (r) { soap_closesock(soap); return soap_set_receiver_error(soap, soap_ssl_error(soap, r), "SSL/TLS handshake failed", SOAP_SSL_ERROR); } if ((soap->ssl_flags & SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION)) { const char *err = ssl_verify(soap, NULL); if (err) { soap_closesock(soap); return soap_set_receiver_error(soap, "SSL/TLS error", err, SOAP_SSL_ERROR); } } #endif #ifdef WITH_SYSTEMSSL gsk_iocallback local_io = { ssl_recv, ssl_send, NULL, NULL, NULL, NULL }; int err, s; int retries = 0; if (soap->accept_timeout) { SOAP_SOCKNONBLOCK(sk) retries = 10*soap->accept_timeout; } if (retries <= 0) retries = 100; /* timeout: 10 sec retries, 100 times 0.1 sec */ err = gsk_secure_socket_open(soap->ctx, &soap->ssl); if (err == GSK_OK) err = gsk_attribute_set_numeric_value(soap->ssl, GSK_FD, sk); if (err == GSK_OK) err = gsk_attribute_set_buffer(soap->ssl, GSK_KEYRING_LABEL, soap->cafile, 0); if (err == GSK_OK) err = gsk_attribute_set_enum(soap->ssl, GSK_SESSION_TYPE, GSK_SERVER_SESSION); if (err == GSK_OK) err = gsk_attribute_set_buffer(soap->ssl, GSK_V3_CIPHER_SPECS_EXPANDED, "0035002F000A", 0); if (err == GSK_OK) err = gsk_attribute_set_enum(soap->ssl, GSK_V3_CIPHERS, GSK_V3_CIPHERS_CHAR4); if (err == GSK_OK) err = gsk_attribute_set_callback(soap->ssl, GSK_IO_CALLBACK, &local_io); if (err != GSK_OK) return soap_set_receiver_error(soap, gsk_strerror(err), "SYSTEM SSL error in soap_ssl_accept()", SOAP_SSL_ERROR); while ((err = gsk_secure_socket_init(soap->ssl)) != GSK_OK) { if (retries-- <= 0) break; if (err == GSK_WOULD_BLOCK_READ || err == GSK_WOULD_BLOCK_WRITE) { if (err == GSK_WOULD_BLOCK_READ) s = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, -100000); else s = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, -100000); if (s < 0) break; } else { soap->errnum = soap_socket_errno(sk); break; } } if (err != GSK_OK) return soap_set_receiver_error(soap, gsk_strerror(err), "gsk_secure_socket_init() failed in soap_ssl_accept()", SOAP_SSL_ERROR); #endif if (soap->recv_timeout || soap->send_timeout) SOAP_SOCKNONBLOCK(sk) else SOAP_SOCKBLOCK(sk) soap->imode |= SOAP_ENC_SSL; soap->omode |= SOAP_ENC_SSL; return SOAP_OK; } #endif #endif #endif /******************************************************************************\ * * TCP/UDP [SSL/TLS] IPv4 and IPv6 * \******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 static int tcp_init(struct soap *soap) { soap->errmode = 1; #ifdef WIN32 if (tcp_done) return 0; else { WSADATA w; if (WSAStartup(MAKEWORD(1, 1), &w)) return -1; tcp_done = 1; } #endif return 0; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 static const char* tcp_error(struct soap *soap) { const char *msg = NULL; switch (soap->errmode) { case 0: msg = soap_strerror(soap); break; case 1: msg = "WSAStartup failed"; break; case 2: { #ifndef WITH_LEAN msg = soap_code_str(h_error_codes, soap->errnum); if (!msg) #endif { (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), 37), "TCP/UDP IP error %d", soap->errnum); msg = soap->msgbuf; } } } return msg; } #endif #endif /******************************************************************************/ #ifndef WITH_IPV6 #ifndef WITH_NOIO #ifndef PALM_1 static int tcp_gethost(struct soap *soap, const char *addr, struct in_addr *inaddr) { soap_int32 iadd = -1; struct hostent hostent, *host = &hostent; #ifdef VXWORKS int hostint; /* inet_addr(), and hostGetByName() expect "char *"; addr is a "const char *". */ iadd = inet_addr((char*)addr); #else #if defined(_AIX43) || ((defined(TRU64) || defined(HP_UX)) && defined(HAVE_GETHOSTBYNAME_R)) struct hostent_data ht_data; #endif #ifdef AS400 iadd = inet_addr((void*)addr); #else iadd = inet_addr((char*)addr); #endif #endif if (iadd != -1) { if (soap_memcpy((void*)inaddr, sizeof(struct in_addr), (const void*)&iadd, sizeof(iadd))) return soap->error = SOAP_EOM; return SOAP_OK; } #if defined(__GLIBC__) || (defined(HAVE_GETHOSTBYNAME_R) && (defined(FREEBSD) || defined(__FreeBSD__))) || defined(__ANDROID__) if (gethostbyname_r(addr, &hostent, soap->buf, sizeof(soap->buf), &host, &soap->errnum) < 0) host = NULL; #elif defined(_AIX43) || ((defined(TRU64) || defined(HP_UX)) && defined(HAVE_GETHOSTBYNAME_R)) memset((void*)&ht_data, 0, sizeof(ht_data)); if (gethostbyname_r(addr, &hostent, &ht_data) < 0) { host = NULL; soap->errnum = h_errno; } #elif defined(HAVE_GETHOSTBYNAME_R) host = gethostbyname_r(addr, &hostent, soap->buf, sizeof(soap->buf), &soap->errnum); #elif defined(VXWORKS) /* If the DNS resolver library resolvLib has been configured in the vxWorks * image, a query for the host IP address is sent to the DNS server, if the * name was not found in the local host table. */ hostint = hostGetByName((char*)addr); if (hostint == ERROR) { host = NULL; soap->errnum = soap_errno; } #else #ifdef AS400 if (!(host = gethostbyname((void*)addr))) soap->errnum = h_errno; #else if (!(host = gethostbyname((char*)addr))) soap->errnum = h_errno; #endif #endif if (!host) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Host name not found\n")); return SOAP_ERR; } #ifdef VXWORKS inaddr->s_addr = hostint; #else if (soap_memcpy((void*)inaddr, sizeof(struct in_addr), (const void*)host->h_addr, (size_t)host->h_length)) return soap->error = SOAP_EOM; #endif return SOAP_OK; } #endif #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 static SOAP_SOCKET tcp_connect(struct soap *soap, const char *endpoint, const char *host, int port) { #ifdef WITH_IPV6 struct addrinfo hints, *res, *ressave; #endif SOAP_SOCKET sk; int err = 0; #ifndef WITH_LEAN #ifndef WIN32 int len = sizeof(soap->buf); #else int len = sizeof(soap->buf) + 1; /* speeds up windows xfer */ #endif int set = 1; #endif #if !defined(WITH_LEAN) || defined(WITH_OPENSSL) || defined(WITH_GNUTLS) || defined(WITH_SYSTEMSSL) int retries; #endif if (soap_valid_socket(soap->socket)) soap->fclosesocket(soap, soap->socket); soap->socket = SOAP_INVALID_SOCKET; if (tcp_init(soap)) { soap->errnum = 0; soap_set_receiver_error(soap, tcp_error(soap), "TCP init failed in tcp_connect()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } soap->errmode = 0; #ifdef WITH_IPV6 memset((void*)&hints, 0, sizeof(hints)); #ifdef WITH_IPV6_V6ONLY hints.ai_family = PF_INET6; #else hints.ai_family = PF_UNSPEC; #endif #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) hints.ai_socktype = SOCK_DGRAM; else #endif hints.ai_socktype = SOCK_STREAM; soap->errmode = 2; if (soap->proxy_host) err = getaddrinfo(soap->proxy_host, soap_int2s(soap, soap->proxy_port), &hints, &res); else err = getaddrinfo(host, soap_int2s(soap, port), &hints, &res); if (err || !res) { soap_set_receiver_error(soap, SOAP_GAI_STRERROR(err), "getaddrinfo failed in tcp_connect()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } ressave = res; again: sk = socket(res->ai_family, res->ai_socktype, res->ai_protocol); soap->error = SOAP_OK; soap->errmode = 0; #else #ifndef WITH_LEAN again: #endif #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) sk = socket(AF_INET, SOCK_DGRAM, 0); else #endif sk = socket(AF_INET, SOCK_STREAM, 0); #endif if (!soap_valid_socket(sk)) { #ifdef WITH_IPV6 if (res->ai_next) { res = res->ai_next; goto again; } #endif soap->errnum = soap_socket_errno(sk); soap_set_receiver_error(soap, tcp_error(soap), "socket failed in tcp_connect()", SOAP_TCP_ERROR); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } #ifdef SOCKET_CLOSE_ON_EXIT #ifdef WIN32 #ifndef UNDER_CE SetHandleInformation((HANDLE)sk, HANDLE_FLAG_INHERIT, 0); #endif #else fcntl(sk, F_SETFD, 1); #endif #endif #ifndef WITH_LEAN if ((soap->connect_flags & SO_LINGER)) { struct linger linger; memset((void*)&linger, 0, sizeof(linger)); linger.l_onoff = 1; linger.l_linger = soap->linger_time; if (setsockopt(sk, SOL_SOCKET, SO_LINGER, (char*)&linger, sizeof(struct linger))) { soap->errnum = soap_socket_errno(sk); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_LINGER failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } } if ((soap->connect_flags & ~SO_LINGER) && setsockopt(sk, SOL_SOCKET, soap->connect_flags & ~SO_LINGER, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(sk); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } #ifndef UNDER_CE if ((soap->keep_alive || soap->tcp_keep_alive) && setsockopt(sk, SOL_SOCKET, SO_KEEPALIVE, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(sk); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_KEEPALIVE failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } if (setsockopt(sk, SOL_SOCKET, SO_SNDBUF, (char*)&len, sizeof(int))) { soap->errnum = soap_socket_errno(sk); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_SNDBUF failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } if (setsockopt(sk, SOL_SOCKET, SO_RCVBUF, (char*)&len, sizeof(int))) { soap->errnum = soap_socket_errno(sk); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_RCVBUF failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } #ifdef TCP_KEEPIDLE if (soap->tcp_keep_idle && setsockopt((SOAP_SOCKET)sk, IPPROTO_TCP, TCP_KEEPIDLE, (char*)&(soap->tcp_keep_idle), sizeof(int))) { soap->errnum = soap_socket_errno(sk); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt TCP_KEEPIDLE failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, (SOAP_SOCKET)sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } #endif #ifdef TCP_KEEPINTVL if (soap->tcp_keep_intvl && setsockopt((SOAP_SOCKET)sk, IPPROTO_TCP, TCP_KEEPINTVL, (char*)&(soap->tcp_keep_intvl), sizeof(int))) { soap->errnum = soap_socket_errno(sk); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt TCP_KEEPINTVL failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, (SOAP_SOCKET)sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } #endif #ifdef TCP_KEEPCNT if (soap->tcp_keep_cnt && setsockopt((SOAP_SOCKET)sk, IPPROTO_TCP, TCP_KEEPCNT, (char*)&(soap->tcp_keep_cnt), sizeof(int))) { soap->errnum = soap_socket_errno(sk); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt TCP_KEEPCNT failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, (SOAP_SOCKET)sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } #endif #ifdef TCP_NODELAY if (!(soap->omode & SOAP_IO_UDP) && setsockopt(sk, IPPROTO_TCP, TCP_NODELAY, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(sk); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt TCP_NODELAY failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } #endif #ifdef WITH_IPV6 if ((soap->omode & SOAP_IO_UDP) && soap->ipv6_multicast_if) { struct sockaddr_in6 *in6addr = (struct sockaddr_in6*)res->ai_addr; in6addr->sin6_scope_id = soap->ipv6_multicast_if; } #endif #ifdef IP_MULTICAST_TTL if ((soap->omode & SOAP_IO_UDP)) { if (soap->ipv4_multicast_ttl) { unsigned char ttl = soap->ipv4_multicast_ttl; if (setsockopt(sk, IPPROTO_IP, IP_MULTICAST_TTL, (char*)&ttl, sizeof(ttl))) { soap->errnum = soap_socket_errno(sk); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt IP_MULTICAST_TTL failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } } if ((soap->omode & SOAP_IO_UDP) && soap->ipv4_multicast_if && !soap->ipv6_multicast_if) { if (setsockopt(sk, IPPROTO_IP, IP_MULTICAST_IF, (char*)soap->ipv4_multicast_if, sizeof(struct in_addr))) #ifndef WINDOWS { soap->errnum = soap_socket_errno(sk); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt IP_MULTICAST_IF failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } #else #ifndef IP_MULTICAST_IF #define IP_MULTICAST_IF 2 #endif if (setsockopt(sk, IPPROTO_IP, IP_MULTICAST_IF, (char*)soap->ipv4_multicast_if, sizeof(struct in_addr))) { soap->errnum = soap_socket_errno(sk); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt IP_MULTICAST_IF failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } #endif } } #endif #endif #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Opening socket=%d to host='%s' port=%d\n", sk, host, port)); #ifndef WITH_IPV6 soap->peerlen = sizeof(soap->peer.in); memset((void*)&soap->peer.in, 0, sizeof(soap->peer.in)); soap->peer.in.sin_family = AF_INET; soap->errmode = 2; if (soap->proxy_host) { if (soap->fresolve(soap, soap->proxy_host, &soap->peer.in.sin_addr)) { soap_set_receiver_error(soap, tcp_error(soap), "get proxy host by name failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } soap->peer.in.sin_port = htons((short)soap->proxy_port); } else { if (soap->fresolve(soap, host, &soap->peer.in.sin_addr)) { soap_set_receiver_error(soap, tcp_error(soap), "get host by name failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } soap->peer.in.sin_port = htons((short)port); } soap->errmode = 0; #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) return sk; #endif #else if ((soap->omode & SOAP_IO_UDP)) { if (soap_memcpy((void*)&soap->peer.storage, sizeof(soap->peer.storage), (const void*)res->ai_addr, res->ai_addrlen)) { soap->error = SOAP_EOM; soap->fclosesocket(soap, sk); sk = SOAP_INVALID_SOCKET; } soap->peerlen = res->ai_addrlen; freeaddrinfo(ressave); return sk; } #endif #ifndef WITH_LEAN if (soap->connect_timeout) SOAP_SOCKNONBLOCK(sk) else SOAP_SOCKBLOCK(sk) retries = 10; #endif for (;;) { #ifdef WITH_IPV6 if (connect(sk, res->ai_addr, (int)res->ai_addrlen)) #else if (connect(sk, &soap->peer.addr, sizeof(soap->peer.in))) #endif { err = soap_socket_errno(sk); #ifdef WITH_IPV6 if (err == SOAP_ECONNREFUSED && res->ai_next) { soap->fclosesocket(soap, sk); res = res->ai_next; goto again; } #endif #ifndef WITH_LEAN if (err == SOAP_EADDRINUSE) { soap->fclosesocket(soap, sk); if (retries-- > 0) goto again; } else if (soap->connect_timeout && (err == SOAP_EINPROGRESS || err == SOAP_EAGAIN || err == SOAP_EWOULDBLOCK)) { SOAP_SOCKLEN_T k; for (;;) { int r; r = tcp_select(soap, sk, SOAP_TCP_SELECT_SND, soap->connect_timeout); if (r > 0) break; if (!r) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connect timeout\n")); soap_set_receiver_error(soap, "Timeout", "connect failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); #ifdef WITH_IPV6 if (res->ai_next) { res = res->ai_next; goto again; } freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } r = soap->errnum = soap_socket_errno(sk); if (r != SOAP_EINTR) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not connect to host\n")); soap_set_receiver_error(soap, tcp_error(soap), "connect failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); #ifdef WITH_IPV6 if (res->ai_next) { res = res->ai_next; goto again; } freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } } k = (SOAP_SOCKLEN_T)sizeof(soap->errnum); if (!getsockopt(sk, SOL_SOCKET, SO_ERROR, (char*)&soap->errnum, &k) && !soap->errnum) /* portability note: see SOAP_SOCKLEN_T definition in stdsoap2.h */ break; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not connect to host\n")); if (!soap->errnum) soap->errnum = soap_socket_errno(sk); soap_set_receiver_error(soap, tcp_error(soap), "connect failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); #ifdef WITH_IPV6 if (res->ai_next) { res = res->ai_next; goto again; } freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } #endif #ifdef WITH_IPV6 if (res->ai_next) { res = res->ai_next; soap->fclosesocket(soap, sk); goto again; } #endif if (err && err != SOAP_EINTR) { soap->errnum = err; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not connect to host\n")); soap_set_receiver_error(soap, tcp_error(soap), "connect failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } } else break; } #ifdef WITH_IPV6 soap->peerlen = 0; /* IPv6: already connected so use send() */ freeaddrinfo(ressave); #endif soap->socket = sk; soap->imode &= ~SOAP_ENC_SSL; soap->omode &= ~SOAP_ENC_SSL; if (endpoint && !soap_tag_cmp(endpoint, "https:*")) { #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) || defined(WITH_SYSTEMSSL) #ifdef WITH_OPENSSL BIO *bio; #endif #ifdef WITH_SYSTEMSSL gsk_iocallback local_io = { ssl_recv, ssl_send, NULL, NULL, NULL, NULL }; #endif int r; if (soap->proxy_host) { soap_mode m = soap->mode; /* preserve settings */ soap_mode om = soap->omode; /* make sure we only parse HTTP */ size_t n = soap->count; /* save the content length */ const char *userid, *passwd; int status = soap->status; /* save the current status/command */ short keep_alive = soap->keep_alive; /* save the KA status */ soap->omode &= ~SOAP_ENC; /* mask IO and ENC */ soap->omode |= SOAP_IO_BUFFER; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connecting to %s proxy server %s for destination endpoint %s\n", soap->proxy_http_version, soap->proxy_host, endpoint)); #ifdef WITH_NTLM if (soap->ntlm_challenge) { if (soap_ntlm_handshake(soap, SOAP_CONNECT, endpoint, host, port)) return soap->error; } #endif if (soap_begin_send(soap)) { soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } soap->status = SOAP_CONNECT; soap->keep_alive = 1; if ((soap->error = soap->fpost(soap, endpoint, host, port, NULL, NULL, 0)) || soap_end_send_flush(soap)) { soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } soap->keep_alive = keep_alive; soap->omode = om; om = soap->imode; soap->imode &= ~SOAP_ENC; /* mask IO and ENC */ userid = soap->userid; /* preserve */ passwd = soap->passwd; /* preserve */ if ((soap->error = soap->fparse(soap))) { soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } soap->status = status; /* restore */ soap->userid = userid; /* restore */ soap->passwd = passwd; /* restore */ soap->imode = om; /* restore */ soap->count = n; /* restore */ if (soap_begin_send(soap)) { soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } if (endpoint) soap_strcpy(soap->endpoint, sizeof(soap->endpoint), endpoint); /* restore */ soap->mode = m; } #ifdef WITH_OPENSSL soap->ssl_flags |= SOAP_SSL_CLIENT; if (!soap->ctx && (soap->error = soap->fsslauth(soap))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL required, but no ctx set\n")); soap->fclosesocket(soap, sk); soap->error = SOAP_SSL_ERROR; return SOAP_INVALID_SOCKET; } if (!soap->ssl) { soap->ssl = SSL_new(soap->ctx); if (!soap->ssl) { soap->fclosesocket(soap, sk); soap->error = SOAP_SSL_ERROR; return SOAP_INVALID_SOCKET; } } else SSL_clear(soap->ssl); if (soap->session) { if (!strcmp(soap->session_host, host) && soap->session_port == port) SSL_set_session(soap->ssl, soap->session); SSL_SESSION_free(soap->session); soap->session = NULL; } #if (OPENSSL_VERSION_NUMBER >= 0x1000000aL) if (!(soap->ssl_flags & SOAP_SSLv3) && !SSL_set_tlsext_host_name(soap->ssl, host)) { soap_set_receiver_error(soap, "SSL/TLS error", "SNI failed", SOAP_SSL_ERROR); soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } #elif (OPENSSL_VERSION_NUMBER >= 0x0090800fL) && defined(SSL_CTRL_SET_TLSEXT_HOSTNAME) if (SSL_ctrl(soap->ssl, SSL_CTRL_SET_TLSEXT_HOSTNAME, TLSEXT_NAMETYPE_host_name, (void*)host)) { soap_set_receiver_error(soap, "SSL/TLS error", "SNI failed", SOAP_SSL_ERROR); soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } #endif bio = BIO_new_socket((int)sk, BIO_NOCLOSE); SSL_set_bio(soap->ssl, bio, bio); /* Connect timeout: set SSL sockets to non-blocking */ retries = 0; if (soap->connect_timeout) { SOAP_SOCKNONBLOCK(sk) retries = 10*soap->connect_timeout; } else SOAP_SOCKBLOCK(sk) if (retries <= 0) retries = 100; /* timeout: 10 sec retries, 100 times 0.1 sec */ /* Try connecting until success or timeout (when nonblocking) */ do { if ((r = SSL_connect(soap->ssl)) <= 0) { int err = SSL_get_error(soap->ssl, r); if (err == SSL_ERROR_WANT_CONNECT || err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE) { int s; if (err == SSL_ERROR_WANT_READ) s = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, -100000); else s = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, -100000); if (s < 0) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL_connect/select error in tcp_connect\n")); soap_set_receiver_error(soap, soap_ssl_error(soap, r), "SSL_connect failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } if (s == 0 && retries-- <= 0) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL/TLS connect timeout\n")); soap_set_receiver_error(soap, "Timeout", "SSL_connect failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } } else { soap_set_receiver_error(soap, soap_ssl_error(soap, r), "SSL_connect error in tcp_connect()", SOAP_SSL_ERROR); soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } } } while (!SSL_is_init_finished(soap->ssl)); /* Set SSL sockets to nonblocking */ SOAP_SOCKNONBLOCK(sk) /* Check server credentials when required */ if ((soap->ssl_flags & SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION)) { int err; if ((err = SSL_get_verify_result(soap->ssl)) != X509_V_OK) { soap_set_sender_error(soap, X509_verify_cert_error_string(err), "SSL/TLS certificate presented by peer cannot be verified in tcp_connect()", SOAP_SSL_ERROR); soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } if (!(soap->ssl_flags & SOAP_SSL_SKIP_HOST_CHECK)) { X509_NAME *subj; STACK_OF(CONF_VALUE) *val = NULL; #if (OPENSSL_VERSION_NUMBER >= 0x0090800fL) GENERAL_NAMES *names = NULL; #else int ext_count; #endif int ok = 0; X509 *peer = SSL_get_peer_certificate(soap->ssl); if (!peer) { soap_set_sender_error(soap, "SSL/TLS error", "No SSL/TLS certificate was presented by the peer in tcp_connect()", SOAP_SSL_ERROR); soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } #if (OPENSSL_VERSION_NUMBER < 0x0090800fL) ext_count = X509_get_ext_count(peer); if (ext_count > 0) { int i; for (i = 0; i < ext_count; i++) { X509_EXTENSION *ext = X509_get_ext(peer, i); const char *ext_str = OBJ_nid2sn(OBJ_obj2nid(X509_EXTENSION_get_object(ext))); if (ext_str && !strcmp(ext_str, "subjectAltName")) { X509V3_EXT_METHOD *meth = (X509V3_EXT_METHOD*)X509V3_EXT_get(ext); unsigned char *data; if (!meth) break; data = ext->value->data; if (data) { #if (OPENSSL_VERSION_NUMBER > 0x00907000L) void *ext_data; if (meth->it) ext_data = ASN1_item_d2i(NULL, &data, ext->value->length, ASN1_ITEM_ptr(meth->it)); else { #if (OPENSSL_VERSION_NUMBER > 0x0090800fL) ext_data = meth->d2i(NULL, (const unsigned char **)&data, ext->value->length); #else ext_data = meth->d2i(NULL, &data, ext->value->length); #endif } if (ext_data) val = meth->i2v(meth, ext_data, NULL); else val = NULL; if (meth->it) ASN1_item_free((ASN1_VALUE*)ext_data, ASN1_ITEM_ptr(meth->it)); else meth->ext_free(ext_data); #else void *ext_data = meth->d2i(NULL, &data, ext->value->length); if (ext_data) val = meth->i2v(meth, ext_data, NULL); meth->ext_free(ext_data); #endif if (val) { int j; for (j = 0; j < sk_CONF_VALUE_num(val); j++) { CONF_VALUE *nval = sk_CONF_VALUE_value(val, j); if (nval && !strcmp(nval->name, "DNS") && !strcmp(nval->value, host)) { ok = 1; break; } } sk_CONF_VALUE_pop_free(val, X509V3_conf_free); } } } if (ok) break; } } #else names = (GENERAL_NAMES*)X509_get_ext_d2i(peer, NID_subject_alt_name, NULL, NULL); if (names) { val = i2v_GENERAL_NAMES(NULL, names, val); sk_GENERAL_NAME_pop_free(names, GENERAL_NAME_free); } if (val) { int j; for (j = 0; j < sk_CONF_VALUE_num(val); j++) { CONF_VALUE *nval = sk_CONF_VALUE_value(val, j); if (nval && !strcmp(nval->name, "DNS") && !strcmp(nval->value, host)) { ok = 1; break; } } sk_CONF_VALUE_pop_free(val, X509V3_conf_free); } #endif if (!ok && (subj = X509_get_subject_name(peer))) { int i = -1; do { ASN1_STRING *name; i = X509_NAME_get_index_by_NID(subj, NID_commonName, i); if (i == -1) break; name = X509_NAME_ENTRY_get_data(X509_NAME_get_entry(subj, i)); if (name) { if (!soap_tag_cmp(host, (const char*)M_ASN1_STRING_data(name))) ok = 1; else { unsigned char *tmp = NULL; ASN1_STRING_to_UTF8(&tmp, name); if (tmp) { if (!soap_tag_cmp(host, (const char*)tmp)) ok = 1; else if (tmp[0] == '*') /* wildcard domain */ { const char *t = strchr(host, '.'); if (t && !soap_tag_cmp(t, (const char*)tmp+1)) ok = 1; } OPENSSL_free(tmp); } } } } while (!ok); } X509_free(peer); if (!ok) { soap_set_sender_error(soap, "SSL/TLS error", "SSL/TLS certificate host name mismatch in tcp_connect()", SOAP_SSL_ERROR); soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } } } #endif #ifdef WITH_GNUTLS soap->ssl_flags |= SOAP_SSL_CLIENT; if (!soap->session && (soap->error = soap->fsslauth(soap))) { soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } gnutls_transport_set_ptr(soap->session, (gnutls_transport_ptr_t)(long)sk); /* Set SSL sockets to non-blocking */ if (soap->connect_timeout) { SOAP_SOCKNONBLOCK(sk) retries = 10*soap->connect_timeout; } else SOAP_SOCKBLOCK(sk) if (retries <= 0) retries = 100; /* timeout: 10 sec retries, 100 times 0.1 sec */ while ((r = gnutls_handshake(soap->session))) { int s; /* GNUTLS repeat handhake when GNUTLS_E_AGAIN */ if (retries-- <= 0) break; if (r == GNUTLS_E_AGAIN || r == GNUTLS_E_INTERRUPTED) { if (!gnutls_record_get_direction(soap->session)) s = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, -100000); else s = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, -100000); if (s < 0) break; } else { soap->errnum = soap_socket_errno(sk); break; } } if (r) { soap_set_sender_error(soap, soap_ssl_error(soap, r), "SSL/TLS handshake failed", SOAP_SSL_ERROR); soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } if ((soap->ssl_flags & SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION)) { const char *err = ssl_verify(soap, host); if (err) { soap->fclosesocket(soap, sk); soap->error = soap_set_sender_error(soap, "SSL/TLS verify error", err, SOAP_SSL_ERROR); return SOAP_INVALID_SOCKET; } } #endif #ifdef WITH_SYSTEMSSL soap->ssl_flags |= SOAP_SSL_CLIENT; if (!soap->ctx && (soap->error = soap->fsslauth(soap))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL required, but no ctx set\n")); soap->fclosesocket(soap, sk); soap->error = SOAP_SSL_ERROR; return SOAP_INVALID_SOCKET; } /* Connect timeout: set SSL sockets to non-blocking */ retries = 0; if (soap->connect_timeout) { SOAP_SOCKNONBLOCK(sk) retries = 10*soap->connect_timeout; } else SOAP_SOCKBLOCK(sk) if (retries <= 0) retries = 100; /* timeout: 10 sec retries, 100 times 0.1 sec */ err = gsk_secure_socket_open(soap->ctx, &soap->ssl); if (err == GSK_OK) err = gsk_attribute_set_numeric_value(soap->ssl, GSK_FD, sk); if (err == GSK_OK) err = gsk_attribute_set_buffer(soap->ssl, GSK_KEYRING_LABEL, soap->cafile, 0); /* Certificate label */ if (err == GSK_OK) err = gsk_attribute_set_enum(soap->ssl, GSK_SESSION_TYPE, GSK_CLIENT_SESSION); if (err == GSK_OK) err = gsk_attribute_set_buffer(soap->ssl, GSK_V3_CIPHER_SPECS_EXPANDED, "0035002F000A", 0); if (err == GSK_OK) err = gsk_attribute_set_enum(soap->ssl, GSK_V3_CIPHERS, GSK_V3_CIPHERS_CHAR4); if (err == GSK_OK) err = gsk_attribute_set_callback(soap->ssl, GSK_IO_CALLBACK, &local_io); if (err != GSK_OK) { soap_set_receiver_error(soap, gsk_strerror(err), "SYSTEM SSL error in tcp_connect()", SOAP_SSL_ERROR); return SOAP_INVALID_SOCKET; } /* Try connecting until success or timeout (when nonblocking) */ while ((err = gsk_secure_socket_init(soap->ssl)) != GSK_OK) { if (err == GSK_WOULD_BLOCK_READ || err == GSK_WOULD_BLOCK_WRITE) { if (err == GSK_WOULD_BLOCK_READ) r = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, -100000); else r = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, -100000); if (r < 0) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL_connect/select error in tcp_connect\n")); soap_set_receiver_error(soap, gsk_strerror(err), "gsk_secure_socket_init failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } if (r == 0 && retries-- <= 0) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL/TLS connect timeout\n")); soap_set_receiver_error(soap, "Timeout", "in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } } else { soap_set_receiver_error(soap, gsk_strerror(err), "gsk_secure_socket_init() failed in tcp_connect()", SOAP_SSL_ERROR); soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } } #endif soap->imode |= SOAP_ENC_SSL; soap->omode |= SOAP_ENC_SSL; #else soap->fclosesocket(soap, sk); soap->error = SOAP_SSL_ERROR; return SOAP_INVALID_SOCKET; #endif } if (soap->recv_timeout || soap->send_timeout) SOAP_SOCKNONBLOCK(sk) else SOAP_SOCKBLOCK(sk) return sk; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 static int tcp_select(struct soap *soap, SOAP_SOCKET sk, int flags, int timeout) { int r; struct timeval tv; fd_set fd[3], *rfd, *sfd, *efd; int retries = 0; int eintr = SOAP_MAXEINTR; soap->errnum = 0; #ifndef WIN32 #if !defined(FD_SETSIZE) || defined(__QNX__) || defined(QNX) /* no FD_SETSIZE or select() is not MT safe on some QNX: always poll */ if (1) #else /* if fd max set size exceeded, use poll() */ if ((int)sk >= (int)FD_SETSIZE) #endif #ifdef HAVE_POLL { struct pollfd pollfd; pollfd.fd = (int)sk; pollfd.events = 0; if (flags & SOAP_TCP_SELECT_RCV) pollfd.events |= POLLIN; if (flags & SOAP_TCP_SELECT_SND) pollfd.events |= POLLOUT; if (flags & SOAP_TCP_SELECT_ERR) pollfd.events |= POLLERR; if (timeout <= 0) timeout /= -1000; /* -usec -> ms */ else { retries = timeout - 1; timeout = 1000; } do { r = poll(&pollfd, 1, timeout); if (r < 0 && (soap->errnum = soap_socket_errno(sk)) == SOAP_EINTR && eintr-- > 0) r = 0; else if (retries-- <= 0) break; } while (r == 0); if (r > 0) { r = 0; if ((flags & SOAP_TCP_SELECT_RCV) && (pollfd.revents & POLLIN)) r |= SOAP_TCP_SELECT_RCV; if ((flags & SOAP_TCP_SELECT_SND) && (pollfd.revents & POLLOUT)) r |= SOAP_TCP_SELECT_SND; if ((flags & SOAP_TCP_SELECT_ERR) && (pollfd.revents & POLLERR)) r |= SOAP_TCP_SELECT_ERR; } else if (r == 0) soap->errnum = 0; return r; } #else { soap->error = SOAP_FD_EXCEEDED; return -1; } #endif #endif if (timeout > 0) retries = timeout - 1; do { rfd = sfd = efd = NULL; if (flags & SOAP_TCP_SELECT_RCV) { rfd = &fd[0]; FD_ZERO(rfd); FD_SET(sk, rfd); } if (flags & SOAP_TCP_SELECT_SND) { sfd = &fd[1]; FD_ZERO(sfd); FD_SET(sk, sfd); } if (flags & SOAP_TCP_SELECT_ERR) { efd = &fd[2]; FD_ZERO(efd); FD_SET(sk, efd); } if (timeout <= 0) { tv.tv_sec = -timeout / 1000000; tv.tv_usec = -timeout % 1000000; } else { tv.tv_sec = 1; tv.tv_usec = 0; } r = select((int)sk + 1, rfd, sfd, efd, &tv); if (r < 0 && (soap->errnum = soap_socket_errno(sk)) == SOAP_EINTR && eintr-- > 0) r = 0; else if (retries-- <= 0) break; } while (r == 0); if (r > 0) { r = 0; if ((flags & SOAP_TCP_SELECT_RCV) && FD_ISSET(sk, rfd)) r |= SOAP_TCP_SELECT_RCV; if ((flags & SOAP_TCP_SELECT_SND) && FD_ISSET(sk, sfd)) r |= SOAP_TCP_SELECT_SND; if ((flags & SOAP_TCP_SELECT_ERR) && FD_ISSET(sk, efd)) r |= SOAP_TCP_SELECT_ERR; } else if (r == 0) soap->errnum = 0; return r; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 static SOAP_SOCKET tcp_accept(struct soap *soap, SOAP_SOCKET s, struct sockaddr *a, int *n) { SOAP_SOCKET sk; (void)soap; sk = accept(s, a, (SOAP_SOCKLEN_T*)n); /* portability note: see SOAP_SOCKLEN_T definition in stdsoap2.h */ #ifdef SOCKET_CLOSE_ON_EXIT #ifdef WIN32 #ifndef UNDER_CE SetHandleInformation((HANDLE)sk, HANDLE_FLAG_INHERIT, 0); #endif #else fcntl(sk, F_SETFD, FD_CLOEXEC); #endif #endif return sk; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 static int tcp_disconnect(struct soap *soap) { #ifdef WITH_OPENSSL if (soap->ssl) { int r, s = 0; if (soap->session) { SSL_SESSION_free(soap->session); soap->session = NULL; } if (*soap->host) { soap->session = SSL_get1_session(soap->ssl); if (soap->session) { soap_strcpy(soap->session_host, sizeof(soap->session_host), soap->host); soap->session_port = soap->port; } } r = SSL_shutdown(soap->ssl); /* SSL shutdown does not work when reads are pending, non-blocking */ if (r == 0) { while (SSL_want_read(soap->ssl)) { if (SSL_read(soap->ssl, NULL, 0) || soap_socket_errno(soap->socket) != SOAP_EAGAIN) { r = SSL_shutdown(soap->ssl); break; } } } if (r == 0) { if (soap_valid_socket(soap->socket)) { if (!soap->fshutdownsocket(soap, soap->socket, SOAP_SHUT_WR)) { #if !defined(WITH_LEAN) && !defined(WIN32) /* wait up to 5 seconds for close_notify to be sent by peer (if peer not present, this avoids calling SSL_shutdown() which has a lengthy return timeout) */ r = tcp_select(soap, soap->socket, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, 5); if (r <= 0) { soap->errnum = 0; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connection lost...\n")); soap->fclosesocket(soap, soap->socket); soap->socket = SOAP_INVALID_SOCKET; ERR_remove_state(0); SSL_free(soap->ssl); soap->ssl = NULL; return SOAP_OK; } #else r = SSL_shutdown(soap->ssl); #endif } } } if (r != 1) { s = ERR_get_error(); if (s) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Shutdown failed: %d\n", SSL_get_error(soap->ssl, r))); if (soap_valid_socket(soap->socket) && !(soap->omode & SOAP_IO_UDP)) { soap->fclosesocket(soap, soap->socket); soap->socket = SOAP_INVALID_SOCKET; } } } SSL_free(soap->ssl); soap->ssl = NULL; if (s) return SOAP_SSL_ERROR; ERR_remove_state(0); } #endif #ifdef WITH_GNUTLS if (soap->session) { gnutls_bye(soap->session, GNUTLS_SHUT_RDWR); gnutls_deinit(soap->session); soap->session = NULL; } #endif #ifdef WITH_SYSTEMSSL if (soap->ssl) { gsk_secure_socket_shutdown(soap->ssl); gsk_secure_socket_close(&soap->ssl); } #endif if (soap_valid_socket(soap->socket) && !(soap->omode & SOAP_IO_UDP)) { soap->fshutdownsocket(soap, soap->socket, SOAP_SHUT_RDWR); soap->fclosesocket(soap, soap->socket); soap->socket = SOAP_INVALID_SOCKET; } return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 static int tcp_closesocket(struct soap *soap, SOAP_SOCKET sk) { (void)soap; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Close socket=%d\n", (int)sk)); return soap_closesocket(sk); } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 static int tcp_shutdownsocket(struct soap *soap, SOAP_SOCKET sk, int how) { (void)soap; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Shutdown socket=%d how=%d\n", (int)sk, how)); return shutdown(sk, how); } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 SOAP_FMAC1 SOAP_SOCKET SOAP_FMAC2 soap_bind(struct soap *soap, const char *host, int port, int backlog) { #ifdef WITH_IPV6 struct addrinfo *addrinfo = NULL; struct addrinfo hints; struct addrinfo res; int err; #ifdef WITH_NO_IPV6_V6ONLY int unset = 0; #endif #endif #ifndef WITH_LEAN #ifndef WIN32 int len = sizeof(soap->buf); #else int len = sizeof(soap->buf) + 1; /* speeds up windows xfer */ #endif int set = 1; #endif if (soap_valid_socket(soap->master)) { soap->fclosesocket(soap, soap->master); soap->master = SOAP_INVALID_SOCKET; } soap->socket = SOAP_INVALID_SOCKET; soap->errmode = 1; if (tcp_init(soap)) { soap_set_receiver_error(soap, tcp_error(soap), "TCP init failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } #ifdef WITH_IPV6 memset((void*)&hints, 0, sizeof(hints)); #ifdef WITH_IPV6_V6ONLY hints.ai_family = PF_INET6; #else hints.ai_family = PF_UNSPEC; #endif #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) hints.ai_socktype = SOCK_DGRAM; else #endif hints.ai_socktype = SOCK_STREAM; hints.ai_flags = AI_PASSIVE; soap->errmode = 2; err = getaddrinfo(host, soap_int2s(soap, port), &hints, &addrinfo); if (err || !addrinfo) { soap_set_receiver_error(soap, SOAP_GAI_STRERROR(err), "getaddrinfo failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } res = *addrinfo; if (soap_memcpy((void*)&soap->peer.storage, sizeof(soap->peer.storage), (const void*)addrinfo->ai_addr, addrinfo->ai_addrlen)) { soap->error = SOAP_EOM; return SOAP_INVALID_SOCKET; } soap->peerlen = addrinfo->ai_addrlen; res.ai_addr = &soap->peer.addr; res.ai_addrlen = soap->peerlen; freeaddrinfo(addrinfo); soap->master = (int)socket(res.ai_family, res.ai_socktype, res.ai_protocol); #else #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) soap->master = (int)socket(AF_INET, SOCK_DGRAM, 0); else #endif soap->master = (int)socket(AF_INET, SOCK_STREAM, 0); #endif soap->errmode = 0; if (!soap_valid_socket(soap->master)) { soap->errnum = soap_socket_errno(soap->master); soap_set_receiver_error(soap, tcp_error(soap), "socket failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } soap->port = port; #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) soap->socket = soap->master; #endif #ifdef SOCKET_CLOSE_ON_EXIT #ifdef WIN32 #ifndef UNDER_CE SetHandleInformation((HANDLE)soap->master, HANDLE_FLAG_INHERIT, 0); #endif #else fcntl(soap->master, F_SETFD, 1); #endif #endif #ifndef WITH_LEAN if (soap->bind_flags && setsockopt(soap->master, SOL_SOCKET, soap->bind_flags, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(soap->master); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } #ifndef UNDER_CE if (((soap->imode | soap->omode) & SOAP_IO_KEEPALIVE) && (!((soap->imode | soap->omode) & SOAP_IO_UDP)) && setsockopt(soap->master, SOL_SOCKET, SO_KEEPALIVE, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(soap->master); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_KEEPALIVE failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } if (setsockopt(soap->master, SOL_SOCKET, SO_SNDBUF, (char*)&len, sizeof(int))) { soap->errnum = soap_socket_errno(soap->master); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_SNDBUF failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } if (setsockopt(soap->master, SOL_SOCKET, SO_RCVBUF, (char*)&len, sizeof(int))) { soap->errnum = soap_socket_errno(soap->master); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_RCVBUF failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } #ifdef TCP_NODELAY if (!(soap->omode & SOAP_IO_UDP) && setsockopt(soap->master, IPPROTO_TCP, TCP_NODELAY, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(soap->master); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt TCP_NODELAY failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } #endif #ifdef TCP_FASTOPEN if (!(soap->omode & SOAP_IO_UDP) && setsockopt(soap->master, SOL_TCP, TCP_FASTOPEN, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(soap->master); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt TCP_FASTOPEN failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } #endif #endif #endif #ifdef WITH_IPV6 #ifdef WITH_IPV6_V6ONLY if (res.ai_family == AF_INET6 && setsockopt(soap->master, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(soap->master); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt set IPV6_V6ONLY failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } #endif #ifdef WITH_NO_IPV6_V6ONLY if (res.ai_family == AF_INET6 && setsockopt(soap->master, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&unset, sizeof(int))) { soap->errnum = soap_socket_errno(soap->master); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt unset IPV6_V6ONLY failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } #endif soap->errmode = 0; if (bind(soap->master, res.ai_addr, (int)res.ai_addrlen)) { soap->errnum = soap_socket_errno(soap->master); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not bind to host\n")); soap_closesock(soap); soap_set_receiver_error(soap, tcp_error(soap), "bind failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } #else soap->peerlen = sizeof(soap->peer.in); memset((void*)&soap->peer.in, 0, sizeof(soap->peer.in)); soap->peer.in.sin_family = AF_INET; soap->errmode = 2; if (host) { if (soap->fresolve(soap, host, &soap->peer.in.sin_addr)) { soap_set_receiver_error(soap, tcp_error(soap), "get host by name failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } } else soap->peer.in.sin_addr.s_addr = htonl(INADDR_ANY); soap->peer.in.sin_port = htons((short)port); soap->errmode = 0; if (bind(soap->master, &soap->peer.addr, (int)soap->peerlen)) { soap->errnum = soap_socket_errno(soap->master); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not bind to host\n")); soap_closesock(soap); soap_set_receiver_error(soap, tcp_error(soap), "bind failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } #endif if (!(soap->omode & SOAP_IO_UDP) && listen(soap->master, backlog)) { soap->errnum = soap_socket_errno(soap->master); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not bind to host\n")); soap_closesock(soap); soap_set_receiver_error(soap, tcp_error(soap), "listen failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } return soap->master; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_poll(struct soap *soap) { #ifndef WITH_LEAN int r; if (soap_valid_socket(soap->socket)) { r = tcp_select(soap, soap->socket, SOAP_TCP_SELECT_ALL, 0); if (r > 0 && (r & SOAP_TCP_SELECT_ERR)) r = -1; } else if (soap_valid_socket(soap->master)) r = tcp_select(soap, soap->master, SOAP_TCP_SELECT_SND, 0); else return SOAP_OK; /* OK when no socket! */ if (r > 0) { #ifdef WITH_OPENSSL if (soap->imode & SOAP_ENC_SSL) { if (soap_valid_socket(soap->socket) && (r & SOAP_TCP_SELECT_SND) && (!(r & SOAP_TCP_SELECT_RCV) || SSL_peek(soap->ssl, soap->tmpbuf, 1) > 0)) return SOAP_OK; } else #endif { int t; if (soap_valid_socket(soap->socket) && (r & SOAP_TCP_SELECT_SND) && (!(r & SOAP_TCP_SELECT_RCV) || recv(soap->socket, (char*)&t, 1, MSG_PEEK) > 0)) return SOAP_OK; } } else if (r < 0) { if ((soap_valid_socket(soap->master) || soap_valid_socket(soap->socket)) && soap_socket_errno(soap->master) != SOAP_EINTR) { soap_set_receiver_error(soap, tcp_error(soap), "select failed in soap_poll()", SOAP_TCP_ERROR); return soap->error = SOAP_TCP_ERROR; } } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Polling: other end down on socket=%d select=%d\n", soap->socket, r)); return SOAP_EOF; #else (void)soap; return SOAP_OK; #endif } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 SOAP_FMAC1 SOAP_SOCKET SOAP_FMAC2 soap_accept(struct soap *soap) { int n = (int)sizeof(soap->peer); int err; #ifndef WITH_LEAN #ifndef WIN32 int len = sizeof(soap->buf); #else int len = sizeof(soap->buf) + 1; /* speeds up windows xfer */ #endif int set = 1; #endif soap->error = SOAP_OK; memset((void*)&soap->peer, 0, sizeof(soap->peer)); soap->socket = SOAP_INVALID_SOCKET; soap->errmode = 0; soap->keep_alive = 0; if (!soap_valid_socket(soap->master)) { soap->errnum = 0; soap_set_receiver_error(soap, tcp_error(soap), "no master socket in soap_accept()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) return soap->socket = soap->master; #endif for (;;) { if (soap->accept_timeout || soap->send_timeout || soap->recv_timeout) { for (;;) { int r; r = tcp_select(soap, soap->master, SOAP_TCP_SELECT_ALL, soap->accept_timeout ? soap->accept_timeout : 60); if (r > 0) break; if (!r && soap->accept_timeout) { soap_set_receiver_error(soap, "Timeout", "accept failed in soap_accept()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } if (r < 0) { r = soap->errnum; if (r != SOAP_EINTR) { soap_closesock(soap); soap_set_receiver_error(soap, tcp_error(soap), "accept failed in soap_accept()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } } } } if (soap->accept_timeout) SOAP_SOCKNONBLOCK(soap->master) else SOAP_SOCKBLOCK(soap->master) n = (int)sizeof(soap->peer); soap->socket = soap->faccept(soap, soap->master, &soap->peer.addr, &n); soap->peerlen = (size_t)n; if (soap_valid_socket(soap->socket)) { #ifdef WITH_IPV6 char *s = soap->host; char port[16]; int i; getnameinfo(&soap->peer.addr, n, soap->host, sizeof(soap->host), port, sizeof(port), NI_NUMERICHOST | NI_NUMERICSERV); soap->ip = 0; for (i = 0; i < 4 && *s; i++) { soap->ip = (soap->ip << 8) + (unsigned int)soap_strtoul(s, &s, 10); if (*s) s++; } soap->port = soap_strtol(port, NULL, 10); #else soap->ip = ntohl(soap->peer.in.sin_addr.s_addr); (SOAP_SNPRINTF(soap->host, sizeof(soap->host), 80), "%u.%u.%u.%u", (int)(soap->ip>>24)&0xFF, (int)(soap->ip>>16)&0xFF, (int)(soap->ip>>8)&0xFF, (int)soap->ip&0xFF); soap->port = (int)ntohs(soap->peer.in.sin_port); /* does not return port number on some systems */ #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Accept socket=%d at port=%d from IP='%s'\n", soap->socket, soap->port, soap->host)); #ifndef WITH_LEAN if ((soap->accept_flags & SO_LINGER)) { struct linger linger; memset((void*)&linger, 0, sizeof(linger)); linger.l_onoff = 1; linger.l_linger = soap->linger_time; if (setsockopt(soap->socket, SOL_SOCKET, SO_LINGER, (char*)&linger, sizeof(struct linger))) { soap->errnum = soap_socket_errno(soap->socket); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_LINGER failed in soap_accept()", SOAP_TCP_ERROR); soap_closesock(soap); return SOAP_INVALID_SOCKET; } } if ((soap->accept_flags & ~SO_LINGER) && setsockopt(soap->socket, SOL_SOCKET, soap->accept_flags & ~SO_LINGER, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(soap->socket); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt failed in soap_accept()", SOAP_TCP_ERROR); soap_closesock(soap); return SOAP_INVALID_SOCKET; } #ifndef UNDER_CE if (((soap->imode | soap->omode) & SOAP_IO_KEEPALIVE) && setsockopt(soap->socket, SOL_SOCKET, SO_KEEPALIVE, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(soap->socket); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_KEEPALIVE failed in soap_accept()", SOAP_TCP_ERROR); soap_closesock(soap); return SOAP_INVALID_SOCKET; } if (setsockopt(soap->socket, SOL_SOCKET, SO_SNDBUF, (char*)&len, sizeof(int))) { soap->errnum = soap_socket_errno(soap->socket); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_SNDBUF failed in soap_accept()", SOAP_TCP_ERROR); soap_closesock(soap); return SOAP_INVALID_SOCKET; } if (setsockopt(soap->socket, SOL_SOCKET, SO_RCVBUF, (char*)&len, sizeof(int))) { soap->errnum = soap_socket_errno(soap->socket); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_RCVBUF failed in soap_accept()", SOAP_TCP_ERROR); soap_closesock(soap); return SOAP_INVALID_SOCKET; } #ifdef TCP_NODELAY if (setsockopt(soap->socket, IPPROTO_TCP, TCP_NODELAY, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(soap->socket); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt TCP_NODELAY failed in soap_accept()", SOAP_TCP_ERROR); soap_closesock(soap); return SOAP_INVALID_SOCKET; } #endif #endif #endif soap->keep_alive = (((soap->imode | soap->omode) & SOAP_IO_KEEPALIVE) != 0); if (soap->send_timeout || soap->recv_timeout) SOAP_SOCKNONBLOCK(soap->socket) else SOAP_SOCKBLOCK(soap->socket) return soap->socket; } err = soap_socket_errno(soap->socket); if (err != 0 && err != SOAP_EINTR && err != SOAP_EAGAIN && err != SOAP_EWOULDBLOCK) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Accept failed from %s\n", soap->host)); soap->errnum = err; soap_set_receiver_error(soap, tcp_error(soap), "accept failed in soap_accept()", SOAP_TCP_ERROR); soap_closesock(soap); return SOAP_INVALID_SOCKET; } } } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_closesock(struct soap *soap) { int status = soap->error; #ifndef WITH_LEANER if (status) /* close on error: attachment state is not to be trusted */ { soap->mime.first = NULL; soap->mime.last = NULL; soap->dime.first = NULL; soap->dime.last = NULL; } #endif if (soap->fdisconnect && (soap->error = soap->fdisconnect(soap))) return soap->error; if (status == SOAP_EOF || status == SOAP_TCP_ERROR || status == SOAP_SSL_ERROR || !soap->keep_alive) { if (soap->fclose && (soap->error = soap->fclose(soap))) return soap->error; soap->keep_alive = 0; } #ifdef WITH_ZLIB if (!(soap->mode & SOAP_MIME_POSTCHECK)) { if (soap->zlib_state == SOAP_ZLIB_DEFLATE) deflateEnd(soap->d_stream); else if (soap->zlib_state == SOAP_ZLIB_INFLATE) inflateEnd(soap->d_stream); soap->zlib_state = SOAP_ZLIB_NONE; } #endif return soap->error = status; } #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_force_closesock(struct soap *soap) { soap->keep_alive = 0; if (soap_valid_socket(soap->socket)) return soap_closesocket(soap->socket); return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_cleanup(struct soap *soap) { soap_done(soap); #ifdef WIN32 if (!tcp_done) return; tcp_done = 0; WSACleanup(); #endif } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_done(struct soap *soap) { #ifdef SOAP_DEBUG int i; #endif if (soap_check_state(soap)) return; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Done with context%s\n", soap->state == SOAP_COPY ? " copy" : "")); soap_free_temp(soap); while (soap->clist) { struct soap_clist *p = soap->clist->next; SOAP_FREE(soap, soap->clist); soap->clist = p; } if (soap->state == SOAP_INIT) soap->omode &= ~SOAP_IO_UDP; /* to force close the socket */ soap->keep_alive = 0; /* to force close the socket */ if (soap->master == soap->socket) /* do not close twice */ soap->master = SOAP_INVALID_SOCKET; soap_closesock(soap); #ifdef WITH_COOKIES soap_free_cookies(soap); #endif while (soap->plugins) { struct soap_plugin *p = soap->plugins->next; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Removing plugin '%s'\n", soap->plugins->id)); if (soap->plugins->fcopy || soap->state == SOAP_INIT) soap->plugins->fdelete(soap, soap->plugins); SOAP_FREE(soap, soap->plugins); soap->plugins = p; } soap->fplugin = fplugin; soap->fmalloc = NULL; #ifndef WITH_NOHTTP soap->fpost = http_post; soap->fget = http_get; soap->fput = http_405; soap->fdel = http_405; soap->fopt = http_200; soap->fhead = http_200; soap->fform = NULL; soap->fposthdr = http_post_header; soap->fresponse = http_response; soap->fparse = http_parse; soap->fparsehdr = http_parse_header; #endif soap->fheader = NULL; #ifndef WITH_NOIO #ifndef WITH_IPV6 soap->fresolve = tcp_gethost; #else soap->fresolve = NULL; #endif soap->faccept = tcp_accept; soap->fopen = tcp_connect; soap->fclose = tcp_disconnect; soap->fclosesocket = tcp_closesocket; soap->fshutdownsocket = tcp_shutdownsocket; soap->fsend = fsend; soap->frecv = frecv; soap->fpoll = soap_poll; #else soap->fopen = NULL; soap->fclose = NULL; soap->fpoll = NULL; #endif #ifndef WITH_LEANER soap->fsvalidate = NULL; soap->fwvalidate = NULL; soap->feltbegin = NULL; soap->feltendin = NULL; soap->feltbegout = NULL; soap->feltendout = NULL; soap->fprepareinitsend = NULL; soap->fprepareinitrecv = NULL; soap->fpreparesend = NULL; soap->fpreparerecv = NULL; soap->fpreparefinalsend = NULL; soap->fpreparefinalrecv = NULL; soap->ffiltersend = NULL; soap->ffilterrecv = NULL; #endif soap->fseterror = NULL; soap->fignore = NULL; soap->fserveloop = NULL; #ifdef WITH_OPENSSL if (soap->session) { SSL_SESSION_free(soap->session); soap->session = NULL; } #endif if (soap->state == SOAP_INIT) { if (soap_valid_socket(soap->master)) { soap->fclosesocket(soap, soap->master); soap->master = SOAP_INVALID_SOCKET; } } #ifdef WITH_OPENSSL if (soap->ssl) { SSL_free(soap->ssl); soap->ssl = NULL; } if (soap->state == SOAP_INIT) { if (soap->ctx) { SSL_CTX_free(soap->ctx); soap->ctx = NULL; } } ERR_remove_state(0); #endif #ifdef WITH_GNUTLS if (soap->state == SOAP_INIT) { if (soap->xcred) { gnutls_certificate_free_credentials(soap->xcred); soap->xcred = NULL; } if (soap->acred) { gnutls_anon_free_client_credentials(soap->acred); soap->acred = NULL; } if (soap->cache) { gnutls_priority_deinit(soap->cache); soap->cache = NULL; } if (soap->dh_params) { gnutls_dh_params_deinit(soap->dh_params); soap->dh_params = NULL; } if (soap->rsa_params) { gnutls_rsa_params_deinit(soap->rsa_params); soap->rsa_params = NULL; } } if (soap->session) { gnutls_deinit(soap->session); soap->session = NULL; } #endif #ifdef WITH_SYSTEMSSL if (soap->ssl) gsk_secure_socket_close(&soap->ssl); if (soap->state == SOAP_INIT) if (soap->ctx) gsk_environment_close(&soap->ctx); #endif #ifdef WITH_C_LOCALE if (soap->c_locale) { # ifdef WIN32 _free_locale(soap->c_locale); # else freelocale(soap->c_locale); # endif soap->c_locale = NULL; } #endif #ifdef WITH_ZLIB if (soap->d_stream) { SOAP_FREE(soap, soap->d_stream); soap->d_stream = NULL; } if (soap->z_buf) { SOAP_FREE(soap, soap->z_buf); soap->z_buf = NULL; } #endif #ifdef SOAP_DEBUG DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free logfiles\n")); for (i = 0; i < SOAP_MAXLOGS; i++) { if (soap->logfile[i]) { SOAP_FREE(soap, soap->logfile[i]); soap->logfile[i] = NULL; } soap_close_logfile(soap, i); } soap->state = SOAP_NONE; #endif #ifdef SOAP_MEM_DEBUG soap_free_mht(soap); #endif } #endif /******************************************************************************\ * * HTTP * \******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 static int http_parse(struct soap *soap) { char header[SOAP_HDRLEN], *s; unsigned short httpcmd = 0; int status = 0; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Waiting for HTTP request/response...\n")); *soap->endpoint = '\0'; #ifdef WITH_NTLM if (!soap->ntlm_challenge) #endif { soap->userid = NULL; soap->passwd = NULL; soap->authrealm = NULL; } #ifdef WITH_NTLM soap->ntlm_challenge = NULL; #endif soap->proxy_from = NULL; do { soap->length = 0; soap->http_content = NULL; soap->action = NULL; soap->status = 0; soap->body = 1; if (soap_getline(soap, soap->msgbuf, sizeof(soap->msgbuf))) { if (soap->error == SOAP_EOF) return SOAP_EOF; return soap->error = 414; } if ((s = strchr(soap->msgbuf, ' '))) { soap->status = (unsigned short)soap_strtoul(s, &s, 10); if (!soap_blank((soap_wchar)*s)) soap->status = 0; } else soap->status = 0; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "HTTP status: %s\n", soap->msgbuf)); for (;;) { if (soap_getline(soap, header, SOAP_HDRLEN)) { if (soap->error == SOAP_EOF) { soap->error = SOAP_OK; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "EOF in HTTP header, continue anyway\n")); break; } return soap->error; } if (!*header) break; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "HTTP header: %s\n", header)); s = strchr(header, ':'); if (s) { char *t; *s = '\0'; do s++; while (*s && *s <= 32); if (*s == '"') s++; t = s + strlen(s) - 1; while (t > s && *t <= 32) t--; if (t >= s && *t == '"') t--; t[1] = '\0'; if ((soap->error = soap->fparsehdr(soap, header, s))) { if (soap->error < SOAP_STOP) return soap->error; status = soap->error; soap->error = SOAP_OK; } } } } while (soap->status == 100); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Finished HTTP header parsing, status = %d\n", soap->status)); s = strstr(soap->msgbuf, "HTTP/"); if (s && s[7] != '1') { if (soap->keep_alive == 1) soap->keep_alive = 0; if (soap->status == 0 && (soap->omode & SOAP_IO) == SOAP_IO_CHUNK) /* soap->status == 0 for HTTP request */ soap->omode = (soap->omode & ~SOAP_IO) | SOAP_IO_STORE; /* HTTP 1.0 does not support chunked transfers */ } if (soap->keep_alive < 0) soap->keep_alive = 1; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Keep alive connection = %d\n", soap->keep_alive)); if (soap->status == 0) { size_t l = 0; if (s) { if (!strncmp(soap->msgbuf, "POST ", l = 5)) httpcmd = 1; else if (!strncmp(soap->msgbuf, "PUT ", l = 4)) httpcmd = 2; else if (!strncmp(soap->msgbuf, "GET ", l = 4)) httpcmd = 3; else if (!strncmp(soap->msgbuf, "DELETE ", l = 7)) httpcmd = 4; else if (!strncmp(soap->msgbuf, "OPTIONS ", l = 8)) httpcmd = 5; else if (!strncmp(soap->msgbuf, "HEAD ", l = 5)) httpcmd = 6; } if (s && httpcmd) { size_t m, n, k; while (soap_blank(soap->msgbuf[l])) l++; m = strlen(soap->endpoint); n = m + (s - soap->msgbuf) - l - 1; if (n >= sizeof(soap->endpoint)) n = sizeof(soap->endpoint) - 1; if (m > n) m = n; k = n - m + 1; if (k >= sizeof(soap->path)) k = sizeof(soap->path) - 1; while (k > 0 && soap_blank(soap->msgbuf[l + k - 1])) k--; soap_strncpy(soap->path, sizeof(soap->path), soap->msgbuf + l, k); if (*soap->path && *soap->path != '/') soap_strncpy(soap->endpoint, sizeof(soap->endpoint), soap->path, k); else soap_strncat(soap->endpoint, sizeof(soap->endpoint), soap->path, k); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Target endpoint='%s' path='%s'\n", soap->endpoint, soap->path)); if (httpcmd > 1) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "HTTP %s handler\n", soap->msgbuf)); switch (httpcmd) { case 2: soap->error = soap->fput(soap); break; case 3: soap->error = soap->fget(soap); break; case 4: soap->error = soap->fdel(soap); break; case 5: soap->error = soap->fopt(soap); break; case 6: soap->error = soap->fhead(soap); break; default: soap->error = 405; break; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "HTTP handler return = %d\n", soap->error)); if (soap->error == SOAP_OK) soap->error = SOAP_STOP; /* prevents further processing */ return soap->error; } if (status) return soap->error = status; } else if (status) return soap->error = status; else if (s) return soap->error = 405; return SOAP_OK; } #if 0 if (soap->length > 0 || (soap->http_content && (!soap->keep_alive || soap->recv_timeout)) || (soap->imode & SOAP_IO) == SOAP_IO_CHUNK) #endif if (soap->body) { if ((soap->status >= 200 && soap->status <= 299) /* OK, Accepted, etc */ || soap->status == 400 /* Bad Request */ || soap->status == 500) /* Internal Server Error */ return soap->error = SOAP_OK; /* force close afterwards in soap_closesock() */ soap->keep_alive = 0; #ifndef WITH_LEAN /* read HTTP body for error details */ s = soap_get_http_body(soap, NULL); if (s) return soap_set_receiver_error(soap, soap->msgbuf, s, soap->status); #endif } else if (soap->status >= 200 && soap->status <= 299) return soap->error = soap->status; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "HTTP error %d: %s\n", soap->status, soap->msgbuf)); return soap_set_receiver_error(soap, "HTTP Error", soap->msgbuf, soap->status); } #endif #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 static int http_parse_header(struct soap *soap, const char *key, const char *val) { if (!soap_tag_cmp(key, "Host")) { #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) if (soap->imode & SOAP_ENC_SSL) soap_strcpy(soap->endpoint, sizeof(soap->endpoint), "https://"); else #endif soap_strcpy(soap->endpoint, sizeof(soap->endpoint), "http://"); soap_strncat(soap->endpoint, sizeof(soap->endpoint), val, sizeof(soap->endpoint) - 9); } #ifndef WITH_LEANER else if (!soap_tag_cmp(key, "Content-Type")) { const char *action; soap->http_content = soap_strdup(soap, val); if (soap_get_header_attribute(soap, val, "application/dime")) soap->imode |= SOAP_ENC_DIME; else if (soap_get_header_attribute(soap, val, "multipart/related") || soap_get_header_attribute(soap, val, "multipart/form-data")) { soap->mime.boundary = soap_strdup(soap, soap_get_header_attribute(soap, val, "boundary")); soap->mime.start = soap_strdup(soap, soap_get_header_attribute(soap, val, "start")); soap->imode |= SOAP_ENC_MIME; } action = soap_get_header_attribute(soap, val, "action"); if (action) { if (*action == '"') { soap->action = soap_strdup(soap, action + 1); if (*soap->action) soap->action[strlen(soap->action) - 1] = '\0'; } else soap->action = soap_strdup(soap, action); } } #endif else if (!soap_tag_cmp(key, "Content-Length")) { soap->length = soap_strtoul(val, NULL, 10); if (!soap->length) soap->body = 0; } else if (!soap_tag_cmp(key, "Content-Encoding")) { if (!soap_tag_cmp(val, "deflate")) #ifdef WITH_ZLIB soap->zlib_in = SOAP_ZLIB_DEFLATE; #else return SOAP_ZLIB_ERROR; #endif else if (!soap_tag_cmp(val, "gzip")) #ifdef WITH_GZIP soap->zlib_in = SOAP_ZLIB_GZIP; #else return SOAP_ZLIB_ERROR; #endif } #ifdef WITH_ZLIB else if (!soap_tag_cmp(key, "Accept-Encoding")) { #ifdef WITH_GZIP if (strchr(val, '*') || soap_get_header_attribute(soap, val, "gzip")) soap->zlib_out = SOAP_ZLIB_GZIP; else #endif if (strchr(val, '*') || soap_get_header_attribute(soap, val, "deflate")) soap->zlib_out = SOAP_ZLIB_DEFLATE; else soap->zlib_out = SOAP_ZLIB_NONE; } #endif else if (!soap_tag_cmp(key, "Transfer-Encoding")) { soap->imode &= ~SOAP_IO; if (!soap_tag_cmp(val, "chunked")) soap->imode |= SOAP_IO_CHUNK; } else if (!soap_tag_cmp(key, "Connection")) { if (!soap_tag_cmp(val, "keep-alive")) soap->keep_alive = -soap->keep_alive; else if (!soap_tag_cmp(val, "close")) soap->keep_alive = 0; } #if !defined(WITH_LEAN) || defined(WITH_NTLM) else if (!soap_tag_cmp(key, "Authorization") || !soap_tag_cmp(key, "Proxy-Authorization")) { #ifdef WITH_NTLM if (!soap_tag_cmp(val, "NTLM*")) soap->ntlm_challenge = soap_strdup(soap, val + 4); else #endif if (!soap_tag_cmp(val, "Basic *")) { int n; char *s; soap_base642s(soap, val + 6, soap->tmpbuf, sizeof(soap->tmpbuf) - 1, &n); soap->tmpbuf[n] = '\0'; if ((s = strchr(soap->tmpbuf, ':'))) { *s = '\0'; soap->userid = soap_strdup(soap, soap->tmpbuf); soap->passwd = soap_strdup(soap, s + 1); } } } else if (!soap_tag_cmp(key, "WWW-Authenticate") || !soap_tag_cmp(key, "Proxy-Authenticate")) { #ifdef WITH_NTLM if (!soap_tag_cmp(val, "NTLM*")) soap->ntlm_challenge = soap_strdup(soap, val + 4); else #endif soap->authrealm = soap_strdup(soap, soap_get_header_attribute(soap, val + 6, "realm")); } else if (!soap_tag_cmp(key, "Expect")) { if (!soap_tag_cmp(val, "100-continue")) { if ((soap->error = soap->fposthdr(soap, "HTTP/1.1 100 Continue", NULL)) || (soap->error = soap->fposthdr(soap, NULL, NULL))) return soap->error; } } #endif else if (!soap_tag_cmp(key, "SOAPAction")) { if (*val == '"') { soap->action = soap_strdup(soap, val + 1); if (*soap->action) soap->action[strlen(soap->action) - 1] = '\0'; } else soap->action = soap_strdup(soap, val); } else if (!soap_tag_cmp(key, "Location")) { soap_strcpy(soap->endpoint, sizeof(soap->endpoint), val); } else if (!soap_tag_cmp(key, "X-Forwarded-For")) { soap->proxy_from = soap_strdup(soap, val); } #ifdef WITH_COOKIES else if (!soap_tag_cmp(key, "Cookie") || !soap_tag_cmp(key, "Cookie2") || !soap_tag_cmp(key, "Set-Cookie") || !soap_tag_cmp(key, "Set-Cookie2")) { soap_getcookies(soap, val); } #endif return SOAP_OK; } #endif #endif /******************************************************************************/ #if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) #ifndef PALM_1 SOAP_FMAC1 const char* SOAP_FMAC2 soap_get_header_attribute(struct soap *soap, const char *line, const char *key) { const char *s = line; if (s) { while (*s) { short flag; s = soap_decode_key(soap->tmpbuf, sizeof(soap->tmpbuf), s); flag = soap_tag_cmp(soap->tmpbuf, key); s = soap_decode_val(soap->tmpbuf, sizeof(soap->tmpbuf), s); if (!flag) return soap->tmpbuf; } } return NULL; } #endif #endif /******************************************************************************/ #if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) #ifndef PALM_1 SOAP_FMAC1 const char* SOAP_FMAC2 soap_decode_key(char *buf, size_t len, const char *val) { return soap_decode(buf, len, val, "=,;"); } #endif #endif /******************************************************************************/ #if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) #ifndef PALM_1 SOAP_FMAC1 const char* SOAP_FMAC2 soap_decode_val(char *buf, size_t len, const char *val) { if (*val != '=') { *buf = '\0'; return val; } return soap_decode(buf, len, val + 1, ",;"); } #endif #endif /******************************************************************************/ #if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) #ifndef PALM_1 static const char* soap_decode(char *buf, size_t len, const char *val, const char *sep) { const char *s; char *t = buf; size_t i = len; for (s = val; *s; s++) if (*s != ' ' && *s != '\t' && !strchr(sep, *s)) break; if (len > 0) { if (*s == '"') { s++; while (*s && *s != '"' && --i) *t++ = *s++; } else { while (*s && !soap_blank((soap_wchar)*s) && !strchr(sep, *s) && --i) { if (*s == '%' && s[1] && s[2]) { *t++ = ((s[1] >= 'A' ? (s[1] & 0x7) + 9 : s[1] - '0') << 4) + (s[2] >= 'A' ? (s[2] & 0x7) + 9 : s[2] - '0'); s += 3; } else *t++ = *s++; } } buf[len - 1] = '\0'; /* appease */ } *t = '\0'; while (*s && !strchr(sep, *s)) s++; return s; } #endif #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 static const char* http_error(struct soap *soap, int status) { const char *msg = SOAP_STR_EOS; (void)soap; (void)status; #ifndef WITH_LEAN msg = soap_code_str(h_http_error_codes, status); if (!msg) msg = SOAP_STR_EOS; #endif return msg; } #endif #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 static int http_get(struct soap *soap) { (void)soap; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "HTTP GET request\n")); return SOAP_GET_METHOD; } #endif #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 static int http_405(struct soap *soap) { (void)soap; return 405; } #endif #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 static int http_200(struct soap *soap) { return soap_send_empty_response(soap, 200); } #endif #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 static int http_post(struct soap *soap, const char *endpoint, const char *host, int port, const char *path, const char *action, size_t count) { const char *s; int err; size_t l; switch (soap->status) { case SOAP_GET: s = "GET"; break; case SOAP_PUT: s = "PUT"; break; case SOAP_DEL: s = "DELETE"; break; case SOAP_CONNECT: s = "CONNECT"; break; default: s = "POST"; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "HTTP %s to %s\n", s, endpoint ? endpoint : "(null)")); #ifdef PALM if (!endpoint || (soap_tag_cmp(endpoint, "http:*") && soap_tag_cmp(endpoint, "https:*") && strncmp(endpoint, "_beam:", 6) && strncmp(endpoint, "_local:", 7) && strncmp(endpoint, "_btobex:", 8)) #else if (!endpoint || (soap_tag_cmp(endpoint, "http:*") && soap_tag_cmp(endpoint, "https:*") && soap_tag_cmp(endpoint, "httpg:*"))) #endif return SOAP_OK; /* set l to prevent overruns ('host' and 'soap->host' are substrings of 'endpoint') */ l = strlen(endpoint) + strlen(soap->http_version) + 80; if (l > sizeof(soap->tmpbuf)) return soap->error = SOAP_EOM; if (soap->status == SOAP_CONNECT) (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), l), "%s %s:%d HTTP/%s", s, soap->host, soap->port, soap->http_version); else if (soap->proxy_host && endpoint) (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), l), "%s %s HTTP/%s", s, endpoint, soap->http_version); else (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), l), "%s /%s HTTP/%s", s, (*path == '/' ? path + 1 : path), soap->http_version); if ((err = soap->fposthdr(soap, soap->tmpbuf, NULL))) return err; #ifdef WITH_OPENSSL if ((soap->ssl && port != 443) || (!soap->ssl && port != 80)) #else if (port != 80) #endif { #ifdef WITH_IPV6 if (*host != '[' && strchr(host, ':')) (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), l), "[%s]:%d", host, port); /* RFC 2732 */ else #endif (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), l), "%s:%d", host, port); } else { #ifdef WITH_IPV6 if (*host != '[' && strchr(host, ':')) (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), l), "[%s]", host); /* RFC 2732 */ else #endif soap_strcpy(soap->tmpbuf, sizeof(soap->tmpbuf), host); } if ((err = soap->fposthdr(soap, "Host", soap->tmpbuf))) return err; if ((err = soap->fposthdr(soap, "User-Agent", "gSOAP/2.8"))) return err; if ((err = soap_puthttphdr(soap, SOAP_OK, count))) return err; #ifdef WITH_ZLIB #ifdef WITH_GZIP if ((err = soap->fposthdr(soap, "Accept-Encoding", "gzip, deflate"))) #else if ((err = soap->fposthdr(soap, "Accept-Encoding", "deflate"))) #endif return err; #endif #if !defined(WITH_LEAN) || defined(WITH_NTLM) #ifdef WITH_NTLM if (soap->ntlm_challenge) { l = strlen(soap->ntlm_challenge); if (l) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), l + 5), "NTLM %s", soap->ntlm_challenge); if (soap->proxy_host) { if ((err = soap->fposthdr(soap, "Proxy-Authorization", soap->tmpbuf))) return err; } else if ((err = soap->fposthdr(soap, "Authorization", soap->tmpbuf))) return err; } } else { #endif if (soap->userid && soap->passwd) { l = strlen(soap->userid) + strlen(soap->passwd); soap_strcpy(soap->tmpbuf, sizeof(soap->tmpbuf), "Basic "); (SOAP_SNPRINTF(soap->tmpbuf + 262, sizeof(soap->tmpbuf) - 262, l + 1), "%s:%s", soap->userid, soap->passwd); soap_s2base64(soap, (const unsigned char*)(soap->tmpbuf + 262), soap->tmpbuf + 6, (int)strlen(soap->tmpbuf + 262)); if ((err = soap->fposthdr(soap, "Authorization", soap->tmpbuf))) return err; } if (soap->proxy_userid && soap->proxy_passwd) { l = strlen(soap->proxy_userid) + strlen(soap->proxy_passwd); soap_strcpy(soap->tmpbuf, sizeof(soap->tmpbuf), "Basic "); (SOAP_SNPRINTF(soap->tmpbuf + 262, sizeof(soap->tmpbuf) - 262, l + 1), "%s:%s", soap->proxy_userid, soap->proxy_passwd); soap_s2base64(soap, (const unsigned char*)(soap->tmpbuf + 262), soap->tmpbuf + 6, (int)strlen(soap->tmpbuf + 262)); if ((err = soap->fposthdr(soap, "Proxy-Authorization", soap->tmpbuf))) return err; } #ifdef WITH_NTLM } #endif #endif #ifdef WITH_COOKIES #ifdef WITH_OPENSSL if (soap_putcookies(soap, host, path, soap->ssl != NULL)) return soap->error; #else if (soap_putcookies(soap, host, path, 0)) return soap->error; #endif #endif if (action && soap->status != SOAP_GET && soap->status != SOAP_DEL) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), strlen(action) + 2), "\"%s\"", action); if ((err = soap->fposthdr(soap, "SOAPAction", soap->tmpbuf))) return err; } return soap->fposthdr(soap, NULL, NULL); } #endif #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 static int http_send_header(struct soap *soap, const char *s) { const char *t; do { t = strchr(s, '\n'); /* disallow \n in HTTP headers */ if (!t) t = s + strlen(s); if (soap_send_raw(soap, s, t - s)) return soap->error; s = t + 1; } while (*t); return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 static int http_post_header(struct soap *soap, const char *key, const char *val) { if (key) { if (http_send_header(soap, key)) return soap->error; if (val && (soap_send_raw(soap, ": ", 2) || http_send_header(soap, val))) return soap->error; } return soap_send_raw(soap, "\r\n", 2); } #endif #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 static int http_response(struct soap *soap, int status, size_t count) { int err; char http[16]; int code = status; const char *line; #ifdef WMW_RPM_IO if (soap->rpmreqid) httpOutputEnable(soap->rpmreqid); #endif #ifdef WMW_RPM_IO if (soap->rpmreqid || soap_valid_socket(soap->master) || soap_valid_socket(soap->socket)) /* RPM behaves as if standalone */ #else if (soap_valid_socket(soap->master) || soap_valid_socket(soap->socket)) /* standalone application (socket) or CGI (stdin/out)? */ #endif (SOAP_SNPRINTF(http, sizeof(http), strlen(soap->http_version) + 5), "HTTP/%s", soap->http_version); else soap_strcpy(http, sizeof(http), "Status:"); if (!status || status == SOAP_HTML || status == SOAP_FILE) { if (count || ((soap->omode & SOAP_IO) == SOAP_IO_CHUNK)) code = 200; else code = 202; } else if (status < 200 || status >= 600) { const char *s = *soap_faultcode(soap); if (status >= SOAP_GET_METHOD && status <= SOAP_HTTP_METHOD) code = 405; else if (soap->version == 2 && (!s || !strcmp(s, "SOAP-ENV:Sender"))) code = 400; else code = 500; } line = http_error(soap, code); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "HTTP Status = %d %s\n", code, line)); (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), sizeof(http) + 22 + strlen(line)), "%s %d %s", http, code, line); if ((err = soap->fposthdr(soap, soap->tmpbuf, NULL))) return err; #ifndef WITH_LEAN if (status == 401) { (SOAP_SNPRINTF_SAFE(soap->tmpbuf, sizeof(soap->tmpbuf)), "Basic realm=\"%s\"", (soap->authrealm && strlen(soap->authrealm) + 14 < sizeof(soap->tmpbuf)) ? soap->authrealm : "gSOAP Web Service"); if ((err = soap->fposthdr(soap, "WWW-Authenticate", soap->tmpbuf))) return err; } else if ((status >= 301 && status <= 303) || status == 307) { if ((err = soap->fposthdr(soap, "Location", soap->endpoint))) return err; } #endif if ((err = soap->fposthdr(soap, "Server", "gSOAP/2.8")) || (err = soap_puthttphdr(soap, status, count))) return err; #ifdef WITH_COOKIES if (soap_putsetcookies(soap)) return soap->error; #endif return soap->fposthdr(soap, NULL, NULL); } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_response(struct soap *soap, int status) { size_t count; if (!(soap->omode & (SOAP_ENC_XML | SOAP_IO_STORE /* this tests for chunking too */)) && (status == SOAP_HTML || status == SOAP_FILE)) soap->omode = (soap->omode & ~SOAP_IO) | SOAP_IO_STORE; soap->status = status; count = soap_count_attachments(soap); if (soap_begin_send(soap)) return soap->error; #ifndef WITH_NOHTTP if ((soap->mode & SOAP_IO) != SOAP_IO_STORE && !(soap->mode & SOAP_ENC_XML)) { int n = soap->mode; soap->mode &= ~(SOAP_IO | SOAP_ENC_ZLIB); if ((n & SOAP_IO) != SOAP_IO_FLUSH) soap->mode |= SOAP_IO_BUFFER; if ((soap->error = soap->fresponse(soap, status, count))) return soap->error; #ifndef WITH_LEANER if ((n & SOAP_IO) == SOAP_IO_CHUNK) { if (soap_flush(soap)) return soap->error; } #endif soap->mode = n; } #endif return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 const char* SOAP_FMAC2 soap_url(struct soap *soap, const char *s, const char *t) { if (!t || (*t != '/' && *t != '?')) return s; (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), strlen(s) + strlen(t)), "%s%s", s, t); return soap->msgbuf; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 size_t SOAP_FMAC2 soap_encode_url(const char *s, char *t, size_t len) { int c; size_t n = len; while ((c = *s++) && --n > 0) { if (c > ' ' && c < 128 && !strchr("()<>@,;:\\\"/[]?={}#!$&'*+", c)) *t++ = c; else if (n > 2) { *t++ = '%'; *t++ = (c >> 4) + (c > 159 ? '7' : '0'); c &= 0xF; *t++ = c + (c > 9 ? '7' : '0'); n -= 2; } else break; } *t = '\0'; return len - n; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 const char* SOAP_FMAC2 soap_encode_url_string(struct soap *soap, const char *s) { if (s) { size_t n = 3*strlen(s)+1; char *t = (char*)soap_malloc(soap, n); if (t) { soap_encode_url(s, t, n); return t; } } return SOAP_STR_EOS; } #endif /******************************************************************************\ * * HTTP Cookies * \******************************************************************************/ #ifdef WITH_COOKIES SOAP_FMAC1 struct soap_cookie* SOAP_FMAC2 soap_cookie(struct soap *soap, const char *name, const char *domain, const char *path) { struct soap_cookie *p; if (!domain) domain = soap->cookie_domain; if (!path) path = soap->cookie_path; if (!path) path = SOAP_STR_EOS; else if (*path == '/') path++; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Search cookie='%s' domain='%s' path='%s'\n", name, domain ? domain : "(null)", path ? path : "(null)")); for (p = soap->cookies; p; p = p->next) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Cookie in database: %s='%s' domain='%s' path='%s' env=%hd\n", p->name, p->value ? p->value : "(null)", p->domain ? p->domain : "(null)", p->path ? p->path : "(null)", p->env)); if (!strcmp(p->name, name) && ((!p->domain && !domain) || (p->domain && !strcmp(p->domain, domain))) && ((!p->path && !path) || (p->path && !strncmp(p->path, path, strlen(p->path))))) break; } return p; } /******************************************************************************/ SOAP_FMAC1 struct soap_cookie* SOAP_FMAC2 soap_set_cookie(struct soap *soap, const char *name, const char *value, const char *domain, const char *path) { struct soap_cookie **p, *q; int n; if (!domain) domain = soap->cookie_domain; if (!path) path = soap->cookie_path; if (!path) path = SOAP_STR_EOS; else if (*path == '/') path++; q = soap_cookie(soap, name, domain, path); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Set %scookie: %s='%s' domain='%s' path='%s'\n", q ? SOAP_STR_EOS : "new ", name, value ? value : "(null)", domain ? domain : "(null)", path ? path : "(null)")); if (!q) { if ((q = (struct soap_cookie*)SOAP_MALLOC(soap, sizeof(struct soap_cookie)))) { size_t l = strlen(name); if ((q->name = (char*)SOAP_MALLOC(soap, l + 1))) soap_strcpy(q->name, l + 1, name); q->value = NULL; q->domain = NULL; q->path = NULL; q->expire = 0; q->maxage = -1; q->version = 1; q->secure = 0; q->modified = 0; for (p = &soap->cookies, n = soap->cookie_max; *p && n; p = &(*p)->next, n--) if (!strcmp((*p)->name, name) && (*p)->path && path && strcmp((*p)->path, path) < 0) break; if (n) { q->next = *p; *p = q; } else { SOAP_FREE(soap, q->name); SOAP_FREE(soap, q); q = NULL; } } } else q->modified = 1; if (q) { if (q->value) { if (!value || strcmp(value, q->value)) { SOAP_FREE(soap, q->value); q->value = NULL; } } if (value && *value && !q->value) { size_t l = strlen(value); q->value = (char*)SOAP_MALLOC(soap, l + 1); if (q->value) soap_strcpy(q->value, l + 1, value); } if (q->domain) { if (!domain || strcmp(domain, q->domain)) { SOAP_FREE(soap, q->domain); q->domain = NULL; } } if (domain && !q->domain) { size_t l = strlen(domain); q->domain = (char*)SOAP_MALLOC(soap, l + 1); if (q->domain) soap_strcpy(q->domain, l + 1, domain); } if (q->path) { if (!path || strncmp(path, q->path, strlen(q->path))) { SOAP_FREE(soap, q->path); q->path = NULL; } } if (path && !q->path) { size_t l = strlen(path); q->path = (char*)SOAP_MALLOC(soap, l + 1); if (q->path) soap_strcpy(q->path, l + 1, path); } q->session = 1; q->env = 0; } return q; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_clr_cookie(struct soap *soap, const char *name, const char *domain, const char *path) { struct soap_cookie **p, *q; if (!domain) domain = soap->cookie_domain; if (!domain) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Error in clear cookie='%s': cookie domain not set\n", name ? name : "(null)")); return; } if (!path) path = soap->cookie_path; if (!path) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Error in clear cookie='%s': cookie path not set\n", name ? name : "(null)")); return; } if (*path == '/') path++; for (p = &soap->cookies, q = *p; q; q = *p) { if (!strcmp(q->name, name) && (!q->domain || !strcmp(q->domain, domain)) && (!q->path || !strncmp(q->path, path, strlen(q->path)))) { if (q->value) SOAP_FREE(soap, q->value); if (q->domain) SOAP_FREE(soap, q->domain); if (q->path) SOAP_FREE(soap, q->path); *p = q->next; SOAP_FREE(soap, q); } else p = &q->next; } } /******************************************************************************/ SOAP_FMAC1 char * SOAP_FMAC2 soap_cookie_value(struct soap *soap, const char *name, const char *domain, const char *path) { struct soap_cookie *p; if ((p = soap_cookie(soap, name, domain, path))) return p->value; return NULL; } /******************************************************************************/ SOAP_FMAC1 char * SOAP_FMAC2 soap_env_cookie_value(struct soap *soap, const char *name, const char *domain, const char *path) { struct soap_cookie *p; if ((p = soap_cookie(soap, name, domain, path)) && p->env) return p->value; return NULL; } /******************************************************************************/ SOAP_FMAC1 time_t SOAP_FMAC2 soap_cookie_expire(struct soap *soap, const char *name, const char *domain, const char *path) { struct soap_cookie *p; if ((p = soap_cookie(soap, name, domain, path))) return p->expire; return -1; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_set_cookie_expire(struct soap *soap, const char *name, long expire, const char *domain, const char *path) { struct soap_cookie *p; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Set cookie expiration max-age=%ld: cookie='%s' domain='%s' path='%s'\n", expire, name, domain ? domain : "(null)", path ? path : "(null)")); if ((p = soap_cookie(soap, name, domain, path))) { p->maxage = expire; p->modified = 1; return SOAP_OK; } return SOAP_ERR; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_set_cookie_session(struct soap *soap, const char *name, const char *domain, const char *path) { struct soap_cookie *p; if ((p = soap_cookie(soap, name, domain, path))) { p->session = 1; p->modified = 1; return SOAP_OK; } return SOAP_ERR; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_clr_cookie_session(struct soap *soap, const char *name, const char *domain, const char *path) { struct soap_cookie *p; if ((p = soap_cookie(soap, name, domain, path))) { p->session = 0; p->modified = 1; return SOAP_OK; } return SOAP_ERR; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_putsetcookies(struct soap *soap) { struct soap_cookie *p; char *s, tmp[4096]; const char *t; for (p = soap->cookies; p; p = p->next) { if (p->modified #ifdef WITH_OPENSSL || (!p->env && !soap->ssl == !p->secure) #endif ) { s = tmp; if (p->name) s += soap_encode_url(p->name, s, 4064 - (s-tmp)); if (p->value && *p->value) { *s++ = '='; s += soap_encode_url(p->value, s, 4064 - (s-tmp)); } if (p->domain && (int)strlen(p->domain) < 4064 - (s-tmp)) { soap_strcpy(s, 4096 - (s-tmp), ";Domain="); soap_strcpy(s + 8, 4088 - (s-tmp), p->domain); } else if (soap->cookie_domain && (int)strlen(soap->cookie_domain) < 4064 - (s-tmp)) { soap_strcpy(s, 4096 - (s-tmp), ";Domain="); soap_strcpy(s + 8, 4088 - (s-tmp), soap->cookie_domain); } s += strlen(s); soap_strcpy(s, 4096 - (s-tmp), ";Path=/"); if (p->path) t = p->path; else t = soap->cookie_path; if (t) { if (*t == '/') t++; if ((int)strlen(t) < 4064 - (s-tmp)) { if (strchr(t, '%')) /* already URL encoded? */ { soap_strcpy(s, 4096 - (s-tmp), t); s += strlen(s); } else s += soap_encode_url(t, s, 4064 - (s-tmp)); } } if (p->version > 0 && s-tmp < 4064) { (SOAP_SNPRINTF(s, 4096 - (s-tmp), 29), ";Version=%u", p->version); s += strlen(s); } if (p->maxage >= 0 && s-tmp < 4064) { (SOAP_SNPRINTF(s, 4096 - (s-tmp), 29), ";Max-Age=%ld", p->maxage); s += strlen(s); } if (s-tmp < 4073 && (p->secure #ifdef WITH_OPENSSL || soap->ssl #endif )) soap_strcpy(s, 4096 - (s-tmp), ";Secure"); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Set-Cookie: %s\n", tmp)); if ((soap->error = soap->fposthdr(soap, "Set-Cookie", tmp))) return soap->error; } } return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_putcookies(struct soap *soap, const char *domain, const char *path, int secure) { struct soap_cookie **p, *q; unsigned int version = 0; time_t now = time(NULL); char *s, tmp[4096]; if (!domain || !path) return SOAP_OK; s = tmp; p = &soap->cookies; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Sending cookies for domain='%s' path='%s'\n", domain, path)); if (*path == '/') path++; while ((q = *p)) { if (q->expire && now > q->expire) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Cookie %s expired\n", q->name)); SOAP_FREE(soap, q->name); if (q->value) SOAP_FREE(soap, q->value); if (q->domain) SOAP_FREE(soap, q->domain); if (q->path) SOAP_FREE(soap, q->path); *p = q->next; SOAP_FREE(soap, q); } else { int flag; char *t = q->domain; size_t n = 0; if (!t) flag = 1; else { const char *r = strchr(t, ':'); if (r) n = r - t; else n = strlen(t); flag = !strncmp(t, domain, n); } /* domain-level cookies, cannot compile when WITH_NOIO set */ #ifndef WITH_NOIO if (!flag) { struct hostent *hostent = gethostbyname((char*)domain); if (hostent) { const char *r = hostent->h_name; if (*t == '.') { size_t k = strlen(hostent->h_name); if (k >= n) r = hostent->h_name + k - n; } flag = !strncmp(t, r, n); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Domain cookie %s host %s (match=%d)\n", t, r, flag)); } } #endif if (flag && (!q->path || !strncmp(q->path, path, strlen(q->path))) && (!q->secure || secure)) { size_t n = 12; if (q->name) n += 3*strlen(q->name); if (q->value && *q->value) n += 3*strlen(q->value) + 1; if (q->path && *q->path) n += strlen(q->path) + 9; if (q->domain) n += strlen(q->domain) + 11; if (tmp - s + n > sizeof(tmp)) { if (s == tmp) return SOAP_OK; /* HTTP header size overflow */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Cookie: %s\n", tmp)); if ((soap->error = soap->fposthdr(soap, "Cookie", tmp))) return soap->error; s = tmp; } else if (s != tmp) { *s++ = ' '; } if (q->version != version && s-tmp < 4060) { (SOAP_SNPRINTF(s, 4096 - (s-tmp), 29), "$Version=%u;", q->version); version = q->version; s += strlen(s); } if (q->name) s += soap_encode_url(q->name, s, tmp+sizeof(tmp)-s-16); if (q->value && *q->value) { *s++ = '='; s += soap_encode_url(q->value, s, tmp+sizeof(tmp)-s-16); } if (q->path && (s-tmp) + strlen(q->path) < 4060) { (SOAP_SNPRINTF_SAFE(s, 4096 - (s-tmp)), ";$Path=\"/%s\"", (*q->path == '/' ? q->path + 1 : q->path)); s += strlen(s); } if (q->domain && (s-tmp) + strlen(q->domain) < 4060) { (SOAP_SNPRINTF_SAFE(s, 4096 - (s-tmp)), ";$Domain=\"%s\"", q->domain); s += strlen(s); } } p = &q->next; } } if (s != tmp) if ((soap->error = soap->fposthdr(soap, "Cookie", tmp))) return soap->error; return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_getcookies(struct soap *soap, const char *val) { struct soap_cookie *p = NULL, *q; const char *s; char *t, tmp[4096]; /* cookie size is up to 4096 bytes [RFC2109] */ char *domain = NULL; char *path = NULL; unsigned int version = 0; time_t now = time(NULL); if (!val) return; s = val; while (*s) { s = soap_decode_key(tmp, sizeof(tmp), s); if (!soap_tag_cmp(tmp, "$Version")) { if ((s = soap_decode_val(tmp, sizeof(tmp), s))) { if (p) p->version = (int)soap_strtol(tmp, NULL, 10); else version = (int)soap_strtol(tmp, NULL, 10); } } else if (!soap_tag_cmp(tmp, "$Path")) { s = soap_decode_val(tmp, sizeof(tmp), s); if (*tmp) { size_t l = strlen(tmp) + 1; if ((t = (char*)SOAP_MALLOC(soap, l))) soap_memcpy((void*)t, l, (const void*)tmp, l); } else t = NULL; if (p) { if (p->path) SOAP_FREE(soap, p->path); p->path = t; } else { if (path) SOAP_FREE(soap, path); path = t; } } else if (!soap_tag_cmp(tmp, "$Domain")) { s = soap_decode_val(tmp, sizeof(tmp), s); if (*tmp) { size_t l = strlen(tmp) + 1; if ((t = (char*)SOAP_MALLOC(soap, l))) soap_memcpy((void*)t, l, (const void*)tmp, l); } else t = NULL; if (p) { if (p->domain) SOAP_FREE(soap, p->domain); p->domain = t; } else { if (domain) SOAP_FREE(soap, domain); domain = t; } } else if (p && !soap_tag_cmp(tmp, "Path")) { if (p->path) SOAP_FREE(soap, p->path); s = soap_decode_val(tmp, sizeof(tmp), s); if (*tmp) { size_t l = strlen(tmp) + 1; if ((p->path = (char*)SOAP_MALLOC(soap, l))) soap_memcpy((void*)p->path, l, (const void*)tmp, l); } else p->path = NULL; } else if (p && !soap_tag_cmp(tmp, "Domain")) { if (p->domain) SOAP_FREE(soap, p->domain); s = soap_decode_val(tmp, sizeof(tmp), s); if (*tmp) { size_t l = strlen(tmp) + 1; if ((p->domain = (char*)SOAP_MALLOC(soap, l))) soap_memcpy((void*)p->domain, l, (const void*)tmp, l); } else p->domain = NULL; } else if (p && !soap_tag_cmp(tmp, "Version")) { s = soap_decode_val(tmp, sizeof(tmp), s); p->version = (unsigned int)soap_strtoul(tmp, NULL, 10); } else if (p && !soap_tag_cmp(tmp, "Max-Age")) { s = soap_decode_val(tmp, sizeof(tmp), s); p->expire = now + soap_strtol(tmp, NULL, 10); } else if (p && !soap_tag_cmp(tmp, "Expires")) { struct tm T; char a[3]; static const char mns[] = "anebarprayunulugepctovec"; s = soap_decode_val(tmp, sizeof(tmp), s); if (strlen(tmp) > 20) { memset((void*)&T, 0, sizeof(T)); a[0] = tmp[4]; a[1] = tmp[5]; a[2] = '\0'; T.tm_mday = (int)soap_strtol(a, NULL, 10); a[0] = tmp[8]; a[1] = tmp[9]; T.tm_mon = (int)(strstr(mns, a) - mns) / 2; a[0] = tmp[11]; a[1] = tmp[12]; T.tm_year = 100 + (int)soap_strtol(a, NULL, 10); a[0] = tmp[13]; a[1] = tmp[14]; T.tm_hour = (int)soap_strtol(a, NULL, 10); a[0] = tmp[16]; a[1] = tmp[17]; T.tm_min = (int)soap_strtol(a, NULL, 10); a[0] = tmp[19]; a[1] = tmp[20]; T.tm_sec = (int)soap_strtol(a, NULL, 10); p->expire = soap_timegm(&T); } } else if (p && !soap_tag_cmp(tmp, "Secure")) p->secure = 1; else { if (p) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Got environment cookie='%s' value='%s' domain='%s' path='%s' expire=%ld secure=%d\n", p->name, p->value ? p->value : "(null)", p->domain ? p->domain : "(null)", p->path ? p->path : "(null)", p->expire, p->secure)); if ((q = soap_set_cookie(soap, p->name, p->value, p->domain, p->path))) { q->version = p->version; q->expire = p->expire; q->secure = p->secure; q->env = 1; } if (p->name) SOAP_FREE(soap, p->name); if (p->value) SOAP_FREE(soap, p->value); if (p->domain) SOAP_FREE(soap, p->domain); if (p->path) SOAP_FREE(soap, p->path); SOAP_FREE(soap, p); } if ((p = (struct soap_cookie*)SOAP_MALLOC(soap, sizeof(struct soap_cookie)))) { size_t l = strlen(tmp) + 1; if ((p->name = (char*)SOAP_MALLOC(soap, l))) soap_memcpy((void*)p->name, l, (const void*)tmp, l); s = soap_decode_val(tmp, sizeof(tmp), s); if (*tmp) { l = strlen(tmp) + 1; if ((p->value = (char*)SOAP_MALLOC(soap, l))) soap_memcpy((void*)p->value, l, (const void*)tmp, l); } else p->value = NULL; if (domain) p->domain = domain; else if (*soap->host) { l = strlen(soap->host) + 1; if ((p->domain = (char*)SOAP_MALLOC(soap, l))) soap_memcpy((void*)p->domain, l, (const void*)soap->host, l); } else p->domain = NULL; if (path) p->path = path; else if (*soap->path) { l = strlen(soap->path) + 1; if ((p->path = (char*)SOAP_MALLOC(soap, l))) soap_memcpy((void*)p->path, l, (const void*)soap->path, l); } else { if ((p->path = (char*)SOAP_MALLOC(soap, 2))) soap_memcpy((void*)p->path, 2, (const void*)"/", 2); } p->expire = 0; p->secure = 0; p->version = version; } } } if (p) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Got environment cookie='%s' value='%s' domain='%s' path='%s' expire=%ld secure=%d\n", p->name, p->value ? p->value : "(null)", p->domain ? p->domain : "(null)", p->path ? p->path : "(null)", p->expire, p->secure)); if ((q = soap_set_cookie(soap, p->name, p->value, p->domain, p->path))) { q->version = p->version; q->expire = p->expire; q->secure = p->secure; q->env = 1; } if (p->name) SOAP_FREE(soap, p->name); if (p->value) SOAP_FREE(soap, p->value); if (p->domain) SOAP_FREE(soap, p->domain); if (p->path) SOAP_FREE(soap, p->path); SOAP_FREE(soap, p); } if (domain) SOAP_FREE(soap, domain); if (path) SOAP_FREE(soap, path); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_getenv_cookies(struct soap *soap) { struct soap_cookie *p; const char *s; char key[4096], val[4096]; /* cookie size is up to 4096 bytes [RFC2109] */ if (!(s = getenv("HTTP_COOKIE"))) return SOAP_ERR; do { s = soap_decode_key(key, sizeof(key), s); s = soap_decode_val(val, sizeof(val), s); p = soap_set_cookie(soap, key, val, NULL, NULL); if (p) p->env = 1; } while (*s); return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 struct soap_cookie* SOAP_FMAC2 soap_copy_cookies(struct soap *copy, const struct soap *soap) { struct soap_cookie *p, **q, *r; q = &r; for (p = soap->cookies; p; p = p->next) { if (!(*q = (struct soap_cookie*)SOAP_MALLOC(copy, sizeof(struct soap_cookie)))) return r; **q = *p; if (p->name) { size_t l = strlen(p->name) + 1; if (((*q)->name = (char*)SOAP_MALLOC(copy, l))) soap_memcpy((*q)->name, l, p->name, l); } if (p->value) { size_t l = strlen(p->value) + 1; if (((*q)->value = (char*)SOAP_MALLOC(copy, l))) soap_memcpy((*q)->value, l, p->value, l); } if (p->domain) { size_t l = strlen(p->domain) + 1; if (((*q)->domain = (char*)SOAP_MALLOC(copy, l))) soap_memcpy((*q)->domain, l, p->domain, l); } if (p->path) { size_t l = strlen(p->path) + 1; if (((*q)->path = (char*)SOAP_MALLOC(copy, l))) soap_memcpy((*q)->path, l, p->path, l); } q = &(*q)->next; } *q = NULL; return r; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_free_cookies(struct soap *soap) { struct soap_cookie *p; for (p = soap->cookies; p; p = soap->cookies) { soap->cookies = p->next; SOAP_FREE(soap, p->name); if (p->value) SOAP_FREE(soap, p->value); if (p->domain) SOAP_FREE(soap, p->domain); if (p->path) SOAP_FREE(soap, p->path); SOAP_FREE(soap, p); } } /******************************************************************************/ #endif /* WITH_COOKIES */ /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 size_t SOAP_FMAC2 soap_hash(const char *s) { size_t h = 0; while (*s) h = 65599*h + *s++; return h % SOAP_IDHASH; } #endif /******************************************************************************/ #ifndef PALM_1 static void soap_init_pht(struct soap *soap) { int i; soap->pblk = NULL; soap->pidx = 0; for (i = 0; i < (int)SOAP_PTRHASH; i++) soap->pht[i] = NULL; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 struct soap* SOAP_FMAC2 soap_versioning(soap_new)(soap_mode imode, soap_mode omode) { struct soap *soap; #ifdef __cplusplus soap = SOAP_NEW(struct soap); #else soap = (struct soap*)malloc(sizeof(struct soap)); #endif if (soap) soap_versioning(soap_init)(soap, imode, omode); return soap; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_free(struct soap *soap) { soap_done(soap); #ifdef __cplusplus SOAP_DELETE(soap); #else free(soap); #endif } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_del(struct soap *soap) { free(soap); } #endif /******************************************************************************/ #ifndef PALM_1 static void soap_free_pht(struct soap *soap) { struct soap_pblk *pb, *next; int i; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free pointer hashtable\n")); for (pb = soap->pblk; pb; pb = next) { next = pb->next; SOAP_FREE(soap, pb); } soap->pblk = NULL; soap->pidx = 0; for (i = 0; i < (int)SOAP_PTRHASH; i++) soap->pht[i] = NULL; } #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_embed(struct soap *soap, const void *p, const void *a, int n, int t) { int id; struct soap_plist *pp; if (soap->version == 2) soap->encoding = 1; if (!p || (!soap->encodingStyle && !(soap->omode & SOAP_XML_GRAPH)) || (soap->omode & SOAP_XML_TREE)) return 0; if (a) id = soap_array_pointer_lookup(soap, p, a, n, t, &pp); else id = soap_pointer_lookup(soap, p, t, &pp); if (id) { if (soap_is_embedded(soap, pp) || soap_is_single(soap, pp)) return 0; soap_set_embedded(soap, pp); } return id; } #endif #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_pointer_lookup(struct soap *soap, const void *p, int type, struct soap_plist **ppp) { struct soap_plist *pp; *ppp = NULL; if (p) { for (pp = soap->pht[soap_hash_ptr(p)]; pp; pp = pp->next) { if (pp->ptr == p && pp->type == type) { *ppp = pp; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Lookup location=%p type=%d id=%d\n", p, type, pp->id)); return pp->id; } } } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Lookup location=%p type=%d: not found\n", p, type)); return 0; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_pointer_enter(struct soap *soap, const void *p, const void *a, int n, int type, struct soap_plist **ppp) { size_t h; struct soap_plist *pp; (void)n; if (!soap->pblk || soap->pidx >= SOAP_PTRBLK) { struct soap_pblk *pb = (struct soap_pblk*)SOAP_MALLOC(soap, sizeof(struct soap_pblk)); if (!pb) { soap->error = SOAP_EOM; return 0; } pb->next = soap->pblk; soap->pblk = pb; soap->pidx = 0; } *ppp = pp = &soap->pblk->plist[soap->pidx++]; if (a) h = soap_hash_ptr(a); else h = soap_hash_ptr(p); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Pointer enter location=%p array=%p size=%lu type=%d id=%d\n", p, a, (unsigned long)n, type, soap->idnum+1)); pp->next = soap->pht[h]; pp->type = type; pp->mark1 = 0; pp->mark2 = 0; pp->ptr = p; pp->dup = NULL; pp->array = a; pp->size = n; soap->pht[h] = pp; pp->id = ++soap->idnum; return pp->id; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_array_pointer_lookup(struct soap *soap, const void *p, const void *a, int n, int type, struct soap_plist **ppp) { struct soap_plist *pp; *ppp = NULL; if (!p || !a) return 0; for (pp = soap->pht[soap_hash_ptr(a)]; pp; pp = pp->next) { if (pp->type == type && pp->array == a && pp->size == n) { *ppp = pp; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Array lookup location=%p type=%d id=%d\n", a, type, pp->id)); return pp->id; } } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Array lookup location=%p type=%d: not found\n", a, type)); return 0; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_begin_count(struct soap *soap) { soap_free_ns(soap); #ifndef WITH_LEANER if ((soap->mode & SOAP_ENC_DIME) || (soap->omode & SOAP_ENC_DIME)) soap->mode = soap->omode | SOAP_IO_LENGTH | SOAP_ENC_DIME; else #endif { soap->mode = soap->omode; if ((soap->mode & SOAP_IO_UDP)) { soap->mode |= SOAP_ENC_XML; soap->mode &= ~SOAP_IO_CHUNK; } if ((soap->mode & SOAP_IO) == SOAP_IO_STORE || (((soap->mode & SOAP_IO) == SOAP_IO_CHUNK || (soap->mode & SOAP_ENC_XML)) #ifndef WITH_LEANER && !soap->fpreparesend #endif )) soap->mode &= ~SOAP_IO_LENGTH; else soap->mode |= SOAP_IO_LENGTH; } #ifdef WITH_ZLIB if ((soap->mode & SOAP_ENC_ZLIB) && (soap->mode & SOAP_IO) == SOAP_IO_FLUSH) { if (!(soap->mode & SOAP_ENC_DIME)) soap->mode &= ~SOAP_IO_LENGTH; if (soap->mode & SOAP_ENC_XML) soap->mode |= SOAP_IO_BUFFER; else soap->mode |= SOAP_IO_STORE; } #endif #ifndef WITH_LEANER if ((soap->mode & SOAP_ENC_MTOM) && (soap->mode & SOAP_ENC_DIME)) soap->mode |= SOAP_ENC_MIME; else if (!(soap->mode & SOAP_ENC_MIME)) soap->mode &= ~SOAP_ENC_MTOM; if (soap->mode & SOAP_ENC_MIME) soap_select_mime_boundary(soap); soap->dime.list = soap->dime.last; /* keep track of last DIME attachment */ #endif soap->count = 0; soap->ns = 0; soap->null = 0; soap->position = 0; soap->mustUnderstand = 0; soap->encoding = 0; soap->part = SOAP_BEGIN; soap->event = 0; soap->evlev = 0; soap->idnum = 0; soap->body = 1; soap->level = 0; soap_clr_attr(soap); soap_set_local_namespaces(soap); #ifndef WITH_LEANER soap->dime.count = 0; /* count # of attachments */ soap->dime.size = 0; /* accumulate total size of attachments */ if (soap->fprepareinitsend && (soap->mode & SOAP_IO) != SOAP_IO_STORE && (soap->error = soap->fprepareinitsend(soap))) return soap->error; #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Begin count phase (socket=%d mode=0x%x count=%lu)\n", soap->socket, (unsigned int)soap->mode, (unsigned long)soap->count)); return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_end_count(struct soap *soap) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of count phase\n")); #ifndef WITH_LEANER if ((soap->mode & SOAP_IO_LENGTH)) { if (soap->fpreparefinalsend && (soap->error = soap->fpreparefinalsend(soap))) return soap->error; } #else (void)soap; #endif return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_begin_send(struct soap *soap) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Initializing for output to socket=%d/fd=%d\n", soap->socket, soap->sendfd)); soap_free_ns(soap); soap->error = SOAP_OK; soap->mode = soap->omode | (soap->mode & (SOAP_IO_LENGTH | SOAP_ENC_DIME)); #ifndef WITH_LEAN if ((soap->mode & SOAP_IO_UDP)) { soap->mode |= SOAP_ENC_XML; soap->mode &= ~SOAP_IO_CHUNK; if (soap->count > sizeof(soap->buf)) return soap->error = SOAP_UDP_ERROR; } #endif #ifdef WITH_ZLIB if ((soap->mode & SOAP_ENC_ZLIB) && (soap->mode & SOAP_IO) == SOAP_IO_FLUSH) { if (soap->mode & SOAP_ENC_XML) soap->mode |= SOAP_IO_BUFFER; else soap->mode |= SOAP_IO_STORE; } #endif if ((soap->mode & SOAP_IO) == SOAP_IO_FLUSH) { if (soap_valid_socket(soap->socket)) { if (soap->count || (soap->mode & SOAP_IO_LENGTH) || (soap->mode & SOAP_ENC_XML)) soap->mode |= SOAP_IO_BUFFER; else soap->mode |= SOAP_IO_STORE; } #if !defined(__cplusplus) || defined(WITH_COMPAT) else if (soap->os != NULL) { *soap->os = NULL; soap->mode |= SOAP_IO_STORE; } #endif } soap->mode &= ~SOAP_IO_LENGTH; if ((soap->mode & SOAP_IO) == SOAP_IO_STORE) if (soap_new_block(soap) == NULL) return soap->error; if (!(soap->mode & SOAP_IO_KEEPALIVE)) soap->keep_alive = 0; #ifndef WITH_LEANER if ((soap->mode & SOAP_ENC_MTOM) && (soap->mode & SOAP_ENC_DIME)) { soap->mode |= SOAP_ENC_MIME; soap->mode &= ~SOAP_ENC_DIME; } else if (!(soap->mode & SOAP_ENC_MIME)) soap->mode &= ~SOAP_ENC_MTOM; if (soap->mode & SOAP_ENC_MIME) soap_select_mime_boundary(soap); #ifdef WIN32 #ifndef UNDER_CE #ifndef WITH_FASTCGI if (!soap_valid_socket(soap->socket) && !soap->os && soap->sendfd >= 0) /* Set win32 stdout or soap->sendfd to BINARY, e.g. to support DIME */ #ifdef __BORLANDC__ setmode(soap->sendfd, _O_BINARY); #else _setmode(soap->sendfd, _O_BINARY); #endif #endif #endif #endif #endif if (soap->mode & SOAP_IO) { soap->bufidx = 0; soap->buflen = 0; } soap->chunksize = 0; soap->ns = 0; soap->null = 0; soap->position = 0; soap->mustUnderstand = 0; soap->encoding = 0; soap->idnum = 0; soap->body = 1; soap->level = 0; soap_clr_attr(soap); soap_set_local_namespaces(soap); #ifdef WITH_ZLIB soap->z_ratio_out = 1.0; if ((soap->mode & SOAP_ENC_ZLIB) && soap->zlib_state != SOAP_ZLIB_DEFLATE) { if (!soap->d_stream) { soap->d_stream = (z_stream*)SOAP_MALLOC(soap, sizeof(z_stream)); soap->d_stream->zalloc = Z_NULL; soap->d_stream->zfree = Z_NULL; soap->d_stream->opaque = Z_NULL; soap->d_stream->next_in = Z_NULL; } if (!soap->z_buf) soap->z_buf = (char*)SOAP_MALLOC(soap, sizeof(soap->buf)); soap->d_stream->next_out = (Byte*)soap->z_buf; soap->d_stream->avail_out = sizeof(soap->buf); #ifdef WITH_GZIP if (soap->zlib_out != SOAP_ZLIB_DEFLATE) { if (soap_memcpy((void*)soap->z_buf, sizeof(soap->buf), (const void*)"\37\213\10\0\0\0\0\0\0\377", 10)) return soap->error = SOAP_EOM; soap->d_stream->next_out = (Byte*)soap->z_buf + 10; soap->d_stream->avail_out = sizeof(soap->buf) - 10; soap->z_crc = crc32(0L, NULL, 0); soap->zlib_out = SOAP_ZLIB_GZIP; if (soap->z_dict) *((Byte*)soap->z_buf + 2) = 0xff; if (deflateInit2(soap->d_stream, soap->z_level, Z_DEFLATED, -MAX_WBITS, 8, Z_DEFAULT_STRATEGY) != Z_OK) return soap->error = SOAP_ZLIB_ERROR; } else #endif if (deflateInit(soap->d_stream, soap->z_level) != Z_OK) return soap->error = SOAP_ZLIB_ERROR; if (soap->z_dict) { if (deflateSetDictionary(soap->d_stream, (const Bytef*)soap->z_dict, soap->z_dict_len) != Z_OK) return soap->error = SOAP_ZLIB_ERROR; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Deflate initialized\n")); soap->zlib_state = SOAP_ZLIB_DEFLATE; } #endif #ifdef WITH_OPENSSL if (soap->ssl) ERR_clear_error(); #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Begin send phase (socket=%d mode=0x%x count=%lu)\n", soap->socket, soap->mode, (unsigned long)soap->count)); soap->part = SOAP_BEGIN; #ifndef WITH_LEANER if (soap->fprepareinitsend && (soap->mode & SOAP_IO) == SOAP_IO_STORE && (soap->error = soap->fprepareinitsend(soap))) return soap->error; #endif return SOAP_OK; } #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_embedded(struct soap *soap, const void *p, int t) { struct soap_plist *pp; if (soap_pointer_lookup(soap, p, t, &pp)) { pp->mark1 = 1; pp->mark2 = 1; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Embedded %p type=%d mark set to 1\n", p, t)); } } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_reference(struct soap *soap, const void *p, int t) { struct soap_plist *pp; if (!p || (!soap->encodingStyle && !(soap->omode & (SOAP_ENC_DIME|SOAP_ENC_MIME|SOAP_ENC_MTOM|SOAP_XML_GRAPH))) || (soap->omode & SOAP_XML_TREE)) return 1; if (soap_pointer_lookup(soap, p, t, &pp)) { if (pp->mark1 == 0) { pp->mark1 = 2; pp->mark2 = 2; } } else if (!soap_pointer_enter(soap, p, NULL, 0, t, &pp)) return 1; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Reference %p type=%d (%d %d)\n", p, t, (int)pp->mark1, (int)pp->mark2)); return pp->mark1; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_array_reference(struct soap *soap, const void *p, const void *a, int n, int t) { struct soap_plist *pp; if (!p || !a || (!soap->encodingStyle && !(soap->omode & (SOAP_ENC_DIME|SOAP_ENC_MIME|SOAP_ENC_MTOM|SOAP_XML_GRAPH))) || (soap->omode & SOAP_XML_TREE)) return 1; if (soap_array_pointer_lookup(soap, p, a, n, t, &pp)) { if (pp->mark1 == 0) { pp->mark1 = 2; pp->mark2 = 2; } } else if (!soap_pointer_enter(soap, p, a, n, t, &pp)) return 1; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Array reference %p ptr=%p n=%lu type=%d (%d %d)\n", p, a, (unsigned long)n, t, (int)pp->mark1, (int)pp->mark2)); return pp->mark1; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_embedded_id(struct soap *soap, int id, const void *p, int t) { struct soap_plist *pp = NULL; if (id >= 0 || (!soap->encodingStyle && !(soap->omode & SOAP_XML_GRAPH)) || (soap->omode & SOAP_XML_TREE)) return id; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Embedded_id %p type=%d id=%d\n", p, t, id)); if (id < -1) return soap_embed(soap, p, NULL, 0, t); if (id < 0) { id = soap_pointer_lookup(soap, p, t, &pp); if (soap->version == 1 && soap->part != SOAP_IN_HEADER) { if (id) { if (soap->mode & SOAP_IO_LENGTH) pp->mark1 = 2; else pp->mark2 = 2; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Embedded_id multiref id=%d %p type=%d = (%d %d)\n", id, p, t, (int)pp->mark1, (int)pp->mark2)); } return -1; } else if (id) { if (soap->mode & SOAP_IO_LENGTH) pp->mark1 = 1; else pp->mark2 = 1; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Embedded_id embedded ref id=%d %p type=%d = (%d %d)\n", id, p, t, (int)pp->mark1, (int)pp->mark2)); } } return id; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_is_embedded(struct soap *soap, struct soap_plist *pp) { if (!pp) return 0; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Is embedded? %d %d\n", (int)pp->mark1, (int)pp->mark2)); if (soap->version == 1 && soap->encodingStyle && !(soap->mode & SOAP_XML_GRAPH) && soap->part != SOAP_IN_HEADER) { if (soap->mode & SOAP_IO_LENGTH) return pp->mark1 != 0; return pp->mark2 != 0; } if (soap->mode & SOAP_IO_LENGTH) return pp->mark1 == 1; return pp->mark2 == 1; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_is_single(struct soap *soap, struct soap_plist *pp) { if (soap->part == SOAP_IN_HEADER) return 1; if (!pp) return 0; if (soap->mode & SOAP_IO_LENGTH) return pp->mark1 == 0; return pp->mark2 == 0; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_set_embedded(struct soap *soap, struct soap_plist *pp) { if (!pp) return; if (soap->mode & SOAP_IO_LENGTH) pp->mark1 = 1; else pp->mark2 = 1; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_attachment(struct soap *soap, const char *tag, int id, const void *p, const void *a, int n, const char *aid, const char *atype, const char *aoptions, const char *type, int t) { struct soap_plist *pp; int i; if (!p || !a || (!aid && !atype)) return soap_element_id(soap, tag, id, p, a, n, type, t, NULL); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Attachment tag='%s' id='%s' (%d) type='%s'\n", tag, aid ? aid : SOAP_STR_EOS, id, atype ? atype : SOAP_STR_EOS)); i = soap_array_pointer_lookup(soap, p, a, n, t, &pp); if (!i) { i = soap_pointer_enter(soap, p, a, n, t, &pp); if (!i) { soap->error = SOAP_EOM; return -1; } } if (id <= 0) id = i; if (!aid) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), strlen(soap->dime_id_format) + 20), soap->dime_id_format, id); aid = soap_strdup(soap, soap->tmpbuf); } /* Add MTOM xop:Include element when necessary */ /* TODO: this code to be obsoleted with new import/xop.h conventions */ if ((soap->mode & SOAP_ENC_MTOM) && strcmp(tag, "xop:Include")) { if (soap_element_begin_out(soap, tag, 0, type) || soap_element_href(soap, "xop:Include", 0, "xmlns:xop=\"http://www.w3.org/2004/08/xop/include\" href", aid) || soap_element_end_out(soap, tag)) return soap->error; } else if (soap_element_href(soap, tag, 0, "href", aid)) return soap->error; if (soap->mode & SOAP_IO_LENGTH) { if (pp->mark1 != 3) { struct soap_multipart *content; if (soap->mode & SOAP_ENC_MTOM) content = soap_new_multipart(soap, &soap->mime.first, &soap->mime.last, (char*)a, n); else content = soap_new_multipart(soap, &soap->dime.first, &soap->dime.last, (char*)a, n); if (!content) { soap->error = SOAP_EOM; return -1; } if (!strncmp(aid, "cid:", 4)) /* RFC 2111 */ { if (soap->mode & SOAP_ENC_MTOM) { size_t l = strlen(aid) - 1; char *s = (char*)soap_malloc(soap, l); if (s) { s[0] = '<'; soap_strncpy(s + 1, l - 1, aid + 4, l - 3); s[l - 2] = '>'; s[l - 1] = '\0'; content->id = s; } } else content->id = aid + 4; } else content->id = aid; content->type = atype; content->options = aoptions; content->encoding = SOAP_MIME_BINARY; pp->mark1 = 3; } } else pp->mark2 = 3; return -1; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_1 static void soap_init_iht(struct soap *soap) { int i; for (i = 0; i < SOAP_IDHASH; i++) soap->iht[i] = NULL; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_1 static void soap_free_iht(struct soap *soap) { int i; struct soap_ilist *ip = NULL, *p = NULL; struct soap_flist *fp = NULL, *fq = NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free ID hashtable\n")); for (i = 0; i < SOAP_IDHASH; i++) { for (ip = soap->iht[i]; ip; ip = p) { for (fp = ip->flist; fp; fp = fq) { fq = fp->next; SOAP_FREE(soap, fp); } p = ip->next; SOAP_FREE(soap, ip); } soap->iht[i] = NULL; } } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 struct soap_ilist * SOAP_FMAC2 soap_lookup(struct soap *soap, const char *id) { struct soap_ilist *ip = NULL; for (ip = soap->iht[soap_hash(id)]; ip; ip = ip->next) if (!strcmp(ip->id, id)) return ip; return NULL; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 struct soap_ilist * SOAP_FMAC2 soap_enter(struct soap *soap, const char *id, int t, size_t n) { size_t h; struct soap_ilist *ip; size_t l = strlen(id); ip = (struct soap_ilist*)SOAP_MALLOC(soap, sizeof(struct soap_ilist) + l); if (ip) { ip->type = t; ip->size = n; ip->ptr = NULL; ip->spine = NULL; ip->link = NULL; ip->copy = NULL; ip->flist = NULL; ip->smart = NULL; ip->shaky = 0; soap_strcpy((char*)ip->id, l + 1, id); h = soap_hash(id); /* h = (HASH(id) % SOAP_IDHASH) so soap->iht[h] is safe */ ip->next = soap->iht[h]; soap->iht[h] = ip; } return ip; } #endif #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void* SOAP_FMAC2 soap_malloc(struct soap *soap, size_t n) { char *p; if (!soap) return SOAP_MALLOC(soap, n); if (soap->fmalloc) p = (char*)soap->fmalloc(soap, n); else { n += sizeof(short); n += (-(long)n) & (sizeof(void*)-1); /* align at 4-, 8- or 16-byte boundary */ if ((p = (char*)SOAP_MALLOC(soap, n + sizeof(void*) + sizeof(size_t))) == NULL) { soap->error = SOAP_EOM; return NULL; } /* set a canary word to detect memory overruns and data corruption */ *(unsigned short*)(p + n - sizeof(unsigned short)) = (unsigned short)SOAP_CANARY; /* keep chain of alloced cells for destruction */ *(void**)(p + n) = soap->alist; *(size_t*)(p + n + sizeof(void*)) = n; soap->alist = p + n; } return p; } #endif /******************************************************************************/ #ifdef SOAP_MEM_DEBUG static void soap_init_mht(struct soap *soap) { int i; for (i = 0; i < (int)SOAP_PTRHASH; i++) soap->mht[i] = NULL; } #endif /******************************************************************************/ #ifdef SOAP_MEM_DEBUG static void soap_free_mht(struct soap *soap) { int i; struct soap_mlist *mp, *mq; for (i = 0; i < (int)SOAP_PTRHASH; i++) { for (mp = soap->mht[i]; mp; mp = mq) { mq = mp->next; if (mp->live) fprintf(stderr, "%s(%d): malloc() = %p not freed (memory leak or forgot to call soap_end()?)\n", mp->file, mp->line, mp->ptr); free(mp); } soap->mht[i] = NULL; } } #endif /******************************************************************************/ #ifdef SOAP_MEM_DEBUG SOAP_FMAC1 void* SOAP_FMAC2 soap_track_malloc(struct soap *soap, const char *file, int line, size_t size) { void *p = malloc(size); if (soap) { size_t h = soap_hash_ptr(p); struct soap_mlist *mp = (struct soap_mlist*)malloc(sizeof(struct soap_mlist)); if (soap->fdebug[SOAP_INDEX_TEST]) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%s(%d): malloc(%lu) = %p\n", file, line, (unsigned long)size, p)); } mp->next = soap->mht[h]; mp->ptr = p; mp->file = file; mp->line = line; mp->live = 1; soap->mht[h] = mp; } return p; } #endif /******************************************************************************/ #ifdef SOAP_MEM_DEBUG SOAP_FMAC1 void SOAP_FMAC2 soap_track_free(struct soap *soap, const char *file, int line, void *p) { if (!soap) free(p); else { size_t h = soap_hash_ptr(p); struct soap_mlist *mp; for (mp = soap->mht[h]; mp; mp = mp->next) if (mp->ptr == p) break; if (mp) { if (mp->live) { if (soap->fdebug[SOAP_INDEX_TEST]) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%s(%d): free(%p)\n", file, line, p)); } free(p); mp->live = 0; } else fprintf(stderr, "%s(%d): free(%p) double free of pointer malloced at %s(%d)\n", file, line, p, mp->file, mp->line); } else fprintf(stderr, "%s(%d): free(%p) pointer not malloced\n", file, line, p); } } #endif /******************************************************************************/ #ifdef SOAP_MEM_DEBUG static void soap_track_unlink(struct soap *soap, const void *p) { size_t h = soap_hash_ptr(p); struct soap_mlist *mp; for (mp = soap->mht[h]; mp; mp = mp->next) if (mp->ptr == p) break; if (mp) mp->live = 0; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_dealloc(struct soap *soap, void *p) { if (soap_check_state(soap)) return; if (p) { char **q; for (q = (char**)(void*)&soap->alist; *q; q = *(char***)q) { if (*(unsigned short*)(char*)(*q - sizeof(unsigned short)) != (unsigned short)SOAP_CANARY) { #ifdef SOAP_MEM_DEBUG fprintf(stderr, "Data corruption in dynamic allocation (see logs)\n"); #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Data corruption:\n")); DBGHEX(TEST, *q - 200, 200); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n")); soap->error = SOAP_MOE; return; } if (p == (void*)(*q - *(size_t*)(*q + sizeof(void*)))) { *q = **(char***)q; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Freed data at %p\n", p)); SOAP_FREE(soap, p); return; } } soap_delete(soap, p); } else { char *q; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free all soap_malloc() data\n")); while (soap->alist) { q = (char*)soap->alist; if (*(unsigned short*)(char*)(q - sizeof(unsigned short)) != (unsigned short)SOAP_CANARY) { #ifdef SOAP_MEM_DEBUG fprintf(stderr, "Data corruption in dynamic allocation (see logs)\n"); #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Data corruption:\n")); DBGHEX(TEST, q - 200, 200); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n")); soap->error = SOAP_MOE; return; } soap->alist = *(void**)q; q -= *(size_t*)(q + sizeof(void*)); SOAP_FREE(soap, q); } /* assume these were deallocated: */ soap->http_content = NULL; soap->action = NULL; soap->fault = NULL; soap->header = NULL; soap->userid = NULL; soap->passwd = NULL; soap->authrealm = NULL; #ifdef WITH_NTLM soap->ntlm_challenge = NULL; #endif #ifndef WITH_LEANER soap_clr_mime(soap); #endif } } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_delete(struct soap *soap, void *p) { struct soap_clist **cp; if (soap_check_state(soap)) return; cp = &soap->clist; if (p) { while (*cp) { if (p == (*cp)->ptr) { struct soap_clist *q = *cp; *cp = q->next; if (q->fdelete(q)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not dealloc data %p: deletion callback failed for object type %d\n", q->ptr, q->type)); #ifdef SOAP_MEM_DEBUG fprintf(stderr, "new(object type = %d) = %p not freed: deletion callback failed\n", q->type, q->ptr); #endif } SOAP_FREE(soap, q); return; } cp = &(*cp)->next; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not dealloc data %p: address not in list\n", p)); } else { while (*cp) { struct soap_clist *q = *cp; *cp = q->next; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Delete %p type=%d (cp=%p)\n", q->ptr, q->type, q)); if (q->fdelete(q)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not dealloc data %p: deletion callback failed for object type %d\n", q->ptr, q->type)); #ifdef SOAP_MEM_DEBUG fprintf(stderr, "new(object type = %d) = %p not freed: deletion callback failed\n", q->type, q->ptr); #endif } SOAP_FREE(soap, q); } } soap->fault = NULL; /* assume this was deallocated */ soap->header = NULL; /* assume this was deallocated */ } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_delegate_deletion(struct soap *soap, struct soap *soap_to) { struct soap_clist *cp; char **q; #ifdef SOAP_MEM_DEBUG void *p; struct soap_mlist **mp, *mq; size_t h; #endif for (q = (char**)(void*)&soap->alist; *q; q = *(char***)q) { if (*(unsigned short*)(char*)(*q - sizeof(unsigned short)) != (unsigned short)SOAP_CANARY) { #ifdef SOAP_MEM_DEBUG fprintf(stderr, "Data corruption in dynamic allocation (see logs)\n"); #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Data corruption:\n")); DBGHEX(TEST, *q - 200, 200); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n")); soap->error = SOAP_MOE; return; } #ifdef SOAP_MEM_DEBUG p = (void*)(*q - *(size_t*)(*q + sizeof(void*))); h = soap_hash_ptr(p); for (mp = &soap->mht[h]; *mp; mp = &(*mp)->next) { if ((*mp)->ptr == p) { mq = *mp; *mp = mq->next; mq->next = soap_to->mht[h]; soap_to->mht[h] = mq; break; } } #endif } *q = (char*)soap_to->alist; soap_to->alist = soap->alist; soap->alist = NULL; #ifdef SOAP_MEM_DEBUG cp = soap->clist; while (cp) { h = soap_hash_ptr(cp); for (mp = &soap->mht[h]; *mp; mp = &(*mp)->next) { if ((*mp)->ptr == cp) { mq = *mp; *mp = mq->next; mq->next = soap_to->mht[h]; soap_to->mht[h] = mq; break; } } cp = cp->next; } #endif cp = soap_to->clist; if (cp) { while (cp->next) cp = cp->next; cp->next = soap->clist; } else soap_to->clist = soap->clist; soap->clist = NULL; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 struct soap_clist * SOAP_FMAC2 soap_link(struct soap *soap, void *p, int t, int n, int (*fdelete)(struct soap_clist*)) { struct soap_clist *cp = NULL; if (soap && p && n != SOAP_NO_LINK_TO_DELETE) { if (!(cp = (struct soap_clist*)SOAP_MALLOC(soap, sizeof(struct soap_clist)))) soap->error = SOAP_EOM; else { cp->next = soap->clist; cp->type = soap->alloced = t; cp->size = n; cp->ptr = p; cp->fdelete = fdelete; soap->clist = cp; } } return cp; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_unlink(struct soap *soap, const void *p) { char **q; struct soap_clist **cp; if (soap && p) { for (q = (char**)(void*)&soap->alist; *q; q = *(char***)q) { if (p == (void*)(*q - *(size_t*)(*q + sizeof(void*)))) { *q = **(char***)q; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unlinked data %p\n", p)); #ifdef SOAP_MEM_DEBUG soap_track_unlink(soap, p); #endif return SOAP_OK; /* found and removed from dealloc chain */ } } for (cp = &soap->clist; *cp; cp = &(*cp)->next) { if (p == (*cp)->ptr) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unlinked class instance %p\n", p)); q = (char**)*cp; *cp = (*cp)->next; SOAP_FREE(soap, q); return SOAP_OK; /* found and removed from dealloc chain */ } } } return SOAP_ERR; } #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_lookup_type(struct soap *soap, const char *id) { struct soap_ilist *ip; if (id && *id) { ip = soap_lookup(soap, id); if (ip) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Lookup id='%s' type=%d\n", id, ip->type)); return ip->type; } } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "lookup type id='%s' NOT FOUND! Need to get it from xsi:type\n", id)); return 0; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_1 SOAP_FMAC1 short SOAP_FMAC2 soap_begin_shaky(struct soap *soap) { short f = soap->shaky; soap->shaky = 1; return f; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_end_shaky(struct soap *soap, short f) { soap->shaky = f; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF static int soap_is_shaky(struct soap *soap, void *p) { (void)p; if (!soap->blist && !soap->shaky) return 0; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Shaky %p\n", p)); return 1; } #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 void* SOAP_FMAC2 soap_id_lookup(struct soap *soap, const char *id, void **p, int t, size_t n, unsigned int k, int (*fbase)(int, int)) { struct soap_ilist *ip; if (!p || !id || !*id) return p; ip = soap_lookup(soap, id); /* lookup pointer to hash table entry for string id */ if (!ip) { if (!(ip = soap_enter(soap, id, t, n))) /* new hash table entry for string id */ return NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forwarding first href='%s' type=%d location=%p (%u bytes) level=%u\n", id, t, p, (unsigned int)n, k)); *p = NULL; if (k) { int i; if (k > SOAP_MAXPTRS) return NULL; if (!(ip->spine = (void**)soap_malloc(soap, SOAP_MAXPTRS * sizeof(void*)))) return NULL; ip->spine[0] = NULL; for (i = 1; i < SOAP_MAXPTRS; i++) ip->spine[i] = &ip->spine[i - 1]; *p = &ip->spine[k - 1]; } else { ip->link = p; ip->shaky = soap_is_shaky(soap, (void*)p); } } else if ((ip->type != t || ip->size != n) && (!fbase || !fbase(ip->type, t)) && (!fbase || !fbase(t, ip->type) || soap_type_punned(soap, ip))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Lookup type incompatibility: ref='%s' id-type=%d ref-type=%d\n", id, ip->type, t)); soap_id_nullify(soap, id); return NULL; } else if (k == 0 && ip->ptr && !ip->shaky) /* when block lists are in use, ip->ptr will change */ { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolved href='%s' type=%d location=%p (%u bytes) level=%u\n", id, t, ip->ptr, (unsigned int)n, k)); *p = ip->ptr; } else { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forwarded href='%s' type=%d location=%p (%u bytes) level=%u\n", id, t, p, (unsigned int)n, k)); if (fbase && fbase(t, ip->type) && !soap_type_punned(soap, ip)) { ip->type = t; ip->size = n; } *p = NULL; if (k) { if (!ip->spine) { int i; if (k > SOAP_MAXPTRS) return NULL; if (!(ip->spine = (void**)soap_malloc(soap, SOAP_MAXPTRS * sizeof(void*)))) return NULL; ip->spine[0] = NULL; for (i = 1; i < SOAP_MAXPTRS; i++) ip->spine[i] = &ip->spine[i - 1]; } *p = &ip->spine[k - 1]; if (ip->ptr && !ip->shaky) ip->spine[0] = ip->ptr; } else { void *q = ip->link; ip->link = p; ip->shaky = soap_is_shaky(soap, (void*)p); *p = q; } } return p; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 void* SOAP_FMAC2 soap_id_forward(struct soap *soap, const char *href, void *p, size_t i, int t, int tt, size_t n, unsigned int k, void (*finsert)(struct soap*, int, int, void*, size_t, const void*, void**), int (*fbase)(int, int)) { struct soap_ilist *ip; if (!p || !href || !*href) return p; ip = soap_lookup(soap, href); /* lookup pointer to hash table entry for string id */ if (!ip) { if (!(ip = soap_enter(soap, href, t, n))) /* new hash table entry for string id */ return NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "New entry href='%s' type=%d size=%lu level=%d location=%p\n", href, t, (unsigned long)n, k, p)); } else if ((ip->type != t || ip->size != n) && k == 0) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forward type incompatibility id='%s' expect type=%d size=%lu level=%u got type=%d size=%lu\n", href, ip->type, (unsigned long)ip->size, k, t, (unsigned long)n)); soap_id_nullify(soap, href); return NULL; } if (finsert || n < sizeof(void*)) { struct soap_flist *fp = (struct soap_flist*)SOAP_MALLOC(soap, sizeof(struct soap_flist)); if (!fp) { soap->error = SOAP_EOM; return NULL; } if (fbase && fbase(t, ip->type) && !soap_type_punned(soap, ip)) { ip->type = t; ip->size = n; } if ((ip->type != t || ip->size != n) && (!fbase || !fbase(ip->type, t))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forward type incompatibility id='%s' expect type=%d size=%lu level=%u got type=%d size=%lu\n", href, ip->type, (unsigned long)ip->size, k, t, (unsigned long)n)); soap_id_nullify(soap, href); return NULL; } fp->next = ip->flist; fp->type = tt; fp->ptr = p; fp->level = k; fp->index = i; fp->finsert = finsert; ip->flist = fp; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forwarding type=%d (target type=%d) size=%lu location=%p level=%u index=%lu href='%s'\n", t, tt, (unsigned long)n, p, k, (unsigned long)i, href)); } else { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forwarding copying address %p for type=%d href='%s'\n", p, t, href)); *(void**)p = ip->copy; ip->copy = p; } ip->shaky = soap_is_shaky(soap, p); return p; } #endif #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void* SOAP_FMAC2 soap_id_enter(struct soap *soap, const char *id, void *p, int t, size_t n, const char *type, const char *arrayType, void *(*finstantiate)(struct soap*, int, const char*, const char*, size_t*), int (*fbase)(int, int)) { #ifndef WITH_NOIDREF struct soap_ilist *ip; #endif (void)id; (void)fbase; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Enter id='%s' type=%d location=%p size=%lu\n", id, t, p, (unsigned long)n)); soap->alloced = 0; if (!p) { if (finstantiate) p = finstantiate(soap, t, type, arrayType, &n); /* alloced set in soap_link() */ else { p = soap_malloc(soap, n); soap->alloced = t; } } #ifndef WITH_NOIDREF if (!id || !*id) #endif return p; #ifndef WITH_NOIDREF ip = soap_lookup(soap, id); /* lookup pointer to hash table entry for string id */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Lookup entry id='%s' for location=%p\n", id, p)); if (!ip) { if (!(ip = soap_enter(soap, id, t, n))) /* new hash table entry for string id */ return NULL; ip->ptr = p; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "New entry id='%s' type=%d size=%lu location=%p\n", id, t, (unsigned long)n, p)); if (!soap->alloced) ip->shaky = soap_is_shaky(soap, p); } else if (ip->ptr) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Multiply defined id='%s'\n", id)); soap_strcpy(soap->id, sizeof(soap->id), id); soap->error = SOAP_DUPLICATE_ID; return NULL; } else if ((ip->type != t || ip->size != n) && (!fbase || !fbase(t, ip->type) || soap_type_punned(soap, ip))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Enter type incompatibility id='%s' expect type=%d size=%lu got type=%d size=%lu\n", id, ip->type, (unsigned long)ip->size, t, (unsigned long)n)); soap_id_nullify(soap, id); return NULL; } else { ip->type = t; ip->size = n; ip->ptr = p; if (!soap->alloced) ip->shaky = soap_is_shaky(soap, p); if (soap->alloced || !ip->shaky) { void **q; /* ptr will not change later, so resolve links now */ if (ip->spine) ip->spine[0] = p; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Traversing link chain to resolve id='%s' type=%d\n", ip->id, ip->type)); q = (void**)ip->link; while (q) { void *r = *q; *q = p; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "... link %p -> %p\n", q, p)); q = (void**)r; } ip->link = NULL; } } return ip->ptr; #endif } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void** SOAP_FMAC2 soap_id_smart(struct soap *soap, const char *id, int t, size_t n) { (void)soap; (void)id; (void)t; (void)n; #ifndef WITH_NOIDREF if (id && *id) { struct soap_ilist *ip = soap_lookup(soap, id); /* lookup pointer to hash table entry for string id */ if (!ip) { if (!(ip = soap_enter(soap, id, t, n))) /* new hash table entry for string id */ return NULL; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "New smart shared pointer entry id='%s' type=%d size=%lu smart=%p\n", id, t, (unsigned long)n, ip->smart)); return &ip->smart; } #endif return NULL; } #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 static int soap_type_punned(struct soap *soap, const struct soap_ilist *ip) { const struct soap_flist *fp; (void)soap; if (ip->ptr || ip->copy) return 1; for (fp = ip->flist; fp; fp = fp->next) if (fp->level == 0) return 1; return 0; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_id_nullify(struct soap *soap, const char *id) { int i; for (i = 0; i < SOAP_IDHASH; i++) { struct soap_ilist *ip; for (ip = soap->iht[i]; ip; ip = ip->next) { void *p, *q; for (p = ip->link; p; p = q) { q = *(void**)p; *(void**)p = NULL; } ip->link = NULL; } } soap_strcpy(soap->id, sizeof(soap->id), id); return soap->error = SOAP_HREF; } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_end_send(struct soap *soap) { #ifndef WITH_LEANER int err; if (soap->dime.list) { /* SOAP body referenced attachments must appear first */ soap->dime.last->next = soap->dime.first; soap->dime.first = soap->dime.list->next; soap->dime.list->next = NULL; soap->dime.last = soap->dime.list; } if (!(err = soap_putdime(soap))) err = soap_putmime(soap); soap->mime.list = NULL; soap->mime.first = NULL; soap->mime.last = NULL; soap->dime.list = NULL; soap->dime.first = NULL; soap->dime.last = NULL; if (err) return err; #endif return soap_end_send_flush(soap); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_end_send_flush(struct soap *soap) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End send mode=0x%x\n", soap->mode)); if (soap->mode & SOAP_IO) /* need to flush the remaining data in buffer */ { if (soap_flush(soap)) #ifdef WITH_ZLIB { if (soap->mode & SOAP_ENC_ZLIB && soap->zlib_state == SOAP_ZLIB_DEFLATE) { soap->zlib_state = SOAP_ZLIB_NONE; deflateEnd(soap->d_stream); } return soap->error; } #else return soap->error; #endif #ifdef WITH_ZLIB if ((soap->mode & SOAP_ENC_ZLIB) && soap->d_stream) { int r; soap->d_stream->avail_in = 0; do { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Deflating remainder\n")); r = deflate(soap->d_stream, Z_FINISH); if (soap->d_stream->avail_out != sizeof(soap->buf)) { if (soap_flush_raw(soap, soap->z_buf, sizeof(soap->buf) - soap->d_stream->avail_out)) { soap->zlib_state = SOAP_ZLIB_NONE; deflateEnd(soap->d_stream); return soap->error; } soap->d_stream->next_out = (Byte*)soap->z_buf; soap->d_stream->avail_out = sizeof(soap->buf); } } while (r == Z_OK); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Deflated total %lu->%lu bytes\n", soap->d_stream->total_in, soap->d_stream->total_out)); soap->z_ratio_out = (float)soap->d_stream->total_out / (float)soap->d_stream->total_in; soap->mode &= ~SOAP_ENC_ZLIB; soap->zlib_state = SOAP_ZLIB_NONE; if (deflateEnd(soap->d_stream) != Z_OK || r != Z_STREAM_END) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unable to end deflate: %s\n", soap->d_stream->msg ? soap->d_stream->msg : SOAP_STR_EOS)); return soap->error = SOAP_ZLIB_ERROR; } #ifdef WITH_GZIP if (soap->zlib_out != SOAP_ZLIB_DEFLATE) { soap->z_buf[0] = soap->z_crc & 0xFF; soap->z_buf[1] = (soap->z_crc >> 8) & 0xFF; soap->z_buf[2] = (soap->z_crc >> 16) & 0xFF; soap->z_buf[3] = (soap->z_crc >> 24) & 0xFF; soap->z_buf[4] = soap->d_stream->total_in & 0xFF; soap->z_buf[5] = (soap->d_stream->total_in >> 8) & 0xFF; soap->z_buf[6] = (soap->d_stream->total_in >> 16) & 0xFF; soap->z_buf[7] = (soap->d_stream->total_in >> 24) & 0xFF; if (soap_flush_raw(soap, soap->z_buf, 8)) return soap->error; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "gzip crc32=%lu\n", (unsigned long)soap->z_crc)); } #endif } #endif if ((soap->mode & SOAP_IO) == SOAP_IO_STORE) { #if !defined(__cplusplus) || defined(WITH_COMPAT) if (soap->os) { char *b = (char*)soap_push_block(soap, NULL, 1); if (b) *soap->os = soap_save_block(soap, NULL, NULL, 0); } else #endif { char *p; #ifndef WITH_NOHTTP if (!(soap->mode & SOAP_ENC_XML)) { soap->mode--; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Sending buffered message of length %u\n", (unsigned int)soap->blist->size)); if (soap->status >= SOAP_POST) soap->error = soap->fpost(soap, soap->endpoint, soap->host, soap->port, soap->path, soap->action, soap->blist->size); else if (soap->status != SOAP_STOP) soap->error = soap->fresponse(soap, soap->status, soap->blist->size); if (soap->error || soap_flush(soap)) return soap->error; soap->mode++; } #endif for (p = soap_first_block(soap, NULL); p; p = soap_next_block(soap, NULL)) { DBGMSG(SENT, p, soap_block_size(soap, NULL)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Send %u bytes to socket=%d/fd=%d\n", (unsigned int)soap_block_size(soap, NULL), soap->socket, soap->sendfd)); if ((soap->error = soap->fsend(soap, p, soap_block_size(soap, NULL)))) { soap_end_block(soap, NULL); return soap->error; } } soap_end_block(soap, NULL); } #ifndef WITH_LEANER if (soap->fpreparefinalsend && (soap->error = soap->fpreparefinalsend(soap))) return soap->error; #endif } #ifndef WITH_LEANER else if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK) { DBGMSG(SENT, "\r\n0\r\n\r\n", 7); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Send 7 bytes to socket=%d/fd=%d\n", soap->socket, soap->sendfd)); if ((soap->error = soap->fsend(soap, "\r\n0\r\n\r\n", 7))) return soap->error; } #endif } #ifdef WITH_TCPFIN #if defined(WITH_OPENSSL) || defined(WITH_SYSTEMSSL) if (!soap->ssl) #endif if (soap_valid_socket(soap->socket) && !soap->keep_alive && !(soap->omode & SOAP_IO_UDP)) soap->fshutdownsocket(soap, soap->socket, SOAP_SHUT_WR); /* Send TCP FIN */ #endif #if defined(__cplusplus) && !defined(WITH_COMPAT) if (soap->os) soap->os->flush(); #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of send phase\n")); soap->omode &= ~SOAP_SEC_WSUID; soap->count = 0; soap->part = SOAP_END; return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_end_recv(struct soap *soap) { soap->part = SOAP_END; #ifndef WITH_LEAN soap->wsuid = NULL; /* reset before next send */ soap->c14nexclude = NULL; /* reset before next send */ soap->c14ninclude = NULL; /* reset before next send */ #endif #ifndef WITH_LEANER soap->ffilterrecv = NULL; if ((soap->mode & SOAP_ENC_DIME) && soap_getdime(soap)) { soap->dime.first = NULL; soap->dime.last = NULL; return soap->error; } soap->dime.list = soap->dime.first; soap->dime.first = NULL; soap->dime.last = NULL; /* Check if MIME attachments and mime-post-check flag is set, if so call soap_resolve() and return */ if (soap->mode & SOAP_ENC_MIME) { if (soap->mode & SOAP_MIME_POSTCHECK) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Post checking MIME attachments\n")); if (!soap->keep_alive) soap->keep_alive = -1; #ifndef WITH_NOIDREF soap_resolve(soap); #endif return SOAP_OK; } if (soap_getmime(soap)) return soap->error; } soap->mime.list = soap->mime.first; soap->mime.first = NULL; soap->mime.last = NULL; soap->mime.boundary = NULL; if (soap->xlist) { struct soap_multipart *content; for (content = soap->mime.list; content; content = content->next) soap_resolve_attachment(soap, content); } #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of receive message ok\n")); #ifdef WITH_ZLIB if ((soap->mode & SOAP_ENC_ZLIB) && soap->d_stream) { /* Make sure end of compressed content is reached */ while (soap->d_stream->next_out != Z_NULL) if ((int)soap_get1(soap) == EOF) break; soap->mode &= ~SOAP_ENC_ZLIB; soap_memcpy((void*)soap->buf, sizeof(soap->buf), (const void*)soap->z_buf, sizeof(soap->buf)); soap->bufidx = (char*)soap->d_stream->next_in - soap->z_buf; soap->buflen = soap->z_buflen; soap->zlib_state = SOAP_ZLIB_NONE; if (inflateEnd(soap->d_stream) != Z_OK) return soap->error = SOAP_ZLIB_ERROR; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflate end ok\n")); #ifdef WITH_GZIP if (soap->zlib_in == SOAP_ZLIB_GZIP) { soap_wchar c; short i; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflate gzip crc check\n")); for (i = 0; i < 8; i++) { if ((int)(c = soap_get1(soap)) == EOF) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Gzip error: unable to read crc value\n")); return soap->error = SOAP_ZLIB_ERROR; } soap->z_buf[i] = (char)c; } if (soap->z_crc != ((uLong)(unsigned char)soap->z_buf[0] | ((uLong)(unsigned char)soap->z_buf[1] << 8) | ((uLong)(unsigned char)soap->z_buf[2] << 16) | ((uLong)(unsigned char)soap->z_buf[3] << 24))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Gzip inflate error: crc check failed, message corrupted? (crc32=%lu)\n", (unsigned long)soap->z_crc)); return soap->error = SOAP_ZLIB_ERROR; } if (soap->d_stream->total_out != ((uLong)(unsigned char)soap->z_buf[4] | ((uLong)(unsigned char)soap->z_buf[5] << 8) | ((uLong)(unsigned char)soap->z_buf[6] << 16) | ((uLong)(unsigned char)soap->z_buf[7] << 24))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Gzip inflate error: incorrect message length\n")); return soap->error = SOAP_ZLIB_ERROR; } } soap->zlib_in = SOAP_ZLIB_NONE; #endif } #endif if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK) while (soap->ahead != EOF && !soap_recv_raw(soap)) continue; #ifndef WITH_NOIDREF if (soap_resolve(soap)) return soap->error; #endif #ifndef WITH_LEANER if (soap->xlist) { if (soap->mode & SOAP_ENC_MTOM) return soap->error = SOAP_MIME_HREF; return soap->error = SOAP_DIME_HREF; } #endif soap_free_ns(soap); #ifndef WITH_LEANER if (soap->fpreparefinalrecv) return soap->error = soap->fpreparefinalrecv(soap); #endif return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_free_temp(struct soap *soap) { struct soap_attribute *tp, *tq; struct Namespace *ns; soap_free_ns(soap); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free any remaining temp blocks\n")); while (soap->blist) soap_end_block(soap, NULL); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free attribute storage\n")); for (tp = soap->attributes; tp; tp = tq) { tq = tp->next; if (tp->value) SOAP_FREE(soap, tp->value); SOAP_FREE(soap, tp); } soap->attributes = NULL; #ifdef WITH_FAST if (soap->labbuf) SOAP_FREE(soap, soap->labbuf); soap->labbuf = NULL; soap->lablen = 0; soap->labidx = 0; #endif ns = soap->local_namespaces; if (ns) { for (; ns->id; ns++) { if (ns->out) { SOAP_FREE(soap, ns->out); ns->out = NULL; } } SOAP_FREE(soap, soap->local_namespaces); soap->local_namespaces = NULL; } #ifndef WITH_LEANER while (soap->xlist) { struct soap_xlist *xp = soap->xlist->next; SOAP_FREE(soap, soap->xlist); soap->xlist = xp; } #endif #ifndef WITH_NOIDREF soap_free_iht(soap); #endif soap_free_pht(soap); } #endif /******************************************************************************/ #ifndef PALM_1 static void soap_free_ns(struct soap *soap) { struct soap_nlist *np, *nq; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free namespace stack\n")); for (np = soap->nlist; np; np = nq) { nq = np->next; SOAP_FREE(soap, np); } soap->nlist = NULL; } #endif /******************************************************************************/ #ifndef PALM_1 #if !defined(WITH_LEAN) || defined(SOAP_DEBUG) static void soap_init_logs(struct soap *soap) { int i; for (i = 0; i < SOAP_MAXLOGS; i++) { soap->logfile[i] = NULL; soap->fdebug[i] = NULL; } } #endif #endif /******************************************************************************/ #if !defined(WITH_LEAN) || defined(SOAP_DEBUG) SOAP_FMAC1 void SOAP_FMAC2 soap_open_logfile(struct soap *soap, int i) { if (soap->logfile[i]) soap->fdebug[i] = fopen(soap->logfile[i], i < 2 ? "ab" : "a"); } #endif /******************************************************************************/ #ifdef SOAP_DEBUG static void soap_close_logfile(struct soap *soap, int i) { if (soap->fdebug[i]) { fclose(soap->fdebug[i]); soap->fdebug[i] = NULL; } } #endif /******************************************************************************/ #ifdef SOAP_DEBUG SOAP_FMAC1 void SOAP_FMAC2 soap_close_logfiles(struct soap *soap) { int i; for (i = 0; i < SOAP_MAXLOGS; i++) soap_close_logfile(soap, i); } #endif /******************************************************************************/ #ifdef SOAP_DEBUG static void soap_set_logfile(struct soap *soap, int i, const char *logfile) { const char *s; char *t = NULL; soap_close_logfile(soap, i); s = soap->logfile[i]; soap->logfile[i] = logfile; if (s) SOAP_FREE(soap, s); if (logfile) { size_t l = strlen(logfile) + 1; if ((t = (char*)SOAP_MALLOC(soap, l))) soap_memcpy((void*)t, l, (const void*)logfile, l); } soap->logfile[i] = t; } #endif /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_set_recv_logfile(struct soap *soap, const char *logfile) { (void)soap; (void)logfile; #ifdef SOAP_DEBUG soap_set_logfile(soap, SOAP_INDEX_RECV, logfile); #endif } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_set_sent_logfile(struct soap *soap, const char *logfile) { (void)soap; (void)logfile; #ifdef SOAP_DEBUG soap_set_logfile(soap, SOAP_INDEX_SENT, logfile); #endif } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_set_test_logfile(struct soap *soap, const char *logfile) { (void)soap; (void)logfile; #ifdef SOAP_DEBUG soap_set_logfile(soap, SOAP_INDEX_TEST, logfile); #endif } /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 struct soap* SOAP_FMAC2 soap_copy(const struct soap *soap) { struct soap *copy = soap_versioning(soap_new)(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT); if (soap_copy_context(copy, soap) != NULL) return copy; soap_free(copy); return NULL; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 struct soap* SOAP_FMAC2 soap_copy_context(struct soap *copy, const struct soap *soap) { if (copy == soap) return copy; if (soap_check_state(soap)) return NULL; if (copy) { struct soap_plugin *p = NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copying context\n")); soap_memcpy((void*)copy, sizeof(struct soap), (const void*)soap, sizeof(struct soap)); copy->state = SOAP_COPY; copy->error = SOAP_OK; copy->userid = NULL; copy->passwd = NULL; #ifdef WITH_NTLM copy->ntlm_challenge = NULL; #endif copy->nlist = NULL; copy->blist = NULL; copy->clist = NULL; copy->alist = NULL; copy->attributes = NULL; copy->labbuf = NULL; copy->lablen = 0; copy->labidx = 0; #ifdef SOAP_MEM_DEBUG soap_init_mht(copy); #endif #if !defined(WITH_LEAN) || defined(SOAP_DEBUG) soap_init_logs(copy); #endif #ifdef SOAP_DEBUG soap_set_test_logfile(copy, soap->logfile[SOAP_INDEX_TEST]); soap_set_sent_logfile(copy, soap->logfile[SOAP_INDEX_SENT]); soap_set_recv_logfile(copy, soap->logfile[SOAP_INDEX_RECV]); #endif copy->namespaces = soap->local_namespaces; copy->local_namespaces = NULL; soap_set_local_namespaces(copy); /* copy content of soap->local_namespaces */ copy->namespaces = soap->namespaces; /* point to shared read-only namespaces table */ copy->c_locale = NULL; #ifdef WITH_OPENSSL copy->bio = NULL; copy->ssl = NULL; copy->session = NULL; #endif #ifdef WITH_GNUTLS copy->session = NULL; #endif #ifdef WITH_ZLIB copy->d_stream = NULL; copy->z_buf = NULL; #endif #ifndef WITH_NOIDREF soap_init_iht(copy); #endif soap_init_pht(copy); copy->header = NULL; copy->fault = NULL; copy->action = NULL; #ifndef WITH_LEAN #ifdef WITH_COOKIES copy->cookies = soap_copy_cookies(copy, soap); #else copy->cookies = NULL; #endif #endif copy->plugins = NULL; for (p = soap->plugins; p; p = p->next) { struct soap_plugin *q = (struct soap_plugin*)SOAP_MALLOC(copy, sizeof(struct soap_plugin)); if (!q) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not allocate plugin '%s'\n", p->id)); soap_end(copy); soap_done(copy); return NULL; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copying plugin '%s'\n", p->id)); *q = *p; if (p->fcopy && (copy->error = p->fcopy(copy, q, p))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not copy plugin '%s' error = %d\n", p->id, copy->error)); SOAP_FREE(copy, q); soap_end(copy); soap_done(copy); return NULL; } q->next = copy->plugins; copy->plugins = q; } } return copy; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_copy_stream(struct soap *copy, struct soap *soap) { struct soap_attribute *tp = NULL, *tq; if (copy == soap) return; copy->header = soap->header; copy->mode = soap->mode; copy->imode = soap->imode; copy->omode = soap->omode; copy->master = soap->master; copy->socket = soap->socket; copy->sendsk = soap->sendsk; copy->recvsk = soap->recvsk; copy->recv_timeout = soap->recv_timeout; copy->send_timeout = soap->send_timeout; copy->os = soap->os; copy->is = soap->is; copy->sendfd = soap->sendfd; copy->recvfd = soap->recvfd; copy->bufidx = soap->bufidx; copy->buflen = soap->buflen; copy->ahead = soap->ahead; copy->cdata = soap->cdata; copy->chunksize = soap->chunksize; copy->chunkbuflen = soap->chunkbuflen; copy->keep_alive = soap->keep_alive; copy->tcp_keep_alive = soap->tcp_keep_alive; copy->tcp_keep_idle = soap->tcp_keep_idle; copy->tcp_keep_intvl = soap->tcp_keep_intvl; copy->tcp_keep_cnt = soap->tcp_keep_cnt; copy->max_keep_alive = soap->max_keep_alive; #ifndef WITH_NOIO copy->peer = soap->peer; copy->peerlen = soap->peerlen; copy->ip = soap->ip; copy->port = soap->port; soap_memcpy((void*)copy->host, sizeof(copy->host), (const void*)soap->host, sizeof(soap->host)); soap_memcpy((void*)copy->endpoint, sizeof(copy->endpoint), (const void*)soap->endpoint, sizeof(soap->endpoint)); #endif #ifdef WITH_OPENSSL copy->bio = soap->bio; copy->ctx = soap->ctx; copy->ssl = soap->ssl; #endif #ifdef WITH_GNUTLS copy->session = soap->session; #endif #ifdef WITH_SYSTEMSSL copy->ctx = soap->ctx; copy->ssl = soap->ssl; #endif #ifdef WITH_ZLIB copy->zlib_state = soap->zlib_state; copy->zlib_in = soap->zlib_in; copy->zlib_out = soap->zlib_out; if (soap->d_stream && soap->zlib_state != SOAP_ZLIB_NONE) { if (!copy->d_stream) copy->d_stream = (z_stream*)SOAP_MALLOC(copy, sizeof(z_stream)); if (copy->d_stream) soap_memcpy((void*)copy->d_stream, sizeof(z_stream), (const void*)soap->d_stream, sizeof(z_stream)); } copy->z_crc = soap->z_crc; copy->z_ratio_in = soap->z_ratio_in; copy->z_ratio_out = soap->z_ratio_out; copy->z_buf = NULL; copy->z_buflen = soap->z_buflen; copy->z_level = soap->z_level; if (soap->z_buf && soap->zlib_state != SOAP_ZLIB_NONE) { copy->z_buf = (char*)SOAP_MALLOC(copy, sizeof(soap->buf)); if (copy->z_buf) soap_memcpy((void*)copy->z_buf, sizeof(soap->buf), (const void*)soap->z_buf, sizeof(soap->buf)); } copy->z_dict = soap->z_dict; copy->z_dict_len = soap->z_dict_len; #endif soap_memcpy((void*)copy->buf, sizeof(copy->buf), (const void*)soap->buf, sizeof(soap->buf)); /* copy XML parser state */ soap_free_ns(copy); soap_set_local_namespaces(copy); copy->version = soap->version; if (soap->nlist && soap->local_namespaces) { struct soap_nlist *np = NULL, *nq; /* copy reversed nlist */ for (nq = soap->nlist; nq; nq = nq->next) { struct soap_nlist *nr = np; size_t n = sizeof(struct soap_nlist) + strlen(nq->id); np = (struct soap_nlist*)SOAP_MALLOC(copy, n); if (!np) break; soap_memcpy((void*)np, n, (const void*)nq, n); np->next = nr; } while (np) { const char *s = np->ns; copy->level = np->level; /* preserve element nesting level */ if (!s && np->index >= 0) { s = soap->local_namespaces[np->index].out; if (!s) s = soap->local_namespaces[np->index].ns; } if (s && soap_push_namespace(copy, np->id, s) == NULL) break; nq = np; np = np->next; SOAP_FREE(copy, nq); } } soap_memcpy((void*)copy->tag, sizeof(copy->tag), (const void*)soap->tag, sizeof(soap->tag)); soap_memcpy((void*)copy->id, sizeof(copy->id), (const void*)soap->id, sizeof(soap->id)); soap_memcpy((void*)copy->href, sizeof(copy->href), (const void*)soap->href, sizeof(soap->href)); soap_memcpy((void*)copy->type, sizeof(copy->type), (const void*)soap->type, sizeof(soap->type)); copy->other = soap->other; copy->root = soap->root; copy->null = soap->null; copy->body = soap->body; copy->part = soap->part; copy->mustUnderstand = soap->mustUnderstand; copy->level = soap->level; copy->peeked = soap->peeked; /* copy attributes */ for (tq = soap->attributes; tq; tq = tq->next) { struct soap_attribute *tr = tp; size_t n = sizeof(struct soap_attribute) + strlen(tq->name); tp = (struct soap_attribute*)SOAP_MALLOC(copy, n); soap_memcpy((void*)tp, n, (const void*)tq, n); if (tp->size) { tp->value = (char*)SOAP_MALLOC(copy, tp->size); if (tp->value) soap_memcpy((void*)tp->value, tp->size, (const void*)tq->value, tp->size); } tp->ns = NULL; tp->next = tr; } copy->attributes = tp; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_free_stream(struct soap *soap) { soap->socket = SOAP_INVALID_SOCKET; soap->sendsk = SOAP_INVALID_SOCKET; soap->recvsk = SOAP_INVALID_SOCKET; #ifdef WITH_OPENSSL soap->bio = NULL; soap->ctx = NULL; soap->ssl = NULL; #endif #ifdef WITH_GNUTLS soap->xcred = NULL; soap->acred = NULL; soap->cache = NULL; soap->session = NULL; soap->dh_params = NULL; soap->rsa_params = NULL; #endif #ifdef WITH_SYSTEMSSL soap->ctx = (gsk_handle)NULL; soap->ssl = (gsk_handle)NULL; #endif #ifdef WITH_ZLIB if (soap->z_buf) SOAP_FREE(soap, soap->z_buf); soap->z_buf = NULL; #endif } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_initialize(struct soap *soap) { soap_versioning(soap_init)(soap, SOAP_IO_DEFAULT, SOAP_IO_DEFAULT); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_versioning(soap_init)(struct soap *soap, soap_mode imode, soap_mode omode) { size_t i; soap->state = SOAP_INIT; #ifdef SOAP_MEM_DEBUG soap_init_mht(soap); #endif #if !defined(WITH_LEAN) || defined(SOAP_DEBUG) soap_init_logs(soap); #endif #ifdef SOAP_DEBUG #ifdef TANDEM_NONSTOP soap_set_test_logfile(soap, "TESTLOG"); soap_set_sent_logfile(soap, "SENTLOG"); soap_set_recv_logfile(soap, "RECVLOG"); #else soap_set_test_logfile(soap, "TEST.log"); soap_set_sent_logfile(soap, "SENT.log"); soap_set_recv_logfile(soap, "RECV.log"); #endif #endif soap->version = 0; soap_mode(soap, imode); soap_imode(soap, imode); soap_omode(soap, omode); soap->plugins = NULL; soap->user = NULL; for (i = 0; i < sizeof(soap->data)/sizeof(*soap->data); i++) soap->data[i] = NULL; soap->userid = NULL; soap->passwd = NULL; soap->authrealm = NULL; #ifdef WITH_NTLM soap->ntlm_challenge = NULL; #endif #ifndef WITH_NOHTTP soap->fpost = http_post; soap->fget = http_get; soap->fput = http_405; soap->fdel = http_405; soap->fopt = http_200; soap->fhead = http_200; soap->fform = NULL; soap->fposthdr = http_post_header; soap->fresponse = http_response; soap->fparse = http_parse; soap->fparsehdr = http_parse_header; #endif soap->fheader = NULL; soap->fconnect = NULL; soap->fdisconnect = NULL; #ifndef WITH_NOIO soap->ipv6_multicast_if = 0; /* in_addr_t value */ soap->ipv4_multicast_if = NULL; /* points to struct in_addr or in_addr_t */ soap->ipv4_multicast_ttl = 0; /* 0: use default */ #ifndef WITH_IPV6 soap->fresolve = tcp_gethost; #else soap->fresolve = NULL; #endif soap->faccept = tcp_accept; soap->fopen = tcp_connect; soap->fclose = tcp_disconnect; soap->fclosesocket = tcp_closesocket; soap->fshutdownsocket = tcp_shutdownsocket; soap->fsend = fsend; soap->frecv = frecv; soap->fpoll = soap_poll; #else soap->fopen = NULL; soap->fclose = NULL; soap->fpoll = NULL; #endif soap->fseterror = NULL; soap->fignore = NULL; soap->fserveloop = NULL; soap->fplugin = fplugin; soap->fmalloc = NULL; #ifndef WITH_LEANER soap->fsvalidate = NULL; soap->fwvalidate = NULL; soap->feltbegin = NULL; soap->feltendin = NULL; soap->feltbegout = NULL; soap->feltendout = NULL; soap->fprepareinitsend = NULL; soap->fprepareinitrecv = NULL; soap->fpreparesend = NULL; soap->fpreparerecv = NULL; soap->fpreparefinalsend = NULL; soap->fpreparefinalrecv = NULL; soap->ffiltersend = NULL; soap->ffilterrecv = NULL; soap->fdimereadopen = NULL; soap->fdimewriteopen = NULL; soap->fdimereadclose = NULL; soap->fdimewriteclose = NULL; soap->fdimeread = NULL; soap->fdimewrite = NULL; soap->fmimereadopen = NULL; soap->fmimewriteopen = NULL; soap->fmimereadclose = NULL; soap->fmimewriteclose = NULL; soap->fmimeread = NULL; soap->fmimewrite = NULL; #endif soap->float_format = "%.9G"; /* Alternative: use "%G" */ soap->double_format = "%.17lG"; /* Alternative: use "%lG" */ soap->long_double_format = NULL; /* Defined in custom serializer custom/long_double.c */ soap->dime_id_format = "cid:id%d"; /* default DIME id format for int id index */ soap->http_version = "1.1"; soap->proxy_http_version = "1.0"; soap->http_content = NULL; soap->actor = NULL; soap->lang = "en"; soap->keep_alive = 0; soap->tcp_keep_alive = 0; soap->tcp_keep_idle = 0; soap->tcp_keep_intvl = 0; soap->tcp_keep_cnt = 0; soap->max_keep_alive = SOAP_MAXKEEPALIVE; soap->recv_timeout = 0; soap->send_timeout = 0; soap->connect_timeout = 0; soap->accept_timeout = 0; soap->socket_flags = 0; soap->connect_flags = 0; soap->bind_flags = 0; soap->accept_flags = 0; soap->linger_time = 0; soap->ip = 0; soap->labbuf = NULL; soap->lablen = 0; soap->labidx = 0; soap->encodingStyle = NULL; #ifndef WITH_NONAMESPACES soap->namespaces = namespaces; #else soap->namespaces = NULL; #endif soap->local_namespaces = NULL; soap->nlist = NULL; soap->blist = NULL; soap->clist = NULL; soap->alist = NULL; soap->shaky = 0; soap->attributes = NULL; soap->header = NULL; soap->fault = NULL; soap->master = SOAP_INVALID_SOCKET; soap->socket = SOAP_INVALID_SOCKET; soap->sendsk = SOAP_INVALID_SOCKET; soap->recvsk = SOAP_INVALID_SOCKET; soap->os = NULL; soap->is = NULL; #ifndef WITH_LEANER soap->dom = NULL; soap->dime.list = NULL; soap->dime.first = NULL; soap->dime.last = NULL; soap->mime.list = NULL; soap->mime.first = NULL; soap->mime.last = NULL; soap->mime.boundary = NULL; soap->mime.start = NULL; soap->xlist = NULL; #endif #ifndef UNDER_CE soap->recvfd = 0; soap->sendfd = 1; #else soap->recvfd = stdin; soap->sendfd = stdout; #endif soap->host[0] = '\0'; soap->path[0] = '\0'; soap->port = 0; soap->action = NULL; soap->proxy_host = NULL; soap->proxy_port = 8080; soap->proxy_userid = NULL; soap->proxy_passwd = NULL; soap->prolog = "\n"; #ifdef WITH_ZLIB soap->zlib_state = SOAP_ZLIB_NONE; soap->zlib_in = SOAP_ZLIB_NONE; soap->zlib_out = SOAP_ZLIB_NONE; soap->d_stream = NULL; soap->z_buf = NULL; soap->z_level = 6; soap->z_dict = NULL; soap->z_dict_len = 0; #endif #ifndef WITH_LEAN soap->wsuid = NULL; soap->c14nexclude = NULL; soap->c14ninclude = NULL; soap->cookies = NULL; soap->cookie_domain = NULL; soap->cookie_path = NULL; soap->cookie_max = 32; #endif #ifdef WMW_RPM_IO soap->rpmreqid = NULL; #endif #ifdef PALM palmNetLibOpen(); #endif #ifndef WITH_NOIDREF soap_init_iht(soap); #endif soap_init_pht(soap); #ifdef WITH_OPENSSL if (!soap_ssl_init_done) soap_ssl_init(); soap->fsslauth = ssl_auth_init; soap->fsslverify = NULL; soap->bio = NULL; soap->ssl = NULL; soap->ctx = NULL; soap->session = NULL; soap->ssl_flags = SOAP_SSL_DEFAULT; soap->keyfile = NULL; soap->keyid = NULL; soap->password = NULL; soap->cafile = NULL; soap->capath = NULL; soap->crlfile = NULL; soap->dhfile = NULL; soap->randfile = NULL; #endif #ifdef WITH_GNUTLS if (!soap_ssl_init_done) soap_ssl_init(); soap->fsslauth = ssl_auth_init; soap->fsslverify = NULL; soap->xcred = NULL; soap->acred = NULL; soap->cache = NULL; soap->session = NULL; soap->ssl_flags = SOAP_SSL_DEFAULT; soap->keyfile = NULL; soap->keyid = NULL; soap->password = NULL; soap->cafile = NULL; soap->capath = NULL; soap->crlfile = NULL; soap->dh_params = NULL; soap->rsa_params = NULL; #endif #ifdef WITH_SYSTEMSSL soap->fsslauth = ssl_auth_init; soap->fsslverify = NULL; soap->bio = NULL; soap->ssl = (gsk_handle)NULL; soap->ctx = (gsk_handle)NULL; soap->session = NULL; soap->ssl_flags = SOAP_SSL_DEFAULT; soap->keyfile = NULL; soap->keyid = NULL; soap->password = NULL; soap->cafile = NULL; soap->capath = NULL; soap->crlfile = NULL; soap->dhfile = NULL; soap->randfile = NULL; #endif soap->c_locale = NULL; soap->buflen = 0; soap->bufidx = 0; #ifndef WITH_LEANER soap->dime.chunksize = 0; soap->dime.buflen = 0; #endif soap->null = 0; soap->position = 0; soap->encoding = 0; soap->mustUnderstand = 0; soap->ns = 0; soap->part = SOAP_END; soap->event = 0; soap->evlev = 0; soap->alloced = 0; soap->count = 0; soap->length = 0; soap->cdata = 0; soap->peeked = 0; soap->ahead = 0; soap->idnum = 0; soap->level = 0; soap->endpoint[0] = '\0'; soap->error = SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_begin(struct soap *soap) { if (soap_check_state(soap)) return; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Reinitializing context\n")); if (!soap->keep_alive) { soap->buflen = 0; soap->bufidx = 0; } soap->null = 0; soap->position = 0; soap->encoding = 0; soap->mustUnderstand = 0; soap->mode = 0; soap->ns = 0; soap->part = SOAP_END; soap->event = 0; soap->evlev = 0; soap->count = 0; soap->length = 0; soap->cdata = 0; soap->error = SOAP_OK; soap->peeked = 0; soap->ahead = 0; soap->idnum = 0; soap->level = 0; soap->endpoint[0] = '\0'; soap->encodingStyle = SOAP_STR_EOS; #ifndef WITH_LEANER soap->dime.chunksize = 0; soap->dime.buflen = 0; #endif soap_free_temp(soap); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_end(struct soap *soap) { if (soap_check_state(soap)) return; soap_free_temp(soap); soap_dealloc(soap, NULL); while (soap->clist) { struct soap_clist *cp = soap->clist->next; SOAP_FREE(soap, soap->clist); soap->clist = cp; } soap_closesock(soap); #ifdef SOAP_DEBUG soap_close_logfiles(soap); #endif #ifdef PALM palmNetLibClose(); #endif } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_set_version(struct soap *soap, short version) { soap_set_local_namespaces(soap); if (soap->version != version && soap->local_namespaces && soap->local_namespaces[0].id && soap->local_namespaces[1].id) { if (version == 1) { soap->local_namespaces[0].ns = soap_env1; soap->local_namespaces[1].ns = soap_enc1; } else if (version == 2) { soap->local_namespaces[0].ns = soap_env2; soap->local_namespaces[1].ns = soap_enc2; } soap->version = version; } if (version == 0) soap->encodingStyle = SOAP_STR_EOS; else soap->encodingStyle = NULL; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_get_version(struct soap *soap) { struct Namespace *p = soap->local_namespaces; if (p) { const char *ns = p[0].out; if (!ns) ns = p[0].ns; if (!strcmp(ns, soap_env1)) { soap->version = 1; /* make sure we use SOAP 1.1 */ if (p[1].out) SOAP_FREE(soap, p[1].out); if ((p[1].out = (char*)SOAP_MALLOC(soap, sizeof(soap_enc1)))) soap_strncpy(p[1].out, sizeof(soap_enc1), soap_enc1, sizeof(soap_enc1) - 1); } else if (!strcmp(ns, soap_env2)) { soap->version = 2; /* make sure we use SOAP 1.2 */ if (p[1].out) SOAP_FREE(soap, p[1].out); if ((p[1].out = (char*)SOAP_MALLOC(soap, sizeof(soap_enc2)))) soap_strncpy(p[1].out, sizeof(soap_enc2), soap_enc2, sizeof(soap_enc2) - 1); } } } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_set_namespaces(struct soap *soap, const struct Namespace *p) { struct Namespace *ns = soap->local_namespaces; struct soap_nlist *np, *nq, *nr; unsigned int level = soap->level; soap->namespaces = p; soap->local_namespaces = NULL; soap_set_local_namespaces(soap); /* reverse the namespace list */ np = soap->nlist; soap->nlist = NULL; if (np) { nq = np->next; np->next = NULL; while (nq) { nr = nq->next; nq->next = np; np = nq; nq = nr; } } /* then push on new stack */ while (np) { const char *s; soap->level = np->level; /* preserve element nesting level */ s = np->ns; if (!s && np->index >= 0 && ns) { s = ns[np->index].out; if (!s) s = ns[np->index].ns; } if (s && soap_push_namespace(soap, np->id, s) == NULL) return soap->error; nq = np; np = np->next; SOAP_FREE(soap, nq); } if (ns) { int i; for (i = 0; ns[i].id; i++) { if (ns[i].out) { SOAP_FREE(soap, ns[i].out); ns[i].out = NULL; } } SOAP_FREE(soap, ns); } soap->level = level; /* restore level */ return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_set_local_namespaces(struct soap *soap) { if (soap->namespaces && !soap->local_namespaces) { const struct Namespace *ns1; struct Namespace *ns2; size_t n = 1; for (ns1 = soap->namespaces; ns1->id; ns1++) n++; n *= sizeof(struct Namespace); ns2 = (struct Namespace*)SOAP_MALLOC(soap, n); if (ns2) { soap_memcpy((void*)ns2, n, (const void*)soap->namespaces, n); if (ns2[0].ns) { if (!strcmp(ns2[0].ns, soap_env1)) soap->version = 1; else if (!strcmp(ns2[0].ns, soap_env2)) soap->version = 2; } soap->local_namespaces = ns2; for (; ns2->id; ns2++) ns2->out = NULL; } } } #endif /******************************************************************************/ #ifndef WITH_LEAN #ifndef PALM_1 SOAP_FMAC1 const char * SOAP_FMAC2 soap_tagsearch(const char *big, const char *little) { if (big && little) { size_t n = strlen(little); const char *s = big; while (s) { const char *t = s; size_t i; for (i = 0; i < n; i++, t++) { if (*t != little[i]) break; } if (*t == '\0' || *t == ' ') { if (i == n || (i && little[i-1] == ':')) return s; } s = strchr(t, ' '); if (s) s++; } } return NULL; } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 struct soap_nlist * SOAP_FMAC2 soap_lookup_ns(struct soap *soap, const char *tag, size_t n) { struct soap_nlist *np; for (np = soap->nlist; np; np = np->next) if (!strncmp(np->id, tag, n) && !np->id[n]) return np; return NULL; } #endif /******************************************************************************/ #ifndef WITH_LEAN static struct soap_nlist * soap_push_ns(struct soap *soap, const char *id, const char *ns, short utilized) { struct soap_nlist *np; size_t n, k; if (soap_tagsearch(soap->c14nexclude, id)) return NULL; if (!utilized) { for (np = soap->nlist; np; np = np->next) { if (!strcmp(np->id, id) && (!np->ns || !strcmp(np->ns, ns))) break; } if (np) { if ((np->level < soap->level || !np->ns) && np->index == 1) utilized = 1; else return NULL; } } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Adding namespace binding (level=%u) '%s' '%s' utilized=%d\n", soap->level, id, ns ? ns : "(null)", utilized)); n = strlen(id); if (ns) k = strlen(ns); else k = 0; np = (struct soap_nlist*)SOAP_MALLOC(soap, sizeof(struct soap_nlist) + n + k + 1); if (!np) { soap->error = SOAP_EOM; return NULL; } np->next = soap->nlist; soap->nlist = np; soap_strcpy((char*)np->id, n + 1, id); if (ns) { np->ns = np->id + n + 1; soap_strcpy((char*)np->ns, k + 1, ns); } else np->ns = NULL; np->level = soap->level; np->index = utilized; return np; } #endif /******************************************************************************/ #ifndef WITH_LEAN static void soap_utilize_ns(struct soap *soap, const char *tag) { struct soap_nlist *np; size_t n = 0; const char *t = strchr(tag, ':'); if (t) n = t - tag; np = soap_lookup_ns(soap, tag, n); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Utilizing namespace of '%s'\n", tag)); if (np) { if (np->index <= 0) { if (np->level == soap->level) np->index = 1; else soap_push_ns(soap, np->id, np->ns, 1); } } else if (n && strncmp(tag, "xml", 3)) { soap_strncpy(soap->tmpbuf, sizeof(soap->tmpbuf), tag, n); soap_push_ns(soap, soap->tmpbuf, NULL, 1); } } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_element(struct soap *soap, const char *tag, int id, const char *type) { #ifndef WITH_LEAN const char *s; #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element begin tag='%s' level='%u' id='%d' type='%s'\n", tag, soap->level, id, type ? type : SOAP_STR_EOS)); soap->level++; #ifdef WITH_DOM #ifndef WITH_LEAN if (soap_tagsearch(soap->wsuid, tag)) { size_t i; for (s = tag, i = 0; *s && i < sizeof(soap->tag) - 1; s++, i++) soap->tag[i] = *s == ':' ? '-' : *s; soap->tag[i] = '\0'; if (soap_set_attr(soap, "wsu:Id", soap->tag, 1)) return soap->error; } if ((soap->mode & SOAP_XML_CANONICAL) && !(soap->mode & SOAP_DOM_ASIS)) { if (soap->evlev >= soap->level) soap->evlev = 0; if (soap->event == SOAP_SEC_BEGIN && !soap->evlev) { struct soap_nlist *np; /* non-nested wsu:Id found: clear xmlns, re-emit them for exc-c14n */ for (np = soap->nlist; np; np = np->next) { int p = soap_tagsearch(soap->c14ninclude, np->id) != NULL; if (np->index == 2 || p) { struct soap_nlist *np1 = soap_push_ns(soap, np->id, np->ns, 1); if (np1 && !p) np1->index = 0; } } soap->evlev = soap->level; } } #endif if (soap->mode & SOAP_XML_DOM) { struct soap_dom_element *elt = (struct soap_dom_element*)soap_malloc(soap, sizeof(struct soap_dom_element)); if (!elt) return soap->error; elt->soap = soap; elt->next = NULL; elt->prnt = soap->dom; elt->elts = NULL; elt->atts = NULL; elt->nstr = NULL; elt->name = soap_strdup(soap, tag); elt->lead = NULL; elt->text = NULL; elt->code = NULL; elt->tail = NULL; elt->node = NULL; elt->type = 0; if (soap->dom) { struct soap_dom_element *p = soap->dom->elts; if (p) { while (p->next) p = p->next; p->next = elt; } else soap->dom->elts = elt; } soap->dom = elt; } else { #endif #ifndef WITH_LEAN if (!soap->ns) { if (!(soap->mode & SOAP_XML_CANONICAL) && soap_send(soap, soap->prolog)) return soap->error; } else if (soap->mode & SOAP_XML_INDENT) { if (soap->ns == 1 && soap_send_raw(soap, soap_indent, soap->level < sizeof(soap_indent) ? soap->level : sizeof(soap_indent) - 1)) return soap->error; soap->body = 1; } if ((soap->mode & SOAP_XML_DEFAULTNS)) { struct Namespace *ns = soap->local_namespaces; size_t n = 0; s = strchr(tag, ':'); if (s) n = s++ - tag; else s = tag; if (soap_send_raw(soap, "<", 1) || soap_send(soap, s)) return soap->error; if (n) { if (soap->nlist && !strncmp(soap->nlist->id, tag, n) && !soap->nlist->id[n]) ns = NULL; for (; ns && ns->id; ns++) { if (*ns->id && ns->ns && !strncmp(ns->id, tag, n) && !ns->id[n]) { soap_push_ns(soap, ns->id, ns->out ? ns->out : ns->ns, 0); if (soap_attribute(soap, "xmlns", ns->out ? ns->out : ns->ns)) return soap->error; break; } } } else if (!soap->nlist || *soap->nlist->id) { soap_push_ns(soap, "", "", 0); if (soap_attribute(soap, "xmlns", "")) return soap->error; } } else #endif if (soap_send_raw(soap, "<", 1) || soap_send(soap, tag)) return soap->error; #ifdef WITH_DOM } #endif if (!soap->ns) { struct Namespace *ns = soap->local_namespaces; int k = -1; if (ns) { #ifndef WITH_LEAN if ((soap->mode & SOAP_XML_DEFAULTNS)) { if (soap->version) k = 4; /* first four required entries */ else if (!(soap->mode & SOAP_XML_NOTYPE) || (soap->mode & SOAP_XML_NIL)) { ns += 2; k = 2; /* next two entries */ } else k = 0; /* no entries */ } #endif while (k-- && ns->id) { const char *t = ns->out; if (!t) t = ns->ns; if (*ns->id && t && *t) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), strlen(ns->id) + 6), "xmlns:%s", ns->id); if (soap_attribute(soap, soap->tmpbuf, t)) return soap->error; } ns++; } } } soap->ns = 1; /* namespace table control: ns = 0 or 2 to start, then 1 to stop dumping the table */ #ifndef WITH_LEAN if ((soap->mode & SOAP_XML_CANONICAL)) soap_utilize_ns(soap, tag); #endif if (id > 0) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), sizeof(SOAP_BASEREFNAME) + 20), SOAP_BASEREFNAME "%d", id); if (soap->version == 2) { if (soap_attribute(soap, "SOAP-ENC:id", soap->tmpbuf)) return soap->error; } else if (soap_attribute(soap, "id", soap->tmpbuf)) return soap->error; } if (type && *type && !(soap->mode & SOAP_XML_NOTYPE) && soap->part != SOAP_IN_HEADER) { const char *t = type; #ifndef WITH_LEAN if (soap->mode & SOAP_XML_DEFAULTNS) { t = strchr(type, ':'); if (t) t++; else t = type; } else if ((soap->mode & SOAP_XML_CANONICAL)) soap_utilize_ns(soap, type); #endif if (soap->attributes ? soap_set_attr(soap, "xsi:type", t, 1) : soap_attribute(soap, "xsi:type", t)) return soap->error; } if (soap->null && soap->position > 0 && soap->version == 1) { int i; (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf) - 1, 20), "[%d", soap->positions[0]); for (i = 1; i < soap->position; i++) { size_t l = strlen(soap->tmpbuf); (SOAP_SNPRINTF(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l - 1, 20), ",%d", soap->positions[i]); } soap_strncat(soap->tmpbuf, sizeof(soap->tmpbuf), "]", 1); if (soap_attribute(soap, "SOAP-ENC:position", soap->tmpbuf)) return soap->error; } if (soap->mustUnderstand) { if (soap->actor && *soap->actor) { if (soap_attribute(soap, soap->version == 2 ? "SOAP-ENV:role" : "SOAP-ENV:actor", soap->actor)) return soap->error; } if (soap_attribute(soap, "SOAP-ENV:mustUnderstand", soap->version == 2 ? "true" : "1")) return soap->error; soap->mustUnderstand = 0; } if (soap->encoding) { if (soap->encodingStyle && soap->local_namespaces && soap->local_namespaces[0].id && soap->local_namespaces[1].id) { if (!*soap->encodingStyle) { if (soap->local_namespaces[1].out) soap->encodingStyle = soap->local_namespaces[1].out; else soap->encodingStyle = soap->local_namespaces[1].ns; } if (soap->encodingStyle && soap_attribute(soap, "SOAP-ENV:encodingStyle", soap->encodingStyle)) return soap->error; } else soap->encodingStyle = NULL; soap->encoding = 0; } soap->null = 0; soap->position = 0; if (soap->event == SOAP_SEC_BEGIN) soap->event = 0; return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_element_begin_out(struct soap *soap, const char *tag, int id, const char *type) { if (*tag == '-') return SOAP_OK; if (soap_element(soap, tag, id, type)) return soap->error; #ifdef WITH_DOM if (soap_element_start_end_out(soap, NULL)) return soap->error; if (soap->feltbegout) return soap->error = soap->feltbegout(soap, tag); return SOAP_OK; #else return soap_element_start_end_out(soap, NULL); #endif } #endif /******************************************************************************/ #ifndef PALM_2 #ifndef HAVE_STRRCHR SOAP_FMAC1 char* SOAP_FMAC2 soap_strrchr(const char *s, int t) { char *r = NULL; while (*s) if (*s++ == t) r = (char*)s - 1; return r; } #endif #endif /******************************************************************************/ #ifndef PALM_2 #ifndef HAVE_STRTOL SOAP_FMAC1 long SOAP_FMAC2 soap_strtol(const char *s, char **t, int b) { long n = 0; int c; while (*s > 0 && *s <= 32) s++; if (b == 10) { short neg = 0; if (*s == '-') { s++; neg = 1; } else if (*s == '+') s++; while ((c = *s) && c >= '0' && c <= '9') { if (n >= 214748364 && (n > 214748364 || c >= '8')) { if (neg && n == 214748364 && c == '8') { if (t) *t = (char*)(s + 1); return -2147483648; } break; } n *= 10; n += c - '0'; s++; } if (neg) n = -n; } else /* assume b == 16 and value is always positive */ { while ((c = *s)) { if (c >= '0' && c <= '9') c -= '0'; else if (c >= 'A' && c <= 'F') c -= 'A' - 10; else if (c >= 'a' && c <= 'f') c -= 'a' - 10; if (n > 0x07FFFFFF) break; n <<= 4; n += c; s++; } } if (t) *t = (char*)s; return n; } #endif #endif /******************************************************************************/ #ifndef PALM_2 #ifndef HAVE_STRTOUL SOAP_FMAC1 unsigned long SOAP_FMAC2 soap_strtoul(const char *s, char **t, int b) { unsigned long n = 0; int c; while (*s > 0 && *s <= 32) s++; if (b == 10) { if (*s == '+') s++; while ((c = *s) && c >= '0' && c <= '9') { if (n >= 429496729 && (n > 429496729 || c >= '6')) break; n *= 10; n += c - '0'; s++; } } else /* b == 16 */ { while ((c = *s)) { if (c >= '0' && c <= '9') c -= '0'; else if (c >= 'A' && c <= 'F') c -= 'A' - 10; else if (c >= 'a' && c <= 'f') c -= 'a' - 10; if (n > 0x0FFFFFFF) break; n <<= 4; n += c; s++; } } if (t) *t = (char*)s; return n; } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_array_begin_out(struct soap *soap, const char *tag, int id, const char *type, const char *offset) { if (!type || !*type || soap->version == 0) return soap_element_begin_out(soap, tag, id, NULL); if (soap_element(soap, tag, id, NULL)) return soap->error; if (soap->version == 1) { if (offset && soap_attribute(soap, "SOAP-ENC:offset", offset)) return soap->error; if (soap_attribute(soap, "SOAP-ENC:arrayType", type)) return soap->error; } else { const char *s; s = soap_strrchr(type, '['); if (s && (size_t)(s - type) < sizeof(soap->tmpbuf)) { soap_strncpy(soap->tmpbuf, sizeof(soap->tmpbuf), type, s - type); if (soap_attribute(soap, "SOAP-ENC:itemType", soap->tmpbuf)) return soap->error; s++; if (*s) { soap_strcpy(soap->tmpbuf, sizeof(soap->tmpbuf), s); soap->tmpbuf[strlen(soap->tmpbuf) - 1] = '\0'; if (soap_attribute(soap, "SOAP-ENC:arraySize", soap->tmpbuf)) return soap->error; } } } #ifndef WITH_LEAN if ((soap->mode & SOAP_XML_CANONICAL)) soap_utilize_ns(soap, type); #endif return soap_element_start_end_out(soap, NULL); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_element_start_end_out(struct soap *soap, const char *tag) { struct soap_attribute *tp; #ifndef WITH_LEAN if ((soap->mode & SOAP_XML_CANONICAL)) { struct soap_nlist *np; for (tp = soap->attributes; tp; tp = tp->next) { if (tp->visible && *tp->name) soap_utilize_ns(soap, tp->name); } for (np = soap->nlist; np; np = np->next) { if (np->ns && (np->index == 1 || (np->index == 0 && soap->event == SOAP_SEC_BEGIN && soap_tagsearch(soap->c14ninclude, np->id)))) { if (*(np->id)) (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), strlen(np->id) + 6), "xmlns:%s", np->id); else soap_strcpy(soap->tmpbuf, sizeof(soap->tmpbuf), "xmlns"); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Enabling utilized binding (level=%u) %s='%s' c14ninclude='%s'\n", np->level, soap->tmpbuf, np->ns, soap->c14ninclude ? soap->c14ninclude : "(null)")); soap_set_attr(soap, soap->tmpbuf, np->ns, 1); np->index = 2; } else { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Binding (level=%u) %s='%s' utilized=%d\n", np->level, np->id, np->ns, np->index)); } } } #endif #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { struct soap_dom_attribute **att; att = &soap->dom->atts; for (tp = soap->attributes; tp; tp = tp->next) { if (tp->visible) { *att = (struct soap_dom_attribute*)soap_malloc(soap, sizeof(struct soap_dom_attribute)); if (!*att) return soap->error; (*att)->next = NULL; (*att)->nstr = NULL; (*att)->name = soap_strdup(soap, tp->name); (*att)->text = soap_strdup(soap, tp->value); (*att)->soap = soap; att = &(*att)->next; tp->visible = 0; } } return SOAP_OK; } #endif for (tp = soap->attributes; tp; tp = tp->next) { if (tp->visible) { #ifndef WITH_LEAN const char *s; if ((soap->mode & SOAP_XML_DEFAULTNS) && (s = strchr(tp->name, ':'))) { size_t n = s - tp->name; if (soap->nlist && !strncmp(soap->nlist->id, tp->name, n) && !soap->nlist->id[n]) s++; else s = tp->name; if (soap_send_raw(soap, " ", 1) || soap_send(soap, s)) return soap->error; } else #endif if (soap_send_raw(soap, " ", 1) || soap_send(soap, tp->name)) return soap->error; if (tp->visible == 2 && tp->value) { if (soap_send_raw(soap, "=\"", 2) || soap_string_out(soap, tp->value, tp->flag) || soap_send_raw(soap, "\"", 1)) return soap->error; } else if (soap->mode & SOAP_XML_STRICT) { if (soap_send_raw(soap, "=\"\"", 3)) return soap->error; } tp->visible = 0; } } if (tag) { #ifndef WITH_LEAN if ((soap->mode & SOAP_XML_CANONICAL)) { if (soap_send_raw(soap, ">", 1) || soap_element_end_out(soap, tag)) return soap->error; return SOAP_OK; } #endif if (soap->nlist) soap_pop_namespace(soap); soap->level--; /* decrement level just before /> */ soap->body = 0; return soap_send_raw(soap, "/>", 2); } return soap_send_raw(soap, ">", 1); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_element_end_out(struct soap *soap, const char *tag) { #ifndef WITH_LEAN const char *s; #endif if (*tag == '-') return SOAP_OK; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element ending tag='%s'\n", tag)); #ifdef WITH_DOM if (soap->feltendout && (soap->error = soap->feltendout(soap, tag))) return soap->error; if ((soap->mode & SOAP_XML_DOM) && soap->dom) { if (soap->dom->prnt) soap->dom = soap->dom->prnt; return SOAP_OK; } #endif #ifndef WITH_LEAN if (soap->nlist) soap_pop_namespace(soap); if (soap->mode & SOAP_XML_INDENT) { if (!soap->body) { if (soap_send_raw(soap, soap_indent, soap->level < sizeof(soap_indent) ? soap->level : sizeof(soap_indent) - 1)) return soap->error; } soap->body = 0; } if ((soap->mode & SOAP_XML_DEFAULTNS) && (s = strchr(tag, ':'))) tag = s + 1; #endif if (soap_send_raw(soap, "error; soap->level--; /* decrement level just before > */ return soap_send_raw(soap, ">", 1); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_element_ref(struct soap *soap, const char *tag, int id, int href) { const char *s = "ref"; int n = 1; if (soap->version == 1) { s = "href"; n = 0; } else if (soap->version == 2) s = "SOAP-ENC:ref"; (SOAP_SNPRINTF(soap->href, sizeof(soap->href), sizeof(SOAP_BASEREFNAME) + 21), "#" SOAP_BASEREFNAME "%d", href); return soap_element_href(soap, tag, id, s, soap->href + n); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_element_href(struct soap *soap, const char *tag, int id, const char *ref, const char *val) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element '%s' reference %s='%s'\n", tag, ref, val)); if (soap_element(soap, tag, id, NULL) || soap_attribute(soap, ref, val) || soap_element_start_end_out(soap, tag)) return soap->error; soap->body = 0; return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_element_null(struct soap *soap, const char *tag, int id, const char *type) { struct soap_attribute *tp = NULL; for (tp = soap->attributes; tp; tp = tp->next) if (tp->visible) break; if (tp || (soap->version == 2 && soap->position > 0) || id > 0 || (soap->mode & SOAP_XML_NIL)) { if (soap_element(soap, tag, id, type) || (!tp && soap_attribute(soap, "xsi:nil", "true")) || soap_element_start_end_out(soap, tag)) return soap->error; soap->body = 0; } else { soap->null = 1; soap->position = 0; soap->mustUnderstand = 0; } return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_element_nil(struct soap *soap, const char *tag) { if (soap_element(soap, tag, -1, NULL) || (soap_attribute(soap, "xsi:nil", "true"))) return soap->error; return soap_element_start_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_element_id(struct soap *soap, const char *tag, int id, const void *p, const void *a, int n, const char *type, int t, char **mark) { (void)a; (void)n; if (!p) { soap->error = soap_element_null(soap, tag, id, type); return -1; } #ifndef WITH_NOIDREF DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element_id %p type=%d id=%d\n", p, t, id)); if ((!soap->encodingStyle && !(soap->omode & SOAP_XML_GRAPH)) || (soap->omode & SOAP_XML_TREE)) return soap_check_and_mark(soap, p, t, mark); if (mark) *mark = NULL; if (id < -1) return soap_embed(soap, p, a, n, t); else if (id <= 0) { struct soap_plist *pp; if (a) id = soap_array_pointer_lookup(soap, p, a, n, t, &pp); else id = soap_pointer_lookup(soap, p, t, &pp); if (id) { if (soap_is_embedded(soap, pp)) { soap_element_ref(soap, tag, 0, id); return -1; } if (soap_is_single(soap, pp)) return 0; soap_set_embedded(soap, pp); } } return id; #else return soap_check_and_mark(soap, p, t, mark); #endif } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_check_and_mark(struct soap *soap, const void *p, int t, char **mark) { if (mark) { struct soap_plist *pp; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Check %p and mark %p\n", p, mark)); if (!soap_pointer_lookup(soap, p, t, &pp)) if (!soap_pointer_enter(soap, p, NULL, 0, t, &pp)) return -1; if (soap->mode & SOAP_IO_LENGTH) { if (pp->mark1 > 0) return -1; pp->mark1 = 1; *mark = &pp->mark1; } else { if (pp->mark2 > 0) return -1; pp->mark2 = 1; *mark = &pp->mark2; } } return 0; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void * SOAP_FMAC2 soap_mark_lookup(struct soap *soap, const void *p, int t, struct soap_plist **ppp, char **mark) { if (!soap) return NULL; if (mark || !(soap->mode & SOAP_XML_TREE)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Mark lookup %p type %d\n", p, t)); if (!soap_pointer_lookup(soap, p, t, ppp)) { if (!soap_pointer_enter(soap, p, NULL, 0, t, ppp)) return NULL; } else if (!(soap->mode & SOAP_XML_TREE)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Mark found %p\n", (*ppp)->dup)); return (*ppp)->dup; } if (mark) { if ((*ppp)->mark1 > 0) (*ppp)->mark1 = 2; /* cycle */ else (*ppp)->mark1 = 1; /* cycle detection */ *mark = &(*ppp)->mark1; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Mark cycle %d\n", (*ppp)->mark1)); } } return NULL; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_mark_cycle(struct soap *soap, struct soap_plist *pp) { (void)soap; return pp && pp->mark1 == 2 && (soap->mode & SOAP_XML_TREE); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_mark_dup(struct soap *soap, void *a, struct soap_plist *pp) { (void)soap; if (pp) pp->dup = a; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_unmark(struct soap *soap, char *mark) { (void)soap; if (mark) *mark = 0; /* release detection */ } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_element_result(struct soap *soap, const char *tag) { if (soap->version == 2 && soap->encodingStyle) { if (soap_element(soap, "SOAP-RPC:result", 0, NULL) || soap_attribute(soap, "xmlns:SOAP-RPC", soap_rpc) || soap_element_start_end_out(soap, NULL) || soap_string_out(soap, tag, 0) || soap_element_end_out(soap, "SOAP-RPC:result")) return soap->error; } return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_check_result(struct soap *soap, const char *tag) { (void)tag; if (soap->version == 2 && soap->encodingStyle) { soap_instring(soap, ":result", NULL, NULL, 0, 2, -1, -1, NULL); /* just ignore content for compliance reasons, but should compare tag to element's QName value? */ } } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_attribute(struct soap *soap, const char *name, const char *value) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Attribute '%s'='%s'\n", name, value)); #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && !(soap->mode & SOAP_XML_CANONICAL) && soap->dom) { struct soap_dom_attribute *a = (struct soap_dom_attribute*)soap_malloc(soap, sizeof(struct soap_dom_attribute)); if (!a) return soap->error; a->next = soap->dom->atts; a->nstr = NULL; a->name = soap_strdup(soap, name); a->text = soap_strdup(soap, value); a->soap = soap; soap->dom->atts = a; return SOAP_OK; } #endif #ifndef WITH_LEAN if ((soap->mode & SOAP_XML_CANONICAL)) { /* push namespace */ if (!strncmp(name, "xmlns", 5) && (name[5] == ':' || name[5] == '\0')) soap_push_ns(soap, name + 5 + (name[5] == ':'), value, 0); else if (soap_set_attr(soap, name, value, 1)) return soap->error; } else #endif { if (soap_send_raw(soap, " ", 1) || soap_send(soap, name)) return soap->error; if (value) if (soap_send_raw(soap, "=\"", 2) || soap_string_out(soap, value, 1) || soap_send_raw(soap, "\"", 1)) return soap->error; } return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_element_begin_in(struct soap *soap, const char *tag, int nillable, const char *type) { if (!soap_peek_element(soap)) { if (soap->other) return soap->error = SOAP_TAG_MISMATCH; if (tag && *tag == '-') return SOAP_OK; if (!(soap->error = soap_match_tag(soap, soap->tag, tag))) { soap->peeked = 0; if (type && *soap->type && soap_match_tag(soap, soap->type, type)) return soap->error = SOAP_TYPE; if (!nillable && soap->null && (soap->mode & SOAP_XML_STRICT)) return soap->error = SOAP_NULL; if (soap->body) soap->level++; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Begin tag found (level=%u) '%s'='%s'\n", soap->level, soap->tag, tag ? tag : SOAP_STR_EOS )); soap->error = SOAP_OK; } } else if (soap->error == SOAP_NO_TAG && tag && *tag == '-') soap->error = SOAP_OK; return soap->error; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_element_end_in(struct soap *soap, const char *tag) { soap_wchar c; char *s; int n = 0; if (tag && *tag == '-') return SOAP_OK; if (soap->error == SOAP_NO_TAG) soap->error = SOAP_OK; #ifdef WITH_DOM /* this whitespace or mixed content is significant for DOM as-is */ if ((soap->mode & SOAP_XML_DOM) && soap->dom) { if (!soap->peeked && !soap_string_in(soap, -1, -1, -1, NULL)) return soap->error; if (soap->dom->prnt) soap->dom = soap->dom->prnt; } #endif if (soap->peeked) { if (*soap->tag) n++; soap->peeked = 0; } do { while (((c = soap_get(soap)) != SOAP_TT)) { if ((int)c == EOF) return soap->error = SOAP_CHK_EOF; if (c == SOAP_LT) n++; else if (c == '/') { c = soap_get(soap); if (c == SOAP_GT) n--; else soap_unget(soap, c); } } } while (n--); s = soap->tag; n = sizeof(soap->tag); while (soap_notblank(c = soap_get(soap))) { if (--n > 0) *s++ = (char)c; } *s = '\0'; if ((int)c == EOF) return soap->error = SOAP_CHK_EOF; while (soap_blank(c)) c = soap_get(soap); if (c != SOAP_GT) return soap->error = SOAP_SYNTAX_ERROR; #ifndef WITH_LEAN #ifdef WITH_DOM if (soap->feltendin) { soap->level--; return soap->error = soap->feltendin(soap, soap->tag, tag); } #endif if (tag && (soap->mode & SOAP_XML_STRICT)) { soap_pop_namespace(soap); if (soap_match_tag(soap, soap->tag, tag)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End tag '%s' does not match '%s'\n", soap->tag, tag ? tag : SOAP_STR_EOS)); return soap->error = SOAP_SYNTAX_ERROR; } } #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End tag found (level=%u) '%s'='%s'\n", soap->level, soap->tag, tag ? tag : SOAP_STR_EOS)); soap->level--; return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char * SOAP_FMAC2 soap_attr_value(struct soap *soap, const char *name, int flag) { struct soap_attribute *tp; if (*name == '-') return SOAP_STR_EOS; for (tp = soap->attributes; tp; tp = tp->next) { if (!soap_match_tag(soap, tp->name, name)) break; } if (tp && tp->visible == 2) { if (flag == 4 || (flag == 2 && (soap->mode & SOAP_XML_STRICT))) soap->error = SOAP_PROHIBITED; else return tp->value; } else if (flag == 3 || (flag == 1 && (soap->mode & SOAP_XML_STRICT))) soap->error = SOAP_REQUIRED; else soap->error = SOAP_OK; return NULL; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_set_attr(struct soap *soap, const char *name, const char *value, int flag) { struct soap_attribute *tp, *tq; if (*name == '-') return SOAP_OK; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Set attribute %s='%s'\n", name, value ? value : SOAP_STR_EOS)); tq = NULL; for (tp = soap->attributes; tp; tq = tp, tp = tp->next) { if (!strcmp(tp->name, name)) break; } if (!tp) { size_t l = strlen(name); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Allocate attribute %s\n", name)); if (!(tp = (struct soap_attribute*)SOAP_MALLOC(soap, sizeof(struct soap_attribute) + l))) return soap->error = SOAP_EOM; tp->ns = NULL; #ifndef WITH_LEAN if ((soap->mode & SOAP_XML_CANONICAL)) { struct soap_attribute **tpp = &soap->attributes; const char *s = strchr(name, ':'); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inserting attribute %s for c14n\n", name)); if (!strncmp(name, "xmlns", 5)) { for (; *tpp; tpp = &(*tpp)->next) if (strncmp((*tpp)->name, "xmlns", 5) || strcmp((*tpp)->name + 5, name + 5) > 0) break; } else if (!s) { for (; *tpp; tpp = &(*tpp)->next) if (strncmp((*tpp)->name, "xmlns", 5) && ((*tpp)->ns || strcmp((*tpp)->name, name) > 0)) break; } else { struct soap_nlist *np = soap_lookup_ns(soap, name, s - name); if (np) tp->ns = np->ns; else { struct soap_attribute *tq; for (tq = soap->attributes; tq; tq = tq->next) { if (!strncmp(tq->name, "xmlns:", 6) && !strncmp(tq->name + 6, name, s - name) && !tq->name[6 + s - name]) { tp->ns = tq->ns; break; } } } for (; *tpp; tpp = &(*tpp)->next) { int k; if (strncmp((*tpp)->name, "xmlns", 5) && (*tpp)->ns && tp->ns && ((k = strcmp((*tpp)->ns, tp->ns)) > 0 || (!k && strcmp((*tpp)->name, name) > 0))) break; } } tp->next = *tpp; *tpp = tp; } else #endif if (tq) { tq->next = tp; tp->next = NULL; } else { tp->next = soap->attributes; soap->attributes = tp; } soap_strcpy((char*)tp->name, l + 1, name); tp->value = NULL; } else if (tp->visible) { return SOAP_OK; } else if (value && tp->value && tp->size <= strlen(value)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free attribute value of %s (free %p)\n", name, tp->value)); SOAP_FREE(soap, tp->value); tp->value = NULL; tp->ns = NULL; } if (value) { if (!tp->value) { tp->size = strlen(value) + 1; if (!(tp->value = (char*)SOAP_MALLOC(soap, tp->size))) return soap->error = SOAP_EOM; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Allocate attribute value for %s (%p)\n", tp->name, tp->value)); } soap_strcpy(tp->value, tp->size, value); if (!strncmp(tp->name, "xmlns:", 6)) tp->ns = tp->value; tp->visible = 2; tp->flag = (short)flag; #ifndef WITH_LEAN if (!strcmp(name, "wsu:Id")) { soap->event = SOAP_SEC_BEGIN; soap_strcpy(soap->id, sizeof(soap->id), value); } if ((soap->mode & SOAP_XML_CANONICAL)) { const char *s = strchr(name, ':'); if (s) /* should also check default namespace when 'type' is not qualified? */ { struct soap_nlist *np = soap_lookup_ns(soap, name, s - name); if (np && np->ns && soap->local_namespaces) { if ((!strcmp(s + 1, "type") && !strcmp(np->ns, soap->local_namespaces[2].ns)) /* xsi:type QName */ || ((!strcmp(s + 1, "arrayType") || !strcmp(s + 1, "itemType")) && !strcmp(np->ns, soap->local_namespaces[1].ns))) /* SOAP-ENC:arrayType and SOAP-ENC:itemType QName */ soap_utilize_ns(soap, value); } } } #endif } else tp->visible = 1; return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_clr_attr(struct soap *soap) { struct soap_attribute *tp; #ifndef WITH_LEAN if ((soap->mode & SOAP_XML_CANONICAL)) { while (soap->attributes) { tp = soap->attributes->next; if (soap->attributes->value) SOAP_FREE(soap, soap->attributes->value); SOAP_FREE(soap, soap->attributes); soap->attributes = tp; } } else #endif { for (tp = soap->attributes; tp; tp = tp->next) tp->visible = 0; } } #endif /******************************************************************************/ #ifndef PALM_2 static int soap_getattrval(struct soap *soap, char *s, size_t *n, soap_wchar d) { char buf[8]; size_t i; size_t k = *n; size_t m = 0; char *t = buf; for (i = 0; i < k; i++) { soap_wchar c; if (m) { *s++ = *t++; m--; continue; } if ((soap->mode & SOAP_C_UTFSTRING)) { if (((c = soap_get(soap)) & 0x80000000) && c >= -0x7FFFFF80 && c < SOAP_AP) { t = buf; c &= 0x7FFFFFFF; if (c < 0x0800) *t++ = (char)(0xC0 | ((c >> 6) & 0x1F)); else { if (c < 0x010000) *t++ = (char)(0xE0 | ((c >> 12) & 0x0F)); else { if (c < 0x200000) *t++ = (char)(0xF0 | ((c >> 18) & 0x07)); else { if (c < 0x04000000) *t++ = (char)(0xF8 | ((c >> 24) & 0x03)); else { *t++ = (char)(0xFC | ((c >> 30) & 0x01)); *t++ = (char)(0x80 | ((c >> 24) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 18) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 12) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 6) & 0x3F)); } *t++ = (char)(0x80 | (c & 0x3F)); m = t - buf - 1; if (i + m >= k) { soap_unget(soap, c | 0x80000000); *n = i; return soap->error = SOAP_EOM; } t = buf; *s++ = *t++; continue; } } else c = soap_getutf8(soap); switch (c) { case SOAP_TT: *s++ = '<'; soap_unget(soap, '/'); break; case SOAP_LT: *s++ = '<'; break; case SOAP_GT: if (d == ' ') { soap_unget(soap, c); *s = '\0'; *n = i + 1; return SOAP_OK; } *s++ = '>'; break; case SOAP_QT: if (c == d) { *s = '\0'; *n = i + 1; return SOAP_OK; } *s++ = '"'; break; case SOAP_AP: if (c == d) { *s = '\0'; *n = i + 1; return SOAP_OK; } *s++ = '\''; break; case '\t': case '\n': case '\r': case ' ': case '/': if (d == ' ') { soap_unget(soap, c); *s = '\0'; *n = i + 1; return SOAP_OK; } *s++ = (char)c; break; default: if ((int)c == EOF) { *s = '\0'; *n = i + 1; return soap->error = SOAP_CHK_EOF; } *s++ = (char)c; } } return soap->error = SOAP_EOM; } #endif /******************************************************************************/ #ifdef WITH_FAST #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_store_lab(struct soap *soap, const char *s, size_t n) { soap->labidx = 0; return soap_append_lab(soap, s, n); } #endif #endif /******************************************************************************/ #ifdef WITH_FAST #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_append_lab(struct soap *soap, const char *s, size_t n) { if (soap->labidx + n >= soap->lablen) { char *t = soap->labbuf; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Enlarging look-aside buffer to append data, size=%lu\n", (unsigned long)soap->lablen)); if (soap->lablen == 0) soap->lablen = SOAP_LABLEN; while (soap->labidx + n >= soap->lablen) soap->lablen <<= 1; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "New look-aside buffer size=%lu\n", (unsigned long)soap->lablen)); soap->labbuf = (char*)SOAP_MALLOC(soap, soap->lablen); if (!soap->labbuf) { if (t) SOAP_FREE(soap, t); return soap->error = SOAP_EOM; } if (t) { soap_memcpy((void*)soap->labbuf, soap->lablen, (const void*)t, soap->labidx); SOAP_FREE(soap, t); } } if (s) { soap_memcpy((void*)(soap->labbuf + soap->labidx), soap->lablen - soap->labidx, (const void*)s, n); soap->labidx += n; } return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_peek_element(struct soap *soap) { #ifdef WITH_DOM struct soap_dom_attribute **att = NULL; char *lead = NULL; #endif struct soap_attribute *tp, *tq = NULL; const char *t; char *s; soap_wchar c; int i; if (soap->peeked) { if (!*soap->tag) return soap->error = SOAP_NO_TAG; return SOAP_OK; } soap->peeked = 1; soap->id[0] = '\0'; soap->href[0] = '\0'; soap->type[0] = '\0'; soap->arrayType[0] = '\0'; soap->arraySize[0] = '\0'; soap->arrayOffset[0] = '\0'; soap->other = 0; soap->root = -1; soap->position = 0; soap->null = 0; soap->mustUnderstand = 0; /* UTF-8 BOM? */ c = soap_getchar(soap); if (c == 0xEF && soap_get0(soap) == 0xBB) { c = soap_get1(soap); if ((c = soap_get1(soap)) == 0xBF) soap->mode &= ~SOAP_ENC_LATIN; else soap_unget(soap, (0x0F << 12) | (0xBB << 6) | (c & 0x3F)); /* UTF-8 */ } else if ((c == 0xFE && soap_get0(soap) == 0xFF) /* UTF-16 BE */ || (c == 0xFF && soap_get0(soap) == 0xFE)) /* UTF-16 LE */ return soap->error = SOAP_UTF_ERROR; else soap_unget(soap, c); c = soap_get(soap); #ifdef WITH_DOM /* whitespace leading up to the start tag is significant for DOM as-is (but comments and PIs are removed from this lead) */ if (soap_blank(c)) { soap->labidx = 0; do { if (soap_append_lab(soap, NULL, 0)) return soap->error; s = soap->labbuf + soap->labidx; i = soap->lablen - soap->labidx; soap->labidx = soap->lablen; while (soap_blank(c) && i--) { *s++ = c; c = soap_get(soap); } } while (soap_blank(c)); *s = '\0'; lead = soap->labbuf; } #else /* skip space */ while (soap_blank(c)) c = soap_get(soap); #endif if (c != SOAP_LT) { *soap->tag = '\0'; if ((int)c == EOF) return soap->error = SOAP_CHK_EOF; soap_unget(soap, c); #ifdef WITH_DOM /* whitespace leading up to the end tag is significant for DOM as-is */ if ((soap->mode & SOAP_XML_DOM) && soap->dom) { if (lead && *lead) soap->dom->tail = soap_strdup(soap, lead); else soap->dom->tail = SOAP_STR_EOS; /* body with closing tag instead of */ } #endif return soap->error = SOAP_NO_TAG; } do c = soap_get1(soap); while (soap_blank(c)); s = soap->tag; i = sizeof(soap->tag); while (c != '>' && c != '/' && soap_notblank(c) && (int)c != EOF) { if (--i > 0) *s++ = (char)c; c = soap_get1(soap); } *s = '\0'; while (soap_blank(c)) c = soap_get1(soap); #ifdef WITH_DOM if (soap->mode & SOAP_XML_DOM) { struct soap_dom_element *elt; elt = (struct soap_dom_element*)soap_malloc(soap, sizeof(struct soap_dom_element)); if (!elt) return soap->error; elt->next = NULL; elt->prnt = soap->dom; elt->elts = NULL; elt->atts = NULL; elt->nstr = NULL; elt->name = soap_strdup(soap, soap->tag); elt->text = NULL; elt->code = NULL; elt->tail = NULL; elt->node = NULL; elt->type = 0; if (lead && *lead) elt->lead = soap_strdup(soap, lead); else elt->lead = NULL; elt->soap = soap; if (soap->dom) { struct soap_dom_element *p = soap->dom->elts; if (p) { while (p->next) p = p->next; p->next = elt; } else soap->dom->elts = elt; } soap->dom = elt; att = &elt->atts; } #endif soap_pop_namespace(soap); for (tp = soap->attributes; tp; tp = tp->next) tp->visible = 0; while ((int)c != EOF && c != '>' && c != '/') { s = soap->tmpbuf; i = sizeof(soap->tmpbuf); while (c != '=' && c != '>' && c != '/' && soap_notblank(c) && (int)c != EOF) { if (--i > 0) *s++ = (char)c; c = soap_get1(soap); } *s = '\0'; if (i == sizeof(soap->tmpbuf)) return soap->error = SOAP_SYNTAX_ERROR; #ifdef WITH_DOM /* add attribute name to dom */ if (att) { *att = (struct soap_dom_attribute*)soap_malloc(soap, sizeof(struct soap_dom_attribute)); if (!*att) return soap->error; (*att)->next = NULL; (*att)->nstr = NULL; (*att)->name = soap_strdup(soap, soap->tmpbuf); (*att)->text = NULL; (*att)->soap = soap; } #endif if (!strncmp(soap->tmpbuf, "xmlns", 5)) { if (soap->tmpbuf[5] == ':') t = soap->tmpbuf + 6; else if (soap->tmpbuf[5]) t = NULL; else t = SOAP_STR_EOS; } else t = NULL; tq = NULL; for (tp = soap->attributes; tp; tq = tp, tp = tp->next) { if (!SOAP_STRCMP(tp->name, soap->tmpbuf)) break; } if (!tp) { size_t l = strlen(soap->tmpbuf); tp = (struct soap_attribute*)SOAP_MALLOC(soap, sizeof(struct soap_attribute) + l); if (!tp) return soap->error = SOAP_EOM; soap_strcpy((char*)tp->name, l + 1, soap->tmpbuf); tp->value = NULL; tp->size = 0; tp->ns = NULL; /* append attribute to the end of the list */ if (tq) { tq->next = tp; tp->next = NULL; } else { tp->next = soap->attributes; soap->attributes = tp; } } while (soap_blank(c)) c = soap_get1(soap); if (c == '=') { size_t k; do c = soap_getutf8(soap); while (soap_blank(c)); if (c != SOAP_QT && c != SOAP_AP) { soap_unget(soap, c); c = ' '; /* blank delimiter */ } k = tp->size; if (soap_getattrval(soap, tp->value, &k, c)) { #ifdef WITH_FAST if (soap->error != SOAP_EOM) return soap->error; soap->error = SOAP_OK; if (soap_store_lab(soap, tp->value, k)) return soap->error; if (tp->value) SOAP_FREE(soap, tp->value); tp->value = NULL; for (;;) { k = soap->lablen - soap->labidx; if (soap_getattrval(soap, soap->labbuf + soap->labidx, &k, c)) { if (soap->error != SOAP_EOM) return soap->error; soap->error = SOAP_OK; soap->labidx = soap->lablen; if (soap_append_lab(soap, NULL, 0)) return soap->error; } else break; } if (soap->labidx) tp->size = soap->lablen; else { tp->size = strlen(soap->labbuf) + 1; if (tp->size < SOAP_LABLEN) tp->size = SOAP_LABLEN; } if (!(tp->value = (char*)SOAP_MALLOC(soap, tp->size))) return soap->error = SOAP_EOM; soap_strcpy(tp->value, tp->size, soap->labbuf); #else tp->size = k; if (soap->error != SOAP_EOM) return soap->error; soap->error = SOAP_OK; if (soap_new_block(soap) == NULL) return soap->error; for (;;) { if (!(s = (char*)soap_push_block(soap, NULL, SOAP_BLKLEN))) return soap->error; k = SOAP_BLKLEN; if (soap_getattrval(soap, s, &k, c)) { if (soap->error != SOAP_EOM) return soap->error; soap->error = SOAP_OK; soap_size_block(soap, NULL, k); } else break; } k = tp->size + soap->blist->size; if (!(s = (char*)SOAP_MALLOC(soap, k))) return soap->error = SOAP_EOM; if (tp->value) { soap_memcpy((void*)s, k, (const void*)tp->value, tp->size); SOAP_FREE(soap, tp->value); } soap_save_block(soap, NULL, s + tp->size, 0); tp->value = s; tp->size = k; #endif } do c = soap_get1(soap); while (soap_blank(c)); tp->visible = 2; /* seen this attribute w/ value */ #ifdef WITH_DOM if (att) (*att)->text = soap_strdup(soap, tp->value); #endif } else tp->visible = 1; /* seen this attribute w/o value */ #ifdef WITH_DOM if (att) att = &(*att)->next; #endif if (t && tp->value) { if (soap_push_namespace(soap, t, tp->value) == NULL) return soap->error; } } #ifdef WITH_DOM if (att) { soap->dom->nstr = soap_current_namespace(soap, soap->tag); for (att = &soap->dom->atts; *att; att = &(*att)->next) (*att)->nstr = soap_current_namespace(soap, (*att)->name); } #endif if ((int)c == EOF) return soap->error = SOAP_CHK_EOF; if (!(soap->body = (c != '/'))) do c = soap_get1(soap); while (soap_blank(c)); #ifdef WITH_DOM if (soap->mode & SOAP_XML_DOM) { if (!soap->body && soap->dom->prnt) soap->dom = soap->dom->prnt; } #endif for (tp = soap->attributes; tp; tp = tp->next) { if (tp->visible && tp->value) { #ifndef WITH_NOIDREF if (!strcmp(tp->name, "id")) { if ((soap->version > 0 && !(soap->imode & SOAP_XML_TREE)) || (soap->mode & SOAP_XML_GRAPH)) { *soap->id = '#'; soap_strcpy(soap->id + 1, sizeof(soap->id) - 1, tp->value); } } else if (!strcmp(tp->name, "href")) { if ((soap->version == 1 && !(soap->imode & SOAP_XML_TREE)) || (soap->mode & SOAP_XML_GRAPH) || ((soap->mode & (SOAP_ENC_MTOM | SOAP_ENC_DIME)) && *tp->value != '#')) soap_strcpy(soap->href, sizeof(soap->href), tp->value); } else if (!strcmp(tp->name, "ref")) { if ((soap->version == 2 && !(soap->imode & SOAP_XML_TREE)) || (soap->mode & SOAP_XML_GRAPH)) { *soap->href = '#'; soap_strcpy(soap->href + (*tp->value != '#'), sizeof(soap->href) - 1, tp->value); } } #else if (!strcmp(tp->name, "href")) { if ((soap->mode & (SOAP_ENC_MTOM | SOAP_ENC_DIME)) && *tp->value != '#') soap_strcpy(soap->href, sizeof(soap->href), tp->value); } #endif else if (!soap_match_tag(soap, tp->name, "xsi:type")) { soap_strcpy(soap->type, sizeof(soap->type), tp->value); } else if ((!soap_match_tag(soap, tp->name, "xsi:null") || !soap_match_tag(soap, tp->name, "xsi:nil")) && (!strcmp(tp->value, "1") || !strcmp(tp->value, "true"))) { soap->null = 1; } else if (!soap_match_tag(soap, tp->name, "SOAP-ENV:encodingStyle")) { if (!soap->encodingStyle) soap->encodingStyle = SOAP_STR_EOS; soap_get_version(soap); } else if (soap->version == 1) { if (!soap_match_tag(soap, tp->name, "SOAP-ENC:arrayType")) { s = soap_strrchr(tp->value, '['); if (s && (size_t)(s - tp->value) < sizeof(soap->arrayType)) { soap_strncpy(soap->arrayType, sizeof(soap->arrayType), tp->value, s - tp->value); soap_strcpy(soap->arraySize, sizeof(soap->arraySize), s); } else soap_strcpy(soap->arrayType, sizeof(soap->arrayType), tp->value); } else if (!soap_match_tag(soap, tp->name, "SOAP-ENC:offset")) soap_strcpy(soap->arrayOffset, sizeof(soap->arrayOffset), tp->value); else if (!soap_match_tag(soap, tp->name, "SOAP-ENC:position")) soap->position = soap_getposition(tp->value, soap->positions); else if (!soap_match_tag(soap, tp->name, "SOAP-ENC:root")) soap->root = ((!strcmp(tp->value, "1") || !strcmp(tp->value, "true"))); else if (!soap_match_tag(soap, tp->name, "SOAP-ENV:mustUnderstand") && (!strcmp(tp->value, "1") || !strcmp(tp->value, "true"))) soap->mustUnderstand = 1; else if (!soap_match_tag(soap, tp->name, "SOAP-ENV:actor")) { if ((!soap->actor || strcmp(soap->actor, tp->value)) && strcmp(tp->value, "http://schemas.xmlsoap.org/soap/actor/next")) soap->other = 1; } } else if (soap->version == 2) { #ifndef WITH_NOIDREF if (!soap_match_tag(soap, tp->name, "SOAP-ENC:id")) { *soap->id = '#'; soap_strcpy(soap->id + 1, sizeof(soap->id) - 1, tp->value); } else if (!soap_match_tag(soap, tp->name, "SOAP-ENC:ref")) { *soap->href = '#'; soap_strcpy(soap->href + (*tp->value != '#'), sizeof(soap->href) - 1, tp->value); } else #endif if (!soap_match_tag(soap, tp->name, "SOAP-ENC:itemType")) soap_strcpy(soap->arrayType, sizeof(soap->arrayType), tp->value); else if (!soap_match_tag(soap, tp->name, "SOAP-ENC:arraySize")) soap_strcpy(soap->arraySize, sizeof(soap->arraySize), tp->value); else if (!soap_match_tag(soap, tp->name, "SOAP-ENV:mustUnderstand") && (!strcmp(tp->value, "1") || !strcmp(tp->value, "true"))) soap->mustUnderstand = 1; else if (!soap_match_tag(soap, tp->name, "SOAP-ENV:role")) { if ((!soap->actor || strcmp(soap->actor, tp->value)) && strcmp(tp->value, "http://www.w3.org/2003/05/soap-envelope/role/next")) soap->other = 1; } } else { if (!soap_match_tag(soap, tp->name, "wsdl:required") && !strcmp(tp->value, "true")) soap->mustUnderstand = 1; } } } #ifdef WITH_DOM if (soap->feltbegin) return soap->error = soap->feltbegin(soap, soap->tag); #endif return soap->error = SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_retry(struct soap *soap) { soap->error = SOAP_OK; soap_revert(soap); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_revert(struct soap *soap) { if (!soap->peeked) { soap->peeked = 1; if (soap->body) soap->level--; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Reverting to last element '%s' (level=%u)\n", soap->tag, soap->level)); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_string_out(struct soap *soap, const char *s, int flag) { const char *t; soap_wchar c; soap_wchar mask = (soap_wchar)0xFFFFFF80UL; #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { soap->dom->text = soap_strdup(soap, s); return SOAP_OK; } #endif if (flag == 2 || (soap->mode & SOAP_C_UTFSTRING)) mask = 0; t = s; while ((c = *t++)) { switch (c) { case 0x09: if (flag) { if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, " ", 5)) return soap->error; s = t; } break; case 0x0A: if (flag || !(soap->mode & SOAP_XML_CANONICAL)) { if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, " ", 5)) return soap->error; s = t; } break; case '&': if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, "&", 5)) return soap->error; s = t; break; case '<': if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, "<", 4)) return soap->error; s = t; break; case '>': if (!flag) { if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, ">", 4)) return soap->error; s = t; } break; case '"': if (flag) { if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, """, 6)) return soap->error; s = t; } break; case 0x7F: if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, "", 6)) return soap->error; s = t; break; default: #ifndef WITH_LEANER #ifdef HAVE_MBTOWC if (soap->mode & SOAP_C_MBSTRING) { wchar_t wc; int m = mbtowc(&wc, t - 1, MB_CUR_MAX); if (m > 0 && !((soap_wchar)wc == c && m == 1 && c < 0x80)) { if (soap_send_raw(soap, s, t - s - 1) || soap_pututf8(soap, (unsigned long)wc)) return soap->error; s = t += m - 1; continue; } } #endif #endif #ifndef WITH_NOSTRINGTOUTF8 if ((c & mask) || !(c & 0xFFFFFFE0UL)) { if (soap_send_raw(soap, s, t - s - 1) || soap_pututf8(soap, (unsigned char)c)) return soap->error; s = t; } #endif } } return soap_send_raw(soap, s, t - s - 1); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 char * SOAP_FMAC2 soap_string_in(struct soap *soap, int flag, long minlen, long maxlen, const char *pattern) { char *s; char *t = NULL; size_t i; long l = 0; int n = 0, f = 0, m = 0; soap_wchar c; #if !defined(WITH_LEANER) && defined(HAVE_WCTOMB) char buf[MB_LEN_MAX > 8 ? MB_LEN_MAX : 8]; #else char buf[8]; #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Reading string content, flag=%d\n", flag)); if (flag <= 0 && soap->peeked && *soap->tag) { #ifndef WITH_LEAN struct soap_attribute *tp; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "String content includes tag '%s' and attributes\n", soap->tag)); t = soap->tmpbuf; *t = '<'; soap_strcpy(t + 1, sizeof(soap->tmpbuf) - 1, soap->tag); t += strlen(t); for (tp = soap->attributes; tp; tp = tp->next) { if (tp->visible) { size_t l = strlen(tp->name); if (t + l + 1 >= soap->tmpbuf + sizeof(soap->tmpbuf)) break; /* too many or attribute values to large */ *t++ = ' '; soap_strncpy(t, sizeof(soap->tmpbuf) - (t - soap->tmpbuf), tp->name, l); t += l; if (tp->value) { l = strlen(tp->value); if (t + l + 3 >= soap->tmpbuf + sizeof(soap->tmpbuf)) break; /* too many or attribute values to large */ *t++ = '='; *t++ = '"'; soap_strncpy(t, sizeof(soap->tmpbuf) - (t - soap->tmpbuf), tp->value, l); t += l; *t++ = '"'; } } } if (!soap->body) *t++ = '/'; *t++ = '>'; *t = '\0'; t = soap->tmpbuf; m = (int)strlen(soap->tmpbuf); #endif if (soap->body) n = 1; f = 1; soap->peeked = 0; } #ifdef WITH_CDATA if (flag <= 0) { int state = 0; #ifdef WITH_FAST soap->labidx = 0; /* use look-aside buffer */ #else if (soap_new_block(soap) == NULL) return NULL; #endif for (;;) { #ifdef WITH_FAST size_t k; if (soap_append_lab(soap, NULL, 0)) /* allocate more space in look-aside buffer if necessary */ return NULL; s = soap->labbuf + soap->labidx; /* space to populate */ k = soap->lablen - soap->labidx; /* number of bytes available */ soap->labidx = soap->lablen; /* claim this space */ #else size_t k = SOAP_BLKLEN; if (!(s = (char*)soap_push_block(soap, NULL, k))) return NULL; #endif for (i = 0; i < k; i++) { if (m > 0) { *s++ = *t++; /* copy multibyte characters */ m--; continue; } c = soap_getchar(soap); if ((int)c == EOF) goto end; if ((c >= 0x80 || c < SOAP_AP) && state != 1 && !(soap->mode & SOAP_ENC_LATIN)) { if ((c & 0x7FFFFFFF) >= 0x80) { soap_unget(soap, c); c = soap_getutf8(soap); } if ((c & 0x7FFFFFFF) >= 0x80 && (flag <= 0 || (soap->mode & SOAP_C_UTFSTRING))) { c &= 0x7FFFFFFF; t = buf; if (c < 0x0800) *t++ = (char)(0xC0 | ((c >> 6) & 0x1F)); else { if (c < 0x010000) *t++ = (char)(0xE0 | ((c >> 12) & 0x0F)); else { if (c < 0x200000) *t++ = (char)(0xF0 | ((c >> 18) & 0x07)); else { if (c < 0x04000000) *t++ = (char)(0xF8 | ((c >> 24) & 0x03)); else { *t++ = (char)(0xFC | ((c >> 30) & 0x01)); *t++ = (char)(0x80 | ((c >> 24) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 18) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 12) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 6) & 0x3F)); } *t++ = (char)(0x80 | (c & 0x3F)); m = (int)(t - buf) - 1; t = buf; *s++ = *t++; continue; } } switch (state) { case 1: if (c == ']') state = 4; *s++ = (char)c; continue; case 2: if (c == '-') state = 6; *s++ = (char)c; continue; case 3: if (c == '?') state = 8; *s++ = (char)c; continue; /* CDATA */ case 4: if (c == ']') state = 5; else state = 1; *s++ = (char)c; continue; case 5: if (c == '>') state = 0; else if (c != ']') state = 1; *s++ = (char)c; continue; /* comment */ case 6: if (c == '-') state = 7; else state = 2; *s++ = (char)c; continue; case 7: if (c == '>') state = 0; else if (c != '-') state = 2; *s++ = (char)c; continue; /* PI */ case 8: if (c == '>') state = 0; else if (c != '?') state = 3; *s++ = (char)c; continue; } switch (c) { case SOAP_TT: if (n == 0) goto end; n--; *s++ = '<'; t = (char*)"/"; m = 1; break; case SOAP_LT: if ((!f && flag >= 0) || (f && n == 0)) goto end; n++; *s++ = '<'; break; case SOAP_GT: *s++ = '>'; break; case SOAP_QT: *s++ = '"'; break; case SOAP_AP: *s++ = '\''; break; case '/': if (n > 0) { c = soap_getchar(soap); if (c == '>') n--; soap_unget(soap, c); } *s++ = '/'; break; case '<': c = soap_getchar(soap); if (c == '/') { if (n == 0) { c = SOAP_TT; goto end; } n--; } else if (c == '!') { c = soap_getchar(soap); if (c == '[') { do c = soap_getchar(soap); while ((int)c != EOF && c != '['); if ((int)c == EOF) goto end; t = (char*)"![CDATA["; m = 8; state = 1; } else if (c == '-') { if ((c = soap_getchar(soap)) == '-') state = 2; t = (char*)"!-"; m = 2; soap_unget(soap, c); } else { t = (char*)"!"; m = 1; soap_unget(soap, c); } *s++ = '<'; break; } else if (c == '?') state = 3; else if (f && n == 0) { soap_revget1(soap); c = '<'; goto end; } else n++; soap_unget(soap, c); *s++ = '<'; break; case '>': *s++ = '>'; break; case '"': *s++ = '"'; break; default: #ifndef WITH_LEANER #ifdef HAVE_WCTOMB if (soap->mode & SOAP_C_MBSTRING) { #ifdef WIN32 m = 0; wctomb_s(&m, buf, sizeof(buf), (wchar_t)(c & 0x7FFFFFFF)); #else m = wctomb(buf, (wchar_t)(c & 0x7FFFFFFF)); #endif if (m >= 1 && m <= (int)MB_CUR_MAX) { t = buf; *s++ = *t++; m--; } else { *s++ = SOAP_UNKNOWN_CHAR; m = 0; } } else #endif #endif *s++ = (char)(c & 0xFF); } l++; if (maxlen >= 0 && l > maxlen) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "String too long: maxlen=%ld\n", maxlen)); soap->error = SOAP_LENGTH; return NULL; } } } } #endif #ifdef WITH_FAST soap->labidx = 0; /* use look-aside buffer */ #else if (soap_new_block(soap) == NULL) return NULL; #endif for (;;) { #ifdef WITH_FAST size_t k; if (soap_append_lab(soap, NULL, 0)) /* allocate more space in look-aside buffer if necessary */ return NULL; s = soap->labbuf + soap->labidx; /* space to populate */ k = soap->lablen - soap->labidx; /* number of bytes available */ soap->labidx = soap->lablen; /* claim this space */ #else size_t k = SOAP_BLKLEN; if (!(s = (char*)soap_push_block(soap, NULL, k))) return NULL; #endif for (i = 0; i < k; i++) { if (m > 0) { *s++ = *t++; /* copy multibyte characters */ m--; continue; } #ifndef WITH_CDATA if (flag <= 0) c = soap_getchar(soap); else #endif { c = soap_getutf8(soap); if ((soap->mode & SOAP_C_UTFSTRING)) { if (c >= 0x80 || (c < SOAP_AP && c >= -0x7FFFFF80)) { c &= 0x7FFFFFFF; t = buf; if (c < 0x0800) *t++ = (char)(0xC0 | ((c >> 6) & 0x1F)); else { if (c < 0x010000) *t++ = (char)(0xE0 | ((c >> 12) & 0x0F)); else { if (c < 0x200000) *t++ = (char)(0xF0 | ((c >> 18) & 0x07)); else { if (c < 0x04000000) *t++ = (char)(0xF8 | ((c >> 24) & 0x03)); else { *t++ = (char)(0xFC | ((c >> 30) & 0x01)); *t++ = (char)(0x80 | ((c >> 24) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 18) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 12) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 6) & 0x3F)); } *t++ = (char)(0x80 | (c & 0x3F)); m = (int)(t - buf) - 1; t = buf; *s++ = *t++; l++; if (maxlen >= 0 && l > maxlen) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "String too long: maxlen=%ld\n", maxlen)); soap->error = SOAP_LENGTH; return NULL; } continue; } } } switch (c) { case SOAP_TT: if (n == 0) goto end; n--; *s++ = '<'; t = (char*)"/"; m = 1; break; case SOAP_LT: if ((!f && flag >= 0) || (f && n == 0)) goto end; n++; *s++ = '<'; break; case SOAP_GT: *s++ = '>'; break; case SOAP_QT: *s++ = '"'; break; case SOAP_AP: *s++ = '\''; break; case '/': if (n > 0) { if (flag > 0) { c = soap_get(soap); if (c == SOAP_GT) n--; } else { c = soap_getchar(soap); if (c == '>') n--; } soap_unget(soap, c); } *s++ = '/'; break; case (soap_wchar)('<' | 0x80000000): if (flag > 0) *s++ = '<'; else { *s++ = '&'; t = (char*)"lt;"; m = 3; } break; case (soap_wchar)('>' | 0x80000000): if (flag > 0) *s++ = '>'; else { *s++ = '&'; t = (char*)"gt;"; m = 3; } break; case (soap_wchar)('&' | 0x80000000): if (flag > 0) *s++ = '&'; else { *s++ = '&'; t = (char*)"amp;"; m = 4; } break; case (soap_wchar)('"' | 0x80000000): if (flag > 0) *s++ = '"'; else { *s++ = '&'; t = (char*)"quot;"; m = 5; } break; case (soap_wchar)('\'' | 0x80000000): if (flag > 0) *s++ = '\''; else { *s++ = '&'; t = (char*)"apos;"; m = 5; } break; default: if ((int)c == EOF) goto end; #ifndef WITH_CDATA if (c == '<') { c = soap_getchar(soap); soap_unget(soap, c); if (c == '/') { c = SOAP_TT; if (n == 0) goto end; n--; } else n++; *s++ = '<'; break; } else #endif #ifndef WITH_LEANER #ifdef HAVE_WCTOMB if (soap->mode & SOAP_C_MBSTRING) { #ifdef WIN32 m = 0; wctomb_s(&m, buf, sizeof(buf), (wchar_t)(c & 0x7FFFFFFF)); #else m = wctomb(buf, (wchar_t)(c & 0x7FFFFFFF)); #endif if (m >= 1 && m <= (int)MB_CUR_MAX) { t = buf; *s++ = *t++; m--; } else { *s++ = SOAP_UNKNOWN_CHAR; m = 0; } } else #endif #endif *s++ = (char)(c & 0xFF); } l++; if (maxlen >= 0 && l > maxlen) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "String too long: maxlen=%ld\n", maxlen)); soap->error = SOAP_LENGTH; return NULL; } } } end: soap_unget(soap, c); *s = '\0'; #ifdef WITH_FAST t = soap_strdup(soap, soap->labbuf); #else soap_size_block(soap, NULL, i + 1); t = soap_save_block(soap, NULL, NULL, 0); #endif if (l < minlen) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "String too short: %ld chars, minlen=%ld\n", l, minlen)); soap->error = SOAP_LENGTH; return NULL; } #ifndef WITH_LEANER if (pattern && soap->fsvalidate && (soap->error = soap->fsvalidate(soap, pattern, s))) return NULL; #else (void)pattern; #endif #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { if (flag > 0) soap->dom->text = t; else soap->dom->code = t; } #endif if (flag == 2) if (soap_s2QName(soap, t, &t, minlen, maxlen)) return NULL; return t; } #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_wstring_out(struct soap *soap, const wchar_t *s, int flag) { const char *t; char tmp; soap_wchar c; #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { soap->dom->text = soap_wchar2s(soap, s); return SOAP_OK; } #endif while ((c = *s++)) { switch (c) { case 0x09: if (flag) t = " "; else t = "\t"; break; case 0x0A: if (flag || !(soap->mode & SOAP_XML_CANONICAL)) t = " "; else t = "\n"; break; case 0x0D: t = " "; break; case '&': t = "&"; break; case '<': t = "<"; break; case '>': if (flag) t = ">"; else t = ">"; break; case '"': if (flag) t = """; else t = "\""; break; default: if (c >= 0x20 && c < 0x80) { tmp = (char)c; if (soap_send_raw(soap, &tmp, 1)) return soap->error; } else { /* check for UTF16 encoding when wchar_t is too small to hold UCS */ if (sizeof(wchar_t) < 4 && (c & 0xFC00) == 0xD800) { soap_wchar d = *s++; if ((d & 0xFC00) == 0xDC00) c = ((c - 0xD800) << 10) + (d - 0xDC00) + 0x10000; else c = 0xFFFD; /* Malformed */ } if (soap_pututf8(soap, (unsigned long)c)) return soap->error; } continue; } if (soap_send(soap, t)) return soap->error; } return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_2 SOAP_FMAC1 wchar_t * SOAP_FMAC2 soap_wstring_in(struct soap *soap, int flag, long minlen, long maxlen, const char *pattern) { wchar_t *s; int i, n = 0, f = 0; long l = 0; soap_wchar c; char *t = NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Reading wide string content\n")); if (flag <= 0 && soap->peeked && *soap->tag) { #ifndef WITH_LEAN struct soap_attribute *tp; t = soap->tmpbuf; *t = '<'; soap_strcpy(t + 1, sizeof(soap->tmpbuf) - 1, soap->tag); t += strlen(t); for (tp = soap->attributes; tp; tp = tp->next) { if (tp->visible) { size_t l = strlen(tp->name); if (t + l + 1 >= soap->tmpbuf + sizeof(soap->tmpbuf)) break; *t++ = ' '; soap_strncpy(t, sizeof(soap->tmpbuf) - (t - soap->tmpbuf), tp->name, l); t += l; if (tp->value) { l = strlen(tp->value); if (t + l + 3 >= soap->tmpbuf + sizeof(soap->tmpbuf)) break; *t++ = '='; *t++ = '"'; soap_strncpy(t, sizeof(soap->tmpbuf) - (t - soap->tmpbuf), tp->value, l); t += l; *t++ = '"'; } } } if (!soap->body) *t++ = '/'; *t++ = '>'; *t = '\0'; t = soap->tmpbuf; #endif if (soap->body) n = 1; f = 1; soap->peeked = 0; } if (soap_new_block(soap) == NULL) return NULL; for (;;) { if (!(s = (wchar_t*)soap_push_block(soap, NULL, sizeof(wchar_t)*SOAP_BLKLEN))) return NULL; for (i = 0; i < SOAP_BLKLEN; i++) { if (t) { *s++ = (wchar_t)*t++; if (!*t) t = NULL; continue; } c = soap_getutf8(soap); switch (c) { case SOAP_TT: if (n == 0) goto end; n--; *s++ = '<'; soap_unget(soap, '/'); break; case SOAP_LT: if ((!f && flag >= 0) || (f && n == 0)) goto end; n++; *s++ = '<'; break; case SOAP_GT: *s++ = '>'; break; case SOAP_QT: *s++ = '"'; break; case SOAP_AP: *s++ = '\''; break; case '/': if (n > 0) { c = soap_getutf8(soap); if (c == SOAP_GT) n--; soap_unget(soap, c); } *s++ = '/'; break; case '<': if (flag > 0) *s++ = (soap_wchar)'<'; else { *s++ = (soap_wchar)'&'; t = (char*)"lt;"; } break; case '>': if (flag > 0) *s++ = (soap_wchar)'>'; else { *s++ = (soap_wchar)'&'; t = (char*)"gt;"; } break; case '"': if (flag > 0) *s++ = (soap_wchar)'"'; else { *s++ = (soap_wchar)'&'; t = (char*)"quot;"; } break; default: if ((int)c == EOF) goto end; /* use UTF16 encoding when wchar_t is too small to hold UCS */ if (sizeof(wchar_t) < 4 && c > 0xFFFF) { soap_wchar c1, c2; c1 = 0xD800 - (0x10000 >> 10) + (c >> 10); c2 = 0xDC00 + (c & 0x3FF); c = c1; soap_unget(soap, c2); } *s++ = (wchar_t)c & 0x7FFFFFFF; } l++; if (maxlen >= 0 && l > maxlen) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "String too long: maxlen=%ld\n", maxlen)); soap->error = SOAP_LENGTH; return NULL; } } } end: soap_unget(soap, c); *s = '\0'; soap_size_block(soap, NULL, sizeof(wchar_t) * (i + 1)); if (l < minlen) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "String too short: %ld chars, minlen=%ld\n", l, minlen)); soap->error = SOAP_LENGTH; return NULL; } s = (wchar_t*)soap_save_block(soap, NULL, NULL, 0); #ifndef WITH_LEANER if (pattern && soap->fwvalidate && (soap->error = soap->fwvalidate(soap, pattern, s))) return NULL; #endif #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) soap->dom->text = soap_wchar2s(soap, s); #endif return s; } #endif #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_int2s(struct soap *soap, int n) { return soap_long2s(soap, (long)n); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outint(struct soap *soap, const char *tag, int id, const int *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_long2s(soap, (long)*p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2int(struct soap *soap, const char *s, int *p) { if (s) { long n; char *r; #ifndef WITH_NOIO #ifndef WITH_LEAN soap_reset_errno; #endif #endif n = soap_strtol(s, &r, 10); if (s == r || *r #ifndef WITH_LEAN || n != (int)n #endif #ifndef WITH_NOIO #ifndef WITH_LEAN || soap_errno == SOAP_ERANGE #endif #endif ) soap->error = SOAP_TYPE; *p = (int)n; } return soap->error; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int * SOAP_FMAC2 soap_inint(struct soap *soap, const char *tag, int *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; #ifndef WITH_LEAN if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":int") && soap_match_tag(soap, soap->type, ":short") && soap_match_tag(soap, soap->type, ":byte")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } #else (void)type; #endif p = (int*)soap_id_enter(soap, soap->id, p, t, sizeof(int), NULL, NULL, NULL, NULL); if (*soap->href) p = (int*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(int), 0, NULL, NULL); else if (p) { if (soap_s2int(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_long2s(struct soap *soap, long n) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 20), "%ld", n); return soap->tmpbuf; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outlong(struct soap *soap, const char *tag, int id, const long *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_long2s(soap, *p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2long(struct soap *soap, const char *s, long *p) { if (s) { char *r; #ifndef WITH_NOIO #ifndef WITH_LEAN soap_reset_errno; #endif #endif *p = soap_strtol(s, &r, 10); if (s == r || *r #ifndef WITH_NOIO #ifndef WITH_LEAN || soap_errno == SOAP_ERANGE #endif #endif ) soap->error = SOAP_TYPE; } return soap->error; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 long * SOAP_FMAC2 soap_inlong(struct soap *soap, const char *tag, long *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; #ifndef WITH_LEAN if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":int") && soap_match_tag(soap, soap->type, ":short") && soap_match_tag(soap, soap->type, ":byte")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } #else (void)type; #endif p = (long*)soap_id_enter(soap, soap->id, p, t, sizeof(long), NULL, NULL, NULL, NULL); if (*soap->href) p = (long*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(long), 0, NULL, NULL); else if (p) { if (soap_s2long(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 const char* SOAP_FMAC2 soap_LONG642s(struct soap *soap, LONG64 n) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 20), SOAP_LONG_FORMAT, n); return soap->tmpbuf; } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 int SOAP_FMAC2 soap_outLONG64(struct soap *soap, const char *tag, int id, const LONG64 *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_LONG642s(soap, *p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 int SOAP_FMAC2 soap_s2LONG64(struct soap *soap, const char *s, LONG64 *p) { if (s) { char *r; #ifndef WITH_NOIO #ifndef WITH_LEAN soap_reset_errno; #endif #endif #ifdef HAVE_STRTOLL *p = soap_strtoll(s, &r, 10); #else *p = (LONG64)soap_strtol(s, &r, 10); #endif if (s == r || *r #ifndef WITH_NOIO #ifndef WITH_LEAN || soap_errno == SOAP_ERANGE #endif #endif ) soap->error = SOAP_TYPE; } return soap->error; } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 LONG64 * SOAP_FMAC2 soap_inLONG64(struct soap *soap, const char *tag, LONG64 *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; #ifndef WITH_LEAN if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":integer") && soap_match_tag(soap, soap->type, ":positiveInteger") && soap_match_tag(soap, soap->type, ":negativeInteger") && soap_match_tag(soap, soap->type, ":nonPositiveInteger") && soap_match_tag(soap, soap->type, ":nonNegativeInteger") && soap_match_tag(soap, soap->type, ":long") && soap_match_tag(soap, soap->type, ":int") && soap_match_tag(soap, soap->type, ":short") && soap_match_tag(soap, soap->type, ":byte")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } #endif p = (LONG64*)soap_id_enter(soap, soap->id, p, t, sizeof(LONG64), NULL, NULL, NULL, NULL); if (*soap->href) p = (LONG64*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(LONG64), 0, NULL, NULL); else if (p) { if (soap_s2LONG64(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_byte2s(struct soap *soap, char n) { return soap_long2s(soap, (long)n); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outbyte(struct soap *soap, const char *tag, int id, const char *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_long2s(soap, (long)*p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2byte(struct soap *soap, const char *s, char *p) { if (s) { long n; char *r; n = soap_strtol(s, &r, 10); if (s == r || *r || n < -128 || n > 127) soap->error = SOAP_TYPE; *p = (char)n; } return soap->error; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 char * SOAP_FMAC2 soap_inbyte(struct soap *soap, const char *tag, char *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; #ifndef WITH_LEAN if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":byte")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } #else (void)type; #endif p = (char*)soap_id_enter(soap, soap->id, p, t, sizeof(char), NULL, NULL, NULL, NULL); if (*soap->href) p = (char*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(char), 0, NULL, NULL); else if (p) { if (soap_s2byte(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_short2s(struct soap *soap, short n) { return soap_long2s(soap, (long)n); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outshort(struct soap *soap, const char *tag, int id, const short *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_long2s(soap, (long)*p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2short(struct soap *soap, const char *s, short *p) { if (s) { long n; char *r; n = soap_strtol(s, &r, 10); if (s == r || *r || n < -32768 || n > 32767) soap->error = SOAP_TYPE; *p = (short)n; } return soap->error; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 short * SOAP_FMAC2 soap_inshort(struct soap *soap, const char *tag, short *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; #ifndef WITH_LEAN if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":short") && soap_match_tag(soap, soap->type, ":byte")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } #else (void)type; #endif p = (short*)soap_id_enter(soap, soap->id, p, t, sizeof(short), NULL, NULL, NULL, NULL); if (*soap->href) p = (short*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(short), 0, NULL, NULL); else if (p) { if (soap_s2short(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_float2s(struct soap *soap, float n) { #if !defined(WITH_C_LOCALE) || !defined(HAVE_SPRINTF_L) char *s; #endif if (soap_isnan((double)n)) return "NaN"; if (soap_ispinff(n)) return "INF"; if (soap_isninff(n)) return "-INF"; #if defined(WITH_C_LOCALE) && defined(HAVE_SPRINTF_L) # ifdef WIN32 _sprintf_s_l(soap->tmpbuf, _countof(soap->tmpbuf), soap->float_format, SOAP_LOCALE(soap), n); # else sprintf_l(soap->tmpbuf, SOAP_LOCALE(soap), soap->float_format, n); # endif #else (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 20), soap->float_format, n); s = strchr(soap->tmpbuf, ','); /* convert decimal comma to DP */ if (s) *s = '.'; #endif return soap->tmpbuf; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outfloat(struct soap *soap, const char *tag, int id, const float *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_float2s(soap, *p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2float(struct soap *soap, const char *s, float *p) { if (s) { if (!*s) return soap->error = SOAP_TYPE; if (!soap_tag_cmp(s, "INF")) *p = FLT_PINFTY; else if (!soap_tag_cmp(s, "+INF")) *p = FLT_PINFTY; else if (!soap_tag_cmp(s, "-INF")) *p = FLT_NINFTY; else if (!soap_tag_cmp(s, "NaN")) *p = FLT_NAN; else { /* On some systems strtof requires -std=c99 or does not even link: so we try to use strtod first */ #if defined(WITH_C_LOCALE) && defined(HAVE_STRTOD_L) char *r; # ifdef WIN32 *p = (float)_strtod_l(s, &r, SOAP_LOCALE(soap)); # else *p = (float)strtod_l(s, &r, SOAP_LOCALE(soap)); # endif if (*r) soap->error = SOAP_TYPE; #elif defined(HAVE_STRTOD) char *r; *p = (float)strtod(s, &r); if (*r) soap->error = SOAP_TYPE; #elif defined(WITH_C_LOCALE) && defined(HAVE_STRTOF_L) char *r; *p = strtof_l((char*)s, &r, SOAP_LOCALE(soap)); if (*r) soap->error = SOAP_TYPE; #elif defined(HAVE_STRTOF) char *r; *p = strtof((char*)s, &r); if (*r) soap->error = SOAP_TYPE; #elif defined(WITH_C_LOCALE) && defined(HAVE_SSCANF_L) && !defined(HAVE_STRTOF_L) && !defined(HAVE_STRTOD_L) double n; if (sscanf_l(s, SOAP_LOCALE(soap), "%lf", &n) != 1) soap->error = SOAP_TYPE; *p = (float)n; #elif defined(HAVE_SSCANF) double n; if (sscanf(s, "%lf", &n) != 1) soap->error = SOAP_TYPE; *p = (float)n; #else soap->error = SOAP_TYPE; #endif } } return soap->error; } #endif /******************************************************************************/ #ifndef WITH_LEAN static int soap_isnumeric(struct soap *soap, const char *type) { if (soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":float") && soap_match_tag(soap, soap->type, ":double") && soap_match_tag(soap, soap->type, ":decimal") && soap_match_tag(soap, soap->type, ":integer") && soap_match_tag(soap, soap->type, ":positiveInteger") && soap_match_tag(soap, soap->type, ":negativeInteger") && soap_match_tag(soap, soap->type, ":nonPositiveInteger") && soap_match_tag(soap, soap->type, ":nonNegativeInteger") && soap_match_tag(soap, soap->type, ":long") && soap_match_tag(soap, soap->type, ":int") && soap_match_tag(soap, soap->type, ":short") && soap_match_tag(soap, soap->type, ":byte") && soap_match_tag(soap, soap->type, ":unsignedLong") && soap_match_tag(soap, soap->type, ":unsignedInt") && soap_match_tag(soap, soap->type, ":unsignedShort") && soap_match_tag(soap, soap->type, ":unsignedByte")) { soap->error = SOAP_TYPE; soap_revert(soap); return SOAP_ERR; } return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 float * SOAP_FMAC2 soap_infloat(struct soap *soap, const char *tag, float *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; #ifndef WITH_LEAN if (*soap->type != '\0' && soap_isnumeric(soap, type)) return NULL; #else (void)type; #endif p = (float*)soap_id_enter(soap, soap->id, p, t, sizeof(float), NULL, NULL, NULL, NULL); if (*soap->href) p = (float*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(float), 0, NULL, NULL); else if (p) { if (soap_s2float(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_double2s(struct soap *soap, double n) { #if !defined(WITH_C_LOCALE) || !defined(HAVE_SPRINTF_L) char *s; #endif if (soap_isnan(n)) return "NaN"; if (soap_ispinfd(n)) return "INF"; if (soap_isninfd(n)) return "-INF"; #if defined(WITH_C_LOCALE) && defined(HAVE_SPRINTF_L) # ifdef WIN32 _sprintf_s_l(soap->tmpbuf, _countof(soap->tmpbuf), soap->double_format, SOAP_LOCALE(soap), n); # else sprintf_l(soap->tmpbuf, SOAP_LOCALE(soap), soap->double_format, n); # endif #else (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 40), soap->double_format, n); s = strchr(soap->tmpbuf, ','); /* convert decimal comma to DP */ if (s) *s = '.'; #endif return soap->tmpbuf; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outdouble(struct soap *soap, const char *tag, int id, const double *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_double2s(soap, *p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2double(struct soap *soap, const char *s, double *p) { if (s) { if (!*s) return soap->error = SOAP_TYPE; if (!soap_tag_cmp(s, "INF")) *p = DBL_PINFTY; else if (!soap_tag_cmp(s, "+INF")) *p = DBL_PINFTY; else if (!soap_tag_cmp(s, "-INF")) *p = DBL_NINFTY; else if (!soap_tag_cmp(s, "NaN")) *p = DBL_NAN; else { #if defined(WITH_C_LOCALE) && defined(HAVE_STRTOD_L) char *r; # ifdef WIN32 *p = _strtod_l(s, &r, SOAP_LOCALE(soap)); # else *p = strtod_l(s, &r, SOAP_LOCALE(soap)); # endif if (*r) soap->error = SOAP_TYPE; #elif defined(HAVE_STRTOD) char *r; *p = strtod(s, &r); if (*r) soap->error = SOAP_TYPE; #elif defined(WITH_C_LOCALE) && defined(HAVE_SSCANF_L) && !defined(HAVE_STRTOF_L) && !defined(HAVE_STRTOD_L) if (sscanf_l(s, SOAP_LOCALE(soap), "%lf", p) != 1) soap->error = SOAP_TYPE; #elif defined(HAVE_SSCANF) if (sscanf(s, "%lf", p) != 1) soap->error = SOAP_TYPE; #else soap->error = SOAP_TYPE; #endif } } return soap->error; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 double * SOAP_FMAC2 soap_indouble(struct soap *soap, const char *tag, double *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; #ifndef WITH_LEAN if (*soap->type != '\0' && soap_isnumeric(soap, type)) return NULL; #else (void)type; #endif p = (double*)soap_id_enter(soap, soap->id, p, t, sizeof(double), NULL, NULL, NULL, NULL); if (*soap->href) p = (double*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(double), 0, NULL, NULL); else if (p) { if (soap_s2double(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedByte2s(struct soap *soap, unsigned char n) { return soap_unsignedLong2s(soap, (unsigned long)n); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outunsignedByte(struct soap *soap, const char *tag, int id, const unsigned char *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_unsignedLong2s(soap, (unsigned long)*p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedByte(struct soap *soap, const char *s, unsigned char *p) { if (s) { unsigned long n; char *r; n = soap_strtoul(s, &r, 10); if (s == r || *r || n > 255) soap->error = SOAP_TYPE; *p = (unsigned char)n; } return soap->error; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 unsigned char * SOAP_FMAC2 soap_inunsignedByte(struct soap *soap, const char *tag, unsigned char *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; #ifndef WITH_LEAN if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":unsignedByte")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } #else (void)type; #endif p = (unsigned char*)soap_id_enter(soap, soap->id, p, t, sizeof(unsigned char), NULL, NULL, NULL, NULL); if (*soap->href) p = (unsigned char*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(unsigned char), 0, NULL, NULL); else if (p) { if (soap_s2unsignedByte(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedShort2s(struct soap *soap, unsigned short n) { return soap_unsignedLong2s(soap, (unsigned long)n); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outunsignedShort(struct soap *soap, const char *tag, int id, const unsigned short *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_unsignedLong2s(soap, (unsigned long)*p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedShort(struct soap *soap, const char *s, unsigned short *p) { if (s) { unsigned long n; char *r; n = soap_strtoul(s, &r, 10); if (s == r || *r || n > 65535) soap->error = SOAP_TYPE; *p = (unsigned short)n; } return soap->error; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 unsigned short * SOAP_FMAC2 soap_inunsignedShort(struct soap *soap, const char *tag, unsigned short *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; #ifndef WITH_LEAN if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":unsignedShort") && soap_match_tag(soap, soap->type, ":unsignedByte")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } #else (void)type; #endif p = (unsigned short*)soap_id_enter(soap, soap->id, p, t, sizeof(unsigned short), NULL, NULL, NULL, NULL); if (*soap->href) p = (unsigned short*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(unsigned short), 0, NULL, NULL); else if (p) { if (soap_s2unsignedShort(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedInt2s(struct soap *soap, unsigned int n) { return soap_unsignedLong2s(soap, (unsigned long)n); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outunsignedInt(struct soap *soap, const char *tag, int id, const unsigned int *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_unsignedLong2s(soap, (unsigned long)*p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedInt(struct soap *soap, const char *s, unsigned int *p) { if (s) { char *r; #ifndef WITH_NOIO #ifndef WITH_LEAN soap_reset_errno; #endif #endif *p = (unsigned int)soap_strtoul(s, &r, 10); if (s == r || *r #ifndef WITH_NOIO #ifndef WITH_LEAN || soap_errno == SOAP_ERANGE #endif #endif ) soap->error = SOAP_TYPE; } return soap->error; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 unsigned int * SOAP_FMAC2 soap_inunsignedInt(struct soap *soap, const char *tag, unsigned int *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; #ifndef WITH_LEAN if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":unsignedInt") && soap_match_tag(soap, soap->type, ":unsignedShort") && soap_match_tag(soap, soap->type, ":unsignedByte")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } #else (void)type; #endif p = (unsigned int*)soap_id_enter(soap, soap->id, p, t, sizeof(unsigned int), NULL, NULL, NULL, NULL); if (*soap->href) p = (unsigned int*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(unsigned int), 0, NULL, NULL); else if (p) { if (soap_s2unsignedInt(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedLong2s(struct soap *soap, unsigned long n) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 20), "%lu", n); return soap->tmpbuf; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outunsignedLong(struct soap *soap, const char *tag, int id, const unsigned long *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_unsignedLong2s(soap, *p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedLong(struct soap *soap, const char *s, unsigned long *p) { if (s) { char *r; #ifndef WITH_NOIO #ifndef WITH_LEAN soap_reset_errno; #endif #endif *p = soap_strtoul(s, &r, 10); if (s == r || *r #ifndef WITH_NOIO #ifndef WITH_LEAN || soap_errno == SOAP_ERANGE #endif #endif ) soap->error = SOAP_TYPE; } return soap->error; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 unsigned long * SOAP_FMAC2 soap_inunsignedLong(struct soap *soap, const char *tag, unsigned long *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; #ifndef WITH_LEAN if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":unsignedInt") && soap_match_tag(soap, soap->type, ":unsignedShort") && soap_match_tag(soap, soap->type, ":unsignedByte")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } #else (void)type; #endif p = (unsigned long*)soap_id_enter(soap, soap->id, p, t, sizeof(unsigned long), NULL, NULL, NULL, NULL); if (*soap->href) p = (unsigned long*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(unsigned long), 0, NULL, NULL); else if (p) { if (soap_s2unsignedLong(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_ULONG642s(struct soap *soap, ULONG64 n) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 20), SOAP_ULONG_FORMAT, n); return soap->tmpbuf; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outULONG64(struct soap *soap, const char *tag, int id, const ULONG64 *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_ULONG642s(soap, *p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2ULONG64(struct soap *soap, const char *s, ULONG64 *p) { if (s) { char *r; #ifndef WITH_NOIO #ifndef WITH_LEAN soap_reset_errno; #endif #endif #ifdef HAVE_STRTOULL *p = soap_strtoull(s, &r, 10); #else *p = (ULONG64)soap_strtoul(s, &r, 10); #endif if (s == r || *r #ifndef WITH_NOIO #ifndef WITH_LEAN || soap_errno == SOAP_ERANGE #endif #endif ) soap->error = SOAP_TYPE; } return soap->error; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 ULONG64 * SOAP_FMAC2 soap_inULONG64(struct soap *soap, const char *tag, ULONG64 *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":positiveInteger") && soap_match_tag(soap, soap->type, ":nonNegativeInteger") && soap_match_tag(soap, soap->type, ":unsignedLong") && soap_match_tag(soap, soap->type, ":unsignedInt") && soap_match_tag(soap, soap->type, ":unsignedShort") && soap_match_tag(soap, soap->type, ":unsignedByte")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } p = (ULONG64*)soap_id_enter(soap, soap->id, p, t, sizeof(ULONG64), NULL, NULL, NULL, NULL); if (*soap->href) p = (ULONG64*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(ULONG64), 0, NULL, NULL); else if (p) { if (soap_s2ULONG64(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2string(struct soap *soap, const char *s, char **t, long minlen, long maxlen) { if (s) { const char *r = soap_string(soap, s, minlen, maxlen); if (r && !(*t = soap_strdup(soap, r))) return soap->error = SOAP_EOM; } return soap->error; } #endif /******************************************************************************/ #ifndef WITH_COMPAT #ifdef __cplusplus #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2std__string(struct soap *soap, const char *s, std::string *t, long minlen, long maxlen) { if (s) { const char *r = soap_string(soap, s, minlen, maxlen); if (r) t->assign(r); } return soap->error; } #endif #endif #endif /******************************************************************************/ #ifndef PALM_2 static const char* soap_string(struct soap *soap, const char *s, long minlen, long maxlen) { if (s) { if (minlen > 0 || maxlen >= 0) { long l; if ((soap->mode & SOAP_C_UTFSTRING)) l = (long)soap_utf8len(s); else l = (long)strlen(s); if (l > maxlen || l < minlen) { soap->error = SOAP_LENGTH; return NULL; } } } return s; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2QName(struct soap *soap, const char *s, char **t, long minlen, long maxlen) { if (s) { const char *r = soap_QName(soap, s, minlen, maxlen); if (r && !(*t = soap_strdup(soap, r))) return soap->error = SOAP_EOM; } return soap->error; } #endif /******************************************************************************/ #ifndef WITH_COMPAT #ifdef __cplusplus #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2std__QName(struct soap *soap, const char *s, std::string *t, long minlen, long maxlen) { if (s) { const char *r = soap_QName(soap, s, minlen, maxlen); if (r) t->assign(r); } return soap->error; } #endif #endif #endif /******************************************************************************/ #ifndef PALM_2 static const char* soap_QName(struct soap *soap, const char *s, long minlen, long maxlen) { if (s) { #ifndef WITH_FAST char *b; #endif if (minlen > 0 || maxlen >= 0) { long l; if ((soap->mode & SOAP_C_UTFSTRING)) l = (long)soap_utf8len(s); else l = (long)strlen(s); if (l > maxlen || l < minlen) { soap->error = SOAP_LENGTH; return NULL; } } #ifdef WITH_FAST soap->labidx = 0; #else if (soap_new_block(soap) == NULL) return NULL; #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Normalized namespace(s) of QNames '%s'", s)); /* convert (by prefix normalize prefix) all QNames in s */ for (;;) { size_t n; struct soap_nlist *np; const char *p = NULL; short flag = 0; const char *r = NULL; size_t m = 0; #ifndef WITH_FAST size_t k = 0; #endif /* skip blanks */ while (*s && soap_blank((soap_wchar)*s)) s++; if (!*s) break; /* find next QName */ n = 1; while (s[n] && !soap_blank((soap_wchar)s[n])) n++; np = soap->nlist; /* if there is no namespace stack, or prefix is "#" or "xml" then copy string */ if (!np || *s == '#' || !strncmp(s, "xml:", 4)) { r = s; m = n; } else /* we normalize the QName by replacing its prefix */ { const char *q; for (p = s; *p && p < s + n; p++) if (*p == ':') break; if (*p == ':') { size_t k = p - s; while (np && (strncmp(np->id, s, k) || np->id[k])) np = np->next; p++; } else { while (np && *np->id) np = np->next; p = s; } /* replace prefix */ if (np) { if (np->index >= 0 && soap->local_namespaces && (q = soap->local_namespaces[np->index].id)) { size_t k = strlen(q); if (q[k-1] != '_') { r = q; m = k; } else { flag = 1; r = soap->local_namespaces[np->index].ns; m = strlen(r); } } else if (np->ns) { flag = 1; r = np->ns; m = strlen(r); } else { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\nNamespace prefix of '%s' not defined (index=%d, URI='%s')\n", s, np->index, np->ns ? np->ns : SOAP_STR_EOS)); soap->error = SOAP_NAMESPACE; return NULL; } } else if (s[n]) /* no namespace, part of string */ { r = s; m = n; } else /* no namespace: assume "" namespace */ { flag = 1; } } #ifdef WITH_FAST if ((flag && soap_append_lab(soap, "\"", 1)) || (m && soap_append_lab(soap, r, m)) || (flag && soap_append_lab(soap, "\"", 1)) || (p && (soap_append_lab(soap, ":", 1) || soap_append_lab(soap, p, n - (p-s))))) return NULL; #else k = 2*flag + m + (p ? n - (p-s) + 1 : 0) + (s[n] != '\0'); b = (char*)soap_push_block(soap, NULL, k); if (!b) return NULL; if (flag) *b++ = '"'; if (m) { if (soap_memcpy((void*)b, k, (const void*)r, m)) { soap->error = SOAP_EOM; return NULL; } b += m; } if (flag) *b++ = '"'; if (p) { *b++ = ':'; if (soap_memcpy((void*)b, k - m - flag - 1, (const void*)p, n - (p-s))) { soap->error = SOAP_EOM; return NULL; } b += n - (p-s); } #endif /* advance to next and add spacing */ s += n; if (*s) { #ifdef WITH_FAST if (soap_append_lab(soap, " ", 1)) return NULL; #else *b = ' '; #endif } } #ifdef WITH_FAST if (soap_append_lab(soap, SOAP_STR_EOS, 1)) return NULL; return soap->labbuf; #else b = (char*)soap_push_block(soap, NULL, 1); if (!b) return NULL; *b = '\0'; return (char*)soap_save_block(soap, NULL, NULL, 0); #endif } return NULL; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_QName2s(struct soap *soap, const char *s) { const char *t = NULL; if (s) { #ifdef WITH_FAST soap->labidx = 0; #else char *b; if (soap_new_block(soap) == NULL) return NULL; #endif for (;;) { size_t n; const char *q = NULL; const char *r = NULL; size_t m = 0; #ifndef WITH_FAST size_t k = 0; #endif /* skip blanks */ while (*s && soap_blank((soap_wchar)*s)) s++; if (!*s) break; /* find next QName */ n = 0; while (s[n] && !soap_blank((soap_wchar)s[n])) n++; /* normal prefix: pass string as is */ if (*s != '"') { #ifndef WITH_LEAN if ((soap->mode & SOAP_XML_CANONICAL)) soap_utilize_ns(soap, s); if ((soap->mode & SOAP_XML_DEFAULTNS)) { r = strchr(s, ':'); if (r && soap->nlist && !strncmp(soap->nlist->id, s, r - s) && !soap->nlist->id[r - s]) { n -= r - s + 1; s = r + 1; } } #endif r = s; m = n + 1; } else /* URL-based string prefix */ { s++; q = strchr(s, '"'); if (q) { struct Namespace *p = soap->local_namespaces; if (p) { for (; p->id; p++) { if (p->ns) if (!soap_tag_cmp(s, p->ns)) break; if (p->in) if (!soap_tag_cmp(s, p->in)) break; } } q++; /* URL is in the namespace table? */ if (p && p->id) { r = p->id; #ifndef WITH_LEAN if ((soap->mode & SOAP_XML_DEFAULTNS) && soap->nlist && !strcmp(soap->nlist->id, r)) q++; else #endif m = strlen(r); } else /* not in namespace table: create xmlns binding */ { char *x = soap_strdup(soap, s); x[q - s - 1] = '\0'; (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 27), "xmlns:_%d", soap->idnum++); soap_set_attr(soap, soap->tmpbuf, x, 1); r = soap->tmpbuf + 6; m = strlen(r); } } } /* copy normalized QName into buffer, including the ending blank or NUL */ #ifdef WITH_FAST if ((m && soap_append_lab(soap, r, m)) || (q && soap_append_lab(soap, q, n - (q - s)))) return NULL; #else k = m + (q ? n - (q - s) : 0); b = (char*)soap_push_block(soap, NULL, k); if (soap_memcpy((void*)b, k, (const void*)r, m)) { soap->error = SOAP_EOM; return NULL; } b += m; if (q) { if (soap_memcpy((void*)b, k - m, (const void*)q, n - (q - s))) { soap->error = SOAP_EOM; return NULL; } b += n - (q - s); } #endif /* advance to next */ s += n; } #ifdef WITH_FAST t = soap_strdup(soap, soap->labbuf); #else t = (char*)soap_save_block(soap, NULL, NULL, 0); #endif } return t; } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 int SOAP_FMAC2 soap_s2wchar(struct soap *soap, const char *s, wchar_t **t, long minlen, long maxlen) { if (s) { const wchar_t *r = soap_wstring(soap, s, minlen, maxlen); if (r && !(*t = soap_wstrdup(soap, r))) return soap->error = SOAP_EOM; } return soap->error; } #endif /******************************************************************************/ #ifndef WITH_COMPAT #ifdef __cplusplus #ifndef WITH_LEAN SOAP_FMAC1 int SOAP_FMAC2 soap_s2std__wstring(struct soap *soap, const char *s, std::wstring *t, long minlen, long maxlen) { if (s) { const wchar_t *r = soap_wstring(soap, s, minlen, maxlen); if (r) t->assign(r); } return soap->error; } #endif #endif #endif /******************************************************************************/ #ifndef WITH_LEAN static const wchar_t* soap_wstring(struct soap *soap, const char *s, long minlen, long maxlen) { if (s) { long l; wchar_t wc; soap->labidx = 0; if (soap->mode & SOAP_ENC_LATIN) { wchar_t *r; if (soap_append_lab(soap, NULL, sizeof(wchar_t) * (strlen(s) + 1))) return NULL; r = (wchar_t*)soap->labbuf; while (*s) *r++ = (wchar_t)*s++; } else { /* Convert UTF8 to wchar */ while (*s) { soap_wchar c, c1, c2, c3, c4; c = (unsigned char)*s++; if (c < 0x80) wc = (wchar_t)c; else { c1 = (soap_wchar)*s++ & 0x3F; if (c < 0xE0) wc = (wchar_t)(((soap_wchar)(c & 0x1F) << 6) | c1); else { c2 = (soap_wchar)*s++ & 0x3F; if (c < 0xF0) wc = (wchar_t)(((soap_wchar)(c & 0x0F) << 12) | (c1 << 6) | c2); else { c3 = (soap_wchar)*s++ & 0x3F; if (c < 0xF8) wc = (wchar_t)(((soap_wchar)(c & 0x07) << 18) | (c1 << 12) | (c2 << 6) | c3); else { c4 = (soap_wchar)*s++ & 0x3F; if (c < 0xFC) wc = (wchar_t)(((soap_wchar)(c & 0x03) << 24) | (c1 << 18) | (c2 << 12) | (c3 << 6) | c4); else wc = (wchar_t)(((soap_wchar)(c & 0x01) << 30) | (c1 << 24) | (c2 << 18) | (c3 << 12) | (c4 << 6) | (soap_wchar)(*s++ & 0x3F)); } } } } if (soap_append_lab(soap, (const char*)&wc, sizeof(wc))) return NULL; } } l = (long)(soap->labidx / sizeof(wchar_t)); wc = L'\0'; if (soap_append_lab(soap, (const char*)&wc, sizeof(wc))) return NULL; if ((maxlen >= 0 && l > maxlen) || l < minlen) { soap->error = SOAP_LENGTH; return NULL; } return (wchar_t*)soap->labbuf; } return NULL; } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 const char* SOAP_FMAC2 soap_wchar2s(struct soap *soap, const wchar_t *s) { soap_wchar c; char *r, *t; const wchar_t *q = s; size_t n = 0; if (!s) return NULL; while ((c = *q++)) { if (c > 0 && c < 0x80) n++; else n += 6; } r = t = (char*)soap_malloc(soap, n + 1); if (r) { /* Convert wchar to UTF8 */ while ((c = *s++)) { if (c > 0 && c < 0x80) *t++ = (char)c; else { if (c < 0x0800) *t++ = (char)(0xC0 | ((c >> 6) & 0x1F)); else { if (c < 0x010000) *t++ = (char)(0xE0 | ((c >> 12) & 0x0F)); else { if (c < 0x200000) *t++ = (char)(0xF0 | ((c >> 18) & 0x07)); else { if (c < 0x04000000) *t++ = (char)(0xF8 | ((c >> 24) & 0x03)); else { *t++ = (char)(0xFC | ((c >> 30) & 0x01)); *t++ = (char)(0x80 | ((c >> 24) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 18) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 12) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 6) & 0x3F)); } *t++ = (char)(0x80 | (c & 0x3F)); } } *t = '\0'; } return r; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outstring(struct soap *soap, const char *tag, int id, char *const*p, const char *type, int n) { id = soap_element_id(soap, tag, id, *p, NULL, 0, type, n, NULL); if (id < 0) return soap->error; if (!**p && (soap->mode & SOAP_C_NILSTRING)) return soap_element_null(soap, tag, id, type); if (soap_element_begin_out(soap, tag, id, type) || soap_string_out(soap, *p, 0) || soap_element_end_out(soap, tag)) return soap->error; return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 char ** SOAP_FMAC2 soap_instring(struct soap *soap, const char *tag, char **p, const char *type, int t, int flag, long minlen, long maxlen, const char *pattern) { (void)type; if (soap_element_begin_in(soap, tag, 1, NULL)) { if (!tag || *tag != '-' || soap->error != SOAP_NO_TAG) return NULL; soap->error = SOAP_OK; } if (!p) { if (!(p = (char**)soap_malloc(soap, sizeof(char*)))) return NULL; } if (soap->null) *p = NULL; else if (soap->body) { *p = soap_string_in(soap, flag, minlen, maxlen, pattern); if (!*p || !(char*)soap_id_enter(soap, soap->id, *p, t, sizeof(char*), NULL, NULL, NULL, NULL)) return NULL; if (!**p && tag && *tag == '-') { soap->error = SOAP_NO_TAG; return NULL; } } else if (tag && *tag == '-') { soap->error = SOAP_NO_TAG; return NULL; } else if (!*soap->href) { if (minlen > 0) { soap->error = SOAP_LENGTH; return NULL; } *p = soap_strdup(soap, SOAP_STR_EOS); } if (*soap->href) p = (char**)soap_id_lookup(soap, soap->href, (void**)p, t, sizeof(char**), 0, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outwstring(struct soap *soap, const char *tag, int id, wchar_t *const*p, const char *type, int n) { id = soap_element_id(soap, tag, id, *p, NULL, 0, type, n, NULL); if (id < 0) return soap->error; if (!**p && (soap->mode & SOAP_C_NILSTRING)) return soap_element_null(soap, tag, id, type); if (soap_element_begin_out(soap, tag, id, type) || soap_wstring_out(soap, *p, 0) || soap_element_end_out(soap, tag)) return soap->error; return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_2 SOAP_FMAC1 wchar_t ** SOAP_FMAC2 soap_inwstring(struct soap *soap, const char *tag, wchar_t **p, const char *type, int t, long minlen, long maxlen, const char *pattern) { (void)type; if (soap_element_begin_in(soap, tag, 1, NULL)) { if (!tag || *tag != '-' || soap->error != SOAP_NO_TAG) return NULL; soap->error = SOAP_OK; } if (!p) { if (!(p = (wchar_t**)soap_malloc(soap, sizeof(wchar_t*)))) return NULL; } if (soap->null) *p = NULL; else if (soap->body) { *p = soap_wstring_in(soap, 1, minlen, maxlen, pattern); if (!*p || !(wchar_t*)soap_id_enter(soap, soap->id, *p, t, sizeof(wchar_t*), NULL, NULL, NULL, NULL)) return NULL; if (!**p && tag && *tag == '-') { soap->error = SOAP_NO_TAG; return NULL; } } else if (tag && *tag == '-') { soap->error = SOAP_NO_TAG; return NULL; } else if (!*soap->href) { if (minlen > 0) { soap->error = SOAP_LENGTH; return NULL; } *p = soap_wstrdup(soap, (wchar_t*)SOAP_STR_EOS); } if (*soap->href) p = (wchar_t**)soap_id_lookup(soap, soap->href, (void**)p, t, sizeof(wchar_t**), 0, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif #endif /******************************************************************************/ #ifndef WITH_LEAN #ifdef UNDER_CE /* WinCE mktime (based on the mingw-runtime, public domain) */ #define __FILETIME_to_ll(f) ((long long)(f).dwHighDateTime << 32 | (long long)(f).dwLowDateTime) static time_t mktime(struct tm *pt) { SYSTEMTIME s, s1, s2; FILETIME f, f1, f2; long long diff; GetSystemTime(&s1); GetLocalTime(&s2); SystemTimeToFileTime(&s1, &f1); SystemTimeToFileTime(&s2, &f2); diff = (__FILETIME_to_ll(f2) - __FILETIME_to_ll(f1)) / 10000000LL; s.wYear = pt->tm_year + 1900; s.wMonth = pt->tm_mon + 1; s.wDayOfWeek = pt->tm_wday; s.wDay = pt->tm_mday; s.wHour = pt->tm_hour; s.wMinute = pt->tm_min; s.wSecond = pt->tm_sec; s.wMilliseconds = 0; SystemTimeToFileTime(&s, &f); return (time_t)((__FILETIME_to_ll(f) - 116444736000000000LL) / 10000000LL) - (time_t)diff; } #endif #endif /******************************************************************************/ #ifndef WITH_LEAN #ifdef UNDER_CE /* WinCE gmtime_r (based on the mingw-runtime, public domain) */ #define HAVE_GMTIME_R static struct tm* gmtime_r(const time_t *t, struct tm *pt) { FILETIME f, f1, f2; SYSTEMTIME s, s1 = {0}; long long time = (long long)(*t) * 10000000LL + 116444736000000000LL; f.dwHighDateTime = (DWORD)((time >> 32) & 0x00000000FFFFFFFF); f.dwLowDateTime = (DWORD)(time & 0x00000000FFFFFFFF); FileTimeToSystemTime(&f, &s); pt->tm_year = s.wYear - 1900; pt->tm_mon = s.wMonth - 1; pt->tm_wday = s.wDayOfWeek; pt->tm_mday = s.wDay; s1.wYear = s.wYear; s1.wMonth = 1; s1.wDayOfWeek = 1; s1.wDay = 1; SystemTimeToFileTime(&s1, &f1); SystemTimeToFileTime(&s, &f2); pt->tm_yday = (((__FILETIME_to_ll(f2) - __FILETIME_to_ll(f1)) / 10000000LL) / (60 * 60 * 24)); pt->tm_hour = s.wHour; pt->tm_min = s.wMinute; pt->tm_sec = s.wSecond; pt->tm_isdst = 0; return pt; } #endif #endif /******************************************************************************/ #ifndef WITH_LEAN #ifdef UNDER_CE /* WinCE very simple strftime for format "%Y-%m-%dT%H:%M:%SZ", note: %F and %T not supported by MS */ static size_t strftime(char *buf, size_t len, const char *format, const struct tm *pT) { (void)len; (void)format; #ifndef WITH_NOZONE (SOAP_SNPRINTF(buf, len, 20), "%04d-%02d-%02dT%02d:%02d:%02dZ", pT->tm_year + 1900, pT->tm_mon + 1, pT->tm_mday, pT->tm_hour, pT->tm_min, pT->tm_sec); #else (SOAP_SNPRINTF(buf, len, 20), "%04d-%02d-%02dT%02d:%02d:%02d", pT->tm_year + 1900, pT->tm_mon + 1, pT->tm_mday, pT->tm_hour, pT->tm_min, pT->tm_sec); #endif return len; } #endif #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 time_t SOAP_FMAC2 soap_timegm(struct tm *T) { #if defined(HAVE_TIMEGM) return timegm(T); #else time_t t, g, z; struct tm tm; #ifndef HAVE_GMTIME_R struct tm *tp; #endif t = mktime(T); if (t == (time_t)-1) return (time_t)-1; #ifdef HAVE_GMTIME_R if (gmtime_r(&t, &tm) == SOAP_FUNC_R_ERR) return (time_t)-1; #else tp = gmtime(&t); if (!tp) return (time_t)-1; tm = *tp; #endif tm.tm_isdst = 0; g = mktime(&tm); if (g == (time_t)-1) return (time_t)-1; z = g - t; return t - z; #endif } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 const char* SOAP_FMAC2 soap_dateTime2s(struct soap *soap, time_t n) { struct tm T, *pT = &T; #if defined(HAVE_GMTIME_R) && !defined(WITH_NOZONE) if (gmtime_r(&n, pT) != SOAP_FUNC_R_ERR) strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%SZ", pT); #elif defined(HAVE_GMTIME) && !defined(WITH_NOZONE) if ((pT = gmtime(&n))) strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%SZ", pT); #elif (defined(HAVE_TM_GMTOFF) || defined(HAVE_STRUCT_TM_TM_GMTOFF) || defined(HAVE_STRUCT_TM___TM_GMTOFF)) && !defined(WITH_NOZONE) #if defined(HAVE_LOCALTIME_R) if (localtime_r(&n, pT) != SOAP_FUNC_R_ERR) { strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S%z", pT); soap_memmove(soap->tmpbuf + 23, sizeof(soap->tmpbuf) - 23, soap->tmpbuf + 22, 3); /* 2000-03-01T02:00:00+0300 */ soap->tmpbuf[22] = ':'; /* 2000-03-01T02:00:00+03:00 */ } #else if ((pT = localtime(&n))) { strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S%z", pT); soap_memmove(soap->tmpbuf + 23, sizeof(soap->tmpbuf) - 23, soap->tmpbuf + 22, 3); /* 2000-03-01T02:00:00+0300 */ soap->tmpbuf[22] = ':'; /* 2000-03-01T02:00:00+03:00 */ } #endif #elif defined(HAVE_GETTIMEOFDAY) && !defined(WITH_NOZONE) struct timezone tz; memset((void*)&tz, 0, sizeof(tz)); #if defined(HAVE_LOCALTIME_R) if (localtime_r(&n, pT) != SOAP_FUNC_R_ERR) { struct timeval tv; size_t l; gettimeofday(&tv, &tz); strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT); l = strlen(soap->tmpbuf); (SOAP_SNPRINTF(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, 7), "%+03d:%02d", -tz.tz_minuteswest/60+(pT->tm_isdst!=0), abs(tz.tz_minuteswest)%60); } #else if ((pT = localtime(&n))) { struct timeval tv; size_t l; gettimeofday(&tv, &tz); strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT); l = strlen(soap->tmpbuf); (SOAP_SNPRINTF(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, 7), "%+03d:%02d", -tz.tz_minuteswest/60+(pT->tm_isdst!=0), abs(tz.tz_minuteswest)%60); } #endif #elif defined(HAVE_FTIME) && !defined(WITH_NOZONE) struct timeb t; memset((void*)&t, 0, sizeof(t)); #if defined(HAVE_LOCALTIME_R) if (localtime_r(&n, pT) != SOAP_FUNC_R_ERR) { size_t l; #ifdef __BORLANDC__ ::ftime(&t); #else ftime(&t); #endif strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT); l = strlen(soap->tmpbuf); (SOAP_SNPRINTF(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, 7), "%+03d:%02d", -t.timezone/60+(pT->tm_isdst!=0), abs(t.timezone)%60); } #else if ((pT = localtime(&n))) { size_t l; #ifdef __BORLANDC__ ::ftime(&t); #else ftime(&t); #endif strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT); l = strlen(soap->tmpbuf); (SOAP_SNPRINTF(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, 7), "%+03d:%02d", -t.timezone/60+(pT->tm_isdst!=0), abs(t.timezone)%60); } #endif #elif defined(HAVE_LOCALTIME_R) if (localtime_r(&n, pT) != SOAP_FUNC_R_ERR) strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT); #else if ((pT = localtime(&n))) strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT); #endif else soap_strcpy(soap->tmpbuf, sizeof(soap->tmpbuf), "1969-12-31T23:59:59Z"); return soap->tmpbuf; } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 int SOAP_FMAC2 soap_outdateTime(struct soap *soap, const char *tag, int id, const time_t *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_dateTime2s(soap, *p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 int SOAP_FMAC2 soap_s2dateTime(struct soap *soap, const char *s, time_t *p) { *p = 0; if (s) { char *t; unsigned long d; struct tm T; memset((void*)&T, 0, sizeof(T)); d = soap_strtoul(s, &t, 10); if (*t == '-') { /* YYYY-MM-DD */ T.tm_year = (int)d; T.tm_mon = (int)soap_strtoul(t + 1, &t, 10); T.tm_mday = (int)soap_strtoul(t + 1, &t, 10); } else if (!(soap->mode & SOAP_XML_STRICT)) { /* YYYYMMDD */ T.tm_year = (int)(d / 10000); T.tm_mon = (int)(d / 100 % 100); T.tm_mday = (int)(d % 100); } else return soap->error = SOAP_TYPE; if (*t == 'T' || ((*t == 't' || *t == ' ') && !(soap->mode & SOAP_XML_STRICT))) { d = soap_strtoul(t + 1, &t, 10); if (*t == ':') { /* Thh:mm:ss */ T.tm_hour = (int)d; T.tm_min = (int)soap_strtoul(t + 1, &t, 10); T.tm_sec = (int)soap_strtoul(t + 1, &t, 10); } else if (!(soap->mode & SOAP_XML_STRICT)) { /* Thhmmss */ T.tm_hour = (int)(d / 10000); T.tm_min = (int)(d / 100 % 100); T.tm_sec = (int)(d % 100); } else return soap->error = SOAP_TYPE; } if (T.tm_year == 1) T.tm_year = 70; else T.tm_year -= 1900; T.tm_mon--; if (*t == '.') { for (t++; *t; t++) if (*t < '0' || *t > '9') break; } if (*t == ' ' && !(soap->mode & SOAP_XML_STRICT)) t++; if (*t) { #ifndef WITH_NOZONE if (*t == '+' || *t == '-') { int h, m; m = (int)soap_strtol(t, &t, 10); if (*t == ':') { /* +hh:mm */ h = m; m = (int)soap_strtol(t + 1, &t, 10); if (h < 0) m = -m; } else if (!(soap->mode & SOAP_XML_STRICT)) { /* +hhmm */ h = m / 100; m = m % 100; } else { /* +hh */ h = m; m = 0; } if (*t) return soap->error = SOAP_TYPE; T.tm_min -= m; T.tm_hour -= h; /* put hour and min in range */ T.tm_hour += T.tm_min / 60; T.tm_min %= 60; if (T.tm_min < 0) { T.tm_min += 60; T.tm_hour--; } T.tm_mday += T.tm_hour / 24; T.tm_hour %= 24; if (T.tm_hour < 0) { T.tm_hour += 24; T.tm_mday--; } /* note: day of the month may be out of range, timegm() handles it */ } else if (*t != 'Z') return soap->error = SOAP_TYPE; #endif *p = soap_timegm(&T); } else /* no UTC or timezone, so assume we got a localtime */ { T.tm_isdst = -1; *p = mktime(&T); } } return soap->error; } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 time_t * SOAP_FMAC2 soap_indateTime(struct soap *soap, const char *tag, time_t *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":dateTime")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } p = (time_t*)soap_id_enter(soap, soap->id, p, t, sizeof(time_t), NULL, NULL, NULL, NULL); if (*soap->href) p = (time_t*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(time_t), 0, NULL, NULL); else if (p) { if (soap_s2dateTime(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outliteral(struct soap *soap, const char *tag, char *const*p, const char *type) { int i; const char *t = NULL; if (tag && *tag != '-') { if (soap->local_namespaces && (t = strchr(tag, ':'))) { size_t n = t - tag; if (n >= sizeof(soap->tmpbuf)) n = sizeof(soap->tmpbuf) - 1; soap_strncpy(soap->tmpbuf, sizeof(soap->tmpbuf), tag, n); for (i = 0; soap->local_namespaces[i].id; i++) if (!strcmp(soap->tmpbuf, soap->local_namespaces[i].id)) break; t++; if (soap_element(soap, t, 0, type) || soap_attribute(soap, "xmlns", soap->local_namespaces[i].ns ? soap->local_namespaces[i].ns : SOAP_STR_EOS) || soap_element_start_end_out(soap, NULL)) return soap->error; } else { t = tag; if (soap_element_begin_out(soap, t, 0, type)) return soap->error; } } if (p && *p) { if (soap_send(soap, *p)) /* send as-is */ return soap->error; } if (t) return soap_element_end_out(soap, t); return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 char ** SOAP_FMAC2 soap_inliteral(struct soap *soap, const char *tag, char **p) { if (soap_element_begin_in(soap, tag, 1, NULL)) { if (soap->error != SOAP_NO_TAG || soap_unget(soap, soap_get(soap)) == SOAP_TT) return NULL; soap->error = SOAP_OK; } if (!p) { if (!(p = (char**)soap_malloc(soap, sizeof(char*)))) return NULL; } if (soap->body || (tag && *tag == '-')) { if (tag && *tag != '-') *p = soap_string_in(soap, -1, -1, -1, NULL); else *p = soap_string_in(soap, 0, -1, -1, NULL); if (!*p) return NULL; if (!**p && tag && *tag == '-') { soap->error = SOAP_NO_TAG; return NULL; } } else if (soap->null) *p = NULL; else *p = soap_strdup(soap, SOAP_STR_EOS); if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outwliteral(struct soap *soap, const char *tag, wchar_t *const*p, const char *type) { int i; const char *t = NULL; if (tag && *tag != '-') { if (soap->local_namespaces && (t = strchr(tag, ':'))) { size_t n = t - tag; if (n >= sizeof(soap->tmpbuf)) n = sizeof(soap->tmpbuf) - 1; soap_strncpy(soap->tmpbuf, sizeof(soap->tmpbuf), tag, n); for (i = 0; soap->local_namespaces[i].id; i++) if (!strcmp(soap->tmpbuf, soap->local_namespaces[i].id)) break; t++; if (soap_element(soap, t, 0, type) || soap_attribute(soap, "xmlns", soap->local_namespaces[i].ns ? soap->local_namespaces[i].ns : SOAP_STR_EOS) || soap_element_start_end_out(soap, NULL)) return soap->error; } else { t = tag; if (soap_element_begin_out(soap, t, 0, type)) return soap->error; } } if (p) { wchar_t c; const wchar_t *s = *p; while ((c = *s++)) { if (soap_pututf8(soap, (unsigned long)c)) /* send as-is in UTF8 */ return soap->error; } } if (t) return soap_element_end_out(soap, t); return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_2 SOAP_FMAC1 wchar_t ** SOAP_FMAC2 soap_inwliteral(struct soap *soap, const char *tag, wchar_t **p) { if (soap_element_begin_in(soap, tag, 1, NULL)) { if (soap->error != SOAP_NO_TAG || soap_unget(soap, soap_get(soap)) == SOAP_TT) return NULL; soap->error = SOAP_OK; } if (!p) { if (!(p = (wchar_t**)soap_malloc(soap, sizeof(wchar_t*)))) return NULL; } if (soap->body) { if (tag && *tag != '-') *p = soap_wstring_in(soap, -1, -1, -1, NULL); else *p = soap_wstring_in(soap, 0, -1, -1, NULL); if (!*p) return NULL; if (!**p && tag && *tag == '-') { soap->error = SOAP_NO_TAG; return NULL; } } else if (tag && *tag == '-') { soap->error = SOAP_NO_TAG; return NULL; } else if (soap->null) *p = NULL; else *p = soap_wstrdup(soap, (wchar_t*)SOAP_STR_EOS); if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char * SOAP_FMAC2 soap_value(struct soap *soap) { size_t i; soap_wchar c = 0; char *s = soap->tmpbuf; if (!soap->body) return SOAP_STR_EOS; do c = soap_get(soap); while (soap_blank(c)); for (i = 0; i < sizeof(soap->tmpbuf) - 1; i++) { if (c == SOAP_TT || c == SOAP_LT || (int)c == EOF) break; *s++ = (char)c; c = soap_get(soap); } for (s--; i > 0; i--, s--) { if (!soap_blank((soap_wchar)*s)) break; } s[1] = '\0'; soap->tmpbuf[sizeof(soap->tmpbuf) - 1] = '\0'; /* appease */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element content value='%s'\n", soap->tmpbuf)); if (c == SOAP_TT || c == SOAP_LT || (int)c == EOF) soap_unget(soap, c); else { soap->error = SOAP_LENGTH; return NULL; } #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) soap->dom->text = soap_strdup(soap, soap->tmpbuf); #endif return soap->tmpbuf; /* return non-null pointer */ } #endif /******************************************************************************/ #if !defined(WITH_LEANER) || !defined(WITH_NOHTTP) #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_getline(struct soap *soap, char *buf, int len) { char *s = buf; int i = len; soap_wchar c = 0; for (;;) { while (--i > 0) { c = soap_getchar(soap); if (c == '\r' || c == '\n') break; if ((int)c == EOF) return soap->error = SOAP_CHK_EOF; *s++ = (char)c; } *s = '\0'; if (c != '\n') c = soap_getchar(soap); /* got \r or something else, now get \n */ if (c == '\n') { if (i + 1 == len) /* empty line: end of HTTP/MIME header */ break; c = soap_get0(soap); if (c != ' ' && c != '\t') /* HTTP line continuation? */ break; } else if ((int)c == EOF) return soap->error = SOAP_CHK_EOF; if (i <= 0) return soap->error = SOAP_HDR; } return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef PALM_1 static size_t soap_count_attachments(struct soap *soap) { #ifndef WITH_LEANER struct soap_multipart *content; size_t count = soap->count; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Calculating the message size with attachments, current count=%lu\n", (unsigned long)count)); if ((soap->mode & SOAP_ENC_DIME) && !(soap->mode & SOAP_ENC_MTOM)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Calculating the size of DIME attachments\n")); for (content = soap->dime.first; content; content = content->next) { count += 12 + ((content->size+3)&(~3)); if (content->id) count += ((strlen(content->id)+3)&(~3)); if (content->type) count += ((strlen(content->type)+3)&(~3)); if (content->options) count += ((((unsigned char)content->options[2] << 8) | ((unsigned char)content->options[3]))+7)&(~3); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Size of DIME attachment content is %lu bytes\n", (unsigned long)content->size)); } } if ((soap->mode & SOAP_ENC_MIME) && soap->mime.boundary) { size_t n = strlen(soap->mime.boundary); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Calculating the size of MIME attachments\n")); for (content = soap->mime.first; content; content = content->next) { const char *s; /* count \r\n--boundary\r\n */ count += 6 + n; /* count Content-Type: ...\r\n */ if (content->type) count += 16 + strlen(content->type); /* count Content-Transfer-Encoding: ...\r\n */ s = soap_code_str(mime_codes, content->encoding); if (s) count += 29 + strlen(s); /* count Content-ID: ...\r\n */ if (content->id) count += 14 + strlen(content->id); /* count Content-Location: ...\r\n */ if (content->location) count += 20 + strlen(content->location); /* count Content-Description: ...\r\n */ if (content->description) count += 23 + strlen(content->description); /* count \r\n...content */ count += 2 + content->size; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Size of MIME attachment content is %lu bytes\n", (unsigned long)content->size)); } /* count \r\n--boundary-- */ count += 6 + n; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "New count=%lu\n", (unsigned long)count)); return count; #else return soap->count; #endif } #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 static int soap_putdimefield(struct soap *soap, const char *s, size_t n) { if (soap_send_raw(soap, s, n)) return soap->error; return soap_send_raw(soap, SOAP_STR_PADDING, -(long)n&3); } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 char * SOAP_FMAC2 soap_dime_option(struct soap *soap, unsigned short optype, const char *option) { size_t n; char *s = NULL; if (option) { n = strlen(option); s = (char*)soap_malloc(soap, n + 5); if (s) { s[0] = (char)(optype >> 8); s[1] = (char)(optype & 0xFF); s[2] = (char)(n >> 8); s[3] = (char)(n & 0xFF); soap_strcpy(s + 4, n + 1, option); } } return s; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_putdimehdr(struct soap *soap) { unsigned char tmp[12]; size_t optlen = 0, idlen = 0, typelen = 0; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Put DIME header id='%s'\n", soap->dime.id ? soap->dime.id : SOAP_STR_EOS)); if (soap->dime.options) optlen = (((unsigned char)soap->dime.options[2] << 8) | ((unsigned char)soap->dime.options[3])) + 4; if (soap->dime.id) { idlen = strlen(soap->dime.id); if (idlen > 0x0000FFFF) idlen = 0x0000FFFF; } if (soap->dime.type) { typelen = strlen(soap->dime.type); if (typelen > 0x0000FFFF) typelen = 0x0000FFFF; } tmp[0] = SOAP_DIME_VERSION | (soap->dime.flags & 0x7); tmp[1] = soap->dime.flags & 0xF0; tmp[2] = (char)(optlen >> 8); tmp[3] = (char)(optlen & 0xFF); tmp[4] = (char)(idlen >> 8); tmp[5] = (char)(idlen & 0xFF); tmp[6] = (char)(typelen >> 8); tmp[7] = (char)(typelen & 0xFF); tmp[8] = (char)(soap->dime.size >> 24); tmp[9] = (char)((soap->dime.size >> 16) & 0xFF); tmp[10] = (char)((soap->dime.size >> 8) & 0xFF); tmp[11] = (char)(soap->dime.size & 0xFF); if (soap_send_raw(soap, (char*)tmp, 12) || soap_putdimefield(soap, soap->dime.options, optlen) || soap_putdimefield(soap, soap->dime.id, idlen) || soap_putdimefield(soap, soap->dime.type, typelen)) return soap->error; return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_putdime(struct soap *soap) { struct soap_multipart *content; if (!(soap->mode & SOAP_ENC_DIME)) return SOAP_OK; for (content = soap->dime.first; content; content = content->next) { void *handle; soap->dime.size = content->size; soap->dime.id = content->id; soap->dime.type = content->type; soap->dime.options = content->options; soap->dime.flags = SOAP_DIME_VERSION | SOAP_DIME_MEDIA; if (soap->fdimereadopen && ((handle = soap->fdimereadopen(soap, (void*)content->ptr, content->id, content->type, content->options)) || soap->error)) { size_t size = content->size; if (!handle) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fdimereadopen failed\n")); return soap->error; } if (!size && ((soap->mode & SOAP_ENC_XML) || (soap->mode & SOAP_IO) == SOAP_IO_CHUNK || (soap->mode & SOAP_IO) == SOAP_IO_STORE)) { size_t chunksize = sizeof(soap->tmpbuf); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Chunked streaming DIME\n")); do { size = soap->fdimeread(soap, handle, soap->tmpbuf, chunksize); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fdimeread returned %lu bytes\n", (unsigned long)size)); if (size < chunksize) { soap->dime.flags &= ~SOAP_DIME_CF; if (!content->next) soap->dime.flags |= SOAP_DIME_ME; } else soap->dime.flags |= SOAP_DIME_CF; soap->dime.size = size; if (soap_putdimehdr(soap) || soap_putdimefield(soap, soap->tmpbuf, size)) break; if (soap->dime.id) { soap->dime.flags &= ~(SOAP_DIME_MB | SOAP_DIME_MEDIA); soap->dime.id = NULL; soap->dime.type = NULL; soap->dime.options = NULL; } } while (size >= chunksize); } else { if (!content->next) soap->dime.flags |= SOAP_DIME_ME; if (soap_putdimehdr(soap)) return soap->error; do { size_t bufsize; if (size < sizeof(soap->tmpbuf)) bufsize = size; else bufsize = sizeof(soap->tmpbuf); if (!(bufsize = soap->fdimeread(soap, handle, soap->tmpbuf, bufsize))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fdimeread failed: insufficient data (%lu bytes remaining from %lu bytes)\n", (unsigned long)size, (unsigned long)content->size)); soap->error = SOAP_CHK_EOF; break; } if (soap_send_raw(soap, soap->tmpbuf, bufsize)) break; size -= bufsize; } while (size); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fdimereadclose\n")); soap_send_raw(soap, SOAP_STR_PADDING, -(long)soap->dime.size&3); } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fdimereadclose\n")); if (soap->fdimereadclose) soap->fdimereadclose(soap, handle); } else { if (!content->next) soap->dime.flags |= SOAP_DIME_ME; if (soap_putdimehdr(soap) || soap_putdimefield(soap, (char*)content->ptr, content->size)) return soap->error; } } return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 static char * soap_getdimefield(struct soap *soap, size_t n) { soap_wchar c; size_t i; char *s; char *p = NULL; if (n) { p = (char*)soap_malloc(soap, n + 1); if (p) { s = p; for (i = n; i > 0; i--) { if ((int)(c = soap_get1(soap)) == EOF) { soap->error = SOAP_CHK_EOF; return NULL; } *s++ = (char)c; } *s = '\0'; /* force NUL terminated */ if ((soap->error = soap_move(soap, (size_t)(-(long)n&3)))) return NULL; } else soap->error = SOAP_EOM; } return p; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_getdimehdr(struct soap *soap) { soap_wchar c; char *s; int i; unsigned char tmp[12]; size_t optlen, idlen, typelen; if (!(soap->mode & SOAP_ENC_DIME)) return soap->error = SOAP_DIME_END; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get DIME header\n")); if (soap->dime.buflen || soap->dime.chunksize) { if (soap_move(soap, soap->dime.size - soap_tell(soap))) return soap->error = SOAP_CHK_EOF; soap_unget(soap, soap_getchar(soap)); /* skip padding and get hdr */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "... From chunked\n")); return SOAP_OK; } s = (char*)tmp; for (i = 12; i > 0; i--) { if ((int)(c = soap_getchar(soap)) == EOF) return soap->error = SOAP_CHK_EOF; *s++ = (char)c; } if ((tmp[0] & 0xF8) != SOAP_DIME_VERSION) return soap->error = SOAP_DIME_MISMATCH; soap->dime.flags = (tmp[0] & 0x7) | (tmp[1] & 0xF0); optlen = (tmp[2] << 8) | tmp[3]; idlen = (tmp[4] << 8) | tmp[5]; typelen = (tmp[6] << 8) | tmp[7]; soap->dime.size = ((size_t)tmp[8] << 24) | ((size_t)tmp[9] << 16) | ((size_t)tmp[10] << 8) | ((size_t)tmp[11]); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DIME size=%lu flags=0x%X\n", (unsigned long)soap->dime.size, soap->dime.flags)); if (!(soap->dime.options = soap_getdimefield(soap, optlen)) && soap->error) return soap->error; if (!(soap->dime.id = soap_getdimefield(soap, idlen)) && soap->error) return soap->error; if (!(soap->dime.type = soap_getdimefield(soap, typelen)) && soap->error) return soap->error; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DIME id='%s', type='%s', options='%s'\n", soap->dime.id ? soap->dime.id : SOAP_STR_EOS, soap->dime.type ? soap->dime.type : "", soap->dime.options ? soap->dime.options+4 : SOAP_STR_EOS)); if (soap->dime.flags & SOAP_DIME_ME) soap->mode &= ~SOAP_ENC_DIME; return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_getdime(struct soap *soap) { while (soap->dime.flags & SOAP_DIME_CF) { if (soap_getdimehdr(soap)) return soap->error; if (soap_move(soap, soap->dime.size)) return soap->error = SOAP_EOF; } if (soap_move(soap, (size_t)(((soap->dime.size+3)&(~3)) - soap_tell(soap)))) return soap->error = SOAP_EOF; for (;;) { struct soap_multipart *content; if (soap_getdimehdr(soap)) break; if (soap->fdimewriteopen && ((soap->dime.ptr = (char*)soap->fdimewriteopen(soap, soap->dime.id, soap->dime.type, soap->dime.options)) || soap->error)) { const char *id, *type, *options; size_t size, n; if (!soap->dime.ptr) return soap->error; id = soap->dime.id; type = soap->dime.type; options = soap->dime.options; for (;;) { size = soap->dime.size; for (;;) { n = soap->buflen - soap->bufidx; if (size < n) n = size; if ((soap->error = soap->fdimewrite(soap, (void*)soap->dime.ptr, soap->buf + soap->bufidx, n))) break; size -= n; if (!size) { soap->bufidx += n; break; } if (soap_recv(soap)) { soap->error = SOAP_EOF; goto end; } } if (soap_move(soap, (size_t)(-(long)soap->dime.size&3))) { soap->error = SOAP_EOF; break; } if (!(soap->dime.flags & SOAP_DIME_CF)) break; if (soap_getdimehdr(soap)) break; } end: if (soap->fdimewriteclose) soap->fdimewriteclose(soap, (void*)soap->dime.ptr); soap->dime.size = 0; soap->dime.id = id; soap->dime.type = type; soap->dime.options = options; } else if (soap->dime.flags & SOAP_DIME_CF) { const char *id, *type, *options; id = soap->dime.id; type = soap->dime.type; options = soap->dime.options; if (soap_new_block(soap) == NULL) return SOAP_EOM; for (;;) { soap_wchar c; size_t i; char *s; if (soap->dime.size > SOAP_MAXDIMESIZE) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DIME size=%lu exceeds SOAP_MAXDIMESIZE=%lu\n", (unsigned long)soap->dime.size, (unsigned long)SOAP_MAXDIMESIZE)); return soap->error = SOAP_DIME_ERROR; } s = (char*)soap_push_block(soap, NULL, soap->dime.size); if (!s) return soap->error = SOAP_EOM; for (i = soap->dime.size; i > 0; i--) { if ((int)(c = soap_get1(soap)) == EOF) return soap->error = SOAP_EOF; *s++ = (char)c; } if (soap_move(soap, (size_t)(-(long)soap->dime.size&3))) return soap->error = SOAP_EOF; if (!(soap->dime.flags & SOAP_DIME_CF)) break; if (soap_getdimehdr(soap)) return soap->error; } soap->dime.size = soap->blist->size++; /* allocate one more byte in blist for the terminating '\0' */ if (!(soap->dime.ptr = soap_save_block(soap, NULL, NULL, 0))) return soap->error; soap->dime.ptr[soap->dime.size] = '\0'; /* make 0-terminated */ soap->dime.id = id; soap->dime.type = type; soap->dime.options = options; } else soap->dime.ptr = soap_getdimefield(soap, soap->dime.size); content = soap_new_multipart(soap, &soap->dime.first, &soap->dime.last, soap->dime.ptr, soap->dime.size); if (!content) return soap->error = SOAP_EOM; content->id = soap->dime.id; content->type = soap->dime.type; content->options = soap->dime.options; if (soap->error) return soap->error; soap_resolve_attachment(soap, content); } if (soap->error != SOAP_DIME_END) return soap->error; return soap->error = SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_getmimehdr(struct soap *soap) { struct soap_multipart *content; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get MIME header\n")); do { if (soap_getline(soap, soap->msgbuf, sizeof(soap->msgbuf))) return soap->error; } while (!*soap->msgbuf); if (soap->msgbuf[0] == '-' && soap->msgbuf[1] == '-') { char *s = soap->msgbuf + strlen(soap->msgbuf) - 1; /* remove white space */ while (soap_blank((soap_wchar)*s)) s--; s[1] = '\0'; if (soap->mime.boundary) { if (strcmp(soap->msgbuf + 2, soap->mime.boundary)) return soap->error = SOAP_MIME_ERROR; } else soap->mime.boundary = soap_strdup(soap, soap->msgbuf + 2); if (soap_getline(soap, soap->msgbuf, sizeof(soap->msgbuf))) return soap->error; } if (soap_set_mime_attachment(soap, NULL, 0, SOAP_MIME_NONE, NULL, NULL, NULL, NULL)) return soap->error = SOAP_EOM; content = soap->mime.last; for (;;) { char *key = soap->msgbuf; char *val; if (!*key) break; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "MIME header: %s\n", key)); val = strchr(soap->msgbuf, ':'); if (val) { *val = '\0'; do val++; while (*val && *val <= 32); if (!soap_tag_cmp(key, "Content-ID")) content->id = soap_strdup(soap, val); else if (!soap_tag_cmp(key, "Content-Location")) content->location = soap_strdup(soap, val); else if (!content->id && !soap_tag_cmp(key, "Content-Disposition")) content->id = soap_strdup(soap, soap_get_header_attribute(soap, val, "name")); else if (!soap_tag_cmp(key, "Content-Type")) content->type = soap_strdup(soap, val); else if (!soap_tag_cmp(key, "Content-Description")) content->description = soap_strdup(soap, val); else if (!soap_tag_cmp(key, "Content-Transfer-Encoding")) content->encoding = (enum soap_mime_encoding)soap_code_int(mime_codes, val, (LONG64)SOAP_MIME_NONE); } if (soap_getline(soap, key, sizeof(soap->msgbuf))) return soap->error; } return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_getmime(struct soap *soap) { while (soap_get_mime_attachment(soap, NULL)) continue; return soap->error; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_post_check_mime_attachments(struct soap *soap) { soap->imode |= SOAP_MIME_POSTCHECK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_check_mime_attachments(struct soap *soap) { if (soap->mode & SOAP_MIME_POSTCHECK) return soap_get_mime_attachment(soap, NULL) != NULL; return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 struct soap_multipart * SOAP_FMAC2 soap_get_mime_attachment(struct soap *soap, void *handle) { soap_wchar c = 0; size_t i, m = 0; char *s, *t = NULL; struct soap_multipart *content; short flag = 0; if (!(soap->mode & SOAP_ENC_MIME)) return NULL; content = soap->mime.last; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get MIME (%p)\n", content)); if (!content) { if (soap_getmimehdr(soap)) return NULL; content = soap->mime.last; } else if (content != soap->mime.first) { if (soap->fmimewriteopen && ((content->ptr = (char*)soap->fmimewriteopen(soap, (void*)handle, content->id, content->type, content->description, content->encoding)) || soap->error)) { if (!content->ptr) return NULL; } } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Parsing MIME content id='%s' type='%s'\n", content->id ? content->id : SOAP_STR_EOS, content->type ? content->type : SOAP_STR_EOS)); if (!content->ptr && soap_new_block(soap) == NULL) { soap->error = SOAP_EOM; return NULL; } for (;;) { if (content->ptr) s = soap->tmpbuf; else if (!(s = (char*)soap_push_block(soap, NULL, sizeof(soap->tmpbuf)))) { soap->error = SOAP_EOM; return NULL; } for (i = 0; i < sizeof(soap->tmpbuf); i++) { if (m > 0) { *s++ = *t++; m--; } else { if (!flag) { c = soap_getchar(soap); if ((int)c == EOF) { if (content->ptr && soap->fmimewriteclose) soap->fmimewriteclose(soap, (void*)content->ptr); soap->error = SOAP_CHK_EOF; return NULL; } } if (flag || c == '\r') { memset((void*)soap->msgbuf, 0, sizeof(soap->msgbuf)); soap_strcpy(soap->msgbuf, sizeof(soap->msgbuf), "\n--"); if (soap->mime.boundary) soap_strncat(soap->msgbuf, sizeof(soap->msgbuf), soap->mime.boundary, sizeof(soap->msgbuf) - 4); t = soap->msgbuf; do c = soap_getchar(soap); while (c == *t++); if ((int)c == EOF) { if (content->ptr && soap->fmimewriteclose) soap->fmimewriteclose(soap, (void*)content->ptr); soap->error = SOAP_CHK_EOF; return NULL; } if (!*--t) goto end; *t = (char)c; flag = (c == '\r'); m = t - soap->msgbuf + 1 - flag; t = soap->msgbuf; c = '\r'; } *s++ = (char)c; } } if (content->ptr && soap->fmimewrite) { if ((soap->error = soap->fmimewrite(soap, (void*)content->ptr, soap->tmpbuf, i))) break; } } end: *s = '\0'; /* make 0-terminated */ if (content->ptr) { if (!soap->error && soap->fmimewrite) soap->error = soap->fmimewrite(soap, (void*)content->ptr, soap->tmpbuf, i); if (soap->fmimewriteclose) soap->fmimewriteclose(soap, (void*)content->ptr); if (soap->error) return NULL; } else { content->size = soap_size_block(soap, NULL, i+1) - 1; /* last block with '\0' */ content->ptr = soap_save_block(soap, NULL, NULL, 0); } soap_resolve_attachment(soap, content); if (c == '-' && soap_getchar(soap) == '-') { soap->mode &= ~SOAP_ENC_MIME; if ((soap->mode & SOAP_MIME_POSTCHECK) && soap_end_recv(soap)) { if (soap->keep_alive < 0) soap->keep_alive = 0; soap_closesock(soap); return NULL; } } else { while (c != '\r' && (int)c != EOF && soap_blank(c)) c = soap_getchar(soap); if (c != '\r' || soap_getchar(soap) != '\n') { soap->error = SOAP_MIME_ERROR; return NULL; } if (soap_getmimehdr(soap)) return NULL; } return content; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_match_cid(struct soap *soap, const char *s, const char *t) { size_t n; if (!s) return 1; if (!strcmp(s, t)) return 0; if (!strncmp(s, "cid:", 4)) s += 4; n = strlen(t); if (*t == '<') { t++; n -= 2; } if (!strncmp(s, t, n) && !s[n]) return 0; soap_decode(soap->tmpbuf, sizeof(soap->tmpbuf), s, SOAP_STR_EOS); if (!strncmp(soap->tmpbuf, t, n) && !soap->tmpbuf[n]) return 0; return 1; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 static void soap_resolve_attachment(struct soap *soap, struct soap_multipart *content) { if (content->id) { struct soap_xlist **xp = &soap->xlist; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolving attachment data for id='%s'\n", content->id)); while (*xp) { struct soap_xlist *xq = *xp; if (!soap_match_cid(soap, xq->id, content->id)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Found matching attachment id='%s' for content id='%s'\n", xq->id, content->id)); *xp = xq->next; *xq->ptr = (unsigned char*)content->ptr; *xq->size = (int)content->size; *xq->type = (char*)content->type; if (content->options) *xq->options = (char*)content->options; else *xq->options = (char*)content->description; SOAP_FREE(soap, xq); } else xp = &(*xp)->next; } } } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_putmimehdr(struct soap *soap, struct soap_multipart *content) { const char *s; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "MIME attachment type='%s'\n", content->type ? content->type : SOAP_STR_EOS)); if (soap_send3(soap, "\r\n--", soap->mime.boundary, "\r\n")) return soap->error; if (content->type && soap_send3(soap, "Content-Type: ", content->type, "\r\n")) return soap->error; s = soap_code_str(mime_codes, content->encoding); if (s && soap_send3(soap, "Content-Transfer-Encoding: ", s, "\r\n")) return soap->error; if (content->id && soap_send3(soap, "Content-ID: ", content->id, "\r\n")) return soap->error; if (content->location && soap_send3(soap, "Content-Location: ", content->location, "\r\n")) return soap->error; if (content->description && soap_send3(soap, "Content-Description: ", content->description, "\r\n")) return soap->error; return soap_send_raw(soap, "\r\n", 2); } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_putmime(struct soap *soap) { struct soap_multipart *content; if (!(soap->mode & SOAP_ENC_MIME) || !soap->mime.boundary) return SOAP_OK; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Sending MIME attachments\n")); for (content = soap->mime.first; content; content = content->next) { void *handle; if (soap->fmimereadopen && ((handle = soap->fmimereadopen(soap, (void*)content->ptr, content->id, content->type, content->description)) || soap->error)) { size_t size = content->size; if (!handle) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fmimereadopen failed\n")); return soap->error; } if (soap_putmimehdr(soap, content)) return soap->error; if (!size) { if ((soap->mode & SOAP_ENC_XML) || (soap->mode & SOAP_IO) == SOAP_IO_CHUNK || (soap->mode & SOAP_IO) == SOAP_IO_STORE) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Chunked streaming MIME\n")); do { size = soap->fmimeread(soap, handle, soap->tmpbuf, sizeof(soap->tmpbuf)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fmimeread returned %lu bytes\n", (unsigned long)size)); if (soap_send_raw(soap, soap->tmpbuf, size)) break; } while (size); } else { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Error: cannot chunk streaming MIME (no HTTP chunking)\n")); } } else { do { size_t bufsize; if (size < sizeof(soap->tmpbuf)) bufsize = size; else bufsize = sizeof(soap->tmpbuf); if (!(bufsize = soap->fmimeread(soap, handle, soap->tmpbuf, bufsize))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fmimeread failed: insufficient data (%lu bytes remaining from %lu bytes)\n", (unsigned long)size, (unsigned long)content->size)); soap->error = SOAP_EOF; break; } if (soap_send_raw(soap, soap->tmpbuf, bufsize)) break; size -= bufsize; } while (size); } if (soap->fmimereadclose) soap->fmimereadclose(soap, handle); } else { if (soap_putmimehdr(soap, content) || soap_send_raw(soap, content->ptr, content->size)) return soap->error; } } return soap_send3(soap, "\r\n--", soap->mime.boundary, "--"); } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_set_dime(struct soap *soap) { soap->omode |= SOAP_ENC_DIME; soap->dime.first = NULL; soap->dime.last = NULL; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_set_mime(struct soap *soap, const char *boundary, const char *start) { soap->omode |= SOAP_ENC_MIME; soap->mime.first = NULL; soap->mime.last = NULL; soap->mime.boundary = soap_strdup(soap, boundary); soap->mime.start = soap_strdup(soap, start); } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_clr_dime(struct soap *soap) { soap->omode &= ~SOAP_ENC_DIME; soap->dime.first = NULL; soap->dime.last = NULL; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_clr_mime(struct soap *soap) { soap->omode &= ~SOAP_ENC_MIME; soap->mime.first = NULL; soap->mime.last = NULL; soap->mime.boundary = NULL; soap->mime.start = NULL; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 static struct soap_multipart* soap_new_multipart(struct soap *soap, struct soap_multipart **first, struct soap_multipart **last, char *ptr, size_t size) { struct soap_multipart *content; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "New MIME attachment %p (%lu)\n", ptr, (unsigned long)size)); content = (struct soap_multipart*)soap_malloc(soap, sizeof(struct soap_multipart)); if (content) { content->next = NULL; content->ptr = ptr; content->size = size; content->id = NULL; content->type = NULL; content->options = NULL; content->encoding = SOAP_MIME_NONE; content->location = NULL; content->description = NULL; if (!*first) *first = content; if (*last) (*last)->next = content; *last = content; } return content; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_set_dime_attachment(struct soap *soap, char *ptr, size_t size, const char *type, const char *id, unsigned short optype, const char *option) { struct soap_multipart *content = soap_new_multipart(soap, &soap->dime.first, &soap->dime.last, ptr, size); if (!content) return SOAP_EOM; content->id = soap_strdup(soap, id); content->type = soap_strdup(soap, type); content->options = soap_dime_option(soap, optype, option); return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_set_mime_attachment(struct soap *soap, char *ptr, size_t size, enum soap_mime_encoding encoding, const char *type, const char *id, const char *location, const char *description) { struct soap_multipart *content = soap_new_multipart(soap, &soap->mime.first, &soap->mime.last, ptr, size); if (!content) return SOAP_EOM; content->id = soap_strdup(soap, id); content->type = soap_strdup(soap, type); content->encoding = encoding; content->location = soap_strdup(soap, location); content->description = soap_strdup(soap, description); return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 struct soap_multipart* SOAP_FMAC2 soap_next_multipart(struct soap_multipart *content) { if (content) return content->next; return NULL; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 static void soap_select_mime_boundary(struct soap *soap) { while (!soap->mime.boundary || soap_valid_mime_boundary(soap)) { char *s = soap->mime.boundary; size_t n = 0; if (s) n = strlen(s); if (n < 16) { n = 64; s = soap->mime.boundary = (char*)soap_malloc(soap, n + 1); if (!s) return; } *s++ = '='; *s++ = '='; n -= 4; while (n) { *s++ = soap_base64o[soap_random & 0x3F]; n--; } *s++ = '='; *s++ = '='; *s = '\0'; } if (!soap->mime.start) soap->mime.start = ""; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 static int soap_valid_mime_boundary(struct soap *soap) { struct soap_multipart *content; size_t k; if (soap->fmimeread) return SOAP_OK; k = strlen(soap->mime.boundary); for (content = soap->mime.first; content; content = content->next) { if (content->ptr && content->size >= k) { const char *p = (const char*)content->ptr; size_t i; for (i = 0; i < content->size - k; i++, p++) { if (!strncmp(p, soap->mime.boundary, k)) return SOAP_ERR; } } } return SOAP_OK; } #endif #endif /******************************************************************************/ #ifdef WITH_GZIP #ifndef PALM_1 static int soap_getgziphdr(struct soap *soap) { int i; soap_wchar c = 0, f = 0; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get gzip header\n")); for (i = 0; i < 9; i++) { if ((int)(c = soap_get1(soap) == EOF)) return soap->error = SOAP_ZLIB_ERROR; if (i == 1 && c == 8) soap->z_dict = 0; if (i == 2) f = c; } if (f & 0x04) /* FEXTRA */ { for (i = soap_get1(soap) | (soap_get1(soap) << 8); i; i--) { if ((int)soap_get1(soap) == EOF) return soap->error = SOAP_ZLIB_ERROR; } } if (f & 0x08) /* skip FNAME */ { do c = soap_get1(soap); while (c && (int)c != EOF); } if ((int)c != EOF && (f & 0x10)) /* skip FCOMMENT */ { do c = soap_get1(soap); while (c && (int)c != EOF); } if ((int)c != EOF && (f & 0x02)) /* skip FHCRC (CRC32 is used) */ { if ((int)(c = soap_get1(soap)) != EOF) c = soap_get1(soap); } if ((int)c == EOF) return soap->error = SOAP_ZLIB_ERROR; return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_begin_serve(struct soap *soap) { #ifdef WITH_FASTCGI if (FCGI_Accept() < 0) { soap->error = SOAP_EOF; return soap_send_fault(soap); } #endif soap_begin(soap); if (soap_begin_recv(soap) || soap_envelope_begin_in(soap) || soap_recv_header(soap) || soap_body_begin_in(soap)) { if (soap->error < SOAP_STOP) { #ifdef WITH_FASTCGI soap_send_fault(soap); #else return soap_send_fault(soap); #endif } return soap_closesock(soap); } return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_begin_recv(struct soap *soap) { soap_wchar c; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Initializing for input from socket=%d/fd=%d\n", soap->socket, soap->recvfd)); soap->error = SOAP_OK; #ifndef WITH_LEANER soap->recverror = SOAP_OK; #endif soap_free_temp(soap); soap_set_local_namespaces(soap); soap->version = 0; /* don't assume we're parsing SOAP content by default */ #ifndef WITH_NOIDREF soap_free_iht(soap); #endif if ((soap->imode & SOAP_IO) == SOAP_IO_CHUNK) soap->omode |= SOAP_IO_CHUNK; soap->imode &= ~(SOAP_IO | SOAP_ENC_MIME); soap->mode = soap->imode; if (!soap->keep_alive) { soap->buflen = 0; soap->bufidx = 0; } if (!(soap->mode & SOAP_IO_KEEPALIVE)) soap->keep_alive = 0; soap->shaky = 0; soap->ahead = 0; soap->peeked = 0; soap->level = 0; soap->part = SOAP_BEGIN; soap->body = 1; soap->count = 0; soap->length = 0; soap->cdata = 0; *soap->endpoint = '\0'; soap->action = NULL; soap->header = NULL; soap->fault = NULL; soap->status = 0; soap->fform = NULL; #ifndef WITH_LEANER soap->dom = NULL; soap->dime.chunksize = 0; soap->dime.buflen = 0; soap->dime.list = NULL; soap->dime.first = NULL; soap->dime.last = NULL; soap->mime.list = NULL; soap->mime.first = NULL; soap->mime.last = NULL; soap->mime.boundary = NULL; soap->mime.start = NULL; #endif #ifdef WIN32 #ifndef UNDER_CE #ifndef WITH_FASTCGI if (!soap_valid_socket(soap->socket) && !soap->is && soap->recvfd >= 0) /* Set win32 stdin or soap->recvfd to BINARY, e.g. to support DIME */ #ifdef __BORLANDC__ setmode(soap->recvfd, _O_BINARY); #else _setmode(soap->recvfd, _O_BINARY); #endif #endif #endif #endif #ifdef WITH_ZLIB soap->mode &= ~SOAP_ENC_ZLIB; soap->zlib_in = SOAP_ZLIB_NONE; soap->zlib_out = SOAP_ZLIB_NONE; if (!soap->d_stream) { soap->d_stream = (z_stream*)SOAP_MALLOC(soap, sizeof(z_stream)); soap->d_stream->zalloc = Z_NULL; soap->d_stream->zfree = Z_NULL; soap->d_stream->opaque = Z_NULL; soap->d_stream->next_in = Z_NULL; } soap->d_stream->avail_in = 0; soap->d_stream->next_out = (Byte*)soap->buf; soap->d_stream->avail_out = sizeof(soap->buf); soap->z_ratio_in = 1.0; #endif #ifdef WITH_OPENSSL if (soap->ssl) ERR_clear_error(); #endif #ifndef WITH_LEANER if (soap->fprepareinitrecv && (soap->error = soap->fprepareinitrecv(soap))) return soap->error; #endif c = soap_getchar(soap); #ifdef WITH_GZIP if (c == 0x1F) { if (soap_getgziphdr(soap)) return soap->error; if (inflateInit2(soap->d_stream, -MAX_WBITS) != Z_OK) return soap->error = SOAP_ZLIB_ERROR; if (soap->z_dict) { if (inflateSetDictionary(soap->d_stream, (const Bytef*)soap->z_dict, soap->z_dict_len) != Z_OK) return soap->error = SOAP_ZLIB_ERROR; } soap->zlib_state = SOAP_ZLIB_INFLATE; soap->mode |= SOAP_ENC_ZLIB; soap->zlib_in = SOAP_ZLIB_GZIP; soap->z_crc = crc32(0L, NULL, 0); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "gzip initialized\n")); if (!soap->z_buf) soap->z_buf = (char*)SOAP_MALLOC(soap, sizeof(soap->buf)); soap_memcpy((void*)soap->z_buf, sizeof(soap->buf), (const void*)soap->buf, sizeof(soap->buf)); /* should not chunk over plain transport, so why bother to check? */ /* if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK) */ /* soap->z_buflen = soap->bufidx; */ /* else */ soap->d_stream->next_in = (Byte*)(soap->z_buf + soap->bufidx); soap->d_stream->avail_in = (unsigned int)(soap->buflen - soap->bufidx); soap->z_buflen = soap->buflen; soap->buflen = soap->bufidx; c = ' '; } #endif while (soap_blank(c)) c = soap_getchar(soap); #ifndef WITH_LEANER if (c == '-' && soap_get0(soap) == '-') soap->mode |= SOAP_ENC_MIME; else if ((c & 0xFFFC) == (SOAP_DIME_VERSION | SOAP_DIME_MB) && (soap_get0(soap) & 0xFFF0) == 0x20) soap->mode |= SOAP_ENC_DIME; else #endif { /* skip BOM */ if (c == 0xEF && soap_get0(soap) == 0xBB) { c = soap_get1(soap); if ((c = soap_get1(soap)) == 0xBF) { soap->mode &= ~SOAP_ENC_LATIN; c = soap_getchar(soap); } else c = (0x0F << 12) | (0xBB << 6) | (c & 0x3F); /* UTF-8 */ } else if ((c == 0xFE && soap_get0(soap) == 0xFF) /* UTF-16 BE */ || (c == 0xFF && soap_get0(soap) == 0xFE)) /* UTF-16 LE */ return soap->error = SOAP_UTF_ERROR; /* skip space */ while (soap_blank(c)) c = soap_getchar(soap); } if ((int)c == EOF) return soap->error = SOAP_CHK_EOF; soap_unget(soap, c); #ifndef WITH_NOHTTP /* if not XML/MIME/DIME/ZLIB, assume HTTP method or status line */ if (((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')) && !(soap->mode & (SOAP_ENC_MIME | SOAP_ENC_DIME | SOAP_ENC_ZLIB | SOAP_ENC_XML))) { soap_mode m = soap->imode; soap->mode &= ~SOAP_IO; soap->error = soap->fparse(soap); if (soap->error && soap->error < SOAP_STOP) { soap->keep_alive = 0; /* force close later */ return soap->error; } if (soap->error == SOAP_STOP) { if (soap->fform) { soap->error = soap->fform(soap); if (soap->error == SOAP_OK) soap->error = SOAP_STOP; /* prevents further processing */ } return soap->error; } soap->mode = soap->imode; /* if imode is changed, effectuate */ soap->imode = m; /* restore imode */ #ifdef WITH_ZLIB soap->mode &= ~SOAP_ENC_ZLIB; #endif if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK) { soap->chunkbuflen = soap->buflen; soap->buflen = soap->bufidx; soap->chunksize = 0; } /* Note: fparse should not use soap_unget to push back last char */ #if 0 if (soap->status > 200 && soap->length == 0 && !(soap->http_content && (!soap->keep_alive || soap->recv_timeout)) && (soap->imode & SOAP_IO) != SOAP_IO_CHUNK) #endif if (soap->status && !soap->body) return soap->error = soap->status; #ifdef WITH_ZLIB if (soap->zlib_in != SOAP_ZLIB_NONE) { #ifdef WITH_GZIP if (soap->zlib_in != SOAP_ZLIB_DEFLATE) { c = soap_get1(soap); if (c == (int)EOF) return soap->error = SOAP_EOF; if (c == 0x1F) { if (soap_getgziphdr(soap)) return soap->error; if (inflateInit2(soap->d_stream, -MAX_WBITS) != Z_OK) return soap->error = SOAP_ZLIB_ERROR; soap->z_crc = crc32(0L, NULL, 0); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "gzip initialized\n")); } else { soap_revget1(soap); if (inflateInit(soap->d_stream) != Z_OK) return soap->error = SOAP_ZLIB_ERROR; soap->zlib_in = SOAP_ZLIB_DEFLATE; } } else #endif if (inflateInit(soap->d_stream) != Z_OK) return soap->error = SOAP_ZLIB_ERROR; if (soap->z_dict) { if (inflateSetDictionary(soap->d_stream, (const Bytef*)soap->z_dict, soap->z_dict_len) != Z_OK) return soap->error = SOAP_ZLIB_ERROR; } soap->zlib_state = SOAP_ZLIB_INFLATE; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflate initialized\n")); soap->mode |= SOAP_ENC_ZLIB; if (!soap->z_buf) soap->z_buf = (char*)SOAP_MALLOC(soap, sizeof(soap->buf)); soap_memcpy((void*)soap->z_buf, sizeof(soap->buf), (const void*)soap->buf, sizeof(soap->buf)); soap->d_stream->next_in = (Byte*)(soap->z_buf + soap->bufidx); soap->d_stream->avail_in = (unsigned int)(soap->buflen - soap->bufidx); soap->z_buflen = soap->buflen; soap->buflen = soap->bufidx; } #endif #ifndef WITH_LEANER if (soap->fpreparerecv && (soap->mode & SOAP_IO) != SOAP_IO_CHUNK && soap->buflen > soap->bufidx) { int r; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Invoking fpreparerecv\n")); if ((r = soap->fpreparerecv(soap, soap->buf + soap->bufidx, soap->buflen - soap->bufidx))) return soap->error = r; } #endif if (soap_get0(soap) == (int)EOF) { if (soap->status == 0) return soap->error = SOAP_NO_DATA; /* server side expects data */ return soap->error = soap->status; /* client side received HTTP status code */ } if (soap->error) { if (soap->error == SOAP_FORM && soap->fform) { soap->error = soap->fform(soap); if (soap->error == SOAP_OK) soap->error = SOAP_STOP; /* prevents further processing */ } return soap->error; } } #endif #ifndef WITH_LEANER if (soap->mode & SOAP_ENC_MIME) { do /* skip preamble */ { if ((int)(c = soap_getchar(soap)) == EOF) return soap->error = SOAP_CHK_EOF; } while (c != '-' || soap_get0(soap) != '-'); soap_unget(soap, c); if (soap_getmimehdr(soap)) return soap->error; if (soap->mime.start) { do { if (!soap->mime.last->id) break; if (!soap_match_cid(soap, soap->mime.start, soap->mime.last->id)) break; } while (soap_get_mime_attachment(soap, NULL)); } if (soap_get_header_attribute(soap, soap->mime.first->type, "application/dime")) soap->mode |= SOAP_ENC_DIME; } if (soap->mode & SOAP_ENC_DIME) { if (soap_getdimehdr(soap)) return soap->error; if (soap->dime.flags & SOAP_DIME_CF) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Chunked DIME SOAP message\n")); soap->dime.chunksize = soap->dime.size; if (soap->buflen - soap->bufidx >= soap->dime.chunksize) { soap->dime.buflen = soap->buflen; soap->buflen = soap->bufidx + soap->dime.chunksize; } else soap->dime.chunksize -= soap->buflen - soap->bufidx; } soap->count = soap->buflen - soap->bufidx; } #endif return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_begin_out(struct soap *soap) { #ifndef WITH_LEANER size_t n = 0; if ((soap->mode & SOAP_ENC_MIME) && soap->mime.boundary && soap->mime.start) { const char *s; if (strlen(soap->mime.boundary) + strlen(soap->mime.start) + 140 > sizeof(soap->tmpbuf)) return soap->error = SOAP_EOM; if ((soap->mode & SOAP_ENC_DIME) && !(soap->mode & SOAP_ENC_MTOM)) s = "application/dime"; else if (soap->version == 2) { if (soap->mode & SOAP_ENC_MTOM) s = "application/xop+xml; charset=utf-8; type=\"application/soap+xml\""; else s = "application/soap+xml; charset=utf-8"; } else if (soap->mode & SOAP_ENC_MTOM) s = "application/xop+xml; charset=utf-8; type=\"text/xml\""; else s = "text/xml; charset=utf-8"; (SOAP_SNPRINTF_SAFE(soap->tmpbuf, sizeof(soap->tmpbuf)), "--%s\r\nContent-Type: %s\r\nContent-Transfer-Encoding: binary\r\nContent-ID: %s\r\n\r\n", soap->mime.boundary, s, soap->mime.start); n = strlen(soap->tmpbuf); if (soap_send_raw(soap, soap->tmpbuf, n)) return soap->error; } if (soap->mode & SOAP_IO_LENGTH) soap->dime.size = soap->count; /* DIME in MIME correction */ if (!(soap->mode & SOAP_IO_LENGTH) && (soap->mode & SOAP_ENC_DIME)) { if (soap_putdimehdr(soap)) return soap->error; } #endif if (soap->version == 0) return SOAP_OK; soap->part = SOAP_IN_ENVELOPE; return soap_element_begin_out(soap, "SOAP-ENV:Envelope", 0, NULL); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_end_out(struct soap *soap) { if (soap->version == 0) return SOAP_OK; if (soap_element_end_out(soap, "SOAP-ENV:Envelope") || soap_send_raw(soap, "\r\n", 2)) /* 2.8: always emit \r\n */ return soap->error; #ifndef WITH_LEANER if ((soap->mode & SOAP_IO_LENGTH) && (soap->mode & SOAP_ENC_DIME) && !(soap->mode & SOAP_ENC_MTOM)) { soap->dime.size = soap->count - soap->dime.size; /* DIME in MIME correction */ (SOAP_SNPRINTF(soap->id, sizeof(soap->id), strlen(soap->dime_id_format) + 20), soap->dime_id_format, 0); soap->dime.id = soap->id; if (soap->local_namespaces) { if (soap->local_namespaces[0].out) soap->dime.type = (char*)soap->local_namespaces[0].out; else soap->dime.type = (char*)soap->local_namespaces[0].ns; } soap->dime.options = NULL; soap->dime.flags = SOAP_DIME_MB | SOAP_DIME_ABSURI; if (!soap->dime.first) soap->dime.flags |= SOAP_DIME_ME; soap->count += 12 + ((strlen(soap->dime.id)+3)&(~3)) + (soap->dime.type ? ((strlen(soap->dime.type)+3)&(~3)) : 0); } if ((soap->mode & SOAP_ENC_DIME) && !(soap->mode & SOAP_ENC_MTOM)) return soap_send_raw(soap, SOAP_STR_PADDING, -(long)soap->dime.size&3); #endif soap->part = SOAP_END_ENVELOPE; return SOAP_OK; } #endif /******************************************************************************/ #ifndef WITH_LEAN #ifndef PALM_1 SOAP_FMAC1 char* SOAP_FMAC2 soap_get_http_body(struct soap *soap, size_t *len) { #ifndef WITH_LEAN size_t l = 0, n = 0; char *s; if (len) *len = 0; /* get HTTP body length */ if (!(soap->mode & SOAP_ENC_ZLIB) && (soap->mode & SOAP_IO) != SOAP_IO_CHUNK) { n = soap->length; if (!n) return NULL; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Parsing HTTP body (mode=0x%x,len=%lu)\n", soap->mode, (unsigned long)n)); #ifdef WITH_FAST soap->labidx = 0; /* use look-aside buffer */ #else if (soap_new_block(soap) == NULL) return NULL; #endif for (;;) { #ifdef WITH_FAST size_t i, k; if (soap_append_lab(soap, NULL, 0)) /* allocate more space in look-aside buffer if necessary */ return NULL; s = soap->labbuf + soap->labidx; /* space to populate */ k = soap->lablen - soap->labidx; /* number of bytes available */ soap->labidx = soap->lablen; /* claim this space */ #else size_t i, k = SOAP_BLKLEN; if (!(s = (char*)soap_push_block(soap, NULL, k))) return NULL; #endif for (i = 0; i < k; i++) { soap_wchar c; l++; if (n > 0 && l > n) goto end; c = soap_get1(soap); if ((int)c == EOF) goto end; *s++ = (char)(c & 0xFF); } } end: *s = '\0'; if (len) *len = l - 1; /* len excludes terminating \0 */ #ifdef WITH_FAST if ((s = (char*)soap_malloc(soap, l))) soap_memcpy((void*)s, l, (const void*)soap->labbuf, l); #else soap_size_block(soap, NULL, i+1); s = soap_save_block(soap, NULL, NULL, 0); #endif return s; #else if (len) *len = 0; return NULL; #endif } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_begin_in(struct soap *soap) { soap->part = SOAP_IN_ENVELOPE; if (soap_element_begin_in(soap, "SOAP-ENV:Envelope", 0, NULL)) { if (soap->error == SOAP_TAG_MISMATCH) { if (!soap_element_begin_in(soap, "Envelope", 0, NULL)) soap->error = SOAP_VERSIONMISMATCH; else if (soap->status == 0 || (soap->status >= 200 && soap->status <= 299)) return SOAP_OK; /* allow non-SOAP (REST) XML content to be captured */ soap->error = soap->status; } else if (soap->status) soap->error = soap->status; return soap->error; } soap_get_version(soap); return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_end_in(struct soap *soap) { if (soap->version == 0) return SOAP_OK; soap->part = SOAP_END_ENVELOPE; return soap_element_end_in(soap, "SOAP-ENV:Envelope"); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_body_begin_out(struct soap *soap) { if (soap->version == 1) soap->encoding = 1; #ifndef WITH_LEAN if ((soap->mode & SOAP_SEC_WSUID) && soap_set_attr(soap, "wsu:Id", "Body", 1)) return soap->error; #endif if (soap->version == 0) return SOAP_OK; soap->part = SOAP_IN_BODY; return soap_element_begin_out(soap, "SOAP-ENV:Body", 0, NULL); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_body_end_out(struct soap *soap) { if (soap->version == 0) return SOAP_OK; if (soap_element_end_out(soap, "SOAP-ENV:Body")) return soap->error; soap->part = SOAP_END_BODY; return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_body_begin_in(struct soap *soap) { if (soap->version == 0) return SOAP_OK; soap->part = SOAP_IN_BODY; if (soap_element_begin_in(soap, "SOAP-ENV:Body", 0, NULL)) return soap->error; if (!soap->body) soap->part = SOAP_NO_BODY; return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_body_end_in(struct soap *soap) { if (soap->version == 0) return SOAP_OK; if (soap->part == SOAP_NO_BODY) return soap->error = SOAP_OK; soap->part = SOAP_END_BODY; return soap_element_end_in(soap, "SOAP-ENV:Body"); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_recv_header(struct soap *soap) { if (soap_getheader(soap) && soap->error == SOAP_TAG_MISMATCH) soap->error = SOAP_OK; if (soap->error == SOAP_OK && soap->fheader) soap->error = soap->fheader(soap); return soap->error; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_set_endpoint(struct soap *soap, const char *endpoint) { const char *s; size_t i, n; soap->endpoint[0] = '\0'; soap->host[0] = '\0'; soap->path[0] = '/'; soap->path[1] = '\0'; soap->port = 80; if (!endpoint || !*endpoint) return; #ifdef WITH_OPENSSL if (!soap_tag_cmp(endpoint, "https:*")) soap->port = 443; #endif soap_strcpy(soap->endpoint, sizeof(soap->endpoint), endpoint); s = strchr(endpoint, ':'); if (s && s[1] == '/' && s[2] == '/') s += 3; else s = endpoint; n = strlen(s); if (n >= sizeof(soap->host)) n = sizeof(soap->host) - 1; #ifdef WITH_IPV6 if (s[0] == '[') { s++; for (i = 0; i < n; i++) { if (s[i] == ']') { s++; --n; break; } soap->host[i] = s[i]; } } else { for (i = 0; i < n; i++) { soap->host[i] = s[i]; if (s[i] == '/' || s[i] == ':') break; } } #else for (i = 0; i < n; i++) { soap->host[i] = s[i]; if (s[i] == '/' || s[i] == ':') break; } #endif soap->host[i] = '\0'; if (s[i] == ':') { soap->port = (int)soap_strtol(s + i + 1, NULL, 10); for (i++; i < n; i++) if (s[i] == '/') break; } if (i < n && s[i]) soap_strcpy(soap->path, sizeof(soap->path), s + i); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_connect(struct soap *soap, const char *endpoint, const char *action) { return soap_connect_command(soap, SOAP_POST, endpoint, action); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_connect_command(struct soap *soap, int http_command, const char *endpoints, const char *action) { if (endpoints) { const char *s; s = strchr(endpoints, ' '); if (s) { size_t l = strlen(endpoints); char *endpoint = (char*)SOAP_MALLOC(soap, l + 1); for (;;) { soap_strncpy(endpoint, l + 1, endpoints, s - endpoints); endpoint[s - endpoints] = '\0'; if (soap_try_connect_command(soap, http_command, endpoint, action) != SOAP_TCP_ERROR) break; if (!*s) break; soap->error = SOAP_OK; while (*s == ' ') s++; endpoints = s; s = strchr(endpoints, ' '); if (!s) s = endpoints + strlen(endpoints); } SOAP_FREE(soap, endpoint); } else soap_try_connect_command(soap, http_command, endpoints, action); } return soap->error; } #endif /******************************************************************************/ #ifndef PALM_1 static int soap_try_connect_command(struct soap *soap, int http_command, const char *endpoint, const char *action) { char host[sizeof(soap->host)]; int port; size_t count; soap->error = SOAP_OK; soap_strcpy(host, sizeof(soap->host), soap->host); /* save previous host name: if != then reconnect */ port = soap->port; /* save previous port to compare */ soap->status = http_command; soap_set_endpoint(soap, endpoint); soap->action = soap_strdup(soap, action); #ifndef WITH_LEANER if (soap->fconnect) { if ((soap->error = soap->fconnect(soap, endpoint, soap->host, soap->port))) return soap->error; } else #endif if (soap->fopen && *soap->host) { if (!soap->keep_alive || !soap_valid_socket(soap->socket) || strcmp(soap->host, host) || soap->port != port || !soap->fpoll || soap->fpoll(soap)) { soap->error = SOAP_OK; #ifndef WITH_LEAN if (!strncmp(endpoint, "soap.udp:", 9)) soap->omode |= SOAP_IO_UDP; else #endif { soap->keep_alive = 0; /* to force close */ soap->omode &= ~SOAP_IO_UDP; /* to force close */ } soap_closesock(soap); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connect/reconnect to '%s' host='%s' path='%s' port=%d\n", endpoint?endpoint:"(null)", soap->host, soap->path, soap->port)); if (!soap->keep_alive || !soap_valid_socket(soap->socket)) { soap->socket = soap->fopen(soap, endpoint, soap->host, soap->port); if (soap->error) return soap->error; soap->keep_alive = ((soap->omode & SOAP_IO_KEEPALIVE) != 0); } } } #ifdef WITH_NTLM if (soap_ntlm_handshake(soap, SOAP_GET, endpoint, soap->host, soap->port)) return soap->error; #endif count = soap_count_attachments(soap); if (soap_begin_send(soap)) return soap->error; if (http_command == SOAP_GET) { soap->mode &= ~SOAP_IO; soap->mode |= SOAP_IO_BUFFER; } #ifndef WITH_NOHTTP if ((soap->mode & SOAP_IO) != SOAP_IO_STORE && !(soap->mode & SOAP_ENC_XML) && endpoint) { unsigned int k = soap->mode; soap->mode &= ~(SOAP_IO | SOAP_ENC_ZLIB); if ((k & SOAP_IO) != SOAP_IO_FLUSH) soap->mode |= SOAP_IO_BUFFER; if ((soap->error = soap->fpost(soap, endpoint, soap->host, soap->port, soap->path, action, count))) return soap->error; #ifndef WITH_LEANER if ((k & SOAP_IO) == SOAP_IO_CHUNK) { if (soap_flush(soap)) return soap->error; } #endif soap->mode = k; } if (http_command == SOAP_GET || http_command == SOAP_DEL) return soap_end_send_flush(soap); #endif return SOAP_OK; } #endif /******************************************************************************/ #ifdef WITH_NTLM #ifndef PALM_1 static int soap_ntlm_handshake(struct soap *soap, int command, const char *endpoint, const char *host, int port) { /* requires libntlm from http://www.nongnu.org/libntlm/ */ const char *userid = (soap->proxy_userid ? soap->proxy_userid : soap->userid); const char *passwd = (soap->proxy_passwd ? soap->proxy_passwd : soap->passwd); struct SOAP_ENV__Header *oldheader; if (soap->ntlm_challenge && userid && passwd && soap->authrealm) { tSmbNtlmAuthRequest req; tSmbNtlmAuthResponse res; tSmbNtlmAuthChallenge ch; short k = soap->keep_alive; size_t l = soap->length; size_t c = soap->count; soap_mode m = soap->mode, o = soap->omode; int s = soap->status; char *a = soap->action; short v = soap->version; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "NTLM '%s'\n", soap->ntlm_challenge)); if (!*soap->ntlm_challenge) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "NTLM S->C Type 1: received NTLM authentication challenge from server\n")); /* S -> C 401 Unauthorized WWW-Authenticate: NTLM */ buildSmbNtlmAuthRequest(&req, userid, soap->authrealm); soap->ntlm_challenge = soap_s2base64(soap, (unsigned char*)(void*)&req, NULL, SmbLength(&req)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "NTLM C->S Type 2: sending NTLM authorization to server\nAuthorization: NTLM %s\n", soap->ntlm_challenge)); /* C -> S GET ... Authorization: NTLM TlRMTVNTUAABAAAAA7IAAAoACgApAAAACQAJACAAAABMSUdIVENJVFlVUlNBLU1JTk9S */ soap->omode = SOAP_IO_BUFFER; if (soap_begin_send(soap)) return soap->error; soap->keep_alive = 1; soap->status = command; if (soap->fpost(soap, endpoint, host, port, soap->path, soap->action, 0) || soap_end_send_flush(soap)) return soap->error; soap->mode = m; soap->keep_alive = k; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "NTLM S->C Type 2: waiting on server NTLM response\n")); oldheader = soap->header; if (soap_begin_recv(soap)) if (soap->error == SOAP_EOF) return soap->error; soap_end_recv(soap); soap->header = oldheader; soap->length = l; if (soap->status != 401 && soap->status != 407) return soap->error = SOAP_NTLM_ERROR; soap->error = SOAP_OK; } /* S -> C 401 Unauthorized WWW-Authenticate: NTLM TlRMTVNTUAACAAAAAAAAACgAAAABggAAU3J2Tm9uY2UAAAAAAAAAAA== */ soap_base642s(soap, soap->ntlm_challenge, (char*)&ch, sizeof(tSmbNtlmAuthChallenge), NULL); buildSmbNtlmAuthResponse(&ch, &res, userid, passwd); soap->ntlm_challenge = soap_s2base64(soap, (unsigned char*)(void*)&res, NULL, SmbLength(&res)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "NTLM C->S Type 3: sending NTLM authorization to server\nAuthorization: NTLM %s\n", soap->ntlm_challenge)); /* C -> S GET ... Authorization: NTLM TlRMTVNTUAADAAAAGAAYAHIAAAAYABgAigAAABQAFABAAAAADAAMAFQAAAASABIAYAAAAAAAAACiAAAAAYIAAFUAUgBTAEEALQBNAEkATgBPAFIAWgBhAHAAaABvAGQATABJAEcASABUAEMASQBUAFkArYfKbe/jRoW5xDxHeoxC1gBmfWiS5+iX4OAN4xBKG/IFPwfH3agtPEia6YnhsADT */ soap->userid = NULL; soap->passwd = NULL; soap->proxy_userid = NULL; soap->proxy_passwd = NULL; soap->keep_alive = k; soap->length = l; soap->count = c; soap->mode = m; soap->omode = o; soap->status = s; soap->action = a; soap->version = v; } return SOAP_OK; } #endif #endif /******************************************************************************/ #if !defined(WITH_LEAN) || defined(WITH_NTLM) SOAP_FMAC1 char* SOAP_FMAC2 soap_s2base64(struct soap *soap, const unsigned char *s, char *t, int n) { int i; unsigned long m; char *p; if (!t) t = (char*)soap_malloc(soap, (n + 2) / 3 * 4 + 1); if (!t) return NULL; p = t; t[0] = '\0'; if (!s) return p; for (; n > 2; n -= 3, s += 3) { m = s[0]; m = (m << 8) | s[1]; m = (m << 8) | s[2]; for (i = 4; i > 0; m >>= 6) t[--i] = soap_base64o[m & 0x3F]; t += 4; } t[0] = '\0'; if (n > 0) /* 0 < n <= 2 implies that t[0..4] is allocated (base64 scaling formula) */ { m = 0; for (i = 0; i < n; i++) m = (m << 8) | *s++; for (; i < 3; i++) m <<= 8; for (i = 4; i > 0; m >>= 6) t[--i] = soap_base64o[m & 0x3F]; for (i = 3; i > n; i--) t[i] = '='; t[4] = '\0'; } return p; } #endif /******************************************************************************/ #if !defined(WITH_LEAN) || defined(WITH_NTLM) SOAP_FMAC1 const char* SOAP_FMAC2 soap_base642s(struct soap *soap, const char *s, char *t, size_t l, int *n) { size_t i, j; soap_wchar c; unsigned long m; const char *p; if (!s || !*s) { if (n) *n = 0; if (soap->error) return NULL; return SOAP_NON_NULL; } if (!t) { l = (strlen(s) + 3) / 4 * 3 + 1; /* space for raw binary and \0 */ t = (char*)soap_malloc(soap, l); } if (!t) return NULL; p = t; if (n) *n = 0; for (i = 0; ; i += 3, l -= 3) { m = 0; j = 0; while (j < 4) { c = *s++; if (c == '=' || !c) { if (l >= j - 1) { switch (j) { case 2: *t++ = (char)((m >> 4) & 0xFF); i++; l--; break; case 3: *t++ = (char)((m >> 10) & 0xFF); *t++ = (char)((m >> 2) & 0xFF); i += 2; l -= 2; } } if (n) *n = (int)i; if (l) *t = '\0'; return p; } c -= '+'; if (c >= 0 && c <= 79) { int b = soap_base64i[c]; if (b >= 64) { soap->error = SOAP_TYPE; return NULL; } m = (m << 6) + b; j++; } else if (!soap_blank(c + '+')) { soap->error = SOAP_TYPE; return NULL; } } if (l < 3) { if (n) *n = (int)i; if (l) *t = '\0'; return p; } *t++ = (char)((m >> 16) & 0xFF); *t++ = (char)((m >> 8) & 0xFF); *t++ = (char)(m & 0xFF); } } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 char* SOAP_FMAC2 soap_s2hex(struct soap *soap, const unsigned char *s, char *t, int n) { char *p; if (!t) t = (char*)soap_malloc(soap, 2 * n + 1); if (!t) return NULL; p = t; t[0] = '\0'; if (s) { for (; n > 0; n--) { int m = *s++; *t++ = (char)((m >> 4) + (m > 159 ? 'a' - 10 : '0')); m &= 0x0F; *t++ = (char)(m + (m > 9 ? 'a' - 10 : '0')); } } *t++ = '\0'; return p; } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 const char* SOAP_FMAC2 soap_hex2s(struct soap *soap, const char *s, char *t, size_t l, int *n) { const char *p; if (!s || !*s) { if (n) *n = 0; if (soap->error) return NULL; return SOAP_NON_NULL; } if (!t) { l = strlen(s) / 2 + 1; /* make sure enough space for \0 */ t = (char*)soap_malloc(soap, l); } if (!t) return NULL; p = t; while (l) { int d1, d2; d1 = *s++; if (!d1) break; d2 = *s++; if (!d2) break; *t++ = (char)(((d1 >= 'A' ? (d1 & 0x7) + 9 : d1 - '0') << 4) + (d2 >= 'A' ? (d2 & 0x7) + 9 : d2 - '0')); l--; } if (n) *n = (int)(t - p); if (l) *t = '\0'; return p; } #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_puthttphdr(struct soap *soap, int status, size_t count) { if (soap->status != SOAP_GET && soap->status != SOAP_DEL && soap->status != SOAP_CONNECT) { const char *s = "text/xml; charset=utf-8"; int err = SOAP_OK; #ifndef WITH_LEANER const char *r = NULL; size_t n; #endif if ((status == SOAP_FILE || soap->status == SOAP_PUT || soap->status == SOAP_POST_FILE) && soap->http_content && !strchr(s, 10) && !strchr(s, 13)) s = soap->http_content; else if (status == SOAP_HTML) s = "text/html; charset=utf-8"; else if (count || ((soap->omode & SOAP_IO) == SOAP_IO_CHUNK)) { if (soap->version == 2) s = "application/soap+xml; charset=utf-8"; } #ifndef WITH_LEANER if (soap->mode & (SOAP_ENC_DIME | SOAP_ENC_MTOM)) { if (soap->mode & SOAP_ENC_MTOM) { if (soap->version == 2) r = "application/soap+xml"; else r = "text/xml"; s = "application/xop+xml"; } else s = "application/dime"; } if ((soap->mode & SOAP_ENC_MIME) && soap->mime.boundary) { const char *t; size_t l; n = strlen(soap->mime.boundary); (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), n + 53), "multipart/related; charset=utf-8; boundary=\"%s\"; type=\"", soap->mime.boundary); t = strchr(s, ';'); if (t) n = t - s; else n = strlen(s); l = strlen(soap->tmpbuf); if (sizeof(soap->tmpbuf) - l > n) soap_strncpy(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, s, n); if (soap->mime.start) { l = strlen(soap->tmpbuf); n = strlen(soap->mime.start); (SOAP_SNPRINTF(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, n + 10), "\"; start=\"%s", soap->mime.start); } if (r) { l = strlen(soap->tmpbuf); n = strlen(r); (SOAP_SNPRINTF(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, n + 15), "\"; start-info=\"%s", r); } l = strlen(soap->tmpbuf); if (sizeof(soap->tmpbuf) - l > 1) soap_strncpy(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, "\"", 1); } else soap_strcpy(soap->tmpbuf, sizeof(soap->tmpbuf), s); if (status == SOAP_OK && soap->version == 2 && soap->action) { size_t l = strlen(soap->tmpbuf); (SOAP_SNPRINTF(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, n + 11), "; action=\"%s\"", soap->action); } #endif if ((err = soap->fposthdr(soap, "Content-Type", soap->tmpbuf))) return err; #ifdef WITH_ZLIB if ((soap->omode & SOAP_ENC_ZLIB)) { #ifdef WITH_GZIP err = soap->fposthdr(soap, "Content-Encoding", soap->zlib_out == SOAP_ZLIB_DEFLATE ? "deflate" : "gzip"); #else err = soap->fposthdr(soap, "Content-Encoding", "deflate"); #endif if (err) return err; } #endif #ifndef WITH_LEANER if ((soap->omode & SOAP_IO) == SOAP_IO_CHUNK) err = soap->fposthdr(soap, "Transfer-Encoding", "chunked"); else #endif { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 20), SOAP_ULONG_FORMAT, (ULONG64)count); err = soap->fposthdr(soap, "Content-Length", soap->tmpbuf); } if (err) return err; } return soap->fposthdr(soap, "Connection", soap->keep_alive ? "keep-alive" : "close"); } #endif #endif /******************************************************************************/ #ifndef WITH_LEAN static const char* soap_set_validation_fault(struct soap *soap, const char *s, const char *t) { if (!t) t = SOAP_STR_EOS; if (*soap->tag) (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), strlen(s) + strlen(t) + strlen(soap->tag) + 47), "Validation constraint violation: %s%s in element '%s'", s, t, soap->tag); else (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), strlen(s) + strlen(t) + 33), "Validation constraint violation: %s%s", s, t); return soap->msgbuf; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_set_fault(struct soap *soap) { const char **c = soap_faultcode(soap); const char **s = soap_faultstring(soap); if (soap->fseterror) soap->fseterror(soap, c, s); if (!*c) { if (soap->version == 2) *c = "SOAP-ENV:Sender"; else if (soap->version == 1) *c = "SOAP-ENV:Client"; else *c = "at source"; } if (*s) return; switch (soap->error) { #ifndef WITH_LEAN case SOAP_CLI_FAULT: *s = "Client fault"; break; case SOAP_SVR_FAULT: *s = "Server fault"; break; case SOAP_TAG_MISMATCH: *s = soap_set_validation_fault(soap, "tag name or namespace mismatch", NULL); break; case SOAP_TYPE: if (*soap->type) *s = soap_set_validation_fault(soap, "type mismatch ", soap->type); else *s = soap_set_validation_fault(soap, "invalid value", NULL); break; case SOAP_SYNTAX_ERROR: *s = soap_set_validation_fault(soap, "syntax error", NULL); break; case SOAP_NO_TAG: if (soap->version == 0 && soap->level == 0) *s = soap_set_validation_fault(soap, "missing root element", NULL); else if (soap->version != 0 && soap->level < 3) *s = soap_set_validation_fault(soap, "missing SOAP message", NULL); else *s = soap_set_validation_fault(soap, "missing element", NULL); break; case SOAP_MUSTUNDERSTAND: *c = "SOAP-ENV:MustUnderstand"; (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), strlen(soap->tag) + 65), "The data in element '%s' must be understood but cannot be processed", soap->tag); *s = soap->msgbuf; break; case SOAP_VERSIONMISMATCH: *c = "SOAP-ENV:VersionMismatch"; *s = "Invalid SOAP message or SOAP version mismatch"; break; case SOAP_DATAENCODINGUNKNOWN: *c = "SOAP-ENV:DataEncodingUnknown"; *s = "Unsupported SOAP data encoding"; break; case SOAP_NAMESPACE: *s = soap_set_validation_fault(soap, "namespace error", NULL); break; case SOAP_USER_ERROR: *s = "User data access error"; break; case SOAP_FATAL_ERROR: *s = "A fatal error has occurred"; break; case SOAP_NO_METHOD: (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), strlen(soap->tag) + 66), "Method '%s' not implemented: method name or namespace not recognized", soap->tag); *s = soap->msgbuf; break; case SOAP_NO_DATA: *s = "Data required for operation"; break; case SOAP_GET_METHOD: *s = "HTTP GET method not implemented"; break; case SOAP_PUT_METHOD: *s = "HTTP PUT method not implemented"; break; case SOAP_HTTP_METHOD: *s = "HTTP method not implemented"; break; case SOAP_EOM: *s = "Out of memory"; break; case SOAP_MOE: *s = "Memory overflow or memory corruption error"; break; case SOAP_HDR: *s = "Header line too long"; break; case SOAP_IOB: *s = "Array index out of bounds"; break; case SOAP_NULL: *s = soap_set_validation_fault(soap, "nil not allowed", NULL); break; case SOAP_DUPLICATE_ID: *s = soap_set_validation_fault(soap, "multiple elements (use the SOAP_XML_TREE flag) with duplicate id ", soap->id); if (soap->version == 2) *soap_faultsubcode(soap) = "SOAP-ENC:DuplicateID"; break; case SOAP_MISSING_ID: *s = soap_set_validation_fault(soap, "missing id for ref ", soap->id); if (soap->version == 2) *soap_faultsubcode(soap) = "SOAP-ENC:MissingID"; break; case SOAP_HREF: *s = soap_set_validation_fault(soap, "incompatible object type id-ref ", soap->id); break; case SOAP_FAULT: break; #ifndef WITH_NOIO case SOAP_UDP_ERROR: *s = "Message too large for UDP packet"; break; case SOAP_TCP_ERROR: *s = tcp_error(soap); break; #endif case SOAP_HTTP_ERROR: *s = "An HTTP processing error occurred"; break; case SOAP_NTLM_ERROR: *s = "An HTTP NTLM authentication error occurred"; break; case SOAP_SSL_ERROR: #ifdef WITH_OPENSSL *s = "SSL/TLS error"; #else *s = "OpenSSL not installed: recompile with -DWITH_OPENSSL"; #endif break; case SOAP_PLUGIN_ERROR: *s = "Plugin registry error"; break; case SOAP_DIME_ERROR: *s = "DIME format error or max DIME size exceeds SOAP_MAXDIMESIZE"; break; case SOAP_DIME_HREF: *s = "DIME href to missing attachment"; break; case SOAP_DIME_MISMATCH: *s = "DIME version/transmission error"; break; case SOAP_DIME_END: *s = "End of DIME error"; break; case SOAP_MIME_ERROR: *s = "MIME format error"; break; case SOAP_MIME_HREF: *s = "MIME href to missing attachment"; break; case SOAP_MIME_END: *s = "End of MIME error"; break; case SOAP_ZLIB_ERROR: #ifdef WITH_ZLIB (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), (soap->d_stream && soap->d_stream->msg ? strlen(soap->d_stream->msg) : 0) + 19), "Zlib/gzip error: '%s'", soap->d_stream && soap->d_stream->msg ? soap->d_stream->msg : SOAP_STR_EOS); *s = soap->msgbuf; #else *s = "Zlib/gzip not installed for (de)compression: recompile with -DWITH_GZIP"; #endif break; case SOAP_REQUIRED: *s = soap_set_validation_fault(soap, "missing required attribute", NULL); break; case SOAP_PROHIBITED: *s = soap_set_validation_fault(soap, "prohibited attribute present", NULL); break; case SOAP_OCCURS: *s = soap_set_validation_fault(soap, "occurrence violation", NULL); break; case SOAP_LENGTH: *s = soap_set_validation_fault(soap, "value range or content length violation", NULL); break; case SOAP_FD_EXCEEDED: *s = "Maximum number of open connections was reached (no define HAVE_POLL): increase FD_SETSIZE"; break; case SOAP_UTF_ERROR: *s = "UTF content encoding error"; break; case SOAP_STOP: *s = "Stopped: no response sent or received (informative)"; break; #endif case SOAP_EOF: #ifndef WITH_NOIO *s = soap_strerror(soap); /* *s = soap->msgbuf */ #ifndef WITH_LEAN if (strlen(soap->msgbuf) + 25 < sizeof(soap->msgbuf)) { soap_memmove((void*)(soap->msgbuf + 25), sizeof(soap->tmpbuf) - 25, (const void*)soap->msgbuf, strlen(soap->msgbuf) + 1); if (soap->is) #if defined(__cplusplus) && !defined(WITH_COMPAT) soap_memcpy((void*)soap->msgbuf, sizeof(soap->msgbuf), (const void*)"End or bad std::istream: ", 25); #else soap_memcpy((void*)soap->msgbuf, sizeof(soap->msgbuf), (const void*)"End at NUL buffer input: ", 25); #endif else soap_memcpy((void*)soap->msgbuf, sizeof(soap->msgbuf), (const void*)"End of file or no input: ", 25); } #endif break; #else *s = "End of file or no input"; break; #endif default: #ifndef WITH_NOHTTP #ifndef WITH_LEAN if (soap->error >= 200 && soap->error < 600) { const char *t = http_error(soap, soap->error); (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), strlen(t) + 54), "Error %d: HTTP %d %s", soap->error, soap->error, t); *s = soap->msgbuf; } else #endif #endif { (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), 26), "Error %d", soap->error); *s = soap->msgbuf; } } } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_send_fault(struct soap *soap) { int status = soap->error; if (status == SOAP_OK || status == SOAP_STOP) return soap_closesock(soap); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Sending back fault struct for error code %d\n", soap->error)); soap->keep_alive = 0; /* to terminate connection */ soap_set_fault(soap); if (soap->error < 200 && soap->error != SOAP_FAULT) soap->header = NULL; if (status != SOAP_EOF || (!soap->recv_timeout && !soap->send_timeout)) { int r = 1; #ifndef WITH_NOIO if (soap->fpoll && soap->fpoll(soap)) r = 0; #ifndef WITH_LEAN else if (soap_valid_socket(soap->socket)) { r = tcp_select(soap, soap->socket, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_SND, 0); if (r > 0) { int t; if (!(r & SOAP_TCP_SELECT_SND) || ((r & SOAP_TCP_SELECT_RCV) && recv(soap->socket, (char*)&t, 1, MSG_PEEK) < 0)) r = 0; } } #endif #endif if (r > 0) { soap->error = SOAP_OK; soap->encodingStyle = NULL; /* no encodingStyle in Faults */ soap_serializeheader(soap); soap_serializefault(soap); (void)soap_begin_count(soap); if (soap->mode & SOAP_IO_LENGTH) { if (soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_putfault(soap) || soap_body_end_out(soap) || soap_envelope_end_out(soap)) return soap_closesock(soap); } (void)soap_end_count(soap); if (soap_response(soap, status) || soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_putfault(soap) || soap_body_end_out(soap) || soap_envelope_end_out(soap) || soap_end_send(soap)) return soap_closesock(soap); } } soap->error = status; return soap_closesock(soap); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_recv_fault(struct soap *soap, int check) { int status = soap->status; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Check (%d) if receiving SOAP Fault (status = %d)\n", check, status)); if (!check) { /* try getfault when no tag or tag mismatched at level 2, otherwise ret */ if (soap->error != SOAP_NO_TAG && (soap->error != SOAP_TAG_MISMATCH || soap->level != 2)) return soap->error; } else if (soap->version == 0) /* check == 1 but no SOAP: do not parse SOAP Fault */ { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Not a SOAP protocol\n")); return SOAP_OK; } soap->error = SOAP_OK; if (soap_getfault(soap)) { /* check flag set: check if SOAP Fault is present, if not just return */ if (check && soap->error == SOAP_TAG_MISMATCH && soap->level == 2) return soap->error = SOAP_OK; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Error: soap_get_soapfault() failed at level %u tag '%s'\n", soap->level, soap->tag)); *soap_faultcode(soap) = (soap->version == 2 ? "SOAP-ENV:Sender" : "SOAP-ENV:Client"); if (status) soap->error = status; else soap->error = status = SOAP_NO_DATA; soap_set_fault(soap); } else { const char *s = *soap_faultcode(soap); if (!soap_match_tag(soap, s, "SOAP-ENV:Server") || !soap_match_tag(soap, s, "SOAP-ENV:Receiver")) status = SOAP_SVR_FAULT; else if (!soap_match_tag(soap, s, "SOAP-ENV:Client") || !soap_match_tag(soap, s, "SOAP-ENV:Sender")) status = SOAP_CLI_FAULT; else if (!soap_match_tag(soap, s, "SOAP-ENV:MustUnderstand")) status = SOAP_MUSTUNDERSTAND; else if (!soap_match_tag(soap, s, "SOAP-ENV:VersionMismatch")) status = SOAP_VERSIONMISMATCH; else { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Received SOAP Fault code %s\n", s)); status = SOAP_FAULT; } if (!soap_body_end_in(soap)) soap_envelope_end_in(soap); } soap_end_recv(soap); soap->error = status; return soap_closesock(soap); } #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_send_empty_response(struct soap *soap, int httpstatuscode) { soap_mode m = soap->omode; if (!(m & SOAP_IO_UDP)) { soap->count = 0; if ((m & SOAP_IO) == SOAP_IO_CHUNK) soap->omode = (m & ~SOAP_IO) | SOAP_IO_BUFFER; soap_response(soap, httpstatuscode); soap_end_send(soap); /* force end of sends */ soap->error = SOAP_STOP; /* stops the server (from returning another response */ soap->omode = m; } return soap_closesock(soap); } #endif #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_recv_empty_response(struct soap *soap) { if (!(soap->omode & SOAP_IO_UDP)) { if (!soap_begin_recv(soap)) { if (soap->body) { if ((soap->status != 400 && soap->status != 500) || soap_envelope_begin_in(soap) || soap_recv_header(soap) || soap_body_begin_in(soap)) { #ifndef WITH_LEAN const char *s = soap_get_http_body(soap, NULL); #endif soap_end_recv(soap); #ifndef WITH_LEAN if (s) soap_set_receiver_error(soap, "HTTP Error", s, soap->status); #endif } else return soap_recv_fault(soap, 1); } else soap_end_recv(soap); } else if (soap->error == SOAP_NO_DATA || soap->error == 200 || soap->error == 202) soap->error = SOAP_OK; } return soap_closesock(soap); } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 static const char* soap_strerror(struct soap *soap) { int err = soap->errnum; *soap->msgbuf = '\0'; if (err) { #ifndef WIN32 # ifdef HAVE_STRERROR_R # ifdef _GNU_SOURCE return strerror_r(err, soap->msgbuf, sizeof(soap->msgbuf)); /* GNU-specific */ # else strerror_r(err, soap->msgbuf, sizeof(soap->msgbuf)); /* XSI-compliant */ # endif # else return strerror(err); # endif #else #ifndef UNDER_CE DWORD len; *soap->msgbuf = '\0'; len = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)soap->msgbuf, (DWORD)sizeof(soap->msgbuf), NULL); #else DWORD i, len; *soap->msgbuf = '\0'; len = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, err, 0, (LPTSTR)soap->msgbuf, (DWORD)(sizeof(soap->msgbuf)/sizeof(TCHAR)), NULL); for (i = 0; i <= len; i++) { if (((TCHAR*)soap->msgbuf)[i] < 0x80) soap->msgbuf[i] = (char)((TCHAR*)soap->msgbuf)[i]; else soap->msgbuf[i] = '?'; } #endif #endif } else { int rt = soap->recv_timeout, st = soap->send_timeout; #ifndef WITH_LEAN int ru = ' ', su = ' '; #endif soap_strcpy(soap->msgbuf, sizeof(soap->msgbuf), "message transfer interrupted"); if (rt || st) soap_strcpy(soap->msgbuf + 28, sizeof(soap->msgbuf) - 28, " or timed out"); #ifndef WITH_LEAN if (rt < 0) { rt = -rt; ru = 'u'; } if (st < 0) { st = -st; su = 'u'; } if (rt) { size_t l = strlen(soap->msgbuf); (SOAP_SNPRINTF(soap->msgbuf + l, sizeof(soap->msgbuf) - l, 36), " (%d%cs recv delay)", rt, ru); } if (st) { size_t l = strlen(soap->msgbuf); (SOAP_SNPRINTF(soap->msgbuf + l, sizeof(soap->msgbuf) - l, 36), " (%d%cs send delay)", st, su); } #endif } return soap->msgbuf; } #endif #endif /******************************************************************************/ #ifndef PALM_2 static int soap_set_error(struct soap *soap, const char *faultcode, const char *faultsubcodeQName, const char *faultstring, const char *faultdetailXML, int soaperror) { *soap_faultcode(soap) = faultcode; if (faultsubcodeQName) *soap_faultsubcode(soap) = faultsubcodeQName; *soap_faultstring(soap) = faultstring; if (faultdetailXML && *faultdetailXML) { const char **s = soap_faultdetail(soap); if (s) *s = faultdetailXML; } return soap->error = soaperror; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_set_sender_error(struct soap *soap, const char *faultstring, const char *faultdetailXML, int soaperror) { return soap_set_error(soap, soap->version == 2 ? "SOAP-ENV:Sender" : soap->version == 1 ? "SOAP-ENV:Client" : "at source", NULL, faultstring, faultdetailXML, soaperror); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_set_receiver_error(struct soap *soap, const char *faultstring, const char *faultdetailXML, int soaperror) { return soap_set_error(soap, soap->version == 2 ? "SOAP-ENV:Receiver" : soap->version == 1 ? "SOAP-ENV:Server" : "is internal", NULL, faultstring, faultdetailXML, soaperror); } #endif /******************************************************************************/ #ifndef PALM_2 static int soap_copy_fault(struct soap *soap, const char *faultcode, const char *faultsubcodeQName, const char *faultstring, const char *faultdetailXML) { char *r = NULL, *s = NULL, *t = NULL; if (faultsubcodeQName) r = soap_strdup(soap, faultsubcodeQName); if (faultstring) s = soap_strdup(soap, faultstring); if (faultdetailXML) t = soap_strdup(soap, faultdetailXML); return soap_set_error(soap, faultcode, r, s, t, SOAP_FAULT); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_sender_fault(struct soap *soap, const char *faultstring, const char *faultdetailXML) { return soap_sender_fault_subcode(soap, NULL, faultstring, faultdetailXML); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_sender_fault_subcode(struct soap *soap, const char *faultsubcodeQName, const char *faultstring, const char *faultdetailXML) { return soap_copy_fault(soap, soap->version == 2 ? "SOAP-ENV:Sender" : soap->version == 1 ? "SOAP-ENV:Client" : "at source", faultsubcodeQName, faultstring, faultdetailXML); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_receiver_fault(struct soap *soap, const char *faultstring, const char *faultdetailXML) { return soap_receiver_fault_subcode(soap, NULL, faultstring, faultdetailXML); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_receiver_fault_subcode(struct soap *soap, const char *faultsubcodeQName, const char *faultstring, const char *faultdetailXML) { return soap_copy_fault(soap, soap->version == 2 ? "SOAP-ENV:Receiver" : soap->version == 1 ? "SOAP-ENV:Server" : "is internal", faultsubcodeQName, faultstring, faultdetailXML); } #endif /******************************************************************************/ #ifndef PALM_2 #ifndef WITH_NOSTDLIB SOAP_FMAC1 void SOAP_FMAC2 soap_print_fault(struct soap *soap, FILE *fd) { if (soap_check_state(soap)) fprintf(fd, "Error: soap struct state not initialized with soap_init\n"); else if (soap->error) { const char **c, *v = NULL, *s, *d; c = soap_faultcode(soap); if (!*c) soap_set_fault(soap); if (soap->version == 2) v = soap_check_faultsubcode(soap); s = *soap_faultstring(soap); d = soap_check_faultdetail(soap); fprintf(fd, "%s%d fault %s [%s]\n\"%s\"\nDetail: %s\n", soap->version ? "SOAP 1." : "Error ", soap->version ? (int)soap->version : soap->error, *c, v ? v : "no subcode", s ? s : "[no reason]", d ? d : "[no detail]"); } } #endif #endif /******************************************************************************/ #ifdef __cplusplus #ifndef WITH_LEAN #ifndef WITH_NOSTDLIB #ifndef WITH_COMPAT SOAP_FMAC1 void SOAP_FMAC2 soap_stream_fault(struct soap *soap, std::ostream& os) { if (soap_check_state(soap)) os << "Error: soap struct state not initialized with soap_init\n"; else if (soap->error) { const char **c, *v = NULL, *s, *d; c = soap_faultcode(soap); if (!*c) soap_set_fault(soap); if (soap->version == 2) v = soap_check_faultsubcode(soap); s = *soap_faultstring(soap); d = soap_check_faultdetail(soap); os << (soap->version ? "SOAP 1." : "Error ") << (soap->version ? (int)soap->version : soap->error) << " fault " << *c << "[" << (v ? v : "no subcode") << "]" << std::endl << "\"" << (s ? s : "[no reason]") << "\"" << std::endl << "Detail: " << (d ? d : "[no detail]") << std::endl; } } #endif #endif #endif #endif /******************************************************************************/ #ifndef WITH_LEAN #ifndef WITH_NOSTDLIB SOAP_FMAC1 char* SOAP_FMAC2 soap_sprint_fault(struct soap *soap, char *buf, size_t len) { if (soap_check_state(soap)) { soap_strcpy(buf, len, "Error: soap struct not initialized with soap_init"); } else if (soap->error) { const char **c, *v = NULL, *s, *d; c = soap_faultcode(soap); if (!*c) soap_set_fault(soap); if (soap->version == 2) v = soap_check_faultsubcode(soap); s = *soap_faultstring(soap); d = soap_check_faultdetail(soap); (SOAP_SNPRINTF(buf, len, strlen(*c) + strlen(v) + strlen(s) + strlen(d) + 72), "%s%d fault %s [%s]\n\"%s\"\nDetail: %s\n", soap->version ? "SOAP 1." : "Error ", soap->version ? (int)soap->version : soap->error, *c, v ? v : "no subcode", s ? s : "[no reason]", d ? d : "[no detail]"); } return buf; } #endif #endif /******************************************************************************/ #ifndef PALM_1 #ifndef WITH_NOSTDLIB SOAP_FMAC1 void SOAP_FMAC2 soap_print_fault_location(struct soap *soap, FILE *fd) { #ifndef WITH_LEAN int i, j, c1, c2; if (soap->error && soap->error != SOAP_STOP && soap->bufidx <= soap->buflen && soap->buflen > 0 && soap->buflen <= sizeof(soap->buf)) { i = (int)soap->bufidx - 1; if (i <= 0) i = 0; c1 = soap->buf[i]; soap->buf[i] = '\0'; if ((int)soap->buflen >= i + 1024) j = i + 1023; else j = (int)soap->buflen - 1; c2 = soap->buf[j]; soap->buf[j] = '\0'; fprintf(fd, "%s%c\n\n", soap->buf, c1); if (soap->bufidx < soap->buflen) fprintf(fd, "%s\n", soap->buf + soap->bufidx); soap->buf[i] = (char)c1; soap->buf[j] = (char)c2; } #else (void)soap; (void)fd; #endif } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_register_plugin_arg(struct soap *soap, int (*fcreate)(struct soap*, struct soap_plugin*, void*), void *arg) { struct soap_plugin *p; int r; if (!(p = (struct soap_plugin*)SOAP_MALLOC(soap, sizeof(struct soap_plugin)))) return soap->error = SOAP_EOM; p->id = NULL; p->data = NULL; p->fcopy = NULL; p->fdelete = NULL; r = fcreate(soap, p, arg); if (!r && p->fdelete) { p->next = soap->plugins; soap->plugins = p; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Registered '%s' plugin\n", p->id)); return SOAP_OK; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not register plugin '%s': plugin returned error %d (or fdelete callback not set)\n", p->id ? p->id : "?", r)); SOAP_FREE(soap, p); return r; } #endif /******************************************************************************/ #ifndef PALM_1 static void * fplugin(struct soap *soap, const char *id) { struct soap_plugin *p; for (p = soap->plugins; p; p = p->next) if (p->id == id || !strcmp(p->id, id)) return p->data; return NULL; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void * SOAP_FMAC2 soap_lookup_plugin(struct soap *soap, const char *id) { return soap->fplugin(soap, id); } #endif /******************************************************************************/ #ifdef __cplusplus } #endif /******************************************************************************\ * * C++ soap struct methods * \******************************************************************************/ #ifdef __cplusplus soap::soap() { soap_init(this); /* no logs to prevent leaks when user calls soap_init() on this context */ soap_set_test_logfile(this, NULL); soap_set_sent_logfile(this, NULL); soap_set_recv_logfile(this, NULL); } #endif /******************************************************************************/ #ifdef __cplusplus soap::soap(soap_mode m) { soap_init1(this, m); } #endif /******************************************************************************/ #ifdef __cplusplus soap::soap(soap_mode im, soap_mode om) { soap_init2(this, im, om); } #endif /******************************************************************************/ #ifdef __cplusplus soap::soap(const struct soap& soap) { soap_copy_context(this, &soap); } #endif /******************************************************************************/ #ifdef __cplusplus struct soap& soap::operator=(const struct soap& soap) { soap_copy_context(this, &soap); return *this; } #endif /******************************************************************************/ #ifdef __cplusplus soap::~soap() { soap_done(this); } #endif /******************************************************************************/ gsoap-2.8.28/gsoap/stdsoap2.cpp0000644000175000017500000203723112653650160015654 0ustar ellertellert/* stdsoap2.c[pp] 2.8.28 gSOAP runtime engine gSOAP XML Web services tools Copyright (C) 2000-2016, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under ONE of the following licenses: GPL, or the gSOAP public license, or Genivia's license for commercial use. -------------------------------------------------------------------------------- Contributors: Wind River Systems Inc., for the following additions under gSOAP public license: - vxWorks compatible options -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2014, Robert van Engelen, Genivia Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #define GSOAP_LIB_VERSION 20828 #ifdef AS400 # pragma convert(819) /* EBCDIC to ASCII */ #endif #include "stdsoap2.h" #if GSOAP_VERSION != GSOAP_LIB_VERSION # error "GSOAP VERSION MISMATCH IN LIBRARY: PLEASE REINSTALL PACKAGE" #endif #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE) # include #endif #ifdef __BORLANDC__ # pragma warn -8060 #else # ifdef WIN32 # ifdef UNDER_CE # pragma comment(lib, "ws2.lib") /* WinCE */ # else # pragma comment(lib, "Ws2_32.lib") # endif # pragma warning(disable : 4996) /* disable deprecation warnings */ # endif #endif #ifdef __cplusplus SOAP_SOURCE_STAMP("@(#) stdsoap2.cpp ver 2.8.28 2016-02-01 00:00:00 GMT") extern "C" { #else SOAP_SOURCE_STAMP("@(#) stdsoap2.c ver 2.8.28 2016-02-01 00:00:00 GMT") #endif /* 8bit character representing unknown character entity or multibyte data */ #ifndef SOAP_UNKNOWN_CHAR # define SOAP_UNKNOWN_CHAR (0x7F) #endif /* unicode character representing unknown characters outside the XML 1.0 UTF8 unicode space */ #ifdef WITH_REPLACE_ILLEGAL_UTF8 # ifndef SOAP_UNKNOWN_UNICODE_CHAR # define SOAP_UNKNOWN_UNICODE_CHAR (0xFFFD) # endif #endif /* EOF=-1 */ #define SOAP_LT (soap_wchar)(-2) /* XML-specific '<' */ #define SOAP_TT (soap_wchar)(-3) /* XML-specific '' */ #define SOAP_QT (soap_wchar)(-5) /* XML-specific '"' */ #define SOAP_AP (soap_wchar)(-6) /* XML-specific ''' */ #define soap_blank(c) ((c)+1 > 0 && (c) <= 32) #define soap_notblank(c) ((c) > 32) #if defined(WIN32) && !defined(UNDER_CE) #define soap_hash_ptr(p) ((PtrToUlong(p) >> 3) & (SOAP_PTRHASH - 1)) #else #define soap_hash_ptr(p) ((size_t)(((unsigned long)(p) >> 3) & (SOAP_PTRHASH-1))) #endif #if !defined(WITH_LEAN) || defined(SOAP_DEBUG) static void soap_init_logs(struct soap*); #endif #ifdef SOAP_DEBUG static void soap_close_logfile(struct soap*, int); static void soap_set_logfile(struct soap*, int, const char*); #endif #ifdef SOAP_MEM_DEBUG static void soap_init_mht(struct soap*); static void soap_free_mht(struct soap*); static void soap_track_unlink(struct soap*, const void*); #endif #ifndef PALM_2 static int soap_set_error(struct soap*, const char*, const char*, const char*, const char*, int); static int soap_copy_fault(struct soap*, const char*, const char*, const char*, const char*); static int soap_getattrval(struct soap*, char*, size_t*, soap_wchar); #endif #ifndef PALM_1 static void soap_free_ns(struct soap *soap); static soap_wchar soap_char(struct soap*); static soap_wchar soap_get_pi(struct soap*); static int soap_isxdigit(int); static void *fplugin(struct soap*, const char*); static size_t soap_count_attachments(struct soap *soap); static int soap_try_connect_command(struct soap*, int http_command, const char *endpoint, const char *action); #ifdef WITH_NTLM static int soap_ntlm_handshake(struct soap *soap, int command, const char *endpoint, const char *host, int port); #endif #ifndef WITH_NOIDREF static int soap_has_copies(struct soap*, const char*, const char*); static int soap_type_punned(struct soap*, const struct soap_ilist*); static int soap_is_shaky(struct soap*, void*); static void soap_init_iht(struct soap*); static void soap_free_iht(struct soap*); #endif static void soap_init_pht(struct soap*); static void soap_free_pht(struct soap*); #endif #ifndef WITH_LEAN static const char *soap_set_validation_fault(struct soap*, const char*, const char*); static int soap_isnumeric(struct soap*, const char*); static struct soap_nlist *soap_push_ns(struct soap *soap, const char *id, const char *ns, short utilized); static void soap_utilize_ns(struct soap *soap, const char *tag); static const wchar_t* soap_wstring(struct soap *soap, const char *s, long minlen, long maxlen); #endif #ifndef PALM_2 static const char* soap_string(struct soap *soap, const char *s, long minlen, long maxlen); static const char* soap_QName(struct soap *soap, const char *s, long minlen, long maxlen); #endif #ifndef WITH_LEANER #ifndef PALM_1 static struct soap_multipart *soap_new_multipart(struct soap*, struct soap_multipart**, struct soap_multipart**, char*, size_t); static int soap_putdimefield(struct soap*, const char*, size_t); static char *soap_getdimefield(struct soap*, size_t); static void soap_select_mime_boundary(struct soap*); static int soap_valid_mime_boundary(struct soap*); static void soap_resolve_attachment(struct soap*, struct soap_multipart*); #endif #endif #ifdef WITH_GZIP static int soap_getgziphdr(struct soap*); #endif #ifdef WITH_OPENSSL # ifndef SOAP_SSL_RSA_BITS # define SOAP_SSL_RSA_BITS 2048 # endif static int soap_ssl_init_done = 0; static int ssl_auth_init(struct soap*); static int ssl_verify_callback(int, X509_STORE_CTX*); static int ssl_verify_callback_allow_expired_certificate(int, X509_STORE_CTX*); static int ssl_password(char*, int, int, void *); #endif #ifdef WITH_GNUTLS # ifndef SOAP_SSL_RSA_BITS # define SOAP_SSL_RSA_BITS 2048 # endif static int soap_ssl_init_done = 0; static int ssl_auth_init(struct soap*); static const char *ssl_verify(struct soap *soap, const char *host); # if defined(HAVE_PTHREAD_H) # include /* make GNUTLS thread safe with pthreads */ GCRY_THREAD_OPTION_PTHREAD_IMPL; # elif defined(HAVE_PTH_H) #include /* make GNUTLS thread safe with PTH */ GCRY_THREAD_OPTION_PTH_IMPL; # endif #endif #ifdef WITH_SYSTEMSSL static int ssl_auth_init(struct soap*); static int ssl_recv(int sk, void *s, int n, char *user); static int ssl_send(int sk, void *s, int n, char *user); #endif #if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) #ifndef PALM_1 static const char *soap_decode(char*, size_t, const char*, const char*); #endif #endif #ifndef WITH_NOHTTP #ifndef PALM_1 static soap_wchar soap_getchunkchar(struct soap*); static const char *http_error(struct soap*, int); static int http_get(struct soap*); static int http_405(struct soap*); static int http_200(struct soap*); static int http_post(struct soap*, const char*, const char*, int, const char*, const char*, size_t); static int http_send_header(struct soap*, const char*); static int http_post_header(struct soap*, const char*, const char*); static int http_response(struct soap*, int, size_t); static int http_parse(struct soap*); static int http_parse_header(struct soap*, const char*, const char*); #endif #endif #ifndef WITH_NOIO #ifndef PALM_1 static int fsend(struct soap*, const char*, size_t); static size_t frecv(struct soap*, char*, size_t); static int tcp_init(struct soap*); static const char *tcp_error(struct soap*); #ifndef WITH_IPV6 static int tcp_gethost(struct soap*, const char *addr, struct in_addr *inaddr); #endif static SOAP_SOCKET tcp_connect(struct soap*, const char *endpoint, const char *host, int port); static SOAP_SOCKET tcp_accept(struct soap*, SOAP_SOCKET, struct sockaddr*, int*); static int tcp_select(struct soap*, SOAP_SOCKET, int, int); static int tcp_disconnect(struct soap*); static int tcp_closesocket(struct soap*, SOAP_SOCKET); static int tcp_shutdownsocket(struct soap*, SOAP_SOCKET, int); static const char *soap_strerror(struct soap*); #endif #define SOAP_TCP_SELECT_RCV 0x1 #define SOAP_TCP_SELECT_SND 0x2 #define SOAP_TCP_SELECT_ERR 0x4 #define SOAP_TCP_SELECT_ALL 0x7 #if defined(WIN32) #define SOAP_SOCKBLOCK(fd) \ { u_long blocking = 0; \ ioctlsocket(fd, FIONBIO, &blocking); \ } #define SOAP_SOCKNONBLOCK(fd) \ { u_long nonblocking = 1; \ ioctlsocket(fd, FIONBIO, &nonblocking); \ } #elif defined(VXWORKS) #define SOAP_SOCKBLOCK(fd) \ { u_long blocking = 0; \ ioctl(fd, FIONBIO, (int)(&blocking)); \ } #define SOAP_SOCKNONBLOCK(fd) \ { u_long nonblocking = 1; \ ioctl(fd, FIONBIO, (int)(&nonblocking)); \ } #elif defined(__VMS) #define SOAP_SOCKBLOCK(fd) \ { int blocking = 0; \ ioctl(fd, FIONBIO, &blocking); \ } #define SOAP_SOCKNONBLOCK(fd) \ { int nonblocking = 1; \ ioctl(fd, FIONBIO, &nonblocking); \ } #elif defined(PALM) #define SOAP_SOCKBLOCK(fd) fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0)&~O_NONBLOCK); #define SOAP_SOCKNONBLOCK(fd) fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0)|O_NONBLOCK); #elif defined(SYMBIAN) #define SOAP_SOCKBLOCK(fd) \ { long blocking = 0; \ ioctl(fd, 0/*FIONBIO*/, &blocking); \ } #define SOAP_SOCKNONBLOCK(fd) \ { long nonblocking = 1; \ ioctl(fd, 0/*FIONBIO*/, &nonblocking); \ } #else #define SOAP_SOCKBLOCK(fd) fcntl(fd, F_SETFL, fcntl(fd, F_GETFL)&~O_NONBLOCK); #define SOAP_SOCKNONBLOCK(fd) fcntl(fd, F_SETFL, fcntl(fd, F_GETFL)|O_NONBLOCK); #endif #endif #if defined(PALM) && !defined(PALM_2) unsigned short errno; #endif #ifndef PALM_1 static const char soap_env1[42] = "http://schemas.xmlsoap.org/soap/envelope/"; static const char soap_enc1[42] = "http://schemas.xmlsoap.org/soap/encoding/"; static const char soap_env2[40] = "http://www.w3.org/2003/05/soap-envelope"; static const char soap_enc2[40] = "http://www.w3.org/2003/05/soap-encoding"; static const char soap_rpc[35] = "http://www.w3.org/2003/05/soap-rpc"; #endif #ifndef PALM_1 const union soap_double_nan soap_double_nan = {{0xFFFFFFFF, 0xFFFFFFFF}}; const char soap_base64o[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; const char soap_base64i[81] = "\76XXX\77\64\65\66\67\70\71\72\73\74\75XXXXXXX\00\01\02\03\04\05\06\07\10\11\12\13\14\15\16\17\20\21\22\23\24\25\26\27\30\31XXXXXX\32\33\34\35\36\37\40\41\42\43\44\45\46\47\50\51\52\53\54\55\56\57\60\61\62\63"; #endif #ifndef WITH_LEAN static const char soap_indent[21] = "\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"; /* Alternative indentation form for SOAP_XML_INDENT: static const char soap_indent[41] = "\n "; */ #endif #ifndef SOAP_CANARY # define SOAP_CANARY (0xC0DE) #endif static const char soap_padding[4] = "\0\0\0"; #define SOAP_STR_PADDING (soap_padding) #define SOAP_STR_EOS (soap_padding) #define SOAP_NON_NULL (soap_padding) #ifndef WITH_LEAN static const struct soap_code_map html_entity_codes[] = /* entities for XHTML parsing */ { { 160, "nbsp" }, { 161, "iexcl" }, { 162, "cent" }, { 163, "pound" }, { 164, "curren" }, { 165, "yen" }, { 166, "brvbar" }, { 167, "sect" }, { 168, "uml" }, { 169, "copy" }, { 170, "ordf" }, { 171, "laquo" }, { 172, "not" }, { 173, "shy" }, { 174, "reg" }, { 175, "macr" }, { 176, "deg" }, { 177, "plusmn" }, { 178, "sup2" }, { 179, "sup3" }, { 180, "acute" }, { 181, "micro" }, { 182, "para" }, { 183, "middot" }, { 184, "cedil" }, { 185, "sup1" }, { 186, "ordm" }, { 187, "raquo" }, { 188, "frac14" }, { 189, "frac12" }, { 190, "frac34" }, { 191, "iquest" }, { 192, "Agrave" }, { 193, "Aacute" }, { 194, "Acirc" }, { 195, "Atilde" }, { 196, "Auml" }, { 197, "Aring" }, { 198, "AElig" }, { 199, "Ccedil" }, { 200, "Egrave" }, { 201, "Eacute" }, { 202, "Ecirc" }, { 203, "Euml" }, { 204, "Igrave" }, { 205, "Iacute" }, { 206, "Icirc" }, { 207, "Iuml" }, { 208, "ETH" }, { 209, "Ntilde" }, { 210, "Ograve" }, { 211, "Oacute" }, { 212, "Ocirc" }, { 213, "Otilde" }, { 214, "Ouml" }, { 215, "times" }, { 216, "Oslash" }, { 217, "Ugrave" }, { 218, "Uacute" }, { 219, "Ucirc" }, { 220, "Uuml" }, { 221, "Yacute" }, { 222, "THORN" }, { 223, "szlig" }, { 224, "agrave" }, { 225, "aacute" }, { 226, "acirc" }, { 227, "atilde" }, { 228, "auml" }, { 229, "aring" }, { 230, "aelig" }, { 231, "ccedil" }, { 232, "egrave" }, { 233, "eacute" }, { 234, "ecirc" }, { 235, "euml" }, { 236, "igrave" }, { 237, "iacute" }, { 238, "icirc" }, { 239, "iuml" }, { 240, "eth" }, { 241, "ntilde" }, { 242, "ograve" }, { 243, "oacute" }, { 244, "ocirc" }, { 245, "otilde" }, { 246, "ouml" }, { 247, "divide" }, { 248, "oslash" }, { 249, "ugrave" }, { 250, "uacute" }, { 251, "ucirc" }, { 252, "uuml" }, { 253, "yacute" }, { 254, "thorn" }, { 255, "yuml" }, { 0, NULL } }; #endif #ifndef WITH_NOIO #ifndef WITH_LEAN static const struct soap_code_map h_error_codes[] = { #ifdef HOST_NOT_FOUND { HOST_NOT_FOUND, "Host not found" }, #endif #ifdef TRY_AGAIN { TRY_AGAIN, "Try Again" }, #endif #ifdef NO_RECOVERY { NO_RECOVERY, "No Recovery" }, #endif #ifdef NO_DATA { NO_DATA, "No Data" }, #endif #ifdef NO_ADDRESS { NO_ADDRESS, "No Address" }, #endif { 0, NULL } }; #endif #endif #ifndef WITH_NOHTTP #ifndef WITH_LEAN static const struct soap_code_map h_http_error_codes[] = { { 200, "OK" }, { 201, "Created" }, { 202, "Accepted" }, { 203, "Non-Authoritative Information" }, { 204, "No Content" }, { 205, "Reset Content" }, { 206, "Partial Content" }, { 300, "Multiple Choices" }, { 301, "Moved Permanently" }, { 302, "Found" }, { 303, "See Other" }, { 304, "Not Modified" }, { 305, "Use Proxy" }, { 307, "Temporary Redirect" }, { 400, "Bad Request" }, { 401, "Unauthorized" }, { 402, "Payment Required" }, { 403, "Forbidden" }, { 404, "Not Found" }, { 405, "Method Not Allowed" }, { 406, "Not Acceptable" }, { 407, "Proxy Authentication Required" }, { 408, "Request Time-out" }, { 409, "Conflict" }, { 410, "Gone" }, { 411, "Length Required" }, { 412, "Precondition Failed" }, { 413, "Request Entity Too Large" }, { 414, "Request-URI Too Large" }, { 415, "Unsupported Media Type" }, { 416, "Requested range not satisfiable" }, { 417, "Expectation Failed" }, { 500, "Internal Server Error" }, { 501, "Not Implemented" }, { 502, "Bad Gateway" }, { 503, "Service Unavailable" }, { 504, "Gateway Time-out" }, { 505, "HTTP Version not supported" }, { 0, NULL } }; #endif #endif #ifdef WITH_OPENSSL static const struct soap_code_map h_ssl_error_codes[] = { #define _SSL_ERROR(e) { e, #e } _SSL_ERROR(SSL_ERROR_SSL), _SSL_ERROR(SSL_ERROR_ZERO_RETURN), _SSL_ERROR(SSL_ERROR_WANT_READ), _SSL_ERROR(SSL_ERROR_WANT_WRITE), _SSL_ERROR(SSL_ERROR_WANT_CONNECT), _SSL_ERROR(SSL_ERROR_WANT_X509_LOOKUP), _SSL_ERROR(SSL_ERROR_SYSCALL), { 0, NULL } }; #endif #ifndef WITH_LEANER static const struct soap_code_map mime_codes[] = { { SOAP_MIME_7BIT, "7bit" }, { SOAP_MIME_8BIT, "8bit" }, { SOAP_MIME_BINARY, "binary" }, { SOAP_MIME_QUOTED_PRINTABLE, "quoted-printable" }, { SOAP_MIME_BASE64, "base64" }, { SOAP_MIME_IETF_TOKEN, "ietf-token" }, { SOAP_MIME_X_TOKEN, "x-token" }, { 0, NULL } }; #endif #ifdef WIN32 static int tcp_done = 0; #endif #if defined(HP_UX) && defined(HAVE_GETHOSTBYNAME_R) extern int h_errno; #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 static int fsend(struct soap *soap, const char *s, size_t n) { int nwritten, err; SOAP_SOCKET sk; #if defined(__cplusplus) && !defined(WITH_COMPAT) if (soap->os) { soap->os->write(s, (std::streamsize)n); if (soap->os->good()) return SOAP_OK; soap->errnum = 0; return SOAP_EOF; } #endif sk = soap->sendsk; if (!soap_valid_socket(sk)) sk = soap->socket; while (n) { if (soap_valid_socket(sk)) { if (soap->send_timeout) { for (;;) { int r; #ifdef WITH_OPENSSL if (soap->ssl) r = tcp_select(soap, sk, SOAP_TCP_SELECT_ALL, soap->send_timeout); else #endif #ifdef WITH_GNUTLS if (soap->session) r = tcp_select(soap, sk, SOAP_TCP_SELECT_ALL, soap->send_timeout); else #endif #ifdef WITH_SYSTEMSSL if (soap->ssl) r = tcp_select(soap, sk, SOAP_TCP_SELECT_ALL, soap->send_timeout); else #endif r = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, soap->send_timeout); if (r > 0) break; if (!r) return SOAP_EOF; err = soap->errnum; if (!err) return soap->error; if (err != SOAP_EAGAIN && err != SOAP_EWOULDBLOCK) return SOAP_EOF; } } #ifdef WITH_OPENSSL if (soap->ssl) nwritten = SSL_write(soap->ssl, s, (int)n); else if (soap->bio) nwritten = BIO_write(soap->bio, s, (int)n); else #endif #ifdef WITH_GNUTLS if (soap->session) nwritten = gnutls_record_send(soap->session, s, n); else #endif #ifdef WITH_SYSTEMSSL if (soap->ssl) { err = gsk_secure_socket_write(soap->ssl, (char*)s, n, &nwritten); if (err != GSK_OK) nwritten = 0; } else #endif #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) { if (soap->peerlen) nwritten = sendto(sk, (char*)s, (SOAP_WINSOCKINT)n, soap->socket_flags, &soap->peer.addr, (SOAP_WINSOCKINT)soap->peerlen); else nwritten = send(sk, s, (SOAP_WINSOCKINT)n, soap->socket_flags); /* retry and back-off algorithm */ /* TODO: this is not very clear from specs so verify and limit conditions under which we should loop (e.g. ENOBUFS) */ if (nwritten < 0) { int udp_repeat; int udp_delay; if ((soap->connect_flags & SO_BROADCAST)) udp_repeat = 2; /* SOAP-over-UDP MULTICAST_UDP_REPEAT - 1 */ else udp_repeat = 1; /* SOAP-over-UDP UNICAST_UDP_REPEAT - 1 */ udp_delay = ((unsigned int)soap_random % 201) + 50; /* UDP_MIN_DELAY .. UDP_MAX_DELAY */ do { tcp_select(soap, sk, SOAP_TCP_SELECT_ERR, -1000 * udp_delay); if (soap->peerlen) nwritten = sendto(sk, (char*)s, (SOAP_WINSOCKINT)n, soap->socket_flags, &soap->peer.addr, (SOAP_WINSOCKINT)soap->peerlen); else nwritten = send(sk, s, (SOAP_WINSOCKINT)n, soap->socket_flags); udp_delay <<= 1; if (udp_delay > 500) /* UDP_UPPER_DELAY */ udp_delay = 500; } while (nwritten < 0 && --udp_repeat > 0); } if (nwritten < 0) { err = soap_socket_errno(sk); if (err && err != SOAP_EINTR) { soap->errnum = err; return SOAP_EOF; } nwritten = 0; /* and call write() again */ } } else #endif #if !defined(PALM) && !defined(AS400) nwritten = send(sk, s, (int)n, soap->socket_flags); #else nwritten = send(sk, (void*)s, n, soap->socket_flags); #endif if (nwritten <= 0) { int r = 0; err = soap_socket_errno(sk); #ifdef WITH_OPENSSL if (soap->ssl && (r = SSL_get_error(soap->ssl, nwritten)) != SSL_ERROR_NONE && r != SSL_ERROR_WANT_READ && r != SSL_ERROR_WANT_WRITE) { soap->errnum = err; return SOAP_EOF; } #endif #ifdef WITH_GNUTLS if (soap->session) { if (nwritten == GNUTLS_E_INTERRUPTED) err = SOAP_EINTR; else if (nwritten == GNUTLS_E_AGAIN) err = SOAP_EAGAIN; } #endif if (err == SOAP_EWOULDBLOCK || err == SOAP_EAGAIN) { #if defined(WITH_OPENSSL) if (soap->ssl && r == SSL_ERROR_WANT_READ) r = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, soap->send_timeout ? soap->send_timeout : -10000); else #elif defined(WITH_GNUTLS) if (soap->session && !gnutls_record_get_direction(soap->session)) r = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, soap->send_timeout ? soap->send_timeout : -10000); else #endif r = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, soap->send_timeout ? soap->send_timeout : -10000); if (!r && soap->send_timeout) return SOAP_EOF; if (r < 0) return SOAP_EOF; } else if (err && err != SOAP_EINTR) { soap->errnum = err; return SOAP_EOF; } nwritten = 0; /* and call write() again */ } } else { #ifdef WITH_FASTCGI nwritten = fwrite((void*)s, 1, n, stdout); fflush(stdout); #else #ifdef UNDER_CE nwritten = fwrite(s, 1, n, soap->sendfd); #else #ifdef VXWORKS #ifdef WMW_RPM_IO if (soap->rpmreqid) nwritten = (httpBlockPut(soap->rpmreqid, (char*)s, n) == 0) ? n : -1; else #endif nwritten = fwrite(s, sizeof(char), n, fdopen(soap->sendfd, "w")); #else #ifdef WIN32 nwritten = _write(soap->sendfd, s, (unsigned int)n); #else nwritten = write(soap->sendfd, s, (unsigned int)n); #endif #endif #endif #endif if (nwritten <= 0) { #ifndef WITH_FASTCGI err = soap_errno; #else err = EOF; #endif if (err && err != SOAP_EINTR && err != SOAP_EWOULDBLOCK && err != SOAP_EAGAIN) { soap->errnum = err; return SOAP_EOF; } nwritten = 0; /* and call write() again */ } } n -= nwritten; s += nwritten; } return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_send_raw(struct soap *soap, const char *s, size_t n) { if (!n) return SOAP_OK; #ifndef WITH_LEANER if (soap->fpreparesend && (soap->mode & SOAP_IO) != SOAP_IO_STORE && (soap->mode & SOAP_IO_LENGTH) && (soap->error = soap->fpreparesend(soap, s, n))) return soap->error; if (soap->ffiltersend && (soap->error = soap->ffiltersend(soap, &s, &n))) return soap->error; #endif if ((soap->mode & SOAP_IO_LENGTH)) soap->count += n; else if (soap->mode & SOAP_IO) { size_t i = sizeof(soap->buf) - soap->bufidx; while (n >= i) { soap_memcpy((void*)(soap->buf + soap->bufidx), i, (const void*)s, i); soap->bufidx = sizeof(soap->buf); if (soap_flush(soap)) return soap->error; s += i; n -= i; i = sizeof(soap->buf); } soap_memcpy((void*)(soap->buf + soap->bufidx), sizeof(soap->buf) - soap->bufidx, (const void*)s, n); soap->bufidx += n; } else return soap_flush_raw(soap, s, n); return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_flush(struct soap *soap) { size_t n = soap->bufidx; if (n) { #ifndef WITH_LEANER if ((soap->mode & SOAP_IO) == SOAP_IO_STORE) { int r; if (soap->fpreparesend && (r = soap->fpreparesend(soap, soap->buf, n))) return soap->error = r; } #endif soap->bufidx = 0; #ifdef WITH_ZLIB if (soap->mode & SOAP_ENC_ZLIB) { soap->d_stream->next_in = (Byte*)soap->buf; soap->d_stream->avail_in = (unsigned int)n; #ifdef WITH_GZIP soap->z_crc = crc32(soap->z_crc, (Byte*)soap->buf, (unsigned int)n); #endif do { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Deflating %u bytes\n", soap->d_stream->avail_in)); if (deflate(soap->d_stream, Z_NO_FLUSH) != Z_OK) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unable to deflate: %s\n", soap->d_stream->msg ? soap->d_stream->msg : SOAP_STR_EOS)); return soap->error = SOAP_ZLIB_ERROR; } if (!soap->d_stream->avail_out) { if (soap_flush_raw(soap, soap->z_buf, sizeof(soap->buf))) return soap->error; soap->d_stream->next_out = (Byte*)soap->z_buf; soap->d_stream->avail_out = sizeof(soap->buf); } } while (soap->d_stream->avail_in); } else #endif return soap_flush_raw(soap, soap->buf, n); } return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_flush_raw(struct soap *soap, const char *s, size_t n) { if ((soap->mode & SOAP_IO) == SOAP_IO_STORE) { void *t; if (!(t = soap_push_block(soap, NULL, n))) return soap->error = SOAP_EOM; soap_memcpy(t, n, (const void*)s, n); return SOAP_OK; } #ifndef WITH_LEANER if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK) { char t[24]; (SOAP_SNPRINTF(t, sizeof(t), 20), &"\r\n%lX\r\n"[soap->chunksize ? 0 : 2], (unsigned long)n); DBGMSG(SENT, t, strlen(t)); if ((soap->error = soap->fsend(soap, t, strlen(t)))) return soap->error; soap->chunksize += n; } DBGMSG(SENT, s, n); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Send %u bytes to socket=%d/fd=%d\n", (unsigned int)n, soap->socket, soap->sendfd)); #endif return soap->error = soap->fsend(soap, s, n); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_send(struct soap *soap, const char *s) { if (s) return soap_send_raw(soap, s, strlen(s)); return SOAP_OK; } #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_send2(struct soap *soap, const char *s1, const char *s2) { if (soap_send(soap, s1)) return soap->error; return soap_send(soap, s2); } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_send3(struct soap *soap, const char *s1, const char *s2, const char *s3) { if (soap_send(soap, s1) || soap_send(soap, s2)) return soap->error; return soap_send(soap, s3); } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 static size_t frecv(struct soap *soap, char *s, size_t n) { int r; int retries = 100; /* max 100 retries with non-blocking sockets */ SOAP_SOCKET sk; soap->errnum = 0; #if defined(__cplusplus) && !defined(WITH_COMPAT) if (soap->is) /* recv from C++ stream */ { if (soap->is->good()) return (size_t)soap->is->read(s, (std::streamsize)n).gcount(); return 0; } #else if (soap->is) /* recv from C buffer until NUL */ { size_t l = strlen(soap->is); if (l > n) l = n; soap_memcpy(s, n, soap->is, l); soap->is += l; return l; } #endif sk = soap->recvsk; if (!soap_valid_socket(sk)) sk = soap->socket; if (soap_valid_socket(sk)) { for (;;) { #if defined(WITH_OPENSSL) || defined(WITH_SYSTEMSSL) int err = 0; #endif #ifdef WITH_OPENSSL if (soap->recv_timeout && !soap->ssl) /* OpenSSL: sockets are nonblocking */ #else if (soap->recv_timeout) #endif { for (;;) { r = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, soap->recv_timeout); if (r > 0) break; if (!r) return 0; r = soap->errnum; if (r != SOAP_EAGAIN && r != SOAP_EWOULDBLOCK) return 0; } } #ifdef WITH_OPENSSL if (soap->ssl) { r = SSL_read(soap->ssl, s, (int)n); if (r > 0) return (size_t)r; err = SSL_get_error(soap->ssl, r); if (err != SSL_ERROR_NONE && err != SSL_ERROR_WANT_READ && err != SSL_ERROR_WANT_WRITE) return 0; } else if (soap->bio) { r = BIO_read(soap->bio, s, (int)n); if (r > 0) return (size_t)r; return 0; } else #endif #ifdef WITH_GNUTLS if (soap->session) { r = (int)gnutls_record_recv(soap->session, s, n); if (r >= 0) return (size_t)r; } else #endif #ifdef WITH_SYSTEMSSL if (soap->ssl) { err = gsk_secure_socket_read(soap->ssl, s, n, &r); if (err == GSK_OK && r > 0) return (size_t)r; if (err != GSK_OK && err != GSK_WOULD_BLOCK && err != GSK_WOULD_BLOCK_WRITE) return 0; } else #endif { #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) { SOAP_SOCKLEN_T k = (SOAP_SOCKLEN_T)sizeof(soap->peer); memset((void*)&soap->peer, 0, sizeof(soap->peer)); r = recvfrom(sk, s, (SOAP_WINSOCKINT)n, soap->socket_flags, &soap->peer.addr, &k); /* portability note: see SOAP_SOCKLEN_T definition in stdsoap2.h */ soap->peerlen = (size_t)k; #ifndef WITH_IPV6 soap->ip = ntohl(soap->peer.in.sin_addr.s_addr); #endif } else #endif r = recv(sk, s, (SOAP_WINSOCKINT)n, soap->socket_flags); #ifdef PALM /* CycleSyncDisplay(curStatusMsg); */ #endif if (r >= 0) return (size_t)r; r = soap_socket_errno(sk); if (r != SOAP_EINTR && r != SOAP_EAGAIN && r != SOAP_EWOULDBLOCK) { soap->errnum = r; return 0; } } #if defined(WITH_OPENSSL) if (soap->ssl && err == SSL_ERROR_WANT_WRITE) r = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, soap->recv_timeout ? soap->recv_timeout : 5); else #elif defined(WITH_GNUTLS) if (soap->session && gnutls_record_get_direction(soap->session)) r = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, soap->recv_timeout ? soap->recv_timeout : 5); else #elif defined(WITH_SYSTEMSSL) if (soap->ssl && err == GSK_WOULD_BLOCK_WRITE) r = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, soap->recv_timeout ? soap->recv_timeout : 5); else #endif r = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, soap->recv_timeout ? soap->recv_timeout : 5); if (!r && soap->recv_timeout) return 0; if (r < 0) { r = soap->errnum; if (r != SOAP_EAGAIN && r != SOAP_EWOULDBLOCK) return 0; } if (retries-- <= 0) return 0; #ifdef PALM r = soap_socket_errno(sk); if (r != SOAP_EINTR && retries-- <= 0) { soap->errnum = r; return 0; } #endif } } #ifdef WITH_FASTCGI return fread(s, 1, n, stdin); #else #ifdef UNDER_CE return fread(s, 1, n, soap->recvfd); #else #ifdef WMW_RPM_IO if (soap->rpmreqid) r = httpBlockRead(soap->rpmreqid, s, n); else #endif #ifdef WIN32 r = _read(soap->recvfd, s, (unsigned int)n); #else r = read(soap->recvfd, s, n); #endif if (r >= 0) return (size_t)r; soap->errnum = soap_errno; return 0; #endif #endif } #endif #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 static soap_wchar soap_getchunkchar(struct soap *soap) { if (soap->bufidx < soap->buflen) return soap->buf[soap->bufidx++]; soap->bufidx = 0; soap->buflen = soap->chunkbuflen = soap->frecv(soap, soap->buf, sizeof(soap->buf)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Read %u bytes from socket=%d/fd=%d\n", (unsigned int)soap->buflen, soap->socket, soap->recvfd)); DBGMSG(RECV, soap->buf, soap->buflen); if (soap->buflen) return soap->buf[soap->bufidx++]; return EOF; } #endif #endif /******************************************************************************/ #ifndef PALM_1 static int soap_isxdigit(int c) { return (c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f'); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_recv_raw(struct soap *soap) { size_t ret; #if !defined(WITH_LEANER) || defined(WITH_ZLIB) int r; #endif #ifdef WITH_ZLIB if ((soap->mode & SOAP_ENC_ZLIB) && soap->d_stream) { if (soap->d_stream->next_out == Z_NULL) { soap->bufidx = soap->buflen = 0; return EOF; } if (soap->d_stream->avail_in || !soap->d_stream->avail_out) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflating\n")); soap->d_stream->next_out = (Byte*)soap->buf; soap->d_stream->avail_out = sizeof(soap->buf); r = inflate(soap->d_stream, Z_NO_FLUSH); if (r == Z_NEED_DICT && soap->z_dict) r = inflateSetDictionary(soap->d_stream, (const Bytef*)soap->z_dict, soap->z_dict_len); if (r == Z_OK || r == Z_STREAM_END) { soap->bufidx = 0; ret = soap->buflen = sizeof(soap->buf) - soap->d_stream->avail_out; if (soap->zlib_in == SOAP_ZLIB_GZIP) soap->z_crc = crc32(soap->z_crc, (Byte*)soap->buf, (unsigned int)ret); if (r == Z_STREAM_END) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflated %lu->%lu bytes\n", soap->d_stream->total_in, soap->d_stream->total_out)); soap->z_ratio_in = (float)soap->d_stream->total_in / (float)soap->d_stream->total_out; soap->d_stream->next_out = Z_NULL; } if (ret) { soap->count += ret; if (soap->count > SOAP_MAXINFLATESIZE && soap->z_ratio_in < SOAP_MINDEFLATERATIO) { soap->d_stream->msg = (char*)"caught SOAP_MINDEFLATERATIO explosive decompression guard (remedy: increase SOAP_MAXINFLATESIZE and/or decrease SOAP_MINDEFLATERATIO)"; return soap->error = SOAP_ZLIB_ERROR; } DBGLOG(RECV, SOAP_MESSAGE(fdebug, "\n---- decompressed ----\n")); DBGMSG(RECV, soap->buf, ret); DBGLOG(RECV, SOAP_MESSAGE(fdebug, "\n----\n")); #ifndef WITH_LEANER if (soap->fpreparerecv && (r = soap->fpreparerecv(soap, soap->buf, ret))) return soap->error = r; #endif return SOAP_OK; } } else if (r != Z_BUF_ERROR) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflate error: %s\n", soap->d_stream->msg ? soap->d_stream->msg : SOAP_STR_EOS)); soap->d_stream->next_out = Z_NULL; return soap->error = SOAP_ZLIB_ERROR; } } zlib_again: if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK && !soap->chunksize) { soap_memcpy((void*)soap->buf, sizeof(soap->buf), (const void*)soap->z_buf, sizeof(soap->buf)); soap->buflen = soap->z_buflen; } DBGLOG(RECV, SOAP_MESSAGE(fdebug, "\n---- compressed ----\n")); } #endif #ifndef WITH_NOHTTP if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK) /* read HTTP chunked transfer */ { for (;;) { soap_wchar c; char *t, tmp[17]; if (soap->chunksize) { soap->buflen = ret = soap->frecv(soap, soap->buf, soap->chunksize > sizeof(soap->buf) ? sizeof(soap->buf) : soap->chunksize); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Getting chunk: read %u bytes\n", (unsigned int)ret)); DBGMSG(RECV, soap->buf, ret); soap->bufidx = 0; soap->chunksize -= ret; break; } t = tmp; if (!soap->chunkbuflen) { soap->chunkbuflen = ret = soap->frecv(soap, soap->buf, sizeof(soap->buf)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Read %u bytes (chunked) from socket=%d\n", (unsigned int)ret, soap->socket)); DBGMSG(RECV, soap->buf, ret); soap->bufidx = 0; if (!ret) { soap->ahead = EOF; return EOF; } } else soap->bufidx = soap->buflen; soap->buflen = soap->chunkbuflen; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Getting chunk size (idx=%u len=%u)\n", (unsigned int)soap->bufidx, (unsigned int)soap->buflen)); while (!soap_isxdigit((int)(c = soap_getchunkchar(soap)))) { if ((int)c == EOF) { soap->ahead = EOF; return EOF; } } do *t++ = (char)c; while (soap_isxdigit((int)(c = soap_getchunkchar(soap))) && (size_t)(t - tmp) < sizeof(tmp)-1); while ((int)c != EOF && c != '\n') c = soap_getchunkchar(soap); if ((int)c == EOF) { soap->ahead = EOF; return EOF; } *t = '\0'; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Chunk size = %s (hex)\n", tmp)); soap->chunksize = (size_t)soap_strtoul(tmp, &t, 16); if (!soap->chunksize) { soap->bufidx = soap->buflen = soap->chunkbuflen = 0; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of chunked message\n")); while ((int)c != EOF && c != '\n') c = soap_getchunkchar(soap); ret = 0; soap->ahead = EOF; break; } soap->buflen = soap->bufidx + soap->chunksize; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Moving buf len to idx=%u len=%u (%s)\n", (unsigned int)soap->bufidx, (unsigned int)soap->buflen, tmp)); if (soap->buflen > soap->chunkbuflen) { soap->buflen = soap->chunkbuflen; soap->chunksize -= soap->buflen - soap->bufidx; soap->chunkbuflen = 0; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Passed end of buffer for chunked HTTP (%u bytes left)\n", (unsigned int)(soap->buflen - soap->bufidx))); } else if (soap->chunkbuflen) soap->chunksize = 0; ret = soap->buflen - soap->bufidx; if (ret) break; } } else #endif { soap->bufidx = 0; soap->buflen = ret = soap->frecv(soap, soap->buf, sizeof(soap->buf)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Read %u bytes from socket=%d/fd=%d\n", (unsigned int)ret, soap->socket, soap->recvfd)); DBGMSG(RECV, soap->buf, ret); } #ifdef WITH_ZLIB if (soap->mode & SOAP_ENC_ZLIB) { soap_memcpy((void*)soap->z_buf, sizeof(soap->buf), (const void*)soap->buf, sizeof(soap->buf)); soap->d_stream->next_in = (Byte*)(soap->z_buf + soap->bufidx); soap->d_stream->avail_in = (unsigned int)ret; soap->d_stream->next_out = (Byte*)soap->buf; soap->d_stream->avail_out = sizeof(soap->buf); r = inflate(soap->d_stream, Z_NO_FLUSH); if (r == Z_NEED_DICT && soap->z_dict) r = inflateSetDictionary(soap->d_stream, (const Bytef*)soap->z_dict, soap->z_dict_len); if (r == Z_OK || r == Z_STREAM_END) { soap->bufidx = 0; soap->z_buflen = soap->buflen; soap->buflen = sizeof(soap->buf) - soap->d_stream->avail_out; if (soap->zlib_in == SOAP_ZLIB_GZIP) soap->z_crc = crc32(soap->z_crc, (Byte*)soap->buf, (unsigned int)soap->buflen); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflated %u bytes\n", (unsigned int)soap->buflen)); if (ret && !soap->buflen && r != Z_STREAM_END) goto zlib_again; ret = soap->buflen; if (r == Z_STREAM_END) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflated total %lu->%lu bytes\n", soap->d_stream->total_in, soap->d_stream->total_out)); soap->z_ratio_in = (float)soap->d_stream->total_in / (float)soap->d_stream->total_out; soap->d_stream->next_out = Z_NULL; } if (soap->count + ret > SOAP_MAXINFLATESIZE && soap->z_ratio_in < SOAP_MINDEFLATERATIO) { soap->d_stream->msg = (char*)"caught SOAP_MINDEFLATERATIO explosive decompression guard (remedy: increase SOAP_MAXINFLATESIZE and/or decrease SOAP_MINDEFLATERATIO)"; return soap->error = SOAP_ZLIB_ERROR; } DBGLOG(RECV, SOAP_MESSAGE(fdebug, "\n---- decompressed ----\n")); DBGMSG(RECV, soap->buf, ret); #ifndef WITH_LEANER if (soap->fpreparerecv && (r = soap->fpreparerecv(soap, soap->buf, ret))) return soap->error = r; #endif } else { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unable to inflate: (%d) %s\n", r, soap->d_stream->msg ? soap->d_stream->msg : SOAP_STR_EOS)); soap->d_stream->next_out = Z_NULL; return soap->error = SOAP_ZLIB_ERROR; } } #endif #ifndef WITH_LEANER if (soap->fpreparerecv #ifdef WITH_ZLIB && soap->zlib_in == SOAP_ZLIB_NONE #endif && (r = soap->fpreparerecv(soap, soap->buf + soap->bufidx, ret))) return soap->error = r; #endif if (ret) { soap->count += ret; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Read count=%lu (+%lu)\n", (unsigned long)soap->count, (unsigned long)ret)); return SOAP_OK; } return EOF; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_recv(struct soap *soap) { #ifndef WITH_LEANER if (soap->mode & SOAP_ENC_DIME) { if (soap->dime.buflen) { char *s; int i; unsigned char tmp[12]; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DIME hdr for chunked DIME is in buffer\n")); soap->count += soap->dime.buflen - soap->buflen; soap->buflen = soap->dime.buflen; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Skip padding (%ld bytes)\n", -(long)soap->dime.size&3)); for (i = -(long)soap->dime.size&3; i > 0; i--) { soap->bufidx++; if (soap->bufidx >= soap->buflen) if (soap_recv_raw(soap)) return EOF; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get DIME hdr for next chunk\n")); s = (char*)tmp; for (i = 12; i > 0; i--) { *s++ = soap->buf[soap->bufidx++]; if (soap->bufidx >= soap->buflen) if (soap_recv_raw(soap)) return EOF; } soap->dime.flags = tmp[0] & 0x7; soap->dime.size = ((size_t)tmp[8] << 24) | ((size_t)tmp[9] << 16) | ((size_t)tmp[10] << 8) | ((size_t)tmp[11]); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get DIME chunk (%u bytes)\n", (unsigned int)soap->dime.size)); if (soap->dime.flags & SOAP_DIME_CF) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "More chunking\n")); soap->dime.chunksize = soap->dime.size; if (soap->buflen - soap->bufidx >= soap->dime.size) { soap->dime.buflen = soap->buflen; soap->buflen = soap->bufidx + soap->dime.chunksize; } else soap->dime.chunksize -= soap->buflen - soap->bufidx; } else { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Last chunk\n")); soap->dime.buflen = 0; soap->dime.chunksize = 0; } soap->count = soap->buflen - soap->bufidx; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%u bytes remaining\n", (unsigned int)soap->count)); return SOAP_OK; } if (soap->dime.chunksize) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get next DIME hdr for chunked DIME (%u bytes chunk)\n", (unsigned int)soap->dime.chunksize)); if (soap_recv_raw(soap)) return EOF; if (soap->buflen - soap->bufidx >= soap->dime.chunksize) { soap->dime.buflen = soap->buflen; soap->count -= soap->buflen - soap->bufidx - soap->dime.chunksize; soap->buflen = soap->bufidx + soap->dime.chunksize; } else soap->dime.chunksize -= soap->buflen - soap->bufidx; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%lu bytes remaining, count=%lu\n", (unsigned long)(soap->buflen-soap->bufidx), (unsigned long)soap->count)); return SOAP_OK; } } while (soap->ffilterrecv) { int err; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Filter recverror = %d\n", soap->recverror)); if (soap->recverror) soap->bufidx = soap->buflen = 0; else { soap->recverror = soap_recv_raw(soap); /* do not call again after EOF */ soap->buflen -= soap->bufidx; /* chunked may set bufidx > 0 to skip hex chunk length */ } if ((err = soap->ffilterrecv(soap, soap->buf + soap->bufidx, &soap->buflen, sizeof(soap->buf) - soap->bufidx))) return soap->error = err; if (soap->buflen) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Filtered %lu\n", (unsigned long)soap->buflen)); soap->buflen += soap->bufidx; return SOAP_OK; } if (soap->recverror) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Returning postponed EOF%d\n", soap->recverror)); return soap->recverror; } } return soap->recverror = soap_recv_raw(soap); #else return soap_recv_raw(soap); #endif } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 soap_wchar SOAP_FMAC2 soap_getchar(struct soap *soap) { soap_wchar c; c = soap->ahead; if (c) { if (c != EOF) soap->ahead = 0; return c; } return soap_get1(soap); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 const struct soap_code_map* SOAP_FMAC2 soap_code(const struct soap_code_map *code_map, const char *str) { if (code_map && str) { while (code_map->string) { if (!strcmp(str, code_map->string)) /* case sensitive */ return code_map; code_map++; } } return NULL; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 LONG64 SOAP_FMAC2 soap_code_int(const struct soap_code_map *code_map, const char *str, LONG64 other) { if (code_map) { while (code_map->string) { if (!soap_tag_cmp(str, code_map->string)) /* case insensitive */ return code_map->code; code_map++; } } return other; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 const char* SOAP_FMAC2 soap_code_str(const struct soap_code_map *code_map, long code) { if (!code_map) return NULL; while (code_map->code != code && code_map->string) code_map++; return code_map->string; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 LONG64 SOAP_FMAC2 soap_code_bits(const struct soap_code_map *code_map, const char *str) { LONG64 bits = 0; if (code_map) { while (str && *str) { const struct soap_code_map *p; for (p = code_map; p->string; p++) { size_t n = strlen(p->string); if (!strncmp(p->string, str, n) && soap_blank((soap_wchar)str[n])) { bits |= p->code; str += n; while (*str > 0 && *str <= 32) str++; break; } } if (!p->string) return 0; } } return bits; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 const char* SOAP_FMAC2 soap_code_list(struct soap *soap, const struct soap_code_map *code_map, long code) { char *t = soap->tmpbuf; if (code_map) { while (code_map->string) { if (code_map->code & code) { const char *s = code_map->string; if (t != soap->tmpbuf) *t++ = ' '; while (*s && t < soap->tmpbuf + sizeof(soap->tmpbuf) - 1) *t++ = *s++; if (t == soap->tmpbuf + sizeof(soap->tmpbuf) - 1) break; } code_map++; } } *t = '\0'; return soap->tmpbuf; } #endif /******************************************************************************/ #ifndef PALM_1 static soap_wchar soap_char(struct soap *soap) { char tmp[8]; int i; soap_wchar c; char *s = tmp; for (i = 0; i < 7; i++) { c = soap_get1(soap); if (c == ';' || (int)c == EOF) break; *s++ = (char)c; } *s = '\0'; if (*tmp == '#') { if (tmp[1] == 'x' || tmp[1] == 'X') return (soap_wchar)soap_strtol(tmp + 2, NULL, 16); return (soap_wchar)soap_strtol(tmp + 1, NULL, 10); } if (!strcmp(tmp, "lt")) return '<'; if (!strcmp(tmp, "gt")) return '>'; if (!strcmp(tmp, "amp")) return '&'; if (!strcmp(tmp, "quot")) return '"'; if (!strcmp(tmp, "apos")) return '\''; #ifndef WITH_LEAN return (soap_wchar)soap_code_int(html_entity_codes, tmp, (LONG64)SOAP_UNKNOWN_CHAR); #else return SOAP_UNKNOWN_CHAR; /* use this to represent unknown code */ #endif } #endif /******************************************************************************/ #ifdef WITH_LEAN #ifndef PALM_1 soap_wchar soap_get0(struct soap *soap) { if (soap->bufidx >= soap->buflen && soap_recv(soap)) return EOF; return (unsigned char)soap->buf[soap->bufidx]; } #endif #endif /******************************************************************************/ #ifdef WITH_LEAN #ifndef PALM_1 soap_wchar soap_get1(struct soap *soap) { if (soap->bufidx >= soap->buflen && soap_recv(soap)) return EOF; return (unsigned char)soap->buf[soap->bufidx++]; } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 soap_wchar SOAP_FMAC2 soap_get(struct soap *soap) { soap_wchar c; c = soap->ahead; if (c) { if ((int)c != EOF) soap->ahead = 0; } else c = soap_get1(soap); while ((int)c != EOF) { if (soap->cdata) { if (c == ']') { c = soap_get1(soap); if (c == ']') { c = soap_get0(soap); if (c == '>') { soap->cdata = 0; c = soap_get1(soap); c = soap_get1(soap); } else { soap_unget(soap, ']'); return ']'; } } else { soap_revget1(soap); return ']'; } } else return c; } switch (c) { case '<': do c = soap_get1(soap); while (soap_blank(c)); if (c == '!' || c == '?' || c == '%') { int k = 1; if (c == '!') { c = soap_get1(soap); if (c == '[') { do c = soap_get1(soap); while ((int)c != EOF && c != '['); if ((int)c == EOF) break; soap->cdata = 1; c = soap_get1(soap); continue; } if (c == '-' && (c = soap_get1(soap)) == '-') { do { c = soap_get1(soap); if (c == '-' && (c = soap_get1(soap)) == '-') break; } while ((int)c != EOF); } } else if (c == '?') c = soap_get_pi(soap); while ((int)c != EOF) { if (c == '<') k++; else if (c == '>') { if (--k <= 0) break; } c = soap_get1(soap); } if ((int)c == EOF) break; c = soap_get1(soap); continue; } if (c == '/') return SOAP_TT; soap_revget1(soap); return SOAP_LT; case '>': return SOAP_GT; case '"': return SOAP_QT; case '\'': return SOAP_AP; case '&': return soap_char(soap) | 0x80000000; } break; } return c; } #endif /******************************************************************************/ #ifndef PALM_1 static soap_wchar soap_get_pi(struct soap *soap) { char buf[64]; char *s = buf; int i = sizeof(buf); soap_wchar c = soap_getchar(soap); /* This is a quick way to parse XML PI and we could use a callback instead to * enable applications to intercept processing instructions */ while ((int)c != EOF && c != '?') { if (--i > 0) { if (soap_blank(c)) c = ' '; *s++ = (char)c; } c = soap_getchar(soap); } *s = '\0'; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "XML PI \n", buf)); if (!strncmp(buf, "xml ", 4)) { s = strstr(buf, " encoding="); if (s && s[10]) { if (!soap_tag_cmp(s + 11, "iso-8859-1*") || !soap_tag_cmp(s + 11, "latin1*")) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Switching to latin1 encoding\n")); soap->mode |= SOAP_ENC_LATIN; } else if (!soap_tag_cmp(s + 11, "utf-8*")) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Switching to utf-8 encoding\n")); soap->mode &= ~SOAP_ENC_LATIN; } } } if ((int)c != EOF) c = soap_getchar(soap); return c; } #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_move(struct soap *soap, size_t n) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Moving %lu bytes forward\n", (unsigned long)n)); for (; n; n--) if ((int)soap_getchar(soap) == EOF) return SOAP_EOF; return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 size_t SOAP_FMAC2 soap_tell(struct soap *soap) { return soap->count - soap->buflen + soap->bufidx - (soap->ahead != 0); } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_pututf8(struct soap *soap, unsigned long c) { char tmp[24]; if ((c < 0x7F && c > 0x1F)) { *tmp = (char)c; return soap_send_raw(soap, tmp, 1); } #ifdef WITH_REPLACE_ILLEGAL_UTF8 if (!(c == 0x09 || c == 0x0A || c == 0x0D || (c >= 0x80 && c <= 0xD7FF) || (c >= 0xE000 && c <= 0xFFFD) || (c >= 0x10000 && c <= 0x10FFFF))) c = SOAP_UNKNOWN_UNICODE_CHAR; #endif #ifndef WITH_LEAN if (c > 0x9F) { char *t = tmp; if (c < 0x0800) *t++ = (char)(0xC0 | ((c >> 6) & 0x1F)); else { if (c < 0x010000) *t++ = (char)(0xE0 | ((c >> 12) & 0x0F)); else { if (c < 0x200000) *t++ = (char)(0xF0 | ((c >> 18) & 0x07)); else { if (c < 0x04000000) *t++ = (char)(0xF8 | ((c >> 24) & 0x03)); else { *t++ = (char)(0xFC | ((c >> 30) & 0x01)); *t++ = (char)(0x80 | ((c >> 24) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 18) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 12) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 6) & 0x3F)); } *t++ = (char)(0x80 | (c & 0x3F)); *t = '\0'; } else #endif (SOAP_SNPRINTF(tmp, sizeof(tmp), 20), "&#x%lX;", c); return soap_send(soap, tmp); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 soap_wchar SOAP_FMAC2 soap_getutf8(struct soap *soap) { soap_wchar c, c1, c2, c3, c4; c = soap->ahead; if (c >= 0x80) soap->ahead = 0; else c = soap_get(soap); if (c < 0x80 || c > 0xFF || (soap->mode & SOAP_ENC_LATIN)) return c; c1 = soap_get1(soap); if (c1 < 0x80) { soap_revget1(soap); /* doesn't look like this is UTF8 */ return c; } c1 &= 0x3F; if (c < 0xE0) return ((soap_wchar)(c & 0x1F) << 6) | c1; c2 = (soap_wchar)soap_get1(soap) & 0x3F; if (c < 0xF0) return ((soap_wchar)(c & 0x0F) << 12) | (c1 << 6) | c2; c3 = (soap_wchar)soap_get1(soap) & 0x3F; if (c < 0xF8) return ((soap_wchar)(c & 0x07) << 18) | (c1 << 12) | (c2 << 6) | c3; c4 = (soap_wchar)soap_get1(soap) & 0x3F; if (c < 0xFC) return ((soap_wchar)(c & 0x03) << 24) | (c1 << 18) | (c2 << 12) | (c3 << 6) | c4; return ((soap_wchar)(c & 0x01) << 30) | (c1 << 24) | (c2 << 18) | (c3 << 12) | (c4 << 6) | (soap_wchar)(soap_get1(soap) & 0x3F); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 size_t SOAP_FMAC2 soap_utf8len(const char *s) { size_t l = 0; while (*s) if ((*s++ & 0xC0) != 0x80) l++; return l; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_puthex(struct soap *soap, const unsigned char *s, int n) { char d[2]; int i; #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { if (!(soap->dom->text = soap_s2hex(soap, s, NULL, n))) return soap->error; return SOAP_OK; } #endif for (i = 0; i < n; i++) { int m = *s++; d[0] = (char)((m >> 4) + (m > 159 ? '7' : '0')); m &= 0x0F; d[1] = (char)(m + (m > 9 ? '7' : '0')); if (soap_send_raw(soap, d, 2)) return soap->error; } return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 unsigned char* SOAP_FMAC2 soap_gethex(struct soap *soap, int *n) { #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { soap->dom->text = soap_string_in(soap, 0, -1, -1, NULL); return (unsigned char*)soap_hex2s(soap, soap->dom->text, NULL, 0, n); } #endif #ifdef WITH_FAST soap->labidx = 0; for (;;) { char *s; size_t i, k; if (soap_append_lab(soap, NULL, 0)) return NULL; s = soap->labbuf + soap->labidx; k = soap->lablen - soap->labidx; soap->labidx = soap->lablen; for (i = 0; i < k; i++) { char d1, d2; soap_wchar c; c = soap_get(soap); if (soap_isxdigit(c)) { d1 = (char)c; c = soap_get(soap); if (soap_isxdigit(c)) d2 = (char)c; else { soap->error = SOAP_TYPE; return NULL; } } else { unsigned char *p; size_t l = soap->lablen + i - k; soap_unget(soap, c); if (n) *n = (int)l; p = (unsigned char*)soap_malloc(soap, l); if (p) soap_memcpy((void*)p, l, (const void*)soap->labbuf, l); return p; } *s++ = (char)(((d1 >= 'A' ? (d1 & 0x7) + 9 : d1 - '0') << 4) + (d2 >= 'A' ? (d2 & 0x7) + 9 : d2 - '0')); } } #else if (soap_new_block(soap) == NULL) return NULL; for (;;) { int i; char *s = (char*)soap_push_block(soap, NULL, SOAP_BLKLEN); if (!s) { soap_end_block(soap, NULL); return NULL; } for (i = 0; i < SOAP_BLKLEN; i++) { char d1, d2; soap_wchar c = soap_get(soap); if (soap_isxdigit(c)) { d1 = (char)c; c = soap_get(soap); if (soap_isxdigit(c)) d2 = (char)c; else { soap_end_block(soap, NULL); soap->error = SOAP_TYPE; return NULL; } } else { unsigned char *p; soap_unget(soap, c); if (n) *n = (int)soap_size_block(soap, NULL, i); p = (unsigned char*)soap_save_block(soap, NULL, NULL, 0); return p; } *s++ = ((d1 >= 'A' ? (d1 & 0x7) + 9 : d1 - '0') << 4) + (d2 >= 'A' ? (d2 & 0x7) + 9 : d2 - '0'); } } #endif } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_putbase64(struct soap *soap, const unsigned char *s, int n) { int i; unsigned long m; char d[4]; if (!s) return SOAP_OK; #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { if (!(soap->dom->text = soap_s2base64(soap, s, NULL, n))) return soap->error; return SOAP_OK; } #endif for (; n > 2; n -= 3, s += 3) { m = s[0]; m = (m << 8) | s[1]; m = (m << 8) | s[2]; for (i = 4; i > 0; m >>= 6) d[--i] = soap_base64o[m & 0x3F]; if (soap_send_raw(soap, d, 4)) return soap->error; } if (n > 0) { m = 0; for (i = 0; i < n; i++) m = (m << 8) | *s++; for (; i < 3; i++) m <<= 8; for (i++; i > 0; m >>= 6) d[--i] = soap_base64o[m & 0x3F]; for (i = 3; i > n; i--) d[i] = '='; if (soap_send_raw(soap, d, 4)) return soap->error; } return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 unsigned char* SOAP_FMAC2 soap_getbase64(struct soap *soap, int *n, int malloc_flag) { (void)malloc_flag; #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { soap->dom->text = soap_string_in(soap, 0, -1, -1, NULL); return (unsigned char*)soap_base642s(soap, soap->dom->text, NULL, 0, n); } #endif #ifdef WITH_FAST soap->labidx = 0; for (;;) { size_t i, k; char *s; if (soap_append_lab(soap, NULL, 2)) return NULL; s = soap->labbuf + soap->labidx; k = soap->lablen - soap->labidx; soap->labidx = 3 * (soap->lablen / 3); if (k > 2) { for (i = 0; i < k - 2; i += 3) { unsigned long m = 0; int j = 0; do { soap_wchar c = soap_get(soap); if (c < SOAP_AP) c &= 0x7FFFFFFF; if (c == '=' || c < 0) { unsigned char *p; size_t l; switch (j) { case 2: *s++ = (char)((m >> 4) & 0xFF); i++; break; case 3: *s++ = (char)((m >> 10) & 0xFF); *s++ = (char)((m >> 2) & 0xFF); i += 2; } l = soap->lablen + i - k; if (n) *n = (int)l; p = (unsigned char*)soap_malloc(soap, l); if (p) soap_memcpy((void*)p, l, (const void*)soap->labbuf, l); if (c >= 0) { while ((int)((c = soap_get(soap)) != EOF) && c != SOAP_LT && c != SOAP_TT) continue; } soap_unget(soap, c); return p; } c -= '+'; if (c >= 0 && c <= 79) { int b = soap_base64i[c]; if (b >= 64) { soap->error = SOAP_TYPE; return NULL; } m = (m << 6) + b; j++; } else if (!soap_blank(c + '+')) { soap->error = SOAP_TYPE; return NULL; } } while (j < 4); *s++ = (char)((m >> 16) & 0xFF); *s++ = (char)((m >> 8) & 0xFF); *s++ = (char)(m & 0xFF); } } } #else if (soap_new_block(soap) == NULL) return NULL; for (;;) { int i; char *s = (char*)soap_push_block(soap, NULL, 3 * SOAP_BLKLEN); /* must be multiple of 3 */ if (!s) { soap_end_block(soap, NULL); return NULL; } for (i = 0; i < SOAP_BLKLEN; i++) { unsigned long m = 0; int j = 0; do { soap_wchar c = soap_get(soap); if (c == '=' || c < 0) { unsigned char *p; i *= 3; switch (j) { case 2: *s++ = (char)((m >> 4) & 0xFF); i++; break; case 3: *s++ = (char)((m >> 10) & 0xFF); *s++ = (char)((m >> 2) & 0xFF); i += 2; } if (n) *n = (int)soap_size_block(soap, NULL, i); p = (unsigned char*)soap_save_block(soap, NULL, NULL, 0); if (c >= 0) { while ((int)((c = soap_get(soap)) != EOF) && c != SOAP_LT && c != SOAP_TT) continue; } soap_unget(soap, c); return p; } c -= '+'; if (c >= 0 && c <= 79) { int b = soap_base64i[c]; if (b >= 64) { soap->error = SOAP_TYPE; return NULL; } m = (m << 6) + b; j++; } else if (!soap_blank(c)) { soap->error = SOAP_TYPE; return NULL; } } while (j < 4); *s++ = (char)((m >> 16) & 0xFF); *s++ = (char)((m >> 8) & 0xFF); *s++ = (char)(m & 0xFF); } } #endif } #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_xop_forward(struct soap *soap, unsigned char **ptr, int *size, char **id, char **type, char **options) { /* Check MTOM xop:Include element (within hex/base64Binary) */ /* TODO: this code to be obsoleted with new import/xop.h conventions */ short body = soap->body; /* should save type too? */ if (!soap_peek_element(soap)) { if (!soap_element_begin_in(soap, "xop:Include", 0, NULL)) { if (soap_attachment_forward(soap, ptr, size, id, type, options) || (soap->body && soap_element_end_in(soap, "xop:Include"))) return soap->error; } } soap->body = body; return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_attachment_forward(struct soap *soap, unsigned char **ptr, int *size, char **id, char **type, char **options) { struct soap_xlist *xp; *ptr = NULL; *size = 0; *id = NULL; *type = NULL; *options = NULL; if (!*soap->href) return SOAP_OK; *id = soap_strdup(soap, soap->href); xp = (struct soap_xlist*)SOAP_MALLOC(soap, sizeof(struct soap_xlist)); if (!xp) return soap->error = SOAP_EOM; xp->next = soap->xlist; xp->ptr = ptr; xp->size = size; xp->id = *id; xp->type = type; xp->options = options; soap->xlist = xp; return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void * SOAP_FMAC2 soap_memdup(struct soap *soap, const void *s, size_t n) { void *t = NULL; if (s && (t = soap_malloc(soap, n))) soap_memcpy(t, n, s, n); return t; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 char * SOAP_FMAC2 soap_strdup(struct soap *soap, const char *s) { char *t = NULL; if (s) { size_t l = strlen(s) + 1; if ((t = (char*)soap_malloc(soap, l))) soap_memcpy((void*)t, l, (const void*)s, l); } return t; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 wchar_t * SOAP_FMAC2 soap_wstrdup(struct soap *soap, const wchar_t *s) { wchar_t *t = NULL; if (s) { size_t n = 0; while (s[n]) n++; n = sizeof(wchar_t)*(n+1); if ((t = (wchar_t*)soap_malloc(soap, n))) soap_memcpy((void*)t, n, (const void*)s, n); } return t; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 char * SOAP_FMAC2 soap_strtrim(struct soap *soap, char *s) { (void)soap; if (s) { char *t; while ((*s >= 9 && *s <= 13) || *s == 32) s++; t = s; while (*t) t++; while (--t > s && ((*t >= 9 && *t <= 13) || *t == 32)) continue; t[1] = '\0'; } return s; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 wchar_t * SOAP_FMAC2 soap_wstrtrim(struct soap *soap, wchar_t *s) { (void)soap; if (s) { wchar_t *t; while ((*s >= 9 && *s <= 13) || *s == 32) s++; t = s; while (*t) t++; while (--t > s && ((*t >= 9 && *t <= 13) || *t == 32)) continue; t[1] = L'\0'; } return s; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 struct soap_blist* SOAP_FMAC2 soap_new_block(struct soap *soap) { struct soap_blist *p; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "New block sequence (prev=%p)\n", soap->blist)); if (!(p = (struct soap_blist*)SOAP_MALLOC(soap, sizeof(struct soap_blist)))) { soap->error = SOAP_EOM; return NULL; } p->next = soap->blist; p->head = NULL; p->size = 0; soap->blist = p; return p; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void* SOAP_FMAC2 soap_push_block(struct soap *soap, struct soap_blist *b, size_t n) { struct soap_bhead *p; if (!b) b = soap->blist; if (!(p = (struct soap_bhead*)SOAP_MALLOC(soap, sizeof(struct soap_bhead) + n))) { soap->error = SOAP_EOM; return NULL; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Push block %p of %u bytes (%u bytes total)\n", p, (unsigned int)n, (unsigned int)b->size + (unsigned int)n)); p->next = b->head; b->head = p; p->size = n; b->size += n; return (void*)(p + 1); /* skip block header and point to n allocated bytes */ } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_pop_block(struct soap *soap, struct soap_blist *b) { struct soap_bhead *p; if (!b) b = soap->blist; if (!b->head) return; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Pop block\n")); p = b->head; b->size -= p->size; b->head = p->next; SOAP_FREE(soap, p); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_update_pointers(struct soap *soap, const char *dst, const char *src, size_t len) { const void *start = src, *end = src + len; #ifndef WITH_LEANER struct soap_xlist *xp; #endif #ifndef WITH_NOIDREF if ((soap->version && !(soap->imode & SOAP_XML_TREE)) || (soap->mode & SOAP_XML_GRAPH)) { int i; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Update pointers %p (%lu bytes) -> %p\n", src, (unsigned long)len, dst)); for (i = 0; i < SOAP_IDHASH; i++) { struct soap_ilist *ip; for (ip = soap->iht[i]; ip; ip = ip->next) { struct soap_flist *fp; void *p, **q; if (ip->shaky) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Update shaky id='%s'\n", ip->id)); if (ip->ptr && ip->ptr >= start && ip->ptr < end) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Update ptr %p -> %p\n", ip->ptr, (const char*)ip->ptr + (dst-src))); ip->ptr = (void*)((const char*)ip->ptr + (dst-src)); } for (q = &ip->link; q; q = (void**)p) { p = *q; if (p && p >= start && p < end) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Link update id='%s' %p -> %p\n", ip->id, p, (const char*)p + (dst-src))); *q = (void*)((const char*)p + (dst-src)); } } for (q = &ip->copy; q; q = (void**)p) { p = *q; if (p && p >= start && p < end) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy chain update id='%s' %p -> %p\n", ip->id, p, (const char*)p + (dst-src))); *q = (void*)((const char*)p + (dst-src)); } } for (fp = ip->flist; fp; fp = fp->next) { if (fp->ptr >= start && fp->ptr < end) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy list update id='%s' target type=%d %p -> %p\n", ip->id, fp->type, fp->ptr, (char*)fp->ptr + (dst-src))); fp->ptr = (void*)((const char*)fp->ptr + (dst-src)); } } if (ip->smart && ip->smart >= start && ip->smart < end) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Smart shared pointer update %p -> %p\n", ip->smart, (const char*)ip->smart + (dst-src))); ip->smart = (void*)((const char*)ip->smart + (dst-src)); } } } } } #else (void)soap; (void)start; (void)end; (void)dst; (void)src; #endif #ifndef WITH_LEANER for (xp = soap->xlist; xp; xp = xp->next) { if (xp->ptr && (void*)xp->ptr >= start && (void*)xp->ptr < end) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Update attachment id='%s' %p -> %p\n", xp->id ? xp->id : SOAP_STR_EOS, xp->ptr, (char*)xp->ptr + (dst-src))); xp->ptr = (unsigned char**)((char*)xp->ptr + (dst-src)); xp->size = (int*)((char*)xp->size + (dst-src)); xp->type = (char**)((char*)xp->type + (dst-src)); xp->options = (char**)((char*)xp->options + (dst-src)); } } #endif } #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_1 static int soap_has_copies(struct soap *soap, const char *start, const char *end) { int i; struct soap_ilist *ip = NULL; struct soap_flist *fp = NULL; const char *p; for (i = 0; i < SOAP_IDHASH; i++) { for (ip = soap->iht[i]; ip; ip = ip->next) { for (p = (const char*)ip->copy; p; p = *(const char**)p) if (p >= start && p < end) return SOAP_ERR; for (fp = ip->flist; fp; fp = fp->next) if (fp->type == ip->type && (const char*)fp->ptr >= start && (const char*)fp->ptr < end) return SOAP_ERR; } } return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_resolve(struct soap *soap) { int i; short flag; const char *id; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolving forwarded refs\n")); for (i = 0; i < SOAP_IDHASH; i++) { struct soap_ilist *ip; for (ip = soap->iht[i]; ip; ip = ip->next) { if (ip->ptr) { void **q; struct soap_flist *fp, **fpp = &ip->flist; if (ip->spine) ip->spine[0] = ip->ptr; q = (void**)ip->link; ip->link = NULL; DBGLOG(TEST, if (q) SOAP_MESSAGE(fdebug, "Traversing link chain to resolve id='%s' type=%d\n", ip->id, ip->type)); while (q) { void *p = *q; *q = ip->ptr; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "... link %p -> %p\n", q, ip->ptr)); q = (void**)p; } while ((fp = *fpp)) { if (fp->level > 0 && fp->finsert) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "... insert type=%d link %p -> %p\n", fp->type, fp->ptr, ip->ptr)); if (ip->spine && fp->level <= SOAP_MAXPTRS) fp->finsert(soap, ip->type, fp->type, fp->ptr, fp->index, &ip->spine[fp->level - 1], &ip->smart); else if (fp->level == 1) fp->finsert(soap, ip->type, fp->type, fp->ptr, fp->index, &ip->ptr, &ip->smart); else if (fp->level <= SOAP_MAXPTRS) { int i; if (!(ip->spine = (void**)soap_malloc(soap, SOAP_MAXPTRS * sizeof(void*)))) return soap->error = SOAP_EOM; ip->spine[0] = ip->ptr; for (i = 1; i < SOAP_MAXPTRS; i++) ip->spine[i] = &ip->spine[i - 1]; fp->finsert(soap, ip->type, fp->type, fp->ptr, fp->index, &ip->spine[fp->level - 1], &ip->smart); } *fpp = fp->next; SOAP_FREE(soap, fp); } else fpp = &fp->next; } } else if (*ip->id == '#') { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Missing id='%s'\n", ip->id)); soap_strcpy(soap->id, sizeof(soap->id), ip->id + 1); return soap->error = SOAP_MISSING_ID; } } } do { flag = 0; id = NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolution phase\n")); for (i = 0; i < SOAP_IDHASH; i++) { struct soap_ilist *ip; for (ip = soap->iht[i]; ip; ip = ip->next) { if (ip->copy || ip->flist) { if (ip->ptr && !soap_has_copies(soap, (const char*)ip->ptr, (const char*)ip->ptr + ip->size)) { struct soap_flist *fp; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolving id='%s' type=%d ptr=%p size=%lu ...\n", ip->id, ip->type, ip->ptr, (unsigned long)ip->size)); if (ip->copy) { void *p, **q = (void**)ip->copy; DBGLOG(TEST, if (q) SOAP_MESSAGE(fdebug, "Traversing copy chain to resolve id='%s'\n", ip->id)); ip->copy = NULL; do { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "... copy %p -> %p (%u bytes)\n", ip->ptr, q, (unsigned int)ip->size)); p = *q; soap_memcpy((void*)q, ip->size, (const void*)ip->ptr, ip->size); q = (void**)p; } while (q); flag = 1; } while ((fp = ip->flist)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolving forwarded data type=%d target type=%d location=%p level=%u id='%s'\n", ip->type, fp->type, ip->ptr, fp->level, ip->id)); if (fp->level == 0) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "... copy %p -> %p (%lu bytes)\n", ip->ptr, fp->ptr, (unsigned long)ip->size)); if (fp->finsert) fp->finsert(soap, ip->type, fp->type, fp->ptr, fp->index, ip->ptr, &ip->smart); else soap_memcpy((void*)fp->ptr, ip->size, (const void*)ip->ptr, ip->size); } ip->flist = fp->next; SOAP_FREE(soap, fp); flag = 1; } } else id = ip->id; } } } } while (flag); if (id) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolution error: forwarded data for id='%s' could not be propagated, please report this problem to the gSOAP developers\n", id)); return soap_id_nullify(soap, id); } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolution done\n")); return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 size_t SOAP_FMAC2 soap_size_block(struct soap *soap, struct soap_blist *b, size_t n) { if (!b) b = soap->blist; if (b->head) { b->size -= b->head->size - n; b->head->size = n; } return b->size; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 char* SOAP_FMAC2 soap_first_block(struct soap *soap, struct soap_blist *b) { struct soap_bhead *p, *q, *r; if (!b) b = soap->blist; p = b->head; if (!p) return NULL; r = NULL; do { q = p->next; p->next = r; r = p; p = q; } while (p); b->head = r; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "First block %p\n", r + 1)); return (char*)(r + 1); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 char* SOAP_FMAC2 soap_next_block(struct soap *soap, struct soap_blist *b) { struct soap_bhead *p; if (!b) b = soap->blist; p = b->head; if (p) { b->head = p->next; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Next block %p, deleting current block\n", b->head + 1)); SOAP_FREE(soap, p); if (b->head) return (char*)(b->head + 1); } return NULL; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 size_t SOAP_FMAC2 soap_block_size(struct soap *soap, struct soap_blist *b) { if (!b) b = soap->blist; return b->head->size; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_end_block(struct soap *soap, struct soap_blist *b) { struct soap_bhead *p, *q; if (!b) b = soap->blist; if (b) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of block sequence, free all remaining blocks\n")); for (p = b->head; p; p = q) { q = p->next; SOAP_FREE(soap, p); } if (soap->blist == b) soap->blist = b->next; else { struct soap_blist *bp; for (bp = soap->blist; bp; bp = bp->next) { if (bp->next == b) { bp->next = b->next; break; } } } SOAP_FREE(soap, b); } DBGLOG(TEST, if (soap->blist) SOAP_MESSAGE(fdebug, "Restored previous block sequence\n")); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 char* SOAP_FMAC2 soap_save_block(struct soap *soap, struct soap_blist *b, char *p, int flag) { size_t n; char *q, *s; if (!b) b = soap->blist; if (b->size) { if (!p) p = (char*)soap_malloc(soap, b->size); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Save all blocks in contiguous memory space of %u bytes (%p->%p)\n", (unsigned int)b->size, b->head, p)); if (p) { s = p; for (q = soap_first_block(soap, b); q; q = soap_next_block(soap, b)) { n = soap_block_size(soap, b); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy %u bytes from %p to %p\n", (unsigned int)n, q, s)); if (flag) soap_update_pointers(soap, s, q, n); soap_memcpy((void*)s, n, (const void*)q, n); s += n; } } else soap->error = SOAP_EOM; } soap_end_block(soap, b); #ifndef WITH_NOIDREF if (!soap->blist && ((soap->version && !(soap->imode & SOAP_XML_TREE)) || (soap->mode & SOAP_XML_GRAPH))) { int i; struct soap_ilist *ip = NULL; for (i = 0; i < SOAP_IDHASH; i++) for (ip = soap->iht[i]; ip; ip = ip->next) ip->shaky = 0; } #endif return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 char * SOAP_FMAC2 soap_putsizesoffsets(struct soap *soap, const char *type, const int *size, const int *offset, int dim) { int i; const char *t = ",%d"; if (!type) return NULL; if (soap->version == 2) t = " %d"; if (soap->version != 2 && offset) { (SOAP_SNPRINTF(soap->type, sizeof(soap->type) - 1, strlen(type) + 20), "%s[%d", type, size[0] + offset[0]); for (i = 1; i < dim; i++) { size_t l = strlen(soap->type); (SOAP_SNPRINTF(soap->type + l, sizeof(soap->type) - l - 1, 20), t, size[i] + offset[i]); } } else { (SOAP_SNPRINTF(soap->type, sizeof(soap->type) - 1, strlen(type) + 20), "%s[%d", type, size[0]); for (i = 1; i < dim; i++) { size_t l = strlen(soap->type); (SOAP_SNPRINTF(soap->type + l, sizeof(soap->type) - l - 1, 20), t, size[i]); } } soap_strncat(soap->type, sizeof(soap->type), "]", 1); return soap->type; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 char * SOAP_FMAC2 soap_putoffsets(struct soap *soap, const int *offset, int dim) { int i; soap->arrayOffset[0] = '\0'; if (soap->version == 1) { (SOAP_SNPRINTF(soap->arrayOffset, sizeof(soap->arrayOffset) - 1, 20), "[%d", offset[0]); for (i = 1; i < dim; i++) { size_t l = strlen(soap->arrayOffset); (SOAP_SNPRINTF(soap->arrayOffset + l, sizeof(soap->arrayOffset) - l - 1, 20), ",%d", offset[i]); } soap_strncat(soap->arrayOffset, sizeof(soap->arrayOffset), "]", 1); } return soap->arrayOffset; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 size_t SOAP_FMAC2 soap_size(const int *size, int dim) { int i; size_t n = 0; if (size[0] <= 0) return 0; n = (size_t)size[0]; for (i = 1; i < dim; i++) { if (size[i] <= 0) return 0; n *= (size_t)size[i]; } return (size_t)n; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 size_t SOAP_FMAC2 soap_getsizes(const char *attr, int *size, int dim) { size_t i, k, n; if (!*attr) return 0; i = strlen(attr); n = 1; do { for (; i > 0; i--) if (attr[i - 1] == '[' || attr[i - 1] == ',' || attr[i - 1] == ' ') break; n *= k = (size_t)soap_strtoul(attr + i, NULL, 10); size[--dim] = (int)k; if (n > SOAP_MAXARRAYSIZE) return 0; } while (dim > 0 && --i > 0 && attr[i] != '['); return n; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_getoffsets(const char *attr, const int *size, int *offset, int dim) { int i, j = 0; if (offset) { for (i = 0; i < dim && attr && *attr; i++) { attr++; j *= size[i]; j += offset[i] = (int)soap_strtol(attr, NULL, 10); attr = strchr(attr, ','); } } else { for (i = 0; i < dim && attr && *attr; i++) { attr++; j *= size[i]; j += (int)soap_strtol(attr, NULL, 10); attr = strchr(attr, ','); } } return j; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_getposition(const char *attr, int *pos) { int i, n; if (!*attr) return -1; n = 0; i = 1; do { pos[n++] = (int)soap_strtol(attr + i, NULL, 10); while (attr[i] && attr[i] != ',' && attr[i] != ']') i++; if (attr[i] == ',') i++; } while (n < SOAP_MAXDIMS && attr[i] && attr[i] != ']'); return n; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 struct soap_nlist * SOAP_FMAC2 soap_push_namespace(struct soap *soap, const char *id, const char *ns) { struct soap_nlist *np; struct Namespace *p; short i = -1; size_t n, k; n = strlen(id); k = strlen(ns) + 1; p = soap->local_namespaces; if (p) { for (i = 0; p->id; p++, i++) { if (p->ns && !strcmp(ns, p->ns)) break; if (p->out) { if (!strcmp(ns, p->out)) break; } else if (p->in) { if (!soap_tag_cmp(ns, p->in)) { if ((p->out = (char*)SOAP_MALLOC(soap, k))) soap_strcpy(p->out, k, ns); break; } } } if (!p->id) i = -1; } if (i >= 0) k = 0; np = (struct soap_nlist*)SOAP_MALLOC(soap, sizeof(struct soap_nlist) + n + k); if (!np) { soap->error = SOAP_EOM; return NULL; } np->next = soap->nlist; soap->nlist = np; np->level = soap->level; np->index = i; soap_strcpy((char*)np->id, n + 1, id); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Push namespace binding (level=%u) '%s'='%s'\n", soap->level, id, ns)); if (i < 0) { np->ns = np->id + n + 1; soap_strcpy((char*)np->ns, k, ns); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Push NOT OK: no match found for '%s' in namespace mapping table (added to stack anyway)\n", ns)); } else { np->ns = NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Push OK ('%s' matches '%s' in namespace table)\n", id, p->id)); } return np; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_pop_namespace(struct soap *soap) { struct soap_nlist *np, *nq; for (np = soap->nlist; np && np->level >= soap->level; np = nq) { nq = np->next; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Pop namespace binding (level=%u) '%s' level=%u\n", soap->level, np->id, np->level)); SOAP_FREE(soap, np); } soap->nlist = np; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_match_namespace(struct soap *soap, const char *id1, const char *id2, size_t n1, size_t n2) { struct soap_nlist *np = soap->nlist; const char *s; while (np && (strncmp(np->id, id1, n1) || np->id[n1])) np = np->next; if (np) { if (!(soap->mode & SOAP_XML_IGNORENS) && (n2 > 0 || !np->ns || *np->ns)) { if (np->index < 0 || ((s = soap->local_namespaces[np->index].id) && (strncmp(s, id2, n2) || (s[n2] && s[n2] != '_')))) return SOAP_NAMESPACE; } return SOAP_OK; } if (n1 == 0) return n2 == 0 || (soap->mode & SOAP_XML_IGNORENS) ? SOAP_OK : SOAP_NAMESPACE; if ((n1 == 3 && n1 == n2 && !strncmp(id1, "xml", 3) && !strncmp(id1, id2, 3)) || (soap->mode & SOAP_XML_IGNORENS)) return SOAP_OK; return soap->error = SOAP_SYNTAX_ERROR; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_current_namespace(struct soap *soap, const char *tag) { struct soap_nlist *np; const char *s; if (!tag || !strncmp(tag, "xml", 3)) return NULL; np = soap->nlist; if (!(s = strchr(tag, ':'))) { while (np && *np->id) /* find default namespace, if present */ np = np->next; } else { while (np && (strncmp(np->id, tag, s - tag) || np->id[s - tag])) np = np->next; if (!np) soap->error = SOAP_NAMESPACE; } if (np) { if (np->index >= 0) return soap->namespaces[np->index].ns; if (np->ns && *np->ns) return soap_strdup(soap, np->ns); } return NULL; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_tag_cmp(const char *s, const char *t) { for (;;) { int c1 = *s; int c2 = *t; if (!c1 || c1 == '"') break; if (c2 != '-') { if (c1 != c2) { if (c1 >= 'A' && c1 <= 'Z') c1 += 'a' - 'A'; if (c2 >= 'A' && c2 <= 'Z') c2 += 'a' - 'A'; } if (c1 != c2) { if (c2 != '*') return 1; c2 = *++t; if (!c2) return 0; if (c2 >= 'A' && c2 <= 'Z') c2 += 'a' - 'A'; for (;;) { c1 = *s; if (!c1 || c1 == '"') break; if (c1 >= 'A' && c1 <= 'Z') c1 += 'a' - 'A'; if (c1 == c2 && !soap_tag_cmp(s + 1, t + 1)) return 0; s++; } break; } } s++; t++; } if (*t == '*' && !t[1]) return 0; return *t; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_match_tag(struct soap *soap, const char *tag1, const char *tag2) { const char *s, *t; int err; if (!tag1 || !tag2 || !*tag2) return SOAP_OK; s = strchr(tag1, ':'); t = strchr(tag2, ':'); if (t) { if (s) { if (t[1] && SOAP_STRCMP(s + 1, t + 1)) return SOAP_TAG_MISMATCH; if (t != tag2 && (err = soap_match_namespace(soap, tag1, tag2, s - tag1, t - tag2))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Tags '%s' and '%s' match but namespaces differ\n", tag1, tag2)); if (err == SOAP_NAMESPACE) return SOAP_TAG_MISMATCH; return err; } } else if (!t[1]) { if ((soap->mode & SOAP_XML_IGNORENS) || soap_match_namespace(soap, tag1, tag2, 0, t - tag2)) return SOAP_TAG_MISMATCH; } else if (SOAP_STRCMP(tag1, t + 1)) { return SOAP_TAG_MISMATCH; } else if (t != tag2 && (err = soap_match_namespace(soap, tag1, tag2, 0, t - tag2))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Tags '%s' and '%s' match but namespaces differ\n", tag1, tag2)); if (err == SOAP_NAMESPACE) return SOAP_TAG_MISMATCH; return err; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Tags and (default) namespaces match: '%s' '%s'\n", tag1, tag2)); return SOAP_OK; } if (s) { if (!(soap->mode & SOAP_XML_IGNORENS) || SOAP_STRCMP(s + 1, tag2)) /* always fails (except when ignoring ns) */ return SOAP_TAG_MISMATCH; } else if (SOAP_STRCMP(tag1, tag2) || ((soap->mode & SOAP_XML_STRICT) && !(soap->mode & SOAP_XML_IGNORENS) && soap_match_namespace(soap, tag1, tag2, 0, 0))) /* strict checking: default namespace must be null namespace */ return SOAP_TAG_MISMATCH; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Tags match: '%s' '%s'\n", tag1, tag2)); return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_match_array(struct soap *soap, const char *type) { if (*soap->arrayType) if (soap_match_tag(soap, soap->arrayType, type) && soap_match_tag(soap, soap->arrayType, "xsd:anyType") && soap_match_tag(soap, soap->arrayType, "xsd:ur-type") ) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Array type mismatch: '%s' '%s'\n", soap->arrayType, type)); return SOAP_TAG_MISMATCH; } return SOAP_OK; } #endif /******************************************************************************\ * * SSL/TLS * \******************************************************************************/ #ifdef WITH_OPENSSL #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_rand() { unsigned char buf[4]; if (!soap_ssl_init_done) soap_ssl_init(); RAND_pseudo_bytes(buf, 4); return *(int*)buf; } #endif #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) || defined(WITH_SYSTEMSSL) #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE) soap_ssl_server_context(struct soap *soap, unsigned short flags, const char *keyfile, const char *keyid, const char *password, const char *cafile, const char *capath, const char *dhfile, const char *randfile, const char *sid) #else soap_ssl_server_context(struct soap *soap, unsigned short flags, const char *keyfile, const char *password, const char *cafile, const char *capath, const char *dhfile, const char *randfile, const char *sid) #endif { int err; soap->keyfile = keyfile; #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE) soap->keyid = keyid; #endif soap->password = password; soap->cafile = cafile; soap->capath = capath; #ifdef WITH_OPENSSL soap->dhfile = dhfile; soap->randfile = randfile; if (!soap->fsslverify) soap->fsslverify = ssl_verify_callback; #endif soap->ssl_flags = flags | (dhfile == NULL ? SOAP_SSL_RSA : 0); #ifdef WITH_GNUTLS (void)randfile; (void)sid; if (dhfile) { char *s; int n = (int)soap_strtoul(dhfile, &s, 10); if (!soap->dh_params) gnutls_dh_params_init(&soap->dh_params); /* if dhfile is numeric, treat it as a key length to generate DH params which can take a while */ if (n >= 512 && s && *s == '\0') gnutls_dh_params_generate2(soap->dh_params, (unsigned int)n); else { unsigned int dparams_len; unsigned char dparams_buf[1024]; FILE *fd = fopen(dhfile, "r"); if (!fd) return soap_set_receiver_error(soap, "SSL/TLS error", "Invalid DH file", SOAP_SSL_ERROR); dparams_len = (unsigned int)fread(dparams_buf, 1, sizeof(dparams_buf), fd); fclose(fd); gnutls_datum_t dparams = { dparams_buf, dparams_len }; if (gnutls_dh_params_import_pkcs3(soap->dh_params, &dparams, GNUTLS_X509_FMT_PEM)) return soap_set_receiver_error(soap, "SSL/TLS error", "Invalid DH file", SOAP_SSL_ERROR); } } else { if (!soap->rsa_params) gnutls_rsa_params_init(&soap->rsa_params); gnutls_rsa_params_generate2(soap->rsa_params, SOAP_SSL_RSA_BITS); } if (soap->session) { gnutls_deinit(soap->session); soap->session = NULL; } if (soap->xcred) { gnutls_certificate_free_credentials(soap->xcred); soap->xcred = NULL; } #endif #ifdef WITH_SYSTEMSSL (void)randfile; (void)sid; if (soap->ctx) gsk_environment_close(&soap->ctx); #endif err = soap->fsslauth(soap); #ifdef WITH_OPENSSL if (!err) { if (sid) SSL_CTX_set_session_id_context(soap->ctx, (unsigned char*)sid, (unsigned int)strlen(sid)); else SSL_CTX_set_session_cache_mode(soap->ctx, SSL_SESS_CACHE_OFF); } #endif return err; } #endif #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) || defined(WITH_SYSTEMSSL) #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE) soap_ssl_client_context(struct soap *soap, unsigned short flags, const char *keyfile, const char *keyid, const char *password, const char *cafile, const char *capath, const char *randfile) #else soap_ssl_client_context(struct soap *soap, unsigned short flags, const char *keyfile, const char *password, const char *cafile, const char *capath, const char *randfile) #endif { soap->keyfile = keyfile; #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE) soap->keyid = keyid; #endif soap->password = password; soap->cafile = cafile; soap->capath = capath; soap->ssl_flags = SOAP_SSL_CLIENT | flags; #ifdef WITH_OPENSSL soap->dhfile = NULL; soap->randfile = randfile; if (!soap->fsslverify) soap->fsslverify = (flags & SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE) == 0 ? ssl_verify_callback : ssl_verify_callback_allow_expired_certificate; #endif #ifdef WITH_GNUTLS (void)randfile; if (soap->session) { gnutls_deinit(soap->session); soap->session = NULL; } if (soap->xcred) { gnutls_certificate_free_credentials(soap->xcred); soap->xcred = NULL; } #endif #ifdef WITH_SYSTEMSSL (void)randfile; if (soap->ctx) gsk_environment_close(&soap->ctx); #endif return soap->fsslauth(soap); } #endif #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_ssl_crl(struct soap *soap, const char *crlfile) { #ifdef WITH_OPENSSL if (crlfile && soap->ctx) { #if (OPENSSL_VERSION_NUMBER >= 0x0090800fL) X509_STORE *store = SSL_CTX_get_cert_store(soap->ctx); if (*crlfile) { int ret; X509_LOOKUP *lookup = X509_STORE_add_lookup(store, X509_LOOKUP_file()); if ((ret = X509_load_crl_file(lookup, crlfile, X509_FILETYPE_PEM)) <= 0) return soap_set_receiver_error(soap, soap_ssl_error(soap, ret), "Can't read CRL file", SOAP_SSL_ERROR); } X509_VERIFY_PARAM *param = X509_VERIFY_PARAM_new(); X509_VERIFY_PARAM_set_flags(param, X509_V_FLAG_CRL_CHECK); X509_STORE_set1_param(store, param); X509_VERIFY_PARAM_free(param); #endif } else soap->crlfile = crlfile; /* activate later when store is available */ #endif #ifdef WITH_GNUTLS if (crlfile && soap->xcred) { if (*crlfile) if (gnutls_certificate_set_x509_crl_file(soap->xcred, crlfile, GNUTLS_X509_FMT_PEM) < 0) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read CRL file", SOAP_SSL_ERROR); } else soap->crlfile = crlfile; /* activate later when xcred is available */ #endif return SOAP_OK; } #endif #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_ssl_init() { /* Note: for MT systems, the main program MUST call soap_ssl_init() before any threads are started */ if (!soap_ssl_init_done) { soap_ssl_init_done = 1; #ifdef WITH_OPENSSL SSL_library_init(); OpenSSL_add_all_algorithms(); /* we keep ciphers and digests for the program's lifetime */ #ifndef WITH_LEAN SSL_load_error_strings(); #endif if (!RAND_load_file("/dev/urandom", 1024)) { char buf[1024]; RAND_seed(buf, sizeof(buf)); while (!RAND_status()) { int r = rand(); RAND_seed(&r, sizeof(int)); } } #endif #ifdef WITH_GNUTLS # if defined(HAVE_PTHREAD_H) gcry_control(GCRYCTL_SET_THREAD_CBS, &gcry_threads_pthread); # elif defined(HAVE_PTH_H) gcry_control(GCRYCTL_SET_THREAD_CBS, &gcry_threads_pth); # endif gcry_control(GCRYCTL_ENABLE_QUICK_RANDOM, 0); gcry_control(GCRYCTL_DISABLE_SECMEM, 0); gcry_control(GCRYCTL_INITIALIZATION_FINISHED, 0); /* libgcrypt init done */ gnutls_global_init(); #endif } } #endif #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) #ifndef PALM_1 SOAP_FMAC1 const char * SOAP_FMAC2 soap_ssl_error(struct soap *soap, int ret) { #ifdef WITH_OPENSSL int err = SSL_get_error(soap->ssl, ret); const char *msg = soap_code_str(h_ssl_error_codes, err); if (msg) (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), strlen(msg) + 1), "%s\n", msg); else return ERR_error_string(err, soap->msgbuf); if (ERR_peek_error()) { unsigned long r; while ((r = ERR_get_error())) { size_t l = strlen(soap->msgbuf); ERR_error_string_n(r, soap->msgbuf + l, sizeof(soap->msgbuf) - l); } } else { size_t l = strlen(soap->msgbuf); switch (ret) { case 0: soap_strcpy(soap->msgbuf + l, sizeof(soap->msgbuf) - l, "EOF was observed that violates the SSL/TLS protocol. The client probably provided invalid authentication information."); break; case -1: { const char *s = strerror(soap_errno); (SOAP_SNPRINTF(soap->msgbuf + l, sizeof(soap->msgbuf) - l, strlen(s) + 42), "Error observed by underlying SSL/TLS BIO: %s", s); } break; } } return soap->msgbuf; #endif #ifdef WITH_GNUTLS (void)soap; return gnutls_strerror(ret); #endif } #endif #endif /******************************************************************************/ #ifdef WITH_SYSTEMSSL static int ssl_recv(int sk, void *s, int n, char *user) { (void)user; return recv(sk, s, n, 0); } #endif /******************************************************************************/ #ifdef WITH_SYSTEMSSL static int ssl_send(int sk, void *s, int n, char *user) { (void)user; return send(sk, s, n, 0); } #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) || defined(WITH_SYSTEMSSL) #ifndef PALM_1 static int ssl_auth_init(struct soap *soap) { #ifdef WITH_OPENSSL long flags; int mode; #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE) EVP_PKEY* pkey; #endif if (!soap_ssl_init_done) soap_ssl_init(); ERR_clear_error(); if (!soap->ctx) { #if (OPENSSL_VERSION_NUMBER >= 0x10100000L) /* TLS_method: a TLS/SSL connection established may understand the SSLv3, TLSv1, TLSv1.1 and TLSv1.2 protocols. */ soap->ctx = SSL_CTX_new(TLS_method()); #else /* SSLv23_method: a TLS/SSL connection established may understand the SSLv3, TLSv1, TLSv1.1 and TLSv1.2 protocols. */ soap->ctx = SSL_CTX_new(SSLv23_method()); #endif if (!soap->ctx) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't setup context", SOAP_SSL_ERROR); /* The following alters the behavior of SSL read/write: */ #if 0 SSL_CTX_set_mode(soap->ctx, SSL_MODE_ENABLE_PARTIAL_WRITE | SSL_MODE_AUTO_RETRY); #endif } if (soap->randfile) { if (!RAND_load_file(soap->randfile, -1)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't load randomness", SOAP_SSL_ERROR); } if (soap->cafile || soap->capath) { if (!SSL_CTX_load_verify_locations(soap->ctx, soap->cafile, soap->capath)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read CA file", SOAP_SSL_ERROR); if (soap->cafile && (soap->ssl_flags & SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION)) SSL_CTX_set_client_CA_list(soap->ctx, SSL_load_client_CA_file(soap->cafile)); } if (!(soap->ssl_flags & SOAP_SSL_NO_DEFAULT_CA_PATH)) { if (!SSL_CTX_set_default_verify_paths(soap->ctx)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read default CA file and/or directory", SOAP_SSL_ERROR); } if (soap->crlfile) { if (soap_ssl_crl(soap, soap->crlfile)) return soap->error; } /* This code assumes a typical scenario with key and cert in one PEM file, see alternative code below */ #if 1 if (soap->keyfile) { if (!SSL_CTX_use_certificate_chain_file(soap->ctx, soap->keyfile)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't find or read certificate in key file", SOAP_SSL_ERROR); if (soap->password) { SSL_CTX_set_default_passwd_cb_userdata(soap->ctx, (void*)soap->password); SSL_CTX_set_default_passwd_cb(soap->ctx, ssl_password); } #ifndef WM_SECURE_KEY_STORAGE if (!SSL_CTX_use_PrivateKey_file(soap->ctx, soap->keyfile, SSL_FILETYPE_PEM)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read key file", SOAP_SSL_ERROR); #endif } #else /* Suggested alternative approach to check the key file for cert only when cafile==NULL */ if (soap->password) { SSL_CTX_set_default_passwd_cb_userdata(soap->ctx, (void*)soap->password); SSL_CTX_set_default_passwd_cb(soap->ctx, ssl_password); } if (!soap->cafile) { if (soap->keyfile) { if (!SSL_CTX_use_certificate_chain_file(soap->ctx, soap->keyfile)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't find or read certificate in key file", SOAP_SSL_ERROR); if (!SSL_CTX_use_PrivateKey_file(soap->ctx, soap->keyfile, SSL_FILETYPE_PEM)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read key file", SOAP_SSL_ERROR); } } else /* use cafile for (server) cert and keyfile for (server) key */ { if (!SSL_CTX_use_certificate_chain_file(soap->ctx, soap->cafile)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read CA file", SOAP_SSL_ERROR); if (soap->keyfile) if (!SSL_CTX_use_PrivateKey_file(soap->ctx, soap->keyfile, SSL_FILETYPE_PEM)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read key file", SOAP_SSL_ERROR); } #endif #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE) if (NULL == (pkey = ipcom_key_db_pkey_get(soap->keyid))) return soap_set_receiver_error(soap, "SSL error", "Can't find key", SOAP_SSL_ERROR); if (0 == SSL_CTX_use_PrivateKey(soap->ctx, pkey)) return soap_set_receiver_error(soap, "SSL error", "Can't read key", SOAP_SSL_ERROR); #endif if ((soap->ssl_flags & SOAP_SSL_RSA)) { RSA *rsa = RSA_generate_key(SOAP_SSL_RSA_BITS, RSA_F4, NULL, NULL); if (!SSL_CTX_set_tmp_rsa(soap->ctx, rsa)) { if (rsa) RSA_free(rsa); return soap_set_receiver_error(soap, "SSL/TLS error", "Can't set RSA key", SOAP_SSL_ERROR); } RSA_free(rsa); } else if (soap->dhfile) { DH *dh = 0; char *s; int n = (int)soap_strtoul(soap->dhfile, &s, 10); /* if dhfile is numeric, treat it as a key length to generate DH params which can take a while */ if (n >= 512 && s && *s == '\0') #if defined(VXWORKS) DH_generate_parameters_ex(dh, n, 2/*or 5*/, NULL); #else dh = DH_generate_parameters(n, 2/*or 5*/, NULL, NULL); #endif else { BIO *bio; bio = BIO_new_file(soap->dhfile, "r"); if (!bio) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read DH file", SOAP_SSL_ERROR); dh = PEM_read_bio_DHparams(bio, NULL, NULL, NULL); BIO_free(bio); } if (!dh || DH_check(dh, &n) != 1 || SSL_CTX_set_tmp_dh(soap->ctx, dh) < 0) { if (dh) DH_free(dh); return soap_set_receiver_error(soap, "SSL/TLS error", "Can't set DH parameters", SOAP_SSL_ERROR); } DH_free(dh); } flags = (SSL_OP_ALL | SSL_OP_NO_SSLv2); /* disable SSL v2 by default */ if ((soap->ssl_flags & SOAP_SSLv3)) { #if (OPENSSL_VERSION_NUMBER >= 0x10001000L) flags |= SSL_OP_NO_TLSv1 | SSL_OP_NO_TLSv1_1 | SSL_OP_NO_TLSv1_2; #else flags |= SSL_OP_NO_TLSv1; #endif } else { if (!(soap->ssl_flags & SOAP_SSLv3_TLSv1)) flags |= SSL_OP_NO_SSLv3; /* disable SSL v3 by default, unless SOAP_SSLv3 or SOAP_SSLv3_TLSv1 is set */ #if (OPENSSL_VERSION_NUMBER >= 0x10001000L) if ((soap->ssl_flags & SOAP_TLSv1_0)) flags |= SSL_OP_NO_TLSv1_1 | SSL_OP_NO_TLSv1_2; else if ((soap->ssl_flags & SOAP_TLSv1_1)) flags |= SSL_OP_NO_TLSv1 | SSL_OP_NO_TLSv1_2; else if ((soap->ssl_flags & SOAP_TLSv1_2)) flags |= SSL_OP_NO_TLSv1 | SSL_OP_NO_TLSv1_1; #endif } #ifdef SSL_OP_NO_TICKET /* TLS extension is enabled by default in OPENSSL v0.9.8k Disable it by adding SSL_OP_NO_TICKET */ flags |= SSL_OP_NO_TICKET; #endif SSL_CTX_set_options(soap->ctx, flags); if ((soap->ssl_flags & SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION)) mode = (SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT); else if ((soap->ssl_flags & SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION)) mode = SSL_VERIFY_PEER; else mode = SSL_VERIFY_NONE; SSL_CTX_set_verify(soap->ctx, mode, soap->fsslverify); #if (OPENSSL_VERSION_NUMBER < 0x00905100L) SSL_CTX_set_verify_depth(soap->ctx, 1); #else SSL_CTX_set_verify_depth(soap->ctx, 9); #endif #endif #ifdef WITH_GNUTLS int ret; if (!soap_ssl_init_done) soap_ssl_init(); if (!soap->xcred) { gnutls_certificate_allocate_credentials(&soap->xcred); if (soap->cafile) { if (gnutls_certificate_set_x509_trust_file(soap->xcred, soap->cafile, GNUTLS_X509_FMT_PEM) < 0) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read CA file", SOAP_SSL_ERROR); } if (soap->crlfile) { if (soap_ssl_crl(soap, soap->crlfile)) return soap->error; } if (soap->keyfile) { if (gnutls_certificate_set_x509_key_file(soap->xcred, soap->keyfile, soap->keyfile, GNUTLS_X509_FMT_PEM) < 0) /* Assumes that key and cert(s) are concatenated in the keyfile */ return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read key file", SOAP_SSL_ERROR); } } if ((soap->ssl_flags & SOAP_SSL_CLIENT)) { gnutls_init(&soap->session, GNUTLS_CLIENT); if (soap->cafile || soap->crlfile || soap->keyfile) { ret = gnutls_priority_set_direct(soap->session, "PERFORMANCE", NULL); if (ret < 0) return soap_set_receiver_error(soap, soap_ssl_error(soap, ret), "SSL/TLS set priority error", SOAP_SSL_ERROR); gnutls_credentials_set(soap->session, GNUTLS_CRD_CERTIFICATE, soap->xcred); } else { if (!soap->acred) gnutls_anon_allocate_client_credentials(&soap->acred); gnutls_init(&soap->session, GNUTLS_CLIENT); gnutls_priority_set_direct(soap->session, "PERFORMANCE:+ANON-DH:!ARCFOUR-128", NULL); gnutls_credentials_set(soap->session, GNUTLS_CRD_ANON, soap->acred); } } else { if (!soap->keyfile) return soap_set_receiver_error(soap, "SSL/TLS error", "No key file: anonymous server authentication not supported in this release", SOAP_SSL_ERROR); if ((soap->ssl_flags & SOAP_SSL_RSA) && soap->rsa_params) gnutls_certificate_set_rsa_export_params(soap->xcred, soap->rsa_params); else if (soap->dh_params) gnutls_certificate_set_dh_params(soap->xcred, soap->dh_params); if (!soap->cache) gnutls_priority_init(&soap->cache, "NORMAL", NULL); gnutls_init(&soap->session, GNUTLS_SERVER); gnutls_priority_set(soap->session, soap->cache); gnutls_credentials_set(soap->session, GNUTLS_CRD_CERTIFICATE, soap->xcred); if ((soap->ssl_flags & SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION)) gnutls_certificate_server_set_request(soap->session, GNUTLS_CERT_REQUEST); gnutls_session_enable_compatibility_mode(soap->session); if ((soap->ssl_flags & SOAP_SSLv3)) { int protocol_priority[] = { GNUTLS_SSL3, 0 }; if (gnutls_protocol_set_priority(soap->session, protocol_priority) != GNUTLS_E_SUCCESS) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't set SSLv3 protocol", SOAP_SSL_ERROR); } else if ((soap->ssl_flags & SOAP_TLSv1_0)) { int protocol_priority[] = { GNUTLS_TLS1_0, 0 }; if (gnutls_protocol_set_priority(soap->session, protocol_priority) != GNUTLS_E_SUCCESS) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't set TLSv1.0 protocol", SOAP_SSL_ERROR); } else if ((soap->ssl_flags & SOAP_TLSv1_1)) { int protocol_priority[] = { GNUTLS_TLS1_1, 0 }; if (gnutls_protocol_set_priority(soap->session, protocol_priority) != GNUTLS_E_SUCCESS) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't set TLSv1.1 protocol", SOAP_SSL_ERROR); } else if ((soap->ssl_flags & SOAP_TLSv1_2)) { int protocol_priority[] = { GNUTLS_TLS1_2, 0 }; if (gnutls_protocol_set_priority(soap->session, protocol_priority) != GNUTLS_E_SUCCESS) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't set TLSv1.2 protocol", SOAP_SSL_ERROR); } else if ((soap->ssl_flags & SOAP_SSLv3_TLSv1)) { int protocol_priority[] = { GNUTLS_SSL3, GNUTLS_TLS1_0, GNUTLS_TLS1_1, GNUTLS_TLS1_2, 0 }; if (gnutls_protocol_set_priority(soap->session, protocol_priority) != GNUTLS_E_SUCCESS) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't set SSLv3 & TLSv1 protocols", SOAP_SSL_ERROR); } else { int protocol_priority[] = { GNUTLS_TLS1_0, GNUTLS_TLS1_1, GNUTLS_TLS1_2, 0 }; if (gnutls_protocol_set_priority(soap->session, protocol_priority) != GNUTLS_E_SUCCESS) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't set TLSv1 protocols", SOAP_SSL_ERROR); } } #endif #ifdef WITH_SYSTEMSSL if (!soap->ctx) { int err; err = gsk_environment_open(&soap->ctx); if (err == GSK_OK) err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_SSLV2, GSK_PROTOCOL_SSLV2_OFF); if (err == GSK_OK) { if ((soap->ssl_flags & SOAP_SSLv3) || (soap->ssl_flags & SOAP_SSLv3_TLSv1)) err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_SSLV3, GSK_PROTOCOL_SSLV3_ON); else err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_SSLV3, GSK_PROTOCOL_SSLV3_OFF); } if (!(soap->ssl_flags & SOAP_SSLv3)) { if (err == GSK_OK) err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_TLSV1, GSK_PROTOCOL_TLSV1_ON); if (err == GSK_OK) err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_TLSV1_1, GSK_PROTOCOL_TLSV1_1_ON); if (err == GSK_OK) err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_TLSV1_2, GSK_PROTOCOL_TLSV1_2_ON); } else { if (err == GSK_OK) err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_TLSV1, GSK_PROTOCOL_TLSV1_OFF); if (err == GSK_OK) err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_TLSV1_1, GSK_PROTOCOL_TLSV1_1_OFF); if (err == GSK_OK) err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_TLSV1_2, GSK_PROTOCOL_TLSV1_2_OFF); } if (err == GSK_OK) err = gsk_attribute_set_buffer(soap->ctx, GSK_KEYRING_FILE, soap->keyfile, 0); /* keyfile is a keyring .kdb file */ if (err == GSK_OK) err = gsk_attribute_set_buffer(soap->ctx, GSK_KEYRING_PW, soap->password, 0); /* locked by password */ if (err == GSK_OK) err = gsk_environment_init(soap->ctx); if (err != GSK_OK) return soap_set_receiver_error(soap, gsk_strerror(err), "SYSTEM SSL error in ssl_auth_init()", SOAP_SSL_ERROR); } #endif return SOAP_OK; } #endif #endif /******************************************************************************/ #ifdef WITH_OPENSSL #ifndef PALM_1 static int ssl_password(char *buf, int num, int rwflag, void *userdata) { (void)rwflag; if (!buf || !userdata) return 0; soap_strcpy(buf, (size_t)num, (char*)userdata); return (int)strlen(buf); } #endif #endif /******************************************************************************/ #ifdef WITH_OPENSSL #ifndef PALM_1 static int ssl_verify_callback(int ok, X509_STORE_CTX *store) { (void)store; #ifdef SOAP_DEBUG if (!ok) { char buf[1024]; int err = X509_STORE_CTX_get_error(store); X509 *cert = X509_STORE_CTX_get_current_cert(store); fprintf(stderr, "\nDEBUG mode TLS/SSL warnings:\nSSL verify error %d or warning with certificate at depth %d: %s\n", err, X509_STORE_CTX_get_error_depth(store), X509_verify_cert_error_string(err)); X509_NAME_oneline(X509_get_issuer_name(cert), buf, sizeof(buf)); fprintf(stderr, " certificate issuer: %s\n", buf); X509_NAME_oneline(X509_get_subject_name(cert), buf, sizeof(buf)); fprintf(stderr, " certificate subject: %s\n", buf); /* accept self-signed certificates and certificates out of date */ switch (err) { case X509_V_ERR_CERT_NOT_YET_VALID: case X509_V_ERR_CERT_HAS_EXPIRED: case X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT: case X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN: case X509_V_ERR_UNABLE_TO_GET_CRL: case X509_V_ERR_CRL_NOT_YET_VALID: case X509_V_ERR_CRL_HAS_EXPIRED: X509_STORE_CTX_set_error(store, X509_V_OK); ok = 1; fprintf(stderr, "Initialize soap_ssl_client_context with SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE to allow this verification error to pass without DEBUG mode enabled\n"); } } #endif /* Note: return 1 to try to continue, but unsafe progress will be terminated by OpenSSL */ return ok; } #endif #endif /******************************************************************************/ #ifdef WITH_OPENSSL #ifndef PALM_1 static int ssl_verify_callback_allow_expired_certificate(int ok, X509_STORE_CTX *store) { ok = ssl_verify_callback(ok, store); if (!ok) { /* accept self signed certificates, expired certificates, and certficiates w/o CRL */ switch (X509_STORE_CTX_get_error(store)) { case X509_V_ERR_CERT_NOT_YET_VALID: case X509_V_ERR_CERT_HAS_EXPIRED: case X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT: case X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN: case X509_V_ERR_UNABLE_TO_GET_CRL: case X509_V_ERR_CRL_NOT_YET_VALID: case X509_V_ERR_CRL_HAS_EXPIRED: X509_STORE_CTX_set_error(store, X509_V_OK); ok = 1; } } /* Note: return 1 to continue, but unsafe progress will be terminated by SSL */ return ok; } #endif #endif /******************************************************************************/ #ifdef WITH_GNUTLS static const char * ssl_verify(struct soap *soap, const char *host) { unsigned int status; const char *err = NULL; int r = gnutls_certificate_verify_peers2(soap->session, &status); if (r < 0) err = "Certificate verify error"; else if ((status & GNUTLS_CERT_INVALID)) err = "The certificate is not trusted"; else if ((status & GNUTLS_CERT_SIGNER_NOT_FOUND)) err = "The certificate hasn't got a known issuer"; else if ((status & GNUTLS_CERT_REVOKED)) err = "The certificate has been revoked"; else if (gnutls_certificate_type_get(soap->session) == GNUTLS_CRT_X509) { gnutls_x509_crt_t cert; const gnutls_datum_t *cert_list; unsigned int cert_list_size; if (gnutls_x509_crt_init(&cert) < 0) err = "Could not get X509 certificates"; else if ((cert_list = gnutls_certificate_get_peers(soap->session, &cert_list_size)) == NULL) err = "Could not get X509 certificates"; else if (gnutls_x509_crt_import(cert, &cert_list[0], GNUTLS_X509_FMT_DER) < 0) err = "Error parsing X509 certificate"; else if (!(soap->ssl_flags & SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE) && gnutls_x509_crt_get_expiration_time(cert) < time(NULL)) err = "The certificate has expired"; else if (!(soap->ssl_flags & SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE) && gnutls_x509_crt_get_activation_time(cert) > time(NULL)) err = "The certificate is not yet activated"; else if (host && !(soap->ssl_flags & SOAP_SSL_SKIP_HOST_CHECK)) { if (!gnutls_x509_crt_check_hostname(cert, host)) err = "Certificate host name mismatch"; } gnutls_x509_crt_deinit(cert); } return err; } #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) #ifndef WITH_NOIO #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_ssl_accept(struct soap *soap) { SOAP_SOCKET sk = soap->socket; #ifdef WITH_OPENSSL BIO *bio; int retries, r, s; if (!soap_valid_socket(sk)) return soap_set_receiver_error(soap, "SSL/TLS error", "No socket in soap_ssl_accept()", SOAP_SSL_ERROR); soap->ssl_flags &= ~SOAP_SSL_CLIENT; if (!soap->ctx && (soap->error = soap->fsslauth(soap))) return soap->error; if (!soap->ssl) { soap->ssl = SSL_new(soap->ctx); if (!soap->ssl) return soap_set_receiver_error(soap, "SSL/TLS error", "SSL_new() failed in soap_ssl_accept()", SOAP_SSL_ERROR); } else SSL_clear(soap->ssl); bio = BIO_new_socket((int)sk, BIO_NOCLOSE); SSL_set_bio(soap->ssl, bio, bio); /* Set SSL sockets to non-blocking */ retries = 0; if (soap->accept_timeout) { SOAP_SOCKNONBLOCK(sk) retries = 10*soap->accept_timeout; } if (retries <= 0) retries = 100; /* timeout: 10 sec retries, 100 times 0.1 sec */ while ((r = SSL_accept(soap->ssl)) <= 0) { int err; if (retries-- <= 0) break; err = SSL_get_error(soap->ssl, r); if (err == SSL_ERROR_WANT_ACCEPT || err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE) { if (err == SSL_ERROR_WANT_READ) s = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, -100000); else s = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, -100000); if (s < 0) break; } else { soap->errnum = soap_socket_errno(sk); break; } } if (r <= 0) { soap_set_receiver_error(soap, soap_ssl_error(soap, r), "SSL_accept() failed in soap_ssl_accept()", SOAP_SSL_ERROR); soap_closesock(soap); return SOAP_SSL_ERROR; } if ((soap->ssl_flags & SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION)) { X509 *peer; int err; if ((err = SSL_get_verify_result(soap->ssl)) != X509_V_OK) { soap_closesock(soap); return soap_set_sender_error(soap, X509_verify_cert_error_string(err), "SSL certificate presented by peer cannot be verified in soap_ssl_accept()", SOAP_SSL_ERROR); } peer = SSL_get_peer_certificate(soap->ssl); if (!peer) { soap_closesock(soap); return soap_set_sender_error(soap, "SSL/TLS error", "No SSL certificate was presented by the peer in soap_ssl_accept()", SOAP_SSL_ERROR); } X509_free(peer); } #endif #ifdef WITH_GNUTLS int retries = 0, r; if (!soap_valid_socket(sk)) return soap_set_receiver_error(soap, "SSL/TLS error", "No socket in soap_ssl_accept()", SOAP_SSL_ERROR); soap->ssl_flags &= ~SOAP_SSL_CLIENT; if (!soap->session && (soap->error = soap->fsslauth(soap))) { soap_closesock(soap); return soap->error; } gnutls_transport_set_ptr(soap->session, (gnutls_transport_ptr_t)(long)sk); /* Set SSL sockets to non-blocking */ if (soap->accept_timeout) { SOAP_SOCKNONBLOCK(sk) retries = 10*soap->accept_timeout; } if (retries <= 0) retries = 100; /* timeout: 10 sec retries, 100 times 0.1 sec */ while ((r = gnutls_handshake(soap->session))) { int s; /* GNUTLS repeat handhake when GNUTLS_E_AGAIN */ if (retries-- <= 0) break; if (r == GNUTLS_E_AGAIN || r == GNUTLS_E_INTERRUPTED) { if (!gnutls_record_get_direction(soap->session)) s = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, -100000); else s = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, -100000); if (s < 0) break; } else { soap->errnum = soap_socket_errno(sk); break; } } if (r) { soap_closesock(soap); return soap_set_receiver_error(soap, soap_ssl_error(soap, r), "SSL/TLS handshake failed", SOAP_SSL_ERROR); } if ((soap->ssl_flags & SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION)) { const char *err = ssl_verify(soap, NULL); if (err) { soap_closesock(soap); return soap_set_receiver_error(soap, "SSL/TLS error", err, SOAP_SSL_ERROR); } } #endif #ifdef WITH_SYSTEMSSL gsk_iocallback local_io = { ssl_recv, ssl_send, NULL, NULL, NULL, NULL }; int err, s; int retries = 0; if (soap->accept_timeout) { SOAP_SOCKNONBLOCK(sk) retries = 10*soap->accept_timeout; } if (retries <= 0) retries = 100; /* timeout: 10 sec retries, 100 times 0.1 sec */ err = gsk_secure_socket_open(soap->ctx, &soap->ssl); if (err == GSK_OK) err = gsk_attribute_set_numeric_value(soap->ssl, GSK_FD, sk); if (err == GSK_OK) err = gsk_attribute_set_buffer(soap->ssl, GSK_KEYRING_LABEL, soap->cafile, 0); if (err == GSK_OK) err = gsk_attribute_set_enum(soap->ssl, GSK_SESSION_TYPE, GSK_SERVER_SESSION); if (err == GSK_OK) err = gsk_attribute_set_buffer(soap->ssl, GSK_V3_CIPHER_SPECS_EXPANDED, "0035002F000A", 0); if (err == GSK_OK) err = gsk_attribute_set_enum(soap->ssl, GSK_V3_CIPHERS, GSK_V3_CIPHERS_CHAR4); if (err == GSK_OK) err = gsk_attribute_set_callback(soap->ssl, GSK_IO_CALLBACK, &local_io); if (err != GSK_OK) return soap_set_receiver_error(soap, gsk_strerror(err), "SYSTEM SSL error in soap_ssl_accept()", SOAP_SSL_ERROR); while ((err = gsk_secure_socket_init(soap->ssl)) != GSK_OK) { if (retries-- <= 0) break; if (err == GSK_WOULD_BLOCK_READ || err == GSK_WOULD_BLOCK_WRITE) { if (err == GSK_WOULD_BLOCK_READ) s = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, -100000); else s = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, -100000); if (s < 0) break; } else { soap->errnum = soap_socket_errno(sk); break; } } if (err != GSK_OK) return soap_set_receiver_error(soap, gsk_strerror(err), "gsk_secure_socket_init() failed in soap_ssl_accept()", SOAP_SSL_ERROR); #endif if (soap->recv_timeout || soap->send_timeout) SOAP_SOCKNONBLOCK(sk) else SOAP_SOCKBLOCK(sk) soap->imode |= SOAP_ENC_SSL; soap->omode |= SOAP_ENC_SSL; return SOAP_OK; } #endif #endif #endif /******************************************************************************\ * * TCP/UDP [SSL/TLS] IPv4 and IPv6 * \******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 static int tcp_init(struct soap *soap) { soap->errmode = 1; #ifdef WIN32 if (tcp_done) return 0; else { WSADATA w; if (WSAStartup(MAKEWORD(1, 1), &w)) return -1; tcp_done = 1; } #endif return 0; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 static const char* tcp_error(struct soap *soap) { const char *msg = NULL; switch (soap->errmode) { case 0: msg = soap_strerror(soap); break; case 1: msg = "WSAStartup failed"; break; case 2: { #ifndef WITH_LEAN msg = soap_code_str(h_error_codes, soap->errnum); if (!msg) #endif { (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), 37), "TCP/UDP IP error %d", soap->errnum); msg = soap->msgbuf; } } } return msg; } #endif #endif /******************************************************************************/ #ifndef WITH_IPV6 #ifndef WITH_NOIO #ifndef PALM_1 static int tcp_gethost(struct soap *soap, const char *addr, struct in_addr *inaddr) { soap_int32 iadd = -1; struct hostent hostent, *host = &hostent; #ifdef VXWORKS int hostint; /* inet_addr(), and hostGetByName() expect "char *"; addr is a "const char *". */ iadd = inet_addr((char*)addr); #else #if defined(_AIX43) || ((defined(TRU64) || defined(HP_UX)) && defined(HAVE_GETHOSTBYNAME_R)) struct hostent_data ht_data; #endif #ifdef AS400 iadd = inet_addr((void*)addr); #else iadd = inet_addr((char*)addr); #endif #endif if (iadd != -1) { if (soap_memcpy((void*)inaddr, sizeof(struct in_addr), (const void*)&iadd, sizeof(iadd))) return soap->error = SOAP_EOM; return SOAP_OK; } #if defined(__GLIBC__) || (defined(HAVE_GETHOSTBYNAME_R) && (defined(FREEBSD) || defined(__FreeBSD__))) || defined(__ANDROID__) if (gethostbyname_r(addr, &hostent, soap->buf, sizeof(soap->buf), &host, &soap->errnum) < 0) host = NULL; #elif defined(_AIX43) || ((defined(TRU64) || defined(HP_UX)) && defined(HAVE_GETHOSTBYNAME_R)) memset((void*)&ht_data, 0, sizeof(ht_data)); if (gethostbyname_r(addr, &hostent, &ht_data) < 0) { host = NULL; soap->errnum = h_errno; } #elif defined(HAVE_GETHOSTBYNAME_R) host = gethostbyname_r(addr, &hostent, soap->buf, sizeof(soap->buf), &soap->errnum); #elif defined(VXWORKS) /* If the DNS resolver library resolvLib has been configured in the vxWorks * image, a query for the host IP address is sent to the DNS server, if the * name was not found in the local host table. */ hostint = hostGetByName((char*)addr); if (hostint == ERROR) { host = NULL; soap->errnum = soap_errno; } #else #ifdef AS400 if (!(host = gethostbyname((void*)addr))) soap->errnum = h_errno; #else if (!(host = gethostbyname((char*)addr))) soap->errnum = h_errno; #endif #endif if (!host) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Host name not found\n")); return SOAP_ERR; } #ifdef VXWORKS inaddr->s_addr = hostint; #else if (soap_memcpy((void*)inaddr, sizeof(struct in_addr), (const void*)host->h_addr, (size_t)host->h_length)) return soap->error = SOAP_EOM; #endif return SOAP_OK; } #endif #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 static SOAP_SOCKET tcp_connect(struct soap *soap, const char *endpoint, const char *host, int port) { #ifdef WITH_IPV6 struct addrinfo hints, *res, *ressave; #endif SOAP_SOCKET sk; int err = 0; #ifndef WITH_LEAN #ifndef WIN32 int len = sizeof(soap->buf); #else int len = sizeof(soap->buf) + 1; /* speeds up windows xfer */ #endif int set = 1; #endif #if !defined(WITH_LEAN) || defined(WITH_OPENSSL) || defined(WITH_GNUTLS) || defined(WITH_SYSTEMSSL) int retries; #endif if (soap_valid_socket(soap->socket)) soap->fclosesocket(soap, soap->socket); soap->socket = SOAP_INVALID_SOCKET; if (tcp_init(soap)) { soap->errnum = 0; soap_set_receiver_error(soap, tcp_error(soap), "TCP init failed in tcp_connect()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } soap->errmode = 0; #ifdef WITH_IPV6 memset((void*)&hints, 0, sizeof(hints)); #ifdef WITH_IPV6_V6ONLY hints.ai_family = PF_INET6; #else hints.ai_family = PF_UNSPEC; #endif #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) hints.ai_socktype = SOCK_DGRAM; else #endif hints.ai_socktype = SOCK_STREAM; soap->errmode = 2; if (soap->proxy_host) err = getaddrinfo(soap->proxy_host, soap_int2s(soap, soap->proxy_port), &hints, &res); else err = getaddrinfo(host, soap_int2s(soap, port), &hints, &res); if (err || !res) { soap_set_receiver_error(soap, SOAP_GAI_STRERROR(err), "getaddrinfo failed in tcp_connect()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } ressave = res; again: sk = socket(res->ai_family, res->ai_socktype, res->ai_protocol); soap->error = SOAP_OK; soap->errmode = 0; #else #ifndef WITH_LEAN again: #endif #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) sk = socket(AF_INET, SOCK_DGRAM, 0); else #endif sk = socket(AF_INET, SOCK_STREAM, 0); #endif if (!soap_valid_socket(sk)) { #ifdef WITH_IPV6 if (res->ai_next) { res = res->ai_next; goto again; } #endif soap->errnum = soap_socket_errno(sk); soap_set_receiver_error(soap, tcp_error(soap), "socket failed in tcp_connect()", SOAP_TCP_ERROR); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } #ifdef SOCKET_CLOSE_ON_EXIT #ifdef WIN32 #ifndef UNDER_CE SetHandleInformation((HANDLE)sk, HANDLE_FLAG_INHERIT, 0); #endif #else fcntl(sk, F_SETFD, 1); #endif #endif #ifndef WITH_LEAN if ((soap->connect_flags & SO_LINGER)) { struct linger linger; memset((void*)&linger, 0, sizeof(linger)); linger.l_onoff = 1; linger.l_linger = soap->linger_time; if (setsockopt(sk, SOL_SOCKET, SO_LINGER, (char*)&linger, sizeof(struct linger))) { soap->errnum = soap_socket_errno(sk); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_LINGER failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } } if ((soap->connect_flags & ~SO_LINGER) && setsockopt(sk, SOL_SOCKET, soap->connect_flags & ~SO_LINGER, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(sk); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } #ifndef UNDER_CE if ((soap->keep_alive || soap->tcp_keep_alive) && setsockopt(sk, SOL_SOCKET, SO_KEEPALIVE, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(sk); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_KEEPALIVE failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } if (setsockopt(sk, SOL_SOCKET, SO_SNDBUF, (char*)&len, sizeof(int))) { soap->errnum = soap_socket_errno(sk); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_SNDBUF failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } if (setsockopt(sk, SOL_SOCKET, SO_RCVBUF, (char*)&len, sizeof(int))) { soap->errnum = soap_socket_errno(sk); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_RCVBUF failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } #ifdef TCP_KEEPIDLE if (soap->tcp_keep_idle && setsockopt((SOAP_SOCKET)sk, IPPROTO_TCP, TCP_KEEPIDLE, (char*)&(soap->tcp_keep_idle), sizeof(int))) { soap->errnum = soap_socket_errno(sk); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt TCP_KEEPIDLE failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, (SOAP_SOCKET)sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } #endif #ifdef TCP_KEEPINTVL if (soap->tcp_keep_intvl && setsockopt((SOAP_SOCKET)sk, IPPROTO_TCP, TCP_KEEPINTVL, (char*)&(soap->tcp_keep_intvl), sizeof(int))) { soap->errnum = soap_socket_errno(sk); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt TCP_KEEPINTVL failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, (SOAP_SOCKET)sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } #endif #ifdef TCP_KEEPCNT if (soap->tcp_keep_cnt && setsockopt((SOAP_SOCKET)sk, IPPROTO_TCP, TCP_KEEPCNT, (char*)&(soap->tcp_keep_cnt), sizeof(int))) { soap->errnum = soap_socket_errno(sk); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt TCP_KEEPCNT failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, (SOAP_SOCKET)sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } #endif #ifdef TCP_NODELAY if (!(soap->omode & SOAP_IO_UDP) && setsockopt(sk, IPPROTO_TCP, TCP_NODELAY, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(sk); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt TCP_NODELAY failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } #endif #ifdef WITH_IPV6 if ((soap->omode & SOAP_IO_UDP) && soap->ipv6_multicast_if) { struct sockaddr_in6 *in6addr = (struct sockaddr_in6*)res->ai_addr; in6addr->sin6_scope_id = soap->ipv6_multicast_if; } #endif #ifdef IP_MULTICAST_TTL if ((soap->omode & SOAP_IO_UDP)) { if (soap->ipv4_multicast_ttl) { unsigned char ttl = soap->ipv4_multicast_ttl; if (setsockopt(sk, IPPROTO_IP, IP_MULTICAST_TTL, (char*)&ttl, sizeof(ttl))) { soap->errnum = soap_socket_errno(sk); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt IP_MULTICAST_TTL failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } } if ((soap->omode & SOAP_IO_UDP) && soap->ipv4_multicast_if && !soap->ipv6_multicast_if) { if (setsockopt(sk, IPPROTO_IP, IP_MULTICAST_IF, (char*)soap->ipv4_multicast_if, sizeof(struct in_addr))) #ifndef WINDOWS { soap->errnum = soap_socket_errno(sk); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt IP_MULTICAST_IF failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } #else #ifndef IP_MULTICAST_IF #define IP_MULTICAST_IF 2 #endif if (setsockopt(sk, IPPROTO_IP, IP_MULTICAST_IF, (char*)soap->ipv4_multicast_if, sizeof(struct in_addr))) { soap->errnum = soap_socket_errno(sk); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt IP_MULTICAST_IF failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } #endif } } #endif #endif #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Opening socket=%d to host='%s' port=%d\n", sk, host, port)); #ifndef WITH_IPV6 soap->peerlen = sizeof(soap->peer.in); memset((void*)&soap->peer.in, 0, sizeof(soap->peer.in)); soap->peer.in.sin_family = AF_INET; soap->errmode = 2; if (soap->proxy_host) { if (soap->fresolve(soap, soap->proxy_host, &soap->peer.in.sin_addr)) { soap_set_receiver_error(soap, tcp_error(soap), "get proxy host by name failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } soap->peer.in.sin_port = htons((short)soap->proxy_port); } else { if (soap->fresolve(soap, host, &soap->peer.in.sin_addr)) { soap_set_receiver_error(soap, tcp_error(soap), "get host by name failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } soap->peer.in.sin_port = htons((short)port); } soap->errmode = 0; #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) return sk; #endif #else if ((soap->omode & SOAP_IO_UDP)) { if (soap_memcpy((void*)&soap->peer.storage, sizeof(soap->peer.storage), (const void*)res->ai_addr, res->ai_addrlen)) { soap->error = SOAP_EOM; soap->fclosesocket(soap, sk); sk = SOAP_INVALID_SOCKET; } soap->peerlen = res->ai_addrlen; freeaddrinfo(ressave); return sk; } #endif #ifndef WITH_LEAN if (soap->connect_timeout) SOAP_SOCKNONBLOCK(sk) else SOAP_SOCKBLOCK(sk) retries = 10; #endif for (;;) { #ifdef WITH_IPV6 if (connect(sk, res->ai_addr, (int)res->ai_addrlen)) #else if (connect(sk, &soap->peer.addr, sizeof(soap->peer.in))) #endif { err = soap_socket_errno(sk); #ifdef WITH_IPV6 if (err == SOAP_ECONNREFUSED && res->ai_next) { soap->fclosesocket(soap, sk); res = res->ai_next; goto again; } #endif #ifndef WITH_LEAN if (err == SOAP_EADDRINUSE) { soap->fclosesocket(soap, sk); if (retries-- > 0) goto again; } else if (soap->connect_timeout && (err == SOAP_EINPROGRESS || err == SOAP_EAGAIN || err == SOAP_EWOULDBLOCK)) { SOAP_SOCKLEN_T k; for (;;) { int r; r = tcp_select(soap, sk, SOAP_TCP_SELECT_SND, soap->connect_timeout); if (r > 0) break; if (!r) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connect timeout\n")); soap_set_receiver_error(soap, "Timeout", "connect failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); #ifdef WITH_IPV6 if (res->ai_next) { res = res->ai_next; goto again; } freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } r = soap->errnum = soap_socket_errno(sk); if (r != SOAP_EINTR) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not connect to host\n")); soap_set_receiver_error(soap, tcp_error(soap), "connect failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); #ifdef WITH_IPV6 if (res->ai_next) { res = res->ai_next; goto again; } freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } } k = (SOAP_SOCKLEN_T)sizeof(soap->errnum); if (!getsockopt(sk, SOL_SOCKET, SO_ERROR, (char*)&soap->errnum, &k) && !soap->errnum) /* portability note: see SOAP_SOCKLEN_T definition in stdsoap2.h */ break; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not connect to host\n")); if (!soap->errnum) soap->errnum = soap_socket_errno(sk); soap_set_receiver_error(soap, tcp_error(soap), "connect failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); #ifdef WITH_IPV6 if (res->ai_next) { res = res->ai_next; goto again; } freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } #endif #ifdef WITH_IPV6 if (res->ai_next) { res = res->ai_next; soap->fclosesocket(soap, sk); goto again; } #endif if (err && err != SOAP_EINTR) { soap->errnum = err; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not connect to host\n")); soap_set_receiver_error(soap, tcp_error(soap), "connect failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } } else break; } #ifdef WITH_IPV6 soap->peerlen = 0; /* IPv6: already connected so use send() */ freeaddrinfo(ressave); #endif soap->socket = sk; soap->imode &= ~SOAP_ENC_SSL; soap->omode &= ~SOAP_ENC_SSL; if (endpoint && !soap_tag_cmp(endpoint, "https:*")) { #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) || defined(WITH_SYSTEMSSL) #ifdef WITH_OPENSSL BIO *bio; #endif #ifdef WITH_SYSTEMSSL gsk_iocallback local_io = { ssl_recv, ssl_send, NULL, NULL, NULL, NULL }; #endif int r; if (soap->proxy_host) { soap_mode m = soap->mode; /* preserve settings */ soap_mode om = soap->omode; /* make sure we only parse HTTP */ size_t n = soap->count; /* save the content length */ const char *userid, *passwd; int status = soap->status; /* save the current status/command */ short keep_alive = soap->keep_alive; /* save the KA status */ soap->omode &= ~SOAP_ENC; /* mask IO and ENC */ soap->omode |= SOAP_IO_BUFFER; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connecting to %s proxy server %s for destination endpoint %s\n", soap->proxy_http_version, soap->proxy_host, endpoint)); #ifdef WITH_NTLM if (soap->ntlm_challenge) { if (soap_ntlm_handshake(soap, SOAP_CONNECT, endpoint, host, port)) return soap->error; } #endif if (soap_begin_send(soap)) { soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } soap->status = SOAP_CONNECT; soap->keep_alive = 1; if ((soap->error = soap->fpost(soap, endpoint, host, port, NULL, NULL, 0)) || soap_end_send_flush(soap)) { soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } soap->keep_alive = keep_alive; soap->omode = om; om = soap->imode; soap->imode &= ~SOAP_ENC; /* mask IO and ENC */ userid = soap->userid; /* preserve */ passwd = soap->passwd; /* preserve */ if ((soap->error = soap->fparse(soap))) { soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } soap->status = status; /* restore */ soap->userid = userid; /* restore */ soap->passwd = passwd; /* restore */ soap->imode = om; /* restore */ soap->count = n; /* restore */ if (soap_begin_send(soap)) { soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } if (endpoint) soap_strcpy(soap->endpoint, sizeof(soap->endpoint), endpoint); /* restore */ soap->mode = m; } #ifdef WITH_OPENSSL soap->ssl_flags |= SOAP_SSL_CLIENT; if (!soap->ctx && (soap->error = soap->fsslauth(soap))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL required, but no ctx set\n")); soap->fclosesocket(soap, sk); soap->error = SOAP_SSL_ERROR; return SOAP_INVALID_SOCKET; } if (!soap->ssl) { soap->ssl = SSL_new(soap->ctx); if (!soap->ssl) { soap->fclosesocket(soap, sk); soap->error = SOAP_SSL_ERROR; return SOAP_INVALID_SOCKET; } } else SSL_clear(soap->ssl); if (soap->session) { if (!strcmp(soap->session_host, host) && soap->session_port == port) SSL_set_session(soap->ssl, soap->session); SSL_SESSION_free(soap->session); soap->session = NULL; } #if (OPENSSL_VERSION_NUMBER >= 0x1000000aL) if (!(soap->ssl_flags & SOAP_SSLv3) && !SSL_set_tlsext_host_name(soap->ssl, host)) { soap_set_receiver_error(soap, "SSL/TLS error", "SNI failed", SOAP_SSL_ERROR); soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } #elif (OPENSSL_VERSION_NUMBER >= 0x0090800fL) && defined(SSL_CTRL_SET_TLSEXT_HOSTNAME) if (SSL_ctrl(soap->ssl, SSL_CTRL_SET_TLSEXT_HOSTNAME, TLSEXT_NAMETYPE_host_name, (void*)host)) { soap_set_receiver_error(soap, "SSL/TLS error", "SNI failed", SOAP_SSL_ERROR); soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } #endif bio = BIO_new_socket((int)sk, BIO_NOCLOSE); SSL_set_bio(soap->ssl, bio, bio); /* Connect timeout: set SSL sockets to non-blocking */ retries = 0; if (soap->connect_timeout) { SOAP_SOCKNONBLOCK(sk) retries = 10*soap->connect_timeout; } else SOAP_SOCKBLOCK(sk) if (retries <= 0) retries = 100; /* timeout: 10 sec retries, 100 times 0.1 sec */ /* Try connecting until success or timeout (when nonblocking) */ do { if ((r = SSL_connect(soap->ssl)) <= 0) { int err = SSL_get_error(soap->ssl, r); if (err == SSL_ERROR_WANT_CONNECT || err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE) { int s; if (err == SSL_ERROR_WANT_READ) s = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, -100000); else s = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, -100000); if (s < 0) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL_connect/select error in tcp_connect\n")); soap_set_receiver_error(soap, soap_ssl_error(soap, r), "SSL_connect failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } if (s == 0 && retries-- <= 0) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL/TLS connect timeout\n")); soap_set_receiver_error(soap, "Timeout", "SSL_connect failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } } else { soap_set_receiver_error(soap, soap_ssl_error(soap, r), "SSL_connect error in tcp_connect()", SOAP_SSL_ERROR); soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } } } while (!SSL_is_init_finished(soap->ssl)); /* Set SSL sockets to nonblocking */ SOAP_SOCKNONBLOCK(sk) /* Check server credentials when required */ if ((soap->ssl_flags & SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION)) { int err; if ((err = SSL_get_verify_result(soap->ssl)) != X509_V_OK) { soap_set_sender_error(soap, X509_verify_cert_error_string(err), "SSL/TLS certificate presented by peer cannot be verified in tcp_connect()", SOAP_SSL_ERROR); soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } if (!(soap->ssl_flags & SOAP_SSL_SKIP_HOST_CHECK)) { X509_NAME *subj; STACK_OF(CONF_VALUE) *val = NULL; #if (OPENSSL_VERSION_NUMBER >= 0x0090800fL) GENERAL_NAMES *names = NULL; #else int ext_count; #endif int ok = 0; X509 *peer = SSL_get_peer_certificate(soap->ssl); if (!peer) { soap_set_sender_error(soap, "SSL/TLS error", "No SSL/TLS certificate was presented by the peer in tcp_connect()", SOAP_SSL_ERROR); soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } #if (OPENSSL_VERSION_NUMBER < 0x0090800fL) ext_count = X509_get_ext_count(peer); if (ext_count > 0) { int i; for (i = 0; i < ext_count; i++) { X509_EXTENSION *ext = X509_get_ext(peer, i); const char *ext_str = OBJ_nid2sn(OBJ_obj2nid(X509_EXTENSION_get_object(ext))); if (ext_str && !strcmp(ext_str, "subjectAltName")) { X509V3_EXT_METHOD *meth = (X509V3_EXT_METHOD*)X509V3_EXT_get(ext); unsigned char *data; if (!meth) break; data = ext->value->data; if (data) { #if (OPENSSL_VERSION_NUMBER > 0x00907000L) void *ext_data; if (meth->it) ext_data = ASN1_item_d2i(NULL, &data, ext->value->length, ASN1_ITEM_ptr(meth->it)); else { #if (OPENSSL_VERSION_NUMBER > 0x0090800fL) ext_data = meth->d2i(NULL, (const unsigned char **)&data, ext->value->length); #else ext_data = meth->d2i(NULL, &data, ext->value->length); #endif } if (ext_data) val = meth->i2v(meth, ext_data, NULL); else val = NULL; if (meth->it) ASN1_item_free((ASN1_VALUE*)ext_data, ASN1_ITEM_ptr(meth->it)); else meth->ext_free(ext_data); #else void *ext_data = meth->d2i(NULL, &data, ext->value->length); if (ext_data) val = meth->i2v(meth, ext_data, NULL); meth->ext_free(ext_data); #endif if (val) { int j; for (j = 0; j < sk_CONF_VALUE_num(val); j++) { CONF_VALUE *nval = sk_CONF_VALUE_value(val, j); if (nval && !strcmp(nval->name, "DNS") && !strcmp(nval->value, host)) { ok = 1; break; } } sk_CONF_VALUE_pop_free(val, X509V3_conf_free); } } } if (ok) break; } } #else names = (GENERAL_NAMES*)X509_get_ext_d2i(peer, NID_subject_alt_name, NULL, NULL); if (names) { val = i2v_GENERAL_NAMES(NULL, names, val); sk_GENERAL_NAME_pop_free(names, GENERAL_NAME_free); } if (val) { int j; for (j = 0; j < sk_CONF_VALUE_num(val); j++) { CONF_VALUE *nval = sk_CONF_VALUE_value(val, j); if (nval && !strcmp(nval->name, "DNS") && !strcmp(nval->value, host)) { ok = 1; break; } } sk_CONF_VALUE_pop_free(val, X509V3_conf_free); } #endif if (!ok && (subj = X509_get_subject_name(peer))) { int i = -1; do { ASN1_STRING *name; i = X509_NAME_get_index_by_NID(subj, NID_commonName, i); if (i == -1) break; name = X509_NAME_ENTRY_get_data(X509_NAME_get_entry(subj, i)); if (name) { if (!soap_tag_cmp(host, (const char*)M_ASN1_STRING_data(name))) ok = 1; else { unsigned char *tmp = NULL; ASN1_STRING_to_UTF8(&tmp, name); if (tmp) { if (!soap_tag_cmp(host, (const char*)tmp)) ok = 1; else if (tmp[0] == '*') /* wildcard domain */ { const char *t = strchr(host, '.'); if (t && !soap_tag_cmp(t, (const char*)tmp+1)) ok = 1; } OPENSSL_free(tmp); } } } } while (!ok); } X509_free(peer); if (!ok) { soap_set_sender_error(soap, "SSL/TLS error", "SSL/TLS certificate host name mismatch in tcp_connect()", SOAP_SSL_ERROR); soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } } } #endif #ifdef WITH_GNUTLS soap->ssl_flags |= SOAP_SSL_CLIENT; if (!soap->session && (soap->error = soap->fsslauth(soap))) { soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } gnutls_transport_set_ptr(soap->session, (gnutls_transport_ptr_t)(long)sk); /* Set SSL sockets to non-blocking */ if (soap->connect_timeout) { SOAP_SOCKNONBLOCK(sk) retries = 10*soap->connect_timeout; } else SOAP_SOCKBLOCK(sk) if (retries <= 0) retries = 100; /* timeout: 10 sec retries, 100 times 0.1 sec */ while ((r = gnutls_handshake(soap->session))) { int s; /* GNUTLS repeat handhake when GNUTLS_E_AGAIN */ if (retries-- <= 0) break; if (r == GNUTLS_E_AGAIN || r == GNUTLS_E_INTERRUPTED) { if (!gnutls_record_get_direction(soap->session)) s = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, -100000); else s = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, -100000); if (s < 0) break; } else { soap->errnum = soap_socket_errno(sk); break; } } if (r) { soap_set_sender_error(soap, soap_ssl_error(soap, r), "SSL/TLS handshake failed", SOAP_SSL_ERROR); soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } if ((soap->ssl_flags & SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION)) { const char *err = ssl_verify(soap, host); if (err) { soap->fclosesocket(soap, sk); soap->error = soap_set_sender_error(soap, "SSL/TLS verify error", err, SOAP_SSL_ERROR); return SOAP_INVALID_SOCKET; } } #endif #ifdef WITH_SYSTEMSSL soap->ssl_flags |= SOAP_SSL_CLIENT; if (!soap->ctx && (soap->error = soap->fsslauth(soap))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL required, but no ctx set\n")); soap->fclosesocket(soap, sk); soap->error = SOAP_SSL_ERROR; return SOAP_INVALID_SOCKET; } /* Connect timeout: set SSL sockets to non-blocking */ retries = 0; if (soap->connect_timeout) { SOAP_SOCKNONBLOCK(sk) retries = 10*soap->connect_timeout; } else SOAP_SOCKBLOCK(sk) if (retries <= 0) retries = 100; /* timeout: 10 sec retries, 100 times 0.1 sec */ err = gsk_secure_socket_open(soap->ctx, &soap->ssl); if (err == GSK_OK) err = gsk_attribute_set_numeric_value(soap->ssl, GSK_FD, sk); if (err == GSK_OK) err = gsk_attribute_set_buffer(soap->ssl, GSK_KEYRING_LABEL, soap->cafile, 0); /* Certificate label */ if (err == GSK_OK) err = gsk_attribute_set_enum(soap->ssl, GSK_SESSION_TYPE, GSK_CLIENT_SESSION); if (err == GSK_OK) err = gsk_attribute_set_buffer(soap->ssl, GSK_V3_CIPHER_SPECS_EXPANDED, "0035002F000A", 0); if (err == GSK_OK) err = gsk_attribute_set_enum(soap->ssl, GSK_V3_CIPHERS, GSK_V3_CIPHERS_CHAR4); if (err == GSK_OK) err = gsk_attribute_set_callback(soap->ssl, GSK_IO_CALLBACK, &local_io); if (err != GSK_OK) { soap_set_receiver_error(soap, gsk_strerror(err), "SYSTEM SSL error in tcp_connect()", SOAP_SSL_ERROR); return SOAP_INVALID_SOCKET; } /* Try connecting until success or timeout (when nonblocking) */ while ((err = gsk_secure_socket_init(soap->ssl)) != GSK_OK) { if (err == GSK_WOULD_BLOCK_READ || err == GSK_WOULD_BLOCK_WRITE) { if (err == GSK_WOULD_BLOCK_READ) r = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, -100000); else r = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, -100000); if (r < 0) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL_connect/select error in tcp_connect\n")); soap_set_receiver_error(soap, gsk_strerror(err), "gsk_secure_socket_init failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } if (r == 0 && retries-- <= 0) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL/TLS connect timeout\n")); soap_set_receiver_error(soap, "Timeout", "in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } } else { soap_set_receiver_error(soap, gsk_strerror(err), "gsk_secure_socket_init() failed in tcp_connect()", SOAP_SSL_ERROR); soap->fclosesocket(soap, sk); return SOAP_INVALID_SOCKET; } } #endif soap->imode |= SOAP_ENC_SSL; soap->omode |= SOAP_ENC_SSL; #else soap->fclosesocket(soap, sk); soap->error = SOAP_SSL_ERROR; return SOAP_INVALID_SOCKET; #endif } if (soap->recv_timeout || soap->send_timeout) SOAP_SOCKNONBLOCK(sk) else SOAP_SOCKBLOCK(sk) return sk; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 static int tcp_select(struct soap *soap, SOAP_SOCKET sk, int flags, int timeout) { int r; struct timeval tv; fd_set fd[3], *rfd, *sfd, *efd; int retries = 0; int eintr = SOAP_MAXEINTR; soap->errnum = 0; #ifndef WIN32 #if !defined(FD_SETSIZE) || defined(__QNX__) || defined(QNX) /* no FD_SETSIZE or select() is not MT safe on some QNX: always poll */ if (1) #else /* if fd max set size exceeded, use poll() */ if ((int)sk >= (int)FD_SETSIZE) #endif #ifdef HAVE_POLL { struct pollfd pollfd; pollfd.fd = (int)sk; pollfd.events = 0; if (flags & SOAP_TCP_SELECT_RCV) pollfd.events |= POLLIN; if (flags & SOAP_TCP_SELECT_SND) pollfd.events |= POLLOUT; if (flags & SOAP_TCP_SELECT_ERR) pollfd.events |= POLLERR; if (timeout <= 0) timeout /= -1000; /* -usec -> ms */ else { retries = timeout - 1; timeout = 1000; } do { r = poll(&pollfd, 1, timeout); if (r < 0 && (soap->errnum = soap_socket_errno(sk)) == SOAP_EINTR && eintr-- > 0) r = 0; else if (retries-- <= 0) break; } while (r == 0); if (r > 0) { r = 0; if ((flags & SOAP_TCP_SELECT_RCV) && (pollfd.revents & POLLIN)) r |= SOAP_TCP_SELECT_RCV; if ((flags & SOAP_TCP_SELECT_SND) && (pollfd.revents & POLLOUT)) r |= SOAP_TCP_SELECT_SND; if ((flags & SOAP_TCP_SELECT_ERR) && (pollfd.revents & POLLERR)) r |= SOAP_TCP_SELECT_ERR; } else if (r == 0) soap->errnum = 0; return r; } #else { soap->error = SOAP_FD_EXCEEDED; return -1; } #endif #endif if (timeout > 0) retries = timeout - 1; do { rfd = sfd = efd = NULL; if (flags & SOAP_TCP_SELECT_RCV) { rfd = &fd[0]; FD_ZERO(rfd); FD_SET(sk, rfd); } if (flags & SOAP_TCP_SELECT_SND) { sfd = &fd[1]; FD_ZERO(sfd); FD_SET(sk, sfd); } if (flags & SOAP_TCP_SELECT_ERR) { efd = &fd[2]; FD_ZERO(efd); FD_SET(sk, efd); } if (timeout <= 0) { tv.tv_sec = -timeout / 1000000; tv.tv_usec = -timeout % 1000000; } else { tv.tv_sec = 1; tv.tv_usec = 0; } r = select((int)sk + 1, rfd, sfd, efd, &tv); if (r < 0 && (soap->errnum = soap_socket_errno(sk)) == SOAP_EINTR && eintr-- > 0) r = 0; else if (retries-- <= 0) break; } while (r == 0); if (r > 0) { r = 0; if ((flags & SOAP_TCP_SELECT_RCV) && FD_ISSET(sk, rfd)) r |= SOAP_TCP_SELECT_RCV; if ((flags & SOAP_TCP_SELECT_SND) && FD_ISSET(sk, sfd)) r |= SOAP_TCP_SELECT_SND; if ((flags & SOAP_TCP_SELECT_ERR) && FD_ISSET(sk, efd)) r |= SOAP_TCP_SELECT_ERR; } else if (r == 0) soap->errnum = 0; return r; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 static SOAP_SOCKET tcp_accept(struct soap *soap, SOAP_SOCKET s, struct sockaddr *a, int *n) { SOAP_SOCKET sk; (void)soap; sk = accept(s, a, (SOAP_SOCKLEN_T*)n); /* portability note: see SOAP_SOCKLEN_T definition in stdsoap2.h */ #ifdef SOCKET_CLOSE_ON_EXIT #ifdef WIN32 #ifndef UNDER_CE SetHandleInformation((HANDLE)sk, HANDLE_FLAG_INHERIT, 0); #endif #else fcntl(sk, F_SETFD, FD_CLOEXEC); #endif #endif return sk; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 static int tcp_disconnect(struct soap *soap) { #ifdef WITH_OPENSSL if (soap->ssl) { int r, s = 0; if (soap->session) { SSL_SESSION_free(soap->session); soap->session = NULL; } if (*soap->host) { soap->session = SSL_get1_session(soap->ssl); if (soap->session) { soap_strcpy(soap->session_host, sizeof(soap->session_host), soap->host); soap->session_port = soap->port; } } r = SSL_shutdown(soap->ssl); /* SSL shutdown does not work when reads are pending, non-blocking */ if (r == 0) { while (SSL_want_read(soap->ssl)) { if (SSL_read(soap->ssl, NULL, 0) || soap_socket_errno(soap->socket) != SOAP_EAGAIN) { r = SSL_shutdown(soap->ssl); break; } } } if (r == 0) { if (soap_valid_socket(soap->socket)) { if (!soap->fshutdownsocket(soap, soap->socket, SOAP_SHUT_WR)) { #if !defined(WITH_LEAN) && !defined(WIN32) /* wait up to 5 seconds for close_notify to be sent by peer (if peer not present, this avoids calling SSL_shutdown() which has a lengthy return timeout) */ r = tcp_select(soap, soap->socket, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, 5); if (r <= 0) { soap->errnum = 0; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connection lost...\n")); soap->fclosesocket(soap, soap->socket); soap->socket = SOAP_INVALID_SOCKET; ERR_remove_state(0); SSL_free(soap->ssl); soap->ssl = NULL; return SOAP_OK; } #else r = SSL_shutdown(soap->ssl); #endif } } } if (r != 1) { s = ERR_get_error(); if (s) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Shutdown failed: %d\n", SSL_get_error(soap->ssl, r))); if (soap_valid_socket(soap->socket) && !(soap->omode & SOAP_IO_UDP)) { soap->fclosesocket(soap, soap->socket); soap->socket = SOAP_INVALID_SOCKET; } } } SSL_free(soap->ssl); soap->ssl = NULL; if (s) return SOAP_SSL_ERROR; ERR_remove_state(0); } #endif #ifdef WITH_GNUTLS if (soap->session) { gnutls_bye(soap->session, GNUTLS_SHUT_RDWR); gnutls_deinit(soap->session); soap->session = NULL; } #endif #ifdef WITH_SYSTEMSSL if (soap->ssl) { gsk_secure_socket_shutdown(soap->ssl); gsk_secure_socket_close(&soap->ssl); } #endif if (soap_valid_socket(soap->socket) && !(soap->omode & SOAP_IO_UDP)) { soap->fshutdownsocket(soap, soap->socket, SOAP_SHUT_RDWR); soap->fclosesocket(soap, soap->socket); soap->socket = SOAP_INVALID_SOCKET; } return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 static int tcp_closesocket(struct soap *soap, SOAP_SOCKET sk) { (void)soap; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Close socket=%d\n", (int)sk)); return soap_closesocket(sk); } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 static int tcp_shutdownsocket(struct soap *soap, SOAP_SOCKET sk, int how) { (void)soap; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Shutdown socket=%d how=%d\n", (int)sk, how)); return shutdown(sk, how); } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 SOAP_FMAC1 SOAP_SOCKET SOAP_FMAC2 soap_bind(struct soap *soap, const char *host, int port, int backlog) { #ifdef WITH_IPV6 struct addrinfo *addrinfo = NULL; struct addrinfo hints; struct addrinfo res; int err; #ifdef WITH_NO_IPV6_V6ONLY int unset = 0; #endif #endif #ifndef WITH_LEAN #ifndef WIN32 int len = sizeof(soap->buf); #else int len = sizeof(soap->buf) + 1; /* speeds up windows xfer */ #endif int set = 1; #endif if (soap_valid_socket(soap->master)) { soap->fclosesocket(soap, soap->master); soap->master = SOAP_INVALID_SOCKET; } soap->socket = SOAP_INVALID_SOCKET; soap->errmode = 1; if (tcp_init(soap)) { soap_set_receiver_error(soap, tcp_error(soap), "TCP init failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } #ifdef WITH_IPV6 memset((void*)&hints, 0, sizeof(hints)); #ifdef WITH_IPV6_V6ONLY hints.ai_family = PF_INET6; #else hints.ai_family = PF_UNSPEC; #endif #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) hints.ai_socktype = SOCK_DGRAM; else #endif hints.ai_socktype = SOCK_STREAM; hints.ai_flags = AI_PASSIVE; soap->errmode = 2; err = getaddrinfo(host, soap_int2s(soap, port), &hints, &addrinfo); if (err || !addrinfo) { soap_set_receiver_error(soap, SOAP_GAI_STRERROR(err), "getaddrinfo failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } res = *addrinfo; if (soap_memcpy((void*)&soap->peer.storage, sizeof(soap->peer.storage), (const void*)addrinfo->ai_addr, addrinfo->ai_addrlen)) { soap->error = SOAP_EOM; return SOAP_INVALID_SOCKET; } soap->peerlen = addrinfo->ai_addrlen; res.ai_addr = &soap->peer.addr; res.ai_addrlen = soap->peerlen; freeaddrinfo(addrinfo); soap->master = (int)socket(res.ai_family, res.ai_socktype, res.ai_protocol); #else #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) soap->master = (int)socket(AF_INET, SOCK_DGRAM, 0); else #endif soap->master = (int)socket(AF_INET, SOCK_STREAM, 0); #endif soap->errmode = 0; if (!soap_valid_socket(soap->master)) { soap->errnum = soap_socket_errno(soap->master); soap_set_receiver_error(soap, tcp_error(soap), "socket failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } soap->port = port; #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) soap->socket = soap->master; #endif #ifdef SOCKET_CLOSE_ON_EXIT #ifdef WIN32 #ifndef UNDER_CE SetHandleInformation((HANDLE)soap->master, HANDLE_FLAG_INHERIT, 0); #endif #else fcntl(soap->master, F_SETFD, 1); #endif #endif #ifndef WITH_LEAN if (soap->bind_flags && setsockopt(soap->master, SOL_SOCKET, soap->bind_flags, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(soap->master); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } #ifndef UNDER_CE if (((soap->imode | soap->omode) & SOAP_IO_KEEPALIVE) && (!((soap->imode | soap->omode) & SOAP_IO_UDP)) && setsockopt(soap->master, SOL_SOCKET, SO_KEEPALIVE, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(soap->master); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_KEEPALIVE failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } if (setsockopt(soap->master, SOL_SOCKET, SO_SNDBUF, (char*)&len, sizeof(int))) { soap->errnum = soap_socket_errno(soap->master); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_SNDBUF failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } if (setsockopt(soap->master, SOL_SOCKET, SO_RCVBUF, (char*)&len, sizeof(int))) { soap->errnum = soap_socket_errno(soap->master); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_RCVBUF failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } #ifdef TCP_NODELAY if (!(soap->omode & SOAP_IO_UDP) && setsockopt(soap->master, IPPROTO_TCP, TCP_NODELAY, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(soap->master); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt TCP_NODELAY failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } #endif #ifdef TCP_FASTOPEN if (!(soap->omode & SOAP_IO_UDP) && setsockopt(soap->master, SOL_TCP, TCP_FASTOPEN, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(soap->master); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt TCP_FASTOPEN failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } #endif #endif #endif #ifdef WITH_IPV6 #ifdef WITH_IPV6_V6ONLY if (res.ai_family == AF_INET6 && setsockopt(soap->master, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(soap->master); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt set IPV6_V6ONLY failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } #endif #ifdef WITH_NO_IPV6_V6ONLY if (res.ai_family == AF_INET6 && setsockopt(soap->master, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&unset, sizeof(int))) { soap->errnum = soap_socket_errno(soap->master); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt unset IPV6_V6ONLY failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } #endif soap->errmode = 0; if (bind(soap->master, res.ai_addr, (int)res.ai_addrlen)) { soap->errnum = soap_socket_errno(soap->master); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not bind to host\n")); soap_closesock(soap); soap_set_receiver_error(soap, tcp_error(soap), "bind failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } #else soap->peerlen = sizeof(soap->peer.in); memset((void*)&soap->peer.in, 0, sizeof(soap->peer.in)); soap->peer.in.sin_family = AF_INET; soap->errmode = 2; if (host) { if (soap->fresolve(soap, host, &soap->peer.in.sin_addr)) { soap_set_receiver_error(soap, tcp_error(soap), "get host by name failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } } else soap->peer.in.sin_addr.s_addr = htonl(INADDR_ANY); soap->peer.in.sin_port = htons((short)port); soap->errmode = 0; if (bind(soap->master, &soap->peer.addr, (int)soap->peerlen)) { soap->errnum = soap_socket_errno(soap->master); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not bind to host\n")); soap_closesock(soap); soap_set_receiver_error(soap, tcp_error(soap), "bind failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } #endif if (!(soap->omode & SOAP_IO_UDP) && listen(soap->master, backlog)) { soap->errnum = soap_socket_errno(soap->master); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not bind to host\n")); soap_closesock(soap); soap_set_receiver_error(soap, tcp_error(soap), "listen failed in soap_bind()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } return soap->master; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_poll(struct soap *soap) { #ifndef WITH_LEAN int r; if (soap_valid_socket(soap->socket)) { r = tcp_select(soap, soap->socket, SOAP_TCP_SELECT_ALL, 0); if (r > 0 && (r & SOAP_TCP_SELECT_ERR)) r = -1; } else if (soap_valid_socket(soap->master)) r = tcp_select(soap, soap->master, SOAP_TCP_SELECT_SND, 0); else return SOAP_OK; /* OK when no socket! */ if (r > 0) { #ifdef WITH_OPENSSL if (soap->imode & SOAP_ENC_SSL) { if (soap_valid_socket(soap->socket) && (r & SOAP_TCP_SELECT_SND) && (!(r & SOAP_TCP_SELECT_RCV) || SSL_peek(soap->ssl, soap->tmpbuf, 1) > 0)) return SOAP_OK; } else #endif { int t; if (soap_valid_socket(soap->socket) && (r & SOAP_TCP_SELECT_SND) && (!(r & SOAP_TCP_SELECT_RCV) || recv(soap->socket, (char*)&t, 1, MSG_PEEK) > 0)) return SOAP_OK; } } else if (r < 0) { if ((soap_valid_socket(soap->master) || soap_valid_socket(soap->socket)) && soap_socket_errno(soap->master) != SOAP_EINTR) { soap_set_receiver_error(soap, tcp_error(soap), "select failed in soap_poll()", SOAP_TCP_ERROR); return soap->error = SOAP_TCP_ERROR; } } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Polling: other end down on socket=%d select=%d\n", soap->socket, r)); return SOAP_EOF; #else (void)soap; return SOAP_OK; #endif } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 SOAP_FMAC1 SOAP_SOCKET SOAP_FMAC2 soap_accept(struct soap *soap) { int n = (int)sizeof(soap->peer); int err; #ifndef WITH_LEAN #ifndef WIN32 int len = sizeof(soap->buf); #else int len = sizeof(soap->buf) + 1; /* speeds up windows xfer */ #endif int set = 1; #endif soap->error = SOAP_OK; memset((void*)&soap->peer, 0, sizeof(soap->peer)); soap->socket = SOAP_INVALID_SOCKET; soap->errmode = 0; soap->keep_alive = 0; if (!soap_valid_socket(soap->master)) { soap->errnum = 0; soap_set_receiver_error(soap, tcp_error(soap), "no master socket in soap_accept()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) return soap->socket = soap->master; #endif for (;;) { if (soap->accept_timeout || soap->send_timeout || soap->recv_timeout) { for (;;) { int r; r = tcp_select(soap, soap->master, SOAP_TCP_SELECT_ALL, soap->accept_timeout ? soap->accept_timeout : 60); if (r > 0) break; if (!r && soap->accept_timeout) { soap_set_receiver_error(soap, "Timeout", "accept failed in soap_accept()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } if (r < 0) { r = soap->errnum; if (r != SOAP_EINTR) { soap_closesock(soap); soap_set_receiver_error(soap, tcp_error(soap), "accept failed in soap_accept()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } } } } if (soap->accept_timeout) SOAP_SOCKNONBLOCK(soap->master) else SOAP_SOCKBLOCK(soap->master) n = (int)sizeof(soap->peer); soap->socket = soap->faccept(soap, soap->master, &soap->peer.addr, &n); soap->peerlen = (size_t)n; if (soap_valid_socket(soap->socket)) { #ifdef WITH_IPV6 char *s = soap->host; char port[16]; int i; getnameinfo(&soap->peer.addr, n, soap->host, sizeof(soap->host), port, sizeof(port), NI_NUMERICHOST | NI_NUMERICSERV); soap->ip = 0; for (i = 0; i < 4 && *s; i++) { soap->ip = (soap->ip << 8) + (unsigned int)soap_strtoul(s, &s, 10); if (*s) s++; } soap->port = soap_strtol(port, NULL, 10); #else soap->ip = ntohl(soap->peer.in.sin_addr.s_addr); (SOAP_SNPRINTF(soap->host, sizeof(soap->host), 80), "%u.%u.%u.%u", (int)(soap->ip>>24)&0xFF, (int)(soap->ip>>16)&0xFF, (int)(soap->ip>>8)&0xFF, (int)soap->ip&0xFF); soap->port = (int)ntohs(soap->peer.in.sin_port); /* does not return port number on some systems */ #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Accept socket=%d at port=%d from IP='%s'\n", soap->socket, soap->port, soap->host)); #ifndef WITH_LEAN if ((soap->accept_flags & SO_LINGER)) { struct linger linger; memset((void*)&linger, 0, sizeof(linger)); linger.l_onoff = 1; linger.l_linger = soap->linger_time; if (setsockopt(soap->socket, SOL_SOCKET, SO_LINGER, (char*)&linger, sizeof(struct linger))) { soap->errnum = soap_socket_errno(soap->socket); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_LINGER failed in soap_accept()", SOAP_TCP_ERROR); soap_closesock(soap); return SOAP_INVALID_SOCKET; } } if ((soap->accept_flags & ~SO_LINGER) && setsockopt(soap->socket, SOL_SOCKET, soap->accept_flags & ~SO_LINGER, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(soap->socket); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt failed in soap_accept()", SOAP_TCP_ERROR); soap_closesock(soap); return SOAP_INVALID_SOCKET; } #ifndef UNDER_CE if (((soap->imode | soap->omode) & SOAP_IO_KEEPALIVE) && setsockopt(soap->socket, SOL_SOCKET, SO_KEEPALIVE, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(soap->socket); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_KEEPALIVE failed in soap_accept()", SOAP_TCP_ERROR); soap_closesock(soap); return SOAP_INVALID_SOCKET; } if (setsockopt(soap->socket, SOL_SOCKET, SO_SNDBUF, (char*)&len, sizeof(int))) { soap->errnum = soap_socket_errno(soap->socket); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_SNDBUF failed in soap_accept()", SOAP_TCP_ERROR); soap_closesock(soap); return SOAP_INVALID_SOCKET; } if (setsockopt(soap->socket, SOL_SOCKET, SO_RCVBUF, (char*)&len, sizeof(int))) { soap->errnum = soap_socket_errno(soap->socket); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_RCVBUF failed in soap_accept()", SOAP_TCP_ERROR); soap_closesock(soap); return SOAP_INVALID_SOCKET; } #ifdef TCP_NODELAY if (setsockopt(soap->socket, IPPROTO_TCP, TCP_NODELAY, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(soap->socket); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt TCP_NODELAY failed in soap_accept()", SOAP_TCP_ERROR); soap_closesock(soap); return SOAP_INVALID_SOCKET; } #endif #endif #endif soap->keep_alive = (((soap->imode | soap->omode) & SOAP_IO_KEEPALIVE) != 0); if (soap->send_timeout || soap->recv_timeout) SOAP_SOCKNONBLOCK(soap->socket) else SOAP_SOCKBLOCK(soap->socket) return soap->socket; } err = soap_socket_errno(soap->socket); if (err != 0 && err != SOAP_EINTR && err != SOAP_EAGAIN && err != SOAP_EWOULDBLOCK) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Accept failed from %s\n", soap->host)); soap->errnum = err; soap_set_receiver_error(soap, tcp_error(soap), "accept failed in soap_accept()", SOAP_TCP_ERROR); soap_closesock(soap); return SOAP_INVALID_SOCKET; } } } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_closesock(struct soap *soap) { int status = soap->error; #ifndef WITH_LEANER if (status) /* close on error: attachment state is not to be trusted */ { soap->mime.first = NULL; soap->mime.last = NULL; soap->dime.first = NULL; soap->dime.last = NULL; } #endif if (soap->fdisconnect && (soap->error = soap->fdisconnect(soap))) return soap->error; if (status == SOAP_EOF || status == SOAP_TCP_ERROR || status == SOAP_SSL_ERROR || !soap->keep_alive) { if (soap->fclose && (soap->error = soap->fclose(soap))) return soap->error; soap->keep_alive = 0; } #ifdef WITH_ZLIB if (!(soap->mode & SOAP_MIME_POSTCHECK)) { if (soap->zlib_state == SOAP_ZLIB_DEFLATE) deflateEnd(soap->d_stream); else if (soap->zlib_state == SOAP_ZLIB_INFLATE) inflateEnd(soap->d_stream); soap->zlib_state = SOAP_ZLIB_NONE; } #endif return soap->error = status; } #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_force_closesock(struct soap *soap) { soap->keep_alive = 0; if (soap_valid_socket(soap->socket)) return soap_closesocket(soap->socket); return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_cleanup(struct soap *soap) { soap_done(soap); #ifdef WIN32 if (!tcp_done) return; tcp_done = 0; WSACleanup(); #endif } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_done(struct soap *soap) { #ifdef SOAP_DEBUG int i; #endif if (soap_check_state(soap)) return; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Done with context%s\n", soap->state == SOAP_COPY ? " copy" : "")); soap_free_temp(soap); while (soap->clist) { struct soap_clist *p = soap->clist->next; SOAP_FREE(soap, soap->clist); soap->clist = p; } if (soap->state == SOAP_INIT) soap->omode &= ~SOAP_IO_UDP; /* to force close the socket */ soap->keep_alive = 0; /* to force close the socket */ if (soap->master == soap->socket) /* do not close twice */ soap->master = SOAP_INVALID_SOCKET; soap_closesock(soap); #ifdef WITH_COOKIES soap_free_cookies(soap); #endif while (soap->plugins) { struct soap_plugin *p = soap->plugins->next; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Removing plugin '%s'\n", soap->plugins->id)); if (soap->plugins->fcopy || soap->state == SOAP_INIT) soap->plugins->fdelete(soap, soap->plugins); SOAP_FREE(soap, soap->plugins); soap->plugins = p; } soap->fplugin = fplugin; soap->fmalloc = NULL; #ifndef WITH_NOHTTP soap->fpost = http_post; soap->fget = http_get; soap->fput = http_405; soap->fdel = http_405; soap->fopt = http_200; soap->fhead = http_200; soap->fform = NULL; soap->fposthdr = http_post_header; soap->fresponse = http_response; soap->fparse = http_parse; soap->fparsehdr = http_parse_header; #endif soap->fheader = NULL; #ifndef WITH_NOIO #ifndef WITH_IPV6 soap->fresolve = tcp_gethost; #else soap->fresolve = NULL; #endif soap->faccept = tcp_accept; soap->fopen = tcp_connect; soap->fclose = tcp_disconnect; soap->fclosesocket = tcp_closesocket; soap->fshutdownsocket = tcp_shutdownsocket; soap->fsend = fsend; soap->frecv = frecv; soap->fpoll = soap_poll; #else soap->fopen = NULL; soap->fclose = NULL; soap->fpoll = NULL; #endif #ifndef WITH_LEANER soap->fsvalidate = NULL; soap->fwvalidate = NULL; soap->feltbegin = NULL; soap->feltendin = NULL; soap->feltbegout = NULL; soap->feltendout = NULL; soap->fprepareinitsend = NULL; soap->fprepareinitrecv = NULL; soap->fpreparesend = NULL; soap->fpreparerecv = NULL; soap->fpreparefinalsend = NULL; soap->fpreparefinalrecv = NULL; soap->ffiltersend = NULL; soap->ffilterrecv = NULL; #endif soap->fseterror = NULL; soap->fignore = NULL; soap->fserveloop = NULL; #ifdef WITH_OPENSSL if (soap->session) { SSL_SESSION_free(soap->session); soap->session = NULL; } #endif if (soap->state == SOAP_INIT) { if (soap_valid_socket(soap->master)) { soap->fclosesocket(soap, soap->master); soap->master = SOAP_INVALID_SOCKET; } } #ifdef WITH_OPENSSL if (soap->ssl) { SSL_free(soap->ssl); soap->ssl = NULL; } if (soap->state == SOAP_INIT) { if (soap->ctx) { SSL_CTX_free(soap->ctx); soap->ctx = NULL; } } ERR_remove_state(0); #endif #ifdef WITH_GNUTLS if (soap->state == SOAP_INIT) { if (soap->xcred) { gnutls_certificate_free_credentials(soap->xcred); soap->xcred = NULL; } if (soap->acred) { gnutls_anon_free_client_credentials(soap->acred); soap->acred = NULL; } if (soap->cache) { gnutls_priority_deinit(soap->cache); soap->cache = NULL; } if (soap->dh_params) { gnutls_dh_params_deinit(soap->dh_params); soap->dh_params = NULL; } if (soap->rsa_params) { gnutls_rsa_params_deinit(soap->rsa_params); soap->rsa_params = NULL; } } if (soap->session) { gnutls_deinit(soap->session); soap->session = NULL; } #endif #ifdef WITH_SYSTEMSSL if (soap->ssl) gsk_secure_socket_close(&soap->ssl); if (soap->state == SOAP_INIT) if (soap->ctx) gsk_environment_close(&soap->ctx); #endif #ifdef WITH_C_LOCALE if (soap->c_locale) { # ifdef WIN32 _free_locale(soap->c_locale); # else freelocale(soap->c_locale); # endif soap->c_locale = NULL; } #endif #ifdef WITH_ZLIB if (soap->d_stream) { SOAP_FREE(soap, soap->d_stream); soap->d_stream = NULL; } if (soap->z_buf) { SOAP_FREE(soap, soap->z_buf); soap->z_buf = NULL; } #endif #ifdef SOAP_DEBUG DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free logfiles\n")); for (i = 0; i < SOAP_MAXLOGS; i++) { if (soap->logfile[i]) { SOAP_FREE(soap, soap->logfile[i]); soap->logfile[i] = NULL; } soap_close_logfile(soap, i); } soap->state = SOAP_NONE; #endif #ifdef SOAP_MEM_DEBUG soap_free_mht(soap); #endif } #endif /******************************************************************************\ * * HTTP * \******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 static int http_parse(struct soap *soap) { char header[SOAP_HDRLEN], *s; unsigned short httpcmd = 0; int status = 0; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Waiting for HTTP request/response...\n")); *soap->endpoint = '\0'; #ifdef WITH_NTLM if (!soap->ntlm_challenge) #endif { soap->userid = NULL; soap->passwd = NULL; soap->authrealm = NULL; } #ifdef WITH_NTLM soap->ntlm_challenge = NULL; #endif soap->proxy_from = NULL; do { soap->length = 0; soap->http_content = NULL; soap->action = NULL; soap->status = 0; soap->body = 1; if (soap_getline(soap, soap->msgbuf, sizeof(soap->msgbuf))) { if (soap->error == SOAP_EOF) return SOAP_EOF; return soap->error = 414; } if ((s = strchr(soap->msgbuf, ' '))) { soap->status = (unsigned short)soap_strtoul(s, &s, 10); if (!soap_blank((soap_wchar)*s)) soap->status = 0; } else soap->status = 0; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "HTTP status: %s\n", soap->msgbuf)); for (;;) { if (soap_getline(soap, header, SOAP_HDRLEN)) { if (soap->error == SOAP_EOF) { soap->error = SOAP_OK; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "EOF in HTTP header, continue anyway\n")); break; } return soap->error; } if (!*header) break; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "HTTP header: %s\n", header)); s = strchr(header, ':'); if (s) { char *t; *s = '\0'; do s++; while (*s && *s <= 32); if (*s == '"') s++; t = s + strlen(s) - 1; while (t > s && *t <= 32) t--; if (t >= s && *t == '"') t--; t[1] = '\0'; if ((soap->error = soap->fparsehdr(soap, header, s))) { if (soap->error < SOAP_STOP) return soap->error; status = soap->error; soap->error = SOAP_OK; } } } } while (soap->status == 100); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Finished HTTP header parsing, status = %d\n", soap->status)); s = strstr(soap->msgbuf, "HTTP/"); if (s && s[7] != '1') { if (soap->keep_alive == 1) soap->keep_alive = 0; if (soap->status == 0 && (soap->omode & SOAP_IO) == SOAP_IO_CHUNK) /* soap->status == 0 for HTTP request */ soap->omode = (soap->omode & ~SOAP_IO) | SOAP_IO_STORE; /* HTTP 1.0 does not support chunked transfers */ } if (soap->keep_alive < 0) soap->keep_alive = 1; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Keep alive connection = %d\n", soap->keep_alive)); if (soap->status == 0) { size_t l = 0; if (s) { if (!strncmp(soap->msgbuf, "POST ", l = 5)) httpcmd = 1; else if (!strncmp(soap->msgbuf, "PUT ", l = 4)) httpcmd = 2; else if (!strncmp(soap->msgbuf, "GET ", l = 4)) httpcmd = 3; else if (!strncmp(soap->msgbuf, "DELETE ", l = 7)) httpcmd = 4; else if (!strncmp(soap->msgbuf, "OPTIONS ", l = 8)) httpcmd = 5; else if (!strncmp(soap->msgbuf, "HEAD ", l = 5)) httpcmd = 6; } if (s && httpcmd) { size_t m, n, k; while (soap_blank(soap->msgbuf[l])) l++; m = strlen(soap->endpoint); n = m + (s - soap->msgbuf) - l - 1; if (n >= sizeof(soap->endpoint)) n = sizeof(soap->endpoint) - 1; if (m > n) m = n; k = n - m + 1; if (k >= sizeof(soap->path)) k = sizeof(soap->path) - 1; while (k > 0 && soap_blank(soap->msgbuf[l + k - 1])) k--; soap_strncpy(soap->path, sizeof(soap->path), soap->msgbuf + l, k); if (*soap->path && *soap->path != '/') soap_strncpy(soap->endpoint, sizeof(soap->endpoint), soap->path, k); else soap_strncat(soap->endpoint, sizeof(soap->endpoint), soap->path, k); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Target endpoint='%s' path='%s'\n", soap->endpoint, soap->path)); if (httpcmd > 1) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "HTTP %s handler\n", soap->msgbuf)); switch (httpcmd) { case 2: soap->error = soap->fput(soap); break; case 3: soap->error = soap->fget(soap); break; case 4: soap->error = soap->fdel(soap); break; case 5: soap->error = soap->fopt(soap); break; case 6: soap->error = soap->fhead(soap); break; default: soap->error = 405; break; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "HTTP handler return = %d\n", soap->error)); if (soap->error == SOAP_OK) soap->error = SOAP_STOP; /* prevents further processing */ return soap->error; } if (status) return soap->error = status; } else if (status) return soap->error = status; else if (s) return soap->error = 405; return SOAP_OK; } #if 0 if (soap->length > 0 || (soap->http_content && (!soap->keep_alive || soap->recv_timeout)) || (soap->imode & SOAP_IO) == SOAP_IO_CHUNK) #endif if (soap->body) { if ((soap->status >= 200 && soap->status <= 299) /* OK, Accepted, etc */ || soap->status == 400 /* Bad Request */ || soap->status == 500) /* Internal Server Error */ return soap->error = SOAP_OK; /* force close afterwards in soap_closesock() */ soap->keep_alive = 0; #ifndef WITH_LEAN /* read HTTP body for error details */ s = soap_get_http_body(soap, NULL); if (s) return soap_set_receiver_error(soap, soap->msgbuf, s, soap->status); #endif } else if (soap->status >= 200 && soap->status <= 299) return soap->error = soap->status; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "HTTP error %d: %s\n", soap->status, soap->msgbuf)); return soap_set_receiver_error(soap, "HTTP Error", soap->msgbuf, soap->status); } #endif #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 static int http_parse_header(struct soap *soap, const char *key, const char *val) { if (!soap_tag_cmp(key, "Host")) { #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) if (soap->imode & SOAP_ENC_SSL) soap_strcpy(soap->endpoint, sizeof(soap->endpoint), "https://"); else #endif soap_strcpy(soap->endpoint, sizeof(soap->endpoint), "http://"); soap_strncat(soap->endpoint, sizeof(soap->endpoint), val, sizeof(soap->endpoint) - 9); } #ifndef WITH_LEANER else if (!soap_tag_cmp(key, "Content-Type")) { const char *action; soap->http_content = soap_strdup(soap, val); if (soap_get_header_attribute(soap, val, "application/dime")) soap->imode |= SOAP_ENC_DIME; else if (soap_get_header_attribute(soap, val, "multipart/related") || soap_get_header_attribute(soap, val, "multipart/form-data")) { soap->mime.boundary = soap_strdup(soap, soap_get_header_attribute(soap, val, "boundary")); soap->mime.start = soap_strdup(soap, soap_get_header_attribute(soap, val, "start")); soap->imode |= SOAP_ENC_MIME; } action = soap_get_header_attribute(soap, val, "action"); if (action) { if (*action == '"') { soap->action = soap_strdup(soap, action + 1); if (*soap->action) soap->action[strlen(soap->action) - 1] = '\0'; } else soap->action = soap_strdup(soap, action); } } #endif else if (!soap_tag_cmp(key, "Content-Length")) { soap->length = soap_strtoul(val, NULL, 10); if (!soap->length) soap->body = 0; } else if (!soap_tag_cmp(key, "Content-Encoding")) { if (!soap_tag_cmp(val, "deflate")) #ifdef WITH_ZLIB soap->zlib_in = SOAP_ZLIB_DEFLATE; #else return SOAP_ZLIB_ERROR; #endif else if (!soap_tag_cmp(val, "gzip")) #ifdef WITH_GZIP soap->zlib_in = SOAP_ZLIB_GZIP; #else return SOAP_ZLIB_ERROR; #endif } #ifdef WITH_ZLIB else if (!soap_tag_cmp(key, "Accept-Encoding")) { #ifdef WITH_GZIP if (strchr(val, '*') || soap_get_header_attribute(soap, val, "gzip")) soap->zlib_out = SOAP_ZLIB_GZIP; else #endif if (strchr(val, '*') || soap_get_header_attribute(soap, val, "deflate")) soap->zlib_out = SOAP_ZLIB_DEFLATE; else soap->zlib_out = SOAP_ZLIB_NONE; } #endif else if (!soap_tag_cmp(key, "Transfer-Encoding")) { soap->imode &= ~SOAP_IO; if (!soap_tag_cmp(val, "chunked")) soap->imode |= SOAP_IO_CHUNK; } else if (!soap_tag_cmp(key, "Connection")) { if (!soap_tag_cmp(val, "keep-alive")) soap->keep_alive = -soap->keep_alive; else if (!soap_tag_cmp(val, "close")) soap->keep_alive = 0; } #if !defined(WITH_LEAN) || defined(WITH_NTLM) else if (!soap_tag_cmp(key, "Authorization") || !soap_tag_cmp(key, "Proxy-Authorization")) { #ifdef WITH_NTLM if (!soap_tag_cmp(val, "NTLM*")) soap->ntlm_challenge = soap_strdup(soap, val + 4); else #endif if (!soap_tag_cmp(val, "Basic *")) { int n; char *s; soap_base642s(soap, val + 6, soap->tmpbuf, sizeof(soap->tmpbuf) - 1, &n); soap->tmpbuf[n] = '\0'; if ((s = strchr(soap->tmpbuf, ':'))) { *s = '\0'; soap->userid = soap_strdup(soap, soap->tmpbuf); soap->passwd = soap_strdup(soap, s + 1); } } } else if (!soap_tag_cmp(key, "WWW-Authenticate") || !soap_tag_cmp(key, "Proxy-Authenticate")) { #ifdef WITH_NTLM if (!soap_tag_cmp(val, "NTLM*")) soap->ntlm_challenge = soap_strdup(soap, val + 4); else #endif soap->authrealm = soap_strdup(soap, soap_get_header_attribute(soap, val + 6, "realm")); } else if (!soap_tag_cmp(key, "Expect")) { if (!soap_tag_cmp(val, "100-continue")) { if ((soap->error = soap->fposthdr(soap, "HTTP/1.1 100 Continue", NULL)) || (soap->error = soap->fposthdr(soap, NULL, NULL))) return soap->error; } } #endif else if (!soap_tag_cmp(key, "SOAPAction")) { if (*val == '"') { soap->action = soap_strdup(soap, val + 1); if (*soap->action) soap->action[strlen(soap->action) - 1] = '\0'; } else soap->action = soap_strdup(soap, val); } else if (!soap_tag_cmp(key, "Location")) { soap_strcpy(soap->endpoint, sizeof(soap->endpoint), val); } else if (!soap_tag_cmp(key, "X-Forwarded-For")) { soap->proxy_from = soap_strdup(soap, val); } #ifdef WITH_COOKIES else if (!soap_tag_cmp(key, "Cookie") || !soap_tag_cmp(key, "Cookie2") || !soap_tag_cmp(key, "Set-Cookie") || !soap_tag_cmp(key, "Set-Cookie2")) { soap_getcookies(soap, val); } #endif return SOAP_OK; } #endif #endif /******************************************************************************/ #if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) #ifndef PALM_1 SOAP_FMAC1 const char* SOAP_FMAC2 soap_get_header_attribute(struct soap *soap, const char *line, const char *key) { const char *s = line; if (s) { while (*s) { short flag; s = soap_decode_key(soap->tmpbuf, sizeof(soap->tmpbuf), s); flag = soap_tag_cmp(soap->tmpbuf, key); s = soap_decode_val(soap->tmpbuf, sizeof(soap->tmpbuf), s); if (!flag) return soap->tmpbuf; } } return NULL; } #endif #endif /******************************************************************************/ #if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) #ifndef PALM_1 SOAP_FMAC1 const char* SOAP_FMAC2 soap_decode_key(char *buf, size_t len, const char *val) { return soap_decode(buf, len, val, "=,;"); } #endif #endif /******************************************************************************/ #if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) #ifndef PALM_1 SOAP_FMAC1 const char* SOAP_FMAC2 soap_decode_val(char *buf, size_t len, const char *val) { if (*val != '=') { *buf = '\0'; return val; } return soap_decode(buf, len, val + 1, ",;"); } #endif #endif /******************************************************************************/ #if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) #ifndef PALM_1 static const char* soap_decode(char *buf, size_t len, const char *val, const char *sep) { const char *s; char *t = buf; size_t i = len; for (s = val; *s; s++) if (*s != ' ' && *s != '\t' && !strchr(sep, *s)) break; if (len > 0) { if (*s == '"') { s++; while (*s && *s != '"' && --i) *t++ = *s++; } else { while (*s && !soap_blank((soap_wchar)*s) && !strchr(sep, *s) && --i) { if (*s == '%' && s[1] && s[2]) { *t++ = ((s[1] >= 'A' ? (s[1] & 0x7) + 9 : s[1] - '0') << 4) + (s[2] >= 'A' ? (s[2] & 0x7) + 9 : s[2] - '0'); s += 3; } else *t++ = *s++; } } buf[len - 1] = '\0'; /* appease */ } *t = '\0'; while (*s && !strchr(sep, *s)) s++; return s; } #endif #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 static const char* http_error(struct soap *soap, int status) { const char *msg = SOAP_STR_EOS; (void)soap; (void)status; #ifndef WITH_LEAN msg = soap_code_str(h_http_error_codes, status); if (!msg) msg = SOAP_STR_EOS; #endif return msg; } #endif #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 static int http_get(struct soap *soap) { (void)soap; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "HTTP GET request\n")); return SOAP_GET_METHOD; } #endif #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 static int http_405(struct soap *soap) { (void)soap; return 405; } #endif #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 static int http_200(struct soap *soap) { return soap_send_empty_response(soap, 200); } #endif #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 static int http_post(struct soap *soap, const char *endpoint, const char *host, int port, const char *path, const char *action, size_t count) { const char *s; int err; size_t l; switch (soap->status) { case SOAP_GET: s = "GET"; break; case SOAP_PUT: s = "PUT"; break; case SOAP_DEL: s = "DELETE"; break; case SOAP_CONNECT: s = "CONNECT"; break; default: s = "POST"; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "HTTP %s to %s\n", s, endpoint ? endpoint : "(null)")); #ifdef PALM if (!endpoint || (soap_tag_cmp(endpoint, "http:*") && soap_tag_cmp(endpoint, "https:*") && strncmp(endpoint, "_beam:", 6) && strncmp(endpoint, "_local:", 7) && strncmp(endpoint, "_btobex:", 8)) #else if (!endpoint || (soap_tag_cmp(endpoint, "http:*") && soap_tag_cmp(endpoint, "https:*") && soap_tag_cmp(endpoint, "httpg:*"))) #endif return SOAP_OK; /* set l to prevent overruns ('host' and 'soap->host' are substrings of 'endpoint') */ l = strlen(endpoint) + strlen(soap->http_version) + 80; if (l > sizeof(soap->tmpbuf)) return soap->error = SOAP_EOM; if (soap->status == SOAP_CONNECT) (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), l), "%s %s:%d HTTP/%s", s, soap->host, soap->port, soap->http_version); else if (soap->proxy_host && endpoint) (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), l), "%s %s HTTP/%s", s, endpoint, soap->http_version); else (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), l), "%s /%s HTTP/%s", s, (*path == '/' ? path + 1 : path), soap->http_version); if ((err = soap->fposthdr(soap, soap->tmpbuf, NULL))) return err; #ifdef WITH_OPENSSL if ((soap->ssl && port != 443) || (!soap->ssl && port != 80)) #else if (port != 80) #endif { #ifdef WITH_IPV6 if (*host != '[' && strchr(host, ':')) (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), l), "[%s]:%d", host, port); /* RFC 2732 */ else #endif (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), l), "%s:%d", host, port); } else { #ifdef WITH_IPV6 if (*host != '[' && strchr(host, ':')) (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), l), "[%s]", host); /* RFC 2732 */ else #endif soap_strcpy(soap->tmpbuf, sizeof(soap->tmpbuf), host); } if ((err = soap->fposthdr(soap, "Host", soap->tmpbuf))) return err; if ((err = soap->fposthdr(soap, "User-Agent", "gSOAP/2.8"))) return err; if ((err = soap_puthttphdr(soap, SOAP_OK, count))) return err; #ifdef WITH_ZLIB #ifdef WITH_GZIP if ((err = soap->fposthdr(soap, "Accept-Encoding", "gzip, deflate"))) #else if ((err = soap->fposthdr(soap, "Accept-Encoding", "deflate"))) #endif return err; #endif #if !defined(WITH_LEAN) || defined(WITH_NTLM) #ifdef WITH_NTLM if (soap->ntlm_challenge) { l = strlen(soap->ntlm_challenge); if (l) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), l + 5), "NTLM %s", soap->ntlm_challenge); if (soap->proxy_host) { if ((err = soap->fposthdr(soap, "Proxy-Authorization", soap->tmpbuf))) return err; } else if ((err = soap->fposthdr(soap, "Authorization", soap->tmpbuf))) return err; } } else { #endif if (soap->userid && soap->passwd) { l = strlen(soap->userid) + strlen(soap->passwd); soap_strcpy(soap->tmpbuf, sizeof(soap->tmpbuf), "Basic "); (SOAP_SNPRINTF(soap->tmpbuf + 262, sizeof(soap->tmpbuf) - 262, l + 1), "%s:%s", soap->userid, soap->passwd); soap_s2base64(soap, (const unsigned char*)(soap->tmpbuf + 262), soap->tmpbuf + 6, (int)strlen(soap->tmpbuf + 262)); if ((err = soap->fposthdr(soap, "Authorization", soap->tmpbuf))) return err; } if (soap->proxy_userid && soap->proxy_passwd) { l = strlen(soap->proxy_userid) + strlen(soap->proxy_passwd); soap_strcpy(soap->tmpbuf, sizeof(soap->tmpbuf), "Basic "); (SOAP_SNPRINTF(soap->tmpbuf + 262, sizeof(soap->tmpbuf) - 262, l + 1), "%s:%s", soap->proxy_userid, soap->proxy_passwd); soap_s2base64(soap, (const unsigned char*)(soap->tmpbuf + 262), soap->tmpbuf + 6, (int)strlen(soap->tmpbuf + 262)); if ((err = soap->fposthdr(soap, "Proxy-Authorization", soap->tmpbuf))) return err; } #ifdef WITH_NTLM } #endif #endif #ifdef WITH_COOKIES #ifdef WITH_OPENSSL if (soap_putcookies(soap, host, path, soap->ssl != NULL)) return soap->error; #else if (soap_putcookies(soap, host, path, 0)) return soap->error; #endif #endif if (action && soap->status != SOAP_GET && soap->status != SOAP_DEL) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), strlen(action) + 2), "\"%s\"", action); if ((err = soap->fposthdr(soap, "SOAPAction", soap->tmpbuf))) return err; } return soap->fposthdr(soap, NULL, NULL); } #endif #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 static int http_send_header(struct soap *soap, const char *s) { const char *t; do { t = strchr(s, '\n'); /* disallow \n in HTTP headers */ if (!t) t = s + strlen(s); if (soap_send_raw(soap, s, t - s)) return soap->error; s = t + 1; } while (*t); return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 static int http_post_header(struct soap *soap, const char *key, const char *val) { if (key) { if (http_send_header(soap, key)) return soap->error; if (val && (soap_send_raw(soap, ": ", 2) || http_send_header(soap, val))) return soap->error; } return soap_send_raw(soap, "\r\n", 2); } #endif #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 static int http_response(struct soap *soap, int status, size_t count) { int err; char http[16]; int code = status; const char *line; #ifdef WMW_RPM_IO if (soap->rpmreqid) httpOutputEnable(soap->rpmreqid); #endif #ifdef WMW_RPM_IO if (soap->rpmreqid || soap_valid_socket(soap->master) || soap_valid_socket(soap->socket)) /* RPM behaves as if standalone */ #else if (soap_valid_socket(soap->master) || soap_valid_socket(soap->socket)) /* standalone application (socket) or CGI (stdin/out)? */ #endif (SOAP_SNPRINTF(http, sizeof(http), strlen(soap->http_version) + 5), "HTTP/%s", soap->http_version); else soap_strcpy(http, sizeof(http), "Status:"); if (!status || status == SOAP_HTML || status == SOAP_FILE) { if (count || ((soap->omode & SOAP_IO) == SOAP_IO_CHUNK)) code = 200; else code = 202; } else if (status < 200 || status >= 600) { const char *s = *soap_faultcode(soap); if (status >= SOAP_GET_METHOD && status <= SOAP_HTTP_METHOD) code = 405; else if (soap->version == 2 && (!s || !strcmp(s, "SOAP-ENV:Sender"))) code = 400; else code = 500; } line = http_error(soap, code); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "HTTP Status = %d %s\n", code, line)); (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), sizeof(http) + 22 + strlen(line)), "%s %d %s", http, code, line); if ((err = soap->fposthdr(soap, soap->tmpbuf, NULL))) return err; #ifndef WITH_LEAN if (status == 401) { (SOAP_SNPRINTF_SAFE(soap->tmpbuf, sizeof(soap->tmpbuf)), "Basic realm=\"%s\"", (soap->authrealm && strlen(soap->authrealm) + 14 < sizeof(soap->tmpbuf)) ? soap->authrealm : "gSOAP Web Service"); if ((err = soap->fposthdr(soap, "WWW-Authenticate", soap->tmpbuf))) return err; } else if ((status >= 301 && status <= 303) || status == 307) { if ((err = soap->fposthdr(soap, "Location", soap->endpoint))) return err; } #endif if ((err = soap->fposthdr(soap, "Server", "gSOAP/2.8")) || (err = soap_puthttphdr(soap, status, count))) return err; #ifdef WITH_COOKIES if (soap_putsetcookies(soap)) return soap->error; #endif return soap->fposthdr(soap, NULL, NULL); } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_response(struct soap *soap, int status) { size_t count; if (!(soap->omode & (SOAP_ENC_XML | SOAP_IO_STORE /* this tests for chunking too */)) && (status == SOAP_HTML || status == SOAP_FILE)) soap->omode = (soap->omode & ~SOAP_IO) | SOAP_IO_STORE; soap->status = status; count = soap_count_attachments(soap); if (soap_begin_send(soap)) return soap->error; #ifndef WITH_NOHTTP if ((soap->mode & SOAP_IO) != SOAP_IO_STORE && !(soap->mode & SOAP_ENC_XML)) { int n = soap->mode; soap->mode &= ~(SOAP_IO | SOAP_ENC_ZLIB); if ((n & SOAP_IO) != SOAP_IO_FLUSH) soap->mode |= SOAP_IO_BUFFER; if ((soap->error = soap->fresponse(soap, status, count))) return soap->error; #ifndef WITH_LEANER if ((n & SOAP_IO) == SOAP_IO_CHUNK) { if (soap_flush(soap)) return soap->error; } #endif soap->mode = n; } #endif return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 const char* SOAP_FMAC2 soap_url(struct soap *soap, const char *s, const char *t) { if (!t || (*t != '/' && *t != '?')) return s; (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), strlen(s) + strlen(t)), "%s%s", s, t); return soap->msgbuf; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 size_t SOAP_FMAC2 soap_encode_url(const char *s, char *t, size_t len) { int c; size_t n = len; while ((c = *s++) && --n > 0) { if (c > ' ' && c < 128 && !strchr("()<>@,;:\\\"/[]?={}#!$&'*+", c)) *t++ = c; else if (n > 2) { *t++ = '%'; *t++ = (c >> 4) + (c > 159 ? '7' : '0'); c &= 0xF; *t++ = c + (c > 9 ? '7' : '0'); n -= 2; } else break; } *t = '\0'; return len - n; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 const char* SOAP_FMAC2 soap_encode_url_string(struct soap *soap, const char *s) { if (s) { size_t n = 3*strlen(s)+1; char *t = (char*)soap_malloc(soap, n); if (t) { soap_encode_url(s, t, n); return t; } } return SOAP_STR_EOS; } #endif /******************************************************************************\ * * HTTP Cookies * \******************************************************************************/ #ifdef WITH_COOKIES SOAP_FMAC1 struct soap_cookie* SOAP_FMAC2 soap_cookie(struct soap *soap, const char *name, const char *domain, const char *path) { struct soap_cookie *p; if (!domain) domain = soap->cookie_domain; if (!path) path = soap->cookie_path; if (!path) path = SOAP_STR_EOS; else if (*path == '/') path++; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Search cookie='%s' domain='%s' path='%s'\n", name, domain ? domain : "(null)", path ? path : "(null)")); for (p = soap->cookies; p; p = p->next) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Cookie in database: %s='%s' domain='%s' path='%s' env=%hd\n", p->name, p->value ? p->value : "(null)", p->domain ? p->domain : "(null)", p->path ? p->path : "(null)", p->env)); if (!strcmp(p->name, name) && ((!p->domain && !domain) || (p->domain && !strcmp(p->domain, domain))) && ((!p->path && !path) || (p->path && !strncmp(p->path, path, strlen(p->path))))) break; } return p; } /******************************************************************************/ SOAP_FMAC1 struct soap_cookie* SOAP_FMAC2 soap_set_cookie(struct soap *soap, const char *name, const char *value, const char *domain, const char *path) { struct soap_cookie **p, *q; int n; if (!domain) domain = soap->cookie_domain; if (!path) path = soap->cookie_path; if (!path) path = SOAP_STR_EOS; else if (*path == '/') path++; q = soap_cookie(soap, name, domain, path); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Set %scookie: %s='%s' domain='%s' path='%s'\n", q ? SOAP_STR_EOS : "new ", name, value ? value : "(null)", domain ? domain : "(null)", path ? path : "(null)")); if (!q) { if ((q = (struct soap_cookie*)SOAP_MALLOC(soap, sizeof(struct soap_cookie)))) { size_t l = strlen(name); if ((q->name = (char*)SOAP_MALLOC(soap, l + 1))) soap_strcpy(q->name, l + 1, name); q->value = NULL; q->domain = NULL; q->path = NULL; q->expire = 0; q->maxage = -1; q->version = 1; q->secure = 0; q->modified = 0; for (p = &soap->cookies, n = soap->cookie_max; *p && n; p = &(*p)->next, n--) if (!strcmp((*p)->name, name) && (*p)->path && path && strcmp((*p)->path, path) < 0) break; if (n) { q->next = *p; *p = q; } else { SOAP_FREE(soap, q->name); SOAP_FREE(soap, q); q = NULL; } } } else q->modified = 1; if (q) { if (q->value) { if (!value || strcmp(value, q->value)) { SOAP_FREE(soap, q->value); q->value = NULL; } } if (value && *value && !q->value) { size_t l = strlen(value); q->value = (char*)SOAP_MALLOC(soap, l + 1); if (q->value) soap_strcpy(q->value, l + 1, value); } if (q->domain) { if (!domain || strcmp(domain, q->domain)) { SOAP_FREE(soap, q->domain); q->domain = NULL; } } if (domain && !q->domain) { size_t l = strlen(domain); q->domain = (char*)SOAP_MALLOC(soap, l + 1); if (q->domain) soap_strcpy(q->domain, l + 1, domain); } if (q->path) { if (!path || strncmp(path, q->path, strlen(q->path))) { SOAP_FREE(soap, q->path); q->path = NULL; } } if (path && !q->path) { size_t l = strlen(path); q->path = (char*)SOAP_MALLOC(soap, l + 1); if (q->path) soap_strcpy(q->path, l + 1, path); } q->session = 1; q->env = 0; } return q; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_clr_cookie(struct soap *soap, const char *name, const char *domain, const char *path) { struct soap_cookie **p, *q; if (!domain) domain = soap->cookie_domain; if (!domain) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Error in clear cookie='%s': cookie domain not set\n", name ? name : "(null)")); return; } if (!path) path = soap->cookie_path; if (!path) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Error in clear cookie='%s': cookie path not set\n", name ? name : "(null)")); return; } if (*path == '/') path++; for (p = &soap->cookies, q = *p; q; q = *p) { if (!strcmp(q->name, name) && (!q->domain || !strcmp(q->domain, domain)) && (!q->path || !strncmp(q->path, path, strlen(q->path)))) { if (q->value) SOAP_FREE(soap, q->value); if (q->domain) SOAP_FREE(soap, q->domain); if (q->path) SOAP_FREE(soap, q->path); *p = q->next; SOAP_FREE(soap, q); } else p = &q->next; } } /******************************************************************************/ SOAP_FMAC1 char * SOAP_FMAC2 soap_cookie_value(struct soap *soap, const char *name, const char *domain, const char *path) { struct soap_cookie *p; if ((p = soap_cookie(soap, name, domain, path))) return p->value; return NULL; } /******************************************************************************/ SOAP_FMAC1 char * SOAP_FMAC2 soap_env_cookie_value(struct soap *soap, const char *name, const char *domain, const char *path) { struct soap_cookie *p; if ((p = soap_cookie(soap, name, domain, path)) && p->env) return p->value; return NULL; } /******************************************************************************/ SOAP_FMAC1 time_t SOAP_FMAC2 soap_cookie_expire(struct soap *soap, const char *name, const char *domain, const char *path) { struct soap_cookie *p; if ((p = soap_cookie(soap, name, domain, path))) return p->expire; return -1; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_set_cookie_expire(struct soap *soap, const char *name, long expire, const char *domain, const char *path) { struct soap_cookie *p; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Set cookie expiration max-age=%ld: cookie='%s' domain='%s' path='%s'\n", expire, name, domain ? domain : "(null)", path ? path : "(null)")); if ((p = soap_cookie(soap, name, domain, path))) { p->maxage = expire; p->modified = 1; return SOAP_OK; } return SOAP_ERR; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_set_cookie_session(struct soap *soap, const char *name, const char *domain, const char *path) { struct soap_cookie *p; if ((p = soap_cookie(soap, name, domain, path))) { p->session = 1; p->modified = 1; return SOAP_OK; } return SOAP_ERR; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_clr_cookie_session(struct soap *soap, const char *name, const char *domain, const char *path) { struct soap_cookie *p; if ((p = soap_cookie(soap, name, domain, path))) { p->session = 0; p->modified = 1; return SOAP_OK; } return SOAP_ERR; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_putsetcookies(struct soap *soap) { struct soap_cookie *p; char *s, tmp[4096]; const char *t; for (p = soap->cookies; p; p = p->next) { if (p->modified #ifdef WITH_OPENSSL || (!p->env && !soap->ssl == !p->secure) #endif ) { s = tmp; if (p->name) s += soap_encode_url(p->name, s, 4064 - (s-tmp)); if (p->value && *p->value) { *s++ = '='; s += soap_encode_url(p->value, s, 4064 - (s-tmp)); } if (p->domain && (int)strlen(p->domain) < 4064 - (s-tmp)) { soap_strcpy(s, 4096 - (s-tmp), ";Domain="); soap_strcpy(s + 8, 4088 - (s-tmp), p->domain); } else if (soap->cookie_domain && (int)strlen(soap->cookie_domain) < 4064 - (s-tmp)) { soap_strcpy(s, 4096 - (s-tmp), ";Domain="); soap_strcpy(s + 8, 4088 - (s-tmp), soap->cookie_domain); } s += strlen(s); soap_strcpy(s, 4096 - (s-tmp), ";Path=/"); if (p->path) t = p->path; else t = soap->cookie_path; if (t) { if (*t == '/') t++; if ((int)strlen(t) < 4064 - (s-tmp)) { if (strchr(t, '%')) /* already URL encoded? */ { soap_strcpy(s, 4096 - (s-tmp), t); s += strlen(s); } else s += soap_encode_url(t, s, 4064 - (s-tmp)); } } if (p->version > 0 && s-tmp < 4064) { (SOAP_SNPRINTF(s, 4096 - (s-tmp), 29), ";Version=%u", p->version); s += strlen(s); } if (p->maxage >= 0 && s-tmp < 4064) { (SOAP_SNPRINTF(s, 4096 - (s-tmp), 29), ";Max-Age=%ld", p->maxage); s += strlen(s); } if (s-tmp < 4073 && (p->secure #ifdef WITH_OPENSSL || soap->ssl #endif )) soap_strcpy(s, 4096 - (s-tmp), ";Secure"); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Set-Cookie: %s\n", tmp)); if ((soap->error = soap->fposthdr(soap, "Set-Cookie", tmp))) return soap->error; } } return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_putcookies(struct soap *soap, const char *domain, const char *path, int secure) { struct soap_cookie **p, *q; unsigned int version = 0; time_t now = time(NULL); char *s, tmp[4096]; if (!domain || !path) return SOAP_OK; s = tmp; p = &soap->cookies; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Sending cookies for domain='%s' path='%s'\n", domain, path)); if (*path == '/') path++; while ((q = *p)) { if (q->expire && now > q->expire) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Cookie %s expired\n", q->name)); SOAP_FREE(soap, q->name); if (q->value) SOAP_FREE(soap, q->value); if (q->domain) SOAP_FREE(soap, q->domain); if (q->path) SOAP_FREE(soap, q->path); *p = q->next; SOAP_FREE(soap, q); } else { int flag; char *t = q->domain; size_t n = 0; if (!t) flag = 1; else { const char *r = strchr(t, ':'); if (r) n = r - t; else n = strlen(t); flag = !strncmp(t, domain, n); } /* domain-level cookies, cannot compile when WITH_NOIO set */ #ifndef WITH_NOIO if (!flag) { struct hostent *hostent = gethostbyname((char*)domain); if (hostent) { const char *r = hostent->h_name; if (*t == '.') { size_t k = strlen(hostent->h_name); if (k >= n) r = hostent->h_name + k - n; } flag = !strncmp(t, r, n); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Domain cookie %s host %s (match=%d)\n", t, r, flag)); } } #endif if (flag && (!q->path || !strncmp(q->path, path, strlen(q->path))) && (!q->secure || secure)) { size_t n = 12; if (q->name) n += 3*strlen(q->name); if (q->value && *q->value) n += 3*strlen(q->value) + 1; if (q->path && *q->path) n += strlen(q->path) + 9; if (q->domain) n += strlen(q->domain) + 11; if (tmp - s + n > sizeof(tmp)) { if (s == tmp) return SOAP_OK; /* HTTP header size overflow */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Cookie: %s\n", tmp)); if ((soap->error = soap->fposthdr(soap, "Cookie", tmp))) return soap->error; s = tmp; } else if (s != tmp) { *s++ = ' '; } if (q->version != version && s-tmp < 4060) { (SOAP_SNPRINTF(s, 4096 - (s-tmp), 29), "$Version=%u;", q->version); version = q->version; s += strlen(s); } if (q->name) s += soap_encode_url(q->name, s, tmp+sizeof(tmp)-s-16); if (q->value && *q->value) { *s++ = '='; s += soap_encode_url(q->value, s, tmp+sizeof(tmp)-s-16); } if (q->path && (s-tmp) + strlen(q->path) < 4060) { (SOAP_SNPRINTF_SAFE(s, 4096 - (s-tmp)), ";$Path=\"/%s\"", (*q->path == '/' ? q->path + 1 : q->path)); s += strlen(s); } if (q->domain && (s-tmp) + strlen(q->domain) < 4060) { (SOAP_SNPRINTF_SAFE(s, 4096 - (s-tmp)), ";$Domain=\"%s\"", q->domain); s += strlen(s); } } p = &q->next; } } if (s != tmp) if ((soap->error = soap->fposthdr(soap, "Cookie", tmp))) return soap->error; return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_getcookies(struct soap *soap, const char *val) { struct soap_cookie *p = NULL, *q; const char *s; char *t, tmp[4096]; /* cookie size is up to 4096 bytes [RFC2109] */ char *domain = NULL; char *path = NULL; unsigned int version = 0; time_t now = time(NULL); if (!val) return; s = val; while (*s) { s = soap_decode_key(tmp, sizeof(tmp), s); if (!soap_tag_cmp(tmp, "$Version")) { if ((s = soap_decode_val(tmp, sizeof(tmp), s))) { if (p) p->version = (int)soap_strtol(tmp, NULL, 10); else version = (int)soap_strtol(tmp, NULL, 10); } } else if (!soap_tag_cmp(tmp, "$Path")) { s = soap_decode_val(tmp, sizeof(tmp), s); if (*tmp) { size_t l = strlen(tmp) + 1; if ((t = (char*)SOAP_MALLOC(soap, l))) soap_memcpy((void*)t, l, (const void*)tmp, l); } else t = NULL; if (p) { if (p->path) SOAP_FREE(soap, p->path); p->path = t; } else { if (path) SOAP_FREE(soap, path); path = t; } } else if (!soap_tag_cmp(tmp, "$Domain")) { s = soap_decode_val(tmp, sizeof(tmp), s); if (*tmp) { size_t l = strlen(tmp) + 1; if ((t = (char*)SOAP_MALLOC(soap, l))) soap_memcpy((void*)t, l, (const void*)tmp, l); } else t = NULL; if (p) { if (p->domain) SOAP_FREE(soap, p->domain); p->domain = t; } else { if (domain) SOAP_FREE(soap, domain); domain = t; } } else if (p && !soap_tag_cmp(tmp, "Path")) { if (p->path) SOAP_FREE(soap, p->path); s = soap_decode_val(tmp, sizeof(tmp), s); if (*tmp) { size_t l = strlen(tmp) + 1; if ((p->path = (char*)SOAP_MALLOC(soap, l))) soap_memcpy((void*)p->path, l, (const void*)tmp, l); } else p->path = NULL; } else if (p && !soap_tag_cmp(tmp, "Domain")) { if (p->domain) SOAP_FREE(soap, p->domain); s = soap_decode_val(tmp, sizeof(tmp), s); if (*tmp) { size_t l = strlen(tmp) + 1; if ((p->domain = (char*)SOAP_MALLOC(soap, l))) soap_memcpy((void*)p->domain, l, (const void*)tmp, l); } else p->domain = NULL; } else if (p && !soap_tag_cmp(tmp, "Version")) { s = soap_decode_val(tmp, sizeof(tmp), s); p->version = (unsigned int)soap_strtoul(tmp, NULL, 10); } else if (p && !soap_tag_cmp(tmp, "Max-Age")) { s = soap_decode_val(tmp, sizeof(tmp), s); p->expire = now + soap_strtol(tmp, NULL, 10); } else if (p && !soap_tag_cmp(tmp, "Expires")) { struct tm T; char a[3]; static const char mns[] = "anebarprayunulugepctovec"; s = soap_decode_val(tmp, sizeof(tmp), s); if (strlen(tmp) > 20) { memset((void*)&T, 0, sizeof(T)); a[0] = tmp[4]; a[1] = tmp[5]; a[2] = '\0'; T.tm_mday = (int)soap_strtol(a, NULL, 10); a[0] = tmp[8]; a[1] = tmp[9]; T.tm_mon = (int)(strstr(mns, a) - mns) / 2; a[0] = tmp[11]; a[1] = tmp[12]; T.tm_year = 100 + (int)soap_strtol(a, NULL, 10); a[0] = tmp[13]; a[1] = tmp[14]; T.tm_hour = (int)soap_strtol(a, NULL, 10); a[0] = tmp[16]; a[1] = tmp[17]; T.tm_min = (int)soap_strtol(a, NULL, 10); a[0] = tmp[19]; a[1] = tmp[20]; T.tm_sec = (int)soap_strtol(a, NULL, 10); p->expire = soap_timegm(&T); } } else if (p && !soap_tag_cmp(tmp, "Secure")) p->secure = 1; else { if (p) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Got environment cookie='%s' value='%s' domain='%s' path='%s' expire=%ld secure=%d\n", p->name, p->value ? p->value : "(null)", p->domain ? p->domain : "(null)", p->path ? p->path : "(null)", p->expire, p->secure)); if ((q = soap_set_cookie(soap, p->name, p->value, p->domain, p->path))) { q->version = p->version; q->expire = p->expire; q->secure = p->secure; q->env = 1; } if (p->name) SOAP_FREE(soap, p->name); if (p->value) SOAP_FREE(soap, p->value); if (p->domain) SOAP_FREE(soap, p->domain); if (p->path) SOAP_FREE(soap, p->path); SOAP_FREE(soap, p); } if ((p = (struct soap_cookie*)SOAP_MALLOC(soap, sizeof(struct soap_cookie)))) { size_t l = strlen(tmp) + 1; if ((p->name = (char*)SOAP_MALLOC(soap, l))) soap_memcpy((void*)p->name, l, (const void*)tmp, l); s = soap_decode_val(tmp, sizeof(tmp), s); if (*tmp) { l = strlen(tmp) + 1; if ((p->value = (char*)SOAP_MALLOC(soap, l))) soap_memcpy((void*)p->value, l, (const void*)tmp, l); } else p->value = NULL; if (domain) p->domain = domain; else if (*soap->host) { l = strlen(soap->host) + 1; if ((p->domain = (char*)SOAP_MALLOC(soap, l))) soap_memcpy((void*)p->domain, l, (const void*)soap->host, l); } else p->domain = NULL; if (path) p->path = path; else if (*soap->path) { l = strlen(soap->path) + 1; if ((p->path = (char*)SOAP_MALLOC(soap, l))) soap_memcpy((void*)p->path, l, (const void*)soap->path, l); } else { if ((p->path = (char*)SOAP_MALLOC(soap, 2))) soap_memcpy((void*)p->path, 2, (const void*)"/", 2); } p->expire = 0; p->secure = 0; p->version = version; } } } if (p) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Got environment cookie='%s' value='%s' domain='%s' path='%s' expire=%ld secure=%d\n", p->name, p->value ? p->value : "(null)", p->domain ? p->domain : "(null)", p->path ? p->path : "(null)", p->expire, p->secure)); if ((q = soap_set_cookie(soap, p->name, p->value, p->domain, p->path))) { q->version = p->version; q->expire = p->expire; q->secure = p->secure; q->env = 1; } if (p->name) SOAP_FREE(soap, p->name); if (p->value) SOAP_FREE(soap, p->value); if (p->domain) SOAP_FREE(soap, p->domain); if (p->path) SOAP_FREE(soap, p->path); SOAP_FREE(soap, p); } if (domain) SOAP_FREE(soap, domain); if (path) SOAP_FREE(soap, path); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_getenv_cookies(struct soap *soap) { struct soap_cookie *p; const char *s; char key[4096], val[4096]; /* cookie size is up to 4096 bytes [RFC2109] */ if (!(s = getenv("HTTP_COOKIE"))) return SOAP_ERR; do { s = soap_decode_key(key, sizeof(key), s); s = soap_decode_val(val, sizeof(val), s); p = soap_set_cookie(soap, key, val, NULL, NULL); if (p) p->env = 1; } while (*s); return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 struct soap_cookie* SOAP_FMAC2 soap_copy_cookies(struct soap *copy, const struct soap *soap) { struct soap_cookie *p, **q, *r; q = &r; for (p = soap->cookies; p; p = p->next) { if (!(*q = (struct soap_cookie*)SOAP_MALLOC(copy, sizeof(struct soap_cookie)))) return r; **q = *p; if (p->name) { size_t l = strlen(p->name) + 1; if (((*q)->name = (char*)SOAP_MALLOC(copy, l))) soap_memcpy((*q)->name, l, p->name, l); } if (p->value) { size_t l = strlen(p->value) + 1; if (((*q)->value = (char*)SOAP_MALLOC(copy, l))) soap_memcpy((*q)->value, l, p->value, l); } if (p->domain) { size_t l = strlen(p->domain) + 1; if (((*q)->domain = (char*)SOAP_MALLOC(copy, l))) soap_memcpy((*q)->domain, l, p->domain, l); } if (p->path) { size_t l = strlen(p->path) + 1; if (((*q)->path = (char*)SOAP_MALLOC(copy, l))) soap_memcpy((*q)->path, l, p->path, l); } q = &(*q)->next; } *q = NULL; return r; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_free_cookies(struct soap *soap) { struct soap_cookie *p; for (p = soap->cookies; p; p = soap->cookies) { soap->cookies = p->next; SOAP_FREE(soap, p->name); if (p->value) SOAP_FREE(soap, p->value); if (p->domain) SOAP_FREE(soap, p->domain); if (p->path) SOAP_FREE(soap, p->path); SOAP_FREE(soap, p); } } /******************************************************************************/ #endif /* WITH_COOKIES */ /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 size_t SOAP_FMAC2 soap_hash(const char *s) { size_t h = 0; while (*s) h = 65599*h + *s++; return h % SOAP_IDHASH; } #endif /******************************************************************************/ #ifndef PALM_1 static void soap_init_pht(struct soap *soap) { int i; soap->pblk = NULL; soap->pidx = 0; for (i = 0; i < (int)SOAP_PTRHASH; i++) soap->pht[i] = NULL; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 struct soap* SOAP_FMAC2 soap_versioning(soap_new)(soap_mode imode, soap_mode omode) { struct soap *soap; #ifdef __cplusplus soap = SOAP_NEW(struct soap); #else soap = (struct soap*)malloc(sizeof(struct soap)); #endif if (soap) soap_versioning(soap_init)(soap, imode, omode); return soap; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_free(struct soap *soap) { soap_done(soap); #ifdef __cplusplus SOAP_DELETE(soap); #else free(soap); #endif } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_del(struct soap *soap) { free(soap); } #endif /******************************************************************************/ #ifndef PALM_1 static void soap_free_pht(struct soap *soap) { struct soap_pblk *pb, *next; int i; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free pointer hashtable\n")); for (pb = soap->pblk; pb; pb = next) { next = pb->next; SOAP_FREE(soap, pb); } soap->pblk = NULL; soap->pidx = 0; for (i = 0; i < (int)SOAP_PTRHASH; i++) soap->pht[i] = NULL; } #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_embed(struct soap *soap, const void *p, const void *a, int n, int t) { int id; struct soap_plist *pp; if (soap->version == 2) soap->encoding = 1; if (!p || (!soap->encodingStyle && !(soap->omode & SOAP_XML_GRAPH)) || (soap->omode & SOAP_XML_TREE)) return 0; if (a) id = soap_array_pointer_lookup(soap, p, a, n, t, &pp); else id = soap_pointer_lookup(soap, p, t, &pp); if (id) { if (soap_is_embedded(soap, pp) || soap_is_single(soap, pp)) return 0; soap_set_embedded(soap, pp); } return id; } #endif #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_pointer_lookup(struct soap *soap, const void *p, int type, struct soap_plist **ppp) { struct soap_plist *pp; *ppp = NULL; if (p) { for (pp = soap->pht[soap_hash_ptr(p)]; pp; pp = pp->next) { if (pp->ptr == p && pp->type == type) { *ppp = pp; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Lookup location=%p type=%d id=%d\n", p, type, pp->id)); return pp->id; } } } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Lookup location=%p type=%d: not found\n", p, type)); return 0; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_pointer_enter(struct soap *soap, const void *p, const void *a, int n, int type, struct soap_plist **ppp) { size_t h; struct soap_plist *pp; (void)n; if (!soap->pblk || soap->pidx >= SOAP_PTRBLK) { struct soap_pblk *pb = (struct soap_pblk*)SOAP_MALLOC(soap, sizeof(struct soap_pblk)); if (!pb) { soap->error = SOAP_EOM; return 0; } pb->next = soap->pblk; soap->pblk = pb; soap->pidx = 0; } *ppp = pp = &soap->pblk->plist[soap->pidx++]; if (a) h = soap_hash_ptr(a); else h = soap_hash_ptr(p); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Pointer enter location=%p array=%p size=%lu type=%d id=%d\n", p, a, (unsigned long)n, type, soap->idnum+1)); pp->next = soap->pht[h]; pp->type = type; pp->mark1 = 0; pp->mark2 = 0; pp->ptr = p; pp->dup = NULL; pp->array = a; pp->size = n; soap->pht[h] = pp; pp->id = ++soap->idnum; return pp->id; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_array_pointer_lookup(struct soap *soap, const void *p, const void *a, int n, int type, struct soap_plist **ppp) { struct soap_plist *pp; *ppp = NULL; if (!p || !a) return 0; for (pp = soap->pht[soap_hash_ptr(a)]; pp; pp = pp->next) { if (pp->type == type && pp->array == a && pp->size == n) { *ppp = pp; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Array lookup location=%p type=%d id=%d\n", a, type, pp->id)); return pp->id; } } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Array lookup location=%p type=%d: not found\n", a, type)); return 0; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_begin_count(struct soap *soap) { soap_free_ns(soap); #ifndef WITH_LEANER if ((soap->mode & SOAP_ENC_DIME) || (soap->omode & SOAP_ENC_DIME)) soap->mode = soap->omode | SOAP_IO_LENGTH | SOAP_ENC_DIME; else #endif { soap->mode = soap->omode; if ((soap->mode & SOAP_IO_UDP)) { soap->mode |= SOAP_ENC_XML; soap->mode &= ~SOAP_IO_CHUNK; } if ((soap->mode & SOAP_IO) == SOAP_IO_STORE || (((soap->mode & SOAP_IO) == SOAP_IO_CHUNK || (soap->mode & SOAP_ENC_XML)) #ifndef WITH_LEANER && !soap->fpreparesend #endif )) soap->mode &= ~SOAP_IO_LENGTH; else soap->mode |= SOAP_IO_LENGTH; } #ifdef WITH_ZLIB if ((soap->mode & SOAP_ENC_ZLIB) && (soap->mode & SOAP_IO) == SOAP_IO_FLUSH) { if (!(soap->mode & SOAP_ENC_DIME)) soap->mode &= ~SOAP_IO_LENGTH; if (soap->mode & SOAP_ENC_XML) soap->mode |= SOAP_IO_BUFFER; else soap->mode |= SOAP_IO_STORE; } #endif #ifndef WITH_LEANER if ((soap->mode & SOAP_ENC_MTOM) && (soap->mode & SOAP_ENC_DIME)) soap->mode |= SOAP_ENC_MIME; else if (!(soap->mode & SOAP_ENC_MIME)) soap->mode &= ~SOAP_ENC_MTOM; if (soap->mode & SOAP_ENC_MIME) soap_select_mime_boundary(soap); soap->dime.list = soap->dime.last; /* keep track of last DIME attachment */ #endif soap->count = 0; soap->ns = 0; soap->null = 0; soap->position = 0; soap->mustUnderstand = 0; soap->encoding = 0; soap->part = SOAP_BEGIN; soap->event = 0; soap->evlev = 0; soap->idnum = 0; soap->body = 1; soap->level = 0; soap_clr_attr(soap); soap_set_local_namespaces(soap); #ifndef WITH_LEANER soap->dime.count = 0; /* count # of attachments */ soap->dime.size = 0; /* accumulate total size of attachments */ if (soap->fprepareinitsend && (soap->mode & SOAP_IO) != SOAP_IO_STORE && (soap->error = soap->fprepareinitsend(soap))) return soap->error; #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Begin count phase (socket=%d mode=0x%x count=%lu)\n", soap->socket, (unsigned int)soap->mode, (unsigned long)soap->count)); return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_end_count(struct soap *soap) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of count phase\n")); #ifndef WITH_LEANER if ((soap->mode & SOAP_IO_LENGTH)) { if (soap->fpreparefinalsend && (soap->error = soap->fpreparefinalsend(soap))) return soap->error; } #else (void)soap; #endif return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_begin_send(struct soap *soap) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Initializing for output to socket=%d/fd=%d\n", soap->socket, soap->sendfd)); soap_free_ns(soap); soap->error = SOAP_OK; soap->mode = soap->omode | (soap->mode & (SOAP_IO_LENGTH | SOAP_ENC_DIME)); #ifndef WITH_LEAN if ((soap->mode & SOAP_IO_UDP)) { soap->mode |= SOAP_ENC_XML; soap->mode &= ~SOAP_IO_CHUNK; if (soap->count > sizeof(soap->buf)) return soap->error = SOAP_UDP_ERROR; } #endif #ifdef WITH_ZLIB if ((soap->mode & SOAP_ENC_ZLIB) && (soap->mode & SOAP_IO) == SOAP_IO_FLUSH) { if (soap->mode & SOAP_ENC_XML) soap->mode |= SOAP_IO_BUFFER; else soap->mode |= SOAP_IO_STORE; } #endif if ((soap->mode & SOAP_IO) == SOAP_IO_FLUSH) { if (soap_valid_socket(soap->socket)) { if (soap->count || (soap->mode & SOAP_IO_LENGTH) || (soap->mode & SOAP_ENC_XML)) soap->mode |= SOAP_IO_BUFFER; else soap->mode |= SOAP_IO_STORE; } #if !defined(__cplusplus) || defined(WITH_COMPAT) else if (soap->os != NULL) { *soap->os = NULL; soap->mode |= SOAP_IO_STORE; } #endif } soap->mode &= ~SOAP_IO_LENGTH; if ((soap->mode & SOAP_IO) == SOAP_IO_STORE) if (soap_new_block(soap) == NULL) return soap->error; if (!(soap->mode & SOAP_IO_KEEPALIVE)) soap->keep_alive = 0; #ifndef WITH_LEANER if ((soap->mode & SOAP_ENC_MTOM) && (soap->mode & SOAP_ENC_DIME)) { soap->mode |= SOAP_ENC_MIME; soap->mode &= ~SOAP_ENC_DIME; } else if (!(soap->mode & SOAP_ENC_MIME)) soap->mode &= ~SOAP_ENC_MTOM; if (soap->mode & SOAP_ENC_MIME) soap_select_mime_boundary(soap); #ifdef WIN32 #ifndef UNDER_CE #ifndef WITH_FASTCGI if (!soap_valid_socket(soap->socket) && !soap->os && soap->sendfd >= 0) /* Set win32 stdout or soap->sendfd to BINARY, e.g. to support DIME */ #ifdef __BORLANDC__ setmode(soap->sendfd, _O_BINARY); #else _setmode(soap->sendfd, _O_BINARY); #endif #endif #endif #endif #endif if (soap->mode & SOAP_IO) { soap->bufidx = 0; soap->buflen = 0; } soap->chunksize = 0; soap->ns = 0; soap->null = 0; soap->position = 0; soap->mustUnderstand = 0; soap->encoding = 0; soap->idnum = 0; soap->body = 1; soap->level = 0; soap_clr_attr(soap); soap_set_local_namespaces(soap); #ifdef WITH_ZLIB soap->z_ratio_out = 1.0; if ((soap->mode & SOAP_ENC_ZLIB) && soap->zlib_state != SOAP_ZLIB_DEFLATE) { if (!soap->d_stream) { soap->d_stream = (z_stream*)SOAP_MALLOC(soap, sizeof(z_stream)); soap->d_stream->zalloc = Z_NULL; soap->d_stream->zfree = Z_NULL; soap->d_stream->opaque = Z_NULL; soap->d_stream->next_in = Z_NULL; } if (!soap->z_buf) soap->z_buf = (char*)SOAP_MALLOC(soap, sizeof(soap->buf)); soap->d_stream->next_out = (Byte*)soap->z_buf; soap->d_stream->avail_out = sizeof(soap->buf); #ifdef WITH_GZIP if (soap->zlib_out != SOAP_ZLIB_DEFLATE) { if (soap_memcpy((void*)soap->z_buf, sizeof(soap->buf), (const void*)"\37\213\10\0\0\0\0\0\0\377", 10)) return soap->error = SOAP_EOM; soap->d_stream->next_out = (Byte*)soap->z_buf + 10; soap->d_stream->avail_out = sizeof(soap->buf) - 10; soap->z_crc = crc32(0L, NULL, 0); soap->zlib_out = SOAP_ZLIB_GZIP; if (soap->z_dict) *((Byte*)soap->z_buf + 2) = 0xff; if (deflateInit2(soap->d_stream, soap->z_level, Z_DEFLATED, -MAX_WBITS, 8, Z_DEFAULT_STRATEGY) != Z_OK) return soap->error = SOAP_ZLIB_ERROR; } else #endif if (deflateInit(soap->d_stream, soap->z_level) != Z_OK) return soap->error = SOAP_ZLIB_ERROR; if (soap->z_dict) { if (deflateSetDictionary(soap->d_stream, (const Bytef*)soap->z_dict, soap->z_dict_len) != Z_OK) return soap->error = SOAP_ZLIB_ERROR; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Deflate initialized\n")); soap->zlib_state = SOAP_ZLIB_DEFLATE; } #endif #ifdef WITH_OPENSSL if (soap->ssl) ERR_clear_error(); #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Begin send phase (socket=%d mode=0x%x count=%lu)\n", soap->socket, soap->mode, (unsigned long)soap->count)); soap->part = SOAP_BEGIN; #ifndef WITH_LEANER if (soap->fprepareinitsend && (soap->mode & SOAP_IO) == SOAP_IO_STORE && (soap->error = soap->fprepareinitsend(soap))) return soap->error; #endif return SOAP_OK; } #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_embedded(struct soap *soap, const void *p, int t) { struct soap_plist *pp; if (soap_pointer_lookup(soap, p, t, &pp)) { pp->mark1 = 1; pp->mark2 = 1; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Embedded %p type=%d mark set to 1\n", p, t)); } } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_reference(struct soap *soap, const void *p, int t) { struct soap_plist *pp; if (!p || (!soap->encodingStyle && !(soap->omode & (SOAP_ENC_DIME|SOAP_ENC_MIME|SOAP_ENC_MTOM|SOAP_XML_GRAPH))) || (soap->omode & SOAP_XML_TREE)) return 1; if (soap_pointer_lookup(soap, p, t, &pp)) { if (pp->mark1 == 0) { pp->mark1 = 2; pp->mark2 = 2; } } else if (!soap_pointer_enter(soap, p, NULL, 0, t, &pp)) return 1; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Reference %p type=%d (%d %d)\n", p, t, (int)pp->mark1, (int)pp->mark2)); return pp->mark1; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_array_reference(struct soap *soap, const void *p, const void *a, int n, int t) { struct soap_plist *pp; if (!p || !a || (!soap->encodingStyle && !(soap->omode & (SOAP_ENC_DIME|SOAP_ENC_MIME|SOAP_ENC_MTOM|SOAP_XML_GRAPH))) || (soap->omode & SOAP_XML_TREE)) return 1; if (soap_array_pointer_lookup(soap, p, a, n, t, &pp)) { if (pp->mark1 == 0) { pp->mark1 = 2; pp->mark2 = 2; } } else if (!soap_pointer_enter(soap, p, a, n, t, &pp)) return 1; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Array reference %p ptr=%p n=%lu type=%d (%d %d)\n", p, a, (unsigned long)n, t, (int)pp->mark1, (int)pp->mark2)); return pp->mark1; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_embedded_id(struct soap *soap, int id, const void *p, int t) { struct soap_plist *pp = NULL; if (id >= 0 || (!soap->encodingStyle && !(soap->omode & SOAP_XML_GRAPH)) || (soap->omode & SOAP_XML_TREE)) return id; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Embedded_id %p type=%d id=%d\n", p, t, id)); if (id < -1) return soap_embed(soap, p, NULL, 0, t); if (id < 0) { id = soap_pointer_lookup(soap, p, t, &pp); if (soap->version == 1 && soap->part != SOAP_IN_HEADER) { if (id) { if (soap->mode & SOAP_IO_LENGTH) pp->mark1 = 2; else pp->mark2 = 2; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Embedded_id multiref id=%d %p type=%d = (%d %d)\n", id, p, t, (int)pp->mark1, (int)pp->mark2)); } return -1; } else if (id) { if (soap->mode & SOAP_IO_LENGTH) pp->mark1 = 1; else pp->mark2 = 1; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Embedded_id embedded ref id=%d %p type=%d = (%d %d)\n", id, p, t, (int)pp->mark1, (int)pp->mark2)); } } return id; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_is_embedded(struct soap *soap, struct soap_plist *pp) { if (!pp) return 0; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Is embedded? %d %d\n", (int)pp->mark1, (int)pp->mark2)); if (soap->version == 1 && soap->encodingStyle && !(soap->mode & SOAP_XML_GRAPH) && soap->part != SOAP_IN_HEADER) { if (soap->mode & SOAP_IO_LENGTH) return pp->mark1 != 0; return pp->mark2 != 0; } if (soap->mode & SOAP_IO_LENGTH) return pp->mark1 == 1; return pp->mark2 == 1; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_is_single(struct soap *soap, struct soap_plist *pp) { if (soap->part == SOAP_IN_HEADER) return 1; if (!pp) return 0; if (soap->mode & SOAP_IO_LENGTH) return pp->mark1 == 0; return pp->mark2 == 0; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_set_embedded(struct soap *soap, struct soap_plist *pp) { if (!pp) return; if (soap->mode & SOAP_IO_LENGTH) pp->mark1 = 1; else pp->mark2 = 1; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_attachment(struct soap *soap, const char *tag, int id, const void *p, const void *a, int n, const char *aid, const char *atype, const char *aoptions, const char *type, int t) { struct soap_plist *pp; int i; if (!p || !a || (!aid && !atype)) return soap_element_id(soap, tag, id, p, a, n, type, t, NULL); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Attachment tag='%s' id='%s' (%d) type='%s'\n", tag, aid ? aid : SOAP_STR_EOS, id, atype ? atype : SOAP_STR_EOS)); i = soap_array_pointer_lookup(soap, p, a, n, t, &pp); if (!i) { i = soap_pointer_enter(soap, p, a, n, t, &pp); if (!i) { soap->error = SOAP_EOM; return -1; } } if (id <= 0) id = i; if (!aid) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), strlen(soap->dime_id_format) + 20), soap->dime_id_format, id); aid = soap_strdup(soap, soap->tmpbuf); } /* Add MTOM xop:Include element when necessary */ /* TODO: this code to be obsoleted with new import/xop.h conventions */ if ((soap->mode & SOAP_ENC_MTOM) && strcmp(tag, "xop:Include")) { if (soap_element_begin_out(soap, tag, 0, type) || soap_element_href(soap, "xop:Include", 0, "xmlns:xop=\"http://www.w3.org/2004/08/xop/include\" href", aid) || soap_element_end_out(soap, tag)) return soap->error; } else if (soap_element_href(soap, tag, 0, "href", aid)) return soap->error; if (soap->mode & SOAP_IO_LENGTH) { if (pp->mark1 != 3) { struct soap_multipart *content; if (soap->mode & SOAP_ENC_MTOM) content = soap_new_multipart(soap, &soap->mime.first, &soap->mime.last, (char*)a, n); else content = soap_new_multipart(soap, &soap->dime.first, &soap->dime.last, (char*)a, n); if (!content) { soap->error = SOAP_EOM; return -1; } if (!strncmp(aid, "cid:", 4)) /* RFC 2111 */ { if (soap->mode & SOAP_ENC_MTOM) { size_t l = strlen(aid) - 1; char *s = (char*)soap_malloc(soap, l); if (s) { s[0] = '<'; soap_strncpy(s + 1, l - 1, aid + 4, l - 3); s[l - 2] = '>'; s[l - 1] = '\0'; content->id = s; } } else content->id = aid + 4; } else content->id = aid; content->type = atype; content->options = aoptions; content->encoding = SOAP_MIME_BINARY; pp->mark1 = 3; } } else pp->mark2 = 3; return -1; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_1 static void soap_init_iht(struct soap *soap) { int i; for (i = 0; i < SOAP_IDHASH; i++) soap->iht[i] = NULL; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_1 static void soap_free_iht(struct soap *soap) { int i; struct soap_ilist *ip = NULL, *p = NULL; struct soap_flist *fp = NULL, *fq = NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free ID hashtable\n")); for (i = 0; i < SOAP_IDHASH; i++) { for (ip = soap->iht[i]; ip; ip = p) { for (fp = ip->flist; fp; fp = fq) { fq = fp->next; SOAP_FREE(soap, fp); } p = ip->next; SOAP_FREE(soap, ip); } soap->iht[i] = NULL; } } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 struct soap_ilist * SOAP_FMAC2 soap_lookup(struct soap *soap, const char *id) { struct soap_ilist *ip = NULL; for (ip = soap->iht[soap_hash(id)]; ip; ip = ip->next) if (!strcmp(ip->id, id)) return ip; return NULL; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 struct soap_ilist * SOAP_FMAC2 soap_enter(struct soap *soap, const char *id, int t, size_t n) { size_t h; struct soap_ilist *ip; size_t l = strlen(id); ip = (struct soap_ilist*)SOAP_MALLOC(soap, sizeof(struct soap_ilist) + l); if (ip) { ip->type = t; ip->size = n; ip->ptr = NULL; ip->spine = NULL; ip->link = NULL; ip->copy = NULL; ip->flist = NULL; ip->smart = NULL; ip->shaky = 0; soap_strcpy((char*)ip->id, l + 1, id); h = soap_hash(id); /* h = (HASH(id) % SOAP_IDHASH) so soap->iht[h] is safe */ ip->next = soap->iht[h]; soap->iht[h] = ip; } return ip; } #endif #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void* SOAP_FMAC2 soap_malloc(struct soap *soap, size_t n) { char *p; if (!soap) return SOAP_MALLOC(soap, n); if (soap->fmalloc) p = (char*)soap->fmalloc(soap, n); else { n += sizeof(short); n += (-(long)n) & (sizeof(void*)-1); /* align at 4-, 8- or 16-byte boundary */ if ((p = (char*)SOAP_MALLOC(soap, n + sizeof(void*) + sizeof(size_t))) == NULL) { soap->error = SOAP_EOM; return NULL; } /* set a canary word to detect memory overruns and data corruption */ *(unsigned short*)(p + n - sizeof(unsigned short)) = (unsigned short)SOAP_CANARY; /* keep chain of alloced cells for destruction */ *(void**)(p + n) = soap->alist; *(size_t*)(p + n + sizeof(void*)) = n; soap->alist = p + n; } return p; } #endif /******************************************************************************/ #ifdef SOAP_MEM_DEBUG static void soap_init_mht(struct soap *soap) { int i; for (i = 0; i < (int)SOAP_PTRHASH; i++) soap->mht[i] = NULL; } #endif /******************************************************************************/ #ifdef SOAP_MEM_DEBUG static void soap_free_mht(struct soap *soap) { int i; struct soap_mlist *mp, *mq; for (i = 0; i < (int)SOAP_PTRHASH; i++) { for (mp = soap->mht[i]; mp; mp = mq) { mq = mp->next; if (mp->live) fprintf(stderr, "%s(%d): malloc() = %p not freed (memory leak or forgot to call soap_end()?)\n", mp->file, mp->line, mp->ptr); free(mp); } soap->mht[i] = NULL; } } #endif /******************************************************************************/ #ifdef SOAP_MEM_DEBUG SOAP_FMAC1 void* SOAP_FMAC2 soap_track_malloc(struct soap *soap, const char *file, int line, size_t size) { void *p = malloc(size); if (soap) { size_t h = soap_hash_ptr(p); struct soap_mlist *mp = (struct soap_mlist*)malloc(sizeof(struct soap_mlist)); if (soap->fdebug[SOAP_INDEX_TEST]) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%s(%d): malloc(%lu) = %p\n", file, line, (unsigned long)size, p)); } mp->next = soap->mht[h]; mp->ptr = p; mp->file = file; mp->line = line; mp->live = 1; soap->mht[h] = mp; } return p; } #endif /******************************************************************************/ #ifdef SOAP_MEM_DEBUG SOAP_FMAC1 void SOAP_FMAC2 soap_track_free(struct soap *soap, const char *file, int line, void *p) { if (!soap) free(p); else { size_t h = soap_hash_ptr(p); struct soap_mlist *mp; for (mp = soap->mht[h]; mp; mp = mp->next) if (mp->ptr == p) break; if (mp) { if (mp->live) { if (soap->fdebug[SOAP_INDEX_TEST]) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%s(%d): free(%p)\n", file, line, p)); } free(p); mp->live = 0; } else fprintf(stderr, "%s(%d): free(%p) double free of pointer malloced at %s(%d)\n", file, line, p, mp->file, mp->line); } else fprintf(stderr, "%s(%d): free(%p) pointer not malloced\n", file, line, p); } } #endif /******************************************************************************/ #ifdef SOAP_MEM_DEBUG static void soap_track_unlink(struct soap *soap, const void *p) { size_t h = soap_hash_ptr(p); struct soap_mlist *mp; for (mp = soap->mht[h]; mp; mp = mp->next) if (mp->ptr == p) break; if (mp) mp->live = 0; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_dealloc(struct soap *soap, void *p) { if (soap_check_state(soap)) return; if (p) { char **q; for (q = (char**)(void*)&soap->alist; *q; q = *(char***)q) { if (*(unsigned short*)(char*)(*q - sizeof(unsigned short)) != (unsigned short)SOAP_CANARY) { #ifdef SOAP_MEM_DEBUG fprintf(stderr, "Data corruption in dynamic allocation (see logs)\n"); #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Data corruption:\n")); DBGHEX(TEST, *q - 200, 200); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n")); soap->error = SOAP_MOE; return; } if (p == (void*)(*q - *(size_t*)(*q + sizeof(void*)))) { *q = **(char***)q; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Freed data at %p\n", p)); SOAP_FREE(soap, p); return; } } soap_delete(soap, p); } else { char *q; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free all soap_malloc() data\n")); while (soap->alist) { q = (char*)soap->alist; if (*(unsigned short*)(char*)(q - sizeof(unsigned short)) != (unsigned short)SOAP_CANARY) { #ifdef SOAP_MEM_DEBUG fprintf(stderr, "Data corruption in dynamic allocation (see logs)\n"); #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Data corruption:\n")); DBGHEX(TEST, q - 200, 200); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n")); soap->error = SOAP_MOE; return; } soap->alist = *(void**)q; q -= *(size_t*)(q + sizeof(void*)); SOAP_FREE(soap, q); } /* assume these were deallocated: */ soap->http_content = NULL; soap->action = NULL; soap->fault = NULL; soap->header = NULL; soap->userid = NULL; soap->passwd = NULL; soap->authrealm = NULL; #ifdef WITH_NTLM soap->ntlm_challenge = NULL; #endif #ifndef WITH_LEANER soap_clr_mime(soap); #endif } } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_delete(struct soap *soap, void *p) { struct soap_clist **cp; if (soap_check_state(soap)) return; cp = &soap->clist; if (p) { while (*cp) { if (p == (*cp)->ptr) { struct soap_clist *q = *cp; *cp = q->next; if (q->fdelete(q)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not dealloc data %p: deletion callback failed for object type %d\n", q->ptr, q->type)); #ifdef SOAP_MEM_DEBUG fprintf(stderr, "new(object type = %d) = %p not freed: deletion callback failed\n", q->type, q->ptr); #endif } SOAP_FREE(soap, q); return; } cp = &(*cp)->next; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not dealloc data %p: address not in list\n", p)); } else { while (*cp) { struct soap_clist *q = *cp; *cp = q->next; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Delete %p type=%d (cp=%p)\n", q->ptr, q->type, q)); if (q->fdelete(q)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not dealloc data %p: deletion callback failed for object type %d\n", q->ptr, q->type)); #ifdef SOAP_MEM_DEBUG fprintf(stderr, "new(object type = %d) = %p not freed: deletion callback failed\n", q->type, q->ptr); #endif } SOAP_FREE(soap, q); } } soap->fault = NULL; /* assume this was deallocated */ soap->header = NULL; /* assume this was deallocated */ } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_delegate_deletion(struct soap *soap, struct soap *soap_to) { struct soap_clist *cp; char **q; #ifdef SOAP_MEM_DEBUG void *p; struct soap_mlist **mp, *mq; size_t h; #endif for (q = (char**)(void*)&soap->alist; *q; q = *(char***)q) { if (*(unsigned short*)(char*)(*q - sizeof(unsigned short)) != (unsigned short)SOAP_CANARY) { #ifdef SOAP_MEM_DEBUG fprintf(stderr, "Data corruption in dynamic allocation (see logs)\n"); #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Data corruption:\n")); DBGHEX(TEST, *q - 200, 200); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n")); soap->error = SOAP_MOE; return; } #ifdef SOAP_MEM_DEBUG p = (void*)(*q - *(size_t*)(*q + sizeof(void*))); h = soap_hash_ptr(p); for (mp = &soap->mht[h]; *mp; mp = &(*mp)->next) { if ((*mp)->ptr == p) { mq = *mp; *mp = mq->next; mq->next = soap_to->mht[h]; soap_to->mht[h] = mq; break; } } #endif } *q = (char*)soap_to->alist; soap_to->alist = soap->alist; soap->alist = NULL; #ifdef SOAP_MEM_DEBUG cp = soap->clist; while (cp) { h = soap_hash_ptr(cp); for (mp = &soap->mht[h]; *mp; mp = &(*mp)->next) { if ((*mp)->ptr == cp) { mq = *mp; *mp = mq->next; mq->next = soap_to->mht[h]; soap_to->mht[h] = mq; break; } } cp = cp->next; } #endif cp = soap_to->clist; if (cp) { while (cp->next) cp = cp->next; cp->next = soap->clist; } else soap_to->clist = soap->clist; soap->clist = NULL; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 struct soap_clist * SOAP_FMAC2 soap_link(struct soap *soap, void *p, int t, int n, int (*fdelete)(struct soap_clist*)) { struct soap_clist *cp = NULL; if (soap && p && n != SOAP_NO_LINK_TO_DELETE) { if (!(cp = (struct soap_clist*)SOAP_MALLOC(soap, sizeof(struct soap_clist)))) soap->error = SOAP_EOM; else { cp->next = soap->clist; cp->type = soap->alloced = t; cp->size = n; cp->ptr = p; cp->fdelete = fdelete; soap->clist = cp; } } return cp; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_unlink(struct soap *soap, const void *p) { char **q; struct soap_clist **cp; if (soap && p) { for (q = (char**)(void*)&soap->alist; *q; q = *(char***)q) { if (p == (void*)(*q - *(size_t*)(*q + sizeof(void*)))) { *q = **(char***)q; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unlinked data %p\n", p)); #ifdef SOAP_MEM_DEBUG soap_track_unlink(soap, p); #endif return SOAP_OK; /* found and removed from dealloc chain */ } } for (cp = &soap->clist; *cp; cp = &(*cp)->next) { if (p == (*cp)->ptr) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unlinked class instance %p\n", p)); q = (char**)*cp; *cp = (*cp)->next; SOAP_FREE(soap, q); return SOAP_OK; /* found and removed from dealloc chain */ } } } return SOAP_ERR; } #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_lookup_type(struct soap *soap, const char *id) { struct soap_ilist *ip; if (id && *id) { ip = soap_lookup(soap, id); if (ip) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Lookup id='%s' type=%d\n", id, ip->type)); return ip->type; } } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "lookup type id='%s' NOT FOUND! Need to get it from xsi:type\n", id)); return 0; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_1 SOAP_FMAC1 short SOAP_FMAC2 soap_begin_shaky(struct soap *soap) { short f = soap->shaky; soap->shaky = 1; return f; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_end_shaky(struct soap *soap, short f) { soap->shaky = f; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF static int soap_is_shaky(struct soap *soap, void *p) { (void)p; if (!soap->blist && !soap->shaky) return 0; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Shaky %p\n", p)); return 1; } #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 void* SOAP_FMAC2 soap_id_lookup(struct soap *soap, const char *id, void **p, int t, size_t n, unsigned int k, int (*fbase)(int, int)) { struct soap_ilist *ip; if (!p || !id || !*id) return p; ip = soap_lookup(soap, id); /* lookup pointer to hash table entry for string id */ if (!ip) { if (!(ip = soap_enter(soap, id, t, n))) /* new hash table entry for string id */ return NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forwarding first href='%s' type=%d location=%p (%u bytes) level=%u\n", id, t, p, (unsigned int)n, k)); *p = NULL; if (k) { int i; if (k > SOAP_MAXPTRS) return NULL; if (!(ip->spine = (void**)soap_malloc(soap, SOAP_MAXPTRS * sizeof(void*)))) return NULL; ip->spine[0] = NULL; for (i = 1; i < SOAP_MAXPTRS; i++) ip->spine[i] = &ip->spine[i - 1]; *p = &ip->spine[k - 1]; } else { ip->link = p; ip->shaky = soap_is_shaky(soap, (void*)p); } } else if ((ip->type != t || ip->size != n) && (!fbase || !fbase(ip->type, t)) && (!fbase || !fbase(t, ip->type) || soap_type_punned(soap, ip))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Lookup type incompatibility: ref='%s' id-type=%d ref-type=%d\n", id, ip->type, t)); soap_id_nullify(soap, id); return NULL; } else if (k == 0 && ip->ptr && !ip->shaky) /* when block lists are in use, ip->ptr will change */ { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolved href='%s' type=%d location=%p (%u bytes) level=%u\n", id, t, ip->ptr, (unsigned int)n, k)); *p = ip->ptr; } else { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forwarded href='%s' type=%d location=%p (%u bytes) level=%u\n", id, t, p, (unsigned int)n, k)); if (fbase && fbase(t, ip->type) && !soap_type_punned(soap, ip)) { ip->type = t; ip->size = n; } *p = NULL; if (k) { if (!ip->spine) { int i; if (k > SOAP_MAXPTRS) return NULL; if (!(ip->spine = (void**)soap_malloc(soap, SOAP_MAXPTRS * sizeof(void*)))) return NULL; ip->spine[0] = NULL; for (i = 1; i < SOAP_MAXPTRS; i++) ip->spine[i] = &ip->spine[i - 1]; } *p = &ip->spine[k - 1]; if (ip->ptr && !ip->shaky) ip->spine[0] = ip->ptr; } else { void *q = ip->link; ip->link = p; ip->shaky = soap_is_shaky(soap, (void*)p); *p = q; } } return p; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 void* SOAP_FMAC2 soap_id_forward(struct soap *soap, const char *href, void *p, size_t i, int t, int tt, size_t n, unsigned int k, void (*finsert)(struct soap*, int, int, void*, size_t, const void*, void**), int (*fbase)(int, int)) { struct soap_ilist *ip; if (!p || !href || !*href) return p; ip = soap_lookup(soap, href); /* lookup pointer to hash table entry for string id */ if (!ip) { if (!(ip = soap_enter(soap, href, t, n))) /* new hash table entry for string id */ return NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "New entry href='%s' type=%d size=%lu level=%d location=%p\n", href, t, (unsigned long)n, k, p)); } else if ((ip->type != t || ip->size != n) && k == 0) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forward type incompatibility id='%s' expect type=%d size=%lu level=%u got type=%d size=%lu\n", href, ip->type, (unsigned long)ip->size, k, t, (unsigned long)n)); soap_id_nullify(soap, href); return NULL; } if (finsert || n < sizeof(void*)) { struct soap_flist *fp = (struct soap_flist*)SOAP_MALLOC(soap, sizeof(struct soap_flist)); if (!fp) { soap->error = SOAP_EOM; return NULL; } if (fbase && fbase(t, ip->type) && !soap_type_punned(soap, ip)) { ip->type = t; ip->size = n; } if ((ip->type != t || ip->size != n) && (!fbase || !fbase(ip->type, t))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forward type incompatibility id='%s' expect type=%d size=%lu level=%u got type=%d size=%lu\n", href, ip->type, (unsigned long)ip->size, k, t, (unsigned long)n)); soap_id_nullify(soap, href); return NULL; } fp->next = ip->flist; fp->type = tt; fp->ptr = p; fp->level = k; fp->index = i; fp->finsert = finsert; ip->flist = fp; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forwarding type=%d (target type=%d) size=%lu location=%p level=%u index=%lu href='%s'\n", t, tt, (unsigned long)n, p, k, (unsigned long)i, href)); } else { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forwarding copying address %p for type=%d href='%s'\n", p, t, href)); *(void**)p = ip->copy; ip->copy = p; } ip->shaky = soap_is_shaky(soap, p); return p; } #endif #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void* SOAP_FMAC2 soap_id_enter(struct soap *soap, const char *id, void *p, int t, size_t n, const char *type, const char *arrayType, void *(*finstantiate)(struct soap*, int, const char*, const char*, size_t*), int (*fbase)(int, int)) { #ifndef WITH_NOIDREF struct soap_ilist *ip; #endif (void)id; (void)fbase; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Enter id='%s' type=%d location=%p size=%lu\n", id, t, p, (unsigned long)n)); soap->alloced = 0; if (!p) { if (finstantiate) p = finstantiate(soap, t, type, arrayType, &n); /* alloced set in soap_link() */ else { p = soap_malloc(soap, n); soap->alloced = t; } } #ifndef WITH_NOIDREF if (!id || !*id) #endif return p; #ifndef WITH_NOIDREF ip = soap_lookup(soap, id); /* lookup pointer to hash table entry for string id */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Lookup entry id='%s' for location=%p\n", id, p)); if (!ip) { if (!(ip = soap_enter(soap, id, t, n))) /* new hash table entry for string id */ return NULL; ip->ptr = p; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "New entry id='%s' type=%d size=%lu location=%p\n", id, t, (unsigned long)n, p)); if (!soap->alloced) ip->shaky = soap_is_shaky(soap, p); } else if (ip->ptr) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Multiply defined id='%s'\n", id)); soap_strcpy(soap->id, sizeof(soap->id), id); soap->error = SOAP_DUPLICATE_ID; return NULL; } else if ((ip->type != t || ip->size != n) && (!fbase || !fbase(t, ip->type) || soap_type_punned(soap, ip))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Enter type incompatibility id='%s' expect type=%d size=%lu got type=%d size=%lu\n", id, ip->type, (unsigned long)ip->size, t, (unsigned long)n)); soap_id_nullify(soap, id); return NULL; } else { ip->type = t; ip->size = n; ip->ptr = p; if (!soap->alloced) ip->shaky = soap_is_shaky(soap, p); if (soap->alloced || !ip->shaky) { void **q; /* ptr will not change later, so resolve links now */ if (ip->spine) ip->spine[0] = p; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Traversing link chain to resolve id='%s' type=%d\n", ip->id, ip->type)); q = (void**)ip->link; while (q) { void *r = *q; *q = p; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "... link %p -> %p\n", q, p)); q = (void**)r; } ip->link = NULL; } } return ip->ptr; #endif } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void** SOAP_FMAC2 soap_id_smart(struct soap *soap, const char *id, int t, size_t n) { (void)soap; (void)id; (void)t; (void)n; #ifndef WITH_NOIDREF if (id && *id) { struct soap_ilist *ip = soap_lookup(soap, id); /* lookup pointer to hash table entry for string id */ if (!ip) { if (!(ip = soap_enter(soap, id, t, n))) /* new hash table entry for string id */ return NULL; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "New smart shared pointer entry id='%s' type=%d size=%lu smart=%p\n", id, t, (unsigned long)n, ip->smart)); return &ip->smart; } #endif return NULL; } #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 static int soap_type_punned(struct soap *soap, const struct soap_ilist *ip) { const struct soap_flist *fp; (void)soap; if (ip->ptr || ip->copy) return 1; for (fp = ip->flist; fp; fp = fp->next) if (fp->level == 0) return 1; return 0; } #endif #endif /******************************************************************************/ #ifndef WITH_NOIDREF #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_id_nullify(struct soap *soap, const char *id) { int i; for (i = 0; i < SOAP_IDHASH; i++) { struct soap_ilist *ip; for (ip = soap->iht[i]; ip; ip = ip->next) { void *p, *q; for (p = ip->link; p; p = q) { q = *(void**)p; *(void**)p = NULL; } ip->link = NULL; } } soap_strcpy(soap->id, sizeof(soap->id), id); return soap->error = SOAP_HREF; } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_end_send(struct soap *soap) { #ifndef WITH_LEANER int err; if (soap->dime.list) { /* SOAP body referenced attachments must appear first */ soap->dime.last->next = soap->dime.first; soap->dime.first = soap->dime.list->next; soap->dime.list->next = NULL; soap->dime.last = soap->dime.list; } if (!(err = soap_putdime(soap))) err = soap_putmime(soap); soap->mime.list = NULL; soap->mime.first = NULL; soap->mime.last = NULL; soap->dime.list = NULL; soap->dime.first = NULL; soap->dime.last = NULL; if (err) return err; #endif return soap_end_send_flush(soap); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_end_send_flush(struct soap *soap) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End send mode=0x%x\n", soap->mode)); if (soap->mode & SOAP_IO) /* need to flush the remaining data in buffer */ { if (soap_flush(soap)) #ifdef WITH_ZLIB { if (soap->mode & SOAP_ENC_ZLIB && soap->zlib_state == SOAP_ZLIB_DEFLATE) { soap->zlib_state = SOAP_ZLIB_NONE; deflateEnd(soap->d_stream); } return soap->error; } #else return soap->error; #endif #ifdef WITH_ZLIB if ((soap->mode & SOAP_ENC_ZLIB) && soap->d_stream) { int r; soap->d_stream->avail_in = 0; do { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Deflating remainder\n")); r = deflate(soap->d_stream, Z_FINISH); if (soap->d_stream->avail_out != sizeof(soap->buf)) { if (soap_flush_raw(soap, soap->z_buf, sizeof(soap->buf) - soap->d_stream->avail_out)) { soap->zlib_state = SOAP_ZLIB_NONE; deflateEnd(soap->d_stream); return soap->error; } soap->d_stream->next_out = (Byte*)soap->z_buf; soap->d_stream->avail_out = sizeof(soap->buf); } } while (r == Z_OK); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Deflated total %lu->%lu bytes\n", soap->d_stream->total_in, soap->d_stream->total_out)); soap->z_ratio_out = (float)soap->d_stream->total_out / (float)soap->d_stream->total_in; soap->mode &= ~SOAP_ENC_ZLIB; soap->zlib_state = SOAP_ZLIB_NONE; if (deflateEnd(soap->d_stream) != Z_OK || r != Z_STREAM_END) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unable to end deflate: %s\n", soap->d_stream->msg ? soap->d_stream->msg : SOAP_STR_EOS)); return soap->error = SOAP_ZLIB_ERROR; } #ifdef WITH_GZIP if (soap->zlib_out != SOAP_ZLIB_DEFLATE) { soap->z_buf[0] = soap->z_crc & 0xFF; soap->z_buf[1] = (soap->z_crc >> 8) & 0xFF; soap->z_buf[2] = (soap->z_crc >> 16) & 0xFF; soap->z_buf[3] = (soap->z_crc >> 24) & 0xFF; soap->z_buf[4] = soap->d_stream->total_in & 0xFF; soap->z_buf[5] = (soap->d_stream->total_in >> 8) & 0xFF; soap->z_buf[6] = (soap->d_stream->total_in >> 16) & 0xFF; soap->z_buf[7] = (soap->d_stream->total_in >> 24) & 0xFF; if (soap_flush_raw(soap, soap->z_buf, 8)) return soap->error; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "gzip crc32=%lu\n", (unsigned long)soap->z_crc)); } #endif } #endif if ((soap->mode & SOAP_IO) == SOAP_IO_STORE) { #if !defined(__cplusplus) || defined(WITH_COMPAT) if (soap->os) { char *b = (char*)soap_push_block(soap, NULL, 1); if (b) *soap->os = soap_save_block(soap, NULL, NULL, 0); } else #endif { char *p; #ifndef WITH_NOHTTP if (!(soap->mode & SOAP_ENC_XML)) { soap->mode--; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Sending buffered message of length %u\n", (unsigned int)soap->blist->size)); if (soap->status >= SOAP_POST) soap->error = soap->fpost(soap, soap->endpoint, soap->host, soap->port, soap->path, soap->action, soap->blist->size); else if (soap->status != SOAP_STOP) soap->error = soap->fresponse(soap, soap->status, soap->blist->size); if (soap->error || soap_flush(soap)) return soap->error; soap->mode++; } #endif for (p = soap_first_block(soap, NULL); p; p = soap_next_block(soap, NULL)) { DBGMSG(SENT, p, soap_block_size(soap, NULL)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Send %u bytes to socket=%d/fd=%d\n", (unsigned int)soap_block_size(soap, NULL), soap->socket, soap->sendfd)); if ((soap->error = soap->fsend(soap, p, soap_block_size(soap, NULL)))) { soap_end_block(soap, NULL); return soap->error; } } soap_end_block(soap, NULL); } #ifndef WITH_LEANER if (soap->fpreparefinalsend && (soap->error = soap->fpreparefinalsend(soap))) return soap->error; #endif } #ifndef WITH_LEANER else if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK) { DBGMSG(SENT, "\r\n0\r\n\r\n", 7); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Send 7 bytes to socket=%d/fd=%d\n", soap->socket, soap->sendfd)); if ((soap->error = soap->fsend(soap, "\r\n0\r\n\r\n", 7))) return soap->error; } #endif } #ifdef WITH_TCPFIN #if defined(WITH_OPENSSL) || defined(WITH_SYSTEMSSL) if (!soap->ssl) #endif if (soap_valid_socket(soap->socket) && !soap->keep_alive && !(soap->omode & SOAP_IO_UDP)) soap->fshutdownsocket(soap, soap->socket, SOAP_SHUT_WR); /* Send TCP FIN */ #endif #if defined(__cplusplus) && !defined(WITH_COMPAT) if (soap->os) soap->os->flush(); #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of send phase\n")); soap->omode &= ~SOAP_SEC_WSUID; soap->count = 0; soap->part = SOAP_END; return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_end_recv(struct soap *soap) { soap->part = SOAP_END; #ifndef WITH_LEAN soap->wsuid = NULL; /* reset before next send */ soap->c14nexclude = NULL; /* reset before next send */ soap->c14ninclude = NULL; /* reset before next send */ #endif #ifndef WITH_LEANER soap->ffilterrecv = NULL; if ((soap->mode & SOAP_ENC_DIME) && soap_getdime(soap)) { soap->dime.first = NULL; soap->dime.last = NULL; return soap->error; } soap->dime.list = soap->dime.first; soap->dime.first = NULL; soap->dime.last = NULL; /* Check if MIME attachments and mime-post-check flag is set, if so call soap_resolve() and return */ if (soap->mode & SOAP_ENC_MIME) { if (soap->mode & SOAP_MIME_POSTCHECK) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Post checking MIME attachments\n")); if (!soap->keep_alive) soap->keep_alive = -1; #ifndef WITH_NOIDREF soap_resolve(soap); #endif return SOAP_OK; } if (soap_getmime(soap)) return soap->error; } soap->mime.list = soap->mime.first; soap->mime.first = NULL; soap->mime.last = NULL; soap->mime.boundary = NULL; if (soap->xlist) { struct soap_multipart *content; for (content = soap->mime.list; content; content = content->next) soap_resolve_attachment(soap, content); } #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of receive message ok\n")); #ifdef WITH_ZLIB if ((soap->mode & SOAP_ENC_ZLIB) && soap->d_stream) { /* Make sure end of compressed content is reached */ while (soap->d_stream->next_out != Z_NULL) if ((int)soap_get1(soap) == EOF) break; soap->mode &= ~SOAP_ENC_ZLIB; soap_memcpy((void*)soap->buf, sizeof(soap->buf), (const void*)soap->z_buf, sizeof(soap->buf)); soap->bufidx = (char*)soap->d_stream->next_in - soap->z_buf; soap->buflen = soap->z_buflen; soap->zlib_state = SOAP_ZLIB_NONE; if (inflateEnd(soap->d_stream) != Z_OK) return soap->error = SOAP_ZLIB_ERROR; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflate end ok\n")); #ifdef WITH_GZIP if (soap->zlib_in == SOAP_ZLIB_GZIP) { soap_wchar c; short i; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflate gzip crc check\n")); for (i = 0; i < 8; i++) { if ((int)(c = soap_get1(soap)) == EOF) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Gzip error: unable to read crc value\n")); return soap->error = SOAP_ZLIB_ERROR; } soap->z_buf[i] = (char)c; } if (soap->z_crc != ((uLong)(unsigned char)soap->z_buf[0] | ((uLong)(unsigned char)soap->z_buf[1] << 8) | ((uLong)(unsigned char)soap->z_buf[2] << 16) | ((uLong)(unsigned char)soap->z_buf[3] << 24))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Gzip inflate error: crc check failed, message corrupted? (crc32=%lu)\n", (unsigned long)soap->z_crc)); return soap->error = SOAP_ZLIB_ERROR; } if (soap->d_stream->total_out != ((uLong)(unsigned char)soap->z_buf[4] | ((uLong)(unsigned char)soap->z_buf[5] << 8) | ((uLong)(unsigned char)soap->z_buf[6] << 16) | ((uLong)(unsigned char)soap->z_buf[7] << 24))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Gzip inflate error: incorrect message length\n")); return soap->error = SOAP_ZLIB_ERROR; } } soap->zlib_in = SOAP_ZLIB_NONE; #endif } #endif if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK) while (soap->ahead != EOF && !soap_recv_raw(soap)) continue; #ifndef WITH_NOIDREF if (soap_resolve(soap)) return soap->error; #endif #ifndef WITH_LEANER if (soap->xlist) { if (soap->mode & SOAP_ENC_MTOM) return soap->error = SOAP_MIME_HREF; return soap->error = SOAP_DIME_HREF; } #endif soap_free_ns(soap); #ifndef WITH_LEANER if (soap->fpreparefinalrecv) return soap->error = soap->fpreparefinalrecv(soap); #endif return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_free_temp(struct soap *soap) { struct soap_attribute *tp, *tq; struct Namespace *ns; soap_free_ns(soap); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free any remaining temp blocks\n")); while (soap->blist) soap_end_block(soap, NULL); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free attribute storage\n")); for (tp = soap->attributes; tp; tp = tq) { tq = tp->next; if (tp->value) SOAP_FREE(soap, tp->value); SOAP_FREE(soap, tp); } soap->attributes = NULL; #ifdef WITH_FAST if (soap->labbuf) SOAP_FREE(soap, soap->labbuf); soap->labbuf = NULL; soap->lablen = 0; soap->labidx = 0; #endif ns = soap->local_namespaces; if (ns) { for (; ns->id; ns++) { if (ns->out) { SOAP_FREE(soap, ns->out); ns->out = NULL; } } SOAP_FREE(soap, soap->local_namespaces); soap->local_namespaces = NULL; } #ifndef WITH_LEANER while (soap->xlist) { struct soap_xlist *xp = soap->xlist->next; SOAP_FREE(soap, soap->xlist); soap->xlist = xp; } #endif #ifndef WITH_NOIDREF soap_free_iht(soap); #endif soap_free_pht(soap); } #endif /******************************************************************************/ #ifndef PALM_1 static void soap_free_ns(struct soap *soap) { struct soap_nlist *np, *nq; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free namespace stack\n")); for (np = soap->nlist; np; np = nq) { nq = np->next; SOAP_FREE(soap, np); } soap->nlist = NULL; } #endif /******************************************************************************/ #ifndef PALM_1 #if !defined(WITH_LEAN) || defined(SOAP_DEBUG) static void soap_init_logs(struct soap *soap) { int i; for (i = 0; i < SOAP_MAXLOGS; i++) { soap->logfile[i] = NULL; soap->fdebug[i] = NULL; } } #endif #endif /******************************************************************************/ #if !defined(WITH_LEAN) || defined(SOAP_DEBUG) SOAP_FMAC1 void SOAP_FMAC2 soap_open_logfile(struct soap *soap, int i) { if (soap->logfile[i]) soap->fdebug[i] = fopen(soap->logfile[i], i < 2 ? "ab" : "a"); } #endif /******************************************************************************/ #ifdef SOAP_DEBUG static void soap_close_logfile(struct soap *soap, int i) { if (soap->fdebug[i]) { fclose(soap->fdebug[i]); soap->fdebug[i] = NULL; } } #endif /******************************************************************************/ #ifdef SOAP_DEBUG SOAP_FMAC1 void SOAP_FMAC2 soap_close_logfiles(struct soap *soap) { int i; for (i = 0; i < SOAP_MAXLOGS; i++) soap_close_logfile(soap, i); } #endif /******************************************************************************/ #ifdef SOAP_DEBUG static void soap_set_logfile(struct soap *soap, int i, const char *logfile) { const char *s; char *t = NULL; soap_close_logfile(soap, i); s = soap->logfile[i]; soap->logfile[i] = logfile; if (s) SOAP_FREE(soap, s); if (logfile) { size_t l = strlen(logfile) + 1; if ((t = (char*)SOAP_MALLOC(soap, l))) soap_memcpy((void*)t, l, (const void*)logfile, l); } soap->logfile[i] = t; } #endif /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_set_recv_logfile(struct soap *soap, const char *logfile) { (void)soap; (void)logfile; #ifdef SOAP_DEBUG soap_set_logfile(soap, SOAP_INDEX_RECV, logfile); #endif } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_set_sent_logfile(struct soap *soap, const char *logfile) { (void)soap; (void)logfile; #ifdef SOAP_DEBUG soap_set_logfile(soap, SOAP_INDEX_SENT, logfile); #endif } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_set_test_logfile(struct soap *soap, const char *logfile) { (void)soap; (void)logfile; #ifdef SOAP_DEBUG soap_set_logfile(soap, SOAP_INDEX_TEST, logfile); #endif } /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 struct soap* SOAP_FMAC2 soap_copy(const struct soap *soap) { struct soap *copy = soap_versioning(soap_new)(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT); if (soap_copy_context(copy, soap) != NULL) return copy; soap_free(copy); return NULL; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 struct soap* SOAP_FMAC2 soap_copy_context(struct soap *copy, const struct soap *soap) { if (copy == soap) return copy; if (soap_check_state(soap)) return NULL; if (copy) { struct soap_plugin *p = NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copying context\n")); soap_memcpy((void*)copy, sizeof(struct soap), (const void*)soap, sizeof(struct soap)); copy->state = SOAP_COPY; copy->error = SOAP_OK; copy->userid = NULL; copy->passwd = NULL; #ifdef WITH_NTLM copy->ntlm_challenge = NULL; #endif copy->nlist = NULL; copy->blist = NULL; copy->clist = NULL; copy->alist = NULL; copy->attributes = NULL; copy->labbuf = NULL; copy->lablen = 0; copy->labidx = 0; #ifdef SOAP_MEM_DEBUG soap_init_mht(copy); #endif #if !defined(WITH_LEAN) || defined(SOAP_DEBUG) soap_init_logs(copy); #endif #ifdef SOAP_DEBUG soap_set_test_logfile(copy, soap->logfile[SOAP_INDEX_TEST]); soap_set_sent_logfile(copy, soap->logfile[SOAP_INDEX_SENT]); soap_set_recv_logfile(copy, soap->logfile[SOAP_INDEX_RECV]); #endif copy->namespaces = soap->local_namespaces; copy->local_namespaces = NULL; soap_set_local_namespaces(copy); /* copy content of soap->local_namespaces */ copy->namespaces = soap->namespaces; /* point to shared read-only namespaces table */ copy->c_locale = NULL; #ifdef WITH_OPENSSL copy->bio = NULL; copy->ssl = NULL; copy->session = NULL; #endif #ifdef WITH_GNUTLS copy->session = NULL; #endif #ifdef WITH_ZLIB copy->d_stream = NULL; copy->z_buf = NULL; #endif #ifndef WITH_NOIDREF soap_init_iht(copy); #endif soap_init_pht(copy); copy->header = NULL; copy->fault = NULL; copy->action = NULL; #ifndef WITH_LEAN #ifdef WITH_COOKIES copy->cookies = soap_copy_cookies(copy, soap); #else copy->cookies = NULL; #endif #endif copy->plugins = NULL; for (p = soap->plugins; p; p = p->next) { struct soap_plugin *q = (struct soap_plugin*)SOAP_MALLOC(copy, sizeof(struct soap_plugin)); if (!q) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not allocate plugin '%s'\n", p->id)); soap_end(copy); soap_done(copy); return NULL; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copying plugin '%s'\n", p->id)); *q = *p; if (p->fcopy && (copy->error = p->fcopy(copy, q, p))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not copy plugin '%s' error = %d\n", p->id, copy->error)); SOAP_FREE(copy, q); soap_end(copy); soap_done(copy); return NULL; } q->next = copy->plugins; copy->plugins = q; } } return copy; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_copy_stream(struct soap *copy, struct soap *soap) { struct soap_attribute *tp = NULL, *tq; if (copy == soap) return; copy->header = soap->header; copy->mode = soap->mode; copy->imode = soap->imode; copy->omode = soap->omode; copy->master = soap->master; copy->socket = soap->socket; copy->sendsk = soap->sendsk; copy->recvsk = soap->recvsk; copy->recv_timeout = soap->recv_timeout; copy->send_timeout = soap->send_timeout; copy->os = soap->os; copy->is = soap->is; copy->sendfd = soap->sendfd; copy->recvfd = soap->recvfd; copy->bufidx = soap->bufidx; copy->buflen = soap->buflen; copy->ahead = soap->ahead; copy->cdata = soap->cdata; copy->chunksize = soap->chunksize; copy->chunkbuflen = soap->chunkbuflen; copy->keep_alive = soap->keep_alive; copy->tcp_keep_alive = soap->tcp_keep_alive; copy->tcp_keep_idle = soap->tcp_keep_idle; copy->tcp_keep_intvl = soap->tcp_keep_intvl; copy->tcp_keep_cnt = soap->tcp_keep_cnt; copy->max_keep_alive = soap->max_keep_alive; #ifndef WITH_NOIO copy->peer = soap->peer; copy->peerlen = soap->peerlen; copy->ip = soap->ip; copy->port = soap->port; soap_memcpy((void*)copy->host, sizeof(copy->host), (const void*)soap->host, sizeof(soap->host)); soap_memcpy((void*)copy->endpoint, sizeof(copy->endpoint), (const void*)soap->endpoint, sizeof(soap->endpoint)); #endif #ifdef WITH_OPENSSL copy->bio = soap->bio; copy->ctx = soap->ctx; copy->ssl = soap->ssl; #endif #ifdef WITH_GNUTLS copy->session = soap->session; #endif #ifdef WITH_SYSTEMSSL copy->ctx = soap->ctx; copy->ssl = soap->ssl; #endif #ifdef WITH_ZLIB copy->zlib_state = soap->zlib_state; copy->zlib_in = soap->zlib_in; copy->zlib_out = soap->zlib_out; if (soap->d_stream && soap->zlib_state != SOAP_ZLIB_NONE) { if (!copy->d_stream) copy->d_stream = (z_stream*)SOAP_MALLOC(copy, sizeof(z_stream)); if (copy->d_stream) soap_memcpy((void*)copy->d_stream, sizeof(z_stream), (const void*)soap->d_stream, sizeof(z_stream)); } copy->z_crc = soap->z_crc; copy->z_ratio_in = soap->z_ratio_in; copy->z_ratio_out = soap->z_ratio_out; copy->z_buf = NULL; copy->z_buflen = soap->z_buflen; copy->z_level = soap->z_level; if (soap->z_buf && soap->zlib_state != SOAP_ZLIB_NONE) { copy->z_buf = (char*)SOAP_MALLOC(copy, sizeof(soap->buf)); if (copy->z_buf) soap_memcpy((void*)copy->z_buf, sizeof(soap->buf), (const void*)soap->z_buf, sizeof(soap->buf)); } copy->z_dict = soap->z_dict; copy->z_dict_len = soap->z_dict_len; #endif soap_memcpy((void*)copy->buf, sizeof(copy->buf), (const void*)soap->buf, sizeof(soap->buf)); /* copy XML parser state */ soap_free_ns(copy); soap_set_local_namespaces(copy); copy->version = soap->version; if (soap->nlist && soap->local_namespaces) { struct soap_nlist *np = NULL, *nq; /* copy reversed nlist */ for (nq = soap->nlist; nq; nq = nq->next) { struct soap_nlist *nr = np; size_t n = sizeof(struct soap_nlist) + strlen(nq->id); np = (struct soap_nlist*)SOAP_MALLOC(copy, n); if (!np) break; soap_memcpy((void*)np, n, (const void*)nq, n); np->next = nr; } while (np) { const char *s = np->ns; copy->level = np->level; /* preserve element nesting level */ if (!s && np->index >= 0) { s = soap->local_namespaces[np->index].out; if (!s) s = soap->local_namespaces[np->index].ns; } if (s && soap_push_namespace(copy, np->id, s) == NULL) break; nq = np; np = np->next; SOAP_FREE(copy, nq); } } soap_memcpy((void*)copy->tag, sizeof(copy->tag), (const void*)soap->tag, sizeof(soap->tag)); soap_memcpy((void*)copy->id, sizeof(copy->id), (const void*)soap->id, sizeof(soap->id)); soap_memcpy((void*)copy->href, sizeof(copy->href), (const void*)soap->href, sizeof(soap->href)); soap_memcpy((void*)copy->type, sizeof(copy->type), (const void*)soap->type, sizeof(soap->type)); copy->other = soap->other; copy->root = soap->root; copy->null = soap->null; copy->body = soap->body; copy->part = soap->part; copy->mustUnderstand = soap->mustUnderstand; copy->level = soap->level; copy->peeked = soap->peeked; /* copy attributes */ for (tq = soap->attributes; tq; tq = tq->next) { struct soap_attribute *tr = tp; size_t n = sizeof(struct soap_attribute) + strlen(tq->name); tp = (struct soap_attribute*)SOAP_MALLOC(copy, n); soap_memcpy((void*)tp, n, (const void*)tq, n); if (tp->size) { tp->value = (char*)SOAP_MALLOC(copy, tp->size); if (tp->value) soap_memcpy((void*)tp->value, tp->size, (const void*)tq->value, tp->size); } tp->ns = NULL; tp->next = tr; } copy->attributes = tp; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_free_stream(struct soap *soap) { soap->socket = SOAP_INVALID_SOCKET; soap->sendsk = SOAP_INVALID_SOCKET; soap->recvsk = SOAP_INVALID_SOCKET; #ifdef WITH_OPENSSL soap->bio = NULL; soap->ctx = NULL; soap->ssl = NULL; #endif #ifdef WITH_GNUTLS soap->xcred = NULL; soap->acred = NULL; soap->cache = NULL; soap->session = NULL; soap->dh_params = NULL; soap->rsa_params = NULL; #endif #ifdef WITH_SYSTEMSSL soap->ctx = (gsk_handle)NULL; soap->ssl = (gsk_handle)NULL; #endif #ifdef WITH_ZLIB if (soap->z_buf) SOAP_FREE(soap, soap->z_buf); soap->z_buf = NULL; #endif } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_initialize(struct soap *soap) { soap_versioning(soap_init)(soap, SOAP_IO_DEFAULT, SOAP_IO_DEFAULT); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_versioning(soap_init)(struct soap *soap, soap_mode imode, soap_mode omode) { size_t i; soap->state = SOAP_INIT; #ifdef SOAP_MEM_DEBUG soap_init_mht(soap); #endif #if !defined(WITH_LEAN) || defined(SOAP_DEBUG) soap_init_logs(soap); #endif #ifdef SOAP_DEBUG #ifdef TANDEM_NONSTOP soap_set_test_logfile(soap, "TESTLOG"); soap_set_sent_logfile(soap, "SENTLOG"); soap_set_recv_logfile(soap, "RECVLOG"); #else soap_set_test_logfile(soap, "TEST.log"); soap_set_sent_logfile(soap, "SENT.log"); soap_set_recv_logfile(soap, "RECV.log"); #endif #endif soap->version = 0; soap_mode(soap, imode); soap_imode(soap, imode); soap_omode(soap, omode); soap->plugins = NULL; soap->user = NULL; for (i = 0; i < sizeof(soap->data)/sizeof(*soap->data); i++) soap->data[i] = NULL; soap->userid = NULL; soap->passwd = NULL; soap->authrealm = NULL; #ifdef WITH_NTLM soap->ntlm_challenge = NULL; #endif #ifndef WITH_NOHTTP soap->fpost = http_post; soap->fget = http_get; soap->fput = http_405; soap->fdel = http_405; soap->fopt = http_200; soap->fhead = http_200; soap->fform = NULL; soap->fposthdr = http_post_header; soap->fresponse = http_response; soap->fparse = http_parse; soap->fparsehdr = http_parse_header; #endif soap->fheader = NULL; soap->fconnect = NULL; soap->fdisconnect = NULL; #ifndef WITH_NOIO soap->ipv6_multicast_if = 0; /* in_addr_t value */ soap->ipv4_multicast_if = NULL; /* points to struct in_addr or in_addr_t */ soap->ipv4_multicast_ttl = 0; /* 0: use default */ #ifndef WITH_IPV6 soap->fresolve = tcp_gethost; #else soap->fresolve = NULL; #endif soap->faccept = tcp_accept; soap->fopen = tcp_connect; soap->fclose = tcp_disconnect; soap->fclosesocket = tcp_closesocket; soap->fshutdownsocket = tcp_shutdownsocket; soap->fsend = fsend; soap->frecv = frecv; soap->fpoll = soap_poll; #else soap->fopen = NULL; soap->fclose = NULL; soap->fpoll = NULL; #endif soap->fseterror = NULL; soap->fignore = NULL; soap->fserveloop = NULL; soap->fplugin = fplugin; soap->fmalloc = NULL; #ifndef WITH_LEANER soap->fsvalidate = NULL; soap->fwvalidate = NULL; soap->feltbegin = NULL; soap->feltendin = NULL; soap->feltbegout = NULL; soap->feltendout = NULL; soap->fprepareinitsend = NULL; soap->fprepareinitrecv = NULL; soap->fpreparesend = NULL; soap->fpreparerecv = NULL; soap->fpreparefinalsend = NULL; soap->fpreparefinalrecv = NULL; soap->ffiltersend = NULL; soap->ffilterrecv = NULL; soap->fdimereadopen = NULL; soap->fdimewriteopen = NULL; soap->fdimereadclose = NULL; soap->fdimewriteclose = NULL; soap->fdimeread = NULL; soap->fdimewrite = NULL; soap->fmimereadopen = NULL; soap->fmimewriteopen = NULL; soap->fmimereadclose = NULL; soap->fmimewriteclose = NULL; soap->fmimeread = NULL; soap->fmimewrite = NULL; #endif soap->float_format = "%.9G"; /* Alternative: use "%G" */ soap->double_format = "%.17lG"; /* Alternative: use "%lG" */ soap->long_double_format = NULL; /* Defined in custom serializer custom/long_double.c */ soap->dime_id_format = "cid:id%d"; /* default DIME id format for int id index */ soap->http_version = "1.1"; soap->proxy_http_version = "1.0"; soap->http_content = NULL; soap->actor = NULL; soap->lang = "en"; soap->keep_alive = 0; soap->tcp_keep_alive = 0; soap->tcp_keep_idle = 0; soap->tcp_keep_intvl = 0; soap->tcp_keep_cnt = 0; soap->max_keep_alive = SOAP_MAXKEEPALIVE; soap->recv_timeout = 0; soap->send_timeout = 0; soap->connect_timeout = 0; soap->accept_timeout = 0; soap->socket_flags = 0; soap->connect_flags = 0; soap->bind_flags = 0; soap->accept_flags = 0; soap->linger_time = 0; soap->ip = 0; soap->labbuf = NULL; soap->lablen = 0; soap->labidx = 0; soap->encodingStyle = NULL; #ifndef WITH_NONAMESPACES soap->namespaces = namespaces; #else soap->namespaces = NULL; #endif soap->local_namespaces = NULL; soap->nlist = NULL; soap->blist = NULL; soap->clist = NULL; soap->alist = NULL; soap->shaky = 0; soap->attributes = NULL; soap->header = NULL; soap->fault = NULL; soap->master = SOAP_INVALID_SOCKET; soap->socket = SOAP_INVALID_SOCKET; soap->sendsk = SOAP_INVALID_SOCKET; soap->recvsk = SOAP_INVALID_SOCKET; soap->os = NULL; soap->is = NULL; #ifndef WITH_LEANER soap->dom = NULL; soap->dime.list = NULL; soap->dime.first = NULL; soap->dime.last = NULL; soap->mime.list = NULL; soap->mime.first = NULL; soap->mime.last = NULL; soap->mime.boundary = NULL; soap->mime.start = NULL; soap->xlist = NULL; #endif #ifndef UNDER_CE soap->recvfd = 0; soap->sendfd = 1; #else soap->recvfd = stdin; soap->sendfd = stdout; #endif soap->host[0] = '\0'; soap->path[0] = '\0'; soap->port = 0; soap->action = NULL; soap->proxy_host = NULL; soap->proxy_port = 8080; soap->proxy_userid = NULL; soap->proxy_passwd = NULL; soap->prolog = "\n"; #ifdef WITH_ZLIB soap->zlib_state = SOAP_ZLIB_NONE; soap->zlib_in = SOAP_ZLIB_NONE; soap->zlib_out = SOAP_ZLIB_NONE; soap->d_stream = NULL; soap->z_buf = NULL; soap->z_level = 6; soap->z_dict = NULL; soap->z_dict_len = 0; #endif #ifndef WITH_LEAN soap->wsuid = NULL; soap->c14nexclude = NULL; soap->c14ninclude = NULL; soap->cookies = NULL; soap->cookie_domain = NULL; soap->cookie_path = NULL; soap->cookie_max = 32; #endif #ifdef WMW_RPM_IO soap->rpmreqid = NULL; #endif #ifdef PALM palmNetLibOpen(); #endif #ifndef WITH_NOIDREF soap_init_iht(soap); #endif soap_init_pht(soap); #ifdef WITH_OPENSSL if (!soap_ssl_init_done) soap_ssl_init(); soap->fsslauth = ssl_auth_init; soap->fsslverify = NULL; soap->bio = NULL; soap->ssl = NULL; soap->ctx = NULL; soap->session = NULL; soap->ssl_flags = SOAP_SSL_DEFAULT; soap->keyfile = NULL; soap->keyid = NULL; soap->password = NULL; soap->cafile = NULL; soap->capath = NULL; soap->crlfile = NULL; soap->dhfile = NULL; soap->randfile = NULL; #endif #ifdef WITH_GNUTLS if (!soap_ssl_init_done) soap_ssl_init(); soap->fsslauth = ssl_auth_init; soap->fsslverify = NULL; soap->xcred = NULL; soap->acred = NULL; soap->cache = NULL; soap->session = NULL; soap->ssl_flags = SOAP_SSL_DEFAULT; soap->keyfile = NULL; soap->keyid = NULL; soap->password = NULL; soap->cafile = NULL; soap->capath = NULL; soap->crlfile = NULL; soap->dh_params = NULL; soap->rsa_params = NULL; #endif #ifdef WITH_SYSTEMSSL soap->fsslauth = ssl_auth_init; soap->fsslverify = NULL; soap->bio = NULL; soap->ssl = (gsk_handle)NULL; soap->ctx = (gsk_handle)NULL; soap->session = NULL; soap->ssl_flags = SOAP_SSL_DEFAULT; soap->keyfile = NULL; soap->keyid = NULL; soap->password = NULL; soap->cafile = NULL; soap->capath = NULL; soap->crlfile = NULL; soap->dhfile = NULL; soap->randfile = NULL; #endif soap->c_locale = NULL; soap->buflen = 0; soap->bufidx = 0; #ifndef WITH_LEANER soap->dime.chunksize = 0; soap->dime.buflen = 0; #endif soap->null = 0; soap->position = 0; soap->encoding = 0; soap->mustUnderstand = 0; soap->ns = 0; soap->part = SOAP_END; soap->event = 0; soap->evlev = 0; soap->alloced = 0; soap->count = 0; soap->length = 0; soap->cdata = 0; soap->peeked = 0; soap->ahead = 0; soap->idnum = 0; soap->level = 0; soap->endpoint[0] = '\0'; soap->error = SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_begin(struct soap *soap) { if (soap_check_state(soap)) return; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Reinitializing context\n")); if (!soap->keep_alive) { soap->buflen = 0; soap->bufidx = 0; } soap->null = 0; soap->position = 0; soap->encoding = 0; soap->mustUnderstand = 0; soap->mode = 0; soap->ns = 0; soap->part = SOAP_END; soap->event = 0; soap->evlev = 0; soap->count = 0; soap->length = 0; soap->cdata = 0; soap->error = SOAP_OK; soap->peeked = 0; soap->ahead = 0; soap->idnum = 0; soap->level = 0; soap->endpoint[0] = '\0'; soap->encodingStyle = SOAP_STR_EOS; #ifndef WITH_LEANER soap->dime.chunksize = 0; soap->dime.buflen = 0; #endif soap_free_temp(soap); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_end(struct soap *soap) { if (soap_check_state(soap)) return; soap_free_temp(soap); soap_dealloc(soap, NULL); while (soap->clist) { struct soap_clist *cp = soap->clist->next; SOAP_FREE(soap, soap->clist); soap->clist = cp; } soap_closesock(soap); #ifdef SOAP_DEBUG soap_close_logfiles(soap); #endif #ifdef PALM palmNetLibClose(); #endif } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_set_version(struct soap *soap, short version) { soap_set_local_namespaces(soap); if (soap->version != version && soap->local_namespaces && soap->local_namespaces[0].id && soap->local_namespaces[1].id) { if (version == 1) { soap->local_namespaces[0].ns = soap_env1; soap->local_namespaces[1].ns = soap_enc1; } else if (version == 2) { soap->local_namespaces[0].ns = soap_env2; soap->local_namespaces[1].ns = soap_enc2; } soap->version = version; } if (version == 0) soap->encodingStyle = SOAP_STR_EOS; else soap->encodingStyle = NULL; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_get_version(struct soap *soap) { struct Namespace *p = soap->local_namespaces; if (p) { const char *ns = p[0].out; if (!ns) ns = p[0].ns; if (!strcmp(ns, soap_env1)) { soap->version = 1; /* make sure we use SOAP 1.1 */ if (p[1].out) SOAP_FREE(soap, p[1].out); if ((p[1].out = (char*)SOAP_MALLOC(soap, sizeof(soap_enc1)))) soap_strncpy(p[1].out, sizeof(soap_enc1), soap_enc1, sizeof(soap_enc1) - 1); } else if (!strcmp(ns, soap_env2)) { soap->version = 2; /* make sure we use SOAP 1.2 */ if (p[1].out) SOAP_FREE(soap, p[1].out); if ((p[1].out = (char*)SOAP_MALLOC(soap, sizeof(soap_enc2)))) soap_strncpy(p[1].out, sizeof(soap_enc2), soap_enc2, sizeof(soap_enc2) - 1); } } } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_set_namespaces(struct soap *soap, const struct Namespace *p) { struct Namespace *ns = soap->local_namespaces; struct soap_nlist *np, *nq, *nr; unsigned int level = soap->level; soap->namespaces = p; soap->local_namespaces = NULL; soap_set_local_namespaces(soap); /* reverse the namespace list */ np = soap->nlist; soap->nlist = NULL; if (np) { nq = np->next; np->next = NULL; while (nq) { nr = nq->next; nq->next = np; np = nq; nq = nr; } } /* then push on new stack */ while (np) { const char *s; soap->level = np->level; /* preserve element nesting level */ s = np->ns; if (!s && np->index >= 0 && ns) { s = ns[np->index].out; if (!s) s = ns[np->index].ns; } if (s && soap_push_namespace(soap, np->id, s) == NULL) return soap->error; nq = np; np = np->next; SOAP_FREE(soap, nq); } if (ns) { int i; for (i = 0; ns[i].id; i++) { if (ns[i].out) { SOAP_FREE(soap, ns[i].out); ns[i].out = NULL; } } SOAP_FREE(soap, ns); } soap->level = level; /* restore level */ return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_set_local_namespaces(struct soap *soap) { if (soap->namespaces && !soap->local_namespaces) { const struct Namespace *ns1; struct Namespace *ns2; size_t n = 1; for (ns1 = soap->namespaces; ns1->id; ns1++) n++; n *= sizeof(struct Namespace); ns2 = (struct Namespace*)SOAP_MALLOC(soap, n); if (ns2) { soap_memcpy((void*)ns2, n, (const void*)soap->namespaces, n); if (ns2[0].ns) { if (!strcmp(ns2[0].ns, soap_env1)) soap->version = 1; else if (!strcmp(ns2[0].ns, soap_env2)) soap->version = 2; } soap->local_namespaces = ns2; for (; ns2->id; ns2++) ns2->out = NULL; } } } #endif /******************************************************************************/ #ifndef WITH_LEAN #ifndef PALM_1 SOAP_FMAC1 const char * SOAP_FMAC2 soap_tagsearch(const char *big, const char *little) { if (big && little) { size_t n = strlen(little); const char *s = big; while (s) { const char *t = s; size_t i; for (i = 0; i < n; i++, t++) { if (*t != little[i]) break; } if (*t == '\0' || *t == ' ') { if (i == n || (i && little[i-1] == ':')) return s; } s = strchr(t, ' '); if (s) s++; } } return NULL; } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 struct soap_nlist * SOAP_FMAC2 soap_lookup_ns(struct soap *soap, const char *tag, size_t n) { struct soap_nlist *np; for (np = soap->nlist; np; np = np->next) if (!strncmp(np->id, tag, n) && !np->id[n]) return np; return NULL; } #endif /******************************************************************************/ #ifndef WITH_LEAN static struct soap_nlist * soap_push_ns(struct soap *soap, const char *id, const char *ns, short utilized) { struct soap_nlist *np; size_t n, k; if (soap_tagsearch(soap->c14nexclude, id)) return NULL; if (!utilized) { for (np = soap->nlist; np; np = np->next) { if (!strcmp(np->id, id) && (!np->ns || !strcmp(np->ns, ns))) break; } if (np) { if ((np->level < soap->level || !np->ns) && np->index == 1) utilized = 1; else return NULL; } } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Adding namespace binding (level=%u) '%s' '%s' utilized=%d\n", soap->level, id, ns ? ns : "(null)", utilized)); n = strlen(id); if (ns) k = strlen(ns); else k = 0; np = (struct soap_nlist*)SOAP_MALLOC(soap, sizeof(struct soap_nlist) + n + k + 1); if (!np) { soap->error = SOAP_EOM; return NULL; } np->next = soap->nlist; soap->nlist = np; soap_strcpy((char*)np->id, n + 1, id); if (ns) { np->ns = np->id + n + 1; soap_strcpy((char*)np->ns, k + 1, ns); } else np->ns = NULL; np->level = soap->level; np->index = utilized; return np; } #endif /******************************************************************************/ #ifndef WITH_LEAN static void soap_utilize_ns(struct soap *soap, const char *tag) { struct soap_nlist *np; size_t n = 0; const char *t = strchr(tag, ':'); if (t) n = t - tag; np = soap_lookup_ns(soap, tag, n); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Utilizing namespace of '%s'\n", tag)); if (np) { if (np->index <= 0) { if (np->level == soap->level) np->index = 1; else soap_push_ns(soap, np->id, np->ns, 1); } } else if (n && strncmp(tag, "xml", 3)) { soap_strncpy(soap->tmpbuf, sizeof(soap->tmpbuf), tag, n); soap_push_ns(soap, soap->tmpbuf, NULL, 1); } } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_element(struct soap *soap, const char *tag, int id, const char *type) { #ifndef WITH_LEAN const char *s; #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element begin tag='%s' level='%u' id='%d' type='%s'\n", tag, soap->level, id, type ? type : SOAP_STR_EOS)); soap->level++; #ifdef WITH_DOM #ifndef WITH_LEAN if (soap_tagsearch(soap->wsuid, tag)) { size_t i; for (s = tag, i = 0; *s && i < sizeof(soap->tag) - 1; s++, i++) soap->tag[i] = *s == ':' ? '-' : *s; soap->tag[i] = '\0'; if (soap_set_attr(soap, "wsu:Id", soap->tag, 1)) return soap->error; } if ((soap->mode & SOAP_XML_CANONICAL) && !(soap->mode & SOAP_DOM_ASIS)) { if (soap->evlev >= soap->level) soap->evlev = 0; if (soap->event == SOAP_SEC_BEGIN && !soap->evlev) { struct soap_nlist *np; /* non-nested wsu:Id found: clear xmlns, re-emit them for exc-c14n */ for (np = soap->nlist; np; np = np->next) { int p = soap_tagsearch(soap->c14ninclude, np->id) != NULL; if (np->index == 2 || p) { struct soap_nlist *np1 = soap_push_ns(soap, np->id, np->ns, 1); if (np1 && !p) np1->index = 0; } } soap->evlev = soap->level; } } #endif if (soap->mode & SOAP_XML_DOM) { struct soap_dom_element *elt = (struct soap_dom_element*)soap_malloc(soap, sizeof(struct soap_dom_element)); if (!elt) return soap->error; elt->soap = soap; elt->next = NULL; elt->prnt = soap->dom; elt->elts = NULL; elt->atts = NULL; elt->nstr = NULL; elt->name = soap_strdup(soap, tag); elt->lead = NULL; elt->text = NULL; elt->code = NULL; elt->tail = NULL; elt->node = NULL; elt->type = 0; if (soap->dom) { struct soap_dom_element *p = soap->dom->elts; if (p) { while (p->next) p = p->next; p->next = elt; } else soap->dom->elts = elt; } soap->dom = elt; } else { #endif #ifndef WITH_LEAN if (!soap->ns) { if (!(soap->mode & SOAP_XML_CANONICAL) && soap_send(soap, soap->prolog)) return soap->error; } else if (soap->mode & SOAP_XML_INDENT) { if (soap->ns == 1 && soap_send_raw(soap, soap_indent, soap->level < sizeof(soap_indent) ? soap->level : sizeof(soap_indent) - 1)) return soap->error; soap->body = 1; } if ((soap->mode & SOAP_XML_DEFAULTNS)) { struct Namespace *ns = soap->local_namespaces; size_t n = 0; s = strchr(tag, ':'); if (s) n = s++ - tag; else s = tag; if (soap_send_raw(soap, "<", 1) || soap_send(soap, s)) return soap->error; if (n) { if (soap->nlist && !strncmp(soap->nlist->id, tag, n) && !soap->nlist->id[n]) ns = NULL; for (; ns && ns->id; ns++) { if (*ns->id && ns->ns && !strncmp(ns->id, tag, n) && !ns->id[n]) { soap_push_ns(soap, ns->id, ns->out ? ns->out : ns->ns, 0); if (soap_attribute(soap, "xmlns", ns->out ? ns->out : ns->ns)) return soap->error; break; } } } else if (!soap->nlist || *soap->nlist->id) { soap_push_ns(soap, "", "", 0); if (soap_attribute(soap, "xmlns", "")) return soap->error; } } else #endif if (soap_send_raw(soap, "<", 1) || soap_send(soap, tag)) return soap->error; #ifdef WITH_DOM } #endif if (!soap->ns) { struct Namespace *ns = soap->local_namespaces; int k = -1; if (ns) { #ifndef WITH_LEAN if ((soap->mode & SOAP_XML_DEFAULTNS)) { if (soap->version) k = 4; /* first four required entries */ else if (!(soap->mode & SOAP_XML_NOTYPE) || (soap->mode & SOAP_XML_NIL)) { ns += 2; k = 2; /* next two entries */ } else k = 0; /* no entries */ } #endif while (k-- && ns->id) { const char *t = ns->out; if (!t) t = ns->ns; if (*ns->id && t && *t) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), strlen(ns->id) + 6), "xmlns:%s", ns->id); if (soap_attribute(soap, soap->tmpbuf, t)) return soap->error; } ns++; } } } soap->ns = 1; /* namespace table control: ns = 0 or 2 to start, then 1 to stop dumping the table */ #ifndef WITH_LEAN if ((soap->mode & SOAP_XML_CANONICAL)) soap_utilize_ns(soap, tag); #endif if (id > 0) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), sizeof(SOAP_BASEREFNAME) + 20), SOAP_BASEREFNAME "%d", id); if (soap->version == 2) { if (soap_attribute(soap, "SOAP-ENC:id", soap->tmpbuf)) return soap->error; } else if (soap_attribute(soap, "id", soap->tmpbuf)) return soap->error; } if (type && *type && !(soap->mode & SOAP_XML_NOTYPE) && soap->part != SOAP_IN_HEADER) { const char *t = type; #ifndef WITH_LEAN if (soap->mode & SOAP_XML_DEFAULTNS) { t = strchr(type, ':'); if (t) t++; else t = type; } else if ((soap->mode & SOAP_XML_CANONICAL)) soap_utilize_ns(soap, type); #endif if (soap->attributes ? soap_set_attr(soap, "xsi:type", t, 1) : soap_attribute(soap, "xsi:type", t)) return soap->error; } if (soap->null && soap->position > 0 && soap->version == 1) { int i; (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf) - 1, 20), "[%d", soap->positions[0]); for (i = 1; i < soap->position; i++) { size_t l = strlen(soap->tmpbuf); (SOAP_SNPRINTF(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l - 1, 20), ",%d", soap->positions[i]); } soap_strncat(soap->tmpbuf, sizeof(soap->tmpbuf), "]", 1); if (soap_attribute(soap, "SOAP-ENC:position", soap->tmpbuf)) return soap->error; } if (soap->mustUnderstand) { if (soap->actor && *soap->actor) { if (soap_attribute(soap, soap->version == 2 ? "SOAP-ENV:role" : "SOAP-ENV:actor", soap->actor)) return soap->error; } if (soap_attribute(soap, "SOAP-ENV:mustUnderstand", soap->version == 2 ? "true" : "1")) return soap->error; soap->mustUnderstand = 0; } if (soap->encoding) { if (soap->encodingStyle && soap->local_namespaces && soap->local_namespaces[0].id && soap->local_namespaces[1].id) { if (!*soap->encodingStyle) { if (soap->local_namespaces[1].out) soap->encodingStyle = soap->local_namespaces[1].out; else soap->encodingStyle = soap->local_namespaces[1].ns; } if (soap->encodingStyle && soap_attribute(soap, "SOAP-ENV:encodingStyle", soap->encodingStyle)) return soap->error; } else soap->encodingStyle = NULL; soap->encoding = 0; } soap->null = 0; soap->position = 0; if (soap->event == SOAP_SEC_BEGIN) soap->event = 0; return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_element_begin_out(struct soap *soap, const char *tag, int id, const char *type) { if (*tag == '-') return SOAP_OK; if (soap_element(soap, tag, id, type)) return soap->error; #ifdef WITH_DOM if (soap_element_start_end_out(soap, NULL)) return soap->error; if (soap->feltbegout) return soap->error = soap->feltbegout(soap, tag); return SOAP_OK; #else return soap_element_start_end_out(soap, NULL); #endif } #endif /******************************************************************************/ #ifndef PALM_2 #ifndef HAVE_STRRCHR SOAP_FMAC1 char* SOAP_FMAC2 soap_strrchr(const char *s, int t) { char *r = NULL; while (*s) if (*s++ == t) r = (char*)s - 1; return r; } #endif #endif /******************************************************************************/ #ifndef PALM_2 #ifndef HAVE_STRTOL SOAP_FMAC1 long SOAP_FMAC2 soap_strtol(const char *s, char **t, int b) { long n = 0; int c; while (*s > 0 && *s <= 32) s++; if (b == 10) { short neg = 0; if (*s == '-') { s++; neg = 1; } else if (*s == '+') s++; while ((c = *s) && c >= '0' && c <= '9') { if (n >= 214748364 && (n > 214748364 || c >= '8')) { if (neg && n == 214748364 && c == '8') { if (t) *t = (char*)(s + 1); return -2147483648; } break; } n *= 10; n += c - '0'; s++; } if (neg) n = -n; } else /* assume b == 16 and value is always positive */ { while ((c = *s)) { if (c >= '0' && c <= '9') c -= '0'; else if (c >= 'A' && c <= 'F') c -= 'A' - 10; else if (c >= 'a' && c <= 'f') c -= 'a' - 10; if (n > 0x07FFFFFF) break; n <<= 4; n += c; s++; } } if (t) *t = (char*)s; return n; } #endif #endif /******************************************************************************/ #ifndef PALM_2 #ifndef HAVE_STRTOUL SOAP_FMAC1 unsigned long SOAP_FMAC2 soap_strtoul(const char *s, char **t, int b) { unsigned long n = 0; int c; while (*s > 0 && *s <= 32) s++; if (b == 10) { if (*s == '+') s++; while ((c = *s) && c >= '0' && c <= '9') { if (n >= 429496729 && (n > 429496729 || c >= '6')) break; n *= 10; n += c - '0'; s++; } } else /* b == 16 */ { while ((c = *s)) { if (c >= '0' && c <= '9') c -= '0'; else if (c >= 'A' && c <= 'F') c -= 'A' - 10; else if (c >= 'a' && c <= 'f') c -= 'a' - 10; if (n > 0x0FFFFFFF) break; n <<= 4; n += c; s++; } } if (t) *t = (char*)s; return n; } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_array_begin_out(struct soap *soap, const char *tag, int id, const char *type, const char *offset) { if (!type || !*type || soap->version == 0) return soap_element_begin_out(soap, tag, id, NULL); if (soap_element(soap, tag, id, NULL)) return soap->error; if (soap->version == 1) { if (offset && soap_attribute(soap, "SOAP-ENC:offset", offset)) return soap->error; if (soap_attribute(soap, "SOAP-ENC:arrayType", type)) return soap->error; } else { const char *s; s = soap_strrchr(type, '['); if (s && (size_t)(s - type) < sizeof(soap->tmpbuf)) { soap_strncpy(soap->tmpbuf, sizeof(soap->tmpbuf), type, s - type); if (soap_attribute(soap, "SOAP-ENC:itemType", soap->tmpbuf)) return soap->error; s++; if (*s) { soap_strcpy(soap->tmpbuf, sizeof(soap->tmpbuf), s); soap->tmpbuf[strlen(soap->tmpbuf) - 1] = '\0'; if (soap_attribute(soap, "SOAP-ENC:arraySize", soap->tmpbuf)) return soap->error; } } } #ifndef WITH_LEAN if ((soap->mode & SOAP_XML_CANONICAL)) soap_utilize_ns(soap, type); #endif return soap_element_start_end_out(soap, NULL); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_element_start_end_out(struct soap *soap, const char *tag) { struct soap_attribute *tp; #ifndef WITH_LEAN if ((soap->mode & SOAP_XML_CANONICAL)) { struct soap_nlist *np; for (tp = soap->attributes; tp; tp = tp->next) { if (tp->visible && *tp->name) soap_utilize_ns(soap, tp->name); } for (np = soap->nlist; np; np = np->next) { if (np->ns && (np->index == 1 || (np->index == 0 && soap->event == SOAP_SEC_BEGIN && soap_tagsearch(soap->c14ninclude, np->id)))) { if (*(np->id)) (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), strlen(np->id) + 6), "xmlns:%s", np->id); else soap_strcpy(soap->tmpbuf, sizeof(soap->tmpbuf), "xmlns"); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Enabling utilized binding (level=%u) %s='%s' c14ninclude='%s'\n", np->level, soap->tmpbuf, np->ns, soap->c14ninclude ? soap->c14ninclude : "(null)")); soap_set_attr(soap, soap->tmpbuf, np->ns, 1); np->index = 2; } else { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Binding (level=%u) %s='%s' utilized=%d\n", np->level, np->id, np->ns, np->index)); } } } #endif #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { struct soap_dom_attribute **att; att = &soap->dom->atts; for (tp = soap->attributes; tp; tp = tp->next) { if (tp->visible) { *att = (struct soap_dom_attribute*)soap_malloc(soap, sizeof(struct soap_dom_attribute)); if (!*att) return soap->error; (*att)->next = NULL; (*att)->nstr = NULL; (*att)->name = soap_strdup(soap, tp->name); (*att)->text = soap_strdup(soap, tp->value); (*att)->soap = soap; att = &(*att)->next; tp->visible = 0; } } return SOAP_OK; } #endif for (tp = soap->attributes; tp; tp = tp->next) { if (tp->visible) { #ifndef WITH_LEAN const char *s; if ((soap->mode & SOAP_XML_DEFAULTNS) && (s = strchr(tp->name, ':'))) { size_t n = s - tp->name; if (soap->nlist && !strncmp(soap->nlist->id, tp->name, n) && !soap->nlist->id[n]) s++; else s = tp->name; if (soap_send_raw(soap, " ", 1) || soap_send(soap, s)) return soap->error; } else #endif if (soap_send_raw(soap, " ", 1) || soap_send(soap, tp->name)) return soap->error; if (tp->visible == 2 && tp->value) { if (soap_send_raw(soap, "=\"", 2) || soap_string_out(soap, tp->value, tp->flag) || soap_send_raw(soap, "\"", 1)) return soap->error; } else if (soap->mode & SOAP_XML_STRICT) { if (soap_send_raw(soap, "=\"\"", 3)) return soap->error; } tp->visible = 0; } } if (tag) { #ifndef WITH_LEAN if ((soap->mode & SOAP_XML_CANONICAL)) { if (soap_send_raw(soap, ">", 1) || soap_element_end_out(soap, tag)) return soap->error; return SOAP_OK; } #endif if (soap->nlist) soap_pop_namespace(soap); soap->level--; /* decrement level just before /> */ soap->body = 0; return soap_send_raw(soap, "/>", 2); } return soap_send_raw(soap, ">", 1); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_element_end_out(struct soap *soap, const char *tag) { #ifndef WITH_LEAN const char *s; #endif if (*tag == '-') return SOAP_OK; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element ending tag='%s'\n", tag)); #ifdef WITH_DOM if (soap->feltendout && (soap->error = soap->feltendout(soap, tag))) return soap->error; if ((soap->mode & SOAP_XML_DOM) && soap->dom) { if (soap->dom->prnt) soap->dom = soap->dom->prnt; return SOAP_OK; } #endif #ifndef WITH_LEAN if (soap->nlist) soap_pop_namespace(soap); if (soap->mode & SOAP_XML_INDENT) { if (!soap->body) { if (soap_send_raw(soap, soap_indent, soap->level < sizeof(soap_indent) ? soap->level : sizeof(soap_indent) - 1)) return soap->error; } soap->body = 0; } if ((soap->mode & SOAP_XML_DEFAULTNS) && (s = strchr(tag, ':'))) tag = s + 1; #endif if (soap_send_raw(soap, "error; soap->level--; /* decrement level just before > */ return soap_send_raw(soap, ">", 1); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_element_ref(struct soap *soap, const char *tag, int id, int href) { const char *s = "ref"; int n = 1; if (soap->version == 1) { s = "href"; n = 0; } else if (soap->version == 2) s = "SOAP-ENC:ref"; (SOAP_SNPRINTF(soap->href, sizeof(soap->href), sizeof(SOAP_BASEREFNAME) + 21), "#" SOAP_BASEREFNAME "%d", href); return soap_element_href(soap, tag, id, s, soap->href + n); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_element_href(struct soap *soap, const char *tag, int id, const char *ref, const char *val) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element '%s' reference %s='%s'\n", tag, ref, val)); if (soap_element(soap, tag, id, NULL) || soap_attribute(soap, ref, val) || soap_element_start_end_out(soap, tag)) return soap->error; soap->body = 0; return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_element_null(struct soap *soap, const char *tag, int id, const char *type) { struct soap_attribute *tp = NULL; for (tp = soap->attributes; tp; tp = tp->next) if (tp->visible) break; if (tp || (soap->version == 2 && soap->position > 0) || id > 0 || (soap->mode & SOAP_XML_NIL)) { if (soap_element(soap, tag, id, type) || (!tp && soap_attribute(soap, "xsi:nil", "true")) || soap_element_start_end_out(soap, tag)) return soap->error; soap->body = 0; } else { soap->null = 1; soap->position = 0; soap->mustUnderstand = 0; } return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_element_nil(struct soap *soap, const char *tag) { if (soap_element(soap, tag, -1, NULL) || (soap_attribute(soap, "xsi:nil", "true"))) return soap->error; return soap_element_start_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_element_id(struct soap *soap, const char *tag, int id, const void *p, const void *a, int n, const char *type, int t, char **mark) { (void)a; (void)n; if (!p) { soap->error = soap_element_null(soap, tag, id, type); return -1; } #ifndef WITH_NOIDREF DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element_id %p type=%d id=%d\n", p, t, id)); if ((!soap->encodingStyle && !(soap->omode & SOAP_XML_GRAPH)) || (soap->omode & SOAP_XML_TREE)) return soap_check_and_mark(soap, p, t, mark); if (mark) *mark = NULL; if (id < -1) return soap_embed(soap, p, a, n, t); else if (id <= 0) { struct soap_plist *pp; if (a) id = soap_array_pointer_lookup(soap, p, a, n, t, &pp); else id = soap_pointer_lookup(soap, p, t, &pp); if (id) { if (soap_is_embedded(soap, pp)) { soap_element_ref(soap, tag, 0, id); return -1; } if (soap_is_single(soap, pp)) return 0; soap_set_embedded(soap, pp); } } return id; #else return soap_check_and_mark(soap, p, t, mark); #endif } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_check_and_mark(struct soap *soap, const void *p, int t, char **mark) { if (mark) { struct soap_plist *pp; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Check %p and mark %p\n", p, mark)); if (!soap_pointer_lookup(soap, p, t, &pp)) if (!soap_pointer_enter(soap, p, NULL, 0, t, &pp)) return -1; if (soap->mode & SOAP_IO_LENGTH) { if (pp->mark1 > 0) return -1; pp->mark1 = 1; *mark = &pp->mark1; } else { if (pp->mark2 > 0) return -1; pp->mark2 = 1; *mark = &pp->mark2; } } return 0; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void * SOAP_FMAC2 soap_mark_lookup(struct soap *soap, const void *p, int t, struct soap_plist **ppp, char **mark) { if (!soap) return NULL; if (mark || !(soap->mode & SOAP_XML_TREE)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Mark lookup %p type %d\n", p, t)); if (!soap_pointer_lookup(soap, p, t, ppp)) { if (!soap_pointer_enter(soap, p, NULL, 0, t, ppp)) return NULL; } else if (!(soap->mode & SOAP_XML_TREE)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Mark found %p\n", (*ppp)->dup)); return (*ppp)->dup; } if (mark) { if ((*ppp)->mark1 > 0) (*ppp)->mark1 = 2; /* cycle */ else (*ppp)->mark1 = 1; /* cycle detection */ *mark = &(*ppp)->mark1; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Mark cycle %d\n", (*ppp)->mark1)); } } return NULL; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_mark_cycle(struct soap *soap, struct soap_plist *pp) { (void)soap; return pp && pp->mark1 == 2 && (soap->mode & SOAP_XML_TREE); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_mark_dup(struct soap *soap, void *a, struct soap_plist *pp) { (void)soap; if (pp) pp->dup = a; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_unmark(struct soap *soap, char *mark) { (void)soap; if (mark) *mark = 0; /* release detection */ } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_element_result(struct soap *soap, const char *tag) { if (soap->version == 2 && soap->encodingStyle) { if (soap_element(soap, "SOAP-RPC:result", 0, NULL) || soap_attribute(soap, "xmlns:SOAP-RPC", soap_rpc) || soap_element_start_end_out(soap, NULL) || soap_string_out(soap, tag, 0) || soap_element_end_out(soap, "SOAP-RPC:result")) return soap->error; } return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_check_result(struct soap *soap, const char *tag) { (void)tag; if (soap->version == 2 && soap->encodingStyle) { soap_instring(soap, ":result", NULL, NULL, 0, 2, -1, -1, NULL); /* just ignore content for compliance reasons, but should compare tag to element's QName value? */ } } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_attribute(struct soap *soap, const char *name, const char *value) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Attribute '%s'='%s'\n", name, value)); #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && !(soap->mode & SOAP_XML_CANONICAL) && soap->dom) { struct soap_dom_attribute *a = (struct soap_dom_attribute*)soap_malloc(soap, sizeof(struct soap_dom_attribute)); if (!a) return soap->error; a->next = soap->dom->atts; a->nstr = NULL; a->name = soap_strdup(soap, name); a->text = soap_strdup(soap, value); a->soap = soap; soap->dom->atts = a; return SOAP_OK; } #endif #ifndef WITH_LEAN if ((soap->mode & SOAP_XML_CANONICAL)) { /* push namespace */ if (!strncmp(name, "xmlns", 5) && (name[5] == ':' || name[5] == '\0')) soap_push_ns(soap, name + 5 + (name[5] == ':'), value, 0); else if (soap_set_attr(soap, name, value, 1)) return soap->error; } else #endif { if (soap_send_raw(soap, " ", 1) || soap_send(soap, name)) return soap->error; if (value) if (soap_send_raw(soap, "=\"", 2) || soap_string_out(soap, value, 1) || soap_send_raw(soap, "\"", 1)) return soap->error; } return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_element_begin_in(struct soap *soap, const char *tag, int nillable, const char *type) { if (!soap_peek_element(soap)) { if (soap->other) return soap->error = SOAP_TAG_MISMATCH; if (tag && *tag == '-') return SOAP_OK; if (!(soap->error = soap_match_tag(soap, soap->tag, tag))) { soap->peeked = 0; if (type && *soap->type && soap_match_tag(soap, soap->type, type)) return soap->error = SOAP_TYPE; if (!nillable && soap->null && (soap->mode & SOAP_XML_STRICT)) return soap->error = SOAP_NULL; if (soap->body) soap->level++; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Begin tag found (level=%u) '%s'='%s'\n", soap->level, soap->tag, tag ? tag : SOAP_STR_EOS )); soap->error = SOAP_OK; } } else if (soap->error == SOAP_NO_TAG && tag && *tag == '-') soap->error = SOAP_OK; return soap->error; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_element_end_in(struct soap *soap, const char *tag) { soap_wchar c; char *s; int n = 0; if (tag && *tag == '-') return SOAP_OK; if (soap->error == SOAP_NO_TAG) soap->error = SOAP_OK; #ifdef WITH_DOM /* this whitespace or mixed content is significant for DOM as-is */ if ((soap->mode & SOAP_XML_DOM) && soap->dom) { if (!soap->peeked && !soap_string_in(soap, -1, -1, -1, NULL)) return soap->error; if (soap->dom->prnt) soap->dom = soap->dom->prnt; } #endif if (soap->peeked) { if (*soap->tag) n++; soap->peeked = 0; } do { while (((c = soap_get(soap)) != SOAP_TT)) { if ((int)c == EOF) return soap->error = SOAP_CHK_EOF; if (c == SOAP_LT) n++; else if (c == '/') { c = soap_get(soap); if (c == SOAP_GT) n--; else soap_unget(soap, c); } } } while (n--); s = soap->tag; n = sizeof(soap->tag); while (soap_notblank(c = soap_get(soap))) { if (--n > 0) *s++ = (char)c; } *s = '\0'; if ((int)c == EOF) return soap->error = SOAP_CHK_EOF; while (soap_blank(c)) c = soap_get(soap); if (c != SOAP_GT) return soap->error = SOAP_SYNTAX_ERROR; #ifndef WITH_LEAN #ifdef WITH_DOM if (soap->feltendin) { soap->level--; return soap->error = soap->feltendin(soap, soap->tag, tag); } #endif if (tag && (soap->mode & SOAP_XML_STRICT)) { soap_pop_namespace(soap); if (soap_match_tag(soap, soap->tag, tag)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End tag '%s' does not match '%s'\n", soap->tag, tag ? tag : SOAP_STR_EOS)); return soap->error = SOAP_SYNTAX_ERROR; } } #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End tag found (level=%u) '%s'='%s'\n", soap->level, soap->tag, tag ? tag : SOAP_STR_EOS)); soap->level--; return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char * SOAP_FMAC2 soap_attr_value(struct soap *soap, const char *name, int flag) { struct soap_attribute *tp; if (*name == '-') return SOAP_STR_EOS; for (tp = soap->attributes; tp; tp = tp->next) { if (!soap_match_tag(soap, tp->name, name)) break; } if (tp && tp->visible == 2) { if (flag == 4 || (flag == 2 && (soap->mode & SOAP_XML_STRICT))) soap->error = SOAP_PROHIBITED; else return tp->value; } else if (flag == 3 || (flag == 1 && (soap->mode & SOAP_XML_STRICT))) soap->error = SOAP_REQUIRED; else soap->error = SOAP_OK; return NULL; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_set_attr(struct soap *soap, const char *name, const char *value, int flag) { struct soap_attribute *tp, *tq; if (*name == '-') return SOAP_OK; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Set attribute %s='%s'\n", name, value ? value : SOAP_STR_EOS)); tq = NULL; for (tp = soap->attributes; tp; tq = tp, tp = tp->next) { if (!strcmp(tp->name, name)) break; } if (!tp) { size_t l = strlen(name); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Allocate attribute %s\n", name)); if (!(tp = (struct soap_attribute*)SOAP_MALLOC(soap, sizeof(struct soap_attribute) + l))) return soap->error = SOAP_EOM; tp->ns = NULL; #ifndef WITH_LEAN if ((soap->mode & SOAP_XML_CANONICAL)) { struct soap_attribute **tpp = &soap->attributes; const char *s = strchr(name, ':'); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inserting attribute %s for c14n\n", name)); if (!strncmp(name, "xmlns", 5)) { for (; *tpp; tpp = &(*tpp)->next) if (strncmp((*tpp)->name, "xmlns", 5) || strcmp((*tpp)->name + 5, name + 5) > 0) break; } else if (!s) { for (; *tpp; tpp = &(*tpp)->next) if (strncmp((*tpp)->name, "xmlns", 5) && ((*tpp)->ns || strcmp((*tpp)->name, name) > 0)) break; } else { struct soap_nlist *np = soap_lookup_ns(soap, name, s - name); if (np) tp->ns = np->ns; else { struct soap_attribute *tq; for (tq = soap->attributes; tq; tq = tq->next) { if (!strncmp(tq->name, "xmlns:", 6) && !strncmp(tq->name + 6, name, s - name) && !tq->name[6 + s - name]) { tp->ns = tq->ns; break; } } } for (; *tpp; tpp = &(*tpp)->next) { int k; if (strncmp((*tpp)->name, "xmlns", 5) && (*tpp)->ns && tp->ns && ((k = strcmp((*tpp)->ns, tp->ns)) > 0 || (!k && strcmp((*tpp)->name, name) > 0))) break; } } tp->next = *tpp; *tpp = tp; } else #endif if (tq) { tq->next = tp; tp->next = NULL; } else { tp->next = soap->attributes; soap->attributes = tp; } soap_strcpy((char*)tp->name, l + 1, name); tp->value = NULL; } else if (tp->visible) { return SOAP_OK; } else if (value && tp->value && tp->size <= strlen(value)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free attribute value of %s (free %p)\n", name, tp->value)); SOAP_FREE(soap, tp->value); tp->value = NULL; tp->ns = NULL; } if (value) { if (!tp->value) { tp->size = strlen(value) + 1; if (!(tp->value = (char*)SOAP_MALLOC(soap, tp->size))) return soap->error = SOAP_EOM; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Allocate attribute value for %s (%p)\n", tp->name, tp->value)); } soap_strcpy(tp->value, tp->size, value); if (!strncmp(tp->name, "xmlns:", 6)) tp->ns = tp->value; tp->visible = 2; tp->flag = (short)flag; #ifndef WITH_LEAN if (!strcmp(name, "wsu:Id")) { soap->event = SOAP_SEC_BEGIN; soap_strcpy(soap->id, sizeof(soap->id), value); } if ((soap->mode & SOAP_XML_CANONICAL)) { const char *s = strchr(name, ':'); if (s) /* should also check default namespace when 'type' is not qualified? */ { struct soap_nlist *np = soap_lookup_ns(soap, name, s - name); if (np && np->ns && soap->local_namespaces) { if ((!strcmp(s + 1, "type") && !strcmp(np->ns, soap->local_namespaces[2].ns)) /* xsi:type QName */ || ((!strcmp(s + 1, "arrayType") || !strcmp(s + 1, "itemType")) && !strcmp(np->ns, soap->local_namespaces[1].ns))) /* SOAP-ENC:arrayType and SOAP-ENC:itemType QName */ soap_utilize_ns(soap, value); } } } #endif } else tp->visible = 1; return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_clr_attr(struct soap *soap) { struct soap_attribute *tp; #ifndef WITH_LEAN if ((soap->mode & SOAP_XML_CANONICAL)) { while (soap->attributes) { tp = soap->attributes->next; if (soap->attributes->value) SOAP_FREE(soap, soap->attributes->value); SOAP_FREE(soap, soap->attributes); soap->attributes = tp; } } else #endif { for (tp = soap->attributes; tp; tp = tp->next) tp->visible = 0; } } #endif /******************************************************************************/ #ifndef PALM_2 static int soap_getattrval(struct soap *soap, char *s, size_t *n, soap_wchar d) { char buf[8]; size_t i; size_t k = *n; size_t m = 0; char *t = buf; for (i = 0; i < k; i++) { soap_wchar c; if (m) { *s++ = *t++; m--; continue; } if ((soap->mode & SOAP_C_UTFSTRING)) { if (((c = soap_get(soap)) & 0x80000000) && c >= -0x7FFFFF80 && c < SOAP_AP) { t = buf; c &= 0x7FFFFFFF; if (c < 0x0800) *t++ = (char)(0xC0 | ((c >> 6) & 0x1F)); else { if (c < 0x010000) *t++ = (char)(0xE0 | ((c >> 12) & 0x0F)); else { if (c < 0x200000) *t++ = (char)(0xF0 | ((c >> 18) & 0x07)); else { if (c < 0x04000000) *t++ = (char)(0xF8 | ((c >> 24) & 0x03)); else { *t++ = (char)(0xFC | ((c >> 30) & 0x01)); *t++ = (char)(0x80 | ((c >> 24) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 18) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 12) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 6) & 0x3F)); } *t++ = (char)(0x80 | (c & 0x3F)); m = t - buf - 1; if (i + m >= k) { soap_unget(soap, c | 0x80000000); *n = i; return soap->error = SOAP_EOM; } t = buf; *s++ = *t++; continue; } } else c = soap_getutf8(soap); switch (c) { case SOAP_TT: *s++ = '<'; soap_unget(soap, '/'); break; case SOAP_LT: *s++ = '<'; break; case SOAP_GT: if (d == ' ') { soap_unget(soap, c); *s = '\0'; *n = i + 1; return SOAP_OK; } *s++ = '>'; break; case SOAP_QT: if (c == d) { *s = '\0'; *n = i + 1; return SOAP_OK; } *s++ = '"'; break; case SOAP_AP: if (c == d) { *s = '\0'; *n = i + 1; return SOAP_OK; } *s++ = '\''; break; case '\t': case '\n': case '\r': case ' ': case '/': if (d == ' ') { soap_unget(soap, c); *s = '\0'; *n = i + 1; return SOAP_OK; } *s++ = (char)c; break; default: if ((int)c == EOF) { *s = '\0'; *n = i + 1; return soap->error = SOAP_CHK_EOF; } *s++ = (char)c; } } return soap->error = SOAP_EOM; } #endif /******************************************************************************/ #ifdef WITH_FAST #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_store_lab(struct soap *soap, const char *s, size_t n) { soap->labidx = 0; return soap_append_lab(soap, s, n); } #endif #endif /******************************************************************************/ #ifdef WITH_FAST #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_append_lab(struct soap *soap, const char *s, size_t n) { if (soap->labidx + n >= soap->lablen) { char *t = soap->labbuf; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Enlarging look-aside buffer to append data, size=%lu\n", (unsigned long)soap->lablen)); if (soap->lablen == 0) soap->lablen = SOAP_LABLEN; while (soap->labidx + n >= soap->lablen) soap->lablen <<= 1; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "New look-aside buffer size=%lu\n", (unsigned long)soap->lablen)); soap->labbuf = (char*)SOAP_MALLOC(soap, soap->lablen); if (!soap->labbuf) { if (t) SOAP_FREE(soap, t); return soap->error = SOAP_EOM; } if (t) { soap_memcpy((void*)soap->labbuf, soap->lablen, (const void*)t, soap->labidx); SOAP_FREE(soap, t); } } if (s) { soap_memcpy((void*)(soap->labbuf + soap->labidx), soap->lablen - soap->labidx, (const void*)s, n); soap->labidx += n; } return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_peek_element(struct soap *soap) { #ifdef WITH_DOM struct soap_dom_attribute **att = NULL; char *lead = NULL; #endif struct soap_attribute *tp, *tq = NULL; const char *t; char *s; soap_wchar c; int i; if (soap->peeked) { if (!*soap->tag) return soap->error = SOAP_NO_TAG; return SOAP_OK; } soap->peeked = 1; soap->id[0] = '\0'; soap->href[0] = '\0'; soap->type[0] = '\0'; soap->arrayType[0] = '\0'; soap->arraySize[0] = '\0'; soap->arrayOffset[0] = '\0'; soap->other = 0; soap->root = -1; soap->position = 0; soap->null = 0; soap->mustUnderstand = 0; /* UTF-8 BOM? */ c = soap_getchar(soap); if (c == 0xEF && soap_get0(soap) == 0xBB) { c = soap_get1(soap); if ((c = soap_get1(soap)) == 0xBF) soap->mode &= ~SOAP_ENC_LATIN; else soap_unget(soap, (0x0F << 12) | (0xBB << 6) | (c & 0x3F)); /* UTF-8 */ } else if ((c == 0xFE && soap_get0(soap) == 0xFF) /* UTF-16 BE */ || (c == 0xFF && soap_get0(soap) == 0xFE)) /* UTF-16 LE */ return soap->error = SOAP_UTF_ERROR; else soap_unget(soap, c); c = soap_get(soap); #ifdef WITH_DOM /* whitespace leading up to the start tag is significant for DOM as-is (but comments and PIs are removed from this lead) */ if (soap_blank(c)) { soap->labidx = 0; do { if (soap_append_lab(soap, NULL, 0)) return soap->error; s = soap->labbuf + soap->labidx; i = soap->lablen - soap->labidx; soap->labidx = soap->lablen; while (soap_blank(c) && i--) { *s++ = c; c = soap_get(soap); } } while (soap_blank(c)); *s = '\0'; lead = soap->labbuf; } #else /* skip space */ while (soap_blank(c)) c = soap_get(soap); #endif if (c != SOAP_LT) { *soap->tag = '\0'; if ((int)c == EOF) return soap->error = SOAP_CHK_EOF; soap_unget(soap, c); #ifdef WITH_DOM /* whitespace leading up to the end tag is significant for DOM as-is */ if ((soap->mode & SOAP_XML_DOM) && soap->dom) { if (lead && *lead) soap->dom->tail = soap_strdup(soap, lead); else soap->dom->tail = SOAP_STR_EOS; /* body with closing tag instead of */ } #endif return soap->error = SOAP_NO_TAG; } do c = soap_get1(soap); while (soap_blank(c)); s = soap->tag; i = sizeof(soap->tag); while (c != '>' && c != '/' && soap_notblank(c) && (int)c != EOF) { if (--i > 0) *s++ = (char)c; c = soap_get1(soap); } *s = '\0'; while (soap_blank(c)) c = soap_get1(soap); #ifdef WITH_DOM if (soap->mode & SOAP_XML_DOM) { struct soap_dom_element *elt; elt = (struct soap_dom_element*)soap_malloc(soap, sizeof(struct soap_dom_element)); if (!elt) return soap->error; elt->next = NULL; elt->prnt = soap->dom; elt->elts = NULL; elt->atts = NULL; elt->nstr = NULL; elt->name = soap_strdup(soap, soap->tag); elt->text = NULL; elt->code = NULL; elt->tail = NULL; elt->node = NULL; elt->type = 0; if (lead && *lead) elt->lead = soap_strdup(soap, lead); else elt->lead = NULL; elt->soap = soap; if (soap->dom) { struct soap_dom_element *p = soap->dom->elts; if (p) { while (p->next) p = p->next; p->next = elt; } else soap->dom->elts = elt; } soap->dom = elt; att = &elt->atts; } #endif soap_pop_namespace(soap); for (tp = soap->attributes; tp; tp = tp->next) tp->visible = 0; while ((int)c != EOF && c != '>' && c != '/') { s = soap->tmpbuf; i = sizeof(soap->tmpbuf); while (c != '=' && c != '>' && c != '/' && soap_notblank(c) && (int)c != EOF) { if (--i > 0) *s++ = (char)c; c = soap_get1(soap); } *s = '\0'; if (i == sizeof(soap->tmpbuf)) return soap->error = SOAP_SYNTAX_ERROR; #ifdef WITH_DOM /* add attribute name to dom */ if (att) { *att = (struct soap_dom_attribute*)soap_malloc(soap, sizeof(struct soap_dom_attribute)); if (!*att) return soap->error; (*att)->next = NULL; (*att)->nstr = NULL; (*att)->name = soap_strdup(soap, soap->tmpbuf); (*att)->text = NULL; (*att)->soap = soap; } #endif if (!strncmp(soap->tmpbuf, "xmlns", 5)) { if (soap->tmpbuf[5] == ':') t = soap->tmpbuf + 6; else if (soap->tmpbuf[5]) t = NULL; else t = SOAP_STR_EOS; } else t = NULL; tq = NULL; for (tp = soap->attributes; tp; tq = tp, tp = tp->next) { if (!SOAP_STRCMP(tp->name, soap->tmpbuf)) break; } if (!tp) { size_t l = strlen(soap->tmpbuf); tp = (struct soap_attribute*)SOAP_MALLOC(soap, sizeof(struct soap_attribute) + l); if (!tp) return soap->error = SOAP_EOM; soap_strcpy((char*)tp->name, l + 1, soap->tmpbuf); tp->value = NULL; tp->size = 0; tp->ns = NULL; /* append attribute to the end of the list */ if (tq) { tq->next = tp; tp->next = NULL; } else { tp->next = soap->attributes; soap->attributes = tp; } } while (soap_blank(c)) c = soap_get1(soap); if (c == '=') { size_t k; do c = soap_getutf8(soap); while (soap_blank(c)); if (c != SOAP_QT && c != SOAP_AP) { soap_unget(soap, c); c = ' '; /* blank delimiter */ } k = tp->size; if (soap_getattrval(soap, tp->value, &k, c)) { #ifdef WITH_FAST if (soap->error != SOAP_EOM) return soap->error; soap->error = SOAP_OK; if (soap_store_lab(soap, tp->value, k)) return soap->error; if (tp->value) SOAP_FREE(soap, tp->value); tp->value = NULL; for (;;) { k = soap->lablen - soap->labidx; if (soap_getattrval(soap, soap->labbuf + soap->labidx, &k, c)) { if (soap->error != SOAP_EOM) return soap->error; soap->error = SOAP_OK; soap->labidx = soap->lablen; if (soap_append_lab(soap, NULL, 0)) return soap->error; } else break; } if (soap->labidx) tp->size = soap->lablen; else { tp->size = strlen(soap->labbuf) + 1; if (tp->size < SOAP_LABLEN) tp->size = SOAP_LABLEN; } if (!(tp->value = (char*)SOAP_MALLOC(soap, tp->size))) return soap->error = SOAP_EOM; soap_strcpy(tp->value, tp->size, soap->labbuf); #else tp->size = k; if (soap->error != SOAP_EOM) return soap->error; soap->error = SOAP_OK; if (soap_new_block(soap) == NULL) return soap->error; for (;;) { if (!(s = (char*)soap_push_block(soap, NULL, SOAP_BLKLEN))) return soap->error; k = SOAP_BLKLEN; if (soap_getattrval(soap, s, &k, c)) { if (soap->error != SOAP_EOM) return soap->error; soap->error = SOAP_OK; soap_size_block(soap, NULL, k); } else break; } k = tp->size + soap->blist->size; if (!(s = (char*)SOAP_MALLOC(soap, k))) return soap->error = SOAP_EOM; if (tp->value) { soap_memcpy((void*)s, k, (const void*)tp->value, tp->size); SOAP_FREE(soap, tp->value); } soap_save_block(soap, NULL, s + tp->size, 0); tp->value = s; tp->size = k; #endif } do c = soap_get1(soap); while (soap_blank(c)); tp->visible = 2; /* seen this attribute w/ value */ #ifdef WITH_DOM if (att) (*att)->text = soap_strdup(soap, tp->value); #endif } else tp->visible = 1; /* seen this attribute w/o value */ #ifdef WITH_DOM if (att) att = &(*att)->next; #endif if (t && tp->value) { if (soap_push_namespace(soap, t, tp->value) == NULL) return soap->error; } } #ifdef WITH_DOM if (att) { soap->dom->nstr = soap_current_namespace(soap, soap->tag); for (att = &soap->dom->atts; *att; att = &(*att)->next) (*att)->nstr = soap_current_namespace(soap, (*att)->name); } #endif if ((int)c == EOF) return soap->error = SOAP_CHK_EOF; if (!(soap->body = (c != '/'))) do c = soap_get1(soap); while (soap_blank(c)); #ifdef WITH_DOM if (soap->mode & SOAP_XML_DOM) { if (!soap->body && soap->dom->prnt) soap->dom = soap->dom->prnt; } #endif for (tp = soap->attributes; tp; tp = tp->next) { if (tp->visible && tp->value) { #ifndef WITH_NOIDREF if (!strcmp(tp->name, "id")) { if ((soap->version > 0 && !(soap->imode & SOAP_XML_TREE)) || (soap->mode & SOAP_XML_GRAPH)) { *soap->id = '#'; soap_strcpy(soap->id + 1, sizeof(soap->id) - 1, tp->value); } } else if (!strcmp(tp->name, "href")) { if ((soap->version == 1 && !(soap->imode & SOAP_XML_TREE)) || (soap->mode & SOAP_XML_GRAPH) || ((soap->mode & (SOAP_ENC_MTOM | SOAP_ENC_DIME)) && *tp->value != '#')) soap_strcpy(soap->href, sizeof(soap->href), tp->value); } else if (!strcmp(tp->name, "ref")) { if ((soap->version == 2 && !(soap->imode & SOAP_XML_TREE)) || (soap->mode & SOAP_XML_GRAPH)) { *soap->href = '#'; soap_strcpy(soap->href + (*tp->value != '#'), sizeof(soap->href) - 1, tp->value); } } #else if (!strcmp(tp->name, "href")) { if ((soap->mode & (SOAP_ENC_MTOM | SOAP_ENC_DIME)) && *tp->value != '#') soap_strcpy(soap->href, sizeof(soap->href), tp->value); } #endif else if (!soap_match_tag(soap, tp->name, "xsi:type")) { soap_strcpy(soap->type, sizeof(soap->type), tp->value); } else if ((!soap_match_tag(soap, tp->name, "xsi:null") || !soap_match_tag(soap, tp->name, "xsi:nil")) && (!strcmp(tp->value, "1") || !strcmp(tp->value, "true"))) { soap->null = 1; } else if (!soap_match_tag(soap, tp->name, "SOAP-ENV:encodingStyle")) { if (!soap->encodingStyle) soap->encodingStyle = SOAP_STR_EOS; soap_get_version(soap); } else if (soap->version == 1) { if (!soap_match_tag(soap, tp->name, "SOAP-ENC:arrayType")) { s = soap_strrchr(tp->value, '['); if (s && (size_t)(s - tp->value) < sizeof(soap->arrayType)) { soap_strncpy(soap->arrayType, sizeof(soap->arrayType), tp->value, s - tp->value); soap_strcpy(soap->arraySize, sizeof(soap->arraySize), s); } else soap_strcpy(soap->arrayType, sizeof(soap->arrayType), tp->value); } else if (!soap_match_tag(soap, tp->name, "SOAP-ENC:offset")) soap_strcpy(soap->arrayOffset, sizeof(soap->arrayOffset), tp->value); else if (!soap_match_tag(soap, tp->name, "SOAP-ENC:position")) soap->position = soap_getposition(tp->value, soap->positions); else if (!soap_match_tag(soap, tp->name, "SOAP-ENC:root")) soap->root = ((!strcmp(tp->value, "1") || !strcmp(tp->value, "true"))); else if (!soap_match_tag(soap, tp->name, "SOAP-ENV:mustUnderstand") && (!strcmp(tp->value, "1") || !strcmp(tp->value, "true"))) soap->mustUnderstand = 1; else if (!soap_match_tag(soap, tp->name, "SOAP-ENV:actor")) { if ((!soap->actor || strcmp(soap->actor, tp->value)) && strcmp(tp->value, "http://schemas.xmlsoap.org/soap/actor/next")) soap->other = 1; } } else if (soap->version == 2) { #ifndef WITH_NOIDREF if (!soap_match_tag(soap, tp->name, "SOAP-ENC:id")) { *soap->id = '#'; soap_strcpy(soap->id + 1, sizeof(soap->id) - 1, tp->value); } else if (!soap_match_tag(soap, tp->name, "SOAP-ENC:ref")) { *soap->href = '#'; soap_strcpy(soap->href + (*tp->value != '#'), sizeof(soap->href) - 1, tp->value); } else #endif if (!soap_match_tag(soap, tp->name, "SOAP-ENC:itemType")) soap_strcpy(soap->arrayType, sizeof(soap->arrayType), tp->value); else if (!soap_match_tag(soap, tp->name, "SOAP-ENC:arraySize")) soap_strcpy(soap->arraySize, sizeof(soap->arraySize), tp->value); else if (!soap_match_tag(soap, tp->name, "SOAP-ENV:mustUnderstand") && (!strcmp(tp->value, "1") || !strcmp(tp->value, "true"))) soap->mustUnderstand = 1; else if (!soap_match_tag(soap, tp->name, "SOAP-ENV:role")) { if ((!soap->actor || strcmp(soap->actor, tp->value)) && strcmp(tp->value, "http://www.w3.org/2003/05/soap-envelope/role/next")) soap->other = 1; } } else { if (!soap_match_tag(soap, tp->name, "wsdl:required") && !strcmp(tp->value, "true")) soap->mustUnderstand = 1; } } } #ifdef WITH_DOM if (soap->feltbegin) return soap->error = soap->feltbegin(soap, soap->tag); #endif return soap->error = SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_retry(struct soap *soap) { soap->error = SOAP_OK; soap_revert(soap); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void SOAP_FMAC2 soap_revert(struct soap *soap) { if (!soap->peeked) { soap->peeked = 1; if (soap->body) soap->level--; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Reverting to last element '%s' (level=%u)\n", soap->tag, soap->level)); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_string_out(struct soap *soap, const char *s, int flag) { const char *t; soap_wchar c; soap_wchar mask = (soap_wchar)0xFFFFFF80UL; #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { soap->dom->text = soap_strdup(soap, s); return SOAP_OK; } #endif if (flag == 2 || (soap->mode & SOAP_C_UTFSTRING)) mask = 0; t = s; while ((c = *t++)) { switch (c) { case 0x09: if (flag) { if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, " ", 5)) return soap->error; s = t; } break; case 0x0A: if (flag || !(soap->mode & SOAP_XML_CANONICAL)) { if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, " ", 5)) return soap->error; s = t; } break; case '&': if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, "&", 5)) return soap->error; s = t; break; case '<': if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, "<", 4)) return soap->error; s = t; break; case '>': if (!flag) { if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, ">", 4)) return soap->error; s = t; } break; case '"': if (flag) { if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, """, 6)) return soap->error; s = t; } break; case 0x7F: if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, "", 6)) return soap->error; s = t; break; default: #ifndef WITH_LEANER #ifdef HAVE_MBTOWC if (soap->mode & SOAP_C_MBSTRING) { wchar_t wc; int m = mbtowc(&wc, t - 1, MB_CUR_MAX); if (m > 0 && !((soap_wchar)wc == c && m == 1 && c < 0x80)) { if (soap_send_raw(soap, s, t - s - 1) || soap_pututf8(soap, (unsigned long)wc)) return soap->error; s = t += m - 1; continue; } } #endif #endif #ifndef WITH_NOSTRINGTOUTF8 if ((c & mask) || !(c & 0xFFFFFFE0UL)) { if (soap_send_raw(soap, s, t - s - 1) || soap_pututf8(soap, (unsigned char)c)) return soap->error; s = t; } #endif } } return soap_send_raw(soap, s, t - s - 1); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 char * SOAP_FMAC2 soap_string_in(struct soap *soap, int flag, long minlen, long maxlen, const char *pattern) { char *s; char *t = NULL; size_t i; long l = 0; int n = 0, f = 0, m = 0; soap_wchar c; #if !defined(WITH_LEANER) && defined(HAVE_WCTOMB) char buf[MB_LEN_MAX > 8 ? MB_LEN_MAX : 8]; #else char buf[8]; #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Reading string content, flag=%d\n", flag)); if (flag <= 0 && soap->peeked && *soap->tag) { #ifndef WITH_LEAN struct soap_attribute *tp; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "String content includes tag '%s' and attributes\n", soap->tag)); t = soap->tmpbuf; *t = '<'; soap_strcpy(t + 1, sizeof(soap->tmpbuf) - 1, soap->tag); t += strlen(t); for (tp = soap->attributes; tp; tp = tp->next) { if (tp->visible) { size_t l = strlen(tp->name); if (t + l + 1 >= soap->tmpbuf + sizeof(soap->tmpbuf)) break; /* too many or attribute values to large */ *t++ = ' '; soap_strncpy(t, sizeof(soap->tmpbuf) - (t - soap->tmpbuf), tp->name, l); t += l; if (tp->value) { l = strlen(tp->value); if (t + l + 3 >= soap->tmpbuf + sizeof(soap->tmpbuf)) break; /* too many or attribute values to large */ *t++ = '='; *t++ = '"'; soap_strncpy(t, sizeof(soap->tmpbuf) - (t - soap->tmpbuf), tp->value, l); t += l; *t++ = '"'; } } } if (!soap->body) *t++ = '/'; *t++ = '>'; *t = '\0'; t = soap->tmpbuf; m = (int)strlen(soap->tmpbuf); #endif if (soap->body) n = 1; f = 1; soap->peeked = 0; } #ifdef WITH_CDATA if (flag <= 0) { int state = 0; #ifdef WITH_FAST soap->labidx = 0; /* use look-aside buffer */ #else if (soap_new_block(soap) == NULL) return NULL; #endif for (;;) { #ifdef WITH_FAST size_t k; if (soap_append_lab(soap, NULL, 0)) /* allocate more space in look-aside buffer if necessary */ return NULL; s = soap->labbuf + soap->labidx; /* space to populate */ k = soap->lablen - soap->labidx; /* number of bytes available */ soap->labidx = soap->lablen; /* claim this space */ #else size_t k = SOAP_BLKLEN; if (!(s = (char*)soap_push_block(soap, NULL, k))) return NULL; #endif for (i = 0; i < k; i++) { if (m > 0) { *s++ = *t++; /* copy multibyte characters */ m--; continue; } c = soap_getchar(soap); if ((int)c == EOF) goto end; if ((c >= 0x80 || c < SOAP_AP) && state != 1 && !(soap->mode & SOAP_ENC_LATIN)) { if ((c & 0x7FFFFFFF) >= 0x80) { soap_unget(soap, c); c = soap_getutf8(soap); } if ((c & 0x7FFFFFFF) >= 0x80 && (flag <= 0 || (soap->mode & SOAP_C_UTFSTRING))) { c &= 0x7FFFFFFF; t = buf; if (c < 0x0800) *t++ = (char)(0xC0 | ((c >> 6) & 0x1F)); else { if (c < 0x010000) *t++ = (char)(0xE0 | ((c >> 12) & 0x0F)); else { if (c < 0x200000) *t++ = (char)(0xF0 | ((c >> 18) & 0x07)); else { if (c < 0x04000000) *t++ = (char)(0xF8 | ((c >> 24) & 0x03)); else { *t++ = (char)(0xFC | ((c >> 30) & 0x01)); *t++ = (char)(0x80 | ((c >> 24) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 18) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 12) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 6) & 0x3F)); } *t++ = (char)(0x80 | (c & 0x3F)); m = (int)(t - buf) - 1; t = buf; *s++ = *t++; continue; } } switch (state) { case 1: if (c == ']') state = 4; *s++ = (char)c; continue; case 2: if (c == '-') state = 6; *s++ = (char)c; continue; case 3: if (c == '?') state = 8; *s++ = (char)c; continue; /* CDATA */ case 4: if (c == ']') state = 5; else state = 1; *s++ = (char)c; continue; case 5: if (c == '>') state = 0; else if (c != ']') state = 1; *s++ = (char)c; continue; /* comment */ case 6: if (c == '-') state = 7; else state = 2; *s++ = (char)c; continue; case 7: if (c == '>') state = 0; else if (c != '-') state = 2; *s++ = (char)c; continue; /* PI */ case 8: if (c == '>') state = 0; else if (c != '?') state = 3; *s++ = (char)c; continue; } switch (c) { case SOAP_TT: if (n == 0) goto end; n--; *s++ = '<'; t = (char*)"/"; m = 1; break; case SOAP_LT: if ((!f && flag >= 0) || (f && n == 0)) goto end; n++; *s++ = '<'; break; case SOAP_GT: *s++ = '>'; break; case SOAP_QT: *s++ = '"'; break; case SOAP_AP: *s++ = '\''; break; case '/': if (n > 0) { c = soap_getchar(soap); if (c == '>') n--; soap_unget(soap, c); } *s++ = '/'; break; case '<': c = soap_getchar(soap); if (c == '/') { if (n == 0) { c = SOAP_TT; goto end; } n--; } else if (c == '!') { c = soap_getchar(soap); if (c == '[') { do c = soap_getchar(soap); while ((int)c != EOF && c != '['); if ((int)c == EOF) goto end; t = (char*)"![CDATA["; m = 8; state = 1; } else if (c == '-') { if ((c = soap_getchar(soap)) == '-') state = 2; t = (char*)"!-"; m = 2; soap_unget(soap, c); } else { t = (char*)"!"; m = 1; soap_unget(soap, c); } *s++ = '<'; break; } else if (c == '?') state = 3; else if (f && n == 0) { soap_revget1(soap); c = '<'; goto end; } else n++; soap_unget(soap, c); *s++ = '<'; break; case '>': *s++ = '>'; break; case '"': *s++ = '"'; break; default: #ifndef WITH_LEANER #ifdef HAVE_WCTOMB if (soap->mode & SOAP_C_MBSTRING) { #ifdef WIN32 m = 0; wctomb_s(&m, buf, sizeof(buf), (wchar_t)(c & 0x7FFFFFFF)); #else m = wctomb(buf, (wchar_t)(c & 0x7FFFFFFF)); #endif if (m >= 1 && m <= (int)MB_CUR_MAX) { t = buf; *s++ = *t++; m--; } else { *s++ = SOAP_UNKNOWN_CHAR; m = 0; } } else #endif #endif *s++ = (char)(c & 0xFF); } l++; if (maxlen >= 0 && l > maxlen) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "String too long: maxlen=%ld\n", maxlen)); soap->error = SOAP_LENGTH; return NULL; } } } } #endif #ifdef WITH_FAST soap->labidx = 0; /* use look-aside buffer */ #else if (soap_new_block(soap) == NULL) return NULL; #endif for (;;) { #ifdef WITH_FAST size_t k; if (soap_append_lab(soap, NULL, 0)) /* allocate more space in look-aside buffer if necessary */ return NULL; s = soap->labbuf + soap->labidx; /* space to populate */ k = soap->lablen - soap->labidx; /* number of bytes available */ soap->labidx = soap->lablen; /* claim this space */ #else size_t k = SOAP_BLKLEN; if (!(s = (char*)soap_push_block(soap, NULL, k))) return NULL; #endif for (i = 0; i < k; i++) { if (m > 0) { *s++ = *t++; /* copy multibyte characters */ m--; continue; } #ifndef WITH_CDATA if (flag <= 0) c = soap_getchar(soap); else #endif { c = soap_getutf8(soap); if ((soap->mode & SOAP_C_UTFSTRING)) { if (c >= 0x80 || (c < SOAP_AP && c >= -0x7FFFFF80)) { c &= 0x7FFFFFFF; t = buf; if (c < 0x0800) *t++ = (char)(0xC0 | ((c >> 6) & 0x1F)); else { if (c < 0x010000) *t++ = (char)(0xE0 | ((c >> 12) & 0x0F)); else { if (c < 0x200000) *t++ = (char)(0xF0 | ((c >> 18) & 0x07)); else { if (c < 0x04000000) *t++ = (char)(0xF8 | ((c >> 24) & 0x03)); else { *t++ = (char)(0xFC | ((c >> 30) & 0x01)); *t++ = (char)(0x80 | ((c >> 24) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 18) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 12) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 6) & 0x3F)); } *t++ = (char)(0x80 | (c & 0x3F)); m = (int)(t - buf) - 1; t = buf; *s++ = *t++; l++; if (maxlen >= 0 && l > maxlen) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "String too long: maxlen=%ld\n", maxlen)); soap->error = SOAP_LENGTH; return NULL; } continue; } } } switch (c) { case SOAP_TT: if (n == 0) goto end; n--; *s++ = '<'; t = (char*)"/"; m = 1; break; case SOAP_LT: if ((!f && flag >= 0) || (f && n == 0)) goto end; n++; *s++ = '<'; break; case SOAP_GT: *s++ = '>'; break; case SOAP_QT: *s++ = '"'; break; case SOAP_AP: *s++ = '\''; break; case '/': if (n > 0) { if (flag > 0) { c = soap_get(soap); if (c == SOAP_GT) n--; } else { c = soap_getchar(soap); if (c == '>') n--; } soap_unget(soap, c); } *s++ = '/'; break; case (soap_wchar)('<' | 0x80000000): if (flag > 0) *s++ = '<'; else { *s++ = '&'; t = (char*)"lt;"; m = 3; } break; case (soap_wchar)('>' | 0x80000000): if (flag > 0) *s++ = '>'; else { *s++ = '&'; t = (char*)"gt;"; m = 3; } break; case (soap_wchar)('&' | 0x80000000): if (flag > 0) *s++ = '&'; else { *s++ = '&'; t = (char*)"amp;"; m = 4; } break; case (soap_wchar)('"' | 0x80000000): if (flag > 0) *s++ = '"'; else { *s++ = '&'; t = (char*)"quot;"; m = 5; } break; case (soap_wchar)('\'' | 0x80000000): if (flag > 0) *s++ = '\''; else { *s++ = '&'; t = (char*)"apos;"; m = 5; } break; default: if ((int)c == EOF) goto end; #ifndef WITH_CDATA if (c == '<') { c = soap_getchar(soap); soap_unget(soap, c); if (c == '/') { c = SOAP_TT; if (n == 0) goto end; n--; } else n++; *s++ = '<'; break; } else #endif #ifndef WITH_LEANER #ifdef HAVE_WCTOMB if (soap->mode & SOAP_C_MBSTRING) { #ifdef WIN32 m = 0; wctomb_s(&m, buf, sizeof(buf), (wchar_t)(c & 0x7FFFFFFF)); #else m = wctomb(buf, (wchar_t)(c & 0x7FFFFFFF)); #endif if (m >= 1 && m <= (int)MB_CUR_MAX) { t = buf; *s++ = *t++; m--; } else { *s++ = SOAP_UNKNOWN_CHAR; m = 0; } } else #endif #endif *s++ = (char)(c & 0xFF); } l++; if (maxlen >= 0 && l > maxlen) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "String too long: maxlen=%ld\n", maxlen)); soap->error = SOAP_LENGTH; return NULL; } } } end: soap_unget(soap, c); *s = '\0'; #ifdef WITH_FAST t = soap_strdup(soap, soap->labbuf); #else soap_size_block(soap, NULL, i + 1); t = soap_save_block(soap, NULL, NULL, 0); #endif if (l < minlen) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "String too short: %ld chars, minlen=%ld\n", l, minlen)); soap->error = SOAP_LENGTH; return NULL; } #ifndef WITH_LEANER if (pattern && soap->fsvalidate && (soap->error = soap->fsvalidate(soap, pattern, s))) return NULL; #else (void)pattern; #endif #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { if (flag > 0) soap->dom->text = t; else soap->dom->code = t; } #endif if (flag == 2) if (soap_s2QName(soap, t, &t, minlen, maxlen)) return NULL; return t; } #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_wstring_out(struct soap *soap, const wchar_t *s, int flag) { const char *t; char tmp; soap_wchar c; #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { soap->dom->text = soap_wchar2s(soap, s); return SOAP_OK; } #endif while ((c = *s++)) { switch (c) { case 0x09: if (flag) t = " "; else t = "\t"; break; case 0x0A: if (flag || !(soap->mode & SOAP_XML_CANONICAL)) t = " "; else t = "\n"; break; case 0x0D: t = " "; break; case '&': t = "&"; break; case '<': t = "<"; break; case '>': if (flag) t = ">"; else t = ">"; break; case '"': if (flag) t = """; else t = "\""; break; default: if (c >= 0x20 && c < 0x80) { tmp = (char)c; if (soap_send_raw(soap, &tmp, 1)) return soap->error; } else { /* check for UTF16 encoding when wchar_t is too small to hold UCS */ if (sizeof(wchar_t) < 4 && (c & 0xFC00) == 0xD800) { soap_wchar d = *s++; if ((d & 0xFC00) == 0xDC00) c = ((c - 0xD800) << 10) + (d - 0xDC00) + 0x10000; else c = 0xFFFD; /* Malformed */ } if (soap_pututf8(soap, (unsigned long)c)) return soap->error; } continue; } if (soap_send(soap, t)) return soap->error; } return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_2 SOAP_FMAC1 wchar_t * SOAP_FMAC2 soap_wstring_in(struct soap *soap, int flag, long minlen, long maxlen, const char *pattern) { wchar_t *s; int i, n = 0, f = 0; long l = 0; soap_wchar c; char *t = NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Reading wide string content\n")); if (flag <= 0 && soap->peeked && *soap->tag) { #ifndef WITH_LEAN struct soap_attribute *tp; t = soap->tmpbuf; *t = '<'; soap_strcpy(t + 1, sizeof(soap->tmpbuf) - 1, soap->tag); t += strlen(t); for (tp = soap->attributes; tp; tp = tp->next) { if (tp->visible) { size_t l = strlen(tp->name); if (t + l + 1 >= soap->tmpbuf + sizeof(soap->tmpbuf)) break; *t++ = ' '; soap_strncpy(t, sizeof(soap->tmpbuf) - (t - soap->tmpbuf), tp->name, l); t += l; if (tp->value) { l = strlen(tp->value); if (t + l + 3 >= soap->tmpbuf + sizeof(soap->tmpbuf)) break; *t++ = '='; *t++ = '"'; soap_strncpy(t, sizeof(soap->tmpbuf) - (t - soap->tmpbuf), tp->value, l); t += l; *t++ = '"'; } } } if (!soap->body) *t++ = '/'; *t++ = '>'; *t = '\0'; t = soap->tmpbuf; #endif if (soap->body) n = 1; f = 1; soap->peeked = 0; } if (soap_new_block(soap) == NULL) return NULL; for (;;) { if (!(s = (wchar_t*)soap_push_block(soap, NULL, sizeof(wchar_t)*SOAP_BLKLEN))) return NULL; for (i = 0; i < SOAP_BLKLEN; i++) { if (t) { *s++ = (wchar_t)*t++; if (!*t) t = NULL; continue; } c = soap_getutf8(soap); switch (c) { case SOAP_TT: if (n == 0) goto end; n--; *s++ = '<'; soap_unget(soap, '/'); break; case SOAP_LT: if ((!f && flag >= 0) || (f && n == 0)) goto end; n++; *s++ = '<'; break; case SOAP_GT: *s++ = '>'; break; case SOAP_QT: *s++ = '"'; break; case SOAP_AP: *s++ = '\''; break; case '/': if (n > 0) { c = soap_getutf8(soap); if (c == SOAP_GT) n--; soap_unget(soap, c); } *s++ = '/'; break; case '<': if (flag > 0) *s++ = (soap_wchar)'<'; else { *s++ = (soap_wchar)'&'; t = (char*)"lt;"; } break; case '>': if (flag > 0) *s++ = (soap_wchar)'>'; else { *s++ = (soap_wchar)'&'; t = (char*)"gt;"; } break; case '"': if (flag > 0) *s++ = (soap_wchar)'"'; else { *s++ = (soap_wchar)'&'; t = (char*)"quot;"; } break; default: if ((int)c == EOF) goto end; /* use UTF16 encoding when wchar_t is too small to hold UCS */ if (sizeof(wchar_t) < 4 && c > 0xFFFF) { soap_wchar c1, c2; c1 = 0xD800 - (0x10000 >> 10) + (c >> 10); c2 = 0xDC00 + (c & 0x3FF); c = c1; soap_unget(soap, c2); } *s++ = (wchar_t)c & 0x7FFFFFFF; } l++; if (maxlen >= 0 && l > maxlen) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "String too long: maxlen=%ld\n", maxlen)); soap->error = SOAP_LENGTH; return NULL; } } } end: soap_unget(soap, c); *s = '\0'; soap_size_block(soap, NULL, sizeof(wchar_t) * (i + 1)); if (l < minlen) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "String too short: %ld chars, minlen=%ld\n", l, minlen)); soap->error = SOAP_LENGTH; return NULL; } s = (wchar_t*)soap_save_block(soap, NULL, NULL, 0); #ifndef WITH_LEANER if (pattern && soap->fwvalidate && (soap->error = soap->fwvalidate(soap, pattern, s))) return NULL; #endif #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) soap->dom->text = soap_wchar2s(soap, s); #endif return s; } #endif #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_int2s(struct soap *soap, int n) { return soap_long2s(soap, (long)n); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outint(struct soap *soap, const char *tag, int id, const int *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_long2s(soap, (long)*p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2int(struct soap *soap, const char *s, int *p) { if (s) { long n; char *r; #ifndef WITH_NOIO #ifndef WITH_LEAN soap_reset_errno; #endif #endif n = soap_strtol(s, &r, 10); if (s == r || *r #ifndef WITH_LEAN || n != (int)n #endif #ifndef WITH_NOIO #ifndef WITH_LEAN || soap_errno == SOAP_ERANGE #endif #endif ) soap->error = SOAP_TYPE; *p = (int)n; } return soap->error; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int * SOAP_FMAC2 soap_inint(struct soap *soap, const char *tag, int *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; #ifndef WITH_LEAN if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":int") && soap_match_tag(soap, soap->type, ":short") && soap_match_tag(soap, soap->type, ":byte")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } #else (void)type; #endif p = (int*)soap_id_enter(soap, soap->id, p, t, sizeof(int), NULL, NULL, NULL, NULL); if (*soap->href) p = (int*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(int), 0, NULL, NULL); else if (p) { if (soap_s2int(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_long2s(struct soap *soap, long n) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 20), "%ld", n); return soap->tmpbuf; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outlong(struct soap *soap, const char *tag, int id, const long *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_long2s(soap, *p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2long(struct soap *soap, const char *s, long *p) { if (s) { char *r; #ifndef WITH_NOIO #ifndef WITH_LEAN soap_reset_errno; #endif #endif *p = soap_strtol(s, &r, 10); if (s == r || *r #ifndef WITH_NOIO #ifndef WITH_LEAN || soap_errno == SOAP_ERANGE #endif #endif ) soap->error = SOAP_TYPE; } return soap->error; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 long * SOAP_FMAC2 soap_inlong(struct soap *soap, const char *tag, long *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; #ifndef WITH_LEAN if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":int") && soap_match_tag(soap, soap->type, ":short") && soap_match_tag(soap, soap->type, ":byte")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } #else (void)type; #endif p = (long*)soap_id_enter(soap, soap->id, p, t, sizeof(long), NULL, NULL, NULL, NULL); if (*soap->href) p = (long*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(long), 0, NULL, NULL); else if (p) { if (soap_s2long(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 const char* SOAP_FMAC2 soap_LONG642s(struct soap *soap, LONG64 n) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 20), SOAP_LONG_FORMAT, n); return soap->tmpbuf; } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 int SOAP_FMAC2 soap_outLONG64(struct soap *soap, const char *tag, int id, const LONG64 *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_LONG642s(soap, *p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 int SOAP_FMAC2 soap_s2LONG64(struct soap *soap, const char *s, LONG64 *p) { if (s) { char *r; #ifndef WITH_NOIO #ifndef WITH_LEAN soap_reset_errno; #endif #endif #ifdef HAVE_STRTOLL *p = soap_strtoll(s, &r, 10); #else *p = (LONG64)soap_strtol(s, &r, 10); #endif if (s == r || *r #ifndef WITH_NOIO #ifndef WITH_LEAN || soap_errno == SOAP_ERANGE #endif #endif ) soap->error = SOAP_TYPE; } return soap->error; } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 LONG64 * SOAP_FMAC2 soap_inLONG64(struct soap *soap, const char *tag, LONG64 *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; #ifndef WITH_LEAN if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":integer") && soap_match_tag(soap, soap->type, ":positiveInteger") && soap_match_tag(soap, soap->type, ":negativeInteger") && soap_match_tag(soap, soap->type, ":nonPositiveInteger") && soap_match_tag(soap, soap->type, ":nonNegativeInteger") && soap_match_tag(soap, soap->type, ":long") && soap_match_tag(soap, soap->type, ":int") && soap_match_tag(soap, soap->type, ":short") && soap_match_tag(soap, soap->type, ":byte")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } #endif p = (LONG64*)soap_id_enter(soap, soap->id, p, t, sizeof(LONG64), NULL, NULL, NULL, NULL); if (*soap->href) p = (LONG64*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(LONG64), 0, NULL, NULL); else if (p) { if (soap_s2LONG64(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_byte2s(struct soap *soap, char n) { return soap_long2s(soap, (long)n); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outbyte(struct soap *soap, const char *tag, int id, const char *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_long2s(soap, (long)*p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2byte(struct soap *soap, const char *s, char *p) { if (s) { long n; char *r; n = soap_strtol(s, &r, 10); if (s == r || *r || n < -128 || n > 127) soap->error = SOAP_TYPE; *p = (char)n; } return soap->error; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 char * SOAP_FMAC2 soap_inbyte(struct soap *soap, const char *tag, char *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; #ifndef WITH_LEAN if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":byte")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } #else (void)type; #endif p = (char*)soap_id_enter(soap, soap->id, p, t, sizeof(char), NULL, NULL, NULL, NULL); if (*soap->href) p = (char*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(char), 0, NULL, NULL); else if (p) { if (soap_s2byte(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_short2s(struct soap *soap, short n) { return soap_long2s(soap, (long)n); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outshort(struct soap *soap, const char *tag, int id, const short *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_long2s(soap, (long)*p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2short(struct soap *soap, const char *s, short *p) { if (s) { long n; char *r; n = soap_strtol(s, &r, 10); if (s == r || *r || n < -32768 || n > 32767) soap->error = SOAP_TYPE; *p = (short)n; } return soap->error; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 short * SOAP_FMAC2 soap_inshort(struct soap *soap, const char *tag, short *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; #ifndef WITH_LEAN if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":short") && soap_match_tag(soap, soap->type, ":byte")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } #else (void)type; #endif p = (short*)soap_id_enter(soap, soap->id, p, t, sizeof(short), NULL, NULL, NULL, NULL); if (*soap->href) p = (short*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(short), 0, NULL, NULL); else if (p) { if (soap_s2short(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_float2s(struct soap *soap, float n) { #if !defined(WITH_C_LOCALE) || !defined(HAVE_SPRINTF_L) char *s; #endif if (soap_isnan((double)n)) return "NaN"; if (soap_ispinff(n)) return "INF"; if (soap_isninff(n)) return "-INF"; #if defined(WITH_C_LOCALE) && defined(HAVE_SPRINTF_L) # ifdef WIN32 _sprintf_s_l(soap->tmpbuf, _countof(soap->tmpbuf), soap->float_format, SOAP_LOCALE(soap), n); # else sprintf_l(soap->tmpbuf, SOAP_LOCALE(soap), soap->float_format, n); # endif #else (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 20), soap->float_format, n); s = strchr(soap->tmpbuf, ','); /* convert decimal comma to DP */ if (s) *s = '.'; #endif return soap->tmpbuf; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outfloat(struct soap *soap, const char *tag, int id, const float *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_float2s(soap, *p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2float(struct soap *soap, const char *s, float *p) { if (s) { if (!*s) return soap->error = SOAP_TYPE; if (!soap_tag_cmp(s, "INF")) *p = FLT_PINFTY; else if (!soap_tag_cmp(s, "+INF")) *p = FLT_PINFTY; else if (!soap_tag_cmp(s, "-INF")) *p = FLT_NINFTY; else if (!soap_tag_cmp(s, "NaN")) *p = FLT_NAN; else { /* On some systems strtof requires -std=c99 or does not even link: so we try to use strtod first */ #if defined(WITH_C_LOCALE) && defined(HAVE_STRTOD_L) char *r; # ifdef WIN32 *p = (float)_strtod_l(s, &r, SOAP_LOCALE(soap)); # else *p = (float)strtod_l(s, &r, SOAP_LOCALE(soap)); # endif if (*r) soap->error = SOAP_TYPE; #elif defined(HAVE_STRTOD) char *r; *p = (float)strtod(s, &r); if (*r) soap->error = SOAP_TYPE; #elif defined(WITH_C_LOCALE) && defined(HAVE_STRTOF_L) char *r; *p = strtof_l((char*)s, &r, SOAP_LOCALE(soap)); if (*r) soap->error = SOAP_TYPE; #elif defined(HAVE_STRTOF) char *r; *p = strtof((char*)s, &r); if (*r) soap->error = SOAP_TYPE; #elif defined(WITH_C_LOCALE) && defined(HAVE_SSCANF_L) && !defined(HAVE_STRTOF_L) && !defined(HAVE_STRTOD_L) double n; if (sscanf_l(s, SOAP_LOCALE(soap), "%lf", &n) != 1) soap->error = SOAP_TYPE; *p = (float)n; #elif defined(HAVE_SSCANF) double n; if (sscanf(s, "%lf", &n) != 1) soap->error = SOAP_TYPE; *p = (float)n; #else soap->error = SOAP_TYPE; #endif } } return soap->error; } #endif /******************************************************************************/ #ifndef WITH_LEAN static int soap_isnumeric(struct soap *soap, const char *type) { if (soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":float") && soap_match_tag(soap, soap->type, ":double") && soap_match_tag(soap, soap->type, ":decimal") && soap_match_tag(soap, soap->type, ":integer") && soap_match_tag(soap, soap->type, ":positiveInteger") && soap_match_tag(soap, soap->type, ":negativeInteger") && soap_match_tag(soap, soap->type, ":nonPositiveInteger") && soap_match_tag(soap, soap->type, ":nonNegativeInteger") && soap_match_tag(soap, soap->type, ":long") && soap_match_tag(soap, soap->type, ":int") && soap_match_tag(soap, soap->type, ":short") && soap_match_tag(soap, soap->type, ":byte") && soap_match_tag(soap, soap->type, ":unsignedLong") && soap_match_tag(soap, soap->type, ":unsignedInt") && soap_match_tag(soap, soap->type, ":unsignedShort") && soap_match_tag(soap, soap->type, ":unsignedByte")) { soap->error = SOAP_TYPE; soap_revert(soap); return SOAP_ERR; } return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 float * SOAP_FMAC2 soap_infloat(struct soap *soap, const char *tag, float *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; #ifndef WITH_LEAN if (*soap->type != '\0' && soap_isnumeric(soap, type)) return NULL; #else (void)type; #endif p = (float*)soap_id_enter(soap, soap->id, p, t, sizeof(float), NULL, NULL, NULL, NULL); if (*soap->href) p = (float*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(float), 0, NULL, NULL); else if (p) { if (soap_s2float(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_double2s(struct soap *soap, double n) { #if !defined(WITH_C_LOCALE) || !defined(HAVE_SPRINTF_L) char *s; #endif if (soap_isnan(n)) return "NaN"; if (soap_ispinfd(n)) return "INF"; if (soap_isninfd(n)) return "-INF"; #if defined(WITH_C_LOCALE) && defined(HAVE_SPRINTF_L) # ifdef WIN32 _sprintf_s_l(soap->tmpbuf, _countof(soap->tmpbuf), soap->double_format, SOAP_LOCALE(soap), n); # else sprintf_l(soap->tmpbuf, SOAP_LOCALE(soap), soap->double_format, n); # endif #else (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 40), soap->double_format, n); s = strchr(soap->tmpbuf, ','); /* convert decimal comma to DP */ if (s) *s = '.'; #endif return soap->tmpbuf; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outdouble(struct soap *soap, const char *tag, int id, const double *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_double2s(soap, *p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2double(struct soap *soap, const char *s, double *p) { if (s) { if (!*s) return soap->error = SOAP_TYPE; if (!soap_tag_cmp(s, "INF")) *p = DBL_PINFTY; else if (!soap_tag_cmp(s, "+INF")) *p = DBL_PINFTY; else if (!soap_tag_cmp(s, "-INF")) *p = DBL_NINFTY; else if (!soap_tag_cmp(s, "NaN")) *p = DBL_NAN; else { #if defined(WITH_C_LOCALE) && defined(HAVE_STRTOD_L) char *r; # ifdef WIN32 *p = _strtod_l(s, &r, SOAP_LOCALE(soap)); # else *p = strtod_l(s, &r, SOAP_LOCALE(soap)); # endif if (*r) soap->error = SOAP_TYPE; #elif defined(HAVE_STRTOD) char *r; *p = strtod(s, &r); if (*r) soap->error = SOAP_TYPE; #elif defined(WITH_C_LOCALE) && defined(HAVE_SSCANF_L) && !defined(HAVE_STRTOF_L) && !defined(HAVE_STRTOD_L) if (sscanf_l(s, SOAP_LOCALE(soap), "%lf", p) != 1) soap->error = SOAP_TYPE; #elif defined(HAVE_SSCANF) if (sscanf(s, "%lf", p) != 1) soap->error = SOAP_TYPE; #else soap->error = SOAP_TYPE; #endif } } return soap->error; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 double * SOAP_FMAC2 soap_indouble(struct soap *soap, const char *tag, double *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; #ifndef WITH_LEAN if (*soap->type != '\0' && soap_isnumeric(soap, type)) return NULL; #else (void)type; #endif p = (double*)soap_id_enter(soap, soap->id, p, t, sizeof(double), NULL, NULL, NULL, NULL); if (*soap->href) p = (double*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(double), 0, NULL, NULL); else if (p) { if (soap_s2double(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedByte2s(struct soap *soap, unsigned char n) { return soap_unsignedLong2s(soap, (unsigned long)n); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outunsignedByte(struct soap *soap, const char *tag, int id, const unsigned char *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_unsignedLong2s(soap, (unsigned long)*p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedByte(struct soap *soap, const char *s, unsigned char *p) { if (s) { unsigned long n; char *r; n = soap_strtoul(s, &r, 10); if (s == r || *r || n > 255) soap->error = SOAP_TYPE; *p = (unsigned char)n; } return soap->error; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 unsigned char * SOAP_FMAC2 soap_inunsignedByte(struct soap *soap, const char *tag, unsigned char *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; #ifndef WITH_LEAN if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":unsignedByte")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } #else (void)type; #endif p = (unsigned char*)soap_id_enter(soap, soap->id, p, t, sizeof(unsigned char), NULL, NULL, NULL, NULL); if (*soap->href) p = (unsigned char*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(unsigned char), 0, NULL, NULL); else if (p) { if (soap_s2unsignedByte(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedShort2s(struct soap *soap, unsigned short n) { return soap_unsignedLong2s(soap, (unsigned long)n); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outunsignedShort(struct soap *soap, const char *tag, int id, const unsigned short *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_unsignedLong2s(soap, (unsigned long)*p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedShort(struct soap *soap, const char *s, unsigned short *p) { if (s) { unsigned long n; char *r; n = soap_strtoul(s, &r, 10); if (s == r || *r || n > 65535) soap->error = SOAP_TYPE; *p = (unsigned short)n; } return soap->error; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 unsigned short * SOAP_FMAC2 soap_inunsignedShort(struct soap *soap, const char *tag, unsigned short *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; #ifndef WITH_LEAN if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":unsignedShort") && soap_match_tag(soap, soap->type, ":unsignedByte")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } #else (void)type; #endif p = (unsigned short*)soap_id_enter(soap, soap->id, p, t, sizeof(unsigned short), NULL, NULL, NULL, NULL); if (*soap->href) p = (unsigned short*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(unsigned short), 0, NULL, NULL); else if (p) { if (soap_s2unsignedShort(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedInt2s(struct soap *soap, unsigned int n) { return soap_unsignedLong2s(soap, (unsigned long)n); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outunsignedInt(struct soap *soap, const char *tag, int id, const unsigned int *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_unsignedLong2s(soap, (unsigned long)*p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedInt(struct soap *soap, const char *s, unsigned int *p) { if (s) { char *r; #ifndef WITH_NOIO #ifndef WITH_LEAN soap_reset_errno; #endif #endif *p = (unsigned int)soap_strtoul(s, &r, 10); if (s == r || *r #ifndef WITH_NOIO #ifndef WITH_LEAN || soap_errno == SOAP_ERANGE #endif #endif ) soap->error = SOAP_TYPE; } return soap->error; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 unsigned int * SOAP_FMAC2 soap_inunsignedInt(struct soap *soap, const char *tag, unsigned int *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; #ifndef WITH_LEAN if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":unsignedInt") && soap_match_tag(soap, soap->type, ":unsignedShort") && soap_match_tag(soap, soap->type, ":unsignedByte")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } #else (void)type; #endif p = (unsigned int*)soap_id_enter(soap, soap->id, p, t, sizeof(unsigned int), NULL, NULL, NULL, NULL); if (*soap->href) p = (unsigned int*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(unsigned int), 0, NULL, NULL); else if (p) { if (soap_s2unsignedInt(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedLong2s(struct soap *soap, unsigned long n) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 20), "%lu", n); return soap->tmpbuf; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outunsignedLong(struct soap *soap, const char *tag, int id, const unsigned long *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_unsignedLong2s(soap, *p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedLong(struct soap *soap, const char *s, unsigned long *p) { if (s) { char *r; #ifndef WITH_NOIO #ifndef WITH_LEAN soap_reset_errno; #endif #endif *p = soap_strtoul(s, &r, 10); if (s == r || *r #ifndef WITH_NOIO #ifndef WITH_LEAN || soap_errno == SOAP_ERANGE #endif #endif ) soap->error = SOAP_TYPE; } return soap->error; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 unsigned long * SOAP_FMAC2 soap_inunsignedLong(struct soap *soap, const char *tag, unsigned long *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; #ifndef WITH_LEAN if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":unsignedInt") && soap_match_tag(soap, soap->type, ":unsignedShort") && soap_match_tag(soap, soap->type, ":unsignedByte")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } #else (void)type; #endif p = (unsigned long*)soap_id_enter(soap, soap->id, p, t, sizeof(unsigned long), NULL, NULL, NULL, NULL); if (*soap->href) p = (unsigned long*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(unsigned long), 0, NULL, NULL); else if (p) { if (soap_s2unsignedLong(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_ULONG642s(struct soap *soap, ULONG64 n) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 20), SOAP_ULONG_FORMAT, n); return soap->tmpbuf; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outULONG64(struct soap *soap, const char *tag, int id, const ULONG64 *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_ULONG642s(soap, *p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2ULONG64(struct soap *soap, const char *s, ULONG64 *p) { if (s) { char *r; #ifndef WITH_NOIO #ifndef WITH_LEAN soap_reset_errno; #endif #endif #ifdef HAVE_STRTOULL *p = soap_strtoull(s, &r, 10); #else *p = (ULONG64)soap_strtoul(s, &r, 10); #endif if (s == r || *r #ifndef WITH_NOIO #ifndef WITH_LEAN || soap_errno == SOAP_ERANGE #endif #endif ) soap->error = SOAP_TYPE; } return soap->error; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 ULONG64 * SOAP_FMAC2 soap_inULONG64(struct soap *soap, const char *tag, ULONG64 *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":positiveInteger") && soap_match_tag(soap, soap->type, ":nonNegativeInteger") && soap_match_tag(soap, soap->type, ":unsignedLong") && soap_match_tag(soap, soap->type, ":unsignedInt") && soap_match_tag(soap, soap->type, ":unsignedShort") && soap_match_tag(soap, soap->type, ":unsignedByte")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } p = (ULONG64*)soap_id_enter(soap, soap->id, p, t, sizeof(ULONG64), NULL, NULL, NULL, NULL); if (*soap->href) p = (ULONG64*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(ULONG64), 0, NULL, NULL); else if (p) { if (soap_s2ULONG64(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2string(struct soap *soap, const char *s, char **t, long minlen, long maxlen) { if (s) { const char *r = soap_string(soap, s, minlen, maxlen); if (r && !(*t = soap_strdup(soap, r))) return soap->error = SOAP_EOM; } return soap->error; } #endif /******************************************************************************/ #ifndef WITH_COMPAT #ifdef __cplusplus #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2std__string(struct soap *soap, const char *s, std::string *t, long minlen, long maxlen) { if (s) { const char *r = soap_string(soap, s, minlen, maxlen); if (r) t->assign(r); } return soap->error; } #endif #endif #endif /******************************************************************************/ #ifndef PALM_2 static const char* soap_string(struct soap *soap, const char *s, long minlen, long maxlen) { if (s) { if (minlen > 0 || maxlen >= 0) { long l; if ((soap->mode & SOAP_C_UTFSTRING)) l = (long)soap_utf8len(s); else l = (long)strlen(s); if (l > maxlen || l < minlen) { soap->error = SOAP_LENGTH; return NULL; } } } return s; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2QName(struct soap *soap, const char *s, char **t, long minlen, long maxlen) { if (s) { const char *r = soap_QName(soap, s, minlen, maxlen); if (r && !(*t = soap_strdup(soap, r))) return soap->error = SOAP_EOM; } return soap->error; } #endif /******************************************************************************/ #ifndef WITH_COMPAT #ifdef __cplusplus #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_s2std__QName(struct soap *soap, const char *s, std::string *t, long minlen, long maxlen) { if (s) { const char *r = soap_QName(soap, s, minlen, maxlen); if (r) t->assign(r); } return soap->error; } #endif #endif #endif /******************************************************************************/ #ifndef PALM_2 static const char* soap_QName(struct soap *soap, const char *s, long minlen, long maxlen) { if (s) { #ifndef WITH_FAST char *b; #endif if (minlen > 0 || maxlen >= 0) { long l; if ((soap->mode & SOAP_C_UTFSTRING)) l = (long)soap_utf8len(s); else l = (long)strlen(s); if (l > maxlen || l < minlen) { soap->error = SOAP_LENGTH; return NULL; } } #ifdef WITH_FAST soap->labidx = 0; #else if (soap_new_block(soap) == NULL) return NULL; #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Normalized namespace(s) of QNames '%s'", s)); /* convert (by prefix normalize prefix) all QNames in s */ for (;;) { size_t n; struct soap_nlist *np; const char *p = NULL; short flag = 0; const char *r = NULL; size_t m = 0; #ifndef WITH_FAST size_t k = 0; #endif /* skip blanks */ while (*s && soap_blank((soap_wchar)*s)) s++; if (!*s) break; /* find next QName */ n = 1; while (s[n] && !soap_blank((soap_wchar)s[n])) n++; np = soap->nlist; /* if there is no namespace stack, or prefix is "#" or "xml" then copy string */ if (!np || *s == '#' || !strncmp(s, "xml:", 4)) { r = s; m = n; } else /* we normalize the QName by replacing its prefix */ { const char *q; for (p = s; *p && p < s + n; p++) if (*p == ':') break; if (*p == ':') { size_t k = p - s; while (np && (strncmp(np->id, s, k) || np->id[k])) np = np->next; p++; } else { while (np && *np->id) np = np->next; p = s; } /* replace prefix */ if (np) { if (np->index >= 0 && soap->local_namespaces && (q = soap->local_namespaces[np->index].id)) { size_t k = strlen(q); if (q[k-1] != '_') { r = q; m = k; } else { flag = 1; r = soap->local_namespaces[np->index].ns; m = strlen(r); } } else if (np->ns) { flag = 1; r = np->ns; m = strlen(r); } else { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\nNamespace prefix of '%s' not defined (index=%d, URI='%s')\n", s, np->index, np->ns ? np->ns : SOAP_STR_EOS)); soap->error = SOAP_NAMESPACE; return NULL; } } else if (s[n]) /* no namespace, part of string */ { r = s; m = n; } else /* no namespace: assume "" namespace */ { flag = 1; } } #ifdef WITH_FAST if ((flag && soap_append_lab(soap, "\"", 1)) || (m && soap_append_lab(soap, r, m)) || (flag && soap_append_lab(soap, "\"", 1)) || (p && (soap_append_lab(soap, ":", 1) || soap_append_lab(soap, p, n - (p-s))))) return NULL; #else k = 2*flag + m + (p ? n - (p-s) + 1 : 0) + (s[n] != '\0'); b = (char*)soap_push_block(soap, NULL, k); if (!b) return NULL; if (flag) *b++ = '"'; if (m) { if (soap_memcpy((void*)b, k, (const void*)r, m)) { soap->error = SOAP_EOM; return NULL; } b += m; } if (flag) *b++ = '"'; if (p) { *b++ = ':'; if (soap_memcpy((void*)b, k - m - flag - 1, (const void*)p, n - (p-s))) { soap->error = SOAP_EOM; return NULL; } b += n - (p-s); } #endif /* advance to next and add spacing */ s += n; if (*s) { #ifdef WITH_FAST if (soap_append_lab(soap, " ", 1)) return NULL; #else *b = ' '; #endif } } #ifdef WITH_FAST if (soap_append_lab(soap, SOAP_STR_EOS, 1)) return NULL; return soap->labbuf; #else b = (char*)soap_push_block(soap, NULL, 1); if (!b) return NULL; *b = '\0'; return (char*)soap_save_block(soap, NULL, NULL, 0); #endif } return NULL; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char* SOAP_FMAC2 soap_QName2s(struct soap *soap, const char *s) { const char *t = NULL; if (s) { #ifdef WITH_FAST soap->labidx = 0; #else char *b; if (soap_new_block(soap) == NULL) return NULL; #endif for (;;) { size_t n; const char *q = NULL; const char *r = NULL; size_t m = 0; #ifndef WITH_FAST size_t k = 0; #endif /* skip blanks */ while (*s && soap_blank((soap_wchar)*s)) s++; if (!*s) break; /* find next QName */ n = 0; while (s[n] && !soap_blank((soap_wchar)s[n])) n++; /* normal prefix: pass string as is */ if (*s != '"') { #ifndef WITH_LEAN if ((soap->mode & SOAP_XML_CANONICAL)) soap_utilize_ns(soap, s); if ((soap->mode & SOAP_XML_DEFAULTNS)) { r = strchr(s, ':'); if (r && soap->nlist && !strncmp(soap->nlist->id, s, r - s) && !soap->nlist->id[r - s]) { n -= r - s + 1; s = r + 1; } } #endif r = s; m = n + 1; } else /* URL-based string prefix */ { s++; q = strchr(s, '"'); if (q) { struct Namespace *p = soap->local_namespaces; if (p) { for (; p->id; p++) { if (p->ns) if (!soap_tag_cmp(s, p->ns)) break; if (p->in) if (!soap_tag_cmp(s, p->in)) break; } } q++; /* URL is in the namespace table? */ if (p && p->id) { r = p->id; #ifndef WITH_LEAN if ((soap->mode & SOAP_XML_DEFAULTNS) && soap->nlist && !strcmp(soap->nlist->id, r)) q++; else #endif m = strlen(r); } else /* not in namespace table: create xmlns binding */ { char *x = soap_strdup(soap, s); x[q - s - 1] = '\0'; (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 27), "xmlns:_%d", soap->idnum++); soap_set_attr(soap, soap->tmpbuf, x, 1); r = soap->tmpbuf + 6; m = strlen(r); } } } /* copy normalized QName into buffer, including the ending blank or NUL */ #ifdef WITH_FAST if ((m && soap_append_lab(soap, r, m)) || (q && soap_append_lab(soap, q, n - (q - s)))) return NULL; #else k = m + (q ? n - (q - s) : 0); b = (char*)soap_push_block(soap, NULL, k); if (soap_memcpy((void*)b, k, (const void*)r, m)) { soap->error = SOAP_EOM; return NULL; } b += m; if (q) { if (soap_memcpy((void*)b, k - m, (const void*)q, n - (q - s))) { soap->error = SOAP_EOM; return NULL; } b += n - (q - s); } #endif /* advance to next */ s += n; } #ifdef WITH_FAST t = soap_strdup(soap, soap->labbuf); #else t = (char*)soap_save_block(soap, NULL, NULL, 0); #endif } return t; } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 int SOAP_FMAC2 soap_s2wchar(struct soap *soap, const char *s, wchar_t **t, long minlen, long maxlen) { if (s) { const wchar_t *r = soap_wstring(soap, s, minlen, maxlen); if (r && !(*t = soap_wstrdup(soap, r))) return soap->error = SOAP_EOM; } return soap->error; } #endif /******************************************************************************/ #ifndef WITH_COMPAT #ifdef __cplusplus #ifndef WITH_LEAN SOAP_FMAC1 int SOAP_FMAC2 soap_s2std__wstring(struct soap *soap, const char *s, std::wstring *t, long minlen, long maxlen) { if (s) { const wchar_t *r = soap_wstring(soap, s, minlen, maxlen); if (r) t->assign(r); } return soap->error; } #endif #endif #endif /******************************************************************************/ #ifndef WITH_LEAN static const wchar_t* soap_wstring(struct soap *soap, const char *s, long minlen, long maxlen) { if (s) { long l; wchar_t wc; soap->labidx = 0; if (soap->mode & SOAP_ENC_LATIN) { wchar_t *r; if (soap_append_lab(soap, NULL, sizeof(wchar_t) * (strlen(s) + 1))) return NULL; r = (wchar_t*)soap->labbuf; while (*s) *r++ = (wchar_t)*s++; } else { /* Convert UTF8 to wchar */ while (*s) { soap_wchar c, c1, c2, c3, c4; c = (unsigned char)*s++; if (c < 0x80) wc = (wchar_t)c; else { c1 = (soap_wchar)*s++ & 0x3F; if (c < 0xE0) wc = (wchar_t)(((soap_wchar)(c & 0x1F) << 6) | c1); else { c2 = (soap_wchar)*s++ & 0x3F; if (c < 0xF0) wc = (wchar_t)(((soap_wchar)(c & 0x0F) << 12) | (c1 << 6) | c2); else { c3 = (soap_wchar)*s++ & 0x3F; if (c < 0xF8) wc = (wchar_t)(((soap_wchar)(c & 0x07) << 18) | (c1 << 12) | (c2 << 6) | c3); else { c4 = (soap_wchar)*s++ & 0x3F; if (c < 0xFC) wc = (wchar_t)(((soap_wchar)(c & 0x03) << 24) | (c1 << 18) | (c2 << 12) | (c3 << 6) | c4); else wc = (wchar_t)(((soap_wchar)(c & 0x01) << 30) | (c1 << 24) | (c2 << 18) | (c3 << 12) | (c4 << 6) | (soap_wchar)(*s++ & 0x3F)); } } } } if (soap_append_lab(soap, (const char*)&wc, sizeof(wc))) return NULL; } } l = (long)(soap->labidx / sizeof(wchar_t)); wc = L'\0'; if (soap_append_lab(soap, (const char*)&wc, sizeof(wc))) return NULL; if ((maxlen >= 0 && l > maxlen) || l < minlen) { soap->error = SOAP_LENGTH; return NULL; } return (wchar_t*)soap->labbuf; } return NULL; } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 const char* SOAP_FMAC2 soap_wchar2s(struct soap *soap, const wchar_t *s) { soap_wchar c; char *r, *t; const wchar_t *q = s; size_t n = 0; if (!s) return NULL; while ((c = *q++)) { if (c > 0 && c < 0x80) n++; else n += 6; } r = t = (char*)soap_malloc(soap, n + 1); if (r) { /* Convert wchar to UTF8 */ while ((c = *s++)) { if (c > 0 && c < 0x80) *t++ = (char)c; else { if (c < 0x0800) *t++ = (char)(0xC0 | ((c >> 6) & 0x1F)); else { if (c < 0x010000) *t++ = (char)(0xE0 | ((c >> 12) & 0x0F)); else { if (c < 0x200000) *t++ = (char)(0xF0 | ((c >> 18) & 0x07)); else { if (c < 0x04000000) *t++ = (char)(0xF8 | ((c >> 24) & 0x03)); else { *t++ = (char)(0xFC | ((c >> 30) & 0x01)); *t++ = (char)(0x80 | ((c >> 24) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 18) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 12) & 0x3F)); } *t++ = (char)(0x80 | ((c >> 6) & 0x3F)); } *t++ = (char)(0x80 | (c & 0x3F)); } } *t = '\0'; } return r; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outstring(struct soap *soap, const char *tag, int id, char *const*p, const char *type, int n) { id = soap_element_id(soap, tag, id, *p, NULL, 0, type, n, NULL); if (id < 0) return soap->error; if (!**p && (soap->mode & SOAP_C_NILSTRING)) return soap_element_null(soap, tag, id, type); if (soap_element_begin_out(soap, tag, id, type) || soap_string_out(soap, *p, 0) || soap_element_end_out(soap, tag)) return soap->error; return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 char ** SOAP_FMAC2 soap_instring(struct soap *soap, const char *tag, char **p, const char *type, int t, int flag, long minlen, long maxlen, const char *pattern) { (void)type; if (soap_element_begin_in(soap, tag, 1, NULL)) { if (!tag || *tag != '-' || soap->error != SOAP_NO_TAG) return NULL; soap->error = SOAP_OK; } if (!p) { if (!(p = (char**)soap_malloc(soap, sizeof(char*)))) return NULL; } if (soap->null) *p = NULL; else if (soap->body) { *p = soap_string_in(soap, flag, minlen, maxlen, pattern); if (!*p || !(char*)soap_id_enter(soap, soap->id, *p, t, sizeof(char*), NULL, NULL, NULL, NULL)) return NULL; if (!**p && tag && *tag == '-') { soap->error = SOAP_NO_TAG; return NULL; } } else if (tag && *tag == '-') { soap->error = SOAP_NO_TAG; return NULL; } else if (!*soap->href) { if (minlen > 0) { soap->error = SOAP_LENGTH; return NULL; } *p = soap_strdup(soap, SOAP_STR_EOS); } if (*soap->href) p = (char**)soap_id_lookup(soap, soap->href, (void**)p, t, sizeof(char**), 0, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outwstring(struct soap *soap, const char *tag, int id, wchar_t *const*p, const char *type, int n) { id = soap_element_id(soap, tag, id, *p, NULL, 0, type, n, NULL); if (id < 0) return soap->error; if (!**p && (soap->mode & SOAP_C_NILSTRING)) return soap_element_null(soap, tag, id, type); if (soap_element_begin_out(soap, tag, id, type) || soap_wstring_out(soap, *p, 0) || soap_element_end_out(soap, tag)) return soap->error; return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_2 SOAP_FMAC1 wchar_t ** SOAP_FMAC2 soap_inwstring(struct soap *soap, const char *tag, wchar_t **p, const char *type, int t, long minlen, long maxlen, const char *pattern) { (void)type; if (soap_element_begin_in(soap, tag, 1, NULL)) { if (!tag || *tag != '-' || soap->error != SOAP_NO_TAG) return NULL; soap->error = SOAP_OK; } if (!p) { if (!(p = (wchar_t**)soap_malloc(soap, sizeof(wchar_t*)))) return NULL; } if (soap->null) *p = NULL; else if (soap->body) { *p = soap_wstring_in(soap, 1, minlen, maxlen, pattern); if (!*p || !(wchar_t*)soap_id_enter(soap, soap->id, *p, t, sizeof(wchar_t*), NULL, NULL, NULL, NULL)) return NULL; if (!**p && tag && *tag == '-') { soap->error = SOAP_NO_TAG; return NULL; } } else if (tag && *tag == '-') { soap->error = SOAP_NO_TAG; return NULL; } else if (!*soap->href) { if (minlen > 0) { soap->error = SOAP_LENGTH; return NULL; } *p = soap_wstrdup(soap, (wchar_t*)SOAP_STR_EOS); } if (*soap->href) p = (wchar_t**)soap_id_lookup(soap, soap->href, (void**)p, t, sizeof(wchar_t**), 0, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif #endif /******************************************************************************/ #ifndef WITH_LEAN #ifdef UNDER_CE /* WinCE mktime (based on the mingw-runtime, public domain) */ #define __FILETIME_to_ll(f) ((long long)(f).dwHighDateTime << 32 | (long long)(f).dwLowDateTime) static time_t mktime(struct tm *pt) { SYSTEMTIME s, s1, s2; FILETIME f, f1, f2; long long diff; GetSystemTime(&s1); GetLocalTime(&s2); SystemTimeToFileTime(&s1, &f1); SystemTimeToFileTime(&s2, &f2); diff = (__FILETIME_to_ll(f2) - __FILETIME_to_ll(f1)) / 10000000LL; s.wYear = pt->tm_year + 1900; s.wMonth = pt->tm_mon + 1; s.wDayOfWeek = pt->tm_wday; s.wDay = pt->tm_mday; s.wHour = pt->tm_hour; s.wMinute = pt->tm_min; s.wSecond = pt->tm_sec; s.wMilliseconds = 0; SystemTimeToFileTime(&s, &f); return (time_t)((__FILETIME_to_ll(f) - 116444736000000000LL) / 10000000LL) - (time_t)diff; } #endif #endif /******************************************************************************/ #ifndef WITH_LEAN #ifdef UNDER_CE /* WinCE gmtime_r (based on the mingw-runtime, public domain) */ #define HAVE_GMTIME_R static struct tm* gmtime_r(const time_t *t, struct tm *pt) { FILETIME f, f1, f2; SYSTEMTIME s, s1 = {0}; long long time = (long long)(*t) * 10000000LL + 116444736000000000LL; f.dwHighDateTime = (DWORD)((time >> 32) & 0x00000000FFFFFFFF); f.dwLowDateTime = (DWORD)(time & 0x00000000FFFFFFFF); FileTimeToSystemTime(&f, &s); pt->tm_year = s.wYear - 1900; pt->tm_mon = s.wMonth - 1; pt->tm_wday = s.wDayOfWeek; pt->tm_mday = s.wDay; s1.wYear = s.wYear; s1.wMonth = 1; s1.wDayOfWeek = 1; s1.wDay = 1; SystemTimeToFileTime(&s1, &f1); SystemTimeToFileTime(&s, &f2); pt->tm_yday = (((__FILETIME_to_ll(f2) - __FILETIME_to_ll(f1)) / 10000000LL) / (60 * 60 * 24)); pt->tm_hour = s.wHour; pt->tm_min = s.wMinute; pt->tm_sec = s.wSecond; pt->tm_isdst = 0; return pt; } #endif #endif /******************************************************************************/ #ifndef WITH_LEAN #ifdef UNDER_CE /* WinCE very simple strftime for format "%Y-%m-%dT%H:%M:%SZ", note: %F and %T not supported by MS */ static size_t strftime(char *buf, size_t len, const char *format, const struct tm *pT) { (void)len; (void)format; #ifndef WITH_NOZONE (SOAP_SNPRINTF(buf, len, 20), "%04d-%02d-%02dT%02d:%02d:%02dZ", pT->tm_year + 1900, pT->tm_mon + 1, pT->tm_mday, pT->tm_hour, pT->tm_min, pT->tm_sec); #else (SOAP_SNPRINTF(buf, len, 20), "%04d-%02d-%02dT%02d:%02d:%02d", pT->tm_year + 1900, pT->tm_mon + 1, pT->tm_mday, pT->tm_hour, pT->tm_min, pT->tm_sec); #endif return len; } #endif #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 time_t SOAP_FMAC2 soap_timegm(struct tm *T) { #if defined(HAVE_TIMEGM) return timegm(T); #else time_t t, g, z; struct tm tm; #ifndef HAVE_GMTIME_R struct tm *tp; #endif t = mktime(T); if (t == (time_t)-1) return (time_t)-1; #ifdef HAVE_GMTIME_R if (gmtime_r(&t, &tm) == SOAP_FUNC_R_ERR) return (time_t)-1; #else tp = gmtime(&t); if (!tp) return (time_t)-1; tm = *tp; #endif tm.tm_isdst = 0; g = mktime(&tm); if (g == (time_t)-1) return (time_t)-1; z = g - t; return t - z; #endif } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 const char* SOAP_FMAC2 soap_dateTime2s(struct soap *soap, time_t n) { struct tm T, *pT = &T; #if defined(HAVE_GMTIME_R) && !defined(WITH_NOZONE) if (gmtime_r(&n, pT) != SOAP_FUNC_R_ERR) strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%SZ", pT); #elif defined(HAVE_GMTIME) && !defined(WITH_NOZONE) if ((pT = gmtime(&n))) strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%SZ", pT); #elif (defined(HAVE_TM_GMTOFF) || defined(HAVE_STRUCT_TM_TM_GMTOFF) || defined(HAVE_STRUCT_TM___TM_GMTOFF)) && !defined(WITH_NOZONE) #if defined(HAVE_LOCALTIME_R) if (localtime_r(&n, pT) != SOAP_FUNC_R_ERR) { strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S%z", pT); soap_memmove(soap->tmpbuf + 23, sizeof(soap->tmpbuf) - 23, soap->tmpbuf + 22, 3); /* 2000-03-01T02:00:00+0300 */ soap->tmpbuf[22] = ':'; /* 2000-03-01T02:00:00+03:00 */ } #else if ((pT = localtime(&n))) { strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S%z", pT); soap_memmove(soap->tmpbuf + 23, sizeof(soap->tmpbuf) - 23, soap->tmpbuf + 22, 3); /* 2000-03-01T02:00:00+0300 */ soap->tmpbuf[22] = ':'; /* 2000-03-01T02:00:00+03:00 */ } #endif #elif defined(HAVE_GETTIMEOFDAY) && !defined(WITH_NOZONE) struct timezone tz; memset((void*)&tz, 0, sizeof(tz)); #if defined(HAVE_LOCALTIME_R) if (localtime_r(&n, pT) != SOAP_FUNC_R_ERR) { struct timeval tv; size_t l; gettimeofday(&tv, &tz); strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT); l = strlen(soap->tmpbuf); (SOAP_SNPRINTF(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, 7), "%+03d:%02d", -tz.tz_minuteswest/60+(pT->tm_isdst!=0), abs(tz.tz_minuteswest)%60); } #else if ((pT = localtime(&n))) { struct timeval tv; size_t l; gettimeofday(&tv, &tz); strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT); l = strlen(soap->tmpbuf); (SOAP_SNPRINTF(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, 7), "%+03d:%02d", -tz.tz_minuteswest/60+(pT->tm_isdst!=0), abs(tz.tz_minuteswest)%60); } #endif #elif defined(HAVE_FTIME) && !defined(WITH_NOZONE) struct timeb t; memset((void*)&t, 0, sizeof(t)); #if defined(HAVE_LOCALTIME_R) if (localtime_r(&n, pT) != SOAP_FUNC_R_ERR) { size_t l; #ifdef __BORLANDC__ ::ftime(&t); #else ftime(&t); #endif strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT); l = strlen(soap->tmpbuf); (SOAP_SNPRINTF(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, 7), "%+03d:%02d", -t.timezone/60+(pT->tm_isdst!=0), abs(t.timezone)%60); } #else if ((pT = localtime(&n))) { size_t l; #ifdef __BORLANDC__ ::ftime(&t); #else ftime(&t); #endif strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT); l = strlen(soap->tmpbuf); (SOAP_SNPRINTF(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, 7), "%+03d:%02d", -t.timezone/60+(pT->tm_isdst!=0), abs(t.timezone)%60); } #endif #elif defined(HAVE_LOCALTIME_R) if (localtime_r(&n, pT) != SOAP_FUNC_R_ERR) strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT); #else if ((pT = localtime(&n))) strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT); #endif else soap_strcpy(soap->tmpbuf, sizeof(soap->tmpbuf), "1969-12-31T23:59:59Z"); return soap->tmpbuf; } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 int SOAP_FMAC2 soap_outdateTime(struct soap *soap, const char *tag, int id, const time_t *p, const char *type, int n) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) || soap_string_out(soap, soap_dateTime2s(soap, *p), 0)) return soap->error; return soap_element_end_out(soap, tag); } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 int SOAP_FMAC2 soap_s2dateTime(struct soap *soap, const char *s, time_t *p) { *p = 0; if (s) { char *t; unsigned long d; struct tm T; memset((void*)&T, 0, sizeof(T)); d = soap_strtoul(s, &t, 10); if (*t == '-') { /* YYYY-MM-DD */ T.tm_year = (int)d; T.tm_mon = (int)soap_strtoul(t + 1, &t, 10); T.tm_mday = (int)soap_strtoul(t + 1, &t, 10); } else if (!(soap->mode & SOAP_XML_STRICT)) { /* YYYYMMDD */ T.tm_year = (int)(d / 10000); T.tm_mon = (int)(d / 100 % 100); T.tm_mday = (int)(d % 100); } else return soap->error = SOAP_TYPE; if (*t == 'T' || ((*t == 't' || *t == ' ') && !(soap->mode & SOAP_XML_STRICT))) { d = soap_strtoul(t + 1, &t, 10); if (*t == ':') { /* Thh:mm:ss */ T.tm_hour = (int)d; T.tm_min = (int)soap_strtoul(t + 1, &t, 10); T.tm_sec = (int)soap_strtoul(t + 1, &t, 10); } else if (!(soap->mode & SOAP_XML_STRICT)) { /* Thhmmss */ T.tm_hour = (int)(d / 10000); T.tm_min = (int)(d / 100 % 100); T.tm_sec = (int)(d % 100); } else return soap->error = SOAP_TYPE; } if (T.tm_year == 1) T.tm_year = 70; else T.tm_year -= 1900; T.tm_mon--; if (*t == '.') { for (t++; *t; t++) if (*t < '0' || *t > '9') break; } if (*t == ' ' && !(soap->mode & SOAP_XML_STRICT)) t++; if (*t) { #ifndef WITH_NOZONE if (*t == '+' || *t == '-') { int h, m; m = (int)soap_strtol(t, &t, 10); if (*t == ':') { /* +hh:mm */ h = m; m = (int)soap_strtol(t + 1, &t, 10); if (h < 0) m = -m; } else if (!(soap->mode & SOAP_XML_STRICT)) { /* +hhmm */ h = m / 100; m = m % 100; } else { /* +hh */ h = m; m = 0; } if (*t) return soap->error = SOAP_TYPE; T.tm_min -= m; T.tm_hour -= h; /* put hour and min in range */ T.tm_hour += T.tm_min / 60; T.tm_min %= 60; if (T.tm_min < 0) { T.tm_min += 60; T.tm_hour--; } T.tm_mday += T.tm_hour / 24; T.tm_hour %= 24; if (T.tm_hour < 0) { T.tm_hour += 24; T.tm_mday--; } /* note: day of the month may be out of range, timegm() handles it */ } else if (*t != 'Z') return soap->error = SOAP_TYPE; #endif *p = soap_timegm(&T); } else /* no UTC or timezone, so assume we got a localtime */ { T.tm_isdst = -1; *p = mktime(&T); } } return soap->error; } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 time_t * SOAP_FMAC2 soap_indateTime(struct soap *soap, const char *tag, time_t *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":dateTime")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } p = (time_t*)soap_id_enter(soap, soap->id, p, t, sizeof(time_t), NULL, NULL, NULL, NULL); if (*soap->href) p = (time_t*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(time_t), 0, NULL, NULL); else if (p) { if (soap_s2dateTime(soap, soap_value(soap), p)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outliteral(struct soap *soap, const char *tag, char *const*p, const char *type) { int i; const char *t = NULL; if (tag && *tag != '-') { if (soap->local_namespaces && (t = strchr(tag, ':'))) { size_t n = t - tag; if (n >= sizeof(soap->tmpbuf)) n = sizeof(soap->tmpbuf) - 1; soap_strncpy(soap->tmpbuf, sizeof(soap->tmpbuf), tag, n); for (i = 0; soap->local_namespaces[i].id; i++) if (!strcmp(soap->tmpbuf, soap->local_namespaces[i].id)) break; t++; if (soap_element(soap, t, 0, type) || soap_attribute(soap, "xmlns", soap->local_namespaces[i].ns ? soap->local_namespaces[i].ns : SOAP_STR_EOS) || soap_element_start_end_out(soap, NULL)) return soap->error; } else { t = tag; if (soap_element_begin_out(soap, t, 0, type)) return soap->error; } } if (p && *p) { if (soap_send(soap, *p)) /* send as-is */ return soap->error; } if (t) return soap_element_end_out(soap, t); return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 char ** SOAP_FMAC2 soap_inliteral(struct soap *soap, const char *tag, char **p) { if (soap_element_begin_in(soap, tag, 1, NULL)) { if (soap->error != SOAP_NO_TAG || soap_unget(soap, soap_get(soap)) == SOAP_TT) return NULL; soap->error = SOAP_OK; } if (!p) { if (!(p = (char**)soap_malloc(soap, sizeof(char*)))) return NULL; } if (soap->body || (tag && *tag == '-')) { if (tag && *tag != '-') *p = soap_string_in(soap, -1, -1, -1, NULL); else *p = soap_string_in(soap, 0, -1, -1, NULL); if (!*p) return NULL; if (!**p && tag && *tag == '-') { soap->error = SOAP_NO_TAG; return NULL; } } else if (soap->null) *p = NULL; else *p = soap_strdup(soap, SOAP_STR_EOS); if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_outwliteral(struct soap *soap, const char *tag, wchar_t *const*p, const char *type) { int i; const char *t = NULL; if (tag && *tag != '-') { if (soap->local_namespaces && (t = strchr(tag, ':'))) { size_t n = t - tag; if (n >= sizeof(soap->tmpbuf)) n = sizeof(soap->tmpbuf) - 1; soap_strncpy(soap->tmpbuf, sizeof(soap->tmpbuf), tag, n); for (i = 0; soap->local_namespaces[i].id; i++) if (!strcmp(soap->tmpbuf, soap->local_namespaces[i].id)) break; t++; if (soap_element(soap, t, 0, type) || soap_attribute(soap, "xmlns", soap->local_namespaces[i].ns ? soap->local_namespaces[i].ns : SOAP_STR_EOS) || soap_element_start_end_out(soap, NULL)) return soap->error; } else { t = tag; if (soap_element_begin_out(soap, t, 0, type)) return soap->error; } } if (p) { wchar_t c; const wchar_t *s = *p; while ((c = *s++)) { if (soap_pututf8(soap, (unsigned long)c)) /* send as-is in UTF8 */ return soap->error; } } if (t) return soap_element_end_out(soap, t); return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_2 SOAP_FMAC1 wchar_t ** SOAP_FMAC2 soap_inwliteral(struct soap *soap, const char *tag, wchar_t **p) { if (soap_element_begin_in(soap, tag, 1, NULL)) { if (soap->error != SOAP_NO_TAG || soap_unget(soap, soap_get(soap)) == SOAP_TT) return NULL; soap->error = SOAP_OK; } if (!p) { if (!(p = (wchar_t**)soap_malloc(soap, sizeof(wchar_t*)))) return NULL; } if (soap->body) { if (tag && *tag != '-') *p = soap_wstring_in(soap, -1, -1, -1, NULL); else *p = soap_wstring_in(soap, 0, -1, -1, NULL); if (!*p) return NULL; if (!**p && tag && *tag == '-') { soap->error = SOAP_NO_TAG; return NULL; } } else if (tag && *tag == '-') { soap->error = SOAP_NO_TAG; return NULL; } else if (soap->null) *p = NULL; else *p = soap_wstrdup(soap, (wchar_t*)SOAP_STR_EOS); if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 const char * SOAP_FMAC2 soap_value(struct soap *soap) { size_t i; soap_wchar c = 0; char *s = soap->tmpbuf; if (!soap->body) return SOAP_STR_EOS; do c = soap_get(soap); while (soap_blank(c)); for (i = 0; i < sizeof(soap->tmpbuf) - 1; i++) { if (c == SOAP_TT || c == SOAP_LT || (int)c == EOF) break; *s++ = (char)c; c = soap_get(soap); } for (s--; i > 0; i--, s--) { if (!soap_blank((soap_wchar)*s)) break; } s[1] = '\0'; soap->tmpbuf[sizeof(soap->tmpbuf) - 1] = '\0'; /* appease */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element content value='%s'\n", soap->tmpbuf)); if (c == SOAP_TT || c == SOAP_LT || (int)c == EOF) soap_unget(soap, c); else { soap->error = SOAP_LENGTH; return NULL; } #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) soap->dom->text = soap_strdup(soap, soap->tmpbuf); #endif return soap->tmpbuf; /* return non-null pointer */ } #endif /******************************************************************************/ #if !defined(WITH_LEANER) || !defined(WITH_NOHTTP) #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_getline(struct soap *soap, char *buf, int len) { char *s = buf; int i = len; soap_wchar c = 0; for (;;) { while (--i > 0) { c = soap_getchar(soap); if (c == '\r' || c == '\n') break; if ((int)c == EOF) return soap->error = SOAP_CHK_EOF; *s++ = (char)c; } *s = '\0'; if (c != '\n') c = soap_getchar(soap); /* got \r or something else, now get \n */ if (c == '\n') { if (i + 1 == len) /* empty line: end of HTTP/MIME header */ break; c = soap_get0(soap); if (c != ' ' && c != '\t') /* HTTP line continuation? */ break; } else if ((int)c == EOF) return soap->error = SOAP_CHK_EOF; if (i <= 0) return soap->error = SOAP_HDR; } return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef PALM_1 static size_t soap_count_attachments(struct soap *soap) { #ifndef WITH_LEANER struct soap_multipart *content; size_t count = soap->count; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Calculating the message size with attachments, current count=%lu\n", (unsigned long)count)); if ((soap->mode & SOAP_ENC_DIME) && !(soap->mode & SOAP_ENC_MTOM)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Calculating the size of DIME attachments\n")); for (content = soap->dime.first; content; content = content->next) { count += 12 + ((content->size+3)&(~3)); if (content->id) count += ((strlen(content->id)+3)&(~3)); if (content->type) count += ((strlen(content->type)+3)&(~3)); if (content->options) count += ((((unsigned char)content->options[2] << 8) | ((unsigned char)content->options[3]))+7)&(~3); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Size of DIME attachment content is %lu bytes\n", (unsigned long)content->size)); } } if ((soap->mode & SOAP_ENC_MIME) && soap->mime.boundary) { size_t n = strlen(soap->mime.boundary); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Calculating the size of MIME attachments\n")); for (content = soap->mime.first; content; content = content->next) { const char *s; /* count \r\n--boundary\r\n */ count += 6 + n; /* count Content-Type: ...\r\n */ if (content->type) count += 16 + strlen(content->type); /* count Content-Transfer-Encoding: ...\r\n */ s = soap_code_str(mime_codes, content->encoding); if (s) count += 29 + strlen(s); /* count Content-ID: ...\r\n */ if (content->id) count += 14 + strlen(content->id); /* count Content-Location: ...\r\n */ if (content->location) count += 20 + strlen(content->location); /* count Content-Description: ...\r\n */ if (content->description) count += 23 + strlen(content->description); /* count \r\n...content */ count += 2 + content->size; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Size of MIME attachment content is %lu bytes\n", (unsigned long)content->size)); } /* count \r\n--boundary-- */ count += 6 + n; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "New count=%lu\n", (unsigned long)count)); return count; #else return soap->count; #endif } #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 static int soap_putdimefield(struct soap *soap, const char *s, size_t n) { if (soap_send_raw(soap, s, n)) return soap->error; return soap_send_raw(soap, SOAP_STR_PADDING, -(long)n&3); } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 char * SOAP_FMAC2 soap_dime_option(struct soap *soap, unsigned short optype, const char *option) { size_t n; char *s = NULL; if (option) { n = strlen(option); s = (char*)soap_malloc(soap, n + 5); if (s) { s[0] = (char)(optype >> 8); s[1] = (char)(optype & 0xFF); s[2] = (char)(n >> 8); s[3] = (char)(n & 0xFF); soap_strcpy(s + 4, n + 1, option); } } return s; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_putdimehdr(struct soap *soap) { unsigned char tmp[12]; size_t optlen = 0, idlen = 0, typelen = 0; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Put DIME header id='%s'\n", soap->dime.id ? soap->dime.id : SOAP_STR_EOS)); if (soap->dime.options) optlen = (((unsigned char)soap->dime.options[2] << 8) | ((unsigned char)soap->dime.options[3])) + 4; if (soap->dime.id) { idlen = strlen(soap->dime.id); if (idlen > 0x0000FFFF) idlen = 0x0000FFFF; } if (soap->dime.type) { typelen = strlen(soap->dime.type); if (typelen > 0x0000FFFF) typelen = 0x0000FFFF; } tmp[0] = SOAP_DIME_VERSION | (soap->dime.flags & 0x7); tmp[1] = soap->dime.flags & 0xF0; tmp[2] = (char)(optlen >> 8); tmp[3] = (char)(optlen & 0xFF); tmp[4] = (char)(idlen >> 8); tmp[5] = (char)(idlen & 0xFF); tmp[6] = (char)(typelen >> 8); tmp[7] = (char)(typelen & 0xFF); tmp[8] = (char)(soap->dime.size >> 24); tmp[9] = (char)((soap->dime.size >> 16) & 0xFF); tmp[10] = (char)((soap->dime.size >> 8) & 0xFF); tmp[11] = (char)(soap->dime.size & 0xFF); if (soap_send_raw(soap, (char*)tmp, 12) || soap_putdimefield(soap, soap->dime.options, optlen) || soap_putdimefield(soap, soap->dime.id, idlen) || soap_putdimefield(soap, soap->dime.type, typelen)) return soap->error; return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_putdime(struct soap *soap) { struct soap_multipart *content; if (!(soap->mode & SOAP_ENC_DIME)) return SOAP_OK; for (content = soap->dime.first; content; content = content->next) { void *handle; soap->dime.size = content->size; soap->dime.id = content->id; soap->dime.type = content->type; soap->dime.options = content->options; soap->dime.flags = SOAP_DIME_VERSION | SOAP_DIME_MEDIA; if (soap->fdimereadopen && ((handle = soap->fdimereadopen(soap, (void*)content->ptr, content->id, content->type, content->options)) || soap->error)) { size_t size = content->size; if (!handle) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fdimereadopen failed\n")); return soap->error; } if (!size && ((soap->mode & SOAP_ENC_XML) || (soap->mode & SOAP_IO) == SOAP_IO_CHUNK || (soap->mode & SOAP_IO) == SOAP_IO_STORE)) { size_t chunksize = sizeof(soap->tmpbuf); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Chunked streaming DIME\n")); do { size = soap->fdimeread(soap, handle, soap->tmpbuf, chunksize); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fdimeread returned %lu bytes\n", (unsigned long)size)); if (size < chunksize) { soap->dime.flags &= ~SOAP_DIME_CF; if (!content->next) soap->dime.flags |= SOAP_DIME_ME; } else soap->dime.flags |= SOAP_DIME_CF; soap->dime.size = size; if (soap_putdimehdr(soap) || soap_putdimefield(soap, soap->tmpbuf, size)) break; if (soap->dime.id) { soap->dime.flags &= ~(SOAP_DIME_MB | SOAP_DIME_MEDIA); soap->dime.id = NULL; soap->dime.type = NULL; soap->dime.options = NULL; } } while (size >= chunksize); } else { if (!content->next) soap->dime.flags |= SOAP_DIME_ME; if (soap_putdimehdr(soap)) return soap->error; do { size_t bufsize; if (size < sizeof(soap->tmpbuf)) bufsize = size; else bufsize = sizeof(soap->tmpbuf); if (!(bufsize = soap->fdimeread(soap, handle, soap->tmpbuf, bufsize))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fdimeread failed: insufficient data (%lu bytes remaining from %lu bytes)\n", (unsigned long)size, (unsigned long)content->size)); soap->error = SOAP_CHK_EOF; break; } if (soap_send_raw(soap, soap->tmpbuf, bufsize)) break; size -= bufsize; } while (size); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fdimereadclose\n")); soap_send_raw(soap, SOAP_STR_PADDING, -(long)soap->dime.size&3); } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fdimereadclose\n")); if (soap->fdimereadclose) soap->fdimereadclose(soap, handle); } else { if (!content->next) soap->dime.flags |= SOAP_DIME_ME; if (soap_putdimehdr(soap) || soap_putdimefield(soap, (char*)content->ptr, content->size)) return soap->error; } } return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 static char * soap_getdimefield(struct soap *soap, size_t n) { soap_wchar c; size_t i; char *s; char *p = NULL; if (n) { p = (char*)soap_malloc(soap, n + 1); if (p) { s = p; for (i = n; i > 0; i--) { if ((int)(c = soap_get1(soap)) == EOF) { soap->error = SOAP_CHK_EOF; return NULL; } *s++ = (char)c; } *s = '\0'; /* force NUL terminated */ if ((soap->error = soap_move(soap, (size_t)(-(long)n&3)))) return NULL; } else soap->error = SOAP_EOM; } return p; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_getdimehdr(struct soap *soap) { soap_wchar c; char *s; int i; unsigned char tmp[12]; size_t optlen, idlen, typelen; if (!(soap->mode & SOAP_ENC_DIME)) return soap->error = SOAP_DIME_END; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get DIME header\n")); if (soap->dime.buflen || soap->dime.chunksize) { if (soap_move(soap, soap->dime.size - soap_tell(soap))) return soap->error = SOAP_CHK_EOF; soap_unget(soap, soap_getchar(soap)); /* skip padding and get hdr */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "... From chunked\n")); return SOAP_OK; } s = (char*)tmp; for (i = 12; i > 0; i--) { if ((int)(c = soap_getchar(soap)) == EOF) return soap->error = SOAP_CHK_EOF; *s++ = (char)c; } if ((tmp[0] & 0xF8) != SOAP_DIME_VERSION) return soap->error = SOAP_DIME_MISMATCH; soap->dime.flags = (tmp[0] & 0x7) | (tmp[1] & 0xF0); optlen = (tmp[2] << 8) | tmp[3]; idlen = (tmp[4] << 8) | tmp[5]; typelen = (tmp[6] << 8) | tmp[7]; soap->dime.size = ((size_t)tmp[8] << 24) | ((size_t)tmp[9] << 16) | ((size_t)tmp[10] << 8) | ((size_t)tmp[11]); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DIME size=%lu flags=0x%X\n", (unsigned long)soap->dime.size, soap->dime.flags)); if (!(soap->dime.options = soap_getdimefield(soap, optlen)) && soap->error) return soap->error; if (!(soap->dime.id = soap_getdimefield(soap, idlen)) && soap->error) return soap->error; if (!(soap->dime.type = soap_getdimefield(soap, typelen)) && soap->error) return soap->error; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DIME id='%s', type='%s', options='%s'\n", soap->dime.id ? soap->dime.id : SOAP_STR_EOS, soap->dime.type ? soap->dime.type : "", soap->dime.options ? soap->dime.options+4 : SOAP_STR_EOS)); if (soap->dime.flags & SOAP_DIME_ME) soap->mode &= ~SOAP_ENC_DIME; return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_getdime(struct soap *soap) { while (soap->dime.flags & SOAP_DIME_CF) { if (soap_getdimehdr(soap)) return soap->error; if (soap_move(soap, soap->dime.size)) return soap->error = SOAP_EOF; } if (soap_move(soap, (size_t)(((soap->dime.size+3)&(~3)) - soap_tell(soap)))) return soap->error = SOAP_EOF; for (;;) { struct soap_multipart *content; if (soap_getdimehdr(soap)) break; if (soap->fdimewriteopen && ((soap->dime.ptr = (char*)soap->fdimewriteopen(soap, soap->dime.id, soap->dime.type, soap->dime.options)) || soap->error)) { const char *id, *type, *options; size_t size, n; if (!soap->dime.ptr) return soap->error; id = soap->dime.id; type = soap->dime.type; options = soap->dime.options; for (;;) { size = soap->dime.size; for (;;) { n = soap->buflen - soap->bufidx; if (size < n) n = size; if ((soap->error = soap->fdimewrite(soap, (void*)soap->dime.ptr, soap->buf + soap->bufidx, n))) break; size -= n; if (!size) { soap->bufidx += n; break; } if (soap_recv(soap)) { soap->error = SOAP_EOF; goto end; } } if (soap_move(soap, (size_t)(-(long)soap->dime.size&3))) { soap->error = SOAP_EOF; break; } if (!(soap->dime.flags & SOAP_DIME_CF)) break; if (soap_getdimehdr(soap)) break; } end: if (soap->fdimewriteclose) soap->fdimewriteclose(soap, (void*)soap->dime.ptr); soap->dime.size = 0; soap->dime.id = id; soap->dime.type = type; soap->dime.options = options; } else if (soap->dime.flags & SOAP_DIME_CF) { const char *id, *type, *options; id = soap->dime.id; type = soap->dime.type; options = soap->dime.options; if (soap_new_block(soap) == NULL) return SOAP_EOM; for (;;) { soap_wchar c; size_t i; char *s; if (soap->dime.size > SOAP_MAXDIMESIZE) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DIME size=%lu exceeds SOAP_MAXDIMESIZE=%lu\n", (unsigned long)soap->dime.size, (unsigned long)SOAP_MAXDIMESIZE)); return soap->error = SOAP_DIME_ERROR; } s = (char*)soap_push_block(soap, NULL, soap->dime.size); if (!s) return soap->error = SOAP_EOM; for (i = soap->dime.size; i > 0; i--) { if ((int)(c = soap_get1(soap)) == EOF) return soap->error = SOAP_EOF; *s++ = (char)c; } if (soap_move(soap, (size_t)(-(long)soap->dime.size&3))) return soap->error = SOAP_EOF; if (!(soap->dime.flags & SOAP_DIME_CF)) break; if (soap_getdimehdr(soap)) return soap->error; } soap->dime.size = soap->blist->size++; /* allocate one more byte in blist for the terminating '\0' */ if (!(soap->dime.ptr = soap_save_block(soap, NULL, NULL, 0))) return soap->error; soap->dime.ptr[soap->dime.size] = '\0'; /* make 0-terminated */ soap->dime.id = id; soap->dime.type = type; soap->dime.options = options; } else soap->dime.ptr = soap_getdimefield(soap, soap->dime.size); content = soap_new_multipart(soap, &soap->dime.first, &soap->dime.last, soap->dime.ptr, soap->dime.size); if (!content) return soap->error = SOAP_EOM; content->id = soap->dime.id; content->type = soap->dime.type; content->options = soap->dime.options; if (soap->error) return soap->error; soap_resolve_attachment(soap, content); } if (soap->error != SOAP_DIME_END) return soap->error; return soap->error = SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_getmimehdr(struct soap *soap) { struct soap_multipart *content; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get MIME header\n")); do { if (soap_getline(soap, soap->msgbuf, sizeof(soap->msgbuf))) return soap->error; } while (!*soap->msgbuf); if (soap->msgbuf[0] == '-' && soap->msgbuf[1] == '-') { char *s = soap->msgbuf + strlen(soap->msgbuf) - 1; /* remove white space */ while (soap_blank((soap_wchar)*s)) s--; s[1] = '\0'; if (soap->mime.boundary) { if (strcmp(soap->msgbuf + 2, soap->mime.boundary)) return soap->error = SOAP_MIME_ERROR; } else soap->mime.boundary = soap_strdup(soap, soap->msgbuf + 2); if (soap_getline(soap, soap->msgbuf, sizeof(soap->msgbuf))) return soap->error; } if (soap_set_mime_attachment(soap, NULL, 0, SOAP_MIME_NONE, NULL, NULL, NULL, NULL)) return soap->error = SOAP_EOM; content = soap->mime.last; for (;;) { char *key = soap->msgbuf; char *val; if (!*key) break; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "MIME header: %s\n", key)); val = strchr(soap->msgbuf, ':'); if (val) { *val = '\0'; do val++; while (*val && *val <= 32); if (!soap_tag_cmp(key, "Content-ID")) content->id = soap_strdup(soap, val); else if (!soap_tag_cmp(key, "Content-Location")) content->location = soap_strdup(soap, val); else if (!content->id && !soap_tag_cmp(key, "Content-Disposition")) content->id = soap_strdup(soap, soap_get_header_attribute(soap, val, "name")); else if (!soap_tag_cmp(key, "Content-Type")) content->type = soap_strdup(soap, val); else if (!soap_tag_cmp(key, "Content-Description")) content->description = soap_strdup(soap, val); else if (!soap_tag_cmp(key, "Content-Transfer-Encoding")) content->encoding = (enum soap_mime_encoding)soap_code_int(mime_codes, val, (LONG64)SOAP_MIME_NONE); } if (soap_getline(soap, key, sizeof(soap->msgbuf))) return soap->error; } return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_getmime(struct soap *soap) { while (soap_get_mime_attachment(soap, NULL)) continue; return soap->error; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_post_check_mime_attachments(struct soap *soap) { soap->imode |= SOAP_MIME_POSTCHECK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_check_mime_attachments(struct soap *soap) { if (soap->mode & SOAP_MIME_POSTCHECK) return soap_get_mime_attachment(soap, NULL) != NULL; return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 struct soap_multipart * SOAP_FMAC2 soap_get_mime_attachment(struct soap *soap, void *handle) { soap_wchar c = 0; size_t i, m = 0; char *s, *t = NULL; struct soap_multipart *content; short flag = 0; if (!(soap->mode & SOAP_ENC_MIME)) return NULL; content = soap->mime.last; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get MIME (%p)\n", content)); if (!content) { if (soap_getmimehdr(soap)) return NULL; content = soap->mime.last; } else if (content != soap->mime.first) { if (soap->fmimewriteopen && ((content->ptr = (char*)soap->fmimewriteopen(soap, (void*)handle, content->id, content->type, content->description, content->encoding)) || soap->error)) { if (!content->ptr) return NULL; } } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Parsing MIME content id='%s' type='%s'\n", content->id ? content->id : SOAP_STR_EOS, content->type ? content->type : SOAP_STR_EOS)); if (!content->ptr && soap_new_block(soap) == NULL) { soap->error = SOAP_EOM; return NULL; } for (;;) { if (content->ptr) s = soap->tmpbuf; else if (!(s = (char*)soap_push_block(soap, NULL, sizeof(soap->tmpbuf)))) { soap->error = SOAP_EOM; return NULL; } for (i = 0; i < sizeof(soap->tmpbuf); i++) { if (m > 0) { *s++ = *t++; m--; } else { if (!flag) { c = soap_getchar(soap); if ((int)c == EOF) { if (content->ptr && soap->fmimewriteclose) soap->fmimewriteclose(soap, (void*)content->ptr); soap->error = SOAP_CHK_EOF; return NULL; } } if (flag || c == '\r') { memset((void*)soap->msgbuf, 0, sizeof(soap->msgbuf)); soap_strcpy(soap->msgbuf, sizeof(soap->msgbuf), "\n--"); if (soap->mime.boundary) soap_strncat(soap->msgbuf, sizeof(soap->msgbuf), soap->mime.boundary, sizeof(soap->msgbuf) - 4); t = soap->msgbuf; do c = soap_getchar(soap); while (c == *t++); if ((int)c == EOF) { if (content->ptr && soap->fmimewriteclose) soap->fmimewriteclose(soap, (void*)content->ptr); soap->error = SOAP_CHK_EOF; return NULL; } if (!*--t) goto end; *t = (char)c; flag = (c == '\r'); m = t - soap->msgbuf + 1 - flag; t = soap->msgbuf; c = '\r'; } *s++ = (char)c; } } if (content->ptr && soap->fmimewrite) { if ((soap->error = soap->fmimewrite(soap, (void*)content->ptr, soap->tmpbuf, i))) break; } } end: *s = '\0'; /* make 0-terminated */ if (content->ptr) { if (!soap->error && soap->fmimewrite) soap->error = soap->fmimewrite(soap, (void*)content->ptr, soap->tmpbuf, i); if (soap->fmimewriteclose) soap->fmimewriteclose(soap, (void*)content->ptr); if (soap->error) return NULL; } else { content->size = soap_size_block(soap, NULL, i+1) - 1; /* last block with '\0' */ content->ptr = soap_save_block(soap, NULL, NULL, 0); } soap_resolve_attachment(soap, content); if (c == '-' && soap_getchar(soap) == '-') { soap->mode &= ~SOAP_ENC_MIME; if ((soap->mode & SOAP_MIME_POSTCHECK) && soap_end_recv(soap)) { if (soap->keep_alive < 0) soap->keep_alive = 0; soap_closesock(soap); return NULL; } } else { while (c != '\r' && (int)c != EOF && soap_blank(c)) c = soap_getchar(soap); if (c != '\r' || soap_getchar(soap) != '\n') { soap->error = SOAP_MIME_ERROR; return NULL; } if (soap_getmimehdr(soap)) return NULL; } return content; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_match_cid(struct soap *soap, const char *s, const char *t) { size_t n; if (!s) return 1; if (!strcmp(s, t)) return 0; if (!strncmp(s, "cid:", 4)) s += 4; n = strlen(t); if (*t == '<') { t++; n -= 2; } if (!strncmp(s, t, n) && !s[n]) return 0; soap_decode(soap->tmpbuf, sizeof(soap->tmpbuf), s, SOAP_STR_EOS); if (!strncmp(soap->tmpbuf, t, n) && !soap->tmpbuf[n]) return 0; return 1; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 static void soap_resolve_attachment(struct soap *soap, struct soap_multipart *content) { if (content->id) { struct soap_xlist **xp = &soap->xlist; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolving attachment data for id='%s'\n", content->id)); while (*xp) { struct soap_xlist *xq = *xp; if (!soap_match_cid(soap, xq->id, content->id)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Found matching attachment id='%s' for content id='%s'\n", xq->id, content->id)); *xp = xq->next; *xq->ptr = (unsigned char*)content->ptr; *xq->size = (int)content->size; *xq->type = (char*)content->type; if (content->options) *xq->options = (char*)content->options; else *xq->options = (char*)content->description; SOAP_FREE(soap, xq); } else xp = &(*xp)->next; } } } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_putmimehdr(struct soap *soap, struct soap_multipart *content) { const char *s; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "MIME attachment type='%s'\n", content->type ? content->type : SOAP_STR_EOS)); if (soap_send3(soap, "\r\n--", soap->mime.boundary, "\r\n")) return soap->error; if (content->type && soap_send3(soap, "Content-Type: ", content->type, "\r\n")) return soap->error; s = soap_code_str(mime_codes, content->encoding); if (s && soap_send3(soap, "Content-Transfer-Encoding: ", s, "\r\n")) return soap->error; if (content->id && soap_send3(soap, "Content-ID: ", content->id, "\r\n")) return soap->error; if (content->location && soap_send3(soap, "Content-Location: ", content->location, "\r\n")) return soap->error; if (content->description && soap_send3(soap, "Content-Description: ", content->description, "\r\n")) return soap->error; return soap_send_raw(soap, "\r\n", 2); } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_putmime(struct soap *soap) { struct soap_multipart *content; if (!(soap->mode & SOAP_ENC_MIME) || !soap->mime.boundary) return SOAP_OK; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Sending MIME attachments\n")); for (content = soap->mime.first; content; content = content->next) { void *handle; if (soap->fmimereadopen && ((handle = soap->fmimereadopen(soap, (void*)content->ptr, content->id, content->type, content->description)) || soap->error)) { size_t size = content->size; if (!handle) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fmimereadopen failed\n")); return soap->error; } if (soap_putmimehdr(soap, content)) return soap->error; if (!size) { if ((soap->mode & SOAP_ENC_XML) || (soap->mode & SOAP_IO) == SOAP_IO_CHUNK || (soap->mode & SOAP_IO) == SOAP_IO_STORE) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Chunked streaming MIME\n")); do { size = soap->fmimeread(soap, handle, soap->tmpbuf, sizeof(soap->tmpbuf)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fmimeread returned %lu bytes\n", (unsigned long)size)); if (soap_send_raw(soap, soap->tmpbuf, size)) break; } while (size); } else { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Error: cannot chunk streaming MIME (no HTTP chunking)\n")); } } else { do { size_t bufsize; if (size < sizeof(soap->tmpbuf)) bufsize = size; else bufsize = sizeof(soap->tmpbuf); if (!(bufsize = soap->fmimeread(soap, handle, soap->tmpbuf, bufsize))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fmimeread failed: insufficient data (%lu bytes remaining from %lu bytes)\n", (unsigned long)size, (unsigned long)content->size)); soap->error = SOAP_EOF; break; } if (soap_send_raw(soap, soap->tmpbuf, bufsize)) break; size -= bufsize; } while (size); } if (soap->fmimereadclose) soap->fmimereadclose(soap, handle); } else { if (soap_putmimehdr(soap, content) || soap_send_raw(soap, content->ptr, content->size)) return soap->error; } } return soap_send3(soap, "\r\n--", soap->mime.boundary, "--"); } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_set_dime(struct soap *soap) { soap->omode |= SOAP_ENC_DIME; soap->dime.first = NULL; soap->dime.last = NULL; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_set_mime(struct soap *soap, const char *boundary, const char *start) { soap->omode |= SOAP_ENC_MIME; soap->mime.first = NULL; soap->mime.last = NULL; soap->mime.boundary = soap_strdup(soap, boundary); soap->mime.start = soap_strdup(soap, start); } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_clr_dime(struct soap *soap) { soap->omode &= ~SOAP_ENC_DIME; soap->dime.first = NULL; soap->dime.last = NULL; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_clr_mime(struct soap *soap) { soap->omode &= ~SOAP_ENC_MIME; soap->mime.first = NULL; soap->mime.last = NULL; soap->mime.boundary = NULL; soap->mime.start = NULL; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 static struct soap_multipart* soap_new_multipart(struct soap *soap, struct soap_multipart **first, struct soap_multipart **last, char *ptr, size_t size) { struct soap_multipart *content; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "New MIME attachment %p (%lu)\n", ptr, (unsigned long)size)); content = (struct soap_multipart*)soap_malloc(soap, sizeof(struct soap_multipart)); if (content) { content->next = NULL; content->ptr = ptr; content->size = size; content->id = NULL; content->type = NULL; content->options = NULL; content->encoding = SOAP_MIME_NONE; content->location = NULL; content->description = NULL; if (!*first) *first = content; if (*last) (*last)->next = content; *last = content; } return content; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_set_dime_attachment(struct soap *soap, char *ptr, size_t size, const char *type, const char *id, unsigned short optype, const char *option) { struct soap_multipart *content = soap_new_multipart(soap, &soap->dime.first, &soap->dime.last, ptr, size); if (!content) return SOAP_EOM; content->id = soap_strdup(soap, id); content->type = soap_strdup(soap, type); content->options = soap_dime_option(soap, optype, option); return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_set_mime_attachment(struct soap *soap, char *ptr, size_t size, enum soap_mime_encoding encoding, const char *type, const char *id, const char *location, const char *description) { struct soap_multipart *content = soap_new_multipart(soap, &soap->mime.first, &soap->mime.last, ptr, size); if (!content) return SOAP_EOM; content->id = soap_strdup(soap, id); content->type = soap_strdup(soap, type); content->encoding = encoding; content->location = soap_strdup(soap, location); content->description = soap_strdup(soap, description); return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 SOAP_FMAC1 struct soap_multipart* SOAP_FMAC2 soap_next_multipart(struct soap_multipart *content) { if (content) return content->next; return NULL; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 static void soap_select_mime_boundary(struct soap *soap) { while (!soap->mime.boundary || soap_valid_mime_boundary(soap)) { char *s = soap->mime.boundary; size_t n = 0; if (s) n = strlen(s); if (n < 16) { n = 64; s = soap->mime.boundary = (char*)soap_malloc(soap, n + 1); if (!s) return; } *s++ = '='; *s++ = '='; n -= 4; while (n) { *s++ = soap_base64o[soap_random & 0x3F]; n--; } *s++ = '='; *s++ = '='; *s = '\0'; } if (!soap->mime.start) soap->mime.start = ""; } #endif #endif /******************************************************************************/ #ifndef WITH_LEANER #ifndef PALM_1 static int soap_valid_mime_boundary(struct soap *soap) { struct soap_multipart *content; size_t k; if (soap->fmimeread) return SOAP_OK; k = strlen(soap->mime.boundary); for (content = soap->mime.first; content; content = content->next) { if (content->ptr && content->size >= k) { const char *p = (const char*)content->ptr; size_t i; for (i = 0; i < content->size - k; i++, p++) { if (!strncmp(p, soap->mime.boundary, k)) return SOAP_ERR; } } } return SOAP_OK; } #endif #endif /******************************************************************************/ #ifdef WITH_GZIP #ifndef PALM_1 static int soap_getgziphdr(struct soap *soap) { int i; soap_wchar c = 0, f = 0; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get gzip header\n")); for (i = 0; i < 9; i++) { if ((int)(c = soap_get1(soap) == EOF)) return soap->error = SOAP_ZLIB_ERROR; if (i == 1 && c == 8) soap->z_dict = 0; if (i == 2) f = c; } if (f & 0x04) /* FEXTRA */ { for (i = soap_get1(soap) | (soap_get1(soap) << 8); i; i--) { if ((int)soap_get1(soap) == EOF) return soap->error = SOAP_ZLIB_ERROR; } } if (f & 0x08) /* skip FNAME */ { do c = soap_get1(soap); while (c && (int)c != EOF); } if ((int)c != EOF && (f & 0x10)) /* skip FCOMMENT */ { do c = soap_get1(soap); while (c && (int)c != EOF); } if ((int)c != EOF && (f & 0x02)) /* skip FHCRC (CRC32 is used) */ { if ((int)(c = soap_get1(soap)) != EOF) c = soap_get1(soap); } if ((int)c == EOF) return soap->error = SOAP_ZLIB_ERROR; return SOAP_OK; } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_begin_serve(struct soap *soap) { #ifdef WITH_FASTCGI if (FCGI_Accept() < 0) { soap->error = SOAP_EOF; return soap_send_fault(soap); } #endif soap_begin(soap); if (soap_begin_recv(soap) || soap_envelope_begin_in(soap) || soap_recv_header(soap) || soap_body_begin_in(soap)) { if (soap->error < SOAP_STOP) { #ifdef WITH_FASTCGI soap_send_fault(soap); #else return soap_send_fault(soap); #endif } return soap_closesock(soap); } return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_begin_recv(struct soap *soap) { soap_wchar c; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Initializing for input from socket=%d/fd=%d\n", soap->socket, soap->recvfd)); soap->error = SOAP_OK; #ifndef WITH_LEANER soap->recverror = SOAP_OK; #endif soap_free_temp(soap); soap_set_local_namespaces(soap); soap->version = 0; /* don't assume we're parsing SOAP content by default */ #ifndef WITH_NOIDREF soap_free_iht(soap); #endif if ((soap->imode & SOAP_IO) == SOAP_IO_CHUNK) soap->omode |= SOAP_IO_CHUNK; soap->imode &= ~(SOAP_IO | SOAP_ENC_MIME); soap->mode = soap->imode; if (!soap->keep_alive) { soap->buflen = 0; soap->bufidx = 0; } if (!(soap->mode & SOAP_IO_KEEPALIVE)) soap->keep_alive = 0; soap->shaky = 0; soap->ahead = 0; soap->peeked = 0; soap->level = 0; soap->part = SOAP_BEGIN; soap->body = 1; soap->count = 0; soap->length = 0; soap->cdata = 0; *soap->endpoint = '\0'; soap->action = NULL; soap->header = NULL; soap->fault = NULL; soap->status = 0; soap->fform = NULL; #ifndef WITH_LEANER soap->dom = NULL; soap->dime.chunksize = 0; soap->dime.buflen = 0; soap->dime.list = NULL; soap->dime.first = NULL; soap->dime.last = NULL; soap->mime.list = NULL; soap->mime.first = NULL; soap->mime.last = NULL; soap->mime.boundary = NULL; soap->mime.start = NULL; #endif #ifdef WIN32 #ifndef UNDER_CE #ifndef WITH_FASTCGI if (!soap_valid_socket(soap->socket) && !soap->is && soap->recvfd >= 0) /* Set win32 stdin or soap->recvfd to BINARY, e.g. to support DIME */ #ifdef __BORLANDC__ setmode(soap->recvfd, _O_BINARY); #else _setmode(soap->recvfd, _O_BINARY); #endif #endif #endif #endif #ifdef WITH_ZLIB soap->mode &= ~SOAP_ENC_ZLIB; soap->zlib_in = SOAP_ZLIB_NONE; soap->zlib_out = SOAP_ZLIB_NONE; if (!soap->d_stream) { soap->d_stream = (z_stream*)SOAP_MALLOC(soap, sizeof(z_stream)); soap->d_stream->zalloc = Z_NULL; soap->d_stream->zfree = Z_NULL; soap->d_stream->opaque = Z_NULL; soap->d_stream->next_in = Z_NULL; } soap->d_stream->avail_in = 0; soap->d_stream->next_out = (Byte*)soap->buf; soap->d_stream->avail_out = sizeof(soap->buf); soap->z_ratio_in = 1.0; #endif #ifdef WITH_OPENSSL if (soap->ssl) ERR_clear_error(); #endif #ifndef WITH_LEANER if (soap->fprepareinitrecv && (soap->error = soap->fprepareinitrecv(soap))) return soap->error; #endif c = soap_getchar(soap); #ifdef WITH_GZIP if (c == 0x1F) { if (soap_getgziphdr(soap)) return soap->error; if (inflateInit2(soap->d_stream, -MAX_WBITS) != Z_OK) return soap->error = SOAP_ZLIB_ERROR; if (soap->z_dict) { if (inflateSetDictionary(soap->d_stream, (const Bytef*)soap->z_dict, soap->z_dict_len) != Z_OK) return soap->error = SOAP_ZLIB_ERROR; } soap->zlib_state = SOAP_ZLIB_INFLATE; soap->mode |= SOAP_ENC_ZLIB; soap->zlib_in = SOAP_ZLIB_GZIP; soap->z_crc = crc32(0L, NULL, 0); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "gzip initialized\n")); if (!soap->z_buf) soap->z_buf = (char*)SOAP_MALLOC(soap, sizeof(soap->buf)); soap_memcpy((void*)soap->z_buf, sizeof(soap->buf), (const void*)soap->buf, sizeof(soap->buf)); /* should not chunk over plain transport, so why bother to check? */ /* if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK) */ /* soap->z_buflen = soap->bufidx; */ /* else */ soap->d_stream->next_in = (Byte*)(soap->z_buf + soap->bufidx); soap->d_stream->avail_in = (unsigned int)(soap->buflen - soap->bufidx); soap->z_buflen = soap->buflen; soap->buflen = soap->bufidx; c = ' '; } #endif while (soap_blank(c)) c = soap_getchar(soap); #ifndef WITH_LEANER if (c == '-' && soap_get0(soap) == '-') soap->mode |= SOAP_ENC_MIME; else if ((c & 0xFFFC) == (SOAP_DIME_VERSION | SOAP_DIME_MB) && (soap_get0(soap) & 0xFFF0) == 0x20) soap->mode |= SOAP_ENC_DIME; else #endif { /* skip BOM */ if (c == 0xEF && soap_get0(soap) == 0xBB) { c = soap_get1(soap); if ((c = soap_get1(soap)) == 0xBF) { soap->mode &= ~SOAP_ENC_LATIN; c = soap_getchar(soap); } else c = (0x0F << 12) | (0xBB << 6) | (c & 0x3F); /* UTF-8 */ } else if ((c == 0xFE && soap_get0(soap) == 0xFF) /* UTF-16 BE */ || (c == 0xFF && soap_get0(soap) == 0xFE)) /* UTF-16 LE */ return soap->error = SOAP_UTF_ERROR; /* skip space */ while (soap_blank(c)) c = soap_getchar(soap); } if ((int)c == EOF) return soap->error = SOAP_CHK_EOF; soap_unget(soap, c); #ifndef WITH_NOHTTP /* if not XML/MIME/DIME/ZLIB, assume HTTP method or status line */ if (((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')) && !(soap->mode & (SOAP_ENC_MIME | SOAP_ENC_DIME | SOAP_ENC_ZLIB | SOAP_ENC_XML))) { soap_mode m = soap->imode; soap->mode &= ~SOAP_IO; soap->error = soap->fparse(soap); if (soap->error && soap->error < SOAP_STOP) { soap->keep_alive = 0; /* force close later */ return soap->error; } if (soap->error == SOAP_STOP) { if (soap->fform) { soap->error = soap->fform(soap); if (soap->error == SOAP_OK) soap->error = SOAP_STOP; /* prevents further processing */ } return soap->error; } soap->mode = soap->imode; /* if imode is changed, effectuate */ soap->imode = m; /* restore imode */ #ifdef WITH_ZLIB soap->mode &= ~SOAP_ENC_ZLIB; #endif if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK) { soap->chunkbuflen = soap->buflen; soap->buflen = soap->bufidx; soap->chunksize = 0; } /* Note: fparse should not use soap_unget to push back last char */ #if 0 if (soap->status > 200 && soap->length == 0 && !(soap->http_content && (!soap->keep_alive || soap->recv_timeout)) && (soap->imode & SOAP_IO) != SOAP_IO_CHUNK) #endif if (soap->status && !soap->body) return soap->error = soap->status; #ifdef WITH_ZLIB if (soap->zlib_in != SOAP_ZLIB_NONE) { #ifdef WITH_GZIP if (soap->zlib_in != SOAP_ZLIB_DEFLATE) { c = soap_get1(soap); if (c == (int)EOF) return soap->error = SOAP_EOF; if (c == 0x1F) { if (soap_getgziphdr(soap)) return soap->error; if (inflateInit2(soap->d_stream, -MAX_WBITS) != Z_OK) return soap->error = SOAP_ZLIB_ERROR; soap->z_crc = crc32(0L, NULL, 0); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "gzip initialized\n")); } else { soap_revget1(soap); if (inflateInit(soap->d_stream) != Z_OK) return soap->error = SOAP_ZLIB_ERROR; soap->zlib_in = SOAP_ZLIB_DEFLATE; } } else #endif if (inflateInit(soap->d_stream) != Z_OK) return soap->error = SOAP_ZLIB_ERROR; if (soap->z_dict) { if (inflateSetDictionary(soap->d_stream, (const Bytef*)soap->z_dict, soap->z_dict_len) != Z_OK) return soap->error = SOAP_ZLIB_ERROR; } soap->zlib_state = SOAP_ZLIB_INFLATE; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflate initialized\n")); soap->mode |= SOAP_ENC_ZLIB; if (!soap->z_buf) soap->z_buf = (char*)SOAP_MALLOC(soap, sizeof(soap->buf)); soap_memcpy((void*)soap->z_buf, sizeof(soap->buf), (const void*)soap->buf, sizeof(soap->buf)); soap->d_stream->next_in = (Byte*)(soap->z_buf + soap->bufidx); soap->d_stream->avail_in = (unsigned int)(soap->buflen - soap->bufidx); soap->z_buflen = soap->buflen; soap->buflen = soap->bufidx; } #endif #ifndef WITH_LEANER if (soap->fpreparerecv && (soap->mode & SOAP_IO) != SOAP_IO_CHUNK && soap->buflen > soap->bufidx) { int r; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Invoking fpreparerecv\n")); if ((r = soap->fpreparerecv(soap, soap->buf + soap->bufidx, soap->buflen - soap->bufidx))) return soap->error = r; } #endif if (soap_get0(soap) == (int)EOF) { if (soap->status == 0) return soap->error = SOAP_NO_DATA; /* server side expects data */ return soap->error = soap->status; /* client side received HTTP status code */ } if (soap->error) { if (soap->error == SOAP_FORM && soap->fform) { soap->error = soap->fform(soap); if (soap->error == SOAP_OK) soap->error = SOAP_STOP; /* prevents further processing */ } return soap->error; } } #endif #ifndef WITH_LEANER if (soap->mode & SOAP_ENC_MIME) { do /* skip preamble */ { if ((int)(c = soap_getchar(soap)) == EOF) return soap->error = SOAP_CHK_EOF; } while (c != '-' || soap_get0(soap) != '-'); soap_unget(soap, c); if (soap_getmimehdr(soap)) return soap->error; if (soap->mime.start) { do { if (!soap->mime.last->id) break; if (!soap_match_cid(soap, soap->mime.start, soap->mime.last->id)) break; } while (soap_get_mime_attachment(soap, NULL)); } if (soap_get_header_attribute(soap, soap->mime.first->type, "application/dime")) soap->mode |= SOAP_ENC_DIME; } if (soap->mode & SOAP_ENC_DIME) { if (soap_getdimehdr(soap)) return soap->error; if (soap->dime.flags & SOAP_DIME_CF) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Chunked DIME SOAP message\n")); soap->dime.chunksize = soap->dime.size; if (soap->buflen - soap->bufidx >= soap->dime.chunksize) { soap->dime.buflen = soap->buflen; soap->buflen = soap->bufidx + soap->dime.chunksize; } else soap->dime.chunksize -= soap->buflen - soap->bufidx; } soap->count = soap->buflen - soap->bufidx; } #endif return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_begin_out(struct soap *soap) { #ifndef WITH_LEANER size_t n = 0; if ((soap->mode & SOAP_ENC_MIME) && soap->mime.boundary && soap->mime.start) { const char *s; if (strlen(soap->mime.boundary) + strlen(soap->mime.start) + 140 > sizeof(soap->tmpbuf)) return soap->error = SOAP_EOM; if ((soap->mode & SOAP_ENC_DIME) && !(soap->mode & SOAP_ENC_MTOM)) s = "application/dime"; else if (soap->version == 2) { if (soap->mode & SOAP_ENC_MTOM) s = "application/xop+xml; charset=utf-8; type=\"application/soap+xml\""; else s = "application/soap+xml; charset=utf-8"; } else if (soap->mode & SOAP_ENC_MTOM) s = "application/xop+xml; charset=utf-8; type=\"text/xml\""; else s = "text/xml; charset=utf-8"; (SOAP_SNPRINTF_SAFE(soap->tmpbuf, sizeof(soap->tmpbuf)), "--%s\r\nContent-Type: %s\r\nContent-Transfer-Encoding: binary\r\nContent-ID: %s\r\n\r\n", soap->mime.boundary, s, soap->mime.start); n = strlen(soap->tmpbuf); if (soap_send_raw(soap, soap->tmpbuf, n)) return soap->error; } if (soap->mode & SOAP_IO_LENGTH) soap->dime.size = soap->count; /* DIME in MIME correction */ if (!(soap->mode & SOAP_IO_LENGTH) && (soap->mode & SOAP_ENC_DIME)) { if (soap_putdimehdr(soap)) return soap->error; } #endif if (soap->version == 0) return SOAP_OK; soap->part = SOAP_IN_ENVELOPE; return soap_element_begin_out(soap, "SOAP-ENV:Envelope", 0, NULL); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_end_out(struct soap *soap) { if (soap->version == 0) return SOAP_OK; if (soap_element_end_out(soap, "SOAP-ENV:Envelope") || soap_send_raw(soap, "\r\n", 2)) /* 2.8: always emit \r\n */ return soap->error; #ifndef WITH_LEANER if ((soap->mode & SOAP_IO_LENGTH) && (soap->mode & SOAP_ENC_DIME) && !(soap->mode & SOAP_ENC_MTOM)) { soap->dime.size = soap->count - soap->dime.size; /* DIME in MIME correction */ (SOAP_SNPRINTF(soap->id, sizeof(soap->id), strlen(soap->dime_id_format) + 20), soap->dime_id_format, 0); soap->dime.id = soap->id; if (soap->local_namespaces) { if (soap->local_namespaces[0].out) soap->dime.type = (char*)soap->local_namespaces[0].out; else soap->dime.type = (char*)soap->local_namespaces[0].ns; } soap->dime.options = NULL; soap->dime.flags = SOAP_DIME_MB | SOAP_DIME_ABSURI; if (!soap->dime.first) soap->dime.flags |= SOAP_DIME_ME; soap->count += 12 + ((strlen(soap->dime.id)+3)&(~3)) + (soap->dime.type ? ((strlen(soap->dime.type)+3)&(~3)) : 0); } if ((soap->mode & SOAP_ENC_DIME) && !(soap->mode & SOAP_ENC_MTOM)) return soap_send_raw(soap, SOAP_STR_PADDING, -(long)soap->dime.size&3); #endif soap->part = SOAP_END_ENVELOPE; return SOAP_OK; } #endif /******************************************************************************/ #ifndef WITH_LEAN #ifndef PALM_1 SOAP_FMAC1 char* SOAP_FMAC2 soap_get_http_body(struct soap *soap, size_t *len) { #ifndef WITH_LEAN size_t l = 0, n = 0; char *s; if (len) *len = 0; /* get HTTP body length */ if (!(soap->mode & SOAP_ENC_ZLIB) && (soap->mode & SOAP_IO) != SOAP_IO_CHUNK) { n = soap->length; if (!n) return NULL; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Parsing HTTP body (mode=0x%x,len=%lu)\n", soap->mode, (unsigned long)n)); #ifdef WITH_FAST soap->labidx = 0; /* use look-aside buffer */ #else if (soap_new_block(soap) == NULL) return NULL; #endif for (;;) { #ifdef WITH_FAST size_t i, k; if (soap_append_lab(soap, NULL, 0)) /* allocate more space in look-aside buffer if necessary */ return NULL; s = soap->labbuf + soap->labidx; /* space to populate */ k = soap->lablen - soap->labidx; /* number of bytes available */ soap->labidx = soap->lablen; /* claim this space */ #else size_t i, k = SOAP_BLKLEN; if (!(s = (char*)soap_push_block(soap, NULL, k))) return NULL; #endif for (i = 0; i < k; i++) { soap_wchar c; l++; if (n > 0 && l > n) goto end; c = soap_get1(soap); if ((int)c == EOF) goto end; *s++ = (char)(c & 0xFF); } } end: *s = '\0'; if (len) *len = l - 1; /* len excludes terminating \0 */ #ifdef WITH_FAST if ((s = (char*)soap_malloc(soap, l))) soap_memcpy((void*)s, l, (const void*)soap->labbuf, l); #else soap_size_block(soap, NULL, i+1); s = soap_save_block(soap, NULL, NULL, 0); #endif return s; #else if (len) *len = 0; return NULL; #endif } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_begin_in(struct soap *soap) { soap->part = SOAP_IN_ENVELOPE; if (soap_element_begin_in(soap, "SOAP-ENV:Envelope", 0, NULL)) { if (soap->error == SOAP_TAG_MISMATCH) { if (!soap_element_begin_in(soap, "Envelope", 0, NULL)) soap->error = SOAP_VERSIONMISMATCH; else if (soap->status == 0 || (soap->status >= 200 && soap->status <= 299)) return SOAP_OK; /* allow non-SOAP (REST) XML content to be captured */ soap->error = soap->status; } else if (soap->status) soap->error = soap->status; return soap->error; } soap_get_version(soap); return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_end_in(struct soap *soap) { if (soap->version == 0) return SOAP_OK; soap->part = SOAP_END_ENVELOPE; return soap_element_end_in(soap, "SOAP-ENV:Envelope"); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_body_begin_out(struct soap *soap) { if (soap->version == 1) soap->encoding = 1; #ifndef WITH_LEAN if ((soap->mode & SOAP_SEC_WSUID) && soap_set_attr(soap, "wsu:Id", "Body", 1)) return soap->error; #endif if (soap->version == 0) return SOAP_OK; soap->part = SOAP_IN_BODY; return soap_element_begin_out(soap, "SOAP-ENV:Body", 0, NULL); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_body_end_out(struct soap *soap) { if (soap->version == 0) return SOAP_OK; if (soap_element_end_out(soap, "SOAP-ENV:Body")) return soap->error; soap->part = SOAP_END_BODY; return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_body_begin_in(struct soap *soap) { if (soap->version == 0) return SOAP_OK; soap->part = SOAP_IN_BODY; if (soap_element_begin_in(soap, "SOAP-ENV:Body", 0, NULL)) return soap->error; if (!soap->body) soap->part = SOAP_NO_BODY; return SOAP_OK; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_body_end_in(struct soap *soap) { if (soap->version == 0) return SOAP_OK; if (soap->part == SOAP_NO_BODY) return soap->error = SOAP_OK; soap->part = SOAP_END_BODY; return soap_element_end_in(soap, "SOAP-ENV:Body"); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_recv_header(struct soap *soap) { if (soap_getheader(soap) && soap->error == SOAP_TAG_MISMATCH) soap->error = SOAP_OK; if (soap->error == SOAP_OK && soap->fheader) soap->error = soap->fheader(soap); return soap->error; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_set_endpoint(struct soap *soap, const char *endpoint) { const char *s; size_t i, n; soap->endpoint[0] = '\0'; soap->host[0] = '\0'; soap->path[0] = '/'; soap->path[1] = '\0'; soap->port = 80; if (!endpoint || !*endpoint) return; #ifdef WITH_OPENSSL if (!soap_tag_cmp(endpoint, "https:*")) soap->port = 443; #endif soap_strcpy(soap->endpoint, sizeof(soap->endpoint), endpoint); s = strchr(endpoint, ':'); if (s && s[1] == '/' && s[2] == '/') s += 3; else s = endpoint; n = strlen(s); if (n >= sizeof(soap->host)) n = sizeof(soap->host) - 1; #ifdef WITH_IPV6 if (s[0] == '[') { s++; for (i = 0; i < n; i++) { if (s[i] == ']') { s++; --n; break; } soap->host[i] = s[i]; } } else { for (i = 0; i < n; i++) { soap->host[i] = s[i]; if (s[i] == '/' || s[i] == ':') break; } } #else for (i = 0; i < n; i++) { soap->host[i] = s[i]; if (s[i] == '/' || s[i] == ':') break; } #endif soap->host[i] = '\0'; if (s[i] == ':') { soap->port = (int)soap_strtol(s + i + 1, NULL, 10); for (i++; i < n; i++) if (s[i] == '/') break; } if (i < n && s[i]) soap_strcpy(soap->path, sizeof(soap->path), s + i); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_connect(struct soap *soap, const char *endpoint, const char *action) { return soap_connect_command(soap, SOAP_POST, endpoint, action); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_connect_command(struct soap *soap, int http_command, const char *endpoints, const char *action) { if (endpoints) { const char *s; s = strchr(endpoints, ' '); if (s) { size_t l = strlen(endpoints); char *endpoint = (char*)SOAP_MALLOC(soap, l + 1); for (;;) { soap_strncpy(endpoint, l + 1, endpoints, s - endpoints); endpoint[s - endpoints] = '\0'; if (soap_try_connect_command(soap, http_command, endpoint, action) != SOAP_TCP_ERROR) break; if (!*s) break; soap->error = SOAP_OK; while (*s == ' ') s++; endpoints = s; s = strchr(endpoints, ' '); if (!s) s = endpoints + strlen(endpoints); } SOAP_FREE(soap, endpoint); } else soap_try_connect_command(soap, http_command, endpoints, action); } return soap->error; } #endif /******************************************************************************/ #ifndef PALM_1 static int soap_try_connect_command(struct soap *soap, int http_command, const char *endpoint, const char *action) { char host[sizeof(soap->host)]; int port; size_t count; soap->error = SOAP_OK; soap_strcpy(host, sizeof(soap->host), soap->host); /* save previous host name: if != then reconnect */ port = soap->port; /* save previous port to compare */ soap->status = http_command; soap_set_endpoint(soap, endpoint); soap->action = soap_strdup(soap, action); #ifndef WITH_LEANER if (soap->fconnect) { if ((soap->error = soap->fconnect(soap, endpoint, soap->host, soap->port))) return soap->error; } else #endif if (soap->fopen && *soap->host) { if (!soap->keep_alive || !soap_valid_socket(soap->socket) || strcmp(soap->host, host) || soap->port != port || !soap->fpoll || soap->fpoll(soap)) { soap->error = SOAP_OK; #ifndef WITH_LEAN if (!strncmp(endpoint, "soap.udp:", 9)) soap->omode |= SOAP_IO_UDP; else #endif { soap->keep_alive = 0; /* to force close */ soap->omode &= ~SOAP_IO_UDP; /* to force close */ } soap_closesock(soap); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connect/reconnect to '%s' host='%s' path='%s' port=%d\n", endpoint?endpoint:"(null)", soap->host, soap->path, soap->port)); if (!soap->keep_alive || !soap_valid_socket(soap->socket)) { soap->socket = soap->fopen(soap, endpoint, soap->host, soap->port); if (soap->error) return soap->error; soap->keep_alive = ((soap->omode & SOAP_IO_KEEPALIVE) != 0); } } } #ifdef WITH_NTLM if (soap_ntlm_handshake(soap, SOAP_GET, endpoint, soap->host, soap->port)) return soap->error; #endif count = soap_count_attachments(soap); if (soap_begin_send(soap)) return soap->error; if (http_command == SOAP_GET) { soap->mode &= ~SOAP_IO; soap->mode |= SOAP_IO_BUFFER; } #ifndef WITH_NOHTTP if ((soap->mode & SOAP_IO) != SOAP_IO_STORE && !(soap->mode & SOAP_ENC_XML) && endpoint) { unsigned int k = soap->mode; soap->mode &= ~(SOAP_IO | SOAP_ENC_ZLIB); if ((k & SOAP_IO) != SOAP_IO_FLUSH) soap->mode |= SOAP_IO_BUFFER; if ((soap->error = soap->fpost(soap, endpoint, soap->host, soap->port, soap->path, action, count))) return soap->error; #ifndef WITH_LEANER if ((k & SOAP_IO) == SOAP_IO_CHUNK) { if (soap_flush(soap)) return soap->error; } #endif soap->mode = k; } if (http_command == SOAP_GET || http_command == SOAP_DEL) return soap_end_send_flush(soap); #endif return SOAP_OK; } #endif /******************************************************************************/ #ifdef WITH_NTLM #ifndef PALM_1 static int soap_ntlm_handshake(struct soap *soap, int command, const char *endpoint, const char *host, int port) { /* requires libntlm from http://www.nongnu.org/libntlm/ */ const char *userid = (soap->proxy_userid ? soap->proxy_userid : soap->userid); const char *passwd = (soap->proxy_passwd ? soap->proxy_passwd : soap->passwd); struct SOAP_ENV__Header *oldheader; if (soap->ntlm_challenge && userid && passwd && soap->authrealm) { tSmbNtlmAuthRequest req; tSmbNtlmAuthResponse res; tSmbNtlmAuthChallenge ch; short k = soap->keep_alive; size_t l = soap->length; size_t c = soap->count; soap_mode m = soap->mode, o = soap->omode; int s = soap->status; char *a = soap->action; short v = soap->version; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "NTLM '%s'\n", soap->ntlm_challenge)); if (!*soap->ntlm_challenge) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "NTLM S->C Type 1: received NTLM authentication challenge from server\n")); /* S -> C 401 Unauthorized WWW-Authenticate: NTLM */ buildSmbNtlmAuthRequest(&req, userid, soap->authrealm); soap->ntlm_challenge = soap_s2base64(soap, (unsigned char*)(void*)&req, NULL, SmbLength(&req)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "NTLM C->S Type 2: sending NTLM authorization to server\nAuthorization: NTLM %s\n", soap->ntlm_challenge)); /* C -> S GET ... Authorization: NTLM TlRMTVNTUAABAAAAA7IAAAoACgApAAAACQAJACAAAABMSUdIVENJVFlVUlNBLU1JTk9S */ soap->omode = SOAP_IO_BUFFER; if (soap_begin_send(soap)) return soap->error; soap->keep_alive = 1; soap->status = command; if (soap->fpost(soap, endpoint, host, port, soap->path, soap->action, 0) || soap_end_send_flush(soap)) return soap->error; soap->mode = m; soap->keep_alive = k; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "NTLM S->C Type 2: waiting on server NTLM response\n")); oldheader = soap->header; if (soap_begin_recv(soap)) if (soap->error == SOAP_EOF) return soap->error; soap_end_recv(soap); soap->header = oldheader; soap->length = l; if (soap->status != 401 && soap->status != 407) return soap->error = SOAP_NTLM_ERROR; soap->error = SOAP_OK; } /* S -> C 401 Unauthorized WWW-Authenticate: NTLM TlRMTVNTUAACAAAAAAAAACgAAAABggAAU3J2Tm9uY2UAAAAAAAAAAA== */ soap_base642s(soap, soap->ntlm_challenge, (char*)&ch, sizeof(tSmbNtlmAuthChallenge), NULL); buildSmbNtlmAuthResponse(&ch, &res, userid, passwd); soap->ntlm_challenge = soap_s2base64(soap, (unsigned char*)(void*)&res, NULL, SmbLength(&res)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "NTLM C->S Type 3: sending NTLM authorization to server\nAuthorization: NTLM %s\n", soap->ntlm_challenge)); /* C -> S GET ... Authorization: NTLM TlRMTVNTUAADAAAAGAAYAHIAAAAYABgAigAAABQAFABAAAAADAAMAFQAAAASABIAYAAAAAAAAACiAAAAAYIAAFUAUgBTAEEALQBNAEkATgBPAFIAWgBhAHAAaABvAGQATABJAEcASABUAEMASQBUAFkArYfKbe/jRoW5xDxHeoxC1gBmfWiS5+iX4OAN4xBKG/IFPwfH3agtPEia6YnhsADT */ soap->userid = NULL; soap->passwd = NULL; soap->proxy_userid = NULL; soap->proxy_passwd = NULL; soap->keep_alive = k; soap->length = l; soap->count = c; soap->mode = m; soap->omode = o; soap->status = s; soap->action = a; soap->version = v; } return SOAP_OK; } #endif #endif /******************************************************************************/ #if !defined(WITH_LEAN) || defined(WITH_NTLM) SOAP_FMAC1 char* SOAP_FMAC2 soap_s2base64(struct soap *soap, const unsigned char *s, char *t, int n) { int i; unsigned long m; char *p; if (!t) t = (char*)soap_malloc(soap, (n + 2) / 3 * 4 + 1); if (!t) return NULL; p = t; t[0] = '\0'; if (!s) return p; for (; n > 2; n -= 3, s += 3) { m = s[0]; m = (m << 8) | s[1]; m = (m << 8) | s[2]; for (i = 4; i > 0; m >>= 6) t[--i] = soap_base64o[m & 0x3F]; t += 4; } t[0] = '\0'; if (n > 0) /* 0 < n <= 2 implies that t[0..4] is allocated (base64 scaling formula) */ { m = 0; for (i = 0; i < n; i++) m = (m << 8) | *s++; for (; i < 3; i++) m <<= 8; for (i = 4; i > 0; m >>= 6) t[--i] = soap_base64o[m & 0x3F]; for (i = 3; i > n; i--) t[i] = '='; t[4] = '\0'; } return p; } #endif /******************************************************************************/ #if !defined(WITH_LEAN) || defined(WITH_NTLM) SOAP_FMAC1 const char* SOAP_FMAC2 soap_base642s(struct soap *soap, const char *s, char *t, size_t l, int *n) { size_t i, j; soap_wchar c; unsigned long m; const char *p; if (!s || !*s) { if (n) *n = 0; if (soap->error) return NULL; return SOAP_NON_NULL; } if (!t) { l = (strlen(s) + 3) / 4 * 3 + 1; /* space for raw binary and \0 */ t = (char*)soap_malloc(soap, l); } if (!t) return NULL; p = t; if (n) *n = 0; for (i = 0; ; i += 3, l -= 3) { m = 0; j = 0; while (j < 4) { c = *s++; if (c == '=' || !c) { if (l >= j - 1) { switch (j) { case 2: *t++ = (char)((m >> 4) & 0xFF); i++; l--; break; case 3: *t++ = (char)((m >> 10) & 0xFF); *t++ = (char)((m >> 2) & 0xFF); i += 2; l -= 2; } } if (n) *n = (int)i; if (l) *t = '\0'; return p; } c -= '+'; if (c >= 0 && c <= 79) { int b = soap_base64i[c]; if (b >= 64) { soap->error = SOAP_TYPE; return NULL; } m = (m << 6) + b; j++; } else if (!soap_blank(c + '+')) { soap->error = SOAP_TYPE; return NULL; } } if (l < 3) { if (n) *n = (int)i; if (l) *t = '\0'; return p; } *t++ = (char)((m >> 16) & 0xFF); *t++ = (char)((m >> 8) & 0xFF); *t++ = (char)(m & 0xFF); } } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 char* SOAP_FMAC2 soap_s2hex(struct soap *soap, const unsigned char *s, char *t, int n) { char *p; if (!t) t = (char*)soap_malloc(soap, 2 * n + 1); if (!t) return NULL; p = t; t[0] = '\0'; if (s) { for (; n > 0; n--) { int m = *s++; *t++ = (char)((m >> 4) + (m > 159 ? 'a' - 10 : '0')); m &= 0x0F; *t++ = (char)(m + (m > 9 ? 'a' - 10 : '0')); } } *t++ = '\0'; return p; } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 const char* SOAP_FMAC2 soap_hex2s(struct soap *soap, const char *s, char *t, size_t l, int *n) { const char *p; if (!s || !*s) { if (n) *n = 0; if (soap->error) return NULL; return SOAP_NON_NULL; } if (!t) { l = strlen(s) / 2 + 1; /* make sure enough space for \0 */ t = (char*)soap_malloc(soap, l); } if (!t) return NULL; p = t; while (l) { int d1, d2; d1 = *s++; if (!d1) break; d2 = *s++; if (!d2) break; *t++ = (char)(((d1 >= 'A' ? (d1 & 0x7) + 9 : d1 - '0') << 4) + (d2 >= 'A' ? (d2 & 0x7) + 9 : d2 - '0')); l--; } if (n) *n = (int)(t - p); if (l) *t = '\0'; return p; } #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_puthttphdr(struct soap *soap, int status, size_t count) { if (soap->status != SOAP_GET && soap->status != SOAP_DEL && soap->status != SOAP_CONNECT) { const char *s = "text/xml; charset=utf-8"; int err = SOAP_OK; #ifndef WITH_LEANER const char *r = NULL; size_t n; #endif if ((status == SOAP_FILE || soap->status == SOAP_PUT || soap->status == SOAP_POST_FILE) && soap->http_content && !strchr(s, 10) && !strchr(s, 13)) s = soap->http_content; else if (status == SOAP_HTML) s = "text/html; charset=utf-8"; else if (count || ((soap->omode & SOAP_IO) == SOAP_IO_CHUNK)) { if (soap->version == 2) s = "application/soap+xml; charset=utf-8"; } #ifndef WITH_LEANER if (soap->mode & (SOAP_ENC_DIME | SOAP_ENC_MTOM)) { if (soap->mode & SOAP_ENC_MTOM) { if (soap->version == 2) r = "application/soap+xml"; else r = "text/xml"; s = "application/xop+xml"; } else s = "application/dime"; } if ((soap->mode & SOAP_ENC_MIME) && soap->mime.boundary) { const char *t; size_t l; n = strlen(soap->mime.boundary); (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), n + 53), "multipart/related; charset=utf-8; boundary=\"%s\"; type=\"", soap->mime.boundary); t = strchr(s, ';'); if (t) n = t - s; else n = strlen(s); l = strlen(soap->tmpbuf); if (sizeof(soap->tmpbuf) - l > n) soap_strncpy(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, s, n); if (soap->mime.start) { l = strlen(soap->tmpbuf); n = strlen(soap->mime.start); (SOAP_SNPRINTF(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, n + 10), "\"; start=\"%s", soap->mime.start); } if (r) { l = strlen(soap->tmpbuf); n = strlen(r); (SOAP_SNPRINTF(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, n + 15), "\"; start-info=\"%s", r); } l = strlen(soap->tmpbuf); if (sizeof(soap->tmpbuf) - l > 1) soap_strncpy(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, "\"", 1); } else soap_strcpy(soap->tmpbuf, sizeof(soap->tmpbuf), s); if (status == SOAP_OK && soap->version == 2 && soap->action) { size_t l = strlen(soap->tmpbuf); (SOAP_SNPRINTF(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, n + 11), "; action=\"%s\"", soap->action); } #endif if ((err = soap->fposthdr(soap, "Content-Type", soap->tmpbuf))) return err; #ifdef WITH_ZLIB if ((soap->omode & SOAP_ENC_ZLIB)) { #ifdef WITH_GZIP err = soap->fposthdr(soap, "Content-Encoding", soap->zlib_out == SOAP_ZLIB_DEFLATE ? "deflate" : "gzip"); #else err = soap->fposthdr(soap, "Content-Encoding", "deflate"); #endif if (err) return err; } #endif #ifndef WITH_LEANER if ((soap->omode & SOAP_IO) == SOAP_IO_CHUNK) err = soap->fposthdr(soap, "Transfer-Encoding", "chunked"); else #endif { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 20), SOAP_ULONG_FORMAT, (ULONG64)count); err = soap->fposthdr(soap, "Content-Length", soap->tmpbuf); } if (err) return err; } return soap->fposthdr(soap, "Connection", soap->keep_alive ? "keep-alive" : "close"); } #endif #endif /******************************************************************************/ #ifndef WITH_LEAN static const char* soap_set_validation_fault(struct soap *soap, const char *s, const char *t) { if (!t) t = SOAP_STR_EOS; if (*soap->tag) (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), strlen(s) + strlen(t) + strlen(soap->tag) + 47), "Validation constraint violation: %s%s in element '%s'", s, t, soap->tag); else (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), strlen(s) + strlen(t) + 33), "Validation constraint violation: %s%s", s, t); return soap->msgbuf; } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 void SOAP_FMAC2 soap_set_fault(struct soap *soap) { const char **c = soap_faultcode(soap); const char **s = soap_faultstring(soap); if (soap->fseterror) soap->fseterror(soap, c, s); if (!*c) { if (soap->version == 2) *c = "SOAP-ENV:Sender"; else if (soap->version == 1) *c = "SOAP-ENV:Client"; else *c = "at source"; } if (*s) return; switch (soap->error) { #ifndef WITH_LEAN case SOAP_CLI_FAULT: *s = "Client fault"; break; case SOAP_SVR_FAULT: *s = "Server fault"; break; case SOAP_TAG_MISMATCH: *s = soap_set_validation_fault(soap, "tag name or namespace mismatch", NULL); break; case SOAP_TYPE: if (*soap->type) *s = soap_set_validation_fault(soap, "type mismatch ", soap->type); else *s = soap_set_validation_fault(soap, "invalid value", NULL); break; case SOAP_SYNTAX_ERROR: *s = soap_set_validation_fault(soap, "syntax error", NULL); break; case SOAP_NO_TAG: if (soap->version == 0 && soap->level == 0) *s = soap_set_validation_fault(soap, "missing root element", NULL); else if (soap->version != 0 && soap->level < 3) *s = soap_set_validation_fault(soap, "missing SOAP message", NULL); else *s = soap_set_validation_fault(soap, "missing element", NULL); break; case SOAP_MUSTUNDERSTAND: *c = "SOAP-ENV:MustUnderstand"; (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), strlen(soap->tag) + 65), "The data in element '%s' must be understood but cannot be processed", soap->tag); *s = soap->msgbuf; break; case SOAP_VERSIONMISMATCH: *c = "SOAP-ENV:VersionMismatch"; *s = "Invalid SOAP message or SOAP version mismatch"; break; case SOAP_DATAENCODINGUNKNOWN: *c = "SOAP-ENV:DataEncodingUnknown"; *s = "Unsupported SOAP data encoding"; break; case SOAP_NAMESPACE: *s = soap_set_validation_fault(soap, "namespace error", NULL); break; case SOAP_USER_ERROR: *s = "User data access error"; break; case SOAP_FATAL_ERROR: *s = "A fatal error has occurred"; break; case SOAP_NO_METHOD: (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), strlen(soap->tag) + 66), "Method '%s' not implemented: method name or namespace not recognized", soap->tag); *s = soap->msgbuf; break; case SOAP_NO_DATA: *s = "Data required for operation"; break; case SOAP_GET_METHOD: *s = "HTTP GET method not implemented"; break; case SOAP_PUT_METHOD: *s = "HTTP PUT method not implemented"; break; case SOAP_HTTP_METHOD: *s = "HTTP method not implemented"; break; case SOAP_EOM: *s = "Out of memory"; break; case SOAP_MOE: *s = "Memory overflow or memory corruption error"; break; case SOAP_HDR: *s = "Header line too long"; break; case SOAP_IOB: *s = "Array index out of bounds"; break; case SOAP_NULL: *s = soap_set_validation_fault(soap, "nil not allowed", NULL); break; case SOAP_DUPLICATE_ID: *s = soap_set_validation_fault(soap, "multiple elements (use the SOAP_XML_TREE flag) with duplicate id ", soap->id); if (soap->version == 2) *soap_faultsubcode(soap) = "SOAP-ENC:DuplicateID"; break; case SOAP_MISSING_ID: *s = soap_set_validation_fault(soap, "missing id for ref ", soap->id); if (soap->version == 2) *soap_faultsubcode(soap) = "SOAP-ENC:MissingID"; break; case SOAP_HREF: *s = soap_set_validation_fault(soap, "incompatible object type id-ref ", soap->id); break; case SOAP_FAULT: break; #ifndef WITH_NOIO case SOAP_UDP_ERROR: *s = "Message too large for UDP packet"; break; case SOAP_TCP_ERROR: *s = tcp_error(soap); break; #endif case SOAP_HTTP_ERROR: *s = "An HTTP processing error occurred"; break; case SOAP_NTLM_ERROR: *s = "An HTTP NTLM authentication error occurred"; break; case SOAP_SSL_ERROR: #ifdef WITH_OPENSSL *s = "SSL/TLS error"; #else *s = "OpenSSL not installed: recompile with -DWITH_OPENSSL"; #endif break; case SOAP_PLUGIN_ERROR: *s = "Plugin registry error"; break; case SOAP_DIME_ERROR: *s = "DIME format error or max DIME size exceeds SOAP_MAXDIMESIZE"; break; case SOAP_DIME_HREF: *s = "DIME href to missing attachment"; break; case SOAP_DIME_MISMATCH: *s = "DIME version/transmission error"; break; case SOAP_DIME_END: *s = "End of DIME error"; break; case SOAP_MIME_ERROR: *s = "MIME format error"; break; case SOAP_MIME_HREF: *s = "MIME href to missing attachment"; break; case SOAP_MIME_END: *s = "End of MIME error"; break; case SOAP_ZLIB_ERROR: #ifdef WITH_ZLIB (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), (soap->d_stream && soap->d_stream->msg ? strlen(soap->d_stream->msg) : 0) + 19), "Zlib/gzip error: '%s'", soap->d_stream && soap->d_stream->msg ? soap->d_stream->msg : SOAP_STR_EOS); *s = soap->msgbuf; #else *s = "Zlib/gzip not installed for (de)compression: recompile with -DWITH_GZIP"; #endif break; case SOAP_REQUIRED: *s = soap_set_validation_fault(soap, "missing required attribute", NULL); break; case SOAP_PROHIBITED: *s = soap_set_validation_fault(soap, "prohibited attribute present", NULL); break; case SOAP_OCCURS: *s = soap_set_validation_fault(soap, "occurrence violation", NULL); break; case SOAP_LENGTH: *s = soap_set_validation_fault(soap, "value range or content length violation", NULL); break; case SOAP_FD_EXCEEDED: *s = "Maximum number of open connections was reached (no define HAVE_POLL): increase FD_SETSIZE"; break; case SOAP_UTF_ERROR: *s = "UTF content encoding error"; break; case SOAP_STOP: *s = "Stopped: no response sent or received (informative)"; break; #endif case SOAP_EOF: #ifndef WITH_NOIO *s = soap_strerror(soap); /* *s = soap->msgbuf */ #ifndef WITH_LEAN if (strlen(soap->msgbuf) + 25 < sizeof(soap->msgbuf)) { soap_memmove((void*)(soap->msgbuf + 25), sizeof(soap->tmpbuf) - 25, (const void*)soap->msgbuf, strlen(soap->msgbuf) + 1); if (soap->is) #if defined(__cplusplus) && !defined(WITH_COMPAT) soap_memcpy((void*)soap->msgbuf, sizeof(soap->msgbuf), (const void*)"End or bad std::istream: ", 25); #else soap_memcpy((void*)soap->msgbuf, sizeof(soap->msgbuf), (const void*)"End at NUL buffer input: ", 25); #endif else soap_memcpy((void*)soap->msgbuf, sizeof(soap->msgbuf), (const void*)"End of file or no input: ", 25); } #endif break; #else *s = "End of file or no input"; break; #endif default: #ifndef WITH_NOHTTP #ifndef WITH_LEAN if (soap->error >= 200 && soap->error < 600) { const char *t = http_error(soap, soap->error); (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), strlen(t) + 54), "Error %d: HTTP %d %s", soap->error, soap->error, t); *s = soap->msgbuf; } else #endif #endif { (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), 26), "Error %d", soap->error); *s = soap->msgbuf; } } } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_send_fault(struct soap *soap) { int status = soap->error; if (status == SOAP_OK || status == SOAP_STOP) return soap_closesock(soap); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Sending back fault struct for error code %d\n", soap->error)); soap->keep_alive = 0; /* to terminate connection */ soap_set_fault(soap); if (soap->error < 200 && soap->error != SOAP_FAULT) soap->header = NULL; if (status != SOAP_EOF || (!soap->recv_timeout && !soap->send_timeout)) { int r = 1; #ifndef WITH_NOIO if (soap->fpoll && soap->fpoll(soap)) r = 0; #ifndef WITH_LEAN else if (soap_valid_socket(soap->socket)) { r = tcp_select(soap, soap->socket, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_SND, 0); if (r > 0) { int t; if (!(r & SOAP_TCP_SELECT_SND) || ((r & SOAP_TCP_SELECT_RCV) && recv(soap->socket, (char*)&t, 1, MSG_PEEK) < 0)) r = 0; } } #endif #endif if (r > 0) { soap->error = SOAP_OK; soap->encodingStyle = NULL; /* no encodingStyle in Faults */ soap_serializeheader(soap); soap_serializefault(soap); (void)soap_begin_count(soap); if (soap->mode & SOAP_IO_LENGTH) { if (soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_putfault(soap) || soap_body_end_out(soap) || soap_envelope_end_out(soap)) return soap_closesock(soap); } (void)soap_end_count(soap); if (soap_response(soap, status) || soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_putfault(soap) || soap_body_end_out(soap) || soap_envelope_end_out(soap) || soap_end_send(soap)) return soap_closesock(soap); } } soap->error = status; return soap_closesock(soap); } #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_recv_fault(struct soap *soap, int check) { int status = soap->status; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Check (%d) if receiving SOAP Fault (status = %d)\n", check, status)); if (!check) { /* try getfault when no tag or tag mismatched at level 2, otherwise ret */ if (soap->error != SOAP_NO_TAG && (soap->error != SOAP_TAG_MISMATCH || soap->level != 2)) return soap->error; } else if (soap->version == 0) /* check == 1 but no SOAP: do not parse SOAP Fault */ { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Not a SOAP protocol\n")); return SOAP_OK; } soap->error = SOAP_OK; if (soap_getfault(soap)) { /* check flag set: check if SOAP Fault is present, if not just return */ if (check && soap->error == SOAP_TAG_MISMATCH && soap->level == 2) return soap->error = SOAP_OK; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Error: soap_get_soapfault() failed at level %u tag '%s'\n", soap->level, soap->tag)); *soap_faultcode(soap) = (soap->version == 2 ? "SOAP-ENV:Sender" : "SOAP-ENV:Client"); if (status) soap->error = status; else soap->error = status = SOAP_NO_DATA; soap_set_fault(soap); } else { const char *s = *soap_faultcode(soap); if (!soap_match_tag(soap, s, "SOAP-ENV:Server") || !soap_match_tag(soap, s, "SOAP-ENV:Receiver")) status = SOAP_SVR_FAULT; else if (!soap_match_tag(soap, s, "SOAP-ENV:Client") || !soap_match_tag(soap, s, "SOAP-ENV:Sender")) status = SOAP_CLI_FAULT; else if (!soap_match_tag(soap, s, "SOAP-ENV:MustUnderstand")) status = SOAP_MUSTUNDERSTAND; else if (!soap_match_tag(soap, s, "SOAP-ENV:VersionMismatch")) status = SOAP_VERSIONMISMATCH; else { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Received SOAP Fault code %s\n", s)); status = SOAP_FAULT; } if (!soap_body_end_in(soap)) soap_envelope_end_in(soap); } soap_end_recv(soap); soap->error = status; return soap_closesock(soap); } #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_send_empty_response(struct soap *soap, int httpstatuscode) { soap_mode m = soap->omode; if (!(m & SOAP_IO_UDP)) { soap->count = 0; if ((m & SOAP_IO) == SOAP_IO_CHUNK) soap->omode = (m & ~SOAP_IO) | SOAP_IO_BUFFER; soap_response(soap, httpstatuscode); soap_end_send(soap); /* force end of sends */ soap->error = SOAP_STOP; /* stops the server (from returning another response */ soap->omode = m; } return soap_closesock(soap); } #endif #endif /******************************************************************************/ #ifndef WITH_NOHTTP #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_recv_empty_response(struct soap *soap) { if (!(soap->omode & SOAP_IO_UDP)) { if (!soap_begin_recv(soap)) { if (soap->body) { if ((soap->status != 400 && soap->status != 500) || soap_envelope_begin_in(soap) || soap_recv_header(soap) || soap_body_begin_in(soap)) { #ifndef WITH_LEAN const char *s = soap_get_http_body(soap, NULL); #endif soap_end_recv(soap); #ifndef WITH_LEAN if (s) soap_set_receiver_error(soap, "HTTP Error", s, soap->status); #endif } else return soap_recv_fault(soap, 1); } else soap_end_recv(soap); } else if (soap->error == SOAP_NO_DATA || soap->error == 200 || soap->error == 202) soap->error = SOAP_OK; } return soap_closesock(soap); } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO #ifndef PALM_1 static const char* soap_strerror(struct soap *soap) { int err = soap->errnum; *soap->msgbuf = '\0'; if (err) { #ifndef WIN32 # ifdef HAVE_STRERROR_R # ifdef _GNU_SOURCE return strerror_r(err, soap->msgbuf, sizeof(soap->msgbuf)); /* GNU-specific */ # else strerror_r(err, soap->msgbuf, sizeof(soap->msgbuf)); /* XSI-compliant */ # endif # else return strerror(err); # endif #else #ifndef UNDER_CE DWORD len; *soap->msgbuf = '\0'; len = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)soap->msgbuf, (DWORD)sizeof(soap->msgbuf), NULL); #else DWORD i, len; *soap->msgbuf = '\0'; len = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, err, 0, (LPTSTR)soap->msgbuf, (DWORD)(sizeof(soap->msgbuf)/sizeof(TCHAR)), NULL); for (i = 0; i <= len; i++) { if (((TCHAR*)soap->msgbuf)[i] < 0x80) soap->msgbuf[i] = (char)((TCHAR*)soap->msgbuf)[i]; else soap->msgbuf[i] = '?'; } #endif #endif } else { int rt = soap->recv_timeout, st = soap->send_timeout; #ifndef WITH_LEAN int ru = ' ', su = ' '; #endif soap_strcpy(soap->msgbuf, sizeof(soap->msgbuf), "message transfer interrupted"); if (rt || st) soap_strcpy(soap->msgbuf + 28, sizeof(soap->msgbuf) - 28, " or timed out"); #ifndef WITH_LEAN if (rt < 0) { rt = -rt; ru = 'u'; } if (st < 0) { st = -st; su = 'u'; } if (rt) { size_t l = strlen(soap->msgbuf); (SOAP_SNPRINTF(soap->msgbuf + l, sizeof(soap->msgbuf) - l, 36), " (%d%cs recv delay)", rt, ru); } if (st) { size_t l = strlen(soap->msgbuf); (SOAP_SNPRINTF(soap->msgbuf + l, sizeof(soap->msgbuf) - l, 36), " (%d%cs send delay)", st, su); } #endif } return soap->msgbuf; } #endif #endif /******************************************************************************/ #ifndef PALM_2 static int soap_set_error(struct soap *soap, const char *faultcode, const char *faultsubcodeQName, const char *faultstring, const char *faultdetailXML, int soaperror) { *soap_faultcode(soap) = faultcode; if (faultsubcodeQName) *soap_faultsubcode(soap) = faultsubcodeQName; *soap_faultstring(soap) = faultstring; if (faultdetailXML && *faultdetailXML) { const char **s = soap_faultdetail(soap); if (s) *s = faultdetailXML; } return soap->error = soaperror; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_set_sender_error(struct soap *soap, const char *faultstring, const char *faultdetailXML, int soaperror) { return soap_set_error(soap, soap->version == 2 ? "SOAP-ENV:Sender" : soap->version == 1 ? "SOAP-ENV:Client" : "at source", NULL, faultstring, faultdetailXML, soaperror); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_set_receiver_error(struct soap *soap, const char *faultstring, const char *faultdetailXML, int soaperror) { return soap_set_error(soap, soap->version == 2 ? "SOAP-ENV:Receiver" : soap->version == 1 ? "SOAP-ENV:Server" : "is internal", NULL, faultstring, faultdetailXML, soaperror); } #endif /******************************************************************************/ #ifndef PALM_2 static int soap_copy_fault(struct soap *soap, const char *faultcode, const char *faultsubcodeQName, const char *faultstring, const char *faultdetailXML) { char *r = NULL, *s = NULL, *t = NULL; if (faultsubcodeQName) r = soap_strdup(soap, faultsubcodeQName); if (faultstring) s = soap_strdup(soap, faultstring); if (faultdetailXML) t = soap_strdup(soap, faultdetailXML); return soap_set_error(soap, faultcode, r, s, t, SOAP_FAULT); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_sender_fault(struct soap *soap, const char *faultstring, const char *faultdetailXML) { return soap_sender_fault_subcode(soap, NULL, faultstring, faultdetailXML); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_sender_fault_subcode(struct soap *soap, const char *faultsubcodeQName, const char *faultstring, const char *faultdetailXML) { return soap_copy_fault(soap, soap->version == 2 ? "SOAP-ENV:Sender" : soap->version == 1 ? "SOAP-ENV:Client" : "at source", faultsubcodeQName, faultstring, faultdetailXML); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_receiver_fault(struct soap *soap, const char *faultstring, const char *faultdetailXML) { return soap_receiver_fault_subcode(soap, NULL, faultstring, faultdetailXML); } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 int SOAP_FMAC2 soap_receiver_fault_subcode(struct soap *soap, const char *faultsubcodeQName, const char *faultstring, const char *faultdetailXML) { return soap_copy_fault(soap, soap->version == 2 ? "SOAP-ENV:Receiver" : soap->version == 1 ? "SOAP-ENV:Server" : "is internal", faultsubcodeQName, faultstring, faultdetailXML); } #endif /******************************************************************************/ #ifndef PALM_2 #ifndef WITH_NOSTDLIB SOAP_FMAC1 void SOAP_FMAC2 soap_print_fault(struct soap *soap, FILE *fd) { if (soap_check_state(soap)) fprintf(fd, "Error: soap struct state not initialized with soap_init\n"); else if (soap->error) { const char **c, *v = NULL, *s, *d; c = soap_faultcode(soap); if (!*c) soap_set_fault(soap); if (soap->version == 2) v = soap_check_faultsubcode(soap); s = *soap_faultstring(soap); d = soap_check_faultdetail(soap); fprintf(fd, "%s%d fault %s [%s]\n\"%s\"\nDetail: %s\n", soap->version ? "SOAP 1." : "Error ", soap->version ? (int)soap->version : soap->error, *c, v ? v : "no subcode", s ? s : "[no reason]", d ? d : "[no detail]"); } } #endif #endif /******************************************************************************/ #ifdef __cplusplus #ifndef WITH_LEAN #ifndef WITH_NOSTDLIB #ifndef WITH_COMPAT SOAP_FMAC1 void SOAP_FMAC2 soap_stream_fault(struct soap *soap, std::ostream& os) { if (soap_check_state(soap)) os << "Error: soap struct state not initialized with soap_init\n"; else if (soap->error) { const char **c, *v = NULL, *s, *d; c = soap_faultcode(soap); if (!*c) soap_set_fault(soap); if (soap->version == 2) v = soap_check_faultsubcode(soap); s = *soap_faultstring(soap); d = soap_check_faultdetail(soap); os << (soap->version ? "SOAP 1." : "Error ") << (soap->version ? (int)soap->version : soap->error) << " fault " << *c << "[" << (v ? v : "no subcode") << "]" << std::endl << "\"" << (s ? s : "[no reason]") << "\"" << std::endl << "Detail: " << (d ? d : "[no detail]") << std::endl; } } #endif #endif #endif #endif /******************************************************************************/ #ifndef WITH_LEAN #ifndef WITH_NOSTDLIB SOAP_FMAC1 char* SOAP_FMAC2 soap_sprint_fault(struct soap *soap, char *buf, size_t len) { if (soap_check_state(soap)) { soap_strcpy(buf, len, "Error: soap struct not initialized with soap_init"); } else if (soap->error) { const char **c, *v = NULL, *s, *d; c = soap_faultcode(soap); if (!*c) soap_set_fault(soap); if (soap->version == 2) v = soap_check_faultsubcode(soap); s = *soap_faultstring(soap); d = soap_check_faultdetail(soap); (SOAP_SNPRINTF(buf, len, strlen(*c) + strlen(v) + strlen(s) + strlen(d) + 72), "%s%d fault %s [%s]\n\"%s\"\nDetail: %s\n", soap->version ? "SOAP 1." : "Error ", soap->version ? (int)soap->version : soap->error, *c, v ? v : "no subcode", s ? s : "[no reason]", d ? d : "[no detail]"); } return buf; } #endif #endif /******************************************************************************/ #ifndef PALM_1 #ifndef WITH_NOSTDLIB SOAP_FMAC1 void SOAP_FMAC2 soap_print_fault_location(struct soap *soap, FILE *fd) { #ifndef WITH_LEAN int i, j, c1, c2; if (soap->error && soap->error != SOAP_STOP && soap->bufidx <= soap->buflen && soap->buflen > 0 && soap->buflen <= sizeof(soap->buf)) { i = (int)soap->bufidx - 1; if (i <= 0) i = 0; c1 = soap->buf[i]; soap->buf[i] = '\0'; if ((int)soap->buflen >= i + 1024) j = i + 1023; else j = (int)soap->buflen - 1; c2 = soap->buf[j]; soap->buf[j] = '\0'; fprintf(fd, "%s%c\n\n", soap->buf, c1); if (soap->bufidx < soap->buflen) fprintf(fd, "%s\n", soap->buf + soap->bufidx); soap->buf[i] = (char)c1; soap->buf[j] = (char)c2; } #else (void)soap; (void)fd; #endif } #endif #endif /******************************************************************************/ #ifndef PALM_1 SOAP_FMAC1 int SOAP_FMAC2 soap_register_plugin_arg(struct soap *soap, int (*fcreate)(struct soap*, struct soap_plugin*, void*), void *arg) { struct soap_plugin *p; int r; if (!(p = (struct soap_plugin*)SOAP_MALLOC(soap, sizeof(struct soap_plugin)))) return soap->error = SOAP_EOM; p->id = NULL; p->data = NULL; p->fcopy = NULL; p->fdelete = NULL; r = fcreate(soap, p, arg); if (!r && p->fdelete) { p->next = soap->plugins; soap->plugins = p; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Registered '%s' plugin\n", p->id)); return SOAP_OK; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not register plugin '%s': plugin returned error %d (or fdelete callback not set)\n", p->id ? p->id : "?", r)); SOAP_FREE(soap, p); return r; } #endif /******************************************************************************/ #ifndef PALM_1 static void * fplugin(struct soap *soap, const char *id) { struct soap_plugin *p; for (p = soap->plugins; p; p = p->next) if (p->id == id || !strcmp(p->id, id)) return p->data; return NULL; } #endif /******************************************************************************/ #ifndef PALM_2 SOAP_FMAC1 void * SOAP_FMAC2 soap_lookup_plugin(struct soap *soap, const char *id) { return soap->fplugin(soap, id); } #endif /******************************************************************************/ #ifdef __cplusplus } #endif /******************************************************************************\ * * C++ soap struct methods * \******************************************************************************/ #ifdef __cplusplus soap::soap() { soap_init(this); /* no logs to prevent leaks when user calls soap_init() on this context */ soap_set_test_logfile(this, NULL); soap_set_sent_logfile(this, NULL); soap_set_recv_logfile(this, NULL); } #endif /******************************************************************************/ #ifdef __cplusplus soap::soap(soap_mode m) { soap_init1(this, m); } #endif /******************************************************************************/ #ifdef __cplusplus soap::soap(soap_mode im, soap_mode om) { soap_init2(this, im, om); } #endif /******************************************************************************/ #ifdef __cplusplus soap::soap(const struct soap& soap) { soap_copy_context(this, &soap); } #endif /******************************************************************************/ #ifdef __cplusplus struct soap& soap::operator=(const struct soap& soap) { soap_copy_context(this, &soap); return *this; } #endif /******************************************************************************/ #ifdef __cplusplus soap::~soap() { soap_done(this); } #endif /******************************************************************************/ gsoap-2.8.28/gsoap/Palm/0000755000175000017500000000000012653650150014271 5ustar ellertellertgsoap-2.8.28/gsoap/Palm/README.txt0000644000175000017500000000027412653650150015772 0ustar ellertellert Web services support for the Palm OS Platform is no longer available for gSOAP versions 2.7.9 and up. Please download gSOAP 2.7.8c for the most up-to-date release with Palm OS support. gsoap-2.8.28/gsoap/stdsoap2.h0000644000175000017500000042137712653650160015327 0ustar ellertellert/* stdsoap2.h 2.8.28 gSOAP runtime engine gSOAP XML Web services tools Copyright (C) 2000-2016, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under ONE of the following licenses: GPL, or the gSOAP public license, or Genivia's license for commercial use. -------------------------------------------------------------------------------- Contributors: Wind River Systems, Inc., for the following additions - vxWorks compatible -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2014, Robert van Engelen, Genivia Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #define GSOAP_VERSION 20828 #ifdef WITH_SOAPDEFS_H # include "soapdefs.h" /* include user-defined stuff in soapdefs.h */ #endif #ifndef _THREAD_SAFE # define _THREAD_SAFE #endif #ifndef OPENSERVER # ifndef _REENTRANT # define _REENTRANT # endif #endif #ifndef SOAP_FMAC1 /* stdsoap2.h declaration macro */ # define SOAP_FMAC1 #endif #ifndef SOAP_FMAC2 /* stdsoap2.h declaration macro */ # define SOAP_FMAC2 #endif #ifndef SOAP_FMAC3 /* (de)serializer declaration macro */ # define SOAP_FMAC3 #endif #ifndef SOAP_FMAC3S /* string converter for (de)serializer declaration macro */ # define SOAP_FMAC3S SOAP_FMAC3 #endif #ifndef SOAP_FMAC4 /* (de)serializer declaration macro */ # define SOAP_FMAC4 #endif #ifndef SOAP_FMAC4S /* string converter for (de)serializer declaration macro */ # define SOAP_FMAC4S SOAP_FMAC4 #endif #ifndef SOAP_FMAC5 /* stub/skeleton declaration macro */ # define SOAP_FMAC5 #endif #ifndef SOAP_FMAC6 /* stub/skeleton declaration macro */ # define SOAP_FMAC6 #endif #ifndef SOAP_CMAC /* class declaration macro */ # define SOAP_CMAC #endif #ifndef SOAP_NMAC /* namespace table declaration macro */ # define SOAP_NMAC #endif #ifndef SOAP_SOURCE_STAMP # define SOAP_SOURCE_STAMP(str) #endif #ifndef STDSOAP_H #define STDSOAP_H #define SOAP_XSTRINGIFY(s) SOAP_STRINGIFY(s) #define SOAP_STRINGIFY(s) #s #ifdef SOAPDEFS_H # include SOAP_XSTRINGIFY(SOAPDEFS_H) /* include user-defined "SOAPDEFS_H" */ #endif #if defined(__vxworks) || defined(__VXWORKS__) # ifndef VXWORKS # define VXWORKS # endif #endif #ifdef _WIN32 # ifndef WIN32 # define WIN32 # endif #endif /* for legacy purposes we use WIN32 macro, even when WIN64 is supported */ #ifdef _WIN64 # ifndef WIN32 # define WIN32 # endif #endif #ifdef _WIN32_WCE # ifndef UNDER_CE # define UNDER_CE _WIN32_WCE # endif #endif #ifdef UNDER_CE # ifndef WIN32 # define WIN32 # endif #endif #ifdef __BORLANDC__ # ifdef __WIN32__ # ifndef WIN32 # define WIN32 # endif # endif #endif #ifdef __CYGWIN__ # ifndef CYGWIN # define CYGWIN # endif #endif #ifdef __SYMBIAN32__ # define SYMBIAN # undef WIN32 #endif #if defined(__palmos__) || defined(PALM_GCC) || defined(__PALMOS_TRAPS__) # ifndef PALM # define PALM # endif #endif #if defined(__hpux) # ifndef HP_UX # define HP_UX # endif #endif #if defined(__digital__) && defined(__unix__) # ifndef TRU64 # define TRU64 # endif #endif #ifdef __MVS__ # ifndef OS390 # define OS390 # endif #endif #if defined(__sun) && defined(__SVR4) # ifndef SUN_OS # define SUN_OS # endif #endif #ifdef HAVE_CONFIG_H # include "config.h" # if defined(WITH_OPENSSL) # ifndef HAVE_OPENSSL_SSL_H # undef WITH_OPENSSL # endif # endif # if defined(WITH_GNUTLS) # ifndef HAVE_GNUTLS_GNUTLS_H # undef WITH_GNUTLS # endif # endif # if defined(WITH_ZLIB) || defined(WITH_GZIP) # ifndef HAVE_ZLIB_H # undef WITH_ZLIB # undef WITH_GZIP # endif # endif #else # if defined(UNDER_CE) # define SOAP_BUFLEN (2048) # define SOAP_PTRHASH (32) # define SOAP_IDHASH (19) # define SOAP_BLKLEN (32) # define SOAP_TAGLEN (128) # define SOAP_HDRLEN (1024) # define SOAP_MAXDIMS (4) # define HAVE_SSCANF # elif defined(WIN32) # if _MSC_VER >= 1400 # define HAVE_SNPRINTF # endif # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOD_L # define HAVE_SPRINTF_L # define HAVE_STRTOL # define HAVE_STRTOUL # if _MSC_VER >= 1300 # define HAVE_STRTOLL /* use _strtoi64 */ # define HAVE_STRTOULL /* use _strtoui64 */ # endif # define HAVE_SYS_TIMEB_H # define HAVE_FTIME # define HAVE_GMTIME # define HAVE_WCTOMB # define HAVE_MBTOWC # define SOAP_LONG_FORMAT "%I64d" # define SOAP_ULONG_FORMAT "%I64u" # elif defined(CYGWIN) # define HAVE_POLL # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_SYS_TIMEB_H # define HAVE_FTIME # define HAVE_RAND_R # define HAVE_GMTIME_R # define HAVE_LOCALTIME_R # define HAVE_STRERROR_R # define HAVE_WCTOMB # define HAVE_MBTOWC # elif defined(__APPLE__) # define HAVE_POLL # define HAVE_SNPRINTF # define HAVE_STRLCPY # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOD_L # define HAVE_SSCANF_L # define HAVE_SPRINTF_L # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_STRTOLL # define HAVE_STRTOULL # define HAVE_RAND_R # define HAVE_GMTIME_R # define HAVE_TM_GMTOFF # define HAVE_GETTIMEOFDAY # define HAVE_LOCALTIME_R # define HAVE_STRERROR_R # define HAVE_TIMEGM # define HAVE_WCTOMB # define HAVE_MBTOWC # define HAVE_INTTYPES_H # elif defined(_AIX43) # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_SYS_TIMEB_H # define HAVE_FTIME # define HAVE_RAND_R # define HAVE_GMTIME_R # define HAVE_LOCALTIME_R # define HAVE_WCTOMB # define HAVE_MBTOWC # elif defined(_AIX41) # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_SYS_TIMEB_H # define HAVE_WCTOMB # define HAVE_MBTOWC # elif defined(HP_UX) # include extern intmax_t __strtoll(const char*, char**, int); extern intmax_t __strtoull(const char*, char**, int); # define strtoll __strtoll # define strtoull __strtoull # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_STRTOLL # define HAVE_STRTOULL # define HAVE_SYS_TIMEB_H # define HAVE_FTIME # define HAVE_RAND_R # define HAVE_GMTIME_R # define HAVE_LOCALTIME_R # define HAVE_WCTOMB # define HAVE_MBTOWC # define HAVE_ISNAN # elif defined(FREEBSD) || defined(__FreeBSD__) || defined(OPENBSD) # define HAVE_POLL # define HAVE_SNPRINTF # define HAVE_STRLCPY # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOD_L # define HAVE_SSCANF_L # define HAVE_SPRINTF_L # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_STRTOLL # define HAVE_STRTOULL # define HAVE_GETTIMEOFDAY # define HAVE_RAND_R # define HAVE_GMTIME_R # define HAVE_LOCALTIME_R # define HAVE_STRERROR_R # define HAVE_WCTOMB # define HAVE_MBTOWC # define SOAP_LONG_FORMAT "%qd" # define SOAP_ULONG_FORMAT "%qu" # define HAVE_ISNAN # define HAVE_ISINF # elif defined(__VMS) # include # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_SYS_TIMEB_H # define HAVE_FTIME # define HAVE_RAND_R # define HAVE_GMTIME_R # define HAVE_LOCALTIME_R # define HAVE_WCTOMB # define HAVE_MBTOWC # elif defined(__GLIBC__) || defined(__GNU__) # define HAVE_POLL # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOD_L # define HAVE_SSCANF_L # define HAVE_SPRINTF_L # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_STRTOLL # define HAVE_STRTOULL # define HAVE_SYS_TIMEB_H # define HAVE_FTIME # define HAVE_RAND_R # define HAVE_GMTIME_R # define HAVE_LOCALTIME_R # define HAVE_STRERROR_R # define HAVE_TIMEGM # define HAVE_WCTOMB # define HAVE_MBTOWC # define HAVE_ISNAN # define HAVE_ISINF # elif defined(TRU64) # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_GETTIMEOFDAY # define HAVE_SYS_TIMEB_H # define HAVE_RAND_R # define HAVE_GMTIME_R # define HAVE_LOCALTIME_R # define __USE_STD_IOSTREAM # define HAVE_WCTOMB # define HAVE_MBTOWC # define SOAP_LONG_FORMAT "%ld" # define SOAP_ULONG_FORMAT "%lu" # elif defined(MAC_CARBON) # define WITH_NOIO # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOD_L # define HAVE_SSCANF_L # define HAVE_SPRINTF_L # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_FTIME # define HAVE_RAND_R # define HAVE_GETHOSTBYNAME_R # define HAVE_GMTIME_R # define HAVE_LOCALTIME_R # define HAVE_STRERROR_R # define HAVE_WCTOMB # define HAVE_MBTOWC # elif defined(PALM) # define WITH_LEAN # define HAVE_STRTOD /* strtod() is defined in palmFunctions.h */ # include /* Needs to be included before unix headers */ # include # define IGNORE_STDIO_STUBS # include # define O_NONBLOCK FNONBIO # include # include "palmFunctions.h" # elif defined(SYMBIAN) # define WITH_LEAN # define WITH_NONAMESPACES # define HAVE_STRTOD /* use STRTOD since sscanf doesn't seem to work */ # include # include # elif defined(VXWORKS) # ifdef _WRS_KERNEL # define _POSIX_THREADS 1 # endif # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_GMTIME # define HAVE_LOCALTIME # define HAVE_MKTIME # elif defined(OS390) # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_SYS_TIMEB_H # define HAVE_FTIME # define HAVE_RAND_R # define HAVE_GMTIME_R # define HAVE_LOCALTIME_R # define HAVE_WCTOMB # define HAVE_MBTOWC # elif defined(AS400) # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_SYS_TIMEB_H # define HAVE_FTIME # define HAVE_RAND_R # define HAVE_GMTIME_R # define HAVE_LOCALTIME_R # define HAVE_WCTOMB # define HAVE_MBTOWC # elif defined(__QNX__) || defined(QNX) /* QNX does not have a working version of strtof */ # undef HAVE_STRTOF # define HAVE_POLL # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_STRTOLL # define HAVE_STRTOULL # define HAVE_SYS_TIMEB_H # define HAVE_FTIME # define HAVE_RAND_R # define HAVE_GETHOSTBYNAME_R # define HAVE_GMTIME_R # define HAVE_LOCALTIME_R # define HAVE_STRERROR_R # define HAVE_WCTOMB # define HAVE_MBTOWC # elif defined(SUN_OS) # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_SYS_TIMEB_H # define HAVE_FTIME # define HAVE_RAND_R # define HAVE_GETHOSTBYNAME_R # define HAVE_GMTIME_R # define HAVE_LOCALTIME_R # else /* Default assumptions for supported library functions when not including config.h */ # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_STRTOLL # define HAVE_STRTOULL # define HAVE_SYS_TIMEB_H # define HAVE_FTIME # define HAVE_RAND_R # define HAVE_GETHOSTBYNAME_R # define HAVE_GMTIME_R # define HAVE_LOCALTIME_R # define HAVE_STRERROR_R # ifdef MB_LEN_MAX # define HAVE_WCTOMB # define HAVE_MBTOWC # endif # endif #endif #ifdef WITH_LEANER # ifndef WITH_LEAN # define WITH_LEAN # endif #endif /* gSOAP 2.7.15 and higher: always use FAST and retain CDATA in literal XML, unless WITH_LEAN or WITH_NOCDATA */ #ifndef WITH_LEAN # ifndef WITH_FAST # define WITH_FAST # endif # ifndef WITH_NOCDATA # ifndef WITH_CDATA # define WITH_CDATA # endif # endif #endif #ifdef WITH_LEAN # ifdef WITH_COOKIES # error "Cannot build WITH_LEAN code WITH_COOKIES enabled" # endif #endif /* allowing empty struct/union in C is a GNU extension */ #if !defined(__GNU__) # define WITH_NOEMPTYSTRUCT #endif /* silence clang's C99 variadic macro warnings */ #ifdef __clang__ # pragma clang diagnostic ignored "-Wvariadic-macros" #endif #ifdef WITH_PURE_VIRTUAL # define SOAP_PURE_VIRTUAL = 0 #else # define SOAP_PURE_VIRTUAL #endif /* older OpenVMS TCP/IP stacks cannot handle 65536 bytes */ #ifdef __VMS # ifndef SOAP_BUFLEN # define SOAP_BUFLEN (65535) # endif #endif /* if we have xlocale.h then we can use it WITH_C_LOCALE enabled to avoid decimal point conversion issues */ #ifdef WITH_C_LOCALE # ifdef WIN32 # include # define SOAP_LOCALE(soap) ((soap)->c_locale ? (soap)->c_locale : ((soap)->c_locale = _create_locale(LC_ALL, "C"))) # else # include # define SOAP_LOCALE(soap) ((soap)->c_locale ? (soap)->c_locale : ((soap)->c_locale = newlocale(LC_ALL_MASK, "C", NULL))) # endif #else # undef HAVE_STRTOF_L # undef HAVE_STRTOD_L # undef HAVE_SSCANF_L # undef HAVE_SPRINTF_L #endif #ifdef TANDEM_NONSTOP /* Support for Guardian */ # define SOAP_BUFLEN (32767) /*# define WITH_NOSTDLIB */ /* uncommment to remove stdlib dependences */ # define WITH_NOIO /* no IO dependences, e.g. remove TCP/IP */ # define int32_t int # define int64_t long long # define LONG64 long long # define ULONG64 long long # define DBL_PINFTY (1.1579208923716189e77) # undef HAVE_WCTOMB # undef HAVE_MBTOWC # undef HAVE_GMTIME_R # undef HAVE_LOCALTIME_R # undef HAVE_SNPRINTF # define SOAP_BUFLEN (32767) # define SOAP_SOCKET short #pragma nolist # include # include # include # include # include # include # include # include # include # include # include # define INET_ERROR 4294967295 #pragma list #elif defined(__TANDEM) /* Support for OSS */ # define int32_t int # define SOAP_BUFLEN (32767) #endif #ifndef WITH_NOSTDLIB # include # ifndef PALM # include # include # endif # if !defined(HAVE_CONFIG_H) || defined(HAVE_CTYPE_H) # include # endif # if !defined(HAVE_CONFIG_H) || defined(HAVE_LIMITS_H) # include /* for MB_LEN_MAX */ # endif # if !defined(HAVE_CONFIG_H) || defined(HAVE_FLOAT_H) # include /* for INFINITY */ # endif # if !defined(HAVE_CONFIG_H) || defined(HAVE_MATH_H) # ifndef PALM # include /* for isnan() and isinf() */ # endif # endif #endif #ifdef WITH_NTLM # include #endif #ifdef HAVE_POLL # include #endif #if defined(__cplusplus) # include # include # if !defined(WITH_LEAN) && !defined(WITH_COMPAT) # include # include # endif #endif #ifdef WITH_NOHTTP # ifndef WITH_NOIO # define WITH_NOIO # undef WITH_COOKIES # endif #endif /* Suggestion when SOAP_FD_EXCEEDED error occurs: Some systems allow increasing FD_SETSIZE before including sys/types.h: #define FD_SETSIZE (2048) */ #ifndef UNDER_CE # ifndef PALM # ifndef WITH_NOIO # include # include # endif # ifndef WITH_LEAN # ifdef HAVE_SYS_TIMEB_H # include /* for ftime() */ # endif # include # endif # endif #endif #ifdef OPENSERVER # include # include # include extern int h_errno; #endif #ifndef WITH_NOIO # ifndef WIN32 # ifndef PALM # include # ifdef VXWORKS # include # include # ifndef _WRS_KERNEL # include # endif # else # ifndef SYMBIAN # include # endif # endif # ifdef SUN_OS # include /* SUN */ # include /* only needed with SUN < 2.8 ? */ # endif # ifdef VXWORKS # ifdef _WRS_KERNEL # include # endif # else # include # endif # include # ifdef OS390 # include # else # include /* TCP_NODELAY, TCP_FASTOPEN */ # endif # include # endif # endif #endif #ifdef WIN32 # define SOAP_WINSOCKINT int #else # define SOAP_WINSOCKINT size_t #endif #if defined(WITH_IPV6_V6ONLY) || defined(WITH_NO_IPV6_V6ONLY) # ifndef WITH_IPV6 # define WITH_IPV6 # endif #endif #ifdef WIN32 # ifndef UNDER_CE # include # include # endif // When you get macro redefinition errors when compiling the code below, then: // a) try arrange your includes so is included after "stdsoap2.h" // b) or define _WINSOCKAPI_ first: // #define _WINSOCKAPI_ // stops windows.h including winsock.h // #include // #include "stdsoap2.h" // c) or compile with the -DWIN32_LEAN_AND_MEAN switch # include // Visual Studio 2005 users: install Platform SDK (R2) # include // # define _WSPIAPI_COUNTOF // DEV NOTE: enble to fix problems with VC6 // # include # include // DEV NOTE: replaces older wspiapi.h above # ifdef WITH_IPV6 # define SOAP_GAI_STRERROR gai_strerrorA # endif #else # ifdef VXWORKS # include # include # include # endif # ifndef WITH_NOIO # ifndef PALM # include # include # include # include # ifdef _AIX41 # include # endif # endif # endif #endif #ifdef WITH_FASTCGI # include #endif #ifdef WITH_OPENSSL # ifdef __VMS # pragma names save # pragma names uppercase # endif # undef WITH_GNUTLS # define OPENSSL_NO_KRB5 # include # include # include # include # include # ifndef ALLOW_OLD_VERSIONS # if (OPENSSL_VERSION_NUMBER < 0x00905100L) # error "Must use OpenSSL 0.9.6 or later" # endif # endif # ifdef __VMS # pragma names restore # endif #endif #ifdef WITH_GNUTLS # include # include # include # ifndef HAVE_PTHREAD_H # ifdef _POSIX_THREADS # define HAVE_PTHREAD_H /* make GNUTLS thread safe */ # endif # endif #endif #ifdef WITH_SYSTEMSSL # include #endif #ifdef WITH_GZIP # ifndef WITH_ZLIB # define WITH_ZLIB # endif #endif #ifdef WITH_CASEINSENSITIVETAGS # define SOAP_STRCMP soap_tag_cmp /* case insensitve XML element/attribute names */ #else # define SOAP_STRCMP strcmp /* case sensitive XML element/attribute names */ #endif #ifdef WITH_ZLIB # include #endif /* #define DEBUG */ /* Uncomment to debug sending (in file SENT.log) receiving (in file RECV.log) and internal operations (in file TEST.log) */ /* #define DEBUG_STAMP */ /* Uncomment to debug sending (in file SENT.log) receiving (in file RECV.log) and time-stamped operations (in file TEST.log) */ #ifdef __cplusplus extern "C" { #endif /* Portability (X/Open, BSD sockets etc): define SOAP_SOCKLEN_T as socklen_t or int or ... */ #if defined(_AIX) || defined(AIX) # if defined(_AIX43) # define SOAP_SOCKLEN_T socklen_t # else # define SOAP_SOCKLEN_T int # endif #elif defined(SOCKLEN_T) # define SOAP_SOCKLEN_T SOCKLEN_T #elif defined(__socklen_t_defined) || defined(_SOCKLEN_T) || defined(CYGWIN) || defined(FREEBSD) || defined(__FreeBSD__) || defined(OPENBSD) || defined(__QNX__) || defined(QNX) || defined(OS390) || defined(__ANDROID__) || defined(_XOPEN_SOURCE) # define SOAP_SOCKLEN_T socklen_t #elif defined(IRIX) || defined(WIN32) || defined(__APPLE__) || defined(SUN_OS) || defined(OPENSERVER) || defined(TRU64) || defined(VXWORKS) || defined(HP_UX) # define SOAP_SOCKLEN_T int #elif !defined(SOAP_SOCKLEN_T) # define SOAP_SOCKLEN_T size_t #endif /* AIX DCE threads portability: define SOAP_FUNC_R_ERR gmtime_r and localtime_r err ret val as -1 */ #ifdef _AIX32_THREADS # define SOAP_FUNC_R_ERR (-1) #elif !defined(SOAP_FUNC_R_ERR) # define SOAP_FUNC_R_ERR (NULL) #endif #ifndef SOAP_SOCKET # ifdef WIN32 # define SOAP_SOCKET SOCKET # define soap_closesocket(n) closesocket(n) # else # define SOAP_SOCKET int # define soap_closesocket(n) close(n) # endif #endif #define SOAP_INVALID_SOCKET ((SOAP_SOCKET)-1) #define soap_valid_socket(n) ((n) != SOAP_INVALID_SOCKET) #define SOAP_SHUT_WR (1) #define SOAP_SHUT_RDWR (2) #ifndef SOAP_GAI_STRERROR # define SOAP_GAI_STRERROR gai_strerror #endif #ifndef FD_SETSIZE # define FD_SETSIZE (1024) #endif #ifdef WITH_LEAN # define SOAP_CHK_EOF SOAP_EOF #else # define SOAP_CHK_EOF (soap->error ? soap->error : SOAP_EOF) #endif #ifdef __cplusplus # ifndef __STDC_FORMAT_MACROS # define __STDC_FORMAT_MACROS # endif #endif #if defined(SYMBIAN) # define LONG64 long # define ULONG64 unsigned LONG64 #elif !defined(__cplusplus) && defined(__STDC__) && !defined(__STDC_VERSION__) /* C90? */ # define LONG64 long # define ULONG64 unsigned LONG64 # ifndef SOAP_LONG_FORMAT # define SOAP_LONG_FORMAT "%ld" # endif # ifndef SOAP_ULONG_FORMAT # define SOAP_ULONG_FORMAT "%lu" # endif # undef HAVE_STRTOLL # undef HAVE_STRTOULL #elif !defined(WIN32) || defined(CYGWIN) || defined(__GLIBC__) || defined(__GNU__) # ifndef LONG64 # if defined(HAVE_INTTYPES_H) # ifdef HAVE_STDINT_H # include # endif # include # define LONG64 int64_t # define ULONG64 uint64_t # elif defined(HAVE_SYS_INTTYPES_H) # include # define LONG64 int64_t # define ULONG64 uint64_t # elif defined(HAVE_STDINT_H) # include # define LONG64 int64_t # define ULONG64 uint64_t # elif defined(__GLIBC__) # include # if (__WORDSIZE == 64) # define LONG64 int64_t # define ULONG64 uint64_t # ifndef SOAP_LONG_FORMAT # define SOAP_LONG_FORMAT "%ld" # endif # ifndef SOAP_ULONG_FORMAT # define SOAP_ULONG_FORMAT "%lu" # endif # else # define LONG64 long long # define ULONG64 unsigned LONG64 # endif # else # define LONG64 long long # define ULONG64 unsigned LONG64 # endif # endif #elif defined(UNDER_CE) # define LONG64 __int64 # define ULONG64 unsigned LONG64 #elif defined(__BORLANDC__) # define LONG64 __int64 # define ULONG64 unsigned LONG64 #endif #ifdef PRId64 # ifndef SOAP_LONG_FORMAT # define SOAP_LONG_FORMAT "%" PRId64 # endif #endif #ifdef PRIu64 # ifndef SOAP_ULONG_FORMAT # define SOAP_ULONG_FORMAT "%" PRIu64 # endif #endif #ifndef SOAP_LONG_FORMAT # define SOAP_LONG_FORMAT "%lld" /* printf format for 64 bit ints */ #endif #ifndef SOAP_ULONG_FORMAT # define SOAP_ULONG_FORMAT "%llu" /* printf format for unsigned 64 bit ints */ #endif #if defined(WIN32) && !defined(CYGWIN) # define soap_int32 __int32 #elif defined(SYMBIAN) # define soap_int32 long #elif defined(PALM) # define soap_int32 Int32 #elif defined(_AIX) || defined(AIX) # if defined(_AIX43) # define soap_int32 int32_t # else # define soap_int32 signed int # endif #else # define soap_int32 int32_t #endif #ifdef WIN32 # define SOAP_ERANGE ERANGE # define SOAP_EINTR WSAEINTR # define SOAP_EAGAIN WSAEWOULDBLOCK # define SOAP_EWOULDBLOCK WSAEWOULDBLOCK # define SOAP_EINPROGRESS WSAEINPROGRESS # define SOAP_EADDRINUSE WSAEADDRINUSE # define SOAP_ECONNREFUSED WSAECONNREFUSED #else # ifdef ERANGE # define SOAP_ERANGE ERANGE # else # define SOAP_ERANGE (34) # endif # define SOAP_EINTR EINTR # define SOAP_EAGAIN EAGAIN # define SOAP_EADDRINUSE EADDRINUSE # define SOAP_ECONNREFUSED ECONNREFUSED # ifdef SYMBIAN # define SOAP_EWOULDBLOCK 9898 # define SOAP_EINPROGRESS 9899 # else # define SOAP_EWOULDBLOCK EWOULDBLOCK # define SOAP_EINPROGRESS EINPROGRESS # endif #endif #ifdef WIN32 # ifdef UNDER_CE # define soap_errno GetLastError() # define soap_socket_errno(s) GetLastError() # define soap_reset_errno SetLastError(0) # else # define soap_errno GetLastError() # define soap_socket_errno(s) WSAGetLastError() # define soap_reset_errno SetLastError(0) # endif #else # ifndef WITH_NOIO # define soap_errno errno # define soap_socket_errno(s) errno # define soap_reset_errno (errno = 0) # else # define soap_errno 0 # define soap_socket_errno(s) 0 # define soap_reset_errno # endif #endif #ifndef SOAP_BUFLEN # if !defined(WITH_LEAN) # define SOAP_BUFLEN (65536) /* buffer length for socket packets, also used by gethostbyname_r and UDP messages, so don't make this too small */ # else # define SOAP_BUFLEN (2048) /* lean size */ # endif #endif #ifndef SOAP_LABLEN # define SOAP_LABLEN (256) /* initial look-aside buffer length */ #endif #ifndef SOAP_PTRBLK # define SOAP_PTRBLK (32) /* block allocation for pointer hash table chains */ #endif #ifndef SOAP_PTRHASH # ifndef WITH_LEAN # define SOAP_PTRHASH (4096) /* size of pointer analysis hash table (must be power of 2) */ # else # define SOAP_PTRHASH (32) # endif #endif #ifndef SOAP_IDHASH # ifndef WITH_LEAN # define SOAP_IDHASH (1999) /* prime size of hash table for parsed id/ref */ # else # define SOAP_IDHASH (19) /* 19, 199 */ # endif #endif #ifndef SOAP_BLKLEN # ifndef WITH_LEAN # define SOAP_BLKLEN (256) /* to collect long strings and XML attributes */ # else # define SOAP_BLKLEN (32) # endif #endif #ifndef SOAP_TAGLEN # ifndef WITH_LEAN # define SOAP_TAGLEN (1024) /* maximum length of XML element tag/attribute name or host/path name + 1 */ # else # define SOAP_TAGLEN (128) # endif #endif #ifndef SOAP_HDRLEN # ifndef WITH_LEAN # define SOAP_HDRLEN (8192) /* maximum length of HTTP header line (must be >4096 to read cookies) */ # else # define SOAP_HDRLEN (1024) # endif #endif #ifndef SOAP_TMPLEN # ifndef WITH_LEAN # define SOAP_TMPLEN (1024) /* maximum length of msgbuf and tmpbuf short message buffers, must be >=1024 */ # else # define SOAP_TMPLEN (1024) # endif #endif #ifndef SOAP_MAXDIMS # ifndef WITH_LEAN # define SOAP_MAXDIMS (16) /* maximum array dimensions (array nestings) must be less than 64 to protect soap->tmpbuf */ # else # define SOAP_MAXDIMS (4) # endif #endif #ifndef SOAP_MAXPTRS # ifndef WITH_LEAN # define SOAP_MAXPTRS (4) /* maximum depth + 1 of id-ref deserialized pointer types (int* has depth 0, int*** has depth 2) */ # else # define SOAP_MAXPTRS (2) # endif #endif #ifndef SOAP_MAXLOGS # define SOAP_MAXLOGS (3) /* max number of debug logs per struct soap environment */ # define SOAP_INDEX_RECV (0) # define SOAP_INDEX_SENT (1) # define SOAP_INDEX_TEST (2) #endif /* Tag name of multiref elements in SOAP 1.1 encoding */ #ifndef SOAP_MULTIREFTAG # define SOAP_MULTIREFTAG "id" #endif /* href-id value base name in multiref SOAP encoding */ #ifndef SOAP_BASEREFNAME # define SOAP_BASEREFNAME "_" #endif /* Max number of EINTR while poll/select on a socket */ /* Each EINTR can lengthen the I/O blocking time by at most one second */ #ifndef SOAP_MAXEINTR # define SOAP_MAXEINTR (10) #endif /* SOAP_MAXKEEPALIVE: Max iterations in soap_serve() to keep server connection alive */ #ifndef SOAP_MAXKEEPALIVE # define SOAP_MAXKEEPALIVE (100) #endif /* SOAP_MAXARRAYSIZE: Trusted total max size of an inbound SOAP Array. Arrays of larger size are not pre-allocated, but deserialized on an element-by-element basis. */ #ifndef SOAP_MAXARRAYSIZE # define SOAP_MAXARRAYSIZE (100000) #endif /* SOAP_MAXDIMESIZE: Trusted max size of inbound DIME data. Increase if necessary to allow larger attachments, or decrease when server resources are limited. */ #ifndef SOAP_MAXDIMESIZE # define SOAP_MAXDIMESIZE (8*1048576) /* 8 MB */ #endif /* SOAP_MAXINFLATESIZE: Trusted inflated content size. Larger content is subject to the SOAP_MINDEFLATERATIO constraint. If SOAP_MINDEFLATERATIO is 1.0, SOAP_MAXINFLATESIZE is always the max size of uncompressed content. */ #ifndef SOAP_MAXINFLATESIZE # define SOAP_MAXINFLATESIZE (1*1048576) /* 1 MB */ #endif /* SOAP_MINDEFLATERATIO: Trusted deflation ratio after SOAP_MAXINFLATESIZE is reached. Trust when compressed / deflated > SOAP_MINDEFLATERATIO Sets a ratio > 0.00096899224806 (1032:1) According to the zlib site: the limit (1032:1) comes from the fact that one length/distance pair can represent at most 258 output bytes. A length requires at least one bit and a distance requires at least one bit, so two bits in can give 258 bytes out, or eight bits in give 1032 bytes out. A dynamic block has no length restriction, so you could get arbitrarily close to the limit of 1032:1. */ #ifndef SOAP_MINDEFLATERATIO # define SOAP_MINDEFLATERATIO (0.001) /* ratio of deflated/inflated > 0.1% */ #endif #ifdef VXWORKS # ifdef WMW_RPM_IO # include "httpLib.h" # endif # ifdef __INCmathh # include # ifndef HAVE_ISNAN # define HAVE_ISNAN # endif # ifndef soap_isnan # define soap_isnan(num) isNan(num) # endif # endif # ifdef WM_SECURE_KEY_STORAGE # include # endif #endif #ifdef WIN32 # ifndef HAVE_ISNAN # define HAVE_ISNAN # endif # define soap_isnan(n) _isnan(n) # ifndef HAVE_ISINF # define HAVE_ISINF # endif # define soap_isinf(n) (!_finite(n)) #endif #ifdef SUN_OS # define HAVE_ISNAN #endif #ifdef __APPLE__ # ifdef __cplusplus # ifndef isnan extern "C" int isnan(double); extern "C" int isinf(double); # endif # endif # ifndef HAVE_ISNAN # define HAVE_ISNAN # endif # ifndef HAVE_ISINF # define HAVE_ISINF # endif #endif #if !defined(HAVE_ISNAN) && (defined(_MATH_H) || defined(_MATH_INCLUDED)) # define HAVE_ISNAN #endif union soap_double_nan {struct {unsigned int n1, n2;} iv; double dv; float fv;}; extern const union soap_double_nan soap_double_nan; extern const char soap_base64o[], soap_base64i[]; #ifdef VXWORKS # ifndef FLT_MAX # define FLT_MAX _ARCH_FLT_MAX # endif # ifndef DBL_MAX # define DBL_MAX _ARCH_DBL_MAX # endif #endif #ifndef FLT_NAN # define FLT_NAN (soap_double_nan.fv) #endif #ifndef FLT_PINFTY # if defined(INFINITY) # define FLT_PINFTY INFINITY # elif defined(FLT_MAX) # define FLT_PINFTY FLT_MAX # elif defined(HUGE_VALF) # define FLT_PINFTY (float)HUGE_VALF # elif defined(HUGE_VAL) # define FLT_PINFTY (float)HUGE_VAL # elif defined(FLOAT_MAX) # define FLT_PINFTY FLOAT_MAX # else # define FLT_PINFTY (3.40282347e+38F) # endif #endif #ifndef FLT_NINFTY # define FLT_NINFTY (-FLT_PINFTY) #endif #ifndef DBL_NAN # define DBL_NAN (soap_double_nan.dv) #endif #ifndef DBL_PINFTY # if defined(INFINITY) # define DBL_PINFTY INFINITY # elif defined(DBL_MAX) # define DBL_PINFTY DBL_MAX # elif defined(HUGE_VALF) # define DBL_PINFTY (double)HUGE_VALF # elif defined(HUGE_VAL) # define DBL_PINFTY (double)HUGE_VAL # elif defined(DOUBLE_MAX) # define DBL_PINFTY DOUBLE_MAX # else # define DBL_PINFTY (1.7976931348623157e+308) # endif #endif #ifndef DBL_NINFTY # define DBL_NINFTY (-DBL_PINFTY) #endif #ifndef soap_isnan # ifdef HAVE_ISNAN # define soap_isnan(n) isnan(n) # else # define soap_isnan(n) ((n) != (n)) # endif #endif #ifndef soap_isinf # ifdef HAVE_ISINF # define soap_isinf(n) isinf(n) # else # define soap_isinf(n) (!soap_isnan(n) && soap_isnan((n) - (n))) # endif #endif #define soap_ispinfd(n) ((n) > 0 && soap_isinf(n)) #define soap_ispinff(n) ((n) > 0 && soap_isinf(n)) #define soap_isninfd(n) ((n) < 0 && soap_isinf(n)) #define soap_isninff(n) ((n) < 0 && soap_isinf(n)) /* Safer str & mem functions */ /* The gSOAP code uses guards to ensure that these functions are well behaved and do not raise errors. Therefore, the WIN _s functions should never execute the "invalid parameter handler". */ /* use safer snprintf if possible or guard sprintf against overrun (assumes no variadic macros) */ # ifdef HAVE_SNPRINTF # if _MSC_VER >= 1400 # define SOAP_SNPRINTF(buf, len, num) void)_snprintf_s((buf), (len), _TRUNCATE # define SOAP_SNPRINTF_SAFE(buf, len) void)_snprintf_s((buf), (len), _TRUNCATE # else # define SOAP_SNPRINTF(buf, len, num) void)snprintf((buf), (len) # define SOAP_SNPRINTF_SAFE(buf, len) void)snprintf((buf), (len) # endif # else # define SOAP_SNPRINTF(buf, len, num) (len) <= (num)) ? (void)((buf)[0] = '\0') : (void)sprintf((buf) # define SOAP_SNPRINTF_SAFE(buf, len) void)sprintf((buf) # endif /* copy string (truncating the result) */ #if _MSC_VER >= 1400 # define soap_strcpy(buf, len, src) (void)strncpy_s((buf), (len), (src), _TRUNCATE) #elif defined(HAVE_STRLCPY) # define soap_strcpy(buf, len, src) (void)strlcpy((buf), (src), (len)) #else # define soap_strcpy(buf, len, src) (void)((buf) && (size_t)(len) > 0 && (strncpy((buf), (src), (len) - 1), (buf)[(len) - 1] = '\0')) #endif /* copy string up to n chars (nul on overrun) */ #if _MSC_VER >= 1400 # define soap_strncpy(buf, len, src, num) (void)strncpy_s((buf), (len), (src), (num)) #else # define soap_strncpy(buf, len, src, num) (void)((buf) && ((size_t)(len) > (size_t)(num) ? (strncpy((buf), (src), (num)), (buf)[(size_t)(num)] = '\0') : ((buf)[0] = '\0'))) #endif /* concat string up to n chars (nul on overrun) */ #if _MSC_VER >= 1400 # define soap_strncat(buf, len, src, num) (void)strncat_s((buf), (len), (src), (num)) #else # define soap_strncat(buf, len, src, num) (void)((buf) && ((size_t)(len) > strlen((buf)) + (size_t)(num) ? (strncat((buf), (src), (num)), (buf)[(size_t)(len) - 1] = '\0') : ((buf)[0] = '\0'))) #endif /* copy memory (error on overrun) */ #if _MSC_VER >= 1400 # define soap_memcpy(buf, len, src, num) ((buf) && (size_t)(len) >= (size_t)(num) ? memcpy_s((buf), (len), (src), (num)) : SOAP_ERANGE) #else # define soap_memcpy(buf, len, src, num) ((buf) && (size_t)(len) >= (size_t)(num) ? !memcpy((buf), (src), (num)) : SOAP_ERANGE) #endif /* move memory (error on overrun) */ #if _MSC_VER >= 1400 # define soap_memmove(buf, len, src, num) ((buf) && (size_t)(len) >= (size_t)(num) ? memmove_s((buf), (len), (src), (num)) : SOAP_ERANGE) #else # define soap_memmove(buf, len, src, num) ((buf) && (size_t)(len) >= (size_t)(num) ? !memmove((buf), (src), (num)) : SOAP_ERANGE) #endif /* gSOAP status/error codes */ typedef soap_int32 soap_status; #define SOAP_EOF EOF #define SOAP_ERR EOF #define SOAP_OK 0 #define SOAP_CLI_FAULT 1 #define SOAP_SVR_FAULT 2 #define SOAP_TAG_MISMATCH 3 #define SOAP_TYPE 4 #define SOAP_SYNTAX_ERROR 5 #define SOAP_NO_TAG 6 #define SOAP_IOB 7 #define SOAP_MUSTUNDERSTAND 8 #define SOAP_NAMESPACE 9 #define SOAP_USER_ERROR 10 #define SOAP_FATAL_ERROR 11 #define SOAP_FAULT 12 #define SOAP_NO_METHOD 13 #define SOAP_NO_DATA 14 #define SOAP_GET_METHOD 15 #define SOAP_PUT_METHOD 16 #define SOAP_DEL_METHOD 17 /* deprecated */ #define SOAP_HEAD_METHOD 18 /* deprecated */ #define SOAP_HTTP_METHOD 19 #define SOAP_EOM 20 #define SOAP_MOE 21 #define SOAP_HDR 22 #define SOAP_NULL 23 #define SOAP_DUPLICATE_ID 24 #define SOAP_MISSING_ID 25 #define SOAP_HREF 26 #define SOAP_UDP_ERROR 27 #define SOAP_TCP_ERROR 28 #define SOAP_HTTP_ERROR 29 #define SOAP_SSL_ERROR 30 #define SOAP_ZLIB_ERROR 31 #define SOAP_DIME_ERROR 32 #define SOAP_DIME_HREF 33 #define SOAP_DIME_MISMATCH 34 #define SOAP_DIME_END 35 #define SOAP_MIME_ERROR 36 #define SOAP_MIME_HREF 37 #define SOAP_MIME_END 38 #define SOAP_VERSIONMISMATCH 39 #define SOAP_PLUGIN_ERROR 40 #define SOAP_DATAENCODINGUNKNOWN 41 #define SOAP_REQUIRED 42 #define SOAP_PROHIBITED 43 #define SOAP_OCCURS 44 #define SOAP_LENGTH 45 #define SOAP_PATTERN 46 #define SOAP_FD_EXCEEDED 47 #define SOAP_UTF_ERROR 48 #define SOAP_NTLM_ERROR 49 #define soap_xml_error_check(e) ((e) == SOAP_TAG_MISMATCH || (e) == SOAP_NO_TAG || (e) == SOAP_SYNTAX_ERROR || (e) == SOAP_NAMESPACE || (e) == SOAP_DUPLICATE_ID || (e) == SOAP_MISSING_ID || (e) == SOAP_REQUIRED || (e) == SOAP_PROHIBITED || (e) == SOAP_OCCURS || (e) == SOAP_LENGTH || (e) == SOAP_PATTERN || (e) == SOAP_NULL || (e) == SOAP_HREF) #define soap_soap_error_check(e) ((e) == SOAP_CLI_FAULT || (e) == SOAP_SVR_FAULT || (e) == SOAP_VERSIONMISMATCH || (e) == SOAP_MUSTUNDERSTAND || (e) == SOAP_FAULT || (e) == SOAP_NO_METHOD) #define soap_tcp_error_check(e) ((e) == SOAP_EOF || (e) == SOAP_TCP_ERROR) #define soap_ssl_error_check(e) ((e) == SOAP_SSL_ERROR) #define soap_zlib_error_check(e) ((e) == SOAP_ZLIB_ERROR) #define soap_http_error_check(e) ((e) == SOAP_HTTP_ERROR || (e) == SOAP_NO_DATA || ((e) >= SOAP_GET_METHOD && (e) <= SOAP_HTTP_METHOD) || ((e) >= 100 && (e) < 600)) /* gSOAP HTTP response status codes 100 to 599 are reserved */ /* Codes 600 to 999 are user definable */ /* Exceptional gSOAP HTTP server response status codes >= 1000 */ #define SOAP_STOP 1000 /* No HTTP response */ #define SOAP_FORM 1001 /* Request (form) data is present, no HTTP response */ #define SOAP_HTML 1002 /* Custom HTML response */ #define SOAP_FILE 1003 /* Custom file-based response */ /* gSOAP HTTP method codes (client) */ #define SOAP_POST 2000 /* POST request */ #define SOAP_POST_FILE 2001 /* Custom file-based POST request */ #define SOAP_GET 2002 /* GET request */ #define SOAP_PUT 2003 /* PUT request */ #define SOAP_DEL 2004 /* DELETE request */ #define SOAP_CONNECT 2005 /* CONNECT request */ /* gSOAP DIME */ #define SOAP_DIME_CF 0x01 #define SOAP_DIME_ME 0x02 #define SOAP_DIME_MB 0x04 #define SOAP_DIME_VERSION 0x08 /* DIME version 1 */ #define SOAP_DIME_MEDIA 0x10 #define SOAP_DIME_ABSURI 0x20 /* gSOAP ZLIB */ #define SOAP_ZLIB_NONE 0x00 #define SOAP_ZLIB_DEFLATE 0x01 #define SOAP_ZLIB_INFLATE 0x02 #define SOAP_ZLIB_GZIP 0x02 /* gSOAP transport, connection, and content encoding modes */ typedef soap_int32 soap_mode; #define SOAP_IO 0x00000003 /* IO mask */ #define SOAP_IO_FLUSH 0x00000000 /* flush output immediately, no buffering */ #define SOAP_IO_BUFFER 0x00000001 /* buffer output in packets of size SOAP_BUFLEN */ #define SOAP_IO_STORE 0x00000002 /* store entire output to determine length for transport */ #define SOAP_IO_CHUNK 0x00000003 /* use HTTP chunked transfer AND buffer packets */ #define SOAP_IO_UDP 0x00000004 /* TCP or UDP */ #define SOAP_IO_LENGTH 0x00000008 /* calc message length (internal) */ #define SOAP_IO_KEEPALIVE 0x00000010 /* keep connection alive */ #define SOAP_ENC 0x00000FFF /* IO and ENC mask */ #define SOAP_ENC_LATIN 0x00000020 /* in: accept iso-8859-1 */ #define SOAP_ENC_XML 0x00000040 /* out: plain (XML or other) body, no HTTP header */ #define SOAP_ENC_DIME 0x00000080 #define SOAP_ENC_MIME 0x00000100 #define SOAP_ENC_MTOM 0x00000200 #define SOAP_ENC_ZLIB 0x00000400 #define SOAP_ENC_SSL 0x00000800 #define SOAP_XML_STRICT 0x00001000 /* in: strict validation */ #define SOAP_XML_INDENT 0x00002000 /* out: emit indented XML */ #define SOAP_XML_IGNORENS 0x00004000 /* in: ignore namespaces */ #define SOAP_XML_DEFAULTNS 0x00008000 /* out: emit xmlns="..." */ #define SOAP_XML_CANONICAL 0x00010000 /* out: excC14N canonical XML */ #define SOAP_XML_TREE 0x00020000 /* in/out: XML tree (no id/ref) */ #define SOAP_XML_NIL 0x00040000 /* out: all NULLs as xsi:nil */ #define SOAP_XML_NOTYPE 0x00080000 /* out: do not add xsi:type */ #define SOAP_DOM_TREE 0x00100000 /* see DOM manual */ #define SOAP_DOM_NODE 0x00200000 #define SOAP_DOM_ASIS 0x00400000 #define SOAP_RESERVED 0x00800000 /* reserved for future use */ #define SOAP_C_NOIOB 0x01000000 /* don't fault on array index out of bounds (just ignore) */ #define SOAP_C_UTFSTRING 0x02000000 /* (de)serialize strings with UTF8 content */ #define SOAP_C_MBSTRING 0x04000000 /* (de)serialize strings with multi-byte content */ #define SOAP_C_NILSTRING 0x08000000 /* serialize empty strings as nil (omitted) */ #define SOAP_XML_DOM 0x10000000 /* enable internal DOM */ #define SOAP_XML_GRAPH 0x20000000 /* force id-ref XML graph */ #define SOAP_MIME_POSTCHECK 0x40000000 /* MIME flag (internal) */ #define SOAP_SEC_WSUID 0x80000000 /* Add Body wsu:Id flag (internal) */ /* WITH_XMLNS backward compatibility: always use XML default namespaces */ #ifdef WITH_XMLNS # define SOAP_IO_DEFAULT (SOAP_IO_FLUSH | SOAP_XML_DEFAULTNS) #else # define SOAP_IO_DEFAULT SOAP_IO_FLUSH #endif /* SSL client/server authentication settings */ #define SOAP_SSL_NO_AUTHENTICATION 0x0000 /* for testing purposes */ #define SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION 0x0001 /* client requires server to authenticate (default) */ #define SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION 0x0002 /* server requires client to authenticate */ #define SOAP_SSL_SKIP_HOST_CHECK 0x0004 /* client skips common name check against host name */ #define SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE 0x0008 /* allow self-signed and expired certificates and those w/o CRL */ #define SOAP_SSL_NO_DEFAULT_CA_PATH 0x0010 /* don't use default_verify_paths */ #define SOAP_SSL_RSA 0x0020 /* use RSA */ #define SOAP_TLSv1 0x0000 /* enable TLS v1.0/1.1/1.2 only (default) */ #define SOAP_SSLv3_TLSv1 0x0040 /* enable SSL v3 and TLS v1.0/1.1/1.2 */ #define SOAP_SSLv3 0x0080 /* only SSL v3 */ #define SOAP_TLSv1_0 0x0100 /* only TLS v1.0 */ #define SOAP_TLSv1_1 0x0200 /* only TLS v1.1 */ #define SOAP_TLSv1_2 0x0400 /* only TLS v1.2 */ #define SOAP_SSL_CLIENT 0x1000 /* client context */ #define SOAP_SSL_DEFAULT (SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION | SOAP_TLSv1) /* state */ #define SOAP_NONE 0 #define SOAP_INIT 1 #define SOAP_COPY 2 #define soap_check_state(soap) (!(soap) || ((soap)->state != SOAP_INIT && (soap)->state != SOAP_COPY)) /* parts */ #define SOAP_BEGIN 0 #define SOAP_IN_ENVELOPE 2 #define SOAP_IN_HEADER 3 #define SOAP_END_HEADER 4 #define SOAP_NO_BODY 5 #define SOAP_IN_BODY 6 #define SOAP_END_BODY 7 #define SOAP_END_ENVELOPE 8 #define SOAP_END 9 /* events */ #define SOAP_SEC_BEGIN 1 #define SOAP_SEC_SIGN 2 #define SOAP_SEC_DECRYPT 3 /* DEBUG macros */ #ifndef WITH_LEAN # ifdef DEBUG_STAMP # ifndef DEBUG # define DEBUG # endif # endif # ifdef DEBUG # ifndef SOAP_DEBUG # define SOAP_DEBUG # endif # ifndef SOAP_MEM_DEBUG # define SOAP_MEM_DEBUG # endif # endif #endif #ifdef SOAP_MEM_DEBUG # ifndef SOAP_MALLOC # define SOAP_MALLOC(soap, size) soap_track_malloc((soap), __FILE__, __LINE__, (size)) # endif # ifndef SOAP_FREE # define SOAP_FREE(soap, ptr) soap_track_free((soap), __FILE__, __LINE__, (void*)(ptr)) # endif #endif #ifndef SOAP_MALLOC /* use libc malloc */ # define SOAP_MALLOC(soap, size) malloc(size) #endif #ifndef SOAP_FREE /* use libc free */ # define SOAP_FREE(soap, ptr) free((void*)(ptr)) #endif #ifndef SOAP_NOTHROW # if defined(__GNUC__) && (__GNUC__ <= 2) # define SOAP_NOTHROW # elif defined(WITH_LEAN) || defined(WITH_COMPAT) # define SOAP_NOTHROW # else # define SOAP_NOTHROW (std::nothrow) # endif #endif #if (defined(__GNUC__) && (__GNUC__ <= 2) && !defined(__BORLANDC__)) || defined(__clang__) || defined(_AIX) || defined(AIX) /* old form w/o parenthesis */ # ifndef SOAP_NEW # define SOAP_NEW(type) new SOAP_NOTHROW type # endif # ifndef SOAP_NEW_ARRAY # define SOAP_NEW_ARRAY(type, n) new SOAP_NOTHROW type[n] # endif # ifndef SOAP_PLACEMENT_NEW # define SOAP_PLACEMENT_NEW(buf, type) new (buf) type # endif #else /* new form with parenthesis */ # ifndef SOAP_NEW # define SOAP_NEW(type) new SOAP_NOTHROW (type) # endif # ifndef SOAP_NEW_ARRAY # define SOAP_NEW_ARRAY(type, n) new SOAP_NOTHROW type[n] # endif # ifndef SOAP_PLACEMENT_NEW # define SOAP_PLACEMENT_NEW(buf, type) new (buf) (type) # endif #endif #ifndef SOAP_NEW_COPY /* use C++ new operator for ::copy() */ # define SOAP_NEW_COPY(clas) new SOAP_NOTHROW clas #endif #ifndef SOAP_DELETE /* use C++ delete operator */ # define SOAP_DELETE(obj) delete obj #endif #ifndef SOAP_DELETE_ARRAY /* use C++ delete[] operator */ # define SOAP_DELETE_ARRAY(obj) delete[] obj #endif #ifdef SOAP_DEBUG # ifndef SOAP_MESSAGE # define SOAP_MESSAGE fprintf # endif # ifndef DBGLOG # ifdef DEBUG_STAMP # ifdef WIN32 # define DBGLOG(DBGFILE, CMD) \ { if (soap)\ { if (!soap->fdebug[SOAP_INDEX_##DBGFILE])\ soap_open_logfile((struct soap*)soap, SOAP_INDEX_##DBGFILE);\ if (soap->fdebug[SOAP_INDEX_##DBGFILE])\ { FILE *fdebug = soap->fdebug[SOAP_INDEX_##DBGFILE];\ SYSTEMTIME _localTime;\ ::GetLocalTime(&_localTime); \ fprintf(fdebug, "%02d%02d%02d %02d:%02d:%02d.%03d|", _localTime.wYear%100, _localTime.wMonth, _localTime.wDay, _localTime.wHour, _localTime.wMinute, _localTime.wSecond, _localTime.wMilliseconds);\ CMD;\ fflush(fdebug);\ }\ }\ } # else # define DBGLOG(DBGFILE, CMD) \ { if (soap)\ { if (!soap->fdebug[SOAP_INDEX_##DBGFILE])\ soap_open_logfile((struct soap*)soap, SOAP_INDEX_##DBGFILE);\ if (soap->fdebug[SOAP_INDEX_##DBGFILE])\ { FILE *fdebug = soap->fdebug[SOAP_INDEX_##DBGFILE];\ struct timeval _tv;\ struct tm _tm;\ gettimeofday(&_tv, NULL);\ localtime_r(&_tv.tv_sec, &_tm);\ fprintf(fdebug, "%02d%02d%02d %02d:%02d:%02d.%06d|", _tm.tm_year%100, _tm.tm_mon+1, _tm.tm_mday, _tm.tm_hour, _tm.tm_min, _tm.tm_sec, _tv.tv_usec);\ CMD;\ fflush(fdebug);\ }\ }\ } # endif # else # define DBGLOG(DBGFILE, CMD) \ { if (soap)\ { if (!soap->fdebug[SOAP_INDEX_##DBGFILE])\ soap_open_logfile((struct soap*)soap, SOAP_INDEX_##DBGFILE);\ if (soap->fdebug[SOAP_INDEX_##DBGFILE])\ { FILE *fdebug = soap->fdebug[SOAP_INDEX_##DBGFILE];\ CMD;\ fflush(fdebug);\ }\ }\ } # endif # endif # ifndef DBGMSG # define DBGMSG(DBGFILE, MSG, LEN) \ { if (soap)\ { if (!soap->fdebug[SOAP_INDEX_##DBGFILE])\ soap_open_logfile((struct soap*)soap, SOAP_INDEX_##DBGFILE);\ if (soap->fdebug[SOAP_INDEX_##DBGFILE])\ { fwrite((void*)(MSG), 1, (size_t)(LEN), soap->fdebug[SOAP_INDEX_##DBGFILE]);\ fflush(soap->fdebug[SOAP_INDEX_##DBGFILE]);\ }\ }\ } # endif # ifndef DBGFUN # define DBGFUN(FNAME) DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%s(%d): %s()\n", __FILE__, __LINE__, FNAME)) # define DBGFUN1(FNAME, FMT, ARG) DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%s(%d): %s(" FMT ")\n", __FILE__, __LINE__, FNAME, (ARG))) # define DBGFUN2(FNAME, FMT1, ARG1, FMT2, ARG2) DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%s(%d): %s(" FMT1 ", " FMT2 ")\n", __FILE__, __LINE__, FNAME, (ARG1), (ARG2))) # define DBGFUN3(FNAME, FMT1, ARG1, FMT2, ARG2, FMT3, ARG3) DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%s(%d): %s(" FMT1 ", " FMT2 ", " FMT3 ")\n", __FILE__, __LINE__, FNAME, (ARG1), (ARG2), (ARG3))) # endif # ifndef DBGHEX # define DBGHEX(DBGFILE, MSG, LEN) \ { if (soap)\ { if (!soap->fdebug[SOAP_INDEX_##DBGFILE])\ soap_open_logfile(soap, SOAP_INDEX_##DBGFILE);\ if (soap->fdebug[SOAP_INDEX_##DBGFILE])\ { int i; char *s;\ for (s = (char*)(MSG), i = (LEN); i; i--)\ fprintf(soap->fdebug[SOAP_INDEX_##DBGFILE], "%2.2X ", (int)*s++&0xFF);\ fflush(soap->fdebug[SOAP_INDEX_##DBGFILE]);\ }\ }\ } # endif #else # define DBGLOG(DBGFILE, CMD) # define DBGMSG(DBGFILE, MSG, LEN) # define DBGFUN(FNAME) # define DBGFUN1(FNAME, FMT, ARG) # define DBGFUN2(FNAME, FMT1, ARG1, FMT2, ARG2) # define DBGFUN3(FNAME, FMT1, ARG1, FMT2, ARG2, FMT3, ARG3) # define DBGHEX(DBGFILE, MSG, LEN) #endif /* UCS-4 requires 32 bits (0-7FFFFFFF, the sign bit is used by gSOAP to distinguish XML entities) */ typedef soap_int32 soap_wchar; /* namespace table row */ struct Namespace { const char *id; const char *ns; const char *in; char *out; }; /* namespace stack */ struct soap_nlist { struct soap_nlist *next; unsigned int level; /* nesting depth level */ short index; /* corresponding entry in ns mapping table */ const char *ns; /* only set when parsed ns URI is not in the ns mapping table */ char id[1]; /* the actual string value flows into the allocated region id[0...] below this struct */ }; /* block header, the data flows into the allocated region below this struct */ struct soap_bhead { struct soap_bhead *next; size_t size; }; /* block stack for nested block allocations */ struct soap_blist { struct soap_blist *next; struct soap_bhead *head; size_t size; }; /* pointer serialization management */ struct soap_plist { struct soap_plist *next; const void *ptr; void *dup; const void *array; /* array pointer */ int size; /* array size */ int type; int id; char mark1; /* 0=single-ref, 1=embedded-multi-ref (SOAP1.1), 2=multi-ref, 3=attachment */ char mark2; }; /* block allocation for pointer serialization management */ struct soap_pblk { struct soap_pblk *next; struct soap_plist plist[SOAP_PTRBLK]; }; #ifdef SOAP_MEM_DEBUG /* malloc/free tracking for debugging */ struct soap_mlist { struct soap_mlist *next; const void *ptr; const char *file; int line; short live; }; #endif /* class allocation list */ struct soap_clist { struct soap_clist *next; void *ptr; int type; int size; /* array size */ int (*fdelete)(struct soap_clist*); }; /* attributes */ struct soap_attribute { struct soap_attribute *next; short flag; /* soap_set_attr: 1 = normal, 2 = utf content */ char *value; size_t size; const char *ns; short visible; char name[1]; /* the actual name string flows into the allocated region below this struct */ }; #ifndef WITH_LEAN struct soap_cookie { struct soap_cookie *next; char *name; char *value; char *domain; char *path; time_t expire; /* client-side: local time to expire */ long maxage; /* server-side: seconds to expire */ unsigned int version; short secure; short session; /* server-side */ short env; /* server-side: got cookie from client and should not be (re)send */ short modified; /* server-side: client cookie was modified and should be send */ }; #endif SOAP_FMAC1 struct soap_multipart* SOAP_FMAC2 soap_next_multipart(struct soap_multipart*); #ifdef __cplusplus class soap_multipart_iterator { public: struct soap_multipart *content; bool operator==(const soap_multipart_iterator& iter) const { return (bool)(content == iter.content); } bool operator!=(const soap_multipart_iterator& iter) const { return (bool)(content != iter.content); } struct soap_multipart &operator*() const { return *content; } soap_multipart_iterator &operator++() { content = soap_next_multipart(content); return *this; } soap_multipart_iterator() : content(NULL) { } soap_multipart_iterator(struct soap_multipart *p) : content(p) { } }; #endif #ifndef WITH_LEANER struct soap_dime { size_t count; size_t size; size_t chunksize; size_t buflen; char flags; char *ptr; const char *id; const char *type; const char *options; struct soap_multipart *list; /* list of DIME attachments received */ struct soap_multipart *first, *last; /* temporary in/out queue */ #ifdef __cplusplus soap_multipart_iterator begin() { soap_multipart_iterator iter(list); return iter; }; soap_multipart_iterator end() { soap_multipart_iterator iter(NULL); return iter; }; #endif }; #endif #ifndef WITH_LEANER struct soap_mime { char *boundary; /* MIME boundary */ const char *start; /* MIME start ID */ struct soap_multipart *list; /* list of MIME attachments received */ struct soap_multipart *first, *last; /* temporary in/out queue */ #ifdef __cplusplus soap_multipart_iterator begin() { soap_multipart_iterator iter(list); return iter; }; soap_multipart_iterator end() { soap_multipart_iterator iter(NULL); return iter; }; #endif }; #endif #ifndef WITH_LEANER /* RFC2045 MIME content transfer encodings */ enum soap_mime_encoding { SOAP_MIME_NONE, SOAP_MIME_7BIT, SOAP_MIME_8BIT, SOAP_MIME_BINARY, SOAP_MIME_QUOTED_PRINTABLE, SOAP_MIME_BASE64, SOAP_MIME_IETF_TOKEN, SOAP_MIME_X_TOKEN }; #endif #ifndef WITH_LEANER /* DIME/MIME multipart list */ struct soap_multipart { struct soap_multipart *next; char *ptr; /* points to raw data content */ size_t size; /* size of data content */ const char *id; /* DIME/MIME content ID or form data name */ const char *type; /* DIME/MIME type (MIME type format) */ const char *options; /* DIME options */ enum soap_mime_encoding encoding; /* MIME Content-Transfer-Encoding */ const char *location; /* MIME Content-Location (optional) */ const char *description; /* MIME Content-Description (optional) */ #ifdef __cplusplus typedef soap_multipart_iterator iterator; #endif }; #endif #ifndef WITH_LEANER /* attachment DIME and MTOM XOP forwarding */ struct soap_xlist { struct soap_xlist *next; unsigned char **ptr; int *size; char *id; char **type; char **options; }; #endif /******************************************************************************/ #ifndef WITH_LEANER /* dom.c[pp] functions (optional, compile and link dom.c[pp] */ struct soap; struct soap_dom_element; struct soap_dom_attribute; /* soap_dom_element construction */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_new(struct soap *soap, const char *ns, const char *tag); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_new_w(struct soap *soap, const char *ns, const wchar_t *tag); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_set(struct soap_dom_element *elt, const char *ns, const char *tag); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_set_w(struct soap_dom_element *elt, const char *ns, const wchar_t *tag); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att(struct soap_dom_element *elt, const char *ns, const char *tag); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_w(struct soap_dom_element *elt, const char *ns, const wchar_t *tag); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt(struct soap_dom_element *elt, const char *ns, const char *tag); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_w(struct soap_dom_element *elt, const char *ns, const wchar_t *tag); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_nth_elt(struct soap_dom_element *elt, const char *ns, const char *tag, size_t n); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_nth_elt_w(struct soap_dom_element *elt, const char *ns, const wchar_t *tag, size_t n); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_nth(struct soap_dom_element *elt, size_t n); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_add_att(struct soap_dom_element *elt, const struct soap_dom_attribute *node); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_add_elt(struct soap_dom_element *elt, const struct soap_dom_element *node); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_add_atts(struct soap_dom_element *elt, const struct soap_dom_attribute *atts); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_add_elts(struct soap_dom_element *elt, const struct soap_dom_element *elts); /* soap_dom_element assignment */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_bool(struct soap_dom_element *elt, LONG64 b); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_int(struct soap_dom_element *elt, LONG64 n); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_double(struct soap_dom_element *elt, double x); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_text(struct soap_dom_element *elt, const char *text); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_text_w(struct soap_dom_element *elt, const wchar_t *text); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_node(struct soap_dom_element *elt, const void *node, int type); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_copy(struct soap_dom_element *elt, const struct soap_dom_element *node); /* soap_dom_element properties */ SOAP_FMAC1 int SOAP_FMAC2 soap_elt_match(const struct soap_dom_element *elt, const char *ns, const char *patt); SOAP_FMAC1 int SOAP_FMAC2 soap_elt_match_w(const struct soap_dom_element *elt, const char *ns, const wchar_t *patt); SOAP_FMAC1 const char * SOAP_FMAC2 soap_elt_get_ns(const struct soap_dom_element *elt); SOAP_FMAC1 const char * SOAP_FMAC2 soap_elt_get_tag(const struct soap_dom_element *elt); SOAP_FMAC1 int SOAP_FMAC2 soap_elt_is_true(const struct soap_dom_element *elt); SOAP_FMAC1 int SOAP_FMAC2 soap_elt_is_false(const struct soap_dom_element *elt); SOAP_FMAC1 int SOAP_FMAC2 soap_elt_get_int(const struct soap_dom_element *elt); SOAP_FMAC1 long SOAP_FMAC2 soap_elt_get_long(const struct soap_dom_element *elt); SOAP_FMAC1 LONG64 SOAP_FMAC2 soap_elt_get_LONG64(const struct soap_dom_element *elt); SOAP_FMAC1 double SOAP_FMAC2 soap_elt_get_double(const struct soap_dom_element *elt); SOAP_FMAC1 const char * SOAP_FMAC2 soap_elt_get_text(const struct soap_dom_element *elt); SOAP_FMAC1 const void * SOAP_FMAC2 soap_elt_get_node(const struct soap_dom_element *elt, int type); SOAP_FMAC1 int SOAP_FMAC2 soap_elt_get_type(const struct soap_dom_element *elt, const void **node); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_parent(const struct soap_dom_element *elt); SOAP_FMAC1 size_t SOAP_FMAC2 soap_elt_depth(const struct soap_dom_element *elt); SOAP_FMAC1 size_t SOAP_FMAC2 soap_elt_index(const struct soap_dom_element *elt); SOAP_FMAC1 size_t SOAP_FMAC2 soap_elt_len(const struct soap_dom_element *elt); SOAP_FMAC1 size_t SOAP_FMAC2 soap_elt_nth(const struct soap_dom_element *elt); /* soap_dom_attribute construction */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_new(struct soap *soap, const char *ns, const char *tag); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_new_w(struct soap *soap, const char *ns, const wchar_t *tag); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_set(struct soap_dom_attribute *att, const char *ns, const char *tag); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_set_w(struct soap_dom_attribute *att, const char *ns, const wchar_t *tag); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_add(struct soap_dom_attribute *att, const char *ns, const char *tag); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_add_w(struct soap_dom_attribute *att, const char *ns, const wchar_t *tag); /* soap_dom_attribute assignment */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_bool(struct soap_dom_attribute *att, LONG64 b); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_int(struct soap_dom_attribute *att, LONG64 n); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_double(struct soap_dom_attribute *att, double x); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_text(struct soap_dom_attribute *att, const char *text); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_text_w(struct soap_dom_attribute *att, const wchar_t *text); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_copy(struct soap_dom_attribute *att, const struct soap_dom_attribute *node); /* soap_dom_attribute properties */ SOAP_FMAC1 int SOAP_FMAC2 soap_att_match(const struct soap_dom_attribute *att, const char *ns, const char *patt); SOAP_FMAC1 int SOAP_FMAC2 soap_att_match_w(const struct soap_dom_attribute *att, const char *ns, const wchar_t *patt); SOAP_FMAC1 const char * SOAP_FMAC2 soap_att_get_ns(const struct soap_dom_attribute *att); SOAP_FMAC1 const char * SOAP_FMAC2 soap_att_get_tag(const struct soap_dom_attribute *att); SOAP_FMAC1 int SOAP_FMAC2 soap_att_is_true(const struct soap_dom_attribute *att); SOAP_FMAC1 int SOAP_FMAC2 soap_att_is_false(const struct soap_dom_attribute *att); SOAP_FMAC1 int SOAP_FMAC2 soap_att_get_int(const struct soap_dom_attribute *att); SOAP_FMAC1 long SOAP_FMAC2 soap_att_get_long(const struct soap_dom_attribute *att); SOAP_FMAC1 LONG64 SOAP_FMAC2 soap_att_get_LONG64(const struct soap_dom_attribute *att); SOAP_FMAC1 double SOAP_FMAC2 soap_att_get_double(const struct soap_dom_attribute *att); SOAP_FMAC1 const char * SOAP_FMAC2 soap_att_get_text(const struct soap_dom_attribute *att); /* DOM local traversal */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_first(struct soap_dom_element *elt); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_next(const struct soap_dom_attribute *att); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_first(struct soap_dom_element *elt); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_next(const struct soap_dom_element *elt); /* DOM local retrieval */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_get(const struct soap_dom_element *elt, const char *ns, const char *tag); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_get_w(const struct soap_dom_element *elt, const char *ns, const wchar_t *tag); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_get(const struct soap_dom_element *elt, const char *ns, const char *tag); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_get_w(const struct soap_dom_element *elt, const char *ns, const wchar_t *tag); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_get_next(const struct soap_dom_element *elt); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_get_nth(struct soap_dom_element *elt, size_t n); /* DOM local search */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_find(struct soap_dom_element *elt, const char *ns, const char *patt); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_find_next(const struct soap_dom_attribute *att, const char *ns, const char *patt); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_find(struct soap_dom_element *elt, const char *ns, const char *patt); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_find_next(const struct soap_dom_element *elt, const char *ns, const char *patt); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_find_type(struct soap_dom_element *elt, const char *ns, const char *patt, int type); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_find_next_type(const struct soap_dom_element *elt, const char *ns, const char *patt, int type); /* DOM size of local search results */ SOAP_FMAC1 size_t SOAP_FMAC2 soap_att_size(struct soap_dom_element *elt, const char *ns, const char *patt); SOAP_FMAC1 size_t SOAP_FMAC2 soap_elt_size(struct soap_dom_element *elt, const char *ns, const char *patt); SOAP_FMAC1 size_t SOAP_FMAC2 soap_elt_size_type(struct soap_dom_element *elt, const char *ns, const char *patt, int type); /* DOM deep traversal */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_dom_next_attribute(const struct soap_dom_attribute *att); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_dom_next_element(const struct soap_dom_element *elt, const struct soap_dom_element *end); /* DOM deep search */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_dom_find(struct soap_dom_element *begin, const struct soap_dom_element *end, const char *ns, const char *patt, int type); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_dom_find_next(const struct soap_dom_element *elt, const struct soap_dom_element *end, const char *ns, const char *patt, int type); #endif #if defined(__cplusplus) } #endif #ifndef WITH_LEANER #ifdef __cplusplus class soap_dom_attribute_iterator { public: struct soap_dom_attribute *iter; const char *nstr; const char *name; bool operator==(const soap_dom_attribute_iterator&) const; bool operator!=(const soap_dom_attribute_iterator&) const; struct soap_dom_attribute& operator*() const; struct soap_dom_attribute *operator->() const; soap_dom_attribute_iterator& operator++(); soap_dom_attribute_iterator operator++(int); soap_dom_attribute_iterator(); soap_dom_attribute_iterator(struct soap_dom_attribute*); ~soap_dom_attribute_iterator(); }; #endif #endif #ifndef WITH_LEANER struct soap_dom_attribute { struct soap_dom_attribute *next; const char *nstr; const char *name; const char *text; struct soap *soap; #ifdef __cplusplus typedef soap_dom_attribute_iterator iterator; soap_dom_attribute(struct soap *soap = NULL); soap_dom_attribute(const soap_dom_attribute& att); soap_dom_attribute(struct soap *soap, const char *tag); soap_dom_attribute(struct soap *soap, const wchar_t *tag); soap_dom_attribute(struct soap *soap, const char *ns, const char *tag, const char *text); soap_dom_attribute(struct soap *soap, const char *ns, const char *tag, const wchar_t *text); soap_dom_attribute(struct soap *soap, const char *ns, const wchar_t *tag, const char *text); soap_dom_attribute(struct soap *soap, const char *ns, const wchar_t *tag, const wchar_t *text); soap_dom_attribute(struct soap *soap, const char *ns, const char *tag, const std::string& text); soap_dom_attribute(struct soap *soap, const char *ns, const char *tag, const std::wstring& text); soap_dom_attribute(struct soap *soap, const char *ns, const wchar_t *tag, const std::string& text); soap_dom_attribute(struct soap *soap, const char *ns, const wchar_t *tag, const std::wstring& text); ~soap_dom_attribute(); soap_dom_attribute& set(const char *ns, const char *tag) { return *soap_att_set(this, ns, tag); } soap_dom_attribute& set(const char *ns, const wchar_t *tag) { return *soap_att_set_w(this, ns, tag); } soap_dom_attribute& set(bool b) { return *soap_att_bool(this, b); } soap_dom_attribute& set(int n) { return *soap_att_int(this, n); } soap_dom_attribute& set(LONG64 n) { return *soap_att_int(this, n); } soap_dom_attribute& set(float x) { return *soap_att_double(this, x); } soap_dom_attribute& set(double x) { return *soap_att_double(this, x); } soap_dom_attribute& set(const char *text) { return *soap_att_text(this, text); } soap_dom_attribute& set(const wchar_t *text) { return *soap_att_text_w(this, text); } #ifndef WITH_COMPAT soap_dom_attribute& set(const std::string& text) { return *soap_att_text(this, text.c_str()); } soap_dom_attribute& set(const std::wstring& text) { return *soap_att_text_w(this, text.c_str()); } #endif soap_dom_attribute& operator=(bool b) { return *soap_att_bool(this, b); } soap_dom_attribute& operator=(int n) { return *soap_att_int(this, n); } soap_dom_attribute& operator=(LONG64 n) { return *soap_att_int(this, n); } soap_dom_attribute& operator=(float x) { return *soap_att_double(this, x); } soap_dom_attribute& operator=(double x) { return *soap_att_double(this, x); } soap_dom_attribute& operator=(const char *text) { return *soap_att_text(this, text); } soap_dom_attribute& operator=(const wchar_t *text) { return *soap_att_text_w(this, text); } #ifndef WITH_COMPAT soap_dom_attribute& operator=(const std::string& text) { return *soap_att_text(this, text.c_str()); } soap_dom_attribute& operator=(const std::wstring& text) { return *soap_att_text_w(this, text.c_str()); } #endif soap_dom_attribute& operator=(const soap_dom_attribute& att) { return *soap_att_copy(this, &att); } soap_dom_attribute& att(const char *tag) { return *soap_att_add(this, NULL, tag); } soap_dom_attribute& att(const wchar_t *tag) { return *soap_att_add_w(this, NULL, tag); } soap_dom_attribute& att(const char *ns, const char *tag) { return *soap_att_add(this, ns, tag); } soap_dom_attribute& att(const char *ns, const wchar_t *tag) { return *soap_att_add_w(this, ns, tag); } bool match(const char *patt) const { return soap_att_match(this, NULL, patt) != 0; } bool match(const wchar_t *patt) const { return soap_att_match_w(this, NULL, patt) != 0; } bool match(const char *ns, const char *patt) const { return soap_att_match(this, ns, patt) != 0; } bool match(const char *ns, const wchar_t *patt) const { return soap_att_match_w(this, ns, patt) != 0; } const char *ns() const { return this->nstr; } const char *tag() const { return this->name; } bool is_true() const { return soap_att_is_true(this) != 0; } bool is_false() const { return soap_att_is_false(this) != 0; } LONG64 get_int() const { return soap_att_get_LONG64(this); } double get_double() const { return soap_att_get_double(this); } const char *get_text() const { return this->text; } operator bool() const { return soap_att_is_true(this) != 0; } operator int() const { return soap_att_get_int(this); } operator LONG64() const { return soap_att_get_LONG64(this); } operator double() const { return soap_att_get_double(this); } operator const char*() const { return this->text; } soap_dom_attribute_iterator att_begin() { return soap_dom_attribute_iterator(this); } soap_dom_attribute_iterator att_end() { return soap_dom_attribute_iterator(NULL); } soap_dom_attribute_iterator att_find(const char *patt) { return att_find(NULL, patt); } soap_dom_attribute_iterator att_find(const wchar_t *patt) { return att_find(NULL, patt); } soap_dom_attribute_iterator att_find(const char *ns, const char *patt); soap_dom_attribute_iterator att_find(const char *ns, const wchar_t *patt); void unlink(); #endif }; #endif #ifndef WITH_LEANER #ifdef __cplusplus class soap_dom_element_iterator { public: struct soap_dom_element *iter; struct soap_dom_element *stop; const char *nstr; const char *name; int type; bool deep; bool operator==(const soap_dom_element_iterator&) const; bool operator!=(const soap_dom_element_iterator&) const; struct soap_dom_element& operator*() const; struct soap_dom_element *operator->() const; soap_dom_element_iterator& operator++(); soap_dom_element_iterator operator++(int); soap_dom_element_iterator(); soap_dom_element_iterator(struct soap_dom_element*); ~soap_dom_element_iterator(); }; #endif #endif #ifndef WITH_LEANER struct soap_dom_element { struct soap_dom_element *next; struct soap_dom_element *prnt; struct soap_dom_element *elts; struct soap_dom_attribute *atts; const char *nstr; const char *name; const char *lead; const char *text; const char *code; const char *tail; const void *node; int type; struct soap *soap; #ifdef __cplusplus typedef soap_dom_element_iterator iterator; soap_dom_element(struct soap *soap = NULL); soap_dom_element(const soap_dom_element& elt); soap_dom_element(struct soap *soap, const char *tag); soap_dom_element(struct soap *soap, const wchar_t *tag); soap_dom_element(struct soap *soap, const char *ns, const char *tag); soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag); soap_dom_element(struct soap *soap, const char *ns, const char *tag, const char *text); soap_dom_element(struct soap *soap, const char *ns, const char *tag, const wchar_t *text); soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag, const char *text); soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag, const wchar_t *text); #ifndef WITH_COMPAT soap_dom_element(struct soap *soap, const char *ns, const char *tag, const std::string& text); soap_dom_element(struct soap *soap, const char *ns, const char *tag, const std::wstring& text); soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag, const std::string& text); soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag, const std::wstring& text); #endif soap_dom_element(struct soap *soap, const char *ns, const char *tag, const void *node, int type); soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag, const void *node, int type); ~soap_dom_element(); soap_dom_element& set(const char *ns, const char *tag) { return *soap_elt_set(this, ns, tag); } soap_dom_element& set(const char *ns, const wchar_t *tag) { return *soap_elt_set_w(this, ns, tag); } soap_dom_element& set(bool b) { return *soap_elt_bool(this, b); } soap_dom_element& set(int n) { return *soap_elt_int(this, n); } soap_dom_element& set(LONG64 n) { return *soap_elt_int(this, n); } soap_dom_element& set(float x) { return *soap_elt_double(this, x); } soap_dom_element& set(double x) { return *soap_elt_double(this, x); } soap_dom_element& set(const char *text) { return *soap_elt_text(this, text); } soap_dom_element& set(const wchar_t *text) { return *soap_elt_text_w(this, text); } #ifndef WITH_COMPAT soap_dom_element& set(const std::string& text) { return *soap_elt_text(this, text.c_str()); } soap_dom_element& set(const std::wstring& text) { return *soap_elt_text_w(this, text.c_str()); } #endif soap_dom_element& set(const void *node, int type) { return *soap_elt_node(this, node, type); } soap_dom_element& add(soap_dom_element& elt) { return *soap_add_elt(this, &elt); } soap_dom_element& add(soap_dom_element *elt) { return *soap_add_elt(this, elt); } soap_dom_element& add(soap_dom_attribute& att) { return *soap_add_att(this, &att); } soap_dom_element& add(soap_dom_attribute *att) { return *soap_add_att(this, att); } soap_dom_element& adds(soap_dom_element& elts) { return *soap_add_elts(this, &elts); } soap_dom_element& adds(soap_dom_element *elts) { return *soap_add_elts(this, elts); } soap_dom_element& adds(soap_dom_attribute& atts) { return *soap_add_atts(this, &atts); } soap_dom_element& adds(soap_dom_attribute *atts) { return *soap_add_atts(this, atts); } soap_dom_element& operator=(bool b) { return *soap_elt_bool(this, b); } soap_dom_element& operator=(int n) { return *soap_elt_int(this, n); } soap_dom_element& operator=(LONG64 n) { return *soap_elt_int(this, n); } soap_dom_element& operator=(float x) { return *soap_elt_double(this, x); } soap_dom_element& operator=(double x) { return *soap_elt_double(this, x); } soap_dom_element& operator=(const char *text) { return *soap_elt_text(this, text); } soap_dom_element& operator=(const wchar_t *text) { return *soap_elt_text_w(this, text); } #ifndef WITH_COMPAT soap_dom_element& operator=(const std::string& text) { return *soap_elt_text(this, text.c_str()); } soap_dom_element& operator=(const std::wstring& text) { return *soap_elt_text_w(this, text.c_str()); } #endif soap_dom_element& operator=(const soap_dom_element& elt) { return *soap_elt_copy(this, &elt); } template soap_dom_element& operator=(const T& node) { return this->set(&node, node.soap_type()); } template soap_dom_element& operator=(const T *node) { return this->set(node, node->soap_type()); } template soap_dom_element& operator=(T *node) { return this->set(node, node->soap_type()); } soap_dom_attribute& att(const char *tag) { return *soap_att(this, NULL, tag); } soap_dom_attribute& att(const wchar_t *tag) { return *soap_att_w(this, NULL, tag); } soap_dom_attribute& att(const char *ns, const char *tag) { return *soap_att(this, ns, tag); } soap_dom_attribute& att(const char *ns, const wchar_t *tag) { return *soap_att_w(this, ns, tag); } soap_dom_element& elt() { return *soap_elt(this, NULL, NULL); } soap_dom_element& elt(const char *tag) { return *soap_elt(this, NULL, tag); } soap_dom_element& elt(const wchar_t *tag) { return *soap_elt_w(this, NULL, tag); } soap_dom_element& elt(const char *ns, const char *tag) { return *soap_elt(this, ns, tag); } soap_dom_element& elt(const char *ns, const wchar_t *tag) { return *soap_elt_w(this, ns, tag); } soap_dom_element& operator[](const char *tag) { return *soap_elt(this, NULL, tag); } soap_dom_element& operator[](const wchar_t *tag) { return *soap_elt_w(this, NULL, tag); } soap_dom_element& operator[](size_t n) { return *soap_nth(this, n); } soap_dom_attribute *att_get(const char *tag) const { return soap_att_get(this, NULL, tag); } soap_dom_attribute *att_get(const wchar_t *tag) const { return soap_att_get_w(this, NULL, tag); } soap_dom_attribute *att_get(const char *ns, const char *tag) const { return soap_att_get(this, ns, tag); } soap_dom_attribute *att_get(const char *ns, const wchar_t *tag) const { return soap_att_get_w(this, ns, tag); } soap_dom_element *elt_get() const { return soap_elt_get(this, NULL, NULL); } soap_dom_element *elt_get(const char *tag) const { return soap_elt_get(this, NULL, tag); } soap_dom_element *elt_get(const wchar_t *tag) const { return soap_elt_get_w(this, NULL, tag); } soap_dom_element *elt_get(const char *ns, const char *tag) const { return soap_elt_get(this, ns, tag); } soap_dom_element *elt_get(const char *ns, const wchar_t *tag) const { return soap_elt_get_w(this, ns, tag); } soap_dom_element *get_next() const { return soap_elt_get_next(this); } soap_dom_element *get_nth(size_t n) { return soap_elt_get_nth(this, n); } bool match(const char *patt) const { return soap_elt_match(this, NULL, patt) != 0; } bool match(const wchar_t *patt) const { return soap_elt_match_w(this, NULL, patt) != 0; } bool match(const char *ns, const char *patt) const { return soap_elt_match(this, ns, patt) != 0; } bool match(const char *ns, const wchar_t *patt) const { return soap_elt_match_w(this, ns, patt) != 0; } const char *ns() const { return this->nstr; } const char *tag() const { return this->name; } soap_dom_element *parent() { return this->prnt; } size_t depth() const { return soap_elt_depth(this); } size_t index() const { return soap_elt_index(this); } size_t len() const { return soap_elt_len(this); } size_t nth() const { return soap_elt_nth(this); } size_t elt_size() { return soap_elt_size(this, NULL, NULL); } size_t elt_size(const char *patt, int type = 0) { return elt_size(NULL, patt, type); } size_t elt_size(const char *ns, const char *patt, int type = 0) { return soap_elt_size_type(this, ns, patt, type); } size_t att_size() { return soap_att_size(this, NULL, NULL); } size_t att_size(const char *patt) { return att_size(NULL, patt); } #ifndef WITH_COMPAT size_t att_size(const std::string& patt) { return att_size(NULL, patt); } #endif size_t att_size(const char *ns, const char *patt) { return soap_att_size(this, ns, patt); } #ifndef WITH_COMPAT size_t att_size(const char *ns, const std::string& patt) { return soap_att_size(this, ns, patt.c_str()); } #endif bool is_true() const { return soap_elt_is_true(this) != 0; } bool is_false() const { return soap_elt_is_false(this) != 0; } LONG64 get_int() const { return soap_elt_get_LONG64(this); } double get_double() const { return soap_elt_get_double(this); } const char *get_text() const { return this->text; } const void *get_node(int type) const { return soap_elt_get_node(this, type); } int get_type(const void **node) const { return soap_elt_get_type(this, node); } operator bool() const { return soap_elt_is_true(this) != 0; } operator int() const { return soap_elt_get_int(this); } operator LONG64() const { return soap_elt_get_LONG64(this); } operator double() const { return soap_elt_get_double(this); } operator const char*() const { return this->text; } soap_dom_element_iterator begin(); soap_dom_element_iterator end() { return soap_dom_element_iterator(NULL); } soap_dom_element_iterator elt_begin() { return soap_dom_element_iterator(this->elts); } soap_dom_element_iterator elt_end() { return soap_dom_element_iterator(NULL); } soap_dom_attribute_iterator att_begin() { return soap_dom_attribute_iterator(this->atts); } soap_dom_attribute_iterator att_end() { return soap_dom_attribute_iterator(NULL); } soap_dom_element_iterator find(const char *patt, int type = 0) { return find(NULL, patt, type); } soap_dom_element_iterator find(const wchar_t *patt, int type = 0) { return find(NULL, patt, type); } soap_dom_element_iterator find(const char *ns, const char *patt, int type = 0); soap_dom_element_iterator find(const char *ns, const wchar_t *patt, int type = 0); soap_dom_element_iterator find(int type); soap_dom_element_iterator elt_find(const char *patt, int type = 0) { return elt_find(NULL, patt, type); } soap_dom_element_iterator elt_find(const wchar_t *patt, int type = 0) { return elt_find(NULL, patt, type); } soap_dom_element_iterator elt_find(const char *ns, const char *patt, int type = 0); soap_dom_element_iterator elt_find(const char *ns, const wchar_t *patt, int type = 0); soap_dom_element_iterator elt_find(int type); soap_dom_attribute_iterator att_find(const char *patt) { return att_find(NULL, patt); } soap_dom_attribute_iterator att_find(const wchar_t *patt) { return att_find(NULL, patt); } soap_dom_attribute_iterator att_find(const char *ns, const char *patt); soap_dom_attribute_iterator att_find(const char *ns, const wchar_t *patt); void unlink(); #endif }; #endif SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_dup_xsd__anyType(struct soap *soap, struct soap_dom_element *d, const struct soap_dom_element *a); SOAP_FMAC1 void SOAP_FMAC2 soap_del_xsd__anyType(const struct soap_dom_element *a); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_dup_xsd__anyAttribute(struct soap *soap, struct soap_dom_attribute *d, const struct soap_dom_attribute *a); SOAP_FMAC1 void SOAP_FMAC2 soap_del_xsd__anyAttribute(const struct soap_dom_attribute *a); SOAP_FMAC1 int SOAP_FMAC2 soap_dom_call(struct soap *soap, const char *endpoint, const char *action, const struct soap_dom_element *in, struct soap_dom_element *out); #if defined(__cplusplus) && !defined(WITH_COMPAT) extern std::ostream &operator<<(std::ostream&, const struct soap_dom_element&); extern std::istream &operator>>(std::istream&, struct soap_dom_element&); SOAP_FMAC1 int SOAP_FMAC2 soap_dom_call(struct soap *soap, const char *endpoint, const char *action, const struct soap_dom_element& in, struct soap_dom_element& out); SOAP_FMAC1 int SOAP_FMAC2 soap_dom_call(struct soap *soap, const char *endpoint, const char *action, const struct soap_dom_element *in, struct soap_dom_element& out); SOAP_FMAC1 int SOAP_FMAC2 soap_dom_call(struct soap *soap, const char *endpoint, const char *action, const struct soap_dom_element& in, struct soap_dom_element *out); #endif #if defined(__cplusplus) extern "C" { #endif /******************************************************************************/ #ifdef WIN32 # ifdef SOAP_STD_EXPORTS # define SOAP_STD_API __declspec(dllexport) # else # define SOAP_STD_API # endif #else # define SOAP_STD_API #endif struct SOAP_STD_API soap { short state; /* 0 = uninitialized, 1 = initialized, 2 = copy of another soap struct */ short version; /* 1 = SOAP1.1 and 2 = SOAP1.2 (set automatically from namespace URI in nsmap table), 0 indicates non-SOAP content */ soap_mode mode; soap_mode imode; soap_mode omode; const char *float_format; /* user-definable format string for floats (<1024 chars) */ const char *double_format; /* user-definable format string for doubles (<1024 chars) */ const char *long_double_format; /* user-definable format string for long doubles (<1024 chars) */ const char *dime_id_format; /* user-definable format string for integer DIME id ( 0, gives socket recv timeout in seconds, < 0 in usec */ int send_timeout; /* when > 0, gives socket send timeout in seconds, < 0 in usec */ int connect_timeout; /* when > 0, gives socket connect() timeout in seconds, < 0 in usec */ int accept_timeout; /* when > 0, gives socket accept() timeout in seconds, < 0 in usec */ int socket_flags; /* socket recv() and send() flags, e.g. set to MSG_NOSIGNAL to disable sigpipe */ int connect_flags; /* connect() SOL_SOCKET sockopt flags, e.g. set to SO_DEBUG to debug socket */ int bind_flags; /* bind() SOL_SOCKET sockopt flags, e.g. set to SO_REUSEADDR to enable reuse */ int accept_flags; /* accept() SOL_SOCKET sockopt flags */ unsigned short linger_time; /* linger time for SO_LINGER option */ const struct Namespace *namespaces; /* Pointer to global namespace mapping table */ struct Namespace *local_namespaces; /* Local namespace mapping table */ struct soap_nlist *nlist; /* namespace stack */ struct soap_blist *blist; /* block allocation stack */ struct soap_clist *clist; /* class instance allocation list */ void *alist; /* memory allocation (malloc) list */ short shaky; /* objects in reallocatable containers are on shaky grounds */ #if !defined(WITH_LEANER) || !defined(WITH_NOIDREF) struct soap_ilist *iht[SOAP_IDHASH]; #endif struct soap_plist *pht[SOAP_PTRHASH]; struct soap_pblk *pblk; /* plist block allocation */ short pidx; /* plist block allocation */ struct SOAP_ENV__Header *header; struct SOAP_ENV__Fault *fault; int idnum; void *user; /* for user to pass user-defined data to callbacks */ void *data[4]; /* extension data = {smdevp, mecevp, ...} */ struct soap_plugin *plugins; /* linked list of plug-in data */ const char *userid; /* HTTP Basic authorization userid */ const char *passwd; /* HTTP Basic authorization passwd */ const char *authrealm; /* HTTP authentication realm (NTLM domain) */ #if !defined(WITH_LEAN) || defined(WITH_NTLM) const char *ntlm_challenge; /* HTTP NTLM challenge key string */ short ntlm_auth; /* HTTP NTLM authentication type */ short ntlm_stage; /* HTTP NTLM stage 0..3 */ #endif int (*fpost)(struct soap*, const char*, const char*, int, const char*, const char*, size_t); int (*fget)(struct soap*); /* HTTP GET hook (not set by default) */ int (*fput)(struct soap*); /* HTTP PUT hook (handled as POST by default) */ int (*fdel)(struct soap*); /* HTTP DELETE hook (not set by default) */ int (*fopt)(struct soap*); /* HTTP OPTIONS hook (not set by default) */ int (*fhead)(struct soap*); /* HTTP HEAD hook (not set by default) */ int (*fform)(struct soap*); /* HTTP/HTML form handler for plugins */ int (*fposthdr)(struct soap*, const char*, const char*); int (*fresponse)(struct soap*, int, size_t); int (*fparse)(struct soap*); int (*fparsehdr)(struct soap*, const char*, const char*); int (*fheader)(struct soap*); int (*fresolve)(struct soap*, const char*, struct in_addr* inaddr); int (*fconnect)(struct soap*, const char*, const char*, int); int (*fdisconnect)(struct soap*); int (*fclosesocket)(struct soap*, SOAP_SOCKET); int (*fshutdownsocket)(struct soap*, SOAP_SOCKET, int); SOAP_SOCKET (*fopen)(struct soap*, const char*, const char*, int); SOAP_SOCKET (*faccept)(struct soap*, SOAP_SOCKET, struct sockaddr*, int *n); int (*fclose)(struct soap*); int (*fsend)(struct soap*, const char*, size_t); size_t (*frecv)(struct soap*, char*, size_t); int (*fpoll)(struct soap*); void (*fseterror)(struct soap*, const char **c, const char **s); int (*fignore)(struct soap*, const char*); int (*fserveloop)(struct soap*); void *(*fplugin)(struct soap*, const char*); void *(*fmalloc)(struct soap*, size_t); #ifndef WITH_LEANER int (*fsvalidate)(struct soap*, const char*, const char*); int (*fwvalidate)(struct soap*, const char*, const wchar_t*); int (*feltbegin)(struct soap*, const char*); int (*feltendin)(struct soap*, const char*, const char*); int (*feltbegout)(struct soap*, const char*); int (*feltendout)(struct soap*, const char*); int (*fprepareinitsend)(struct soap*); int (*fprepareinitrecv)(struct soap*); int (*fpreparesend)(struct soap*, const char*, size_t); int (*fpreparerecv)(struct soap*, const char*, size_t); int (*fpreparefinalsend)(struct soap*); int (*fpreparefinalrecv)(struct soap*); int recverror; /* last soap_recv_raw error code for filterrecv */ int (*ffiltersend)(struct soap*, const char**, size_t*); int (*ffilterrecv)(struct soap*, char*, size_t*, size_t); void *(*fdimereadopen)(struct soap*, void*, const char*, const char*, const char*); void *(*fdimewriteopen)(struct soap*, const char*, const char*, const char*); void (*fdimereadclose)(struct soap*, void*); void (*fdimewriteclose)(struct soap*, void*); size_t (*fdimeread)(struct soap*, void*, char*, size_t); int (*fdimewrite)(struct soap*, void*, const char*, size_t); void *(*fmimereadopen)(struct soap*, void*, const char*, const char*, const char*); void *(*fmimewriteopen)(struct soap*, void*, const char*, const char*, const char*, enum soap_mime_encoding); void (*fmimereadclose)(struct soap*, void*); void (*fmimewriteclose)(struct soap*, void*); size_t (*fmimeread)(struct soap*, void*, char*, size_t); int (*fmimewrite)(struct soap*, void*, const char*, size_t); #endif SOAP_SOCKET master; /* socket bound to TCP/IP port */ SOAP_SOCKET socket; /* socket to send and receive */ SOAP_SOCKET sendsk; /* socket to send (overrides ::socket) */ SOAP_SOCKET recvsk; /* socket to receive (overrides ::socket) */ #if defined(__cplusplus) && !defined(WITH_COMPAT) std::ostream *os; /* C++ only: ostream to send */ std::istream *is; /* C++ only: istream to receive */ #else const char **os; /* C only: pointer to a const char*, will be set to point to the string output */ const char *is; /* C only: a const char* to read from (soap->is will advance) */ #endif #ifndef UNDER_CE int sendfd; /* int file descriptor for sending */ int recvfd; /* int file descriptor for receiving */ #else FILE *sendfd; /* WinCE FILE* to send */ FILE *recvfd; /* WinCE FILE* to receive */ #endif size_t bufidx; /* index in soap.buf[] */ size_t buflen; /* length of soap.buf[] content */ soap_wchar ahead; /* parser lookahead */ short cdata; /* CDATA parser state */ short body; /* HTTP or XML element has a body (1) or not (0) */ unsigned int level; /* XML nesting level */ size_t count; /* message length counter */ size_t length; /* message length as set by HTTP header */ char *labbuf; /* look-aside buffer */ size_t lablen; /* look-aside buffer allocated length */ size_t labidx; /* look-aside buffer index to available part */ char buf[SOAP_BUFLEN];/* send and receive buffer */ char msgbuf[SOAP_TMPLEN]; /* in/out buffer for HTTP/MIME headers and short messages, must be >=1024 bytes */ char tmpbuf[SOAP_TMPLEN]; /* in/out buffer for HTTP/MIME headers, simpleType values, element and attribute tag names, and DIME must be >=1024 bytes */ char tag[SOAP_TAGLEN]; char id[SOAP_TAGLEN]; char href[SOAP_TAGLEN]; char type[SOAP_TAGLEN]; char arrayType[SOAP_TAGLEN]; char arraySize[SOAP_TAGLEN]; char arrayOffset[SOAP_TAGLEN]; short other; short root; int position; int positions[SOAP_MAXDIMS]; struct soap_attribute *attributes; /* attribute list */ short encoding; /* when set, output encodingStyle */ short mustUnderstand; /* a mustUnderstand element was parsed or is output */ short null; /* parsed XML is xsi:nil */ short ns; /* zero to output all xmlns */ short part; /* SOAP part state (header or body) */ short event; /* engine events and states for use by plugins */ short peeked; unsigned int evlev; /* event level */ int alloced; size_t chunksize; size_t chunkbuflen; char endpoint[SOAP_TAGLEN]; char path[SOAP_TAGLEN]; char host[SOAP_TAGLEN]; char *action; const char *prolog; /* XML declaration prolog */ unsigned long ip; /* IP number */ int port; /* port number */ short keep_alive; /* connection should be kept open */ short tcp_keep_alive; /* enable SO_KEEPALIVE */ unsigned int tcp_keep_idle; /* set TCP_KEEPIDLE */ unsigned int tcp_keep_intvl; /* set TCP_KEEPINTVL */ unsigned int tcp_keep_cnt; /* set TCP_KEEPCNT */ unsigned int max_keep_alive; /* maximum keep-alive session (default=100) */ const char *proxy_http_version;/* HTTP version of proxy "1.0" or "1.1" */ const char *proxy_host; /* Proxy Server host name */ int proxy_port; /* Proxy Server port (default = 8080) */ const char *proxy_userid; /* Proxy Authorization user name */ const char *proxy_passwd; /* Proxy Authorization password */ const char *proxy_from; /* X-Forwarding-For header returned by proxy */ int status; /* -1 when request, else error code to be returned by server */ int error; int errmode; int errnum; #ifndef WITH_LEANER struct soap_dom_element *dom; struct soap_dime dime; struct soap_mime mime; struct soap_xlist *xlist; #endif #if !defined(WITH_LEAN) || defined(SOAP_DEBUG) const char *logfile[SOAP_MAXLOGS]; FILE *fdebug[SOAP_MAXLOGS]; struct soap_mlist *mht[SOAP_PTRHASH]; #endif #ifndef WITH_LEAN const char *wsuid; /* space-separated string of element tags */ const char *c14nexclude; /* space-separated string of prefixes for c14n exclusion */ const char *c14ninclude; /* space-separated string of prefixes for c14n inclusion */ struct soap_cookie *cookies; const char *cookie_domain; const char *cookie_path; int cookie_max; #endif #ifndef WITH_NOIO unsigned int ipv6_multicast_if; /* in_addr_t in6addr->sin6_scope_id IPv6 value */ char* ipv4_multicast_if; /* IP_MULTICAST_IF IPv4 setsockopt interface_addr */ unsigned char ipv4_multicast_ttl; /* IP_MULTICAST_TTL value 0..255 */ union { struct sockaddr addr; struct sockaddr_in in; struct sockaddr_storage storage; } peer; /* set by soap_connect/soap_accept and by UDP recv */ #endif size_t peerlen; #if defined(WITH_OPENSSL) /* OpenSSL */ int (*fsslauth)(struct soap*); int (*fsslverify)(int, X509_STORE_CTX*); BIO *bio; SSL *ssl; SSL_CTX *ctx; SSL_SESSION *session; const char *dhfile; const char *randfile; #elif defined(WITH_GNUTLS) /* GNUTLS */ int (*fsslauth)(struct soap*); void *fsslverify; gnutls_certificate_credentials_t xcred; /* cert pointer */ gnutls_anon_client_credentials_t acred; /* anon pointer */ gnutls_priority_t cache; /* priority cache pointer */ gnutls_session_t session; /* session pointer */ gnutls_dh_params_t dh_params; gnutls_rsa_params_t rsa_params; #elif defined(WITH_SYSTEMSSL) /* SYSTEM SSL */ int (*fsslauth)(struct soap*); void *fsslverify; /* N/A */ void *bio; /* N/A */ gsk_handle ctx; /* environment */ gsk_handle ssl; /* ssl socket */ void *session; /* N/A */ const char *dhfile; /* N/A */ const char *randfile; /* N/A */ #else /* No SSL/TLS */ void *fsslauth; /* dummy members, to preserve struct size */ void *fsslverify; void *bio; void *ssl; void *ctx; void *session; void *dh_params; void *rsa_params; #endif unsigned short ssl_flags; const char *keyfile; const char *keyid; const char *password; const char *cafile; const char *capath; const char *crlfile; char session_host[SOAP_TAGLEN]; int session_port; #ifdef WITH_C_LOCALE # ifdef WIN32 _locale_t c_locale; /* set to C locale by default */ # else locale_t c_locale; /* set to C locale by default */ # endif #else void *c_locale; #endif #ifdef WITH_ZLIB z_stream *d_stream; /* decompression stream */ uLong z_crc; /* internal gzip crc */ #else void *d_stream; /* dummy members, to preserve struct size */ soap_int32 z_crc; #endif const char *z_dict; /* support for zlib static dictionaries */ unsigned int z_dict_len; short zlib_state; /* SOAP_ZLIB_NONE, SOAP_ZLIB_DEFLATE, or SOAP_ZLIB_INFLATE */ short zlib_in; /* SOAP_ZLIB_NONE, SOAP_ZLIB_DEFLATE, or SOAP_ZLIB_GZIP */ short zlib_out; /* SOAP_ZLIB_NONE, SOAP_ZLIB_DEFLATE, or SOAP_ZLIB_GZIP */ char *z_buf; /* buffer */ size_t z_buflen; unsigned short z_level; /* compression level to be used (0=none, 1=fast to 9=best) */ float z_ratio_in; /* detected compression ratio compressed_length/length of inbound message */ float z_ratio_out; /* detected compression ratio compressed_length/length of outbound message */ #ifdef WMW_RPM_IO /* VxWorks */ void *rpmreqid; #endif #ifdef __cplusplus soap(); soap(soap_mode); soap(soap_mode, soap_mode); soap(const struct soap&); struct soap& operator=(const struct soap&); ~soap(); /* no virtual methods, so sizeof(soap) is same in C and C++ */ #endif }; struct soap_code_map { LONG64 code; const char *string; }; /* forwarding list */ struct soap_flist { struct soap_flist *next; int type; void *ptr; unsigned int level; size_t index; void (*finsert)(struct soap*, int, int, void*, size_t, const void*, void**); }; /* id-ref forwarding list */ struct soap_ilist { struct soap_ilist *next; int type; size_t size; void *ptr; void **spine; void *link; void *copy; struct soap_flist *flist; void *smart; short shaky; char id[1]; /* the actual id string value flows into the allocated region below this struct */ }; struct soap_plugin { struct soap_plugin *next; const char *id; void *data; int (*fcopy)(struct soap *soap, struct soap_plugin *dst, struct soap_plugin *src); void (*fdelete)(struct soap *soap, struct soap_plugin *p); /* should delete fields of plugin only and not free(p) */ }; extern SOAP_NMAC struct Namespace namespaces[]; #ifndef WITH_LEAN # define soap_get0(soap) (((soap)->bufidx>=(soap)->buflen && soap_recv(soap)) ? EOF : (unsigned char)(soap)->buf[(soap)->bufidx]) # define soap_get1(soap) (((soap)->bufidx>=(soap)->buflen && soap_recv(soap)) ? EOF : (unsigned char)(soap)->buf[(soap)->bufidx++]) #else soap_wchar soap_get0(struct soap*); soap_wchar soap_get1(struct soap*); #endif #define soap_versioning_paste(name, ext) name##_REQUIRE_lib_v##ext #define soap_versioning_ext(name, ext) soap_versioning_paste(name, ext) #define soap_versioning(name) soap_versioning_ext(name, GSOAP_VERSION) #define soap_init(soap) soap_init1(soap, SOAP_IO_DEFAULT) #define soap_init1(soap, mode) soap_init2(soap, mode, mode) #define soap_init2(soap, imode, omode) soap_versioning(soap_init)(soap, imode, omode) #define soap_new() soap_new1(SOAP_IO_DEFAULT) #define soap_new1(mode) soap_new2(mode, mode) #define soap_new2(imode, omode) soap_versioning(soap_new)(imode, omode) #define soap_revget1(soap) ((soap)->bufidx--) #define soap_unget(soap, c) ((soap)->ahead = c) #define soap_register_plugin(soap, plugin) soap_register_plugin_arg(soap, plugin, NULL) #define soap_mode(soap, n) ((soap)->mode = (soap)->imode = (soap)->omode = (n)) #define soap_imode(soap, n) ((soap)->imode = (n)) #define soap_omode(soap, n) ((soap)->omode = (n)) #define soap_set_imode(soap, n) ((soap)->imode |= (n)) #define soap_clr_imode(soap, n) ((soap)->imode &= ~(n)) #define soap_set_omode(soap, n) ((soap)->omode |= (n)) #define soap_clr_omode(soap, n) ((soap)->omode &= ~(n)) #define soap_set_mode(soap, n) ((soap)->mode |= (n), (soap)->imode |= (n), (soap)->omode |= (n)) #define soap_clr_mode(soap, n) ((soap)->mode &= ~(n), (soap)->imode &= ~(n), (soap)->omode &= ~(n)) #define soap_destroy(soap) soap_delete((soap), NULL) #define SOAP_NO_LINK_TO_DELETE (-2) /* pass to soap_link() as size n: do not manage, smart pointers are self-managing */ #ifdef HAVE_STRRCHR # define soap_strrchr(s, t) strrchr(s, t) #else SOAP_FMAC1 char* SOAP_FMAC2 soap_strrchr(const char *s, int t); #endif #ifdef HAVE_STRTOL # define soap_strtol(s, t, b) strtol(s, t, b) #else SOAP_FMAC1 long SOAP_FMAC2 soap_strtol(const char*, char**, int); #endif #ifdef HAVE_STRTOUL # define soap_strtoul(s, t, b) strtoul(s, t, b) #else SOAP_FMAC1 unsigned long SOAP_FMAC2 soap_strtoul(const char*, char**, int); #endif #if defined(WIN32) && !defined(__MINGW32__) && !defined(__MINGW64__) # define soap_strtoll _strtoi64 #else # define soap_strtoll strtoll #endif #if defined(WIN32) && !defined(__MINGW32__) && !defined(__MINGW64__) # define soap_strtoull _strtoui64 #else # define soap_strtoull strtoull #endif #if defined(WITH_OPENSSL) # define soap_random soap_rand() SOAP_FMAC1 int SOAP_FMAC2 soap_rand(void); #elif defined(HAVE_RANDOM) # define soap_random (int)random() #else # define soap_random rand() #endif #ifdef WITH_NOIDREF # define soap_embedded(s, p, t) ((void)(s), 0) # define soap_id_lookup(s, i, p, t, n, k, fb) ((void)(s), (p)) # define soap_id_forward(s, h, p, i, t, tt, n, k, fi, fb) ((void)(s), (p)) # define soap_id_nullify(s, i) ((void)(s), (i)) # define soap_reference(s, a, t) ((void)(s), 1) # define soap_array_reference(s, p, a, n, t) ((void)(s), 1) # define soap_embed(s, p, a, n, t) ((void)(s), 0) # define soap_embedded_id(s, i, p, t) ((void)(s), (void)(t), i) # define soap_is_embedded(s, p) ((void)(s), 0) # define soap_is_single(s, p) ((void)(s), 1) # define soap_lookup_type(s, i) ((void)(s), 0) # define soap_getindependent(s) ((void)(s), 0) # define soap_putindependent(s) ((void)(s), 0) # define soap_markelement(s, p, t) ((void)(s), 0) # define soap_begin_shaky(s) ((void)(s), 0) # define soap_end_shaky(s, f) ((void)(s), (void)(f), 0) #endif /* soap_traverse() traversal/walker routines take walker function arguments */ typedef void soap_walker(struct soap*, void*, int, const char*, const char*); SOAP_FMAC5 int SOAP_FMAC6 soap_serve(struct soap *soap); SOAP_FMAC5 int SOAP_FMAC6 soap_serve_request(struct soap *soap); SOAP_FMAC3 void SOAP_FMAC4 soap_header(struct soap*); SOAP_FMAC3 void SOAP_FMAC4 soap_fault(struct soap*); SOAP_FMAC3 const char** SOAP_FMAC4 soap_faultcode(struct soap*); SOAP_FMAC3 const char** SOAP_FMAC4 soap_faultsubcode(struct soap*); SOAP_FMAC3 const char** SOAP_FMAC4 soap_faultstring(struct soap*); SOAP_FMAC3 const char** SOAP_FMAC4 soap_faultdetail(struct soap*); SOAP_FMAC3 const char* SOAP_FMAC4 soap_check_faultsubcode(struct soap*); SOAP_FMAC3 const char* SOAP_FMAC4 soap_check_faultdetail(struct soap*); SOAP_FMAC3 void SOAP_FMAC4 soap_serializefault(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_serializeheader(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_getheader(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_putheader(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_getfault(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_putfault(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_ssl_init(void); SOAP_FMAC1 int SOAP_FMAC2 soap_poll(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_connect_command(struct soap*, int, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_connect(struct soap*, const char*, const char*); SOAP_FMAC1 SOAP_SOCKET SOAP_FMAC2 soap_bind(struct soap*, const char*, int, int); SOAP_FMAC1 SOAP_SOCKET SOAP_FMAC2 soap_accept(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_ssl_accept(struct soap*); SOAP_FMAC1 const char * SOAP_FMAC2 soap_ssl_error(struct soap*, int); SOAP_FMAC1 int SOAP_FMAC2 soap_ssl_crl(struct soap*, const char*); #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE) SOAP_FMAC1 int SOAP_FMAC2 soap_ssl_server_context(struct soap *soap, unsigned short flags, const char *keyfile, const char *keyid, const char *password, const char *cafile, const char *capath, const char *dhfile, const char *randfile, const char *sid); #else SOAP_FMAC1 int SOAP_FMAC2 soap_ssl_server_context(struct soap *soap, unsigned short flags, const char *keyfile, const char *password, const char *cafile, const char *capath, const char *dhfile, const char *randfile, const char *sid); #endif #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE) SOAP_FMAC1 int SOAP_FMAC2 soap_ssl_client_context(struct soap *soap, unsigned short flags, const char *keyfile, const char *keyid, const char *password, const char *cafile, const char *capath, const char *randfile); #else SOAP_FMAC1 int SOAP_FMAC2 soap_ssl_client_context(struct soap *soap, unsigned short flags, const char *keyfile, const char *password, const char *cafile, const char *capath, const char *randfile); #endif SOAP_FMAC1 int SOAP_FMAC2 soap_puthttphdr(struct soap*, int status, size_t count); SOAP_FMAC1 const char* SOAP_FMAC2 soap_get_header_attribute(struct soap*, const char*, const char*); SOAP_FMAC1 const char* SOAP_FMAC2 soap_decode_key(char*, size_t, const char*); SOAP_FMAC1 const char* SOAP_FMAC2 soap_decode_val(char*, size_t, const char*); SOAP_FMAC1 size_t SOAP_FMAC2 soap_hash(const char*); SOAP_FMAC1 void SOAP_FMAC2 soap_set_endpoint(struct soap*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_flush_raw(struct soap*, const char*, size_t); SOAP_FMAC1 int SOAP_FMAC2 soap_flush(struct soap*); SOAP_FMAC1 soap_wchar SOAP_FMAC2 soap_get(struct soap*); SOAP_FMAC1 soap_wchar SOAP_FMAC2 soap_getchar(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_tag_cmp(const char*, const char*); SOAP_FMAC1 void SOAP_FMAC2 soap_set_fault(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_sender_fault(struct soap*, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_sender_fault_subcode(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_receiver_fault(struct soap*, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_receiver_fault_subcode(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_set_sender_error(struct soap*, const char*, const char*, int); SOAP_FMAC1 int SOAP_FMAC2 soap_set_receiver_error(struct soap*, const char*, const char*, int); SOAP_FMAC1 int SOAP_FMAC2 soap_send_raw(struct soap*, const char*, size_t); SOAP_FMAC1 int SOAP_FMAC2 soap_recv_raw(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_recv(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_send(struct soap*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_send2(struct soap*, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_send3(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_pututf8(struct soap*, unsigned long); SOAP_FMAC1 soap_wchar SOAP_FMAC2 soap_getutf8(struct soap*); SOAP_FMAC1 size_t SOAP_FMAC2 soap_utf8len(const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_putbase64(struct soap*, const unsigned char*, int); SOAP_FMAC1 unsigned char* SOAP_FMAC2 soap_getbase64(struct soap*, int*, int); SOAP_FMAC1 int SOAP_FMAC2 soap_puthex(struct soap*, const unsigned char*, int); SOAP_FMAC1 unsigned char* SOAP_FMAC2 soap_gethex(struct soap*, int*); #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_xop_forward(struct soap*, unsigned char**, int*, char**, char**, char**); SOAP_FMAC1 int SOAP_FMAC2 soap_attachment_forward(struct soap*, unsigned char**, int*, char**, char**, char**); #endif SOAP_FMAC1 int SOAP_FMAC2 soap_pointer_lookup(struct soap*, const void *p, int t, struct soap_plist**); SOAP_FMAC1 int SOAP_FMAC2 soap_pointer_enter(struct soap*, const void *p, const void *a, int n, int t, struct soap_plist**); SOAP_FMAC1 int SOAP_FMAC2 soap_array_pointer_lookup(struct soap*, const void *p, const void *a, int n, int t, struct soap_plist**); #ifndef WITH_NOIDREF SOAP_FMAC1 int SOAP_FMAC2 soap_pointer_lookup_id(struct soap*, void *p, int t, struct soap_plist**); SOAP_FMAC1 int SOAP_FMAC2 soap_embed(struct soap *soap, const void *p, const void *a, int n, int type); SOAP_FMAC1 struct soap_ilist* SOAP_FMAC2 soap_lookup(struct soap*, const char*); SOAP_FMAC1 struct soap_ilist* SOAP_FMAC2 soap_enter(struct soap*, const char*, int, size_t); SOAP_FMAC1 int SOAP_FMAC2 soap_resolve(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_embedded(struct soap*, const void *p, int t); SOAP_FMAC1 int SOAP_FMAC2 soap_reference(struct soap*, const void *p, int t); SOAP_FMAC1 int SOAP_FMAC2 soap_array_reference(struct soap*, const void *p, const void *a, int n, int t); SOAP_FMAC1 int SOAP_FMAC2 soap_embedded_id(struct soap*, int id, const void *p, int t); SOAP_FMAC1 int SOAP_FMAC2 soap_is_embedded(struct soap*, struct soap_plist*); SOAP_FMAC1 int SOAP_FMAC2 soap_is_single(struct soap*, struct soap_plist*); SOAP_FMAC1 void SOAP_FMAC2 soap_set_embedded(struct soap*, struct soap_plist*); #endif SOAP_FMAC1 int SOAP_FMAC2 soap_check_and_mark(struct soap *soap, const void *p, int t, char **mark); SOAP_FMAC1 void * SOAP_FMAC2 soap_mark_lookup(struct soap *soap, const void *p, int t, struct soap_plist **pp, char **mark); SOAP_FMAC1 int SOAP_FMAC2 soap_mark_cycle(struct soap *soap, struct soap_plist *pp); SOAP_FMAC1 void SOAP_FMAC2 soap_mark_dup(struct soap *soap, void *a, struct soap_plist *pp); SOAP_FMAC1 void SOAP_FMAC2 soap_unmark(struct soap *soap, char *mark); SOAP_FMAC1 int SOAP_FMAC2 soap_begin_count(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_end_count(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_begin_send(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_end_send(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_end_send_flush(struct soap*); SOAP_FMAC1 const struct soap_code_map* SOAP_FMAC2 soap_code(const struct soap_code_map*, const char*); SOAP_FMAC1 LONG64 SOAP_FMAC2 soap_code_int(const struct soap_code_map*, const char*, LONG64); SOAP_FMAC1 const char* SOAP_FMAC2 soap_code_str(const struct soap_code_map*, long); SOAP_FMAC1 LONG64 SOAP_FMAC2 soap_code_bits(const struct soap_code_map*, const char*); SOAP_FMAC1 const char* SOAP_FMAC2 soap_code_list(struct soap*, const struct soap_code_map*, long); SOAP_FMAC1 int SOAP_FMAC2 soap_getline(struct soap*, char*, int); SOAP_FMAC1 int SOAP_FMAC2 soap_begin_serve(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_begin_recv(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_end_recv(struct soap*); SOAP_FMAC1 void* SOAP_FMAC2 soap_malloc(struct soap*, size_t); SOAP_FMAC1 void SOAP_FMAC2 soap_dealloc(struct soap*, void*); SOAP_FMAC1 struct soap_clist * SOAP_FMAC2 soap_link(struct soap*, void*, int, int, int (*fdelete)(struct soap_clist*)); SOAP_FMAC1 int SOAP_FMAC2 soap_unlink(struct soap*, const void*); SOAP_FMAC1 void SOAP_FMAC2 soap_free_temp(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_del(struct soap*); SOAP_FMAC1 void* SOAP_FMAC2 soap_track_malloc(struct soap*, const char*, int, size_t); SOAP_FMAC1 void SOAP_FMAC2 soap_track_free(struct soap*, const char*, int, void*); #ifndef WITH_NOIDREF SOAP_FMAC1 int SOAP_FMAC2 soap_lookup_type(struct soap*, const char *id); SOAP_FMAC1 short SOAP_FMAC2 soap_begin_shaky(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_end_shaky(struct soap*, short); SOAP_FMAC1 void* SOAP_FMAC2 soap_id_lookup(struct soap*, const char *id, void **p, int t, size_t n, unsigned int k, int (*fbase)(int, int)); SOAP_FMAC1 void* SOAP_FMAC2 soap_id_forward(struct soap*, const char *id, void *p, size_t i, int t, int tt, size_t n, unsigned int k, void(*finsert)(struct soap*, int, int, void*, size_t, const void*, void**), int (*fbase)(int, int)); SOAP_FMAC1 int SOAP_FMAC2 soap_id_nullify(struct soap*, const char*); #endif SOAP_FMAC1 void* SOAP_FMAC2 soap_id_enter(struct soap*, const char *id, void *p, int t, size_t n, const char *type, const char *arrayType, void *(*finstantiate)(struct soap*, int, const char*, const char*, size_t*), int (*fbase)(int, int)); SOAP_FMAC1 void** SOAP_FMAC2 soap_id_smart(struct soap *soap, const char*, int, size_t); SOAP_FMAC1 size_t SOAP_FMAC2 soap_size(const int *, int); SOAP_FMAC1 size_t SOAP_FMAC2 soap_getsizes(const char *, int *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_getoffsets(const char *, const int *, int *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_getposition(const char *, int *); SOAP_FMAC1 char* SOAP_FMAC2 soap_putsizesoffsets(struct soap*, const char *, const int *, const int *, int); SOAP_FMAC1 char* SOAP_FMAC2 soap_putoffsets(struct soap*, const int *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_closesock(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_force_closesock(struct soap*); SOAP_FMAC1 struct soap *SOAP_FMAC2 soap_versioning(soap_new)(soap_mode, soap_mode); SOAP_FMAC1 void SOAP_FMAC2 soap_free(struct soap*); SOAP_FMAC1 struct soap *SOAP_FMAC2 soap_copy(const struct soap*); SOAP_FMAC1 struct soap *SOAP_FMAC2 soap_copy_context(struct soap*, const struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_copy_stream(struct soap*, struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_free_stream(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_versioning(soap_init)(struct soap*, soap_mode, soap_mode); SOAP_FMAC1 void SOAP_FMAC2 soap_initialize(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_done(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_cleanup(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_begin(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_end(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_delete(struct soap*, void*); SOAP_FMAC1 void SOAP_FMAC2 soap_delegate_deletion(struct soap*, struct soap*); /* API functions available with DEBUG or SOAP_DEBUG defined: */ SOAP_FMAC1 void SOAP_FMAC2 soap_set_recv_logfile(struct soap*, const char*); SOAP_FMAC1 void SOAP_FMAC2 soap_set_sent_logfile(struct soap*, const char*); SOAP_FMAC1 void SOAP_FMAC2 soap_set_test_logfile(struct soap*, const char*); SOAP_FMAC1 void SOAP_FMAC2 soap_close_logfiles(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_open_logfile(struct soap*, int); /* */ SOAP_FMAC1 const char* SOAP_FMAC2 soap_value(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_match_tag(struct soap*, const char*, const char *); SOAP_FMAC1 int SOAP_FMAC2 soap_match_array(struct soap*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_element(struct soap*, const char*, int, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_element_begin_out(struct soap*, const char *tag, int id, const char *type); SOAP_FMAC1 int SOAP_FMAC2 soap_array_begin_out(struct soap*, const char *tag, int id, const char *type, const char *offset); SOAP_FMAC1 int SOAP_FMAC2 soap_element_ref(struct soap*, const char *tag, int id, int href); SOAP_FMAC1 int SOAP_FMAC2 soap_element_href(struct soap*, const char *tag, int id, const char *ref, const char *val); SOAP_FMAC1 int SOAP_FMAC2 soap_element_null(struct soap*, const char *tag, int id, const char *type); SOAP_FMAC1 int SOAP_FMAC2 soap_element_nil(struct soap*, const char *tag); SOAP_FMAC1 int SOAP_FMAC2 soap_element_id(struct soap*, const char *tag, int id, const void *p, const void *a, int n, const char *type, int t, char **mark); SOAP_FMAC1 int SOAP_FMAC2 soap_element_result(struct soap*, const char *tag); SOAP_FMAC1 void SOAP_FMAC2 soap_check_result(struct soap*, const char *tag); SOAP_FMAC1 int SOAP_FMAC2 soap_element_end_out(struct soap*, const char *tag); SOAP_FMAC1 int SOAP_FMAC2 soap_element_start_end_out(struct soap*, const char *tag); SOAP_FMAC1 int SOAP_FMAC2 soap_attribute(struct soap*, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_element_begin_in(struct soap*, const char *tag, int nillable, const char *type); SOAP_FMAC1 int SOAP_FMAC2 soap_element_end_in(struct soap*, const char *tag); SOAP_FMAC1 int SOAP_FMAC2 soap_peek_element(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_retry(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_revert(struct soap*); SOAP_FMAC1 void* SOAP_FMAC2 soap_memdup(struct soap*, const void*, size_t); SOAP_FMAC1 char* SOAP_FMAC2 soap_strdup(struct soap*, const char*); SOAP_FMAC1 wchar_t* SOAP_FMAC2 soap_wstrdup(struct soap*, const wchar_t*); SOAP_FMAC1 char* SOAP_FMAC2 soap_strtrim(struct soap*, char*); SOAP_FMAC1 wchar_t* SOAP_FMAC2 soap_wstrtrim(struct soap*, wchar_t*); SOAP_FMAC1 const char * SOAP_FMAC2 soap_tagsearch(const char *big, const char *little); SOAP_FMAC1 int SOAP_FMAC2 soap_string_out(struct soap*, const char *s, int flag); SOAP_FMAC1 char* SOAP_FMAC2 soap_string_in(struct soap*, int, long, long, const char*); #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_wstring_out(struct soap*, const wchar_t *s, int flag); SOAP_FMAC1 wchar_t* SOAP_FMAC2 soap_wstring_in(struct soap*, int, long, long, const char*); #endif SOAP_FMAC1 int SOAP_FMAC2 soap_match_namespace(struct soap*, const char *, const char*, size_t n1, size_t n2); SOAP_FMAC1 void SOAP_FMAC2 soap_set_version(struct soap*, short); SOAP_FMAC1 void SOAP_FMAC2 soap_get_version(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_set_namespaces(struct soap*, const struct Namespace*); SOAP_FMAC1 void SOAP_FMAC2 soap_set_local_namespaces(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_pop_namespace(struct soap*); SOAP_FMAC1 struct soap_nlist* SOAP_FMAC2 soap_push_namespace(struct soap*, const char *,const char *); SOAP_FMAC1 const char* SOAP_FMAC2 soap_current_namespace(struct soap *soap, const char *tag); SOAP_FMAC1 struct soap_nlist* SOAP_FMAC2 soap_lookup_ns(struct soap *soap, const char *tag, size_t n); SOAP_FMAC1 int SOAP_FMAC2 soap_store_lab(struct soap*, const char*, size_t); SOAP_FMAC1 int SOAP_FMAC2 soap_append_lab(struct soap*, const char*, size_t); SOAP_FMAC1 struct soap_blist* SOAP_FMAC2 soap_new_block(struct soap*); SOAP_FMAC1 void* SOAP_FMAC2 soap_push_block(struct soap*, struct soap_blist*, size_t); SOAP_FMAC1 void SOAP_FMAC2 soap_pop_block(struct soap*, struct soap_blist*); SOAP_FMAC1 size_t SOAP_FMAC2 soap_size_block(struct soap*, struct soap_blist*, size_t); SOAP_FMAC1 char* SOAP_FMAC2 soap_first_block(struct soap*, struct soap_blist*); SOAP_FMAC1 char* SOAP_FMAC2 soap_next_block(struct soap*, struct soap_blist*); SOAP_FMAC1 size_t SOAP_FMAC2 soap_block_size(struct soap*, struct soap_blist*); SOAP_FMAC1 char* SOAP_FMAC2 soap_save_block(struct soap*, struct soap_blist*, char*, int); SOAP_FMAC1 void SOAP_FMAC2 soap_end_block(struct soap*, struct soap_blist*); SOAP_FMAC1 void SOAP_FMAC2 soap_update_pointers(struct soap *soap, const char *dst, const char *src, size_t len); SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_begin_out(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_end_out(struct soap*); SOAP_FMAC1 char * SOAP_FMAC2 soap_get_http_body(struct soap*, size_t *len); SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_begin_in(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_end_in(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_body_begin_out(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_body_end_out(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_body_begin_in(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_body_end_in(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_recv_header(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_response(struct soap*, int); SOAP_FMAC1 int SOAP_FMAC2 soap_send_empty_response(struct soap*, int status); SOAP_FMAC1 int SOAP_FMAC2 soap_recv_empty_response(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_send_fault(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_recv_fault(struct soap*, int check); #ifndef WITH_NOSTDLIB SOAP_FMAC1 void SOAP_FMAC2 soap_print_fault(struct soap*, FILE*); SOAP_FMAC1 void SOAP_FMAC2 soap_print_fault_location(struct soap*, FILE*); # ifndef WITH_LEAN # ifndef WITH_COMPAT # ifdef __cplusplus SOAP_FMAC1 void SOAP_FMAC2 soap_stream_fault(struct soap*, std::ostream&); # endif # endif SOAP_FMAC1 char* SOAP_FMAC2 soap_sprint_fault(struct soap*, char*, size_t); # endif #endif SOAP_FMAC1 int SOAP_FMAC2 soap_s2byte(struct soap*, const char*, char*); SOAP_FMAC1 int SOAP_FMAC2 soap_s2short(struct soap*, const char*, short*); SOAP_FMAC1 int SOAP_FMAC2 soap_s2int(struct soap*, const char*, int*); SOAP_FMAC1 int SOAP_FMAC2 soap_s2long(struct soap*, const char*, long*); SOAP_FMAC1 int SOAP_FMAC2 soap_s2LONG64(struct soap*, const char*, LONG64*); SOAP_FMAC1 int SOAP_FMAC2 soap_s2float(struct soap*, const char*, float*); SOAP_FMAC1 int SOAP_FMAC2 soap_s2double(struct soap*, const char*, double*); SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedByte(struct soap*, const char*, unsigned char*); SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedShort(struct soap*, const char*, unsigned short*); SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedInt(struct soap*, const char*, unsigned int*); SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedLong(struct soap*, const char*, unsigned long*); SOAP_FMAC1 int SOAP_FMAC2 soap_s2ULONG64(struct soap*, const char*, ULONG64*); SOAP_FMAC1 int SOAP_FMAC2 soap_s2string(struct soap*, const char*, char**, long minlen, long maxlen); SOAP_FMAC1 int SOAP_FMAC2 soap_s2QName(struct soap*, const char*, char**, long minlen, long maxlen); #ifndef WITH_COMPAT #ifdef __cplusplus SOAP_FMAC1 int SOAP_FMAC2 soap_s2std__QName(struct soap*, const char*, std::string*, long minlen, long maxlen); SOAP_FMAC1 int SOAP_FMAC2 soap_s2std__string(struct soap*, const char*, std::string*, long minlen, long maxlen); SOAP_FMAC1 int SOAP_FMAC2 soap_s2std__wstring(struct soap*, const char*, std::wstring*, long minlen, long maxlen); #endif #endif #if !defined(WITH_LEAN) || defined(WITH_NTLM) SOAP_FMAC1 int SOAP_FMAC2 soap_s2wchar(struct soap*, const char*, wchar_t**, long minlen, long maxlen); SOAP_FMAC1 int SOAP_FMAC2 soap_s2dateTime(struct soap*, const char*, time_t*); SOAP_FMAC1 char* SOAP_FMAC2 soap_s2base64(struct soap*, const unsigned char*, char*, int); SOAP_FMAC1 char* SOAP_FMAC2 soap_s2hex(struct soap*, const unsigned char*, char*, int); #endif SOAP_FMAC1 const char* SOAP_FMAC2 soap_byte2s(struct soap*, char); SOAP_FMAC1 const char* SOAP_FMAC2 soap_short2s(struct soap*, short); SOAP_FMAC1 const char* SOAP_FMAC2 soap_int2s(struct soap*, int); SOAP_FMAC1 const char* SOAP_FMAC2 soap_long2s(struct soap*, long); SOAP_FMAC1 const char* SOAP_FMAC2 soap_LONG642s(struct soap*, LONG64); SOAP_FMAC1 const char* SOAP_FMAC2 soap_float2s(struct soap*, float); SOAP_FMAC1 const char* SOAP_FMAC2 soap_double2s(struct soap*, double); SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedByte2s(struct soap*, unsigned char); SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedShort2s(struct soap*, unsigned short); SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedInt2s(struct soap*, unsigned int); SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedLong2s(struct soap*, unsigned long); SOAP_FMAC1 const char* SOAP_FMAC2 soap_ULONG642s(struct soap*, ULONG64); SOAP_FMAC1 const char* SOAP_FMAC2 soap_QName2s(struct soap*, const char*); #if !defined(WITH_LEAN) || defined(WITH_NTLM) SOAP_FMAC1 const char* SOAP_FMAC2 soap_wchar2s(struct soap*, const wchar_t*); SOAP_FMAC1 const char* SOAP_FMAC2 soap_dateTime2s(struct soap*, time_t); SOAP_FMAC1 const char* SOAP_FMAC2 soap_base642s(struct soap*, const char*, char*, size_t, int*); SOAP_FMAC1 const char* SOAP_FMAC2 soap_hex2s(struct soap*, const char*, char*, size_t, int*); #endif SOAP_FMAC1 int* SOAP_FMAC2 soap_inint(struct soap*, const char *tag, int *p, const char *, int); SOAP_FMAC1 char* SOAP_FMAC2 soap_inbyte(struct soap*, const char *tag, char *p, const char *, int); SOAP_FMAC1 long* SOAP_FMAC2 soap_inlong(struct soap*, const char *tag, long *p, const char *, int); SOAP_FMAC1 LONG64* SOAP_FMAC2 soap_inLONG64(struct soap*, const char *tag, LONG64 *p, const char *, int); SOAP_FMAC1 short* SOAP_FMAC2 soap_inshort(struct soap*, const char *tag, short *p, const char *, int); SOAP_FMAC1 float* SOAP_FMAC2 soap_infloat(struct soap*, const char *tag, float *p, const char *, int); SOAP_FMAC1 double* SOAP_FMAC2 soap_indouble(struct soap*, const char *tag, double *p, const char *, int); SOAP_FMAC1 unsigned char* SOAP_FMAC2 soap_inunsignedByte(struct soap*, const char *tag, unsigned char *p, const char *, int); SOAP_FMAC1 unsigned short* SOAP_FMAC2 soap_inunsignedShort(struct soap*, const char *tag, unsigned short *p, const char *, int); SOAP_FMAC1 unsigned int* SOAP_FMAC2 soap_inunsignedInt(struct soap*, const char *tag, unsigned int *p, const char *, int); SOAP_FMAC1 unsigned long* SOAP_FMAC2 soap_inunsignedLong(struct soap*, const char *tag, unsigned long *p, const char *, int); SOAP_FMAC1 ULONG64* SOAP_FMAC2 soap_inULONG64(struct soap*, const char *tag, ULONG64 *p, const char *, int); SOAP_FMAC1 char** SOAP_FMAC2 soap_instring(struct soap*, const char *tag, char **p, const char *, int, int, long, long, const char*); SOAP_FMAC1 char** SOAP_FMAC2 soap_inliteral(struct soap*, const char *tag, char **p); #ifndef WITH_LEAN SOAP_FMAC1 time_t* SOAP_FMAC2 soap_indateTime(struct soap*, const char *tag, time_t *p, const char *, int); SOAP_FMAC1 time_t SOAP_FMAC2 soap_timegm(struct tm*); #endif #ifndef WITH_LEANER SOAP_FMAC1 wchar_t** SOAP_FMAC2 soap_inwstring(struct soap*, const char *tag, wchar_t **p, const char *, int, long, long, const char*); SOAP_FMAC1 wchar_t** SOAP_FMAC2 soap_inwliteral(struct soap*, const char *tag, wchar_t **p); #endif SOAP_FMAC1 int SOAP_FMAC2 soap_outbyte(struct soap*, const char *tag, int id, const char *p, const char *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_outshort(struct soap*, const char *tag, int id, const short *p, const char *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_outint(struct soap*, const char *tag, int id, const int *p, const char *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_outlong(struct soap*, const char *tag, int id, const long *p, const char *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_outLONG64(struct soap*, const char *tag, int id, const LONG64 *p, const char *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_outfloat(struct soap*, const char *tag, int id, const float *p, const char *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_outdouble(struct soap*, const char *tag, int id, const double *p, const char *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_outunsignedByte(struct soap*, const char *tag, int id, const unsigned char *p, const char *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_outunsignedShort(struct soap*, const char *tag, int id, const unsigned short *p, const char *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_outunsignedInt(struct soap*, const char *tag, int id, const unsigned int *p, const char *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_outunsignedLong(struct soap*, const char *tag, int id, const unsigned long *p, const char *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_outULONG64(struct soap*, const char *tag, int id, const ULONG64 *p, const char *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_outstring(struct soap*, const char *tag, int id, char *const*p, const char *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_outliteral(struct soap*, const char *tag, char *const*p, const char *type); #ifndef WITH_LEAN SOAP_FMAC1 int SOAP_FMAC2 soap_outdateTime(struct soap*, const char *tag, int id, const time_t *p, const char *, int); #endif #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_outwstring(struct soap*, const char *tag, int id, wchar_t *const*p, const char *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_outwliteral(struct soap*, const char *tag, wchar_t *const*p, const char *type); #endif #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_attachment(struct soap *, const char*, int, const void*, const void*, int, const char*, const char*, const char*, const char*, int); SOAP_FMAC1 int SOAP_FMAC2 soap_move(struct soap*, size_t); SOAP_FMAC1 size_t SOAP_FMAC2 soap_tell(struct soap*); SOAP_FMAC1 char* SOAP_FMAC2 soap_dime_option(struct soap*, unsigned short, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_getdimehdr(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_getdime(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_putdimehdr(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_putdime(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_getmimehdr(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_getmime(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_putmimehdr(struct soap*, struct soap_multipart*); SOAP_FMAC1 int SOAP_FMAC2 soap_putmime(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_set_dime(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_set_mime(struct soap*, const char *boundary, const char *start); SOAP_FMAC1 void SOAP_FMAC2 soap_clr_dime(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_clr_mime(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_set_dime_attachment(struct soap*, char *ptr, size_t size, const char *type, const char *id, unsigned short optype, const char *option); SOAP_FMAC1 int SOAP_FMAC2 soap_set_mime_attachment(struct soap*, char *ptr, size_t size, enum soap_mime_encoding encoding, const char *type, const char *id, const char *location, const char *description); SOAP_FMAC1 void SOAP_FMAC2 soap_post_check_mime_attachments(struct soap *soap); SOAP_FMAC1 int SOAP_FMAC2 soap_check_mime_attachments(struct soap *soap); SOAP_FMAC1 struct soap_multipart* SOAP_FMAC2 soap_get_mime_attachment(struct soap *soap, void *handle); SOAP_FMAC1 int SOAP_FMAC2 soap_match_cid(struct soap*, const char*, const char*); #endif SOAP_FMAC1 int SOAP_FMAC2 soap_register_plugin_arg(struct soap*, int (*fcreate)(struct soap*, struct soap_plugin*, void*), void*); SOAP_FMAC1 void* SOAP_FMAC2 soap_lookup_plugin(struct soap*, const char*); SOAP_FMAC1 const char* SOAP_FMAC2 soap_attr_value(struct soap *soap, const char *name, int flag); SOAP_FMAC1 int SOAP_FMAC2 soap_set_attr(struct soap *soap, const char *name, const char *value, int flag); SOAP_FMAC1 void SOAP_FMAC2 soap_clr_attr(struct soap *soap); SOAP_FMAC1 const char* SOAP_FMAC2 soap_url(struct soap *soap, const char*, const char*); SOAP_FMAC1 size_t SOAP_FMAC2 soap_encode_url(const char*, char*, size_t); SOAP_FMAC1 const char* SOAP_FMAC2 soap_encode_url_string(struct soap*, const char*); #ifdef WITH_COOKIES SOAP_FMAC1 void SOAP_FMAC2 soap_getcookies(struct soap *soap, const char *val); SOAP_FMAC1 extern struct soap_cookie* SOAP_FMAC2 soap_set_cookie(struct soap*, const char*, const char*, const char*, const char*); SOAP_FMAC1 extern struct soap_cookie* SOAP_FMAC2 soap_cookie(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 extern char* SOAP_FMAC2 soap_cookie_value(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 extern char* SOAP_FMAC2 soap_env_cookie_value(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 extern time_t SOAP_FMAC2 soap_cookie_expire(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 extern int SOAP_FMAC2 soap_set_cookie_expire(struct soap*, const char*, long, const char*, const char*); SOAP_FMAC1 extern int SOAP_FMAC2 soap_set_cookie_session(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 extern int SOAP_FMAC2 soap_clr_cookie_session(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 extern void SOAP_FMAC2 soap_clr_cookie(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 extern int SOAP_FMAC2 soap_getenv_cookies(struct soap*); SOAP_FMAC1 extern struct soap_cookie* SOAP_FMAC2 soap_copy_cookies(struct soap*, const struct soap*); SOAP_FMAC1 extern void SOAP_FMAC2 soap_free_cookies(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_putsetcookies(struct soap *soap); SOAP_FMAC1 int SOAP_FMAC2 soap_putcookies(struct soap *soap, const char *domain, const char *path, int secure); #endif #ifdef __cplusplus } /* extern "C" */ #endif #ifdef __cplusplus /* C++ templates (for generated C++ only, not needed nor used in generated C code) */ template struct soap_block { static T *push(struct soap *soap, struct soap_blist *b) { if (!b) b = soap->blist; if (!b) return NULL; T *p = (T*)soap_push_block(soap, b, sizeof(T)); if (p) SOAP_PLACEMENT_NEW(p, T); return p; } static void pop(struct soap *soap, struct soap_blist *b) { if (!b) b = soap->blist; if (!b || !b->head) return; ((T*)(b->head + 1))->T::~T(); soap_pop_block(soap, b); } static void save(struct soap *soap, struct soap_blist *b, T *p) { if (!b) b = soap->blist; for (T *q = (T*)soap_first_block(soap, b); q; q = (T*)soap_next_block(soap, b)) { soap_update_pointers(soap, (const char*)p, (const char*)q, sizeof(T)); *p++ = *q; q->T::~T(); } } static void end(struct soap *soap, struct soap_blist *b) { if (!b) b = soap->blist; for (T *p = (T*)soap_first_block(soap, b); p; p = (T*)soap_next_block(soap, b)) p->T::~T(); soap_end_block(soap, b); } }; #endif #endif /* STDSOAP_H */ gsoap-2.8.28/gsoap/import/0000755000175000017500000000000012653650146014717 5ustar ellertellertgsoap-2.8.28/gsoap/import/stllist.h0000644000175000017500000000454012653650146016571 0ustar ellertellert/* stllist.h Use #import "stllist.h" in a gSOAP header file to enable STL lists. Use soapcpp2 option -Ipath:path:... to specify the path(s) for #import gSOAP XML Web services tools Copyright (C) 2000-2005, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under one of the following licenses: GPL, the gSOAP public license, or Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2005 Robert A. van Engelen, Genivia inc. All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include template class std::list; gsoap-2.8.28/gsoap/import/ds2.h0000644000175000017500000004612212653650146015565 0ustar ellertellert/* ds2.h Generated with: wsdl2h -cuxy -o ds.h -t WS/WS-typemap.dat WS/ds.xsd - Removed //gsoapopt - Added //gsoap ds schema import: http://www.w3.org/2000/09/xmldsig# */ /******************************************************************************\ * * * http://www.w3.org/2000/09/xmldsig# * * * \******************************************************************************/ /******************************************************************************\ * * * Import * * * \******************************************************************************/ /******************************************************************************\ * * * Schema Namespaces * * * \******************************************************************************/ //gsoap ds schema import: http://www.w3.org/2000/09/xmldsig# //gsoap ds schema elementForm: qualified //gsoap ds schema attributeForm: unqualified /******************************************************************************\ * * * Schema Types * * * \******************************************************************************/ /// Imported complexType "http://www.w3.org/2000/09/xmldsig#":SignatureType from typemap WS/WS-typemap.dat. typedef struct ds__SignatureType { struct ds__SignedInfoType* SignedInfo; char* SignatureValue; struct ds__KeyInfoType* KeyInfo; @char* Id; } ds__SignatureType; /// Imported complexType "http://www.w3.org/2000/09/xmldsig#":SignatureValueType from typemap WS/WS-typemap.dat. /// complexType definition intentionally left blank. /// Typedef synonym for struct ds__SignedInfoType. typedef struct ds__SignedInfoType ds__SignedInfoType; /// Typedef synonym for struct ds__CanonicalizationMethodType. typedef struct ds__CanonicalizationMethodType ds__CanonicalizationMethodType; /// Typedef synonym for struct ds__SignatureMethodType. typedef struct ds__SignatureMethodType ds__SignatureMethodType; /// Typedef synonym for struct ds__ReferenceType. typedef struct ds__ReferenceType ds__ReferenceType; /// Typedef synonym for struct ds__TransformsType. typedef struct ds__TransformsType ds__TransformsType; /// Imported complexType "http://www.w3.org/2000/09/xmldsig#":TransformType from typemap WS/WS-typemap.dat. #import "c14n.h" typedef struct ds__TransformType { _c14n__InclusiveNamespaces* c14n__InclusiveNamespaces; _XML __any; @char* Algorithm; } ds__TransformType; /// Typedef synonym for struct ds__DigestMethodType. typedef struct ds__DigestMethodType ds__DigestMethodType; /// Imported complexType "http://www.w3.org/2000/09/xmldsig#":KeyInfoType from typemap WS/WS-typemap.dat. typedef struct ds__KeyInfoType { char* KeyName; struct ds__KeyValueType* KeyValue; struct ds__RetrievalMethodType* RetrievalMethod; struct ds__X509DataType* X509Data; struct _wsse2__SecurityTokenReference* wsse2__SecurityTokenReference; @char* Id; } ds__KeyInfoType; /// Typedef synonym for struct ds__KeyValueType. typedef struct ds__KeyValueType ds__KeyValueType; /// Typedef synonym for struct ds__RetrievalMethodType. typedef struct ds__RetrievalMethodType ds__RetrievalMethodType; /// Typedef synonym for struct ds__X509DataType. typedef struct ds__X509DataType ds__X509DataType; /// Typedef synonym for struct ds__X509IssuerSerialType. typedef struct ds__X509IssuerSerialType ds__X509IssuerSerialType; /// Imported complexType "http://www.w3.org/2000/09/xmldsig#":PGPDataType from typemap WS/WS-typemap.dat. /// complexType definition intentionally left blank. /// Imported complexType "http://www.w3.org/2000/09/xmldsig#":SPKIDataType from typemap WS/WS-typemap.dat. /// complexType definition intentionally left blank. /// Imported complexType "http://www.w3.org/2000/09/xmldsig#":ObjectType from typemap WS/WS-typemap.dat. /// complexType definition intentionally left blank. /// Imported complexType "http://www.w3.org/2000/09/xmldsig#":ManifestType from typemap WS/WS-typemap.dat. /// complexType definition intentionally left blank. /// Imported complexType "http://www.w3.org/2000/09/xmldsig#":SignaturePropertiesType from typemap WS/WS-typemap.dat. /// complexType definition intentionally left blank. /// Imported complexType "http://www.w3.org/2000/09/xmldsig#":SignaturePropertyType from typemap WS/WS-typemap.dat. /// complexType definition intentionally left blank. /// Typedef synonym for struct ds__DSAKeyValueType. typedef struct ds__DSAKeyValueType ds__DSAKeyValueType; /// Typedef synonym for struct ds__RSAKeyValueType. typedef struct ds__RSAKeyValueType ds__RSAKeyValueType; /// Imported simpleType "http://www.w3.org/2000/09/xmldsig#":CryptoBinary from typemap WS/WS-typemap.dat. /// simpleType definition intentionally left blank. /// Imported simpleType "http://www.w3.org/2000/09/xmldsig#":DigestValueType from typemap WS/WS-typemap.dat. /// simpleType definition intentionally left blank. /// Imported simpleType "http://www.w3.org/2000/09/xmldsig#":HMACOutputLengthType from typemap WS/WS-typemap.dat. /// simpleType definition intentionally left blank. /// "http://www.w3.org/2000/09/xmldsig#":SignedInfoType is a complexType. struct ds__SignedInfoType { /// Element reference "http://www.w3.org/2000/09/xmldsig#":CanonicalizationMethod. struct ds__CanonicalizationMethodType* CanonicalizationMethod 1; ///< Required element. /// Element reference "http://www.w3.org/2000/09/xmldsig#":SignatureMethod. struct ds__SignatureMethodType* SignatureMethod 1; ///< Required element. /// Size of the dynamic array of struct ds__ReferenceType* is 0..unbounded int __sizeReference ; /// Pointer to array of struct ds__ReferenceType*. struct ds__ReferenceType* *Reference 1; /// Attribute Id of type xs:ID. @char* /*ID*/ Id 0; ///< Optional attribute. }; /// "http://www.w3.org/2000/09/xmldsig#":CanonicalizationMethodType is a complexType. struct ds__CanonicalizationMethodType { /// TODO: /// Schema extensibility is user-definable. /// Consult the protocol documentation to change and/or insert declarations. /// Use wsdl2h option -x to remove this element. /// Attribute Algorithm of type xs:anyURI. @char* /*URI*/ Algorithm 1; ///< Required attribute. /// Member declared in WS/WS-typemap.dat _c14n__InclusiveNamespaces* c14n__InclusiveNamespaces; }; /// "http://www.w3.org/2000/09/xmldsig#":SignatureMethodType is a complexType. struct ds__SignatureMethodType { /// Element HMACOutputLength of type "http://www.w3.org/2000/09/xmldsig#":HMACOutputLengthType. int* HMACOutputLength 0; ///< Optional element. /// TODO: /// Schema extensibility is user-definable. /// Consult the protocol documentation to change and/or insert declarations. /// Use wsdl2h option -x to remove this element. /// Attribute Algorithm of type xs:anyURI. @char* /*URI*/ Algorithm 1; ///< Required attribute. }; /// "http://www.w3.org/2000/09/xmldsig#":ReferenceType is a complexType. struct ds__ReferenceType { /// Element reference "http://www.w3.org/2000/09/xmldsig#":Transforms. struct ds__TransformsType* Transforms 0; ///< Optional element. /// Element reference "http://www.w3.org/2000/09/xmldsig#":DigestMethod. struct ds__DigestMethodType* DigestMethod 1; ///< Required element. /// Element reference "http://www.w3.org/2000/09/xmldsig#":DigestValue. char* /*base64*/ DigestValue 1; ///< Required element. /// Attribute Id of type xs:ID. @char* /*ID*/ Id 0; ///< Optional attribute. /// Attribute URI of type xs:anyURI. @char* /*URI*/ URI 0; ///< Optional attribute. /// Attribute Type of type xs:anyURI. @char* /*URI*/ Type 0; ///< Optional attribute. }; /// "http://www.w3.org/2000/09/xmldsig#":TransformsType is a complexType. struct ds__TransformsType { /// Size of the dynamic array of ds__TransformType is 0..unbounded int __sizeTransform ; /// Pointer to array of ds__TransformType. ds__TransformType *Transform 1; }; /// "http://www.w3.org/2000/09/xmldsig#":DigestMethodType is a complexType. struct ds__DigestMethodType { /// TODO: /// Schema extensibility is user-definable. /// Consult the protocol documentation to change and/or insert declarations. /// Use wsdl2h option -x to remove this element. /// Attribute Algorithm of type xs:anyURI. @char* /*URI*/ Algorithm 1; ///< Required attribute. }; /// "http://www.w3.org/2000/09/xmldsig#":KeyValueType is a complexType. struct ds__KeyValueType { /// CHOICE OF ELEMENTS /// Element reference "http://www.w3.org/2000/09/xmldsig#":DSAKeyValue. struct ds__DSAKeyValueType* DSAKeyValue 1; ///< Required element. /// Element reference "http://www.w3.org/2000/09/xmldsig#":RSAKeyValue. struct ds__RSAKeyValueType* RSAKeyValue 1; ///< Required element. /// TODO: /// Schema extensibility is user-definable. /// Consult the protocol documentation to change and/or insert declarations. /// Use wsdl2h option -x to remove this element. // END OF CHOICE }; /// "http://www.w3.org/2000/09/xmldsig#":RetrievalMethodType is a complexType. struct ds__RetrievalMethodType { /// Element reference "http://www.w3.org/2000/09/xmldsig#":Transforms. struct ds__TransformsType* Transforms 0; ///< Optional element. /// Attribute URI of type xs:anyURI. @char* /*URI*/ URI 0; ///< Optional attribute. /// Attribute Type of type xs:anyURI. @char* /*URI*/ Type 0; ///< Optional attribute. }; /// "http://www.w3.org/2000/09/xmldsig#":X509DataType is a complexType. struct ds__X509DataType { /// CHOICE OF ELEMENTS /// Element X509IssuerSerial of type "http://www.w3.org/2000/09/xmldsig#":X509IssuerSerialType. struct ds__X509IssuerSerialType* X509IssuerSerial 1; ///< Required element. /// Element X509SKI of type xs:base64Binary. char* /*base64*/ X509SKI 1; ///< Required element. /// Element X509SubjectName of type xs:string. char* X509SubjectName 1; ///< Required element. /// Element X509Certificate of type xs:base64Binary. char* /*base64*/ X509Certificate 1; ///< Required element. /// Element X509CRL of type xs:base64Binary. char* /*base64*/ X509CRL 1; ///< Required element. /// TODO: /// Schema extensibility is user-definable. /// Consult the protocol documentation to change and/or insert declarations. /// Use wsdl2h option -x to remove this element. // END OF CHOICE }; /// "http://www.w3.org/2000/09/xmldsig#":X509IssuerSerialType is a complexType. struct ds__X509IssuerSerialType { /// Element X509IssuerName of type xs:string. char* X509IssuerName 1; ///< Required element. /// Element X509SerialNumber of type xs:integer. char* X509SerialNumber 1; ///< Required element. }; /// "http://www.w3.org/2000/09/xmldsig#":DSAKeyValueType is a complexType. struct ds__DSAKeyValueType { /// Element G of type "http://www.w3.org/2000/09/xmldsig#":CryptoBinary. char* /*base64*/ G 0; ///< Optional element. /// Element Y of type "http://www.w3.org/2000/09/xmldsig#":CryptoBinary. char* /*base64*/ Y 1; ///< Required element. /// Element J of type "http://www.w3.org/2000/09/xmldsig#":CryptoBinary. char* /*base64*/ J 0; ///< Optional element. /// Element P of type "http://www.w3.org/2000/09/xmldsig#":CryptoBinary. char* /*base64*/ P 1; ///< Required element. /// Element Q of type "http://www.w3.org/2000/09/xmldsig#":CryptoBinary. char* /*base64*/ Q 1; ///< Required element. /// Element Seed of type "http://www.w3.org/2000/09/xmldsig#":CryptoBinary. char* /*base64*/ Seed 1; ///< Required element. /// Element PgenCounter of type "http://www.w3.org/2000/09/xmldsig#":CryptoBinary. char* /*base64*/ PgenCounter 1; ///< Required element. }; /// "http://www.w3.org/2000/09/xmldsig#":RSAKeyValueType is a complexType. struct ds__RSAKeyValueType { /// Element Modulus of type "http://www.w3.org/2000/09/xmldsig#":CryptoBinary. char* /*base64*/ Modulus 1; ///< Required element. /// Element Exponent of type "http://www.w3.org/2000/09/xmldsig#":CryptoBinary. char* /*base64*/ Exponent 1; ///< Required element. }; /// Element "http://www.w3.org/2000/09/xmldsig#":Signature of complexType "http://www.w3.org/2000/09/xmldsig#":SignatureType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":SignatureValue of complexType "http://www.w3.org/2000/09/xmldsig#":SignatureValueType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":SignedInfo of complexType "http://www.w3.org/2000/09/xmldsig#":SignedInfoType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":CanonicalizationMethod of complexType "http://www.w3.org/2000/09/xmldsig#":CanonicalizationMethodType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":SignatureMethod of complexType "http://www.w3.org/2000/09/xmldsig#":SignatureMethodType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":Reference of complexType "http://www.w3.org/2000/09/xmldsig#":ReferenceType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":Transforms of complexType "http://www.w3.org/2000/09/xmldsig#":TransformsType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":Transform of complexType "http://www.w3.org/2000/09/xmldsig#":TransformType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":DigestMethod of complexType "http://www.w3.org/2000/09/xmldsig#":DigestMethodType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":DigestValue of complexType "http://www.w3.org/2000/09/xmldsig#":DigestValueType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":KeyInfo of complexType "http://www.w3.org/2000/09/xmldsig#":KeyInfoType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":KeyName of complexType xs:string. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":MgmtData of complexType xs:string. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":KeyValue of complexType "http://www.w3.org/2000/09/xmldsig#":KeyValueType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":RetrievalMethod of complexType "http://www.w3.org/2000/09/xmldsig#":RetrievalMethodType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":X509Data of complexType "http://www.w3.org/2000/09/xmldsig#":X509DataType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":PGPData of complexType "http://www.w3.org/2000/09/xmldsig#":PGPDataType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":SPKIData of complexType "http://www.w3.org/2000/09/xmldsig#":SPKIDataType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":Object of complexType "http://www.w3.org/2000/09/xmldsig#":ObjectType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":Manifest of complexType "http://www.w3.org/2000/09/xmldsig#":ManifestType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":SignatureProperties of complexType "http://www.w3.org/2000/09/xmldsig#":SignaturePropertiesType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":SignatureProperty of complexType "http://www.w3.org/2000/09/xmldsig#":SignaturePropertyType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":DSAKeyValue of complexType "http://www.w3.org/2000/09/xmldsig#":DSAKeyValueType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":RSAKeyValue of complexType "http://www.w3.org/2000/09/xmldsig#":RSAKeyValueType. /// Note: use wsdl2h option -g to generate this global element declaration. /* End of ds.h */ gsoap-2.8.28/gsoap/import/wsse11.h0000644000175000017500000003117512653650146016222 0ustar ellertellert/* wsse.h 1.1 Generated with: wsdl2h -cegxy -o wsse.h -t WS/WS-typemap.dat WS/wsse.xsd - Removed //gsoapopt - Added //gsoap wsse schema import: http://docs.oasis-open.org/wss/oasis-wss-wssecurity-secext-1.1.xsd - Changed namespace to v1.1 - Added mutable SOAP_ENV__Header struct */ /******************************************************************************\ * * * http://docs.oasis-open.org/wss/oasis-wss-wssecurity-secext-1.1.xsd * * * \******************************************************************************/ /******************************************************************************\ * * * Import * * * \******************************************************************************/ #import "wsu.h" // wsu = /******************************************************************************\ * * * Schema Namespaces * * * \******************************************************************************/ //gsoap wsse schema import: http://docs.oasis-open.org/wss/oasis-wss-wssecurity-secext-1.1.xsd //gsoap wsse schema namespace2: http://docs.oasis-open.org/wss/oasis-wss-wssecurity-secext-1.0.xsd //gsoap wsse schema elementForm: qualified //gsoap wsse schema attributeForm: unqualified /******************************************************************************\ * * * Schema Types * * * \******************************************************************************/ /// Imported complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.1.xsd":AttributedString from typemap WS/WS-typemap.dat. /// @brief This type represents an element with arbitrary attributes. /// complexType definition intentionally left blank. /// Imported complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":PasswordString from typemap WS/WS-typemap.dat. /// @brief This type is used for password elements per Section 4.1. /// complexType definition intentionally left blank. /// Imported complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":EncodedString from typemap WS/WS-typemap.dat. /// @brief This type is used for elements containing stringified binary data. /// complexType definition intentionally left blank. /// Imported complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":UsernameTokenType from typemap WS/WS-typemap.dat. /// @brief This type represents a username token per Section 4.1 /// complexType definition intentionally left blank. /// Imported complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":BinarySecurityTokenType from typemap WS/WS-typemap.dat. /// @brief A security token that is encoded in binary /// complexType definition intentionally left blank. /// Imported complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":KeyIdentifierType from typemap WS/WS-typemap.dat. /// @brief A security token key identifier /// complexType definition intentionally left blank. /// Imported complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":ReferenceType from typemap WS/WS-typemap.dat. /// @brief This type represents a reference to an external security token. /// complexType definition intentionally left blank. /// Imported complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":EmbeddedType from typemap WS/WS-typemap.dat. /// @brief This type represents a reference to an embedded security token. /// complexType definition intentionally left blank. /// Imported complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":SecurityTokenReferenceType from typemap WS/WS-typemap.dat. /// @brief This type is used reference a security token. /// complexType definition intentionally left blank. /// Imported complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":SecurityHeaderType from typemap WS/WS-typemap.dat. /// @brief This complexType defines header block to use for security-relevant data directed at a specific SOAP actor. /// complexType definition intentionally left blank. /// Imported complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":TransformationParametersType from typemap WS/WS-typemap.dat. /// @brief This complexType defines a container for elements to be specified from any namespace as properties/parameters of a DSIG transformation. /// complexType definition intentionally left blank. /// Imported simpleType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":tUsage from typemap WS/WS-typemap.dat. /// @brief Typedef to allow a list of usages (as URIs). /// simpleType definition intentionally left blank. /// "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":FaultcodeEnum is a simpleType restriction of xs:QName. enum wsse__FaultcodeEnum { wsse__UnsupportedSecurityToken, ///< xs:QName value=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":UnsupportedSecurityToken" wsse__UnsupportedAlgorithm, ///< xs:QName value=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":UnsupportedAlgorithm" wsse__InvalidSecurity, ///< xs:QName value=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":InvalidSecurity" wsse__InvalidSecurityToken, ///< xs:QName value=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":InvalidSecurityToken" wsse__FailedAuthentication, ///< xs:QName value=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":FailedAuthentication" wsse__FailedCheck, ///< xs:QName value=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":FailedCheck" wsse__SecurityTokenUnavailable, ///< xs:QName value=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":SecurityTokenUnavailable" }; /// Typedef synonym for enum wsse__FaultcodeEnum. typedef enum wsse__FaultcodeEnum wsse__FaultcodeEnum; /// Element "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":UsernameToken of complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":UsernameTokenType. /// @brief This element defines the wsse:UsernameToken element per Section 4.1. /// Imported element _wsse__UsernameToken from typemap WS/WS-typemap.dat. typedef struct _wsse__UsernameToken { char* Username; struct _wsse__Password* Password; char* Nonce; char* wsu__Created; @char* wsu__Id; } _wsse__UsernameToken; /// Element "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":BinarySecurityToken of complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":BinarySecurityTokenType. /// @brief This element defines the wsse:BinarySecurityToken element per Section 4.2. /// Imported element _wsse__BinarySecurityToken from typemap WS/WS-typemap.dat. typedef struct _wsse__BinarySecurityToken { char* __item; @char* wsu__Id; @char* ValueType; @char* EncodingType; } _wsse__BinarySecurityToken; /// Element "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":Reference of complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":ReferenceType. /// @brief This element defines a security token reference /// Imported element _wsse__Reference from typemap WS/WS-typemap.dat. typedef struct _wsse__Reference { @char* URI; @char* ValueType; } _wsse__Reference; /// Element "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":Embedded of complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":EmbeddedType. /// @brief This element defines a security token embedded reference /// Imported element _wsse__Embedded from typemap WS/WS-typemap.dat. typedef struct _wsse__Embedded { /* Extensible with embedded tokens and assertions */ @char* wsu__Id; @char* ValueType; } _wsse__Embedded; /// Element "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":KeyIdentifier of complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":KeyIdentifierType. /// @brief This element defines a key identifier reference /// Imported element _wsse__KeyIdentifier from typemap WS/WS-typemap.dat. typedef struct _wsse__KeyIdentifier { char* __item; @char* wsu__Id; @char* ValueType; @char* EncodingType; } _wsse__KeyIdentifier; /// Element "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":SecurityTokenReference of complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":SecurityTokenReferenceType. /// @brief This element defines the wsse:SecurityTokenReference per Section 4.3. /// Imported element _wsse__SecurityTokenReference from typemap WS/WS-typemap.dat. typedef struct _wsse__SecurityTokenReference { struct _wsse__Reference* Reference; struct _wsse__KeyIdentifier* KeyIdentifier; struct _wsse__Embedded* Embedded; struct ds__X509DataType* X509Data; @char* wsu__Id; @char* wsc__Instance; @char* Usage; } _wsse__SecurityTokenReference; /// Element "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":Security of complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":SecurityHeaderType. /// @brief This element defines the wsse:Security SOAP header element per Section 4. /// Imported element _wsse__Security from typemap WS/WS-typemap.dat. #import "xenc.h" #import "wsc.h" typedef struct _wsse__Security { struct _wsu__Timestamp* wsu__Timestamp; struct _wsse__UsernameToken* UsernameToken; struct _wsse__BinarySecurityToken* BinarySecurityToken; struct xenc__EncryptedKeyType* xenc__EncryptedKey; struct _xenc__ReferenceList* xenc__ReferenceList; struct wsc__SecurityContextTokenType* wsc__SecurityContextToken; struct ds__SignatureType* ds__Signature; @char* SOAP_ENV__actor; @char* SOAP_ENV__role; } _wsse__Security; /// Element "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":TransformationParameters of complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":TransformationParametersType. /// @brief This element contains properties for transformations from any namespace, including DSIG. /// '_wsse__TransformationParameters' element definition intentionally left blank. /// Element "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":Password of complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":PasswordString. /// Imported element _wsse__Password from typemap WS/WS-typemap.dat. typedef struct _wsse__Password { char* __item; @char* Type; } _wsse__Password; /// Element "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":Nonce of complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":EncodedString. /// '_wsse__Nonce' element definition intentionally left blank. /// Attribute "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":Usage of simpleType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":tUsage. /// @brief This global attribute is used to indicate the usage of a referenced or indicated token within the containing context /// '_wsse__Usage' attribute definition intentionally left blank. mutable struct SOAP_ENV__Header { mustUnderstand _wsse__Security *wsse__Security 0; }; /* End of wsse.h */ gsoap-2.8.28/gsoap/import/stl.h0000644000175000017500000000510712653650146015675 0ustar ellertellert/* stl.h #import "stl.h" in a gSOAP header file to enable STL vectors, deques, lists, and sets. You can now remap std::vector in wsdl2h's output to another container by defining the '$CONTAINER' variable in typemap.dat, for example to use std::list: $CONTAINER = std::list Use soapcpp2 option -Ipath:path:... to specify the path(s) for #import gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under one of the following licenses: GPL, the gSOAP public license, or Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2015 Robert A. van Engelen, Genivia inc. All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #import "stldeque.h" #import "stllist.h" #import "stlvector.h" #import "stlset.h" gsoap-2.8.28/gsoap/import/wsdd5.h0000644000175000017500000007172312653650146016130 0ustar ellertellert/* wsdd5.h WS-Discovery 1.0 2005 with WS-Addressing 2005/08 Generated with: wsdl2h -cyex -o wsdd5.h -t WS/WS-typemap.dat WS/discovery.xsd Modified by Robert van Engelen: - Removed //gsoapopt - Changed //gsoap wssd schema namespace directive to import directive - Changed namespace to WS-Discovery 2005/04 protocol with wsdd5 - Added #import "wsdx.h" at the end of these definitions - Added #define SOAP_WSDD_2005 */ #define SOAP_WSDD_2005 /******************************************************************************\ * * * Definitions * * http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01 * * * \******************************************************************************/ /******************************************************************************\ * * * Import * * * \******************************************************************************/ #import "wsa5.h" // wsa5 = /******************************************************************************\ * * * Schema Namespaces * * * \******************************************************************************/ #define SOAP_NAMESPACE_OF_wsdd "http://schemas.xmlsoap.org/ws/2005/04/discovery" //gsoap wsdd schema import: http://schemas.xmlsoap.org/ws/2005/04/discovery //gsoap wsdd schema elementForm: qualified //gsoap wsdd schema attributeForm: unqualified /******************************************************************************\ * * * Built-in Schema Types and Top-Level Elements and Attributes * * * \******************************************************************************/ // Imported element ""http://www.w3.org/2005/08/addressing":EndpointReference" declared as _wsa5__EndpointReference. /// @brief Typedef synonym for struct wsdd__HelloType. typedef struct wsdd__HelloType wsdd__HelloType; /// @brief Typedef synonym for struct wsdd__ByeType. typedef struct wsdd__ByeType wsdd__ByeType; /// @brief Typedef synonym for struct wsdd__ProbeType. typedef struct wsdd__ProbeType wsdd__ProbeType; /// @brief Typedef synonym for struct wsdd__ProbeMatchesType. typedef struct wsdd__ProbeMatchesType wsdd__ProbeMatchesType; /// @brief Typedef synonym for struct wsdd__ProbeMatchType. typedef struct wsdd__ProbeMatchType wsdd__ProbeMatchType; /// @brief Typedef synonym for struct wsdd__ResolveType. typedef struct wsdd__ResolveType wsdd__ResolveType; /// @brief Typedef synonym for struct wsdd__ResolveMatchesType. typedef struct wsdd__ResolveMatchesType wsdd__ResolveMatchesType; /// @brief Typedef synonym for struct wsdd__ResolveMatchType. typedef struct wsdd__ResolveMatchType wsdd__ResolveMatchType; /// @brief Typedef synonym for struct wsdd__ScopesType. typedef struct wsdd__ScopesType wsdd__ScopesType; /// @brief Typedef synonym for struct wsdd__SecurityType. typedef struct wsdd__SecurityType wsdd__SecurityType; /// @brief Typedef synonym for struct wsdd__SigType. typedef struct wsdd__SigType wsdd__SigType; /// @brief Typedef synonym for struct wsdd__AppSequenceType. typedef struct wsdd__AppSequenceType wsdd__AppSequenceType; /******************************************************************************\ * * * Schema Types and Top-Level Elements and Attributes * * http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01 * * * \******************************************************************************/ /// @brief "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":QNameListType is a simpleType containing a whitespace separated list of xs:QName. /// typedef _QName wsdd__QNameListType; /// @brief "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":UriListType is a simpleType containing a whitespace separated list of xs:anyURI. /// typedef char* wsdd__UriListType; /// @brief Union of values from member types "tns:FaultCodeType xs:QName". typedef char* wsdd__FaultCodeOpenType; /// @brief "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":FaultCodeType is a simpleType restriction of XSD type xs:QName. /// enum wsdd__FaultCodeType { wsdd__MatchingRuleNotSupported, ///< xs:QName value=""http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":MatchingRuleNotSupported" }; /// @brief Typedef synonym for enum wsdd__FaultCodeType. typedef enum wsdd__FaultCodeType wsdd__FaultCodeType; /******************************************************************************\ * * * Schema Complex Types and Top-Level Elements * * http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01 * * * \******************************************************************************/ /// @brief "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":HelloType is a complexType. /// struct wsdd__HelloType { /// Imported element reference "http://www.w3.org/2005/08/addressing":EndpointReference. _wsa5__EndpointReference wsa5__EndpointReference 1; ///< Required element. /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01:""http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Types. wsdd__QNameListType Types 0; ///< Optional element. /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01:""http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Scopes. struct wsdd__ScopesType* Scopes 0; ///< Optional element. /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01:""http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":XAddrs. wsdd__UriListType XAddrs 0; ///< Optional element. /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01:""http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":MetadataVersion. unsigned int MetadataVersion 1; ///< Required element. /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). /// @todo . /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// @brief "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":ByeType is a complexType. /// struct wsdd__ByeType { /// Imported element reference "http://www.w3.org/2005/08/addressing":EndpointReference. _wsa5__EndpointReference wsa5__EndpointReference 1; ///< Required element. /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01:""http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Types. wsdd__QNameListType Types 0; ///< Optional element. /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01:""http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Scopes. struct wsdd__ScopesType* Scopes 0; ///< Optional element. /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01:""http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":XAddrs. wsdd__UriListType XAddrs 0; ///< Optional element. /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01:""http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":MetadataVersion. unsigned int* MetadataVersion 0; ///< Optional element. /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). /// @todo . /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// @brief "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":ProbeType is a complexType. /// struct wsdd__ProbeType { /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01:""http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Types. wsdd__QNameListType Types 0; ///< Optional element. /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01:""http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Scopes. struct wsdd__ScopesType* Scopes 0; ///< Optional element. /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). /// @todo . /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// @brief "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":ProbeMatchesType is a complexType. /// struct wsdd__ProbeMatchesType { /// Size of array of struct wsdd__ProbeMatchType* is 0..unbounded. $int __sizeProbeMatch 0; /// Array struct wsdd__ProbeMatchType* of size 0..unbounded. struct wsdd__ProbeMatchType* ProbeMatch 0; /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). /// @todo . /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// @brief "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":ProbeMatchType is a complexType. /// struct wsdd__ProbeMatchType { /// Imported element reference "http://www.w3.org/2005/08/addressing":EndpointReference. _wsa5__EndpointReference wsa5__EndpointReference 1; ///< Required element. /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01:""http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Types. wsdd__QNameListType Types 0; ///< Optional element. /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01:""http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Scopes. struct wsdd__ScopesType* Scopes 0; ///< Optional element. /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01:""http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":XAddrs. wsdd__UriListType XAddrs 0; ///< Optional element. /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01:""http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":MetadataVersion. unsigned int MetadataVersion 1; ///< Required element. /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). /// @todo . /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// @brief "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":ResolveType is a complexType. /// struct wsdd__ResolveType { /// Imported element reference "http://www.w3.org/2005/08/addressing":EndpointReference. _wsa5__EndpointReference wsa5__EndpointReference 1; ///< Required element. /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). /// @todo . /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// @brief "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":ResolveMatchesType is a complexType. /// struct wsdd__ResolveMatchesType { /// Element "ResolveMatch" of XSD type "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":ResolveMatchType. struct wsdd__ResolveMatchType* ResolveMatch 0; ///< Optional element. /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). /// @todo . /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// @brief "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":ResolveMatchType is a complexType. /// struct wsdd__ResolveMatchType { /// Imported element reference "http://www.w3.org/2005/08/addressing":EndpointReference. _wsa5__EndpointReference wsa5__EndpointReference 1; ///< Required element. /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01:""http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Types. wsdd__QNameListType Types 0; ///< Optional element. /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01:""http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Scopes. struct wsdd__ScopesType* Scopes 0; ///< Optional element. /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01:""http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":XAddrs. wsdd__UriListType XAddrs 0; ///< Optional element. /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01:""http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":MetadataVersion. unsigned int MetadataVersion 1; ///< Required element. /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). /// @todo . /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// @brief "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":SecurityType is a complexType. /// struct wsdd__SecurityType { /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01:""http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Sig. struct wsdd__SigType* Sig 0; ///< Optional element. /// @todo . /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// @brief "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":SigType is a complexType. /// struct wsdd__SigType { /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). /// Attribute "Scheme" of XSD type xs:anyURI. @char* Scheme 1; ///< Required attribute. /// Attribute "KeyId" of XSD type xs:base64Binary. @char* KeyId 0; ///< Optional attribute. /// Attribute "Refs" of XSD type xs:IDREFS. @char* Refs 1; ///< Required attribute. /// Attribute "Sig" of XSD type xs:base64Binary. @char* Sig 1; ///< Required attribute. /// @todo . /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// @brief "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":ScopesType is a complexType with simpleContent. /// struct wsdd__ScopesType { /// __item wraps ""http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":UriListType" simpleContent. wsdd__UriListType __item ; /// Attribute "MatchBy" of XSD type xs:anyURI. @char* MatchBy 0; ///< Optional attribute. /// @todo . /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// @brief "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":AppSequenceType is a complexType with complexContent restriction of XSD type xs:anyType. /// struct wsdd__AppSequenceType { /// Attribute "InstanceId" of XSD type xs:unsignedInt. @unsigned int InstanceId 1; ///< Required attribute. /// Attribute "SequenceId" of XSD type xs:anyURI. @char* SequenceId 0; ///< Optional attribute. /// Attribute "MessageNumber" of XSD type xs:unsignedInt. @unsigned int MessageNumber 1; ///< Required attribute. /// @todo . /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /******************************************************************************\ * * * Additional Top-Level Elements * * http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01 * * * \******************************************************************************/ /// @brief Top-level root element "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Hello of XSD type "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":HelloType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Bye of XSD type "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":ByeType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Probe of XSD type "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":ProbeType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":ProbeMatches of XSD type "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":ProbeMatchesType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Resolve of XSD type "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":ResolveType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":ResolveMatches of XSD type "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":ResolveMatchesType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Types of XSD type "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":QNameListType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Scopes of XSD type "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":ScopesType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":XAddrs of XSD type "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":UriListType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":MetadataVersion of XSD type xs:unsignedInt. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":SupportedMatchingRules of XSD type "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":UriListType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Security of XSD type "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":SecurityType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Sig of XSD type "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":SigType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":AppSequence of XSD type "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":AppSequenceType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /******************************************************************************\ * * * Additional Top-Level Attributes * * http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01 * * * \******************************************************************************/ /// @brief Top-level attribute "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Id of simpleType xs:ID. /// @note Use wsdl2h option -g to auto-generate a top-level attribute declaration and processing code. /******************************************************************************\ * * * XML Data Binding * * * \******************************************************************************/ /** @page page_XMLDataBinding XML Data Binding SOAP/XML services use data bindings contractually bound by WSDL and auto- generated by wsdl2h and soapcpp2 (see Service Bindings). Plain data bindings are adopted from XML schemas as part of the WSDL types section or when running wsdl2h on a set of schemas to produce non-SOAP-based XML data bindings. The following readers and writers are C/C++ data type (de)serializers auto- generated by wsdl2h and soapcpp2. Run soapcpp2 on this file to generate the (de)serialization code, which is stored in soapC.c[pp]. Include "soapH.h" in your code to import these data type and function declarations. Only use the soapcpp2-generated files in your project build. Do not include the wsdl2h- generated .h file in your code. Data can be read in XML and deserialized from: - a file descriptor, using soap->recvfd = fd - a socket, using soap->socket = ... - a C++ stream, using soap->is = ... - a buffer, using the soap->frecv() callback Data can be serialized in XML and written to: - a file descriptor, using soap->sendfd = fd - a socket, using soap->socket = ... - a C++ stream, using soap->os = ... - a buffer, using the soap->fsend() callback The following options are available for (de)serialization control: - soap->encodingStyle = NULL; to remove SOAP 1.1/1.2 encodingStyle - soap_mode(soap, SOAP_XML_TREE); XML without id-ref (no cycles!) - soap_mode(soap, SOAP_XML_GRAPH); XML with id-ref (including cycles) - soap_set_namespaces(soap, struct Namespace *nsmap); to set xmlns bindings @section wsdd Top-level root elements of schema "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01" - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) */ #import "wsdx.h" /* End of wsdd5.h */ gsoap-2.8.28/gsoap/import/dom.h0000644000175000017500000000564012653650146015654 0ustar ellertellert/* dom.h gSOAP DOM API v5 Use #import "dom.h" in gSOAP header files to use DOM-based xsd__anyType for XML element and xsd__anyAttribute for XML attributes. This import is automatic with wsdl2h option -d. Compile with dom.c[pp] or link with libgsoapssl.a (for C) or libgsoapssl++.a (for C++) See gsoap/doc/dom/html/index.html for the new DOM API v5 documentation Also located in /gsoap/samples/dom/README.md gSOAP XML Web services tools Copyright (C) 2000-2016, Robert van Engelen, Genivia, Inc. All Rights Reserved. This part of the software is released under ONE of the following licenses: GPL, or the gSOAP public license, or Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2016, Robert van Engelen, Genivia Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ // The custom serializer for DOM element nodes is represented by xsd__anyType. extern typedef struct soap_dom_element xsd__anyType; // The custom serializer for DOM attribute nodes is represented by xsd__anyAttribute. extern typedef struct soap_dom_attribute xsd__anyAttribute; gsoap-2.8.28/gsoap/import/c14n.h0000644000175000017500000000207112653650146015635 0ustar ellertellert/* c14n.h */ /******************************************************************************\ * * * Schema Namespaces * * * \******************************************************************************/ //gsoap c14n schema import: http://www.w3.org/2001/10/xml-exc-c14n# //gsoap c14n schema elementForm: qualified //gsoap c14n schema attributeForm: unqualified /******************************************************************************\ * * * Schema Types * * * \******************************************************************************/ typedef struct _c14n__InclusiveNamespaces { @char* PrefixList; } _c14n__InclusiveNamespaces; gsoap-2.8.28/gsoap/import/wsrm.h0000644000175000017500000010126112653650146016061 0ustar ellertellert/* wsrm.h WS-ReliableMessaging 1.1 2007/02 and WS-Addressing 2005/08 Usage: See import/wsrx.h and plugin/wsrmapi.c Generated with: wsdl2h -cyex -o wsrm.h -t WS/WS-typemap.dat WS/WS-ReliableMessaging.xsd Modified by Robert van Engelen: - Removed //gsoapopt - Changed //gsoap wsrm schema namespace directive to import directive - Added #import "wsrx.h" at the end of these definitions - Added #define SOAP_WSRM_2007 - Added //gsoap netrm schema namespace: http://schemas.microsoft.com/ws/2006/05/rm Int* netrm__BufferRemaining; - Added _XML __any; to struct _wsrm__SequenceAcknowledgement */ #define SOAP_WSRM_2007 /******************************************************************************\ * * * Definitions * * http://docs.oasis-open.org/ws-rx/wsrm/200702 * * * \******************************************************************************/ /******************************************************************************\ * * * Import * * * \******************************************************************************/ #import "wsa5.h" // wsa5 = /******************************************************************************\ * * * Schema Namespaces * * * \******************************************************************************/ #define SOAP_NAMESPACE_OF_wsrm "http://docs.oasis-open.org/ws-rx/wsrm/200702" //gsoap wsrm schema import: http://docs.oasis-open.org/ws-rx/wsrm/200702 //gsoap wsrm schema elementForm: qualified //gsoap wsrm schema attributeForm: unqualified /******************************************************************************\ * * * Built-in Schema Types and Top-Level Elements and Attributes * * * \******************************************************************************/ // Imported type "http://www.w3.org/2005/08/addressing":EndpointReferenceType defined by wsa5__EndpointReferenceType /// Typedef synonym for struct wsrm__SequenceType. typedef struct wsrm__SequenceType wsrm__SequenceType; /// Typedef synonym for struct wsrm__AckRequestedType. typedef struct wsrm__AckRequestedType wsrm__AckRequestedType; /// Typedef synonym for struct wsrm__SequenceFaultType. typedef struct wsrm__SequenceFaultType wsrm__SequenceFaultType; /// Imported complexType "http://docs.oasis-open.org/ws-rx/wsrm/200702":DetailType from typemap /Users/engelen/Projects/gsoap/WS/WS-typemap.dat. // complexType definition intentionally left blank. /// Typedef synonym for struct wsrm__CreateSequenceType. typedef struct wsrm__CreateSequenceType wsrm__CreateSequenceType; /// Typedef synonym for struct wsrm__CreateSequenceResponseType. typedef struct wsrm__CreateSequenceResponseType wsrm__CreateSequenceResponseType; /// Typedef synonym for struct wsrm__CloseSequenceType. typedef struct wsrm__CloseSequenceType wsrm__CloseSequenceType; /// Typedef synonym for struct wsrm__CloseSequenceResponseType. typedef struct wsrm__CloseSequenceResponseType wsrm__CloseSequenceResponseType; /// Typedef synonym for struct wsrm__TerminateSequenceType. typedef struct wsrm__TerminateSequenceType wsrm__TerminateSequenceType; /// Typedef synonym for struct wsrm__TerminateSequenceResponseType. typedef struct wsrm__TerminateSequenceResponseType wsrm__TerminateSequenceResponseType; /// Typedef synonym for struct wsrm__OfferType. typedef struct wsrm__OfferType wsrm__OfferType; /// Typedef synonym for struct wsrm__AcceptType. typedef struct wsrm__AcceptType wsrm__AcceptType; /// Typedef synonym for struct _wsrm__SequenceAcknowledgement. typedef struct _wsrm__SequenceAcknowledgement _wsrm__SequenceAcknowledgement; /// Imported complexType "http://docs.oasis-open.org/ws-rx/wsrm/200702":Identifier from typemap /Users/engelen/Projects/gsoap/WS/WS-typemap.dat. /// @brief This type is for elements whose [children] is an anyURI and can have arbitrary attributes. typedef char *_wsrm__Identifier; /// Imported complexType "http://docs.oasis-open.org/ws-rx/wsrm/200702":Address from typemap /Users/engelen/Projects/gsoap/WS/WS-typemap.dat. // complexType definition intentionally left blank. /// Imported complexType "http://docs.oasis-open.org/ws-rx/wsrm/200702":Expires from typemap /Users/engelen/Projects/gsoap/WS/WS-typemap.dat. #import "custom/duration.h" /// Typedef synonym for struct _wsrm__UsesSequenceSTR. typedef struct _wsrm__UsesSequenceSTR _wsrm__UsesSequenceSTR; /// Typedef synonym for struct _wsrm__UsesSequenceSSL. typedef struct _wsrm__UsesSequenceSSL _wsrm__UsesSequenceSSL; /******************************************************************************\ * * * Schema Types and Top-Level Elements and Attributes * * http://docs.oasis-open.org/ws-rx/wsrm/200702 * * * \******************************************************************************/ /// Imported simpleType "http://docs.oasis-open.org/ws-rx/wsrm/200702":MessageNumberType from typemap /Users/engelen/Projects/gsoap/WS/WS-typemap.dat. // simpleType definition intentionally left blank. /// "http://docs.oasis-open.org/ws-rx/wsrm/200702":FaultCodes is a simpleType restriction of xs:QName. enum wsrm__FaultCodes { wsrm__SequenceTerminated, ///< xs:QName value=""http://docs.oasis-open.org/ws-rx/wsrm/200702":SequenceTerminated" wsrm__UnknownSequence, ///< xs:QName value=""http://docs.oasis-open.org/ws-rx/wsrm/200702":UnknownSequence" wsrm__InvalidAcknowledgement, ///< xs:QName value=""http://docs.oasis-open.org/ws-rx/wsrm/200702":InvalidAcknowledgement" wsrm__MessageNumberRollover, ///< xs:QName value=""http://docs.oasis-open.org/ws-rx/wsrm/200702":MessageNumberRollover" wsrm__CreateSequenceRefused, ///< xs:QName value=""http://docs.oasis-open.org/ws-rx/wsrm/200702":CreateSequenceRefused" wsrm__SequenceClosed, ///< xs:QName value=""http://docs.oasis-open.org/ws-rx/wsrm/200702":SequenceClosed" wsrm__WSRMRequired, ///< xs:QName value=""http://docs.oasis-open.org/ws-rx/wsrm/200702":WSRMRequired" }; /// Typedef synonym for enum wsrm__FaultCodes. typedef enum wsrm__FaultCodes wsrm__FaultCodes; /// "http://docs.oasis-open.org/ws-rx/wsrm/200702":IncompleteSequenceBehaviorType is a simpleType restriction of xs:string. enum wsrm__IncompleteSequenceBehaviorType { DiscardEntireSequence, ///< xs:string value="DiscardEntireSequence" DiscardFollowingFirstGap, ///< xs:string value="DiscardFollowingFirstGap" NoDiscard, ///< xs:string value="NoDiscard" }; /// Typedef synonym for enum wsrm__IncompleteSequenceBehaviorType. typedef enum wsrm__IncompleteSequenceBehaviorType wsrm__IncompleteSequenceBehaviorType; /// "http://docs.oasis-open.org/ws-rx/wsrm/200702":UnsupportedElement is a simpleType restriction of xs:QName. /******************************************************************************\ * * * Schema Complex Types and Top-Level Elements * * http://docs.oasis-open.org/ws-rx/wsrm/200702 * * * \******************************************************************************/ /// "http://docs.oasis-open.org/ws-rx/wsrm/200702":SequenceType is a complexType. struct wsrm__SequenceType { /// Element reference "http://docs.oasis-open.org/ws-rx/wsrm/200702":Identifier. char* Identifier 1; ///< Required element. /// Element MessageNumber of type "http://docs.oasis-open.org/ws-rx/wsrm/200702":MessageNumberType. ULONG64 MessageNumber 1; ///< Required element. /// TODO: /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). /// /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// "http://docs.oasis-open.org/ws-rx/wsrm/200702":AckRequestedType is a complexType. struct wsrm__AckRequestedType { /// Element reference "http://docs.oasis-open.org/ws-rx/wsrm/200702":Identifier. char* Identifier 1; ///< Required element. /// TODO: /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). /// /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// "http://docs.oasis-open.org/ws-rx/wsrm/200702":SequenceFaultType is a complexType. struct wsrm__SequenceFaultType { /// Element FaultCode of type "http://docs.oasis-open.org/ws-rx/wsrm/200702":FaultCodes. enum wsrm__FaultCodes FaultCode 1; ///< Required element. /// Element Detail of type "http://docs.oasis-open.org/ws-rx/wsrm/200702":DetailType. struct SOAP_ENV__Detail* Detail 0; ///< Optional element. /// TODO: /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). /// /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// "http://docs.oasis-open.org/ws-rx/wsrm/200702":CreateSequenceType is a complexType. struct wsrm__CreateSequenceType { /// Element reference "http://docs.oasis-open.org/ws-rx/wsrm/200702":AcksTo. wsa5__EndpointReferenceType AcksTo 1; ///< Required element. /// Element reference "http://docs.oasis-open.org/ws-rx/wsrm/200702":Expires. xsd__duration* Expires 0; ///< Optional element. /// Element Offer of type "http://docs.oasis-open.org/ws-rx/wsrm/200702":OfferType. struct wsrm__OfferType* Offer 0; ///< Optional element. /// TODO: /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). /// /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// "http://docs.oasis-open.org/ws-rx/wsrm/200702":CreateSequenceResponseType is a complexType. struct wsrm__CreateSequenceResponseType { /// Element reference "http://docs.oasis-open.org/ws-rx/wsrm/200702":Identifier. char* Identifier 1; ///< Required element. /// Element reference "http://docs.oasis-open.org/ws-rx/wsrm/200702":Expires. xsd__duration* Expires 0; ///< Optional element. /// Element IncompleteSequenceBehavior of type "http://docs.oasis-open.org/ws-rx/wsrm/200702":IncompleteSequenceBehaviorType. enum wsrm__IncompleteSequenceBehaviorType* IncompleteSequenceBehavior 0; ///< Optional element. /// Element Accept of type "http://docs.oasis-open.org/ws-rx/wsrm/200702":AcceptType. struct wsrm__AcceptType* Accept 0; ///< Optional element. /// TODO: /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). /// /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// "http://docs.oasis-open.org/ws-rx/wsrm/200702":CloseSequenceType is a complexType. struct wsrm__CloseSequenceType { /// Element reference "http://docs.oasis-open.org/ws-rx/wsrm/200702":Identifier. char* Identifier 1; ///< Required element. /// Element LastMsgNumber of type "http://docs.oasis-open.org/ws-rx/wsrm/200702":MessageNumberType. ULONG64* LastMsgNumber 0; ///< Optional element. /// TODO: /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). /// /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// "http://docs.oasis-open.org/ws-rx/wsrm/200702":CloseSequenceResponseType is a complexType. struct wsrm__CloseSequenceResponseType { /// Element reference "http://docs.oasis-open.org/ws-rx/wsrm/200702":Identifier. char* Identifier 1; ///< Required element. /// TODO: /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). /// /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// "http://docs.oasis-open.org/ws-rx/wsrm/200702":TerminateSequenceType is a complexType. struct wsrm__TerminateSequenceType { /// Element reference "http://docs.oasis-open.org/ws-rx/wsrm/200702":Identifier. char* Identifier 1; ///< Required element. /// Element LastMsgNumber of type "http://docs.oasis-open.org/ws-rx/wsrm/200702":MessageNumberType. ULONG64* LastMsgNumber 0; ///< Optional element. /// TODO: /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). /// /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// "http://docs.oasis-open.org/ws-rx/wsrm/200702":TerminateSequenceResponseType is a complexType. struct wsrm__TerminateSequenceResponseType { /// Element reference "http://docs.oasis-open.org/ws-rx/wsrm/200702":Identifier. char* Identifier 1; ///< Required element. /// TODO: /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). /// /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// "http://docs.oasis-open.org/ws-rx/wsrm/200702":OfferType is a complexType. struct wsrm__OfferType { /// Element reference "http://docs.oasis-open.org/ws-rx/wsrm/200702":Identifier. char* Identifier 1; ///< Required element. /// Element Endpoint of type "http://www.w3.org/2005/08/addressing":EndpointReferenceType. wsa5__EndpointReferenceType Endpoint 1; ///< Required element. /// Element reference "http://docs.oasis-open.org/ws-rx/wsrm/200702":Expires. xsd__duration* Expires 0; ///< Optional element. /// Element IncompleteSequenceBehavior of type "http://docs.oasis-open.org/ws-rx/wsrm/200702":IncompleteSequenceBehaviorType. enum wsrm__IncompleteSequenceBehaviorType* IncompleteSequenceBehavior 0; ///< Optional element. /// TODO: /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). /// /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// "http://docs.oasis-open.org/ws-rx/wsrm/200702":AcceptType is a complexType. struct wsrm__AcceptType { /// Element reference "http://docs.oasis-open.org/ws-rx/wsrm/200702":AcksTo. wsa5__EndpointReferenceType AcksTo 1; ///< Required element. /// TODO: /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). /// /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// Top-level root element "http://docs.oasis-open.org/ws-rx/wsrm/200702":SequenceAcknowledgement /// "http://docs.oasis-open.org/ws-rx/wsrm/200702":SequenceAcknowledgement is a complexType. struct _wsrm__SequenceAcknowledgement { /// Element reference "http://docs.oasis-open.org/ws-rx/wsrm/200702":Identifier. char* Identifier 1; ///< Required element. /// CHOICE OF ELEMENTS /// Note: with embedded or prevents the use of a union /// Size of array of ULONG64* is 1..unbounded $int __sizeNack 0; /// Array ULONG64* of length 1..unbounded ULONG64* Nack ; /// SEQUENCE OF ELEMENTS struct _wsrm__SequenceAcknowledgement_Final { /// SEQUENCE OF ELEMENTS // END OF SEQUENCE } *Final ; /// CHOICE OF ELEMENTS /// Note: of element with maxOccurs>1 prevents the use of a union /// Size of AcknowledgementRange array is 1..unbounded $int __sizeAcknowledgementRange 0; struct _wsrm__SequenceAcknowledgement_AcknowledgementRange { /// SEQUENCE OF ELEMENTS // END OF SEQUENCE /// Attribute Upper of type xs:unsignedLong. @ULONG64 Upper 1; ///< Required attribute. /// Attribute Lower of type xs:unsignedLong. @ULONG64 Lower 1; ///< Required attribute. /// /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). } *AcknowledgementRange ; struct _wsrm__SequenceAcknowledgement_None { /// SEQUENCE OF ELEMENTS // END OF SEQUENCE } *None ; // END OF CHOICE // END OF SEQUENCE // END OF CHOICE /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). //gsoap netrm schema namespace: http://schemas.microsoft.com/ws/2006/05/rm int *netrm__BufferRemaining; ///< WCF netrm BufferRemaining _XML __any; // extensibility /// /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// Top-level root element "http://docs.oasis-open.org/ws-rx/wsrm/200702":UsesSequenceSTR /// "http://docs.oasis-open.org/ws-rx/wsrm/200702":UsesSequenceSTR is a complexType. struct _wsrm__UsesSequenceSTR { /// /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// Top-level root element "http://docs.oasis-open.org/ws-rx/wsrm/200702":UsesSequenceSSL /// "http://docs.oasis-open.org/ws-rx/wsrm/200702":UsesSequenceSSL is a complexType. struct _wsrm__UsesSequenceSSL { /// /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// Top-level root element "http://docs.oasis-open.org/ws-rx/wsrm/200702":Identifier /// Top-level root element "http://docs.oasis-open.org/ws-rx/wsrm/200702":Address /// Top-level root element "http://docs.oasis-open.org/ws-rx/wsrm/200702":Expires /******************************************************************************\ * * * Additional Top-Level Elements * * http://docs.oasis-open.org/ws-rx/wsrm/200702 * * * \******************************************************************************/ /// Top-level root element "http://docs.oasis-open.org/ws-rx/wsrm/200702":Sequence of type "http://docs.oasis-open.org/ws-rx/wsrm/200702":SequenceType. /// Note: use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// Top-level root element "http://docs.oasis-open.org/ws-rx/wsrm/200702":AckRequested of type "http://docs.oasis-open.org/ws-rx/wsrm/200702":AckRequestedType. /// Note: use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// Top-level root element "http://docs.oasis-open.org/ws-rx/wsrm/200702":SequenceFault of type "http://docs.oasis-open.org/ws-rx/wsrm/200702":SequenceFaultType. /// Note: use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// Top-level root element "http://docs.oasis-open.org/ws-rx/wsrm/200702":CreateSequence of type "http://docs.oasis-open.org/ws-rx/wsrm/200702":CreateSequenceType. /// Note: use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// Top-level root element "http://docs.oasis-open.org/ws-rx/wsrm/200702":CreateSequenceResponse of type "http://docs.oasis-open.org/ws-rx/wsrm/200702":CreateSequenceResponseType. /// Note: use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// Top-level root element "http://docs.oasis-open.org/ws-rx/wsrm/200702":CloseSequence of type "http://docs.oasis-open.org/ws-rx/wsrm/200702":CloseSequenceType. /// Note: use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// Top-level root element "http://docs.oasis-open.org/ws-rx/wsrm/200702":CloseSequenceResponse of type "http://docs.oasis-open.org/ws-rx/wsrm/200702":CloseSequenceResponseType. /// Note: use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// Top-level root element "http://docs.oasis-open.org/ws-rx/wsrm/200702":TerminateSequence of type "http://docs.oasis-open.org/ws-rx/wsrm/200702":TerminateSequenceType. /// Note: use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// Top-level root element "http://docs.oasis-open.org/ws-rx/wsrm/200702":TerminateSequenceResponse of type "http://docs.oasis-open.org/ws-rx/wsrm/200702":TerminateSequenceResponseType. /// Note: use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// Top-level root element "http://docs.oasis-open.org/ws-rx/wsrm/200702":AcksTo of type "http://www.w3.org/2005/08/addressing":EndpointReferenceType. /// Note: use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /******************************************************************************\ * * * Additional Top-Level Attributes * * http://docs.oasis-open.org/ws-rx/wsrm/200702 * * * \******************************************************************************/ /******************************************************************************\ * * * XML Data Binding * * * \******************************************************************************/ /** @page page_XMLDataBinding XML Data Binding SOAP/XML services use data bindings contractually bound by WSDL and auto- generated by wsdl2h and soapcpp2 (see Service Bindings). Plain data bindings are adopted from XML schemas as part of the WSDL types section or when running wsdl2h on a set of schemas to produce non-SOAP-based XML data bindings. The following readers and writers are C/C++ data type (de)serializers auto- generated by wsdl2h and soapcpp2. Run soapcpp2 on this file to generate the (de)serialization code, which is stored in soapC.c[pp]. Include "soapH.h" in your code to import these data type and function declarations. Only use the soapcpp2-generated files in your project build. Do not include the wsdl2h- generated .h file in your code. XML content can be retrieved from: - a FILE* fd, using soap->recvfd = fd - a socket, using soap->socket = ... - a C++ stream, using soap->is = ... - a buffer, using the soap->frecv() callback XML content can be stored to: - a FILE* fd, using soap->sendfd = fd - a socket, using soap->socket = ... - a C++ stream, using soap->os = ... - a buffer, using the soap->fsend() callback @section wsrm Top-level root elements of schema "http://docs.oasis-open.org/ws-rx/wsrm/200702" - (use wsdl2h option -g to auto-generate) - @ref _wsrm__SequenceAcknowledgement @code // Reader (returns SOAP_OK on success): soap_read__wsrm__SequenceAcknowledgement(struct soap*, struct _wsrm__SequenceAcknowledgement*); // Writer (returns SOAP_OK on success): soap_write__wsrm__SequenceAcknowledgement(struct soap*, struct _wsrm__SequenceAcknowledgement*); @endcode - (use wsdl2h option -g to auto-generate) - @ref _wsrm__Identifier @code // Reader (returns SOAP_OK on success): soap_read__wsrm__Identifier(struct soap*, char*); // Writer (returns SOAP_OK on success): soap_write__wsrm__Identifier(struct soap*, char*); @endcode - @ref _wsrm__Address @code // Reader (returns SOAP_OK on success): soap_read__wsrm__Address(struct soap*, char*); // Writer (returns SOAP_OK on success): soap_write__wsrm__Address(struct soap*, char*); @endcode - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - @ref _wsrm__Expires @code // Reader (returns SOAP_OK on success): soap_read__wsrm__Expires(struct soap*, xsd__duration*); // Writer (returns SOAP_OK on success): soap_write__wsrm__Expires(struct soap*, xsd__duration*); @endcode - @ref _wsrm__UsesSequenceSTR @code // Reader (returns SOAP_OK on success): soap_read__wsrm__UsesSequenceSTR(struct soap*, struct _wsrm__UsesSequenceSTR*); // Writer (returns SOAP_OK on success): soap_write__wsrm__UsesSequenceSTR(struct soap*, struct _wsrm__UsesSequenceSTR*); @endcode - @ref _wsrm__UsesSequenceSSL @code // Reader (returns SOAP_OK on success): soap_read__wsrm__UsesSequenceSSL(struct soap*, struct _wsrm__UsesSequenceSSL*); // Writer (returns SOAP_OK on success): soap_write__wsrm__UsesSequenceSSL(struct soap*, struct _wsrm__UsesSequenceSSL*); @endcode - @ref _wsrm__UnsupportedElement @code // Reader (returns SOAP_OK on success): soap_read__wsrm__UnsupportedElement(struct soap*, _QName); // Writer (returns SOAP_OK on success): soap_write__wsrm__UnsupportedElement(struct soap*, _QName); @endcode */ #import "wsrx.h" /* End of wsrm.h */ gsoap-2.8.28/gsoap/import/xop.h0000644000175000017500000000551212653650146015701 0ustar ellertellert/* xop.h Use #import "xop.h" in a gSOAP header file to enable MTOM attachments. Use SOAP_ENC_MTOM flag in your code to switch to MTOM attachments, see the gSOAP documentation soapdoc2.html Use soapcpp2 option -Ipath:path:... to specify the path(s) for #import gSOAP XML Web services tools Copyright (C) 2000-2008, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under one of the following licenses: GPL, the gSOAP public license, or Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2008 Robert A. van Engelen, Genivia inc. All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap xop schema import: http://www.w3.org/2004/08/xop/include struct _xop__Include { unsigned char *__ptr; ///< pointer to binary data int __size; ///< size of binary data char *id; ///< NULL to generate an id, or set to a unique UUID char *type; ///< MIME type of the data char *options; ///< optional description of MIME attachment }; typedef struct _xop__Include _xop__Include; gsoap-2.8.28/gsoap/import/wsrm4.h0000644000175000017500000004770112653650146016155 0ustar ellertellert/* wsrm4.h WS-ReliableMessaging 1.0 2004/06 THIS IS AN OBSOLETE SPECIFICATION superseded by WS-ReliableMessaging 2005/08. Support for this version has ceased. Generated with: wsdl2h -cgex -o wsrm4.h -t WS/WS-typemap.dat WS/ws-reliability-1.1.xsd Modified by Robert van Engelen: - Removed //gsoapopt - Changed the //gsoap schema namespace directives to imports */ /******************************************************************************\ * * * http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd * * * \******************************************************************************/ /******************************************************************************\ * * * Import * * * \******************************************************************************/ #import "ref.h" // ref = /******************************************************************************\ * * * Schema Namespaces * * * \******************************************************************************/ //gsoap wsrm schema import: http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd //gsoap wsrm schema elementForm: qualified //gsoap wsrm schema attributeForm: unqualified /******************************************************************************\ * * * Schema Types * * * \******************************************************************************/ // Imported type "http://docs.oasis-open.org/wsrm/2004/06/reference-1.1.xsd":ServiceRefType defined by ref__ServiceRefType /// Built-in type "xs:boolean". enum xsd__boolean_ { _false, _true }; /// "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":ReplyPatternTypeValues is a simpleType restriction of xs:string. enum wsrm__ReplyPatternTypeValues { Response, ///< xs:string value="Response" Callback, ///< xs:string value="Callback" Poll, ///< xs:string value="Poll" }; /// "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":MIDType is a simpleType restriction of xs:anyURI. typedef char* /*URI*/ wsrm__MIDType; /// "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":FaultCodeEnum is a simpleType restriction of xs:QName. enum wsrm__FaultCodeEnum { wsrm__InvalidMessageId, ///< xs:QName value=""http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":InvalidMessageId" wsrm__InvalidMessageParameters, ///< xs:QName value=""http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":InvalidMessageParameters" wsrm__InvalidPollRequest, ///< xs:QName value=""http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":InvalidPollRequest" wsrm__InvalidRequest, ///< xs:QName value=""http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":InvalidRequest" wsrm__InvalidExpiryTime, ///< xs:QName value=""http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":InvalidExpiryTime" wsrm__InvalidReplyPattern, ///< xs:QName value=""http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":InvalidReplyPattern" wsrm__FeatureNotSupported, ///< xs:QName value=""http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":FeatureNotSupported" wsrm__PermanentProcessingFailure, ///< xs:QName value=""http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":PermanentProcessingFailure" wsrm__MessageProcessingFailure, ///< xs:QName value=""http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":MessageProcessingFailure" wsrm__GroupAborted, ///< xs:QName value=""http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":GroupAborted" }; /// "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":BareURIType is a simpleType restriction of xs:anyURI. typedef char* /*URI*/ wsrm__BareURIType; /// "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":HeaderBaseType is a complexType. struct wsrm__HeaderBaseType { /// TODO: /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). /// /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":EmptyType is a complexType. struct wsrm__EmptyType { }; /// "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":ExtensibleType is a complexType. struct wsrm__ExtensibleType { /// TODO: /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). /// /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":ReplyPatternType is a complexType. struct wsrm__ReplyPatternType { /// Element Value of type "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":ReplyPatternTypeValues. enum wsrm__ReplyPatternTypeValues Value 1; ///< Required element. /// Element ReplyTo of type "http://docs.oasis-open.org/wsrm/2004/06/reference-1.1.xsd":ServiceRefType. ref__ServiceRefType* ReplyTo 0; ///< Optional element. }; /// "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":RequestType is a complexType with complexContent extension of "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":HeaderBaseType. struct wsrm__RequestType { /// INHERITED FROM wsrm__HeaderBaseType: /// TODO: /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). /// /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). // END OF INHERITED /// Element MessageId of type "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":MessageIdType. struct wsrm__MessageIdType* MessageId 1; ///< Required element. /// Element ExpiryTime of type xs:dateTime. time_t ExpiryTime 1; ///< Required element. /// Element ReplyPattern of type "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":ReplyPatternType. struct wsrm__ReplyPatternType* ReplyPattern 1; ///< Required element. /// Element AckRequested of type "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":EmptyType. struct wsrm__EmptyType* AckRequested 0; ///< Optional element. /// Element DuplicateElimination of type "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":EmptyType. struct wsrm__EmptyType* DuplicateElimination 0; ///< Optional element. /// Element MessageOrder of type "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":EmptyType. struct wsrm__EmptyType* MessageOrder 0; ///< Optional element. }; /// "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":MessageIdType is a complexType with complexContent extension of "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":EmptyType. struct wsrm__MessageIdType { /// INHERITED FROM wsrm__EmptyType: // END OF INHERITED /// Element SequenceNum of type "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":SequenceNumType. struct wsrm__SequenceNumType* SequenceNum 0; ///< Optional element. /// Attribute groupId of type "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":MIDType. @wsrm__MIDType groupId 1; ///< Required attribute. }; /// "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":SequenceNumType is a complexType with complexContent extension of "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":EmptyType. struct wsrm__SequenceNumType { /// INHERITED FROM wsrm__EmptyType: // END OF INHERITED /// Attribute number of type xs:unsignedLong. @ULONG64 number 1; ///< Required attribute. /// Attribute last of type xs:boolean. @enum xsd__boolean_ last 0 = false_; ///< Default value="false". /// Attribute groupExpiryTime of type xs:dateTime. @time_t* groupExpiryTime 0; ///< Optional attribute. /// Attribute groupMaxIdleDuration of type xs:duration. @char* /*duration*/ groupMaxIdleDuration 0; ///< Optional attribute. }; /// "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":ResponseType is a complexType with complexContent extension of "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":HeaderBaseType. struct wsrm__ResponseType { /// INHERITED FROM wsrm__HeaderBaseType: /// TODO: /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). /// /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). // END OF INHERITED /// CHOICE OF ELEMENTS FOR choice maxOccurs="unbounded" int __size_ResponseType ; struct __wsrm__union_ResponseType { int __union_ResponseType ; ///< Union _wsrm__union_ResponseType selector: set to SOAP_UNION__wsrm__union_ResponseType_ /// Union for choice in type wsrm__ResponseType union _wsrm__union_ResponseType { /// Element NonSequenceReply of type "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":NonSequenceReplyType. struct wsrm__NonSequenceReplyType* NonSequenceReply 1; ///< Required element. /// Element SequenceReplies of type "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":SequenceRepliesType. struct wsrm__SequenceRepliesType* SequenceReplies 1; ///< Required element. } union_ResponseType ; } *__union_ResponseType ; // END OF CHOICE }; /// "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":NonSequenceReplyType is a complexType with complexContent extension of "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":ExtensibleType. struct wsrm__NonSequenceReplyType { /// INHERITED FROM wsrm__ExtensibleType: /// TODO: /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). /// /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). // END OF INHERITED /// Attribute groupId of type "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":MIDType. @wsrm__MIDType groupId 1; ///< Required attribute. /// Attribute fault of type "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":FaultCodeEnum. @enum wsrm__FaultCodeEnum* fault 0; ///< Optional attribute. }; /// "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":SequenceRepliesType is a complexType with complexContent extension of "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":ExtensibleType. struct wsrm__SequenceRepliesType { /// INHERITED FROM wsrm__ExtensibleType: /// TODO: /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). /// /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). // END OF INHERITED /// Size of array of struct wsrm__ReplyRangeType* is 1..unbounded int __sizeReplyRange ; /// Array of length 1..unbounded struct wsrm__ReplyRangeType* ReplyRange 1; /// Attribute groupId of type "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":MIDType. @wsrm__MIDType groupId 1; ///< Required attribute. }; /// "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":ReplyRangeType is a complexType with complexContent extension of "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":ExtensibleType. struct wsrm__ReplyRangeType { /// INHERITED FROM wsrm__ExtensibleType: /// TODO: /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). /// /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). // END OF INHERITED /// Attribute from of type xs:unsignedLong. @ULONG64 from 1; ///< Required attribute. /// Attribute to of type xs:unsignedLong. @ULONG64 to 1; ///< Required attribute. /// Attribute fault of type "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":FaultCodeEnum. @enum wsrm__FaultCodeEnum* fault 0; ///< Optional attribute. }; /// "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":RefToMessageIdsType is a complexType with complexContent extension of "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":EmptyType. struct wsrm__RefToMessageIdsType { /// INHERITED FROM wsrm__EmptyType: // END OF INHERITED /// Size of array of struct wsrm__SequenceNumRangeType* is 0..unbounded int __sizeSequenceNumRange ; /// Array of length 0..unbounded struct wsrm__SequenceNumRangeType* SequenceNumRange 0; /// Attribute groupId of type "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":MIDType. @wsrm__MIDType groupId 1; ///< Required attribute. }; /// "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":SequenceNumRangeType is a complexType with complexContent extension of "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":EmptyType. struct wsrm__SequenceNumRangeType { /// INHERITED FROM wsrm__EmptyType: // END OF INHERITED /// Attribute from of type xs:unsignedLong. @ULONG64 from 1; ///< Required attribute. /// Attribute to of type xs:unsignedLong. @ULONG64 to 1; ///< Required attribute. }; /// "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":PollRequestType is a complexType with complexContent extension of "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":HeaderBaseType. struct wsrm__PollRequestType { /// INHERITED FROM wsrm__HeaderBaseType: /// TODO: /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). /// /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). // END OF INHERITED /// Size of array of struct wsrm__RefToMessageIdsType* is 1..unbounded int __sizeRefToMessageIds ; /// Array of length 1..unbounded struct wsrm__RefToMessageIdsType* RefToMessageIds 1; /// Element ReplyTo of type "http://docs.oasis-open.org/wsrm/2004/06/reference-1.1.xsd":ServiceRefType. ref__ServiceRefType* ReplyTo 0; ///< Optional element. }; /// Element "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":Request of type "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":RequestType. typedef struct wsrm__RequestType _wsrm__Request; /// Element "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":Response of type "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":ResponseType. typedef struct wsrm__ResponseType _wsrm__Response; /// Element "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":PollRequest of type "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":PollRequestType. typedef struct wsrm__PollRequestType _wsrm__PollRequest; /// Element "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":BareURI of type "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":BareURIType. typedef wsrm__BareURIType _wsrm__BareURI; /* End of wsrm1.h */ gsoap-2.8.28/gsoap/import/WS-example.c0000644000175000017500000000466212653650146017055 0ustar ellertellert/* WS-example.c Example to demonstrate WS-Header.h -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2004-2008, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" #include "calc.nsmap" int main() { struct soap soap; struct SOAP_ENV__Header header; struct wsa__EndpointReferenceType replyTo; double n; soap_init(&soap); soap_default_SOAP_ENV__Header(&soap, &header); soap_default_wsa__EndpointReferenceType(&soap, &replyTo); replyTo.Address = "http://websrv.cs.fsu.edu/~engelen/calcclient.cgi"; header.wsa__MessageID = "uuid:aaaabbbb-cccc-dddd-eeee-ffffffffffff"; header.wsa__ReplyTo = &replyTo; header.wsa__To = "http://websrv.cs.fsu.edu/~engelen/calcserver.cgi"; header.wsa__Action = "http://websrv.cs.fsu.edu/~engelen/result"; soap.header = &header; printf("Testing: the WS-Addressing request send to the calc server is not understood:\n"); if (soap_call_ns__add(&soap, NULL, NULL, 1, 2, &n)) soap_print_fault(&soap, stderr); else printf("1 + 2 = %g\n", n); soap_end(&soap); soap_done(&soap); return 0; } gsoap-2.8.28/gsoap/import/wst.h0000644000175000017500000014270312653650146015714 0ustar ellertellert/* wst.h WS-Trust 2005/12 Generated with: wsdl2h -cuyx -o wst.h -t WS/WS-typemap.dat WS/WS-Trust.xsd - Removed //gsoapopt - Changed http://docs.oasis-open.org/ws-sx/ws-trust/200512 to remove trailing / - Changed //gsoap wst schema namespace directive to import directive - Added #import "wstx.h" at the end of these definitions */ /******************************************************************************\ * * * Definitions * * http://docs.oasis-open.org/ws-sx/ws-trust/200512/ * * * \******************************************************************************/ /******************************************************************************\ * * * Import * * * \******************************************************************************/ #import "wsse.h" // wsse = #import "wsu.h" // wsu = #import "wsa5.h" // wsa5 = /******************************************************************************\ * * * Schema Namespaces * * * \******************************************************************************/ #define SOAP_NAMESPACE_OF_wst "http://docs.oasis-open.org/ws-sx/ws-trust/200512" //gsoap wst schema import: http://docs.oasis-open.org/ws-sx/ws-trust/200512 //gsoap wst schema elementForm: qualified //gsoap wst schema attributeForm: unqualified /******************************************************************************\ * * * Built-in Schema Types and Top-Level Elements and Attributes * * * \******************************************************************************/ // Imported XSD type ""http://www.w3.org/2005/08/addressing":EndpointReferenceType" defined by wsa5__EndpointReferenceType. /// Imported element ""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":SecurityTokenReference" from typemap "/Users/engelen/Projects/gsoap/WS/WS-typemap.dat". /// @brief Typedef synonym for struct wst__RequestSecurityTokenType. typedef struct wst__RequestSecurityTokenType wst__RequestSecurityTokenType; /// @brief Typedef synonym for struct wst__RequestSecurityTokenResponseType. typedef struct wst__RequestSecurityTokenResponseType wst__RequestSecurityTokenResponseType; /// Imported complexType "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestedSecurityTokenType from typemap "/Users/engelen/Projects/gsoap/WS/WS-typemap.dat". #import "saml1.h" typedef struct wst__RequestedSecurityTokenType { saml1__AssertionType *saml1__Assertion; _wsse__SecurityTokenReference *wsse__SecurityTokenReference; } wst__RequestedSecurityTokenType; /// @brief Typedef synonym for struct wst__BinarySecretType. typedef struct wst__BinarySecretType wst__BinarySecretType; /// @brief Typedef synonym for struct wst__ClaimsType. typedef struct wst__ClaimsType wst__ClaimsType; /// Imported complexType "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":EntropyType from typemap "/Users/engelen/Projects/gsoap/WS/WS-typemap.dat". typedef struct wst__EntropyType { struct wst__BinarySecretType *BinarySecret; } wst__EntropyType; /// @brief Typedef synonym for struct wst__LifetimeType. typedef struct wst__LifetimeType wst__LifetimeType; /// @brief Typedef synonym for struct wst__RequestSecurityTokenCollectionType. typedef struct wst__RequestSecurityTokenCollectionType wst__RequestSecurityTokenCollectionType; /// @brief Typedef synonym for struct wst__RequestSecurityTokenResponseCollectionType. typedef struct wst__RequestSecurityTokenResponseCollectionType wst__RequestSecurityTokenResponseCollectionType; /// @brief Typedef synonym for struct wst__RequestedReferenceType. typedef struct wst__RequestedReferenceType wst__RequestedReferenceType; /// @brief Typedef synonym for struct wst__RequestedProofTokenType. typedef struct wst__RequestedProofTokenType wst__RequestedProofTokenType; /// @brief Typedef synonym for struct wst__RenewTargetType. typedef struct wst__RenewTargetType wst__RenewTargetType; /// @brief Typedef synonym for struct wst__AllowPostdatingType. typedef struct wst__AllowPostdatingType wst__AllowPostdatingType; /// @brief Typedef synonym for struct wst__RenewingType. typedef struct wst__RenewingType wst__RenewingType; /// @brief Typedef synonym for struct wst__CancelTargetType. typedef struct wst__CancelTargetType wst__CancelTargetType; /// @brief Typedef synonym for struct wst__RequestedTokenCancelledType. typedef struct wst__RequestedTokenCancelledType wst__RequestedTokenCancelledType; /// @brief Typedef synonym for struct wst__ValidateTargetType. typedef struct wst__ValidateTargetType wst__ValidateTargetType; /// @brief Typedef synonym for struct wst__StatusType. typedef struct wst__StatusType wst__StatusType; /// @brief Typedef synonym for struct wst__SignChallengeType. typedef struct wst__SignChallengeType wst__SignChallengeType; /// @brief Typedef synonym for struct wst__BinaryExchangeType. typedef struct wst__BinaryExchangeType wst__BinaryExchangeType; /// @brief Typedef synonym for struct wst__RequestKETType. typedef struct wst__RequestKETType wst__RequestKETType; /// @brief Typedef synonym for struct wst__KeyExchangeTokenType. typedef struct wst__KeyExchangeTokenType wst__KeyExchangeTokenType; /// @brief Typedef synonym for struct wst__AuthenticatorType. typedef struct wst__AuthenticatorType wst__AuthenticatorType; /// @brief Typedef synonym for struct wst__OnBehalfOfType. typedef struct wst__OnBehalfOfType wst__OnBehalfOfType; /// @brief Typedef synonym for struct wst__EncryptionType. typedef struct wst__EncryptionType wst__EncryptionType; /// @brief Typedef synonym for struct wst__ProofEncryptionType. typedef struct wst__ProofEncryptionType wst__ProofEncryptionType; /// @brief Typedef synonym for struct wst__UseKeyType. typedef struct wst__UseKeyType wst__UseKeyType; /// @brief Typedef synonym for struct wst__DelegateToType. typedef struct wst__DelegateToType wst__DelegateToType; /// @brief Typedef synonym for struct wst__ParticipantsType. typedef struct wst__ParticipantsType wst__ParticipantsType; /// @brief Typedef synonym for struct wst__ParticipantType. typedef struct wst__ParticipantType wst__ParticipantType; /******************************************************************************\ * * * Schema Types and Top-Level Elements and Attributes * * http://docs.oasis-open.org/ws-sx/ws-trust/200512/ * * * \******************************************************************************/ /// @brief Union of values from member types "wst:RequestTypeEnum xs:anyURI". typedef char* wst__RequestTypeOpenEnum; /// @brief Union of values from member types "wst:BinarySecretTypeEnum xs:anyURI". typedef char* wst__BinarySecretTypeOpenEnum; /// @brief Union of values from member types "wst:ComputedKeyEnum xs:anyURI". typedef char* wst__ComputedKeyOpenEnum; /// @brief Union of values from member types "wst:StatusCodeEnum xs:anyURI". typedef char* wst__StatusCodeOpenEnum; /// @brief Union of values from member types "wst:KeyTypeEnum xs:anyURI". typedef char* wst__KeyTypeOpenEnum; /// Imported simpleType "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestTypeEnum from typemap "/Users/engelen/Projects/gsoap/WS/WS-typemap.dat". // simpleType definition intentionally left blank. /// Imported simpleType "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":BinarySecretTypeEnum from typemap "/Users/engelen/Projects/gsoap/WS/WS-typemap.dat". // simpleType definition intentionally left blank. /// Imported simpleType "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":ComputedKeyEnum from typemap "/Users/engelen/Projects/gsoap/WS/WS-typemap.dat". // simpleType definition intentionally left blank. /// Imported simpleType "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":StatusCodeEnum from typemap "/Users/engelen/Projects/gsoap/WS/WS-typemap.dat". // simpleType definition intentionally left blank. /// Imported simpleType "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":KeyTypeEnum from typemap "/Users/engelen/Projects/gsoap/WS/WS-typemap.dat". // simpleType definition intentionally left blank. /******************************************************************************\ * * * Schema Complex Types and Top-Level Elements * * http://docs.oasis-open.org/ws-sx/ws-trust/200512/ * * * \******************************************************************************/ /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestSecurityTokenType is a complexType. /// ///
/// Actual content model is non-deterministic, hence wildcard. The following shows intended content model: /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// ///
struct wst__RequestSecurityTokenType { /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). /// Attribute "Context" of XSD type xs:anyURI. @char* Context 0; ///< Optional attribute. /// @todo . /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). /// Member declared in /Users/engelen/Projects/gsoap/WS/WS-typemap.dat char* TokenType; /// Member declared in /Users/engelen/Projects/gsoap/WS/WS-typemap.dat wst__RequestTypeOpenEnum RequestType; /// Member declared in /Users/engelen/Projects/gsoap/WS/WS-typemap.dat unsigned int* KeySize; /// Member declared in /Users/engelen/Projects/gsoap/WS/WS-typemap.dat struct wst__BinaryExchangeType* BinaryExhange; }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestSecurityTokenResponseType is a complexType. /// ///
/// Actual content model is non-deterministic, hence wildcard. The following shows intended content model: /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// ///
struct wst__RequestSecurityTokenResponseType { /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). /// Attribute "Context" of XSD type xs:anyURI. @char* Context 0; ///< Optional attribute. /// @todo . /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). /// Member declared in /Users/engelen/Projects/gsoap/WS/WS-typemap.dat char* TokenType; /// Member declared in /Users/engelen/Projects/gsoap/WS/WS-typemap.dat struct wst__RequestedSecurityTokenType* RequestedSecurityToken; /// Member declared in /Users/engelen/Projects/gsoap/WS/WS-typemap.dat struct wst__BinaryExchangeType* BinaryExhange; }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":ClaimsType is a complexType. /// struct wst__ClaimsType { /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). /// Attribute "Dialect" of XSD type xs:anyURI. @char* Dialect 0; ///< Optional attribute. /// @todo . /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":LifetimeType is a complexType. /// struct wst__LifetimeType { /// Imported element reference "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd":Created. char* wsu__Created 0; ///< Optional element. /// Imported element reference "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd":Expires. char* wsu__Expires 0; ///< Optional element. }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestSecurityTokenCollectionType is a complexType. /// ///
/// The RequestSecurityTokenCollection (RSTC) element is used to provide multiple RST requests. One or more RSTR elements in an RSTRC element are returned in the response to the RequestSecurityTokenCollection. ///
struct wst__RequestSecurityTokenCollectionType { /// Size of array of struct wst__RequestSecurityTokenType* is 2..unbounded. $int __sizeRequestSecurityToken 2; /// Array struct wst__RequestSecurityTokenType* of size 2..unbounded. struct wst__RequestSecurityTokenType* RequestSecurityToken 2; }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestSecurityTokenResponseCollectionType is a complexType. /// ///
/// The element (RSTRC) MUST be used to return a security token or response to a security token request on the final response. ///
struct wst__RequestSecurityTokenResponseCollectionType { /// Size of the dynamic array of struct wst__RequestSecurityTokenResponseType* is 1..unbounded. $int __sizeRequestSecurityTokenResponse 1; /// Array struct wst__RequestSecurityTokenResponseType* of size 1..unbounded. struct wst__RequestSecurityTokenResponseType* RequestSecurityTokenResponse 1; /// @todo . /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestedReferenceType is a complexType. /// struct wst__RequestedReferenceType { /// Imported element reference "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":SecurityTokenReference. _wsse__SecurityTokenReference wsse__SecurityTokenReference 1; ///< Required element. }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestedProofTokenType is a complexType. /// struct wst__RequestedProofTokenType { /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RenewTargetType is a complexType. /// struct wst__RenewTargetType { /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":AllowPostdatingType is a complexType. /// struct wst__AllowPostdatingType { }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RenewingType is a complexType. /// struct wst__RenewingType { /// Attribute "Allow" of XSD type xs:boolean. @char* Allow 0; ///< Optional attribute. /// Attribute "OK" of XSD type xs:boolean. @char* OK 0; ///< Optional attribute. }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":CancelTargetType is a complexType. /// struct wst__CancelTargetType { /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestedTokenCancelledType is a complexType. /// struct wst__RequestedTokenCancelledType { }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":ValidateTargetType is a complexType. /// struct wst__ValidateTargetType { /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":StatusType is a complexType. /// struct wst__StatusType { /// Element "Code" of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":StatusCodeOpenEnum. wst__StatusCodeOpenEnum Code 1; ///< Required element. /// Element "Reason" of XSD type xs:string. char* Reason 0; ///< Optional element. }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":SignChallengeType is a complexType. /// struct wst__SignChallengeType { /// Element reference "http://docs.oasis-open.org/ws-sx/ws-trust/200512/:""http://docs.oasis-open.org/ws-sx/ws-trust/200512/":Challenge. char* Challenge 1; ///< Required element. /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). /// @todo . /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestKETType is a complexType. /// struct wst__RequestKETType { }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":KeyExchangeTokenType is a complexType. /// struct wst__KeyExchangeTokenType { /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":AuthenticatorType is a complexType. /// struct wst__AuthenticatorType { /// Element reference "http://docs.oasis-open.org/ws-sx/ws-trust/200512/:""http://docs.oasis-open.org/ws-sx/ws-trust/200512/":CombinedHash. char* CombinedHash 0; ///< Optional element. /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":OnBehalfOfType is a complexType. /// struct wst__OnBehalfOfType { /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":EncryptionType is a complexType. /// struct wst__EncryptionType { /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":ProofEncryptionType is a complexType. /// struct wst__ProofEncryptionType { /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":UseKeyType is a complexType. /// struct wst__UseKeyType { /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). /// Attribute "Sig" of XSD type xs:anyURI. @char* Sig 0; ///< Optional attribute. }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":DelegateToType is a complexType. /// struct wst__DelegateToType { /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":ParticipantsType is a complexType. /// struct wst__ParticipantsType { /// Element "Primary" of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":ParticipantType. struct wst__ParticipantType* Primary 0; ///< Optional element. /// Size of array of struct wst__ParticipantType* is 0..unbounded. $int __sizeParticipant 0; /// Array struct wst__ParticipantType* of size 0..unbounded. struct wst__ParticipantType* Participant 0; /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":ParticipantType is a complexType. /// struct wst__ParticipantType { /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":BinarySecretType is a complexType with simpleContent. /// struct wst__BinarySecretType { /// __item wraps "xs:base64Binary" simpleContent. char* __item ; /// Attribute "Type" of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":BinarySecretTypeOpenEnum. @wst__BinarySecretTypeOpenEnum Type 0; ///< Optional attribute. /// @todo . /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":BinaryExchangeType is a complexType with simpleContent. /// struct wst__BinaryExchangeType { /// __item wraps "xs:string" simpleContent. char* __item ; /// Attribute "ValueType" of XSD type xs:anyURI. @char* ValueType 1; ///< Required attribute. /// Attribute "EncodingType" of XSD type xs:anyURI. @char* EncodingType 1; ///< Required attribute. /// @todo . /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /******************************************************************************\ * * * Additional Top-Level Elements * * http://docs.oasis-open.org/ws-sx/ws-trust/200512/ * * * \******************************************************************************/ /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestSecurityToken of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestSecurityTokenType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":TokenType of XSD type xs:anyURI. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestType of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestTypeOpenEnum. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestSecurityTokenResponse of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestSecurityTokenResponseType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestedSecurityToken of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestedSecurityTokenType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":BinarySecret of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":BinarySecretType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":Claims of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":ClaimsType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":Entropy of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":EntropyType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":Lifetime of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":LifetimeType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestSecurityTokenCollection of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestSecurityTokenCollectionType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestSecurityTokenResponseCollection of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestSecurityTokenResponseCollectionType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":ComputedKey of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":ComputedKeyOpenEnum. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestedAttachedReference of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestedReferenceType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestedUnattachedReference of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestedReferenceType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestedProofToken of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestedProofTokenType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":IssuedTokens of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestSecurityTokenResponseCollectionType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RenewTarget of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RenewTargetType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":AllowPostdating of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":AllowPostdatingType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":Renewing of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RenewingType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":CancelTarget of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":CancelTargetType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestedTokenCancelled of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestedTokenCancelledType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":ValidateTarget of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":ValidateTargetType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":Status of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":StatusType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":SignChallenge of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":SignChallengeType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":SignChallengeResponse of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":SignChallengeType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":Challenge of XSD type xs:string. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":BinaryExchange of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":BinaryExchangeType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestKET of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestKETType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":KeyExchangeToken of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":KeyExchangeTokenType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":Authenticator of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":AuthenticatorType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":CombinedHash of XSD type xs:base64Binary. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":OnBehalfOf of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":OnBehalfOfType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":Issuer of XSD type "http://www.w3.org/2005/08/addressing":EndpointReferenceType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":AuthenticationType of XSD type xs:anyURI. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":KeyType of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":KeyTypeOpenEnum. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":KeySize of XSD type xs:unsignedInt. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":SignatureAlgorithm of XSD type xs:anyURI. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":EncryptionAlgorithm of XSD type xs:anyURI. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":CanonicalizationAlgorithm of XSD type xs:anyURI. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":ComputedKeyAlgorithm of XSD type xs:anyURI. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":Encryption of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":EncryptionType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":ProofEncryption of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":ProofEncryptionType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":UseKey of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":UseKeyType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":KeyWrapAlgorithm of XSD type xs:anyURI. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":SignWith of XSD type xs:anyURI. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":EncryptWith of XSD type xs:anyURI. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":DelegateTo of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":DelegateToType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":Forwardable of XSD type xs:boolean. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":Delegatable of XSD type xs:boolean. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":Participants of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":ParticipantsType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /******************************************************************************\ * * * Additional Top-Level Attributes * * http://docs.oasis-open.org/ws-sx/ws-trust/200512/ * * * \******************************************************************************/ /******************************************************************************\ * * * XML Data Binding * * * \******************************************************************************/ /** @page page_XMLDataBinding XML Data Binding SOAP/XML services use data bindings contractually bound by WSDL and auto- generated by wsdl2h and soapcpp2 (see Service Bindings). Plain data bindings are adopted from XML schemas as part of the WSDL types section or when running wsdl2h on a set of schemas to produce non-SOAP-based XML data bindings. The following readers and writers are C/C++ data type (de)serializers auto- generated by wsdl2h and soapcpp2. Run soapcpp2 on this file to generate the (de)serialization code, which is stored in soapC.c[pp]. Include "soapH.h" in your code to import these data type and function declarations. Only use the soapcpp2-generated files in your project build. Do not include the wsdl2h- generated .h file in your code. Data can be read in XML and deserialized from: - a file descriptor, using soap->recvfd = fd - a socket, using soap->socket = ... - a C++ stream, using soap->is = ... - a buffer, using the soap->frecv() callback Data can be serialized in XML and written to: - a file descriptor, using soap->sendfd = fd - a socket, using soap->socket = ... - a C++ stream, using soap->os = ... - a buffer, using the soap->fsend() callback The following options are available for (de)serialization control: - soap->encodingStyle = NULL; to remove SOAP 1.1/1.2 encodingStyle - soap_mode(soap, SOAP_XML_TREE); XML without id-ref (no cycles!) - soap_mode(soap, SOAP_XML_GRAPH); XML with id-ref (including cycles) - soap_set_namespaces(soap, struct Namespace *nsmap); to set xmlns bindings @section wst Top-level root elements of schema "http://docs.oasis-open.org/ws-sx/ws-trust/200512/" - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) */ #import "wstx.h" /* End of wst.h */ gsoap-2.8.28/gsoap/import/wsdd.h0000644000175000017500000006575512653650146016053 0ustar ellertellert/* wsdd.h WS-Discovery 1.1 2009 with WS-Addressing 2005/08 Generated with: wsdl2h -cyex -o wsdd.h -t WS/WS-typemap.dat WS/discovery.xsd Modified by Robert van Engelen: - Removed //gsoapopt - Changed //gsoap wssd schema namespace directive to import directive - Added #import "wsdx.h" at the end of these definitions - Added #define SOAP_WSDD_2009 */ #define SOAP_WSDD_2009 /******************************************************************************\ * * * Definitions * * http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01 * * * \******************************************************************************/ /******************************************************************************\ * * * Import * * * \******************************************************************************/ #import "wsa5.h" // wsa5 = /******************************************************************************\ * * * Schema Namespaces * * * \******************************************************************************/ #define SOAP_NAMESPACE_OF_wsdd "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01" //gsoap wsdd schema import: http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01 //gsoap wsdd schema elementForm: qualified //gsoap wsdd schema attributeForm: unqualified /******************************************************************************\ * * * Built-in Schema Types and Top-Level Elements and Attributes * * * \******************************************************************************/ // Imported element "http://www.w3.org/2005/08/addressing":EndpointReference declared as _wsa5__EndpointReference /// Typedef synonym for struct wsdd__HelloType. typedef struct wsdd__HelloType wsdd__HelloType; /// Typedef synonym for struct wsdd__ByeType. typedef struct wsdd__ByeType wsdd__ByeType; /// Typedef synonym for struct wsdd__ProbeType. typedef struct wsdd__ProbeType wsdd__ProbeType; /// Typedef synonym for struct wsdd__ProbeMatchesType. typedef struct wsdd__ProbeMatchesType wsdd__ProbeMatchesType; /// Typedef synonym for struct wsdd__ProbeMatchType. typedef struct wsdd__ProbeMatchType wsdd__ProbeMatchType; /// Typedef synonym for struct wsdd__ResolveType. typedef struct wsdd__ResolveType wsdd__ResolveType; /// Typedef synonym for struct wsdd__ResolveMatchesType. typedef struct wsdd__ResolveMatchesType wsdd__ResolveMatchesType; /// Typedef synonym for struct wsdd__ResolveMatchType. typedef struct wsdd__ResolveMatchType wsdd__ResolveMatchType; /// Typedef synonym for struct wsdd__ScopesType. typedef struct wsdd__ScopesType wsdd__ScopesType; /// Typedef synonym for struct wsdd__SecurityType. typedef struct wsdd__SecurityType wsdd__SecurityType; /// Typedef synonym for struct wsdd__SigType. typedef struct wsdd__SigType wsdd__SigType; /// Typedef synonym for struct wsdd__AppSequenceType. typedef struct wsdd__AppSequenceType wsdd__AppSequenceType; /******************************************************************************\ * * * Schema Types and Top-Level Elements and Attributes * * http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01 * * * \******************************************************************************/ /// "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":QNameListType is a simpleType containing a whitespace separated list of xs:QName. typedef _QName wsdd__QNameListType; /// "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":UriListType is a simpleType containing a whitespace separated list of xs:anyURI. typedef char* wsdd__UriListType; /// union of values "tns:FaultCodeType xs:QName" typedef char* wsdd__FaultCodeOpenType; /// "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":FaultCodeType is a simpleType restriction of xs:QName. enum wsdd__FaultCodeType { wsdd__MatchingRuleNotSupported, ///< xs:QName value=""http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":MatchingRuleNotSupported" }; /// Typedef synonym for enum wsdd__FaultCodeType. typedef enum wsdd__FaultCodeType wsdd__FaultCodeType; /******************************************************************************\ * * * Schema Complex Types and Top-Level Elements * * http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01 * * * \******************************************************************************/ /// "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":HelloType is a complexType. struct wsdd__HelloType { /// Imported element reference "http://www.w3.org/2005/08/addressing":EndpointReference. _wsa5__EndpointReference wsa5__EndpointReference 1; ///< Required element. /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Types. wsdd__QNameListType Types 0; ///< Optional element. /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Scopes. struct wsdd__ScopesType* Scopes 0; ///< Optional element. /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":XAddrs. wsdd__UriListType XAddrs 0; ///< Optional element. /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":MetadataVersion. unsigned int MetadataVersion 1; ///< Required element. /// TODO: /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). /// /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":ByeType is a complexType. struct wsdd__ByeType { /// Imported element reference "http://www.w3.org/2005/08/addressing":EndpointReference. _wsa5__EndpointReference wsa5__EndpointReference 1; ///< Required element. /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Types. wsdd__QNameListType Types 0; ///< Optional element. /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Scopes. struct wsdd__ScopesType* Scopes 0; ///< Optional element. /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":XAddrs. wsdd__UriListType XAddrs 0; ///< Optional element. /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":MetadataVersion. unsigned int* MetadataVersion 0; ///< Optional element. /// TODO: /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). /// /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":ProbeType is a complexType. struct wsdd__ProbeType { /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Types. wsdd__QNameListType Types 0; ///< Optional element. /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Scopes. struct wsdd__ScopesType* Scopes 0; ///< Optional element. /// TODO: /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). /// /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":ProbeMatchesType is a complexType. struct wsdd__ProbeMatchesType { /// Size of array of struct wsdd__ProbeMatchType* is 0..unbounded $int __sizeProbeMatch 0; /// Array struct wsdd__ProbeMatchType* of length 0..unbounded struct wsdd__ProbeMatchType* ProbeMatch 0; /// TODO: /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). /// /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":ProbeMatchType is a complexType. struct wsdd__ProbeMatchType { /// Imported element reference "http://www.w3.org/2005/08/addressing":EndpointReference. _wsa5__EndpointReference wsa5__EndpointReference 1; ///< Required element. /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Types. wsdd__QNameListType Types 0; ///< Optional element. /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Scopes. struct wsdd__ScopesType* Scopes 0; ///< Optional element. /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":XAddrs. wsdd__UriListType XAddrs 0; ///< Optional element. /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":MetadataVersion. unsigned int MetadataVersion 1; ///< Required element. /// TODO: /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). /// /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":ResolveType is a complexType. struct wsdd__ResolveType { /// Imported element reference "http://www.w3.org/2005/08/addressing":EndpointReference. _wsa5__EndpointReference wsa5__EndpointReference 1; ///< Required element. /// TODO: /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). /// /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":ResolveMatchesType is a complexType. struct wsdd__ResolveMatchesType { /// Element ResolveMatch of type "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":ResolveMatchType. struct wsdd__ResolveMatchType* ResolveMatch 0; ///< Optional element. /// TODO: /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). /// /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":ResolveMatchType is a complexType. struct wsdd__ResolveMatchType { /// Imported element reference "http://www.w3.org/2005/08/addressing":EndpointReference. _wsa5__EndpointReference wsa5__EndpointReference 1; ///< Required element. /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Types. wsdd__QNameListType Types 0; ///< Optional element. /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Scopes. struct wsdd__ScopesType* Scopes 0; ///< Optional element. /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":XAddrs. wsdd__UriListType XAddrs 0; ///< Optional element. /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":MetadataVersion. unsigned int MetadataVersion 1; ///< Required element. /// TODO: /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). /// /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":SecurityType is a complexType. struct wsdd__SecurityType { /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Sig. struct wsdd__SigType* Sig 0; ///< Optional element. /// /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":SigType is a complexType. struct wsdd__SigType { /// TODO: /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). /// Attribute Scheme of type xs:anyURI. @char* Scheme 1; ///< Required attribute. /// Attribute KeyId of type xs:base64Binary. @char* KeyId 0; ///< Optional attribute. /// Attribute Refs of type xs:IDREFS. @char* Refs 1; ///< Required attribute. /// Attribute Sig of type xs:base64Binary. @char* Sig 1; ///< Required attribute. /// /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":ScopesType is a complexType with simpleContent. struct wsdd__ScopesType { /// __item wraps '"http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":UriListType' simpleContent. wsdd__UriListType __item ; /// Attribute MatchBy of type xs:anyURI. @char* MatchBy 0; ///< Optional attribute. /// /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":AppSequenceType is a complexType with complexContent restriction of xs:anyType. struct wsdd__AppSequenceType { /// Attribute InstanceId of type xs:unsignedInt. @unsigned int InstanceId 1; ///< Required attribute. /// Attribute SequenceId of type xs:anyURI. @char* SequenceId 0; ///< Optional attribute. /// Attribute MessageNumber of type xs:unsignedInt. @unsigned int MessageNumber 1; ///< Required attribute. /// /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /******************************************************************************\ * * * Additional Top-Level Elements * * http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01 * * * \******************************************************************************/ /// Top-level root element "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Hello of type "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":HelloType. /// Note: use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// Top-level root element "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Bye of type "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":ByeType. /// Note: use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// Top-level root element "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Probe of type "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":ProbeType. /// Note: use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// Top-level root element "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":ProbeMatches of type "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":ProbeMatchesType. /// Note: use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// Top-level root element "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Resolve of type "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":ResolveType. /// Note: use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// Top-level root element "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":ResolveMatches of type "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":ResolveMatchesType. /// Note: use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// Top-level root element "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Types of type "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":QNameListType. /// Note: use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// Top-level root element "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Scopes of type "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":ScopesType. /// Note: use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// Top-level root element "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":XAddrs of type "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":UriListType. /// Note: use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// Top-level root element "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":MetadataVersion of type xs:unsignedInt. /// Note: use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// Top-level root element "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":SupportedMatchingRules of type "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":UriListType. /// Note: use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// Top-level root element "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Security of type "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":SecurityType. /// Note: use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// Top-level root element "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Sig of type "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":SigType. /// Note: use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// Top-level root element "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":AppSequence of type "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":AppSequenceType. /// Note: use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /******************************************************************************\ * * * Additional Top-Level Attributes * * http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01 * * * \******************************************************************************/ /// Top-level attribute "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Id of simpleType xs:ID. /// Note: use wsdl2h option -g to auto-generate a top-level attribute declaration and processing code. /******************************************************************************\ * * * XML Data Binding * * * \******************************************************************************/ /** @page page_XMLDataBinding XML Data Binding SOAP/XML services use data bindings contractually bound by WSDL and auto- generated by wsdl2h and soapcpp2 (see Service Bindings). Plain data bindings are adopted from XML schemas as part of the WSDL types section or when running wsdl2h on a set of schemas to produce non-SOAP-based XML data bindings. The following readers and writers are C/C++ data type (de)serializers auto- generated by wsdl2h and soapcpp2. Run soapcpp2 on this file to generate the (de)serialization code, which is stored in soapC.c[pp]. Include "soapH.h" in your code to import these data type and function declarations. Only use the soapcpp2-generated files in your project build. Do not include the wsdl2h- generated .h file in your code. XML content can be retrieved from: - a file descriptor, using soap->recvfd = fd - a socket, using soap->socket = ... - a C++ stream, using soap->is = ... - a buffer, using the soap->frecv() callback XML content can be stored to: - a file descriptor, using soap->sendfd = fd - a socket, using soap->socket = ... - a C++ stream, using soap->os = ... - a buffer, using the soap->fsend() callback @section wsdd Top-level root elements of schema "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01" - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) */ #import "wsdx.h" /* End of wsdd2.h */ gsoap-2.8.28/gsoap/import/xmime5.h0000644000175000017500000000561412653650146016302 0ustar ellertellert/* xmime5.h Use #import "xmime5.h" in a gSOAP header file to enable xmlmime 2005/05 bindings. The xmime5:contentType attribute can be used to associate a MIME type with binary content, as in: #import "xmime5.h" struct ns__myBinaryData { unsigned char *__ptr; int __size; @char *xmime5__contentType; }; Use soapcpp2 option -Ipath:path:... to specify the path(s) for #import gSOAP XML Web services tools Copyright (C) 2000-2005, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under one of the following licenses: GPL, the gSOAP public license, or Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2005 Robert A. van Engelen, Genivia inc. All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap xmime5 schema import: http://www.w3.org/2005/05/xmlmime //gsoap xmime5 schema namespace2: http://www.w3.org/2004/11/xmlmime /** base64 type, can be used as MIME attachment (when id and type are set) */ struct xmime5__base64Binary { unsigned char *__ptr; int __size; char *id; char *type; char *options; }; typedef struct xmime5__base64Binary xmime5__base64Binary; gsoap-2.8.28/gsoap/import/wsrx5.h0000644000175000017500000002404412653650146016164 0ustar ellertellert/* wsrx5.h WS-ReliableMessaging definitions: SOAP Header definitions for WS-RM 1.0 2005 WS-RM Operations for CreateSequence, CloseSequence, TerminateSequence WS-RM SequenceAcknowledgement server operation (RM dest for AcksTo) Note: changed TerminateSequenceResponse to TerminateSequence Imported by import/wsrm5.h gSOAP XML Web services tools Copyright (C) 2000-2012, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under ONE of the following licenses: GPL, or the gSOAP public license, or Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2012, Robert van Engelen, Genivia Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ struct SOAP_ENV__Header { struct wsrm__SequenceType *wsrm__Sequence 0; int __sizeAckRequested 0; struct wsrm__AckRequestedType *wsrm__AckRequested 0; int __sizeSequenceAcknowledgement 0; struct _wsrm__SequenceAcknowledgement *wsrm__SequenceAcknowledgement 0; struct wsrm__SequenceFaultType *wsrm__SequenceFault 0; }; //gsoap wsrm service name: wsrm //gsoap wsrm service method-header-part: CreateSequence wsa5__MessageID //gsoap wsrm service method-header-part: CreateSequence wsa5__RelatesTo //gsoap wsrm service method-header-part: CreateSequence wsa5__From //gsoap wsrm service method-header-part: CreateSequence wsa5__ReplyTo //gsoap wsrm service method-header-part: CreateSequence wsa5__FaultTo //gsoap wsrm service method-header-part: CreateSequence wsa5__To //gsoap wsrm service method-header-part: CreateSequence wsa5__Action //gsoap wsrm service method-action: CreateSequence http://schemas.xmlsoap.org/ws/2005/02/rm/CreateSequence //gsoap wsrm service method-output-action: CreateSequence http://schemas.xmlsoap.org/ws/2005/02/rm/CreateSequenceResponse int __wsrm__CreateSequence( struct wsrm__CreateSequenceType *wsrm__CreateSequence, struct wsrm__CreateSequenceResponseType *wsrm__CreateSequenceResponse); //gsoap wsrm service method-header-part: CloseSequence wsa5__MessageID //gsoap wsrm service method-header-part: CloseSequence wsa5__RelatesTo //gsoap wsrm service method-header-part: CloseSequence wsa5__From //gsoap wsrm service method-header-part: CloseSequence wsa5__ReplyTo //gsoap wsrm service method-header-part: CloseSequence wsa5__FaultTo //gsoap wsrm service method-header-part: CloseSequence wsa5__To //gsoap wsrm service method-header-part: CloseSequence wsa5__Action //gsoap wsrm service method-action: CloseSequence http://schemas.xmlsoap.org/ws/2005/02/rm/CloseSequence //gsoap wsrm service method-output-action: CloseSequence http://schemas.xmlsoap.org/ws/2005/02/rm/CloseSequenceResponse int __wsrm__CloseSequence( struct wsrm__CloseSequenceType *wsrm__CloseSequence, struct wsrm__CloseSequenceResponseType *wsrm__CloseSequenceResponse); //gsoap wsrm service method-header-part: TerminateSequence wsa5__MessageID //gsoap wsrm service method-header-part: TerminateSequence wsa5__RelatesTo //gsoap wsrm service method-header-part: TerminateSequence wsa5__From //gsoap wsrm service method-header-part: TerminateSequence wsa5__ReplyTo //gsoap wsrm service method-header-part: TerminateSequence wsa5__FaultTo //gsoap wsrm service method-header-part: TerminateSequence wsa5__To //gsoap wsrm service method-header-part: TerminateSequence wsa5__Action //gsoap wsrm service method-action: TerminateSequence http://schemas.xmlsoap.org/ws/2005/02/rm/TerminateSequence //gsoap wsrm service method-output-action: TerminateSequence http://schemas.xmlsoap.org/ws/2005/02/rm/TerminateSequence int __wsrm__TerminateSequence( struct wsrm__TerminateSequenceType *wsrm__TerminateSequence, struct wsrm__TerminateSequenceResponseType *wsrm__TerminateSequence_); //gsoap wsrm service method-header-part: CreateSequenceResponse wsa5__MessageID //gsoap wsrm service method-header-part: CreateSequenceResponse wsa5__RelatesTo //gsoap wsrm service method-header-part: CreateSequenceResponse wsa5__From //gsoap wsrm service method-header-part: CreateSequenceResponse wsa5__ReplyTo //gsoap wsrm service method-header-part: CreateSequenceResponse wsa5__FaultTo //gsoap wsrm service method-header-part: CreateSequenceResponse wsa5__To //gsoap wsrm service method-header-part: CreateSequenceResponse wsa5__Action //gsoap wsrm service method-action: CreateSequenceResponse http://schemas.xmlsoap.org/ws/2005/02/rm/CreateSequenceResponse int __wsrm__CreateSequenceResponse(struct wsrm__CreateSequenceResponseType *wsrm__CreateSequenceResponse, void); //gsoap wsrm service method-header-part: CloseSequenceResponse wsa5__MessageID //gsoap wsrm service method-header-part: CloseSequenceResponse wsa5__RelatesTo //gsoap wsrm service method-header-part: CloseSequenceResponse wsa5__From //gsoap wsrm service method-header-part: CloseSequenceResponse wsa5__ReplyTo //gsoap wsrm service method-header-part: CloseSequenceResponse wsa5__FaultTo //gsoap wsrm service method-header-part: CloseSequenceResponse wsa5__To //gsoap wsrm service method-header-part: CloseSequenceResponse wsa5__Action //gsoap wsrm service method-action: CloseSequenceResponse http://schemas.xmlsoap.org/ws/2005/02/rm/CloseSequenceResponse int __wsrm__CloseSequenceResponse(struct wsrm__CloseSequenceResponseType *wsrm__CloseSequenceResponse, void); //gsoap wsrm service method-header-part: TerminateSequenceResponse wsa5__MessageID //gsoap wsrm service method-header-part: TerminateSequenceResponse wsa5__RelatesTo //gsoap wsrm service method-header-part: TerminateSequenceResponse wsa5__From //gsoap wsrm service method-header-part: TerminateSequenceResponse wsa5__ReplyTo //gsoap wsrm service method-header-part: TerminateSequenceResponse wsa5__FaultTo //gsoap wsrm service method-header-part: TerminateSequenceResponse wsa5__To //gsoap wsrm service method-header-part: TerminateSequenceResponse wsa5__Action //gsoap wsrm service method-action: TerminateSequenceResponse http://schemas.xmlsoap.org/ws/2005/02/rm/TerminateSequenceResponse int __wsrm__TerminateSequenceResponse(struct wsrm__TerminateSequenceResponseType *wsrm__TerminateSequenceResponse, void); //gsoap wsrm service method-header-part: SequenceAcknowledgement wsa5__MessageID //gsoap wsrm service method-header-part: SequenceAcknowledgement wsa5__RelatesTo //gsoap wsrm service method-header-part: SequenceAcknowledgement wsa5__From //gsoap wsrm service method-header-part: SequenceAcknowledgement wsa5__ReplyTo //gsoap wsrm service method-header-part: SequenceAcknowledgement wsa5__FaultTo //gsoap wsrm service method-header-part: SequenceAcknowledgement wsa5__To //gsoap wsrm service method-header-part: SequenceAcknowledgement wsa5__Action //gsoap wsrm service method-action: SequenceAcknowledgement http://schemas.xmlsoap.org/ws/2005/02/rm/SequenceAcknowledgement int __wsrm__SequenceAcknowledgement(void); //gsoap wsrm service method-header-part: AckRequested wsa5__MessageID //gsoap wsrm service method-header-part: AckRequested wsa5__RelatesTo //gsoap wsrm service method-header-part: AckRequested wsa5__From //gsoap wsrm service method-header-part: AckRequested wsa5__ReplyTo //gsoap wsrm service method-header-part: AckRequested wsa5__FaultTo //gsoap wsrm service method-header-part: AckRequested wsa5__To //gsoap wsrm service method-header-part: AckRequested wsa5__Action //gsoap wsrm service method-action: AckRequested http://schemas.xmlsoap.org/ws/2005/02/rm/AckRequested int __wsrm__AckRequested(void); //gsoap wsrm service method-header-part: LastMessage wsa5__MessageID //gsoap wsrm service method-header-part: LastMessage wsa5__RelatesTo //gsoap wsrm service method-header-part: LastMessage wsa5__From //gsoap wsrm service method-header-part: LastMessage wsa5__ReplyTo //gsoap wsrm service method-header-part: LastMessage wsa5__FaultTo //gsoap wsrm service method-header-part: LastMessage wsa5__To //gsoap wsrm service method-header-part: LastMessage wsa5__Action //gsoap wsrm service method-action: LastMessage http://schemas.xmlsoap.org/ws/2005/02/rm/LastMessage int __wsrm__LastMessage(void); gsoap-2.8.28/gsoap/import/ds.h0000644000175000017500000004621612653650146015507 0ustar ellertellert/* ds.h Generated with: wsdl2h -cuxy -o ds.h -t WS/WS-typemap.dat WS/ds.xsd - Removed //gsoapopt - Added //gsoap ds schema import: http://www.w3.org/2000/09/xmldsig# */ /******************************************************************************\ * * * http://www.w3.org/2000/09/xmldsig# * * * \******************************************************************************/ /******************************************************************************\ * * * Import * * * \******************************************************************************/ /******************************************************************************\ * * * Schema Namespaces * * * \******************************************************************************/ //gsoap ds schema import: http://www.w3.org/2000/09/xmldsig# //gsoap ds schema elementForm: qualified //gsoap ds schema attributeForm: unqualified /******************************************************************************\ * * * Schema Types * * * \******************************************************************************/ /// Imported complexType "http://www.w3.org/2000/09/xmldsig#":SignatureType from typemap WS/WS-typemap.dat. typedef struct ds__SignatureType { struct ds__SignedInfoType* SignedInfo; char* SignatureValue; struct ds__KeyInfoType* KeyInfo; @char* Id; } ds__SignatureType, _ds__Signature; /// Imported complexType "http://www.w3.org/2000/09/xmldsig#":SignatureValueType from typemap WS/WS-typemap.dat. /// complexType definition intentionally left blank. /// Typedef synonym for struct ds__SignedInfoType. typedef struct ds__SignedInfoType ds__SignedInfoType; /// Typedef synonym for struct ds__CanonicalizationMethodType. typedef struct ds__CanonicalizationMethodType ds__CanonicalizationMethodType; /// Typedef synonym for struct ds__SignatureMethodType. typedef struct ds__SignatureMethodType ds__SignatureMethodType; /// Typedef synonym for struct ds__ReferenceType. typedef struct ds__ReferenceType ds__ReferenceType; /// Typedef synonym for struct ds__TransformsType. typedef struct ds__TransformsType ds__TransformsType; /// Imported complexType "http://www.w3.org/2000/09/xmldsig#":TransformType from typemap WS/WS-typemap.dat. #import "c14n.h" typedef struct ds__TransformType { _c14n__InclusiveNamespaces* c14n__InclusiveNamespaces; _XML __any; @char* Algorithm; } ds__TransformType, _ds__Transform; /// Typedef synonym for struct ds__DigestMethodType. typedef struct ds__DigestMethodType ds__DigestMethodType; #import "wsse.h" /// Imported complexType "http://www.w3.org/2000/09/xmldsig#":KeyInfoType from typemap WS/WS-typemap.dat. typedef struct ds__KeyInfoType { char* KeyName; struct ds__KeyValueType* KeyValue; struct ds__RetrievalMethodType* RetrievalMethod; struct ds__X509DataType* X509Data; struct _wsse__SecurityTokenReference* wsse__SecurityTokenReference; @char* Id; } ds__KeyInfoType, _ds__KeyInfo; /// Typedef synonym for struct ds__KeyValueType. typedef struct ds__KeyValueType ds__KeyValueType; /// Typedef synonym for struct ds__RetrievalMethodType. typedef struct ds__RetrievalMethodType ds__RetrievalMethodType; /// Typedef synonym for struct ds__X509DataType. typedef struct ds__X509DataType ds__X509DataType; /// Typedef synonym for struct ds__X509IssuerSerialType. typedef struct ds__X509IssuerSerialType ds__X509IssuerSerialType; /// Imported complexType "http://www.w3.org/2000/09/xmldsig#":PGPDataType from typemap WS/WS-typemap.dat. /// complexType definition intentionally left blank. /// Imported complexType "http://www.w3.org/2000/09/xmldsig#":SPKIDataType from typemap WS/WS-typemap.dat. /// complexType definition intentionally left blank. /// Imported complexType "http://www.w3.org/2000/09/xmldsig#":ObjectType from typemap WS/WS-typemap.dat. /// complexType definition intentionally left blank. /// Imported complexType "http://www.w3.org/2000/09/xmldsig#":ManifestType from typemap WS/WS-typemap.dat. /// complexType definition intentionally left blank. /// Imported complexType "http://www.w3.org/2000/09/xmldsig#":SignaturePropertiesType from typemap WS/WS-typemap.dat. /// complexType definition intentionally left blank. /// Imported complexType "http://www.w3.org/2000/09/xmldsig#":SignaturePropertyType from typemap WS/WS-typemap.dat. /// complexType definition intentionally left blank. /// Typedef synonym for struct ds__DSAKeyValueType. typedef struct ds__DSAKeyValueType ds__DSAKeyValueType; /// Typedef synonym for struct ds__RSAKeyValueType. typedef struct ds__RSAKeyValueType ds__RSAKeyValueType; /// Imported simpleType "http://www.w3.org/2000/09/xmldsig#":CryptoBinary from typemap WS/WS-typemap.dat. /// simpleType definition intentionally left blank. /// Imported simpleType "http://www.w3.org/2000/09/xmldsig#":DigestValueType from typemap WS/WS-typemap.dat. /// simpleType definition intentionally left blank. /// Imported simpleType "http://www.w3.org/2000/09/xmldsig#":HMACOutputLengthType from typemap WS/WS-typemap.dat. /// simpleType definition intentionally left blank. /// "http://www.w3.org/2000/09/xmldsig#":SignedInfoType is a complexType. struct ds__SignedInfoType { /// Element reference "http://www.w3.org/2000/09/xmldsig#":CanonicalizationMethod. struct ds__CanonicalizationMethodType* CanonicalizationMethod 1; ///< Required element. /// Element reference "http://www.w3.org/2000/09/xmldsig#":SignatureMethod. struct ds__SignatureMethodType* SignatureMethod 1; ///< Required element. /// Size of the dynamic array of struct ds__ReferenceType* is 0..unbounded int __sizeReference ; /// Pointer to array of struct ds__ReferenceType*. struct ds__ReferenceType* *Reference 1; /// Attribute Id of type xs:ID. @char* /*ID*/ Id 0; ///< Optional attribute. }; /// "http://www.w3.org/2000/09/xmldsig#":CanonicalizationMethodType is a complexType. struct ds__CanonicalizationMethodType { /// TODO: /// Schema extensibility is user-definable. /// Consult the protocol documentation to change and/or insert declarations. /// Use wsdl2h option -x to remove this element. /// Attribute Algorithm of type xs:anyURI. @char* /*URI*/ Algorithm 1; ///< Required attribute. /// Member declared in WS/WS-typemap.dat _c14n__InclusiveNamespaces* c14n__InclusiveNamespaces; }; /// "http://www.w3.org/2000/09/xmldsig#":SignatureMethodType is a complexType. struct ds__SignatureMethodType { /// Element HMACOutputLength of type "http://www.w3.org/2000/09/xmldsig#":HMACOutputLengthType. int* HMACOutputLength 0; ///< Optional element. /// TODO: /// Schema extensibility is user-definable. /// Consult the protocol documentation to change and/or insert declarations. /// Use wsdl2h option -x to remove this element. /// Attribute Algorithm of type xs:anyURI. @char* /*URI*/ Algorithm 1; ///< Required attribute. }; /// "http://www.w3.org/2000/09/xmldsig#":ReferenceType is a complexType. struct ds__ReferenceType { /// Element reference "http://www.w3.org/2000/09/xmldsig#":Transforms. struct ds__TransformsType* Transforms 0; ///< Optional element. /// Element reference "http://www.w3.org/2000/09/xmldsig#":DigestMethod. struct ds__DigestMethodType* DigestMethod 1; ///< Required element. /// Element reference "http://www.w3.org/2000/09/xmldsig#":DigestValue. char* /*base64*/ DigestValue 1; ///< Required element. /// Attribute Id of type xs:ID. @char* /*ID*/ Id 0; ///< Optional attribute. /// Attribute URI of type xs:anyURI. @char* /*URI*/ URI 0; ///< Optional attribute. /// Attribute Type of type xs:anyURI. @char* /*URI*/ Type 0; ///< Optional attribute. }; /// "http://www.w3.org/2000/09/xmldsig#":TransformsType is a complexType. struct ds__TransformsType { /// Size of the dynamic array of ds__TransformType is 0..unbounded int __sizeTransform ; /// Pointer to array of ds__TransformType. ds__TransformType *Transform 1; }; /// "http://www.w3.org/2000/09/xmldsig#":DigestMethodType is a complexType. struct ds__DigestMethodType { /// TODO: /// Schema extensibility is user-definable. /// Consult the protocol documentation to change and/or insert declarations. /// Use wsdl2h option -x to remove this element. /// Attribute Algorithm of type xs:anyURI. @char* /*URI*/ Algorithm 1; ///< Required attribute. }; /// "http://www.w3.org/2000/09/xmldsig#":KeyValueType is a complexType. struct ds__KeyValueType { /// CHOICE OF ELEMENTS /// Element reference "http://www.w3.org/2000/09/xmldsig#":DSAKeyValue. struct ds__DSAKeyValueType* DSAKeyValue 0; ///< Required element. /// Element reference "http://www.w3.org/2000/09/xmldsig#":RSAKeyValue. struct ds__RSAKeyValueType* RSAKeyValue 0; ///< Required element. /// TODO: /// Schema extensibility is user-definable. /// Consult the protocol documentation to change and/or insert declarations. /// Use wsdl2h option -x to remove this element. // END OF CHOICE }; /// "http://www.w3.org/2000/09/xmldsig#":RetrievalMethodType is a complexType. struct ds__RetrievalMethodType { /// Element reference "http://www.w3.org/2000/09/xmldsig#":Transforms. struct ds__TransformsType* Transforms 0; ///< Optional element. /// Attribute URI of type xs:anyURI. @char* /*URI*/ URI 0; ///< Optional attribute. /// Attribute Type of type xs:anyURI. @char* /*URI*/ Type 0; ///< Optional attribute. }; /// "http://www.w3.org/2000/09/xmldsig#":X509DataType is a complexType. struct ds__X509DataType { /// CHOICE OF ELEMENTS /// Element X509IssuerSerial of type "http://www.w3.org/2000/09/xmldsig#":X509IssuerSerialType. struct ds__X509IssuerSerialType* X509IssuerSerial 0; ///< Required element. /// Element X509SKI of type xs:base64Binary. char* /*base64*/ X509SKI 0; ///< Required element. /// Element X509SubjectName of type xs:string. char* X509SubjectName 0; ///< Required element. /// Element X509Certificate of type xs:base64Binary. char* /*base64*/ X509Certificate 0; ///< Required element. /// Element X509CRL of type xs:base64Binary. char* /*base64*/ X509CRL 0; ///< Required element. /// TODO: /// Schema extensibility is user-definable. /// Consult the protocol documentation to change and/or insert declarations. /// Use wsdl2h option -x to remove this element. // END OF CHOICE }; /// "http://www.w3.org/2000/09/xmldsig#":X509IssuerSerialType is a complexType. struct ds__X509IssuerSerialType { /// Element X509IssuerName of type xs:string. char* X509IssuerName 1; ///< Required element. /// Element X509SerialNumber of type xs:integer. char* X509SerialNumber 1; ///< Required element. }; /// "http://www.w3.org/2000/09/xmldsig#":DSAKeyValueType is a complexType. struct ds__DSAKeyValueType { /// Element G of type "http://www.w3.org/2000/09/xmldsig#":CryptoBinary. char* /*base64*/ G 0; ///< Optional element. /// Element Y of type "http://www.w3.org/2000/09/xmldsig#":CryptoBinary. char* /*base64*/ Y 1; ///< Required element. /// Element J of type "http://www.w3.org/2000/09/xmldsig#":CryptoBinary. char* /*base64*/ J 0; ///< Optional element. /// Element P of type "http://www.w3.org/2000/09/xmldsig#":CryptoBinary. char* /*base64*/ P 1; ///< Required element. /// Element Q of type "http://www.w3.org/2000/09/xmldsig#":CryptoBinary. char* /*base64*/ Q 1; ///< Required element. /// Element Seed of type "http://www.w3.org/2000/09/xmldsig#":CryptoBinary. char* /*base64*/ Seed 1; ///< Required element. /// Element PgenCounter of type "http://www.w3.org/2000/09/xmldsig#":CryptoBinary. char* /*base64*/ PgenCounter 1; ///< Required element. }; /// "http://www.w3.org/2000/09/xmldsig#":RSAKeyValueType is a complexType. struct ds__RSAKeyValueType { /// Element Modulus of type "http://www.w3.org/2000/09/xmldsig#":CryptoBinary. char* /*base64*/ Modulus 1; ///< Required element. /// Element Exponent of type "http://www.w3.org/2000/09/xmldsig#":CryptoBinary. char* /*base64*/ Exponent 1; ///< Required element. }; /// Element "http://www.w3.org/2000/09/xmldsig#":Signature of complexType "http://www.w3.org/2000/09/xmldsig#":SignatureType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":SignatureValue of complexType "http://www.w3.org/2000/09/xmldsig#":SignatureValueType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":SignedInfo of complexType "http://www.w3.org/2000/09/xmldsig#":SignedInfoType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":CanonicalizationMethod of complexType "http://www.w3.org/2000/09/xmldsig#":CanonicalizationMethodType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":SignatureMethod of complexType "http://www.w3.org/2000/09/xmldsig#":SignatureMethodType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":Reference of complexType "http://www.w3.org/2000/09/xmldsig#":ReferenceType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":Transforms of complexType "http://www.w3.org/2000/09/xmldsig#":TransformsType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":Transform of complexType "http://www.w3.org/2000/09/xmldsig#":TransformType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":DigestMethod of complexType "http://www.w3.org/2000/09/xmldsig#":DigestMethodType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":DigestValue of complexType "http://www.w3.org/2000/09/xmldsig#":DigestValueType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":KeyInfo of complexType "http://www.w3.org/2000/09/xmldsig#":KeyInfoType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":KeyName of complexType xs:string. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":MgmtData of complexType xs:string. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":KeyValue of complexType "http://www.w3.org/2000/09/xmldsig#":KeyValueType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":RetrievalMethod of complexType "http://www.w3.org/2000/09/xmldsig#":RetrievalMethodType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":X509Data of complexType "http://www.w3.org/2000/09/xmldsig#":X509DataType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":PGPData of complexType "http://www.w3.org/2000/09/xmldsig#":PGPDataType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":SPKIData of complexType "http://www.w3.org/2000/09/xmldsig#":SPKIDataType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":Object of complexType "http://www.w3.org/2000/09/xmldsig#":ObjectType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":Manifest of complexType "http://www.w3.org/2000/09/xmldsig#":ManifestType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":SignatureProperties of complexType "http://www.w3.org/2000/09/xmldsig#":SignaturePropertiesType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":SignatureProperty of complexType "http://www.w3.org/2000/09/xmldsig#":SignaturePropertyType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":DSAKeyValue of complexType "http://www.w3.org/2000/09/xmldsig#":DSAKeyValueType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":RSAKeyValue of complexType "http://www.w3.org/2000/09/xmldsig#":RSAKeyValueType. /// Note: use wsdl2h option -g to generate this global element declaration. /* End of ds.h */ gsoap-2.8.28/gsoap/import/xmime.h0000644000175000017500000000511112653650146016205 0ustar ellertellert/* xmime.h Use #import "xmime.h" in a gSOAP header file to enable xmlmime 2004/06 bindings. The xmime:contentType attribute can be used to associate a MIME type with binary content, as in: #import "xmime.h" struct ns__myBinaryData { unsigned char *__ptr; int __size; @char *xmime__contentType; }; Use soapcpp2 option -Ipath:path:... to specify the path(s) for #import gSOAP XML Web services tools Copyright (C) 2000-2005, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under one of the following licenses: GPL, the gSOAP public license, or Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2005 Robert A. van Engelen, Genivia inc. All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap xmime schema import: http://www.w3.org/2004/06/xmlmime gsoap-2.8.28/gsoap/import/wsse.h0000644000175000017500000003137512653650146016062 0ustar ellertellert/* wsse.h 1.0 and 1.1 Generated with: wsdl2h -cegxy -o wsse.h -t WS/WS-typemap.dat WS/wsse.xsd - Removed //gsoapopt - Added //gsoap wsse schema import: http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd - Added //gsoap wsse schema namespace2: http://docs.oasis-open.org/wss/oasis-wss-wssecurity-secext-1.1.xsd - Added mutable SOAP_ENV__Header struct */ /******************************************************************************\ * * * http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd* * * \******************************************************************************/ /******************************************************************************\ * * * Import * * * \******************************************************************************/ #import "wsu.h" // wsu = /******************************************************************************\ * * * Schema Namespaces * * * \******************************************************************************/ //gsoap wsse schema import: http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd //gsoap wsse schema namespace2: http://docs.oasis-open.org/wss/oasis-wss-wssecurity-secext-1.1.xsd //gsoap wsse schema elementForm: qualified //gsoap wsse schema attributeForm: unqualified /******************************************************************************\ * * * Schema Types * * * \******************************************************************************/ /// Imported complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":AttributedString from typemap WS/WS-typemap.dat. /// @brief This type represents an element with arbitrary attributes. /// complexType definition intentionally left blank. /// Imported complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":PasswordString from typemap WS/WS-typemap.dat. /// @brief This type is used for password elements per Section 4.1. /// complexType definition intentionally left blank. /// Imported complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":EncodedString from typemap WS/WS-typemap.dat. /// @brief This type is used for elements containing stringified binary data. /// complexType definition intentionally left blank. /// Imported complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":UsernameTokenType from typemap WS/WS-typemap.dat. /// @brief This type represents a username token per Section 4.1 /// complexType definition intentionally left blank. /// Imported complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":BinarySecurityTokenType from typemap WS/WS-typemap.dat. /// @brief A security token that is encoded in binary /// complexType definition intentionally left blank. /// Imported complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":KeyIdentifierType from typemap WS/WS-typemap.dat. /// @brief A security token key identifier /// complexType definition intentionally left blank. /// Imported complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":ReferenceType from typemap WS/WS-typemap.dat. /// @brief This type represents a reference to an external security token. /// complexType definition intentionally left blank. /// Imported complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":EmbeddedType from typemap WS/WS-typemap.dat. /// @brief This type represents a reference to an embedded security token. /// complexType definition intentionally left blank. /// Imported complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":SecurityTokenReferenceType from typemap WS/WS-typemap.dat. /// @brief This type is used reference a security token. /// complexType definition intentionally left blank. /// Imported complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":SecurityHeaderType from typemap WS/WS-typemap.dat. /// @brief This complexType defines header block to use for security-relevant data directed at a specific SOAP actor. /// complexType definition intentionally left blank. /// Imported complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":TransformationParametersType from typemap WS/WS-typemap.dat. /// @brief This complexType defines a container for elements to be specified from any namespace as properties/parameters of a DSIG transformation. /// complexType definition intentionally left blank. /// Imported simpleType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":tUsage from typemap WS/WS-typemap.dat. /// @brief Typedef to allow a list of usages (as URIs). /// simpleType definition intentionally left blank. /// "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":FaultcodeEnum is a simpleType restriction of xs:QName. enum wsse__FaultcodeEnum { wsse__UnsupportedSecurityToken, ///< xs:QName value=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":UnsupportedSecurityToken" wsse__UnsupportedAlgorithm, ///< xs:QName value=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":UnsupportedAlgorithm" wsse__InvalidSecurity, ///< xs:QName value=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":InvalidSecurity" wsse__InvalidSecurityToken, ///< xs:QName value=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":InvalidSecurityToken" wsse__FailedAuthentication, ///< xs:QName value=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":FailedAuthentication" wsse__FailedCheck, ///< xs:QName value=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":FailedCheck" wsse__SecurityTokenUnavailable, ///< xs:QName value=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":SecurityTokenUnavailable" }; /// Typedef synonym for enum wsse__FaultcodeEnum. typedef enum wsse__FaultcodeEnum wsse__FaultcodeEnum; /// Element "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":UsernameToken of complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":UsernameTokenType. /// @brief This element defines the wsse:UsernameToken element per Section 4.1. /// Imported element _wsse__UsernameToken from typemap WS/WS-typemap.dat. typedef struct _wsse__UsernameToken { char* Username; struct _wsse__Password* Password; char* Nonce; char* wsu__Created; @char* wsu__Id; } _wsse__UsernameToken; /// Element "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":BinarySecurityToken of complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":BinarySecurityTokenType. /// @brief This element defines the wsse:BinarySecurityToken element per Section 4.2. /// Imported element _wsse__BinarySecurityToken from typemap WS/WS-typemap.dat. typedef struct _wsse__BinarySecurityToken { char* __item; @char* wsu__Id; @char* ValueType; @char* EncodingType; } _wsse__BinarySecurityToken; /// Element "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":Reference of complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":ReferenceType. /// @brief This element defines a security token reference /// Imported element _wsse__Reference from typemap WS/WS-typemap.dat. typedef struct _wsse__Reference { @char* URI; @char* ValueType; } _wsse__Reference; /// Element "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":Embedded of complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":EmbeddedType. /// @brief This element defines a security token embedded reference /// Imported element _wsse__Embedded from typemap WS/WS-typemap.dat. typedef struct _wsse__Embedded { /* Extensible with embedded tokens and assertions */ @char* wsu__Id; @char* ValueType; } _wsse__Embedded; /// Element "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":KeyIdentifier of complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":KeyIdentifierType. /// @brief This element defines a key identifier reference /// Imported element _wsse__KeyIdentifier from typemap WS/WS-typemap.dat. typedef struct _wsse__KeyIdentifier { char* __item; @char* wsu__Id; @char* ValueType; @char* EncodingType; } _wsse__KeyIdentifier; /// Element "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":SecurityTokenReference of complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":SecurityTokenReferenceType. /// @brief This element defines the wsse:SecurityTokenReference per Section 4.3. /// Imported element _wsse__SecurityTokenReference from typemap WS/WS-typemap.dat. typedef struct _wsse__SecurityTokenReference { struct _wsse__Reference* Reference; struct _wsse__KeyIdentifier* KeyIdentifier; struct _wsse__Embedded* Embedded; struct ds__X509DataType* ds__X509Data; @char* wsu__Id; @char* wsc__Instance; @char* Usage; } _wsse__SecurityTokenReference; /// Element "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":Security of complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":SecurityHeaderType. /// @brief This element defines the wsse:Security SOAP header element per Section 4. /// Imported element _wsse__Security from typemap WS/WS-typemap.dat. #import "xenc.h" #import "wsc.h" typedef struct _wsse__Security { struct _wsu__Timestamp* wsu__Timestamp; struct _wsse__UsernameToken* UsernameToken; struct _wsse__BinarySecurityToken* BinarySecurityToken; struct xenc__EncryptedKeyType* xenc__EncryptedKey; struct _xenc__ReferenceList* xenc__ReferenceList; struct wsc__SecurityContextTokenType* wsc__SecurityContextToken; struct ds__SignatureType* ds__Signature; @char* SOAP_ENV__actor; @char* SOAP_ENV__role; } _wsse__Security; /// Element "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":TransformationParameters of complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":TransformationParametersType. /// @brief This element contains properties for transformations from any namespace, including DSIG. /// '_wsse__TransformationParameters' element definition intentionally left blank. /// Element "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":Password of complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":PasswordString. /// Imported element _wsse__Password from typemap WS/WS-typemap.dat. typedef struct _wsse__Password { char* __item; @char* Type; } _wsse__Password; /// Element "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":Nonce of complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":EncodedString. /// '_wsse__Nonce' element definition intentionally left blank. /// Attribute "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":Usage of simpleType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":tUsage. /// @brief This global attribute is used to indicate the usage of a referenced or indicated token within the containing context /// '_wsse__Usage' attribute definition intentionally left blank. mutable struct SOAP_ENV__Header { mustUnderstand _wsse__Security *wsse__Security 0; }; /* End of wsse.h */ gsoap-2.8.28/gsoap/import/wstx.h0000644000175000017500000000745112653650146016104 0ustar ellertellert/* wstx.h WS-Trust definitions: SOAP Header definitions for WS-Trust 2005/12 WS-Trust operations Imported by import/wst.h gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc., All Rights Reserved. This part of the software is released under ONE of the following licenses: GPL, or the gSOAP public license, or Genivia's license for commercial use. -------------------------------------------------------------------------------- gSOAP public license. The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.cs.fsu.edu/~engelen/soaplicense.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Initial Developer of the Original Code is Robert A. van Engelen. Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc., All Rights Reserved. -------------------------------------------------------------------------------- GPL license. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org This program is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ mutable struct SOAP_ENV__Header { int __sizeIssuedTokens 0; ///< size of the array struct wst__RequestSecurityTokenResponseCollectionType *wst__IssuedTokens 0; ///< array of tokens wst__RequestTypeOpenEnum wst__RequestType 0; }; //gsoap wst service name: wst //gsoap wst service method-header-part: RequestSecurityToken wsa5__MessageID //gsoap wst service method-header-part: RequestSecurityToken wsa5__RelatesTo //gsoap wst service method-header-part: RequestSecurityToken wsa5__From //gsoap wst service method-header-part: RequestSecurityToken wsa5__ReplyTo //gsoap wst service method-header-part: RequestSecurityToken wsa5__FaultTo //gsoap wst service method-header-part: RequestSecurityToken wsa5__To //gsoap wst service method-header-part: RequestSecurityToken wsa5__Action //gsoap wst service method-header-part: RequestSecurityToken wst__RequestType //gsoap wst service method-action: RequestSecurityToken http://docs.oasis-open.org/ws-sx/ws-trust/200512/RST/Issue //gsoap wst service method-output-action: RequestSecurityToken http://docs.oasis-open.org/ws-sx/ws-trust/200512/RSTR/Issue //gsoap wst service method-output-action: RequestSecurityToken http://docs.oasis-open.org/ws-sx/ws-trust/200512/RSTRC/IssueFinal int __wst__RequestSecurityToken( struct wst__RequestSecurityTokenType *wst__RequestSecurityToken, ///< request message struct wst__RequestSecurityTokenResponseType *wst__RequestSecurityTokenResponse ///< response message ); gsoap-2.8.28/gsoap/import/saml1.h0000644000175000017500000010464112653650146016113 0ustar ellertellert/* saml1.h Generated with: wsdl2h -cuyx -o saml1.h -t WS/WS-typemap.dat WS/oasis-sstc-saml-schema-assertion-1.1.xsd - Removed //gsoapopt - Changed //gsoap saml1 schema namespace directive to import directive */ /******************************************************************************\ * * * Definitions * * urn:oasis:names:tc:SAML:1.0:assertion * * * \******************************************************************************/ /******************************************************************************\ * * * Import * * * \******************************************************************************/ #import "ds.h" // ds = /******************************************************************************\ * * * Schema Namespaces * * * \******************************************************************************/ ///
/// Document identifier: oasis-sstc-saml-schema-assertion-1.1 /// Location: http://www.oasis-open.org/committees/documents.php?wg_abbrev=security /// Revision history: /// V1.0 (November, 2002): /// Initial standard schema. /// V1.1 (September, 2003): /// * Note that V1.1 of this schema has the same XML namespace as V1.0. /// Rebased ID content directly on XML Schema types /// Added DoNotCacheCondition element and DoNotCacheConditionType ///
#define SOAP_NAMESPACE_OF_saml1 "urn:oasis:names:tc:SAML:1.0:assertion" //gsoap saml1 schema import: urn:oasis:names:tc:SAML:1.0:assertion //gsoap saml1 schema form: unqualified /******************************************************************************\ * * * Built-in Schema Types and Top-Level Elements and Attributes * * * \******************************************************************************/ // Imported element ""http://www.w3.org/2000/09/xmldsig#":KeyInfo" declared as _ds__KeyInfo. // Imported element ""http://www.w3.org/2000/09/xmldsig#":Signature" declared as _ds__Signature. /// @brief Typedef synonym for struct saml1__AssertionType. typedef struct saml1__AssertionType saml1__AssertionType; /// @brief Typedef synonym for struct saml1__ConditionsType. typedef struct saml1__ConditionsType saml1__ConditionsType; /// @brief Typedef synonym for struct saml1__ConditionAbstractType. typedef struct saml1__ConditionAbstractType saml1__ConditionAbstractType; /// @brief Typedef synonym for struct saml1__AudienceRestrictionConditionType. typedef struct saml1__AudienceRestrictionConditionType saml1__AudienceRestrictionConditionType; /// @brief Typedef synonym for struct saml1__DoNotCacheConditionType. typedef struct saml1__DoNotCacheConditionType saml1__DoNotCacheConditionType; /// @brief Typedef synonym for struct saml1__AdviceType. typedef struct saml1__AdviceType saml1__AdviceType; /// @brief Typedef synonym for struct saml1__StatementAbstractType. typedef struct saml1__StatementAbstractType saml1__StatementAbstractType; /// @brief Typedef synonym for struct saml1__SubjectStatementAbstractType. typedef struct saml1__SubjectStatementAbstractType saml1__SubjectStatementAbstractType; /// @brief Typedef synonym for struct saml1__SubjectType. typedef struct saml1__SubjectType saml1__SubjectType; /// @brief Typedef synonym for struct saml1__NameIdentifierType. typedef struct saml1__NameIdentifierType saml1__NameIdentifierType; /// @brief Typedef synonym for struct saml1__SubjectConfirmationType. typedef struct saml1__SubjectConfirmationType saml1__SubjectConfirmationType; /// @brief Typedef synonym for struct saml1__AuthenticationStatementType. typedef struct saml1__AuthenticationStatementType saml1__AuthenticationStatementType; /// @brief Typedef synonym for struct saml1__SubjectLocalityType. typedef struct saml1__SubjectLocalityType saml1__SubjectLocalityType; /// @brief Typedef synonym for struct saml1__AuthorityBindingType. typedef struct saml1__AuthorityBindingType saml1__AuthorityBindingType; /// @brief Typedef synonym for struct saml1__AuthorizationDecisionStatementType. typedef struct saml1__AuthorizationDecisionStatementType saml1__AuthorizationDecisionStatementType; /// @brief Typedef synonym for struct saml1__ActionType. typedef struct saml1__ActionType saml1__ActionType; /// @brief Typedef synonym for struct saml1__EvidenceType. typedef struct saml1__EvidenceType saml1__EvidenceType; /// @brief Typedef synonym for struct saml1__AttributeStatementType. typedef struct saml1__AttributeStatementType saml1__AttributeStatementType; /// @brief Typedef synonym for struct saml1__AttributeDesignatorType. typedef struct saml1__AttributeDesignatorType saml1__AttributeDesignatorType; /// @brief Typedef synonym for struct saml1__AttributeType. typedef struct saml1__AttributeType saml1__AttributeType; /******************************************************************************\ * * * Schema Types and Top-Level Elements and Attributes * * urn:oasis:names:tc:SAML:1.0:assertion * * * \******************************************************************************/ /// @brief "urn:oasis:names:tc:SAML:1.0:assertion":DecisionType is a simpleType restriction of XSD type xs:string. /// /// @note The enum values are prefixed with "saml1__DecisionType__" to avoid name clashes, please use wsdl2h option -e to omit this prefix enum saml1__DecisionType { saml1__DecisionType__Permit, ///< xs:string value="Permit" saml1__DecisionType__Deny, ///< xs:string value="Deny" saml1__DecisionType__Indeterminate, ///< xs:string value="Indeterminate" }; /// @brief Typedef synonym for enum saml1__DecisionType. typedef enum saml1__DecisionType saml1__DecisionType; /******************************************************************************\ * * * Schema Complex Types and Top-Level Elements * * urn:oasis:names:tc:SAML:1.0:assertion * * * \******************************************************************************/ /// @brief "urn:oasis:names:tc:SAML:1.0:assertion":AssertionType is a complexType. /// struct saml1__AssertionType { /// Element reference "urn:oasis:names:tc:SAML:1.0:assertion:""urn:oasis:names:tc:SAML:1.0:assertion":Conditions. struct saml1__ConditionsType* saml1__Conditions 0; ///< Optional element. /// Element reference "urn:oasis:names:tc:SAML:1.0:assertion:""urn:oasis:names:tc:SAML:1.0:assertion":Advice. struct saml1__AdviceType* saml1__Advice 0; ///< Optional element. // BEGIN CHOICE $int __size_AssertionType 0; struct __saml1__union_AssertionType { /// Element reference "urn:oasis:names:tc:SAML:1.0:assertion:""urn:oasis:names:tc:SAML:1.0:assertion":Statement. struct saml1__StatementAbstractType* saml1__Statement ; /// Element reference "urn:oasis:names:tc:SAML:1.0:assertion:""urn:oasis:names:tc:SAML:1.0:assertion":SubjectStatement. struct saml1__SubjectStatementAbstractType* saml1__SubjectStatement ; /// Element reference "urn:oasis:names:tc:SAML:1.0:assertion:""urn:oasis:names:tc:SAML:1.0:assertion":AuthenticationStatement. struct saml1__AuthenticationStatementType* saml1__AuthenticationStatement; /// Element reference "urn:oasis:names:tc:SAML:1.0:assertion:""urn:oasis:names:tc:SAML:1.0:assertion":AuthorizationDecisionStatement. struct saml1__AuthorizationDecisionStatementType* saml1__AuthorizationDecisionStatement; /// Element reference "urn:oasis:names:tc:SAML:1.0:assertion:""urn:oasis:names:tc:SAML:1.0:assertion":AttributeStatement. struct saml1__AttributeStatementType* saml1__AttributeStatement ; } *__union_AssertionType ; // END OF CHOICE /// Imported element reference "http://www.w3.org/2000/09/xmldsig#":Signature. _ds__Signature* ds__Signature 0; ///< Optional element. /// Attribute "MajorVersion" of XSD type xs:integer. @char* MajorVersion 1; ///< Required attribute. /// Attribute "MinorVersion" of XSD type xs:integer. @char* MinorVersion 1; ///< Required attribute. /// Attribute "AssertionID" of XSD type xs:ID. @char* AssertionID 1; ///< Required attribute. /// Attribute "Issuer" of XSD type xs:string. @char* Issuer 1; ///< Required attribute. /// Attribute "IssueInstant" of XSD type xs:dateTime. @time_t IssueInstant 1; ///< Required attribute. }; /// @brief "urn:oasis:names:tc:SAML:1.0:assertion":ConditionsType is a complexType. /// struct saml1__ConditionsType { // BEGIN CHOICE $int __size_ConditionsType 0; struct __saml1__union_ConditionsType { /// Element reference "urn:oasis:names:tc:SAML:1.0:assertion:""urn:oasis:names:tc:SAML:1.0:assertion":AudienceRestrictionCondition. struct saml1__AudienceRestrictionConditionType* saml1__AudienceRestrictionCondition; /// Element reference "urn:oasis:names:tc:SAML:1.0:assertion:""urn:oasis:names:tc:SAML:1.0:assertion":DoNotCacheCondition. struct saml1__DoNotCacheConditionType* saml1__DoNotCacheCondition ; /// Element reference "urn:oasis:names:tc:SAML:1.0:assertion:""urn:oasis:names:tc:SAML:1.0:assertion":Condition. struct saml1__ConditionAbstractType* saml1__Condition ; } *__union_ConditionsType ; // END OF CHOICE /// Attribute "NotBefore" of XSD type xs:dateTime. @time_t* NotBefore 0; ///< Optional attribute. /// Attribute "NotOnOrAfter" of XSD type xs:dateTime. @time_t* NotOnOrAfter 0; ///< Optional attribute. }; /// @brief "urn:oasis:names:tc:SAML:1.0:assertion":ConditionAbstractType is an abstract complexType. /// struct saml1__ConditionAbstractType { }; /// @brief "urn:oasis:names:tc:SAML:1.0:assertion":AdviceType is a complexType. /// struct saml1__AdviceType { // BEGIN CHOICE $int __size_AdviceType 0; struct __saml1__union_AdviceType { /// Element reference "urn:oasis:names:tc:SAML:1.0:assertion:""urn:oasis:names:tc:SAML:1.0:assertion":AssertionIDReference. char* saml1__AssertionIDReference ; /// Element reference "urn:oasis:names:tc:SAML:1.0:assertion:""urn:oasis:names:tc:SAML:1.0:assertion":Assertion. struct saml1__AssertionType* saml1__Assertion ; /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). } *__union_AdviceType ; // END OF CHOICE }; /// @brief "urn:oasis:names:tc:SAML:1.0:assertion":StatementAbstractType is an abstract complexType. /// struct saml1__StatementAbstractType { }; /// @brief "urn:oasis:names:tc:SAML:1.0:assertion":SubjectType is a complexType. /// struct saml1__SubjectType { // BEGIN CHOICE /// @note with embedded or prevents the use of a union for . Instead of being members of a union, the following members are declared optional. Only one member should be non-NULL by choice. // BEGIN SEQUENCE /// Element reference "urn:oasis:names:tc:SAML:1.0:assertion:""urn:oasis:names:tc:SAML:1.0:assertion":NameIdentifier. struct saml1__NameIdentifierType* saml1__NameIdentifier ; /// Element reference "urn:oasis:names:tc:SAML:1.0:assertion:""urn:oasis:names:tc:SAML:1.0:assertion":SubjectConfirmation. struct saml1__SubjectConfirmationType* saml1__SubjectConfirmation ; // END OF SEQUENCE /// Element reference "urn:oasis:names:tc:SAML:1.0:assertion:""urn:oasis:names:tc:SAML:1.0:assertion":SubjectConfirmation. struct saml1__SubjectConfirmationType* saml1__SubjectConfirmation ; // END OF CHOICE }; /// @brief "urn:oasis:names:tc:SAML:1.0:assertion":SubjectConfirmationType is a complexType. /// struct saml1__SubjectConfirmationType { /// Size of the dynamic array of char** is 1..unbounded. $int __sizeConfirmationMethod 1; /// Array char** of size 1..unbounded. char** saml1__ConfirmationMethod 1; /// Element reference "urn:oasis:names:tc:SAML:1.0:assertion:""urn:oasis:names:tc:SAML:1.0:assertion":SubjectConfirmationData. _XML saml1__SubjectConfirmationData 0; ///< Optional element. /// Imported element reference "http://www.w3.org/2000/09/xmldsig#":KeyInfo. _ds__KeyInfo* ds__KeyInfo 0; ///< Optional element. }; /// @brief "urn:oasis:names:tc:SAML:1.0:assertion":SubjectLocalityType is a complexType. /// struct saml1__SubjectLocalityType { /// Attribute "IPAddress" of XSD type xs:string. @char* IPAddress 0; ///< Optional attribute. /// Attribute "DNSAddress" of XSD type xs:string. @char* DNSAddress 0; ///< Optional attribute. }; /// @brief "urn:oasis:names:tc:SAML:1.0:assertion":AuthorityBindingType is a complexType. /// struct saml1__AuthorityBindingType { /// Attribute "AuthorityKind" of XSD type xs:QName. @_QName AuthorityKind 1; ///< Required attribute. /// Attribute "Location" of XSD type xs:anyURI. @char* Location 1; ///< Required attribute. /// Attribute "Binding" of XSD type xs:anyURI. @char* Binding 1; ///< Required attribute. }; /// @brief "urn:oasis:names:tc:SAML:1.0:assertion":EvidenceType is a complexType. /// struct saml1__EvidenceType { // BEGIN CHOICE $int __size_EvidenceType 0; struct __saml1__union_EvidenceType { /// Element reference "urn:oasis:names:tc:SAML:1.0:assertion:""urn:oasis:names:tc:SAML:1.0:assertion":AssertionIDReference. char* saml1__AssertionIDReference ; /// Element reference "urn:oasis:names:tc:SAML:1.0:assertion:""urn:oasis:names:tc:SAML:1.0:assertion":Assertion. struct saml1__AssertionType* saml1__Assertion ; } *__union_EvidenceType ; // END OF CHOICE }; /// @brief "urn:oasis:names:tc:SAML:1.0:assertion":AttributeDesignatorType is a complexType. /// struct saml1__AttributeDesignatorType { /// Attribute "AttributeName" of XSD type xs:string. @char* AttributeName 1; ///< Required attribute. /// Attribute "AttributeNamespace" of XSD type xs:anyURI. @char* AttributeNamespace 1; ///< Required attribute. }; /// @brief "urn:oasis:names:tc:SAML:1.0:assertion":AudienceRestrictionConditionType is a complexType with complexContent extension of XSD type "urn:oasis:names:tc:SAML:1.0:assertion":ConditionAbstractType. /// struct saml1__AudienceRestrictionConditionType { /// INHERITED FROM saml1__ConditionAbstractType: // END OF INHERITED FROM saml1__ConditionAbstractType /// Size of the dynamic array of char** is 1..unbounded. $int __sizeAudience 1; /// Array char** of size 1..unbounded. char** saml1__Audience 1; }; /// @brief "urn:oasis:names:tc:SAML:1.0:assertion":DoNotCacheConditionType is a complexType with complexContent extension of XSD type "urn:oasis:names:tc:SAML:1.0:assertion":ConditionAbstractType. /// struct saml1__DoNotCacheConditionType { /// INHERITED FROM saml1__ConditionAbstractType: // END OF INHERITED FROM saml1__ConditionAbstractType }; /// @brief "urn:oasis:names:tc:SAML:1.0:assertion":SubjectStatementAbstractType is an abstract complexType with complexContent extension of XSD type "urn:oasis:names:tc:SAML:1.0:assertion":StatementAbstractType. /// struct saml1__SubjectStatementAbstractType { /// INHERITED FROM saml1__StatementAbstractType: // END OF INHERITED FROM saml1__StatementAbstractType /// Element reference "urn:oasis:names:tc:SAML:1.0:assertion:""urn:oasis:names:tc:SAML:1.0:assertion":Subject. struct saml1__SubjectType* saml1__Subject 1; ///< Required element. }; /// @brief "urn:oasis:names:tc:SAML:1.0:assertion":NameIdentifierType is a complexType with simpleContent. /// struct saml1__NameIdentifierType { /// __item wraps "xs:string" simpleContent. char* __item ; /// Attribute "NameQualifier" of XSD type xs:string. @char* NameQualifier 0; ///< Optional attribute. /// Attribute "Format" of XSD type xs:anyURI. @char* Format 0; ///< Optional attribute. }; /// @brief "urn:oasis:names:tc:SAML:1.0:assertion":ActionType is a complexType with simpleContent. /// struct saml1__ActionType { /// __item wraps "xs:string" simpleContent. char* __item ; /// Attribute "Namespace" of XSD type xs:anyURI. @char* Namespace 0; ///< Optional attribute. }; /// @brief "urn:oasis:names:tc:SAML:1.0:assertion":AttributeType is a complexType with complexContent extension of XSD type "urn:oasis:names:tc:SAML:1.0:assertion":AttributeDesignatorType. /// struct saml1__AttributeType { /// INHERITED FROM saml1__AttributeDesignatorType: /// Attribute "AttributeName" of XSD type xs:string. @char* AttributeName 1; ///< Required attribute. /// Attribute "AttributeNamespace" of XSD type xs:anyURI. @char* AttributeNamespace 1; ///< Required attribute. // END OF INHERITED FROM saml1__AttributeDesignatorType /// Size of the dynamic array of _XML* is 1..unbounded. $int __sizeAttributeValue 1; /// Array _XML* of size 1..unbounded. _XML* saml1__AttributeValue 1; }; /// @brief "urn:oasis:names:tc:SAML:1.0:assertion":AuthenticationStatementType is a complexType with complexContent extension of XSD type "urn:oasis:names:tc:SAML:1.0:assertion":SubjectStatementAbstractType. /// struct saml1__AuthenticationStatementType { /// INHERITED FROM saml1__StatementAbstractType: // END OF INHERITED FROM saml1__StatementAbstractType /// INHERITED FROM saml1__SubjectStatementAbstractType: /// Element reference "urn:oasis:names:tc:SAML:1.0:assertion:""urn:oasis:names:tc:SAML:1.0:assertion":Subject. struct saml1__SubjectType* saml1__Subject 1; ///< Required element. // END OF INHERITED FROM saml1__SubjectStatementAbstractType /// Element reference "urn:oasis:names:tc:SAML:1.0:assertion:""urn:oasis:names:tc:SAML:1.0:assertion":SubjectLocality. struct saml1__SubjectLocalityType* saml1__SubjectLocality 0; ///< Optional element. /// Size of the dynamic array of struct saml1__AuthorityBindingType* is 0..unbounded. $int __sizeAuthorityBinding 0; /// Array struct saml1__AuthorityBindingType* of size 0..unbounded. struct saml1__AuthorityBindingType* saml1__AuthorityBinding 0; /// Attribute "AuthenticationMethod" of XSD type xs:anyURI. @char* AuthenticationMethod 1; ///< Required attribute. /// Attribute "AuthenticationInstant" of XSD type xs:dateTime. @time_t AuthenticationInstant 1; ///< Required attribute. }; /// @brief "urn:oasis:names:tc:SAML:1.0:assertion":AuthorizationDecisionStatementType is a complexType with complexContent extension of XSD type "urn:oasis:names:tc:SAML:1.0:assertion":SubjectStatementAbstractType. /// struct saml1__AuthorizationDecisionStatementType { /// INHERITED FROM saml1__StatementAbstractType: // END OF INHERITED FROM saml1__StatementAbstractType /// INHERITED FROM saml1__SubjectStatementAbstractType: /// Element reference "urn:oasis:names:tc:SAML:1.0:assertion:""urn:oasis:names:tc:SAML:1.0:assertion":Subject. struct saml1__SubjectType* saml1__Subject 1; ///< Required element. // END OF INHERITED FROM saml1__SubjectStatementAbstractType /// Size of the dynamic array of struct saml1__ActionType* is 1..unbounded. $int __sizeAction 1; /// Array struct saml1__ActionType* of size 1..unbounded. struct saml1__ActionType* saml1__Action 1; /// Element reference "urn:oasis:names:tc:SAML:1.0:assertion:""urn:oasis:names:tc:SAML:1.0:assertion":Evidence. struct saml1__EvidenceType* saml1__Evidence 0; ///< Optional element. /// Attribute "Resource" of XSD type xs:anyURI. @char* Resource 1; ///< Required attribute. /// Attribute "Decision" of XSD type "urn:oasis:names:tc:SAML:1.0:assertion":DecisionType. @enum saml1__DecisionType Decision 1; ///< Required attribute. }; /// @brief "urn:oasis:names:tc:SAML:1.0:assertion":AttributeStatementType is a complexType with complexContent extension of XSD type "urn:oasis:names:tc:SAML:1.0:assertion":SubjectStatementAbstractType. /// struct saml1__AttributeStatementType { /// INHERITED FROM saml1__StatementAbstractType: // END OF INHERITED FROM saml1__StatementAbstractType /// INHERITED FROM saml1__SubjectStatementAbstractType: /// Element reference "urn:oasis:names:tc:SAML:1.0:assertion:""urn:oasis:names:tc:SAML:1.0:assertion":Subject. struct saml1__SubjectType* saml1__Subject 1; ///< Required element. // END OF INHERITED FROM saml1__SubjectStatementAbstractType /// Size of the dynamic array of struct saml1__AttributeType* is 1..unbounded. $int __sizeAttribute 1; /// Array struct saml1__AttributeType* of size 1..unbounded. struct saml1__AttributeType* saml1__Attribute 1; }; /******************************************************************************\ * * * Additional Top-Level Elements * * urn:oasis:names:tc:SAML:1.0:assertion * * * \******************************************************************************/ /// @brief Top-level root element "urn:oasis:names:tc:SAML:1.0:assertion":AssertionIDReference of XSD type xs:NCName. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "urn:oasis:names:tc:SAML:1.0:assertion":Assertion of XSD type "urn:oasis:names:tc:SAML:1.0:assertion":AssertionType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "urn:oasis:names:tc:SAML:1.0:assertion":Conditions of XSD type "urn:oasis:names:tc:SAML:1.0:assertion":ConditionsType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "urn:oasis:names:tc:SAML:1.0:assertion":Condition of XSD type "urn:oasis:names:tc:SAML:1.0:assertion":ConditionAbstractType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "urn:oasis:names:tc:SAML:1.0:assertion":AudienceRestrictionCondition of XSD type "urn:oasis:names:tc:SAML:1.0:assertion":AudienceRestrictionConditionType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "urn:oasis:names:tc:SAML:1.0:assertion":Audience of XSD type xs:anyURI. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "urn:oasis:names:tc:SAML:1.0:assertion":DoNotCacheCondition of XSD type "urn:oasis:names:tc:SAML:1.0:assertion":DoNotCacheConditionType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "urn:oasis:names:tc:SAML:1.0:assertion":Advice of XSD type "urn:oasis:names:tc:SAML:1.0:assertion":AdviceType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "urn:oasis:names:tc:SAML:1.0:assertion":Statement of XSD type "urn:oasis:names:tc:SAML:1.0:assertion":StatementAbstractType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "urn:oasis:names:tc:SAML:1.0:assertion":SubjectStatement of XSD type "urn:oasis:names:tc:SAML:1.0:assertion":SubjectStatementAbstractType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "urn:oasis:names:tc:SAML:1.0:assertion":Subject of XSD type "urn:oasis:names:tc:SAML:1.0:assertion":SubjectType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "urn:oasis:names:tc:SAML:1.0:assertion":NameIdentifier of XSD type "urn:oasis:names:tc:SAML:1.0:assertion":NameIdentifierType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "urn:oasis:names:tc:SAML:1.0:assertion":SubjectConfirmation of XSD type "urn:oasis:names:tc:SAML:1.0:assertion":SubjectConfirmationType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "urn:oasis:names:tc:SAML:1.0:assertion":SubjectConfirmationData of XSD type xs:anyType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "urn:oasis:names:tc:SAML:1.0:assertion":ConfirmationMethod of XSD type xs:anyURI. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "urn:oasis:names:tc:SAML:1.0:assertion":AuthenticationStatement of XSD type "urn:oasis:names:tc:SAML:1.0:assertion":AuthenticationStatementType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "urn:oasis:names:tc:SAML:1.0:assertion":SubjectLocality of XSD type "urn:oasis:names:tc:SAML:1.0:assertion":SubjectLocalityType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "urn:oasis:names:tc:SAML:1.0:assertion":AuthorityBinding of XSD type "urn:oasis:names:tc:SAML:1.0:assertion":AuthorityBindingType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "urn:oasis:names:tc:SAML:1.0:assertion":AuthorizationDecisionStatement of XSD type "urn:oasis:names:tc:SAML:1.0:assertion":AuthorizationDecisionStatementType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "urn:oasis:names:tc:SAML:1.0:assertion":Action of XSD type "urn:oasis:names:tc:SAML:1.0:assertion":ActionType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "urn:oasis:names:tc:SAML:1.0:assertion":Evidence of XSD type "urn:oasis:names:tc:SAML:1.0:assertion":EvidenceType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "urn:oasis:names:tc:SAML:1.0:assertion":AttributeStatement of XSD type "urn:oasis:names:tc:SAML:1.0:assertion":AttributeStatementType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "urn:oasis:names:tc:SAML:1.0:assertion":AttributeDesignator of XSD type "urn:oasis:names:tc:SAML:1.0:assertion":AttributeDesignatorType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "urn:oasis:names:tc:SAML:1.0:assertion":Attribute of XSD type "urn:oasis:names:tc:SAML:1.0:assertion":AttributeType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "urn:oasis:names:tc:SAML:1.0:assertion":AttributeValue of XSD type xs:anyType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /******************************************************************************\ * * * Additional Top-Level Attributes * * urn:oasis:names:tc:SAML:1.0:assertion * * * \******************************************************************************/ /******************************************************************************\ * * * XML Data Binding * * * \******************************************************************************/ /** @page page_XMLDataBinding XML Data Binding SOAP/XML services use data bindings contractually bound by WSDL and auto- generated by wsdl2h and soapcpp2 (see Service Bindings). Plain data bindings are adopted from XML schemas as part of the WSDL types section or when running wsdl2h on a set of schemas to produce non-SOAP-based XML data bindings. The following readers and writers are C/C++ data type (de)serializers auto- generated by wsdl2h and soapcpp2. Run soapcpp2 on this file to generate the (de)serialization code, which is stored in soapC.c[pp]. Include "soapH.h" in your code to import these data type and function declarations. Only use the soapcpp2-generated files in your project build. Do not include the wsdl2h- generated .h file in your code. Data can be read in XML and deserialized from: - a file descriptor, using soap->recvfd = fd - a socket, using soap->socket = ... - a C++ stream, using soap->is = ... - a buffer, using the soap->frecv() callback Data can be serialized in XML and written to: - a file descriptor, using soap->sendfd = fd - a socket, using soap->socket = ... - a C++ stream, using soap->os = ... - a buffer, using the soap->fsend() callback The following options are available for (de)serialization control: - soap->encodingStyle = NULL; to remove SOAP 1.1/1.2 encodingStyle - soap_mode(soap, SOAP_XML_TREE); XML without id-ref (no cycles!) - soap_mode(soap, SOAP_XML_GRAPH); XML with id-ref (including cycles) - soap_set_namespaces(soap, struct Namespace *nsmap); to set xmlns bindings @section saml1 Top-level root elements of schema "urn:oasis:names:tc:SAML:1.0:assertion" - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) */ /* End of saml1.h */ gsoap-2.8.28/gsoap/import/wsc.h0000644000175000017500000003667412653650146015704 0ustar ellertellert/* wsc.h WS-SecureConversation 2005/12 Generated with: wsdl2h -cex -o wsc.h -t WS/WS-typemap.dat WS/WS-SecureConversation.xsd - Removed //gsoapopt - Changed //gsoap wsc schema namespace directive to import directive */ /******************************************************************************\ * * * Definitions * * http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512 * * * \******************************************************************************/ /******************************************************************************\ * * * Import * * * \******************************************************************************/ #import "wsse.h" // wsse = #import "wsu.h" // wsu = /******************************************************************************\ * * * Schema Namespaces * * * \******************************************************************************/ #define SOAP_NAMESPACE_OF_wsc "http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512" //gsoap wsc schema import: http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512 //gsoap wsc schema elementForm: qualified //gsoap wsc schema attributeForm: unqualified /******************************************************************************\ * * * Built-in Schema Types and Top-Level Elements and Attributes * * * \******************************************************************************/ /// Imported element ""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":SecurityTokenReference" from typemap "/Users/engelen/Projects/gsoap/WS/WS-typemap.dat". /******************************************************************************\ * * * Schema Types and Top-Level Elements and Attributes * * http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512 * * * \******************************************************************************/ /// @brief Union of values from member types "wsc:FaultCodeType xs:QName". typedef char* wsc__FaultCodeOpenEnumType; /// @brief "http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512":FaultCodeType is a simpleType restriction of XSD type xs:QName. /// enum wsc__FaultCodeType { wsc__BadContextToken, ///< xs:QName value=""http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512":BadContextToken" wsc__UnsupportedContextToken, ///< xs:QName value=""http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512":UnsupportedContextToken" wsc__UnknownDerivationSource, ///< xs:QName value=""http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512":UnknownDerivationSource" wsc__RenewNeeded, ///< xs:QName value=""http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512":RenewNeeded" wsc__UnableToRenew, ///< xs:QName value=""http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512":UnableToRenew" }; /******************************************************************************\ * * * Schema Complex Types and Top-Level Elements * * http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512 * * * \******************************************************************************/ /// @brief "http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512":SecurityContextTokenType is a complexType. /// ///
/// Actual content model is non-deterministic, hence wildcard. The following shows intended content model: /// /// /// ///
struct wsc__SecurityContextTokenType { /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). /// Imported attribute reference "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd":Id. @char* wsu__Id 0; ///< Optional attribute. /// @todo . /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). /// Member declared in /Users/engelen/Projects/gsoap/WS/WS-typemap.dat char* Identifier; /// Member declared in /Users/engelen/Projects/gsoap/WS/WS-typemap.dat char* Instance; }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512":DerivedKeyTokenType is a complexType. /// struct wsc__DerivedKeyTokenType { /// Imported element reference "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":SecurityTokenReference. _wsse__SecurityTokenReference* wsse__SecurityTokenReference 0; ///< Optional element. /// Element "Properties" of XSD type "http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512":PropertiesType. struct wsc__PropertiesType* Properties 0; ///< Optional element. // BEGIN SEQUENCE struct __wsc__DerivedKeyTokenType_sequence { // BEGIN CHOICE $int __union_DerivedKeyTokenType ; ///< Union _wsc__union_DerivedKeyTokenType selector: set to SOAP_UNION__wsc__union_DerivedKeyTokenType_ union _wsc__union_DerivedKeyTokenType { /// Element "Generation" of XSD type xs:unsignedLong. ULONG64 Generation 1; ///< Required element. /// Element "Offset" of XSD type xs:unsignedLong. ULONG64 Offset 1; ///< Required element. } union_DerivedKeyTokenType ; // END OF CHOICE /// Element "Length" of XSD type xs:unsignedLong. ULONG64* Length 0; ///< Optional element. } *__DerivedKeyTokenType_sequence 0; // END OF SEQUENCE /// Element reference "http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512:""http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512":Label. char* Label 0; ///< Optional element. /// Element reference "http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512:""http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512":Nonce. char* Nonce 0; ///< Optional element. /// Imported attribute reference "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd":Id. @char* wsu__Id 0; ///< Optional attribute. /// Attribute "Algorithm" of XSD type xs:anyURI. @char* Algorithm 0; ///< Optional attribute. }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512":PropertiesType is a complexType. /// struct wsc__PropertiesType { /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). }; /******************************************************************************\ * * * Additional Top-Level Elements * * http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512 * * * \******************************************************************************/ /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512":SecurityContextToken of XSD type "http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512":SecurityContextTokenType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512":Identifier of XSD type xs:anyURI. // "_wsc__Identifier" element definition intentionally left blank. /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512":Instance of XSD type xs:string. // "_wsc__Instance" element definition intentionally left blank. /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512":DerivedKeyToken of XSD type "http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512":DerivedKeyTokenType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512":Name of XSD type xs:anyURI. // "_wsc__Name" element definition intentionally left blank. /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512":Label of XSD type xs:string. // "_wsc__Label" element definition intentionally left blank. /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512":Nonce of XSD type xs:base64Binary. // "_wsc__Nonce" element definition intentionally left blank. /******************************************************************************\ * * * Additional Top-Level Attributes * * http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512 * * * \******************************************************************************/ /// @brief Top-level attribute "http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512":Instance of simpleType xs:string. // "_wsc__Instance" attribute definition intentionally left blank. /// @brief Top-level attribute "http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512":Nonce of simpleType xs:base64Binary. // "_wsc__Nonce" attribute definition intentionally left blank. /// @brief Top-level attribute "http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512":Length of simpleType xs:unsignedLong. /// @note Use wsdl2h option -g to auto-generate a top-level attribute declaration and processing code. /******************************************************************************\ * * * XML Data Binding * * * \******************************************************************************/ /** @page page_XMLDataBinding XML Data Binding SOAP/XML services use data bindings contractually bound by WSDL and auto- generated by wsdl2h and soapcpp2 (see Service Bindings). Plain data bindings are adopted from XML schemas as part of the WSDL types section or when running wsdl2h on a set of schemas to produce non-SOAP-based XML data bindings. The following readers and writers are C/C++ data type (de)serializers auto- generated by wsdl2h and soapcpp2. Run soapcpp2 on this file to generate the (de)serialization code, which is stored in soapC.c[pp]. Include "soapH.h" in your code to import these data type and function declarations. Only use the soapcpp2-generated files in your project build. Do not include the wsdl2h- generated .h file in your code. Data can be read in XML and deserialized from: - a file descriptor, using soap->recvfd = fd - a socket, using soap->socket = ... - a C++ stream, using soap->is = ... - a buffer, using the soap->frecv() callback Data can be serialized in XML and written to: - a file descriptor, using soap->sendfd = fd - a socket, using soap->socket = ... - a C++ stream, using soap->os = ... - a buffer, using the soap->fsend() callback The following options are available for (de)serialization control: - soap->encodingStyle = NULL; to remove SOAP 1.1/1.2 encodingStyle - soap_mode(soap, SOAP_XML_TREE); XML without id-ref (no cycles!) - soap_mode(soap, SOAP_XML_GRAPH); XML with id-ref (including cycles) - soap_set_namespaces(soap, struct Namespace *nsmap); to set xmlns bindings @section wsc Top-level root elements of schema "http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512" - (use wsdl2h option -g to auto-generate) - @ref _wsc__Identifier @code // Reader (returns SOAP_OK on success): soap_read__wsc__Identifier(struct soap*, char*); // Writer (returns SOAP_OK on success): soap_write__wsc__Identifier(struct soap*, char*); @endcode - @ref _wsc__Instance @code // Reader (returns SOAP_OK on success): soap_read__wsc__Instance(struct soap*, char*); // Writer (returns SOAP_OK on success): soap_write__wsc__Instance(struct soap*, char*); @endcode - (use wsdl2h option -g to auto-generate) - @ref _wsc__Name @code // Reader (returns SOAP_OK on success): soap_read__wsc__Name(struct soap*, char*); // Writer (returns SOAP_OK on success): soap_write__wsc__Name(struct soap*, char*); @endcode -

http://gnuwin32.sourceforge.net/packages/bison.htm http://gnuwin32.sourceforge.net/packages/flex.htm